Your IP : 216.73.216.61


Current Path : /home/wuectly/www/03cbe/
Upload File :
Current File : /home/wuectly/www/03cbe/administrator.tar

includes/helper.php000060400000001737152453623430010355 0ustar00<?php
/**
 * @package    Joomla.Administrator
 *
 * @copyright  (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license    GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Joomla! Administrator Application helper class.
 * Provide many supporting API functions.
 *
 * @since       1.5
 *
 * @deprecated  4.0 Deprecated without replacement
 */
class JAdministratorHelper
{
	/**
	 * Return the application option string [main component].
	 *
	 * @return  string  The component to access.
	 *
	 * @since   1.5
	 */
	public static function findOption()
	{
		$app = JFactory::getApplication();
		$option = strtolower($app->input->get('option'));

		$app->loadIdentity();
		$user = $app->getIdentity();

		if ($user->get('guest') || !$user->authorise('core.login.admin'))
		{
			$option = 'com_login';
		}

		if (empty($option))
		{
			$option = 'com_cpanel';
		}

		$app->input->set('option', $option);

		return $option;
	}
}
includes/defines.php000060400000002040152453623430010477 0ustar00<?php
/**
 * @package    Joomla.Administrator
 *
 * @copyright  (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license    GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Global definitions
$parts = explode(DIRECTORY_SEPARATOR, JPATH_BASE);
array_pop($parts);

// Defines
define('JPATH_ROOT',          implode(DIRECTORY_SEPARATOR, $parts));
define('JPATH_SITE',          JPATH_ROOT);
define('JPATH_CONFIGURATION', JPATH_ROOT);
define('JPATH_ADMINISTRATOR', JPATH_ROOT . DIRECTORY_SEPARATOR . 'administrator');
define('JPATH_LIBRARIES',     JPATH_ROOT . DIRECTORY_SEPARATOR . 'libraries');
define('JPATH_PLUGINS',       JPATH_ROOT . DIRECTORY_SEPARATOR . 'plugins');
define('JPATH_INSTALLATION',  JPATH_ROOT . DIRECTORY_SEPARATOR . 'installation');
define('JPATH_THEMES',        JPATH_BASE . DIRECTORY_SEPARATOR . 'templates');
define('JPATH_CACHE',         JPATH_BASE . DIRECTORY_SEPARATOR . 'cache');
define('JPATH_MANIFESTS',     JPATH_ADMINISTRATOR . DIRECTORY_SEPARATOR . 'manifests');
includes/framework.php000060400000005524152453623430011071 0ustar00<?php
/**
 * @package    Joomla.Administrator
 *
 * @copyright  (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license    GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\IpHelper;

// Joomla system checks.
@ini_set('magic_quotes_runtime', 0);

// System includes
require_once JPATH_LIBRARIES . '/import.legacy.php';

// Bootstrap the CMS libraries.
require_once JPATH_LIBRARIES . '/cms.php';

// Set system error handling
JError::setErrorHandling(E_NOTICE, 'message');
JError::setErrorHandling(E_WARNING, 'message');
JError::setErrorHandling(E_ERROR, 'message', array('JError', 'customErrorPage'));

$version = new JVersion;

// Installation check, and check on removal of the install directory.
if (!file_exists(JPATH_CONFIGURATION . '/configuration.php')
	|| (filesize(JPATH_CONFIGURATION . '/configuration.php') < 10)
	|| (file_exists(JPATH_INSTALLATION . '/index.php') && (false === $version->isInDevelopmentState())))
{
	if (file_exists(JPATH_INSTALLATION . '/index.php'))
	{
		header('Location: ../installation/index.php');

		exit();
	}
	else
	{
		echo 'No configuration file found and no installation code available. Exiting...';

		exit;
	}
}

// Pre-Load configuration. Don't remove the Output Buffering due to BOM issues, see JCode 26026
ob_start();
require_once JPATH_CONFIGURATION . '/configuration.php';
ob_end_clean();

// System configuration.
$config = new JConfig;

// Set the error_reporting
switch ($config->error_reporting)
{
	case 'default':
	case '-1':
		break;

	case 'none':
	case '0':
		error_reporting(0);

		break;

	case 'simple':
		error_reporting(E_ERROR | E_WARNING | E_PARSE);
		ini_set('display_errors', 1);

		break;

	case 'maximum':
		error_reporting(E_ALL);
		ini_set('display_errors', 1);

		break;

	case 'development':
		error_reporting(-1);
		ini_set('display_errors', 1);

		break;

	default:
		error_reporting($config->error_reporting);
		ini_set('display_errors', 1);

		break;
}

define('JDEBUG', $config->debug);

// System profiler
if (JDEBUG)
{
	// @deprecated 4.0 - The $_PROFILER global will be removed
	$_PROFILER = JProfiler::getInstance('Application');
}

/**
 * Correctly set the allowing of IP Overrides if behind a trusted proxy/load balancer.
 *
 * We need to do this as high up the stack as we can, as the default in \Joomla\Utilities\IpHelper is to
 * $allowIpOverride = true which is the wrong default for a generic site NOT behind a trusted proxy/load balancer.
 */
if (property_exists($config, 'behind_loadbalancer') && $config->behind_loadbalancer == 1)
{
	// If Joomla is configured to be behind a trusted proxy/load balancer, allow HTTP Headers to override the REMOTE_ADDR
	IpHelper::setAllowIpOverrides(true);
}
else
{
	// We disable the allowing of IP overriding using headers by default.
	IpHelper::setAllowIpOverrides(false);
}

unset($config);
includes/subtoolbar.php000060400000010423152453623430011242 0ustar00<?php
/**
 * @package    Joomla.Administrator
 *
 * @copyright  (C) 2014 Open Source Matters, Inc. <https://www.joomla.org>
 * @license    GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Utility class for the submenu.
 *
 * @package     Joomla.Administrator
 * @since       1.5
 * @deprecated  4.0  Use JHtmlSidebar instead.
 */
abstract class JSubMenuHelper
{
	/**
	 * Menu entries
	 *
	 * @var    array
	 * @since  3.0
	 * @deprecated  4.0
	 */
	protected static $entries = array();

	/**
	 * Filters
	 *
	 * @var    array
	 * @since  3.0
	 * @deprecated  4.0
	 */
	protected static $filters = array();

	/**
	 * Value for the action attribute of the form.
	 *
	 * @var    string
	 * @since  3.0
	 * @deprecated  4.0
	 */
	protected static $action = '';

	/**
	 * Method to add a menu item to submenu.
	 *
	 * @param   string   $name    Name of the menu item.
	 * @param   string   $link    URL of the menu item.
	 * @param   boolean  $active  True if the item is active, false otherwise.
	 *
	 * @return  void
	 *
	 * @since   1.5
	 * @deprecated  4.0  Use JHtmlSidebar::addEntry() instead.
	 */
	public static function addEntry($name, $link = '', $active = false)
	{
		try
		{
			JLog::add(
				sprintf('%s() is deprecated. Use JHtmlSidebar::addEntry() instead.', __METHOD__),
				JLog::WARNING,
				'deprecated'
			);
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		self::$entries[] = array($name, $link, $active);
	}

	/**
	 * Returns an array of all submenu entries
	 *
	 * @return  array
	 *
	 * @since   3.0
	 * @deprecated  4.0  Use JHtmlSidebar::getEntries() instead.
	 */
	public static function getEntries()
	{
		try
		{
			JLog::add(
				sprintf('%s() is deprecated. Use JHtmlSidebar::getEntries() instead.', __METHOD__),
				JLog::WARNING,
				'deprecated'
			);
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		return self::$entries;
	}

	/**
	 * Method to add a filter to the submenu
	 *
	 * @param   string   $label      Label for the menu item.
	 * @param   string   $name       name for the filter. Also used as id.
	 * @param   string   $options    options for the select field.
	 * @param   boolean  $noDefault  Don't show the label as the empty option
	 *
	 * @return  void
	 *
	 * @since   3.0
	 * @deprecated  4.0  Use JHtmlSidebar::addFilter() instead.
	 */
	public static function addFilter($label, $name, $options, $noDefault = false)
	{
		try
		{
			JLog::add(
				sprintf('%s() is deprecated. Use JHtmlSidebar::addFilter() instead.', __METHOD__),
				JLog::WARNING,
				'deprecated'
			);
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		self::$filters[] = array('label' => $label, 'name' => $name, 'options' => $options, 'noDefault' => $noDefault);
	}

	/**
	 * Returns an array of all filters
	 *
	 * @return  array
	 *
	 * @since   3.0
	 * @deprecated  4.0  Use JHtmlSidebar::getFilters() instead.
	 */
	public static function getFilters()
	{
		try
		{
			JLog::add(
				sprintf('%s() is deprecated. Use JHtmlSidebar::getFilters() instead.', __METHOD__),
				JLog::WARNING,
				'deprecated'
			);
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		return self::$filters;
	}

	/**
	 * Set value for the action attribute of the filter form
	 *
	 * @param   string  $action  Value for the action attribute of the form
	 *
	 * @return  void
	 *
	 * @since   3.0
	 * @deprecated  4.0  Use JHtmlSidebar::setAction() instead.
	 */
	public static function setAction($action)
	{
		try
		{
			JLog::add(
				sprintf('%s() is deprecated. Use JHtmlSidebar::setAction() instead.', __METHOD__),
				JLog::WARNING,
				'deprecated'
			);
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		self::$action = $action;
	}

	/**
	 * Get value for the action attribute of the filter form
	 *
	 * @return  string  Value for the action attribute of the form
	 *
	 * @since   3.0
	 * @deprecated  4.0  Use JHtmlSidebar::getAction() instead.
	 */
	public static function getAction()
	{
		try
		{
			JLog::add(
				sprintf('%s() is deprecated. Use JHtmlSidebar::getAction() instead.', __METHOD__),
				JLog::WARNING,
				'deprecated'
			);
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		return self::$action;
	}
}
manifests/libraries/regularlabs.xml000060400000002047152453623430013544 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension version="3.9" type="library" method="upgrade">
	<name>Regular Labs Library</name>
	<libraryname>regularlabs</libraryname>
	<description></description>
	<version>21.4.10972</version>
	<creationDate>April 2021</creationDate>
	<author>Regular Labs (Peter van Westen)</author>
	<authorEmail>info@regularlabs.com</authorEmail>
	<authorUrl>https://regularlabs.com</authorUrl>
	<copyright>Copyright © 2018 Regular Labs - All Rights Reserved</copyright>
	<license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>

	<scriptfile>script.install.php</scriptfile>

	<files>
		<folder>vendor</folder>
		<folder>src</folder>
		<file>autoload.php</file>
		<file>regularlabs.xml</file>
		<folder>fields</folder>
		<folder>helpers</folder>
		<folder>layouts</folder>
		<filename>script.install.helper.php</filename>
	</files>

	<media folder="media" destination="regularlabs">
		<folder>css</folder>
		<folder>fonts</folder>
		<folder>images</folder>
		<folder>js</folder>
		<folder>less</folder>
	</media>
</extension>
manifests/libraries/idna_convert.xml000060400000001254152453623430013713 0ustar00<?xml version="1.0" encoding="UTF-8" ?>
<extension type="library" version="3.1">
	<name>LIB_IDNA</name>
	<libraryname>idna_convert</libraryname>
	<version>0.8.0</version>
	<description>LIB_IDNA_XML_DESCRIPTION</description>
	<creationDate>2004</creationDate>
	<copyright>2004-2011 phlyLabs Berlin, http://phlylabs.de</copyright>
	<license>https://www.gnu.org/licenses/lgpl-2.1.html GNU/LGPL</license>
	<author>phlyLabs</author>
	<authorEmail>phlymail@phlylabs.de</authorEmail>
	<authorUrl>http://phlylabs.de</authorUrl>
	<packager>Joomla!</packager>
	<packagerurl>https://www.joomla.org</packagerurl>
	<files folder="libraries">
		<folder>idna_convert</folder>
	</files>
</extension>
manifests/libraries/lib_f0f.xml000060400000003631152453623430012542 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<extension type="library" version="2.5" method="upgrade">
    <name>F0F (NEW) DO NOT REMOVE</name>
	<libraryname>f0f</libraryname>
	<description>Framework-on-Framework (FOF) newer version - DO NOT REMOVE - The rapid component development framework for Joomla!. This package is the newer version of FOF, not the one shipped with Joomla! as the official Joomla! RAD Layer. The Joomla! RAD Layer has ceased development in March 2014. DO NOT UNINSTALL THIS PACKAGE, IT IS *** N O T *** A DUPLICATE OF THE 'FOF' PACKAGE. REMOVING EITHER FOF PACKAGE WILL BREAK YOUR SITE.</description>
	<creationDate>2016-05-12</creationDate>
	<author>Nicholas K. Dionysopoulos / Akeeba Ltd</author>
	<authorEmail>nicholas@akeebabackup.com</authorEmail>
	<authorUrl>https://www.akeebabackup.com</authorUrl>
	<copyright>(C)2011-2014 Nicholas K. Dionysopoulos</copyright>
	<license>GNU GPLv2 or later</license>
	<version>revAA17947</version>
	<packager>Akeeba Ltd</packager>
	<packagerurl>https://www.AkeebaBackup.com/download.html</packagerurl>

    <languages folder="_lang">
        <language tag="en-GB">en-GB/en-GB.lib_f0f.ini</language>
    </languages>

    <files folder="fof">
		<folder>autoloader</folder>
		<folder>config</folder>
		<folder>controller</folder>
		<folder>database</folder>
		<folder>dispatcher</folder>
		<folder>download</folder>
		<folder>encrypt</folder>
		<folder>form</folder>
		<folder>hal</folder>
		<folder>inflector</folder>
		<folder>integration</folder>
		<folder>input</folder>
		<folder>layout</folder>
		<folder>less</folder>
		<folder>model</folder>
		<folder>platform</folder>
		<folder>query</folder>
		<folder>render</folder>
		<folder>string</folder>
		<folder>table</folder>
		<folder>template</folder>
		<folder>toolbar</folder>
		<folder>utils</folder>
		<folder>view</folder>

		<file>LICENSE.txt</file>
		<file>include.php</file>
		<file>version.txt</file>
	</files>
</extension>manifests/libraries/phputf8.xml000060400000001246152453623430012637 0ustar00<?xml version="1.0" encoding="UTF-8" ?>
<extension type="library" version="3.1">
	<name>LIB_PHPUTF8</name>
	<libraryname>phputf8</libraryname>
	<version>0.5</version>
	<description>LIB_PHPUTF8_XML_DESCRIPTION</description>
	<creationDate>2006</creationDate>
	<copyright>Copyright various authors</copyright>
	<license>https://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>
	<author>Harry Fuecks</author>
	<authorEmail>hfuecks@gmail.com</authorEmail>
	<authorUrl>http://sourceforge.net/projects/phputf8</authorUrl>
	<packager>Joomla!</packager>
	<packagerurl>https://www.joomla.org</packagerurl>
	<files folder="libraries">
		<folder>phputf8</folder>
	</files>
</extension>
manifests/libraries/fof.xml000060400000002752152453623430012016 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<extension type="library" version="2.5" method="upgrade">
	<name>FOF</name>
	<libraryname>fof</libraryname>
	<description>LIB_FOF_XML_DESCRIPTION</description>
	<creationDate>2015-04-22 13:15:32</creationDate>
	<author>Nicholas K. Dionysopoulos / Akeeba Ltd</author>
	<authorEmail>nicholas@akeebabackup.com</authorEmail>
	<authorUrl>https://www.akeebabackup.com</authorUrl>
	<copyright>(C)2011-2015 Nicholas K. Dionysopoulos</copyright>
	<license>GNU GPLv2 or later</license>
	<version>2.4.3</version>
	<packager>Akeeba Ltd</packager>
	<packagerurl>https://www.AkeebaBackup.com/download.html</packagerurl>

	<languages folder="_lang">
		<language tag="en-GB">en-GB/en-GB.lib_fof.ini</language>
	</languages>

	<files folder="fof">
		<folder>autoloader</folder>
		<folder>config</folder>
		<folder>controller</folder>
		<folder>database</folder>
		<folder>dispatcher</folder>
		<folder>download</folder>
		<folder>encrypt</folder>
		<folder>form</folder>
		<folder>hal</folder>
		<folder>inflector</folder>
		<folder>integration</folder>
		<folder>input</folder>
		<folder>layout</folder>
		<folder>less</folder>
		<folder>model</folder>
		<folder>platform</folder>
		<folder>query</folder>
		<folder>render</folder>
		<folder>string</folder>
		<folder>table</folder>
		<folder>template</folder>
		<folder>toolbar</folder>
		<folder>utils</folder>
		<folder>view</folder>
		<file>LICENSE.txt</file>
		<file>include.php</file>
		<file>version.txt</file>
	</files>
</extension>
manifests/libraries/lib_ic_library.xml000060400000002676152453623430014216 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<extension type="library" version="2.5" method="upgrade">
	<name>iC Library</name>
	<libraryname>ic_library</libraryname>
	<description>ICLIB_XML_DESCRIPTION</description>
	<creationDate>2015-09-05</creationDate>
	<author>Cyril Rezé / Jooml!C</author>
	<authorEmail>info@joomlic.com</authorEmail>
	<authorUrl>http://www.joomlic.com</authorUrl>
	<copyright>Copyright (c)2014-2015 Cyril Rezé, Jooml!C - All rights reserved</copyright>
	<license>GNU General Public License version 3 or later; see LICENSE.txt</license>
	<version>1.3.3</version>
	<packager>Jooml!C</packager>
	<packagerurl>http://www.joomlic.com</packagerurl>

	<files>
		<folder>color</folder>
		<folder>date</folder>
		<folder>file</folder>
		<folder>filter</folder>
		<folder>globalize</folder>
		<folder>library</folder>
		<folder>string</folder>
		<folder>thumb</folder>
		<folder>url</folder>
		<file>LICENSE.txt</file>
		<file>index.html</file>
	</files>

	<languages>
		<language tag="en-GB">language/en-GB/en-GB.lib_ic_library.ini</language>
		<language tag="en-GB">language/en-GB/en-GB.lib_ic_library.sys.ini</language>
		<language tag="fr-FR">language/fr-FR/fr-FR.lib_ic_library.ini</language>
		<language tag="fr-FR">language/fr-FR/fr-FR.lib_ic_library.sys.ini</language>
		<language tag="it-IT">language/it-IT/it-IT.lib_ic_library.ini</language>
		<language tag="it-IT">language/it-IT/it-IT.lib_ic_library.sys.ini</language>
	</languages>

</extension>
manifests/libraries/phpass.xml000060400000001106152453623430012532 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<extension type="library" version="3.2" method="upgrade">
	<name>LIB_PHPASS</name>
	<libraryname>phpass</libraryname>
	<description>LIB_PHPASS_XML_DESCRIPTION</description>
	<creationDate>2004-2006</creationDate>
	<author>Solar Designer</author>
	<authorEmail>solar@openwall.com</authorEmail>
	<authorUrl>http://www.openwall.com/phpass/</authorUrl>
	<license>PD / GWC</license>
	<version>0.3</version>
	<packagerurl>http://www.openwall.com/phpass/</packagerurl>

	<files folder="phpass">
		<file>PasswordHash.php</file>
	</files>
</extension>
manifests/libraries/joomla.xml000060400000001517152453623430012523 0ustar00<?xml version="1.0" encoding="UTF-8" ?>
<extension type="library" version="3.1">
	<name>LIB_JOOMLA</name>
	<libraryname>joomla</libraryname>
	<version>13.1</version>
	<description>LIB_JOOMLA_XML_DESCRIPTION</description>
	<creationDate>2008</creationDate>
	<copyright>(C) 2008 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<author>Joomla! Project</author>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>https://www.joomla.org</authorUrl>
	<packager>Joomla!</packager>
	<packagerurl>https://www.joomla.org</packagerurl>
	<files folder="libraries">
		<folder>compat</folder>
		<folder>joomla</folder>
		<folder>legacy</folder>
		<file>import.legacy.php</file>
		<file>import.php</file>
		<file>loader.php</file>
		<file>platform.php</file>
	</files>
</extension>
manifests/files/file_fof40.xml000060400000011432152453623430012302 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<!--~
  ~ @package   FOF
  ~ @copyright Copyright (c)2010-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->

<!--
A legitimate question among developers reading this file may be why we are using a "files" extension type instead of the
"library" type which, on the face of it, seems more appropriate.

We have not lost our mind. We are working around the adverse effects of the very different way Joomla treats "library"
packages than any other package type.

When applying an update to a library package Joomla! will uninstall it BEFORE it executes the installation script's
preflight event. This means that any checks made there to prevent the installation of the library in an incompatible
environment (e.g. wrong PHP or Joomla! version, or even preventing an accidental downgrade) results in the library files
being UNINSTALLED.

This is really bad for anyone who tries to install a library package on an unsupported environment. If the library
package runs no checks the installed library version causes the extensions that depend on it to crash, taking down the
site. If the library package runs checks in the earliest available point in time (preflight) you end up with the old
library files having been uninstalled which again causes the extensions that depend on it to crash, taking down the
site. No matter what you do, the very action of TRYING to install an unsupported library version KILLS THE SITE. This is
madness. Worse than that, this is a known issue in Joomla since ~2017 but nobody will fix it until a new major version.
Since this doesn't look likely in Joomla 4.0 we are talking about Joomla 5 which could be anywhere from two to ten years
into the future. Clearly this doesn't cut it for us: we don't want trying to install our software causing sites to stop
working!

The only thing we can do to prevent your sites from crashing to the ground if you try to install a version of our
software which does not support your PHP and/or Joomla! versions is to deliver our library as a *files* package. This
is nonsensical, it is 100% architecturally wrong BUT it is also the only way we can apply pre-installation checks which
fail gracefully instead of causing your site to crash and burn.
-->
<extension type="file" version="3.9" method="upgrade">
    <name>file_fof40</name>
	<description>
		<![CDATA[
		Framework-on-Framework (FOF) 4.x - The rapid application development framework for Joomla!.<br/>
		<b>WARNING</b>: This is NOT a duplicate of the FOF library already installed with Joomla! 3. It is a different version used by other extensions on your site. Do NOT uninstall either FOF package. If you do you will break your site.
		]]>
	</description>
	<creationDate>2022-10-24</creationDate>
	<author>Nicholas K. Dionysopoulos / Akeeba Ltd</author>
	<authorEmail>nicholas@akeeba.com</authorEmail>
	<authorUrl>https://www.akeeba.com</authorUrl>
	<copyright>Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd</copyright>
	<license>GNU GPL v3 or later</license>
	<version>4.1.4</version>
	<packager>Akeeba Ltd</packager>
	<packagerurl>https://www.akeeba.com/download.html</packagerurl>

	<fileset>
		<files folder="fof" target="libraries/fof40">
			<folder>Database</folder>
			<folder>Configuration</folder>
			<folder>Update</folder>
			<folder>InstallScript</folder>
			<folder>Input</folder>
			<folder>Layout</folder>
			<folder>Platform</folder>
			<folder>Date</folder>
			<folder>Timer</folder>
			<folder>Dispatcher</folder>
			<folder>ViewTemplates</folder>
			<folder>Toolbar</folder>
			<folder>Template</folder>
			<folder>Inflector</folder>
			<folder>Render</folder>
			<folder>Utils</folder>
			<folder>Html</folder>
			<folder>language</folder>
			<folder>Cli</folder>
			<folder>Controller</folder>
			<folder>Container</folder>
			<folder>Pimple</folder>
			<folder>Download</folder>
			<folder>Params</folder>
			<folder>Model</folder>
			<folder>View</folder>
			<folder>JoomlaAbstraction</folder>
			<folder>TransparentAuthentication</folder>
			<folder>IP</folder>
			<folder>Encrypt</folder>
			<folder>Event</folder>
			<folder>Factory</folder>
			<folder>Autoloader</folder>

			<file>LICENSE.txt</file>
			<file>include.php</file>
			<file>version.txt</file>
			<file>.htaccess</file>
			<file>web.config</file>
		</files>
		<files folder="fof/language/en-GB" target="language/en-GB">
			<file>en-GB.lib_fof40.ini</file>
		</files>
		<files folder="fof/language/en-GB" target="administrator/language/en-GB">
			<file>en-GB.lib_fof40.ini</file>
		</files>
	</fileset>

	<!-- Installation / uninstallation script file -->
	<scriptfile>script.fof.php</scriptfile>

    <updateservers>
        <server type="extension" priority="1" name="FOF 4.x">http://cdn.akeeba.com/updates/fof4_file.xml</server>
    </updateservers>
</extension>manifests/files/joomla.xml000060400000003354152453623430011652 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<extension version="3.6" type="file" method="upgrade">
	<name>files_joomla</name>
	<author>Joomla! Project</author>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<copyright>(C) 2019 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<version>3.10.12</version>
	<creationDate>July 2023</creationDate>
	<description>FILES_JOOMLA_XML_DESCRIPTION</description>

	<scriptfile>administrator/components/com_admin/script.php</scriptfile>

	<update>
		<schemas>
			<schemapath type="mysql">administrator/components/com_admin/sql/updates/mysql</schemapath>
			<schemapath type="sqlsrv">administrator/components/com_admin/sql/updates/sqlazure</schemapath>
			<schemapath type="sqlazure">administrator/components/com_admin/sql/updates/sqlazure</schemapath>
			<schemapath type="postgresql">administrator/components/com_admin/sql/updates/postgresql</schemapath>
		</schemas>
	</update>

	<fileset>
		<files>
			<folder>administrator</folder>
			<folder>bin</folder>
			<folder>cache</folder>
			<folder>cli</folder>
			<folder>components</folder>
			<folder>images</folder>
			<folder>includes</folder>
			<folder>language</folder>
			<folder>layouts</folder>
			<folder>libraries</folder>
			<folder>media</folder>
			<folder>modules</folder>
			<folder>plugins</folder>
			<folder>templates</folder>
			<folder>tmp</folder>
			<file>htaccess.txt</file>
			<file>web.config.txt</file>
			<file>LICENSE.txt</file>
			<file>README.txt</file>
			<file>index.php</file>
		</files>
	</fileset>

	<updateservers>
		<server name="Joomla! Core" type="collection">https://update.joomla.org/core/list.xml</server>
	</updateservers>
</extension>
manifests/files/files_strapper.xml000060400000002121152453623430013402 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<extension type="file" version="2.5" method="upgrade">
    <!-- Generic Metadata -->
    <name>AkeebaStrapper</name>
    <author>Nicholas K. Dionysopoulos</author>
    <authorEmail>nicholas@dionysopoulos.me</authorEmail>
    <authorUrl>https://www.akeebabackup.com</authorUrl>
    <copyright>(C) 2012-2013 Akeeba Ltd.</copyright>
    <license>GNU GPL v2 or later</license>
    <version>revAA17947</version>
    <creationDate>2016-05-12</creationDate>
    <description>Namespaced jQuery, jQuery UI and Bootstrap for Akeeba products.</description>

    <!-- Fileset definition -->
    <fileset>
        <files folder="akeeba_strapper" target="media/akeeba_strapper">
            <folder>css</folder>
            <folder>img</folder>
            <folder>js</folder>
            <folder>less</folder>
            <filename>strapper.ini</filename>
            <filename>strapper.php</filename>
            <filename>version.php</filename>
        </files>
		<files target="media/akeeba_strapper">
			<filename>version.txt</filename>
		</files>
    </fileset>
</extension>manifests/files/jce-fr-FR.xml000060400000013656152453623430012052 0ustar00<?xml version="1.0" encoding="UTF-8" ?>
<extension type="file" version="2.5" method="upgrade">
	<name>JCE Language fr-FR</name>
	<version>2.9.99.2.1</version>
	<creationDate>27-04-2026</creationDate>
	<author>Sarki</author>
	<authorEmail>info@sarki.ch</authorEmail>
	<authorUrl>https://www.sarki.ch</authorUrl>
	<copyright>© 2025 Sarki</copyright>
	<license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>
	<url>https://www.sarki.ch/jce</url>
	<description><![CDATA[
		<h3><img src="../media/mod_languages/images/fr.gif" style="padding: 0 5px 3px 0">Pack de fichiers langue FR pour JCE 2.9 et ses plugins complémentaires installé !</h3>
		<div style="font-weight:normal;"><p><strong>Note :</strong> ce pack de langue inclut le suivi de mise à jour en ligne.</p>
		<div>Traduction & réalisation par <a href="https://www.sarki.ch" target="_blank">Sarki</a>
		<br />Support francophone de JCE sur <a href="https://www.sarki.ch/jce" target="_blank">www.sarki.ch/jce</a></div></div>
		]]></description>
	<fileset>
		<files folder="administrator/language/fr-FR" target="administrator/language/fr-FR">
			<file>fr-FR.com_jce.ini</file>
			<file>fr-FR.com_jce.menu.ini</file>
			<file>fr-FR.com_jce.sys.ini</file>
			<file>fr-FR.com_jce_pro.sys.ini</file>
			<file>fr-FR.pkg_jce.sys.ini</file>
			<file>fr-FR.pkg_jce_pro.sys.ini</file>
			<file>fr-FR.plg_content_jce.ini</file>
			<file>fr-FR.plg_content_jce.sys.ini</file>
			<file>fr-FR.plg_editors_jce.ini</file>
			<file>fr-FR.plg_editors_jce.sys.ini</file>
			<file>fr-FR.plg_extension_jce.ini</file>
			<file>fr-FR.plg_extension_jce.sys.ini</file>
			<file>fr-FR.plg_fields_mediajce.ini</file>
			<file>fr-FR.plg_fields_mediajce.sys.ini</file>
			<file>fr-FR.plg_installer_jce.ini</file>
			<file>fr-FR.plg_installer_jce.sys.ini</file>
			<file>fr-FR.plg_jce_editor_aia.ini</file>
			<file>fr-FR.plg_jce_editor_aia.sys.ini</file>
			<file>fr-FR.plg_jce_editor_codesample.ini</file>
			<file>fr-FR.plg_jce_editor_codesample.sys.ini</file>
			<file>fr-FR.plg_jce_editor_fontawesome.ini</file>
			<file>fr-FR.plg_jce_editor_fontawesome.sys.ini</file>
			<file>fr-FR.plg_jce_editor_chatgpt.ini</file>
			<file>fr-FR.plg_jce_editor_chatgpt.sys.ini</file>
			<file>fr-FR.plg_jce_editor-ipa.ini</file>
			<file>fr-FR.plg_jce_editor-ipa.sys.ini</file>
			<file>fr-FR.plg_jce_editor-svg.ini</file>
			<file>fr-FR.plg_jce_editor-svg.sys.ini</file>
			<file>fr-FR.plg_jce_editor-toc.ini</file>
			<file>fr-FR.plg_jce_editor-toc.sys.ini</file>
			<file>fr-FR.plg_jce_filesystem-s3.ini</file>
			<file>fr-FR.plg_jce_filesystem-s3.sys.ini</file>
			<file>fr-FR.plg_jce_filesystem-server.ini</file>
			<file>fr-FR.plg_jce_filesystem-server.sys.ini</file>
			<file>fr-FR.plg_jce_popups-rokbox.ini</file>
			<file>fr-FR.plg_jce_popups-rokbox.sys.ini</file>
			<file>fr-FR.plg_jce_popups-widgetkit2.ini</file>
			<file>fr-FR.plg_jce_popups-widgetkit2.sys.ini</file>
			<file>fr-FR.plg_quickicon_jce.ini</file>
			<file>fr-FR.plg_quickicon_jce.sys.ini</file>
			<file>fr-FR.plg_system_jce.ini</file>
			<file>fr-FR.plg_system_jce.sys.ini</file>
			<file>plg_system_jcemediabox.ini</file>
			<file>plg_system_jcemediabox.sys.ini</file>
			<file>fr-FR.plg_system_wf_responsify.ini</file>
			<file>fr-FR.plg_system_wf_responsify.sys.ini</file>
			<file>plg_system_jcepro.ini</file>
		</files>
		<files folder="plugins" target="plugins/jce/editor_aia/language/fr-FR">
			<file>plg_jce_editor_aia.ini</file>
			<file>plg_jce_editor_aia.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/jce/editor_chatgpt/language/fr-FR">
			<file>plg_jce_editor_chatgpt.ini</file>
			<file>plg_jce_editor_chatgpt.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/jce/editor_codesample/language/fr-FR">
			<file>plg_jce_editor_codesample.ini</file>
			<file>plg_jce_editor_codesample.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/jce/editor_fontawesome/language/fr-FR">
			<file>plg_jce_editor_fontawesome.ini</file>
			<file>plg_jce_editor_fontawesome.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/jce/editor-ipa/language/fr-FR">
			<file>plg_jce_editor-ipa.ini</file>
			<file>plg_jce_editor-ipa.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/jce/editor-svg/language/fr-FR">
			<file>plg_jce_editor-svg.ini</file>
			<file>plg_jce_editor-svg.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/jce/editor-toc/language/fr-FR">
			<file>plg_jce_editor-toc.ini</file>
			<file>plg_jce_editor-toc.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/jce/filesystem-s3/language/fr-FR">
			<file>plg_jce_filesystem-s3.ini</file>
			<file>plg_jce_filesystem-s3.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/jce/filesystem-server/language/fr-FR">
			<file>plg_jce_filesystem-server.ini</file>
			<file>plg_jce_filesystem-server.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/jce/popups-widgetkit2/language/fr-FR">
			<file>plg_jce_popups-widgetkit2.ini</file>
			<file>plg_jce_popups-widgetkit2.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/system/jcemediabox/language/fr-FR">
			<file>plg_system_jcemediabox.ini</file>
			<file>plg_system_jcemediabox.sys.ini</file>
		</files>
		<files folder="plugins" target="plugins/system/wf_responsify/language/fr-FR">
			<file>plg_system_wf_responsify.ini</file>
			<file>plg_system_wf_responsify.sys.ini</file>
		</files>
		<tinymce folder="components/com_jce/editor/tiny_mce">
			<file>themes/advanced/langs/fr.js</file>
		</tinymce>
		<files folder="language/fr-FR" target="language/fr-FR">
			<file>fr-FR.com_jce.ini</file>
			<file>fr-FR.com_jce_pro.ini</file>
		</files>
  	</fileset>

    <compatibility>
        <version>3</version>
        <version>4</version>
        <version>5</version>
    </compatibility>	
	
    <updateservers>
       <server type="extension" priority="1" name="JCE Language fr-FR">https://www.sarki.ch/jce/update/jce_language_fr.xml</server>
    </updateservers>
</extension>manifests/files/akeebabackup-fr-FR.xml000060400000002445152453623430013701 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="file" version="1.6" method="upgrade" client="site">
    <name><![CDATA[akeebabackup - fr-FR]]></name>
    <author><![CDATA[AkeebaBackup.com]]></author>
    <authorurl>http://www.akeebabackup.com</authorurl>
	<copyright>Copyright (C)2016 AkeebaBackup.com. All rights reserved.</copyright>
	<license>http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL</license>
    <version>/Users/nikosdion/Projects/akeeba/backup/build/..</version>
    <creationDate>23 May 2016</creationDate>
    <description><![CDATA[French (France) translation file for Akeeba Backup]]></description>
	<fileset>
		<files folder="backend" target="administrator/language/fr-FR">
			<filename>fr-FR.com_akeeba.ini</filename>
			<filename>fr-FR.com_akeeba.sys.ini</filename>
			<filename>fr-FR.plg_quickicon_akeebabackup.ini</filename>
			<filename>fr-FR.plg_quickicon_akeebabackup.sys.ini</filename>
			<filename>fr-FR.plg_system_akeebaupdatecheck.ini</filename>
			<filename>fr-FR.plg_system_akeebaupdatecheck.sys.ini</filename>
			<filename>fr-FR.plg_system_backuponupdate.ini</filename>
			<filename>fr-FR.plg_system_backuponupdate.sys.ini</filename>
		</files>
		<files folder="frontend" target="language/fr-FR">
			<filename>fr-FR.com_akeeba.ini</filename>
		</files>
	</fileset>
</extension>manifests/files/file_fef.xml000060400000002705152453623430012127 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<!--~
  ~ Akeeba Frontend Framework (FEF)
  ~
  ~ @package   fef
  ~ @copyright (c) 2017-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->

<extension type="file" version="3.3" method="upgrade">
    <!-- Generic Metadata -->
    <name>file_fef</name>
    <author>Nicholas K. Dionysopoulos</author>
    <authorEmail>nicholas@dionysopoulos.me</authorEmail>
    <authorUrl>https://www.akeeba.com</authorUrl>
    <copyright>(C) 2017-2021 Akeeba Ltd.</copyright>
    <license>GNU GPL v3 or later</license>
    <version>2.1.1</version>
    <creationDate>2022-10-24</creationDate>
    <description>Akeeba Frontend Framework - The CSS framework for Akeeba Ltd extensions.</description>

    <!-- Fileset definition -->
    <fileset>
        <files target="media/fef">
            <folder>css</folder>
            <folder>fonts</folder>
            <folder>images</folder>
            <folder>js</folder>
            <folder>php</folder>
            <filename>fef.php</filename>
            <filename>version.php</filename>
			<filename>version.txt</filename>
        </files>
    </fileset>

    <!-- Installation / uninstallation script file -->
    <scriptfile>script.fef.php</scriptfile>

    <!-- Update server -->
    <updateservers>
        <server type="extension" priority="1" name="Akeeba FEF">http://cdn.akeeba.com/updates/fef.xml</server>
    </updateservers>
</extension>
manifests/files/file_fof40/script.fof.php000060400000036466152453623430014364 0ustar00<?php
/**
 * @package   FOF
 * @copyright Copyright (c)2010-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') || die;

use Joomla\CMS\Date\Date as JoomlaDate;
use Joomla\CMS\Factory as JoomlaFactory;
use Joomla\CMS\Filesystem\File;
use Joomla\CMS\Filesystem\Folder;
use Joomla\CMS\Installer\Installer as JoomlaInstaller;
use Joomla\CMS\Installer\InstallerAdapter;
use Joomla\CMS\Log\Log;

if (class_exists('file_fof40InstallerScript', false))
{
	return;
}

/**
 * Class file_fof40InstallerScript
 *
 * @noinspection PhpIllegalPsrClassPathInspection
 */
class file_fof40InstallerScript
{
	public $removeFiles;
	/**
	 * The minimum PHP version required to install this extension
	 *
	 * @var   string
	 */
	protected $minimumPHPVersion = '7.2.0';

	/**
	 * The minimum Joomla! version required to install this extension
	 *
	 * @var   string
	 */
	protected $minimumJoomlaVersion = '3.9.0';

	/**
	 * The maximum Joomla! version this extension can be installed on
	 *
	 * @var   string
	 */
	protected $maximumJoomlaVersion = '4.999.999';

	/**
	 * The name of the subdirectory under JPATH_LIBRARIES where this version of FOF is installed.
	 *
	 * @var   string
	 */
	protected $libraryFolder = 'fof40';

	/**
	 * Obsolete files and folders to remove.
	 *
	 * This is used when we refactor code. Some files inevitably become obsolete and need to be removed.
	 *
	 * All files and folders are relative to the library's root (JPATH_LIBRARIES . '/' . $this->libraryFolder).
	 *
	 * @var   array
	 */
	protected $removeFilesAllVersions = [
		'files'   => [
		],
		'folders' => [
		],
	];

	/**
	 * Joomla! pre-flight event. This runs before Joomla! installs or updates the component. This is our last chance to
	 * tell Joomla! if it should abort the installation.
	 *
	 * @param   string           $type    Installation type (install, update, discover_install)
	 * @param   JoomlaInstaller  $parent  Parent object
	 *
	 * @return  boolean  True to let the installation proceed, false to halt the installation
	 */
	public function preflight($type, $parent)
	{
		// Do not run on uninstall.
		if ($type === 'uninstall')
		{
			return true;
		}

		// Check the minimum PHP version
		if (!empty($this->minimumPHPVersion))
		{
			if (defined('PHP_VERSION'))
			{
				$version = PHP_VERSION;
			}
			elseif (function_exists('phpversion'))
			{
				$version = phpversion();
			}
			else
			{
				$version = '5.0.0'; // all bets are off!
			}

			if (!version_compare($version, $this->minimumPHPVersion, 'ge'))
			{
				$msg = "<p>You need PHP $this->minimumPHPVersion or later to install this package but you are currently using PHP  $version</p>";

				Log::add($msg, Log::WARNING, 'jerror');

				return false;
			}
		}

		// Check the minimum Joomla! version
		if (!empty($this->minimumJoomlaVersion) && !version_compare(JVERSION, $this->minimumJoomlaVersion, 'ge'))
		{
			$jVersion = JVERSION;
			$msg      = "<p>You need Joomla! $this->minimumJoomlaVersion or later to install this package but you only have $jVersion installed.</p>";

			Log::add($msg, Log::WARNING, 'jerror');

			return false;
		}

		// Check the maximum Joomla! version
		if (!empty($this->maximumJoomlaVersion) && !version_compare(JVERSION, $this->maximumJoomlaVersion, 'le'))
		{
			$jVersion = JVERSION;
			$msg = <<< HTML
<h3>FOF is no longer needed on Joomla 5</h3>
<p>
	<strong>Summary: FOF is no longer used on Joomla 5. Please uninstall it.</strong>
</p>
<hr/>
<p>
	FOF a.k.a. Framework-on-Framework was an extension development framework used by Akeeba Ltd (and some third party extensions developed by companies not affiliated with Akeeba Ltd) on Joomla 1.5 to 3.10.
</p>
<p>
	Akeeba Ltd has stopped using the FOF framework for developing extensions. All of our extensions have new, Joomla 4 and later native versions which use the Joomla Core MVC library, included in Joomla itself.
</p>
<p>
	You can no longer install or update FOF on Joomla 5.0 and later (you have {$jVersion}). In fact, you just need to uninstall it.
</p>
HTML;

			Log::add($msg, Log::WARNING, 'jerror');

			return false;
		}

		// In case of an update, discovery etc I need to check if I am an update
		if (($type != 'install') && !$this->amIAnUpdate($parent))
		{
			$msg = "<p>You have a newer version of FOF installed. If you want to downgrade please uninstall FOF and install the older version.</p>";

			if (defined('AKEEBA_PACKAGE_INSTALLING'))
			{
				$msg = "<p>Your site has a newer version of FOF 4 than the one bundled with this package. Please note that <strong>you can safely ignore the “Custom install routine failure” message</strong> below. It is not a real error; it is an expected message which is always printed by Joomla! in this case and which cannot be suppressed.</p>";
			}

			Log::add($msg, Log::WARNING, 'jerror');

			return false;
		}

		return true;
	}

	/**
	 * Runs after install, update or discover_update. In other words, it executes after Joomla! has finished installing
	 * or updating your component. This is the last chance you've got to perform any additional installations, clean-up,
	 * database updates and similar housekeeping functions.
	 *
	 * @param   string            $type    install, update or discover_update
	 * @param   InstallerAdapter  $parent  Parent object
	 *
	 * @throws  Exception
	 */
	public function postflight($type, $parent)
	{
		// Do not run on uninstall.
		if ($type === 'uninstall')
		{
			return;
		}

		// Auto-uninstall this package when it is no longer needed.
		if (($type != 'install') && ($this->countHardcodedDependencies() === 0))
		{
			// $this->uninstallSelf($parent);

			return;
		}

		// Remove obsolete files and folders
		$this->removeFilesAndFolders($this->removeFiles);

		if ($type == 'update')
		{
			$this->bugfixFilesNotCopiedOnUpdate($parent);
		}

		$this->loadFOF40();

		if (!defined('FOF40_INCLUDED'))
		{
			return;
		}

		// Install or update database
		$db = JoomlaFactory::getDbo();

		/** @var JoomlaInstaller $grandpa */
		$grandpa   = $parent->getParent();
		$src       = $grandpa->getPath('source');
		$sqlSource = $src . '/fof/sql';

		// If we have an uppercase db prefix we can expect the database update to fail because we cannot detect reliably
		// the existence of database tables. See https://github.com/joomla/joomla-cms/issues/10928#issuecomment-228549658
		$prefix  = $db->getPrefix();
		$canFail = preg_match('/[A-Z]/', $prefix);

		try
		{
			$dbInstaller = new FOF40\Database\Installer($db, $sqlSource);
			$dbInstaller->updateSchema();
		}
		catch (\Exception $e)
		{
			if (!$canFail)
			{
				throw $e;
			}
		}

		// Since we're adding common table, I have to nuke the installer cache, otherwise checks on their existence would fail
		$dbInstaller->nukeCache();

		// Clear the FOF cache
		$fakeController = \FOF40\Container\Container::getInstance('com_FOOBAR');
		$fakeController->platform->clearCache();

		// Clear op-code caches
		$this->clearOpcodeCaches();
	}

	/**
	 * Runs on uninstallation
	 *
	 * @param   InstallerAdapter  $parent  The parent object
	 *
	 * @throws  RuntimeException  If the uninstallation is not allowed
	 */
	public function uninstall($parent)
	{
		 if (version_compare(JVERSION, '4.1.0', 'ge'))
		 {
		 	return;
		 }

		// Check dependencies on FOF
		$dependencyCount = $this->countHardcodedDependencies();

		if ($dependencyCount !== 0)
		{
			$msg = "<p>You have $dependencyCount extension(s) depending on this version of FOF. The package cannot be uninstalled unless these extensions are uninstalled first.</p>";

			Log::add($msg, Log::WARNING, 'jerror');

			throw new RuntimeException($msg, 500);
		}
	}

	/**
	 * Is this package an update to the currently installed FOF? If not (we're a downgrade) we will return false
	 * and prevent the installation from going on.
	 *
	 * @param   InstallerAdapter  $parent  The parent object
	 *
	 * @return  bool  The installation status
	 */
	protected function amIAnUpdate($parent): bool
	{
		/** @var JoomlaInstaller $grandpa */
		$grandpa = $parent->getParent();

		$source = $grandpa->getPath('source');

		$target = JPATH_LIBRARIES . '/fof40';

		// If FOF is not really installed (someone removed the directory instead of uninstalling?) I have to install it.
		if (!Folder::exists($target))
		{
			return true;
		}

		$fofVersion = [];

		if (File::exists($target . '/version.txt'))
		{
			$rawData                 = @file_get_contents($target . '/version.txt');
			$rawData                 = ($rawData === false) ? "0.0.0\n2011-01-01\n" : $rawData;
			$info                    = explode("\n", $rawData);
			$fofVersion['installed'] = [
				'version' => trim($info[0]),
				'date'    => new JoomlaDate(trim($info[1])),
			];
		}
		else
		{
			$fofVersion['installed'] = [
				'version' => '0.0',
				'date'    => new JoomlaDate('2011-01-01'),
			];
		}

		$rawData               = @file_get_contents($source . '/fof/version.txt');
		$rawData               = ($rawData === false) ? "0.0.0\n2011-01-01\n" : $rawData;
		$info                  = explode("\n", $rawData);
		$fofVersion['package'] = [
			'version' => trim($info[0]),
			'date'    => new JoomlaDate(trim($info[1])),
		];

		return $fofVersion['package']['date']->toUNIX() >= $fofVersion['installed']['date']->toUNIX();
	}

	/**
	 * Loads FOF 3.0 if it's not already loaded
	 */
	protected function loadFOF40()
	{
		// Load FOF if not already loaded
		if (!defined('FOF40_INCLUDED'))
		{
			$filePath = JPATH_LIBRARIES . '/fof40/include.php';

			if (defined('FOF40_INCLUDED'))
			{
				return;
			}

			if (!file_exists($filePath))
			{
				return;
			}

			@include_once $filePath;
		}
	}

	/**
	 * Fix for Joomla bug: sometimes files are not copied on update.
	 *
	 * We have observed that ever since Joomla! 1.5.5, when Joomla! is performing an extension update some files /
	 * folders are not copied properly. This seems to be a bit random and seems to be more likely to happen the more
	 * added / modified files and folders you have. We are trying to work around it by retrying the copy operation
	 * ourselves WITHOUT going through the manifest, based entirely on the conventions we follow.
	 *
	 * @param   InstallerAdapter  $parent
	 */
	protected function bugfixFilesNotCopiedOnUpdate($parent)
	{
		$source = $parent->getParent()->getPath('source') . '/fof';
		$target = JPATH_LIBRARIES . '/' . $this->libraryFolder;

		$this->recursiveConditionalCopy($source, $target);
	}

	/**
	 * Clear PHP opcode caches
	 *
	 * @return  void
	 */
	protected function clearOpcodeCaches()
	{
		// Always reset the OPcache if it's enabled. Otherwise there's a good chance the server will not know we are
		// replacing .php scripts. This is a major concern since PHP 5.5 included and enabled OPcache by default.
		if (function_exists('opcache_reset'))
		{
			opcache_reset();
		}
		// Also do that for APC cache
		elseif (function_exists('apc_clear_cache'))
		{
			@apc_clear_cache();
		}
	}

	/**
	 * Removes obsolete files and folders
	 *
	 * @param   array  $removeList  The files and directories to remove
	 */
	protected function removeFilesAndFolders($removeList)
	{
		// Remove files
		if (isset($removeList['files']) && !empty($removeList['files']))
		{
			foreach ($removeList['files'] as $file)
			{
				$f = sprintf("%s/%s/%s", JPATH_LIBRARIES, $this->libraryFolder, $file);

				if (!is_file($f))
				{
					continue;
				}

				File::delete($f);
			}
		}
		// Remove folders
		if (!isset($removeList['folders']))
		{
			return;
		}

		if (empty($removeList['folders']))
		{
			return;
		}

		foreach ($removeList['folders'] as $folder)
		{
			$f = sprintf("%s/%s/%s", JPATH_LIBRARIES, $this->libraryFolder, $folder);

			if (!@file_exists($f) || !is_dir($f) || is_link($f))
			{
				continue;
			}

			Folder::delete($f);
		}
	}

	/**
	 * Recursively copy a bunch of files, but only if the source and target file have a different size.
	 *
	 * @param   string  $source   Path to copy FROM
	 * @param   string  $dest     Path to copy TO
	 * @param   array   $ignored  List of entries to ignore (first level entries are taken into account)
	 *
	 * @return  void
	 */
	protected function recursiveConditionalCopy($source, $dest, $ignored = [])
	{
		// Make sure source and destination exist
		if (!@is_dir($source))
		{
			return;
		}

		if (!@is_dir($dest))
		{
			if (!@mkdir($dest, 0755))
			{
				Folder::create($dest, 0755);
			}
		}

		if (!@is_dir($dest))
		{
			// Cannot create folder $dest

			return;
		}

		// List the contents of the source folder
		try
		{
			$di = new DirectoryIterator($source);
		}
		catch (Exception $e)
		{
			return;
		}

		// Process each entry
		foreach ($di as $entry)
		{
			// Ignore dot dirs (. and ..)
			if ($entry->isDot())
			{
				continue;
			}

			$sourcePath = $entry->getPathname();
			$fileName   = $entry->getFilename();

			// Do not copy ignored files
			if (!empty($ignored) && in_array($fileName, $ignored))
			{
				continue;
			}

			// If it's a directory do a recursive copy
			if ($entry->isDir())
			{
				$this->recursiveConditionalCopy($sourcePath, $dest . DIRECTORY_SEPARATOR . $fileName);

				continue;
			}

			// If it's a file check if it's missing or identical
			$mustCopy   = false;
			$targetPath = $dest . DIRECTORY_SEPARATOR . $fileName;

			if (!@is_file($targetPath))
			{
				$mustCopy = true;
			}
			else
			{
				$sourceSize = @filesize($sourcePath);
				$targetSize = @filesize($targetPath);

				$mustCopy = $sourceSize != $targetSize;

				if ((substr($targetPath, -4) === '.php') && function_exists('opcache_invalidate'))
				{
					/** @noinspection PhpComposerExtensionStubsInspection */
					opcache_invalidate($targetPath);
				}
			}

			if (!$mustCopy)
			{
				continue;
			}

			if (!@copy($sourcePath, $targetPath))
			{
				File::copy($sourcePath, $targetPath);
			}
		}
	}

	/**
	 * Count the number of old FOF + FEF based extensions installed on this site
	 *
	 * @return  int
	 */
	private function countHardcodedDependencies()
	{
		// Look for fof.xml in the backend directories of the following components
		$hardcodedDependencies = [
			'com_admintools',
			'com_akeeba',
			'com_ars',
			'com_ats',
			'com_compatibility',
			'com_datacompliance',
			'com_contactus',
			'com_docimport',
			'com_loginguard',
		];

		$count = 0;

		foreach ($hardcodedDependencies as $component)
		{
			$filePath = JPATH_ADMINISTRATOR . '/components/' . $component . '/fof.xml';

			if (@file_exists($filePath))
			{
				$count++;
			}
		}

		return $count;
	}

	/**
	 * Uninstall this package.
	 *
	 * This runs on update when there are no more dependencies left.
	 *
	 * @param  \Joomla\CMS\Installer\Adapter\FileAdapter $adapter
	 *
	 * @return void
	 */
	private function uninstallSelf($adapter)
	{
		$parent = $adapter->getParent();

		if (empty($parent) || !property_exists($parent, 'extension'))
		{
			return;
		}

		if (version_compare(JVERSION, '4.0', 'lt'))
		{
			$db = \Joomla\CMS\Factory::getDbo();
		}
		else
		{
			$db = \Joomla\CMS\Factory::getContainer()->get('DatabaseDriver');
		}

		try
		{
			$query = $db->getQuery(true)
				->select($db->quoteName('extension_id'))
				->from($db->quoteName('#__extensions'))
				->where($db->quoteName('type') . ' = ' . $db->quote('file'))
				->where($db->quoteName('name') . ' = ' . $db->quote('file_fof40'));

			$id = $db->setQuery($query)->loadResult();
		}
		catch (Exception $e)
		{
			return;
		}

		if (empty($id))
		{
			return;
		}

		$msg = 'Automatically uninstalling FOF 4; this package is no longer required on your site.';
		Log::add($msg, Log::INFO, 'jerror');

		$parent->uninstall('file', $id);
	}
}
manifests/files/file_fef/script.fef.php000060400000033730152453623430014163 0ustar00<?php
/**
 * Akeeba Frontend Framework (FEF)
 *
 * @package   fef
 * @copyright (c) 2017-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') or die();

use Joomla\CMS\Date\Date as JDate;
use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\Filesystem\File;
use Joomla\CMS\Filesystem\Folder;
use Joomla\CMS\Installer\Adapter\FileAdapter as JInstallerAdapterFile;
use Joomla\CMS\Installer\Installer as JInstaller;
use Joomla\CMS\Log\Log as JLog;

if (class_exists('file_fefInstallerScript'))
{
	// WTAF?!
	return;
}

/**
 * Akeeba FEF Installation Script
 *
 * @noinspection PhpUnused
 */
class file_fefInstallerScript
{
	/**
	 * The minimum PHP version required to install this extension
	 *
	 * @var   string
	 */
	protected $minimumPHPVersion = '7.2.0';

	/**
	 * The minimum Joomla! version required to install this extension
	 *
	 * @var   string
	 */
	protected $minimumJoomlaVersion = '3.9.0';

	/**
	 * The maximum Joomla! version this extension can be installed on
	 *
	 * @var   string
	 */
	protected $maximumJoomlaVersion = '4.999.999';

	/**
	 * Joomla! pre-flight event. This runs before Joomla! installs or updates the component. This is our last chance to
	 * tell Joomla! if it should abort the installation.
	 *
	 * @param   string                            $type    Installation type (install, update, discover_install)
	 * @param   JInstaller|JInstallerAdapterFile  $parent  Parent object
	 *
	 * @return  boolean  True to let the installation proceed, false to halt the installation
	 */
	public function preflight($type, $parent)
	{
		// Do not run on uninstall.
		if ($type === 'uninstall')
		{
			return true;
		}

		// Check the minimum PHP version
		if (!empty($this->minimumPHPVersion))
		{
			if (defined('PHP_VERSION'))
			{
				$version = PHP_VERSION;
			}
			elseif (function_exists('phpversion'))
			{
				$version = phpversion();
			}
			else
			{
				$version = '5.0.0'; // all bets are off!
			}

			if (!version_compare($version, $this->minimumPHPVersion, 'ge'))
			{
				$msg = "<p>You need PHP $this->minimumPHPVersion or later to install this package but you are currently using PHP  $version</p>";

				JLog::add($msg, JLog::WARNING, 'jerror');

				return false;
			}
		}

		// Check the minimum Joomla! version
		if (!empty($this->minimumJoomlaVersion) && !version_compare(JVERSION, $this->minimumJoomlaVersion, 'ge'))
		{
			$jVersion = JVERSION;
			$msg      = "<p>You need Joomla! $this->minimumJoomlaVersion or later to install this package but you only have $jVersion installed.</p>";

			JLog::add($msg, JLog::WARNING, 'jerror');

			return false;
		}

		// Check the maximum Joomla! version
		if (!empty($this->maximumJoomlaVersion) && !version_compare(JVERSION, $this->maximumJoomlaVersion, 'le'))
		{
			$jVersion = JVERSION;
			$msg = <<< HTML
<h3>FEF is no longer needed on Joomla 5</h3>
<p>
	<strong>Summary: FEF is no longer used on Joomla 5. Please uninstall it.</strong>
</p>
<hr/>
<p>
	Akeeba FEF a.k.a. the Akeeba Front-End Framework was a CSS and JavaScript framework used by Akeeba Ltd with the Joomla 3 versions of our software.
</p>
<p>
	Akeeba Ltd has stopped using the FEF framework for developing extensions. All of our extensions have new, Joomla 4 and later native versions which use the Bootstrap library, included in Joomla itself.
</p>
<p>
	You can no longer install or update FEF on Joomla 5.0 and later (you have {$jVersion}). In fact, you just need to uninstall it.
</p>
HTML;

			JLog::add($msg, JLog::WARNING, 'jerror');

			return false;
		}

		// In case of an update, discovery etc I need to check if I am an update
		if (($type == 'update') && !$this->amIAnUpdate($parent))
		{
			$msg = "<p>You already have a newer version of Akeeba Frontend Framework installed. If you want to downgrade please uninstall Akeeba Frontend Framework and install the older version.</p><p>If you see this message during the installation or update of an Akeeba extension please ignore it <em>and</em> the immediately following “Files Install: Custom install routine failure” message. They are expected but Joomla! won't allow us to prevent them from showing up.</p>";

			JLog::add($msg, JLog::WARNING, 'jerror');

			return false;
		}

		// Delete obsolete font files and folders
		if ($type == 'update')
		{
			// Use pathnames relative to your site's root
			$removeFiles = [
				'files'   => [
					// Non-WOFF fonts are not shipped as of 1.0.1 since all modern browsers we target use WOFF
					'media/fef/fonts/akeeba/Akeeba-Products.eot',
					'media/fef/fonts/akeeba/Akeeba-Products.svg',
					'media/fef/fonts/akeeba/Akeeba-Products.ttf',
					'media/fef/fonts/Ionicon/ionicons.eot',
					'media/fef/fonts/Ionicon/ionicons.svg',
					'media/fef/fonts/Ionicon/ionicons.ttf',
					// Files renamed in 1.0.8
					'css/reset.min.css',
					'css/style.min.css',
					// JavaScript: Irrelevant for Joomla
					'js/darkmode.js',
					'js/darkmode.min.js',
					'js/darkmode.map',
					'js/Darkmode.min.js',
					'js/Darkmode.map',
					'js/menu.js',
					'js/menu.min.js',
					'js/menu.map',
					'js/Menu.min.js',
					'js/Menu.map',
					// JavaScript: Uncompressed and map files
					'js/dropdown.js',
					'js/dropdown.map',
					'js/Dropdown.map',
					'js/loader.js',
					'js/loader.map',
					'js/Loader.map',
					'js/tabs.js',
					'js/tabs.map',
					'js/Tabs.map',
				],
				'folders' => [
				],
			];

			// Remove obsolete files and folders
			$this->removeFilesAndFolders($removeFiles);
		}

		return true;
	}

	/**
	 * Runs after install, update or discover_update. In other words, it executes after Joomla! has finished installing
	 * or updating your component. This is the last chance you've got to perform any additional installations, clean-up,
	 * database updates and similar housekeeping functions.
	 *
	 * @param   string                 $type    install, update or discover_update
	 * @param   JInstallerAdapterFile  $parent  Parent object
	 *
	 * @throws  Exception
	 *
	 * @noinspection PhpUnusedParameterInspection
	 */
	public function postflight($type, JInstallerAdapterFile $parent)
	{
		// Do not run on uninstall.
		if ($type === 'uninstall')
		{
			return true;
		}

		// Auto-uninstall this package when it is no longer needed.
		if (($type != 'install') && ($this->countHardcodedDependencies() === 0))
		{
			$this->uninstallSelf($parent);

			return true;
		}

		$this->bugfixFilesNotCopiedOnUpdate($parent);

		return true;
	}

	/**
	 * Runs on uninstallation
	 *
	 * @param   JInstallerAdapterFile  $parent  The parent object
	 *
	 * @throws  RuntimeException  If the uninstallation is not allowed
	 *
	 * @noinspection PhpUnusedParameterInspection
	 */
	public function uninstall($parent)
	{
		if (version_compare(JVERSION, '4.1.0', 'ge'))
		{
			return false;
		}

		// Check dependencies on FEF
		$dependencyCount = $this->countHardcodedDependencies();

		if ($dependencyCount)
		{
			$msg = "<p>You have $dependencyCount extension(s) depending on Akeeba Frontend Framework. The package cannot be uninstalled unless these extensions are uninstalled first.</p>";

			JLog::add($msg, JLog::WARNING, 'jerror');

			throw new RuntimeException($msg, 500);
		}

		Folder::delete(JPATH_SITE . '/media/fef');

		return true;
	}

	/**
	 * Removes obsolete files and folders
	 *
	 * @param   array  $removeList  The files and directories to remove
	 */
	protected function removeFilesAndFolders($removeList)
	{
		// Remove files
		if (isset($removeList['files']) && !empty($removeList['files']))
		{
			foreach ($removeList['files'] as $file)
			{
				$f = JPATH_ROOT . '/' . $file;

				if (!is_file($f))
				{
					continue;
				}

				File::delete($f);
			}
		}

		// Remove folders
		if (isset($removeList['folders']) && !empty($removeList['folders']))
		{
			foreach ($removeList['folders'] as $folder)
			{
				$f = JPATH_ROOT . '/' . $folder;

				if (!is_dir($f))
				{
					continue;
				}

				Folder::delete($f);
			}
		}
	}

	/**
	 * Is this package an update to the currently installed FEF? If not (we're a downgrade) we will return false
	 * and prevent the installation from going on.
	 *
	 * @param   JInstallerAdapterFile  $parent  The parent object
	 *
	 * @return  bool  Am I an update to an existing version>
	 */
	protected function amIAnUpdate($parent)
	{
		$grandpa = $parent->getParent();
		$source  = $grandpa->getPath('source');
		$target  = JPATH_ROOT . '/media/fef';

		if (!Folder::exists($source))
		{
			// WTF? I can't find myself. I can't install anything.
			return false;
		}

		// If FEF is not really installed (someone removed the directory instead of uninstalling?) I have to install it.
		if (!Folder::exists($target))
		{
			return true;
		}

		$fefVersion = [];

		if (File::exists($target . '/version.txt'))
		{
			$rawData                 = @file_get_contents($target . '/version.txt');
			$rawData                 = ($rawData === false) ? "0.0.0\n2011-01-01\n" : $rawData;
			$info                    = explode("\n", $rawData);
			$fefVersion['installed'] = [
				'version' => trim($info[0]),
				'date'    => new JDate(trim($info[1])),
			];
		}
		else
		{
			$fefVersion['installed'] = [
				'version' => '0.0',
				'date'    => new JDate('2011-01-01'),
			];
		}

		$rawData               = @file_get_contents($source . '/version.txt');
		$rawData               = ($rawData === false) ? "0.0.0\n2011-01-01\n" : $rawData;
		$info                  = explode("\n", $rawData);
		$fefVersion['package'] = [
			'version' => trim($info[0]),
			'date'    => new JDate(trim($info[1])),
		];

		return $fefVersion['package']['date']->toUNIX() >= $fefVersion['installed']['date']->toUNIX();
	}

	/**
	 * Fix for Joomla bug: sometimes files are not copied on update.
	 *
	 * We have observed that ever since Joomla! 1.5.5, when Joomla! is performing an extension update some files /
	 * folders are not copied properly. This seems to be a bit random and seems to be more likely to happen the more
	 * added / modified files and folders you have. We are trying to work around it by retrying the copy operation
	 * ourselves WITHOUT going through the manifest, based entirely on the conventions we follow.
	 *
	 * @param   \Joomla\CMS\Installer\Adapter\FileAdapter  $parent
	 */
	protected function bugfixFilesNotCopiedOnUpdate($parent)
	{
		$source = $parent->getParent()->getPath('source');
		$target = JPATH_SITE . '/media/fef';

		$this->recursiveConditionalCopy($source, $target);
	}

	/**
	 * Recursively copy a bunch of files, but only if the source and target file have a different size.
	 *
	 * @param   string  $source   Path to copy FROM
	 * @param   string  $dest     Path to copy TO
	 * @param   array   $ignored  List of entries to ignore (first level entries are taken into account)
	 *
	 * @return  void
	 */
	protected function recursiveConditionalCopy($source, $dest, $ignored = [])
	{
		// Make sure source and destination exist
		if (!@is_dir($source))
		{
			return;
		}

		if (!@is_dir($dest))
		{
			if (!@mkdir($dest, 0755))
			{
				Folder::create($dest, 0755);
			}
		}

		if (!@is_dir($dest))
		{
			// Cannot create folder $dest

			return;
		}

		// List the contents of the source folder
		try
		{
			$di = new DirectoryIterator($source);
		}
		catch (Exception $e)
		{
			return;
		}

		// Process each entry
		foreach ($di as $entry)
		{
			// Ignore dot dirs (. and ..)
			if ($entry->isDot())
			{
				continue;
			}

			$sourcePath = $entry->getPathname();
			$fileName   = $entry->getFilename();

			// Do not copy ignored files
			if (!empty($ignored) && in_array($fileName, $ignored))
			{
				continue;
			}

			// If it's a directory do a recursive copy
			if ($entry->isDir())
			{
				$this->recursiveConditionalCopy($sourcePath, $dest . DIRECTORY_SEPARATOR . $fileName);

				continue;
			}

			// If it's a file check if it's missing or identical
			$mustCopy   = false;
			$targetPath = $dest . DIRECTORY_SEPARATOR . $fileName;

			if (!@is_file($targetPath))
			{
				$mustCopy = true;
			}
			else
			{
				$sourceSize = @filesize($sourcePath);
				$targetSize = @filesize($targetPath);

				$mustCopy = $sourceSize != $targetSize;

				if ((substr($targetPath, -4) === '.php') && function_exists('opcache_invalidate'))
				{
					opcache_invalidate($targetPath);
				}
			}

			if (!$mustCopy)
			{
				continue;
			}

			if (!@copy($sourcePath, $targetPath))
			{
				File::copy($sourcePath, $targetPath);
			}
		}
	}

	/**
	 * Count the number of old FOF + FEF based extensions installed on this site
	 *
	 * @return  int
	 */
	private function countHardcodedDependencies()
	{
		// Look for fof.xml in the backend directories of the following components
		$hardcodedDependencies = [
			'com_admintools',
			'com_akeeba',
			'com_ars',
			'com_ats',
			'com_compatibility',
			'com_datacompliance',
			'com_contactus',
			'com_docimport',
			'com_loginguard',
		];

		$count = 0;

		foreach ($hardcodedDependencies as $component)
		{
			$filePath = JPATH_ADMINISTRATOR . '/components/' . $component . '/fof.xml';

			if (@file_exists($filePath))
			{
				$count++;
			}
		}

		return $count;
	}

	/**
	 * Uninstall this package.
	 *
	 * This runs on update when there are no more dependencies left.
	 *
	 * @param  \Joomla\CMS\Installer\Adapter\FileAdapter $adapter
	 *
	 * @return void
	 */
	private function uninstallSelf($adapter)
	{
		$parent = $adapter->getParent();

		if (empty($parent) || !property_exists($parent, 'extension'))
		{
			return;
		}

		if (version_compare(JVERSION, '4.0', 'lt'))
		{
			$db = \Joomla\CMS\Factory::getDbo();
		}
		else
		{
			$db = \Joomla\CMS\Factory::getContainer()->get('DatabaseDriver');
		}

		try
		{
			$query = $db->getQuery(true)
				->select($db->quoteName('extension_id'))
				->from($db->quoteName('#__extensions'))
				->where($db->quoteName('type') . ' = ' . $db->quote('file'))
				->where($db->quoteName('name') . ' = ' . $db->quote('file_fef'));

			$id = $db->setQuery($query)->loadResult();
		}
		catch (Exception $e)
		{
			return;
		}

		if (empty($id))
		{
			return;
		}

		$msg = 'Automatically uninstalling FEF; this package is no longer required on your site.';
		\Joomla\CMS\Log\Log::add($msg, \Joomla\CMS\Log\Log::INFO, 'jerror');

		$parent->uninstall('file', $id);
	}
}
manifests/packages/pkg_dj-imageslider.xml000060400000004601152453623430014562 0ustar00<?xml version="1.0" encoding="UTF-8" ?>
<extension type="package" version="2.5.5" method="upgrade">
	<name>DJ-ImageSlider Package</name>
	<packagename>dj-imageslider</packagename>
	<creationDate>2018-12-19</creationDate>
	<author>DJ-Extensions.com</author>
	<copyright>Copyright (C) 2017 DJ-Extensions.com, All rights reserved.</copyright>
	<license> http://www.gnu.org/licenses GNU/GPL</license>
	<authorEmail>contact@dj-extensions.com</authorEmail>
	<authorUrl>http://dj-extensions.com</authorUrl>
	<version>4.5.1</version>
	<url>http://dj-extensions.com</url>
	<packager></packager>
	<packagerurl></packagerurl>
	<description><![CDATA[
		<style type="text/css">
			.djex-info { padding: 20px 30px 10px; margin: 0 0 20px 0; background: #ac00d4; color: #fff; border: 1px solid #81009f; font-family: Arial, Helvetica, sans-serif; font-size: 13px; font-weight: normal; -webkit-border-radius: 4px; border-radius: 4px; }
			.djex-title { text-transform: uppercase; font-weight: bold; font-size: 14px; }
			.djex-info a:link, .djex-info a:visited, .djex-info a:hover { color:#fff; text-decoration:underline; font-weight: 600; }	
			.djex-info img { float: left; margin: 0 30px 10px 0; }
		</style>
		<div class="djex-info">
			<a href="index.php?option=com_djimageslider"><img src="components/com_djimageslider/assets/ex_slider.png" /></a>
			<p class="djex-title">Thank you for installing DJ-ImageSlider!</p>
			<p>The DJ-ImageSlider extension allows you to display slideshows containing slides with title and short description linked to any menu item, article or custom url address. 
			If you want to learn how to use DJ-ImageSlider please read <a target="_blank" href="http://dj-extensions.com/documentation">Documentation</a> and <a target="_blank" href="http://dj-extensions.com/faq">FAQ section</a></p>
			<p>Check out our other extensions at <a target="_blank" href="http://dj-extensions.com">DJ-Extensions.com</a></p>
			<div style="clear:both"></div>
		</div>
		]]></description>
	<files>
	        <file type="component" client="admin" id="com_djimageslider">com_djimageslider.zip</file>
	        <file type="module" client="site" id="mod_djimageslider">mod_djimageslider.zip</file>
	</files>
	<updateservers>
		<server type="extension" priority="1" name="DJ-ImageSlider Package">https://dj-extensions.com/index.php?option=com_ars&amp;view=update&amp;task=stream&amp;format=xml&amp;id=3</server>
	</updateservers>
</extension>
manifests/packages/jce/install.pkg.php000060400000060044152453623430014022 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2023 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
\defined('_JEXEC') or die;

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\Filesystem\File;
use Joomla\Filesystem\Folder;
use Joomla\CMS\Installer\Installer;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\LayoutHelper;
use Joomla\CMS\MVC\Model\BaseDatabaseModel;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\CMS\Table\Table;

class pkg_jceInstallerScript
{
    /**
     * The current installed version
     * @var string
     */
    private static $current_version;

    /**
     * The current installed variant, eg: core, pro
     *
     * @var string
     */
    private static $current_variant = 'core';
    
    private function addIndexfiles($paths)
    {
        // get the base file
        $file = JPATH_ADMINISTRATOR . '/components/com_jce/index.html';

        if (is_file($file)) {
            foreach ((array) $paths as $path) {
                if (is_dir($path)) {
                    // admin component
                    $folders = Folder::folders($path, '.', true, true);

                    foreach ($folders as $folder) {
                        File::copy($file, $folder . '/' . basename($file));
                    }
                }
            }
        }
    }

    private function installProfiles()
    {
        include_once JPATH_ADMINISTRATOR . '/components/com_jce/helpers/profiles.php';
        return JceProfilesHelper::installProfiles();
    }

    public function install($installer)
    {
        // enable plugins
        $plugin = Table::getInstance('extension');

        $plugins = array(
            'jce' => array('content', 'system', 'quickicon', 'extension', 'installer'),
            'jcepro' => array('system'),
            'mediajce' => array('fields')
        );

        $parent = $installer->getParent();

        foreach ($plugins as $element => $folders) {
            foreach ($folders as $folder) {
                $id = $plugin->find(array('type' => 'plugin', 'folder' => $folder, 'element' => $element));

                if ($id) {
                    $plugin->load($id);
                    $plugin->enabled = 1;
                    $plugin->store();
                }
            }
        }

        // install profiles
        $this->installProfiles();

        $language = Factory::getLanguage();
        $language->load('com_jce', JPATH_ADMINISTRATOR, null, true);
        $language->load('com_jce.sys', JPATH_ADMINISTRATOR, null, true);

        // set layout base path
        LayoutHelper::$defaultBasePath = JPATH_ADMINISTRATOR . '/components/com_jce/layouts';

        // override existing message
        $message = '';
        $message .= '<div id="jce" class="mt-4 mb-4 p-4 border-dark well text-start" role="alert">';
        $message .= '   <h1>' . Text::_('COM_JCE') . ' ' . $parent->manifest->version . '</h1>';
        $message .= '   <div>';

        // variant messates
        if ((string) $parent->manifest->variant != 'pro') {
            $message .= LayoutHelper::render('message.upgrade');
        } else {
            // show core to pro upgrade message
            if ($parent->isUpgrade()) {
                $variant = (string) self::$current_variant; //$parent->get('current_variant', 'core');

                if ($variant == 'core') {
                    $message .= LayoutHelper::render('message.welcome');
                }
            }
        }

        $message .= Text::_('COM_JCE_XML_DESCRIPTION');

        $message .= '   </div>';
        $message .= '</div>';

        $parent->set('message', $message);

        // add index files to each folder
        $this->addIndexfiles(array(
            __DIR__,
            JPATH_SITE . '/components/com_jce',
            JPATH_PLUGINS . '/jce',
        ));

        return true;
    }

    private function checkTable()
    {
        $db = Factory::getDBO();

        $tables = $db->getTableList();

        if (!empty($tables)) {
            // swap array values with keys, convert to lowercase and return array keys as values
            $tables = array_keys(array_change_key_case(array_flip($tables)));
            $app = Factory::getApplication();
            $match = str_replace('#__', strtolower($app->getCfg('dbprefix', '')), '#__wf_profiles');

            return in_array($match, $tables);
        }

        // try with query
        $query = $db->getQuery(true);

        $query->select('COUNT(id)')->from('#__wf_profiles');
        $db->setQuery($query);

        return $db->execute();
    }

    public function uninstall()
    {
        $db = Factory::getDBO();

        if ($this->checkTable() === false) {
            return true;
        }

        $query = $db->getQuery(true);
        $query->select('COUNT(id)')->from('#__wf_profiles');
        $db->setQuery($query);

        // profiles table is empty, remove...
        if ($db->loadResult() === 0) {
            $db->dropTable('#__wf_profiles', true);
            $db->execute();
        }
    }

    public function update($installer)
    {
        return $this->install($installer);
    }

    protected function getCurrentVersion()
    {
        // get current package version
        $manifest = JPATH_ADMINISTRATOR . '/manifests/packages/pkg_jce.xml';
        $version = 0;
        $variant = "core";

        if (is_file($manifest)) {
            if ($xml = @simplexml_load_file($manifest)) {
                $version = (string) $xml->version;
                $variant = (string) $xml->variant;
            }
        }

        return array($version, $variant);
    }

    public function preflight($route, $installer)
    {        
        // skip on uninstall etc.
        if ($route == 'remove' || $route == 'uninstall') {
            return true;
        }

        $parent = $installer->getParent();

        $requirements = '<a href="https://www.joomlacontenteditor.net/support/documentation/editor/requirements" title="Editor Requirements" target="_blank" rel="noopener">https://www.joomlacontenteditor.net/support/documentation/editor/requirements</a>';

        // php version check
        if (version_compare(PHP_VERSION, '7.4', 'lt')) {
            throw new RuntimeException('JCE requires PHP 7.4 or later - ' . $requirements);
        }

        // joomla version check
        if (version_compare(JVERSION, '3.10', 'lt')) {
            throw new RuntimeException('JCE requires Joomla 3.10 or later - ' . $requirements);
        }

        // set current package version and variant
        list($version, $variant) = $this->getCurrentVersion();

        // set current version
        self::$current_version = $version;

        // set current variant
        self::$current_variant = $variant;

        // core cannot be installed over pro
        if ($variant === "pro" && (string) $parent->manifest->variant === "core") {
            throw new RuntimeException('JCE Core cannot be installed over JCE Pro. Please install JCE Pro. To downgrade, please first uninstall JCE Pro.');
        }

        // end here if not an upgrade
        if ($route != 'update') {
            return true;
        }

        $extension = Table::getInstance('extension');

        // disable content, system and quickicon plugins. This is to prevent errors if the install fails and some core files are missing
        foreach (array('system', 'quickicon') as $folder) {
            $plugin = $extension->find(array(
                'type' => 'plugin',
                'element' => 'jce',
                'folder' => $folder,
            ));

            if ($plugin) {
                $extension->publish(null, 0);
            }
        }

        // disable legacy jcefilebrowser quickicon to remove when the install is finished
        $plugin = $extension->find(array(
            'type' => 'plugin',
            'element' => 'jcefilebrowser',
            'folder' => 'quickicon',
        ));

        if ($plugin) {
            $extension->publish(null, 0);
        }

        // clean up fields in JCE Pro before install
        $files = array(
            JPATH_PLUGINS . '/system/jcepro/fields/ExtendedMedia.php',
            JPATH_PLUGINS . '/system/jcepro/fields/EditorPlugins.php'
        );

        foreach ($files as $file) {
            if (is_file($file)) {
                @unlink($file);
            }
        }
    }

    private function checkTableUpdate()
    {
        $db = Factory::getDBO();

        $state = true;

        // only for mysql / mysqli
        if (strpos($db->getName(), 'mysql') === false) {
            return $state;
        }

        $query = "DESCRIBE #__wf_profiles";
        $db->setQuery($query);
        $items = $db->loadObjectList();

        foreach ($items as $item) {
            if ($item->Field == 'checked_out') {
                if (strpos($item->Type, 'unsigned') === false) {
                    $state = false;
                }

                if (strpos($item->Type, 'unsigned') === false) {
                    $state = false;
                }
            }

            if ($item->Field == 'checked_out_time') {
                $item = (array) $item;

                if (strtolower($item['Null']) == 'no') {
                    $state = false;
                }
            }
        }

        return $state;
    }

    public function postflight($route, $installer)
    {
        // Do not run on uninstallation.
		if ($route === 'uninstall')
		{
			return true;
		}
        
        $app = Factory::getApplication();
        $extension = Table::getInstance('extension');
        $parent = $installer->getParent();

        $db = Factory::getDBO();

        Table::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_jce/tables');

        // remove legacy jcefilebrowser quickicon and jce content plugins
        $plugins = [
            'jcefilebrowser' => 'quickicon',
            'jce' => 'content'
        ];

        foreach ($plugins as $element => $folder) {
            $plugin = PluginHelper::getPlugin($folder, $element);

            if ($plugin) {
                $inst = Installer::getInstance();

                // try uninstall
                if (!$inst->uninstall('plugin', $plugin->id)) {
                    if ($extension->load($plugin->id)) {
                        $extension->publish(null, 0);
                    }
                }
            }
        }

        if ($route == 'update') {
            $version = (string) $parent->manifest->version;
            $current_version = (string) self::$current_version; //$parent->get('current_version');

            // process core to pro upgrade - remove branding plugin
            if ((string) $parent->manifest->variant === "pro") {
                // remove branding plugin
                $branding = JPATH_SITE . '/media/com_jce/editor/tinymce/plugins/branding';

                if (is_dir($branding)) {
                    Folder::delete($branding);
                }

                // clean up updates sites
                $query = $db->getQuery(true);

                $query->select('update_site_id')->from('#__update_sites');
                $query->where($db->qn('location') . ' = ' . $db->q('https://cdn.joomlacontenteditor.net/updates/xml/editor/pkg_jce.xml'));
                $db->setQuery($query);
                $id = $db->loadResult();

                if ($id) {
                    BaseDatabaseModel::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_installer/models');
                    $model = BaseDatabaseModel::getInstance('Updatesites', 'InstallerModel');

                    if ($model) {
                        $model->delete(array($id));
                    }
                }
            }

            $theme = '';

            // update toolbar_theme for 2.8.0 and 2.8.1 beta
            if (version_compare($current_version, '2.8.0', 'ge') && version_compare($current_version, '2.8.1', 'lt')) {
                $theme = 'modern';
            }

            // update toolbar_theme for 2.7.x
            if (version_compare($current_version, '2.8', 'lt')) {
                $theme = 'default';
            }

            // update toolbar_theme if one has been set
            if ($theme) {
                $table = Table::getInstance('Profiles', 'JceTable');

                $query = $db->getQuery(true);

                $query->select('*')->from('#__wf_profiles');
                $db->setQuery($query);
                $profiles = $db->loadObjectList();

                foreach ($profiles as $profile) {
                    if (empty($profile->params)) {
                        $profile->params = '{}';
                    }

                    $data = json_decode($profile->params, true);

                    if (false !== $data) {
                        if (empty($data)) {
                            $data = array();
                        }

                        // no editor parameters set at all!
                        if (!isset($data['editor'])) {
                            $data['editor'] = array();
                        }

                        $param = array(
                            'toolbar_theme' => $theme,
                        );

                        // add variant for "mobile" profile
                        if ($profile->name === "Mobile") {
                            $param['toolbar_theme'] .= '.touch';
                        }

                        if (empty($data['editor']['toolbar_theme'])) {
                            $data['editor']['toolbar_theme'] = $param['toolbar_theme'];

                            if (!$table->load($profile->id)) {
                                throw new Exception('Unable to update profile - ' . $profile->name);
                            }

                            $table->params = json_encode($data);

                            if (!$table->store()) {
                                throw new Exception('Unable to update profile - ' . $profile->name);
                            }
                        }
                    }
                }
            }

            // enable content, system and quickicon plugins
            foreach (array('content', 'system', 'quickicon') as $folder) {
                $plugin = $extension->find(array(
                    'type' => 'plugin',
                    'element' => 'jce',
                    'folder' => $folder,
                ));

                if ($plugin) {
                    $extension->publish(null, 1);
                }
            }

            // check for "unsigend" in "checked_out" and default value in "checked_out_time" fields and update if necessary
            if (false == $this->checkTableUpdate()) {
                // fix checked_out table
                $query = "ALTER TABLE #__wf_profiles CHANGE COLUMN " . $db->qn('checked_out') . " " . $db->qn('checked_out') . " INT UNSIGNED NULL";
                $db->setQuery($query);
                $db->execute();

                // fix checked_out_time default value
                $query = "ALTER TABLE #__wf_profiles CHANGE COLUMN " . $db->qn('checked_out_time') . " " . $db->qn('checked_out_time') . " DATETIME NULL DEFAULT NULL";
                $db->setQuery($query);
                $db->execute();
            }

            $this->cleanupInstall($installer);
        }

        // Borrowed from the script.ats.php file from Akeeba Ticket System
		// Forcibly create the autoload_psr4.php file afresh.
		if (class_exists(JNamespacePsr4Map::class))
		{
			try
			{
				$nsMap = new JNamespacePsr4Map();

				@clearstatcache(JPATH_CACHE . '/autoload_psr4.php');

				if (function_exists('opcache_invalidate'))
				{
					@opcache_invalidate(JPATH_CACHE . '/autoload_psr4.php');
				}

				@clearstatcache(JPATH_CACHE . '/autoload_psr4.php');
				$nsMap->create();

				if (function_exists('opcache_invalidate'))
				{
					@opcache_invalidate(JPATH_CACHE . '/autoload_psr4.php');
				}

				$nsMap->load();
			}
			catch (\Throwable $e)
			{
				// In case of failure, just try to delete the old autoload_psr4.php file
				if (function_exists('opcache_invalidate'))
				{
					@opcache_invalidate(JPATH_CACHE . '/autoload_psr4.php');
				}

				@unlink(JPATH_CACHE . '/autoload_psr4.php');
				@clearstatcache(JPATH_CACHE . '/autoload_psr4.php');

                Factory::getApplication()->createExtensionNamespaceMap();
			}
		}
    }

    protected static function cleanupInstall($installer)
    {
        $app = Factory::getApplication();
        
        $parent = $installer->getParent();
        $current_version = self::$current_version; //$parent->get('current_version');

        $admin = JPATH_ADMINISTRATOR . '/components/com_jce';
        $site = JPATH_SITE . '/components/com_jce';
        $media = JPATH_SITE . '/media/com_jce';

        $folders = array();
        $files = array();

        $folders['2.6.38'] = array(
            // admin
            $admin . '/classes',
            $admin . '/elements',
            $admin . '/media/fonts',
            $admin . '/img/menu',
            $admin . '/views/preferences',
            $admin . '/views/users',
            // site
            $site . '/editor/elements',
            $site . '/editor/extensions/aggregator/vine',
            $site . '/editor/extensions/popups/window'
        );

        // remove flexicontent
        if (!ComponentHelper::isInstalled('com_flexicontent')) {
            $files['2.7.0'] = array(
                $site . '/editor/extensions/links/flexicontentlinks.php',
                $site . '/editor/extensions/links/flexicontentlinks.xml',
            );

            $folders['2.7.0'] = array(
                $site . '/editor/extensions/links/flexicontentlinks',
            );
        }

        // remove help files
        $folders['2.8.6'] = array(
            $admin . '/views/help',
        );

        // remove mediaplayer
        $folders['2.8.11'] = array(
            $site . '/editor/libraries/mediaplayer',
        );

        // remove fields folder
        $folders['2.9.7'] = array(
            JPATH_PLUGINS . '/system/jce/fields',
        );

        // remove media folder
        $folders['2.9.17'] = array(
            $admin . '/media',
        );

        // remove folders moved to media/com_jce
        $folders['2.9.50'] = array(
            $site . '/editor/tiny_mce',
            $site . '/editor/libraries/css',
            $site . '/editor/libraries/fonts',
            $site . '/editor/libraries/img',
            $site . '/editor/libraries/js',
            $site . '/editor/libraries/vendor',
            $site . '/editor/libraries/pro/css',
            $site . '/editor/libraries/pro/fonts',
            $site . '/editor/libraries/pro/img',
            $site . '/editor/libraries/pro/js',
            $media . '/css',
            $media . '/img',
            $media . '/js'
        );

        // clean up editor folder
        $folders['2.9.60'] = array(
            JPATH_PLUGINS . '/editors/jce/src/Provider'
        );

        // remove old layout file
        $files['2.9.60'] = array(
            JPATH_PLUGINS . '/editors/jce/layouts/editor/textarea.php'
        );

        // remove pro plugins
        $folders['2.9.70'] = array(
            $site . '/editor/plugins/caption',
            $site . '/editor/plugins/columns',
            $site . '/editor/plugins/iframe',
            $site . '/editor/plugins/imgmanager_ext',
            $site . '/editor/plugins/mediamanager',
            $site . '/editor/plugins/microdata',
            $site . '/editor/plugins/source/tmpl',
            $site . '/editor/plugins/templatemanager',
            $site . '/editor/plugins/textpattern'
        );

        // clean up editor vendor libraries
        $folders['2.9.96'] = array(
            $site . '/editor/libraries/vendor',
            $site . '/editor/libraries/pro'
        );

        // remove jQuery UI Touch
        $files['2.9.96'] = array(
            $media . '/editor/vendor/jquery/js/jquery-ui.touch.min.js'
        );

        // remove MobileDetect
        $folders['2.9.98'] = array(
            $site . '/editor/libraries/classes/vendor/MobileDetect'
        );

        // remove pro source plugin
        $files['2.9.70'] = array(
            $site . '/editor/plugins/source/config.php',
            $site . '/editor/plugins/source/source.php',
            // mediafield files
            JPATH_PLUGINS . '/fields/mediajce/fields/extendedmedia.php'
        );

        $files['2.6.38'] = array(
            $admin . '/install.php',
            $admin . '/install.script.php',
            // controller
            $admin . '/controller/preferences.php',
            $admin . '/controller/popups.php',
            $admin . '/controller/updates.php',
            // helpers
            $admin . '/helpers/cacert.pem',
            $admin . '/helpers/editor.php',
            $admin . '/helpers/toolbar.php',
            $admin . '/helpers/updates.php',
            $admin . '/helpers/xml.php',
            // includes
            $admin . '/includes/loader.php',
            // models
            $admin . '/models/commands.json',
            $admin . '/models/config.xml',
            $admin . '/models/cpanel.xml',
            $admin . '/models/model.php',
            $admin . '/models/plugins.json',
            $admin . '/models/plugins.php',
            $admin . '/models/preferences.php',
            $admin . '/models/preferences.xml',
            $admin . '/models/pro.json',
            $admin . '/models/updates.php',
            $admin . '/models/users.php',
            // views
            $admin . '/views/cpanel/tmpl/default_pro_footer.php',
            $admin . '/views/profiles/tmpl/form_editor.php',
            $admin . '/views/profiles/tmpl/form_features.php',
            $admin . '/views/profiles/tmpl/form_plugin.php',
            $admin . '/views/profiles/tmpl/form_setup.php',
            $admin . '/views/profiles/tmpl/form.php',
            // site - extensions
            $site . '/editor/extensions/aggregator/vine.php',
            $site . '/editor/extensions/aggregator/vine.xml',
            $site . '/editor/extensions/popups/window.php',
            $site . '/editor/extensions/popups/window.xml',
            // site - libraries
            $site . '/editor/libraries/classes/token.php'
        );

        // remove help files
        $files['2.8.6'] = array(
            $admin . '/controller/help.php',
            $admin . '/models/help.php',
        );

        $files['2.8.11'] = array(
            $admin . '/views/cpanel/default_pro.php',
        );

        foreach ($folders as $version => $list) {
            // version check
            if (version_compare($version, $current_version, 'lt')) {
                continue;
            }

            foreach ($list as $folder) {
                if (!@is_dir($folder)) {
                    continue;
                }

                $items = Folder::files($folder, '.', false, true, array(), array());

                foreach ($items as $file) {
                    if (!@unlink($file)) {
                        try {
                            File::delete($file);
                        } catch (Exception $e) {}
                    }
                }

                $items = Folder::folders($folder, '.', false, true, array(), array());

                foreach ($items as $dir) {
                    if (!@rmdir($dir)) {
                        try {
                            Folder::delete($dir);
                        } catch (Exception $e) {}
                    }
                }

                if (!@rmdir($folder)) {
                    try {
                        Folder::delete($folder);
                    } catch (Exception $e) {}
                }
            }
        }

        foreach ($files as $version => $list) {
            // version check
            if (version_compare($version, $current_version, 'lt')) {
                continue;
            }

            foreach ($list as $file) {
                if (!@file_exists($file)) {
                    continue;
                }

                if (@unlink($file)) {
                    continue;
                }

                try {
                    File::delete($file);
                } catch (Exception $e) {}
            }
        }
    }
}
manifests/packages/pkg_jce.xml000060400000003327152453623430012447 0ustar00<?xml version="1.0" encoding="UTF-8" ?>
<extension type="package" version="3.10" method="upgrade">
    <name>PKG_JCE</name>
    <author>Ryan Demmer</author>
    <creationDate>22-04-2026</creationDate>
    <packagename>jce</packagename>
    <version>2.9.99.2</version>
    <url>https://www.joomlacontenteditor.net</url>
    <packager>Widget Factory Limited</packager>
    <packagerurl>https://www.joomlacontenteditor.net</packagerurl>
    <description>PKG_JCE_XML_DESCRIPTION</description>
    <updateservers>
        <server type="extension" priority="1" name="JCE Editor Package">
            <![CDATA[https://cdn.joomlacontenteditor.net/updates/xml/editor/pkg_jce.xml]]>
        </server>
    </updateservers>
    
    <scriptfile>install.pkg.php</scriptfile>
    <files folder="packages">
        <file type="component" id="com_jce">com_jce.zip</file>
        <file type="plugin" id="jce" group="content">plg_content_jce.zip</file>
        <file type="plugin" id="jce" group="editors">plg_editors_jce.zip</file>
        <file type="plugin" id="jce" group="extension">plg_extension_jce.zip</file>
        <file type="plugin" id="jce" group="installer">plg_installer_jce.zip</file>
        <file type="plugin" id="jce" group="quickicon">plg_quickicon_jce.zip</file>
        <file type="plugin" id="jce" group="system">plg_system_jce.zip</file>
        <file type="plugin" id="mediajce" group="fields">plg_fields_mediajce.zip</file>
        
    </files>
    
    <languages folder="language">
        <language tag="en-GB">en-GB/en-GB.pkg_jce.sys.ini</language>
    </languages>

    <variant>core</variant>

    <compatibility>
        <version>3</version>
        <version>4</version>
        <version>5</version>
    </compatibility>

</extension>manifests/packages/akeeba/script.akeeba.php000060400000057107152453623430014764 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
use Joomla\CMS\Factory;
use Joomla\CMS\Filesystem\Folder;

defined('_JEXEC') or die();

class Pkg_AkeebaInstallerScript
{
	/**
	 * The name of our package, e.g. pkg_example. Used for dependency tracking.
	 *
	 * @var  string
	 */
	protected $packageName = 'pkg_akeeba';

	/**
	 * The name of our component, e.g. com_example. Used for dependency tracking.
	 *
	 * @var  string
	 */
	protected $componentName = 'com_akeeba';

	/**
	 * The minimum PHP version required to install this extension
	 *
	 * @var   string
	 */
	protected $minimumPHPVersion = '7.2.0';

	/**
	 * The minimum Joomla! version required to install this extension
	 *
	 * @var   string
	 */
	protected $minimumJoomlaVersion = '3.9.0';

	/**
	 * The maximum Joomla! version this extension can be installed on
	 *
	 * @var   string
	 */
	protected $maximumJoomlaVersion = '4.999.999';

	/**
	 * A list of extensions (modules, plugins) to enable after installation. Each item has four values, in this order:
	 * type (plugin, module, ...), name (of the extension), client (0=site, 1=admin), group (for plugins).
	 *
	 * These extensions are ONLY enabled when you do a clean installation of the package, i.e. it will NOT run on update
	 *
	 * @var array
	 */
	protected $extensionsToEnable = [
		['plugin', 'akeebabackup', 1, 'quickicon'],
	];

	/**
	 * Like above, but enable these extensions on installation OR update. Use this sparingly. It overrides the
	 * preferences of the user. Ideally, this should only be used for installer plugins.
	 *
	 * @var array
	 */
	protected $extensionsToAlwaysEnable = [
		['plugin', 'akeebabackup', 1, 'installer'],
		['plugin', 'akversioncheck', 1, 'system'],
	];

	/**
	 * A list of plugins to uninstall when installing or updating the package. Each item has two values, in this order:
	 * name (element), folder.
	 *
	 * @var array
	 */
	protected $uninstallPlugins = [
		['jsonapi', 'akeebabackup'],
		['legacyapi', 'akeebabackup'],
		['akeebaactionlog', 'system'],
		['akeebaupdatecheck', 'system'],
		['aklazy', 'system'],
		['srp', 'system'],
	];

	/**
	 * We remove some plugins' files. If Joomla fails to update them correctly you'd end up with an inaccessible site.
	 * These will be updated / installed right after the preflight event so you don't ever lose their functionality.
	 *
	 * @var string[]
	 */
	protected $preRemoveFolders = [
		// Current plugins
		'plugins/actionlog/akeebabackup',
		'plugins/console/akeebabackup',
		'plugins/installer/akeebabackup',
		'plugins/quickicon/akeebabackup',
		'plugins/system/backuponupdate',
		// Obsolete plugins
		'plugins/system/akeebaactionlog',
		'plugins/system/akeebaupdatecheck',
		'plugins/system/aklazy',
		'plugins/system/srp',
	];

	/**
	 * =================================================================================================================
	 * DO NOT EDIT BELOW THIS LINE
	 * =================================================================================================================
	 */

	/**
	 * Joomla! pre-flight event. This runs before Joomla! installs or updates the package. This is our last chance to
	 * tell Joomla! if it should abort the installation.
	 *
	 * In here we'll try to install FOF. We have to do that before installing the component since it's using an
	 * installation script extending FOF's InstallScript class. We can't use a <file> tag in the manifest to install FOF
	 * since the FOF installation is expected to fail if a newer version of FOF is already installed on the site.
	 *
	 * @param   string                     $type    Installation type (install, update, discover_install)
	 * @param   \JInstallerAdapterPackage  $parent  Parent object
	 *
	 * @return  boolean  True to let the installation proceed, false to halt the installation
	 */
	public function preflight($type, $parent)
	{
		// Do not run on uninstall.
		if ($type === 'uninstall')
		{
			return true;
		}

		// Check the minimum PHP version
		if (!version_compare(PHP_VERSION, $this->minimumPHPVersion, 'ge'))
		{
			$msg = "<p>You need PHP $this->minimumPHPVersion or later to install this package</p>";
			JLog::add($msg, JLog::WARNING, 'jerror');

			return false;
		}

		// Check the minimum Joomla! version
		if (!version_compare(JVERSION, $this->minimumJoomlaVersion, 'ge'))
		{
			$msg = "<p>You need Joomla! $this->minimumJoomlaVersion or later to install this component</p>";
			JLog::add($msg, JLog::WARNING, 'jerror');

			return false;
		}

		// Check the maximum Joomla! version
		if (!version_compare(JVERSION, $this->maximumJoomlaVersion, 'le'))
		{
			//$msg = "<p>You need Joomla! $this->maximumJoomlaVersion or earlier to install this component</p>";

			$hasOldVersion = \Joomla\CMS\Component\ComponentHelper::isInstalled('com_akeeba');
			$jVersion = JVERSION;

			if ($hasOldVersion)
			{
				$upgradeMessage = <<< HTML
<p class="fs-2">
	Please go to <a href="index.php?option=com_akeeba">Components, Akeeba Backup</a> to learn how to install
	Akeeba Backup 9 — the Joomla 4 native version of our software — and migrate your backup settings and backup
	archives with a single click. 
</p>
HTML;
			}
			else
			{
				$upgradeMessage = <<< HTML
<p class="fs-2">
	Please go to <a href="https://www.akeeba.com/download.html">our site's Download page</a> to download
	Akeeba Backup 9, the Joomla 4 native version of our software.
</p>

HTML;
			}

			$msg = <<< HTML
<div class="m-4">
	<h3 class="alert-heading fs-1">Akeeba Backup 8 cannot be installed or used with Joomla 4.1 and later versions</h3>
	$upgradeMessage
	<p class="fs-5">
		<strong>Note:</strong> You will see the messages “Extension Install: Custom install routine failure.”
		 and “Error installing package” printed below. This is normal and expected. Since Akeeba Backup 8 is not
		 meant to be used with Joomla $jVersion it refuses to install at all and Joomla produces these two messages.
	</p>
</div>
HTML;

			JLog::add($msg, JLog::WARNING, 'jerror');

			return false;
		}

		// HHVM made sense in 2013, now PHP 7 is a way better solution than an hybrid PHP interpreter
		if (defined('HHVM_VERSION'))
		{
			$msg = "<p>We have detected that you are running HHVM instead of PHP. This software WILL NOT WORK properly on HHVM. Please switch to PHP 7 instead.</p>";
			JLog::add($msg, JLog::WARNING, 'jerror');

			return false;
		}

		/**
		 * Try to install FOF. We need to do this in preflight to make sure that FOF is available when we install our
		 * component. The reason being that the component's installation script extends FOF's InstallScript class.
		 * We can't use a <file> tag in our package manifest because FOF's package is *supposed* to fail to install if
		 * a newer version is already installed. This would unfortunately cancel the installation of the entire package,
		 * so we have to get a bit tricky.
		 */
		$this->installOrUpdateFOF($parent);

		// Remove plugins' files which load outside of the component. If any is not fully updated your site won't crash.
		foreach ($this->preRemoveFolders as $folder)
		{
			$f = JPATH_ROOT . '/' . $folder;

			if (!@file_exists($f) || !is_dir($f) || is_link($f))
			{
				continue;
			}

			Folder::delete($f);
		}

		return true;
	}

	/**
	 * Runs after install, update or discover_update. In other words, it executes after Joomla! has finished installing
	 * or updating your component. This is the last chance you've got to perform any additional installations, clean-up,
	 * database updates and similar housekeeping functions.
	 *
	 * @param   string                       $type   install, update or discover_update
	 * @param   \JInstallerAdapterComponent  $parent Parent object
	 */
	public function postflight($type, $parent)
	{
		// Do not run on uninstall.
		if ($type === 'uninstall')
		{
			return;
		}

		// Always uninstall these plugins
		if (isset($this->uninstallPlugins) && !empty($this->uninstallPlugins))
		{
			foreach ($this->uninstallPlugins as $pluginInfo)
			{
				try
				{
					$this->uninstallPlugin($pluginInfo[1], $pluginInfo[0]);
				}
				catch (Exception $e)
				{
					// No op.
				}
			}
		}

		// Joomla 3: Always uninstall plg_console_akeebabackup (it's J4 only)
		if (version_compare(JVERSION, '3.999.999', 'le'))
		{
			$this->uninstallPlugin('console', 'akeebabackup');
			// These dependencies are not removed when uninstalling a plugin while installing a package (thanks, Joomla)
			$this->removeDependency('fof30', 'plg_console_akeebabackup');
			$this->removeDependency('fof40', 'plg_console_akeebabackup');
		}

		// Always enable these extensions
		if (isset($this->extensionsToAlwaysEnable) && !empty($this->extensionsToAlwaysEnable))
		{
			$this->enableExtensions($this->extensionsToAlwaysEnable);
		}

		// Joomla 4: Always enable the plg_console_akeebabackup plugin
		if (version_compare(JVERSION, '3.999.999', 'gt'))
		{
			$this->enableExtensions([
				['plugin', 'akeebabackup', 1, 'console'],
			]);
		}

		/**
		 * Try to install FEF. We only need to do this in postflight. A failure, while detrimental to the display of the
		 * extension, is non-fatal to the installation and can be rectified by manual installation of the FEF package.
		 * We can't use a <file> tag in our package manifest because FEF's package is *supposed* to fail to install if
		 * a newer version is already installed. This would unfortunately cancel the installation of the entire package,
		 * so we have to get a bit tricky.
		 */
		$this->installOrUpdateFEF($parent);

		/**
		 * Clean the cache after installing the package.
		 *
		 * See bug report https://github.com/joomla/joomla-cms/issues/16147
		 */
		$conf = \JFactory::getConfig();
		$clearGroups = array('_system', 'com_modules', 'mod_menu', 'com_plugins', 'com_modules');
		$cacheClients = array(0, 1);

		foreach ($clearGroups as $group)
		{
			foreach ($cacheClients as $client_id)
			{
				try
				{
					$options = array(
						'defaultgroup' => $group,
						'cachebase' => ($client_id) ? JPATH_ADMINISTRATOR . '/cache' : $conf->get('cache_path', JPATH_SITE . '/cache')
					);

					/** @var JCache $cache */
					$cache = \JCache::getInstance('callback', $options);
					$cache->clean();
				}
				catch (Exception $exception)
				{
					$options['result'] = false;
				}

				// Trigger the onContentCleanCache event.
				try
				{
					JFactory::getApplication()->triggerEvent('onContentCleanCache', $options);
				}
				catch (Exception $e)
				{
					// Suck it up
				}
			}
		}
	}

	/**
	 * Runs on installation (but not on upgrade). This happens in install and discover_install installation routes.
	 *
	 * @param   \JInstallerAdapterPackage  $parent  Parent object
	 *
	 * @return  bool
	 */
	public function install($parent)
	{
		// Enable the extensions we need to install
		$this->enableExtensions();

		return true;
	}

	/**
	 * Runs on uninstallation
	 *
	 * @param   \JInstallerAdapterPackage  $parent  Parent object
	 *
	 * @return  bool
	 */
	public function uninstall($parent)
	{
		// Preload FOF classes required for the InstallScript. This is required since we'll be trying to uninstall FOF
		// before uninstalling the component itself. The component has an uninstallation script which uses FOF, so...
		@include_once(JPATH_LIBRARIES . '/fof40/include.php');
		class_exists('FOF40\\Utils\\InstallScript\\BaseInstaller', true);
		class_exists('FOF40\\Utils\\InstallScript\\Component', true);
		class_exists('FOF40\\Utils\\InstallScript\\Module', true);
		class_exists('FOF40\\Utils\\InstallScript\\Plugin', true);
		class_exists('FOF40\\Utils\\InstallScript', true);
		class_exists('FOF40\\Database\\Installer', true);

		/**
		 * uninstall() is called before the component is uninstalled. Therefore there is a dependency to FOF 4 which
		 * prevents FOF 4 from being removed at this point. Therefore we have to remove the dependency before removing
		 * the component and hope nothing goes wrong.
		 */
		$this->removeDependency('fof40', $this->componentName);

		/**
		 * uninstall() is called before the component is uninstalled. Therefore there is a dependency to FEF which
		 * prevents FEF from being removed at this point. Therefore we have to remove the dependency before removing
		 * the component and hope nothing goes wrong.
		 */
		$this->removeDependency('file_fef', $this->componentName);

		// The try to uninstall FEF. The uninstallation might fail if there are other extensions depending
		// on it. That would cause the entire package uninstallation to fail, hence the need for special handling.
		$this->uninstallFEF($parent);

		// Then try to uninstall the FOF library. The uninstallation might fail if there are other extensions depending
		// on it. That would cause the entire package uninstallation to fail, hence the need for special handling.
		$this->uninstallFOF($parent);

		return true;
	}

	/**
	 * Tries to install or update FOF. The FOF library package installation can fail if there's a newer version
	 * installed. In this case we raise no error. If, however, the FOF library package installation failed AND we can
	 * not load FOF then we raise an error: this means that FOF installation really failed (e.g. unwritable folder) and
	 * we can't install this package.
	 *
	 * @param   \JInstallerAdapterPackage  $parent
	 */
	private function installOrUpdateFOF($parent)
	{
		// Get the path to the FOF package
		$sourcePath = $parent->getParent()->getPath('source');
		$sourcePackage = $sourcePath . '/lib_fof40.zip';

		// Extract and install the package
		$package = JInstallerHelper::unpack($sourcePackage);
		$tmpInstaller  = new JInstaller;
		$error = null;

		try
		{
			$installResult = $tmpInstaller->install($package['dir']);
		}
		catch (\Exception $e)
		{
			$installResult = false;
			$error = $e->getMessage();
		}

		// Try to include FOF. If that fails then the FOF package isn't installed because its installation failed, not
		// because we had a newer version already installed. As a result we have to abort the entire package's
		// installation.
		if (!defined('FOF40_INCLUDED') && !@include_once(JPATH_LIBRARIES . '/fof40/include.php'))
		{
			if (empty($error))
			{
				$error = JText::sprintf(
					'JLIB_INSTALLER_ABORT_PACK_INSTALL_ERROR_EXTENSION',
					JText::_('JLIB_INSTALLER_' . strtoupper($parent->get('route'))),
					basename($sourcePackage)
				);
			}

			throw new RuntimeException($error);
		}
	}

	/**
	 * Try to uninstall the FOF library. We don't go through the Joomla! package uninstallation since we can expect the
	 * uninstallation of the FOF library to fail if other software depends on it.
	 *
	 * @param   JInstallerAdapterPackage  $parent
	 */
	private function uninstallFOF($parent)
	{
		// Check dependencies on FOF
		$dependencyCount = count($this->getDependencies('fof40'));

		if ($dependencyCount)
		{
			$msg = "<p>You have $dependencyCount extension(s) depending on this version of FOF. The package cannot be uninstalled unless these extensions are uninstalled first.</p>";

			JLog::add($msg, JLog::WARNING, 'jerror');

			return;
		}

		$tmpInstaller = new JInstaller;

		$db = $parent->getParent()->getDbo();

		$query = $db->getQuery(true)
		            ->select('extension_id')
		            ->from('#__extensions')
		            ->where('type = ' . $db->quote('library'))
		            ->where('element = ' . $db->quote('lib_fof40'));

		$db->setQuery($query);
		$id = $db->loadResult();

		if (!$id)
		{
			return;
		}

		try
		{
			$tmpInstaller->uninstall('library', $id, 0);
		}
		catch (\Exception $e)
		{
			// We can expect the uninstallation to fail if there are other extensions depending on the FOF library.
		}
	}

	/**
	 * Tries to install or update FEF. The FEF files package installation can fail if there's a newer version
	 * installed.
	 *
	 * @param   \JInstallerAdapterPackage  $parent
	 */
	private function installOrUpdateFEF($parent)
	{
		// Get the path to the FOF package
		$sourcePath = $parent->getParent()->getPath('source');
		$sourcePackage = $sourcePath . '/file_fef.zip';

		// Extract and install the package
		$package = JInstallerHelper::unpack($sourcePackage);
		$tmpInstaller  = new JInstaller;
		$error = null;

		try
		{
			$installResult = $tmpInstaller->install($package['dir']);
		}
		catch (\Exception $e)
		{
			$installResult = false;
			$error = $e->getMessage();
		}
	}

	/**
	 * Try to uninstall the FEF package. We don't go through the Joomla! package uninstallation since we can expect the
	 * uninstallation of the FEF library to fail if other software depends on it.
	 *
	 * @param   JInstallerAdapterPackage  $parent
	 */
	private function uninstallFEF($parent)
	{
		// Check dependencies on FOF
		$dependencyCount = count($this->getDependencies('file_fef'));

		if ($dependencyCount)
		{
			$msg = "<p>You have $dependencyCount extension(s) depending on this version of Akeeba FEF. The package cannot be uninstalled unless these extensions are uninstalled first.</p>";

			JLog::add($msg, JLog::WARNING, 'jerror');

			return;
		}

		$tmpInstaller = new JInstaller;

		$db = $parent->getParent()->getDbo();

		$query = $db->getQuery(true)
			->select('extension_id')
			->from('#__extensions')
			->where('type = ' . $db->quote('file'))
			->where('element = ' . $db->quote('file_fef'));

		$db->setQuery($query);
		$id = $db->loadResult();

		if (!$id)
		{
			return;
		}

		try
		{
			$tmpInstaller->uninstall('file', $id, 0);
		}
		catch (\Exception $e)
		{
			// We can expect the uninstallation to fail if there are other extensions depending on the FOF library.
		}
	}


	/**
	 * Enable modules and plugins after installing them
	 */
	private function enableExtensions($extensions = [])
	{
		if (empty($extensions))
		{
			$extensions = $this->extensionsToEnable;
		}

		foreach ($extensions as $ext)
		{
			$this->enableExtension($ext[0], $ext[1], $ext[2], $ext[3]);
		}
	}

	/**
	 * Enable an extension
	 *
	 * @param   string   $type    The extension type.
	 * @param   string   $name    The name of the extension (the element field).
	 * @param   integer  $client  The application id (0: Joomla CMS site; 1: Joomla CMS administrator).
	 * @param   string   $group   The extension group (for plugins).
	 */
	private function enableExtension($type, $name, $client = 1, $group = null)
	{
		try
		{
			$db    = JFactory::getDbo();
			$query = $db->getQuery(true)
			            ->update('#__extensions')
			            ->set($db->qn('enabled') . ' = ' . $db->q(1))
			            ->where('type = ' . $db->quote($type))
			            ->where('element = ' . $db->quote($name));
		}
		catch (\Exception $e)
		{
			return;
		}


		switch ($type)
		{
			case 'plugin':
				// Plugins have a folder but not a client
				$query->where('folder = ' . $db->quote($group));
				break;

			case 'language':
			case 'module':
			case 'template':
				// Languages, modules and templates have a client but not a folder
				$client = JApplicationHelper::getClientInfo($client, true);
				$query->where('client_id = ' . (int) $client->id);
				break;

			default:
			case 'library':
			case 'package':
			case 'component':
				// Components, packages and libraries don't have a folder or client.
				// Included for completeness.
				break;
		}

		try
		{
			$db->setQuery($query);
			$db->execute();
		}
		catch (\Exception $e)
		{
		}
	}

	/**
	 * Get the dependencies for a package from the #__akeeba_common table
	 *
	 * @param   string  $package  The package
	 *
	 * @return  array  The dependencies
	 */
	private function getDependencies($package)
	{
		$db = JFactory::getDbo();

		$query = $db->getQuery(true)
		            ->select($db->qn('value'))
		            ->from($db->qn('#__akeeba_common'))
		            ->where($db->qn('key') . ' = ' . $db->q($package));

		try
		{
			$dependencies = $db->setQuery($query)->loadResult();
			$dependencies = json_decode($dependencies, true);

			if (empty($dependencies))
			{
				$dependencies = array();
			}
		}
		catch (Exception $e)
		{
			$dependencies = array();
		}

		return $dependencies;
	}

	/**
	 * Sets the dependencies for a package into the #__akeeba_common table
	 *
	 * @param   string  $package       The package
	 * @param   array   $dependencies  The dependencies list
	 */
	private function setDependencies($package, array $dependencies)
	{
		$db = JFactory::getDbo();

		$query = $db->getQuery(true)
		            ->delete('#__akeeba_common')
		            ->where($db->qn('key') . ' = ' . $db->q($package));

		try
		{
			$db->setQuery($query)->execute();
		}
		catch (Exception $e)
		{
			// Do nothing if the old key wasn't found
		}

		$object = (object)array(
			'key' => $package,
			'value' => json_encode($dependencies)
		);

		try
		{
			$db->insertObject('#__akeeba_common', $object, 'key');
		}
		catch (Exception $e)
		{
			// Do nothing if the old key wasn't found
		}
	}

	/**
	 * Adds a package dependency to #__akeeba_common
	 *
	 * @param   string  $package     The package
	 * @param   string  $dependency  The dependency to add
	 */
	private function addDependency($package, $dependency)
	{
		$dependencies = $this->getDependencies($package);

		if (!in_array($dependency, $dependencies))
		{
			$dependencies[] = $dependency;

			$this->setDependencies($package, $dependencies);
		}
	}

	/**
	 * Removes a package dependency from #__akeeba_common
	 *
	 * @param   string  $package     The package
	 * @param   string  $dependency  The dependency to remove
	 */
	private function removeDependency($package, $dependency)
	{
		$dependencies = $this->getDependencies($package);

		if (in_array($dependency, $dependencies))
		{
			$index = array_search($dependency, $dependencies);
			unset($dependencies[$index]);

			$this->setDependencies($package, $dependencies);
		}
	}

	/**
	 * Do I have a dependency for a package in #__akeeba_common
	 *
	 * @param   string  $package     The package
	 * @param   string  $dependency  The dependency to check for
	 *
	 * @return bool
	 */
	private function hasDependency($package, $dependency)
	{
		$dependencies = $this->getDependencies($package);

		return in_array($dependency, $dependencies);
	}

	private function uninstallPlugin($folder, $element)
	{
		$db = Factory::getDbo();

		// Does the plugin exist?
		$query = $db->getQuery(true)
			->select('*')
			->from('#__extensions')
			->where($db->qn('type') . ' = ' . $db->q('plugin'))
			->where($db->qn('folder') . ' = ' . $db->q($folder))
			->where($db->qn('element') . ' = ' . $db->q($element));
		try
		{
			$result = $db->setQuery($query)->loadAssoc();

			if (empty($result))
			{
				return;
			}

			$eid = $result['extension_id'];
		}
		catch (Exception $e)
		{
			return;
		}

		/**
		 * Here's a bummer. If you try to uninstall a plugin Joomla throws a nonsensical error message about the
		 * plugin's XML manifest missing -- after it has already uninstalled the plugin! This error causes the package
		 * installation to fail which results in the extension being installed BUT the database record of the package
		 * NOT being present which makes it impossible to uninstall.
		 *
		 * So I have to hack my way around it which is ugly but the only viable alternative :(
		 */
		try
		{
			// Safely delete the row in the extensions table
			$row = JTable::getInstance('extension');
			$row->load((int) $eid);
			$row->delete($eid);

			// Delete the plugin's files
			$pluginPath = sprintf("%s/%s/%s", JPATH_PLUGINS, $folder, $element);

			if (is_dir($pluginPath))
			{
				JFolder::delete($pluginPath);
			}

			// Delete the plugin's language files
			$langFiles = [
				sprintf("%s/language/en-GB/en-GB.plg_%s_%s.ini", JPATH_ADMINISTRATOR, $folder, $element),
				sprintf("%s/language/en-GB/en-GB.plg_%s_%s.sys.ini", JPATH_ADMINISTRATOR, $folder, $element),
			];

			foreach ($langFiles as $file)
			{
				if (@is_file($file))
				{
					JFile::delete($file);
				}
			}
		}
		catch (Exception $e)
		{
			// I tried, I failed. Dear user, do NOT try to enable that old plugin. Bye!
		}
	}
}
manifests/packages/pkg_xmap.xml000060400000003707152453623430012655 0ustar00<?xml version="1.0" encoding="UTF-8" ?>
<extension type="package" version="2.5">
    <name>Xmap Package</name>
    <packagename>xmap</packagename>
    <version>2.3.4</version>
    <url>http://www.jooxmap.com</url>
    <packager>Joomla! Vargas</packager>
    <packagerurl>http://www.jooxmap.com</packagerurl>
    <description><![CDATA[
		<h3>Xmap - Générateur de plans de site pour Joomla!</h3>
		<p>Xmap vous permet de générer des plans du site à consulter (HTML) et, des plans du site pour les moteurs de recherche (XML) afin d'améliorer le référencement.</p>
		<p>Ce pack Xmap FR installe deux plug-ins supplémentaires entièrement traduits en français pour la prise en charge des articles et des liens du composant natif de Joomla!<p>
		<p>Une série de plug-ins complémentaires en français sont disponibles dans ce pack mais doivent être extraits et installés séparément.<br />Note : vous ne devez les installer qu'après avoir installé l'extension correspondante, sinon vous perdez le raccourci du menu "Extensions" <span style='font-weight:normal;'>(Merci à Patrick Jollant et Nicolas Claverie pour leur participation).</span><br />
		Pour utiliser les plug-ins, vous devez les configurer et les publier dans la <a href="index.php?option=com_plugins&amp;filter_type=system&amp;filter_search=Xmap"><u>gestion des plugins de Joomla!</u></a></p><span style='font-weight:normal;'>
		<p>Auteurs : Guillermo Vargas and Jesus Vargas - <a href="http://joomla.vargas.co.cr" target="_blank">http://joomla.vargas.co.cr</a><br />
		Traduction FR : Mihàly Marti alias Sarki pour <a href="http://www.joomlatutos.com" target="_blank">www.joomlatutos.com</a></p></span>
	]]></description>
    <files folder="packages">
        <file type="component" id="com_xmap">com_xmap.zip</file>
        <file type="plugin" id="com_content" group="xmap">plg_com_content.zip</file>
        <file type="plugin" id="com_weblinks" group="xmap">plg_com_weblinks.zip</file>
    </files>
</extension>
manifests/packages/pkg_mailjet.xml000060400000002200152453623430013320 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="package" version="3.1">
    <name>Mailjet Email Marketing</name>
    <author>Mailjet SAS</author>
    <authorUrl>http://www.mailjet.com</authorUrl>
    <authorEmail>plugins@mailjet.com</authorEmail>
    <creationDate>June 2014</creationDate>
    <url>http://www.mailjet.com/</url>
    <version>3.1.8</version>
    <packagename>mailjet</packagename>
    <packager>Mailjet SAS</packager>
    <packagerurl>http://www.mailjet.com/</packagerurl>
    <copyright>Copyright (C) 2014 Mailjet SAS.</copyright>
    <license>GNU General Public License version 2 or later; see LICENSE</license>
    <description><![CDATA[
        <img style='float:left' src='https://fr.mailjet.com/images/theme/v1/logos/head_logo_small.png' border='0'>
        <b>Mailjet</b> puts your e-mail delivery and traceability at ease. Simply send, we take care of the rest.
        ]]></description>
    <update></update>
    <files folder="packages">
        <file type="component" id="com_mailjet" >com_mailjet.zip</file>
        <file type="module" id="mod_mailjet" client="site">mod_mailjet.zip</file>
    </files>
</extension>
manifests/packages/pkg_en-GB.xml000060400000002145152453623430012573 0ustar00<?xml version="1.0" encoding="UTF-8" ?>
<extension type="package" version="3.9" method="upgrade">
	<name>English (en-GB) Language Pack</name>
	<packagename>en-GB</packagename>
	<version>3.10.12.1</version>
	<creationDate>July 2023</creationDate>
	<author>Joomla! Project</author>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<copyright>(C) 2019 Open Source Matters, Inc.</copyright>
	<license>https://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>
	<url>https://github.com/joomla/joomla-cms</url>
	<packager>Joomla! Project</packager>
	<packagerurl>www.joomla.org</packagerurl>
	<description><![CDATA[en-GB language pack]]></description>
	<blockChildUninstall>true</blockChildUninstall>
	<files>
		<folder type="language" client="site" id="en-GB">language/en-GB</folder>
		<folder type="language" client="administrator" id="en-GB">administrator/language/en-GB</folder>
	</files>
	<updateservers>
		<server type="collection" priority="1" name="Accredited Joomla! Translations">
			https://update.joomla.org/language/translationlist_3.xml
		</server>
	</updateservers>
</extension>
manifests/packages/pkg_akeeba.xml000060400000004002152453623430013105 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->

<extension version="3.9.0" type="package" method="upgrade">
    <name>Akeeba Backup package</name>
    <author>Nicholas K. Dionysopoulos</author>
    <creationDate>2025-05-09</creationDate>
    <packagename>akeeba</packagename>
    <version>8.4.1</version>
    <url>https://www.akeeba.com</url>
    <packager>Akeeba Ltd</packager>
    <packagerurl>https://www.akeeba.com</packagerurl>
    <copyright>Copyright (c)2006-2019 Akeeba Ltd / Nicholas K. Dionysopoulos</copyright>
    <license>GNU GPL v3 or later</license>
    <description>Akeeba Backup installation package v.8.4.1</description>

    <!-- List of extensions to install -->
    <files>
        <!-- Component -->
        <file type="component" id="com_akeeba">com_akeeba-core.zip</file>

        <!-- Modules -->
        <!--<file type="module" client="site" id="mod_example">mod_example.zip</file>-->

        <!-- Plugins: console (Joomla 4 only) -->
        <file type="plugin" group="console" id="akeebabackup">plg_console_akeebabackup.zip</file>

        <!-- Plugins: quickicon -->
        <file type="plugin" group="quickicon" id="akeebabackup">plg_quickicon_akeebabackup.zip</file>

        <!-- Plugins: system -->
        <file type="plugin" group="system" id="backuponupdate">plg_system_backuponupdate.zip</file>
        <file type="plugin" group="system" id="akversioncheck">plg_system_akversioncheck.zip</file>

        <!-- Plugins: actionlog -->
        <file type="plugin" group="actionlog" id="akeebabackup">plg_actionlog_akeebabackup.zip</file>
    </files>

    <!-- Installation script -->
    <scriptfile>script.akeeba.php</scriptfile>

    <!-- Update servers -->
    <updateservers>
        <server type="extension" priority="1" name="Akeeba Backup Core">https://cdn.akeeba.com/updates/pkgakeebacore.xml</server>
    </updateservers>
</extension>
manifests/packages/pkg_fr-FR.xml000060400000002401152453623430012612 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<extension type="package" version="3.10" method="upgrade">
	<name>French (fr-FR) Language pack</name>
	<packagename>fr-FR</packagename>
	<version>3.10.12.1</version>
	<creationDate>2023-07-11</creationDate>
	<author>French translation team : joomla.fr</author>
	<authorEmail>traduction@joomla.fr</authorEmail>
	<authorUrl>http://joomla.fr</authorUrl>
	<copyright>Copyright (C) 2005 - 2022 Joomla.fr and Open Source Matters, Inc. All rights reserved.</copyright>
	<license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>
	<url></url>
	<packager></packager>
	<packagerurl></packagerurl>
	<description><![CDATA[<div style="text-align:left;">
<h3>Joomla! Full French (fr-FR) Language Package - Version 3.10.12.1</h3>
<h3>Paquet de langue Joomla! français (fr-FR) complet - Version 3.10.12.1</h3>
</div>]]></description>
	<blockChildUninstall>true</blockChildUninstall>
	<files>
		<file type="language" client="site" id="fr-FR">site_fr-FR.zip</file>
		<file type="language" client="administrator" id="fr-FR">admin_fr-FR.zip</file>
	</files>
	<updateservers>
		<server type="collection" priority="1" name="Accredited Joomla! Translations">https://update.joomla.org/language/translationlist_3.xml</server>
	</updateservers>
</extension>
manifests/packages/index.html000060400000000037152453623430012313 0ustar00<!DOCTYPE html><title></title>
templates/hathor/LICENSE.txt000060400000042630152453623430011662 0ustar00GNU GENERAL PUBLIC LICENSE
				Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
 59 Temple Place, Suite 330, Boston, MA  02111-1307  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 Library 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.

	<one line to give the program's name and a brief idea of what it does.>
	Copyright (C) <year>  <name of author>

	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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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.

  <signature of Ty Coon>, 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 Library General
Public License instead of this License.
templates/hathor/less/buttons.less000060400000004215152453623430013370 0ustar00//
// Buttons
// This is a custom version of Bootstrap's buttons.less file suited for Hathor's needs
// --------------------------------------------------


// Base styles
// --------------------------------------------------

// Core
#form-login .btn {
  display: inline-block;
  .ie7-inline-block();
  padding: 4px 14px;
  margin-bottom: 0; // For input.btn
  font-size: @baseFontSize;
  line-height: @baseLineHeight;
  *line-height: @baseLineHeight;
  text-align: center;
  vertical-align: middle;
  cursor: pointer;
  .buttonBackground(@btnBackground, @btnBackgroundHighlight, @grayDark, 0 1px 1px rgba(255,255,255,.75));
  border: 1px solid @btnBorder;
  *border: 0; // Remove the border to prevent IE7's black border on input:focus
  border-bottom-color: darken(@btnBorder, 10%);
  .border-radius(4px);
  .ie7-restore-left-whitespace(); // Give IE7 some love
  .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)");

  // Hover state
  &:hover {
    color: @grayDark;
    text-decoration: none;
    background-color: darken(@white, 10%);
    *background-color: darken(@white, 15%); /* Buttons in IE7 don't get borders, so darken on hover */
    background-position: 0 -15px;

    // transition is only when going to hover, otherwise the background
    // behind the gradient (there for IE<=9 fallback) gets mismatched
    .transition(background-position .1s linear);
  }

  // Focus state for keyboard and accessibility
  &:focus {
    .tab-focus();
  }

  // Active state
  &.active,
  &:active {
    background-color: darken(@white, 10%);
    background-color: darken(@white, 15%) e("\9");
    background-image: none;
    outline: 0;
    .box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)");
  }

  // Disabled state
  &.disabled,
  &[disabled] {
    cursor: default;
    background-color: darken(@white, 10%);
    background-image: none;
    .opacity(65);
    .box-shadow(none);
  }

}

// Button Sizes
// --------------------------------------------------

// Large
.btn-large {
  padding: 9px 14px;
  font-size: @baseFontSize + 2px;
  line-height: normal;
  .border-radius(5px);
}
.btn-large [class^="icon-"] {
  margin-top: 2px;
}
templates/hathor/less/colour_brown.less000060400000002425152453623430014405 0ustar00// colour_brown.less
//
// Less to compile Hathor in the brown colour scheme
// -----------------------------------------------------

/**
 * #2c2c2c	Text
 * #054993	Links
 * #ffffff	Background, border, text
 * #d5c1b2	Background alternate, button/icon/menu background
 * #d5c1b2-d5c1b2 Gradient Background
 * #e5f0fa	Background (input required)
 * #e1d3c8	Background Hover, Top/Left icon borders
 * #000000	Main borders
 * #000000	Top/Left hover borders
 * #000000	Right/Bottom hover borders
 *
 * Special Use Colors:
 * #a20000	Text Error, border invalid
 * #cccccc	Text (faded)
 * #005800	Text (success)
 * #eeeeee	Background (input disabled)
 * #ffffcf	Background permissions debug
 * #cfffda	Background permissions debug
 * #ffcfcf	Background permissions debug
 */

// Import the variables file first to get common variables loaded
@import "hathor_variables.less";

// Define variables unique to this colour scheme, as well as override variables already defined in the common file
@altBackground:      #d5c1b2;
@gradientTop:        #d5c1b2;
@gradientBottom:     #d5c1b2;
@mainBorder:         #000000;
@toolbarColor:       #054993;
@hoverBackground:    #e5d9c3;
@nwBorder:           #868778;
@seBorder:           #f6f7db;

// Import the baseline to compile the CSS
@import "colour_baseline.less";
templates/hathor/less/colour_blue.less000060400000002233152453623430014202 0ustar00// colour_blue.less
//
// Less to compile Hathor in the blue colour scheme
// -----------------------------------------------------

/**
 * #2c2c2c	Text
 * #054993	Links
 * #ffffff	Background, border, text
 * #c3d2e5	Background alternate, button/icon/menu background
 * #a5bbd4-c3d2e5 Gradient Background
 * #e5f0fa	Background (input required)
 * #e5d9c3	Background Hover, Top/Left icon borders
 * #738498	Main borders
 * #868778	Top/Left hover borders
 * #f6f7db	Right/Bottom hover borders
 *
 * Special Use Colors:
 * #a20000	Text Error, border invalid
 * #cccccc	Text (faded)
 * #005800	Text (success)
 * #eeeeee	Background (input disabled)
 * #ffffcf	Background permissions debug
 * #cfffda	Background permissions debug
 * #ffcfcf	Background permissions debug
 */

// Import the variables file first to get common variables loaded
@import "hathor_variables.less";

// Define variables unique to this colour scheme, as well as override variables already defined in the common file
@altBackground:      #c3d2e5;
@gradientTop:        #a5bbd4;
@gradientBottom:     #c3d2e5;
@mainBorder:         #738498;

// Import the baseline to compile the CSS
@import "colour_baseline.less";
templates/hathor/less/template.less000060400000153111152453623430013505 0ustar00// Import the variables file first to get common variables loaded
@import "hathor_variables.less";

// Core variables and mixins
@import "../../../../media/jui/less/mixins.less";

// Bootstrap Component Animations
@import "../../../../media/jui/less/component-animations.less";

// Bootstrap Modals
@import "modals.less";
//@import "../../../../media/jui/less/modals.joomla.less";

// Bootstrap Popovers
@import "../../../../media/jui/less/popovers.less";

// Icon Font
@import "icomoon.less";

/**
 * CSS Reset
 */
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
	margin: 0;
	padding: 0;
	border: 0;
	font-size: 100%;
	background: transparent;
}

blockquote, q {
	quotes: none;
}

blockquote:before, blockquote:after,
q:before, q:after {
	content: '';
	content: none;
}

del {
	text-decoration: line-through;
}

/**
 * General styles
 */
html {
	overflow-y: scroll;
	height: 100%;
}

body {
	margin: 0;
	padding: 0;
	font-size: 62.5%;
	line-height: 1.5em;
	height: 100%;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

body, td, th, span, a {
	font-family: Arial, Helvetica, sans-serif;
}

html, body {
	height: 100%;
}

a, img {
	padding: 0;
	margin: 0;
}

img {
	border: 0 none;
}

form {
	margin: 0;
	padding: 0;
}

ul {
	padding: 0;
	margin: 0;
}

h1 {
	margin: 0;
	padding-bottom: 8px;
	font-size: 1.4em;
	font-weight: bold;
	line-height: 2em;
}

h2 {
	padding-top: .83em;
	padding-bottom: .83em;
}

h3 {
	font-size: 1.4em;
}

a:link {
	color: #054993;
	text-decoration: none;
}

a:visited {
	color: #054993;
	text-decoration: none;
}

a:hover {
	text-decoration: underline;
}

a:focus {
	text-decoration: underline;
}

iframe {
	border: 0;
}

/* new styles */

.enabled {
	color: #005800;
	font-weight: bold;
}

.disabled {
	color: #a20000;
	font-weight: bold;
}

p.error {
	color: #a20000;
	font-weight: bold;
}

.warning {
	color: #a20000;
	font-weight: bold;
}

.nowarning {
	color: #2c2c2c;
	font-weight: bold;
}

.success {
	color: #005800;
	font-weight: bold;
}

.allow {
	color: #005800;
}

span.writable {
	color: #005800;
}

.deny {
	color: #a20000;
}

span.unwritable {
	color: #a20000;
}

.none {
	color: #aaaaaa;
}

.pointer {
	cursor: pointer;
}

.nowrap {
	white-space: nowrap;
}

p.nowarning, p.warning {
	margin: 10px;
}

/* end new styles */

/**
 * Overall Styles
 */
#minwidth, #minwidth-body {
	min-width: 980px;
}

#containerwrap {
	position: relative;
}

#header {
	position: relative;
}

#header h1.title {
	font-size: 1.5em;
	font-weight: normal;
	line-height: 25px;
	margin: 0;
	padding: 0 0 0 120px;
}

#footer {
	padding: 10px 20px;
}

#footer .copyright {
	margin: 0 0 0 0;
	text-align: center;
}

#footer p {
	font-size: 1.2em;
}

#nav .no-nav {
	line-height: 2em;
}

#content {
	margin: 5px 20px 20px 20px;
}

.cpanel-page div#element-box {
	padding: 15px;
}

/**
 * Status layout
 */
#module-status {
	float: right;
	position: relative;
	top: -48px;
}

#module-status div.btn-group {
	display: block;
	float: left;
	padding: 4px 10px 0 10px;
	font-size: 1.2em;
}

#module-status div.divider {
	display: none;
}

#module-status .unread-messages a {
	font-weight: bold;
}

.title-ua {
	position: relative;
	width: 60%;
}

/**
 * Various Styles
 */
.enabled,
.disabled,
p.error,
.warning,
.nowarning,
.success {
	font-weight: bold;
}

.pointer {
	cursor: pointer;
}

.nowrap {
	white-space: nowrap;
}

span.note {
	display: block;
	padding: 5px;
}

div.checkin-tick {
	text-indent: -9999px;
}

/**
 * Overlib
 */
.ol-textfont {
	font-family: Arial, Helvetica, sans-serif;
	font-size: 1.2em;
}

.ol-captionfont {
	font-family: Arial, Helvetica, sans-serif;
	font-size: 1.2em;
	font-weight: bold;
}

.ol-captionfont a {
	text-decoration: none;
}

/**
 * Subheader, toolbar, page title
 */
div.subheader .padding {
	padding: 0;
}

div.pagetitle {
	padding: 0 0 5px 5px;
	margin: 0;
	background-repeat: no-repeat;
	background-position: left 50%;
	line-height: 54px;
	width: 100%;
	margin-top: -20px;
	height: 60px;
}

.tabs-left > .nav-tabs {
	float: left;
	margin-right: 19px;
	border-right: 1px solid #DDD;
}

tabs-below > .nav-tabs, .tabs-right > .nav-tabs, .tabs-left > .nav-tabs {
	border-bottom: 0;
}

/* Tabbed Content */
.tab-content {
	overflow: visible;
}

.tabs-left .tab-content {
	overflow: auto;
}

/* Non-linkable nav-tabs */
.nav-tabs > li > span {
	display: block;
	margin-right: 2px;
	padding-right: 12px;
	padding-left: 12px;
	padding-top: 8px;
	padding-bottom: 8px;
	line-height: 18px;
	border: 1px solid transparent;
	-webkit-border-radius: 4px 4px 0 0;
	-moz-border-radius: 4px 4px 0 0;
	border-radius: 4px 4px 0 0;
}

/* Extended Joomla Button Classes */
.btn-micro {
	padding: 1px 4px;
	font-size: 10px;
	line-height: 8px;
}

/* Joomla => Bootstrap Tooltip */
.tip-wrap {
	max-width: 200px;
	padding: 3px 8px;
	color: #ffffff;
	text-align: center;
	text-decoration: none;
	-webkit-border-radius: 4px;
	-moz-border-radius: 4px;
	border-radius: 4px;
	z-index: 100;
}

.pagetitle h2 {
	padding: 0 0 0 50px;
	font-size: 1.3em;
	font-weight: bold;
	line-height: 48px;
	font-style: italic;
}

div.configuration {
	font-size: 1.2em;
	font-weight: bold;
	line-height: 2em;
	padding-left: 30px;
	margin-left: 10px;
}

div.toolbar-box h3 {
	height: 0;
	overflow: hidden;
	position: absolute;
	padding: 0;
	margin: 0;
}

.btn-toolbar {
	margin-bottom: 3px;
	margin-top: 14px;
}

div.btn-toolbar, div.toolbar-list {
	float: left;
	text-align: left;
	padding: 0;
}

div.toolbar-list li {
	padding: 5px 1px 5px 4px;
	text-align: center;
	height: 52px;
	list-style: none;
	float: left;
}

div.toolbar-list li.spacer {
	width: 10px;
}

div.toolbar-list li.divider {
	width: 10px;
	margin-right: 10px;
}

div.toolbar-list span {
	float: none;
	width: 32px;
	height: 32px;
	margin: 0 auto;
	display: block;
}

div.toolbar-list a {
	display: block;
	float: left;
	white-space: nowrap;
	padding: 1px 5px;
	cursor: pointer;
	font-weight: bold;
}

div.btn-toolbar div.btn-group button {
	display: block;
	float: left;
	white-space: nowrap;
	padding: 1px 5px;
	cursor: pointer;
	text-align: center;
}

div.btn-toolbar button:hover, div.btn-toolbar button:focus, div.toolbar-list a:hover, div.toolbar-list a:focus {
	text-decoration: none;
}

/**
 * Massmail component
 */
td#mm_pane {
	width: 90%;
}

input#mm_subject {
	width: 200px;
}

textarea#mm_message {
	width: 100%;
}
textarea {
	resize:both;
}
textarea.vert {
	resize:vertical;
}
textarea.noResize {
	resize:none;
}

/**
 * Pane Slider pane Toggler styles
 */
.pane-sliders {
	margin: 0;
	position: relative;
}

.pane-sliders .title {
	margin: 0;
	padding: 2px;
	cursor: pointer;
}

.pane-sliders .panel {
	margin-bottom: 3px;
}

.pane-sliders .adminlist td {
	border: 0 none;
}

h3.pane-toggler-down a:focus,
h3.pane-toggler a:focus {
	outline: none;
}

.pane-toggler span {
	padding-left: 20px;
}

.pane-toggler-down span {
	padding-left: 20px;
}

/* The following line hides the unseen panel (prevents the mouse from activating in IE, so overridden in the ie css files) */
/*.pane-toggler + div.pane-slider {display: none;}*/
.pane-slider.pane-hide {
	display: none;
}

div#position-icon.pane-sliders div.pane-down div.quickicon-wrapper {
	margin: 5px 0 5px 0;
}

div#position-icon.pane-sliders div.pane-down .quickicon-wrapper .icon {
	padding: 5px 0 5px 10px;
	margin: 0;
}

/**
 * Tabs
 */
dl.tabs {
	float: left;
	margin: 10px 0 -1px 0;
	z-index: 50;
}

dl.tabs dt {
	float: left;
	padding: 4px 10px;
	margin-left: 3px;
}

dl.tabs dt.open {
	z-index: 100;
}

div.current {
	clear: both;
	padding: 10px 10px;
}

div.current dd {
	padding: 0;
	margin: 0;
}

/* New parameter styles */

dl#content-pane.tabs {
	margin: 1px 0 0 0;
}

div.current label, div.current span.faux-label {
	display: block;
	min-width: 150px;
	float: left;
	clear: left;
	margin-top: 8px;
}

div.current fieldset.radio {
	float: left;
}

div.current fieldset.radio input {
	clear: none;
	min-width: 15px;
	float: left;
	margin: 3px 0 0 2px;
}

div.current fieldset.radio label {
	clear: none;
	min-width: 45px;
	float: left;
	margin: 3px 0 0 2px;
}

div.current fieldset.checkboxes {
	float: left;
	clear: right;
}

div.current fieldset.checkboxes input {
	clear: left;
	min-width: 15px;
	float: left;
	margin: 3px 0 0 2px;
}

div.current fieldset.checkboxes label {
	clear: right;
	min-width: 45px;
	margin: 3px 0 0 2px;
}

div.current input,
div.current span.faux-input,
div.current textarea,
div.current select {
	clear: none;
	float: left;
	margin: 3px 0 0 2px;
}

div.current select {
	margin-bottom: 15px;
}

div.current table#acl-config th.acl-groups {
	text-align: left;
}

div.current table#filter-config th.acl-groups {
	text-align: left;
}

div.current table#filter-config select {
	margin-bottom: 0;
}

/* -------- Menu Assigments ---------- */
div#menu-assignment {
	clear: left;
}

div#menu-assignment ul.menu-links {
	float: left;
	width: 49%;
}

div#menu-assignment ul.menu-links label {
	clear: none;
	float: left;
	margin: 3px 0 0 2px;
}

div#menu-assignment ul.menu-links input {
	clear: left;
	float: left;
}

button.jform-rightbtn {
	float: right;
	margin-right: 0;
}

p.tab-description {
	font-size: 1.091em;
	margin-left: 0;
	margin-top: 5px;
}

/* end new parameter styles */

/**
 * Login Settings
 */
#login-page input, #login-page select {
	float: right;
	clear: none;
}

#login-page .login {
	margin: 0 auto;
	width: 575px;
	margin-bottom: 100px;
}

#login-page .pagetitle h2 {
	margin: -70px 0 30px 0;
	font-size: 2em;
	padding: 0;
}

#login-page p {
	margin: 0;
	padding: 0;
	margin-bottom: 1em;
	font-size: 1.2em;
}

#login-page #header {
	margin-bottom: 100px;
}

#login-page .login-inst {
	float: left;
	width: 35%;
}

#login-page .login-box {
	float: right;
	width: 63%;
}

#login-page #lock {
	width: 150px;
	height: 137px;
}

#login-page #element-box.login {
	padding: 20px;
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
}

#login-page .button {
	text-align: right;
}

#login-page .login-text {
	text-align: left;
	width: 40%;
	float: left;
}

#form-login {
	float: left;
	padding: 1.1em;
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
}

#form-login fieldset {
	border: none;
}

#form-login label {
	display: block;
	float: left;
	clear: left;
	width: 100px;
	text-align: right;
	padding: 4px;
	color: #2c2c2c;
	font-weight: bold;
	font-size: 1.4em;
	margin-bottom: 15px;
}

#form-login div.button1 div.next {
	float: left;
}

#form-login div.button1 a {
	height: 2.2em;
	line-height: 2.2em;
	font-size: 1.5em;
	cursor: default;
	padding: 0 15px 0 15px;
}

.login-submit {
	border: 0;
	padding: 0;
	margin: 0;
	width: 0;
	height: 0;
}

/**
 * Cpanel Settings
 */
#cpanel div.icon, .cpanel div.icon {
	text-align: center;
	margin-right: 5px;
	float: left;
	margin-bottom: 5px;
}

#cpanel div.icon a, .cpanel div.icon a {
	display: block;
	float: left;
	height: auto;
	min-height: 97px;
	width: 108px;
	color: #2c2c2c;
	vertical-align: middle;
	text-decoration: none;
	font-weight: bold;
}

#cpanel img, .cpanel img {
	padding: 10px;
	margin: 0 auto;
}

#cpanel span, .cpanel span {
	display: block;
	text-align: center;
	padding: 0 0 5px;
}

div.cpanel-icons {
	width: 54%;
	float: left;
}

div.cpanel-component {
	width: 45%;
	float: right;
}

/**
 * Standard Layout Styles
 */

div.col {
	float: left;
}

div.options-section.col {
	float: right;
}

div.col1 {
	float: left;
	width: 45%;
}

div.col2 {
	float: right;
	width: 45%;
}

/* Avoid using the width divs. They are here for 3PD Extensions if needed
	 * Use the specific layout divs listed after. See also the th.width entries */
div.width-1 {
	width: 1%;
}

div.width-3 {
	width: 3%;
}

div.width-5 {
	width: 5%;
}

div.width-10 {
	width: 10%;
}

div.width-20 {
	width: 20%;
}

div.width-30 {
	width: 30%;
}

div.width-35 {
	width: 35%;
}

div.width-40 {
	width: 40%;
}

div.width-45 {
	width: 45%;
}

div.width-50 {
	width: 50%;
}

div.width-55 {
	width: 55%;
}

div.width-60 {
	width: 60%;
}

div.width-65 {
	width: 65%;
}

div.width-70 {
	width: 70%;
}

div.width-80 {
	width: 80%;
}

div.width-100 {
	width: 100%;
}

.clrlft {
	clear: left;
}

.clrrt {
	clear: right;
}

.fltlft {
	float: left;
}

.fltrt {
	float: right;
}

.fltnone {
	float: none;
}

/* Layout Divs */
div.main-section {
	width: 60%;
}

div.options-section {
	width: 38%;
	margin: 10px 10px 10px 0;
}

/* for bluestork style html */
div.width-40.fltrt {
	width: 38%;
	margin: 10px 10px 10px 0;
}

div.rules-section {
	width: 98%;
	margin: 10px;
}

/**
 * Form Styles
 */

fieldset {
	margin: 2px 10px 2px 10px;
	padding: 5px;
	text-align: left;
}

legend {
	font-size: 1.3em;
	font-weight: bold;
	padding-bottom: 5px;
}

fieldset p {
	margin: 10px 0;
	font-size: 1.2em;
}

fieldset ol, ol#property-values, fieldset ul, ul#property-values {
	margin: 0;
	padding: 0;
}

fieldset li, ol#property-values li, ul#property-values li {
	list-style: none;
	margin: 0;
	padding: 5px;
}

fieldset.adminform fieldset.radio,
fieldset.panelform fieldset.radio,
fieldset.adminform-legacy fieldset.radio {
	border: 0;
	float: left;
	padding: 0;
	margin: 0 0 5px 0;
	clear: right;
}

fieldset.adminform fieldset.radio label,
fieldset.panelform fieldset.radio label,
fieldset.adminform fieldset.radio span.faux-label,
fieldset.panelform fieldset.radio span.faux-label {
	min-width: 40px;
	float: left;
	clear: none;
}

/* checkboxes */
fieldset.adminform fieldset.checkboxes,
fieldset.panelform fieldset.checkboxes,
fieldset.adminform-legacy fieldset.checkboxes {
	border: 0;
	float: left;
	padding: 0;
	margin: 0 0 5px 0;
	clear: right;
}

fieldset.adminform fieldset.checkboxes input[type="checkbox"],
fieldset.panelform fieldset.checkboxes input[type="checkbox"] {
	float: left;
	clear: left;
}

fieldset.adminform fieldset.checkboxes label,
fieldset.panelform fieldset.checkboxes label,
fieldset.adminform fieldset.checkboxes span.faux-label,
fieldset.panelform fieldset.checkboxes span.faux-label {
	clear: right;
}

/* end checkboxes */

/* spacer */
div.current span.spacer > span.before,
fieldset.adminform span.spacer > span.before,
fieldset.panelform span.spacer > span.before {
	clear: both;
	overflow: hidden;
	height: 0;
	display: block;
}

/* end spacer */

fieldset.panelform-legacy label,
fieldset.adminform-legacy label,
fieldset.panelform-legacy span.faux-label,
fieldset.adminform-legacy span.faux-label {
	min-width: 150px;
	float: left;

}


fieldset.adminform,
fieldset.panelform {
	.input-prepend,
	.input-append {
		float: left;
	}
	.adminformlist .btn.modal,
	.input-prepend > *,
	.input-append > * {
		float: none;
		vertical-align: middle;
	}
}

/* JParameter classes on radio button labels */
fieldset.panelform-legacy label.radiobtn-jno,
fieldset.panelform-legacy label.radiobtn-jyes,
fieldset.panelform-legacy label.radiobtn-show,
fieldset.panelform-legacy label.radiobtn-hide,
fieldset.panelform-legacy label.radiobtn-off,
fieldset.panelform-legacy label.radiobtn-on {
	min-width: 40px !important;
	clear: none !important;
}

#jform_plugdesc-lbl,
#jform_description-lbl {
	font-weight: bold;
	clear: both;
	margin-top: 15px;
}

p.jform_desc {
	clear: left;
}

div#jform_ordering {
	font-size: 1.091em;
	margin-top: 3px;
}

fieldset ul.checklist {
	margin-left: 27px;
}

fieldset ul.checklist input,
fieldset ul.checklist label {
	float: none;
}

fieldset ul.checklist input:focus {
	outline: thin dotted #333333;
}

fieldset#filter-bar {
	margin: 0;
	padding: 5px 10px 5px 10px;
	float: left;
	width: 98%
}

fieldset#filter-bar ol, fieldset#filter-bar ul {
	list-style: none;
	margin: 0;
	padding: 5px 0 0;
}

fieldset#filter-bar ol li, fieldset#filter-bar ul li {
	float: left;
	padding: 0 5px 0 0;
}

fieldset#filter-bar ol li fieldset, fieldset#filter-bar ul li fieldset {
	margin: 0;
	padding: 0;
}

fieldset#filter-bar .filter-search {
	float: left;
	padding-bottom: 3px;
}

fieldset#filter-bar .filter-select {
	float: right;
}

fieldset#filter-bar input#search {
	width: 10em;
}

/* Note: these visual cues should be augmented by aria */
.invalid {
	font-weight: bold;
}

/* augmented by aria in template javascript */
input.readonly, span.faux-input {
	border: 0;
}

.star {
	color: #cc0000;
	font-size: 1.2em;
}

input, select, span.faux-input {
	font-size: 1.2em;
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
}

span.readonly {
	float: left;
	font-size: 1.2em;
	line-height: 2em;
}

div.readonly {
	font-size: 1.2em;
	line-height: 2em;
}

div.extdescript {
	margin-left: 10px;
}

input[type="button"],
input[type="submit"],
input[type="reset"] {
	font-family: Arial, Helvetica, sans-serif;
	padding: 1px 6px;
	font-size: 1.2em;
	line-height: 1.5em;
}

textarea {
	font-size: 1.4em;
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
}

input.button {
	cursor: pointer;
}

label {
	font-weight: bold;
	font-size: 1.1em;
}

span.faux-label {
	font-weight: bold;
	font-size: 1.1em;
}

label.selectlabel {
	position: absolute;
	left: -1000em;
}

/**
 * Option or Parameter styles
 */

.paramrules {
	padding: 10px;
}

span.gi {
	font-weight: bold;
	margin-right: 5px;
}

span.gtr {
	visibility: hidden;
	margin-right: 5px;
}

/**
 * Admintable Styles
 */
table.admintable td {
	padding: 3px;
	font-size: 1em;
}

table.admintable td.key, table.admintable td.paramlist_key {
	text-align: right;
	width: 140px;
	font-weight: bold;
	font-size: 1em;
}

table.admintable td.key label, table.admintable td.paramlist_key label {
	font-size: 1em;
}

table.admintable td.paramlist_value label {
	font-size: 1em;
}

table.admintable input, table.admintable span.faux-input, table.admintable select {
	font-size: 1em;
}

table.paramlist td.paramlist_description {
	text-align: left;
	width: 170px;
	font-weight: normal;
}

table.admintable td.key.vtop {
	vertical-align: top;
}

/**
 * Admin Form Styles
 */
fieldset.adminform {
	margin: 0 10px 10px 10px;
	overflow: hidden;
}

.adminformlist .btn.modal{
	float: left;
	margin-top: 7px;
}

ul.adminformlist,
ul.adminformlist li,
dl.adminformlist,
dl.adminformlist li {
	margin: 0;
	padding: 0;
	list-style: none;
}

ul.adminformlist pre {
	font-size: 1.3em;
}

ul.adminformlist .button2-left, ul.adminformlist .button2-left {
	margin-top: 5px;
}

/* Table styles are for use with tabular data */
table.adminform {
	width: 100%;
	border-collapse: collapse;
	margin: 8px 0 10px 0;
	margin-bottom: 15px;
}

table.adminform.nospace {
	margin-bottom: 0;
}

table.adminform th {
	font-size: 1.4em;
	padding: 6px 2px 4px 4px;
	text-align: left;
	height: 25px;
}

table.adminform td {
	padding: 3px;
	text-align: left;
}

table.adminform td#filter-bar {
	text-align: left;
}

table.adminform td.helpMenu {
	text-align: right;
}

table.adminform tr {
	padding-left: 10px;
	padding-right: 10px;
}

/**
 * Table formating styles
 */
td.center, th.center {
	text-align: center;
}

/* Avoid using the width classes. They are here for 3PD Extensions if needed
	 * Use the specific layout table headers listed after. See also the div.width entries */
th.width-1 {
	width: 1%;
}

th.width-3 {
	width: 3%;
}

th.width-5 {
	width: 5%;
}

th.width-10 {
	width: 10%;
}

th.width-12 {
	width: 12%;
}

th.width-15 {
	width: 15%;
}

th.width-20 {
	width: 20%;
}

th.width-25 {
	width: 25%;
}

th.width-30 {
	width: 30%;
}

th.width-40 {
	width: 40%;
}

/* Table header layout classes */
th.row-number-col {
	width: 3%;
}

th.checkmark-col {
	width: 1%;
}

th.state-col {
	width: 5%;
}

th.ordering-col {
	width: 10%;
}

th.ordering-col a {
	display: block;
	float: left;
	margin-left: 3px;
}

th.ordering-col a img {
	margin-left: 4px;
	margin-right: 4px;
}

.categories th.ordering-col input, .categories td.order input {
	font-size: 1em;
}

th.category-col {
	width: 5%;
}

th.access-col {
	width: 10%;
}

.categories th.access-col {
	width: 5%;
}

th.hits-col {
	width: 5%;
}

th.id-col {
	width: 3%;
}

th.featured-col {
	width: 5%;
}

th.created-by-col {
	width: 15%;
}

th.date-col {
	width: 5%;
}

th.language-col {
	width: 5%;
}

th.home-col {
	width: 5%;
}

/**
 * Adminlist Table layout
 */
table.adminlist {
	width: 100%;
	float: left;
}

table.adminlist td, table.adminlist th {
	padding: 4px;
	font-size: 1.2em;
}

table.adminlist thead th {
	text-align: center;
}

table.adminlist thead a:hover {
	text-decoration: none;
}

table.adminlist thead th img {
	vertical-align: middle;
}

table.adminlist tbody th {
	font-weight: bold;
}

/* Table row styles */
table.adminlist tr {
	padding-left: 30px;
	padding-right: 30px;
}

table.adminlist tbody tr {
	text-align: left;
}

table.adminlist tbody tr td,
table.adminlist tbody tr th {
	height: 25px;
}

table.adminlist tfoot tr {
	text-align: center;
}

/* Table td/th styles */
table.adminlist tfoot td, table.adminlist tfoot th {
	text-align: center;
}

table.adminlist td.order {
	text-align: center;
	white-space: nowrap;
}

table.adminlist td.order span {
	float: left;
	width: 20px;
	text-align: center;
}

table.adminlist td.order input {
	text-align: center;
	width: 3em;
	font-size: 100%;
}

/**
 * Tree indentation & nesting - Up to 10 levels deep so don't go crazy :
 */
#media-tree_tree ul {
	list-style: none outside none;
    margin: 0 10px;
}

table.adminlist td.indent-4 {
	padding-left: 4px;
}

table.adminlist td.indent-19 {
	padding-left: 19px;
}

table.adminlist td.indent-34 {
	padding-left: 34px;
}

table.adminlist td.indent-49 {
	padding-left: 49px;
}

table.adminlist td.indent-64 {
	padding-left: 64px;
}

table.adminlist td.indent-79 {
	padding-left: 79px;
}

table.adminlist td.indent-94 {
	padding-left: 94px;
}

table.adminlist td.indent-109 {
	padding-left: 109px;
}

table.adminlist td.indent-124 {
	padding-left: 124px;
}

table.adminlist td.indent-139 {
	padding-left: 139px;
}

/**
 * Adminlist buttons
 */
table.adminlist tr td.btns a {
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
	padding: 3px 20px;
}

table.adminlist tr td.btns a:hover, table.adminlist tr td.btns a:active, table.adminlist tr td.btns a:focus {
	text-decoration: none;
}

/**
 * Adminlist lists
 */
table.adminlist td li {
	list-style: inside;
}

/**
 * Modal Modules styles
 */
ul#new-modules-list {
	margin-left: 50px;
	font-size: 1.4em;
	line-height: 1.5em;
}

/**
 * Utility styles
 */
/* General Clearing Class */
.clr {
	clear: both;
	overflow: hidden;
	height: 0;
}

.clearfix:after {
	content: ".";
	display: block;
	height: 0;
	clear: both;
	visibility: hidden;
}

.menu-module-list {
	list-style-position: inside;
	padding-left: 10px;
	margin-left: 5px;
}

/* stu nicholls solution for centering divs */
.container {
	clear: both;
	text-decoration: none;
}

* html .container {
	display: inline-block;
}

/* table solution for global config */
table.noshow {
	width: 100%;
	border-collapse: collapse;
	padding: 0;
	margin: 0;
}

table.noshow tr {
	vertical-align: top;
}

table.noshow fieldset {
	margin: 15px 7px 7px 7px;
}

/**
 * Saving order icon styling in admin tables
 */
a.saveorder {
	width: 16px;
	height: 16px;
	display: block;
	overflow: hidden;
	float: right;
	margin-right: 8px;
}

/**
 * Button styling
 */
#editor-xtd-buttons {
	padding: 5px;
}

button {
	font-family: Arial, Helvetica, sans-serif;
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
	margin-right: 3px;
	margin-left: 3px;
}

.invalid {
	font-weight: bold;
}

/* Button 1 Type */
.button1, .button1 div {
	height: 1%;
	float: right;
}

.button1 {
	white-space: nowrap;
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
}

.button1 a {
	display: block;
	height: 2.2em;
	float: left;
	line-height: 2.2em;
	font-size: 1.2em;
	font-weight: bold;
	cursor: default;
	padding: 0 6px 0 6px;
	/* add padding if you are using the directional images */
	/* padding: 0 30px 0 6px; */
}

.button1 a:hover, .button1 a:focus {
	text-decoration: none;
}

/* Button 2 Type */
.button2-left, .button2-right {
	float: left;
	line-height: 1.5em;
	font-size: 1.2em;
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
}

.button2-left.smallsub, .button2-right.smallsub {
	line-height: 1.2em;
	font-size: .9em;
}

.button2-left a, .button2-right a, .button2-left span, .button2-right span {
	display: block;
	float: left;
	cursor: default;
}

/* these are inactive buttons */
.button2-left span, .button2-right span {
	cursor: default;
}

.button2-left .page a, .button2-right .page a,
.button2-left .page span, .button2-right .page span,
.button2-left .blank a, .button2-right .blank a,
.button2-left .blank span, .button2-right .blank span {
	padding: 0 6px;
}

.page span, .blank span {
	font-weight: bold;
}

.button2-left a:hover,
.button2-right a:hover,
.button2-left a:focus,
.button2-right a:focus {
	text-decoration: none;
}

.button2-left a, .button2-left span {
	padding: 0 24px 0 6px;
}

.button2-right a, .button2-right span {
	padding: 0 6px 0 24px;
}

.button2-left {
	float: left;
	margin-left: 5px;
}

.button2-right {
	float: left;
	margin-left: 5px;
}

/**
 * Pagination styles
 */

/* Normal pagination styles */
div.containerpg {
	position: relative;
	left: 50%;
	float: left;
	clear: left;
}

div.pagination {
	position: relative;
	left: -50%;
	margin: 0 auto;
	padding: .5em;
}

.pagination div.limit {
	float: left;
	margin: 0 10px;
	font-size: 1.2em;
	height: 1.8em;
	line-height: 1.8em;
}

.pagination div.limit label {
	font-size: 100%;
	height: 1.8em;
	line-height: 1.8em;
}

.pagination div.limit select {
	font-size: 100%;
}

/* The Go submittal button */
.pagination button {
	font-size: 100%;
	height: 2.0em;
	line-height: 1.8em;
	margin-right: 20px;
}

div.pagination .button2-right, div.pagination .button2-left {
	font-size: 1.2em;
	height: 1.6em;
	line-height: 1.6em;
}

/* Style if pagination is part of the table (old style) */
table.adminlist .pagination {
	display: table;
	padding: 0;
	margin: 0 auto;
	font-size: .8em;
}

table.adminlist .pagination button {
	font-size: 1.2em;
	height: 1.6em;
	line-height: 1.5em;
	margin-right: 20px;
}

/**
 * MCE Editor
 */
div.toggle-editor {
	margin-top: 9px;
}

/**
 * Tooltips
 */
.tip {
	float: left;
	padding: 5px;
	max-width: 400px;
	z-index: 50;
}

.tip-title {
	padding: 0;
	margin: 0;
	font-size: 120%;
	margin-top: -15px;
	padding-top: 15px;
	padding-bottom: 5px;
}

.tip-text {
	font-size: 100%;
	text-align: left;
	margin: 0;
}

/**
 * Calendar
 */
a img.calendar {
	width: 16px;
	height: 16px;
	margin-left: 3px;
	cursor: pointer;
	vertical-align: middle;
}

/**
 * JGrid styles
 */
a.jgrid:hover {
	text-decoration: none;
}

.jgrid span.state {
	display: inline-block;
	height: 16px;
	width: 16px;
}

.jgrid span.text {
	display: none;
}

/**
 * Icons
 * The Background Icons for Menus, Toolbars, Quick Icons
 * are now in the color css files
 */

/**
 * General styles
 */
div.message {
	text-align: center;
	font-family: Arial, Helvetica, sans-serif;
	font-size: 1.2em;
	padding: 3px;
	margin-bottom: 10px;
	font-weight: bold;
}

.helpIndex {
	border: 0;
	width: 100%;
	height: 100%;
	padding: 0;
	overflow: auto;
}

.helpFrame {
	width: 100%;
	height: 800px;
	padding: 0 5px 0 10px;
}

#treecellhelp {
	width: 25%;
	display: block;
	position: relative;
	float: left;
	margin: 0;
	padding: 2px;
	overflow: hidden;
}

#datacellhelp {
	width: 73%;
	display: block;
	float: left;
	margin: 0;
	padding: 2px 0 0 0;
}

.outline {
	padding: 2px;
}

/**
 * Modal Styles
 */

h2.modal-title {
	margin-left: 15px;
	margin-bottom: 0;
	margin-top: 5px;
	font-size: 1.8em;
	padding-bottom: .5em;
}

ul.menu_types {
	padding: 0 0 0 15px;
	width: 95%;
	margin: 0;
}

ul.menu_types li,
dl.menu_type dd ul li {
	width: 240px;
	list-style: none;
	display: block;
	float: left;
	margin-right: 10px;
}

ul.menu_types li {
	width: 47%;
}

dl.menu_type {
	width: 240px;
	margin: 0;
	padding: 0;
}

dl.menu_type dt {
	font-weight: bold;
	font-size: 1.5em;
	float: left;
	margin: 13px 0 5px 0;
	width: 240px;
}

dl.menu_type dd {
	clear: left;
	margin: 0;
}

dl.menu_type dd a {
	font-size: 1.2em;
}

dl.menu_type dd ul li {
	margin: 0;
}

ul#new-modules-list {
	padding: 5px 0 0 15px;
	width: 95%;
	margin: 0;
	list-style: none;
}

ul#new-modules-list li {
	list-style: none;
	display: block;
	float: left;
	margin: 0 20px 0 0;
	width: 47%;
}

ul#new-modules-list li a {
	font-size: 1em;
	line-height: 1.5em;
}

body.contentpane #filter-bar {
	font-size: 80%;
}

body.contentpane input, body.contentpane select {
	font-size: 120%;
}

#filter-bar input, #filter-bar select, #filter-bar button {
	font-size: 110%;
}

/**
 * User Accessibility
 */

/* Skip to Content Structural Styling */
#skiplinkholder a, #skiplinkholder a:link, #skiplinkholder a:visited {
	display: block;
	width: 99%;
	position: absolute;
	top: 0;
	left: -200%;
	z-index: 2;
}

#skiplinkholder a:focus, #skiplinkholder a:active {
	left: 0;
	top: 0;
	z-index: 100;
}

#skiplinkholder p {
	margin: 0;
}

#skiptargetholder {
	position: absolute;
	left: -200%;
}

/* Skip to Content Visual Styling */
#skiplinkholder a, #skiplinkholder a:link, #skiplinkholder a:visited {
	text-decoration: underline;
	padding: 5px;
	font-size: 1.3em;
	font-weight: bold;
	padding-left: 20px;
	padding-right: 20px;
}

/* Hide overlayed controls so that keyboarders can get to the modal */
.body-overlayed a,
.body-overlayed input,
.body-overlayed button {
	visibility: hidden;
}

.body-overlayed #sbox-window a,
.body-overlayed #sbox-window input,
.body-overlayed #sbox-window button {
	visibility: visible;
}

/**
 * Admin Form Styles
 */

/* For elements that aren't to be seen by users unless the user does something
	 * like clicking on a header to see the collapsed section. */
.element-hidden, .hide {
	display: none;
}

.hidebtn {
	border: 0 !important;
	padding: 0 !important;
	margin: 0;
	width: 0;
	height: 0;
}

/* For elements that aren't to be seen by visual users but do need to be read by screenreaders.
	 * Cannot be used for elements that can get focus such as links and form elements */
.element-invisible, .hidelabeltxt {
	height: 0;
	overflow: hidden;
	position: absolute;
	padding: 0;
	margin: 0;
}

/* Firefox has issues styling legend so this is a universal fix
	for making the legend invisible (i.e. visually it's not there, but screen readers see it */

legend.element-invisible {
	position: absolute !important;
	margin: 0;
	padding: 0;
	border: 0;
	margin-left: -10000px;
	font-size: 1px;
	height: 0;
}

fieldset.panelform {
	overflow: hidden;
	clear: both;
}

fieldset.adminform label,
fieldset.panelform label,
fieldset.adminform span.faux-label,
fieldset.panelform span.faux-label {
	line-height: 2em;
	clear: left;
	min-width: 12em;
	float: left;
	margin-left: 10px;
	margin-right: 5px;
}

fieldset.adminform.long label,
fieldset.panelform.long label,
fieldset.adminform.long span.faux-label,
fieldset.panelform.long span.faux-label {
	min-width: 18em;
}

fieldset.adminform fieldset.radio label,
fieldset.panelform fieldset.radio label,
fieldset.adminform fieldset.radio span.faux-label,
fieldset.panelform fieldset.radio span.faux-label {
	margin-left: 0;
}

fieldset.adminform input, fieldset.adminform span.faux-input, fieldset.adminform textarea, fieldset.adminform select, fieldset.adminform img, fieldset.adminform button,
fieldset.panelform input, fieldset.panelform span.faux-input, fieldset.panelform textarea, fieldset.panelform select, fieldset.panelform img, fieldset.panelform button {
	float: left;
	margin: 5px 5px 5px 0;
	width: auto;
}

/* -------- Batch Section ---------- */
fieldset.batch {
	margin: 20px 10px 10px 10px;
	padding: 10px;
}

fieldset.batch label {
	margin: 5px;
	min-width: 40px;
}

fieldset.batch button {
	margin: 3px;
}

fieldset#batch-choose-action {
	clear: left;
	border: 0 none;
}

fieldset.batch label {
	float: left;
	clear: none;
}

fieldset label#batch-choose-action-lbl {
	clear: left;
	margin-top: 15px;
}

label#batch-language-lbl,
label#batch-user-lbl {
	clear: left;
	margin-right: 10px;
	margin-top: 15px;
}

select#batch-language-id,
select#batch-user-id {
	margin-top: 15px;
}

select#batch-category-id,
select#batch-position-id,
select#batch-menu-id {
	margin-right: 30px;
}

fieldset.batch select, fieldset.batch input, fieldset.batch img, fieldset.batch button {
	float: left;
}

label#batch-access-lbl,
label#batch-client-lbl {
	margin-right: 10px;
}

div#jform_ordering {
	font-size: 1.091em;
	margin-top: 3px;
}

/* Banner edit */
#jform_impmade, #jform_clicks {
	width: 30px;
}

fieldset.panelform label#jform-imp {
	min-width: 3em;
	font-size: 1.091em;
}

fieldset.adminform input#jform_clickurl {
	width: 20em;
}

/**
 * ACL STYLES relocated from com_users/media/grid.css
 */

a.move_up {
	display: inline-block;
	height: 16px;
	text-indent: -1000em;
	width: 16px;
}

span.move_up {
	display: inline-block;
	height: 16px;
	width: 16px;
}

a.move_down {
	display: inline-block;
	height: 16px;
	text-indent: -1000em;
	width: 16px;
}

span.move_down {
	display: inline-block;
	height: 16px;
	width: 16px;
}

a.grid_false {
	display: inline-block;
	height: 16px;
	text-indent: -1000em;
	width: 16px;
}

a.grid_true {
	display: inline-block;
	height: 16px;
	text-indent: -1000em;
	width: 16px;
}

a.grid_trash {
	display: inline-block;
	height: 16px;
	text-indent: -1000em;
	width: 16px;
}

/**
 * ACL PANEL STYLES
 */
div.acl-options {
	width: 100%;
}

/* All Tabs */
table.aclsummary-table,
table.aclmodify-table {
	border-collapse: collapse;
	width: 100%;
	font-size: 1.091em;
}

td.col1 {
	font-size: 1.091em;
	text-align: left;
	padding: 4px;
}

table.aclsummary-table caption,
table.aclmodify-table caption {
	display: none;
}

/* Summary Tab */
table.aclsummary-table th.col1 {
	width: 25%;
}

table.aclsummary-table th.col2,
table.aclsummary-table th.col3,
table.aclsummary-table th.col4,
table.aclsummary-table th.col5,
table.aclsummary-table th.col6 {
	width: 15%;
	vertical-align: bottom;
	text-align: center;
}

/* Icons (background images moved to color css files */
span.icon-16-unset,
span.icon-16-allowed,
span.icon-16-denied,
span.icon-16-locked {
	padding-left: 18px;
}

label.icon-16-allow,
label.icon-16-deny,
a.icon-16-allow,
a.icon-16-deny,
a.icon-16-allowinactive,
a.icon-16-denyinactive {
	display: block;
	height: 16px;
	width: 16px;
	margin: 0 auto;
}

label.icon-16-allow {
	text-indent: -9999em;
	position: relative;
	left: 40%;
}

label.icon-16-deny {
	text-indent: -9999em;
	position: relative;
	left: 40%;
}

/* Create, Edit, Edit State & Delete Tabs */
table.aclmodify-table th.col2,
table.aclmodify-table th.col3,
table.aclmodify-table th.col4 {
	width: 20%;
	vertical-align: bottom;
	text-align: center;
}

table.aclmodify-table select {
	margin: 1px;
}

table.aclsummary-table td label,
table.aclmodify-table td label {
	min-width: 20px;
}

/* ACL footer/legend */
ul.acllegend {
	list-style: none;
	font-size: 1.091em;
	padding-bottom: 10px;
}

ul.acllegend li {
	display: block;
	float: left;
	padding-right: 20px;
	margin: 15px 0 15px 10px;
}

ul.acllegend li.acl-allowed {
	padding-left: 20px;
	padding-right: 10px;
}

ul.acllegend li.acl-denied {
	padding-left: 20px;
	padding-right: 20px;
}

ul.acllegend li.acl-editgroups {
	padding-right: 10px;
}

ul.acllegend li.acl-resetbtn {
	padding-right: 0;
}

li.acl-editgroups,
li.acl-resetbtn {
	display: block;
	float: left;
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
}

li.acl-editgroups a,
li.acl-resetbtn a {
	padding: 6px;
	cursor: default;
}

li.acl-editgroups a:hover,
li.acl-resetbtn a:hover,
li.acl-editgroups a:focus,
li.acl-resetbtn a:focus {
	text-decoration: none;
	cursor: default;
}

li.acl-editgroups:hover,
li.acl-resetbtn:hover,
li.acl-editgroups:focus,
li.acl-resetbtn:focus {
	text-decoration: none;
	cursor: default;
}

table#acl-config {
	width: 100%;
	margin-top: 15px;
}

table#acl-config th,
table#acl-config td {
	height: 2em;
	background: #f9fade;
	text-align: center;
	vertical-align: middle;
}

table#acl-config th.acl-groups {
	padding-left: 8px;
	font-weight: bold;
	text-align: left;
}

table#acl-config th.acl-groups span.gi {
	margin-right: 2px;
}

table#acl-config td {
	width: 9em;
}

table#acl-config td select {
	float: none;
}

.acl-action {
	font-size: 1.091em;
	margin: auto 0;
}

.acl-groups {
	font-size: 1.091em;
	font-weight: normal;
}

label#jform_rules-lbl {
	float: none;
	white-space: nowrap;
	display: none;
	visibility: hidden;
}

label#jform_filters-lbl {
	float: none;
	white-space: nowrap;
	display: none;
	visibility: hidden;
}

/**
* Options modal- config
*/
ul.config-option-list,
ul.config-option-list li {
	margin: 0;
	padding: 0;
	list-style: none;
}

ul.config-option-list fieldset {
	margin: 0;
	padding-left: 0;
	padding-right: 0;
}

/* *
* Permission Rules
*/
#permissions-sliders {
    margin-top: 15px;
}

#permissions-sliders ul#rules,
#permissions-sliders ul#rules ul {
	margin: 0 !important;
	padding: 0 !important;
	list-style-type: none;
}

#permissions-sliders ul#rules li {
	margin: 0;
	padding: 0;
}

#permissions-sliders ul#rules table.group-rules {
	border-collapse: collapse;
	margin: 5px;
	width: 100%;
}

#permissions-sliders ul#rules table.group-rules td {
	padding: 4px;
	vertical-align: middle;
	text-align: left;
	overflow: hidden;
}

#permissions-sliders ul#rules table.group-rules th {
	font-size: 1.2em;
	overflow: hidden;
	font-weight: bold;
}

#permissions-sliders .panel {
	margin-bottom: 3px;
	margin-left: 0;
	border: 0;
}

#permissions-sliders p.rule-desc {
	font-size: 1.1em;
}

#permissions-sliders div.rule-notes {
	font-size: 1.1em;
}

ul#rules table.group-rules td label {
	margin: 0 !important;
	line-height: 1.1em;
}

ul#rules table.group-rules td span {
	font-size: 1.1em;
	padding-bottom: 4px;
}

ul#rules table.group-rules td span span {
	font-size: 100%;
}

table.group-rules td select {
	margin: 0 !important;
}

#permissions-sliders ul#rules .mypanel {
	padding: 0;
	line-height: 1.3em;
}

#permissions-sliders .mypanel table.group-rules caption {
	font-size: 1.3em;
}

#permissions-sliders ul#rules {
	padding: 5px;
}

#permissions-sliders ul#rules table.group-rules th {
	text-align: left;
	padding: 4px;
}

#permissions-sliders ul#rules table.group-rules td label {
	min-width: 1em;
}

#permissions-sliders .pane-toggler span {
	padding-left: 20px;
}

#permissions-sliders .pane-toggler-down span {
	padding-left: 20px;
}

#permissions-sliders .pane-toggler-down span.level,
#permissions-sliders .pane-toggler span.level {
	padding: 0;
}

/*
 * Debug styles
 */

.swatch {
	text-align: center;
	padding: 0 15px 0 15px;
}

/* Tab changes for accessibility */
dl.tabs dt h3 {
	padding: 0;
	font-size: 100%;
}

/**
 * Helpmenus
 */
ul.helpmenu li {
	float: right;
	margin: 10px;
	padding: 0;
	list-style-type: none;
	font-weight: bold;
}

/* CSS file for Accessible Admin Menu
 * based on Matt Carrolls' son of suckerfish
 * with javascript by Bill Tomczak
 */

/* Note: set up the font-size on the id and used 100% on the elements.
	If ul/li/a are different ems, then the shifting back via non-js keyboard
	doesn't work properly */

/**
 * Menu Styling
 */
#menu {
	/* this is on the main ul */
	position: relative;
	z-index: 100;
	padding: 0;
	margin: 0;
	width: 100%;
	list-style: none;
	font-size: 1.2em;
	font-weight: bold;
}

#menu ul {
	/* all lists */
	padding: 0;
	margin: 0;
	list-style: none;
	font-size: 100%;
}

#menu ul li.separator {
	margin-bottom: 1em;
}

#menu a {
	padding: 0.35em 2.5em 0.35em 2em;
	vertical-align: middle;
	display: block;
	/* width: 10em; */
	text-decoration: none;
	font-size: 100%;
}

#menu li {
	/* all list items */
	float: left;
	/* width: 12em; width needed or else Opera goes nuts */
	font-size: 100%;
}

#menu li a {
	white-space: nowrap;
}

#menu li li a {
	margin-bottom: 1px;
	margin-top: 1px;
	width: 10em;
}

#menu li.disabled a:hover,
#menu li.disabled a:focus,
#menu li.disabled a {
	cursor: default;
}

#menu li ul {
	/* second-level lists */
	position: absolute;
	width: 16em;
	margin-left: -1000em;
	/* using left instead of display to hide menus because display: none isn't read by screen readers */
}

#menu li li {
	/* second-level row */
	border: none;
	width: 16em;
}

#menu li ul ul {
	/* third-and-above-level lists */
	margin: -2.3em 0 0 -1000em;
	/* top margin is equal to parent line height+bottom padding */
}

#menu li:hover ul ul, #menu li.sfhover ul ul {
	margin-left: -1000em;
}

#menu li:hover ul, #menu li.sfhover ul {
	/* lists nested under hovered list items */
	margin-left: 0;
}

#menu li li:hover ul, #menu li li.sfhover ul {
	margin-left: 16em;
}

/**
 * Menu Icons
 * These icons are used on the Administrator menu
 * The classes are constructed dynamically when the menu is generated
 */
[class^="menu-"],
[class*=" menu-"] {
	background-position: 3px 50% !important;
}
.menu-archive {
	background-image: url(../images/menu/icon-16-archive.png);
}

.menu-article {
	background-image: url(../images/menu/icon-16-article.png);
}

.menu-associations {
	background-image: url(../images/menu/icon-16-assoc.png);
}

.menu-banners {
	background-image: url(../images/menu/icon-16-banner.png);
}

.menu-banners-clients {
	background-image: url(../images/menu/icon-16-banner-client.png);
}

.menu-banners-tracks {
	background-image: url(../images/menu/icon-16-banner-tracks.png);
}

.menu-banners-cat {
	background-image: url(../images/menu/icon-16-banner-categories.png);
}

.menu-category {
	background-image: url(../images/menu/icon-16-category.png);
}

.menu-checkin {
	background-image: url(../images/menu/icon-16-checkin.png);
}

.menu-clear {
	background-image: url(../images/menu/icon-16-clear.png);
}

.menu-component {
	background-image: url(../images/menu/icon-16-component.png);
}

.menu-config {
	background-image: url(../images/menu/icon-16-config.png);
}

.menu-contact {
	background-image: url(../images/menu/icon-16-contacts.png);
}

.menu-contact-cat {
	background-image: url(../images/menu/icon-16-contacts-categories.png);
}

.menu-content {
	background-image: url(../images/menu/icon-16-content.png);
}

.menu-cpanel {
	background-image: url(../images/menu/icon-16-cpanel.png);
}

.menu-default {
	background-image: url(../images/menu/icon-16-default.png);
}

.menu-featured {
	background-image: url(../images/menu/icon-16-featured.png);
}

.menu-fields {
	background-image: url(../images/menu/icon-16-puzzle.png);
}

.menu-groups {
	background-image: url(../images/menu/icon-16-groups.png);
}

.menu-help {
	background-image: url(../images/menu/icon-16-help.png);
}

.menu-help-this {
	background-image: url(../images/menu/icon-16-help-this.png);
}

.menu-help-forum {
	background-image: url(../images/menu/icon-16-help-forum.png);
}

.menu-help-docs {
	background-image: url(../images/menu/icon-16-help-docs.png);
}

.menu-help-jed {
	background-image: url(../images/menu/icon-16-help-jed.png);
}

.menu-help-jrd {
	background-image: url(../images/menu/icon-16-help-jrd.png);
}

.menu-help-community {
	background-image: url(../images/menu/icon-16-help-community.png);
}

.menu-help-security {
	background-image: url(../images/menu/icon-16-help-security.png);
}

.menu-help-dev {
	background-image: url(../images/menu/icon-16-help-dev.png);
}

.menu-help-shop {
	background-image: url(../images/menu/icon-16-help-shop.png);
}

.menu-info {
	background-image: url(../images/menu/icon-16-info.png);
}

.menu-install {
	background-image: url(../images/menu/icon-16-install.png);
}

.menu-joomlaupdate {
	background-image: url(../images/menu/icon-16-install.png);
}

.menu-language {
	background-image: url(../images/menu/icon-16-language.png);
}

.menu-levels {
	background-image: url(../images/menu/icon-16-levels.png);
}

.menu-logout {
	background-image: url(../images/menu/icon-16-logout.png);
}

.menu-maintenance {
	background-image: url(../images/menu/icon-16-maintenance.png);
}

.menu-massmail {
	background-image: url(../images/menu/icon-16-massmail.png);
}

.menu-media {
	background-image: url(../images/menu/icon-16-media.png);
}

.menu-menu {
	background-image: url(../images/menu/icon-16-menu.png);
}

.menu-menumgr {
	background-image: url(../images/menu/icon-16-menumgr.png);
}

.menu-messages {
	background-image: url(../images/menu/icon-16-messaging.png);
}

.menu-messages-add {
	background-image: url(../images/menu/icon-16-new-privatemessage.png);
}

.menu-messages-read {
	background-image: url(../images/menu/icon-16-messages.png);
}

.menu-module {
	background-image: url(../images/menu/icon-16-module.png);
}

.menu-newarticle {
	background-image: url(../images/menu/icon-16-newarticle.png);
}

.menu-newcategory {
	background-image: url(../images/menu/icon-16-newcategory.png);
}

.menu-newgroup {
	background-image: url(../images/menu/icon-16-newgroup.png);
}

.menu-newlevel {
	background-image: url(../images/menu/icon-16-newlevel.png);
}

.menu-newuser {
	background-image: url(../images/menu/icon-16-newuser.png);
}

.menu-plugin {
	background-image: url(../images/menu/icon-16-plugin.png);
}

.menu-profile {
	background-image: url(../images/menu/icon-16-user.png);
}

.menu-purge {
	background-image: url(../images/menu/icon-16-purge.png);
}

.menu-readmess {
	background-image: url(../images/menu/icon-16-readmess.png);
}

.menu-section {
	background-image: url(../images/menu/icon-16-section.png);
}

.menu-static {
	background-image: url(../images/menu/icon-16-static.png);
}

.menu-stats {
	background-image: url(../images/menu/icon-16-stats.png);
}

.menu-themes {
	background-image: url(../images/menu/icon-16-themes.png);
}

.menu-trash {
	background-image: url(../images/menu/icon-16-trash.png);
}

.menu-user {
	background-image: url(../images/menu/icon-16-user.png);
}

.menu-user-note {
	background-image: url(../images/menu/icon-16-user-note.png);
}

.menu-delete {
	background-image: url(../images/menu/icon-16-delete.png);
}

.menu-help-trans {
	background-image: url(../images/menu/icon-16-help-trans.png);
}

.menu-newsfeeds {
	background-image: url(../images/menu/icon-16-newsfeeds.png);
}

.menu-newsfeeds-cat {
	background-image: url(../images/menu/icon-16-newsfeeds-cat.png);
}

.menu-redirect {
	background-image: url(../images/menu/icon-16-redirect.png);
}

.menu-search {
	background-image: url(../images/menu/icon-16-search.png);
}

.menu-finder {
	background-image: url(../images/menu/icon-16-search.png);
}

.menu-weblinks {
	background-image: url(../images/menu/icon-16-links.png);
}

.menu-weblinks-cat {
	background-image: url(../images/menu/icon-16-links-cat.png);
}

.menu-tags {
	background-image: url(../images/menu/icon-16-tags.png);
}

.menu-postinstall {
	background-image: url(../images/menu/icon-16-generic.png);
}
.icon-32-cog {
	background-image: url(../images/toolbar/icon-32-cog.png);
}

/**
 * Extra positioning rules for limited noscript keyboard accessibility
 * need the backgrounds here to keep the background as the nav background
 * since it is overlaying other content.
 * Using margin-left instead of left so that can move back without javascript
 * display downlevel ul
 */
#menu li a:focus+ul {
	margin-left: 0;
}

#menu li li a:focus+ul {
	margin-left: 1016em;
}

/* bring back the focus elements into view */
#menu li li a:focus {
	margin-left: 1000em;
	width: 10em;
}

#menu li li li a:focus {
	margin-left: 2016em;
	width: 10em;
}

#menu li:hover a:focus, #menu li.sfhover a.sffocus {
	margin-left: 0;
}

#menu li li:hover a:focus+ul, #menu li li.sfhover a.sffocus+ul {
	margin-left: 16em;
}

/**
 * Sidebar styling
 */
#sidebar {
	float:left;
	margin: 15px 5px;
}

/**
 * Submenu styling
 */
#submenu {
	list-style: none;
	padding: 0;
	margin: 0;
	/* border-bottom plus padding-bottom is the technique */
	padding-bottom: 2.5em;
	line-height: 2em;
}

#submenu ul, #submenu li {
	display: inline;
	list-style-type: none;
	margin: 0;
	padding: 0;
}

#submenu li, #submenu span.nolink {
	float: left;
	font-weight: bold;
	margin-right: 8px;
	padding: 2px 10px 2px 10px;
	text-decoration: none;
	cursor: pointer;
	-moz-border-radius-topright: 3px;
	-moz-border-radius-topleft: 3px;
	-webkit-border-top-right-radius: 3px;
	-webkit-border-top-left-radius: 3px;
	border-top-right-radius: 3px;
	border-top-left-radius: 3px;
}

#submenu span.nolink {
	color: #999;
}

#submenu li.active, #submenu span.nolink.active {
	cursor: default;
}

#submenu li.active a, #submenu span.nolink.active, #submenu li a:hover, #submenu li a:focus {
	text-decoration: none;
}

/* -- CUSTOM LANG STRINGS STYLES ----------- */

.red {
	font-weight: bold;
	color: #c00;
}

/* -- OTHER STYLES ----------- */

.pre_message {
	font-size: 1.3em;
}

/* -- Update check badges -- */
span.update-badge {
	background-image: -moz-linear-gradient(center bottom, #FF0000 41%, #FC7E7E 79%);
	background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.41, rgb(255, 0, 0)), color-stop(0.79, rgb(252, 126, 126)));
	border: 2px solid white;
	border-radius: 1.5em 1.5em 1.5em 1.5em;
	color: white;
	display: block;
	float: left;
	font-size: 1.2em;
	font-weight: bold;
	height: 1.2em;
	left: 60px;
	min-width: 1em;
	padding: 0 0.1em 0;
	position: relative;
	top: -88px;
}

/* User Notes */
.unotes ul, .unotes ol {
	list-style: none;
	list-style-position: inside;
	padding-left: 0;
	padding-right: 0;

}

.unotes div.utitle {
	padding: 10px;
	float: left;
	font-size: 1.2em;
	line-height: 1.2em;
}

.unotes h4 {
	margin-top: 0;
	margin-bottom: 0;
	font-size: 1.3em;
}

.unotes .ubody {
	padding-left: 10px;
	padding-right: 10px;
	font-size: 1.2em;
	line-height: 1.5em;
}

.unotes p {
	padding-bottom: 10px;
}

/* com-install styling */
div#database-sliders {
	margin: 10px;
}

fieldset.uploadform {
	margin-top: 10px;
	margin-bottom: 10px;
	min-height: 200px;
}

/* Installer Database */
#installer-database, #installer-discover, #installer-update, #installer-warnings {
	margin-top: 10px;
}

#installer-database #sidebar {
	float: none
}

#installer-database p.warning {
	padding-left: 20px;
}

#installer-database p.nowarning {
	padding-left: 20px;
}

/* Spinner */
.joomlaupdate_spinner {
	float: left;
	margin-right: 15px;
}

.btn-group {
	position: relative;
	display: inline-block;
}

.btn-group + .btn-group {
	margin-left: 5px;
}

.btn-group > .btn {
	position: relative;
	float: left;
	margin-left: -1px;
}

.icon-48-cpanel {
	height: 50px;
	width: 50%;
}

.well {
	min-height: 20px;
	padding: 19px;
	margin-bottom: 20px;
	background-color: #f5f5f5;
	border: 1px solid #eee;
	border: 1px solid rgba(0, 0, 0, 0.05);
	-webkit-border-radius: 4px;
	-moz-border-radius: 4px;
	border-radius: 4px;
	-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
	-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
	box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
}

.well blockquote {
	border-color: #ddd;
	border-color: rgba(0, 0, 0, 0.15);
}

.well-large {
	padding: 24px;
	-webkit-border-radius: 6px;
	-moz-border-radius: 6px;
	border-radius: 6px;
}

.well-small {
	padding: 9px;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}

/* Striped */
.list-striped,
.row-striped {
	list-style: none;
	line-height: 18px;
	text-align: left;
	vertical-align: middle;
	border-top: 1px solid #dddddd;
	margin-left: 0;
	font-size: 1.2em;
	padding: 9px;
}

.list-striped li,
.list-striped dd,
.row-striped .row,
.row-striped .row-fluid {
	border-bottom: 1px solid #dddddd;
	padding: 8px;
}

.list-striped li:nth-child(odd),
.list-striped dd:nth-child(odd),
.row-striped .row:nth-child(odd),
.row-striped .row-fluid:nth-child(odd) {
	background-color: #f9f9f9;
}

.list-striped li:hover,
.list-striped dd:hover,
.row-striped .row:hover,
.row-striped .row-fluid:hover {
	background-color: #f5f5f5;
}

.row-striped .row-fluid {
	width: 100%;
	box-sizing: border-box;
}

.row-striped .row-fluid [class*="span"] {
	min-height: 10px;
}

.alert {
	padding: 8px 35px 8px 14px;
	margin-bottom: 18px;
	text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
	background-color: #fcf8e3;
	border: 1px solid #fbeed5;
	-webkit-border-radius: 4px;
	-moz-border-radius: 4px;
	border-radius: 4px;
	color: #c09853;
	font-size: 120%;
}

.alert-heading {
	color: inherit;
}

.alert .close {
	position: relative;
	right: -30px;
	top: -5px;
	line-height: 18px;
	float: right;
	font-size: 20px;
	font-weight: bold;
}

.alert-success {
	background-color: #dff0d8;
	border-color: #d6e9c6;
	color: #468847;
}

.alert-danger,
.alert-error {
	background-color: #f2dede;
	border-color: #eed3d7;
	color: #b94a48;
}

.alert-info {
	background-color: #d9edf7;
	border-color: #bce8f1;
	color: #3a87ad;
}

.alert-block {
	padding-top: 14px;
	padding-bottom: 14px;
}

.alert-block > p,
.alert-block > ul {
	margin-bottom: 0;
}

.alert-block p + p {
	margin-top: 5px;
}

.btn-group > .btn:hover, .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active {
	z-index: 2;
}

.btn-group > .btn {
	position: relative;
	float: left;
	margin-left: -1px;
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}

table {
	max-width: 100%;
	background-color: transparent;
	border-collapse: collapse;
	border-spacing: 0;
}

.table {
	width: 100%;
	margin-bottom: 18px;
}

.tab-content > .tab-pane,
.pill-content > .pill-pane {
	display: none;
}

.tab-content > .active,
.pill-content > .active {
	display: block;
}

.tabs-below > .nav-tabs {
	border-top: 1px solid #ddd;
}

#status .btn-toolbar, #status p {
	margin: 0px;
}

.navbar .btn-group {
	margin: 0;
	padding: 5px 5px 6px;
}

/**
 * Media
 */
.media .btn {
	margin: 10px 20px;
}

.thumbnails > li {
	list-style: none outside none;
	float: left;
	margin-bottom: 18px;
	margin-left: 20px;
}

#mediamanager-form {
	margin: 10px;
}
.is-tagbox {
	float: left;
}

/* Item associations */
.item-associations {
	margin: 0;
}
.item-associations li {
	list-style: none;
	display: inline-block;
	margin: 0 0 3px 0;
}
.item-associations li a,
table.adminlist .item-associations li a  {
	color: #ffffff;
}

.hidden {
	display: none;
	visibility: hidden;
}

// Bootstrap Tooltips (need to load last, something is overriding these styles in the CSS, debug later ;-) )
@import "../../../../media/jui/less/tooltip.less";

.tooltip {
	max-width: 400px;
}
.tooltip-inner {
	max-width: none;
	text-align: left;
	text-shadow: none;
}
th .tooltip-inner {
	font-weight: normal;
}
.tooltip.hasimage {
	opacity: 1;
}
fieldset.panelform .tooltip img {
	float: none;
	margin: 0;
}
//Toggle editor button
div.toggle-editor {
	float: right;
}

.text-left {
	text-align: left;
}
.text-right {
	text-align: right;
}
.text-center {
	text-align: center;
}
.module-edit {
	display: inline-block;
}
.break-word {
	word-break: break-all;
	word-wrap: break-word;
}
.muted {
	color: #999;
}
/* Popover minimum height - overwrite bootstrap default */
.popover-content {
    min-height: 33px;
}templates/hathor/less/colour_standard.less000060400000002243152453623430015054 0ustar00// colour_standard.less
//
// Less to compile Hathor in the default colour scheme
// -----------------------------------------------------

/**
 * Main colors:
 * #2c2c2c	Text
 * #054993	Links
 * #ffffff	Background, border, text
 * #f9fade	Background alternate, button/icon/menu background
 * #e5f0fa	Background (input required)
 * #e3e4ca	Background Hover, Right/Bottom icon borders
 * #c7c8b2	Main borders
 * #868778	Top/Left icon hover borders
 * #f6f7db	Right/Bottom icon hover borders
 *
 * Special Use Colors:
 * #a20000	Text Error, border invalid
 * #cccccc	Text (faded)
 * #005800	Text (success)
 * #eeeeee	Background (input disabled)
 * #ffffcf	Background‚ permissions debug
 * #cfffda	Background‚ permissions debug
 * #ffcfcf	Background‚ permissions debug
 */

// Import the variables file first to get common variables loaded
@import "hathor_variables.less";

// Define variables unique to this colour scheme, as well as override variables already defined in the common file
@altBackground:      #f9fade;
@gradientTop:        #f9fade;
@gradientBottom:     #f9fade;
@mainBorder:         #c7c8b2;

// Import the baseline to compile the CSS
@import "colour_baseline.less";
templates/hathor/less/forms.less000060400000010766152453623430013030 0ustar00//
// Forms
// This is a custom version of Bootstrap's forms.less file suited for Hathor's needs
// --------------------------------------------------

// Ensure input-prepend/append never wraps
.input-append input[class*="span"],
.input-append .uneditable-input[class*="span"],
.input-prepend input[class*="span"],
.input-prepend .uneditable-input[class*="span"],
.row-fluid input[class*="span"],
.row-fluid select[class*="span"],
.row-fluid textarea[class*="span"],
.row-fluid .uneditable-input[class*="span"],
.row-fluid .input-prepend [class*="span"],
.row-fluid .input-append [class*="span"] {
  display: inline-block;
}
// Allow us to put symbols and text within the input field for a cleaner look
.input-append,
.input-prepend {
  margin-bottom: 5px;
  font-size: 0;
  white-space: nowrap; // Prevent span and input from separating

  input,
  select,
  .uneditable-input {
    position: relative; // placed here by default so that on :focus we can place the input above the .add-on for full border and box-shadow goodness
    margin-bottom: 0; // prevent bottom margin from screwing up alignment in stacked forms
    *margin-left: 0;
    font-size: @baseFontSize;
    vertical-align: top;
    .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
    // Make input on top when focused so blue border and shadow always show
    &:focus {
      z-index: 2;
    }
  }
  .add-on {
    display: inline-block;
    width: auto;
    height: @baseLineHeight;
    min-width: 16px;
    padding: 4px 5px;
    font-size: @baseFontSize;
    font-weight: normal;
    line-height: @baseLineHeight;
    text-align: center;
    text-shadow: 0 1px 0 @white;
    background-color: @grayLighter;
    border: 1px solid #ccc;
  }
  .add-on,
  .btn {
    margin-left: -1px;
    vertical-align: top;
    .border-radius(0);
  }
  .active {
    background-color: lighten(@green, 30);
    border-color: @green;
  }
}
.input-prepend {
  .add-on,
  .btn {
    margin-right: -1px;
  }
  .add-on:first-child,
  .btn:first-child {
    .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
  }
}
.input-append {
  input,
  select,
  .uneditable-input {
    .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
  }
  .add-on:last-child,
  .btn:last-child {
    .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
  }
}
// Remove all border-radius for inputs with both prepend and append
.input-prepend.input-append {
  input,
  select,
  .uneditable-input {
    .border-radius(0);
  }
  .add-on:first-child,
  .btn:first-child {
    margin-right: -1px;
    .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
  }
  .add-on:last-child,
  .btn:last-child {
    margin-left: -1px;
    .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
  }
}
/* Allow for input prepend/append in search forms */
.form-search .input-append .search-query,
.form-search .input-prepend .search-query {
  .border-radius(0); // Override due to specificity
}
.form-search .input-append .search-query {
  .border-radius(14px 0 0 14px)
}
.form-search .input-append .btn {
  .border-radius(0 14px 14px 0)
}
.form-search .input-prepend .search-query {
  .border-radius(0 14px 14px 0)
}
.form-search .input-prepend .btn {
  .border-radius(14px 0 0 14px)
}
.form-search,
.form-inline,
.form-horizontal {
  input,
  textarea,
  select,
  .help-inline,
  .uneditable-input,
  .input-prepend,
  .input-append {
    display: inline-block;
    .ie7-inline-block();
    margin-bottom: 0;
    vertical-align: middle;
  }
  // Re-hide hidden elements due to specifity
  .hide {
    display: none;
  }
}
// Remove margin for input-prepend/-append
.form-search .input-append,
.form-inline .input-append,
.form-search .input-prepend,
.form-inline .input-prepend {
  margin-bottom: 0;
}
/* Accessible Hidden Elements (good for hidden labels and such) */
.element-invisible{
	position: absolute;
	padding: 0 !important;
	margin: 0 !important;
	border: 0;
	height: 1px;
	width: 1px !important;
	overflow: hidden;
}

// Login form only
// Shared size and type resets
#form-login select,
#form-login input[type="text"],
#form-login input[type="password"] {
  display: inline-block;
  padding: 4px 6px;
  margin-bottom: 9px;
  font-size: @baseFontSize;
  line-height: @baseLineHeight;
  color: @gray;
  .border-radius(@inputBorderRadius);
  width: 175px;
}

/* Field subform repeatable */
.subform-repeatable-wrapper{

	div.btn-toolbar{
		float: none;
	}

	.text-right{
		text-align: right;
	}

	.ui-sortable-helper{
		background: @white;
	}

	tr.ui-sortable-helper{
		display: table;
	}

	.subform-repeatable-group{
		clear: both;
	}
}
templates/hathor/less/icomoon.less000060400000000741152453623430013335 0ustar00@font-face {
	font-family: 'IcoMoon';
	src: url('../../../../media/jui/fonts/IcoMoon.eot');
	src: url('../../../../media/jui/fonts/IcoMoon.eot?#iefix') format('embedded-opentype'),
	url('../../../../media/jui/fonts/IcoMoon.woff') format('woff'),
	url('../../../../media/jui/fonts/IcoMoon.ttf') format('truetype'),
	url('../../../../media/jui/fonts/IcoMoon.svg#IcoMoon') format('svg');
	font-weight: normal;
	font-style: normal;
}
@import "../../../../media/jui/less/icomoon.less";
templates/hathor/less/modals.less000060400000004401152453623430013146 0ustar00// MODALS
// ------

// Recalculate z-index where appropriate
.modal-open {
  .dropdown-menu {  z-index: @zindexDropdown + @zindexModal; }
  .dropdown.open { *z-index: @zindexDropdown + @zindexModal; }
  .popover       {  z-index: @zindexPopover  + @zindexModal; }
  .tooltip       {  z-index: @zindexTooltip  + @zindexModal; }
}

// Background
.modal-backdrop {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: @zindexModalBackdrop;
  background-color: @black;
  // Fade for backdrop
  &.fade { opacity: 0; }
}

.modal-backdrop,
.modal-backdrop.fade.in {
  .opacity(80);
}

// Base modal
div.modal {
  position: fixed;
  top: 50%;
  left: 50%;
  z-index: @zindexModal;
  overflow: auto;
  width: 80%;
  margin: -250px 0 0 -40%;
  background-color: @white;
  border: 1px solid #999;
  border: 1px solid rgba(0,0,0,.3);
  *border: 1px solid #999; /* IE6-7 */
  .border-radius(6px);
  .box-shadow(0 3px 7px rgba(0,0,0,0.3));
  .background-clip(padding-box);
  &.fade {
    .transition(e('opacity .3s linear, top .3s ease-out'));
    top: -25%;
  }
  &.fade.in { top: 50%; }
}
.modal-header {
  padding: 9px 15px;
  border-bottom: 1px solid #eee;
  // Close icon
  .close {
	float: right;
	margin-top: 2px;
  }
}

// Body (where all modal content resides)
.modal-body {
  overflow-y: auto;
  max-height: 400px;
  padding: 15px;
}
// Remove bottom margin if need be
.modal-form {
  margin-bottom: 0;
}

// Footer (for actions)
.modal-footer {
  padding: 14px 15px 15px;
  margin-bottom: 0;
  text-align: right; // right align buttons
  background-color: #f5f5f5;
  border-top: 1px solid #ddd;
  .border-radius(0 0 6px 6px);
  .box-shadow(inset 0 1px 0 @white);
  .clearfix(); // clear it in case folks use .pull-* classes on buttons

  // Properly space out buttons
  .btn + .btn {
    margin-left: 5px;
    margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
  }
  // but override that for button groups
  .btn-group .btn + .btn {
    margin-left: -1px;
  }
}

/* Prevent scrolling on the parent window of a modal */
body.modal-open {
  overflow: hidden;
  -ms-overflow-style: none;
}

/* Buttons bar in modal iframe */
.modal-buttons {
  padding: 15px 0px;
}
.modal-buttons button {
  font-size: 1.2em;
  line-height: 1.6em;
}
templates/hathor/less/hathor_variables.less000060400000010426152453623430015210 0ustar00// hathor_variables.less
//
// Less file containing Bootstrap variables needed to compile its CSS
// -----------------------------------------------------

// Grays
// -------------------------
@black:                 #000000;
@grayDarker:            #222222;
@grayDark:              #333333;
@gray:                  #555555;
@grayLight:             #999999;
@grayLighter:           #eeeeee;
@white:                 #ffffff;

// Accent colors
// -------------------------
@blue:                  #049cdb;
@blueDark:              #0064cd;
@green:                 #46a546;
@red:                   #9d261d;
@yellow:                #ffc40d;
@orange:                #f89406;
@pink:                  #c3325f;
@purple:                #7a43b6;

// Scaffolding
// -------------------------
@bodyBackground:        @white;
@textColor:             #2c2c2c;

// Links
// -------------------------
@linkColor:             #054993;
@linkColorHover:        darken(@linkColor, 15%);

// Typography
// -------------------------
@baseFontSize:          13px;
@baseLineHeight:        15px;

@headingsFontFamily:    inherit; // empty to use BS default, @baseFontFamily
@headingsFontWeight:    bold;    // instead of browser default, bold
@headingsColor:         inherit; // empty to use BS default, @textColor

// Component sizing
// -------------------------
@baseBorderRadius:      4px;
@borderRadiusLarge:     6px;
@borderRadiusSmall:     3px;

// Buttons
// -------------------------
@btnBackground:                     @white;
@btnBackgroundHighlight:            darken(@white, 10%);
@btnBorder:                         #bbb;

@btnPrimaryBackground:              @linkColor;
@btnPrimaryBackgroundHighlight:     spin(@btnPrimaryBackground, 20%);

@btnInfoBackground:                 #5bc0de;
@btnInfoBackgroundHighlight:        #2f96b4;

@btnSuccessBackground:              #62c462;
@btnSuccessBackgroundHighlight:     #51a351;

@btnWarningBackground:              lighten(@orange, 15%);
@btnWarningBackgroundHighlight:     @orange;

@btnDangerBackground:               #ee5f5b;
@btnDangerBackgroundHighlight:      #bd362f;

@btnInverseBackground:              #444;
@btnInverseBackgroundHighlight:     @grayDarker;

// Forms
// -------------------------
@inputBackground:               #e5f0fa;
@inputBorder:                   #ccc;
@inputBorderRadius:             3px;
@inputDisabledBackground:       @grayLighter;
@formActionsBackground:         #f5f5f5;
@inputHeight:                   @baseLineHeight + 10px; // base line-height + 8px vertical padding + 2px top/bottom border

// Z-index master list
// -------------------------
// Used for a bird's eye view of components dependent on the z-axis
// Try to avoid customizing these :)
@zindexDropdown:          1000;
@zindexTooltip:           1030;
@zindexFixedNavbar:       1030;
@zindexModalBackdrop:     1040;
@zindexModal:             1050;
@zindexPopover:           1060;

// Form states and alerts
// -------------------------
@warningText:             #c09853;
@warningBackground:       #fcf8e3;
@warningBorder:           darken(spin(@warningBackground, -10), 3%);

@errorText:               #a20000;
@errorBackground:         #f2dede;
@errorBorder:             darken(spin(@errorBackground, -10), 3%);

@successText:             #005800;
@successBackground:       #dff0d8;
@successBorder:           darken(spin(@successBackground, -10), 5%);

@infoText:                #3a87ad;
@infoBackground:          #d9edf7;
@infoBorder:              darken(spin(@infoBackground, -10), 7%);

// Tooltips and popovers
// -------------------------
@tooltipColor:            @white;
@tooltipBackground:       @black;
@tooltipArrowWidth:       5px;
@tooltipArrowColor:       @tooltipBackground;

@popoverBackground:       @white;
@popoverArrowWidth:       10px;
@popoverArrowColor:       @white;
@popoverTitleBackground:  darken(@popoverBackground, 3%);

// Special enhancement for popovers
@popoverArrowOuterWidth:  @popoverArrowWidth + 1;
@popoverArrowOuterColor:  rgba(0,0,0,.25);

// Variables unique to Hathor
// -------------------------
@toolbarColor:          @linkColor;
@hoverBackground:       #e5d9c3;
@nwBorder:              #868778;
@seBorder:              #f6f7db;
@fadedText:             #cccccc;
@disabledBackground:    #eeeeee;
@permissionDefault:     #ffffcf;
@permissionAllowed:     #cfffda;
@permissionDenied:      #ffcfcf;
templates/hathor/less/colour_baseline.less000060400000103471152453623430015043 0ustar00// colour_baseline.less
//
// Baseline CSS for the Hathor colours.
// Compilers should include this in their colour's imports, but not directly
// compile using this file.
// -----------------------------------------------------

// Core variables and mixins
@import "../../../../media/jui/less/mixins.less";

// Bootstrap Buttons
// Using override for Hathor to target specific instances only
@import "buttons.less";

// Bootstrap Forms
// Using override for Hathor since we're not pulling in all Bootstrap form styles
@import "forms.less";

// Bootstrap Labels and Badges
@import "../../../../media/jui/less/labels-badges.less";

/*
 * General styles
 */
body {
	background-color: @bodyBackground;
	color: @textColor;
}

h1 {
	color: @textColor;
}

a:link {
	color: @linkColor;
}

a:visited {
	color: @linkColor;
}

/*
 * Overall Styles
 */
#header {
	background: @bodyBackground url(../images/j_logo.png) no-repeat;
}

#header h1.title {
	color: @textColor;
}

#nav {
	#gradient > .vertical(@gradientTop, @gradientBottom);
	border: 1px solid @mainBorder;
}

#content {
	background: @bodyBackground;
}

#no-submenu {
	border-bottom: 1px solid @mainBorder;
}

#element-box {
	background: @bodyBackground;
	border-right: 1px solid @mainBorder;
	border-bottom: 1px solid @mainBorder;
	border-left: 1px solid @mainBorder;
}

#element-box.login {
	border-top: 1px solid @mainBorder;
}

/*
 * Various Styles
 */
.enabled,
.success,
.allow,
span.writable {
	color: @successText;
}

.disabled,
p.error,
.warning,
.deny,
span.unwritable {
	color: @errorText;
}

.nowarning {
	color: @textColor;
}

.none,
.protected {
	color: @mainBorder;
}

span.note {
	background: @bodyBackground;
	color: @textColor;
}

div.checkin-tick {
	background: url(../images/admin/tick.png) 20px 50% no-repeat;
}

/*
 * Overlib
 */
.ol-foreground {
	background-color: @altBackground;
}

.ol-background {
	background-color: @successText;
}

.ol-textfont {
	color: @textColor;
}

.ol-captionfont {
	color: @bodyBackground;
}

.ol-captionfont a {
	color: @linkColor;
}

/*
 * Subheader, toolbar, page title
 */
div.subheader .padding {
	background: @bodyBackground;
}

.pagetitle h2 {
	color: @textColor;
}

div.configuration {
	color: @textColor;
	background-image: url(../images/menu/icon-16-config.png);
	background-repeat: no-repeat;
}

div.toolbar-box {
	border-right: 1px solid @mainBorder;
	border-bottom: 1px solid @mainBorder;
	border-left: 1px solid @mainBorder;
	background: @bodyBackground;
}

div.toolbar-list li {
	color: @textColor;
}

div.toolbar-list li.divider {
	border-right: 1px dotted @hoverBackground;
}

div.toolbar-list a {
	border-left: 1px solid @hoverBackground;
	border-top: 1px solid @hoverBackground;
	border-right: 1px solid @mainBorder;
	border-bottom: 1px solid @mainBorder;
	background: @altBackground;
}

div.toolbar-list a:hover {
	border-left: 1px solid @nwBorder;
	border-top: 1px solid @nwBorder;
	border-right: 1px solid @seBorder;
	border-bottom: 1px solid @seBorder;
	background: @hoverBackground;
	color: @toolbarColor;
}

div.btn-toolbar {
	margin-left: 5px;
	padding-top: 3px;
}

div.btn-toolbar li.divider {
	border-right: 1px dotted @hoverBackground;
}

div.btn-toolbar div.btn-group button {
	border-left: 1px solid @hoverBackground;
	border-top: 1px solid @hoverBackground;
	border-right: 1px solid @mainBorder;
	border-bottom: 1px solid @mainBorder;
	#gradient > .vertical(@gradientTop, @gradientBottom);
	padding: 5px 4px 5px 4px;
}

div.btn-toolbar div.btn-group button:hover {
	border-left: 1px solid @nwBorder;
	border-top: 1px solid @nwBorder;
	border-right: 1px solid @seBorder;
	border-bottom: 1px solid @seBorder;
	background: @hoverBackground;
	color: @toolbarColor;
	cursor: pointer;
}

div.btn-toolbar a {
	border-left: 1px solid @hoverBackground;
	border-top: 1px solid @hoverBackground;
	border-right: 1px solid @mainBorder;
	border-bottom: 1px solid @mainBorder;
	#gradient > .vertical(@gradientTop, @gradientBottom);
	padding: 6px 5px;
	text-align: center;
	white-space: nowrap;
	font-size: 1.2em;
	text-decoration: none;
}

div.btn-toolbar a:hover {
	border-left: 1px solid @nwBorder;
	border-top: 1px solid @nwBorder;
	border-right: 1px solid @seBorder;
	border-bottom: 1px solid @seBorder;
	background: @hoverBackground;
	color: @toolbarColor;
	cursor: pointer;
}

div.btn-toolbar div.btn-group button.inactive {
	background: @altBackground;
}

/*
 * Pane Slider pane Toggler styles
 */
.pane-sliders .title {
	color: @textColor;
}

.pane-sliders .panel {
	border: 1px solid @mainBorder;
}

.pane-sliders .panel h3 {
	#gradient > .vertical(@gradientTop, @gradientBottom);
	color: @linkColor;
}

.pane-sliders .panel h3:hover {
	background: @hoverBackground;
}

.pane-sliders .panel h3:hover a {
	text-decoration: none;
}

.pane-sliders .adminlist {
	border: 0 none;
}

.pane-sliders .adminlist td {
	border: 0 none;
}

.pane-toggler span {
	background: transparent url(../images/j_arrow.png) 5px 50% no-repeat;
}

.pane-toggler-down span {
	background: transparent url(../images/j_arrow_down.png) 5px 50% no-repeat;
}

.pane-toggler-down {
	border-bottom: 1px solid @mainBorder;
}

/*
 * Tabs
 */
dl.tabs dt {
	border: 1px solid @mainBorder;
	#gradient > .vertical(@gradientTop, @gradientBottom);
	color: @linkColor;
}

dl.tabs dt:hover {
	background: @hoverBackground;
}

dl.tabs dt.open {
	background: @bodyBackground;
	border-bottom: 1px solid @bodyBackground;
	color: @textColor;
}

dl.tabs dt.open a:visited {
	color: @textColor;
}

dl.tabs dt a:hover {
	text-decoration: none;
}

dl.tabs dt a:focus {
	text-decoration: underline;
}

div.current {
	border: 1px solid @mainBorder;
	background: @bodyBackground;
}

/*
 * New parameter styles
 */
div.current fieldset {
	border: none 0;
}

div.current fieldset.adminform {
	border: 1px solid @mainBorder;
}

/*
 * Login Settings
 */
#login-page .pagetitle h2 {
	background: transparent;
}

#login-page #header {
	border-bottom: 1px solid @mainBorder;
}

#login-page #lock {
	background: url(../images/j_login_lock.png) 50% 0 no-repeat;
}

#login-page #element-box.login {
	#gradient > .vertical(@gradientTop, @gradientBottom);
}

#form-login {
	background: @bodyBackground;
	border: 1px solid @mainBorder;
}

#form-login label {
	color: @textColor;
}

#form-login div.button1 a {
	color: @linkColor;
}

/*
 * Cpanel Settings
 */
#cpanel div.icon a, .cpanel div.icon a {
	color: @linkColor;
	border-left: 1px solid @hoverBackground;
	border-top: 1px solid @hoverBackground;
	border-right: 1px solid @mainBorder;
	border-bottom: 1px solid @mainBorder;
	#gradient > .vertical(@gradientTop, @gradientBottom);
}

#cpanel div.icon a:hover,
#cpanel div.icon a:focus,
.cpanel div.icon a:hover,
.cpanel div.icon a:focus {
	border-left: 1px solid @nwBorder;
	border-top: 1px solid @nwBorder;
	border-right: 1px solid @seBorder;
	border-bottom: 1px solid @seBorder;
	color: @linkColor;
	background: @hoverBackground;
}

/*
 * Form Styles
 */
fieldset {
	border: 1px @mainBorder solid;
}

legend {
	color: @textColor;
}

fieldset ul.checklist input:focus {
	outline: thin dotted @textColor;
}

fieldset#filter-bar {
	border-top: 0 solid @mainBorder;
	border-right: 0 solid @mainBorder;
	border-bottom: 1px solid @mainBorder;
	border-left: 0 solid @mainBorder;
}

fieldset#filter-bar ol, fieldset#filter-bar ul {
	border: 0;
}

fieldset#filter-bar ol li fieldset, fieldset#filter-bar ul li fieldset {
	border: 0;
}

/* Note: these visual cues should be augmented by aria */
.invalid {
	color: @errorText;
}

/* must be augmented by aria at the same time if changed dynamically by js
aria-invalid=true or aria-invalid=false */
input.invalid {
	border: 1px solid @errorText;
}

/* augmented by aria in template javascript */
input.readonly, span.faux-input {
	border: 0;
}

input.required {
	background-color: @inputBackground;
}

input.disabled {
	background-color: @disabledBackground;
}

input, select, span.faux-input {
	background-color: @bodyBackground;
	border: 1px solid @mainBorder;
}

/* Inputs used as buttons */
input[type="button"], input[type="submit"], input[type="reset"] {
	color: @linkColor;
	#gradient > .vertical(@gradientTop, @gradientBottom);
}

input[type="button"]:hover, input[type="button"]:focus,
input[type="submit"]:hover, input[type="submit"]:focus,
input[type="reset"]:hover, input[type="reset"]:focus {
	background: @hoverBackground;
}

textarea {
	background-color: @bodyBackground;
	border: 1px solid @mainBorder;
}

input:focus, select:focus, textarea:focus, option:focus,
input:hover, select:hover, textarea:hover, option:hover {
	background-color: @hoverBackground;
	color: @linkColor;
}

/*
 * Option or Parameter styles
 */
.paramrules {
	background: @altBackground;
}

span.gi {
	color: @mainBorder;
}

/*
 * Admintable Styles
 */
table.admintable td.key, table.admintable td.paramlist_key {
	background-color: @altBackground;
	color: @textColor;
	border-bottom: 1px solid @mainBorder;
	border-right: 1px solid @mainBorder;
}

table.paramlist td.paramlist_description {
	background-color: @altBackground;
	color: @textColor;
	border-bottom: 1px solid @mainBorder;
	border-right: 1px solid @mainBorder;
}

/*
 * Admin Form Styles
 */
fieldset.adminform {
	border: 1px solid @mainBorder;
}

/*
 * Table styles are for use with tabular data
 */
table.adminform {
	background-color: @bodyBackground;
}

table.adminform tr.row0 {
	background-color: @bodyBackground;
}

table.adminform tr.row1 {
	background-color: @hoverBackground;
}

table.adminform th {
	color: @textColor;
	background: @bodyBackground;
}

table.adminform tr {
	border-bottom: 1px solid @mainBorder;
	border-right: 1px solid @mainBorder;
}

/*
 * Adminlist Table layout
 */
table.adminlist {
	border-spacing: 1px;
	background-color: @bodyBackground;
	color: @textColor;
}

table.adminlist.modal {
	border-top: 1px solid @mainBorder;
	border-right: 1px solid @mainBorder;
	border-left: 1px solid @mainBorder;
}

table.adminlist a {
	color: @linkColor;
}

table.adminlist thead th {
	background: @bodyBackground;
	color: @textColor;
	border-bottom: 1px solid @mainBorder;
}

/*
 * Table row styles
 */
table.adminlist tbody tr {
	background: @bodyBackground;
}

table.adminlist tbody tr.row1 {
	background: @bodyBackground;
}

table.adminlist tbody tr.row1:last-child td,
table.adminlist tbody tr.row1:last-child th {
	border-bottom: 1px solid @mainBorder;
}

table.adminlist tbody tr.row0:hover td,
table.adminlist tbody tr.row1:hover td,
table.adminlist tbody tr.row0:hover th,
table.adminlist tbody tr.row1:hover th,
table.adminlist tbody tr.row0:focus td,
table.adminlist tbody tr.row1:focus td,
table.adminlist tbody tr.row0:focus th,
table.adminlist tbody tr.row1:focus th {
	background-color: @hoverBackground;
}

table.adminlist tbody tr td,
table.adminlist tbody tr th {
	border-right: 1px solid @mainBorder;
}

table.adminlist tbody tr td:last-child {
	border-right: none;
}

table.adminlist tbody tr.row0:last-child td,
table.adminlist tbody tr.row0:last-child th {
	border-bottom: 1px solid @mainBorder;
}

table.adminlist tbody tr.row0 td,
table.adminlist tbody tr.row0 th {
	#gradient > .vertical(@gradientTop, @gradientBottom);
}

table.adminlist {
	border-bottom: 0 solid @mainBorder;
}

table.adminlist tfoot tr {
	color: @textColor;
}

/*
 * Table td/th styles
 */
table.adminlist tfoot td,
table.adminlist tfoot th {
	background-color: @bodyBackground;
	border-top: 1px solid @mainBorder;
}

/*
 * Adminlist buttons
 */
table.adminlist tr td.btns a {
	border: 1px solid @mainBorder;
	#gradient > .vertical(@gradientTop, @gradientBottom);
	color: @linkColor;
}

table.adminlist tr td.btns a:hover,
table.adminlist tr td.btns a:active,
table.adminlist tr td.btns a:focus {
	background-color: @bodyBackground;
}

/*
 * Saving order icon styling in admin tables
 */
a.saveorder {
	background: url(../images/admin/filesave.png) no-repeat;
}

a.saveorder.inactive {
	background-position: 0 -16px;
}

/*
 * Saving order icon styling in admin tables
 */
fieldset.batch {
	background: @bodyBackground;
}

/**
 * Button styling
 */
button {
	color: @toolbarColor;
	border: 1px solid @mainBorder;
	#gradient > .vertical(@gradientTop, @gradientBottom);
}

button:hover,
button:focus {
	background: @hoverBackground;
}

.invalid {
	color: #ff0000;
}

/* Button 1 Type */
.button1 {
	border: 1px solid @mainBorder;
	color: @linkColor;
	#gradient > .vertical(@gradientTop, @gradientBottom);
}

/* Use this if you add images to the buttons such as directional arrows */
.button1 a {
	color: @linkColor;
/* add padding if you are using the directional images */
/* padding: 0 30px 0 6px; */
}

.button1 a:hover,
.button1 a:focus {
	background: @hoverBackground;
}

/* Button 2 Type */
.button2-left,
.button2-right {
	border: 1px solid @mainBorder;
	#gradient > .vertical(@gradientTop, @gradientBottom);
}

.button2-left a,
.button2-right a,
.button2-left span,
.button2-right span {
	color: @linkColor;
}

/* these are inactive buttons */
.button2-left span,
.button2-right span {
	color: #999999;
}

.page span,
.blank span {
	color: @linkColor;
}

.button2-left a:hover,
.button2-right a:hover,
.button2-left a:focus,
.button2-right a:focus {
	background: @hoverBackground;
}

/**
 * Pagination styles
 */

/* Grey out the current page number */
.pagination .page span {
	color: #999999;
}

/**
 * Tooltips
 */
.tip {
	background: #000000;
	border: 1px solid #FFFFFF;
}

.tip-title {
	background: url(../images/selector-arrow-std.png) no-repeat;
}

/**
 * Calendar
 */
a img.calendar {
	background: url(../images/calendar.png) no-repeat;
}

/**
 * JGrid styles
 */
.jgrid span.publish {
	background-image: url(../images/admin/tick.png);
}

.jgrid span.unpublish {
	background-image: url(../images/admin/publish_x.png);
}

.jgrid span.archive {
	background-image: url(../images/menu/icon-16-archive.png);
}

.jgrid span.trash {
	background-image: url(../images/menu/icon-16-trash.png);
}

.jgrid span.default {
	background-image: url(../images/menu/icon-16-default.png);
}

.jgrid span.notdefault {
	background-image: url(../images/menu/icon-16-notdefault.png);
}

.jgrid span.checkedout {
	background-image: url(../images/admin/checked_out.png);
}

.jgrid span.downarrow {
	background-image: url(../images/admin/downarrow.png);
}

.jgrid span.downarrow_disabled {
	background-image: url(../images/admin/downarrow0.png);
}

.jgrid span.uparrow {
	background-image: url(../images/admin/uparrow.png);
}

.jgrid span.uparrow_disabled {
	background-image: url(../images/admin/uparrow0.png);
}

.jgrid span.published {
	background-image: url(../images/admin/publish_g.png);
}

.jgrid span.expired {
	background-image: url(../images/admin/publish_r.png);
}

.jgrid span.pending {
	background-image: url(../images/admin/publish_y.png);
}

.jgrid span.warning {
	background-image: url(../images/admin/publish_y.png);
}

/**
 * Toolbar icons
 * These icons are used for the toolbar buttons
 * The classes are constructed dynamically when the toolbar is created
 */
.icon-32-send {
	background-image: url(../images/toolbar/icon-32-send.png);
}

.icon-32-delete {
	background-image: url(../images/toolbar/icon-32-delete.png);
}

.icon-32-help {
	background-image: url(../images/toolbar/icon-32-help.png);
}

.icon-32-cancel {
	background-image: url(../images/toolbar/icon-32-cancel.png);
}

.icon-32-checkin {
	background-image: url(../images/toolbar/icon-32-checkin.png);
}

.icon-32-options {
	background-image: url(../images/toolbar/icon-32-config.png);
}

.icon-32-apply {
	background-image: url(../images/toolbar/icon-32-apply.png);
}

.icon-32-back {
	background-image: url(../images/toolbar/icon-32-back.png);
}

.icon-32-forward {
	background-image: url(../images/toolbar/icon-32-forward.png);
}

.icon-32-save {
	background-image: url(../images/toolbar/icon-32-save.png);
}

.icon-32-edit {
	background-image: url(../images/toolbar/icon-32-edit.png);
}

.icon-32-copy {
	background-image: url(../images/toolbar/icon-32-copy.png);
}

.icon-32-move {
	background-image: url(../images/toolbar/icon-32-move.png);
}

.icon-32-new {
	background-image: url(../images/toolbar/icon-32-new.png);
}

.icon-32-upload {
	background-image: url(../images/toolbar/icon-32-upload.png);
}

.icon-32-assign {
	background-image: url(../images/toolbar/icon-32-publish.png);
}

.icon-32-html {
	background-image: url(../images/toolbar/icon-32-html.png);
}

.icon-32-css {
	background-image: url(../images/toolbar/icon-32-css.png);
}

.icon-32-menus {
	background-image: url(../images/toolbar/icon-32-menu.png);
}

.icon-32-publish {
	background-image: url(../images/toolbar/icon-32-publish.png);
}

.icon-32-unblock {
	background-image: url(../images/toolbar/icon-32-unblock.png);
}

.icon-32-unpublish {
	background-image: url(../images/toolbar/icon-32-unpublish.png);
}

.icon-32-restore {
	background-image: url(../images/toolbar/icon-32-revert.png);
}

.icon-32-trash {
	background-image: url(../images/toolbar/icon-32-trash.png);
}

.icon-32-archive {
	background-image: url(../images/toolbar/icon-32-archive.png);
}

.icon-32-unarchive {
	background-image: url(../images/toolbar/icon-32-unarchive.png);
}

.icon-32-preview {
	background-image: url(../images/toolbar/icon-32-preview.png);
}

.icon-32-default {
	background-image: url(../images/toolbar/icon-32-default.png);
}

.icon-32-refresh {
	background-image: url(../images/toolbar/icon-32-refresh.png);
}

.icon-32-save-new {
	background-image: url(../images/toolbar/icon-32-save-new.png);
}

.icon-32-save-copy {
	background-image: url(../images/toolbar/icon-32-save-copy.png);
}

.icon-32-error {
	background-image: url(../images/toolbar/icon-32-error.png);
}

.icon-32-new-style {
	background-image: url(../images/toolbar/icon-32-new-style.png);
}

.icon-32-delete-style {
	background-image: url(../images/toolbar/icon-32-delete-style.png);
}

.icon-32-purge {
	background-image: url(../images/toolbar/icon-32-purge.png);
}

.icon-32-remove {
	background-image: url(../images/toolbar/icon-32-remove.png);
}

.icon-32-featured {
	background-image: url(../images/toolbar/icon-32-featured.png);
}

.icon-32-unfeatured {
	background-image: url(../images/toolbar/icon-32-featured.png);
	background-position: 0% 100%;
}

.icon-32-export {
	background-image: url(../images/toolbar/icon-32-export.png);
}

.icon-32-stats {
	background-image: url(../images/toolbar/icon-32-stats.png);
}

.icon-32-print {
	background-image: url(../images/toolbar/icon-32-print.png);
}

.icon-32-batch {
	background-image: url(../images/toolbar/icon-32-batch.png);
}

.icon-32-envelope {
	background-image: url(../images/toolbar/icon-32-messaging.png);
}

.icon-32-download {
	background-image: url(../images/toolbar/icon-32-export.png);
}

.icon-32-bars {
	background-image: url(../images/toolbar/icon-32-stats.png);
}

/**
 * Quick Icons
 * Also knows as Header Icons
 * These are used for the Quick Icons on the Control Panel
 * The same classes are also assigned the Component Title
 */
.icon-48-categories {
	background-image: url(../images/header/icon-48-category.png);
}

.icon-48-category-edit {
	background-image: url(../images/header/icon-48-category.png);
}

.icon-48-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}

.icon-48-generic {
	background-image: url(../images/header/icon-48-generic.png);
}

.icon-48-banners {
	background-image: url(../images/header/icon-48-banner.png);
}

.icon-48-banners-categories {
	background-image: url(../images/header/icon-48-banner-categories.png);
}

.icon-48-banners-category-edit {
	background-image: url(../images/header/icon-48-banner-categories.png);
}

.icon-48-banners-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}

.icon-48-banners-clients {
	background-image: url(../images/header/icon-48-banner-client.png);
}

.icon-48-banners-tracks {
	background-image: url(../images/header/icon-48-banner-tracks.png);
}

.icon-48-checkin {
	background-image: url(../images/header/icon-48-checkin.png);
}

.icon-48-clear {
	background-image: url(../images/header/icon-48-clear.png);
}

.icon-48-contact {
	background-image: url(../images/header/icon-48-contacts.png);
}

.icon-48-contact-categories {
	background-image: url(../images/header/icon-48-contacts-categories.png);
}

.icon-48-contact-category-edit {
	background-image: url(../images/header/icon-48-contacts-categories.png);
}

.icon-48-contact-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}

.icon-48-purge {
	background-image: url(../images/header/icon-48-purge.png);
}

.icon-48-cpanel {
	background-image: url(../images/header/icon-48-cpanel.png);
}

.icon-48-config {
	background-image: url(../images/header/icon-48-config.png);
}

.icon-48-groups {
	background-image: url(../images/header/icon-48-groups.png);
}

.icon-48-groups-add {
	background-image: url(../images/header/icon-48-groups-add.png);
}

.icon-48-levels {
	background-image: url(../images/header/icon-48-levels.png);
}

.icon-48-levels-add {
	background-image: url(../images/header/icon-48-levels-add.png);
}

.icon-48-module {
	background-image: url(../images/header/icon-48-module.png);
}

.icon-48-menu {
	background-image: url(../images/header/icon-48-menu.png);
}

.icon-48-menu-add {
	background-image: url(../images/header/icon-48-menu-add.png);
}

.icon-48-menumgr {
	background-image: url(../images/header/icon-48-menumgr.png);
}

.icon-48-trash {
	background-image: url(../images/header/icon-48-trash.png);
}

.icon-48-user {
	background-image: url(../images/header/icon-48-user.png);
}

.icon-48-user-add {
	background-image: url(../images/header/icon-48-user-add.png);
}

.icon-48-user-edit {
	background-image: url(../images/header/icon-48-user-edit.png);
}

.icon-48-user-profile {
	background-image: url(../images/header/icon-48-user-profile.png);
}

.icon-48-inbox {
	background-image: url(../images/header/icon-48-inbox.png);
}

.icon-48-new-privatemessage {
	background-image: url(../images/header/icon-48-new-privatemessage.png);
}

.icon-48-msgconfig {
	background-image: url(../images/header/icon-48-message_config.png);
}

.icon-48-langmanager {
	background-image: url(../images/header/icon-48-language.png);
}

.icon-48-mediamanager {
	background-image: url(../images/header/icon-48-media.png);
}

.icon-48-plugin {
	background-image: url(../images/header/icon-48-plugin.png);
}

.icon-48-help_header {
	background-image: url(../images/header/icon-48-help_header.png);
}

.icon-48-impressions {
	background-image: url(../images/header/icon-48-stats.png);
}

.icon-48-browser {
	background-image: url(../images/header/icon-48-stats.png);
}

.icon-48-searchtext {
	background-image: url(../images/header/icon-48-stats.png);
}

.icon-48-thememanager {
	background-image: url(../images/header/icon-48-themes.png);
}

.icon-48-writemess {
	background-image: url(../images/header/icon-48-writemess.png);
}

.icon-48-featured {
	background-image: url(../images/header/icon-48-featured.png);
}

.icon-48-sections {
	background-image: url(../images/header/icon-48-section.png);
}

.icon-48-article-add {
	background-image: url(../images/header/icon-48-article-add.png);
}

.icon-48-article-edit {
	background-image: url(../images/header/icon-48-article-edit.png);
}

.icon-48-article {
	background-image: url(../images/header/icon-48-article.png);
}

.icon-48-content-categories {
	background-image: url(../images/header/icon-48-category.png);
}

.icon-48-content-category-edit {
	background-image: url(../images/header/icon-48-category.png);
}

.icon-48-content-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}

.icon-48-install {
	background-image: url(../images/header/icon-48-extension.png);
}

.icon-48-dbbackup {
	background-image: url(../images/header/icon-48-backup.png);
}

.icon-48-dbrestore {
	background-image: url(../images/header/icon-48-dbrestore.png);
}

.icon-48-dbquery {
	background-image: url(../images/header/icon-48-query.png);
}

.icon-48-systeminfo {
	background-image: url(../images/header/icon-48-info.png);
}

.icon-48-massmail {
	background-image: url(../images/header/icon-48-massmail.png);
}

.icon-48-redirect {
	background-image: url(../images/header/icon-48-redirect.png);
}

.icon-48-search {
	background-image: url(../images/header/icon-48-search.png);
}

.icon-48-finder {
	background-image: url(../images/header/icon-48-search.png);
}

.icon-48-newsfeeds {
	background-image: url(../images/header/icon-48-newsfeeds.png);
}

.icon-48-newsfeeds-categories {
	background-image: url(../images/header/icon-48-newsfeeds-cat.png);
}

.icon-48-newsfeeds-category-edit {
	background-image: url(../images/header/icon-48-newsfeeds-cat.png);
}

.icon-48-newsfeeds-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}

.icon-48-weblinks {
	background-image: url(../images/header/icon-48-links.png);
}

.icon-48-weblinks-categories {
	background-image: url(../images/header/icon-48-links-cat.png);
}

.icon-48-weblinks-category-edit {
	background-image: url(../images/header/icon-48-links-cat.png);
}

.icon-48-weblinks-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}

.icon-48-tags {
	background-image: url(../images/header/icon-48-tags.png);
}

.icon-48-assoc {
	background-image: url(../images/header/icon-48-assoc.png);
}

.icon-48-puzzle {
 	background-image: url(../images/header/icon-48-puzzle.png);
}

/**
 * General styles
 */
div.message {
	border: 1px solid @mainBorder;
	color: @textColor;
}

.helpFrame {
	border-left: 0 solid @mainBorder;
	border-right: none;
	border-top: none;
	border-bottom: none;
}

.outline {
	border: 1px solid @mainBorder;
	background: @bodyBackground;
}

/**
 * Modal Styles
 */
dl.menu_type dt {
	border-bottom: 1px solid @mainBorder;
}

ul#new-modules-list {
	border-top: 1px solid @mainBorder;
}

/**
 * User Accessibility
 */

/* Skip to Content Visual Styling */
#skiplinkholder a, #skiplinkholder a:link, #skiplinkholder a:visited {
	color: @bodyBackground;
	background: @linkColor;
	border-bottom: solid #336 2px;
}

/**
 * Admin Form Styles
 */
fieldset.panelform {
	border: none 0;
}

/**
 * ACL STYLES relocated from com_users/media/grid.css
 */
a.move_up {
	background-image: url('../images/admin/uparrow.png');
}

span.move_up {
	background-image: url('../images/admin/uparrow0.png');
}

a.move_down {
	background-image: url('../images/admin/downarrow.png');
}

span.move_down {
	background-image: url('../images/admin/downarrow0.png');
}

a.grid_false {
	background-image: url('../images/admin/publish_x.png');
}

a.grid_true {
	background-image: url('../images/admin/tick.png');
}

a.grid_trash {
	background-image: url('../images/admin/icon-16-trash.png');
}

/**
 * ACL PANEL STYLES
 */

/* All Tabs */

tr.row1 {
	background-color: @altBackground;
}

/* Summary Tab */
table.aclsummary-table td.col2,
table.aclsummary-table th.col2,
table.aclsummary-table td.col3,
table.aclsummary-table th.col3,
table.aclsummary-table td.col4,
table.aclsummary-table th.col4,
table.aclsummary-table td.col5,
table.aclsummary-table th.col5,
table.aclsummary-table td.col6,
table.aclsummary-table th.col6,
table.aclmodify-table td.col2,
table.aclmodify-table th.col2 {
	border-left: 1px solid @mainBorder;
}

/* Icons */

span.icon-16-unset {
	background: url(../images/admin/icon-16-denyinactive.png) no-repeat;
}

span.icon-16-allowed {
	background: url(../images/admin/icon-16-allow.png) no-repeat;
}

span.icon-16-denied {
	background: url(../images/admin/icon-16-deny.png) no-repeat;
}

span.icon-16-locked {
	background: url(../images/admin/checked_out.png) 0 0 no-repeat;
}

label.icon-16-allow {
	background: url(../images/admin/icon-16-allow.png) no-repeat;
}

label.icon-16-deny {
	background: url(../images/admin/icon-16-deny.png) no-repeat;
}

a.icon-16-allow {
	background: url(../images/admin/icon-16-allow.png) no-repeat;
}

a.icon-16-deny {
	background: url(../images/admin/icon-16-deny.png) no-repeat;
}

a.icon-16-allowinactive {
	background: url(../images/admin/icon-16-allowinactive.png) no-repeat;
}

a.icon-16-denyinactive {
	background: url(../images/admin/icon-16-denyinactive.png) no-repeat;
}

/* ACL footer/legend */

ul.acllegend li.acl-allowed {
	background: url(../images/admin/icon-16-allow.png) no-repeat left;
}

ul.acllegend li.acl-denied {
	background: url(../images/admin/icon-16-deny.png) no-repeat left;
}

li.acl-editgroups,
li.acl-resetbtn {
	background-color: @altBackground;
	border: 1px solid @mainBorder;
}

li.acl-editgroups a,
li.acl-resetbtn a {
	color: @linkColor;
}

li.acl-editgroups:hover,
li.acl-resetbtn:hover,
li.acl-editgroups:focus,
li.acl-resetbtn:focus {
	background-color: @hoverBackground;
}

/* ACL Config --------- */
table#acl-config {
	border: 1px solid @mainBorder;
}

table#acl-config th,
table#acl-config td {
	background: @altBackground;
	border-bottom: 1px solid @mainBorder;
}

table#acl-config th.acl-groups {
	border-right: 1px solid @mainBorder;
}

/**
* Mod_rewrite Warning
*/
#jform_sef_rewrite-lbl {
	background: url(../images/admin/icon-16-notice-note.png) right top no-repeat;
}

/**
* Permission Rules
*/

#permissions-sliders .tip {
	background: @bodyBackground;
	border: 1px solid @mainBorder;
}

#permissions-sliders ul#rules,
#permissions-sliders ul#rules ul {
	border: solid 0 @mainBorder;
	background: @bodyBackground;
}

ul#rules li .pane-sliders .panel h3.title {
	border: solid 0 @mainBorder;
}

#permissions-sliders ul#rules .pane-slider {
	border: solid 1px @mainBorder;
}

#permissions-sliders ul#rules li h3 {
	border: solid 1px @mainBorder;
}

#permissions-sliders ul#rules li h3.pane-toggler-down a {
	border: solid 0;
}

#permissions-sliders ul#rules .group-kind {
	color: @textColor;
}

#permissions-sliders ul#rules table.group-rules {
	border: solid 1px @mainBorder;
}

#permissions-sliders ul#rules table.group-rules td {
	border-right: solid 1px @mainBorder;
	border-bottom: solid 1px @mainBorder;
}

#permissions-sliders ul#rules table.group-rules th {
	background: @hoverBackground;
	border-right: solid 1px @mainBorder;
	border-bottom: solid 1px @mainBorder;
	color: @textColor;
}

ul#rules table.aclmodify-table {
	border: solid 1px @mainBorder;
}

ul#rules table.group-rules td label {
	border: solid 0 @mainBorder;
}

#permissions-sliders ul#rules .mypanel {
	border: solid 0 @mainBorder;
}

#permissions-sliders  ul#rules  table.group-rules td {
	background: @bodyBackground;
}

#permissions-sliders span.level {
	color: @mainBorder;
	background-image: none;
}

/*
 * Debug styles
 */
.check-0,
table.adminlist tbody td.check-0 {
	background-color: @permissionDefault;
}

.check-a,
table.adminlist tbody td.check-a {
	background-color: @permissionAllowed;
}

.check-d,
table.adminlist tbody td.check-d {
	background-color: @permissionDenied;
}

/**
 * System Messages
 */

#system-message dd ul {
	color: @textColor;
}

#system-message dd.error ul {
	color: @textColor;
}

#system-message dd.message ul {
	color: @textColor;
}

#system-message dd.notice ul {
	color: @textColor;
}

/** CSS file for Accessible Admin Menu
 * based on Matt Carrolls' son of suckerfish
 * with javascript by Bill Tomczak
 */

/* Note: set up the font-size on the id and used 100% on the elements.
	If ul/li/a are different ems, then the shifting back via non-js keyboard
	doesn't work properly */

/**
 * Menu Styling
 */
#menu {
/* this is on the main ul */
	color: @textColor;
}

#menu ul.dropdown-menu {
/* all lists */
	#gradient > .vertical(@gradientTop, @gradientBottom);
	color: @textColor;
}

#menu ul.dropdown-menu li.dropdown-submenu {
	background: url(../images/j_arrow.png) no-repeat right 50%;
}

#menu ul.dropdown-menu li.divider {
	margin-bottom: 0;
	border-bottom: 1px dotted @mainBorder;
}

#menu a {
	color: @toolbarColor;
	background-repeat: no-repeat;
	background-position: left 50%;
}

#menu li {
/* all list items */
	border-right: 1px solid @mainBorder;
	background-color: transparent;
}

#menu li a:hover, #menu li a:focus {
	background-color: @hoverBackground;
}

#menu li.disabled a:hover,
#menu li.disabled a:focus,
#menu li.disabled a {
	color: @mainBorder;
	#gradient > .vertical(@gradientTop, @gradientBottom);
}

#menu li ul {
/* second-level lists */
	border: 1px solid @mainBorder;
}

#menu li li {
/* second-level row */
	background-color: transparent;
}

/**
 * Styling parents
 */

/* 1 level - sfhover */
#menu li.sfhover a {
	background-color: @hoverBackground;
}

/* 2 level - normal */
#menu li.sfhover li a {
	background-color: transparent;
}

/* 2 level - hover */
#menu li.sfhover li.sfhover a, #menu li li a:focus {
	background-color: @hoverBackground;
}

/* 3 level - normal */
#menu li.sfhover li.sfhover li a {
	background-color: transparent;
}

/* 3 level - hover */
#menu li.sfhover li.sfhover li.sfhover a, #menu li li li a:focus {
	background-color: @hoverBackground;
}

/* bring back the focus elements into view */
#menu li li a:focus, #menu li li li a:focus {
	background-color: @hoverBackground;
}

#menu li li li a:focus {
	background-color: @hoverBackground;
}

/**
 * Submenu styling
 */
#submenu {
	border-bottom: 1px solid @mainBorder;
/* border-bottom plus padding-bottom is the technique */
/* This is the background befind the tabs */
/*background: @bodyBackground;*/
}

#submenu li, #submenu span.nolink {
	#gradient > .vertical(@gradientTop, @gradientBottom);
	border: 1px solid @mainBorder;
	color: @linkColor;
}

#submenu li:hover, #submenu li:focus {
	background: @hoverBackground;
}

#submenu li.active, #submenu span.nolink.active {
	background: @bodyBackground;
	border-bottom: 1px solid @bodyBackground;
}

#submenu li.active a,
#submenu span.nolink.active {
	color: #000;
}

.element-invisible {
	margin: 0;
	padding: 0;
}

/* -- Codemirror Editor  ----------- */
div.CodeMirror-wrapping {
	border: 1px solid @mainBorder;
}

/* User Notes */
table.adminform tr.row0 {
	background-color: @bodyBackground;
}

ul.alternating > li:nth-child(odd) {
	background-color: @bodyBackground;
}

ul.alternating > li:nth-child(even) {
	background-color: @altBackground;
}

ol.alternating > li:nth-child(odd) {
	background-color: @bodyBackground;
}

ol.alternating > li:nth-child(even) {
	background-color: @altBackground;
}

/* Installer Database */
#installer-database, #installer-discover, #installer-update, #installer-warnings {
	border-top: 1px solid @mainBorder;
}

#installer-database p.warning {
	background: transparent url(../images/admin/icon-16-deny.png) center left no-repeat;
}

#installer-database p.nowarning {
	background: transparent url(../images/admin/icon-16-allow.png) center left no-repeat;
}

/* Override default bootstrap font-size */
.input-append,
.input-prepend {
	font-size: 1.2em;
}
templates/hathor/less/variables.less000060400000014200152453623430013635 0ustar00// Variables.less
// Variables to customize the look and feel of Bootstrap
// -----------------------------------------------------



// GLOBAL VALUES
// --------------------------------------------------


// Grays
// -------------------------
@black:                 #000;
@grayDarker:            #222;
@grayDark:              #333;
@gray:                  #555;
@grayLight:             #999;
@grayLighter:           #eee;
@white:                 #fff;


// Accent colors
// -------------------------
@blue:                  #049cdb;
@blueDark:              #0064cd;
@green:                 #46a546;
@red:                   #9d261d;
@yellow:                #ffc40d;
@orange:                #f89406;
@pink:                  #c3325f;
@purple:                #7a43b6;


// Scaffolding
// -------------------------
@bodyBackground:        @white;
@textColor:             @grayDark;


// Links
// -------------------------
@linkColor:             #08c;
@linkColorHover:        darken(@linkColor, 15%);


// Typography
// -------------------------
@sansFontFamily:        "Helvetica Neue", Helvetica, Arial, sans-serif;
@serifFontFamily:       Georgia, "Times New Roman", Times, serif;
@monoFontFamily:        Menlo, Monaco, Consolas, "Courier New", monospace;

@baseFontSize:          13px;
@baseFontFamily:        @sansFontFamily;
@baseLineHeight:        18px;
@altFontFamily:         @serifFontFamily;

@headingsFontFamily:    inherit; // empty to use BS default, @baseFontFamily
@headingsFontWeight:    bold;    // instead of browser default, bold
@headingsColor:         inherit; // empty to use BS default, @textColor


// Tables
// -------------------------
@tableBackground:                   transparent; // overall background-color
@tableBackgroundAccent:             #f9f9f9; // for striping
@tableBackgroundHover:              #f5f5f5; // for hover
@tableBorder:                       #ddd; // table and cell border


// Buttons
// -------------------------
@btnBackground:                     @white;
@btnBackgroundHighlight:            darken(@white, 10%);
@btnBorder:                         #ccc;

@btnPrimaryBackground:              #2384d3;
@btnPrimaryBackgroundHighlight:     #15497c;

@btnInfoBackground:                 #5bc0de;
@btnInfoBackgroundHighlight:        #2f96b4;

@btnSuccessBackground:              #62c462;
@btnSuccessBackgroundHighlight:     #51a351;

@btnWarningBackground:              lighten(@orange, 15%);
@btnWarningBackgroundHighlight:     @orange;

@btnDangerBackground:               #ee5f5b;
@btnDangerBackgroundHighlight:      #bd362f;

@btnInverseBackground:              @gray;
@btnInverseBackgroundHighlight:     @grayDarker;


// Forms
// -------------------------
@inputBackground:               @white;
@inputBorder:                   #ccc;
@inputBorderRadius:             3px;
@inputDisabledBackground:       @grayLighter;
@formActionsBackground:         #f5f5f5;

// Dropdowns
// -------------------------
@dropdownBackground:            @white;
@dropdownBorder:                rgba(0,0,0,.2);
@dropdownLinkColor:             @grayDark;
@dropdownLinkColorHover:        @white;
@dropdownLinkBackgroundHover:   @linkColor;
@dropdownDividerTop:            #e5e5e5;
@dropdownDividerBottom:         @white;



// COMPONENT VARIABLES
// --------------------------------------------------

// Z-index master list
// -------------------------
// Used for a bird's eye view of components dependent on the z-axis
// Try to avoid customizing these :)
@zindexDropdown:          1000;
@zindexTooltip:           1020;
@zindexFixedNavbar:       1030;
@zindexModalBackdrop:     1040;
@zindexModal:             1050;
@zindexPopover:           1060;

// Sprite icons path
// -------------------------
@iconSpritePath:          "../img/glyphicons-halflings.png";
@iconWhiteSpritePath:     "../img/glyphicons-halflings-white.png";


// Input placeholder text color
// -------------------------
@placeholderText:         @grayLight;


// Hr border color
// -------------------------
@hrBorder:                @grayLighter;


// Navbar
// -------------------------
@navbarHeight:                    40px;
@navbarBackground:                @grayDarker;
@navbarBackgroundHighlight:       @grayDark;

@navbarText:                      @grayLight;
@navbarLinkColor:                 @grayLight;
@navbarLinkColorHover:            @white;
@navbarLinkColorActive:           @navbarLinkColorHover;
@navbarLinkBackgroundHover:       transparent;
@navbarLinkBackgroundActive:      @navbarBackground;

@navbarSearchBackground:          lighten(@navbarBackground, 25%);
@navbarSearchBackgroundFocus:     @white;
@navbarSearchBorder:              darken(@navbarSearchBackground, 30%);
@navbarSearchPlaceholderColor:    #ccc;
@navbarBrandColor:                @navbarLinkColor;


// Hero unit
// -------------------------
@heroUnitBackground:              @grayLighter;
@heroUnitHeadingColor:            inherit;
@heroUnitLeadColor:               inherit;


// Form states and alerts
// -------------------------
@warningText:             #c09853;
@warningBackground:       #fcf8e3;
@warningBorder:           darken(spin(@warningBackground, -10), 3%);

@errorText:               #b94a48;
@errorBackground:         #f2dede;
@errorBorder:             darken(spin(@errorBackground, -10), 3%);

@successText:             #468847;
@successBackground:       #dff0d8;
@successBorder:           darken(spin(@successBackground, -10), 5%);

@infoText:                #3a87ad;
@infoBackground:          #d9edf7;
@infoBorder:              darken(spin(@infoBackground, -10), 7%);



// GRID
// --------------------------------------------------

// Default 940px grid
// -------------------------
@gridColumns:             12;
@gridColumnWidth:         60px;
@gridGutterWidth:         20px;
@gridRowWidth:            (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1));

// Fluid grid
// -------------------------
@fluidGridColumnWidth:    6.382978723%;
@fluidGridGutterWidth:    2.127659574%;


// Login
// -------------------------
@loginBackground:                 #142849;
@loginBackgroundHighlight:        #165387;

// Header
// -------------------------
@headerBackground:                 #1a3867;
@headerBackgroundHighlight:        #17568c;templates/hathor/template_thumbnail.png000060400000007364152453623430014430 0ustar00�PNG


IHDR���w��PLTE���2d;t6R(Da9|6j>|��������ٜ�ó����觧�����ż��涾���������ڂ���������߃����I{�nt�g��;���-��it��@]������g��ߪ��T]uds�N�pp���Ddh�|w�TBBB�ꁛ͘drOA�8M`�Q՚tRNS@��f
�IDATx웇r�8�F�r7�FF3Z�9nN�d�i����h��%���T�)4���/�7?l��A�/L���s��x{5�wh:7=s�����ֳ�@���쨴PZ��ZiP���۟/4�p0�9�иF�ˑ{J�y�r�\ӸP�����r�w�.
�/��:��Ә��n9�%�O�]���]^�K�\.�;���(��|�Ο?���j�І��!됔M��&/“N�%����@�L�٩�1C�	b�L��� B��D!����@�)�#r����vX$���a�g�A
lB.u;tb������(����9�ȴ�q���SAѪ��*�v��=�XDދ�83Yc��|!��5BN��WAx��kc���bF3�����i��^�5M'����M������
@�Y��R.�9����i���c�|tJ��B�jrTU�����Vm�Y��qI�A)��~�/6w�`s�۞
�q�=Q[:G�?6�O�'"�t,Xo�Rҥ�ke�9r�4�SKZ�1%}�[�8c��S�W�S��(��S�K�0���O���n��au�^8!z~Az!`���CT�q�X��
��w�j�Z�:�m�����[u_M�+�Į<������>�^���(z��敯v�!	$�1g�T���g���V.ԟ�!��c��e|���8����h?�A�GGؑߜ��^^^��ϧ�7��i�]#�j ��K��.��H�A,��@(|���=Q#�=:��Yg���3rr~O<�F���R��R����*�n�ֆgHiIi�Ә�S�SJ����#2��8�ʹM��V�������	ѐ�'=�D֔�M�(������T@�D�ߤc�m��J���qtn*�Eg�wpU D���>�S��DU��˷�ؼ��Z����(�8�0?�[GgOkkw��p6aw��i+c�$��<x����R{
v�	��,H���ּS'��'���kB���L��\��ւ@P`�S�@,�C� ~^Q��t�p4]Ӽ�䈘{1?	7�{)"B��R-J����!u��S�lm^U�*�*9��u���ӣ�m�6%��C6i�@%Hi�����KO��;��0�l�1<w�ܿy��ϝ�q�۷n+�N�v�#ס^��tr�c�!��;��0��S�J3-'��9�z)E�B��{�C^�N=��6}ك-R?�5���b܄�q*Xt�U�Xt/V~ծ���ym��y���:�?�o��wx�p3>_�ϛ�z�N�(���K!�Xڂ���_X�vV��:���
�0���q�^�:��e��Sg��<���>:�\�ھ�:��kS��=X
[:f�9�u'�I��O�ܥ�5��k����9�N�[:�=���h��2z[�[|:�;%s��yqr�hj��t���Mn�3}����.,*�����zu�=��ރ�
�-..V�{�l�0����>o����|�D�	,8p�Z�9vb6�JZ/J�R�� �* 8:�X���/��Z&=��Z)� ����x��+��MI���%�w�s�S�(��98�:H/�#�v�Xl��Z�0Z��{��/���F�Q�[��{Q/���u(7�7�ߪq�a��rjL`j]�	�F2:��C����T�	��):6fC	f�&D㦭�i���`����uDnįW�:'��Z�az�|��f�p�d�u݊a)e׶��^�R-[/e�:~��_H��V�fJ�#OJ���F�jJ��9)/�D�yY����
�KR��1�U�@���(�i�l��cN6��r���+@~����0�s�M	F�P��{L]L�rR�z���ͅ�U\kÊ�be������4�^uÖ|��
+���}k���=�7�s�C��V�4����z#��tf�>�un�2@��ѓ"�����tʡ����U���X��xم�{��^]��K��~�A?�RW���"Z�PX����#uR��hm-�#&��U�E�􊥗�%dw7����l���j���X��O#�!y�N�Ѧ���Swc�tP�%��g���&��\ҁ����g��:��D���$V�.t}bt�"\�.��'��1:������T@�>�xR,����NLg�����KП����uj��1Fmk>��X�5��,零��Q�pֳc��Z�u��\h�S���v�G��b|�������,Δ�7��N<�O��8�Y�?��Q�G�Z �Ɗ^{���<DR��7O�!�t�#P�:{�u��iZdiRf���"I3~�й�s�uT�d�P�t�l�����A�(��c�gȋBֺ&ߦe��\)��:��@'��U�$�(�v2nI!7��f(��EzqUh6
t*�ܷ(�Rq��U$������@'���B�:����T�*�T�����6�m�q�Ż�#�ɾɏ6i��9����N��
����c���{zZ���B�tbS-�b"��=��QX�i����5֕64�i����謎u�K?f0;����c�����~��/
���Uc�ӱLU��e:M%&�&nu���0U'ݬ��B����P���u��Y�����Dls�H�[�d����:��t��Zz�p'��M'u>���'��c8;*��9��A��:+�@Gf""Y\^�́��(�"����u�%�:�(�ŝ��c8n:8h#(�ʍ���AiV$cm�X��UӴ:͡��HZ�7��9���RG�vL�T��Z�����i����
9�
�C#�t���6˹CH�?��萛ntt�v�~�c�w�s�P]˕���)ިՁ�H���X{ԜJUIy't:P[FBI5̨c���!c�P���ƹZ^G:{�kα�y#��7;��rR�E���l�7ĥ}W�*vO�ǃ�8�8��/H�:�DmAz'tp�1q���|WdY�%���u>7;�.�,K�")�>U�U�oZ�P��TKy'�Ν����Oij]�h^
$�|)P���#����ɯ�(R��&�d��i�PUE��&fDg���?�xx)H]IR�'y�%Y��"-v�i2t@���(!�i�t�l�~���{��}|��^
tr7�]R�N$�$�%�f��C^���:��zsyy�\����?u.����Y��u.y��p%��N%���"I	'3I�Av-w�
u���A��C��R�sgg�:�@�8����o�B�_^�Gg�zs�Z����n��
:�rw��5�rOG:��ȹ�̗��������n��C6
��f����j;��o�0��d�H�p�]�8Сb�����4���Z���p�/q��:�V0��::D�G^t����q�& ��s�(�	��t@�J��`k���1횈l��pgI����ɢ��/C8����k��̞�1���H�#�$��}�S��v��͌:=z玫�"I�����f�9Ft�c5=�G'����U�:gȗ�|�3e\���t�t�t�=y%��'�IEND�B`�templates/hathor/component.php000060400000005613152453623430012552 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var JDocumentHtml $this */

// Get additional language strings prefixed with TPL_HATHOR
// @todo: Do we really need this?
$lang = JFactory::getLanguage();
$lang->load('tpl_hathor', JPATH_ADMINISTRATOR)
|| $lang->load('tpl_hathor', JPATH_ADMINISTRATOR . '/templates/hathor/language');

$app = JFactory::getApplication();

// Output as HTML5
$this->setHtml5(true);

// jQuery needed by template.js
JHtml::_('jquery.framework');

// Add template js
JHtml::_('script', 'template.js', array('version' => 'auto', 'relative' => true));

// Add html5 shiv
JHtml::_('script', 'jui/html5.js', array('version' => 'auto', 'relative' => true, 'conditional' => 'lt IE 9'));

// Load optional RTL Bootstrap CSS
JHtml::_('bootstrap.loadCss', false, $this->direction);

// Load system style CSS
JHtml::_('stylesheet', 'templates/system/css/system.css', array('version' => 'auto'));

// Loadtemplate CSS
JHtml::_('stylesheet', 'template.css', array('version' => 'auto', 'relative' => true));

// Load additional CSS styles for colors
if (!$this->params->get('colourChoice'))
{
	$colour = 'standard';
}
else
{
	$colour = htmlspecialchars($this->params->get('colourChoice'));
}

JHtml::_('stylesheet', 'colour_' . $colour . '.css', array('version' => 'auto', 'relative' => true));

// Load additional CSS styles for rtl sites
if ($this->direction === 'rtl')
{
	JHtml::_('stylesheet', 'template_rtl.css', array('version' => 'auto', 'relative' => true));
	JHtml::_('stylesheet', 'colour_' . $colour . '_rtl.css', array('version' => 'auto', 'relative' => true));
}

// Load additional CSS styles for bold Text
if ($this->params->get('boldText'))
{
	JHtml::_('stylesheet', 'boldtext.css', array('version' => 'auto', 'relative' => true));
}

// Load specific language related CSS
JHtml::_('stylesheet', 'administrator/language/' . $lang->getTag() . '/' . $lang->getTag() . '.css', array('version' => 'auto'));

// Load custom.css
JHtml::_('stylesheet', 'custom.css', array('version' => 'auto', 'relative' => true));

// IE specific
JHtml::_('stylesheet', 'ie8.css', array('version' => 'auto', 'relative' => true, 'conditional' => 'IE 8'));
JHtml::_('stylesheet', 'ie7.css', array('version' => 'auto', 'relative' => true, 'conditional' => 'IE 7'));

// Logo file
if ($this->params->get('logoFile'))
{
	$logo = JUri::root() . $this->params->get('logoFile');
}
else
{
	$logo = $this->baseurl . '/templates/' . $this->template . '/images/logo.png';
}

?>
<!DOCTYPE html>
<html lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
<head>
	<jdoc:include type="head" />
</head>
<body class="contentpane">
	<jdoc:include type="message" />
	<jdoc:include type="component" />
</body>
</html>
templates/hathor/favicon.ico000060400000003743152453623430012162 0ustar00�PNG


IHDR�asRGB���	pHYs��$iTXtXML:com.adobe.xmp<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:tiff="http://ns.adobe.com/tiff/1.0/"
            xmlns:exif="http://ns.adobe.com/exif/1.0/"
            xmlns:dc="http://purl.org/dc/elements/1.1/"
            xmlns:xmp="http://ns.adobe.com/xap/1.0/">
         <tiff:ResolutionUnit>2</tiff:ResolutionUnit>
         <tiff:Compression>5</tiff:Compression>
         <tiff:XResolution>72</tiff:XResolution>
         <tiff:Orientation>1</tiff:Orientation>
         <tiff:YResolution>72</tiff:YResolution>
         <exif:PixelXDimension>16</exif:PixelXDimension>
         <exif:ColorSpace>1</exif:ColorSpace>
         <exif:PixelYDimension>16</exif:PixelYDimension>
         <dc:subject>
            <rdf:Seq/>
         </dc:subject>
         <xmp:ModifyDate>2015:03:15 13:03:46</xmp:ModifyDate>
         <xmp:CreatorTool>Pixelmator 3.3.1</xmp:CreatorTool>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
>Iv]XIDAT8}�]h\E�ϙ�{wﺻI]m�XClK4�RE�w-E��(->�f|)y�~(Z�"ȢA�R�h�Z�B46M��-$ӆ6&-k41����c�xn��S��\����s��g;^��t}�Pc{���յ��
׽�uQ��{VJ�5"I"�:�����X���7���O))����:L;�j8�lQ�P ��%!��럒|2��qye��4��m�m<3�@�!��$�+c粒���J�ۤ-S�R��Hk�A8$��k���
)��[�O�/�ov,�6�˔�}�O0|�
��n�����N�ҀF�{Ӂ�{ǽLK�)��{�|�G�� ʭ�"W���?��X-����Y�W�~Rn�2�˰o.� x�*S߇�Kê:
�4`DF�oԝ.(Y�&pKq��ѵX�n���9�bbn��|��cc�N��ݛZĴ�&��ܖۑ�t�B���Trj]ޱ*�Sxqd�w?��	p�|���n�)3^E8Y��⑷g"rU`Wn�A�O�5���?�H�lpY[��Q8��+��]��r�q�oޱe��t����j	Z�G�O\}�����r���7�wَ�C����V6t�b70j�#Ū�!��_WH+��R����F&/������Ϗ��j.9W���xZA!�/�W>	`[�X;���GP���w6�V���R�{4w�e��WD�0�Α�h�������Lȣ��%J�Л��z����=i ZϰŠ��Q����^"���O:58՛�k��~h���l`M��ǽS�qV1DZ���m���hb��w�yu�K����o��;�������DS(IEND�B`�templates/hathor/html/com_associations/associations/default.php000060400000014630152453623430021173 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_associations
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('AssociationsHelper', JPATH_ADMINISTRATOR . '/components/com_associations/helpers/associations.php');

JHtml::_('jquery.framework');
JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$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          = 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);
		}
	};
');
?>
<form action="<?php echo JRoute::_('index.php?option=com_associations&view=associations'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
	<?php if (empty($this->items)) : ?>
		<div class="alert alert-no-items">
			<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
		</div>
	<?php else : ?>
		<table class="adminlist" id="associationsList">
			<thead>
				<tr>
					<?php if (!empty($this->typeSupports['state'])) : ?>
						<th width="1%" class="center nowrap">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'state', $listDirn, $listOrder); $colSpan++; ?>
						</th>
					<?php endif; ?>
					<th class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'title', $listDirn, $listOrder); ?>
					</th>
					<th width="15%" class="nowrap">
						<?php echo JText::_('JGRID_HEADING_LANGUAGE'); ?>
					</th>
					<th width="5%" class="nowrap">
						<?php echo JText::_('COM_ASSOCIATIONS_HEADING_ASSOCIATION'); ?>
					</th>
					<th width="15%" class="nowrap">
						<?php echo JText::_('COM_ASSOCIATIONS_HEADING_NO_ASSOCIATION'); ?>
					</th>
					<?php if (!empty($this->typeFields['menutype'])) : ?>
						<th width="10%" class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_ASSOCIATIONS_HEADING_MENUTYPE', 'menutype_title', $listDirn, $listOrder); $colSpan++; ?>
						</th>
					<?php endif; ?>
					<?php if (!empty($this->typeFields['access'])) : ?>
						<th width="5%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ACCESS', 'access_level', $listDirn, $listOrder); $colSpan++; ?>
						</th>
					<?php endif; ?>
					<th width="1%" class="nowrap hidden-phone">
						<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'id', $listDirn, $listOrder); ?>
					</th>
				</tr>
			</thead>
			<tfoot>
				<tr>
					<td colspan="<?php echo $colSpan; ?>">
						<?php echo $this->pagination->getListFooter(); ?>
					</td>
				</tr>
			</tfoot>
			<tbody>
			<?php foreach ($this->items as $i => $item) :
				$canCheckin = true;
				$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);
				?>
				<tr class="row<?php echo $i % 2; ?>">
					<?php if (!empty($this->typeSupports['state'])) : ?>
						<td class="center">
							<span class="<?php echo $iconStates[$this->escape($item->state)]; ?>"></span>
						</td>
					<?php endif; ?>
					<td class="nowrap has-context">
						<?php if (isset($item->level)) : ?>
							<?php echo JLayoutHelper::render('joomla.html.treeprefix', array('level' => $item->level)); ?>
						<?php endif; ?>
						<?php if ($canCheckin && $isCheckout) : ?>
							<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'associations.', $canCheckin); ?>
						<?php endif; ?>
						<?php if ($canEdit && !$isCheckout) : ?>
							<a href="<?php echo JRoute::_($this->editUri . '&id=' . (int) $item->id); ?>">
							<?php echo $this->escape($item->title); ?></a>
						<?php else : ?>
							<span title="<?php echo JText::sprintf('JFIELD_ALIAS_LABEL', $this->escape($item->alias)); ?>"><?php echo $this->escape($item->title); ?></span>
						<?php endif; ?>
						<?php if (!empty($this->typeFields['alias'])) : ?>
							<span class="small">
								<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias)); ?>
							</span>
						<?php endif; ?>
						<?php if (!empty($this->typeFields['catid'])) : ?>
							<div class="small">
								<?php echo JText::_('JCATEGORY') . ": " . $this->escape($item->category_title); ?>
							</div>
						<?php endif; ?>
					</td>
					<td class="small">
						<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
					</td>
					<td>
						<?php echo AssociationsHelper::getAssociationHtmlList($this->extensionName, $this->typeName, (int) $item->id, $item->language, !$isCheckout, false); ?>
					</td>
					<td>
						<?php echo AssociationsHelper::getAssociationHtmlList($this->extensionName, $this->typeName, (int) $item->id, $item->language, !$isCheckout, true); ?>
					</td>
					<?php if (!empty($this->typeFields['menutype'])) : ?>
						<td class="small">
							<?php echo $this->escape($item->menutype_title); ?>
						</td>
					<?php endif; ?>
					<?php if (!empty($this->typeFields['access'])) : ?>
						<td class="small hidden-phone">
							<?php echo $this->escape($item->access_level); ?>
						</td>
					<?php endif; ?>
					<td class="hidden-phone">
						<?php echo $item->id; ?>
					</td>
				</tr>
				<?php endforeach; ?>
			</tbody>
		</table>
	<?php endif; ?>
	<input type="hidden" name="task" value=""/>
	<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/com_redirect/links/default.php000060400000015245152453623430016721 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.multiselect');

$user      = JFactory::getUser();
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>

<form action="<?php echo JRoute::_('index.php?option=com_redirect&view=links'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_REDIRECT_SEARCH_LINKS'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>

		<div class="filter-select">
			<label class="selectlabel" for="filter_published">
				<?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?>
			</label>
			<select name="filter_state" id="filter_published">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED');?></option>
				<?php echo JHtml::_('select.options', RedirectHelper::publishedOptions(), 'value', 'text', $this->state->get('filter.state'), true);?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>
	<div class="clr"> </div>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'COM_REDIRECT_HEADING_OLD_URL', 'a.old_url', $listDirn, $listOrder); ?>
				</th>
				<th class="width-30">
					<?php echo JHtml::_('grid.sort', 'COM_REDIRECT_HEADING_NEW_URL', 'a.new_url', $listDirn, $listOrder); ?>
				</th>
				<th class="width-30">
					<?php echo JHtml::_('grid.sort', 'COM_REDIRECT_HEADING_REFERRER', 'a.referer', $listDirn, $listOrder); ?>
				</th>
				<th class="width-10">
					<?php echo JHtml::_('grid.sort', 'COM_REDIRECT_HEADING_CREATED_DATE', 'a.created_date', $listDirn, $listOrder); ?>
				</th>
				<th width="1%" class="nowrap">
					<?php echo JHtml::_('grid.sort', 'COM_REDIRECT_HEADING_HITS', 'a.hits', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap state-col">
					<?php echo JHtml::_('grid.sort', 'JSTATUS', 'a.published', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) :
			$canCreate = $user->authorise('core.create',     'com_redirect');
			$canEdit   = $user->authorise('core.edit',       'com_redirect');
			$canChange = $user->authorise('core.edit.state', 'com_redirect');
			?>
			<tr class="row<?php echo $i % 2; ?>">
				<td class="center">
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				</td>
				<td>
					<?php if ($canEdit) : ?>
						<a href="<?php echo JRoute::_('index.php?option=com_redirect&task=link.edit&id='.$item->id);?>" title="<?php echo $this->escape($item->old_url); ?>">
							<?php echo $this->escape(str_replace(JUri::root(), '', rawurldecode($item->old_url))); ?></a>
					<?php else : ?>
							<?php echo $this->escape(str_replace(JUri::root(), '', rawurldecode($item->old_url))); ?>
					<?php endif; ?>
				</td>
				<td>
					<?php echo $this->escape(rawurldecode($item->new_url)); ?>
				</td>
				<td>
					<?php echo $this->escape($item->referer); ?>
				</td>
				<td class="center">
					<?php echo JHtml::_('date', $item->created_date, JText::_('DATE_FORMAT_LC4')); ?>
				</td>
				<td class="center">
					<?php echo (int) $item->hits; ?>
				</td>
				<td class="center">
					<?php echo JHtml::_('redirect.published', $item->published, $i); ?>
				</td>
				<td class="center">
					<?php echo (int) $item->id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php //Load the batch processing form if user is allowed ?>
	<?php if ($user->authorise('core.create', 'com_redirect')
		&& $user->authorise('core.edit', 'com_redirect')
		&& $user->authorise('core.edit.state', 'com_redirect')) : ?>
		<?php echo JHtml::_(
			'bootstrap.renderModal',
			'collapseModal',
			array(
				'title'  => JText::_('COM_REDIRECT_BATCH_OPTIONS'),
				'footer' => $this->loadTemplate('batch_footer'),
			),
			$this->loadTemplate('batch_body')
		); ?>
	<?php endif;?>

	<?php echo $this->pagination->getListFooter(); ?>
	<p class="footer-tip">
		<?php if ($this->enabled && $this->collect_urls_enabled) : ?>
			<span class="enabled"><?php echo JText::sprintf('COM_REDIRECT_COLLECT_URLS_ENABLED', JText::_('COM_REDIRECT_PLUGIN_ENABLED')); ?></span>
		<?php elseif ($this->enabled && !$this->collect_urls_enabled) : ?>
			<?php $link = JHtml::_(
				'link',
				JRoute::_('index.php?option=com_plugins&task=plugin.edit&extension_id=' . RedirectHelper::getRedirectPluginId()),
				JText::_('COM_REDIRECT_SYSTEM_PLUGIN')
			);
			?>
			<span class="enabled"><?php echo JText::sprintf('COM_REDIRECT_COLLECT_MODAL_URLS_DISABLED', JText::_('COM_REDIRECT_PLUGIN_ENABLED'), $link); ?></span>
		<?php elseif (!$this->enabled) : ?>
			<span class="disabled"><?php echo JText::sprintf('COM_REDIRECT_PLUGIN_DISABLED', 'index.php?option=com_plugins&task=plugin.edit&extension_id=' . RedirectHelper::getRedirectPluginId()); ?></span>
		<?php endif; ?>
	</p>
	<div class="clr"></div>

	<?php if (!empty($this->items)) : ?>
		<?php echo $this->loadTemplate('addform'); ?>
	<?php endif; ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
</div>
</form>
templates/hathor/html/com_installer/manage/default.php000060400000011056152453623430017221 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.multiselect');
JHtml::_('bootstrap.tooltip');

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>

<div id="installer-manage">
<form action="<?php echo JRoute::_('index.php?option=com_installer&view=manage');?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<?php if ($this->showMessage) : ?>
		<?php echo $this->loadTemplate('message'); ?>
	<?php endif; ?>

	<?php if ($this->ftp) : ?>
		<?php echo $this->loadTemplate('ftp'); ?>
	<?php endif; ?>

	<?php echo $this->loadTemplate('filter'); ?>

	<?php if (count($this->items)) : ?>
	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th class="title nowrap">
					<?php echo JHtml::_('grid.sort', 'COM_INSTALLER_HEADING_NAME', 'name', $listDirn, $listOrder); ?>
				</th>
				<th>
					<?php echo JHtml::_('grid.sort', 'COM_INSTALLER_HEADING_LOCATION', 'client_id', $listDirn, $listOrder); ?>
				</th>
				<th class="width-10 center">
					<?php echo JHtml::_('grid.sort', 'JSTATUS', 'status', $listDirn, $listOrder); ?>
				</th>
				<th class="center">
					<?php echo JHtml::_('grid.sort', 'COM_INSTALLER_HEADING_TYPE', 'type', $listDirn, $listOrder); ?>
				</th>
				<th class="width-10 center">
					<?php echo JText::_('JVERSION'); ?>
				</th>
				<th class="width-10">
					<?php echo JText::_('JDATE'); ?>
				</th>
				<th class="width-15 center">
					<?php echo JText::_('JAUTHOR'); ?>
				</th>
				<th>
					<?php echo JHtml::_('grid.sort', 'COM_INSTALLER_HEADING_FOLDER', 'folder', $listDirn, $listOrder); ?>
				</th>
				<th>
					<?php echo JHtml::_('grid.sort', 'COM_INSTALLER_HEADING_PACKAGE_ID', 'package_id', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JHtml::_('grid.sort', 'COM_INSTALLER_HEADING_ID', 'extension_id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) : ?>
			<tr class="row<?php echo $i % 2; if ($item->status == 2) echo ' protected';?>">
				<td>
					<?php echo JHtml::_('grid.id', $i, $item->extension_id); ?>
				</td>
				<td>
					<span class="bold hasTooltip" title="<?php echo JHtml::_('tooltipText', $item->name, $item->description, 0); ?>">
						<?php echo $item->name; ?>
					</span>
				</td>
				<td class="center">
					<?php echo $item->client; ?>
				</td>
				<td class="center">
					<?php if (!$item->element) : ?>
					<strong>X</strong>
					<?php else : ?>
						<?php echo JHtml::_('InstallerHtml.Manage.state', $item->status, $i, $item->status < 2, 'cb'); ?>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo JText::_('COM_INSTALLER_TYPE_' . $item->type); ?>
				</td>
				<td class="center">
					<?php echo @$item->version != '' ? $item->version : '&#160;'; ?>
				</td>
				<td class="center">
					<?php echo @$item->creationDate != '' ? $item->creationDate : '&#160;'; ?>
				</td>
				<td class="center">
					<span class="editlinktip hasTooltip" title="<?php echo JHtml::_('tooltipText', JText::_('COM_INSTALLER_AUTHOR_INFORMATION'), $item->author_info, 0); ?>">
						<?php echo @$item->author != '' ? $item->author : '&#160;'; ?>
					</span>
				</td>
				<td class="center">
					<?php echo @$item->folder != '' ? $item->folder : JText::_('COM_INSTALLER_TYPE_NONAPPLICABLE'); ?>
				</td>
				<td class="center">
					<?php echo $item->package_id ?: JText::_('COM_INSTALLER_TYPE_NONAPPLICABLE'); ?>
				</td>
				<td>
					<?php echo $item->extension_id ?>
				</td>
			</tr>
		<?php endforeach; ?>
		</tbody>
	</table>
	<?php echo $this->pagination->getListFooter(); ?>
	<?php endif; ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
</div>
templates/hathor/html/com_installer/manage/default_filter.php000060400000005470152453623430020571 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

?>
<fieldset id="filter-bar">
<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
	<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_INSTALLER_FILTER_LABEL'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
	</div>

	<div class="filter-select">
			<label class="selectlabel" for="filter_client_id">
				<?php echo JText::_('COM_INSTALLER_VALUE_CLIENT_SELECT'); ?>
			</label>
			<select name="filter_client_id" id="filter_client_id">
				<?php echo JHtml::_('select.options', array('0' => JText::_('JSITE'), '1' => JText::_('JADMINISTRATOR')), 'value', 'text', $this->state->get('filter.client_id'), true); ?>
			</select>

			<label class="selectlabel" for="filter_status">
				<?php echo JText::_('COM_INSTALLER_VALUE_STATE_SELECT'); ?>
			</label>
			<select name="filter_status" id="filter_status">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?></option>
				<?php echo JHtml::_('select.options', InstallerHelper::getStateOptions(), 'value', 'text', $this->state->get('filter.status'), true); ?>
			</select>

			<label class="selectlabel" for="filter_type">
				<?php echo JText::_('COM_INSTALLER_VALUE_TYPE_SELECT'); ?>
			</label>
			<select name="filter_type" id="filter_type">
				<option value=""><?php echo JText::_('COM_INSTALLER_VALUE_TYPE_SELECT'); ?></option>
				<?php echo JHtml::_('select.options', InstallerHelper::getExtensionTypes(), 'value', 'text', $this->state->get('filter.type'), true); ?>
			</select>

			<label class="selectlabel" for="filter_folder">
				<?php echo JText::_('COM_INSTALLER_VALUE_FOLDER_SELECT'); ?>
			</label>
			<select name="filter_folder" id="filter_folder">
				<option value=""><?php echo JText::_('COM_INSTALLER_VALUE_FOLDER_SELECT'); ?></option>
				<?php echo JHtml::_('select.options', array_merge(InstallerHelper::getExtensionGroupes(), array('*' => JText::_('COM_INSTALLER_VALUE_FOLDER_NONAPPLICABLE'))), 'value', 'text', $this->state->get('filter.folder'), true); ?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>

		</div>

</fieldset>
<div class="clr"></div>
templates/hathor/html/com_installer/discover/default.php000060400000007701152453623430017611 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>

<div id="installer-discover">
<form action="<?php echo JRoute::_('index.php?option=com_installer&view=discover');?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<?php if ($this->showMessage) : ?>
		<?php echo $this->loadTemplate('message'); ?>
	<?php endif; ?>

	<?php if ($this->ftp) : ?>
		<?php echo $this->loadTemplate('ftp'); ?>
	<?php endif; ?>

	<?php if (count($this->items)) : ?>
	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col"><input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" /></th>
				<th class="title nowrap"><?php echo JHtml::_('grid.sort', 'COM_INSTALLER_HEADING_NAME', 'name', $listDirn, $listOrder); ?></th>
				<th class="center"><?php echo JHtml::_('grid.sort', 'COM_INSTALLER_HEADING_TYPE', 'type', $listDirn, $listOrder); ?></th>
				<th class="width-10 center"><?php echo JText::_('JVERSION'); ?></th>
				<th class="width-10 center"><?php echo JText::_('JDATE'); ?></th>
				<th><?php echo JHtml::_('grid.sort', 'COM_INSTALLER_HEADING_FOLDER', 'folder', $listDirn, $listOrder); ?></th>
				<th><?php echo JHtml::_('grid.sort', 'COM_INSTALLER_HEADING_CLIENT', 'client_id', $listDirn, $listOrder); ?></th>
				<th class="width-15 center"><?php echo JText::_('JAUTHOR'); ?></th>
				<th class="nowrap id-col"><?php echo JHtml::_('grid.sort', 'COM_INSTALLER_HEADING_ID', 'extension_id', $listDirn, $listOrder); ?></th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) : ?>
			<tr class="row<?php echo $i % 2;?>">
				<td><?php echo JHtml::_('grid.id', $i, $item->extension_id); ?></td>
				<td><span class="bold hasTooltip" title="<?php echo JHtml::_('tooltipText', $item->name, $item->description, 0); ?>"><?php echo $item->name; ?></span></td>
				<td class="center"><?php echo JText::_('COM_INSTALLER_TYPE_' . $item->type); ?></td>
				<td class="center"><?php echo @$item->version != '' ? $item->version : '&#160;'; ?></td>
				<td class="center"><?php echo @$item->creationDate != '' ? $item->creationDate : '&#160;'; ?></td>
				<td class="center"><?php echo @$item->folder != '' ? $item->folder : JText::_('COM_INSTALLER_TYPE_NONAPPLICABLE'); ?></td>
				<td class="center"><?php echo $item->client; ?></td>
				<td class="center">
					<span class="editlinktip hasTooltip" title="<?php echo JHtml::_('tooltipText', JText::_('COM_INSTALLER_AUTHOR_INFORMATION'), $item->author_info, 0); ?>">
						<?php echo @$item->author != '' ? $item->author : '&#160;'; ?>
					</span>
				</td>
				<td><?php echo $item->extension_id ?></td>
			</tr>
		<?php endforeach; ?>
		</tbody>
	</table>
	<?php echo $this->pagination->getListFooter(); ?>
	<?php echo JText::_('COM_INSTALLER_MSG_DISCOVER_DESCRIPTION'); ?>
	<?php else : ?>
		<p class="nowarning">
			<?php echo JText::_('COM_INSTALLER_MSG_DISCOVER_DESCRIPTION'); ?>
		</p>
		<p class="nowarning">
			<?php echo JText::_('COM_INSTALLER_MSG_DISCOVER_NOEXTENSION'); ?>
		</p>
	<?php endif; ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
</div>
templates/hathor/html/com_installer/install/default.php000060400000000631152453623430017434 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<?php if ($this->showMessage) : ?>
<?php echo $this->loadTemplate('message'); ?>
<?php endif; ?>
<?php echo $this->loadTemplate('form'); ?>
templates/hathor/html/com_installer/install/default_form.php000060400000012251152453623430020460 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// MooTools is loaded for B/C for extensions generating JavaScript in their install scripts, this call will be removed at 4.0
JHtml::_('behavior.framework', true);
JHtml::_('bootstrap.tooltip');

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function()
	{
		var form = document.getElementById('adminForm');

		// do field validation
		if (form.install_package.value == ''){
			alert('" . JText::_('COM_INSTALLER_MSG_INSTALL_PLEASE_SELECT_A_PACKAGE', true) . "');
		}
		else
		{
			form.installtype.value = 'upload';
			form.submit();
		}
	};

	Joomla.submitbutton3 = function()
	{
		var form = document.getElementById('adminForm');

		// do field validation
		if (form.install_directory.value == ''){
			alert('" . JText::_('COM_INSTALLER_MSG_INSTALL_PLEASE_SELECT_A_DIRECTORY', true) . "');
		}
		else
		{
			JoomlaInstaller.showLoading();
			form.installtype.value = 'folder';
			form.submit();
		}
	};

	Joomla.submitbutton4 = function()
	{
		var form = document.getElementById('adminForm');

		// do field validation
		if (form.install_url.value == '' || form.install_url.value == 'http://' || form.install_url.value == 'https://'){
			alert('" . JText::_('COM_INSTALLER_MSG_INSTALL_ENTER_A_URL', true) . "');
		}
		else
		{
			form.installtype.value = 'url';
			form.submit();
		}
	};

	Joomla.submitbuttonInstallWebInstaller = function()
	{
		var form = document.getElementById('adminForm');

		form.install_url.value = 'https://appscdn.joomla.org/webapps/jedapps/webinstaller.xml';

		Joomla.submitbutton4();
	};

	// Add spindle-wheel for installations:
	jQuery(document).ready(function($) {
		var outerDiv = $(\"#installer-install\");
		
		JoomlaInstaller.getLoadingOverlay()
			.css(\"top\", outerDiv.position().top - $(window).scrollTop())
			.css(\"left\", \"0\")
			.css(\"width\", \"100%\")
			.css(\"height\", \"100%\")
			.css(\"display\", \"none\")
			.css(\"margin-top\", \"-10px\");
	});
	
	var JoomlaInstaller = {
		getLoadingOverlay: function () {
			return jQuery(\"#loading\");
		},
		showLoading: function () {
			this.getLoadingOverlay().css(\"display\", \"block\");
		},
		hideLoading: function () {
			this.getLoadingOverlay().css(\"display\", \"none\");
		}
	};
");

JFactory::getDocument()->addStyleDeclaration(
	'
	#loading {
		background: rgba(255, 255, 255, .8) url(\'' . JHtml::_('image', 'jui/ajax-loader.gif', '', null, true, true) . '\') 50% 15% no-repeat;
		position: fixed;
		opacity: 0.8;
		-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity = 80);
		filter: alpha(opacity = 80);
		overflow: hidden;
	}
	'
);
?>
<div id="installer-install" class="clearfix">
	<form enctype="multipart/form-data" action="<?php echo JRoute::_('index.php?option=com_installer&view=install');?>" method="post" name="adminForm" id="adminForm">
		<?php if (!empty($this->sidebar)) : ?>
			<div id="j-sidebar-container" class="span2">
				<?php echo $this->sidebar; ?>
			</div>
			<div id="j-main-container" class="span10">
		<?php else : ?>
			<div id="j-main-container">
		<?php endif;?>

		<?php if ($this->showJedAndWebInstaller && !$this->showMessage) : ?>
			<div class="alert j-jed-message" style="margin-bottom: 20px; line-height: 2em; color:#333333; clear:both;">
				<a href="index.php?option=com_config&view=component&component=com_installer&path=&return=<?php echo urlencode(base64_encode(JUri::getInstance())); ?>" class="close hasTooltip icon-options" data-dismiss="alert" title="<?php echo str_replace('"', '&quot;', JText::_('COM_INSTALLER_SHOW_JED_INFORMATION_TOOLTIP')); ?>"></a>
				<p><?php echo JText::_('COM_INSTALLER_INSTALL_FROM_WEB_INFO'); ?>&nbsp;<?php echo JText::_('COM_INSTALLER_INSTALL_FROM_WEB_TOS'); ?></p>
				<input class="btn" type="button" value="<?php echo JText::_('COM_INSTALLER_INSTALL_FROM_WEB_ADD_TAB'); ?>" onclick="Joomla.submitbuttonInstallWebInstaller()" />
			</div>
		<?php endif; ?>

		<?php if ($this->ftp) : ?>
			<?php echo $this->loadTemplate('ftp'); ?>
		<?php endif; ?>
		<div class="width-70 fltlft">

			<?php $firstTab = JEventDispatcher::getInstance()->trigger('onInstallerViewBeforeFirstTab', array()); ?>

			<?php // Show installation fieldsets ?>
			<?php $tabs = JEventDispatcher::getInstance()->trigger('onInstallerAddInstallationTab', array()); ?>
			<?php foreach ($tabs as $tab) : ?>
				<fieldset class="uploadform">
					<?php echo $tab['content']; ?>
				</fieldset>
			<?php endforeach; ?>

			<?php $lastTab = JEventDispatcher::getInstance()->trigger('onInstallerViewAfterLastTab', array()); ?>

			<?php $tabs = array_merge($firstTab, $tabs, $lastTab); ?>
			<?php if (!$tabs) : ?>
				<?php JFactory::getApplication()->enqueueMessage(JText::_('COM_INSTALLER_NO_INSTALLATION_PLUGINS_FOUND'), 'warning'); ?>
			<?php endif; ?>

			<input type="hidden" name="type" value="" />
			<input type="hidden" name="installtype" value="upload" />
			<input type="hidden" name="task" value="install.install" />
			<?php echo JHtml::_('form.token'); ?>
		</div>
	</div>
	</form>
</div>
<div id="loading"></div>
templates/hathor/html/com_installer/database/default.php000060400000006072152453623430017537 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

?>
<div id="installer-database">
<form action="<?php echo JRoute::_('index.php?option=com_installer&view=warnings');?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
<?php if ($this->errorCount === 0) : ?>
	<?php echo JHtml::_('sliders.start', 'database-sliders', array('useCookie' => 1)); ?>

<?php else : ?>
	<?php echo JHtml::_('sliders.start', 'database-sliders', array('useCookie' => 1)); ?>

	<?php $panelName = JText::plural('COM_INSTALLER_MSG_N_DATABASE_ERROR_PANEL', $this->errorCount); ?>
	<?php echo JHtml::_('sliders.panel', $panelName, 'error-panel'); ?>
	<fieldset class="panelform">
		<ul>
			<?php if (!$this->filterParams) : ?>
				<li><?php echo JText::_('COM_INSTALLER_MSG_DATABASE_FILTER_ERROR'); ?>
			<?php endif; ?>

			<?php if ($this->schemaVersion != $this->changeSet->getSchema()) : ?>
				<li><?php echo JText::sprintf('COM_INSTALLER_MSG_DATABASE_SCHEMA_ERROR', $this->schemaVersion, $this->changeSet->getSchema()); ?></li>
			<?php endif; ?>

			<?php if (version_compare($this->updateVersion, JVERSION) != 0) : ?>
				<li><?php echo JText::sprintf('COM_INSTALLER_MSG_DATABASE_UPDATEVERSION_ERROR', $this->updateVersion, JVERSION); ?></li>
			<?php endif; ?>

			<?php foreach ($this->errors as $line => $error) : ?>
				<?php $key = 'COM_INSTALLER_MSG_DATABASE_' . $error->queryType;
				$msgs = $error->msgElements;
				$file = basename($error->file);
				$msg0 = isset($msgs[0]) ? $msgs[0] : ' ';
				$msg1 = isset($msgs[1]) ? $msgs[1] : ' ';
				$msg2 = isset($msgs[2]) ? $msgs[2] : ' ';
				$message = JText::sprintf($key, $file, $msg0, $msg1, $msg2); ?>
				<li><?php echo $message; ?></li>
			<?php endforeach; ?>
		</ul>
	</fieldset>
<?php endif; ?>

<?php echo JHtml::_('sliders.panel', JText::_('COM_INSTALLER_MSG_DATABASE_INFO'), 'furtherinfo-pane'); ?>
	<fieldset class="panelform">
	<ul>
		<li><?php echo JText::sprintf('COM_INSTALLER_MSG_DATABASE_SCHEMA_VERSION', $this->schemaVersion); ?></li>
		<li><?php echo JText::sprintf('COM_INSTALLER_MSG_DATABASE_UPDATE_VERSION', $this->updateVersion); ?></li>
		<li><?php echo JText::sprintf('COM_INSTALLER_MSG_DATABASE_DRIVER', JFactory::getDbo()->name); ?></li>
		<li><?php echo JText::sprintf('COM_INSTALLER_MSG_DATABASE_CHECKED_OK', count($this->results['ok'])); ?></li>
		<li><?php echo JText::sprintf('COM_INSTALLER_MSG_DATABASE_SKIPPED', count($this->results['skipped'])); ?></li>
	</ul>
	</fieldset>
<?php echo JHtml::_('sliders.end'); ?>

<div class="clr"> </div>
<div>
	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<?php echo JHtml::_('form.token'); ?>
</div>
</div>
</form>
</div>
templates/hathor/html/com_installer/default/default_ftp.php000060400000001737152453623430020273 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<fieldset class="adminform" title="<?php echo JText::_('COM_INSTALLER_MSG_DESCFTPTITLE'); ?>">
	<legend><?php echo JText::_('COM_INSTALLER_MSG_DESCFTPTITLE'); ?></legend>

	<?php echo JText::_('COM_INSTALLER_MSG_DESCFTP'); ?>

	<?php if ($this->ftp instanceof Exception) : ?>
		<p><?php echo JText::_($this->ftp->getMessage()); ?></p>
	<?php endif; ?>

	<ul class="adminformlist">
		<li><label for="username"><?php echo JText::_('JGLOBAL_USERNAME'); ?></label>
		<input type="text" id="username" name="username" value="" /></li>

		<li><label for="password"><?php echo JText::_('JGLOBAL_PASSWORD'); ?></label>
		<input type="password" id="password" name="password" class="input_box" value="" /></li>
	</ul>

</fieldset>
templates/hathor/html/com_installer/warnings/default.php000060400000002720152453623430017617 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div id="installer-warnings">
<form action="<?php echo JRoute::_('index.php?option=com_installer&view=warnings'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty($this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php
else : ?>
	<div id="j-main-container">
<?php endif; ?>
<?php

if (!count($this->messages))
{
	echo '<p class="nowarning">' . JText::_('COM_INSTALLER_MSG_WARNINGS_NONE') . '</p>';
}
else
{
	echo JHtml::_('sliders.start', 'warning-sliders', array('useCookie' => 1));
	foreach ($this->messages as $message)
	{
		echo JHtml::_('sliders.panel', $message['message'], str_replace(' ', '', $message['message']));
		echo '<div style="padding: 5px;" >' . $message['description'] . '</div>';
	}
	echo JHtml::_('sliders.panel', JText::_('COM_INSTALLER_MSG_WARNINGFURTHERINFO'), 'furtherinfo-pane');
	echo '<div style="padding: 5px;" >' . JText::_('COM_INSTALLER_MSG_WARNINGFURTHERINFODESC') . '</div>';
	echo JHtml::_('sliders.end');
}
?>
<div class="clr"> </div>
<div>
	<input type="hidden" name="boxchecked" value="0" />
	<?php echo JHtml::_('form.token'); ?>
</div>
</div>
</form>
</div>
templates/hathor/html/com_installer/update/default.php000060400000007426152453623430017261 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.multiselect');
JHtml::_('bootstrap.tooltip');

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>

<div id="installer-update">
<form action="<?php echo JRoute::_('index.php?option=com_installer&view=update');?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<?php if ($this->showMessage) : ?>
		<?php echo $this->loadTemplate('message'); ?>
	<?php endif; ?>

	<?php if ($this->ftp) : ?>
		<?php echo $this->loadTemplate('ftp'); ?>
	<?php endif; ?>

	<?php if (count($this->items)) : ?>
	<table class="adminlist" cellspacing="1">
		<thead>
			<tr>
				<th class="checkmark-col"><input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" /></th>
				<th class="nowrap"><?php echo JHtml::_('grid.sort', 'COM_INSTALLER_HEADING_NAME', 'name', $listDirn, $listOrder); ?></th>
				<th class="nowrap"><?php echo JHtml::_('grid.sort', 'COM_INSTALLER_HEADING_INSTALLTYPE', 'extension_id', $listDirn, $listOrder); ?></th>
				<th ><?php echo JHtml::_('grid.sort', 'COM_INSTALLER_HEADING_TYPE', 'type', $listDirn, $listOrder); ?></th>
				<th class="width-10" class="center"><?php echo JText::_('JVERSION'); ?></th>
				<th><?php echo JHtml::_('grid.sort', 'COM_INSTALLER_HEADING_FOLDER', 'folder', $listDirn, $listOrder); ?></th>
				<th><?php echo JHtml::_('grid.sort', 'COM_INSTALLER_HEADING_CLIENT', 'client_id', $listDirn, $listOrder); ?></th>
				<th class="width-25"><?php echo JText::_('COM_INSTALLER_HEADING_DETAILSURL'); ?></th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) : ?>
			<?php $client = $item->client_id ? JText::_('JADMINISTRATOR') : JText::_('JSITE'); ?>
			<tr class="row<?php echo $i % 2; ?>">
				<td><?php echo JHtml::_('grid.id', $i, $item->update_id); ?></td>
				<td>
					<span class="editlinktip hasTooltip" title="<?php echo JHtml::_('tooltipText', JText::_('JGLOBAL_DESCRIPTION'), $item->description ?: JText::_('COM_INSTALLER_MSG_UPDATE_NODESC'), 0); ?>">
					<?php echo $item->name; ?>
					</span>
				</td>
				<td class="center">
					<?php echo $item->extension_id ? JText::_('COM_INSTALLER_MSG_UPDATE_UPDATE') : JText::_('COM_INSTALLER_NEW_INSTALL') ?>
				</td>
				<td><?php echo JText::_('COM_INSTALLER_TYPE_' . $item->type) ?></td>
				<td class="center"><?php echo $item->version ?></td>
				<td class="center"><?php echo @$item->folder != '' ? $item->folder : JText::_('COM_INSTALLER_TYPE_NONAPPLICABLE'); ?></td>
				<td class="center"><?php echo $client; ?></td>
				<td><?php echo $item->detailsurl ?>
					<?php if (isset($item->infourl)) : ?>
					<br /><a href="<?php echo $item->infourl;?>"><?php echo $item->infourl;?></a>
					<?php endif; ?>
				</td>
			</tr>
		<?php endforeach;?>
		</tbody>
	</table>
	<?php echo $this->pagination->getListFooter(); ?>

	<?php else : ?>
		<p class="nowarning"><?php echo JText::_('COM_INSTALLER_MSG_UPDATE_NOUPDATES'); ?></p>
	<?php endif; ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
</div>
templates/hathor/html/com_installer/languages/default_filter.php000060400000002020152453623430021273 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

?>
<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
	<div class="filter-search">
		<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
		<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_INSTALLER_LANGUAGES_FILTER_SEARCH_DESC'); ?>" />
		<button type="submit" class="btn"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
		<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
	</div>
</fieldset>
<div class="clr"></div>
templates/hathor/html/com_installer/languages/default.php000060400000010310152453623430017727 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.multiselect');
JHtml::_('bootstrap.tooltip');

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));

$version = new JVersion;

// Add spindle-wheel for language installation.
JFactory::getDocument()->addScriptDeclaration('
jQuery(document).ready(function($) {
	Joomla.loadingLayer("load");
	$("#adminForm").on("submit", function(e) {
		if (document.getElementsByName("task")[0].value == "languages.install")
		{
			Joomla.loadingLayer("show");
		}
	});
});
');
?>
<div id="installer-languages">
	<form action="<?php echo JRoute::_('index.php?option=com_installer&view=languages');?>" method="post" name="adminForm" id="adminForm">
	<?php if (!empty( $this->sidebar)) : ?>
		<div id="j-sidebar-container" class="span2">
			<?php echo $this->sidebar; ?>
		</div>
		<div id="j-main-container" class="span10">
	<?php else : ?>
		<div id="j-main-container">
	<?php endif;?>

		<?php if (count($this->items) || $this->escape($this->state->get('filter.search'))) : ?>
			<?php echo $this->loadTemplate('filter'); ?>
			<table class="adminlist">
				<thead>
					<tr>
						<th width="5%"></th>
						<th class="nowrap">
							<?php echo JHtml::_('grid.sort', 'COM_INSTALLER_HEADING_NAME', 'name', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="center">
							<?php echo JText::_('JVERSION'); ?>
						</th>
						<th class="center nowrap hidden-phone">
							<?php echo JText::_('COM_INSTALLER_HEADING_TYPE'); ?>
						</th>
						<th width="35%" class="nowrap hidden-phone">
							<?php echo JText::_('COM_INSTALLER_HEADING_DETAILS_URL'); ?>
						</th>
					</tr>
				</thead>
				<tbody>
					<?php foreach ($this->items as $i => $language) :
						preg_match('#^pkg_([a-z]{2,3}-[A-Z]{2})$#', $language->element, $element);
						$language->code  = $element[1];
						?>
					<tr class="row<?php echo $i % 2; ?>">
						<td>
							<?php $buttonText = (isset($this->installedLang[0][$language->code]) || isset($this->installedLang[1][$language->code])) ? 'REINSTALL' : 'INSTALL'; ?>
							<?php $onclick = 'document.getElementById(\'install_url\').value = \'' . $language->detailsurl . '\'; Joomla.submitbutton(\'install.install\');'; ?>
							<input type="button" class="btn btn-small" value="<?php echo JText::_('COM_INSTALLER_' . $buttonText . '_BUTTON'); ?>" onclick="<?php echo $onclick; ?>" />
						</td>
						<td>
							<?php echo $language->name; ?>

							<?php $minorVersion = $version::MAJOR_VERSION . '.' . $version::MINOR_VERSION; ?>
							<?php // Display a Note if language pack version is not equal to Joomla version ?>
							<?php if (substr($language->version, 0, 3) != $minorVersion
									|| substr($language->version, 0, 5) != $version->getShortVersion()) : ?>
								<div class="small"><?php echo JText::_('JGLOBAL_LANGUAGE_VERSION_NOT_PLATFORM'); ?></div>
							<?php endif; ?>
						</td>
						<td class="center">
							<?php echo $language->version; ?>
						</td>
						<td class="center">
							<?php echo JText::_('COM_INSTALLER_TYPE_' . strtoupper($language->type)); ?>
						</td>
						<td>
							<?php echo $language->detailsurl; ?>
						</td>
					</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
			<?php echo $this->pagination->getListFooter(); ?>
		<?php else : ?>
			<div class="alert"><?php echo JText::_('COM_INSTALLER_MSG_LANGUAGES_NOLANGUAGES'); ?></div>
		<?php endif; ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="return" value="<?php echo base64_encode('index.php?option=com_installer&view=languages') ?>" />
		<input type="hidden" id="install_url" name="install_url" />
		<input type="hidden" name="installtype" value="url" />
		<input type="hidden" name="boxchecked" value="0" />
		<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
		<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
		<?php echo JHtml::_('form.token'); ?>
		</div>
	</form>
</div>
templates/hathor/html/com_contact/contact/edit_params.php000060400000001676152453623430017735 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$fieldSets = $this->form->getFieldsets('params');
foreach ($fieldSets as $name => $fieldSet) :
	echo JHtml::_('sliders.panel', JText::_($fieldSet->label), $name.'-params');
	if (isset($fieldSet->description) && trim($fieldSet->description)) :
		echo '<p class="tip">'.$this->escape(JText::_($fieldSet->description)).'</p>';
	endif;
	?>
	<fieldset class="panelform" >
	<legend class="element-invisible"><?php echo JText::_($fieldSet->label); ?></legend>
		<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset($name) as $field) : ?>
				<li><?php echo $field->label; ?>
				<?php echo $field->input; ?></li>
			<?php endforeach; ?>
		</ul>
	</fieldset>
<?php endforeach; ?>
templates/hathor/html/com_contact/contact/edit.php000060400000017615152453623430016372 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.formvalidator');

$app = JFactory::getApplication();
$input = $app->input;

$saveHistory = $this->state->get('params')->get('save_history', 0);

$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'));
		}
	}
");
$fieldSets = $this->form->getFieldsets();
?>
<form action="<?php echo JRoute::_('index.php?option=com_contact&layout=edit&id='.(int) $this->item->id); ?>" method="post" name="adminForm" id="contact-form" class="form-validate">
	<div class="col main-section">
		<fieldset class="adminform">
			<legend><?php echo empty($this->item->id) ? JText::_('COM_CONTACT_NEW_CONTACT') : JText::sprintf('COM_CONTACT_EDIT_CONTACT', $this->item->id); ?></legend>
			<ul class="adminformlist">
				<li><?php echo $this->form->getLabel('name'); ?>
				<?php echo $this->form->getInput('name'); ?></li>

				<li><?php echo $this->form->getLabel('alias'); ?>
				<?php echo $this->form->getInput('alias'); ?></li>

				<li><?php echo $this->form->getLabel('user_id'); ?>
				<?php echo $this->form->getInput('user_id'); ?></li>

				<li><?php echo $this->form->getLabel('catid'); ?>
				<?php echo $this->form->getInput('catid'); ?></li>

				<li><?php echo $this->form->getLabel('published'); ?>
				<?php echo $this->form->getInput('published'); ?></li>

				<li><?php echo $this->form->getLabel('access'); ?>
				<?php echo $this->form->getInput('access'); ?></li>

				<li><?php echo $this->form->getLabel('ordering'); ?>
				<?php echo $this->form->getInput('ordering'); ?></li>

				<li><?php echo $this->form->getLabel('featured'); ?>
				<?php echo $this->form->getInput('featured'); ?></li>

				<li><?php echo $this->form->getLabel('language'); ?>
				<?php echo $this->form->getInput('language'); ?></li>

				<!-- Tag field -->
				<li><?php echo $this->form->getLabel('tags'); ?>
					<div class="is-tagbox">
						<?php echo $this->form->getInput('tags'); ?>
					</div>
				</li>

				<?php if ($saveHistory) : ?>
					<li><?php echo $this->form->getLabel('version_note'); ?>
					<?php echo $this->form->getInput('version_note'); ?></li>
				<?php endif; ?>

				<li><?php echo $this->form->getLabel('id'); ?>
				<?php echo $this->form->getInput('id'); ?></li>
			</ul>
			<div class="clr"></div>
			<?php echo $this->form->getLabel('misc'); ?>
			<div class="clr"></div>
			<?php echo $this->form->getInput('misc'); ?>
		</fieldset>
	</div>
	<div class="col options-section">
		<?php echo JHtml::_('sliders.start', 'contact-slider'); ?>
			<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_FIELDSET_PUBLISHING'), 'publishing-details'); ?>

			<fieldset class="panelform">
			<legend class="element-invisible"><?php echo JText::_('JGLOBAL_FIELDSET_PUBLISHING'); ?></legend>
				<ul class="adminformlist">

					<li><?php echo $this->form->getLabel('created_by'); ?>
					<?php echo $this->form->getInput('created_by'); ?></li>

					<li><?php echo $this->form->getLabel('created_by_alias'); ?>
					<?php echo $this->form->getInput('created_by_alias'); ?></li>

					<li><?php echo $this->form->getLabel('created'); ?>
					<?php echo $this->form->getInput('created'); ?></li>

					<li><?php echo $this->form->getLabel('publish_up'); ?>
					<?php echo $this->form->getInput('publish_up'); ?></li>

					<li><?php echo $this->form->getLabel('publish_down'); ?>
					<?php echo $this->form->getInput('publish_down'); ?></li>

					<?php if ($this->item->modified_by) : ?>
						<li><?php echo $this->form->getLabel('modified_by'); ?>
						<?php echo $this->form->getInput('modified_by'); ?></li>

						<li><?php echo $this->form->getLabel('modified'); ?>
						<?php echo $this->form->getInput('modified'); ?></li>
					<?php endif; ?>

				</ul>
			</fieldset>
			<?php echo JHtml::_('sliders.panel', JText::_('COM_CONTACT_CONTACT_DETAILS'), 'basic-options'); ?>

			<fieldset class="panelform">
			<legend class="element-invisible"><?php echo JText::_('COM_CONTACT_CONTACT_DETAILS'); ?></legend>
				<p><?php echo empty($this->item->id) ? JText::_('COM_CONTACT_DETAILS') : JText::sprintf('COM_CONTACT_EDIT_DETAILS', $this->item->id); ?></p>

				<ul class="adminformlist">
					<li><?php echo $this->form->getLabel('image'); ?>
					<?php echo $this->form->getInput('image'); ?></li>

					<li><?php echo $this->form->getLabel('con_position'); ?>
					<?php echo $this->form->getInput('con_position'); ?></li>

					<li><?php echo $this->form->getLabel('email_to'); ?>
					<?php echo $this->form->getInput('email_to'); ?></li>

					<li><?php echo $this->form->getLabel('address'); ?>
					<?php echo $this->form->getInput('address'); ?></li>

					<li><?php echo $this->form->getLabel('suburb'); ?>
					<?php echo $this->form->getInput('suburb'); ?></li>

					<li><?php echo $this->form->getLabel('state'); ?>
					<?php echo $this->form->getInput('state'); ?></li>

					<li><?php echo $this->form->getLabel('postcode'); ?>
					<?php echo $this->form->getInput('postcode'); ?></li>

					<li><?php echo $this->form->getLabel('country'); ?>
					<?php echo $this->form->getInput('country'); ?></li>

					<li><?php echo $this->form->getLabel('telephone'); ?>
					<?php echo $this->form->getInput('telephone'); ?></li>

					<li><?php echo $this->form->getLabel('mobile'); ?>
					<?php echo $this->form->getInput('mobile'); ?></li>

					<li><?php echo $this->form->getLabel('fax'); ?>
					<?php echo $this->form->getInput('fax'); ?></li>

					<li><?php echo $this->form->getLabel('webpage'); ?>
					<?php echo $this->form->getInput('webpage'); ?></li>

					<li><?php echo $this->form->getLabel('sortname1'); ?>
					<?php echo $this->form->getInput('sortname1'); ?></li>

					<li><?php echo $this->form->getLabel('sortname2'); ?>
					<?php echo $this->form->getInput('sortname2'); ?></li>

					<li><?php echo $this->form->getLabel('sortname3'); ?>
					<?php echo $this->form->getInput('sortname3'); ?></li>
				</ul>
			</fieldset>

			<?php echo $this->loadTemplate('params'); ?>

			<?php foreach ($fieldSets as $name => $fieldSet) : ?>
				<?php if ($name != 'details' && $name != 'display' && $name != 'item_associations' && $name != 'jmetadata' && $name != 'email') : ?>
					<?php echo JHtml::_('sliders.panel', JText::_($fieldSet->label), $name.'-options'); ?>
					<?php if (isset($fieldSet->description) && trim($fieldSet->description)) : ?>
						<p class="tip"><?php echo $this->escape(JText::_($fieldSet->description));?></p>
					<?php endif; ?>
					<fieldset class="panelform">
						<ul class="adminformlist">
						<?php foreach ($this->form->getFieldset($name) as $field) : ?>
							<li>
								<?php echo $field->label; ?>
								<?php echo $field->input; ?>
							</li>
						<?php endforeach; ?>
						</ul>
					</fieldset>
				<?php endif ?>
			<?php endforeach; ?>

			<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_FIELDSET_METADATA_OPTIONS'), 'meta-options'); ?>
			<fieldset class="panelform">
			<legend class="element-invisible"><?php echo JText::_('JGLOBAL_FIELDSET_METADATA_OPTIONS'); ?></legend>
				<?php echo $this->loadTemplate('metadata'); ?>
			</fieldset>

			<?php if ($assoc) : ?>
				<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_FIELDSET_ASSOCIATIONS'), '-options');?>
				<?php echo $this->loadTemplate('associations'); ?>
			<?php endif; ?>

		<?php echo JHtml::_('sliders.end'); ?>
		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/com_contact/contacts/modal.php000060400000013320152453623430016711 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

$forcedLanguage = JFactory::getApplication()->input->get('forcedLanguage', '', 'cmd');
$function  = JFactory::getApplication()->input->getCmd('function', 'jSelectContact');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>
<form action="<?php echo JRoute::_('index.php?option=com_contact&view=contacts&layout=modal&tmpl=component');?>" method="post" name="adminForm" id="adminForm">
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter-search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('JSEARCH_FILTER'); ?>" />

			<button type="submit">
				<?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();">
				<?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>

		<div class="filter-select">
			<label class="selectlabel" for="filter_access">
				<?php echo JText::_('JOPTION_SELECT_ACCESS'); ?>
			</label>
			<select name="filter_access" id="filter_access">
				<option value=""><?php echo JText::_('JOPTION_SELECT_ACCESS');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text', $this->state->get('filter.access'));?>
			</select>

			<label class="selectlabel" for="filter_published">
				<?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?>
			</label>
			<select name="filter_published" id="filter_published">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.published'), true);?>
			</select>

			<label class="selectlabel" for="filter_category_id">
				<?php echo JText::_('JOPTION_SELECT_CATEGORY'); ?>
			</label>
			<select name="filter_category_id" id="filter_category_id">
				<option value=""><?php echo JText::_('JOPTION_SELECT_CATEGORY');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('category.options', 'com_contact'), 'value', 'text', $this->state->get('filter.category_id'));?>
			</select>

			<?php if ($forcedLanguage) : ?>
				<input type="hidden" name="forcedLanguage" value="<?php echo $this->escape($forcedLanguage); ?>" />
				<input type="hidden" name="filter_language" value="<?php echo $this->escape($this->state->get('filter.language')); ?>" />
			<?php else : ?>
				<label class="selectlabel" for="filter_language"><?php echo JText::_('JOPTION_SELECT_LANGUAGE'); ?></label>
				<select name="filter_language" id="filter_language">
					<option value=""><?php echo JText::_('JOPTION_SELECT_LANGUAGE');?></option>
					<?php echo JHtml::_('select.options', JHtml::_('contentlanguage.existing', true, true), 'value', 'text', $this->state->get('filter.language'));?>
				</select>
			<?php endif; ?>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>
	<div class="clr"> </div>

	<table class="adminlist modal">
		<thead>
			<tr>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_TITLE', 'a.name', $listDirn, $listOrder); ?>
				</th>
				<th>
					<?php echo JHtml::_('grid.sort', 'COM_CONTACT_FIELD_LINKED_USER_LABEL', 'ul.name', $listDirn, $listOrder); ?>
				</th>
				<th class="title access-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ACCESS', 'access_level', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap state-col">
					<?php echo JHtml::_('grid.sort', 'JCATEGORY', 'a.catid', $listDirn, $listOrder); ?>
				</th>
				<th class="title language-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_LANGUAGE', 'language', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) : ?>
			<tr class="row<?php echo $i % 2; ?>">
				<th>
					<a class="pointer" onclick="if (window.parent) window.parent.<?php echo $this->escape($function);?>('<?php echo $item->id; ?>', '<?php echo $this->escape(addslashes($item->name)); ?>');">
						<?php echo $this->escape($item->name); ?></a>
				</th>
				<td class="center">
					<?php if (!empty($item->linked_user)) : ?>
						<?php echo $item->linked_user;?>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo $this->escape($item->access_level); ?>
				</td>
				<td class="center">
					<?php echo $this->escape($item->category_title); ?>
				</td>
				<td class="center">
					<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
				</td>
				<td class="center">
					<?php echo (int) $item->id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<input type="hidden" name="forcedLanguage" value="<?php echo $forcedLanguage; ?>" />
	<?php echo JHtml::_('form.token'); ?>
</form>
templates/hathor/html/com_contact/contacts/default.php000060400000024751152453623430017253 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.multiselect');

$app       = JFactory::getApplication();
$user      = JFactory::getUser();
$userId    = $user->get('id');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$canOrder  = $user->authorise('core.edit.state', 'com_contact');
$saveOrder = $listOrder == 'a.ordering';
$assoc     = JLanguageAssociations::isEnabled();
?>

<form action="<?php echo JRoute::_('index.php?option=com_contact'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_CONTACT_SEARCH_IN_NAME'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>
		<div class="filter-select">
			<label class="selectlabel" for="filter_published">
				<?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?>
			</label>
			<select name="filter_published" id="filter_published">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.published'), true);?>
			</select>

			<label class="selectlabel" for="filter_category_id">
				<?php echo JText::_('JOPTION_SELECT_CATEGORY'); ?>
			</label>
			<select name="filter_category_id" id="filter_category_id">
				<option value=""><?php echo JText::_('JOPTION_SELECT_CATEGORY');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('category.options', 'com_contact'), 'value', 'text', $this->state->get('filter.category_id'));?>
			</select>

			<label class="selectlabel" for="filter_access">
				<?php echo JText::_('JOPTION_SELECT_ACCESS'); ?>
			</label>
			<select name="filter_access" id="filter_access">
				<option value=""><?php echo JText::_('JOPTION_SELECT_ACCESS');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text', $this->state->get('filter.access'));?>
			</select>

			<label class="selectlabel" for="filter_language">
				<?php echo JText::_('JOPTION_SELECT_LANGUAGE'); ?>
			</label>
			<select name="filter_language" id="filter_language">
				<option value=""><?php echo JText::_('JOPTION_SELECT_LANGUAGE');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('contentlanguage.existing', true, true), 'value', 'text', $this->state->get('filter.language'));?>
			</select>

			<label class="selectlabel" for="filter_tag">
				<?php echo JText::_('JOPTION_SELECT_TAG'); ?>
			</label>
			<select name="filter_tag" id="filter_tag">
				<option value=""><?php echo JText::_('JOPTION_SELECT_TAG');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('tag.options', true, true), 'value', 'text', $this->state->get('filter.tag'));?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>
	<div class="clr"> </div>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_TITLE', 'a.name', $listDirn, $listOrder); ?>
				</th>
				<th>
					<?php echo JHtml::_('grid.sort', 'COM_CONTACT_FIELD_LINKED_USER_LABEL', 'ul.name', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap state-col">
					<?php echo JHtml::_('grid.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap featured-col">
					<?php echo JHtml::_('grid.sort', 'JFEATURED', 'a.featured', $listDirn, $listOrder, null, 'desc'); ?>
				</th>
				<th class="title category-col">
					<?php echo JHtml::_('grid.sort', 'JCATEGORY', 'category_title', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap ordering-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ORDERING', 'a.ordering', $listDirn, $listOrder); ?>
					<?php if ($canOrder && $saveOrder) : ?>
						<?php echo JHtml::_('grid.order', $this->items, 'filesave.png', 'contacts.saveorder'); ?>
					<?php endif; ?>
				</th>
				<th class="title access-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ACCESS', 'access_level', $listDirn, $listOrder); ?>
				</th>
				<?php if ($assoc) : ?>
					<th width="5%">
						<?php echo JHtml::_('grid.sort', 'COM_CONTACT_HEADING_ASSOCIATION', 'association', $listDirn, $listOrder); ?>
					</th>
				<?php endif;?>
				<th class="language-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_LANGUAGE', 'a.language', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php
		$n = count($this->items);
		foreach ($this->items as $i => $item) :
			$ordering   = $listOrder == 'a.ordering';
			$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);
			?>
			<tr class="row<?php echo $i % 2; ?>">
				<td class="center">
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				</td>
				<td>
					<?php if ($item->checked_out) : ?>
						<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'contacts.', $canCheckin); ?>
					<?php endif; ?>
					<?php if ($canEdit || $canEditOwn) : ?>
						<a href="<?php echo JRoute::_('index.php?option=com_contact&task=contact.edit&id='.(int) $item->id); ?>">
						<?php echo $this->escape($item->name); ?></a>
					<?php else : ?>
						<?php echo $this->escape($item->name); ?>
					<?php endif; ?>
					<p class="smallsub">
						<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias));?></p>
				</td>
				<td align="center">
					<?php if (!empty($item->linked_user)) : ?>
						<a href="<?php echo JRoute::_('index.php?option=com_users&task=user.edit&id='.$item->user_id);?>"><?php echo $item->linked_user;?></a>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo JHtml::_('jgrid.published', $item->published, $i, 'contacts.', $canChange, 'cb', $item->publish_up, $item->publish_down); ?>
				</td>
				<td class="center">
					<?php echo JHtml::_('contact.featured', $item->featured, $i, $canChange); ?>
				</td>
				<td class="center">
					<?php echo $item->category_title; ?>
				</td>
				<td class="order">
					<?php if ($canChange) : ?>
						<?php if ($saveOrder) : ?>
							<?php if ($listDirn == 'asc') : ?>
								<span><?php echo $this->pagination->orderUpIcon($i, $item->catid == @$this->items[$i - 1]->catid, 'contacts.orderup', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
								<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, $item->catid == @$this->items[$i + 1]->catid, 'contacts.orderdown', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
							<?php elseif ($listDirn == 'desc') : ?>
								<span><?php echo $this->pagination->orderUpIcon($i, $item->catid == @$this->items[$i - 1]->catid, 'contacts.orderdown', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
								<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, $item->catid == @$this->items[$i + 1]->catid, 'contacts.orderup', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
							<?php endif; ?>
						<?php endif; ?>
						<?php $disabled = $saveOrder ?  '' : 'disabled="disabled"'; ?>
						<input type="text" name="order[]" value="<?php echo $item->ordering; ?>" <?php echo $disabled; ?> class="text-area-order" title="<?php echo $item->name; ?> order" />
					<?php else : ?>
						<?php echo $item->ordering; ?>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo $item->access_level; ?>
				</td>
				<?php if ($assoc) : ?>
					<td class="center">
						<?php if ($item->association) : ?>
							<?php echo JHtml::_('contact.association', $item->id); ?>
						<?php endif; ?>
					</td>
				<?php endif;?>
				<td class="center">
					<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
				</td>
				<td class="center">
					<?php echo $item->id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

		<?php //Load the batch processing form. ?>
		<?php if ($user->authorise('core.create', 'com_contact')
			&& $user->authorise('core.edit', 'com_contact')
			&& $user->authorise('core.edit.state', 'com_contact')) : ?>
			<?php echo JHtml::_(
				'bootstrap.renderModal',
				'collapseModal',
				array(
					'title'  => JText::_('COM_CONTACT_BATCH_OPTIONS'),
					'footer' => $this->loadTemplate('batch_footer'),
				),
				$this->loadTemplate('batch_body')
			); ?>
		<?php endif; ?>

	<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/pagination.php000060400000010555152453623430013646 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * This is a file to add template specific chrome to pagination rendering.
 *
 * pagination_list_footer
 *	Input variable $list is an array with offsets:
 *		$list[prefix]		: string
 *		$list[limit]		: int
 *		$list[limitstart]	: int
 *		$list[total]		: int
 *		$list[limitfield]	: string
 *		$list[pagescounter]	: string
 *		$list[pageslinks]	: string
 *
 * pagination_list_render
 *	Input variable $list is an array with offsets:
 *		$list[all]
 *			[data]		: string
 *			[active]	: boolean
 *		$list[start]
 *			[data]		: string
 *			[active]	: boolean
 *		$list[previous]
 *			[data]		: string
 *			[active]	: boolean
 *		$list[next]
 *			[data]		: string
 *			[active]	: boolean
 *		$list[end]
 *			[data]		: string
 *			[active]	: boolean
 *		$list[pages]
 *			[{PAGE}][data]		: string
 *			[{PAGE}][active]	: boolean
 *
 * pagination_item_active
 *	Input variable $item is an object with fields:
 *		$item->base	: integer
 *		$item->prefix	: string
 *		$item->link	: string
 *		$item->text	: string
 *
 * pagination_item_inactive
 *	Input variable $item is an object with fields:
 *		$item->base	: integer
 *		$item->prefix	: string
 *		$item->link	: string
 *		$item->text	: string
 *
 * This gives template designers ultimate control over how pagination is rendered.
 *
 * NOTE: If you override pagination_item_active OR pagination_item_inactive you MUST override them both
 */

function pagination_list_footer($list)
{
	/**
	 * Fix javascript jump menu
	 *
	 * Remove the onchange=Joomla.submitform from the select tag
	 * Add in a button with onclick instead
	 */
	$fixlimit = $list['limitfield'];
	$fixlimit = preg_replace('/onchange="Joomla.submitform\(\);"/', '', $fixlimit);

	$html = '<div class="containerpg"><div class="pagination">';

	$html .= '<div class="limit"><label for="limit">' . JText::_('JGLOBAL_DISPLAY_NUM') . ' </label>';
	$html .= "\n" . $fixlimit;
	$html .= "\n" . '<button id="pagination-go" type="button" onclick="Joomla.submitform()">' . JText::_('JSUBMIT') . '</button></div>';
	$html .= "\n" . $list['pageslinks'];
	$html .= "\n" . '<div class="limit">' . $list['pagescounter'] . '</div>';

	$html .= "\n" . '<input type="hidden" name="' . $list['prefix'] . 'limitstart" value="' . $list['limitstart'] . '" />';
	$html .= "\n" . '<div class="clr"></div></div></div>';

	return $html;
}

function pagination_list_render($list)
{
	$html = null;

	if ($list['start']['active'])
	{
		$html .= '<div class="button2-right"><div class="start">'. $list['start']['data']. '</div></div>';
	} else {
		$html .= '<div class="button2-right off"><div class="start">'. $list['start']['data']. '</div></div>';
	}
	if ($list['previous']['active'])
	{
		$html .= '<div class="button2-right"><div class="prev">'. $list['previous']['data']. '</div></div>';
	} else {
		$html .= '<div class="button2-right off"><div class="prev">'. $list['previous']['data']. '</div></div>';
	}

	$html .= '<div class="button2-left"><div class="page">';
	foreach ($list['pages'] as $page)
	{
		$html .= $page['data'];
	}
	$html .= '</div></div>';

	if ($list['next']['active'])
	{
		$html .= '<div class="button2-left"><div class="next">'. $list['next']['data']. '</div></div>';
	} else {
		$html .= '<div class="button2-left off"><div class="next">'. $list['next']['data']. '</div></div>';
	}
	if ($list['end']['active'])
	{
		$html .= '<div class="button2-left"><div class="end">'. $list['end']['data']. '</div></div>';
	} else {
		$html .= '<div class="button2-left off"><div class="end">'. $list['end']['data']. '</div></div>';
	}

	return $html;
}

function pagination_item_active(&$item)
{
	if ($item->base > 0)
	{
		return '<a href="#" title="'.$item->text.'" onclick="document.adminForm.' . $item->prefix . 'limitstart.value=' .$item->base.'; Joomla.submitform();return false;">'.$item->text. '</a>';
	}
	else
	{
		return '<a href="#" title="'.$item->text.'" onclick="document.adminForm.' . $item->prefix . 'limitstart.value=0; Joomla.submitform();return false;">'.$item->text. '</a>';
	}
}

function pagination_item_inactive(&$item)
{
	if ($item->active)
	{
		$class = 'class="active"';
	}
	else
	{
		$class = '';
	}
	return '<span ' . $class . '>' . $item->text . '</span>';
}
templates/hathor/html/com_categories/category/edit_options.php000060400000004244152453623430021013 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die; ?>

<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_FIELDSET_PUBLISHING'), 'publishing-details'); ?>

<fieldset class="panelform">
	<legend class="element-invisible"><?php echo JText::_('COM_CONTENT_FIELDSET_PUBLISHING'); ?></legend>
	<ul class="adminformlist">
		<li>
			<?php echo $this->form->getLabel('created_user_id'); ?>
			<?php echo $this->form->getInput('created_user_id'); ?>
		</li>
		<?php if ((int) $this->item->created_time) : ?>
			<li>
				<?php echo $this->form->getLabel('created_time'); ?>
				<?php echo $this->form->getInput('created_time'); ?>
			</li>
		<?php endif; ?>
		<?php if ($this->item->modified_user_id) : ?>
			<li>
				<?php echo $this->form->getLabel('modified_user_id'); ?>
				<?php echo $this->form->getInput('modified_user_id'); ?>
			</li>
			<li>
				<?php echo $this->form->getLabel('modified_time'); ?>
				<?php echo $this->form->getInput('modified_time'); ?>
			</li>
		<?php endif; ?>
	</ul>
</fieldset>

<?php $fieldSets = $this->form->getFieldsets('params'); ?>
<?php foreach ($fieldSets as $name => $fieldSet) : ?>
	<?php
	$label = !empty($fieldSet->label) ? $fieldSet->label : 'COM_CATEGORIES_' . $name . '_FIELDSET_LABEL';
	echo JHtml::_('sliders.panel', JText::_($label), $name . '-options');
	if (isset($fieldSet->description) && trim($fieldSet->description))
	{
		echo '<p class="tip">' . $this->escape(JText::_($fieldSet->description)) . '</p>';
	}
	?>
	<fieldset class="panelform">
		<legend class="element-invisible"><?php echo JText::_($label); ?></legend>
		<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset($name) as $field) : ?>
				<li>
					<?php echo $field->label; ?>
					<?php echo $field->input; ?>
				</li>
			<?php endforeach; ?>
			<?php if ($name == 'basic'): ?>
				<li>
					<?php echo $this->form->getLabel('note'); ?>
					<?php echo $this->form->getInput('note'); ?>
				</li>
			<?php endif; ?>
		</ul>
	</fieldset>
<?php endforeach; ?>
templates/hathor/html/com_categories/category/edit.php000060400000013716152453623430017244 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

$input = JFactory::getApplication()->input;

$saveHistory = $this->state->get('params')->get('save_history', 0);

JHtml::_('behavior.keepalive');
JHtml::_('behavior.formvalidator');

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(task)
	{
		if (task == 'category.cancel' || document.formvalidator.isValid(document.getElementById('item-form'))) {
			" . $this->form->getField('description')->save() . "
			Joomla.submitform(task, document.getElementById('item-form'));
		}
	}
");
$assoc = JLanguageAssociations::isEnabled();

?>

<div class="category-edit">
	<form action="<?php echo JRoute::_('index.php?option=com_categories&extension=' . $input->getCmd('extension', 'com_content') . '&layout=edit&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="item-form" class="form-validate">
		<div class="col main-section">
			<fieldset class="adminform">
				<legend><?php echo JText::_('COM_CATEGORIES_FIELDSET_DETAILS'); ?></legend>
				<ul class="adminformlist">
					<li>
						<?php echo $this->form->getLabel('title'); ?>
						<?php echo $this->form->getInput('title'); ?>
					</li>
					<li>
						<?php echo $this->form->getLabel('alias'); ?>
						<?php echo $this->form->getInput('alias'); ?>
					</li>
					<li>
						<?php echo $this->form->getLabel('extension'); ?>
						<?php echo $this->form->getInput('extension'); ?>
					</li>
					<li>
						<?php echo $this->form->getLabel('parent_id'); ?>
						<?php echo $this->form->getInput('parent_id'); ?>
					</li>
					<li>
						<?php echo $this->form->getLabel('published'); ?>
						<?php echo $this->form->getInput('published'); ?>
					</li>
					<li>
						<?php echo $this->form->getLabel('access'); ?>
						<?php echo $this->form->getInput('access'); ?>
					</li>
					<?php if ($this->canDo->get('core.admin')) : ?>
						<li>
							<span class="faux-label"><?php echo JText::_('JGLOBAL_ACTION_PERMISSIONS_LABEL'); ?></span>
							<button type="button" onclick="document.location.href='#access-rules';">
								<?php echo JText::_('JGLOBAL_PERMISSIONS_ANCHOR'); ?></button>

						</li>
					<?php endif; ?>
					<li>
						<?php echo $this->form->getLabel('language'); ?>
						<?php echo $this->form->getInput('language'); ?>
					</li>
					<!-- Tag field -->
					<li>
						<?php if ($this->checkTags) : ?>
							<?php echo $this->form->getLabel('tags'); ?>
							<div class="is-tagbox">
								<?php echo $this->form->getInput('tags'); ?>
							</div>
						<?php endif; ?>
					</li>
					<?php if ($saveHistory) : ?>
						<li><?php echo $this->form->getLabel('version_note'); ?>
						<?php echo $this->form->getInput('version_note'); ?></li>
					<?php endif; ?>
					<li>
						<?php echo $this->form->getLabel('id'); ?>
						<?php echo $this->form->getInput('id'); ?>
					</li>
					<li>
						<?php echo $this->form->getLabel('hits'); ?>
						<?php echo $this->form->getInput('hits'); ?>
					</li>
				</ul>

				<div class="clr"></div>
				<?php echo $this->form->getLabel('description'); ?>
				<div class="clr"></div>
				<?php echo $this->form->getInput('description'); ?>
				<div class="clr"></div>
			</fieldset>
		</div>

		<div class="col options-section">

			<?php echo JHtml::_('sliders.start', 'categories-sliders-' . $this->item->id, array('useCookie' => 1)); ?>
			<?php echo $this->loadTemplate('options'); ?>
			<div class="clr"></div>

			<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_FIELDSET_METADATA_OPTIONS'), 'meta-options'); ?>
			<fieldset class="panelform">
				<legend class="element-invisible"><?php echo JText::_('JGLOBAL_FIELDSET_METADATA_OPTIONS'); ?></legend>
				<?php echo $this->loadTemplate('metadata'); ?>
			</fieldset>

			<?php $fieldSets = $this->form->getFieldsets(); ?>
			<?php foreach ($fieldSets as $name => $fieldSet) : ?>
				<?php if ($name !== 'basic' && $name !== 'item_associations' && $name !== 'jmetadata') : ?>
					<?php
					$label = !empty($fieldSet->label) ? $fieldSet->label : 'COM_CATEGORIES_' . $name . '_FIELDSET_LABEL';
					echo JHtml::_('sliders.panel', JText::_($label), $name . '-options');
					if (isset($fieldSet->description) && trim($fieldSet->description))
					{
						echo '<p class="tip">' . $this->escape(JText::_($fieldSet->description)) . '</p>';
					}
					?>
					<div class="clr"></div>
					<fieldset class="panelform">
						<ul class="adminformlist">
							<?php foreach ($this->form->getFieldset($name) as $field) : ?>
								<li>
									<?php echo $field->label; ?>
									<?php echo $field->input; ?>
								</li>
							<?php endforeach; ?>
						</ul>
					</fieldset>
				<?php endif; ?>
			<?php endforeach; ?>

			<?php if ($assoc) : ?>
				<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_FIELDSET_ASSOCIATIONS'), '-options');?>
				<?php echo $this->loadTemplate('associations'); ?>
			<?php endif; ?>

			<?php echo JHtml::_('sliders.end'); ?>
		</div>
		<div class="clr"></div>

		<?php if ($this->canDo->get('core.admin')) : ?>
			<div class="col rules-section">

				<?php echo JHtml::_('sliders.start', 'permissions-sliders-' . $this->item->id, array('useCookie' => 1)); ?>

				<?php echo JHtml::_('sliders.panel', JText::_('COM_CATEGORIES_FIELDSET_RULES'), 'access-rules'); ?>
				<fieldset class="panelform">
					<legend class="element-invisible"><?php echo JText::_('COM_CATEGORIES_FIELDSET_RULES'); ?></legend>
					<?php echo $this->form->getLabel('rules'); ?>
					<?php echo $this->form->getInput('rules'); ?>
				</fieldset>

				<?php echo JHtml::_('sliders.end'); ?>
			</div>
		<?php endif; ?>
		<div>
			<input type="hidden" name="task" value="" />
			<?php echo JHtml::_('form.token'); ?>
		</div>
	</form>
	<div class="clr"></div>
</div>
templates/hathor/html/com_categories/categories/default.php000060400000033426152453623430020253 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.multiselect');

$app       = JFactory::getApplication();
$user      = JFactory::getUser();
$userId    = $user->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'));
$ordering  = ($listOrder == 'a.lft');
$canOrder  = $user->authorise('core.edit.state', $extension);
$saveOrder = ($listOrder == 'a.lft' && $listDirn == 'asc');
$jinput    = JFactory::getApplication()->input;
$component = $jinput->get('extension');
?>

<div class="categories">
	<form action="<?php echo JRoute::_('index.php?option=com_categories&view=categories'); ?>" method="post" name="adminForm" id="adminForm">
		<?php if (!empty($this->sidebar)) : ?>
			<div id="j-sidebar-container" class="span2">
				<?php echo $this->sidebar; ?>
			</div>
		<?php endif; ?>
		<div id="j-main-container"<?php echo !empty($this->sidebar) ? ' class="span10"' : ''; ?>>
			<fieldset id="filter-bar">
				<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
				<div class="filter-search">
					<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
					<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_CATEGORIES_ITEMS_SEARCH_FILTER'); ?>" />

					<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
					<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
				</div>

				<div class="filter-select">
					<label class="selectlabel" for="filter_level"><?php echo JText::_('JOPTION_SELECT_MAX_LEVELS'); ?></label>
					<select name="filter_level" id="filter_level">
						<option value=""><?php echo JText::_('JOPTION_SELECT_MAX_LEVELS'); ?></option>
						<?php echo JHtml::_('select.options', $this->f_levels, 'value', 'text', $this->state->get('filter.level')); ?>
					</select>

					<label class="selectlabel" for="filter_published"><?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?></label>
					<select name="filter_published" id="filter_published">
						<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?></option>
						<?php echo JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.published'), true); ?>
					</select>

					<label class="selectlabel" for="filter_access"><?php echo JText::_('JOPTION_SELECT_ACCESS'); ?></label>
					<select name="filter_access" id="filter_access">
						<option value=""><?php echo JText::_('JOPTION_SELECT_ACCESS'); ?></option>
						<?php echo JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text', $this->state->get('filter.access')); ?>
					</select>

					<label class="selectlabel" for="filter_language"><?php echo JText::_('JOPTION_SELECT_LANGUAGE'); ?></label>
					<select name="filter_language" id="filter_language">
						<option value=""><?php echo JText::_('JOPTION_SELECT_LANGUAGE'); ?></option>
						<?php echo JHtml::_('select.options', JHtml::_('contentlanguage.existing', true, true), 'value', 'text', $this->state->get('filter.language')); ?>
					</select>

					<label class="selectlabel" for="filter_tag"><?php echo JText::_('JOPTION_SELECT_TAG'); ?></label>
					<select name="filter_tag" id="filter_tag">
						<option value=""><?php echo JText::_('JOPTION_SELECT_TAG'); ?></option>
						<?php echo JHtml::_('select.options', JHtml::_('tag.options', true, true), 'value', 'text', $this->state->get('filter.tag')); ?>
					</select>

					<button type="submit" id="filter-go">
						<?php echo JText::_('JSUBMIT'); ?></button>
				</div>
			</fieldset>
			<div class="clr"></div>

			<table class="adminlist">
				<thead>
					<tr>
						<th class="checkmark-col">
							<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
						</th>
						<th class="title">
							<?php echo JHtml::_('grid.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
						</th>
						<th class="nowrap state-col">
							<?php echo JHtml::_('grid.sort', 'JSTATUS', 'a.published', $listDirn, $listOrder); ?>
						</th>
						<th class="nowrap ordering-col">
							<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ORDERING', 'a.lft', $listDirn, $listOrder); ?>
							<?php if ($canOrder && $saveOrder) : ?>
								<?php echo JHtml::_('grid.order', $this->items, 'filesave.png', 'categories.saveorder'); ?>
							<?php endif; ?>
						</th>
						<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_published')) : ?>
							<th width="1%" class="nowrap center hidden-phone">
								<span class="icon-publish hasTooltip" aria-hidden="true" title="<?php echo JText::_('COM_CATEGORY_COUNT_PUBLISHED_ITEMS'); ?>"><span class="element-invisible"><?php echo JText::_('COM_CATEGORY_COUNT_PUBLISHED_ITEMS'); ?></span></span>
							</th>
						<?php endif; ?>
						<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_unpublished')) : ?>
							<th width="1%" class="nowrap center hidden-phone">
								<span class="icon-unpublish hasTooltip" aria-hidden="true" title="<?php echo JText::_('COM_CATEGORY_COUNT_UNPUBLISHED_ITEMS'); ?>"><span class="element-invisible"><?php echo JText::_('COM_CATEGORY_COUNT_UNPUBLISHED_ITEMS'); ?></span></span>
							</th>
						<?php endif; ?>
						<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_archived')) : ?>
							<th width="1%" class="nowrap center hidden-phone">
								<span class="icon-archive hasTooltip" aria-hidden="true" title="<?php echo JText::_('COM_CATEGORY_COUNT_ARCHIVED_ITEMS'); ?>"><span class="element-invisible"><?php echo JText::_('COM_CATEGORY_COUNT_ARCHIVED_ITEMS'); ?></span></span>
							</th>
						<?php endif; ?>
						<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_trashed')) : ?>
							<th width="1%" class="nowrap center hidden-phone">
								<span class="icon-trash hasTooltip" aria-hidden="true" title="<?php echo JText::_('COM_CATEGORY_COUNT_TRASHED_ITEMS'); ?>"><span class="element-invisible"><?php echo JText::_('COM_CATEGORY_COUNT_TRASHED_ITEMS'); ?></span></span>
							</th>
						<?php endif; ?>
						<th class="access-col">
							<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ACCESS', 'access_level', $listDirn, $listOrder); ?>
						</th>
						<?php if ($this->assoc) : ?>
							<th width="5%">
								<?php echo JHtml::_('grid.sort', 'COM_CATEGORY_HEADING_ASSOCIATION', 'association', $listDirn, $listOrder); ?>
							</th>
						<?php endif; ?>
						<th class="language-col">
							<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_LANGUAGE', 'language', $this->state->get('list.direction'), $this->state->get('list.ordering')); ?>
						</th>
						<th class="nowrap id-col">
							<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>

				<tbody>
					<?php foreach ($this->items as $i => $item) : ?>
						<?php
						$orderkey = array_search($item->id, $this->ordering[$item->parent_id]);
						$canEdit = $user->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;
						?>
						<tr class="row<?php echo $i % 2; ?>">
							<td class="center">
								<?php echo JHtml::_('grid.id', $i, $item->id); ?>
							</td>
							<td>
								<?php echo str_repeat('<span class="gi">|&mdash;</span>', $item->level - 1) ?>
								<?php if ($item->checked_out) : ?>
									<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'categories.', $canCheckin); ?>
								<?php endif; ?>
								<?php if ($canEdit || $canEditOwn) : ?>
									<a href="<?php echo JRoute::_('index.php?option=com_categories&task=category.edit&id=' . $item->id . '&extension=' . $extension); ?>">
										<?php echo $this->escape($item->title); ?></a>
								<?php else : ?>
									<?php echo $this->escape($item->title); ?>
								<?php endif; ?>
								<p class="smallsub" title="<?php echo $this->escape($item->path); ?>">
									<?php echo str_repeat('<span class="gtr">|&mdash;</span>', $item->level - 1) ?>
									<?php if (empty($item->note)) : ?>
										<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias)); ?>
									<?php else : ?>
										<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS_NOTE', $this->escape($item->alias), $this->escape($item->note)); ?>
									<?php endif; ?></p>
							</td>
							<td class="center">
								<?php echo JHtml::_('jgrid.published', $item->published, $i, 'categories.', $canChange); ?>
							</td>
							<td class="order">
								<?php if ($canChange) : ?>
									<?php if ($saveOrder) : ?>
										<span><?php echo $this->pagination->orderUpIcon($i, isset($this->ordering[$item->parent_id][$orderkey - 1]), 'categories.orderup', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
										<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, isset($this->ordering[$item->parent_id][$orderkey + 1]), 'categories.orderdown', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
									<?php endif; ?>
									<?php $disabled = $saveOrder ? '' : 'disabled="disabled"'; ?>
									<input type="text" name="order[]" value="<?php echo $orderkey + 1; ?>" <?php echo $disabled; ?> class="text-area-order" title="<?php echo $item->title; ?> order" />
								<?php else : ?>
									<?php echo $orderkey + 1; ?>
								<?php endif; ?>
							</td>
							<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_published')) : ?>
								<td class="center">
									<a title="<?php echo JText::_('COM_CATEGORY_COUNT_PUBLISHED_ITEMS'); ?>" href="<?php echo JRoute::_('index.php?option=' . $component . '&filter[category_id]=' . (int) $item->id . '&filter[published]=1' . '&filter[level]=' . (int) $item->level); ?>">
										<?php echo $item->count_published; ?></a>
								</td>
							<?php endif; ?>
							<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_unpublished')) : ?>
								<td class="center">
									<a title="<?php echo JText::_('COM_CATEGORY_COUNT_UNPUBLISHED_ITEMS'); ?>" href="<?php echo JRoute::_('index.php?option=' . $component . '&filter[category_id]=' . (int) $item->id . '&filter[published]=0' . '&filter[level]=' . (int) $item->level); ?>">
										<?php echo $item->count_unpublished; ?></a>
								</td>
							<?php endif; ?>
							<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_archived')) : ?>
								<td class="center">
									<a title="<?php echo JText::_('COM_CATEGORY_COUNT_ARCHIVED_ITEMS'); ?>" href="<?php echo JRoute::_('index.php?option=' . $component . '&filter[category_id]=' . (int) $item->id . '&filter[published]=2' . '&filter[level]=' . (int) $item->level); ?>">
										<?php echo $item->count_archived; ?></a>
								</td>
							<?php endif; ?>
							<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_trashed')) : ?>
								<td class="center">
									<a title="<?php echo JText::_('COM_CATEGORY_COUNT_TRASHED_ITEMS'); ?>" href="<?php echo JRoute::_('index.php?option=' . $component . '&filter[category_id]=' . (int) $item->id . '&filter[published]=-2' . '&filter[level]=' . (int) $item->level); ?>">
										<?php echo $item->count_trashed; ?></a>
								</td>
							<?php endif; ?>
							<td class="center">
								<?php echo $this->escape($item->access_level); ?>
							</td>
							<?php if ($this->assoc) : ?>
								<td class="center">
									<?php if ($item->association): ?>
										<?php echo JHtml::_('CategoriesAdministrator.association', $item->id, $extension); ?>
									<?php endif; ?>
								</td>
							<?php endif; ?>
							<td class="center nowrap">
								<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
							</td>
							<td class="center">
						<span title="<?php echo sprintf('%d-%d', $item->lft, $item->rgt); ?>">
							<?php echo (int) $item->id; ?></span>
							</td>
						</tr>
					<?php endforeach; ?>
				</tbody>
			</table>

			<?php echo $this->pagination->getListFooter(); ?>
			<div class="clr"></div>

			<?php //Load the batch processing form. ?>
			<?php if ($user->authorise('core.create', $extension)
				&& $user->authorise('core.edit', $extension)
				&& $user->authorise('core.edit.state', $extension)) : ?>
				<?php echo JHtml::_(
					'bootstrap.renderModal',
					'collapseModal',
					array(
						'title'  => JText::_('COM_CATEGORIES_BATCH_OPTIONS'),
						'footer' => $this->loadTemplate('batch_footer'),
					),
					$this->loadTemplate('batch_body')
				); ?>
			<?php endif; ?>

			<input type="hidden" name="extension" value="<?php echo $extension; ?>" />
			<input type="hidden" name="task" value="" />
			<input type="hidden" name="boxchecked" value="0" />
			<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
			<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
			<?php echo JHtml::_('form.token'); ?>
		</div>
	</form>
</div>
templates/hathor/html/com_cache/cache/default.php000060400000005713152453623430016105 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>

<form action="<?php echo JRoute::_('index.php?option=com_cache'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
		<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-select fltrt">
			<label class="selectlabel" for="client_id">
				<?php echo JText::_('COM_CACHE_SELECT_CLIENT'); ?>
			</label>
			<select name="client_id" id="client_id">
				<?php echo JHtml::_('select.options', CacheHelper::getClientOptions(), 'value', 'text', $this->state->get('client_id'));?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>
	<div class="clr"> </div>
<table class="adminlist">
	<thead>
		<tr>
			<th class="checkmark-col">
				<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
			</th>
			<th class="title nowrap">
				<?php echo JHtml::_('grid.sort',  'COM_CACHE_GROUP', 'group', $listDirn, $listOrder); ?>
			</th>
			<th class="width-5 center nowrap">
				<?php echo JHtml::_('grid.sort',  'COM_CACHE_NUMBER_OF_FILES', 'count', $listDirn, $listOrder); ?>
			</th>
			<th class="width-10 center">
				<?php echo JHtml::_('grid.sort',  'COM_CACHE_SIZE', 'size', $listDirn, $listOrder); ?>
			</th>
		</tr>
	</thead>

	<tbody>
		<?php
		$i = 0;
		foreach ($this->data as $folder => $item) : ?>
		<tr class="row<?php echo $i % 2; ?>">
			<td>
				<input type="checkbox" id="cb<?php echo $i;?>" name="cid[]" value="<?php echo $item->group; ?>" onclick="Joomla.isChecked(this.checked);" />
			</td>
			<td>
				<span class="bold">
					<?php echo $item->group; ?>
				</span>
			</td>
			<td class="center">
				<?php echo $item->count; ?>
			</td>
			<td class="center">
				<?php echo JHtml::_('number.bytes', $item->size*1024); ?>
			</td>
		</tr>
		<?php $i++; endforeach; ?>
	</tbody>
</table>

<?php echo $this->pagination->getListFooter(); ?>

<input type="hidden" name="task" value="" />
<input type="hidden" name="boxchecked" value="0" />
<input type="hidden" name="client" value="<?php echo $this->client->id;?>" />
<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
<?php echo JHtml::_('form.token'); ?>
</div>
</form>
templates/hathor/html/com_cache/purge/default.php000060400000002124152453623430016155 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_cache
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>

<form action="<?php echo JRoute::_('index.php?option=com_cache'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
<table class="adminlist">
	<thead>
		<tr>
			<th>
				<?php echo JText::_('COM_CACHE_PURGE_EXPIRED_ITEMS'); ?>
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
			<p class="mod-purge-instruct"><?php echo JText::_('COM_CACHE_PURGE_INSTRUCTIONS'); ?></p>
			<p class="warning"><?php echo JText::_('COM_CACHE_RESOURCE_INTENSIVE_WARNING'); ?></p>
			</td>
		</tr>
	</tbody>
</table>

<div>
	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>
</div>
</div>
</form>
templates/hathor/html/com_languages/languages/default.php000060400000016553152453623430017717 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');

$user      = JFactory::getUser();
$userId    = $user->get('id');
$n         = count($this->items);
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$canOrder  = $user->authorise('core.edit.state', 'com_languages');
$saveOrder = $listOrder == 'a.ordering';
?>

<form action="<?php echo JRoute::_('index.php?option=com_languages&view=languages'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_LANGUAGES_SEARCH_IN_TITLE'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>

		<div class="filter-select">
			<label class="selectlabel" for="filter_published">
				<?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?>
			</label>
			<select name="filter_published" id="filter_published">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('languages.publishedOptions'), 'value', 'text', $this->state->get('filter.published'), true); ?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
				</th>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'COM_LANGUAGES_HEADING_TITLE_NATIVE', 'a.title_native', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width-5">
					<?php echo JHtml::_('grid.sort', 'COM_LANGUAGES_FIELD_LANG_TAG_LABEL', 'a.lang_code', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width-5">
					<?php echo JHtml::_('grid.sort', 'COM_LANGUAGES_FIELD_LANG_CODE_LABEL', 'a.sef', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width-5">
					<?php echo JHtml::_('grid.sort', 'COM_LANGUAGES_HEADING_LANG_IMAGE', 'a.image', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width-5">
					<?php echo JHtml::_('grid.sort', 'JSTATUS', 'a.published', $listDirn, $listOrder); ?>
				</th>
				<th width="nowrap ordering-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ORDERING', 'a.ordering', $listDirn, $listOrder); ?>
					<?php if ($canOrder && $saveOrder) : ?>
						<?php echo JHtml::_('grid.order', $this->items, 'filesave.png', 'languages.saveorder'); ?>
					<?php endif; ?>
				</th>
				<th class="nowrap width-5">
					<?php echo JHtml::_('grid.sort', 'COM_LANGUAGES_HOMEPAGE', '', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.lang_id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php
		foreach ($this->items as $i => $item) :
			$ordering  = ($listOrder == 'a.ordering');
			$canCreate = $user->authorise('core.create',     'com_languages');
			$canEdit   = $user->authorise('core.edit',       'com_languages');
			$canChange = $user->authorise('core.edit.state', 'com_languages');
		?>
			<tr class="row<?php echo $i % 2; ?>">
				<td>
					<?php echo JHtml::_('grid.id', $i, $item->lang_id); ?>
				</td>
				<td>
					<span class="editlinktip hasTooltip" title="<?php echo JHtml::_('tooltipText', JText::_('JGLOBAL_EDIT_ITEM'), $item->title, 0); ?>">
					<?php if ($canEdit) : ?>
						<a href="<?php echo JRoute::_('index.php?option=com_languages&task=language.edit&lang_id='.(int) $item->lang_id); ?>">
							<?php echo $this->escape($item->title); ?></a>
					<?php else : ?>
							<?php echo $this->escape($item->title); ?>
					<?php endif; ?>
					</span>
				</td>
				<td class="center">
					<?php echo $this->escape($item->title_native); ?>
				</td>
				<td class="center">
					<?php echo $this->escape($item->lang_code); ?>
				</td>
				<td class="center">
					<?php echo $this->escape($item->sef); ?>
				</td>
				<td class="center">
					<?php if ($item->image) : ?>
						<?php echo JHtml::_('image', 'mod_languages/' . $item->image . '.gif', $item->image, null, true); ?>&nbsp;<?php echo $this->escape($item->image); ?>
					<?php else : ?>
						<?php echo JText::_('JNONE'); ?>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo JHtml::_('jgrid.published', $item->published, $i, 'languages.', $canChange); ?>
				</td>
				<td class="order">
					<?php if ($canChange) : ?>
						<?php if ($saveOrder) :?>
							<?php if ($listDirn == 'asc') : ?>
								<span><?php echo $this->pagination->orderUpIcon($i, true, 'languages.orderup', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
								<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, true, 'languages.orderdown', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
							<?php elseif ($listDirn == 'desc') : ?>
								<span><?php echo $this->pagination->orderUpIcon($i, true, 'languages.orderdown', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
								<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, true, 'languages.orderup', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
							<?php endif; ?>
						<?php endif; ?>
						<?php $disabled = $saveOrder ? '' : 'disabled="disabled"'; ?>
						<input type="text" name="order[]" size="5" value="<?php echo $item->ordering; ?>" <?php echo $disabled; ?> class="text-area-order" />
					<?php else : ?>
						<?php echo $item->ordering; ?>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php if ($item->home == '1') : ?>
						<?php echo JText::_('JYES'); ?>
					<?php else:?>
						<?php echo JText::_('JNO'); ?>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo $this->escape($item->lang_id); ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>

	<div>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
		<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
	</div>
</form>
templates/hathor/html/com_languages/installed/default.php000060400000007152152453623430017723 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.core');
// Add specific helper files for html generation
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');
$user     = JFactory::getUser();
$userId   = $user->get('id');
?>

<form action="<?php echo JRoute::_('index.php?option=com_languages&view=installed'); ?>" method="post" id="adminForm" name="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
		<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-select fltrt">
			<label class="selectlabel" for="client_id">
				<?php echo JText::_('COM_CACHE_SELECT_CLIENT'); ?>
			</label>
			<select name="client_id" id="client_id">
			<?php
			$options   = array();
			$options[] = JHtml::_('select.option', '0', JText::_('JSITE'));
			$options[] = JHtml::_('select.option', '1', JText::_('JADMINISTRATOR'));
			echo JHtml::_('select.options', $options, 'value', 'text', $this->state->get('client_id'));
			?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>
	<?php if ($this->ftp) : ?>
		<?php echo $this->loadTemplate('ftp');?>
	<?php endif; ?>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					&#160;
				</th>
				<th class="title">
					<?php echo JText::_('COM_LANGUAGES_HEADING_LANGUAGE'); ?>
				</th>
				<th>
					<?php echo JText::_('COM_LANGUAGES_FIELD_LANG_TAG_LABEL'); ?>
				</th>
				<th class="width-5">
					<?php echo JText::_('COM_LANGUAGES_HEADING_DEFAULT'); ?>
				</th>
				<th class="width-10">
					<?php echo JText::_('JVERSION'); ?>
				</th>
				<th class="width-10">
					<?php echo JText::_('JDATE'); ?>
				</th>
				<th class="width-20">
					<?php echo JText::_('JAUTHOR'); ?>
				</th>
				<th class="width-25">
					<?php echo JText::_('COM_LANGUAGES_HEADING_AUTHOR_EMAIL'); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->rows as $i => $row) :
			$canCreate = $user->authorise('core.create',     'com_languages');
			$canEdit   = $user->authorise('core.edit',       'com_languages');
			$canChange = $user->authorise('core.edit.state', 'com_languages');
		?>
			<tr class="row<?php echo $i % 2; ?>">
				<td>
					<?php echo JHtml::_('languages.id', $i, $row->language);?>
				</td>
				<td>
					<?php echo $this->escape($row->name); ?>
				</td>
				<td align="center">
					<?php echo $this->escape($row->language); ?>
				</td>
				<td class="center">
					<?php echo JHtml::_('jgrid.isdefault', $row->published, $i, 'installed.', !$row->published && $canChange);?>
				</td>
				<td class="center">
					<?php echo $this->escape($row->version); ?>
				</td>
				<td class="center">
					<?php echo $this->escape($row->creationDate); ?>
				</td>
				<td class="center">
					<?php echo $this->escape($row->author); ?>
				</td>
				<td class="center">
					<?php echo JStringPunycode::emailToUTF8($this->escape($row->authorEmail)); ?>
				</td>
			</tr>
		<?php endforeach;?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/com_languages/installed/default_ftp.php000060400000001661152453623430020573 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
	<fieldset class="adminform" title="<?php echo JText::_('COM_LANGUAGES_FTP_TITLE'); ?>">
		<legend><?php echo JText::_('COM_LANGUAGES_FTP_TITLE'); ?></legend>

		<?php echo JText::_('COM_LANGUAGES_FTP_DESC'); ?>

		<?php if ($ftp instanceof Exception) : ?>
			<p class="warning"><?php echo JText::_($ftp->message); ?></p>
		<?php endif; ?>

		<div>
			<label for="username"><?php echo JText::_('JGLOBAL_USERNAME'); ?></label>
			<input type="text" id="username" name="username" value="" />
		</div>
		<div>
			<label for="password"><?php echo JText::_('JGLOBAL_PASSWORD'); ?></label>
			<input type="password" id="password" name="password" value="" />
		</div>
	</fieldset>
templates/hathor/html/com_languages/overrides/default.php000060400000007610152453623430017745 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');
$client    = $this->state->get('filter.client') == 'site' ? JText::_('JSITE') : JText::_('JADMINISTRATOR');
$language  = $this->state->get('filter.language');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>

<form action="<?php echo JRoute::_('index.php?option=com_languages&view=overrides'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
		<div class="filter-search fltlft">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_LANGUAGES_VIEW_OVERRIDES_FILTER_SEARCH_DESC'); ?>" />

			<button type="submit" class="btn"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>
		<div class="filter-select fltrt">
			<select name="filter_language_client" onchange="this.form.submit()">
				<?php echo JHtml::_('select.options', $this->languages, null, 'text', $this->state->get('filter.language_client')); ?>
			</select>
		</div>
	</fieldset>

	<div class="clr"></div>

	<table class="adminlist">
		<thead>
			<tr>
				<th width="1%">
					<input type="checkbox" name="checkall-toggle" value="" onclick="Joomla.checkAll(this)" />
				</th>
				<th width="30%" class="left">
					<?php echo JHtml::_('grid.sort', 'COM_LANGUAGES_VIEW_OVERRIDES_KEY', 'key', $listDirn, $listOrder); ?>
				</th>
				<th class="left">
					<?php echo JHtml::_('grid.sort', 'COM_LANGUAGES_VIEW_OVERRIDES_TEXT', 'text', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap">
					<?php echo JText::_('COM_LANGUAGES_FIELD_LANG_TAG_LABEL'); ?>
				</th>
				<th>
					<?php echo JText::_('JCLIENT'); ?>
				</th>
			</tr>
		</thead>
		<tfoot>
			<tr>
				<td colspan="5">
					<?php echo $this->pagination->getListFooter(); ?>
				</td>
			</tr>
		</tfoot>
		<tbody>
		<?php $canEdit = JFactory::getUser()->authorise('core.edit', 'com_languages');
		$i = 0;
		foreach ($this->items as $key => $text) : ?>
			<tr class="row<?php echo $i % 2; ?>" id="overriderrow<?php echo $i; ?>">
				<td class="center">
					<?php echo JHtml::_('grid.id', $i, $key); ?>
				</td>
				<td>
					<?php if ($canEdit) : ?>
						<a id="key[<?php	echo $this->escape($key); ?>]" href="<?php echo JRoute::_('index.php?option=com_languages&task=override.edit&id='.$key); ?>"><?php echo $this->escape($key); ?></a>
					<?php else: ?>
						<?php echo $this->escape($key); ?>
					<?php endif; ?>
				</td>
				<td>
					<span id="string[<?php	echo $this->escape($key); ?>]"><?php echo $this->escape($text); ?></span>
				</td>
				<td class="center">
					<?php echo $language; ?>
				</td>
				<td class="center">
					<?php echo $client; ?>
				</td>
			</tr>
			<?php $i++;
		endforeach; ?>
		</tbody>
	</table>
	<div>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
		<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</div>
</form>
templates/hathor/html/com_users/note/edit.php000060400000004176152453623430015410 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.formvalidator');

JFactory::getDocument()->addScriptDeclaration('
jQuery(document).ready(function() {
	Joomla.submitbutton = function(task)
	{
		if (task == "note.cancel" || document.formvalidator.isValid(document.getElementById("note-form")))
		{
			' . $this->form->getField('body')->save() . '
			Joomla.submitform(task, document.getElementById("note-form"));
		}
	}
});');
?>
<form action="<?php echo JRoute::_('index.php?option=com_users&view=note&id=' . (int) $this->item->id);?>" method="post" name="adminForm" id="note-form" class="form-validate">
	<div class="col main-section">
		<fieldset class="adminform">
			<legend><?php echo empty($this->item->id) ? JText::_('COM_USERS_NEW_NOTE') : JText::sprintf('COM_USERS_EDIT_NOTE', $this->item->id); ?></legend>
			<ul class="adminformlist">
				<li>
					<?php echo $this->form->getLabel('subject'); ?>
					<?php echo $this->form->getInput('subject'); ?>
				</li>
				<li>
					<div class="clr"></div>
					<?php echo $this->form->getLabel('user_id'); ?>
					<?php echo $this->form->getInput('user_id'); ?>
				</li>
				<li>
					<?php echo $this->form->getLabel('catid'); ?>
					<?php echo $this->form->getInput('catid'); ?>
				</li>
				<li>
					<?php echo $this->form->getLabel('state'); ?>
					<?php echo $this->form->getInput('state'); ?>
				</li>
				<li>
					<?php echo $this->form->getLabel('review_time'); ?>
					<?php echo $this->form->getInput('review_time'); ?>
				</li>
				<li>
					<?php echo $this->form->getLabel('version_note'); ?>
					<?php echo $this->form->getInput('version_note'); ?>
				</li>
			</ul>
			<div class="clr"></div>
			<?php echo $this->form->getLabel('body'); ?>
			<div class="clr"></div>
			<div class="editor">
				<?php echo $this->form->getInput('body'); ?>
			</div>

			<input type="hidden" name="task" value="" />
			<?php echo JHtml::_('form.token'); ?>
		</fieldset>
</form>
templates/hathor/html/com_users/groups/default.php000060400000011374152453623430016457 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.multiselect');

$user      = JFactory::getUser();
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));

JText::script('COM_USERS_GROUPS_CONFIRM_DELETE');

$groupsWithUsers = array();

foreach ($this->items as $i => $item)
{
	if ($item->user_count > 0)
	{
		$groupsWithUsers[] = $i;
	}
}
JFactory::getDocument()->addScriptDeclaration('
		Joomla.submitbutton = function(task) {
			if (task == "groups.delete") {
				var f = document.adminForm;
				var cb = "";
				var groupsWithUsers = [' . implode(',', $groupsWithUsers) . '];
				for (index = 0; index < groupsWithUsers.length; ++index) {
					cb = f["cb" + groupsWithUsers[index]];
					if (cb && cb.checked) {
						if (confirm(Joomla.JText._("COM_USERS_GROUPS_CONFIRM_DELETE"))) {
							Joomla.submitform(task);
						}
						return;
					}
				}
			}
			Joomla.submitform(task);
		};
');
?>
<form action="<?php echo JRoute::_('index.php?option=com_users&view=groups');?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('COM_USERS_SEARCH_GROUPS_LABEL'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('COM_USERS_SEARCH_GROUPS_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_USERS_SEARCH_IN_GROUPS'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>
	</fieldset>
	<div class="clr"> </div>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th class="title">
					<?php echo JText::_('COM_USERS_HEADING_GROUP_TITLE'); ?>
				</th>
				<th class="width-10">
					<?php echo JText::_('COM_USERS_HEADING_USERS_IN_GROUP'); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JText::_('JGRID_HEADING_ID'); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) :
			$canCreate = $user->authorise('core.create', 'com_users');
			$canEdit   = $user->authorise('core.edit',   'com_users');
			// If this group is super admin and this user is not super admin, $canEdit is false
			if (!$user->authorise('core.admin') && JAccess::checkGroup($item->id, 'core.admin'))
			{
				$canEdit = false;
			}
			$canChange = $user->authorise('core.edit.state',	'com_users');
		?>
			<tr class="row<?php echo $i % 2; ?>">
				<td>
					<?php if ($canEdit) : ?>
						<?php echo JHtml::_('grid.id', $i, $item->id); ?>
					<?php endif; ?>
				</td>
				<td>
					<?php echo str_repeat('<span class="gi">|&mdash;</span>', $item->level) ?>
					<?php if ($canEdit) : ?>
					<a href="<?php echo JRoute::_('index.php?option=com_users&task=group.edit&id='.$item->id);?>">
						<?php echo $this->escape($item->title); ?></a>
					<?php else : ?>
						<?php echo $this->escape($item->title); ?>
					<?php endif; ?>
					<?php if (JDEBUG) : ?>
						<div class="fltrt"><div class="button2-left smallsub"><div class="blank"><a href="<?php echo JRoute::_('index.php?option=com_users&view=debuggroup&group_id='.(int) $item->id);?>">
						<?php echo JText::_('COM_USERS_DEBUG_GROUP');?></a></div></div></div>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo $item->user_count ?: ''; ?>
				</td>
				<td class="center">
					<?php echo (int) $item->id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
</div>
</form>
templates/hathor/html/com_users/notes/default.php000060400000013470152453623430016267 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$user = JFactory::getUser();
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn = $this->escape($this->state->get('list.direction'));
$canEdit = $user->authorise('core.edit', 'com_users');
?>
<form action="<?php echo JRoute::_('index.php?option=com_users&view=notes');?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('COM_USERS_SEARCH_IN_NOTE_TITLE'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_USERS_SEARCH_IN_NOTE_TITLE'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>

		<div class="filter-select">
			<span class="faux-label"><?php echo JText::_('COM_USERS_FILTER_LABEL'); ?></span>

			<label class="selectlabel" for="filter_category_id">
				<?php echo JText::_('JOPTION_SELECT_CATEGORY'); ?>
			</label>
			<select name="filter_category_id" id="filter_category_id" >
				<option value=""><?php echo JText::_('JOPTION_SELECT_CATEGORY');?></option>
				<?php
				echo JHtml::_(
					'select.options', JHtml::_('category.options', 'com_users'),
					'value', 'text', $this->state->get('filter.category_id')
				); ?>
			</select>

			<label class="selectlabel" for="filter_published">
				<?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?>
			</label>
			<select name="filter_published" id="filter_published">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED');?></option>
				<?php
				echo JHtml::_(
					'select.options', JHtml::_('jgrid.publishedOptions'),
					'value', 'text', $this->state->get('filter.published'), true
				); ?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="toggle" value="" class="checklist-toggle" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th class="width-15">
					<?php echo JHtml::_('grid.sort', 'COM_USERS_USER_HEADING', 'u.name', $listDirn, $listOrder); ?>
				</th>
				<th  class="title">
					<?php echo JHtml::_('grid.sort', 'COM_USERS_SUBJECT_HEADING', 'a.subject', $listDirn, $listOrder); ?>
				</th>
				<th class="width-20">
					<?php echo JHtml::_('grid.sort', 'COM_USERS_CATEGORY_HEADING', 'c.title', $listDirn, $listOrder); ?>
				</th>
				<th class="width-5">
					<?php echo JHtml::_('grid.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
				</th>
				<th class="width-10">
					<?php echo JHtml::_('grid.sort', 'COM_USERS_REVIEW_HEADING', 'a.review_time', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>
		<tbody>
		<?php foreach ($this->items as $i => $item) : ?>
			<?php $canChange = $user->authorise('core.edit.state',	'com_users'); ?>
			<tr class="row<?php echo $i % 2; ?>">
				<td class="center checklist">
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				</td>
				<td>
					<?php if ($item->checked_out) : ?>
						<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time); ?>
					<?php endif; ?>
					<?php if ($canEdit) : ?>
						<a href="<?php echo JRoute::_('index.php?option=com_users&task=note.edit&id='.$item->id);?>">
							<?php echo $this->escape($item->user_name); ?></a>
					<?php else : ?>
						<?php echo $this->escape($item->user_name); ?>
					<?php endif; ?>
				</td>
				<td>
					<?php if ($item->subject) : ?>
						<?php echo $this->escape($item->subject); ?>
					<?php else : ?>
						<?php echo JText::_('COM_USERS_EMPTY_SUBJECT'); ?>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php if ($item->catid && $item->cparams->get('image')) : ?>
					<?php echo JHtml::_('users.image', $item->cparams->get('image')); ?>
					<?php endif; ?>
					<?php echo $this->escape($item->category_title); ?>
				</td>
				<td class="center">
					<?php echo JHtml::_('jgrid.published', $item->state, $i, 'notes.', $canChange, 'cb', $item->publish_up, $item->publish_down); ?>
				</td>
				<td class="center">
					<?php if ($item->review_time !== JFactory::getDbo()->getNullDate()) : ?>
						<?php echo JHtml::_('date', $item->review_time, JText::_('DATE_FORMAT_LC4')); ?>
					<?php else : ?>
						<?php echo JText::_('COM_USERS_EMPTY_REVIEW'); ?>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo (int) $item->id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>

	<div>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
		<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</div>
</form>
templates/hathor/html/com_users/debuggroup/default.php000060400000013331152453623430017276 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('bootstrap.tooltip');

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>

<form action="<?php echo JRoute::_('index.php?option=com_users&view=debuggroup&group_id='.(int) $this->state->get('group_id'));?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('COM_USERS_SEARCH_ASSETS'); ?></legend>
		<div class="filter-search fltlft">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('COM_USERS_SEARCH_ASSETS'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_USERS_SEARCH_USERS'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_RESET'); ?></button>
		</div>

		<div class="filter-select fltrt">
			<label class="selectlabel" for="filter_component"><?php echo JText::_('COM_USERS_OPTION_SELECT_COMPONENT'); ?></label>
			<select name="filter_component" id="filter_component">
				<option value=""><?php echo JText::_('COM_USERS_OPTION_SELECT_COMPONENT');?></option>
				<?php if (!empty($this->components))
				{
					echo JHtml::_('select.options', $this->components, 'value', 'text', $this->state->get('filter.component'));
				}?>
			</select>

			<label class="selectlabel" for="filter_level_start"><?php echo JText::_('COM_USERS_OPTION_SELECT_LEVEL_START'); ?></label>
			<select name="filter_level_start" id="filter_level_start">
				<option value=""><?php echo JText::_('COM_USERS_OPTION_SELECT_LEVEL_START');?></option>
				<?php echo JHtml::_('select.options', $this->levels, 'value', 'text', $this->state->get('filter.level_start'));?>
			</select>

			<label class="selectlabel" for="filter_level_end"><?php echo JText::_('COM_USERS_OPTION_SELECT_LEVEL_END'); ?></label>
			<select name="filter_level_end" id="filter_level_end">
				<option value=""><?php echo JText::_('COM_USERS_OPTION_SELECT_LEVEL_END');?></option>
				<?php echo JHtml::_('select.options', $this->levels, 'value', 'text', $this->state->get('filter.level_end'));?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>

	</fieldset>
	<div class="clr"> </div>

	<div>
		<?php echo JText::_('COM_USERS_DEBUG_LEGEND'); ?>
		<span class="check-0 swatch"><?php echo JText::sprintf('COM_USERS_DEBUG_IMPLICIT_DENY', '-');?></span>
		<span class="check-a swatch"><?php echo JText::sprintf('COM_USERS_DEBUG_EXPLICIT_ALLOW', '&#10003;');?></span>
		<span class="check-d swatch"><?php echo JText::sprintf('COM_USERS_DEBUG_EXPLICIT_DENY', '&#10007;');?></span>
	</div>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="left">
					<?php echo JHtml::_('grid.sort', 'COM_USERS_HEADING_ASSET_TITLE', 'a.title', $listDirn, $listOrder); ?>
				</th>
				<th class="left">
					<?php echo JHtml::_('grid.sort', 'COM_USERS_HEADING_ASSET_NAME', 'a.name', $listDirn, $listOrder); ?>
				</th>
				<?php foreach ($this->actions as $key => $action) : ?>
				<th class="width-5">
					<span class="hasTooltip" title="<?php echo JHtml::_('tooltipText', $key, $action[1]); ?>"><?php echo JText::_($key); ?></span>
				</th>
				<?php endforeach; ?>
				<th class="width-5 nowrap">
					<?php echo JHtml::_('grid.sort', 'COM_USERS_HEADING_LFT', 'a.lft', $listDirn, $listOrder); ?>
				</th>
				<th class="width-5 nowrap">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) : ?>
			<tr class="row1">
				<td>
					<?php echo $this->escape($item->title); ?>
				</td>
				<td class="nowrap">
					<?php echo str_repeat('<span class="gi">|&mdash;</span>', $item->level) ?>
					<?php echo $this->escape($item->name); ?>
				</td>
				<?php foreach ($this->actions as $action) : ?>
					<?php
					$name  = $action[0];
					$check = $item->checks[$name];
					if ($check === true) :
						$class = 'check-a';
						$text  = '&#10003;';
					elseif ($check === false) :
						$class = 'check-d';
						$text  = '&#10007;';
					elseif ($check === null) :
						$class = 'check-0';
						$text  = '-';
					else :
						$class = '';
						$text  = '&#160;';
					endif;
					?>
				<td class="center <?php echo $class;?>">
					<?php echo $text; ?>
				</td>
				<?php endforeach; ?>
				<td class="center">
					<?php echo (int) $item->lft; ?>
					- <?php echo (int) $item->rgt; ?>
				</td>
				<td class="center">
					<?php echo (int) $item->id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>

	<div>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
		<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</div>
</form>
templates/hathor/html/com_users/levels/default.php000060400000011605152453623430016427 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.multiselect');

$user      = JFactory::getUser();
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$canOrder  = $user->authorise('core.edit.state', 'com_users');
$saveOrder = $listOrder == 'a.ordering';
?>

<form action="<?php echo JRoute::_('index.php?option=com_users&view=levels'); ?>" method="post" id="adminForm" name="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('COM_USERS_SEARCH_ACCESS_LEVELS'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('COM_USERS_SEARCH_ACCESS_LEVELS'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_USERS_SEARCH_TITLE_LEVELS'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_RESET'); ?></button>
		</div>
	</fieldset>
	<div class="clr"> </div>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th>
					<?php echo JHtml::_('grid.sort', 'COM_USERS_HEADING_LEVEL_NAME', 'a.title', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap ordering-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ORDERING', 'a.ordering', $listDirn, $listOrder); ?>
					<?php if ($canOrder && $saveOrder) : ?>
						<?php echo JHtml::_('grid.order', $this->items, 'filesave.png', 'levels.saveorder'); ?>
					<?php endif; ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JText::_('JGRID_HEADING_ID'); ?>
				</th>
				<th class="width-40">
					&#160;
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) :
			$ordering  = ($listOrder == 'a.ordering');
			$canCreate = $user->authorise('core.create',     'com_users');
			$canEdit   = $user->authorise('core.edit',       'com_users');
			$canChange = $user->authorise('core.edit.state', 'com_users');
			?>
			<tr class="row<?php echo $i % 2; ?>">
				<td>
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				</td>
				<td>
					<?php if ($canEdit) : ?>
					<a href="<?php echo JRoute::_('index.php?option=com_users&task=level.edit&id='.$item->id); ?>">
						<?php echo $this->escape($item->title); ?></a>
					<?php else : ?>
						<?php echo $this->escape($item->title); ?>
					<?php endif; ?>
				</td>
				<td class="order">
					<?php if ($canChange) : ?>
						<?php if ($saveOrder) :?>
							<?php if ($listDirn == 'asc') : ?>
								<span><?php echo $this->pagination->orderUpIcon($i, true, 'levels.orderup', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
								<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, true, 'levels.orderdown', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
							<?php elseif ($listDirn == 'desc') : ?>
								<span><?php echo $this->pagination->orderUpIcon($i, true, 'levels.orderdown', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
								<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, true, 'levels.orderup', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
							<?php endif; ?>
						<?php endif; ?>
						<?php $disabled = $saveOrder ?  '' : 'disabled="disabled"'; ?>
						<input type="text" name="order[]" value="<?php echo $item->ordering; ?>" <?php echo $disabled; ?> class="text-area-order" title="<?php echo $item->title; ?> order" />
					<?php else : ?>
						<?php echo $item->ordering; ?>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo (int) $item->id; ?>
				</td>
				<td>
					&#160;
				</td>
			</tr>
		<?php endforeach; ?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
</div>
</form>
templates/hathor/html/com_users/users/modal.php000060400000007040152453623430015744 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

$input     = JFactory::getApplication()->input;
$field     = $input->getCmd('field');
$function  = 'jSelectUser_'.$field;
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>
<form action="<?php echo JRoute::_('index.php?option=com_users&view=users&layout=modal&tmpl=component&groups=' . $input->get('groups', '', 'BASE64') . '&excluded=' . $input->get('excluded', '', 'BASE64'));?>" method="post" name="adminForm" id="adminForm">
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_USERS_SEARCH_IN_NAME'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
			<button type="button" data-user-value="" data-user-name="<?php echo $this->escape(JText::_('JLIB_FORM_SELECT_USER')); ?>" data-user-field="<?php echo $this->escape($field);?>"
				onclick="if (window.parent) window.parent.jSelectUser(this);"><?php echo JText::_('JOPTION_NO_USER')?></button>
		</div>

		<div class="filter-select">
			<label for="filter_group_id">
				<?php echo JText::_('COM_USERS_FILTER_USER_GROUP'); ?>
			</label>
			<?php echo JHtml::_('access.usergroup', 'filter_group_id', $this->state->get('filter.group_id')); ?>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>

	<table class="adminlist modal">
		<thead>
			<tr>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'COM_USERS_HEADING_NAME', 'a.name', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width=25">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_USERNAME', 'a.username', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width=25">
					<?php echo JText::_('COM_USERS_HEADING_GROUPS'); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php
			$i = 0;
			foreach ($this->items as $item) : ?>
			<tr class="row<?php echo $i % 2; ?>">
				<td>
					<a class="pointer"
						data-user-value="<?php echo $item->id; ?>" data-user-name="<?php echo $this->escape($item->name); ?>" data-user-field="<?php echo $this->escape($field);?>"
						onclick="if (window.parent) window.parent.jSelectUser(this);">
						<?php echo $item->name; ?></a>
				</td>
				<td class="center">
					<?php echo $item->username; ?>
				</td>
				<td class="title">
					<?php echo nl2br($item->group_names); ?>
				</td>
			</tr>
		<?php endforeach; ?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
</form>
templates/hathor/html/com_users/users/default.php000060400000023222152453623430016274 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn = $this->escape($this->state->get('list.direction'));
$loggeduser = JFactory::getUser();
?>

<form action="<?php echo JRoute::_('index.php?option=com_users&view=users');?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('COM_USERS_SEARCH_USERS'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('COM_USERS_SEARCH_USERS'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_USERS_SEARCH_USERS'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_RESET'); ?></button>
		</div>

		<div class="filter-select">
			<span class="faux-label"><?php echo JText::_('COM_USERS_FILTER_LABEL'); ?></span>

			<label class="selectlabel" for="filter_state">
				<?php echo JText::_('COM_USERS_FILTER_LABEL'); ?>
			</label>
			<select name="filter_state" id="filter_state">
				<option value="*"><?php echo JText::_('COM_USERS_FILTER_STATE');?></option>
				<?php echo JHtml::_('select.options', UsersHelper::getStateOptions(), 'value', 'text', $this->state->get('filter.state'));?>
			</select>

			<label class="selectlabel" for="filter_active">
				<?php echo JText::_('COM_USERS_FILTER_ACTIVE'); ?>
			</label>
			<select name="filter_active" id="filter_active">
				<option value="*"><?php echo JText::_('COM_USERS_FILTER_ACTIVE');?></option>
				<?php echo JHtml::_('select.options', UsersHelper::getActiveOptions(), 'value', 'text', $this->state->get('filter.active'));?>
			</select>

			<label class="selectlabel" for="filter_group_id">
				<?php echo JText::_('COM_USERS_FILTER_USERGROUP'); ?>
			</label>
			<select name="filter_group_id" id="filter_group_id">
				<option value=""><?php echo JText::_('COM_USERS_FILTER_USERGROUP');?></option>
				<?php echo JHtml::_('select.options', UsersHelper::getGroups(), 'value', 'text', $this->state->get('filter.group_id'));?>
			</select>

			<label class="selectlabel" for="filter_lastvisitrange">
				<?php echo JText::_('COM_USERS_OPTION_FILTER_LAST_VISIT_DATE'); ?>
			</label>
			<select name="filter_lastvisitrange" id="filter_lastvisitrange" >
				<option value=""><?php echo JText::_('COM_USERS_OPTION_FILTER_LAST_VISIT_DATE');?></option>
				<?php echo JHtml::_('select.options', Usershelper::getRangeOptions(), 'value', 'text', $this->state->get('filter.lastvisitrange'));?>
			</select>

			<label class="selectlabel" for="filter_range">
				<?php echo JText::_('COM_USERS_OPTION_FILTER_DATE'); ?>
			</label>
			<select name="filter_range" id="filter_range" >
				<option value=""><?php echo JText::_('COM_USERS_OPTION_FILTER_DATE');?></option>
				<?php echo JHtml::_('select.options', Usershelper::getRangeOptions(), 'value', 'text', $this->state->get('filter.range'));?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>
	<div class="clr"> </div>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'COM_USERS_HEADING_NAME', 'a.name', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width-10">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_USERNAME', 'a.username', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width-5">
					<?php echo JHtml::_('grid.sort', 'COM_USERS_HEADING_ENABLED', 'a.block', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width-5">
					<?php echo JHtml::_('grid.sort', 'COM_USERS_HEADING_ACTIVATED', 'a.activation', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width-10">
					<?php echo JText::_('COM_USERS_HEADING_GROUPS'); ?>
				</th>
				<th class="nowrap width-15">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_EMAIL', 'a.email', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width-15">
					<?php echo JHtml::_('grid.sort', 'COM_USERS_HEADING_LAST_VISIT_DATE', 'a.lastvisitDate', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width-15">
					<?php echo JHtml::_('grid.sort', 'COM_USERS_HEADING_REGISTRATION_DATE', 'a.registerDate', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) :
			$canEdit   = $this->canDo->get('core.edit');
			$canChange = $loggeduser->authorise('core.edit.state',	'com_users');

			// If this group is super admin and this user is not super admin, $canEdit is false
			if ((!$loggeduser->authorise('core.admin')) && JAccess::check($item->id, 'core.admin'))
			{
				$canEdit   = false;
				$canChange = false;
			}
		?>
			<tr class="row<?php echo $i % 2; ?>">
				<td>
					<?php if ($canEdit) : ?>
						<?php echo JHtml::_('grid.id', $i, $item->id); ?>
					<?php endif; ?>
				</td>
				<td class="break-word">
					<div class="fltrt">
						<?php echo JHtml::_('users.filterNotes', $item->note_count, $item->id); ?>
						<?php echo JHtml::_('users.notes', $item->note_count, $item->id); ?>
						<?php echo JHtml::_('users.addNote', $item->id); ?>
						<?php if ($item->requireReset == '1') : ?>
						<span class="label label-warning"><?php echo JText::_('COM_USERS_PASSWORD_RESET_REQUIRED'); ?></span>
						<?php endif; ?>
						<?php echo JHtml::_('users.notesModal', $item->note_count, $item->id); ?>
					</div>
					<?php if ($canEdit) : ?>
					<a href="<?php echo JRoute::_('index.php?option=com_users&task=user.edit&id='.(int) $item->id); ?>" title="<?php echo JText::sprintf('COM_USERS_EDIT_USER', $this->escape($item->name)); ?>">
						<?php echo $this->escape($item->name); ?></a>
					<?php else : ?>
						<?php echo $this->escape($item->name); ?>
					<?php endif; ?>
					<?php if (JDEBUG) : ?>
						<div class="fltrt"><div class="button2-left smallsub"><div class="blank"><a href="<?php echo JRoute::_('index.php?option=com_users&view=debuguser&user_id='.(int) $item->id);?>">
						<?php echo JText::_('COM_USERS_DEBUG_USER');?></a></div></div></div>
					<?php endif; ?>
				</td>
				<td class="center break-word">
					<?php echo $this->escape($item->username); ?>
				</td>
				<td class="center">
					<?php if ($canChange) : ?>
						<?php if ($loggeduser->id != $item->id) : ?>
							<?php echo JHtml::_('grid.boolean', $i, !$item->block, 'users.unblock', 'users.block'); ?>
						<?php else : ?>
							<?php echo JHtml::_('grid.boolean', $i, !$item->block, 'users.block', null); ?>
						<?php endif; ?>
					<?php else : ?>
						<?php echo JText::_($item->block ? 'JNO' : 'JYES'); ?>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo JHtml::_('grid.boolean', $i, !$item->activation, 'users.activate', null); ?>
				</td>
				<td class="center">
					<?php if (substr_count($item->group_names, "\n") > 1) : ?>
						<span class="hasTooltip" title="<?php echo JHtml::_('tooltipText', JText::_('COM_USERS_HEADING_GROUPS'), nl2br($item->group_names), 0); ?>"><?php echo JText::_('COM_USERS_USERS_MULTIPLE_GROUPS'); ?></span>
					<?php else : ?>
						<?php echo nl2br($item->group_names); ?>
					<?php endif; ?>
				</td>
				<td class="center break-word">
					<?php echo $this->escape($item->email); ?>
				</td>
				<td class="center">
					<?php if ($item->lastvisitDate != $this->db->getNullDate()) : ?>
						<?php echo JHtml::_('date', $item->lastvisitDate, JText::_('DATE_FORMAT_LC6')); ?>
					<?php else:?>
						<?php echo JText::_('JNEVER'); ?>
					<?php endif;?>
				</td>
				<td class="center">
					<?php echo JHtml::_('date', $item->registerDate, JText::_('DATE_FORMAT_LC6')); ?>
				</td>
				<td class="center">
					<?php echo (int) $item->id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php // Load the batch processing form if user is allowed ?>
	<?php if ($loggeduser->authorise('core.create', 'com_users')
		&& $loggeduser->authorise('core.edit', 'com_users')
		&& $loggeduser->authorise('core.edit.state', 'com_users')) : ?>
		<?php echo JHtml::_(
			'bootstrap.renderModal',
			'collapseModal',
			array(
				'title'  => JText::_('COM_USERS_BATCH_OPTIONS'),
				'footer' => $this->loadTemplate('batch_footer'),
			),
			$this->loadTemplate('batch_body')
		); ?>
	<?php endif;?>

	<?php echo $this->pagination->getListFooter(); ?>
	<div>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
		<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</div>
</form>
templates/hathor/html/com_users/debuguser/default.php000060400000013331152453623430017120 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('bootstrap.tooltip');

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>

<form action="<?php echo JRoute::_('index.php?option=com_users&view=debuguser&user_id=' . (int) $this->state->get('user_id')); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('COM_USERS_SEARCH_ASSETS'); ?></legend>
		<div class="filter-search fltlft">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('COM_USERS_SEARCH_ASSETS'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_USERS_SEARCH_USERS'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_RESET'); ?></button>
		</div>

		<div class="filter-select fltrt">
			<label class="selectlabel" for="filter_component"><?php echo JText::_('COM_USERS_OPTION_SELECT_COMPONENT'); ?></label>
			<select name="filter_component" id="filter_component">
				<option value=""><?php echo JText::_('COM_USERS_OPTION_SELECT_COMPONENT');?></option>
				<?php if (!empty($this->components))
				{
					echo JHtml::_('select.options', $this->components, 'value', 'text', $this->state->get('filter.component'));
				}?>
			</select>

			<label class="selectlabel" for="filter_level_start"><?php echo JText::_('COM_USERS_OPTION_SELECT_LEVEL_START'); ?></label>
			<select name="filter_level_start" id="filter_level_start">
				<option value=""><?php echo JText::_('COM_USERS_OPTION_SELECT_LEVEL_START');?></option>
				<?php echo JHtml::_('select.options', $this->levels, 'value', 'text', $this->state->get('filter.level_start'));?>
			</select>

			<label class="selectlabel" for="filter_level_end"><?php echo JText::_('COM_USERS_OPTION_SELECT_LEVEL_END'); ?></label>
			<select name="filter_level_end" id="filter_level_end">
				<option value=""><?php echo JText::_('COM_USERS_OPTION_SELECT_LEVEL_END');?></option>
				<?php echo JHtml::_('select.options', $this->levels, 'value', 'text', $this->state->get('filter.level_end'));?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>

	</fieldset>
	<div class="clr"> </div>

	<div>
		<?php echo JText::_('COM_USERS_DEBUG_LEGEND'); ?>
		<span class="check-0 swatch"><?php echo JText::sprintf('COM_USERS_DEBUG_IMPLICIT_DENY', '-');?></span>
		<span class="check-a swatch"><?php echo JText::sprintf('COM_USERS_DEBUG_EXPLICIT_ALLOW', '&#10003;');?></span>
		<span class="check-d swatch"><?php echo JText::sprintf('COM_USERS_DEBUG_EXPLICIT_DENY', '&#10007;');?></span>
	</div>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="left">
					<?php echo JHtml::_('grid.sort', 'COM_USERS_HEADING_ASSET_TITLE', 'a.title', $listDirn, $listOrder); ?>
				</th>
				<th class="left">
					<?php echo JHtml::_('grid.sort', 'COM_USERS_HEADING_ASSET_NAME', 'a.name', $listDirn, $listOrder); ?>
				</th>
				<?php foreach ($this->actions as $key => $action) : ?>
				<th class="width-5">
					<span class="hasTooltip" title="<?php echo JHtml::_('tooltipText', $key, $action[1]); ?>"><?php echo JText::_($key); ?></span>
				</th>
				<?php endforeach; ?>
				<th class="width-5 nowrap">
					<?php echo JHtml::_('grid.sort', 'COM_USERS_HEADING_LFT', 'a.lft', $listDirn, $listOrder); ?>
				</th>
				<th class="width-5 nowrap">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) : ?>
			<tr class="row1">
				<th>
					<?php echo $this->escape($item->title); ?>
				</th>
				<td class="nowrap">
					<?php echo str_repeat('<span class="gi">|&mdash;</span>', $item->level) ?>
					<?php echo $this->escape($item->name); ?>
				</td>
				<?php foreach ($this->actions as $action) : ?>
					<?php
					$name  = $action[0];
					$check = $item->checks[$name];
					if ($check === true) :
						$class = 'check-a';
						$text  = '&#10003;';
					elseif ($check === false) :
						$class = 'check-d';
						$text  = '&#10007;';
					elseif ($check === null) :
						$class = 'check-0';
						$text  = '-';
					else :
						$class = '';
						$text  = '&#160;';
					endif;
					?>
				<td class="center <?php echo $class;?>">
					<?php echo $text; ?>
				</td>
				<?php endforeach; ?>
				<td class="center">
					<?php echo (int) $item->lft; ?>
					- <?php echo (int) $item->rgt; ?>
				</td>
				<td class="center">
					<?php echo (int) $item->id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>

	<div>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
		<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</div>
</form>
templates/hathor/html/com_users/user/edit.php000060400000011365152453623430015417 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');

// Get the form fieldsets.
$fieldsets = $this->form->getFieldsets();

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(task)
	{
		if (task == 'user.cancel' || document.formvalidator.isValid(document.getElementById('user-form')))
		{
			Joomla.submitform(task, document.getElementById('user-form'));
		}
	}

	Joomla.twoFactorMethodChange = function(e)
	{
		var selectedPane = 'com_users_twofactor_' + jQuery('#jform_twofactor_method').val();

		jQuery.each(jQuery('#com_users_twofactor_forms_container>div'), function(i, el) {
			if (el.id != selectedPane)
			{
				jQuery('#' + el.id).hide(0);
			}
			else
			{
				jQuery('#' + el.id).show(0);
			}
		});
	}
");
?>

<form action="<?php echo JRoute::_('index.php?option=com_users&layout=edit&id='.(int) $this->item->id); ?>" method="post" name="adminForm" id="user-form" class="form-validate" enctype="multipart/form-data">
	<div class="col main-section">
		<fieldset class="adminform">
			<legend><?php echo JText::_('COM_USERS_USER_ACCOUNT_DETAILS'); ?></legend>
			<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset('user_details') as $field) : ?>
				<li><?php echo $field->label; ?>
				<?php echo $field->input; ?></li>
			<?php endforeach; ?>
			</ul>
		</fieldset>
	</div>
	<div class="col options-section">
		<?php echo  JHtml::_('sliders.start', 'user-slider', array('useCookie' => 1)); ?>
		<?php if ($this->grouplist) : ?>
			<?php echo JHtml::_('sliders.panel', JText::_('COM_USERS_ASSIGNED_GROUPS'), 'groups'); ?>
			<fieldset class="panelform">
				<legend class="element-invisible"><?php echo JText::_('COM_USERS_ASSIGNED_GROUPS'); ?></legend>
				<?php echo $this->loadTemplate('groups'); ?>
			</fieldset>
		<?php endif; ?>
		<?php
		foreach ($fieldsets as $fieldset) :
			if ($fieldset->name == 'user_details') :
				continue;
			endif;
			echo JHtml::_('sliders.panel', JText::_($fieldset->label), $fieldset->name);
		?>
		<fieldset class="panelform">
			<ul class="adminformlist">
				<?php foreach ($this->form->getFieldset($fieldset->name) as $field) : ?>
					<?php if ($field->hidden) : ?>
						<?php echo $field->input; ?>
					<?php else : ?>
						<li><?php echo $field->label; ?>
						<?php echo $field->input; ?></li>
					<?php endif; ?>
				<?php endforeach; ?>
			</ul>
		</fieldset>
		<?php endforeach; ?>

		<?php if (!empty($this->tfaform) && $this->item->id): ?>
		<?php echo JHtml::_('sliders.panel', JText::_('COM_USERS_USER_TWO_FACTOR_AUTH'), 'twofactorauth'); ?>
		<div class="control-group">
			<div class="control-label">
				<label id="jform_twofactor_method-lbl" for="jform_twofactor_method" class="hasTooltip"
						title="<?php echo '<strong>' . JText::_('COM_USERS_USER_FIELD_TWOFACTOR_LABEL') . '</strong><br />' . JText::_('COM_USERS_USER_FIELD_TWOFACTOR_DESC'); ?>">
					<?php echo JText::_('COM_USERS_USER_FIELD_TWOFACTOR_LABEL'); ?>
				</label>
			</div>
			<div class="controls">
				<?php echo JHtml::_('select.genericlist', Usershelper::getTwoFactorMethods(), 'jform[twofactor][method]', array('onchange' => 'Joomla.twoFactorMethodChange()'), 'value', 'text', $this->otpConfig->method, 'jform_twofactor_method', false) ?>
			</div>
		</div>
		<div id="com_users_twofactor_forms_container">
			<?php foreach ($this->tfaform as $form): ?>
			<?php $style = $form['method'] == $this->otpConfig->method ? 'display: block' : 'display: none'; ?>
			<div id="com_users_twofactor_<?php echo $form['method'] ?>" style="<?php echo $style; ?>">
				<?php echo $form['form'] ?>
			</div>
			<?php endforeach; ?>
		</div>

		<fieldset>
			<legend>
				<?php echo JText::_('COM_USERS_USER_OTEPS') ?>
			</legend>
			<div class="alert alert-info">
				<?php echo JText::_('COM_USERS_USER_OTEPS_DESC') ?>
			</div>
			<?php if (empty($this->otpConfig->otep)): ?>
			<div class="alert alert-warning">
				<?php echo JText::_('COM_USERS_USER_OTEPS_WAIT_DESC') ?>
			</div>
			<?php else: ?>
			<?php foreach ($this->otpConfig->otep as $otep): ?>
			<span class="span3">
				<?php echo substr($otep, 0, 4) ?>-<?php echo substr($otep, 4, 4) ?>-<?php echo substr($otep, 8, 4) ?>-<?php echo substr($otep, 12, 4) ?>
			</span>
			<?php endforeach; ?>
			<div class="clearfix"></div>
			<?php endif; ?>
		</fieldset>
		<?php endif; ?>

		<?php echo JHtml::_('sliders.end'); ?>

		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/com_modules/positions/modal.php000060400000010665152453623430017150 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

$function  = JFactory::getApplication()->input->getCmd('function', 'jSelectPosition');
$lang      = JFactory::getLanguage();
$ordering  = $this->escape($this->state->get('list.ordering'));
$direction = $this->escape($this->state->get('list.direction'));
$clientId  = $this->state->get('client_id');
$state     = $this->state->get('filter.state');
$template  = $this->state->get('filter.template');
$type      = $this->state->get('filter.type');
?>
<form action="<?php echo JRoute::_('index.php?option=com_modules&view=positions&layout=modal&tmpl=component&function='.$function.'&client_id=' .$clientId);?>" method="post" name="adminForm" id="adminForm">
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search">
			<label for="filter_search">
				<?php echo JText::_('JSEARCH_FILTER_LABEL'); ?>
			</label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" size="30" title="<?php echo JText::_('COM_MODULES_FILTER_SEARCH_DESC'); ?>" />

			<button type="submit">
				<?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();">
				<?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>

		<div class="filter-select">
			<label class="selectlabel" for="filter_state">
				<?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?>
			</label>
			<select name="filter_state" id="filter_state">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('modules.templateStates'), 'value', 'text', $state, true);?>
			</select>

			<label class="selectlabel" for="filter_type">
				<?php echo JText::_('COM_MODULES_OPTION_SELECT_TYPE'); ?>
			</label>
			<select name="filter_type" id="filter_type">
				<option value=""><?php echo JText::_('COM_MODULES_OPTION_SELECT_TYPE');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('modules.types'), 'value', 'text', $type, true);?>
			</select>

			<label class="selectlabel" for="filter_template">
				<?php echo JText::_('JOPTION_SELECT_TEMPLATE'); ?>
			</label>
			<select name="filter_template" id="filter_template">
				<option value=""><?php echo JText::_('JOPTION_SELECT_TEMPLATE');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('modules.templates', $clientId), 'value', 'text', $template, true);?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="title width-20">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_TITLE', 'value', $direction, $ordering); ?>
				</th>
				<th>
					<?php echo JHtml::_('grid.sort', 'COM_MODULES_HEADING_TEMPLATES', 'templates', $direction, $ordering); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php $i = 1; foreach ($this->items as $value => $templates) : ?>
			<tr class="row<?php echo $i = 1 - $i;?>">
				<td>
					<a class="pointer" onclick="if (window.parent) window.parent.<?php echo $function;?>('<?php echo $value; ?>');"><?php echo $this->escape($value); ?></a>
				</td>
				<td>
					<?php if (!empty($templates)):?>
					<a class="pointer" onclick="if (window.parent) window.parent.<?php echo $function;?>('<?php echo $value; ?>');">
						<ul>
						<?php foreach ($templates as $template => $label):?>
							<li><?php echo $lang->hasKey($label) ? JText::sprintf('COM_MODULES_MODULE_TEMPLATE_POSITION', JText::_($template), JText::_($label)) : JText::_($template);?></li>
						<?php endforeach;?>
						</ul>
					</a>
					<?php endif;?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>

	<div>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<input type="hidden" name="filter_order" value="<?php echo $ordering; ?>" />
		<input type="hidden" name="filter_order_Dir" value="<?php echo $direction; ?>" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/com_modules/modules/default.php000060400000025615152453623430017122 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.multiselect');
JHtml::_('behavior.modal');

$client    = $this->state->get('client_id') ? 'administrator' : 'site';
$user      = JFactory::getUser();
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$canOrder  = $user->authorise('core.edit.state', 'com_modules');
$saveOrder = $listOrder == 'ordering';
?>

<form action="<?php echo JRoute::_('index.php?option=com_modules'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_MODULES_MODULES_FILTER_SEARCH_DESC'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>

		<div class="filter-select">
			<label class="selectlabel" for="client_id">
				<?php echo JText::_('JGLOBAL_FILTER_CLIENT'); ?>
			</label>
			<select name="client_id" id="client_id">
				<?php echo JHtml::_('select.options', ModulesHelper::getClientOptions(), 'value', 'text', $this->state->get('client_id')); ?>
			</select>

			<label class="selectlabel" for="filter_state">
				<?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?>
			</label>
			<select name="filter_state" id="filter_state">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?></option>
				<?php echo JHtml::_('select.options', ModulesHelper::getStateOptions(), 'value', 'text', $this->state->get('filter.state')); ?>
			</select>

			<label class="selectlabel" for="filter_position">
				<?php echo JText::_('COM_MODULES_OPTION_SELECT_POSITION'); ?>
			</label>
			<select name="filter_position" id="filter_position">
				<option value=""><?php echo JText::_('COM_MODULES_OPTION_SELECT_POSITION'); ?></option>
				<?php echo JHtml::_('select.options', ModulesHelper::getPositions($this->state->get('client_id')), 'value', 'text', $this->state->get('filter.position')); ?>
			</select>

			<label class="selectlabel" for="filter_module">
				<?php echo JText::_('COM_MODULES_OPTION_SELECT_MODULE'); ?>
			</label>
			<select name="filter_module" id="filter_module">
				<option value=""><?php echo JText::_('COM_MODULES_OPTION_SELECT_MODULE'); ?></option>
				<?php echo JHtml::_('select.options', ModulesHelper::getModules($this->state->get('client_id')), 'value', 'text', $this->state->get('filter.module')); ?>
			</select>

			<label class="selectlabel" for="filter_access">
				<?php echo JText::_('JOPTION_SELECT_ACCESS'); ?>
			</label>
			<select name="filter_access" id="filter_access">
				<option value=""><?php echo JText::_('JOPTION_SELECT_ACCESS'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text', $this->state->get('filter.access')); ?>
			</select>

			<label class="selectlabel" for="filter_language">
				<?php echo JText::_('JOPTION_SELECT_LANGUAGE'); ?>
			</label>
			<select name="filter_language" id="filter_language">
				<option value=""><?php echo JText::_('JOPTION_SELECT_LANGUAGE'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('contentlanguage.existing', true, true), 'value', 'text', $this->state->get('filter.language')); ?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>

		</div>
	</fieldset>
	<div class="clr"> </div>

	<table class="adminlist" id="modules-mgr">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_TITLE', 'title', $listDirn, $listOrder); ?>
				</th>
				<th class="width-5">
					<?php echo JHtml::_('grid.sort', 'JSTATUS', 'published', $listDirn, $listOrder); ?>
				</th>
				<th class="width-20">
					<?php echo JHtml::_('grid.sort', 'COM_MODULES_HEADING_POSITION', 'position', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap ordering-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ORDERING', 'ordering', $listDirn, $listOrder); ?>
					<?php if ($canOrder && $saveOrder) : ?>
						<?php echo JHtml::_('grid.order', $this->items, 'filesave.png', 'modules.saveorder'); ?>
					<?php endif; ?>
				</th>
				<th class="width-10">
					<?php echo JHtml::_('grid.sort', 'COM_MODULES_HEADING_MODULE', 'name', $listDirn, $listOrder); ?>
				</th>
				<th class="width-10">
					<?php echo JHtml::_('grid.sort', 'COM_MODULES_HEADING_PAGES', 'pages', $listDirn, $listOrder); ?>
				</th>
				<th class="title access-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ACCESS', 'access', $listDirn, $listOrder); ?>
				</th>
				<th class="language-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_LANGUAGE', 'language_title', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) :
			$ordering  = ($listOrder == 'ordering');
			$canCreate  = $user->authorise('core.create',     'com_modules');
			$canEdit    = $user->authorise('core.edit',       'com_modules');
			$canCheckin = $user->authorise('core.manage',     'com_checkin') || $item->checked_out == $user->get('id') || $item->checked_out == 0;
			$canChange  = $user->authorise('core.edit.state', 'com_modules') && $canCheckin;
		?>
			<tr class="row<?php echo $i % 2; ?>">
				<td class="center">
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				</td>
				<td>
					<?php if ($item->checked_out) : ?>
						<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'modules.', $canCheckin); ?>
					<?php endif; ?>
					<?php if ($canEdit) : ?>
						<a href="<?php echo JRoute::_('index.php?option=com_modules&task=module.edit&id='.(int) $item->id); ?>">
							<?php echo $this->escape($item->title); ?></a>
					<?php else : ?>
							<?php echo $this->escape($item->title); ?>
					<?php endif; ?>
					<?php if (!empty($item->note)) : ?>
					<p class="smallsub">
						<?php echo JText::sprintf('JGLOBAL_LIST_NOTE', $this->escape($item->note)); ?></p>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php // Check if extension is enabled ?>
					<?php if ($item->enabled > 0) : ?>
						<?php echo JHtml::_('modules.state', $item->published, $i, $canChange, 'cb'); ?>
					<?php else : ?>
						<?php // Extension is not enabled, show a message that indicates this. ?>
							<button class="btn btn-micro hasTooltip" title="<?php echo JText::_('COM_MODULES_MSG_MANAGE_EXTENSION_DISABLED'); ?>">
								<span class="icon-ban-circle" aria-hidden="true"></span>
							</button>
					<?php endif; ?>					
				</td>
				<td class="center">
					<?php echo $item->position; ?>
				</td>
				<td class="order">
					<?php if ($canChange) : ?>
						<?php if ($saveOrder) :?>
							<?php if ($listDirn == 'asc') : ?>
								<span><?php echo $this->pagination->orderUpIcon($i, @$this->items[$i - 1]->position == $item->position, 'modules.orderup', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
								<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, @$this->items[$i + 1]->position == $item->position, 'modules.orderdown', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
							<?php elseif ($listDirn == 'desc') : ?>
								<span><?php echo $this->pagination->orderUpIcon($i, @$this->items[$i - 1]->position == $item->position, 'modules.orderdown', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
								<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, @$this->items[$i + 1]->position == $item->position, 'modules.orderup', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
							<?php endif; ?>
						<?php endif; ?>
						<?php $disabled = $saveOrder ?  '' : 'disabled="disabled"'; ?>
						<input type="text" name="order[]" value="<?php echo $item->ordering; ?>" <?php echo $disabled; ?> class="text-area-order" title="<?php echo $item->title; ?> order" />
					<?php else : ?>
						<?php echo $item->ordering; ?>
					<?php endif; ?>
				</td>
				<td class="left">
					<?php echo $item->name; ?>
				</td>
				<td class="center">
					<?php echo $item->pages; ?>
				</td>

				<td class="center">
					<?php echo $this->escape($item->access_level); ?>
				</td>
				<td class="center">
					<?php if ($item->language == ''):?>
						<?php echo JText::_('JDEFAULT'); ?>
					<?php elseif ($item->language == '*'):?>
						<?php echo JText::alt('JALL', 'language'); ?>
					<?php else:?>
						<?php echo $item->language_title ? JHtml::_('image', 'mod_languages/' . $item->language_image . '.gif', $item->language_title, array('title' => $item->language_title), true) . '&nbsp;' . $this->escape($item->language_title) : JText::_('JUNDEFINED'); ?>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo (int) $item->id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php // Load the batch processing form. ?>
	<?php if ($user->authorise('core.create', 'com_modules')
		&& $user->authorise('core.edit', 'com_modules')
		&& $user->authorise('core.edit.state', 'com_modules')) : ?>
		<?php echo JHtml::_(
			'bootstrap.renderModal',
			'collapseModal',
			array(
				'title' => JText::_('COM_MODULES_BATCH_OPTIONS'),
				'footer' => $this->loadTemplate('batch_footer')
			),
			$this->loadTemplate('batch_body')
		); ?>
	<?php endif; ?>

	<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
</div>
</form>
<script type="text/javascript">
jQuery("#client_id").on("change", function()
{
	jQuery("#filter_position, #filter_module, #filter_language").val("");
});
</script>
templates/hathor/html/com_modules/module/edit.php000060400000011644152453623430016235 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.combobox');
$hasContent = empty($this->item->module) || $this->item->module == 'custom' || $this->item->module == 'mod_custom';

$script = "Joomla.submitbutton = function(task)
	{
			if (task == 'module.cancel' || document.formvalidator.isValid(document.getElementById('module-form'))) {";
if ($hasContent)
{
	$script .= $this->form->getField('content')->save();
}
$script .= "	Joomla.submitform(task, document.getElementById('module-form'));
				if (self != top)
				{
					window.parent.jQuery('.modal').modal('hide');
				}
			}
	}";

JFactory::getDocument()->addScriptDeclaration($script);
?>
<div class="module-edit">

<form action="<?php echo JRoute::_('index.php?option=com_modules&layout=edit&id='.(int) $this->item->id); ?>" method="post" name="adminForm" id="module-form" class="form-validate">
	<div class="col main-section">
		<fieldset class="adminform">
			<legend><?php echo JText::_('JDETAILS'); ?></legend>
			<ul class="adminformlist">

			<li><?php echo $this->form->getLabel('title'); ?>
			<?php echo $this->form->getInput('title'); ?></li>

			<li><?php echo $this->form->getLabel('showtitle'); ?>
			<?php echo $this->form->getInput('showtitle'); ?></li>

			<li><?php echo $this->form->getLabel('position'); ?>
			<?php echo $this->form->getInput('custom_position'); ?>
			<label id="jform_custom_position-lbl" for="jform_custom_position" class="element-invisible"><?php echo JText::_('TPL_HATHOR_COM_MODULES_CUSTOM_POSITION_LABEL');?></label>
			<?php echo $this->form->getInput('position'); ?></li>

			<?php if ((string) $this->item->xml->name != 'Login Form') : ?>
			<li><?php echo $this->form->getLabel('published'); ?>
			<?php echo $this->form->getInput('published'); ?></li>
			<?php endif; ?>

			<li><?php echo $this->form->getLabel('access'); ?>
			<?php echo $this->form->getInput('access'); ?></li>

			<li><?php echo $this->form->getLabel('ordering'); ?>
			<?php echo $this->form->getInput('ordering'); ?></li>

			<?php if ((string) $this->item->xml->name != 'Login Form') : ?>
			<li><?php echo $this->form->getLabel('publish_up'); ?>
			<?php echo $this->form->getInput('publish_up'); ?></li>

			<li><?php echo $this->form->getLabel('publish_down'); ?>
			<?php echo $this->form->getInput('publish_down'); ?></li>
			<?php endif; ?>

			<li><?php echo $this->form->getLabel('language'); ?>
			<?php echo $this->form->getInput('language'); ?></li>

			<li><?php echo $this->form->getLabel('note'); ?>
			<?php echo $this->form->getInput('note'); ?></li>

			<?php if ($this->item->id) : ?>
				<li><?php echo $this->form->getLabel('id'); ?>
				<?php echo $this->form->getInput('id'); ?></li>
			<?php endif; ?>

			<li><?php echo $this->form->getLabel('module'); ?>
			<?php echo $this->form->getInput('module'); ?>
			<span class="faux-input"><?php if ($this->item->xml) echo ($text = (string) $this->item->xml->name) ? JText::_($text) : $this->item->module;else echo JText::_(COM_MODULES_ERR_XML);?></span></li>

			<li><?php echo $this->form->getLabel('client_id'); ?>
			<input type="text" size="35" id="jform_client_id" value="<?php echo $this->item->client_id == 0 ? JText::_('JSITE') : JText::_('JADMINISTRATOR'); ?>	" class="readonly" readonly="readonly" />
			<?php echo $this->form->getInput('client_id'); ?></li>
			</ul>
			<div class="clr"></div>

			<?php if ($this->item->xml) : ?>
				<?php if ($text = trim($this->item->xml->description)) : ?>
					<span class="faux-label">
						<?php echo JText::_('COM_MODULES_MODULE_DESCRIPTION'); ?>
					</span>
					<div class="clr"></div>
					<div class="readonly mod-desc extdescript">
						<?php echo JText::_($text); ?>
					</div>
				<?php endif; ?>
			<?php else : ?>
				<?php echo JText::_('COM_MODULES_ERR_XML'); ?>
			<?php endif; ?>
			<div class="clr"></div>
		</fieldset>
	</div>

	<div class="col options-section">
	<?php echo JHtml::_('sliders.start', 'module-sliders'); ?>
		<?php echo $this->loadTemplate('options'); ?>
	<?php echo JHtml::_('sliders.end'); ?>
	</div>

	<?php if ($hasContent) : ?>
		<div class="col main-section">
		<fieldset class="adminform">
			<legend><?php echo JText::_('COM_MODULES_CUSTOM_OUTPUT'); ?></legend>
			<ul class="adminformlist">
				<li><?php echo $this->form->getLabel('content'); ?>
			<div class="clr"></div>
				<?php echo $this->form->getInput('content'); ?></li>
			</ul>
		</fieldset>
		</div>
	<?php endif; ?>

	<?php if ($this->item->client_id == 0) :?>
	<div class="col main-section">
		<?php echo $this->loadTemplate('assignment'); ?>
	</div>
	<?php endif; ?>

	<div>
		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
</div>
templates/hathor/html/com_modules/module/edit_assignment.php000060400000011463152453623430020464 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Initialise related data.
JLoader::register('MenusHelper', JPATH_ADMINISTRATOR . '/components/com_menus/helpers/menus.php');
$menuTypes = MenusHelper::getMenuLinks();

JFactory::getDocument()->addScriptDeclaration("
	window.addEvent('domready', function(){
		validate();
		document.getElements('select').addEvent('change', function(e){validate();});
	});
	function validate(){
		var value = document.id('jform_assignment').value;
		var list  = document.id('menu-assignment');
		if (value == '-' || value == '0'){
			$$('.jform-assignments-button').each(function(el) {el.setProperty('disabled', true); });
			list.getElements('input').each(function(el){
				el.setProperty('disabled', true);
				if (value == '-'){
					el.setProperty('checked', false);
				} else {
					el.setProperty('checked', true);
				}
			});
		} else {
			$$('.jform-assignments-button').each(function(el) {el.setProperty('disabled', false); });
			list.getElements('input').each(function(el){
				el.setProperty('disabled', false);
			});
		}
	}
");
?>

		<fieldset class="adminform">
			<legend><?php echo JText::_('COM_MODULES_MENU_ASSIGNMENT'); ?></legend>
			<label id="jform_menus-lbl" for="jform_menus"><?php echo JText::_('COM_MODULES_MODULE_ASSIGN'); ?></label>

			<fieldset id="jform_menus" class="radio">
				<select name="jform[assignment]" id="jform_assignment">
					<?php echo JHtml::_('select.options', ModulesHelper::getAssignmentOptions($this->item->client_id), 'value', 'text', $this->item->assignment, true);?>
				</select>

			</fieldset>

			<label id="jform_menuselect-lbl" for="jform_menuselect"><?php echo JText::_('JGLOBAL_MENU_SELECTION'); ?></label>

			<button type="button" class="jform-assignments-button jform-rightbtn" onclick="$$('.chkbox').each(function(el) { el.checked = !el.checked; });">
				<?php echo JText::_('JGLOBAL_SELECTION_INVERT_ALL'); ?>
			</button>

			<button type="button" class="jform-assignments-button jform-rightbtn" onclick="$$('.chkbox').each(function(el) { el.checked = false; });">
				<?php echo JText::_('JGLOBAL_SELECTION_NONE'); ?>
			</button>

			<button type="button" class="jform-assignments-button jform-rightbtn" onclick="$$('.chkbox').each(function(el) { el.checked = true; });">
				<?php echo JText::_('JGLOBAL_SELECTION_ALL'); ?>
			</button>

			<div class="clr"></div>

			<div id="menu-assignment">

			<?php echo JHtml::_('tabs.start', 'module-menu-assignment-tabs', array('useCookie' => 1));?>

			<?php foreach ($menuTypes as &$type) :
				echo JHtml::_('tabs.panel', $type->title ?: $type->menutype, $type->menutype.'-details');

				$chkbox_class = 'chk-menulink-' . $type->id; ?>

				<button type="button" class="jform-assignments-button jform-rightbtn" onclick="$$('.<?php echo $chkbox_class; ?>').each(function(el) { el.checked = !el.checked; });">
					<?php echo JText::_('JGLOBAL_SELECTION_INVERT'); ?>
				</button>

				<button type="button" class="jform-assignments-button jform-rightbtn" onclick="$$('.<?php echo $chkbox_class; ?>').each(function(el) { el.checked = false; });">
					<?php echo JText::_('JGLOBAL_SELECTION_NONE'); ?>
				</button>

				<button type="button" class="jform-assignments-button jform-rightbtn" onclick="$$('.<?php echo $chkbox_class; ?>').each(function(el) { el.checked = true; });">
					<?php echo JText::_('JGLOBAL_SELECTION_ALL'); ?>
				</button>

				<div class="clr"></div>

				<?php $count = count($type->links); ?>
				<?php $i     = 0; ?>
				<?php if ($count) : ?>
				<ul class="menu-links">
					<?php
					foreach ($type->links as $link) :
						if (trim($this->item->assignment) == '-') :
							$checked = '';
						elseif ($this->item->assignment == 0) :
							$checked = ' checked="checked"';
						elseif ($this->item->assignment < 0) :
							$checked = in_array(-$link->value, $this->item->assigned) ? ' checked="checked"' : '';
						elseif ($this->item->assignment > 0) :
							$checked = in_array($link->value, $this->item->assigned) ? ' checked="checked"' : '';
						endif;
					?>
					<li class="menu-link">
						<input type="checkbox" class="chkbox <?php echo $chkbox_class; ?>" name="jform[assigned][]" value="<?php echo (int) $link->value;?>" id="link<?php echo (int) $link->value;?>"<?php echo $checked;?>/>
						<label for="link<?php echo (int) $link->value;?>">
							<?php echo $link->text; ?>
						</label>
					</li>
					<?php if ($count > 20 && ++$i == ceil($count / 2)) :?>
					</ul><ul class="menu-links">
					<?php endif; ?>
					<?php endforeach; ?>
				</ul>
				<div class="clr"></div>
				<?php endif; ?>
			<?php endforeach; ?>

			<?php echo JHtml::_('tabs.end');?>

			</div>
		</fieldset>
templates/hathor/html/com_modules/module/edit_options.php000060400000002315152453623430020003 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

	$fieldSets = $this->form->getFieldsets('params');

	foreach ($fieldSets as $name => $fieldSet) :
		$label = !empty($fieldSet->label) ? $fieldSet->label : 'COM_MODULES_'.$name.'_FIELDSET_LABEL';
		echo JHtml::_('sliders.panel', JText::_($label), $name.'-options');
			if (isset($fieldSet->description) && trim($fieldSet->description)) :
				echo '<p class="tip">'.$this->escape(JText::_($fieldSet->description)).'</p>';
			endif;
			?>
		<fieldset class="panelform">
		<legend class="element-invisible"><?php echo JText::_($label); ?></legend>
		<?php $hidden_fields = ''; ?>
		<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset($name) as $field) : ?>
			<?php if (!$field->hidden) : ?>
			<li>
				<?php echo $field->label; ?>
				<?php echo $field->input; ?>
			</li>
			<?php else : $hidden_fields .= $field->input; ?>
			<?php endif; ?>
			<?php endforeach; ?>
		</ul>
		<?php echo $hidden_fields; ?>
		</fieldset>
	<?php endforeach; ?>
templates/hathor/html/com_content/articles/modal.php000060400000014001152453623430016715 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$app = JFactory::getApplication();

if ($app->isClient('site'))
{
	JSession::checkToken('get') or die(JText::_('JINVALID_TOKEN'));
}

JLoader::register('ContentHelperRoute', JPATH_ROOT . '/components/com_content/helpers/route.php');

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

$function  = $app->input->getCmd('function', 'jSelectArticle');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>
<form action="<?php echo JRoute::_('index.php?option=com_content&view=articles&layout=modal&tmpl=component&function='.$function.'&'.JSession::getFormToken().'=1');?>" method="post" name="adminForm" id="adminForm">
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search">
				<?php echo JText::_('JSEARCH_FILTER_LABEL'); ?>
			</label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_CONTENT_FILTER_SEARCH_DESC'); ?>" />

			<button type="submit">
				<?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();">
				<?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>

		<div class="filter-select">
			<label class="selectlabel" for="filter_access"><?php echo JText::_('JOPTION_SELECT_ACCESS'); ?></label>
			<select name="filter_access" id="filter_access">
				<option value=""><?php echo JText::_('JOPTION_SELECT_ACCESS');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text', $this->state->get('filter.access'));?>
			</select>

			<label class="selectlabel" for="filter_published"><?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?></label>
			<select name="filter_published" id="filter_published">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.published'), true);?>
			</select>

			<label class="selectlabel" for="filter_category_id"><?php echo JText::_('JOPTION_SELECT_CATEGORY'); ?></label>
			<select name="filter_category_id" id="filter_category_id">
				<option value=""><?php echo JText::_('JOPTION_SELECT_CATEGORY');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('category.options', 'com_content'), 'value', 'text', $this->state->get('filter.category_id'));?>
			</select>
			<?php if ($this->state->get('filter.forcedLanguage')) : ?>
			<input type="hidden" name="forcedLanguage" value="<?php echo $this->escape($this->state->get('filter.forcedLanguage')); ?>" />
			<input type="hidden" name="filter_language" value="<?php echo $this->escape($this->state->get('filter.language')); ?>" />
			<?php else : ?>
			<label class="selectlabel" for="filter_language"><?php echo JText::_('JOPTION_SELECT_LANGUAGE'); ?></label>
			<select name="filter_language" id="filter_language">
				<option value=""><?php echo JText::_('JOPTION_SELECT_LANGUAGE');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('contentlanguage.existing', true, true), 'value', 'text', $this->state->get('filter.language'));?>
			</select>
			<?php endif; ?>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>

	<table class="adminlist modal">
		<thead>
			<tr>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
				</th>
				<th class="title access-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ACCESS', 'access_level', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap state-col">
					<?php echo JHtml::_('grid.sort', 'JCATEGORY', 'a.catid', $listDirn, $listOrder); ?>
				</th>
				<th class="title language-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_LANGUAGE', 'language', $listDirn, $listOrder); ?>
				</th>
				<th class="title date-col">
					<?php echo JHtml::_('grid.sort', 'JDATE', 'a.created', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) : ?>
			<tr class="row<?php echo $i % 2; ?>">
				<th>
					<a class="pointer" onclick="if (window.parent) window.parent.<?php echo $this->escape($function);?>('<?php echo $item->id; ?>', '<?php echo $this->escape(addslashes($item->title)); ?>', '<?php echo $this->escape($item->catid); ?>', null, '<?php echo $this->escape(ContentHelperRoute::getArticleRoute($item->id, $item->catid, $item->language)); ?>');">
						<?php echo $this->escape($item->title); ?></a>
				</th>
				<td class="center">
					<?php echo $this->escape($item->access_level); ?>
				</td>
				<td class="center">
					<?php echo $this->escape($item->category_title); ?>
				</td>
				<td class="center">
					<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
				</td>
				<td class="center nowrap">
					<?php echo JHtml::_('date', $item->created, JText::_('DATE_FORMAT_LC4')); ?>
				</td>
				<td class="center">
					<?php echo (int) $item->id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
</form>
templates/hathor/html/com_content/articles/default.php000060400000027366152453623430017267 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.multiselect');

$app       = JFactory::getApplication();
$user      = JFactory::getUser();
$userId    = $user->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();
$n         = count($this->items);
?>

<form action="<?php echo JRoute::_('index.php?option=com_content&view=articles'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_CONTENT_FILTER_SEARCH_DESC'); ?>" />
			<button type="submit" class="btn"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>

		<div class="filter-select">
			<label class="selectlabel" for="filter_published"><?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?></label>
			<select name="filter_published" id="filter_published">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.published'), true); ?>
			</select>

			<label class="selectlabel" for="filter_category_id"><?php echo JText::_('JOPTION_SELECT_CATEGORY'); ?></label>
			<select name="filter_category_id" id="filter_category_id">
				<option value=""><?php echo JText::_('JOPTION_SELECT_CATEGORY'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('category.options', 'com_content', array('filter.published' => array(-2, 0, 1, 2))), 'value', 'text', $this->state->get('filter.category_id')); ?>
			</select>

			<label class="selectlabel" for="filter_level"><?php echo JText::_('JOPTION_SELECT_MAX_LEVELS'); ?></label>
			<select name="filter_level" id="filter_level">
				<option value=""><?php echo JText::_('JOPTION_SELECT_MAX_LEVELS'); ?></option>
				<?php echo JHtml::_('select.options', $this->f_levels, 'value', 'text', $this->state->get('filter.level')); ?>
			</select>

			<label class="selectlabel" for="filter_access"><?php echo JText::_('JOPTION_SELECT_ACCESS'); ?></label>
			<select name="filter_access" id="filter_access">
				<option value=""><?php echo JText::_('JOPTION_SELECT_ACCESS'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text', $this->state->get('filter.access')); ?>
			</select>

			<label class="selectlabel" for="filter_author_id"><?php echo JText::_('JOPTION_SELECT_AUTHOR'); ?></label>
			<select name="filter_author_id"  id="filter_author_id">
				<option value=""><?php echo JText::_('JOPTION_SELECT_AUTHOR'); ?></option>
				<?php echo JHtml::_('select.options', $this->authors, 'value', 'text', $this->state->get('filter.author_id')); ?>
			</select>

			<label class="selectlabel" for="filter_language"><?php echo JText::_('JOPTION_SELECT_LANGUAGE'); ?></label>
			<select name="filter_language" id="filter_language">
				<option value=""><?php echo JText::_('JOPTION_SELECT_LANGUAGE'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('contentlanguage.existing', true, true), 'value', 'text', $this->state->get('filter.language')); ?>
			</select>

			<label class="selectlabel" for="filter_tag"><?php echo JText::_('JOPTION_SELECT_TAG'); ?></label>
			<select name="filter_tag" id="filter_tag">
				<option value=""><?php echo JText::_('JOPTION_SELECT_TAG'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('tag.options', true, true), 'value', 'text', $this->state->get('filter.tag')); ?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>
	<div class="clr"> </div>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap state-col">
					<?php echo JHtml::_('grid.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap featured-col">
					<?php echo JHtml::_('grid.sort', 'JFEATURED', 'a.featured', $listDirn, $listOrder, null, 'desc'); ?>
				</th>
				<th class="title category-col">
					<?php echo JHtml::_('grid.sort', 'JCATEGORY', 'category_title', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap ordering-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ORDERING', 'a.ordering', $listDirn, $listOrder); ?>
					<?php if ($saveOrder) : ?>
						<?php echo JHtml::_('grid.order', $this->items, 'filesave.png', 'articles.saveorder'); ?>
					<?php endif; ?>
				</th>
				<th class="title access-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ACCESS', 'access_level', $listDirn, $listOrder); ?>
				</th>
				<?php if ($assoc) : ?>
				<th width="5%">
					<?php echo JHtml::_('grid.sort', 'COM_CONTENT_HEADING_ASSOCIATION', 'association', $listDirn, $listOrder); ?>
				</th>
				<?php endif;?>
				<th class="title created-by-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_CREATED_BY', 'a.created_by', $listDirn, $listOrder); ?>
				</th>
				<th class="title date-col">
					<?php echo JHtml::_('grid.sort', 'COM_CONTENT_HEADING_DATE_CREATED', 'a.created', $listDirn, $listOrder); ?>
				</th>
				<th class="hits-col">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_HITS', 'a.hits', $listDirn, $listOrder); ?>
				</th>
				<th class="language-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_LANGUAGE', 'language', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) :
			$item->max_ordering = 0; //??
			$ordering   = ($listOrder == 'a.ordering');
			$canCreate  = $user->authorise('core.create',     'com_content.category.' . $item->catid);
			$canEdit    = $user->authorise('core.edit',       'com_content.article.' . $item->id);
			$canCheckin = $user->authorise('core.manage',     'com_checkin') || $item->checked_out == $userId || $item->checked_out == 0;
			$canEditOwn = $user->authorise('core.edit.own',   'com_content.article.' . $item->id) && $item->created_by == $userId;
			$canChange  = $user->authorise('core.edit.state', 'com_content.article.' . $item->id) && $canCheckin;
			?>
			<tr class="row<?php echo $i % 2; ?>">
				<th class="center">
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				</th>
				<td class="break-word">
					<?php if ($item->checked_out) : ?>
						<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'articles.', $canCheckin); ?>
					<?php endif; ?>
					<?php if ($canEdit || $canEditOwn) : ?>
						<a href="<?php echo JRoute::_('index.php?option=com_content&task=article.edit&id='.$item->id); ?>">
							<?php echo $this->escape($item->title); ?></a>
					<?php else : ?>
						<?php echo $this->escape($item->title); ?>
					<?php endif; ?>
					<p class="smallsub">
						<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias)); ?></p>
				</td>
				<td class="center">
					<?php echo JHtml::_('jgrid.published', $item->state, $i, 'articles.', $canChange, 'cb', $item->publish_up, $item->publish_down); ?>
				</td>
				<td class="center">
					<?php echo JHtml::_('contentadministrator.featured', $item->featured, $i, $canChange); ?>
				</td>
				<td class="center">
					<?php echo $this->escape($item->category_title); ?>
				</td>
				<td class="order">
					<?php if ($canChange) : ?>
						<?php if ($saveOrder) : ?>
							<?php if ($listDirn == 'asc') : ?>
								<span><?php echo $this->pagination->orderUpIcon($i, $item->catid == @$this->items[$i - 1]->catid, 'articles.orderup', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
								<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, $item->catid == @$this->items[$i + 1]->catid, 'articles.orderdown', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
							<?php elseif ($listDirn == 'desc') : ?>
								<span><?php echo $this->pagination->orderUpIcon($i, $item->catid == @$this->items[$i - 1]->catid, 'articles.orderdown', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
								<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, $item->catid == @$this->items[$i + 1]->catid, 'articles.orderup', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
							<?php endif; ?>
						<?php endif; ?>
						<?php $disabled = $saveOrder ?  '' : 'disabled="disabled"'; ?>
						<input type="text" name="order[]" value="<?php echo $item->ordering; ?>" <?php echo $disabled; ?> class="text-area-order" title="<?php echo $item->title; ?> order" />
					<?php else : ?>
						<?php echo $item->ordering; ?>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo $this->escape($item->access_level); ?>
				</td>
				<?php if ($assoc) : ?>
				<td class="center">
					<?php if ($item->association):?>
						<?php echo JHtml::_('contentadministrator.association', $item->id); ?>
					<?php endif;?>
				</td>
				<?php endif;?>
				<td class="center">
					<?php if ($item->created_by_alias) : ?>
						<?php echo $this->escape($item->author_name); ?>
						<p class="smallsub"> <?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->created_by_alias)); ?></p>
					<?php else : ?>
						<?php echo $this->escape($item->author_name); ?>
					<?php endif; ?>
				</td>
				<td class="center nowrap">
					<?php echo JHtml::_('date', $item->created, JText::_('DATE_FORMAT_LC4')); ?>
				</td>
				<td class="center">
					<?php echo (int) $item->hits; ?>
				</td>
				<td class="center">
					<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
				</td>
				<td class="center">
					<?php echo (int) $item->id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

		<?php //Load the batch processing form. ?>
		<?php if ($user->authorise('core.create', 'com_content')
			&& $user->authorise('core.edit', 'com_content')
			&& $user->authorise('core.edit.state', 'com_content')) : ?>
			<?php echo JHtml::_(
				'bootstrap.renderModal',
				'collapseModal',
				array(
					'title'  => JText::_('COM_CONTENT_BATCH_OPTIONS'),
					'footer' => $this->loadTemplate('batch_footer'),
				),
				$this->loadTemplate('batch_body')
			); ?>
		<?php endif; ?>

	<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/com_content/article/edit.php000060400000025205152453623430016373 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');

// Create shortcut to parameters.
$params = $this->state->get('params');
$params = $params->toArray();
$saveHistory = $this->state->get('params')->get('save_history', 0);

// This checks if the config options have ever been saved. If they haven't they will fall back to the original settings.
$editoroptions = isset($params['show_publishing_options']);

$input = JFactory::getApplication()->input;

if (!$editoroptions):
	$params['show_publishing_options'] = '1';
	$params['show_article_options'] = '1';
	$params['show_urls_images_backend'] = '0';
	$params['show_urls_images_frontend'] = '0';
endif;

// Check if the article uses configuration settings besides global. If so, use them.
if (!empty($this->item->attribs['show_publishing_options'])):
		$params['show_publishing_options'] = $this->item->attribs['show_publishing_options'];
endif;
if (!empty($this->item->attribs['show_article_options'])):
		$params['show_article_options'] = $this->item->attribs['show_article_options'];
endif;
if (!empty($this->item->attribs['show_urls_images_backend'])):
		$params['show_urls_images_backend'] = $this->item->attribs['show_urls_images_backend'];
endif;

$assoc = JLanguageAssociations::isEnabled();

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(task)
	{
		if (task == 'article.cancel' || document.formvalidator.isValid(document.getElementById('item-form')))
		{
			" . $this->form->getField('articletext')->save() . "
			Joomla.submitform(task, document.getElementById('item-form'));
		}
	}
");
?>
<div class="article-edit">

<form action="<?php echo JRoute::_('index.php?option=com_content&layout=edit&id='.(int) $this->item->id); ?>" method="post" name="adminForm" id="item-form" class="form-validate">
	<div class="col main-section">
		<fieldset class="adminform">
			<legend><?php echo empty($this->item->id) ? JText::_('COM_CONTENT_NEW_ARTICLE') : JText::sprintf('COM_CONTENT_EDIT_ARTICLE', $this->item->id); ?></legend>
			<ul class="adminformlist">
				<li><?php echo $this->form->getLabel('title'); ?>
				<?php echo $this->form->getInput('title'); ?></li>

				<li><?php echo $this->form->getLabel('alias'); ?>
				<?php echo $this->form->getInput('alias'); ?></li>

				<li><?php echo $this->form->getLabel('catid'); ?>
				<?php echo $this->form->getInput('catid'); ?></li>

				<li><?php echo $this->form->getLabel('state'); ?>
				<?php echo $this->form->getInput('state'); ?></li>

				<li><?php echo $this->form->getLabel('access'); ?>
				<?php echo $this->form->getInput('access'); ?></li>

				<?php if ($this->canDo->get('core.admin')) : ?>
					<li><span class="faux-label"><?php echo JText::_('JGLOBAL_ACTION_PERMISSIONS_LABEL'); ?></span>
						<button type="button" onclick="document.location.href='#access-rules';">
							<?php echo JText::_('JGLOBAL_PERMISSIONS_ANCHOR'); ?>
						</button>
					</li>
				<?php endif; ?>

				<li><?php echo $this->form->getLabel('featured'); ?>
				<?php echo $this->form->getInput('featured'); ?></li>

				<li><?php echo $this->form->getLabel('language'); ?>
				<?php echo $this->form->getInput('language'); ?></li>

				<!-- Tag field -->
				<li><?php echo $this->form->getLabel('tags'); ?>
					<div class="is-tagbox">
						<?php echo $this->form->getInput('tags'); ?>
					</div>
				</li>

				<?php if ($saveHistory) : ?>
					<li><?php echo $this->form->getLabel('version_note'); ?>
					<?php echo $this->form->getInput('version_note'); ?></li>
				<?php endif; ?>

				<li><?php echo $this->form->getLabel('id'); ?>
				<?php echo $this->form->getInput('id'); ?></li>

			</ul>

			<div class="clr"></div>
			<?php echo $this->form->getLabel('articletext'); ?>
			<div class="clr"></div>
			<?php echo $this->form->getInput('articletext'); ?>
			<div class="clr"></div>
		</fieldset>
	</div>

	<div class="col options-section">
		<?php echo JHtml::_('sliders.start', 'content-sliders-' . $this->item->id, array('useCookie' => 1)); ?>
		<?php // Do not show the publishing options if the edit form is configured not to. ?>
		<?php  if ($params['show_publishing_options'] || ( $params['show_publishing_options'] = '' && !empty($editoroptions)) ) : ?>
			<?php echo JHtml::_('sliders.panel', JText::_('COM_CONTENT_FIELDSET_PUBLISHING'), 'publishing-details'); ?>
			<fieldset class="panelform">
				<ul class="adminformlist">
					<li><?php echo $this->form->getLabel('created_by'); ?>
					<?php echo $this->form->getInput('created_by'); ?></li>

					<li><?php echo $this->form->getLabel('created_by_alias'); ?>
					<?php echo $this->form->getInput('created_by_alias'); ?></li>

					<li><?php echo $this->form->getLabel('created'); ?>
					<?php echo $this->form->getInput('created'); ?></li>

						<li><?php echo $this->form->getLabel('publish_up'); ?>
						<?php echo $this->form->getInput('publish_up'); ?></li>

					<li><?php echo $this->form->getLabel('publish_down'); ?>
					<?php echo $this->form->getInput('publish_down'); ?></li>

					<?php if ($this->item->modified_by) : ?>
						<li><?php echo $this->form->getLabel('modified_by'); ?>
						<?php echo $this->form->getInput('modified_by'); ?></li>

						<li><?php echo $this->form->getLabel('modified'); ?>
						<?php echo $this->form->getInput('modified'); ?></li>
					<?php endif; ?>

					<?php if ($this->item->version) : ?>
						<li><?php echo $this->form->getLabel('version'); ?>
						<?php echo $this->form->getInput('version'); ?></li>
					<?php endif; ?>

					<?php if ($this->item->hits) : ?>
						<li><?php echo $this->form->getLabel('hits'); ?>
						<?php echo $this->form->getInput('hits'); ?></li>
					<?php endif; ?>
				</ul>
			</fieldset>
		<?php  endif; ?>
		<?php  $fieldSets = $this->form->getFieldsets(); ?>
			<?php foreach ($fieldSets as $name => $fieldSet) : ?>
				<?php
					// If the parameter says to show the article options or if the parameters have never been set, we will
					// show the article options.

					if ($params['show_article_options'] || ($params['show_article_options'] == '' && !empty($editoroptions))):

					// Go through all the fieldsets except the configuration and basic-limited, which are
					// handled separately below.
					if ($name != 'editorConfig' && $name != 'basic-limited' && $name != 'item_associations' && $name != 'jmetadata') : ?>
						<?php echo JHtml::_('sliders.panel', JText::_($fieldSet->label), $name.'-options'); ?>
						<?php if (isset($fieldSet->description) && trim($fieldSet->description)) : ?>
							<p class="tip"><?php echo $this->escape(JText::_($fieldSet->description));?></p>
						<?php endif; ?>
						<fieldset class="panelform">
							<ul class="adminformlist">
							<?php foreach ($this->form->getFieldset($name) as $field) : ?>
								<li><?php echo $field->label; ?>
								<?php echo $field->input; ?></li>
							<?php endforeach; ?>
							</ul>
						</fieldset>
					<?php endif ?>
					<?php // If we are not showing the options we need to use the hidden fields so the values are not lost.  ?>
				<?php  elseif ($name == 'basic-limited') : ?>
						<?php foreach ($this->form->getFieldset('basic-limited') as $field) : ?>
							<?php  echo $field->input; ?>
						<?php endforeach; ?>

				<?php endif; ?>
			<?php endforeach; ?>
			<?php // Not the best place, but here for continuity with 1.5/1/6/1.7 ?>
				<fieldset class="panelform">
				</fieldset>
				<?php
					// We need to make a separate space for the configuration
					// so that those fields always show to those wih permissions
					if ( $this->canDo->get('core.admin')   ):  ?>
					<?php  echo JHtml::_('sliders.panel', JText::_('COM_CONTENT_SLIDER_EDITOR_CONFIG'), 'configure-sliders'); ?>
						<fieldset  class="panelform" >
							<ul class="adminformlist">
							<?php foreach ($this->form->getFieldset('editorConfig') as $field) : ?>
								<li><?php echo $field->label; ?>
								<?php echo $field->input; ?></li>
							<?php endforeach; ?>
							</ul>
						</fieldset>
				<?php endif ?>

		<?php // The URL and images fields only show if the configuration is set to allow them.  ?>
		<?php // This is for legacy reasons. ?>
		<?php if ($params['show_urls_images_backend']) : ?>
			<?php echo JHtml::_('sliders.panel', JText::_('COM_CONTENT_FIELDSET_URLS_AND_IMAGES'), 'urls_and_images-options'); ?>
				<fieldset class="panelform">
				<ul class="adminformlist">
					<li>
					<?php echo $this->form->getLabel('images'); ?>
					<?php echo $this->form->getInput('images'); ?></li>

					<?php foreach ($this->form->getGroup('images') as $field) : ?>
						<li>
							<?php if (!$field->hidden) : ?>
								<?php echo $field->label; ?>
							<?php endif; ?>
							<?php echo $field->input; ?>
						</li>
					<?php endforeach; ?>
						<?php foreach ($this->form->getGroup('urls') as $field) : ?>
						<li>
							<?php if (!$field->hidden) : ?>
								<?php echo $field->label; ?>
							<?php endif; ?>
							<?php echo $field->input; ?>
						</li>
					<?php endforeach; ?>
				</ul>
				</fieldset>
		<?php endif; ?>
		<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_FIELDSET_METADATA_OPTIONS'), 'meta-options'); ?>
			<fieldset class="panelform">
			<legend class="element-invisible"><?php echo JText::_('JGLOBAL_FIELDSET_METADATA_OPTIONS'); ?></legend>
				<?php echo $this->loadTemplate('metadata'); ?>
			</fieldset>

		<?php if ($assoc) : ?>
			<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_FIELDSET_ASSOCIATIONS'), '-options');?>
			<?php echo $this->loadTemplate('associations'); ?>
		<?php endif; ?>

		<?php echo JHtml::_('sliders.end'); ?>
	</div>

	<div class="clr"></div>
	<?php if ($this->canDo->get('core.admin')) : ?>
		<div  class="col rules-section">
			<?php echo JHtml::_('sliders.start', 'permissions-sliders-' . $this->item->id, array('useCookie' => 1)); ?>

				<?php echo JHtml::_('sliders.panel', JText::_('COM_CONTENT_FIELDSET_RULES'), 'access-rules'); ?>
				<fieldset class="panelform">
					<legend class="element-invisible"><?php echo JText::_('COM_CONTENT_FIELDSET_RULES'); ?></legend>
					<?php echo $this->form->getLabel('rules'); ?>
					<?php echo $this->form->getInput('rules'); ?>
				</fieldset>

			<?php echo JHtml::_('sliders.end'); ?>
		</div>
	<?php endif; ?>
	<div>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="return" value="<?php echo $input->get('return', null, 'BASE64');?>" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
<div class="clr"></div>
</div>
templates/hathor/html/com_content/featured/default.php000060400000023077152453623430017253 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
/* add accessibility, labels on input forms */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.multiselect');

$user      = JFactory::getUser();
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$canOrder  = $user->authorise('core.edit.state', 'com_content');
$saveOrder = $listOrder == 'fp.ordering';
$n         = count($this->items);
?>

<form action="<?php echo JRoute::_('index.php?option=com_content&view=featured'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_CONTENT_FILTER_SEARCH_DESC'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>

		<div class="filter-select">
			<label class="selectlabel" for="filter_published"><?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?></label>
			<select name="filter_published" id="filter_published">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.published'), true); ?>
			</select>

			<label class="selectlabel" for="filter_category_id"><?php echo JText::_('JOPTION_SELECT_CATEGORY'); ?></label>
			<select name="filter_category_id" id="filter_category_id">
				<option value=""><?php echo JText::_('JOPTION_SELECT_CATEGORY'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('category.options', 'com_content'), 'value', 'text', $this->state->get('filter.category_id')); ?>
			</select>

			<label class="selectlabel" for="filter_level"><?php echo JText::_('JOPTION_SELECT_MAX_LEVELS'); ?></label>
			<select name="filter_level" id="filter_level">
				<option value=""><?php echo JText::_('JOPTION_SELECT_MAX_LEVELS'); ?></option>
				<?php echo JHtml::_('select.options', $this->f_levels, 'value', 'text', $this->state->get('filter.level')); ?>
			</select>

			<label class="selectlabel" for="filter_access"><?php echo JText::_('JOPTION_SELECT_ACCESS'); ?></label>
			<select name="filter_access" id="filter_access">
				<option value=""><?php echo JText::_('JOPTION_SELECT_ACCESS');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text', $this->state->get('filter.access')); ?>
			</select>

			<label class="selectlabel" for="filter_language"><?php echo JText::_('JOPTION_SELECT_LANGUAGE'); ?></label>
			<select name="filter_language" id="filter_language">
				<option value=""><?php echo JText::_('JOPTION_SELECT_LANGUAGE'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('contentlanguage.existing', true, true), 'value', 'text', $this->state->get('filter.language')); ?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>
	<div class="clr"> </div>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap state-col">
					<?php echo JHtml::_('grid.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
				</th>
				<th class="title category-col">
					<?php echo JHtml::_('grid.sort', 'JCATEGORY', 'a.catid', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap ordering-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ORDERING', 'fp.ordering', $listDirn, $listOrder); ?>
					<?php if ($canOrder && $saveOrder) : ?>
						<?php echo JHtml::_('grid.order', $this->items, 'filesave.png', 'featured.saveorder'); ?>
					<?php endif; ?>
				</th>
				<th class="title access-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ACCESS', 'a.access', $listDirn, $listOrder); ?>
				</th>
				<th class="title created-by-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_CREATED_BY', 'a.created_by', $listDirn, $listOrder); ?>
				</th>
				<th class="title date-col">
					<?php echo JHtml::_('grid.sort', 'COM_CONTENT_HEADING_DATE_CREATED', 'a.created', $listDirn, $listOrder); ?>
				</th>
				<th class="hits-col">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_HITS', 'a.hits', $listDirn, $listOrder); ?>
				</th>
				<th class="language-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_LANGUAGE', 'language', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php
		foreach ($this->items as $i => $item) :
			$item->max_ordering = 0; //??
			$ordering   = ($listOrder == 'fp.ordering');
			$assetId    = 'com_content.article.' . $item->id;
			$canCreate  = $user->authorise('core.create',     'com_content.category.' . $item->catid);
			$canEdit    = $user->authorise('core.edit',       'com_content.article.' . $item->id);
			$canCheckin = $user->authorise('core.manage',     'com_checkin') || $item->checked_out == $user->get('id')|| $item->checked_out == 0;
			$canChange  = $user->authorise('core.edit.state', 'com_content.article.' . $item->id) && $canCheckin;
			?>
			<tr class="row<?php echo $i % 2; ?>">
				<th class="center">
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				</th>
				<td>
					<?php if ($item->checked_out) : ?>
						<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'featured.', $canCheckin); ?>
					<?php endif; ?>
					<?php if ($canEdit) : ?>
					<a href="<?php echo JRoute::_('index.php?option=com_content&task=article.edit&return=featured&id='.$item->id);?>">
						<?php echo $this->escape($item->title); ?></a>
					<?php else : ?>
						<?php echo $this->escape($item->title); ?>
					<?php endif; ?>
					<p class="smallsub">
						<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias)); ?></p>
				</td>
				<td class="center">
					<?php echo JHtml::_('jgrid.published', $item->state, $i, 'articles.', $canChange, 'cb', $item->publish_up, $item->publish_down); ?>
				</td>
				<td class="center">
					<?php echo $this->escape($item->category_title); ?>
				</td>
				<td class="order">
					<?php if ($canChange) : ?>
						<?php if ($saveOrder) : ?>
							<?php if ($listDirn == 'asc') : ?>
								<span><?php echo $this->pagination->orderUpIcon($i, true, 'featured.orderup', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
								<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, true, 'featured.orderdown', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
							<?php elseif ($listDirn == 'desc') : ?>
								<span><?php echo $this->pagination->orderUpIcon($i, true, 'featured.orderdown', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
								<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, true, 'featured.orderup', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
							<?php endif; ?>
						<?php endif; ?>
						<?php $disabled = $saveOrder ?  '' : 'disabled="disabled"'; ?>
						<input type="text" name="order[]" value="<?php echo $item->ordering; ?>" <?php echo $disabled; ?> class="text-area-order" title="<?php echo $item->title; ?> order" />
					<?php else : ?>
						<?php echo $item->ordering; ?>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo $this->escape($item->access_level); ?>
				</td>
				<td class="center">
					<?php if ($item->created_by_alias) : ?>
						<?php echo $this->escape($item->author_name); ?>
						<p class="smallsub"> <?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->created_by_alias)); ?></p>
					<?php else : ?>
						<?php echo $this->escape($item->author_name); ?>
					<?php endif; ?>
				</td>
				<td class="center nowrap">
					<?php echo JHtml::_('date', $item->created, JText::_('DATE_FORMAT_LC4')); ?>
				</td>
				<td class="center">
					<?php echo (int) $item->hits; ?>
				</td>
				<td class="center">
					<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
				</td>
				<td class="center">
					<?php echo (int) $item->id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/com_messages/messages/default.php000060400000010121152453623430017402 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.multiselect');

$user      = JFactory::getUser();
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>

<form action="<?php echo JRoute::_('index.php?option=com_messages&view=messages'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_MESSAGES_SEARCH_IN_SUBJECT'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>
		<div class="filter-select">
			<label class="selectlabel" for="filter_state">
				<?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?>
			</label>
			<select name="filter_state" id="filter_state">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED');?></option>
				<?php echo JHtml::_('select.options', MessagesHelper::getStateOptions(), 'value', 'text', $this->state->get('filter.state'));?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>

		</div>
	</fieldset>
	<div class="clr"> </div>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'COM_MESSAGES_HEADING_SUBJECT', 'a.subject', $listDirn, $listOrder); ?>
				</th>
				<th class="width-5">
					<?php echo JHtml::_('grid.sort', 'COM_MESSAGES_HEADING_READ', 'a.state', $listDirn, $listOrder); ?>
				</th>
				<th class="width-15">
					<?php echo JHtml::_('grid.sort', 'COM_MESSAGES_HEADING_FROM', 'a.user_id_from', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width-20">
					<?php echo JHtml::_('grid.sort', 'JDATE', 'a.date_time', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) :
			$canChange = $user->authorise('core.edit.state', 'com_messages');
			?>
			<tr class="row<?php echo $i % 2; ?>">
				<td>
					<?php echo JHtml::_('grid.id', $i, $item->message_id); ?>
				</td>
				<td>
					<a href="<?php echo JRoute::_('index.php?option=com_messages&view=message&message_id='.(int) $item->message_id); ?>">
						<?php echo $this->escape($item->subject); ?></a>
				</td>
				<td class="center">
					<?php echo JHtml::_('messages.state', $item->state, $i, $canChange); ?>
				</td>
				<td>
					<?php echo $item->user_from; ?>
				</td>
				<td>
					<?php echo JHtml::_('date', $item->date_time, JText::_('DATE_FORMAT_LC2')); ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
</div>
</form>
templates/hathor/html/com_messages/message/edit.php000060400000002706152453623430016532 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(task)
	{
		if (task == 'message.cancel' || document.formvalidator.isValid(document.getElementById('message-form')))
		{
			Joomla.submitform(task, document.getElementById('message-form'));
		}
	}
");
?>

<form action="<?php echo JRoute::_('index.php?option=com_messages'); ?>" method="post" name="adminForm" id="message-form" class="form-validate form-horizontal">
	<fieldset class="adminform">
		<ul class="adminformlist">
			<li><?php echo $this->form->getLabel('user_id_to'); ?>
				<?php echo $this->form->getInput('user_id_to'); ?></li>

			<li><?php echo $this->form->getLabel('subject'); ?>
				<?php echo $this->form->getInput('subject'); ?></li>
		</ul>
	</fieldset>
	<fieldset class="adminform">
		<legend><?php echo $this->form->getLabel('message'); ?></legend>
		<ul class="adminformlist">
			<li><?php echo $this->form->getInput('message'); ?> </li>
		</ul>
	</fieldset>
	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>
</form>
templates/hathor/html/com_weblinks/weblink/edit_params.php000060400000001672152453623430020114 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$fieldSets = $this->form->getFieldsets('params');
foreach ($fieldSets as $name => $fieldSet) :
	echo JHtml::_('sliders.panel', JText::_($fieldSet->label), $name.'-params');
	if (isset($fieldSet->description) && trim($fieldSet->description)) :
		echo '<p class="tip">'.$this->escape(JText::_($fieldSet->description)).'</p>';
	endif;
	?>
	<fieldset class="panelform">
		<legend class="element-invisible"><?php echo JText::_($fieldSet->label); ?></legend>
		<ul class="adminformlist">
		<?php foreach ($this->form->getFieldset($name) as $field) : ?>
			<li><?php echo $field->label; ?>
			<?php echo $field->input; ?></li>
		<?php endforeach; ?>
		</ul>
	</fieldset>
<?php endforeach; ?>
templates/hathor/html/com_weblinks/weblink/edit.php000060400000011322152453623430016542 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

$saveHistory = $this->state->get('params')->get('save_history', 0);

JHtml::_('behavior.formvalidator');

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(task)
	{
		if (task == 'weblink.cancel' || document.formvalidator.isValid(document.id('weblink-form')))
		{
			" . $this->form->getField('description')->save() . "
			Joomla.submitform(task, document.getElementById('weblink-form'));
		}
	}
");
?>
<div class="weblink-edit">

<form action="<?php echo JRoute::_('index.php?option=com_weblinks&layout=edit&id='.(int) $this->item->id); ?>" method="post" name="adminForm" id="weblink-form" class="form-validate">
	<div class="col main-section">
		<fieldset class="adminform">
			<legend><?php echo empty($this->item->id) ? JText::_('COM_WEBLINKS_NEW_WEBLINK') : JText::sprintf('COM_WEBLINKS_EDIT_WEBLINK', $this->item->id); ?></legend>
			<ul class="adminformlist">
				<li><?php echo $this->form->getLabel('title'); ?>
				<?php echo $this->form->getInput('title'); ?></li>

				<li><?php echo $this->form->getLabel('alias'); ?>
				<?php echo $this->form->getInput('alias'); ?></li>

				<li><?php echo $this->form->getLabel('url'); ?>
				<?php echo $this->form->getInput('url'); ?></li>

				<li><?php echo $this->form->getLabel('catid'); ?>
				<?php echo $this->form->getInput('catid'); ?></li>

				<li><?php echo $this->form->getLabel('state'); ?>
				<?php echo $this->form->getInput('state'); ?></li>

				<li><?php echo $this->form->getLabel('access'); ?>
				<?php echo $this->form->getInput('access'); ?></li>

				<li><?php echo $this->form->getLabel('ordering'); ?>
				<?php echo $this->form->getInput('ordering'); ?></li>

				<li><?php echo $this->form->getLabel('language'); ?>
				<?php echo $this->form->getInput('language'); ?></li>

				<!-- Tag field -->
				<li><?php echo $this->form->getLabel('tags'); ?>
					<div class="is-tagbox">
						<?php echo $this->form->getInput('tags'); ?>
					</div>
				</li>

				<?php if ($saveHistory) : ?>
					<li><?php echo $this->form->getLabel('version_note'); ?>
					<?php echo $this->form->getInput('version_note'); ?></li>
				<?php endif; ?>

				<li><?php echo $this->form->getLabel('id'); ?>
				<?php echo $this->form->getInput('id'); ?></li>
			</ul>

			<div>
				<?php echo $this->form->getLabel('description'); ?>
				<div class="clr"></div>
				<?php echo $this->form->getInput('description'); ?>
			</div>
		</fieldset>
	</div>

	<div class="col options-section">
		<?php echo JHtml::_('sliders.start', 'weblink-sliders-'.$this->item->id, array('useCookie' => 1)); ?>

		<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_FIELDSET_PUBLISHING'), 'publishing-details'); ?>

		<fieldset class="panelform">
			<legend class="element-invisible"><?php echo JText::_('JGLOBAL_FIELDSET_PUBLISHING'); ?></legend>
			<ul class="adminformlist">

				<li><?php echo $this->form->getLabel('created_by'); ?>
				<?php echo $this->form->getInput('created_by'); ?></li>

				<li><?php echo $this->form->getLabel('created_by_alias'); ?>
				<?php echo $this->form->getInput('created_by_alias'); ?></li>

				<li><?php echo $this->form->getLabel('created'); ?>
				<?php echo $this->form->getInput('created'); ?></li>

				<li><?php echo $this->form->getLabel('publish_up'); ?>
				<?php echo $this->form->getInput('publish_up'); ?></li>

				<li><?php echo $this->form->getLabel('publish_down'); ?>
				<?php echo $this->form->getInput('publish_down'); ?></li>

				<?php if ($this->item->modified_by) : ?>
					<li><?php echo $this->form->getLabel('modified_by'); ?>
					<?php echo $this->form->getInput('modified_by'); ?></li>

					<li><?php echo $this->form->getLabel('modified'); ?>
					<?php echo $this->form->getInput('modified'); ?></li>
				<?php endif; ?>

				<?php if ($this->item->hits) : ?>
					<li><?php echo $this->form->getLabel('hits'); ?>
					<?php echo $this->form->getInput('hits'); ?></li>
				<?php endif; ?>

			</ul>
		</fieldset>

		<?php echo $this->loadTemplate('params'); ?>

		<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_FIELDSET_METADATA_OPTIONS'), 'meta-options'); ?>
		<fieldset class="panelform">
		<legend class="element-invisible"><?php echo JText::_('JGLOBAL_FIELDSET_METADATA_OPTIONS'); ?></legend>
			<?php echo $this->loadTemplate('metadata'); ?>
		</fieldset>

		<?php echo JHtml::_('sliders.end'); ?>

		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
	<div class="clr"></div>
</form>
</div>
templates/hathor/html/com_weblinks/weblinks/default.php000060400000022211152453623430017423 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.multiselect');
JHtml::_('behavior.modal');

$user      = JFactory::getUser();
$userId    = $user->get('id');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$canOrder  = $user->authorise('core.edit.state', 'com_weblinks');
$saveOrder = $listOrder == 'a.ordering';
?>

<form action="<?php echo JRoute::_('index.php?option=com_weblinks&view=weblinks'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_WEBLINKS_SEARCH_IN_TITLE'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>

		<div class="filter-select">
			<label class="selectlabel" for="filter_published">
				<?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?>
			</label>
			<select name="filter_published" id="filter_published">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.state'), true); ?>
			</select>

			<label class="selectlabel" for="filter_category_id">
				<?php echo JText::_('JOPTION_SELECT_CATEGORY'); ?>
			</label>
			<select name="filter_category_id" id="filter_category_id">
				<option value=""><?php echo JText::_('JOPTION_SELECT_CATEGORY'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('category.options', 'com_weblinks'), 'value', 'text', $this->state->get('filter.category_id')); ?>
			</select>

			<label class="selectlabel" for="filter_access">
				<?php echo JText::_('JOPTION_SELECT_ACCESS'); ?>
			</label>
			<select name="filter_access" id="filter_access">
				<option value=""><?php echo JText::_('JOPTION_SELECT_ACCESS'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text', $this->state->get('filter.access')); ?>
			</select>

			<label class="selectlabel" for="filter_language">
				<?php echo JText::_('JOPTION_SELECT_LANGUAGE'); ?>
			</label>
			<select name="filter_language" id="filter_language">
				<option value=""><?php echo JText::_('JOPTION_SELECT_LANGUAGE'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('contentlanguage.existing', true, true), 'value', 'text', $this->state->get('filter.language')); ?>
			</select>

			<label class="selectlabel" for="filter_tag">
				<?php echo JText::_('JOPTION_SELECT_TAG'); ?>
			</label>
			<select name="filter_tag" id="filter_tag">
				<option value=""><?php echo JText::_('JOPTION_SELECT_TAG'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('tag.options', true, true), 'value', 'text', $this->state->get('filter.tag')); ?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>
	<div class="clr"> </div>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap state-col">
					<?php echo JHtml::_('grid.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap title category-col">
					<?php echo JHtml::_('grid.sort', 'JCATEGORY', 'category_title', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap ordering-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ORDERING', 'a.ordering', $listDirn, $listOrder); ?>
					<?php if ($canOrder && $saveOrder) : ?>
						<?php echo JHtml::_('grid.order', $this->items, 'filesave.png', 'weblinks.saveorder'); ?>
					<?php endif; ?>
				</th>
				<th class="title access-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ACCESS', 'a.access', $listDirn, $listOrder); ?>
				</th>
				<th class="hits-col">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_HITS', 'a.hits', $listDirn, $listOrder); ?>
				</th>
				<th class="width-5">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_LANGUAGE', 'a.language', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) :
			$ordering       = ($listOrder == 'a.ordering');
			$item->cat_link = JRoute::_('index.php?option=com_categories&extension=com_weblinks&task=edit&type=other&cid[]=' . $item->catid);
			$canCreate      = $user->authorise('core.create',     'com_weblinks.category.' . $item->catid);
			$canEdit        = $user->authorise('core.edit',       'com_weblinks.category.' . $item->catid);
			$canCheckin     = $user->authorise('core.manage',     'com_checkin') || $item->checked_out == $user->get('id') || $item->checked_out == 0;
			$canChange      = $user->authorise('core.edit.state', 'com_weblinks.category.' . $item->catid) && $canCheckin;
			?>
			<tr class="row<?php echo $i % 2; ?>">
				<td>
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				</td>
				<td>
					<?php if ($item->checked_out) : ?>
						<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'weblinks.', $canCheckin); ?>
					<?php endif; ?>
					<?php if ($canEdit) : ?>
						<a href="<?php echo JRoute::_('index.php?option=com_weblinks&task=weblink.edit&id='.(int) $item->id); ?>">
							<?php echo $this->escape($item->title); ?></a>
					<?php else : ?>
							<?php echo $this->escape($item->title); ?>
					<?php endif; ?>
					<p class="smallsub">
						<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias)); ?></p>
				</td>
				<td class="center">
					<?php echo JHtml::_('jgrid.published', $item->state, $i, 'weblinks.', $canChange, 'cb', $item->publish_up, $item->publish_down); ?>
				</td>
				<td class="center">
					<?php echo $this->escape($item->category_title); ?>
				</td>
				<td class="order">
					<?php if ($canChange) : ?>
						<?php if ($saveOrder) :?>
							<?php if ($listDirn == 'asc') : ?>
								<span><?php echo $this->pagination->orderUpIcon($i, $item->catid == @$this->items[$i - 1]->catid, 'weblinks.orderup', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
								<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, $item->catid == @$this->items[$i + 1]->catid, 'weblinks.orderdown', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
							<?php elseif ($listDirn == 'desc') : ?>
								<span><?php echo $this->pagination->orderUpIcon($i, $item->catid == @$this->items[$i - 1]->catid, 'weblinks.orderdown', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
								<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, $item->catid == @$this->items[$i + 1]->catid, 'weblinks.orderup', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
							<?php endif; ?>
						<?php endif; ?>
						<?php $disabled = $saveOrder ? '' : 'disabled="disabled"'; ?>
						<input type="text" name="order[]" value="<?php echo $item->ordering; ?>" <?php echo $disabled; ?> class="text-area-order" title="<?php echo $item->title; ?> order" />
					<?php else : ?>
						<?php echo $item->ordering; ?>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo $this->escape($item->access_level); ?>
				</td>
				<td class="center">
					<?php echo $item->hits; ?>
				</td>
				<td class="center">
					<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
				</td>
				<td class="center">
					<?php echo (int) $item->id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

<?php echo $this->pagination->getListFooter(); ?>
	<div class="clr"> </div>

	<?php //Load the batch processing form. ?>
	<?php echo $this->loadTemplate('batch'); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
</div>
</form>
templates/hathor/html/com_search/searches/default.php000060400000005304152453623430017035 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.multiselect');

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>

<form action="<?php echo JRoute::_('index.php?option=com_search&view=searches'); ?>" method="post" name="adminForm" id="adminForm">
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_SEARCH_SEARCH_IN_PHRASE'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>


	</fieldset>
	<div class="clr"> </div>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'COM_SEARCH_HEADING_PHRASE', 'a.search_term', $listDirn, $listOrder); ?>
				</th>
				<th class="hits-col">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_HITS', 'a.hits', $listDirn, $listOrder); ?>
				</th>
				<th class="width-15">
					<?php echo JText::_('COM_SEARCH_HEADING_RESULTS'); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) : ?>
			<tr class="row<?php echo $i % 2; ?>">
					<td>
						<?php echo $this->escape($item->search_term); ?>
					</td>
					<td class="center">
						<?php echo (int) $item->hits; ?>
					</td>
					<td class="center">
					<?php if ($this->state->get('show_results')) : ?>
						<?php echo (int) $item->returns; ?>
					<?php else: ?>
						<?php echo JText::_('COM_SEARCH_NO_RESULTS'); ?>
					<?php endif; ?>
					</td>
				</tr>
			<?php endforeach; ?>
			</tbody>
		</table>

		<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
</form>
templates/hathor/html/com_joomlaupdate/default/default.php000060400000007551152453623430020111 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var JoomlaupdateViewDefault $this */

JHtml::_('jquery.framework');
JHtml::_('bootstrap.tooltip');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('script', 'com_joomlaupdate/default.js', array('version' => 'auto', 'relative' => true));

JText::script('JYES');
JText::script('JNO');
JText::script('COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_NO_COMPATIBILITY_INFORMATION');
JText::script('COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_WARNING_UNKNOWN');
JText::script('COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_SERVER_ERROR');

$latestJoomlaVersion  = $this->updateInfo['latest'];
$currentJoomlaVersion = $this->updateInfo['installed'];

JFactory::getDocument()->addScriptDeclaration(
<<<JS
jQuery(document).ready(function($) {
	$('#extraction_method').change(function(e){
		extractionMethodHandler('#extraction_method', 'row_ftp');
	});
	$('#upload_method').change(function(e){
		extractionMethodHandler('#upload_method', 'upload_ftp');
	});

	$('button.submit').on('click', function() {
		$('div.download_message').show();
	});
});

var joomlaTargetVersion  = '$latestJoomlaVersion';
var joomlaCurrentVersion = '$currentJoomlaVersion';
JS
);

$showPreUpdateCheck = isset($this->updateInfo['object']->downloadurl->_data)
	&& $this->getModel()->isDatabaseTypeSupported();

?>

<div id="joomlaupdate-wrapper">
	<form enctype="multipart/form-data" action="index.php" method="post" id="adminForm" class="form-horizontal">
		<?php echo  JHtml::_('sliders.start', 'joomlaupdate-slider'); ?>
		<?php if($this->shouldDisplayPreUpdateCheck()) : ?>
			<?php echo JHtml::_('sliders.panel', JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_TAB_PRE_UPDATE_CHECK'), 'pre-update-check'); ?>
			<?php echo $this->loadTemplate('preupdatecheck'); ?>
		<?php endif; ?>
		<?php if ($this->showUploadAndUpdate) : ?>
			<?php echo JHtml::_('sliders.panel', JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_TAB_ONLINE'), 'online-update'); ?>
		<?php endif; ?>

		<?php if ($this->selfUpdate) : ?>
			<?php // If we have a self update notice to install it first! ?>
			<?php JFactory::getApplication()->enqueueMessage(JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_INSTALL_SELF_UPDATE_FIRST'), 'error'); ?>
			<?php echo $this->loadTemplate('updatemefirst'); ?>
		<?php else : ?>
			<?php if ((!isset($this->updateInfo['object']->downloadurl->_data)
				&& $this->updateInfo['installed'] < $this->updateInfo['latest'])
				|| !$this->getModel()->isDatabaseTypeSupported()) : ?>
				<?php // If we have no download URL we can't reinstall or update ?>
				<?php echo $this->loadTemplate('nodownload'); ?>
			<?php elseif (!$this->updateInfo['hasUpdate']) : ?>
				<?php // If we have no update we can reinstall the core ?>
				<?php echo $this->loadTemplate('reinstall'); ?>
			<?php else : ?>
				<?php // Ok let's show the update template ?>
				<?php echo $this->loadTemplate('update'); ?>
			<?php endif; ?>
		<?php endif; ?>

		<input type="hidden" name="task" value="update.download" />
		<input type="hidden" name="option" value="com_joomlaupdate" />

		<?php echo JHtml::_('form.token'); ?>
	</form>

	<?php // Only Super Users have access to the Update & Install for obvious security reasons ?>
	<?php if ($this->showUploadAndUpdate) : ?>
		<?php echo JHtml::_('sliders.panel', JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_TAB_UPLOAD'), 'upload-update'); ?>
		<?php echo $this->loadTemplate('upload'); ?>
		<?php echo JHtml::_('sliders.end'); ?>
	<?php endif; ?>

	<div class="download_message" style="display: none">
		<p></p>
		<p class="nowarning">
			<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_DOWNLOAD_IN_PROGRESS'); ?>
		</p>
		<div class="joomlaupdate_spinner"></div>
	</div>
	<div id="loading"></div>
</div>
templates/hathor/html/com_cpanel/cpanel/default.php000060400000002426152453623430016501 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// no direct access
defined('_JEXEC') or die;

use Joomla\Registry\Registry;

echo JHtml::_('sliders.start', 'panel-sliders', array('useCookie' => '1'));
if (JFactory::getUser()->authorise('core.manage', 'com_postinstall')) :
	if ($this->postinstall_message_count):
		echo JHtml::_('sliders.panel', JText::_('COM_CPANEL_MESSAGES_TITLE'), 'cpanel-panel-com-postinstall');
	?>
		<div class="modal-body">
			<p>
				<?php echo JText::_('COM_CPANEL_MESSAGES_BODY_NOCLOSE'); ?>
			</p>
			<p>
				<?php echo JText::_('COM_CPANEL_MESSAGES_BODYMORE_NOCLOSE'); ?>
			</p>
		</div>
		<div class="modal-footer">
			<button onclick="window.location='index.php?option=com_postinstall&eid=700'; return false" class="btn btn-primary btn-large" >
				<?php echo JText::_('COM_CPANEL_MESSAGES_REVIEW'); ?>
			</button>
		</div>
	<?php endif; ?>
<?php endif;

foreach ($this->modules as $module)
{
	$output = JModuleHelper::renderModule($module);
	echo JHtml::_('sliders.panel', $module->title, 'cpanel-panel-' . $module->name);
	echo $output;
}

echo JHtml::_('sliders.end');
templates/hathor/html/com_newsfeeds/newsfeed/edit.php000060400000011770152453623430017063 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');

$app = JFactory::getApplication();
$input = $app->input;

$saveHistory = $this->state->get('params')->get('save_history', 0);

$assoc = JLanguageAssociations::isEnabled();

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(task)
	{
		if (task == 'newsfeed.cancel' || document.formvalidator.isValid(document.getElementById('newsfeed-form')))
		{
			Joomla.submitform(task, document.getElementById('newsfeed-form'));
		}
	}
");
?>

<form action="<?php echo JRoute::_('index.php?option=com_newsfeeds&id='.(int) $this->item->id); ?>" method="post" name="adminForm" id="newsfeed-form" class="form-validate">
	<div class="col main-section">
		<fieldset class="adminform">
			<legend><?php echo empty($this->item->id) ? JText::_('COM_NEWSFEEDS_NEW_NEWSFEED') : JText::sprintf('COM_NEWSFEEDS_EDIT_NEWSFEED', $this->item->id); ?></legend>
			<ul class="adminformlist">
			<li><?php echo $this->form->getLabel('name'); ?>
			<?php echo $this->form->getInput('name'); ?></li>

			<li><?php echo $this->form->getLabel('alias'); ?>
			<?php echo $this->form->getInput('alias'); ?></li>

			<li><?php echo $this->form->getLabel('link'); ?>
			<?php echo $this->form->getInput('link'); ?></li>

			<li><?php echo $this->form->getLabel('catid'); ?>
			<?php echo $this->form->getInput('catid'); ?></li>

			<li><?php echo $this->form->getLabel('published'); ?>
			<?php echo $this->form->getInput('published'); ?></li>

			<li><?php echo $this->form->getLabel('access'); ?>
			<?php echo $this->form->getInput('access'); ?></li>

			<li><?php echo $this->form->getLabel('ordering'); ?>
			<?php echo $this->form->getInput('ordering'); ?></li>

			<li><?php echo $this->form->getLabel('language'); ?>
			<?php echo $this->form->getInput('language'); ?></li>

			<!-- Tag field -->
			<li><?php echo $this->form->getLabel('tags'); ?>
				<div class="is-tagbox">
					<?php echo $this->form->getInput('tags'); ?>
				</div>
			</li>

			<?php if ($saveHistory) : ?>
				<li><?php echo $this->form->getLabel('version_note'); ?>
				<?php echo $this->form->getInput('version_note'); ?></li>
			<?php endif; ?>

			<li><?php echo $this->form->getLabel('id'); ?>
			<?php echo $this->form->getInput('id'); ?></li>
			</ul>
		</fieldset>
	</div>

	<div class="col options-section">
		<?php echo JHtml::_('sliders.start', 'newsfeed-sliders-' . $this->item->id, array('useCookie' => 1)); ?>

			<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_FIELDSET_PUBLISHING'), 'publishing-details'); ?>

			<fieldset class="panelform">
			<legend class="element-invisible"><?php echo JText::_('JGLOBAL_FIELDSET_PUBLISHING'); ?></legend>
			<ul class="adminformlist">
				<li><?php echo $this->form->getLabel('created_by'); ?>
				<?php echo $this->form->getInput('created_by'); ?></li>

				<li><?php echo $this->form->getLabel('created_by_alias'); ?>
				<?php echo $this->form->getInput('created_by_alias'); ?></li>

				<li><?php echo $this->form->getLabel('created'); ?>
				<?php echo $this->form->getInput('created'); ?></li>

				<li><?php echo $this->form->getLabel('publish_up'); ?>
				<?php echo $this->form->getInput('publish_up'); ?></li>

				<li><?php echo $this->form->getLabel('publish_down'); ?>
				<?php echo $this->form->getInput('publish_down'); ?></li>

				<?php if ($this->item->modified_by) : ?>
					<li><?php echo $this->form->getLabel('modified_by'); ?>
					<?php echo $this->form->getInput('modified_by'); ?></li>

					<li><?php echo $this->form->getLabel('modified'); ?>
					<?php echo $this->form->getInput('modified'); ?></li>
				<?php endif; ?>

				<li><?php echo $this->form->getLabel('numarticles'); ?>
				<?php echo $this->form->getInput('numarticles'); ?></li>

				<li><?php echo $this->form->getLabel('cache_time'); ?>
				<?php echo $this->form->getInput('cache_time'); ?></li>

				<li><?php echo $this->form->getLabel('rtl'); ?>
				<?php echo $this->form->getInput('rtl'); ?></li>
			</ul>
			</fieldset>

			<?php echo $this->loadTemplate('params'); ?>

			<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_FIELDSET_METADATA_OPTIONS'), 'meta-options'); ?>
			<fieldset class="panelform">
			<legend class="element-invisible"><?php echo JText::_('JGLOBAL_FIELDSET_METADATA_OPTIONS'); ?></legend>
				<?php echo $this->loadTemplate('metadata'); ?>
			</fieldset>

			<?php if ($assoc) : ?>
				<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_FIELDSET_ASSOCIATIONS'), '-options');?>
				<?php echo $this->loadTemplate('associations'); ?>
			<?php endif; ?>

		<?php echo JHtml::_('sliders.end'); ?>
		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</div>

	<div class="clr"></div>
</form>
templates/hathor/html/com_newsfeeds/newsfeed/edit_params.php000060400000001667152453623430020432 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$fieldSets = $this->form->getFieldsets('params');
foreach ($fieldSets as $name => $fieldSet) :
	echo JHtml::_('sliders.panel', JText::_($fieldSet->label), $name.'-params');
	if (isset($fieldSet->description) && trim($fieldSet->description)) :
		echo '<p class="tip">'.$this->escape(JText::_($fieldSet->description)).'</p>';
	endif;
	?>
	<fieldset class="panelform">
	<legend class="element-invisible"><?php echo JText::_($fieldSet->label); ?></legend>
	<ul class="adminformlist">
		<?php foreach ($this->form->getFieldset($name) as $field) : ?>
			<li><?php echo $field->label; ?>
			<?php echo $field->input; ?></li>
		<?php endforeach; ?>
	</ul>
	</fieldset>
<?php endforeach; ?>
templates/hathor/html/com_newsfeeds/newsfeeds/default.php000060400000024262152453623430017745 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.multiselect');

$app       = JFactory::getApplication();
$user      = JFactory::getUser();
$userId    = $user->get('id');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$canOrder  = $user->authorise('core.edit.state', 'com_newsfeeds');
$saveOrder = $listOrder == 'a.ordering';
$assoc     = JLanguageAssociations::isEnabled();
?>

<form action="<?php echo JRoute::_('index.php?option=com_newsfeeds&view=newsfeeds'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_NEWSFEEDS_SEARCH_IN_TITLE'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>

		<div class="filter-select">
			<label class="selectlabel" for="filter_published">
				<?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?>
			</label>
			<select name="filter_published" id="filter_published">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.published'), true); ?>
			</select>

			<label class="selectlabel" for="filter_category_id">
				<?php echo JText::_('JOPTION_SELECT_CATEGORY'); ?>
			</label>
			<select name="filter_category_id" id="filter_category_id">
				<option value=""><?php echo JText::_('JOPTION_SELECT_CATEGORY'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('category.options', 'com_newsfeeds'), 'value', 'text', $this->state->get('filter.category_id')); ?>
			</select>

			<label class="selectlabel" for="filter_access">
				<?php echo JText::_('JOPTION_SELECT_ACCESS'); ?>
			</label>
			<select name="filter_access" id="filter_access">
				<option value=""><?php echo JText::_('JOPTION_SELECT_ACCESS'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text', $this->state->get('filter.access')); ?>
			</select>

			<label class="selectlabel" for="filter_language">
				<?php echo JText::_('JOPTION_SELECT_LANGUAGE'); ?>
			</label>
			<select name="filter_language" id="filter_language">
				<option value=""><?php echo JText::_('JOPTION_SELECT_LANGUAGE'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('contentlanguage.existing', true, true), 'value', 'text', $this->state->get('filter.language')); ?>
			</select>

			<label class="selectlabel" for="filter_tag">
				<?php echo JText::_('JOPTION_SELECT_TAG'); ?>
			</label>
			<select name="filter_tag" id="filter_tag">
				<option value=""><?php echo JText::_('JOPTION_SELECT_TAG'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('tag.options', true, true), 'value', 'text', $this->state->get('filter.tag')); ?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>
	<div class="clr"> </div>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_TITLE', 'a.name', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap state-col">
					<?php echo JHtml::_('grid.sort', 'JSTATUS', 'a.published', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap title category-col">
					<?php echo JHtml::_('grid.sort', 'JCATEGORY', 'category_title', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap ordering-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ORDERING', 'a.ordering', $listDirn, $listOrder); ?>
					<?php if ($canOrder && $saveOrder) : ?>
						<?php echo JHtml::_('grid.order', $this->items, 'filesave.png', 'newsfeeds.saveorder'); ?>
					<?php endif; ?>
				</th>
				<th class="title access-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ACCESS', 'a.access', $listDirn, $listOrder); ?>
				</th>
				<th class="width-10">
					<?php echo JHtml::_('grid.sort', 'COM_NEWSFEEDS_NUM_ARTICLES_HEADING', 'numarticles', $listDirn, $listOrder); ?>
				</th>
				<th class="width-5">
					<?php echo JHtml::_('grid.sort', 'COM_NEWSFEEDS_CACHE_TIME_HEADING', 'a.cache_time', $listDirn, $listOrder); ?>
				</th>
				<?php if ($assoc) : ?>
					<th class="width-5">
						<?php echo JHtml::_('grid.sort', 'COM_NEWSFEEDS_HEADING_ASSOCIATION', 'association', $listDirn, $listOrder); ?>
					</th>
				<?php endif; ?>
				<th class="width-5">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_LANGUAGE', 'a.language', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) :
			$ordering   = ($listOrder == 'a.ordering');
			$canCreate  = $user->authorise('core.create',     'com_newsfeeds.category.' . $item->catid);
			$canEdit    = $user->authorise('core.edit',       'com_newsfeeds.category.' . $item->catid);
			$canCheckin = $user->authorise('core.manage',     'com_checkin') || $item->checked_out == $user->get('id') || $item->checked_out == 0;
			$canChange  = $user->authorise('core.edit.state', 'com_newsfeeds.category.' . $item->catid) && $canCheckin;
			?>
			<tr class="row<?php echo $i % 2; ?>">
				<th class="center">
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				</th>
				<td>
					<?php if ($item->checked_out) : ?>
						<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'newsfeeds.', $canCheckin); ?>
					<?php endif; ?>
					<?php if ($canEdit) : ?>
						<a href="<?php echo JRoute::_('index.php?option=com_newsfeeds&task=newsfeed.edit&id='.(int) $item->id); ?>">
							<?php echo $this->escape($item->name); ?></a>
					<?php else : ?>
							<?php echo $this->escape($item->name); ?>
					<?php endif; ?>
					<p class="smallsub">
						<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias)); ?></p>
				</td>
				<td class="center">
					<?php echo JHtml::_('jgrid.published', $item->published, $i, 'newsfeeds.', $canChange, 'cb', $item->publish_up, $item->publish_down); ?>
				</td>
				<td class="center">
					<?php echo $this->escape($item->category_title); ?>
				</td>
				<td class="order">
					<?php if ($canChange) : ?>
						<?php if ($saveOrder) :?>
							<?php if ($listDirn == 'asc') : ?>
								<span><?php echo $this->pagination->orderUpIcon($i, $item->catid == @$this->items[$i - 1]->catid, 'newsfeeds.orderup', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
								<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, $item->catid == @$this->items[$i + 1]->catid, 'newsfeeds.orderdown', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
							<?php elseif ($listDirn == 'desc') : ?>
								<span><?php echo $this->pagination->orderUpIcon($i, $item->catid == @$this->items[$i - 1]->catid, 'newsfeeds.orderdown', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
								<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, $item->catid == @$this->items[$i + 1]->catid, 'newsfeeds.orderup', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
							<?php endif; ?>
						<?php endif; ?>
						<?php $disabled = $saveOrder ?  '' : 'disabled="disabled"'; ?>
						<input type="text" name="order[]" size="5" value="<?php echo $item->ordering; ?>" <?php echo $disabled; ?> class="text-area-order" title="<?php echo $item->name; ?> order" />
					<?php else : ?>
						<?php echo $item->ordering; ?>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo $this->escape($item->access_level); ?>
				</td>
				<td class="center">
					<?php echo (int) $item->numarticles; ?>
				</td>
				<td class="center">
					<?php echo (int) $item->cache_time; ?>
				</td>
				<?php if ($assoc) : ?>
					<td class="center">
						<?php if ($item->association) : ?>
							<?php echo JHtml::_('newsfeed.association', $item->id); ?>
						<?php endif; ?>
					</td>
				<?php endif; ?>
				<td class="center">
					<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
				</td>
				<td class="center">
					<?php echo (int) $item->id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php //Load the batch processing form if user is allowed ?>
	<?php if ($user->authorise('core.create', 'com_newsfeeds')
		&& $user->authorise('core.edit', 'com_newsfeeds')
		&& $user->authorise('core.edit.state', 'com_newsfeeds')) : ?>
		<?php echo JHtml::_(
			'bootstrap.renderModal',
			'collapseModal',
			array(
				'title'  => JText::_('COM_NEWSFEEDS_BATCH_OPTIONS'),
				'footer' => $this->loadTemplate('batch_footer'),
			),
			$this->loadTemplate('batch_body')
		); ?>
	<?php endif; ?>

	<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
</div>
</form>
templates/hathor/html/com_newsfeeds/newsfeeds/modal.php000060400000013000152453623430017401 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

$forcedLanguage = JFactory::getApplication()->input->get('forcedLanguage', '', 'cmd');

$function  = JFactory::getApplication()->input->getCmd('function', 'jSelectNewsfeed');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>
<form action="<?php echo JRoute::_('index.php?option=com_newsfeeds&view=newsfeeds&layout=modal&tmpl=component');?>" method="post" name="adminForm" id="adminForm">
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search fltlft">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" size="30" title="<?php echo JText::_('COM_NEWSFEEDS_SEARCH_IN_TITLE'); ?>" />

			<button type="submit">
				<?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();">
				<?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>

		<div class="filter-select fltrt">
			<label class="selectlabel" for="filter_access">
				<?php echo JText::_('JOPTION_SELECT_ACCESS'); ?>
			</label>
			<select name="filter_access" id="filter_access">
				<option value=""><?php echo JText::_('JOPTION_SELECT_ACCESS');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text', $this->state->get('filter.access'));?>
			</select>

			<label class="selectlabel" for="filter_published">
				<?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?>
			</label>
			<select name="filter_published" id="filter_published">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.state'), true);?>
			</select>

			<label class="selectlabel" for="filter_category_id">
				<?php echo JText::_('JOPTION_SELECT_CATEGORY'); ?>
			</label>
			<select name="filter_category_id" id="filter_category_id">
				<option value=""><?php echo JText::_('JOPTION_SELECT_CATEGORY');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('category.options', 'com_newsfeeds'), 'value', 'text', $this->state->get('filter.category_id'));?>
			</select>

			<?php if ($forcedLanguage) : ?>
				<input type="hidden" name="forcedLanguage" value="<?php echo $this->escape($forcedLanguage); ?>" />
				<input type="hidden" name="filter_language" value="<?php echo $this->escape($this->state->get('filter.language')); ?>" />
			<?php else : ?>
				<label class="selectlabel" for="filter_language"><?php echo JText::_('JOPTION_SELECT_LANGUAGE'); ?></label>
				<select name="filter_language" id="filter_language">
					<option value=""><?php echo JText::_('JOPTION_SELECT_LANGUAGE');?></option>
					<?php echo JHtml::_('select.options', JHtml::_('contentlanguage.existing', true, true), 'value', 'text', $this->state->get('filter.language'));?>
				</select>
			<?php endif; ?>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>

	<table class="adminlist modal">
		<thead>
			<tr>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_TITLE', 'a.name', $listDirn, $listOrder); ?>
				</th>
				<th class="title access-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ACCESS', 'access_level', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap state-col">
					<?php echo JHtml::_('grid.sort', 'JCATEGORY', 'a.catid', $listDirn, $listOrder); ?>
				</th>
				<th class="title language-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_LANGUAGE', 'language', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) : ?>
			<tr class="row<?php echo $i % 2; ?>">
				<th>
					<a class="pointer" onclick="if (window.parent) window.parent.<?php echo $this->escape($function);?>('<?php echo $item->id; ?>', '<?php echo $this->escape(addslashes($item->name)); ?>');">
						<?php echo $this->escape($item->name); ?></a>
				</th>
				<td class="center">
					<?php echo $this->escape($item->access_level); ?>
				</td>
				<td class="center">
					<?php echo $this->escape($item->category_title); ?>
				</td>
				<td class="center">
					<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
				</td>
				<td class="center">
					<?php echo (int) $item->id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<input type="hidden" name="forcedLanguage" value="<?php echo $forcedLanguage; ?>" />
	<?php echo JHtml::_('form.token'); ?>
</form>
templates/hathor/html/com_fields/groups/default.php000060400000013347152453623430016566 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$app       = JFactory::getApplication();
$user      = JFactory::getUser();
$userId    = $user->get('id');

$component = '';
$parts     = FieldsHelper::extract($this->state->get('filter.context'));

if ($parts)
{
	$component = $this->escape($parts[0]);
}

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$ordering  = ($listOrder == 'a.ordering');
$saveOrder = ($listOrder == 'a.ordering' && strtolower($listDirn) == 'asc');

if ($saveOrder)
{
	$saveOrderingUrl = 'index.php?option=com_fields&task=groups.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'groupList', 'adminForm', strtolower($listDirn), $saveOrderingUrl, false, true);
}
?>

<form action="<?php echo JRoute::_('index.php?option=com_fields&view=groups'); ?>" method="post" name="adminForm" id="adminForm">
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
		<div id="filter-bar" class="js-stools-container-bar pull-left">
			<div class="btn-group pull-left">
				<?php echo $this->filterForm->getField('context')->input; ?>
			</div>&nbsp;
		</div>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="adminlist" id="groupList">
				<thead>
					<tr>
						<th width="1%" class="center">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
						</th>
						<th>
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ACCESS', 'a.access', $listDirn, $listOrder); ?>
						</th>
						<th width="5%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'a.language', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="9">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
					<?php foreach ($this->items as $i => $item) : ?>
						<?php $ordering   = ($listOrder == 'a.ordering'); ?>
						<?php $canEdit    = $user->authorise('core.edit', $component . '.fieldgroup.' . $item->id); ?>
						<?php $canCheckin = $user->authorise('core.admin', 'com_checkin') || $item->checked_out == $userId || $item->checked_out == 0; ?>
						<?php $canEditOwn = $user->authorise('core.edit.own', $component . '.fieldgroup.' . $item->id) && $item->created_by == $userId; ?>
						<?php $canChange  = $user->authorise('core.edit.state', $component . '.fieldgroup.' . $item->id) && $canCheckin; ?>
						<tr class="row<?php echo $i % 2; ?>" item-id="<?php echo $item->id ?>">
							<td class="center">
								<?php echo JHtml::_('grid.id', $i, $item->id); ?>
							</td>
							<td class="center">
								<?php echo JHtml::_('jgrid.published', $item->state, $i, 'groups.', $canChange); ?>
							</td>
							<td>
								<div class="pull-left break-word">
									<?php if ($item->checked_out) : ?>
										<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'groups.', $canCheckin); ?>
									<?php endif; ?>
									<?php if ($canEdit || $canEditOwn) : ?>
										<a href="<?php echo JRoute::_('index.php?option=com_fields&task=group.edit&id=' . $item->id); ?>">
											<?php echo $this->escape($item->title); ?></a>
									<?php else : ?>
										<?php echo $this->escape($item->title); ?>
									<?php endif; ?>
									<span class="small break-word">
										<?php if ($item->note) : ?>
											<?php echo JText::sprintf('JGLOBAL_LIST_NOTE', $this->escape($item->note)); ?>
										<?php endif; ?>
									</span>
								</div>
							</td>
							<td class="small hidden-phone">
								<?php echo $this->escape($item->access_level); ?>
							</td>
							<td class="small nowrap hidden-phone">
								<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
							</td>
							<td class="center hidden-phone">
								<span><?php echo (int) $item->id; ?></span>
							</td>
						</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
			<?php //Load the batch processing form. ?>
			<?php if ($user->authorise('core.create', $component)
				&& $user->authorise('core.edit', $component)
				&& $user->authorise('core.edit.state', $component)) : ?>
				<?php echo JHtml::_(
						'bootstrap.renderModal',
						'collapseModal',
						array(
							'title' => JText::_('COM_FIELDS_VIEW_GROUPS_BATCH_OPTIONS'),
							'footer' => $this->loadTemplate('batch_footer')
						),
						$this->loadTemplate('batch_body')
					); ?>
			<?php endif; ?>
		<?php endif; ?>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/com_fields/group/edit.php000060400000010067152453623430015700 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');
JHtml::_('behavior.tabstate');

$app = JFactory::getApplication();
$input = $app->input;

JFactory::getDocument()->addScriptDeclaration('
	Joomla.submitbutton = function(task)
	{
		if (task == "group.cancel" || document.formvalidator.isValid(document.getElementById("item-form")))
		{
			Joomla.submitform(task, document.getElementById("item-form"));
		}
	};
');
?>
<div class="groups-edit">
<form action="<?php echo JRoute::_('index.php?option=com_fields&layout=edit&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="item-form" class="form-validate">
	<div class="col main-section">
		<fieldset class="adminform">
		<legend><?php echo JText::_('COM_FIELDS_VIEW_FIELD_FIELDSET_GENERAL'); ?></legend>
		<ul class="adminformlist">
			<li>
				<?php echo $this->form->getLabel('title'); ?>
				<?php echo $this->form->getInput('title'); ?>
			</li>
			<li>
				<?php echo $this->form->getLabel('description'); ?>
				<?php echo $this->form->getInput('description'); ?>
			</li>
			<li>
				<?php echo $this->form->getLabel('published'); ?>
				<?php echo $this->form->getInput('published'); ?>
			</li>
			<li>
				<?php echo $this->form->getLabel('access'); ?>
				<?php echo $this->form->getInput('access'); ?>
			</li>
			<li>
				<?php echo $this->form->getLabel('language'); ?>
				<?php echo $this->form->getInput('language'); ?>
			</li>
			<li>
				<?php echo $this->form->getLabel('note'); ?>
				<?php echo $this->form->getInput('note'); ?>
			</li>
		</ul>
		<div class="clr"></div>
		</fieldset>
	</div>

	<div class="col options-section">
		<?php echo JHtml::_('sliders.start', 'groups-sliders-' . $this->item->id, array('useCookie' => 1)); ?>
		<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_FIELDSET_PUBLISHING'), 'publishing-details'); ?>
		<fieldset class="panelform">
			<legend class="element-invisible"><?php echo JText::_('JGLOBAL_FIELDSET_PUBLISHING'); ?></legend>
			<ul class="adminformlist">
				<li>
					<?php echo $this->form->getLabel('created_by'); ?>
					<?php echo $this->form->getInput('created_by'); ?>
				</li>
				<?php if ((int) $this->item->created) : ?>
					<li>
						<?php echo $this->form->getLabel('created'); ?>
						<?php echo $this->form->getInput('created'); ?>
					</li>
				<?php endif; ?>
				<?php if ($this->item->modified_by) : ?>
					<li>
						<?php echo $this->form->getLabel('modified_by'); ?>
						<?php echo $this->form->getInput('modified_by'); ?>
					</li>
					<li>
						<?php echo $this->form->getLabel('modified'); ?>
						<?php echo $this->form->getInput('modified'); ?>
					</li>
					<li>
						<?php echo $this->form->getLabel('id'); ?>
						<?php echo $this->form->getInput('id'); ?>
					</li>
				<?php endif; ?>
			</ul>
		</fieldset>
		<?php echo JHtml::_('sliders.end'); ?>
		<div class="clr"></div>

		<?php $this->set('ignore_fieldsets', array('fieldparams')); ?>
	</div>
	<div class="clr"></div>

	<?php if ($this->canDo->get('core.admin')) : ?>
		<div class="col rules-section">
			<?php echo JHtml::_('sliders.start', 'permissions-sliders-' . $this->item->id, array('useCookie' => 1)); ?>

			<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_ACTION_PERMISSIONS_LABEL'), 'access-rules'); ?>
			<fieldset class="panelform">
				<legend class="element-invisible"><?php echo JText::_('JGLOBAL_ACTION_PERMISSIONS_LABEL'); ?></legend>
					<?php echo $this->form->getLabel('rules'); ?>
					<?php echo $this->form->getInput('rules'); ?>
			</fieldset>

				<?php echo JHtml::_('sliders.end'); ?>
		</div>
	<?php endif; ?>

		<?php echo $this->form->getInput('context'); ?>
		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
<div class="clr"></div>
</div>templates/hathor/html/com_fields/field/edit.php000060400000012230152453623430015621 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');
JHtml::_('formbehavior.chosen', '#jform_catid', null, array('disable_search_threshold' => 0 ));

$app = JFactory::getApplication();
$input = $app->input;

JFactory::getDocument()->addScriptDeclaration('
	Joomla.submitbutton = function(task)
	{
		if (task == "field.cancel" || document.formvalidator.isValid(document.getElementById("item-form")))
		{
			Joomla.submitform(task, document.getElementById("item-form"));
		}
	};
	jQuery(document).ready(function() {
		jQuery("#jform_title").data("dp-old-value", jQuery("#jform_title").val());
		jQuery("#jform_title").change(function(data, handler) {
			if(jQuery("#jform_title").data("dp-old-value") == jQuery("#jform_label").val()) {
				jQuery("#jform_label").val(jQuery("#jform_title").val());
			}

			jQuery("#jform_title").data("dp-old-value", jQuery("#jform_title").val());
		});
	});
');
?>
<div class="fields-edit">
<form action="<?php echo JRoute::_('index.php?option=com_fields&context=' . $input->getCmd('context', 'com_content') . '&layout=edit&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="item-form" class="form-validate">
	<div class="col main-section">
		<fieldset class="adminform">
			<ul class="adminformlist">
				<li>
					<?php echo $this->form->getLabel('title'); ?>
					<?php echo $this->form->getInput('title'); ?>
				</li>
			</ul>
			<div class="clr"></div>
		</fieldset>
		<fieldset class="adminform">
			<ul class="adminformlist">
				<li><?php echo $this->form->renderField('type'); ?></li>
				<li><?php echo $this->form->renderField('name'); ?></li>
				<li><?php echo $this->form->renderField('label'); ?></li>
				<li><?php echo $this->form->renderField('description'); ?></li>
				<li><?php echo $this->form->renderField('required'); ?></li>
				<li><?php echo $this->form->renderField('default_value'); ?></li>

				<?php foreach ($this->form->getFieldsets('fieldparams') as $name => $fieldSet) : ?>
					<?php foreach ($this->form->getFieldset($name) as $field) : ?>
						<li><?php echo $field->renderField(); ?></li>
					<?php endforeach; ?>
				<?php endforeach; ?>
			</ul>
		</fieldset>

	</div>
	<div class="col options-section">
		<?php echo JHtml::_('sliders.start', 'groups-sliders-' . $this->item->id, array('useCookie' => 1)); ?>
		<?php echo JHtml::_('sliders.panel', JText::_('COM_FIELDS_VIEW_FIELD_FIELDSET_GENERAL'), 'general'); ?>
				<?php $this->set('fields',
						array(
							array(
								'published',
								'state',
								'enabled',
							),
							'group_id',
							'assigned_cat_ids',
							'access',
							'language',
							'note',
						)
				); ?>
				<?php echo JLayoutHelper::render('joomla.edit.global', $this); ?>
				<?php $this->set('fields', null); ?>

		<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_FIELDSET_OPTIONS'), '-options'); ?>
		<?php $this->set('ignore_fieldsets', array('fieldparams')); ?>
		<?php echo JLayoutHelper::render('joomla.edit.params', $this); ?>

		<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_FIELDSET_PUBLISHING'), 'publishing-details'); ?>
			<fieldset class="panelform">
			<legend class="element-invisible"><?php echo JText::_('JGLOBAL_FIELDSET_PUBLISHING'); ?></legend>
				<ul class="adminformlist">

					<li><?php echo $this->form->getLabel('created_user_id'); ?>
					<?php echo $this->form->getInput('created_user_id'); ?></li>

					<li><?php echo $this->form->getLabel('created_time'); ?>
					<?php echo $this->form->getInput('created_time'); ?></li>

					<?php if ($this->item->modified_by) : ?>
						<li><?php echo $this->form->getLabel('modified_by'); ?>
						<?php echo $this->form->getInput('modified_by'); ?></li>

						<li><?php echo $this->form->getLabel('modified_time'); ?>
						<?php echo $this->form->getInput('modified_time'); ?></li>
					<?php endif; ?>

					<li><?php echo $this->form->getLabel('id'); ?>
					<?php echo $this->form->getInput('id'); ?></li>

				</ul>
			</fieldset>
		<?php echo JHtml::_('sliders.end'); ?>
		<div class="clr"></div>
	</div>
	<div class="clr"></div>
		<?php if ($this->canDo->get('core.admin')) : ?>
			<div class="col rules-section">
				<?php echo JHtml::_('sliders.start', 'permissions-sliders-' . $this->item->id, array('useCookie' => 1)); ?>

				<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_ACTION_PERMISSIONS_LABEL'), 'access-rules'); ?>
				<fieldset class="panelform">
					<legend class="element-invisible"><?php echo JText::_('JGLOBAL_ACTION_PERMISSIONS_LABEL'); ?></legend>
						<?php echo $this->form->getLabel('rules'); ?>
						<?php echo $this->form->getInput('rules'); ?>
				</fieldset>

				<?php echo JHtml::_('sliders.end'); ?>
			</div>
		<?php endif; ?>

		<?php echo $this->form->getInput('context'); ?>
		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
<div class="clr"></div>
</div>
templates/hathor/html/com_fields/fields/default.php000060400000015702152453623430016512 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$app       = JFactory::getApplication();
$user      = JFactory::getUser();
$userId    = $user->get('id');
$context   = $this->escape($this->state->get('filter.context'));
$component = $this->state->get('filter.component');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$ordering  = ($listOrder == 'a.ordering');
$saveOrder = ($listOrder == 'a.ordering' && strtolower($listDirn) == 'asc');

// The category object of the component
$category = JCategories::getInstance(str_replace('com_', '', $component));

if ($saveOrder)
{
	$saveOrderingUrl = 'index.php?option=com_fields&task=fields.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'fieldList', 'adminForm', strtolower($listDirn), $saveOrderingUrl, false, true);
}
?>

<form action="<?php echo JRoute::_('index.php?option=com_fields&view=fields'); ?>" method="post" name="adminForm" id="adminForm">
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
		<div id="filter-bar" class="js-stools-container-bar pull-left">
			<div class="btn-group pull-left">
				<?php echo $this->filterForm->getField('context')->input; ?>
			</div>&nbsp;
		</div>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="adminlist" id="fieldList">
				<thead>
					<tr>
						<th class="checkmark-col">
							<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
						</th>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
						</th>
						<th>
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
						</th>
						<th>
							<?php echo JHtml::_('searchtools.sort', 'COM_FIELDS_FIELD_TYPE_LABEL', 'a.type', $listDirn, $listOrder); ?>
						</th>
						<th>
							<?php echo JHtml::_('searchtools.sort', 'COM_FIELDS_FIELD_GROUP_LABEL', 'g.title', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ACCESS', 'a.access', $listDirn, $listOrder); ?>
						</th>
						<th width="5%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'a.language', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="9">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
					<?php foreach ($this->items as $i => $item) : ?>
						<?php $ordering   = ($listOrder == 'a.ordering'); ?>
						<?php $canEdit    = $user->authorise('core.edit', $component . '.field.' . $item->id); ?>
						<?php $canCheckin = $user->authorise('core.admin', 'com_checkin') || $item->checked_out == $userId || $item->checked_out == 0; ?>
						<?php $canEditOwn = $user->authorise('core.edit.own', $component . '.field.' . $item->id) && $item->created_user_id == $userId; ?>
						<?php $canChange  = $user->authorise('core.edit.state', $component . '.field.' . $item->id) && $canCheckin; ?>
						<tr class="row<?php echo $i % 2; ?>" item-id="<?php echo $item->id ?>">
							<td class="center">
								<?php echo JHtml::_('grid.id', $i, $item->id); ?>
							</td>
							<td class="center">
								<?php echo JHtml::_('jgrid.published', $item->state, $i, 'fields.', $canChange); ?>
							</td>
							<td>
								<div class="pull-left break-word">
									<?php if ($item->checked_out) : ?>
										<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'fields.', $canCheckin); ?>
									<?php endif; ?>
									<?php if ($canEdit || $canEditOwn) : ?>
										<a href="<?php echo JRoute::_('index.php?option=com_fields&task=field.edit&id=' . $item->id . '&context=' . $context); ?>">
											<?php echo $this->escape($item->title); ?></a>
									<?php else : ?>
										<?php echo $this->escape($item->title); ?>
									<?php endif; ?>
									<span class="small break-word">
										<?php if (empty($item->note)) : ?>
											<?php echo JText::sprintf('JGLOBAL_LIST_NAME', $this->escape($item->name)); ?>
										<?php else : ?>
											<?php echo JText::sprintf('JGLOBAL_LIST_NAME_NOTE', $this->escape($item->name), $this->escape($item->note)); ?>
										<?php endif; ?>
									</span>
									<div class="small">
										<?php if ($category) : ?>
											<?php echo JText::_('JCATEGORY') . ': '; ?>
											<?php $categories = FieldsHelper::getAssignedCategoriesTitles($item->id); ?>
											<?php if ($categories) : ?>
												<?php echo implode(', ', $categories); ?>
											<?php else : ?>
												<?php echo JText::_('JALL'); ?>
											<?php endif; ?>
										<?php endif; ?>
									</div>
								</div>
							</td>
							<td class="small">
								<?php echo $this->escape($item->type); ?>
							</td>
							<td>
								<?php echo $this->escape($item->group_title); ?>
							</td>
							<td class="small hidden-phone">
								<?php echo $this->escape($item->access_level); ?>
							</td>
							<td class="small nowrap hidden-phone">
								<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
							</td>
							<td class="center hidden-phone">
								<span><?php echo (int) $item->id; ?></span>
							</td>
						</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
			<?php //Load the batch processing form. ?>
			<?php if ($user->authorise('core.create', $component)
				&& $user->authorise('core.edit', $component)
				&& $user->authorise('core.edit.state', $component)) : ?>
				<?php echo JHtml::_(
						'bootstrap.renderModal',
						'collapseModal',
						array(
							'title' => JText::_('COM_FIELDS_VIEW_FIELDS_BATCH_OPTIONS'),
							'footer' => $this->loadTemplate('batch_footer')
						),
						$this->loadTemplate('batch_body')
					); ?>
			<?php endif; ?>
		<?php endif; ?>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/layouts/com_modules/toolbar/newmodule.php000060400000000741152453623430021160 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$text = JText::_('JTOOLBAR_NEW');
?>
<a href="javascript:void(0)" onclick="location.href='index.php?option=com_modules&amp;view=select'" class="toolbar">
	<span class="icon-32-new"></span>
	<?php echo $text; ?>
</a>
templates/hathor/html/layouts/com_modules/toolbar/cancelselect.php000060400000000731152453623430021605 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$text = JText::_('JTOOLBAR_CANCEL');
?>
<a onclick="location.href='index.php?option=com_modules'" class="toolbar" title="<?php echo $text; ?>">
	<span class="icon-32-cancel"></span> <?php echo $text; ?>
</a>
templates/hathor/html/layouts/com_media/toolbar/uploadmedia.php000060400000000742152453623430021055 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$title = JText::_('JTOOLBAR_UPLOAD');
?>
<button data-toggle="collapse" data-target="#collapseUpload" class="toolbar">
	<span class="icon-32-upload" title="<?php echo $title; ?>"></span> <?php echo $title; ?>
</button>
templates/hathor/html/layouts/com_media/toolbar/newfolder.php000060400000000753152453623430020560 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$title = JText::_('COM_MEDIA_CREATE_NEW_FOLDER');
?>
<button data-toggle="collapse" data-target="#collapseFolder" class="toolbar">
	<span class="icon-folder" title="<?php echo $title; ?>"></span> <?php echo $title; ?>
</button>
templates/hathor/html/layouts/com_media/toolbar/deletemedia.php000060400000000734152453623430021034 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$title = JText::_('JTOOLBAR_DELETE');
?>
<button onclick="MediaManager.submit('folder.delete')" class="toolbar">
	<span class="icon-32-delete" title="<?php echo $title; ?>"></span> <?php echo $title; ?>
</button>
templates/hathor/html/layouts/plugins/user/profile/fields/dob.php000060400000000570152453623430021322 0ustar00<?php
/**
 * @package     Joomla.Site
 * @subpackage  Layout
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * $text  string  infotext to be displayed
 */
extract($displayData);

?>
<div class="clrlft"><?php echo $text; ?></div>
templates/hathor/html/layouts/joomla/quickicons/icon.php000060400000002200152453623430017562 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$id      = empty($displayData['id']) ? '' : (' id="' . $displayData['id'] . '"');
$target  = empty($displayData['target']) ? '' : (' target="' . $displayData['target'] . '"');
$onclick = empty($displayData['onclick']) ? '' : (' onclick="' . $displayData['onclick'] . '"');
$title   = empty($displayData['title']) ? '' : (' title="' . $this->escape($displayData['title']) . '"');
$text    = empty($displayData['text']) ? '' : ('<span>' . $displayData['text'] . '</span>')

?>
<div class="quickicon-wrapper"<?php echo $id; ?>>
	<div class="icon">
		<a href="<?php echo $displayData['link']; ?>"<?php echo $target . $onclick . $title; ?>>
			<?php echo JHtml::_('image', empty($displayData['icon']) ? '' : $displayData['icon'], empty($displayData['alt']) ? null : htmlspecialchars($displayData['alt'], ENT_COMPAT, 'UTF-8'), null, true); ?>
			<?php echo $text; ?>
		</a>
	</div>
</div>
templates/hathor/html/layouts/joomla/sidebars/submenu.php000060400000001634152453623430017746 0ustar00<?php
/**
 * @package     Joomla.Site
 * @subpackage  Layout
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

?>
<div id="sidebar">
	<div class="sidebar-nav">
		<?php if ($displayData->displayMenu) : ?>
		<ul id="submenu" class="nav nav-list">
			<?php foreach ($displayData->list as $item) :
			if (isset ($item[2]) && $item[2] == 1) : ?>
				<li class="active">
			<?php else : ?>
				<li>
			<?php endif;
			if ($displayData->hide) : ?>
				<a class="nolink"><?php echo $item[0]; ?></a>
			<?php else :
				if ($item[1] !== '') : ?>
					<a href="<?php echo JFilterOutput::ampReplace($item[1]); ?>"><?php echo $item[0]; ?></a>
				<?php else : ?>
					<?php echo $item[0]; ?>
				<?php endif;
			endif; ?>
			</li>
			<?php endforeach; ?>
		</ul>
		<?php endif; ?>
	</div>
</div>
templates/hathor/html/layouts/joomla/toolbar/separator.php000060400000000670152453623430020135 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$class = empty($displayData['style']) ? 'spacer' : $displayData['style'];
$style = $displayData['style'];

?>
<li class="<?php echo $class; ?>"<?php echo $style; ?>></li>
templates/hathor/html/layouts/joomla/toolbar/iconclass.php000060400000000473152453623430020114 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
icon-32-<?php echo $displayData['icon']; ?>
templates/hathor/html/layouts/joomla/toolbar/help.php000060400000000755152453623430017071 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$doTask = $displayData['doTask'];
$text   = $displayData['text'];

?>

<a href="javascript:void(0)" onclick="<?php echo $doTask; ?>" rel="help" class="toolbar">
	<span class="icon-32-help"></span>
	<?php echo $text; ?>
</a>
templates/hathor/html/layouts/joomla/toolbar/containeropen.php000060400000000530152453623430020774 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>

<div class="toolbar-list" id="<?php echo $displayData['id']; ?>">
	<ul>
templates/hathor/html/layouts/joomla/toolbar/batch.php000060400000000763152453623430017221 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$title = $displayData['title'];

?>
<button type="button" data-toggle="modal" data-target="#collapseModal" class="btn btn-small">
	<span class="icon-32-batch" title="<?php echo $title; ?>"></span>
	<?php echo $title; ?>
</button>
templates/hathor/html/layouts/joomla/toolbar/title.php000060400000001232152453623430017251 0ustar00<?php
/**
 * @package     Joomla.Site
 * @subpackage  Layout
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$class = 'pagetitle';

if (!empty($displayData['icon']))
{
	// Strip the extension.
	$icons = explode(' ', $displayData['icon']);

	foreach ($icons as $i => $icon)
	{
		$icons[$i] = 'icon-48-' . preg_replace('#\.[^.]*$#', '', $icon);
	}
	$class .= ' ' . htmlspecialchars(implode(' ', $icons), ENT_COMPAT, 'UTF-8');
}
?>
<div class="<?php echo $class; ?>">
	<h2>
		<?php echo $displayData['title']; ?>
	</h2>
</div>
templates/hathor/html/layouts/joomla/toolbar/versions.php000060400000001617152453623430020007 0ustar00<?php
/**
 * @package     Joomla.Site
 * @subpackage  Layout
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.modal', 'a.modal_jform_contenthistory');

?>
<a rel="{handler: 'iframe', size: {x: <?php echo $displayData['height']; ?>, y: <?php echo $displayData['width']; ?>}}"
	href="index.php?option=com_contenthistory&amp;view=history&amp;layout=modal&amp;tmpl=component&amp;item_id=<?php echo (int) $displayData['itemId']; ?>&amp;type_id=<?php echo $displayData['typeId']; ?>&amp;type_alias=<?php echo $displayData['typeAlias']; ?>&amp;<?php echo JSession::getFormToken(); ?>=1"
	title="<?php echo $displayData['title']; ?>" class="toolbar modal_jform_contenthistory">
	<span class="icon-32-restore"></span> <?php echo $displayData['title']; ?>
</a>
templates/hathor/html/layouts/joomla/toolbar/popup.php000060400000001125152453623430017274 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$doTask = $displayData['doTask'];
$class  = $displayData['class'];
$text   = $displayData['text'];
$name   = $displayData['name'];
?>

<a onclick="<?php echo $doTask; ?>" class="modal toolbar" data-toggle="modal" data-target="#modal-<?php echo $name; ?>">
	<span class="<?php echo $class; ?>"></span>
	<?php echo $text; ?>
</a>
templates/hathor/html/layouts/joomla/toolbar/link.php000060400000000760152453623430017072 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$doTask = $displayData['doTask'];
$class  = $displayData['class'];
$text   = $displayData['text'];

?>

<a href="<?php echo $doTask; ?>;" class="toolbar">
	<span class="<?php echo $class; ?>"></span>
	<?php echo $text; ?>
</a>
templates/hathor/html/layouts/joomla/toolbar/containerclose.php000060400000000467152453623430021151 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>

	</ul>
	<div class="clr"></div>
</div>
templates/hathor/html/layouts/joomla/toolbar/modal.php000060400000001316152453623430017227 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Layout
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.core');

$selector = $displayData['selector'];
$class    = isset($displayData['class']) ? $displayData['class'] : 'toolbar';
$icon     = isset($displayData['icon']) ? $displayData['icon'] : '';
$text     = isset($displayData['text']) ? $displayData['text'] : '';
?>
<a class="<?php echo $class; ?>" data-toggle="modal" data-target="#<?php echo $selector; ?>">
	<span class="icon-32-<?php echo $icon; ?>"></span>
	<?php echo $text; ?>
</a>
templates/hathor/html/layouts/joomla/toolbar/slider.php000060400000001204152453623430017411 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$doTask  = $displayData['doTask'];
$class   = $displayData['class'];
$text    = $displayData['text'];
$name    = $displayData['name'];
$onClose = $displayData['onClose'];
?>

<a onclick="<?php echo $doTask; ?>" data-toggle="collapse" data-target="#collapse-<?php echo $name; ?>"<?php echo $onClose; ?>>
	<span class="<?php echo $class; ?>"></span>
	<?php echo $text; ?>
</a>
templates/hathor/html/layouts/joomla/toolbar/confirm.php000060400000001014152453623430017563 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$doTask = $displayData['doTask'];
$class  = $displayData['class'];
$text   = $displayData['text'];

?>

<a href="javascript:void(0)" onclick="<?php echo $doTask; ?>" class="toolbar">
	<span class="<?php echo $class; ?>"></span>
	<?php echo $text; ?>
</a>
templates/hathor/html/layouts/joomla/toolbar/standard.php000060400000001070152453623430017730 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$doTask   = $displayData['doTask'];
$class    = $displayData['class'];
$text     = $displayData['text'];
$btnClass = $displayData['btnClass'];

?>

<a href="javascript:void(0)" onclick="<?php echo $doTask; ?>" class="toolbar">
	<span class="<?php echo $class; ?>"></span>
	<?php echo $text; ?>
</a>
templates/hathor/html/layouts/joomla/toolbar/base.php000060400000000563152453623430017050 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>

<li class="button" <?php echo $displayData['id']; ?>>
	<?php echo $displayData['action']; ?>
</li>
templates/hathor/html/layouts/joomla/edit/params.php000060400000004644152453623430016710 0ustar00<?php
/**
 * @package     Joomla.Site
 * @subpackage  Layout
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$app       = JFactory::getApplication();
$form      = $displayData->getForm();
$fieldSets = $form->getFieldsets();

if (empty($fieldSets))
{
	return;
}

$ignoreFieldsets = $displayData->get('ignore_fieldsets') ?: array();
$ignoreFields    = $displayData->get('ignore_fields') ?: array();
$extraFields     = $displayData->get('extra_fields') ?: array();
$tabName         = $displayData->get('tab_name') ?: 'myTab';

if (!empty($displayData->hiddenFieldsets))
{
	// These are required to preserve data on save when fields are not displayed.
	$hiddenFieldsets = $displayData->hiddenFieldsets ?: array();
}

if (!empty($displayData->configFieldsets))
{
	// These are required to configure showing and hiding fields in the editor.
	$configFieldsets = $displayData->configFieldsets ?: array();
}

if ($displayData->get('show_options', 1))
{
	foreach ($fieldSets as $name => $fieldSet)
	{
		// Ensure any fieldsets we don't want to show are skipped (including repeating formfield fieldsets)
		if ((isset($fieldSet->repeat) && $fieldSet->repeat == true)
			|| in_array($name, $ignoreFieldsets)
			|| (!empty($configFieldsets) && in_array($name, $configFieldsets))
			|| (!empty($hiddenFieldsets) && in_array($name, $hiddenFieldsets))
		)
		{
			continue;
		}

		if (!empty($fieldSet->label))
		{
			$label = JText::_($fieldSet->label);
		}
		else
		{
			$label = strtoupper('JGLOBAL_FIELDSET_' . $name);
			if (JText::_($label) === $label)
			{
				$label = strtoupper($app->input->get('option') . '_' . $name . '_FIELDSET_LABEL');
			}
			$label = JText::_($label);
		}

		if (isset($fieldSet->description) && trim($fieldSet->description))
		{
			echo '<p class="alert alert-info">' . $this->escape(JText::_($fieldSet->description)) . '</p>';
		}

		$displayData->fieldset = $name;
		echo JLayoutHelper::render('joomla.edit.fieldset', $displayData);
	}
}
else
{
	$html   = array();
	$html[] = '<div style="display:none;">';
	foreach ($fieldSets as $name => $fieldSet)
	{
		if (in_array($name, $ignoreFieldsets))
		{
			continue;
		}

		if (in_array($name, $hiddenFieldsets))
		{
			foreach ($form->getFieldset($name) as $field)
			{
				$html[] = $field->input;
			}
		}
	}
	$html[] = '</div>';

	echo implode('', $html);
}
templates/hathor/html/layouts/joomla/edit/global.php000060400000002545152453623430016663 0ustar00<?php
/**
 * @package     Joomla.Site
 * @subpackage  Layout
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$app       = JFactory::getApplication();
$form      = $displayData->getForm();
$input     = $app->input;
$component = $input->getCmd('option', 'com_content');

if ($component === 'com_categories')
{
	$extension = $input->getCmd('extension', 'com_content');
	$parts     = explode('.', $extension);
	$component = $parts[0];
}

$saveHistory = JComponentHelper::getParams($component)->get('save_history', 0);

$fields = $displayData->get('fields') ?: array(
	array('parent', 'parent_id'),
	array('published', 'state', 'enabled'),
	array('category', 'catid'),
	'featured',
	'sticky',
	'access',
	'language',
	'tags',
	'note',
	'version_note',
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

if (!$saveHistory)
{
	$hiddenFields[] = 'version_note';
}

$html   = array();
$html[] = '<fieldset class="panelform">';

foreach ($fields as $field)
{
	foreach ((array) $field as $f)
	{
		if ($form->getField($f))
		{
			if (in_array($f, $hiddenFields))
			{
				$form->setFieldAttribute($f, 'type', 'hidden');
			}

			$html[] = $form->renderField($f);
			break;
		}
	}
}

$html[] = '</fieldset>';

echo implode('', $html);
templates/hathor/html/layouts/joomla/edit/fieldset.php000060400000002410152453623430017211 0ustar00<?php
/**
 * @package     Joomla.Site
 * @subpackage  Layout
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$app = JFactory::getApplication();
$form = $displayData->getForm();

$name = $displayData->get('fieldset');
$fieldSet = $form->getFieldset($name);

if (empty($fieldSet))
{
	return;
}

$ignoreFields = $displayData->get('ignore_fields') ? : array();
$extraFields = $displayData->get('extra_fields') ? : array();

if ($displayData->get('show_options', 1))
{
	if (isset($extraFields[$name]))
	{
		foreach ($extraFields[$name] as $f)
		{
			if (in_array($f, $ignoreFields))
			{
				continue;
			}
			if ($form->getField($f))
			{
				$fieldSet[] = $form->getField($f);
			}
		}
	}

	$html = array();
	$html[] = '<fieldset class="panelform">';
	$html[] = '<ul class="adminformlist">';

	foreach ($fieldSet as $field)
	{
		$html[] = '<li> ' . $field->label . $field->input . '</li>';
	}
	$html[] = '</ul>';
	$html[] = '</fieldset>';

	echo implode('', $html);
}
else
{
	$html = array();
	$html[] = '<div style="display:none;">';
	foreach ($fieldSet as $field)
	{
		$html[] = $field->input;
	}
	$html[] = '</div>';

	echo implode('', $html);
}
templates/hathor/html/layouts/joomla/edit/metadata.php000060400000002455152453623430017203 0ustar00<?php
/**
 * @package     Joomla.Site
 * @subpackage  Layout
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// JLayout for standard handling of metadata fields in the administrator content edit screens.
$form = $displayData->get('form');
?>
<fieldset>
	<div class="control-group">
		<?php echo $form->getLabel('metadesc'); ?>
		<div class="controls">
			<?php echo $form->getInput('metadesc'); ?>
		</div>
	</div>
	<div class="control-group">
		<?php echo $form->getLabel('metakey'); ?>
		<div class="controls">
			<?php echo $form->getInput('metakey'); ?>
		</div>
	</div>
	<?php if ($form->getLabel('xreference')):?>
		<div class="control-group">
			<?php echo $form->getLabel('xreference'); ?>
			<div class="controls">
				<?php echo $form->getInput('xreference'); ?>
			</div>
		</div>
	<?php endif; ?>
	<?php foreach ($form->getGroup('metadata') as $field) : ?>
		<?php if ($field->name != 'jform[metadata][tags][]') :?>
			<div class="control-group">
				<?php if (!$field->hidden) : ?>
					<?php echo $field->label; ?>
				<?php endif; ?>
				<div class="controls">
					<?php echo $field->input; ?>
				</div>
			</div>
		<?php endif; ?>
	<?php endforeach; ?>
</fieldset>
templates/hathor/html/layouts/joomla/edit/details.php000060400000006552152453623430017052 0ustar00<?php
/**
 * @package     Joomla.Site
 * @subpackage  Layout
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// JLayout for standard handling of the details sidebar in administrator edit screens.
$title = $displayData->get('form')->getValue('title');
$published = $displayData->get('form')->getValue('published');
$saveHistory = $displayData->get('state')->get('params')->get('save_history', 0);
?>
<div class="span2">
<h4><?php echo JText::_('JDETAILS');?></h4>
			<hr />
			<fieldset class="form-vertical">
				<?php if (empty($title)) : ?>
					<div class="control-group">
						<div class="controls">
							<?php echo $displayData->get('form')->getValue('name'); ?>
						</div>
					</div>
				<?php else : ?>
				<div class="control-group">
					<div class="controls">
						<?php echo $displayData->get('form')->getValue('title'); ?>
					</div>
				</div>
				<?php endif; ?>

				<?php if ($published) : ?>
					<div class="control-group">
						<div class="control-label">
							<?php echo $displayData->get('form')->getLabel('published'); ?>
						</div>
						<div class="controls">
							<?php echo $displayData->get('form')->getInput('published'); ?>
						</div>
					</div>
				<?php else : ?>
					<div class="control-group">
						<div class="control-label">
							<?php echo $displayData->get('form')->getLabel('state'); ?>
						</div>
						<div class="controls">
							<?php echo $displayData->get('form')->getInput('state'); ?>
						</div>
					</div>
				<?php endif; ?>

				<div class="control-group">
					<div class="control-label">
						<?php echo $displayData->get('form')->getLabel('access'); ?>
					</div>
					<div class="controls">
						<?php echo $displayData->get('form')->getInput('access'); ?>
					</div>
				</div>
				<div class="control-group">
					<div class="control-label">
						<?php echo $displayData->get('form')->getLabel('featured'); ?>
					</div>
					<div class="controls">
						<?php echo $displayData->get('form')->getInput('featured'); ?>
					</div>
				</div>
				<?php if (JLanguageMultilang::isEnabled()) : ?>
					<div class="control-group">
						<div class="control-label">
							<?php echo $displayData->get('form')->getLabel('language'); ?>
						</div>
						<div class="controls">
							<?php echo $displayData->get('form')->getInput('language'); ?>
						</div>
					</div>
				<?php else : ?>
				<input type="hidden" name="language" value="<?php echo $displayData->get('form')->getValue('language'); ?>" />
				<?php endif; ?>
				<div class="control-group">
					<?php foreach ($displayData->get('form')->getFieldset('jmetadata') as $field) : ?>
						<?php if ($field->name == 'jform[metadata][tags][]') :?>
						<div class="control-group">
							<div class="control-label"><?php echo $field->label; ?></div>
							<div class="controls"><?php echo $field->input; ?></div>
						</div>
						<?php endif; ?>
					<?php endforeach; ?>
				</div>
				<?php if ($saveHistory) : ?>
					<div class="control-group">
						<div class="control-label">
							<?php echo $displayData->get('form')->getLabel('version_note'); ?>
						</div>
						<div class="controls">
							<?php echo $displayData->get('form')->getInput('version_note'); ?>
						</div>
					</div>
				<?php endif; ?>
			</fieldset>
		</div>
templates/hathor/html/layouts/com_messages/toolbar/mysettings.php000060400000001073152453623430021525 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$text = JText::_('COM_MESSAGES_TOOLBAR_MY_SETTINGS');
?>
<a rel="{handler:'iframe', size:{x:700,y:300}}" href="index.php?option=com_messages&amp;view=config&amp;tmpl=component" title="<?php echo $text; ?>" class="messagesSettings toolbar">
	<span class="icon-32-options"></span> <?php echo $text; ?>
</a>
templates/hathor/html/com_tags/tags/default.php000060400000015675152453623430015703 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.multiselect');

$app       = JFactory::getApplication();
$user      = JFactory::getUser();
$userId    = $user->get('id');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$saveOrder = $listOrder == 'a.ordering';
$n         = count($this->items);
?>

<form action="<?php echo JRoute::_('index.php?option=com_tags&view=tags');?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_TAGS_FILTER_SEARCH_DESC'); ?>" />
			<button type="submit" class="btn"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>

		<div class="filter-select">
			<label class="selectlabel" for="filter_published"><?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?></label>
			<select name="filter_published" id="filter_published">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.published'), true); ?>
			</select>

			<label class="selectlabel" for="filter_access"><?php echo JText::_('JOPTION_SELECT_ACCESS'); ?></label>
			<select name="filter_access" id="filter_access">
				<option value=""><?php echo JText::_('JOPTION_SELECT_ACCESS'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text', $this->state->get('filter.access')); ?>
			</select>

			<label class="selectlabel" for="filter_author_id"><?php echo JText::_('JOPTION_SELECT_AUTHOR'); ?></label>
			<select name="filter_author_id" id="filter_author_id">
				<option value=""><?php echo JText::_('JOPTION_SELECT_AUTHOR'); ?></option>
				<?php echo JHtml::_('select.options', $this->authors, 'value', 'text', $this->state->get('filter.author_id')); ?>
			</select>

			<label class="selectlabel" for="filter_language"><?php echo JText::_('JOPTION_SELECT_LANGUAGE'); ?></label>
			<select name="filter_language" id="filter_language">
				<option value=""><?php echo JText::_('JOPTION_SELECT_LANGUAGE'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('contentlanguage.existing', true, true), 'value', 'text', $this->state->get('filter.language')); ?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>
	<div class="clr"> </div>
	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap state-col">
					<?php echo JHtml::_('grid.sort', 'JSTATUS', 'a.published', $listDirn, $listOrder); ?>
				</th>
				<th class="title access-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ACCESS', 'access', $listDirn, $listOrder); ?>
				<th class="language-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_LANGUAGE', 'language', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) :
			$item->max_ordering = 0; //??
			$canCreate  = $user->authorise('core.create',     'com_tags');
			$canEdit    = $user->authorise('core.edit',       'com_tags.tag.' . $item->id);
			$canCheckin = $user->authorise('core.manage',     'com_checkin') || $item->checked_out_user_id == $userId || $item->checked_out_user_id == 0;
			$canChange  = $user->authorise('core.edit.state', 'com_tags.tag.' . $item->id) && $canCheckin;
			?>
			<tr class="row<?php echo $i % 2; ?>">
				<th class="center">
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				</th>
				<td>
					<?php if ($item->level > 0): ?>
					<?php echo str_repeat('<span class="gi">&mdash;</span>', $item->level - 1) ?>
					<?php endif; ?>

					<?php if ($item->checked_out) : ?>
						<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'tags.', $canCheckin); ?>
					<?php endif; ?>
					<?php if ($canEdit || $canEditOwn) : ?>
						<a href="<?php echo JRoute::_('index.php?option=com_tags&task=tag.edit&id='.$item->id); ?>">
							<?php echo $this->escape($item->title); ?></a>
					<?php else : ?>
						<?php echo $this->escape($item->title); ?>
					<?php endif; ?>
					<p class="smallsub">
						<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias)); ?></p>
				</td>
				<td class="center">
					<?php echo JHtml::_('jgrid.published', $item->published, $i, 'tags.', $canChange, 'cb'); ?>
				</td>
				<td class="center">
					<?php echo $this->escape($item->access_title); ?>
				</td>
				<td class="center">
					<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
				</td>
				<td class="center">
					<?php echo (int) $item->id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php //Load the batch processing form if user is allowed ?>
	<?php if ($user->authorise('core.create', 'com_tags')
		&& $user->authorise('core.edit', 'com_tags')
		&& $user->authorise('core.edit.state', 'com_tags')) : ?>
		<?php echo JHtml::_(
			'bootstrap.renderModal',
			'collapseModal',
			array(
				'title'  => JText::_('COM_TAGS_BATCH_OPTIONS'),
				'footer' => $this->loadTemplate('batch_footer'),
			),
			$this->loadTemplate('batch_body')
		); ?>
	<?php endif;?>

	<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/com_tags/tag/edit.php000060400000010101152453623430014774 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

$saveHistory = $this->state->get('params')->get('save_history', 0);

JHtml::_('behavior.formvalidator');

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(task)
	{
		if (task == 'tag.cancel' || document.formvalidator.isValid(document.getElementById('tag-form')))
		{
			" . $this->form->getField('description')->save() . "
			Joomla.submitform(task, document.getElementById('tag-form'));
		}
	}
");
?>

<div class="weblink-edit">

<form action="<?php echo JRoute::_('index.php?option=com_tags&layout=edit&id='.(int) $this->item->id); ?>" method="post" name="adminForm" id="tag-form" class="form-validate">
	<div class="col main-section">
		<fieldset class="adminform">
			<legend><?php echo empty($this->item->id) ? JText::_('JTOOLBAR_NEW') : JText::sprintf('JTOOLBAR_EDIT', $this->item->id); ?></legend>
			<ul class="adminformlist">
				<li><?php echo $this->form->getLabel('title'); ?>
				<?php echo $this->form->getInput('title'); ?></li>

				<li><?php echo $this->form->getLabel('alias'); ?>
				<?php echo $this->form->getInput('alias'); ?></li>

				<li><?php echo $this->form->getLabel('parent_id'); ?>
				<?php echo $this->form->getInput('parent_id'); ?></li>

				<li><?php echo $this->form->getLabel('published'); ?>
				<?php echo $this->form->getInput('published'); ?></li>

				<li><?php echo $this->form->getLabel('access'); ?>
				<?php echo $this->form->getInput('access'); ?></li>

				<li><?php echo $this->form->getLabel('language'); ?>
				<?php echo $this->form->getInput('language'); ?></li>

				<?php if ($saveHistory) : ?>
					<li><?php echo $this->form->getLabel('version_note'); ?>
					<?php echo $this->form->getInput('version_note'); ?></li>
				<?php endif; ?>

				<li><?php echo $this->form->getLabel('id'); ?>
				<?php echo $this->form->getInput('id'); ?></li>
			</ul>

			<div>
				<?php echo $this->form->getLabel('description'); ?>
				<div class="clr"></div>
				<?php echo $this->form->getInput('description'); ?>
			</div>
		</fieldset>
	</div>

	<div class="col options-section">
		<?php echo JHtml::_('sliders.start', 'weblink-sliders-'.$this->item->id, array('useCookie' => 1)); ?>

		<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_FIELDSET_PUBLISHING'), 'publishing-details'); ?>

		<fieldset class="panelform">
			<legend class="element-invisible"><?php echo JText::_('JGLOBAL_FIELDSET_PUBLISHING'); ?></legend>
			<ul class="adminformlist">

				<li><?php echo $this->form->getLabel('created_by'); ?>
				<?php echo $this->form->getInput('created_by'); ?></li>

				<li><?php echo $this->form->getLabel('created_by_alias'); ?>
				<?php echo $this->form->getInput('created_by_alias'); ?></li>

				<li><?php echo $this->form->getLabel('created'); ?>
				<?php echo $this->form->getInput('created'); ?></li>

				<li><?php echo $this->form->getLabel('publish_up'); ?>
				<?php echo $this->form->getInput('publish_up'); ?></li>

				<li><?php echo $this->form->getLabel('publish_down'); ?>
				<?php echo $this->form->getInput('publish_down'); ?></li>

				<?php if ($this->item->modified_user_id) : ?>
					<li><?php echo $this->form->getLabel('modified_user_id'); ?>
					<?php echo $this->form->getInput('modified_user_id'); ?></li>

					<li><?php echo $this->form->getLabel('modified'); ?>
					<?php echo $this->form->getInput('modified'); ?></li>
				<?php endif; ?>

				<?php if ($this->item->hits) : ?>
					<li><?php echo $this->form->getLabel('hits'); ?>
					<?php echo $this->form->getInput('hits'); ?></li>
				<?php endif; ?>

			</ul>
		</fieldset>

		<?php echo $this->loadTemplate('options'); ?>

		<?php echo $this->loadTemplate('metadata'); ?>

		<?php echo JHtml::_('sliders.end'); ?>

		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
	<div class="clr"></div>
</form>
</div>

templates/hathor/html/com_tags/tag/edit_options.php000060400000004337152453623430016565 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

if (isset($fieldSet->description) && trim($fieldSet->description)) :
	echo '<p class="tip">'.$this->escape(JText::_($fieldSet->description)).'</p>';
endif;
?>
<fieldset class="panelform">
	<legend class="element-invisible"><?php echo JText::_($fieldSet->label); ?></legend>
	<ul class="adminformlist">
			<li><?php echo $this->form->getLabel('created_user_id'); ?>
			<?php echo $this->form->getInput('created_user_id'); ?></li>

			<li><?php echo $this->form->getLabel('created_by_alias'); ?>
			<?php echo $this->form->getInput('created_by_alias'); ?></li>

			<li><?php echo $this->form->getLabel('created_time'); ?>
			<?php echo $this->form->getInput('created_time'); ?></li>

			<li><?php echo $this->form->getLabel('publish_up'); ?>
			<?php echo $this->form->getInput('publish_up'); ?></li>

			<li><?php echo $this->form->getLabel('publish_down'); ?>
			<?php echo $this->form->getInput('publish_down'); ?></li>

			<li><?php echo $this->form->getLabel('modified_user_id'); ?>
			<?php echo $this->form->getInput('modified_user_id'); ?></li>

			<li><?php echo $this->form->getLabel('modified_time'); ?>
			<?php echo $this->form->getInput('modified_time'); ?></li>
			<li><?php echo $this->form->getLabel('version'); ?>
			<?php echo $this->form->getInput('version'); ?></li>


			</ul>
</fieldset>

<?php $fieldSets = $this->form->getFieldsets('params');
	foreach ($fieldSets as $name => $fieldSet) :
	echo JHtml::_('sliders.panel', JText::_($fieldSet->label), $name.'-params');
	if (isset($fieldSet->description) && trim($fieldSet->description)) :
		echo '<p class="tip">'.$this->escape(JText::_($fieldSet->description)).'</p>';
	endif;
	?>
	<fieldset class="panelform">
		<legend class="element-invisible"><?php echo JText::_($fieldSet->label); ?></legend>
		<ul class="adminformlist">
		<?php foreach ($this->form->getFieldset($name) as $field) : ?>
			<li><?php echo $field->label; ?>
			<?php echo $field->input; ?></li>
		<?php endforeach; ?>
		</ul>
	</fieldset>
<?php endforeach; ?>
templates/hathor/html/com_tags/tag/edit_metadata.php000060400000002602152453623430016643 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$fieldSets = $this->form->getFieldsets('metadata');
foreach ($fieldSets as $name => $fieldSet) :
	echo JHtml::_('sliders.panel', JText::_($fieldSet->label), $name.'-options');
	if (isset($fieldSet->description) && trim($fieldSet->description)) :
		echo '<p class="tip">'.$this->escape(JText::_($fieldSet->description)).'</p>';
	endif;
	?>
	<fieldset class="panelform">
	<legend class="element-invisible"><?php echo JText::_($fieldSet->label); ?></legend>
		<ul class="adminformlist">
			<?php if ($name == 'jmetadata') : // Include the real fields in this panel. ?>
				<li><?php echo $this->form->getLabel('metadesc'); ?>
				<?php echo $this->form->getInput('metadesc'); ?></li>

				<li><?php echo $this->form->getLabel('metakey'); ?>
				<?php echo $this->form->getInput('metakey'); ?></li>

				<li><?php echo $this->form->getLabel('xreference'); ?>
				<?php echo $this->form->getInput('xreference'); ?></li>
			<?php endif; ?>
			<?php foreach ($this->form->getFieldset($name) as $field) : ?>
				<li><?php echo $field->label; ?>
				<?php echo $field->input; ?></li>
			<?php endforeach; ?>
		</ul>
	</fieldset>
<?php endforeach; ?>
templates/hathor/html/mod_login/default.php000060400000003773152453623430015114 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.keepalive');
?>
<form action="<?php echo JRoute::_('index.php', true, $params->get('usesecure')); ?>" method="post" id="form-login">
	<fieldset class="loginform">

		<label id="mod-login-username-lbl" for="mod-login-username"><?php echo JText::_('JGLOBAL_USERNAME'); ?></label>
		<input name="username" id="mod-login-username" type="text" size="15" autofocus="true" />

		<label id="mod-login-password-lbl" for="mod-login-password"><?php echo JText::_('JGLOBAL_PASSWORD'); ?></label>
		<input name="passwd" id="mod-login-password" type="password" size="15" />
		<?php if (count($twofactormethods) > 1): ?>
			<div class="control-group">
				<div class="controls">
					<label for="mod-login-secretkey">
						<?php echo JText::_('JGLOBAL_SECRETKEY'); ?>
					</label>
					<input name="secretkey" autocomplete="one-time-code" tabindex="3" id="mod-login-secretkey" type="text" class="input-medium" size="15"/>
				</div>
			</div>
		<?php endif; ?>
		<?php if (!empty ($langs)) : ?>
			<label id="mod-login-language-lbl" for="lang"><?php echo JText::_('MOD_LOGIN_LANGUAGE'); ?></label>
			<?php echo $langs; ?>
		<?php endif; ?>

		<div class="clr"></div>

		<div class="button-holder">
			<div class="button1">
				<div class="next">
					<a href="#" onclick="document.getElementById('form-login').submit();">
						<?php echo JText::_('MOD_LOGIN_LOGIN'); ?></a>
				</div>
			</div>
		</div>

		<div class="clr"></div>
		<input type="submit" class="hidebtn" value="<?php echo JText::_('MOD_LOGIN_LOGIN'); ?>" />
		<input type="hidden" name="option" value="com_login" />
		<input type="hidden" name="task" value="login" />
		<input type="hidden" name="return" value="<?php echo $return; ?>" />
		<?php echo JHtml::_('form.token'); ?>
	</fieldset>
</form>
templates/hathor/html/com_menus/items/default.php000060400000027400152453623430016244 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.multiselect');

$user       = JFactory::getUser();
$app        = JFactory::getApplication();
$userId     = $user->get('id');
$listOrder  = $this->escape($this->state->get('list.ordering'));
$listDirn   = $this->escape($this->state->get('list.direction'));
$ordering   = ($listOrder == 'a.lft');
$canOrder   = $user->authorise('core.edit.state', 'com_menus');
$saveOrder  = ($listOrder == 'a.lft' && $listDirn == 'asc');
$menutypeid = (int) $this->state->get('menutypeid');
$assoc      = JLanguageAssociations::isEnabled() && $this->state->get('filter.client_id') == 0;
?>

<?php // Set up the filter bar. ?>
<form action="<?php echo JRoute::_('index.php?option=com_menus&view=items'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_MENUS_ITEMS_SEARCH_FILTER'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>
		<div class="filter-select">
			<label class="selectlabel" for="menutype">
				<?php echo JText::_('TPL_HATHOR_COM_MENUS_MENU'); ?>
			</label>
			<select name="menutype" id="menutype">
				<?php echo JHtml::_('select.options', JHtml::_('menu.menus'), 'value', 'text', $this->state->get('filter.menutype')); ?>
			</select>

			<label class="selectlabel" for="filter_level">
				<?php echo JText::_('COM_MENUS_OPTION_SELECT_LEVEL'); ?>
			</label>
			<select name="filter_level" id="filter_level">
				<option value=""><?php echo JText::_('COM_MENUS_OPTION_SELECT_LEVEL'); ?></option>
				<?php echo JHtml::_('select.options', $this->f_levels, 'value', 'text', $this->state->get('filter.level')); ?>
			</select>

			<label class="selectlabel" for="filter_published">
				<?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?>
			</label>
			<select name="filter[published]" id="filter_published">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('jgrid.publishedOptions', array('archived' => false)), 'value', 'text', $this->state->get('filter.published'), true); ?>
			</select>

			<label class="selectlabel" for="filter_access">
				<?php echo JText::_('JOPTION_SELECT_ACCESS'); ?>
			</label>
			<select name="filter[access]" id="filter_access">
				<option value=""><?php echo JText::_('JOPTION_SELECT_ACCESS'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text', $this->state->get('filter.access')); ?>
			</select>

			<label class="selectlabel" for="filter_language">
				<?php echo JText::_('JOPTION_SELECT_LANGUAGE'); ?>
			</label>
			<select name="filter[language]" id="filter_language">
				<option value=""><?php echo JText::_('JOPTION_SELECT_LANGUAGE'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('contentlanguage.existing', true, true), 'value', 'text', $this->state->get('filter.language')); ?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>
	<div class="clr"> </div>
<?php //Set up the grid heading. ?>
	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap state-col">
					<?php echo JHtml::_('grid.sort', 'JSTATUS', 'a.published', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap ordering-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ORDERING', 'a.lft', $listDirn, $listOrder); ?>
					<?php if ($canOrder && $saveOrder) : ?>
						<?php echo JHtml::_('grid.order', $this->items, 'filesave.png', 'items.saveorder'); ?>
					<?php endif; ?>
				</th>
				<th class="title access-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ACCESS', 'access_level', $listDirn, $listOrder); ?>
				</th>
				<th width="10%">
					<?php echo JText::_('JGRID_HEADING_MENU_ITEM_TYPE'); ?>
				</th>
				<?php if ($this->state->get('filter.client_id') == 0): ?>
				<th class="home-col">
					<?php echo JHtml::_('grid.sort', 'COM_MENUS_HEADING_HOME', 'a.home', $listDirn, $listOrder); ?>
				</th>
				<?php endif; ?>
				<?php if ($assoc) : ?>
				<th class="width-5">
					<?php echo JHtml::_('grid.sort', 'COM_MENUS_HEADING_ASSOCIATION', 'association', $listDirn, $listOrder); ?>
				</th>
				<?php endif; ?>
				<th class="language-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_LANGUAGE', 'language', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php
		foreach ($this->items as $i => $item) :
			$orderkey   = array_search($item->id, $this->ordering[$item->parent_id]);
			$canCreate  = $user->authorise('core.create',     'com_menus.menu.' . $menutypeid);
			$canEdit    = $user->authorise('core.edit',       'com_menus.menu.' . $menutypeid);
			$canCheckin = $user->authorise('core.manage',     'com_checkin') || $item->checked_out == $user->get('id')|| $item->checked_out == 0;
			$canChange  = $user->authorise('core.edit.state', 'com_menus.menu.' . $menutypeid) && $canCheckin;
		?>
			<tr class="row<?php echo $i % 2; ?>">
				<td class="center">
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				</td>
				<td>
					<?php echo str_repeat('<span class="gi">|&mdash;</span>', $item->level - 1) ?>
					<?php if ($item->checked_out) : ?>
						<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'items.', $canCheckin); ?>
					<?php endif; ?>
					<?php if ($canEdit && !$item->protected) : ?>
						<a href="<?php echo JRoute::_('index.php?option=com_menus&task=item.edit&id='.(int) $item->id); ?>">
							<?php echo $this->escape($item->title); ?></a>
					<?php else : ?>
						<?php echo $this->escape($item->title); ?>
					<?php endif; ?>
					<p class="smallsub" title="<?php echo $this->escape($item->path); ?>">
						<?php echo str_repeat('<span class="gtr">|&mdash;</span>', $item->level - 1) ?>
						<?php if ($item->type != 'url') : ?>
							<?php if (empty($item->note)) : ?>
								<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias)); ?>
							<?php else : ?>
								<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS_NOTE', $this->escape($item->alias), $this->escape($item->note)); ?>
							<?php endif; ?>
						<?php elseif ($item->type == 'url' && $item->note) : ?>
							<?php echo JText::sprintf('JGLOBAL_LIST_NOTE', $this->escape($item->note)); ?>
						<?php endif; ?></p>
				</td>
				<td class="center">
					<?php echo JHtml::_('MenusHtml.Menus.state', $item->published, $i, $canChange, 'cb'); ?>
				</td>
				<td class="order">
					<?php if ($canChange) : ?>
						<?php if ($saveOrder) : ?>
							<span><?php echo $this->pagination->orderUpIcon($i, isset($this->ordering[$item->parent_id][$orderkey - 1]), 'items.orderup', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
							<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, isset($this->ordering[$item->parent_id][$orderkey + 1]), 'items.orderdown', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
						<?php endif; ?>
						<?php $disabled = $saveOrder ? '' : 'disabled="disabled"'; ?>
						<input type="text" name="order[]" value="<?php echo $orderkey + 1; ?>" <?php echo $disabled; ?> class="text-area-order" title="<?php echo $item->title; ?> order" />
					<?php else : ?>
						<?php echo $orderkey + 1; ?>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo $this->escape($item->access_level); ?>
				</td>
				<td class="nowrap">
					<span title="<?php echo isset($item->item_type_desc) ? htmlspecialchars($this->escape($item->item_type_desc), ENT_COMPAT, 'UTF-8') : ''; ?>">
						<?php echo $this->escape($item->item_type); ?></span>
				</td>
				<?php if ($this->state->get('filter.client_id') == 0): ?>
				<td class="center">
					<?php if ($item->type == 'component') : ?>
						<?php if ($item->language == '*' || $item->home == '0'):?>
							<?php echo JHtml::_('jgrid.isdefault', $item->home, $i, 'items.', ($item->language != '*' || !$item->home) && $canChange && !$item->protected); ?>
						<?php elseif ($canChange):?>
							<a href="<?php echo JRoute::_('index.php?option=com_menus&task=items.unsetDefault&cid[]='.$item->id.'&'.JSession::getFormToken().'=1'); ?>">
								<?php if ($item->language_image) : ?>
									<?php echo JHtml::_('image', 'mod_languages/' . $item->language_image . '.gif', $item->language_title, array('title' => JText::sprintf('COM_MENUS_GRID_UNSET_LANGUAGE', $item->language_title)), true); ?>
								<?php else : ?>
									<span class="label" title="<?php echo JText::sprintf('COM_MENUS_GRID_UNSET_LANGUAGE', $item->language_title); ?>"><?php echo $item->language_sef; ?></span>
								<?php endif; ?>
							</a>
						<?php else:?>
							<?php if ($item->language_image) : ?>
								<?php echo JHtml::_('image', 'mod_languages/' . $item->language_image . '.gif', $item->language_title, array('title' => $item->language_title), true); ?>
							<?php else : ?>
								<span class="label" title="<?php echo $item->language_title; ?>"><?php echo $item->language_sef; ?></span>
							<?php endif; ?>
						<?php endif; ?>
					<?php endif; ?>
				</td>
				<?php endif; ?>
				<?php if ($assoc) : ?>
				<td class="center">
					<?php if ($item->association):?>
						<?php echo JHtml::_('MenusHtml.Menus.association', $item->id); ?>
					<?php endif; ?>
				</td>
				<?php endif; ?>
				<td class="center">
					<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
				</td>
				<td class="center">
					<span title="<?php echo sprintf('%d-%d', $item->lft, $item->rgt); ?>">
						<?php echo (int) $item->id; ?></span>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>
	<div class="clr"> </div>

	<?php //Load the batch processing form.is user is allowed ?>
	<?php if ($user->authorise('core.create', 'com_menus') || $user->authorise('core.edit', 'com_menus')) : ?>
		<?php echo JHtml::_(
			'bootstrap.renderModal',
			'collapseModal',
			array(
				'title'  => JText::_('COM_MENUS_BATCH_OPTIONS'),
				'footer' => $this->loadTemplate('batch_footer'),
			),
			$this->loadTemplate('batch_body')
		); ?>
	<?php endif; ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/com_menus/item/edit_options.php000060400000004472152453623430017141 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$assoc = JLanguageAssociations::isEnabled();

?>
<?php
	$fieldSets = $this->form->getFieldsets('request');

	if (!empty($fieldSets))
	{
		$fieldSet = array_shift($fieldSets);
		$label = !empty($fieldSet->label) ? $fieldSet->label : 'COM_MENUS_'.$fieldSet->name.'_FIELDSET_LABEL';
		echo JHtml::_('sliders.panel', JText::_($label), 'request-options');
		if (isset($fieldSet->description) && trim($fieldSet->description)) :
			echo '<p class="tip">'.$this->escape(JText::_($fieldSet->description)).'</p>';
		endif;
	?>
		<fieldset class="panelform">
			<legend class="element-invisible"><?php echo JText::_($label) ?></legend>
			<?php $hidden_fields = ''; ?>
			<ul class="adminformlist">
				<?php foreach ($this->form->getFieldset('request') as $field) : ?>
				<?php if (!$field->hidden) : ?>
				<li>
					<?php echo $field->label; ?>
					<?php echo $field->input; ?>
				</li>
				<?php else : $hidden_fields .= $field->input; ?>
				<?php endif; ?>
				<?php endforeach; ?>
			</ul>
			<?php echo $hidden_fields; ?>
		</fieldset>
<?php
	}

	$fieldSets = $this->form->getFieldsets('params');

	foreach ($fieldSets as $name => $fieldSet) :
		$label = !empty($fieldSet->label) ? $fieldSet->label : 'COM_MENUS_'.$name.'_FIELDSET_LABEL';
		echo JHtml::_('sliders.panel', JText::_($label), $name.'-options');
			if (isset($fieldSet->description) && trim($fieldSet->description)) :
				echo '<p class="tip">'.$this->escape(JText::_($fieldSet->description)).'</p>';
			endif;
			?>
		<div class="clr"></div>
		<fieldset class="panelform">
			<legend class="element-invisible"><?php echo JText::_($label) ?></legend>
			<ul class="adminformlist">
				<?php foreach ($this->form->getFieldset($name) as $field) : ?>
					<li><?php echo $field->label; ?>
					<?php echo $field->input; ?></li>
				<?php endforeach; ?>
			</ul>
		</fieldset>
	<?php endforeach;?>

	<?php if ($assoc && $this->state->get('item.client_id') != 1) : ?>
		<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_FIELDSET_ASSOCIATIONS'), '-options');?>
		<?php echo $this->loadTemplate('associations'); ?>
	<?php endif; ?>
templates/hathor/html/com_menus/item/edit.php000060400000014070152453623430015361 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.framework');
JHtml::_('behavior.formvalidator');
JHtml::_('behavior.modal');

$assoc = JLanguageAssociations::isEnabled();

// Ajax for parent items
$script = "
jQuery(document).ready(function ($){
	$('#jform_menutype').change(function(){
		var menutype = $(this).val();
		$.ajax({
			url: 'index.php?option=com_menus&task=item.getParentItem&menutype=' + menutype,
			dataType: 'json'
		}).done(function(data) {
			$('#jform_parent_id option').each(function() {
				if ($(this).val() != '1') {
					$(this).remove();
				}
			});
			$.each(data, function (i, val) {
				var option = $('<option>');
				option.text(val.title).val(val.id);
				$('#jform_parent_id').append(option);
			});
			$('#jform_parent_id').trigger('liszt:updated');
		});
	});
});
Joomla.submitbutton = function(task, type){
	if (task == 'item.setType' || task == 'item.setMenuType')
	{
		if (task == 'item.setType')
		{
			jQuery('#item-form input[name=\"jform[type]\"]').val(type);
			jQuery('#fieldtype').val('type');
		} else {
			jQuery('#item-form input[name=\"jform[menutype]\"]').val(type);
		}
		Joomla.submitform('item.setType', document.getElementById('item-form'));
	} else if (task == 'item.cancel' || document.formvalidator.isValid(document.getElementById('item-form')))
	{
		Joomla.submitform(task, document.getElementById('item-form'));
	}
	else
	{
		// special case for modal popups validation response
		jQuery('#item-form .modal-value.invalid').each(function(){
			var field = jQuery(this),
				idReversed = field.attr('id').split('').reverse().join(''),
				separatorLocation = idReversed.indexOf('_'),
				nameId = '#' + idReversed.substr(separatorLocation).split('').reverse().join('') + 'name';
			jQuery(nameId).addClass('invalid');
		});
	}
};
";
// Add the script to the document head.
JFactory::getDocument()->addScriptDeclaration($script);

// In case of modal
$input = JFactory::getApplication()->input;
$isModal  = $input->get('layout') == 'modal' ? true : false;
$layout   = $isModal ? 'modal' : 'edit';
$tmpl     = $isModal || $input->get('tmpl', '', 'cmd') === 'component' ? '&tmpl=component' : '';
$clientId = $this->state->get('item.client_id', 0);
?>

<div class="menuitem-edit">

<form action="<?php echo JRoute::_('index.php?option=com_menus&view=item&client_id=' . $clientId . '&layout=' . $layout . $tmpl . '&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="item-form" class="form-validate">

<div class="col main-section">
	<fieldset class="adminform">
		<legend><?php echo JText::_('COM_MENUS_ITEM_DETAILS');?></legend>
			<ul class="adminformlist">

				<li><?php echo $this->form->getLabel('type'); ?>
				<?php echo $this->form->getInput('type'); ?></li>

				<li><?php echo $this->form->getLabel('title'); ?>
				<?php echo $this->form->getInput('title'); ?></li>

				<?php if ($this->item->type == 'url') : ?>
					<?php $this->form->setFieldAttribute('link', 'readonly', 'false');?>
					<li><?php echo $this->form->getLabel('link'); ?>
					<?php echo $this->form->getInput('link'); ?></li>
				<?php endif; ?>

				<?php if ($this->item->type != 'url') : ?>
					<li><?php echo $this->form->getLabel('alias'); ?>
					<?php echo $this->form->getInput('alias'); ?></li>
				<?php endif; ?>

				<li><?php echo $this->form->getLabel('note'); ?>
				<?php echo $this->form->getInput('note'); ?></li>

				<?php if ($this->item->type !== 'url') : ?>
					<li><?php echo $this->form->getLabel('link'); ?>
					<?php echo $this->form->getInput('link'); ?></li>
				<?php endif ?>

				<?php if ($this->canDo->get('core.edit.state')) : ?>
					<li><?php echo $this->form->getLabel('published'); ?>
					<?php echo $this->form->getInput('published'); ?></li>
				<?php endif ?>

				<li><?php echo $this->form->getLabel('access'); ?>
				<?php echo $this->form->getInput('access'); ?></li>

				<li><?php echo $this->form->getLabel('menutype'); ?>
				<?php echo $this->form->getInput('menutype'); ?></li>

				<li><?php echo $this->form->getLabel('parent_id'); ?>
				<?php echo $this->form->getInput('parent_id'); ?></li>

				<li><?php echo $this->form->getLabel('menuordering'); ?>
				<?php echo $this->form->getInput('menuordering'); ?></li>

				<li><?php echo $this->form->getLabel('browserNav'); ?>
				<?php echo $this->form->getInput('browserNav'); ?></li>

				<?php if ($this->canDo->get('core.edit.state')) : ?>
					<?php if ($this->item->type == 'component') : ?>
					<li><?php echo $this->form->getLabel('home'); ?>
					<?php echo $this->form->getInput('home'); ?></li>
					<?php endif; ?>
				<?php endif; ?>

				<li><?php echo $this->form->getLabel('language'); ?>
				<?php echo $this->form->getInput('language'); ?></li>

				<li><?php echo $this->form->getLabel('template_style_id'); ?>
				<?php echo $this->form->getInput('template_style_id'); ?></li>

				<li><?php echo $this->form->getLabel('id'); ?>
				<?php echo $this->form->getInput('id'); ?></li>

				<li><?php echo $this->form->getLabel('client_id'); ?>
					<?php echo $this->form->getInput('client_id'); ?></li>
			</ul>

	</fieldset>
</div>

<div class="col options-section">
	<?php echo JHtml::_('sliders.start', 'menu-sliders-'.$this->item->id); ?>
	<?php //Load  parameters.
		echo $this->loadTemplate('options'); ?>

		<div class="clr"></div>

		<?php if (!empty($this->modules)) : ?>
			<?php echo JHtml::_('sliders.panel', JText::_('COM_MENUS_ITEM_MODULE_ASSIGNMENT'), 'module-options'); ?>
			<fieldset>
				<?php echo $this->loadTemplate('modules'); ?>
			</fieldset>
		<?php endif; ?>

	<?php echo JHtml::_('sliders.end'); ?>

	<input type="hidden" name="task" value="" />
	<?php echo $this->form->getInput('component_id'); ?>
	<?php echo JHtml::_('form.token'); ?>
	<input type="hidden" id="fieldtype" name="fieldtype" value="" />
</div>
</form>

<div class="clr"></div>
</div>
templates/hathor/html/com_menus/menutypes/default.php000060400000003022152453623430017146 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$input = JFactory::getApplication()->input;
// Checking if loaded via index.php or component.php
$tmpl = ($input->getCmd('tmpl') != '') ? '1' : '';

JFactory::getDocument()->addScriptDeclaration(
		'
		setmenutype = function(type) {
			var tmpl = ' . json_encode($tmpl) . ';
			if (tmpl)
			{
				window.parent.Joomla.submitbutton("item.setType", type);
				window.parent.jQuery("#menuTypeModal").modal("hide");
			}
			else
			{
				window.location="index.php?option=com_menus&view=item&task=item.setType&layout=edit&type=" + type;
			}
		};
	'
);
?>

<h2 class="modal-title"><?php echo JText::_('COM_MENUS_TYPE_CHOOSE'); ?></h2>
<ul class="menu_types">
	<?php foreach ($this->types as $name => $list): ?>
	<li><dl class="menu_type">
			<dt><?php echo JText::_($name); ?></dt>
			<dd><ul>
					<?php foreach ($list as $item): ?>
					<li><a class="choose_type" href="#" title="<?php echo JText::_($item->description); ?>"
							onclick="javascript:setmenutype('<?php echo base64_encode(json_encode(array('id' => $this->recordId, 'title' => isset($item->type) ? $item->type : $item->title, 'request' => $item->request))); ?>')">
							<?php echo JText::_($item->title);?>
						</a>
					</li>
					<?php endforeach; ?>
				</ul>
			</dd>
		</dl>
	</li>
	<?php endforeach; ?>

</ul>
templates/hathor/html/com_menus/menus/default.php000060400000020742152453623430016254 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.multiselect');

$uri       = JUri::getInstance();
$return    = base64_encode($uri);
$user      = JFactory::getUser();
$userId    = $user->get('id');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$modMenuId = (int) $this->get('ModMenuId');

$script = array();
$script[] = 'jQuery(document).ready(function() {';

foreach ($this->items as $item) :
	if ($user->authorise('core.edit', 'com_menus')) :
		$script[] = '	function jSelectPosition_' . $item->id . '(name) {';
		$script[] = '		document.getElementById("' . $item->id . '").value = name;';
		$script[] = '		jQuery(".modal").modal("hide");';
		$script[] = '	};';
	endif;
endforeach;

$script[] = '	jQuery(".modal").on("hidden", function () {';
$script[] = '		setTimeout(function(){';
$script[] = '			window.parent.location.reload();';
$script[] = '		},1000);';
$script[] = '	});';
$script[] = '});';

JFactory::getDocument()->addScriptDeclaration(implode("\n", $script));
?>
<form action="<?php echo JRoute::_('index.php?option=com_menus&view=menus');?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('COM_MENUS_MENU_SEARCH_FILTER'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_MENUS_ITEMS_SEARCH_FILTER'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>
	</fieldset>
	<div class="clearfix"> </div>
	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col" rowspan="2">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th rowspan="2">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
				</th>
				<th class="width-30" colspan="3">
					<?php echo JText::_('COM_MENUS_HEADING_NUMBER_MENU_ITEMS'); ?>
				</th>
				<th class="width-20" rowspan="2">
					<?php echo JText::_('COM_MENUS_HEADING_LINKED_MODULES'); ?>
				</th>
				<th class="nowrap id-col" rowspan="2">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
				</th>
			</tr>
			<tr>
				<th class="width-10">
					<?php echo JText::_('COM_MENUS_HEADING_PUBLISHED_ITEMS'); ?>
				</th>
				<th class="width-10">
					<?php echo JText::_('COM_MENUS_HEADING_UNPUBLISHED_ITEMS'); ?>
				</th>
				<th class="width-10">
					<?php echo JText::_('COM_MENUS_HEADING_TRASHED_ITEMS'); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) :
			$canCreate = $user->authorise('core.create',     'com_menus');
			$canEdit   = $user->authorise('core.edit',       'com_menus');
			$canChange = $user->authorise('core.edit.state', 'com_menus');
			$canManageItems = $user->authorise('core.manage', 'com_menus.menu.' . (int) $item->id);
		?>
			<tr class="row<?php echo $i % 2; ?>">
				<td class="center">
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				</td>
				<td>
					<?php if ($canManageItems) : ?>
					<a href="<?php echo JRoute::_('index.php?option=com_menus&view=items&menutype=' . $item->menutype); ?>">
						<?php echo $this->escape($item->title); ?></a>
					<?php else : ?>
						<?php echo $this->escape($item->title); ?>
					<?php endif; ?>
					<p class="smallsub">(<span><?php echo JText::_('COM_MENUS_MENU_MENUTYPE_LABEL') ?></span>
						<?php if ($canEdit) : ?>
							<?php echo '<a href="'.JRoute::_('index.php?option=com_menus&task=menu.edit&id='.$item->id).' title='.$this->escape($item->description).'">'.
							$this->escape($item->menutype).'</a>'; ?>)
						<?php else : ?>
							<?php echo $this->escape($item->menutype)?>)
						<?php endif; ?>
					</p>
				</td>
				<td class="center btns">
					<a href="<?php echo JRoute::_('index.php?option=com_menus&view=items&menutype='.$item->menutype.'&filter_published=1');?>">
						<?php echo $item->count_published; ?></a>
				</td>
				<td class="center btns">
					<a href="<?php echo JRoute::_('index.php?option=com_menus&view=items&menutype='.$item->menutype.'&filter_published=0');?>">
						<?php echo $item->count_unpublished; ?></a>
				</td>
				<td class="center btns">
					<a href="<?php echo JRoute::_('index.php?option=com_menus&view=items&menutype='.$item->menutype.'&filter_published=-2');?>">
						<?php echo $item->count_trashed; ?></a>
				</td>
				<td class="left">
				<ul class="menu-module-list">
					<?php
					if (isset($this->modules[$item->menutype])) :
						foreach ($this->modules[$item->menutype] as &$module) :
						?>
						<li>
							<?php if ($canEdit) : ?>
								<?php $link = JRoute::_('index.php?option=com_modules&task=module.edit&id='.$module->id.'&return='.$return.'&tmpl=component&layout=modal'); ?>
								<a href="#module<?php echo $module->id; ?>Modal" role="button" class="button" data-toggle="modal" title="<?php echo JText::_('COM_MENUS_EDIT_MODULE_SETTINGS');?>">
									<?php echo JText::sprintf('COM_MENUS_MODULE_ACCESS_POSITION', $this->escape($module->title), $this->escape($module->access_title), $this->escape($module->position)); ?></a>
							<?php else : ?>
								<?php echo JText::sprintf('COM_MENUS_MODULE_ACCESS_POSITION', $this->escape($module->title), $this->escape($module->access_title), $this->escape($module->position)); ?>
							<?php endif; ?>
						</li>
						<?php endforeach; ?>
				</ul>
					<?php foreach ($this->modules[$item->menutype] as &$module) : ?>
						<?php if ($canEdit) : ?>
							<?php $link = JRoute::_('index.php?option=com_modules&task=module.edit&id='.$module->id.'&return='.$return.'&tmpl=component&layout=modal'); ?>
							<?php echo JHtml::_(
									'bootstrap.renderModal',
									'module' . $module->id . 'Modal',
									array(
										'url'    => $link,
										'title'  => JText::_('COM_MENUS_EDIT_MODULE_SETTINGS'),
										'height' => '300px',
										'width'  => '800px',
										'footer' => '<button type="button" class="btn" data-dismiss="modal">'
											. JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>'
											. '<button type="button" class="btn btn-success" data-dismiss="modal" onclick="jQuery(\'#module'
											. $module->id . 'Modal iframe\').contents().find(\'#saveBtn\').click();">'
											. JText::_('JSAVE') . '</button>',
									)
								); ?>
						<?php endif; ?>
					<?php endforeach; ?>
					<?php elseif ($modMenuId) : ?>
						<?php $link = JRoute::_('index.php?option=com_modules&task=module.add&eid=' . $modMenuId . '&params[menutype]=' . $item->menutype); ?>
						<a href="<?php echo $link; ?>"><?php echo JText::_('COM_MENUS_ADD_MENU_MODULE'); ?></a>
						<?php echo JHtml::_(
							'bootstrap.renderModal',
							'moduleModal',
							array(
								'url'    => $link,
								'title'  => JText::_('COM_MENUS_EDIT_MODULE_SETTINGS'),
								'height' => '500px',
								'width'  => '800px',
								'footer' => '<button type="button" class="btn" data-dismiss="modal">'
									. JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>',
							)
						); ?>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo $item->id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/com_menus/menu/edit.php000060400000004372152453623430015373 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.formvalidator');

JText::script('ERROR');

JFactory::getDocument()->addScriptDeclaration("
		Joomla.submitbutton = function(task)
		{
			var form = document.getElementById('item-form');
			if (task == 'menu.cancel' || document.formvalidator.isValid(form))
			{
				Joomla.submitform(task, form);
			}
		};
");
?>

<div class="menu-edit">

<form action="<?php echo JRoute::_('index.php?option=com_menus&layout=edit&id='.(int) $this->item->id); ?>" method="post" name="adminForm" id="item-form">
<div class="col main-section">
	<fieldset class="adminform">
		<legend><?php echo JText::_('COM_MENUS_MENU_DETAILS');?></legend>
			<ul class="adminformlist">
				<li><?php echo $this->form->getLabel('title'); ?>
				<?php echo $this->form->getInput('title'); ?></li>

				<li><?php echo $this->form->getLabel('menutype'); ?>
				<?php echo $this->form->getInput('menutype'); ?></li>

				<li><?php echo $this->form->getLabel('description'); ?>
				<?php echo $this->form->getInput('description'); ?></li>

				<li><?php echo $this->form->getLabel('client_id'); ?>
				<?php echo $this->form->getInput('client_id'); ?></li>
			</ul>
	</fieldset>
</div>
	<div class="clr"></div>
	<?php if ($this->canDo->get('core.admin')) : ?>
		<div  class="col rules-section">
			<?php echo JHtml::_('sliders.start', 'permissions-sliders-' . $this->item->id, array('useCookie' => 1)); ?>

				<?php echo JHtml::_('sliders.panel', JText::_('COM_MENUS_FIELDSET_RULES'), 'access-rules'); ?>
				<fieldset class="panelform">
					<legend class="element-invisible"><?php echo JText::_('COM_CONTENT_FIELDSET_RULES'); ?></legend>
					<?php echo $this->form->getLabel('rules'); ?>
					<?php echo $this->form->getInput('rules'); ?>
				</fieldset>

			<?php echo JHtml::_('sliders.end'); ?>
		</div>
	<?php endif; ?>
	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>

</form>
<div class="clr"></div>
</div>
templates/hathor/html/com_templates/template/default.php000060400000051260152453623430017606 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('bootstrap.tooltip');

$input = JFactory::getApplication()->input;
if ($this->type == 'image')
{
	JHtml::_('script', 'system/jquery.Jcrop.min.js', array('version' => 'auto', 'relative' => true));
	JHtml::_('stylesheet', 'system/jquery.Jcrop.min.css', array('version' => 'auto', 'relative' => true));
}
JFactory::getDocument()->addScriptDeclaration("
jQuery(document).ready(function($){
	// Hide all the folder when the page loads
	$('.folder ul, .component-folder ul').hide();
	// Display the tree after loading
	$('.directory-tree').removeClass('directory-tree');
	// Show all the lists in the path of an open file
	$('.show > ul').show();
	// Stop the default action of anchor tag on a click event
	$('.folder-url, .component-folder-url').click(function(event){
		event.preventDefault();
	});
	// Prevent the click event from proliferating
	$('.file, .component-file-url').bind('click',function(e){
		e.stopPropagation();
	});
	// Toggle the child indented list on a click event
	$('.folder, .component-folder').bind('click',function(e){
		$(this).children('ul').toggle();
		e.stopPropagation();
	});
	// New file tree
	$('#fileModal .folder-url').bind('click',function(e){
		$('.folder-url').removeClass('selected');
		e.stopPropagation();
		$('#fileModal input.address').val($(this).attr('data-id'));
		$(this).addClass('selected');
	});
	// Folder manager tree
	$('#folderModal .folder-url').bind('click',function(e){
		$('.folder-url').removeClass('selected');
		e.stopPropagation();
		$('#folderModal input.address').val($(this).attr('data-id'));
		$(this).addClass('selected');
	});
});");
if ($this->type == 'image')
{
	JFactory::getDocument()->addScriptDeclaration("
		jQuery(document).ready(function() {
			var jcrop_api;
			// Configuration for image cropping
			$('#image-crop').Jcrop({
				onChange:   showCoords,
				onSelect:   showCoords,
				onRelease:  clearCoords,
				trueSize:   " . $this->image['width'] . "," . $this->image['height'] . "]
			},function(){
				jcrop_api = this;
			});
			// Function for calculating the crop coordinates
			function showCoords(c)
			{
				$('#x').val(c.x);
				$('#y').val(c.y);
				$('#w').val(c.w);
				$('#h').val(c.h);
			};
			// Function for clearing the coordinates
			function clearCoords()
			{
				$('#adminForm input').val('');
			};
		});");
}
JFactory::getDocument()->addStyleDeclaration('
	/* Styles for modals */
	.selected{
		background: #08c;
		color: #fff;
	}
	.selected:hover{
		background: #08c !important;
		color: #fff;
	}
	.modal-body .column {
		width: 50%; float: left;
	}
	#deleteFolder{
		margin: 0;
	}
	#image-crop{
		max-width: 100% !important;
		width: auto;
		height: auto;
	}
	.directory-tree{
		display: none;
	}
	.tree-holder{
		overflow-x: auto;
	}
');
if ($this->type == 'font')
{
	JFactory::getDocument()->addStyleDeclaration(
			"/* Styles for font preview */
		@font-face
		{
			font-family: previewFont;
			src: url('" . $this->font['address'] . "')
		}
		.font-preview{
			font-family: previewFont !important;
		}"
	);
}
?>
<div class="width-60 fltlft">

	<?php if ($this->type != 'home'): ?>
		<div  id="deleteModal" class="modal hide fade">
			<fieldset>
				<div class="modal-header">
					<button type="button" class="close" data-dismiss="modal" aria-label="<?php echo JText::_('JLIB_HTML_BEHAVIOR_CLOSE'); ?>">
						<span aria-hidden="true">&times;</span>
					</button>
					<h3><?php echo JText::_('COM_TEMPLATES_ARE_YOU_SURE');?></h3>
				</div>
				<div class="modal-body">
					<p><?php echo JText::sprintf('COM_TEMPLATES_MODAL_FILE_DELETE', $this->fileName); ?></p>
				</div>
				<div class="modal-footer">
					<form method="post" action="">
						<input type="hidden" name="option" value="com_templates" />
						<input type="hidden" name="task" value="template.delete" />
						<input type="hidden" name="id" value="<?php echo $input->getInt('id'); ?>" />
						<input type="hidden" name="file" value="<?php echo $this->file; ?>" />
						<?php echo JHtml::_('form.token'); ?>
						<button type="button" class="btn" data-dismiss="modal"><?php echo JText::_('COM_TEMPLATES_TEMPLATE_CLOSE'); ?></button>
						<button type="submit"><?php echo JText::_('COM_TEMPLATES_BUTTON_DELETE');?></button>
					</form>
				</div>
			</fieldset>
		</div>
	<?php endif; ?>
	<div  id="folderModal" class="modal hide fade">
		<fieldset>
			<legend><?php echo JText::_('COM_TEMPLATES_MANAGE_FOLDERS');?></legend>
			<div class="modal-body">
				<div class="width-50 fltlft">
					<form method="post" action="<?php echo JRoute::_('index.php?option=com_templates&task=template.createFolder&id=' . $input->getInt('id') . '&file=' . $this->file); ?>">
						<fieldset>
							<label><?php echo JText::_('COM_TEMPLATES_FOLDER_NAME');?></label>
							<input type="text" name="name" required />
							<input type="hidden" class="address" name="address" />

							<input type="submit" value="<?php echo JText::_('COM_TEMPLATES_BUTTON_CREATE');?>" class="btn btn-primary" />
						</fieldset>
					</form>
				</div>
				<div class="width-50 fltlft">
					<?php echo $this->loadTemplate('folders');?>
				</div>
			</div>
			<div class="modal-footer">
				<form id="deleteFolder" method="post" action="<?php echo JRoute::_('index.php?option=com_templates&task=template.deleteFolder&id=' . $input->getInt('id') . '&file=' . $this->file); ?>">
					<fieldset>
						<button type="button" class="btn" data-dismiss="modal"><?php echo JText::_('COM_TEMPLATES_TEMPLATE_CLOSE'); ?></button>
						<input type="hidden" class="address" name="address" />
						<input type="submit" value="<?php echo JText::_('COM_TEMPLATES_BUTTON_DELETE');?>" class="btn btn-danger" />
					</fieldset>
				</form>
			</div>
		</fieldset>
	</div>

	<div  id="fileModal" class="modal hide fade">
		<fieldset>
			<legend><?php echo JText::_('COM_TEMPLATES_BUTTON_FILE');?></legend>
			<div class="modal-body">
				<div class="width-50 fltlft">
					<form method="post" action="<?php echo JRoute::_('index.php?option=com_templates&task=template.createFile&id=' . $input->getInt('id') . '&file=' . $this->file); ?>">
						<fieldset>
							<label><?php echo JText::_('COM_TEMPLATES_NEW_FILE_TYPE');?></label>
							<select name="type" required >
								<option value="null">- <?php echo JText::_('COM_TEMPLATES_NEW_FILE_SELECT');?> -</option>
								<option value="css">css</option>
								<option value="php">php</option>
								<option value="js">js</option>
								<option value="xml">xml</option>
								<option value="ini">ini</option>
								<option value="less">less</option>
								<option value="txt">txt</option>
							</select>
							<br />
							<label><?php echo JText::_('COM_TEMPLATES_FILE_NAME');?></label>
							<input type="text" name="name" required />
							<input type="hidden" class="address" name="address" />

							<input type="submit" value="<?php echo JText::_('COM_TEMPLATES_BUTTON_CREATE');?>" class="btn btn-primary" />
						</fieldset>
					</form>
					<br />
					<form method="post" action="<?php echo JRoute::_('index.php?option=com_templates&task=template.uploadFile&id=' . $input->getInt('id') . '&file=' . $this->file); ?>"
						  enctype="multipart/form-data" >
						<fieldset>
							<input type="hidden" class="address" name="address" />
							<input type="file" name="files" required />
							<input type="submit" value="<?php echo JText::_('COM_TEMPLATES_BUTTON_UPLOAD');?>" class="btn btn-primary" /><br>
							<?php $cMax    = $this->state->get('params')->get('upload_limit'); ?>
							<?php $maxSize = JHtml::_('number.bytes', JUtility::getMaxUploadSize($cMax . 'MB')); ?>
							<?php echo JText::sprintf('JGLOBAL_MAXIMUM_UPLOAD_SIZE_LIMIT', $maxSize); ?>
						</fieldset>
					</form>
					<br />
					<?php if ($this->type != 'home'): ?>
						<form method="post" action="<?php echo JRoute::_('index.php?option=com_templates&task=template.copyFile&id=' . $input->getInt('id') . '&file=' . $this->file); ?>"
							  enctype="multipart/form-data" >
							<fieldset>
								<input type="hidden" class="address" name="address" />
								<div class="control-group">
									<label for="new_name" class="control-label hasTooltip" title="<?php echo JHtml::_('tooltipText', 'COM_TEMPLATES_FILE_NEW_NAME_DESC'); ?>"><?php echo JText::_('COM_TEMPLATES_FILE_NEW_NAME_LABEL')?></label>
									<div class="controls">
										<input type="text" id="new_name" name="new_name" required />
									</div>
								</div>
								<input type="submit" value="<?php echo JText::_('COM_TEMPLATES_BUTTON_COPY_FILE');?>" class="btn btn-primary" />
							</fieldset>
						</form>
					<?php endif; ?>
				</div>
				<div class="width-50 fltlft">
					<?php echo $this->loadTemplate('folders');?>
				</div>
			</div>
			<div class="modal-footer">
				<button type="button" class="btn" data-dismiss="modal"><?php echo JText::_('COM_TEMPLATES_TEMPLATE_CLOSE'); ?></button>
			</div>
		</fieldset>
	</div>

	<?php if ($this->type != 'home'): ?>
		<form action="<?php echo JRoute::_('index.php?option=com_templates&task=template.resizeImage&id=' . $input->getInt('id') . '&file=' . $this->file); ?>"
			  method="post" >
			<div  id="resizeModal" class="modal hide fade">
				<div class="modal-header">
					<button type="button" class="close" data-dismiss="modal" aria-label="<?php echo JText::_('JLIB_HTML_BEHAVIOR_CLOSE'); ?>">
						<span aria-hidden="true">&times;</span>
					</button>
					<h3><?php echo JText::_('COM_TEMPLATES_RESIZE_IMAGE'); ?></h3>
				</div>
				<div class="modal-body">
					<div id="template-manager-css" class="form-horizontal">
						<div class="control-group">
							<label for="height" class="control-label hasTooltip" title="<?php echo JHtml::_('tooltipText', 'COM_TEMPLATES_IMAGE_HEIGHT'); ?>"><?php echo JText::_('COM_TEMPLATES_IMAGE_HEIGHT')?></label>
							<div class="controls">
								<input class="input-xlarge" type="number" name="height" placeholder="<?php echo $this->image['height']; ?> px" required />
							</div>
							<br />
							<label for="width" class="control-label hasTooltip" title="<?php echo JHtml::_('tooltipText', 'COM_TEMPLATES_IMAGE_WIDTH'); ?>"><?php echo JText::_('COM_TEMPLATES_IMAGE_WIDTH')?></label>
							<div class="controls">
								<input class="input-xlarge" type="number" name="width" placeholder="<?php echo $this->image['width']; ?> px" required />
							</div>
						</div>
					</div>
				</div>
				<div class="modal-footer">
					<button type="button" class="btn" data-dismiss="modal"><?php echo JText::_('COM_TEMPLATES_TEMPLATE_CLOSE'); ?></button>
					<button type="submit" class="btn btn-primary"><?php echo JText::_('COM_TEMPLATES_BUTTON_RESIZE'); ?></button>
				</div>
			</div>
			<?php echo JHtml::_('form.token'); ?>
		</form>
	<?php endif; ?>

	<?php if ($this->type == 'home'): ?>
		<form action="<?php echo JRoute::_('index.php?option=com_templates&view=template&id=' . $input->getInt('id') . '&file=' . $this->file); ?>" method="post" name="adminForm" id="adminForm" class="form-horizontal">
			<input type="hidden" name="task" value="" />
			<?php echo JHtml::_('form.token'); ?>
			<div id="home-box" style="text-align: justify;">
				<h1><p><?php echo JText::_('COM_TEMPLATES_HOME_HEADING'); ?></p></h1>
				<p><?php echo JText::_('COM_TEMPLATES_HOME_TEXT'); ?></p>
				<p>
					<a href="https://docs.joomla.org/Special:MyLanguage/J3.x:How_to_use_the_Template_Manager" target="_blank">
						<?php echo JText::_('COM_TEMPLATES_HOME_BUTTON'); ?>
					</a>
				</p>
			</div>
		</form>
	<?php endif; ?>
	<?php if ($this->type == 'file'): ?>
		<form action="<?php echo JRoute::_('index.php?option=com_templates&view=template&id=' . $input->getInt('id') . '&file=' . $this->file); ?>" method="post" name="adminForm" id="adminForm" class="form-horizontal">
			<fieldset class="adminform">
				<legend><?php echo JText::_('COM_TEMPLATES_SOURCE_CODE');?></legend>
				<p class="label"><?php echo JText::_('COM_TEMPLATES_TOGGLE_FULL_SCREEN'); ?></p>
				<div class="clr"></div>
				<div class="editor-border">
					<?php echo $this->form->getInput('source'); ?>
				</div>
				<input type="hidden" name="task" value="" />
				<?php echo JHtml::_('form.token'); ?>


				<?php echo $this->form->getInput('extension_id'); ?>
				<?php echo $this->form->getInput('filename'); ?>
			</fieldset>
		</form>
	<?php endif; ?>
	<?php if ($this->type == 'image'): ?>
		<div id="image-box"><img id="image-crop" src="<?php echo $this->image['address'] . '?' . time(); ?>" /></div>
		<form action="<?php echo JRoute::_('index.php?option=com_templates&view=template&id=' . $input->getInt('id') . '&file=' . $this->file); ?>" method="post" name="adminForm" id="adminForm">
			<input type ="hidden" id="x" name="x" />
			<input type ="hidden" id="y" name="y" />
			<input type ="hidden" id="h" name="h" />
			<input type ="hidden" id="w" name="w" />
			<input type="hidden" name="task" value="" />
			<?php echo JHtml::_('form.token'); ?>
		</form>
	<?php endif; ?>
	<?php if ($this->type == 'archive'): ?>
		<legend><?php echo JText::_('COM_TEMPLATES_FILE_CONTENT_PREVIEW'); ?></legend>
		<form action="<?php echo JRoute::_('index.php?option=com_templates&view=template&id=' . $input->getInt('id') . '&file=' . $this->file); ?>" method="post" name="adminForm" id="adminForm" class="form-horizontal">
			<fieldset>
				<ul class="nav nav-list">
					<?php foreach ($this->archive as $file): ?>
						<li>
							<?php if (substr($file, -1) === DIRECTORY_SEPARATOR): ?>
								<span class="icon-folder" aria-hidden="true"></span>&nbsp;<?php echo $file; ?>
							<?php endif; ?>
							<?php if (substr($file, -1) != DIRECTORY_SEPARATOR): ?>
								<span class="icon-file" aria-hidden="true"></span>&nbsp;<?php echo $file; ?>
							<?php endif; ?>
						</li>
					<?php endforeach; ?>
				</ul>
			</fieldset>
			<input type="hidden" name="task" value="" />
			<?php echo JHtml::_('form.token'); ?>

		</form>
	<?php endif; ?>
	<?php if ($this->type == 'font'): ?>
		<div class="font-preview">
			<form action="<?php echo JRoute::_('index.php?option=com_templates&view=template&id=' . $input->getInt('id') . '&file=' . $this->file); ?>" method="post" name="adminForm" id="adminForm" class="form-horizontal">
				<fieldset class="adminform">
					<legend><?php echo JText::_('COM_TEMPLATES_SOURCE_CODE');?></legend>
					<p class="lead">H1</p><h1>Quickly gaze at Joomla! views from HTML, CSS, JavaScript and XML </h1>
					<p class="lead">H2</p><h2>Quickly gaze at Joomla! views from HTML, CSS, JavaScript and XML </h2>
					<p class="lead">H3</p><h3>Quickly gaze at Joomla! views from HTML, CSS, JavaScript and XML </h3>
					<p class="lead">H4</p><h4>Quickly gaze at Joomla! views from HTML, CSS, JavaScript and XML </h4>
					<p class="lead">H5</p><h5>Quickly gaze at Joomla! views from HTML, CSS, JavaScript and XML </h5>
					<p class="lead">H6</p> <h6>Quickly gaze at Joomla! views from HTML, CSS, JavaScript and XML </h6>
					<p class="lead">Bold</p><b>Quickly gaze at Joomla! views from HTML, CSS, JavaScript and XML </b>
					<p class="lead">Italics</p><i>Quickly gaze at Joomla! views from HTML, CSS, JavaScript and XML </i>
					<p class="lead">Unordered List</p>
					<ul>
						<li>Item</li>
						<li>Item</li>
						<li>Item<br />
							<ul>
								<li>Item</li>
								<li>Item</li>
								<li>Item<br />
									<ul>
										<li>Item</li>
										<li>Item</li>
										<li>Item</li>
									</ul>
								</li>
							</ul>
						</li>
					</ul>
					<p class="lead">Ordered List</p>
					<ol>
						<li>Item</li>
						<li>Item</li>
						<li>Item<br />
							<ul>
								<li>Item</li>
								<li>Item</li>
								<li>Item<br />
									<ul>
										<li>Item</li>
										<li>Item</li>
										<li>Item</li>
									</ul>
								</li>
							</ul>
						</li>
					</ol>
					<input type="hidden" name="task" value="" />
					<?php echo JHtml::_('form.token'); ?>
				</fieldset>
			</form>
		</div>
	<?php endif; ?>

	<fieldset class="adminform">
		<legend><?php echo JText::_('COM_TEMPLATES_TEMPLATE_DESCRIPTION');?></legend>

		<?php echo $this->loadTemplate('description');?>
	</fieldset>

	<div class="clr"></div>
</div>

<div class="width-40 fltrt">

	<?php if ($this->type != 'home'): ?>
		<fieldset class="adminform">
			<legend><?php echo JText::_('COM_TEMPLATES_FILE_INFO');?></legend>
			<?php if ($this->type == 'file'): ?>
				<p><?php echo JText::sprintf('COM_TEMPLATES_TEMPLATE_FILENAME', $this->source->filename, $this->template->element); ?></p>
			<?php endif; ?>
			<?php if ($this->type == 'image'): ?>
				<p><?php echo JText::sprintf('COM_TEMPLATES_TEMPLATE_FILENAME', $this->image['path'], $this->template->element); ?></p>
			<?php endif; ?>
			<?php if ($this->type == 'font'): ?>
				<p><?php echo JText::sprintf('COM_TEMPLATES_TEMPLATE_FILENAME', $this->font['rel_path'], $this->template->element); ?></p>
			<?php endif; ?>
		</fieldset>
	<?php endif; ?>

	<fieldset class="adminform">
		<legend><?php echo JText::_('COM_TEMPLATES_TEMPLATE_FILES');?></legend>

		<?php echo $this->loadTemplate('tree');?>
	</fieldset>

	<?php echo JHtml::_('sliders.start', 'content-sliders', array('useCookie' => 1)); ?>
	<?php echo JHtml::_('sliders.panel', JText::_('COM_TEMPLATES_TEMPLATE_COPY'), 'template-copy'); ?>
	<form action="<?php echo JRoute::_('index.php?option=com_templates&task=template.copy&id=' . $input->getInt('id') . '&file=' . $this->file); ?>"
		  method="post" name="adminForm" id="adminForm">
		<fieldset class="panelform">
			<label id="new_name" class="hasTooltip" title="<?php echo JHtml::_('tooltipText', 'COM_TEMPLATES_TEMPLATE_NEW_NAME_DESC'); ?>"><?php echo JText::_('COM_TEMPLATES_TEMPLATE_NEW_NAME_LABEL')?></label>
			<input type="text" id="new_name" name="new_name"  />
			<button type="submit"><?php echo JText::_('COM_TEMPLATES_TEMPLATE_COPY'); ?></button>
		</fieldset>
		<?php echo JHtml::_('form.token'); ?>
	</form>
	<?php if ($this->type != 'home'): ?>
		<?php  echo JHtml::_('sliders.panel', JText::_('COM_TEMPLATES_BUTTON_RENAME'), 'file-rename'); ?>
		<form action="<?php echo JRoute::_('index.php?option=com_templates&task=template.renameFile&id=' . $input->getInt('id') . '&file=' . $this->file); ?>"
			  method="post" name="adminForm" id="adminForm">
			<fieldset class="panelform">
				<label id="new_name" class="hasTooltip" title="<?php echo JHtml::_('tooltipText', JText::_('COM_TEMPLATES_NEW_FILE_NAME')); ?>"><?php echo JText::_('COM_TEMPLATES_NEW_FILE_NAME')?></label>
				<input type="text" name="new_name"  />
				<button type="submit"><?php echo JText::_('COM_TEMPLATES_BUTTON_RENAME'); ?></button>
			</fieldset>
			<?php echo JHtml::_('form.token'); ?>
		</form>
	<?php endif; ?>
	<?php  echo JHtml::_('sliders.panel', JText::_('COM_TEMPLATES_OVERRIDES_MODULES'), 'override-module'); ?>
	<fieldset class="panelform">
		<ul class="adminformlist">
			<?php foreach ($this->overridesList['modules'] as $module): ?>
				<li>
					<a href="<?php echo JRoute::_('index.php?option=com_templates&view=template&task=template.overrides&folder=' . $module->path . '&id=' . $input->getInt('id') . '&file=' . $this->file); ?>">
						<span class="icon-copy"></span>&nbsp;<?php echo $module->name; ?>
					</a>
				</li>
			<?php endforeach; ?>
		</ul>
	</fieldset>
	<?php  echo JHtml::_('sliders.panel', JText::_('COM_TEMPLATES_OVERRIDES_COMPONENTS'), 'override-component'); ?>
	<fieldset class="panelform">
		<ul class="adminformlist">
			<?php foreach ($this->overridesList['components'] as $key => $value): ?>
				<li class="component-folder">
					<a href="#" class="component-folder-url">
						<span class="icon-folder"></span>&nbsp;<?php echo $key; ?>
					</a>
					<ul class="adminformList">
						<?php foreach ($value as $view): ?>
							<li>
								<a class="component-file-url" href="<?php echo JRoute::_('index.php?option=com_templates&view=template&task=template.overrides&folder=' . $view->path . '&id=' . $input->getInt('id') . '&file=' . $this->file); ?>">
									<span class="icon-copy"></span>&nbsp;<?php echo $view->name; ?>
								</a>
							</li>
						<?php endforeach; ?>
					</ul>
				</li>
			<?php endforeach; ?>
		</ul>
	</fieldset>
	<?php  echo JHtml::_('sliders.panel', JText::_('COM_TEMPLATES_OVERRIDES_LAYOUTS'), 'override-layout'); ?>
	<fieldset class="panelform">
		<ul class="adminformlist">
			<?php foreach ($this->overridesList['layouts'] as $layout): ?>
				<li>
					<a href="<?php echo JRoute::_('index.php?option=com_templates&view=template&task=template.overrides&folder=' . $layout->path . '&id=' . $input->getInt('id') . '&file=' . $this->file); ?>">
						<span class="icon-copy"></span>&nbsp;<?php echo $layout->name; ?>
					</a>
				</li>
			<?php endforeach; ?>
		</ul>
	</fieldset>
	<?php echo JHtml::_('sliders.end'); ?>
</div>
templates/hathor/html/com_templates/template/default_tree.php000060400000003007152453623430020621 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
ksort($this->files, SORT_STRING);
?>

<ul class='nav nav-list directory-tree'>
	<?php foreach ($this->files as $key => $value): ?>
		<?php if (is_array($value)): ?>
			<?php
			$keyArray  = explode('/', $key);
			$fileArray = explode('/', $this->fileName);
			$count     = 0;

			$keyArrayCount = count($keyArray);

			if (count($fileArray) >= $keyArrayCount)
			{
				for ($i = 0; $i < $keyArrayCount; $i++)
				{
					if ($keyArray[$i] === $fileArray[$i])
					{
						$count++;
					}
				}

				if ($count === $keyArrayCount)
				{
					$class = 'folder show';
				}
				else
				{
					$class = 'folder';
				}
			}
			else
			{
				$class = 'folder';
			}

			?>
			<li class="<?php echo $class; ?>">
				<a class='folder-url nowrap' href=''>
					<span class='icon-folder-close'>&nbsp;<?php $explodeArray = explode('/', $key); echo end($explodeArray); ?></span>
				</a>
				<?php echo $this->directoryTree($value); ?>
			</li>
		<?php endif; ?>
		<?php if (is_object($value)): ?>
			<li>
				<a class="file nowrap" href='<?php echo JRoute::_('index.php?option=com_templates&view=template&id=' . $this->id . '&file=' . $value->id) ?>'>
					<span class='icon-file'>&nbsp;<?php echo $value->name; ?></span>
				</a>
			</li>
		<?php endif; ?>
	<?php endforeach; ?>
</ul>
templates/hathor/html/com_templates/template/default_description.php000060400000001502152453623430022203 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>

<div class="pull-left">
	<?php echo JHtml::_('templates.thumb', $this->template->element, $this->template->client_id); ?>
	<?php echo JHtml::_('templates.thumbModal', $this->template->element, $this->template->client_id); ?>
</div>
<h2><?php echo ucfirst($this->template->element); ?></h2>
<?php $client = JApplicationHelper::getClientInfo($this->template->client_id); ?>
<p><?php $this->template->xmldata = TemplatesHelper::parseXMLTemplateFile($client->path, $this->template->element);?></p>
<p><?php  echo JText::_($this->template->xmldata->description); ?></p>templates/hathor/html/com_templates/template/default_folders.php000060400000001411152453623430021315 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
ksort($this->files, SORT_STRING);
?>

<ul class='nav nav-list directory-tree'>
	<?php foreach ($this->files as $key => $value): ?>
		<?php if (is_array($value)): ?>
			<li class="folder-select">
				<a class='folder-url nowrap' data-id='<?php echo base64_encode($key); ?>' href=''>
					<span class='icon-folder-close'>&nbsp;<?php $explodeArray = explode('/', $key); echo end($explodeArray); ?></span>
				</a>
				<?php echo $this->folderTree($value); ?>
			</li>
		<?php endif; ?>
	<?php endforeach; ?>
</ul>
templates/hathor/html/com_templates/styles/default.php000060400000017123152453623430017316 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('script', 'system/multiselect.js', array('version' => 'auto', 'relative' => true));

$user      = JFactory::getUser();
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>

<form action="<?php echo JRoute::_('index.php?option=com_templates&view=styles'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_TEMPLATES_STYLES_FILTER_SEARCH_DESC'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>

		<div class="filter-select">
			<label class="selectlabel" for="client_id"><?php echo JText::_('JGLOBAL_FILTER_CLIENT'); ?></label>
			<select name="client_id" id="client_id">
				<?php echo JHtml::_('select.options', TemplatesHelper::getClientOptions(), 'value', 'text', $this->state->get('client_id'));?>
			</select>

			<label class="selectlabel" for="filter_template"><?php echo JText::_('COM_TEMPLATES_FILTER_TEMPLATE'); ?></label>
			<select name="filter_template" id="filter_template">
				<option value="0"><?php echo JText::_('COM_TEMPLATES_FILTER_TEMPLATE'); ?></option>
				<?php echo JHtml::_('select.options', TemplatesHelper::getTemplateOptions($this->state->get('client_id')), 'value', 'text', $this->state->get('filter.template'));?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>
	<div class="clr"> </div>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					&#160;
				</th>
				<th>
					<?php echo JHtml::_('grid.sort', 'COM_TEMPLATES_HEADING_STYLE', 'a.title', $listDirn, $listOrder); ?>
				</th>
				<th class="width-10">
					<?php echo JHtml::_('grid.sort', 'JCLIENT', 'a.client_id', $listDirn, $listOrder); ?>
				</th>
				<th>
					<?php echo JHtml::_('grid.sort', 'COM_TEMPLATES_HEADING_TEMPLATE', 'a.template', $listDirn, $listOrder); ?>
				</th>
				<th class="width-5">
					<?php echo JHtml::_('grid.sort', 'COM_TEMPLATES_HEADING_DEFAULT', 'a.home', $listDirn, $listOrder); ?>
				</th>
				<th class="width-5">
					<?php echo JText::_('COM_TEMPLATES_HEADING_ASSIGNED'); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
			<?php foreach ($this->items as $i => $item) :
				$canCreate = $user->authorise('core.create',     'com_templates');
				$canEdit   = $user->authorise('core.edit',       'com_templates');
				$canChange = $user->authorise('core.edit.state', 'com_templates');
			?>
			<tr class="row<?php echo $i % 2; ?>">
				<td class="center">
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				</td>
				<td>
					<?php if ($this->preview && $item->client_id == '0') : ?>
						<a target="_blank" href="<?php echo JUri::root().'index.php?tp=1&templateStyle='.(int) $item->id ?>" class="jgrid hasTooltip" title="<?php echo JHtml::_('tooltipText', JText::_('COM_TEMPLATES_TEMPLATE_PREVIEW'), $item->title, 0); ?>" ><span class="state icon-16-preview"><span class="text"><?php echo JText::_('COM_TEMPLATES_TEMPLATE_PREVIEW'); ?></span></span></a>
					<?php elseif ($item->client_id == '1') : ?>
						<span class="jgrid hasTooltip" title="<?php echo JHtml::_('tooltipText', 'COM_TEMPLATES_TEMPLATE_NO_PREVIEW_ADMIN'); ?>"><span class="state icon-16-nopreview"><span class="text"><?php echo JText::_('COM_TEMPLATES_TEMPLATE_NO_PREVIEW_ADMIN'); ?></span></span></span>
					<?php else: ?>
						<span class="jgrid hasTooltip" title="<?php echo JHtml::_('tooltipText', 'COM_TEMPLATES_TEMPLATE_NO_PREVIEW'); ?>"><span class="state icon-16-nopreview"><span class="text"><?php echo JText::_('COM_TEMPLATES_TEMPLATE_NO_PREVIEW'); ?></span></span></span>
					<?php endif; ?>
					<?php if ($canEdit) : ?>
					<a href="<?php echo JRoute::_('index.php?option=com_templates&task=style.edit&id='.(int) $item->id); ?>">
						<?php echo $this->escape($item->title);?></a>
					<?php else : ?>
						<?php echo $this->escape($item->title);?>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo $item->client_id == 0 ? JText::_('JSITE') : JText::_('JADMINISTRATOR'); ?>
				</td>
				<td>
					<label for="cb<?php echo $i;?>">
						<?php echo $this->escape($item->template);?>
					</label>
				</td>
				<td class="center">
					<?php if ($item->home == '0' || $item->home == '1'):?>
						<?php echo JHtml::_('jgrid.isdefault', $item->home != '0', $i, 'styles.', $canChange && $item->home != '1');?>
					<?php elseif ($canChange):?>
						<a href="<?php echo JRoute::_('index.php?option=com_templates&task=styles.unsetDefault&cid[]='.$item->id.'&'.JSession::getFormToken().'=1');?>">
							<?php if ($item->image) : ?>
								<?php echo JHtml::_('image', 'mod_languages/' . $item->image . '.gif', $item->language_title, array('title' => JText::sprintf('COM_TEMPLATES_GRID_UNSET_LANGUAGE', $item->language_title)), true);?>
							<?php else : ?>
								<span class="label" title="<?php echo JText::sprintf('COM_TEMPLATES_GRID_UNSET_LANGUAGE', $item->language_title); ?>"><?php echo $item->language_sef; ?></span>
							<?php endif; ?>
						</a>
					<?php else:?>
						<?php echo JHtml::_('image', 'mod_languages/' . $item->image . '.gif', $item->language_title, array('title' => $item->language_title), true); ?>
						<?php if ($item->image) : ?>
							<?php echo JHtml::_('image', 'mod_languages/' . $item->image . '.gif', $item->language_title, array('title' => $item->language_title), true); ?>
						<?php else : ?>
							<span class="label" title="<?php echo $item->language_title; ?>"><?php echo $item->language_sef; ?></span>
						<?php endif; ?>
					<?php endif;?>
				</td>
				<td class="center">
					<?php if ($item->assigned > 0) : ?>
						<?php echo JHtml::_('image', 'admin/tick.png', JText::plural('COM_TEMPLATES_ASSIGNED', $item->assigned), array('title' => JText::plural('COM_TEMPLATES_ASSIGNED', $item->assigned)), true); ?>
					<?php else : ?>
						&#160;
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo (int) $item->id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/com_templates/templates/default.php000060400000012242152453623430017766 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');

$user      = JFactory::getUser();
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>

<form action="<?php echo JRoute::_('index.php?option=com_templates&view=templates'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_TEMPLATES_TEMPLATES_FILTER_SEARCH_DESC'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>
		<div class="filter-select">
			<label class="selectlabel" for="client_id">
				<?php echo JText::_('JGLOBAL_FILTER_CLIENT'); ?>
			</label>
			<select name="client_id" id="client_id">
				<?php echo JHtml::_('select.options', TemplatesHelper::getClientOptions(), 'value', 'text', $this->state->get('client_id'));?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>
	<div class="clr"> </div>

	<table class="adminlist" id="template-mgr">
		<thead>
			<tr>
				<th class="checkmark-col">
					&#160;
				</th>
				<th>
					<?php echo JHtml::_('grid.sort', 'COM_TEMPLATES_HEADING_TEMPLATE', 'a.element', $listDirn, $listOrder); ?>
				</th>
				<th class="width-10">
					<?php echo JHtml::_('grid.sort', 'JCLIENT', 'a.client_id', $listDirn, $listOrder); ?>
				</th>
				<th class="center width-10">
					<?php echo JText::_('JVERSION'); ?>
				</th>
				<th class="width-15">
					<?php echo JText::_('JDATE'); ?>
				</th>
				<th class="width-25">
					<?php echo JText::_('JAUTHOR'); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) : ?>
			<tr class="row<?php echo $i % 2; ?>">
				<td class="center">
					<?php echo JHtml::_('templates.thumb', $item->element, $item->client_id); ?>
				</td>
				<td class="template-name">
					<a href="<?php echo JRoute::_('index.php?option=com_templates&view=template&id='.(int) $item->extension_id . '&file=' . $this->file); ?>">
						<?php echo JText::sprintf('COM_TEMPLATES_TEMPLATE_DETAILS', $item->name); ?></a>
					<p>
					<?php if ($this->preview && $item->client_id == '0') : ?>
						<a href="<?php echo JUri::root().'index.php?tp=1&template='.$item->element; ?>" target="_blank">
							<?php echo JText::_('COM_TEMPLATES_TEMPLATE_PREVIEW'); ?></a>
					<?php elseif ($item->client_id == '1') : ?>
						<?php echo JText::_('COM_TEMPLATES_TEMPLATE_NO_PREVIEW_ADMIN'); ?>
					<?php else: ?>
						<span class="hasTooltip" title="<?php echo JHtml::_('tooltipText', 'COM_TEMPLATES_TEMPLATE_NO_PREVIEW', 'COM_TEMPLATES_TEMPLATE_NO_PREVIEW_DESC'); ?>">
							<?php echo JText::_('COM_TEMPLATES_TEMPLATE_NO_PREVIEW'); ?></span>
					<?php endif; ?>
					</p>
				</td>
				<td class="center">
					<?php echo $item->client_id == 0 ? JText::_('JSITE') : JText::_('JADMINISTRATOR'); ?>
				</td>
				<td class="center">
					<?php echo $this->escape($item->xmldata->get('version')); ?>
				</td>
				<td class="center">
					<?php echo $this->escape($item->xmldata->get('creationDate')); ?>
				</td>
				<td>
					<?php if ($author = $item->xmldata->get('author')) : ?>
						<p><?php echo $this->escape($author); ?></p>
					<?php else : ?>
						&mdash;
					<?php endif; ?>
					<?php if ($email = $item->xmldata->get('authorEmail')) : ?>
						<p><?php echo $this->escape($email); ?></p>
					<?php endif; ?>
					<?php if ($url = $item->xmldata->get('authorUrl')) : ?>
						<p><a href="<?php echo $this->escape($url); ?>">
							<?php echo $this->escape($url); ?></a></p>
					<?php endif; ?>
				</td>
				<?php echo JHtml::_('templates.thumbModal', $item->element, $item->client_id); ?>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/com_templates/style/edit.php000060400000005675152453623430016445 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');
$user = JFactory::getUser();

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(task)
	{
		if (task == 'style.cancel' || document.formvalidator.isValid(document.getElementById('style-form')))
		{
			Joomla.submitform(task, document.getElementById('style-form'));
		}
	}
");
?>

<form action="<?php echo JRoute::_('index.php?option=com_templates&layout=edit&id='.(int) $this->item->id); ?>" method="post" name="adminForm" id="style-form" class="form-validate">
	<div class="width-60 fltlft">
		<fieldset class="adminform">
			<legend><?php echo JText::_('JDETAILS');?></legend>
			<ul class="adminformlist">
			<li><?php echo $this->form->getLabel('title'); ?>
			<?php echo $this->form->getInput('title'); ?></li>

			<li><?php echo $this->form->getLabel('template'); ?>
			<?php echo $this->form->getInput('template'); ?>
			<?php echo $this->form->getLabel('client_id'); ?>
			<?php echo $this->form->getInput('client_id'); ?>
			<input type="text" size="35" value="<?php echo $this->item->client_id == 0 ? JText::_('JSITE') : JText::_('JADMINISTRATOR'); ?>	" class="readonly" readonly="readonly" /></li>

			<li><?php echo $this->form->getLabel('home'); ?>
			<?php echo $this->form->getInput('home'); ?></li>

			<?php if ($this->item->id) : ?>
				<li><?php echo $this->form->getLabel('id'); ?>
				<span class="readonly"><?php echo $this->item->id; ?></span></li>
			<?php endif; ?>
			</ul>
			<div class="clr"></div>
			<?php if ($this->item->xml) : ?>
				<?php if ($text = trim($this->item->xml->description)) : ?>
					<label>
						<?php echo JText::_('COM_TEMPLATES_TEMPLATE_DESCRIPTION'); ?>
					</label>
					<span class="readonly mod-desc"><?php echo JText::_($text); ?></span>
				<?php endif; ?>
			<?php else : ?>
				<p class="error"><?php echo JText::_('COM_TEMPLATES_ERR_XML'); ?></p>
			<?php endif; ?>
			<div class="clr"></div>
		</fieldset>
		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</div>

	<div class="width-40 fltrt">
	<?php echo JHtml::_('sliders.start', 'template-sliders-'.$this->item->id); ?>

		<?php //get the menu parameters that are automatically set but may be modified.
			echo $this->loadTemplate('options'); ?>

		<div class="clr"></div>

	<?php echo JHtml::_('sliders.end'); ?>
	</div>
	<?php if ($user->authorise('core.edit', 'com_menu') && $this->item->client_id == 0):?>
		<?php if ($this->canDo->get('core.edit.state')) : ?>
			<div class="width-60 fltlft">
			<?php echo $this->loadTemplate('assignment'); ?>
			</div>
			<?php endif; ?>
		<?php endif;?>

	<div class="clr"></div>
</form>
templates/hathor/html/com_templates/style/edit_options.php000060400000002025152453623430020202 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

	$fieldSets = $this->form->getFieldsets('params');

	foreach ($fieldSets as $name => $fieldSet) :
		$label = !empty($fieldSet->label) ? $fieldSet->label : 'COM_TEMPLATES_'.$name.'_FIELDSET_LABEL';
		echo JHtml::_('sliders.panel', JText::_($label), $name.'-options');
			if (isset($fieldSet->description) && trim($fieldSet->description)) :
				echo '<p class="tip">'.$this->escape(JText::_($fieldSet->description)).'</p>';
			endif;
			?>
		<fieldset class="panelform">
			<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset($name) as $field) : ?>
				<li>
				<?php if (!$field->hidden) : ?>
					<?php echo $field->label; ?>
				<?php endif; ?>
					<?php echo $field->input; ?>
				</li>
			<?php endforeach; ?>
			</ul>
		</fieldset>
	<?php endforeach;  ?>
templates/hathor/html/com_templates/style/edit_assignment.php000060400000003710152453623430020661 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Initialise related data.
JLoader::register('MenusHelper', JPATH_ADMINISTRATOR . '/components/com_menus/helpers/menus.php');
$menuTypes = MenusHelper::getMenuLinks();
$user = JFactory::getUser();

?>
<fieldset class="adminform">
	<legend><?php echo JText::_('COM_TEMPLATES_MENUS_ASSIGNMENT'); ?></legend>
		<label id="jform_menuselect-lbl" for="jform_menuselect"><?php echo JText::_('JGLOBAL_MENU_SELECTION'); ?></label>

		<button type="button" class="jform-rightbtn" onclick="$$('.chk-menulink').each(function(el) { el.checked = !el.checked; });">
			<?php echo JText::_('JGLOBAL_SELECTION_INVERT_ALL'); ?>
		</button>
		<div class="clr"></div>
		<div id="menu-assignment">

		<?php foreach ($menuTypes as &$type) : ?>
			<ul class="menu-links">
				<button type="button" class="jform-rightbtn" onclick="$$('.<?php echo $type->menutype; ?>').each(function(el) { el.checked = !el.checked; });">
					<?php echo JText::_('JGLOBAL_SELECTION_INVERT'); ?>
				</button>
				<div class="clr"></div>
				<h3><?php echo $type->title ?: $type->menutype; ?></h3>

				<?php foreach ($type->links as $link) : ?>
					<li class="menu-link">
						<input type="checkbox" name="jform[assigned][]" value="<?php echo (int) $link->value;?>" id="link<?php echo (int) $link->value;?>"<?php if ($link->template_style_id == $this->item->id):?> checked="checked"<?php endif;?><?php if ($link->checked_out && $link->checked_out != $user->id):?> disabled="disabled"<?php else:?> class="chk-menulink <?php echo $type->menutype; ?>"<?php endif;?> />
						<label for="link<?php echo (int) $link->value;?>" >
							<?php echo $link->text; ?>
						</label>
					</li>
				<?php endforeach; ?>
			</ul>
		<?php endforeach; ?>

		</div>
</fieldset>
templates/hathor/html/com_postinstall/messages/default.php000060400000006174152453623430020164 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_postinstall
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$renderer       = JFactory::getDocument()->loadRenderer('module');
$options        = array('style' => 'raw');
$mod            = JModuleHelper::getModule('mod_feed');
$param          = array(
	'rssurl'          => 'https://www.joomla.org/announcements/release-news.feed?type=rss',
	'rsstitle'        => 0,
	'rssdesc'         => 0,
	'rssimage'        => 1,
	'rssitems'        => 5,
	'rssitemdesc'     => 1,
	'word_count'      => 200,
	'cache'           => 0,
	'moduleclass_sfx' => ' list-striped'
);
$params         = array('params' => json_encode($param));
?>

<?php if (empty($this->items)): ?>
<h2><?php echo JText::_('COM_POSTINSTALL_LBL_NOMESSAGES_TITLE') ?></h2>
<p><?php echo JText::_('COM_POSTINSTALL_LBL_NOMESSAGES_DESC') ?></p>
<div>
	<button onclick="window.location='index.php?option=com_postinstall&view=messages&task=reset&eid=<?php echo $this->eid; ?>&<?php echo $this->token ?>=1'; return false;" class="btn btn-warning">
		<span class="icon icon-eye-open"></span>
		<?php echo JText::_('COM_POSTINSTALL_BTN_RESET') ?>
	</button>
</div>
<?php if ($this->eid == 700): ?>
	<br/>
	<div>
		<h3><?php echo JText::_('COM_POSTINSTALL_LBL_RELEASENEWS'); ?></h3>
		<?php echo $renderer->render($mod, $params, $options); ?>
	</div>
<?php endif; ?>
<?php else: ?>
<?php
	if ($this->eid == 700):
		echo JHtml::_('sliders.start', 'panel-sliders', array('useCookie' => '1'));
		echo JHtml::_('sliders.panel', JText::_('COM_POSTINSTALL_LBL_MESSAGES'), 'postinstall-panel-messages');
	else:
?>
	<h2><?php echo JText::_('COM_POSTINSTALL_LBL_MESSAGES') ?></h2>
<?php endif; ?>
	<?php foreach ($this->items as $item): ?>
	<fieldset>
		<legend><?php echo JText::_($item->title_key) ?></legend>
		<p class="small">
			<?php echo JText::sprintf('COM_POSTINSTALL_LBL_SINCEVERSION', $item->version_introduced) ?>
		</p>
		<p><?php echo JText::_($item->description_key) ?></p>

		<div>
			<?php if ($item->type !== 'message'): ?>
			<button onclick="window.location='index.php?option=com_postinstall&view=messages&task=action&id=<?php echo $item->postinstall_message_id ?>&<?php echo $this->token ?>=1'; return false;" class="btn btn-primary">
				<?php echo JText::_($item->action_key) ?>
			</button>
			<?php endif; ?>
			<?php if (JFactory::getUser()->authorise('core.edit.state', 'com_postinstall')) : ?>
			<button onclick="window.location='index.php?option=com_postinstall&view=message&task=unpublish&id=<?php echo $item->postinstall_message_id ?>&<?php echo $this->token ?>=1'; return false;" class="btn btn-inverse btn-small">
				<?php echo JText::_('COM_POSTINSTALL_BTN_HIDE') ?>
			</button>
			<?php endif; ?>
		</div>
	</fieldset>
	<?php endforeach; ?>
<?php
	if ($this->eid == 700):
		echo JHtml::_('sliders.panel', JText::_('COM_POSTINSTALL_LBL_RELEASENEWS'), 'postinstall-panel-releasenotes');
?>
		<?php echo $renderer->render($mod, $params, $options); ?>
<?php
	echo JHtml::_('sliders.end');
	endif;
?>
<?php endif; ?>
templates/hathor/html/com_config/application/default_metadata.php000060400000001176152453623430021406 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div class="width-100">
	<fieldset class="adminform long">
		<legend><?php echo JText::_('COM_CONFIG_METADATA_SETTINGS'); ?></legend>
		<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset('metadata') as $field): ?>
				<li>
					<?php echo $field->label; ?>
					<?php echo $field->input; ?>
				</li>
			<?php endforeach; ?>
		</ul>
	</fieldset>
</div>
templates/hathor/html/com_config/application/default_navigation.php000060400000001646152453623430021767 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div id="submenu-box">
	<ul id="submenu" class="configuration">
		<li><a href="#" onclick="return false;" id="site" class="active"><?php echo JText::_('JSITE'); ?></a></li>
		<li><a href="#" onclick="return false;" id="system"><?php echo JText::_('COM_CONFIG_SYSTEM'); ?></a></li>
		<li><a href="#" onclick="return false;" id="server"><?php echo JText::_('COM_CONFIG_SERVER'); ?></a></li>
		<li><a href="#" onclick="return false;" id="permissions"><?php echo JText::_('COM_CONFIG_PERMISSIONS'); ?></a>
		</li>
		<li><a href="#" onclick="return false;" id="filters"><?php echo JText::_('COM_CONFIG_TEXT_FILTERS') ?></a></li>
	</ul>
	<div class="clr"></div>
</div>
templates/hathor/html/com_config/application/default_seo.php000060400000001164152453623430020411 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div class="width-100">
	<fieldset class="adminform long">
		<legend><?php echo JText::_('COM_CONFIG_SEO_SETTINGS'); ?></legend>
		<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset('seo') as $field): ?>
				<li>
					<?php echo $field->label; ?>
					<?php echo $field->input; ?>
				</li>
			<?php endforeach; ?>
		</ul>
	</fieldset>
</div>
templates/hathor/html/com_config/application/default_permissions.php000060400000001134152453623430022173 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div class="width-100">
	<fieldset class="adminform">
		<legend><?php echo JText::_('COM_CONFIG_PERMISSION_SETTINGS'); ?></legend>
		<?php foreach ($this->form->getFieldset('permissions') as $field) : ?>
			<?php echo $field->label; ?>
			<div class="clr"></div>
			<?php echo $field->input; ?>
		<?php endforeach; ?>
	</fieldset>
</div>
templates/hathor/html/com_config/application/default_site.php000060400000001161152453623430020564 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div class="width-100">
	<fieldset class="adminform">
		<legend><?php echo JText::_('COM_CONFIG_SITE_SETTINGS'); ?></legend>
		<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset('site') as $field): ?>
				<li>
					<?php echo $field->label; ?>
					<?php echo $field->input; ?>
				</li>
			<?php endforeach; ?>
		</ul>
	</fieldset>
</div>
templates/hathor/html/com_config/application/default_database.php000060400000001171152453623430021365 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div class="width-100">
	<fieldset class="adminform">
		<legend><?php echo JText::_('COM_CONFIG_DATABASE_SETTINGS'); ?></legend>
		<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset('database') as $field): ?>
				<li>
					<?php echo $field->label; ?>
					<?php echo $field->input; ?>
				</li>
			<?php endforeach; ?>
		</ul>
	</fieldset>
</div>
templates/hathor/html/com_config/application/default_debug.php000060400000001163152453623430020710 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div class="width-100">
	<fieldset class="adminform">
		<legend><?php echo JText::_('COM_CONFIG_DEBUG_SETTINGS'); ?></legend>
		<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset('debug') as $field): ?>
				<li>
					<?php echo $field->label; ?>
					<?php echo $field->input; ?>
				</li>
			<?php endforeach; ?>
		</ul>
	</fieldset>
</div>
templates/hathor/html/com_config/application/default_mail.php000060400000002102152453623430020536 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('jquery.token');
JHtml::_('script', 'system/sendtestmail.js', array('version' => 'auto', 'relative' => true));

JFactory::getDocument()->addScriptDeclaration('
	var sendtestmail_url = "' . addslashes(JUri::base()) . 'index.php?option=com_config&task=config.sendtestmail.application&format=json";
 ');
?>
<div class="width-100">
	<fieldset class="adminform">
		<legend><?php echo JText::_('COM_CONFIG_MAIL_SETTINGS'); ?></legend>
		<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset('mail') as $field): ?>
				<li>
					<?php echo $field->label; ?>
					<?php echo $field->input; ?>
				</li>
			<?php endforeach; ?>
		</ul>
		<button type="button" class="btn btn-small" id="sendtestmail">
			<span><?php echo JText::_('COM_CONFIG_SENDMAIL_ACTION_BUTTON'); ?></span>
		</button>
	</fieldset>
</div>
templates/hathor/html/com_config/application/default_system.php000060400000001165152453623430021150 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div class="width-100">
	<fieldset class="adminform">
		<legend><?php echo JText::_('COM_CONFIG_SYSTEM_SETTINGS'); ?></legend>
		<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset('system') as $field): ?>
				<li>
					<?php echo $field->label; ?>
					<?php echo $field->input; ?>
				</li>
			<?php endforeach; ?>
		</ul>
	</fieldset>
</div>
templates/hathor/html/com_config/application/default_locale.php000060400000001167152453623430021065 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div class="width-100">
	<fieldset class="adminform">
		<legend><?php echo JText::_('COM_CONFIG_LOCATION_SETTINGS'); ?></legend>
		<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset('locale') as $field): ?>
				<li>
					<?php echo $field->label; ?>
					<?php echo $field->input; ?>
				</li>
			<?php endforeach; ?>
		</ul>
	</fieldset>
</div>
templates/hathor/html/com_config/application/default_server.php000060400000001165152453623430021132 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div class="width-100">
	<fieldset class="adminform">
		<legend><?php echo JText::_('COM_CONFIG_SERVER_SETTINGS'); ?></legend>
		<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset('server') as $field): ?>
				<li>
					<?php echo $field->label; ?>
					<?php echo $field->input; ?>
				</li>
			<?php endforeach; ?>
		</ul>
	</fieldset>
</div>
templates/hathor/html/com_config/application/default.php000060400000005063152453623430017545 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.switcher');

// Load submenu template, using element id 'submenu' as needed by behavior.switcher
$this->document->setBuffer($this->loadTemplate('navigation'), 'modules', 'submenu');

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(task)
	{
		if (task == 'application.cancel' || document.formvalidator.isValid(document.getElementById('application-form'))) {
			Joomla.submitform(task, document.getElementById('application-form'));
		}
	}
");
?>

<form action="<?php echo JRoute::_('index.php?option=com_config'); ?>" id="application-form" method="post" name="adminForm" class="form-validate">
	<?php if ($this->ftp) : ?>
		<?php echo $this->loadTemplate('ftplogin'); ?>
	<?php endif; ?>
	<div id="config-document">
		<div id="page-site" class="tab">
			<div class="noshow">
				<div class="width-60 fltlft">
					<?php echo $this->loadTemplate('site'); ?>
					<?php echo $this->loadTemplate('metadata'); ?>
				</div>
				<div class="width-40 fltrt">
					<?php echo $this->loadTemplate('seo'); ?>
					<?php echo $this->loadTemplate('cookie'); ?>
				</div>
			</div>
		</div>
		<div id="page-system" class="tab">
			<div class="noshow">
				<div class="width-60 fltlft">
					<?php echo $this->loadTemplate('system'); ?>
				</div>
				<div class="width-40 fltrt">
					<?php echo $this->loadTemplate('debug'); ?>
					<?php echo $this->loadTemplate('cache'); ?>
					<?php echo $this->loadTemplate('session'); ?>
				</div>
			</div>
		</div>
		<div id="page-server" class="tab">
			<div class="noshow">
				<div class="width-60 fltlft">
					<?php echo $this->loadTemplate('server'); ?>
					<?php echo $this->loadTemplate('locale'); ?>
					<?php echo $this->loadTemplate('ftp'); ?>
				</div>
				<div class="width-40 fltrt">
					<?php echo $this->loadTemplate('database'); ?>
					<?php echo $this->loadTemplate('mail'); ?>
				</div>
			</div>
		</div>
		<div id="page-permissions" class="tab">
			<div class="noshow">
				<?php echo $this->loadTemplate('permissions'); ?>
			</div>
		</div>
		<div id="page-filters" class="tab">
			<div class="noshow">
				<?php echo $this->loadTemplate('filters'); ?>
			</div>
		</div>
		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
	<div class="clr"></div>
</form>
templates/hathor/html/com_config/application/default_ftp.php000060400000001157152453623430020416 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div class="width-100">
	<fieldset class="adminform">
		<legend><?php echo JText::_('COM_CONFIG_FTP_SETTINGS'); ?></legend>
		<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset('ftp') as $field): ?>
				<li>
					<?php echo $field->label; ?>
					<?php echo $field->input; ?>
				</li>
			<?php endforeach; ?>
		</ul>
	</fieldset>
</div>
templates/hathor/html/com_config/application/default_cookie.php000060400000001167152453623430021077 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>

<div class="width-100">

	<fieldset class="adminform">
		<legend><?php echo JText::_('COM_CONFIG_COOKIE_SETTINGS'); ?></legend>
		<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset('cookie') as $field): ?>
				<li>
					<?php echo $field->label; ?>
					<?php echo $field->input; ?>
				</li>
			<?php endforeach; ?>
		</ul>
	</fieldset>
</div>
templates/hathor/html/com_config/application/default_ftplogin.php000060400000002050152453623430021440 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div class="width-100">
	<fieldset title="<?php echo JText::_('COM_CONFIG_FTP_DETAILS'); ?>" class="adminform">
		<legend><?php echo JText::_('COM_CONFIG_FTP_DETAILS'); ?></legend>
		<?php echo JText::_('COM_CONFIG_FTP_DETAILS_TIP'); ?>

		<?php if ($this->ftp instanceof Exception) : ?>
			<p><?php echo JText::_($this->ftp->message); ?></p>
		<?php endif; ?>
		<ul class="adminformlist">
			<li>
				<label for="username"><?php echo JText::_('JGLOBAL_USERNAME'); ?></label>
				<input type="text" id="username" name="username" class="input_box" size="70" value="" />
			</li>
			<li>
				<label for="password"><?php echo JText::_('JGLOBAL_PASSWORD'); ?></label>
				<input type="password" id="password" name="password" class="input_box" size="70" value="" />
			</li>
		</ul>
	</fieldset>
</div>
templates/hathor/html/com_config/application/default_filters.php000060400000001231152453623430021266 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div class="width-80">
	<fieldset class="adminform">
		<legend><?php echo JText::_('COM_CONFIG_TEXT_FILTER_SETTINGS'); ?></legend>
		<p><?php echo JText::_('COM_CONFIG_TEXT_FILTERS_DESC'); ?></p>
		<?php foreach ($this->form->getFieldset('filters') as $field) : ?>
			<?php echo $field->label; ?>
			<div class="clr"></div>
			<?php echo $field->input; ?>
		<?php endforeach; ?>
	</fieldset>
</div>
templates/hathor/html/com_config/application/default_session.php000060400000001167152453623430021311 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div class="width-100">
	<fieldset class="adminform">
		<legend><?php echo JText::_('COM_CONFIG_SESSION_SETTINGS'); ?></legend>
		<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset('session') as $field): ?>
				<li>
					<?php echo $field->label; ?>
					<?php echo $field->input; ?>
				</li>
			<?php endforeach; ?>
		</ul>
	</fieldset>
</div>
templates/hathor/html/com_config/application/default_cache.php000060400000001165152453623430020667 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div class="width-100">

	<fieldset class="adminform">
		<legend><?php echo JText::_('COM_CONFIG_CACHE_SETTINGS'); ?></legend>
		<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset('cache') as $field): ?>
				<li>
					<?php echo $field->label; ?>
					<?php echo $field->input; ?>
				</li>
			<?php endforeach; ?>
		</ul>

	</fieldset>
</div>
templates/hathor/html/com_config/component/default.php000060400000004103152453623430017236 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$app = JFactory::getApplication();
$template = $app->getTemplate();

JHtml::_('behavior.formvalidator');
JHtml::_('bootstrap.framework');

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(task)
	{
		if (document.formvalidator.isValid(document.getElementById('component-form'))) {
			Joomla.submitform(task, document.getElementById('component-form'));
		}
	}
");
?>
<form action="<?php echo JRoute::_('index.php?option=com_config'); ?>" id="component-form" method="post" name="adminForm" autocomplete="off" class="form-validate">
	<?php
	echo JHtml::_('tabs.start', 'config-tabs-' . $this->component->option . '_configuration', array('useCookie' => 1));
	$fieldSets = $this->form->getFieldsets();
	?>
	<?php foreach ($fieldSets as $name => $fieldSet) : ?>
		<?php
		$label = empty($fieldSet->label) ? 'COM_CONFIG_' . $name . '_FIELDSET_LABEL' : $fieldSet->label;
		echo JHtml::_('tabs.panel', JText::_($label), 'publishing-details');
		if (isset($fieldSet->description) && !empty($fieldSet->description))
		{
		echo '<p class="tab-description">' . JText::_($fieldSet->description) . '</p>';
		}
		?>
		<ul class="config-option-list">
			<?php foreach ($this->form->getFieldset($name) as $field): ?>
				<li>
					<?php if (!$field->hidden) : ?>
						<?php echo $field->label; ?>
					<?php endif; ?>
					<?php echo $field->input; ?>
				</li>
			<?php endforeach; ?>
		</ul>

		<div class="clr"></div>
	<?php endforeach; ?>
	<?php echo JHtml::_('tabs.end'); ?>
	<div>
		<input type="hidden" name="id" value="<?php echo $this->component->id; ?>" />
		<input type="hidden" name="component" value="<?php echo $this->component->option; ?>" />
		<input type="hidden" name="return" value="<?php echo $this->return; ?>" />
		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/com_checkin/checkin/default.php000060400000005365152453623430017012 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_checkin
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn = $this->escape($this->state->get('list.direction'));
?>
<form action="<?php echo JRoute::_('index.php?option=com_checkin'); ?>" method="post" name="adminForm" id="adminForm">
	<?php if (!empty($this->sidebar)) : ?>
		<div id="j-sidebar-container" class="span2">
			<?php echo $this->sidebar; ?>
		</div>
	<?php endif; ?>
	<div id="j-main-container"<?php echo !empty($this->sidebar) ? ' class="span10"' : ''; ?>>
		<fieldset id="filter-bar">
			<div class="filter-search fltlft">
				<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
				<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_CHECKIN_FILTER_SEARCH_DESC'); ?>" />

				<button type="submit" class="btn"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
				<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
			</div>
		</fieldset>
		<div class="clr"></div>

		<table id="global-checkin" class="adminlist">
			<thead>
				<tr>
					<th width="1%">
						<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
					</th>
					<th class="left"><?php echo JHtml::_('grid.sort', 'COM_CHECKIN_DATABASE_TABLE', 'table', $listDirn, $listOrder); ?></th>
					<th><?php echo JHtml::_('grid.sort', 'COM_CHECKIN_ITEMS_TO_CHECK_IN', 'count', $listDirn, $listOrder); ?></th>
				</tr>
			</thead>
			<tbody>
				<?php foreach ($this->items as $table => $count): $i = 0; ?>
					<tr class="row<?php echo $i % 2; ?>">
						<td class="center"><?php echo JHtml::_('grid.id', $i, $table); ?></td>
						<td><?php echo JText::sprintf('COM_CHECKIN_TABLE', $table); ?></td>
						<td width="200" class="center"><?php echo $count; ?></td>
					</tr>
				<?php endforeach; ?>
			</tbody>
			<tfoot>
				<tr>
					<td colspan="15">
						<?php echo $this->pagination->getListFooter(); ?>
					</td>
				</tr>
			</tfoot>
		</table>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
		<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/com_finder/filters/default.php000060400000014112152453623430016707 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$user      = JFactory::getUser();
$userId    = $user->get('id');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));

JText::script('COM_FINDER_INDEX_CONFIRM_DELETE_PROMPT');

JFactory::getDocument()->addScriptDeclaration("
Joomla.submitbutton = function(pressbutton)
{
	if (pressbutton == 'filters.delete')
	{
		if (confirm(Joomla.JText._('COM_FINDER_INDEX_CONFIRM_DELETE_PROMPT')))
		{
			Joomla.submitform(pressbutton);
		}
		else
		{
			return false;
		}
	}
	Joomla.submitform(pressbutton);
}
");
?>

<form action="<?php echo JRoute::_('index.php?option=com_finder&view=filters');?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::sprintf('COM_FINDER_SEARCH_LABEL', JText::_('COM_FINDER_FILTERS')); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::sprintf('COM_FINDER_SEARCH_LABEL', JText::_('COM_FINDER_FILTERS')); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_FINDER_FILTER_SEARCH_DESCRIPTION'); ?>" />
			<button type="submit" class="btn"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>

		<div class="filter-select">
			<label class="selectlabel" for="filter_state"><?php echo JText::_('COM_FINDER_INDEX_FILTER_BY_STATE'); ?></label>
			<select name="filter_state" id="filter_state">
				<option value=""><?php echo JText::_('COM_FINDER_INDEX_FILTER_BY_STATE');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('finder.statelist'), 'value', 'text', $this->state->get('filter.state'));?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>
	<div class="clr"> </div>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap state-col">
					<?php echo JHtml::_('grid.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
				</th>
				<th class="title created-by-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_CREATED_BY', 'a.created_by_alias', $listDirn, $listOrder); ?>
				</th>
				<th class="title date-col">
					<?php echo JHtml::_('grid.sort', 'COM_FINDER_FILTER_TIMESTAMP', 'a.created', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width-5">
					<?php echo JHtml::_('grid.sort', 'COM_FINDER_FILTER_MAP_COUNT', 'a.map_count', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.filter_id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php if (count($this->items) == 0) : ?>
			<tr class="row0">
				<td class="center" colspan="7">
					<?php
					if ($this->total == 0):
						echo JText::_('COM_FINDER_NO_FILTERS');
						?>
						<a href="<?php echo JRoute::_('index.php?option=com_finder&task=filter.add'); ?>" title="<?php echo JText::_('COM_FINDER_CREATE_FILTER'); ?>">
							<?php echo JText::_('COM_FINDER_CREATE_FILTER'); ?>
						</a>
						<?php
					else:
						echo JText::_('COM_FINDER_NO_RESULTS');
					endif;
					?>
				</td>
			</tr>
		<?php endif; ?>

		<?php foreach ($this->items as $i => $item) :
			$canCreate  = $user->authorise('core.create',     'com_finder');
			$canEdit    = $user->authorise('core.edit',       'com_finder');
			$canCheckin = $user->authorise('core.manage',     'com_checkin') || $filter->checked_out == $user->get('id') || $filter->checked_out == 0;
			$canChange  = $user->authorise('core.edit.state', 'com_finder') && $canCheckin;
			?>
			<tr class="row<?php echo $i % 2; ?>">
				<th class="center">
					<?php echo JHtml::_('grid.id', $i, $item->filter_id); ?>
				</th>
				<td>
					<?php if ($item->checked_out)
					{
						echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'filters.', $canCheckin);
					} ?>
					<?php if ($canEdit) { ?>
						<a href="<?php echo JRoute::_('index.php?option=com_finder&task=filter.edit&filter_id=' . (int) $item->filter_id); ?>">
							<?php echo $this->escape($item->title); ?></a>
					<?php } else {
							echo $this->escape($item->title);
					} ?>
				</td>
				<td class="center nowrap">
					<?php echo JHtml::_('jgrid.published', $item->state, $i, 'filters.', $canChange); ?>
				</td>
				<td class="center nowrap">
					<?php echo $item->created_by_alias ?: $item->user_name; ?>
				</td>
				<td class="center nowrap">
					<?php echo JHtml::_('date', $item->created, JText::_('DATE_FORMAT_LC4')); ?>
				</td>
				<td class="center nowrap">
					<?php echo $item->map_count; ?>
				</td>
				<td class="center">
					<?php echo (int) $item->filter_id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/com_finder/index/default.php000060400000014564152453623430016361 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip');

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$lang      = JFactory::getLanguage();

JText::script('COM_FINDER_INDEX_CONFIRM_PURGE_PROMPT');
JText::script('COM_FINDER_INDEX_CONFIRM_DELETE_PROMPT');

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(pressbutton)
	{
		if (pressbutton == 'index.purge')
		{
			if (confirm(Joomla.JText._('COM_FINDER_INDEX_CONFIRM_PURGE_PROMPT')))
			{
				Joomla.submitform(pressbutton);
			}
			else
			{
				return false;
			}
		}
		if (pressbutton == 'index.delete')
		{
			if (confirm(Joomla.JText._('COM_FINDER_INDEX_CONFIRM_DELETE_PROMPT')))
			{
				Joomla.submitform(pressbutton);
			}
			else
			{
				return false;
			}
		}

		Joomla.submitform(pressbutton);
	}
");
?>
<form action="<?php echo JRoute::_('index.php?option=com_finder&view=index');?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::sprintf('COM_FINDER_SEARCH_LABEL', JText::_('COM_FINDER_ITEMS')); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::sprintf('COM_FINDER_SEARCH_LABEL', JText::_('COM_FINDER_ITEMS')); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_FINDER_FILTER_SEARCH_DESCRIPTION'); ?>" />
			<button type="submit" class="btn"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>

		<div class="filter-select">
			<label class="selectlabel" for="filter_type"><?php echo JText::_('COM_FINDER_INDEX_TYPE_FILTER'); ?></label>
			<select name="filter_type" id="filter_type">
				<option value=""><?php echo JText::_('COM_FINDER_INDEX_TYPE_FILTER'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('finder.typeslist'), 'value', 'text', $this->state->get('filter.type'));?>
			</select>

			<label class="selectlabel" for="filter_state"><?php echo JText::_('COM_FINDER_INDEX_FILTER_BY_STATE'); ?></label>
			<select name="filter_state" id="filter_state">
				<option value=""><?php echo JText::_('COM_FINDER_INDEX_FILTER_BY_STATE');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('finder.statelist'), 'value', 'text', $this->state->get('filter.state'));?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>
	<div class="clr"> </div>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_TITLE', 'l.title', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap state-col">
					<?php echo JHtml::_('grid.sort', 'JSTATUS', 'l.published', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width-5">
					<?php echo JHtml::_('grid.sort', 'COM_FINDER_INDEX_HEADING_INDEX_TYPE', 'l.type_id', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width-20">
					<?php echo JHtml::_('grid.sort', 'COM_FINDER_INDEX_HEADING_LINK_URL', 'l.url', $listDirn, $listOrder); ?>
				</th>
				<th class="title date-col">
					<?php echo JHtml::_('grid.sort', 'COM_FINDER_INDEX_HEADING_INDEX_DATE', 'l.indexdate', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php if (count($this->items) == 0) : ?>
			<tr class="row0">
				<td align="center" colspan="7">
					<?php
					if ($this->total == 0)
					{
						echo JText::_('COM_FINDER_INDEX_NO_DATA') . '  ' . JText::_('COM_FINDER_INDEX_TIP');
					} else {
						echo JText::_('COM_FINDER_INDEX_NO_CONTENT');
					}
					?>
				</td>
			</tr>
		<?php endif; ?>
		<?php $canChange = JFactory::getUser()->authorise('core.manage', 'com_finder'); ?>
		<?php foreach ($this->items as $i => $item) : ?>
			<tr class="row<?php echo $i % 2; ?>">
				<th class="center">
					<?php echo JHtml::_('grid.id', $i, $item->link_id); ?>
				</th>
				<td class="pull-left break-word">
					<?php if ((int) $item->publish_start_date or (int) $item->publish_end_date or (int) $item->start_date or (int) $item->end_date) : ?>
					<img src="<?php echo JUri::root();?>/media/system/images/calendar.png" style="border:1px;float:right" class="hasTooltip" title="<?php echo JHtml::_('tooltipText', JText::sprintf('COM_FINDER_INDEX_DATE_INFO', $item->publish_start_date, $item->publish_end_date, $item->start_date, $item->end_date), '', 0); ?>" />
					<?php endif; ?>
					<?php echo $this->escape($item->title); ?>
				</td>
				<td class="center nowrap">
					<?php echo JHtml::_('jgrid.published', $item->published, $i, 'index.', $canChange, 'cb'); ?>
				</td>
				<td class="center nowrap">
					<?php
					$key = FinderHelperLanguage::branchSingular($item->t_title);
					echo $lang->hasKey($key) ? JText::_($key) : $item->t_title;
					?>
				</td>
				<td class="nowrap">
					<?php
					if (strlen($item->url) > 80)
					{
						echo substr($item->url, 0, 70) . '...';
					} else {
						echo $item->url;
					}
					?>
				</td>
				<td class="center nowrap">
					<?php echo JHtml::_('date', $item->indexdate, JText::_('DATE_FORMAT_LC4')); ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="display" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/com_finder/maps/default.php000060400000012126152453623430016202 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.multiselect');

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$lang      = JFactory::getLanguage();

JText::script('COM_FINDER_MAPS_CONFIRM_DELETE_PROMPT');

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(pressbutton)
	{
		if (pressbutton == 'map.delete')
		{
			if (confirm(Joomla.JText._('COM_FINDER_MAPS_CONFIRM_DELETE_PROMPT')))
			{
				Joomla.submitform(pressbutton);
			}
			else
			{
				return false;
			}
		}
		Joomla.submitform(pressbutton);
	}
");
?>

<form action="<?php echo JRoute::_('index.php?option=com_finder&view=maps');?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::sprintf('COM_FINDER_SEARCH_LABEL', JText::_('COM_FINDER_MAPS')); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::sprintf('COM_FINDER_SEARCH_LABEL', JText::_('COM_FINDER_MAPS')); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_FINDER_FILTER_SEARCH_DESCRIPTION'); ?>" />
			<button type="submit" class="btn"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>

		<div class="filter-select">
			<label class="selectlabel" for="filter_branch"><?php echo JText::sprintf('COM_FINDER_FILTER_BY', JText::_('COM_FINDER_MAPS')); ?></label>
			<select name="filter_branch" id="filter_branch">
				<?php echo JHtml::_('select.options', JHtml::_('finder.mapslist'), 'value', 'text', $this->state->get('filter.branch'));?>
			</select>

			<label class="selectlabel" for="filter_state"><?php echo JText::_('COM_FINDER_INDEX_FILTER_BY_STATE'); ?></label>
			<select name="filter_state" id="filter_state">
				<option value=""><?php echo JText::_('COM_FINDER_INDEX_FILTER_BY_STATE');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('finder.statelist'), 'value', 'text', $this->state->get('filter.state')); ?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?>
			</button>
		</div>
	</fieldset>
	<div class="clr"> </div>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap state-col">
					<?php echo JHtml::_('grid.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
				</th>
				<th width="1%" class="nowrap center">
					<?php echo JText::_('COM_FINDER_HEADING_NODES'); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php if (count($this->items) == 0) : ?>
			<tr class="row0">
				<td class="center" colspan="5">
					<?php echo JText::_('COM_FINDER_MAPS_NO_CONTENT'); ?>
				</td>
			</tr>
		<?php endif; ?>
		<?php $canChange = JFactory::getUser()->authorise('core.manage', 'com_finder'); ?>
		<?php foreach ($this->items as $i => $item) :?>
			<tr class="row<?php echo $i % 2; ?>">
				<th class="center">
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				</th>
				<td>
					<?php if ((int) $item->num_children === 0) : ?>
						<span class="gi">&mdash;</span>
					<?php endif; ?>
					<?php
					$key = FinderHelperLanguage::branchSingular($item->title);
					$title = $lang->hasKey($key) ? JText::_($key) : $item->title;
					echo $this->escape(($title == '*') ? JText::_('JALL_LANGUAGE') : $title);
					?>
				</td>
				<td class="center">
					<?php echo JHtml::_('jgrid.published', $item->state, $i, 'maps.', $canChange, 'cb'); ?>
				</td>
				<td class="center btns">
				<?php if ((int) $item->num_children === 0) : ?>
					<span class="badge <?php if ($item->num_nodes > 0) echo 'badge-info'; ?>"><?php echo $item->num_nodes; ?></span>
				<?php else : ?>
					&nbsp;
				<?php endif; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/com_plugins/plugins/default.php000060400000017067152453623430017146 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.multiselect');

$user      = JFactory::getUser();
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$canOrder  = $user->authorise('core.edit.state', 'com_plugins');
$saveOrder = $listOrder == 'ordering';
?>
<form action="<?php echo JRoute::_('index.php?option=com_plugins&view=plugins'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_PLUGINS_SEARCH_IN_TITLE'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>

		<div class="filter-select">
			<label class="selectlabel" for="filter_enabled">
				<?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?>
			</label>
			<select name="filter_enabled" id="filter_enabled">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?></option>
				<?php echo JHtml::_('select.options', PluginsHelper::publishedOptions(), 'value', 'text', $this->state->get('filter.enabled'), true); ?>
			</select>

			<label class="selectlabel" for="filter_folder">
				<?php echo JText::_('COM_PLUGINS_OPTION_FOLDER'); ?>
			</label>
			<select name="filter_folder" id="filter_folder">
				<option value=""><?php echo JText::_('COM_PLUGINS_OPTION_FOLDER'); ?></option>
				<?php echo JHtml::_('select.options', PluginsHelper::folderOptions(), 'value', 'text', $this->state->get('filter.folder')); ?>
			</select>
			<label class="selectlabel" for="filter_access">
				<?php echo JText::_('JOPTION_SELECT_ACCESS'); ?>
			</label>
			<select name="filter_access" id="filter_access">
				<option value=""><?php echo JText::_('JOPTION_SELECT_ACCESS'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text', $this->state->get('filter.access')); ?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>
	<div class="clr"> </div>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'COM_PLUGINS_NAME_HEADING', 'name', $listDirn, $listOrder); ?>
				</th>
				<th class="width-5">
					<?php echo JHtml::_('grid.sort', 'JENABLED', 'enabled', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap ordering-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ORDERING', 'ordering', $listDirn, $listOrder); ?>
					<?php if ($canOrder && $saveOrder) : ?>
						<?php echo JHtml::_('grid.order', $this->items, 'filesave.png', 'plugins.saveorder'); ?>
					<?php endif; ?>
				</th>

				<th class="nowrap width-10">
					<?php echo JHtml::_('grid.sort', 'COM_PLUGINS_FOLDER_HEADING', 'folder', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width-10">
					<?php echo JHtml::_('grid.sort', 'COM_PLUGINS_ELEMENT_HEADING', 'element', $listDirn, $listOrder); ?>
				</th>
				<th class="title access-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ACCESS', 'access', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'extension_id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) :
			$ordering   = ($listOrder == 'ordering');
			$canEdit    = $user->authorise('core.edit',       'com_plugins');
			$canCheckin = $user->authorise('core.manage',     'com_checkin') || $item->checked_out == $user->get('id') || $item->checked_out == 0;
			$canChange  = $user->authorise('core.edit.state', 'com_plugins') && $canCheckin;
		?>
			<tr class="row<?php echo $i % 2; ?>">
				<td class="center">
					<?php echo JHtml::_('grid.id', $i, $item->extension_id); ?>
				</td>
				<td>
					<?php if ($item->checked_out) : ?>
						<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'plugins.', $canCheckin); ?>
					<?php endif; ?>
					<?php if ($canEdit) : ?>
						<a href="<?php echo JRoute::_('index.php?option=com_plugins&task=plugin.edit&extension_id='.(int) $item->extension_id); ?>">
							<?php echo $item->name; ?></a>
					<?php else : ?>
							<?php echo $item->name; ?>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo JHtml::_('jgrid.published', $item->enabled, $i, 'plugins.', $canChange); ?>
				</td>
				<td class="order">
					<?php if ($canChange) : ?>
						<?php if ($saveOrder) : ?>
							<?php if ($listDirn == 'asc') : ?>
								<span><?php echo $this->pagination->orderUpIcon($i, @$this->items[$i - 1]->folder == $item->folder, 'plugins.orderup', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
								<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, @$this->items[$i + 1]->folder == $item->folder, 'plugins.orderdown', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
							<?php elseif ($listDirn == 'desc') : ?>
								<span><?php echo $this->pagination->orderUpIcon($i, @$this->items[$i - 1]->folder == $item->folder, 'plugins.orderdown', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
								<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, @$this->items[$i + 1]->folder == $item->folder, 'plugins.orderup', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
							<?php endif; ?>
						<?php endif; ?>
						<?php $disabled = $saveOrder ?  '' : 'disabled="disabled"'; ?>
						<input type="text" name="order[]" value="<?php echo $item->ordering; ?>" <?php echo $disabled; ?> class="text-area-order" title="<?php echo $item->name; ?> order" />
					<?php else : ?>
						<?php echo $item->ordering; ?>
					<?php endif; ?>
				</td>

				<td class="nowrap center">
					<?php echo $this->escape($item->folder); ?>
				</td>
				<td class="nowrap center">
					<?php echo $this->escape($item->element); ?>
				</td>
				<td class="center">
					<?php echo $this->escape($item->access_level); ?>
				</td>
				<td class="center">
					<?php echo (int) $item->extension_id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
</div>
</form>
templates/hathor/html/com_plugins/plugin/edit_options.php000060400000002275152453623430020032 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$fieldSets = $this->form->getFieldsets('params');

foreach ($fieldSets as $name => $fieldSet) :
	$label = !empty($fieldSet->label) ? $fieldSet->label : 'COM_PLUGINS_'.$name.'_FIELDSET_LABEL';
	echo JHtml::_('sliders.panel', JText::_($label), $name.'-options');
	if (isset($fieldSet->description) && trim($fieldSet->description)) :
		echo '<p class="tip">'.$this->escape(JText::_($fieldSet->description)).'</p>';
	endif;
	?>
	<fieldset class="panelform">
		<legend class="element-invisible"><?php echo JText::_($label) ?></legend>
		<?php $hidden_fields = ''; ?>
		<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset($name) as $field) : ?>
			<?php if (!$field->hidden) : ?>
			<li>
				<?php echo $field->label; ?>
				<?php echo $field->input; ?>
			</li>
			<?php else : $hidden_fields .= $field->input; ?>
			<?php endif; ?>
			<?php endforeach; ?>
		</ul>
		<?php echo $hidden_fields; ?>
	</fieldset>
<?php endforeach; ?>
templates/hathor/html/com_plugins/plugin/edit.php000060400000005361152453623430016256 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.formvalidator');

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(task)
	{
		if (task == 'plugin.cancel' || document.formvalidator.isValid(document.getElementById('style-form')))
		{
			Joomla.submitform(task, document.getElementById('style-form'));
		}
	}
");
?>

<form action="<?php echo JRoute::_('index.php?option=com_plugins&layout=edit&extension_id='.(int) $this->item->extension_id); ?>" method="post" name="adminForm" id="style-form" class="form-validate">
	<div class="col main-section">
		<fieldset class="adminform">
			<legend><?php echo JText::_('JDETAILS') ?></legend>
			<ul class="adminformlist">

			<li><?php echo $this->form->getLabel('name'); ?>
			<?php echo $this->form->getInput('name'); ?>
			<span class="readonly plg-name"><?php echo JText::_($this->item->name);?></span></li>

			<li><?php echo $this->form->getLabel('enabled'); ?>
			<?php echo $this->form->getInput('enabled'); ?></li>

			<li><?php echo $this->form->getLabel('access'); ?>
			<?php echo $this->form->getInput('access'); ?></li>

			<li><?php echo $this->form->getLabel('ordering'); ?>
			<?php echo $this->form->getInput('ordering'); ?></li>

			<li><?php echo $this->form->getLabel('folder'); ?>
			<?php echo $this->form->getInput('folder'); ?></li>

			<li><?php echo $this->form->getLabel('element'); ?>
			<?php echo $this->form->getInput('element'); ?></li>

			<?php if ($this->item->extension_id) : ?>
				<li><?php echo $this->form->getLabel('extension_id'); ?>
				<?php echo $this->form->getInput('extension_id'); ?></li>
			<?php endif; ?>
			</ul>
			<!-- Plugin metadata -->
			<?php if ($this->item->xml) : ?>
				<?php if ($text = trim($this->item->xml->description)) : ?>

					<label id="jform_extdescription-lbl">
						<?php echo JText::_('JGLOBAL_DESCRIPTION'); ?>
					</label>
					<div class="clr"></div>
					<div class="readonly plg-desc extdescript">
						<?php echo JText::_($text); ?>
					</div>

				<?php endif; ?>
			<?php else : ?>
				<?php echo JText::_('COM_PLUGINS_XML_ERR'); ?>
			<?php endif; ?>

		</fieldset>
	</div>

	<div class="col options-section">
	<?php echo JHtml::_('sliders.start', 'plugin-sliders-'.$this->item->extension_id); ?>

		<?php echo $this->loadTemplate('options'); ?>

		<div class="clr"></div>

	<?php echo JHtml::_('sliders.end'); ?>
	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>
	</div>

	<div class="clr"></div>
</form>
templates/hathor/html/com_contenthistory/history/modal.php000060400000021022152453623430020233 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
JSession::checkToken('get') or die(JText::_('JINVALID_TOKEN'));

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');
JHtml::_('bootstrap.tooltip', '.hasTooltip', array('placement' => 'bottom'));
JHtml::_('behavior.multiselect');
JHtml::_('jquery.framework');

$input = JFactory::getApplication()->input;
$field = $input->getCmd('field');
$function = 'jSelectContenthistory_' . $field;
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn = $this->escape($this->state->get('list.direction'));
$message = JText::_('COM_CONTENTHISTORY_BUTTON_SELECT_ONE', true);
$compareMessage = JText::_('COM_CONTENTHISTORY_BUTTON_SELECT_TWO', true);
JText::script('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST');
$deleteMessage = "alert(Joomla.JText._('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST'));";
$aliasArray = explode('.', $this->state->type_alias);
$option = (end($aliasArray) == 'category') ? 'com_categories&amp;extension=' . implode('.', array_slice($aliasArray, 0, count($aliasArray) - 1)) : $aliasArray[0];
$filter = JFilterInput::getInstance();
$task = $filter->clean(end($aliasArray)) . '.loadhistory';
$loadUrl = JRoute::_('index.php?option=' . $filter->clean($option) . '&amp;task=' . $task);
$deleteUrl = JRoute::_('index.php?option=com_contenthistory&task=history.delete');
$hash = $this->state->get('sha1_hash');
$formUrl = 'index.php?option=com_contenthistory&view=history&layout=modal&tmpl=component&item_id=' . $this->state->get('item_id') . '&type_id='
	. $this->state->get('type_id') . '&type_alias=' . $this->state->get('type_alias') . '&' . JSession::getFormToken() . '=1';

JFactory::getDocument()->addScriptDeclaration("
	(function ($){
		$(document).ready(function (){
			$('#toolbar-load').click(function() {
				var ids = $('input[id*=\'cb\']:checked');
				if (ids.length == 1) {
					// Add version item id to URL
					var url = $('#toolbar-load').attr('data-url') + '&version_id=' + ids[0].value;
					$('#content-url').attr('data-url', url);
					if (window.parent) {
						window.parent.location = url;
					}
				} else {
					alert('" . $message . "');
				}
			});

		$('#toolbar-preview').click(function() {
				var windowSizeArray = ['width=800, height=600, resizable=yes, scrollbars=yes'];
				var ids = $('input[id*=\'cb\']:checked');
				if (ids.length == 1) {
					// Add version item id to URL
					var url = $('#toolbar-preview').attr('data-url') + '&version_id=' + ids[0].value;
					$('#content-url').attr('data-url', url);
					if (window.parent) {
						window.open(url, '', windowSizeArray);
						return false;
					}
				} else {
					alert('" . $message . "');
				}
			});

			$('#toolbar-compare').click(function() {
				var windowSizeArray = ['width=1000, height=600, resizable=yes, scrollbars=yes'];
				var ids = $('input[id*=\'cb\']:checked');
				if (ids.length == 2) {
					// Add version item ids to URL
					var url = $('#toolbar-compare').attr('data-url') + '&id1=' + ids[0].value + '&id2=' + ids[1].value;
					$('#content-url').attr('data-url', url);
					if (window.parent) {
						window.open(url, '', windowSizeArray);
						return false;
					}
				} else {
					alert('" . $compareMessage . "');
				}
			});
		});
	})(jQuery);
	"
);

?>
<div class="modal-header">
	<h3><?php echo JText::_('COM_CONTENTHISTORY_MODAL_TITLE'); ?></h3>
</div>

<div class="modal-body">

	<div class="modal-buttons">
		<button id="toolbar-load" type="submit" class="btn pointer hasTooltip" title="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_LOAD_DESC'); ?>" data-url="<?php echo JRoute::_($loadUrl);?>">
			<span class="icon-upload"></span><span class="hidden-phone"><?php echo JText::_('COM_CONTENTHISTORY_BUTTON_LOAD'); ?></span></button>
		<button id="toolbar-preview" type="button" class="btn pointer hasTooltip" title="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_PREVIEW_DESC'); ?>" data-url="<?php echo JRoute::_('index.php?option=com_contenthistory&view=preview&layout=preview&tmpl=component&' . JSession::getFormToken() . '=1');?>">
			<span class="icon-search"></span><span class="hidden-phone"><?php echo JText::_('COM_CONTENTHISTORY_BUTTON_PREVIEW'); ?></span></button>
		<button id="toolbar-compare" type="button" class="btn pointer hasTooltip" title="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_COMPARE_DESC'); ?>" data-url="<?php echo JRoute::_('index.php?option=com_contenthistory&view=compare&layout=compare&tmpl=component&' . JSession::getFormToken() . '=1');?>">
			<span class="icon-zoom-in"></span><span class="hidden-phone"><?php echo JText::_('COM_CONTENTHISTORY_BUTTON_COMPARE'); ?></span></button>
		<button onclick="if (document.adminForm.boxchecked.value==0){<?php echo $deleteMessage; ?>}else{ Joomla.submitbutton('history.keep')}" class="btn pointer hasTooltip" title="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_KEEP_DESC'); ?>">
			<span class="icon-lock"></span><span class="hidden-phone"><?php echo JText::_('COM_CONTENTHISTORY_BUTTON_KEEP'); ?></span></button>
		<button onclick="if (document.adminForm.boxchecked.value==0){<?php echo $deleteMessage; ?>}else{ Joomla.submitbutton('history.delete')}" class="btn pointer hasTooltip" title="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_DELETE_DESC'); ?>">
			<span class="icon-delete"></span><span class="hidden-phone"><?php echo JText::_('COM_CONTENTHISTORY_BUTTON_DELETE'); ?></span></button>
	</div>

	<form action="<?php echo JRoute::_($formUrl);?>" method="post" name="adminForm" id="adminForm">
		<table class="adminlist modal">
			<thead>
				<tr>
					<th width="1%" class="title">
						<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
					</th>
					<th width="15%" class="title">
						<?php echo JText::_('JDATE'); ?>
					</th>
					<th width="15%" class="title">
						<?php echo JText::_('COM_CONTENTHISTORY_VERSION_NOTE'); ?>
					</th>
					<th width="10%" class="title">
						<?php echo JText::_('COM_CONTENTHISTORY_KEEP_VERSION'); ?>
					</th>
					<th width="15%" class="title">
						<?php echo JText::_('JAUTHOR'); ?>
					</th>
					<th width="10%" class="title">
						<?php echo JText::_('COM_CONTENTHISTORY_CHARACTER_COUNT'); ?>
					</th>
				</tr>
			</thead>

			<tbody>
			<?php $i = 0; ?>
			<?php foreach ($this->items as $item) : ?>
				<tr class="row<?php echo $i % 2; ?>">
					<td class="center">
						<?php echo JHtml::_('grid.id', $i, $item->version_id); ?>
					</td>
					<td class="nowrap">
						<a class="save-date" onclick="window.open(this.href,'win2','width=800,height=600,resizable=yes,scrollbars=yes'); return false;"
							href="<?php echo JRoute::_('index.php?option=com_contenthistory&view=preview&layout=preview&tmpl=component&' . JSession::getFormToken() . '=1&version_id=' . $item->version_id);?>">
							<?php echo JHtml::_('date', $item->save_date, JText::_('DATE_FORMAT_LC6')); ?>
						</a>
						<?php if ($item->sha1_hash == $hash) :?>
							<span class="icon-featured"></span>&nbsp;
						<?php endif; ?>
					</td>
					<td class="center">
						<?php echo htmlspecialchars($item->version_note); ?>
					</td>
					<td class="center">
						<?php if ($item->keep_forever) : ?>
							<a class="btn btn-mini active" rel="tooltip" href="javascript:void(0);"
								onclick="return listItemTask('cb<?php echo $i; ?>','history.keep')"
								data-original-title="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_KEEP_TOGGLE_OFF'); ?>">
								<?php echo JText::_('JYES'); ?>&nbsp;<span class="icon-lock"></span>
							</a>
						<?php else : ?>
							<a class="btn btn-mini active" rel="tooltip" href="javascript:void(0);"
								onclick="return listItemTask('cb<?php echo $i; ?>','history.keep')"
								data-original-title="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_KEEP_TOGGLE_ON'); ?>">
								<?php echo JText::_('JNO'); ?>
							</a>
						<?php endif; ?>
					</td>
					<td class="center">
						<?php echo htmlspecialchars($item->editor); ?>
					</td>
					<td class="center">
						<?php echo number_format((int) $item->character_count, 0, JText::_('DECIMALS_SEPARATOR'), JText::_('THOUSANDS_SEPARATOR')); ?>
					</td>
				</tr>
				<?php $i++; ?>
			<?php endforeach; ?>
			</tbody>
		</table>

		<?php echo $this->pagination->getListFooter(); ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>

	</form>
</div>
templates/hathor/html/com_admin/help/default.php000060400000003704152453623430016015 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

jimport('joomla.language.help');
?>
<form action="<?php echo JRoute::_('index.php?option=com_admin&amp;view=help'); ?>" method="post" name="adminForm" id="adminForm">
<div class="width-50 fltrt helplinks">
	<ul class="helpmenu">
		<li><?php echo JHtml::_('link', JHelp::createUrl('JHELP_GLOSSARY'), JText::_('COM_ADMIN_GLOSSARY'), array('target' => 'helpFrame')) ?></li>
		<li><?php echo JHtml::_('link', 'https://www.gnu.org/licenses/gpl-2.0.html', JText::_('COM_ADMIN_LICENSE'), array('target' => 'helpFrame')) ?></li>
		<li><?php echo JHtml::_('link', $this->latest_version_check, JText::_('COM_ADMIN_LATEST_VERSION_CHECK'), array('target' => 'helpFrame')) ?></li>
		<li><?php echo JHtml::_('link', JHelp::createUrl('JHELP_START_HERE'), JText::_('COM_ADMIN_START_HERE'), array('target' => 'helpFrame')) ?></li>
	</ul>
</div>
<div class="clr"> </div>
	<div id="treecellhelp" class="width-20 fltleft">
		<fieldset class="adminform whitebg" title="<?php echo JText::_('COM_ADMIN_ALPHABETICAL_INDEX'); ?>">
			<legend><?php echo JText::_('COM_ADMIN_ALPHABETICAL_INDEX'); ?></legend>

			<div class="helpIndex">
				<ul class="subext">
					<?php foreach ($this->toc as $k => $v):?>
						<li>
							<?php $url = JHelp::createUrl('JHELP_'.strtoupper($k)); ?>
							<?php echo JHtml::_('link', $url, $v, array('target' => 'helpFrame'));?>
						</li>
					<?php endforeach;?>
				</ul>
			</div>
		</fieldset>
	</div>

	<div id="datacellhelp" class="width-80 fltrt">
		<fieldset title="<?php echo JText::_('COM_ADMIN_VIEW'); ?>">
			<legend>
				<?php echo JText::_('COM_ADMIN_VIEW'); ?>
			</legend>
				<iframe name="helpFrame" src="<?php echo $this->page;?>" class="helpFrame"></iframe>
		</fieldset>
	</div>
</form>
templates/hathor/html/com_admin/sysinfo/default.php000060400000002675152453623430016565 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Add specific helper files for html generation
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');
// Load switcher behavior
JHtml::_('behavior.switcher');
?>

<form action="<?php echo JRoute::_('index.php'); ?>" method="post" name="adminForm" id="adminForm">
	<div id="config-document">
		<div id="page-site" class="tab">
			<div class="noshow">
				<div class="width-100">
					<?php echo $this->loadTemplate('system'); ?>
				</div>
			</div>
		</div>

		<div id="page-phpsettings" class="tab">
			<div class="noshow">
				<div class="width-60">
					<?php echo $this->loadTemplate('phpsettings'); ?>
				</div>
			</div>
		</div>

		<div id="page-config" class="tab">
			<div class="noshow">
				<div class="width-60">
					<?php echo $this->loadTemplate('config'); ?>
				</div>
			</div>
		</div>

		<div id="page-directory" class="tab">
			<div class="noshow">
				<div class="width-60">
					<?php echo $this->loadTemplate('directory'); ?>
				</div>
			</div>
		</div>

		<div id="page-phpinfo" class="tab">
			<div class="noshow">
				<div class="width-100">
					<?php echo $this->loadTemplate('phpinfo'); ?>
				</div>
			</div>
		</div>
	</div>

	<div class="clr"></div>
</form>
templates/hathor/html/com_admin/sysinfo/default_directory.php000060400000001731152453623430020641 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<fieldset class="adminform">
	<legend><?php echo JText::_('COM_ADMIN_DIRECTORY_PERMISSIONS'); ?></legend>
	<table class="adminlist">
		<thead>
			<tr>
				<th width="650">
					<?php echo JText::_('COM_ADMIN_DIRECTORY'); ?>
				</th>
				<th>
					<?php echo JText::_('COM_ADMIN_STATUS'); ?>
				</th>
			</tr>
		</thead>
		<tfoot>
			<tr>
				<td colspan="2">&#160;</td>
			</tr>
		</tfoot>
		<tbody>
			<?php foreach ($this->directory as $dir => $info) : ?>
			<tr>
				<td>
					<?php echo JHtml::_('directory.message', $dir, $info['message']);?>
				</td>
				<td>
					<?php echo JHtml::_('directory.writable', $info['writable']);?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>
</fieldset>
templates/hathor/html/com_admin/sysinfo/default_phpsettings.php000060400000007445152453623430021215 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<fieldset class="adminform">
	<legend><?php echo JText::_('COM_ADMIN_RELEVANT_PHP_SETTINGS'); ?></legend>
	<table class="adminlist">
		<thead>
			<tr>
				<th width="250">
					<?php echo JText::_('COM_ADMIN_SETTING'); ?>
				</th>
				<th>
					<?php echo JText::_('COM_ADMIN_VALUE'); ?>
				</th>
			</tr>
		</thead>
		<tfoot>
			<tr>
				<td colspan="2">&#160;
				</td>
			</tr>
		</tfoot>
		<tbody>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_SAFE_MODE'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.boolean', $this->php_settings['safe_mode']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_OPEN_BASEDIR'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.string', $this->php_settings['open_basedir']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_DISPLAY_ERRORS'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.boolean', $this->php_settings['display_errors']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_SHORT_OPEN_TAGS'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.boolean', $this->php_settings['short_open_tag']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_FILE_UPLOADS'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.boolean', $this->php_settings['file_uploads']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_MAGIC_QUOTES'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.boolean', $this->php_settings['magic_quotes_gpc']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_REGISTER_GLOBALS'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.boolean', $this->php_settings['register_globals']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_OUTPUT_BUFFERING'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.boolean', $this->php_settings['output_buffering']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_SESSION_SAVE_PATH'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.string', $this->php_settings['session.save_path']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_SESSION_AUTO_START'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.integer', $this->php_settings['session.auto_start']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_XML_ENABLED'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.set', $this->php_settings['xml']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_ZLIB_ENABLED'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.set', $this->php_settings['zlib']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_ZIP_ENABLED'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.set', $this->php_settings['zip']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_DISABLED_FUNCTIONS'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.string', $this->php_settings['disable_functions']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_MBSTRING_ENABLED'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.set', $this->php_settings['mbstring']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_ICONV_AVAILABLE'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.set', $this->php_settings['iconv']); ?>
				</td>
			</tr>
		</tbody>
	</table>
</fieldset>
templates/hathor/html/com_admin/sysinfo/default_config.php000060400000001620152453623430020077 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<fieldset class="adminform">
	<legend><?php echo JText::_('COM_ADMIN_CONFIGURATION_FILE'); ?></legend>
	<table class="adminlist">
		<thead>
			<tr>
				<th width="300">
					<?php echo JText::_('COM_ADMIN_SETTING'); ?>
				</th>
				<th>
					<?php echo JText::_('COM_ADMIN_VALUE'); ?>
				</th>
			</tr>
		</thead>
		<tfoot>
			<tr>
				<td colspan="2">&#160;</td>
			</tr>
		</tfoot>
		<tbody>
			<?php foreach ($this->config as $key => $value):?>
			<tr>
				<td>
					<?php echo $key;?>
				</td>
				<td>
					<?php echo htmlspecialchars($value, ENT_QUOTES);?>
				</td>
			</tr>
			<?php endforeach;?>
		</tbody>
	</table>
</fieldset>
templates/hathor/html/com_admin/sysinfo/default_system.php000060400000004360152453623430020162 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<fieldset class="adminform">
	<legend><?php echo JText::_('COM_ADMIN_SYSTEM_INFORMATION'); ?></legend>
	<table class="adminlist">
		<thead>
			<tr>
				<th width="250">
					<?php echo JText::_('COM_ADMIN_SETTING'); ?>
				</th>
				<th>
					<?php echo JText::_('COM_ADMIN_VALUE'); ?>
				</th>
			</tr>
		</thead>
		<tfoot>
			<tr>
				<td colspan="2">&#160;
				</td>
			</tr>
		</tfoot>
		<tbody>
			<tr>
				<td>
					<strong><?php echo JText::_('COM_ADMIN_PHP_BUILT_ON'); ?></strong>
				</td>
				<td>
					<?php echo $this->info['php'];?>
				</td>
			</tr>
			<tr>
				<td>
					<strong><?php echo JText::_('COM_ADMIN_DATABASE_VERSION'); ?></strong>
				</td>
				<td>
					<?php echo $this->info['dbversion'];?>
				</td>
			</tr>
			<tr>
				<td>
					<strong><?php echo JText::_('COM_ADMIN_DATABASE_COLLATION'); ?></strong>
				</td>
				<td>
					<?php echo $this->info['dbcollation'];?>
				</td>
			</tr>
			<tr>
				<td>
					<strong><?php echo JText::_('COM_ADMIN_PHP_VERSION'); ?></strong>
				</td>
				<td>
					<?php echo $this->info['phpversion'];?>
				</td>
			</tr>
			<tr>
				<td>
					<strong><?php echo JText::_('COM_ADMIN_WEB_SERVER'); ?></strong>
				</td>
				<td>
					<?php echo JHtml::_('system.server', $this->info['server']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<strong><?php echo JText::_('COM_ADMIN_WEBSERVER_TO_PHP_INTERFACE'); ?></strong>
				</td>
				<td>
					<?php echo $this->info['sapi_name'];?>
				</td>
			</tr>
			<tr>
				<td>
					<strong><?php echo JText::_('COM_ADMIN_JOOMLA_VERSION'); ?></strong>
				</td>
				<td>
					<?php echo $this->info['version'];?>
				</td>
			</tr>
			<tr>
				<td>
					<strong><?php echo JText::_('COM_ADMIN_PLATFORM_VERSION'); ?></strong>
				</td>
				<td>
					<?php echo $this->info['platform'];?>
				</td>
			</tr>
			<tr>
				<td>
					<strong><?php echo JText::_('COM_ADMIN_USER_AGENT'); ?></strong>
				</td>
				<td>
					<?php echo $this->info['useragent'];?>
				</td>
			</tr>
		</tbody>
	</table>
</fieldset>
templates/hathor/html/com_admin/sysinfo/default_navigation.php000060400000002257152453623430021000 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div id="submenu-box">
	<div class="submenu-box">
		<div class="submenu-pad">
			<ul id="submenu" class="information nav nav-list">
				<li>
					<a href="#" onclick="return false;" id="site" class="active">
						<?php echo JText::_('COM_ADMIN_SYSTEM_INFORMATION'); ?></a>
				</li>
				<li>
					<a href="#" onclick="return false;" id="phpsettings">
						<?php echo JText::_('COM_ADMIN_PHP_SETTINGS'); ?></a>
				</li>
				<li>
					<a href="#" onclick="return false;" id="config">
						<?php echo JText::_('COM_ADMIN_CONFIGURATION_FILE'); ?></a>
				</li>
				<li>
					<a href="#" onclick="return false;" id="directory">
						<?php echo JText::_('COM_ADMIN_DIRECTORY_PERMISSIONS'); ?></a>
				</li>
				<li>
					<a href="#" onclick="return false;" id="phpinfo">
						<?php echo JText::_('COM_ADMIN_PHP_INFORMATION'); ?></a>
				</li>
			</ul>
			<div class="clr"></div>
		</div>
	</div>
	<div class="clr"></div>
</div>
templates/hathor/html/com_admin/profile/edit.php000060400000004267152453623430016033 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.formvalidator');

// Get the form fieldsets.
$fieldsets = $this->form->getFieldsets();

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(task)
	{
		if (task == 'profile.cancel' || document.formvalidator.isValid(document.getElementById('profile-form')))
		{
			Joomla.submitform(task, document.getElementById('profile-form'));
		}
	}
");
?>
<form action="<?php echo JRoute::_('index.php?option=com_admin&view=profile&layout=edit&id='.$this->item->id); ?>" method="post" name="adminForm" id="profile-form" class="form-validate" enctype="multipart/form-data">
	<div class="col main-section">
		<fieldset class="adminform">
			<legend><?php echo JText::_('COM_ADMIN_USER_ACCOUNT_DETAILS'); ?></legend>
			<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset('user_details') as $field) : ?>
				<li><?php echo $field->label; ?>
				<?php echo $field->input; ?></li>
			<?php endforeach; ?>
			</ul>
		</fieldset>
	</div>

	<div class="col options-section">
		<?php
		echo JHtml::_('sliders.start');
		foreach ($fieldsets as $fieldset) :
			if ($fieldset->name == 'user_details') :
				continue;
			endif;
			echo JHtml::_('sliders.panel', JText::_($fieldset->label), $fieldset->name);
		?>
		<fieldset class="panelform">
		<legend class="element-invisible"><?php echo JText::_($fieldset->label); ?></legend>
		<ul class="adminformlist">
		<?php foreach ($this->form->getFieldset($fieldset->name) as $field) : ?>
			<?php if ($field->hidden) : ?>
				<?php echo $field->input; ?>
			<?php else: ?>
				<li><?php echo $field->label; ?>
				<?php echo $field->input; ?></li>
			<?php endif; ?>
		<?php endforeach; ?>
		</ul>
		</fieldset>
		<?php endforeach; ?>
		<?php echo JHtml::_('sliders.end'); ?>

		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/com_banners/client/edit.php000060400000006551152453623430016207 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.formvalidator');

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(task)
	{
		if (task == 'client.cancel' || document.formvalidator.isValid(document.getElementById('client-form')))
		{
			Joomla.submitform(task, document.getElementById('client-form'));
		}
	}
");
?>

<form action="<?php echo JRoute::_('index.php?option=com_banners&layout=edit&id='.(int) $this->item->id); ?>" method="post" name="adminForm" id="client-form" class="form-validate">

<div class="col main-section">
	<fieldset class="adminform">
		<legend><?php echo empty($this->item->id) ? JText::_('COM_BANNERS_NEW_CLIENT') : JText::sprintf('COM_BANNERS_EDIT_CLIENT', $this->item->id); ?></legend>
		<ul class="adminformlist">
				<li><?php echo $this->form->getLabel('name'); ?>
				<?php echo $this->form->getInput('name'); ?></li>

				<li><?php echo $this->form->getLabel('contact'); ?>
				<?php echo $this->form->getInput('contact'); ?></li>

				<li><?php echo $this->form->getLabel('email'); ?>
				<?php echo $this->form->getInput('email'); ?></li>

				<?php if ($this->canDo->get('core.edit.state')) : ?>
					<li><?php echo $this->form->getLabel('state'); ?>
					<?php echo $this->form->getInput('state'); ?></li>
				<?php endif; ?>

				<li><?php echo $this->form->getLabel('purchase_type'); ?>
				<?php echo $this->form->getInput('purchase_type'); ?></li>

				<li><?php echo $this->form->getLabel('track_impressions'); ?>
				<?php echo $this->form->getInput('track_impressions'); ?></li>

				<li><?php echo $this->form->getLabel('track_clicks'); ?>
				<?php echo $this->form->getInput('track_clicks'); ?></li>

				<li><?php echo $this->form->getLabel('id'); ?>
				<?php echo $this->form->getInput('id'); ?></li>
		</ul>

	</fieldset>
</div>

<div class="col options-section">
	<?php echo JHtml::_('sliders.start', 'banner-client-sliders-' . $this->item->id, array('useCookie' => 1)); ?>

	<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_FIELDSET_METADATA_OPTIONS'), 'metadata'); ?>
		<fieldset class="panelform">
		<legend class="element-invisible"><?php echo JText::_('JGLOBAL_FIELDSET_METADATA_OPTIONS'); ?></legend>
		<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset('metadata') as $field) : ?>
				<li>
					<?php if (!$field->hidden) : ?>
						<?php echo $field->label; ?>
					<?php endif; ?>
					<?php echo $field->input; ?>
				</li>
			<?php endforeach; ?>
			</ul>
		</fieldset>

	<?php echo JHtml::_('sliders.panel', JText::_('COM_BANNERS_EXTRA'), 'extra'); ?>
		<fieldset class="panelform">
		<legend class="element-invisible"><?php echo JText::_('COM_BANNERS_EXTRA'); ?></legend>
		<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset('extra') as $field) : ?>
				<li><?php if (!$field->hidden) : ?>
					<?php echo $field->label; ?>
				<?php endif; ?>
				<?php echo $field->input; ?></li>
			<?php endforeach; ?>
			</ul>
		</fieldset>

	<?php echo JHtml::_('sliders.end'); ?>

	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>
</div>

<div class="clr"></div>
</form>
templates/hathor/html/com_banners/banners/default.php000060400000024750152453623430017061 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.multiselect');

$user      = JFactory::getUser();
$userId    = $user->get('id');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$canOrder  = $user->authorise('core.edit.state', 'com_banners');
$saveOrder = $listOrder == 'ordering';
?>
<form action="<?php echo JRoute::_('index.php?option=com_banners&view=banners'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_BANNERS_SEARCH_IN_TITLE'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>

		<div class="filter-select">
			<label class="selectlabel" for="filter_published">
				<?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?>
			</label>
			<select name="filter_published" id="filter_published">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.published'), true);?>
			</select>

			<label class="selectlabel" for="filter_client_id">
				<?php echo JText::_('COM_BANNERS_SELECT_CLIENT'); ?>
			</label>
			<select name="filter_client_id" id="filter_client_id">
				<option value=""><?php echo JText::_('COM_BANNERS_SELECT_CLIENT');?></option>
				<?php echo JHtml::_('select.options', BannersHelper::getClientOptions(), 'value', 'text', $this->state->get('filter.client_id'));?>
			</select>

			<label class="selectlabel" for="filter_category_id">
				<?php echo JText::_('JOPTION_SELECT_CATEGORY'); ?>
			</label>
			<select name="filter_category_id" id="filter_category_id">
				<option value=""><?php echo JText::_('JOPTION_SELECT_CATEGORY');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('category.options', 'com_banners'), 'value', 'text', $this->state->get('filter.category_id'));?>
			</select>

			<label class="selectlabel" for="filter_language">
				<?php echo JText::_('JOPTION_SELECT_LANGUAGE'); ?>
			</label>
			<select name="filter_language" id="filter_language">
				<option value=""><?php echo JText::_('JOPTION_SELECT_LANGUAGE');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('contentlanguage.existing', true, true), 'value', 'text', $this->state->get('filter.language'));?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>
	<div class="clr"> </div>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th class="title">
					<?php echo JHtml::_('grid.sort', 'COM_BANNERS_HEADING_NAME', 'name', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap state-col">
					<?php echo JHtml::_('grid.sort', 'JSTATUS', 'state', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width-5">
					<?php echo JHtml::_('grid.sort', 'COM_BANNERS_HEADING_STICKY', 'sticky', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width-10">
					<?php echo JHtml::_('grid.sort', 'COM_BANNERS_HEADING_CLIENT', 'client_name', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap title category-col">
					<?php echo JHtml::_('grid.sort', 'JCATEGORY', 'category_title', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap ordering-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ORDERING', 'ordering', $listDirn, $listOrder); ?>
					<?php if ($canOrder && $saveOrder) : ?>
						<?php echo JHtml::_('grid.order', $this->items, 'filesave.png', 'banners.saveorder'); ?>
					<?php endif;?>
				</th>
				<th class="nowrap width-5">
					<?php echo JHtml::_('grid.sort', 'COM_BANNERS_HEADING_IMPRESSIONS', 'impmade', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width-10">
					<?php echo JHtml::_('grid.sort', 'COM_BANNERS_HEADING_CLICKS', 'clicks', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width-5">
					<?php echo JText::_('COM_BANNERS_HEADING_METAKEYWORDS'); ?>
				</th>
				<th class="width-10">
					<?php echo JText::_('COM_BANNERS_HEADING_PURCHASETYPE'); ?>
				</th>
				<th class="language-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_LANGUAGE', 'a.language', $this->state->get('list.direction'), $this->state->get('list.ordering')); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->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;
			?>
			<tr class="row<?php echo $i % 2; ?>">
				<td>
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				</td>
				<td>
					<?php if ($item->checked_out) : ?>
						<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'banners.', $canCheckin); ?>
					<?php endif; ?>
					<?php if ($canEdit) : ?>
						<a href="<?php echo JRoute::_('index.php?option=com_banners&task=banner.edit&id='.(int) $item->id); ?>">
							<?php echo $this->escape($item->name); ?></a>
					<?php else : ?>
							<?php echo $this->escape($item->name); ?>
					<?php endif; ?>
					<p class="smallsub">
						<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias));?></p>
				</td>
				<td class="center">
					<?php echo JHtml::_('jgrid.published', $item->state, $i, 'banners.', $canChange, 'cb', $item->publish_up, $item->publish_down); ?>
				</td>
				<td class="center">
					<?php echo JHtml::_('banner.pinned', $item->sticky, $i, $canChange);?>
				</td>
				<td class="center">
					<?php echo $item->client_name;?>
				</td>
				<td class="center">
					<?php echo $this->escape($item->category_title); ?>
				</td>
				<td class="order">
					<?php if ($canChange) : ?>
						<?php if ($saveOrder) : ?>
							<?php if ($listDirn == 'asc') : ?>
								<span><?php echo $this->pagination->orderUpIcon($i, @$this->items[$i - 1]->catid == $item->catid, 'banners.orderup', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
								<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, @$this->items[$i + 1]->catid == $item->catid, 'banners.orderdown', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
							<?php elseif ($listDirn == 'desc') : ?>
								<span><?php echo $this->pagination->orderUpIcon($i, @$this->items[$i - 1]->catid == $item->catid, 'banners.orderdown', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
								<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, @$this->items[$i + 1]->catid == $item->catid, 'banners.orderup', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
							<?php endif; ?>
						<?php endif; ?>
						<?php $disabled = $saveOrder ?  '' : 'disabled="disabled"'; ?>
						<input type="text" name="order[]" value="<?php echo $item->ordering;?>" <?php echo $disabled; ?> class="text-area-order" title="<?php echo $item->name; ?> order" />
					<?php else : ?>
						<?php echo $item->ordering; ?>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo JText::sprintf('COM_BANNERS_IMPRESSIONS', $item->impmade, $item->imptotal ?: JText::_('COM_BANNERS_UNLIMITED'));?>
				</td>
				<td class="center">
					<?php echo $item->clicks;?> -
					<?php echo sprintf('%.2f%%', $item->impmade ? 100 * $item->clicks / $item->impmade : 0);?>
				</td>
				<td>
					<?php echo $item->metakey; ?>
				</td>
				<td class="center">
					<?php if ($item->purchase_type < 0):?>
						<?php echo JText::sprintf('COM_BANNERS_DEFAULT', ($item->client_purchase_type > 0) ? JText::_('COM_BANNERS_FIELD_VALUE_'.$item->client_purchase_type) : JText::_('COM_BANNERS_FIELD_VALUE_'.$this->state->params->get('purchase_type')));?>
					<?php else:?>
						<?php echo JText::_('COM_BANNERS_FIELD_VALUE_'.$item->purchase_type);?>
					<?php endif;?>
				</td>
				<td class="center">
					<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
				</td>
				<td class="center">
					<?php echo $item->id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>
	<div class="clr"> </div>

	<?php //Load the batch processing form. ?>
	<?php if ($user->authorise('core.create', 'com_banners')
		&& $user->authorise('core.edit', 'com_banners')
		&& $user->authorise('core.edit.state', 'com_banners')) : ?>
		<?php echo JHtml::_(
			'bootstrap.renderModal',
			'collapseModal',
			array(
				'title'  => JText::_('COM_BANNERS_BATCH_OPTIONS'),
				'footer' => $this->loadTemplate('batch_footer'),
			),
			$this->loadTemplate('batch_body')
		); ?>
	<?php endif; ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/com_banners/download/default.php000060400000002316152453623430017232 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip', '.hasTooltip', array('placement' => 'bottom'));
?>
<div class="container-popup">
	<form
		class="form-validate"
		id="download-form"
		name="adminForm"
		action="<?php echo JRoute::_('index.php?option=com_banners&task=tracks.display&format=raw'); ?>"
		method="post">

		<fieldset class="adminform">
			<ul class="adminformlist">
				<?php foreach ($this->form->getFieldset() as $field) : ?>
					<li>
						<?php echo $this->form->getLabel($field->fieldname); ?>
						<?php echo $this->form->getInput($field->fieldname); ?>
					</li>
				<?php endforeach; ?>
			</ul>
		</fieldset>

		<button class="hidden"
			id="closeBtn"
			type="button"
			onclick="window.parent.jQuery('#modal-download').modal('hide');">
		</button>
		<button class="hidden"
			id="exportBtn"
			type="button"
			onclick="this.form.submit();window.top.setTimeout('window.parent.jQuery(\'#downloadModal\').modal(\'hide\')', 700);">
		</button>
	</form>
</div>
templates/hathor/html/com_banners/tracks/default.php000060400000013417152453623430016716 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.multiselect');
JHtml::_('behavior.modal', 'a.modal');

$user      = JFactory::getUser();
$userId    = $user->get('id');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>
<form id="adminForm" name="adminForm" action="<?php echo JRoute::_('index.php?option=com_banners&view=tracks'); ?>" method="post">
<?php if (!empty( $this->sidebar)) : ?>
	<div class="span2" id="j-sidebar-container">
		<?php echo $this->sidebar; ?>
	</div>
	<div class="span10" id="j-main-container">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>

		<fieldset id="filter-bar">
			<legend class="element-invisible"><?php echo JText::_('COM_BANNERS_BEGIN_LABEL'); ?></legend>
			<div class="filter-search">
				<label class="filter-hide-lbl" for="filter_begin"><?php echo JText::_('COM_BANNERS_BEGIN_LABEL'); ?></label>
				<?php echo JHtml::_('calendar', $this->state->get('filter.begin'), 'filter_begin', 'filter_begin', '%Y-%m-%d', array('size' => 10));?>

				<label class="filter-hide-lbl" for="filter_end"><?php echo JText::_('COM_BANNERS_END_LABEL'); ?></label>
				<?php echo JHtml::_('calendar', $this->state->get('filter.end'), 'filter_end', 'filter_end', '%Y-%m-%d', array('size' => 10));?>
			</div>

			<div class="filter-select">
				<label class="selectlabel" for="filter_client_id">
					<?php echo JText::_('COM_BANNERS_SELECT_CLIENT'); ?>
				</label>
				<select id="filter_client_id" name="filter_client_id">
					<option value=""><?php echo JText::_('COM_BANNERS_SELECT_CLIENT');?></option>
					<?php echo JHtml::_('select.options', BannersHelper::getClientOptions(), 'value', 'text', $this->state->get('filter.client_id'));?>
				</select>

				<label class="selectlabel" for="filter_category_id">
					<?php echo JText::_('JOPTION_SELECT_CATEGORY'); ?>
				</label>
				<?php $category = $this->state->get('filter.category_id');?>
				<select id="filter_category_id" name="filter_category_id">
					<option value=""><?php echo JText::_('JOPTION_SELECT_CATEGORY');?></option>
					<?php echo JHtml::_('select.options', JHtml::_('category.options', 'com_banners'), 'value', 'text', $category);?>
				</select>

				<label class="selectlabel" for="filter_type">
					<?php echo JText::_('COM_BANNERS_SELECT_TYPE'); ?>
				</label>
				<select id="filter_type" name="filter_type">
					<?php echo JHtml::_('select.options', array(JHtml::_('select.option', '0', JText::_('COM_BANNERS_SELECT_TYPE')), JHtml::_('select.option', 1, JText::_('COM_BANNERS_IMPRESSION')), JHtml::_('select.option', 2, JText::_('COM_BANNERS_CLICK'))), 'value', 'text', $this->state->get('filter.type'));?>
				</select>

				<button id="filter-go" type="submit"><?php echo JText::_('JSUBMIT'); ?></button>
			</div>
		</fieldset>

		<div class="clr"> </div>

		<table class="adminlist">
			<thead>
				<tr>
					<th class="title">
						<?php echo JHtml::_('grid.sort', 'COM_BANNERS_HEADING_NAME', 'name', $listDirn, $listOrder); ?>
					</th>
					<th class="nowrap width-20">
						<?php echo JHtml::_('grid.sort', 'COM_BANNERS_HEADING_CLIENT', 'client_name', $listDirn, $listOrder); ?>
					</th>
					<th class="width-20">
						<?php echo JHtml::_('grid.sort', 'JCATEGORY', 'category_title', $listDirn, $listOrder); ?>
					</th>
					<th class="nowrap width-10">
						<?php echo JHtml::_('grid.sort', 'COM_BANNERS_HEADING_TYPE', 'track_type', $listDirn, $listOrder); ?>
					</th>
					<th class="nowrap width-10">
						<?php echo JHtml::_('grid.sort', 'COM_BANNERS_HEADING_COUNT', 'count', $listDirn, $listOrder); ?>
					</th>
					<th class="nowrap width-10">
						<?php echo JHtml::_('grid.sort', 'JDATE', 'track_date', $listDirn, $listOrder); ?>
					</th>
				</tr>
			</thead>

			<tbody>
			<?php foreach ($this->items as $i => $item) :?>
				<tr class="row<?php echo $i % 2; ?>">
					<td>
						<?php echo $item->banner_name;?>
					</td>
					<td>
						<?php echo $item->client_name;?>
					</td>
					<td>
						<?php echo $item->category_title;?>
					</td>
					<td>
						<?php echo $item->track_type == 1 ? JText::_('COM_BANNERS_IMPRESSION'): JText::_('COM_BANNERS_CLICK');?>
					</td>
					<td>
						<?php echo $item->count;?>
					</td>
					<td>
						<?php echo JHtml::_('date', $item->track_date, JText::_('DATE_FORMAT_LC5'));?>
					</td>
				</tr>
			<?php endforeach; ?>
			</tbody>
		</table>

		<?php // Load the export form ?>
		<?php echo JHtml::_(
			'bootstrap.renderModal',
			'downloadModal',
			array(
				'title'       => JText::_('COM_BANNERS_TRACKS_DOWNLOAD'),
				'url'         => JRoute::_('index.php?option=com_banners&amp;view=download&amp;tmpl=component'),
				'width'       => '100%',
				'height'      => '300px',
				'footer'      => '<button type="button" class="btn" data-dismiss="modal"'
						. ' onclick="jQuery(\'#downloadModal iframe\').contents().find(\'#closeBtn\').click();">'
						. JText::_('COM_BANNERS_CANCEL') . '</button>'
						. '<button type="button" class="btn btn-success"'
						. ' onclick="jQuery(\'#downloadModal iframe\').contents().find(\'#exportBtn\').click();">'
						. JText::_('COM_BANNERS_TRACKS_EXPORT') . '</button>',
			)
		); ?>

		<?php echo $this->pagination->getListFooter(); ?>

		<input name="task" type="hidden" value="" />
		<input name="boxchecked" type="hidden" value="0" />
		<input name="filter_order" type="hidden" value="<?php echo $listOrder; ?>" />
		<input name="filter_order_Dir" type="hidden" value="<?php echo $listDirn; ?>" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/com_banners/banner/edit.php000060400000011067152453623430016174 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('jquery.framework');
JHtml::_('behavior.formvalidator');

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'));
		}
	}
");
?>
<form action="<?php echo JRoute::_('index.php?option=com_banners&layout=edit&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="banner-form" class="form-validate">
	<div class="col main-section">
		<fieldset class="adminform">
			<legend><?php echo empty($this->item->id) ? JText::_('COM_BANNERS_NEW_BANNER') : JText::sprintf('COM_BANNERS_BANNER_DETAILS', $this->item->id); ?></legend>
			<ul class="adminformlist">
				<li><?php echo $this->form->getLabel('name'); ?>
				<?php echo $this->form->getInput('name'); ?></li>

				<li><?php echo $this->form->getLabel('alias'); ?>
				<?php echo $this->form->getInput('alias'); ?></li>

				<li><?php echo $this->form->getLabel('access'); ?>
				<?php echo $this->form->getInput('access'); ?></li>

				<li><?php echo $this->form->getLabel('catid'); ?>
				<?php echo $this->form->getInput('catid'); ?></li>

				<li><?php echo $this->form->getLabel('state'); ?>
				<?php echo $this->form->getInput('state'); ?></li>

				<li><?php echo $this->form->getLabel('type'); ?>
				<?php echo $this->form->getInput('type'); ?></li>
			</ul>
			<ul id="image">
				<?php foreach ($this->form->getFieldset('image') as $field) : ?>
					<li><?php echo $field->label; ?>
						<?php echo $field->input; ?></li>
				<?php endforeach; ?>
			</ul>
			<ul>
				<li><div id="custom">
					<?php echo $this->form->getLabel('custombannercode'); ?>
					<?php echo $this->form->getInput('custombannercode'); ?>
				</div>
				</li>

				<li><div id="url">
				<?php echo $this->form->getLabel('clickurl'); ?>
				<?php echo $this->form->getInput('clickurl'); ?>
				</div>
				</li>

				<li>
				<?php echo $this->form->getLabel('description'); ?>
				<div class="clr"></div>
				<?php echo $this->form->getInput('description'); ?>
				<div class="clr"></div>
				</li>

				<li><?php echo $this->form->getLabel('language'); ?>
				<?php echo $this->form->getInput('language'); ?></li>

				<li><?php echo $this->form->getLabel('id'); ?>
				<?php echo $this->form->getInput('id'); ?></li>
			</ul>
			<div class="clr"> </div>

		</fieldset>
	</div>

<div class="col options-section">
	<?php echo JHtml::_('sliders.start', 'banner-sliders-' . $this->item->id, array('useCookie' => 1)); ?>

	<?php echo JHtml::_('sliders.panel', JText::_('COM_BANNERS_GROUP_LABEL_PUBLISHING_DETAILS'), 'publishing-details'); ?>
		<fieldset class="panelform">
		<legend class="element-invisible"><?php echo JText::_('JGLOBAL_FIELDSET_PUBLISHING'); ?></legend>
		<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset('publish') as $field) : ?>
				<li><?php echo $field->label; ?>
					<?php echo $field->input; ?></li>
			<?php endforeach; ?>
			</ul>
		</fieldset>

	<?php echo JHtml::_('sliders.panel', JText::_('COM_BANNERS_GROUP_LABEL_BANNER_DETAILS'), 'otherparams'); ?>
		<fieldset class="panelform">
		<legend class="element-invisible"><?php echo JText::_('COM_BANNERS_BANNER_DETAILS'); ?></legend>

		<ul class="adminformlist">
			<?php foreach ($this->form->getFieldset('otherparams') as $field) : ?>
				<li><?php echo $field->label; ?>
					<?php echo $field->input; ?></li>
			<?php endforeach; ?>
			<?php foreach ($this->form->getFieldset('bannerdetails') as $field) : ?>
				<li><?php echo $field->label; ?>
					<?php echo $field->input; ?></li>
			<?php endforeach; ?>
		</ul>	
		</fieldset>

	<?php echo JHtml::_('sliders.panel', JText::_('JGLOBAL_FIELDSET_METADATA_OPTIONS'), 'metadata'); ?>
		<fieldset class="panelform">
		<legend class="element-invisible"><?php echo JText::_('JGLOBAL_FIELDSET_METADATA_OPTIONS'); ?></legend>
			<ul class="adminformlist">
				<?php foreach ($this->form->getFieldset('metadata') as $field) : ?>
					<li><?php echo $field->label; ?>
						<?php echo $field->input; ?></li>
				<?php endforeach; ?>
			</ul>
		</fieldset>

	<?php echo JHtml::_('sliders.end'); ?>
	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>
</div>

<div class="clr"></div>
</form>
templates/hathor/html/com_banners/clients/default.php000060400000012666152453623430017075 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');

JHtml::_('behavior.multiselect');

$user      = JFactory::getUser();
$userId    = $user->get('id');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>

<form action="<?php echo JRoute::_('index.php?option=com_banners&view=clients'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
	<fieldset id="filter-bar">
	<legend class="element-invisible"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></legend>
		<div class="filter-search">
			<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_BANNERS_SEARCH_IN_TITLE'); ?>" />
			<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>

		<div class="filter-select">
			<label class="selectlabel" for="filter_state">
				<?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?>
			</label>
			<select name="filter_state" id="filter_state">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.state'), true);?>
			</select>

			<button type="submit" id="filter-go">
				<?php echo JText::_('JSUBMIT'); ?></button>
		</div>
	</fieldset>
	<div class="clr"> </div>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="checkmark-col">
					<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
				</th>
				<th>
					<?php echo JHtml::_('grid.sort', 'COM_BANNERS_HEADING_CLIENT', 'name', $listDirn, $listOrder); ?>
				</th>
				<th class="width-30">
					<?php echo JHtml::_('grid.sort', 'COM_BANNERS_HEADING_CONTACT', 'contact', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap state-col">
					<?php echo JHtml::_('grid.sort', 'JSTATUS', 'state', $listDirn, $listOrder); ?>
				</th>
				<th class="width-5">
					<?php echo JHtml::_('grid.sort', 'COM_BANNERS_HEADING_ACTIVE', 'nbanners', $listDirn, $listOrder); ?>
				</th>
				<th class="nowrap width-5">
					<?php echo JText::_('COM_BANNERS_HEADING_METAKEYWORDS'); ?>
				</th>
				<th class="width-10">
					<?php echo JText::_('COM_BANNERS_HEADING_PURCHASETYPE'); ?>
				</th>
				<th class="nowrap id-col">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>

		<tbody>
		<?php foreach ($this->items as $i => $item) :
			$ordering   = ($listOrder == 'ordering');
			$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;
			?>
			<tr class="row<?php echo $i % 2; ?>">
				<td class="center">
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				</td>
				<td>
					<?php if ($item->checked_out) : ?>
						<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'clients.', $canCheckin); ?>
					<?php endif; ?>
					<?php if ($canEdit) : ?>
						<a href="<?php echo JRoute::_('index.php?option=com_banners&task=client.edit&id='.(int) $item->id); ?>">
							<?php echo $this->escape($item->name); ?></a>
					<?php else : ?>
							<?php echo $this->escape($item->name); ?>
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo $item->contact;?>
				</td>
				<td class="center">
					<?php echo JHtml::_('jgrid.published', $item->state, $i, 'clients.', $canChange);?>
				</td>
				<td class="center">
					<?php echo $item->nbanners; ?>
				</td>
				<td>
					<?php echo $item->metakey; ?>
				</td>
				<td class="center">
					<?php if ($item->purchase_type < 0):?>
						<?php echo JText::sprintf('COM_BANNERS_DEFAULT', JText::_('COM_BANNERS_FIELD_VALUE_'.$this->state->params->get('purchase_type')));?>
					<?php else:?>
						<?php echo JText::_('COM_BANNERS_FIELD_VALUE_'.$item->purchase_type);?>
					<?php endif;?>
				</td>
				<td class="center">
					<?php echo $item->id; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<?php echo $this->pagination->getListFooter(); ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
	<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
	<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
templates/hathor/html/mod_quickicon/default.php000060400000000644152453623430015763 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_quickicon
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$html = JHtml::_('icons.buttons', $buttons);
?>
<?php if (!empty($html)): ?>
	<div class="cpanel clearfix">
		<?php echo $html;?>
	</div>
<?php endif;?>
templates/hathor/html/modules.php000060400000002327152453623430013163 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * This is a file to add template specific chrome to module rendering.  To use it you would
 * set the style attribute for the given module(s) include in your template to use the style
 * for each given modChrome function.
 *
 * eg.  To render a module mod_test in the submenu style, you would use the following include:
 * <jdoc:include type="module" name="test" style="submenu" />
 *
 * This gives template designers ultimate control over how modules are rendered.
 *
 * NOTICE: All chrome wrapping methods should be named: modChrome_{STYLE} and take the same
 * two arguments.
 */

/*
 * Module chrome for rendering the module in a submenu
 */
function modChrome_xhtmlid($module, &$params, &$attribs)
{
	if ($module->content)
	{
		?>
		<div id="<?php echo (int) $attribs['id'] ?>">

				<?php echo $module->content; ?>
				<div class="clr"></div>

		</div>
		<?php
	} elseif ($attribs['id'] == 'submenu-box')
	{
		?>
		<div id="no-submenu"></div>
		<?php
	}
}
?>
templates/hathor/cpanel.php000060400000011535152453623430012012 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var JDocumentHtml $this */

$app   = JFactory::getApplication();
$lang  = JFactory::getLanguage();

// Output as HTML5
$this->setHtml5(true);

// Add template js
JHtml::_('script', 'template.js', array('version' => 'auto', 'relative' => true));

// Add html5 shiv
JHtml::_('script', 'jui/html5.js', array('version' => 'auto', 'relative' => true, 'conditional' => 'lt IE 9'));

// Load optional RTL Bootstrap CSS
JHtml::_('bootstrap.loadCss', false, $this->direction);

// Load system style CSS
JHtml::_('stylesheet', 'templates/system/css/system.css', array('version' => 'auto'));

// Load template CSS
JHtml::_('stylesheet', 'template.css', array('version' => 'auto', 'relative' => true));

// Load additional CSS styles for colors
if (!$this->params->get('colourChoice'))
{
	$colour = 'standard';
}
else
{
	$colour = htmlspecialchars($this->params->get('colourChoice'));
}

JHtml::_('stylesheet', 'colour_' . $colour . '.css', array('version' => 'auto', 'relative' => true));

// Load additional CSS styles for rtl sites
if ($this->direction === 'rtl')
{
	JHtml::_('stylesheet', 'template_rtl.css', array('version' => 'auto', 'relative' => true));
	JHtml::_('stylesheet', 'colour_' . $colour . '_rtl.css', array('version' => 'auto', 'relative' => true));
}

// Load additional CSS styles for bold Text
if ($this->params->get('boldText'))
{
	JHtml::_('stylesheet', 'boldtext.css', array('version' => 'auto', 'relative' => true));
}

// Load specific language related CSS
JHtml::_('stylesheet', 'administrator/language/' . $lang->getTag() . '/' . $lang->getTag() . '.css', array('version' => 'auto'));

// Load custom.css
JHtml::_('stylesheet', 'custom.css', array('version' => 'auto', 'relative' => true));

// IE specific
JHtml::_('stylesheet', 'ie8.css', array('version' => 'auto', 'relative' => true, 'conditional' => 'IE 8'));
JHtml::_('stylesheet', 'ie7.css', array('version' => 'auto', 'relative' => true, 'conditional' => 'IE 7'));

// Logo file
if ($this->params->get('logoFile'))
{
	$logo = JUri::root() . $this->params->get('logoFile');
}
else
{
	$logo = $this->baseurl . '/templates/' . $this->template . '/images/logo.png';
}

?>
<!DOCTYPE html>
<html lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
<head>
	<jdoc:include type="head" />
</head>
<body id="minwidth" class="cpanel-page">
<div id="containerwrap">
	<!-- Header Logo -->
	<div id="header">
		<!-- Site Title and Skip to Content -->
		<div class="title-ua">
			<h1 class="title"><?php echo $this->params->get('showSiteName') ? $app->get('sitename') . ' ' . JText::_('JADMINISTRATION') : JText::_('JADMINISTRATION'); ?></h1>
			<div id="skiplinkholder"><p><a id="skiplink" href="#skiptarget"><?php echo JText::_('TPL_HATHOR_SKIP_TO_MAIN_CONTENT'); ?></a></p></div>
		</div>
	</div><!-- end header -->
	<!-- Main Menu Navigation -->
	<div id="nav">
		<div id="module-menu">
			<h2 class="element-invisible"><?php echo JText::_('TPL_HATHOR_MAIN_MENU'); ?></h2>
			<jdoc:include type="modules" name="menu" />
		</div>
		<div class="clr"></div>
	</div><!-- end nav -->
	<!-- Status Module -->
	<div id="module-status">
		<jdoc:include type="modules" name="status"/>
	</div>
	<!-- Content Area -->
	<div id="content">
		<!-- Component Title -->
		<jdoc:include type="modules" name="title" />
		<!-- System Messages -->
		<jdoc:include type="message" />
		<!-- Sub Menu Navigation -->
		<div id="no-submenu"></div>
		<div class="clr"></div>
		<!-- Beginning of Actual Content -->
		<div id="element-box">
			<p id="skiptargetholder"><a id="skiptarget" class="skip" tabindex="-1"></a></p>
				<div class="adminform">
					<!-- Display the Quick Icon Shortcuts -->
					<div class="cpanel-icons">
						<jdoc:include type="modules" name="icon" />
					</div>
					<!-- Display Admin Information Panels -->
					<div class="cpanel-component">
						<jdoc:include type="component" />
					</div>
				</div>
				<div class="clr"></div>
		</div><!-- end element-box -->
		<noscript>
			<?php echo JText::_('JGLOBAL_WARNJAVASCRIPT'); ?>
		</noscript>
		<div class="clr"></div>
	</div><!-- end content -->
		<div class="clr"></div>
	</div><!-- end containerwrap -->
	<!-- Footer -->
	<div id="footer">
		<jdoc:include type="modules" name="footer" style="none"  />
		<p class="copyright">
			<?php
			// Fix wrong display of Joomla!® in RTL language
			if ($lang->isRtl())
			{
				$joomla = '<a href="https://www.joomla.org" target="_blank">Joomla!</a><sup>&#174;&#x200E;</sup>';
			}
			else
			{
				$joomla = '<a href="https://www.joomla.org" target="_blank">Joomla!</a><sup>&#174;</sup>';
			}
			echo JText::sprintf('JGLOBAL_ISFREESOFTWARE', $joomla);
			?>
		</p>
	</div>
</body>
</html>
templates/hathor/images/admin/icon-16-links.png000060400000001044152453623430015366 0ustar00�PNG


IHDR�a�IDATx���Q�O\��S������I�m>۶m�wgv϶;�wP'�F����0ESk{
�ᷓ7~Rn�L�3:�Z<@�ą��9��b�b�k"[C���ډ�Fd��VNL�6�
r��S����n���/儞�H�'{�ag��3���RX$wS��1����v"����yp���..��s{V�����
Ǎ��h#¾���].��{�c�����;�	��"�Kz�KYy9M&3M��<���;��-o��+�#��>vvt���A���g�5L6�y*��i���rOm�-=g|e�&�ɨ��}�k�<w��O��9�����<�a���:��0��K<���Ǎ�K�s�t/���tT�{��XM��������/x�@�����IHL�5�䒙orqٝ4�V�Ν,�Yq??�͍���q�Lm�����+�r2q;�x�G<�ש��i.�ō�B�J �e��N"n�j��{yt�+��i@IEND�B`�templates/hathor/images/admin/publish_y.png000060400000000551152453623430015074 0ustar00�PNG


IHDR�a0IDATxc�:xU�R���Il���c��_;X߿�fY���Y��
l�`���R���D9��~Mb����%�揭�A�`�������6�����ݐ�,� I�@��E�k�{�O�F�������Q�<\�A~��M�]3��O�&�c��~�7�0��X
���
1�>./l0�peV^ֲ@D!�4� )�a!RT>,����s�0xs��P�@b&�&V�ү����`M���Y ��{پ��:���b��6p��TϛY��,a��@���5�NIEND�B`�templates/hathor/images/admin/menu_divider.png000060400000000113152453623430015542 0ustar00�PNG


IHDR���IDATc<p���P�BI����IEND�B`�templates/hathor/images/admin/blank.png000060400000000121152453623430014156 0ustar00�PNG


IHDR7n�$tRNS���
IDATxch��L��IEND�B`�templates/hathor/images/admin/checked_out.png000060400000000606152453623430015354 0ustar00�PNG


IHDR�aMIDATxc�	H�-�0u�����_�r���n�Dj.J�1w����F�����̂e+׼_�b�{ _����|����Y���
+֬�|��x5�lX�b� �.WQ�2����	�0y� ]������vN�������2m�y��7̜9���_�0c��/�����U�����d��G�����c����*��?o���G��	�%�m��t��V��:�6`O:A*ZqP\��P��߿����K�O�:����3�/_������96�
PPQ3�IJ��cמ����9�߾�����_�i��Qq���s�BgI��IEND�B`�templates/hathor/images/admin/featured.png000060400000000724152453623430014677 0ustar00�PNG


IHDR�a�IDATx����AD;�A!(�
A!(3333���̟�����]{]b|U�nn�{Q���Q�Ճ��>�I���{^e���Q��À�(�Pf"e�s�ݛ�'���݀��]���s��`�f${l���Mnx�����<+����-�w`�0�i�N�՞y�9����y�wu��J�����Zc-f^~�s���ׁfU��[��J������u�5ͲNb�5k��e�rp�n��(h_%�]��<r��/?2X"��h�ށy���Ǵ;����7_���|�d� ��e��yG���]�yb�;�Pm?Gg�~���z��w,<N�P���
�=@��c�*�����2q�
��!���b�8E晲���9@UƬT��y&o'�'�S���-;��cU�\�IEND�B`�templates/hathor/images/admin/note_add_16.png000060400000000657152453623430015170 0ustar00�PNG


IHDR(-S�PLTEF�
Y�.K�P�b�9N�
R�
[�y�TZ���Z��T��@��X��b��I��U�̃��c��,��\��/��E��L�Ϟ��V��Z��P��3��e��z��N��V�Ҕ��?��c��g�눵�z��q��e��~��M���ܼ����x�[���������������������������g�IDAT�=KBa���F���"
I56I���ojtp�!p���'�+ |��d�3`N���i���Wp�B�Q�nЃj+tՐ�I�[A�2�!���_W9�-d.GS�G23�����g\�*�j�����U��K�gaS�@�/���{��A_'���3��}�q��=�m���оey	���T�hv��IEND�B`�templates/hathor/images/admin/tick.png000060400000000714152453623430014031 0ustar00�PNG


IHDR�a�IDATx���@�k[qj۶ֶm�:��m�m�?�~�t�Rۛ|��L������d�o��S�A�T�$�~92=z9s;�NŖBYD���>��S���n����)�i�=����
[\��w��8�DI���� �Q���z_J)���2��G�E���Ƥ��58nZ/}����G��ݯ��Q8��;5��aQ��#���]Ь���c�v9�r��|E�w_���y�C�ӡ�S��u�9���˪�r����˳�#�3Ah���͢��K��M‰�9��.�=����n<Uy02���r��j��C�#���<�<�9���-5��	�tE���������;B�� �J��9�r��Ez�u���ȣ�H�E#ʝ����va�J
�52��qIEND�B`�templates/hathor/images/admin/sort_desc.png000060400000000153152453623430015061 0ustar00�PNG


IHDR	�8��tRNS�[�"�$IDATxc�	� ��?���3�2A �$F"w��.IEND�B`�templates/hathor/images/admin/icon-16-allow.png000060400000000531152453623430015364 0ustar00�PNG


IHDR�a IDATx��%pA��߫�*^�W�&��#WTQefffffff��j����Q�;�,����/M�R��FRW>+��]Ç�3%SǕ�.����Š�k?M��̨!o}�l�>����(PHm�:�V��3jO.헲sNs}�s��ֿ���sFl/U��O��$u��u�T�����r�|&��ޛl��^*��Bө�μ����0B�UXx��^=��X�����DՁ�u`�B+�ѱ�w@#��m+��qD1B���Ա�
w@�J4�Ǯ���'+���f&�,��IEND�B`�templates/hathor/images/admin/sort_asc.png000060400000000152152453623430014710 0ustar00�PNG


IHDR	�8��tRNS�[�"�#IDATxc����Ǚ��$�1�d1�L �d�	��"r�m�IEND�B`�templates/hathor/images/admin/icon-16-notice-note.png000060400000000751152453623430016476 0ustar00�PNG


IHDR�a�IDATx��3�XI�o�}~k۶m7k�F�:�/U��I�&���4���.g�7���7��L�1L:�?l
O���N�y��X�ָR
H��p��(�;��l������1:�/DU>w�����p�j���Q����G�b�G:�����M*wx$�	X�W��ЧD�����*�a<$�����BA(Q�����f	i�lN�)�畨PZڟw��O�/���� OC(�-""��"b��?�G���#�K�����O;䵴9d$���t�d^�۬�e���""Zd����P�&�B}�
���㚡��S)��6�W�K�����t_�����U�E��M��q��G4�\��5E�c����t""*E�z>���ʣ�&�K�?	t�.�W�5���	H��xS�\���a�)2�$`0�������IEND�B`�templates/hathor/images/admin/disabled.png000060400000000407152453623430014645 0ustar00�PNG


IHDR��7��IDATx��Ua�P��_B$TB%	�0	��	s�1C�ƫ��x��L}��LB{�fsa,O�9Y�9ʷ��0�<0�y�͞6Xb��������4,JD�'fV�d�����#�	gaxGT4���aH���Ɉ�J{E4l��
c<�
N}�o�A,��g��J'� ܣ�CiW�%rW]�w�9����'�'��.�
*�9 �IEND�B`�templates/hathor/images/admin/publish_x.png000060400000000647152453623430015101 0ustar00�PNG


IHDR�anIDATx���Q��_mۍ����ncm����;{q�):�Z{Pqj�տc�&��y��������s£�{�R|gŻ��QlxJ��A��'� �z'S�5���G\�o?�8���-�Zl���I��E��1�O�1v��J?�n�K���)����P�4��Q誻�Ӎ���1�~��|`�4o�T.��¡Ք�@'��>�{EZOF�,���s�ݳ��T6�����H�uϳ�d�rt�����Ral��+>E�j	پS~p)��C ��u�ܻ���^�@�|)��'6҃�nן����;�Z�Al�oH�ހm�~�/x5�z|�.7�7��n�Q��ov ��и$z$�{[H��Nli���OIEND�B`�templates/hathor/images/admin/downarrow0.png000060400000000227152453623430015200 0ustar00�PNG


IHDR��7�^IDATxcN�����	hJN����ߞBSp�����0�5�3w���󻙱(�ļ��`h�é�lV���x|�p�ŸU�(�-=���A[IX�PH�IEND�B`�templates/hathor/images/admin/trash.png000060400000000602152453623430014214 0ustar00�PNG


IHDR(-S�PLTE�����ţ����������𨫴������:;B��������̚����ɤ�����229��������٦�����������˘��ru{�������`ak���]^i���pqv��WXc���RS[������JLU���������|~�CDLkmv�H�tRNS@��f�IDATx^M�E��0І�L�q��/5�;?y�dK�qC����:�~�Hw!���z^M��H��c�W�M<�_� 珛BL�)��jT;Ъ9ji��E=�ڃ ��E�^!��"h�Y���k=k'j`F68X�Yv�����]��o�?�
� }�IEND�B`�templates/hathor/images/admin/icon-16-protected.png000060400000000615152453623430016242 0ustar00�PNG


IHDR�aTIDATxݐ��a�7��醵�fnm۶wr��ضm3���za5�x��?���-�X|�����b�C(���O�����+�VX~{{d���?������?y-��I�XJ��u�������Z&�[.��H�L��	(���Q�������\���G�(�?��S�=���?����ɢ������bSF�']��8|��銀��v>74טp���x�\�����lی������c�������3��;SpilN]�g
�:��7
�� ��d���ő�������4`��ۯ�}�ՎLq9���t�U�` �l�՛p��ʀV���I��HIEND�B`�templates/hathor/images/admin/uparrow-1.png000060400000000267152453623430014737 0ustar00�PNG


IHDR��h6tRNS���7X}lIDATxc�O" _è�G�O?�|�X
o<8��v,4� ���W'��y{Ѷ��Oo��4��V�� �`j8^RS�@SRRpj��t)]X��ΛD{���9w� �84�ӝsKguIEND�B`�templates/hathor/images/admin/icon-16-deny.png000060400000000542152453623430015207 0ustar00�PNG


IHDR�a)IDATx͒��`��]��ڶm�6�nv�]ߛ��Z�m����Yv�Q��y����G���Ei���:��ײ�e��37�26�T-[&a�h�����>[�G`�i�3chUc�66��᯼X�����+��G����hBzZ��P&/秵�����wy�F���-�{n��9��������"�$�l�!5oř��r�ط�8���&��uJnӣ�nR#����g�a��J��\$�{��p�N_�D8��`�8H�O�˔���C�8�@�����i7�֋�9��K�������IEND�B`�templates/hathor/images/admin/icon-16-denyinactive.png000060400000000541152453623430016731 0ustar00�PNG


IHDR�a(IDATxc�����p߀���	`��"�M�(�σ==^f$4�ix�������~����": ⱅ6N�π�_��6<qsŠ��6<�
�����������GN�x�萆����y�e��ݶᡛmÓ�8����K�]Æ��a�*Lw�k���rbo������6\3�h��d���C�;��
/��p�h�Ec���fZ�\2Ѱ�e��p�\�ᨿ'V|�ڸᜑczᔡ�c����
D`�i☾��Q}��oB:��l�@܀�4{u�8���@���u���IEND�B`�templates/hathor/images/admin/collapseall.png000060400000000231152453623430015364 0ustar00�PNG


IHDR

r��|`IDAT(�cX���b1�8W?�'��j꙲�h����jz�?ƪ������?�c��X\kpb����"# ~��@�����	`�����14���!�ڡcXIEND�B`�templates/hathor/images/admin/publish_g.png000060400000000632152453623430015052 0ustar00�PNG


IHDR��h6tRNS����6OIDATxc�����O����H���g�~�t�	�~�����r����ON�y
4��޽{א�4�=�����xA�����(�۷�(*�p��)t0�m�^X��
E�{��ٻk�o�=�� ��WK��p@�4Э@��v4;�?n�����/��h����s��
��s�����K睭*â�}	��C�@S��޼%�w
[���n�Xâ�J�;G��	�D{8ҎK%oTz��	v
Ժ+����@Tv�t۩e@Y�1
�ӿ�t�ò�����-i�<p!	i�=�ꀚ!q$�"b�=0��+ �Z^v��N�IEND�B`�templates/hathor/images/admin/filter_16.png000060400000000367152453623430014676 0ustar00�PNG


IHDR�a�IDATxݏ5RCDs�1��%���
�qwww�O6�
tg�|+�� 5��$��ɣR�"KAm�%����{�,,�ގ
 �n�D�l��m<��8z�cq�Mj\��D,��p<��qKU`i�a<>��7�f/>,�����;�ؼ����i\��J[+���=�Z5!����-�IEND�B`�templates/hathor/images/admin/publish_r.png000060400000001017152453623430015063 0ustar00�PNG


IHDR�a�IDATx����q�o��ݳ�m�6���?d�v=��]S�����;��{�9ۥ�HjҔ����BK�@3�W�栾\�_Q	>E9��ԕ�+��'����µ��$�6���=>X��k����9�si�N��q}����P�:ϸ�y��D}"]��w�^��=�.c)��(���=�&�vU�T��Y@�W���m�������s�M�����p����6R�̅���M��дwo�g��")6��q�g|��#ؽ�bą6�^
ĆUO8�/�+ۗf~��>�ZႮ�0'�"��EOm\b+�|f��$K-a.O6�M5/������:T���j�8���,��x7��gw���j�ՕW�uhC!�;B��P^g�Ԇ��N���Nܗ��!���e�����15m?�&��Nh�%}K��x���"{$�i��Zn�P�f	E6�&0�}x��F��G�����h�0IEND�B`�templates/hathor/images/admin/filesave.png000060400000002023152453623430014670 0ustar00�PNG


IHDR ����IDATHǵ�KOW����g��Q#��V,Pc�"��`�H�t�,Zu��#�UR��Q�HWi[�*
�t���<�pC1�1O{&��ئhIUu��+�9��=����G:k��h����EQ�c���ܿ�`1�u�k?�}��|������,�*cR�/W��,�w:����\���&���$���PO��.���p����5n�)loovw�@Qd@�}����۶4w�<��2�ւV�-,,�"8�@Qu-9:ha
�R��dj��P�����H̕u#hC<'��*�QȊ�"���1�s9��s0���088������[Z�aT���BGGF`u�d.d�'�3�`�Q�-b���A'4
/�JB<��\�k�����?��S����#�t�'�O�������cY�� P��Q@b�x�
�O��Ez���F@Շ���D��'Ʊ�1��-0
���ح�N	z�9LMM�����K�H�P�)�~�حT��>�=x���4ꗎj��&&rp/M�4~�u��:NEf�Q:�)&3i��Mc�F��c�!0??�>,m7[���bs�B��a|� $l,��!��&��ZV˱m��2	��i����T:�&�$S�8k+�Y�l���R�2�W��0yj���8Gs���ȃy�^�#Gy�iZ�,733s�x��������<p��u1=�@b'E݈w�omm������q
��ߙ���04�&B%P��r���C&������I1nnn��.YA���c٬�xty�J�έ;������	���j&���ԍ�Y�6H��j��N<��^]I���e0M�ض(�����h�ժQ!T��*^���`B����,?Ž-��̓��5��]F�~���y��z�N�y`�y ����X�?��

b��Gz	�φ(3�$H�p_���}�"�IEND�B`�templates/hathor/images/admin/uparrow0.png000060400000000226152453623430014654 0ustar00�PNG


IHDR��7�]IDATxc�`V�,i<�T�\���嫗�B��l���똱Hoc�v~�(�Ģ`_�p�d��Q��o��G��h
Nw����V�V��H��:M�IEND�B`�templates/hathor/images/admin/icon-16-allowinactive.png000060400000000527152453623430017114 0ustar00�PNG


IHDR�aIDATx�уn�Q�ƍ�x���>©��3���l�^g۶�:��h;��ڗ����R*p�g4��Fǭ|Va��8|��Қ�y���h�P��ڀ��fc�D��Æ���ǒ��_踹7��;{t\��y�g@�M.[�n6N=�0�P�S}(,�r��f_�?���H�;̿U[��:��&#�e9��"~�s��Q{$�􅠰#Vȍ{b��^�c�d��
�2O[�z �s��IP�W�m�n��qPү2o3m��(�v
,���E�.Bޟ�_�v�Y�^��IEND�B`�templates/hathor/images/admin/downarrow-1.png000060400000000261152453623430015254 0ustar00�PNG


IHDR��h6tRNS���7X}fIDATxc�O" Yè�����;:�hwK˖���

�jk���۷85�FC@
��t��Y��~�~,)	�zm\�K�ӟ_�<�7<��p(��w�'C%�k
�y�j�IEND�B`�templates/hathor/images/admin/expandall.png000060400000000263152453623430015046 0ustar00�PNG


IHDR

r��|zIDATxڍ��	� �a[��Z��6誫fh��� � 0�����|� �y݂4�OB���8-�J$�����~H_Ġ�R	U�.KacP��K;ݞ���Oa+P��	���r�S�5�����w��SIEND�B`�templates/hathor/images/admin/uparrow.png000060400000000260152453623430014572 0ustar00�PNG


IHDR�awIDATxc�`mzQ��di�Zu_��R��_pu5��b�4�L;e���y f&J�F�~f >��p&Q�6l��X� �Y�l���8p;^��v�<�'�����h�
��IEND�B`�templates/hathor/images/admin/downarrow.png000060400000000261152453623430015116 0ustar00�PNG


IHDR�axIDATxcl`0g�V�@�����E�@�~�Bx
�\��?�I�W[vd�4|���2@o�f >���
Ij=�
����dŊ���K��'��e@����@�8�D�e{1�
IEND�B`�templates/hathor/images/mini_icon.png000060400000001030152453623430013743 0ustar00�PNG


IHDR�Ѹ�IDATxcx��}{{���n���dR�,~9V5+��91�Z�
�X��c	T	��T�0�\���'�ț��pq�h�[�]�r�q�=eP�]�e#�)-��_�V|�6h����Ȋ�B��������Q�ޯ���4Q4i��w���3�O�ԣ����L.�d}Ѣ
�P�,�P
tq�Q��X}.��7y=���d`9^���1�o�)��->�T��I~Wj�c�y���(��V�97B���ucwZ�]�O���y˵��:(�0U�AQ�$(��N8!7p*o�v)�@Y��9�Gb���y������GR.�	�c0+��Q��t_�]�2&�}<���R%�y�*9��B��M:�9U7�9l�q����n�D��J�ݑ�����%!��9+̺�k���.�"Z�E(m1��}.7�SE����4�y8��w��<��7{��ܵ�	@ρ�$uK�5�'�R�f�Hs�3QIEND�B`�templates/hathor/images/logo.png000060400000006066152453623430012755 0ustar00�PNG


IHDR���?��IDATx��xS����S\��d��ܛv8����S��[u�5ڹ�T�:2wõq9��	I�d�v��<b?��{E����wM*�.L���2��zDgys����
��Rw�����-�CR�uZj���Ys㤒Rn�%}���Tv� ����Y�{���+_ҥ�c]�ͱ^���M$���\�oH���I�zHr�.o�<U�,��h/_��&��M�(=y@p�&}V���zD�����D�c�RfS�˒?�.M.�]�\��5�3˾FR���[`=ƛg����]�ɵ�NX�
� _�I7	��֏�h_&����'������x�oL)�{��2�n�\�H��)ۓO�d��-�H7v����
��_7�u�,��f�t[թ��xY��tB�N�Kk���v'DGI)�c0�Bl�z"&��_�?�7DXo��Pĭ�YvH*־�� ^&��90jKS�b�me7��+�{[+�k����qT�"��ЖEG��=G������
�@l�vE�1�/���0	��~܊�Z8�Dߟ`�Ggq%G�cʦ��S<Κ�7��V|���#��3
�@�5�ͷ|���s�Z����;�s�b���R�7�*b�<X��!��B�9HA�}��q��Oч�,����ǧM�q—'�xU{@hk��	�>O�e6�"�NE`*Y�8��	y��7D�I�T%Al��h���0<oB�Y�
W�-����ŷ�3�n�(�}�o��z��ϵL��8Q�q9�9�e���v�%�P���Մ��Ex���
����s6�£��B�5.����b}ijy\(<�(pK��Ax�,g��18����3�yJ��2~��M?�=y�� ��ڃ��0�<	�y����VLá�łмƱ|ӶE�n*�+j^�N
�i�� �"�������t��6�l�M�g�Nk��+��)��ڶ���:�����<>F9�D&.¾m�3f�A��R|�܉q����K�4>B)
pcx�0���E�3<���o;�36� �o!
��l8U݅0���D�
����B!�*fn[��P{S�k�����\��Q4SN �,�����_��[xIwC�Y�*��Bt����a"����p@������,��*/�E5j�3"�R�N<
?o5T�E=��Ty�����F���;���\����C5��a�5��	�U{v8<W24N���9@΄���B��PoP��"���ϡ�>�35�C��ʾs�}LA�5�ZC��:�P�
Ukp�� �Ao��oX���T��L����q
���J��qQ�:��A�GT-?V�f����0K���h&<��cCX���l����׍�ۆ�̃�أ���?h�Of�շ�,���N�0�B�Zo�����ȭ�~v�x��,��U�	�\�?�>mp\`��*��} Z1��癏�1�	ь��N�%F�2�?�.M�'����V�-�ԆN�g�CKΝ�U�-��)M��6_,d��T��'� "�d�N��W}�����k��rYM?x���E��!��8�r�@6T�	���=TM�n�hŃP��C�<;�3���h�g�$<�G����׬�g}!��>����c���VmJq�^�ΰg�:�!	Ђo&��Oۭ��7�Ri����
Aէ�t|X�=P	U�!���ʂ
��A��n�z���rITx���������ۖ=���)�-��Ӫ�=s�L�,y'���lý�[��?N�,>ߞ^�g�nZ��TN|�����x��Px�h��<�D��:�z��Wi�؀CQU�!�i&T�"����hE>T]����ކh��
���'*�LN����U
CB�"9��EI74uHr������Բ���`΃�����LN���Q{�7���b?��
P0>� D0��k1����� ��0�C����2T��o�`L��o���aE��M���OT!<?BQ�?4o��>3D��Zqʲ���r'�-Y��qXkϬ��Ҫ�P��R�!<��� :+|7��.�H�DA�� �@�3��0���F�p#���32�w����n�u"�"���L-�59��>!�.�m�y���"���3�3��7gR�"?A�"b��X ~sx�{��hI���f�ăƒC p!T�q=�6����bw��#��‰-��&*���l�3�׵�{��-���bw�i1<c�_��r&���Φ`��A�f����^7)��aspj�쥞��^�[w~�i�ma9ء�R���
�'\6�
����ZKl,D�pG)��(C�p+2�F�Ź�����T}�1��S�?�d8@�B�����5�aN	K�]XU�6|���qں��hEATxX	�!@�B�w��S���
�P�
�!<G�7�վ�Ę�y�	LŔǿ��pp�p��v�N`k"0������Kp
}ڮKe�
Hh@v{ٮB�1p�u��ż޾�9f�0��\��r􂈲�P� ���xӚ�B�,x������������@O[��"�
XfO��HB
���x����ڶtx�j.@D�r���Be����u��y�m��mS@a
- @jM*DS����'bl����3t���c�]��C1��,��~�i�����5��������1���G����0�j�qt����ð��a,v�h� ?�q�
�:}1�NS��-%<u�8U]*�>�[O�mf_�P�qB�r��p����a�}���O�%- �u�a	�K��s��G���M'��=�bۚ�Q7/a�-ިǮj*@�!�f*���G��3(�5[�g�_��',�~�;�����H������c�/l�G��ǟ���J�i*D��_�ɏV�,�Sۓ
Q"[CqY�#�;B�׺q�
����£dk��8S��X�g����/�T��Q�>�O]Bz���rDG���,��t�C7W�ts��j����:=#�~jIEND�B`�templates/hathor/images/system/calendar.png000060400000001120152453623430015074 0ustar00�PNG


IHDR�aIDATx����I���}�c۶K��b�rl뿈�۶}w��ۙ�,�U���L�&+���O'Cm�����?jnP���he�"Gf�-];
@�޹vr�!��]�<Zp9q�0����<���w��ף�{���`�@�l~FB|�����Wi>�|L�?�H�H���<y�|
P!�%E�ӳa�ݧ[�<�8�rXu�>���aݡ������/�}1�(Vy��f�������ݟ�!��d�H �;7��Ξ�(:��!�����ʔ(�m;���',���=0Bpq㱇~4�C�
���(�ō��p<�/��6�OJ������́�P�HQ�ߺ�5��e�m�r�9)�$�F}AIHsl���p��-,,��~�+ b���sҒb�J��X�0�!4��E�3����u�M�q���\������S��c��W�!T,�ĿO�R"O<7�{E��.�y����圴��S��!�I#�}S�\�ђ��������[���
��A�3f�vIIEND�B`�templates/hathor/images/system/selector-arrow.png000060400000000305152453623430016277 0ustar00�PNG


IHDR

X0$�0PLTE������������������ޱ����������׬�������)��tRNS@��fCIDAT�M�1�0�@".6&��� 궑��͖<ۢ���ʈ�/���t
��z�����,T�MK��o���7IEND�B`�templates/hathor/images/menu/icon-16-banner-client.png000060400000000526152453623430016647 0ustar00�PNG


IHDR�aIDATx͍3t-Q@_�Y}b�M�Q��.ml۶�v��u���:�'xf�f�}����.�?�x�lPF�ulE��Q��pYiw���oǰ�j�v[c)ܷ;�9*���&�y�1b-=��4���Fc�o3њ�*C��9r��m��9�g$��<�P`?���|:,���e�+�O�`�p�{�/�e���Qۉt�.m��A{S6`����|�G,��<˩�0��
��6�l.�$1��"�D�%��`1�7�����῾���z����~�U�sܣy�H/�'co�<���IEND�B`�templates/hathor/images/menu/icon-16-category.png000060400000000321152453623430015734 0ustar00�PNG


IHDR�a�IDATxc<�� ����I5`?\3a\�i���@��H�U�L����_ �R҃0`���RI� =p�&���@�?)�a�b���H�'�� X�T���R0H€�:���'���`�t�w��?���Aj�9{Ŕ<�5IEND�B`�templates/hathor/images/menu/icon-16-user-note.png000060400000000455152453623430016050 0ustar00�PNG


IHDR(-S`PLTE������E�Ҕ��V��������3���g��V����������z�����2����x�����e����N��e���ܼ��~��LGI��IDATx^]�7�0DQ�I9:��!��v��,����VJ
Þ���Aᶽ>1jc�4�!��U�1�|���6��k�!�;ή�a���1�2tW���
��_�i����;+��`q�����C��<�2Mn�p
Slr�XIEND�B`�templates/hathor/images/menu/icon-16-messaging.png000060400000001363152453623430016103 0ustar00�PNG


IHDR�a�IDATxe��,I���g5�-��f϶m۶m#8۶m�ѳ�\L�z�u�tA��p��p������r�X���}b04C�G�>��~'�D$�
(

�JSd�`��(�2S�ݛ/�����d�g���<Q���� �JEk���:�/�>���[
�
��"_������	!l�Pd����R�Cn��\�,��|�n�{&]������W��t�`EC������x�xd���n@��ڳ���c��Q,��l�b1�]��j�zBv8L���%��"�H�;�s���	�׋�nG��O�pn�BQ(�< 1 ���~��+���voii!
�4�OW6xf�Ơ_t(�8#��
n���������<��s��|d29�nn��O�*�*v3�L)
��h��6mZ
��0tJ�S�լE~�_�Ys�b���M丅D"�+�N�jT�U��0�l���^E�022²e�-W�{RL��
MU�����~��_������y\.�sS5]�$�	��$�����)�z�ɧz�i��g<--���	��1�>Ɋm��\�Dv�A���=����`����F���~y�r,Y�t�…��1s��/���w@�
�!��sν���kU&S�9c濓&M���/���U@��� $	p��𯮵Ջ�@	��~�*`���}�&Y�cJ�IEND�B`�templates/hathor/images/menu/icon-16-back-user.png000060400000001222152453623430015774 0ustar00�PNG


IHDR�aYIDATx���I��==~~om3���b۶m'��F!�׶���栧{m�~�������׊�#�o�.�j��ޝ�sw�8 �T�U��N��u$e��բs�w���_`��p}&<��L��
x��KK��3�o/}��������& *�Ʋa����6n
C>����o\�λ/��J������d-`�2�7��E	G�8��=���>{��T��o�?}��9�����p�R�n	q��QY�5d�!��wTC!��	�L��UW��w,�x�3���m�]n��
�j$�i�J�)E-����"մ�~W�����W9F ��By9x��ڢ.��bA���n�����
;�AL%������Y��7����a�n)���P�h�%x6�X4L+&6@�6��a�sxi�����K�A��ņz_׍�u�<����M/ɇ^N�
�K�/(���������h5\A���S����h,�|x��6�!_��X�~��b�@RJ@�XB�u�6:j���[�_~%��>�@{!ŝR�Wo�+
MSv�����%��B�R� 	�%���Bɧ��2�__���h�IEND�B`�templates/hathor/images/menu/icon-16-purge.png000060400000000714152453623430015247 0ustar00�PNG


IHDR�a�IDATx���%Q�7�Nv���J��k�7�gLx�m�m^dNvM�Z�۷�=;X{�~�1����Aւ�D��z�n��2L9�������0���E��I�:��ϋ�I��O���wS��FnQp�<L�� �R}�#��M1FX�#����J�r-�}n"7��Yp1�`	�hr)�&_�28��|1���ҹ0'�
��|6�2�� �vC������6�:���Z����7�qջO\�� .�*#���\\pAa�‚;�-�t�yL��	ҍ�\�u�0����bɴ=�iX���f�/�'�>'1��5ŏ[�2aG�G[��2��m��'`z�k_]"?\�"@i�#8j]C^�N�*x?PK�U��z��Ts����h�y�A�Y�~�y�r�{�~�y�y���l�w��pSIEND�B`�templates/hathor/images/menu/icon-16-move.png000060400000000451152453623430015071 0ustar00�PNG


IHDR�a�IDATxc@���y�X�e��I�*&UÈ���%��9"�-~�h��I^$���ʱ�$y�Xkm%��O+E�^/��p��Y��-�@�-H$RR�֛��ts��_@I~�P��թ�nL�� 6HY
HH/ûeb�~��O酸`�ȝ_k��$`��^D�,��\�ǯ����������@r 5@��0@��(;�ȧ��=�#v=@b 9�x,P����a��z�IEND�B`�templates/hathor/images/menu/icon-16-links-cat.png000060400000000771152453623430016015 0ustar00�PNG


IHDR�a�IDATx���@F�Զm�A�6Vm#jp�m۶m۶�9ߏ�K�zfv�x�V����)�|2:G;�Z��b_���kUYȝ�Z7ڏ���>/��ꅥJ�ȶ"��*A���u,�fl>~�T`t�B��"dZ,F�% ӢI�Y�"��f�U�*��#�<���A~)��b��J�]���9p���7�<���F&H#c��|r���
��D$d�b�!;���JH1eT��B�gU�;$v��H��!�T�TK�f�0�	! �_N�(�m�|:��B  A��F%Z����|u.�O'�t,��š(���!f���p+���}]k�}D��I�� �7h:�{^2�r�/�5�Cߡ7�=�C�0_����2�>0a�V�x2��x1���S	�֦�|�ٚ���U��|e�[i:�?��1_�yי	�N���Y�[�?��a�s�C��0G\/M��?�Y����i�IEND�B`�templates/hathor/images/menu/icon-16-maintenance.png000060400000000415152453623430016405 0ustar00�PNG


IHDR�a�IDAT8�c�����
P� VĦ�1t�k����x"�hj�����/�
��y? ٨�f�� v��T�i�JGF�wA� ^O��@���q�u���cq6.�!�+��s.�ǡH�P�|h8a�h2����B��<�hԛp�2Ի�Q�Ŗ��t�&ʢQ�r
e	��d9eI�;e��={E�7�LpŸXWIEND�B`�templates/hathor/images/menu/icon-16-new.png000060400000000556152453623430014722 0ustar00�PNG


IHDR�a5IDATx�œDq��
D����*���@�Ю0��L()A�DJ���|K��׽s���=><�<6���+�n �w4���q˿��྄��Y�Y\k?�TG��ل/;�+�oVH�yc�N�{wP9��oKpO���
���I�ݓI0c�]m�k{�rϧaW}D"zb��v��f�_�a47�~H���î6��Ph��kYr�؉�>�^���,1�{���Z�� M,�V���m� M,�V�?Q���,uJ��Чv��m1�]�I2v2_"�4o��9ê
y( �1Ӟ�����/���IEND�B`�templates/hathor/images/menu/icon-16-nopreview.png000060400000000436152453623430016144 0ustar00�PNG


IHDR��h6tRNS���7X}�IDATx�R�b�A�׋���m4q� v۶m���ǰO&�~}�>,
ŇDg6\�	�;�O���7�-���={�h�Q��p���1NBl�C�v
N�o�2��Ҽ2��̦][�Od6Xa�����|�_� ������脹H���o�1������Ÿ'2�T?����a��;2!�09�j����h>��ggg��̖�jPo1z��IEND�B`�templates/hathor/images/menu/icon-16-menu.png000060400000000614152453623430015070 0ustar00�PNG


IHDR�aSIDATx͑l%Q@�W��m��Qm�v�7��X�b5VԶ����w�Zoָ��ə73F��1f7��<z���
L�*0���n�FPUe�^7@	��L��%@��+���G���[�S�p9�A��E&�'gall�(�H8�4"!1y��@�n��/f�`���s<ǝ���r�"�q��Qzx��.8�˗F^����'�TDEǞ7����#��L&��ƍ���a00���FJ��GD�v���%	DA�7[,�U����_ �-p.\��|�I�*�VW^(��7�=N}]M�F���v�,��s3���J�;v#i�����f|j�_î����_�/���w!IEND�B`�templates/hathor/images/menu/icon-16-newcategory.png000060400000000527152453623430016456 0ustar00�PNG


IHDR�aIDATx��3x4A��?۶m���4q�h�ض���S��M��l�6�y~�y1��:Op	�B��PtH���?A�C���(ퟋ�Q}�u�`	�[��M׹���*B�z��}�T��'�=�A�I󾙍jn6�����)�S�	��G�e"n���_KN{��[���w�v���^����ʯ�%�~(�9�p�g����Z��oǻ��XX^����3�Vn�^�_o�-��]�꽚,�]х��s��
C�̲�z<�;H@�<qޢ	v���'�~��ۃ��L�_��IEND�B`�templates/hathor/images/menu/icon-16-default.png000060400000000534152453623430015551 0ustar00�PNG


IHDR�a#IDATx��3@Fa�Ӓ�5-�vSn˞�����)ۘr��K��:}���:�\��L���v�`��o6~�3�l'K#X�Z˅ϝR�K$����G��f��X�d	`!�y�����XxZH��2�_cр3F�ɜ��ׁPx���H�`�dQt�)��Ͻ�p��)�`;,����,�3�2K�)���*C���zpT�"��N�	���s�h���e�k���ɢ�:/�a��	�(��3��z3<V%JP�aF1����c6%J��aQ�f��0��8w�IEND�B`�templates/hathor/images/menu/icon-16-install.png000060400000000676152453623430015602 0ustar00�PNG


IHDR(-S�PLTEb��b��b��b��[��^��a��K��L��Y��@��U��V��f�m�u�}�#��(��-��2��7��8��;��<��>��?��?��@��B��C��D��E��H��J��L��M��N��O��P��P��Q��S��T��Z��\��]��m�����Ε�����޺����������������������������B�o=tRNSPp�������%=a�IDAT��JA�3�ɒT����
��/���X����w�i�H��ey�v�k��
n�>N�<��PUuX�ZU�ԇ�!�
��
{����U��ҟG�2$Ю}!��;�MC����U?e���C�iH`�� vm6�]^a�Z�+����@�G|U��شIEND�B`�templates/hathor/images/menu/icon-16-links.png000060400000001044152453623430015242 0ustar00�PNG


IHDR�a�IDATx���Q�O\��S������I�m>۶m�wgv϶;�wP'�F����0ESk{
�ᷓ7~Rn�L�3:�Z<@�ą��9��b�b�k"[C���ډ�Fd��VNL�6�
r��S����n���/儞�H�'{�ag��3���RX$wS��1����v"����yp���..��s{V�����
Ǎ��h#¾���].��{�c�����;�	��"�Kz�KYy9M&3M��<���;��-o��+�#��>vvt���A���g�5L6�y*��i���rOm�-=g|e�&�ɨ��}�k�<w��O��9�����<�a���:��0��K<���Ǎ�K�s�t/���tT�{��XM��������/x�@�����IHL�5�䒙orqٝ4�V�Ν,�Yq??�͍���q�Lm�����+�r2q;�x�G<�ש��i.�ō�B�J �e��N"n�j��{yt�+��i@IEND�B`�templates/hathor/images/menu/icon-16-apply.png000060400000000640152453623430015250 0ustar00�PNG


IHDR�agIDATx���,Q��^Bm�v��.a�m�|o/γmk��B��Μ��U�-��n�E��8��)�+av�Aq��(�0�[)\OZ	��;m7k��I_
��̄[����0�����#D�Aa��om��Tl�i�x�D��>�F
`�M`'���v����5�Θ��N��9�����aJ#z��������ԫ�C���4���2�aa��+OzDLw/R�{s�J��.����S���02��/�1?��N�po���y^���N=2�d��jQa�>+r�F^5*�C��^
2Zѥi$pT�yP-��f%~v�A�J:;�=�/��F�-���.5��}v�v�BA��*IEND�B`�templates/hathor/images/menu/icon-16-newuser.png000060400000001352152453623430015614 0ustar00�PNG


IHDR�a�IDATx����F�of���[۶�Զ�>���۶m۶k�7��ܦ�������.������4�[w�=�'�+��^�A�3��{�;��"���p|��[�Xv�kֶ�����O&�D�u\��2�{~i�¹ۆ����w�5
϶���w�'�MDв�#�ݵs�,�N���v� �����z^/�5Ր�~��@8����n�
��J\9��27���"ת;PZ��I�������^����_���/�ɶ)T��~e�Q�ړ�?����t�Pg�����t�����7�/�m�`l�e�L.�n���z$
/��(��?�}�A&�^\���g�}?��f4̮-v�v(�>�<�g�&����m'r�}0>iH�6�PB�2���)�e�|�gFU�_� �(��#��페B_|�пx����<�҂oYP]�)a7�v�߀e9�Ɨ���g����%v8������\���#��G��C�_|���nɇ����N���gǽьzzcV��枍#�?9�
��i��AF{=9��n?��h��z�?�(=	��{�&����T�ꔴ�@`���H�����>�]���/��rד��1� �����$	���}蓧�x?�zf��2�/�,‚�7(H�/!����ע�M!��IEND�B`�templates/hathor/images/menu/icon-16-user-dd.png000060400000001013152453623430015461 0ustar00�PNG


IHDR�a�IDATx����@F_1۶�x��p��řs��gf03�����w��o�%u��z�jP� 9�T��2!����*�� �e�C��H�B�!�1lFLʢY��~X��B(<ϿVS���(�%A��M��o�t��@�0��-���K��U��R/jV��GP� X�;�K�x�6RN),� ������tkr�R�h�����x7"0��OF�!Z�Jz	�|Uu��"(G;�z���z,��~�:�y�n��AN68���Y�LT_�Ra���}��2*'�15߁a����dA��	�p�L�~�5�9pF�����b��qҳ��.[�0��y���mGc
ߚ?V��X#��C��,���
���$�i��v�Х��~ߟ&�|D�Cc�4�E�|�*������x
��#53�o�4��O��H������5 �b�}HyTK�ZiMzH�p�^��`L��?,�%�%IEND�B`�templates/hathor/images/menu/icon-16-alert.png000060400000001070152453623430015230 0ustar00�PNG


IHDR�a�IDATx���\A��8)�wk+��P۶'ul�q6�m۶m���{�I͛|9{���M>��Ъ�K��ci_�����o�4m+�E�?�M��hU�8���Ei�5(�ٺiU�7+�dh&�,~ݴx�xѤ�#}ݬ���|���-���ͨ�٤8����t���Qz��FiDQv'_�x�)��q�T+3���k��|fG�p��U�&���f��u}n}����Ī�h���2����f�+�]�dl�}�(�v���"7<7��as��uCkM���e�\��<5�L�7'���
�2�z	��l�|�}���s�p(qv�m�Ŏ��l��s��uHtU�e�����Q&��FN��͑˦�av�����:�c�l��(�V�݉�X��@Yy�&>kB���.�d�����ۊ�9+B�u�LJ6���Oyi�WpI�^��WI��>�e�9�y������8��(����$L�
�9y��EaplY�\�7E�ݳ�R�%+������z�E�IEND�B`�templates/hathor/images/menu/icon-16-help-this.png000060400000001326152453623430016022 0ustar00�PNG


IHDR�a�IDATx��pQ�_m۶m۶m��n���ض�Mv���n����{7v�̷<��?���q\o�B$c��nYM�E���B����CbV2E	�`�?�rL
ֻ�ì�\źVH����0�/N"ak'(�vMP!���Vmh������̷����!~o_$���(l�a�졢|g��
����
s}

�6��̑��'m�
��-��(�l�[N�������>?2ńJ�#�fB����B84)7#��#��5��T��ri�iޖJ��-�Yl�������@�V�N��VnF�cY6�*B}h2�^���<�T�L�5���Rz�u"�_E�X�S�@��hu��*�H��@r�o,���4��ݣ$����~>^��~k�?��r�.݀��@#��������$��B"�CTT��������s�a��
]�;�o�L���s�jc;$��Q�������'1d�Y�hܗanj��;{5*n��Y�r���]�M�h4���ɳg�~�0[�"wo̝sc�)�.�����B6"Td�>h�y�NNNN�G��3�f�a�y	͆L�ٯ��hLhAh����a��� 毙����V�~����Õ7������VVk@�@BGON�JhD����-S��IEND�B`�templates/hathor/images/menu/icon-16-help-trans.png000060400000001144152453623430016200 0ustar00�PNG


IHDR�a+IDATx]�5�$E�o�vw����!�H�#��<"�"$����w�s>�3-,���~m��,\zo��D?���T���h��d�$M�jB�$R�K�j����~z��v���ƍ��֭�\�#%�s�&� ����\���k��mޱ��(QU�T�m���JOIFieA�v6��G(Ď*����Ma�6�Ao��Źۛ����u�{+�&t��̖5�w0���%����"��r��*t�'b'�e�Niw��E��oظ�n���n��@M�����a����b3ۏ��,iD�Ҭgx�Y��hbW=(�����UC"޺(ݺ$m9$�,�deC���U���;���rԮ^��VL�H�����]�YS
e�s2����/��$?�ӔW)�<F_˔�(��0?Iڀ��r�����\zLj��T���$�M"4�B.��`4����)3�~d�v&s4����R=K"drfz����W)+��������z�;���.r�;#yuA^۩��mw���1u�V��	�`>L/{BvN�SF��1&
�0�����T��ik��IEND�B`�templates/hathor/images/menu/icon-16-new-privatemessage.png000060400000001127152453623430017732 0ustar00�PNG


IHDR�aIDATxŒ3�o�����]Ŷ�l��]�
�Tq�q��lb�c���^�1s���<��h�.�k��	�ۨ|E�&��~P�(�~�C��Ǐ߭aÆ͛�j׮ݹ~���+**j���͛7�^�n�~�6Vҽ�u�֭WZZڸQ�FJ���(���87n<�����F��R,�b��8V�=� �W�^��ʉ�P(�m���>�f�l]^^�����.m'͟�!�p�O�~Nu�"G,�a�k�r���PRR�"��
[���7px����,4MS۴i�Ȳ̲�S�Lӌ�e��{�����k�
=-'x\�!AUՏA�u]�cYY��<Ϝ�.��"�봂�s����RKkt޼ys�R�g I���Ȝ6T8�*�T�p�X�<W�߿���<�]ב����?RfU�L�E*�����͆�j#4�2������k��'O^0`�2��ݻw�55�ŷo�|�#�&?�Sz�\&j��Z�����ɽG8!�}#��/^LT
�y�D��(5p��LuIEND�B`�templates/hathor/images/menu/icon-16-generic.png000060400000000601152453623430015534 0ustar00�PNG


IHDR(-S�PLTE̮s�������ˍ�Ύո{Ťc��Z��Q�Ӗȩj _غ{�dž��T�����������έj�՜���Ѳs�ɑ�Д����ȋ��H�������Äݾ}մs��Jλ�ε��ߢ��W�������͔�ޭĢ^��A�ߦ����Ɠ��������檙StRNS@��f�IDATx^��E�0Dј9̜2�/�خ��_>i&��'L�����4�[o�q]!����X�9_���P��b��/���2)-��hNd.��$Un�T�ք��3�q�̟n0BmkM{x���f4C�$}�4�P�U�)\����IEND�B`�templates/hathor/images/menu/icon-16-themes.png000060400000000534152453623430015412 0ustar00�PNG


IHDR�a#IDATx��5BCAE�hYk�e������p������� ��;q��<�9��l�L���g-hIκ�-TJ�!�ۙdH �[i�ƹ�r˸@�6���B<4���DW2]ʜ]�{ig&w_�X�V*��T(z�E6C��󌟟\�,�%��r�L&YF��f�}�ٜ.�P*���.B�}73�.�0�"�d��V�Q�R��P�}�ju��a��.\쑸����e����C���YJ�`��b�8�q����jj1Q`�)�2�^%%�^�ڐ{�
6Ѭ�g�J�����+%m�IEND�B`�templates/hathor/images/menu/icon-16-edit.png000060400000001023152453623430015044 0ustar00�PNG


IHDR�a�IDATx}�5�a�;�aS�#�5�&/�!�<Ýswwww����-áy�б�ow���fgaJ����yh�B�(�G��!�8��o3j�P7DUDE���5���@�l���n�}DY/Q���	S(�ZM�[
��"��+��{����O��h�ܠ�@����o(߮D޸�;]]�|�gK*�$�.凉�׾@Ƌ.�� Ҝ�k�¯���*f]�I���ګ����,E�G�7�g���`O�B��<2���x)��ȫ�W̝�5�����y@D�3�W��,ǖjoE]D�%Bo�%�v�?9G�"���7�]{��KD�����X3S�\���#�W��+y�_�/B��kQ�r�(}/ׄ$�#��D���_��_��'*��`�~�r��;Kq��7NJ<𫖿�,�R�h�3'ˈ����uL9���:�ɯ6��D(Qp�B;�.'�d���5�cL�Ñt��lN����?v,�	�t��IEND�B`�templates/hathor/images/menu/icon-16-menumgr.png000060400000000755152453623430015604 0ustar00�PNG


IHDR�a�IDATx���A����{�m۶c�ۨvP��kUT;�m۶�>�����_2qF;�D���z��W�`������X�<�rrz��T�5Cv
�:�v�/�SqS�$%����9{����_�tD�pS��6MMǺ��c�)k�$���#9�����O��#m(E�d
�t��
D"Q�djM�UI��8�K*����n���*31a�%����ʮcg;jW��l���Z�\��w\���<��l֏ ��{�X�a#?""8��u�
�s�ӡ �T�K*�b�,Z��G	���	u�S�c
�ֶ(G�Ž}��G�t��m~T�@ǎ�+Q�|y&M�Ľ{w���	�m�6�?��a���K�_���鋝Ԝ��{%��%��^Z�])����Nm�M�K۶��
���≜6��SF��$PJ�@0���,q�7X�A���IEND�B`�templates/hathor/images/menu/icon-16-messages.png000060400000001104152453623430015726 0ustar00�PNG


IHDR�aIDATx�R��q~�l�6�\SCvs������m7�)۶y�l��^��\s���Z�����~�Z�N�j��
��@��j]���y�w�����{+���\�H�U*��>�cǭTDk1"��!���1��5
d2�ہ�L���B�$DZ���|������B�L�[>2wb�����d_�"޽{w���/�g��+�$�K�ł��� J�"�!�\x��̍\us��ñ[/݁�-6p��B1D����NXXX���{/>FVl��pW1e�I�0�#*�c{�B@���.rΦ�&#�~0Q~�������J�6pK��Q��d2X�웛�s���_��Kc�
�蛗��P1����t,x]݄��i1�bB���N�tD���~�p8�egg��
�D�f��h81�Q�<46��B2����K�Ӵp��'ډ-��ҽ{�6� �����T�i���X�����EZn��'�;C'��2Pz�U,��dv��?�d�kƊ�+IEND�B`�templates/hathor/images/menu/icon-16-clear.png000060400000000770152453623430015215 0ustar00�PNG


IHDR�a�IDATx��s��PF�2�"�혵m۶����F���g�
!C��;��޺{��c}a��lj"?�UO�Ђ��z�jP^�/�$�ʈG\�s�(Y)����A=}1l�ɀ�'��(�l���W�yħO��x�g�d�\��[w��Lt\�heވ5�I��!����l��3��|�����^�ha���ˑ��w�c,ˑЪ98|�d`��t9;N���,��,�2���6r�2e�Ku����vtZ�v�:-l�DY��Ns�n��NSf[;,i3m \��6�n�묦��U�ֶ��V���i�kHd�R}��8�B�u�]�N�+y-�;�-��C:���C�fW6�=dyP��K�
��hq~�{�����۵��GV��=�9
�5z��j�UK>{)�J.��~��і�����w��ZY㿷OQ����RX��-IEND�B`�templates/hathor/images/menu/icon-16-newarticle.png000060400000001063152453623430016260 0ustar00�PNG


IHDR�a�IDATx}�3�\q����ڶ�\TI�&�Y��OЗic���nm۶w߼�_��=����6el߿��u=�%r8�333�D�'�Zii�k�Mv���fCl�&��077�(,,���V���gggU�	�ӹ���������z� ��i5�% ��`��Z\:yonn���r�N<^�?UUU���/&>>^B������EZZ�a��	����Z(�����w�n����>��;���:::$��i�gTUehhH 2
<==��\�m�V	��:��
�=���d
?�:1=�!��K��+V8���P>(�(�ń{����\ �y{�~��(a��'����V�C�>@����Fkk+�=U�B6�+@�n��+�����@ZCCC	G�@��2���٦B<�b��
��>��[0===633�x�bv��p
c���[fJ^�na2���eҀ �g-蛣�]�sN;�Ɉa�<�q	p���ː�s��*S�8#�zIEND�B`�templates/hathor/images/menu/icon-16-newsfeeds-cat.png000060400000000667152453623430016664 0ustar00�PNG


IHDR�a~IDATx��3tlA��l۶m�V�XŶm۶^�I'��2�ї���S����	�Cŭ�T9Exl��2���@�E
3�$r���%9�0�.}#
����f��1��<(ȭ�Ng�ͼw�Ez�3�9�וK��r��Υ���Ё}�-���	}�!ᎇ�ۿ�!�˼�����/_klr�ġ��6��޹��/��F�Y�ۤ`�c	-�,@R_����V�w���X~=7 x���~�z�r��m�y�p���,�٭�p�K��y~��4QK��ѿ�:uh�g5�z�
X�6��7�5z!�b���l��:t~�1]�
��*�����|�@�"�,�ұ|�7:Oa>Y��?m=?_O�Wυ���K���l<)IEND�B`�templates/hathor/images/menu/icon-16-banner.png000060400000001142152453623430015366 0ustar00�PNG


IHDR�a)IDATx���]k�_m+(��Wk۶m۶m۶mWk��Q��:��o<�1���~�"�����'i^R����°[�p��x��!m�\˦�o/����
.��}9�4A7��d�7��oq�s�v���-}��y����n�%t�CZ/�5��N�_���x�04��{bJ�!ad,��@?���8�]�Dl����Ι��%���Arh���!��,Րf�\I\��:��id��5ws'[3���E��	��i9�)f&��'*A�o�Y7/�p+{�N�@3\�z�ALF�X�@JJ����7��-Ǐ�Q��6.���xOm@�.to���&�qqI����9�K���6
���e��U!�q��=g#!�~`ў���	��3+���7O�w�g%�q�E� ���[���q��P��vdb�ʫޖW�A@X��o
X�������%���d����O�L
m��@EI�w���|���f�44�?���=D��Q_P�SAi�fZv΅���z2*���jIEND�B`�templates/hathor/images/menu/icon-16-redirect.png000060400000000606152453623430015726 0ustar00�PNG


IHDR�aMIDATxՒL`dzm�S
��l5�!۶���l�6���l��=S�{�?�S���
y#�4�� �A
��j!��L�i#� բq��k�V�n�x���[�
?�0Aa��yp����-�.�"o�_���U΁963J\8�ȏI�,�N���TR�DSD�a�U/!C��oO%��&c��k��,��/+�OOސ�8C�I��8�F��J^��c��ͩk��pD%<�c�X5�k�t�/^(�ҹ6�dx��r(##�5�ͬv�<?�{�Q<�4C_��o�m�hb�u�U�A�`��v-�?�$��Ϭ���J�Hv�8���~IEND�B`�templates/hathor/images/menu/icon-16-newgroup.png000060400000001404152453623430015770 0ustar00�PNG


IHDR�a�IDATxu���F@���ڶm۶mj��g�fm۶���v����ņ�:u*����*�MM�p���2��ʳ#z ���\��W��bH)���`z5���3��SO=�-�3V\q����$�@rֳ6
�oy��o~�Gh�0����˻m��e�s��_���J��}���M;�;�mn��O?}l>e���VY�e\y1]�
�[���.O��S�2[��ѣ��`�V^�����&��/��V��8O��'_�]�{Q���dm�XO=�������y��М�joə�u�-\�BAg��I�Ri��C�^_�o��eY�Y�E|5���
Q.Ss]������R�0��Y)������q�0\וk��(k�"t%a"�����d�&n-G������g�}���	���C�V!ްY��5�&(۬��ƣt��h|�
:����փz��W巊�e�sx�؎H�7�����䪹o��`�{��>���j�^��r�C+F���O�,5�$[w0�?���ƳU�W~����n�Y���$sРA�_a��O]��恔��P:j�<�����`(�"G�u�'�x�n9�����5%��A��%X�G�ӞP���(��z�.~2߯�`��ߤ	�
��b���/&/9��S�Q?��~��O�)I%u�W�w�=�����t�w�
ow��>��%�IEND�B`�templates/hathor/images/menu/icon-16-inbox.png000060400000001272152453623430015244 0ustar00�PNG


IHDR�a�IDATx���-W@�]=\Զm��jŬm�F�m۶m�������<�qױ�����F�1c^?nܷƍ�I&��IG��	�C��m„	3�E�ϛ�+�o��&��!�ꌙ3t�ԩ'ӆE'2n�خq�<�8N��r�$����$`�b�w�?p/�A}����qro�j�r}�����߃�Ԫ�y�Y�1�S�TQ�;2�D��~�#���9������f.���=�,6~c�%>�1� �� `Zm7�N�zb�N����-��A1�]�~�-�b~���p��|�_fr����O._�W�M���O�Dž�������xr�5�����;?|�O_���ǎ�_|>��}�O��o��"�"�q�`��E�v�䃗��OŧϾ��>��bJ���QHAHI�������a!$�E'��ߒ��K�&_�@i��-�s&�|�q�
5,Ǥd��b��PK(>��� qL�	��#a�
a�#)f�J���ڠȧ����O�3N�9�(A~�M��~F�H��Ȱ,�?1�+�\)�c�a�5 
�aP%�/�f1�>�#'7�B��9:׹?;JQLx���9�0��G�����?��O}��$�\��}>IEND�B`�templates/hathor/images/menu/icon-16-assoc.png000060400000001656152453623430015243 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<PIDATxڌ�[lTEƿ9���KKw�4-]{a-�h����k��^�!$�@$�&ĐXH F�O�-�@j�x���%bcJ��-(�t�b�=eO����~�0�ۚ蓓�df���7�7B)�i.�e#�O��X��)}�C�C�����E����{����[���ɩ
���9a�`ӟ(n�6��J�/�7]xD`Ut
R�?��y���K��>�q��U
��s�n�g(U�ε��fZ��5X��u�Wm���,�	���c�>�|5SR\�Q�w%����f,��ļ���"��R�_��$r/��w��%��nl�kW�=[[k�t.Ƕ�Z<U�zp'���W�� K�/|5!��ڹ�
�ަ_�KƎ�O��SZ�"N�ڄx��I֑�)P�E#�h���5�-���7��U=p���Y�*�䂆c?>f�K���5��W9#��7'�_� b���f5�Z����ß&�
���O0��P��k*A��-�B��`�ϐS0�,RN��@3�4� �&�qn$��o[l9xfR�Pen+s�A)��K��������r�x�h�^$�e�x\�݉ӽ���
��.}���U�j�"K1|�����I�0@m���Ȫ&�<���PT�i#��afp�ʙ\Ğ�'K1�t4���V�r�I#)o�pi�xV	+��ٿq����C!3�%�1��#W����r��*���u�J6�~��8
8� ��\2y�p�ῘD�� �bz���O$��@I$�,�н+��ѓ5h�;���F�丁�m�������9�H�G��@<'���<��k.΅�Xm๕~1���tx��q/�
UWO
�f?`~ڑO;�IEND�B`�templates/hathor/images/menu/icon-16-readmess.png000060400000001214152453623430015724 0ustar00�PNG


IHDR�aSIDATx���$G�����m���l����*�ٶY|e�bkd�;�ٍ�o��Ξ=;�~�;�?��W@�ݻw?u����QU��j��]�Ԁ�	&\�}������8-��8Θ��K�,���r�C�]��͛7o7Ms\__�|M�h���,|�L�J%�40����v��I�m���A�]900��w�N|��\s۽�d>��Z�gE��W�v�m�
aY���(J������e�V�4o4��T@��,�=V�u���G|t�z�J�X��+
|���\��:�b5���[9y����㶇o�>�FTa7Z|�m*�ƨ���#PeL�F0�>�R���Jb�\�T/��w���1�*�ۮv�3Jڐn�H
���PeJ�E&H�C��s�u
�7�|��J�te��������*
H�uz����.�@��c�B���	@6�Q�
DV����ΛX������q�f�uM!�	Z�!�Z��	���*�a�R�q�����LH$����s�e;��"nC��^�=U�x�����@×5�<��Y
t1N��~�~�(�?�͵�y(+��@0�� B���`��IEND�B`�templates/hathor/images/menu/icon-16-config.png000060400000001202152453623430015363 0ustar00�PNG


IHDR�aIIDATx��pkk��?��Nj�=�m[�c�fm۶m۶m��m<3k�.�-Z�e�]N�A��&�wVص�T��|�'n]�^��B/����9p������͇�ɪ��"��X��׊�a��X��}���o�kV�6���x]�?�	�?9�l���9��G�A⭵6����虤��Ik[�H��(b�6[�N�m����ǥv9W�J��V齧<�[�=z��	n��#�����,�k]�ر�2�)��{P$<ҳ�@�1��/Z.��sς��<�.q��1�'z���@�}$��빸B-��:� ��r�}_��t�'�v� x	,��.�+�!�־]\-$T"@\1��m�ߍm���C�4�{IIA��H��0$���{�!�/���ƥ����羶~�廒�ضwp;��yWA_!(���!��w0��O8�<��fM�#��/�o)_A_#^I��\��k�"\�N�zL���
�<����5΢�Q�1�����B�:%N���F��C�|�#�r&�荷��;	�{,��6�<B�!ƍ���_�_�����@�]�IEND�B`�templates/hathor/images/menu/icon-16-language.png000060400000001234152453623430015706 0ustar00�PNG


IHDR�acIDATx��ldE׎�ͨ�ڶm۶mԶm�6Ƕg��A2훜���n���
g2To�ˏ�*[v&(�7IA�LWii��e���T�-F��l�<�`��ӣV�J
�͠(�aU�����I�����?\J�D��p���x�/�H�	c�ȱ1�ob���T�<���D"��Bik*K�:䈱=���k�����`�f�E��Y�Ds9M8���cWe��0�V��	�˥XD�R_
V�Sq4�������u
<�:���>u�
0�� �>���޵��Vm�e�eb�5p1�epjH�B�rb�W%��V�umx��4����i��V�㨨��,�% ��
�,?�`_`%n%4���*`N�X��t�K��H�z�BŤW�02�*'B*�^�L�,Sm�}.�Yચa�UW�kJH���
�я�`�IR=�a�t��UH�&Ԛ�ף�`�M;O
�Y,�Jir7F��KDs{'4��o�s�A|5�JY�])Гy_���y4aq=Co#�)�*�T�IF�é���l�x�o�cj��͎�j˧8앍A�I�����V9W>����{��9OVX%�/���钖�4���/�����$���A�IEND�B`�templates/hathor/images/menu/icon-16-revert.png000060400000000560152453623430015433 0ustar00�PNG


IHDR�a7IDATx��huqƟ��۲�m�N'/��e7�1϶me�-�����{8�_�xN��'��W�٫�ro��׫z��s�T�߿��c\�@��{�� �%��Z(˃?b�1�Ggt�Ń^���C�v"����n��{�`r���Ő @�D����Pp���>2$x�c`��{�:��˳_HA1� E)���#����1�)A��*U��
���0�Y �ʅYA����Q�"WS�+�l�熌��z]�
[�x&�*#���W$�j��c�����C�
2�~�;?A}�d��IEND�B`�templates/hathor/images/menu/icon-16-tags.png000060400000000775152453623430015072 0ustar00�PNG


IHDR�a�IDATx���VQF��ȶm�v��F��a�{e�
Ïl/紛97{]�]
�I��ճE�?�p �WeW^+ℾ��[�!;51�%�&�ѻR�R�pu"O��C~"eF81�EC�������N�#���+��������r�t�����i;9�W���zV��(��j���X��6ں~�v��=��=q%ׂ���X�$���ۯ��+>B.�}Dv��)�G�NB���O���S}�$�3��2�_�Y��c-X��[1���Ԩ�IF[\���&o���EX$>�Z'��/��%c����� �m���e:�{=��cN����I�Zc�X��F�zUiZu���H���+�	�Y�F
��ڝE����J|����O�X�O2��1rW�Y�rW���B� Qf�s��׀~�e�`>��IEND�B`�templates/hathor/images/menu/icon-16-preview.png000060400000000461152453623430015605 0ustar00�PNG


IHDR(-S�PLTE���z��|�������������W��t������}�������������ȓ���������������丒�|�忱ݫm�`e�Z������ؤq�i��z������O�J����������������կ��ytRNS@��f[IDATx]N�@����w��S�=H��d��xUZ b]ȅqe�����?�'�i�{؞������w����Ǯ��G�n�7F����
IEND�B`�templates/hathor/images/menu/icon-16-featured.png000060400000001051152453623430015717 0ustar00�PNG


IHDR�a�IDATx��S��A�c	��^B-�_B-��f^ڶm��Km۶m���;�c#ωԍ��'H�Ph�ԉ4(9���F͙A�h�"���d.{��;7�����(���(Y#�����RO?ʏt�`?0I��(�-�`f��̓�	���x���d[�e�2ś^"��y��h�!RF��5�l��5�?
��Q ��9�b:�e����Əm~�Zb��D� ��B���Y��.������-Mґ�X�)@���H�u�4�����+���D�TFS��y"a��'��i�>��B}����4���(f��	%�����t�-&"G�/Q2�S�3T��A"B�^��X��?��4�G����'�G??D�4k��!B�`eX݀@��ES�&�a���_١���ꈸ>J��X���v��F��.لg!�m"\s�ڧ��Oh��ǟ�_I*���PCXDf�@���^x�̭�_�L�i�
�PB��+��~���ڏ~���;����9��IEND�B`�templates/hathor/images/menu/icon-16-help-jrd.png000060400000000771152453623430015635 0ustar00�PNG


IHDR�a�IDATx}���A���o}����A�3@�kH��	�$���$8$���u���B��Kp�S�:�����Ӡ�P�����.~�w'���
�B�� � j���~��ĵYH�4a)$�rªA}ߍJ��Y�TT!l�A�w�oY��	��A�74�*�187FN�d���)�1����A��񀂈���B�<;i�%s0a%IڽzK@�&��m�|�Aڠ!��N�?AX3��A�'|b�Š�T`�tX
6^�q��E��)��h	:_�ڃ�O4~	(�Z[� I�A.�5���C=�`{L����@�p���-���&������8X�*����+�Z��7��6�<�O�7��>2i�����@���Êm=�v�@�f����hd&��K�& ��KHc��
�Wލ�J8���#���g%�к�IEND�B`�templates/hathor/images/menu/icon-16-delete.png000060400000000726152453623430015372 0ustar00�PNG


IHDR�a�IDATx�͒�KBa�_"#IP
�A�
C��2�� ��h1%��jrh�?¥�����	�44B��P���wﭾ~
m�����'�SLM�FkD"�A0x��h�����=���r���۰���P*�[���~���"��A2	06f����|�[��0=]�P��X^��EGņ�U��BUA��v��v��N�:LNB�`WP�w�R&�t�A4�aa���������R���~��j�H�J��J�c�������a�zzm�������f��Ï0O"5m��fas�^h�u�#m23c�"܈T�����C���ٙ��š���/`�W"\�|�TjsƺA�CC�l��|���
��T�'1<\��m�&ݤ�O���"����E�f�E2��^��{o?�@\IEND�B`�templates/hathor/images/menu/icon-16-search.png000060400000000671152453623430015374 0ustar00�PNG


IHDR�a�IDATx����#a�����RBJH	)%���m+�mc����5��{��n��xoxxx<99�j�-~}}�gk-$�K�s�Z,�>���ذ�R���d)�X����q2���/�ӝa��
���x<�����2�����B�T�E�UFD~
x	��H�H
� =�ᑤ�S��ǿ�g
�_|M�׀H$Ry�Q`�`)�)��ӽ&H���r�0��i�UȎ����Iԇ8=���ޞ�[շ3�L0SD��D ���r{{˜��a�q{{[�+��Nc4]����X��p~~�A����w��#u'...pxx�AL�|:���P����
GGGy��#H04x�^����8==��q(�P�@�D(/����	�xV���LIEND�B`�templates/hathor/images/menu/icon-16-print.png000060400000000715152453623430015262 0ustar00�PNG


IHDR�a�IDATx���a+�q/�+�V*O)�***�R0ب@�H)�9��m�(
�d4l�v�ܱ;[�\�٦�[91K�J�y��[���O�a`mIGҗNp׌��۰�_����5�nX6���9V&>89<���ȯbn�
��p@U��9`$WS��I�h\�4�Y�	VWV�nT�$oL&}�(>//b�
�P)k4�Ucp�?�y~~��r���{�����w��.9�0X��մ&5��w��9 >|P��$5��
�����x���x�9^_C�,+AK�⋎"�rr��֎�=XO�c���eW\��agg���&��\�My�K�QU�	Ezf��`"��up[!��(�́@^�������EQ�i:vu��$�D"@�x�7�j�vo�^nIEND�B`�templates/hathor/images/menu/icon-16-frontpage.png000060400000001111152453623430016102 0ustar00�PNG


IHDR�aIDATxu��A���}�{�m�n���j[Q�2jP�1/F�g��;�j�3����O�ݙ��J�/>�<��vOE�dY6-�/_�1�l7Õ����B��$I`�&t]7v��C��\vF�1N�4'K��f��U���B8>���6�z�^�D�<݂�<\�&6�P쏱S�1��~033�}��T\\�����i��O���X�b�Ν�0\)
&N��P`�G"ꁊ�nG{{;"���v
===hll?�\.�i&4d@j�D�kb^�7��+�F�*Rؙ@(�:��m�,�Ǔހ�}O_!�U�C�� ��Jn�ڃ0k����6����[�Z'~�!$�#a��<L��=MRD�Q��E
�P�(C�14f�=z�d��nj�%�W�n~SW�t�sz�\L����*����8 ��~H�
�I�NeԺL.�HF �����ݫ�$�;�z���Lw9����=��
ܙbX2�=l�����gw��X���cvF�L|d��U�E�myIEND�B`�templates/hathor/images/menu/icon-16-stats.png000060400000000416152453623430015262 0ustar00�PNG


IHDR�a�IDATx�n���ho�#�z��u�ڍӰv׶m�g��p�[|��<O�S#�|n���3��D��=%�q~G�RN0��G��R���ڬ`���}���'bP����e��{����1\.����]�[S�N�	J%vi\;)��eH��Pk� I6�
5ܶG�b��R �N�����	n��0��dw�@���;}$�ϫ/&��9LdZ0nR�IEND�B`�templates/hathor/images/menu/icon-16-help-docs.png000060400000000746152453623430016010 0ustar00�PNG


IHDR�a�IDATx}�C�%W����u������O�U��X�Y�gb�N��{��>O��U�y?eq淫��x����Yo��	��Y���[q0�iAH6�鹞����Q�����U�J՜�q
�s5E��jM�L/�U�θ�Z:'!r�u���R5�\�Ȝs�
}���|��N4�Jiy��~+��Ko#�P�~cr�KN�c����fEY�ew�����[c[�ST��"��������қ({�w��c[��W�;id���4�#M Tm�W>@�bC�	?5Ŀ8�]�)���b�s�-~B����:���
���G�\|#1&���͏�jܬ+.��
�<�G{��I	S��P
�Ě��}E��&33�ʌ�FȺ	C@L' ��'OjNj��� ��0���`�N/�lE�+0^�$�V��i�IEND�B`�templates/hathor/images/menu/icon-16-media.png000060400000001112152453623430015175 0ustar00�PNG


IHDR�aIDATx��5�1�{�xfff>�L��V᤯�]y��}���N�0�13����'�VU��O�}c�]��̿"D:s�%�!P����x������%%%�������=J�!�%=z�Y(@��������Db/>�y��$��(��q���-
,�$bD�޽{��߿?���}�zb�t�1xKς��}��H$�����G��}D�(��X�zA�D��JW��$���hO:��,�H.~[%��b��b1�{��
�0�Lf��~�v ��#����bRJPʕ���vJee%�JK��Ո��*��Y��5,BtKK� 7��XE��B�+3���+p�466���h�gL���DΏ@���A(�����d3[<���>��!�%����n�B.�&�E5�S��X�t��XhDa����'�o׬]{@�.3�h��� O�cڹ�\�	���ư`���[J��w�\*�z��ܼPQQq����,���y������/��p?��>IEND�B`�templates/hathor/images/menu/icon-16-article.png000060400000001005152453623430015542 0ustar00�PNG


IHDR�a�IDATx��E�QD��&1K[��x�Y��s4��k�#h�13���MΪ}�1#*>U�_���Ʊ�4}��6GlK²��p��L:!��l$�����$I^,�K�q�B�����\�`�p]�o߾��h�Ç:Rr�{
�_,��W�����8�Mҽ{�F����f�Õ�s��A,I�LAGGG�<�+W�l��L���o}.�,,ZV;���q�ڵ
�t����8��L���M;2F�J��pQ��	 �҅�&s��EY@>�_�~�6y?We2A��N���8�5@FQ?I��3g���A�ԩSR�7xc�VC��`�h��Q�Z�jQ���1�^"##C���#Lw;#R#I�.�Q#e�(�˰X��I�
S��
�DS@����x��-���6@|�WS(��}>2�x���?Ӥ�-�cۃ�2VƼ��{��c��EYہMZL;Y�	n>��RL�IEND�B`�templates/hathor/images/menu/icon-16-archive.png000060400000001015152453623430015541 0ustar00�PNG


IHDR�a�IDATx���A��g3�b�a۾�Nژu��E�ֶm�g��鷓��f��%��p��!��T�Jd�̐�&7F"�aیs�Cv�	G�������z��/_�|Ӧ,�%��ݺu�]�v��\�r�3���xmٲe�a�)&����+VB�4M
���ә��(�4
2?�GGk���pC@�~���Y����
�X4�H$,�������F��6;SHm04<]���P����~���܅�	b�wY�N�B���j�X�ԤK]t]�w��~�#*�?}��9�4�
#�;�\˲`�&)��deqq����tÈ�b��C[[O��b��d��i*��6���a�3��/]t�Y�Bު���h���jAV=���H��M�����B2��璘a�1aT��E�3
���^,�����?���b����U�>}�I/V�	����R�0�Bj���������/�����$IEND�B`�templates/hathor/images/menu/icon-16-plugin.png000060400000001066152453623430015424 0ustar00�PNG


IHDR�a�IDATx��t#Q�s�E�I��m۶m�<Z׶m۶m��qk�h��<�~��*oo�M�EE�� j�L����Rff&232����h,�"ݢIҏ��x�<�M��S��<�������J��]]\d�"�TXXxix8� �HӋ
A�V�x�@�ŵI�餧�#7'�����A��Pd��d��C��8V��D/�u}j���n���hp:�ȹ�b9��P�WU�lT�5S�8x!�!75�vrt�d��pH��f�Y\k��k��Y�gH@�7��둠ӑN��>�$�i�
�ʂa�
�yl���Yu�	\)�Z����쮰H����	v�ZT�PQ��
��>��zǺ��n�kPw��vI�i��Y�D��(z7-?�=����`Is��C��k���|Th�G�ɨ�@A�'
��Q��=,ͺ�	��o��A�m1�Dh�'�L�W�'�O�!�p�f�Lm�+��җĢ�w�K�m��HcQ[�d*?��0���l��AIEND�B`�templates/hathor/images/menu/icon-16-help-security.png000060400000001162152453623430016720 0ustar00�PNG


IHDR�a9IDATx}��%g���ܝ����n��1ڰVԠ��n��u���m������r'Y�����ɉ�����@�RҊ,�_'�$�+bi�A��,��"{����Y�
����b/p����k����~*�����Js�F���UU8�������uǝ~���NJT��'���,W�f����ʇ�|��_qǭ��庫
ox��{o2����D�ߣ��ʕ��U8�*�$�|�AQXL��0�����c�cO�.�{���Ċ�Ysr9Q�X�,V,	!-�G�)��2I��/}O,+,�	�+
��4ϒ˷W�w0��4���	�<���VV;^ ,���
3�H][[��8C�@l��4�ʚ�[�=�~��8���!E]��m�.����߶Zv�q��ːA�3�w���&�~�	9I�$��_[4u4���
B ������]|��ύLO��,H�$��y��'k�+�׬E����o�U����.��ۂP�$a�4��N}��h��Ԅ�vk�?��
l�(<�~R�P�Id��V�0�>�?�SQx̹R�j���E;��q��#�gp��bIEND�B`�templates/hathor/images/menu/icon-16-contacts.png000060400000001405152453623430015741 0ustar00�PNG


IHDR�a�IDATxm��.G�=��m�b�F)�m���6�m���6>���C��-��>W��ZF#&m�P��@4�#�šy9DVv
?�,�O<xw���s���Y"���߀	~��h�XY�ѫ�Vu~s��-�C��uŒ���e��"0��%�o��k0*��h��t"� �bU�m�3�h﷋�B	
#�>1�`96��@���X�~��ǎ�#�����h�z�tT)������t�㴷j��S
�Y�b�ꦦ�ҒRZ�����=��W�I�g�t���<"s���&��k�ֻ�[�/#Vh|�>��AN�&@���V��x\��ۮ�F}��3�V4�a��iD([�r2�X6�����q�p�'U�����Ur2rQb#���<T���~��y�}�����F{;��Q�_����x��F�m�Q��2B|?��;
�l�޻lX7��7��񛯼ޑ��c*�~%�����"��Z��Ж�rȆy\�a���y�����������Gf�_f<����}X�J v�M�x�8����
H��{#�Q� @�*+���(�@����}�8�F�٠oR쮟�}�#d��;�U���Z�m�EP��faQ�������3��n���p�@�'�\ј���R'�s�#��y8�]0����߆�"��y�&#W�X��p�IEND�B`�templates/hathor/images/menu/icon-16-help-jed.png000060400000000701152453623430015611 0ustar00�PNG


IHDR�a�IDATx}�E��@D�&��̸��f���|�^��ff�ш��.QEL���eVV ���k ��R���m�[N2���X�`�s�zo���y)��ūa�J��B�)4��(��
���B1���CL'50`=������`RN�'��{����K}k��g�b0o1l8�<��[�g4oT9d���E�y�O mH��~�x�k��^�� ���z�o��]#�7���?le
����![B��oa�*���p�
}�FNA���cݨW(�@���9�}v�l�㫁�s�	X�[w�B�
t�
�=m;�bxs�3�~�@�n�>=I��~��������%�&qUo���o���������/73\��f���Z�IEND�B`�templates/hathor/images/menu/icon-16-calendar.png000060400000001044152453623430015673 0ustar00�PNG


IHDR�a�IDATx���\Q�
�6c5��FPیj۶ֶm��[������I��3g�=������G�pDp����[q��<�@^ٟ���S^��C�f{�	�ӌؘ�{�2L؛c��t�`j�b%8V�Ɂ��zV����F�(xA�����]�=��`��9�"�,�
L�����z�4����i��
�ᙅ�2���AKKD"���h��l�N���ӌ-���{'�#�؞�CKDX�,��H�t�������f��E��/?�횄f]+�{�~Fs�#��e���x��j3b�=R!VRx���hԘp6,���sқ�>����y��lƗ΄�Q��'Qߝ
>���/:3	3���^��Spԑ���kBLYN� ��^%Нwj!e�Z-/��
`�j)�L:7}p%<����{�ϑw��MȢ�T&�2a�̿��W>YzՃη����"�\sECC#�������
TW����b^���䚑�����?���1���K�!�iPc�IEND�B`�templates/hathor/images/menu/icon-16-newlevel.png000060400000000641152453623430015745 0ustar00�PNG


IHDR�ahIDATx���a��SD��6��ڶ�j�f\{m۶�k������o��ϙhH��7�c_~#�	�ǎR�ڗ�d?�['fl'q
v[�
�?B�z
!���/hp=�����OaP䦁�z���3Y�ƨ��Qk���Q�;'-���A�_�_��9B�d�ِ�W@�
D��JT��?w� ����OV���?k��!?���{l�E�rU's��!q����>�*��u{
i�J˞�BRp�0��17yd����)L����+}Ro��Km�nY*��H^0�5)���x75�����P��lɫ�/��R�ڠ�<�AKi�G�ZzHR#o�2ha'I�9�u[����5��^T2}IEND�B`�templates/hathor/images/menu/icon-16-unarticle.png000060400000001220152453623430016104 0ustar00�PNG


IHDR�aWIDATxeS��P=�{��ٶg�p��9��d�g۶k�l��g�}���iNy﹬���
`J�Z�0����p]�m#�!��ϵZ
�BCJ���	�@�B�0��~s��`�a�рa�h٢$	�t����8�s�d����ڴi=��}H�q��ix����,2toYR?3��-$�q��%Y~YW*��d�m�}��m��C�l6W�(-�Ȑ���}B����D�Z=���gOorm�Ay>=�r��.�:
Ţ���'56��[�n��R$�w���Y�3=;PtE�|�JO"��@�۷������;����_-,(�T*�T25T~���c�Th�lЩ]j��KK$�:�O�>#��7o#����W��n�n�o<��wy�^��RM�ԅ�ؾw�M��ڀ�R�	Ժun����1jh_\!�{wc��Yضs#v����`�H@Y���na$2���އb�����h�!X�r�����P)�i\qx���02�-�~�L
ǥ�����x:��%�FHk|�A��D�>�%-���/�����B��O�]���?�L��@�XP�D!��v�j"��4�<�EIEND�B`�templates/hathor/images/menu/icon-16-writemess.png000060400000001162152453623430016145 0ustar00�PNG


IHDR�a9IDATx�R�A�mƵ�X�]�n�ڶ~�>�m۶ξ��3����x�fG��*rs�QQٚ���}�X��|Wȷ�G�bcQ�Ԅ꾾h�4�uq'�dr�YYYHJJ����Ȉ�����t�2VA���J$u&''���
ҢV<W�����o���eD��vƍ���0��N��^�ǻ�V���41*�|��=��j���+�>�8k�h4�S؉׉�Ȩ�Dee%�B��UA.oT*����C?���П��qԞ��d�@�����Lbbb�����������ۋl�mXbǡ*�
�م�b�h4���A <cH`�i�t3���|E�(��ܸ{	{/���$���;]�ۘ!�J�
F�Χ�8�.n�d�}
q
�)��j����z
�M���\ETii)��X��<�MDVY-c����OKB쉌�|B��e���			D{w��������U����v��O��,�g*�����k���Ѱz����/^����K���L�q��5�m�D��p8���&�4�Mt��b������ݾ}{=��m<
����7�l�>dM���5�ZIEND�B`�templates/hathor/images/menu/icon-16-banner-tracks.png000060400000001001152453623430016645 0ustar00�PNG


IHDR�a�IDATx��p�A��Mmk�Am۶m�vl۶m۶ms���8�=3�[/�ϦM�����P�fF�	��+���=���{��{f�n��(����M$Rⴣ� ���ƺ�?]�̃Ρ�����Ў,������-
�?���S/h���4}� �*���>9��ц}����Q�@��i��'᳾S�~�����mr+ƛb�u6ix�Q�L��q%x�:��,
N7����|L��Ě/bݟ�y�!�w���s[�
���S/ƙa�U.��e`��n�*⋶%3���X�b�A�������&|L�����?
�1I�� ��f�E����L�I�h��齷�7m�Q���1����k��%�b]���'r*j�9�G��'�ur�����c#|��t<�cᄱ��}o�<{�q?'�Q13�ܽ�5��H'��##��)D}m`IEND�B`�templates/hathor/images/menu/icon-16-upload.png000060400000001171152453623430015407 0ustar00�PNG


IHDR�a@IDATx��Cp�QǓ�ym��v��am��mm۪m�6�k�ַ�LR͞��y~��G�S�#��ڏ1���_Ǭ�8�o	����R���V��fc�F���QD��PτG!^�T���3l��QKH��arߪ�S5w�\8`�:r���&�(�P�Z>}���|���f#z��>�C�l���������<���\L�����T����6�{�Ak����[�jaCQ�@�pf�FHT��J~m�[����p�g�5�����x��!f���p�c���,?���PT��Z‚�e
.���t�v��(��bBwׯ��A����y��5Q
W��`:�g)�sC�p�m�Qb�O�φ�9�b�r�LV�(�sC��8�6�P$},�fC�o3q��~��ytw��p���@Xf ɓmQ�XB�ƂS�KtX����&Xh��in2!LeA�΁2��'ӖG��:G��ia�ۄ�%�a-I��;W
^�������bu���+K��9�I��7ِ&q!K5�{��i��6���d��V�L���l��,�7�L�cE�2��� �5	���fdϟIEND�B`�templates/hathor/images/menu/icon-16-groups.png000060400000001434152453623430015444 0ustar00�PNG


IHDR�a�IDATx}���V���Gwߚ?k۶msP��rT�|�m۶m���Mr����c*�ʯ��O�D"G>��������
�O>x{��o��v����.Y;�F9w�rҤ�rĈ�B~&d�ɪ����%�u☳#�/:�4UEU,��;���F>����j
�PXQ�o�@=��s;��\��V��hj��jX�~3��S� ���|����ӧ�=���&�:G� M��0��
fG�E?��]V�&VXBII�Sa+w� �~�H$@��䟎�h��v��ȉ]�_�E��)�d�Z��$��jϞ=O�����HdKr��!�0�]I��P���짵����N�H����i�eoSp�7�b%�o���F�8�]�h��5MN=g$J���G�f��<��XCr�x�7���匕��d�qVԤ� )%���ڵkg�
-)ZC'�@
�O��\M`��԰���&-����mحz��4��)������GUk_��8�$��\��(2@�#�HI�kY�髅:�	!����8�bJ�,����=&�T!}��(*Rl�������߿�]��ߚN����c�hl`G�M��H�����
�ی���nݺ�E��0��ӥe�y�l<TǮ�f��mY�ƴ�Y�6|��}��ݻ_7`��UÇ�cƌ9�Æ
�a�K:v�x����?��Ñ]�v��g��/2�:jw�	~6f\�F��IEND�B`�templates/hathor/images/menu/icon-16-logout.png000060400000000740152453623430015435 0ustar00�PNG


IHDR�a�IDATx��EvA@�@��r6���G7�.ޅ/�Z9����0s"���Sﵰ�I���-�S\~ *�����ex2@�>���g��d���ѣWij�'�u!`t����5kl��
�<�*�0|�
�_����p��Ok�jm͚��(�8r=�7o �LFF��G���5��ۭN��4@�wO��Ϟ�ښ���y�w���H( 7�9�S����0lm!�z(�9�#��������	(�wwk�����ؿ��+�:hp+�e�������6�<`rB�� �M�E(����#�R��b�P����,Co���ׯ��-���jT�<\�X.;ڲ
�p��F�ú���ż#cX�ʹ<3;kf�|��(�ʋ�2�lC\+�Fԁ1�~`Y��c��(����"IEND�B`�templates/hathor/images/menu/icon-16-banner-categories.png000060400000001073152453623430017514 0ustar00�PNG


IHDR�aIDATx��l��g[�̶Όg۶m��4�_m۶���Kξ��Q�ot��C\��tn��{9V9{e�#�:�l�dH�� 2����9���V��
q2�d�>�r�{�T|�ԙ��cUL��ٲ�	e�w�b����,l2ոg)���",�K�������<�?���h����υ���4���8��f�[2OC2y��
���a��m=��뮟��\h)�L��c�@i4����3�T���p�,yD�_9
i�H[܊�d�Co���)bc�^�T^g�9�gvѸ���^y��*p���^�k��$�f�<�k<�J�.�cG��9-�a(�K�Ù`5��
y�B'E�Ef��bD!	H7�tI.n^��+�m����t*.���O��7�'(D�+��Q26;q�O�Q~��)��h��Ө�|}ݑ�荢S�;��Mx��:��o`6m���(V����t!F�����O�(�h���eu���"�Y�l{IEND�B`�templates/hathor/images/menu/icon-16-help-shop.png000060400000000772152453623430016030 0ustar00�PNG


IHDR�a�IDATx}��.G�߇ڶ�VP3�zc'�yㆵ�g�/|�Q۽��)v��6�3<e+���UXO:_��I�_�ɗ�h���}!MΗ��s^��4�Q���@y��Ս:>��w;���I�I���P��#�3���9�?����GSy��/���]x���7��)ͯe�������t�T���W����S~L�0λ��6p�M�X4
:�����7��L�
�j����t9����f�3�q!;
��^^�+���n?ȰÃ/CfN�������D]뛜���r#w=�ꇘ4�CR��J����e����q�p�Ť�z�s�l+�ԅA�_�ifg�}��Q��J��O�z�a�[�y�m������᷸��?��A�f���>����'���mO���?����q�b�D~P��:��ר
�)a���F��f<�3
���(�IEND�B`�templates/hathor/images/menu/icon-16-send.png000060400000001052152453623430015052 0ustar00�PNG


IHDR�a�IDATxݒl`��`�m+��[�Eg۶m۵{�m�g۾����
g/�����?����	����w�D���XTT���
���A(�gz��.���b;
P]]����d2h�Z�F���#���*�(�Jh4�z�'������Ӥ:\��ƕ�"�����k+(�H$-��ϕB9=l6,}ƿ��t���$���� *��<�&��F`�� l����G�j�"��F�Β���,�/���%Z��]H��555\p�k,|��a�L�eW��Ù����rp[���Ԣ.�Oyy9o�mT&�|�Ç�l<Im��xl���>Fs\f��MD��&��6%�OJ!J�Y�6��i	l7�#̈́��*T���9�r9T*_%�n�n�n�co$Z�L��X(��A��Q��mț�A���Ħ�:�t��7,���NX!�>&������ۆb�M�̅we�d�egLb�쬠�7ccc�?a��K<!LIEND�B`�templates/hathor/images/menu/icon-16-massmail.png000060400000001264152453623430015734 0ustar00�PNG


IHDR�a{IDATx���[�g�rm�^�c�Qݵ7�۸��6�<۶]�u�ٻ��;�dj������Jp���a�������W�;�����l*))�������poo/�q��rss����TTTp��|��5e���I��d����"���������B�,��aYM!����j�}hh�8
 $\�(J,
9 �L&C:�F�uL�İ!�dg1�4����"����199I,���{(M�&QSS���~x�A��`�^�
�Ȋ��񦪪���Q�L�e%k�w��O��*��@,��z}��� ���`Y��333Ε��T�"�gɪ� ��S�$�uq�+�(����9�YŠ���
٢y۶QB����Ќ̀m���5��T��{�h�F<�֮dѾ3�$��o���&������_�:�.�
��:�=��;��k
^N��$��w�[�klsp�Կ(XX�8m���i�[o�5�\ɐ�O�VZꏚb~�5���-��=�K;p�$�(155u������ܪU�����N�MF�-=��rW�
��jo�}vtt��ŋ�e���Q/��R�������̙3���ψ<�0\�v��@Rp�|@���a]9�b^[�(kCa�4IEND�B`�templates/hathor/images/menu/icon-16-module.png000060400000000472152453623430015413 0ustar00�PNG


IHDR�aIDATx�RCb�A�����r��m��5�m�8��vq^��l��(�X���%�btl��X\Z��66�����,�@��@���>;0�JU�����I��/bye
�G89=�����������P4�:�t���۔�P$�d*�r�� H
xA�SD�bQo��/�p��pyǺ����nK�_���=���-��}=�K�#Z��'V���ԛi�B1��{ǻ��$�+�D*K���#��
�7~	Lc�IEND�B`�templates/hathor/images/menu/icon-16-puzzle.png000060400000000621152453623430015453 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<3IDATxڔ��+a��Y�
�p��p �Z��&���){�C9H�q�"�v��ns��lj�x?�n}M�z<�jf��;�g����y�c1�P�&Z��k�r/vэi�][l����M�+rr��������5�m~�u,����<vp�A4
0�u�ذi�޲��Џ)�����Qbg�G�N����V�e3f%`R�T����2p�Oy>�*NTM	R�?��cٹGr��0'5id�Ι_Q��U��au��&0�5���q|/dwp#�︕���C�}'�F�RZPQs�蒀�[���=E�vu�IEND�B`�templates/hathor/images/menu/icon-16-levels.png000060400000000367152453623430015423 0ustar00�PNG


IHDR�a�IDATxڥ�!1��Ѳb���E��v���G0,�%�Y�kr�`Qa��'���+�>3�����7���ˈ�/�3;=`?P��i�Ȁ"D40��$P���s!k7��R�
�I#�%`�F�q��p�)я��o��p`��k,��zPC2��wԒf��U��YoUy��:��A6$��1��K��nIEND�B`�templates/hathor/images/menu/icon-16-download.png000060400000001054152453623430015732 0ustar00�PNG


IHDR�a�IDATx�����A�_���!LB��!lc۶m۶m�fw��9c�w�_U�E�~��3U�Š��V7�j�,�n�i��]$p�H_R~d��;�l8��|ʜePƼ|P�ڼ�V�)�O����&E�6���]��`��qv�#�y���h��]XTCQz�@oQ��Ay�|�
LY}��h�)8cV��ݿ�.o����%�Ô܊��&�d��[���zF��JY��;b��:|D4�$#YMw��$���
�rJs��ē�d�w�Q�s9j�׃��+|�x���Z|F3
����T���|D4�$#YM,��>f쑂�@���w3��\8�3�M<�h#���n|}BPk�>j���_ȣF�4L.#�e��i��U@3�1�m6�[�AuC摝|Jȫ���C:ȭ@4���a��oU }�#Ϩ�/k��h�.�j�ެ*�bh�a��_#�^���*��?z��&�bX��2�z��G�WN!�$��o�ɔ���qBIEND�B`�templates/hathor/images/menu/icon-16-help-forum.png000060400000000704152453623430016202 0ustar00�PNG


IHDR�a�IDATx}��P����ٶm��\Z�eײ�-���)k�m���s~�t_�:]~�A�G�'�QԺާ��T�X:��FXH��5ܼ��G��38)������z�n���?��Z��E(��TV�~0|�\�h6~��W�V��#��?�������`I�s�����^�#��Sc�
�p !V@f�?&m�{��YU��{ɪ����Ƶ��~�$H�h#�%��)A�(��y	�}�,o/��5��-ZsɃCm�.������.��3����Z �5D���}��Lޡi7�J��.�Z��C����^�H�>ܾ
b[֖��'� �
�n%�"�eP�:H`��Xq�$�C����@�S�qgp�Y�a`wy0c!��WIEND�B`�templates/hathor/images/menu/icon-16-help-dev.png000060400000000750152453623430015631 0ustar00�PNG


IHDR�a�IDATxe��Q����nm�
k3fc�F\#Vc�1ڠ�j�am�k����E_z���I��G�	-5K�Kf<x���YTI[���q��w�vv� ��(��#����}v����!kx�h.E��wn�A�Yr�0�vB�B�D�&��H�̆�%M=C�
���K`�x����ҧ�:��i7fL\���5v�3W�6�^A{)rM�w�Y�T	��T���u���	�MȬB7x���!턟��%�|F̀����D<��R^ˢ��~�ĥ�����`�>��
Ư���_�ni���{�M=����[��	K��a$���R|	������ϛ�x�f��Y	ufz�{���Rp����#�N�}�f(�T���	��&|�h�DR戮����W��5�s��hD�
}�d���}0ޕ�IEND�B`�templates/hathor/images/menu/icon-16-notdefault.png000060400000001135152453623430016270 0ustar00�PNG


IHDR�a$IDATx�S��Lm_�qͱQ�n���7��Q:g�Fζm���ח�8����޾M��@��Z�(Ǜx������*�8d(yp�d��9�,�H �Clal0�R8G8�j�o5���#�s��>�_6�!�a{dNd�D*��"��r#�<#���/�������XV�@D�Fz����t�vi�:
�t:0��7�+M+KK�ͳ{����؇ۯ#�(����!�
X�qA���J��M��z�������'��@8�9�ˏ)�dM�T.�Mr%�hT?�f#c���Q�T�K�˞_S'��2�
z�zA���XE�2Z0"�>�l��_ �{_PjP���(��1�(��%9n�1���BH	�B�1�������$X|�R�/�ŐP�>:;��I$��t7��B3B}$�sȩəG2�4
��┒���V
��^��ܚ��!���%�Ŧ��&E|Al�[��Y��k��#���'�&���������ƽz�����y��K�Rdy���<���ⳋG�x���
W�]9��������XQQ�IEND�B`�templates/hathor/images/menu/icon-16-checkin.png000060400000000714152453623430015531 0ustar00�PNG


IHDR�a�IDATx���@�k[qj۶ֶm�:��m�m�?�~�t�Rۛ|��L������d�o��S�A�T�$�~92=z9s;�NŖBYD���>��S���n����)�i�=����
[\��w��8�DI���� �Q���z_J)���2��G�E���Ƥ��58nZ/}����G��ݯ��Q8��;5��aQ��#���]Ь���c�v9�r��|E�w_���y�C�ӡ�S��u�9���˪�r����˳�#�3Ah���͢��K��M‰�9��.�=����n<Uy02���r��j��C�#���<�<�9���-5��	�tE���������;B�� �J��9�r��Ez�u���ȣ�H�E#ʝ����va�J
�52��qIEND�B`�templates/hathor/images/menu/icon-16-info.png000060400000001034152453623430015054 0ustar00�PNG


IHDR�a�IDATx��ՑQD��6�
aBP
A)��eff.3333�Hff���h4f��T���_pE�j(�/EˣHt<�D�S���>]� ZD��=ɗN~HC@C�7h{D4�����1�
~�����|�"Rx��<Rv�Qk>�9#���LƔ�&��y��Z)�H���_�ͻJ{�Q�%����[w�@��c��Ȱl��g��O�Q���'
7UfY)V�S�O�l��wL�N�����d�j�`���2�� �f�?sBA
��Vn�6ar6��n��J�OP��
�xN\�r�\لɔQ�a��e*���A"e��M�ֈ0�o�8N$�1�̟ܧ�9@[���Tf�:E��t"L|oR��E�k�s�&�_o��u��c�WĶL"�_�^�F
mE]�2�������}D��O�#���wj#��Db'�*��$�\2�qb��N�u&��(��^m'�ꈸF"V�Q�7�S�L��3�·{��IEND�B`�templates/hathor/images/menu/icon-16-cpanel.png000060400000000634152453623430015370 0ustar00�PNG


IHDR�acIDATx���AE�f	�f	��YBv��o۶��߶m3�K͇Iq�9���_U�S���r�5{Dݾ��]�b�D2��k)�H�mR���Uq�(��|��,�\�YJQ�v�`��z�=�2��h5{�(\�{�,��h�I%k�z�:[��(��Z���Z�e2�I�L	���o�k]��7,�
C`;ND�9|е�jޜ%��~���C��H۳�ƌ��>�Ȗ�c���M�u�McȎ�9�a�D�ݐ�E�p��������L�W��WF7S�|K�O�<�
���~����V�*��q�jx�w�9:\��pWc��q=A�O����\���7��"$S�
��RG��#IEND�B`�templates/hathor/images/menu/icon-16-notice.png000060400000000752152453623430015410 0ustar00�PNG


IHDR�a�IDATx��%�UQ���q2��Cd���F�%����������c�F�}�ޝ�fm]�
�����1k�딍�uΞs������l�-�mp�:rԮh�����[+\����8�ָ�`��`�]��x��xxy
���qU�ug��D;!l��l1���)�x(��*6���`]x̚�#.O�y~�U��Ul��EnO�<��Uy�G�E�%�"Ot�g6��A<����*>G��*,����pnaO��*�0��Oq����j.L���)'F7g�'��gz=�ȹQ�����hbʭ#s�}t.�'e�X�L�K��,�sg����_�˃���Y4�^�! �gY�!�լ���zqe�`�,���9�使3��?�UY*F�:��]C
�ԗs3�K��a�X��`u޷�_(��N��g��lȟ��9!��׺��X�gh��_�ɬIEND�B`�templates/hathor/images/menu/icon-16-deny.png000060400000000706152453623430015065 0ustar00�PNG


IHDR�a�IDATx��3teQ���rl��jl+h�T�_߅eإ��ضm��x���Z����g�����'y�����9p�h��D?^�����?�㣗�D7^�
<9� ����w���j���p����Q�}t䇼yh����'�N6��Ca��a��zp���l������	&�w�fu�!+�S�$�
0{KĜ�_���f��,`�'��/��l��1����x75�t#׸M6@�q�}�qy��mWפD���F� Z
�$�
P�qn���r�G�ʙ�)��J��
~��_��BM��4D�rTс`��E��F��{ʙ��;C�Št�]�&"W��A&�\��"
ui>M}���x���(Rl�*uei�l�*Φir}�"Q߉_���n2���%IEND�B`�templates/hathor/images/menu/icon-16-trash.png000060400000000775152453623430015255 0ustar00�PNG


IHDR�a�IDATx���\A@�̲�m�����q��eP3Nj۶��ms��t�~���$<�ˡ~��h4��ͯ_�����6m�tv�ҥ3*d@Q
�2�9r�ȁH$"�?��7oʎ;6���^93i8~���ˤ�e��2m�����={]��*���CnIѪs�)Z�
�L-;��lܐ�����D0
�-�~�����aS�ƭ��s��!/��������~h��ƈ8�ī�>��/��ĕA�qӣM[��0��p��OA�z���8��h*��L�"'J����\��ee"�D��(�a� D��a[�3��8��c�n��f4��'od�e3x1o�����&=�̴��=�
�A\�*��FQy2P�,�y�ɍΈE(//ϙ��_��FP*w $���Yq3}ԹƏ�O�k�bhBp���q�,����7�̜Y�b!�hqIEND�B`�templates/hathor/images/menu/icon-16-user.png000060400000001222152453623430015076 0ustar00�PNG


IHDR�aYIDATx���e9ƿ���1yX��ض��	�
��03�۶g�>�w��vm�����/�����{���l�ࣥ��9=���H��Y�iq�W�G�jD2�bz����o/��/`?)�:�{F9.D�
ӫ�R)�I���S�DŽ����|���	�
�'p]�s0���U�;O���i�^nV����q�3��C���B�׼�ޗŲr�j���:鉧^z6{�����n�j&�%��a����sO����$F=a{�r�����ip�׈����x�6�E��Ѭل�,*j6�{��A�	�"L�)�rܵs�K`%#k�ei B �D�H�&^,�u�RA�s�>�;��Z*t ���
&�ŗ>�=�[p��pdn�I(�4h��l)��Hh0�8^~u�n��w��4H(��f��ٜ�Ң�z�qY^?��w1�NJ�ί?%/_��j�5�}h��i
R$�A�cQò5
�Q(���#~K��
h��2���;��5���}��f~����{�-l�=���>H~����}�=?J�:hz�H��R�5���\�J�)��T[�������IEND�B`�templates/hathor/images/menu/icon-16-component.png000060400000000746152453623430016134 0ustar00�PNG


IHDR�a�IDATx��%�\A��~t���b��Q'�6��w�.��a�Qa�,���̣��w��W5w���a�f`$���@3�@[K�S��7v*K��Ũ�1E�u�b9T[<��8aes��ޓ�8?�p��Z�;�k�(�+]g9�V���RY��Cs�q��)6��0�0L^��i���O��B�`BN��@���ԫ�����.������-QD�0��'�T(D��"�U%!Sr�5���m�%�|���(���Z�-Y�ګ	���!CREMFAX�@����h�]L�i���� S��D�Bf|2�O�͞�6�jۈv���\���sO�4
�!5bœA��L-0�����L�ۡ�U�0'1�}��[�"Ųz
 �x���'��Ǔi<ϫ���
Y���8���q���o�C�76=���8>�mT�2IEND�B`�templates/hathor/images/menu/icon-16-help-community.png000060400000001254152453623430017077 0ustar00�PNG


IHDR�asIDATx%�3�-��o�̹�۶�6f��V�	�ض���Ŷ����bv���وʦIZ��኱]�&�ʆ���.�+r�2Ъ����f�G�x�4Yz��&"B�Q�!I��qL�'L��`3�?#1ֿ��d&�"IH�P���YE{
30aZH�4���X��V�"�t�S�)siJ� d��'��3���}�|�~N�M���|�QD-ʒ�d��a��t���&�d�Ƣ|<����+�I�(UI��|Ǣ홿-�r��xO�W�����b�.bE��#���ya�^�5Z�=|x-�ߊ��^e�;��D1B�o����9���G�4��3��w.d�K@��-bTcbUJ�RT�Y�!]d��&0i>5�UDTh���}Ϻo�����Nd���F��f�+��lz��;K�$C5 ����Yʌ�$v=����٭���?0k#�=.����0�ϯPTMI=��y�qb���
�v�%���E�O�P6Q�tE����fݗlr4�6�HY�	k��E;Y�bU��0w3~|2$����o�;��)����.6;��ȴ���ۏ��/���5?�FA�Qx�Bp��וgDy�h��쉺>�U{j�΀�
g�+!�F$�6��O{�����=¦p��IEND�B`�templates/hathor/images/menu/icon-16-help.png000060400000001222152453623430015050 0ustar00�PNG


IHDR�aYIDATx���ca�׶m��:X۶m[�*^۶���x(F};�˴�2<{��p�|�=���2�(�
q�0 B�ߗ��-S�������	gVCQx�^�y<H���s>�l��'���W�3�鵑4�	2�_#r���8�1�y�
�$�La�g�C�p-o���;�PVu�kY;$/lۂ�l,F���GZԖ��Z����`>0�,�,?��v�5�x��� ^=f�%A�e�^�e}/.4�>�hb�w��Ӭ�euW��Ǜԁ�Kp�f��v����/������>��5~���D���p�-�o��V̮>VA�$G�����2X�,��f�������a��ٴE���y�~���W�?��,�N�L98��m�����A.�u��O/3b�w�XW(�z!��v�V�'��� m�mRr]0��I�`��ƅ�?r�wJ�Vԅ�.">g�g�Gʢ����w�@��y]?���D�����Y�miG�ĦE/��f~�Ҿq`7C�FE.�^刊���#���Kq��VU��*��>gY�"~ݹs�%�e�'�B�$jEEE�1��/h�F+���O�x�b0�5�ʅ��"6�p��~�IEND�B`�templates/hathor/images/menu/icon-16-contacts-categories.png000060400000000643152453623430020067 0ustar00�PNG


IHDR�ajIDATx���A�m�qr�U����8m?۶m�,�ڶϳs��oU|/�����>(�#h��Dk9�ԅޅ�����@J�2�ąIB|5wP��Ex?\��x�/�d�.�(��Z!��k���Ю
����#kpM�_��un��-���&�F7/�ؖ
�:�J%b�ۋϟ?�K��� �F*T,�����C�f�R�<G�8��p�İ_��A���V�bJT�g����X�R,���<X���W�*Ĕ��c�"����zw-�&�FX�6����ʁ���e��#;�q�
!2�������X�g���z�Ҹ������3<}���]i��T.�%�]t�xuU�O/��*�"�=+�&�WB~IEND�B`�templates/hathor/images/menu/icon-16-viewsite.png000060400000000440152453623430015760 0ustar00�PNG


IHDR�a�IDATx�ӵA,Q��wGq���ifc2�* �
"��e���>ܝ�ecw��1|D��,����*)Z��k'���P�����Y�w��*�y�ta�����o"_��k%Qx���Ơ����*ę!K��2�u�A�nn���\S�8��䑃j�G�[Pp��܁�r؏ H!�@Jл�E�ͣJ��&r;ų�ë�ޤ�����Vi
�a���`k	�?X�S��l��amTIEND�B`�templates/hathor/images/menu/icon-16-content.png000060400000000610152453623430015572 0ustar00�PNG


IHDR(-S�PLTE���������������������������������ޅ��r�����������{�̚���������ַ�ԭ���������ڀ�������޽��������������c����箻ǽ�Ɲ����Ӕ�ذ����ԁ����т�Њ����ٳ���?�tRNS@��f�IDATx^M���0@���2Ø�����6Ѵ�xlKfLYJR�R�1a�0D�O.���E�����ƻ8@H���	�1k3���M�q�;�R�n�u�@fͧ��L��H��l��	�L��)y(�A�UeXK�@X!�11$��W��1�O�b�b
qAӡ�IEND�B`�templates/hathor/images/menu/icon-16-newsfeeds.png000060400000000602152453623430016104 0ustar00�PNG


IHDR�aIIDATx͐�EQ@׶�Ҿ�Ɵ]?{m۶m�Hk;�f��kv����_�^s�3��G_X��%Ҋ�S�:u^@���4�a�4�V��DH'HL2g!��ܫ�A;i�D�:������B@��gϿ!��:Ic��/�AKK�r��f螊�$��9��_��M0����Q�ݐ�%��U[��z�h�:y_�j�c�s6�h�<z���bA�3M��x�$1LK$f�@~s`�Rz�tc@?n�û���}��M����c�>$�o��@D
��`A���T.�Z$�yȆu!��i�@<^(��
���]n��:��IEND�B`�templates/hathor/images/menu/icon-16-read-privatemessage.png000060400000001334152453623430020054 0ustar00�PNG


IHDR�a�IDATx����f��f��9�ֶm�����o�v;�m��Ӡ�m�g��L�o��{3o�M��Y �%	(�뮻.Z�z��@�1��1���G}�}__�����|���?<��#7�[I��G���_��v����f���_]}}���?���@
���o͚5'>��C�3�LӬ��C�^�~�[��s�e#CE�����lٲ�.�!�-�tٟ̒�����fO+8��c/^2
�?��-�g�e�U��`�^|.
�>����7��ʢ�wt������7�D�6�>���#��U!{mU��E��Ѕ^̆���H$�$Id���$T7=�q�q�R~���?:��=�O���[�|��$����~zDz�}��,�&	��[_e8k���F�Ө��pȧ�I��ύ@��N*--ݙ��i4M#��*�t�Q�0�e&W�HLұ2�jV�Z2P���mc��b��X�\.�`�m���ia�!�Y,K�h��|{{�gB$�E��(���!�!=��Ռ��O0ւd���؊h��_7�q�B(����6J�R����b�(*���E;����۸���O>�������_~���o�W\q&��m���ī���l~���.��b 0���#� �O9�ʈ@���!i"GO�IEND�B`�templates/hathor/images/j_logo.png000060400000004346152453623430013265 0ustar00�PNG


IHDR��=9�IDATx��P�ǟ�Ɵ��11"<@m1ɓ��{w���3"��4Fg����?�1j�?PS�D�XE��(�q�q�)��-����j�I�D�&�G�q{��L�����;s�]�ܳw��s�^�%K�,Y�dɒ%K!%o��ݯ�ޣ��w��i^F:=ȞmI�l�6���ZKz�,=��Un��:d��{�ds��ˍi3���Y�S�,
[Oz�
�gon�^j.��Ktƶ�q��s-/���ң��
���D6ke��u>|YG�3���O�>���P���́m���b�2\7}�Ye�#�5ӿsh����t&�t����@���?t=���?��6��c�Z�p�9h��uH?���iveY��o�W'^�S�p��S����^a�zs�N�sVj�h,Қ����#�>P�/a�?ȿ���K"�1���!BT�y��X�p�ԩQ�B��1��E�Ƈ �P5�Q�y{F�:'{/�=^���h>VL��ܷ��t���X	e�H��v%u��1R�H�����!�$���!��l�Y�DQT�0&:�1�jr+�C��e$J�s���ed2[��ѫ�D���_�p��a�e������<�%��0����Z,��r������yL�������(�S~��.��nQ��,��`��"�d���� ��(�H�.���I�EY�I�e}���p�S�m.��_D Ѱ���$%��e�˳d<�@�߇�`>��PВJ���Z���x�Ӌ�vj'��&4�k��DMoR����;��������M��1�{xx{��8Q|)�GB��
���l��5���@H�,Q� �(c؝"�{�Z��c��B��O8�%DV��E`��X�2�����`�B�]�x@1��9�]���`��	d���|$�ˑ�ר��%0�!�zDQ9�i�Al���{�p�,K��:�����=�����=����g�&�f�2]�����L;�1�C]�LBH��m�z�#����ȥM9��#a�IK0����P���2�K�����ÿ�w���y��r:e;O�0�3�X��s?�Dw�Ȓ1yGF�f�I�!��p��3�0L~��~��p���p:�j2��tO^Y��1��ⴽ��ΫR2��Wg��ϩ}������\}b�Uf�7�T�Ϋ4�O�j<RV��Uƴ�}6O�m}
@^��^	�]�e���C��$(�E�T��<�e,S�r����
d2�gE�)K�ɘ�͒F%)N�ڟF鿙�h|�,��9�����^]p��5Z�����+իwM>���T}�ϛ�����b̛~�Ɍdw�]jgY�=�bY�J���"�t &��#��$���Nuh[�h�ZH�s��M��s��!2|����W��l��+P�tG���u0F����0�	�	98�>:�o_'-���Z��o��5}����6�j�''�MY�C�a?�8��(�3�Ӯ�?գ�O�ШQQv�j쾣�w$����1&s���u������[�Rm:o2e����<��3^��[΀�}�{I$c���C���
��a�[A��(�=�ێ�t �o�ϛV��C�{x�@.y���Z�������-��cȀ1*�DFZn���ܚ��U�YJ���k�N��_���1o�‹_%�^fZX]��	P|���n6�Qk�>݃�T/�d,*yH X�v_�,S8S�n��H�׼���K0�z5�f���r0EЇ���!�H����v� �#�r�a2�V�����1 ���~�á���O��
~��hOg]w�E�*�_
0��֏�d����=��H��
2\�N3������:6*����V���5��/���#�j_���H��f#�v�������XB����D���ZBHO��G�\��k���{�!���yO�-M��
�\���;��N���'���'�^�};�n�����k��M��Λ�{OH��ų
�Ǒ`��~�=1)�n�����f%���~;5�ԭ���ũ�)9���Wָ�W�Uf�zG����-9���WgD��A�od#=n��h*�[�XjN���'O���L�8�\��w����^�`Fl��DD�,Y�dɒ%K�,Y��\��`��qIEND�B`�templates/hathor/images/toolbar/icon-32-html.png000060400000002707152453623430015571 0ustar00�PNG


IHDR @LP��.PLTE�����������������������������������������������������������������������������������������������������5��>��H��R��V��[��\��_��b��f��i��n��p��q��u��x��{��}�ր�́�ׄ�Յ�׆�و�ω�Ҋ�ҋ�ӌ�Ԍ�Ռ�،�ٍ�Ս�֎�֐�є�ە�ۚ�Л�ѝ�ޞ�����������������޶�߷�߷�ุ�����������������ٻ�ڻ�������꼼��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������$.5tRNS	

::??```aa�������������������������%L"IDATx��5|lU��>w&��ݡC�
�
��
���u�6xO��ww�x2�䞽���%��~�N����DV�?yl;af``��Kp̀�`�8vq9hK��з�mJ"f�0#�:C��@�'�ʥ�Jd �k!�D���V̏5���Y���|��b����җa�R���$d6咛,o/�4�I��]�H��ퟛ^������|��%SX.���3:n�w^9��{��3�����r���.zdk��V�#��@�����N��~�H'3�Q�<ui,���'<�e���eDi�j�+�a߾�����e�{�����2oS��
�`�E3Z�($�>׀c����$E_{�r
��@)Q.�9L&@�S|�iiA��$7U�,�G`J�0T_(��a�	��к�i�=�!��C`�z�q������`4O W)�, ��/=[7�����Fc�/+A
�c�h��e�I��:�w$���@7��E^=�ɠ��D���p���@�n����P�x�7��Bu�~�Y�U��L����e`��px�Lw�X�Bgpmy���Œ��q�O��h����]�^܋�{��J��2*���/����Sd�=���4�;-�9��n�»GyIofw��J���vE���ufW�s����|�m��^�/~L_X��zR^&3��x��q�رh�GH1&s�q@B�� P����ޫ�u��#S�mN������
�O��o��e(�^�e�WV����6�P�"�IEND�B`�templates/hathor/images/toolbar/icon-32-notice.png000060400000003535152453623430016106 0ustar00�PNG


IHDR @{�u�$IDATx��]L[��06�P�4ه�I��u��nc���]LH�v���ٴu��U��7[[�ҚhmU�5iZ�$&!��!K�BLB��0�jc�@8u��������c�T��#�t�����}��_(��WaL�"(ĸ�AHF�"rW%$��H�0���	F�pF�l���&J���1�[؁H�…q
�Q�
y�e7��&���ڵ��.�����nE�C��=L6 >P���]�M�>�1$��]�O�pcd�'�Q
����ZX��f�Nxl�#�#�0˱<��\��?�&�+G��)|Š�[e�I0�"5���y��a��
�-?ߞ@���E����dB�L����;mN.K�m`;�@#��k�	��\��x����$B~�N������H:�<W$�\�
���OЖ������|vY_�P�mr��s��R�+���դ#���>��~��{JހVp9o��ϛ\�Q\�_��X9'�;Q���"�R�F�Ͷ(�Ϛ�GbF�S`�
Ar�׉ٓjޘ�	���$F���q.L��&���3������
r���D8�B�-����d���:�E�g��{G࿰�q��P��|`���l.P#m8���j�˜�c'�1��73��-g��<��:��Ra*�
��ֶ���[ϪK0Y)�v
�
��	6ʪm��H^��c.pB~��;঵Kt�U	���3�_w!p�	�>�;*i˳=��5v~���\R���P[���q��w9�v�1nD�J>�*r��Ο�ϲ~��'p�؏jԆ�ip��+W���?
_R�G��)v�g篐���5N��Z�\��{M0ҤyQ��s���X�*�znoDo�sp�P�ಪ
��-�ڇ�|Z�Bwj�UP�s�8��ߒo?�;a���
����*ņ��޲"���/[0���a+Nj�<;/]ǻ�Q�Wɗ�Ki�<N���w���$B��p�?E�=�c���~����
q�uy�ߊy�B
I�S_��[�$?�{Y��|H<��ҟ���*��.mK���/�s{F���d'��|13+�K�E�&�'e�Gd�J�L+��&���\
����&I�@��)�i��)he�$_�FѢ�F^����X�ݚ��$�h��c�D;�{�Z;Vs}��@�6�6R�a#����#�G9	8��D��$e���c�ӵ�5,,, bhh~���������؀^��a؉I����@ ���l���*�H$�Q��؉)�\��̌��lx�Xi‘��i"
ajj
���ߏh4
�(ߖ����� �Dj�ayy�"Ğ�'Z� ����	twwcuuU)c�3+6� 0bnnH���%�|>%��HV\N#�
tʜ�q㆒7��T�39J`�:Ѯ]������͛7��1P���~߾}���ޮN�,�:M���a����l���U��,�zM�+3�[�:�q��EܺuY�u�
(
�166�NDN>u_���3��AA&8��}ohh���%���S����Jԫokk�իW����K��P�f�MFGG���p+��6�K�.)�Lx�ފ�������ß���J>�Yp��#Q�T(��	�|`ވ�m?���q������FuصP�ZZZ�|:|Ğ�7A2|�[qSSjjjPWW���)�T|�n�Bb*QN"ۤR׹���G�����p����2븳��C��/S?R�(��Hq�߹�����>���S�����g�Ha ��|��v|�)l�����/�E��4��IEND�B`�templates/hathor/images/toolbar/icon-32-unblock.png000060400000004154152453623430016260 0ustar00�PNG


IHDR @{�u�3IDATx�͘
LTW��
1Mcc���!ctk��B)@���:�V+�h����]�e-PC7vc��¨�����X�Z���Ɗ�(t`��_u�]vΞss�d���v�%_�̻��s�0sy���	h]��ye�8�av�����A{R����n�2�yL���ь�����r�?�6�Z	�O�����6�I̋��\�?*�����^�B�o�2��A�9�μ��q6�+^[ή���f�r8|��N���>�I�/X�N�<s��bE�ĉj����Ⱥ/�!g�BÈ�yg�-Z�$��(�H��Gk��WdE�}>�r?xYw4BLL2oF��K��S=4�d�S�H1�X䘠Ɉ��EX�&-Щ
���UDV`��+�Ê��q��Ѥv�{��
l6a0
�p�m_�ñ�Cp���7����BH��MSB쑜P��>_'	�{�
���.A�U9000���044V����j_Bٓ�a�RӼ�����ĆP	��=���'>|(	�EՠXUH y�o�$�5�U�2��C$�#��_����^���W������,�
�UYAVI@o�,��9�>��U��@I}1���I�8�����ҿ�%�%h}�߿��-���
�c=Z`��w��g�B�'��VX���U���o%�*�;-Pj:�$�
$"l��E	�������\xho/�p?�@�G�}�@r�K�d�x�D}@w	��1���"N��#?�غ}�Qص�MO�@�'�$�9-����"�d/A�;��!	q�{X�>t�B!���GB?LUd�?�?�]���ÐR�.�����X��T�A��k�@��-u ��|�	��7i������ۛ^�F��5	��gԐ�R���-�h����]�V���?-��	�?�v�To������^��N�$K����'.�\
!���	H�R��Y�f�!�����b�^�'٣�b�ӭ�8��f�K1^_��޼4c���%	�(�ʯsI��$��+�����J"<��
-�1���ؠ��v�[�QpQƐ��	d
�42���~a�T���_�n�7��	�ɯ@�^�̩��=��l��0vٜ�}����s*�1�$l��q�����"�H�Wp���
~ޮ���Y勣��R�g��q
Q�×s�F��d	��MckO�yY����1�$	c"�Y��X��9�Gt�S4�al�$K̤`����3/�37n�Ǎ������q��48O��^@�p!3��BS��g�%����.�m���;2���v/�����ljll�g=�6�w���]�^Ss+8CcSK���yߘ0�W����a4�4��G%�'�7��x���9#0M�3�����F+�aH���Y�{�VLVD�*p�ƭ"&�RU��Ճ�U7@�[�u�qk���n��ꆶ�v��X��X�$PQQ���#�_���	zzz��;p���{���D(�b�0HW�0"��etvuAwwt�$��V�բ]��ǫT��UB{{tttb�I�+q[�FM�-U(/�Q[[G%f���J��0�qh����28������,юU�
HKA��6�|�@Yٷ��hiiA�6�hU�@z�m�d�o��dE@ZW*-J�
	��H�0��F,P�Ej�_���YT���%:ŦƵ���O�^I��8�P�B����ʍt�0��p�B	h�2Jg�~�G��Ν���j{	ڐH����g()��b�Ȑ�:}�؂��pUVU�w}��f�Qs.�_�vMU�N�<���cp�u\t��5&������:��qf�rk��*((�!��VD?���޽{g���1�K�(�3���5�O�Oggr�ɳ����@}ȹ���8ߓ��]���.�������1an�p�df~����>ʡ��:M�xζ��S���;��s����iZZz9T�@Ϩ���rʩy<g��l�,B��0&��|�݃�g�B�|���U�xN�9H��,�
��u�6͎g���x~=�ۦr�I���_w
CC�IEND�B`�templates/hathor/images/toolbar/icon-32-copy.png000060400000000642152453623430015573 0ustar00�PNG


IHDR @LP��!PLTE�����������������������������,�z�tRNS@��f/IDATx����n� �a<;��$���]쿛�״�Z-}Q.W��?fP�j|gw�w�߀�-z�[����7@l���2"��
���
I�jx&]�فM��f�(�| �y���Am�h{{Bt����8�����4��ƌ a�[��"Ыa�<���\�;g�������E� N�iM@C+"����0i�CZ�G�g:����-�{�=j�>��-���hI�q'�9��{b��2ܹt ��Aąu)F��� �_`�W�=`�k\ҔZ+��Ͻ#��،
IEND�B`�templates/hathor/images/toolbar/icon-32-messaging.png000060400000004177152453623430016605 0ustar00�PNG


IHDR @{�u�FIDATx�t$��km��m۶m[�ڌ3�m{&��m�Y?�;S=�3'���%ٚ�ݺU�S]�?��S�i*��k&\�tf&3���b3����&:�)2�)Z�,a�3+��{��l�����Վf�0�?=�|���b61�3I.`63됐��`��ގ�O�$��wG��t)_"2׈_�L���Q񖩫x��U��U#���}��[ϊ�\�r�P&�ď��%	E>[�|�x����g���ă�U�]1$��8�F∎Ğ[#I����a$vh��8�ިL�ь�,f�x��.9�<��,��l�cY4�-���@:������ci�'���m�E���Rّ��|���{�y��
R�*�1j	��[�X�e2��c�P&�Mbg�}�$��9�� 9���KX&�\��0	����e�X½���-Ћ�3�H�W�p�F5����~�ؚ��=aA6�ْ�}�{��^J7���:�))��a	D�I*�y�)�s���
W�������~&+1`�g��Z��!��k׾U[[����n������R��Ƞ��_�D�F�*��"�
=v���*z�\K·�f��I��{��
��3�272O���A^SSC������N���t��Y���܆�8��ѰB�:��$��^M$�i�g]V�@Kn	�k�y�����*���#�VK���������eR���@�r{�B�f=>-\�V$�Ì�%Ǭe.g�}衇L����Pjj*%''�
TPP�D(''	�C�-,2��1�mzQ �U
�[;�Qm�$4˧�rB̓��[��+** F���!����o~�:}�4�8q�>���'�<��nK��{h{I/��RAu=�#�����C��S����0�G�I�8���Puu5zkb�{{{�A�@ȉ[F'O��ע��o=�����������<���R����HE��Ț��덄Cë�JJJr�A���E���d��bf&���_��{��7!�N���ͽ(%���!��b�qo?ygg'm
��K~(�.&&&����o,�J�1���� !CP�gT\\�˳��<""�����ɱz g�2�1�17�–�Bഴt���5$(�q"�N�"
�̬,��C*?��0g����R�ܑ^��yGG���<�\�O@V�'ݱc�$�:Z���D�I�D���6$��\se�5s2H����xXQ,{��*88ث�]��~`��fr�=�*��ᷱ��Z��(;��AV��J��J�X\�����Ϙ���Ós!44������@A0C"m����ܨz�I�Մ�%�b���a.cn[�dɫ{���DX������0��9h+D#��b.%%%���W���{<��װ�\*��T>
{�ɧ�FEE��~�3��cB��m@!*�1����˻h�]��>���{:�B>�+�3U�ϵr8n`\�p����oE��\�RB�����FEE�����������]nf�ɡ��Lj��X$��\�*�n�c=�s�.BX�ʊ��
Y[�}��7�r�G�R8�G�
�%˳L5$71_y�U�xn�����/�}�}�y�o���D�I�t�ϻ��^FΕ�f)|����B.a\7[�zO仠R
L���+t��MH5�ӆ����)d�$�e����\
�K �Ѯ�L���N��p����}��58p�_s8����В��5>|xr'^z�Ͼ�ꫣ?���+011Ѽ��[�s���$&�p��{k���Z����/'rqq�ݒF�!GGG|��
�<$c?�x�Wn���A@E��H@��ٙ sss�g������-_���'������X-QWAI���݀��'y{{��N���Ow��<��4b	�����p��mR��쎎����H
���"//�A~~~Htd���x��=���*^ב��
ľ�����dffvw�J��p[2�@6�B@@��w8!�q8�J(R@�� �>��9���Xb,S���'Ċ���w8!�s8����O�/���z��=�p�����O-�bLwN��	�9�;'t��Н�sBwN��	�9�}N$'
���"(�IEND�B`�templates/hathor/images/toolbar/icon-32-stats.png000060400000002147152453623430015761 0ustar00�PNG


IHDR @{�u�.IDATx�p�V�ˌWf�P��ۡ�1333333_4�c�㘙�~aƲs�]i�j��p��v�|�߮-�ޫ�H�k�ې����{�[�k�_�܊<߭���M=��Ф�Tg�y��j�h��rcG7��;�=�\U��t5����c��ً_��o��H�5V�������n�����z�뿜4��灍��z���qs�<'`���^�֝���� �և ��lsv�@���*��=�p@jY��PE�����6����8����)@k�[ٖ|3d4_��
�(���T!�!��R�B�PVV
��7�@mm
���AcS8vhkk��qɡ��O|n�������9v�4�SV�NI԰/��Q��C]}=k���Vp����/�@*��s��A$��HD�Rr�ҘΟ?�mmx���n�(	����_�@���b�<�i��B!;0a˜ٌ�<�ڵ��
����9|DGg|�+�����`HI$EO$!�$PZVΨ���5�8�|����.���۷o5J�$IIM��""W�HF�i�R+�F�&�:-���!�b4��l"4M���CB�$6�1)}�X,�dvv���_{�3�\�j�����ȳ]���&��b�!�?rA1dȐ�K�,�_�p!��`޼�ݻ_yA��/��w�ު3g�@W�v�ڿ.(fΜy��� �|�	A�
:Bѷo_��b�ԩԾ}�@(z���wD[�n�����~�!
�?��b�$	H&��t:��AEE��W��烚�x�9��v�ٳ�6�ĉ�8@��q@�A���j4�l�z�46Bz&A+��6�m���YQ�xD�Q.�>�g�癜8r���R����y��\���JKK����5#.\`o��́���������nV���7�����; v@��R
��lނ
�Q��@UUL�4���x뭷>�)t.�j� �������<y���^�O"�`0��D�r91��$6����j��"h����":��x<��w*����4M��}��΂B��0bxu;�5NIEND�B`�templates/hathor/images/toolbar/icon-32-save-copy.png000060400000003101152453623430016520 0ustar00�PNG


IHDR @{�u�IDATx^�Y]lU����nw��-�$B�BA������k1��&�/��;%<�M6�
�$U-�>�'�j��@lK
�XLi��n�����\�anvv;��<��ܜ�0����9��s�g		��M@�c8x�H�����%�l�\[ǘ4�L�x���'N��������p�$Iqk@�u�UU�i�i�R)�b1(��h4
�0(�M�#�(@L7g�ٸ5E�}&�B7��{_~�x	M�F�|i%���@ ��ܲ����o��8�C�KrιN�MW���A7t�A
ѷdUMs֑%%c'�xH��d�N�ᆦi��� gd�<!{HNs������f�	D"�Z��,4-^,b,$9/�Rȍ� ���
��5��';;�pKf�\B��R�Yƒ�K穀��2��N�X�Ulm�܃���[�@W	E�#
Ÿ�{�Z��/�I�Y[+���?|( :�cM@H%$Ϲ4_\L�Z�-��D�ۿh�o��-0�JL������������yy�oo����}��{�  �r$���a��8JJ"�I���s��Wzz�8��h\��KH�������@SU޾
?����߷���O�{��$�dA$7G��LM��7n8�<���d��nr���A`��}��7o╆��H�uw��T��!4mo����S)T,���?�-yss3:��Tz�^.�@^6̈́K������o�Ir��/��0��]o��(�Ǔ�?�;�.P�k׮�]�~�VSW[+1i�L&�4b%%���$�Kr2�%�J�z��0�D���_�X�l����ۏA�!۹s�
w�9E����HƴKi�" �V�_�
ljp`�Q�"�|X�|a�g=�/�sx�E�رcزu[^`ǎf`����`w��N���^'�okk��W�l����1�� kP�y��US5��!��`��`�@6Y$��s�i�M��yt�(�d����{è��B��R"�dWR@j��z岫<����0�ݵ�.rż܏�%��ud�0���c�����$�Ƭ�M���C����9�"�L4����X)Y;��E7(rYÞ�@g���
J�h&''im�אÃ������po�3*�I	�BOO��cbAݲ�G�Y�E��㗓#
�hq�z{{s�W�G,���C@�ś�[\�3S@D�����Y(��n���9�M@��W�[2�z����ܧk��c�ƍ8}���ԉ8
S_����q��]�����d�3���qy��^ۆ#(�21��n��	ԯ���Pf�UՃ�#'⡡!k��W��`��_=.)y�tH]�*��U�I�+W����/��pH������;�ѣG��n�:86:'gOS�KUUU���_?���Z�[��VT,����Z��rB�y, �
�`~��̨��Cez((�Z�"������]]]�_y.�E0��^�(��T$��oHIEND�B`�templates/hathor/images/toolbar/icon-32-banner-tracks.png000060400000005273152453623430017360 0ustar00�PNG


IHDR @{�u�
�IDATx�ݘP�e�K/%���Sd[M�U�%pLw)u7�ձl�=k�Nf�1���͎��l7�0W��-�(�臢 rU@���	������y=sX 8�3{f~#�������{��)?�}͉�ekcM>����+C�|#����}-޾�0��3����#��K���0��S�]E�k�Ch}/[�*�j�����$��D�!��26E�E��x��t�Q��5�����3Ǭk��Z2���/���d`�;�XIb���p�•!�1끍1Ŧ��&�����ϲ�R�w!���‹lϮ��9&M��h�aӡJKtA3�z��_x����1���@e7��K6;=&�o2L����H�jZ�ʻ�Qm/>�Ym���ڿ�;��v[~�
��?�և���+;�#���X����ۍ��tX���ު�aE~^)�u��빌󗾅e����򆷷7�[e��ȓ`)�zp>6�;���o�۝�+�{:��w9=`09�Sj�\��3j�4�o��U�����鉧�~�6n�[�g�!���U ���?ՌN�������
��Ô�j�"�s���B^3��œ9s���g��g�n����;2�Ϧd)N����֗�ߞ��W͘ۈ�q��ZܜT���`Q��[�'�xs��ł�p�B����Y(��Y5H(l�~p�������b[�w�B+&~դJQ���R�&��z����x�b�����:$�b]�i�K�$���ǃi]���'���KqWj5f/{���"��⩧���h�߶�Į�V$��c}x��s�ľ�c�L��w[e������,4KT)j0����T�K̛7O�;�5]Bp~3�QE�`���8J�}���aƅ�����@6�!���bPCN߰���R���8���x'�Bs|&w�u`D�m%��b�7����ؐ��!]#���7E`@)��';ϴ������l�E@PYhA��85�G���:�ཪ~�^�:����*��B�gH��`'��6���s�Ξ=�A�L"��OJN
/`�豮/�7"/���2�Z��B�Ɔ�X
��WfϝweɟW�p|���)+���,D�,�k��|	2-Qee/����Y�f�O�(l���nb/�H�R��(pc��@	ۗ�刎���K/���3x6�P�X�����jJ�5���"����L�����y��r�O�ߍ�C)>��@�na1q(=W�O��#p'�S�:%p��Q��2.���E'i9�p8�(^X��8��7	b��d�x�t9�i�V����"��MJ�ٲ2lڲ-d��U�)�m�Gv1p*��5�G�� 04�_��a	H?�"_�7���Kz���|�~}�y�Wȃ�$�~샨�"cY�rX>����n%��mC0mƌ�\`o�0�oD�����O�ح���G�>/&>d	Y����^ă�����8g��Yd��q���-�,Z�h-��;�2��䬀�����!�jd�ě�V��w%?�<N��;T&\��\F��	d�z�͎�s��D�O᢮�/�]�N���	���HƓ����A���a8t�)555$99��c>|���HHH@dd����Ǐ7;v�r��	[II	��֦��ݍs�Ή����f�"//����/^Dqq1�=

����%���c�Aq��i˅PWWMӐ�����ޮOJJ�
���"�����'O�K������fKKK�
���
�j���(,,Dnn.rrr$�>���L�7(��G�1i����W]]
��*XYO�ͥ1����l���Aoo/Ξ=����8u�:::��ߠ`p#Sh�����T�---Eyy9���`����ק	

EXX�L-�>�3g�r���
6��N�`�
eO������ ]"<<����'"r���E��贀4���%�O)N5=#���طo����,DEEI�u���Jɖd��W,�5�
 �V��p�޽�DHH��������3���k�T�Ɇ`�dd���� Y�K!���K�v�J�J���L�Ȃ�Bz���V$Sx�-$��y���S�@F2��H���ސrM�bNUiH{0KSI�>��܈4��|Ȇ�,p����H%YlPPp�\%��)++��R@^�����R
Y�} �=�<���(�hI��tڧ�t~}}=:;;e͗EJV��(�T����ח��%
"'er�y�B�Q���~	��~pT8d�J||����	G	
D�F�$S��Ȭ�K-.����3@	T'8�vT�G#` 6=�|����3@6�  �Up����mPp���y-� �7#�C{!@	L%��%1�
6�g�4��l�a�$uA�)�{��R��
N�$y���¦3#�M�`-��%]�4�_��d6�B3�
�B�&~dI%׾AA	+�@��
F!����(r}|�Zd!�̓�G!p�@q�<x]���Jd]hںu�d�m��ٳ瓫��k�*��n"��G84y�rf��x1�!K�R��G]�"ĝ<���9+0��"K���Q���x��,#��I�
�#��n�z���'�&F��y�]��$�����	W58��s@��5��)IEND�B`�templates/hathor/images/toolbar/icon-32-menu.png000060400000002102152453623430015556 0ustar00�PNG


IHDR @LP��)PLTE������������������������������ž������������������ĺ��������������������������ű�����������������������ؙ�������ơ������ÿ��Ƹ����ދ��k�����y�����d����尲�Ro���܅��u����ɓ����Ղ�����Bi���퍪ͨ�������՞�Ǐ��]}����s������������9c���ͦ��`~����Or�Ln�g������Ǿ���u�Ϙ�Θ�ϓ�ԉ�ʝ�����z�����i�Dp>�tRNS@��f�IDATx^ՓŮ�6@=cv�>f��?�����Q;Q�owU�)��h�:qȿş/-77/?���7;�����E[�����v0���wA�M�<���t���O�>(Cl�E��b�^��#)g��0�� �u�3�WH���f<�X3��1q�|������ �0����:�鐬V����{�,KSE4I�ɨ-��W��}[���:=����~����7�����﵅/���x���w��w������>��>�L��})%�&�~�C� �c�4��YG8��!D��Km��+�5r�+���Ahq�h� n��r��^j8
��>ʪc�CO��*6�~0O��t�	� �+Q�q�l�	,��](a*�q,�ɺC�y���$��@�R�ſQ�9GI9��N��zA��y`�w��w���
��[E�R�<��ţe��>n�ʲ��t�,P	�!�����i��1J!�cI�� jC�I���#P�iA%AO`LXRfvB�P��$.��Y�qB-(D[P$i��r���	F�l��l{�2[�g��,�|��M�!���׫&�3c����s�t��!#Q���_?��
�a�^j��RK.�J��M�'4]"���n(���}AYA��k3����J���P���p��)�	X�)o:��ʿ!�%e�H���JKQ�Jɒ�iW XD(���EB�%H�G��F*i��IEND�B`�templates/hathor/images/toolbar/icon-32-save-new.png000060400000003301152453623430016341 0ustar00�PNG


IHDR @{�u��IDATx^�X]lU���l�-�2v�"�O!Bk#$�bDM�$!$�+��ɄФ��AL��C)ix2Q�
���K�(-��Rڔ�lw�33;w�97�MY��L(��/�=�MO�w�9�n��,�“��'�3d�c���U�c�~PUSS�t]Ø���"�
��}[����*�@�E�$�^05M7M$c$6�h4�`0�H$���lp���� Kl��(@L���q�^	E���j08G2�����fT��
󞝇X,�����;v^��~_�k�i�6�8�����A
QEM�yI	����J�������G*Bk�?�隭�����0�|u=>e�'R�j��1�EEb�ܾ��
�Vj���ӫ�p$��e�rr�@42��
��
j�ݻ�L���܂�1�Na��g�u�;FP��;
c,��3��&�cVw�K���(U��/��e1�]'Z�co��x�D�cQ����/x�o��8�m0���_��st�I�i�s"�	0�N����0��8,5
�e�
߆4|Ɵ?���W����*5�����}��=
Ӹ�
X�K`��f��يu�� e*]�^\�F`헐K�b��J����P��,y���0Ib0\0�9�Q@;�
xO�`!�/n����f�10Z=݄�])�eAV�M�����\T!��P�|�IHO@S�E�/,|a�+ђ��3�x~�F��7�`i*D I�cȘ$�}++J��X�9Oc��
p���?xm�~s�����W�z�2J��u���mG��\�v]�5
7o܀����a�t	E#
:���B_P�g�����V�`�O����-^��KL*WU�&fff���A�!�V"U�|>�������
MӚCyy�����Ǔ	$��Y��:�N'���
���s�d��	"�|)�ҁM"@0�SN��T�I�	"ӌT���3f�H��{�b��W��W�����'O�J���'<auu�;//_��>��1��K���L�e�􌺦##�M��a���� Kl��9,,�&WLn>pO�z{{�u�.
�
���Kd�^�IU���^�x���|�9E'\��>�r(��8ya���i%�OI�r��y��"�	�b�d�e��\97���@*P
P1&#8{�X���a�<����%������
dddd<:���߃Wа��D�4(���;%g=>>.ڱ��Tt�� �l٢�7lĹ=Հ���FFFĠ2ۖ?`/z����y��͛�:t��c
�S��$uM�h:BϡP�>�999%�a4mڴI�s�c��<"A�rssi�+H؛#(��{>�
���MLE�����Y��^u)S陀e�'@�����bh=EQ�������&`�[N�w雑� ���˙;�(BL�	�h4O*8��'� {zz��sn�E���S���
P�#�N����y��A�1�ڞӿa(,(,�ߢ�w�]ͥeep��$�����X�\FS��m������w_!Y�=}��H��%�����P[�Ξ���5�Bs�يR�ʩ�m��>Y.�sB+ɞ3���#����f��`dhȽ=ohh���3��ÿ�?*SaNIEND�B`�templates/hathor/images/toolbar/icon-32-save.png000060400000002311152453623430015552 0ustar00�PNG


IHDR @{�u��IDATx���F��q&��-33�̌�r+���ݫ�*f:������l<��k���9���>��'����7��Ob/���O?�I0�o�xD�Va-xo9�kp�R���c�t:=Ͳ,���y8:�m��Q,��ۋ|>�\.�5�������"��u]��!@D�TxZ���i��_���+.�1G�R����I��RjFX&�1:(��96�8
���3�}9:J��q�L��
 B�7?J)�^���4�?G�&�.���P��r����,�=�XpT�E�z|�9����Y�bE�� 2b�ȑ��HC;�@!�GT�����@1_��q�~�x㭝��ֈF<Ot�S  b	0Ԏ���{W�����`�d�PDz��Ԏ�<	-!�g�L��Щ�Y4N;�����z~�!�������bi9d2Y���ӏ?"�Ə� B~��|�@���3a�D@lڴ��/��2?{�[9/X�8�c���x��WpÍ7��0���.��@Μ9�3�:K�p҉'Z�:o�R�1�7�ɝc��P�<�� �HH�����t]�G�s�!�l�0~��$����_�K�k}7D�.@�aQ��!8*��A;@��ljW��"���
"�j�0�Ni��|��M��W_�%B,���?�/ϫUǶL�iB��`�G�E(Q`ͨ�T:�� �L�AX�����9i�m��vg���w����j��jyvz�{XK[	�9�uxyNDA/ΑA-xZ#���r�>�qYX�EyB�@����@�5��	�!����R����c���<�[���~z����)
��#�A̘>�u�JQ�,�Tj�������G)��˯� 0D�
FD_�_f�`�	��' �8�3����h��P�-@;A
L���uҞf����?�PP��~ک8�������b~���k�!e��a��e���5�*���O�Y�n� ^|��'.\�ߴq��"[�lF2�6oقK.���zʰ��o.ϫ�6��7n���CS}�}��8��<QoB�s@��s!��g��2=���Z���f��Y����|ܸq��S��1��*Q�8�T�IEND�B`�templates/hathor/images/toolbar/icon-32-new.png000060400000003402152453623430015407 0ustar00�PNG


IHDR @{�u��IDATx��kle�hE�����K�n�Q��`䟷?��&�S$ԤF�Ul�ʭ\�X�Z�-Ћ���Wh)]Z)�-�V��YZ���{&؝�v�S�8ɓ9s�s��7_g���_y(�o��>�EjI;iӸD�5�yyP�&�(ہ��wP���B@��@լn�{�w�l'��/�PARQ2���y	P�E�C�%.�Bq�m�Ր��(P,$3<�|8��\b'�i�\-.�'����yϜ�|e=ʦ�AI<��c�_V��k+��+�s�pr���'e��?I^훀�]8&�Q4��U{˖!�\v��J�c�������U��7�
�}�D&T�F�]p���P@�P7��d���?���?΃�H��'
8���`\�CP0Q�E$�P������M2II'6��*t�k��Z~�V�>�G��/6��:��U���Vj��ڄ���m&��qv���j����z
Аω��ׄdEٱm�3
���@e�����`������~���񰱀�v�4�0e
`���5���
c6��@�9”�۵}��+��pV`�r�@%����%��l�r��5"�<n�s\�4��[���+c�������>�-�U6i"֑��jޒU�s5����7J�FZ�sT�dc�$؞��=�]������D���X�z�9�p?D�~0I!$�x��w�NFHQ"�a���=2�/�#X�X�����C\��c�2	�&�a�h�$�|Cr���@I����\�O��W$"|�
���MH��@V����d��ll�;kꍈ�,¶���=��#��l���6����dr��	y��nlv��
�\�8NB1k-���9.p�Ğf�
2�~�D�O�:�[g5#��d,�s���H�^ú�N3�F^�[1mD�aSG)Q>P�^�TY~s�b�R�&U��/�C�˔��?V}>Oy������#d ��D�G���Jf�9!�1��;�L 2����5��'b�6�,Vml���>CF���j1�
�߆��ҎЄ��a!��09j�?�D�&H"��0X�A���<`J@�7��IR��AH n�o2�~�;̙����κ���v���Ԅ��F��X/�`R@�{�^\�|N��ϟGss3jjj$���b�$���x<�8qzcL�$'.b	[��M����
G����1��İtvv&����Q^^�1&c����ܺu�N ܼy���hii�իW�r��p8�7�dLr$Wj�Vz�
hoowܸqgΜAee%JKKQRR���"@o�1ɑ\��Z�^�,1 E���
�5�J��O��YFA���*�k�����a(��ŋ����%���UUU����y�	�N�Bqq1�k������9	Ξ=��G����P�d���طo��޴��H��H�ڃ��I0�eO!���Q[[�>�?�n���l�1�ɕ��z,����=�}r8&9�a�Q|��I�.kH�p������G����={�@o999"@rB���c��&�s��1y��f������'�Nn���XL��i�?|�ʳ_&ė�����X��N�󉋠���&%��#Errr,dV�>7M�?�ܬ����)L
�H�t��w222�r�-\�jކ����̙3���&<������@_��)�+[� ���IEND�B`�templates/hathor/images/toolbar/icon-32-preview.png000060400000002070152453623430016277 0ustar00�PNG


IHDR @{�u��IDATx���x����}k�l۶m۶dz78۶m�|�z�޺I�^ߙt��%�a��6΋���ߣ8?��U�`:�4`�O��Z�0�c8:ۤhbt�3/�u��νO%x@ӤB��Pe��%��9�9�#/��vʌW��0��Vn��~IE+!m�[�U#X�,�1����x�{�Wl���ym�W@ѝOE�F}��+–�0�JSc�|��V�$~�1��ZS@R��q7�׶�.�����\���>
t�8�\��g����'��laJ	|:"��܌�d2���)ν�3V���t�P(���S�U�߁l6��i466��4�Ϊ���Ӄ�ʣ�'TU�g\6�?g@~�J<g!�lx�s��+�b�΀TK���%:#���M���Իh�7�"�2C�1�"�b���
��S���IV��m���c�;\��
�L����u�pĚǺ2�k��Iܽ�#,���Q�����ժVGؾu'�f�_B?-~���~Wl~kT��Pt�E�(7��i�]�'̨����m ��1�ʍ�f4eʔ)���;R�du@\�}���o����.��#� :::�) [�uA�WF�	&�`B!Q��kN=��=O9��JJJ�G?�0���ȹ���z�)����w��B��z��'�Y��444�/L�xkk+�A�UVY����ƭ�D"Cn�| �d�`0Hoo/UUUʈ�VHn�営�w޹ 
�w�q�c�=�W�D��+��~266Fii)�O�`}�����wϚ5��~���7�x��R����Q_��E�1c��x ���ٖ������
�4��*$2��Ë��L�>]��8�������ku�H$��b��믿fdd��5 j���OQ�������W�����X��+�m��p�H1Ξ=��5�hVZi%)Hц^~	k��6�m����WH�0.�$d�W^�O��
��UHt]7�
wvv�7�a��o����
7ܰ 
I{{�?G!�PH~�����IEND�B`�templates/hathor/images/toolbar/icon-32-move.png000060400000001625152453623430015571 0ustar00�PNG


IHDR @{�u�\IDATx�5p�F�ߓ��`��LU�K��}N�C�2��(e�06����p���of�Y�wt:�BF}�o�~�}+���1@D�?/.5
���ip7uQ����F��}[Naʼ��p>��g�Y���1�J$>3�]is�.E�e\��䗅<���U�d'��j�k=��a�	��@
��p=x��
��wF�����j����f>�b��d�� �K��_ξDz��s�zm��\-���˵v-B1���Gy?��h@�X���� �R(�H^���Xԓ������}�U<OY}�{"~�66R�YK��m�ob���r�N���N��r��}�CR�@�2�݊pn��>�NHF�����U5E��N� tC�ߗ�^��8k?@]�b����w/��R?�~?���	i���3�T�X�>����d����o�Mj�����J=�>1�Kp��b� �b�H===��iZ�a$Q����-��󁃃
�m�"���������(�"@�P�󁽽=
���:kB%	��]p��=�U�������M~����g-�̑~=|��
�([Y��L&C��@nC���.���3SD9��@:�&W���m2\�ZZ���h�T*��n83��Ac=@t�/����$ab��	V.Jƺ����q���}�.<�5GG�P.�0�@�
���u>033C��룋�;��> ����󁉉	
�V�nef�N(��Ps>0::JQ�
��|�r�?����>���|��Sz�2F�I��IEND�B`�templates/hathor/images/toolbar/icon-32-export.png000060400000002120152453623430016133 0ustar00�PNG


IHDR @LP��PPLTE������������������������������߭����������Ž�����U�	���M�R�J����O�_�
Y�
���W�	���B����G����\�
F��������������ξޤ��뮰����b����pwuX�#�����Ӿ���������l���������S�!y�+��ea�
�ɇghp�˪q�6u�"R���L����c�-��Œ�����UW\�����UV\e�B���&&(\�\�0���b�&~~~w�'�̉!sx{�����j����Ʌ{�Nn�W�ĕ��~gy_=�����҉��L{}��慔���4@��܌��}tRNS@��f�IDATx^͕E��0@'*��˺�������Z:�m�n�^����l��������oL	�,w��0,�u�`���7��v�-!�Ҵ�.����/�uSA�R���l�z�|�9� ��
x �����T��b_030��	��b�Pȟ�2�M��8�l�
���kk���cOB~-���W��#�8OJJ��ף�����
n�� :�n��k^��\��*���B|�w�sn!48��Ӎ}���%���F���U*ŏ�����!�A���z��?�Jy��������;�
Iຌ	����+;���X����R��l������	:�Vo�j�|�iuš&����u�m��'�k����������e3�������>�%��d�%F�1�P�}�|�S�B��L�(��0��LI����R7L$�EX{a���
a�i;Ü�q��@'w�dĄ��-r� g}:0��j��%�@?�c�ڱ�pK�������0���'����
�L0C�ܘ��`ñ�R��W�H c<,aC�BB0�G��u�بZC�B��
�Ghb	a����L��f:�m�b�z�a��	`�,�)Ɣ�A"шPYX��#�,O�i,�>����1:�Q�u4��̓f��4`	��#IEND�B`�templates/hathor/images/toolbar/icon-32-user-add.png000060400000002733152453623430016330 0ustar00�PNG


IHDR @{�u��IDATx^�]hU���Mڔ�R�nAD�>����}kJ�)��Ⳛ� (������/��nUDhJ?�P�I��PH^�P�f4��c������u�pY73�����,����{���QF�Gqt`�q�zGM�8�n��`;��8� cEB�^�B�T�v0\�:��b��Sૅ��G'����^m	A�Z%d[���J
���JD(�`�P.� �p4�PȅP�B��,�V%'���t�8*�@� B�DD��&
��{�8�B��@J#Xg^��x����:/.���K3]+v�)��x�T�E1@���|t�L�s�w���oCG�>�Q�|4��&�_���o9��i�x�y�O.���/���[Jկ�nNcĠ=岮Z5m�$J��ó&Nu��,�5��a���ZԢK�#�.Mg7���^����Z�U�Pv��ר�"�}��'��?�y��u��"���	m�u��g��q�ܖ��l>
0
,f���5�\��&h��
+��Z[۽�k1��)<���XE�~
�^Q\_RX7�*�Ę�D�OX4��:P���t�*܇�pkë<����,��B~luNS�	�U�S��Ǩޅ�o��5E��yn���񗢴T�N�
�k��D�T-�먑�.s���˰���<���d��Y�A(�C�J˥d����������
�兗�bS
\,�l0��;�c=(5�B���EX/ՋA�bP�~��b�)�\�lO�
��GrZ�Z���+�O�ﰾx�{��t.�N���l�X��ed3i�qz���aތKfS�l�p����'�Q���<Z���M��@1���|j���_Ǐ�y�8s�L�PJ
뾁�<pphh�����b1<����`#��*�<y2��m���v'���T�}�,"H�"�hr�_N�8q"��T��*�J����k!Q8`j�P�Q80L��޽{[?ؽ{�0�0"��T��� ﭯ�14����|����,A���8��܆�N�J�[�6 p���'�����@1�_�N�>�����(�qݎ���|�!n��<::j���9`ܻ�<b����'�����	�C����JA�
��g;;;���Xm��ٝ;w��`B��*n&�]]]B.b�V����H�s�Ν��#
�^����===r|��핂���|@����b<x�y�{� ����(�7�"�z�A�T*o߾�����رC�����kU�!�4엾�>���񢻻[�_3Y�`�f��M�t��%
��/_����,�D"���ٳ����ɷc�ȕJ˲$S*�hoo����w��ڥ�%i��'��{�ǁ��wQ6*p���`��&%�{x<��;4�Y�E�IEND�B`�templates/hathor/images/toolbar/icon-32-forward.png000060400000002375152453623430016272 0ustar00�PNG


IHDR @LP���PLTE����������������̥����ޙ������������R�
���ꗳ艪�D�΢N�
�͔��s���l�ݷ�ؕ��Mb�9��S��6�Ϟn���ϭ�YS�
��'e�
J�	��,��<Y�"�Ƅy�T��[��[�ݜ�ă[���?��u��`Z���,N�f�Y�h�1�Y��ŵ�z�ʋ��RP�
��^�x�!G�	X���@��N�
a��ƌ��V��ͦ�l��{��Q�ב_�Y�.�؍��������N���򼔷w��T��P�̃��aS�t���߁�8��q�ռ��k��s�$��>g�@�����rn�<[�,��]�븮�|��j��[��I��:h�
��0��z��H��9���쓾q}�"��P���J��/^�1]���R��8F�
��k�:��ip�@��N��K���œ�?��@��y��8R���E��2��n_�'��v��Ma���~�M�tRNS@��f�IDATx���#A�W��JǶm�m{7��Y�m�֏���`����
�����x�I-��w����E��l[a84ˉ?E[��d3�I�s�ޔ��ly�̱T�����R�kI$����S*#�E+�͹�m�xIJ��K�9��ů��}�V�lY|�w�˸p�S���E*;����n�~�`�G��<ʸ8T��ˣ�y�wa��X���U�8w��Q�T��a�6�*�bޘP��@�h4����(�ݦ�ZEw~����Z���m�	Տ�X,�Q�AǙCv]�º͌��d�����2�3ʇ��v�TB��;���!�-Zsx��#W8�OY��Zq+����a������M��'�P(4b�
L�E��63嬤L�)UqNͬ��ȱ+�F$]�#�a�Q�z�ت7�6Sۍ�@U���O��@�@�Wc{f���%��1g�����̯03�j��^˜�w��
�MKj=K��tw�~�61��vS:L�,�g�d�	ᚫ���W����Q�7�-�@`>7�c|c�+��R�T�*��(�K)z�$m]�Y���p�C@�U(Տ�b
8���̫�,�3�(�W��;p����B
ر�K
�m��G<.X��K�3��_�C�]��6||ز#\�!p��uC��s�$�-������fג	�Q����6�u��}���-�����R.!8�$���<�j�fIEND�B`�templates/hathor/images/toolbar/icon-32-delete-style.png000060400000004376152453623430017231 0ustar00�PNG


IHDR @{�u��IDATx��kL���'Ki�jcU�iR��!R�i�4u�B;�#��6BQ[EQ���6m�TƸ�M���5)����\��v;Y�]��5��k���ca��c����s�]���DV$_�'��s�9���{�w��Hғ&B��t�8	*a�",ˆe;i��Ś�Pl��c[��L�~��~�۷1s<N�9|o��OIДU$N��M�2�LK�v�kh(9���o`*o�s����Q3&?�9&?x�|+������~�8a�sN��c"�QLZ�����]_DkŇ����l�E&�^L��֯��u��{��w�-��(B�_�7S�s���{<K`���h��É�Il3�c��P�E�$����|P	���4��V�ޒ�F�j4ʋfn���
t��+�q�Å�7�͐�ޕf�ؗ���v4�k�/���q1a�( j��&�_����~|T�B�@q�3l3ķ����D�侷�ŗ.�sE���
�(!�������
6o@�s�è�+���a30�C8�;t�5�?�AQ�c��?��f�f��-6�g$��-hN��FD^�ѷD,�p�m]�p�$г��l��;�a�fƧp�E�O[n��@��7!�]ܩˑ�[���;�'99�Fm��l��7i�{��ެUp�.z��`�!�o~Iݗ�;����7�sЏc;���N�
����4�I�|C��;C�p'�o\5-���!m��S��{�3�ۜ�7���9�ǩ:79Nk3�IȜC,V�"�:�z�R�&��h���?;���*�Kj�Ma�͎�M&�h�@�H"0�W�����
��)��Y��ƕs���_U�w����=�q}k��a�����U1�?���D��?Y8	���饡�~���<�_X�?���c��6��=�}h���w ����L+���$��u�X�u	���?J�Ԯ�4���5�"%.b�J��I/�6�IŭƧEw=��	K���j<��ʛ��{�(��#r䍧��Y�6���S-������$���n6^ͭ���{�ٷʏvg���y�xfO������T�^ȵ�J�<e9����9���f#�N�o�X�o]���WOw�
��$n��'SY�H*M��d�X'�����E�U�
��#��v�%�833������>�]=�rgW����%���~���IqT���8���z��Q�������~{__���wu��GOF��e�ؖ1�W���0�LOOK�@��z<p����م���9���چ��V��-LKT�}��6����p����ax�>�0(,�499)�B�ϊ��<cc)O����}>�Lv���e�}>�gtT�~T����X��fq��-w�����iӝ�$@���N��#�퍍��,T�KAAAl����B8:�;4�����o�{@ijj��]�z5�ڵk6
�%?{�,\.�J����ͰML+]B$�J�oo����sb'lnn�Q0TTT���tီ[�E�E��R��/���:�QG-imm-����7ӂ�����5ی�gH��K/��(�\!PSS�+W����x���"TVV��qb�	���f��6�%��@Bx�i	O�>��'Oj\�t	�/_f?������2óö��6�(h�:gΜ���������-���0���ض6C�������ϟgs�;w��A�/��%�8�	�%�%�5//'�:�#�y�NMM��g��TUUI>�$��b��Q�N"�C�̛F߽l[���R�f�Jg�
|Fp���"�DM���r��<"��a;���~�����82�Y����db��(z����Y�*��N�ml��z�,"��P�6^�pX�>�����ƢUڈV����Gu��@��O�~x�k�I�����o~Jط���oK�׋.D��@�"��#C�a��T�-����M��ӣ�u��h!0=�-��������VD��:I�J@�6�g�m�[��ŋ$���A9j��D�4r��ΜP?�x�i6��$�y�m�F����#]�Rh�MDa#TK�$db�����7�ݢГ���oD��/9M�
��_lyttT�x<���t�+|�D�}��Z��V�?�>���(�e||\�W=��D��`�i�m�:�W�'�cp<�K���0�@��L�P����I�����D���A��:\�2�^��Z�Gq�~�������B0E�IEND�B`�templates/hathor/images/toolbar/icon-32-messanging.png000060400000004177152453623430016763 0ustar00�PNG


IHDR @{�u�FIDATx�t$��km��m۶m[�ڌ3�m{&��m�Y?�;S=�3'���%ٚ�ݺU�S]�?��S�i*��k&\�tf&3���b3����&:�)2�)Z�,a�3+��{��l�����Վf�0�?=�|���b61�3I.`63됐��`��ގ�O�$��wG��t)_"2׈_�L���Q񖩫x��U��U#���}��[ϊ�\�r�P&�ď��%	E>[�|�x����g���ă�U�]1$��8�F∎Ğ[#I����a$vh��8�ިL�ь�,f�x��.9�<��,��l�cY4�-���@:������ci�'���m�E���Rّ��|���{�y��
R�*�1j	��[�X�e2��c�P&�Mbg�}�$��9�� 9���KX&�\��0	����e�X½���-Ћ�3�H�W�p�F5����~�ؚ��=aA6�ْ�}�{��^J7���:�))��a	D�I*�y�)�s���
W�������~&+1`�g��Z��!��k׾U[[����n������R��Ƞ��_�D�F�*��"�
=v���*z�\K·�f��I��{��
��3�272O���A^SSC������N���t��Y���܆�8��ѰB�:��$��^M$�i�g]V�@Kn	�k�y�����*���#�VK���������eR���@�r{�B�f=>-\�V$�Ì�%Ǭe.g�}衇L����Pjj*%''�
TPP�D(''	�C�-,2��1�mzQ �U
�[;�Qm�$4˧�rB̓��[��+** F���!����o~�:}�4�8q�>���'�<��nK��{h{I/��RAu=�#�����C��S����0�G�I�8���Puu5zkb�{{{�A�@ȉ[F'O��ע��o=�����������<���R����HE��Ț��덄Cë�JJJr�A���E���d��bf&���_��{��7!�N���ͽ(%���!��b�qo?ygg'm
��K~(�.&&&����o,�J�1���� !CP�gT\\�˳��<""�����ɱz g�2�1�17�–�Bഴt���5$(�q"�N�"
�̬,��C*?��0g����R�ܑ^��yGG���<�\�O@V�'ݱc�$�:Z���D�I�D���6$��\se�5s2H����xXQ,{��*88ث�]��~`��fr�=�*��ᷱ��Z��(;��AV��J��J�X\�����Ϙ���Ós!44������@A0C"m����ܨz�I�Մ�%�b���a.cn[�dɫ{���DX������0��9h+D#��b.%%%���W���{<��װ�\*��T>
{�ɧ�FEE��~�3��cB��m@!*�1����˻h�]��>���{:�B>�+�3U�ϵr8n`\�p����oE��\�RB�����FEE�����������]nf�ɡ��Lj��X$��\�*�n�c=�s�.BX�ʊ��
Y[�}��7�r�G�R8�G�
�%˳L5$71_y�U�xn�����/�}�}�y�o���D�I�t�ϻ��^FΕ�f)|����B.a\7[�zO仠R
L���+t��MH5�ӆ����)d�$�e����\
�K �Ѯ�L���N��p����}��58p�_s8����В��5>|xr'^z�Ͼ�ꫣ?���+011Ѽ��[�s���$&�p��{k���Z����/'rqq�ݒF�!GGG|��
�<$c?�x�Wn���A@E��H@��ٙ sss�g������-_���'������X-QWAI���݀��'y{{��N���Ow��<��4b	�����p��mR��쎎����H
���"//�A~~~Htd���x��=���*^ב��
ľ�����dffvw�J��p[2�@6�B@@��w8!�q8�J(R@�� �>��9���Xb,S���'Ċ���w8!�s8����O�/���z��=�p�����O-�bLwN��	�9�;'t��Н�sBwN��	�9�}N$'
���"(�IEND�B`�templates/hathor/images/toolbar/icon-32-upload.png000060400000003724152453623430016111 0ustar00�PNG


IHDR @{�u��IDATx��yP����z��� ��j-��$HA]�ꉠueѥ��Δ���t�vڮ��]u	B��XV�.���x_#(��U 6�_O|��&yCd���3�y	��>G�̼�I}�D��R�m9!7�;�L<k��7H�2��FC�g���89e�;}B��~�y��{yK�ؚk�
m7ˇ��c`�����o3�mJ#�y!j����g�
���CK���\S�pnG���E��h��C1z�MJ��{��~�Zο��e���h�����`�i�U�!�t��d��d��;�7�"`�>>�G�B�M�o���[������J SÇLl����Or�òd�f�F��.ҏ�a��0��}��h�����Rg�����[6i��΋`}������q!�������P�+�9���?�C�7i$ >�L}�wK:(`Q��kY�RX�,�5�x�>�TqᗥЇ����� �����$�A�Y	�[�:3�#�1h
��O��o��V�;~rF�XV΅�aqo���cH*�@�W��`��R�h�SA|F�S�SkΈ�����AJ5vV�xT�+e9H
��&1,k��R
A�b4��A� �é
BH����?_�8�R���!2O-~A���f4����.�a�	(Jx��"r�3 {�Z�]e��f�/*� �<��%���\˻�h �NfU��I5BH<&��J>�?Y���@ĩx$ޑ7�NJ��Z�l �&ʚx\���z6��W��.s�׈����y��}�UBpE�
lE��|���5Klo���h@~,Ɯpt�]Q!g���yr�̀���//�����#o�3_�岽ˏɆ��pP�?�>a^4�J��X)�w�.�JW3߄��Ӫ��ʄ{D�
1{8���
�t���.A�W�Jx;F��ԑ�X۟���i��q'�j�p�
����K� ��
�] �!�����lx��H��SY&�����P����䦖'u%�D@l:4N�|��d�"�X�740�5�3R�qe���A�����
z,I%���h�,��R��c���{�9+K��*$��,�%���鉐���x��� �t�MVSK��c���}��L�ԭ=gM>,e��C��K
���ʃ" �)Ų��#�=�}�P���fM������|.�M�*�JFYJ���VG�WG
R�d��e)ɪćK)�?�'NH_d*�=䇬9SgQ��\B�xkGЧ�z�^�Y�_n��.j�>����h�&V����3� 3�)���"d!"B$H$"s�б�H(�P����EcL��&R'$�X��
Cfӫ8�^
��mx�^Z�X�h��7ɖ�'�7��t��>�	�B��2	��IMjR��E��T#�Yz��|[�-ཚ���h�G��Y�U��\N�/^@oo/<~�,��n7��@���٣G�`hhF���
Ϟ=�dB1��X(����ϟ?���fg=|������w�6��,bA�ft��߿O7w���.x��)�'q����j�F`����׎�3�6A�������W0��W����݃��ɓ'$��p����}� @ �If��4��̯
�#���8
uvv�͛7��ŋ�I7n܀�ׯ�ݻwɖ��0�2㱐�M1b6����^�
w��!�$��;��h�$����+WF���������O�t�ܺu<�`�,�G�����Id��]�Fb�|-c�\��j���F#\�|�ĺ��6�e� �
�N�8ͮD��� Y7��,oe2��p�`0�F����hnn~�s�΁^�'q��	� &��xu�…l&=���E����z��9�	rۇ��������ϟ��Ommmw�����UTT�}k/)���6�T���dSS�������o�N�L��|I�zI�_��x`�PTIEND�B`�templates/hathor/images/toolbar/icon-32-module.png000060400000005445152453623430016114 0ustar00�PNG


IHDR @{�u�
�IDATx���R[��~?Ba�N��3m��Ni�܈'�c;66�l��Y��I�@B$@W��I��߆ܦ�$ά��f��sp��L�!���b�����^{��CD�W~Y�-V�h�8$M�v��좡؄�d�&���cuw,���"-fah6��Mm�hl�LM�Ir�xG���
�m4�({V���6���1��v�Z�@W��Q��;T�d'���lN��z����nLt�j
����N]���:�+���6]��$�\i��+״c�+j��C��j��
f2;�
]���wx���'9��i2�=t������}�������{�*շ����\�G��`8A�.������&����|~}�~�����;�mh�HkܷE��,
��t{<��lj��G��vrS�#J�‘q��
��D�V��E��Ҷ�-�����Ԗ\���2��+dάPe"O����/��R2=C�c�"�Q����Z� �m����2UT#��&9��o*�	.l��&��dK��=�'{&O��U˭�k�E�ϯ�����I}�{Oe(��������@hH�`Vr,X���E2��d�OR�@��S�t�9M��,�V����"�g��b2�s�f��El:A���+182F���y3�yZ\Z�"�����Q<�>��$�4�L��/�Ƣ�4�LQ���Rtj��a����AS�D��B������̌e�:}j�"�6'mmo�VW@a}C�24�%o������)9~��3��18k��5t�v����V���Mz��I��UQm��sh��Џ@>/bSI�����|Қ�.i�^���7��dsuRU(�Ĩ*���y2��4�%��Y�����>{!�5SUO�N_����jP�1j����)fz^R_����߀y��F^��M�ٹy��"K�+�($�.�[
9���Ȗaf���<]�����U�/llP"��<�����)���p�Ug`���Jl��Ml�Z�@�h�̱%�L/3+T�����ӓ��7�B��	�}�.����T�gS?����MS�h�����ǩ���X�Z�
��r}��SS�E_@��z��b�O�t����"n9%���%�n����>2��+����M624��m�LtK��P-S}����Z*�v�U��cC|EE�-�P~�N��B�O��}��#�X�h4�SY��8W����.g.VawEeTRzR���F��|�����7N����������i\T�[�چ&*�)����P���:�I����]�N�������o(26Y�/0���}[�>:C=�K��si*G�!�JS���#1ҟ�Q�/�/%�DS����j����H�1�����Ր�”X��$�Z�\M��@f�ފ�!�DV���:uZ_�;g�
�]7�7A�y�[����c��AK?�ta�6��ь�֨=S���]�\#ei��
�����K�*+��WU�w7>��k'�E��;��jw������7�Px����,�3t�#N��7�K?�����2��onή��<*��<�r1]F������v�C_��n;��r�Xi626FÑQN�


S0��@�z�~����^�x�g�m���70����QUR&&�*�(
�zz<�u���?.�y��䫯��x��i���C���G�ν�
���͋�&�?V�r�������Sx��`w���/������|S��w����׿��������t���)
���"�i�F�&&&4�����
�G����ܻ�R���b(����0)�B,���$e2���!��)�u��=ސ~C�	<4::
��Ǝ��h�*�P��rd \��	������'w���J���#-�b�X�w�A��<��*��f������2w�ERX���[��#���%,�G���ҟ��չ����ڢ��`���,�j�w�A8XYY����7���.}��'�/�U�O?��=zdb}��g8?9�$��8g{{��<yB���X�G���~̅���M}�{�B)�.4�#�� �H���n���"�]<:l~�;;;�X�`�嫀���CA}�'dY%B�R�SD����=v	�	�� ��C'"�3��������S���x���@�pՀ����nu[�z$.
*%
�ᵑ����r��E�#�+�4��h��T�c�!�t C�lUAՃ���Ռ�
\��c�\�
����+ĽUA9�j����kP�."?/^	9��������Q@a�9x��Wu�'�C8n
�Q_��`����"�J�8\;��g�Ee��Σ��PP�_�d��[���r�w��B4�W�� ��W@���;�!����r�a����C�^�<���!w���􏠳�S��{���k���1,X�-S�1�b�CP3�
�d�X���P
\��֏D<0_�t
?Gd��8��
���aq��P�~�D?���� ~F9��= zB
�]����k���H-@���Nj�V����c������S�-�c�1�^�����ԣ��炆9�j�Q�}<Y�(*�Bq�`���m9g��`c�Y,���n;����P[m��G0ϩ��������-������oK�={V��_�?���+|�
`·"�Y+{{{
�}��<���E�q�MX���ńIEND�B`�templates/hathor/images/toolbar/icon-32-xml.png000060400000001403152453623430015415 0ustar00�PNG


IHDR @LP���PLTE���������������������������̾�����n����������|�˶��f�������^��d������������������ō�ǹ�؄��b����ؾ�隺�u�Ʊ�����q����Ɇ��q�����c��}������֕��b��m������������⤿�Q��VtRNS@��fIDATx^}��+1Fc
Ly.33����	�IF��#ەO��QT�`j�:��
��9q�A�/��+���@/��~s{q�;���u�_�)�k����K��ϣ߻��F�]D�w�o�����;�qb�o�.�O�'�>>�~����e|��4�}��y��I R+P0*DO�}
�\>�� HYr�҇����2T�B@�������V�U ��>kK��}���{��P�$�T�"���4��	V'(Q�Sra@$�ȝ��Gy;�ڔ���Z�:��$������C�"H�hӅ�d
@J�y���+\��� �HAY��p	�g�q�AT\d�^M��PnB�:���@���W�4�t�)�N�A�%&+6Qׄ�O� ���'"���#Je̐��
�lD�c��e��O�Ȣ���A���(,x0�r�l	yѥ�����������(�V�qfc�X�a.����Тu+�
�y.P!�
��*�ך+��׆IEND�B`�templates/hathor/images/toolbar/icon-32-cog.png000060400000005050152453623430015367 0ustar00�PNG


IHDR  szz�sRGB���	pHYs��YiTXtXML:com.adobe.xmp<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:tiff="http://ns.adobe.com/tiff/1.0/">
         <tiff:Orientation>1</tiff:Orientation>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
L�'YhIDATX	�V{PT���}��,�,�"�]�QR�����N�'jG��!55�&�`b���&#IK�6��ɘ�LZ%N�btL ��1�_��VAXQV`��e���;�R0v��3{��w��=����J	�A}�ݯ�/i�Q�x)����Q���`$H2n���0bۑ�G��n�5���@(�yh��ŏlH�;�q|���ʩ��k�݊����Cǂ�,l��>�;�p���"X$�s��GkC�C=t����O�]�m��
�6a@�ga��O7C˫���<��P��o�_�����3����T��g���-\cy���D�Z#>�O`V��<5}Ϟ�� 1���޹�,�IL���܃���S�j��e���wѼ_T�C����t��-[$��7lذ�̙��p����=�n��� ^����_����wp�l��F"�
H1�T]U�Gш��`�:���D|C�UVVKKK���*�~l��]ό�p����3LeӦM�5<Ff3��K����,ϒ��ؑ1m�;���������OU����y4E��rh��&�7���׭[�zf���ʂ�N?4�my~�_`�ߞ����]M>�A��i</�5c~1��.%؜�i9�U��)nD��AO���;����؀k�u�^�+{Rkkkg(�
��ihɨJE�ZT�u7ֆ�h8,���"d�}{1k�J,
C��
����$��W�} ��OOc�֖�U,\x��`��n�m��ܹ�I�%c�)�>l�´"!r�Y��s�-�S
yQ�uM����Q��H��1�,�5y��`.:��gW.--)y�;&�i���_���]�.�
�q���J�d5+6���a��.Ll9�d�)ǣ�Q�G�Ы2Q�}����$-Z���$�G��U۶����Ϝ9s�ۇ
���T�4S(�n8�";'P]5�"!y��Zw�KF����|6����X�H�(^ ��6zߛ�j�l�%됴�ڃiZ?����(0!�B��r�I֌@��
��jc�lR���m��=��v��3)2�>~�`!	��چ���yܹ���_ ����N�qI�M����UcekdH]��uz�}�������\�-w���-��O3�lօzgB�x��)�D�a@��&��h��Wc-���$1>F�{WT��p���l�����'����,�� E'�.�$��Q&�L��P�`
��"p�J��!�/��%qG^/p���\����xɓ)�L�Y�T"T��S%�+S�T�7I�
4�j$���`��R�7�)Ψ��3�_����{k�z�*s��)�:�=@S�"�$Y=Ȋ�S�ѕ
�kT�$9��D�tM�VA�J��`�cR�`�pF��Cms���6�T��O�����e(ǃӚ]�98��`��76�]�e��嶁��ց�I��H+P0'�
����z�������-Gpۉ��/�g
e�6!��]y�ن�HT}qIeF�r�_>�I}��.H'&[6��tU����(�f�3X�%=S��8-7�I�B��7i[8_M]_��%x�0�#e�u�ü�Nj/�WwT\��������>�i��3):H�#A���LeN$⡼)S�J�����,#	w"�v#��Wl�Nʀ����j�	��xTk��Q7���k3s"�#�W�+0m��]<����ܔ�.*%NB&�T=��Es��A����"�<||>�fh�Z��H�/O\���#��.�U�-W!Ы�O|�qp<�X}�p��0L�sM��8������	�aAUe�>�@��t�08�iWx�Tw8�z>UP�t�爈}��x���ε�aˇ���@珅!��Dk�?h“�d�Z�R��j]�} ����z`p�w���d�@j�='�YN}��LtE�1��p��^�Z<N�B�_W���]� 1۲(/����[�H����\��.N����Ϳ�	�ݓF�5�i����S�����\���x䲘�t��y���Go���CC�å_��%��w�o�K�*���7�+������́k���-�1���dH���J�u�Q�)k�f�|0���c`�`��x�w��8��x�΃�����	~���(�g4IEND�B`�templates/hathor/images/toolbar/icon-32-cancel.png000060400000004264152453623430016052 0ustar00�PNG


IHDR @{�u�{IDATx��}P��qu�����*T���9`DЊ��:�ε��n��k�b�V]۵�ۮkon�sg{>��s8|�4��`�Gi��/
Đ@�|�OF����?v���~�yz��������[�E� 4��"Di�Y��@k,�r&~�{�x=���'�����<�
[c1��‚-a��?x�4�DpXO�gY�#`���������$`�<�9�{��X��I�<��BiVD;�?X5{��~2w�*��"X>˕���3d�����\��V��v���#,��f�31���z�)-��Pn�w��`(?��6�TǛR�L������N��;�S�1��ݲ�Db�7�^
��YX�5'
֕s`]�����&���ۻ��í�����Er�/O@���}�f�ɛ�܉�[ֱ5�y��װ��弄�%����ύ��
i����0;K���F%wb�F�g[Fb�^n;}#���O�8Ϣ�Q^�p��������RbO�ܒ8v�~�\�p�����xvJ�]��%,����ٴÿH�F��%u/G75�������!�h�m�@E	�5x�w_b�zȄy��$0p�� �;S�[��pS�
���;�;���nz~���
���ƭ�P�����P0L#`��'�2v�4xÀ�͋Y�(�U��9]�!0��������w��y�������1f�a�YlQ��RƮ1����+�S�/ѹ4�劢3�˔:��A	�)A��z��\���M�ǡϛ�jX�]Fh�Ѐ�����i��&%�$IG�oR���wY�M��ꂻ���nm"��ˌ�.'�"0`X�_֞��R�d��u��=��]=�����x\ېK�E����Ϳ��j]I�5���Ӵ���װ�&�A���`�/rbھ��G�v��hȌ���NDsh���b1��o�7l��ϓ�r���PT'��bF��9��I�M��P���B�j[w�a]
n�|�{u������R��kR�p�L7dI�~bj_�_P� 2P�����O7Ia��h.Q_�Z��?4�\�KEՂ�g(p6-�ĐG�,I���Y������ϛ�n���Xd�Ж]H
��X�ɜ�Sd8��;��p:-��t9�Ӄ쬷�/j��8�da[W�L��cpB���q8��#�a�M��$=e���J�'�C-릍��u�4Ey���LT���2%pT5�������p�L��S/�����M��i�-�
��^~cԤԬ
�u(9�qb�U�2T��it8���ȌC�j*�D�R�e4.�Qf��j*�K�F��u�w����)��/TSg�/��?���Gq�G�ӎ$
s����}`�,�</��հZփ��틁�|��%‰�o�<[�l����%GJ�J�?���;o�s,gT��!x#���s�]b��"bx"��TJHx�l�-?�ϗ����o�	�y�A�9~kG��6�-?�_�:�k���9x�g��w)�{>�����`�%
�݄ڍ�|,v��;�JBM�G4Ħq��u�j�����Hï��G`�p��vC�m�'0��f����\�#�Pz5��ڦ!������\AW�uܾ}::\�s�(�4���|��	�*j�rCSwL�o`��4ht���g�T��#�#����\�'���^��`0:c��
���q��.��!<��u��<�ޮ��nܼ�l���z�ՊQ$0PSS�& �N��w��6:�|�(��@UU5��ѡs޹��V+��K/�������<��v444��>B����K�4�)�7n��U��^Bj�Y��4����~*+��:Q�JO�Q�DuM���l7����nTV]`�bhN�<���'��s��hDY�YT� ��,��j��V��%%���D[[F�������;u1a������bb�yґ����9y�z}'�ţ;��4�=�,�0��g����O��c:��T\|XI�1��炢C�>!�P�y����L!��E�G�����EƉ��<�{��l��/9c�۷o��	y?�ꫯE������{��a��]���6�y,�����?��y۷�uˎ;?~[S�T	߾���c��@
IEND�B`�templates/hathor/images/toolbar/icon-32-featured.png000060400000004235152453623430016422 0ustar00�PNG


IHDR @{�u�dIDATx��$M�sg�׶m��=X۶m��Fۣ�m�]h�v�}�ي�������97#����P�{֎b+8<<��������@��r����w������q?���[�p�s����t�r<Fq//{XX�K���RQQ����5*'X���ڔ�ي�[��---K__�dgg�I�.�|��A�)�����
�9��v�J�
Ń-S��~mccCt�INN��.�����ə��Q���;1���m�հ��ש�ⱱ1	0���^�_��o

OINL���bi�����\��sO
�?~,�)�w�DFF���DGFB*a����3R3w��<�a(++kT������恦�'����p:��
x�p�M7��2�m�������J����g�{Gw�����BVVV ��p�*�>�������8�X�0�@m� s���#�]]�����z����?l�0�����9��<�J��$#-�['�ӆ�9�g )!��!-��Ԓ��uuv
��'�������Ato���yj�\���dbb�����!�E!����-�33���$��v�d}}]@ww��(A�'�)��b�s�5W�iӽ8������B��"m'^�"9�>)*(�ښ),(���Ta�;��G+�f&�#���K��-�S�S�q�˦�F�(+P��ho>������)��:::�
�<B�f�� �%ni�
��2>sy@��� �mm{7+�myyY�@��3c!Υ;��(/�!��n�{���I
YjJ����J\L�deduJR��j��ŅEimm�_���l͸��Q��W0�8ĩ����$eb��iUB��N����0���+ ������#��%59Y��Cp���\�FGN$�wF��;)A�xl��o���{
`��Y&`��Ғ,-.ʢ…�a���		J��K�7��/��A�Fľ��
p^���%��+!����gt�M��/)a�ۋ?6��b���"�O�0ד��pɆcH9�
ˌ
��J␠;��Ny{ڀ̬m	���%���8��,.����N+�!e�G����/+�Mm@��?V����۷u(,�0�siY%����p^N��b�%�L#�s��א7�/��on[���6�����.�wu9:��J8��N�z��~]�,�7�5I�?j��]���m��b��4(,�0 ���%[0�A_o�a��'dJ����V	�s![A�Y�P!+B�cq/��QX��a�����ݣ�~HeBE�}gG���5�C��*����S�v&��|1�^^v���}����*�������������'~|�W�L���a@=�p�����?<;b��F��
������y�_SN!��`8`<T��==��k
��=��C~ڏ�����Eey9���j��hHN��S��D���JNVD�
��Ԝ��qʑ�<���%(�z{�q�;��,�sOD�YpO���>V����`�jC`�{NM����9�/AAPɤ�����Ĉ�!��%[SU���qN�����h	
N��P�����nq�j�-.,��HOlȹ�
�H	
z�Xgt+��q�C�R�M�K�DDŽ�͍M��DҤs8�:A!Ĉ���!���c��%f2k�Y�p�k�OP�
2��6!8ݐ
C�+^��AʤD8�p8|��z%�&1�8�[�
ɎPC���
tr2,L�r�w�:AAt���1bAjo�C���������Ҩ�_WW�$�����~�@	
�����,C�g�_ܒ�%�%�NE9�%�Ԟ��gѝ�|��
pIP0Q�j��"!��8�RSSc�<YaY\@ LN^��vEs�QQQ�O(ɚ�IЌjzz:=���
8~��Y.H�,��R__�@~W�+�	
f� ������!'Ƚt�ߙa�
H���*� $$������d���HPtuugrY�{��a�

��8F����ΥF-��[��G
q�J�
���`'lmi��L6��hKii)m�!B�����Ї>�]=������9>鉖}J`��F�;����LP�8�G;g�IEND�B`�templates/hathor/images/toolbar/icon-32-remove.png000060400000002376152453623430016124 0ustar00�PNG


IHDR @{�u��IDATx��[O\UǗxE�9����y��|����|Z�V��1^Rm,��`��R�;�jm��X0���v`�0��x(H�r��spfs.s��˾����=�d�P5)ZP���b0��6Iڋ:�5h���+�#E���p�D�x����JW���4E��BT̄�Z�G��iap�f��h=\�n�:7B�+˂��[��Z��摊!|�
�M���\��a�?�V�¥t�\��M�܀�Է�Bʴ
\L"�5�@ں9��UK,�	.,"���F�����`��2VL7���CP]�3�ZI�=�=B�r����E-��������ҷX�@�- P_���	����U$U�JZ1_GY��Le���l�����cX	g�TN!K6!�=@YF顕#c�
���������L�0H�\9w�-��󨃯>���O"73��6*]s��v��o#|ꏘ��n�o�}���N͢��)��j89�^D�%��9�:>�5F��zfe�w02��FYZ���F|��Omʴ�H�k����5�&B}�9&cB�ޛPA��2j�$5�Y<jݷ*�v�F~��?򾌀��Ψ PF==���_��-�|t��<w��q�҉�
�4	lC:Ԥ�4x��å(ԥ�"o�7	���(��@�j�֠�ˀ��X;�:4M��ñ�$�`:�t^���Sa8��m�$�Q\��(�8�$��M+�=h��<���e�ժ�;I!^ ^$^�9b�?g�,cϟ�οB���{G�sO@ja�6�1e��G$Z󜳇:�Z�LF!"� b�$�Nh�l��i���&��l��P�·��<DX�ˡ�
��sFJ#�#��4)Ǩ�D*�
;�hl���*ar2����yG-�[�\]]�\.�ڌc�iz���L&U'��{��yt������������8?uyܩ'�1�A�?K6�4�Ć9�d�(O�n@6��|{{�s����%W��"����۵u�T����~���7�lll����ւr�Xo���"z 5�7�S'�@�%��X���B�`������@�����F�L�T��s��(���#\�@
2��$��i�#�HU�y�ķ����v3 �%	A��p��]�|��j��$���P����5�D�%�	����*�k�A`��,q1"Ye�(��SSS����|`Ƥ��������E��!�x���jѿ݄�0	JDIEND�B`�templates/hathor/images/toolbar/icon-32-back.png000060400000002401152453623430015514 0ustar00�PNG


IHDR @LP���PLTE����������������̥�����������������R�
������͔�ꗁ�'��sN�
�Ƅ��M�艪�D��΢�ؕ�ݷJ�	��S�Ϟ���N���;��ue�
��b�9��l[�n���5x�!��z��/y�Tg�@��LY�"n�<��Yf���8h�1���G�	s�$���YX�Y���{^����a�����>�̃Z���c��l��k��P�؍S���ߌ�q�ݜ����ͯ�l��,�륯�`��W��@_���a��ƌt���,�ռ[���RS�
P�
�ב�鰒�Q�ᖲ炗�r�ʋ��Y�.N�
��w��R[�,��I]���9R���H��j��^�1��?K�k�:��~���|��T��8a�P��븓�q��,��I��i��Ž�/��z��?��n}�"��a��K_�'��v��V��ap�@h�
��yF�
��e��8��N��[���[
.5.tRNS@��f�IDATx����@�L�ٚk�׾��m�~�m���M�f7~�x�ZJ��즗� E*�7��r��"I)P���N��V�o���,$�����3-#�q�呖�It^h:��0�_�����x棏��������D���+�!�@N��{�#vr��M<=BH������/J��WBώL���
X&�G#~�y����	��opK ��js,��S�T�	�p�6X�4��w&���0X"��d�A>��<�K�����QB����jV�++/�M���IS�L~\
��ĉ�B��,�48���t1���V)�Ryvh�p]6,Ӽ
>��Dl6�o�k<~���i�/�L���ڭ��5�gVV�S��ՕL{C�騈�e���y��6v��8[��L�$9�@�J4����oVe�����ǷU2��^�}� "��$"@朽?sc�E��HTbuT�>��_��GdF����ʪoZ�+�{���	9㬧��FT�^�g&eV¹��$U�H>A��>@�\{ּw�'AkXn]�ꀲ�6QD�u��T��l?|L�f��`��Q� �ю�g��#�C��W)6��^gw�D?�{/9�)���dPĵ�R�lM�He���@�%t\<��,�nl�A���y!C�d3�׉����ӛ[ˮ\�y������nO;3��^���Yu��
�Q��k��7C<�l��+XIEND�B`�templates/hathor/images/toolbar/icon-32-contacts-categories.png000060400000002623152453623430020563 0ustar00�PNG


IHDR @{�u�ZIDATx^��k\EƟ��g7�i6��)%�*նiـ��[�Di�R@���_Q��
z�R�^	�ܕ
hhi���6�6擘��1�:�@��9��4Q�<�f�l8g~�y�}� "����o���4?9-+z΢PL��~kl[d��R(��(�z����[7'@���$J>�3�8�f�B���^���ApR�����%�JU������;'
�W�`��q��Z}������D���N��4vB��8|��W@Me�@(�����4}P��/���C��7��Yhm\0��� +=�V������b�U@���7,�Uq��w �5w��H2J4����<�	tRt�E�w{��<���.��?��O��>@��*�O��e����~�%�k�g�B'��0��i��$l*��\�C^�G1�<��HD!��E�,)D���"
^�=q�( �8G,�u���uD��[[O;�D����S�R"-���v�t	�J۞@����"����S�v;�
(�^�@kh20���bW����x+.}�׫pe:�&׊���0�eu?����W�]��۸����m�D�P
�!�3�0!JUGO�t�$��d���>w��%�~����0��=`@��N~�/LC*��'Q��=�2V�|�]��فXk(�DI)��<� �*�U }��/\R@����^.�c�A�_�G,�P�\�P�8O�{���O�GƐ�@�g@w�@*��%����ic��Q�*�|x3�#���X6D����a�<����h�nG���9��D��I�� (����d@�r���ftHG�D���������.�.@�N�^�zZJ9�.DD�����tB"�Y"�kY
!�Qg�Ʊc�&�E	"��e��g�(��V����Չ�"ŎM2D�		?{��Ş={`嚎NRJ��ݻh�Z�+W�4�?>��������S�T*���E���N���Y^^��Ғ�x�e�`��3��s�{`eeŤc��Ϯq$OH6� [dr�*OJh{��J�R~�q��e�j ��2�poF3���;�+ƌ�V�TOoo�k��N�bќ yBb ��ֺo�J�Ԣ�	�l���Zo�������R��Y�?��l�iV����v����e��Esss��������0]�Ȭ���!DQdf7Lp?��!,�y8[n��Yڷo��\����G��i��0D�\�xB����~���X�\�����	���3A��@b�='$�َNm�o6��MKlR����nL:q�ƍF�Z5��jN���ҕ��!�t������ȱQ�K'$�H�m�K��{IEND�B`�templates/hathor/images/toolbar/icon-32-css.png000060400000003054152453623430015411 0ustar00�PNG


IHDR @{�u��IDATx�X�.9=���g۶�k{õw�`����m<۶m���$i2i���W�In:�̴gn����<w�e���֭[�KKKk�k�q K�����ݻ��(;v옟���\ ࠪ�d�i�eAAv��y�.]�L@|y�`0h��J�m555A$� �U/����֭[$���|3	w���N$�m���?8�i�g�k�u%��}�!`H-�u2��͛7AI�	��'A�Sp��m;v�N����q��U�<p�@/�<��j*�ג����AR�P,��0��d
l��D"e�����o�Yb�@��?E�V��
����F9z{f�1 yK�d0�{`�"��XDX���
>Òu��>�T��@2$��C�_���SKA|��
z!��y��Y����~��F���ᵾ��L��B����/@��b�[!\�N�(��5��8 ��Y��~�g67|5t�@�6���@2
 A��D�1�Y��<�k�Ƶ/F#}�Ⱥwn|5���U���@B���é����y�z��'�Q��%��BZ���"�Oo�S�K��C�=�/��Ƣ�(|b2�<��?<���(�:��_��-@aǙ(y�C��a�XU7
#R�	�,��(|��Qhz�n��[l����,hc3ES?@ff����M����s��7�|��k5���N�#�˒�~`���	8,���#��$̛R�hܰ8:rpZ��V���PM��	覀=��3��Y�k���b���DH<��x<��Fv�w���~�@��'>l۶�Pn�?������W��;�LE��.��2e��>�h�1c�����>��/��+}&�/�mj*��>�m
�����*?	�[k�㖶��h[��G´1e��&��X*�k׮=PYYY��g�	�2�e����~~��Y����^�n���}I�����ˋp�1��&J�_�$��lH�)ʹ�Q͔
��B�HD%Dp[�L��	0#R�R�R��Њ�@�.]��:�����_K���gp��Y[�H������K�0���6�Q�<�_�nlTTT= �O~Q[[�V�Z!''DUU�())�3,Yg�\�U��F�j��.���������Βu�����)H�0;�u��.6<�v`�a���^�ހ��
V�r
R�Kr���Sz���ؽ{7��Ν;c����=��O�ќ�6m���ѣ��ѯ_?�rĮ]�Э[7z�}4��'O�k׮�<:�˗/����u���s�1p�@&��}4Lo޼y���fQ�Æ
3�c�ӛF�[�f^�f>�.0h.N���/���>�ۋS����,�'�0�L7��fy�$�p
����Z2��乔cz=�U��[�sP:k���s!�>�v8�Q��^�J�z���ڣVA8`������3gΤ:v,2ׄc����1��g��8@���|(�����X'�i������]��44Fy�?@��FCaokIEND�B`�templates/hathor/images/toolbar/icon-32-default.png000060400000002060152453623430016241 0ustar00�PNG


IHDR @{�u��IDATx��4G��Fl�6϶
�m{bۜ�v~䏓Bl[k{��U�^�a�n�g�r誧v�=ow�&O�ͷ�F6_����C�j�a���2�'��kY���G�P���(�Ɖ@�t�ɗ�����U�
��*���wϢ�G���x��X!�K>5D�� �%�����+�P��S'{~o�W��[�:��kcO
��ѓx���*(�xg���.?J<�A�G�(�� ��&��t�=�����<���s(�c���$�=�A������1
��x��R�p��t/�ȃm�|�+'x�D�f�Z5|_#9�7�=
A�)ݶ9D�=�v���mg
���\/ĝ��?�l&��ƭ)t�n��b��m;�_����k6���;e'Cnٖ��`�o�^N.����Y��K�d�3�u��w��N�47���as�������]�Eϕ�ѯ'&|��+(���&�~j�.XI7�	�p�H,��i�z�s�^j��L�x5��ȗJ�W/�
����"^r�E������]	�U�Ν鷓Jx��?��b�+��� �r�ǺQo!(��,�6ވ"���O/�yC>6	�T2ݴGk����S4{\���/�jglZ���r`��Ʋ���j
�^z\����+hc�_	K��P���4��Q�y�8f�ͷ�Ԃ��`I ��r����r�|
��w-�g�3B����j��Y�zGA 7~��$�����8��\qd�\�x<K�z����	 c�*��V�Růi�^7P�x�]n��x���������c�>��}��}�,`)��Okn.�K�+x�����\>����?-�N�
H�G��|����p��3�H��d(��d,���4�H���l�Na�
��!�*�Z�Kq��b\�,V���o-� �7�+�f�m�E��X�wŰP�c����_7r����7�xcJ�����V�~�<?���������"�{�|�vHIEND�B`�templates/hathor/images/toolbar/icon-32-read-privatemessage.png000060400000005756152453623430020564 0ustar00�PNG


IHDR @{�u��IDATx�Y�dɶ�ɲ����6��m۶m[�g�m�3mWg]V�xg��Q��]Yx����ދ�����OʼnHL���9����	Ji�$�IP|�G\�677lj�?�|�{�yk�=�<)!X������'9,9��ξ�+�:uj
4-����?���F�{����_�#pB��?"�UPq�e��x��_ZQQ�x<��.�uuu�+V|��/�r�֭v�e�[�L���GO9唣���1����ׇ��}��o>���袌��xNe[�lٯ=��]����6�χ��Ǜo��K��	ABzBm?s�ܹ�����x�5�e<�1�����t�W^z]4z��d�S�LY���O�i�w.S�%r"D��b��5B�8L�0li�6m�6	bZH��I''��Y�r�"�#p�Cp	!I�ј�Fa1aX̦�>̬,DfF:B�ę/s<y�
�q�cD틫��R�;&������/$��`b�a^�j1��g6"�q`F��c��I�&H�Pp�G�<OKm�w��،�"��b1�?���{�X��/Cjj*ɇ!yd&�'��y���b#6������h��(��H�j��S��NL�.猇�c�x
ON&��/����n������B̒���*V��>�8z0�V
�Q���H���fNNNQ2"CCC���:233���,,��;{�:�ߠT�#6k� �C�t�^/z@8���!
����D�����u�IeGv��;����G�;J]������C�Ȁq�V	�1������5���e������GC]=^������x�E4z���l\ͤ�°Lb�Wg�q�Q�AU��3�x%��i���_؇i��p8X�i�ḿ��CwZ�PDB�Y�|��^|���߸@� ���o������˵�c��
1����t:��s{'^we�Ӕ��Xe�A���-AWČ`؏�3��S���1y$>�$m�4K�ڶm�2�W�f1�Պ�^'>ms��T�\!�Am%�h/����bx�(�a�F�1c���n���ڕ����y��\�F�=��3%9�C	�gӦM��6���rl�쀽b\��@��8�:�%1MsmC�ϋlwo��kh�$�H�Rt�.^��L�l��\۴����m�l��f�;��D�@hA��F�H���cD��������-UBdv��չ�T����/--e�f��|&a�y��p�+��3��eTAP!����d�k4�q
�9(!@�…͜9s4mpplyyyjƼ���/�۰>���%
)B4dL��>(�@�(�qPS���lyq�q�
��`GGG;U�'9---��T�Nz
�d"=�À�۹;�O�'b�Q�B��CȌyQ�jEW����(,�.�
4jL��%�����s��p�}L0���EU�#ޞ�x��Ӊ\�C� R�}ȍ�`���[�`����=���;���{����S�R����SPB�?'2�޺�B['�i-4b�o!c�đ���.��_3��vmf��YЧ�j��z�Y��z"^r~����Y��G�%!�����YjPG�U��7t���<c_���p�� v���k?���_���|���R8��v�ڸ��/�R�6-^��Gـ�q�'޲�n��`G��$A� K`M�r�U�>~O�nG^_��g��˖�)�t��{?��-<����@9��/�J����0�F&���?����~�>�%�������P����/�&����h�tA~‘�B��#
��2�D�rd�t��E��(,,d
���nii�����O�Vp���?S�Hr:�]w�W��ʎ�n�R-��V�xKrȳz�D���P���Ͽc���dee
��ڦ�m�#n���?#�'L�D�V,��}��g�9s��p�M'�J�������W6n�v"�)�DHTv�aϋ��q�<�X°V��]�r��_&	�%@zQQѼ=���Ś��
��#�	زe�[_����dr2O6�o����M����V�\5Y���?�.]�t6�Z�5bo(Ȗr�D	�gD 	�R+�`�$$e�L��P{A
�
���Ev���yC+@���	���y��ͤ"�C���*�$
��xU��{6$Wc�6.Lz�g̘q��Y�.䇌m5c-!S���&!wNL[?J�M�)�~�"&�`c��>5Er%�Ɨ�����Q�	�P��j��q�i���bE��Q�%OL��0
�R�y��{����S��l��cp�J���<��o
P����D�R���^QvK��ЂV��s��ݍ
6@�wѨ��g��G&%���jB��9�g��0��N{U��	�Y	K����Z&9I��WPc1�^�3�t"f�@TԪ݌*�磻�p�����$�o�Zm�f�=���s�c�8�����Q
�4&[l�(�R��
���ژ��w�_h�H�RX�1M�|��f�]���!Q�̸��+7�g�f� ��+���H�Ӛ�B�7��&`PֆCl$yL��z�6SW��"��L�A��zr���W��~��ٳ��U�v�c��1��4�M:3�1��^���2�>h6~q�5z?�]�1���
���4���t@�����Ot	�M��s�j�Θ�׫�l���"����=8!wH4�W	��6)"�ӻ�뉵��N���U$�ə�W��K���@j�Od�˗���{j�����-�P��8c%�:;���?Я�@��Yx$�g&;�`SՎ����$:$�}�<����/u���,$�{?�����Q��Y��	�@��ׄ���䋒�P���D��Hd��g����"��Q�'B\�79�X��ND;ӥJ�]ˑ|����z��\Bs� ������)��>2ks"/D���o'��h����3���IwJ���$a�V#���]�xIEND�B`�templates/hathor/images/toolbar/icon-32-new-style.png000060400000004667152453623430016563 0ustar00�PNG


IHDR @{�u�	~IDATx��kpT���OL��]GE�qm��~hSն2ОN�m�2�S�ں3��Zu��� �A-(�[IXC �+w����l.K �\6لM��\N�Mvs#�>�'��=�P����&��y��{{�s��O�*`�0�O�~f4²�2�K ����
��N;��v��*��|�=V����Sq~��������|�Y�.�T�+"`��2'���܃�3~i�gq*g�Y���q8��0���lI@��ߠ����v�K��]���wTb�kR�o��m�����_�P��+��߆ƦO�->�E_�<�.�>�����֓v��'�.���
��
�ro�Bۻ�#XSM�[�h��>z�'�i�>���Je�.��/��6���h��%��(u܇2���4/��j6?�<o!���?s&m�DWތ��	�1����Dd��7�����p`��A���;Q��b������A4�K�N�%]�&�{�J���rt-Q09�]�CSǐ#����9����z
��6�W�"�F�%�m)���*^�`⛦����?W8�ۆ�w�Ә����"�Wqʗ�A���:^Wv��
uQ�I���i��
�Z,�S�H�6}t�o^g��B����\.���!%��=V�n�~�r�����^Q��s/˨�}
�?B0퇨_p=햔��U=m�]O��p��	�5a����̵/³l�����T��Z�)[�\�<G!���hqވP�B�q�ߜ���l�4Us��^��qƟ�t:���Ȯ�a��]�?����Q�a�K�'�S��5�à���r���mm&��G>��7؁=�:�K]l&�ǰ)E%	h{U!�l8��F��`pr��C��W���n�����@�\��:޳:�FMD��* ��Mf/ra�Ӗ�r;ry0e�?�R�����7R���9��u'��Q5V���_�ӡv�ҽ�X��_wV��,��TBh�B<�����u%x�<�8�/���J��2	f߅�W�c�d�`K'�8������C��^F��Q'Gr�B<�O�0~�ڋ��Y	��C���<<�U��6����M����u������CF�_���IR�����o��X�r��v(�&�_�;�����
��D�L�%�+ۉ畳�y��K��K���u�
�[�ac���T�4g��Ĺndy��VT�+;���{c/�{,X��-7Y%OV�d��Gf�e�Z|mf����{��pì����6<���;*�
�G�Q���Mko�p6}���78k�ꜵ�uΦ�&O(��	V����[��ۊ�X?RPXv����{�|{����Ol<�s�oGg8����%	8���D<z{;B���֡��U�jTVV����B���d~�5ؑS��*?��ը�	@���V��]�%� [���ӫqV�]]Z{g�&�#����;����v�}ֻ�����u9�;:�NyN�Z���#��o���oë�
�?���:*6A#,�v�d�.8�P�A�`����T���sp��A{��Ç��K~�1�����_Ż�WVV�������'O&�>}�-�!"��{��E0��!�p��)�	b*��!.y�vYJJJ8@����F q���|444@.�;w��xP�P�.�>��'N�ā[4�#77�eqf8�ummm5mV�3��_��|>����ѣ8v��G����8c`�E0m��?��)@F��"����{�n�ܹ� ;;�b;1Fw��Y��g���`�DK2b��={�0�0���fsIZ[[���B�X�-b;�߿�"�طo��l�����ncI��h<�0�]@\k.���Y�=.t�M;00��O��h��	�"8+V�\q��4&���4��mT�?��,��#�xD�A9+1�[\�M������bhg�Hخ��_<�i�@�ؔ�b�5uIӏ�z%����9J�Y��X�H` �floog��1�	1�J�c(#I�k8
bar"999���uI׭�~�܈�
===,�FQ����Ly@����\c53#���S�6
`��D!�FY6l������Y
�	��H�
���aV� 
0��|?2h\B����"F`�������[�0(���p8��}���L�&�L��F�i��F�{�K��H���z	b��	N�.@�8��8j��F�1�1V�i��Ȕn!�Yk��$�]@L�B���$��f~|7H�+����{5Q�Ol�$��gºG��#g��]����2�>b�p�rB6J��v����wD��n	b��0��W�%��WWWgP__O�G�̎��%� �(��b�0��E9�&J�)�l0��	�8.�פl��?��nx��P��\G����IEND�B`�templates/hathor/images/toolbar/icon-32-trash.png000060400000003342152453623430015742 0ustar00�PNG


IHDR @{�u��IDATx^�XhG�fv�WR�&�x��J�H��J�҂�� ��P�[�
R
���6H+��0��&F���X���R�i~�]�K���L�
�����C��N��y�|����C�f+�(�*D��{���]]]�O�<�u{{{�M
�!��V]�p������3�oߞ;{�lϱc�~:w��w����7��˗/we�Y9;;+�<y"����7���`����G��D�d
<��͛7����`�6��$�mۦ���ñ���oN�:u@�BM��(_4�g�;�$7}�gK�t �y�[�[�N>��H;�݊H$�D"�R����!
455���8~��;w��+r��t$�
�
��֏?���D�����\���.��	|�u,� ����5�-,�,��cɊ��H�~���3��Z�V.?�omjy�Z
+pm6�WT�/�- $�,`�)����H����8,;;A$^���:$��
�ΚI+�",U[_׼�a=d~V>k��b�N��u��4e�U�h,�G4�@,��av|��㬯0���H	KAE+��KEpRE��-U˵��Z�( .��wKR@��SȞ��#y�ףu�؞l�S��Q^����,�����s�5�������[p�ŴB챜|<'�c��7�L���`hRB
A�TL@�.\�BR��1޵��p�+0���N�"'W+��M`�^
hAf[1c���h2�$����R���P
\��5�Q�خ4Ș��^P�3��)�p��h���!�%�HƼH�`�cB�E�!gO� "@
�¬�w�g�N������m�H���
9�=����kH�����48{&4H��j!������O�	���Q
$,00�H/���w(��9�\H�~�-�kJ�|���ԄNdŻ!�3�(���(lPxk��-�x�k�JIx_��� ��w}������B�P�~�� �3�ᗐlqq	�C9�+��P���d�´B!}����mW�h�WP��� �9-����,�=�;�w�7�ϛ[�t���o>�s���a��KҖ�'���˷s��AǞ�^���(��^�^�N�>�Q[[{����͐R���8��9��Ą�������R)��� ��]W~:�B��2��|�q�F}�@`iiI����Կ��i�MMM�޽{�d��S��}nq�X̟�
��yOO�������@��*>66FI�7c����Z�[�n�S�DF��B�?�xJI�[�333k*J��3g�P��$G
LA�^_�@�ʙ�j������}���� �)�w�Dd�:_
z�J˘���y?m�����ŋ�����QO�-\^Z5�_�ޔ��q��/<x���9c$�3�5"N�555��z=�M��o�'�6���w��b��'P��<ǪH�!���`�w朇U�_=���MS@Ϫ�'�oT����>�E�	�@�5�/�)��D�{�#����T�,K���(oaX�	�+�O4`�@�T*��
$�[�ϱ{��P�<�7#�3NV�j�4��d2� �T?��+�?��z��/���P�
��C�	�i�����=�k׮+��6۶��V:I�aVݘ099y��������'Z�]o�"R�@Β�*��?^��s����b���HP���I:IEND�B`�templates/hathor/images/toolbar/icon-32-edit.png000060400000003220152453623430015541 0ustar00�PNG


IHDR @{�u�WIDATx��_L[u�O�nsn��1�8�8U63���'5��ތ�ɮ�Fg6���5R�`d��
��BK/�,����,p`c�1�I�^�b�p<�
)����O~���s����B �ʪ���������wq�&��D{�1��p���L"g�hbh�4��xo#x��QNܲ
���fD*H�o!4�X?�PE2���)S��%ǔ��%.�wN#�u��nkܭ��у�.,�@MP��i$#Hs�lk�ā�8�v�ݎ�����@�5A)X5�4�M�7��n��q�z��V��} �@�U�ʯ�&�}M����kl[쯪£�b�`��I�(�l�dT7�j��o��k��>t���ޮPL��cA}
��P4�PxEF���>��-���UĿ=�;/�kRm��۰�!ԃ��3'���vޯހ?�g��#�
�6`D���XZ�@�/;`q�g�s��h�6p�w��RT�E���ş.�gQ�
��G��]c���wE�S�ڵ
��Cȼ��Y��ޏN�RW�#ȼ$���~
�c��g�7/����ɺ̣�m��
 ����j�Q*><��#���܁p�!�o�6`j5�1Jʸ�`jQx��fl=gÎ�fl�����`q����,?���?���>��!��!�q��c��W���z?�
��3�|]�V��k%�7�扃��2��#�q�_+l;��p�^?�"±6��-��;Nq���<p"��Ć��)7�!A�Ӱ�_DI����,ݍ!�!�,:i����v	��e�&��
�pI�]!#���H���C�!�u��7�H�B8T`�\��(��ZLp(/)$�fL�G��N#IEO����_�{��	����XOlؼ���g3��'fd��o�?���X�h�ܘ��w�w�_R��r��D�������V�Mb�6��x';�x�
�55�9bM��UE�%�_�f6�j�Ib��EbG��{���k��V5�U��^ ��骁1�zB$dQ1���+ߞ{<�E���*�6���ࣜ��n��@�D*.����j��2�/�=���7R�0�u��֦�൰T�Z &$I©�)����P�����֞�\.AMD��f�����Y�5�===l����!2����<@Y�qff��|s������s��)P0Ҩ����9�{�����$����#x<N_{�p8DN�Q���|�|�aq^�K8/N��ݞ�>}Z&Paq����a�5�b9����M�������Kǟl�<�ް��5XL��x�\�.�������I���yj]���
�v{$���~TԺڏ��$+**��#�����5���2�8Gkk+^����}M�������yii��8��
811����aq��xO,Σ�������&hĢ�"looWL����ω�t�����$G	2'����f���F�y�E��y{{^PP ��:&˕���t���s䂴�D�gx-�k�����鱄���Q�/))a��<�2��j5��暨`�Y���y�&�(R�H�]{n6�wfgg'�8q"3''�O8x����755u�=_m�W��o�����4IEND�B`�templates/hathor/images/toolbar/icon-32-contacts.png000060400000004732152453623430016443 0ustar00�PNG


IHDR @{�u�	�IDATx�X��Z=�hm<[߶m۶m۶m��g�k3�$��mf*�L6��U]��$��۷�o�e��"�/��$�!�Y��@{�y�!��zl�!�I
��p�Y�~c�a�����g����T$-Ai冿�+3z2����5�ڮ
���\�d��!�nD#5V�R]��j���666n�T��j]K�]��^Z�u�P�3��Y�bDuw����H��N4m{��8��O�b��O�M�~6N��Y�!���	�\�Tm��f���	|���@������x�ְ�:hp)4��@Y>���X��ֵ���8l��c ��_�%�
�<�.*��`0��j�����Y�-=c1�4d�i�[�6uƕɈi�G�RhN"�@��E��{`[DZC��m=������Q�PS)���K7
a��av���po����أ������_� d�մ�]n�P.�@׉��(0i<h�q�e8�v�e�-0��3g~�Rէ~W�vVT�'�Y�}���V�"
��i$g�l�	4���k�	9�`��D��v�jv�M7��9��8�u���*�a/���a�`,64&@r�,��ĥ(�4z�]r= UI�ÝZ��2�ME `���� L��4$��KGU+)�>�����5� L����U\��$�L��d���0�;��%�~V���@��n;i�u�e������N��w�����~^��6H�2�9�����
P�Zg`�k�:@��]��$����P��0����n�z)�誵����q"&�l
�Y���v�Yg=E�s��Xk�񽕭ܵ�!	�
.���ԡG�1���}p�N����.�"�qm��ۂ��I�]D�*��I��uj���
d�ݿ#�[A�ݨrC1�H�9��Ҝ˹�V����L~�H�a袘WӇ�*xs��`I���T��ڬ�r_û�:��Ӯv��ͼo#
2� �ȯʕW\qȈ#Nj3J��,I��ץ)����>\rUMCEVl3"�#0����O�؅c�
��NU��6|8丄t0BU3QO@b��F�|�ʊ Չx<��H
)7��DD����X;�S�!����C���X}���!����<�7��(�i%e�0O�ĀD�v��PɤH��VE� (W�,��`J���^G�hi_��	o<$-�i��b�,�G��pqMij�q|��o����_ߜ�3��0R�[�Ə�w�����`�&0��Xc���^g�U���e����0(��&�#�<��ɾ����\m��j@ Xx�V��E�w��V&K��6@���h�5�x�_��쾳e�+�HuK!�)�6竏�ѣ����6I�SH5�z���r�%nmz�3�.k��3��G����D��w�	��:Y�0y�ܘ�Lo����40-L��H����
X�J�����u���4Ų�l)i�4A�*D�ŰT���#c
�L�-�ꪫ�����&���ߴ�j������y�1���8q��K�,��Ȳ�a,��>�˲���q]RR�w#��JB/n+B)�t���L&��sr?�=/(��o���W��M�|�?��k�>d�G`ѢEX�p���,�4hЁ�#I���_��r{q*��%
Uq�����u�h�sI�>|��U��wZ�0�����`���DQQ�[mmm���"����%����?�$� ��cǂ�Z�@�=z4~��g$��$�<����
0�"؄�K�.u�����	�e�aÆa�ԩnp7w����kr�S�drg*U�2^M��.--�v�����k�/�F����ne�V�MT�G�qW�	���W����e�G��}R�K�v���~�v�d�W ��_d��+Ÿ>��viii���]\�����$
��a���fW~3��y�0f�X¤������ݴ���Ƒ��0]s~{�ٳg��
�,,`b~c� �裏V��Lz���l�Wec�WUU�S�y�<NG8o+���s�{���]dA����e���:��gx;���~׻?����p��o������\MW�X:�:�/_�-e���o��!t�D�8M�eWWXح�J�'�=55594g��.VM�#�?���3�U;��W�
��-��g8q��"���?���pR%���!{���'�s�GxL��sTPce}���f����;����L�=�"��Ћ�W�ؿE@Yo�����z�7B������;X�nP>oL�x��Z�l�_v
�{��z뭕�*6/Я�8~�
���hU��ȻQ����f���ܹ���� ��Y0���c�W�wտ����Ky�3����OOJ�԰��|O6A[� �)������Y��=zv�'IEND�B`�templates/hathor/images/toolbar/icon-32-new-privatemessage.png000060400000004456152453623430020436 0ustar00�PNG


IHDR @{�u��IDATx��YiP���Ġ;Z`��G�F5�!��+U��R�h7.BEe���]qD�7ȡ����<�sTfwm�y�.��j)	��UO�t�<�{|_�� �{�cq�cL`���)�`��>b|˜�0e��1������e�ʕJGG��|n�0.�/�{�Q0�3,�6˖-sݲeK���_-��庶�6z��5�zz��yyy@�i�U9�1�aƘ����r�%K����T�������֛7o�"�����۷o�͛7 I_�|I/^����V�~����`��.� ����.;;;�������*&z���LO�<������jll$�:u�
p���dӦMG����5�����.�$"���!


���B��W�vECJmmm��:)�Hށc����=z$������f�|��A�>&�@�t:��SF�����s�6�!��B҅lA4$yii)�8���p�B�i�X��Ԅ��
��7n�;���W�^E)%������n�+�9�*B�$�n݂|I�1<%������޽K̹��$�<99�AJ{!�AL���jD����e�����!ɟ={FO�>��˗���$&�������I�_������˗EB��ҥKb��ܹC�o�E"� K�v��)�	��ҍ�	�7����q�{��y-�g�Х�jJ�׊�4�m���v1�G��̈́	x`���t"��#�� ��,[�]vUi+��:���[@�B
I��
Q�t*�2]�Vӽ{�(==}�L�r�
�'��:1���#3+�CQ���PCF�7H�m)�_%E����d�F���_\F꬜7x&�fB~~�?�H$@}}=�I����&��?�kiN���т��-�y��4?\C���dr,�,�������b&�`�R�?~L� b4U1�eM�,<���+�8�����7'��cu;}���Ɵo'E�M���&�i4��ir
N!~G���SOO�l&E���H��s���q���e�̸
�YF�b�� �)	Y$�>!!����fR�U��oM�8M[���MmV�����7n�fb4	�e$��D
`}@�v�h�H�DB�h�$d�H��#N����DB�-2���~���J��v����+Q��t��5�T2"�@�:ġ���r~W ����ζ���\2J�G™v�c!���ՓXK>�4�'��=O�����������r�
ݿD�v�浸k�Z����NLLluww��رC�t�R7ccc'G�Ê�����Z�I��MB�u��H8ZDR���y2b3���2d�i@@@>DpC�"##��ߟ�aÆhd�w��˘���P0��Y'�̔��cy
�#��k$Ց�,#�;�<R�����i��i��_����c��������(�����i��gYDj{&EUv��
Y�吉����3i���fy��^�&�w:M�WrǼ��n�o��1��FV�DT~oQE/��E���}yE<�O���ͷp汿b��θ/\�͵إ�:M�S6S��jQGF!�4ɷX?�;���HN�gs�m���6�[3iπ}�{gO�Ͽt�k7U�o�K-�����gR����8���s�c�L��������z��H���;� ��X�b�oە۶m]`���������`�ï��~�o���ŋ7�]�֝MUtt��_�G�X�j�.'''����L޴T1ш��g���ٳ�h^^^=?�G�ؾ}��X�f�X����g,�����?�z��?PXX�~�������@AA���Μ93����͛������8x��`�pD��i����jkk�����{
�		��x`��?r��N�SVV\1�{II	��Bp}�4 65�͗ ��
K��bWb��
�X����@��_�x���ddd��;wn���J��F��d���� �����-E.#���J��iiit��I=?���ݻ�� z�L��b����=����'���p�����5�ԄҌ��Z��'$$��?��S�N����j8�Z�n���������a&�A��45�R��qqq�������g��XaT�hd��'N����TJ�\�����s}LLLBXX����Y]vAj�ԣ��L�������0����g1 ��2��ٍ 44t�R����+c�V�2P=�w�g�#̆��������g�P<�)eQ_'%%Ű��������_J���L#IEND�B`�templates/hathor/images/toolbar/icon-32-send.png000060400000003771152453623430015560 0ustar00�PNG


IHDR @{�u��IDATx��ML�Uǻxf߽�1����D]��v������ą&~Dk���ul$�UK�REl*j(�-8|����]�)C�(�ia
-���ŝ<<3�Pcf�M��a�>��?�s�î��3r5


��������	Q~~�=,~�ȑ����PUUU���O���D�a3,ѹs�6�$CCC��䤦��5;;�x<.��ٻ"*,,|���(�A��ؘ�]�xQ������ҕ+W������%-..꽪A��S���2�����5ϰ^V����%/����
��dnnN׮]�����@��ŝz���N���ů��LjppP�+���b���_��p�իW��E��D"�+v�h�RS������'}�K���.�,���ׯ���x��K��6uc}S/��o��t��(A�Q�ń��!�q�F
+++�}J���{u��z��v�)l��A]�|�MG҈	�K@FrH���*��DDT�?���\*0Y����M1&�b1�Z�&O&�V��<��A���}
�+���֗�ڮ��s�y�旖56=gEXȦ�@��n��:�3��5������]��<��N�X͹����L��aM��+k&��n��#ox�?�{dJ�j�X�������>�9�P~��O���@�b�[@lfN�	�n����?��lASd\`o�	=��z*��W�-��d�j5fff���o~8T�(,�h�����!�x�x&���
Gg�)�>�Yw��m���}q�5-
�o��g����+ճ˕��Z$OwB�K�6�T���&0�2���O#^h����6���W?Kygx*.�Tמԝ��jC\i�8�HՎ⧟Hn�	�b<u��u__+���
�m�:�.���?k�%�2�'��<���ŋ%�;�S�H?�r>�̈́.lP�9���X�a4=��F��1黀�����Qw����'u�fB���h�q�1s�gB���ގ��1���R��!?��!u��dB=����g�d��5H�+�v8���[��?*���Lc~�YAG2��mLXhbb�BDC���/l^C8Ϫ(��2X_5�>��Q>!"}��l����
�(h���=��7o��񁉁|9R9�o`�>D�ob����f�v{�Qb�#>�:��pR��0PF�;3g��\�s�ӻN��qda��j�!�;cg�z455=���JOO�����B�{X�����Mhdd$�6��� 
�Ç-�^NM�m�h�7{W�;��+����g���� 2���=!m9m:�n��ϟW{{;��H���Jj��%/���A������`�E����o���=�`����(
��
2���!�
+�\���I_��R\iad"�u�V�w��������x���k�CL�!�%�}�v������cR}}=��kF�|ӑ4b��%����VnA��d]և�7Ř�R�Y�&��^�ư>��-(L`�<�Z�=�@��y��Wp ��gQJ����t…\Z�i��uuu�&e`�W�A�Q��f��@K^]]-���,�g�zss�-������	�>�TLp	�e�V4$x������mke�j��wtwwD",�P�<���^�~&�������j���J��C�d�J�6�s��3��	XE0"������;�=s �JG��n�ϒ�e�����1��B��p���V#�q�d.by�o���f��P�I!�y���g�Đq"���
r���ܨ��	�g��"1@���@�^�2���(�v8�	^�͆�L]��L�g��0�����D�f"�[��γ���
y��R0����(��>�p���y�@X	���A\���I�l�m5@C�G,��-F9�Pooo�@>� tW.�!��x��@.D
�w;���_���/\�*IEND�B`�templates/hathor/images/toolbar/icon-32-revert.png000060400000002554152453623430016134 0ustar00�PNG


IHDR @{�u�3IDATx��#K��t2��mۻ϶m۶m۶m+k�f��~�����t�z���ܮF���d�Emhz
��H���"
�f�1�eo�4���F�.�y��q`�����ƥ�ތ��I���������{�e�t�Iy����dlٚ�J�d@�F6�z�kR�G��L��R���\$�Z����F���fW�4%�fǢl�gV�����܅�@��)	�E=�e���pW�&�p�i9�D�45<�ɭ�Q��%�JX�R���3�X"��V�|�K~�qcf#f��ou���Z\��X
X��
��k�[��1�k��t�Go�h�n�|��{�� �hϗwߪ�M~+����V�N]f��4��|��ȳ@�J�ݙ	��no�V�LuHb��Jd\���vo�cd�=�dU��Y���8Zg1���X���_��볎\�>9�.@�����o�W?
3`�w����C[]կS�™<6Fӫ��t��a�FE����p�y<���P�_�fƸ<r\8���cN���O�!۵��,��g�Z�g����?VO$�r1�<���48N��n)΀�?8�ݶ�|�Ud��y�G��D�A]M�7�l),@���ӿ=��O��eV2ѩ�1�|�?���3 gc�IwN|���&�0m���DC�T�<��(�1A��H8�������x\�
� ��?��k @�Pָ{]��6�<9ڝS�{,���B%`
�Q�Lxx,���ܫ1�gq^	�)<�u�=Qp8���”�0@?�	�P��d2s#�ӓ�՛�j}Ӎ�v�M���%�|��|�L#G&9Jg���WU������s٤t:-�Oq���@ ����,��*Gq�?���/��N;��SO�����n_<������ph�z���3a��l���oD������9�˗��8�fn5��H]P~�嗿�D��`�@�{��xqM�u �}��!�*k�L&s�p8�'9/��JG�293ս/}�'�o������H�Ln���w%�W��ܠ���vyD�ѭ��,��G��܎j�@ĝxG�8E��ϝ����B�+���40Ŝ���/D�X�J�0���kge��KQ�Df�Ʊ��93��x<�i��
�s?&j�$	�[Q�Q�6#*X������[�^w�v����}~Qh�{����=P�A���{$N����,�A���q!z���k���t�ڵ���(���_}4����Y��> �>}�4p�� E6a����_C����	dAv�����IEND�B`�templates/hathor/images/toolbar/icon-32-config.png000060400000003352152453623430016067 0ustar00�PNG


IHDR @{�u��IDATx�Xl#W}k���u����rŬ2��'.3s+�
K�23sef3sbZ���2��8���*�Ic��̾�����M��~��������9w��c���F#�}��.\�?
�|�^}�c<+{�h4
ʚ5k���޾>���c``���A�ؾ���3�D���R	��-���_�a�:��ףF({�?��p8��u��c1�]���Q+��XL a�E�1ߛ6m�����˯���6�9�h�\��R��_15��`�I�eKl{�o��F���%[��+��+.�J�/�6ओN�����GC.�G"�}d��'m��b3�����ގ˯��v8�|Ǽ��)�6�7y%�~�}�=��LAP��Lſ��;ρ
̀+n�)�sκ'�d�b��"�N0�����$V,[f�.��g�M]�Ut�P�m��&��-�1�ѧd�9�Je�]�6�u��X$tvt�K{�U�19�`bb�_����XP��C��!��u]�p
�,f` ���.̟?�B�h��7� ��\S_P(�Q�EGaIW6�ܟf���J�tץ�LMM�	94D�iJ���A�ރ�o`�UO��l�&�l6
�v0<�@��¦6�e1��>��T
���6+P,���>����=#"�̙�7w.b�8�a���7p�t�53E��֞�����e˗��L0:2�S?�	S��e�!�A�tG�J�X�b��fR��O�{�@e<�1���l֪��`|$��T�Y��&����Z9m����}F�^�b�}�%�y�],7��W_}sR��Zy������V�I��2&8�p�=�@�/G�.���13�\��ov���e�VPf@�"d1��'+���X�zZZ[el�e��$��X,f�~�����=Ԋ�!�/V�Ԝj]@jr��x��B
�=�Xh
��k��I�=S;nE
�zT�p�L�{����A�����\Cb Dz�rpph���Ș}Gd�H�X�'�����-�#�O�s������^�
�.QcmRd��%>�K�b�;Jϟ�
Ā:^���T��Z���������đ�c��V�~�8��9���D"��`fFGG�~���G�9o886�S+l{�d�'����d!"*�.�wǵ�Ҟ�q�!8��8�d�]+�=�m�HN`
Q���C.��
>)�3�\�F}ҎmO�5 �B�����644��D��o��(222B���) ���-X��L��2�Y��à���ɜ

	S��S��I�(�y���n;L��N�+�B����,	�v:(�	�(��uJ�S��q�#y����OB�k-���]�`5eV�m�Ak�$c\�6	���g������l����[N
L���Yk4�:g4<k
�&�ڬq�e�j�2�l�H�ِ�� ��f@�e��ؾ���g��M1"�St
�R �H�s�0�bL�4�x�~m5�9N(6/^[��<0^G�.�Ǚ��g�e�^�{oT#x
P��$�bV{��o��+��`�
��թӣ�Yf9+�k��F�j����~��1��vӰaV�T@V��X�F���=��+��'z�s�b������`�y���!8�C�Q�~?�����������#��IEND�B`�templates/hathor/images/toolbar/icon-32-batch.png000060400000003631152453623430015703 0ustar00�PNG


IHDR @{�u�`IDATx^řMlg��|�z?mo�Nb�8���B�D�nH��X$āW��҈	��^*���H�H�JH�E��r�I�zwf����J�9t��zV�{�?��w~3��Ļ�E�=P��A����Xn�|�=��z����艭�,�/���s�ZwV;1�$��Ɲ/��n��Ӌ�Ѓ���=�P�|�_��t�a$�vR����־����헷�n/]�z��K[�7����7^߼H5��l�����Rm+��`��fZ��<D&�'��?����[(�2��2C $�Nj�ψ̃
E0�,�e!�́�\�@{�#S�Lؚ����-t �n�5l�`���Mn�;6,psG#���P$���M*�Y1����3!H���Qfp�Ay��6������l4��3���8Q��l����v�����Z,P���	�M,��l(�Hhһ�&ݺW$��g�u�A�<�(���"�ʊ�&rzs�X�}�Ե��v�j�ޖ,�Ft�Mg���|�T�Oo�I-� ��1�#�9�/�l��� ��wƍ�3B��|����]���/�����^�(c�W�v���� ��?�
œ����{���ݯ�$^������:>i�W߾���a�o�v�N�衪�c:
D��
��t<S�����<���������T�R[U�e[�zMW*�P0e��<+ꘜ�Ј��h�V,���`%�ʖu|�?Q����5C���C_��XahB����M8�ʗ#�G�50UT�9�\�
m5vq��c�O-L`*)U[��U��Vc;%OXKǭ���|0D�"@�Z��\�1P]dž�V��_ҽ{�XG���Ͽ�ډo�t��U�g���A�x��g���ܱ�/�^64$�6c���>	|h�}qsWy�+C<�ڼ�40����?�H<�E�T��z��_o�bU�/��\�/�!$q�կ����|{��CF�3�U��v�u��ݝ�6�!�g�,�`i�g>������c���]����hJk\����4?��ړa/gg+Af��[,h��^�y�����p4D� -H��N(�O�u@��Z�H�����@����q�"�`H�㜭y�PF�N� M�F#�G�?'��H�Խ��ޓ<�O&�CK�:�$	�0�X��X���0��- 1%�����F܎`��`Q)<�(#췌���tZ�IF9k��ž�Nq+�Qk;�I`c[�$��2l�Xe�
����9��R>9(����4gC
���bY�I�BՊ��cE��qms֖�H5NS	�n-笖��+[P�-C�^Ƙ���[-|�h5[o�����_�8$N�z��?����Rw��
	m
���`iq�=u��a^c$�qݮ��~���s�ܹ�^2l�v�mά�q���~{�����:���Cg��X�q}���� ~p��j0u��u���Leܼ���ե�/�t�[9����<��%�<�'S���V'O,��U��J���Z�&WjD^FZ��h&�"�cו�%���(�	�$Vd'9��$I�LJ�I�5�(���\���:)�{òXv bA�YT�qnC��Ը]��ht8�`b��p8m�Cײa�����p:�";c�%��kK�)ՀdԶm7�^�ՕJK@��:NsVԱ���c�>D�ZBg4ҭۃWItx���|9V�٣t2�>
eT^�nhk��1�1ag�}�u�����g#	#?a������fssae�O����cXm4;�Λ.����_�|�_�H��@�V�\<7��ϭ^�ZE��#�F��
���7ז�$IEND�B`�templates/hathor/images/toolbar/icon-32-calendar.png000060400000004003152453623430016365 0ustar00�PNG


IHDR @{�u��IDATx^�XklW�ffߎ�Y;������T&��@�!V#T	H�T�����R�$� ?ʏ6�$"�/B����"�����()y�J��Nl'~��^{ߞ�0��Wx<;���
|�͝�ss�w�9��,������k�C���HC��`����c3�$�:�l�̔'�y�X�G;���� y��uowG��<R�Z�p<��>=���lE�a��-A���(j�.9i3;�H���/��CNW$`����
&�:�5���T!B�_��|�PQ�ÈEl	��!(�&�22���������
�qy���=��R�NBݴ�)� �Mm��>������׃�mu�����_!��!(ٿ%	�T��P�$�8@���B�hq���ZsssV�����-E�� �J��ڦ�v����q�j��{��ʕ+X�d@0M�;Ĉ���n=d�:k����0M|�5�JH.�-�t�����n�= :��S8��p�oi��Q/~8��ߟ��wG�V�CKx����h��=�~8�.>��遟|���e�n���e���i�n7�Q?3���9�����K�z[��aU<`<�8[�?f
�.k�9���u�r�Ar��w�O�u|�ASş�)�{�qy�!�����
�B�Z�g:��Sm��.axh�L�20�n��oFV1�H8��kp4�W��Q"��c1x����IR�iY8�)�H���>H�Rbd3&���;�v�����}��#݀a���ߎ��Y��"�4�|µ��g��[P���xg8�W�8k���U����`->J�Ӥ�hȇ`>��}qڷmE^�1^��Z�"~5ЉW2E�tIf^��H
��5b5��t���r��;3M��MeĚ�H�4�d��M!ڭ<N�k�!��aX�(�.}��y�g#��mM��[��Y�vC
i���>U~�מ��χ�y0��
�u��I�z��1r�D����s@SU��BZ���l�!�r*g�_[�j��_υP2�KK	��n�5��EU�(
�)�;���R��n�z,��Y�l�ɚ�>|�G@4��q@UU�\��	;����N���*��T*��B?�&aY�)�=C���t�\.�#��~QP3���������	�8��N�� @Z"��+C�}���*�������gq�9�"���Mi��X�jf�VF�?W��U���X�Vk+C�	)���9��6�_E��Ȝ�f��A0���oP\�z��$IG�~?8�&ZS��]�&d�8p��Aq�ڵ��h�m�B�����tz����ܠ�w�f @>���ģ<�nho.���g��\��T*ayy


X\\����6Da��|���\.B0dD�#5��O!`�B�Pտ
��[������y7(�-w93,�b�!�M�^���̳AAF-�L&c
�V����yK�u&(�^
'FFF`wHP+H����G�{��E�p�q�B7�dd�Y,--�>��u��0�	CCC�u�n޼Ie�ϟ��‚�;6�@ׯ_g�s�0==
�
�h�ܹë"���3k^����J6ŗ�D�*��y��^�Nf����+c$&&&���ݻw#��#�JUk�T��}\���߱Xmmm�e���ޑ�ͽ��D��qGx���P:::h8dv] #�̼�g

�}^t�o�Nk�=�ݢq�bMII������ZW��iPxxH�K�Ř�œ\Jƻ������yH��E9�Bs��mz�
َ;j���D"A;#}^)�Y>�����q2F�(��s/Yҷq�r��;���NMM�w===tѠ���vSN�B� �4x#�*rd/�/_O�F�g.�����wبJ�)�n/p#�$�!*Xt���H����5��R�Ztc�D�WO�ڵ�ՠ��=m�|���{7(��n�>n'�M��gm�Μ9���ɓ'y���mPp4(<�埕X��Q��0IEND�B`�templates/hathor/images/toolbar/icon-32-checkin.png000060400000003166152453623430016231 0ustar00�PNG


IHDR @{�u�=IDATx��OSg��E'���-!ۜ3��(]ܚ���e3�d�WmE`��E���T���fm`�M�(ז�܄q��О����[L4�&�����Ĕ�"9�e�ɇ����9��}�鬙13�1��s�#�$�ݾ¯�DpI�h<-A�h!
�I�M���o�b�$��R�4��\e#�/��q&�/8�@�D�:�!d9�	QP���+>�De9�@5�
񎍰�C��GHq��r0Uƛ�j U�e?*�iH��
;�s��ċ�?���[(�N�ԶvYVxpƶ��E��zU�n�p�l'�%v�>� ��'�BBou��' �?�
�a�a�8b��]�䤋��_皤2���2h��O$\���?�H�j�œ�AB��C�-d�88ֻ�Uf��R��b�/��sD�����U�wC.-�F�1�[�C���%�A�16Q�}u��(����k�̃\�Է��a��$5� �o��|�6�3eH�	��N����;AiJ���M8ǃ?uG�>R�>M&�����!�q5Ct�wp�t2��Нx���:���^J:NunE[�;�ӯZɂ�����/ƑغrL	���9�jM_� �c/(�GAֵm<Hi�NO�ݲ�k�|	\��7�e"��}�wD���x��#o�	
]S>l���wCiQ�W�Eھ�#�싃�đ��`���M.mo�൏є��1��k�ٶ��B4�T��x�{����O�)��]$U��:X�|!V�=\k;;�Gly�Z����Ek'�r�15/L����p� xB.��kg�9�2eQ7�
�f��v{cr���DE�qu��p'K{p���9�<���ۄ�,s�0��a�q.�a'#n�︣�LQ�-��\Y���&GH�����,f�-d��5�0zn�s��pYJ䰌�]�{,�Y�gY��Y�@\�͉��`.Bcf+����"��D=ޞ�
�6w�H�ҥnpû��3��;q���f��_�gϞ	�߿��*������~�f�QV���M\��K������1��p0W��L�%D0l``�����J�b�0<}���(����������FUTT0�ӓ"Q��[x'�1�(���A���{�x���NGa���(�V�Aoo���'O�9�\�����ʱ8������vFÏ��h4�`!��I_�DHB���}i7���!�`���UUU����'�;i��&�[�L&&d�?~��4M��ǖ�s�UVV����Ч0b��9D'RTg&�
CGI�Q���Tii�N�ӷ��w������n���|�DOO���.��(����Mw����rliia�XRR�`���F&��V��œ���N�j%�[��Ջ⸃a]�=z�(�����9^ц:%�R����,**������I�N�F"Gq��7ۚ������o㶊N�E�a��`����>F����R0�X�^�gxrzN��UWW�o߾M�G|�����Fc_�z��oݺ5X��|�����n@L��}��޾�7oR�n���n�߾tvv�"��!]r���n������1�W�kr,M>IEND�B`�templates/hathor/images/toolbar/icon-32-search.png000060400000004301152453623430016062 0ustar00�PNG


IHDR @{�u��IDATx��XkL��Vw�uۮ���v�]ɶ�d7���&M�]ښ�"%H��x��?F�x���5ML�Dk��Vͮ��W`�	30� 008��N���Mݏ���ox�2�7|�9�<眗o�˼���>����^G�0?p)�ý{��9���ڵkޛ7oRvv6�~��e�ٳg3���b�����7�^�tɐ��Kd��&��B��V2�[���L%%Z���Wt�̙��ߎ��o�ڵkSzz��ٳgd��|S�uzH��Sq����?n��Z#iK����L�p�B���oͅ������x�^��ة�g�*�~�w���i(HM����)��I�r
���ӹs�r�pՆ����4C[���ں��u0�2�g�����t{Cԁ�f\�P��E_~�.���a��~����*++�hn��./�¸e$(����4�����XXi�j��~j.^�h`G�T�[�o�Ψo0P����^x(����`��C�7�� aDZ���H������-����o����'�A��y��&��a8H��ם��� 
�����!5ix����QS������Nx?��C������(��V2Kk�����yo�"�WP�� 	��5�N@��{D}A
�w�<yb(Fs)�ps�������L D��(DV�Jgs"ZA�ȑ#)x�w��3��z=i-�DNې�^�xD���D����D���~*��/�2n�jD����Û��SCi�T��x�����؅6�|�7�y(��L�"�r劕��2\��$t�vҴ;���(GAĉ��0��~㠏��#��������s��n�;w���2��f+�"��}^jvO��p�1�5�Ʃ�>L9�R��>��3;��Ū����%���f�Y���w��c���Sà��:<�5٨�-((�������,JMM�X�vm�"�%jR���ѣI%%%V&!Qmlx��D555TQQA����y3RG<�>|H��ݣ[�nY�oߞ�Z^Q{���ի)�?��$������333�n�k|�c��6�.�w���g9%j�43��2bW�_�~��'�G�d��z߾}Ɉ��P^^=z�h�6y�Qn�\�o�B�ΒW������o2���"�\!DN���`���Y��.IDz1���V��FB���w�o۶�W���ũ�hd�L#�f͚OE�"��W�N�:�WVHqq1ͬ[�'nN�|�/�������$�i�<v��!!�yZ���DUU�,ͬ�;w�XEyb-	�NG3�ɢ��������$ N�G��-���?���q�4��"ؽ{�_�-��e˖`TW��ќ�и.o޼9�E�X���D��������$�ٳ��KLL�߰a�o�ϓ��V�ZԢ���~�`���566v�H�'�uuuQ8th����r���9�N��顾�>���x_P[�dNGԸ�`��l�a��٠ 000�;_/.��۩���8J1����Ȉ𴿿2|����gq�oNL&���č9hii�C�1FGGG�����ؘؽ^���v�EZ�2��u��#��+{��=�0�)Lb||���}A�j�J�`<!�dو0)
I�g&�9%B2
�+���S�/�{�a�J��pXB��2
�I Ax�Ai	�
K�ǒ��(0QA���U8����lf��JkV(� 2)@~0`Clp&d
8�7SS�C�/`
p��
�Q`L�?��}+�m�"��h���l@�$�F%�q�/�
m�[/����F��Z
�	!���Za���n�$�J 
p��8�!��
JȖ�ƅ�������ŒN�>n	�G�=�6X�h߄�!I�ϩ��H��$��0�a4��i��֦�$�F�H"�NJ�D4vYɈ(��7@B($��hL�d$�,��� C:��̸'L%�1��4HpJ$����,_zD�G�5a��ܒ�,��F�:Y!��Y�)Ώ�Mb�@J$�i�D4��t�H�B�.��X0��'�_(	 �VHHq��ދ�{���9� �6~ğ<yr^P|��9�xo��?~�?~|�b�π5���LA��l������E/�7_��(~9PIEND�B`�templates/hathor/images/toolbar/icon-32-unarchive.png000060400000004536152453623430016613 0ustar00�PNG


IHDR @{�u�	%IDATx��#�������-�13��9���Q&qaf��?33�R�m�ǩO��-�,J�.��zU]]��9Ihd�7�Mu����f��VM�M�`]*E�h�Z�A����*�%l��G�T
���;ƺ�����"Eu�,W�c-.-��Jj5E��rQd����y�+�G����U�媖�˚���;^Z*�k�y�;���&@�X}���b� ��ڪ��E��̨��M����c8���"5#�A׎�v�'N�V�X�;[ƶ�/$�\��qNfYhH���Sk׬Voo�N�����R!����ަRi�Pw6
	��S,�9�h �D��5�W�\��%��e�1BgϞ�(�U�����;�C�� v�z���!����âR����6!33���eww7�eT`�"�+Cr�F.��9�z�����f���jc��.�l�N�:���e#�a7��9go�a
U���--��\ZZ
���0CdIxR�N�ɥ#@#0�z�&�)5�n�Z�r�Z�V�K����k���z�s���t�&����t��0o��!%�_��x��B� �<tX��<�~��=ǀy&���=J�\C*6�36,9fʽ��(�A�\�E _��F�5Ԓ\���r���5��XN.Lj��Ĥ�E圜�[)�2	�xW�o�s4	��B_�>�J�аM�KPO�'��a{���:6��:�R,���͂B���Bj�����/,����8��n�&�e�I+5c�f縬��n"AR�$�EeQ�9@۾m�(D�]��N�xƅXQ.V����]�d�
x��Cڸn}#nؐM�ů}�H�P�p��]B��ַ�����U@�bkQ3�������?�Q��CI��l��G��^��2H<rB�ٟuѥ����87;7'�'N�ҋ_�ju��W�P��n �����#@�����t~{vl��`	���٬�=�z���W����w�+�}��ަ����>���*����o����Y�x�d$N��Nb��_Ѕ_�+��J��h���45yF?��g,E�'D�Ԉ��	�#�!��ł�w�����λ��/~�+���l�"���HH#ƙ%�X�q�al.�d�+���TOW�N�8�Cit������O�E��M�T*�^e(�jU�id��q�zu�lx�S���E�a�q,Wʠ�S&�SD�¸�׎�͛k���E��[.I��{�����Xs��	��/�\��z5C�	$�{z����ޥ|*a�ro
�&9@G�ۍ¯+�������{oH2���rR�w�cEgV|G%VA q���aH��$�8Y����$r$�B�Pg�
]|�%!�
oD�6@���Չ��4�����G�%��:z����'CTG{��NMh�d&*���ԑCG���v����'�*��_�um}��
��y��朗bNҮ<
_��
���[�zu���-�##��zxB�'�3�I��R������>�я�رc^rI0B9���`���Y����h˖-ʙ�
��oPXD�,DO�O����ct��	wz�`aa�c*"C������oP�n�u�E&���B>�h��=��|���٠ȅI���G+V��S\sss,T�̫]����ކ
�8ܠ0��.���^vH��ߤ�g8����d�EnP���L"l�b�,�9�2;;9�7!��y��x6�&�~�6C�y�}zz:�m�6(<���L��Lc��sȠF�s����������3#ْ~�73�5����s��?D�7(����.n�Չ�`ܷ�MLL`�����%�̈�m�pQ/�-�͌�CٝgKS$#�]]]�A�>�~צ��!^���Q$s��k}��{��(6Y��q?�	�F��C�CCC
o<o����{��O9^R'�����?��O~�5*��ȈFGG��'>�����@�A�M7ݤ믿�Y�q�wA6����e�9��kJ���O��O�x�;8����?�1�j����(6 ����׬Y��+W6 ��ܹS�{������5$�_��WL5��կցlwl��Bd2g,ϻ��#D�������NrC�x�+���"��d�1�X3tD��o������Zmڴ���t�t���~	�}G�LgyMv��>�JN!�����#"טZ��7n��^7`�=�M `��Q`��GD��fE�#�37(\}�B��	H���F���
밖嵣wLRt �[�`���7(`��pYa%	<苐�E�y&{�²:aNS���г�Na!�Γ�p�\������V)&T/�HIEND�B`�templates/hathor/images/toolbar/icon-32-unpublish.png000060400000003033152453623430016627 0ustar00�PNG


IHDR @{�u��IDATx��[LU���XX��ŠKO��P/��PZh�u�]���@k��KC�1i"�Om��E��mP�TIj�"�*�e�Y�>��Є7�J�}��}���;gf�!�ē�2�g����9�3Kc�*O�-m�O�@0$#m-y����>��e`�k��H��I>���S�
R���r3���v+�.6��R����m�>����᷅E���m[���
������͖�؜���}��D<�7=�9`žPJ"P<���x��N�r�!7��20�;lb�W�؜����䀎���eMf|�`.���P��s]�j�l�ʁ�~U�^�5me30�|D7�@Ӽ$40养��bs�v�]�	X�ԔǠFP�O^X����ʽA���P��+l�ީ�m�1�h�Ǘ�d�u��"��������V��j�0w��3������\��� X�����2�]�|��Y<�$6��fw H�_�hcj�GCB
^�@�fv�Q�!U+�I��t��
&!@Ē6+F�wpQ�σ�`����d`�C$���#:)���k���3��o=$0�C�?/���QCR\��x�`Z���
���p�M�1���w���d	`��-~����?�6�!M�������}�錤yC��^�QN��r�tb勽� �-��e��"l�,�V�ҖL�}RJ.\JX*@�ا�q�io�q5���k��
�i��]$�A	�\�\����/��4�
�6N&��6��[;����$�#;ɝ��	C�-&��J����������n� �s3�ـ��@g3@5�yU�Ө���\�܄�;�񠧰���N�x,��F�	�c�0����Cg�d�ph@�c_�X2��=�4�¬\S6����6��k2�^�(����o����wUU�������@����絵��A���]TVVf�p^cc#moo�������	���������c0rܐ��.���Ζ�z��A,�S��������h�)��r�ȡC�P�'���Ç�FP+)0Ď��
`�A��7�����Y�9B���p(��p$�ܢj&��ĉ�+\�%4�8�رc���g���Q�s��@ΩS�TŎ?NC�����s��U|֪y�O�ƣC�@ooo�ZVdpp�.//���Μ9#�
�8r���0�����r�޽�1J�X<nBɀ��ѣ�����`!!/^j�<y���tvvZ����P5p��u��aMh�"��ǵcy�,=@E\�tI���0U�Q\8ID�:^\\T,�Ũ�p��	�={=V<��~�Qéh^�6�j��ttt4ιs�O+V�#��
­�2�W�
��U�~6.����0�:�M��^�F ��ąZ)}��a�
/����{A]>�s<O>�{���{^Σkeee[\.W���6�-�6h/B۾죔����y���<�2i{�Y�qIEND�B`�templates/hathor/images/toolbar/icon-32-delete.png000060400000004053152453623430016063 0ustar00�PNG


IHDR @{�u��IDATx^�X]l����c/6�Y�֖����-����*5�-�K��@�P�S��Jꭊ*EP�T�Qy�<��*-�n��*�2A!&VC���?q����ߙ{{tŕ�e��1�҇����޳�;߹�̝ˤ�x�1�P�LB����p���DZr3	kϝ;��Ç�������	1E���@����/l۶��۷�|Ϟ=o�<y���ԩS/���?�H�	��x2�666�%�U���_���zu���=���B�7F�����/g�Y��	"��7�����P2�|��ѣ���ʿr+O>���S
{O�|n�&<מ�)-�RBX�F��?�@����u�P*��D@*(�b�XC�y���_<qy�?�{	F`7�tU�-;[�O�*�0|w!QB�i!lY� �����Bњ1Dpnn�uq,-.���q��at���ؒ�:3��{VW%�ds�a��`�"�6[e�r!�T��3L�1H�������-@J��apff0�@8��:$�;ӊ{*�`�X}]kmC#daF�#_$���Hj۶����I��� !�`8�P�av��9�Y_q2�eI	�@���e�r�@��:U
�$?�^��"/��B����0���oz��G��D3&,����-��ԙ��� �h6�w�܆y��y^�����`�'�Nn0��Ϧ��H�R�3�����B���L@�61�������Z��-����|w�O'L��b���2�EA>(%�36J
(�*�N�i	���c�R�c%s@QV�ɖt��G�4/
�����.��%����Ps�����6S��R@*���{zj�AA$,rf>h��7v��&6����Y~��� Ky"���L��b�O�g>�3^�?(����#�`��z�X��{�e�(!3�qo
4e'��#(.-���0
��C�AU0��%d���X�C^%U���`@Жp��D��G֏���%P��`��i����מG�Q�
��l��`�0<��U��P$�y���#V��m��㮀�H�]�3�haAI�W?��]V��˽�-!���
!P����d+	�;��w��*���G5&�
�G4'&�J @XCh�~p�[_ڠ7��`੝h<W��9���D DHJ��Yna�		Ϊρ����o���S<�l����� v%�>�8�az�+;��#5(���n�u�����_#2��V��_�r�?����䨴
x�_v���2���d������zxB��ߔ5�O&�<��|���ʫ`߾}���H�b����f����Ʃ7d˲@Y�s���)��etvv���|@}�y�K�H�Ӹs����.���{���0#�J=��FF��u��A2� �ϫ�BA]�7���)���iܸq��yd	�[��
������T�׫��F���A9ڶ���1��R�c�1�J���ի�դ�B4�p�$֬Y������#�49�F�Q��SG0�`PЪ�w4d��j.h���Γ2^QI�EY�Le�ՠ��ԭѨ����e�v>044�ڲeK����&�=����*k���LNN��8`Le�-�����Ti?.j��'_���l>��T�������
����7��d��`T;s�W��N��U��K@�צ���1����
>�k8'afe
<��I\�K`P���s�@T��իW�����k׮�<�r�Jf�@w@=�I*��H�G�{Y��n~� ��T���j�Q���-\=�s��2�3E��W��饉x4��'Suߴi�"�MoZn߾�L%^e��i^��C>:x%�:�g�>���T�;f2	�?~��fsj�ڵ������U���C�s�<�����mmm^'�&���
��y>�]����f��=�ކ�jc�Ο?���z>���;M�]o�l;HV�n��봝s��[��gΜ���	���w��D�� �tt��
��B�}�v�>�Q�z�i�IEND�B`�templates/hathor/images/toolbar/icon-32-purge.png000060400000002462152453623430015745 0ustar00�PNG


IHDR @{�u��IDATx����oUp���4���/\造
*U��-а��B@+����V���J�&�3���`i�&!�8�B�.�3���O��}�5���f�	�O���[~�=����[�yi��f	����X�f����]P����� ��K������t�z&�L^Ic����~����0��)��	%�=�/�>����KA:3آ���N_�s{:�	E��7��{������H鉀�5��i>@��D������μ���<�a.���B�Q�=�(�Pw~/K�1��؇"`���ƃ�S�����gH���tj<@lܑ;��}���6=(����r!z,X��>L�i�M ����Ԏ�>�㴰�wt5�:�wuՉ��U�S�2@���Ya�FC��!zkT�3[GU�)k~(b���CX�ё��{�I�k�1�q�j��F��K�B��q!rGP�+�a幡�/{��X���
�5�j����ёp�O�C��ɋQV��o1"J�c?;���!�#�Qz=�]}�L�j�N�'��[|��٬�+@B�
�Y/<��Q���n�2M�*��`T�b�ENzh��IQ?�
v�<��l��]��@V	x!v%���)��8� ���#a���;�祅�cY �(�=��q���<�����Ԧ�x���M�?&{*@���/ċ@vx��7ږ߆��1S��NҾZڣ}q�@_�x�/A��k����#�$L ��~Md|;њ�I�c��Qr�T~���t�}�ǿ��ia��7a�œ��6�a}G7�
p���]|�d�s��>�Ǎ��
<H�;�N�����o�ne�����]���������e�]g� ��{���m;mmmM�$�A�4>V�Y���U	�@��봱�q6�u{� �8	 H֚<���8�ZbLP�XYY!����*0�>��q�k�0�w���4S,}M�{^�ĥq�Mr	��$$A�4��u��������P�+�e��---�l�T!��@�����EBN����]�R�A�%�zeaa�З�.�Ӏ�ao������7��H����/�]�`iN����� �	d�ɺ��-��Rn�
�k~0�^'�����@Vfw0��XŲ_�$K���=@@�w2+�%�RKl��u�N�T���E ;$d���e(�%a�Nj{>�@�\D�|`ffF�a�EH���������jP>P>�k�#�*��T�XIEND�B`�templates/hathor/images/toolbar/icon-32-banner-client.png000060400000005037152453623430017345 0ustar00�PNG


IHDR @{�u�	�IDATx��pI��n�$�e^��(̉w��>�e*8.8��;'ǜeff{��l8��,�k���#g.�W��W�MY���c��̦���A�5�N�r
�z��1�ԭ�mҲZ#����8�+tU ���V�w��\H�#V~|���ydQE�ba9�az��~u
c#h{��C؏_��9�/�m���΂�hk�ƾ�N!=��ǯk�P�(��k�nBȶO�B�qU��Ee-�U���6�Ƴ��ǮOE!k���ʴ�Z,�����������ă��f�p8X��
�E>���;�n�b:�؜�[����R�7v�G�~�D����O|t9Z���^)���LJbc����qY��iy؉'E��U7ګ܎�tȊ���Wݸ�N��`f0l\\���8�i嗘��?}���F���~���p���tg�H��!7Vq���`�+)ch\Al(M�ĚO�_�l^~�;��@Z��?Ӫ"���o(
�3�ŵ�� ���8��ub�WB��	3���Ԭ�ε��R?N���b�P~3.9HbB3��B�$\�q�aX5 �2�B���kε�b��b6RkG��i���:.ؒ@gDO����Jb�Y��zc���0��v`��Z�,+v�+9�1�ZL�&���Eh�L�J�.�$���h&e>�Ź������	Q���'"~��%2F0�1�(����NK�~��+uutk
\�KIlr��d��'����=�S���99�19���>�{�=.��XQ:P�^��30U,3�]���+���3�X۞��~`Då�>�2�Mv"����`u���]غ��zư����paAϪ��]8%cg�ǾS��G�����Z�0|�^r	��b���c`��4��L)���d|�MA�5� Ẁ���c��T��ʰ)b�I/�M	\ܣ�����?��t�Y@�M["y�c��_l.��3<p"�_��1(�XeA�$�&|���2l'ؐ~	{����1 '(��m+����ҥ~��$x��~(�?���2��x�@0L�p�|�o��C{��
r���J30������AR�n�'Vǂ������� ��X�(	:0<�#�0H��.`Mɑ4�r�^E3�q��Cf�0)�I�
Wz���&�oN6�0b�Q�P���A���v#A��y�0䅊�|�o[��j�d*��]�=b���hZ��ٻ_�Z:�E�؞���jk��aN�bgV�m�t���3]7%�S�
�tsΥ3]ܼ����(7���cɲ5x3YMÜ*�͌�������/���uP'�0�PU5awޯ{	W⺸���q6zY�E;1�uCV�9S�hs���
r����+	����h]Խd!��k,��B0R�>@0�����VX��p
��^8���<�~Y�k�S��3�F<��%.d��t��,x���Vf�`��z��.�t��Kl�0m�����h?��Pn�5��!\j�k��i
0+�Y��d���9s����ᄏ�00�򿠸��0�7�Fn���\�x�⽠��������p$
��r!�H���J����/�"x�;�D���˿SXX���!BQ,]��t����}�݇�����ϲ%��ѣPUU�\1;vl�N���y�@`oEE:::`�&(�m�x<��w�}7q1��_����/��|�������#����vs1���ؑe�r�ȟ�&��hw��	멎�sak��kD�耘�Xw��{A���C >T������ђ�$�Id�Y�Q�(F(�E��l�w����A!�"Z.\�:!9D������O -���+G��Q^�i�&�+��i���OI/���{�o������~��d�n�I��{�fΜ)��,����e7�E<�{a�9�c�)f/��z=�
��}�Cj7=<y�,\��ސ<f�,3��)`��m��l�h�n��Ǐ����0
D!U��o�"솈�a�k�n�~t�(8�G��Dj7��6��Tdmtd��������>�p�j"�N"��_�3N�@1V��s��-���.���@�g2!�Q��ٳg��D��
20�T��y�#�@�ŋ�$�2��U˶oS��p(��tB�%�YE��z��y�\���4@�=�W���FUnݺ�;�&��MkP�3%�J�8��dJ3۰�`��b>P��*z��E�
�"	hJ�A/?��
�rﺐKG��Jcy͹q#�˼7q ځQ��>�cu1xW�\Yp�.S��1�F����^s<��>��y�|h�<0�#��
J�����0K�Ok��y�!�E�?�o�"���Έ��Ÿ�~��ǎ������͛��n����N�<ٸ@�d�!
Ɖ��zu���a�u��Ν;���CWD��F?
=U����zD�|���/P�۷�.P|���[-#IEND�B`�templates/hathor/images/toolbar/icon-32-links.png000060400000004744152453623430015750 0ustar00�PNG


IHDR @{�u�	�IDATx��yL\��o[5v�%�m�%u�,�U�H��ժ��ʩ�4�)�U*YU��imSRl�m�1�`v�Y�a��0�m؊]o��6���<n�_��<g`�0ح�HE��ys�{�y3�Q>V>T�b�jYLU-w���T�?�:���k��.8��/�W���1��v*B�jºX(��������m@����o�T���G	
�3���<ע����ٹn�f~��]P��Z��6�f�j��"T�T�(T�9(�U����QP�����L�
��Kؔ�F�篸rm7o��o>�nj�*��9�Ŀ3:�^f���ud��S`������<���!q��mܺu����;�P�/�5�
(�ˁg���Xf�f�si�����ݲF��߈6�(fggᛠx���u����~e��kS>����_�����u�b�cx6��SS�v���e�VR9�rX��ꛪ��+�2x\��MXZ�ײ�Q+ԑ.��q�‹x&щK�/�ʕ+Pi=�F��ho�dʦʮ�ctd�A�k���G[�NԶ#���h6&�`m�����'x�W[��/�
�7`��Sœ�Y���ލ[������|�wJ)ޣ�ONNbOy#T�ȣu%�o��S�w�ր|�6�<w~ny<6��Y0<<���Z��������R�Y�8�10��T卯Fg��J���m�Q^��A=6챠��Eoii���x���:�:��q�Jw�6��T�3|�^Zƒp��tww���Q����(̮n��Uu���?�Bb҄��lwz�L��!<�`���
��	>�^�~(�NrT<�9��:9z�R�蝕8��52�y�����Ⳛ��?���kq����|��>YY
�����s���ǂ�~l;l��c�nX�oh��<���Z֬ͱ3�����CqRl����3���$
�(ԉo'T�'�����
�}3-�C֬I0�/��#}�*m�N��^��v)8�K��沨x�۱�T�v��J�]�˚5裁Q��3�.Hq���Ap��f`aao$���Rl�C,͝����Zf��۹�32�1O@�xb�
n�U)�u����u�~-S�R�4���ۯ��X�xzO1���E���R#�x�J]�����8���]��������Lȇ��<3�"j����IcR�X|=r�'Y�æR�i�v�`��Lė��wU��	����V��8“T
���{x��Dg�~��3�ԡ�d@�q&�E!���O��~��)�p-3y���-���<�4N�+�Tf#��"rA3�hc`�>⠓���y�s�C�%.�P�D���]i�U|�]%S�"b�h�
ڗ���38B�)c�R���b��Lx�|�l&/��ԋ[�R�z�H�>e\��\R)�N|���y�Im�[��J~@�G^ 1�3�1�,�1�A�~B~4��O�M��o
��)y��F^'�X��{�l��A����7��`�$#�S�?8i�y�|�|�|�<�����k�K�su�,�����%.��)R��d��dA^o�d�� ������	FGGW!�γ�'���1"L$�*1��Ą�%���]���10���ɵ��uD�^/zzz��ڊ��z��ա���`<C��c�8�5��
�͆���?p��y�mU���~�D��d]�f3������uhoo�l�D�0�;%0ǵX)���nsT�l����N�<�`����������
W��u�J�UĴ�7���ѵa�"�&A�tvv�Re�E&Tѐ�d���H��0�?�B�D�T�G��x�����Ae�nO��ཏ�
�����D�h!+���'(���ڝ5b.dmX������yWW��^����_P���x�N��V�C�/�	��."��ѡ����*4fV~nn.�����f�':�w�r�PRR�4��Č�ˣ�:�](7[d�R�#$������Ȯ�L&y�
�<s]�����j��e�g%�VNlkkCqq�����,����s�r�&*�����+8
��z�&S1k�pU�͔��G֬�d��
���U.H��9c1$�rb"99E���d�b@֬I0~��+=68Q�򨨨��Pw���'ťW��l���&"�/�ڸ?�����r�?P����b���f�N]\
�b�H-Ț�0��U����Œ�L����z�A��.^�tJ����E�^�?�T�ф��;�aѭ�0��J�d@��5�0��]���pW6y�����ň\;X�999(++��O�ǹ�P\v.&�d}�V�-�^٩<r,򕫽�PL�ŀ�������8������T�dԑ�2OD�’%y���3wm��@�H(�91�<&�?��۶m{+))���<�%�Á "����޴cǎ��P��������ٛ��PIEND�B`�templates/hathor/images/toolbar/icon-32-apply.png000060400000002376152453623430015754 0ustar00�PNG


IHDR @{�u��IDATx���O\eƹ�k'є�;�
��b��k�+���[ע�-V�2@)k�e_�}��Kk�D����h�j)0X�3�����|����Dͼɓs8a�;�s1a�
U��Q�T��9��s��t_{�ᾖ^4�ژlr�Sv�Ob�7;}��g!(��$�ڜ�x�^��3��x:r4	�c�WLj�E�t����lGw�;=� �a�6ޤ6�*�yl��P�,P��6�h���Ӂ�8�Z��x�����	Pj}ԫ�z��ÇW5m�%)���rAp<&���'�Rh���ܭ6P۵�P����ߟ�(~P��zd�`���\)���	�lNĶ=�5f��D%�D`���)�Sf��7�՚�՚T�J9%���wc[�Mh"x�+��J������X罚,�.M��s���8\-9X�ĪNb�ސ	w��'�/����gc��.���G����W��+V�7��X���$6ߪ6+j��s���%t�#he �%~(�����XH4�ಧ�\�ب�sl�Z��-���#�03.������O"�t!+�zC6��ب�f]&6��Q`�p���_B�(w>�įc�R{���=O��Q�M! �;��7�?���o���|��fp����Qh:��J�}��K��{i4}C��W
	�	7DB�íb��(�A�eJ���$$�P	��p��>�r!
?��QF�
�H	��r�r\�Ÿ��%<X�>,�/�|7�YEEE�0/0�L.s�y�y�9ͼ��i�יW�<�Ƥ1�D�Y&��~�[�杧��`򙗘��B�P���RSSS�������Y'�� ��eaa���Z������Iq���t����C�.�s���p
'Lw�H8#%c:0>>�׀�8�%
���93��z�B��H��������xhh�566������u?p�������pNb[ŗ���.p���9��^bom���v�����p���O�0_$�J�C��:�̾�R@t���<G��
B��8�N���K�.�����Ip|�쐕�}�p)`f\>���NMb``@J(�C�SF�@p���_������b/�8(�A���CB��RHhw�1��$��%�>	�'��B/!�Hp��M�O�OB������p�%8
��,	�w�8��������S���kIEND�B`�templates/hathor/images/toolbar/icon-32-alert.png000060400000004021152453623430015723 0ustar00�PNG


IHDR @{�u��IDATx���$M���ofU����m۶m�l���m۶��a5�rqX�6v<���繭��x+*����OD�3�7�ϔ��6��7�3�^\�5�a��1()�:"+P]�eT�	=��`fE�V���D����
a��L<q$qLܚB�������\�ݨ�9&���\��j�Nxg]k��f����k`0
إQ-�0A.iИ^�s/��9���ЉS�y'}�7`�>�MHZ�&¦sn��g�����͋0���q��)ETj���ߋw/>C�؛N��;�Z�SP���@UI�kx�o�"{�z6Y#/&��
��!eJl`��x0��<�䄉�(�T�wy�D��"��ȋEq"x������G�Ow����*y��d��9�̑tڍ��dr�<�y��j�"�	c�y���E�
ȣD)p�	KG%͆QQ@�
��U��W��,$���΄-W����T���
�B-��J\�s	QfV=@�膵���*8�\�U=LT/!�P�q8��Hقn�@���u��E1r��Hr�N�¢��^�X��W?@��E�M�ґ�5D�##,j �����1l|�~�:�XR���4Q:�ܚ��J�5��M�2�q-�$�� 811�15d�^
�N�pY��V<�\C��t>��D)b���S�)��E�DWa�."�A	�X�������g(U�)��5�L'^$#����0�	K�i.�t�H�穅x�B<�j*ְ{) 6�*a!ޏ9�<2B�!����<�[񪠀*��x�m�P���8�,f6���,~t#��dGF��b0A�b�~%؟��X��՝�z�R{Lkf&p�GC�^�.���_�h��N~|���Y�g0@�Z%v���`����qq�_/�F��1qc0,�a`�}ɚ��~LyH�(�}��h:�����t.2�������Z��٤!�W��-�g,M,�J�@�ZA�e���W>֑N�����M���_��t-n�J%�5�<�wL�N{�K�G�|���E!�j'R��7>����@�Sv���pi�Zy�@�|F���g�3MQ0Y�V"*����7[+�[�W����|��ݘ��2W��Z�|]-
,vNؚU�{q^d*vn�T3�M,�)����ݽd�,����Sw�3�x�Jt~_hN)[�� ��`�uч�cY�p{c�7�̌}@8@(`�.��a���f(���74�Q`PrB��L�>��L�ߧ J����0�]� �%>�r!-��v�$�ß�,�f������1��T�1�u���0Y0��x�uOFU���o��s����}�v��&�Z�e�]�V�chy,���_�kVկjƎ����F��m�i�&]�b��Z-�S��?���iΚ5ktÆ
��|�r������4����Ǔ�.����$I�N��O��D�1���֦����a�'�d�"�)�[� �"�m�F��>��S����/� ��1�p�;
����1��2�tp��\�-@���T�yn��Y8��9w>]Xkɷ۲e���i[z8�l��AA�az(�J��g�=�$�1A�&�0@��V{:��6�g��r��,���m�Z-���i��g�t}{I+~ff�u�֥�gΜ9�m��W��Ӆ1aɒ%T*��c�t�~�W�@�g����nݚ�AD�^Oߓ��룇��&�ǁ��AZ|���{nvGĢE��g�}z
>�30�p>��d�50==ݫ�е2�X`0�igTT]�
�٬kD�G�vB隧�ޮ~.\��@���r
�i�.>����}�ܹs�7o^Z�������(�p0N�x�bz�v���-?�/�� ���O>���򖷜~�)�<�\.�e�ݗ.�8�ΎS���z�?|��\�D�������}�so��'?��/|���O��;��7��;�줓N:8888
89��B`�����fy��-`��ߤ0�̛�y��Ox�Ԝ�&IEND�B`�templates/hathor/images/toolbar/icon-32-banner.png000060400000005173152453623430016072 0ustar00�PNG


IHDR @{�u�
BIDATx^�XkLT�~��p�p�QT����f+ê.��k/ٵ�(vi��O�Y$�i�!]w���#�dMf5KQ���WEʠ�H��H�;g`n�圾�qN:Df1�K�|g��}��|�A�M���6�T��n�����
 �n0���`��������_�m��ű��)]k>�6l�h�A��4�+[�E�]k,��|{S�:ii�yz�a������p�s���2M��rU�~��
��`�l�������:n��~�$�����Ug�Ǘ��*jj�����P�}�ejn���%	�\{�����u~�e�#QvE�T���H�/++����O"���̆m፧Z�b��(NMP��dhn<�	�ѹ<X���`��}��/�]��{��C����4Z�Vń����q`x���.T�՛2c!.,���:��E缛���F�F,~���>�/3Y�ۉ���l��,p{��,S�ژP6,H��&]p�C�(P�+��y�}��x���
�fa�C���R�G�cC�P�:�m��pA��	�v'Oz��f���9uR��כ5*���xt�O��d�́n�G�VV=�A�D�orz^?8@�/#��(C�G,�@�7�3��r92�!�H�f��0���c��	'%��#��{x
�a )A��7>s��j���4b�1^R�=��\��8X;�A_s�0A�����ZU��%%lAt>�
�g�� ��`hp��=��oNi6n��M��+�du
Ƈ�.(@��W	����b��Q���B$ ���a�Z, sٔqq�]�4~���R!_R���Ӄ�@�	���r��z{��vCHH���dشqs�_<���u�=9SG�
^`/�
���pX�TѰHJ���0��	���l6��0lLl���?(�5)=��Az�Y_����Y�
;]�2C!@�]$�����+Dp��D@Y�RY�����~,F����,��2���u�T�ف�y�2�c��,��M+=\���P�b
���
1�!2:ZT���r�:��'+�B����sš�{����J�7
��6�@X��za��<A�A+l�3�>�6o���~�&So�������,�c(�a�X���s��n���1�;����d��%�ӵ�-U��	���m���%ېDpppQn�F�~@	Ϊ��1HMI����0�Y-�������{�I����f�3PFE�D 1!N?>a�x^������rM��G���1�wp`I��x劬iUx���5�թ)�!Xn�u�%N?O�C�*� �;
��+�G��Z����a�l>r����ߛR��|:�a�a�!-%�����"�����a(�F,CJȢ�6���w�;U�f��Wd���KR��{{�`60�]RRr70Pkw��n�?*�~��<����x���؅s��8J;8��'��w$��1�p!�^xd�z�RjF��\�"V��v@+�?�{>h��{���}DbA��$x'��F��I���o��������֪�!�@�s��=�r�Jq}}}b,&&�+55Ր��aX�d�x>p����9�~�zQPPP�J�RG�^�r��8X�`��2>~�X<@�|�֭[e			�����shoo���IHOO���hkk۽c�ݼ�@SS��e����dx��8�N�y/^d>�瘀�dbq��Ù�4k���a$D��+�m�����k״7o��677O���l�#""Z0�4���$99����h�����466c2�GY5�(qf���kG5&���&&&ȱ�@XX��=�v{�����܀�,KIII4����qz�H"
w�,][�VJ0q��5$F�C���j��/������xR"IF�	r��$A�K�������1??���2�Z>k9����(%�t ��7�Ĝ���Ra��[9�@�븵�U	�A����Bq$�T��}	�J��Şz&�"PU�������@������(tvvjΞ=�M`˖-&�ڈeE$�SAr.�ŜH�'uB%&kWuu�&����)*��W� U�D��@�(�X�Ri8w�_���k��.����t���J�F�uD"'�1�����fՈ$<y�<kccc�-Z���H����S��-��ݗ�#b��.�������b��j(_�p!�[q���@3��&�8�w�sP?K�	U��
�T1Z���^�Z��TD�0$G6o�|f0L8Ar� ���@"����nW�*�.]
�0����	}�!�ȑ��C��шYlB9���ҥKjx�qX��)�	̏�'Nv>��U��b�!���ș	Q�޽{�H��j�T�|��N�R��T�����ٓ[ZZj�k�X%Fi
�=v�X@��Ȝƺ/�Rkii)�ϳ:���_��pШ\1�GP���S
>�B1��\Yǰڥ�@�|����m[�nm�x���u��Y�`N|���c-�"��Ç˱|��~�9A���998x��ގi�gQ�.T����kCC�ߩ�O��gt{3��a�5�%`E8�\Rq��_��aC����^IEND�B`�templates/hathor/images/toolbar/icon-32-extension.png000060400000004116152453623430016635 0ustar00�PNG


IHDR @{�u�IDATx��$�����aw��o۶m��m۶m�m#��kgZU�Λ��zۓ�}"zz����soV�|�x�{�t&p!)7
�<����'�C�%��y��ǜP��B�&����=]�t�?i9t/���
��ٜz����,)��*]p�z8P�
-��~���Do�������9���f���>��k=�M�c|�K��I9������n
�
u�0z����bU�C�
P,@ɰ�R^��3.U)�+���@f��Iyͱ	%7(p�b��3,�?�����6��CL�}J1���%(�-|�q+I�z_����	��y��1�!��JE(�T0l���$�`�!(:�y"n6o�o�[�@Q
�1�J�,�������t gI�!�o"h�V
2�*p���}��`D���G�B�dV;��a<�NRȡm(�����~�z+�a|��`�p�u߀�=l6�Y`R@ϥ@>%���Cf�=��>��_~��#��B�h5X�	M�M�B�@ ��KS��P�}�~Ǖ4�V��v��=��
��T��i�@���� �tB��Ҝ�!�\M���NpR�l�o���a~x"XYM��"�E�l����x���8ҟcKO����r���-���Ұ)Hm�R��%����b�&8��q��l9���Pg#�X�Ѝ
QN��7a(q��?�u���Q\0c:ž�N�셺`p�(Y<P,J��	]��#�C:����Ԉ��P���8��J舀؛	�lMz�L�)u|�a��z���,4ت@�'r&e��l��js�f6U���	"'gj9�i�3~$�o_}/���"��|Tx�L[(�	D����g0��a��k�|�L56���E+�-��ϳ���{Y�s�~��W�1i�aQ�w��H��[��?,_��?�
��Sc3'zEǍ	�ф���x�(���@[��9b˂]�(7ᮍ�`�ę4���b�'���@e����u������13��wA��}s
g]�^�M��M>���c/��|�#	8�r	k禀
�T@��8���O���۱h)�EU�\�xѩ�?����|��|EC��3�@��6�w�y��;���ݎ��}������??�ގ�?��/L�2�>�L`�@)r{<�7A�}}}�\�����;>�s4��'�p�.���l*�2W�t:M2������D�ZZZ�������v���I�&e�v``�����F.��r2���y۶mc֬YZ�>F��,#G��r�����8DD ~�n_&q�B�@MM
MMMh\hmm�s+���:�y��q�h�R��p9I�.�֯_O>�G_�F���qb�Ԩ V�G;w�d߾}�3&g#Q��;z�D�$!IlݺU*H�k+m
����B����J-Rm�F)dS@����1�`�����={PZj�ĉ9p��hS Z���PUUE�%K������'��-�܂��}�Z�4�>e&�R�F@�&ؾ};��w7�|3ښ����(U+�+�}�F�(���>��?��c���G�Tr�����oAB#Ԫ4� 5Tْ>|8N5l
h����Ymm-DUqݺu(
o��6�.S���"bF3G��#����y}}�3w�\*̟?���>�{�{����&�O�u*c�{���ڵkQ�aڴi:�d�q�Ɖ��(�y@L�Ľ���媈�;j�(��cn5a$�<`�@��ZQ���=7VQk�`K�$�@�\�BЁ��h�?�a?�	��(��_�ԩS��7���3gʈV��'Z�V)�"h������S�y�
����o;z#z��'��Ks�p��.�;$��…����M�R���`'�M@�mUpI�D!��� |զ���g;yԾ+�۱^DTD�aJ�����
M�Dm�ވ,�R$�'0ȣ�rr�|�2}��o�����g�v,uuJ�
}S~;V��d)�"d�g��pPxfn��%~�۱���ey;~��_�J���t2IEND�B`�templates/hathor/images/toolbar/icon-32-help.png000060400000005223152453623430015551 0ustar00�PNG


IHDR @{�u�
ZIDATx��XilT�6	qR��a���@℥-��J��l�!P�����ž�m��[R#*S ��.�%%� �cp�=�سx�fO�w�7�=� ?*e�#=�}�9��sϹo"~���5F��j�&}��l0�-��c<7�'q|{tD"[Y͒Q䨫'��C
�M����3����IQ^��Ž��p�F�c_!�7��袇ңG����,�ZΕ#�́�_�P6o��d��&٧�P]z/���#��cMkޓ��.kT�E���WɒEui���ϽəٗV��t������_��XS�4�
{�8�M�����P}F)�ޟ\Y��C�U��\1�p��"�X:��.R��ї���k�{���d���������0���٘Fb]�a.4���!�B̹���;ɽ�g�����g�`r�B�U㩡��\.�4��L����Xp� �Śo)���5�v$�o?�s]\�sv,QE��~R�<�[U��v���a`�A@ZЄ6��ӊ��Z�d���rļ���~ ��@����At�Oq�O{zKG���G�D�Mrl`���؎R�[��!�.�j���+��M��=t��j�8��Y�g� r�B?��c�=%#�=5��wzbLw`�Wj���#�哜/��F��b�fCcSʟ�����ɴ��nB,���`I\8,Z�y�8�/����A>L�:y��r��xɨ�.��dQHǨ�������҃��V�"� �������'��A7o�
��޸Qi`�*=������4�w���v�f�TT�00\�|X�ZX��ڪ�TWW�(}nx��J>,6�A+�--�-��@��s�_)�a�A[��tߦ�����ˢ�c@��|�(�puC[mgb��԰4�_.���Q1�`	X<��X�4�Ǔ��B>
MR>���*D-E;�~��߱h(��{|U�vf<��,����f��'Qq���wu,8�BZ�t�E����Z�.h�:�Ҟ��\	�qs�GA�u�*�}2�����N��YZV^~];�}I%�0��
hAڸ�<��t�hD�+��A�Y�<c U��|jL&�+�D�1��\h@��%1��Q;�5r|�Mķ2�[��-����EF��sC�$�,8�BCjAo�T���=�Aȕ���vK�*��~{s��w
ha{ù��p�c����+[�g�G*羾���P�U��
�69�l�wťB�Qk�8Դ�)�˜n�>�s�:�n%ECN�m��٦t�v�����9�Ă���s�"�)z�:~��#[$�����X�^����w��u��g�5:,���q������
�֫�%8	ӝ�[,��ys�Uު*�Br�fw���=�jw��XyEE���;X��d{�-
�@;�J ���~��sއ�]��ƘO�+���c���<���w
%Lb�^g{�y�GQNY�{�7�9�g�a.`:���:���Z��_MMM$[|mmm��hL6�L�9	c<��8�?~,[��ݻ����5$��H455��19�l�2c�:�Ǒp�&.\(�.]*���_,_�M�]�~�e,�E�ǰ�,X��k֬yyy���\p�Ӵ��2`��pY#/�\��&+V��֭�ׯ7n�t�-Ylڴ	`%g�ʕX���)�W�Z%�6l� ŷl�"�n݊}W�7a�,8�B�D�$c���֛7o��۶m;v�W�^���_>0�|��q�,8�j@Kَ�`������˱�x�7۾}�عs�t��~%��s��?hA�X�g��h�"���9�2�9����m.]�����J����bs�
hIMh�>�����֮]��9����x�ٳg�f̘���Ȉ�>}z¬Y��V	�U������4�J�{��)�ܹ#���Ç�XV�<
� ��?5�u:]�̙3���q��	�+%�>ؗ�b��666"����l?��صk��;w�`��8333ؽ{��d�x���
f�Y��<�kiiQ/%�ӧO�t����"/\��*=��X,I*"���V��\�?��'��u��pUz�a�Z�5�ow���������҃�͖���+�����@R+��PW$s�S�2���b޼y�,h�MOO�GG<v�N��>�z5�R���x�V%�`0�}���k�HVVVr��6m�X��M�4Hm���U��N�:%���*yEw��ₓ<u����c�y*0�*eJ5,../^DЮ%�K�,��҄�
�*���?�$.X	0��)�0
\�@ڸ�<�$(5]�]o���K)���������!�����.^�8�!���Ǟ"�a��*灍�x�P/���a9!x�8��*��\��9`�CCja{ùų�^�v@tϞ=*羾�8Vq
�y��VX�իW��Jѳg�¡�:t`����+�󹹹���q�d�2fs"e�9���i|UFb�a�xn�Q/������B�|����8�s ��v���櫙|�Xuu�����\��"��?������s"oC�k��q
��	������q#F����?�_K�t�_�yIEND�B`�templates/hathor/images/toolbar/icon-32-banner-categories.png000060400000004160152453623430020210 0ustar00�PNG


IHDR @{�u�7IDATx^�Xml��~��N�8ɛ��%�>�&6D�ب��k�ю6ubF�N�S�I[�Mj�M�&��Q�&4-t�
�[�
�0	]�))M�G��#�?_�w��Q��#�V�H������s�=�r�6�<������xK,���Ŋ��1���F��\�p̭�Z��]?��U���w*%��vG���܊�`�`C�ز}#J*��Fۯ/�7p8.D8�����d>;x���+i�;�ٷ���=��㥿p��d��p�}�ċo�G�?���9~��>��+���?}���ے6�ӣǪ��ٯ�-J]���"s�c,��jk!��x(�fDg�͎*록uU����а��!i?�%���}W����;o<Պ̀9&�����������}^���ԕ��Ey�^v4��G�@3�f6W���>Ěl�x�����罁݂ܕqN�{��B��st�\0�6��jD�Մu&��LO�KzC�W�E$�����>��X�$�3�8��� ��T
���I@��V9$��[�_����Wܯ��Y	X��q�WNQg@4'B\#@e,I*�h�X����&�U�e-�3�۟�]�\O���DR��!�qȲ, ��3�r|8p�>���e�[B�}�0$��DP8 �y!���g&��\hOW�'B��f�uק	��n.Ār�-&�r����PYh���BL��w�P�%�6�p}h
�Qj[�]�7ۥM_m�D☊���2�+�I��!��sMI�B$�� k���:�C�_�K�;�N�0�]�
��مo/A�H�D�<a�+|���d�Y�&Q(�%J�g��NH����e-�	W���׺&P�}�(�����J1:��8in�窫�(����㛞?�FMI~�����^<�/�Ș���״v�c1�F���R>����Xz�u��r�e�C�-���GX����멿�v��d��i����΋��(P�ȫ���
�{Q��N�`�
{f������!�ߜ���L+#��d"@x�Iȿ�+!?��0%���2�m�/�: ��`�%����2/D2�A�;���R�+���Fc�^��۾�|Y\�nd#�T���'ܹ�̰l1#�o]�2b-?�~�x��!�	Ś�!��p���g������Ϋg�<��:�Db(�!)V��>	���JD����Q%$�Z�e�j��xA�A�ߑi�E��Q������jP\�tII$-�TU�4@4���w�u���mP8p �
���.�h4�WVV:L&b��`UUUb055�����a'��B�sQ/^��
�b�Y,׎;,�׮]s���?�]��188�����Z�
�v����������j�;Q�V+$I"���n���V1?'�I$�����Cb�J?�>�
���all�w���皛�ӿ	/\�@q��e�RLq�nEEE�����f� '7�Lw�����(l۶
w���	�޷o_�
�mhhP�j$�?;�+	$�����DfIu����Ј۷o�޳gOV
��~X�&�\SH���$�������A��<[���(..N���u���}^^^���q��ؠ\�P"�S<@�4m��u�(���Ν;�9��=�c^�
O�
��{��E��Qv�!N	C<�����?s���󓐎(!��-K @a PVS
X�z5DѡL���DHǓ>K��������"��F��T�@ @.GII	����u�V:�DJ�O¨�`�-��y{N��8ȕT׉�
�
:����CE���ߨfPAғ�N������n���$%������)sV�������+$�v���OZ'������/���^���B�y4=t��d��+֠�iKr׊4(2JB�X�
	pez
�BV�2oP�yӜ�\NB�x!�2 �uЂ��[�
7d=Z��p!��]�b��͗�-�<����V�7�r�p���ϾAq��ᗏ9򐸖�5Mc�s[ \|�\�$��ū*p�ĉO~���YD�F�ǷIEND�B`�templates/hathor/images/toolbar/icon-32-error.png000060400000002405152453623430015751 0ustar00�PNG


IHDR @{�u��IDATx�X�5G>�Fm�6��7VՊj�mT3nP�v�[϶��E�Kzn�}�t����/;�3;��3:gc�\N�J��/FR<X�~����ŷ��q��b�ՇD"1���x�^{�J��ASSS���Ɣ�+$�GUU����_�u�˙x�>����������`1�mP^XX�E ��p��KKK��d0��y�o�/(�N�E�W� L�d2)���2==-n5xD�!�v��t@��ؘ

��UTTHuuu���W��2��q��������<�f��+h�	Q���&$���j�=�.`꥛e��ID;�	0�)��`����̷�i�QU��.`��J��V�:_��e��W�>�a�q���v������RQ+;_���v:�{Q@����vp_wrJ�~�T��}5ׯ��].�E��y1o@ۡ������"Ƶt��e��`�n���dE @J�ߍ�#z�I��?*��.;C��go�M�^-8��w�cWs=�c��w�9&��D� :nK}��ն��옻_���@���L�gff��e@�>>Zfl\�U԰�P�mG�����52x��c��_�{P�����J���~������9�%�3����<?�8Ƈ�Y���###����]䂌j!x=@^  >\�b·U��1*�Ŏ%��U�ؐ\�0� ��g>h�4��ٸU��UOB~Y�
_o�FV�{����Ia�
b���q��n��3��Kj�����t��*!���8�9��,B�	������VEΎ-�R�c'��eC�����ܒ�0MN
"L�{��
�V�HNA��"���:�?LMM	Rs�b~��ˡ!�e(����6EEE���e5��#3�1B'�!$� l_���6hmm�+��d�v�p�'���hhh���z�Ȅ�e��v���9q?&�>Zz����r���2\~��(�{�`4�����zw���Lܾ��0��g����z;���������Wc�3�m�w���HZ���ay�70�0�e��������eݺu�jժe��~����9��^��<����8V��,=?��cE#"CT��	_A|�]w�O��$B�MB2F�!��ZPzn�I�����}�lmz���(�y�(nOKۛ��}�KL�w�f2��1��3�e"�X�bMϗ���W	�N�>DIEND�B`�templates/hathor/images/toolbar/icon-32-refresh.png000060400000003752152453623430016264 0ustar00�PNG


IHDR @{�u��IDATx���\���ޝ��[O֎m۶�l�۶���6�m=Ķ��~�N�nݙ�;�|VW��O��}���S��4'���sV��8�($!�ӂ�	�f�b�;�lݓ]jb����xb���.�I�+Z�MW_M�\d��y�佂���Bj�s�q	��eqm�@Ѳ�8�\
���V��ͳO��������S}��0g����qޚ�ͳ���k.���e�Y5܊4���~���iE����7�pX�u�2�W�f�G�_���,�6�tP����m�_��<������Vg�%��doQ�"�ur�k35cb��}����6�XuQ��9-d�{y����e��q���Pr�M�;w���_G�㝿��}ZT]~��Y�0����f.?�zJ��'9�(e���sF>��I�^;J�&��
f�����OT�<i�V�!Aa�ZMJ�/�
�<
q�Ĺzx)ѺW#f�R�zR%�&�R���d�ԡ��w�iE�R��)G�TL~��U�s��s�R�a�B\h��X��+'�16UM: �q�y��ˆ@��I
oe�Y���<�|0!?�^�V�v3r>WcuU\��,�u��F�l��p�(�hW���v�a�_��}�Ցr�+<�f>Ts�/ܢ��+�>�.���`ݟ)?o�(>wK���6	�v����I��N�ZW��*+�"��
��G�[��(����։"3��9g��0w�$5)�b� �BϿ4e鮡��L�ݬ��̙76<��
%�lF@4�)5u�(8yE���W	3��,&.��hS��ήnqF?sa���b�OxLQ��Bq����mz�+΢�P1́��'g��qy�LȔ�v&(о#|aF0B�*�vF��v3sv��.�nc����i�h>6~Q�)�"jd��Z�rd����/���c��ǧ[�15G��4Po�3���~H��m��%"|TG������_MWx�FC�t&�y��x�x���o�P�,V�l�RL���F%����,�P�3�UT�̀�V�S���i���(=*Q01Wo������L��������(��k���LQ�犪�R>�	&&��e�f�!�G��:&�~x�m���l
�l�0���*c�D�_'����������%�a����lU�a��W�h�ΚFl@\񲬈F,���U�L0�w��G�&�N˝H qquZ�d9�<j���X��Q��W&9�����O��Y�`F�âK�4�����ߌ޿�K�/ڏw���Y�����&��*ܑf�#+��[{ַ�lO��/��6I��q\y^����*ʪ�gRs�w���_D>�#���,$�D�?��|�9��=�w#�eW�����1�J�p��ܱ"�`�7�D!Z#
A �a�����<`�7�aF
3��
#<�O�/6�p�0¤�
�;\ᬗ�ˎ���+�#/)~��v���p��H$"
	�f�b�;�lݓG�bܽ{�.A�q��&��&֌L��c��SpA��M±.�3��a��ax9Z�'�!�������ܹ#�L����E%G
�e�ч�NPrɍ�2xa�S�C
�	����+��:�b������d<���${T�s����E�/����0B�((:|��7��V'�.���g�ܾ}�(�
YP��	M��[�X�����bG	�b�?|��G�^���I�;@�2�8�N$r{����
F(Z'�n��
�%`&(0 
�l�?�hY���a�o���+�6��?G+(v4�3��7(���X�����*�}�B�J8�/��7
W���H�5;ޢ&G
�&C|�fA��L���ç��7oc+ė�f(z���7n��S�O��7@�׮]+��W�^}a���GU(���й'�]�re$6���~]�8Jn�U?��]44��5~IEND�B`�templates/hathor/images/toolbar/icon-32-inbox.png000060400000004635152453623430015746 0ustar00�PNG


IHDR @{�u�	dIDATx��yPU��/�6D�PE����1qj;�v��?�Il��?�6�dڒ6ͤII4A��h,ƊZ�}Yd�d�}e�e�#3���g��wy�9��3��g�}��������Gu%%%�b�����C(�c�1�iiiTSSC�nݢ7nϝ5�����TPP@���4::Je-}�Z�It������7���oߦ;w����0m��'��z�t�ttS~~>��j��811q�ŋc._�L999���$<���twwSGG�=�����H�_Kq�TYYI�.]�cF��^����			�,�������^����E���@���TVV&�p&!�"U��=��������(<�V�F�<CpUU�𦤤�E���	����t��u�����)F���`eP/�!
7�?55E�����:��:򎬠��>ԁ(ƈ��5�(@���N���q����"�tzzZ�"j�z�ԕTX�+ғ���4���s�8"�
�P633Cw��U��/s�Wxa��t���J��rM�W�FP��1����^QQQ���H���0BK��{�hvv�^̝��C/����a�Y\#�rbbb�����m)��q�1N�H�_��R�����k������
�RcD����`���Lj�x��C����vS�ޠ�G��Y��B�6��I燂�h��F�Qy�T������RC�~��-����.bSs(46�I��ȋ�,���Y}��i*ƍ�^�&dM�ەF���P��I��JE���ѓ�T�I�%�(X��I�FTwd3�8S�A����mT��Jm�����:>�J�A�4����b�3��C
�J��CR�B�Z.��^�R�k1����O��^Ky�i�τ8͎
�ޖ(�Mk*<`OKٿ4ݧ݄��?�P�;�N���I���-�m7#�q:*�1��?J��:�D��$�4�;QO�us�(���Q�Ϫ��|K�z��}�*|�i��O1�S��QR�.=�:P��5s*|ۆ/<�E�[j�w����1*�r����c;�n�+_SF��?:2oL�I{� Q�Q�‘�6��sƊ}�C[�^�E��� �y8�I���1�%c"l����=It������pG-J�fI͇l�/�J{����[�yߚ�}�w�,�V췢�c�2f�셎��:S�M��L��O����=��i(Ȇ&O�~{��cI퇬��W���y�c��2:?�"��|UB<t�H
�f4lA�'-
��q9jNJ�k��i�Q��Ҿa?#�;fJ��
�h�1�Ѭ�A�s�5�/�j�S�F�H4���(�-)�u�`l5�&�:f�7���+ҙ0/)��o�ؓ/K�/I	�|QR�xQR�|�)QFs��d�zY��������<�<���{'@x\7Ɲy�yre�v=<�¶��[��s�qf�ފL3�L`�XI��׃��
z��0��B�����i	o�8����sg
�-ކq:�k9�x-G�g�{�{+Lp��k9#0����n޼���|��İb��%<�σ8�	����k�@�pV����Y{�7�p�{��B����"�	Gp�r���#�=��0#���Z���H�`xp䒻!���ȱ���
b
�Ct�#`P�Z
0��2(�:!��������A������R�A`/��dG���N�sss�"�tqqQ̡�=�"��#
���rƜ-a�c�B��piiI�r�p�F�`�\M,��՛w(f�g�hx�7$�`�.����@�������B�K9���t�ڵX�%��e���<��B�5������#Ұ�1��(��0+w���Rvvv1��X�2���q�є��ͅrG�.4�����P��Y⧈=�Ő���'aj{D|u�0<F���
��[sx�� ��ի�{bx�{�
�w5p]�p�4��^l�z@�P���b]�ze�i	�9���b��BSD:.\�@\c;W��!��!@�:P�{*�9F8����1�P�����ŋ9]��m�gQ� 4<B�!T6B�QĈ˭]���
0:�N���{peb3�^h���[x'�c��,�0B�5�+��Хe�FX!��U@�����a��g�E�`�B�S�+߰`���`(���=��vzY9�1b�Ր��0^N���� �C������@ga����'��9
 �Ѭ�A�sƕC����bP��#�u�`l�l�	����y����2�LBxx��Qk�(�j^��اAd�����y�y���N��0n�;������zxz�m+�b/�=�4�7#�̦���2f0���������Z\s8IEND�B`�templates/hathor/images/toolbar/icon-32-lock.png000060400000001162152453623430015547 0ustar00�PNG


IHDR @LP��HPLTE������������������������������������Ż��������kkk���������uts{{{fff�~ȴ��tRNS@��f�IDATx^���n�0CK�M��$]�����B�4����<���/��Z�Qm�?2��O
9�-�U�3�*:�!RqE_�,N~;�y��7}��@��L�Ы#e�qi�ƅ�P��-S�9��V)(���#4ħ:/�K�!-f(:����h��KJ.�p��\u���D�K�:88��d0J��\�IZ/�b�${I�AҬ���F������d��d/�kN��y�d]Kü�����t:���ad|��RqْR�'���;A��e;e�%���Р�xX3�by�G�x^`<$�BW��	���:��af��ӓ/ ��ڏ�i��0!��Z�����.�qDp�^\x�ko}����゙�4��,|�/q�`�|X$X��/$�^�D�x������Ii�QSu(�ˈ�6�[��R��Z���&h��G�����&��&{�<����ZIEND�B`�templates/hathor/images/toolbar/icon-32-archive.png000060400000002270152453623430016241 0ustar00�PNG


IHDR @{�u�IDATx�XE�#GL�2�H�w�13����{��e���gf�ef�����A��H���G��Uh1#2z��]U��
^}�U�,�O>��˺�;��`�CSN�:=�n�a���o�6�-i�����M���"/�����L�
ݥ��O�=�,n���������/��
"��FY�ƅ�����h��XT΍F�S���;w��y
�yN?~���b��T[�QP������pa(��
���!$	f�r�����f���*�5>��c���o�8e*T�L&�"lg�_�~��)���i�:e2��
�����{LR�@Y��#���l�?ر}[&�T�����������Z�QQY���Z:��Ȁ�0n܄����FL@�G��*X���Y6����a���?�
�P�޿D��MDY�U�%�3o>����>�
�Ԅm����ȪT��p���d�%�	�{����CG�g�����0�!a���J-o��6hn�If���Ť�	�Z~��W�=ss�-H�^����7z!��|�����P꽖H+�ȂN��2�5{.]2�e$�h�����f�/�����U+W ����Ϙ\��pZe��9��f���QP�j��K^ˀ��z����=�7��4K1W�\�N'��_��J��w��܌3g�X���4���->/y{�`0�?# ����ʌ2p��k嗳��h


���g3Q^^��xM���G�����\�V2����<��)�}\�ݘ9��	�	[�|���d",G���
���ԍ_N@TXc\ {��l
a#7k�CH�Ў�B7bD�2`�d�
�G nքE��?�)�xS�\���ˠ�ߠX�jF�A!X�t�C7�pCn
���ZL�>�]���<\��9��M�6a߾}4hP�
� O���l,G��d0�E]]��g~��������rq
��cP8p��cǎ��bذa())�֭[;Ǡ��TTTt�A�㗧t�A1|�pFl��1(v���2�:Ǡ�0bx"�aPШ̂A���s����	9M\$&{�<�F�ݽ
�>��Ϡ�3(��>��?�ϴ}�.��IEND�B`�templates/hathor/images/toolbar/icon-32-download.png000060400000003167152453623430016435 0ustar00�PNG


IHDR @{�u�>IDATx��iOTgǏZm�Z{��}K�&M��i��/��M���IkcA�Ez-�P-c]p�����V��d_.�lC��e��vzΝg��;�„���0�9��3wxqaQ/��M�pn�	%3(��g��3
��(���	�
{���f�K����i��I�r�`�� o�I��B���y��)R���	寇��5,@���E��٣���!��~���^�3.�,�7&�b'���FD�H��Q#H{/����hͨB��r?*�r�2¡zj��W󩡿�V��2��g���>���TކF�)nDHSr��n�
�2\J@Hw�Z�R�4��"��C��	�҉>NӨO��r�
J�5h >�мS����!,��8�x/±�PR�QrV����cts�&ն���\���n�%�_�
e�Α��*�ܣWwǀ�u!���#�
a_-��[rP�t7�_�W�����Z�RW	Lu���I2�ԣTD�ϩ@��IVzPʻ��&�]��ulj]L�ڎ�G���
T��q��m΀:Z];�j���Ǯj�檣Wv�jė�9�֕�T{�׈���Kr�$#��@{e�����M��8�Hi�US�^e��z�5��K�D&5�d��������djf]$�FSI-�O)�A�$�~8EM4`��#1��B�RjxuB�J,�a�L79O���ac�J�|�G�|S:5��O�HTp-+����(�����H{2���,2<��ݟ��bO#���%RC{.Ѿ�sV|��d���
d��cnHlN�۳؞-@D��!�̓/�m
��q��OM'���x�qv�_�Ya�I7$�z���&�v2H���A
��_�e���i6�`A���ml=�x2�f�B�!���	G؜�x+,��ˈW��ě�[��+|�#6��?&��F)W��3D�Ŭ&V�+����k�����O	�9m�Y�؏�w	A�Lz�X��Я�u��gAX��O-��mm�˴i,��kxM�j���~���7���j���:�#z&"`�6�|	F�/�E-jQ�E�Ix0T
a#,/�؃�K&��XPo�<���+��O��G���Ç<~�X=ӑ�H��O�<�;w��7pff����x��u�{���#+�ETD$0�����c�(ܼyS���u�+���`nݺ���H׮]�۷os�����7���8� �
��޽{N��NOO����c8�����!P���)���@#MNNrkD���p�F\������������� �s�#���{􇋲�����nu�F���Ȉ:���a�F3��?|#�}�U}}}����7�ghh;;;��)�7���H`&2T���ra[[�z3q��(�ù��`������bss3���?w쭭��9z`����ztuuaCC�:�`�7��ݍ�NWTL&P�������q�766�B�joo�"<��O���kjj؜?�3#l0WQA��@!�D---"��@!L�͛���ml� /)RSSߡ�zOSSӈ�)?����|a/)bcc�v8��,�-eee��'I����ŗ/�K���P��ǖIEND�B`�templates/hathor/images/toolbar/icon-32-article.png000060400000003263152453623430016246 0ustar00�PNG


IHDR @{�u�zIDATx�Ew��
�e����e�.ò��(�ߠ��L�n.l�̔�aft�v��y=s�)Z���$=�!�Œ�.,,|8�˹�K�DN�s��v����w�5�(�P�a冖�������o5��r�*�կ~�����;;;�R:��kU�U�

<��s���Ϭ����.�WG:� P����?������}�J*�JNd*;����g~�(�(�����/�nooo9��*��������s�=�OMM-j���B�"��w��P��ᕗ^�x"!�pX666dc}]�[Zl9�m�w�)^���+)���G?��w����,J����fe/��{�_P`iqQ �`Ꚛ��Y���f<�͙���j3
o�;M���(e-���y��D�2
###?��b/��?��VV��̈��(QW'�KK��DP�����ʝ�@�i��7������-��X��gF�ږi����)��'L�!N��<���K/���g����i�B$��M���%�h�����)��9���w�# ���'�ʧ���R�z����������YW��M��g�%pF�`qGG��B!,��oȟ�ԂsR��������ىŒ/���Jh���JYR���?IH�����4$ccc���`td�T��T�P�j+�G��{��N{J$5����WV��-(P�p)��Re�7�2C@	|�U�ə.MMM(!�
=��ac�]� �0�1�T����(�R�:�V566���,���+++/;()��'�S�����2����v ?��hf�(�q2�%�ʭ��|'���[	��R,�T,�_����v�AX�`,\^^�B�e�������G���)#��)/^d
^���;�Z�[A�����+;��-�s�\�d�)�G�������1]E���e�s*p+
�L��z�[�ԫ/�z���)p+*`�s�!��ݝ]Y�{������p��4(T���d�o	�R �ʫ�;V�lmn	������
�N���k	��l6�J�e|l\�=����ڮ��W٭�9U<$[,O��X���KV���L&S��K$�
C)w���ڧș��J
�w���ެi��z��
f�|�*)�U^Q��}R=��2���'"PV�ɪ�+�X�����9�M��S	F�IN�(j�Z����/~�3	G"z�pN��֖yC�]]:�P��t�
�������cX2�4L��~�⩧�6ك�����U���(f����\]Y�€$L�i-��
�$��~�Gb�b���d �2e���
��7|k|��
^�\��̷L
XzhI$�w!�qZ��ջ���}E��kP!�-�k���纙=C��R����Q�/��v�}�a1p�	�y b�J|B᪸G|~+�v.�(s���b>yt2
�.�*�o|�u�R��7��<,|x���&i�K膤лb W%�2�/�R���<cխ%���ev����������5��1�M�
P�Q+2*���y�H�ZL,(�Lh�i�ֶ6��.�0�8AX*8�H4�m��UWW�����]�����(j�Z�����9���IEND�B`�templates/hathor/images/toolbar/icon-32-deny.png000060400000003215152453623430015557 0ustar00�PNG


IHDR @{�u�TIDATx��YLTW�ǵi�:��pa�]
.l��#XP���$m5��I��M�4�ڤi��jlc��8���*�P�aؗ�_��z�����L��_�]����Y�+��%�D���C��^ӌ=Qv��ٽ����AN��4O�]�K��<;t/5(Ǿ�v��B���
x�8?���h^8��U7~�-PAF��
��a�b�ݫ��p`W�+蜿�#p0t�!u��-���V���a��Q�[����z<���~�ت= )���iGN�cW(��p���08r"@'35n5���|0�68M��c�Ln��\��׸�|x��rt��j<+�a��h����`lK�m$Csd��P4M:4�=tԞ����g�~�����q�:���Z�m[:�F4�`:���-����|ѝ�F��P�}���\���,��x���y���s�_
0�Ƶ��4�.A���HQOU)�T�|h72�6:�]4@o��N�Q��'�zއǬ���h�')*��zƭX�P=�Ó�7E��'+����`܈Y	Ot3F�<&�S�)�w�#ɧ�@{�1+0n�=��ؕ��#��L���7_4@[���-Q9�j��2~%���G��(��u����I�ѭ�iK����O�h2*�iM��hJ�ՠ@�^��x9,nP�S��j�ɣ��@�&�I�V��
pϨ�5�XU�5*_b�a�{PM
���FS���/uF�B4/�J�~�O��ҠD�A�2���q%ʩ�j��^2�QaP��\U�^q��P�I�
p[�B!a�3�9�
t/�*��5���_P��2w��W�,K�2��苛z5��Ը�g��3�:��s��+SQ��
��3䥕I������X���d
Ԁ�\���'�t�`I��]s((��-w�N)�Dĩ3�&^.6���q�i
�4���s#A����I	B	�/��(Hֶ���Z�
��\��^J
*�7�v�ÇJ3#��2#�J	:+L�)������8�썾�E�[�r�ۋ}>�T$����X.�|<WK����V�����WQ���~�V��2b)�Pj�%��'��h"���?�{���("��󋑠ńR0Y�b��$f�½�a�j�W��E�n,����V!S9�����(̗;�B�Y"�3!���N.e�X�/j^��%��++q��~]�mp]"�����F���+Wj�<xO&��;�\^������jf�F��w����d.�Y���1::����a�'&&X�3�.�#�B__�>}����������v;�qF�7��l֘/����a��8�;��A����OD�����A?fimm�'�z��E4�Y������8sV4@ww7finn�BRľ=---���G���a%�x��>|���Nv�2]]],<��{O�g�����=C~


���w���������_CjM�5�'sU�/�����	/qJ����r	x+!�IQmmm.�"��C��N	�Or���8y�$WZZ�euu�c���.^����^R;vl߹s羥&?Y,���ׯ_fǤ�qqq���o�K�ߎ|G*+PKIEND�B`�templates/hathor/images/toolbar/icon-32-publish.png000060400000003502152453623430016265 0ustar00�PNG


IHDR @{�u�	IDATx��kP�U�x��$��ewYHEPA�E�BM\��2���&k��6�G���T�ePy�R��HV��/�rK@�;�(^P�p�鿇�f{��wY�3�g~s���y��yλ˰�Q=Vb�9�ռ��4i�^S�4ݠ�c�t��	V�قuϱ*��-^�
��ߊny�޲�5���ג��mkhޅ��M�{`�
$�����/\��"�6u��3�����n^LʚH�UG������Uw~5����rV�^�}��~H�:�aYς�x�UE����"�cJbG@��u��?�U��s<�1/%V،�k�3P��>�Zw/��E��ช��td��"��m2R��qB+ciN��j�q/�x���馅���(�|��਒��,�ŅZW�	���1A�QZk5n��@ϊ�P�&N+	?��O�N�?���{SP\`"&�<���BK_���S-���#j��
;��s2�0�Y��Zwj=y���˄�<�-~���c�5S�Q��A���y��@���Q|J�O#fP�A���s<��
��(�&�<��TҪ��7b��<
����0�/n�P@7 NHW�.w�r�>�}��m"�!�t� vP�s�Q����X,n p�b� 	��ȝtY��0��8�<�#3���H��or����\�p+�2=�ή �~�@:��$�rf�`�7�_q���7
�.b ~��x������0O7����}���d;D�a`��r�3#�']݀���
�"��f�c�o*b)rG�cK>9S���������C�����T���7�ЂA��'���.�?��Rb_;�|��?�u���OMXfMHn�|��S�]���S�G L�!�;����#($c~/�-��I�#$y3��ma1C�َn�3����G��֮%#W�����h��b/�b�tkb�v'�$���qҔ��~�"�����{�钇��Jp����o܌5,���R�L'鞐!v��bo��Ő�yl��AU�L3�}���"�g_I?���͟w@wq��[K��gga�k�Q���gS"��i
�R�lDꂱ�	�D9֟�?i���&��4E�`��J0?�>��d��#�=9�}�D���4�A(�
"�����ϴ���@���̖$��\[�(Z۳96"�`��X[7���0��Z�͘��
?0	<m}����<^��ļ`���>�	�|S�ը�%�,`B�@�>���\F0e$
��{'X���M$Ѓ���������d�X����Ʌ�5��8/v��U��>�u��5�}��;K�U�9�޹s�:::h``���r�
uww�g�X��<6�$@v�-�t��v�˗/�͛7�z��٣�}}}	�����XϚ�\\�?��w��xZ<2��,@�z��|/^�H�э7xr���9Zk;�n�7�B>5`uo����'jkk���f���%wjjj�s��Q{{;?2�"�Xw����q#555�N


�����#��0���@Ԁ�l�pE��k�]QYYI�TWWG�ϟ'79ď	L��q��Yr#ޡ��F���_�H������NUUUT__�׺@��m�rFYY����a�w�E|��SUWW	����3g�PAA�����b2�L|�<���BS���$�����&�'�F8�@�	�7��xQ<������xѾ())i+\TTtX���?�)6n�Vjj�V��h4�����X������%�?R<V?R��N�@ON�IEND�B`�templates/hathor/images/toolbar/icon-32-article-add.png000060400000004063152453623430016773 0ustar00�PNG


IHDR @{�u��IDATx��Kl�W�I�[�hAtU����E,(B
�
�ET��
R�ƋV
*��*!$DiDҢʍ���*'Np_��؎�:{ƞ��8��/�����9��o�q�����s�?���w.s�91��Q<311�P(t2�z\��
������_R����i���K����6�xA�TZ@AA�!��zSSSiyyy<���h��O�崀H$R���,��\�~]����*�!ųieee��{����dU���H@���jZ��#G�p��}��'���W���fc��TUUe�|}}]t5d�Su^�H$$??�1�Z�(�G'N��+Μ93n�|��D��ꤣ�]�*+��練)�Dž�T�r|||���mg��!-�χ�:��H�ܱ�,�Cccc�
��c�޹s�vh�;bmm-�����eN�:�^aaa������eKs������v`hH�==�����deeҭ����0���VTT�cIgtL���V�m�FGehp��{6ޱ�����4.��0�|���
�A��	�7nH�ի��;uș#�3�/^�4�?:wNz��M�_}780 �3�M�>�f���to���J�y�}�6�-�	u41D�ss�>7;+�]]��`P�ݻg044�QO���lJ�#P�rNX+�M�����-���M�����W*��FM��jm�ښ�z��c1&1��*�(|Sq�N!F����ё�)��%�).�:;��������3�n�����T����+~n�
2\�:�phI!�]0%�Ύ���8�Y1l��ˢ��`+V���WN-�|>�!�����^//�4dWJK���A>.*��2S�^�$�Z"~1�(~�wvƲ5�r|lL�)��'q��,�*����S3<~%�A0�X,�$&r��3�|q���6�^�fڞ�g���˒���eue�qY\Xh�&�IY�6��\���kX�>(���O�*��
�f-�@�qKKK���(�
�I��q����%%�*��8����DQ�H��|��_t�F d,!�pA	!��?�k>�%�����{�+��R��WE�9(R:�]<�K6K�I�ef6���߉|��X+}E�3Q�m�
nvs9��3JhI�x��xBV=EN���ٗDZ�"��yB�-eG�s%������x<�7?N�HT�]u�OE��ez�k�s�x�r&��xLI�p"5'i=��X8l���;ω�M#�F�A#�OE`.d��=��;�]�S;�df?��Cl��i��b�oE��Q8kũ9���	�<���n.GGF�>fHo�H>��7�H����x�;"�%"�G����g�>��g?T���S��(��/�_�?9↕7�>O�2	x�a@�`8��:��r���ٌ�?:�|y?��L�#�H0�y���+��+�e�O�D|1x:E~`��'	�'	�'	�'	
�E��g.���a~hHNliS�/+	���jCZQ^u`�!��3�g���N9���g/A��q�o>	�Y`s�1k����~o	
:�c:D�%��l�S'%�S%G��%(�T2�Zo�L���C^�K���p��94�g����=Z���r��(	9wN��8��C�!ZL&�s��nȹ�
n�2%(�w=�V��q�C.�\6�.�s;�*������4���	
�dJP@1"�NǐS��1Nq���5��	̬g���{��V�'(p�pK�+8
it2\�\d�45!�{��ͧNP@ܮd�� ����ݐ�%dLP"U���aa����#��'(��r2��.Hi/ 8�)�
"Ő08%D
2ikkK�[�uttL?t���h���%ː���d�pI�d٩�a������Ǐ1	
�%.�d}�Ͳ0�ѡ��"Ng#AA�EZ���n�DV]:a鼧��,ͅh�ʹۥjd'Aa;�l۳=�IP����!{OP���e�=AaZ�k���---�YIP��{������a //�[YKP�cǎ����n'�z��>�m9;	
w�,��D�`s��@�X�^_1IEND�B`�templates/hathor/images/toolbar/icon-32-print.png000060400000005132152453623430015754 0ustar00�PNG


IHDR @{�u�
!IDATx�W�,Y�=�y���z�g�olOh���
�m�ֶ78�m��vw�Jɻ߉�S�3]k��Efg��|Ⱥ8�4��������t��؇��7@�.
mٰ�J�?������<�0���8����op���O�Z�����6l݊M;vC��Z4��<��1>:�'�Q�@g[�MdAm�y����%�R��TA/,m'x�	�ٰa�;nCD6B݄P�B������ʆm�H��Pʁa��6��q��M[w`vz�u'J~�t`fn�02��u�hll0,
�5Y�nh�g1�D�jlr
�008Zh�S��Pl;�x��S�‬�cSY�������ց�k��d��^�J&j���8|?a��U9�6�g*U�����'�(���n��֞�R���*���������ߘH&��47տ�l���f��Π�� 	l�
k�W:�ԥ��N	c.V����m�{��d����ǽ$��>H�@����n�u����va*�@$Z�3�����Q�ASC�0,��Eô\6m�Ғ�����(^|�e�ݻ�ٻ�tfYk:��(O����p*#��O��۲eÅ�dB�(U*G��w푪�N#;1^��P_�^@���J$�e�&$��ٱ��7d
���g�
]�2���"�N�kk�����5��ڈ��چLCh��i;�$�"+��M��H�A�X)ZG�,�Dҽt@n$R넺tb��t�aک������5��m�R��8��m�1���Xnm��y
yA�m*�^����p)Q�F
t#�`-@&�/W1gJ�L,�`��h�d�b�8��"L�� Pr訛�T��Ł����c�a��)�^'�e?H���&}����"�X�zY0Ј�K[�0%���M‍?�7D�b�8¥�@�Rv�h�m;�׆���"�\w��H�P,��
��`����5�W��[�z�2(�9���n"�(�>,	�S�/z`*�P��D
�
�x��'��������Zq@<�9�%Jf�ժ\��@)W�05�M��v����?�Q�.l��k���,v\(W�Pr#��[�d�W`#�N�z��3�yIAI��<N@2E3�e�LU,{{ݱ�Å\���<�l%Q��%	6)*
B��B�.Ia|繯��6|���,t"՘���^����.�Ea�{0>oa��)cYƆ��,�+_��-�A�d�������$�M&��7�?p��۷o�x��*Q%1��/�!�B�u���/��[!��k�?�<#9��2)�����>�ͫ5���@?���ށt2����D%d�q�Y��E>�CXw�}n��N[�ṫWt���#�<[� :�sa��-�;�Wn@��q�K6~���
mlY��u�0�-���ᩡz��'�t�̱G=������-cW[���j<6>�7Y_���1�7�	�[�N$�*tuuf�?o�8�c�a!\+D ��1UB3)u�B���Ô��C4��o}�ס"%�I%�!ȋ��z�WĦtw/G���OB���EB1���)ǫ�\�zIWq���)��M(��Df���>�z|+�dE܊�*q*����{MY`(���"A��U�#�@AP��N���A:���8㌶T*u��a�t��k��<�*�y��P���C�D��2Tnhooe)�r9

�w���
�w/�@EK9`��/�b௦L&����d����k���R�T��z�����>������s.����yM�t Y9�,�e��E2�ZP�|�077W�t�b*_
d�i�n)���s�B455Y�d�N�э���L�/���0%����{���}����yWW��N���F��x)����)M�LU6�5)X�	>#c�Bd�����{D_I�<&�.ihhx�x�r�JC�+�uyy�,��`�J��Ge
��^4�Y����bŊt]]]Z8�"iy�x.s�����v!�l"�"
YbA�Rc�8Q�%E�L)����CϞ��-υf*_'~���"�lmm5�]�
�>�b:�'�b�|<�T�	�p��f!�#ܰH�K=7Ӑb
�0[>�W���B��P�1,�B�	0�p?�1Lљefsa7
y]��P7u���P�@`F����gƫ��?���̻1�wUY�@�%��?fzR7�qzz�fA��@d��1�|nR�g;`�������e��\d�T��C�W�Y�<x�ad��G����b:��\�I�
�[����*6W�W3!Q]Kt\�1H�dӤ�.��੧��K�ݻ�:2��F�1j���3�a||2���x�������Ų���[n�R:�1�q�FLNN�111�hh�k�+����89���sb�ϼ�q����yOODlYp�T�:�8��Tgg�N�*�9~`022Bj!�4G9�R
��{Æ
��U��F�0�% -*��eM�x~�����/^�x�~������M��F5���e��<3y���g?[�x.�k�I�x�G�F�����}��0���φK��[��&ja�IEND�B`�templates/hathor/images/toolbar/icon-32-info.png000060400000003463152453623430015560 0ustar00�PNG


IHDR @{�u��IDATx��OTWǏZm�Z;V�J�&M�mZ���?��&M��Iccq�8�
R�Q�D�"��("qeTYƕF6\F-���ܾ�cx3o@��x�O���|�yw1�+嵀�o�sE�==����>~�>��׏5|�/\���8�$L��j^�ɴ��)��iOC����Ş��@y�6���A@�´c>�!���ez9��B��8�?"~���ߔ��K6����I"p����	O���
�9N�9T��"�۵�	p<B�dճc�15��T�y�O���ǰ��VM��Ƙes=��e���-�0�5}E���n�E/`Ks�ٜ͍(w9k��8�{���L�
�5
��sF%�64h*��s6�3�>Ô������4?�)��i�E�=�16����C�d]�P�^`J/瘔Bv:��-���E�L�^Y?s���V_�j2cE-�WI��
��ˋ�zؽkP�U�d�gZyΜ�*�~;��8������,���{3����,.�ߜ���kkv��hv�����Rq��2p���	Oj5.�^��:�,y�1�<�(�>=n����Z��*<�}���F��r�"o�}�*n� ��O�p���2'�������o� �L�ÓZ%�f-��.J=���'N9c;�[:�bg��,9ɴ�"Km����|�G������c�n\��y��{d=<��2z��(N*�R
N��07�����YL?�B����,9I,G�bh�� -9Ș3-�`V;wd3��E���o�$J>��.���s4JB�`S<���b{�:\�~�M͝��~Y�4��S8%9�&�)a�md���o�(ɗ A�.$�f�=�mӗ�c�:�ǯ`��d��q뱾��)`A�{l����sм�J�_Ȣ�j;���J��
��N�'`}�ua���(���F�\N��*@�Y��8��D7Ġ
�2<�w<��b�(0�	ƃw�{��4��0����F���Wg��O�?�b��>��6F��Y
&�����K`߀XsԚ]��|l`�H�&�A>5��JO�uv}�A����Wq�^�Q�
}o饝��l`��
��˨��L�㌵`b�F�h�����>^�w�Z�k#��P����Y�Ǐ�57�ļ6ub{��!߸q��_�.�\��`A`�!�N�g{��	�A�w���7o��O���k#��0���#�v��*�ę��:$�J-�܇�W��8�=}�A���!nݺŽ��*�����o߾��E�!����C�u�*wgg'���rGG���w���{��ܹs��cb�X� H�嵬�_$�;$l�����˪졦WA�"a�!������n6ڥK�d]�"� +===����MMM
����˺�EºC"'��hhhP��M*"�d�
��<�H>�<����ٻ��G�������:nnn�PSS�---�n�u��t6CNZ]]�>�uSo�3g��z4XwHpB;`3��l��g�
�nE�$��V��hEEE\VV&�!���;$(i6�ӫ�`f�"P��~����Vl����+**ԗ�n2W�JKK�
����C��`%����O�<�����D��O��P��:$�c`$2�(�ĂXvH�jRddd|�'#a��*t ??���&����3g���v�#���[]\\\(s�366��Ia&�5)��/�I���7)�ϭ��ҏIEND�B`�templates/hathor/images/toolbar/icon-32-adduser.png000060400000003001152453623430016240 0ustar00�PNG


IHDR @LP���PLTE��������ֵ����ŭ����楥��J����������������ރ���{R�X�b1�k<��j�ͽ�Skkk�ra�#�xM�쇵ߓ��>��Ki�Sf�,��Czzz���k�3QQQ


h�)�Z&�T��]������h�N�^+��j,h�%�`�͍�0�h���W���L��l�S�=��kÅ:�I�����{��:��T��c�M�y�淓��!!!ƋB����\��l��B��~�a"��q��J��ε�s��,��l϶��ų�뭓�d��&{V0�6ĩ��t#_S"��%k�7�h9Կ���G��G��@��4}�F�.ɱ���{�W!ѯ4���f��X`WKߟI��h��H��j��{�zkt�9��=��@�bIII����q��л�@��_�°�Ϡ�wU�,��c��޸�B��пz!��dzQr�#z�LߤV�b(P�ʴ؇�y>���ϐ4�X�b��ɕ{a=��L�wL��l��&�ܦ��tfffхV�$��lm�X~�DŁ(mXEd�+Ր-�ܭ<?"ttt�C��}��ȫ�E�pB�J�r'i�4��l�����8��r�5)��-`�Z����nA�ʕҿ���R�{.��SѕI��ϗQ��ɡce�+��I����~ r�&}�O�W��Rè���@��G��tRNS@��fIDATx���r�Q��L�&��c�VlL<�U�Vj۶�vj۶n��|1.���🲔JW@�d��&�5!��'^i~�X,X{X*u#6BwDʼ�,v�ݷ��f�Z(�D贈�j�$D]�D2bWa�:��%��O:	tQ+�F)�1�@��..�
e��ҟ%[9�����r�tѸ�]��m��C��6o\C��AW�����3B^Z���
�x0wKy���GƏ��2�]��r%s���������+�{1^�RT4Q�Z�	��+AF��ƥi4��5�4G��C�,W*W](�B�sߑ�а`Mff�����e����mm|h�qL�#�\������W�f�).��l�V�sg���r�V�u�%�d��~28���Y�+*L�
��gg��Q('B����k��i�����0~$%\��ݱ��C��5y7c����f��@��a:6���g")�hGh�1%�XI	z�Q��v�#�a ��"|(�uo}
/}�9��휶���D���h䝧't��3_{�cImz��l��H%�Q�$r/�E�(��S��6o�Nu��=|�~yf	�w!�݉B�ez�T�J�����dq2�vnS��@��J,�v�i�!L�H���� ����$#�𠋅!�͒��H8
[Q�ҭ��F��<�1�3�@U�X=�Nq�#��]c*�S�u�l�T��@	�N�7�E;-T����Y!�8���(���֎�m��{l
��Z���D�8�;�,`;��ɳ�:?�o�Ŭuz�W�a.����2���9
vIEND�B`�templates/hathor/images/toolbar/icon-32-component.png000060400000003210152453623430016615 0ustar00�PNG


IHDR @{�u�OIDATx�XEt3�����N�C�q~fff^�a�^_7en��~Uf�uS؟2���f�c��{��(��)77G��ݫ��R2X�=4��B|�:�s�8��`�,`�
�>�{XF��@Z@����t�@![����h|v���p_���7�Je�]x&�r�5�=Xy��mY�/��T�:�נ�0�P(���d� 
��:����@}#�\
Ϭ��6�����#�l�6lHaCAA�u!���B����Etįa�e�ֽo��d�6d�U|����i'� �?~��	7���L$Ǟ����J���C�� b����{l��؃��_3�%-�t`���ܫ ��/�)����r2Б(fA�����Y��Y;�ı���K_�X��l��;�ȇ�|��W!���&(���z�|�G����Š_���g�.�{7��{9���}~�v=L�0

[� ��=.η'Q�C�*
����?�!�ȰRH��gV;8�q�?#�Gh�������^(��=Y��
k�'��<w�3���=�.V4y���&1�E������OƊ�ʅ:�tҡDX���(	�@�1	�
N���q8҂c[`��O�e2�_;�J=`s2�ꪦ�����0aK0��	�U��JiIB'Ԉ�6h���a�H藌Ѓ+1����ca����@e�*B��JW,!���8���f�f.�a�Z[�H.m��j��F���0�!�!^F\W�`fW*>��A�3�ã��ޏ6�.�BuC�Ԧ�˄��0��O��Qt�,��>��W,����O��>|�{YЁe�ǣ+!q���ػ���<9E
��X�_2
��\� ��ś���y@�c�m��:8nY<�����:�ˁ��t*��|>`+�N�3@�NXRjS�,[�-�k�#��z�,>�I�7m��[5��D(�c=���=Ky1:��E,�!]����7$S�P�}�y�x�3�IJ9�
��� ��b��ߏl6N^�v-=z
jmmo�����{�n�'(�e���(�t�������6

�q�������(
ضm�f����oH<��͸u�6o��-�ʕ+166�L&������gX(����K���b*�'��6sti1]Wv�U�Y�<����]�������cbbB`NT����9U����+mњZlٲ�{�\��@��"���kt�m
�v��?��;w�����B#99�`v�O�L�5k�����cf���Y�g��U��z�j������i�r���^#�$�\Q�c�Ŝ���khh�O�S�a�
�yg�T�{�b�T��$7P�TܹsG}_�ǃ�Z�C'�u�0�~�I����a���6	L�����>�$�0���9e�R��f�Z�0vM�Vy`f"4C�G�L.-s������K&�<�j[�R��9�3������J���fr.�g�X�7��]�z� q�������?�k׮��رc�
�y�
��B��<O��k�3B�tE%j���*�IF7�T>�����={����?�
�����f�Y��IEND�B`�templates/hathor/images/required.png000060400000000172152453623430013625 0ustar00�PNG


IHDR	
{DAIDATxc@����0��)��0EPv6����L@R�M��� e`SX���z��(�x9?���IEND�B`�templates/hathor/images/notice-info.png000060400000002126152453623430014220 0ustar00�PNG


IHDRV�gIDATx��l�v���۾�:ff^I0���IE�8f�XO8f��h̛hq;�2Cl�ߛ�Z�u��U0��_����!�77�	T�I�Y?�����є�jȕ��'0S2R�Uj<��@�K_��(�g��PzB'�j�
�g�&�T3>��uA��1�Z��-7����^pfK��rD�Ƹ7���d��a����F�~g��B[�E���pU��kj�G��Wq��7ԘbJu���GSֽ�W>p �P�=t�4	�x�,��ƞC�4��{j�d�P�tF�a�+���ک����3��=pw��P�d	��݋+g�S�neѧ[!���@[ ��֏�Q@�T�&�p�"�j��5G}y�@ܮX�8jUA
2���;)��z�t��E��&,<��#�:!�>����
D���]�f����g�'Q�^Ӕ#[�7���:)����ă��z<ގ�	�E�SD�ix����<%�4����B��v��`R?��5���'X�gy��!K�=��7/;
��~��j{��-B�Ӝ=���U;G�7�A�
�h������� �/=q(,�n�@
����"�JS��=�������+�h��
��3�,D�b�8r23U��,�縃)oȧ����B�
 �>�N|8�G��3��=倩+�\�0O+��.͊K���24#S�>�)���V(�x�H
4q B��Б�
�b��t�(�8I'>�\UM��d>��=+�]q����<�S+7�8�"'��zqRb)�4�j,���(`4�Sa��Sve��s	ݏ�
��/%tB�N2@P"�:e�ĕ��(d,�^�,���S9����������~�?5pZÀ(�'2Yn�O�p�KL�cO��<lfLx%�<�S@���g)��yo�h�aЏ�n ��p�S��/��Q	"�W#S����:!�1>�1����C�����a��_R𪤪x5�~��;iB��!��&3��U����@�@��h���j�����4��l\�IEND�B`�templates/hathor/images/arrow.png000060400000000145152453623430013137 0ustar00�PNG


IHDR˝�tRNS���IDATxc���v�/��&�A�=������5�F�\�IEND�B`�templates/hathor/images/bg-menu.gif000060400000000045152453623430013317 0ustar00GIF87a����,���;templates/hathor/images/notice-note.png000060400000001403152453623430014227 0ustar00�PNG


IHDRV�g�IDATx����@���9G���#p��`�m�%������,�}]��i:7�~x��`ŭ��]qpGҼ�p�nGnJ�ܥ�ޖ.�/Ѹ!�]T����u\���<\g�ћ\|K|�S+^N!|�E��C� ��rI�+�./J�����@�E�
t�*?ϡ|J�P�y:+���")
���Ŗ�1A�)<�"t��i3��(�HO��e�pB������ѳ���I�N1z�����CQ�<Q@N|�8D�E����h�l=**z4�1Q���q��AD̅�[
���{F4+��/����w���⓹蠩4N�}#�;Յ*z r0�!q��	�B?�w9&���蘃�dš�0Y;ʅ�	[}T�;��F%@8�z�X;5��yvt��3k�0�����g�s���q�a�l�C��>����sUt�Έ�IQ�Y
*=���nT�./fP���%>�{�qWuF�݂���F41�9�q��v�[��[����
7<���ʼ�ٟ6w��ѽ��}�����ޙ�H����/Ya?��w��#hC��c~�>�C�����yL���;�%`�fn����>�|}�a����U�/3Z�Ό�{4�z;JF��Nr�w����ũA*n�

|Nm���o�u���,��p�k�
�ݎF�{�ijA�t����y�7h��3|��uf8`�g8ð���ᯤ�_�[x�̋IEND�B`�templates/hathor/images/j_login_lock.png000060400000006664152453623430014452 0ustar00�PNG


IHDR���H�
{IDATx��Q�@�?���E�[�!��a00�``0���`OF�e�,��H�0�1ē�����_Cf�wӽ���{��\wwC�+�v=�owwI�����n�T30��gpJ�8�G^��Ʒ��H��!_z�'"Y��e��l���2<i$`��b�<6��
�F�'&������v�jꛚP�،�v���R[�X�G׮N�OO��ĄW����v{*ء��
�dyU5�����#riu��Z���9+!|0�(SͶ��u���O��	�yL���H�����y�dg�B�
P�T/w �K�V�AFJ2����˄c?ʂv@.)ʻ��7�����/���vS8.n��}��-�q��{qߝ�)�-�r��F�9����G���}P�Ԙ����frr
B�`��C1��>������!���G�D 8\
ffT�K{v�߇��|��i�.i�L����lژ��S�5�FF1_ꛚq��#���
��_�_����]���י�:xϝ:ZWa!8��o��>��v�$/w0	�q�iú��z�011��I(�J�F��3gQZY��B����H�2��@/�m�a���Y7��ѩ�F���q8�g��ڴI�W>��r�$�B����s�LMOC�J��%X-8��㞀�����[���6;u�#F򁛳3Mw�v45fczz]=}�>#
�����c�C\TDD�;|��Vu.�119���� *�k^֮�<Ou����O�ϖ���*d��o�l�?����Cf�����0?%,4���;n�
zڻz�T�]=���)d�"�%���
������;�����C��봞�54����N[X��E����j$oۚ�j�:��r��3���#Z�S�J�t;F���&7��̙Ȏ.8�N����M�^�A��Š^��[�z͎��1`���4�<�?��+�)~_��\�M���t����#���ѝ$�.��b�������ڳ��FK[;�{��k�%�
��K
�Z��
� Ҹ\�:��Iy���<	)˱"u�""�"#"M�q+����5odrj
��J�^f�W�V�{�q���	�-9�|lL�NR�cE��|pޚ�8v{
u/;���C�R�x�/4���]n�]�t䨈plZ�n��`�IHU�)K{��/���c�����<W-�;A��aw�v����\]l�|�8#	�ʱ"e].�)�4
��Ax㱒�@X���W��]����)����#!n%;����T�X����������e�UYS:'�?��gr��V_����W�J�ĸUIcccq$�(NJTE�w��I�ё>w�յu ,����{�<4<��Dpk�Y�6���+��΁�>(������D!���5�
��SV0V�X�~�9`WC�{[dD��v�����%�?���c���� �@B�r�HU
YRh�!�T���YH~J�@ɀ��>::FpP���GBjr�HU0�^_�������������#a�Jq���+�y�V�xL��j�a.h9�DBjr�H���Z�����84l��M����U x��]Y���Y �nQ�e��0s��̴������ K	3~fӳ-)�ef�3��J�)�ò^�L}��m�]�?~�Èw-��S-��S�`��S�`�LQ�`�Lт)�Lт)�L�����s�i_�%�,�bQ"N����A�DH#b
Θo��2�2�}��"d.����\0�׸ƘK��HD�����������%��p}����#��?��
MӠm[��?_cc�}�Clg�9�U�Xn�t'H�)�,*׳+D�
6_"����M J����Φ$g�h^��SJ�$!kH���킼��%8dM�$��R֒�!i�}��\�}�5�
�=��a�S�'1�}��8��CW���m�/��s��]i�v+Y���"$}��`�I1v\���+���ϖp��� c?;�R8�^�a�NeC�<[�Kv�X2Д$�X�q�G��ƐD$�H�	D�o@�v�����zD�t���w��}�8���o|�mȶ~�;I�/�����(�8m���z��v�dخ&<�\0����C��KR����^�6��z��m)ɰ]]�#i����/nKI��hU-��S�`��S�`�LQ�`���E�E�/^y˲DY(�Y� �d���ɼD�{I&f��d#x��=������ڟ3��p�`��i�#/x4s���d.I�$Ik9��M)k�Fܐcؔ�5��Al���f+t5+�m�m6����"�`7Jl	��K����t�t��\�S'��\��˕e)�$�{�»�/�2� sɹ\��=�x�Æg�&�K%2t6�.��R>��ڎm	M�nc4u���Q�%���a�R���-�v���3���c��{0�!0C`���!0��O�f0C`��@`�{W�G{�Ƿ'	B��C�b��O�7�0	��̰`�lߵף�Ι퉮K*uϘ۵K�Q�@�䋰���#��/Q�u:PL�"
��mA# ���P��<�9P�s�:yQdZ���i7��<*� � 2���	�.��vT\L�	G0��`��l��f�h��E`��	G0�/+v-"�h�F+%k��`&롚l����� �*�عM����0W���p����k��`�u�F�loo���<X��PG�&F�F�x�!D��..�Tda�o���(� ��X\Sc#�k�+_�8Rɓ��s3o*�ʣ�_Z_ݸu._�VuT+���y%�J�8�9���q�<��AK�6�0ɑ"�~$�9�ុ�	V�5���T)�l��5ʹ�9}���Vժ/��U����_�[[]���A���i����<hQV�����w�=�83=�$X_{�/IT��<��ί\T�"�I��+���bMX��쏁M̜�
fĔ��
�i3&B#l�����$��  ��}�O�}H}a�Ѩ�����}!؁5���vwW
��yJWF<��	�8�x��S�R�]CP;)�׾y�0�0�����^���6do�P��T0m��<�4ŕo��0xg�,��2�u�=���0*d�y����B�p�`Cuـq��"(�V��@��Fj���sS��^���u8�39�?	�a�#y.��~�����T��u�iAu4���W뿯��r�VAX.\Ï)�\?9f_�Ҵ#d2���L���!Z�������P4��B) ��
���M>ԇ9��H��cE��(TX�}]��#�p�VF@=/a
\���GCՀ�����<�-m9??IEND�B`�templates/hathor/images/selector-arrow.png000060400000000305152453623430014753 0ustar00�PNG


IHDR

X0$�0PLTE������������������ޱ����������׬�������)��tRNS@��fCIDAT�M�1�0�@".6&��� 궑��͖<ۢ���ʈ�/���t
��z�����,T�MK��o���7IEND�B`�templates/hathor/images/calendar.png000060400000001120152453623430013550 0ustar00�PNG


IHDR�aIDATx����I���}�c۶K��b�rl뿈�۶}w��ۙ�,�U���L�&+���O'Cm�����?jnP���he�"Gf�-];
@�޹vr�!��]�<Zp9q�0����<���w��ף�{���`�@�l~FB|�����Wi>�|L�?�H�H���<y�|
P!�%E�ӳa�ݧ[�<�8�rXu�>���aݡ������/�}1�(Vy��f�������ݟ�!��d�H �;7��Ξ�(:��!�����ʔ(�m;���',���=0Bpq㱇~4�C�
���(�ō��p<�/��6�OJ������́�P�HQ�ߺ�5��e�m�r�9)�$�F}AIHsl���p��-,,��~�+ b���sҒb�J��X�0�!4��E�3����u�M�q���\������S��c��W�!T,�ĿO�R"O<7�{E��.�y����圴��S��!�I#�}S�\�ђ��������[���
��A�3f�vIIEND�B`�templates/hathor/images/selector-arrow-rtl.png000060400000000205152453623430015551 0ustar00�PNG


IHDR

X0$�	PLTE������Ȳnh�	tRNS@��f*IDATx�Mɱ
0���C���@:�~-3�����:�t�q�A4\IEND�B`�templates/hathor/images/notice-alert.png000060400000001536152453623430014400 0ustar00�PNG


IHDRV�g%IDATxՖ5�WE�7р������w��W�R�L�>̜�����Ff�ɝ���~k��-�{���\:��Y"_E�p�W�������Ϋ�{>��@%�y��^^sŀ#O��M&ۦɁ�z�7_���g􀀷_)�y�E`�E��l��q7��c$*O0�M͙h)=(�f��Qh[z��`�U|8Ņ��x8V����!=�*�%�;޼�^ց{ct�C�{N��3J�m*�5F��5َ[��=CY�5I�o����k#�K�h����8��1H�|]iq8�qq���\��\���4�Smr�8O5W�v(g0�h]�;��p�˜Nip��Ntڊ�������~箑�O��4�!�&4�I����	���H�$�(�@LյT�����R����L�Q��h�R��"/�S_Gz4�D9�Ê��T�$+���$+�k���@9��J���S7���&E��'�c�,���I|��t_�ٺ?��2{��!ۂ϶�vb7��2ٟ`����Έ��+%���UaW����v15��!�{s���(�M!e_ؒ�)���S���
���K�&�����'��8�Kh��*�P�<�r/�X�2A��]�<�K�s�Ԗm����0�%+F,j:bQ\��i�XP��EA5���aV@�찀yi+�,��bV�mL�Ü��2t>i��.�h�ݑ������1#f�m���cf�*�3#n��hρ�)�Gt���Ӄ�����o���[J෰�G��#a-�"���B:C����|_��8��~���J�
���ҙ�	�i���;<�pH�X�IEND�B`�templates/hathor/images/selector-arrow-std.png000060400000000202152453623430015537 0ustar00�PNG


IHDR

X0$�	PLTE����ȲMLD(tRNS@��f'IDATx�EDZ
�0�e0�[G0q�,�݊���j��q�Q�IEND�B`�templates/hathor/images/header/icon-48-banner-tracks.png000060400000005520152453623430017150 0ustar00�PNG


IHDR00W��IDATx^�YlS�=���y9qBH���,&�������&��NP��]5�� ��I�ZX5�+�H�^������u���
$�
%$�CyS�!%
$�?��}�W����@Iǎt�B:�;�۾�dY���-�\b\t�1tB%�D������X����$����p�M'�F���,H���sW	F���d�
	0���^��.	R	_�8��0�E9=�	ǘ,d8�	EѴ�M�Շzõ�H���b`ͫ���|uz��^<%��+�%ӆK����+h;p
٣��C7:Nvb�|����_�F�.xfSC��f��=�L�9�khm8�����@4B(.)�����G����*�:~���ϟ�y���3�d��q��AU�f�c�q��F���lͧ�~Z�$aذa�K|��т��y����тk�B�A��™���O����p��s5�l[���}붵T�ζ-y�S��{N��FX.��X��{�����^�Go��Q�&x|Gx��c�9��/���'�p�J�:.4Nʩr����ɲa]��`2���n&��s�}g���K��>;oN]�Ż_\�ֳ���dY	��=���7^���:����Rp����<'�3M��i6��)F_���嚍fޛ�q~���n:ϰ�����xЕ�#�c��[�:Y�!e:e��Y��@��q��e?���aH�G����u$zm��d� �VL�H������u)EL%�8 ��ۇ���x��V+�g>��K���"ޠ�WL�fO�#��Ȝ�f�+K��6`����8��(��*�lG�Â��>�¶��`�d���"�����8�D�Y1�:����q������u�lF��۔���O��7�Й�����Z�e��Ε
E����XQ��C�Cx�7��Ai�'�&�	�8�"�l@n�Nb�ɀnA`TM�i�%�|F�zЕ���/�m��#�a��UOq���_9҃S7�U8* �J�* H�8Xy�N"�S-�ʩc���@�d.�L!�����2>>��_F݉�8BqN���D*�	�1	�%�F�f��b��x<���@��W��'82��է�OÈ�Z">la-.fD�Y
�eM<;%2-�d�����dA5�PZj="���:꺯�#�)�f���sj��:ϒ�PS *T��A�/��72�z����E#`�����p�+���4 a|��E�Ā,�,���-l����09%	���Q����O�6��%�r`
R`�g�F���D�oO��)M@Mc(,[��UZZ�Y�|�����s�$�FY����(���G�Љ	$��P̨�~U�,��Ґ;�t��
J��x@��+Joj��;΄����(��%IVEc��\�Rn!/n�ŋW�&2����[�^�=����]X`�	X��n��$I1��(�ICV��d�ІA�h�"������2��i���8�QR`bo��	蟻TM@O6B�����8�ًPL�s�:̛7�MB7酓���O;�e��Џ��f8�F�-Z��ksȀ5�[�&��S PjG�{��ٲ�l�	�3g���V�ؙ�L�E���aM4JOܓ�����T��w¹�*1jV+�W
y����fɤ
ЁD�'���(��[H�:%�gg�f��
p��a����I��L3��<�"qt����S�>|H?�j
�{��	���}͚5�`u_}�f'���&�'���&���x��p\����\��?����4�D��ѫx�c��5��p�/���B��z}t��|�!�Q=�MFFXʙTl�j�*)TLKW�|�a�/�� ���~����?�6u�ͩ��$�wVB�3�v��՗����wpQ�U�����А��<�ΰ���क़kj�	ox{VcE	�%���>Y��`(�%f�y�@ѯE�@B�.]Zll��j_RdJ!��ol
�����������G�F	��x��$b�zYss�����a�����*�!sx6��^�܉c��qT 	������n%n"�ۅ�(�_�$���o�޽�g@*���ޚ���
�#Ǒ��\g9�����]4��[������;z�����_+��E�c�8�k�s?O*�c�uF�:�n�xv��W644�ߑ�UO�)"�� ��#(*,���S��
��(���
onll�֣E��X�"#--����U�.�cǎ�(�������/��PRR�@0�5MMMU�~6���jⱸ_#A1�x"���kAH��Be�J5���U�M�F�R��۪r�~DqK_ �>�ߏ�Q�
+T%y#�a̜9��q�[)��t���^bՈ>��X,5AJ �H�1�x����T`x�I���֥Y�����?�h�V�b�x]-s$��hF9�\���g�o׺�N�<L�H`��1B��9˞��1���V�r�ΰ@��̈N��v���3�魷}4F���LL���8uf-��
�	��}��g�3��ŷR
/+�\8F�hQ	�e"�@�S��� �0��չ��^韘8�h*1��O?P�(��jŽ'd�_��&���߂S���?��D�B������ML'���H���f.1c��j��i�5�:s�c�/�hm> ��3Ȍ�O��
�}��q�I�{�a�4b1GK������/:����ךF�7gQK�#���[�(���بph�ڈ&M0�#ǘD�B���-�	��1Bt�gL*�ثEi�̔ބ�/�E&FoFKª�{}��,��5�r2�IEND�B`�templates/hathor/images/header/icon-48-deny.png000060400000003547152453623430015364 0ustar00�PNG


IHDR00W��.IDATx��{PTe�Ӭ�RX���,�‚)�\��eW�*���i�t��m���T�M�����?ml�?�8�D��X"i mFx���Ji�9���������]j�3����y���3�^�?��'|ĵ�;7l_����J�N�p�3��sy͸X�}����2�x�4h�
,+Js>�8/2G��\#���sw�{U� ��F̴��+l�
�`�+�TZ�5��LH��o]D}&�@�\ZH�K#Ư�qyI���g���Qg��<�	�CsŚeE�+R�ɵ���{2ZZB���C��2|M.�j���[���K����!\�5X+�������%a,��XD�qf���?��Lݧ0��c%v��X3&]s��صEa�eR���{����O��3�x��iwr�p���c�����͐���x���I4.,�"�0�������UM��T�z	ϒ�3�i�6g)�u4�3�=��Ϭ�#�;��E9���A!�\3�wE����:��f� w���7$��]��35F��Qx�����H�̟��������K��i�����^`ƩNUƏj#N�eK�ӈ<|۝��^����qgp~&N�Ӥ�n_cV��6�����٣n-���A�]�]�)�0Ft���3���O��tNP���%�}'�M�ɣ��%��pI��#�W�K/ �P�{�V�-���tԕ�~�?��2:mja>>׮�x�e�?��)��M1�w�T��e��Q!�W����[��k{
���b�o+�,�e�W��{�[�O�)r�'��Th�Gel/V% �zX�o�'��.��F[���`���.Sɵ���s��dh���0����$��;��r�/iR�4�h+N���_�-��o�~�J�M���l����z�9T2�K�Ѷz	B��s�oy;���u��4蟛
��`c���JJ�q�����$a[�4�U0o�dž��S��xz�XG�
p�v��)xlqӆ#�z|�J���_A�9\��� ��FW�#GiQ�=e�)��{�={S�l��8�5�ǡF�>��8�L{�k�[�.�6w:m)�FW�G���GA�ӈ0/�K{����b�M�x��ʔ��˨�',n
�v�p�oA�C��2uB�v�pȓ.ݳ�Q`��;����nK�β������H�=�郭=�Bn3z)D�C���4qe�nj�5�h'-��'s+�Z̛+r��,|N�i�ӀmeBZtz2�y=6��	���07544o��-��Ɗ �ϝZI8|�2bu6����>��D�Y3��/ol2?_�ju���Jb�(�{v�.���Q�kv��?[jJ�ׂV���Zq����y�-v#�<��"�O����g�^�uT'|�T7�ݻv���G�d<Hk��۝Fi�N�WL+��zfn)7a�;{���W}U�;�<ij(����e��zp-����.t�X� �d�R^s��Za�N��U9��砫��ܷ���kYxǕ�W�Ұ�D^�5.�5������$��҅�ޕ��lG׹f�6��1�����*�'��^��E�I�������"�PZ�@����&�D�;9�y�I��4BG�*�Jb�4!��SYH���#f�D1�($���HP(�pQs��!]�!���W#
糰0R'�Ds̢q�5�D�
B+:c�0�ȓ�����<Q�"�Gw�"�b�/�D��E�i�Jl�N/��E��7,�L�#���F�DG�v��I�1E�}�'�0��_"q^'.�|�_��#�Oݟ&̫��$~�O������IEND�B`�templates/hathor/images/header/icon-48-archive.png000060400000003354152453623430016042 0ustar00�PNG


IHDR00W���IDATxݚl$���e4��13���1+La�Df��|��l��̻�Δ�����3��J5�}�U�UK
C�\kc<��
_;q�ԆT"~~ժ��wl��6�A������@�����L&233b�x���^������:������#�����=�D"v"��?x�`�m����j!	�J)u�x����'?�I%�p���|�K_�Ξ=����ƻ�0���yBB@H�@->p�}����L}��-�f�����o�b``�(��RQ ���ߺ|����e�r��Z|�U�|��((EMM
��+&''@����(�8
˔R�˺�_L��9�?¼eq�7��҂W���F�o��
T �B��A]}=�ϞCcf�⩀.�đ#G:7nܸ@�����=���=����Beu5�v�b���\mK[���������A�Cz��u��ֲj�
nqJ����)0L~���=$���Z����cld������/�?�	�<���N	]�����"�
����ؽ����cG���	�B�Y10
��߿�?��_Ο�
�ye�������g�9��aTN��3�[4y�����_�
�{z�no�����(����G����c���,]��$�	���q��<G�D�Lc�N�:)�����ͯ~I4fβؾs�&�/1�et�С&d1==��t����C��+Ȍ�p��{���L	�2?����f�O�8�<w�)�{{�'�|�_�p���$ְ�lww���/JEM��R�u�zB�0r�?^<�(�%�Lc]]]�����d�R֭_O2�f�)���׋��2���h����"�Oǐ9pǧ?E"e��2�x �XP9���D6��WJ��c:[��΁��2����x{{{�׎!��S>�xB�Q.HXa\B:Q3@�?��A?Cρt*I2��9��h/�H�1��	S��a!az�7^��dF�I��
gJ���9`�k�=r���}�9PL���Y
⢭d�8�6*s����m���W��J��0��gR�2*+�������� �f��m��R�wm�Z�s��,��[����#�ff+�'���Td�x-�9p��%����
�(e����=;O�U��5���;e��w��t�m-D���^�1��+V"B�K�-�%/}�
���,{ZD���˙q����M��z����B,����b.��d�U\�>�^�[ڻ�Ź����H��/,�<ʮ=��͞�Q�K�7O}�5Y�T���*��mˇ��8�n��/_�d���<eQ�E\G����p$� ]VF&���,ʝg/��(�"��S�!�!{�T���::;-@�fe�
����c�����+і�t����.0>:ʨc�x�2�\�\���j��$Bzbb����\a|lP�Y��+���PB�]�l)�.�n���w"'��r��%z��L�@Ey�V� #%%���r�,��|K$D�G8��"67;�m+#UȊ��k.�K��K�c��%�I�N e1��/�z�i�X�E6$_qi�3���L��mY��r�wGѝĚ�grj��!$�BN.l2�*I6���.Y;�	�(0g�S�r`-p3�Y?s���S�`@�ʀ�K�K@�g�@�dm�� A����3�#=�3�{���wgy�nIEND�B`�templates/hathor/images/header/icon-48-article.png000060400000004003152453623430016034 0ustar00�PNG


IHDR00W���IDATxݙE�K�SК7fff��23�|�{,��g�q�����ό��3�n��b�:j�V�֘�ꮪn����U�㐔6�	�=Z��Jix�ҥK�N&�N&����8^ccc����~��hW֐��l�zg�P����~�v�ڟ�eR=oG�	���z��
y�lllLm�3�So>s��7-Zx�u�#��C�����i���9P�-OtG"�VM؊�>�ɲ٬S�f�@��PH�j�E"\^��x�Ν���!��W�\��C!<��4r���ӧ/(hU>���@^=�)�?444lH�tA)X^����V�:{����"ƫ�@�'���r�,cr��U�xN߃��exh7����7��R�_��W�N�:5���s�wnߖ��qY�r��tw��,^�DZ[ZD�Pr�׬�
�Xp��A�7�V��Z�K!�F���%������]�=T"J��v���V�C��Џ��3�k�סru��…�i:���V���7l��Wb�.iQ���/���aɨ�G�,\�HRɤ�X���C�R��@V=������'O�@��9O�޳'hm;~�D�ː�m�����k��I�ԭ[��>|H��2S���Լǚ����$Ui"C]���}��j�yX̉��ǐ7��"@�Lݼy��h4zT,�ژ��f\��A���Z؀P�~�@6��s�8sи���i�e��uEV���?����w�~����R��b3����[��1D��>��0��?���|��_��3��\E��p5�4
���(^VT5)��~����<}��O�3���o��k�n�4�U0�i�ڵkh{��\f���녰�֭�"��8�i��3��`n�_�<�u�E�b�������v�S雸A}����b:Q
�Xq
���fx� �A�1���%�{�27�����9�~�7���/|�|#r�`y��_Ё}�Ei�2�h68~%�#���7$S)�R@��k�L���u�zU}�\��#A���N��O��@�L��m�3&t��f	4״�l��Ƙ9b�H�f�E}̤�y>���#��|�Ϳ}�K_�*�vޝ;sƬ.��Ŷ+XF� 	������9��k5"̅-;5ϱ8`ԑ���+d�ڵ�2�U8UaN�q�ລ�98ԙ�ր8;4`�-�����\���:::��4-d��5x��E���w��ƾ����i[l�]>3s���&��2`�cf53�g����e��@�ʍ�����Du��'=H���n��qM�U''&f��פ��Y �{ �^!k֬��o��"��|��S�	���;p@x��@-J
M��ٷov�mj��˖	�s�X�cHM�t�"�0�+xuD@�GlC1�< �30��� 5��t�,iG
a�6����6��?��\	60?���W_P̈́c��5"+t� 
R~q2�I�)R"ѡ���#���P��������N���^��ZM�:t�H���K�.5`,uչ1�V�raƸ�����1����j��>����I�`)���WAeKEKA�Ze�or�kltL��ux�*<m,Ɗ����SSY���۵���|�����+mz]���r����c�5���x�ƍ''@تRٴU�l����f<���i�;��.�#�W\|rR&�k!P��BS�D���Ӥ�@��P������k�����kH!�+
�pk���n|�5a����gS�|O	hok�}c�D�QR�V���	��W�ʶsDp��(~vb�o�t2*`����[����Y����<�c�Q�A��k���Xش�k��
�*H��\�IT���X�����L��p�#���`9'U2ס׼1��\1����6��[՗����2�����c�Y��֯� ����)�q�)@X���r������}��}�T���:�1IEND�B`�templates/hathor/images/header/icon-48-levels.png000060400000000774152453623430015716 0ustar00�PNG


IHDR00W���IDATx��3�_A��ضm۶���Ƕm۶m�l;�W�ib_�^O�{�9'[sV��+��i�����A�W�[Z@��q�&#%��ш�DH	�?f��b��DN@�
O`95V܁Y�TXxf�Pb���DH	(8�X?�	�H	�{`7�@��o��#v���"���5��蚏|4G�~�\�ԏA���?�J�~E��p�EA����7�GPNs��:��i8Q�A9�G˵#(�9�P�v�4�+X����@؝{7A�9�vf�G�	
�6fJlϘ�� HAs��F��t>�C�-j�e���H,�5�.�ߙ�r$6A���8��`3c�t:A���_Z�z��x���׀:k���TYz6�5��K�	6��K@��}�i�%T`����X��-�k�9$%h��(_�ͱ�1�λ������H�J�IEND�B`�templates/hathor/images/header/icon-48-category-add.png000060400000002116152453623430016757 0ustar00�PNG


IHDR00W��IDATx��p$y�l���϶m���J)Jg�F��7�m��ֶ��g���Sә����W�4��(3^��֙�ٙ��A�/�1�1�-�(�8m%���R�	J5J�K&I�&�L��J`��ϓhO�@��*����u�ߦ�:��7�3��ר3����3�����"�k+��m�Y��'�K� K_����@Y	��R IV�u�<Pr��Ux�ׂ2�Y
$�x��Qʉ�,ǟb] ������^����#�txʚj_ �L_d��p�K�2�9���3��?Sd]p���]�qq*r.��Q�R��]����)�~�V����� �An�\׏3���Ւ�^�#�򮼄`�}V��Jm?����ݐ˺ ���nH5}`����p��:�w�A��rW�r(=P�:��B֑tXa;c��[](����c&|�N�ۡd7�����J�Jlj��m��>��)l�׋�(��#wk*xJ�N?<JN;��S�߇�gY篐h��K���q��[o!p�ײ������DN"�'��,���٢�`���
8����J�9nn���OL>�	�6�:z�\��R���	��ӈ�{]��u�RwRbvC��	�<��������o�ȝ&b�����#p'%|;�%�L>�)�x�-�q����v�h�*}�����G]����e[[����|WF��y����J�����˙�B[g"�Zx�K�6˚��h'�XB�:
/ƵG_tǯ��6��|6���E~���A
Zj�;,�R�i�����E�m-�Dd��cv�	w�� <��Ox�����X�v�,��%ɿz̯��a`�|�vA�ezfߕ_jW�&���8r<9��HN2;y�Nғ�Ύ�~(Ǿ/tH���f�,�'_`ZK���&ݎ�#|�I�Ƴ:* 8z
iE�e��4*�}[◱��/�g1�挂����f�V�����}� �}�h��?]�
/H��ܜM��-�	:�
6CD�>�>�DNs)	p#IEND�B`�templates/hathor/images/header/icon-48-alert.png000060400000004416152453623430015530 0ustar00�PNG


IHDR00W���IDATx��	l���e+�]�6��8Gs�Wlqn�@B�A���6���;;��1�i�e�i�M�P�椤	�I҄��hd]3�Z��w���S�.����&�I����~�{�G��?�0^z�{��ϭ�Ѹvy߹U�N�X�{l���lݸ�����OL.�Tg�9��Y��&X�12��gs��g`�s�ֵ����3����<`�x�+�%ς
s��b��I��O/�cN2P5X�K�M#�WP�܈-���30P��K�)�+��JY���Z����s�خA�&�~`^��mݹ��эnKr���@
��u��I��������	��ն&�_~]e�1T�ý��F�/50
v�aڬ�u_����\]d�\�PL(��	*H�˵�0X��w�"T����LU>*I�SI>R���c�w��b5�K�����B�0*�:��ޥ�e��8[�L�k��3�ݚOϭ��.ہ�,`~���d������[�$���0�Sѱ�p� �ر�s��֘��᪙�8
�X�qػ�����-��;d�v�԰��k}��lUh��dܡ�*�/M�S����Z��$8̌�K]�ґ�D@�ul	���kQ����]^3/Qh�q�j�?�j"�ۮ�;o��5�[��.��^9՞���%	`^�
���k�n�H��ߢ��8?[�3�َp�yi!=��>���@i�p�<E�Pm��rn�hq�H1W
Uh��7��E�<j'�fe��y�(�w�Y�x߭&RW���Ss�]��B�U��PY2nz�
�ϯY�
�e��;nф�D�å��w�Js&#T;��6Yt�t�ާ�p�0o��,��Q�� M����Y�IԺm3z���b2o��+��A
�w�2&޴�p9ē��ח�ϡ�Z�=o"Q�y
�B*P��c�Og�����)�F�ly�n
ޥ�Z4��9h�1�M����0+�b���\+P�K
�c���*F����C�I��u�I4@�C&�>&.�e8�H�s�.��$1�rO��إ4X�c�2q�7�IԲ��h7�ǬK;�z��hP�
���	c�pd�����Jb�tȸ�4z��N5�l��9��3���K3q���E�Bxz1o�v���]����1�i���<�+�а�'W���ʹ�.P�+�̛h�,��q�P��r�Z%1�CtZ$�3�/���:V�>�s>_
�M4@ݲ��69.Ҥn�4j���f	N��!s��H}s�g,�����.�pͼ�`�,��wk�m��o���=��'��������m|
G6~�Z���q&�]�)����ֵ;hۜS��4b��dޞ�k�]���n¡Y���+q�����y�,��q�۝�N��,��8�'��ҡ�G�aW�H�r�%�����'�[\]�dS�W�V�>�L��tD�oلp�w�8n��j�;�8�J����p^�p��g�����q���)��س���dauX�s�����ø��zŕhv��C!�mJ5+B�o�ǷnF��=C�FSh��gKR�Z�����[Y]��]0m�ٝ���8��58lV�Q����oB���ؕ+ccGcQ�Օ�ͫ�{v�0�=��/WU��S��N=�J���y¦B��� ǫk�a�j?�[���M�}y�Q�N:�Y��No
���z2�j�ׯח/��m+�4صh�	�NS�#V����go��(�,~�!�O�-�R�*G�W�
���cs��q�7UX�V�
5X
V�������Ϛ��T�Q��4tx���MC+�	bR#�wЪ�q2��K'���vZ�F{�0�i&?1��WY�ɕ3�/_���T�*J��� �hw(T0��oxRpȡ�Lj0-�|0?1�k+�׽�6�֤��
z���W��fo:ڊ�k�'�v-I��y*vU`s��C���L &�����[�u�*sׯ�X.nv���v��ac�<�i4�6��L���on��B�2BIh�D"���D�NL�t~?�H&��TBE�		�1��0�|���
q�3�"��"��"�0pf������לɃ&�@����۫��Y�07b|@����=<��G	%_�4�O�vA�Q+��3����{��I<��QB���<NH�6�����U�sR�='�/D�&�A(�z�-�u�nLa�>�# �$��u2�!��>���O�87/	
�����7�@���UIEND�B`�templates/hathor/images/header/icon-48-user.png000060400000004336152453623430015400 0ustar00�PNG


IHDR00W���IDATx^�{l[�ǿ�{���y4�6M�Җ��ia0J����2PaPĪm}(l A7Z���&1T��ʐ`c��v�ie����B����i���}��G��N�{�9�][7����N��HYI���?���q�	����4�~��,�Kw���z|Eh�
p!�nE�ݬ'����+�U�=�	�	���Zh� ��D��ɳ=�b���#7H{IY�檻�?]yI͆��Y`��\w�Cl����
O`/J�Vd����\V�Yp) ����J0Ç4jp���D��X�1���������?`Z�L�m�>r�}{3:�N��#S�௫�9%���c�'��W�oWnoi��VvE3DU5TdY�����Hv��}G�0�{��J+pꈴ�A\k��R��݀�ȇ����Q�Ʊ����y��یWk�i^l�GP�o���ߕ3ۅ�O���\�A�h��:��Ri��)��r8��N��I����F8'��}7�G�6��x; ��[kڞ#�����	0`�����񫧏�*��[x�"6�؈��*�T*�#V}�i����^��|&��>~t���y�^���^�I@�
�i��B��0��
�_�:P3�����և�)��\�Ƒ������_y�}��V��'&s
	o
�����ı��^fB����|�ݺ�N}IK�ZI�4�!
�֙�®=G���=v�d�^��7�L]S�jsJcAR��+�jy�Lk=�2�+䢱Ƈ�~�^z�x������j^�m�q�M��+�5`,�t�Ѽ��jї��2��h�����J�>��vl}j���.���{`k��5���]����ڒ_Z�5��#p���9���O��T����/{�+C�G�oޣ���J:(�\�Er�S�e�<�nE�u��#�c�!����z�����^Nڎr
��}0�M̲�f��0sj���t�/�L��O�f����Ta��U���.J�Ꮄ��{���t �p�
hj,ǃ�h3�>!t��4
�8��` ��²n��M�N�(��X�	���#����]f�A��~�qG��U�
��a,(�YH�)C!$.�Hu ��r�l��&�T���:R)���)�\"((�
s_M�>5��+1��l+���
�GlY�{�e�ku�#�Tp�B�G��YT�UǖC�P��c,�?�R��@K[��=���(�!�I�q�``Y�ڻN���� R����g�Ql�.0W��-����fk�[h�G RM7����&9���k?��
�=��\	�WL
U"�M�����R׀\\��1�h|<H)��̴!�0QN��88\�-]Wafk5d�5�Ї���Qv�q����a���j���VN10Q�6X��Ě���X��7M�u�Ah�AD�=әJ��D���PJ��y�9�{G�'�"|�irh���?6u-����d��p��ApG
FC����)$��_�Y��2!��ұ�c��G��DO�s�ź�f:��e%�C]7�g}-UM�?�&	�$qW�+~l4f�3EEC�8�xr(��s�]�Ǐʚ��!ך[�1��y�aV%�M��ŧ! 8���@pdB�I�c���0j�@���)����x`�`d�y�D1���Ο9�~��ˑ��{{"���V6��j�ͭƬ��д(|��/<�T>��1�$��	0�IE� e�	���p"�q���r���\%�՗��}X�b��t��e�UA�J@3�`��H'��#��X���Oޘ}�,��tu\-�dV@-+����_�t#(m�!�@P(��m��L��.4����عH��H��lw\5�A��2�����+%}le�ꢠ����ܵd(�$8�h\_-R��r0p�AI�R��8��}'.2��ᡟ�Znp�#t!"�`��H�`9N����7+��̺��-�oa��]ĵ�9c)���jp��Zt(Eru�J>�j2�,9ֳ�p�E�eG�
Pt�y+7�nE��Zf��L�|6gl`�i��ΐ�_�m��wcߛ}�𐮔+@����_��K���h�c'��)X)	@吲�
�,�<���=�X��*:� a�<X�ul(O(*�IK+,@�W�}����IEND�B`�templates/hathor/images/header/icon-48-download.png000060400000003731152453623430016227 0ustar00�PNG


IHDR00W���IDATx���х���HZ[v���9�u*�afff�����L�0{���x̠%���n�JU�hgdUG,�s�}��㟌p"����]�N@�E�-GtX��8�Ãs̨u�' ,"N��x+�vT�����F`��|��F����.�#��‰���jd�+,a��c	"|�<��� O��Q�5'�70#W�������!�@ �
U47��7O�/��Υ���G�S��$!����f�tb�'99<�0��a�ߜ'�>�W-��ϡ���%�SZ��P O=�\ɍc�	$��
�y�v&�~`�<���*��m�`�S�����('7N�@3t���f�z&pFY%���Y��]�:�j!y���)��3����
�̘�sPoB�a�V�@��GB>WP]�����1�׋������I��W���:��N��u9/�C
{�
��J�F4����<���u�R�|�Hϛ?bޘI�b��x�P�3�]�kׂ0��
k*X��7k�
Q��D��4�zv$pJ���C�e�g�L�z��s�X�V���sJ�̘U5����Ԭ����0}BF9�F)j̍f;~�H�б1�T�t��)�bd��y*a�|�nJ�Y(`b�
���ў^VC�M���܃�ɫ�Z�w������E�S��޼S�2Oe�8ZȬ���
��m{��BS�&$6UGt�[�$6�T)����:��d5�����^Am�Q�<ۼ�0��Fy�>L�@n�:�j���jT���90eyJ;��Y�0a׀v3�=\~�<�'Mc�Re���
d)O�\���/��"E�s���*U@m�FB��ӳ��vӽ��h�o@X+�@A]�� ��U��_�{�x�ov�̿�|�o��l[�/�T��.;�+QA
�t]��w��z��o�*K�Mh]	pL�8���Ve/����!�&����(7���_`9��� BѸ!W��V>���y�8�r�L�@��<����Ļ�n~�M�I��Q�8�,��a+旲4'j$�٨�`�}U�����G�
g^x)��
��]�$���!
b��,1���m����7��b���)E=�]�O�q/vb�/g��M_�׼:Ԛ �N$���	��/�Z(e��1�kI��ڐJ4w����{����50�LB'X��`o��_�Ϳ�l���ܣ��P�W�x���?r�v��������: ��]l�2l4\��ρ	��h���m������,���p�g���|����j��}�g������2�F��
�Ax���<3��8~�k��^>�f0�Cu�;���`U��b��^6��ԗ�VyΧ���͎�w�_���L�Ac�˰lT��ֳ?Ǝ�ov��\8��Mc?X3N$"Bcaa��z�R�h�LD*�Z|և)E�}���N	�{�9����9�I���E��]�f�3A*��}����m��ף�S�}5�E�Y�h}�V�\�#�7����\H��\�i�n���O7s���C瞘���6�#S%K��t�������B\��QE�%��`�R��*�1\�x�[��]��a؍�-¤
A���m�(Mu�����u0]9�KLOynj�]̞�D�(&���&ǵA
�S��|�'K7�y�D��"ߓ_Ge^�d��O:�������#rDnLf�C+�~�y�"_�@�-����ʑ�±��}�Enr?n��F�ʀ|,����$� �*�]�
Sj�5 �xD@�Ԧ�铁���� ����> @��p��mʱ�
^�6�v�w�9t@PAn,��:S��S���I=�y��&̏�@���o�I��<����vIEND�B`�templates/hathor/images/header/icon-48-links.png000060400000005041152453623430015534 0ustar00�PNG


IHDR00W��	�IDATx�p#�օ�����Iӆ��33��������a�r8Y6�,k43}�j�֪)K���V�]���=��X�/ſ]pgW��	l�R[QN"�b1����
��E�����l�K��¯1U:�.�l��q�w6��Q�H��"(E}�צ���1��u
uI�LP�$b����
Z('�!@���4 g{�g���$_2(���A��|M�2&��1E�,�`�^�Pmn\EU��
ԝت��
"�������^�D��H@<� �rs��
ܰ��B��c[���������[J�������H���z�L�e-/���:AK�/��8.���{����s�8n�,6�x#|���>
���0'>��kzF�O�b�mAdak�,�5�SQ™(�`��
~��_'�8�g_���y�ֈH0Z�E<�����$L["	Pև.l���W�*QO�� 4��,��[{9��f�<�y���x����}b3Z��'��֗x.���6 {"�+e�Hle൦N�2?�_��"��K�=}����S@)�{�in��m�OL��SSxn�4%!�~���)��h7h^<�F���3��y%�	�S B�h��[�%?nGDh��w
.�D�ځ�������1n!��!_����{����i^�l�H��Gs�7���
/��2Le
�&$-m�l�F�S�O�aS��Y�ib��}�c�2�S<Ϙ�
�c�
Z�-�`�D,��F�Ca���1�Z4 �ًX6�ﰺ��&[��>��C�Z8DW���8�����V�/����1ژfW���{ǚ�%b�(���mGsS��"�Ϸvr��!�Kd9��ېI%��9�׼���4P�J�I�m5�Qic���������[q�����\�v�"�n!��y�%�����SʰU]�"[��n@L���(
�"h���av���L�6-�������}�i|�YAG&�~�놦A*
V,|f�@�	(���u�͛�w'� ��s~W~�����ڗC6��?8�Ŋ6>JL�;�K;@%x�������0�cS��F�PJ����[��cg�0	~��w
����q�c��uh*�+�d��f�[
�(�ʌ��/��K�r柾��̔`=�ò�HG��Z?�E2�}3�g�sE���hMaro����-��j��e^\�����9��?e1�͢���7�B�0�SK����IZ��bF���֙�C$>96!�V�2c��l��s��|-x����0�?���e�Y�/xg�dg�ԩД�*PX�9±	+|NVe]`v"	�r*�p���{t!s��=.�ɮ�2����.�;v<00I@%�0[
�xZmZ�'�'�N�ۏЂ����W�?�=���?^v�j���P�L\Ә�6l��7_�K�������fDcQ��r%xk#h��lV��eL���������y���Xԭh�h=�L<B�σD\|����O����{�a�L��$D���yFz��H�N�11e��x 
�D!WT��Q�Z��w�[��|�DH;P�u�?��`+PJ;NW�&N����c�@JDQ���,/c��$�w6�?���`����ZPJ`[�c�)� �g�.:��?ܓdҜ۸��/�g�IH���l�2<ʨ�v�9�ĢP�`)�\���oD�P�������� l�q���.:�k.}����5	 >u)�L`�R��ң��;���vZ3&���_̗w�>�§>���y*�/%����g?A45�6N�z�KVxВ۞�b͊��FG@q4�8�N*J�gbE�I"Ý���Y)~��/���y��w8�\��'0k2 ��r�2�����A�PY{���q�V$g�h�}}-]���/�B1�!��k;9�c��
�� Kꉎ1ܔ����_Y�Cn�C%~�׉&ڈ%!���L/�Ì�(􍎱hFb�o���խy�"�t�r�P�-G���_KUio+�;��m$��9����R��D"`GM,U;|�icb�<g9�o�x%5I��'Q�V4�0���!�S(1�FpeA�	�Y^r���`�q{��K�K�p&�O�I�g��t�˛�^P!YS�D��tp|
Y�p�w>uK�v�#QV;�f����Q��8���@t�1�{
K�vD��6��dbaELg�x�\J��;޸9��P���o�3�Yg�kR�C�f�A,���٠�I��A�gx�x�A@��ڤj|�
ā(��ǀ5cP6�*�d����r1�aF�R����2�L 4�*S���J�	���@��ŀ������|�P��[
x� 8	4�bS���hS��ap1�#��4a�ח
Em��h�2�ʘ�|8�> e�����ח�S�/U��Ёꪴ�X��Ҥ@ؘ���Ч�IEND�B`�templates/hathor/images/header/icon-48-apply.png000060400000002546152453623430015550 0ustar00�PNG


IHDR00W��-IDATx�n#[��s�\9=�| ��AfC+�4��af��^v�<�f���e�q�ɕRd9��#����n�[ �<x"�D�'���_FZ4ʗ�JQ��'.��"��x�'O�#�.!�b2&p�YNR�Nw�Uo�Tm�QO�]��z�4}�t��v'�wx|�MP�`B��8|�D	�����g��iJ�x��:
"�@�߸[��<{�[#x�D���-�<n����o�Љ8�ib�S�� 0x0xI ��9�^� ��H��"��>�oBa�%��+�WL�i�#��^�m�;�,a?��n�<,����+��)�"A��ww�/V��>g�(��SG
���Ý'��j"�~ex�����Qv�d;���:��^dД֝�M�_�=�������v���R�'�7�~�r.��\
=}?�0
�۪{Ҋ�i��.3���Z~$19�	������q�<3?OT��	���Fv�.�^��0��2|�o��+0���)��res��>�A���s�)[!m5�m>xI��@}r�����Ŕ����M�o�	\���\����h��ãGu�?���"i�I��^|X�oo�#�����H��k[���}�RFl��%m7=&��"�;�h7�5�/��%*��!V]�|g|�J�Û�_F��ՙ�%��Z�C�K�\"�J�J<;��r�~.�m���6.�v�O/alvo��H�F���)�s"�]	*q��L&��5�J���P���3���[x���G7��"�vL�(����$�$�������y/v^�M�~c�����%`_�)D�j��IT��%�uO��H���$��
�/0F�)�p&�JD���>�1�V�@/��:`���v<�W�wC�0�$�p��.d��l�t��E��%��!	��(���ހtg�R6BP���0L�w�|��I�9�$���H�J@і	��k7�e�k��C^%g�$L�)
�I�F��8��[�%<W�R6�S�*ds��m��cL�7n��I���L��$�U)[�dޢ�ߛ��y��HBv��aw���I8ѻ�3�]��݂� 2	;�6��!�[t�7e/�x�m�ry��?lx����#�5�����Dv��4G]���O�nv�/K�BO����8��|��ȱ���@T��l�0b��=�tl�6- �6����CB`x?0c v���$�1����-s�M$|8&p�,B��B��B�<+W�g�-�')L�:�
��<x"p0�?�yX=ѶIEND�B`�templates/hathor/images/header/icon-48-links-cat.png000060400000004123152453623430016301 0ustar00�PNG


IHDR00W��IDATxՙpIF_�̘A�x�̜,����L���̷����s�c�$G�t�K3O�֔(vݫ�k��}��G0V<Ѷ��;�6F�f���B��
����n}'P=����Kq�L��R\�!A
@
J���_*���m�2���'o�p���$��
��s��!��>�G����vy	��r�����ICʆ�
N
L��@���O��&�?�O�t;p	�d�x��+�P��R�e��
�Y�d���'Qx��Uz��]5� ���
B>iC4��D;O�����Ǔ��h�Bp�{��'��`���[?"gHk&��`���<�>�x/��/�K�'lnl�2ߤ����Tͭ��PRA_�U��\i���{�N
!��>����۶ˇz�\��[<��8�<r̟�9�&p뛽PP
��?���Os�r)E�'8t;��?������_z��)���JD9�<ʯO����M��Pz�,�8*W�3HP��p{?������i��>�:��$h�qXT�����	z��^���(���BZ'lF0_%1�$bۜ�`�L�����6�����	�v]������S�K�����Jg��z��[�}�	ٚ�`�mMۘ�'��P��.M��4�u��Q(xh=�3q�\��J�5����t�}�Qi7@"B"a���̝>5#����ዧs���������Ҕ?���6���4;��o	��iQ�c]9�a��ID#a�}���L�.��O~�…X����k�䪗�i2w���&(
B�ƭ�=����˧�ej��'/܇�3�b�6�x���
JKK2�l�º����Z4�խ	�kvHNp_�d�'��tW!�@
w	���2�S���t�*&�� ����D4%P^��_��C~�1�]R�3a�F1��U����{�!g@/�9�����=����~Wn�'"}��t�+���O0���K�s{�,_�{�V(�pGB���_�4xx�N���uN=�d5���v['�o'�gR�+ɿ����Td���X�l)�T
�+�~|���2!�
�n=h�C߻�|M��~�lHǨ��9t�c�Fc|��x�ۄ�R~������p��J����3�ʦA%i�Y(� �P�N஭+A(pl�U��om��)ɰ�gW�9��'� ��0�I�J��`��T��2����-��,ld�u���/W7@�⨉&�>�à�'�?64�Ub
� �[<1���H��ħ�}�4(*�3Zē�7r�~˹��Y0��5-[���� �?��:J�P��sQ�aЩ/�C�����U��﷮�]GB�fJ��;�:���&d��b[g7�?�.
CA	Xy  �/�X����|�,����RwO��T���z��`�e(���=ă5A��R�/�X^H(�� �S
rć���GϺ�@��[�ʦ��!!
Ak����FV��C��[�����X1�m?�u�ِ_�V2�`��?��nÏ�sU
�O�E`!h�QC����8��[n�x7��w��B����YXF���ͨ"�S�-m��K����gx��N��q ��Y6��s\�|�����o�3f�7�US/�~��k�1�����V��C ���b}��AX�b��~(��l��j��~>ع��0�~yd�����1�-����l0�"h݁`7F���#��G�����=�Ks3n��r�hg-��|.��
F
-_��W!q�0��j^�Ɋ������_�x�?~b��ѝT�n����g	�w�:��7���m�*�DggS�i@�7�/Xq���e��"9�o%�W>6W��i{=�4݀���J�o�	^I@xK��h_9��v�]^ż}�+�a���yYe��VV�%M�xHyK�U�w��R�㫴�ԃY%=Q���+8鯬{�9��
81�*䎢�Gd���&{S^)<�!;���fIEND�B`�templates/hathor/images/header/icon-48-help-this.png000060400000010007152453623430016307 0ustar00�PNG


IHDR00W���IDATx^�YtUՙ�����M	��,(0*�XJ"8�BY���e���)�����蠨�Bg�]��VdX�uِB+aJP��$�����k���p� ����#g��{�{G�m�$I�Wm'N6�(�1��h�2	 ��!f�y�'J]�YC��c��*|���U|�V?�ɵ���I�(
Y�L !���e[˲�-�*7-'��׳�M��C�B��*q�Y[��
�B��^ H�'�`_8�>��	e�Ŧ�"�2�4���ڊR�!�a@����n��H|z�/��a}f�;B6XC��z��/�	�<T5/4"�
��ª�vC�����#{�缁<����<OϽ!��<[�e�XQ��Z ��1�� {���/¼xJ��h		8��3l$GD����T�� O�WY$B��jة�X̀,z��B�
D��
�)y2��~a9HL\�]��3�i���'��O�� @{��p�o�.yau�4�;\�kv�f�j�������ˢW44��r{O��X+vb�a�p�K�	��YM��]�y�S�\�0y�c�N[ne��&��'�)I�6H�z$d��75˲D��Y}� �ے؝��e���-aR�N��mg�2�9*hy�ح8iܥ�!K>�j>T���V$	���J����>��/�ô�Z��7$��'X�����"~����*'tă2��A��
r^�͉�}�	b�� ��B���BS"���Z�,�=��U^�����m��4W@��K�[�Cȱ��=!����i#��"ښF�	^��H&�R��?#��5��������30,��YA^r�`�*�,a/t�����v/d#�9�J�p-�5-�SY��,YU�ꦵ����V=���J���,�J�Fe��l�?�}TQ�ɢW,ʶY��3���wxӾ� �[�Uh_+�R�|�ǿ~/�u���D6��.��R��0��G~��e
�hus#��;*"o��_�eK*4n����<�{�Y0�����^� �қ�rUU��0ԩx��f��6��+@��&�щ��� �5̊Ǫ�9�=��"RA�V+�a�{h8�%�_L�gL|w�����hM���`���`Ȏ;��������Z���'BO�I��V�
Y�%�S�غm�5jFYSx=*���|hc�!�C��pn*Y��N�8�^@Y��HnS�}S�$�#����]H��n��"�n|�ނ%���T;
��E
�eE�ܘ��Ȃ/��
@�ܵ��Rv��ـ��Y�k�����%����{���u
�$�1rc�cv�x�4�GB9R|�BGr 766'sh��b�7 ��@�u��)D"h���k�)ܫ�Չܹ�>Q�R6jzH\&(�N��J~��嚯��yyy.�l6���455q$��S�]s92r<��[��:a���m�V��{������hnn�M\�EEE�
�s�PRR���2��NvbA�'�$�KR���ޕ+W�ߺukUaa��A�!??Ǐ�…1q�D�8�Ǐ�UVV���N�.?��u��u��;�Fm��{2�.�X�y����y�� �

�Ű����O~�Y7�"�J����$�HĚ�p�$v�ލ'�|˗/g����D̑ј�;j�\�v/@,e;~
�_���˃�,O�ܹsU�>}&s�saw�}��Gk�B2
��DB�
�l.|�K�䱳��+��l�,^ �ӧO�0cB@6�i3�ب5�mu�>��G�?��/D��=��&G�FR�O��n8����@CC����}�=�"�'/@xl´�LY���G��琎��G����a�ׯ���׮�`�X&/��A�E�G3�|s-�kg�#"~M�WU*�,x�-a	~B�ȑ#�߿��ɷi�&;v�m@�
�y�G ����
D1DZ�0�uR�!﶑(��f�_Emm-V�ZUU9/XL��L�t�xr���nF�ʩ�o�D�U��1����^U ��-�O��X?���O����9r�ׯG~0�h$��]
	�`���g�����x�j���A4�>q�R2�$�!��
6���BH�Rf���
I��
u��T�H���s�<�^}�BH���<0�Č�a�'�7<�Q��iӦ� �{x�~�W�'/�[(��@��I�Xs��x��7HY�Y�
���C�1��?��xT	��^��o^�J<��كq��Q>*�S�t0��߬2�J����D��![�DPd!��m�F���[wg��9K�/���yA<%��+�Hx�T
�߇�B���y&@�;d�.���c;q!�[�5BC'"ڛ�m�LX�b�H�K�.�f�G�MqWi�Yg�p��p�,#�k�
/���u}?_0��]�xw�6]�T2
��B���O�"m�PP���ϋ�Z?���~�Q��KA����bYb��
��i�M�̙3���;)�+�L��3��ն��A�Mȍ"8�B~�}8�:DQ�,�U�>�b��(:�$��|"���!������Є�U0 v��ذ��eۉ��ڵ�pZ��k�e��-C�#�H&I�
�H2�ۼ�$H0�M��&`@��i�DKkR8r܀���M�C<�
'��9�/X����N���'7�iB���N�,�
#�{�i������w+V��^T"�Ӫ�G�&-�XB��`���H��H��,�_(�5��}��'�P�G/�������w�q�]l�!�[�YfdR��U5$�l�1����C2���3Q�����Ϗ�<$=�5��9b�� �=��O�~�10�,�g[H7�4E���1x�`6�q�+�h�t,Pm�z`��"؃6	#���dC~'Ғ$��q0@i�v���B��E^�a�2�~Z*?ǣ'�E��HG���Fa+&���w<���gP�do��}�i�g�f�P\c��P��4� V�l*�N�{è�8y�<�>�RK�,��z(�}����0,A#�uw/��w?���"ꕑr>|;���<G��=o#zh+|�\�1c���ŋ'iS��ȅ�!�eBD!"*����
νb� !��O��U#�>��1b���K�b���O�a
�%��3d�F\��%B���G/ꅄaCK�²e\y�P�F�/^�W_}U�����{�g�@7�x�Ƽ@���l�U��0\O�N���2x��*::�et͚5���Q�T
�ţ���r$/6�$ç-�|$(a���|E��t�zr���M�3F�S��ϼ��ko�;�@��}0�bvI�p>�?yݿԄ��g0���`�\���k�С�ի.\���3g����Ɍ�}��;x�P��-_"}�(B�O���2ڂ�w܁�;��q����'P����Y�&=��~@��'����3����LK�{<c�3y�rСF|������.��$��
En��|~�8��[�\rI����?9�|��� 9hKn�+!��!R/��&���M{�G�
2�t������Ω:��|ii)�p}��a�߿����A*��U��E!g͚��S�bҤI�v���lUU�3O<��VI�N���]n�"W�}�^<^Qu�V:z�I\��Si�l	�8�L#�e��M�섇N�>͡!��ۗC������,�����-[�.��c}37$F��\!�|����>P�-r}%[D�oS�$DI�Rr����iY-���6��<R��d^v�7z����+g�,����^�E��v�
��6���[���[E������O9�W�9+�����̙3n 5ʑ��i>&C�Iڤ�<I���^�r�C<��	997�:�c�;�K%���#�CP�y�vș���R�����2�s�C��sz���:B<��+@��f��۝�Wl�y�7�KIEND�B`�templates/hathor/images/header/icon-48-notice.png000060400000003647152453623430015707 0ustar00�PNG


IHDR00W��nIDATx��ŗ#�v��O$H��R����[�fk�Yy;����3ofm��f��j��l���bQf�!7��T��e���	����
)��_Lp}��|��7%��}		�LD��#L]����S8���C�BN�_GR$�AB�3��qt�~�nI�(�2 �e �jҒ��NDp$z�~���c�5�$�a�@�D��]^F��ٜ�(���Nf�W�AȐ�^g�H
>���3�;�҃��ƾ��|DԑfI\���g�����ow��})��������>��S�K!��dHs�9u�'�����͌�K~Z>�p��zF��Ȼ'|��>��?���屿����G�v*��G�YC��ihL�&6���Ѓ����g0f�qq�⌦��*��|���YG������Mdy����r�<�O��J���6�����#��6���m��6ȫ?�o6GDj%6�NY.h��9��I~[�*eWnPzM
��=+��4�F���%Y̎et�)
V3V��1!�}�k���܁�K�]�
���vw�/B[�Wq��?6����Y�&�.�K���3ݒ�ԉ��z�VÂ�?6q�'��Zu^�&�*�[��H�X^�huU�D���O]m �MUEw�n��x��@�l�bF�H���RUR�߾��� Gܨ6�F/��%�<ѡXR_����T9��&����;���7�'E��@L���\���r�%M��*��r��.�o�GB\S:]5s�$p�y"�nJ��V�3���/��v��ԡ;�{����c��/�;�w�P��щ>��N��N#�=j�z���@��-�V���UUr��~�xrw	Ys��Dd��yG�D�DWR�ԧ��Q.�y�d\1���� F]
�'��辨�Nt�/�얄���S��:ۘ��0��Ot�}0�Sl8~�j�.�1Э����ۉX��V����Խ��`��N��V���}{�N.?vdT�
��	;f�V?�'B��ƽe%��2�n���a�&���RN9�I��EO�h֮����7*������e�xē�T�w�Yg0���2R
�̓��<</�D��� GO����T��k���=V�H��֚Donn�ɑ劝�Ւn��zS��XԜ̹X�P�m�E��JGd=��r��
m����3bq([�����Ƀ�e��}	���G��g�ԏz�!�&��~�� yݼ>T
ۈt�_�����?��m�}ng��?����?��'\S.�c"�x���@�=G��TPe@�H���r���6�����>%v��%PU���VۭJ��bA�KzZfG
����}�j�o���α�V�	^�~a�#M�+vF���;K���*��A�ِ����$��ߺ�^��O�3ƻ��cP�̕�O)s]H��U��d�i�7��g�.���{s��0�����[?�1y��#P�2l�פ����/-���3;��%Fc�*��̈́��˩�~�9'oO��;�����^O��nPd���j���$�W)��to�xP�վ݊,�,�:��#�3޻d�$��y`�#cFB@�`@U�gԫ��K�Y^�l�k�5Y�ш*' �X�h��3���2ʂ�`P" 2����Ǐ۞3�����Bљ�#�9�%�#���t]#/ʳCyIQP�A+��ZcuM�Қ�3�uo��?/�o�����?�Q7w�>�}m|��2�?��Y���}�o�췿�׿O�	�h�D��e��s]��xӣ�V�Mf
�ɰ�1F(�#�k�C�L��9.q�%�u
T�ðs��g�~,P������0@Ak��l6��P��̐�#��lq��f�Z���t:�;ۄ5���:���6���=v֣�f�e�OW�մ?0$"IEND�B`�templates/hathor/images/header/icon-48-jupdate-uptodate.png000060400000003160152453623430017673 0ustar00�PNG


IHDR00W��7IDATx�Օ{LSW�{��?����%�e�ɒ,5Y�ײ�FuDݘ�Y�ɖl&�6�P��|N�l��@
0���D�p��@�g�����CZۓ��������s~��OoQ���?�w�*�8s�B�u&���3�PJ�g��RA����g�A‹��}<C|.���3�p��hU�F\�Ħ�n�`.��D���=�a���ۿ'\�\԰���#"��c)wC�����9N �J���Њ��C��sQ7\c��7�6�	�݅�֊웤�fL\�z��(�r9.�X�><i$�q� ��BϢ��}�׃�Ћ��B?N�l;x�{1ð'S���W�'�/�B?N ���M>B$o
"�خy��qY-PB��L#��id�T�q��P���5R��W�Pysn�Z/N �ZD9���?��Ü�B��WG��J�:�8���q�N!�Rt:q�
�C)Q�ZB���>�E��v�;l���
\�e�'p�z($l�qǫU>��D��s��N�A�X�ick��A����~��fs��N���$���j������7x��w��Q�fe���1Ї8qz�*] Q�����2@�ثJ�/h���p��aVԀ��RG���oHB���.�@�5�|�FSB��MjW�u4�kJ8]^v��.����0�X�	�Ȅ���CX���bʚ���?�ك'�	��Mn�?E]"�6l�V�X#P����p�*����&B���%l��t���}PKTz5��������>hx	�j�]P	;O)��>��	$W@���l��X�����U/��O��<v��>����PHp�|T"<b���vO�ڹzp��J1���k&!uj�K��vfԉ�P��>�@R)�����R�;l_���Ȟa�ֆ��
W㰕�C�'�y�������!^m�5�&���tN�\˩*�^���(a��@$��뇗�9�L�'��<f{)"�to���$��2�q��cͼ�H"V5�s��۞�9<���p�˘I�-�t�?���4�K8^��^��N��<�5�u</�w4\`g>x�IE��6���Q����k9Q[q
��M��R������Un���y��ق��<(!VކV,�辈��|͎�X{F��5�@�A$����!^j�dbr���1�+���&�VD�)����4�Jؘ��Df�_B��$��Q�%�V3���U��SǒR���^���*[䐴>p�a2%��l����:&����lqF����M���:x?��3��e�0�,ܳ+��2Y@|~4hL��C�"d_H�m��͘L	�y�&o�Z�v˓lH]@�%i�Ȉ=4��	�� ؚ�&a�����x,�/`��i6�-�Hy��5�ӵ0�%1�������,�+����}�"�}.ܼ+a����k�Ov�N�iKz�����
�N\XN�-I0@")��][i�Y#:^0/�&�m�Y����	��V�N���I0/�U�?I�-Ӆ�����5$�kV��;���`��"ȋ��7�`2��q�5t�|wЂ��{9IEND�B`�templates/hathor/images/header/icon-48-cpanel.png000060400000002627152453623430015665 0ustar00�PNG


IHDR00`�	�nPLTE������k����`v�����������s��Jc|Vp�@[xc{�������k��Rk���놛�������A[u�������Li������卜�j~�t�����������ׯ��[r������ȝ��������p�����������Ca~r��������������9Ur�����॰�Zs�������}�����������c}����������dy�����Ro������έ�����z�������͇����ݧ�μ�ԓ�������ޑ��{�����|��������������]y�Wn����Yv�<Xs�����<Zy����5Rn���w����Þ�����Ut�Gf������፦���ù�ݭ�ֵ��,�J�tRNS@��f�IDATx^��U��6�a�����L�����L�����lz2͙^��q.�2#��u�)h4�������\�r��ȫ@Ñ$��.�,I���*���ˊ�JE����	v��1�r�!VEp;�(�1+ÏI�ō�j���C�x(�]A)Z�rQ�۪[&�j4�KA#��w����0�[m��
ڟ5��>�V�N�oF;(���	�l>����Ϊۤ���{^Ex�v!H(X*�zw�c65_��t�3����#5��
����PbsP�,I�x���L9���r:dZO+ǽS�h�6�a�	����,�&�]1„/���m��]wwj�
�o��V�>bX=$�(�U���6�g��ڼgA����힟'��鄝9��`�nh�q>���v����b��3�!!KQ�]�W��p���C�����‚њ�b�?���P��d�@��k�O�b���;��sv�q��-	{���)��Dy�C+
MW���w��t���x8Z8��Ԑ���@� �:�gGn�A˦$%�-�b0h�Nf�ùY����p�Y�_�΂4���I�^�;�٪���!���<�DWh�N�A��͖ �#�]��sT\�m]������(;i&]����b4"R�ժ`Y/�9������� 0���K��y�	��_!���={ܗQ�%��R�x's��w����%ţ]��Q+Y�'4��£�:��[ѿ}�j�J��^�1{�lZ��
˥I�O?O��)�V�~~kEz�@��	x�
”�R`icTL�_���-9E�7�N���~�i@�Wմ��?[,�/��V�<�8��F�3�`���ٮ)�h
�7.��'��+ӛEQ[�#�*Zs�0�ϕ�L�~�l6��n��7�Z�=>�ܴ��>1s��m��|�T@M��JQӝ@���h�6,d6���mi�t�طs����9��f1��IEND�B`�templates/hathor/images/header/icon-48-section.png000060400000003015152453623430016057 0ustar00�PNG


IHDR00`�	�gPLTE�����������I�J���B�C�����:�;�����޹�����Z�[���A�B��ն��R�SE�G��״��Y�Z���P�Q���K�L��������������>�?���������N�O�����ϴ��@�A������5�6)a)��𚛟������1�2�ٿu�v&[&���j�kr�sr�s��䚝�������J�KR�S���������S�Ty�{��𧬼���)�*��������������ְ�����1t1���[�[�Ӱ���`�a5�6I�J$z!���g�hD�E���L�MW�X���G�G���U�W)j*a�bc�c������^�_��߼��3�4A�B7�8�������)})Z�[�����Qd�eu�v���7�8h�i����������ѿK�L�ӭ�֐r�s������-�-f�gOfQ���c�c���f�fi�jO�PDuD���Z\[���nnr:b;y~���|�~�ܶ���B�D���.l.��LP�Q�Ū���fjg^�_f�f�ѯ���������޾Ҁ�٠��e�{�����Z�[c�d{�|:�8d�dk�kQ B�JL�Mu�vJ�K X!���F�ƛ������J�R��Ʉ����ؘ����������͉�����R�Zout�ð�B^tRNS@��fTIDATx�σ��:���c��m�׶�l۶m��^����>���`�_����mm7���n�:��K�|��$3$I*E�◌LJ3l!SJ�P�ґi)Aw�zl-e�� 08H�/��X�\��C��B!������M]��[���=;�j��,���G߸��N��O65Pa�����~��hS;Z_���+t �BLN�Ȼ��FPW�jW��v'��FYrN'$p���?`	���].׆���I�NgLA���>5��6v:pf��
�� �A��:��:�A4F:�k����F`~9����C8@�un�� HE�����"�ҙy|Ϝ�&SQЋ��K�1OT�a�� ~9�"�V�S�|jv>Yz�Հ)
�ހw��g@4З�o�K�8LC�C�y>�����}j�ĘU`��*@ ��I�����2�/>z��ȃu�@��%�r�S�G

������0Kk��)��AE�Lv�ϚոHC��v���Y|Z*�A+�EQ�K�v��n�x����ʹ�Q=�-��Z?w 8ʘ��F��k)�~X?��A`Ϝ�ݤ��5#P�id䡝/�E�~a+9s�Z�h����ϝ�Պ������ʉ���:hE������=@��p�������~�C`8*�����?m�yS�O�17���10h�0�
���?��|˲4��#|ɢ	l��rt�����_���
�:Ll�Ѻ��T,��LE	D%A�y�]I�ewU`HT%��x�{YOB��c�*��ݤb��n�
��tn0����\�o�
T	��O�}HB
t�IEND�B`�templates/hathor/images/header/icon-48-purge.png000060400000002677152453623430015552 0ustar00�PNG


IHDR00W���IDATx�ԅo�F��'�OXa��]�$�1���2C@�r�\����*<�
��b8�~�y+Y֮!�9ѭ���flG��������8pхaJ�s.H�4��b�������C8�Č[
Wd0�kZ�P��#��p iJڿ�QT9���}�@���G�.H��a�ۗpt�]{�����}�;���XDS��-Q9��EJ��X���`�=mo�ꢎf��ڮs!I
��w��9���6>�K���&�h�=�r�#�Y�y�3���5]�$
9v/F�.�-��1m�5��c{ԞG�!v�>G��o�kr�'�$iȰs�-�o�&�
Gv-h-��ϸ���>��u���'��$

��
�`
v,�D����G����ג�!�_��S�o�M�'��N��:s���͜��ѐ��\g��y����4&O������v�c�.�FCʗs$~+�"�X�BD�5_���0α�QH�����T�S��_0�
Y�Ap��y�^g�5X�ѐ���VD."�l�)ȳ50Bj4C��r٧e,���ξR5W"��=&�ZH���Lo�c=c.���f:�U���b��Ù�
c�'l�p�?�3B��*��ô����z�z�9BHI��� �6ߝf0�肔���`Z�J�%qP��T3�
A.Rδ.� 5�V�e�a�o�Zv!e�r<t%�|��:z�3SPI���g�4��� �`�	Q��I�n�4Y6L���
c?�	aƾ?k3��3``�W�ih���q�AZ���%��iP�;��4�3��!M�==td	!iԺ�Ga�M��d�D�W����;ӣ�4

+kX����wjn;1��́�EmHzy9Ǖ�4
P4a���A^��	8����E�9N@��տ�&ӪG�9�ދ�W>�Cr��ոFO/�s��z4��x�
�-~>�g3����*�Ç�<,GU���O�`m�+S�H������<d�p(��Ì�IQ�x-s���RC����A�P��.�)@���_���wƙ���8�t�/�u�l�di<�փN����)�70>xG���y[<ǚ2N�3@�dN���D0�X�+!y4dx��+�{���자"4�x��ʿ��=��{̤b��RT�����=�/���63��=�{@��P\��Mn��
�/\oZ�j{B&BCy�={����Wn���+�DP�Ã4C����%������������O�^h�svM��H+h���)]�0af]�u�����S���DG ��$F*�җ^���'B��hC�-:1��Zi���ȳ{fc�hLƈ52�x!r��<bƊ
;�AK%�]s����d��-�W	�L�r)�4
d/�?Қ���{�@.��'�_�iØ��ϊLIEND�B`�templates/hathor/images/header/icon-48-info.png000060400000004241152453623430015350 0ustar00�PNG


IHDR00W��hIDATx�p#����I�A�c���a�6��
B��fN1���|�=���|�[�5�f��E`W�䑥Q����=����/�(�\�c(/�(�'�i������"#�~p��Jx/�	��PJ����X+M!K��$��
\���X[@����i<�p��nC�H �Bh@����&D>ߏ��[I�ȗ@�O����Ii�0"DV��L]�5�VA��x8Y����Q*�b#���e��\���0�C����T�%ゲ�h�!h-���Uwq��#`"p\.xl�M��GIy��A)�@5$4�>�3��|3]�u�r��`��U�Jd������W7���/"�Ͱ�L������d�E+�8
���(Y0
F� ���.{�[��)��cٴ�2B�ILj��'y�]�4J;
�߸�8��Q�u5���˒	[�u;�K��2?U_8?�r�ˆRhV�D���'�*:�fz�p}��8)�aBa�f>�[&:�"���I)��4a-l�c��"����S��1W7��򍡱Zc+.|��Dmld^��
=!����������е�4q�Z�v�V!�d}��bm�����V�!#���;�x�Kڛ�y?#��d6���B�֚��|v��(�5,T#�0̺om�㇐?b
�[��wR�n>�V�fQ
X�B!΄�{����z�s&�"#��U�� ��!�/
J��1�jJF��I`CL��&<�RhH�5T�<�2��j�ץ]i�, JPV!V&r�cե}�E
�� 2`%�n�`v7������8
�C.;@q�>>��).�Z��A;�J5<W4�3\�2�|�}��(�9g�"K�Ur�[��kN`♧Љ
�5�sÐ"	���&��8{�)d%/�B]=�����6N�cX�7�t���T�D(�U[�)$�o�����`����5Y&���vriL�lm���4�w'��56�A�ì��!�0!y�h������Ol ���(�z8D7/{�Z�	P�%�G���Kb���2F�i^�7�����1�)����~�C���vz:˾�&Ƅ�y&�s:�\x�}�Q BrT�,XݼLL����#�q�_��1}����ym��ִ&Q����3����ǷP�z0�_|�0V������X�O�hQH��1��3V��!3H_��("�Z�uo��fe8KiA"� >��5~p||��An-؈~P�a�޼�@��bn
�o C��g�~A�v&;�
Hr�RXLJJ��b΀�����+�D�LDW���t@���h��' �"�>�Z$��1V �W�Jy"��R��ҕ�<���g��0rt_�q�B|���
1�N�M��ܔMy�0�a��.���i�+����5��\ˀr �ק
Hg�(U�`ÛV�J�D��-���5,�5$�H�La�d��g�v �c�a��c�߉5t#30@�F*��|g�������Ki����(�����7#�ݘ~b�>��H�|��5���kV��T�ɫX���yI�P�ߏ�1q��Ǐް��^����?��x53��Kщ�� �03{����[Qf}�4;5��Q.iLeD`�T���x�
������{6�v�ѱ
��b`h73T/~R+Qj=]P|�b�b��Rr}638�f�P�"j3HX��@B������r�O�ׯKk��3�dG�(J3��a���w?�#zB�؍i�ϧG�j� �F�beI���,�zֵv	�
��]���A'�y�#�#6�����2�9�t�&��0�b�E�����vю��g���R
��T�6b	}���o�1���[�Ӄ��8>K+��7��T֨��T@�M�����_�o$* �^�Ԅ��N]�qAipR415�Z�	�je ��B�I�����/~@+����e(�b<�(5^י�!r��(���O����Lv�z����.�[�t�I/]��kgy�
��@�(��j��! x���xu]W��ę�e`�[x@Rm;����b��:�����Ҁ�K&��&YR�}�@��v�k�le���T���߶=G�5u����}��.P	�߾����y�¿��P5!9�IEND�B`�templates/hathor/images/header/icon-48-print.png000060400000005217152453623430015555 0ustar00�PNG


IHDR00W��
VIDATx^�k�\Wu�k�3�p���8v�mb��Z��@[�F�$5����B���VT跢&H��6���"�|jTH��
�4�N�H'q������s�^�������D�^�B�_Zs��g���k�C#��O���j]�
p �'��y��V���
�1wA0A�9���
��b�z��;?t�ǟ���<�3��ӏg���f�z\�sx��A�t��=N�x
	#�t����z�����o�n�iy^ x�.^�_A��(x��/p��K�
@�ˍ�З7���]1�~>�Y�X䬛Y��3��p� 9��㎨#�+P?s�f��\�|�����(B#1�[�+	Чѯ��/�F�J&k5$�
�Ap<����R�l���mǢ���z����xEChvv16�:��2��6C�qd�`~n���7��ɋǎ�ڹ��ed�ӑ+
0�Y��j�]\��e�
~"EN�ՠ�뱸�%/�`�K\�X��D�=�h��z���T����͘�[��!ta��NL7�G�P�^�H#I�1q��̴��Z(����.�p�;\Y�����g;�B�;	(݈��
ꎋ$0�5�%u�}:�e�X27������M�E��f+�fp��^3]l�憗FK�"Og"�XrX�HκWYH��D�0�ժ�+���ػw��z�K]s�����F���g~�����տi��ؽ{����	!��ظa��|�;��
�,��+�r��YЪ�y�8�%�*B��`�%���)�:�ώ12=�f�-?{+eQ���A���?}�����~xdl"��'�h�;y�[6m\#f�3xo�i'[�l���O?�KK�8Te��Z9�"*��F�����s�-��w�{>�`�w0��>]:�{�}ǻ��
�����۶n��0s���h��lB|���…�(��T�0-\����u0��"	j�f����]`��;����)�p�Af/�v�������~�!��3����{߾)�e4k@u����|�Fp�6���AR���C�hD$`n(��T�N��M�YӞ��h&���ꑴ��O��%�c�X?���*P��D/ +�����)vﺑ�N����C��D_��$�S�Cq��
�SRh4w#�e����D���g��;�����<�w���N����;¥r��I�ū,���"eD̫��	� ��"D@p@U!��0L��"E�'�T4�u��=�c��eqw�Q'/��1&�Mu,/�cD��y=E"o,��Y$C��<�r��jX,���j�˽��.+�'��F�GTYUY,)cA>�.����2V������&��:�ޣ1UN#n�h�h��be����Q��(#�g[���0p��`%�0w܅��$ �j��%�wǣ#U�ab����kY����8�R��ȋª�(�@F-��u�r�P�(���*��`0 /rV�@��, Y�a�**
��hUQ0�&&�;C���l��AoP��j�����F�A���>���}dY
�՜�}�
�Y������1�ԯ:@*^J��q��D�%Ǐ�
��2 *�,����2�Vi��VQ�DT!d��{��Z���j�0<��#����C����*��
VM]"���`"q����F
!�����?J�3ǎ�w�v�Z�|�5Skҏ.�����$͉&fq��8���v���۔s�*ADP����Hr^0,:�NP'���)�m,F�O��P�}p��1f6n����@���}�)�� ݋7�w~1�
_�Uݥ%�8�>���qQ�|��@O`Bi�ԅ��dA���:�bێm��������Agf�s��α~f��8���goؼ�Mgm�c��Ak�~��K#ӌ��Iv�.޻�y��g��PB�
��;�L7�,��q�-%��|k> '�ܙ3|����o|z�.nQeq~��_H�-w;��N�ڱ}�(?����P~���6sϺO��I^~�8Ѭr�i5�4�����qj����  5��ʑ������9������۶��'N@�,7.-�W�����/,Й���w
�8��/'�!�]����caa������k?q�S��_���?s׍[72P��gGp52	�,�/^C�;��3wN�uX������`�
3ܺ�V�ڛ��S�Ck�EN�|���ڼ���Jp0�={����>˾}���
)i��y��S��g_��Cc#�p�k��Ձ�����I-�@2D�TA��Te��4C�Y���vš'��۷��3��KTv��AƊx3�K ���'��M�Fi�2/S�^,�,Һ�K}}DTPUB�e!K��n	4jZ��r�
C����@h�H���Q��"0u�	$�@ѬՈ�),��`QiX-����j�q�čjH�eD�eJА������E��;#�*�ƔB*��j#��X�,�Z+ #V	��F��+G,��r �L�]����WW�\�_0�b�'�IEND�B`�templates/hathor/images/header/icon-48-plugin.png000060400000004244152453623430015716 0ustar00�PNG


IHDR00W��kIDATx�혋oS����^;![�uݼN��TU���J�ںJc���[�nhS�N	�B���%�a	����$��(�&!�?��k��s�FWN�qB�H=�G�Ϲ?�s~��;���臘D446ꛛ�M'��L<�g��������҂��a�##�X~�ϝ����8k��6�!���4cr8��!tb�!V���TVT~23�1�N�A�m.���̱�WWW�jjj�fD��)0T��A8��p8����5̬|	Q��u5�G��5$�g�|1��̽uu������oc�o:^�d:�=&o.��������������\�%`]��w���[{��c�o<t�t������;[C�����qS$�h���i�D�� �	;u�T�F,�f�ł˗/#����������s���'��!��ثu�z���u�8����I��\p����i}Z�i��.�]���lUz�}�1OF������b��')p.�{q�U��Z�׬?���.�c�u)՚c�߲y3m�m�h卡3����<�5p&���'��]F8�$��\
���ad�C�Zs,򵵵%Q�>�6���?��b"��|/݅��X��}O�&J�ZFhN��;�\[�"}��@c~�ݵ���'�:�5t��P��~,�j���C��ަ	Cc�ڶd��;��Ez��e�S(��5f�
�G�'�����$��H��`�b�c��$x̚0�I��c���������Z٢���C���1C�9aB�_���T-aߑ
_}2mMq�K��J�'��"t�M�O���ku��T�+�ߔ��k�nL�����N�wo
�[5a|4��I���	Cci�p����|m��=����R^oCb�?��Ws$�=����R�[K�fm��X�
|9�Gc�;���x��=�:�d�V!?%��%=��i�#!i�|M��T�S�
#����[�04�����83^˯Лš#�u�6p�=)%t'�;7�𵑐���ۉDF���nfe�0��=T,N�~��0��a���v��DY�66O]����*���8��;��$<$G��4<�>���v�ų�R��wQ'��`�h��u��	�̾&-�]K�w�+�mCɄ�#	p5$c����J-V�H�Ł}���
�1+�(��$��X�6�/�J�^y_3��u-Л
����&*��۩�H��-��"qWj�S!�?��V�Q W�`�
BC
�%�-�jcv-#�������;K�?�.\�S��[Y�s(c�Lgy$�-�b��4v�wg�*��	�Wj�o��\�E��N,�…���W�_Y/�ĭ��;�'�oW+��t�~�w���Z8�b"ptX��gQ������_r�hK����M8��,�Y�����Soc�B���.L���t���c�����H\�Z����8*��ч�6��ܩ��[�d��Z�
>Kt�o�Bmb�7r�љ5]+�0T�����Ϲ����ܡ2Pgi�Ydy����n��?�?�&��
��K��ҧ��$
�����|�1�Um�R�|�e���T֨�;��.��H��7�S�_�g.}����0����B��p+�'�}�&[�|}�$/4�-����4��;9:���g�s�<�΢>�1J2��X>x8����K�aݵ)�|]�Ԙ�,5`����2ng��]Y��^����:�`1��{,��OI�5����7e�?��VI�]jx���E�̫p��+t��s�`]���E�R�Y,FL܄���|�%B�Zz�1�Wh$y=)���C��|��=�;����V�#���vJ@o9���ŶeS+9��$��k�j�`�~�V������u{����ù;w3�'¯=���^ö��ҙ�-�`-�N|�Z�U�7�����Œ�0���X��E8�e�Y�HۆV>��Ӄn��z��,�L��7���e���m�P��H�D��p�攫@ۦ5���O"OH�ֻ�1�d2����<U�P��.�v#����
����w���R�6�J�'�8P�̦C��ҵ�AK�1:yeP�1�P���R~&����+����|	m�$?�A����$m�O7�m�q�1�G%IEND�B`�templates/hathor/images/header/icon-48-user-profile.png000060400000004241152453623430017031 0ustar00�PNG


IHDR00W��hIDATx�p#����I�A�c���a�6��
B��fN1���|�=���|�[�5�f��E`W�䑥Q����=����/�(�\�c(/�(�'�i������"#�~p��Jx/�	��PJ����X+M!K��$��
\���X[@����i<�p��nC�H �Bh@����&D>ߏ��[I�ȗ@�O����Ii�0"DV��L]�5�VA��x8Y����Q*�b#���e��\���0�C����T�%ゲ�h�!h-���Uwq��#`"p\.xl�M��GIy��A)�@5$4�>�3��|3]�u�r��`��U�Jd������W7���/"�Ͱ�L������d�E+�8
���(Y0
F� ���.{�[��)��cٴ�2B�ILj��'y�]�4J;
�߸�8��Q�u5���˒	[�u;�K��2?U_8?�r�ˆRhV�D���'�*:�fz�p}��8)�aBa�f>�[&:�"���I)��4a-l�c��"����S��1W7��򍡱Zc+.|��Dmld^��
=!����������е�4q�Z�v�V!�d}��bm�����V�!#���;�x�Kڛ�y?#��d6���B�֚��|v��(�5,T#�0̺om�㇐?b
�[��wR�n>�V�fQ
X�B!΄�{����z�s&�"#��U�� ��!�/
J��1�jJF��I`CL��&<�RhH�5T�<�2��j�ץ]i�, JPV!V&r�cե}�E
�� 2`%�n�`v7������8
�C.;@q�>>��).�Z��A;�J5<W4�3\�2�|�}��(�9g�"K�Ur�[��kN`♧Љ
�5�sÐ"	���&��8{�)d%/�B]=�����6N�cX�7�t���T�D(�U[�)$�o�����`����5Y&���vriL�lm���4�w'��56�A�ì��!�0!y�h������Ol ���(�z8D7/{�Z�	P�%�G���Kb���2F�i^�7�����1�)����~�C���vz:˾�&Ƅ�y&�s:�\x�}�Q BrT�,XݼLL����#�q�_��1}����ym��ִ&Q����3����ǷP�z0�_|�0V������X�O�hQH��1��3V��!3H_��("�Z�uo��fe8KiA"� >��5~p||��An-؈~P�a�޼�@��bn
�o C��g�~A�v&;�
Hr�RXLJJ��b΀�����+�D�LDW���t@���h��' �"�>�Z$��1V �W�Jy"��R��ҕ�<���g��0rt_�q�B|���
1�N�M��ܔMy�0�a��.���i�+����5��\ˀr �ק
Hg�(U�`ÛV�J�D��-���5,�5$�H�La�d��g�v �c�a��c�߉5t#30@�F*��|g�������Ki����(�����7#�ݘ~b�>��H�|��5���kV��T�ɫX���yI�P�ߏ�1q��Ǐް��^����?��x53��Kщ�� �03{����[Qf}�4;5��Q.iLeD`�T���x�
������{6�v�ѱ
��b`h73T/~R+Qj=]P|�b�b��Rr}638�f�P�"j3HX��@B������r�O�ׯKk��3�dG�(J3��a���w?�#zB�؍i�ϧG�j� �F�beI���,�zֵv	�
��]���A'�y�#�#6�����2�9�t�&��0�b�E�����vю��g���R
��T�6b	}���o�1���[�Ӄ��8>K+��7��T֨��T@�M�����_�o$* �^�Ԅ��N]�qAipR415�Z�	�je ��B�I�����/~@+����e(�b<�(5^י�!r��(���O����Lv�z����.�[�t�I/]��kgy�
��@�(��j��! x���xu]W��ę�e`�[x@Rm;����b��:�����Ҁ�K&��&YR�}�@��v�k�le���T���߶=G�5u����}��.P	�߾����y�¿��P5!9�IEND�B`�templates/hathor/images/header/icon-48-contacts.png000060400000004721152453623430016236 0ustar00�PNG


IHDR00W��	�IDATx՘t�����eHj�I�����233o��{����������X4%Cl�TgN�jEN�>��\�ؖ���_�;t���4��, w�T{�_}%���#RK#%>���K�@}�2�Q�mF�,�y�B>��V H" ��ls�YcĶK'�o������}Ʌ�o��u�~�{�=u�f�����3���m�-�T
���!kI�Ru�����ۄ����$QS����1�1 ��׺�So��Ɒx%����w�1*�:�T�c�k7d@	��<y�Ɩe-�u�Sm�sAS:)��.5��+/�{(>���|����n,�'����L�z`��@��g�}�^{�y����4Mv�꽎)koֺ�b#Ň
d{x~���lU�>H��>���q{�g=�# m���g��,d�"�db��R��g@��F�B�Yg�u��)S��!Դ���5�	��g�9ˮ>$B��x}�#ȾG�!]WD%�d���V&m�wD��Z����j��@�Gܲ���h!��^y�%��곁xa�K$v�z�6Ò�^�3���~��S��D���%��HBݧ�j��DY>S�E��SGVp��z��_������e����2` :�������7�x��;��Q�eU� �3�	Hb3a�#*hkI����tׄQ,�z���.�L��-iN[�)�a6 @T/������؄��FcS�㤾>�o[�ۢK���5��C<G�]��}W������-��D�{e�5	"&<��p^~����7@�x��^ު��@B|�\���3�w��^	��1-iI�>�%&�hH�QG1l@,|�#�r	b�,��`�����oe�m��ګ�bs(��X;`��]�Tx�z�ǧ����‰, h����i�_������?M��;��}��C+1`(�Ax}�����ԢT�~–�DŽ V��%�����.�7I�ـd�ͦ��1��6Ơ�����^d��� d�n��������-�c651��&Ӭ�@��I�ذ���oz�m�\mX���I�t#{=�.0#�����$րJ�hE��>ѝs�v�yĴ���?��u��C��o栉�u��/��˼�$:��v�~�t]O����\�8��y�Ynx�\%���,�~�̈́�M��ۮ�|�Y�
 ((k@[e�UFn��iö��9���1G��*d�<�	��l$(�/��L�p��JF@eFF�{�[�|,�H���������1�c��]��J|�%$o���o\��L��M�3]����́����C�y�7~���@+��<���$ ��2,�(q;����jA�O�1#kQ��9z�a,�k��w�iϘ�A=/���:`+����֥b�R;�T�F�TS��!�`�Q͔b���|���GӲ>_�i^ɳJ|IH1�4Z����
[9p�j�15kJ<�S��X�!�ʍ�L����wfpӻ�=�JA1Vin�M�%���������8�Y"�G�j��ۺ-��|7� ~���lg�!��!��?�����R{��8�����j7�G��2�lfn{�jmZ:��;�/�,�B�%�6+Մ�'K�g�V/4�Є,�ތ��tk?G���s��m�͹���5M\�u}xʲ�m�{�}���mhL���0�C�XH$�X�I)V�-�^�\��Ū��׾�X�$noo����D��(�&nO���d�b,]�B�Bo�&�T��?L� dG`����v���\w�uO�r04��M�$F�ZU�NC�����CbJDO��b��'� 2Q��P
O�ii8�2a\7z������\5W����-�`�B��հ|T��%˥����������|/s�R8��2}�	�xBJ|�k_��o��P����Z��0$��:`�,�#(��B+k �X@�FeD�b�k�(`.�m �JY4 =M�F�6n�QF�TTFK��p��5_����@z�!�����#���?ސL&�ݪ�e�<�L���y���6�)�
��`���ñ�L�4����oD�H�}�M��ڴ�@��P\R���u�V.�[����+���Ԭ��z}����t��L�9�"��W�xG�_σ�x��~6�Of�m�J�5��M5���P9 �T:U~G�z�~}��c��Jx0/j[�*EPX2�s���_�du�D@�ȋJiL5�8E
�M�6��c ��/},��e�7�[�M�/�~ɧ׾8D#�-�X��cצm���%j���[5H�r՛T���+��KM���&Z�1��%7�*��b�QH���X\Q��
�Tt[����R���PP��訳L	/B9;�)��4�cA:�cN`�q��\�y��(*�e3.�|OIEND�B`�templates/hathor/images/header/icon-48-jupdate-updatefound.png000060400000003121152453623430020361 0ustar00�PNG


IHDR00W��IDATx�Օ�OSgƛ,٭�O�b56��6�3F�\l[2=3qN��3����~���lN�dTT7�s�	+XȔ:
�P��KtP��g߾[����%�|r�����9��T6�d/�&&,"z���KL<&ӵЋD�E��M <D�9a�X�(�!��R�9��#J���H�"�e��1�w����=�c�N�ϰT��\)p�jػb���%�[OKUޑi�q
MB*��qWz!�vZ�ֆsƑ���?>�x��j��@�`ߴV��)��qr�"Ћ�	�f9�"?x��A<m\�8r�ÐJ*΢�����9��Z���.u����1��布��j>I}��8�� ":5�Tb�;�T#�
��q; ��Ƴ�G��F&�ҍ��5�m#e������.w����߇i�����C␊:{���!a�׆�Ӿ�l��?6���>�t�
[��(iW;{�(���C��W췔���}Q�pg[�� �uGWD�|�	�D��s��
���(֟}l��9�Q~b��g�ٜ���BS0Ї��z8���5��bl�($��ra�c�'�zȵ~P����������֟:`�'p�F`E
H�5=OΑ�#C��1��	��#HM	W`��[8�hҔp�#�|�]8�S�0����ؤXbr��&�\Ne�=�G���=8�o�0��-
	��E��9��3�Fa�����.��7���ZҬ�s7'�%����q�G�����0Ї��=�ݏ��Ix�bP��*a��?}8���Ё}�|rk;!��J��"��}C�96υ�e�'`�=DI�I']�c��;�s���	|��E:Q�\O��$\�iZ�3��oB}8��
ha9W�R�_�/���xC��)mT�y���	�-���	|yj8�A+��	��;YA����鹟�wz؜޹��n�^���r��{z�J���%�!�u��(�d�@�q=��D�'�Y)x��Jl�vv�������	|Z��g��c��rg��O��f�nG�-ؾ��}�m��=�U��;�8z<R�5D���e����M���H��WA.�`^b1 /غزؼY	ݏ��-�M����C����b9s��K�`�<l�dg�QX��80w����e0�#EP�V�
.���ձ�T��������X���J���e���׮�V`͚4��v	Z�/�\z���\r����t%&�g�W+���\���������X�;df/��d�n$Þ��re�d��b��Bb{}/�b�|��]���F����b���`�
M-]:�Df�k�˖����3���"k�QĩИ�<����0SU%\��W�\�B`!X���@�lVٹ�'�6lP��32��p�L&y�XE��\�z���JuQ�$�T<�~�I�%$Hؗ�ne����t�+#��b�����lt��h��d�Z�|�^�{f�=1dž��͒�$�I�����pS�:*�k;�� <��O
,:j�f���A-T�`2���j6[��Ϝ
�hn�IEND�B`�templates/hathor/images/header/icon-48-static.png000060400000003310152453623430015700 0ustar00�PNG


IHDR00`�	��PLTE��������̵�������씔��������٪�”���������˜�ϥ��X����Д����R�Nj�ԗ����ծ����������Ț���������ťd�����Z���ίp��K�ˎ��c�Å������ۣ����֛�۟ѳt�����ZԵv�˭���۽~ɪi̬l��羾�����ě��͏���ŕǮ{����������f�˓�ؤ�ͤ�ۦ������]]]j}~׸zþ��״�ܽzzz��u����{���ػ|ƪr����Ͳ�۩���~f7llk��֥���Κ���ħp�Ӥ����؝m���k:<n�¥kbpnttt�Cջ��Ի��a���о��š�Яǿ�����ʨ̶�mX.]v��Ƣ������8f}���u��ɸ�=q����{lSfffOW[iU/�����Hy�̵�δ|��ψz[���<��nz�&SdHegv����s$Wk��l���|������i���_��M��A���q?JjlW�Ğ��ƽ����lbLH��;agtpf_vx��J�x`Joq\su���ø����w_3�ŌPljZoo8iw���Ai}n��ex�dz|{}���K���]uwsrhNl}o\<���p��^aR���ֵ�Sf`���C��t}��ʗ�����˖~Q���6��ywsbhjxm[���x������κXqm?q�crrMMMs\1־���~�����G"[t��p�߾nw~�zlmeT��ѣ��ztf{c5���w1�otRNS@��f�IDATx^��S��H��M�شm�ضmsl۶m۶�O1���+�tf�n��z��}�̉XU^n��+��R~e���FG0�g��������922<::ZSS���dr�l��>���s�5����P~���pM~ns�T���슮��;6��~ߴBpsO�����G������@����[�͗m=2�,h�nhhٲ��i����p���i�ժ�{�y���-X�]/O������Y�)��
�N�3��3p4�O��L���u@aj6^R��7cr�а�g�5OQ��У6�����!Q����Ȣ"EQ*0�j��+|Xb�	�
@@�eE�$N�fP�&m6j��0��(}�����6[L�ր��vRc�v��
Ȅ���
&!� 7���‡9�9;hBK��1�;\.�^;�o��5H$�{nB29W��#x�	��f�R2~<a0�¢V46w���dY�jGe��}����(�)Mq�����	�����0��(�N_�0�:�q��L�#�O~��D&���Y����f�,UUU��2��_����,��!5���p�$4�K �Lpz)`8�����.�|���Md�7(p~$|�8zM��o(�	�)`�Լ7�$��?��P�,.�W������i�^w�J<��M�P��U�T�ԃ~#N
"�P&s-}K=C`�3�p�W�_�wd'ϵ�
��P�ѩ�%������/<~�"�d�QᾍQc�)_�0�ͻi֯����腗�x��L��4γqB��OO~�}��y�E�֮�����������d��,���o\<q��/=�i��]�ҽ��[\F��	�{�.+Z|I�`1�]�}��������%m���xO��j��bnM�o�a6&(x��Zܟxֶ6�?>x�����IEND�B`�templates/hathor/images/header/icon-48-calendar.png000060400000004027152453623430016170 0ustar00�PNG


IHDR00W���IDATx^ՙolg�g�'N�m���Җ�6M�Vmb[�"�0X74J�h�$$
��4�����A�]�������`뺬i:hI�&��ϱ�b�|w�r:���v��f��t�{~��g�V��|���G���2t��SvׄuH�$�X�t�e��t����,9������E�G��Kx��#O߸����
!�
ו�i�����V=����=̡hl9<�XKm�;냄�
�����k��n�>��=Q����[*�̈�'a�������OS��ʺPݹh��yY����`D�L�8����B"�DQ�L��uA����y����a� �h��!���3L6Bm#ך����� ԘnY���p��&!���I�/��@������{/��[�ZcE���z�����?��1��p���j�SUU������T/'�l^���(�eIh~KH�s&d�0r9S�����Ey���r�@��D�_tݴ��/���غ*��[�p`�1Ĺ���u-\
��3.��Z�k����@]E��Ua�4M������Ⱦ�>�P���ǎ�щ	Y����s�1��K����,�D���i�~~�O$)\�?��9B8����Y=�<���X�Ekkk�@�J&Sr�2)j!���"�{��H��h$�/OOq�_�/��sS/]L�)�6��f��A��ꏦ-���I�}y�G^��g'c|��(w�`ݾ��ݟ��S&��F��Z��N���1v�5†����0	��R�ॅ�U�ʫL�M҆Ef&r�E���&�_�[[��QG!�Nd���a{n�(N�3	���/o��R�V�ѷb\HdIfL�g�6�eK��W"l�ʲ�}9��CI�r�9)9���gn^K)��
��
���<��t�I�Q���5&'Օ�y G!O�c�
��?�&O���eQ���x��`�pS���q�ݴƫ��zc4cN8�K	��<|ϧ�y����#�ѳ�\@������w����Gqq��]�زH�B��G��U��y�u�A�2*T_��:��Q�ަ��F[4���M�җ~d��C��\��9AҢ2�ń�T+F^ 
�v����%�E2H �Wl�j#ŃM�G�^��Y�P�l�m7T���]!G�6W�tt�Rv��M�BJ��M���si�~��$���sCC�kU�+�-@�l��O�P
aY,ᔪ<�)��'4'��F�G�'Y�zc�k��&�x<�ob�t_�"��eF$;��\��尼Xb~�����X̬�D�1�灻���fGF�Y_v�
�d�;o�޸E$m!�=u|h��ֆ�h!˲MK����s&B�Q�$85ʷV��uӖYs�2�?
���rX��L�SQ�༆��t��{�@��Px�&f6��kj¼l��������Sl���1�G3���pPk�5j��K��"�=��J]���
%��H�Isf��'�h�����QSS�Z�����O�K�?�<�@12l����iz��yY���a��o'/$�n��1aW�-
0�Sy3���2�����[c���m%LO0Mc���0C���P�|��&#q�,��_�FՀ�f���+�O�sK���w�用�7�4(�#�AړI�����Y�\ܞ�7�a�T	�,˅Ʀ�������V�����ƿdcC=��s��}v�=��V �ɐ�U��p;�|w�J�R����.UUYLL�bX��OQ��9]�;<2rsSc�ͪ��b �i���=_��Ł2{���?<W��UTt���DV���Ю��<	�(J���@�S9_q��L�4�
Ĝ���1 
�A	T���$������5�r�Ӏ~�&w���@�*(n��x�%��cN�I@���
�SN)e•*��s���	�=_$*3�z7L/����&Y��#�pq�­t�{Ȫ\1�
^�őp���h�,*����I-GdF�6@IEND�B`�templates/hathor/images/header/icon-48-send.png000060400000005243152453623430015351 0ustar00�PNG


IHDR00W��
jIDATx^�Z	l��fw�k��>����
��0�)`ZATZ��*��FH�GS(

�!@K)MS!�^�-M��4V���#��&��c���k�k���=���{�x�^/�ڴU>��{3ì��|���A�/ÀO����m�y�sF� �y��40���H
���E\�>����I#��)$E��(1�C�%����)�a[�n�?r�Ⱥ�Ǐ�~�…3�.]�|�ʕ�����ӧO��D
�l�_�j��4��X�zu�ԩS'6,'...;2225&&f4Amm�;+V�x@���פ�S�Q5�4b#�͛7dɒ%nj3�j��EEE�����"�F�L&��ftuu!�ޝ�Q`��h
P�>O�,v�޽�322>GB�ɫ�l6��A`0!��-�k���b#����Ht{�u`��*af9�#�餱c�N���MONN�F,�R`(��
$�2I0����/�^�A��V�cD(@��X)�/]\\��:���u����rrrrSRR&���'��ޤ9S��7}Ј��Lj6�F��c͘�i�Ĵi�rȀ���5`�q'N�ؑ���2B�E�Gٳj��]	�x~.�DV�W�Ga��x\��@Q�=�vz�XHdff��!�/�6 f���KX|�<%��Y EhG�z�ڹ��Æ|9w8��n@	p���)#F	"�m
YG�9C�a���RS3h�Bb|>"ތ��a��<����8��j�"SL�"����Ҁ�B!9�=a�gn�">�w�����֌��n8�$$$d���n���~�Z����ۥ�8L����6��.o��S�Ab�ʕ�E
�TWW�@��*�M[<����q�=T5w"�fFVb$}1bD���u
�.^�h�z�=���"�:�4��.���������9�RHۉ��$;Oz����V�*��5b�h�l�	�δ�|OFa�С#5u�0�m�D
i�{n
������0111S׉�hoo�*�ʈ���Q�p�-^�s�F��щr-�u�'555w!�����~�]���I�O�����{dP�Վ���&CWț6mzV�O!:L�@�
z@OU�6C���A��&�ۢ,<��A��#�E�'� #��0��!�%	:K�k
�'~b/���z��ʚ&ܱ;��E���On�b����E�G���9�q�H���� :��d��ʪ���6��]B�,dU
�^��H����upP
٬fd�%a��8��E�
�!�(.��3�Yhl���돗���8�d�Jn�G�G7�yh���XrT���ىz{{���l~�a)�-~�ǤRn���ަ�*S��aos�5��O�V�Û�b��v��I�k}��>Y�J��K�;Q�4�yq%{��Ri��T�`��rJĺ����t��Z��H,�4럟�U�'�l�Kسr!G�n�NdQ�"
�=��4�yF�Qj���Sw���YE����өp�dm^��U4�@·5�d�/�q5�A��/�7�Nd��8GL%���4�����V��.q��%ڈ��16��^OQ�������ߖ������w5?W��c�]B	�X@6<��"��+�5
Gii鯩��Dt)�q8q틎�;�N\HJJ�L�)k�`|z�Z<u/l��:��X�d:N71E��g��i�<�����G5�F���?���(nZT\XX����� 3F��n��)SH�9��
�SI�R���$�ƽ��4�Q^�(��e�"�|�Ji�pb�2�n��U�< �=\Į �
�汋��k�<9�������2�Q�$b֡C�����=BZZZ����<�^��8��+9�������}��B�����w�֪��4�xO���=F$P}/���[���f��':Q3�N���GC��B��=9��Eԁ�~�a#�+RÓFX�I|/���*��[�>�9HYq��pp˱�SQ���k֬Y�v���@ߊ�ZW��1�<dg�^�����_/��?��B��K@��#����
�BE�"ƪ:�{ P13UB�҈���s.^�|,=��[1��Ȉ;}�"�2��OѤ�����	O��LzO�Fj�x���f@#�v�<r�t���*�S�a@�G
UE�`(n�i�4B���0@l��F�D�H&y�E�yH���q���E�y*���>u+mnn�5j�D�j���,R��`��s[�������)�/�ip���
�/=uuu�s��ԕ��ҳ������Ɩ����۷o;._�\�����#��7�"���)�� 2�����o�� �5�K|r�̙2�Q����Q�R�v�mv����tvTTT�Z�_���E��Q��8xvh��L�����vy�7��K���!pj�tѦ�a߾}o|�~��q�\n�������B������ϟ�G�`�e��.���X�iS}�\#�	�^��]<@@���b�����j�;V�PI)TC��_R�~Y�Έ�,�kjE����r=����&�F��AP-R�~�XI�NepG�U�$.\�ה7S�� ���G��"\��ՠj�a"��t�#1���y�`=�z�$E�/4|�m�B��.�Ut��S��W����ʧ���z��
U�IEND�B`�templates/hathor/images/header/icon-48-checkin.png000060400000002723152453623430016024 0ustar00�PNG


IHDR00W���IDATx��{SW��j�*^��?��V[��a����ʴ����
$@B	L0�jQ�D���E;��KՖ��IH�!��~���nvv�f�
j��yf����'gO�	�?�����x���c�0�߈�ґd�������9�!_�H%T��C;��~����Q"rGv>_D�P�P�8��4'�䣯��q�����U��|�R�ʃޥ�z({��Gk�u��i��F|S~� mhY�A?���E�/E�p/}���d���{]� ��S���>F��A� wp'��{}��@,Q쌇ީB�3
�K��C�9��)���M�*h�w�D�c�7�k�U>#_�Ȯ��m��_	m6D�u��ċޡ6����>�0�N���d��"�X�K�=�w�N��J����C�#�D(b�Kx�!�'���h1Eȋ�7��
r{v�ھ,�rPh�F��c^��0r"��Ֆ�E�n$[>��G^��˞w�̵�$�m)��(!�#��^��_��q'd�e�0Rc��?��ԑIw(.�g��3�"�	�|6��x�r�u.���(�E[���8��R��&�15kv	
{���4��q�Z(|Z�&ѝBKt�rTi��X�}�˼"�X���a�DE�Y��}�(�����.CN��\�]
Ńo�H�	x'�$56E@g���Ȁ�=��mwnu�DF�I�
���p��(*s}�"Y�[��n�X*e��P�,��t.'����t�B��ĿW���PjMBeo}T�G���~2	��o��3i��t%	D�ˈ��	D|�rxCضG�E��e����=t��s��{;PcM��G
U�6��h�K)�WsM��5�-˽�ܶ��h5!����Ne���פ֒��{uD���Ho����s���g�ņ�+�Gj������VR3_ѕ�%G�����-d-�
����)��J�նZJ��EEŃ$]_���
8�Y,|����$�M����u+j�ӡ5�q�Z0����J�Z����&�
��GN�V�6�Im~�-}?�������Hѕ5x*of4��h�4��_݈��k���(�o�ܝR���H�����o�C��S����x�W���F� �Cۢ0���|d\�m��C�$&?�|�����c�)���z�Gqi;�ZKDL۷�x0��m���=?�a
���Mz2ϠS�AY���m��u�8��>���0"�)ޡ��0�"�a�8���3��@����3��g�=gg���g�����g}�����PE�bDfS�a�K1�b>ûh��vs�� �oE��O���GÑ�Ѓ���B:ǣf�Y�D ��8��d��Y��Y\�#�>�(Wv.#<ۋ�t�8
s�)<��d�a���=��)�
r�8
W�^&<�,l����]�ss��2l;vw���0\޴��	���]�IEND�B`�templates/hathor/images/header/icon-48-assoc.png000060400000006662152453623430015536 0ustar00�PNG


IHDR00W��tEXtSoftwareAdobe ImageReadyq�e<
TIDATx��Yytչ��h�lٖ�x���8Đ�f!�4��Vh(M]Ci!im��F9P�P
�x,�cy�Z
�@I i�C�&$q�;N��lɲ�m43��l$[�h��9��|�ѝ;�~��[�AUU�'7��'���1-],D��)�~#WW�E���������d�)�	�C�ө&K���-vGT�⒴OD�c��["g��yO��L�/��m�Ku�U�㑰|]@RM��~�~;*��i�f��e�H�_�쓄�JZ�8?��2�[��
���Io�L6�=�z@U�4���`(��^�1��}�X���M����N}�^�VV��I��b;_/�Up�,*-<���4�Np��>ԉA�$Ip��Pe���"S[w@���=���Z����Y���|#_�~i�W͵�'�<��rw�n	�$��(�Ĩ!\l����8�CCCȴnMmQ�_�������Wos���4[]ay�D_�A�Y'bm�	���x���86.�bi�a�{3������ �rJ��``��@ ��
��!�V��>�'�^;m���YgHZ���H����v/���6�Ť��]!!gw�Oh�Z��f~?d�
gi�Ε�τ��\��A�Y��=�:
�XYi�*_���B->C�����;����3������ �O�3A~�###����>�Q��c�͕K��^���g���q\Xm�/W�`�Y���@�YB������`�q���6��o���Nc��srv/�"wz��o�k��u�\�r�lr�Gc�,��C�bx��(Z:<��2�@��hae�7�k�-K�Ql���'�H������3�N�����܌O�V,\���=���
9pɋ=��&4^tN�w�.dž��0�.�)�����1x�ݍnw/wz(|��HP�$�����b�w��|��d�Ɨ.]
K]30��nFUU�� ��k?�;���N� <WSI�<�2�͵�:_�k�
�+�k4̼����K2��2���*@ND5��|���]��#����:����d(e�a�7.�:z�|/�?�:��:��14�6��+.���d��ڭ�u���X\֝SfIJJ�x�#F�
��q��q���� G�}��v���]�O�www���?J����[�s��Mٹ�kZZ{�娬�D�,7�{tp�w�
@��E��f����f�M��8(0��E�k�e]
(_L��;��~"�x2T�%&�5�&��~��m�0���S]S3��@������*i�9���M�u�	���<�^T���g-���F<��+�,��e�Ld�ٰ�[w�"�:;;188�����؜䳋���L�-������w���A?�
i�( ���Z�W��`LF��Tn�bV�����9�=�EX�|9�Xii)����$��h��0�ѡ��N�6D��g@/
�c����Gv��Pd�W�?�{�@�H����V���0�1mK��_q�.�C�;X#^��J�Ӄ����3_]]���.<!SV|�+r���7����B�F9��A*��z��*�Xcu��h��Hp{�����?��vbm/��\__]�\��Q?J�	��)^��	��`3�22ϲ�{���ɱ��3Y@��`���l
���w�5���:��!H���Z��S���HMd��*
s�q����]�N���(��n7vt���^*�Ϻ,��毣�/��E��J�}��!v|ᓠUA��T<i����B,��<1��G�)/��hisP�Ŷc#��K��Q���(�,ڀ��|k֬�٘ei�ÇɁO�}rMV���65�HW
���kørA9���y]d������g�K�t>�J�W��H�@��˚[��Z���x��~�Cz���E�d�U)���\C���u���.2a�4ϴ����t>�dɒ�pɷV�e�'����*��A�{Q���-�!QP}2Y!�CQ���n����uXYW�Lc�)����fm��uS[[�������z,��1#!^<2�g�܂2U��g"��qf4|�+wp�o{�.�|>�YDb۳�F����a><���VS����j��+��R~�69��h}�i�ě����B7⢯��������38���.��%y
yCxr�)����/_�s��zN	h�-�'�܁��N���A[˟�rB���}@õ�sg�~L�
F��|.�RM�0�ȇ(��`��'Hȃ
��3�O�t[�JT��	�WIS7/�B�OZ�hǎ�xvSZE�[���1XLE�#��iY	�$��������uYMѴE��
��U�ﲳ�q�e���)a�f��)18��rAg՗;�Ne`��%���ə��:�����R��~I5�Vl�e�L�;�R�����:��薦�������Y=���t���F3�Jx��o.ʘz��o�Ңn^�[��s���}5m�����q(�E�}a���ь�~�#7Ty:]/݊cǎ�0������-Μ�U���?��@[�X.���p�����r`׾CY�RR�o��W�;��Ν;	z"L
�o6u���lѤ�F���0���$��z�nlًS����Ϣ쇠�
ZZZ���ͫv������`Ո����f�+����k��z��W"D{���&tzƼ���ٳyXu�\h�S&+.[|�#�w�%���?o�S��ձc�k�1Pk?��{j��q��Ѣ�����&6����)��/�N��4�0wz� $$ƿq����5w
}O���ees:ZRe�m�[¡�n����P�s�\#14�^X���|^�9�3����^B��$��	�F���'�^˯���k:���� v�����ft;}xjO��+>1M��<f-Y�7&�������}<dӄ �H�d�5��#�U�m��6����d��4n`>����x�`�)5� +��*��vu�-aG����BbB��%OԊ�#���	rZ'NX �ym�‰5�bӪ*���*��`#i��:
{��������McܚgD~m�CҚ��C�=�GiO��!�"
��F!�Dh�`B�X�8)���>���@G��`�zX�l|Zh\�X�/Y��,+EQ�H��K&���:���j��
�J��)JcgU5q�Ⱦ��tʤ���d�Mh>Y�b�`S�Y�u�5��tϘ��&`ZWx�"��<F]d!��~NP$'��ωy��F3B&;'���VSP?i]�Ar2�S��T$3��a!�™|���"�8�X,��V�̘�j6�jc�I����B����؃߆��3��z����3b�4u�5�>��
0I�����n�IEND�B`�templates/hathor/images/header/icon-48-massmail.png000060400000005014152453623430016222 0ustar00�PNG


IHDR00W��	�IDATx�YpK���x�����|W��f'f3s"333�$3�S}�w������cܪ�-i���~3c��x��:���R 0(&`r��k���ݻwQRR���v444��ի��K2ڗ/_Fff&a�X`��$����s��%
�\�C����{�PZZ���Ntww��
�����ŋ����.`2�C��vVV���A�=== (�ȪjŞ���~�RDrr2N�>�F�d���A�vYY�"����h��PR~y�o؜��m0�]����H555L�VQ�n�T'��nii�������_6��E8�Ԍ����`3RJ�@]]]�q�N�:�I��㯂�)�ѶZ�$���~���_�(�B3q������� �Jv\.���b�ٳg�������
�V��v�Ad�U�*�g�Y��*BE�r��ܮ�O#�dm�����6�hWUU1J2-��$�Q�lŻv�m�*-#�Pl�G����"����C��a����ͥ��bT�������nN�ʰ�^3~��
���sw�PPP���|TTT��Ŭ�6�$B'a�著䆆�t�{�5'��}��p�.��pu6���t�+W����(�K'a�srr�%9��N�ݒ<�K~xx-���III A�y���H�,���:p)�65~�|����@�-L>@
P�����~���s�H���(�������%��65U���P���f	�T���Qa���8xSS
���6��[�@�Q]]-�H��%
��YԌ;�͸W܄���~�g��9rd��IP��y���ie!edd�l6�(���{�(E�����+E��yь���x�o]�=[�x�X>d�ʼn'��҈"ZH�Q�D��zN?E���ԚP[�*��������m��.	;��T�!.R�.]��cǎ}J�����+�U7o���jA��~�p(�jqf�ME�hh٢��	\/��dM�����ʞpT�{����	�|o�U�]À�Uu%�b(�#g6
�J4���H���5�4�]����J��3+�X�`e���J�z��o��Ω ��{�z�W��"b��v�l!�^u>&:2W�r\�D�I�%�3��;w��F�#�[N�=�s� �Cx\�es?	�g"�T�B<_0��a��x�_;��wl6�#!fi�҉��d-�w�3g��p��#�t�Gy��3ۯ��{x\�<m�!~�l��FFF$����3>�'ߋ���brE
�N��|vv6��2[YN��op�>�<�����I��0�#x��AH�����FGG	]Z��}B���D,b
��l��鸸��Ў���sЮC�ȹ7
��ä�C��w�#l1IS��*B[R�tH6Q�2[)bq��`�i�r���/aHD���w;E�*I��ם9�V��:.W؋�%G������,1i҉T@
��ރ����;��x�$���4R��6�X�j��uT�X0z�O�s�7\}�C[�4SI�Pm�ap�ʨs($11q����H��%vcG�A-�����xp�
P�x�e�3҉�����}HМ&��P�t"U�6}$���h_��cKp���	����vmz��r��I��СC�"Sǟ�jrt�߿s�yg$�辵�P�?�t���o�Tto�%�D��)�]~�P�Z҉Dpsũ�&��]t�!ڕ����x0�-A>����GN���Eu0t|%����KX��Dp,U���.�M��q"�0:L�e�7�N�p��s�b$v>��إ��Ù0����̞�^��+N$�P
 ��]�><\��x��0xx6x�e��Z��[dm�޽�������Dj/�NGw�����`~����p�1*��7=!>�#�)�h�LN111�E_]҉�ը��пU������clO,<8�E����Bl��T2t")�zuz�<���>���2Fv���m_��"v�Ĵ��
`]���'	x:��lH��m�;F�yal��!x__������@g���K�WLqɉ��4귶��`���M�����?���n��s�#iv�޼�HK�*y�:�ܰ���?�q����p �y�]M��<�a��r�"�^��n(����ɄJ��Ͷ�6F�r��zdJ'$$p�9�͌���WT������:�.�	)ĥ�s���\�5�(�#�'Of��=+\g�8|��'>�7
Zf���H=�SlU�� 1r_+�Hy���*�s��/�~1�B;�ys�k���N��ʉ�pvF��|����OGDEJV?~�6��ܹ�W/����t�ζ���t������.yʼnZ�s"�Eqm�"g��W�<�.ޡCtɺ@�O����� ��+u��9�B"Qք�(��D8��߀�,����D�����^z{ll�n���K����dU�����N`&	D����|�:
�N���KTN�?��#���U�#7IEND�B`�templates/hathor/images/header/icon-48-inbox.png000060400000004724152453623430015542 0ustar00�PNG


IHDR00W��	�IDATx��yPU��/�&��ĸDQkM՘�����AڴV��m5���WM(\��
.,��
����>@|(�"�q�����ܞ�΋��0��xg>s�;��s�����{Ozy=�u�ʕ���`���/dDFEE!##UUUhllDaa!71裝��Hb�薖ASSbbb��A�w�����Vd�� 0Y�0u%7����˗/�h߸qEEE\\{{;���8�C�0�;��I���)�K@���׮]C``����LTWWs�>�g�o�0�'�}h�a�	5�5
<����)�ּ�h+EwttH<���
쏭��fZ�;��FPb�ݻ�۷o��46�я��Z���)#N�ByN�"����"U���'


�Rc�g�= YYY�F�Ν��$J���P�gJ#:&+**PVV���b���sӮGð�X(�<F�'(ׯ_�����L|DDD@dd$��Ҡ�hP[[˹�>E�������JKK�Ђ�^*�
III�����$�LЩ�߯��#�"��3 i6��BQTD�r�%������\G�B)��q�H3�70����/�Azz:RRR@���
m?	MMMENN���ܬ(f��H�.'s�8 =�
�3�d���k��x1�>}z�ŋ���@�)x�JJJ(u(�)�$H�S�@z(��{,s}sQЄ-��X�7���r���S]H1�x�~�V��+����tz(���ڎ>t������I5�w6;;{@�و�@0E������N=F�MS7����J�KK�5*�΁H#�Pa@��
�J�]]]z(���`�O.|R�a��[��Q�Tkd���S��ؔaΰd8���ҹNi���a����z(��������p\)��SM��L����GmHHH:�`B��#܌a���x������J�:���@��B��G��`�z;AsP`�P����]�����S�
���o3VdĐx>g�4-p��6q�䛽^���.E��f{��jd%���=� ����0!БK�1yq�(=�;��
�	(���(9�>|V��g�`�=˄)�Q�&��c��#C�~z,t!�m����e�2�?���e�]÷���=�&�(r1յ������46�Fn)!��~�Xiܝ�r��M����G�g�;����$����AJ^*-a:m�/��
6JgIxo�,<Q��Lt�&�v���2y�n�
FzV�Ccp8�*����s).�>x�ӗ�}�*T�yt��9���gOM�2�}3��6Hg�d��1E�:ɍ\y�xH+�٢O�����<8��~'h�V�y��j�Po��cP|�9G\P|�(�'�y��ε���:0	����nw䛨�*��tW��6�fw�<���~��E�L݅	Н�_��q3��u�;�|�P�\2-�0���Zg�����Y��Fh�G�j)B�A�f�!a�b>��$�٣/q�`C�^j��ŒVԁ0�܊����6���%�"�Ձ0p�o&h=��i���詃
����K)tr
u����O����4~;�;��k$ZϼA��}��Y9N�'�v�MR�cݩQ(�$�>e ��;�qJ����pg��7ء�s'4��Ė���@��}�ۇ��m���Zk��=���ó��;گ_E�J+Ck
}��� y�T@5 !f�9'i�5_o��-�G��Q|L�
Kt�Fm�w�������*7Tz���g���B_����P����\�9Y��q����ق{����	1�T��j��#�E��k$����h�x�Omz��u7�КB_�*�(�?]���{fd�Q��F�.;4��%f�987�XR[�U�u��/7G���x�OmzN�Z|��v�1��k�v�d�
��7j7K�n�E�a[J}�6�6��{���h'�4�v�=�+����[!o�M���8j�o��&��f�
j��J=��p������V�}7W��\t��+vڰ�7�]'�]9O�Q�g�)�E-2��JV�bN�r�vi98�_ۢˇ킗
���|(�ј�{�>S��?kM�/j�1�JU�]�ݥ�;���n��]�t�6��S�X!�.x�y���堧��떹�,���d�0�p��1�y3_�
ZZ�C�N
a�G1�%�O����$O����u�:����ɠ���	:��Ѱ�	K�L��#&��
���2~ei*->�@���!���E��)�"u��J�[�J~L�B��0����[3���1V3\e�2��e<e>�'�q2��y��h�\e
��1f2�0�El$�`�0�0�1&2�0����fP�f̥]c��1����*�>�����g�|�oQtLW���Y���ˍ�xq3LdsfdPvmMF�ڱe�=��xyNK}x������6�r���<�/� ��{y��~�oR(�4K�*lIEND�B`�templates/hathor/images/header/icon-48-upload.png000060400000004201152453623430015675 0ustar00�PNG


IHDR00W��HIDATx�p�J@_�$ˎ��ݟM>33�13�]1333333,�gf^fNb[�f��UI���:�nr��:в�~�3���_�0��G��Q��.�Sq��.��{K$z�X
�� �ɋs�XVQy��O:L��#�`���s�1�c�X�K�:�_�MeX��p��2�}'hx�I���O|�Cѡ��b�NF<	��E�&Z��{DD��f���\�5g�
S"�����U���a��`I;�  ��hL�E�c���Xo������M����e�K��#�L�%�Q:�N-3!|��M	c<�am���z�����~13�8sH�_?��C�~�,�K�@%�'��5ح1ձ����7�,p���A�[�N_F��z~�
I���u�x����Q�6�'�c�#4D�5�؄��I	ܙ3uB�����(�9�'��YK��(�_|�a7�|��?䄑S�f���������-�2�y�ݐR*��Z��[�3耔�eD�}��f�5[�:����O<�T��_�U��T��/�K@蕩k��6�*����Y�x�/����%��zP��i��:Hj�����)>�UL"��t����w��K�V�G��+�_"b:��,�{4�{��:�"����cusRb��	�<SBDw����K���,�}����_rtP���P4��x̲p��|��?������U_��k>Ju$دDū�pu�t1w�}�]Y����G��6}����	����U��,����|Q-�J��2���٭��N>�$�HʏWO���V�*�n��ͳ��3���<��go;Ց<	��&n{��N������$��<�pS%Ibԑ)��3���x��?�\��I	|���x%-Mmb��0�:�i�w�Q@��.
�C@-g�6��V&�Z��K\�\F�=�_A��Ak'�:|<�)��+�Nie��>/��8G���x��>�|p�q���/�gۿ��	�(*��?�6��$�,�;Q-�#�W1��'O�l����8����Q�;��O��}U�4�dXg�EH��V�ɠv���LfߘP����=6���VAI��Ck̊��w���*�4�/��L�	�����g�UPG.�IӨ���IG�Q�*�C��$ ��Pf�K�8x�dړ��S�S
�T�5��ˆ*{��
�	��K@fw@�4@A]�k���i�=Y�����R�ŧBF�R#OBjɮ�2��A+�&�~��6)����4
!�؝�]��L���O?_�i���.b1�^�게@f���ۚ5������'*���eg�Lk�q
kv��y��4�A鈊0�&�
��n@C�^6`S��7U*k2�I�Y���᣽�Г�f�Nk����?�9�_�j�^mڷ��]�a�^�L�x�Q�5&l������yeF�>�R9�������(���nDS�.H'Y�\���jb�
�rr��%�ZR؅���	�h��?�0,㌲�a�#Z��K��������HƉuP�)��z4�{�a[�K�t�`���'��Q��:�����V���qc˯H�Nl�v^r�t�yt�2l*B#��b�\#a���{4#���}C�֯`D�0Phs����?��=�ͤIEs�
��e%��5�l����b����V��ÁU�T��:N�MR�]�~P
C�1$I��Un��r����ˊo�z���c�?j��+�}���&��E8Prc�</���#"8�0����qӾ���'�ӱ݇���4Q/�4Xu�/	��h�Y�؀�Vy��s���w�-���s�8vt������,*W�4&�:�R��(�v�bz�9��F�m�}��m����hq}�n2!��=�^�bq���=g��8r��޳i|�
c��%�I~���hK���!̌L�?��o�%L���-��as"������t�
L�$/
�W�d�@
���@��@�6����wM�X�gf,P(%����L�b�t��,u@����e4�W L)H���:�]�c$oQ�=�M��#�#E
��MNH��,�F2���IEND�B`�templates/hathor/images/header/icon-48-groups.png000060400000006204152453623430015735 0ustar00�PNG


IHDR00W��KIDATxՙ�$K��Yjc�����xm�l۶m�l��6��;��A����eVLE����}�Ŝ��T�f�S'O	.��s�&�H�6�y�R�bW���,�"�H���a�.�z=<�
yP���x�s�u_�u��X9�cB�+Z[[s�hkk_-dzz���1����Y�iA\�v����z��?kM�G��q2�!���m;07^��w�$ X)%�B���-�M��]CCC�����f��ݓ��ڟ��l�L���W,S�������0{���099��ࠞ����7�Ri]<�Too�U�끟"��#���I�e��y�Z�ک�3뱏��};+���Ӝ:uj�x�%0X��.Q�5k�����'��L{���D�
#��Hg�e�(��7�#�<���H�֮]�֭[���oy���4�/l۶�����g�ik{�I .��~��_�}�U��'��""�$ީ����O�R���ٷo_����n�7�u	�R>�{��D*��V��+w�:�����A�K ��h$"�!q���=��:��%�c�G�d,����ʄ
��DA`����M4\p�EH���8��g���+���N�[���p���ׯ�����1�;���,<4�Ɇ�0��4�t����g�Ν櫯�z7�^J�o�`=��6�(_����/O���&h3m��eƫ5�ǧ1
�>����c�,�J߬[��Ce���i1���Q?f^L���!�8A�W)�|�?�,SU�\.�H�&��M���׽��\zY٩X,~���ĝ�g�7ntt
M�6�c���)@��t)�g�8p䊛X���m��\�j�מ}�����\IO>�R�L���B�ߢs}���4A��o�HȅC ku>|��Ou~+��|5k�LҎ�c@@�t\~����|���k�ȤX]k���Vw�+�/5�^�fs������7R�V�+�q������q��Qv\���&˼0V�Tд�M6t�ٹ{#�?~��<���,��JJ�70�o�Yg>�M�$�n�:j'���n��3/���a�s�^n���X��%/޸IH��ʉ��)�m�8�O�m�t�%ga�to
эl�JW/<xpފQ�Ҩ���Ŀ�Ct�Mb%l��I4�:��\��l�M.z�eԫe�A�,J#�N���|�%�jɲ���:����
��5�����ed$Z(o�n�/�*���H�o��dr�A��+\�~���C^`:1N]
����y-��d2���C<Y/b�|g�q��WpR1d��lr�G�=	^_Y�l!i�ժ�,A¶X�\�sc`G2���,di�̣���z��`'l���K,ɬCG��W��7<�c1�J�ޤE6cD��M�	ت?�N��OP��X��;	;��MH@�>b�%	�S'��0���;;r���r��t�t�a9�%���}�hӣ��o4\�ÿGr�S�ZSH+��I�u��E�����ͪ��P�0N:�ԃ���Zq���r�b�E�l����MӜu��w�	R�_%Ӛ��[��l#�6%�?)X�F Y��p��8�0���[��
v~�g*ص"��nX� g��b�8`���$�5\�V
%�D��r7W�5�+y���R���)�Z�Cqb�#�q��cD����|�e���>��G��jT�J��Bx�7�K���8�5�;�Ö5��ޜ�1�j���0�\���c����������_<�F�E�*q�|@ }���[�Z������M6ała�T�e.�Sܸo�9�րaRʷ����ya u��:PAr�6!g+��Z��m��K�)�\��dZ��S�Jz�$��ڌ(�}m� S5��Sr߮*=�\D[^�W����wɷ��T�����\Z���`���$�7��2��01$��tq󾭼g��E*c>=����/<�O�m�����z#�x�/ɜ���U	�M���H��ĕ��W8����+�F2��� ���C�iH�G�Z����)���n���nػ��d���s���?~Y���׫�q��������ڧYo��m�9u�^��+��pOa�7t~���|�#�-�I�l9�hޜaT+*�2�z[��o���l���^zI��W_�6��{�}\�P�B����a�+�Ͼ�;�6m� N�6s��p�2ʼXJ��_�[��c>.�&+C@(�C��4*�
���|ݕht���ƀ���u����i���F�!]�i:��ߍ��p�	F�F9U�^���x�Q�Ys=�B��a�1�vn���C%,a��1<<p�XZ��;U�����C�c�v$t��]�zM8���1�<�-�i�Z�
H����d�3\w#_8q��u��*�/���S)���R��ٶ�gD-��+M_�f��<
�ӭ2͙3g��?�PW�Տ~X��}z�	��KK78���$��|�����7�yJ�//�*?��|Zh�E·f�)A�e��1�=�'�:�^���>0�Tg�3�yt���oW=�����7���[�����ۘ�-�Ҽ���c��#������.����gϞ�g��n}skv^���B��yٶu|��c|��S�5�k.��~ �X�	�3ᶲ#�PG��=mܲc-vir�&�_I{�xlÆ
�V�^���'ڽE���/�嵡q&�ϔ�����m��1
�E[:��u����`Kw�~�ıcǦ�5���<uct�Y|B	ح��i�7�}���:{H:?]�szb
_J̍+���c��=O&c)f�J����~60���x�ЏK�����TG�z�^�y;�5�QBhjc�\��S�����1����/)!ttt,|p��855�ʀ���v�;��~�}1�'J�a-D	b�5��Oa�~
���>��Nψ�I�S�=����m�f�w���4&p+�]*.���2m��յT:��F8��T*zC�M��
�(q�,Mx���
��fEF�o�̾?w"���/a�*?�k�@IEND�B`�templates/hathor/images/header/icon-48-clear.png000060400000003116152453623430015503 0ustar00�PNG


IHDR00W��IDATx���sSu�#;.x3���c[ۛ��,U��;�q,H�*h��h�ԉ��NtXR�r�,[ ��k�}�	�N�ݲT83������_�
�a7�2�O7I <�n�� �/�V�υM5� ���.��N\��/}y�w
�v�7�3pQ&�A��F�{S�$|dQo����,��d�7-ӱ)/��@�Ŝ����=:)re9�ucH ӗ^��[M����Hh+�:����X�߱�1�90
1=�;�!�}�þǯp,��HWJ&�I������{!���u�i-K|��$�Lg�C��:vE��K>��!�����q�\ή�\�,�u���h7�<&��˘�Z�t,�ӄ��#��?��*c�z$�%�U�H�C�S>��y!����Q�g��s��˚#�7�; ��B�>B�&t�$ �a~����A��\k�-��	���'s8�)�%��z�84�o'>��P$�ᚾ���܎	4�5����D_T���'jDQo��?�3����&�>L��벥��q��mR��	�\S:����� �T?�s?v���a�	|8���K*�?��N�A�� ��A�5��K��4ЁqO��ء�|�h�z�T|��ړP	O�x�}��ʰ|�3q���M���U���|��$�Mc_�T&Y���܀vh*�i��c�ŋ1ˆ�J0L�{Li�9�����.&�D<�d�Q(�&�9��£~�5��!�D<r�!FTJ3}gT�n��V�;FGG1b�*-�[#
�2�'<����U�	�1��K��H���#jP5xsD-��{mX���	ϒ��/;�u�Zt@����&�+�G�2l��*���Mf���*�f��/��	f�HT�(���/@�-C���V�	t^j�E���6��������_dĖk��J��HJȣ�s��[&�r.d�V��nD+�rD�9-�~uo
�2�E���\���C�:���Ս��v�J��: #8ٶau��?�9�1b~�і!?�2���P<d���E]ƃ����r��M�@s9�8$+�F�k�9�o�6��#��:�_�lMy����Y�_�{��+lς�b����&�X|��,q���
��gB: +�b�>�/��ˮȇ?7܇���˫���a�\�|&d���?��ؒp��r�]*��>�r�9����8&\�[���sU��1����4��2
�C��Z���(�Y"��T3�W�6�|����u��	�M?�����s��5�1 )?"�P�蜋s�fۂ�%n�֟�b[��l�7�Z6}�F6�h��>����Znss�<���#L|2>sY��xvXnK���rpg�D�$��:D� �]yPGSb,�/��.2n\$��r�H|7X	V�Ղ�œ���&XR8�� /继 �*n���1n;1�h�l�"�b��yP�����+���E�¼����gN��j��3�EIEND�B`�templates/hathor/images/header/icon-48-puzzle.png000060400000001645152453623430015753 0ustar00�PNG


IHDR00W��tEXtSoftwareAdobe ImageReadyq�e<GIDATx��IhA��'�1$Q�I���DD��/"ē *�ŋ7�^DQ�"�^%����(ET�K"3�HLD����b���{��|�0�U�wW��͘�\�0M�9�E�
t���{�����0>��`V��ie�*�`A\�v��Y�������~P��h"�_�a�����&��@��L�Cs
$�(@��q
�J�-����V" �t��;0-�؊;��?
%�h�AC1	�g��0s�p&���{ցL�5�����h�g�+t��?�/LF�|���ش�w�{�����{*�Ƃ)�.�i��ۣ�y�bD@m�N�������q�����Z
*��8!���t�zaDf!v��
(�6�\�:�]��b��DI���l~�޺�1'R����L*��98
V;4�H���7h.`��0K�^�L���sA��
b�P�����`y��g_��972���ZV�L�|�n��!��`���=�ʜ�)�$��ߦ�w���@<	hA�2�i1�kCK��n��-�mv��|��q���3C��U���9(�S�~0^�}?s{R<~��5?y`x��y/�K��U�Ζ{��G�U��.�������]�|=s�/~b����S��s~���8�C�]:����<TM���6�����\�Jh�t�I��?^(聦��=U6{|i'�z�bk�X�T�%O��-j�tӠ�X���Y��)#>��o�?��b��.�|b���VB��,���ʍ�_���o`�N�l�4+���ܐa%�5�2#���U��S��V��x��IEND�B`�templates/hathor/images/header/icon-48-article-add.png000060400000004417152453623430016573 0ustar00�PNG


IHDR00W���IDATx�Yt+]ݓ�$�Q�P��m۶m۶m�~۶����چ�=�;o2��*��Zg�a��>��{�jX��_\�E{d8�c}�x�����R����dt\$�Qlhh����+^�iY%���
ͦi����ӧ?200�Z)��7��
�F�n\B���%��ĪW�$¿����ں�6�B��C�����ª`���r<�H$��J�P-
�Q\J�f��z=��o�4� t]��r�ώ�Ç�W\6�������IZ���c�|����fՑF����DZJhlrrrJ��$�&LWTP�X�X���~�wE�b	p6�̀iH�r��
�9�a������k#g�bjr�
u�y�kCͫ9��g?�ٽ�|�;����=|���Ӄ��% �L����HR��ɵ��7�Zv�t���=@��,�x<~������G�1*BEI^�7@4%y
cvx�������uy�p����?d�t����U��-�
#~��nwK"B�YFFk[�����ov�Ðg���"�J���wÛh�\���D�K_��ߟ�'<[ք�7op���
���m�Z�H7�D��xCPe�>x�����(�(TS���=�K�E2����EľN��9�>G��<;O��M	`�,8p�~��VpAz�T��E.Z=pD��I��:	�����f3�Y^�p>C��FFh?�e�2�����T%���o����|�-�/�6��zP�=P�V��k]�Z�h�&T-�v
H���?>~���oF>p6��r9:�|!W�M�@V����]U%���9�y^�=f�nw�;���?[�C���_�n�<�K��N{���[��ˌ���N�$188��ER��9�6�E�?�l���<-}pMK��3?�i�Q�U�*eG�JtI\�X,~6�	�fe�!閂j`>C�<�Q8�߷�uf��9��Y�/����>�W����}�{��i�\)D�^V�¿�)y%�.��_L'y��`i�U�
�t-B�}�o�^�;$��!q���׿,��Y��w���j��V��n�kK~�R�ȫ�&�1G��>w���Ce�eF�t�P���f�rπ¯�����+�
~��ߪم_B��f��3�2$��OOO�~�_3r> �Ñ+5���@��T&����?0�F��B���b�鸝�q$V�:5�pT�I��l���b[Am��Z_��^kjjb鐴5R�3�*U��.����G��,C�&7E&�)[#¡��e�U>�S��#��|~��=EJ�@���M���1��y���T<N��q!ͺ7-W�Kّc���Y`؟Cq\K�f������Q3l.w����7�6).D7��M��s�PD�CU�7��K�m(���N�om+v�=Z��M��VI,�,n"$4*_���$O��g�8�K#���8˲c	�W�:IZf˱ouƙw���3h�%@'{��Ők�'"�C�N�PӨ8�;���ҮD)!�2c=r�YTm�����O�<	�0��}R���� 0���<�����,M3�^012�/�>#�N�u	�~W鏋��d�V�A��jT�E����A k�w>�s��q@��b?��;%T��^��;jP�+�>6y�ϔs.6�Z����~H����p
��d|?�Z|9x��.s����#�����5����@0t���]Q�4Y������[�2��|>��R�Α�P�
ʛ����zO�X]��]������o�
~�4�ܕ
:L-�7�܊���栙�Pa�r����:�V�y��"���C�C�o�I���Y>��,*�x�G��"R���d��]��s�MK�"_A�w���	ب���%�`B!<�_ �C!����w���3�ԱzG��S�K�qy��3}1h�=�|�! L=�)X��_��*/�%��@Al�e��!���7 ��l�bg�>1�͑$��cy�
�Kh�.;�C!k����	̦f��܎���:���N!syZc����6�o�&��g��B�.�����D!����*7p̦���`0�P8,ǻ���=������2�1TZ�r4L~a{��Eۄ�����`���K�W��m�7��@Fb�>�b����=Y��vi��K�J����z��>	���чmƗ�w?`H{i�=5��{��Z�ɾ9��_+�Pm�+��ow�3?�7IEND�B`�templates/hathor/images/header/icon-48-content.png000060400000003310152453623430016063 0ustar00�PNG


IHDR00`�	��PLTE��������̵�������씔��������٪�”���������˜�ϥ��X����Д����R�Nj�ԗ����ծ����������Ț���������ťd�����Z���ίp��K�ˎ��c�Å������ۣ����֛�۟ѳt�����ZԵv�˭���۽~ɪi̬l��羾�����ě��͏���ŕǮ{����������f�˓�ؤ�ͤ�ۦ������]]]j}~׸zþ��״�ܽzzz��u����{���ػ|ƪr����Ͳ�۩���~f7llk��֥���Κ���ħp�Ӥ����؝m���k:<n�¥kbpnttt�Cջ��Ի��a���о��š�Яǿ�����ʨ̶�mX.]v��Ƣ������8f}���u��ɸ�=q����{lSfffOW[iU/�����Hy�̵�δ|��ψz[���<��nz�&SdHegv����s$Wk��l���|������i���_��M��A���q?JjlW�Ğ��ƽ����lbLH��;agtpf_vx��J�x`Joq\su���ø����w_3�ŌPljZoo8iw���Ai}n��ex�dz|{}���K���]uwsrhNl}o\<���p��^aR���ֵ�Sf`���C��t}��ʗ�����˖~Q���6��ywsbhjxm[���x������κXqm?q�crrMMMs\1־���~�����G"[t��p�߾nw~�zlmeT��ѣ��ztf{c5���w1�otRNS@��f�IDATx^��S��H��M�شm�ضmsl۶m۶�O1���+�tf�n��z��}�̉XU^n��+��R~e���FG0�g��������922<::ZSS���dr�l��>���s�5����P~���pM~ns�T���슮��;6��~ߴBpsO�����G������@����[�͗m=2�,h�nhhٲ��i����p���i�ժ�{�y���-X�]/O������Y�)��
�N�3��3p4�O��L���u@aj6^R��7cr�а�g�5OQ��У6�����!Q����Ȣ"EQ*0�j��+|Xb�	�
@@�eE�$N�fP�&m6j��0��(}�����6[L�ր��vRc�v��
Ȅ���
&!� 7���‡9�9;hBK��1�;\.�^;�o��5H$�{nB29W��#x�	��f�R2~<a0�¢V46w���dY�jGe��}����(�)Mq�����	�����0��(�N_�0�:�q��L�#�O~��D&���Y����f�,UUU��2��_����,��!5���p�$4�K �Lpz)`8�����.�|���Md�7(p~$|�8zM��o(�	�)`�Լ7�$��?��P�,.�W������i�^w�J<��M�P��U�T�ԃ~#N
"�P&s-}K=C`�3�p�W�_�wd'ϵ�
��P�ѩ�%������/<~�"�d�QᾍQc�)_�0�ͻi֯����腗�x��L��4γqB��OO~�}��y�E�֮�����������d��,���o\<q��/=�i��]�ҽ��[\F��	�{�.+Z|I�`1�]�}��������%m���xO��j��bnM�o�a6&(x��Zܟxֶ6�?>x�����IEND�B`�templates/hathor/images/header/icon-48-user-edit.png000060400000002717152453623430016324 0ustar00�PNG


IHDR00W���IDATx^�]hU����I����"Ֆ�� E����}�.(�@m���@%ƪRZHQ)�TԢEp�/�K�'��&T���6-M?���n�c�'\谌f'ղ#�lΰ��s���M�)���4�0V�i��Ȏ@J@)%��d��9�����
_r�q�>I�aB�#
��L���i'9-�����2�	b�Ri�Ȃ�
�F���ݼZ���P�����)h��,,�و����uD�(D��B�"!�RP��b���9���~�]�Y/4B4���+���-$8�q t>p�Ѱj�EE"�X�.4Ci�	��E�o��D��n�0?��������"1�q�?*p�u�9K���J+A������Z�D�\��n2�Q�]��Nr�靹�맑�B͍��hr�����M�;�[&l
��`�'v-Z'�@0t����>�m�|�M�$�#�;�o�+姓y�ڡ���"�P- 4h�w~pQ~	����ky��9[@_�Pb_7m�!�R�n�N6�v#~ 5���M �h�1�x���|1U@d P0�aӂt�z
*eP
�Jg"D����,I��x�����|9���@�F�� ej��*��W�� �>�OκHߝG(�;�m-���b��Mv�j����P�$"M=� �#��s0��C#��5_��o�5?SM��bI>>�x�0��G8r)t��1�S�޸�P"���f硶��/��q[GK1�{��a����	�Wa�
,΂,s��E�Z��D
�n��"(��1[�D�8(�}���4�5]��ׄs�����e��P.
��!��g�@��߲����y���a(�V�*\�jq��o��~�?�;'��9l�Z�
�*�G�Ƶ}]�C]W
�-
���t��ހ�9�R��O���k]�w��VZh�B�{�ic�W?�3��|��Zx(���o��]��h���5����Ǩ0�x�P�lbT��_�E����s�s
a�ƭ��x��Vv�ڿ�������^@��"��z5>44��sMN�_&:�6ժ���G�m��V
�r��u�(�6�*#Е��q�1����@e�e��I�f�em���o��L���#��n��͇�oqYl�L'�ٺ�����T`��a�2��d���Y����U!��{�
���AW��[&�s�yW���ݱƽ���
�Y�Y���$4`�����%_�AiY���@P�Fc�39<9Cd�`�Au�,���`�\,�	C�a��4�%�2@X�å�P�`m����Bg��A����ؓ�փ���o�l���6^�t%"ad_��I�@�W�BP��5��Ϡ��$@�n���_�Y��)zN^IEND�B`�templates/hathor/images/header/icon-48-module.png000060400000002000152453623430015671 0ustar00�PNG


IHDR00W���IDATx�Ev$G��,?�%�д�ܠ���'�v�3GЬ�t��4l��P�Wf�k4���2���̦�2��Q3}@h��������֚^$D�+��(��!{�7ͅ�7;�w��\��M�ݺs*^xaa�
�M�W�5~g�i´,X�I9{".�u]��0!�		4��`(6rN�k��:<߇�y��<�}�H�|>�z�ƭ;P����9;3�-8==����(b`�!�K
�x(��ܱ؎
[™E����8��(
��R��	�T���H������������P�������R���(��B�?�
�;
�4@��Ņ���I�lLNL|P�V�@���ѣ��V�+�:��}%2������N0�}��C��y�.Z�V2[*�6�0iD����mN�36�lb�w�h.�8�y���47;7; ׫��k��L���V�u=�th�w݁���~�
�ௐ>4������ޣC�o����[!�܏���x|gg;{r||���H�˖m�������144� X�{�y,ۈ���\��nP����^�*�ډ
�w�
�*\0�!���s�4�_LF! -^UDr�gAzďP�$��DRp��r��^���Z����Ȧ���
�w<y�$�y�
�\ǿB/<�9=;K���;;;���
�9??���r�8>>��AF�FD�r�����e9BDGv�>a��e�r.�rzT�դh�9����.��:�8a��\)�R�rk�s	ƅ�z�{�
|����_C�?��r�ɝ?J�2���
�9�̒��a� �{�\���,	E�BȁC���+/cpp0^ Ӏ ҍ0�����F�F�3F!����W�EH�2UEs-�D�z�X���F�{҅ap
ߩKьwuۂ���t�/�-��9�t�7�Pk�t�,��?��/���@�	a58��_GIEND�B`�templates/hathor/images/header/icon-48-levels-add.png000060400000001505152453623430016435 0ustar00�PNG


IHDR00W��IDATx���%]�߶m۶mE��ڶm�ضm���m�٪�߾��~}{�|�tU�M�D��������������\����i��+��@å��#o����i?�"%�[��C/R��::����Љ�͉�N��kj�6�I	p�8�t0]Jv�g����w��U~ �4�#6��6: ���
�.��
����@�<���@`�:��o�(������?��sLC��? 0��|@`0
\��`8�����?S�U4][�-W�@� �2W�M�@��:	���t�:}�N�d
�X�Wk�֓�z,W~澰;��p��W�@�d��á�нs6z���s�=�Wr�g��oy�,��%�:�ڢ{�lt�LAGȗ������}��n�A
�W�B ���BtD���x[�{��е{#pU{<�=������`�L�Ο�#�{����V��v��j����qj�w��l-ʓhu}-N�_޶���,��=���g���.�5���܎��8��i���3L�[�����д�)t�-a�.J�j���p�)�cb ��O�a�fړWq������#�i�,;�Ϻ�L[�<�*�x_<CQ�1�φ@��)��v���9��-fW�>�Ѿ�5�i��B �c$�}�c/>%�Ӟ�ޅ��4���4j�ψ��v��b?S_ܭ#�Ż������އ'�苎�.��Ap..IEND�B`�templates/hathor/images/header/icon-48-menu-add.png000060400000003062152453623430016107 0ustar00�PNG


IHDR00W���IDATx�s�$k�o}m�؞�[۶m�ضm۶��m�0]im���s�����E�_�q�2������?����?��Ŀ��'��y�]Fg������F�7�av���N��\�+%�/
D'���<��AE�@��A�L`��E��T&�z����,�d@{�,�(��<���5��.Jx�7�j-{K��?�_�L�WP9_�P���3y��	,�]�,�Dd8�ܪv��g��;�-�<>ofLJ/����pd�zܩ O˻�kPgva���%(�]%�5"~s�'*���R�O=���6��_ȫ>�b�\/�M�+9��Ⱞ�K��+�Xq��D� -�'��_ó��'�Wb��+!�$�4�2?���&��|�&1O�׳��+�_ �a)Q��-�y6�4�����+��T�A�مa�獗ѿ˫A!:"wʦ#�zs�o���`c>�!8����x��w���ϡ�3s�F�/ں@rB�cce^�k�~G�9�����i͒�D{�:0��!��Lm�'R0�6�����Bzr��-�\��a�T��v
�i�#�n ����
P8��w�`_�tݙ���%���K\f͞�#F��v���}�a��)�dF��������,� hO�nԁم�-t��:�'�`Y��q�޹�%K����1D{w�Hg{(���@;r-��yxW�DG6�=Y�
H�y=>~�


�f��}�p���#%5R�[(--
��B�d��?ų�>���Q��E >J����0p �t�wu>x���h�C�^��_�9��3(��z}�;�w�G����O��~�#�=�u�mA�Pϛ��|��?��a�P&Mu:�>��o�UH�������֮�o~�[X���
\10	ʥ�P�n��8ʤ�N��g]�Xf���{��>J��šo�~x���A������Ɇ�u���O!�oR&Mu:���� �u`u
���"225S��Ȩ��EKB��	����e��%e�F��G�t��G;�.h�j��Q<5<Ew�/*���́V�����{ XzoPP�jtN}��᛿���A~1J��ǐ�����W���Xf_PP�jtN}�_��:0�PU�FvAʪܨ��.���A���i���l����Qn>y�af&��?�G9y��(;���q0d	����	�3��l���_�e�8��[�A�K�h����.1�g�a�$�fr��.��~�kݽ��OE��	��/t$�����'q�,�B<3�1�a�����M���"o&���(�{�������W>����s&_����%��t$�Z�?�㕻����|U�AV��wf�D�Z�b��%P�oT?3U�`��+9U�E%��</�<=E>��r@7QM��D0�)w4C�h���z�5[K3I5I�:G�>`�6�l��z�[:���˖y|�l����@h�+a
#���L��<Q'�	�H����IEND�B`�templates/hathor/images/header/icon-48-article-edit.png000060400000004634152453623430016771 0ustar00�PNG


IHDR00W��	cIDATxݙst,��/���ٶm۶m۶�O]D3N43�5�m�*�W��>�:N�qq���t��L�ާ�Nu��.㨅N^a����@�/ܡ�����p�]����R��.++{�o��+��T�����h���C9�
sw���;)�x�\E���"F9�U�4���)��>����D:�l��F(JT��!��������,KKK���+r5
���|�N�x�������H �f�U�4��ҋ/
����kj��dz��"�.�������^3H�G=���ꪀ��Q��˻f���+^=888���&ccc���/W|��˺��]U�C񜘘/7#@w�+�y݉	`p���'~��������u��2=5��Z_����1Ü�uV
�Co�����I@gG����J��ǁ�LI���k����\���B�9��w�2S�[���򪉉	9s���d=7�9H�>�9��$�=�ufιH]M�K�����S����gP���͎Y����!̊ f����V����ሯ�kY�$sss��R~/P�]�㠥x����"@z�}Ÿ|P
 ?99)LJJ������EO~�s(��=�O�Қ������>q7��ㅅ�S��q���u`�456����)�ho��ّ|cQ��#@Z�����y�3����D����r���� 4��|ݡ�q�C0+#�s򃙐1	�=��^|��U�+�c��+	z���F���Y:5\�n�I
��Ǯ7>�ُ���TN��7������]����.8cb��t}~~�.��,�0�u?�;����S����+�W�¨��R'!q� �p�cf�gU�<O�.�f>//+�ifV��r,��ęs��&'K��_C�J[���v�ѿ���}��]O���?��ș�5D�5��!��̐D�9&�9����<�t����==2�U�E׎X��6�Emm�XY)Y�����~��V5:�[5z��Nw&+ǐ"V
�b��		QH���	����6|YVK�*������j���Z��<@����$ݭ�9��8�9 T���>=n�D�9.��}))251�JK妨(IKM���/�����7�����O~�o��Eބ�}/��3�L�1;��ϝ;G,۳<��4���A}��U�Xڋ�g��<E���Er��m���nSNϷ6�}ǽ���8m��U�Y\�i\�e��n��6u����Jp���U8.+)��,!GJR>���z�9wD�b�$����߈�x2�ӓ�<�i@���P5i��6�n�(ٰ&fC}� �JC�X7��
��Ȯ�o�@$�7�#������B���6�\Zᭆ
6���Qa�����x�֐���Β�K�%������]�\�U�
4\\�EK.�x��:jylt4��lE@*�Dҡ������K>�•FnQ��O�k&��6�FϪ�f�5�m�����W�i}��.��5����ڗ|e—���K(���)�� H>'Z[Z��������ϗt-��ޝ���$/�\(�~z_����6F~��^����d� n\!T@(q܆4�
��`^��ĕ���q�ߗ|c�wx+ȊA��T!�2�HJLt/���q�"
�
�
G�;�����:���oS~��!l�{��Ĥ$$$�`�7���Ҳ���Qy��折�K��gu�/H["h5��[q�8��v�T�b���tvvJm��)y����ߢ)�|C0��i_�H��9��x��)��2�00��õ��|���$����X�Ӷ��}S��ۅ��)
T��9�}��C����e0o����T1H�u�4-�/��d'}W��k���~�ݚ]�v���6�
�>M���ld�� ��b�h�nh7��;6y��L�G���S�%-Z�)��&��L�s6P~�[�����{{���M8+��_����M��}�"�)I�����q�Z����6�[6i�Ä��:݁�����{{�a0	iM:gŠ;�<x�{�+I��%%�a���T��C#��Յ<�j}�Q��V��DE����	���~�;�vuY1iڊ�
ң��&�q�7�����oٵ	b����ߢ �����L����� �X�~�t�d���?��ry�
�����2I�ˈ�%M/Ľ�&f�֛��p�&�������]VJߒ���ː���Deb�W��evU\��Y5=� �6٦�b�#70���^�A?��{*�����c���?��}��y�J��%���̓#$5�ܭ�'Iq�����\�R|M�+��*>�x���[�}7���<��
⅊�)b=�?��c���N������nV�PU\?��x�x ��IEND�B`�templates/hathor/images/header/icon-48-help_header.png000060400000005562152453623430016664 0ustar00�PNG


IHDR00W��9IDATx��|I��_H�d��x���2��,33)G�}t�������X�23ô���j�o<ى-�U~��i�߫j��F�����hB��B�Y@�M@kʺ����,b��1��hr5����@���.p]��!��Z�PZ�RJ�*�Z��Nۮ]�6�����!�C"0��g�#Z�wg���7,��B*3�����wF(o3��Aw��fm3W�!�
��54��3}���������QE�Z�Z#�'����	�Y���"C���F���g�K������E�=���������v�t7�o��~�����ę|#�\Cmb�E0�4�/�@~���dh��/��b��D�
X�E���/�DV�ǎ �`��rl�M3pL��l��n��eM�c���K&���`*��#>61�فx���u�z�
4O�l盇b`��xSu�<αKe֭�j����}��u��c���!�`����b�1�l�� \�i�	@(�|�����Ëm��c��ט/����^�`�9�N!�IJ���A x{&����2����>����kh
pV
�/W(k�x��ڎ��l���z(�[��X6V�[�8��F�����ݵL��ל;?���ᅡԈ���p��`{[?�U�qv�����
ٯ%��j���*~�h>:���ք�]3�ì{������*z�
N��Lr.�5:\׃���b�5��%d+!�D��
�Fg)@{O�ëO�T*�,�+'�(��S*��է��]�*"�dgm����`�U��Ժ�/k$��^NT��"�[�@*t�tݕ����R�vυ��SG����*aT��4�F��4���44�Lk6fV��пYz6���\o8�/����b���g�{���f_7�{�MD$:4�;ʴ$��H��ڝ���k�����H���Ҧ��h""_C���
#Ѱ�v��[�2n1PW��5���R����<����m�����]�2�f���nS��$�V���4�1���O��p1������k�Cv���'OEn���!������]+���ha�c����k�>~����;�!,u��=/�<U���9�P��U��2����8�h��!3�Θ�".�6]�qQ
�V.�E��؜|3���Z� I|�kOBξ�y/�׼��]w~%��U�[L��12���%&���&�q��
8f���
�Bg�p�7��?��	�����ʄ=�:a�A7"�����7�>��	a4�"�k���O ��TΨ	3�?wF;������L��AJ�$���ψ��-��N�hhMp�4f?�ymL��_X��d�����^��:}'��	��Oİ�Ţ��ٔh��0/vӹf�!�x�'V�V#�9g��3@�+�m���'�?ry�N[��P���S�+�y"(����h�F[�/^Bs�R�?H��o=��G�9�����
��H9����Ů�Υ�Fpߙ���շ�2�d/�e���E�
����[�E�I۠t���~�9�CC�C�s�R��	�q��1F�qd���/�ͳ5ʏ]n�~&C�x�؇�9RI��+�_�F���v�F輠��+�C�:�䳞���ل}�5�J����>
Ss����Vz�R��	:/�_T^�V��|�y��c|߿_v���g߆�]=^`�X��Eke:Иˠ��<�L����P�Q��+d�bS��"�f\������P����~�?Q�l���%o��a��E>{�3��.¡�:\=e��*�`�g����0qϣf�<���?>|��x��
_���D!�Y�fi��-��Z���[���7�����H�DQEdp{ L[�n��=ʚ7#�z��O�e?Zl��[\��d��Զ�I�O����\
L�&���K���ؔ�F��L1ǒ~Ki1�+�U��U+��Z�A
$f�.��ƍ�57E�Ј��B��Ikn���9���E4�|`K;�!�8����֦��@��H���Y�~��Q���}`�����)|�{0#�!�i��Pz�b���]KÊOJ�Q�
^\\�zO%��󺋂
Q����Nb'��΁F�*����S.�<n"�L忳�ɤ���w�j��w��N Zi��Z6GX/����Xۊ�V�V9?¼��p],22+m�`�3��H��6i5���vb:g�+e�0ىD�8[�[P/��Z�{��>%��VJf	��Ҏ��]v�av��\J,���	C>W�N��&2��kB.T��I<�Ǜ��1}��?K�����Zi�
��vi#�i�S1�+��y�V�n��+�e�q�ڊ�i��:���!Ҙ���(
Q-�0�JE�d��S���Dv��s��Z)#�d��])��5pw�i4��HŢ�LF���^-��x(k��9���U6�@�����i�Nc��M=qʓ8!�q:t_bE��76�?=��F�?q1�;�3b6(���Ҟ*Ko<���L�C��~7�+�A�ܔ�>�H�gKK�e�̕1r��_� 02;m:�<!~��8����}�W{�d0'˶N�.uBj��q�Ƴ0�����XD"����O�`��߾Uv���xYyd��w���X|$ͺ������o�e̋��_�J���aRFR]JO��c��?r�ȕ3�?��
؄
��J�/�C���}��?O/~�����4��P/�&��V[l�`���3�eP!�}F�	�t�t�Iu���_��.���6{H�GJx���\��uƮ������)�IEND�B`�templates/hathor/images/header/icon-48-tags.png000060400000003126152453623430015354 0ustar00�PNG


IHDR00W��IDATx՘p#������pÜ�aΆ���2W�2˝����C9e�q��2)e�^8�2;���*��Lv���zu�Y����魎f�G����4�z��+��	�J �b�3�SX�{��s��1�+X�o�+G�
��x��|��>�Wp�rrl�,�O��>`T"M\s$^�`�>u�s�3������_����X�}�!�KI��= ��/�������1��A{&z�!��z�+>M�W���/.�|}ԩ�S��ogk�Ɨ�:�[�t��#Z��ٱ$�����k��=���$Eq�Ok�[��gE���h[z�im�vd*�`㎐����|�d�%w2S�Db�(f��e#"�~*��jй$��E��x����������/d�?�P�2�N�������:t����d�N:�$�|�=�Myx�O���/��4ގQ�P-4��ɢ �/���<N<��1|��3��C;�%��N�������7/�H�Gg
E���[�c���7�����m�8B�u7�J��ג$��l夥	&���E�=<O�������ߌ�U�>��,��R.>�ʀ�-̓'+V�m#��Կ~M�?3�b:��s�BU�d��R*q8#0 ��q��ΐ��g�WRT�����򚁪f�x����#)'��ߵ�%}`��[�=�|xy��?D
7�J��)�Mg�mP9%�D-��e�4�g���]qx�<�;
L��۾籒Hg*@:�����*E\�����cW����yP�r�A�����z��{Z���r�|A��C����ô���sG���	�3{��ѭ�,x���
�s��G$��J,�Fhٳ�e��2ɉ]L�x;oy+���J��D��=���e�v�cCVy���?�Y&O����r�(����"b?tP�v���i"�5����Ml��!��2�����	�AQ�}%��
<����^�Eߋ�JSv���5*-���
L0��4��t���
�UB�y �ހ�F���f�Q$��얡���e�
���y��5����N��tqA�V
��x��2Dڷ�
F�
67��hՁ���^��*uʦצ_64����n@j�R����D��0u�)�2EBC��ij��H�Qs���?
�j�������o�)�{�1׸!kn�}x�Z�� ׀�����4�H��cr���J���/q"3^7":��o�M)�@W܀8y�kz�zǚ��!�fU�!k�\�=���9�7o����-�r�i��ǵ��:o�Ϳ���5����w�3����O�� ����E�Zy�~9�8�v�
_)��u��6�@�By��Co�����}@(G�A�]�ۀ�W}�F����ސ�fN�����a@L@�&6],�<z~�C��.p�Y%p��I1�_@�^�	�S��Ą�A��`��2Mh@LXc��L񨧚ˀ��6���5Mf�2q�ۉ�Y�UEp���,IEND�B`�templates/hathor/images/header/icon-48-redirect.png000060400000002206152453623430016215 0ustar00�PNG


IHDR00W��MIDATx�C�&I�Ƕ�6׶��Z�5ƶm�6���6Ns\��|��3���q�U��+��AD��n���
���ǡ/z�x���d��y�*k�c59զ�:��+I��(�or5YH���g��I#��5絺{b��9���g�����Z@<1k/���t@e�+S<6s��9h�0~z�χ�ic�����*˕Mۡ5�=�B�B��Q�	�7�s�j�8<O�%��*���[�	��w#=1c�Q�	���cK��D�U������U�"lV�K®1�YA��{!·鱆��ƻ�N؀�q�����\sU�j�m%�bå�44��m%�sPϵj��~�(ap��J|g�V����!,�7<�qN%ܪU������-���6�S	�k_�����F�����z�a�E��>��z�ZuY��3�>Ѽ�R5��& Zt^f��NB�.�@�F�꺒B�EUj�q	�Ou���;,Ch�aI�I���G��
D�PK�Ѻ����O����w��~Z(M����A�~5H�+j��|1�y(Փ�i����y�l���ws�ᷳ�޷s�³�>���	 �����mo0Cx��N�t-��"���|��|�&��Z�]�5�G�B=���@g���)��(�n ܆?&Z��q���o+‹NT�/.<Jу��!\�OU�5#��.��0������y(r�V�О/�od�F�KU#���~W̐le�zZԌ�Po'�j�;q�74'`Ո�'CX��V�6�M�&ԍ�ޗ�_t��G�
��X5��b�`K���q�����e$jG������"<VtS3.�^��5`��Lǹ�9D�XlPm���c�
.|��
��a}6X�����Z�L�Z��"����բ�,Չ��!ڠ������A=V[
д�R��������J�;/7��_�qxB�յ�	�9��M�/�>�ѩ���T��G�1�u1�5���ﰿ����F��
F�\t���sb�I�j&�5��׳�b���az
!�D����e0���Aa�+�U�/�Usԭ�IEND�B`�templates/hathor/images/header/icon-48-themes.png000060400000001533152453623430015703 0ustar00�PNG


IHDR00`�	�PLTE�����������������������������������������������������������������������ξ����������������ƶ��������������������������������������� ��)��3��s�z�m�<��B��E�����G�����M�����N�����S���T����[��c�֙�j��q��w��>��C��H��U��Y��M��^��Q��b��e�Љ��w�՗�؇���y������{������tRNS06`ox������������V����IDATx^����0F��2sM����������(�|����ƞ/ɉ�G���w�Tq��|��	�g�	��ڃT�x��pF��U�`�Y���!%�N�}��Bxv��Bxz��Bxr��Bx�QC!<\����P��j(��5•�
�����d��V�4�­�Q�@��<x�С�>��!�nA����D�6�h�mR%�Y���V�jeYm����@C?	0t��$"��G��V��;��s �H���ֱ*q);&!b%�3C��TQ6f�֘2ݞƶ��{
�B@��>D�1`��<��C<����.��q�mU�(�UDYA4��E���{a��]�(�Hh�1�W�1�R���BVs������M]g��)�˧̯�P�e~�Bx�&�?�ۗ���P�_d�zC)�z���:�4�I�?f~���?}�WR�p҄9�4��u¥S����Z��d�IEND�B`�templates/hathor/images/header/icon-48-frontpage.png000060400000003043152453623430016401 0ustar00�PNG


IHDR00`�	��PLTE��������������������̦������근̝����������������·�����ǫ�������ƻ������������д����湺���Ž���������㻼���������������ް�Į��������DJT����������S!�����핓����b`^v5�����:/�����ԅ�����Ž���R"���f'MJGĎa�J�{hshS���
���ZZY������ �r/�e���������HE@�����>BM�ZĹ�k^I����xy{������*#������ƾ����
�y+_T@����U
~YE�����й��CA<���̑bxlX����~n������������s_���& ��w���RY0
\Q=���������_HUUSQ��t��kҾ����ckt���������k!(&!�����ռ[�iА]ZIDJGB}q]�yX���E
�����ɩk>�N��o52+���cXCEP]�ua{96
x3
���a�����{�L;W ���0'?89jig}O2�����t�pQylV����p-ncMYB8$$!���XZc����������K�}Q�S+�zt�n&kZB+���uml��|b'�tRNS@��fLIDATx^��S�3;��ɰ�mwӶ�ڶmۇ�m۶�yN&�vO��k_�u~WI�����3��;f�]s��.�Q�d$�;c�+���x<.��aI+�T1)mF`n����5s�� �p�9��E2��&�U�m�Vt�78�Pg<*���``��G�@|v��,w����ܳ�Ӊ&#S6��D��ϧ8D��7�{4cWx�^e8��1�`��w�
��g����v��D"B?�����Ņ�#_������1�G�����{�F30p�F�⦖�>V������10l_�����ǚc��>(
���C��(���mG�jo�߯_��3������"��ݗ�V����{���ӏ.���v�X�
8�Q�X?y�7���E�tK��v�1Ǐ�Kx�=��)wU3��+�_h�뮮ڎ�� �G�h�4�~����*�{����\�v~����%��m;aO��t9y����9�ѶE��m骫;
s_�r�Ef�1s���qض�lU7x�)���O
։��.��7����\d���χA����`��Jkk�;'0( F��:����##o�$!��쳪'p��_���^�D,�A��3���J� MAL
�X�`�o?[��u	+��S�q-@�����Q�`��V��U;|�Ѓ7�uӷ
B
h$@;�T�@�rQlK-}v���+�B$�%�$y�W6��4m�
i�9�jC
m�2(��:�|�18��2�D�Q�eJ�lJ�,�4�,JH�RLY𰉇#2n	���$#U����h{�F��i�<ϣ�K��KxSV�U�x�U�������?�E�/-�9�IEND�B`�templates/hathor/images/header/icon-48-writemess.png000060400000004045152453623430016441 0ustar00�PNG


IHDR00W���IDATx�p�J�u����
�������a����qC;��3�����1�7=��T�D�QU���R=�O����=�pUT��[[����_W�w��{���[a�k�ee�����{��A���/de�ƚ��� �ON�����!,�"���<�.D�p�h��������immm�ag�6S�bT��tj�U�[��1�rafy�d�x�/bʤ����a�۱Ş�����86��[
����KH��<�~�ٌ��9�{<1!B��I �vWW��kkk�È�{��X,hmm�bR�H;a�uL�)hl�U��,H� �]_�
�9����=�<�p8q��E1pM���@qq񓘔ä����f��DŽ�8�Y`\!�<�333�<�K�.��kƳ��>����������1)�I�C
��0���B��t:y�\�|Y�Z ���e|�ڊ��NjO��&|$e\X\\�2ڸm^����1��Z�z��k��)gԲ���γ|���8�u�5�q0�s%V��:����h¸��B�������>&E���"Do����J$���Y�6��իqE���<^z��K��_�bd7u{���мAfnii�fRd����MUA�fk׮]�K����>�o�;������e|�pF��a3K�B$''�g��S�F ��r4���m.=�����,ؼ�7\��ƻ�&�VF_��9�d�'0��ն�����lu��@��
�����W*�H��'uN��	o����J�63t�J�>�n�����̹5�`—˃����A|�ʎG�ބ�a�'M�L��>l�*�!3�'���Ʃ����Q��i�i7�D"�6Ӊ� ����A���r� S�!$.��
N���+5�vB��l6�;��ޘ�6774��AD�"�!3�
�=4UT&��E�4F���9�VA���Ń�͂�̪a_C�/�"�� ���Al�ń�-�n��	b�.�W>$�Oc�1��!�j~.|�Z
T�gARFr3k'��MU<��5��*5���τu,��R6��8�2RD3�L�2�&^���E5�4F�j�=D��Χb��>����lx�mt-�d]���r3�;1�H��"�����U��l;���ODwŷ����t������q�_�iv����|�H;�vBjnn~/���`3�`���h�Ck�	4~�_C[�9���N��8z�4��]xɏ��F�3`|�M�f�WB77󇎜�����ըY�ڦ��^a1w����+~�?��k��>��3�o9�gM
�&2�6[t�hf��?sC����Nh�����k�%�'P�7���
|�������Z��-^���V8�/��z�4s�e��|��J��VF�v�����X�a���K����0M�yZj镒?<77�ﱾ�X�o�6P���.��wf��z3K��}ʆo�6�g�M���%��3�� �4݋7>�w�ä7c���8�^�62�DeTSS�&E�z�f�WFC�r�&y��(X
�@D%6�P5<�#e�x�/2�;m�o3��`��ˇD��8r���
�9^7�u��gy��jh��%��D�W[��%4+�/����C0�<��c���199	zﮪ��b!>R
���no�4ĮL�@ ^&
�M�ɥ1f�~ӿHw�$�0Z�V�UE���,�'?��YxOdz� ��cAdwN���&��A]�hu�%��s!py��,1���iii��
�̓����3��̱J�D+���s:'�Wb�b�R�H�l?� �>�C�b�f����6|#��<�vj��qK���rX���J�n�3�!���XRFD	�ó}��c���()�.ζ3!�ܩ�}+q�-B� "��=�6bfBB[��?�F�,J��l��<::�~��v�{X��f~8�nQ��*ݣ�-9�c��Jii�ɟ��go��e���<��1�l��!|O	��O�8�IEND�B`�templates/hathor/images/header/icon-48-unarchive.png000060400000005717152453623430016412 0ustar00�PNG


IHDR00W���IDATx�We��6,�4;�ݡ�03����߿�%p�03?f��=R�֌�^��ޯ�e
U�[�.l�-�%��D�%��40`�3������0h�e7�2�An�q �rw��{�$|n0�Pm���>�b�}����R��.|�{�˗a�S�u ��ŋ1��1���l��Ȳi��8HI�iCk���qew���QU5�ϫ
ڄB)�zY���[o�c-$���*�p�X�F/	)����-�uU��+���o�qH�� !�`�B٬,W���ip����|`P�l^B�s`�4���&�r�)�������=?q�`�b�4p�2
gPpx=b�R�$����V��A��$N�V�W�eKC�WD�,���Q�<y
�J	e�E�ӹ��@<�3�J��1�M�1�nw
?� ��f(�Sc���8u�Zǫ&�t`��'��"��
�� lmnb0������"�qژ�w�A��ʹ��C��V�xx�hOw���z%��]��Uh0����dBF�Ę�o�|_��ͯXHD#n���[��D�gT	hErVQv������
��g���_7��Z�4����
��L,܇f�F�&(˒VZJYdY���?� ��ǟ�c�̙�h
�Cx����)�eb��O{�'(�����R2���kg{�<�v��p��9|���� ��B�L\G���,q2J��eiF�b1
�����'���8x�<r�
h�Q3��g��1���SV��Lh�Zy��p����‹/<��>����D���(��	?�v�JA�q��X,T��i(_-�;�G{�}.>j@�O��ѳ	w`c�Yk �d2!�� KS����6�YϺpM��"	ZA1��+��ʌ�M�0hp��%2ςL��?�,�������P��+��8E�7A�c�snkk�V�ӧO�v�G��ݏNѱ;8	:~��m;B����g�A6�
�v�t����=�,����W�ԩ�ȋ'N��p8@��smnm�@L���*�5��b���ZL��&� �eL+�Gt�UZ3-��-ȫ/��\E��Md.4���n�/_!N���PZ)߮�c�J9�N��B�m�{���ϳ����Ň�������)tT�x��[����0(��ó�g`6��n������MC+it�����:H�~��EDwvʓ���E��ΰh���P7����,I��5׶m۶m۶m�ֶ�ֶ���n���3�?�LOu%�D�C����k�%� Oo�l��'���=}}�{S�	�s58�ȃ:4YySJ�(
x�qa�u䦶��t�Cje����p��귾�1.�q���O?�}�����L��f�Ɏij�d̶��b��J%��r��/����|o�y����BN\}�Q��u۝w����δSO����u�o�9��?.���+}�M7��_i��Sy�R����f����+��6+2��i8|x�����J��z��滟����q�ƙE�M2��S���3s���x\g^|��&�lת�.��^HSN6��P��<�����;^����U��,0Ϭ�e�il�uԾ9�V��~�}Ɵ�cm��jz��O��������v�aG�Ke�s�����Jg^t��V_qq�t�N��c�!���2~ψ� �yL0�>�h+f�Da�Z�g((�ȏΉL�[�&�A�?�n��(�z�Y�������@����Y���W�_{��\�m���8zw,ɾ�	|�H1��s���"k�ˆ8Z<�Dq��)G[��E$��7��:�Нm�گyDϾ�<U��M�k4`��}F�w�(
��G��b��KI6C�r"��P�;��`"_�^0���u#��p��5픓�;;����%z���q��c�7�5CaVI�zȐ���<�f0N���C��k�=�����K��zᥗ���|�m���~�Yc�%|�����a߁�&��J���CV&�����ۘ�e���l�$(n�������m���>�3�R�/C.S*�z�cH'Kam�!�5��]��	@1�j��eI�<g��@�Ƀ���|r��|�9f�E�O3�&�h�h�>�eoRs5�D�,�D6.�R(��l�!��sńf	df�g�cl�Ѧ�غ��7�H�M:k�J"��"�h���hnaIP�l*x� ���E*�3J{`�i+���Y��J�샏=�n�ȯ��~���4�M�p�9e4j��[9H�ᡠ�P*�����������ʐJ�¹���g�]���p�y��o6Q�\0���H�|�ڐ��B��'0�HeX�!�0g�?�9 [�
�e�B�����q�����"sq�`Q�R��e�*{&�%�$ ���Ы`���f���_f9�Y�Ϛ�(J�l���
��?W��c�����/��B1'`!�S�ˮD��|�/�$���#GY%F��k6ǗCBa?����*�v����n���m�d�����z|ׅm���ps���	:G��;��-e8f�2��m�1�56S�h��o����O=��n�E3�2�K ��8�N3�����P���<>�/�� ��f�gêe��Jb<���{��j%St��6��/���Vm��kF�@����4�M�Y�s�������}-�ɣ\��k �ύ)�|�5
v7ܨWVWߪ��O��#��Z�V
%eXc��$�Y)R��CL&�#���9%����vq}}���#\��css�l��@�����@		�4�F�K�p��C�75�{w_Ka���Z�4��o���h�ޠ7L?��El�C"���=&����g��������� Ǡ* �IEND�B`�templates/hathor/images/header/icon-48-new-privatemessage.png000060400000005522152453623430020226 0ustar00�PNG


IHDR00W��IDATx�Yp�ز=�e�1�9�<�233333333333�c8��8fK���ՖJ��{����J>��ʃ������������1���9�	>��uC���D�!�0hH5D��Ɩ&$1B��"���f�FY�II�6�lSYZZZYPP0����4??�����.77ש(
~�����C?���nQ��#�'�����ܼ�>����˫(++�ZYYY�z���DN�999`�z,_��/��裏��!BHg��>��\�Ց��G����$++,,l,...q�\u>��Œ�h"��,��s6���fC]]]� �$ [��3g��]�p�m؉,-bO�WٴUr�x\��%�L��ގ��&���!`L�I�m�j���[o]E!��-S�LQ�^G��I�� �
ىf�d2�+V0y8���a�-�إ��m1�	E+����w�q����[�`�{�d���+�D��:u*�f3?�hg�uֹO<��K��z�w�uם{��|��`vo�y3�Z0D ����a4�߉n��᫯��FBH[�K^�^�?G4�uwwcrr�f���0��bNmuN��h�eQ
q��$��ҥK��5��0�u�`��EI���A�����R�˖-CEE��AO\[W<C2}���?�����X�-BWWR��������i2��G�Z����*����OT<��b. �7o+�/�q������1w�\p�S�C{���d͞F�>���6�L�i���h�E�ܱ��uvv��zKK;J%��
Z*��s]���7h�B֮]������3���z����aɒ%�s��p�]��É�Ο?L�S���#;���w�`zQ��%�a̫��$	�-���,B+ A)�C~W*))��d�ʕL�#�i�Qɘ�,�#�����L��?�opX���0=��$ b���><�:����X5r4Q0����@[�Whˠ�^ƣ�{���{Y�VpK樨���o���I���2YďX4���9�*��E<v9	��Ѵ�Z��eĉ�����ڱ軯�~U��</&�A��!����J]��8��v9��j��|�	�zss3{�I#
a����}$"q\?R�����Q�����(2$$�n�NDpӒ0��:��6�b�	I����d�{��%���r
���;��%��y�3�.�R�N�
E���S["��p?��I�8����S�⃘u�l���ּ�q��W~{���|_�Ě5k��ցs��/555�}�2T�
�4����l�0
i�ͮ8�aGG��B(ǃAO	"V�X�ob��*ņ���
��l����-v�j'��[	Z˹�9Ϟ�H����.�GV��=,�<1�+g2���:��1nw1y��V~��q�n�X�x���h�y2d,=�ʋ,�����3/�Ew".:�ݎ�2&��m�M��T��K�)EXYX[<�Ʊ&�W¶U1�J#�P�I9HJ2`/@�2�oR
�*�.tG�=x���8$�O����Cez�F6#�<A�&�'�1���a���q�=�&9m��L�[h-R�!��"�BF;J�I(&8��:]�7[7�an��8
�VX�Y1n�<�y]'@�^6���R��
1�+���䙰J�!�ӈ�L��B)��x�Қ�⑐�>�\�މD����JK�w	��Hb��OH�
�����Lq�YC6%D���'D6��`��s��>2�;�
H�b1�'�u���m��W��џk�:������>&6�eA:3qH(ғ���D�����/��~��#EH�jӾ�q�c����0�\
N'}�
�|I�4��pD°F&A.�xJ	 9I��IM�������í���:s���%1/5��������S���׵GU�W��F��We�s
P$��D�y�R9t^O"�y�<�j���@����`�F3�v���4!��g��b�<��<O�_Nzh��������kh}���g�A�K����<�n�i�1.�9�Q�<'�B���1ٱ2�FI2Nw��V�;,e��P 1M!�{�o@L #�L���3�p8���� u� �D��%&Aᆪ��w�>z��9
�|U��L^�d	�t
q��Ԓ��y��@�͉UIbJCf��;��:��s��k�4��	�����7?��@���S,Nk�	�===A���}Q�x#&������������s���C���P� �`H�a<T'�Ui��n*��:���6Ӵ�9����A���V[m���y�y�W�.�GFFbD���


S��fbz�:$R63 J�w|{EJU��6ZQ�k�9�
���N$$���U����'��U�xY�c���`5��@6�CRC8)��3aߑ_��>[D��|���+�=#�'`�Xb�	đ�����@<��$�%z�A�z�;|j�p��m�<��A�84�	5�9��	�6&l@hקź
!�P��^v���i�s7�L<g��_���kj���[�U|�0��ø���3��^��jZ��������� � ���T*&�*����]G�(��КA|fՈ�Q8k�}�e�8��KwE�My�ܺ(��[�����|���-�e��%����9l��w��7�|M-�	����:�^%�7;����ڦbM=�#�5k��ZvM�HǙ"=�5�:S|�k�I�z!&U�H�|QK%����9t�F����?�6E@P��]�
����8�h���LIEND�B`�templates/hathor/images/header/icon-48-banner-client.png000060400000005550152453623430017142 0ustar00�PNG


IHDR00W��/IDATh��Y	l\�����]{��'v�I�1�:4n(�iEi�����$*("���*Z������H/$jJEU
��AΜ؁��sxcǎov������Y'>r�I�fv��������\��|�^Kj>]�}zRka�X���'���G���y���Ȁ2�z-́K&�N�������=͈<~���V��
�f�i��%��-��=�	��p�o���چ���	F��0�+�����Z�'�F��쨮����T�RlE���t����g�*s`�m���~��l:����{�e!p��w7�i�[������?�O>�‰O� ��,��k+q㽫��}8�'ML��?z���}�	�������w.�jP�|�st�D��X<��p=�y�C}��i�?7m���KM@��5,�v��g^܏+JA@*QxJ���W?F��i��p)�o~�`㼒�ڛWT�u�q$u�(�CJ�����;q��;���4�w\2O�r���ck��w��g}8��������햶�(�w��=�B�����T��k��○����P��mX��$�[���ͣP5}�k\翨
^9��XC�Q+�(�I��$��f��1	��t�m�m�ؼ�`������va�ω}�G���,Lp!�+��=���ўS��&l�K]B�z��":n*�a��W��`�a���X!&u�n@&@RՑ�t��<V}J/���{(��/����ꖕa_[#'6�����	��5+�o�R�u[�6�����0DB�*���Qm�Yk⤠I�Q��$��(f-�"9x*i����8M���N�\Ih��eS���q]U1�U�ݞ:r�qL�T�Ppg�:X�K��K�"�,<������5��,�<��>o�K�R�E���N��	����9�7��p��@8p����=�f�"$�Z��)�)�d<.�Ό���S���!�h9:�"�RxDPJ8�p�1<���B���	�O$a�TI�	 �|g_��g�E!�f��ְ��F�F���N3��(	��<q����E!��/i���ww�Q�2���xrN_�*d2�U"�T�D̓}q<�evޯ�H
�T�65p�/�[|�c*�X(��1.���r��'�<�B�ZU֞���/o��a~��	P4q`��1ԗ�*��Y�9
����x�u�"�e�+�' ZTҔP��aW�w3#1J@��
��&^�,��g*��9�S�)"*E��e��K�V�T�>HB�P��?��P�F࿾��T�k�	��:E(���L��'�[XjG�H��l��qGo����o�sjg���7x�����%k↑7�[��L$��3��u�"�H�|��Y'Xfֆ�uA���8�,85��kE���5.������`n�>��>�f��"I�Nw\�]�QP Y�i�c���V�"��p��q���J,	�����7=��&���<�o�Z8����!�G�����~<����bX�2�[ ��s��f�ɬ	c�`���
i�X�"V.�@��:�p=}�xh<8倨����iṼQ�e_?X\������J�
�P�D�,���!�Hh:x-,bE��eC���� ��	�V��1M�I�RL�{`�dW�uvX%%U��"���e�y̸���I��/��/�B&?�9
R/� Uǩ`��H7�
?	ڴg�PC�0c��/4���FU�5�x��/)D�Mı���\GǕ8š�R��)�*߭�[)�k��sÇpk�0�
���D�@&��>))i���а��ț�Z�
�[L�$:���x"m(BQ�$�,��ڙ�D�B}XhE�r0;QL�
�H��d�ƹ��<�i��{�Z��d6�i�ꎑ�j��#� ��2ܥ�t!#�ї����ӉE��@j��,��
�t�)�JPJ������*ҰU}w��x����d�VH�*���I12H��I��X��y��-D.��oy�v)�%^	��~���Ӡ�����0�����@��2	���*�,cfy|~Ȯ(&/ �J�����PD��QQj��L@)�ٱ
mp*;���8��·��œ���I�@�]D�M��������͒�h�^I'a�Y0���=��Dw���rs�1�s��lm�Gb
J8G���|�>�p�A�O~�(���s��83��َe��D'XRi�_*tF��s��~x��I�[	��8*+*P�T0`�A �ׅ��j8�6V���9�>��e�9�����(J<.TT���^d
No�(�G���tz-�g��~`�=MjR
pi����U�Y�R7���"�n��$	��3ft����F4�D�kju�1#���{6�B�M��^b�(����3"��IUm	�b�'l6Z��b
S�=fs���l�6Š��(���g߃K�_��/Ok
x�h,��6��Y��cU�4zYc�
��B���^d*<ɋ�b�<|XX�d��+���G>fP��΢8��$#U�K6٬p2#1�:B0t\�����|
���B�̘�UbG��7��-��r:PS"C��y.��h&�q�4!��L��r&H�����֒��O�m9��ٳ��+�&GO����@R�����X�I4|�ߧB�?3�H�i_�-V:��Q����-G9��8z•S9�B��t��f��'ƵL�#B���H��+��bN�#�d>ИN��2��<�d�e�D���wJ��IEND�B`�templates/hathor/images/header/icon-48-banner-categories.png000060400000003651152453623430020011 0ustar00�PNG


IHDR00W��pIDATx^�kl��wf��Ǯ�6l�!m"p�RD҄Vm��&-mD�Q�DmU�C�R)���"��QQDR�*T@�ڴ�A4D�nl^��1֎�ٙ����W؅Xa����H?����:����S}�9���~��k�jty8��6X�w_��x��i%�������y��V�6�W��@��r�-,#X�x~K2M���I_�;�>ɿu��f�9�^>�L��uV�����]���5.��]_��{���2p��tW[�~�H�r��4�u��Ӏp�a]��6R�Cz�?�.I�1j�������_U۰tQ��C/��z�}b��<���dFMNh�7;��f ����5��6�׮��!&�IB��:8a2bZ\7[�u��"���V7?���~7ng�G>���H����1,e>KYy�n~�-g8~ ����[��ޔ�i��=W�͋���7Ĩ�h���Lz��m�]��,�qQ)wFt�Nrql��Q354:��2VmeH�]��:ƅˣ��x~�A
�K"�'>�_��ﷻ���qg^�B��W~�$�oݾ��'߼�6Bs�
钪��
��#�XV$ft$Y�pm�b`d���F�W���S2زi5w�v2ռ��_��,�C,�S�6E���1n; ��VYG2f;�ꗴG*�9ݨ�j���i��h.�Xw=v)�}�I)��������
H�L2fI/�xf}��i����Gh��J�a��N�����w*� H�XԖ����D���Zp�ȩ�o����P}-'R����k?]��o�h��R�)�R�6�T.~�SF}����X��Dm�R��}y��	 I�Fl���2�jCx�^S2Ղ���1�.�x��ܶ�:0>5��"�2�ڐ�IƦ��u�\ʊC�_G3���D	C�c�Zo�qP�=�06��u�6ԡ���:fif(/�Q�����^R�QjJӍ��S�&����0�(�
o���E��J�"4��Se�8��U�u�9�wG�{$�fw�g�oBzwb��hqe	�H����ԯ�\���S�}��t�,O����w���	.��,�;��-[�����
��#T���݌MHR�u�!4�aEECH��VtC����i9���X�K,�y���L	'��n��܂t>F;��x3����*7h�+fi,�ȤĒR�)l�.�iI���1!! 4X���&�H����~V��k\s<�
8�
*�#�Gz
�8;��21B�~���$�"�R�o�9D��J�\"JHLdm�J
qmh�GG_��le+���$7R�v�SW��V;J��1�K^@I�=Tr�Y�;�{9j�ᝫ1�#�8K���{�Y���z��ݒ���ph_�k!�}}�x�����'x'���������gv�l�Ρ�%�f%e�8�=�T��M5�w�E��/�F�|��~n�y��K�LM�t�(�,io���a�hO�9!�j�����(�s�a�[�S֮[j@
��m(:�0�`�C�L
a�R`��ӌ�\f����9�L�-�dn�ю̑�����h��E&�,�"N�E��7�PǨ!)��]-����@;P��|���T2��bcg�|���J��u��p���|h-X)��S�|�~eX�7?��d�N d'����ԟ���:q~�p0�N.Y��_��
��O4��Mj��l�50�i �K(@	������>������p�'XӾ��5�B��B�!g�������o[K}_��*�`v	e�f
�.G1]�OG5͌`���$`+s̡fl�
��߼E��lܒi���IEND�B`�templates/hathor/images/header/icon-48-banner.png000060400000005642152453623430015670 0ustar00�PNG


IHDR00W��iIDATx^�Zl��~�ﻻ^����UJ[z����(��nQ�\Ж�ˢn�%�-s,�2�9Ȧ.�H�D6�Q��

P{B�^j��r��ϻ_�{��Z��{����5����=���9���u�Wݚ������5?��ݿ�Cp]<��;��p55J�k�TA��d���]���֍h0��'!� `��b�CW�j|%���U��²Mr�Y��3��b8�^3���14��@�A�.���E�Iژc�t�O�I��škù3=�x�-�N"�ȁ9�W�Nl{i�/�Zq��GCF�:x�w{jl6����nƭ3&��ׇ�=������B��2�[z;���	G������ \W?��J����g@�9�n9��3��
J��+ƣjٝ��~�~r���X�k��f�|���ܹc��	�JsP��(��B� pp����G��?Zк��n�G��_o���n,ʷ���?8���a�qN����;����޿{�;��{1H�
�̻�6�d�<u�>х��Ac\h��&8g�$���φf�l�C�:�Gm�N�l�c]�7&����{��G�,�Z<}x�/�f닋p�:Ķw�.��3�WJ�;rͬ�e�}����"�
-��E�f1�}�A������\Y���;�yh����/!��.��8U�8��bh1�����z�, �/���Zjze���fIf931͞jV	n+��\0���A�t�W4�U
�	63�1��܉�‰q�湜h��fO/BS�9'�m^��?f�͝���2��]=Ł�N+�{C��¦3}����(��09'�Yf��&��@M裪�[$7�R�>��ނRW6�h��5I�u�ou�0��K��W:q�?��=�q>��QtEt{c*./�L0�V�Y�Έ����~�QUO�e�<�m�:�Ȏ	$`�!���ٻ~6f�<n����
�5]Ž�B��J�Ј&��̘�,T���)Om���*':�a�q�T���;�F퀄��hh�� �p�2ep�"G�@rׁ��c�i�8�E&�̆Fd$��k4>{@�����=��\�0 �p.]Y�Đ�E�
r6�����߃��+c�:-��Ι��|S�-(�p&�g��ԫx�kr%�s0y��7��֊����D�	+K���7��pW��I��#�!bՔQJu"�"r��#
��P��9�F
�t�k	����:VL�v_ظ="5�W	�|%�D)�L1��n�������t0\��}�VקE���躖��7�Uz&Xa�$|�����a�hڔ�+eȒ!H^N��6"��s�����/>���u��mzFH�[N��)ɼ��DX���Xj��H�,I�p���A6�`S.����v/Xp�#-�G�^p�=�G&���6���kM�������Ĉ2�Q~?t��*,����wWyT�Y�p|C(α�v$rA4���1�C�\q�����K�$\�B{nn%q��yϘ�ӫ+l޵�"��A�Z3-���F�1�:L���8��S۶��S9
#�� G$���b��Xռ��k�Տz�v�欮7�k�(-�9/�0"a�zNA�Ȓf	yD�YFLՌ,ܘgc��%N�z��DQq	Ra�Z!��F�<OE���U�l��n;�3��FXj�nƼ"+fd`Z�y	2�����'Lwd�s@P4HL\���880�|gf�� ((,�]Pu��Ύ���C`Do��7����E�ܝ�m�!DT�L�FI�l�V?돢�?��@AU9@ԑ!.���"�jB!�Ƨ��sh�
��i*h�HD�]�)��@ ������:pV`����9+�B�� �jF�`��$�e���$.{�p+��
��!Y'��G!���K��A�8��!0�J���1����: \�ܞe���Yx�;@�i`�7P���������U�M<}��ȱۑ������Ue9��x�P��/�8�R��/
�n�
O�'hݷ{՛������L&H��$\A[(��b޽��J�k�����;�„~̽��g
Ff4/��I�J�`:�ȴ�<�f|͝6z��_��kC(A�3�
]գk�d�h���b�nl���Z��:V���*�y-5�@0d��7Nt��������
"�/V���*�A#	2�p(N"ȅ��U��&`ْ�>�yc D$EYi)�FႮ��5PPg|���*�Z.\ a�Y33�i|�h6��A�adgg���ijxY�#@`p`�{���!@�F�%�9��p�֩�i���딸�1��j�R~��+1�|v|
��X4��F6�c���L�+�i}��jچAr!�`�
� � 
8~��.��$Y��'\��\9m�-��	��V]��4R�R~�cI���"���<Ⴂ�El&ɵ�@c��W��A
s4��h"npQ�Ӏ�?����.h�qB`ɰT�ퟘc��ku�4F�B�|G.J��{�[�̽m�[>�
���hZ��BtN4�mt-c,
�~����������:�fo=��%A&*�z(x
u_��s%�z������i@`�Ht������(tTx�hN��3:QT�qP��e�8@�ߡ�[���=�v,���B�0�Z
�}μ�'���ޕ� ��!H%����nb���S���[6gκ}��9�����kk=����C'f	��p�ĉ=�G��h1I'����~��M�O��5f@���%^nX��� Or���C�L4i�������%)u�k�M���UP�X����ELP���3&9���']4	�)�U�/��:�(K3IEND�B`�templates/hathor/images/header/icon-48-default.png000060400000000601152453623430016035 0ustar00�PNG


IHDR��h6tRNS���7X}6IDATxc�O"���>��5��|�������j�s����ډ������z�+j	����w����2�_
����~��r.������޽�
/�}�M���įﳀ���4�p��
^�*s��'�zr��N�o�">�@A�_,�~��1?]���g>p���.@q��jx���~��ް(�ӈ�zuI��sÏw����_�[c�Sß�G=�vPvӪ���^>V��؃��8������?�~�8І��wc����=`h�;s�P0?|��ڀ>�4Y�D�]��IEND�B`�templates/hathor/images/header/icon-48-featured.png000060400000004714152453623430016221 0ustar00�PNG


IHDR00W��	�IDATxݙt������M&�!k	�ȷ��[wwwwwwwww�m����$��ǧ��d�O�9l�S���]=}�ߺ ���}�_Hh�?�!�9#G��occcv8��!;;;����ׯ���o�}1A"2x6(�m���	�̙�r�����Idy��˹����m�aɒ%�@���^"���sޤI�^?~|�^��7��������Ȗ�����>_�F�mK-�|�N�D"��jV���e�e����'�I��ɓ'���Hh�=z�H[����U����K���yd�"�	�'{j�I���ՋJJJ�%�o!���ݥ�Jq ���g��g�}<�	�5M!;)��|�G��|0��￳p�B��I'2{�,48׭��g�M
Q��;�3v���u���I�4p ��3j�H�|�u�2��/�Dv��d�}�W��ew���*d��̙3g�3GϚ��e�&$1h�y�������i-�+�/��v�!�m�����v��m�.�7����?]�BA<�ة��p�z(C�GϞ�l�%�JJ��ۈ�Թ3������f���ٵ�M���&{.�u�Ν������W�^��9眭עcl�".//�������lIM!'��&N��`���3L!��J
���HT��Qd3�v��Ȏ���'��w�fڇ���oүJQ"O�Z�����	&���{�
S��z��I,�PȐ�9�ڷ��~Rm2D�WvG�
L1EH
՞��(飡uF����3�8c�'�z*鐗$��N^�ڐ�`�G��bŊշQ;s	h��矧{�5�m��z�����R���ڥ�:"��l�9�w<,�REQ�M���u񥗪��Vl:����j�)�~�ر��`e�DR�5�F�=�֬��	�}�#�}v0�5w7{rM��̞��t�ؑ���[��=v�ЁҲ2�E�U�ȟ&PaE��W_���/_O�$�����=s�KT�UBY2�$J�`s3B��[k�v4��JC=��(R���V�1@L�x��y��)⽍�
�FH��m���L�L����q�EF���wo=/��A�̾F\����~GQd̨Q\p��k�Z�m3�a"��pB'�2��g�Y^�^���4DNX��UU�v�*
z��i
�L��[��8���W�p`;Ûw�!�¯��}*�|0J��f�<�<�'UW#B�D79"l�jV�;�,��DR�е[7OMd(�0�#ʒc�	�f�l���"/"nOwȋ���>����(.�،.]�j�3��5����2|��i��wJ�T���1��)N�mjv>���ha5��y�8ݓ�mKK5�-�3�2�'��̄܁z�<�����J�""��NE�"D�I�J�JZ��S�LQ
h�ۅ�E��Ht�҅m�>'j���.��kWA��uA�#�<�-F
���Î8��^`ǝwF��f��n]m-�o���G���W�S��|�!3z�h7���ZCbgCP�IB�N��؃-DҶ�u�ݙL�de��j�6��Y`HXQ����ڴ����H$҇$ԣ�5v/��v�!�]aJGLaa![��nj��5Vz�^�{Z�7�,���햴�,|>�x�*?�]���@s���a	H{ ST2��}wvk�|А&&F������!Ԅ��9��ǖ�?&��.n
�?�K*b�o�� ����q�wJ��M6��=/�a/��W�-���!��6�8����߅P�9�$��M
ֻ�5�ޟ���ʰ�y_�u�Sls�mK��~xsd+
>�s�}���T��8���B�~��Ԧ����!!a�l�^V�5W��t�"�)l��ʉ`�`�-��6`�=�\�7���˚R�%ײ��
C8���]��nf<^J�����۫O����q�jxpp%��-H�mY�#v,�:��eͩĝ��8G�P�cwiO�m��O��XJש��_5�sԝ�X�}D2x9��Dc�VNy�gz_{$"�����@Q	��Ek���єJ޳�p��c|}'=�
�}��7n*};���i���q"����{��aYYq�#����,��C��F$�|�Ʈ�lj ªO$���)�u�g��������!�H���pPY]Ci���n�5v�+���H�P�X;/��۴!';��gIc��`ǹ��|7�	\D��ĩ\�����^c�R�ޣvc�]v��ɣ͸
��Z��#�����������999d�B<�9D:ES8�����U�7i1���"a�윖~��a%҆6�\�x��E��_���ç[���6�׾p��QQq��������r�'�D��Z��e!��u�|���i�ɬN���諉箽�5��, ׬�
ߑ�lmm���G�U([����h��V?���@\F�-��H��u��IEND�B`�templates/hathor/images/header/icon-48-revert.png000060400000002374152453623430015731 0ustar00�PNG


IHDR00W���IDATx�W�,M����m۶m۶m۶m۶m�o5�]�_e�ӓN�n���Ҿ����t��5�y-�L$$��`�_5$W�O�*����"=1��DF(ZM�*���Κ2�+�?�`�I`��L�1�+
s.ּ~9,�so�8>�]7|�n}���$�[�h�����!Y@
�P	�\�N�{��4�,sޠ�
�
̵?C����L�~��(��q.�.;)}���4Lԩ̞��sG$j���@#A��햭d�
������.NS�"�J�,�eJ��U�ͺ���e������1�Q��k5d���Ww^��V�JD4*��Ċ2ó�
n�/םN�%�%7ψ��s��O�=0rǫ�ۯ~��ꉪ�= xl��^�q4{����8Q`�`�{��y�|���2S�&�R5[HZV�����Q���]`H��R3H8' �{p^L����;����+%���
>/���Q [�N��}��J n���q�	��2����Z�7?����o�q��>*����SS����f��K�9U����g%�G%\A)OF�W�*N1�\�.2�s��772T�U��w��6����#��+��Lϋ�^=<b����QoW���r3"���������#wˀ���<8	�p`f�>9��4괾�!����_6Vxq�����
�:&Kb�*�W��ȼ�(�Dޕ�|r��%w�����&~�p)H��7=�|<S��/~�
s#K���c��6}�����p���Y�ԁ��A�L��W�
:�C�^8�<^������I�o?mOQe"!��]2�P��Sy��'�^���JZ�P��/�<]B��짦��Pq!G�OJ�x]�Ǚ�s�?cj8S!�O�4��_�H*�iUj|��.��K3
�3j5���|���:�|�GN�\]δa�Z�"�J��~�@�3�߄
�)b70�î�\���wo�
��R������	
H\� ���Y*J$�	EL�8���1��O�.�	�~�<%ڴiM(�~�f�00��74,X��d��f��O����JP�J��*T�3�CSˡ;s�7����:��Z�Π5$�9ϔ�Z P�����cn*�>���}�y�(@��\���m~�h��+�&˲�n�[B{�nj��-�"q�A<Դ�G�������g�ek�RfIEND�B`�templates/hathor/images/header/icon-48-install.png000060400000002676152453623430016075 0ustar00�PNG


IHDR00W���IDATxՙ�-Y��s���ڶ흵m��m۶�Ƴ��Cw�6/NnO��Fŭ��{jb{��52�������H��oR��YtE�w�Pl�����ӷ/�Z7�"`fb̕zm�V���
�4�x���>�vbqن-KI�ӝ���p_���/�Á
�������s_S��a�r���s�N��d�=��D(���O�����Y�۟������Z�����m�(�ӅY>rl[N��m���޷�r��iŚQ1�j�Z�.��5Hm��B�ŘzA�l0� ��cÍ��]ԟw��_�j>VGM���i����!��=Gub����%Ҥ�W`m�%��7�=�(��r������O;�/���$cDS�s}p� �cӄkW���y�=`!�M������qѾZ[�I�t�W�_��Ey>�>b�LS�L�����c�4L�j=�qb���=b���V�i�S�(��N�a��d�=t<?
!������;o�{z��Գ�@�V)��f�8ۇ�/����[��e��@�wy�?�F�(DZ��`7B7_^ �_g|�F���.��{�����7Dud'_�	��B:�~�I���\,���ܓ'�z3��\�2z��
P~�@�Nb�Z_
I�q�R����S��^@jUD�q^;۟��y���Aw'�����$,8�cob[z/�":Ĉ@
`a�[�*�P�.��*��פ�̙�(z�4~��]��m7o|�ø�-o@DZ3�h��AL&
H�
���������D�
�F7rq�1��à4��yɠ�e�u�J��\�+�'?��N��\�3�(��0�!�רк�;��v��ݹS�C{*��u.Ͻn��Fڏ��0b�R���<�O}b�8~��8�E9����r��Ȭר��G���\7j�ʢE)��W�Hϼ��k0bP�)`u/$(7���6g�;��'�nYuI_�u�1B�{l]���!�+#���A������BH��V��-p��l�j���Wh2_���vlZ^�"�_�T���h_m;��[	2U`��x�Ir�m�8�}��g7���Ni���@�
��8G��.�}��4265�+?�
�.�s%t��d�ȴ���_��߼��4�}�'N�%��W�duCvm'�h;r���f|�?���SZ�9p��ޓ6�$�{�惿�+��o��x�w~�#�+ A�Q���J�1��V@i�N���������Pb�l��zQ+E�h���7H�@.�
�ݸZ�Z���J�J�y�R�l��d�R�(�p<���� Х����g��Q��ڹg�:Y"b�f�h���jm�$?t�
~<���S�H����H��î.>�@#[��KY<�
�O���0�z���ԣIEND�B`�templates/hathor/images/header/icon-48-edit.png000060400000003501152453623430015340 0ustar00�PNG


IHDR00W��IDATx��lY�+N�c�͛l��ض_�w���0����c۶m��ڬ�?wu��E'_��:��ܦ���_��m�e�"�S��g�A��C�]s�^�PNe{�c�ɪC��#��c�p�Ԣ����Ț�w��f�6��=����L��&��N2�v�/Xi~uD�BF���P��-PX�\�پD��q��c.,7��R,��@/f`fb6v`�@�Z�{� ��:��6����ي
�Ub^;�;
J���%a]���]�1��;}����������M	Z�X�"�w�����OT��rI	�9����;��H�[�@>��%�]��7Q�c�}e<������^`����ͫ�;�:�S,+qdYerl0Y%Zb�}��<���s����ڪ\`43�_ʪ�Ns���E ��zP�܎!���c�}%����}�����\M�r��4�Yo�g�����8*X��1V��S���wq�[&&x����#3���A=+�$���d�B�ٴȔ{���h�SS���goo/7;�|o����I 
-�3�`6#��ZΟu��.��Z�&�{�Vی֫�d�_HAKd�]��9F�<G�a)c�s1w��t�'�+ty��3Ly��&���Ș���2g��(*U�A�'����t��/�
:NpHAK�M�KdJ��
��د�Oe��X�?��c_��o-�i��&���H�B!#F���(n��G2|!�T�HAK$O2�ɑa�(��}��D
Z"i\�&1\�oh��pgC���H3/�F��?�A>���N��%���7E#��|����<�HAK\6o�F�+4��#Dq"-���8ŏ�Ġi���"�D}T�pHAK|4`�k�,1 �%��&ݎ��>�hHAK|�s�>�c����|*o���g}O�?Ǐ\��6z�0��&���x��6z�Cn<���8��z�<ڙ������R��ؐ0hFqHAK�����JӇ�,�/�Jx�+�{�qk�ۼY��	���8�Ni�M�[G�60]�fz�^#�/�׹��m���̥�gy���?ˏ|����q]�Ni�M����飖�h+�;�(Wl��3�w�bg�j۶m��D�T�<���߹�{��G�{{���n�����_���	e��XR�i�Gڬ��iY�d݃���'2�c4J�W�>���x��
��~���t�벳�8Fd.8��"�&*�ݕ��>B_Z�Qko����
�9�ུ뢲1Qm��F�D|?�-	�
o^��l*�l>���E�u�3D��G��8Hd(|\�Ӽ6Des���"�n�mD��2F�tP{�!V�Rlj4��n�y�����l���G��7��j�i�<,��LT�F����nʈ3x�QK�0/�-���K�7�tH�)"�W�Z�!(�rl��LcڔQ�"D5�u�>��;ߊ��[�<��
�У C�awt�zX/�)�3*��5�<��A�W1�D\;�i��ggN���c�[�Q�mb��%��}��:���o�>���s���Lc����`�5�m������IR���o�:�N�"A�!�k�DH3��s�
��N�,���|��3w\r��,1M�}&�2��S�F�z~5`Ȁ>]�4�S!�{L��O$8$O�#&�i��2Q�)8�E��iҦK�>���Т�S]��+�,�&N�0!��Q�$�f�U���K�x�W���^x�k�8��ß�}v�b��!M�� a"�H�b�if~�)��f�EV�`�M�Ya����S���kUIEND�B`�templates/hathor/images/header/icon-48-config.png000060400000004417152453623430015667 0ustar00�PNG


IHDR00W���IDATx��pO��P�Rť.)���.��zq�;�m�T���N%?��� ��Ix�υ���A�O�5v�3��K����6w�g��~�
�:H�
'�6N[6L4c�,��U3E�V�@6�S[*�fR�.��i��r��LY��g�i�v]���>���1ȴ�b���)���Д,����w�E���`̂�VA�IY�m���
��;��+�o�8��F�d���G�k�.�x�
�
��X���֢p=�CB�@�RiT�\������'�C
���6scˀ4�ï���;9�xd��P�~}������&��ϟ����9�S�����t�_�:�_����1j�	&8���0��`��\1��"
�s��^�`���g��?}������矐���8��x�i���+�{Io�1]�������G�
q��'�Q
l}c�} �ؗ�!2G�����w?^�z�޿��~��eg_"!+��_`��9�KS���G�C��\���s��+F�g@0���b߽2�����٠nRitN~A!������oǟ7l��H�tj��6l�����C��O�}u�؅S��;��Q��t�y	�gV����3g͉�y�<z�
���ݻw���1�,�J7$BV��M�Xy{p�3�������*#s٬��1s�4B�ƍ�����g�/���슐� �g��`���nd}���Ce���a�K�S<�H�
�ӄ���C��H�qx��	�gd�5�e^�U��,Pw���n�o�&<��h~�`��*n��ݩE?qҔ����"8z4k1Y�R<��!j��9jY�%�n��̓���="n�Ӻ�W���FL���.>�?q�'Y���jkz�٢��68���w��mu�ރ��n@�Mg�������[�Ǡ��3g��e�[S�
\T�u4��
�͖I�;�{�Ȼ��i�M=�6t�~ڇ���>�0h�f(�l�� <q_DMO7]�#!�Pޠ,N[�V�u�u���2�5I�yn�m<���uZ�����y�o�mBN@��a��Mĸ�]�i4s�EѴ�#�*�=ȼ�Gƨ�F�����>��r;�cd>Ԡco�9��>�dFB�uq��Fu����k2�xZ�����Q���4Y\�$�FD���6��Ty�(�ݤ>�����oZ���2���t	Zo��Гt�ɵ�<@'I Ɲi;4IYm@y�-(PZPW�y�.H΁8�$8�㧿�b��S��;������N�58j#�����hk��`�ߨ^q�
(����p�6Z���c�p;����
s		Q����=d�<��"=��N'������P�I�*�2�ӷ������8 �6�^A0�O���?Ka�(�
�V���;]�$H�iJ�ܧT۷��)֣�J�m���/�Q�c�L��+~M� e�(�mA��G�5�$��}4�?d�&s����G@�^�BT���Ս���l@�����)Ԙ��_{mJ�}+ԇzv6u�&k�� h�K�0)/��ů���kJ�"���_K�Na�|:�������І�GD>u;�*�]|��i�2�9�R���P�2fx�XB��b�,��#�l3�~a�"
�L���ԝ�w����{5�Ъ�#K͂�)M@��T�+�)Ը)�߿.��Ѝuo�K?����Ө���&���+�p�[�`ܢ]�c����@Â]j�J�jI
���k2�==�lB=���37��$Dǎөu�"_�]�
e$[�q�h��e�<E4?��k�1{���o_�f�J �15���&n��!D�)jG��^wN�+z%C��B���1�d�f��7nM���U񦠊7a`�f��`���	�.j�:p{�YL��E�	P�P�A�9���N!��+T�uAk����1ƌc�„������3�E*��Ï�1�>++�A~\����1|u��>?��u�BX���^��1��$Rn�L�u�e�0�
�g
K���Se_��j�1������a�,�3!��s�p�����@��T��n Ⱅ
�k�D��������c�⫼]oL�D+<sq'��S�m3>��v���u�
ۻPw�W��"1��A�R<�L�P=Ԙ0��[*�K�p �SwI��L	gF�LN�j,�B��
.a@��Te7”�	қ�y<����=�#�
�L���g��j�Qh�q%iCuIEND�B`�templates/hathor/images/header/icon-48-readmess.png000060400000004655152453623430016231 0ustar00�PNG


IHDR00W��	tIDATx�t\���U�Ƴm��m;��W;vOԉ�6�m?o�^�5���!]��Z������>ߟ'�>�|�qww����f��D�e�&� )@RR���PTT___:��耊���'"##������*���(茛��U��-�/����dTVV���VQXV	��<:���r�s�΍��ޠ�� �{�h�b���A"2ʰ�;?9�����[{5H/(��zgg����1@(z�d�F�%��Рǯ�&�z�;�r�Z���%�E�CXZ,�!�s��I�h{y{{#&&�6E666>���ə�6v���/�N)��+1���`C���NNN?�����>��w�2z=�755)������XJH�)��Ţ���98t?�ᅌ�fqqqpuu�&OC�A7�������gMS\�<G�t��������R�J
Dvv6&���Q��������[p����#11�j��4����

BZZk��T���8I���YJ���AVV�߿�,!>>w��Ahh(N\����.�����h4
�"$$~~~�j�5�O	N
�8�hII	�� 77�hff&�p:�y�~�(F���G	e�Q(�}܏A`0��8e3�
��Y6�			`��@zz:����Tp�0�Z��h`` 5
e�Q8��z:�2bY����DeS����mbf���ȈFDD0��H�
eD���e���:��TX.~t<�vE`�v
��G��B�>S�ܯ&�q��^��oQ

�`�0��{ݨ*��H��F�L���e�L�"�ZTT�z3���O�81[f���R̴S�����ܬ��#�2q"��Mݨl��Ũ"�
��$��z3�����H���x���oii�C��\K�BFU�����t ��3�,����ܼyӓ5����Wb[[[��u�/�c�F�)�
��s�]���=Ƒ�f3����+WqO�x�mmmz�:A�l���O���?���p��p�rp�r����fVƣI�%Vɰm۶� S���B5�u0$���]��*'�Ž�����D����;�֭[X�p�j�V�Ry$|�d�d�d�Og�o��%�cǎq"�%ŗ��!t�����#\��ܓon�w�o_Bҍ
МZ�s��Y	ؼy�Fj�Vj~,���Ą+/��S����u��t�@�v#T�6�cp���� ,�'���m�i_-����٩�N�9��Y��z��Q�}*m�PwjH��5�w� w�0$��{���Z%f�3a$�<3a�p�>0����5�Y��tM�g�l��o.��}�S��bͪ�"�v1i�s��y�
���H�.�s����<��9�j��D�F�ل����
'j�v��˨_k8?	���S钎�o7F\�;bcc����^p¶S7��<9\��k8t��O�97I8�cⓐ��������rI��@��NT�{�R3�i�_�`�?���F�h�4�یXZ��M���=Y{g!�v�m�@�a"�7����myU�-���^?�Z�쭙��D�z�&Sӭ�ڀ�
�2E��j�@is���u"F�-��ǧ���L���_@wȗ-���:�9�#�%_�}�BQ�(��AK���J��o9`���1�~��H�)�t@���<K��1��-
וVd��]�s�D��� ��f"c�XT�����&�I��x�9���^��䍣�]6���^�lu_ouP���X �~����t��2�v�
H���}�[��ig�C��9���C߳��y�Ge7^�a��g����&��^6Qԝ���[��]b
Ry|�����d�}$�͵�u���G�a���Vڀ�k�~~��\Gt��%E��q�6� �E� �Gƀ�D|`���#@;c�p���MyTky�ك����J�j�c����D�����(��h������36%ʎxߜ��<��A�`�p�Z�*�>����U5q�1}B��9H���`#��	h�o�&��V���j�x��#n�h��e
~��z�C5q�6+Eˉ��<;� �MA*l����c�rs�N_oIz�x��'���k���l�����چ#��1�|v�nk�$:M������<5� i+�@j�e3`+�Y�v�V�$i�x���|���s�����
x�{�z����������/����a�<��2�Ǭ-�o�:�����"k�H�x������)<2x��g�,�.��P���_��6M�)*�f�7�j!����ٺ��	�gj�^$\��?>o����ĕ��ϡi���v�j�6j��ݿ;]|MJ��	߷��W�����3v0AM��ŝS�����e�oCs%�x�@-�4M��!��un�AM溿��0w�~c+IEND�B`�templates/hathor/images/header/icon-48-search.png000060400000004245152453623430015666 0ustar00�PNG


IHDR00W��lIDATxԗ�3]���:g<k۶m�,,~�(���va�����3�I'�4�����|[ߩz�\V�o���<l��H��#�BN��^�툄@�	}!&ֿ)�j��vګk�ڃ���=]םaG�a�Z��7���_����%`]
�À�W|��O~�mo{��o����gvv�J���8DQd�79r�F�N��<���~�����G?���ci��O���ԧ>�"�Vw��ݸ��oM����@�$[d�!�%�8t�k�+��w����wh	��
�X�կ~���ǽ�Z�z���}��߮`ݭ��ݔ�ea�n�O$��Kx��B������/y��_~��I���<�9|�������w?���������ݙ^���M%c�
�Z���M|�������(�*��w=��o~󫀂`M�@J�~�^�)O�{~��?Қ���YJi�RF�\T��s�ɕb��=F��E1�t����<�)O������5�\s�|inu��ݞ�ovW
n�bʢ����Fv,��,h��6���w}q�L���T�{�}!P�Ip�ڝ�|�����!�C�y�lZ�ȉh�A�F�&�q�ɺ���aB���z�_�p 3	9�����r^6�r��.UG���� ��2�bk�5ۦ��f(���q�{��@~�[���s��aiΈ4�D
iCJ�)K��:n�5�dF��Ԁޅ���l��@V~Pw���~�k*��H�X�����l�QsjT �ɐ���w�e/{�}g���^�r�-A��.A3 M��kې1�m>[�
yL����s�m�}ʥ�b�C�:6mkh_�t�"�w��c���i�~۱Q!*�	#ڐDѱ�� ��ɈD����hfw�f����!�z{מf����6�����6�$3�D��,�@ojl�h5��ĜT�T��~4z��Q ��@��?����0NLcA���4�=J�>S'H�b�<�U7|�C��ۀ/�䯣W9��D0��-#jBE�`A��N�E����L�`YG��Н�#�ԧ>���p��M��
���~��&�)��1sB4"�'6��_KKK�T����7����?��h�{	S�;m�AH/L������=��%CY/���56���v��@0	�Б���v{	����;��s��.~?�+&|EK"S�(�9����sd���#�L�"�x�5H��@����9�8��KP�&��l��������V���o}�[��p�
��h�?n�P8餓�(��Ԅ��[!ʕp\OO��y1��b�@?��4;��j///��]k��$�k}�m۶}�ٶm�����Vt�m۶9��ImRIf�?���zݯ45�w��իC�9r�d�u	D�1^-��fs>�E����G#�p<�/n�Ϛ�&�?/��֭[���n�~�U8	? �����zٞGC,�%R���ݻ�BCC�-J���=��"8j~�3��UҢ|��GO�4��ѣGC?~|D�Z:4'#��.�?�9{��;v�
5���ݻ���5��첱bŊ�H@�pU�rg�b��u���ܬY���/��!n�����w��ts�̉+T�P͚`)�6>d�…�E7d��96��Ugd��q��`ȧG@XhO���BC��������l߾�*]l���0,~�5�Hpy����؁�p����z�r��M�:u�H�~��	N@�
80
�a:�>�I$�����lCQ�w~7ӦM$�t�����gϞ�[�l�\���ѣGc�XqOh*��b�l���u`�H4i��Y�z�B�������Ǐ��ر0~P=��f�p9BK��Y2�fذa6���V�J�)�4�TsTɕ+W�i47�	N� A��i*�(`<),:�_E���&#` ���<{<�m��" �X(�X�4h�\��{\��9H�B�t����W�^!+iԟ��0n==�b=x��C�֭[�(�xZ���0s����Q�yߟy�G�yރA�!	$d�Yz����Y�flذa�
T�V�6�Ǐ�l߾�B�ә�~��S
��W�^���˗��_<�3�`5��xM�g�T?�Ev\�T)IEND�B`�templates/hathor/images/header/icon-48-language.png000060400000005614152453623430016205 0ustar00�PNG


IHDR00W��SIDATx��TTW�W��FQcI�&FטD�1��$�]��&�˚h�]cAMb��h�`oAziCW C�>0�03������<8�ț�d�'������7o��w�
��
,U��);�j���U��(�["R5&R�-+#���S�O�xn�]1�_g�?1�(�̔�=N}�U
��EȐ����o}L���73�0�t��-Յ��6Qj�&�����R��i_B�7�_5� Pa�2L�t�����X�ĖX�������,
R��ZYB\U�=���w��h�bn�.+Õu4g����)�.��E0����#��M�H/�G��'V`Ux)vǫp�Q��*�]���z�����W�OY�gBFU7)��̻Q<�&LA-,'k#K�U�ҚFJPaU���Z4CX��,��R�v|\�õ7�(��bV��~�B�C)�#k�K��U�oc�v�OJ��]�C��7t�و��J9Z�m�)-�m��B�%���Mt	�%��ڿt�ᒦƖ�쾣��(9׷8@��	J�(�x�*�MX%*fsu��+�|>��r_���e�S��y������	�"QV1��jj���ROT�P�{cK���g|&CNy:�c>�as���'��/�ܶ�f{�X�W��㕇/A�XT�]��C���A�7%�.�����J-���2�(�}Bs5���gc��W>RTȯ���2�����H�
�r�1��w�"v��P�����>qO��
H�t7ja��`	�
�p�_�,�c��b�5r ��[��~��P$����2�3.�*ܗUs�+���-��lË�پ20�5k��{v��>��/���6����
Mh�@l1f�ea�@�hf�e��q�N1�B�՘���C�;��l]kՃC�e5
�sK�]12�V"�a����Dq�^S�g[yfOcehd��w���Y�=ED�3\���Vl�;F�9�Y���5�љ˾#R5��bX�&b�m7gkd�'E#A���X�fjf�d�S\����rA�i�\�e-��)�t�
1Y6>�zמ㖉�c��!�]S�hQt���Oܟ��XAwH�B��o}���L���Y��g�E�z쎒p�'9�Y���Ȣ���$��NwJ�l�t�)D	�iQ#�2�,n�~Y����ī)`P��ЧU-���w�<,������SV�Ȃ����K`� ���2��h��r-$t�oѡ����s<
�rJ}8�r*����a���:��S|Hk7��`KX.�#�R��ȫ�����c9�K+[�&�gb_t|Ҕ�~�	y�K
|t�q�����y0D
*v�;�s1�Z2[ks�SD'�XV�s��\��4h��#V`�S
�$�^�3�1�jR��������|�F��zI�m�VQ6��h��K��_�i�?�1	?�.@����N%=F��h1�)�6p6��/g�»Ħ�L�+�Й�����]��ȧ��T`c`&>�t�ݸOj	�j�Ǭ_�;���o����
�B[%�4pM*F�Z���O؜.��W�}Y1�56�%I���g���[ᝊ���b�l����O�6�u2�~%�b9������#��6 
�t���Ļ�qH/�D[�/��,%IՐWj��#k�Ũ�o�̫�l���7��BgL8�L���ѹ����l΀>����8\�'���S.&�����c��x�>��3�,��W2���%Чzz�V�$���>�r
�q>�O��
���	���o���+w�/,���5��E��j�b�V�0�BWwʅ�lA#� `ִy�)�8���b�.��d�=�.Bp�2�H���UZ}�TT⃟b�u�/ܹ(h`�����F����~$�TM8eU���׾J�e���E�S�8��������fL;˭sD4U��^=��}���Igc�Q���1�>
���A��F�Π'h����2�=*��
����^�`L�"`([��,�����q!\`���z�X^��2zې�i��n��S��(
�`���O���R�!�I��4�X]�՛g���b�;�W�4МQ�����t�N�#ac"!_�ΔD�ӄ"�yf��jg@][O�osc��c��o��m^���˧�"��|:�]�����1�L�U��1BR��Q���)���
��p�v�:���o��R����(�{ǂaH�i��Q��� #���ލö{-�!�΀ŷn&�a����d��x=1����q�x�X���!J�b�>?�o�n{��M��
�����o������3�h�Kb�m�`�3t�;f��؃��wx�(`��RF�W_��ɳ�&g��5L�%�כ�u2��gݕ��~h��'ыa���0�G�m��,&����{t'��n�g�}�|��2����_�g�	A��g	�	S��h�3�3�ot*��-��p
�"S��.���������2[y��^oL��z�YM��q[#�:lބOԇx��OX�^?����	�
�Z�u`���_��a�{<��}m��Y��do<w㻔��j�5��FLښ4�O4��e�ă��!=����ьU�W��3_���d�Ut7X4�~�f_�:f4m�,�K�k�k��M�F]0������|��İ_�sܔ�{Y�\`��ɓ�k.%����6^s��#��b���4��^�/�9vҘ_|����jB׀a�k@�b�͙	>��t`��h����!� ���cԏ�ݛ0�{x�����s`ƒ�f��I�kC�_B�\}��|M�gm^Ȁ�k���v��[��1�1fuu_������7�g�M�:��)ʣ��r"IEND�B`�templates/hathor/images/header/icon-48-media.png000060400000004045152453623430015476 0ustar00�PNG


IHDR00W���IDATx�YEp�=�
kF�d�e�ô��0�&��U���03g���A��e��IP��~��[=]��'�5�ԩ:
�V�9�{�%c7��`+P=�Y}�=��%���D"q@k=��߬��g~��;�B�?��s�Ç+‡z��a'��
�b��8�,x�G*�B&��\.6�q��i��Tt%o����l6;�b�JDN�~��Enfq"*"2<w "�@�P��p���d1�=�S3��w'7m�4��E�q�W��Hk-��1Pŧ�rSHdV�=��<���|�OqE���A��.��@��ݼy�'V�Z�����E�L��B5.��H�g��P^�q4�?�z�.�~j׮]�"�K��~ރ��~�HD�^��@��[XX�.�D$��=�E����Pd�<��UBj�D|�XD�ٔ�Zk���tܿm�V�[����ِ3�'�i������F(533s�5�yM�ڱ�?#��}G���B���'��<
E�'Z�+M]?���^�,%=408�A�_3Ć�ʆ��L���=^�P`(�n��8~��<�54@z0m�|#�7��nΡR.�R�8��K����z��H#�Q;���밇9�|=����l���c2�M��+�}��]$]�4���~��F�힚��{�����,`I�7�+��R���e�l�q�'vc*04�\١���-���"�^��M߈0Lߑ3{�V���xՈV�Ző T���[p��!�����R�Q<���~��@
�uخ���F�[��"�{+B�e�Qf"���� �o��*a�h[YE/AD�VC5��2) ���O1� �6o�77�P+0���q�|��m۶�M�3�:X�A�
��F(P,bb����kxv��n�.����c�+h� �4�c�0���WΫ�/�h��+�����P=1�>o�L���ȊY8<s����
���Ca؀rU�/������ �L�R)�5bu4B�^�!��L�VF{FHh����	�㠌�v�\��8�k�ls|�\[.���^vv��{�%�0�i!����'m7�V��!��$-х���cR������%�կ���T@����enb�TL�٭"<�U�p!3��mUG�؀[���X����@ւt��Gi�k�w{�X6\�h���po�����}���T
V^iwLؑ>"F)p�JG ~�>p�Q�ibp_!0-`�"d�]F(�9�ڡx��b`Cj�$����w:�h����s��+�UA�
"d
���C�*i`O�muj�\W�բ���
p��0)�⒥ǀ�_�6��'c44G7SN �D���P9���j�k�bu2 �<==��C�>��#�x��Q�c(�(\��a�P�= �DhAi^@G�&�@�y��?j��ͥ��"E�3R�Ц"D��bo* M,щ�P(�hfR���	��ѩ̏��|!Ą�d�YǶ��@W���h�M�F��rM�ވ�s���߿�|c�j�G 4BD�)1�u�0߻�K�k�%\\��%�\�"��	�Oh6%>�74��#��UX�^]��ʱ��s��x;G^�~G�6'����@�u�S���j��`�6OV���%qx$�n�}U:���,�dP�����D����h0Kw�q�/�n�n�kȍ������\�o�:�{�{Z���-�ny���G0��Đ�5#��ـa֙yn�V�^���g���?-H2���������B���%#�/��3@�&�̬=z4���	f�)_�[��)9f�F����F`�f&f��?lX�^��j�5�G,.{PP��ڌD6��b���뮻>Γ&�s����_rCD1�Fı<�'�t:ӷ����ܹO}�S'����կ&���F���v�r
ԙ�3g���>��d�8.�E�ȷY�cAT5S1�>��^�G,h�43)�7�l��"��&�%W�'�V����u�rߋ�tIEND�B`�templates/hathor/images/header/icon-48-extension.png000060400000002657152453623430016442 0ustar00�PNG


IHDR00W��vIDATx��$[��s��{m۶m��m۶m{wlۭa�]��lGUdDMEμ��9;�͛/�D�G73�߸�e�+�i������A�$���O�����ѳ�Ebf�t����_�"?� ��sߍnq���?��rٻ���V��~Qq�5"�#���oz����^�p%a|d���6�v� ���F5�J���Wg���۶ܮ=$��>�x6��ї'�&�l=_�����;=�9m��+o���S �o��[���G��ʑͫ8�y���w��TQ�7l�8�u��on�!ΨRW+`��4�:F&fؾ���kb�M���
@�"�/�ĺCC�R��:*����8>	4�B��09}v��d������*6*�&�{�Lw?�mpqT�@c)t��,I�m�A�x�0b���B
�!<M���� �mT��M�s�^{d	r��F�.��CW�Zv�dd|�Lo{�>4���A'?�{
'�)�J���Y��}?x�T��ݤ���Z�s`�hi1Ĥ��*��,���u{x�}o�M;
��S���
� L�5X�s1C��O�?�'��FT�j�^�ӓ�&�$���i�eY�/3�rlhKk�(�.���\�9w��|�s1xf������,�8��ٚ�o_��0��1e�����V�'+6r��v�~�VV��*�7��E�� �yO+�L����?������8?{�ˉ1(ZpA��5��*�M��?m���"��l�֦1��F�T
��?�&y���m�.�#~��5/[���oy�>bN��Αv��(``t��3Se�=ϯ�l	3U�w�q�ξ�C.�q�B��>E��܎	C��A7�� fծ�����o~nE�{
���LDP�,`i<bN�A��a8p��6��*X�'pj*�M���'f��} ���[	����f71��S�Z,�Օ�ӞcTH�ܻP�~��x�]nI5�����æ��~�r�����BI|��V������_'R��7#�,�I?�4�:v�?X��g�NL�������	L�E+�*�r
���C�����}�l;4���0���Z�6�u��������,��Z�
���U�l�� D+"S�2�5�6�iu!cx�~��²�YT�Q�J���+0!�q�X|l�y���R	�(S���[U�(*	��|�l���-���� ��I!
��������sKK�
w��/�>����{M��~.�\�7���D�:mU�zz���d|*g���l�y�mi�}��CAA���v~��_E`���Y�|*G �פ�V���,�;�J����E��^P@j́tD���P�j_	��/P� �IEND�B`�templates/hathor/images/header/icon-48-stats.png000060400000001373152453623430015556 0ustar00�PNG


IHDR00W���IDATx홃�<F���mc{�IԶm�V���\۶m��{�ٳ�=�K�h�^�[�����r$����	BC���p-�B�i�ۚ9�p��7���9ot�.�T^���Ʌ_�iډv�u\#��x����	[ڍv\k�姼#(���[ڍv\k�T��Ўk
h8�
9�2��Y�-��C�G����!=����M5�i1��V�o��?$x�Î�:x�ˉW�]x�ǍG�*�z�o���o
�P�pCx�ɀ���e<Ӥ�{��`	r<�l��ǫ�n�x��n��F�.�CC\�A�!��D�1��	He2��d�9���%���F���������0FFG1>>���I�|>�����Ȁa�bF5�|A�RE�<�����1�:,V~�����눡�C�3�n���
�"	#��a1��dX*�t&�l6�\>�B!�R���@���a1+Q�I����ٌ�岈'b�dzZ͛;�����7����^'P��T�)��3�h�
�BL!�S�)�b
1���`��S�)�$�D4��A��
gJWjw�<^=�5�ζ�V�]H(�hǵ�����7�܀H$ڍv\�拾���;������9�z�b��٬�*�WT(���P(�A*��T*J͔?k�#͚#N$\L���Pg83ڜ4�m������F��t�bIEND�B`�templates/hathor/images/header/icon-48-generic.png000060400000002062152453623430016030 0ustar00�PNG


IHDR00`�	��PLTE�������������������՜������̮s�džŦk�ˍ��M�Ä���ݾ}�͔�ߢ���λ���T�ٜ����Ύ�Ɠ��ո{������έj�ůŤc��Zε�Ѳs��W��|��b�ɑ�Д�����J�ƍ��e��ƫt���ͼ��ܜ�����Q�ȋ���ƶ�����H�ӖȩjЬeԿ���lδ}��� _��������{���¶�������غ{Ž��̽�������ޭǰ{�����yμ�����������ɥ�š����r����·մs�她��������ػ�ʸ���A�ߦ�Ҳ�����ʦ�̮ [Ģ^����ו��Y�ɵ��v���Ƽ�������ʪ�ǵ���������������Ⱥ�����ţ֭c�ʵ��(�ļtRNS@��f]IDATx^��C��@��M۸�mm۶���:�T�w1�y��|ϩZ��o��~��~^�.��7=vP@P��|��$U���gX�g�  �_}w�1��Ak�J���w^�ү��*�\'JTq>�	���G+�f�HMzJE�)L���z<˄�<���Gs��%��i�I1ȝͲS��I�G�)Le�������	��<�~�[��Q���/��ԖL&�����"u�qZ�M�T�v���H�]1�mֱ�,��	����a�H�uM�,S,�
�O8�.iz�
�#0c�� P�*%$��t7BYQ�y�E��6݁a�\�����s�	�o���WC�v6'l�x9{�Ȫj�N��@���;��` �64Y�,��Rw�hx#ެ�}K�-��(�F�E$�R��B~ֲhCsƽ;�l
��g��l<�	�ֹ�R>x�/�рSϧ�y� \N�G�A�#2�b7t7�h$\��פ�i��k'$������n`�)�E�)��B���P.�?�b�N��\�:�K��{!�]��)�*��TE��/�2P���Z�T��tB�w@ET��(��?�}��>��IEND�B`�templates/hathor/images/header/icon-48-menumgr.png000060400000002234152453623430016067 0ustar00�PNG


IHDR00W��cIDATx��$Y����i��;��m۶m۶m۶m���jV�{7�$���ݚ���~�//��֤�����,�YAb���YS�s�H�Р�@BVp�%��µ^�/(��3k��B����b1�ސ�OZR�$)����v�%�X��@WF;=���U
��d}=��|/>|�4��}��[�z
�9��w��7�J���Aˠ�/%)�"S�4��������]_�s�hN�5ZX�N�-4@�$H�0�&DsR�Qp
���
3�6*�Ĵ|�|���8����x�k8����Y��|-��{H���DK�;����m�ޕ��C��j�q�~��T|v�'mD0�4V,Io�*����[f���Hb���MM�I�2�ǁ��}��O�����O+8�.4/��N|��|���˦2G�6��P �+t]g ��c������1�L$Y~�5�����JF�4M��/�T��wb-~��(ǍL6KG����h$�I�y�/�^(�ڋ7P�����!l/�)U�~�����! J|T�ŚB�����x!�(j��=^�m�XW]}
�=�v�!����������x�3�?[[[����8��É�b�E�}O���9/�'_,�l6K"��o��[oc�"�)1�5@oO��813Y�����*�e��~��H��X��B�خq2-�c2$�9���^c�
6`��gF��������*s6� 7�iokC؂c�8��f��_�k�g�*�E6�<�Š+��b�����O?��{��y��Ub����_��g��/�K��B�E;Ȗ_ay�*���T5�,ۿ��U����e�[�� ���B�E!��(C���P���U���3&L�pڤ�%�G��-~���ʊrJ���!L�������%�&4��P"�-���Vla?�6��N<>J�+G�kQq��]Vf�B�!��,����VWM�"��t�ܓg�}��a�"����1�hhR�n�e�ow�4?y�y��*��x
���TB��20U���/`�o���(X(`�V��% ԇ$ ��9RL�#9	G��
8?��e<���H\׀Z�P�mHg+G)���w�=DCIEND�B`�templates/hathor/images/header/icon-48-newsfeeds-cat.png000060400000002745152453623430017154 0ustar00�PNG


IHDR00W���IDATx��mlu����`�v����LpءD`a;
�(J�DoLcL|!B�M�\:��`�Ǟ�]���TAH$����j�o�F�
����J��u�]gө4�d������ݵ����o	�{`�L DB����b�0&@M9�D&�I#@��b�LB>B� Œ��@�	.z�R�@�qF/0��@ �H����z�qf=sqƸ�'p��Ɇ�ĕ��e�a�%��V��������	ԗL�q�Z�����M7���,К
����T(�G�d�w:���T���*$�b�G�5��,��b&B�n@����*r�΃����,��W�ߚ�j��m�"�ʲ�-FI�u`��¹_�b���/����z`������ԛo��P{6��	<?��nJ��!�v�.|��:����:f���r�|���?b��sL�釽�%=�X�	tx�U#�-K�W���Ӄ���f�󝟡��k<;�Ø�:����w��]2���O��Іn� �.��D��_f��}����x����7]�����f�B���=Ef�$�΅$����!��_����XM{^-����2�C��;�B<�"	��S_ae�7*bGbI���;=�fL�o�D@/��Ű7�
�^�ְ��]_Dz�5,�ѕhA�em7U�k��I(kc%z���lڣ�\WB̡k~���H��yg#�#F�I'�P������Xᾡ�V��>��R��^�}`Y�<&%�������^����W1	U�Kw��T���Bs�1�	,9vm\�記v�v�RYOO1	��*o>|)�O��y���e-��~��rYL�G�+ȶj��1�S�`zc�޹����y�	H��˝�A��'ay��M`*]�g�z����RXr�gI�A5��i3f��ʦ��qc�����[�+���	��rg���-I[c����9�����u��hH��
�N����L�o;�Qa�n���!�5��`��W�a��P���m�#���Ip�~;��;��ݒ�}<C��X&�k��Ƞ5>��=�"�·��M�ܭf�/g��[�ϩr��2��4��a�s���QXwAEzu��9����2ٵC,�1&`�q_��n�кg�k?a��Lڛ���Ps��.qK�*3�Mo`<�ƛ�g�^˫���AK&5(bQd�)�]��mc�)E��^�If̱�膓Mj�$)&��gT��r�[���ȑ�3%���BY����s�"o�J۔��朑2ӂGL2i�H�ҩ�55iAII��N�I�L��#�H���f����L%b% &mnǴMm�H�����F�K��F�L�ڱb&����F1D���Rj'�̳���x��U��q	���0G�K������[�v�{�+qO�.�'�|k���qIEND�B`�templates/hathor/images/header/icon-48-trash.png000060400000003663152453623430015545 0ustar00�PNG


IHDR00W��zIDATx^͙]lUY��s����mK[����L�q�O&�Px1�$���>b3J�0a��|�8�13	<#ꋏLH������@��~�~���{��˕�}9�צi�q����6'{�����[bf<�A2$�@����g4zzzR'O�<p���C���FD9!!�*�Ϗ2�sss;�A��ӧO^�z���/_>w�^�D�ZΞ=��H�U�9�u�ҥ3G�=���}���ç����%�<��/��������W�\�q�Z}	@�y@����{{{��� ��)�2A���?~�
tF8!"wQ��d`rrritt�N�\F.�þ}��w�F2�DE��bSSS����}pp�۝����()�'-�=z4322�a�R���J��Rhkk��d����Ӑ����{�ܹ7�;� ���`�gy��ؿ{���%A�}��@XG�b��?���{�N��o^0s�166��������n��o�>���f�~�:@����6-@6��mm=���]�|{�"�#U]F$@kP������e,M�a�=��h7B��Z�lv~~�d@�12Z[[
7���;c��hd����A��
�͟𮀗����i����5�i)F* ,��EF�l̓��ri�m��+/��JD�]/tC���A&�y��e�T��n?Ƈ�,��׏���o����8���}�	�ζ��Q0k@k|�dC�Q
�`����F��̼_��}�
@�m��Dy0���t�TR�m �Q+W.ؘ���Rvg{~�<��
�p�a����RB�)!R�0b}?@	!HHL"�$l�������†��t�aQ|2�|*8h��
{P�,�P2q#���qy����� �RZ�����(���i��
n�L;���$A	a�xA��#��b�����ޯ
�tu]h�ك�:��+��\<�1�ck���Gh�	Y�Il�X,�1>?��SE,��_+���W7�K���z���v"�։ls*"�W5*�����# -"��0�ZD�SW�O�M%Xk�f��d��D�M��`A3��a��\�f�yx W������'ؤ��7-��~dh�&�m�:j��ҖN���6@\B���g������]g��3�#+�R@��S`���77UB�F���@6�ˇ��f]�a��&6�Y#3�M��.<oJ(6��e�����4;�s	u`���h���nb��7l�ND<r�K܁X���9ȀF\B�sUB�������a�ж����]��L<���8���gWB��%�(
�=`&�ed��s�B�nb�M켍��Țx���KN��Ɗ����A����!hۮM����}�m'�v��s6�ۙ{�O�d���C����n�Q0GjǷ2�G+��QH��	 *D�~�@rv�b�q�f@뒎"[B��p��U&�=���gF~�#�'�Jj$�@��U�H�%
D@|+s�2��:����67&&"_Ȁ��:~��%f��zF�r�kl���BFئ*��z�zl�]])�Z�†����Ĥ�6!/l2��ܬ5�M���&1n��G�m�����D1�OVyZh�$�D�?��0�"��[Qɖe�-\��^�C��*(!�1��5=����B�ҝ��xx��jí̕�kJ�0���6U`Kؒ�/�:%dT���`�Ƶ���W��\z���9�4a1b�6i���2JP*�2���K�L���w�T"u���(�j�8�v}c�;�‹���)H����0&�~�*6R�Z�}�ߛ@<�k�4
�Y{�:�E�y�5;���H�`H�IEND�B`�templates/hathor/images/header/icon-48-category.png000060400000001226152453623430016232 0ustar00�PNG


IHDR00W��]IDATx���\m��ڶm[�U�
1���*Njkmo�+c�v��Q��s��c,��̓����ά��5�.u�K����(�%�J1�@]%�"�)W����F25�E�=e�9@�_@�E�f�����+�0*���I� L�cA�8JG(�0qVa"࠙���pܭ��?��A8���C�s���L�p��B�`�j�f�l
i@�8psƟ�#��gFG;�_:t�7 ��)�?ty`�oC~����JGAo�C����}�����o��LQ4�A��~����!��k#�7|-A����F
%���-� ��P1�� ԩ�U�7�ʈP=m*A(e�rr���5�������ι`�z�_�A�e~�Ιڷ�EihXI��-\��E
�<��ڹ��̅��8w^ww[`D�x���=�g~<���#}В�
�������!�z|+jMm���k��kٍ,k��k���ke4�uc��x�ǜ�n��9aƷ��ԁ:R'��钠�Qt�t���oᐝD@�F$`�z鐀���0�bY[�����P�Z���$�:D�8��`i��F�
�c�0�IEND�B`�templates/hathor/images/header/icon-messaging.png000060400000005720152453623430016144 0ustar00�PNG


IHDR00W���IDATx�Yl��e0,8ưb;��9�0瘙�������������:1����w�����gG�w-�z�띩z���^���?q�'@'gB���3�Y�X���@@ ��HM\��F����9l��#�?�F��������"�($kP`0�Z�P'��2�o�A8�ƕ0�`����y<r�)W���)@M�D�,�lV%��@H����_���'�a�t& ��/ó�����t

Q�@�@��C �ϝ�D„���`�٠7�аe9,v?>z�kp�Mpf�䭠3&���@�ˏ���;�L�����*�s0u�N(��ȑ?d�.�%
�Fs/t��8���s�W�c(,��	�8�x�4�g����o)@�X#�ı�i�bX�0[�l�X����)Dc1 :�z].�9��ߏ�Jܸ�<���B�N�O\�����0��L�hb�^�cb�ɤB�"B,�U���@"�ʐ"�bL& ���m����u��|6N��v�����
�8!�r�ku��f�bD����p�њ����G�7&A�`�J� "h��1Cνkv �A?V�{^�2eQ됚� ��̣p��}������n
��5���h�m@(��Mx�X��,�~08q�s�"k��)-�ĵ���KIR%B��h1i�'�:V��*E��a?���	HD[�';ݜ=�Н�L&�HQe>z�:�ĭ�;�3�r֬�-���+»�1\��<�T�W�q#jW���T���Ν���7�|���@$A\x5�!�������E�+LCPL-�_Ӭ��
e���{O~B�ڇy�4�?���I�d�YPP0��7޸����
��FA��aaU?���0x�`��塳�z�qU�-	�$4p{�0�8�`$����٫ަ�_�S��B��B�s�=w�…'�A0�$N!$��ڊ��R��P����:�9���,��Dc��˃�J�h�K�<]�s����8��/�첃h�&H���\�0a�z=H�u�u��n.k�C݃x�~f!����7:�����Q�~��K`�.���>z���1���3�999(,,d�!m%��y�f�<z�
:�0c$�;�x��	i�rXc�r�����O�>��󁠈��F6��k���vΰ��HKK�*_��e�c@�T%��х���b�5���/޺�S��ܟ#r�M7�t��G=�v`�ikkCWWƌ�P�F#����\8�NڇY��p�����$�B�>�Bc��Ѕxw����`�=a2�PUUU�`������N�h�{�u�]�$�����J�#;;��a�I�k���7�����F�vD]#@�1�|C%�8\fv�L�l6�$����+2<u���hhlĄ��jR�Y�u�٢����6������cǒ3�#F��$M@;��������&Q��-[j0e�d5q�����#������B�xަ�}�}��w�����f�ԩS���P[[�T�
R
��@ɳ�,5y��7�|�O8�,=R�S����?�c��袋�f�2:�l�
�hllĝ�Vq�$���h�֒��e�1cO(����ys���&�H�?~��O?}szz��;n�8�u�e.:��G�0m��K�
�F�S2X+�}�fϚ�'y��:�v�m[���$U�Nއ~��ĉ��(1d�ddd���N�֭üy�Md�����)�NJv���b��[̙3�Y��b,z���>�cy�Q��m��v���7!nX���v#,�P>4����3��SM^=��Eج<�r�ӊ!�w�}_4�1��Q��~	��/���-g�}��|r1�_WW�7 *d�c�:�EE�΂5k��a<��#����\�
6 ++n�����S��K�@�ӣ��U��Y��H%b��}��^��@;�2�u n��<�.�ܨ����^�2����j��y9�{m�Cd���3��F��Y�W���sf�l2�V�{�PW_��q�
4�	d�-"�-���L�{����aC1��@�?����3R��k�"�O�ۭ&,��\�U���p߀U�aW�g>��Ǐ#�>m������gL���O�:#O�ee��c��y��>��S̟?�W�3�$O[�$����C��[v�Cl��O�W��˯���E��?l�P�Z��a�F/ׄ�2�9�~�3�QI��r�|jA��z/v�mW)n�tE����h�\p��T��3��W3����ܡ�^�HK�|MM-�8R�(yy|�C�i!�	X�
9��Ï:��S����fgڴ�����TVVa��ג�F�;2S�8a���&6��O<a��B�2�UB�EE�/��sE���C���j�jq�.���k����|]#Gf�VE[��L���z�����~yEe�7����l�j�,�‹
��Cr��~��]`�Z��3�p�����ǥm�r�$��VCܧu�ަښ��+V�����H���I�P������4Q��t�R��w�c�	'�p���x�Ɗ+y���ɓ�m��!;{P��&Y�%��c7x6n�ٲ|�O˿�To����i�d5�S��&�
i)Ar��'�z��ys&�����M��x"�>�'aiv4��{7y����^�ZnRE8J�[��CGh,eQY�)�9kցx�"q�N�:��Fi-!	�Z�p���������Ϧ�$�Z@ِ���K�gڜ9sO�={vVQQ!	��"�M��8̕UVT~�lُ�R^��‰�=�\��zi*!��-9t��~�߿z�����'4
�(?:|J�Ƌn��ͤY�]�Zˢ�VЩ�8G���͆�
��ZF峄B6��w���O�"r]���)H���9�i�5�2�mIEND�B`�templates/hathor/images/header/icon-48-newcategory.png000060400000001753152453623430016751 0ustar00�PNG


IHDR00W���IDATx���#Y�>{�m۶m������Fg����k#���w�z��'ۙ�L���W�<��d�JʖJ*����D�"�9���J�������#h��������q-/���J,p�H������_"��b����E�����	8SB�"gJ(�8A$�L	lG��i��v��;H:!ӝ�����~�&�b�6�~�ΡL���d�p���k���fg
4�)���L��}D}�[�0��������8/����@^.���z�r8tB.,`=�>X�Bk���4��}��Ӈ�a?�E���7�L�#�+�9�����/n`?~bk<1��o���{}�"�Y�����!�q�֮q�������p��r��m�=�x���/Fr�LM�«�R���3�<�s��\��\Ƹ���P��?��X���d\Bi
�vΩ���;�8��D�<e�7��h�]�e��wGF�ְ�`�q�P,���hm��1\k��۬3���rl��lL�)i��򱥫a�+���G�B��9��#���9k��|�I��5X��Ix�3��ň/]U �0f�#��tI���ʅ��Vk�U�����șiv�Y��̂E+��J>1��#hk�;q��K΃t)�Ve���yo�4���'�f�T�'�]���5a^�Na^&����65��+���M_��2sV� ��ę�>�8j��7��Ɣ\�;�G]��W�Z���N�8J�C� �xs_�Oͮ#��,p�{Z���G�C
���E˙'�?)�9��s��6[<���~��M���%��q��V��s���=�A�57u�](5kk�ynM�Қ���ZyL�4u�'.d;�?.�>��8��`����m��S���f PI"��e�wLϑ�26���{v}��>"�O�I*�wc}�NE�IEND�B`�templates/hathor/images/header/icon-48-help-forum.png000060400000005646152453623430016505 0ustar00�PNG


IHDR00W��mIDATx��t9��?�����q&���'�g����eN�1�������g����8d���"�U���i���\�v[p���J-	N|x�B�W�2a���
�5]I€�z}��� D29����>�U��?��^����P����J%���	����@j��qx�I����V<��5�H
�ƀ�5*�Rı"ܿ��?^Zc���X��z��ۈH�:9�ƛ(��V�D�ZV7߄W(G!*��Z����	T�$��Z;AO*��x��|[{�P�+�� �0�;M.�/u��Nγ}�<뀞�i����㚉�R;�B3��l�+�E|x/��Mf,���Jv��qL����6`�!N�ꥶt"+�M!��C7�0
��iC��8��1�3������1`�ے)��X4+�H�K#~��}���;~��gi��\��Wh3�@`3�s<�fśUOb:R�� 2l��SA
�#~dk��Ei���&��L,<=ֹ$Y[E��P�05�����7G=F�8f>�c��cy�~}��L:����� 21!���~�MM)eh Ҿ}»��h
iT
-A(@���k;�Vq���OL����W��)CDK�
%����j��j֪UG�n���nbMf�[�!d6�	C��n����-�QJǮ�!v�3�Ib��W}n����ۨZF|՘`���1Tm2\�
9>�-Y�ct8���v2}�Baj0oJ3��L�+Ě�z@��d(a*p��^��7�w�럨����5`ȑ�O��f�.��s�תy��&��ĵ/{w��i';���ZA�mIXmԂ����?��/��*�@ J)��F}A�#V�����JI
���Bi���uj�TD��y��<�
��a�՟$�^������}������{ݸ�К �$�C#~��S�Á(V����	�Ck���ߌ���R��AGbB����B�h>k�x��`��i���$��b����"������ж�Ÿ�{y��]��te?d�6
?LD��7�(6���I�u��t�s�C�s�pa�_�xr��p�sH�!Q�����X$})�+S)�M�3s��_im�˼��o$��&"j	ӲIW^
Q��0��w�~�q�u��RJ�d�5/»��=�,)q����^�ߍ���I*{i����8?r矈o��n#�y)E�〔�� Z�w����WѾ���3�x�#�^c�6&	=r"h����:�^�޳��w�����?��}��_/�1�֎R�T�Qa6Ä�h,����vǜ�D�#�,��?�c�*�� �מgNiJ�	5�O)�x�1�u'�)
h�N�h�s��r�3�V��d�
�eSC�9�H�����ĸ�L3��3�я��b�f[
��?NnB���.�`b|���Vj��r�vܕ����3]}�ɋʜ�)Ǿ�N�1�c`L0���*+5�)q�уT�����h!`{�a��z���!�G]�����HL����͠�wBl�y3x�Y8'�-�\�(���@�ـR��68��lμ��i��یly��$�n�����/W�|�A[9����K��j��*�R��[�2���uW,�13��B��9���e3��*V�q<�@��N�;~M��
h�����s)x.� ���.���'��Ua�����m�k5Gǂz�lx�Q��U�;xյb���3�xh�&��g{^��m�6��JȑA�[��/P��q��j���{#���z�>4�l�,vr� �f�#�(<��%�~�s�=�Z����X 6o݆�:<��tcY��Fw�g�cWj)	��P3�S���]��#vr�
�Q�����9;g_������|�^C"6nނ�ۖ�k'�3���M��7�q���8�9�S�f�m���,�s;*�.�v���+�4�}�E�p2�_+>Ԓ�^7��W��éF!
X��^���7��}.��V¸�O/Z��G�G9!�@��hB�Y?�z�.���T�
.�f�ks+�?9��͂0�Yi��)Q�1�_W�ŋ����%ԅ����S7~o+���s_Az��'��k��iJ(��@���$�hMDZp:А��u�_i��|H+�L����o �4�}���N(1�bǚ��Iu<zp���CZ����?}�j`]�eh�('�V�4��2$
#N�^q��E_�=!1ћ���y�H(=j
6̿�_-y!WCN5��Kg�����k����2N��)�K_K���r�P
?�9�X<�˟U*~x#-pc5���o<�
��oq��H�d���w���p��a�֜
\�Y�R���r�U�A�X������J�g�Y�Y�T�@;���M��{g��G�N��es��ۿ���<���X�V�S�;����t�J����6.������H��Ʉ���tK?�雞��VY�2��F�?�E��sX�wx}�)�|!G�V~��ʞ�ܵ��q���tK�T��-]6�U*��o~�1��QZ�#�mr)�q)/����>����ǣa󑘛��T����C��2Z�M.����3��9�3c��zmC���	�Ճ�����,;s�����xSkD�Ұ��Yr,= ��w������弎�|���t&^�B���Q��&�Z+�Q�B��{�b�^�������u���>�ų}�u+
3�<��V��0��n�x����_zj�S��c�Z:���t]y��pV��ܡ��*S�زw�_~�GEQ(@g48��h�3>��K�R[�O�ܟOTBr|�rB���2wĵ�m)��!B��L��՜�L!^O0�D��-&���ol���>��C4�5dIEND�B`�templates/hathor/images/header/icon-48-preview.png000060400000002015152453623430016073 0ustar00�PNG


IHDR00W���IDATx���x��N;?\��m��k�f��m;X�x�msx�T���o�H�N��3��5���31�C�, ��h�x�2@ $"l@P
@�r@ۡ�|�Z뮷��SkI�ah3���G~���g?,2���N:��CϿ���#,6�b�y��ùyy�֍f��\X`��ެ�K0bY������O����Z��v��47 ,��&�n�l�mȒ��lݐA�N3[��;�<�e�5�za��`V\�*xab�b4'�4$,V]D�<3��lۘE��2�f���=P�p
�2});6g����K*�=�<���7K�!�yk�2ъhXk�c�9�s/��:��G�~����b��X=I=�ǀu��H�RضM�(
�1�U�5�
��wZkr��d������l�X7S�f��	�J%�!J(�6�l�g1�$V��
��+ jH+����e��������W�u�A�R�k��"d �c�����h$0r�@��x�VȊ����3��H¨P�k�^�	+�:]"�
t���z%�|4�-���e}UH�W��(��6-ޘ�_��{¨Q�y���,�(b1^��_��>�B�@�ڎ��
�k��x~“|1�:�E�(�D4
��/�hI��!ـ��~���N�������A��O�[b7�X%�:��v/�j�@k^��r׷�a�N��4n�������ԉ�[`��a�1~"�W�^c?���>��I��Ba�U�6���p|�a�v�˷���skq¦'w:��0٠�<���]_��O�+2�_�֝K˥�����lj2��!�f@[�g�����u]��R���*�Z���?=���WYe�t=��U���C������n���n��v��Q�Ji�vuذaCƎ;Xa&`i �#~���@��{�`t�*}(W뵰�f������

���SIEND�B`�templates/hathor/images/header/icon-48-move.png000060400000001560152453623430015364 0ustar00�PNG


IHDR00W��7IDATx�E�M��pwwww�qw�+��\VN\pw8��:{F���n����E֒1Q[ѻ�]8TF|�5���Uv�2�9�ʑ~ٰ�k���k��2�a����`�qY$f�t!!P�����T\:|X��a�M�=V7x4��	�{m hp�j��=���h�z�њBx<
�$Ir�S��&�CU��v���D�u��H����=�|�t���{�B9q�#m?W0@,g�q��A�PNn�<�!�2��u�x�e�r�$�	"b�$�`��z���c������+Q���j�����N���w�P��2�ytGk���b�q<�G5�)K�i��&���71=ǔ���?K|
��V�cbס�,��t3��(���m.����q����N�7��.��TNҠ�>�)�@$P�~������ގ�<���M��+;�kN���T��{�L�̗���7)ݥ�y��s`�Xf�K��B7�.4
�8:��3B�U���@od�W�
@�H]�j�qeUa�ICS��S}�K���D!^�' o˴��r/�!��*>��8��PM�/�7��X��_=La�D��U?̉���A@!�D�ڇz�׈7�8�|�c��z���DX�F�(z#�7�B�j����8 �O��A�z�=� �ր5���ak̘1�1	r!9�D6"+��Ld���6�E\$B|D> �;�
�y�v��WF0�� �[��ڣ�L<�|z2%��oj`1�K �~���i�3HpI����� OA��}#�y����O�ų9;�IEND�B`�templates/hathor/images/header/icon-48-contacts-categories.png000060400000003443152453623430020361 0ustar00�PNG


IHDR00W���IDATx��$[��s3��gֶm۶m3�Vpm۶mۻ�=Ө�{Ͽ�y�;��zr��"N�f���A����󟍱��7]b+��[�Kq��o���9��P4
��ؔ��q�|��pk�!��֋��)	�����:��9�8��һ/FFѤ�q4�)UF|><x�?��@-["�P/|8���t���dG�>_6$X�R2����v�	(�]\�F)
`�8Tԛ����藊�ų��M��"�w�n���1���W���1B�F�5񒘄�цp��Tz�>�@����@C�fw����!ϯ%�&�
���7"��[��(�c�P�`ӳ��g���:�<�]�Bx��+M3Y���a���jM{��7�(mj�YM��g*�fv�2 �;�Dr�ެB0��@��M�m�8�E�E60����Nu<w6q��[�W%��]��BfFa��(jf`��ĞS	/L�Č��h/�sOAJ�x"VDJ��
h��= �!A��hML��n2��O<i�.>�J�rv!waWx��t��H�`F���ⷞ�ϜH��3�h��<�R����sP��U�	�
���E�}<F�(�_�uw��/�w!����A6�9�p��E����E�(�R	�
�+?�ݫ0�Ѥ瀧Q��[�Kt3����[H�?^Pʖs��;hW!�`0X��,�b��
#�*)�8"JV�$��M��02H�<#B�9
X�=9 ��5^O�D�5z��P't`��3��v�T@R���=��`��M�&3*q�Y��4ք����
�kUr�u��4Z9-�A8�{���9�"���Gj�k���F��u�㍌07��͛)�p���:��M�����~s�Z�*%�i ?U�.�F�0����)o�
�}�t�{<�o<��WӜ��V2����-�M.&��
I��P���ϟ�<�L]�~�����~��4�#o�ڼf�L4�8it<وxh^������t���_���ɔ�1i�v��W~�]��L���g��@��bZ9��-gݥn̆+�a�oB8n3��?�̟�-O�9����Pp��p�l��`�E6����W�#�n�l��jcH&n ��W�c���㧙��{H�9��r{f��{�*��p	6\�~l��k03RJaӅ�r�gн�
��!��Al�
HkV �B��Ԭ̦[�I�->�(/v}:�2~��[rk�B�[ȅ	��j1��b��=r�`d�[B}�M]���?���6R��ق���EA��k�yYx6Q(���y��n!AM�y�
caaw'�XeI��i :�!&��!)=�V`�0Cg����&�l�Wo!n�$��H��28��105}B�m��)�.�d �4Q��������Oy~��ib����/ӵb0�1R�xr�	�PU0!��.97^iz�����%>��'ۺnϯY��L0�K�L`��Y���9�C��G~^0s����) ������@(�P�e�!�\Űo�\E��p�HZ^��`0P��%Up =`���KƓ�%`��P��e�lu�e@e�̴�e����eViԱ��Fc<(j�Su�U�F��nQ����@�^�À�
�2�$)�YF�@˕T�:�H��0��@B3��[�I�m��!�r޻wo�1�m%�o��A�����a�a��5�IEND�B`�templates/hathor/images/header/icon-48-groups-add.png000060400000006534152453623430016471 0ustar00�PNG


IHDR00W��
#IDATx՚T[�ۇٲu����k}���w���
��Z
����݂{K���{��l��z����ɕ�<w�y��$��+""B���U�{��'04�n��?��x���(` &&gΜArr2RRR��qqq`�1C�������C!!!/���E����PE���Q^^����~�����Bjj*�(	�O��xPP�rV��I	��:�r��zb�� ��7BQ_Y�*[7�L]]rssq���ɥV�����u���}q�|�=���mZB��A�chK|��s�*}�Eͽ3jI�������
����`w=#--
�wSQ��8�G-A���ў�.:r?BG����z�_���L��天-�s��-��f<��P�����]�rEEE(�~�A�YE_EG�g�,�]��U�:˾EG�h��6ZB�9�&������ 	)㫿*�9뤊{����S ��ŕh�x�Y@qqdg��,��S�S�Yk|
y�2Ȏ�Ľ��A���`-N"�V�YVy)u���
� ��G�@����/A~�Yȓ�����n��).����* |&b�v�)�����Ib�`&3�"�UUU(--E^^
�|�֐y�%�;~�&@���q��e舜��C_�Y��7	t2^UW`��۷Q[[Kw�‡(�	N ���3i�B�{����BJ�ğ����!�:�ul�^��}�(..�R��-�
�@v����>���t�Q^V���\��AH�5��]GAY9*�k��B��PTWW��j	�Y��"?�:AF��9 Sv�Ck�!L>p�È߬���%�Jа�$��O ���z�P^�)<&@�cI�t&,B�`*���	F�D�3e�>����ׂ|)��1��Xj�
QA�Zt)�����T�Sz�܉s�ģ�F��ŐE/�y�btD̆ǁ�m�O�J��B�Z�9T˰��+�DXi&@vq�Z4��J��:n�
�
�(�fgg��a	gA��>芞��Exz�<��-%R�(j����x.���5X�ׂ��p��C��t����2)��#z
S�D��ޑ�B�H�檤��$����]k����,�+OU`�i�8Y�Ul���Mx�'
߸���J� ?�5Px�ԩS��FYw����Q<�
Yk���1��d�n^=���\��	%X�X���X���b2O
oa��q����
��+e�]ׯ_�S@9��	EqΨ�9	M�\8
b�qر�S����؂�`rEx&<�	�����{�����@ŷr�	
���TV��� EI(��chrч,p*��Sz c4��b��g"dw��Gf�ɲ�<<x��p%3W-���2�RQ�(W�¦2?��(;�*�uPg��fW}<���$�Ȩ�/��0��x6T�'$��<^�9�?�4y_q��P�`���یD��>ڎM������h;6�>���)��A��#2��6�J�a�S,�uB��R-">>�$��c�򬳖���S�Z�@���N@�`<='��s"���k,$�c���DN�1o�A�J�S,D�𿦒g��`�Y����Qҡ�C���ݕ/E��`T[B*0@��!j�Ǡ�uZ�
 =��!9l�/2�>Z=�{���2
a��ر�ް�y	����їnJ��ٳ$����z���|�A��W��4-�z����}W]H=9 �P�h�y��⌅^)���X�u��O��|~�8*�g��$%%��R�5k�eSF�qy��DW-4؏F��dn�l�(�F��Y�m~��`� 	�Oa��i,p���].$�z�}��IX��^CN�8�D��_�_gVy����:�������q�t"n܅I6�X�����]0����i
� �>A�g�$�)
�ݹs��T�6�h��&�a�A�"aH
g%1�#�c=�7�ƨMΘm�9���c�1�1SM��p�	N$_f�[�	=X��
N�-V\�|�(?H��6��:E��&��F@l����nӻ���fL�i;�lw�t�P̲
��Y�O5:�1�0y�%ޱ;��gҐ]T��
1�s�Oy�!�#�x��in�V���ym��5!�{����:�j;f�X��
h��z�c�vWL3�l_�f��c��
��Y�kɮ1>���`��C�ۏg��)���*� @�f�9�yzz�b+\"��V�߷�F��`>�C�i?rVJm��i@�gF~��6�b�AoVo�2`��aL7�fǎ
��G�3��L㣘��:����JU�	x�&[6�����e#!�0�8mG��w���)�0��"�����rn���S����L�灩{�0y�+�����0����qa�S�y�`�~��+OC~��ɏ�8	�Ҽ���4'��/B���RS�#!:a�]�n?���a�:h�q���0n�&�pawΝ�6(��Pr�kt�܄�󜹲$�k�y�Ÿ-����K6$������6�:�<�rz2$DOh��CB�<�|>/�0��`���
��완3�Im��Cz��Y�s�*�GW�W�>��&�=�<��d��kR������5	� �L��KXf&���f�u�0�hϰS�;��y����H|��7љ�˕�O���w�;o@�Z1u��s�Dh��Z����Xa�
�M���1�>�0Xk�6V��Bq�3���y��G�+�ct��k��H���ܟ�6������R4?�|�.Vt��O��
��cˡHz�OC�8G�=p%���u-!���^u�F�]��R@y��!,�3��/F��~h�x:�OF���BHO,�$���tO������1:O���y��ݼ�s��Fԩ�[�ۢ�	�Yk8c�6LYg�d�aķ{1�1�}��6����P�tE?/:O���Foh�
��(���,@�@Z9�R� QV6Ϥb�_�s��kf�x���8a��w�����"(��謸T���<]ǣ���Iw�)�X�7���n
�������\�gf#�f:�O����y�v���]��~l���J��Ÿ�Foh�|fJ�/(|zg'����P듺�}h����
PI�=��5eh�6jA��s��Ai��P)�K�b��s��O��hx���C�lA%�+���Pmԅ$V3����0Sc��_��E�u|5�5��v�fz㾇���͠�f��D��ޟ��'4��4s�VC�&M�do�,�ۢi����)('w�$��~��H�2S��up�Tw���;q��C����x�aψe�bt2�����p'���+���N�n)�Z#IEND�B`�templates/hathor/images/header/icon-48-newsfeeds.png000060400000002405152453623430016400 0ustar00�PNG


IHDR00W���IDATx�Xc�\Y}I�m{l۶��}�m<c;y���Vf�O�ٵz�Aϩۧ=��n�:U���_}BO�	=�ˀ���u`/P<	$��/Y���k��^>�7<���]��彼�"��(Rˀ+�	>���z~�gc��W�;I��z�偉����ف�<"�9�������g�~��v|E,;�;�����^��z��	n��J�U�ug ܙ4���X{ʿ�'���	��:��P`��nt@
i�)�j�q�n�6=��[�b/~m��ZA(rDx(�FLm�|��k֟�G-S��x��� �]x(�cf�sd��ύp�ʣ�%�!ST��h���F�o��%.^q8�$$")j��:J�bj���D‘�Nx�P���ϋ^�Ew�`��T$�}�ׯgWQ1����B�:��n&ipWw���
g莚wE���X�/t��܆6)�Mo��}VŠ�ʀ݈�^����9hѼzK�n����n�)ʇ����� �|��1��t�wn@����kN���\)��@^��xϹj��0�:��������J�Y�o{>�b�@fÓW�>�1.��M��Kl�Tgv:.�|0�JB爙�F�1س�b=�b�#\�x�DB��B��T����D5�r=��r���%�A�-�[��R�v��	�7�]��Qt/�UV:���Pd�x9zZi�d��%�Թ=*�~[����|^��m	Y��|]�vDLi�@ދ�dN�I��D���:��4�S��pB<-�EM�G�i���җ�kQ�(isQG$�4Ԑ��!���(����!E�;Q���,��bGBi~��ܦ�?��-@���0��M�魢��I
,��Fʗf"���o�?���k��g��Y-bA�
v�#E�h|ue�`㧵R��n��ABO�ʜݥ�KF�����M�١����̇ƀq��pN���	�N&�4*�d�Q&h��V
�A����Q�2)!��g|ƹ~"'7�1�FS�	S�y�+Y����l��jbz$�/Ž@w,��D;����-	�!��G	2x/0�cP��(�1��D
rx/�t�C�<��_�|�f��GL����D����2'���5�Z>���2#@�F�LW7����j4�6��#qY�ح9f�����/�0h��gy�_I������6I'�]Ht�2'�n~��='}�CO�	=��W��♀vIEND�B`�templates/hathor/images/header/icon-48-menu.png000060400000002400152453623430015354 0ustar00�PNG


IHDR00`�	��PLTE���������������������������ž���������������Ц����������������������ظ����׭�ǰ��?q������㴴��������������ÿ���i�����:q�Bt����S{����#_�4k����2c���Σ�ԥ��;m����)c�������y��?X|���H�Ks�������������������Ro����`~�Q�u��)Y���ޅ�á�����:UyJq���덪͂��Z�{��u��:`������ɦ��Bi���۔�����7Qu���Ou�d�����$S�������1g�Bk�z�����>Vx���Ln�s��!Z���������񅓩�����ʌ�����Py�]}�K��Ǿ���Y�'V����x��L����s��
L�.U�i����R�������9c�.[���՘��:h�Or���Ϧ�Ƙ��Cx��C^(tRNS@��f�IDATx�҃�3I��.��۶=k۶m�z���d����>�$s��i�M�pW�{���{�}��77�@9���8N׃�'n�=�t,65���8|����&2�k�1��/FPY+��z��/������.ņ�4H4�r6�-��e�x<;��փ�w��8n��m�a�����;�>x���Y~�|���x�	U�P4�*ʪ�bje��������@R !YV(I����l�1��v%�D����]h0�d�0��HQ���A�
a췥��d��	(������>���3�j��p�<�˽����ߟy��?UN&N��>y��G�J��^���������cG���G/<5���uO"�҄��0��)y�)I�0!-d�z��3���!���⮒@lc�#�yi�=�DI�t�����{]���:f��:�$�U�ލ�UL	�	����%UR���[��XQ=*(ev��Q�,(��i�
=�$
4�F�c#ղ��=�M��P�k���ݞ�.$�K�,Y�:߱��2�j8VUh����|�|�+�N��݇Jr�~�e��L�R�74��@�'�[_������U����>���vۋ5#�g���|jp�.�&�Є{�
�	��Z�(]���[�(�aU=	:�BHiA�& �4�����l�M[�x�����)XC+�8~e���n6L�l�o�Us�Kc
׬�;LΔ XOIEND�B`�templates/hathor/images/header/icon-48-user-add.png000060400000002717152453623430016127 0ustar00�PNG


IHDR00W���IDATx^�]hU����I����"Ֆ�� E����}�.(�@m���@%ƪRZHQ)�TԢEp�/�K�'��&T���6-M?���n�c�'\谌f'ղ#�lΰ��s���M�)���4�0V�i��Ȏ@J@)%��d��9�����
_r�q�>I�aB�#
��L���i'9-�����2�	b�Ri�Ȃ�
�F���ݼZ���P�����)h��,,�و����uD�(D��B�"!�RP��b���9���~�]�Y/4B4���+���-$8�q t>p�Ѱj�EE"�X�.4Ci�	��E�o��D��n�0?��������"1�q�?*p�u�9K���J+A������Z�D�\��n2�Q�]��Nr�靹�맑�B͍��hr�����M�;�[&l
��`�'v-Z'�@0t����>�m�|�M�$�#�;�o�+姓y�ڡ���"�P- 4h�w~pQ~	����ky��9[@_�Pb_7m�!�R�n�N6�v#~ 5���M �h�1�x���|1U@d P0�aӂt�z
*eP
�Jg"D����,I��x�����|9���@�F�� ej��*��W�� �>�OκHߝG(�;�m-���b��Mv�j����P�$"M=� �#��s0��C#��5_��o�5?SM��bI>>�x�0��G8r)t��1�S�޸�P"���f硶��/��q[GK1�{��a����	�Wa�
,΂,s��E�Z��D
�n��"(��1[�D�8(�}���4�5]��ׄs�����e��P.
��!��g�@��߲����y���a(�V�*\�jq��o��~�?�;'��9l�Z�
�*�G�Ƶ}]�C]W
�-
���t��ހ�9�R��O���k]�w��VZh�B�{�ic�W?�3��|��Zx(���o��]��h���5����Ǩ0�x�P�lbT��_�E����s�s
a�ƭ��x��Vv�ڿ�������^@��"��z5>44��sMN�_&:�6ժ���G�m��V
�r��u�(�6�*#Е��q�1����@e�e��I�f�em���o��L���#��n��͇�oqYl�L'�ٺ�����T`��a�2��d���Y����U!��{�
���AW��[&�s�yW���ݱƽ���
�Y�Y���$4`�����%_�AiY���@P�Fc�39<9Cd�`�Au�,���`�\,�	C�a��4�%�2@X�å�P�`m����Bg��A����ؓ�փ���o�l���6^�t%"ad_��I�@�W�BP��5��Ϡ��$@�n���_�Y��)zN^IEND�B`�templates/hathor/images/header/icon-48-read-privatemessage.png000060400000006506152453623430020353 0ustar00�PNG


IHDR00W��

IDATx�Zt#Dz��Y`df\/c��y�����m�0�����̌^,9f˖-��Я����x�S�s-�������v�$A��,��a��q�w��L�������e�(	��L����'_��k^��ǭg�}ֺ��;Cg�qƥ����?��PϏ�a�v��.���{�����7>����hѢr���b�&''�u����y睻Hн2��@�xxY�D���a����~���͛7�\:���06n�8�e˖��뮛�|���r1��+{\���e�|�i��v���u�<J�e�����4B�hDz��8�s��ݝQ�v"Y�x��э�<�?���ʼn�i�f������ʫ��:U4*:��ިH;Qi*W�Z�}衇^�bŊ���F�	�F����b!����4�O�\�s1�3*;+@�����_X��o|�\�|Oee%���Qa�2H�aÆ멢���Ϗ�
B,��W����K��{�r�ۍ=h%C0�Jadd$���O�~��^
 !�I����d�����|�e�v�<ݥ�z��Go����w1B�8������G�ӏ��Z�`�+Qfɼ��a,d
&4]�a�%�{�n�喧��(T&�;�>�}���y��fPu�F�HkDX3-�.��_]�	���eK�^���$�u!�tQ�C���d�W\q�A��]&�i�t۳i�a������;C�«��t�"��===��c�8W�k|Ϛ5k��g�}z+**v�|4�"CDcY
�\9�@*��tq�2{-�'�A���o>'�QWW���A�ǚC9�b�|��((�HZ%bf��MZՙ�KR�G��,,��s�o
�hm�I��%�:\����?��R�\��3�Q"��F��É����4�1��\4�κJ�47��<3�$R)��k����ʕ+W~��	l��Ȼ�(6���	Ң@�}~�1Z*��u�|+I����~P۲�G����px�/�������<h�
,If�š/MnF����R�o%�;hooob�.%�M�:'�|>�b)V�:��;SID5��3,�쎼&'�����&o��H��*��<��U�B2-@�mmm5��y��,�011��pS�ٿK��bSX��ώm�0�$.I�������E2���c��'���jP˜�����RQ��"��U�cՆ ��%!��/��@��������xqK��a~uhu>�G���Gy�����6B7�
����9G5Y��|>��L��I�JFF�z�d�L���/Y�<���u��!�����ma�7X����c��p����7�ٙg�y�u�]w;�I�V�
O����Ԏκ�����h�WY�3qhePO���G&��W.w��͡)D8(��=�*D6�`}>�-i�>>g�pڛ�x!�wB!�s�ݶ�C%D��ASx_Q���	E"V�v�qkhh[�$	LGH$�˫`j*
V�|V�=]y�]�ji�6]���`���
�&��L(��H�dq�$^�z�[Y�$�R�?�s�=Gu�� v��"���ʎ�7׮C��C
}f!���~�z�`$��1[-|Ċ�� �1o/��<z�S��3��� F,��U�O�"b��4����
�6��M�0�Ni5F���ܝU-
�r�ö��D��F���092�*�'U�@�,��\�HШ���������
����7Y^�7n4Z���MCD>��r���R��Є�򽽽��#��f���I�nx�3x�h9�&0�؍���&��=,6�PK�>TRn�%C�bJ���QM+-�<�Y~w������6�fvҘwGGG�p�B;�iǜR��d�ڛ�=�Z��Da�� 6l��T�"�-W�T�U)������i��[�X��2�L�~����;h�#���:���%K����ȋ3�=A��(�46M�(\R�
�1fac{�&ot0�sh:�@�R�F.Z��-�3��}>�MrU�!�Q؉�n�p.c�!,ii3��g�wJ�x���%a�t�`㶘7�m�5������2�A�bP5�o�ۯ��Wz�x�9&�r�}����ǎ��ac��H�X��>I�w��aDf1и^]��.�@V�"tQTB�2�eM%$4&���m�^�LE�*�DT��L䡡!��TWW{��Fk�y��?�uA��m��I�&n����{�
���DE���G�9/4v�2��g#�QR��YYd=zI��
!&`Q��5[��Ó5x�c5��l��t1Ң�9@�c��u��86�������^�a����+�Wn�݈y�ȳ��y©4���,���bs����jT咈3.���,�
����B-nX�F����vՇ%��}H�X�Bd�9��f1;;��!"�
�D�i]��x�鑧���O�C��I�ͼD�9�m�W@�c$T�>l,h��zn����O�*���<�o�(��m��P�Itvv�lN�8V����0�3�x����M�.��F��� k�P�:�����.���&MF�2R|J�lhx���n0�y���
�4����	�UJ�
���ur�)�eee
��[ƌ��k�e*����dQ$�b�R<66^L�:�6Oi��e�A}�������
B��ᅫ�D�,�&�I38d���gVB��}N�>�r�rd7~��n�<�,�]t~P3gz���瓚Ì���B"L)�&��<msG�LE�J��c킽�	�f�����)*����Z�n�8_
�����B��%ջ��O}�+J>�Oxk�A�0�V�~�*�B\�ݲ[���?��ݟ����9v�!'N�^B-�����y������H����@ᱱ�i������W���M*��/�y���x������h�`9LRr6mU7�k�^��?��y��S��y�y�0C�r�#�RW_}��Ԙ�C�V�0�TB��R�%����ԍA*GA��X||\����5�ِ�? }�?ow�bGi��T�;�~sr���/��Se��yc�!ɯkB0��A'�����	�
�'���J�,�c��	�V��]�6�Su�jB��0���JX��U�5�ռ��c`�w%�˯�H�v&$���k?�Y��#g�,@�08�"X��������rq�p?��k��w?�T�'\�)HN�L�@L`� k��dQ��$蜔���Ut?��#����s�s�!�dv���␄�-�9#���c�����?���"�VIEND�B`�templates/hathor/images/header/icon-48-component.png000060400000003405152453623430016420 0ustar00�PNG


IHDR00W���IDATx���Z��dx��m۶���Zŷ��ֻ��m۶�';]�Ԝ=����������sN�535l����!��Gn(›�#�x���y"Ȕ0�sW~7)X��;�L��D�$�ȜsT�ֽ��~}0��cY���2z�>�1j�{(�Z���sv��Xn'o&v���{���M��4>}*׹�f������/��O��>Ik����q��/!MR~0|G��+�hr��>��߅�he~=I����g�`�������������~�p��oheG`WY����	���|�K�KAo}�k�;��MJ#e�|8�y�˲����Gr|��O�~�Ĥ����ja�X2x�pz5�����\KnǤ�g3�N�$�4v��=�s�"i�~�{9��"��+�g��O���(v�o��A��T~;�0MV��$c��Pn�
!�o��Fc��&��܈��6Y#�a�(��U��sn��\9.�FYc���R�����6P�ֳ�j�z::���5���E�3��]���{%ϗ���%<΃�1J��y��֕�q��Uq����)�8����S�x�m2D��ESv,;����QO6t*<�f��^��x�e/���%7WWBn*#��;��Rv�&��ˀ�}K}���,���yA0e`1�� �q��c�2�w��^p�eN��/�C�m}7#�1j��Ķо�Y��{=�-P[��DH��4���q��w'y�Vx�
Vx�/�s`��(G��{��>���3c�/�N��jz q�ɭãN�{�+-g4r�R5
�";��ʧ��kz�g[9�=Ͻ�*w�T���$?�א�i�9���W�;��M�Xu�n
��cÜ�X�q�U�v�6���	��{D�⫮f�n�T8��G���d�N{ZE�ZW	���fJ���s3���Džc��!�|�W��8_�9$�ɻ_�ã��L�?��=��l0�J�N�ݬE IBւ@@�<��W���?%��x�O����4SH��w�x�o�Ν��{P1�DH�q�CgWf@���+�"��An�F*di�B�?U�VB�TG%��ÿT"(/�b�{�D�g`5�Ra#���#B2�\������ʀ: 3�l%E^�F>�%e��0��e	m����gGM��6�

Z"ι0H=��e\�7��R�-��Q^*��PC\B@Z��G�L��2ۘ�D��@M;�@L��/ ���~�D�Y	i�
A�$�Z2
9�d�b��"Ul����Ȧ��L|P^���)q�l�
�2��XS�P�O���YM�m{���˄�z2�ĩ�%��7z\�cX�#Dd{��{�Խ�9M����]Z)�4�����)����1�S��$d׮]_����l�}�n�Ź�����+_��߾��o�`'�h�C�}�(�[�ڽ�m;�1��U�S����W\��Uu�E�z�#��l�H��n��Lu��j�w��)�v�+^�\��amm�V�u���%R���'<�9���}n���y�7�1��^�Z�2TW�M�Y�1���W�)�n�[@������s�_���(*�䫽�C�v��O�_�%�p�J��	,+@W9�RH��:]�������J�X��OK!ׁ$�:ܗ��8�琷*a]�{�g��)',��R���d!$sHI�k�\��&lag
���3��IEND�B`�templates/hathor/images/j_arrow_down.png000060400000000227152453623430014500 0ustar00�PNG


IHDR

�2Ͻ^IDATxc@���yo��g1����@���c�o�Xn���f@���#�o@l�����@����N��M���8�DŽRـ8���E&O:<@�PIEND�B`�templates/hathor/images/selector-arrow-hc.png000060400000000200152453623430015335 0ustar00�PNG


IHDR

o���GIDATxc��A�����D�F
�^5�0
�5��B�F[5h�ԄcjDv��m!Z#LI*��b�AIEND�B`�templates/hathor/images/j_arrow.png000060400000000263152453623430013451 0ustar00�PNG


IHDR

�2ϽzIDATxc���g�.!���� ~�6x�������7 �éPi��-@���q2V�r�[��4��P�i� ����1�B�[��?��d�n����O�����R+�X����H�=y?�IEND�B`�templates/hathor/images/j_arrow_left.png000060400000000305152453623430014460 0ustar00�PNG


IHDR

PX�tRNS���7X}zIDATxc��
�|���ӛ@�'�L���a9i����!�/�c����`�0��J����t<\nΙ2�k��6��K�<Z
�FX\�)"=mX��k��ғ��@�1=ݶ:&��x�H|>�IEND�B`�templates/hathor/images/j_arrow_right.png000060400000000273152453623430014647 0ustar00�PNG


IHDR

�2Ͻ�IDAT�c`�{Oo����B`�������
�_.��w=�?�t�
A�`��B��bW<�L�d�����
S�̣�(
w����,��i�
�6�v��%`E�k����mu�|�p`��veA h2IEND�B`�templates/hathor/template_preview.png000060400000055262152453623430014126 0ustar00�PNG


IHDR 3ϛ���PLTE����}K���4kU*Z���~����;s��s�I���76t~����������dmiզ�>?Z��k�>�ת�;DJ����v��$lo���@3eA�Dc��˸y�:���L}������R���|m6k��1?|��������僞���;����K\dHR�9�?�ɖ�w�tRNS@��fY�IDATx왋w�:Ƌ�+(G<R�%Q�d�\@�Z��v�뤾}����4b�I%�u y���AW]��t��+!���檫^���Ұ׮��j��\u����*{<&����ȱ�ɽH�t��\�eǥ���_��{�~'e�r��ȹ�9�8���Z���D�4�j@��{S'˦����Y_;�ٙ�w�9��9O�̥����T�,��������뽰̌�2_�x�޿�����`s����J6P?����v������]Y�#�/V��%3.\�F귓�yo�gפ?������xs�����T�z�h�ؿ��(�2�K�dRV�" QГ[�N��K�9�)�w���]Qt���8����ù��ɱ��a�)(KԚ~'�b��ZQ�D���<�䋀D��q�軻�=��f�9V�y�N��úr�����`��-D�Nc���H����{�� �Y�
�uz�����@f�p��qF���7v�HEI�x`nuLaz�A���>�5�e=��b���v�������77��(<���Y��zL��t �DM38P����Z��q�(W�)�eZ):�J�,�J����%@Hb"h�1"�5��M�
ѷ�����o�>������)�Q��Y�7���tv��� �i�v�c��c�L���t
�c/�xs)�S�m-68�	�D����_)��O��QvJ�� ������X|t��l��#V&�+b�H�
Ug��P��d&�#o��g"�����(�P깂�b�mm��=gmS�B�ib�:�A�Ȑ���,���`��5��D�@82�ODD�$�
d�C�c�Ƥpl��*Qm�c=�DH�pjf@ 1P8u��r�
��U,�J�vq\B��"MO���\�i��F�9ix�r�JHй�/���i�I�j�Y���-O��}��3@�t$�xp=�Q��~N��ֆ��	�����QVt�'@;�:�z��{1=bMFpDj���eG�&�N�?��W�S�x� �4K����u��pE��9 *��c�H�`��o��X�x�c�ٴXi�%@@ ������n���G.Vx�\�H�XM�3��b�`����@�q���(/;Ru7-���3T�U���.���X��e@�ǡ�=*��%aN�aC@l��� �����/�p���M� �C�� X�&@2p.��CE�����ӎZ�dG��պ�>����Ro��X�i�BD/ҫ��|d��t,�@�hYD���Db�D������.V���B�Q� im0=Q�-yD\z���h����r�< �z���b�,�^UVsvWV��SSvs�Pq��yUoÿi��v��'Ӈ~�:�ɪ�^2��πl_<�L����F��3 6	��ɤj�s@pG[�:�a�n��a$��B�)/i���m$�� 
!�7C����xf@��h4O�(\��h��h��XVP2Fqq	�E(X`I�Y�F��t�%����nɅ�eo3xO�όM���qE��U!��iP��X���[��2&'���39\�� �L	[�v&�7��\-��GyK��Ie n�����*	�Q.��TH�8O���9@����8���ܶ�6�ˎ�WȣB:@@��$����[v({����K���D�~�;N�%��/W
�2"�V��EZ)�jdC|񷷼+�I�F�5]P�k��f~I��z]P�XJA��
J�Eh��u!���h]�! C	�!'�T�1e�Y_�1t�*H����d�|�:��R~����9��
ڒZ���fD,~(���B����p�'@p�_&�<�mr���@�a��3@��
�@��j%7�k��
%�:���\�؟,��^��}�}�d4��[ƕc?C���sY�j�
]?�7��1a��8�ȡ#���F����]��:�P��-�	�F�sʢ�;�{�|�D�C=�:��'
��l���BFT�}T��8)R#a�fs�3�ÔD�FѴV��x�dR6�V�d���$�{-�?��oR2���s4�Y�D���c���Ν�Ȯ*q��t�P([�eh� �J��_�YfΜw���k����&��^���@Z٭����*�
!콦`?�����8 ]��1끚V�5k�5k�ˬ�����������Z��+�~��1�Y0k���&�n�?c���}��/��P+��5���Sp
�<�n>��@�_$�2�L �2�L �2�L HH�L6�a A�B}Ȗ��)=d���c���:d�Ϳ�fH�V���R}; ������r�@zeD��qH�����! �Yl~�G�l+���X�y��8d;��։2d�[)%�yc�7٠<3ş�C�@<W�]cZi�u�j��\=S"���qccOeV0:f3�Ij�g�v'�@&S]5s��-ĞB�����،qlt7Ѭ�	9�z�Kz,��-�f�r�:$����i��wl{���l�\�����*ַ�! ԁ�@�P8N �%%�x��J:d����8���! (�βa�{��&3Q��]b��'����㖎Ŏ9��Ǿ���Pt�-o��ړ�-��8�RJ��'��S.�-�U��PH�2^���=��"5a��Q��hy����,�Q��;rH���j�DfY��"�P��L;�S͸�9���R�P���\4�5=t��b��bˣ	4�aK�Hqp���F���;�ʢ�O4)��ɦ�+�Q �vD�w�EF�8m�Y��[�����c�G^�x&�#O�s4��N$�j3���a8d�mI��M((@�G}_~�`��4�t����dx�e3�B�;
��3�6 �b5al����5q�d�T�^�Xd��T�w]ud�n��6d�҆�Q���s{�#@2K���b�"�.�2��,q?����:�gm:؃�lE�!B*}���$`s��D?�X:��Xb�h�7<I�ã�e.���0�L�sf3�:�ݜ�דt	T�:�$=�B�F�
�2� /_�I�i)(����ƞ��
�wd\�j�O�5�Jn���s':���ETf8��G��-�a5���߬�����ن����XQ�_�Z.�r���K�w]����B�ŝ�e0�p��E�᷋tc^?p�����n���X��'�Q���{�0.|\B ��N�^ �vB "$>j������So(�Q��ϛX��@���6�Iu����׼�S����b@ ��S@ �@ ��@ �����N�s���VUu2_R�8��l'�[�G�U/�)��(�E'��y�n���{���:�1����`�~s��>�Y~�'��O��B�al'��Gm*�9�6�J���N���Rֲ����a}�x�q0Q���vy��Ŷ�l/�d���q ��^�T}�g�ݙ�J���#��-��*���E'-[���R�oi��Q�Y�ue�R~]�小�+g�Vvn{��P�����X�L�:�i��Xߧb���,����qy�O��~H�������]�0�����k�c�^fue��h�S݉c���s���.ޯ�嚉�*���A�j�6ku�	��h��~wt��r�چ�?��[��:��[��3�w� �� �@ �@r�@�@���>@�0��N�>�i��@ ���@ �@q!�:〗8�E�{c��0�v ��s�6�{�{κ�?��!�=�C��L �@�@$��V`B �]l�]����3�mS���F��6d�bJ���������g��eI�&��^�+���\�|:@��[�pbI��(�(���@�a�ljΉ�5�p;���$��b�� �.�v�&�'�oO|VFAFA�)��(���A��z���������Y�Xo�����	"�J���l	��|�YY �T�=$7�lM�z�_�	�٤��
�R�(�&�
�9���.�<�i�d1��r^k�`^�5�:?��Q� � ��(HsR��·%�waĨK�C1�/.�&��a���ߚ�u]�$Z���C[A�dy���Pd�u
pDs8���(��ט�܈����K
��- �$�Z@���6�k�:�1ڸw
'4�J<_�fM��,
'r�3�(��FI3@�������7���|��a0��X>\����$�1�ir
�X�^è}�O}-�����@�_0
��4F�������!�/
9!��k>p����W$W�H3P%-� ʁGr� �Y4}7P���b�O������A$EC	b� ��A�a���C��gϙCQ�6��f�ȇD�AА�	��y}Rr� l�s��C�pf(`
��`7�H׌�h��kAА��`0~]a.�����U{����̀�h�D+f�@I|��1Ku��\gHoA�wh���2\�kZ5�3�vu�In�׹$� � &�0Aԩ �>kAO���3�ù� G����%1� _[b
���T�O��>������Jl�G�/(j�
"���(�	Rp�N�#�=Y
D�v���b��y[�D����ZD!�`YI���� �Kh��Y�^�դ��b_�/�Sw}����ʛ�����벸����A�[G�q�!�U�G,X�i!Brq��������~oA|/{�W'�ʍ�	gR:3J��G=�]����˗��>4ff���$��9e�ጯh��h�o��v}ԗF{9�O4�bt�1�ªvNf��vݤ�؅k�`�z�R�m���GF�+P�A�h���6���� /�1塃��YPiz	����Y�
�l�����)���v�Ҥi���<f�<&��I�4g͡�7���<r9hp&�R7ߢ>k���v}�4��~8��MS�a�)=Mg�ګ�o�4G�"�&�����^�w��O?�O�9
� ��`�/��;5H���f��z
����ŤcQ�
���DoK/=˿=�
"�v^zk�C/M	=�e�m�&œm��	R:sN�+;A�y��}g�2�� ��O
����&YC��Ir�!�T��$���*�̮�[��@���t��ʁ�G���:8Q�;��;Ȭݭn�0�X��!��W��� �Ӧ:�?��n�  7�I���x�^¼�%fꦶ�@���pC�x:'Į�a�������!bbY���N�x����0�%Ko�\�s"�C�� �e銈 ��=�"م @e@�0��b�d�ٻ�ͳ�ք

7�i.�9b~��Vkśgh�� ��z:X�����i0�x�e/V����
2��� �[Po,]iR� �g�{9�
y� ��OC��]Az��\ 
��QGA���� 3/Jrs��iÞ��7⭭ �y�o�I\<-CL,=ͶY�ͷO �~����P]6��Ma؟��	�צ� ��\��������hf����}�V�Y1���i�k��O���+�׀1?��؂t�C��q��N;A��� &������I��)I{VV����$��QR	BnFE��������)+�����T�l%e0.���-�#�EP�p�������p�N�^AX�133���AD�?����G�ٱWA?� �c`�>ct��s�A{	��	�����-A�R���ۏſ*Tb7�g�E���!+���^ao�S���]^A\E���Z�BJ����|�
��z�8��8dAh{����A$��w���*�(����w�����K��m�����	"�!R��g>
2V�S0L������a �-*�t� \r�?�������7��6L+ř�2L��݄ў�`���Ȣ=�E}eAFA�u�G\��C��M?V��E�(�� t�]�X�v��dk!�y�.��)H;�}1��
A�Wd� ���@�`���Nl�a�&{�W��ׂX$��� -Ӛ���c�F�A�����`A�o�P���������P#�q�>:�Wvr���׌����o
"{2k���!�%�(e"�,���S�2w�����(6C��g4�B:3�)�{��i�!��%�q�o�/��=\��4����w^�w�E2����!��4C*��e�C��]^AF��'��3AT��%��<��IZORrPy49��蠙�6n"��M4q�g�&�i�?�D��i�ͼ�I�E�oG+���65��6q����/�,8�}��Hx[B�&��� 2������8�;�
�۷�P�ỌK/�HZt�F�ʡ�S���Ѿ�ˆ���K����lnr�Y��R�62�	u�H�Pd�F�����2+J��m�Գ`��^ͲP�Ds�����/"����Q�9X�d��� �(�{���B��I�T�i��PGb�Ig{B�Z(
�Uz��
�mf>|���"2��^F�h'���X)��'[[A�T1�Ķ��+��$�`͟(��1��^"�AA�q��!�����H�(A���dhY�f�T�%ȶ��%�l� P
�rQ{h��?b�eh��N�%B�Jr�L���\� T�(:Hj�u{�yD����.H��hAR�YD�
�$.����\nQ���V�����(�eN�ȱ|V�^$ygA�`.����n��z��t�y�-Ozb�ʍ���oħ��;��h�:�@�2ZFtL`Ax�}������l&~��m~A��djY\�BB?�.�\N��P��%�󜇹OV$>�g�-�a@�D��"���1O�p:��6�?5�{MB�j������e�^T�{��i�|��J��bM�&Hdx�m
5AO��	�ii��_� -M�&HK�0M��&H��	�i�4A� M�&H�	��c���2A/X���?���埭w�w���}���?>�:�����ѷs�/����3]��IQA&}�
���ח,�rM�R��#'S�%A�[�Q�����:Z䄡(�M(�5��]��
&�قбV���I�":�b�C��W���$�X�u����4���e���M�\7���J�p���O�gf�� 7Q7aƭ�"@�\�s�7�bF2�2so�	�R��\y"2UmG�޽��x��� �����)�B��#��x ��2�٠Y�xC��8y���H}�N�6�R�6�z��ŕ��U'��t�];��̯�cA(n������!�Q�
{�&�!�D�leֆ]�d�c';
	� N��Ԩ#/��'����[dZ˓��
2���I$ .��:�� ��)s��������<XZR�ֻ�����]��ߠ,�>��p�,�ot\���'u��)�yoEӈ�6��a�n�
��T&�Zd����������O#������ �
�б�"�|(�1y���[���L�o����`A:�pD�+�� �s���N��L�Ĺ~h����
"|�t�� za����fo�YF���eg"K;�k�|���
�o+h������:+$g�3k�A&��&l�}����Ib�k1���s(��i^'��7�u��	�|��a��NjO#7M5}ak�
[}f���"H��7z��y��%�mІ�68�U�<�a½቙u���fF'ɺ�<�i���M��{��y��"�X}���aMMx�촵<�S{$��~qܺ���>L���{an�8>9w$����
�#�P�F����#jC���t�,�?[�Y��#0���:��" [�Pؙ��6����k" [���Q�V���B1C@���щr1^�zE@6��S����"B@�YH
<jB��d�i5��%g��ڇ���.l%B@�B2�J�4Z���
�2B��d���	o l#B@�R���$��2J�F Ad��@|�J��ȼ9� �b���F ���}�5� 6! BJ&� Xɡ.8��.��4W���[��?1��f����]A@�S��ԸR@(�
w��y��Z�#@uC�A�9���)�Jz�V��B���/��S���d���u��P�	� T'um��w�������;
�:E@Ȃ:A]��¨�# tG!E��" ! �0:�U�k�M7�v:BT�Gu��X�Q�E��1qr�ܺQB@���r�ӝR��Xl�UA���
�4(u�ܖ�p���~��[U�A�0J)
G��l��5�# Dz3�4o�с֒�v�D�5�ZWZKQ�M���S���dz��ڟv��t�wa2����p��9��q^��# tG�3�WQ4�jWrh5�Q�Zs��J�,2ʸ($KK���F��;�O/8d�<*�ګ
����l�/��i@@n
Hw��ux@�e�S ��_�X���郎q��]����,����y���P$ ����S����g#�4��w%��cˁ�O{L� ��X����!V�ӂ��sV7A@���NJY�J�=�Iz��v�Qȥab�˔c	������+" �~��a��v!�����ﻛ\��a	�,��Qh�["U���_��O~
�qT6�2D
%�nx�qWh���dT(8�H�s�i���G >\�����e@�=��ǵ���ef��}5ŗ�$�/��F �䐎��[?��C]@z�^K��?�!f�O�0+ԅn&;<�ǧ��#�ܧìPJ����� �s6�>�������.2. i	YH6�2���
1S ��'9�1�^(d��S�����Nv���X�۞}�X�)ۘY
�_�5٪a��E@0S��*n_�,�=N���Q`�qI@�����ߐk	�N�O�A����H	��z�E@��k�(�F��?4+1����6���Z�;8�e�5��c-�\��x��p��n��[n]��Qv9<I?���}!ׯ��!@� [��(4s�R�V"�2a�c%�G��16Q�+H��CC@�:`j�0Ia��t�O��5�/S��2�RYֶ��,��!���S|�@ȡ�u^�0�/3f��A��o��ac�%"Y��n
 ������n�@H�J���.[
���݃<�a�!��dL)���O��z<�" ��rX�wq����UOһ�Nҹ�Ci�K!P�m! �3 �U�tG�qj<i��6/?w�G���ZE@~G/Ჿ} 8G�߹�! �H��>&�U' �V/V�T��I���@(b[�
<9�|p��Ň���@>�*���o���B@0�1Uǯ�n }��r����+������R��]�Q����,�O{���?]C�Z��`θ�:�M����ǫ�<�A>�] �wM�' ������X�Yz%=�3E*֬���4<����nu QG��<��_(��a�[	Hux�H���' �zxo�Ry�'��r��5\E@0�r�L������]�Q�/�n��y� $6����zcT��T�KUp�@���;?�젖�Q�e����m�@U��q �`�D�u�k۹;
aM ���! X�Vvl�M��XX�_�ח|��y�1�}+����ޝ���CqǺ]{�4]�L!B9��?ٕ�t�׹]�ݽ�6I����st攘3]滔k�z�9�?f2=9�(��������/����E��sf�s���&��#���)��1�B!�|��c~z {9�3�������5��^(B��^�W����!|	6@ �@.�A �A �@ ��K��}s����'�ː<���֊����&^��Wn�1n7뛳�/	��@��}��Ւ��,�/�n��2���)Ϟuy �WC�����\n󧥷e���WZ�6寎T"Z�N�g�K$�a�^���D�&O쇦�ڧl�^+��"w:� ��K �K���~���g�f����F�<J�0u��@�{��{�m��rk};�C��\�&뵨KSק����)�H���+!�0��#�H��ӗӕ�)��8�7^[^�}k���,/'�kžg/��>I�A�^�,7���m��.��U�%�z���c�}�&�}`)�:�HH�VnD烑ɮ�K20�/��K��#���s��lV�Ͷ�L/x�#�*Y_�$S>N�>�Ə��$�=N�^DHa6wއ��)���$�mR���r#{}�Jn_y�Y�فȑ�z�ŝ�T�s�<����7��u�r7����RǢ�[N�{�������b�tSiyM�?.}�_������ڛ��\�޾�N�l9�ʑ����>[��K�@W�����U/����o�$�m�\�b_Y� }�u2H~ �i_��l�Rdzv��]\���/?�&g�Z?t���!��t�������C�u��C���&ɪ�C�{SnW5����{�%)���$B�~�H�rIY�1R̊�#�n2�6㢣Xn��e�-�p�2��E��2�|<��Scn�)Ӷ��`����2�F�hY,w�Za�Se<������CF��[�4��"��Q�Lήn\�.��ƕ3�\�1T�|�$�6���?H���+�Dy��_�� �\�#�"M���A �@ ���@ �A �@ ���X�F ����'?[� �B� �@x�@ � b�x���@��*��@�@ �%����x��Ł�ǫpy ���vr����<!G�����,�?|��Еj�R��d�&:ș��=�E�zb�k:A��Wn���}�����c�W�c�l��ı0|�b0!,/Rt��xb#�5�e�^I�2ߓv:������
��c��L��b�R릖�"c������׻rܷы~���V랳�^Nw9�	/�sf�bZ&r�[��^��BY~ss�K�֞�J���{��� �V��ȩ}�6ʰ��*�_�
��Ec���WZ�>��êB:���I��K��r��b���E���><<\���kE�-?vt�7�X"�ۦ�&뺉��	�@7[��'oW�>d�Zは�We�W���,��l~
�1�������=���
a^�O�S��Xo�^1���+�T�z4tq���,8�V��)�ۘE��	͢��z�5�{K��G]��qJR��J��΢۾��=r��z�RP��q��� ���tuV��|DD��.w�r��R�Ʊ�/N�~� 8�%6�;�ڔ�dN�iw3�h
�Xu��=�Ύ*��Ј�&lz�X�hܸ���^Թ�SϚ��7[b��� $^�u����Vym�YLLF�5� �X@��5 c�����J�x�W���������o��mD�!+n�Q1��[䖇U�3j�c����?���ة��AO!B��M�#�J?P��8���o�"��ɍN%�mB�����N!�G�H�	!�L���e�iʭ���R�g㍛oY�L�I��=r��.��m�J����0�kԯ�_��5�:�9�]�U�#N9Y��:��@�Tj��	7��u7�z��޴%��
���!�yxL�1��$B(��1�f̯���8!��@����u@r?�B����h�y�W��88@��О������Z	�Z�E���R2*~��Uu���DPX׏�ǢA/�	dy���<6hѣ��#�[㝡�
���z;��;M%��Ď,Ґ���,���g<c<�� �$�	2`�=4U�,���u�� b��d|$� >�}�� 
<Ј��2��\�D>4�ld�����7o��J���GuZgkw�`�c��ES�T��
2"`�dT�q�s�ĭzL`fz�7�d�ey�
� M:�U�HK�"��.����v��8@��Aܿ�<<ppD_�:��iD3��@��`�H�u�uI3(M)�A��5�<��� p���M���첺G@@YM8��~��q��4o$����B�-�f'K�X���$@���C��.uɑB�A���v�o��R���b*B���� � A�������7 ��a����O��(.�fzD��zd[��L>�� 9�	��� 6hˁN�}��j1B�ӈ���7�
ruu]���ַ�,w�~�#qR� �����R�?��dsh�=��x�t��"HHd�cf�66fs�d����2+E��҈�d� Q���%��y��K�ĮG�5;@x��z�"3;!fRLm)�
�� �Ia@Z�"zTV}IL��&� 4�iZHŇ���%"Ŵ�bږVF f<8@Hh��p֢�j�q7�52�� �OD�d/��e�7H'�˭��j��H��,���+r�E�	q������a�$mE3�h]��n�A 6d�'�rpZ+��f6��I$��7HDen|;���DA�崛�����*S��;O�ma����p°�D
>~�m�2��X)�l˂h�?������@����ꕏ�����Nt��8q6�&3 �e��Ċ~�C�	�
B���H�o��F�0��mw�	� d��q�m��aD�/�b15���s
Z�o�R�$D�H�6�G�.���&ّD�����a���n��6���=�1Z���]6�"�v��Q�1�	{mp>1�6�y)3��P	mk�*A��=��B�r 1�;�=�.d%��9�(6f�ʴˢ�*Ⱖ�>�M[v�z��*䎓��#tMPEBqXF貱aM�|�D��9����P����nD=�i"7�o�ڏ[���9�NBO!��1�L|�7Ő�u�^�د�_M��	��
�ײ��������q��|��^+���ba�����<�.�A�wl?���M�Ϯ��Ʈ#a�F
f��JÍ���4���/f�ɦJN�싒�Y<��c+K�-������H� �A� q9:�B��|�����^��qg c Ʒ���|i���?ϼKp��v����=i���R_�a�Q��� m��|�
A �� �@���]���`�� �;
��.��roA HM"���cc�gM�5��V��� �Dv��[�̃��"o�L�����rd�ڴ}�io
n�W�v�J��7v�V~۹o���-���k��>�_lV�,!�O�9	K\%4�@?���d+�!4�,#���ۤ_��/�5-	�JlI�KO�5�تF�x�S�-K����uZO1o��m����W�޷������y[�,�k����t���I8��*��W�	c������*�7��]Hy���q\�@��N*iΎ��!A��I�H���2�y�$���Ne[aDݜ��k	I��\F�d�eYyNH(��I:H�&�$Y�O-eʃ�0�Ө�=gk�:gz�A�5�.F���8*�Z��M��	C��ڿz㊓L��S����҃vhX��K[���x�<e^�!A�ɩ ��Z�d�4sD'Q��N�����hvDzN? �vZM'�[z�@���S��z������R�aLE�E��B���kв�O�[�k� �t��Ĥ	c�̢L�q��Q�"�-�J_VID�U,G��D'����ݙ�HvfY���A�E}M��.��8��З��#H��*��O�e�O��dy�'Sْ�iL��,���mA[Vwł�T�)�دG�*Z^l�=ҍ	��fn�s�m��+��5Al)��<0O9ĖN�J�ҩ��k�AN�� Z�{xD{*#��?S�|{!idU���e���Iy�4�2����n�5ؒ~���f��ؖ�-h����M�kD�T��Gg	c�AX����9a<�XS)�r�ӯB2";"�HB�$t��k2��G'���!RL	:�,4v�钐�핌m��؂>�iH-�R*�D��d�e��B��l��?%�� B�'��A{n��/��G���d����<�>�=a�E�_[���)�Bl>�e�azۜ����2�[J�d@��*-�Z���
���>hY?o�_tK�zjC���f�zܯR���o'��pu#�b)�:�[ϛ��(�ۨݲ�{`����ܭ�����U��!��+���B�ǧ�|�Oҹ�x�0��I���#	_�s�����]��	� �@���E2�.Ax��6Ѓ�
A�!��@�`�x���	��;r��N�U[�]�<� /�b۫��ʾS�����;����
A|��n�����F>:@ �@ �A� ��A� @ ���ľ_���>2��i�"��Ɯ��α�$�e>2��s��C|�Go����E����srh H��
G"�N2IL�\t$eɭka{����S&)�D2������͓4Osv�h���G���lrݦ�H�̑f���\���� s�֙�h��W9�_E��")�)KV)T�u����<�4^�":��[��?�)�9��诵h�K��*�I��0�zTK���J�!Q�W�}��?K�Y�$Y$���DT���}*m*�r�)0�D�WS@����8������`rt� @ �A����!��"�?.�	򷿿���}A�� ȁ� ��A�� @�q� @ 9��?[���ԗ�� �|��� ;���V�N3��L��~�|��7�s�;]�v�`�&ȥ�0�Kg�)Z�A?h���i{	r�i{	�C/>'H�<h�I ����Ƈ�@���k'���\ǿZ��/���m��1c|���(HV���B��e��
�?���uugԫ�>��xL�N�	��tXE.<�n��x�B;�}q�8�bL8J�|L��Xe�*|�1�a9�� +�;,��(� .e��g��v ;�����"p^
8s^�0��ч~U(8~e�X���y�\�q���sn�U:����w��0BC)��Pn��U�'�(�rQ�UX�<��c �;Z@��*C?%�3�a�v ��'���R�V��J)��T�J᱌��G�c�1IQd�e�x��$4�X^���h�ȟլ!�Z�0ƔR��6���/0Q�s��=�+�B$�2�l���=
	�i�@�+�i��4u^e9.P$^?O�A; ��o���h��5�Gԭ?�s/e)��˺U�MFm���Q�<�[.�@���t.:�8J�Jq�8U�
(���-ځH�i�Z1f�{�R�8���G�W�U�,�2RZ�ďd�M@�1YXe���7�A)
#������d03Z��dd@!���H���8oL�z)�Ttm��n�
pӿ|0V�[u��#6�M�`|���m��l ~�c�}�\��E G���p���N�e�y[�
�I9������b����'@<��4ˀ�1?�K�|x�+�Xc	�&�I�
�����u�a��k޹-��,��;�%�{~��a�X�4��qlۼ̹��2-������7��
�o�Ŀb�|�H3?I���fߟ��l ��(#���ׇث��o�eJ�@�~��?Ȼd�{�V���n
$���B6�}��IH�?�2��ÁsT"I���Ɓ��C�����)$`�rw/u:��o9��A����&�O6?t[�$V�@n��̠��o	A��Hk��_/����@~��G�y�O읏s�:��m8�r
U.���mTp��^E�?�]D�I�{w~I�%��j=�O׊�ӝk曲,6�u��d��p?��}	8�c������~j��ݗH��LQ�@�g@�;�g茇H��K���r�}�J�ŧ/���1�Y/`Zd��lR`�D����D7V�V��v�����)sf37X�d|��|�~^4 ��[ɔ�dU��<d���קּO@"ܽ.^y��" z���"@�:ԧ/���h%1�\Y�!���f1[k4K4u	���-#!GJ3dL��n�������é�
�փČ�&�L8T��RPa9I�ή�9��
H�����<@P5"�>��/<��ҁ�܃,���6�|����o?ԡ�t}�w�i�C@$2cc0����&SƜ%��1FP?����[N��A6؀��$ ��5(`4�h�n�?I�AiS+J�$`47A����&�&D���KT�K�d@ړ�~��å����{GDAF�꾀�@NhD^� �:��~��� ſr�M:0#LC@G@8O�H�]�A.p���9��,A�� �q��䜮h�)b%�jۑ�xG��?�#�d=V��`�|��BF�)9��� �Ne�_>�&���+w���D@:K�@O������)�"���������u�b�"K(��:k�J#c8�)),vPQ�,�g��r6 �_äI�.����"��k�-��i@�GD�j@���^����.�'N�~������$��?�R���s@� ����3�(�|tK-Pr����Zcy��szD����2^V<E���	��	+�9$#���3�:�<&��L� %$H&,�xr����� *�5�uJf =+ހ��2@���s�g8$w���}�,V�p��Lj���f�"�5:!���;
��]��5�Z���q�1<�f��V����<>�1M`�4�$��Np� ��Q$��l͹PR��=���p��
ȹ��ٴ(�B��n<�S|���E@��wd�'�\p1�8�5�8��]mMd#��!�
��6�Ո	�P��8Qg�¢m����A��MW��9t��Ӷ��5�V���i,������ыޤ�K�f�>gv,׺��[�-� �.�7�"ݿH��d||ן�(��� �+�:�����`d[��&:/�^���)S�o�t)3�40���Ař��
�4���E0ȣ/ K�u�C��<y�7��I�Ǎ^n۾�H�G�.�7!�2�$
�w�W�}� (X�/R���y^?~�7"A��?����=~5b���	*�8(l|�= ��@�o�"�o�- �~��t{$mfr�w�ԁ�j �)@ހD�!><��;���G)NO	7G�r6 E����)\�F�	H��HT-�z��9)\�[@>�(�vs��m<�e�ޭ�3>�(�% �/ hUeE~���z�~�� �:�:�?(
�� �MH������A������t�" w���z�9��;�_V��$�܂x��ֻ",��yy�
�0,���8m�9�;$$@�t��w���?��Y ū�<z2�		���T��T�hA�B'�ٹo�B-�K|��/�s�Q։50m�*�h�w
�H�;<i���C�9��
�^d���҆s!�S�u��=�ms��^BE�Dk�#�9d�T�ā����]TL�,�`��'��”0��@n�H�-brǽA��t��t���z�g����b ��T�2��xH���=���4��tY/�0�����cR�W�cMb��l���"5���W�����10
��8�m����3�`NI��=�V� c[�$x�
HG��t�R]�ހ�"������! Q-�?�a�9-6���tq���+@X��,	���V�ִ�,�\p0`yd]�H�ڔ�5CC�5X#��
Ⱥ6ԗ�\ӌ�;��9h�)�s�w�����Y�,i�5��^,*���R��2� ���) �V���
��2B��x�40M�0#� Z  \X
!%`
�7��RAP��>$��?pHOp@���7j}S�kW��n�����4��:!��՟�*�)�*$@��o�� �+��L��
�{�%
��Qκ6��ZP��<�V�����7
�k�XsHx����շ}q��%@��4�Ks��<b�f�z���f��HCa�]hO1�$�B�P��Ԑ���Vv%f�{<S���H�e����pw���7@А}�DEWR� ࠡ�
H�����m���ү�@��|�����˧hN'<�)^�w3g��
�~6�b�g��B���_O�pOu�1���7�������5\GM)���O�ض�:��;�d����?q�^��y�-���/����t��&h�{�M��\
��=�Y��#׺����~
@F
@ � ;j2j25�@ ��d2��!��������y' �S6����9�� ��-��	�,��K.�xJ�k���Xmy��!Gl��XX*��7����d-�4_���2f���@8��2ͨ9�f^I��ӜK�-���:�eΓ�< �xuy�y]�����cxLaT���e�H"L�C�R�3W�*^-qu�����튉. r�|�sN���[�f�|[�-�2N@��q1�*vQR�,��Hv�
�8!y�U�H�8��'r%#m�)iL�n&�H�H�<�����t6 Eq�w!�3��Z����tu?��,�����j5��o�?�X�e�����
�d!'M�)Gǫ&?�MTp;@�����O����<wi��,�+�$��U^	
�T��r���XL<�ͥX4����r����_�ƍ�rw׼h��{�Ys����(��	��-?iNB*�"��~�@�'$TL����)WDt#�R89��` ��&gD� �.i{Gj�(�̫'��

�v
�$&���+'BAQJj�AA�������
��AE�C<QĤ�d���,	Q� ���&�mգ2d���A\\+���� X�cN
X����H��Xu�*)��P�������}�3��TS��d�<Cy(�V������y���.��0i��H(
jËe8D`W�\����� �A> |��5CT��e��pk;�|��R�[�J��ݷy[Ӻ���l�Dv�y��ܷq�/6�V�ryͳȴ�p����%����)r߽��}@��Q;�y�\v�w)������F=> �&Q��s7L���K�
A��o`3�04��1s��7;	h�鶧�8k����A�o�ۀʢ�T�b����.�Y.t^�;�A*vf��; D�Ot��S���AHt �'��K��~�p��� �u�D��c)�'#)QR��B��~�1U�널��I�,���SVf�-0ެ�5�OjEY�!|N�z�K�!�. $2B��q�L���R��à��# m�H����
�w ��a�"��k�u�� >�S��0u}���Z=����c~����D֫: �޲r����:�]�x�	����B� ��U���K���"6��\��S���S�?�@�M��U �KU���K���a�7Tp��s�����5��= �r"����PF����� �cs����
?�F��o@��:�>�]��0�_�.ֲ�^�[q����J�\�oz��1_ww04����s�� �a
��
  ��.	��=����YNtf���=�ܓ�QD �`�$�=̓�}�í�k�W��՛
n�b��
S�P�#���R�L�M�n�J��ٻ%�^��ؽ��Wo6Rmg�m�E��Sٽ'��cJ�g��~՗4��숀�=��\��_���ݝ%��?������΅8|ً��� �B'm'/oo/�-�
@��Y�'���`|N���3���­qCY׊N��p��	+��[G��U���*�Ǎ��˫C=�C�n�uF�x�	.=ԏ�%�PvN;����?�u��~ ��t��{ҙ�N)�l��θ���-����|��MF�8�\��8�a����8ۭ��q)5&L��b�Z�)�DmÞ�|=z���3���k�zZȯ�@�'�vM��a�E�C��!��=�
�Կ�eH�ǭ#�2|f�Ck��2��R>�?+���1+}x�_��쥀̽�b���x7�܍�( �Y>H��E�����������Z���Rϼv�J/����ѱQ@X1$�>*��M\ꇌc�$W&��!z <W�3�y�3�Th$��9�� �^j�DR�"�В�F�T;�3 ���g=���T��	�$(
�#��X��M��>�\#YY"1�rq\4���+���&�&��L��< e�: 
e���4O6u\o�t!3�J�*T��j��J2�{��z��a2��ĥ�v���Ӳ ��y�N�ga�q�29R������i���U���	�?���{d�qCDҽ���Ax���O9h������^�e�\u��#j)C���R#Q��<(�pzL��~�t��&wF$���Y,����?���֥�,B薁DG@�j����D�)SN�^�ݒ����Do%j/}m�뷫]SN�t�bj����b�G�R�U�Q= �-��@�pI��]�iRE�/�u-^���8f�~�m:�L�?`�2O{��C��,�	����ꢰd�b��܅~_(B_Hٝaq�9/�:aw��! 
�8Y�� �yb&�T��Bl]��:��tj��.l�V�o;����ǎ �y��B�o�H $��;��r
��Z[@Zd=ZBgW���Q�I׺l~�9��틙@�E〈t���<�[��T�Rc�sw]�〨�����r��Ŀ���Z�)�Ee-tf��M�I�Z�pGb�uG|��薀��Rmg�c��E��

w�c���FW�j;�u�~ nt��b�����5b5���~\:�O��*���Cı����D�����rp���"!�E1�^������9ú�kw_�i���W}1��ǁ��R f1�ܮ	+�b�F�n�ճBE-�i����q����* �F�e �������+��B���0��md :�A^���k�̢�3��yŻz"�����k���D��dE�����X���Q]�Sk@d��A���
 �vr�t(�Qv�Ųs�.�a��)��H����cŗ�y�9�$��[|�wP[c,[��k��� V��~ϟ���3�������X'���Q����jYEw�@�;?�;����AV���7L]���ӟ0��;���v,aH����w���jf��gu�@�~Ӵ=Y�RqS@P��S�<T�'jdL.��aU�;"h{��
@>$��E3�A�}ΰ�OmOم@Pt2$�A��JmD�����k�C�7�r)���O�{�"�Cq�I1�*M�b�xȈ"����r�'u�ӳ���NY����;/�?>�C�?�����~���$��-��G�](D����Z��$ 	H��$ 	H��$ 	H��$ 	H��$ ��$[��dK@�l	H��$ 	H���0wEk�Z;�V��-j�8�|����F����kh�W������C]m����1�O��U&>�����PߧJ�$ ���q-duZ|��.Q'
#��Xzo\������J��G.,�S!�m"�JVW�K�L�[`���T�\�lw���t��.>L?�.��<q�؋��q��
uc^ȸ���PO@^!.��݅�X��s�$�[҈d��� �Q�\

���}�Q�E@+K��P0�B 埘^�V���݂ B�����:ͤ賣$� 4����$	�+6�9$�Z��m}70KH|��(!�O��uF���iM!�w����� �6(�&յ''�k��)���7K��!�
����0���ʲ�ՋFHp7'耴����'�?+�w���0 QejA�[�
� a�"�`�m`�
��j$FQ'%��g��'h�ˍ�ļ�/rۂuf�JF 3�{,��4
�駀0��0sA�.�43����3H�������p�€�<�����@�'��'la_�@$$�}�^�`k�(`g��	��
+�I�ӈ���W�]p�Zv8`��nZ�	����ޕ�9w��|!`Y�U_Ou�:q=K2iWO@^�i��y�}4����wA�X��x�jč\�#��/��͏��дA�}��S��#��͏���$_���׼�,�� �p��?�$?�g�h�A�z��U���H%�g�g���[m"

�@�@�@�@�@2�@�@�@H8�g:�Q {	�n���H�VZr�5�T�H��؛Cgq��@
��@@  �@�G  �@��2tpyD�N��@@  �+��@@  �v@  ��@�@3h��4=�#_IEND�B`�templates/hathor/postinstall/hathormessage.php000060400000007751152453623430015763 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 *
 */

/**
 * Checks if hathor is the default backend template or currently used as default style.
 * If yes we want to show a message and action button.
 *
 * @return  boolean
 *
 * @since   3.7
 */
function hathormessage_postinstall_condition()
{
	$db             = JFactory::getDbo();
	$user           = JFactory::getUser();
	$globalTemplate = 'n/a';
	$template       = 'n/a';

	// We can only do that if you have edit permissions in com_templates
	if ($user->authorise('core.edit.state', 'com_templates'))
	{
		$query = $db->getQuery(true)
			->select('template')
			->from($db->quoteName('#__template_styles'))
			->where($db->quoteName('home') . ' = ' . $db->quote('1'))
			->where($db->quoteName('client_id') . ' = 1');

		// Get the global setting about the default template
		$globalTemplate = $db->setQuery($query)->loadResult();
	}

	// Get the current user admin style
	$adminstyle = $user->getParam('admin_style');

	if ($adminstyle)
	{
		$query = $db->getQuery(true)
			->select('template')
			->from($db->quoteName('#__template_styles'))
			->where($db->quoteName('id') . ' = ' . (int) $adminstyle)
			->where($db->quoteName('client_id') . ' = 1');

		// Get the template name associated to the admin style
		$template = $db->setquery($query)->loadResult();
	}

	if (($globalTemplate != 'hathor') && ($template != 'hathor'))
	{
		// Hathor is not default not global and not in the user so no message needed
		return false;
	}

	// Hathor is default please add the message
	return true;
}

/**
 * Set the default backend template back to isis if you are allowed to do this
 * This also sets the current user setting to isis if not done yet
 *
 * @return  void
 *
 * @since   3.7
 */
function hathormessage_postinstall_action()
{
	$db   = JFactory::getDbo();
	$user = JFactory::getUser();

	$query = $db->getQuery(true)
		->select(array('id', 'title'))
		->from($db->quoteName('#__template_styles'))
		->where($db->quoteName('template') . ' = "isis"')
		->where($db->quoteName('client_id') . ' = 1');

	$isisStyleId   = $db->setQuery($query)->loadColumn();
	$isisStyleName = $db->setQuery($query)->loadColumn(1);
	$adminstyle    = $user->getParam('admin_style');

	// The user uses the system setting so no need to change that.
	if ($adminstyle)
	{
		$query = $db->getQuery(true)
			->select('template')
			->from($db->quoteName('#__template_styles'))
			->where($db->quoteName('id') . ' = ' . (int) $adminstyle)
			->where($db->quoteName('client_id') . ' = 1');

		$template = $db->setQuery($query)->loadResult();

		// The current user uses hathor
		if ($template == 'hathor')
		{
			$user->setParam('admin_style', $isisStyleId['0']);
			$user->save();
		}
	}

	// We can only do that if you have edit permissions in com_templates
	if ($user->authorise('core.edit.state', 'com_templates'))
	{
		$query = $db->getQuery(true)
			->update($db->quoteName('#__template_styles'))
			->set($db->quoteName('home') . ' = ' . $db->quote('0'))
			->where($db->quoteName('template') . ' = "hathor"')
			->where($db->quoteName('client_id') . ' = 1');

		// Execute
		$db->setQuery($query)->execute();

		$query = $db->getQuery(true)
			->update($db->quoteName('#__template_styles'))
			->set($db->quoteName('home') . ' = ' . $db->quote('1'))
			->where($db->quoteName('template') . ' = "isis"')
			->where($db->quoteName('client_id') . ' = 1')
			->where($db->quoteName('id') . ' = ' . $isisStyleId[0]);

		// Execute
		$db->setQuery($query)->execute();
	}

	// The postinstall component load the language to late... so we need to make sure it is loaded here.
	JFactory::getLanguage()->load('tpl_hathor', JPATH_ADMINISTRATOR, null, false, true);

	// Template was successfully changed to isis
	JFactory::getApplication()->enqueueMessage(JText::sprintf('TPL_HATHOR_CHANGED_DEFAULT_TEMPLATE_TO_ISIS', $isisStyleName[0]), 'message');
}
templates/hathor/css/colour_blue_rtl.css000060400000015534152453623430014537 0ustar00@charset "UTF-8";

/**
 * @package		Joomla.Administrator
 * @subpackage	templates.hathor
 * @copyright	(C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @since		1.6
 *
 * RTL CSS file for the color standard
 */

/**
 * Overall Styles
 */
#header {
	background: #ffffff url(../images/j_logo.png) no-repeat top right;
}

#element-box {
	border-left: 1px solid #738498;
	border-right: 1px solid #738498;
}


/**
 * Various Styles
 */

div.checkin-tick {
		background: url(../images/admin/tick.png) 20px 50% no-repeat;
}

/**
 * Subheader, toolbar, page title
 */

div.toolbar-box {
	border-left: 1px solid #738498;
	border-right: 1px solid #738498;
}

div.toolbar-list li.divider {
	border-left: 1px dotted #e5d9c3;
	border-right: none;
}

div.toolbar-list a:hover {
	border-right: 1px solid #e5d9c3;
	border-left: 1px solid #738498;
}

/**
 * Pane Slider pane Toggler styles
 */
.pane-toggler  span {
	background: transparent url(../images/j_arrow_left.png) right 50% no-repeat;
}

.pane-toggler-down span {
	background: transparent url(../images/j_arrow_down.png) right 50% no-repeat;
}

/**
 * Cpanel Settings
 */

#cpanel div.icon a:hover,
#cpanel div.icon a:focus {
	border-right: 1px solid #e5d9c3;
	border-left: 1px solid #738498;
}

fieldset#filter-bar {
	border-left: none;
	border-right: none;
}

/**
 * Admintable Styles
 */

table.admintable td.key,table.admintable td.paramlist_key {
	border-left: 1px solid #738498;
	border-right: none;
}

table.paramlist td.paramlist_description {
	border-left: 1px solid #738498;
	border-right: none;
}

/**
 * Admin Form Styles
 */
table.adminform tr {
	border-left: 1px solid #738498;
	border-right: none;
}

/**
 * Adminlist Table layout
 */

table.adminlist.modal {
	border-right: 1px solid #738498;
	border-left: 1px solid #738498;
}

/* Table row styles */

table.adminlist tbody tr td,
table.adminlist tbody tr th {
	border-left: 1px solid #738498;
	border-right: none;
}

table.adminlist tbody tr td:last-child {
	border-left: none;
}

/**
 * Saving order icon styling in admin tables
 */
a.saveorder {
	background: url(../images/admin/filesave.png) no-repeat;
}

a.saveorder.inactive {
	background-position: 0 -16px;
}

/**
 * Button styling
 */

/* Button 1 Type */

	/* Use this if you add images to the buttons such as directional arrows */

.button1 a {
	/* add padding if you are using the directional images */
	/* padding: 0 6px 0 30px; */
}

	/* Button 2 Type */

.button2-right .prev {
	background-image: url(../images/j_button2_prev.png);
	background-position: right center;
}

.button2-right.off .prev {
	background: url(../images/j_button2_prev_off.png) no-repeat;
}

.button2-right .start {
	background-image: url(../images/j_button2_first.png);
	background-position: right center;
}

.button2-left .next {
	background-image: url(../images/j_button2_next.png);
	background-position: left center;
}

.button2-left.off .next { /* @TODO check the x position */
	background: url(../images/j_button2_next_off.png) 100% 0 no-repeat;
}

.button2-left .end {
	background-image: url(../images/j_arrow_left.png);
	background-position: left center;
}

.button2-left.off .end { /* @TODO check the x position */
	background: url(../images/j_button2_last_off.png) 100% 0 no-repeat;
}

.button2-left .image {
	background: url(../images/j_button2_image.png) 100% 0 no-repeat;
}

.button2-left .readmore {
	background: url(../images/j_button2_readmore.png) 100% 0 no-repeat;
}

.button2-left .pagebreak {
	background: url(../images/j_button2_pagebreak.png) 100% 0 no-repeat;
}

/**
 * Tooltips
 */

/**
 * System Standard Messages
 */
#system-message dd.message ul {
	background: #C3D2E5 url(../images/notice-info.png) 99.5% center no-repeat;
}

/**
 * System Error Messages
 */
#system-message dd.error ul {
	background: #E6C0C0 url(../images/notice-alert.png) 99.5% top no-repeat;
}

/**
 * System Notice Messages
 */
#system-message dd.notice ul {
	background: #EFE7B8 url(../images/notice-note.png) 99%.5 top no-repeat;
}

/**
 * JGrid styles
 */

/**
 * Menu Icons
 * These icons are used on the Administrator menu
 * The classes are constructed dynamically when the menu is generated
 */


/**
 * Toolbar icons
 * These icons are used for the toolbar buttons
 * The classes are constructed dynamically when the toolbar is created
 */

/**
 * Quick Icons
 * Also knows as Header Icons
 * These are used for the Quick Icons on the Control Panel
 * The same classes are also assigned the Component Title
 */

/**
 * General styles
 */

.helpFrame {
	border-right: 0 solid #738498;
	border-left: none;
	border-top: none;
}

/* -- ACL STYLES relocated from com_users/media/grid.css ----------- */

/* -- ACL PANEL STYLES  ----------- */


/* All Tabs */

table.aclsummary-table td.col2,
table.aclsummary-table th.col2,
table.aclsummary-table td.col3,
table.aclsummary-table th.col3,
table.aclsummary-table td.col4,
table.aclsummary-table th.col4,
table.aclsummary-table td.col5,
table.aclsummary-table th.col5,
table.aclsummary-table td.col6,
table.aclsummary-table th.col6,
table.aclmodify-table td.col2,
table.aclmodify-table th.col2 {
	border-right: 1px solid #738498;
	border-left: none;
}

/* Icons */

ul.acllegend li.acl-allowed {
	background:url(../images/admin/icon-16-allow.png) no-repeat right;
}
ul.acllegend li.acl-denied {
	background:url(../images/admin/icon-16-deny.png) no-repeat right;
}

table#acl-config th.acl-groups {
	border-left: 1px solid #738498;
}

table#acl-config th.acl-groups {
	text-align: right;
}

.acl-action {
	margin: auto 0;
}

/* Icons */

span.icon-16-unset {
	background: url(../images/admin/icon-16-denyinactive.png) no-repeat right;
}

span.icon-16-allowed {
	background: url(../images/admin/icon-16-allow.png) no-repeat right;
}

span.icon-16-denied {
	background: url(../images/admin/icon-16-deny.png) no-repeat right;
}

span.icon-16-locked {
	background: url(../images/admin/checked_out.png) no-repeat right;
}

/**
* Mod_rewrite Warning
*/
#jform_sef_rewrite-lbl {
	background: url(../images/admin/icon-16-notice-note.png) left top no-repeat;
}

/**
* Modal S-Box overrides
*/

#sbox-window {
	text-align: right;
}

/**
* Permission Rules
*/

#permissions-sliders ul#rules table.group-rules td
{
    border-left: solid 1px #738498;
    border-right: solid 0 #738498;
}

#permissions-sliders ul#rules table.group-rules th
{
    border-left: solid 1px #738498;
    border-right: solid 0 #738498;
}

/**
 * Menu Styling
 */

#menu ul li.node {
	background-image: url(../images/j_arrow_left.png);
	background-repeat: no-repeat;
	background-position: left 50%;
}

#menu a {
	background-position: right 50%;
}

#menu li {
	border-left: 1px solid #738498;
	border-right: 0 solid #738498;
}

#menu li li li a:focus {
	border-right: 1px solid #fafafa;
}

/* Installer Database */
#installer-database p.warning {
	background-position: center right;
}

#installer-database p.nowarning {
	background-position: center right;
}
templates/hathor/css/colour_brown_rtl.css000060400000014006152453623430014730 0ustar00@charset "UTF-8";

/**
 * @package		Joomla.Administrator
 * @subpackage	templates.hathor
 * @copyright	(C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @since		1.6
 *
 * RTL CSS file for the color standard
 */

/**
 * Overall Styles
 */
#header {
	background: #ffffff url(../images/j_logo.png) no-repeat top right;
}

/**
 * Various Styles
 */
div.checkin-tick {
		background: url(../images/admin/tick.png) 20px 50% no-repeat;
}

/**
 * Pane Slider pane Toggler styles
 */
.pane-toggler  span {
	background: transparent url(../images/j_arrow_left.png) right 50% no-repeat;
}

.pane-toggler-down span {
	background: transparent url(../images/j_arrow_down.png) right 50% no-repeat;
}

/**
 * Cpanel Settings
 */
fieldset#filter-bar {
	border-left: none;
	border-right: none;
}

/**
 * Admintable Styles
 */

table.admintable td.key,table.admintable td.paramlist_key {
	border-left: 1px solid #e9e9e9;
	border-right: none;
}

table.paramlist td.paramlist_description {
	border-left: 1px solid #e9e9e9;
	border-right: none;
}

/**
 * Admin Form Styles
 */
table.adminform tr {
	border-left: 1px solid #000000;
	border-right: none;
}

/**
 * Adminlist Table layout
 */

table.adminlist.modal {
	border-right: 1px solid #000000;
	border-left: 1px solid #000000;
}

	/* Table row styles */
table.adminlist tbody tr td:last-child {
	border-left: none;
}

/**
 * Saving order icon styling in admin tables
 */
a.saveorder {
	background: url(../images/admin/filesave.png) no-repeat;
}

a.saveorder.inactive {
	background-position: 0 -16px;
}

/**
 * Button styling
 */

/* Button 1 Type */

	/* Use this if you add images to the buttons such as directional arrows */

.button1 a {
	/* add padding if you are using the directional images */
	/* padding: 0 6px 0 30px; */
}

	/* Button 2 Type */

.button2-right .prev {
	background-image: url(../images/j_button2_prev.png);
	background-position: right center;
}

.button2-right.off .prev {
	background: url(../images/j_button2_prev_off.png) no-repeat;
}

.button2-right .start {
	background-image: url(../images/j_button2_first.png);
	background-position: right center;
}

.button2-left .next {
	background-image: url(../images/j_button2_next.png);
	background-position: left center;
}

.button2-left.off .next { /* @TODO check the x position */
	background: url(../images/j_button2_next_off.png) 100% 0 no-repeat;
}

.button2-left .end {
	background-image: url(../images/j_arrow_left.png);
	background-position: left center;
}

.button2-left.off .end { /* @TODO check the x position */
	background: url(../images/j_button2_last_off.png) 100% 0 no-repeat;
}

.button2-left .image {
	background: url(../images/j_button2_image.png) 100% 0 no-repeat;
}

.button2-left .readmore {
	background: url(../images/j_button2_readmore.png) 100% 0 no-repeat;
}

.button2-left .pagebreak {
	background: url(../images/j_button2_pagebreak.png) 100% 0 no-repeat;
}

/**
 * Tooltips
 */


/**
 * System Standard Messages
 */
#system-message dd.message ul {
	background: #C3D2E5 url(../images/notice-info.png) 99.5% center no-repeat;
}

/**
 * System Error Messages
 */
#system-message dd.error ul {
	background: #E6C0C0 url(../images/notice-alert.png) 99.5% top no-repeat;
}

/**
 * System Notice Messages
 */
#system-message dd.notice ul {
	background: #EFE7B8 url(../images/notice-note.png) 99%.5 top no-repeat;
}

/**
 * JGrid styles
 */

/**
 * Menu Icons
 * These icons are used on the Administrator menu
 * The classes are constructed dynamically when the menu is generated
 */


/**
 * Toolbar icons
 * These icons are used for the toolbar buttons
 * The classes are constructed dynamically when the toolbar is created
 */

/**
 * Quick Icons
 * Also knows as Header Icons
 * These are used for the Quick Icons on the Control Panel
 * The same classes are also assigned the Component Title
 */

/**
 * General styles
 */

.helpFrame {
	border-right: 0 solid #222;
	border-left: none;
	border-top: none;
}

/* -- ACL STYLES relocated from com_users/media/grid.css ----------- */

/* -- ACL PANEL STYLES  ----------- */


/* All Tabs */

table.aclsummary-table td.col2,
table.aclsummary-table th.col2,
table.aclsummary-table td.col3,
table.aclsummary-table th.col3,
table.aclsummary-table td.col4,
table.aclsummary-table th.col4,
table.aclsummary-table td.col5,
table.aclsummary-table th.col5,
table.aclsummary-table td.col6,
table.aclsummary-table th.col6,
table.aclmodify-table td.col2,
table.aclmodify-table th.col2 {
	border-right: 1px solid #cbcbcb;
	border-left: none;
}

/* Icons */

ul.acllegend li.acl-allowed {
	background: url(../images/admin/icon-16-allow.png) no-repeat right;
}
ul.acllegend li.acl-denied {
	background: url(../images/admin/icon-16-deny.png) no-repeat right;
}

table#acl-config th.acl-groups {
	border-left: 1px solid #000000;
}

table#acl-config th.acl-groups {
	text-align: right;
}

.acl-action {
	margin: auto 0;
}

/* Icons */

span.icon-16-unset {
	background: url(../images/admin/icon-16-denyinactive.png) no-repeat right;
}

span.icon-16-allowed {
	background: url(../images/admin/icon-16-allow.png) no-repeat right;
}

span.icon-16-denied {
	background: url(../images/admin/icon-16-deny.png) no-repeat right;
}

span.icon-16-locked {
	background: url(../images/admin/checked_out.png) no-repeat right;
}

/**
* Mod_rewrite Warning
*/
#jform_sef_rewrite-lbl {
	background: url(../images/admin/icon-16-notice-note.png) left top no-repeat;
}

/**
* Permission Rules
*/

#permissions-sliders ul#rules table.group-rules td {
    border-left: solid 1px #000000;
    border-right: solid 0 #000000;
}

#permissions-sliders ul#rules table.group-rules th {
    border-left: solid 1px #000000;
    border-right: solid 0 #000000;
}

/**
 * Menu Styling
 */

#menu ul li.node {
	background-image: url(../images/j_arrow_left.png);
	background-repeat: no-repeat;
	background-position: left 50%;
}

#menu a {
	background-position: right 50%;
}

/* Installer Database */
#installer-database p.warning {
	background-position: center right;
}

#installer-database p.nowarning {
	background-position: center right;
}
templates/hathor/css/colour_standard_rtl.css000060400000015530152453623430015404 0ustar00@charset "UTF-8";

/**
 * @package		Joomla.Administrator
 * @subpackage	templates.hathor
 * @copyright	(C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @since		1.6
 *
 * RTL CSS file for the color standard
 */

/**
 * Overall Styles
 */
#header {
	background: #ffffff url(../images/j_logo.png) no-repeat top right;
}

#element-box {
	border-left: 1px solid #c7c8b2;
	border-right: 1px solid #c7c8b2;
}

/**
 * Various Styles
 */

div.checkin-tick {
	background: url(../images/admin/tick.png) 20px 50% no-repeat;
}

/**
 * Subheader, toolbar, page title
 */
div.toolbar-box {
	border-left: 1px solid #c7c8b2;
	border-right: 1px solid #c7c8b2;
}

div.toolbar-list li.divider {
	border-left:1px dotted #e3e4ca;
	border-right:none;
}

div.toolbar-list a:hover {
	border-right: 1px solid #e3e4ca;
	border-left: 1px solid #c7c8b2;
}

/**
 * Pane Slider pane Toggler styles
 */
.pane-toggler  span {
	background: transparent url(../images/j_arrow_left.png) right 50% no-repeat;
}

.pane-toggler-down span {
	background: transparent url(../images/j_arrow_down.png) right 50%
		no-repeat;
}

/**
 * Cpanel Settings
 */
#cpanel div.icon a:hover,
#cpanel div.icon a:focus {
	border-right: 1px solid #e3e4ca;
	border-left: 1px solid #c7c8b2;
}

fieldset#filter-bar {
	border-left: none;
	border-right: none;
}

/**
 * Admintable Styles
 */
table.admintable td.key,table.admintable td.paramlist_key {
	border-left: 1px solid #c7c8b2;
	border-right: none;
}

table.paramlist td.paramlist_description {
	border-left: 1px solid #c7c8b2;
	border-right: none;
}

/**
 * Admin Form Styles
 */
table.adminform tr {
	border-left: 1px solid #c7c8b2;
	border-right: none;
}

/**
 * Adminlist Table layout
 */

table.adminlist.modal {
	border-right: 1px solid #c7c8b2;
	border-left: 1px solid #c7c8b2;
}


/* Table row styles */

table.adminlist tbody tr td,
table.adminlist tbody tr th {
	border-left: 1px solid #c7c8b2;
	border-right: none;
}

table.adminlist tbody tr td:last-child {
	border-left: none;
}

/**
 * Saving order icon styling in admin tables
 */
a.saveorder {
	background: url(../images/admin/filesave.png) no-repeat;
}

a.saveorder.inactive {
	background-position: 0 -16px;
}

/**
 * Button styling
 */

/* Button 1 Type */

	/* Use this if you add images to the buttons such as directional arrows */

.button1 a {
	/* add padding if you are using the directional images */
	/* padding: 0 6px 0 30px; */
}

	/* Button 2 Type */

.button2-right .prev {
	background-image: url(../images/j_button2_prev.png);
	background-position: right center;
}

.button2-right.off .prev {
	background: url(../images/j_button2_prev_off.png) no-repeat;
}

.button2-right .start {
	background-image: url(../images/j_button2_first.png);
	background-position: right center;
}

.button2-left .next {
	background-image: url(../images/j_button2_next.png);
	background-position: left center;
}

.button2-left.off .next { /* @TODO check the x position */
	background: url(../images/j_button2_next_off.png) 100% 0 no-repeat;
}

.button2-left .end {
	background-image: url(../images/j_arrow_left.png);
	background-position: left center;
}

.button2-left.off .end { /* @TODO check the x position */
	background: url(../images/j_button2_last_off.png) 100% 0 no-repeat;
}

.button2-left .image {
	background: url(../images/j_button2_image.png) 100% 0 no-repeat;
}

.button2-left .readmore {
	background: url(../images/j_button2_readmore.png) 100% 0 no-repeat;
}

.button2-left .pagebreak {
	background: url(../images/j_button2_pagebreak.png) 100% 0 no-repeat;
}

/**
 * Tooltips
 */

/**
 * System Standard Messages
 */
#system-message dd.message ul {
	background: #C3D2E5 url(../images/notice-info.png) 99.5% center no-repeat;
}

/**
 * System Error Messages
 */
#system-message dd.error ul {
	background: #E6C0C0 url(../images/notice-alert.png) 99.5% top no-repeat;
}

/**
 * System Notice Messages
 */
#system-message dd.notice ul {
	background: #EFE7B8 url(../images/notice-note.png) 99%.5 top no-repeat;
}

/**
 * JGrid styles
 */

/**
 * Menu Icons
 * These icons are used on the Administrator menu
 * The classes are constructed dynamically when the menu is generated
 */


/**
 * Toolbar icons
 * These icons are used for the toolbar buttons
 * The classes are constructed dynamically when the toolbar is created
 */

/**
 * Quick Icons
 * Also knows as Header Icons
 * These are used for the Quick Icons on the Control Panel
 * The same classes are also assigned the Component Title
 */

/**
 * General styles
 */

.helpFrame {
	border-right: 0 solid #c7c8b2;
	border-left: none;
	border-top: none;
}

/* -- ACL STYLES relocated from com_users/media/grid.css ----------- */

/* -- ACL PANEL STYLES  ----------- */


/* All Tabs */

table.aclsummary-table td.col2,
table.aclsummary-table th.col2,
table.aclsummary-table td.col3,
table.aclsummary-table th.col3,
table.aclsummary-table td.col4,
table.aclsummary-table th.col4,
table.aclsummary-table td.col5,
table.aclsummary-table th.col5,
table.aclsummary-table td.col6,
table.aclsummary-table th.col6,
table.aclmodify-table td.col2,
table.aclmodify-table th.col2 {
	border-right: 1px solid #c7c8b2;
	border-left: none;
}

/* Icons */

ul.acllegend li.acl-allowed {
	background:url(../images/admin/icon-16-allow.png) no-repeat right;
}
ul.acllegend li.acl-denied {
	background:url(../images/admin/icon-16-deny.png) no-repeat right;
}

table#acl-config th.acl-groups {
	border-left: 1px solid #c7c8b2;
}

table#acl-config th.acl-groups {
	text-align: right;
}

.acl-action {
	margin: auto 0;
}

/* Icons */

span.icon-16-unset {
	background: url(../images/admin/icon-16-denyinactive.png) no-repeat right;
}

span.icon-16-allowed {
	background: url(../images/admin/icon-16-allow.png) no-repeat right;
}

span.icon-16-denied {
	background: url(../images/admin/icon-16-deny.png) no-repeat right;
}

span.icon-16-locked {
	background: url(../images/admin/checked_out.png) no-repeat right;
}

/**
* Mod_rewrite Warning
*/
#jform_sef_rewrite-lbl {
	background: url(../images/admin/icon-16-notice-note.png) left top no-repeat;
}

/**
* Modal S-Box overrides
*/

#sbox-window {
	text-align: right;
}

/**
* Permission Rules
*/

#permissions-sliders ul#rules table.group-rules td {
    border-left: solid 1px #c7c8b2;
    border-right: solid 0 #c7c8b2;
}

#permissions-sliders ul#rules table.group-rules th {
    border-left: solid 1px #c7c8b2;
    border-right: solid 0 #c7c8b2;
}

/**
 * Menu Styling
 */

#menu ul li.node {
	background-image: url(../images/j_arrow_left.png);
	background-repeat: no-repeat;
	background-position: left 50%;
}

#menu a {
	background-position: right 50%;
}

#menu li {
	border-left: 1px solid #c7c8b2;
	border-right: 0 solid #c7c8b2;
}

#menu li li li a:focus {
	border-right: 1px solid #fafafa;
}

/* Installer Database */
#installer-database p.warning {
	background-position: center right;
}

#installer-database p.nowarning {
	background-position: center right;
}
templates/hathor/css/error.css000060400000002301152453623430012461 0ustar00/**
 * @copyright	(C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */

.outline {
	border: 1px solid #cccccc;
	background: #ffffff;
	padding: 2px;
}

body {
	height: 100%;
	padding: 0;
	font-family: Arial, Helvetica, Sans Serif;
	font-size: 11px;
	color: #2c2c2c;
	background: #ffffff;
	width: 80%;
	min-width: 400px;
	margin: 15px auto;
}

div {
	background-color: #f9fade;
	padding: 8px;
	border: solid 1px #c7c8b2;
	margin-top: 13px;
	margin-bottom: 25px;
}

.frame {
	background-color: #f9fade;
	padding: 8px;
	border: solid 1px #c7c8b2;
	margin-top: 13px;
	margin-bottom: 25px;
}

.table {
	border-collapse: collapse;
	margin-top: 13px;
}

a {
	border: 1px solid #c7c8b2;
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
	background-color: #ffffff;
	color: #2c2c2c;
	padding: 3px 20px;
	text-decoration: none;
}

a:hover, a:focus, a:active {
	background-color: #e3e4ca;
	text-decoration: none;
}

td {
	padding: 3px;
	padding-left: 5px;
	padding-right: 5px;
	border: solid 1px #c7c8b2;
	font-size: 10px;
}

.type {
	background-color: #cc0000;
	color: #ffffff;
	font-weight: bold;
	padding: 3px;
}
templates/hathor/css/theme.css000060400000013602152453623430012440 0ustar00@charset "UTF-8";

/**
 * @package		Joomla.Administrator
 * @subpackage	templates.hathor
 * @copyright	(C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @since		1.6
 */

/* ThemeOfficeMenu Style Sheet */

.ThemeOfficeMenu,
.ThemeOfficeSubMenuTable {
	font-family: Arial, Verdana, sans-serif;
	font-size: 13px;
	padding: 0;
	white-space: nowrap;
	cursor: default;
	height: 25px;
}

.ThemeOfficeSubMenu {
	position: absolute;
	visibility:	hidden;
	/*
	   Netscape/Mozilla renders borders by increasing
	   their z-index.  The following line is necessary
	   to cover any borders underneath
	*/
	z-index:	100;
	border:		0;
	padding:	0;
	overflow:	visible;
	border:		1px solid #8C867B;
	filter:progid:DXImageTransform.Microsoft.Shadow(color=#BDC3BD, Direction=135, Strength=4);
}

.ThemeOfficeSubMenuTable {
	overflow:	visible;
}

.ThemeOfficeMainItem,
.ThemeOfficeMainItemHover,
.ThemeOfficeMainItemActive,
.ThemeOfficeMenuItem,
.ThemeOfficeMenuItemHover,
.ThemeOfficeMenuItemActive {
	border:	0;
	cursor: default;
	white-space: nowrap;
}

.ThemeOfficeMainItem {
	/*background-color:	#EFEBDE;*/
}

.ThemeOfficeMainItemHover,
.ThemeOfficeMainItemActive {
	background-color:	#e7eddf;
}

.ThemeOfficeMenuItem {
	background-color:	#F1F3F5;
}

.ThemeOfficeMenuItemHover,
.ThemeOfficeMenuItemActive {
	background-color:	#e7eddf;
}


/* horizontal main menu */

.ThemeOfficeMainItem {
	padding: 4px 1px 4px 1px;
	border: 0;
}

td.ThemeOfficeMainItemHover,
td.ThemeOfficeMainItemActive {
	padding:	0;
	border-right:	1px solid #6d9d2e;
	border-left:	1px solid #6d9d2e;
}

.ThemeOfficeMainFolderLeft,
.ThemeOfficeMainItemLeft,
.ThemeOfficeMainFolderText,
.ThemeOfficeMainItemText,
.ThemeOfficeMainFolderRight,
.ThemeOfficeMainItemRight {
	background-color: inherit;
}

/* vertical main menu sub components */

td.ThemeOfficeMainFolderLeft,
td.ThemeOfficeMainItemLeft {
	padding-top:	2px;
	padding-bottom:	2px;
	padding-left:	0;
	padding-right:	2px;

	border-top:	1px solid #6d9d2e;
	border-bottom:	1px solid #6d9d2e;
	border-left:	1px solid #6d9d2e;

	background-color:	inherit;
}

td.ThemeOfficeMainFolderText,
td.ThemeOfficeMainItemText {
	padding-top:	2px;
	padding-bottom:	2px;
	padding-left:	5px;
	padding-right:	5px;

	border-top:	1px solid #6d9d2e;
	border-bottom:	1px solid #6d9d2e;

	background-color:	inherit;
	white-space:	nowrap;
}

td.ThemeOfficeMainFolderRight,
td.ThemeOfficeMainItemRight {
	padding-top:	2px;
	padding-bottom:	2px;
	padding-left:	0;
	padding-right:	0;

	border-top:	1px solid #6d9d2e;
	border-bottom:	1px solid #6d9d2e;
	border-right:	1px solid #6d9d2e;

	background-color:	inherit;
}

tr.ThemeOfficeMainItem td.ThemeOfficeMainFolderLeft,
tr.ThemeOfficeMainItem td.ThemeOfficeMainItemLeft {
	padding-top:	3px;
	padding-bottom:	3px;
	padding-left:	1px;
	padding-right:	2px;
	white-space:	nowrap;
	border:	0;
	background-color: inherit;
}

tr.ThemeOfficeMainItem td.ThemeOfficeMainFolderText,
tr.ThemeOfficeMainItem td.ThemeOfficeMainItemText {
	padding-top:	3px;
	padding-bottom:	3px;
	padding-left:	5px;
	padding-right:	5px;
	border:		0;
	background-color:	inherit;
}

tr.ThemeOfficeMainItem td.ThemeOfficeMainItemRight,
tr.ThemeOfficeMainItem td.ThemeOfficeMainFolderRight {
	padding-top:	3px;
	padding-bottom:	3px;
	padding-left:	0;
	padding-right:	1px;
	border:		0;
	background-color:	inherit;
}

/* sub menu sub components */

.ThemeOfficeMenuFolderLeft,
.ThemeOfficeMenuItemLeft {
	padding-top:	2px;
	padding-bottom:	2px;
	padding-left:	1px;
	padding-right:	3px;
	border-top:	1px solid #6d9d2e;
	border-bottom:	1px solid #6d9d2e;
	border-left:	1px solid #6d9d2e;
	background-color:	inherit;
	white-space:	nowrap;
}

.ThemeOfficeMenuFolderText,
.ThemeOfficeMenuItemText {
	padding-top:	2px;
	padding-bottom:	2px;
	padding-left:	5px;
	padding-right:	5px;

	border-top:	1px solid #6d9d2e;
	border-bottom:	1px solid #6d9d2e;

	background-color:	inherit;
	white-space:	nowrap;
}

.ThemeOfficeMenuFolderRight,
.ThemeOfficeMenuItemRight {
	padding-top:	2px;
	padding-bottom:	2px;
	padding-left:	0;
	padding-right:	0;

	border-top:	1px solid #6d9d2e;
	border-bottom:	1px solid #6d9d2e;
	border-right:	1px solid #6d9d2e;
	background-color:	inherit;
	white-space:	nowrap;
}

.ThemeOfficeMenuItem .ThemeOfficeMenuFolderLeft,
.ThemeOfficeMenuItem .ThemeOfficeMenuItemLeft {
	padding-top:	3px;
	padding-bottom:	3px;
	padding-left:	2px;
	padding-right:	3px;
	white-space:	nowrap;
	border: 	0;
	background-color:	#DDE1E6;
}

.ThemeOfficeMenuItem .ThemeOfficeMenuFolderText,
.ThemeOfficeMenuItem .ThemeOfficeMenuItemText {
	padding-top:	3px;
	padding-bottom:	3px;
	padding-left:	5px;
	padding-right:	5px;
	border:		0;
	background-color:	inherit;
}

.ThemeOfficeMenuItem .ThemeOfficeMenuFolderRight,
.ThemeOfficeMenuItem .ThemeOfficeMenuItemRight {
	padding-top:	3px;
	padding-bottom:	3px;
	padding-left:	0;
	padding-right:	1px;
	border:		0;
	background-color:	inherit;
}

/* menu splits */

.ThemeOfficeMenuSplit {
	margin:		2px;
	height:		1px;
	overflow:	hidden;
	background-color:	inherit;
	border-top:	1px solid #C6C3BD;
}

/* image shadow animation */
/*
	seq1:	image for normal
	seq2:	image for hover and active
	To use, in the icon field, input the following:
	<img class="seq1" src="normal.gif" /><img class="seq2" src="hover.gif" />
*/

.ThemeOfficeMenuItem img.seq1 {
	display:	inline;
}

.ThemeOfficeMenuItemHover seq2,
.ThemeOfficeMenuItemActive seq2 {
	display:	inline;
}

.ThemeOfficeMenuItem .seq2,
.ThemeOfficeMenuItemHover .seq1,
.ThemeOfficeMenuItemActive .seq1 {
	display:	none;
}

/* inactive settings */
div.inactive td.ThemeOfficeMainItemHover,
div.inactive td.ThemeOfficeMainItemActive {
	border-top: 0;
	border-right:	1px solid #f1f3f5;
	border-left:	1px solid #f1f3f5;
}

div.inactive .ThemeOfficeMainItem {
	color: #bbb;
}

div.inactive span.ThemeOfficeMainItemText {
	color: #aaa;
}

div.inactive .ThemeOfficeMainItemHover,
div.inactive .ThemeOfficeMainItemActive {
	background-color:	#f1f3f5;
}templates/hathor/css/colour_highcontrast.css000060400000122777152453623430015434 0ustar00@charset "UTF-8";

/**
 * @package		Joomla.Administrator
 * @subpackage	templates.hathor
 * @copyright	(C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @since		1.6
 *
 * Changes to use high contrast colors
 */

/**
 * Main Colors
 * #163365	Text background/border
 * #1c4181  Alternative text background 1/border
 * #1b3f7c	Alternative text background 2/border
 * #fcff20	Text
 * #ffffff	Highlighted Text
 * #10254a	Main hover color/border
 * #000000	Highlight/shadow border
 * #a20000	Invalid Alert Color
 * #00f800	Success Alert Color
 * #feffbf  Disabled Menu/Protected
 *
 * MENU:
 *
 * Standard Link
 * #1b3f7c  Link Background
 * #ffffff	Text
 * #10254a	Border
 *
 * Pressed Link
 * #163365	Text background
 * #ffffff	Highlighted Text
 * #000000	Left & Top Border
 * #1b3f7c	Right & Bottom Border
 *
 * Background behind the links
 * #163365	Background
 * #122b56	Border
 *
 * Inactive (Disabled)
 * #cccccc	Text
 *
 * SUBMENU
 * #163365	Active Tab Background
 * #fcff20	Active Tab Text color
 * #10254a	Hover background
 * #10254a	Border
 * #1b3f7c	"off" Tab Background
 * #ffffff	"off" Tab Text color
 *
 * #1c4181	Color behind the tabs
 */

/**
 * General styles
 */
body {
	background-color: #1c4181;
	color: #fcff20;
}

div#sbox-content {
	background-color: #1c4181;
	color: #fcff20;
}

h1 {
	color: #163365;
}

a:link {
	color: #ffffff;
}

a:visited {
	color: #ffffff;
}

a:hover,a:focus {
	text-decoration: underline;
	color: #fcff20;
}

/**
 * Overall Styles
 */
#header {
	background: #ffffff url(../images/j_logo.png) no-repeat;
}

#header h1.title {
	color: #163365;
}

#footer {
	background: #163365;
	border: 1px solid #1b3f7c;
}

#nav {
	background: #163365;
	border: 1px solid #1b3f7c;
}

#content {
	background: #1c4181;
}

#no-submenu {
	border-bottom: 1px solid #1b3f7c;
}

#element-box {
	background: #163365;
	border-right: 1px solid #1b3f7c;
	border-bottom: 1px solid #1b3f7c;
	border-left: 1px solid #1b3f7c;
}

#element-box.login {
	border-top: 1px solid #1b3f7c;
}

/**
 * Status layout
 */
#module-status a, #module-status span {
	color: #163365;
}

#module-status .preview {
	background: url(../images/menu/icon-16-media.png) 3px 3px no-repeat;
}

#module-status .viewsite {
	background: url(../images/menu/icon-16-viewsite.png) 3px 3px no-repeat;
}

#module-status .unread-messages,#module-status .no-unread-messages {
	background: url(../images/menu/icon-16-messages.png) 3px 3px no-repeat;
}

#module-status .loggedin-users {
	background: url(../images/menu/icon-16-user.png) 3px 3px no-repeat;
}

#module-status .backloggedin-users {
	background: url(../images/menu/icon-16-back-user.png) 3px 3px no-repeat;
}

#module-status .multilanguage {
	background: url(../images/menu/icon-16-language.png) 3px 3px no-repeat;
}

#module-status .logout {
	background: url(../images/menu/icon-16-logout.png) 3px 3px no-repeat;
}

/**
 * Various Styles
 */
.enabled,
.success ,
.allow,
span.writable {
	color: #00f800;
}

.disabled,
p.error,
.warning,
.deny,
span.unwritable	{
	color: #a20000;
}

.nowarning {
	color: #fcff20;
}

.none,.protected {
	color: #feffbf;
}

span.note {
	background: #163365;
	color: #fcff20;
}

div.checkin-tick {
	background: url(../images/admin/tick.png) 20px 50% no-repeat;
}

/**
 * Overlib
 */
.ol-foreground {
	background-color: #fcff20;
}

.ol-background {
	background-color: #1b3f7c;
}

.ol-textfont {
	color: #163365;
}

.ol-captionfont {
	color: #ffffff;
}

.ol-captionfont a {
	color: #1b3f7c;
}

/**
 * Subheader, toolbar, page title
 */
.pagetitle h2 {
	color: #fcff20;
}

div.configuration {
	color: #fcff20;
	background-image: url(../images/menu/icon-16-config.png);
	background-repeat: no-repeat;
}

div.toolbar-box {
	border-right: 1px solid #10254a;
	border-bottom: 1px solid #10254a;
	border-left: 1px solid #10254a;
	background: #163365;
}

div.toolbar-list li {
	color: #fcff20;
}

div.toolbar-list li.divider {
	border-right:1px dotted #1b3f7c;
}

div.toolbar-list a {
	border: 1px solid #10254a;
	color: #fcff20;
	background: #1b3f7c;
}

div.toolbar-list a:hover {
	border-left: 1px solid #000000;
	border-top: 1px solid #000000;
	border-right: 1px solid #1b3f7c;
	border-bottom: 1px solid #1b3f7c;
	background: #163365;
	color: #ffffff;
}

/**
 * Pane Slider pane Toggler styles
 */
.pane-sliders .title {
	color: #fcff20;
	border: 1px solid #10254a;
}

.pane-sliders .panel {
	border: 1px solid #1b3f7c;
}

.pane-sliders .panel h3 {
	background: #1c4181;
	color: #fcff20;
}

.pane-sliders .content {
	background: #163365;
}

.pane-sliders .adminlist {
	border: 0 none;
}

.pane-sliders .adminlist td {
	border: 0 none;
}

.pane-toggler  span {
	background: transparent url(../images/j_arrow.png) 5px 50% no-repeat;
}

.pane-toggler-down span {
	background: transparent url(../images/j_arrow_down.png) 5px 50%
		no-repeat;
}

.pane-toggler-down {
	border-bottom: 1px solid #1b3f7c;
}

/**
 * Tabs
 */
dl.tabs dt {
	border: 1px solid #10254a;
	background: #1c4181;
	color: #fcff20;
}

dl.tabs dt.open {
	background: #163365;
	border-bottom: 1px solid #163365;
	color: #fcff20;
}

dl.tabs dt.open a:visited {
	color: #fcff20;
}

div.current {
	border: 1px solid #10254a;
	background: #163365;
}

div.current dd {
	padding: 0;
	margin: 0;
}

div#menu-assignment h3 {
	border-bottom: 1px solid #fcff20;
}

/**
 * Login Settings
 */
#login-page .pagetitle h2 {
	background-color: transparent;
	/* background-color: #1c4181; */
	color: #fcff20;
}

#login-page #header {
	border-bottom: 1px solid #1b3f7c;
}

#login-page #content {
	background: #1c4181;
}

#login-page #lock {
	background: url(../images/j_login_lock.png) 50% 0 no-repeat;
}

#login-page #element-box.login {
	background: #163365;
	border: 1px solid #10254a;
}

#form-login {
	border: 1px solid #10254a;
	background: #1c4181;
}

#form-login label {
	color: #fcff20;
}

#form-login div.button1 a {
	color: #fcff20;
	background-color: #1b3f7c;
	border: 1px solid #10254a;
}

#form-login div.button1 a:hover,#form-login div.button1 a:focus {
	text-decoration: none;
	background-color: #163365;
	border-top: 1px solid #000000;
	border-right: 1px solid #1b3f7c;
	border-bottom: 1px solid #1b3f7c;
	border-left: 1px solid #000000;
	color: #fcff20;
}

/**
 * Cpanel Settings
 */
.cpanel-page div#element-box {
	background: #163365;
	border: 1px solid #10254a;
}

#cpanel div.icon a, .cpanel div.icon a {
	border: 1px solid #10254a;
	background: #1b3f7c;
	color: #fcff20;
}

#cpanel div.icon a:hover,
#cpanel div.icon a:focus,
.cpanel div.icon a:hover,
.cpanel div.icon a:focus {
	border-left: 1px solid #000000;
	border-top: 1px solid #000000;
	border-right: 1px solid #1b3f7c;
	border-bottom: 1px solid #1b3f7c;
	background: #163365;
	color: #ffffff;
}

/**
 * Form Styles
 */
fieldset {
	border: 3px dotted #1b3f7c;
}

legend {
	color: #fcff20;
}

fieldset ul.checklist input:focus {
	outline: thin dotted #333333;
}

fieldset#filter-bar {
	border-bottom: 1px solid #1b3f7c;
}

fieldset#filter-bar ol, fieldset#filter-bar ul {
	border: 0;
}

fieldset#filter-bar ol li fieldset, fieldset#filter-bar ul li fieldset {
	border: 0;
}

input,span.faux-input, select,option {
	color: #fcff20;
	background-color: #163365;
	border: 1px solid #1b3f7c;
}

/* Note: these visual cues should be augmented by aria */
.invalid {
	color: #a20000;
	background-color: #ffffff;
}

/* must be augmented by aria at the same time if changed dynamically by js
	aria-invalid=true or aria-invalid=false */
input.invalid {
	border: 1px solid #a20000;
}

input.required {
	background-color: #fcff20;
	color: #163365;
	border: 1px solid #1b3f7c;
}

input.disabled {
	background-color: #eeeeee;
}

/* Inputs used as buttons */
input[type="button"],
input[type="submit"],
input[type="reset"] {
	background-color: #1b3f7c;
	border: 1px solid #10254a;
	color: #fcff20;
}

input[type="button"]:hover, input[type="button"]:focus,
input[type="submit"]:hover, input[type="submit"]:focus,
input[type="reset"]:hover, input[type="reset"]:focus {
	background-color: #163365;
	border-top: 1px solid #000000;
	border-right: 1px solid #1b3f7c;
	border-bottom: 1px solid #1b3f7c;
	border-left: 1px solid #000000;
	color: #fcff20;
}

textarea {
	color: #fcff20;
	background-color: #163365;
	border: 1px solid #1b3f7c;
}

input:focus, select:focus, textarea:focus, option:focus,
input:hover, select:hover, textarea:hover, option:hover
	{
	background-color: #10254a;
	color: #fcff20;
}

/**
 * Option or Parameter styles
 */
.paramrules {
	background: #1b3f7c;
}

span.gi {
	color: #ffffff;
}


/**
 * Admintable Styles
 */
table.admintable td.key,table.admintable td.paramlist_key {
	background-color: #1c4181;
	color: #fcff20;
	border-bottom: 1px solid #10254a;
	border-right: 1px solid #10254a;
}

table.paramlist td.paramlist_description {
	background-color: #1c4181;
	color: #fcff20;
	border-bottom: 1px solid #10254a;
	border-right: 1px solid #10254a;
}

/**
 * Admin Form Styles
 */
fieldset.adminform {
	border: 1px solid #1b3f7c;
}

	/* Table styles are for use with tabular data */
table.adminform {
	background-color: #163365;
}

table.adminform tr.row0 {
	background-color: #163365;
}

table.adminform tr.row1 {
	background-color: #10254a;
}

table.adminform th {
	color: #fcff20;
	background: #163365;
}

table.adminform tr {
	border-bottom: 1px solid #1b3f7c;
	border-right: 1px solid #1b3f7c;
}

/**
 * Adminlist Table layout
 */
table.adminlist {
	background-color: #163365;
	color: #fcff20;
}

table.adminlist a {
	color: #ffffff;
}

table.adminlist thead th {
	background: #163365;
	color: #fcff20;
}

/* Table row styles */
table.adminlist tbody tr {
	background: #163365;
}

table.adminlist tbody tr.row1 {
	background: #163365;
}

table.adminlist tbody tr.row1 td,
table.adminlist tbody tr.row1 th {
	border-bottom: 1px solid #1b3f7c;
}

table.adminlist tbody tr.row0:hover td,
table.adminlist tbody tr.row1:hover td,
table.adminlist tbody tr.row0:hover th,
table.adminlist tbody tr.row1:hover th,
table.adminlist tbody tr.row0:focus td,
table.adminlist tbody tr.row1:focus td,
table.adminlist tbody tr.row0:focus th,
table.adminlist tbody tr.row1:focus th {
	background-color: #10254a;
}

table.adminlist tbody tr td,
table.adminlist tbody tr th {
	border-right: 1px solid #1b3f7c;
}

table.adminlist tbody tr td:last-child {
	border-right: none;
}

table.adminlist tbody tr.row0:last-child td,
table.adminlist tbody tr.row0:last-child th {
	border-bottom: 1px solid #1b3f7c;
}

table.adminlist tbody tr.row0 td,
table.adminlist tbody tr.row0 th {
	background: #1c4181;
}

table.adminlist tfoot tr {
	color: #fcff20;
}

/* Table td/th styles */
table.adminlist tfoot td,table.adminlist tfoot th {
	background-color: #163365;
	border-top: 1px solid #1b3f7c;
}

/**
 * Adminlist buttons
 */
table.adminlist tr td.btns a {
	background-color: #1b3f7c;
	border: 1px solid #10254a;
	color: #fcff20;
}

table.adminlist tr td.btns a:hover, table.adminlist tr td.btns a:active, table.adminlist tr td.btns a:focus {
	background-color: #163365;
	border-top: 1px solid #000000;
	border-right: 1px solid #1b3f7c;
	border-bottom: 1px solid #1b3f7c;
	border-left: 1px solid #000000;
	color: #fcff20;
}

/**
 * Saving order icon styling in admin tables
 */
a.saveorder {
	background: url(../images/admin/filesave.png) no-repeat;
}

a.saveorder.inactive {
	background-position: 0 -16px;
}

/**
 * Saving order icon styling in admin tables
 */
fieldset.batch {
	background: #1c4181;
}


/**
 * Button styling
 */
button {
	color: #fcff20;
	background-color: #1b3f7c;
	border: 1px solid #10254a;
}

button:hover, button:focus {
	background-color: #163365;
	border-top: 1px solid #000000;
	border-right: 1px solid #1b3f7c;
	border-bottom: 1px solid #1b3f7c;
	border-left: 1px solid #000000;
	color: #fcff20;
}

/* Button 1 Type */
.button1 {
	border: none;
	background: #1b3f7c;
}

	/* Use this if you add images to the buttons such as directional arrows */
.button1 .next {
	/* background: transparent url(../images/j_button1_next.png) 100% 0 no-repeat;  */
}

.button1 a {
	border: 1px solid #10254a;
	color: #fcff20;
}

.button1 a:hover,.button1 a:focus {
	text-decoration: none;
	background-color: #163365;
	border-top: 1px solid #000000;
	border-right: 1px solid #1b3f7c;
	border-bottom: 1px solid #1b3f7c;
	border-left: 1px solid #000000;
	color: #fcff20;
}

/* Button 2 Type */
.button2-left,.button2-right {
	border: none;
	background: #1b3f7c;
}

.button2-left a,.button2-right a,.button2-left span,.button2-right span
	{
	color: #fcff20;
	border: 1px solid #10254a;
}

/* these are inactive buttons */
.button2-left span,.button2-right span {
	color: #cccccc;
	border: 1px solid #10254a;
}

.page span,.blank span {
	color: #fcff20;
	border: 1px solid #10254a;
}

.button2-left a:hover,.button2-right a:hover,.button2-left a:focus,.button2-right a:focus
	{
	text-decoration: none;
	background-color: #163365;
	border-top: 1px solid #000000;
	border-right: 1px solid #1b3f7c;
	border-bottom: 1px solid #1b3f7c;
	border-left: 1px solid #000000;
	color: #fcff20;
}

/**
 * Pagination styles
 */

	/* Grey out the current page number */
.pagination .page span {
	color: #cccccc;
}

/**
 * Tooltips
 */
.tip {
	background: #000000;
	border: 1px solid #FFFFFF;
}

.tip-title {
	background: url(../images/selector-arrow-std.png) no-repeat;
}

/**
 * Calendar
 */
a img.calendar {
	background: url(../images/calendar.png) no-repeat;
}

/**
 * JGrid styles
 */
.jgrid span.publish {
	background-image: url(../images/admin/tick.png);
}

.jgrid span.unpublish {
	background-image: url(../images/admin/publish_x.png);
}

.jgrid span.archive {
	background-image: url(../images/menu/icon-16-archive.png);
}

.jgrid span.trash {
	background-image: url(../images/menu/icon-16-trash.png);
}

.jgrid span.default {
	background-image: url(../images/menu/icon-16-default.png);
}

.jgrid span.notdefault {
	background-image: url(../images/menu/icon-16-notdefault.png);
}

.jgrid span.checkedout {
	background-image: url(../images/admin/checked_out.png);
}

.jgrid span.downarrow {
	background-image: url(../images/admin/downarrow.png);
}

.jgrid span.downarrow_disabled {
	background-image: url(../images/admin/downarrow0.png);
}

.jgrid span.uparrow {
	background-image: url(../images/admin/uparrow.png);
}

.jgrid span.uparrow_disabled {
	background-image: url(../images/admin/uparrow0.png);
}

.jgrid span.published {
	background-image: url(../images/admin/publish_g.png);
}

.jgrid span.expired {
	background-image: url(../images/admin/publish_r.png);
}

.jgrid span.pending	{
	background-image: url(../images/admin/publish_y.png);
}

.jgrid span.warning	{
	background-image: url(../images/admin/publish_y.png);
}

/**
 * Menu Icons
 * These icons are used on the Administrator menu
 * The classes are constructed dynamically when the menu is generated
 */
.icon-16-archive {
	background-image: url(../images/menu/icon-16-archive.png);
}

.icon-16-article {
	background-image: url(../images/menu/icon-16-article.png);
}

.icon-16-banners {
	background-image: url(../images/menu/icon-16-banner.png);
}

.icon-16-banners-clients {
	background-image: url(../images/menu/icon-16-banner-client.png);
}

.icon-16-banners-tracks {
	background-image: url(../images/menu/icon-16-banner-tracks.png);
}

.icon-16-banners-cat {
	background-image: url(../images/menu/icon-16-banner-categories.png);
}

.icon-16-category {
	background-image: url(../images/menu/icon-16-category.png);
}

.icon-16-checkin {
	background-image: url(../images/menu/icon-16-checkin.png);
}

.icon-16-clear {
	background-image: url(../images/menu/icon-16-clear.png);
}

.icon-16-component {
	background-image: url(../images/menu/icon-16-component.png);
}

.icon-16-config {
	background-image: url(../images/menu/icon-16-config.png);
}

.icon-16-contact {
	background-image: url(../images/menu/icon-16-contacts.png);
}

.icon-16-contact-cat {
	background-image: url(../images/menu/icon-16-contacts-categories.png);
}

.icon-16-content {
	background-image: url(../images/menu/icon-16-content.png);
}

.icon-16-cpanel {
	background-image: url(../images/menu/icon-16-cpanel.png);
}

.icon-16-default {
	background-image: url(../images/menu/icon-16-default.png);
}

.icon-16-featured {
	background-image: url(../images/menu/icon-16-featured.png);
}

.icon-16-groups {
	background-image: url(../images/menu/icon-16-groups.png);
}

.icon-16-help {
	background-image: url(../images/menu/icon-16-help.png);
}

.icon-16-help-this {
	background-image: url(../images/menu/icon-16-help-this.png);
}

.icon-16-help-forum {
	background-image: url(../images/menu/icon-16-help-forum.png);
}

.icon-16-help-docs {
	background-image: url(../images/menu/icon-16-help-docs.png);
}

.icon-16-help-jed {
	background-image: url(../images/menu/icon-16-help-jed.png);
}

.icon-16-help-jrd {
	background-image: url(../images/menu/icon-16-help-jrd.png);
}

.icon-16-help-community {
	background-image: url(../images/menu/icon-16-help-community.png);
}

.icon-16-help-security {
	background-image: url(../images/menu/icon-16-help-security.png);
}

.icon-16-help-dev {
	background-image: url(../images/menu/icon-16-help-dev.png);
}

.icon-16-help-shop {
	background-image: url(../images/menu/icon-16-help-shop.png);
}

.icon-16-info {
	background-image: url(../images/menu/icon-16-info.png);
}

.icon-16-install {
	background-image: url(../images/menu/icon-16-install.png);
}

.icon-16-joomlaupdate {
	background-image: url(../images/menu/icon-16-install.png);
}

.icon-16-language {
	background-image: url(../images/menu/icon-16-language.png);
}

.icon-16-levels {
	background-image: url(../images/menu/icon-16-levels.png);
}

.icon-16-logout {
	background-image: url(../images/menu/icon-16-logout.png);
}

.icon-16-maintenance {
	background-image: url(../images/menu/icon-16-maintenance.png);
}

.icon-16-massmail {
	background-image: url(../images/menu/icon-16-massmail.png);
}

.icon-16-media {
	background-image: url(../images/menu/icon-16-media.png);
}

.icon-16-menu {
	background-image: url(../images/menu/icon-16-menu.png);
}

.icon-16-menumgr {
	background-image: url(../images/menu/icon-16-menumgr.png);
}

.icon-16-messages {
	background-image: url(../images/menu/icon-16-messaging.png);
}

.icon-16-messages-add {
	background-image: url(../images/menu/icon-16-new-privatemessage.png);
}

.icon-16-messages-read {
	background-image: url(../images/menu/icon-16-messages.png);
}

.icon-16-module {
	background-image: url(../images/menu/icon-16-module.png);
}

/* .icon-16-new 		{ background-image: url(../images/menu/icon-16-new.png); } */
.icon-16-newarticle {
	background-image: url(../images/menu/icon-16-newarticle.png);
}

.icon-16-newcategory {
	background-image: url(../images/menu/icon-16-newcategory.png);
}

.icon-16-newgroup {
	background-image: url(../images/menu/icon-16-newgroup.png);
}

.icon-16-newlevel {
	background-image: url(../images/menu/icon-16-newlevel.png);
}

.icon-16-newuser {
	background-image: url(../images/menu/icon-16-newuser.png);
}

.icon-16-plugin {
	background-image: url(../images/menu/icon-16-plugin.png);
}

.icon-16-profile {
	background-image: url(../images/menu/icon-16-user.png);
}

.icon-16-purge {
	background-image: url(../images/menu/icon-16-purge.png);
}

.icon-16-readmess {
	background-image: url(../images/menu/icon-16-readmess.png);
}

.icon-16-section {
	background-image: url(../images/menu/icon-16-section.png);
}

.icon-16-static {
	background-image: url(../images/menu/icon-16-static.png);
}

.icon-16-stats {
	background-image: url(../images/menu/icon-16-stats.png);
}

.icon-16-themes {
	background-image: url(../images/menu/icon-16-themes.png);
}

.icon-16-trash {
	background-image: url(../images/menu/icon-16-trash.png);
}

.icon-16-user {
	background-image: url(../images/menu/icon-16-user.png);
}

.icon-16-user-note {
	background-image: url(../images/menu/icon-16-user-note.png);
}

.icon-16-delete {
	background-image: url(../images/menu/icon-16-delete.png);
}

.icon-16-help-trans {
	background-image: url(../images/menu/icon-16-help-trans.png);
}

.icon-16-newsfeeds {
	background-image: url(../images/menu/icon-16-newsfeeds.png);
}

.icon-16-newsfeeds-cat {
	background-image: url(../images/menu/icon-16-newsfeeds-cat.png);
}

.icon-16-redirect {
	background-image: url(../images/menu/icon-16-redirect.png);
}

.icon-16-search {
	background-image: url(../images/menu/icon-16-search.png);
}

.icon-16-finder {
	background-image: url(../images/menu/icon-16-search.png);
}

.icon-16-weblinks {
	background-image: url(../images/menu/icon-16-links.png);
}

.icon-16-weblinks-cat {
	background-image: url(../images/menu/icon-16-links-cat.png);
}

/**
 * Toolbar icons
 * These icons are used for the toolbar buttons
 * The classes are constructed dynamically when the toolbar is created
 */
.icon-32-send {
	background-image: url(../images/toolbar/icon-32-send.png);
}

.icon-32-delete {
	background-image: url(../images/toolbar/icon-32-delete.png);
}

.icon-32-help {
	background-image: url(../images/toolbar/icon-32-help.png);
}

.icon-32-cancel {
	background-image: url(../images/toolbar/icon-32-cancel.png);
}

.icon-32-checkin {
	background-image: url(../images/toolbar/icon-32-checkin.png);
}

.icon-32-options{
	background-image: url(../images/toolbar/icon-32-config.png);
}

.icon-32-apply {
	background-image: url(../images/toolbar/icon-32-apply.png);
}

.icon-32-back {
	background-image: url(../images/toolbar/icon-32-back.png);
}

.icon-32-forward {
	background-image: url(../images/toolbar/icon-32-forward.png);
}

.icon-32-save {
	background-image: url(../images/toolbar/icon-32-save.png);
}

.icon-32-edit {
	background-image: url(../images/toolbar/icon-32-edit.png);
}

.icon-32-copy {
	background-image: url(../images/toolbar/icon-32-copy.png);
}

.icon-32-move {
	background-image: url(../images/toolbar/icon-32-move.png);
}

.icon-32-new {
	background-image: url(../images/toolbar/icon-32-new.png);
}

.icon-32-upload {
	background-image: url(../images/toolbar/icon-32-upload.png);
}

.icon-32-assign {
	background-image: url(../images/toolbar/icon-32-publish.png);
}

.icon-32-html {
	background-image: url(../images/toolbar/icon-32-html.png);
}

.icon-32-css {
	background-image: url(../images/toolbar/icon-32-css.png);
}

.icon-32-menus {
	background-image: url(../images/toolbar/icon-32-menu.png);
}

.icon-32-publish {
	background-image: url(../images/toolbar/icon-32-publish.png);
}

.icon-32-unblock {
	background-image: url(../images/toolbar/icon-32-unblock.png);
}

.icon-32-unpublish {
	background-image: url(../images/toolbar/icon-32-unpublish.png);
}

.icon-32-restore {
	background-image: url(../images/toolbar/icon-32-revert.png);
}

.icon-32-trash {
	background-image: url(../images/toolbar/icon-32-trash.png);
}

.icon-32-archive {
	background-image: url(../images/toolbar/icon-32-archive.png);
}

.icon-32-unarchive {
	background-image: url(../images/toolbar/icon-32-unarchive.png);
}

.icon-32-preview {
	background-image: url(../images/toolbar/icon-32-preview.png);
}

.icon-32-default {
	background-image: url(../images/toolbar/icon-32-default.png);
}

.icon-32-refresh {
	background-image: url(../images/toolbar/icon-32-refresh.png);
}

.icon-32-save-new {
	background-image: url(../images/toolbar/icon-32-save-new.png);
}

.icon-32-save-copy {
	background-image: url(../images/toolbar/icon-32-save-copy.png);
}

.icon-32-error {
	background-image: url(../images/toolbar/icon-32-error.png);
}

.icon-32-new-style {
	background-image: url(../images/toolbar/icon-32-new-style.png);
}

.icon-32-delete-style {
	background-image: url(../images/toolbar/icon-32-delete-style.png);
}

.icon-32-purge {
	background-image: url(../images/toolbar/icon-32-purge.png);
}

.icon-32-remove {
	background-image: url(../images/toolbar/icon-32-remove.png);
}

.icon-32-featured {
	background-image: url(../images/toolbar/icon-32-featured.png);
}

.icon-32-unfeatured {
	background-image: url(../images/toolbar/icon-32-featured.png);
	background-position: 0% 100%;
}

.icon-32-export {
	background-image: url(../images/toolbar/icon-32-export.png);
}

.icon-32-stats {
	background-image: url(../images/toolbar/icon-32-stats.png);
}

.icon-32-print {
	background-image: url(../images/toolbar/icon-32-print.png);
}

.icon-32-batch {
	background-image: url(../images/toolbar/icon-32-batch.png);
}

.icon-32-envelope {
	background-image: url(../images/toolbar/icon-32-messaging.png);
}
.icon-32-download {
	background-image: url(../images/toolbar/icon-32-export.png);
}

.icon-32-bars {
	background-image: url(../images/toolbar/icon-32-stats.png);
}

/**
 * Quick Icons
 * Also knows as Header Icons
 * These are used for the Quick Icons on the Control Panel
 * The same classes are also assigned the Component Title
 */
.icon-48-categories {
	background-image: url(../images/header/icon-48-category.png);
}

.icon-48-category-edit {
	background-image: url(../images/header/icon-48-category.png);
}

.icon-48-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}

.icon-48-generic {
	background-image: url(../images/header/icon-48-generic.png);
}

.icon-48-banners {
	background-image: url(../images/header/icon-48-banner.png);
}

.icon-48-banners-categories {
	background-image: url(../images/header/icon-48-banner-categories.png);
}

.icon-48-banners-category-edit {
	background-image: url(../images/header/icon-48-banner-categories.png);
}

.icon-48-banners-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}

.icon-48-banners-clients {
	background-image: url(../images/header/icon-48-banner-client.png);
}

.icon-48-banners-tracks {
	background-image: url(../images/header/icon-48-banner-tracks.png);
}

.icon-48-checkin {
	background-image: url(../images/header/icon-48-checkin.png);
}

.icon-48-clear {
	background-image: url(../images/header/icon-48-clear.png);
}

.icon-48-contact {
	background-image: url(../images/header/icon-48-contacts.png);
}

.icon-48-contact-categories {
	background-image: url(../images/header/icon-48-contacts-categories.png);
}

.icon-48-contact-category-edit {
	background-image: url(../images/header/icon-48-contacts-categories.png);
}

.icon-48-contact-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}

.icon-48-purge {
	background-image: url(../images/header/icon-48-purge.png);
}

.icon-48-cpanel {
	background-image: url(../images/header/icon-48-cpanel.png);
}

.icon-48-config {
	background-image: url(../images/header/icon-48-config.png);
}

.icon-48-groups {
	background-image: url(../images/header/icon-48-groups.png);
}

.icon-48-groups-add {
	background-image: url(../images/header/icon-48-groups-add.png);
}

.icon-48-levels {
	background-image: url(../images/header/icon-48-levels.png);
}

.icon-48-levels-add {
	background-image: url(../images/header/icon-48-levels-add.png);
}

.icon-48-module {
	background-image: url(../images/header/icon-48-module.png);
}

.icon-48-menu {
	background-image: url(../images/header/icon-48-menu.png);
}

.icon-48-menu-add {
	background-image: url(../images/header/icon-48-menu-add.png);
}

.icon-48-menumgr {
	background-image: url(../images/header/icon-48-menumgr.png);
}

.icon-48-trash {
	background-image: url(../images/header/icon-48-trash.png);
}

.icon-48-user {
	background-image: url(../images/header/icon-48-user.png);
}

.icon-48-user-add {
	background-image: url(../images/header/icon-48-user-add.png);
}

.icon-48-user-edit {
	background-image: url(../images/header/icon-48-user-edit.png);
}

.icon-48-user-profile {
	background-image: url(../images/header/icon-48-user-profile.png);
}

.icon-48-inbox {
	background-image: url(../images/header/icon-48-inbox.png);
}

.icon-48-new-privatemessage {
	background-image: url(../images/header/icon-48-new-privatemessage.png);
}

.icon-48-msgconfig {
	background-image: url(../images/header/icon-48-message_config.png);
}

.icon-48-langmanager {
	background-image: url(../images/header/icon-48-language.png);
}

.icon-48-mediamanager {
	background-image: url(../images/header/icon-48-media.png);
}

.icon-48-plugin {
	background-image: url(../images/header/icon-48-plugin.png);
}

.icon-48-help_header {
	background-image: url(../images/header/icon-48-help_header.png);
}

.icon-48-impressions {
	background-image: url(../images/header/icon-48-stats.png);
}

.icon-48-browser {
	background-image: url(../images/header/icon-48-stats.png);
}

.icon-48-searchtext {
	background-image: url(../images/header/icon-48-stats.png);
}

.icon-48-thememanager {
	background-image: url(../images/header/icon-48-themes.png);
}

.icon-48-assoc {
	background-image: url(../images/header/icon-48-assoc.png);
}

.icon-48-writemess {
	background-image: url(../images/header/icon-48-writemess.png);
}

.icon-48-featured {
	background-image: url(../images/header/icon-48-featured.png);
}

.icon-48-sections {
	background-image: url(../images/header/icon-48-section.png);
}

.icon-48-article-add {
	background-image: url(../images/header/icon-48-article-add.png);
}

.icon-48-article-edit {
	background-image: url(../images/header/icon-48-article-edit.png);
}

.icon-48-article {
	background-image: url(../images/header/icon-48-article.png);
}

.icon-48-content-categories {
	background-image: url(../images/header/icon-48-category.png);
}

.icon-48-content-category-edit {
	background-image: url(../images/header/icon-48-category.png);
}

.icon-48-content-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}

.icon-48-install {
	background-image: url(../images/header/icon-48-extension.png);
}

.icon-48-dbbackup {
	background-image: url(../images/header/icon-48-backup.png);
}

.icon-48-dbrestore {
	background-image: url(../images/header/icon-48-dbrestore.png);
}

.icon-48-dbquery {
	background-image: url(../images/header/icon-48-query.png);
}

.icon-48-systeminfo {
	background-image: url(../images/header/icon-48-info.png);
}

.icon-48-massmail {
	background-image: url(../images/header/icon-48-massmail.png);
}

.icon-48-redirect {
	background-image: url(../images/header/icon-48-redirect.png);
}

.icon-48-search	{
	background-image: url(../images/header/icon-48-search.png);
}

.icon-48-finder	{
	background-image: url(../images/header/icon-48-search.png);
}

.icon-48-newsfeeds {
	background-image: url(../images/header/icon-48-newsfeeds.png);
}

.icon-48-newsfeeds-categories {
	background-image: url(../images/header/icon-48-newsfeeds-cat.png);
}

.icon-48-newsfeeds-category-edit {
	background-image: url(../images/header/icon-48-newsfeeds-cat.png);
}

.icon-48-newsfeeds-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}

.icon-48-weblinks {
	background-image: url(../images/header/icon-48-links.png);
}

.icon-48-weblinks-categories {
	background-image: url(../images/header/icon-48-links-cat.png);
}

.icon-48-weblinks-category-edit {
	background-image: url(../images/header/icon-48-links-cat.png);
}

.icon-48-weblinks-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}

.icon-48-tags {
	background-image: url(../images/header/icon-48-tags.png);
}

/**
 * General styles
 */
div.message {
	border: 1px solid #1b3f7c;
	color: #333;
}

.helpFrame {
	border-left: 0 solid #1b3f7c;
	border-right: none;
	border-top: none;
	border-bottom: none;
}

/**
 * Override mootree.css styles
 * media/system/css/mootree.css
 */
.mooTree_selected	 {
	background-color: #10254a;
}

/**
 * Modal Styles
 */
dl.menu_type dt {
	border-bottom: 1px solid #1b3f7c;
}

ul#new-modules-list {
	border-top: 1px solid #1b3f7c;
}

/**
 * Override mediamanager.css styles
 * administrator/components/com_media/assets/mediamanager.css
 */
#folderview input#folderpath {
	width: 65%;
	color: #fcff20;
	background-color: #163365;
	border: 1px solid #1b3f7c;
}

.upload-queue .queue-loader {
	background-color: #fcff20;
	color: #163365;
	border: 1px inset #fcff20;
}

.upload-queue .queue-subloader {
	background-color: #1b3f7c;
	color: #fcff20;
}

/**
 * User Accessibility
 */

	/* Skip to Content Visual Styling */
#skiplinkholder a, #skiplinkholder a:link, #skiplinkholder a:visited {
	color: #163365;
	background: #fcff20;
}

/**
 * Admin Form Styles
 */
fieldset.panelform {
	border: none 0;
}

/**
 * ACL STYLES relocated from com_users/media/grid.css
 */
a.move_up {
	background-image: url('../images/admin/uparrow.png');
}

span.move_up {
	background-image: url('../images/admin/uparrow0.png');
}

a.move_down {
	background-image: url('../images/admin/downarrow.png');
}

span.move_down {
	background-image: url('../images/admin/downarrow0.png');
}

a.grid_false {
	background-image: url('../images/admin/publish_x.png');
}

a.grid_true {
	background-image: url('../images/admin/tick.png');
}

a.grid_trash {
	background-image: url('../images/admin/icon-16-trash.png');
}

/**
 * ACL PANEL STYLES
 */

/* All Tabs */

tr.row1 {
	background-color: #1c4181;
}

/* Summary Tab */
table.aclsummary-table td.col2,
table.aclsummary-table th.col2,
table.aclsummary-table td.col3,
table.aclsummary-table th.col3,
table.aclsummary-table td.col4,
table.aclsummary-table th.col4,
table.aclsummary-table td.col5,
table.aclsummary-table th.col5,
table.aclsummary-table td.col6,
table.aclsummary-table th.col6,
table.aclmodify-table td.col2,
table.aclmodify-table th.col2 {
	border-left: 1px solid #cbcbcb;
}

/* Icons */

span.icon-16-unset {
	background: url(../images/admin/icon-16-denyinactive.png) no-repeat;
}

span.icon-16-allowed {
	background: url(../images/admin/icon-16-allow.png) no-repeat;
}

span.icon-16-denied {
	background: url(../images/admin/icon-16-deny.png) no-repeat;
}

span.icon-16-locked {
	background: url(../images/admin/checked_out.png) 0 0 no-repeat;
}

label.icon-16-allow {
	background: url(../images/admin/icon-16-allow.png) no-repeat;
}

label.icon-16-deny {
	background: url(../images/admin/icon-16-deny.png) no-repeat;
}
a.icon-16-allow {
	background: url(../images/admin/icon-16-allow.png) no-repeat ;
}
a.icon-16-deny {
	background: url(../images/admin/icon-16-deny.png) no-repeat ;
}
a.icon-16-allowinactive {
	background: url(../images/admin/icon-16-allowinactive.png) no-repeat ;
}
a.icon-16-denyinactive {
	background: url(../images/admin/icon-16-denyinactive.png) no-repeat ;
}

/* ACL footer/legend */

ul.acllegend li.acl-allowed {
	background: url(../images/admin/icon-16-allow.png) no-repeat left;
}

ul.acllegend li.acl-denied {
	background: url(../images/admin/icon-16-deny.png) no-repeat left;
}

li.acl-editgroups,
li.acl-resetbtn {
	background-color: #1b3f7c;
	border: 1px solid #10254a;
}

li.acl-editgroups a,
li.acl-resetbtn a {
	color: #fcff20
}

li.acl-editgroups:hover,
li.acl-resetbtn:hover,
li.acl-editgroups:focus,
li.acl-resetbtn:focus {
	background-color: #163365;
	border-top: 1px solid #000000;
	border-right: 1px solid #1b3f7c;
	border-bottom: 1px solid #1b3f7c;
	border-left: 1px solid #000000;
	color: #fcff20;
}

/* ACL Config --------- */
table#acl-config {
	border: 1px solid #10254a;
	background: #1c4181;
}

table#acl-config th,
table#acl-config td {
	background: #1c4181;
	border-bottom: 1px solid #10254a;
	border-top: none;
	border-left: none;
	border-right: none;
}

table#acl-config th.acl-groups {
	border-right: 1px solid #10254a;
}

/**
* Mod_rewrite Warning
*/
#jform_sef_rewrite-lbl {
	background: url(../images/admin/icon-16-notice-note.png) right top no-repeat;
}

/**
* Options modal- config
*/

/* *
* Permission Rules
*/

#permissions-sliders ul#rules,
#permissions-sliders ul#rules ul {
    border:solid 0 #1b3f7c;
    background:#163365;
}

ul#rules li .pane-sliders .panel h3.title {
	border:solid 0 #1b3f7c;
}

#permissions-sliders ul#rules .pane-slider {
	border:solid 1px #1b3f7c;
}

#permissions-sliders ul#rules li h3 {
	background:#1c4181;
	border: 1px solid #1b3f7c;
}

#permissions-sliders ul#rules li h3.pane-toggler-down a {
	border:solid 0;
}

#permissions-sliders ul#rules .group-kind {
	color:#fcff20;
}

#permissions-sliders ul#rules table.group-rules td {
    border-right:solid 1px #1b3f7c;
    border-bottom:solid 1px #1b3f7c;
}

#permissions-sliders ul#rules table.group-rules th {
    background: #10254a;
    border-right:solid 1px #1b3f7c;
    border-bottom:solid 1px #1b3f7c;
    color:#fcff20;
}

ul#rules table.aclmodify-table {
	border:solid 1px #fcff20;
}

ul#rules table.group-rules td label {
	border:solid 0 #1b3f7c;
}

#permissions-sliders ul#rules .mypanel {
	border:solid 0 #1b3f7c;
}

#permissions-sliders  ul#rules  table.group-rules td {
   background: #163365;
}

#permissions-sliders span.level {
	color:#ffffff;
	background-image:none;
}

/*
 * Debug styles
 */
.check-0,
table.adminlist tbody td.check-0,
table.adminlist tbody tr:hover td.check-0 {
	background-color: #FFFFCF;
	color: #163365;
}

.check-a,
table.adminlist tbody td.check-a,
table.adminlist tbody tr:hover td.check-a {
	background-color: #CFFFDA;
	color: #163365;
}

.check-d,
table.adminlist tbody td.check-d,
table.adminlist tbody tr:hover td.check-d {
	background-color: #FFCFCF;
	color: #163365;
}

/**
 * System Messages
 */

#system-message dd ul {
	color: #fcff20;
	border-top: 3px solid #84A7DB;
	border-bottom: 3px solid #84A7DB;
}

#system-message dd.error ul {
	color: #fcff20;
	background: #1c4181 url(../images/notice-alert.png) 4px top no-repeat;
	border-top: 3px solid #a20000;
	border-bottom: 3px solid #a20000;
}

#system-message dd.message ul {
	color: #fcff20;
	background: #10254a url(../images/notice-info.png) 4px center no-repeat;
	border-top: 3px solid #EFE7B8;
	border-bottom: 3px solid #EFE7B8;
}

#system-message dd.notice ul {
	color: #fcff20;
	background: #10254a url(../images/notice-note.png) 4px top no-repeat;
	border-top: 3px solid #F0DC7E;
	border-bottom: 3px solid #F0DC7E;
}

/** CSS file for Accessible Admin Menu
 * based on Matt Carrolls' son of suckerfish
 * with javascript by Bill Tomczak
 */

	/* Note: set up the font-size on the id and used 100% on the elements.
	If ul/li/a are different ems, then the shifting back via non-js keyboard
	doesn't work properly */

/**
 * Menu Styling
 */
#menu { /* this is on the main ul */
	color: #ffffff;
}

#menu ul { /* all lists */
	background-color: #163365;
	color: #ffffff;
}

#menu ul li.node {
	background: #163365 url(../images/j_arrow.png) no-repeat right 50%;
}

#menu a {
	color: #ffffff;
	background-repeat: no-repeat;
	background-position: left 50%;
	background-color: #1b3f7c;
}

#menu li { /* all list items */
	background-color: #163365;
	border-right: 1px solid #000000;
}

#menu li a {
	border: 1px solid #10254a;
}

#menu li li a {
	border: 1px solid #10254a;
}

#menu li a:hover,
#menu li a:active,
#menu li a:focus {
	background-color: #163365;
	border-top: 1px solid #000000;
	border-right: 1px solid #1b3f7c;
	border-bottom: 1px solid #1b3f7c;
	border-left: 1px solid #000000;
	color: #ffffff;
}

#menu li.disabled a:hover,
#menu li.disabled a:focus,
#menu li.disabled a {
	color: #feffbf;
	background-color: #1b3f7c;
	border-top: 1px solid #163365;
	border-right: 1px solid #10254a;
	border-bottom: 1px solid #163365;
	border-left: 1px solid #10254a;
}

#menu li ul { /* second-level lists */
	border-top: 1px solid #10254a;
	border-bottom: 2px solid #10254a;
}

#menu li li { /* second-level row */
	background-color: #163365;
}

#menu li:hover ul,#menu li.sfhover ul {
	/* lists nested under hovered list items */
	margin-left: 0;
	border-left: 1px solid #122b56;
	border-right: 1px solid #122b56;
}

#menu li li:hover ul,#menu li li.sfhover ul {
	border-left: 1px solid #122b56;
	border-right: 1px solid #122b56;
}

/**
 * Styling parents
 */

 	/* 1 level - sfhover */
#menu li.sfhover a {
	background-color: #163365;
	border-top: 1px solid #000000;
	border-right: 1px solid #1b3f7c;
	border-bottom: 1px solid #1b3f7c;
	border-left: 1px solid #000000;
	color: #fcff20;
}

	/* 2 level - normal */
#menu li.sfhover li a { /* background-color: #f0f0f0; */
	background-color: #1b3f7c;
	border: 1px solid #10254a;
	color: #ffffff;
}

	/* 2 level - hover */
#menu li.sfhover li.sfhover a,#menu li li a:focus {
	background-color: #163365;
	border-top: 1px solid #000000;
	border-right: 1px solid #1b3f7c;
	border-bottom: 1px solid #1b3f7c;
	border-left: 1px solid #000000;
	color: #fcff20;
}

	/* 3 level - normal */
#menu li.sfhover li.sfhover li a {
	background-color: #1b3f7c;
	border: 1px solid #10254a;
	color: #ffffff;
}

	/* 3 level - hover */
#menu li.sfhover li.sfhover li.sfhover a {
	background-color: #163365;
	border-top: 1px solid #000000;
	border-right: 1px solid #1b3f7c;
	border-bottom: 1px solid #1b3f7c;
	border-left: 1px solid #000000;
	color: #fcff20;
}

/* bring back the focus elements into view */
#menu li li a:focus, #menu li li li a:focus {
	background-color: #163365;
	border-top: 1px solid #000000;
	border-right: 1px solid #1b3f7c;
	border-bottom: 1px solid #1b3f7c;
	border-left: 1px solid #000000;
	color: #ffffff;
}

#menu li li li a:focus {
	background-color: #163365;
	border-top: 1px solid #000000;
	border-right: 1px solid #1b3f7c;
	border-bottom: 1px solid #1b3f7c;
	border-left: 1px solid #000000;
	color: #ffffff;
}

/**
 * Submenu styling
 */
#submenu {
	border-bottom: 1px solid #10254a;
	/* border-bottom plus padding-bottom is the technique */
	/* This is the background befind the tabs */
	background: #1c4181;
}

#submenu a, #submenu span.nolink {
	background: #1b3f7c;
	border: 1px solid #10254a;
	color: #ffffff;
}

#submenu a:hover, #submenu a:focus {
	background-color: #10254a;
}

#submenu a.active, #submenu span.nolink.active {
	background: #163365;
	border-bottom: 1px solid #163365;
	color: #fcff20;
}

/**
 * Webkit fixes
 **/
input:-webkit-autofill {
	background-color: #163365 !important;
}

/* -- Codemirror Editor  ----------- */
div.editor-border, div.CodeMirror-wrapping {
	border: 1px solid #163365;
	background-color: #ffffff;
}

/* User Notes */
div.unotes h1 {
	background-color: #ffffff;
}
ul.alternating > li:nth-child(odd) { background-color: #163365; }
ul.alternating > li:nth-child(even) { background-color: #10254a; }
ol.alternating > li:nth-child(odd) { background-color: #163365; }
ol.alternating > li:nth-child(even) { background-color: #10254a;}

/* Installer Database */
#installer-database, #installer-discover, #installer-update, #installer-warnings {
	border-top: 1px solid #1b3f7c;
}
#installer-database p.warning {
	background: transparent url(../images/admin/icon-16-deny.png) center left no-repeat;
}

#installer-database p.nowarning {
	background: transparent url(../images/admin/icon-16-allow.png) center left no-repeat;
}
templates/hathor/css/colour_blue.css000060400000133523152453623430013655 0ustar00.clearfix {
	*zoom: 1;
}
.clearfix:before,
.clearfix:after {
	display: table;
	content: "";
	line-height: 0;
}
.clearfix:after {
	clear: both;
}
.hide-text {
	font: 0/0 a;
	color: transparent;
	text-shadow: none;
	background-color: transparent;
	border: 0;
}
.input-block-level {
	display: block;
	width: 100%;
	min-height: 25px;
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
}
#form-login .btn {
	display: inline-block;
	*display: inline;
	*zoom: 1;
	padding: 4px 14px;
	margin-bottom: 0;
	font-size: 13px;
	line-height: 15px;
	*line-height: 15px;
	text-align: center;
	vertical-align: middle;
	cursor: pointer;
	color: #333333;
	text-shadow: 0 1px 1px rgba(255,255,255,0.75);
	background-color: #f5f5f5;
	background-image: -moz-linear-gradient(top,#ffffff,#e6e6e6);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#ffffff),to(#e6e6e6));
	background-image: -webkit-linear-gradient(top,#ffffff,#e6e6e6);
	background-image: -o-linear-gradient(top,#ffffff,#e6e6e6);
	background-image: linear-gradient(to bottom,#ffffff,#e6e6e6);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe5e5e5', GradientType=0);
	border-color: #e6e6e6 #e6e6e6 #bfbfbf;
	*background-color: #e6e6e6;
	filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
	border: 1px solid #bbb;
	*border: 0;
	border-bottom-color: #a2a2a2;
	-webkit-border-radius: 4px;
	-moz-border-radius: 4px;
	border-radius: 4px;
	*margin-left: .3em;
	-webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
	-moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
	box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
}
#form-login .btn:hover,
#form-login .btn:focus,
#form-login .btn:active,
#form-login .btn.active,
#form-login .btn.disabled,
#form-login .btn[disabled] {
	color: #333333;
	background-color: #e6e6e6;
	*background-color: #d9d9d9;
}
#form-login .btn:active,
#form-login .btn.active {
	background-color: #cccccc \9;
}
#form-login .btn:first-child {
	*margin-left: 0;
}
#form-login .btn:hover {
	color: #333333;
	text-decoration: none;
	background-color: #e6e6e6;
	*background-color: #d9d9d9;
	background-position: 0 -15px;
	-webkit-transition: background-position .1s linear;
	-moz-transition: background-position .1s linear;
	-o-transition: background-position .1s linear;
	transition: background-position .1s linear;
}
#form-login .btn:focus {
	outline: thin dotted #333;
	outline: 5px auto -webkit-focus-ring-color;
	outline-offset: -2px;
}
#form-login .btn.active,
#form-login .btn:active {
	background-color: #e6e6e6;
	background-color: #d9d9d9 \9;
	background-image: none;
	outline: 0;
	-webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
	-moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
	box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
}
#form-login .btn.disabled,
#form-login .btn[disabled] {
	cursor: default;
	background-color: #e6e6e6;
	background-image: none;
	opacity: 0.65;
	filter: alpha(opacity=65);
	-webkit-box-shadow: none;
	-moz-box-shadow: none;
	box-shadow: none;
}
.btn-large {
	padding: 9px 14px;
	font-size: 15px;
	line-height: normal;
	-webkit-border-radius: 5px;
	-moz-border-radius: 5px;
	border-radius: 5px;
}
.btn-large [class^="icon-"] {
	margin-top: 2px;
}
.input-append input[class*="span"],
.input-append .uneditable-input[class*="span"],
.input-prepend input[class*="span"],
.input-prepend .uneditable-input[class*="span"],
.row-fluid input[class*="span"],
.row-fluid select[class*="span"],
.row-fluid textarea[class*="span"],
.row-fluid .uneditable-input[class*="span"],
.row-fluid .input-prepend [class*="span"],
.row-fluid .input-append [class*="span"] {
	display: inline-block;
}
.input-append,
.input-prepend {
	margin-bottom: 5px;
	font-size: 0;
	white-space: nowrap;
}
.input-append input,
.input-append select,
.input-append .uneditable-input,
.input-prepend input,
.input-prepend select,
.input-prepend .uneditable-input {
	position: relative;
	margin-bottom: 0;
	*margin-left: 0;
	font-size: 13px;
	vertical-align: top;
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.input-append input:focus,
.input-append select:focus,
.input-append .uneditable-input:focus,
.input-prepend input:focus,
.input-prepend select:focus,
.input-prepend .uneditable-input:focus {
	z-index: 2;
}
.input-append .add-on,
.input-prepend .add-on {
	display: inline-block;
	width: auto;
	height: 15px;
	min-width: 16px;
	padding: 4px 5px;
	font-size: 13px;
	font-weight: normal;
	line-height: 15px;
	text-align: center;
	text-shadow: 0 1px 0 #ffffff;
	background-color: #eeeeee;
	border: 1px solid #ccc;
}
.input-append .add-on,
.input-append .btn,
.input-prepend .add-on,
.input-prepend .btn {
	margin-left: -1px;
	vertical-align: top;
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.input-append .active,
.input-prepend .active {
	background-color: #a9dba9;
	border-color: #46a546;
}
.input-prepend .add-on,
.input-prepend .btn {
	margin-right: -1px;
}
.input-prepend .add-on:first-child,
.input-prepend .btn:first-child {
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
}
.input-append input,
.input-append select,
.input-append .uneditable-input {
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
}
.input-append .add-on:last-child,
.input-append .btn:last-child {
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.input-prepend.input-append input,
.input-prepend.input-append select,
.input-prepend.input-append .uneditable-input {
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.input-prepend.input-append .add-on:first-child,
.input-prepend.input-append .btn:first-child {
	margin-right: -1px;
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
}
.input-prepend.input-append .add-on:last-child,
.input-prepend.input-append .btn:last-child {
	margin-left: -1px;
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.form-search .input-append .search-query,
.form-search .input-prepend .search-query {
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.form-search .input-append .search-query {
	-webkit-border-radius: 14px 0 0 14px;
	-moz-border-radius: 14px 0 0 14px;
	border-radius: 14px 0 0 14px;
}
.form-search .input-append .btn {
	-webkit-border-radius: 0 14px 14px 0;
	-moz-border-radius: 0 14px 14px 0;
	border-radius: 0 14px 14px 0;
}
.form-search .input-prepend .search-query {
	-webkit-border-radius: 0 14px 14px 0;
	-moz-border-radius: 0 14px 14px 0;
	border-radius: 0 14px 14px 0;
}
.form-search .input-prepend .btn {
	-webkit-border-radius: 14px 0 0 14px;
	-moz-border-radius: 14px 0 0 14px;
	border-radius: 14px 0 0 14px;
}
.form-search input,
.form-search textarea,
.form-search select,
.form-search .help-inline,
.form-search .uneditable-input,
.form-search .input-prepend,
.form-search .input-append,
.form-inline input,
.form-inline textarea,
.form-inline select,
.form-inline .help-inline,
.form-inline .uneditable-input,
.form-inline .input-prepend,
.form-inline .input-append,
.form-horizontal input,
.form-horizontal textarea,
.form-horizontal select,
.form-horizontal .help-inline,
.form-horizontal .uneditable-input,
.form-horizontal .input-prepend,
.form-horizontal .input-append {
	display: inline-block;
	*display: inline;
	*zoom: 1;
	margin-bottom: 0;
	vertical-align: middle;
}
.form-search .hide,
.form-inline .hide,
.form-horizontal .hide {
	display: none;
}
.form-search .input-append,
.form-inline .input-append,
.form-search .input-prepend,
.form-inline .input-prepend {
	margin-bottom: 0;
}
.element-invisible {
	position: absolute;
	padding: 0 !important;
	margin: 0 !important;
	border: 0;
	height: 1px;
	width: 1px !important;
	overflow: hidden;
}
#form-login select,
#form-login input[type="text"],
#form-login input[type="password"] {
	display: inline-block;
	padding: 4px 6px;
	margin-bottom: 9px;
	font-size: 13px;
	line-height: 15px;
	color: #555555;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
	width: 175px;
}
.subform-repeatable-wrapper div.btn-toolbar {
	float: none;
}
.subform-repeatable-wrapper .text-right {
	text-align: right;
}
.subform-repeatable-wrapper .ui-sortable-helper {
	background: #ffffff;
}
.subform-repeatable-wrapper tr.ui-sortable-helper {
	display: table;
}
.subform-repeatable-wrapper .subform-repeatable-group {
	clear: both;
}
.label,
.badge {
	display: inline-block;
	padding: 2px 4px;
	font-size: 10.998px;
	font-weight: bold;
	line-height: 14px;
	color: #ffffff;
	vertical-align: baseline;
	white-space: nowrap;
	text-shadow: 0 -1px 0 rgba(0,0,0,0.25);
	background-color: #999999;
}
.label {
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.badge {
	padding-left: 9px;
	padding-right: 9px;
	-webkit-border-radius: 9px;
	-moz-border-radius: 9px;
	border-radius: 9px;
}
.label:empty,
.badge:empty {
	display: none;
}
a.label:hover,
a.label:focus,
a.badge:hover,
a.badge:focus {
	color: #ffffff;
	text-decoration: none;
	cursor: pointer;
}
.label-important,
.badge-important {
	background-color: #a20000;
}
.label-important[href],
.badge-important[href] {
	background-color: #6f0000;
}
.label-warning,
.badge-warning {
	background-color: #f89406;
}
.label-warning[href],
.badge-warning[href] {
	background-color: #c67605;
}
.label-success,
.badge-success {
	background-color: #005800;
}
.label-success[href],
.badge-success[href] {
	background-color: #002500;
}
.label-info,
.badge-info {
	background-color: #3a87ad;
}
.label-info[href],
.badge-info[href] {
	background-color: #2d6987;
}
.label-inverse,
.badge-inverse {
	background-color: #333333;
}
.label-inverse[href],
.badge-inverse[href] {
	background-color: #1a1a1a;
}
.btn .label,
.btn .badge {
	position: relative;
	top: -1px;
}
.btn-mini .label,
.btn-mini .badge {
	top: 0;
}
body {
	background-color: #ffffff;
	color: #2c2c2c;
}
h1 {
	color: #2c2c2c;
}
a:link {
	color: #054993;
}
a:visited {
	color: #054993;
}
#header {
	background: #ffffff url(../images/j_logo.png) no-repeat;
}
#header h1.title {
	color: #2c2c2c;
}
#nav {
	background-color: #b1c4db;
	background-image: -moz-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#a5bbd4),to(#c3d2e5));
	background-image: -webkit-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -o-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: linear-gradient(to bottom,#a5bbd4,#c3d2e5);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa5bbd4', endColorstr='#ffc3d2e5', GradientType=0);
	border: 1px solid #738498;
}
#content {
	background: #ffffff;
}
#no-submenu {
	border-bottom: 1px solid #738498;
}
#element-box {
	background: #ffffff;
	border-right: 1px solid #738498;
	border-bottom: 1px solid #738498;
	border-left: 1px solid #738498;
}
#element-box.login {
	border-top: 1px solid #738498;
}
.enabled,
.success,
.allow,
span.writable {
	color: #005800;
}
.disabled,
p.error,
.warning,
.deny,
span.unwritable {
	color: #a20000;
}
.nowarning {
	color: #2c2c2c;
}
.none,
.protected {
	color: #738498;
}
span.note {
	background: #ffffff;
	color: #2c2c2c;
}
div.checkin-tick {
	background: url(../images/admin/tick.png) 20px 50% no-repeat;
}
.ol-foreground {
	background-color: #c3d2e5;
}
.ol-background {
	background-color: #005800;
}
.ol-textfont {
	color: #2c2c2c;
}
.ol-captionfont {
	color: #ffffff;
}
.ol-captionfont a {
	color: #054993;
}
div.subheader .padding {
	background: #ffffff;
}
.pagetitle h2 {
	color: #2c2c2c;
}
div.configuration {
	color: #2c2c2c;
	background-image: url(../images/menu/icon-16-config.png);
	background-repeat: no-repeat;
}
div.toolbar-box {
	border-right: 1px solid #738498;
	border-bottom: 1px solid #738498;
	border-left: 1px solid #738498;
	background: #ffffff;
}
div.toolbar-list li {
	color: #2c2c2c;
}
div.toolbar-list li.divider {
	border-right: 1px dotted #e5d9c3;
}
div.toolbar-list a {
	border-left: 1px solid #e5d9c3;
	border-top: 1px solid #e5d9c3;
	border-right: 1px solid #738498;
	border-bottom: 1px solid #738498;
	background: #c3d2e5;
}
div.toolbar-list a:hover {
	border-left: 1px solid #868778;
	border-top: 1px solid #868778;
	border-right: 1px solid #f6f7db;
	border-bottom: 1px solid #f6f7db;
	background: #e5d9c3;
	color: #054993;
}
div.btn-toolbar {
	margin-left: 5px;
	padding-top: 3px;
}
div.btn-toolbar li.divider {
	border-right: 1px dotted #e5d9c3;
}
div.btn-toolbar div.btn-group button {
	border-left: 1px solid #e5d9c3;
	border-top: 1px solid #e5d9c3;
	border-right: 1px solid #738498;
	border-bottom: 1px solid #738498;
	background-color: #b1c4db;
	background-image: -moz-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#a5bbd4),to(#c3d2e5));
	background-image: -webkit-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -o-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: linear-gradient(to bottom,#a5bbd4,#c3d2e5);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa5bbd4', endColorstr='#ffc3d2e5', GradientType=0);
	padding: 5px 4px 5px 4px;
}
div.btn-toolbar div.btn-group button:hover {
	border-left: 1px solid #868778;
	border-top: 1px solid #868778;
	border-right: 1px solid #f6f7db;
	border-bottom: 1px solid #f6f7db;
	background: #e5d9c3;
	color: #054993;
	cursor: pointer;
}
div.btn-toolbar a {
	border-left: 1px solid #e5d9c3;
	border-top: 1px solid #e5d9c3;
	border-right: 1px solid #738498;
	border-bottom: 1px solid #738498;
	background-color: #b1c4db;
	background-image: -moz-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#a5bbd4),to(#c3d2e5));
	background-image: -webkit-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -o-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: linear-gradient(to bottom,#a5bbd4,#c3d2e5);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa5bbd4', endColorstr='#ffc3d2e5', GradientType=0);
	padding: 6px 5px;
	text-align: center;
	white-space: nowrap;
	font-size: 1.2em;
	text-decoration: none;
}
div.btn-toolbar a:hover {
	border-left: 1px solid #868778;
	border-top: 1px solid #868778;
	border-right: 1px solid #f6f7db;
	border-bottom: 1px solid #f6f7db;
	background: #e5d9c3;
	color: #054993;
	cursor: pointer;
}
div.btn-toolbar div.btn-group button.inactive {
	background: #c3d2e5;
}
.pane-sliders .title {
	color: #2c2c2c;
}
.pane-sliders .panel {
	border: 1px solid #738498;
}
.pane-sliders .panel h3 {
	background-color: #b1c4db;
	background-image: -moz-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#a5bbd4),to(#c3d2e5));
	background-image: -webkit-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -o-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: linear-gradient(to bottom,#a5bbd4,#c3d2e5);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa5bbd4', endColorstr='#ffc3d2e5', GradientType=0);
	color: #054993;
}
.pane-sliders .panel h3:hover {
	background: #e5d9c3;
}
.pane-sliders .panel h3:hover a {
	text-decoration: none;
}
.pane-sliders .adminlist {
	border: 0 none;
}
.pane-sliders .adminlist td {
	border: 0 none;
}
.pane-toggler span {
	background: transparent url(../images/j_arrow.png) 5px 50% no-repeat;
}
.pane-toggler-down span {
	background: transparent url(../images/j_arrow_down.png) 5px 50% no-repeat;
}
.pane-toggler-down {
	border-bottom: 1px solid #738498;
}
dl.tabs dt {
	border: 1px solid #738498;
	background-color: #b1c4db;
	background-image: -moz-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#a5bbd4),to(#c3d2e5));
	background-image: -webkit-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -o-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: linear-gradient(to bottom,#a5bbd4,#c3d2e5);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa5bbd4', endColorstr='#ffc3d2e5', GradientType=0);
	color: #054993;
}
dl.tabs dt:hover {
	background: #e5d9c3;
}
dl.tabs dt.open {
	background: #ffffff;
	border-bottom: 1px solid #ffffff;
	color: #2c2c2c;
}
dl.tabs dt.open a:visited {
	color: #2c2c2c;
}
dl.tabs dt a:hover {
	text-decoration: none;
}
dl.tabs dt a:focus {
	text-decoration: underline;
}
div.current {
	border: 1px solid #738498;
	background: #ffffff;
}
div.current fieldset {
	border: none 0;
}
div.current fieldset.adminform {
	border: 1px solid #738498;
}
#login-page .pagetitle h2 {
	background: transparent;
}
#login-page #header {
	border-bottom: 1px solid #738498;
}
#login-page #lock {
	background: url(../images/j_login_lock.png) 50% 0 no-repeat;
}
#login-page #element-box.login {
	background-color: #b1c4db;
	background-image: -moz-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#a5bbd4),to(#c3d2e5));
	background-image: -webkit-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -o-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: linear-gradient(to bottom,#a5bbd4,#c3d2e5);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa5bbd4', endColorstr='#ffc3d2e5', GradientType=0);
}
#form-login {
	background: #ffffff;
	border: 1px solid #738498;
}
#form-login label {
	color: #2c2c2c;
}
#form-login div.button1 a {
	color: #054993;
}
#cpanel div.icon a,
.cpanel div.icon a {
	color: #054993;
	border-left: 1px solid #e5d9c3;
	border-top: 1px solid #e5d9c3;
	border-right: 1px solid #738498;
	border-bottom: 1px solid #738498;
	background-color: #b1c4db;
	background-image: -moz-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#a5bbd4),to(#c3d2e5));
	background-image: -webkit-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -o-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: linear-gradient(to bottom,#a5bbd4,#c3d2e5);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa5bbd4', endColorstr='#ffc3d2e5', GradientType=0);
}
#cpanel div.icon a:hover,
#cpanel div.icon a:focus,
.cpanel div.icon a:hover,
.cpanel div.icon a:focus {
	border-left: 1px solid #868778;
	border-top: 1px solid #868778;
	border-right: 1px solid #f6f7db;
	border-bottom: 1px solid #f6f7db;
	color: #054993;
	background: #e5d9c3;
}
fieldset {
	border: 1px #738498 solid;
}
legend {
	color: #2c2c2c;
}
fieldset ul.checklist input:focus {
	outline: thin dotted #2c2c2c;
}
fieldset#filter-bar {
	border-top: 0 solid #738498;
	border-right: 0 solid #738498;
	border-bottom: 1px solid #738498;
	border-left: 0 solid #738498;
}
fieldset#filter-bar ol,
fieldset#filter-bar ul {
	border: 0;
}
fieldset#filter-bar ol li fieldset,
fieldset#filter-bar ul li fieldset {
	border: 0;
}
.invalid {
	color: #a20000;
}
input.invalid {
	border: 1px solid #a20000;
}
input.readonly,
span.faux-input {
	border: 0;
}
input.required {
	background-color: #e5f0fa;
}
input.disabled {
	background-color: #eeeeee;
}
input,
select,
span.faux-input {
	background-color: #ffffff;
	border: 1px solid #738498;
}
input[type="button"],
input[type="submit"],
input[type="reset"] {
	color: #054993;
	background-color: #b1c4db;
	background-image: -moz-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#a5bbd4),to(#c3d2e5));
	background-image: -webkit-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -o-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: linear-gradient(to bottom,#a5bbd4,#c3d2e5);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa5bbd4', endColorstr='#ffc3d2e5', GradientType=0);
}
input[type="button"]:hover,
input[type="button"]:focus,
input[type="submit"]:hover,
input[type="submit"]:focus,
input[type="reset"]:hover,
input[type="reset"]:focus {
	background: #e5d9c3;
}
textarea {
	background-color: #ffffff;
	border: 1px solid #738498;
}
input:focus,
select:focus,
textarea:focus,
option:focus,
input:hover,
select:hover,
textarea:hover,
option:hover {
	background-color: #e5d9c3;
	color: #054993;
}
.paramrules {
	background: #c3d2e5;
}
span.gi {
	color: #738498;
}
table.admintable td.key,
table.admintable td.paramlist_key {
	background-color: #c3d2e5;
	color: #2c2c2c;
	border-bottom: 1px solid #738498;
	border-right: 1px solid #738498;
}
table.paramlist td.paramlist_description {
	background-color: #c3d2e5;
	color: #2c2c2c;
	border-bottom: 1px solid #738498;
	border-right: 1px solid #738498;
}
fieldset.adminform {
	border: 1px solid #738498;
}
table.adminform {
	background-color: #ffffff;
}
table.adminform tr.row0 {
	background-color: #ffffff;
}
table.adminform tr.row1 {
	background-color: #e5d9c3;
}
table.adminform th {
	color: #2c2c2c;
	background: #ffffff;
}
table.adminform tr {
	border-bottom: 1px solid #738498;
	border-right: 1px solid #738498;
}
table.adminlist {
	border-spacing: 1px;
	background-color: #ffffff;
	color: #2c2c2c;
}
table.adminlist.modal {
	border-top: 1px solid #738498;
	border-right: 1px solid #738498;
	border-left: 1px solid #738498;
}
table.adminlist a {
	color: #054993;
}
table.adminlist thead th {
	background: #ffffff;
	color: #2c2c2c;
	border-bottom: 1px solid #738498;
}
table.adminlist tbody tr {
	background: #ffffff;
}
table.adminlist tbody tr.row1 {
	background: #ffffff;
}
table.adminlist tbody tr.row1:last-child td,
table.adminlist tbody tr.row1:last-child th {
	border-bottom: 1px solid #738498;
}
table.adminlist tbody tr.row0:hover td,
table.adminlist tbody tr.row1:hover td,
table.adminlist tbody tr.row0:hover th,
table.adminlist tbody tr.row1:hover th,
table.adminlist tbody tr.row0:focus td,
table.adminlist tbody tr.row1:focus td,
table.adminlist tbody tr.row0:focus th,
table.adminlist tbody tr.row1:focus th {
	background-color: #e5d9c3;
}
table.adminlist tbody tr td,
table.adminlist tbody tr th {
	border-right: 1px solid #738498;
}
table.adminlist tbody tr td:last-child {
	border-right: none;
}
table.adminlist tbody tr.row0:last-child td,
table.adminlist tbody tr.row0:last-child th {
	border-bottom: 1px solid #738498;
}
table.adminlist tbody tr.row0 td,
table.adminlist tbody tr.row0 th {
	background-color: #b1c4db;
	background-image: -moz-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#a5bbd4),to(#c3d2e5));
	background-image: -webkit-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -o-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: linear-gradient(to bottom,#a5bbd4,#c3d2e5);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa5bbd4', endColorstr='#ffc3d2e5', GradientType=0);
}
table.adminlist {
	border-bottom: 0 solid #738498;
}
table.adminlist tfoot tr {
	color: #2c2c2c;
}
table.adminlist tfoot td,
table.adminlist tfoot th {
	background-color: #ffffff;
	border-top: 1px solid #738498;
}
table.adminlist tr td.btns a {
	border: 1px solid #738498;
	background-color: #b1c4db;
	background-image: -moz-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#a5bbd4),to(#c3d2e5));
	background-image: -webkit-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -o-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: linear-gradient(to bottom,#a5bbd4,#c3d2e5);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa5bbd4', endColorstr='#ffc3d2e5', GradientType=0);
	color: #054993;
}
table.adminlist tr td.btns a:hover,
table.adminlist tr td.btns a:active,
table.adminlist tr td.btns a:focus {
	background-color: #ffffff;
}
a.saveorder {
	background: url(../images/admin/filesave.png) no-repeat;
}
a.saveorder.inactive {
	background-position: 0 -16px;
}
fieldset.batch {
	background: #ffffff;
}
button {
	color: #054993;
	border: 1px solid #738498;
	background-color: #b1c4db;
	background-image: -moz-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#a5bbd4),to(#c3d2e5));
	background-image: -webkit-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -o-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: linear-gradient(to bottom,#a5bbd4,#c3d2e5);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa5bbd4', endColorstr='#ffc3d2e5', GradientType=0);
}
button:hover,
button:focus {
	background: #e5d9c3;
}
.invalid {
	color: #ff0000;
}
.button1 {
	border: 1px solid #738498;
	color: #054993;
	background-color: #b1c4db;
	background-image: -moz-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#a5bbd4),to(#c3d2e5));
	background-image: -webkit-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -o-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: linear-gradient(to bottom,#a5bbd4,#c3d2e5);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa5bbd4', endColorstr='#ffc3d2e5', GradientType=0);
}
.button1 a {
	color: #054993;
}
.button1 a:hover,
.button1 a:focus {
	background: #e5d9c3;
}
.button2-left,
.button2-right {
	border: 1px solid #738498;
	background-color: #b1c4db;
	background-image: -moz-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#a5bbd4),to(#c3d2e5));
	background-image: -webkit-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -o-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: linear-gradient(to bottom,#a5bbd4,#c3d2e5);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa5bbd4', endColorstr='#ffc3d2e5', GradientType=0);
}
.button2-left a,
.button2-right a,
.button2-left span,
.button2-right span {
	color: #054993;
}
.button2-left span,
.button2-right span {
	color: #999999;
}
.page span,
.blank span {
	color: #054993;
}
.button2-left a:hover,
.button2-right a:hover,
.button2-left a:focus,
.button2-right a:focus {
	background: #e5d9c3;
}
.pagination .page span {
	color: #999999;
}
.tip {
	background: #000000;
	border: 1px solid #FFFFFF;
}
.tip-title {
	background: url(../images/selector-arrow-std.png) no-repeat;
}
a img.calendar {
	background: url(../images/calendar.png) no-repeat;
}
.jgrid span.publish {
	background-image: url(../images/admin/tick.png);
}
.jgrid span.unpublish {
	background-image: url(../images/admin/publish_x.png);
}
.jgrid span.archive {
	background-image: url(../images/menu/icon-16-archive.png);
}
.jgrid span.trash {
	background-image: url(../images/menu/icon-16-trash.png);
}
.jgrid span.default {
	background-image: url(../images/menu/icon-16-default.png);
}
.jgrid span.notdefault {
	background-image: url(../images/menu/icon-16-notdefault.png);
}
.jgrid span.checkedout {
	background-image: url(../images/admin/checked_out.png);
}
.jgrid span.downarrow {
	background-image: url(../images/admin/downarrow.png);
}
.jgrid span.downarrow_disabled {
	background-image: url(../images/admin/downarrow0.png);
}
.jgrid span.uparrow {
	background-image: url(../images/admin/uparrow.png);
}
.jgrid span.uparrow_disabled {
	background-image: url(../images/admin/uparrow0.png);
}
.jgrid span.published {
	background-image: url(../images/admin/publish_g.png);
}
.jgrid span.expired {
	background-image: url(../images/admin/publish_r.png);
}
.jgrid span.pending {
	background-image: url(../images/admin/publish_y.png);
}
.jgrid span.warning {
	background-image: url(../images/admin/publish_y.png);
}
.icon-32-send {
	background-image: url(../images/toolbar/icon-32-send.png);
}
.icon-32-delete {
	background-image: url(../images/toolbar/icon-32-delete.png);
}
.icon-32-help {
	background-image: url(../images/toolbar/icon-32-help.png);
}
.icon-32-cancel {
	background-image: url(../images/toolbar/icon-32-cancel.png);
}
.icon-32-checkin {
	background-image: url(../images/toolbar/icon-32-checkin.png);
}
.icon-32-options {
	background-image: url(../images/toolbar/icon-32-config.png);
}
.icon-32-apply {
	background-image: url(../images/toolbar/icon-32-apply.png);
}
.icon-32-back {
	background-image: url(../images/toolbar/icon-32-back.png);
}
.icon-32-forward {
	background-image: url(../images/toolbar/icon-32-forward.png);
}
.icon-32-save {
	background-image: url(../images/toolbar/icon-32-save.png);
}
.icon-32-edit {
	background-image: url(../images/toolbar/icon-32-edit.png);
}
.icon-32-copy {
	background-image: url(../images/toolbar/icon-32-copy.png);
}
.icon-32-move {
	background-image: url(../images/toolbar/icon-32-move.png);
}
.icon-32-new {
	background-image: url(../images/toolbar/icon-32-new.png);
}
.icon-32-upload {
	background-image: url(../images/toolbar/icon-32-upload.png);
}
.icon-32-assign {
	background-image: url(../images/toolbar/icon-32-publish.png);
}
.icon-32-html {
	background-image: url(../images/toolbar/icon-32-html.png);
}
.icon-32-css {
	background-image: url(../images/toolbar/icon-32-css.png);
}
.icon-32-menus {
	background-image: url(../images/toolbar/icon-32-menu.png);
}
.icon-32-publish {
	background-image: url(../images/toolbar/icon-32-publish.png);
}
.icon-32-unblock {
	background-image: url(../images/toolbar/icon-32-unblock.png);
}
.icon-32-unpublish {
	background-image: url(../images/toolbar/icon-32-unpublish.png);
}
.icon-32-restore {
	background-image: url(../images/toolbar/icon-32-revert.png);
}
.icon-32-trash {
	background-image: url(../images/toolbar/icon-32-trash.png);
}
.icon-32-archive {
	background-image: url(../images/toolbar/icon-32-archive.png);
}
.icon-32-unarchive {
	background-image: url(../images/toolbar/icon-32-unarchive.png);
}
.icon-32-preview {
	background-image: url(../images/toolbar/icon-32-preview.png);
}
.icon-32-default {
	background-image: url(../images/toolbar/icon-32-default.png);
}
.icon-32-refresh {
	background-image: url(../images/toolbar/icon-32-refresh.png);
}
.icon-32-save-new {
	background-image: url(../images/toolbar/icon-32-save-new.png);
}
.icon-32-save-copy {
	background-image: url(../images/toolbar/icon-32-save-copy.png);
}
.icon-32-error {
	background-image: url(../images/toolbar/icon-32-error.png);
}
.icon-32-new-style {
	background-image: url(../images/toolbar/icon-32-new-style.png);
}
.icon-32-delete-style {
	background-image: url(../images/toolbar/icon-32-delete-style.png);
}
.icon-32-purge {
	background-image: url(../images/toolbar/icon-32-purge.png);
}
.icon-32-remove {
	background-image: url(../images/toolbar/icon-32-remove.png);
}
.icon-32-featured {
	background-image: url(../images/toolbar/icon-32-featured.png);
}
.icon-32-unfeatured {
	background-image: url(../images/toolbar/icon-32-featured.png);
	background-position: 0% 100%;
}
.icon-32-export {
	background-image: url(../images/toolbar/icon-32-export.png);
}
.icon-32-stats {
	background-image: url(../images/toolbar/icon-32-stats.png);
}
.icon-32-print {
	background-image: url(../images/toolbar/icon-32-print.png);
}
.icon-32-batch {
	background-image: url(../images/toolbar/icon-32-batch.png);
}
.icon-32-envelope {
	background-image: url(../images/toolbar/icon-32-messaging.png);
}
.icon-32-download {
	background-image: url(../images/toolbar/icon-32-export.png);
}
.icon-32-bars {
	background-image: url(../images/toolbar/icon-32-stats.png);
}
.icon-48-categories {
	background-image: url(../images/header/icon-48-category.png);
}
.icon-48-category-edit {
	background-image: url(../images/header/icon-48-category.png);
}
.icon-48-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-generic {
	background-image: url(../images/header/icon-48-generic.png);
}
.icon-48-banners {
	background-image: url(../images/header/icon-48-banner.png);
}
.icon-48-banners-categories {
	background-image: url(../images/header/icon-48-banner-categories.png);
}
.icon-48-banners-category-edit {
	background-image: url(../images/header/icon-48-banner-categories.png);
}
.icon-48-banners-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-banners-clients {
	background-image: url(../images/header/icon-48-banner-client.png);
}
.icon-48-banners-tracks {
	background-image: url(../images/header/icon-48-banner-tracks.png);
}
.icon-48-checkin {
	background-image: url(../images/header/icon-48-checkin.png);
}
.icon-48-clear {
	background-image: url(../images/header/icon-48-clear.png);
}
.icon-48-contact {
	background-image: url(../images/header/icon-48-contacts.png);
}
.icon-48-contact-categories {
	background-image: url(../images/header/icon-48-contacts-categories.png);
}
.icon-48-contact-category-edit {
	background-image: url(../images/header/icon-48-contacts-categories.png);
}
.icon-48-contact-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-purge {
	background-image: url(../images/header/icon-48-purge.png);
}
.icon-48-cpanel {
	background-image: url(../images/header/icon-48-cpanel.png);
}
.icon-48-config {
	background-image: url(../images/header/icon-48-config.png);
}
.icon-48-groups {
	background-image: url(../images/header/icon-48-groups.png);
}
.icon-48-groups-add {
	background-image: url(../images/header/icon-48-groups-add.png);
}
.icon-48-levels {
	background-image: url(../images/header/icon-48-levels.png);
}
.icon-48-levels-add {
	background-image: url(../images/header/icon-48-levels-add.png);
}
.icon-48-module {
	background-image: url(../images/header/icon-48-module.png);
}
.icon-48-menu {
	background-image: url(../images/header/icon-48-menu.png);
}
.icon-48-menu-add {
	background-image: url(../images/header/icon-48-menu-add.png);
}
.icon-48-menumgr {
	background-image: url(../images/header/icon-48-menumgr.png);
}
.icon-48-trash {
	background-image: url(../images/header/icon-48-trash.png);
}
.icon-48-user {
	background-image: url(../images/header/icon-48-user.png);
}
.icon-48-user-add {
	background-image: url(../images/header/icon-48-user-add.png);
}
.icon-48-user-edit {
	background-image: url(../images/header/icon-48-user-edit.png);
}
.icon-48-user-profile {
	background-image: url(../images/header/icon-48-user-profile.png);
}
.icon-48-inbox {
	background-image: url(../images/header/icon-48-inbox.png);
}
.icon-48-new-privatemessage {
	background-image: url(../images/header/icon-48-new-privatemessage.png);
}
.icon-48-msgconfig {
	background-image: url(../images/header/icon-48-message_config.png);
}
.icon-48-langmanager {
	background-image: url(../images/header/icon-48-language.png);
}
.icon-48-mediamanager {
	background-image: url(../images/header/icon-48-media.png);
}
.icon-48-plugin {
	background-image: url(../images/header/icon-48-plugin.png);
}
.icon-48-help_header {
	background-image: url(../images/header/icon-48-help_header.png);
}
.icon-48-impressions {
	background-image: url(../images/header/icon-48-stats.png);
}
.icon-48-browser {
	background-image: url(../images/header/icon-48-stats.png);
}
.icon-48-searchtext {
	background-image: url(../images/header/icon-48-stats.png);
}
.icon-48-thememanager {
	background-image: url(../images/header/icon-48-themes.png);
}
.icon-48-writemess {
	background-image: url(../images/header/icon-48-writemess.png);
}
.icon-48-featured {
	background-image: url(../images/header/icon-48-featured.png);
}
.icon-48-sections {
	background-image: url(../images/header/icon-48-section.png);
}
.icon-48-article-add {
	background-image: url(../images/header/icon-48-article-add.png);
}
.icon-48-article-edit {
	background-image: url(../images/header/icon-48-article-edit.png);
}
.icon-48-article {
	background-image: url(../images/header/icon-48-article.png);
}
.icon-48-content-categories {
	background-image: url(../images/header/icon-48-category.png);
}
.icon-48-content-category-edit {
	background-image: url(../images/header/icon-48-category.png);
}
.icon-48-content-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-install {
	background-image: url(../images/header/icon-48-extension.png);
}
.icon-48-dbbackup {
	background-image: url(../images/header/icon-48-backup.png);
}
.icon-48-dbrestore {
	background-image: url(../images/header/icon-48-dbrestore.png);
}
.icon-48-dbquery {
	background-image: url(../images/header/icon-48-query.png);
}
.icon-48-systeminfo {
	background-image: url(../images/header/icon-48-info.png);
}
.icon-48-massmail {
	background-image: url(../images/header/icon-48-massmail.png);
}
.icon-48-redirect {
	background-image: url(../images/header/icon-48-redirect.png);
}
.icon-48-search {
	background-image: url(../images/header/icon-48-search.png);
}
.icon-48-finder {
	background-image: url(../images/header/icon-48-search.png);
}
.icon-48-newsfeeds {
	background-image: url(../images/header/icon-48-newsfeeds.png);
}
.icon-48-newsfeeds-categories {
	background-image: url(../images/header/icon-48-newsfeeds-cat.png);
}
.icon-48-newsfeeds-category-edit {
	background-image: url(../images/header/icon-48-newsfeeds-cat.png);
}
.icon-48-newsfeeds-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-weblinks {
	background-image: url(../images/header/icon-48-links.png);
}
.icon-48-weblinks-categories {
	background-image: url(../images/header/icon-48-links-cat.png);
}
.icon-48-weblinks-category-edit {
	background-image: url(../images/header/icon-48-links-cat.png);
}
.icon-48-weblinks-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-tags {
	background-image: url(../images/header/icon-48-tags.png);
}
.icon-48-assoc {
	background-image: url(../images/header/icon-48-assoc.png);
}
.icon-48-puzzle {
	background-image: url(../images/header/icon-48-puzzle.png);
}
div.message {
	border: 1px solid #738498;
	color: #2c2c2c;
}
.helpFrame {
	border-left: 0 solid #738498;
	border-right: none;
	border-top: none;
	border-bottom: none;
}
.outline {
	border: 1px solid #738498;
	background: #ffffff;
}
dl.menu_type dt {
	border-bottom: 1px solid #738498;
}
ul#new-modules-list {
	border-top: 1px solid #738498;
}
#skiplinkholder a,
#skiplinkholder a:link,
#skiplinkholder a:visited {
	color: #ffffff;
	background: #054993;
	border-bottom: solid #336 2px;
}
fieldset.panelform {
	border: none 0;
}
a.move_up {
	background-image: url('../images/admin/uparrow.png');
}
span.move_up {
	background-image: url('../images/admin/uparrow0.png');
}
a.move_down {
	background-image: url('../images/admin/downarrow.png');
}
span.move_down {
	background-image: url('../images/admin/downarrow0.png');
}
a.grid_false {
	background-image: url('../images/admin/publish_x.png');
}
a.grid_true {
	background-image: url('../images/admin/tick.png');
}
a.grid_trash {
	background-image: url('../images/admin/icon-16-trash.png');
}
tr.row1 {
	background-color: #c3d2e5;
}
table.aclsummary-table td.col2,
table.aclsummary-table th.col2,
table.aclsummary-table td.col3,
table.aclsummary-table th.col3,
table.aclsummary-table td.col4,
table.aclsummary-table th.col4,
table.aclsummary-table td.col5,
table.aclsummary-table th.col5,
table.aclsummary-table td.col6,
table.aclsummary-table th.col6,
table.aclmodify-table td.col2,
table.aclmodify-table th.col2 {
	border-left: 1px solid #738498;
}
span.icon-16-unset {
	background: url(../images/admin/icon-16-denyinactive.png) no-repeat;
}
span.icon-16-allowed {
	background: url(../images/admin/icon-16-allow.png) no-repeat;
}
span.icon-16-denied {
	background: url(../images/admin/icon-16-deny.png) no-repeat;
}
span.icon-16-locked {
	background: url(../images/admin/checked_out.png) 0 0 no-repeat;
}
label.icon-16-allow {
	background: url(../images/admin/icon-16-allow.png) no-repeat;
}
label.icon-16-deny {
	background: url(../images/admin/icon-16-deny.png) no-repeat;
}
a.icon-16-allow {
	background: url(../images/admin/icon-16-allow.png) no-repeat;
}
a.icon-16-deny {
	background: url(../images/admin/icon-16-deny.png) no-repeat;
}
a.icon-16-allowinactive {
	background: url(../images/admin/icon-16-allowinactive.png) no-repeat;
}
a.icon-16-denyinactive {
	background: url(../images/admin/icon-16-denyinactive.png) no-repeat;
}
ul.acllegend li.acl-allowed {
	background: url(../images/admin/icon-16-allow.png) no-repeat left;
}
ul.acllegend li.acl-denied {
	background: url(../images/admin/icon-16-deny.png) no-repeat left;
}
li.acl-editgroups,
li.acl-resetbtn {
	background-color: #c3d2e5;
	border: 1px solid #738498;
}
li.acl-editgroups a,
li.acl-resetbtn a {
	color: #054993;
}
li.acl-editgroups:hover,
li.acl-resetbtn:hover,
li.acl-editgroups:focus,
li.acl-resetbtn:focus {
	background-color: #e5d9c3;
}
table#acl-config {
	border: 1px solid #738498;
}
table#acl-config th,
table#acl-config td {
	background: #c3d2e5;
	border-bottom: 1px solid #738498;
}
table#acl-config th.acl-groups {
	border-right: 1px solid #738498;
}
#jform_sef_rewrite-lbl {
	background: url(../images/admin/icon-16-notice-note.png) right top no-repeat;
}
#permissions-sliders .tip {
	background: #ffffff;
	border: 1px solid #738498;
}
#permissions-sliders ul#rules,
#permissions-sliders ul#rules ul {
	border: solid 0 #738498;
	background: #ffffff;
}
ul#rules li .pane-sliders .panel h3.title {
	border: solid 0 #738498;
}
#permissions-sliders ul#rules .pane-slider {
	border: solid 1px #738498;
}
#permissions-sliders ul#rules li h3 {
	border: solid 1px #738498;
}
#permissions-sliders ul#rules li h3.pane-toggler-down a {
	border: solid 0;
}
#permissions-sliders ul#rules .group-kind {
	color: #2c2c2c;
}
#permissions-sliders ul#rules table.group-rules {
	border: solid 1px #738498;
}
#permissions-sliders ul#rules table.group-rules td {
	border-right: solid 1px #738498;
	border-bottom: solid 1px #738498;
}
#permissions-sliders ul#rules table.group-rules th {
	background: #e5d9c3;
	border-right: solid 1px #738498;
	border-bottom: solid 1px #738498;
	color: #2c2c2c;
}
ul#rules table.aclmodify-table {
	border: solid 1px #738498;
}
ul#rules table.group-rules td label {
	border: solid 0 #738498;
}
#permissions-sliders ul#rules .mypanel {
	border: solid 0 #738498;
}
#permissions-sliders  ul#rules  table.group-rules td {
	background: #ffffff;
}
#permissions-sliders span.level {
	color: #738498;
	background-image: none;
}
.check-0,
table.adminlist tbody td.check-0 {
	background-color: #ffffcf;
}
.check-a,
table.adminlist tbody td.check-a {
	background-color: #cfffda;
}
.check-d,
table.adminlist tbody td.check-d {
	background-color: #ffcfcf;
}
#system-message dd ul {
	color: #2c2c2c;
}
#system-message dd.error ul {
	color: #2c2c2c;
}
#system-message dd.message ul {
	color: #2c2c2c;
}
#system-message dd.notice ul {
	color: #2c2c2c;
}
#menu {
	color: #2c2c2c;
}
#menu ul.dropdown-menu {
	background-color: #b1c4db;
	background-image: -moz-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#a5bbd4),to(#c3d2e5));
	background-image: -webkit-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -o-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: linear-gradient(to bottom,#a5bbd4,#c3d2e5);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa5bbd4', endColorstr='#ffc3d2e5', GradientType=0);
	color: #2c2c2c;
}
#menu ul.dropdown-menu li.dropdown-submenu {
	background: url(../images/j_arrow.png) no-repeat right 50%;
}
#menu ul.dropdown-menu li.divider {
	margin-bottom: 0;
	border-bottom: 1px dotted #738498;
}
#menu a {
	color: #054993;
	background-repeat: no-repeat;
	background-position: left 50%;
}
#menu li {
	border-right: 1px solid #738498;
	background-color: transparent;
}
#menu li a:hover,
#menu li a:focus {
	background-color: #e5d9c3;
}
#menu li.disabled a:hover,
#menu li.disabled a:focus,
#menu li.disabled a {
	color: #738498;
	background-color: #b1c4db;
	background-image: -moz-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#a5bbd4),to(#c3d2e5));
	background-image: -webkit-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -o-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: linear-gradient(to bottom,#a5bbd4,#c3d2e5);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa5bbd4', endColorstr='#ffc3d2e5', GradientType=0);
}
#menu li ul {
	border: 1px solid #738498;
}
#menu li li {
	background-color: transparent;
}
#menu li.sfhover a {
	background-color: #e5d9c3;
}
#menu li.sfhover li a {
	background-color: transparent;
}
#menu li.sfhover li.sfhover a,
#menu li li a:focus {
	background-color: #e5d9c3;
}
#menu li.sfhover li.sfhover li a {
	background-color: transparent;
}
#menu li.sfhover li.sfhover li.sfhover a,
#menu li li li a:focus {
	background-color: #e5d9c3;
}
#menu li li a:focus,
#menu li li li a:focus {
	background-color: #e5d9c3;
}
#menu li li li a:focus {
	background-color: #e5d9c3;
}
#submenu {
	border-bottom: 1px solid #738498;
}
#submenu li,
#submenu span.nolink {
	background-color: #b1c4db;
	background-image: -moz-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#a5bbd4),to(#c3d2e5));
	background-image: -webkit-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: -o-linear-gradient(top,#a5bbd4,#c3d2e5);
	background-image: linear-gradient(to bottom,#a5bbd4,#c3d2e5);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffa5bbd4', endColorstr='#ffc3d2e5', GradientType=0);
	border: 1px solid #738498;
	color: #054993;
}
#submenu li:hover,
#submenu li:focus {
	background: #e5d9c3;
}
#submenu li.active,
#submenu span.nolink.active {
	background: #ffffff;
	border-bottom: 1px solid #ffffff;
}
#submenu li.active a,
#submenu span.nolink.active {
	color: #000;
}
.element-invisible {
	margin: 0;
	padding: 0;
}
div.CodeMirror-wrapping {
	border: 1px solid #738498;
}
table.adminform tr.row0 {
	background-color: #ffffff;
}
ul.alternating > li:nth-child(odd) {
	background-color: #ffffff;
}
ul.alternating > li:nth-child(even) {
	background-color: #c3d2e5;
}
ol.alternating > li:nth-child(odd) {
	background-color: #ffffff;
}
ol.alternating > li:nth-child(even) {
	background-color: #c3d2e5;
}
#installer-database,
#installer-discover,
#installer-update,
#installer-warnings {
	border-top: 1px solid #738498;
}
#installer-database p.warning {
	background: transparent url(../images/admin/icon-16-deny.png) center left no-repeat;
}
#installer-database p.nowarning {
	background: transparent url(../images/admin/icon-16-allow.png) center left no-repeat;
}
.input-append,
.input-prepend {
	font-size: 1.2em;
}
templates/hathor/css/template_rtl.css000060400000050762152453623430014042 0ustar00@charset "UTF-8";

/**
 * @package		Joomla.Administrator
 * @subpackage	templates.hathor
 * @copyright	(C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @since		1.6
 *
 * RTL CSS file for the template
 */

body {
	direction: rtl;
}

h1, h2, h3 {
	text-align: right;
}

/**
 * CSS Reset
 */

html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
	background-position: transparent none repeat scroll top right;
}

/* new styles */



/* end new styles */

/**
 * Overall Styles
 */
#header h1.title {
	padding: 0 120px 0 0;
}

#footer {
	padding: 10px 20px;
}

#content {
	margin: 5px 20px 20px 20px;
}

.cpanel-page div#element-box {
	padding: 15px;
}

/**
 * Status layout
 */
#module-status {
	left: 0;
	right: none;
	float: left;
}

#module-status > span {
	float: right;
	padding: 4px 22px 0 20px;
}

/* background images moved to color css file */

/**
 * Various Styles
 */

div.checkin-tick {
	text-indent: -9999px;
}

/**
 * Overlib
 */

/**
 * Subheader, toolbar, page title
 */

div.pagetitle {
	padding: 0 0 5px 0;
	background-position: right 50%;
	line-height: 54px;
}

.pagetitle h2 {
	padding: 0 50px 0 0;
}

div.configuration {
	padding-right: 30px;
	margin-right: 10px;
}

div.toolbar-list {
	float: right;
	text-align: left;
}

div.toolbar-list li {
	padding: 5px 4px 5px 1px;
	float: right;
}

div.toolbar-list li.divider {
	margin-left: 10px;
	margin-right: 0;
}

div.toolbar-list span {
	margin: 0 auto;
}

div.toolbar-list a {
	float: right;
	padding: 1px 5px;
}

/**
 * Massmail component
 */


/**
 * Pane Slider pane Toggler styles
 */
div.pane-sliders {
	margin-left: 10px;
}

.pane-toggler  span {
	padding-left: 0;
	padding-right: 20px;
}

.pane-toggler-down span {
	padding-right: 20px;
	padding-left: 0;
}

div#position-icon.pane-sliders div.pane-down .icon-wrapper .icon {
	padding: 5px 10px 5px 0;
	margin: 0;
}

/**
 * Tabs
 */
dl.tabs {
	float: right;
	margin: 10px 0 -1px 0;
}

dl.tabs dt {
	float: right;
	padding: 4px 10px;
	margin-right: 3px;
}

div.current {
	padding: 10px 10px;
}

/* New parameter styles (check rtl) */

dl#content-pane.tabs {
	margin: 1px 0 0 0;
}

div.current label, div.current span.faux-label {
	float:right;
	clear:right;
}

div.current fieldset.radio {
	float:right;
}

div.current fieldset.radio input {
	float:right;
	margin: 3px 2px 0 0;
}

div.current fieldset.radio label {
	float:right;
	margin: 3px 2px 0 0;
}

div.current fieldset.checkboxes {
	float:right;
	clear:left;
}

div.current fieldset.checkboxes input {
	float:right;
	clear:right;
	margin: 3px 2px 0 0;
}

div.current fieldset.checkboxes label {
	clear:left;
	margin: 3px 2px 0 0;
}

div.current input,
div.current span.faux-input,
div.current textarea,
div.current select {
	float:right;
	margin: 3px 2px 0 0;
}

div.current table#acl-config th.acl-groups {
	text-align: right;
}

div.current table#filter-config th.acl-groups {
	text-align: right;
}

/* -------- Menu Assignments ---------- */
div#menu-assignment {
	clear:right;
}

div#menu-assignment ul.menu-links {
	float:right;
}

div#menu-assignment h3 {
	clear:right;
}

div#menu-assignment ul.menu-links li.menu-link label {
	float: right;
	margin: 3px 2px 0 0;
}
div#menu-assignment ul.menu-links li.menu-link input {
	clear: right;
	float: right;
}

p.tab-description {
	margin-right: 0;
}
/* end new parameter styles */

/**
 * Login Settings
 */
#login-page input, #login-page select {
	float: left;
}

#login-page .login {
	margin: 0 auto;
}

#login-page .pagetitle h2 {
	margin: -70px 0 30px 0;
}

#login-page .login-inst {
	float: right;
}

#login-page .login-box {
	float: left;
}

#login-page .button {
	text-align: left;
}

#login-page .login-text {
	text-align: right;
	float: right;
}

#form-login {
	float: left;
}

#form-login label {
	float: right;
	clear: right;
	text-align: left;
}

#form-login div.button1 div.next {
	float: right;
}

#form-login div.button1 a {
	padding: 0 15px 0 15px;
	/* padding: 0 6px 0 30px; use this if you use images */
}

/**
 * Cpanel Settings
 */
.cpanel div.icon ,
#cpanel div.icon {
	margin-left: 5px;
	float: right;
}

.cpanel div.icon a ,
#cpanel div.icon a {
	float: right;
}

.cpanel img ,
#cpanel img {
	padding: 10px 0;
	margin: 0 auto;
}

div.cpanel-icons {
	float: right;
}

div.cpanel-component {
	float: left;
}

/**
 * Standard Layout Styles
 */
div.col {
	float: right;
}

div.options-section.col {
	float: left;
}

div.col1 {
	float: right;
}

div.col2 {
	float: left;
}

	/* Avoid using the width divs. They are here for 3PD Extensions if needed
	 * Use the specific layout divs listed after. See also the th.width entries */
.clrlft { clear: right; }
.clrrt { clear: left; }
.fltlft { float: right; }
.fltrt { float: left; }
.fltnone { float: none; }

	/* Layout Divs */
div.options-section {
	margin: 10px 0 10px 10px;
}

/* for bluestork style html */
div.width-40.fltrt {
	margin: 10px 0 10px 10px;
}

/**
 * Form Styles
 */

fieldset {
	margin: 2px 10px 2px 10px;
	text-align: right;
}

fieldset p {
	margin: 10px 0;
}

/* new form fields (check rtl) */

fieldset.adminform fieldset.radio,
fieldset.panelform fieldset.radio,
fieldset.adminform-legacy fieldset.radio  {
	float:right;
	margin: 0 0 5px 0;
	clear:left;
}
fieldset.adminform fieldset.radio label,
fieldset.panelform fieldset.radio label,
fieldset.adminform fieldset.radio span.faux-label,
fieldset.panelform fieldset.radio span.faux-label {
	float:right;
}

fieldset.panelform-legacy label,
fieldset.adminform-legacy label,
fieldset.panelform-legacy span.faux-label,
fieldset.adminform-legacy span.faux-label {
	float:right;

}
/* JParameter classes on radio button labels  */

p.jform_desc {
	clear: right;
}

fieldset ul.checklist {
	margin-right: 27px;
	margin-left: 0;
}

fieldset#filter-bar {
	margin: 0;
	padding: 5px 10px 5px 10px;
}

fieldset#filter-bar ol, fieldset#filter-bar ul {
	padding: 5px 0 0;
}

fieldset#filter-bar ol li, fieldset#filter-bar ul li {
	float: right;
	padding: 0 0 0 5px;
}

fieldset#filter-bar .filter-search {
	float: right;
}

fieldset#filter-bar .filter-select {
	float: left;
}


	/* Note: these visual cues should be augmented by aria */

	/* must be augmented by aria at the same time if changed dynamically by js
	aria-invalid=true or aria-invalid=false */


	/* augmented by aria in template javascript */

span.readonly {
	float: right;
}

div.extdescript {
	margin-right: 10px;
}

input[type="button"] {
	padding: 1px 6px;
}

/**
 * Option or Parameter styles
 */


/* end from alpha2 */

span.gi {
	margin-left: 5px;
}

/**
 * Admintable Styles
 */

table.admintable td.key,table.admintable td.paramlist_key {
	text-align: left;
}

table.paramlist td.paramlist_description {
	text-align: right;
}

/**
 * Admin Form Styles
 */
fieldset.adminform {
	margin: 0 10px 10px 10px;
}
fieldset.adminform .input-prepend,
fieldset.adminform .input-append,
fieldset.panelform .input-prepend,
fieldset.panelform .input-append {
	float: right;
}
fieldset.adminform .adminformlist .btn.modal,
fieldset.adminform .input-prepend > *,
fieldset.adminform .input-append > *,
fieldset.panelform .adminformlist .btn.modal,
fieldset.panelform .input-prepend > *,
fieldset.panelform .input-append > * {
	float: none;
	vertical-align: middle;
}

	/* Table styles are for use with tabular data */
table.adminform {
	margin: 8px 0 10px 0;
}


table.adminform th {
	padding: 6px 4px 4px 2px;
	text-align: right;
}

table.adminform td {
	text-align: right;
}

table.adminform td#filter-bar {
	text-align: right;
}

table.adminform td.helpMenu {
	text-align: left;
}

table.adminform tr {
	padding-right: 10px;
	padding-left: 10px;
	border-left: 1px solid #c7c8b2;
	border-right: none;
}

/**
 * Table formatting styles
 */

	/* Avoid using the width classes. They are here for 3PD Extensions if needed
	 * Use the specific layout table headers listed after. See also the div.width entries */

	/* Table header layout classes */

th.ordering-col a {
	float:right;
	margin-right: 3px;
}

th.ordering-col a img {
	margin-right: 4px;
	margin-left: 4px;
}

/**
 * Adminlist Table layout
 */
table.adminlist {
	float: right;
}
	/* Table row styles */
table.adminlist tr {
	padding-left: 30px;
	padding-right: 30px;
}

table.adminlist tbody tr {
	text-align: right;
}

	/* Table td/th styles */
table.adminlist td.order span {
	float: right;
}

/**
 * Tree indentation & nesting - Up to 10 levels deep so don't go crazy :
 */
table.adminlist td.indent-4 	{ padding-right:4px; }
table.adminlist td.indent-19 	{ padding-right:19px; }
table.adminlist td.indent-34 	{ padding-right:34px; }
table.adminlist td.indent-49 	{ padding-right:49px; }
table.adminlist td.indent-64 	{ padding-right:64px; }
table.adminlist td.indent-79 	{ padding-right:79px; }
table.adminlist td.indent-94 	{ padding-right:94px; }
table.adminlist td.indent-109 	{ padding-right:109px; }
table.adminlist td.indent-124 	{ padding-right:124px; }
table.adminlist td.indent-139 	{ padding-right:139px; }

/**
 * Adminlist buttons
 */
table.adminlist tr td.btns a {
	padding: 3px 20px;
}

/**
 * Modal Modules styles
 */
ul#new-modules-list {
	margin-right: 50px;
	margin-left: 0;
}

/**
 * Utility styles
 */
	/* General Clearing Class */
.menu-module-list {
	padding-right: 10px;
	margin-right: 5px;
}

	/* stu nicholls solution for centering divs */

	/* table solution for global config */

table.noshow fieldset {
	margin: 15px 7px 7px 7px;
}

/**
 * Saving order icon styling in admin tables
 */
a.saveorder {
	float:left;
	margin-left: 8px;
}

/**
 * Button styling
 */
#editor-xtd-buttons {
	padding: 5px;
}

/* Button 1 Type */
.button1,.button1 div {
	float: left;
}

	/* Use this if you add images to the buttons such as directional arrows */

.button1 a {
	float: right;
	padding: 0 6px 0 6px;
}

	/* Button 2 Type */
.button2-left,.button2-right {
	float: right;
}

.button2-left a,
.button2-right a,
.button2-left span,
.button2-right span {
	float: right;
}

	/* these are inactive buttons */

.button2-left .page a,
.button2-right .page a,
.button2-left .page span,
.button2-right .page span,
.button2-left .blank a,
.button2-right .blank a,
.button2-left .blank span,
.button2-right .blank span {
	padding: 0 6px;
}

.button2-left a,.button2-left span {
	padding: 0 6px 0 24px;
}

.button2-right a,.button2-right span {
	padding: 0 24px 0 6px;
}

.button2-left {
	float: right;
	margin-right: 5px;
}

.button2-right {
	float: right;
	margin-right: 5px;
}

/* background images moved to the color rtl css file */

/**
 * Pagination styles
 */

	/* Normal pagination styles */
div.containerpg {
	position: relative;
	right: 50%;
	float: right;
	clear: right;
}

div.pagination {
	right: -50%;
	margin: 0 auto;
}

.pagination a {
	line-height: 1.6em;
}

.pagination div.limit {
	float: right;
	margin: 0 10px;
}

	/* The Go submittal button */
.pagination button {
	margin-left: 20px;
}

	/* Style if pagination is part of the table (old style) */
table.adminlist .pagination {
	margin: 0 auto;
}

table.adminlist .pagination button {
	margin-left: 20px;
}

/**
 * Pagination styles
 */

	/* Normal pagination styles */
div.containerpg {
	right: 50%;
	float: right;
	clear: right;
}

div.pagination {
	right: -50%;
	margin: 0 auto;
}

.pagination div.limit {
	float: right;
	margin: 0 10px;
}

	/* The Go submittal button */
.pagination button {
	margin-left: 20px;
}


	/* Grey out the current page number */


	/* Style if pagination is part of the table (old style) */

table.adminlist .pagination button {
	margin-left: 20px;
}

/**
 * MCE Editor
 */
div.toggle-editor {

}

/**
 * Tooltips
 */

.tip-text {
	text-align: right;
}

/**
 * Calendar
 */
a img.calendar {
	margin-right: 3px;
}

/**
 * General styles
 */

.helpFrame {
	padding: 0 10px 0 5px;
}

#treecellhelp {
	float: right;
}

#datacellhelp {
	float: right;
	padding: 2px 0 0 0;
}

/* -- MODAL STYLES ----------- */
div#sbox-window {
	text-align: right;
}

h2.modal-title {
	margin: 5px 15px 0 0;
}

ul.menu_types {
	padding: 0 15px 0 0;
}
ul.menu_types li,
dl.menu_type dd ul li {
	float:right;
	margin-left: 10px;
	margin-right: 0;
}

dl.menu_type dt {
	float:right;
	margin: 13px 0 5px 0;
}
dl.menu_type dd {
	clear:right;
}

dl.menu_type dd ul li {
	margin: 0;
}

dl.menu_type dd ul {
	margin: 0;
}

ul#new-modules-list {
	padding: 5px 15px 0 0;
	margin: 0;
}
ul#new-modules-list li {
	float:right;
	margin: 0 0 0 20px;
}

/**
 * User Accessibility
 */

	/* Skip to Content Structural Styling */
#skiplinkholder a,
#skiplinkholder a:link,
#skiplinkholder a:visited {
	left: 0;
	right: -200%;
}

#skiplinkholder a:focus, #skiplinkholder a:active {
	right: 0;
	top: 0;
}

#skiplinkholder p {
	margin: 0;
}

#skiptargetholder {
	left: 0;
	right: -200%;
}

	/* Skip to Content Visual Styling */
#skiplinkholder a, #skiplinkholder a:link, #skiplinkholder a:visited {
	padding-left: 20px;
	padding-right: 20px;
}

	/* For elements that aren't to be seen by users unless the user does something
	 * like clicking on a header to see the collapsed section. */

	/* For elements that aren't to be seen by visual users but do need to be read by screenreaders.
	 * Cannot be used for elements that can get focus such as links and form elements */

	/* Firefox has issues styling legend so this is a universal fix
	for making the legend invisible (i.e. visually it's not there, but screen readers see it */

legend.element-invisible {
	/*margin: 0;
	margin-right: -10000px; */
}

fieldset.adminform label,
fieldset.panelform label,
fieldset.adminform span.faux-label,
fieldset.panelform span.faux-label {
	clear:right;
	float:right;
	margin-right: 10px;
	margin-left: 5px;
}

fieldset.adminform fieldset.radio label,
fieldset.panelform fieldset.radio label,
fieldset.adminform fieldset.radio span.faux-label,
fieldset.panelform fieldset.radio span.faux-label {
	margin-right: 0;
}

/* checkboxes */
fieldset.adminform fieldset.checkboxes,
fieldset.panelform fieldset.checkboxes,
fieldset.adminform-legacy fieldset.checkboxes  {
	float:right;
	margin: 0 0 5px 0;
	clear:left;
}

fieldset.adminform fieldset.checkboxes input[type="checkbox"],
fieldset.panelform fieldset.checkboxes input[type="checkbox"] {
	float: right;
	clear: right;
}

fieldset.adminform fieldset.checkboxes label,
fieldset.panelform fieldset.checkboxes label,
fieldset.adminform fieldset.checkboxes span.faux-label,
fieldset.panelform fieldset.checkboxes span.faux-label {
	clear: left;
}
/* end checkboxes */

fieldset.adminform input, fieldset.adminform span.faux-input, fieldset.adminform textarea, fieldset.adminform select, fieldset.adminform img, fieldset.adminform button,
fieldset.panelform input, fieldset.panelform span.faux-input, fieldset.panelform textarea, fieldset.panelform select, fieldset.panelform img, fieldset.panelform button {
	float:right;
	margin:5px 0 5px 5px;
}

/* -------- Batch Section ---------- */
fieldset#batch-choose-action {
	clear:none;
	clear: right;
}
fieldset.batch label {
	float: right;
	clear: none;
}
fieldset label#batch-choose-action-lbl {
	clear: none;
	clear: right;
}
label#batch-language-lbl,
label#batch-user-lbl {
	clear: right;
	margin-left: 10px;
	margin-right: 0;
	margin-top: 15px;
}
select#batch-language-id,
select#batch-user-id {
	margin-top: 15px;
}
select#batch-category-id,
select#batch-menu-id,
select#batch-position-id
{
	margin-left: 30px;
	margin-right: 0;
}
fieldset.batch select, fieldset.batch input, fieldset.batch img, fieldset.batch button {
	float: right;
}
label#batch-access-lbl,
label#batch-client-lbl {
	margin-right: 0;
	margin-left: 10px;
}

/* Banner edit */


/* -- ACL STYLES relocated from com_users/media/grid.css ----------- */

/* -- ACL PANEL STYLES  ----------- */


/* All Tabs */

td.col1 {
	text-align:right;
}

/* Icons */
label.icon-16-allow,
label.icon-16-deny,
a.icon-16-allow,
a.icon-16-deny,
a.icon-16-allowinactive,
a.icon-16-denyinactive {
	margin: 0 auto;
}
label.icon-16-allow {
	right: 40%;
}
label.icon-16-deny {
	right: 40%;
}

ul.acllegend li {
	float: right;
	padding-left: 20px;
	margin: 15px 10px 15px 0;
}
ul.acllegend li.acl-allowed {
	padding-right: 20px;
	padding-left: 10px;
}
ul.acllegend li.acl-denied {
	padding-right: 20px;
	padding-left: 20px;
}
ul.acllegend li.acl-editgroups {
	padding-left: 10px;
}
ul.acllegend li.acl-resetbtn {
	padding-left: 0;
}

li.acl-editgroups,
li.acl-resetbtn {
	float: right;
}

table#acl-config th.acl-groups {
	padding-right: 8px;
}

table#acl-config th.acl-groups {
	text-align: right;
}

.acl-action {
	margin: auto 0;
}

/* Icons */
span.icon-16-unset,
span.icon-16-allowed,
span.icon-16-denied,
span.icon-16-locked {
	padding-left: 0;
	padding-right: 18px;
}

/* *
* Permission Rules
*/

#permissions-sliders ul#rules,
#permissions-sliders ul#rules ul {
    margin: 0 !important;
    padding: 0 !important;
}

#permissions-sliders ul#rules li {
	margin: 0;
	padding: 0;
}

#permissions-sliders ul#rules table.group-rules td {
    padding:4px;
    vertical-align:middle;
    text-align:right;
}

#permissions-sliders .panel {
    margin-bottom: 3px;
    margin-right: 0;
}

ul#rules table.group-rules td label {
	margin: 0 !important;
}

table.group-rules td select {
	margin: 0 !important;
}

#permissions-sliders ul#rules .mypanel {
	padding: 0;
}

#permissions-sliders ul#rules {
	padding: 5px;
}

#permissions-sliders  ul#rules  table.group-rules th {
    text-align: right;
    padding: 4px;
}

#permissions-sliders .pane-toggler  span {
	padding-left: 0;
	padding-right: 20px;
}

#permissions-sliders .pane-toggler-down span {
	padding-left: 0;
	padding-right: 20px;
}

/**
 * Helpmenus
 */
ul.helpmenu li {
	float: left;
}

/**
 * Menu Styling
 */
#menu a {
	padding: 0.35em 2em 0.35em 2.5em;
}

#menu li {
	float: right;
}

#menu li ul { /* second-level lists */
	margin-right: -1000em;
	/* using right instead of display to hide menus because display: none isn't read by screen readers */
}

#menu li ul ul { /* third-and-above-level lists */
	margin: -2.3em -1000em 0 0;
	/* top margin is equal to parent line height+bottom padding */
}

#menu li:hover ul ul,#menu li.sfhover ul ul {
	margin-right: -1000em;
}

#menu li:hover ul,#menu li.sfhover ul {
	/* lists nested under hovered list items */
	margin-right: 0;
}

#menu li li:hover ul,#menu li li.sfhover ul {
	margin-right: 16em;
}

/**
 * Extra positioning rules for limited noscript keyboard accessibility
 * need the backgrounds here to keep the background as the nav background
 * since it is overlaying other content.
 * Using margin-left instead of left so that can move back without javascript
 * display downlevel ul
 */
#menu li a:focus+ul {
	margin-right: 0;
}

#menu li li a:focus+ul {
	margin-right: 1016em;
}

/* bring back the focus elements into view */
#menu li li a:focus {
	margin-right: 1000em;
}

#menu li li li a:focus {
	margin-right: 2016em;
}

#menu li:hover a:focus,#menu li.sfhover a.sffocus {
	margin-right: 0;
}

#menu li li:hover a:focus+ul,#menu li li.sfhover a.sffocus+ul {
	margin-right: 16em;
}

/**
 * Submenu styling
 */


#submenu a, #submenu span.nolink {
	float: right;
	margin-left: 8px;
	padding: 2px 10px 2px 10px;
	-moz-border-radius-topleft: 3px;
	-moz-border-radius-topright: 3px;
	-webkit-border-top-left-radius: 3px;
	-webkit-border-top-right-radius: 3px;
	border-top-left-radius: 3px;
	border-top-right-radius: 3px;
}

/* Installer Database */
#installer-database p.warning {
	padding-left: 0;
	padding-right: 20px
}

#installer-database #sidebar {
	float: none
}

#installer-database p.nowarning {
	padding-left: 0;
	padding-right: 20px
}

p.nowarning {
	float: none;
	margin-left: 0;
	margin-right: 15px;
}

table.adminlist tfoot button {
	float: right;
}

/* Spinner */
.joomlaupdate_spinner {
	float: right;
	margin-left: 15px;
}

/* Various corrections */
[class*="span"] {
	float: none;
	margin-left: 0;
	margin-right: 0;
}

#sidebar {
	float:right;
	margin: 15px 0;
}

#submenu li, #submenu span.nolink {
	float: right;
}

div.btn-toolbar {
	float: right;
	text-align: right;
}

.btn-group {
	float: right;
	margin-right: 10px;
}

#module-status div.btn-group {
	float: right;
}

.nav-tabs > li, .nav-pills > li {
	float: none;
}

.tabs-left > .nav-tabs {
	border-right: 0 solid #DDDDDD;
	float: right;
	margin-right: 19px;
}

.list-striped, .row-striped {
	text-align: right;
}

.row-fluid [class*="span"] {
	float: none;
}
.media .btn {
	float: none;
}

.media {
	float:none;
	margin: 10px 20px;
}

.alert .close {
	right: 5px;
	float: left;
}

.popover,
.tooltip-inner {
	text-align: right;
}
div.toggle-editor {
	float: left;
}
#editor-xtd-buttons .btn {
	float: right;
}
div.toggle-editor {
	margin-top: 14px;
}
.modal-footer button {
	float: left;
}
#form-login  {
	float: right;
}templates/hathor/css/colour_standard.css000060400000133523152453623430014526 0ustar00.clearfix {
	*zoom: 1;
}
.clearfix:before,
.clearfix:after {
	display: table;
	content: "";
	line-height: 0;
}
.clearfix:after {
	clear: both;
}
.hide-text {
	font: 0/0 a;
	color: transparent;
	text-shadow: none;
	background-color: transparent;
	border: 0;
}
.input-block-level {
	display: block;
	width: 100%;
	min-height: 25px;
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
}
#form-login .btn {
	display: inline-block;
	*display: inline;
	*zoom: 1;
	padding: 4px 14px;
	margin-bottom: 0;
	font-size: 13px;
	line-height: 15px;
	*line-height: 15px;
	text-align: center;
	vertical-align: middle;
	cursor: pointer;
	color: #333333;
	text-shadow: 0 1px 1px rgba(255,255,255,0.75);
	background-color: #f5f5f5;
	background-image: -moz-linear-gradient(top,#ffffff,#e6e6e6);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#ffffff),to(#e6e6e6));
	background-image: -webkit-linear-gradient(top,#ffffff,#e6e6e6);
	background-image: -o-linear-gradient(top,#ffffff,#e6e6e6);
	background-image: linear-gradient(to bottom,#ffffff,#e6e6e6);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe5e5e5', GradientType=0);
	border-color: #e6e6e6 #e6e6e6 #bfbfbf;
	*background-color: #e6e6e6;
	filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
	border: 1px solid #bbb;
	*border: 0;
	border-bottom-color: #a2a2a2;
	-webkit-border-radius: 4px;
	-moz-border-radius: 4px;
	border-radius: 4px;
	*margin-left: .3em;
	-webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
	-moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
	box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
}
#form-login .btn:hover,
#form-login .btn:focus,
#form-login .btn:active,
#form-login .btn.active,
#form-login .btn.disabled,
#form-login .btn[disabled] {
	color: #333333;
	background-color: #e6e6e6;
	*background-color: #d9d9d9;
}
#form-login .btn:active,
#form-login .btn.active {
	background-color: #cccccc \9;
}
#form-login .btn:first-child {
	*margin-left: 0;
}
#form-login .btn:hover {
	color: #333333;
	text-decoration: none;
	background-color: #e6e6e6;
	*background-color: #d9d9d9;
	background-position: 0 -15px;
	-webkit-transition: background-position .1s linear;
	-moz-transition: background-position .1s linear;
	-o-transition: background-position .1s linear;
	transition: background-position .1s linear;
}
#form-login .btn:focus {
	outline: thin dotted #333;
	outline: 5px auto -webkit-focus-ring-color;
	outline-offset: -2px;
}
#form-login .btn.active,
#form-login .btn:active {
	background-color: #e6e6e6;
	background-color: #d9d9d9 \9;
	background-image: none;
	outline: 0;
	-webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
	-moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
	box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
}
#form-login .btn.disabled,
#form-login .btn[disabled] {
	cursor: default;
	background-color: #e6e6e6;
	background-image: none;
	opacity: 0.65;
	filter: alpha(opacity=65);
	-webkit-box-shadow: none;
	-moz-box-shadow: none;
	box-shadow: none;
}
.btn-large {
	padding: 9px 14px;
	font-size: 15px;
	line-height: normal;
	-webkit-border-radius: 5px;
	-moz-border-radius: 5px;
	border-radius: 5px;
}
.btn-large [class^="icon-"] {
	margin-top: 2px;
}
.input-append input[class*="span"],
.input-append .uneditable-input[class*="span"],
.input-prepend input[class*="span"],
.input-prepend .uneditable-input[class*="span"],
.row-fluid input[class*="span"],
.row-fluid select[class*="span"],
.row-fluid textarea[class*="span"],
.row-fluid .uneditable-input[class*="span"],
.row-fluid .input-prepend [class*="span"],
.row-fluid .input-append [class*="span"] {
	display: inline-block;
}
.input-append,
.input-prepend {
	margin-bottom: 5px;
	font-size: 0;
	white-space: nowrap;
}
.input-append input,
.input-append select,
.input-append .uneditable-input,
.input-prepend input,
.input-prepend select,
.input-prepend .uneditable-input {
	position: relative;
	margin-bottom: 0;
	*margin-left: 0;
	font-size: 13px;
	vertical-align: top;
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.input-append input:focus,
.input-append select:focus,
.input-append .uneditable-input:focus,
.input-prepend input:focus,
.input-prepend select:focus,
.input-prepend .uneditable-input:focus {
	z-index: 2;
}
.input-append .add-on,
.input-prepend .add-on {
	display: inline-block;
	width: auto;
	height: 15px;
	min-width: 16px;
	padding: 4px 5px;
	font-size: 13px;
	font-weight: normal;
	line-height: 15px;
	text-align: center;
	text-shadow: 0 1px 0 #ffffff;
	background-color: #eeeeee;
	border: 1px solid #ccc;
}
.input-append .add-on,
.input-append .btn,
.input-prepend .add-on,
.input-prepend .btn {
	margin-left: -1px;
	vertical-align: top;
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.input-append .active,
.input-prepend .active {
	background-color: #a9dba9;
	border-color: #46a546;
}
.input-prepend .add-on,
.input-prepend .btn {
	margin-right: -1px;
}
.input-prepend .add-on:first-child,
.input-prepend .btn:first-child {
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
}
.input-append input,
.input-append select,
.input-append .uneditable-input {
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
}
.input-append .add-on:last-child,
.input-append .btn:last-child {
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.input-prepend.input-append input,
.input-prepend.input-append select,
.input-prepend.input-append .uneditable-input {
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.input-prepend.input-append .add-on:first-child,
.input-prepend.input-append .btn:first-child {
	margin-right: -1px;
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
}
.input-prepend.input-append .add-on:last-child,
.input-prepend.input-append .btn:last-child {
	margin-left: -1px;
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.form-search .input-append .search-query,
.form-search .input-prepend .search-query {
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.form-search .input-append .search-query {
	-webkit-border-radius: 14px 0 0 14px;
	-moz-border-radius: 14px 0 0 14px;
	border-radius: 14px 0 0 14px;
}
.form-search .input-append .btn {
	-webkit-border-radius: 0 14px 14px 0;
	-moz-border-radius: 0 14px 14px 0;
	border-radius: 0 14px 14px 0;
}
.form-search .input-prepend .search-query {
	-webkit-border-radius: 0 14px 14px 0;
	-moz-border-radius: 0 14px 14px 0;
	border-radius: 0 14px 14px 0;
}
.form-search .input-prepend .btn {
	-webkit-border-radius: 14px 0 0 14px;
	-moz-border-radius: 14px 0 0 14px;
	border-radius: 14px 0 0 14px;
}
.form-search input,
.form-search textarea,
.form-search select,
.form-search .help-inline,
.form-search .uneditable-input,
.form-search .input-prepend,
.form-search .input-append,
.form-inline input,
.form-inline textarea,
.form-inline select,
.form-inline .help-inline,
.form-inline .uneditable-input,
.form-inline .input-prepend,
.form-inline .input-append,
.form-horizontal input,
.form-horizontal textarea,
.form-horizontal select,
.form-horizontal .help-inline,
.form-horizontal .uneditable-input,
.form-horizontal .input-prepend,
.form-horizontal .input-append {
	display: inline-block;
	*display: inline;
	*zoom: 1;
	margin-bottom: 0;
	vertical-align: middle;
}
.form-search .hide,
.form-inline .hide,
.form-horizontal .hide {
	display: none;
}
.form-search .input-append,
.form-inline .input-append,
.form-search .input-prepend,
.form-inline .input-prepend {
	margin-bottom: 0;
}
.element-invisible {
	position: absolute;
	padding: 0 !important;
	margin: 0 !important;
	border: 0;
	height: 1px;
	width: 1px !important;
	overflow: hidden;
}
#form-login select,
#form-login input[type="text"],
#form-login input[type="password"] {
	display: inline-block;
	padding: 4px 6px;
	margin-bottom: 9px;
	font-size: 13px;
	line-height: 15px;
	color: #555555;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
	width: 175px;
}
.subform-repeatable-wrapper div.btn-toolbar {
	float: none;
}
.subform-repeatable-wrapper .text-right {
	text-align: right;
}
.subform-repeatable-wrapper .ui-sortable-helper {
	background: #ffffff;
}
.subform-repeatable-wrapper tr.ui-sortable-helper {
	display: table;
}
.subform-repeatable-wrapper .subform-repeatable-group {
	clear: both;
}
.label,
.badge {
	display: inline-block;
	padding: 2px 4px;
	font-size: 10.998px;
	font-weight: bold;
	line-height: 14px;
	color: #ffffff;
	vertical-align: baseline;
	white-space: nowrap;
	text-shadow: 0 -1px 0 rgba(0,0,0,0.25);
	background-color: #999999;
}
.label {
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.badge {
	padding-left: 9px;
	padding-right: 9px;
	-webkit-border-radius: 9px;
	-moz-border-radius: 9px;
	border-radius: 9px;
}
.label:empty,
.badge:empty {
	display: none;
}
a.label:hover,
a.label:focus,
a.badge:hover,
a.badge:focus {
	color: #ffffff;
	text-decoration: none;
	cursor: pointer;
}
.label-important,
.badge-important {
	background-color: #a20000;
}
.label-important[href],
.badge-important[href] {
	background-color: #6f0000;
}
.label-warning,
.badge-warning {
	background-color: #f89406;
}
.label-warning[href],
.badge-warning[href] {
	background-color: #c67605;
}
.label-success,
.badge-success {
	background-color: #005800;
}
.label-success[href],
.badge-success[href] {
	background-color: #002500;
}
.label-info,
.badge-info {
	background-color: #3a87ad;
}
.label-info[href],
.badge-info[href] {
	background-color: #2d6987;
}
.label-inverse,
.badge-inverse {
	background-color: #333333;
}
.label-inverse[href],
.badge-inverse[href] {
	background-color: #1a1a1a;
}
.btn .label,
.btn .badge {
	position: relative;
	top: -1px;
}
.btn-mini .label,
.btn-mini .badge {
	top: 0;
}
body {
	background-color: #ffffff;
	color: #2c2c2c;
}
h1 {
	color: #2c2c2c;
}
a:link {
	color: #054993;
}
a:visited {
	color: #054993;
}
#header {
	background: #ffffff url(../images/j_logo.png) no-repeat;
}
#header h1.title {
	color: #2c2c2c;
}
#nav {
	background-color: #f9fade;
	background-image: -moz-linear-gradient(top,#f9fade,#f9fade);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#f9fade),to(#f9fade));
	background-image: -webkit-linear-gradient(top,#f9fade,#f9fade);
	background-image: -o-linear-gradient(top,#f9fade,#f9fade);
	background-image: linear-gradient(to bottom,#f9fade,#f9fade);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9fade', endColorstr='#fff9fade', GradientType=0);
	border: 1px solid #c7c8b2;
}
#content {
	background: #ffffff;
}
#no-submenu {
	border-bottom: 1px solid #c7c8b2;
}
#element-box {
	background: #ffffff;
	border-right: 1px solid #c7c8b2;
	border-bottom: 1px solid #c7c8b2;
	border-left: 1px solid #c7c8b2;
}
#element-box.login {
	border-top: 1px solid #c7c8b2;
}
.enabled,
.success,
.allow,
span.writable {
	color: #005800;
}
.disabled,
p.error,
.warning,
.deny,
span.unwritable {
	color: #a20000;
}
.nowarning {
	color: #2c2c2c;
}
.none,
.protected {
	color: #c7c8b2;
}
span.note {
	background: #ffffff;
	color: #2c2c2c;
}
div.checkin-tick {
	background: url(../images/admin/tick.png) 20px 50% no-repeat;
}
.ol-foreground {
	background-color: #f9fade;
}
.ol-background {
	background-color: #005800;
}
.ol-textfont {
	color: #2c2c2c;
}
.ol-captionfont {
	color: #ffffff;
}
.ol-captionfont a {
	color: #054993;
}
div.subheader .padding {
	background: #ffffff;
}
.pagetitle h2 {
	color: #2c2c2c;
}
div.configuration {
	color: #2c2c2c;
	background-image: url(../images/menu/icon-16-config.png);
	background-repeat: no-repeat;
}
div.toolbar-box {
	border-right: 1px solid #c7c8b2;
	border-bottom: 1px solid #c7c8b2;
	border-left: 1px solid #c7c8b2;
	background: #ffffff;
}
div.toolbar-list li {
	color: #2c2c2c;
}
div.toolbar-list li.divider {
	border-right: 1px dotted #e5d9c3;
}
div.toolbar-list a {
	border-left: 1px solid #e5d9c3;
	border-top: 1px solid #e5d9c3;
	border-right: 1px solid #c7c8b2;
	border-bottom: 1px solid #c7c8b2;
	background: #f9fade;
}
div.toolbar-list a:hover {
	border-left: 1px solid #868778;
	border-top: 1px solid #868778;
	border-right: 1px solid #f6f7db;
	border-bottom: 1px solid #f6f7db;
	background: #e5d9c3;
	color: #054993;
}
div.btn-toolbar {
	margin-left: 5px;
	padding-top: 3px;
}
div.btn-toolbar li.divider {
	border-right: 1px dotted #e5d9c3;
}
div.btn-toolbar div.btn-group button {
	border-left: 1px solid #e5d9c3;
	border-top: 1px solid #e5d9c3;
	border-right: 1px solid #c7c8b2;
	border-bottom: 1px solid #c7c8b2;
	background-color: #f9fade;
	background-image: -moz-linear-gradient(top,#f9fade,#f9fade);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#f9fade),to(#f9fade));
	background-image: -webkit-linear-gradient(top,#f9fade,#f9fade);
	background-image: -o-linear-gradient(top,#f9fade,#f9fade);
	background-image: linear-gradient(to bottom,#f9fade,#f9fade);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9fade', endColorstr='#fff9fade', GradientType=0);
	padding: 5px 4px 5px 4px;
}
div.btn-toolbar div.btn-group button:hover {
	border-left: 1px solid #868778;
	border-top: 1px solid #868778;
	border-right: 1px solid #f6f7db;
	border-bottom: 1px solid #f6f7db;
	background: #e5d9c3;
	color: #054993;
	cursor: pointer;
}
div.btn-toolbar a {
	border-left: 1px solid #e5d9c3;
	border-top: 1px solid #e5d9c3;
	border-right: 1px solid #c7c8b2;
	border-bottom: 1px solid #c7c8b2;
	background-color: #f9fade;
	background-image: -moz-linear-gradient(top,#f9fade,#f9fade);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#f9fade),to(#f9fade));
	background-image: -webkit-linear-gradient(top,#f9fade,#f9fade);
	background-image: -o-linear-gradient(top,#f9fade,#f9fade);
	background-image: linear-gradient(to bottom,#f9fade,#f9fade);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9fade', endColorstr='#fff9fade', GradientType=0);
	padding: 6px 5px;
	text-align: center;
	white-space: nowrap;
	font-size: 1.2em;
	text-decoration: none;
}
div.btn-toolbar a:hover {
	border-left: 1px solid #868778;
	border-top: 1px solid #868778;
	border-right: 1px solid #f6f7db;
	border-bottom: 1px solid #f6f7db;
	background: #e5d9c3;
	color: #054993;
	cursor: pointer;
}
div.btn-toolbar div.btn-group button.inactive {
	background: #f9fade;
}
.pane-sliders .title {
	color: #2c2c2c;
}
.pane-sliders .panel {
	border: 1px solid #c7c8b2;
}
.pane-sliders .panel h3 {
	background-color: #f9fade;
	background-image: -moz-linear-gradient(top,#f9fade,#f9fade);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#f9fade),to(#f9fade));
	background-image: -webkit-linear-gradient(top,#f9fade,#f9fade);
	background-image: -o-linear-gradient(top,#f9fade,#f9fade);
	background-image: linear-gradient(to bottom,#f9fade,#f9fade);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9fade', endColorstr='#fff9fade', GradientType=0);
	color: #054993;
}
.pane-sliders .panel h3:hover {
	background: #e5d9c3;
}
.pane-sliders .panel h3:hover a {
	text-decoration: none;
}
.pane-sliders .adminlist {
	border: 0 none;
}
.pane-sliders .adminlist td {
	border: 0 none;
}
.pane-toggler span {
	background: transparent url(../images/j_arrow.png) 5px 50% no-repeat;
}
.pane-toggler-down span {
	background: transparent url(../images/j_arrow_down.png) 5px 50% no-repeat;
}
.pane-toggler-down {
	border-bottom: 1px solid #c7c8b2;
}
dl.tabs dt {
	border: 1px solid #c7c8b2;
	background-color: #f9fade;
	background-image: -moz-linear-gradient(top,#f9fade,#f9fade);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#f9fade),to(#f9fade));
	background-image: -webkit-linear-gradient(top,#f9fade,#f9fade);
	background-image: -o-linear-gradient(top,#f9fade,#f9fade);
	background-image: linear-gradient(to bottom,#f9fade,#f9fade);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9fade', endColorstr='#fff9fade', GradientType=0);
	color: #054993;
}
dl.tabs dt:hover {
	background: #e5d9c3;
}
dl.tabs dt.open {
	background: #ffffff;
	border-bottom: 1px solid #ffffff;
	color: #2c2c2c;
}
dl.tabs dt.open a:visited {
	color: #2c2c2c;
}
dl.tabs dt a:hover {
	text-decoration: none;
}
dl.tabs dt a:focus {
	text-decoration: underline;
}
div.current {
	border: 1px solid #c7c8b2;
	background: #ffffff;
}
div.current fieldset {
	border: none 0;
}
div.current fieldset.adminform {
	border: 1px solid #c7c8b2;
}
#login-page .pagetitle h2 {
	background: transparent;
}
#login-page #header {
	border-bottom: 1px solid #c7c8b2;
}
#login-page #lock {
	background: url(../images/j_login_lock.png) 50% 0 no-repeat;
}
#login-page #element-box.login {
	background-color: #f9fade;
	background-image: -moz-linear-gradient(top,#f9fade,#f9fade);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#f9fade),to(#f9fade));
	background-image: -webkit-linear-gradient(top,#f9fade,#f9fade);
	background-image: -o-linear-gradient(top,#f9fade,#f9fade);
	background-image: linear-gradient(to bottom,#f9fade,#f9fade);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9fade', endColorstr='#fff9fade', GradientType=0);
}
#form-login {
	background: #ffffff;
	border: 1px solid #c7c8b2;
}
#form-login label {
	color: #2c2c2c;
}
#form-login div.button1 a {
	color: #054993;
}
#cpanel div.icon a,
.cpanel div.icon a {
	color: #054993;
	border-left: 1px solid #e5d9c3;
	border-top: 1px solid #e5d9c3;
	border-right: 1px solid #c7c8b2;
	border-bottom: 1px solid #c7c8b2;
	background-color: #f9fade;
	background-image: -moz-linear-gradient(top,#f9fade,#f9fade);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#f9fade),to(#f9fade));
	background-image: -webkit-linear-gradient(top,#f9fade,#f9fade);
	background-image: -o-linear-gradient(top,#f9fade,#f9fade);
	background-image: linear-gradient(to bottom,#f9fade,#f9fade);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9fade', endColorstr='#fff9fade', GradientType=0);
}
#cpanel div.icon a:hover,
#cpanel div.icon a:focus,
.cpanel div.icon a:hover,
.cpanel div.icon a:focus {
	border-left: 1px solid #868778;
	border-top: 1px solid #868778;
	border-right: 1px solid #f6f7db;
	border-bottom: 1px solid #f6f7db;
	color: #054993;
	background: #e5d9c3;
}
fieldset {
	border: 1px #c7c8b2 solid;
}
legend {
	color: #2c2c2c;
}
fieldset ul.checklist input:focus {
	outline: thin dotted #2c2c2c;
}
fieldset#filter-bar {
	border-top: 0 solid #c7c8b2;
	border-right: 0 solid #c7c8b2;
	border-bottom: 1px solid #c7c8b2;
	border-left: 0 solid #c7c8b2;
}
fieldset#filter-bar ol,
fieldset#filter-bar ul {
	border: 0;
}
fieldset#filter-bar ol li fieldset,
fieldset#filter-bar ul li fieldset {
	border: 0;
}
.invalid {
	color: #a20000;
}
input.invalid {
	border: 1px solid #a20000;
}
input.readonly,
span.faux-input {
	border: 0;
}
input.required {
	background-color: #e5f0fa;
}
input.disabled {
	background-color: #eeeeee;
}
input,
select,
span.faux-input {
	background-color: #ffffff;
	border: 1px solid #c7c8b2;
}
input[type="button"],
input[type="submit"],
input[type="reset"] {
	color: #054993;
	background-color: #f9fade;
	background-image: -moz-linear-gradient(top,#f9fade,#f9fade);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#f9fade),to(#f9fade));
	background-image: -webkit-linear-gradient(top,#f9fade,#f9fade);
	background-image: -o-linear-gradient(top,#f9fade,#f9fade);
	background-image: linear-gradient(to bottom,#f9fade,#f9fade);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9fade', endColorstr='#fff9fade', GradientType=0);
}
input[type="button"]:hover,
input[type="button"]:focus,
input[type="submit"]:hover,
input[type="submit"]:focus,
input[type="reset"]:hover,
input[type="reset"]:focus {
	background: #e5d9c3;
}
textarea {
	background-color: #ffffff;
	border: 1px solid #c7c8b2;
}
input:focus,
select:focus,
textarea:focus,
option:focus,
input:hover,
select:hover,
textarea:hover,
option:hover {
	background-color: #e5d9c3;
	color: #054993;
}
.paramrules {
	background: #f9fade;
}
span.gi {
	color: #c7c8b2;
}
table.admintable td.key,
table.admintable td.paramlist_key {
	background-color: #f9fade;
	color: #2c2c2c;
	border-bottom: 1px solid #c7c8b2;
	border-right: 1px solid #c7c8b2;
}
table.paramlist td.paramlist_description {
	background-color: #f9fade;
	color: #2c2c2c;
	border-bottom: 1px solid #c7c8b2;
	border-right: 1px solid #c7c8b2;
}
fieldset.adminform {
	border: 1px solid #c7c8b2;
}
table.adminform {
	background-color: #ffffff;
}
table.adminform tr.row0 {
	background-color: #ffffff;
}
table.adminform tr.row1 {
	background-color: #e5d9c3;
}
table.adminform th {
	color: #2c2c2c;
	background: #ffffff;
}
table.adminform tr {
	border-bottom: 1px solid #c7c8b2;
	border-right: 1px solid #c7c8b2;
}
table.adminlist {
	border-spacing: 1px;
	background-color: #ffffff;
	color: #2c2c2c;
}
table.adminlist.modal {
	border-top: 1px solid #c7c8b2;
	border-right: 1px solid #c7c8b2;
	border-left: 1px solid #c7c8b2;
}
table.adminlist a {
	color: #054993;
}
table.adminlist thead th {
	background: #ffffff;
	color: #2c2c2c;
	border-bottom: 1px solid #c7c8b2;
}
table.adminlist tbody tr {
	background: #ffffff;
}
table.adminlist tbody tr.row1 {
	background: #ffffff;
}
table.adminlist tbody tr.row1:last-child td,
table.adminlist tbody tr.row1:last-child th {
	border-bottom: 1px solid #c7c8b2;
}
table.adminlist tbody tr.row0:hover td,
table.adminlist tbody tr.row1:hover td,
table.adminlist tbody tr.row0:hover th,
table.adminlist tbody tr.row1:hover th,
table.adminlist tbody tr.row0:focus td,
table.adminlist tbody tr.row1:focus td,
table.adminlist tbody tr.row0:focus th,
table.adminlist tbody tr.row1:focus th {
	background-color: #e5d9c3;
}
table.adminlist tbody tr td,
table.adminlist tbody tr th {
	border-right: 1px solid #c7c8b2;
}
table.adminlist tbody tr td:last-child {
	border-right: none;
}
table.adminlist tbody tr.row0:last-child td,
table.adminlist tbody tr.row0:last-child th {
	border-bottom: 1px solid #c7c8b2;
}
table.adminlist tbody tr.row0 td,
table.adminlist tbody tr.row0 th {
	background-color: #f9fade;
	background-image: -moz-linear-gradient(top,#f9fade,#f9fade);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#f9fade),to(#f9fade));
	background-image: -webkit-linear-gradient(top,#f9fade,#f9fade);
	background-image: -o-linear-gradient(top,#f9fade,#f9fade);
	background-image: linear-gradient(to bottom,#f9fade,#f9fade);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9fade', endColorstr='#fff9fade', GradientType=0);
}
table.adminlist {
	border-bottom: 0 solid #c7c8b2;
}
table.adminlist tfoot tr {
	color: #2c2c2c;
}
table.adminlist tfoot td,
table.adminlist tfoot th {
	background-color: #ffffff;
	border-top: 1px solid #c7c8b2;
}
table.adminlist tr td.btns a {
	border: 1px solid #c7c8b2;
	background-color: #f9fade;
	background-image: -moz-linear-gradient(top,#f9fade,#f9fade);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#f9fade),to(#f9fade));
	background-image: -webkit-linear-gradient(top,#f9fade,#f9fade);
	background-image: -o-linear-gradient(top,#f9fade,#f9fade);
	background-image: linear-gradient(to bottom,#f9fade,#f9fade);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9fade', endColorstr='#fff9fade', GradientType=0);
	color: #054993;
}
table.adminlist tr td.btns a:hover,
table.adminlist tr td.btns a:active,
table.adminlist tr td.btns a:focus {
	background-color: #ffffff;
}
a.saveorder {
	background: url(../images/admin/filesave.png) no-repeat;
}
a.saveorder.inactive {
	background-position: 0 -16px;
}
fieldset.batch {
	background: #ffffff;
}
button {
	color: #054993;
	border: 1px solid #c7c8b2;
	background-color: #f9fade;
	background-image: -moz-linear-gradient(top,#f9fade,#f9fade);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#f9fade),to(#f9fade));
	background-image: -webkit-linear-gradient(top,#f9fade,#f9fade);
	background-image: -o-linear-gradient(top,#f9fade,#f9fade);
	background-image: linear-gradient(to bottom,#f9fade,#f9fade);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9fade', endColorstr='#fff9fade', GradientType=0);
}
button:hover,
button:focus {
	background: #e5d9c3;
}
.invalid {
	color: #ff0000;
}
.button1 {
	border: 1px solid #c7c8b2;
	color: #054993;
	background-color: #f9fade;
	background-image: -moz-linear-gradient(top,#f9fade,#f9fade);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#f9fade),to(#f9fade));
	background-image: -webkit-linear-gradient(top,#f9fade,#f9fade);
	background-image: -o-linear-gradient(top,#f9fade,#f9fade);
	background-image: linear-gradient(to bottom,#f9fade,#f9fade);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9fade', endColorstr='#fff9fade', GradientType=0);
}
.button1 a {
	color: #054993;
}
.button1 a:hover,
.button1 a:focus {
	background: #e5d9c3;
}
.button2-left,
.button2-right {
	border: 1px solid #c7c8b2;
	background-color: #f9fade;
	background-image: -moz-linear-gradient(top,#f9fade,#f9fade);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#f9fade),to(#f9fade));
	background-image: -webkit-linear-gradient(top,#f9fade,#f9fade);
	background-image: -o-linear-gradient(top,#f9fade,#f9fade);
	background-image: linear-gradient(to bottom,#f9fade,#f9fade);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9fade', endColorstr='#fff9fade', GradientType=0);
}
.button2-left a,
.button2-right a,
.button2-left span,
.button2-right span {
	color: #054993;
}
.button2-left span,
.button2-right span {
	color: #999999;
}
.page span,
.blank span {
	color: #054993;
}
.button2-left a:hover,
.button2-right a:hover,
.button2-left a:focus,
.button2-right a:focus {
	background: #e5d9c3;
}
.pagination .page span {
	color: #999999;
}
.tip {
	background: #000000;
	border: 1px solid #FFFFFF;
}
.tip-title {
	background: url(../images/selector-arrow-std.png) no-repeat;
}
a img.calendar {
	background: url(../images/calendar.png) no-repeat;
}
.jgrid span.publish {
	background-image: url(../images/admin/tick.png);
}
.jgrid span.unpublish {
	background-image: url(../images/admin/publish_x.png);
}
.jgrid span.archive {
	background-image: url(../images/menu/icon-16-archive.png);
}
.jgrid span.trash {
	background-image: url(../images/menu/icon-16-trash.png);
}
.jgrid span.default {
	background-image: url(../images/menu/icon-16-default.png);
}
.jgrid span.notdefault {
	background-image: url(../images/menu/icon-16-notdefault.png);
}
.jgrid span.checkedout {
	background-image: url(../images/admin/checked_out.png);
}
.jgrid span.downarrow {
	background-image: url(../images/admin/downarrow.png);
}
.jgrid span.downarrow_disabled {
	background-image: url(../images/admin/downarrow0.png);
}
.jgrid span.uparrow {
	background-image: url(../images/admin/uparrow.png);
}
.jgrid span.uparrow_disabled {
	background-image: url(../images/admin/uparrow0.png);
}
.jgrid span.published {
	background-image: url(../images/admin/publish_g.png);
}
.jgrid span.expired {
	background-image: url(../images/admin/publish_r.png);
}
.jgrid span.pending {
	background-image: url(../images/admin/publish_y.png);
}
.jgrid span.warning {
	background-image: url(../images/admin/publish_y.png);
}
.icon-32-send {
	background-image: url(../images/toolbar/icon-32-send.png);
}
.icon-32-delete {
	background-image: url(../images/toolbar/icon-32-delete.png);
}
.icon-32-help {
	background-image: url(../images/toolbar/icon-32-help.png);
}
.icon-32-cancel {
	background-image: url(../images/toolbar/icon-32-cancel.png);
}
.icon-32-checkin {
	background-image: url(../images/toolbar/icon-32-checkin.png);
}
.icon-32-options {
	background-image: url(../images/toolbar/icon-32-config.png);
}
.icon-32-apply {
	background-image: url(../images/toolbar/icon-32-apply.png);
}
.icon-32-back {
	background-image: url(../images/toolbar/icon-32-back.png);
}
.icon-32-forward {
	background-image: url(../images/toolbar/icon-32-forward.png);
}
.icon-32-save {
	background-image: url(../images/toolbar/icon-32-save.png);
}
.icon-32-edit {
	background-image: url(../images/toolbar/icon-32-edit.png);
}
.icon-32-copy {
	background-image: url(../images/toolbar/icon-32-copy.png);
}
.icon-32-move {
	background-image: url(../images/toolbar/icon-32-move.png);
}
.icon-32-new {
	background-image: url(../images/toolbar/icon-32-new.png);
}
.icon-32-upload {
	background-image: url(../images/toolbar/icon-32-upload.png);
}
.icon-32-assign {
	background-image: url(../images/toolbar/icon-32-publish.png);
}
.icon-32-html {
	background-image: url(../images/toolbar/icon-32-html.png);
}
.icon-32-css {
	background-image: url(../images/toolbar/icon-32-css.png);
}
.icon-32-menus {
	background-image: url(../images/toolbar/icon-32-menu.png);
}
.icon-32-publish {
	background-image: url(../images/toolbar/icon-32-publish.png);
}
.icon-32-unblock {
	background-image: url(../images/toolbar/icon-32-unblock.png);
}
.icon-32-unpublish {
	background-image: url(../images/toolbar/icon-32-unpublish.png);
}
.icon-32-restore {
	background-image: url(../images/toolbar/icon-32-revert.png);
}
.icon-32-trash {
	background-image: url(../images/toolbar/icon-32-trash.png);
}
.icon-32-archive {
	background-image: url(../images/toolbar/icon-32-archive.png);
}
.icon-32-unarchive {
	background-image: url(../images/toolbar/icon-32-unarchive.png);
}
.icon-32-preview {
	background-image: url(../images/toolbar/icon-32-preview.png);
}
.icon-32-default {
	background-image: url(../images/toolbar/icon-32-default.png);
}
.icon-32-refresh {
	background-image: url(../images/toolbar/icon-32-refresh.png);
}
.icon-32-save-new {
	background-image: url(../images/toolbar/icon-32-save-new.png);
}
.icon-32-save-copy {
	background-image: url(../images/toolbar/icon-32-save-copy.png);
}
.icon-32-error {
	background-image: url(../images/toolbar/icon-32-error.png);
}
.icon-32-new-style {
	background-image: url(../images/toolbar/icon-32-new-style.png);
}
.icon-32-delete-style {
	background-image: url(../images/toolbar/icon-32-delete-style.png);
}
.icon-32-purge {
	background-image: url(../images/toolbar/icon-32-purge.png);
}
.icon-32-remove {
	background-image: url(../images/toolbar/icon-32-remove.png);
}
.icon-32-featured {
	background-image: url(../images/toolbar/icon-32-featured.png);
}
.icon-32-unfeatured {
	background-image: url(../images/toolbar/icon-32-featured.png);
	background-position: 0% 100%;
}
.icon-32-export {
	background-image: url(../images/toolbar/icon-32-export.png);
}
.icon-32-stats {
	background-image: url(../images/toolbar/icon-32-stats.png);
}
.icon-32-print {
	background-image: url(../images/toolbar/icon-32-print.png);
}
.icon-32-batch {
	background-image: url(../images/toolbar/icon-32-batch.png);
}
.icon-32-envelope {
	background-image: url(../images/toolbar/icon-32-messaging.png);
}
.icon-32-download {
	background-image: url(../images/toolbar/icon-32-export.png);
}
.icon-32-bars {
	background-image: url(../images/toolbar/icon-32-stats.png);
}
.icon-48-categories {
	background-image: url(../images/header/icon-48-category.png);
}
.icon-48-category-edit {
	background-image: url(../images/header/icon-48-category.png);
}
.icon-48-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-generic {
	background-image: url(../images/header/icon-48-generic.png);
}
.icon-48-banners {
	background-image: url(../images/header/icon-48-banner.png);
}
.icon-48-banners-categories {
	background-image: url(../images/header/icon-48-banner-categories.png);
}
.icon-48-banners-category-edit {
	background-image: url(../images/header/icon-48-banner-categories.png);
}
.icon-48-banners-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-banners-clients {
	background-image: url(../images/header/icon-48-banner-client.png);
}
.icon-48-banners-tracks {
	background-image: url(../images/header/icon-48-banner-tracks.png);
}
.icon-48-checkin {
	background-image: url(../images/header/icon-48-checkin.png);
}
.icon-48-clear {
	background-image: url(../images/header/icon-48-clear.png);
}
.icon-48-contact {
	background-image: url(../images/header/icon-48-contacts.png);
}
.icon-48-contact-categories {
	background-image: url(../images/header/icon-48-contacts-categories.png);
}
.icon-48-contact-category-edit {
	background-image: url(../images/header/icon-48-contacts-categories.png);
}
.icon-48-contact-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-purge {
	background-image: url(../images/header/icon-48-purge.png);
}
.icon-48-cpanel {
	background-image: url(../images/header/icon-48-cpanel.png);
}
.icon-48-config {
	background-image: url(../images/header/icon-48-config.png);
}
.icon-48-groups {
	background-image: url(../images/header/icon-48-groups.png);
}
.icon-48-groups-add {
	background-image: url(../images/header/icon-48-groups-add.png);
}
.icon-48-levels {
	background-image: url(../images/header/icon-48-levels.png);
}
.icon-48-levels-add {
	background-image: url(../images/header/icon-48-levels-add.png);
}
.icon-48-module {
	background-image: url(../images/header/icon-48-module.png);
}
.icon-48-menu {
	background-image: url(../images/header/icon-48-menu.png);
}
.icon-48-menu-add {
	background-image: url(../images/header/icon-48-menu-add.png);
}
.icon-48-menumgr {
	background-image: url(../images/header/icon-48-menumgr.png);
}
.icon-48-trash {
	background-image: url(../images/header/icon-48-trash.png);
}
.icon-48-user {
	background-image: url(../images/header/icon-48-user.png);
}
.icon-48-user-add {
	background-image: url(../images/header/icon-48-user-add.png);
}
.icon-48-user-edit {
	background-image: url(../images/header/icon-48-user-edit.png);
}
.icon-48-user-profile {
	background-image: url(../images/header/icon-48-user-profile.png);
}
.icon-48-inbox {
	background-image: url(../images/header/icon-48-inbox.png);
}
.icon-48-new-privatemessage {
	background-image: url(../images/header/icon-48-new-privatemessage.png);
}
.icon-48-msgconfig {
	background-image: url(../images/header/icon-48-message_config.png);
}
.icon-48-langmanager {
	background-image: url(../images/header/icon-48-language.png);
}
.icon-48-mediamanager {
	background-image: url(../images/header/icon-48-media.png);
}
.icon-48-plugin {
	background-image: url(../images/header/icon-48-plugin.png);
}
.icon-48-help_header {
	background-image: url(../images/header/icon-48-help_header.png);
}
.icon-48-impressions {
	background-image: url(../images/header/icon-48-stats.png);
}
.icon-48-browser {
	background-image: url(../images/header/icon-48-stats.png);
}
.icon-48-searchtext {
	background-image: url(../images/header/icon-48-stats.png);
}
.icon-48-thememanager {
	background-image: url(../images/header/icon-48-themes.png);
}
.icon-48-writemess {
	background-image: url(../images/header/icon-48-writemess.png);
}
.icon-48-featured {
	background-image: url(../images/header/icon-48-featured.png);
}
.icon-48-sections {
	background-image: url(../images/header/icon-48-section.png);
}
.icon-48-article-add {
	background-image: url(../images/header/icon-48-article-add.png);
}
.icon-48-article-edit {
	background-image: url(../images/header/icon-48-article-edit.png);
}
.icon-48-article {
	background-image: url(../images/header/icon-48-article.png);
}
.icon-48-content-categories {
	background-image: url(../images/header/icon-48-category.png);
}
.icon-48-content-category-edit {
	background-image: url(../images/header/icon-48-category.png);
}
.icon-48-content-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-install {
	background-image: url(../images/header/icon-48-extension.png);
}
.icon-48-dbbackup {
	background-image: url(../images/header/icon-48-backup.png);
}
.icon-48-dbrestore {
	background-image: url(../images/header/icon-48-dbrestore.png);
}
.icon-48-dbquery {
	background-image: url(../images/header/icon-48-query.png);
}
.icon-48-systeminfo {
	background-image: url(../images/header/icon-48-info.png);
}
.icon-48-massmail {
	background-image: url(../images/header/icon-48-massmail.png);
}
.icon-48-redirect {
	background-image: url(../images/header/icon-48-redirect.png);
}
.icon-48-search {
	background-image: url(../images/header/icon-48-search.png);
}
.icon-48-finder {
	background-image: url(../images/header/icon-48-search.png);
}
.icon-48-newsfeeds {
	background-image: url(../images/header/icon-48-newsfeeds.png);
}
.icon-48-newsfeeds-categories {
	background-image: url(../images/header/icon-48-newsfeeds-cat.png);
}
.icon-48-newsfeeds-category-edit {
	background-image: url(../images/header/icon-48-newsfeeds-cat.png);
}
.icon-48-newsfeeds-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-weblinks {
	background-image: url(../images/header/icon-48-links.png);
}
.icon-48-weblinks-categories {
	background-image: url(../images/header/icon-48-links-cat.png);
}
.icon-48-weblinks-category-edit {
	background-image: url(../images/header/icon-48-links-cat.png);
}
.icon-48-weblinks-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-tags {
	background-image: url(../images/header/icon-48-tags.png);
}
.icon-48-assoc {
	background-image: url(../images/header/icon-48-assoc.png);
}
.icon-48-puzzle {
	background-image: url(../images/header/icon-48-puzzle.png);
}
div.message {
	border: 1px solid #c7c8b2;
	color: #2c2c2c;
}
.helpFrame {
	border-left: 0 solid #c7c8b2;
	border-right: none;
	border-top: none;
	border-bottom: none;
}
.outline {
	border: 1px solid #c7c8b2;
	background: #ffffff;
}
dl.menu_type dt {
	border-bottom: 1px solid #c7c8b2;
}
ul#new-modules-list {
	border-top: 1px solid #c7c8b2;
}
#skiplinkholder a,
#skiplinkholder a:link,
#skiplinkholder a:visited {
	color: #ffffff;
	background: #054993;
	border-bottom: solid #336 2px;
}
fieldset.panelform {
	border: none 0;
}
a.move_up {
	background-image: url('../images/admin/uparrow.png');
}
span.move_up {
	background-image: url('../images/admin/uparrow0.png');
}
a.move_down {
	background-image: url('../images/admin/downarrow.png');
}
span.move_down {
	background-image: url('../images/admin/downarrow0.png');
}
a.grid_false {
	background-image: url('../images/admin/publish_x.png');
}
a.grid_true {
	background-image: url('../images/admin/tick.png');
}
a.grid_trash {
	background-image: url('../images/admin/icon-16-trash.png');
}
tr.row1 {
	background-color: #f9fade;
}
table.aclsummary-table td.col2,
table.aclsummary-table th.col2,
table.aclsummary-table td.col3,
table.aclsummary-table th.col3,
table.aclsummary-table td.col4,
table.aclsummary-table th.col4,
table.aclsummary-table td.col5,
table.aclsummary-table th.col5,
table.aclsummary-table td.col6,
table.aclsummary-table th.col6,
table.aclmodify-table td.col2,
table.aclmodify-table th.col2 {
	border-left: 1px solid #c7c8b2;
}
span.icon-16-unset {
	background: url(../images/admin/icon-16-denyinactive.png) no-repeat;
}
span.icon-16-allowed {
	background: url(../images/admin/icon-16-allow.png) no-repeat;
}
span.icon-16-denied {
	background: url(../images/admin/icon-16-deny.png) no-repeat;
}
span.icon-16-locked {
	background: url(../images/admin/checked_out.png) 0 0 no-repeat;
}
label.icon-16-allow {
	background: url(../images/admin/icon-16-allow.png) no-repeat;
}
label.icon-16-deny {
	background: url(../images/admin/icon-16-deny.png) no-repeat;
}
a.icon-16-allow {
	background: url(../images/admin/icon-16-allow.png) no-repeat;
}
a.icon-16-deny {
	background: url(../images/admin/icon-16-deny.png) no-repeat;
}
a.icon-16-allowinactive {
	background: url(../images/admin/icon-16-allowinactive.png) no-repeat;
}
a.icon-16-denyinactive {
	background: url(../images/admin/icon-16-denyinactive.png) no-repeat;
}
ul.acllegend li.acl-allowed {
	background: url(../images/admin/icon-16-allow.png) no-repeat left;
}
ul.acllegend li.acl-denied {
	background: url(../images/admin/icon-16-deny.png) no-repeat left;
}
li.acl-editgroups,
li.acl-resetbtn {
	background-color: #f9fade;
	border: 1px solid #c7c8b2;
}
li.acl-editgroups a,
li.acl-resetbtn a {
	color: #054993;
}
li.acl-editgroups:hover,
li.acl-resetbtn:hover,
li.acl-editgroups:focus,
li.acl-resetbtn:focus {
	background-color: #e5d9c3;
}
table#acl-config {
	border: 1px solid #c7c8b2;
}
table#acl-config th,
table#acl-config td {
	background: #f9fade;
	border-bottom: 1px solid #c7c8b2;
}
table#acl-config th.acl-groups {
	border-right: 1px solid #c7c8b2;
}
#jform_sef_rewrite-lbl {
	background: url(../images/admin/icon-16-notice-note.png) right top no-repeat;
}
#permissions-sliders .tip {
	background: #ffffff;
	border: 1px solid #c7c8b2;
}
#permissions-sliders ul#rules,
#permissions-sliders ul#rules ul {
	border: solid 0 #c7c8b2;
	background: #ffffff;
}
ul#rules li .pane-sliders .panel h3.title {
	border: solid 0 #c7c8b2;
}
#permissions-sliders ul#rules .pane-slider {
	border: solid 1px #c7c8b2;
}
#permissions-sliders ul#rules li h3 {
	border: solid 1px #c7c8b2;
}
#permissions-sliders ul#rules li h3.pane-toggler-down a {
	border: solid 0;
}
#permissions-sliders ul#rules .group-kind {
	color: #2c2c2c;
}
#permissions-sliders ul#rules table.group-rules {
	border: solid 1px #c7c8b2;
}
#permissions-sliders ul#rules table.group-rules td {
	border-right: solid 1px #c7c8b2;
	border-bottom: solid 1px #c7c8b2;
}
#permissions-sliders ul#rules table.group-rules th {
	background: #e5d9c3;
	border-right: solid 1px #c7c8b2;
	border-bottom: solid 1px #c7c8b2;
	color: #2c2c2c;
}
ul#rules table.aclmodify-table {
	border: solid 1px #c7c8b2;
}
ul#rules table.group-rules td label {
	border: solid 0 #c7c8b2;
}
#permissions-sliders ul#rules .mypanel {
	border: solid 0 #c7c8b2;
}
#permissions-sliders  ul#rules  table.group-rules td {
	background: #ffffff;
}
#permissions-sliders span.level {
	color: #c7c8b2;
	background-image: none;
}
.check-0,
table.adminlist tbody td.check-0 {
	background-color: #ffffcf;
}
.check-a,
table.adminlist tbody td.check-a {
	background-color: #cfffda;
}
.check-d,
table.adminlist tbody td.check-d {
	background-color: #ffcfcf;
}
#system-message dd ul {
	color: #2c2c2c;
}
#system-message dd.error ul {
	color: #2c2c2c;
}
#system-message dd.message ul {
	color: #2c2c2c;
}
#system-message dd.notice ul {
	color: #2c2c2c;
}
#menu {
	color: #2c2c2c;
}
#menu ul.dropdown-menu {
	background-color: #f9fade;
	background-image: -moz-linear-gradient(top,#f9fade,#f9fade);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#f9fade),to(#f9fade));
	background-image: -webkit-linear-gradient(top,#f9fade,#f9fade);
	background-image: -o-linear-gradient(top,#f9fade,#f9fade);
	background-image: linear-gradient(to bottom,#f9fade,#f9fade);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9fade', endColorstr='#fff9fade', GradientType=0);
	color: #2c2c2c;
}
#menu ul.dropdown-menu li.dropdown-submenu {
	background: url(../images/j_arrow.png) no-repeat right 50%;
}
#menu ul.dropdown-menu li.divider {
	margin-bottom: 0;
	border-bottom: 1px dotted #c7c8b2;
}
#menu a {
	color: #054993;
	background-repeat: no-repeat;
	background-position: left 50%;
}
#menu li {
	border-right: 1px solid #c7c8b2;
	background-color: transparent;
}
#menu li a:hover,
#menu li a:focus {
	background-color: #e5d9c3;
}
#menu li.disabled a:hover,
#menu li.disabled a:focus,
#menu li.disabled a {
	color: #c7c8b2;
	background-color: #f9fade;
	background-image: -moz-linear-gradient(top,#f9fade,#f9fade);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#f9fade),to(#f9fade));
	background-image: -webkit-linear-gradient(top,#f9fade,#f9fade);
	background-image: -o-linear-gradient(top,#f9fade,#f9fade);
	background-image: linear-gradient(to bottom,#f9fade,#f9fade);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9fade', endColorstr='#fff9fade', GradientType=0);
}
#menu li ul {
	border: 1px solid #c7c8b2;
}
#menu li li {
	background-color: transparent;
}
#menu li.sfhover a {
	background-color: #e5d9c3;
}
#menu li.sfhover li a {
	background-color: transparent;
}
#menu li.sfhover li.sfhover a,
#menu li li a:focus {
	background-color: #e5d9c3;
}
#menu li.sfhover li.sfhover li a {
	background-color: transparent;
}
#menu li.sfhover li.sfhover li.sfhover a,
#menu li li li a:focus {
	background-color: #e5d9c3;
}
#menu li li a:focus,
#menu li li li a:focus {
	background-color: #e5d9c3;
}
#menu li li li a:focus {
	background-color: #e5d9c3;
}
#submenu {
	border-bottom: 1px solid #c7c8b2;
}
#submenu li,
#submenu span.nolink {
	background-color: #f9fade;
	background-image: -moz-linear-gradient(top,#f9fade,#f9fade);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#f9fade),to(#f9fade));
	background-image: -webkit-linear-gradient(top,#f9fade,#f9fade);
	background-image: -o-linear-gradient(top,#f9fade,#f9fade);
	background-image: linear-gradient(to bottom,#f9fade,#f9fade);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9fade', endColorstr='#fff9fade', GradientType=0);
	border: 1px solid #c7c8b2;
	color: #054993;
}
#submenu li:hover,
#submenu li:focus {
	background: #e5d9c3;
}
#submenu li.active,
#submenu span.nolink.active {
	background: #ffffff;
	border-bottom: 1px solid #ffffff;
}
#submenu li.active a,
#submenu span.nolink.active {
	color: #000;
}
.element-invisible {
	margin: 0;
	padding: 0;
}
div.CodeMirror-wrapping {
	border: 1px solid #c7c8b2;
}
table.adminform tr.row0 {
	background-color: #ffffff;
}
ul.alternating > li:nth-child(odd) {
	background-color: #ffffff;
}
ul.alternating > li:nth-child(even) {
	background-color: #f9fade;
}
ol.alternating > li:nth-child(odd) {
	background-color: #ffffff;
}
ol.alternating > li:nth-child(even) {
	background-color: #f9fade;
}
#installer-database,
#installer-discover,
#installer-update,
#installer-warnings {
	border-top: 1px solid #c7c8b2;
}
#installer-database p.warning {
	background: transparent url(../images/admin/icon-16-deny.png) center left no-repeat;
}
#installer-database p.nowarning {
	background: transparent url(../images/admin/icon-16-allow.png) center left no-repeat;
}
.input-append,
.input-prepend {
	font-size: 1.2em;
}
templates/hathor/css/template.css000060400000203134152453623430013152 0ustar00.clearfix {
	*zoom: 1;
}
.clearfix:before,
.clearfix:after {
	display: table;
	content: "";
	line-height: 0;
}
.clearfix:after {
	clear: both;
}
.hide-text {
	font: 0/0 a;
	color: transparent;
	text-shadow: none;
	background-color: transparent;
	border: 0;
}
.input-block-level {
	display: block;
	width: 100%;
	min-height: 25px;
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
}
.fade {
	opacity: 0;
	-webkit-transition: opacity .15s linear;
	-moz-transition: opacity .15s linear;
	-o-transition: opacity .15s linear;
	transition: opacity .15s linear;
}
.fade.in {
	opacity: 1;
}
.collapse {
	position: relative;
	height: 0;
	overflow: hidden;
	-webkit-transition: height .35s ease;
	-moz-transition: height .35s ease;
	-o-transition: height .35s ease;
	transition: height .35s ease;
}
.collapse.in {
	height: auto;
}
.modal-open .dropdown-menu {
	z-index: 2050;
}
.modal-open .dropdown.open {
	*z-index: 2050;
}
.modal-open .popover {
	z-index: 2110;
}
.modal-open .tooltip {
	z-index: 2080;
}
.modal-backdrop {
	position: fixed;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;
	z-index: 1040;
	background-color: #000000;
}
.modal-backdrop.fade {
	opacity: 0;
}
.modal-backdrop,
.modal-backdrop.fade.in {
	opacity: 0.8;
	filter: alpha(opacity=80);
}
div.modal {
	position: fixed;
	top: 50%;
	left: 50%;
	z-index: 1050;
	overflow: auto;
	width: 80%;
	margin: -250px 0 0 -40%;
	background-color: #ffffff;
	border: 1px solid #999;
	border: 1px solid rgba(0,0,0,0.3);
	*border: 1px solid #999;
	-webkit-border-radius: 6px;
	-moz-border-radius: 6px;
	border-radius: 6px;
	-webkit-box-shadow: 0 3px 7px rgba(0,0,0,0.3);
	-moz-box-shadow: 0 3px 7px rgba(0,0,0,0.3);
	box-shadow: 0 3px 7px rgba(0,0,0,0.3);
	-webkit-background-clip: padding-box;
	-moz-background-clip: padding-box;
	background-clip: padding-box;
}
div.modal.fade {
	-webkit-transition: opacity .3s linear, top .3s ease-out;
	-moz-transition: opacity .3s linear, top .3s ease-out;
	-o-transition: opacity .3s linear, top .3s ease-out;
	transition: opacity .3s linear, top .3s ease-out;
	top: -25%;
}
div.modal.fade.in {
	top: 50%;
}
.modal-header {
	padding: 9px 15px;
	border-bottom: 1px solid #eee;
}
.modal-header .close {
	float: right;
	margin-top: 2px;
}
.modal-body {
	overflow-y: auto;
	max-height: 400px;
	padding: 15px;
}
.modal-form {
	margin-bottom: 0;
}
.modal-footer {
	padding: 14px 15px 15px;
	margin-bottom: 0;
	text-align: right;
	background-color: #f5f5f5;
	border-top: 1px solid #ddd;
	-webkit-border-radius: 0 0 6px 6px;
	-moz-border-radius: 0 0 6px 6px;
	border-radius: 0 0 6px 6px;
	-webkit-box-shadow: inset 0 1px 0 #ffffff;
	-moz-box-shadow: inset 0 1px 0 #ffffff;
	box-shadow: inset 0 1px 0 #ffffff;
	*zoom: 1;
}
.modal-footer:before,
.modal-footer:after {
	display: table;
	content: "";
	line-height: 0;
}
.modal-footer:after {
	clear: both;
}
.modal-footer .btn + .btn {
	margin-left: 5px;
	margin-bottom: 0;
}
.modal-footer .btn-group .btn + .btn {
	margin-left: -1px;
}
body.modal-open {
	overflow: hidden;
	-ms-overflow-style: none;
}
.modal-buttons {
	padding: 15px 0px;
}
.modal-buttons button {
	font-size: 1.2em;
	line-height: 1.6em;
}
.popover {
	position: absolute;
	top: 0;
	left: 0;
	z-index: 1060;
	display: none;
	max-width: 276px;
	padding: 1px;
	text-align: left;
	background-color: #ffffff;
	-webkit-background-clip: padding-box;
	-moz-background-clip: padding;
	background-clip: padding-box;
	border: 1px solid #ccc;
	border: 1px solid rgba(0,0,0,0.2);
	-webkit-border-radius: 6px;
	-moz-border-radius: 6px;
	border-radius: 6px;
	-webkit-box-shadow: 0 5px 10px rgba(0,0,0,0.2);
	-moz-box-shadow: 0 5px 10px rgba(0,0,0,0.2);
	box-shadow: 0 5px 10px rgba(0,0,0,0.2);
	white-space: normal;
}
.popover.top {
	margin-top: -10px;
}
.popover.right {
	margin-left: 10px;
}
.popover.bottom {
	margin-top: 10px;
}
.popover.left {
	margin-left: -10px;
}
.popover-title {
	margin: 0;
	padding: 8px 14px;
	font-size: 14px;
	font-weight: normal;
	line-height: 18px;
	background-color: #f7f7f7;
	border-bottom: 1px solid #ebebeb;
	-webkit-border-radius: 5px 5px 0 0;
	-moz-border-radius: 5px 5px 0 0;
	border-radius: 5px 5px 0 0;
}
.popover-title:empty {
	display: none;
}
.popover-content {
	padding: 9px 14px;
}
.popover .arrow,
.popover .arrow:after {
	position: absolute;
	display: block;
	width: 0;
	height: 0;
	border-color: transparent;
	border-style: solid;
}
.popover .arrow {
	border-width: 11px;
}
.popover .arrow:after {
	border-width: 10px;
	content: "";
}
.popover.top .arrow {
	left: 50%;
	margin-left: -11px;
	border-bottom-width: 0;
	border-top-color: #999;
	border-top-color: rgba(0,0,0,0.25);
	bottom: -11px;
}
.popover.top .arrow:after {
	bottom: 1px;
	margin-left: -10px;
	border-bottom-width: 0;
	border-top-color: #ffffff;
}
.popover.right .arrow {
	top: 50%;
	left: -11px;
	margin-top: -11px;
	border-left-width: 0;
	border-right-color: #999;
	border-right-color: rgba(0,0,0,0.25);
}
.popover.right .arrow:after {
	left: 1px;
	bottom: -10px;
	border-left-width: 0;
	border-right-color: #ffffff;
}
.popover.bottom .arrow {
	left: 50%;
	margin-left: -11px;
	border-top-width: 0;
	border-bottom-color: #999;
	border-bottom-color: rgba(0,0,0,0.25);
	top: -11px;
}
.popover.bottom .arrow:after {
	top: 1px;
	margin-left: -10px;
	border-top-width: 0;
	border-bottom-color: #ffffff;
}
.popover.left .arrow {
	top: 50%;
	right: -11px;
	margin-top: -11px;
	border-right-width: 0;
	border-left-color: #999;
	border-left-color: rgba(0,0,0,0.25);
}
.popover.left .arrow:after {
	right: 1px;
	border-right-width: 0;
	border-left-color: #ffffff;
	bottom: -10px;
}
@font-face {
	font-family: 'IcoMoon';
	src: url('../../../../media/jui/fonts/IcoMoon.eot');
	src: url('../../../../media/jui/fonts/IcoMoon.eot?#iefix') format('embedded-opentype'), url('../../../../media/jui/fonts/IcoMoon.woff') format('woff'), url('../../../../media/jui/fonts/IcoMoon.ttf') format('truetype'), url('../../../../media/jui/fonts/IcoMoon.svg#IcoMoon') format('svg');
	font-weight: normal;
	font-style: normal;
}
[data-icon]:before {
	font-family: 'IcoMoon';
	content: attr(data-icon);
	speak: none;
}
[class^="icon-"],
[class*=" icon-"] {
	display: inline-block;
	width: 14px;
	height: 14px;
	margin-right: .25em;
	line-height: 14px;
}
[class^="icon-"]:before,
[class*=" icon-"]:before {
	font-family: 'IcoMoon';
	font-style: normal;
	speak: none;
}
[class^="icon-"].disabled,
[class*=" icon-"].disabled {
	font-weight: normal;
}
.icon-joomla:before {
	content: "\e200";
}
.icon-chevron-up:before,
.icon-uparrow:before,
.icon-arrow-up:before {
	content: "\e005";
}
.icon-chevron-right:before,
.icon-rightarrow:before,
.icon-arrow-right:before {
	content: "\e006";
}
.icon-chevron-down:before,
.icon-downarrow:before,
.icon-arrow-down:before {
	content: "\e007";
}
.icon-chevron-left:before,
.icon-leftarrow:before,
.icon-arrow-left:before {
	content: "\e008";
}
.icon-arrow-first:before {
	content: "\e003";
}
.icon-arrow-last:before {
	content: "\e004";
}
.icon-arrow-up-2:before {
	content: "\e009";
}
.icon-arrow-right-2:before {
	content: "\e00a";
}
.icon-arrow-down-2:before {
	content: "\e00b";
}
.icon-arrow-left-2:before {
	content: "\e00c";
}
.icon-arrow-up-3:before {
	content: "\e00f";
}
.icon-arrow-right-3:before {
	content: "\e010";
}
.icon-arrow-down-3:before {
	content: "\e011";
}
.icon-arrow-left-3:before {
	content: "\e012";
}
.icon-menu-2:before {
	content: "\e00e";
}
.icon-arrow-up-4:before {
	content: "\e201";
}
.icon-arrow-right-4:before {
	content: "\e202";
}
.icon-arrow-down-4:before {
	content: "\e203";
}
.icon-arrow-left-4:before {
	content: "\e204";
}
.icon-share:before,
.icon-redo:before {
	content: "\27";
}
.icon-undo:before {
	content: "\28";
}
.icon-forward-2:before {
	content: "\e205";
}
.icon-backward-2:before,
.icon-reply:before {
	content: "\e206";
}
.icon-unblock:before,
.icon-refresh:before,
.icon-redo-2:before {
	content: "\6c";
}
.icon-undo-2:before {
	content: "\e207";
}
.icon-move:before {
	content: "\7a";
}
.icon-expand:before {
	content: "\66";
}
.icon-contract:before {
	content: "\67";
}
.icon-expand-2:before {
	content: "\68";
}
.icon-contract-2:before {
	content: "\69";
}
.icon-play:before {
	content: "\e208";
}
.icon-pause:before {
	content: "\e209";
}
.icon-stop:before {
	content: "\e210";
}
.icon-previous:before,
.icon-backward:before {
	content: "\7c";
}
.icon-next:before,
.icon-forward:before {
	content: "\7b";
}
.icon-first:before {
	content: "\7d";
}
.icon-last:before {
	content: "\e000";
}
.icon-play-circle:before {
	content: "\e00d";
}
.icon-pause-circle:before {
	content: "\e211";
}
.icon-stop-circle:before {
	content: "\e212";
}
.icon-backward-circle:before {
	content: "\e213";
}
.icon-forward-circle:before {
	content: "\e214";
}
.icon-loop:before {
	content: "\e001";
}
.icon-shuffle:before {
	content: "\e002";
}
.icon-search:before {
	content: "\53";
}
.icon-zoom-in:before {
	content: "\64";
}
.icon-zoom-out:before {
	content: "\65";
}
.icon-apply:before,
.icon-edit:before,
.icon-pencil:before {
	content: "\2b";
}
.icon-pencil-2:before {
	content: "\2c";
}
.icon-brush:before {
	content: "\3b";
}
.icon-save-new:before,
.icon-plus-2:before {
	content: "\5d";
}
.icon-minus-sign:before,
.icon-minus-2:before {
	content: "\5e";
}
.icon-delete:before,
.icon-remove:before,
.icon-cancel-2:before {
	content: "\49";
}
.icon-publish:before,
.icon-save:before,
.icon-ok:before,
.icon-checkmark:before {
	content: "\47";
}
.icon-new:before,
.icon-plus:before {
	content: "\2a";
}
.icon-plus-circle:before {
	content: "\e215";
}
.icon-minus:before,
.icon-not-ok:before {
	content: "\4b";
}
.icon-ban-circle:before,
.icon-minus-circle:before {
	content: "\e216";
}
.icon-unpublish:before,
.icon-cancel:before {
	content: "\4a";
}
.icon-cancel-circle:before {
	content: "\e217";
}
.icon-checkmark-2:before {
	content: "\e218";
}
.icon-checkmark-circle:before {
	content: "\e219";
}
.icon-info:before {
	content: "\e220";
}
.icon-info-2:before,
.icon-info-circle:before {
	content: "\e221";
}
.icon-question:before,
.icon-question-sign:before,
.icon-help:before {
	content: "\45";
}
.icon-question-2:before,
.icon-question-circle:before {
	content: "\e222";
}
.icon-notification:before {
	content: "\e223";
}
.icon-notification-2:before,
.icon-notification-circle:before {
	content: "\e224";
}
.icon-pending:before,
.icon-warning:before {
	content: "\48";
}
.icon-warning-2:before,
.icon-warning-circle:before {
	content: "\e225";
}
.icon-checkbox-unchecked:before {
	content: "\3d";
}
.icon-checkin:before,
.icon-checkbox:before,
.icon-checkbox-checked:before {
	content: "\3e";
}
.icon-checkbox-partial:before {
	content: "\3f";
}
.icon-square:before {
	content: "\e226";
}
.icon-radio-unchecked:before {
	content: "\e227";
}
.icon-radio-checked:before,
.icon-generic:before {
	content: "\e228";
}
.icon-circle:before {
	content: "\e229";
}
.icon-signup:before {
	content: "\e230";
}
.icon-grid:before,
.icon-grid-view:before {
	content: "\58";
}
.icon-grid-2:before,
.icon-grid-view-2:before {
	content: "\59";
}
.icon-menu:before {
	content: "\5a";
}
.icon-list:before,
.icon-list-view:before {
	content: "\31";
}
.icon-list-2:before {
	content: "\e231";
}
.icon-menu-3:before {
	content: "\e232";
}
.icon-folder-open:before,
.icon-folder:before {
	content: "\2d";
}
.icon-folder-close:before,
.icon-folder-2:before {
	content: "\2e";
}
.icon-folder-plus:before {
	content: "\e234";
}
.icon-folder-minus:before {
	content: "\e235";
}
.icon-folder-3:before {
	content: "\e236";
}
.icon-folder-plus-2:before {
	content: "\e237";
}
.icon-folder-remove:before {
	content: "\e238";
}
.icon-file:before {
	content: "\e016";
}
.icon-file-2:before {
	content: "\e239";
}
.icon-file-add:before,
.icon-file-plus:before {
	content: "\29";
}
.icon-file-minus:before {
	content: "\e017";
}
.icon-file-check:before {
	content: "\e240";
}
.icon-file-remove:before {
	content: "\e241";
}
.icon-save-copy:before,
.icon-copy:before {
	content: "\e018";
}
.icon-stack:before {
	content: "\e242";
}
.icon-tree:before {
	content: "\e243";
}
.icon-tree-2:before {
	content: "\e244";
}
.icon-paragraph-left:before {
	content: "\e246";
}
.icon-paragraph-center:before {
	content: "\e247";
}
.icon-paragraph-right:before {
	content: "\e248";
}
.icon-paragraph-justify:before {
	content: "\e249";
}
.icon-screen:before {
	content: "\e01c";
}
.icon-tablet:before {
	content: "\e01d";
}
.icon-mobile:before {
	content: "\e01e";
}
.icon-box-add:before {
	content: "\51";
}
.icon-box-remove:before {
	content: "\52";
}
.icon-download:before {
	content: "\e021";
}
.icon-upload:before {
	content: "\e022";
}
.icon-home:before {
	content: "\21";
}
.icon-home-2:before {
	content: "\e250";
}
.icon-out-2:before,
.icon-new-tab:before {
	content: "\e024";
}
.icon-out-3:before,
.icon-new-tab-2:before {
	content: "\e251";
}
.icon-link:before {
	content: "\e252";
}
.icon-picture:before,
.icon-image:before {
	content: "\2f";
}
.icon-pictures:before,
.icon-images:before {
	content: "\30";
}
.icon-palette:before,
.icon-color-palette:before {
	content: "\e014";
}
.icon-camera:before {
	content: "\55";
}
.icon-camera-2:before,
.icon-video:before {
	content: "\e015";
}
.icon-play-2:before,
.icon-video-2:before,
.icon-youtube:before {
	content: "\56";
}
.icon-music:before {
	content: "\57";
}
.icon-user:before {
	content: "\22";
}
.icon-users:before {
	content: "\e01f";
}
.icon-vcard:before {
	content: "\6d";
}
.icon-address:before {
	content: "\70";
}
.icon-share-alt:before,
.icon-out:before {
	content: "\26";
}
.icon-enter:before {
	content: "\e257";
}
.icon-exit:before {
	content: "\e258";
}
.icon-comment:before,
.icon-comments:before {
	content: "\24";
}
.icon-comments-2:before {
	content: "\25";
}
.icon-quote:before,
.icon-quotes-left:before {
	content: "\60";
}
.icon-quote-2:before,
.icon-quotes-right:before {
	content: "\61";
}
.icon-quote-3:before,
.icon-bubble-quote:before {
	content: "\e259";
}
.icon-phone:before {
	content: "\e260";
}
.icon-phone-2:before {
	content: "\e261";
}
.icon-envelope:before,
.icon-mail:before {
	content: "\4d";
}
.icon-envelope-opened:before,
.icon-mail-2:before {
	content: "\4e";
}
.icon-unarchive:before,
.icon-drawer:before {
	content: "\4f";
}
.icon-archive:before,
.icon-drawer-2:before {
	content: "\50";
}
.icon-briefcase:before {
	content: "\e020";
}
.icon-tag:before {
	content: "\e262";
}
.icon-tag-2:before {
	content: "\e263";
}
.icon-tags:before {
	content: "\e264";
}
.icon-tags-2:before {
	content: "\e265";
}
.icon-options:before,
.icon-cog:before {
	content: "\38";
}
.icon-cogs:before {
	content: "\37";
}
.icon-screwdriver:before,
.icon-tools:before {
	content: "\36";
}
.icon-wrench:before {
	content: "\3a";
}
.icon-equalizer:before {
	content: "\39";
}
.icon-dashboard:before {
	content: "\78";
}
.icon-switch:before {
	content: "\e266";
}
.icon-filter:before {
	content: "\54";
}
.icon-purge:before,
.icon-trash:before {
	content: "\4c";
}
.icon-checkedout:before,
.icon-lock:before,
.icon-locked:before {
	content: "\23";
}
.icon-unlock:before {
	content: "\e267";
}
.icon-key:before {
	content: "\5f";
}
.icon-support:before {
	content: "\46";
}
.icon-database:before {
	content: "\62";
}
.icon-scissors:before {
	content: "\e268";
}
.icon-health:before {
	content: "\6a";
}
.icon-wand:before {
	content: "\6b";
}
.icon-eye-open:before,
.icon-eye:before {
	content: "\3c";
}
.icon-eye-close:before,
.icon-eye-blocked:before,
.icon-eye-2:before {
	content: "\e269";
}
.icon-clock:before {
	content: "\6e";
}
.icon-compass:before {
	content: "\6f";
}
.icon-broadcast:before,
.icon-connection:before,
.icon-wifi:before {
	content: "\e01b";
}
.icon-book:before {
	content: "\e271";
}
.icon-lightning:before,
.icon-flash:before {
	content: "\79";
}
.icon-print:before,
.icon-printer:before {
	content: "\e013";
}
.icon-feed:before {
	content: "\71";
}
.icon-calendar:before {
	content: "\43";
}
.icon-calendar-2:before {
	content: "\44";
}
.icon-calendar-3:before {
	content: "\e273";
}
.icon-pie:before {
	content: "\77";
}
.icon-bars:before {
	content: "\76";
}
.icon-chart:before {
	content: "\75";
}
.icon-power-cord:before {
	content: "\32";
}
.icon-cube:before {
	content: "\33";
}
.icon-puzzle:before {
	content: "\34";
}
.icon-attachment:before,
.icon-paperclip:before,
.icon-flag-2:before {
	content: "\72";
}
.icon-lamp:before {
	content: "\74";
}
.icon-pin:before,
.icon-pushpin:before {
	content: "\73";
}
.icon-location:before {
	content: "\63";
}
.icon-shield:before {
	content: "\e274";
}
.icon-flag:before {
	content: "\35";
}
.icon-flag-3:before {
	content: "\e275";
}
.icon-bookmark:before {
	content: "\e023";
}
.icon-bookmark-2:before {
	content: "\e276";
}
.icon-heart:before {
	content: "\e277";
}
.icon-heart-2:before {
	content: "\e278";
}
.icon-thumbs-up:before {
	content: "\5b";
}
.icon-thumbs-down:before {
	content: "\5c";
}
.icon-unfeatured:before,
.icon-asterisk:before,
.icon-star-empty:before {
	content: "\40";
}
.icon-star-2:before {
	content: "\41";
}
.icon-featured:before,
.icon-default:before,
.icon-star:before {
	content: "\42";
}
.icon-smiley:before,
.icon-smiley-happy:before {
	content: "\e279";
}
.icon-smiley-2:before,
.icon-smiley-happy-2:before {
	content: "\e280";
}
.icon-smiley-sad:before {
	content: "\e281";
}
.icon-smiley-sad-2:before {
	content: "\e282";
}
.icon-smiley-neutral:before {
	content: "\e283";
}
.icon-smiley-neutral-2:before {
	content: "\e284";
}
.icon-cart:before {
	content: "\e019";
}
.icon-basket:before {
	content: "\e01a";
}
.icon-credit:before {
	content: "\e286";
}
.icon-credit-2:before {
	content: "\e287";
}
.icon-expired:before {
	content: "\4b";
}
html,
body,
div,
span,
applet,
object,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
font,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
var,
b,
u,
i,
center,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td {
	margin: 0;
	padding: 0;
	border: 0;
	font-size: 100%;
	background: transparent;
}
blockquote,
q {
	quotes: none;
}
blockquote:before,
blockquote:after,
q:before,
q:after {
	content: '';
	content: none;
}
del {
	text-decoration: line-through;
}
html {
	overflow-y: scroll;
	height: 100%;
}
body {
	margin: 0;
	padding: 0;
	font-size: 62.5%;
	line-height: 1.5em;
	height: 100%;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}
body,
td,
th,
span,
a {
	font-family: Arial, Helvetica, sans-serif;
}
html,
body {
	height: 100%;
}
a,
img {
	padding: 0;
	margin: 0;
}
img {
	border: 0 none;
}
form {
	margin: 0;
	padding: 0;
}
ul {
	padding: 0;
	margin: 0;
}
h1 {
	margin: 0;
	padding-bottom: 8px;
	font-size: 1.4em;
	font-weight: bold;
	line-height: 2em;
}
h2 {
	padding-top: .83em;
	padding-bottom: .83em;
}
h3 {
	font-size: 1.4em;
}
a:link {
	color: #054993;
	text-decoration: none;
}
a:visited {
	color: #054993;
	text-decoration: none;
}
a:hover {
	text-decoration: underline;
}
a:focus {
	text-decoration: underline;
}
iframe {
	border: 0;
}
.enabled {
	color: #005800;
	font-weight: bold;
}
.disabled {
	color: #a20000;
	font-weight: bold;
}
p.error {
	color: #a20000;
	font-weight: bold;
}
.warning {
	color: #a20000;
	font-weight: bold;
}
.nowarning {
	color: #2c2c2c;
	font-weight: bold;
}
.success {
	color: #005800;
	font-weight: bold;
}
.allow {
	color: #005800;
}
span.writable {
	color: #005800;
}
.deny {
	color: #a20000;
}
span.unwritable {
	color: #a20000;
}
.none {
	color: #aaaaaa;
}
.pointer {
	cursor: pointer;
}
.nowrap {
	white-space: nowrap;
}
p.nowarning,
p.warning {
	margin: 10px;
}
#minwidth,
#minwidth-body {
	min-width: 980px;
}
#containerwrap {
	position: relative;
}
#header {
	position: relative;
}
#header h1.title {
	font-size: 1.5em;
	font-weight: normal;
	line-height: 25px;
	margin: 0;
	padding: 0 0 0 120px;
}
#footer {
	padding: 10px 20px;
}
#footer .copyright {
	margin: 0 0 0 0;
	text-align: center;
}
#footer p {
	font-size: 1.2em;
}
#nav .no-nav {
	line-height: 2em;
}
#content {
	margin: 5px 20px 20px 20px;
}
.cpanel-page div#element-box {
	padding: 15px;
}
#module-status {
	float: right;
	position: relative;
	top: -48px;
}
#module-status div.btn-group {
	display: block;
	float: left;
	padding: 4px 10px 0 10px;
	font-size: 1.2em;
}
#module-status div.divider {
	display: none;
}
#module-status .unread-messages a {
	font-weight: bold;
}
.title-ua {
	position: relative;
	width: 60%;
}
.enabled,
.disabled,
p.error,
.warning,
.nowarning,
.success {
	font-weight: bold;
}
.pointer {
	cursor: pointer;
}
.nowrap {
	white-space: nowrap;
}
span.note {
	display: block;
	padding: 5px;
}
div.checkin-tick {
	text-indent: -9999px;
}
.ol-textfont {
	font-family: Arial, Helvetica, sans-serif;
	font-size: 1.2em;
}
.ol-captionfont {
	font-family: Arial, Helvetica, sans-serif;
	font-size: 1.2em;
	font-weight: bold;
}
.ol-captionfont a {
	text-decoration: none;
}
div.subheader .padding {
	padding: 0;
}
div.pagetitle {
	padding: 0 0 5px 5px;
	margin: 0;
	background-repeat: no-repeat;
	background-position: left 50%;
	line-height: 54px;
	width: 100%;
	margin-top: -20px;
	height: 60px;
}
.tabs-left > .nav-tabs {
	float: left;
	margin-right: 19px;
	border-right: 1px solid #DDD;
}
tabs-below > .nav-tabs,
.tabs-right > .nav-tabs,
.tabs-left > .nav-tabs {
	border-bottom: 0;
}
.tab-content {
	overflow: visible;
}
.tabs-left .tab-content {
	overflow: auto;
}
.nav-tabs > li > span {
	display: block;
	margin-right: 2px;
	padding-right: 12px;
	padding-left: 12px;
	padding-top: 8px;
	padding-bottom: 8px;
	line-height: 18px;
	border: 1px solid transparent;
	-webkit-border-radius: 4px 4px 0 0;
	-moz-border-radius: 4px 4px 0 0;
	border-radius: 4px 4px 0 0;
}
.btn-micro {
	padding: 1px 4px;
	font-size: 10px;
	line-height: 8px;
}
.tip-wrap {
	max-width: 200px;
	padding: 3px 8px;
	color: #ffffff;
	text-align: center;
	text-decoration: none;
	-webkit-border-radius: 4px;
	-moz-border-radius: 4px;
	border-radius: 4px;
	z-index: 100;
}
.pagetitle h2 {
	padding: 0 0 0 50px;
	font-size: 1.3em;
	font-weight: bold;
	line-height: 48px;
	font-style: italic;
}
div.configuration {
	font-size: 1.2em;
	font-weight: bold;
	line-height: 2em;
	padding-left: 30px;
	margin-left: 10px;
}
div.toolbar-box h3 {
	height: 0;
	overflow: hidden;
	position: absolute;
	padding: 0;
	margin: 0;
}
.btn-toolbar {
	margin-bottom: 3px;
	margin-top: 14px;
}
div.btn-toolbar,
div.toolbar-list {
	float: left;
	text-align: left;
	padding: 0;
}
div.toolbar-list li {
	padding: 5px 1px 5px 4px;
	text-align: center;
	height: 52px;
	list-style: none;
	float: left;
}
div.toolbar-list li.spacer {
	width: 10px;
}
div.toolbar-list li.divider {
	width: 10px;
	margin-right: 10px;
}
div.toolbar-list span {
	float: none;
	width: 32px;
	height: 32px;
	margin: 0 auto;
	display: block;
}
div.toolbar-list a {
	display: block;
	float: left;
	white-space: nowrap;
	padding: 1px 5px;
	cursor: pointer;
	font-weight: bold;
}
div.btn-toolbar div.btn-group button {
	display: block;
	float: left;
	white-space: nowrap;
	padding: 1px 5px;
	cursor: pointer;
	text-align: center;
}
div.btn-toolbar button:hover,
div.btn-toolbar button:focus,
div.toolbar-list a:hover,
div.toolbar-list a:focus {
	text-decoration: none;
}
td#mm_pane {
	width: 90%;
}
input#mm_subject {
	width: 200px;
}
textarea#mm_message {
	width: 100%;
}
textarea {
	resize: both;
}
textarea.vert {
	resize: vertical;
}
textarea.noResize {
	resize: none;
}
.pane-sliders {
	margin: 0;
	position: relative;
}
.pane-sliders .title {
	margin: 0;
	padding: 2px;
	cursor: pointer;
}
.pane-sliders .panel {
	margin-bottom: 3px;
}
.pane-sliders .adminlist td {
	border: 0 none;
}
h3.pane-toggler-down a:focus,
h3.pane-toggler a:focus {
	outline: none;
}
.pane-toggler span {
	padding-left: 20px;
}
.pane-toggler-down span {
	padding-left: 20px;
}
.pane-slider.pane-hide {
	display: none;
}
div#position-icon.pane-sliders div.pane-down div.quickicon-wrapper {
	margin: 5px 0 5px 0;
}
div#position-icon.pane-sliders div.pane-down .quickicon-wrapper .icon {
	padding: 5px 0 5px 10px;
	margin: 0;
}
dl.tabs {
	float: left;
	margin: 10px 0 -1px 0;
	z-index: 50;
}
dl.tabs dt {
	float: left;
	padding: 4px 10px;
	margin-left: 3px;
}
dl.tabs dt.open {
	z-index: 100;
}
div.current {
	clear: both;
	padding: 10px 10px;
}
div.current dd {
	padding: 0;
	margin: 0;
}
dl#content-pane.tabs {
	margin: 1px 0 0 0;
}
div.current label,
div.current span.faux-label {
	display: block;
	min-width: 150px;
	float: left;
	clear: left;
	margin-top: 8px;
}
div.current fieldset.radio {
	float: left;
}
div.current fieldset.radio input {
	clear: none;
	min-width: 15px;
	float: left;
	margin: 3px 0 0 2px;
}
div.current fieldset.radio label {
	clear: none;
	min-width: 45px;
	float: left;
	margin: 3px 0 0 2px;
}
div.current fieldset.checkboxes {
	float: left;
	clear: right;
}
div.current fieldset.checkboxes input {
	clear: left;
	min-width: 15px;
	float: left;
	margin: 3px 0 0 2px;
}
div.current fieldset.checkboxes label {
	clear: right;
	min-width: 45px;
	margin: 3px 0 0 2px;
}
div.current input,
div.current span.faux-input,
div.current textarea,
div.current select {
	clear: none;
	float: left;
	margin: 3px 0 0 2px;
}
div.current select {
	margin-bottom: 15px;
}
div.current table#acl-config th.acl-groups {
	text-align: left;
}
div.current table#filter-config th.acl-groups {
	text-align: left;
}
div.current table#filter-config select {
	margin-bottom: 0;
}
div#menu-assignment {
	clear: left;
}
div#menu-assignment ul.menu-links {
	float: left;
	width: 49%;
}
div#menu-assignment ul.menu-links label {
	clear: none;
	float: left;
	margin: 3px 0 0 2px;
}
div#menu-assignment ul.menu-links input {
	clear: left;
	float: left;
}
button.jform-rightbtn {
	float: right;
	margin-right: 0;
}
p.tab-description {
	font-size: 1.091em;
	margin-left: 0;
	margin-top: 5px;
}
#login-page input,
#login-page select {
	float: right;
	clear: none;
}
#login-page .login {
	margin: 0 auto;
	width: 575px;
	margin-bottom: 100px;
}
#login-page .pagetitle h2 {
	margin: -70px 0 30px 0;
	font-size: 2em;
	padding: 0;
}
#login-page p {
	margin: 0;
	padding: 0;
	margin-bottom: 1em;
	font-size: 1.2em;
}
#login-page #header {
	margin-bottom: 100px;
}
#login-page .login-inst {
	float: left;
	width: 35%;
}
#login-page .login-box {
	float: right;
	width: 63%;
}
#login-page #lock {
	width: 150px;
	height: 137px;
}
#login-page #element-box.login {
	padding: 20px;
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
}
#login-page .button {
	text-align: right;
}
#login-page .login-text {
	text-align: left;
	width: 40%;
	float: left;
}
#form-login {
	float: left;
	padding: 1.1em;
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
}
#form-login fieldset {
	border: none;
}
#form-login label {
	display: block;
	float: left;
	clear: left;
	width: 100px;
	text-align: right;
	padding: 4px;
	color: #2c2c2c;
	font-weight: bold;
	font-size: 1.4em;
	margin-bottom: 15px;
}
#form-login div.button1 div.next {
	float: left;
}
#form-login div.button1 a {
	height: 2.2em;
	line-height: 2.2em;
	font-size: 1.5em;
	cursor: default;
	padding: 0 15px 0 15px;
}
.login-submit {
	border: 0;
	padding: 0;
	margin: 0;
	width: 0;
	height: 0;
}
#cpanel div.icon,
.cpanel div.icon {
	text-align: center;
	margin-right: 5px;
	float: left;
	margin-bottom: 5px;
}
#cpanel div.icon a,
.cpanel div.icon a {
	display: block;
	float: left;
	height: auto;
	min-height: 97px;
	width: 108px;
	color: #2c2c2c;
	vertical-align: middle;
	text-decoration: none;
	font-weight: bold;
}
#cpanel img,
.cpanel img {
	padding: 10px;
	margin: 0 auto;
}
#cpanel span,
.cpanel span {
	display: block;
	text-align: center;
	padding: 0 0 5px;
}
div.cpanel-icons {
	width: 54%;
	float: left;
}
div.cpanel-component {
	width: 45%;
	float: right;
}
div.col {
	float: left;
}
div.options-section.col {
	float: right;
}
div.col1 {
	float: left;
	width: 45%;
}
div.col2 {
	float: right;
	width: 45%;
}
div.width-1 {
	width: 1%;
}
div.width-3 {
	width: 3%;
}
div.width-5 {
	width: 5%;
}
div.width-10 {
	width: 10%;
}
div.width-20 {
	width: 20%;
}
div.width-30 {
	width: 30%;
}
div.width-35 {
	width: 35%;
}
div.width-40 {
	width: 40%;
}
div.width-45 {
	width: 45%;
}
div.width-50 {
	width: 50%;
}
div.width-55 {
	width: 55%;
}
div.width-60 {
	width: 60%;
}
div.width-65 {
	width: 65%;
}
div.width-70 {
	width: 70%;
}
div.width-80 {
	width: 80%;
}
div.width-100 {
	width: 100%;
}
.clrlft {
	clear: left;
}
.clrrt {
	clear: right;
}
.fltlft {
	float: left;
}
.fltrt {
	float: right;
}
.fltnone {
	float: none;
}
div.main-section {
	width: 60%;
}
div.options-section {
	width: 38%;
	margin: 10px 10px 10px 0;
}
div.width-40.fltrt {
	width: 38%;
	margin: 10px 10px 10px 0;
}
div.rules-section {
	width: 98%;
	margin: 10px;
}
fieldset {
	margin: 2px 10px 2px 10px;
	padding: 5px;
	text-align: left;
}
legend {
	font-size: 1.3em;
	font-weight: bold;
	padding-bottom: 5px;
}
fieldset p {
	margin: 10px 0;
	font-size: 1.2em;
}
fieldset ol,
ol#property-values,
fieldset ul,
ul#property-values {
	margin: 0;
	padding: 0;
}
fieldset li,
ol#property-values li,
ul#property-values li {
	list-style: none;
	margin: 0;
	padding: 5px;
}
fieldset.adminform fieldset.radio,
fieldset.panelform fieldset.radio,
fieldset.adminform-legacy fieldset.radio {
	border: 0;
	float: left;
	padding: 0;
	margin: 0 0 5px 0;
	clear: right;
}
fieldset.adminform fieldset.radio label,
fieldset.panelform fieldset.radio label,
fieldset.adminform fieldset.radio span.faux-label,
fieldset.panelform fieldset.radio span.faux-label {
	min-width: 40px;
	float: left;
	clear: none;
}
fieldset.adminform fieldset.checkboxes,
fieldset.panelform fieldset.checkboxes,
fieldset.adminform-legacy fieldset.checkboxes {
	border: 0;
	float: left;
	padding: 0;
	margin: 0 0 5px 0;
	clear: right;
}
fieldset.adminform fieldset.checkboxes input[type="checkbox"],
fieldset.panelform fieldset.checkboxes input[type="checkbox"] {
	float: left;
	clear: left;
}
fieldset.adminform fieldset.checkboxes label,
fieldset.panelform fieldset.checkboxes label,
fieldset.adminform fieldset.checkboxes span.faux-label,
fieldset.panelform fieldset.checkboxes span.faux-label {
	clear: right;
}
div.current span.spacer > span.before,
fieldset.adminform span.spacer > span.before,
fieldset.panelform span.spacer > span.before {
	clear: both;
	overflow: hidden;
	height: 0;
	display: block;
}
fieldset.panelform-legacy label,
fieldset.adminform-legacy label,
fieldset.panelform-legacy span.faux-label,
fieldset.adminform-legacy span.faux-label {
	min-width: 150px;
	float: left;
}
fieldset.adminform .input-prepend,
fieldset.adminform .input-append,
fieldset.panelform .input-prepend,
fieldset.panelform .input-append {
	float: left;
}
fieldset.adminform .adminformlist .btn.modal,
fieldset.adminform .input-prepend > *,
fieldset.adminform .input-append > *,
fieldset.panelform .adminformlist .btn.modal,
fieldset.panelform .input-prepend > *,
fieldset.panelform .input-append > * {
	float: none;
	vertical-align: middle;
}
fieldset.panelform-legacy label.radiobtn-jno,
fieldset.panelform-legacy label.radiobtn-jyes,
fieldset.panelform-legacy label.radiobtn-show,
fieldset.panelform-legacy label.radiobtn-hide,
fieldset.panelform-legacy label.radiobtn-off,
fieldset.panelform-legacy label.radiobtn-on {
	min-width: 40px !important;
	clear: none !important;
}
#jform_plugdesc-lbl,
#jform_description-lbl {
	font-weight: bold;
	clear: both;
	margin-top: 15px;
}
p.jform_desc {
	clear: left;
}
div#jform_ordering {
	font-size: 1.091em;
	margin-top: 3px;
}
fieldset ul.checklist {
	margin-left: 27px;
}
fieldset ul.checklist input,
fieldset ul.checklist label {
	float: none;
}
fieldset ul.checklist input:focus {
	outline: thin dotted #333333;
}
fieldset#filter-bar {
	margin: 0;
	padding: 5px 10px 5px 10px;
	float: left;
	width: 98%;
}
fieldset#filter-bar ol,
fieldset#filter-bar ul {
	list-style: none;
	margin: 0;
	padding: 5px 0 0;
}
fieldset#filter-bar ol li,
fieldset#filter-bar ul li {
	float: left;
	padding: 0 5px 0 0;
}
fieldset#filter-bar ol li fieldset,
fieldset#filter-bar ul li fieldset {
	margin: 0;
	padding: 0;
}
fieldset#filter-bar .filter-search {
	float: left;
	padding-bottom: 3px;
}
fieldset#filter-bar .filter-select {
	float: right;
}
fieldset#filter-bar input#search {
	width: 10em;
}
.invalid {
	font-weight: bold;
}
input.readonly,
span.faux-input {
	border: 0;
}
.star {
	color: #cc0000;
	font-size: 1.2em;
}
input,
select,
span.faux-input {
	font-size: 1.2em;
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
}
span.readonly {
	float: left;
	font-size: 1.2em;
	line-height: 2em;
}
div.readonly {
	font-size: 1.2em;
	line-height: 2em;
}
div.extdescript {
	margin-left: 10px;
}
input[type="button"],
input[type="submit"],
input[type="reset"] {
	font-family: Arial, Helvetica, sans-serif;
	padding: 1px 6px;
	font-size: 1.2em;
	line-height: 1.5em;
}
textarea {
	font-size: 1.4em;
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
}
input.button {
	cursor: pointer;
}
label {
	font-weight: bold;
	font-size: 1.1em;
}
span.faux-label {
	font-weight: bold;
	font-size: 1.1em;
}
label.selectlabel {
	position: absolute;
	left: -1000em;
}
.paramrules {
	padding: 10px;
}
span.gi {
	font-weight: bold;
	margin-right: 5px;
}
span.gtr {
	visibility: hidden;
	margin-right: 5px;
}
table.admintable td {
	padding: 3px;
	font-size: 1em;
}
table.admintable td.key,
table.admintable td.paramlist_key {
	text-align: right;
	width: 140px;
	font-weight: bold;
	font-size: 1em;
}
table.admintable td.key label,
table.admintable td.paramlist_key label {
	font-size: 1em;
}
table.admintable td.paramlist_value label {
	font-size: 1em;
}
table.admintable input,
table.admintable span.faux-input,
table.admintable select {
	font-size: 1em;
}
table.paramlist td.paramlist_description {
	text-align: left;
	width: 170px;
	font-weight: normal;
}
table.admintable td.key.vtop {
	vertical-align: top;
}
fieldset.adminform {
	margin: 0 10px 10px 10px;
	overflow: hidden;
}
.adminformlist .btn.modal {
	float: left;
	margin-top: 7px;
}
ul.adminformlist,
ul.adminformlist li,
dl.adminformlist,
dl.adminformlist li {
	margin: 0;
	padding: 0;
	list-style: none;
}
ul.adminformlist pre {
	font-size: 1.3em;
}
ul.adminformlist .button2-left,
ul.adminformlist .button2-left {
	margin-top: 5px;
}
table.adminform {
	width: 100%;
	border-collapse: collapse;
	margin: 8px 0 10px 0;
	margin-bottom: 15px;
}
table.adminform.nospace {
	margin-bottom: 0;
}
table.adminform th {
	font-size: 1.4em;
	padding: 6px 2px 4px 4px;
	text-align: left;
	height: 25px;
}
table.adminform td {
	padding: 3px;
	text-align: left;
}
table.adminform td#filter-bar {
	text-align: left;
}
table.adminform td.helpMenu {
	text-align: right;
}
table.adminform tr {
	padding-left: 10px;
	padding-right: 10px;
}
td.center,
th.center {
	text-align: center;
}
th.width-1 {
	width: 1%;
}
th.width-3 {
	width: 3%;
}
th.width-5 {
	width: 5%;
}
th.width-10 {
	width: 10%;
}
th.width-12 {
	width: 12%;
}
th.width-15 {
	width: 15%;
}
th.width-20 {
	width: 20%;
}
th.width-25 {
	width: 25%;
}
th.width-30 {
	width: 30%;
}
th.width-40 {
	width: 40%;
}
th.row-number-col {
	width: 3%;
}
th.checkmark-col {
	width: 1%;
}
th.state-col {
	width: 5%;
}
th.ordering-col {
	width: 10%;
}
th.ordering-col a {
	display: block;
	float: left;
	margin-left: 3px;
}
th.ordering-col a img {
	margin-left: 4px;
	margin-right: 4px;
}
.categories th.ordering-col input,
.categories td.order input {
	font-size: 1em;
}
th.category-col {
	width: 5%;
}
th.access-col {
	width: 10%;
}
.categories th.access-col {
	width: 5%;
}
th.hits-col {
	width: 5%;
}
th.id-col {
	width: 3%;
}
th.featured-col {
	width: 5%;
}
th.created-by-col {
	width: 15%;
}
th.date-col {
	width: 5%;
}
th.language-col {
	width: 5%;
}
th.home-col {
	width: 5%;
}
table.adminlist {
	width: 100%;
	float: left;
}
table.adminlist td,
table.adminlist th {
	padding: 4px;
	font-size: 1.2em;
}
table.adminlist thead th {
	text-align: center;
}
table.adminlist thead a:hover {
	text-decoration: none;
}
table.adminlist thead th img {
	vertical-align: middle;
}
table.adminlist tbody th {
	font-weight: bold;
}
table.adminlist tr {
	padding-left: 30px;
	padding-right: 30px;
}
table.adminlist tbody tr {
	text-align: left;
}
table.adminlist tbody tr td,
table.adminlist tbody tr th {
	height: 25px;
}
table.adminlist tfoot tr {
	text-align: center;
}
table.adminlist tfoot td,
table.adminlist tfoot th {
	text-align: center;
}
table.adminlist td.order {
	text-align: center;
	white-space: nowrap;
}
table.adminlist td.order span {
	float: left;
	width: 20px;
	text-align: center;
}
table.adminlist td.order input {
	text-align: center;
	width: 3em;
	font-size: 100%;
}
#media-tree_tree ul {
	list-style: none outside none;
	margin: 0 10px;
}
table.adminlist td.indent-4 {
	padding-left: 4px;
}
table.adminlist td.indent-19 {
	padding-left: 19px;
}
table.adminlist td.indent-34 {
	padding-left: 34px;
}
table.adminlist td.indent-49 {
	padding-left: 49px;
}
table.adminlist td.indent-64 {
	padding-left: 64px;
}
table.adminlist td.indent-79 {
	padding-left: 79px;
}
table.adminlist td.indent-94 {
	padding-left: 94px;
}
table.adminlist td.indent-109 {
	padding-left: 109px;
}
table.adminlist td.indent-124 {
	padding-left: 124px;
}
table.adminlist td.indent-139 {
	padding-left: 139px;
}
table.adminlist tr td.btns a {
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
	padding: 3px 20px;
}
table.adminlist tr td.btns a:hover,
table.adminlist tr td.btns a:active,
table.adminlist tr td.btns a:focus {
	text-decoration: none;
}
table.adminlist td li {
	list-style: inside;
}
ul#new-modules-list {
	margin-left: 50px;
	font-size: 1.4em;
	line-height: 1.5em;
}
.clr {
	clear: both;
	overflow: hidden;
	height: 0;
}
.clearfix:after {
	content: ".";
	display: block;
	height: 0;
	clear: both;
	visibility: hidden;
}
.menu-module-list {
	list-style-position: inside;
	padding-left: 10px;
	margin-left: 5px;
}
.container {
	clear: both;
	text-decoration: none;
}
* html .container {
	display: inline-block;
}
table.noshow {
	width: 100%;
	border-collapse: collapse;
	padding: 0;
	margin: 0;
}
table.noshow tr {
	vertical-align: top;
}
table.noshow fieldset {
	margin: 15px 7px 7px 7px;
}
a.saveorder {
	width: 16px;
	height: 16px;
	display: block;
	overflow: hidden;
	float: right;
	margin-right: 8px;
}
#editor-xtd-buttons {
	padding: 5px;
}
button {
	font-family: Arial, Helvetica, sans-serif;
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
	margin-right: 3px;
	margin-left: 3px;
}
.invalid {
	font-weight: bold;
}
.button1,
.button1 div {
	height: 1%;
	float: right;
}
.button1 {
	white-space: nowrap;
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
}
.button1 a {
	display: block;
	height: 2.2em;
	float: left;
	line-height: 2.2em;
	font-size: 1.2em;
	font-weight: bold;
	cursor: default;
	padding: 0 6px 0 6px;
}
.button1 a:hover,
.button1 a:focus {
	text-decoration: none;
}
.button2-left,
.button2-right {
	float: left;
	line-height: 1.5em;
	font-size: 1.2em;
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
}
.button2-left.smallsub,
.button2-right.smallsub {
	line-height: 1.2em;
	font-size: .9em;
}
.button2-left a,
.button2-right a,
.button2-left span,
.button2-right span {
	display: block;
	float: left;
	cursor: default;
}
.button2-left span,
.button2-right span {
	cursor: default;
}
.button2-left .page a,
.button2-right .page a,
.button2-left .page span,
.button2-right .page span,
.button2-left .blank a,
.button2-right .blank a,
.button2-left .blank span,
.button2-right .blank span {
	padding: 0 6px;
}
.page span,
.blank span {
	font-weight: bold;
}
.button2-left a:hover,
.button2-right a:hover,
.button2-left a:focus,
.button2-right a:focus {
	text-decoration: none;
}
.button2-left a,
.button2-left span {
	padding: 0 24px 0 6px;
}
.button2-right a,
.button2-right span {
	padding: 0 6px 0 24px;
}
.button2-left {
	float: left;
	margin-left: 5px;
}
.button2-right {
	float: left;
	margin-left: 5px;
}
div.containerpg {
	position: relative;
	left: 50%;
	float: left;
	clear: left;
}
div.pagination {
	position: relative;
	left: -50%;
	margin: 0 auto;
	padding: .5em;
}
.pagination div.limit {
	float: left;
	margin: 0 10px;
	font-size: 1.2em;
	height: 1.8em;
	line-height: 1.8em;
}
.pagination div.limit label {
	font-size: 100%;
	height: 1.8em;
	line-height: 1.8em;
}
.pagination div.limit select {
	font-size: 100%;
}
.pagination button {
	font-size: 100%;
	height: 2.0em;
	line-height: 1.8em;
	margin-right: 20px;
}
div.pagination .button2-right,
div.pagination .button2-left {
	font-size: 1.2em;
	height: 1.6em;
	line-height: 1.6em;
}
table.adminlist .pagination {
	display: table;
	padding: 0;
	margin: 0 auto;
	font-size: .8em;
}
table.adminlist .pagination button {
	font-size: 1.2em;
	height: 1.6em;
	line-height: 1.5em;
	margin-right: 20px;
}
div.toggle-editor {
	margin-top: 9px;
}
.tip {
	float: left;
	padding: 5px;
	max-width: 400px;
	z-index: 50;
}
.tip-title {
	padding: 0;
	margin: 0;
	font-size: 120%;
	margin-top: -15px;
	padding-top: 15px;
	padding-bottom: 5px;
}
.tip-text {
	font-size: 100%;
	text-align: left;
	margin: 0;
}
a img.calendar {
	width: 16px;
	height: 16px;
	margin-left: 3px;
	cursor: pointer;
	vertical-align: middle;
}
a.jgrid:hover {
	text-decoration: none;
}
.jgrid span.state {
	display: inline-block;
	height: 16px;
	width: 16px;
}
.jgrid span.text {
	display: none;
}
div.message {
	text-align: center;
	font-family: Arial, Helvetica, sans-serif;
	font-size: 1.2em;
	padding: 3px;
	margin-bottom: 10px;
	font-weight: bold;
}
.helpIndex {
	border: 0;
	width: 100%;
	height: 100%;
	padding: 0;
	overflow: auto;
}
.helpFrame {
	width: 100%;
	height: 800px;
	padding: 0 5px 0 10px;
}
#treecellhelp {
	width: 25%;
	display: block;
	position: relative;
	float: left;
	margin: 0;
	padding: 2px;
	overflow: hidden;
}
#datacellhelp {
	width: 73%;
	display: block;
	float: left;
	margin: 0;
	padding: 2px 0 0 0;
}
.outline {
	padding: 2px;
}
h2.modal-title {
	margin-left: 15px;
	margin-bottom: 0;
	margin-top: 5px;
	font-size: 1.8em;
	padding-bottom: .5em;
}
ul.menu_types {
	padding: 0 0 0 15px;
	width: 95%;
	margin: 0;
}
ul.menu_types li,
dl.menu_type dd ul li {
	width: 240px;
	list-style: none;
	display: block;
	float: left;
	margin-right: 10px;
}
ul.menu_types li {
	width: 47%;
}
dl.menu_type {
	width: 240px;
	margin: 0;
	padding: 0;
}
dl.menu_type dt {
	font-weight: bold;
	font-size: 1.5em;
	float: left;
	margin: 13px 0 5px 0;
	width: 240px;
}
dl.menu_type dd {
	clear: left;
	margin: 0;
}
dl.menu_type dd a {
	font-size: 1.2em;
}
dl.menu_type dd ul li {
	margin: 0;
}
ul#new-modules-list {
	padding: 5px 0 0 15px;
	width: 95%;
	margin: 0;
	list-style: none;
}
ul#new-modules-list li {
	list-style: none;
	display: block;
	float: left;
	margin: 0 20px 0 0;
	width: 47%;
}
ul#new-modules-list li a {
	font-size: 1em;
	line-height: 1.5em;
}
body.contentpane #filter-bar {
	font-size: 80%;
}
body.contentpane input,
body.contentpane select {
	font-size: 120%;
}
#filter-bar input,
#filter-bar select,
#filter-bar button {
	font-size: 110%;
}
#skiplinkholder a,
#skiplinkholder a:link,
#skiplinkholder a:visited {
	display: block;
	width: 99%;
	position: absolute;
	top: 0;
	left: -200%;
	z-index: 2;
}
#skiplinkholder a:focus,
#skiplinkholder a:active {
	left: 0;
	top: 0;
	z-index: 100;
}
#skiplinkholder p {
	margin: 0;
}
#skiptargetholder {
	position: absolute;
	left: -200%;
}
#skiplinkholder a,
#skiplinkholder a:link,
#skiplinkholder a:visited {
	text-decoration: underline;
	padding: 5px;
	font-size: 1.3em;
	font-weight: bold;
	padding-left: 20px;
	padding-right: 20px;
}
.body-overlayed a,
.body-overlayed input,
.body-overlayed button {
	visibility: hidden;
}
.body-overlayed #sbox-window a,
.body-overlayed #sbox-window input,
.body-overlayed #sbox-window button {
	visibility: visible;
}
.element-hidden,
.hide {
	display: none;
}
.hidebtn {
	border: 0 !important;
	padding: 0 !important;
	margin: 0;
	width: 0;
	height: 0;
}
.element-invisible,
.hidelabeltxt {
	height: 0;
	overflow: hidden;
	position: absolute;
	padding: 0;
	margin: 0;
}
legend.element-invisible {
	position: absolute !important;
	margin: 0;
	padding: 0;
	border: 0;
	margin-left: -10000px;
	font-size: 1px;
	height: 0;
}
fieldset.panelform {
	overflow: hidden;
	clear: both;
}
fieldset.adminform label,
fieldset.panelform label,
fieldset.adminform span.faux-label,
fieldset.panelform span.faux-label {
	line-height: 2em;
	clear: left;
	min-width: 12em;
	float: left;
	margin-left: 10px;
	margin-right: 5px;
}
fieldset.adminform.long label,
fieldset.panelform.long label,
fieldset.adminform.long span.faux-label,
fieldset.panelform.long span.faux-label {
	min-width: 18em;
}
fieldset.adminform fieldset.radio label,
fieldset.panelform fieldset.radio label,
fieldset.adminform fieldset.radio span.faux-label,
fieldset.panelform fieldset.radio span.faux-label {
	margin-left: 0;
}
fieldset.adminform input,
fieldset.adminform span.faux-input,
fieldset.adminform textarea,
fieldset.adminform select,
fieldset.adminform img,
fieldset.adminform button,
fieldset.panelform input,
fieldset.panelform span.faux-input,
fieldset.panelform textarea,
fieldset.panelform select,
fieldset.panelform img,
fieldset.panelform button {
	float: left;
	margin: 5px 5px 5px 0;
	width: auto;
}
fieldset.batch {
	margin: 20px 10px 10px 10px;
	padding: 10px;
}
fieldset.batch label {
	margin: 5px;
	min-width: 40px;
}
fieldset.batch button {
	margin: 3px;
}
fieldset#batch-choose-action {
	clear: left;
	border: 0 none;
}
fieldset.batch label {
	float: left;
	clear: none;
}
fieldset label#batch-choose-action-lbl {
	clear: left;
	margin-top: 15px;
}
label#batch-language-lbl,
label#batch-user-lbl {
	clear: left;
	margin-right: 10px;
	margin-top: 15px;
}
select#batch-language-id,
select#batch-user-id {
	margin-top: 15px;
}
select#batch-category-id,
select#batch-position-id,
select#batch-menu-id {
	margin-right: 30px;
}
fieldset.batch select,
fieldset.batch input,
fieldset.batch img,
fieldset.batch button {
	float: left;
}
label#batch-access-lbl,
label#batch-client-lbl {
	margin-right: 10px;
}
div#jform_ordering {
	font-size: 1.091em;
	margin-top: 3px;
}
#jform_impmade,
#jform_clicks {
	width: 30px;
}
fieldset.panelform label#jform-imp {
	min-width: 3em;
	font-size: 1.091em;
}
fieldset.adminform input#jform_clickurl {
	width: 20em;
}
a.move_up {
	display: inline-block;
	height: 16px;
	text-indent: -1000em;
	width: 16px;
}
span.move_up {
	display: inline-block;
	height: 16px;
	width: 16px;
}
a.move_down {
	display: inline-block;
	height: 16px;
	text-indent: -1000em;
	width: 16px;
}
span.move_down {
	display: inline-block;
	height: 16px;
	width: 16px;
}
a.grid_false {
	display: inline-block;
	height: 16px;
	text-indent: -1000em;
	width: 16px;
}
a.grid_true {
	display: inline-block;
	height: 16px;
	text-indent: -1000em;
	width: 16px;
}
a.grid_trash {
	display: inline-block;
	height: 16px;
	text-indent: -1000em;
	width: 16px;
}
div.acl-options {
	width: 100%;
}
table.aclsummary-table,
table.aclmodify-table {
	border-collapse: collapse;
	width: 100%;
	font-size: 1.091em;
}
td.col1 {
	font-size: 1.091em;
	text-align: left;
	padding: 4px;
}
table.aclsummary-table caption,
table.aclmodify-table caption {
	display: none;
}
table.aclsummary-table th.col1 {
	width: 25%;
}
table.aclsummary-table th.col2,
table.aclsummary-table th.col3,
table.aclsummary-table th.col4,
table.aclsummary-table th.col5,
table.aclsummary-table th.col6 {
	width: 15%;
	vertical-align: bottom;
	text-align: center;
}
span.icon-16-unset,
span.icon-16-allowed,
span.icon-16-denied,
span.icon-16-locked {
	padding-left: 18px;
}
label.icon-16-allow,
label.icon-16-deny,
a.icon-16-allow,
a.icon-16-deny,
a.icon-16-allowinactive,
a.icon-16-denyinactive {
	display: block;
	height: 16px;
	width: 16px;
	margin: 0 auto;
}
label.icon-16-allow {
	text-indent: -9999em;
	position: relative;
	left: 40%;
}
label.icon-16-deny {
	text-indent: -9999em;
	position: relative;
	left: 40%;
}
table.aclmodify-table th.col2,
table.aclmodify-table th.col3,
table.aclmodify-table th.col4 {
	width: 20%;
	vertical-align: bottom;
	text-align: center;
}
table.aclmodify-table select {
	margin: 1px;
}
table.aclsummary-table td label,
table.aclmodify-table td label {
	min-width: 20px;
}
ul.acllegend {
	list-style: none;
	font-size: 1.091em;
	padding-bottom: 10px;
}
ul.acllegend li {
	display: block;
	float: left;
	padding-right: 20px;
	margin: 15px 0 15px 10px;
}
ul.acllegend li.acl-allowed {
	padding-left: 20px;
	padding-right: 10px;
}
ul.acllegend li.acl-denied {
	padding-left: 20px;
	padding-right: 20px;
}
ul.acllegend li.acl-editgroups {
	padding-right: 10px;
}
ul.acllegend li.acl-resetbtn {
	padding-right: 0;
}
li.acl-editgroups,
li.acl-resetbtn {
	display: block;
	float: left;
	-moz-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
}
li.acl-editgroups a,
li.acl-resetbtn a {
	padding: 6px;
	cursor: default;
}
li.acl-editgroups a:hover,
li.acl-resetbtn a:hover,
li.acl-editgroups a:focus,
li.acl-resetbtn a:focus {
	text-decoration: none;
	cursor: default;
}
li.acl-editgroups:hover,
li.acl-resetbtn:hover,
li.acl-editgroups:focus,
li.acl-resetbtn:focus {
	text-decoration: none;
	cursor: default;
}
table#acl-config {
	width: 100%;
	margin-top: 15px;
}
table#acl-config th,
table#acl-config td {
	height: 2em;
	background: #f9fade;
	text-align: center;
	vertical-align: middle;
}
table#acl-config th.acl-groups {
	padding-left: 8px;
	font-weight: bold;
	text-align: left;
}
table#acl-config th.acl-groups span.gi {
	margin-right: 2px;
}
table#acl-config td {
	width: 9em;
}
table#acl-config td select {
	float: none;
}
.acl-action {
	font-size: 1.091em;
	margin: auto 0;
}
.acl-groups {
	font-size: 1.091em;
	font-weight: normal;
}
label#jform_rules-lbl {
	float: none;
	white-space: nowrap;
	display: none;
	visibility: hidden;
}
label#jform_filters-lbl {
	float: none;
	white-space: nowrap;
	display: none;
	visibility: hidden;
}
ul.config-option-list,
ul.config-option-list li {
	margin: 0;
	padding: 0;
	list-style: none;
}
ul.config-option-list fieldset {
	margin: 0;
	padding-left: 0;
	padding-right: 0;
}
#permissions-sliders {
	margin-top: 15px;
}
#permissions-sliders ul#rules,
#permissions-sliders ul#rules ul {
	margin: 0 !important;
	padding: 0 !important;
	list-style-type: none;
}
#permissions-sliders ul#rules li {
	margin: 0;
	padding: 0;
}
#permissions-sliders ul#rules table.group-rules {
	border-collapse: collapse;
	margin: 5px;
	width: 100%;
}
#permissions-sliders ul#rules table.group-rules td {
	padding: 4px;
	vertical-align: middle;
	text-align: left;
	overflow: hidden;
}
#permissions-sliders ul#rules table.group-rules th {
	font-size: 1.2em;
	overflow: hidden;
	font-weight: bold;
}
#permissions-sliders .panel {
	margin-bottom: 3px;
	margin-left: 0;
	border: 0;
}
#permissions-sliders p.rule-desc {
	font-size: 1.1em;
}
#permissions-sliders div.rule-notes {
	font-size: 1.1em;
}
ul#rules table.group-rules td label {
	margin: 0 !important;
	line-height: 1.1em;
}
ul#rules table.group-rules td span {
	font-size: 1.1em;
	padding-bottom: 4px;
}
ul#rules table.group-rules td span span {
	font-size: 100%;
}
table.group-rules td select {
	margin: 0 !important;
}
#permissions-sliders ul#rules .mypanel {
	padding: 0;
	line-height: 1.3em;
}
#permissions-sliders .mypanel table.group-rules caption {
	font-size: 1.3em;
}
#permissions-sliders ul#rules {
	padding: 5px;
}
#permissions-sliders ul#rules table.group-rules th {
	text-align: left;
	padding: 4px;
}
#permissions-sliders ul#rules table.group-rules td label {
	min-width: 1em;
}
#permissions-sliders .pane-toggler span {
	padding-left: 20px;
}
#permissions-sliders .pane-toggler-down span {
	padding-left: 20px;
}
#permissions-sliders .pane-toggler-down span.level,
#permissions-sliders .pane-toggler span.level {
	padding: 0;
}
.swatch {
	text-align: center;
	padding: 0 15px 0 15px;
}
dl.tabs dt h3 {
	padding: 0;
	font-size: 100%;
}
ul.helpmenu li {
	float: right;
	margin: 10px;
	padding: 0;
	list-style-type: none;
	font-weight: bold;
}
#menu {
	position: relative;
	z-index: 100;
	padding: 0;
	margin: 0;
	width: 100%;
	list-style: none;
	font-size: 1.2em;
	font-weight: bold;
}
#menu ul {
	padding: 0;
	margin: 0;
	list-style: none;
	font-size: 100%;
}
#menu ul li.separator {
	margin-bottom: 1em;
}
#menu a {
	padding: 0.35em 2.5em 0.35em 2em;
	vertical-align: middle;
	display: block;
	text-decoration: none;
	font-size: 100%;
}
#menu li {
	float: left;
	font-size: 100%;
}
#menu li a {
	white-space: nowrap;
}
#menu li li a {
	margin-bottom: 1px;
	margin-top: 1px;
	width: 10em;
}
#menu li.disabled a:hover,
#menu li.disabled a:focus,
#menu li.disabled a {
	cursor: default;
}
#menu li ul {
	position: absolute;
	width: 16em;
	margin-left: -1000em;
}
#menu li li {
	border: none;
	width: 16em;
}
#menu li ul ul {
	margin: -2.3em 0 0 -1000em;
}
#menu li:hover ul ul,
#menu li.sfhover ul ul {
	margin-left: -1000em;
}
#menu li:hover ul,
#menu li.sfhover ul {
	margin-left: 0;
}
#menu li li:hover ul,
#menu li li.sfhover ul {
	margin-left: 16em;
}
[class^="menu-"],
[class*=" menu-"] {
	background-position: 3px 50% !important;
}
.menu-archive {
	background-image: url(../images/menu/icon-16-archive.png);
}
.menu-article {
	background-image: url(../images/menu/icon-16-article.png);
}
.menu-associations {
	background-image: url(../images/menu/icon-16-assoc.png);
}
.menu-banners {
	background-image: url(../images/menu/icon-16-banner.png);
}
.menu-banners-clients {
	background-image: url(../images/menu/icon-16-banner-client.png);
}
.menu-banners-tracks {
	background-image: url(../images/menu/icon-16-banner-tracks.png);
}
.menu-banners-cat {
	background-image: url(../images/menu/icon-16-banner-categories.png);
}
.menu-category {
	background-image: url(../images/menu/icon-16-category.png);
}
.menu-checkin {
	background-image: url(../images/menu/icon-16-checkin.png);
}
.menu-clear {
	background-image: url(../images/menu/icon-16-clear.png);
}
.menu-component {
	background-image: url(../images/menu/icon-16-component.png);
}
.menu-config {
	background-image: url(../images/menu/icon-16-config.png);
}
.menu-contact {
	background-image: url(../images/menu/icon-16-contacts.png);
}
.menu-contact-cat {
	background-image: url(../images/menu/icon-16-contacts-categories.png);
}
.menu-content {
	background-image: url(../images/menu/icon-16-content.png);
}
.menu-cpanel {
	background-image: url(../images/menu/icon-16-cpanel.png);
}
.menu-default {
	background-image: url(../images/menu/icon-16-default.png);
}
.menu-featured {
	background-image: url(../images/menu/icon-16-featured.png);
}
.menu-fields {
	background-image: url(../images/menu/icon-16-puzzle.png);
}
.menu-groups {
	background-image: url(../images/menu/icon-16-groups.png);
}
.menu-help {
	background-image: url(../images/menu/icon-16-help.png);
}
.menu-help-this {
	background-image: url(../images/menu/icon-16-help-this.png);
}
.menu-help-forum {
	background-image: url(../images/menu/icon-16-help-forum.png);
}
.menu-help-docs {
	background-image: url(../images/menu/icon-16-help-docs.png);
}
.menu-help-jed {
	background-image: url(../images/menu/icon-16-help-jed.png);
}
.menu-help-jrd {
	background-image: url(../images/menu/icon-16-help-jrd.png);
}
.menu-help-community {
	background-image: url(../images/menu/icon-16-help-community.png);
}
.menu-help-security {
	background-image: url(../images/menu/icon-16-help-security.png);
}
.menu-help-dev {
	background-image: url(../images/menu/icon-16-help-dev.png);
}
.menu-help-shop {
	background-image: url(../images/menu/icon-16-help-shop.png);
}
.menu-info {
	background-image: url(../images/menu/icon-16-info.png);
}
.menu-install {
	background-image: url(../images/menu/icon-16-install.png);
}
.menu-joomlaupdate {
	background-image: url(../images/menu/icon-16-install.png);
}
.menu-language {
	background-image: url(../images/menu/icon-16-language.png);
}
.menu-levels {
	background-image: url(../images/menu/icon-16-levels.png);
}
.menu-logout {
	background-image: url(../images/menu/icon-16-logout.png);
}
.menu-maintenance {
	background-image: url(../images/menu/icon-16-maintenance.png);
}
.menu-massmail {
	background-image: url(../images/menu/icon-16-massmail.png);
}
.menu-media {
	background-image: url(../images/menu/icon-16-media.png);
}
.menu-menu {
	background-image: url(../images/menu/icon-16-menu.png);
}
.menu-menumgr {
	background-image: url(../images/menu/icon-16-menumgr.png);
}
.menu-messages {
	background-image: url(../images/menu/icon-16-messaging.png);
}
.menu-messages-add {
	background-image: url(../images/menu/icon-16-new-privatemessage.png);
}
.menu-messages-read {
	background-image: url(../images/menu/icon-16-messages.png);
}
.menu-module {
	background-image: url(../images/menu/icon-16-module.png);
}
.menu-newarticle {
	background-image: url(../images/menu/icon-16-newarticle.png);
}
.menu-newcategory {
	background-image: url(../images/menu/icon-16-newcategory.png);
}
.menu-newgroup {
	background-image: url(../images/menu/icon-16-newgroup.png);
}
.menu-newlevel {
	background-image: url(../images/menu/icon-16-newlevel.png);
}
.menu-newuser {
	background-image: url(../images/menu/icon-16-newuser.png);
}
.menu-plugin {
	background-image: url(../images/menu/icon-16-plugin.png);
}
.menu-profile {
	background-image: url(../images/menu/icon-16-user.png);
}
.menu-purge {
	background-image: url(../images/menu/icon-16-purge.png);
}
.menu-readmess {
	background-image: url(../images/menu/icon-16-readmess.png);
}
.menu-section {
	background-image: url(../images/menu/icon-16-section.png);
}
.menu-static {
	background-image: url(../images/menu/icon-16-static.png);
}
.menu-stats {
	background-image: url(../images/menu/icon-16-stats.png);
}
.menu-themes {
	background-image: url(../images/menu/icon-16-themes.png);
}
.menu-trash {
	background-image: url(../images/menu/icon-16-trash.png);
}
.menu-user {
	background-image: url(../images/menu/icon-16-user.png);
}
.menu-user-note {
	background-image: url(../images/menu/icon-16-user-note.png);
}
.menu-delete {
	background-image: url(../images/menu/icon-16-delete.png);
}
.menu-help-trans {
	background-image: url(../images/menu/icon-16-help-trans.png);
}
.menu-newsfeeds {
	background-image: url(../images/menu/icon-16-newsfeeds.png);
}
.menu-newsfeeds-cat {
	background-image: url(../images/menu/icon-16-newsfeeds-cat.png);
}
.menu-redirect {
	background-image: url(../images/menu/icon-16-redirect.png);
}
.menu-search {
	background-image: url(../images/menu/icon-16-search.png);
}
.menu-finder {
	background-image: url(../images/menu/icon-16-search.png);
}
.menu-weblinks {
	background-image: url(../images/menu/icon-16-links.png);
}
.menu-weblinks-cat {
	background-image: url(../images/menu/icon-16-links-cat.png);
}
.menu-tags {
	background-image: url(../images/menu/icon-16-tags.png);
}
.menu-postinstall {
	background-image: url(../images/menu/icon-16-generic.png);
}
.icon-32-cog {
	background-image: url(../images/toolbar/icon-32-cog.png);
}
#menu li a:focus+ul {
	margin-left: 0;
}
#menu li li a:focus+ul {
	margin-left: 1016em;
}
#menu li li a:focus {
	margin-left: 1000em;
	width: 10em;
}
#menu li li li a:focus {
	margin-left: 2016em;
	width: 10em;
}
#menu li:hover a:focus,
#menu li.sfhover a.sffocus {
	margin-left: 0;
}
#menu li li:hover a:focus+ul,
#menu li li.sfhover a.sffocus+ul {
	margin-left: 16em;
}
#sidebar {
	float: left;
	margin: 15px 5px;
}
#submenu {
	list-style: none;
	padding: 0;
	margin: 0;
	padding-bottom: 2.5em;
	line-height: 2em;
}
#submenu ul,
#submenu li {
	display: inline;
	list-style-type: none;
	margin: 0;
	padding: 0;
}
#submenu li,
#submenu span.nolink {
	float: left;
	font-weight: bold;
	margin-right: 8px;
	padding: 2px 10px 2px 10px;
	text-decoration: none;
	cursor: pointer;
	-moz-border-radius-topright: 3px;
	-moz-border-radius-topleft: 3px;
	-webkit-border-top-right-radius: 3px;
	-webkit-border-top-left-radius: 3px;
	border-top-right-radius: 3px;
	border-top-left-radius: 3px;
}
#submenu span.nolink {
	color: #999;
}
#submenu li.active,
#submenu span.nolink.active {
	cursor: default;
}
#submenu li.active a,
#submenu span.nolink.active,
#submenu li a:hover,
#submenu li a:focus {
	text-decoration: none;
}
.red {
	font-weight: bold;
	color: #c00;
}
.pre_message {
	font-size: 1.3em;
}
span.update-badge {
	background-image: -moz-linear-gradient(center bottom,#FF0000 41%,#FC7E7E 79%);
	background-image: -webkit-gradient(linear,left bottom,left top,color-stop(0.41,#ff0000),color-stop(0.79,#fc7e7e));
	border: 2px solid white;
	border-radius: 1.5em 1.5em 1.5em 1.5em;
	color: white;
	display: block;
	float: left;
	font-size: 1.2em;
	font-weight: bold;
	height: 1.2em;
	left: 60px;
	min-width: 1em;
	padding: 0 0.1em 0;
	position: relative;
	top: -88px;
}
.unotes ul,
.unotes ol {
	list-style: none;
	list-style-position: inside;
	padding-left: 0;
	padding-right: 0;
}
.unotes div.utitle {
	padding: 10px;
	float: left;
	font-size: 1.2em;
	line-height: 1.2em;
}
.unotes h4 {
	margin-top: 0;
	margin-bottom: 0;
	font-size: 1.3em;
}
.unotes .ubody {
	padding-left: 10px;
	padding-right: 10px;
	font-size: 1.2em;
	line-height: 1.5em;
}
.unotes p {
	padding-bottom: 10px;
}
div#database-sliders {
	margin: 10px;
}
fieldset.uploadform {
	margin-top: 10px;
	margin-bottom: 10px;
	min-height: 200px;
}
#installer-database,
#installer-discover,
#installer-update,
#installer-warnings {
	margin-top: 10px;
}
#installer-database #sidebar {
	float: none;
}
#installer-database p.warning {
	padding-left: 20px;
}
#installer-database p.nowarning {
	padding-left: 20px;
}
.joomlaupdate_spinner {
	float: left;
	margin-right: 15px;
}
.btn-group {
	position: relative;
	display: inline-block;
}
.btn-group + .btn-group {
	margin-left: 5px;
}
.btn-group > .btn {
	position: relative;
	float: left;
	margin-left: -1px;
}
.icon-48-cpanel {
	height: 50px;
	width: 50%;
}
.well {
	min-height: 20px;
	padding: 19px;
	margin-bottom: 20px;
	background-color: #f5f5f5;
	border: 1px solid #eee;
	border: 1px solid rgba(0,0,0,0.05);
	-webkit-border-radius: 4px;
	-moz-border-radius: 4px;
	border-radius: 4px;
	-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
	-moz-box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
	box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
}
.well blockquote {
	border-color: #ddd;
	border-color: rgba(0,0,0,0.15);
}
.well-large {
	padding: 24px;
	-webkit-border-radius: 6px;
	-moz-border-radius: 6px;
	border-radius: 6px;
}
.well-small {
	padding: 9px;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.list-striped,
.row-striped {
	list-style: none;
	line-height: 18px;
	text-align: left;
	vertical-align: middle;
	border-top: 1px solid #dddddd;
	margin-left: 0;
	font-size: 1.2em;
	padding: 9px;
}
.list-striped li,
.list-striped dd,
.row-striped .row,
.row-striped .row-fluid {
	border-bottom: 1px solid #dddddd;
	padding: 8px;
}
.list-striped li:nth-child(odd),
.list-striped dd:nth-child(odd),
.row-striped .row:nth-child(odd),
.row-striped .row-fluid:nth-child(odd) {
	background-color: #f9f9f9;
}
.list-striped li:hover,
.list-striped dd:hover,
.row-striped .row:hover,
.row-striped .row-fluid:hover {
	background-color: #f5f5f5;
}
.row-striped .row-fluid {
	width: 100%;
	box-sizing: border-box;
}
.row-striped .row-fluid [class*="span"] {
	min-height: 10px;
}
.alert {
	padding: 8px 35px 8px 14px;
	margin-bottom: 18px;
	text-shadow: 0 1px 0 rgba(255,255,255,0.5);
	background-color: #fcf8e3;
	border: 1px solid #fbeed5;
	-webkit-border-radius: 4px;
	-moz-border-radius: 4px;
	border-radius: 4px;
	color: #c09853;
	font-size: 120%;
}
.alert-heading {
	color: inherit;
}
.alert .close {
	position: relative;
	right: -30px;
	top: -5px;
	line-height: 18px;
	float: right;
	font-size: 20px;
	font-weight: bold;
}
.alert-success {
	background-color: #dff0d8;
	border-color: #d6e9c6;
	color: #468847;
}
.alert-danger,
.alert-error {
	background-color: #f2dede;
	border-color: #eed3d7;
	color: #b94a48;
}
.alert-info {
	background-color: #d9edf7;
	border-color: #bce8f1;
	color: #3a87ad;
}
.alert-block {
	padding-top: 14px;
	padding-bottom: 14px;
}
.alert-block > p,
.alert-block > ul {
	margin-bottom: 0;
}
.alert-block p + p {
	margin-top: 5px;
}
.btn-group > .btn:hover,
.btn-group > .btn:focus,
.btn-group > .btn:active,
.btn-group > .btn.active {
	z-index: 2;
}
.btn-group > .btn {
	position: relative;
	float: left;
	margin-left: -1px;
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
table {
	max-width: 100%;
	background-color: transparent;
	border-collapse: collapse;
	border-spacing: 0;
}
.table {
	width: 100%;
	margin-bottom: 18px;
}
.tab-content > .tab-pane,
.pill-content > .pill-pane {
	display: none;
}
.tab-content > .active,
.pill-content > .active {
	display: block;
}
.tabs-below > .nav-tabs {
	border-top: 1px solid #ddd;
}
#status .btn-toolbar,
#status p {
	margin: 0px;
}
.navbar .btn-group {
	margin: 0;
	padding: 5px 5px 6px;
}
.media .btn {
	margin: 10px 20px;
}
.thumbnails > li {
	list-style: none outside none;
	float: left;
	margin-bottom: 18px;
	margin-left: 20px;
}
#mediamanager-form {
	margin: 10px;
}
.is-tagbox {
	float: left;
}
.item-associations {
	margin: 0;
}
.item-associations li {
	list-style: none;
	display: inline-block;
	margin: 0 0 3px 0;
}
.item-associations li a,
table.adminlist .item-associations li a {
	color: #ffffff;
}
.hidden {
	display: none;
	visibility: hidden;
}
.tooltip {
	position: absolute;
	z-index: 1030;
	display: block;
	visibility: visible;
	font-size: 11px;
	line-height: 1.4;
	opacity: 0;
	filter: alpha(opacity=0);
}
.tooltip.in {
	opacity: 0.8;
	filter: alpha(opacity=80);
}
.tooltip.top {
	margin-top: -3px;
	padding: 5px 0;
}
.tooltip.right {
	margin-left: 3px;
	padding: 0 5px;
}
.tooltip.bottom {
	margin-top: 3px;
	padding: 5px 0;
}
.tooltip.left {
	margin-left: -3px;
	padding: 0 5px;
}
.tooltip-inner {
	max-width: 200px;
	padding: 8px;
	color: #ffffff;
	text-align: center;
	text-decoration: none;
	background-color: #000000;
	-webkit-border-radius: 4px;
	-moz-border-radius: 4px;
	border-radius: 4px;
}
.tooltip-arrow {
	position: absolute;
	width: 0;
	height: 0;
	border-color: transparent;
	border-style: solid;
}
.tooltip.top .tooltip-arrow {
	bottom: 0;
	left: 50%;
	margin-left: -5px;
	border-width: 5px 5px 0;
	border-top-color: #000000;
}
.tooltip.right .tooltip-arrow {
	top: 50%;
	left: 0;
	margin-top: -5px;
	border-width: 5px 5px 5px 0;
	border-right-color: #000000;
}
.tooltip.left .tooltip-arrow {
	top: 50%;
	right: 0;
	margin-top: -5px;
	border-width: 5px 0 5px 5px;
	border-left-color: #000000;
}
.tooltip.bottom .tooltip-arrow {
	top: 0;
	left: 50%;
	margin-left: -5px;
	border-width: 0 5px 5px;
	border-bottom-color: #000000;
}
.tooltip {
	max-width: 400px;
}
.tooltip-inner {
	max-width: none;
	text-align: left;
	text-shadow: none;
}
th .tooltip-inner {
	font-weight: normal;
}
.tooltip.hasimage {
	opacity: 1;
}
fieldset.panelform .tooltip img {
	float: none;
	margin: 0;
}
div.toggle-editor {
	float: right;
}
.text-left {
	text-align: left;
}
.text-right {
	text-align: right;
}
.text-center {
	text-align: center;
}
.module-edit {
	display: inline-block;
}
.break-word {
	word-break: break-all;
	word-wrap: break-word;
}
.muted {
	color: #999;
}
.popover-content {
	min-height: 33px;
}
templates/hathor/css/ie8.css000060400000001000152453623430012010 0ustar00@charset "UTF-8";

/**
 * @package		Joomla.Administrator
 * @subpackage	templates.hathor
 * @copyright	(C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @since		1.6
 *
 * CSS file for IE8
 */

/**
 * Special Styles for Internet Explorer 8
 */

/* Accessibility: css in template.css for slider keyboard
 * has to be reversed here or the mouse does not work for ie */
.pane-toggler + div.pane-slider {
	/*display: block;*/
}
templates/hathor/css/colour_brown.css000060400000133523152453623430014055 0ustar00.clearfix {
	*zoom: 1;
}
.clearfix:before,
.clearfix:after {
	display: table;
	content: "";
	line-height: 0;
}
.clearfix:after {
	clear: both;
}
.hide-text {
	font: 0/0 a;
	color: transparent;
	text-shadow: none;
	background-color: transparent;
	border: 0;
}
.input-block-level {
	display: block;
	width: 100%;
	min-height: 25px;
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
}
#form-login .btn {
	display: inline-block;
	*display: inline;
	*zoom: 1;
	padding: 4px 14px;
	margin-bottom: 0;
	font-size: 13px;
	line-height: 15px;
	*line-height: 15px;
	text-align: center;
	vertical-align: middle;
	cursor: pointer;
	color: #333333;
	text-shadow: 0 1px 1px rgba(255,255,255,0.75);
	background-color: #f5f5f5;
	background-image: -moz-linear-gradient(top,#ffffff,#e6e6e6);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#ffffff),to(#e6e6e6));
	background-image: -webkit-linear-gradient(top,#ffffff,#e6e6e6);
	background-image: -o-linear-gradient(top,#ffffff,#e6e6e6);
	background-image: linear-gradient(to bottom,#ffffff,#e6e6e6);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe5e5e5', GradientType=0);
	border-color: #e6e6e6 #e6e6e6 #bfbfbf;
	*background-color: #e6e6e6;
	filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
	border: 1px solid #bbb;
	*border: 0;
	border-bottom-color: #a2a2a2;
	-webkit-border-radius: 4px;
	-moz-border-radius: 4px;
	border-radius: 4px;
	*margin-left: .3em;
	-webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
	-moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
	box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
}
#form-login .btn:hover,
#form-login .btn:focus,
#form-login .btn:active,
#form-login .btn.active,
#form-login .btn.disabled,
#form-login .btn[disabled] {
	color: #333333;
	background-color: #e6e6e6;
	*background-color: #d9d9d9;
}
#form-login .btn:active,
#form-login .btn.active {
	background-color: #cccccc \9;
}
#form-login .btn:first-child {
	*margin-left: 0;
}
#form-login .btn:hover {
	color: #333333;
	text-decoration: none;
	background-color: #e6e6e6;
	*background-color: #d9d9d9;
	background-position: 0 -15px;
	-webkit-transition: background-position .1s linear;
	-moz-transition: background-position .1s linear;
	-o-transition: background-position .1s linear;
	transition: background-position .1s linear;
}
#form-login .btn:focus {
	outline: thin dotted #333;
	outline: 5px auto -webkit-focus-ring-color;
	outline-offset: -2px;
}
#form-login .btn.active,
#form-login .btn:active {
	background-color: #e6e6e6;
	background-color: #d9d9d9 \9;
	background-image: none;
	outline: 0;
	-webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
	-moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
	box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
}
#form-login .btn.disabled,
#form-login .btn[disabled] {
	cursor: default;
	background-color: #e6e6e6;
	background-image: none;
	opacity: 0.65;
	filter: alpha(opacity=65);
	-webkit-box-shadow: none;
	-moz-box-shadow: none;
	box-shadow: none;
}
.btn-large {
	padding: 9px 14px;
	font-size: 15px;
	line-height: normal;
	-webkit-border-radius: 5px;
	-moz-border-radius: 5px;
	border-radius: 5px;
}
.btn-large [class^="icon-"] {
	margin-top: 2px;
}
.input-append input[class*="span"],
.input-append .uneditable-input[class*="span"],
.input-prepend input[class*="span"],
.input-prepend .uneditable-input[class*="span"],
.row-fluid input[class*="span"],
.row-fluid select[class*="span"],
.row-fluid textarea[class*="span"],
.row-fluid .uneditable-input[class*="span"],
.row-fluid .input-prepend [class*="span"],
.row-fluid .input-append [class*="span"] {
	display: inline-block;
}
.input-append,
.input-prepend {
	margin-bottom: 5px;
	font-size: 0;
	white-space: nowrap;
}
.input-append input,
.input-append select,
.input-append .uneditable-input,
.input-prepend input,
.input-prepend select,
.input-prepend .uneditable-input {
	position: relative;
	margin-bottom: 0;
	*margin-left: 0;
	font-size: 13px;
	vertical-align: top;
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.input-append input:focus,
.input-append select:focus,
.input-append .uneditable-input:focus,
.input-prepend input:focus,
.input-prepend select:focus,
.input-prepend .uneditable-input:focus {
	z-index: 2;
}
.input-append .add-on,
.input-prepend .add-on {
	display: inline-block;
	width: auto;
	height: 15px;
	min-width: 16px;
	padding: 4px 5px;
	font-size: 13px;
	font-weight: normal;
	line-height: 15px;
	text-align: center;
	text-shadow: 0 1px 0 #ffffff;
	background-color: #eeeeee;
	border: 1px solid #ccc;
}
.input-append .add-on,
.input-append .btn,
.input-prepend .add-on,
.input-prepend .btn {
	margin-left: -1px;
	vertical-align: top;
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.input-append .active,
.input-prepend .active {
	background-color: #a9dba9;
	border-color: #46a546;
}
.input-prepend .add-on,
.input-prepend .btn {
	margin-right: -1px;
}
.input-prepend .add-on:first-child,
.input-prepend .btn:first-child {
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
}
.input-append input,
.input-append select,
.input-append .uneditable-input {
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
}
.input-append .add-on:last-child,
.input-append .btn:last-child {
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.input-prepend.input-append input,
.input-prepend.input-append select,
.input-prepend.input-append .uneditable-input {
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.input-prepend.input-append .add-on:first-child,
.input-prepend.input-append .btn:first-child {
	margin-right: -1px;
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
}
.input-prepend.input-append .add-on:last-child,
.input-prepend.input-append .btn:last-child {
	margin-left: -1px;
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.form-search .input-append .search-query,
.form-search .input-prepend .search-query {
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.form-search .input-append .search-query {
	-webkit-border-radius: 14px 0 0 14px;
	-moz-border-radius: 14px 0 0 14px;
	border-radius: 14px 0 0 14px;
}
.form-search .input-append .btn {
	-webkit-border-radius: 0 14px 14px 0;
	-moz-border-radius: 0 14px 14px 0;
	border-radius: 0 14px 14px 0;
}
.form-search .input-prepend .search-query {
	-webkit-border-radius: 0 14px 14px 0;
	-moz-border-radius: 0 14px 14px 0;
	border-radius: 0 14px 14px 0;
}
.form-search .input-prepend .btn {
	-webkit-border-radius: 14px 0 0 14px;
	-moz-border-radius: 14px 0 0 14px;
	border-radius: 14px 0 0 14px;
}
.form-search input,
.form-search textarea,
.form-search select,
.form-search .help-inline,
.form-search .uneditable-input,
.form-search .input-prepend,
.form-search .input-append,
.form-inline input,
.form-inline textarea,
.form-inline select,
.form-inline .help-inline,
.form-inline .uneditable-input,
.form-inline .input-prepend,
.form-inline .input-append,
.form-horizontal input,
.form-horizontal textarea,
.form-horizontal select,
.form-horizontal .help-inline,
.form-horizontal .uneditable-input,
.form-horizontal .input-prepend,
.form-horizontal .input-append {
	display: inline-block;
	*display: inline;
	*zoom: 1;
	margin-bottom: 0;
	vertical-align: middle;
}
.form-search .hide,
.form-inline .hide,
.form-horizontal .hide {
	display: none;
}
.form-search .input-append,
.form-inline .input-append,
.form-search .input-prepend,
.form-inline .input-prepend {
	margin-bottom: 0;
}
.element-invisible {
	position: absolute;
	padding: 0 !important;
	margin: 0 !important;
	border: 0;
	height: 1px;
	width: 1px !important;
	overflow: hidden;
}
#form-login select,
#form-login input[type="text"],
#form-login input[type="password"] {
	display: inline-block;
	padding: 4px 6px;
	margin-bottom: 9px;
	font-size: 13px;
	line-height: 15px;
	color: #555555;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
	width: 175px;
}
.subform-repeatable-wrapper div.btn-toolbar {
	float: none;
}
.subform-repeatable-wrapper .text-right {
	text-align: right;
}
.subform-repeatable-wrapper .ui-sortable-helper {
	background: #ffffff;
}
.subform-repeatable-wrapper tr.ui-sortable-helper {
	display: table;
}
.subform-repeatable-wrapper .subform-repeatable-group {
	clear: both;
}
.label,
.badge {
	display: inline-block;
	padding: 2px 4px;
	font-size: 10.998px;
	font-weight: bold;
	line-height: 14px;
	color: #ffffff;
	vertical-align: baseline;
	white-space: nowrap;
	text-shadow: 0 -1px 0 rgba(0,0,0,0.25);
	background-color: #999999;
}
.label {
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.badge {
	padding-left: 9px;
	padding-right: 9px;
	-webkit-border-radius: 9px;
	-moz-border-radius: 9px;
	border-radius: 9px;
}
.label:empty,
.badge:empty {
	display: none;
}
a.label:hover,
a.label:focus,
a.badge:hover,
a.badge:focus {
	color: #ffffff;
	text-decoration: none;
	cursor: pointer;
}
.label-important,
.badge-important {
	background-color: #a20000;
}
.label-important[href],
.badge-important[href] {
	background-color: #6f0000;
}
.label-warning,
.badge-warning {
	background-color: #f89406;
}
.label-warning[href],
.badge-warning[href] {
	background-color: #c67605;
}
.label-success,
.badge-success {
	background-color: #005800;
}
.label-success[href],
.badge-success[href] {
	background-color: #002500;
}
.label-info,
.badge-info {
	background-color: #3a87ad;
}
.label-info[href],
.badge-info[href] {
	background-color: #2d6987;
}
.label-inverse,
.badge-inverse {
	background-color: #333333;
}
.label-inverse[href],
.badge-inverse[href] {
	background-color: #1a1a1a;
}
.btn .label,
.btn .badge {
	position: relative;
	top: -1px;
}
.btn-mini .label,
.btn-mini .badge {
	top: 0;
}
body {
	background-color: #ffffff;
	color: #2c2c2c;
}
h1 {
	color: #2c2c2c;
}
a:link {
	color: #054993;
}
a:visited {
	color: #054993;
}
#header {
	background: #ffffff url(../images/j_logo.png) no-repeat;
}
#header h1.title {
	color: #2c2c2c;
}
#nav {
	background-color: #d5c1b2;
	background-image: -moz-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#d5c1b2),to(#d5c1b2));
	background-image: -webkit-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -o-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: linear-gradient(to bottom,#d5c1b2,#d5c1b2);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd5c1b2', endColorstr='#ffd5c1b2', GradientType=0);
	border: 1px solid #000000;
}
#content {
	background: #ffffff;
}
#no-submenu {
	border-bottom: 1px solid #000000;
}
#element-box {
	background: #ffffff;
	border-right: 1px solid #000000;
	border-bottom: 1px solid #000000;
	border-left: 1px solid #000000;
}
#element-box.login {
	border-top: 1px solid #000000;
}
.enabled,
.success,
.allow,
span.writable {
	color: #005800;
}
.disabled,
p.error,
.warning,
.deny,
span.unwritable {
	color: #a20000;
}
.nowarning {
	color: #2c2c2c;
}
.none,
.protected {
	color: #000000;
}
span.note {
	background: #ffffff;
	color: #2c2c2c;
}
div.checkin-tick {
	background: url(../images/admin/tick.png) 20px 50% no-repeat;
}
.ol-foreground {
	background-color: #d5c1b2;
}
.ol-background {
	background-color: #005800;
}
.ol-textfont {
	color: #2c2c2c;
}
.ol-captionfont {
	color: #ffffff;
}
.ol-captionfont a {
	color: #054993;
}
div.subheader .padding {
	background: #ffffff;
}
.pagetitle h2 {
	color: #2c2c2c;
}
div.configuration {
	color: #2c2c2c;
	background-image: url(../images/menu/icon-16-config.png);
	background-repeat: no-repeat;
}
div.toolbar-box {
	border-right: 1px solid #000000;
	border-bottom: 1px solid #000000;
	border-left: 1px solid #000000;
	background: #ffffff;
}
div.toolbar-list li {
	color: #2c2c2c;
}
div.toolbar-list li.divider {
	border-right: 1px dotted #e5d9c3;
}
div.toolbar-list a {
	border-left: 1px solid #e5d9c3;
	border-top: 1px solid #e5d9c3;
	border-right: 1px solid #000000;
	border-bottom: 1px solid #000000;
	background: #d5c1b2;
}
div.toolbar-list a:hover {
	border-left: 1px solid #868778;
	border-top: 1px solid #868778;
	border-right: 1px solid #f6f7db;
	border-bottom: 1px solid #f6f7db;
	background: #e5d9c3;
	color: #054993;
}
div.btn-toolbar {
	margin-left: 5px;
	padding-top: 3px;
}
div.btn-toolbar li.divider {
	border-right: 1px dotted #e5d9c3;
}
div.btn-toolbar div.btn-group button {
	border-left: 1px solid #e5d9c3;
	border-top: 1px solid #e5d9c3;
	border-right: 1px solid #000000;
	border-bottom: 1px solid #000000;
	background-color: #d5c1b2;
	background-image: -moz-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#d5c1b2),to(#d5c1b2));
	background-image: -webkit-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -o-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: linear-gradient(to bottom,#d5c1b2,#d5c1b2);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd5c1b2', endColorstr='#ffd5c1b2', GradientType=0);
	padding: 5px 4px 5px 4px;
}
div.btn-toolbar div.btn-group button:hover {
	border-left: 1px solid #868778;
	border-top: 1px solid #868778;
	border-right: 1px solid #f6f7db;
	border-bottom: 1px solid #f6f7db;
	background: #e5d9c3;
	color: #054993;
	cursor: pointer;
}
div.btn-toolbar a {
	border-left: 1px solid #e5d9c3;
	border-top: 1px solid #e5d9c3;
	border-right: 1px solid #000000;
	border-bottom: 1px solid #000000;
	background-color: #d5c1b2;
	background-image: -moz-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#d5c1b2),to(#d5c1b2));
	background-image: -webkit-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -o-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: linear-gradient(to bottom,#d5c1b2,#d5c1b2);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd5c1b2', endColorstr='#ffd5c1b2', GradientType=0);
	padding: 6px 5px;
	text-align: center;
	white-space: nowrap;
	font-size: 1.2em;
	text-decoration: none;
}
div.btn-toolbar a:hover {
	border-left: 1px solid #868778;
	border-top: 1px solid #868778;
	border-right: 1px solid #f6f7db;
	border-bottom: 1px solid #f6f7db;
	background: #e5d9c3;
	color: #054993;
	cursor: pointer;
}
div.btn-toolbar div.btn-group button.inactive {
	background: #d5c1b2;
}
.pane-sliders .title {
	color: #2c2c2c;
}
.pane-sliders .panel {
	border: 1px solid #000000;
}
.pane-sliders .panel h3 {
	background-color: #d5c1b2;
	background-image: -moz-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#d5c1b2),to(#d5c1b2));
	background-image: -webkit-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -o-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: linear-gradient(to bottom,#d5c1b2,#d5c1b2);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd5c1b2', endColorstr='#ffd5c1b2', GradientType=0);
	color: #054993;
}
.pane-sliders .panel h3:hover {
	background: #e5d9c3;
}
.pane-sliders .panel h3:hover a {
	text-decoration: none;
}
.pane-sliders .adminlist {
	border: 0 none;
}
.pane-sliders .adminlist td {
	border: 0 none;
}
.pane-toggler span {
	background: transparent url(../images/j_arrow.png) 5px 50% no-repeat;
}
.pane-toggler-down span {
	background: transparent url(../images/j_arrow_down.png) 5px 50% no-repeat;
}
.pane-toggler-down {
	border-bottom: 1px solid #000000;
}
dl.tabs dt {
	border: 1px solid #000000;
	background-color: #d5c1b2;
	background-image: -moz-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#d5c1b2),to(#d5c1b2));
	background-image: -webkit-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -o-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: linear-gradient(to bottom,#d5c1b2,#d5c1b2);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd5c1b2', endColorstr='#ffd5c1b2', GradientType=0);
	color: #054993;
}
dl.tabs dt:hover {
	background: #e5d9c3;
}
dl.tabs dt.open {
	background: #ffffff;
	border-bottom: 1px solid #ffffff;
	color: #2c2c2c;
}
dl.tabs dt.open a:visited {
	color: #2c2c2c;
}
dl.tabs dt a:hover {
	text-decoration: none;
}
dl.tabs dt a:focus {
	text-decoration: underline;
}
div.current {
	border: 1px solid #000000;
	background: #ffffff;
}
div.current fieldset {
	border: none 0;
}
div.current fieldset.adminform {
	border: 1px solid #000000;
}
#login-page .pagetitle h2 {
	background: transparent;
}
#login-page #header {
	border-bottom: 1px solid #000000;
}
#login-page #lock {
	background: url(../images/j_login_lock.png) 50% 0 no-repeat;
}
#login-page #element-box.login {
	background-color: #d5c1b2;
	background-image: -moz-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#d5c1b2),to(#d5c1b2));
	background-image: -webkit-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -o-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: linear-gradient(to bottom,#d5c1b2,#d5c1b2);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd5c1b2', endColorstr='#ffd5c1b2', GradientType=0);
}
#form-login {
	background: #ffffff;
	border: 1px solid #000000;
}
#form-login label {
	color: #2c2c2c;
}
#form-login div.button1 a {
	color: #054993;
}
#cpanel div.icon a,
.cpanel div.icon a {
	color: #054993;
	border-left: 1px solid #e5d9c3;
	border-top: 1px solid #e5d9c3;
	border-right: 1px solid #000000;
	border-bottom: 1px solid #000000;
	background-color: #d5c1b2;
	background-image: -moz-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#d5c1b2),to(#d5c1b2));
	background-image: -webkit-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -o-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: linear-gradient(to bottom,#d5c1b2,#d5c1b2);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd5c1b2', endColorstr='#ffd5c1b2', GradientType=0);
}
#cpanel div.icon a:hover,
#cpanel div.icon a:focus,
.cpanel div.icon a:hover,
.cpanel div.icon a:focus {
	border-left: 1px solid #868778;
	border-top: 1px solid #868778;
	border-right: 1px solid #f6f7db;
	border-bottom: 1px solid #f6f7db;
	color: #054993;
	background: #e5d9c3;
}
fieldset {
	border: 1px #000000 solid;
}
legend {
	color: #2c2c2c;
}
fieldset ul.checklist input:focus {
	outline: thin dotted #2c2c2c;
}
fieldset#filter-bar {
	border-top: 0 solid #000000;
	border-right: 0 solid #000000;
	border-bottom: 1px solid #000000;
	border-left: 0 solid #000000;
}
fieldset#filter-bar ol,
fieldset#filter-bar ul {
	border: 0;
}
fieldset#filter-bar ol li fieldset,
fieldset#filter-bar ul li fieldset {
	border: 0;
}
.invalid {
	color: #a20000;
}
input.invalid {
	border: 1px solid #a20000;
}
input.readonly,
span.faux-input {
	border: 0;
}
input.required {
	background-color: #e5f0fa;
}
input.disabled {
	background-color: #eeeeee;
}
input,
select,
span.faux-input {
	background-color: #ffffff;
	border: 1px solid #000000;
}
input[type="button"],
input[type="submit"],
input[type="reset"] {
	color: #054993;
	background-color: #d5c1b2;
	background-image: -moz-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#d5c1b2),to(#d5c1b2));
	background-image: -webkit-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -o-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: linear-gradient(to bottom,#d5c1b2,#d5c1b2);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd5c1b2', endColorstr='#ffd5c1b2', GradientType=0);
}
input[type="button"]:hover,
input[type="button"]:focus,
input[type="submit"]:hover,
input[type="submit"]:focus,
input[type="reset"]:hover,
input[type="reset"]:focus {
	background: #e5d9c3;
}
textarea {
	background-color: #ffffff;
	border: 1px solid #000000;
}
input:focus,
select:focus,
textarea:focus,
option:focus,
input:hover,
select:hover,
textarea:hover,
option:hover {
	background-color: #e5d9c3;
	color: #054993;
}
.paramrules {
	background: #d5c1b2;
}
span.gi {
	color: #000000;
}
table.admintable td.key,
table.admintable td.paramlist_key {
	background-color: #d5c1b2;
	color: #2c2c2c;
	border-bottom: 1px solid #000000;
	border-right: 1px solid #000000;
}
table.paramlist td.paramlist_description {
	background-color: #d5c1b2;
	color: #2c2c2c;
	border-bottom: 1px solid #000000;
	border-right: 1px solid #000000;
}
fieldset.adminform {
	border: 1px solid #000000;
}
table.adminform {
	background-color: #ffffff;
}
table.adminform tr.row0 {
	background-color: #ffffff;
}
table.adminform tr.row1 {
	background-color: #e5d9c3;
}
table.adminform th {
	color: #2c2c2c;
	background: #ffffff;
}
table.adminform tr {
	border-bottom: 1px solid #000000;
	border-right: 1px solid #000000;
}
table.adminlist {
	border-spacing: 1px;
	background-color: #ffffff;
	color: #2c2c2c;
}
table.adminlist.modal {
	border-top: 1px solid #000000;
	border-right: 1px solid #000000;
	border-left: 1px solid #000000;
}
table.adminlist a {
	color: #054993;
}
table.adminlist thead th {
	background: #ffffff;
	color: #2c2c2c;
	border-bottom: 1px solid #000000;
}
table.adminlist tbody tr {
	background: #ffffff;
}
table.adminlist tbody tr.row1 {
	background: #ffffff;
}
table.adminlist tbody tr.row1:last-child td,
table.adminlist tbody tr.row1:last-child th {
	border-bottom: 1px solid #000000;
}
table.adminlist tbody tr.row0:hover td,
table.adminlist tbody tr.row1:hover td,
table.adminlist tbody tr.row0:hover th,
table.adminlist tbody tr.row1:hover th,
table.adminlist tbody tr.row0:focus td,
table.adminlist tbody tr.row1:focus td,
table.adminlist tbody tr.row0:focus th,
table.adminlist tbody tr.row1:focus th {
	background-color: #e5d9c3;
}
table.adminlist tbody tr td,
table.adminlist tbody tr th {
	border-right: 1px solid #000000;
}
table.adminlist tbody tr td:last-child {
	border-right: none;
}
table.adminlist tbody tr.row0:last-child td,
table.adminlist tbody tr.row0:last-child th {
	border-bottom: 1px solid #000000;
}
table.adminlist tbody tr.row0 td,
table.adminlist tbody tr.row0 th {
	background-color: #d5c1b2;
	background-image: -moz-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#d5c1b2),to(#d5c1b2));
	background-image: -webkit-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -o-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: linear-gradient(to bottom,#d5c1b2,#d5c1b2);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd5c1b2', endColorstr='#ffd5c1b2', GradientType=0);
}
table.adminlist {
	border-bottom: 0 solid #000000;
}
table.adminlist tfoot tr {
	color: #2c2c2c;
}
table.adminlist tfoot td,
table.adminlist tfoot th {
	background-color: #ffffff;
	border-top: 1px solid #000000;
}
table.adminlist tr td.btns a {
	border: 1px solid #000000;
	background-color: #d5c1b2;
	background-image: -moz-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#d5c1b2),to(#d5c1b2));
	background-image: -webkit-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -o-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: linear-gradient(to bottom,#d5c1b2,#d5c1b2);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd5c1b2', endColorstr='#ffd5c1b2', GradientType=0);
	color: #054993;
}
table.adminlist tr td.btns a:hover,
table.adminlist tr td.btns a:active,
table.adminlist tr td.btns a:focus {
	background-color: #ffffff;
}
a.saveorder {
	background: url(../images/admin/filesave.png) no-repeat;
}
a.saveorder.inactive {
	background-position: 0 -16px;
}
fieldset.batch {
	background: #ffffff;
}
button {
	color: #054993;
	border: 1px solid #000000;
	background-color: #d5c1b2;
	background-image: -moz-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#d5c1b2),to(#d5c1b2));
	background-image: -webkit-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -o-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: linear-gradient(to bottom,#d5c1b2,#d5c1b2);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd5c1b2', endColorstr='#ffd5c1b2', GradientType=0);
}
button:hover,
button:focus {
	background: #e5d9c3;
}
.invalid {
	color: #ff0000;
}
.button1 {
	border: 1px solid #000000;
	color: #054993;
	background-color: #d5c1b2;
	background-image: -moz-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#d5c1b2),to(#d5c1b2));
	background-image: -webkit-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -o-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: linear-gradient(to bottom,#d5c1b2,#d5c1b2);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd5c1b2', endColorstr='#ffd5c1b2', GradientType=0);
}
.button1 a {
	color: #054993;
}
.button1 a:hover,
.button1 a:focus {
	background: #e5d9c3;
}
.button2-left,
.button2-right {
	border: 1px solid #000000;
	background-color: #d5c1b2;
	background-image: -moz-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#d5c1b2),to(#d5c1b2));
	background-image: -webkit-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -o-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: linear-gradient(to bottom,#d5c1b2,#d5c1b2);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd5c1b2', endColorstr='#ffd5c1b2', GradientType=0);
}
.button2-left a,
.button2-right a,
.button2-left span,
.button2-right span {
	color: #054993;
}
.button2-left span,
.button2-right span {
	color: #999999;
}
.page span,
.blank span {
	color: #054993;
}
.button2-left a:hover,
.button2-right a:hover,
.button2-left a:focus,
.button2-right a:focus {
	background: #e5d9c3;
}
.pagination .page span {
	color: #999999;
}
.tip {
	background: #000000;
	border: 1px solid #FFFFFF;
}
.tip-title {
	background: url(../images/selector-arrow-std.png) no-repeat;
}
a img.calendar {
	background: url(../images/calendar.png) no-repeat;
}
.jgrid span.publish {
	background-image: url(../images/admin/tick.png);
}
.jgrid span.unpublish {
	background-image: url(../images/admin/publish_x.png);
}
.jgrid span.archive {
	background-image: url(../images/menu/icon-16-archive.png);
}
.jgrid span.trash {
	background-image: url(../images/menu/icon-16-trash.png);
}
.jgrid span.default {
	background-image: url(../images/menu/icon-16-default.png);
}
.jgrid span.notdefault {
	background-image: url(../images/menu/icon-16-notdefault.png);
}
.jgrid span.checkedout {
	background-image: url(../images/admin/checked_out.png);
}
.jgrid span.downarrow {
	background-image: url(../images/admin/downarrow.png);
}
.jgrid span.downarrow_disabled {
	background-image: url(../images/admin/downarrow0.png);
}
.jgrid span.uparrow {
	background-image: url(../images/admin/uparrow.png);
}
.jgrid span.uparrow_disabled {
	background-image: url(../images/admin/uparrow0.png);
}
.jgrid span.published {
	background-image: url(../images/admin/publish_g.png);
}
.jgrid span.expired {
	background-image: url(../images/admin/publish_r.png);
}
.jgrid span.pending {
	background-image: url(../images/admin/publish_y.png);
}
.jgrid span.warning {
	background-image: url(../images/admin/publish_y.png);
}
.icon-32-send {
	background-image: url(../images/toolbar/icon-32-send.png);
}
.icon-32-delete {
	background-image: url(../images/toolbar/icon-32-delete.png);
}
.icon-32-help {
	background-image: url(../images/toolbar/icon-32-help.png);
}
.icon-32-cancel {
	background-image: url(../images/toolbar/icon-32-cancel.png);
}
.icon-32-checkin {
	background-image: url(../images/toolbar/icon-32-checkin.png);
}
.icon-32-options {
	background-image: url(../images/toolbar/icon-32-config.png);
}
.icon-32-apply {
	background-image: url(../images/toolbar/icon-32-apply.png);
}
.icon-32-back {
	background-image: url(../images/toolbar/icon-32-back.png);
}
.icon-32-forward {
	background-image: url(../images/toolbar/icon-32-forward.png);
}
.icon-32-save {
	background-image: url(../images/toolbar/icon-32-save.png);
}
.icon-32-edit {
	background-image: url(../images/toolbar/icon-32-edit.png);
}
.icon-32-copy {
	background-image: url(../images/toolbar/icon-32-copy.png);
}
.icon-32-move {
	background-image: url(../images/toolbar/icon-32-move.png);
}
.icon-32-new {
	background-image: url(../images/toolbar/icon-32-new.png);
}
.icon-32-upload {
	background-image: url(../images/toolbar/icon-32-upload.png);
}
.icon-32-assign {
	background-image: url(../images/toolbar/icon-32-publish.png);
}
.icon-32-html {
	background-image: url(../images/toolbar/icon-32-html.png);
}
.icon-32-css {
	background-image: url(../images/toolbar/icon-32-css.png);
}
.icon-32-menus {
	background-image: url(../images/toolbar/icon-32-menu.png);
}
.icon-32-publish {
	background-image: url(../images/toolbar/icon-32-publish.png);
}
.icon-32-unblock {
	background-image: url(../images/toolbar/icon-32-unblock.png);
}
.icon-32-unpublish {
	background-image: url(../images/toolbar/icon-32-unpublish.png);
}
.icon-32-restore {
	background-image: url(../images/toolbar/icon-32-revert.png);
}
.icon-32-trash {
	background-image: url(../images/toolbar/icon-32-trash.png);
}
.icon-32-archive {
	background-image: url(../images/toolbar/icon-32-archive.png);
}
.icon-32-unarchive {
	background-image: url(../images/toolbar/icon-32-unarchive.png);
}
.icon-32-preview {
	background-image: url(../images/toolbar/icon-32-preview.png);
}
.icon-32-default {
	background-image: url(../images/toolbar/icon-32-default.png);
}
.icon-32-refresh {
	background-image: url(../images/toolbar/icon-32-refresh.png);
}
.icon-32-save-new {
	background-image: url(../images/toolbar/icon-32-save-new.png);
}
.icon-32-save-copy {
	background-image: url(../images/toolbar/icon-32-save-copy.png);
}
.icon-32-error {
	background-image: url(../images/toolbar/icon-32-error.png);
}
.icon-32-new-style {
	background-image: url(../images/toolbar/icon-32-new-style.png);
}
.icon-32-delete-style {
	background-image: url(../images/toolbar/icon-32-delete-style.png);
}
.icon-32-purge {
	background-image: url(../images/toolbar/icon-32-purge.png);
}
.icon-32-remove {
	background-image: url(../images/toolbar/icon-32-remove.png);
}
.icon-32-featured {
	background-image: url(../images/toolbar/icon-32-featured.png);
}
.icon-32-unfeatured {
	background-image: url(../images/toolbar/icon-32-featured.png);
	background-position: 0% 100%;
}
.icon-32-export {
	background-image: url(../images/toolbar/icon-32-export.png);
}
.icon-32-stats {
	background-image: url(../images/toolbar/icon-32-stats.png);
}
.icon-32-print {
	background-image: url(../images/toolbar/icon-32-print.png);
}
.icon-32-batch {
	background-image: url(../images/toolbar/icon-32-batch.png);
}
.icon-32-envelope {
	background-image: url(../images/toolbar/icon-32-messaging.png);
}
.icon-32-download {
	background-image: url(../images/toolbar/icon-32-export.png);
}
.icon-32-bars {
	background-image: url(../images/toolbar/icon-32-stats.png);
}
.icon-48-categories {
	background-image: url(../images/header/icon-48-category.png);
}
.icon-48-category-edit {
	background-image: url(../images/header/icon-48-category.png);
}
.icon-48-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-generic {
	background-image: url(../images/header/icon-48-generic.png);
}
.icon-48-banners {
	background-image: url(../images/header/icon-48-banner.png);
}
.icon-48-banners-categories {
	background-image: url(../images/header/icon-48-banner-categories.png);
}
.icon-48-banners-category-edit {
	background-image: url(../images/header/icon-48-banner-categories.png);
}
.icon-48-banners-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-banners-clients {
	background-image: url(../images/header/icon-48-banner-client.png);
}
.icon-48-banners-tracks {
	background-image: url(../images/header/icon-48-banner-tracks.png);
}
.icon-48-checkin {
	background-image: url(../images/header/icon-48-checkin.png);
}
.icon-48-clear {
	background-image: url(../images/header/icon-48-clear.png);
}
.icon-48-contact {
	background-image: url(../images/header/icon-48-contacts.png);
}
.icon-48-contact-categories {
	background-image: url(../images/header/icon-48-contacts-categories.png);
}
.icon-48-contact-category-edit {
	background-image: url(../images/header/icon-48-contacts-categories.png);
}
.icon-48-contact-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-purge {
	background-image: url(../images/header/icon-48-purge.png);
}
.icon-48-cpanel {
	background-image: url(../images/header/icon-48-cpanel.png);
}
.icon-48-config {
	background-image: url(../images/header/icon-48-config.png);
}
.icon-48-groups {
	background-image: url(../images/header/icon-48-groups.png);
}
.icon-48-groups-add {
	background-image: url(../images/header/icon-48-groups-add.png);
}
.icon-48-levels {
	background-image: url(../images/header/icon-48-levels.png);
}
.icon-48-levels-add {
	background-image: url(../images/header/icon-48-levels-add.png);
}
.icon-48-module {
	background-image: url(../images/header/icon-48-module.png);
}
.icon-48-menu {
	background-image: url(../images/header/icon-48-menu.png);
}
.icon-48-menu-add {
	background-image: url(../images/header/icon-48-menu-add.png);
}
.icon-48-menumgr {
	background-image: url(../images/header/icon-48-menumgr.png);
}
.icon-48-trash {
	background-image: url(../images/header/icon-48-trash.png);
}
.icon-48-user {
	background-image: url(../images/header/icon-48-user.png);
}
.icon-48-user-add {
	background-image: url(../images/header/icon-48-user-add.png);
}
.icon-48-user-edit {
	background-image: url(../images/header/icon-48-user-edit.png);
}
.icon-48-user-profile {
	background-image: url(../images/header/icon-48-user-profile.png);
}
.icon-48-inbox {
	background-image: url(../images/header/icon-48-inbox.png);
}
.icon-48-new-privatemessage {
	background-image: url(../images/header/icon-48-new-privatemessage.png);
}
.icon-48-msgconfig {
	background-image: url(../images/header/icon-48-message_config.png);
}
.icon-48-langmanager {
	background-image: url(../images/header/icon-48-language.png);
}
.icon-48-mediamanager {
	background-image: url(../images/header/icon-48-media.png);
}
.icon-48-plugin {
	background-image: url(../images/header/icon-48-plugin.png);
}
.icon-48-help_header {
	background-image: url(../images/header/icon-48-help_header.png);
}
.icon-48-impressions {
	background-image: url(../images/header/icon-48-stats.png);
}
.icon-48-browser {
	background-image: url(../images/header/icon-48-stats.png);
}
.icon-48-searchtext {
	background-image: url(../images/header/icon-48-stats.png);
}
.icon-48-thememanager {
	background-image: url(../images/header/icon-48-themes.png);
}
.icon-48-writemess {
	background-image: url(../images/header/icon-48-writemess.png);
}
.icon-48-featured {
	background-image: url(../images/header/icon-48-featured.png);
}
.icon-48-sections {
	background-image: url(../images/header/icon-48-section.png);
}
.icon-48-article-add {
	background-image: url(../images/header/icon-48-article-add.png);
}
.icon-48-article-edit {
	background-image: url(../images/header/icon-48-article-edit.png);
}
.icon-48-article {
	background-image: url(../images/header/icon-48-article.png);
}
.icon-48-content-categories {
	background-image: url(../images/header/icon-48-category.png);
}
.icon-48-content-category-edit {
	background-image: url(../images/header/icon-48-category.png);
}
.icon-48-content-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-install {
	background-image: url(../images/header/icon-48-extension.png);
}
.icon-48-dbbackup {
	background-image: url(../images/header/icon-48-backup.png);
}
.icon-48-dbrestore {
	background-image: url(../images/header/icon-48-dbrestore.png);
}
.icon-48-dbquery {
	background-image: url(../images/header/icon-48-query.png);
}
.icon-48-systeminfo {
	background-image: url(../images/header/icon-48-info.png);
}
.icon-48-massmail {
	background-image: url(../images/header/icon-48-massmail.png);
}
.icon-48-redirect {
	background-image: url(../images/header/icon-48-redirect.png);
}
.icon-48-search {
	background-image: url(../images/header/icon-48-search.png);
}
.icon-48-finder {
	background-image: url(../images/header/icon-48-search.png);
}
.icon-48-newsfeeds {
	background-image: url(../images/header/icon-48-newsfeeds.png);
}
.icon-48-newsfeeds-categories {
	background-image: url(../images/header/icon-48-newsfeeds-cat.png);
}
.icon-48-newsfeeds-category-edit {
	background-image: url(../images/header/icon-48-newsfeeds-cat.png);
}
.icon-48-newsfeeds-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-weblinks {
	background-image: url(../images/header/icon-48-links.png);
}
.icon-48-weblinks-categories {
	background-image: url(../images/header/icon-48-links-cat.png);
}
.icon-48-weblinks-category-edit {
	background-image: url(../images/header/icon-48-links-cat.png);
}
.icon-48-weblinks-category-add {
	background-image: url(../images/header/icon-48-category-add.png);
}
.icon-48-tags {
	background-image: url(../images/header/icon-48-tags.png);
}
.icon-48-assoc {
	background-image: url(../images/header/icon-48-assoc.png);
}
.icon-48-puzzle {
	background-image: url(../images/header/icon-48-puzzle.png);
}
div.message {
	border: 1px solid #000000;
	color: #2c2c2c;
}
.helpFrame {
	border-left: 0 solid #000000;
	border-right: none;
	border-top: none;
	border-bottom: none;
}
.outline {
	border: 1px solid #000000;
	background: #ffffff;
}
dl.menu_type dt {
	border-bottom: 1px solid #000000;
}
ul#new-modules-list {
	border-top: 1px solid #000000;
}
#skiplinkholder a,
#skiplinkholder a:link,
#skiplinkholder a:visited {
	color: #ffffff;
	background: #054993;
	border-bottom: solid #336 2px;
}
fieldset.panelform {
	border: none 0;
}
a.move_up {
	background-image: url('../images/admin/uparrow.png');
}
span.move_up {
	background-image: url('../images/admin/uparrow0.png');
}
a.move_down {
	background-image: url('../images/admin/downarrow.png');
}
span.move_down {
	background-image: url('../images/admin/downarrow0.png');
}
a.grid_false {
	background-image: url('../images/admin/publish_x.png');
}
a.grid_true {
	background-image: url('../images/admin/tick.png');
}
a.grid_trash {
	background-image: url('../images/admin/icon-16-trash.png');
}
tr.row1 {
	background-color: #d5c1b2;
}
table.aclsummary-table td.col2,
table.aclsummary-table th.col2,
table.aclsummary-table td.col3,
table.aclsummary-table th.col3,
table.aclsummary-table td.col4,
table.aclsummary-table th.col4,
table.aclsummary-table td.col5,
table.aclsummary-table th.col5,
table.aclsummary-table td.col6,
table.aclsummary-table th.col6,
table.aclmodify-table td.col2,
table.aclmodify-table th.col2 {
	border-left: 1px solid #000000;
}
span.icon-16-unset {
	background: url(../images/admin/icon-16-denyinactive.png) no-repeat;
}
span.icon-16-allowed {
	background: url(../images/admin/icon-16-allow.png) no-repeat;
}
span.icon-16-denied {
	background: url(../images/admin/icon-16-deny.png) no-repeat;
}
span.icon-16-locked {
	background: url(../images/admin/checked_out.png) 0 0 no-repeat;
}
label.icon-16-allow {
	background: url(../images/admin/icon-16-allow.png) no-repeat;
}
label.icon-16-deny {
	background: url(../images/admin/icon-16-deny.png) no-repeat;
}
a.icon-16-allow {
	background: url(../images/admin/icon-16-allow.png) no-repeat;
}
a.icon-16-deny {
	background: url(../images/admin/icon-16-deny.png) no-repeat;
}
a.icon-16-allowinactive {
	background: url(../images/admin/icon-16-allowinactive.png) no-repeat;
}
a.icon-16-denyinactive {
	background: url(../images/admin/icon-16-denyinactive.png) no-repeat;
}
ul.acllegend li.acl-allowed {
	background: url(../images/admin/icon-16-allow.png) no-repeat left;
}
ul.acllegend li.acl-denied {
	background: url(../images/admin/icon-16-deny.png) no-repeat left;
}
li.acl-editgroups,
li.acl-resetbtn {
	background-color: #d5c1b2;
	border: 1px solid #000000;
}
li.acl-editgroups a,
li.acl-resetbtn a {
	color: #054993;
}
li.acl-editgroups:hover,
li.acl-resetbtn:hover,
li.acl-editgroups:focus,
li.acl-resetbtn:focus {
	background-color: #e5d9c3;
}
table#acl-config {
	border: 1px solid #000000;
}
table#acl-config th,
table#acl-config td {
	background: #d5c1b2;
	border-bottom: 1px solid #000000;
}
table#acl-config th.acl-groups {
	border-right: 1px solid #000000;
}
#jform_sef_rewrite-lbl {
	background: url(../images/admin/icon-16-notice-note.png) right top no-repeat;
}
#permissions-sliders .tip {
	background: #ffffff;
	border: 1px solid #000000;
}
#permissions-sliders ul#rules,
#permissions-sliders ul#rules ul {
	border: solid 0 #000000;
	background: #ffffff;
}
ul#rules li .pane-sliders .panel h3.title {
	border: solid 0 #000000;
}
#permissions-sliders ul#rules .pane-slider {
	border: solid 1px #000000;
}
#permissions-sliders ul#rules li h3 {
	border: solid 1px #000000;
}
#permissions-sliders ul#rules li h3.pane-toggler-down a {
	border: solid 0;
}
#permissions-sliders ul#rules .group-kind {
	color: #2c2c2c;
}
#permissions-sliders ul#rules table.group-rules {
	border: solid 1px #000000;
}
#permissions-sliders ul#rules table.group-rules td {
	border-right: solid 1px #000000;
	border-bottom: solid 1px #000000;
}
#permissions-sliders ul#rules table.group-rules th {
	background: #e5d9c3;
	border-right: solid 1px #000000;
	border-bottom: solid 1px #000000;
	color: #2c2c2c;
}
ul#rules table.aclmodify-table {
	border: solid 1px #000000;
}
ul#rules table.group-rules td label {
	border: solid 0 #000000;
}
#permissions-sliders ul#rules .mypanel {
	border: solid 0 #000000;
}
#permissions-sliders  ul#rules  table.group-rules td {
	background: #ffffff;
}
#permissions-sliders span.level {
	color: #000000;
	background-image: none;
}
.check-0,
table.adminlist tbody td.check-0 {
	background-color: #ffffcf;
}
.check-a,
table.adminlist tbody td.check-a {
	background-color: #cfffda;
}
.check-d,
table.adminlist tbody td.check-d {
	background-color: #ffcfcf;
}
#system-message dd ul {
	color: #2c2c2c;
}
#system-message dd.error ul {
	color: #2c2c2c;
}
#system-message dd.message ul {
	color: #2c2c2c;
}
#system-message dd.notice ul {
	color: #2c2c2c;
}
#menu {
	color: #2c2c2c;
}
#menu ul.dropdown-menu {
	background-color: #d5c1b2;
	background-image: -moz-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#d5c1b2),to(#d5c1b2));
	background-image: -webkit-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -o-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: linear-gradient(to bottom,#d5c1b2,#d5c1b2);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd5c1b2', endColorstr='#ffd5c1b2', GradientType=0);
	color: #2c2c2c;
}
#menu ul.dropdown-menu li.dropdown-submenu {
	background: url(../images/j_arrow.png) no-repeat right 50%;
}
#menu ul.dropdown-menu li.divider {
	margin-bottom: 0;
	border-bottom: 1px dotted #000000;
}
#menu a {
	color: #054993;
	background-repeat: no-repeat;
	background-position: left 50%;
}
#menu li {
	border-right: 1px solid #000000;
	background-color: transparent;
}
#menu li a:hover,
#menu li a:focus {
	background-color: #e5d9c3;
}
#menu li.disabled a:hover,
#menu li.disabled a:focus,
#menu li.disabled a {
	color: #000000;
	background-color: #d5c1b2;
	background-image: -moz-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#d5c1b2),to(#d5c1b2));
	background-image: -webkit-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -o-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: linear-gradient(to bottom,#d5c1b2,#d5c1b2);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd5c1b2', endColorstr='#ffd5c1b2', GradientType=0);
}
#menu li ul {
	border: 1px solid #000000;
}
#menu li li {
	background-color: transparent;
}
#menu li.sfhover a {
	background-color: #e5d9c3;
}
#menu li.sfhover li a {
	background-color: transparent;
}
#menu li.sfhover li.sfhover a,
#menu li li a:focus {
	background-color: #e5d9c3;
}
#menu li.sfhover li.sfhover li a {
	background-color: transparent;
}
#menu li.sfhover li.sfhover li.sfhover a,
#menu li li li a:focus {
	background-color: #e5d9c3;
}
#menu li li a:focus,
#menu li li li a:focus {
	background-color: #e5d9c3;
}
#menu li li li a:focus {
	background-color: #e5d9c3;
}
#submenu {
	border-bottom: 1px solid #000000;
}
#submenu li,
#submenu span.nolink {
	background-color: #d5c1b2;
	background-image: -moz-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#d5c1b2),to(#d5c1b2));
	background-image: -webkit-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: -o-linear-gradient(top,#d5c1b2,#d5c1b2);
	background-image: linear-gradient(to bottom,#d5c1b2,#d5c1b2);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd5c1b2', endColorstr='#ffd5c1b2', GradientType=0);
	border: 1px solid #000000;
	color: #054993;
}
#submenu li:hover,
#submenu li:focus {
	background: #e5d9c3;
}
#submenu li.active,
#submenu span.nolink.active {
	background: #ffffff;
	border-bottom: 1px solid #ffffff;
}
#submenu li.active a,
#submenu span.nolink.active {
	color: #000;
}
.element-invisible {
	margin: 0;
	padding: 0;
}
div.CodeMirror-wrapping {
	border: 1px solid #000000;
}
table.adminform tr.row0 {
	background-color: #ffffff;
}
ul.alternating > li:nth-child(odd) {
	background-color: #ffffff;
}
ul.alternating > li:nth-child(even) {
	background-color: #d5c1b2;
}
ol.alternating > li:nth-child(odd) {
	background-color: #ffffff;
}
ol.alternating > li:nth-child(even) {
	background-color: #d5c1b2;
}
#installer-database,
#installer-discover,
#installer-update,
#installer-warnings {
	border-top: 1px solid #000000;
}
#installer-database p.warning {
	background: transparent url(../images/admin/icon-16-deny.png) center left no-repeat;
}
#installer-database p.nowarning {
	background: transparent url(../images/admin/icon-16-allow.png) center left no-repeat;
}
.input-append,
.input-prepend {
	font-size: 1.2em;
}
templates/hathor/css/boldtext.css000060400000000556152453623430013167 0ustar00@charset "UTF-8";

/**
 * @package		Joomla.Administrator
 * @subpackage	templates.hathor
 * @copyright	(C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @since		1.6
 *
 * Changes to use bold text as the default
 */

/**
 * Default to bold text
 */
body {
	font-weight: bold;
}
templates/hathor/css/colour_highcontrast_rtl.css000060400000017602152453623430016303 0ustar00@charset "UTF-8";

/**
 * @package		Joomla.Administrator
 * @subpackage	templates.hathor
 * @copyright	(C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @since		1.6
 *
 * RTL CSS file for the color standard
 */

/**
 * Overall Styles
 */
#header {
	background: #ffffff url(../images/j_logo.png) no-repeat top right;
}

#element-box {
	border-left: 1px solid #1b3f7c;
	border-right: 1px solid #1b3f7c;
}

/**
 * Various Styles
 */

div.checkin-tick {
	background: url(../images/admin/tick.png) 20px 50% no-repeat;
}

/**
 * Subheader, toolbar, page title
 */

div.toolbar-box {
	border-left: 1px solid #10254a;
	border-right: 1px solid #10254a;
}

div.toolbar-list li.divider {
	border-left:1px dotted #1b3f7c;
	border-right:none;
}

div.toolbar-list a:hover {
	border-right: 1px solid #000000;
	border-left: 1px solid #1b3f7c;
}

/**
 * Pane Slider pane Toggler styles
 */
.pane-toggler  span {
	background: transparent url(../images/j_arrow_left.png) right 50% no-repeat;
}

.pane-toggler-down span {
	background: transparent url(../images/j_arrow_down.png) right 50% no-repeat;
}

/**
 * Cpanel Settings
 */

#cpanel div.icon a:hover,
#cpanel div.icon a:focus {
	border-right: 1px solid #000000;
	border-left: 1px solid #1b3f7c;
}


fieldset#filter-bar {
	border-left: none;
	border-right: none;
}

/**
 * Admintable Styles
 */

table.admintable td.key,table.admintable td.paramlist_key {
	border-left: 1px solid #10254a;
	border-right: none;
}

table.paramlist td.paramlist_description {
	border-left: 1px solid #10254a;
	border-right: none;
}

/**
 * Admin Form Styles
 */
table.adminform tr {
	border-left: 1px solid #1b3f7c;
	border-right: none;
}

/**
 * Adminlist Table layout
 */

table.adminlist.modal {
	border-right: 1px solid #1b3f7c;
	border-left: 1px solid #1b3f7c;
}


	/* Table row styles */

table.adminlist tbody tr td,
table.adminlist tbody tr th {
	border-left: 1px solid #1b3f7c;
	border-right: none;
}

table.adminlist tbody tr td:last-child {
	border-left: none;
}

/**
 * Saving order icon styling in admin tables
 */
a.saveorder {
	background: url(../images/admin/filesave.png) no-repeat;
}

a.saveorder.inactive {
	background-position: 0 -16px;
}

/**
 * Button styling
 */

/* Button 1 Type */

	/* Use this if you add images to the buttons such as directional arrows */

.button1 a {
	/* add padding if you are using the directional images */
	/* padding: 0 6px 0 30px; */
}

	/* Button 2 Type */

.button2-right .prev {
	background-image: url(../images/j_button2_prev.png);
	background-position: right center;
}

.button2-right.off .prev {
	background: url(../images/j_button2_prev_off.png) no-repeat;
}

.button2-right .start {
	background-image: url(../images/j_button2_first.png);
	background-position: right center;
}

.button2-left .next {
	background-image: url(../images/j_button2_next.png);
	background-position: left center;
}

.button2-left.off .next { /* @TODO check the x position */
	background: url(../images/j_button2_next_off.png) 100% 0 no-repeat;
}

.button2-left .end {
	background-image: url(../images/j_arrow_left.png);
	background-position: left center;
}

.button2-left.off .end { /* @TODO check the x position */
	background: url(../images/j_button2_last_off.png) 100% 0 no-repeat;
}

.button2-left .image {
	background: url(../images/j_button2_image.png) 100% 0 no-repeat;
}

.button2-left .readmore {
	background: url(../images/j_button2_readmore.png) 100% 0 no-repeat;
}

.button2-left .pagebreak {
	background: url(../images/j_button2_pagebreak.png) 100% 0 no-repeat;
}

/**
 * Tooltips
 */


/**
 * System Standard Messages
 */
#system-message dd.message ul {
	background: #10254a url(../images/notice-info.png) 99.5% center no-repeat;
}

/**
 * System Error Messages
 */
#system-message dd.error ul {
	background: #1c4181 url(../images/notice-alert.png) 99.5% top no-repeat;
}

/**
 * System Notice Messages
 */
#system-message dd.notice ul {
	background: #10254a url(../images/notice-note.png) 99%.5 top no-repeat;
}

/**
 * JGrid styles
 */

/**
 * Menu Icons
 * These icons are used on the Administrator menu
 * The classes are constructed dynamically when the menu is generated
 */


/**
 * Toolbar icons
 * These icons are used for the toolbar buttons
 * The classes are constructed dynamically when the toolbar is created
 */

/**
 * Quick Icons
 * Also knows as Header Icons
 * These are used for the Quick Icons on the Control Panel
 * The same classes are also assigned the Component Title
 */

/**
 * General styles
 */

.helpFrame {
	border-right: 0 solid #1b3f7c;
	border-left: none;
	border-top: none;
}

/* -- ACL STYLES relocated from com_users/media/grid.css ----------- */

/* -- ACL PANEL STYLES  ----------- */


/* All Tabs */

table.aclsummary-table td.col2,
table.aclsummary-table th.col2,
table.aclsummary-table td.col3,
table.aclsummary-table th.col3,
table.aclsummary-table td.col4,
table.aclsummary-table th.col4,
table.aclsummary-table td.col5,
table.aclsummary-table th.col5,
table.aclmodify-table td.col2,
table.aclmodify-table th.col2 {
	border-right: 1px solid #cbcbcb;
	border-left: none;
}

/* Icons */

ul.acllegend li.acl-allowed {
	background:url(../images/admin/icon-16-allow.png) no-repeat right;
}
ul.acllegend li.acl-denied {
	background:url(../images/admin/icon-16-deny.png) no-repeat right;
}

table#acl-config th.acl-groups {
	border-left: 1px solid #c7c8b2;
}

table#acl-config th.acl-groups {
	text-align: right;
}

.acl-action {
	margin: auto 0;
}

/* Icons */

span.icon-16-unset {
	background: url(../images/admin/icon-16-denyinactive.png) no-repeat right;
}

span.icon-16-allowed {
	background: url(../images/admin/icon-16-allow.png) no-repeat right;
}

span.icon-16-denied {
	background: url(../images/admin/icon-16-deny.png) no-repeat right;
}

span.icon-16-locked {
	background: url(../images/admin/checked_out.png) no-repeat right;
}

/**
* Mod_rewrite Warning
*/
#jform_sef_rewrite-lbl {
	background: url(../images/admin/icon-16-notice-note.png) left top no-repeat;
}

/**
* Modal S-Box overrides
*/

#sbox-window {
	text-align:right;
}

/* *
* Permission Rules
*/

#permissions-sliders ul#rules table.group-rules td {
    border-left:solid 1px #1b3f7c;
    border-right:solid 0 #1b3f7c;
}

#permissions-sliders ul#rules table.group-rules th {
    border-left:solid 1px #1b3f7c;
    border-right:solid 0 #1b3f7c;
}

/**
 * Menu Styling
 */

#menu ul li.node {
	background-image: url(../images/j_arrow_left.png);
	background-repeat: no-repeat;
	background-position: left 50%;
}

#menu a {
	background-position: right 50%;
}

#menu li {
	border-left: 1px solid #000000;
}

#menu li a:hover, #menu li a:active, #menu li a:focus {
	border-left: 1px solid #1b3f7c;
	border-right: 1px solid #000000;
}

#menu li.disabled a:hover,#menu li.disabled a:focus,#menu li.disabled a
	{
	border-right: 1px solid #10254a;
	border-left: 1px solid #10254a;
}

#menu li:hover ul,#menu li.sfhover ul {
	/* lists nested under hovered list items */
	border-right: 1px solid #122b56;
	border-left: 1px solid #122b56;
}

#menu li li:hover ul,#menu li li.sfhover ul {
	border-right: 1px solid #122b56;
	border-left: 1px solid #122b56;
}

/**
 * Styling parents
 */

 	/* 1 level - sfhover */
#menu li.sfhover a {
	border-left: 1px solid #1b3f7c;
	border-right: 1px solid #000000;
}

	/* 2 level - hover */
#menu li.sfhover li.sfhover a,#menu li li a:focus {
	border-left: 1px solid #1b3f7c;
	border-right: 1px solid #000000;
}

	/* 3 level - hover */
#menu li.sfhover li.sfhover li.sfhover a,#menu li li li a:focus {
	border-left: 1px solid #1b3f7c;
	border-right: 1px solid #000000;
}

/* bring back the focus elements into view */
#menu li li a:focus {
	border-left: 1px solid #1b3f7c;
	border-right: 1px solid #000000;
}

#menu li li li a:focus {
	border-left: 1px solid #1b3f7c;
	border-right: 1px solid #000000;
}

/* Installer Database */
#installer-database p.warning {
	background-position: center right;
}

#installer-database p.nowarning {
	background-position: center right;
}
templates/hathor/css/ie7.css000060400000003705152453623430012025 0ustar00@charset "UTF-8";

/**
 * @package		Joomla.Administrator
 * @subpackage	templates.hathor
 * @copyright	(C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @since		1.6
 *
 * CSS file for IE7
 */

/**
 * Special Styles for Internet Explorer 7
 */

input {
	border-width: expression(this.type == "radio" ? '0px' : this.type == "checkbox" ? '0px' : '1px');
}

div.toolbar-box {
	height: 65px;
}

div.toolbar-list span {
	margin: 0;
	position: relative
}

div.toolbar-list a {
	position: relative;
}

div#subheader {
	height: 2em;
}

#login-page .pagetitle h2 {
	margin: 0px;
	padding: 0px;
}

*:first-child+html .clearfix {
	min-height: 1px;
}

.menu-links li,
.menu-links li label {
	height: 2em;
}

div.article-edit,
div.category-edit {
	zoom: 1;
}

div.pane-sliders,
div.panel,
div.pane-slider,
div.rules-section,
div.mypanel,
div.containerpg,
div.pagination,
div.upload-queue {
	zoom: 1;
}

div.width-20 fieldset.adminform,
div.width-30 fieldset.adminform,
div.width-35 fieldset.adminform,
div.width-40 fieldset.adminform,
div.width-45 fieldset.adminform,
div.width-50 fieldset.adminform,
div.width-55 fieldset.adminform,
div.width-60 fieldset.adminform,
div.width-65 fieldset.adminform,
div.width-70 fieldset.adminform,
div.width-80 fieldset.adminform,
div.width-100 fieldset.adminform {
	zoom: 1;
	margin-bottom:10px;
}

div.toggle-editor {
	margin-top: -5px;
	margin-bottom: 5px;
}

table.adminlist {
	border-bottom-width: 1px;
}

div.current dd {
	width: 100%;
	position: relative;
}

#permissions-sliders ul#rules table.group-rules caption span {
	height: 0;
	overflow: hidden;
	position: absolute;
	padding:0;
	margin:0;
}

div.current ul.menu-links {
	zoom: 1;
	width: 25%;
	margin: 0;
	padding:0;
	list-style-position: inside;
}

div#position-icon.pane-sliders div.pane-down div.icon-wrapper {
	margin: 0;
}

fieldset.panelform fieldset.checkboxes.impunlimited {
	float: none;
	width: 170px;
}
templates/hathor/js/template.js000060400000005541152453623430012624 0ustar00/**
 * @package		Hathor
 * @copyright	(C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */

/**
 * Functions
 */

/**
 * Change the skip nav target to work with webkit browsers (Safari/Chrome) and
 * Opera
 */
function setSkip() {
	var $ = jQuery.noConflict();
	var browser = $.browser;
	if (browser.chrome || browser.safari || browser.opera) {
		var $target = $('#skiptarget');
		$target.attr('href',"#skiptarget");
		$target.text("Start of main content");
		$target.attr("tabindex", "0");
		$('#skiplink').on("click", function(){
			$('#skiptarget').focus();
		});
	}
}

/**
 * Set the Aria Role based on the id
 *
 * @param id
 * @param rolevalue
 * @return
 */
function setRoleAttribute(id, rolevalue) {
	if (jQuery('#' + id).length) {
		jQuery('#'+ id).attr("role", rolevalue);
	}
}

/**
 * Set the WAI-ARIA Roles Specify the html id then aria role
 *
 * @return
 */
function setAriaRoleElementsById() {
	setRoleAttribute("header", "banner");
	setRoleAttribute("element-box", "main");
	setRoleAttribute("footer", "contentinfo");
	setRoleAttribute("nav", "navigation");
	setRoleAttribute("submenu", "navigation");
	setRoleAttribute("system-message", "alert");
}

/**
 * This sets the given Aria Property state to true for the given element
 *
 * @param el
 *            The element (tag.class)
 * @param prop
 *            The property to set to true
 * @return
 */
function setPropertyAttribute(el, prop) {
	if (jQuery(el).length) {
		jQuery(el).attr(prop, "true");
	}
}

/**
 * Set the WAI-ARIA Properties Specify the tag.class then the aria property to
 * set to true If classes are changed on the fly (i.e. aria-invalid) they need
 * to be changed there instead of here.
 *
 * @return
 */
function setAriaProperties() {
	setPropertyAttribute("input.required", "aria-required");
	setPropertyAttribute("textarea.required", "aria-required");
	setPropertyAttribute("input.readonly", "aria-readonly");
	setPropertyAttribute("input.invalid", "aria-invalid");
	setPropertyAttribute("textarea.invalid", "aria-invalid");
}


/**
 * Process file
 */

/** from accessible suckerfish menu by Matt Carroll,
 * mootooled by Bill Tomczak
 */

jQuery(function($){
	var $menu = $('#menu');
	if ($menu.length && !$menu.hasClass('disabled')) {
		$menu.find('li').each(function(){
			$(this).on('mouseenter', function(){
				$(this).addClass('sfhover');
			});
			$(this).on('mouseleave', function() {
				$(this).removeClass('sfhover');
			});
		});

		$menu.find('a').each(function() {
			$(this).on('focus', function() {
				$(this).addClass('sffocus');
				$(this).closest('li').addClass('sfhover');
			});
			$(this).on('blur', function() {
				$(this).removeClass('sffocus');
				$(this).closest('li').removeClass('sfhover');
			});
		});
	}
});

jQuery(function() {
	setSkip();
	setAriaRoleElementsById();
	setAriaProperties();
});templates/hathor/index.php000060400000013077152453623430011662 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var JDocumentHtml $this */

$app  = JFactory::getApplication();
$lang = JFactory::getLanguage();

// Output as HTML5
$this->setHtml5(true);

// jQuery needed by template.js
JHtml::_('jquery.framework');

// Add template js
JHtml::_('script', 'template.js', array('version' => 'auto', 'relative' => true));

// Add html5 shiv
JHtml::_('script', 'jui/html5.js', array('version' => 'auto', 'relative' => true, 'conditional' => 'lt IE 9'));

// Load optional RTL Bootstrap CSS
JHtml::_('bootstrap.loadCss', false, $this->direction);

// Load system style CSS
JHtml::_('stylesheet', 'templates/system/css/system.css', array('version' => 'auto'));

// Load template CSS
JHtml::_('stylesheet', 'template.css', array('version' => 'auto', 'relative' => true));

// Load additional CSS styles for colors
if (!$this->params->get('colourChoice'))
{
	$colour = 'standard';
}
else
{
	$colour = htmlspecialchars($this->params->get('colourChoice'));
}

JHtml::_('stylesheet', 'colour_' . $colour . '.css', array('version' => 'auto', 'relative' => true));

// Load additional CSS styles for rtl sites
if ($this->direction === 'rtl')
{
	JHtml::_('stylesheet', 'template_rtl.css', array('version' => 'auto', 'relative' => true));
	JHtml::_('stylesheet', 'colour_' . $colour . '_rtl.css', array('version' => 'auto', 'relative' => true));
}

// Load additional CSS styles for bold Text
if ($this->params->get('boldText'))
{
	JHtml::_('stylesheet', 'boldtext.css', array('version' => 'auto', 'relative' => true));
}

// Load specific language related CSS
JHtml::_('stylesheet', 'administrator/language/' . $lang->getTag() . '/' . $lang->getTag() . '.css', array('version' => 'auto'));

// Load custom.css
JHtml::_('stylesheet', 'custom.css', array('version' => 'auto', 'relative' => true));

// IE specific
JHtml::_('stylesheet', 'ie8.css', array('version' => 'auto', 'relative' => true, 'conditional' => 'IE 8'));
JHtml::_('stylesheet', 'ie7.css', array('version' => 'auto', 'relative' => true, 'conditional' => 'IE 7'));

// Logo file
if ($this->params->get('logoFile'))
{
	$logo = JUri::root() . $this->params->get('logoFile');
}
else
{
	$logo = $this->baseurl . '/templates/' . $this->template . '/images/logo.png';
}

$this->addScriptDeclaration("
	(function($){
		$(document).ready(function () {
			// Patches to fix some wrong render of chosen fields
			$('.chzn-container, .chzn-drop, .chzn-choices .search-field input').each(function (index) {
				$(this).css({
					'width': 'auto'
				});
			});
		});
	})(jQuery);
");
?>
<!DOCTYPE html>
<html lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
<head>
	<meta name="viewport" content="width=device-width, initial-scale=1.0" />
	<jdoc:include type="head" />
</head>
<body id="minwidth-body">
<div id="containerwrap" data-basepath="<?php echo JURI::root(true); ?>">
	<!-- Header Logo -->
	<div id="header">
		<!-- Site Title and Skip to Content -->
		<div class="title-ua">
			<h1 class="title"><?php echo $this->params->get('showSiteName') ? $app->get('sitename') . ' ' . JText::_('JADMINISTRATION') : JText::_('JADMINISTRATION'); ?></h1>
			<div id="skiplinkholder"><p><a id="skiplink" href="#skiptarget"><?php echo JText::_('TPL_HATHOR_SKIP_TO_MAIN_CONTENT'); ?></a></p></div>
		</div>
	</div><!-- end header -->
	<!-- Main Menu Navigation -->
	<div id="nav">
		<div id="module-menu">
			<h2 class="element-invisible"><?php echo JText::_('TPL_HATHOR_MAIN_MENU'); ?></h2>
			<jdoc:include type="modules" name="menu" />
		</div>
		<div class="clr"></div>
	</div><!-- end nav -->
	<!-- Status Module -->
	<div id="module-status">
		<jdoc:include type="modules" name="status"/>
	</div>
	<!-- Content Area -->
	<div id="content">
		<!-- Component Title -->
		<jdoc:include type="modules" name="title" />
		<!-- System Messages -->
		<jdoc:include type="message" />
		<!-- Sub Menu Navigation -->
		<div class="subheader">
			<?php if (!$app->input->getInt('hidemainmenu')) : ?>
				<h3 class="element-invisible"><?php echo JText::_('TPL_HATHOR_SUB_MENU'); ?></h3>
				<jdoc:include type="modules" name="submenu" style="xhtmlid" id="submenu-box" />
				<?php echo ' ' ?>
			<?php else : ?>
				<div id="no-submenu"></div>
			<?php endif; ?>
		</div>
		<!-- Toolbar Icon Buttons -->
		<div class="toolbar-box">
			<jdoc:include type="modules" name="toolbar" style="xhtml" />
			<div class="clr"></div>
		</div>
		<!-- Beginning of Actual Content -->
		<div id="element-box">
			<div id="container-collapse" class="container-collapse"></div>
			<p id="skiptargetholder"><a id="skiptarget" class="skip" tabindex="-1"></a></p>
			<!-- The main component -->
			<jdoc:include type="component" />
			<div class="clr"></div>
		</div><!-- end of element-box -->
		<noscript>
			<?php echo JText::_('JGLOBAL_WARNJAVASCRIPT'); ?>
		</noscript>
		<div class="clr"></div>
	</div><!-- end of content -->
	<div class="clr"></div>
</div><!-- end of containerwrap -->
<!-- Footer -->
<div id="footer">
	<jdoc:include type="modules" name="footer" style="none" />
	<p class="copyright">
		<?php
		// Fix wrong display of Joomla!® in RTL language
		if ($lang->isRtl())
		{
			$joomla = '<a href="https://www.joomla.org" target="_blank">Joomla!</a><sup>&#174;&#x200E;</sup>';
		}
		else
		{
			$joomla = '<a href="https://www.joomla.org" target="_blank">Joomla!</a><sup>&#174;</sup>';
		}
		echo JText::sprintf('JGLOBAL_ISFREESOFTWARE', $joomla);
		?>
	</p>
</div>
</body>
</html>
templates/hathor/templateDetails.xml000060400000005633152453623430013704 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install PUBLIC "-//Joomla! 1.6//DTD template 1.0//EN" "https://www.joomla.org/xml/dtd/1.6/template-install.dtd">
<extension type="template" version="3.1" client="administrator">
	<name>hathor</name>
	<creationDate>May 2010</creationDate>
	<author>Andrea Tarr</author>
	<authorEmail>admin@joomla.org</authorEmail>
	<copyright>(C) 2010 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<version>3.0.0</version>
	<description>TPL_HATHOR_XML_DESCRIPTION</description>
	<files>
		<filename>component.php</filename>
		<filename>cpanel.php</filename>
		<filename>error.php</filename>
		<filename>favicon.ico</filename>
		<filename>index.php</filename>
		<filename>login.php</filename>
		<filename>LICENSE.txt</filename>
		<filename>templateDetails.xml</filename>
		<filename>template_preview.png</filename>
		<filename>template_thumbnail.png</filename>
		<folder>css</folder>
		<folder>html</folder>
		<folder>images</folder>
		<folder>js</folder>
		<folder>language</folder>
	</files>

	<positions>
		<position>menu</position>
		<position>submenu</position>
		<position>toolbar</position>
		<position>title</position>
		<position>status</position>
		<position>icon</position>
		<position>cp_shell</position>
		<position>cpanel</position>
		<position>login</position>
		<position>debug</position>
		<position>footer</position>
	</positions>
	 <languages>
		<language tag="en-GB">language/en-GB/en-GB.tpl_hathor.ini</language>
		<language tag="en-GB">language/en-GB/en-GB.tpl_hathor.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="showSiteName"
					type="radio"
					label="TPL_HATHOR_SHOW_SITE_NAME_LABEL"
					description="TPL_HATHOR_SHOW_SITE_NAME_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="logoFile"
					type="media"
					label="TPL_HATHOR_LOGO_LABEL"
					description="TPL_HATHOR_LOGO_DESC" 
					class=""
					default=""
				/>

				<field
					name="colourChoice"
					type="list"
					label="TPL_HATHOR_COLOUR_CHOICE_LABEL"
					description="TPL_HATHOR_COLOUR_CHOICE_DESC"
					default="0"
					filter="word"
					>
					<option value="">TPL_HATHOR_COLOUR_CHOICE_STANDARD</option>
					<option value="highcontrast">TPL_HATHOR_COLOUR_CHOICE_HIGH_CONTRAST</option>
					<option value="brown">TPL_HATHOR_COLOUR_CHOICE_BROWN</option>
					<option value="blue">TPL_HATHOR_COLOUR_CHOICE_BLUE</option>
				</field>

				<field
					name="boldText"
					type="radio"
					label="TPL_HATHOR_BOLD_TEXT_LABEL"
					description="TPL_HATHOR_BOLD_TEXT_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
templates/hathor/language/en-GB/en-GB.tpl_hathor.ini000060400000003274152453623430016247 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

HATHOR="Hathor Administrator template"
TPL_HATHOR_ALTERNATE_MENU_DESC="Use the alternative menu which integrates mouse and keyboard. JavaScript Required. The regular menu for Hathor is accessible with or without Javascript, but leaves the mouse and keyboard independent."
TPL_HATHOR_ALTERNATE_MENU_LABEL="Alternative Menu"
TPL_HATHOR_BOLD_TEXT_DESC="Use bold text."
TPL_HATHOR_BOLD_TEXT_LABEL="Bold Text"
TPL_HATHOR_CHECKMARK_ALL="Checkmark All"
TPL_HATHOR_COLOUR_CHOICE_BLUE="Blue"
TPL_HATHOR_COLOUR_CHOICE_DESC="Select the colour palette to use with the template. You can use this option to select a high contrast version or use it to create custom branding."
TPL_HATHOR_COLOUR_CHOICE_LABEL="Select Colour"
TPL_HATHOR_COLOUR_CHOICE_STANDARD="Standard"
TPL_HATHOR_COLOUR_CHOICE_HIGH_CONTRAST="High Contrast"
TPL_HATHOR_COLOUR_CHOICE_BROWN="Brown"
TPL_HATHOR_COM_MENUS_MENU="Menu"
TPL_HATHOR_COM_MODULES_CUSTOM_POSITION_LABEL="Select"
TPL_HATHOR_CPANEL_LINK_TEXT="Return to Control Panel"
TPL_HATHOR_GO="Go"
TPL_HATHOR_LOGO_DESC="Select or upload a custom logo for the administrator template."
TPL_HATHOR_LOGO_LABEL="Logo"
TPL_HATHOR_MAIN_MENU="Main Menu"
TPL_HATHOR_SHOW_SITE_NAME_DESC="Show the site name in the template header."
TPL_HATHOR_SHOW_SITE_NAME_LABEL="Show Site Name"
TPL_HATHOR_SKIP_TO_MAIN_CONTENT="Skip to Main Content"
TPL_HATHOR_SUB_MENU="Sub Menu"
TPL_HATHOR_XML_DESCRIPTION="Hathor is an accessible Administrator template for Joomla! The Colour CSS files can also be used for custom colour branding."
templates/hathor/language/en-GB/en-GB.tpl_hathor.sys.ini000060400000001514152453623430017057 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

HATHOR="Hathor Administrator template"
TPL_HATHOR_POSITION_CP_SHELL="Unused"
TPL_HATHOR_POSITION_CPANEL="Control Panel"
TPL_HATHOR_POSITION_DEBUG="Debug"
TPL_HATHOR_POSITION_FOOTER="Footer"
TPL_HATHOR_POSITION_ICON="Quick Icons"
TPL_HATHOR_POSITION_LOGIN="Login"
TPL_HATHOR_POSITION_MENU="Menu"
TPL_HATHOR_POSITION_POSTINSTALL="Postinstall"
TPL_HATHOR_POSITION_STATUS="Status"
TPL_HATHOR_POSITION_SUBMENU="Submenu"
TPL_HATHOR_POSITION_TITLE="Title"
TPL_HATHOR_POSITION_TOOLBAR="Toolbar"
TPL_HATHOR_XML_DESCRIPTION="Hathor is an accessible Administrator template for Joomla! The Colour CSS files can also be used for custom colour branding."
templates/hathor/login.php000060400000010733152453623430011657 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var JDocumentHtml $this */

$app  = JFactory::getApplication();
$lang = JFactory::getLanguage();

// Gets the FrontEnd Main page Uri
$frontEndUri = JUri::getInstance(JUri::root());
$frontEndUri->setScheme(((int) $app->get('force_ssl', 0) === 2) ? 'https' : 'http');

// Output as HTML5
$this->setHtml5(true);

// jQuery needed by template.js
JHtml::_('jquery.framework');

// Add template js
JHtml::_('script', 'template.js', array('version' => 'auto', 'relative' => true));

// Add html5 shiv
JHtml::_('script', 'jui/html5.js', array('version' => 'auto', 'relative' => true, 'conditional' => 'lt IE 9'));

// Load optional RTL Bootstrap CSS
JHtml::_('bootstrap.loadCss', false, $this->direction);

// Load system style CSS
JHtml::_('stylesheet', 'templates/system/css/system.css', array('version' => 'auto'));

// Loadtemplate CSS
JHtml::_('stylesheet', 'template.css', array('version' => 'auto', 'relative' => true));

// Load additional CSS styles for colors
if (!$this->params->get('colourChoice'))
{
	$colour = 'standard';
}
else
{
	$colour = htmlspecialchars($this->params->get('colourChoice'), ENT_COMPAT, 'UTF-8');
}

JHtml::_('stylesheet', 'colour_' . $colour . '.css', array('version' => 'auto', 'relative' => true));

// Load additional CSS styles for rtl sites
if ($this->direction === 'rtl')
{
	JHtml::_('stylesheet', 'template_rtl.css', array('version' => 'auto', 'relative' => true));
	JHtml::_('stylesheet', 'colour_' . $colour . '_rtl.css', array('version' => 'auto', 'relative' => true));
}

// Load additional CSS styles for bold Text
if ($this->params->get('boldText'))
{
	JHtml::_('stylesheet', 'boldtext.css', array('version' => 'auto', 'relative' => true));
}

// Load specific language related CSS
JHtml::_('stylesheet', 'administrator/language/' . $lang->getTag() . '/' . $lang->getTag() . '.css', array('version' => 'auto'));

// Load custom.css
JHtml::_('stylesheet', 'custom.css', array('version' => 'auto', 'relative' => true));

// IE specific
JHtml::_('stylesheet', 'ie8.css', array('version' => 'auto', 'relative' => true, 'conditional' => 'IE 8'));
JHtml::_('stylesheet', 'ie7.css', array('version' => 'auto', 'relative' => true, 'conditional' => 'IE 7'));

// Logo file
if ($this->params->get('logoFile'))
{
	$logo = JUri::root() . $this->params->get('logoFile');
}
else
{
	$logo = $this->baseurl . '/templates/' . $this->template . '/images/logo.png';
}
?>
<!DOCTYPE html>
<html lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
<head>
	<jdoc:include type="head" />
</head>
<body id="login-page">
	<div id="containerwrap">
		<!-- Header Logo -->
		<div id="header">
			<h1 class="title"><?php echo $this->params->get('showSiteName') ? $app->get('sitename') . ' ' . JText::_('JADMINISTRATION') : JText::_('JADMINISTRATION'); ?></h1>
		</div><!-- end header -->
		<!-- Content Area -->
		<div id="content">
			<!-- Beginning of Actual Content -->
			<div id="element-box" class="login">
				<div class="pagetitle"><h2><?php echo JText::_('COM_LOGIN_JOOMLA_ADMINISTRATION_LOGIN'); ?></h2></div>
					<!-- System Messages -->
					<jdoc:include type="message" />
					<div class="login-inst">
					<p><?php echo JText::_('COM_LOGIN_VALID') ?></p>
					<div id="lock"></div>
					<a href="<?php echo htmlspecialchars($frontEndUri->toString(), ENT_COMPAT, 'UTF-8'); ?>" target="_blank">
						<?php echo JText::_('COM_LOGIN_RETURN_TO_SITE_HOME_PAGE'); ?>
					</a>
					</div>
					<!-- Login Component -->
					<div class="login-box">
						<jdoc:include type="component" />
					</div>
				<div class="clr"></div>
			</div><!-- end element-box -->
		<noscript>
			<?php echo JText::_('JGLOBAL_WARNJAVASCRIPT'); ?>
		</noscript>
		</div><!-- end content -->
		<div class="clr"></div>
	</div><!-- end of containerwrap -->
	<!-- Footer -->
	<div id="footer">
		<p class="copyright">
			<?php
			// Fix wrong display of Joomla!® in RTL language
			if ($lang->isRtl())
			{
				$joomla = '<a href="https://www.joomla.org" target="_blank" rel="noopener noreferrer">Joomla!</a><sup>&#174;&#x200E;</sup>';
			}
			else
			{
				$joomla = '<a href="https://www.joomla.org" target="_blank" rel="noopener noreferrer">Joomla!</a><sup>&#174;</sup>';
			}
			echo JText::sprintf('JGLOBAL_ISFREESOFTWARE', $joomla);
			?>
		</p>
	</div>
</body>
</html>
templates/hathor/error.php000060400000006203152453623430011675 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.hathor
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var JDocumentError $this */

$app = JFactory::getApplication();
?>
<!DOCTYPE html>
<html lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
<head>
	<meta charset="utf-8" />
	<title><?php echo $this->title; ?> <?php echo htmlspecialchars($this->error->getMessage(), ENT_QUOTES, 'UTF-8'); ?></title>
	<link href="<?php echo $this->baseurl; ?>/templates/<?php echo  $this->template; ?>/css/error.css" rel="stylesheet" />
	<?php if ($app->get('debug_lang', '0') == '1' || $app->get('debug', '0') == '1') : ?>
		<!-- Load additional CSS styles for debug mode-->
		<link href="<?php echo JUri::root(true); ?>/media/cms/css/debug.css" rel="stylesheet" />
	<?php endif; ?>
	<!-- Load additional CSS styles for rtl sites -->
	<?php if ($this->direction == 'rtl') : ?>
		<link href="<?php echo $this->baseurl; ?>/templates/<?php echo  $this->template; ?>/css/template_rtl.css" rel="stylesheet" />
	<?php endif; ?>
	<!--[if lt IE 9]><script src="<?php echo JUri::root(true); ?>/media/jui/js/html5.js"></script><![endif]-->
</head>
<body class="errors">
	<div>
		<h1>
			<?php echo $this->error->getCode(); ?> - <?php echo JText::_('JERROR_AN_ERROR_HAS_OCCURRED'); ?>
		</h1>
	</div>
	<div>
		<p>
			<?php echo htmlspecialchars($this->error->getMessage(), ENT_QUOTES, 'UTF-8'); ?>
			<?php if ($this->debug) : ?>
				<br/><?php echo htmlspecialchars($this->error->getFile(), ENT_QUOTES, 'UTF-8');?>:<?php echo $this->error->getLine(); ?>
			<?php endif; ?>
		</p>
		<p><a href="index.php"><?php echo JText::_('JGLOBAL_TPL_CPANEL_LINK_TEXT'); ?></a></p>
		<?php if ($this->debug) : ?>
			<div>
				<?php echo $this->renderBacktrace(); ?>
				<?php // Check if there are more Exceptions and render their data as well ?>
				<?php if ($this->error->getPrevious()) : ?>
					<?php $loop = true; ?>
					<?php // Reference $this->_error here and in the loop as setError() assigns errors to this property and we need this for the backtrace to work correctly ?>
					<?php // Make the first assignment to setError() outside the loop so the loop does not skip Exceptions ?>
					<?php $this->setError($this->_error->getPrevious()); ?>
					<?php while ($loop === true) : ?>
						<p><strong><?php echo JText::_('JERROR_LAYOUT_PREVIOUS_ERROR'); ?></strong></p>
						<p>
							<?php echo htmlspecialchars($this->_error->getMessage(), ENT_QUOTES, 'UTF-8'); ?>
							<br/><?php echo htmlspecialchars($this->_error->getFile(), ENT_QUOTES, 'UTF-8');?>:<?php echo $this->_error->getLine(); ?>
						</p>
						<?php echo $this->renderBacktrace(); ?>
						<?php $loop = $this->setError($this->_error->getPrevious()); ?>
					<?php endwhile; ?>
					<?php // Reset the main error object to the base error ?>
					<?php $this->setError($this->error); ?>
				<?php endif; ?>
			</div>
		<?php endif; ?>
	</div>
	<div class="clr"></div>
	<noscript>
			<?php echo JText::_('JGLOBAL_WARNJAVASCRIPT'); ?>
	</noscript>
</body>
</html>
templates/system/images/calendar.png000060400000001120152453623430013607 0ustar00�PNG


IHDR�aIDATx����I���}�c۶K��b�rl뿈�۶}w��ۙ�,�U���L�&+���O'Cm�����?jnP���he�"Gf�-];
@�޹vr�!��]�<Zp9q�0����<���w��ף�{���`�@�l~FB|�����Wi>�|L�?�H�H���<y�|
P!�%E�ӳa�ݧ[�<�8�rXu�>���aݡ������/�}1�(Vy��f�������ݟ�!��d�H �;7��Ξ�(:��!�����ʔ(�m;���',���=0Bpq㱇~4�C�
���(�ō��p<�/��6�OJ������́�P�HQ�ߺ�5��e�m�r�9)�$�F}AIHsl���p��-,,��~�+ b���sҒb�J��X�0�!4��E�3����u�M�q���\������S��c��W�!T,�ĿO�R"O<7�{E��.�y����圴��S��!�I#�}S�\�ђ��������[���
��A�3f�vIIEND�B`�templates/system/html/modules.php000060400000005415152453623430013223 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.system
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/*
 * none (output raw module content)
 */
function modChrome_none($module, &$params, &$attribs)
{
	echo $module->content;
}

/*
 * html5 (chosen html5 tag and font header tags)
 */
function modChrome_html5($module, &$params, &$attribs)
{
	$moduleTag      = $params->get('module_tag');
	$headerTag      = htmlspecialchars($params->get('header_tag'), ENT_COMPAT, 'UTF-8');
	$headerClass    = $params->get('header_class');
	$bootstrapSize  = $params->get('bootstrap_size');
	$moduleClass    = !empty($bootstrapSize) ? ' span' . (int) $bootstrapSize . '' : '';
	$moduleClassSfx = htmlspecialchars($params->get('moduleclass_sfx'), ENT_COMPAT, 'UTF-8');

	if (!empty ($module->content))
	{
		$html  = "<{$moduleTag} class=\"moduletable{$moduleClassSfx} {$moduleClass}\">";

		if ((bool) $module->showtitle)
		{
			$html .= "<{$headerTag} class=\"{$headerClass}\">{$module->title}</{$headerTag}>";
		}

		$html .= $module->content;
		$html .= "</{$moduleTag}>";

		echo $html;
	}
}

/*
 * xhtml (divs and font header tags)
 * With the new advanced parameter it does the same as the html5 chrome
 */
function modChrome_xhtml($module, &$params, &$attribs)
{
	$moduleTag      = $params->get('module_tag', 'div');
	$headerTag      = htmlspecialchars($params->get('header_tag', 'h3'), ENT_COMPAT, 'UTF-8');
	$bootstrapSize  = (int) $params->get('bootstrap_size', 0);
	$moduleClass    = $bootstrapSize != 0 ? ' span' . $bootstrapSize : '';

	// Temporarily store header class in variable
	$headerClass    = $params->get('header_class');
	$headerClass    = $headerClass ? ' class="' . htmlspecialchars($headerClass, ENT_COMPAT, 'UTF-8') . '"' : '';

	$content = trim($module->content);

	if (!empty ($content)) : ?>
		<<?php echo $moduleTag; ?> class="module<?php echo htmlspecialchars($params->get('moduleclass_sfx'), ENT_COMPAT, 'UTF-8') . $moduleClass; ?>">
			<?php if ($module->showtitle != 0) : ?>
				<<?php echo $headerTag . $headerClass . '>' . $module->title; ?></<?php echo $headerTag; ?>>
			<?php endif; ?>
			<?php echo $content; ?>
		</<?php echo $moduleTag; ?>>
	<?php endif;
}

/*
 * allows sliders
 */
function modChrome_sliders($module, &$params, &$attribs)
{
	$content = trim($module->content);

	if (!empty($content))
	{
		echo JHtml::_('sliders.panel', $module->title, 'module' . $module->id);
		echo $content;
	}
}

/*
 * allows tabs
 */
function modChrome_tabs($module, &$params, &$attribs)
{
	$content = trim($module->content);

	if (!empty($content))
	{
		echo JHtml::_('tabs.panel', $module->title, 'module' . $module->id);
		echo $content;
	}
}
templates/system/css/system.css000060400000000372152453623430012721 0ustar00/**
 * @copyright	(C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */

/* Import project-level system CSS */
@import url(../../../../media/system/css/system.css);templates/system/css/error.css000060400000001462152453623430012527 0ustar00/**
 * @copyright	(C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */

.outline {
	border: 1px solid #cccccc;
	background: #ffffff;
	padding: 2px;
}

body {
	margin: 15px;
	height: 100%;
	padding: 0;
	font-family: Arial, Helvetica, Sans Serif;
	font-size: 11px;
	color: #333333;
	background: #ffffff;
}

.frame {
	background-color: #FEFCF3;
	padding: 8px;
	border: solid 1px #000000;
	margin-top: 13px;
	margin-bottom: 25px;
}

h1 {
	color: #cc3333;
	font-size: 18px;
}

.table {
	border-collapse: collapse;
	margin-top: 13px;
}

td {
	padding: 3px;
	padding-left: 5px;
	padding-right: 5px;
	border: solid 1px #bbbbbb;
	font-size: 10px;
}

.type {
	background-color: #cc0000;
	color: #ffffff;
	font-weight: bold;
	padding: 3px;
}
templates/system/error.php000060400000005405152453623430011737 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.system
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var JDocumentError $this */

?>
<!DOCTYPE html>
<html lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
<head>
	<meta charset="utf-8" />
	<title><?php echo $this->error->getCode(); ?> - <?php echo htmlspecialchars($this->error->getMessage(), ENT_QUOTES, 'UTF-8'); ?></title>
	<link href="<?php echo $this->baseurl; ?>/templates/<?php echo $this->template; ?>/css/error.css" rel="stylesheet" />
	<!--[if lt IE 9]><script src="<?php echo JUri::root(true); ?>/media/jui/js/html5.js"></script><![endif]-->
</head>
<body>
	<table class="outline" style="margin: 0 auto; width: 550px;">
		<tr>
			<td style="text-align: center;">
				<h1><?php echo $this->error->getCode() ?> - <?php echo JText::_('JERROR_AN_ERROR_HAS_OCCURRED'); ?></h1>
			</td>
		</tr>
		<tr>
			<td style="text-align: center;">
				<p>
					<?php echo htmlspecialchars($this->error->getMessage(), ENT_QUOTES, 'UTF-8'); ?>
					<?php if ($this->debug) : ?>
						<br/><?php echo htmlspecialchars($this->error->getFile(), ENT_QUOTES, 'UTF-8');?>:<?php echo $this->error->getLine(); ?>
					<?php endif; ?>
				</p>
				<p><a href="<?php echo JRoute::_('index.php'); ?>"><?php echo JText::_('JGLOBAL_TPL_CPANEL_LINK_TEXT'); ?></a></p>
				<?php if ($this->debug) : ?>
					<div>
						<?php echo $this->renderBacktrace(); ?>
						<?php // Check if there are more Exceptions and render their data as well ?>
						<?php if ($this->error->getPrevious()) : ?>
							<?php $loop = true; ?>
							<?php // Reference $this->_error here and in the loop as setError() assigns errors to this property and we need this for the backtrace to work correctly ?>
							<?php // Make the first assignment to setError() outside the loop so the loop does not skip Exceptions ?>
							<?php $this->setError($this->_error->getPrevious()); ?>
							<?php while ($loop === true) : ?>
								<p><strong><?php echo JText::_('JERROR_LAYOUT_PREVIOUS_ERROR'); ?></strong></p>
								<p>
									<?php echo htmlspecialchars($this->_error->getMessage(), ENT_QUOTES, 'UTF-8'); ?>
									<br/><?php echo htmlspecialchars($this->_error->getFile(), ENT_QUOTES, 'UTF-8');?>:<?php echo $this->_error->getLine(); ?>
								</p>
								<?php echo $this->renderBacktrace(); ?>
								<?php $loop = $this->setError($this->_error->getPrevious()); ?>
							<?php endwhile; ?>
							<?php // Reset the main error object to the base error ?>
							<?php $this->setError($this->error); ?>
						<?php endif; ?>
					</div>
				<?php endif; ?>
			</td>
		</tr>
	</table>
</body>
</html>
templates/system/component.php000060400000001335152453623430012606 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.system
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var JDocumentHtml $this */

// Output as HTML5
$this->setHtml5(true);

// Add html5 shiv
JHtml::_('script', 'jui/html5.js', array('version' => 'auto', 'relative' => true, 'conditional' => 'lt IE 9'));
?>
<!DOCTYPE html>
<html lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
<head>
	<jdoc:include type="head" />
</head>
<body class="contentpane">
	<jdoc:include type="message" />
	<jdoc:include type="component" />
</body>
</html>
templates/system/index.php000060400000000461152453623430011712 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.system
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

include __DIR__ . '/component.php';
templates/isis/img/glyphicons-halflings.png000060400000030470152453623430015126 0ustar00�PNG


IHDR����0�IDATx�	l\׹�O��DI���DqF\�3"g˥��ɱi-)��ME���R��,�b1��cXNd'HTO��g
�yz���^�D�(��Uy�$l�A�Ul��}=�\~��ͽ�;�Մts�39C�Ϝ9�{��_�s������I^���G��9	�Ia@��3X��g�U�KϪgb
q�n�&yQ��l����c��T_���AGr�{��m%�2R��@�W�C�,gh�J����[t=l�����LA7����@V�jڞ:��l��3��U��~NJa@�丑�Z��x����U���[IN���IK}�0�IV�TE����c{�]���c:�Cx�@u3�?R�lj��Q� a=x kУ�a��Q!BY��**�;�bj���U�Lw�;uȦ������W��уnh[0i��+��)6z4�OrB�P��+��hZh�g� -=��C3dS��Yh}Y�T���)P����N��Z/�C�C���Ǻ�
X�����z�)��<뺾>P�B�8��F�;����׎�8yz�*����- ��=�z�K��v&���v�MD��bH<+A�I��{σ���gP��7�[tr�Js��'�Uan���FooU�|�!�CJ��P��@������	�Ǻ��I4*�¢��*'o�Z����]�Rz��X���S{Ѭh�S{�o�c��EhE�����=��[�"/��B`��YȊ(�{�����{�f�x�ys��O��V�rتP�eV�s��=��2*�k�6_�л�W��-��ȚR�H���7��S��	q�'N��B�0A����l��^�]�w�̡Yeg�=���T\ͬ�y��U��펡�q�L���Q�}$ڪ����h���N,{���^w�(|���'��P����뉥��>��Σ�b�Z�g��Q�%-�L�����?��;�b��Rc_��~I����֟��ώA4\��?��U�N,�"��Y�ި��Zu�K,�*�a�ڀ�k�������-/�7��y*�Ȝ�H
�;1�'f�����I�x����A*�Jݸ���l��Ǽ��Ue!�Ѝ+�$oTb�64�O�����x���-����#&��k��^��/�`�z��¿ߞ�.��W����]���/4#P���_�`�¢Y��W�5�5!��`�ddGVQe2c����#/^z�x��s
�����=���x�B�J�Q�z��kՎs��dv��F_��~��O�|�Ǻ�
���1�P2]OX��4�"n��#��A���S�*KAJ{��PR9'�3sC7��F�֦��5*�f���S\W!p7�S�[�vuQ�������尼J��W����|�

ka���~��F_�H펫u���O~ك����^�`�˓BO`R�9��W��9·-T��q���Y��d��qq�S�=���B|�F�Y�G4+~��ww�T���I������e��I��}�ș�q�C�V�o���HKGn=�U�b���Z��s /.*
�bN�M���O�[�YiqV�Yzn�U��('fG�v\:����-�eE?�N�]l�d��n^���.�F���N�h=�o�M�7}�[�Bd����Q��;���\ն�q��k�#q��[��N�u�A��_o����'V�A(�>:272��(����*��9W���':�=������7�~PD(G����ٱ�k�c|WA���@un�R~`���F_/�"E4��q	��U�rc��d�wQ��^�e���:LM��V���45Mu��֪�F��;~�Y�U��A�Vч�}�柯ZA���s;ٷ՞��,��	h���r4u���s�d����c}Km����2-��xH�� �C�p��������p8�UgU����p8�UgU����p8�U����J$�c�!d@��b$V89)/b2��>iO	��
P4�תN��ӏK1^��\WG���+�壾�Iy�H����N=u`R����k�-&����H�B����fVi|��S�j�jo5&9���҇g�g��킇j�b_K}������>+ҍ�����Q��`D�k��]�B����QE�z�ݐS`��\z��@�
��h|]pQ*G��FEȬ�V��:2�!�0xz������
�~����c�7�clU�X��2t(x�Og�����UK����v(������U��{�����І�T�ꟃ=���w��rze�Ɛ>i�On�F��4��L?�[5dT2��U
��Q��XEh�������=6*�@�4���A}���1�'���%�A��A�>!}�wJ��^��M����	����ͦV�Z E�A^_��y���4,^#�������m8w ��w#���3Է-�&�.��I�8|��z+�*UcV�U�˾1g�����qA�;~�>g��� ��Y�����Ъ��|}H/�3��7��c�C$�<�~�[D�G��6��]�Ϸ?	^ԝ��t-y=%�g��x�׳�]]C�2v!�n�tJ�8�MnМ��1�$������~.�ç�ӝ���!�"�V%�Z�5Йl99�T=.g5��}��
��2�f���A��0����mԷ�-�������X�7<�<'�	꓇6-��x��*��Q��0%(�x�Z��zX�xH��
S�Ё�r�����=���B�O����
�tY���e�U!���я��[H��ꑭ�9��P�Z4b# �������#�P/��zH@?�_=�껕j��=b	;uw�Y�><�o�6��J���^��b�׌{V���&��6�׃���Ͱ>������1��b���Ws��"(C���>�B�V����>�Y����Y�c?�P!�?O�X����>x�����^R�1zT�@ҚgX�����c��S�>ȕ��ڑG�!\�ƣ�ʭ*�F�8r~�G��gzF��$�kS���Y}dGTYe��%����V�#��qIj3@Mp77ڞcZ��*��[nU���{t��`R/�{/nT�����F��)9��T�T��	�OM��Mrӵ�M��|����f�!P����p�-i���*$����1z��1z��}`Oş��-Т�ǧn�޷ލ�{
!}�_����W8����-0Ur˭j��*Nj���!��5M��8V6�L�)H񹯁��S=Ҵ�@�I��˷ϭ������)񔩾Σ�'�Q'������}��o,��N�ti�?{�#�������DԚ�#M~�	�*X��Y�>�y���_q�� \�����h��{ê�A����_��)��*�R){9M���Zߠ�͜����; ����ez�Ï8���U�rV{nR��ώų�sL��}W��}���[u���
��9^?v��w\2Ϲ�a4��{����,+"�������GU4��
D�h&#����Z>g�O@�ϛ� �*G׾>�J_������v}���1-߲���A�|a	�~�Far���I��K��]��p8�UgU����p8�UgU����p8�UgU����p8�J �S�Q_Q�����Zi�
i1�N`�m������[@؜=�����x�c�x����`Ѱ2[^�j}�x��>.���r�!�"�����컔F��o;v�#C��kh9p҃��nəl����iŊ,
+8*i}�1�'���G������ѓ��9S���ܬy(A[��n�U1�$Pg�g�
��W�`ӍM�Ï؄fXw��A�o{�}��� ��C]����|<v�M#��
��'��(h�=ј�>��򺰊9���Ga�K�3r)��74k��n�U�
��`ND^��&B�q�H懣��K '�ff]�Yf�~I�_:������.6kFc����)߂�x��>�(6�Ѱ�!�ʮ���=+B��E����R�Iϛ��VE�a�g�G/��]%�a��<>�K}&"����}��L" �:�B�(V�[�qw
�u��w�������A�!��Uъ���Yၟt,�0�gѪc�R�Iϛ��V%u�e���M&TSӳc�cS���ߡ��1���t�����
��Oi	Y��ň`��U�S5 ~�F&��ka��P�`3�D����{r�[ʨx��l�Y2vf�c�U�j���chD}�wl�'zqd�;q��?��ŭ��Z�Ѓ��Up���U��!?�=���Po�ڧj�W~��O���d@V�e�jO*�^$bh�-/0�ӿgB
��ǁZ_F�F���"�տ}T��j��c{������2)d!����D�_4@��l�O%�wʃm'�	�U��a8�V&�h��Y�`��>��2��X{{����l�Ge����|^�Y�.h�C���-/DekU������U��~�]�yF�d�;4e�.��-���>���_����}'8VjU9�Z~S̼%l����4�NJ��k�,�&�ۘ��Yh}+
���^�Yɨ�Yy��Ъ~N~�h�X��1y�; �J����fa���
;.y����
$q���]?�K��)���J�ڱ��;����ܭ�5��*�*Sk��t�EĈ�w�m�K�DX��jjT2�ƨ�U��*HpC����G0D�3
��+L�0q���'���_x����C���耒�ƒ̗���B��� ��0)Q���Q	���Wت>�U��8}ؓF$���Ԩ��$�ܪ:=��:$�f��0L>S���J�����IGx@�}h��v9��V�����i�e4RҦ�R2��V�	*��	�m}X�Z�Y�̪Ɛ�2�27��T$����[+R���V�dm��ۏFe�%�Q�¤=iӃ���	�Jo����R�b�z�AШ�G'�'w���pVu8�U�����pVu8�U����p8�:gU��YU6Q�*s�t8B���D�?N�2��tQ}M���*�Uy]^$=�p7�q)VD��T�Q�U�6w�Q�^9��JtCN}u����J�UK�C��I�Iǫt�c�T��*a�9�d�䰁�"&X��v;jP/����A��V�e�����F��B��I�"8��i�J�F|�W�Օ�7bDM�2;64?�栈GNfC��T�B�,sŤJ�QZ�=H׉���*�ȣy�,B���#�7*�tA�l�m빡���N�U��"�
 �jO���}�S{�QV��+@��Š��c[兆-=�b�/B
�Y�e �#�U(�ٴ�b���	��\K`+fMjD`�����,����z�|Eij�ghT�w�ͺ�g�Dr2�k�+W��pzQ�a'���x������)�|i3��\���UNbVv�&����p�	���ńb(Ed�&V%�%�e�Lfl[0�3��.��l�LC����^�iO:���B��*=���7ޮ�-�T�ώSr�q����\ ����o�}S�)�����mT�AzLX�,,v�3m"�@?#��N����S^�M�jO*��
�JZ㣬� %H�bx��J]�3�F����N�iOC���>c%(=�0�`��W]�t9
��}Uh�A����cOA�դd�P����:��>�TNiG��������˙汞�
j�ߍ�Px@��̄��|�"��Q��J����l5�J]���z�V:��=���1��Q��/��ÐG��3��[�>^5�)6�l��Մ>�a��A�ͳ�wA/��SӐ�;��UKн�ܺ��s�`'� ifUҚ�v��3V�rA2u�j�5�́�H=_+�r��/��l3V��_��Q��{Q���b�ک{N�8�~]Y���E9��;<h�P�����o��2�Ĺ�Т�����S{��dT]��6\z;'�l귽�UIkzԥ�Z=c%�����*4�ݪ��3B"�|�l��F*D�_��*�%�W\Z�x�¨H�ĬĞ
4�k'��A�K��򤈣�����[��I���i��x��4Ȋ�z�G���DL�(啎�=�ĸ73����(HX� jw��p���Vž�'�z�V6Z��%ퟵ1k%��
P����Q���-���V�24��I5	���y�W�+����'	�S	)h���Tc@�Az�g
���|�Hmח֪~ڃ�%�:��QVz�8��"��V��j4�D�Z�j�^oV֨5�n�
}<c?�8��������e����6��ɨ����l�f!�ap�8�Ïz���zHc���z��TeTzf��!��Q�z��2��A+du�J��Ĩ�gke��LPD��-?��:!B&q������spB8p홇��0tjzd��:pmǥ�i�e�i8������U�iԪ�=qG� y��#�n��y�2u.��КE*�$
���h��u���]e��QI��o?^�cr����f��o�탶Zi�~�KaP�{�Rz �Gk��ެп,yw�*뉌¸��S�-�FzJ/^,�s�P~Ɵ@��:�f������'+8�:�X�Z����.-w8�U�����pVu8�U�����pVu8�U�����j��G���z���>IU��u�a��X����Y�9���[>���OO�Y�4�=�R��ׯ>�W��zE6Y�Z �����}v�I��3�x���[��'���^�dEz��
�ש|��ե��p�5��vj�{������Y�~j��?!��m��5f�A�ϊ��J_��7�g��d�%�K���B�y���-�|Yh[b�&��)���%=a�G����|m�мM���8��f��1z�׋��鹉���SO�/赔{���mBq'�|��PN���F/]7���m�8e��5�3��u�è*��!J�̧�d��0B�'m�zf���V��Q�Y���/��ܱY�͵�^��9��'L�}�ڵw��f��jV>��{�"���N�h�7��Tp�GdS~ZP��z��F����=VgC�{֨��s�����
�z�S�:="g6Bi�����2yk�*���)�
b�
G���,.�2�jY0r��~щ��Q�I#]X���%=a�/-��)1z���C�Aks�<Hȼ;�C6偯�]���S��p�бC���[�P�q�؅,da�>�ƖOz!�$�Z�팑���od�N�_�b� ���WJ����_I
�iiJ�Y\�[m�:'f�x�V��T��m$a}�
��^�NM/��n2}N��>�(�~v��	�C�z����v����2�%���O��c|��{�^U����`� I}`�F�������van
�
N{��MD΅��~
=�/��3=#t�..t��v����A��z�@`�̯�����^�&������}U�����HFe��F�@o+���b�P~}��.��Ȋ�O�P�=.�#+>/i��١y��2�O.5�^��CX��U������c�����ج�'�ܱ���9
�_)�
H����%��U�|z������-����9��'L�%?̿�P�[%NO��dT^O�s�ӄ��H�]��$�m�|�̓_?(��s��Q5p2�{c�K�����.���; 0*��F,9h!�$���v�7h��c_zLԍ9����i�{!��..a�K��m�'�طxdү�"+Br�B�rz����Kz�L���׳�U��z�[Jɸ|��KFO���;�Lp��$��v���[�g>QI��_գ�G���������VE`E�O�r�rʨ� �W�Z��..b�KL�q[���ob��|�`|����8���rzW��-��W]_��8
���|�b�{,��AΠ>�z:����ڋ����ְ�*���:�Rɨ3����"ֻĄ��!�H],��t�%9�}|N����s�Qi�{�ϗ_=ш���Q��{b��5\��	�]\f�x5��Q��?Qn�_�}N���O�]��O�9��ؤH�%�6�������]Y�p8�UgU����p8�:gU����p8�:gU����p8���$I�p8�XY���ڕ��5���?�+�E	��l8> �<+�8��BX0G	,~nM���$��CL��V����\���|�f
䌜IA���|���ʜ�Λ�4�c�����y��O3�2Z�,�BxH��?�z x�dr`m���6�B�ͬ$蹰#�l̻v]B���:QC��O^������:�*�z���,�ܬ+���'��G �+��?����#�ou��{v\*�5o�M7<��˚ئ;��n�)�!E��H����(YK��پ�i	h��� �Is�~��;�]+E�_���a�V�������V4Ab�SSWl�
�1w%j�|{=�X�Y)��ʀ-s�����6����_y��:��ڔ\(.&�LM?x$�,�'t��v��w��~�?q�D�<b��j:MH���:N����%��+A��0�̪P�D�A�c<({�g빭��d�‡~҃���v�_�'N��&�/_� ���"(۽��@ʨ2�</��E�R.n�fQ(nr��A~���=�u.�E�=����c;��@n�4��Gy�Z��'y5NS�����֟Ě;��}���#��Q��}�{�Em̦I l�HDP�c��,n��(㫆̭�Z���+��}�6�~G�K0ڔ~5����{��>���a�?p��C��;�=������?=�����\\(a�j*1��Hت|zn�}n瞝�j�=��qy����0�nVD#�b`��=8{9u���;�|��'0hlOelP�1��]p`��:������g6.I-$��
����S�Q�B�s� �f��9��S
�=�0��|ԃ0��qX�|�rRB$׹w�̨�DP4+��H~1�E.��/�V��"��?�;�b
p��r\�������@��=<������ƿ:��#sа�o<�(}����O{���N�S���P�v�6�_�
\��z(�qo���a��/�-��:}p���b����H�nU2*�6�f-5vk�9�kjt`ă�^��	�Q���߉>f�s�E,fV���[^[���v)�\\-�{�xv�U�?�\�Q�h'M��k�[��a:CBqkQD��9/���T��˃j�T���+��AVP��;�1ˊF�����Cbǥ� ��cn�l�8ƫG\Wƛ�	���߭�7jǫmX�f��V
���f��"�rFEl�
���K��8"�m5��ZnB��ɡL��F�}���>hQ|�!���L�
B�/^����ú%�"�˃C�iH>E(+��/����P�Uk��};4ˣY�>�4���G��|���%z�*�g��=O�&�"�QU���<���iw���G����OOV�,Ȋ��!����s�J�mp�!��Qͭ��EQ�1[Q0倾��_��X��
-"�A��+a�:&��]I���Z?��-��ym��͡���^Y�c�D��︔yU�(�v���{��p�\�w�V&Ӫ�x����l;#ΈP�qf[_5��n}IEC�����;�s�Kq��zT�_��7"��c����G�� �h�䝅�����STر��r�˒�r��Kb�N��o���鼭Ue�;戇zX��`B�^Y�'|b��ki�֗��8��q��*�he4��44w�n��}\��Q�X�e�#/;=\8'nW�{Ń]Ƕ��^S��W=(��
�4j3��W;D4ЃgWJl���D4��*Y�n��!��ˍ^!Z�q5X�0��E�O�����v��ӁLJ ������U;N�����'����ZZ��
�I�n�4�z�2w��R}����j0N�]���
tzYȃC��Ц_�kOO���fT5E�u�̍J���Y���,.V(/#cp:h�Ox>r�9�?͉b�����ó�\Yj���J����b�M�X���	| u#�5��F?�k�H�%}�7$,ۿG�N<�CG�y��;0��iF�����7��p��U������p8�U������p8�U������p8�UxU��Q8�C2;a�<gC�mQ��Xuޣ��a$�"d2�v���r��S��RV^U�E�1M�|�s�-��R�Mr���O��D8x���4�!4;a�eSx��&��T��d�I4en8I��,J��g�F*�u�uݮ�x
���&�r�Kf9�kR�~����:����Cyx��C��E���]^������+#O�����3/X�� ��۹�z��xH��z6wl9�j��Գ
��c��H>�[�F�A�ų������l�l,�W?��^^n|鱏�kyU�[�[>�I�Im����������T>�d
��3��'dS���f��.�#��Н�帄�Rp��}��������h8�V-��j�u6+XV��L�]������2��N��ah>�U��YHç��M�Edo=I������V�	=��ƅÏBO��)���B������Y�dk~��T���6{Í�i 27�y�dЖ���9ϼ����'v�UM�d�������3��<4p������������zM_5
ˑ
]�
���Jςu b��L��`�����Fo���'�R���r�_٦���G�I�P���[$}��{�"9#!|֕�f�G���#sК���Y�NP}�����O}���!m�Ov���Y''k�HL���HM7	�^�ޭ�֯f�n<q��S'�K���?}�O���[����WF���6!��L@fj�7Ӧ�mѠ�75
:��#����n�G��-��[_�h؞��w̩�h;���{���� �y�ߊ~K����"��2���k@�ʵ��&n@	��Iު��PE�+�x~T�iT8�G��h�Q��U��̳{0�?���U!�����]"��:K���w�ދ4�{���Z@�?Z�>���M4�������[���/=��Y$�_��9�@+������C-�Y%7��$N�#0��x}ت:}�}>z����S���șgzFDb�VE 1}�ʞ>xkS&�TF��Q�9�$��s�Q�#;��l
ky�n��R���l�РO�d@�8GVB��+��=_��4���{>���ߗc�o%lPk�q���A�R�)�@x�B��J�;РSˣ#/�.E��ܨo����߾�Nl��j�������m���{��yt��'��։�B��>� ��	G�՞�z4�}�'t�Q�.��w~�;J�t�Jpۓ�<1��O�B�� �3��ԗ������_DY5��n�akUy�&�Guw����k�Xɧ}˝�6��'�hP�噡y���<�Gem�_����x��}@Y�S�p<�e�Y���ݶ��[)�}�/�Jt�i���ه�l�=\����Ʌ�6��yL.Ɠ ������V��YF?�"�}�[�3��j�0�70*d�Q�ӱt�*	�~T�߀�==_y�صo�>�H�xh�K�`�$S�c~nE݋��#�C�&V��i�B�5����	�q�@B�^K��;^|Z�Y:�'vn�C����Ĥ|��&J?����ϼ	��FU������O��S{O�8~}#�+��2����W"�
%��(19Ͼ�JM��zz��.�+t����[iuĞ
�_���ǝ.3�`�^�����m�D<�������
��x^��'�z��:pr�%�U�O892�t>2w�����E2�
���}�BV�V��g�"�h���w�x����W�X�T��P���a����S���*=�4�����z9S��[������N��A[vs9Ϥ'��^*���+%c=1�Ȩ�D���֨����4�9� #v�%�L�Sh�e�ߡ�,4@+�@Ğ�
$�����;t���0Eh՝�ޮ�_/}N�'���q@Y�³m�w��d`O�$��l��z�aÛ*�N��+�v�������v��GH��B�I�ֻ��\m�s��P��®��;r\�}�w:�֨�Z�תE�뱽��~�å������&\�O�vC��f���!�qa�$L�E'fq01;!���(zYT7^���.z��MK�b(Z�����l�tD��36Wy��w\��A���맦5Fe֪�V%�3��"�a!Z�/��1hUj'$� �F�^皠��'f[��Ә)~γ�h����=���T���Y�%S�~��,�É��6��?�/���F�#�IEND�B`�templates/isis/img/glyphicons-halflings-white.png000060400000021047152453623430016244 0ustar00�PNG


IHDR���ӳ{�PLTE������������mmm�����������������������������������������������������ⰰ���������������������������������������ᒒ�������������ttt��������󻻻������������bbb�������������������������������������������������������eeeggg��𶶶����������������������������xxx�����������������������������󛛛������������������������������Ƽ�������������������������������������������������������������������������������������������������������������������������������������������������������몪����������������֢���������UUU������������������������������������������������������������������鿿���������������@:4�tRNS���#�_
/�����oS��?��C�
kD���OS_������6��>4!~a�@1�_'o�n�ҋ���M���3�BQj��p&%!l��"Xqr;�� A[�<`�am}4�3/0I��PCM!6(*gK&YQ�GDP,�`�{VP�-�x�)h�7�e1]��W��$��1�b�zSܕcO��]����U;Zi<N#�)	86pV��:h�#�0Z�Q�JN��EDT��܅uIDATx�c�H��]�ȶ�q�<��&���d�NC�i�yf��������p����e��?�]�G�V����E�z��}����g��7�r������7�|Yw}���š�>JN�S!�ױ��;G$�pA��f�3TJ1�Z�8�+ �6�1��	q:u�;:�,��W�z�7D�Ώ��1#�D�1iǑ'�F�� �C �c��'K�	�af�ᱟ�+s�B�hM��"��.�i�f#c�]�p^G�CI��#|Pd��:�T�#�JZm[��m��VC���7�)c�d���	�~F��)��*!�:\�y�Y��K��L���
��<ޅ��w�6���C^�e6�j�{"wZ%oO �Uج&)y�]*�}0y���Ӈ��r|\�V�7�٬a��
����R&�U3W��!���<"��Tb�{9佩WS���ȯ��}��YU��*���k�R�;m''�`��N����w�'�JM�!���6�i��?($ZI�Tp���pڴ�hM�C>�!��*<��*�uIU�t��5�s���h���z���K��t�
B�b|�yT���r��c�v�"y���m�
�*Y���X�c7y�l��?<�� Jjr�fZR{b��������el��$�Iy�P����X��Z�~GH՜9M���E�[2WJ��F�﹟|p���c7�
.��.S�[X���|)X/�ۅ�v\��`~q�����Q�y��N�uK��dw$X�ǿ�>�)5��b|����#�!�f�RJ�U}���1����jLc�V}p�Ш��R��m�Vq����y�l�’/3y�;������&��:�H���ɐ?�ǐp���bA�	��[ݘOBy%+N{d�T�R-�L�Z!�Z�b��/��-�8`-�����U�z�U��d�+�j@m�^ŪT�i4�
`t�
&�Nsn	i*J-�,E,u0$�>1�V��ZkuWV��L�<���x��{���鍅��{|���,�Ľ�����=��=3�7�j}-��K6g�Wa��y�aHQ�c���z�z��/ѕ��Of�yk~�>����*(N@0Q�{|���t3j�MOn����"����OiJ]�ͨ^���A{�m+@T3����㸟W�b�Qq���+3���+0Pj���*$���$���d��br�������[�ɭ�Vsr�9�՜�jNn5�ZF��՘1�Fyj�4UqH�zdh-宓5���uJ��eĶ��ˡ��D�5=d��>5�^�!"��$� H՗JƎ/�y蓍�����O�ߴ[�\Ǖ?�f�5���٬�2L ��^
@,{����G� E�����Vcjb�U��l�NN�6E��]�_MޕѪ��;_�J��Hu"2[N���x��Y���)_�?����)�0��h/���0�����Ol�*�2�3U�:�46�ဎӪ�CQ'���Dޡ��5�>`�<I2�\�L�Yłͪ���qz�
�W��I�Gj{Xrv[^�B���Y����v��@��(�#�w��_}
��Y��qZ�u(��Kv�5����|���׬u?̇̃$å4��:ж���r���J}Y';,�ّ9v��F��|k"W��u5&Z9�ֿJ��s$���笿���V�f����s����O#�y�R�g�Yֹ��=w���*?����iO��m��4�V?�*?&.�RT�i����*:��U�f�j�$�U��!Š���O������b`�䗐�%Ҳ?ڬ��yBi�`>9������V[�e�2Z,��K��_�kN��s�t\V�=iU��*���G��#�n4Y�yM��I�9Iv�.I��[���:�_��?��6/�^�i�=��2yf@�xz�z��d^�{D�T�J��V]���$[J�H.;FEԩ�:U�uD}R�'ɷo%I��K���|���b��~�3[�-ѭG�Y���Sd{�R�m��ǡ��[�lU�'P�ps�:�j�ѿ�A�G���a)3;KYge%�#r�D����:�>��m�|�몕SC���fe�ChÒ_Xl��>�x��M��Ӫ��A����>���d�y�qꀑ=��jeehu�	��yە�/T�n�TP��*�8;;�UG�j�$���$YFE�q��j�:��)���m}G��{D��bh�ph[v���64� �
��4��V�f�`E?O�2�,u��:@�:��3"/�rܶ����~:���]J
��ZX�64C!y�����[�ɭ��Vsr��՜�jNn5'���[�[�7b/�m3��[;D���e#�c;C\�����&��� ?�V�V���x�\�7VU��V�t��e>"�Yr���$�K��HGk\ͪ�4��:#�)ӱ�BD؏�l�
l�6�:�ZS�2Z�1ᝎ�d���ȅ��Ǎd���f�"���0D�cXm�d�}(V�E�>T �H�u�k�cY}-N��L�`p�#���y�
Xx%_fF&�_�01�])TH�{�H3��k���j����'7mZG�J�d��X��������I���6�`�D䞡њr�+�<��عݛY�iY©��Zwh����cuY%,�W?}����U��U�Y�c��!�����6�?�};�k�����:F�R���Z�kݪ��{�"?�I��>�}��o�qW��x6���c[UCd�Z0�8�gy�1I�x�0��J���;�!�ĉ[a���W�_�e²EE����)������:�qVj�H���;J���հ�q&����3�y|��ɪ��b����}�|AOzJ�]�kS�s<
�C|�HV�dy|���9o��V����b=���ɟZ���$�Rof�+����X^�ٳ��}��9>)�v�
��#Y%Idn����ù��^d�5oݟW��I�I>�*�֑ʽB����pQ��c��-���~�YK�R�.
��O3[��\����g�=�{`[�b{r�F.�j}R�^^�R�Vӹ�
��܋��BX;2EKf�,Հɒe������Gn�7�Q)g��NZm�kՎ�*�V�I^)f;U%R�`U�PA&V�����hҲ�E!:�{��EF���Ǟ�p�
�:PȆ:��l����$.'���[�ɭ��Vs�9�՜�jNnu\r�ac���)r��_�Y&�]w��+�rn�
�Kcr��KO�d��fl�ח���,��pc�$}�u]�O�c_�TC/R���^�R�ȑ�wq�a���;$��SM����-��U�����y�c�yj�,[���2�|�>�W�\�^f�ѥ�^��t=Z���T�VR�?]�\���,�3�����mQj����E֜�1���jg�̹^�3+��x�2�.I��k�?�O)�&�����O^)��z#�'���#�qQ��[��w�r�+'Y�oU�,�6dN�Y��E�'�VW��N�'��zG�'�2���o�5�Ь�����3"���6�b�;#\g�
\[H��ԲȕS�wǶJ?���$�����"��[W���jrVЈG��e~]K`�s�<f���+��c�d�N#_ci]��}|�V�)��\�<e)ǵJ�bc�۬�~F�i�R�V喊9r�7E^����F� ����T_�?�;1M#]��w��}�ZG�T.�v�����ٶ粔=���/���j]i%�Un�x�}~R�j��u�	&H�/�}���.T�f^]��T��C�H����H�T.�ӑ�}�/�jw:r�U�N�=&�ǰ����G�T,�Ps�m��$��u��>9��w����˼��S	C+�̔
���rQ��A�7[Ƶ�(�t��R�4����K�ޮ‹�G)U��ds�6?0Is~�9n�q)Z�a��=�D��W7Ec���rt�jO-�\y�Qkbaܻ%=�C��\���۪�*�B�.��n���Z��E���̤�����|:��{�=V�n[&��H�"WN�]��kU��P�%����"��ɦ�]ա�#��S]j=+����m_�Gd�B5o]nQӺ�5V�n[&��J�"�2o�o;z2��uz\C)5ɓ�O����O6��v'�pQ]Ԏ2���.N*U���4�[c�ζe����+��t�\��O�r`��
"�Z�l�R��6r��n+��?5�ɭ��Vsr�9���jNn5'���[�ܪ�����$p�Ǡ3_su�J���aZ
}k{�w+ׄ��������cp�gÑ��8xI����{ׄ�脉U��s�<"�Q֧��^aL��X��'W��Gɧi�Ne��Fr{$�r���H�7��ucYտ|A�JI7Z�$���IN�r����=��-Z��3�2�o�nL��n�!�����i�,��Q�絆���1��
j�٭v�%���֭����XV_�`�,��R(%I@�&9iɣBP,�ȶ���i��ۺ�V�2�G�*�w7`�!�Ǭ��I#O��Ж�A�ֹy��F�AM���j���q���W�nWK�j{)b��hC�A*(e�|&�F���%so�Y~!9y�c!)s]������C���z�-9��ܖy"u���;�{N3����s6ۨ��c��)OC��mK�&w�B��K��-3'd~}a&��dN޽�M[�̩YX���C>�l;j��I����U#��۪�ƄR$�N��ۂ.����nJ�qR]��r�ߛ�%��L�R#3���R�:��{xY���H)���z]?1��t���}�F���j��8(�G�D���3l�$��z��˵��iU�F:l�*(<��\�&9i�0�C_��%{�����#�7��i<���Z,�V��u��z!�șH5�j�N�5o����~;5oo�c�Z�\X`�+	�.7�]�`oT�?8�)1"#�:P�xԈ�ޛ�%��Z���#$Td����u�~��,9�B����@�pZ��ɝ-#=����J��\yW<���}^�D.E�}P��^����^��x�⊵���/*K�hهwӣ�i��T��\�]�V�…*Y��{�]��ߵ\�"<��$��,�{�uv�]���x|��P
�P����b.�c�~0bG�R��.�FV��\���;&��M��՜�jn5'���[�ɭ��Vsr��՜�jx/����{ɜ~]�=��(���ň�3�dj
V|�2���N�,����>�Bj�ϓ��������Q{e��+h���]��Z�������,tHf�b�gY�>%��n>�B^��`�Į��=O���|��GFK/'j�$9�E���?�)1E�:�Ck��N(^O�l���G��_�,/��j�>�r�D[�d��؟,��'Y�����H�E�;���&jM?�D#փx��:�~h�?��΍C���ਆ��*u�Ry5�h������/�F?�i��{��;\��2Z�ϓ,wh�i��f_�"��o'I��dti�ߓG��wH��¸�[$Y�1[�g����>@� I��U�V#�ͺ}D�^�0Z$O�&_��|�8��â���o���v����!��U$0�Jt2��C��<�]�Ҽx�m�ڤ(ӣ�&�o��Oz��O��x�"O����J�i��\��0�:�U9���Mp�h�)Β�x`�����f�]e)Y����B�$_�"9��7��v�hJ޵c�|:����T�`��?hn?N6�����_R9Pf�7��h�lk�#K�TJ���\b����V�ԖK��\t���/p@���j�r�C��VOp��ٯ��A��E//Q�4wo���M�oƐ�&{_I6/��\I��?�8�#l��\�Q6BS��9C��X�i�gK5p=ɪ�Z_���!�
���j5b�"��wuy�O۬��5���_�}^8„�ܽWl�������f��y��F~�zF�(���ca��8H)�|����Q)˱ʤU�wdZH�}"�I��ZLΥ�]%�E=f�
�UH�Q�T	ч�Y�<�!��܈Ԋ�z�������bBw>^�K��>���y��t^'�:���.��d23m7U�–�^ۺ0�K�m�+E)!����Q�IX�ڟo��4y�Z���,Ůiok�`6��Y>�����N����E���D3�[�^xR�L���_�����8��'^e̝}���+o����}<˱��U�ꤘӝ�I�+M&4+r���D%�֋6M/�f�Q���$�p����.��j��Kv+�'��gf�/"#�Q;�ט���U���{K��R��;�\�X�>E�>h+�ȩ�lV�r�<�d?��{[[��R!�I�1�D��TU#�����*��Y��R�s�6'���n�7ݕ/`R
��y��g6~p���[�ɭ��Vsr��՜�jNn5'���[]�_K����Bd%$�+���}x{,���c�l��D�������2ׄSd��>0�I�ըG�
��8lt��X�X�٦��}�#���K�O~JNj�l�Ur�lg�z��=>�Ň�~��%�ؚ]��?�f�hJђ�}���<AX���G#=g���{���0y,�Y��]�c�r�u��턀o��.,�l~M�yn���>2�y�����ѧ�E�	�, ���`���L�����'��>���������0��5ZZ8��6j|�,V��������Kw�A���w��e�L�ſ�9e���Q3W����!�iͣk�"���U�^�|�ٖ�M�hI����fk�	s[�zA�>s��}�r��
�:&R��	o���X3��s�+O�o#��z�?��{��⭲Y�_���b���A�O�o���M��6�>���9/����G�<�.��9�V��h�'9���ɓ0٦��9�$R�)JT�	��*x}�����>��Jc��Z&�V��>��c�"6��;w�b�G����y������0^NU�6���'����?��h\'��"9ﱞ���t�g�SJ��Y��9�[g�]����e{�n��L�U����lV�B�#�BA~+�y+�x���]L�+��c���3�����<�ǿi�����<��a���?�5����F�P:�p��ß RD�O�f��O?

�|`O�s
Pu#o���|2F-����LU^W��H��C�,@Z��5���O�؛����3���8�G�ԣK����W/���;�/Y��_k)�y�F�~�mV��~�p���[b�k�����}�Kr��R�y��y(���'�E�-R��6༮��|��ݡ��K��"9�����ό���;���+��c��6-����Oޕ��ָ�Ց���?���z^�[_�����5��T�O����w6ai]��W�c{X�F��0��S/8����-Ra ��r�άg�����T���G�?6'v/�V��R�o^���D��LK�?����5T���L��į�0�*��#aǟ��?�TXQE�.�qw8�y�e~��=�g�L�����ܣ�s���o�����
�����{fg�� ��N��8�{_*VjE���SU��T��^�!~�C�n&G�R��Dpq�
|�=>��?�΅T�󪸮jX��M(5J�ʹ6�
��� (�[��N����\������aF�T'�ˁ`fй��VC�
�����[>�|��:�r#��R�%�lgl�C�V&&�n�&FaEos|T��w�w�gxr�r�㋲����!aɤ8��?�l.n⇒���?uMIEND�B`�templates/isis/error.php000060400000030135152453623430011360 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Templates.isis
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

/** @var JDocumentError $this */

// Getting params from template
$params = JFactory::getApplication()->getTemplate(true)->params;

$app   = JFactory::getApplication();
$lang  = JFactory::getLanguage();
$input = $app->input;
$user  = JFactory::getUser();

// Gets the FrontEnd Main page Uri
$frontEndUri = JUri::getInstance(JUri::root());
$frontEndUri->setScheme(((int) $app->get('force_ssl', 0) === 2) ? 'https' : 'http');
$mainPageUri = $frontEndUri->toString();

// Detecting Active Variables
$option   = $input->get('option', '');
$view     = $input->get('view', '');
$layout   = $input->get('layout', '');
$task     = $input->get('task', '');
$itemid   = $input->get('Itemid', 0, 'int');
$sitename = htmlspecialchars($app->get('sitename'), ENT_QUOTES, 'UTF-8');

$cpanel = ($option === 'com_cpanel');

$showSubmenu = false;
$this->submenumodules = JModuleHelper::getModules('submenu');
foreach ($this->submenumodules as $submenumodule)
{
	$output = JModuleHelper::renderModule($submenumodule);
	if ($output !== '')
	{
		$showSubmenu = true;
		break;
	}
}

// Logo file
if ($params->get('logoFile'))
{
	$logo = htmlspecialchars(JUri::root() . $params->get('logoFile'), ENT_QUOTES, 'UTF-8');
}
else
{
	$logo = $this->baseurl . '/templates/' . $this->template . '/images/logo.png';
}

// Template Parameters
$displayHeader = $params->get('displayHeader', '1');
$statusFixed   = $params->get('statusFixed', '1');
$stickyToolbar = $params->get('stickyToolbar', '1');
?>
<!DOCTYPE html>
<html lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
<head>
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="IE=edge" />
	<title><?php echo $this->title; ?> <?php echo htmlspecialchars($this->error->getMessage(), ENT_QUOTES, 'UTF-8'); ?></title>
	<?php if ($app->get('debug_lang', '0') == '1' || $app->get('debug', '0') == '1') : ?>
		<!-- Load additional CSS styles for debug mode-->
		<link href="<?php echo JUri::root(true); ?>/media/cms/css/debug.css" rel="stylesheet" />
	<?php endif; ?>
	<?php // If Right-to-Left ?>
	<?php if ($this->direction == 'rtl') : ?>
		<link href="<?php echo JUri::root(true); ?>/media/jui/css/bootstrap-rtl.css" rel="stylesheet" />
	<?php endif; ?>
	<?php // Load specific language related CSS ?>
	<?php $file = '/administrator/language/' . $lang->getTag() . '/' . $lang->getTag() . '.css'; ?>
	<?php if (is_file(JPATH_ROOT . $file)) : ?>
		<link href="<?php echo JUri::root(true) . $file; ?>" rel="stylesheet" />
	<?php endif; ?>
	<link href="<?php echo $this->baseurl; ?>/templates/<?php echo $this->template; ?>/css/template<?php echo ($this->direction == 'rtl' ? '-rtl' : ''); ?>.css" rel="stylesheet" />
	<link href="<?php echo $this->baseurl; ?>/templates/<?php echo $this->template; ?>/favicon.ico" rel="shortcut icon" type="image/vnd.microsoft.icon" />
	<?php // Template color ?>
	<?php if ($params->get('templateColor')) : ?>
	<style>
		.navbar-inner, .navbar-inverse .navbar-inner, .nav-list > .active > a, .nav-list > .active > a:hover, .dropdown-menu li > a:hover, .dropdown-menu .active > a, .dropdown-menu .active > a:hover, .navbar-inverse .nav li.dropdown.open > .dropdown-toggle, .navbar-inverse .nav li.dropdown.active > .dropdown-toggle, .navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle
		{
			background: <?php echo $params->get('templateColor');?>;
		}
		.navbar-inner, .navbar-inverse .nav li.dropdown.open > .dropdown-toggle, .navbar-inverse .nav li.dropdown.active > .dropdown-toggle, .navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle{
			-moz-box-shadow: 0 1px 3px rgba(0, 0, 0, .25), inset 0 -1px 0 rgba(0, 0, 0, .1), inset 0 30px 10px rgba(0, 0, 0, .2);
			-webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .25), inset 0 -1px 0 rgba(0, 0, 0, .1), inset 0 30px 10px rgba(0, 0, 0, .2);
			box-shadow: 0 1px 3px rgba(0, 0, 0, .25), inset 0 -1px 0 rgba(0, 0, 0, .1), inset 0 30px 10px rgba(0, 0, 0, .2);
		}
	</style>
	<?php endif; ?>
	<?php // Template header color ?>
	<?php if ($params->get('headerColor')) : ?>
	<style>
		.header
		{
			background: <?php echo $params->get('headerColor');?>;
		}
	</style>
	<?php endif; ?>
	<?php // Sidebar background color ?>
	<?php if ($params->get('sidebarColor')) : ?>
		<style>
			.nav-list > .active > a, .nav-list > .active > a:hover {
				background: <?php echo $params->get('sidebarColor'); ?>;
			}
		</style>
	<?php endif; ?>
	<script src="<?php echo JUri::root(true); ?>/media/jui/js/jquery.js"></script>
	<script src="<?php echo JUri::root(true); ?>/media/jui/js/jquery-noconflict.js"></script>
	<script src="<?php echo JUri::root(true); ?>/media/jui/js/bootstrap.js"></script>
	<script src="<?php echo $this->baseurl; ?>/templates/<?php echo $this->template; ?>/js/template.js"></script>
	<!--[if lt IE 9]><script src="<?php echo JUri::root(true); ?>/media/jui/js/html5.js"></script><![endif]-->
</head>
<body class="admin <?php echo $option . ' view-' . $view . ' layout-' . $layout . ' task-' . $task;?>" data-spy="scroll" data-target=".subhead" data-offset="87">
	<!-- Top Navigation -->
	<nav class="navbar navbar-inverse navbar-fixed-top">
		<div class="navbar-inner">
			<div class="container-fluid">
				<?php if ($params->get('admin_menus') != '0') : ?>
					<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
						<span class="element-invisible"><?php echo JTEXT::_('TPL_ISIS_TOGGLE_MENU'); ?></span>
						<span class="icon-bar"></span>
						<span class="icon-bar"></span>
						<span class="icon-bar"></span>
					</a>
				<?php endif; ?>
				<a class="admin-logo" href="<?php echo $this->baseurl; ?>"><span class="icon-joomla"></span></a>

				<a class="brand hidden-desktop hidden-tablet" href="<?php echo $mainPageUri; ?>" title="<?php echo JText::sprintf('TPL_ISIS_PREVIEW', $sitename); ?>" target="_blank"><?php echo JHtml::_('string.truncate', $sitename, 14, false, false); ?>
					<span class="icon-out-2 small"></span></a>

				<?php if ($params->get('admin_menus') != '0') : ?>
				<div class="nav-collapse">
				<?php else : ?>
				<div>
				<?php endif; ?>
					<?php // Display menu modules ?>
					<?php $this->menumodules = JModuleHelper::getModules('menu'); ?>
					<?php foreach ($this->menumodules as $menumodule) : ?>
						<?php $output = JModuleHelper::renderModule($menumodule, array('style' => 'none')); ?>
						<?php $params = new Registry($menumodule->params); ?>
						<?php echo $output; ?>
					<?php endforeach; ?>
					<ul class="nav nav-user<?php echo ($this->direction == 'rtl') ? ' pull-left' : ' pull-right'; ?>">
						<li class="dropdown">
							<a class="dropdown-toggle" data-toggle="dropdown" href="#"><span class="icon-cog"></span>
								<span class="caret"></span></a>
							<ul class="dropdown-menu">
								<li>
									<span>
										<span class="icon-user"></span>
										<strong><?php echo htmlspecialchars($user->name, ENT_QUOTES, 'UTF-8'); ?></strong>
									</span>
								</li>
								<li class="divider"></li>
								<li class="">
									<a href="index.php?option=com_admin&amp;task=profile.edit&amp;id=<?php echo $user->id; ?>"><?php echo JText::_('TPL_ISIS_EDIT_ACCOUNT'); ?></a>
								</li>
								<li class="divider"></li>
								<li class="">
									<a href="<?php echo JRoute::_('index.php?option=com_login&task=logout&' . JSession::getFormToken() . '=1'); ?>"><?php echo JText::_('TPL_ISIS_LOGOUT'); ?></a>
								</li>
							</ul>
						</li>
					</ul>
					<a class="brand visible-desktop visible-tablet" href="<?php echo $mainPageUri; ?>" title="<?php echo JText::sprintf('TPL_ISIS_PREVIEW', $sitename); ?>" target="_blank"><?php echo JHtml::_('string.truncate', $sitename, 14, false, false); ?>
						<span class="icon-out-2 small"></span></a>
				</div>
				<!--/.nav-collapse -->
			</div>
		</div>
	</nav>
	<!-- Header -->
	<header class="header">
		<?php if ($displayHeader) : ?>
		<div class="container-logo">
			<img src="<?php echo $logo; ?>" class="logo" />
		</div>
		<?php endif; ?>
		<div class="container-title">
			<h1 class="page-title"><?php echo JText::_('ERROR'); ?></h1>
		</div>
	</header>
	<?php if (!$statusFixed && $this->getInstance()->countModules('status')) : ?>
		<!-- Begin Status Module -->
		<div id="status" class="navbar status-top hidden-phone">
			<div class="btn-toolbar">
				<div class="btn-group pull-right">
					<p>
						&copy; <?php echo date('Y'); ?> <?php echo $sitename; ?>
					</p>
				</div>
				<?php // Display status modules ?>
				<?php $this->statusmodules = JModuleHelper::getModules('status'); ?>
				<?php foreach ($this->statusmodules as $statusmodule) : ?>
					<?php $output = JModuleHelper::renderModule($statusmodule, array('style' => 'no')); ?>
					<?php $params = new Registry($statusmodule->params); ?>
					<?php echo $output; ?>
				<?php endforeach; ?>
			</div>
			<div class="clearfix"></div>
		</div>
		<!-- End Status Module -->
	<?php endif; ?>
	<div class="subhead-spacer" style="margin-bottom: 20px"></div>
	<!-- container-fluid -->
	<div class="container-fluid container-main">
		<section id="content">
			<!-- Begin Content -->
			<div class="row-fluid">
				<div class="span12">
					<!-- Begin Content -->
					<h1 class="page-header"><?php echo JText::_('JERROR_AN_ERROR_HAS_OCCURRED'); ?></h1>
					<blockquote>
						<span class="label label-inverse"><?php echo $this->error->getCode(); ?></span> <?php echo htmlspecialchars($this->error->getMessage(), ENT_QUOTES, 'UTF-8');?>
						<?php if ($this->debug) : ?>
							<br/><?php echo htmlspecialchars($this->error->getFile(), ENT_QUOTES, 'UTF-8');?>:<?php echo $this->error->getLine(); ?>
						<?php endif; ?>
					</blockquote>
					<?php if ($this->debug) : ?>
						<div>
							<?php echo $this->renderBacktrace(); ?>
							<?php // Check if there are more Exceptions and render their data as well ?>
							<?php if ($this->error->getPrevious()) : ?>
								<?php $loop = true; ?>
								<?php // Reference $this->_error here and in the loop as setError() assigns errors to this property and we need this for the backtrace to work correctly ?>
								<?php // Make the first assignment to setError() outside the loop so the loop does not skip Exceptions ?>
								<?php $this->setError($this->_error->getPrevious()); ?>
								<?php while ($loop === true) : ?>
									<p><strong><?php echo JText::_('JERROR_LAYOUT_PREVIOUS_ERROR'); ?></strong></p>
									<p>
										<?php echo htmlspecialchars($this->_error->getMessage(), ENT_QUOTES, 'UTF-8'); ?>
										<br/><?php echo htmlspecialchars($this->_error->getFile(), ENT_QUOTES, 'UTF-8');?>:<?php echo $this->_error->getLine(); ?>
									</p>
									<?php echo $this->renderBacktrace(); ?>
									<?php $loop = $this->setError($this->_error->getPrevious()); ?>
								<?php endwhile; ?>
								<?php // Reset the main error object to the base error ?>
								<?php $this->setError($this->error); ?>
							<?php endif; ?>
						</div>
					<?php endif; ?>
					<p><a href="<?php echo $this->baseurl; ?>" class="btn"><span class="icon-dashboard"></span> <?php echo JText::_('JGLOBAL_TPL_CPANEL_LINK_TEXT'); ?></a></p>
					<!-- End Content -->
				</div>
			</div>
			<!-- End Content -->
		</section>
		<hr />
	</div>
	<script>
		(function($){
			// fix sub nav on scroll
			var $win    = $(window)
			  , $nav    = $('.subhead')
			  , navTop  = $('.subhead').length && $('.subhead').offset().top - 40
			  , isFixed = 0

			processScroll()

			// hack sad times - holdover until rewrite for 2.1
			$nav.on('click', function ()
			{
				if (!isFixed) setTimeout(function () {  $win.scrollTop($win.scrollTop() - 47) }, 10)
			})

			$win.on('scroll', processScroll)

			function processScroll()
			{
				var i, scrollTop = $win.scrollTop()
				if (scrollTop >= navTop && !isFixed)
				{
					isFixed = 1
					$nav.addClass('subhead-fixed')
				} else if (scrollTop <= navTop && isFixed)
				{
					isFixed = 0
					$nav.removeClass('subhead-fixed')
				}
			}
		})(jQuery);
	</script>
</body>
</html>
templates/isis/css/template.css000060400000557440152453623430012650 0ustar00article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
nav,
section {
	display: block;
}
audio,
canvas,
video {
	display: inline-block;
	*display: inline;
	*zoom: 1;
}
audio:not([controls]) {
	display: none;
}
html {
	font-size: 100%;
	-webkit-text-size-adjust: 100%;
	-ms-text-size-adjust: 100%;
}
a:focus {
	outline: thin dotted #333;
	outline: 5px auto -webkit-focus-ring-color;
	outline-offset: -2px;
}
a:hover,
a:active {
	outline: 0;
}
sub,
sup {
	position: relative;
	font-size: 75%;
	line-height: 0;
	vertical-align: baseline;
}
sup {
	top: -0.5em;
}
sub {
	bottom: -0.25em;
}
img {
	max-width: 100%;
	width: auto \9;
	height: auto;
	vertical-align: middle;
	border: 0;
	-ms-interpolation-mode: bicubic;
}
#map_canvas img,
.google-maps img,
.gm-style img {
	max-width: none;
}
button,
input,
select,
textarea {
	margin: 0;
	font-size: 100%;
	vertical-align: middle;
}
button,
input {
	*overflow: visible;
	line-height: normal;
}
button::-moz-focus-inner,
input::-moz-focus-inner {
	padding: 0;
	border: 0;
}
button,
html input[type="button"],
input[type="reset"],
input[type="submit"] {
	-webkit-appearance: button;
	cursor: pointer;
}
label,
select,
button,
input[type="button"],
input[type="reset"],
input[type="submit"],
input[type="radio"],
input[type="checkbox"] {
	cursor: pointer;
}
input[type="search"] {
	-webkit-box-sizing: content-box;
	-moz-box-sizing: content-box;
	box-sizing: content-box;
	-webkit-appearance: textfield;
}
input[type="search"]::-webkit-search-decoration,
input[type="search"]::-webkit-search-cancel-button {
	-webkit-appearance: none;
}
textarea {
	overflow: auto;
	vertical-align: top;
}
@media print {
	* {
		text-shadow: none !important;
		color: #000 !important;
		background: transparent !important;
		box-shadow: none !important;
	}
	a,
	a:visited {
		text-decoration: underline;
	}
	a[href]:after {
		content: " (" attr(href) ")";
	}
	abbr[title]:after {
		content: " (" attr(title) ")";
	}
	.ir a:after,
	a[href^="javascript:"]:after,
	a[href^="#"]:after {
		content: "";
	}
	pre,
	blockquote {
		border: 1px solid #999;
		page-break-inside: avoid;
	}
	thead {
		display: table-header-group;
	}
	tr,
	img {
		page-break-inside: avoid;
	}
	img {
		max-width: 100% !important;
	}
	@page {
		margin: 0.5cm;
	}
	p,
	h2,
	h3 {
		orphans: 3;
		widows: 3;
	}
	h2,
	h3 {
		page-break-after: avoid;
	}
}
.clearfix {
	*zoom: 1;
}
.clearfix:before,
.clearfix:after {
	display: table;
	content: "";
	line-height: 0;
}
.clearfix:after {
	clear: both;
}
.hide-text {
	font: 0/0 a;
	color: transparent;
	text-shadow: none;
	background-color: transparent;
	border: 0;
}
.input-block-level {
	display: block;
	width: 100%;
	min-height: 28px;
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
}
body {
	margin: 0;
	font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
	font-size: 13px;
	line-height: 18px;
	color: #333;
	background-color: #fff;
}
a {
	color: #3071a9;
	text-decoration: none;
}
a:hover,
a:focus {
	color: #1f496e;
	text-decoration: underline;
}
.img-rounded {
	-webkit-border-radius: 6px;
	-moz-border-radius: 6px;
	border-radius: 6px;
}
.img-polaroid {
	padding: 4px;
	background-color: #fff;
	border: 1px solid #ccc;
	border: 1px solid rgba(0,0,0,0.2);
	-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.1);
	-moz-box-shadow: 0 1px 3px rgba(0,0,0,0.1);
	box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.img-circle {
	-webkit-border-radius: 500px;
	-moz-border-radius: 500px;
	border-radius: 500px;
}
.row {
	margin-left: -20px;
	*zoom: 1;
}
.row:before,
.row:after {
	display: table;
	content: "";
	line-height: 0;
}
.row:after {
	clear: both;
}
[class*="span"] {
	float: left;
	min-height: 1px;
	margin-left: 20px;
}
.container,
.navbar-static-top .container,
.navbar-fixed-top .container,
.navbar-fixed-bottom .container {
	width: 940px;
}
.span12 {
	width: 940px;
}
.span11 {
	width: 860px;
}
.span10 {
	width: 780px;
}
.span9 {
	width: 700px;
}
.span8 {
	width: 620px;
}
.span7 {
	width: 540px;
}
.span6 {
	width: 460px;
}
.span5 {
	width: 380px;
}
.span4 {
	width: 300px;
}
.span3 {
	width: 220px;
}
.span2 {
	width: 140px;
}
.span1 {
	width: 60px;
}
.offset12 {
	margin-left: 980px;
}
.offset11 {
	margin-left: 900px;
}
.offset10 {
	margin-left: 820px;
}
.offset9 {
	margin-left: 740px;
}
.offset8 {
	margin-left: 660px;
}
.offset7 {
	margin-left: 580px;
}
.offset6 {
	margin-left: 500px;
}
.offset5 {
	margin-left: 420px;
}
.offset4 {
	margin-left: 340px;
}
.offset3 {
	margin-left: 260px;
}
.offset2 {
	margin-left: 180px;
}
.offset1 {
	margin-left: 100px;
}
.row-fluid {
	width: 100%;
	*zoom: 1;
}
.row-fluid:before,
.row-fluid:after {
	display: table;
	content: "";
	line-height: 0;
}
.row-fluid:after {
	clear: both;
}
.row-fluid [class*="span"] {
	display: block;
	width: 100%;
	min-height: 28px;
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
	float: left;
	margin-left: 2.1276595744681%;
	*margin-left: 2.0744680851064%;
}
.row-fluid [class*="span"]:first-child {
	margin-left: 0;
}
.row-fluid .controls-row [class*="span"] + [class*="span"] {
	margin-left: 2.1276595744681%;
}
.row-fluid .span12 {
	width: 100%;
	*width: 99.946808510638%;
}
.row-fluid .span11 {
	width: 91.489361702128%;
	*width: 91.436170212766%;
}
.row-fluid .span10 {
	width: 82.978723404255%;
	*width: 82.925531914894%;
}
.row-fluid .span9 {
	width: 74.468085106383%;
	*width: 74.414893617021%;
}
.row-fluid .span8 {
	width: 65.957446808511%;
	*width: 65.904255319149%;
}
.row-fluid .span7 {
	width: 57.446808510638%;
	*width: 57.393617021277%;
}
.row-fluid .span6 {
	width: 48.936170212766%;
	*width: 48.882978723404%;
}
.row-fluid .span5 {
	width: 40.425531914894%;
	*width: 40.372340425532%;
}
.row-fluid .span4 {
	width: 31.914893617021%;
	*width: 31.86170212766%;
}
.row-fluid .span3 {
	width: 23.404255319149%;
	*width: 23.351063829787%;
}
.row-fluid .span2 {
	width: 14.893617021277%;
	*width: 14.840425531915%;
}
.row-fluid .span1 {
	width: 6.3829787234043%;
	*width: 6.3297872340426%;
}
.row-fluid .offset12 {
	margin-left: 104.25531914894%;
	*margin-left: 104.14893617021%;
}
.row-fluid .offset12:first-child {
	margin-left: 102.12765957447%;
	*margin-left: 102.02127659574%;
}
.row-fluid .offset11 {
	margin-left: 95.744680851064%;
	*margin-left: 95.63829787234%;
}
.row-fluid .offset11:first-child {
	margin-left: 93.617021276596%;
	*margin-left: 93.510638297872%;
}
.row-fluid .offset10 {
	margin-left: 87.234042553191%;
	*margin-left: 87.127659574468%;
}
.row-fluid .offset10:first-child {
	margin-left: 85.106382978723%;
	*margin-left: 85%;
}
.row-fluid .offset9 {
	margin-left: 78.723404255319%;
	*margin-left: 78.617021276596%;
}
.row-fluid .offset9:first-child {
	margin-left: 76.595744680851%;
	*margin-left: 76.489361702128%;
}
.row-fluid .offset8 {
	margin-left: 70.212765957447%;
	*margin-left: 70.106382978723%;
}
.row-fluid .offset8:first-child {
	margin-left: 68.085106382979%;
	*margin-left: 67.978723404255%;
}
.row-fluid .offset7 {
	margin-left: 61.702127659574%;
	*margin-left: 61.595744680851%;
}
.row-fluid .offset7:first-child {
	margin-left: 59.574468085106%;
	*margin-left: 59.468085106383%;
}
.row-fluid .offset6 {
	margin-left: 53.191489361702%;
	*margin-left: 53.085106382979%;
}
.row-fluid .offset6:first-child {
	margin-left: 51.063829787234%;
	*margin-left: 50.957446808511%;
}
.row-fluid .offset5 {
	margin-left: 44.68085106383%;
	*margin-left: 44.574468085106%;
}
.row-fluid .offset5:first-child {
	margin-left: 42.553191489362%;
	*margin-left: 42.446808510638%;
}
.row-fluid .offset4 {
	margin-left: 36.170212765957%;
	*margin-left: 36.063829787234%;
}
.row-fluid .offset4:first-child {
	margin-left: 34.042553191489%;
	*margin-left: 33.936170212766%;
}
.row-fluid .offset3 {
	margin-left: 27.659574468085%;
	*margin-left: 27.553191489362%;
}
.row-fluid .offset3:first-child {
	margin-left: 25.531914893617%;
	*margin-left: 25.425531914894%;
}
.row-fluid .offset2 {
	margin-left: 19.148936170213%;
	*margin-left: 19.042553191489%;
}
.row-fluid .offset2:first-child {
	margin-left: 17.021276595745%;
	*margin-left: 16.914893617021%;
}
.row-fluid .offset1 {
	margin-left: 10.63829787234%;
	*margin-left: 10.531914893617%;
}
.row-fluid .offset1:first-child {
	margin-left: 8.5106382978723%;
	*margin-left: 8.4042553191489%;
}
[class*="span"].hide,
.row-fluid [class*="span"].hide {
	display: none;
}
[class*="span"].pull-right,
.row-fluid [class*="span"].pull-right {
	float: right;
}
.container {
	margin-right: auto;
	margin-left: auto;
	*zoom: 1;
}
.container:before,
.container:after {
	display: table;
	content: "";
	line-height: 0;
}
.container:after {
	clear: both;
}
.container-fluid {
	padding-right: 20px;
	padding-left: 20px;
	*zoom: 1;
}
.container-fluid:before,
.container-fluid:after {
	display: table;
	content: "";
	line-height: 0;
}
.container-fluid:after {
	clear: both;
}
p {
	margin: 0 0 9px;
}
.lead {
	margin-bottom: 18px;
	font-size: 19.5px;
	font-weight: 200;
	line-height: 27px;
}
small {
	font-size: 85%;
}
strong {
	font-weight: bold;
}
em {
	font-style: italic;
}
cite {
	font-style: normal;
}
.muted {
	color: #999;
}
a.muted:hover,
a.muted:focus {
	color: #808080;
}
.text-warning {
	color: #8a6d3b;
}
a.text-warning:hover,
a.text-warning:focus {
	color: #66512c;
}
.text-error {
	color: #a94442;
}
a.text-error:hover,
a.text-error:focus {
	color: #843534;
}
.text-info {
	color: #31708f;
}
a.text-info:hover,
a.text-info:focus {
	color: #245269;
}
.text-success {
	color: #3c763d;
}
a.text-success:hover,
a.text-success:focus {
	color: #2b542c;
}
.text-left {
	text-align: left;
}
.text-right {
	text-align: right;
}
.text-center {
	text-align: center;
}
h1,
h2,
h3,
h4,
h5,
h6 {
	margin: 9px 0;
	font-family: inherit;
	font-weight: bold;
	line-height: 18px;
	color: inherit;
	text-rendering: optimizelegibility;
}
h1 small,
h2 small,
h3 small,
h4 small,
h5 small,
h6 small {
	font-weight: normal;
	line-height: 1;
	color: #999;
}
h1,
h2,
h3 {
	line-height: 36px;
}
h1 {
	font-size: 35.75px;
}
h2 {
	font-size: 29.25px;
}
h3 {
	font-size: 22.75px;
}
h4 {
	font-size: 16.25px;
}
h5 {
	font-size: 13px;
}
h6 {
	font-size: 11.05px;
}
h1 small {
	font-size: 22.75px;
}
h2 small {
	font-size: 16.25px;
}
h3 small {
	font-size: 13px;
}
h4 small {
	font-size: 13px;
}
.page-header {
	padding-bottom: 8px;
	margin: 18px 0 27px;
	border-bottom: 1px solid #eee;
}
ul,
ol {
	padding: 0;
	margin: 0 0 9px 25px;
}
ul ul,
ul ol,
ol ol,
ol ul {
	margin-bottom: 0;
}
li {
	line-height: 18px;
}
ul.unstyled,
ol.unstyled {
	margin-left: 0;
	list-style: none;
}
ul.inline,
ol.inline {
	margin-left: 0;
	list-style: none;
}
ul.inline > li,
ol.inline > li {
	display: inline-block;
	*display: inline;
	*zoom: 1;
	padding-left: 5px;
	padding-right: 5px;
}
dl {
	margin-bottom: 18px;
}
dt,
dd {
	line-height: 18px;
}
dt {
	font-weight: bold;
}
dd {
	margin-left: 9px;
}
.dl-horizontal {
	*zoom: 1;
}
.dl-horizontal:before,
.dl-horizontal:after {
	display: table;
	content: "";
	line-height: 0;
}
.dl-horizontal:after {
	clear: both;
}
.dl-horizontal dt {
	float: left;
	width: 160px;
	clear: left;
	text-align: right;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.dl-horizontal dd {
	margin-left: 180px;
}
hr {
	margin: 18px 0;
	border: 0;
	border-top: 1px solid #eee;
	border-bottom: 1px solid #fff;
}
abbr[title],
abbr[data-original-title] {
	cursor: help;
	border-bottom: 1px dotted #999;
}
abbr.initialism {
	font-size: 90%;
	text-transform: uppercase;
}
blockquote {
	padding: 0 0 0 15px;
	margin: 0 0 18px;
	border-left: 5px solid #eee;
}
blockquote p {
	margin-bottom: 0;
	font-size: 16.25px;
	font-weight: 300;
	line-height: 1.25;
}
blockquote small {
	display: block;
	line-height: 18px;
	color: #999;
}
blockquote small:before {
	content: '\2014 \00A0';
}
blockquote.pull-right {
	float: right;
	padding-right: 15px;
	padding-left: 0;
	border-right: 5px solid #eee;
	border-left: 0;
}
blockquote.pull-right p,
blockquote.pull-right small {
	text-align: right;
}
blockquote.pull-right small:before {
	content: '';
}
blockquote.pull-right small:after {
	content: '\00A0 \2014';
}
q:before,
q:after,
blockquote:before,
blockquote:after {
	content: "";
}
address {
	display: block;
	margin-bottom: 18px;
	font-style: normal;
	line-height: 18px;
}
code,
pre {
	padding: 0 3px 2px;
	font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
	font-size: 11px;
	color: #333;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
code {
	padding: 2px 4px;
	color: #d14;
	background-color: #f7f7f9;
	border: 1px solid #e1e1e8;
	white-space: nowrap;
}
pre {
	display: block;
	padding: 8.5px;
	margin: 0 0 9px;
	font-size: 12px;
	line-height: 18px;
	word-break: break-all;
	word-wrap: break-word;
	white-space: pre;
	white-space: pre-wrap;
	background-color: #f5f5f5;
	border: 1px solid #ccc;
	border: 1px solid rgba(0,0,0,0.15);
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
pre.prettyprint {
	margin-bottom: 18px;
}
pre code {
	padding: 0;
	color: inherit;
	white-space: pre;
	white-space: pre-wrap;
	background-color: transparent;
	border: 0;
}
.pre-scrollable {
	max-height: 340px;
	overflow-y: scroll;
}
form {
	margin: 0 0 18px;
}
fieldset {
	padding: 0;
	margin: 0;
	border: 0;
}
legend {
	display: block;
	width: 100%;
	padding: 0;
	margin-bottom: 18px;
	font-size: 19.5px;
	line-height: 36px;
	color: #333;
	border: 0;
	border-bottom: 1px solid #e5e5e5;
}
legend small {
	font-size: 13.5px;
	color: #999;
}
label,
input,
button,
select,
textarea {
	font-size: 13px;
	font-weight: normal;
	line-height: 18px;
}
input,
button,
select,
textarea {
	font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
label {
	display: block;
	margin-bottom: 5px;
}
select,
textarea,
input[type="text"],
input[type="password"],
input[type="datetime"],
input[type="datetime-local"],
input[type="date"],
input[type="month"],
input[type="time"],
input[type="week"],
input[type="number"],
input[type="email"],
input[type="url"],
input[type="search"],
input[type="tel"],
input[type="color"],
.uneditable-input {
	display: inline-block;
	height: 18px;
	padding: 4px 6px;
	margin-bottom: 9px;
	font-size: 13px;
	line-height: 18px;
	color: #555;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
	vertical-align: middle;
}
input,
textarea,
.uneditable-input {
	width: 206px;
}
textarea {
	height: auto;
}
textarea,
input[type="text"],
input[type="password"],
input[type="datetime"],
input[type="datetime-local"],
input[type="date"],
input[type="month"],
input[type="time"],
input[type="week"],
input[type="number"],
input[type="email"],
input[type="url"],
input[type="search"],
input[type="tel"],
input[type="color"],
.uneditable-input {
	background-color: #fff;
	border: 1px solid #ccc;
	-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);
	-moz-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);
	box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);
	-webkit-transition: border linear .2s, box-shadow linear .2s;
	-moz-transition: border linear .2s, box-shadow linear .2s;
	-o-transition: border linear .2s, box-shadow linear .2s;
	transition: border linear .2s, box-shadow linear .2s;
}
textarea:focus,
input[type="text"]:focus,
input[type="password"]:focus,
input[type="datetime"]:focus,
input[type="datetime-local"]:focus,
input[type="date"]:focus,
input[type="month"]:focus,
input[type="time"]:focus,
input[type="week"]:focus,
input[type="number"]:focus,
input[type="email"]:focus,
input[type="url"]:focus,
input[type="search"]:focus,
input[type="tel"]:focus,
input[type="color"]:focus,
.uneditable-input:focus {
	border-color: rgba(82,168,236,0.8);
	outline: 0;
	outline: thin dotted \9;
	-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
	-moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
	box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
}
input[type="radio"],
input[type="checkbox"] {
	margin: 4px 0 0;
	*margin-top: 0;
	margin-top: 1px \9;
	line-height: normal;
}
input[type="file"],
input[type="image"],
input[type="submit"],
input[type="reset"],
input[type="button"],
input[type="radio"],
input[type="checkbox"] {
	width: auto;
}
select,
input[type="file"] {
	height: 28px;
	*margin-top: 4px;
	line-height: 28px;
}
select {
	width: 220px;
	border: 1px solid #ccc;
	background-color: #fff;
}
select[multiple],
select[size] {
	height: auto;
}
select:focus,
input[type="file"]:focus,
input[type="radio"]:focus,
input[type="checkbox"]:focus {
	outline: thin dotted #333;
	outline: 5px auto -webkit-focus-ring-color;
	outline-offset: -2px;
}
.uneditable-input,
.uneditable-textarea {
	color: #999;
	background-color: #fcfcfc;
	border-color: #ccc;
	-webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,0.025);
	-moz-box-shadow: inset 0 1px 2px rgba(0,0,0,0.025);
	box-shadow: inset 0 1px 2px rgba(0,0,0,0.025);
	cursor: not-allowed;
}
.uneditable-input {
	overflow: hidden;
	white-space: nowrap;
}
.uneditable-textarea {
	width: auto;
	height: auto;
}
input:-moz-placeholder,
textarea:-moz-placeholder {
	color: #999;
}
input:-ms-input-placeholder,
textarea:-ms-input-placeholder {
	color: #999;
}
input::-webkit-input-placeholder,
textarea::-webkit-input-placeholder {
	color: #999;
}
.radio,
.checkbox {
	min-height: 18px;
	padding-left: 20px;
}
.radio input[type="radio"],
.checkbox input[type="checkbox"] {
	float: left;
	margin-left: -20px;
}
.controls > .radio:first-child,
.controls > .checkbox:first-child {
	padding-top: 5px;
}
.radio.inline,
.checkbox.inline {
	display: inline-block;
	padding-top: 5px;
	margin-bottom: 0;
	vertical-align: middle;
}
.radio.inline + .radio.inline,
.checkbox.inline + .checkbox.inline {
	margin-left: 10px;
}
.input-mini {
	width: 60px;
}
.input-small {
	width: 90px;
}
.input-medium {
	width: 150px;
}
.input-large {
	width: 210px;
}
.input-xlarge {
	width: 270px;
}
.input-xxlarge {
	width: 530px;
}
input[class*="span"],
select[class*="span"],
textarea[class*="span"],
.uneditable-input[class*="span"],
.row-fluid input[class*="span"],
.row-fluid select[class*="span"],
.row-fluid textarea[class*="span"],
.row-fluid .uneditable-input[class*="span"] {
	float: none;
	margin-left: 0;
}
.input-append input[class*="span"],
.input-append .uneditable-input[class*="span"],
.input-prepend input[class*="span"],
.input-prepend .uneditable-input[class*="span"],
.row-fluid input[class*="span"],
.row-fluid select[class*="span"],
.row-fluid textarea[class*="span"],
.row-fluid .uneditable-input[class*="span"],
.row-fluid .input-prepend [class*="span"],
.row-fluid .input-append [class*="span"] {
	display: inline-block;
}
input,
textarea,
.uneditable-input {
	margin-left: 0;
}
.controls-row [class*="span"] + [class*="span"] {
	margin-left: 20px;
}
input.span12,
textarea.span12,
.uneditable-input.span12 {
	width: 926px;
}
input.span11,
textarea.span11,
.uneditable-input.span11 {
	width: 846px;
}
input.span10,
textarea.span10,
.uneditable-input.span10 {
	width: 766px;
}
input.span9,
textarea.span9,
.uneditable-input.span9 {
	width: 686px;
}
input.span8,
textarea.span8,
.uneditable-input.span8 {
	width: 606px;
}
input.span7,
textarea.span7,
.uneditable-input.span7 {
	width: 526px;
}
input.span6,
textarea.span6,
.uneditable-input.span6 {
	width: 446px;
}
input.span5,
textarea.span5,
.uneditable-input.span5 {
	width: 366px;
}
input.span4,
textarea.span4,
.uneditable-input.span4 {
	width: 286px;
}
input.span3,
textarea.span3,
.uneditable-input.span3 {
	width: 206px;
}
input.span2,
textarea.span2,
.uneditable-input.span2 {
	width: 126px;
}
input.span1,
textarea.span1,
.uneditable-input.span1 {
	width: 46px;
}
.controls-row {
	*zoom: 1;
}
.controls-row:before,
.controls-row:after {
	display: table;
	content: "";
	line-height: 0;
}
.controls-row:after {
	clear: both;
}
.controls-row [class*="span"],
.row-fluid .controls-row [class*="span"] {
	float: left;
}
.controls-row .checkbox[class*="span"],
.controls-row .radio[class*="span"] {
	padding-top: 5px;
}
input[disabled],
select[disabled],
textarea[disabled],
input[readonly],
select[readonly],
textarea[readonly] {
	cursor: not-allowed;
	background-color: #eee;
}
input[type="radio"][disabled],
input[type="checkbox"][disabled],
input[type="radio"][readonly],
input[type="checkbox"][readonly] {
	background-color: transparent;
}
.control-group.warning .control-label,
.control-group.warning .help-block,
.control-group.warning .help-inline {
	color: #8a6d3b;
}
.control-group.warning .checkbox,
.control-group.warning .radio,
.control-group.warning input,
.control-group.warning select,
.control-group.warning textarea {
	color: #8a6d3b;
}
.control-group.warning input,
.control-group.warning select,
.control-group.warning textarea {
	border-color: #8a6d3b;
}
.control-group.warning input:focus,
.control-group.warning select:focus,
.control-group.warning textarea:focus {
	border-color: #66512c;
}
.control-group.warning .input-prepend .add-on,
.control-group.warning .input-append .add-on {
	color: #8a6d3b;
	background-color: #fcf8e3;
	border-color: #8a6d3b;
}
.control-group.error .control-label,
.control-group.error .help-block,
.control-group.error .help-inline {
	color: #a94442;
}
.control-group.error .checkbox,
.control-group.error .radio,
.control-group.error input,
.control-group.error select,
.control-group.error textarea {
	color: #a94442;
}
.control-group.error input,
.control-group.error select,
.control-group.error textarea {
	border-color: #a94442;
}
.control-group.error input:focus,
.control-group.error select:focus,
.control-group.error textarea:focus {
	border-color: #843534;
}
.control-group.error .input-prepend .add-on,
.control-group.error .input-append .add-on {
	color: #a94442;
	background-color: #f2dede;
	border-color: #a94442;
}
.control-group.success .control-label,
.control-group.success .help-block,
.control-group.success .help-inline {
	color: #3c763d;
}
.control-group.success .checkbox,
.control-group.success .radio,
.control-group.success input,
.control-group.success select,
.control-group.success textarea {
	color: #3c763d;
}
.control-group.success input,
.control-group.success select,
.control-group.success textarea {
	border-color: #3c763d;
}
.control-group.success input:focus,
.control-group.success select:focus,
.control-group.success textarea:focus {
	border-color: #2b542c;
}
.control-group.success .input-prepend .add-on,
.control-group.success .input-append .add-on {
	color: #3c763d;
	background-color: #dff0d8;
	border-color: #3c763d;
}
.control-group.info .control-label,
.control-group.info .help-block,
.control-group.info .help-inline {
	color: #31708f;
}
.control-group.info .checkbox,
.control-group.info .radio,
.control-group.info input,
.control-group.info select,
.control-group.info textarea {
	color: #31708f;
}
.control-group.info input,
.control-group.info select,
.control-group.info textarea {
	border-color: #31708f;
}
.control-group.info input:focus,
.control-group.info select:focus,
.control-group.info textarea:focus {
	border-color: #245269;
}
.control-group.info .input-prepend .add-on,
.control-group.info .input-append .add-on {
	color: #31708f;
	background-color: #d9edf7;
	border-color: #31708f;
}
input:focus:invalid,
textarea:focus:invalid,
select:focus:invalid {
	color: #b94a48;
	border-color: #ee5f5b;
}
input:focus:invalid:focus,
textarea:focus:invalid:focus,
select:focus:invalid:focus {
	border-color: #e9322d;
	-webkit-box-shadow: 0 0 6px #f8b9b7;
	-moz-box-shadow: 0 0 6px #f8b9b7;
	box-shadow: 0 0 6px #f8b9b7;
}
.form-actions {
	padding: 17px 20px 18px;
	margin-top: 18px;
	margin-bottom: 18px;
	background-color: #F0F0F0;
	border-top: 1px solid #e5e5e5;
	*zoom: 1;
}
.form-actions:before,
.form-actions:after {
	display: table;
	content: "";
	line-height: 0;
}
.form-actions:after {
	clear: both;
}
.help-block,
.help-inline {
	color: #595959;
}
.help-block {
	display: block;
	margin-bottom: 9px;
}
.help-inline {
	display: inline-block;
	*display: inline;
	*zoom: 1;
	vertical-align: middle;
	padding-left: 5px;
}
.input-append,
.input-prepend {
	display: inline-block;
	margin-bottom: 9px;
	vertical-align: middle;
	font-size: 0;
	white-space: nowrap;
}
.input-append input,
.input-append select,
.input-append .uneditable-input,
.input-append .dropdown-menu,
.input-append .popover,
.input-prepend input,
.input-prepend select,
.input-prepend .uneditable-input,
.input-prepend .dropdown-menu,
.input-prepend .popover {
	font-size: 13px;
}
.input-append input,
.input-append select,
.input-append .uneditable-input,
.input-prepend input,
.input-prepend select,
.input-prepend .uneditable-input {
	position: relative;
	margin-bottom: 0;
	*margin-left: 0;
	vertical-align: top;
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.input-append input:focus,
.input-append select:focus,
.input-append .uneditable-input:focus,
.input-prepend input:focus,
.input-prepend select:focus,
.input-prepend .uneditable-input:focus {
	z-index: 2;
}
.input-append .add-on,
.input-prepend .add-on {
	display: inline-block;
	width: auto;
	height: 18px;
	min-width: 16px;
	padding: 4px 5px;
	font-size: 13px;
	font-weight: normal;
	line-height: 18px;
	text-align: center;
	text-shadow: 0 1px 0 #fff;
	background-color: #eee;
	border: 1px solid #ccc;
}
.input-append .add-on,
.input-append .btn,
.input-append .btn-group > .dropdown-toggle,
.input-prepend .add-on,
.input-prepend .btn,
.input-prepend .btn-group > .dropdown-toggle {
	vertical-align: top;
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.input-prepend .add-on,
.input-prepend .btn {
	margin-right: -1px;
}
.input-prepend .add-on:first-child,
.input-prepend .btn:first-child {
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
}
.input-append input,
.input-append select,
.input-append .uneditable-input {
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
}
.input-append input + .btn-group .btn:last-child,
.input-append select + .btn-group .btn:last-child,
.input-append .uneditable-input + .btn-group .btn:last-child {
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.input-append .add-on,
.input-append .btn,
.input-append .btn-group {
	margin-left: -1px;
}
.input-append .add-on:last-child,
.input-append .btn:last-child,
.input-append .btn-group:last-child > .dropdown-toggle {
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.input-prepend.input-append input,
.input-prepend.input-append select,
.input-prepend.input-append .uneditable-input {
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.input-prepend.input-append input + .btn-group .btn,
.input-prepend.input-append select + .btn-group .btn,
.input-prepend.input-append .uneditable-input + .btn-group .btn {
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.input-prepend.input-append .add-on:first-child,
.input-prepend.input-append .btn:first-child {
	margin-right: -1px;
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
}
.input-prepend.input-append .add-on:last-child,
.input-prepend.input-append .btn:last-child {
	margin-left: -1px;
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.input-prepend.input-append .btn-group:first-child {
	margin-left: 0;
}
input.search-query {
	padding-right: 14px;
	padding-right: 4px \9;
	padding-left: 14px;
	padding-left: 4px \9;
	margin-bottom: 0;
	-webkit-border-radius: 15px;
	-moz-border-radius: 15px;
	border-radius: 15px;
}
.form-search .input-append .search-query,
.form-search .input-prepend .search-query {
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.form-search .input-append .search-query {
	-webkit-border-radius: 14px 0 0 14px;
	-moz-border-radius: 14px 0 0 14px;
	border-radius: 14px 0 0 14px;
}
.form-search .input-append .btn {
	-webkit-border-radius: 0 14px 14px 0;
	-moz-border-radius: 0 14px 14px 0;
	border-radius: 0 14px 14px 0;
}
.form-search .input-prepend .search-query {
	-webkit-border-radius: 0 14px 14px 0;
	-moz-border-radius: 0 14px 14px 0;
	border-radius: 0 14px 14px 0;
}
.form-search .input-prepend .btn {
	-webkit-border-radius: 14px 0 0 14px;
	-moz-border-radius: 14px 0 0 14px;
	border-radius: 14px 0 0 14px;
}
.js-stools-field-filter .input-prepend,
.js-stools-field-filter .input-append {
	margin-bottom: 0;
}
.form-search input,
.form-search textarea,
.form-search select,
.form-search .help-inline,
.form-search .uneditable-input,
.form-search .input-prepend,
.form-search .input-append,
.form-inline input,
.form-inline textarea,
.form-inline select,
.form-inline .help-inline,
.form-inline .uneditable-input,
.form-inline .input-prepend,
.form-inline .input-append,
.form-horizontal input,
.form-horizontal textarea,
.form-horizontal select,
.form-horizontal .help-inline,
.form-horizontal .uneditable-input,
.form-horizontal .input-prepend,
.form-horizontal .input-append {
	display: inline-block;
	*display: inline;
	*zoom: 1;
	margin-bottom: 0;
	vertical-align: middle;
}
.form-search .hide,
.form-inline .hide,
.form-horizontal .hide {
	display: none;
}
.form-search label,
.form-inline label,
.form-search .btn-group,
.form-inline .btn-group {
	display: inline-block;
}
.form-search .input-append,
.form-inline .input-append,
.form-search .input-prepend,
.form-inline .input-prepend {
	margin-bottom: 0;
}
.form-search .radio,
.form-search .checkbox,
.form-inline .radio,
.form-inline .checkbox {
	padding-left: 0;
	margin-bottom: 0;
	vertical-align: middle;
}
.form-search .radio input[type="radio"],
.form-search .checkbox input[type="checkbox"],
.form-inline .radio input[type="radio"],
.form-inline .checkbox input[type="checkbox"] {
	float: left;
	margin-right: 3px;
	margin-left: 0;
}
.control-group {
	margin-bottom: 9px;
}
legend + .control-group {
	margin-top: 18px;
	-webkit-margin-top-collapse: separate;
}
.form-horizontal .control-group {
	margin-bottom: 18px;
	*zoom: 1;
}
.form-horizontal .control-group:before,
.form-horizontal .control-group:after {
	display: table;
	content: "";
	line-height: 0;
}
.form-horizontal .control-group:after {
	clear: both;
}
.form-horizontal .control-label {
	float: left;
	width: 160px;
	padding-top: 5px;
	text-align: right;
}
.form-horizontal .controls {
	*display: inline-block;
	*padding-left: 20px;
	margin-left: 180px;
	*margin-left: 0;
}
.form-horizontal .controls:first-child {
	*padding-left: 180px;
}
.form-horizontal .help-block {
	margin-bottom: 0;
}
.form-horizontal input + .help-block,
.form-horizontal select + .help-block,
.form-horizontal textarea + .help-block,
.form-horizontal .uneditable-input + .help-block,
.form-horizontal .input-prepend + .help-block,
.form-horizontal .input-append + .help-block {
	margin-top: 9px;
}
.form-horizontal .form-actions {
	padding-left: 180px;
}
.control-label .hasPopover,
.control-label .hasTooltip {
	display: inline-block;
}
.subform-repeatable-wrapper .btn-group>.btn.button {
	min-width: 0;
}
.subform-repeatable-wrapper .ui-sortable-helper {
	background: #fff;
}
.subform-repeatable-wrapper tr.ui-sortable-helper {
	display: table;
}
@media (min-width: 980px) and (max-width: 1215px) {
	.float-cols .control-label {
		float: none;
	}
	.float-cols .controls {
		margin-left: 0;
	}
}
table {
	max-width: 100%;
	background-color: transparent;
	border-collapse: collapse;
	border-spacing: 0;
}
.table {
	width: 100%;
	margin-bottom: 18px;
}
.table th,
.table td {
	padding: 8px;
	line-height: 18px;
	text-align: left;
	vertical-align: top;
	border-top: 1px solid #ddd;
}
.table th {
	font-weight: bold;
}
.table thead th {
	vertical-align: bottom;
}
.table caption + thead tr:first-child th,
.table caption + thead tr:first-child td,
.table colgroup + thead tr:first-child th,
.table colgroup + thead tr:first-child td,
.table thead:first-child tr:first-child th,
.table thead:first-child tr:first-child td {
	border-top: 0;
}
.table tbody + tbody {
	border-top: 2px solid #ddd;
}
.table .table {
	background-color: #fff;
}
.table-condensed th,
.table-condensed td {
	padding: 4px 5px;
}
.table-bordered {
	border: 1px solid #ddd;
	border-collapse: separate;
	*border-collapse: collapse;
	border-left: 0;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.table-bordered th,
.table-bordered td {
	border-left: 1px solid #ddd;
}
.table-bordered caption + thead tr:first-child th,
.table-bordered caption + tbody tr:first-child th,
.table-bordered caption + tbody tr:first-child td,
.table-bordered colgroup + thead tr:first-child th,
.table-bordered colgroup + tbody tr:first-child th,
.table-bordered colgroup + tbody tr:first-child td,
.table-bordered thead:first-child tr:first-child th,
.table-bordered tbody:first-child tr:first-child th,
.table-bordered tbody:first-child tr:first-child td {
	border-top: 0;
}
.table-bordered thead:first-child tr:first-child > th:first-child,
.table-bordered tbody:first-child tr:first-child > td:first-child,
.table-bordered tbody:first-child tr:first-child > th:first-child {
	-webkit-border-top-left-radius: 3px;
	-moz-border-radius-topleft: 3px;
	border-top-left-radius: 3px;
}
.table-bordered thead:first-child tr:first-child > th:last-child,
.table-bordered tbody:first-child tr:first-child > td:last-child,
.table-bordered tbody:first-child tr:first-child > th:last-child {
	-webkit-border-top-right-radius: 3px;
	-moz-border-radius-topright: 3px;
	border-top-right-radius: 3px;
}
.table-bordered thead:last-child tr:last-child > th:first-child,
.table-bordered tbody:last-child tr:last-child > td:first-child,
.table-bordered tbody:last-child tr:last-child > th:first-child,
.table-bordered tfoot:last-child tr:last-child > td:first-child,
.table-bordered tfoot:last-child tr:last-child > th:first-child {
	-webkit-border-bottom-left-radius: 3px;
	-moz-border-radius-bottomleft: 3px;
	border-bottom-left-radius: 3px;
}
.table-bordered thead:last-child tr:last-child > th:last-child,
.table-bordered tbody:last-child tr:last-child > td:last-child,
.table-bordered tbody:last-child tr:last-child > th:last-child,
.table-bordered tfoot:last-child tr:last-child > td:last-child,
.table-bordered tfoot:last-child tr:last-child > th:last-child {
	-webkit-border-bottom-right-radius: 3px;
	-moz-border-radius-bottomright: 3px;
	border-bottom-right-radius: 3px;
}
.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {
	-webkit-border-bottom-left-radius: 0;
	-moz-border-radius-bottomleft: 0;
	border-bottom-left-radius: 0;
}
.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {
	-webkit-border-bottom-right-radius: 0;
	-moz-border-radius-bottomright: 0;
	border-bottom-right-radius: 0;
}
.table-bordered caption + thead tr:first-child th:first-child,
.table-bordered caption + tbody tr:first-child td:first-child,
.table-bordered colgroup + thead tr:first-child th:first-child,
.table-bordered colgroup + tbody tr:first-child td:first-child {
	-webkit-border-top-left-radius: 3px;
	-moz-border-radius-topleft: 3px;
	border-top-left-radius: 3px;
}
.table-bordered caption + thead tr:first-child th:last-child,
.table-bordered caption + tbody tr:first-child td:last-child,
.table-bordered colgroup + thead tr:first-child th:last-child,
.table-bordered colgroup + tbody tr:first-child td:last-child {
	-webkit-border-top-right-radius: 3px;
	-moz-border-radius-topright: 3px;
	border-top-right-radius: 3px;
}
.table-striped tbody > tr:nth-child(odd) > td,
.table-striped tbody > tr:nth-child(odd) > th {
	background-color: #f9f9f9;
}
.table-hover tbody tr:hover > td,
.table-hover tbody tr:hover > th {
	background-color: #F0F0F0;
}
table td[class*="span"],
table th[class*="span"],
.row-fluid table td[class*="span"],
.row-fluid table th[class*="span"] {
	display: table-cell;
	float: none;
	margin-left: 0;
}
.table td.span1,
.table th.span1 {
	float: none;
	width: 44px;
	margin-left: 0;
}
.table td.span2,
.table th.span2 {
	float: none;
	width: 124px;
	margin-left: 0;
}
.table td.span3,
.table th.span3 {
	float: none;
	width: 204px;
	margin-left: 0;
}
.table td.span4,
.table th.span4 {
	float: none;
	width: 284px;
	margin-left: 0;
}
.table td.span5,
.table th.span5 {
	float: none;
	width: 364px;
	margin-left: 0;
}
.table td.span6,
.table th.span6 {
	float: none;
	width: 444px;
	margin-left: 0;
}
.table td.span7,
.table th.span7 {
	float: none;
	width: 524px;
	margin-left: 0;
}
.table td.span8,
.table th.span8 {
	float: none;
	width: 604px;
	margin-left: 0;
}
.table td.span9,
.table th.span9 {
	float: none;
	width: 684px;
	margin-left: 0;
}
.table td.span10,
.table th.span10 {
	float: none;
	width: 764px;
	margin-left: 0;
}
.table td.span11,
.table th.span11 {
	float: none;
	width: 844px;
	margin-left: 0;
}
.table td.span12,
.table th.span12 {
	float: none;
	width: 924px;
	margin-left: 0;
}
.table tbody tr.success > td {
	background-color: #dff0d8;
}
.table tbody tr.error > td {
	background-color: #f2dede;
}
.table tbody tr.warning > td {
	background-color: #fcf8e3;
}
.table tbody tr.info > td {
	background-color: #d9edf7;
}
.table-hover tbody tr.success:hover > td {
	background-color: #d0e9c6;
}
.table-hover tbody tr.error:hover > td {
	background-color: #ebcccc;
}
.table-hover tbody tr.warning:hover > td {
	background-color: #faf2cc;
}
.table-hover tbody tr.info:hover > td {
	background-color: #c4e3f3;
}
.table-noheader {
	border-collapse: collapse;
}
.table-noheader thead {
	display: none;
}
.dropup,
.dropdown {
	position: relative;
}
.dropdown-toggle {
	*margin-bottom: -3px;
}
.dropdown-toggle:active,
.open .dropdown-toggle {
	outline: 0;
}
.caret {
	display: inline-block;
	width: 0;
	height: 0;
	vertical-align: top;
	border-top: 4px solid #000;
	border-right: 4px solid transparent;
	border-left: 4px solid transparent;
	content: "";
}
.dropdown .caret {
	margin-top: 8px;
	margin-left: 2px;
}
.dropdown-menu {
	position: absolute;
	top: 100%;
	left: 0;
	z-index: 1000;
	display: none;
	float: left;
	min-width: 160px;
	padding: 5px 0;
	margin: 2px 0 0;
	list-style: none;
	background-color: #fff;
	border: 1px solid #ccc;
	border: 1px solid rgba(0,0,0,0.2);
	*border-right-width: 2px;
	*border-bottom-width: 2px;
	-webkit-border-radius: 6px;
	-moz-border-radius: 6px;
	border-radius: 6px;
	-webkit-box-shadow: 0 5px 10px rgba(0,0,0,0.2);
	-moz-box-shadow: 0 5px 10px rgba(0,0,0,0.2);
	box-shadow: 0 5px 10px rgba(0,0,0,0.2);
	-webkit-background-clip: padding-box;
	-moz-background-clip: padding;
	background-clip: padding-box;
}
.dropdown-menu.pull-right {
	right: 0;
	left: auto;
}
.dropdown-menu .divider {
	*width: 100%;
	height: 1px;
	margin: 8px 1px;
	*margin: -5px 0 5px;
	overflow: hidden;
	background-color: #F0F0F0;
	border-bottom: 1px solid #fff;
}
.dropdown-menu .menuitem-group {
	margin: 4px 1px;
	overflow: hidden;
	border-top: 1px solid #eee;
	border-bottom: 1px solid #eee;
	background-color: #eee;
	color: #555;
	text-transform: capitalize;
	font-size: 95%;
	padding: 3px 20px;
}
.dropdown-menu > li > a {
	display: block;
	padding: 3px 20px;
	clear: both;
	font-weight: normal;
	line-height: 18px;
	color: #333;
	white-space: nowrap;
}
.dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus,
.dropdown-submenu:hover > a,
.dropdown-submenu:focus > a {
	text-decoration: none;
	color: #fff;
	background-color: #2d6ca2;
	background-image: -moz-linear-gradient(top,#3071a9,#2a6496);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#3071a9),to(#2a6496));
	background-image: -webkit-linear-gradient(top,#3071a9,#2a6496);
	background-image: -o-linear-gradient(top,#3071a9,#2a6496);
	background-image: linear-gradient(to bottom,#3071a9,#2a6496);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2f70a9', endColorstr='#ff296395', GradientType=0);
}
.dropdown-menu > .active > a,
.dropdown-menu > .active > a:hover,
.dropdown-menu > .active > a:focus {
	color: #333;
	text-decoration: none;
	outline: 0;
	background-color: #2d6ca2;
	background-image: -moz-linear-gradient(top,#3071a9,#2a6496);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#3071a9),to(#2a6496));
	background-image: -webkit-linear-gradient(top,#3071a9,#2a6496);
	background-image: -o-linear-gradient(top,#3071a9,#2a6496);
	background-image: linear-gradient(to bottom,#3071a9,#2a6496);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2f70a9', endColorstr='#ff296395', GradientType=0);
}
.dropdown-menu > .disabled > a,
.dropdown-menu > .disabled > a:hover,
.dropdown-menu > .disabled > a:focus {
	color: #999;
}
.dropdown-menu > .disabled > a:hover,
.dropdown-menu > .disabled > a:focus {
	text-decoration: none;
	background-color: transparent;
	background-image: none;
	filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
	cursor: default;
}
.open {
	*z-index: 1000;
}
.open > .dropdown-menu {
	display: block;
}
.dropdown-backdrop {
	position: fixed;
	left: 0;
	right: 0;
	bottom: 0;
	top: 0;
	z-index: 990;
}
.pull-right > .dropdown-menu {
	right: 0;
	left: auto;
}
.dropup .caret,
.navbar-fixed-bottom .dropdown .caret {
	border-top: 0;
	border-bottom: 4px solid #000;
	content: "";
}
.dropup .dropdown-menu,
.navbar-fixed-bottom .dropdown .dropdown-menu {
	top: auto;
	bottom: 100%;
	margin-bottom: 1px;
}
.dropdown-submenu {
	position: relative;
}
.dropdown-submenu > .dropdown-menu {
	top: 0;
	left: 100%;
	margin-top: -6px;
	margin-left: -1px;
	-webkit-border-radius: 6px 6px 6px 6px;
	-moz-border-radius: 6px 6px 6px 6px;
	border-radius: 6px 6px 6px 6px;
}
.dropdown-submenu:hover > .dropdown-menu {
	display: block;
}
.dropup .dropdown-submenu > .dropdown-menu {
	top: auto;
	bottom: 0;
	margin-top: 0;
	margin-bottom: -2px;
	-webkit-border-radius: 5px 5px 5px 0;
	-moz-border-radius: 5px 5px 5px 0;
	border-radius: 5px 5px 5px 0;
}
.dropdown-submenu > a:after {
	display: block;
	content: " ";
	float: right;
	width: 0;
	height: 0;
	border-color: transparent;
	border-style: solid;
	border-width: 5px 0 5px 5px;
	border-left-color: #cccccc;
	margin-top: 5px;
	margin-right: -10px;
}
.dropdown-submenu:hover > a:after {
	border-left-color: #fff;
}
.dropdown-submenu.pull-left {
	float: none;
}
.dropdown-submenu.pull-left > .dropdown-menu {
	left: -100%;
	margin-left: 10px;
	-webkit-border-radius: 6px 0 6px 6px;
	-moz-border-radius: 6px 0 6px 6px;
	border-radius: 6px 0 6px 6px;
}
.dropdown .dropdown-menu .nav-header {
	padding-left: 20px;
	padding-right: 20px;
}
.typeahead {
	z-index: 1051;
	margin-top: 2px;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.well {
	min-height: 20px;
	padding: 19px;
	margin-bottom: 20px;
	background-color: #F0F0F0;
	border: 1px solid #F0F0F0;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.well blockquote {
	border-color: #f0f0f0;
	border-color: rgba(0,0,0,0.15);
}
.well-large {
	padding: 24px;
	-webkit-border-radius: 6px;
	-moz-border-radius: 6px;
	border-radius: 6px;
}
.well-small {
	padding: 9px;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.fade {
	opacity: 0;
	-webkit-transition: opacity .15s linear;
	-moz-transition: opacity .15s linear;
	-o-transition: opacity .15s linear;
	transition: opacity .15s linear;
}
.fade.in {
	opacity: 1;
}
.collapse {
	position: relative;
	height: 0;
	overflow: hidden;
	-webkit-transition: height .35s ease;
	-moz-transition: height .35s ease;
	-o-transition: height .35s ease;
	transition: height .35s ease;
}
.collapse.in {
	height: auto;
}
.close {
	float: right;
	font-size: 20px;
	font-weight: bold;
	line-height: 18px;
	color: #000;
	text-shadow: 0 1px 0 #ffffff;
	opacity: 0.2;
	filter: alpha(opacity=20);
}
.close:hover,
.close:focus {
	color: #000;
	text-decoration: none;
	cursor: pointer;
	opacity: 0.4;
	filter: alpha(opacity=40);
}
button.close {
	padding: 3;
	cursor: pointer;
	background: transparent;
	border: 0;
	-webkit-appearance: none;
}
.alert-options {
	float: right;
	line-height: 18px;
	color: #000;
	text-shadow: 0 1px 0 #ffffff;
	opacity: 0.2;
	filter: alpha(opacity=20);
}
.alert-options:hover,
.alert-options:focus {
	color: #000;
	text-decoration: none;
	cursor: pointer;
	opacity: 0.4;
	filter: alpha(opacity=40);
}
.btn {
	display: inline-block;
	*display: inline;
	*zoom: 1;
	padding: 4px 12px;
	margin-bottom: 0;
	font-size: 13px;
	line-height: 18px;
	text-align: center;
	vertical-align: middle;
	cursor: pointer;
	background-color: #f3f3f3;
	color: #333;
	border: 1px solid #b3b3b3;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
	box-shadow: 0 1px 2px rgba(0,0,0,0.05);
}
.btn:hover,
.btn:focus {
	background-color: #e6e6e6;
	text-decoration: none;
	text-shadow: none;
}
.btn:focus {
	outline: thin dotted #333;
	outline: 5px auto -webkit-focus-ring-color;
	outline-offset: -2px;
}
.btn.active,
.btn:active {
	background-image: none;
	outline: 0;
}
.btn.disabled,
.btn[disabled] {
	cursor: default;
	background-image: none;
	opacity: 0.65;
	filter: alpha(opacity=65);
	-webkit-box-shadow: none;
	-moz-box-shadow: none;
	box-shadow: none;
}
.btn-large {
	padding: 11px 19px;
	font-size: 16.25px;
	-webkit-border-radius: 6px;
	-moz-border-radius: 6px;
	border-radius: 6px;
}
.btn-large [class^="icon-"],
.btn-large [class*=" icon-"] {
	margin-top: 4px;
}
.btn-small {
	padding: 2px 10px;
	font-size: 12px;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.btn-small [class^="icon-"],
.btn-small [class*=" icon-"] {
	margin-top: 0;
}
.btn-mini [class^="icon-"],
.btn-mini [class*=" icon-"] {
	margin-top: -1px;
}
.btn-mini {
	padding: 0 6px;
	font-size: 9.75px;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.btn-block {
	display: block;
	width: 100%;
	padding-left: 0;
	padding-right: 0;
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
}
.btn-block + .btn-block {
	margin-top: 5px;
}
input[type="submit"].btn-block,
input[type="reset"].btn-block,
input[type="button"].btn-block {
	width: 100%;
}
.btn-primary,
.btn-warning,
.btn-danger,
.btn-success,
.btn-info,
.btn-inverse {
	box-shadow: 0 1px 2px rgba(0,0,0,0.05);
}
.btn-primary {
	border: 1px solid #15497c;
	border: 1px solid rgba(0,0,0,0.2);
	color: #fff;
	background-color: #2384d3;
}
.btn-primary:hover,
.btn-primary:focus {
	background-color: #185b91;
	color: #fff;
	text-decoration: none;
}
.btn-warning {
	border: 1px solid #f89406;
	border: 1px solid rgba(0,0,0,0.2);
	color: #fff;
	background-color: #f89406;
}
.btn-warning:hover,
.btn-warning:focus {
	background-color: #ad6704;
	color: #fff;
	text-decoration: none;
	text-shadow: none;
}
.btn-danger {
	border: 1px solid #bd362f;
	border: 1px solid rgba(0,0,0,0.2);
	color: #fff;
	background-color: #bd362f;
}
.btn-danger:hover,
.btn-danger:focus {
	background-color: #802420;
	color: #fff;
	text-decoration: none;
}
.btn-success {
	border: 1px solid #378137;
	border: 1px solid rgba(0,0,0,0.2);
	color: #fff;
	background-color: #46a546;
}
.btn-success:hover,
.btn-success:focus {
	background-color: #2f6f2f;
	color: #fff;
	text-decoration: none;
}
.btn-info {
	border: 1px solid #2f96b4;
	border: 1px solid rgba(0,0,0,0.2);
	color: #fff;
	background-color: #2f96b4;
}
.btn-info:hover,
.btn-info:focus {
	background-color: #1f6377;
	color: #fff;
	text-decoration: none;
}
.btn-inverse {
	border: 1px solid #444;
	border: 1px solid rgba(0,0,0,0.2);
	color: #fff;
	background-color: #444;
}
.btn-inverse:hover,
.btn-inverse:focus {
	background-color: #1e1e1e;
	color: #fff;
	text-decoration: none;
}
button.btn,
input[type="submit"].btn {
	*padding-top: 3px;
	*padding-bottom: 3px;
}
button.btn::-moz-focus-inner,
input[type="submit"].btn::-moz-focus-inner {
	padding: 0;
	border: 0;
}
button.btn.btn-large,
input[type="submit"].btn.btn-large {
	*padding-top: 7px;
	*padding-bottom: 7px;
}
button.btn.btn-small,
input[type="submit"].btn.btn-small {
	*padding-top: 3px;
	*padding-bottom: 3px;
}
button.btn.btn-mini,
input[type="submit"].btn.btn-mini {
	*padding-top: 1px;
	*padding-bottom: 1px;
}
.btn-link,
.btn-link:active,
.btn-link[disabled] {
	background-color: transparent;
	background-image: none;
	-webkit-box-shadow: none;
	-moz-box-shadow: none;
	box-shadow: none;
}
.btn-link {
	border-color: transparent;
	cursor: pointer;
	color: #3071a9;
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.btn-link:hover,
.btn-link:focus {
	color: #1f496e;
	text-decoration: underline;
	background-color: transparent;
}
.btn-link[disabled]:hover,
.btn-link[disabled]:focus {
	color: #333;
	text-decoration: none;
}
.btn-group {
	position: relative;
	display: inline-block;
	*display: inline;
	*zoom: 1;
	font-size: 0;
	vertical-align: middle;
	white-space: nowrap;
	*margin-left: .3em;
}
.btn-group:first-child {
	*margin-left: 0;
}
.btn-group .btn + .btn {
	margin-left: -1px;
}
.btn-group + .btn-group {
	margin-left: 5px;
}
.btn-toolbar {
	font-size: 0;
	margin-top: 9px;
	margin-bottom: 9px;
}
.btn-toolbar > .btn + .btn,
.btn-toolbar > .btn-group + .btn,
.btn-toolbar > .btn + .btn-group {
	margin-left: 5px;
}
.btn-group > .btn {
	position: relative;
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.btn-group > .btn-micro {
	margin-left: -1px;
}
.btn-group > .btn,
.btn-group > .dropdown-menu,
.btn-group > .popover {
	font-size: 13px;
}
.btn-group > .btn-mini {
	font-size: 9.75px;
}
.btn-group > .btn-small {
	font-size: 12px;
}
.btn-group > .btn-large {
	font-size: 16.25px;
}
.btn-group > .btn:first-child {
	margin-left: 0;
	-webkit-border-top-left-radius: 3px;
	-moz-border-radius-topleft: 3px;
	border-top-left-radius: 3px;
	-webkit-border-bottom-left-radius: 3px;
	-moz-border-radius-bottomleft: 3px;
	border-bottom-left-radius: 3px;
}
.btn-group > .btn:last-child,
.btn-group > .dropdown-toggle {
	-webkit-border-top-right-radius: 3px;
	-moz-border-radius-topright: 3px;
	border-top-right-radius: 3px;
	-webkit-border-bottom-right-radius: 3px;
	-moz-border-radius-bottomright: 3px;
	border-bottom-right-radius: 3px;
}
.btn-group > .btn.large:first-child {
	margin-left: 0;
	-webkit-border-top-left-radius: 6px;
	-moz-border-radius-topleft: 6px;
	border-top-left-radius: 6px;
	-webkit-border-bottom-left-radius: 6px;
	-moz-border-radius-bottomleft: 6px;
	border-bottom-left-radius: 6px;
}
.btn-group > .btn.large:last-child,
.btn-group > .large.dropdown-toggle {
	-webkit-border-top-right-radius: 6px;
	-moz-border-radius-topright: 6px;
	border-top-right-radius: 6px;
	-webkit-border-bottom-right-radius: 6px;
	-moz-border-radius-bottomright: 6px;
	border-bottom-right-radius: 6px;
}
.btn-group > .btn:hover,
.btn-group > .btn:focus,
.btn-group > .btn:active,
.btn-group > .btn.active {
	z-index: 2;
}
.btn-group .dropdown-toggle:active,
.btn-group.open .dropdown-toggle {
	outline: 0;
}
.btn-group > .btn + .dropdown-toggle {
	padding-left: 8px;
	padding-right: 8px;
	*padding-top: 5px;
	*padding-bottom: 5px;
}
.btn-group > .btn-mini + .dropdown-toggle {
	padding-left: 5px;
	padding-right: 5px;
	*padding-top: 2px;
	*padding-bottom: 2px;
}
.btn-group > .btn-small + .dropdown-toggle {
	*padding-top: 5px;
	*padding-bottom: 4px;
}
.btn-group > .btn-large + .dropdown-toggle {
	padding-left: 12px;
	padding-right: 12px;
	*padding-top: 7px;
	*padding-bottom: 7px;
}
.btn-group.open .dropdown-toggle {
	background-image: none;
}
.btn-group.open .btn.dropdown-toggle {
	background-color: #e6e6e6;
}
.btn-group.open .btn-primary.dropdown-toggle {
	background-color: #15497c;
}
.btn-group.open .btn-warning.dropdown-toggle {
	background-color: #c67605;
}
.btn-group.open .btn-danger.dropdown-toggle {
	background-color: #942a25;
}
.btn-group.open .btn-success.dropdown-toggle {
	background-color: #378137;
}
.btn-group.open .btn-info.dropdown-toggle {
	background-color: #24748c;
}
.btn-group.open .btn-inverse.dropdown-toggle {
	background-color: #222;
}
.btn .caret {
	margin-top: 8px;
	margin-left: 0;
}
.btn-large .caret {
	margin-top: 6px;
}
.btn-large .caret {
	border-left-width: 5px;
	border-right-width: 5px;
	border-top-width: 5px;
}
.btn-mini .caret,
.btn-small .caret {
	margin-top: 8px;
}
.dropup .btn-large .caret {
	border-bottom-width: 5px;
}
.btn-primary .caret {
	border-top-color: #1f496e;
	border-bottom-color: #1f496e;
}
.btn-warning .caret,
.btn-danger .caret,
.btn-info .caret,
.btn-success .caret,
.btn-inverse .caret {
	border-top-color: #fff;
	border-bottom-color: #fff;
}
.btn-group-vertical {
	display: inline-block;
	*display: inline;
	*zoom: 1;
}
.btn-group-vertical > .btn {
	display: block;
	float: none;
	max-width: 100%;
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.btn-group-vertical > .btn + .btn {
	margin-left: 0;
	margin-top: -1px;
}
.btn-group-vertical > .btn:first-child {
	-webkit-border-radius: 3px 3px 0 0;
	-moz-border-radius: 3px 3px 0 0;
	border-radius: 3px 3px 0 0;
}
.btn-group-vertical > .btn:last-child {
	-webkit-border-radius: 0 0 3px 3px;
	-moz-border-radius: 0 0 3px 3px;
	border-radius: 0 0 3px 3px;
}
.btn-group-vertical > .btn-large:first-child {
	-webkit-border-radius: 6px 6px 0 0;
	-moz-border-radius: 6px 6px 0 0;
	border-radius: 6px 6px 0 0;
}
.btn-group-vertical > .btn-large:last-child {
	-webkit-border-radius: 0 0 6px 6px;
	-moz-border-radius: 0 0 6px 6px;
	border-radius: 0 0 6px 6px;
}
.alert {
	padding: 8px 35px 8px 14px;
	margin-bottom: 18px;
	text-shadow: 0 1px 0 rgba(255,255,255,0.5);
	background-color: #fcf8e3;
	border: 1px solid #faebcc;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.alert,
.alert h4 {
	color: #8a6d3b;
}
.alert h4 {
	margin: 0 0 .5em;
}
.alert .close {
	position: relative;
	top: -2px;
	right: -21px;
	line-height: 18px;
	cursor: pointer;
}
.alert-success {
	background-color: #dff0d8;
	border-color: #d6e9c6;
	color: #3c763d;
}
.alert-success h4 {
	color: #3c763d;
}
.alert-danger,
.alert-error {
	background-color: #f2dede;
	border-color: #ebccd1;
	color: #a94442;
}
.alert-danger h4,
.alert-error h4 {
	color: #a94442;
}
.alert-info {
	background-color: #d9edf7;
	border-color: #bce8f1;
	color: #31708f;
}
.alert-info h4 {
	color: #31708f;
}
.alert-block {
	padding-top: 14px;
	padding-bottom: 14px;
}
.alert-block > p,
.alert-block > ul {
	margin-bottom: 0;
}
.alert-block p + p {
	margin-top: 5px;
}
.nav {
	margin-left: 0;
	margin-bottom: 18px;
	list-style: none;
}
.nav > li > a {
	display: block;
}
.nav > li > a:hover,
.nav > li > a:focus {
	text-decoration: none;
	background-color: #eee;
}
.nav > li > a > img {
	max-width: none;
}
.nav > .pull-right {
	float: right;
}
.nav-header {
	display: block;
	padding: 3px 15px;
	font-size: 11px;
	font-weight: bold;
	line-height: 18px;
	color: #999;
	text-shadow: 0 1px 0 rgba(255,255,255,0.5);
	text-transform: uppercase;
}
.nav li + .nav-header {
	margin-top: 9px;
}
.nav-list {
	padding-left: 15px;
	padding-right: 15px;
	margin-bottom: 0;
}
.nav-list > li > a,
.nav-list .nav-header {
	margin-left: -15px;
	margin-right: -15px;
	text-shadow: 0 1px 0 rgba(255,255,255,0.5);
}
.nav-list > li > a {
	padding: 3px 15px;
}
.nav-list > .active > a,
.nav-list > .active > a:hover,
.nav-list > .active > a:focus {
	color: #fff;
	text-shadow: 0 -1px 0 rgba(0,0,0,0.2);
	background-color: #3071a9;
}
.nav-list [class^="icon-"],
.nav-list [class*=" icon-"] {
	margin-right: 2px;
}
.nav-list .divider {
	*width: 100%;
	height: 1px;
	margin: 8px 1px;
	*margin: -5px 0 5px;
	overflow: hidden;
	background-color: #e5e5e5;
	border-bottom: 1px solid #fff;
}
.nav-tabs,
.nav-pills {
	*zoom: 1;
}
.nav-tabs:before,
.nav-tabs:after,
.nav-pills:before,
.nav-pills:after {
	display: table;
	content: "";
	line-height: 0;
}
.nav-tabs:after,
.nav-pills:after {
	clear: both;
}
.nav-tabs > li,
.nav-pills > li {
	float: left;
}
.nav-tabs > li > a,
.nav-pills > li > a {
	padding-right: 12px;
	padding-left: 12px;
	margin-right: 2px;
	line-height: 14px;
}
.nav-tabs {
	border-bottom: 1px solid #ddd;
}
.nav-tabs > li {
	margin-bottom: -1px;
}
.nav-tabs > li > a {
	padding-top: 8px;
	padding-bottom: 8px;
	line-height: 18px;
	border: 1px solid transparent;
	-webkit-border-radius: 4px 4px 0 0;
	-moz-border-radius: 4px 4px 0 0;
	border-radius: 4px 4px 0 0;
}
.nav-tabs > li > a:hover,
.nav-tabs > li > a:focus {
	border-color: #eee #eee #ddd;
}
.nav-tabs > .active > a,
.nav-tabs > .active > a:hover,
.nav-tabs > .active > a:focus {
	color: #555;
	background-color: #fff;
	border: 1px solid #ddd;
	border-bottom-color: transparent;
	cursor: default;
}
.nav-pills > li > a {
	padding-top: 8px;
	padding-bottom: 8px;
	margin-top: 2px;
	margin-bottom: 2px;
	-webkit-border-radius: 5px;
	-moz-border-radius: 5px;
	border-radius: 5px;
}
.nav-pills > .active > a,
.nav-pills > .active > a:hover,
.nav-pills > .active > a:focus {
	color: #fff;
	background-color: #3071a9;
}
.nav-stacked > li {
	float: none;
}
.nav-stacked > li > a {
	margin-right: 0;
}
.nav-tabs.nav-stacked {
	border-bottom: 0;
}
.nav-tabs.nav-stacked > li > a {
	border: 1px solid #ddd;
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.nav-tabs.nav-stacked > li:first-child > a {
	-webkit-border-top-right-radius: 4px;
	-moz-border-radius-topright: 4px;
	border-top-right-radius: 4px;
	-webkit-border-top-left-radius: 4px;
	-moz-border-radius-topleft: 4px;
	border-top-left-radius: 4px;
}
.nav-tabs.nav-stacked > li:last-child > a {
	-webkit-border-bottom-right-radius: 4px;
	-moz-border-radius-bottomright: 4px;
	border-bottom-right-radius: 4px;
	-webkit-border-bottom-left-radius: 4px;
	-moz-border-radius-bottomleft: 4px;
	border-bottom-left-radius: 4px;
}
.nav-tabs.nav-stacked > li > a:hover,
.nav-tabs.nav-stacked > li > a:focus {
	border-color: #ddd;
	z-index: 2;
}
.nav-pills.nav-stacked > li > a {
	margin-bottom: 3px;
}
.nav-pills.nav-stacked > li:last-child > a {
	margin-bottom: 1px;
}
.nav-tabs .dropdown-menu {
	-webkit-border-radius: 0 0 6px 6px;
	-moz-border-radius: 0 0 6px 6px;
	border-radius: 0 0 6px 6px;
}
.nav-pills .dropdown-menu {
	-webkit-border-radius: 6px;
	-moz-border-radius: 6px;
	border-radius: 6px;
}
.nav .dropdown-toggle .caret {
	border-top-color: #3071a9;
	border-bottom-color: #3071a9;
	margin-top: 6px;
}
.nav .dropdown-toggle:hover .caret,
.nav .dropdown-toggle:focus .caret {
	border-top-color: #1f496e;
	border-bottom-color: #1f496e;
}
.nav-tabs .dropdown-toggle .caret {
	margin-top: 8px;
}
.nav .active .dropdown-toggle .caret {
	border-top-color: #fff;
	border-bottom-color: #fff;
}
.nav-tabs .active .dropdown-toggle .caret {
	border-top-color: #555;
	border-bottom-color: #555;
}
.nav > .dropdown.active > a:hover,
.nav > .dropdown.active > a:focus {
	cursor: pointer;
}
.nav-tabs .open .dropdown-toggle,
.nav-pills .open .dropdown-toggle,
.nav > li.dropdown.open.active > a:hover,
.nav > li.dropdown.open.active > a:focus {
	color: #fff;
	background-color: #999;
	border-color: #999;
}
.nav li.dropdown.open .caret,
.nav li.dropdown.open.active .caret,
.nav li.dropdown.open a:hover .caret,
.nav li.dropdown.open a:focus .caret {
	border-top-color: #fff;
	border-bottom-color: #fff;
	opacity: 1;
	filter: alpha(opacity=100);
}
.tabs-stacked .open > a:hover,
.tabs-stacked .open > a:focus {
	border-color: #999;
}
.tabbable {
	*zoom: 1;
}
.tabbable:before,
.tabbable:after {
	display: table;
	content: "";
	line-height: 0;
}
.tabbable:after {
	clear: both;
}
.tab-content {
	overflow: auto;
}
.tabs-below > .nav-tabs,
.tabs-right > .nav-tabs,
.tabs-left > .nav-tabs {
	border-bottom: 0;
}
.tab-content > .tab-pane,
.pill-content > .pill-pane {
	display: none;
}
.tab-content > .active,
.pill-content > .active {
	display: block;
}
.tabs-below > .nav-tabs {
	border-top: 1px solid #ddd;
}
.tabs-below > .nav-tabs > li {
	margin-top: -1px;
	margin-bottom: 0;
}
.tabs-below > .nav-tabs > li > a {
	-webkit-border-radius: 0 0 4px 4px;
	-moz-border-radius: 0 0 4px 4px;
	border-radius: 0 0 4px 4px;
}
.tabs-below > .nav-tabs > li > a:hover,
.tabs-below > .nav-tabs > li > a:focus {
	border-bottom-color: transparent;
	border-top-color: #ddd;
}
.tabs-below > .nav-tabs > .active > a,
.tabs-below > .nav-tabs > .active > a:hover,
.tabs-below > .nav-tabs > .active > a:focus {
	border-color: transparent #ddd #ddd #ddd;
}
.tabs-left > .nav-tabs > li,
.tabs-right > .nav-tabs > li {
	float: none;
}
.tabs-left > .nav-tabs > li > a,
.tabs-right > .nav-tabs > li > a {
	min-width: 74px;
	margin-right: 0;
	margin-bottom: 3px;
}
.tabs-left > .nav-tabs {
	float: left;
	margin-right: 19px;
	border-right: 1px solid #ddd;
}
.tabs-left > .nav-tabs > li > a {
	margin-right: -1px;
	-webkit-border-radius: 4px 0 0 4px;
	-moz-border-radius: 4px 0 0 4px;
	border-radius: 4px 0 0 4px;
}
.tabs-left > .nav-tabs > li > a:hover,
.tabs-left > .nav-tabs > li > a:focus {
	border-color: #eee #ddd #eee #eee;
}
.tabs-left > .nav-tabs .active > a,
.tabs-left > .nav-tabs .active > a:hover,
.tabs-left > .nav-tabs .active > a:focus {
	border-color: #ddd transparent #ddd #ddd;
	*border-right-color: #fff;
}
.tabs-right > .nav-tabs {
	float: right;
	margin-left: 19px;
	border-left: 1px solid #ddd;
}
.tabs-right > .nav-tabs > li > a {
	margin-left: -1px;
	-webkit-border-radius: 0 4px 4px 0;
	-moz-border-radius: 0 4px 4px 0;
	border-radius: 0 4px 4px 0;
}
.tabs-right > .nav-tabs > li > a:hover,
.tabs-right > .nav-tabs > li > a:focus {
	border-color: #eee #eee #eee #ddd;
}
.tabs-right > .nav-tabs .active > a,
.tabs-right > .nav-tabs .active > a:hover,
.tabs-right > .nav-tabs .active > a:focus {
	border-color: #ddd #ddd #ddd transparent;
	*border-left-color: #fff;
}
.nav > .disabled > a {
	color: #999;
}
.nav > .disabled > a:hover,
.nav > .disabled > a:focus {
	text-decoration: none;
	background-color: transparent;
	cursor: default;
}
.navbar {
	overflow: visible;
	margin-bottom: 18px;
	*position: relative;
	*z-index: 2;
}
.navbar-inner {
	min-height: 40px;
	padding-left: 20px;
	padding-right: 20px;
	background-color: #fafafa;
	background-image: -moz-linear-gradient(top,#ffffff,#f2f2f2);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#ffffff),to(#f2f2f2));
	background-image: -webkit-linear-gradient(top,#ffffff,#f2f2f2);
	background-image: -o-linear-gradient(top,#ffffff,#f2f2f2);
	background-image: linear-gradient(to bottom,#ffffff,#f2f2f2);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);
	border: 1px solid #d4d4d4;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
	-webkit-box-shadow: 0 1px 4px rgba(0,0,0,0.065);
	-moz-box-shadow: 0 1px 4px rgba(0,0,0,0.065);
	box-shadow: 0 1px 4px rgba(0,0,0,0.065);
	*zoom: 1;
}
.navbar-inner:before,
.navbar-inner:after {
	display: table;
	content: "";
	line-height: 0;
}
.navbar-inner:after {
	clear: both;
}
.navbar .container {
	width: auto;
}
.nav-collapse.collapse {
	height: auto;
	overflow: visible;
}
.navbar .brand {
	float: left;
	display: block;
	padding: 11px 20px 11px;
	margin-left: -20px;
	font-size: 20px;
	font-weight: 200;
	color: #555;
	text-shadow: 0 1px 0 #ffffff;
}
.navbar .brand:hover,
.navbar .brand:focus {
	text-decoration: none;
}
.navbar-text {
	margin-bottom: 0;
	line-height: 40px;
	color: #555;
}
.navbar-link {
	color: #555;
}
.navbar-link:hover,
.navbar-link:focus {
	color: #333;
}
.navbar .divider-vertical {
	height: 40px;
	margin: 0 9px;
	border-left: 1px solid #f2f2f2;
	border-right: 1px solid #ffffff;
}
.navbar .btn,
.navbar .btn-group {
	margin-top: 5px;
}
.navbar .btn-group .btn,
.navbar .input-prepend .btn,
.navbar .input-append .btn,
.navbar .input-prepend .btn-group,
.navbar .input-append .btn-group {
	margin-top: 0;
}
.navbar-form {
	margin-bottom: 0;
	*zoom: 1;
}
.navbar-form:before,
.navbar-form:after {
	display: table;
	content: "";
	line-height: 0;
}
.navbar-form:after {
	clear: both;
}
.navbar-form input,
.navbar-form select,
.navbar-form .radio,
.navbar-form .checkbox {
	margin-top: 5px;
}
.navbar-form input,
.navbar-form select,
.navbar-form .btn {
	display: inline-block;
	margin-bottom: 0;
}
.navbar-form input[type="image"],
.navbar-form input[type="checkbox"],
.navbar-form input[type="radio"] {
	margin-top: 3px;
}
.navbar-form .input-append,
.navbar-form .input-prepend {
	margin-top: 5px;
	white-space: nowrap;
}
.navbar-form .input-append input,
.navbar-form .input-prepend input {
	margin-top: 0;
}
.navbar-search {
	position: relative;
	float: left;
	margin-top: 5px;
	margin-bottom: 0;
}
.navbar-search .search-query {
	margin-bottom: 0;
	padding: 4px 14px;
	font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
	font-size: 13px;
	font-weight: normal;
	line-height: 1;
	-webkit-border-radius: 15px;
	-moz-border-radius: 15px;
	border-radius: 15px;
}
.navbar-static-top {
	position: static;
	margin-bottom: 0;
}
.navbar-static-top .navbar-inner {
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.navbar-fixed-top,
.navbar-fixed-bottom {
	position: fixed;
	right: 0;
	left: 0;
	z-index: 1030;
	margin-bottom: 0;
}
.navbar-fixed-top .navbar-inner,
.navbar-static-top .navbar-inner {
	border-width: 0 0 1px;
}
.navbar-fixed-bottom .navbar-inner {
	border-width: 1px 0 0;
}
.navbar-fixed-top .navbar-inner,
.navbar-fixed-bottom .navbar-inner {
	padding-left: 0;
	padding-right: 0;
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.navbar-static-top .container,
.navbar-fixed-top .container,
.navbar-fixed-bottom .container {
	width: 940px;
}
.navbar-fixed-top {
	top: 0;
}
.navbar-fixed-top .navbar-inner,
.navbar-static-top .navbar-inner {
	-webkit-box-shadow: 0 1px 10px rgba(0,0,0,.1);
	-moz-box-shadow: 0 1px 10px rgba(0,0,0,.1);
	box-shadow: 0 1px 10px rgba(0,0,0,.1);
}
.navbar-fixed-bottom {
	bottom: 0;
}
.navbar-fixed-bottom .navbar-inner {
	-webkit-box-shadow: 0 -1px 10px rgba(0,0,0,.1);
	-moz-box-shadow: 0 -1px 10px rgba(0,0,0,.1);
	box-shadow: 0 -1px 10px rgba(0,0,0,.1);
}
.navbar .nav {
	position: relative;
	left: 0;
	display: block;
	float: left;
	margin: 0 10px 0 0;
}
.navbar .nav.pull-right {
	float: right;
	margin-right: 0;
}
.navbar .nav > li {
	float: left;
}
.navbar .nav > li > a {
	float: none;
	padding: 11px 15px 11px;
	color: #555;
	text-decoration: none;
	text-shadow: 0 1px 0 #ffffff;
}
.navbar .nav .dropdown-toggle .caret {
	margin-top: 8px;
}
.navbar .nav > li > a:focus,
.navbar .nav > li > a:hover {
	background-color: transparent;
	color: #333;
	text-decoration: none;
}
.navbar .nav > li > a:focus {
	outline: 2px solid #5e9ed6;
}
.navbar .nav > .active > a,
.navbar .nav > .active > a:hover,
.navbar .nav > .active > a:focus {
	color: #555;
	text-decoration: none;
	background-color: #e6e6e6;
	-webkit-box-shadow: inset 0 3px 8px rgba(0,0,0,0.125);
	-moz-box-shadow: inset 0 3px 8px rgba(0,0,0,0.125);
	box-shadow: inset 0 3px 8px rgba(0,0,0,0.125);
}
.navbar .btn-navbar {
	display: none;
	float: right;
	padding: 7px 10px;
	margin-left: 5px;
	margin-right: 5px;
	background-color: #f2f2f2;
	*background-color: #f2f2f2;
	-webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
	-moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
	box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
}
.navbar .btn-navbar:hover,
.navbar .btn-navbar:focus,
.navbar .btn-navbar:active,
.navbar .btn-navbar.active,
.navbar .btn-navbar.disabled,
.navbar .btn-navbar[disabled] {
	color: #fff;
	background-color: #d9d9d9;
	*background-color: #d9d9d9;
}
.navbar .btn-navbar:active,
.navbar .btn-navbar.active {
	background-color: #f2f2f2;
}
.navbar .btn-navbar .icon-bar {
	display: block;
	width: 18px;
	height: 2px;
	background-color: #f5f5f5;
	-webkit-border-radius: 1px;
	-moz-border-radius: 1px;
	border-radius: 1px;
	-webkit-box-shadow: 0 1px 0 rgba(0,0,0,0.25);
	-moz-box-shadow: 0 1px 0 rgba(0,0,0,0.25);
	box-shadow: 0 1px 0 rgba(0,0,0,0.25);
}
.btn-navbar .icon-bar + .icon-bar {
	margin-top: 3px;
}
.navbar .nav > li > .dropdown-menu:before {
	content: '';
	display: inline-block;
	border-left: 7px solid transparent;
	border-right: 7px solid transparent;
	border-bottom: 7px solid #ccc;
	border-bottom-color: rgba(0,0,0,0.2);
	position: absolute;
	top: -7px;
	left: 9px;
}
.navbar .nav > li > .dropdown-menu:after {
	content: '';
	display: inline-block;
	border-left: 6px solid transparent;
	border-right: 6px solid transparent;
	border-bottom: 6px solid #fff;
	position: absolute;
	top: -6px;
	left: 10px;
}
.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
	border-top: 7px solid #ccc;
	border-top-color: rgba(0,0,0,0.2);
	border-bottom: 0;
	bottom: -7px;
	top: auto;
}
.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
	border-top: 6px solid #fff;
	border-bottom: 0;
	bottom: -6px;
	top: auto;
}
.navbar .nav li.dropdown > a:hover .caret,
.navbar .nav li.dropdown > a:focus .caret {
	border-top-color: #333;
	border-bottom-color: #333;
}
.navbar .nav li.dropdown.open > .dropdown-toggle,
.navbar .nav li.dropdown.active > .dropdown-toggle,
.navbar .nav li.dropdown.open.active > .dropdown-toggle {
	background-color: #e6e6e6;
	color: #555;
}
.navbar .nav li.dropdown > .dropdown-toggle .caret {
	border-top-color: #555;
	border-bottom-color: #555;
}
.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
	border-top-color: #555;
	border-bottom-color: #555;
}
.navbar .pull-right > li > .dropdown-menu,
.navbar .nav > li > .dropdown-menu.pull-right {
	left: auto;
	right: 0;
}
.navbar .pull-right > li > .dropdown-menu:before,
.navbar .nav > li > .dropdown-menu.pull-right:before {
	left: auto;
	right: 12px;
}
.navbar .pull-right > li > .dropdown-menu:after,
.navbar .nav > li > .dropdown-menu.pull-right:after {
	left: auto;
	right: 13px;
}
.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
	left: auto;
	right: 100%;
	margin-left: 0;
	margin-right: -1px;
	-webkit-border-radius: 6px 0 6px 6px;
	-moz-border-radius: 6px 0 6px 6px;
	border-radius: 6px 0 6px 6px;
}
.navbar-inverse .navbar-inner {
	background-color: #13294a;
	background-image: -moz-linear-gradient(top,#152d53,#10223e);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#152d53),to(#10223e));
	background-image: -webkit-linear-gradient(top,#152d53,#10223e);
	background-image: -o-linear-gradient(top,#152d53,#10223e);
	background-image: linear-gradient(to bottom,#152d53,#10223e);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff142c52', endColorstr='#ff0f213e', GradientType=0);
	border-color: #0b172a;
}
.navbar-inverse .brand,
.navbar-inverse .nav > li > a {
	color: #d9d9d9;
	text-shadow: 0 -1px 0 rgba(0,0,0,0.25);
}
.navbar-inverse .brand:hover,
.navbar-inverse .brand:focus,
.navbar-inverse .nav > li > a:hover,
.navbar-inverse .nav > li > a:focus {
	color: #fff;
}
.navbar-inverse .brand {
	color: #d9d9d9;
}
.navbar-inverse .navbar-text {
	color: #d9d9d9;
}
.navbar-inverse .nav > li > a:focus,
.navbar-inverse .nav > li > a:hover {
	background-color: transparent;
	color: #fff;
}
.navbar-inverse .nav .active > a,
.navbar-inverse .nav .active > a:hover,
.navbar-inverse .nav .active > a:focus {
	color: #fff;
	background-color: #10223e;
}
.navbar-inverse .navbar-link {
	color: #d9d9d9;
}
.navbar-inverse .navbar-link:hover,
.navbar-inverse .navbar-link:focus {
	color: #fff;
}
.navbar-inverse .divider-vertical {
	border-left-color: #10223e;
	border-right-color: #152d53;
}
.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
	background-color: #10223e;
	color: #fff;
}
.navbar-inverse .nav li.dropdown > a:hover .caret,
.navbar-inverse .nav li.dropdown > a:focus .caret {
	border-top-color: #fff;
	border-bottom-color: #fff;
}
.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
	border-top-color: #d9d9d9;
	border-bottom-color: #d9d9d9;
}
.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
	border-top-color: #fff;
	border-bottom-color: #fff;
}
.navbar-inverse .navbar-search .search-query {
	color: #fff;
	background-color: #2959a4;
	border-color: #10223e;
	-webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
	-moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
	box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
	-webkit-transition: none;
	-moz-transition: none;
	-o-transition: none;
	transition: none;
}
.navbar-inverse .navbar-search .search-query:-moz-placeholder {
	color: #ccc;
}
.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
	color: #ccc;
}
.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
	color: #ccc;
}
.navbar-inverse .navbar-search .search-query:focus,
.navbar-inverse .navbar-search .search-query.focused {
	padding: 5px 15px;
	color: #333;
	text-shadow: 0 1px 0 #fff;
	background-color: #fff;
	border: 0;
	-webkit-box-shadow: 0 0 3px rgba(0,0,0,0.15);
	-moz-box-shadow: 0 0 3px rgba(0,0,0,0.15);
	box-shadow: 0 0 3px rgba(0,0,0,0.15);
	outline: 0;
}
.navbar-inverse .btn-navbar {
	background-color: #10223e;
	*background-color: #10223e;
}
.navbar-inverse .btn-navbar:hover,
.navbar-inverse .btn-navbar:focus,
.navbar-inverse .btn-navbar:active,
.navbar-inverse .btn-navbar.active,
.navbar-inverse .btn-navbar.disabled,
.navbar-inverse .btn-navbar[disabled] {
	color: #fff;
	background-color: #050c16;
	*background-color: #050c16;
}
.navbar-inverse .btn-navbar:active,
.navbar-inverse .btn-navbar.active {
	background-color: #10223e;
}
.breadcrumb {
	padding: 8px 15px;
	margin: 0 0 18px;
	list-style: none;
	background-color: #f5f5f5;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.breadcrumb > li {
	display: inline-block;
	*display: inline;
	*zoom: 1;
	text-shadow: 0 1px 0 #fff;
}
.breadcrumb > li > .divider {
	padding: 0 5px;
	color: #ccc;
}
.breadcrumb > .active {
	color: #999;
}
.pagination {
	margin: 18px 0;
}
.pagination ul {
	display: inline-block;
	*display: inline;
	*zoom: 1;
	margin-left: 0;
	margin-bottom: 0;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
	-webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.05);
	-moz-box-shadow: 0 1px 2px rgba(0,0,0,0.05);
	box-shadow: 0 1px 2px rgba(0,0,0,0.05);
}
.pagination ul > li {
	display: inline;
}
.pagination ul > li > a,
.pagination ul > li > span {
	float: left;
	padding: 4px 12px;
	line-height: 18px;
	text-decoration: none;
	background-color: #fff;
	border: 1px solid #ddd;
	border-left-width: 0;
}
.pagination ul > li > a:hover,
.pagination ul > li > a:focus,
.pagination ul > .active > a,
.pagination ul > .active > span {
	background-color: #F0F0F0;
}
.pagination ul > .active > a,
.pagination ul > .active > span {
	color: #999;
	cursor: default;
}
.pagination ul > .disabled > span,
.pagination ul > .disabled > a,
.pagination ul > .disabled > a:hover,
.pagination ul > .disabled > a:focus {
	color: #999;
	background-color: transparent;
	cursor: default;
}
.pagination ul > li:first-child > a,
.pagination ul > li:first-child > span {
	border-left-width: 1px;
	-webkit-border-top-left-radius: 3px;
	-moz-border-radius-topleft: 3px;
	border-top-left-radius: 3px;
	-webkit-border-bottom-left-radius: 3px;
	-moz-border-radius-bottomleft: 3px;
	border-bottom-left-radius: 3px;
}
.pagination ul > li:last-child > a,
.pagination ul > li:last-child > span {
	-webkit-border-top-right-radius: 3px;
	-moz-border-radius-topright: 3px;
	border-top-right-radius: 3px;
	-webkit-border-bottom-right-radius: 3px;
	-moz-border-radius-bottomright: 3px;
	border-bottom-right-radius: 3px;
}
.pagination-centered {
	text-align: center;
}
.pagination-right {
	text-align: right;
}
.pagination-large ul > li > a,
.pagination-large ul > li > span {
	padding: 11px 19px;
	font-size: 16.25px;
}
.pagination-large ul > li:first-child > a,
.pagination-large ul > li:first-child > span {
	-webkit-border-top-left-radius: 6px;
	-moz-border-radius-topleft: 6px;
	border-top-left-radius: 6px;
	-webkit-border-bottom-left-radius: 6px;
	-moz-border-radius-bottomleft: 6px;
	border-bottom-left-radius: 6px;
}
.pagination-large ul > li:last-child > a,
.pagination-large ul > li:last-child > span {
	-webkit-border-top-right-radius: 6px;
	-moz-border-radius-topright: 6px;
	border-top-right-radius: 6px;
	-webkit-border-bottom-right-radius: 6px;
	-moz-border-radius-bottomright: 6px;
	border-bottom-right-radius: 6px;
}
.pagination-mini ul > li:first-child > a,
.pagination-mini ul > li:first-child > span,
.pagination-small ul > li:first-child > a,
.pagination-small ul > li:first-child > span {
	-webkit-border-top-left-radius: 3px;
	-moz-border-radius-topleft: 3px;
	border-top-left-radius: 3px;
	-webkit-border-bottom-left-radius: 3px;
	-moz-border-radius-bottomleft: 3px;
	border-bottom-left-radius: 3px;
}
.pagination-mini ul > li:last-child > a,
.pagination-mini ul > li:last-child > span,
.pagination-small ul > li:last-child > a,
.pagination-small ul > li:last-child > span {
	-webkit-border-top-right-radius: 3px;
	-moz-border-radius-topright: 3px;
	border-top-right-radius: 3px;
	-webkit-border-bottom-right-radius: 3px;
	-moz-border-radius-bottomright: 3px;
	border-bottom-right-radius: 3px;
}
.pagination-small ul > li > a,
.pagination-small ul > li > span {
	padding: 2px 10px;
	font-size: 12px;
}
.pagination-mini ul > li > a,
.pagination-mini ul > li > span {
	padding: 0 6px;
	font-size: 9.75px;
}
.pager {
	margin: 18px 0;
	list-style: none;
	text-align: center;
	*zoom: 1;
}
.pager:before,
.pager:after {
	display: table;
	content: "";
	line-height: 0;
}
.pager:after {
	clear: both;
}
.pager li {
	display: inline;
}
.pager li > a,
.pager li > span {
	display: inline-block;
	padding: 5px 14px;
	background-color: #fff;
	border: 1px solid #ddd;
	-webkit-border-radius: 15px;
	-moz-border-radius: 15px;
	border-radius: 15px;
}
.pager li > a:hover,
.pager li > a:focus {
	text-decoration: none;
	background-color: #f5f5f5;
}
.pager .next > a,
.pager .next > span {
	float: right;
}
.pager .previous > a,
.pager .previous > span {
	float: left;
}
.pager .disabled > a,
.pager .disabled > a:hover,
.pager .disabled > a:focus,
.pager .disabled > span {
	color: #999;
	background-color: #fff;
	cursor: default;
}
.modal-backdrop {
	position: fixed;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;
	z-index: 1040;
	background-color: #000;
}
.modal-backdrop.fade {
	opacity: 0;
}
.modal-backdrop,
.modal-backdrop.fade.in {
	opacity: 0.8;
	filter: alpha(opacity=80);
}
.modal-header {
	padding: 9px 15px;
	border-bottom: 1px solid #eee;
}
.modal-header .close {
	margin-top: 2px;
}
.modal-header h3 {
	margin: 0;
	line-height: 30px;
}
.modal-body {
	width: 98%;
	position: relative;
	max-height: 400px;
	padding: 1%;
}
.modal-body iframe {
	width: 100%;
	max-height: none;
	border: 0 !important;
}
.modal-form {
	margin-bottom: 0;
}
.modal-footer {
	padding: 14px 15px 15px;
	margin-bottom: 0;
	text-align: right;
	background-color: #f5f5f5;
	border-top: 1px solid #ddd;
	-webkit-border-radius: 0 0 6px 6px;
	-moz-border-radius: 0 0 6px 6px;
	border-radius: 0 0 6px 6px;
	-webkit-box-shadow: inset 0 1px 0 #fff;
	-moz-box-shadow: inset 0 1px 0 #fff;
	box-shadow: inset 0 1px 0 #fff;
	*zoom: 1;
}
.modal-footer:before,
.modal-footer:after {
	display: table;
	content: "";
	line-height: 0;
}
.modal-footer:after {
	clear: both;
}
.modal-footer .btn + .btn {
	margin-left: 5px;
	margin-bottom: 0;
}
.modal-footer .btn-group .btn + .btn {
	margin-left: -1px;
}
.modal-footer .btn-block + .btn-block {
	margin-left: 0;
}
.tooltip {
	position: absolute;
	z-index: 1030;
	display: block;
	visibility: visible;
	font-size: 11px;
	line-height: 1.4;
	opacity: 0;
	filter: alpha(opacity=0);
}
.tooltip.in {
	opacity: 0.8;
	filter: alpha(opacity=80);
}
.tooltip.top {
	margin-top: -3px;
	padding: 5px 0;
}
.tooltip.right {
	margin-left: 3px;
	padding: 0 5px;
}
.tooltip.bottom {
	margin-top: 3px;
	padding: 5px 0;
}
.tooltip.left {
	margin-left: -3px;
	padding: 0 5px;
}
.tooltip-inner {
	max-width: 200px;
	padding: 8px;
	color: #fff;
	text-align: center;
	text-decoration: none;
	background-color: #000;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.tooltip-arrow {
	position: absolute;
	width: 0;
	height: 0;
	border-color: transparent;
	border-style: solid;
}
.tooltip.top .tooltip-arrow {
	bottom: 0;
	left: 50%;
	margin-left: -5px;
	border-width: 5px 5px 0;
	border-top-color: #000;
}
.tooltip.right .tooltip-arrow {
	top: 50%;
	left: 0;
	margin-top: -5px;
	border-width: 5px 5px 5px 0;
	border-right-color: #000;
}
.tooltip.left .tooltip-arrow {
	top: 50%;
	right: 0;
	margin-top: -5px;
	border-width: 5px 0 5px 5px;
	border-left-color: #000;
}
.tooltip.bottom .tooltip-arrow {
	top: 0;
	left: 50%;
	margin-left: -5px;
	border-width: 0 5px 5px;
	border-bottom-color: #000;
}
.popover {
	position: absolute;
	top: 0;
	left: 0;
	z-index: 1060;
	display: none;
	max-width: 276px;
	padding: 1px;
	text-align: left;
	background-color: #fff;
	-webkit-background-clip: padding-box;
	-moz-background-clip: padding;
	background-clip: padding-box;
	border: 1px solid #ccc;
	border: 1px solid rgba(0,0,0,0.2);
	-webkit-border-radius: 6px;
	-moz-border-radius: 6px;
	border-radius: 6px;
	-webkit-box-shadow: 0 5px 10px rgba(0,0,0,0.2);
	-moz-box-shadow: 0 5px 10px rgba(0,0,0,0.2);
	box-shadow: 0 5px 10px rgba(0,0,0,0.2);
	white-space: normal;
}
.popover.top {
	margin-top: -10px;
}
.popover.right {
	margin-left: 10px;
}
.popover.bottom {
	margin-top: 10px;
}
.popover.left {
	margin-left: -10px;
}
.popover-title {
	margin: 0;
	padding: 8px 14px;
	font-size: 14px;
	font-weight: normal;
	line-height: 18px;
	background-color: #f7f7f7;
	border-bottom: 1px solid #ebebeb;
	-webkit-border-radius: 5px 5px 0 0;
	-moz-border-radius: 5px 5px 0 0;
	border-radius: 5px 5px 0 0;
}
.popover-title:empty {
	display: none;
}
.popover-content {
	padding: 9px 14px;
}
.popover .arrow,
.popover .arrow:after {
	position: absolute;
	display: block;
	width: 0;
	height: 0;
	border-color: transparent;
	border-style: solid;
}
.popover .arrow {
	border-width: 11px;
}
.popover .arrow:after {
	border-width: 10px;
	content: "";
}
.popover.top .arrow {
	left: 50%;
	margin-left: -11px;
	border-bottom-width: 0;
	border-top-color: #999;
	border-top-color: rgba(0,0,0,0.25);
	bottom: -11px;
}
.popover.top .arrow:after {
	bottom: 1px;
	margin-left: -10px;
	border-bottom-width: 0;
	border-top-color: #fff;
}
.popover.right .arrow {
	top: 50%;
	left: -11px;
	margin-top: -11px;
	border-left-width: 0;
	border-right-color: #999;
	border-right-color: rgba(0,0,0,0.25);
}
.popover.right .arrow:after {
	left: 1px;
	bottom: -10px;
	border-left-width: 0;
	border-right-color: #fff;
}
.popover.bottom .arrow {
	left: 50%;
	margin-left: -11px;
	border-top-width: 0;
	border-bottom-color: #999;
	border-bottom-color: rgba(0,0,0,0.25);
	top: -11px;
}
.popover.bottom .arrow:after {
	top: 1px;
	margin-left: -10px;
	border-top-width: 0;
	border-bottom-color: #fff;
}
.popover.left .arrow {
	top: 50%;
	right: -11px;
	margin-top: -11px;
	border-right-width: 0;
	border-left-color: #999;
	border-left-color: rgba(0,0,0,0.25);
}
.popover.left .arrow:after {
	right: 1px;
	border-right-width: 0;
	border-left-color: #fff;
	bottom: -10px;
}
.thumbnails {
	margin-left: -20px;
	list-style: none;
	*zoom: 1;
}
.thumbnails:before,
.thumbnails:after {
	display: table;
	content: "";
	line-height: 0;
}
.thumbnails:after {
	clear: both;
}
.row-fluid .thumbnails {
	margin-left: 0;
}
.thumbnails > li {
	float: left;
	margin-bottom: 18px;
	margin-left: 20px;
}
.thumbnail {
	display: block;
	padding: 4px;
	line-height: 18px;
	border: 1px solid #ddd;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
	-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.055);
	-moz-box-shadow: 0 1px 3px rgba(0,0,0,0.055);
	box-shadow: 0 1px 3px rgba(0,0,0,0.055);
	-webkit-transition: all .2s ease-in-out;
	-moz-transition: all .2s ease-in-out;
	-o-transition: all .2s ease-in-out;
	transition: all .2s ease-in-out;
}
a.thumbnail:hover,
a.thumbnail:focus {
	border-color: #3071a9;
	-webkit-box-shadow: 0 1px 4px rgba(0,105,214,0.25);
	-moz-box-shadow: 0 1px 4px rgba(0,105,214,0.25);
	box-shadow: 0 1px 4px rgba(0,105,214,0.25);
}
.thumbnail > img {
	display: block;
	max-width: 100%;
	margin-left: auto;
	margin-right: auto;
}
.thumbnail .caption {
	padding: 9px;
	color: #555;
}
.media,
.media-body {
	overflow: hidden;
	*overflow: visible;
	zoom: 1;
}
.media,
.media .media {
	margin-top: 15px;
}
.media:first-child {
	margin-top: 0;
}
.media-object {
	display: block;
}
.media-heading {
	margin: 0 0 5px;
}
.media > .pull-left {
	margin-right: 10px;
}
.media > .pull-right {
	margin-left: 10px;
}
.media-list {
	margin-left: 0;
	list-style: none;
}
.label,
.badge {
	display: inline-block;
	padding: 2px 4px;
	font-size: 10.998px;
	font-weight: bold;
	line-height: 14px;
	color: #fff;
	vertical-align: baseline;
	white-space: nowrap;
	text-shadow: 0 -1px 0 rgba(0,0,0,0.25);
	background-color: #999;
}
.label {
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.badge {
	padding-left: 9px;
	padding-right: 9px;
	-webkit-border-radius: 9px;
	-moz-border-radius: 9px;
	border-radius: 9px;
}
.label:empty,
.badge:empty {
	display: none;
}
a.label:hover,
a.label:focus,
a.badge:hover,
a.badge:focus {
	color: #fff;
	text-decoration: none;
	cursor: pointer;
}
.label-important,
.badge-important {
	background-color: #a94442;
}
.label-important[href],
.badge-important[href] {
	background-color: #843534;
}
.label-warning,
.badge-warning {
	background-color: #f89406;
}
.label-warning[href],
.badge-warning[href] {
	background-color: #c67605;
}
.label-success,
.badge-success {
	background-color: #3c763d;
}
.label-success[href],
.badge-success[href] {
	background-color: #2b542c;
}
.label-info,
.badge-info {
	background-color: #31708f;
}
.label-info[href],
.badge-info[href] {
	background-color: #245269;
}
.label-inverse,
.badge-inverse {
	background-color: #333;
}
.label-inverse[href],
.badge-inverse[href] {
	background-color: #1a1a1a;
}
.btn .label,
.btn .badge {
	position: relative;
	top: -1px;
}
.btn-mini .label,
.btn-mini .badge {
	top: 0;
}
@-webkit-keyframes progress-bar-stripes {
	from {
		background-position: 40px 0;
	}
	to {
		background-position: 0 0;
	}
}
@-moz-keyframes progress-bar-stripes {
	from {
		background-position: 40px 0;
	}
	to {
		background-position: 0 0;
	}
}
@-ms-keyframes progress-bar-stripes {
	from {
		background-position: 40px 0;
	}
	to {
		background-position: 0 0;
	}
}
@-o-keyframes progress-bar-stripes {
	from {
		background-position: 0 0;
	}
	to {
		background-position: 40px 0;
	}
}
@keyframes progress-bar-stripes {
	from {
		background-position: 40px 0;
	}
	to {
		background-position: 0 0;
	}
}
.progress {
	overflow: hidden;
	height: 18px;
	margin-bottom: 18px;
	background-color: #f7f7f7;
	background-image: -moz-linear-gradient(top,#f5f5f5,#f9f9f9);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));
	background-image: -webkit-linear-gradient(top,#f5f5f5,#f9f9f9);
	background-image: -o-linear-gradient(top,#f5f5f5,#f9f9f9);
	background-image: linear-gradient(to bottom,#f5f5f5,#f9f9f9);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
	-webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,0.1);
	-moz-box-shadow: inset 0 1px 2px rgba(0,0,0,0.1);
	box-shadow: inset 0 1px 2px rgba(0,0,0,0.1);
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.progress .bar {
	width: 0%;
	height: 100%;
	color: #fff;
	float: left;
	font-size: 12px;
	text-align: center;
	text-shadow: 0 -1px 0 rgba(0,0,0,0.25);
	background-color: #0e90d2;
	background-image: -moz-linear-gradient(top,#149bdf,#0480be);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));
	background-image: -webkit-linear-gradient(top,#149bdf,#0480be);
	background-image: -o-linear-gradient(top,#149bdf,#0480be);
	background-image: linear-gradient(to bottom,#149bdf,#0480be);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
	-webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,0.15);
	-moz-box-shadow: inset 0 -1px 0 rgba(0,0,0,0.15);
	box-shadow: inset 0 -1px 0 rgba(0,0,0,0.15);
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
	-webkit-transition: width .6s ease;
	-moz-transition: width .6s ease;
	-o-transition: width .6s ease;
	transition: width .6s ease;
}
.progress .bar + .bar {
	-webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
	-moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
	box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
}
.progress-striped .bar {
	background-color: #149bdf;
	background-image: -webkit-gradient(linear,0 100%,100% 0,color-stop(.25,rgba(255,255,255,0.15)),color-stop(.25,transparent),color-stop(.5,transparent),color-stop(.5,rgba(255,255,255,0.15)),color-stop(.75,rgba(255,255,255,0.15)),color-stop(.75,transparent),to(transparent));
	background-image: -webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: -moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: -o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	-webkit-background-size: 40px 40px;
	-moz-background-size: 40px 40px;
	-o-background-size: 40px 40px;
	background-size: 40px 40px;
}
.progress.active .bar {
	-webkit-animation: progress-bar-stripes 2s linear infinite;
	-moz-animation: progress-bar-stripes 2s linear infinite;
	-ms-animation: progress-bar-stripes 2s linear infinite;
	-o-animation: progress-bar-stripes 2s linear infinite;
	animation: progress-bar-stripes 2s linear infinite;
}
.progress-danger .bar,
.progress .bar-danger {
	background-color: #dd514c;
	background-image: -moz-linear-gradient(top,#ee5f5b,#c43c35);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));
	background-image: -webkit-linear-gradient(top,#ee5f5b,#c43c35);
	background-image: -o-linear-gradient(top,#ee5f5b,#c43c35);
	background-image: linear-gradient(to bottom,#ee5f5b,#c43c35);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
}
.progress-danger.progress-striped .bar,
.progress-striped .bar-danger {
	background-color: #ee5f5b;
	background-image: -webkit-gradient(linear,0 100%,100% 0,color-stop(.25,rgba(255,255,255,0.15)),color-stop(.25,transparent),color-stop(.5,transparent),color-stop(.5,rgba(255,255,255,0.15)),color-stop(.75,rgba(255,255,255,0.15)),color-stop(.75,transparent),to(transparent));
	background-image: -webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: -moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: -o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
}
.progress-success .bar,
.progress .bar-success {
	background-color: #5eb95e;
	background-image: -moz-linear-gradient(top,#62c462,#57a957);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));
	background-image: -webkit-linear-gradient(top,#62c462,#57a957);
	background-image: -o-linear-gradient(top,#62c462,#57a957);
	background-image: linear-gradient(to bottom,#62c462,#57a957);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
}
.progress-success.progress-striped .bar,
.progress-striped .bar-success {
	background-color: #62c462;
	background-image: -webkit-gradient(linear,0 100%,100% 0,color-stop(.25,rgba(255,255,255,0.15)),color-stop(.25,transparent),color-stop(.5,transparent),color-stop(.5,rgba(255,255,255,0.15)),color-stop(.75,rgba(255,255,255,0.15)),color-stop(.75,transparent),to(transparent));
	background-image: -webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: -moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: -o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
}
.progress-info .bar,
.progress .bar-info {
	background-color: #4bb1cf;
	background-image: -moz-linear-gradient(top,#5bc0de,#339bb9);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));
	background-image: -webkit-linear-gradient(top,#5bc0de,#339bb9);
	background-image: -o-linear-gradient(top,#5bc0de,#339bb9);
	background-image: linear-gradient(to bottom,#5bc0de,#339bb9);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
}
.progress-info.progress-striped .bar,
.progress-striped .bar-info {
	background-color: #5bc0de;
	background-image: -webkit-gradient(linear,0 100%,100% 0,color-stop(.25,rgba(255,255,255,0.15)),color-stop(.25,transparent),color-stop(.5,transparent),color-stop(.5,rgba(255,255,255,0.15)),color-stop(.75,rgba(255,255,255,0.15)),color-stop(.75,transparent),to(transparent));
	background-image: -webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: -moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: -o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
}
.progress-warning .bar,
.progress .bar-warning {
	background-color: #faa732;
	background-image: -moz-linear-gradient(top,#fbb450,#f89406);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));
	background-image: -webkit-linear-gradient(top,#fbb450,#f89406);
	background-image: -o-linear-gradient(top,#fbb450,#f89406);
	background-image: linear-gradient(to bottom,#fbb450,#f89406);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffab44f', endColorstr='#fff89406', GradientType=0);
}
.progress-warning.progress-striped .bar,
.progress-striped .bar-warning {
	background-color: #fbb450;
	background-image: -webkit-gradient(linear,0 100%,100% 0,color-stop(.25,rgba(255,255,255,0.15)),color-stop(.25,transparent),color-stop(.5,transparent),color-stop(.5,rgba(255,255,255,0.15)),color-stop(.75,rgba(255,255,255,0.15)),color-stop(.75,transparent),to(transparent));
	background-image: -webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: -moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: -o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
}
.accordion {
	margin-bottom: 18px;
}
.accordion-group {
	margin-bottom: 2px;
	border: 1px solid #e5e5e5;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.accordion-heading {
	border-bottom: 0;
}
.accordion-heading .accordion-toggle {
	display: block;
	padding: 8px 15px;
}
.accordion-toggle {
	cursor: pointer;
}
.accordion-inner {
	padding: 9px 15px;
	border-top: 1px solid #e5e5e5;
}
.carousel {
	position: relative;
	margin-bottom: 18px;
	line-height: 1;
}
.carousel-inner {
	overflow: hidden;
	width: 100%;
	position: relative;
}
.carousel-inner > .item {
	display: none;
	position: relative;
	-webkit-transition: .6s ease-in-out left;
	-moz-transition: .6s ease-in-out left;
	-o-transition: .6s ease-in-out left;
	transition: .6s ease-in-out left;
}
.carousel-inner > .item > img,
.carousel-inner > .item > a > img {
	display: block;
	line-height: 1;
}
.carousel-inner > .active,
.carousel-inner > .next,
.carousel-inner > .prev {
	display: block;
}
.carousel-inner > .active {
	left: 0;
}
.carousel-inner > .next,
.carousel-inner > .prev {
	position: absolute;
	top: 0;
	width: 100%;
}
.carousel-inner > .next {
	left: 100%;
}
.carousel-inner > .prev {
	left: -100%;
}
.carousel-inner > .next.left,
.carousel-inner > .prev.right {
	left: 0;
}
.carousel-inner > .active.left {
	left: -100%;
}
.carousel-inner > .active.right {
	left: 100%;
}
.carousel-control {
	position: absolute;
	top: 40%;
	left: 15px;
	width: 40px;
	height: 40px;
	margin-top: -20px;
	font-size: 60px;
	font-weight: 100;
	line-height: 30px;
	color: #fff;
	text-align: center;
	background: #222;
	border: 3px solid #fff;
	-webkit-border-radius: 23px;
	-moz-border-radius: 23px;
	border-radius: 23px;
	opacity: 0.5;
	filter: alpha(opacity=50);
}
.carousel-control.right {
	left: auto;
	right: 15px;
}
.carousel-control:hover,
.carousel-control:focus {
	color: #fff;
	text-decoration: none;
	opacity: 0.9;
	filter: alpha(opacity=90);
}
.carousel-indicators {
	position: absolute;
	top: 15px;
	right: 15px;
	z-index: 5;
	margin: 0;
	list-style: none;
}
.carousel-indicators li {
	display: block;
	float: left;
	width: 10px;
	height: 10px;
	margin-left: 5px;
	text-indent: -999px;
	background-color: #ccc;
	background-color: rgba(255,255,255,0.25);
	border-radius: 5px;
}
.carousel-indicators .active {
	background-color: #fff;
}
.carousel-caption {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	padding: 15px;
	background: #333;
	background: rgba(0,0,0,0.75);
}
.carousel-caption h4,
.carousel-caption p {
	color: #fff;
	line-height: 18px;
}
.carousel-caption h4 {
	margin: 0 0 5px;
}
.carousel-caption p {
	margin-bottom: 0;
}
.hero-unit {
	padding: 60px;
	margin-bottom: 30px;
	font-size: 18px;
	font-weight: 200;
	line-height: 27px;
	color: inherit;
	background-color: #eee;
	-webkit-border-radius: 6px;
	-moz-border-radius: 6px;
	border-radius: 6px;
}
.hero-unit h1 {
	margin-bottom: 0;
	font-size: 60px;
	line-height: 1;
	color: inherit;
	letter-spacing: -1px;
}
.hero-unit li {
	line-height: 27px;
}
.pull-right {
	float: right;
}
.pull-left {
	float: left;
}
.hide {
	display: none;
}
.show {
	display: block;
}
.invisible {
	visibility: hidden;
}
.affix {
	position: fixed;
}
@-ms-viewport {
	width: device-width;
}
.hidden {
	display: none;
	visibility: hidden;
}
.visible-phone {
	display: none !important;
}
.visible-tablet {
	display: none !important;
}
.hidden-desktop {
	display: none !important;
}
.visible-desktop {
	display: inherit !important;
}
@media (min-width: 768px) and (max-width: 979px) {
	.hidden-desktop {
		display: inherit !important;
	}
	.visible-desktop {
		display: none !important;
	}
	.visible-tablet {
		display: inherit !important;
	}
	.hidden-tablet {
		display: none !important;
	}
}
@media (max-width: 767px) {
	.hidden-desktop {
		display: inherit !important;
	}
	.visible-desktop {
		display: none !important;
	}
	.visible-phone {
		display: inherit !important;
	}
	.hidden-phone {
		display: none !important;
	}
}
.visible-print {
	display: none !important;
}
@media print {
	.visible-print {
		display: inherit !important;
	}
	.hidden-print {
		display: none !important;
	}
}
@media (max-width: 767px) {
	body {
		padding-left: 20px;
		padding-right: 20px;
	}
	.navbar-fixed-top,
	.navbar-fixed-bottom,
	.navbar-static-top {
		margin-left: -20px;
		margin-right: -20px;
	}
	.container-fluid {
		padding: 0;
	}
	.dl-horizontal dt {
		float: none;
		clear: none;
		width: auto;
		text-align: left;
	}
	.dl-horizontal dd {
		margin-left: 0;
	}
	.dropdown-menu .menuitem-group {
		background-color: #10223e;
		color: #eee;
	}
	.container {
		width: auto;
	}
	.row-fluid {
		width: 100%;
	}
	.row,
	.thumbnails {
		margin-left: 0;
	}
	.thumbnails > li {
		float: none;
		margin-left: 0;
	}
	[class*="span"],
	.uneditable-input[class*="span"],
	.row-fluid [class*="span"] {
		float: none;
		display: block;
		width: 100%;
		margin-left: 0;
		-webkit-box-sizing: border-box;
		-moz-box-sizing: border-box;
		box-sizing: border-box;
	}
	.span12,
	.row-fluid .span12 {
		width: 100%;
		-webkit-box-sizing: border-box;
		-moz-box-sizing: border-box;
		box-sizing: border-box;
	}
	.row-fluid [class*="offset"]:first-child {
		margin-left: 0;
	}
	.input-large,
	.input-xlarge,
	.input-xxlarge,
	input[class*="span"],
	select[class*="span"],
	textarea[class*="span"],
	.uneditable-input {
		display: block;
		width: 100%;
		min-height: 28px;
		-webkit-box-sizing: border-box;
		-moz-box-sizing: border-box;
		box-sizing: border-box;
	}
	.input-prepend input,
	.input-append input,
	.input-prepend input[class*="span"],
	.input-append input[class*="span"] {
		display: inline-block;
	}
	.controls-row [class*="span"] + [class*="span"] {
		margin-left: 0;
	}
}
@media (max-width: 480px) {
	.nav-collapse {
		-webkit-transform: translate3d(0,0,0);
	}
	.page-header h1 small {
		display: block;
		line-height: 18px;
	}
	input[type="checkbox"],
	input[type="radio"] {
		border: 1px solid #ccc;
	}
	.form-horizontal .control-label {
		float: none;
		width: auto;
		padding-top: 0;
		text-align: left;
	}
	.form-horizontal .controls {
		margin-left: 0;
	}
	.form-horizontal .control-list {
		padding-top: 0;
	}
	.form-horizontal .form-actions {
		padding-left: 10px;
		padding-right: 10px;
	}
	.tag-category input#filter-search,
	.newsfeed-category input#filter-search {
		width: auto;
		margin-bottom: 9px;
	}
	.category-list input#filter-search {
		width: auto;
	}
	.media .pull-left,
	.media .pull-right {
		float: none;
		display: block;
		margin-bottom: 10px;
	}
	.media-object {
		margin-right: 0;
		margin-left: 0;
	}
	.modal-header .close {
		padding: 10px;
		margin: -10px;
	}
	.carousel-caption {
		position: static;
	}
}
@media (min-width: 768px) and (max-width: 979px) {
	.row {
		margin-left: -20px;
		*zoom: 1;
	}
	.row:before,
	.row:after {
		display: table;
		content: "";
		line-height: 0;
	}
	.row:after {
		clear: both;
	}
	[class*="span"] {
		float: left;
		min-height: 1px;
		margin-left: 20px;
	}
	.container,
	.navbar-static-top .container,
	.navbar-fixed-top .container,
	.navbar-fixed-bottom .container {
		width: 724px;
	}
	.span12 {
		width: 724px;
	}
	.span11 {
		width: 662px;
	}
	.span10 {
		width: 600px;
	}
	.span9 {
		width: 538px;
	}
	.span8 {
		width: 476px;
	}
	.span7 {
		width: 414px;
	}
	.span6 {
		width: 352px;
	}
	.span5 {
		width: 290px;
	}
	.span4 {
		width: 228px;
	}
	.span3 {
		width: 166px;
	}
	.span2 {
		width: 104px;
	}
	.span1 {
		width: 42px;
	}
	.offset12 {
		margin-left: 764px;
	}
	.offset11 {
		margin-left: 702px;
	}
	.offset10 {
		margin-left: 640px;
	}
	.offset9 {
		margin-left: 578px;
	}
	.offset8 {
		margin-left: 516px;
	}
	.offset7 {
		margin-left: 454px;
	}
	.offset6 {
		margin-left: 392px;
	}
	.offset5 {
		margin-left: 330px;
	}
	.offset4 {
		margin-left: 268px;
	}
	.offset3 {
		margin-left: 206px;
	}
	.offset2 {
		margin-left: 144px;
	}
	.offset1 {
		margin-left: 82px;
	}
	.row-fluid {
		width: 100%;
		*zoom: 1;
	}
	.row-fluid:before,
	.row-fluid:after {
		display: table;
		content: "";
		line-height: 0;
	}
	.row-fluid:after {
		clear: both;
	}
	.row-fluid [class*="span"] {
		display: block;
		width: 100%;
		min-height: 28px;
		-webkit-box-sizing: border-box;
		-moz-box-sizing: border-box;
		box-sizing: border-box;
		float: left;
		margin-left: 2.76243094%;
		*margin-left: 2.70923945%;
	}
	.row-fluid [class*="span"]:first-child {
		margin-left: 0;
	}
	.row-fluid .controls-row [class*="span"] + [class*="span"] {
		margin-left: 2.76243094%;
	}
	.row-fluid .span12 {
		width: 100%;
		*width: 99.94680851%;
	}
	.row-fluid .span11 {
		width: 91.43646409%;
		*width: 91.3832726%;
	}
	.row-fluid .span10 {
		width: 82.87292818%;
		*width: 82.81973669%;
	}
	.row-fluid .span9 {
		width: 74.30939227%;
		*width: 74.25620078%;
	}
	.row-fluid .span8 {
		width: 65.74585635%;
		*width: 65.69266486%;
	}
	.row-fluid .span7 {
		width: 57.18232044%;
		*width: 57.12912895%;
	}
	.row-fluid .span6 {
		width: 48.61878453%;
		*width: 48.56559304%;
	}
	.row-fluid .span5 {
		width: 40.05524862%;
		*width: 40.00205713%;
	}
	.row-fluid .span4 {
		width: 31.49171271%;
		*width: 31.43852122%;
	}
	.row-fluid .span3 {
		width: 22.9281768%;
		*width: 22.87498531%;
	}
	.row-fluid .span2 {
		width: 14.36464088%;
		*width: 14.31144939%;
	}
	.row-fluid .span1 {
		width: 5.80110497%;
		*width: 5.74791348%;
	}
	.row-fluid .offset12 {
		margin-left: 105.52486188%;
		*margin-left: 105.4184789%;
	}
	.row-fluid .offset12:first-child {
		margin-left: 102.76243094%;
		*margin-left: 102.65604796%;
	}
	.row-fluid .offset11 {
		margin-left: 96.96132597%;
		*margin-left: 96.85494299%;
	}
	.row-fluid .offset11:first-child {
		margin-left: 94.19889503%;
		*margin-left: 94.09251205%;
	}
	.row-fluid .offset10 {
		margin-left: 88.39779006%;
		*margin-left: 88.29140708%;
	}
	.row-fluid .offset10:first-child {
		margin-left: 85.63535912%;
		*margin-left: 85.52897614%;
	}
	.row-fluid .offset9 {
		margin-left: 79.83425414%;
		*margin-left: 79.72787116%;
	}
	.row-fluid .offset9:first-child {
		margin-left: 77.0718232%;
		*margin-left: 76.96544023%;
	}
	.row-fluid .offset8 {
		margin-left: 71.27071823%;
		*margin-left: 71.16433525%;
	}
	.row-fluid .offset8:first-child {
		margin-left: 68.50828729%;
		*margin-left: 68.40190431%;
	}
	.row-fluid .offset7 {
		margin-left: 62.70718232%;
		*margin-left: 62.60079934%;
	}
	.row-fluid .offset7:first-child {
		margin-left: 59.94475138%;
		*margin-left: 59.8383684%;
	}
	.row-fluid .offset6 {
		margin-left: 54.14364641%;
		*margin-left: 54.03726343%;
	}
	.row-fluid .offset6:first-child {
		margin-left: 51.38121547%;
		*margin-left: 51.27483249%;
	}
	.row-fluid .offset5 {
		margin-left: 45.5801105%;
		*margin-left: 45.47372752%;
	}
	.row-fluid .offset5:first-child {
		margin-left: 42.81767956%;
		*margin-left: 42.71129658%;
	}
	.row-fluid .offset4 {
		margin-left: 37.01657459%;
		*margin-left: 36.91019161%;
	}
	.row-fluid .offset4:first-child {
		margin-left: 34.25414365%;
		*margin-left: 34.14776067%;
	}
	.row-fluid .offset3 {
		margin-left: 28.45303867%;
		*margin-left: 28.3466557%;
	}
	.row-fluid .offset3:first-child {
		margin-left: 25.69060773%;
		*margin-left: 25.58422476%;
	}
	.row-fluid .offset2 {
		margin-left: 19.88950276%;
		*margin-left: 19.78311978%;
	}
	.row-fluid .offset2:first-child {
		margin-left: 17.12707182%;
		*margin-left: 17.02068884%;
	}
	.row-fluid .offset1 {
		margin-left: 11.32596685%;
		*margin-left: 11.21958387%;
	}
	.row-fluid .offset1:first-child {
		margin-left: 8.56353591%;
		*margin-left: 8.45715293%;
	}
	input,
	textarea,
	.uneditable-input {
		margin-left: 0;
	}
	.controls-row [class*="span"] + [class*="span"] {
		margin-left: 20px;
	}
	input.span12,
	textarea.span12,
	.uneditable-input.span12 {
		width: 710px;
	}
	input.span11,
	textarea.span11,
	.uneditable-input.span11 {
		width: 648px;
	}
	input.span10,
	textarea.span10,
	.uneditable-input.span10 {
		width: 586px;
	}
	input.span9,
	textarea.span9,
	.uneditable-input.span9 {
		width: 524px;
	}
	input.span8,
	textarea.span8,
	.uneditable-input.span8 {
		width: 462px;
	}
	input.span7,
	textarea.span7,
	.uneditable-input.span7 {
		width: 400px;
	}
	input.span6,
	textarea.span6,
	.uneditable-input.span6 {
		width: 338px;
	}
	input.span5,
	textarea.span5,
	.uneditable-input.span5 {
		width: 276px;
	}
	input.span4,
	textarea.span4,
	.uneditable-input.span4 {
		width: 214px;
	}
	input.span3,
	textarea.span3,
	.uneditable-input.span3 {
		width: 152px;
	}
	input.span2,
	textarea.span2,
	.uneditable-input.span2 {
		width: 90px;
	}
	input.span1,
	textarea.span1,
	.uneditable-input.span1 {
		width: 28px;
	}
}
@media (min-width: 1200px) {
	.row {
		margin-left: -30px;
		*zoom: 1;
	}
	.row:before,
	.row:after {
		display: table;
		content: "";
		line-height: 0;
	}
	.row:after {
		clear: both;
	}
	[class*="span"] {
		float: left;
		min-height: 1px;
		margin-left: 30px;
	}
	.container,
	.navbar-static-top .container,
	.navbar-fixed-top .container,
	.navbar-fixed-bottom .container {
		width: 1170px;
	}
	.span12 {
		width: 1170px;
	}
	.span11 {
		width: 1070px;
	}
	.span10 {
		width: 970px;
	}
	.span9 {
		width: 870px;
	}
	.span8 {
		width: 770px;
	}
	.span7 {
		width: 670px;
	}
	.span6 {
		width: 570px;
	}
	.span5 {
		width: 470px;
	}
	.span4 {
		width: 370px;
	}
	.span3 {
		width: 270px;
	}
	.span2 {
		width: 170px;
	}
	.span1 {
		width: 70px;
	}
	.offset12 {
		margin-left: 1230px;
	}
	.offset11 {
		margin-left: 1130px;
	}
	.offset10 {
		margin-left: 1030px;
	}
	.offset9 {
		margin-left: 930px;
	}
	.offset8 {
		margin-left: 830px;
	}
	.offset7 {
		margin-left: 730px;
	}
	.offset6 {
		margin-left: 630px;
	}
	.offset5 {
		margin-left: 530px;
	}
	.offset4 {
		margin-left: 430px;
	}
	.offset3 {
		margin-left: 330px;
	}
	.offset2 {
		margin-left: 230px;
	}
	.offset1 {
		margin-left: 130px;
	}
	.row-fluid {
		width: 100%;
		*zoom: 1;
	}
	.row-fluid:before,
	.row-fluid:after {
		display: table;
		content: "";
		line-height: 0;
	}
	.row-fluid:after {
		clear: both;
	}
	.row-fluid [class*="span"] {
		display: block;
		width: 100%;
		min-height: 28px;
		-webkit-box-sizing: border-box;
		-moz-box-sizing: border-box;
		box-sizing: border-box;
		float: left;
		margin-left: 2.76243094%;
		*margin-left: 2.70923945%;
	}
	.row-fluid [class*="span"]:first-child {
		margin-left: 0;
	}
	.row-fluid .controls-row [class*="span"] + [class*="span"] {
		margin-left: 2.76243094%;
	}
	.row-fluid .span12 {
		width: 100%;
		*width: 99.94680851%;
	}
	.row-fluid .span11 {
		width: 91.43646409%;
		*width: 91.3832726%;
	}
	.row-fluid .span10 {
		width: 82.87292818%;
		*width: 82.81973669%;
	}
	.row-fluid .span9 {
		width: 74.30939227%;
		*width: 74.25620078%;
	}
	.row-fluid .span8 {
		width: 65.74585635%;
		*width: 65.69266486%;
	}
	.row-fluid .span7 {
		width: 57.18232044%;
		*width: 57.12912895%;
	}
	.row-fluid .span6 {
		width: 48.61878453%;
		*width: 48.56559304%;
	}
	.row-fluid .span5 {
		width: 40.05524862%;
		*width: 40.00205713%;
	}
	.row-fluid .span4 {
		width: 31.49171271%;
		*width: 31.43852122%;
	}
	.row-fluid .span3 {
		width: 22.9281768%;
		*width: 22.87498531%;
	}
	.row-fluid .span2 {
		width: 14.36464088%;
		*width: 14.31144939%;
	}
	.row-fluid .span1 {
		width: 5.80110497%;
		*width: 5.74791348%;
	}
	.row-fluid .offset12 {
		margin-left: 105.52486188%;
		*margin-left: 105.4184789%;
	}
	.row-fluid .offset12:first-child {
		margin-left: 102.76243094%;
		*margin-left: 102.65604796%;
	}
	.row-fluid .offset11 {
		margin-left: 96.96132597%;
		*margin-left: 96.85494299%;
	}
	.row-fluid .offset11:first-child {
		margin-left: 94.19889503%;
		*margin-left: 94.09251205%;
	}
	.row-fluid .offset10 {
		margin-left: 88.39779006%;
		*margin-left: 88.29140708%;
	}
	.row-fluid .offset10:first-child {
		margin-left: 85.63535912%;
		*margin-left: 85.52897614%;
	}
	.row-fluid .offset9 {
		margin-left: 79.83425414%;
		*margin-left: 79.72787116%;
	}
	.row-fluid .offset9:first-child {
		margin-left: 77.0718232%;
		*margin-left: 76.96544023%;
	}
	.row-fluid .offset8 {
		margin-left: 71.27071823%;
		*margin-left: 71.16433525%;
	}
	.row-fluid .offset8:first-child {
		margin-left: 68.50828729%;
		*margin-left: 68.40190431%;
	}
	.row-fluid .offset7 {
		margin-left: 62.70718232%;
		*margin-left: 62.60079934%;
	}
	.row-fluid .offset7:first-child {
		margin-left: 59.94475138%;
		*margin-left: 59.8383684%;
	}
	.row-fluid .offset6 {
		margin-left: 54.14364641%;
		*margin-left: 54.03726343%;
	}
	.row-fluid .offset6:first-child {
		margin-left: 51.38121547%;
		*margin-left: 51.27483249%;
	}
	.row-fluid .offset5 {
		margin-left: 45.5801105%;
		*margin-left: 45.47372752%;
	}
	.row-fluid .offset5:first-child {
		margin-left: 42.81767956%;
		*margin-left: 42.71129658%;
	}
	.row-fluid .offset4 {
		margin-left: 37.01657459%;
		*margin-left: 36.91019161%;
	}
	.row-fluid .offset4:first-child {
		margin-left: 34.25414365%;
		*margin-left: 34.14776067%;
	}
	.row-fluid .offset3 {
		margin-left: 28.45303867%;
		*margin-left: 28.3466557%;
	}
	.row-fluid .offset3:first-child {
		margin-left: 25.69060773%;
		*margin-left: 25.58422476%;
	}
	.row-fluid .offset2 {
		margin-left: 19.88950276%;
		*margin-left: 19.78311978%;
	}
	.row-fluid .offset2:first-child {
		margin-left: 17.12707182%;
		*margin-left: 17.02068884%;
	}
	.row-fluid .offset1 {
		margin-left: 11.32596685%;
		*margin-left: 11.21958387%;
	}
	.row-fluid .offset1:first-child {
		margin-left: 8.56353591%;
		*margin-left: 8.45715293%;
	}
	input,
	textarea,
	.uneditable-input {
		margin-left: 0;
	}
	.controls-row [class*="span"] + [class*="span"] {
		margin-left: 30px;
	}
	input.span12,
	textarea.span12,
	.uneditable-input.span12 {
		width: 1156px;
	}
	input.span11,
	textarea.span11,
	.uneditable-input.span11 {
		width: 1056px;
	}
	input.span10,
	textarea.span10,
	.uneditable-input.span10 {
		width: 956px;
	}
	input.span9,
	textarea.span9,
	.uneditable-input.span9 {
		width: 856px;
	}
	input.span8,
	textarea.span8,
	.uneditable-input.span8 {
		width: 756px;
	}
	input.span7,
	textarea.span7,
	.uneditable-input.span7 {
		width: 656px;
	}
	input.span6,
	textarea.span6,
	.uneditable-input.span6 {
		width: 556px;
	}
	input.span5,
	textarea.span5,
	.uneditable-input.span5 {
		width: 456px;
	}
	input.span4,
	textarea.span4,
	.uneditable-input.span4 {
		width: 356px;
	}
	input.span3,
	textarea.span3,
	.uneditable-input.span3 {
		width: 256px;
	}
	input.span2,
	textarea.span2,
	.uneditable-input.span2 {
		width: 156px;
	}
	input.span1,
	textarea.span1,
	.uneditable-input.span1 {
		width: 56px;
	}
	.thumbnails {
		margin-left: -30px;
	}
	.thumbnails > li {
		margin-left: 30px;
	}
	.row-fluid .thumbnails {
		margin-left: 0;
	}
}
@media (max-width: 767px) {
	body {
		padding-top: 0;
	}
	.navbar-fixed-top,
	.navbar-fixed-bottom {
		position: static;
	}
	.navbar-fixed-top {
		margin-bottom: 18px;
	}
	.navbar-fixed-bottom {
		margin-top: 18px;
	}
	.navbar-fixed-top .navbar-inner,
	.navbar-fixed-bottom .navbar-inner {
		padding: 5px;
	}
	.navbar .container {
		width: auto;
		padding: 0;
	}
	.navbar .brand {
		padding-left: 10px;
		padding-right: 10px;
		margin: 0 0 0 -5px;
	}
	.nav-collapse {
		clear: both;
	}
	.nav-collapse .nav {
		float: none;
		margin: 0 0 9px;
	}
	.nav-collapse .nav > li {
		float: none;
	}
	.nav-collapse .nav > li > a {
		margin-bottom: 2px;
	}
	.nav-collapse .nav > .divider-vertical {
		display: none;
	}
	.nav-collapse .nav .nav-header {
		color: #555;
		text-shadow: none;
	}
	.nav-collapse .nav > li > a,
	.nav-collapse .dropdown-menu a {
		padding: 9px 15px;
		font-weight: bold;
		color: #555;
		-webkit-border-radius: 3px;
		-moz-border-radius: 3px;
		border-radius: 3px;
	}
	.nav-collapse .btn {
		padding: 4px 10px 4px;
		font-weight: normal;
		-webkit-border-radius: 3px;
		-moz-border-radius: 3px;
		border-radius: 3px;
	}
	.nav-collapse .dropdown-menu li + li a {
		margin-bottom: 2px;
	}
	.nav-collapse .nav > li > a:hover,
	.nav-collapse .nav > li > a:focus,
	.nav-collapse .dropdown-menu a:hover,
	.nav-collapse .dropdown-menu a:focus {
		background-color: #f2f2f2;
	}
	.navbar-inverse .nav-collapse .nav > li > a,
	.navbar-inverse .nav-collapse .dropdown-menu a {
		color: #d9d9d9;
	}
	.navbar-inverse .nav-collapse .nav > li > a:hover,
	.navbar-inverse .nav-collapse .nav > li > a:focus,
	.navbar-inverse .nav-collapse .dropdown-menu a:hover,
	.navbar-inverse .nav-collapse .dropdown-menu a:focus {
		background-color: #10223e;
	}
	.nav-collapse.in .btn-group {
		margin-top: 5px;
		padding: 0;
	}
	.nav-collapse .dropdown-menu {
		position: static;
		top: auto;
		left: auto;
		float: none;
		display: none;
		max-width: none;
		margin: 0 15px;
		padding: 0;
		background-color: transparent;
		border: none;
		-webkit-border-radius: 0;
		-moz-border-radius: 0;
		border-radius: 0;
		-webkit-box-shadow: none;
		-moz-box-shadow: none;
		box-shadow: none;
	}
	.nav-collapse .open > .dropdown-menu {
		display: block;
	}
	.nav-collapse .dropdown-menu:before,
	.nav-collapse .dropdown-menu:after {
		display: none;
	}
	.nav-collapse .dropdown-menu .divider {
		display: none;
	}
	.nav-collapse .nav > li > .dropdown-menu:before,
	.nav-collapse .nav > li > .dropdown-menu:after {
		display: none;
	}
	.nav-collapse .navbar-form,
	.nav-collapse .navbar-search {
		float: none;
		padding: 9px 15px;
		margin: 9px 0;
		border-top: 1px solid #f2f2f2;
		border-bottom: 1px solid #f2f2f2;
		-webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
		-moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
		box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
	}
	.navbar-inverse .nav-collapse .navbar-form,
	.navbar-inverse .nav-collapse .navbar-search {
		border-top-color: #10223e;
		border-bottom-color: #10223e;
	}
	.navbar .nav-collapse .nav.pull-right {
		float: none;
		margin-left: 0;
	}
	.nav-collapse,
	.nav-collapse.collapse {
		overflow: hidden;
		height: 0;
	}
	.navbar .btn-navbar {
		display: block;
	}
	.navbar-static .navbar-inner {
		padding-left: 10px;
		padding-right: 10px;
	}
}
@media (min-width: 768px) {
	.nav-collapse.collapse {
		height: auto !important;
		overflow: visible !important;
	}
}
.small {
	font-size: 11px;
}
iframe,
svg {
	max-width: 100%;
}
.nowrap {
	white-space: nowrap;
}
.center,
.table td.center,
.table th.center {
	text-align: center;
}
a.disabled,
a.disabled:hover {
	color: #999999;
	background-color: transparent;
	cursor: default;
	text-decoration: none;
}
.hero-unit {
	text-align: center;
}
.hero-unit .lead {
	margin-bottom: 18px;
	font-size: 20px;
	font-weight: 200;
	line-height: 27px;
}
.btn .caret {
	margin-bottom: 7px;
}
.btn.btn-micro .caret {
	margin: 5px 0;
}
.blog-row-rule,
.blog-item-rule {
	border: 0;
}
body.modal {
	padding-top: 0;
}
.row-even,
.row-odd {
	padding: 5px;
	width: 99%;
	border-bottom: 1px solid #ddd;
}
.row-odd {
	background-color: transparent;
}
.row-even {
	background-color: #f9f9f9;
}
.blog-row-rule,
.blog-item-rule {
	border: 0;
}
.row-fluid .row-reveal {
	visibility: hidden;
}
.row-fluid:hover .row-reveal {
	visibility: visible;
}
.btn-wide {
	width: 80%;
}
.nav-list > li.offset > a {
	padding-left: 30px;
	font-size: 12px;
}
.blog-row-rule,
.blog-item-rule {
	border: 0;
}
.row-fluid .offset1 {
	margin-left: 8.382978723%;
}
.row-fluid .offset2 {
	margin-left: 16.89361702%;
}
.row-fluid .offset3 {
	margin-left: 25.404255317%;
}
.row-fluid .offset4 {
	margin-left: 33.914893614%;
}
.row-fluid .offset5 {
	margin-left: 42.425531911%;
}
.row-fluid .offset6 {
	margin-left: 50.93617020799999%;
}
.row-fluid .offset7 {
	margin-left: 59.446808505%;
}
.row-fluid .offset8 {
	margin-left: 67.95744680199999%;
}
.row-fluid .offset9 {
	margin-left: 76.468085099%;
}
.row-fluid .offset10 {
	margin-left: 84.97872339599999%;
}
.row-fluid .offset11 {
	margin-left: 91.489361693%;
}
.navbar .nav > li > a.btn {
	padding: 4px 10px;
	line-height: 18px;
}
.nav-tabs.nav-dark {
	border-bottom: 1px solid #333;
	text-shadow: 1px 1px 1px #000;
}
.nav-tabs.nav-dark > li > a {
	color: #F8F8F8;
}
.nav-tabs.nav-dark > li > a:hover {
	border-color: #333 #333 #111;
	background-color: #777777;
}
.nav-tabs.nav-dark > .active > a,
.nav-tabs.nav-dark > .active > a:hover {
	color: #ffffff;
	background-color: #555555;
	border: 1px solid #222;
	border-bottom-color: transparent;
}
.thumbnail.pull-left {
	margin: 0 10px 10px 0;
}
.thumbnail.pull-right {
	margin: 0 0 10px 10px;
}
.width-10 {
	width: 10px;
}
.width-20 {
	width: 20px;
}
.width-30 {
	width: 30px;
}
.width-40 {
	width: 40px;
}
.width-50 {
	width: 50px;
}
.width-60 {
	width: 60px;
}
.width-70 {
	width: 70px;
}
.width-80 {
	width: 80px;
}
.width-90 {
	width: 90px;
}
.width-100 {
	width: 100px;
}
.height-10 {
	height: 10px;
}
.height-20 {
	height: 20px;
}
.height-30 {
	height: 30px;
}
.height-40 {
	height: 40px;
}
.height-50 {
	height: 50px;
}
.height-60 {
	height: 60px;
}
.height-70 {
	height: 70px;
}
.height-80 {
	height: 80px;
}
.height-90 {
	height: 90px;
}
.height-100 {
	height: 100px;
}
hr.hr-condensed {
	margin: 10px 0;
}
.list-striped,
.row-striped {
	list-style: none;
	line-height: 18px;
	text-align: left;
	vertical-align: middle;
	border-top: 1px solid #ddd;
	margin-left: 0;
}
.list-striped li,
.list-striped dd,
.row-striped .row,
.row-striped .row-fluid {
	border-bottom: 1px solid #ddd;
	padding: 8px;
}
.list-striped li:nth-child(odd),
.list-striped dd:nth-child(odd),
.row-striped .row:nth-child(odd),
.row-striped .row-fluid:nth-child(odd) {
	background-color: #f9f9f9;
}
.list-striped li:hover,
.list-striped dd:hover,
.row-striped .row:hover,
.row-striped .row-fluid:hover {
	background-color: #F0F0F0;
}
.row-striped .row-fluid {
	width: 100%;
	box-sizing: border-box;
}
.row-striped .row-fluid [class*="span"] {
	min-height: 10px;
}
.row-striped .row-fluid [class*="span"] {
	margin-left: 8px;
}
.row-striped .row-fluid [class*="span"]:first-child {
	margin-left: 0;
}
.list-condensed li {
	padding: 4px 5px;
}
.row-condensed .row,
.row-condensed .row-fluid {
	padding: 4px 5px;
}
.list-bordered,
.row-bordered {
	list-style: none;
	line-height: 18px;
	text-align: left;
	vertical-align: middle;
	margin-left: 0;
	border: 1px solid #ddd;
	-webkit-border-radius: 4px;
	-moz-border-radius: 4px;
	border-radius: 4px;
}
.radio.btn-group input[type=radio] {
	display: none;
}
.radio.btn-group > label {
	-webkit-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;
}
.radio.btn-group > label:first-of-type {
	margin-left: 0;
	-webkit-border-bottom-left-radius: 4px;
	border-bottom-left-radius: 4px;
	-webkit-border-top-left-radius: 4px;
	border-top-left-radius: 4px;
	-moz-border-radius-bottomleft: 4px;
	-moz-border-radius-topleft: 4px;
}
fieldset.radio.btn-group {
	padding-left: 0;
}
.iframe-bordered {
	border: 1px solid #ddd;
}
.tab-content {
	overflow: visible;
}
.tabs-left .tab-content {
	overflow: auto;
}
.nav-tabs > li > span {
	display: block;
	margin-right: 2px;
	padding-right: 12px;
	padding-left: 12px;
	padding-top: 8px;
	padding-bottom: 8px;
	line-height: 18px;
	border: 1px solid transparent;
	-webkit-border-radius: 4px 4px 0 0;
	-moz-border-radius: 4px 4px 0 0;
	border-radius: 4px 4px 0 0;
}
.btn-micro {
	padding: 1px 4px;
	font-size: 10px;
	line-height: 8px;
}
.btn-group > .btn-micro {
	font-size: 10px;
}
.tip-wrap {
	max-width: 200px;
	padding: 3px 8px;
	color: #fff;
	text-align: center;
	text-decoration: none;
	background-color: #000;
	-webkit-border-radius: 4px;
	-moz-border-radius: 4px;
	border-radius: 4px;
	z-index: 100;
}
.page-header {
	margin: 2px 0px 10px 0px;
	padding-bottom: 5px;
}
.input-prepend > .add-on,
.input-append > .add-on {
	vertical-align: top;
}
.input-prepend .chzn-container-single .chzn-single {
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.input-prepend .chzn-container-single .chzn-single-with-drop {
	-webkit-border-radius: 0 3px 0 0;
	-moz-border-radius: 0 3px 0 0;
	border-radius: 0 3px 0 0;
}
.input-append .chzn-container-single .chzn-single {
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
}
.input-append .chzn-container-single .chzn-single-with-drop {
	-webkit-border-radius: 3px 0 0 0;
	-moz-border-radius: 3px 0 0 0;
	border-radius: 3px 0 0 0;
}
.input-prepend.input-append .chzn-container-single .chzn-single,
.input-prepend.input-append .chzn-container-single .chzn-single-with-drop {
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.element-invisible {
	position: absolute;
	padding: 0;
	margin: 0;
	border: 0;
	height: 1px;
	width: 1px;
	overflow: hidden;
}
.element-invisible:focus {
	width: auto;
	height: auto;
	overflow: auto;
	background: #eee;
	color: #000;
	padding: 1em;
}
.form-vertical .control-label {
	float: none;
	width: auto;
	padding-right: 0;
	padding-top: 0;
	text-align: left;
}
.form-vertical .controls {
	margin-left: 0;
}
.width-auto {
	width: auto;
}
.btn-group .chzn-results {
	white-space: normal;
}
.accordion-body.in:hover {
	overflow: visible;
}
.invalid {
	color: #9d261d;
	font-weight: bold;
}
input.invalid {
	border: 1px solid #9d261d;
	background: #f2dede;
}
select.chzn-done.invalid + .chzn-container.chzn-container-single > a.chzn-single,
select.chzn-done.invalid + .chzn-container.chzn-container-multi > ul.chzn-choices {
	border-color: #9d261d;
	color: #9d261d;
}
.tooltip {
	max-width: 400px;
}
.tooltip-inner {
	max-width: none;
	text-align: left;
	text-shadow: none;
}
th .tooltip-inner {
	font-weight: normal;
}
.tooltip.hasimage {
	opacity: 1;
}
.tip-text {
	text-align: left;
}
.btn-group > .btn + .dropdown-backdrop + .btn {
	margin-left: -1px;
}
.btn-group > .btn + .dropdown-backdrop + .dropdown-toggle {
	padding-left: 8px;
	padding-right: 8px;
	-webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
	-moz-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
	box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
	*padding-top: 5px;
	*padding-bottom: 5px;
}
.btn-group > .btn-mini + .dropdown-backdrop + .dropdown-toggle {
	padding-left: 5px;
	padding-right: 5px;
	*padding-top: 2px;
	*padding-bottom: 2px;
}
.btn-group > .btn-small + .dropdown-backdrop + .dropdown-toggle {
	*padding-top: 5px;
	*padding-bottom: 4px;
}
.btn-group > .btn-large + .dropdown-backdrop + .dropdown-toggle {
	padding-left: 12px;
	padding-right: 12px;
	*padding-top: 7px;
	*padding-bottom: 7px;
}
.dropdown-menu {
	text-align: left;
}
.alert-link {
	font-weight: bold;
}
.alert .alert-link {
	color: #66512c;
}
.alert-success .alert-link {
	color: #2b542c;
}
.alert-danger .alert-link,
.alert-error .alert-link {
	color: #843534;
}
.alert-info .alert-link {
	color: #245269;
}
div.modal {
	position: fixed;
	top: 5%;
	left: 50%;
	z-index: 1050;
	width: 80%;
	margin-left: -40%;
	background-color: #fff;
	border: 1px solid #999;
	border: 1px solid rgba(0,0,0,0.3);
	*border: 1px solid #999;
	-webkit-border-radius: 6px;
	-moz-border-radius: 6px;
	border-radius: 6px;
	-webkit-box-shadow: 0 3px 7px rgba(0,0,0,0.3);
	-moz-box-shadow: 0 3px 7px rgba(0,0,0,0.3);
	box-shadow: 0 3px 7px rgba(0,0,0,0.3);
	-webkit-background-clip: padding-box;
	-moz-background-clip: padding-box;
	background-clip: padding-box;
	outline: none;
}
div.modal.fade {
	-webkit-transition: opacity .3s linear, top .3s ease-out;
	-moz-transition: opacity .3s linear, top .3s ease-out;
	-o-transition: opacity .3s linear, top .3s ease-out;
	transition: opacity .3s linear, top .3s ease-out;
	top: -25%;
}
div.modal.fade.in {
	top: 5%;
}
.modal-batch {
	overflow-y: visible;
}
.modal-body[class^="jviewport-height"],
.modal-body[class*="jviewport-height"] {
	max-height: none;
}
.jviewport-height10 {
	height: 10vh;
}
.jviewport-height20 {
	height: 20vh;
}
.jviewport-height30 {
	height: 30vh;
}
.jviewport-height40 {
	height: 40vh;
}
.jviewport-height50 {
	height: 50vh;
}
.jviewport-height60 {
	height: 60vh;
}
.jviewport-height70 {
	height: 70vh;
}
.jviewport-height80 {
	height: 80vh;
}
.jviewport-height90 {
	height: 90vh;
}
.jviewport-height100 {
	height: 100vh;
}
div.modal.jviewport-width10 {
	width: 10vw;
	margin-left: -5vw;
}
div.modal.jviewport-width20 {
	width: 20vw;
	margin-left: -10vw;
}
div.modal.jviewport-width30 {
	width: 30vw;
	margin-left: -15vw;
}
div.modal.jviewport-width40 {
	width: 40vw;
	margin-left: -20vw;
}
div.modal.jviewport-width50 {
	width: 50vw;
	margin-left: -25vw;
}
div.modal.jviewport-width60 {
	width: 60vw;
	margin-left: -30vw;
}
div.modal.jviewport-width70 {
	width: 70vw;
	margin-left: -35vw;
}
div.modal.jviewport-width80 {
	width: 80vw;
	margin-left: -40vw;
}
div.modal.jviewport-width90 {
	width: 90vw;
	margin-left: -45vw;
}
div.modal.jviewport-width100 {
	width: 100vw;
	margin-left: -50vw;
}
@media (max-width: 767px) {
	div.modal {
		position: fixed;
		top: 20px;
		left: 20px;
		right: 20px;
		width: auto;
		margin: 0;
	}
	div.modal.fade {
		top: -100px;
	}
	div.modal.fade.in {
		top: 20px;
	}
	div.modal[class*="jviewport-width"] {
		width: auto;
		margin: 0;
	}
}
@media (max-width: 480px) {
	div.modal {
		top: 10px;
		left: 10px;
		right: 10px;
	}
}
@font-face {
	font-family: 'IcoMoon';
	src: url('../../../../media/jui/fonts/IcoMoon.eot');
	src: url('../../../../media/jui/fonts/IcoMoon.eot?#iefix') format('embedded-opentype'), url('../../../../media/jui/fonts/IcoMoon.woff') format('woff'), url('../../../../media/jui/fonts/IcoMoon.ttf') format('truetype'), url('../../../../media/jui/fonts/IcoMoon.svg#IcoMoon') format('svg');
	font-weight: normal;
	font-style: normal;
}
[data-icon]:before {
	font-family: 'IcoMoon';
	content: attr(data-icon);
	speak: none;
}
[class^="icon-"],
[class*=" icon-"] {
	display: inline-block;
	width: 14px;
	height: 14px;
	margin-right: .25em;
	line-height: 14px;
}
[class^="icon-"]:before,
[class*=" icon-"]:before {
	font-family: 'IcoMoon';
	font-style: normal;
	speak: none;
}
[class^="icon-"].disabled,
[class*=" icon-"].disabled {
	font-weight: normal;
}
.icon-joomla:before {
	content: "\e200";
}
.icon-chevron-up:before,
.icon-uparrow:before,
.icon-arrow-up:before {
	content: "\e005";
}
.icon-chevron-right:before,
.icon-rightarrow:before,
.icon-arrow-right:before {
	content: "\e006";
}
.icon-chevron-down:before,
.icon-downarrow:before,
.icon-arrow-down:before {
	content: "\e007";
}
.icon-chevron-left:before,
.icon-leftarrow:before,
.icon-arrow-left:before {
	content: "\e008";
}
.icon-arrow-first:before {
	content: "\e003";
}
.icon-arrow-last:before {
	content: "\e004";
}
.icon-arrow-up-2:before {
	content: "\e009";
}
.icon-arrow-right-2:before {
	content: "\e00a";
}
.icon-arrow-down-2:before {
	content: "\e00b";
}
.icon-arrow-left-2:before {
	content: "\e00c";
}
.icon-arrow-up-3:before {
	content: "\e00f";
}
.icon-arrow-right-3:before {
	content: "\e010";
}
.icon-arrow-down-3:before {
	content: "\e011";
}
.icon-arrow-left-3:before {
	content: "\e012";
}
.icon-menu-2:before {
	content: "\e00e";
}
.icon-arrow-up-4:before {
	content: "\e201";
}
.icon-arrow-right-4:before {
	content: "\e202";
}
.icon-arrow-down-4:before {
	content: "\e203";
}
.icon-arrow-left-4:before {
	content: "\e204";
}
.icon-share:before,
.icon-redo:before {
	content: "\27";
}
.icon-undo:before {
	content: "\28";
}
.icon-forward-2:before {
	content: "\e205";
}
.icon-backward-2:before,
.icon-reply:before {
	content: "\e206";
}
.icon-unblock:before,
.icon-refresh:before,
.icon-redo-2:before {
	content: "\6c";
}
.icon-undo-2:before {
	content: "\e207";
}
.icon-move:before {
	content: "\7a";
}
.icon-expand:before {
	content: "\66";
}
.icon-contract:before {
	content: "\67";
}
.icon-expand-2:before {
	content: "\68";
}
.icon-contract-2:before {
	content: "\69";
}
.icon-play:before {
	content: "\e208";
}
.icon-pause:before {
	content: "\e209";
}
.icon-stop:before {
	content: "\e210";
}
.icon-previous:before,
.icon-backward:before {
	content: "\7c";
}
.icon-next:before,
.icon-forward:before {
	content: "\7b";
}
.icon-first:before {
	content: "\7d";
}
.icon-last:before {
	content: "\e000";
}
.icon-play-circle:before {
	content: "\e00d";
}
.icon-pause-circle:before {
	content: "\e211";
}
.icon-stop-circle:before {
	content: "\e212";
}
.icon-backward-circle:before {
	content: "\e213";
}
.icon-forward-circle:before {
	content: "\e214";
}
.icon-loop:before {
	content: "\e001";
}
.icon-shuffle:before {
	content: "\e002";
}
.icon-search:before {
	content: "\53";
}
.icon-zoom-in:before {
	content: "\64";
}
.icon-zoom-out:before {
	content: "\65";
}
.icon-apply:before,
.icon-edit:before,
.icon-pencil:before {
	content: "\2b";
}
.icon-pencil-2:before {
	content: "\2c";
}
.icon-brush:before {
	content: "\3b";
}
.icon-save-new:before,
.icon-plus-2:before {
	content: "\5d";
}
.icon-minus-sign:before,
.icon-minus-2:before {
	content: "\5e";
}
.icon-delete:before,
.icon-remove:before,
.icon-cancel-2:before {
	content: "\49";
}
.icon-publish:before,
.icon-save:before,
.icon-ok:before,
.icon-checkmark:before {
	content: "\47";
}
.icon-new:before,
.icon-plus:before {
	content: "\2a";
}
.icon-plus-circle:before {
	content: "\e215";
}
.icon-minus:before,
.icon-not-ok:before {
	content: "\4b";
}
.icon-ban-circle:before,
.icon-minus-circle:before {
	content: "\e216";
}
.icon-unpublish:before,
.icon-cancel:before {
	content: "\4a";
}
.icon-cancel-circle:before {
	content: "\e217";
}
.icon-checkmark-2:before {
	content: "\e218";
}
.icon-checkmark-circle:before {
	content: "\e219";
}
.icon-info:before {
	content: "\e220";
}
.icon-info-2:before,
.icon-info-circle:before {
	content: "\e221";
}
.icon-question:before,
.icon-question-sign:before,
.icon-help:before {
	content: "\45";
}
.icon-question-2:before,
.icon-question-circle:before {
	content: "\e222";
}
.icon-notification:before {
	content: "\e223";
}
.icon-notification-2:before,
.icon-notification-circle:before {
	content: "\e224";
}
.icon-pending:before,
.icon-warning:before {
	content: "\48";
}
.icon-warning-2:before,
.icon-warning-circle:before {
	content: "\e225";
}
.icon-checkbox-unchecked:before {
	content: "\3d";
}
.icon-checkin:before,
.icon-checkbox:before,
.icon-checkbox-checked:before {
	content: "\3e";
}
.icon-checkbox-partial:before {
	content: "\3f";
}
.icon-square:before {
	content: "\e226";
}
.icon-radio-unchecked:before {
	content: "\e227";
}
.icon-radio-checked:before,
.icon-generic:before {
	content: "\e228";
}
.icon-circle:before {
	content: "\e229";
}
.icon-signup:before {
	content: "\e230";
}
.icon-grid:before,
.icon-grid-view:before {
	content: "\58";
}
.icon-grid-2:before,
.icon-grid-view-2:before {
	content: "\59";
}
.icon-menu:before {
	content: "\5a";
}
.icon-list:before,
.icon-list-view:before {
	content: "\31";
}
.icon-list-2:before {
	content: "\e231";
}
.icon-menu-3:before {
	content: "\e232";
}
.icon-folder-open:before,
.icon-folder:before {
	content: "\2d";
}
.icon-folder-close:before,
.icon-folder-2:before {
	content: "\2e";
}
.icon-folder-plus:before {
	content: "\e234";
}
.icon-folder-minus:before {
	content: "\e235";
}
.icon-folder-3:before {
	content: "\e236";
}
.icon-folder-plus-2:before {
	content: "\e237";
}
.icon-folder-remove:before {
	content: "\e238";
}
.icon-file:before {
	content: "\e016";
}
.icon-file-2:before {
	content: "\e239";
}
.icon-file-add:before,
.icon-file-plus:before {
	content: "\29";
}
.icon-file-minus:before {
	content: "\e017";
}
.icon-file-check:before {
	content: "\e240";
}
.icon-file-remove:before {
	content: "\e241";
}
.icon-save-copy:before,
.icon-copy:before {
	content: "\e018";
}
.icon-stack:before {
	content: "\e242";
}
.icon-tree:before {
	content: "\e243";
}
.icon-tree-2:before {
	content: "\e244";
}
.icon-paragraph-left:before {
	content: "\e246";
}
.icon-paragraph-center:before {
	content: "\e247";
}
.icon-paragraph-right:before {
	content: "\e248";
}
.icon-paragraph-justify:before {
	content: "\e249";
}
.icon-screen:before {
	content: "\e01c";
}
.icon-tablet:before {
	content: "\e01d";
}
.icon-mobile:before {
	content: "\e01e";
}
.icon-box-add:before {
	content: "\51";
}
.icon-box-remove:before {
	content: "\52";
}
.icon-download:before {
	content: "\e021";
}
.icon-upload:before {
	content: "\e022";
}
.icon-home:before {
	content: "\21";
}
.icon-home-2:before {
	content: "\e250";
}
.icon-out-2:before,
.icon-new-tab:before {
	content: "\e024";
}
.icon-out-3:before,
.icon-new-tab-2:before {
	content: "\e251";
}
.icon-link:before {
	content: "\e252";
}
.icon-picture:before,
.icon-image:before {
	content: "\2f";
}
.icon-pictures:before,
.icon-images:before {
	content: "\30";
}
.icon-palette:before,
.icon-color-palette:before {
	content: "\e014";
}
.icon-camera:before {
	content: "\55";
}
.icon-camera-2:before,
.icon-video:before {
	content: "\e015";
}
.icon-play-2:before,
.icon-video-2:before,
.icon-youtube:before {
	content: "\56";
}
.icon-music:before {
	content: "\57";
}
.icon-user:before {
	content: "\22";
}
.icon-users:before {
	content: "\e01f";
}
.icon-vcard:before {
	content: "\6d";
}
.icon-address:before {
	content: "\70";
}
.icon-share-alt:before,
.icon-out:before {
	content: "\26";
}
.icon-enter:before {
	content: "\e257";
}
.icon-exit:before {
	content: "\e258";
}
.icon-comment:before,
.icon-comments:before {
	content: "\24";
}
.icon-comments-2:before {
	content: "\25";
}
.icon-quote:before,
.icon-quotes-left:before {
	content: "\60";
}
.icon-quote-2:before,
.icon-quotes-right:before {
	content: "\61";
}
.icon-quote-3:before,
.icon-bubble-quote:before {
	content: "\e259";
}
.icon-phone:before {
	content: "\e260";
}
.icon-phone-2:before {
	content: "\e261";
}
.icon-envelope:before,
.icon-mail:before {
	content: "\4d";
}
.icon-envelope-opened:before,
.icon-mail-2:before {
	content: "\4e";
}
.icon-unarchive:before,
.icon-drawer:before {
	content: "\4f";
}
.icon-archive:before,
.icon-drawer-2:before {
	content: "\50";
}
.icon-briefcase:before {
	content: "\e020";
}
.icon-tag:before {
	content: "\e262";
}
.icon-tag-2:before {
	content: "\e263";
}
.icon-tags:before {
	content: "\e264";
}
.icon-tags-2:before {
	content: "\e265";
}
.icon-options:before,
.icon-cog:before {
	content: "\38";
}
.icon-cogs:before {
	content: "\37";
}
.icon-screwdriver:before,
.icon-tools:before {
	content: "\36";
}
.icon-wrench:before {
	content: "\3a";
}
.icon-equalizer:before {
	content: "\39";
}
.icon-dashboard:before {
	content: "\78";
}
.icon-switch:before {
	content: "\e266";
}
.icon-filter:before {
	content: "\54";
}
.icon-purge:before,
.icon-trash:before {
	content: "\4c";
}
.icon-checkedout:before,
.icon-lock:before,
.icon-locked:before {
	content: "\23";
}
.icon-unlock:before {
	content: "\e267";
}
.icon-key:before {
	content: "\5f";
}
.icon-support:before {
	content: "\46";
}
.icon-database:before {
	content: "\62";
}
.icon-scissors:before {
	content: "\e268";
}
.icon-health:before {
	content: "\6a";
}
.icon-wand:before {
	content: "\6b";
}
.icon-eye-open:before,
.icon-eye:before {
	content: "\3c";
}
.icon-eye-close:before,
.icon-eye-blocked:before,
.icon-eye-2:before {
	content: "\e269";
}
.icon-clock:before {
	content: "\6e";
}
.icon-compass:before {
	content: "\6f";
}
.icon-broadcast:before,
.icon-connection:before,
.icon-wifi:before {
	content: "\e01b";
}
.icon-book:before {
	content: "\e271";
}
.icon-lightning:before,
.icon-flash:before {
	content: "\79";
}
.icon-print:before,
.icon-printer:before {
	content: "\e013";
}
.icon-feed:before {
	content: "\71";
}
.icon-calendar:before {
	content: "\43";
}
.icon-calendar-2:before {
	content: "\44";
}
.icon-calendar-3:before {
	content: "\e273";
}
.icon-pie:before {
	content: "\77";
}
.icon-bars:before {
	content: "\76";
}
.icon-chart:before {
	content: "\75";
}
.icon-power-cord:before {
	content: "\32";
}
.icon-cube:before {
	content: "\33";
}
.icon-puzzle:before {
	content: "\34";
}
.icon-attachment:before,
.icon-paperclip:before,
.icon-flag-2:before {
	content: "\72";
}
.icon-lamp:before {
	content: "\74";
}
.icon-pin:before,
.icon-pushpin:before {
	content: "\73";
}
.icon-location:before {
	content: "\63";
}
.icon-shield:before {
	content: "\e274";
}
.icon-flag:before {
	content: "\35";
}
.icon-flag-3:before {
	content: "\e275";
}
.icon-bookmark:before {
	content: "\e023";
}
.icon-bookmark-2:before {
	content: "\e276";
}
.icon-heart:before {
	content: "\e277";
}
.icon-heart-2:before {
	content: "\e278";
}
.icon-thumbs-up:before {
	content: "\5b";
}
.icon-thumbs-down:before {
	content: "\5c";
}
.icon-unfeatured:before,
.icon-asterisk:before,
.icon-star-empty:before {
	content: "\40";
}
.icon-star-2:before {
	content: "\41";
}
.icon-featured:before,
.icon-default:before,
.icon-star:before {
	content: "\42";
}
.icon-smiley:before,
.icon-smiley-happy:before {
	content: "\e279";
}
.icon-smiley-2:before,
.icon-smiley-happy-2:before {
	content: "\e280";
}
.icon-smiley-sad:before {
	content: "\e281";
}
.icon-smiley-sad-2:before {
	content: "\e282";
}
.icon-smiley-neutral:before {
	content: "\e283";
}
.icon-smiley-neutral-2:before {
	content: "\e284";
}
.icon-cart:before {
	content: "\e019";
}
.icon-basket:before {
	content: "\e01a";
}
.icon-credit:before {
	content: "\e286";
}
.icon-credit-2:before {
	content: "\e287";
}
.icon-expired:before {
	content: "\4b";
}
.icon-edit:before {
	color: #24748c;
}
.icon-publish:before,
.icon-save:before,
.icon-ok:before,
.icon-save-new:before,
.icon-save-copy:before,
.btn-toolbar .icon-copy:before {
	color: #378137;
}
.icon-unpublish:before,
.icon-not-ok:before,
.icon-eye-close:before,
.icon-ban-circle:before,
.icon-minus-sign:before,
.btn-toolbar .icon-cancel:before {
	color: #942a25;
}
.icon-featured:before,
.icon-default:before,
.icon-expired:before,
.icon-pending:before {
	color: #c67605;
}
.icon-back:before {
	content: "\e008";
}
html {
	height: 100%;
}
body {
	height: 100%;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	box-sizing: border-box;
}
a:hover,
a:active,
a:focus {
	outline: none;
}
.small {
	font-size: 11px;
}
.row-even .small,
.row-odd .small,
.row-even .small a,
.row-odd .small a {
	color: #888;
}
.content-title {
	font-size: 24px;
	font-weight: normal;
	line-height: 26px;
	margin-top: 0;
}
.well .page-header {
	margin: -10px 0 18px 0;
	padding-bottom: 5px;
}
.well .module-title.nav-header {
	padding: 0 0 7px;
	margin: 0;
	font-size: 13px;
}
.well .row-even p,
.well .row-odd p {
	margin-bottom: 0;
}
h1,
h2,
h3,
h4,
h5,
h6 {
	margin: 12px 0;
}
h1 {
	font-size: 26px;
	line-height: 28px;
}
h2 {
	font-size: 22px;
	line-height: 24px;
}
h3 {
	font-size: 18px;
	line-height: 20px;
}
h4 {
	font-size: 14px;
	line-height: 16px;
}
h5 {
	font-size: 13px;
	line-height: 15px;
}
h6 {
	font-size: 12px;
	line-height: 14px;
}
.truncate {
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.chzn-container .chzn-drop {
	border-radius: 0 0 3px 3px;
}
.control-group .chzn-container {
	max-width: 100%;
}
.control-group .chzn-container .chzn-choices li.search-field,
.control-group .chzn-container .chzn-choices li.search-field input {
	width: 100% !important;
}
.chzn-container-single .chzn-single {
	background-color: #fff;
	background-clip: inherit;
	background-image: none;
	border: 1px solid #ccc;
	border: 1px solid rgba(0,0,0,0.2);
	border-radius: 3px;
	box-shadow: 0 1px 0 rgba(255,255,255,0.2) inset, 0 1px 2px rgba(0,0,0,0.05);
	height: auto;
	line-height: 26px;
}
.chzn-container-single .chzn-single div {
	background-color: #f3f3f3;
	border-left: 1px solid #ccc;
	bottom: 0;
	height: auto;
	text-align: center;
	width: 28px;
}
.chzn-container-single .chzn-single div b {
	background-image: none;
	display: inline-block;
}
.chzn-container-single .chzn-single div b:after {
	content: '\E011';
	font-family: IcoMoon;
}
.chzn-container-single .chzn-single abbr {
	background: none;
	right: 36px;
	top: 0;
}
.chzn-container-single .chzn-single abbr:before {
	font-family: IcoMoon;
	content: '\0049';
	font-size: 10px;
	line-height: 26px;
}
.chzn-container-single .chzn-single abbr:hover {
	color: #000;
}
.chzn-container-single .chzn-search:after {
	content: '\0053';
	font-family: IcoMoon;
	position: relative;
	right: 20px;
	top: 2px;
}
.chzn-container-single .chzn-search input[type="text"] {
	background: none;
	border-radius: 3px;
	border: 1px solid #ccc;
	box-shadow: none;
	height: 25px;
}
.chzn-container-single .chzn-search input[type="text"]:focus {
	border-color: #3071A9;
}
.chzn-container-single .chzn-drop {
	background-clip: padding-box;
	border-color: #3071A9;
	border-radius: 0 0 3px 3px;
}
.chzn-container-active .chzn-single {
	color: #3071A9;
}
.chzn-container-active.chzn-with-drop .chzn-single {
	background-image: none;
	border: 1px solid #3071A9;
	border-bottom-left-radius: 0;
	border-bottom-right-radius: 0;
}
.chzn-container-active.chzn-with-drop .chzn-single div {
	background-color: #f3f3f3;
	border-bottom: 1px solid #ccc;
	border-bottom-left-radius: 3px;
	border-left: 1px solid #ccc;
}
.chzn-container-active.chzn-with-drop .chzn-single div b:after {
	content: '\E00F';
	font-family: IcoMoon;
}
.chzn-container-active.chzn-container-multi .chzn-choices {
	border: 1px solid #3071A9;
	box-shadow: none;
}
.chzn-container .chzn-results {
	background-color: #fff;
	border-radius: 0 0 3px 3px;
	margin: 0;
	padding: 0;
}
.chzn-container .chzn-results li.highlighted {
	background-color: #3071A9;
	background-image: none;
}
.chzn-color[rel="value_"] div {
	background-color: #f3f3f3;
	border-left: 1px solid #ccc;
}
.chzn-color-state.chzn-single div,
.chzn-color.chzn-single[rel="value_0"] div,
.chzn-color.chzn-single[rel="value_1"] div,
.chzn-color-state.chzn-single[rel="value_-1"] div,
.chzn-color-state.chzn-single[rel="value_-2"] div,
.chzn-color.chzn-single[rel="value_hide"] div,
.chzn-color.chzn-single[rel="value_show_no_link"] div,
.chzn-color.chzn-single[rel="value_show_with_link"] div {
	background-color: transparent !important;
	border: none !important;
}
.chzn-container-active .chzn-choices {
	border: 1px solid #3071A9;
}
.chzn-container-multi .chzn-choices {
	background-image: none;
	border-radius: 3px;
	border: 1px solid #ccc;
}
.chzn-container-multi .chzn-choices li.search-choice {
	background-color: #3071A9;
	background-image: none;
	border: 0;
	box-shadow: none;
	color: #fff;
	line-height: 20px;
	padding: 0 7px;
}
.chzn-container-multi .chzn-choices li.search-choice .search-choice-close {
	color: #f5f5f5;
	display: inline-block;
	margin-left: 5px;
	position: relative;
	top: 0;
	left: 0;
	background-image: none;
	font-size: inherit;
}
.chzn-container-multi .chzn-choices li.search-choice .search-choice-close:hover {
	text-decoration: none;
}
.chzn-container-multi .chzn-choices li.search-choice .search-choice-close:before {
	font-family: IcoMoon;
	content: '\004A';
	position: relative;
	right: 1px;
	top: 0;
}
.js-stools .js-stools-container-bar .js-stools-field-filter .chzn-container {
	margin: 1px 0;
	padding: 0 !important;
}
.chzn-color.chzn-single[rel="value_1"],
.chzn-color-reverse.chzn-single[rel="value_0"],
.chzn-color-state.chzn-single[rel="value_1"],
.chzn-color.chzn-single[rel="value_show_no_link"],
.chzn-color.chzn-single[rel="value_show_with_link"] {
	background-color: #46a546;
	*background-color: #46a546;
	box-shadow: 0 1px 2px rgba(0,0,0,0.05);
	color: #ffffff;
}
.chzn-color.chzn-single[rel="value_1"]:hover,
.chzn-color.chzn-single[rel="value_1"]:focus,
.chzn-color.chzn-single[rel="value_1"]:active,
.chzn-color.chzn-single[rel="value_1"].active,
.chzn-color.chzn-single[rel="value_1"].disabled,
.chzn-color.chzn-single[rel="value_1"][disabled],
.chzn-color-reverse.chzn-single[rel="value_0"]:hover,
.chzn-color-reverse.chzn-single[rel="value_0"]:focus,
.chzn-color-reverse.chzn-single[rel="value_0"]:active,
.chzn-color-reverse.chzn-single[rel="value_0"].active,
.chzn-color-reverse.chzn-single[rel="value_0"].disabled,
.chzn-color-reverse.chzn-single[rel="value_0"][disabled],
.chzn-color-state.chzn-single[rel="value_1"]:hover,
.chzn-color-state.chzn-single[rel="value_1"]:focus,
.chzn-color-state.chzn-single[rel="value_1"]:active,
.chzn-color-state.chzn-single[rel="value_1"].active,
.chzn-color-state.chzn-single[rel="value_1"].disabled,
.chzn-color-state.chzn-single[rel="value_1"][disabled],
.chzn-color.chzn-single[rel="value_show_no_link"]:hover,
.chzn-color.chzn-single[rel="value_show_no_link"]:focus,
.chzn-color.chzn-single[rel="value_show_no_link"]:active,
.chzn-color.chzn-single[rel="value_show_no_link"].active,
.chzn-color.chzn-single[rel="value_show_no_link"].disabled,
.chzn-color.chzn-single[rel="value_show_no_link"][disabled],
.chzn-color.chzn-single[rel="value_show_with_link"]:hover,
.chzn-color.chzn-single[rel="value_show_with_link"]:focus,
.chzn-color.chzn-single[rel="value_show_with_link"]:active,
.chzn-color.chzn-single[rel="value_show_with_link"].active,
.chzn-color.chzn-single[rel="value_show_with_link"].disabled,
.chzn-color.chzn-single[rel="value_show_with_link"][disabled] {
	color: #fff;
	background-color: #2f6f2f;
	*background-color: #2f6f2f;
}
.chzn-color.chzn-single[rel="value_1"]:active,
.chzn-color.chzn-single[rel="value_1"].active,
.chzn-color-reverse.chzn-single[rel="value_0"]:active,
.chzn-color-reverse.chzn-single[rel="value_0"].active,
.chzn-color-state.chzn-single[rel="value_1"]:active,
.chzn-color-state.chzn-single[rel="value_1"].active,
.chzn-color.chzn-single[rel="value_show_no_link"]:active,
.chzn-color.chzn-single[rel="value_show_no_link"].active,
.chzn-color.chzn-single[rel="value_show_with_link"]:active,
.chzn-color.chzn-single[rel="value_show_with_link"].active {
	background-color: #46a546;
}
.chzn-color-state.chzn-single[rel="value_0"],
.chzn-color-state.chzn-single[rel="value_-2"] {
	background-color: #bd362f;
	*background-color: #bd362f;
	box-shadow: 0 1px 2px rgba(0,0,0,0.05);
	color: #ffffff;
}
.chzn-color-state.chzn-single[rel="value_0"]:hover,
.chzn-color-state.chzn-single[rel="value_0"]:focus,
.chzn-color-state.chzn-single[rel="value_0"]:active,
.chzn-color-state.chzn-single[rel="value_0"].active,
.chzn-color-state.chzn-single[rel="value_0"].disabled,
.chzn-color-state.chzn-single[rel="value_0"][disabled],
.chzn-color-state.chzn-single[rel="value_-2"]:hover,
.chzn-color-state.chzn-single[rel="value_-2"]:focus,
.chzn-color-state.chzn-single[rel="value_-2"]:active,
.chzn-color-state.chzn-single[rel="value_-2"].active,
.chzn-color-state.chzn-single[rel="value_-2"].disabled,
.chzn-color-state.chzn-single[rel="value_-2"][disabled] {
	color: #fff;
	background-color: #802420;
	*background-color: #802420;
}
.chzn-color-state.chzn-single[rel="value_0"]:active,
.chzn-color-state.chzn-single[rel="value_0"].active,
.chzn-color-state.chzn-single[rel="value_-2"]:active,
.chzn-color-state.chzn-single[rel="value_-2"].active {
	background-color: #bd362f;
}
.CodeMirror {
	height: calc(100vh - 400px);
	min-height: 400px;
	max-height: 800px;
}
.form-horizontal .control-label {
	padding-right: 5px;
	text-align: left;
}
.form-horizontal .control-label .spacer hr {
	width: 380px;
}
@media (max-width: 420px) {
	.form-horizontal .control-label .spacer hr {
		width: 220px;
	}
}
.form-horizontal .field-spacer>.control-label {
	width: auto;
}
.form-horizontal #jform_catid_chzn {
	vertical-align: middle;
}
.form-vertical .control-label > label {
	display: inline-block;
	*display: inline;
	*zoom: 1;
}
.form-vertical .controls {
	margin-left: 0;
}
@media (max-width: 979px) {
	.form-horizontal-desktop .control-label {
		float: none;
		width: auto;
		padding-right: 0;
		padding-top: 0;
		text-align: left;
	}
	.form-horizontal-desktop .control-label > label {
		display: inline-block;
		*display: inline;
		*zoom: 1;
	}
	.form-horizontal-desktop .controls {
		margin-left: 0;
	}
}
@media (max-width: 1199px) {
	.row-fluid .row-fluid .form-horizontal-desktop .control-label {
		float: none;
		width: auto;
		padding-right: 0;
		padding-top: 0;
		text-align: left;
	}
	.row-fluid .row-fluid .form-horizontal-desktop .control-label > label {
		display: inline-block;
		*display: inline;
		*zoom: 1;
	}
	.row-fluid .row-fluid .form-horizontal-desktop .controls {
		margin-left: 0;
	}
}
.form-inline-header {
	margin: 5px 0;
}
.form-inline-header .control-group,
.form-inline-header .control-label,
.form-inline-header .controls {
	display: inline-block;
	*display: inline;
	*zoom: 1;
}
.form-inline-header .control-label {
	width: auto;
	padding-right: 10px;
}
.form-inline-header .controls {
	padding-right: 20px;
}
fieldset[class^="form-"] {
	min-width: 100%;
}
@-moz-document url-prefix() {
	fieldset[class^="form-"] {
		display: table-cell;
	}
}
fieldset.checkboxes input {
	float: left;
}
fieldset.checkboxes li {
	list-style: none;
}
.control-group,
.controls,
.controls input[type="text"],
.controls input[type="number"],
.controls input[type="email"],
.controls select,
.controls textarea {
	max-width: 100%;
}
.controls .btn-group > .btn {
	min-width: 50px;
	margin-left: -1px;
}
.controls .btn-group.btn-group-yesno {
	width: 220px;
	max-width: 100%;
}
.controls .btn-group.btn-group-yesno > .btn {
	width: 50%;
	min-width: 40px;
	padding: 2px 0;
}
input.input-large-text {
	font-size: 18px;
	line-height: 22px;
	height: auto;
}
textarea {
	resize: both;
}
textarea.vert {
	resize: vertical;
}
textarea.noResize {
	resize: none;
}
.subform-repeatable {
	padding-right: 10px;
}
.subform-repeatable > .btn-toolbar {
	margin: 0;
}
.subform-repeatable > .btn-toolbar .group-add {
	line-height: 26px;
	width: 56px;
	font-size: 13px;
	margin-left: 28px;
}
.subform-repeatable-group {
	margin-top: 20px;
	margin-left: 28px;
	border: 1px solid #ccc;
	padding: 8px 25px 15px;
	position: relative;
	border-radius: 3px;
}
.subform-repeatable-group > .btn-toolbar {
	margin: 0;
}
.subform-repeatable-group > .btn-toolbar .btn-group {
	margin-right: 0px;
	margin-top: -1px;
	position: static;
}
.subform-repeatable-group > .btn-toolbar .btn {
	font-size: 13px;
	line-height: 26px;
	background-color: #F3F3F3;
	position: absolute;
}
.subform-repeatable-group > .btn-toolbar .btn span {
	vertical-align: middle;
	line-height: 11px;
}
.subform-repeatable-group > .btn-toolbar .btn.btn-success {
	color: #378137;
	bottom: 0;
	right: 0;
	border-radius: 3px 0 0 0;
	border-width: 1px 0 0 1px;
	padding-top: 1px;
}
.subform-repeatable-group > .btn-toolbar .btn.btn-success .icon-plus:before {
	content: "]";
}
.subform-repeatable-group > .btn-toolbar .btn.btn-danger {
	color: #942a25;
	top: 0;
	right: 0;
	border-radius: 0 0 0 3px;
	border-width: 0 0 1px 1px;
}
.subform-repeatable-group > .btn-toolbar .btn.btn-danger .icon-minus:before {
	content: "I";
}
.subform-repeatable-group > .btn-toolbar .btn.btn-primary {
	color: #24748c;
	color: #333;
	right: 100%;
	top: 50%;
	margin-top: -27px;
	margin-right: 1px;
	border-radius: 3px 0 0 3px;
	border-width: 1px 0 1px 1px;
	line-height: 52px;
}
.subform-repeatable-group > .btn-toolbar .btn.btn-primary .icon-move:before {
	content: "Z";
}
.subform-repeatable-group > .btn-toolbar .btn [class^="icon-"],
.subform-repeatable-group > .btn-toolbar .btn [class*=" icon-"] {
	margin: 0;
}
.subform-repeatable-group > .btn-toolbar .btn:hover {
	background-color: #E6E6E6;
}
.subform-repeatable-group .control-group:last-of-type {
	margin-bottom: 10px;
}
@media (max-width: 979px) {
	.subform-repeatable-group > .btn-toolbar .btn-group {
		margin-bottom: 10px;
	}
}
.subform-table-layout .control-group {
	margin-bottom: 10px;
}
.subform-table-layout .control-group:last-of-type {
	margin-bottom: 0;
}
.subform-table-layout .controls {
	padding-right: 20px;
}
.subform-table-layout input {
	width: 100%;
	max-width: 206px;
}
.subform-table-layout table .btn-group {
	margin: 0 7px;
}
@media (max-width: 1024px) {
	.subform-table-layout .subform-repeatable {
		padding-right: 0;
	}
	.subform-table-layout .subform-repeatable tbody td:last-of-type {
		text-align: right;
		padding-bottom: 15px;
	}
	.subform-table-layout table,
	.subform-table-layout thead,
	.subform-table-layout tbody,
	.subform-table-layout th,
	.subform-table-layout td,
	.subform-table-layout tr {
		display: block;
	}
	.subform-table-layout table {
		border: 1px solid #ddd;
	}
	.subform-table-layout thead th {
		position: absolute;
		top: -9999px;
		left: -9999px;
	}
	.subform-table-layout thead th:last-of-type {
		position: static;
		width: 100% !important;
		text-align: right;
		box-sizing: border-box;
		border-left: 0;
	}
	.subform-table-layout tr {
		margin: 0;
		padding: 0;
		border: 0;
	}
	.subform-table-layout td {
		border: none;
		position: relative;
		padding-left: 50%;
	}
	.subform-table-layout tbody td:first-of-type {
		padding-top: 15px;
		border-top: 1px solid #ddd;
	}
	.subform-table-layout tbody td:first-of-type:before {
		top: 18px;
	}
	.subform-table-layout td:before {
		content: attr(data-column);
		position: absolute;
		top: 13px;
		left: 10px;
		padding-right: 10px;
	}
}
.controls > .radio:first-child,
.controls > .checkbox:first-child {
	padding-top: 0;
}
.form-horizontal .controls > .radio:first-child,
.form-horizontal .controls > .checkbox:first-child {
	padding-top: 5px;
}
.form-horizontal .controls > .radio.btn-group:first-child {
	padding-top: 0;
}
.form-horizontal .controls > .radio.btn-group-yesno:first-child {
	padding-top: 2px;
}
input.field-media-input {
	width: auto;
}
.header {
	background-color: #1a3867;
	border-top: 1px solid rgba(255,255,255,0.2);
	padding: 8px 25px;
}
@media (max-width: 767px) {
	.header {
		padding: 4px 18px;
		margin-left: -20px;
		margin-right: -20px;
	}
}
.header .navbar-search {
	margin-top: 0;
}
@media (max-width: 979px) {
	.header .navbar-search {
		border-top: 0;
		border-bottom: 0;
		-webkit-box-shadow: none;
		-moz-box-shadow: none;
		box-shadow: none;
	}
}
.container-logo {
	float: right;
	text-align: right;
}
.logo {
	width: auto;
	max-width: 100%;
	max-height: 36px;
	height: auto;
}
.page-title {
	color: white;
	font-weight: normal;
	font-size: 20px;
	line-height: 36px;
	margin: 0;
}
.page-title [class^="icon-"],
.page-title [class*=" icon-"] {
	margin-right: 16px;
}
@media (max-width: 767px) {
	.container-logo {
		display: none;
	}
	.page-title {
		font-size: 18px;
		line-height: 28px;
	}
	.page-title [class^="icon-"],
	.page-title [class*=" icon-"] {
		margin-right: 10px;
	}
}
.view-login {
	background-color: #17568c;
	padding-top: 0;
}
.view-login .container {
	width: 300px;
	position: absolute;
	top: 50%;
	left: 50%;
	margin-top: -206px;
	margin-left: -150px;
}
.view-login .navbar-fixed-bottom {
	padding-left: 20px;
	padding-right: 20px;
	text-align: center;
}
.view-login .navbar-fixed-bottom,
.view-login .navbar-fixed-bottom a {
	color: #FCFCFC;
}
.view-login .navbar-inverse.navbar-fixed-bottom,
.view-login .navbar-inverse.navbar-fixed-bottom a {
	color: #555;
}
.view-login .well {
	padding-bottom: 0;
}
.view-login .login-joomla {
	position: absolute;
	left: 50%;
	height: 24px;
	width: 24px;
	margin-left: -12px;
	font-size: 22px;
}
.view-login .navbar-fixed-bottom {
	position: absolute;
}
.view-login .input-medium {
	width: 176px;
}
.view-login #lang_chzn {
	width: 233px !important;
	max-width: none;
}
.view-login #lang_chzn .chzn-single div {
	width: 43px;
}
.view-login .input-prepend .add-on,
.view-login .controls .btn-group > .btn {
	margin-left: 0;
}
.navbar-inverse {
	color: #333;
}
.login .btn-large {
	margin-top: 15px;
}
.login .form-inline .btn-group {
	display: block;
}
@media (max-width: 479px) {
	.login .chzn-single {
		width: 222px !important;
	}
	.login .chzn-container,
	.login .chzn-drop {
		width: 230px !important;
	}
}
@media (max-width: 319px) {
	.view-login .navbar-fixed-bottom {
		display: none;
	}
}
.ventral-space {
	margin-bottom: 5px;
}
ul.manager .height-50 .icon-folder-2 {
	height: 35px;
	width: 35px;
	line-height: 35px;
	font-size: 30px;
}
#imageForm .well {
	margin-bottom: 5px;
}
.thumbnails-media .thumbnail {
	background-color: #f4f4f4;
	border-radius: 3px;
	border: 0;
	box-shadow: 0 0 0 1px rgba(0,0,0,0.05) inset;
	padding: 0px;
	height: 100px;
	width: 100px;
	margin: 8px;
	position: relative;
	text-align: center;
	overflow: hidden;
}
.thumbnails-media .thumbnail .close {
	background-color: #ccc;
	border-left: 1px solid rgba(0,0,0,0.1);
	height: 22px;
	line-height: 22px;
	opacity: 0.3;
	text-align: center;
	width: 22px;
	top: 0;
	right: 0;
}
.thumbnails-media .thumbnail .close:hover {
	background-color: #bbb;
}
.thumbnails-media .thumbnail *,
.thumbnails-media .thumbnail *:before {
	-webkit-transition: all 0.2s ease;
	transition: all 0.2s ease;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}
.thumbnails-media .thumbnail input[type="radio"],
.thumbnails-media .thumbnail input[type="checkbox"] {
	margin: 0;
	opacity: 0.55;
	position: absolute;
	top: 5px;
	left: 5px;
}
.thumbnails-media .thumbnail .controls,
.thumbnails-media .thumbnail .imginfoBorder {
	display: none;
}
.thumbnails-media .imgThumb {
	position: relative;
	z-index: 1;
	width: 100%;
	display: inline-block;
}
.thumbnails-media .imgThumb input {
	display: none;
}
.thumbnails-media .imgThumb label,
.thumbnails-media .imgThumb .imgThumbInside {
	display: block;
	line-height: 100px;
	position: relative;
	width: 100%;
	border-radius: 3px;
	overflow: hidden;
}
.thumbnails-media .imgThumb label:before,
.thumbnails-media .imgThumb .imgThumbInside:before {
	font-family: "IcoMoon";
	font-style: normal;
	content: 'G';
	position: absolute;
	top: 0;
	right: 0;
	background-color: #46a546;
	color: #fff;
	line-height: 26px;
	width: 26px;
	-webkit-transform: scale(0.5);
	transform: scale(0.5);
	opacity: 0;
	border-color: rgba(0,0,0,0.2);
	box-shadow: 0 1px 2px rgba(0,0,0,0.05);
	border-radius: 0 3px;
}
.thumbnails-media .imgThumb img {
	width: auto;
}
.thumbnails-media .selected :checked + label,
.thumbnails-media .selected .imgThumbInside,
.thumbnails-media .imgInput :checked + label,
.thumbnails-media .imgInput .imgThumbInside {
	background-color: #ddd;
}
.thumbnails-media .selected :checked + label:before,
.thumbnails-media .selected .imgThumbInside:before,
.thumbnails-media .imgInput :checked + label:before,
.thumbnails-media .imgInput .imgThumbInside:before {
	-webkit-transform: scale(1);
	transform: scale(1);
	opacity: 1;
}
.thumbnails-media .selected :checked + label:after,
.thumbnails-media .selected .imgThumbInside:after,
.thumbnails-media .imgInput :checked + label:after,
.thumbnails-media .imgInput .imgThumbInside:after {
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	content: '';
	border: 3px solid #46a546;
	border-radius: 5px;
}
.thumbnails-media .imgDelete a.close,
.thumbnails-media .imgPreview a {
	padding: 0;
	position: absolute;
	left: 0;
	z-index: 1;
	height: 26px;
	width: 26px;
}
.thumbnails-media .imgPreview a {
	width: 100%;
}
.thumbnails-media .imgDelete a.close {
	background-color: #bd362f;
	border-color: #bd362f rgba(0,0,0,0.2) rgba(0,0,0,0.2) #bd362f;
	top: 0;
	line-height: 28px;
	font-size: 12px;
	padding-left: 1px;
	color: #fff;
	border-bottom-right-radius: 3px;
	border-top-left-radius: 3px;
	z-index: 10;
	opacity: 0;
	-webkit-transform: scale(0.5);
	transform: scale(0.5);
}
.thumbnails-media .imgDelete a.close:hover {
	background-color: #802420;
}
.thumbnails-media .thumbnail:hover .imgDelete a.close {
	opacity: 1;
	-webkit-transform: scale(1);
	transform: scale(1);
}
.thumbnails-media .imgPreview a,
.thumbnails-media .imgDetails {
	position: absolute;
	left: 0;
	text-align: left;
	background-color: #fff;
	border-color: rgba(0,0,0,0.2);
	bottom: 0;
	line-height: 26px;
	border: 1px solid rgba(0,0,0,0.1);
	border-width: 1px;
	border-radius: 0 3px 0 0;
	z-index: 1;
}
.thumbnails-media .imgPreview a:hover,
.thumbnails-media .imgDetails:hover {
	background-color: #eee;
}
.thumbnails-media .imgDetails {
	padding: 0 5px;
	line-height: 20px;
	color: #555;
}
.thumbnails-media .imgFolder span {
	line-height: 90px;
	font-size: 38px;
	margin: 0;
	width: auto;
}
.thumbnails-media .imgFolder + .imgDetails {
	color: inherit;
}
.com_media .media a + a {
	margin-left: -1px;
}
.com_media .tree-holder {
	padding: 0 15px;
}
#folderframe.thumbnail {
	border: 0;
	box-shadow: none;
	padding: 0;
}
#mediamanager-form {
	margin: 0 -10px;
	overflow-x: hidden;
}
#mediamanager-form > .muted {
	padding: 0px;
}
#mediamanager-form .checkbox {
	padding-left: 30px;
	margin-bottom: 15px;
}
#mediamanager-form .checkbox input {
	margin-top: 3px;
}
#mediamanager-form .thumbnails {
	margin: 0 -8px;
	overflow-x: hidden;
}
#mediamanager-form .thumbnails .thumbnail {
	height: 120px;
	width: 120px;
	margin: 8px;
}
#mediamanager-form .thumbnails .imgThumb label,
#mediamanager-form .thumbnails .imgTotal {
	line-height: 120px;
}
#mediamanager-form .icon-search::before {
	padding-right: 5px;
	padding-left: 1px;
}
#mediamanager-form .height-50 {
	background-color: #fafafa;
	height: 77px;
	position: relative;
	z-index: 1;
	width: 100%;
	display: inline-block;
}
#mediamanager-form .height-50 a,
#mediamanager-form .height-50 .icon-folder-2 {
	display: inline-block;
	line-height: 75px;
	margin-top: -1px;
}
#mediamanager-form .height-50 a:after {
	bottom: 0;
	box-shadow: 0 0 0 1px rgba(0,0,0,0.08) inset;
	content: "";
	display: block;
	left: 0;
	overflow: hidden;
	position: absolute;
	right: 0;
	top: 0;
}
#mediamanager-form .height-50 .icon-folder-2 {
	font-size: 40px;
}
.uploadform {
	margin-top: 20px;
}
body.modal-open {
	-ms-overflow-style: none;
}
.modal-header {
	padding: 0 20px;
	text-align: left;
}
.modal-header h3 {
	font-weight: normal;
	line-height: 50px;
}
.modal-header .close {
	width: 50px;
	margin-top: 0;
	margin-right: -15px;
	font-size: 2rem;
	line-height: 50px;
	border-left: 1px solid #ccc;
}
.modal-body {
	padding: 0;
	width: 100%;
	height: auto;
	max-height: none;
}
.modal-body .container-fluid {
	padding-top: 15px;
	padding-bottom: 15px;
}
.modal-footer {
	clear: both;
}
.contentpane {
	padding: 10px;
	height: auto;
}
@media (min-width: 768px) {
	.row-fluid .modal-batch [class*="span"] {
		margin-left: 0;
	}
}
.container-popup {
	padding: 10px;
}
.field-media-wrapper iframe {
	max-height: 75vh;
}
body .navbar,
body .navbar-fixed-top {
	margin-bottom: 0;
}
.navbar-inner {
	min-height: 0;
	background: #f2f2f2;
	background-image: none;
	filter: none;
}
.navbar-inner .container-fluid {
	padding-left: 10px;
	padding-right: 10px;
	font-size: 15px;
}
.navbar-inverse .navbar-inner {
	background: #10223e;
	background-image: none;
	filter: none;
}
.navbar .navbar-text {
	line-height: 30px;
}
.navbar .admin-logo {
	float: left;
	padding: 7px 12px 0px 15px;
	font-size: 16px;
	color: #555;
}
.navbar .admin-logo:hover {
	color: #333;
}
.navbar-inverse.navbar .admin-logo {
	color: #d9d9d9;
}
.navbar-inverse.navbar .admin-logo:hover {
	color: #ffffff;
}
.navbar .brand {
	float: right;
	display: block;
	padding: 6px 10px;
	margin-left: -20px;
	font-size: inherit;
	font-weight: normal;
}
.navbar .brand:hover,
.navbar .brand:focus {
	text-decoration: none;
}
.navbar .nav > li > a {
	padding: 6px 10px;
}
.navbar .nav > li > a:hover {
	color: white;
}
.navbar .nav > li > a:hover span.carot {
	border-bottom-color: #fff;
	border-top-color: #fff;
}
.navbar .dropdown-menu,
.navbar .nav-user {
	font-size: 13px;
}
.navbar .nav-user .dropdown-menu li span {
	padding-left: 10px;
}
.navbar .nav > li ul {
	overflow-y: auto;
	overflow-x: hidden;
	-webkit-overflow-scrolling: touch;
	-moz-overflow-scrolling: touch;
	-ms-overflow-scrolling: touch;
	-o-overflow-scrolling: touch;
	overflow-scrolling: touch;
	height: auto;
	max-height: 500px;
	margin: 0;
}
.navbar .nav > li ul::-webkit-scrollbar {
	-webkit-appearance: none;
	width: 7px;
}
.navbar .nav > li ul::-webkit-scrollbar-thumb {
	border-radius: 4px;
	background-color: rgba(0,0,0,0.5);
	-webkit-box-shadow: 0 0 1px rgba(255,255,255,0.5);
}
.navbar .nav > li > .dropdown-menu:after {
	display: none;
}
.navbar .nav > .dropdown.open:after {
	content: '';
	display: inline-block;
	border-left: 6px solid transparent;
	border-right: 6px solid transparent;
	border-bottom: 6px solid #fff;
	position: absolute;
	top: 25px;
	left: 10px;
	z-index: 1001;
}
.navbar .empty-nav {
	display: none;
}
.navbar-fixed-top .navbar-inner,
.navbar-static-top .navbar-inner {
	-webkit-box-shadow: none;
	-moz-box-shadow: none;
	box-shadow: none;
}
.dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus,
.dropdown-submenu:hover > a,
.dropdown-submenu:focus > a {
	background-image: none;
}
.navbar-fixed-bottom {
	bottom: 0;
}
.navbar-fixed-bottom .navbar-inner {
	-webkit-box-shadow: none;
	-moz-box-shadow: none;
	box-shadow: none;
}
.navbar .btn-navbar {
	background: #17568c;
	border: 1px solid #0D2242;
	margin-bottom: 2px;
}
@media (max-width: 767px) {
	.navbar .admin-logo {
		margin-left: 10px;
		padding: 9px 9px 0 9px;
	}
}
.navbar-search .search-query {
	background: rgba(255,255,255,0.3);
}
@media (max-width: 979px) {
	.navbar .nav {
		font-size: 13px;
		margin: 0 2px 0 0;
	}
	.navbar .nav > li > a {
		padding: 6px;
	}
}
@media (max-width: 767px) {
	.navbar-search.pull-right {
		float: none;
		text-align: center;
	}
}
@media (max-width: 738px) {
	.navbar .brand {
		font-size: 16px;
	}
}
.nav-collapse .nav li a,
.dropdown-menu a {
	background-image: none;
}
.nav-collapse .dropdown-menu > li img {
	max-width: none;
}
@media (max-width: 767px) {
	.navbar-fixed-top .navbar-inner,
	.navbar-fixed-top .navbar-inner .container-fluid {
		padding: 0;
	}
	.navbar .brand {
		margin-top: 2px;
		float: none;
		text-align: center;
	}
	.navbar .btn-navbar {
		margin-top: 3px;
		margin-right: 3px;
		margin-bottom: 3px;
	}
	.nav-collapse .nav .nav-header {
		color: #fff;
	}
	.nav-collapse .nav,
	.navbar .nav-collapse .nav.pull-right {
		margin: 0;
	}
	.nav-collapse .dropdown-menu {
		margin: 0;
	}
	.nav-collapse .dropdown-menu > li > span {
		display: block;
		padding: 4px 15px;
	}
	.navbar-inverse .nav-collapse .dropdown-menu > li > span {
		color: #d9d9d9;
	}
	.nav-collapse .nav > li > a.dropdown-toggle {
		background-color: rgba(255,255,255,0.07);
		font-size: 12px;
		font-weight: bold;
		color: #eee;
		text-transform: uppercase;
		padding-left: 15px;
	}
	.nav-collapse .nav li a {
		margin-bottom: 0;
		border-top: 1px solid rgba(255,255,255,0.25);
		border-bottom: 1px solid rgba(0,0,0,0.5);
	}
	.nav-collapse .nav li ul li ul.dropdown-menu,
	.nav-collapse .nav li ul li:hover ul.dropdown-menu,
	.nav-collapse .caret {
		display: none !important;
	}
	.nav-collapse .nav > li > a,
	.nav-collapse .dropdown-menu a {
		font-size: 15px;
		font-weight: normal;
		color: #fff;
		-webkit-border-radius: 0;
		-moz-border-radius: 0;
		border-radius: 0;
	}
	.navbar .nav-collapse .nav > li > .dropdown-menu::before,
	.navbar .nav-collapse .nav > li > .dropdown-menu::after,
	.navbar .nav-collapse .dropdown-submenu > a::after {
		display: none;
	}
	.nav-collapse .dropdown-menu li + li a {
		margin-bottom: 0;
	}
}
.quick-icons {
	font-size: 14px;
	margin-bottom: 20px;
}
.quick-icons .nav-header {
	margin: 12px 0 5px;
	font-size: 13px;
}
.quick-icons .nav-header:first-child {
	margin: 0 0 5px;
}
.quick-icons [class^="icon-"],
.quick-icons [class*=" icon-"] {
	margin-right: 9px;
}
.quick-icons [class^="icon-"]:before,
.quick-icons [class*=" icon-"]:before {
	font-size: 16px;
	margin-bottom: 20px;
	line-height: 18px;
}
html[dir=rtl] .quick-icons .nav-list [class^="icon-"],
html[dir=rtl] .quick-icons .nav-list [class*=" icon-"] {
	margin-left: 9px;
	margin-right: 0;
}
.sidebar-nav .nav-list {
	padding-left: 25px;
	padding-right: 25px;
}
.sidebar-nav .nav-list > li > a {
	color: #555;
	padding: 3px 25px;
	margin-left: -26px;
	margin-right: -26px;
}
.sidebar-nav .nav-list > li.active > a {
	color: #fff;
	margin-right: -26px;
}
.sidebar-nav .nav-list > li > a:focus,
.sidebar-nav .nav-list > li > a:hover {
	text-decoration: none;
	color: #fff;
	background-color: #2d6ca2;
	text-shadow: none;
}
.j-sidebar-container {
	position: absolute;
	display: block;
	left: -16.5%;
	width: 16.5%;
	margin: -18px 0 0 -1px;
	padding-top: 28px;
	padding-bottom: 40px;
	clear: both;
	background-color: #F0F0F0;
	border-bottom: 1px solid #dedede;
	border-right: 1px solid #dedede;
	-webkit-border-radius: 0 0 3px 0;
	-moz-border-radius: 0 0 3px 0;
	border-radius: 0 0 3px 0;
}
.j-sidebar-container.j-sidebar-hidden {
	left: -16.5%;
}
.j-sidebar-container.j-sidebar-visible {
	left: 0;
}
.j-sidebar-container .filter-select {
	padding: 0 14px;
}
.j-toggle-sidebar-header h3 {
	font-weight: normal;
	padding: 0 15px;
}
.j-toggle-button-wrapper {
	position: absolute;
	display: block;
	top: 7px;
	padding: 0;
}
.j-toggle-button-wrapper.j-toggle-hidden {
	right: -24px;
}
.j-toggle-button-wrapper.j-toggle-visible {
	right: 7px;
}
.j-toggle-sidebar-button {
	font-size: 16px;
	color: #3071a9;
	text-decoration: none;
	cursor: pointer;
}
.j-toggle-sidebar-button:hover {
	color: #1f496e;
}
#system-message-container,
#j-main-container {
	padding: 0 0 0 5px;
	min-height: 0;
}
#system-message-container.j-toggle-main,
#j-main-container.j-toggle-main,
#system-debug.j-toggle-main {
	float: right;
}
@media (min-width: 768px) {
	.j-toggle-transition {
		-webkit-transition: all 0.3s ease;
		-moz-transition: all 0.3s ease;
		-o-transition: all 0.3s ease;
		transition: all 0.3s ease;
	}
}
@media (max-width: 979px) {
	.j-toggle-button-wrapper.j-toggle-hidden {
		right: -20px;
	}
}
@media (max-width: 767px) {
	.j-sidebar-container {
		position: relative;
		width: 100%;
		margin: 0 0 20px 0;
		padding: 0;
		background: transparent;
		border-right: 0;
		border-bottom: 0;
	}
	.j-sidebar-container.j-sidebar-hidden {
		margin-left: 16.5%;
	}
	.j-sidebar-container.j-sidebar-visible {
		margin-left: 0;
	}
	.j-toggle-sidebar-header,
	.j-toggle-button-wrapper {
		display: none;
	}
	.view-login select {
		width: 232px;
	}
}
@media (max-width: 420px) {
	.j-sidebar-container {
		margin: 0;
	}
	.view-login .input-medium {
		width: 180px;
	}
	.view-login select {
		width: 232px;
	}
}
#status {
	background: #ebebeb;
	border-top: 1px solid #dedede;
	padding: 4px 10px;
	-webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.08);
	-moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.08);
	box-shadow: 0 0 3px rgba(0, 0, 0, 0.08);
	color: #626262;
}
#status .btn-group {
	margin: 0;
}
#status .btn-group.separator:after {
	content: ' ';
	display: block;
	float: left;
	background: #ADADAD;
	margin: 0 10px;
	height: 15px;
	width: 1px;
}
#status .btn-toolbar,
#status p {
	margin: 0px;
}
#status .btn-toolbar,
#status .btn-group {
	font-size: 12px;
}
#status a {
	color: #626262;
}
#status .badge {
	margin-right: .25em;
}
#status.status-top {
	background: #1a3867;
	-webkit-box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.2) inset, 0px -1px 0px rgba(0, 0, 0, 0.3) inset, 0px -1px 0px rgba(0, 0, 0, 0.3);
	-moz-box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.2) inset, 0px -1px 0px rgba(0, 0, 0, 0.3) inset, 0px -1px 0px rgba(0, 0, 0, 0.3);
	box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.2) inset, 0px -1px 0px rgba(0, 0, 0, 0.3) inset, 0px -1px 0px rgba(0, 0, 0, 0.3);
	border-top: 0;
	color: #d9d9d9;
	padding: 2px 20px 6px 20px;
}
#status.status-top a {
	color: #d9d9d9;
}
@media (max-width: 479px) {
	.pagination a {
		padding: 5px;
	}
	.btn-group.divider,
	.header .row-fluid .span3,
	.header .row-fluid .span7 {
		display: none;
	}
	.navbar .btn {
		margin: 0;
	}
	.btn-subhead {
		display: block;
		margin: 10px 0;
	}
	.subhead-collapse.collapse {
		height: 0;
		overflow: hidden;
	}
	.btn-toolbar .btn-wrapper {
		display: block;
		margin: 0px 10px 5px 10px;
	}
	.btn-toolbar .btn-wrapper .btn {
		width: 100% !important;
	}
	.subhead {
		background: none repeat scroll 0 0 transparent;
		border-bottom: 0 solid #dedede;
	}
	.btn-group + .btn-group {
		margin-left: 10px;
	}
	.login .chzn-single {
		width: 222px !important;
	}
	.login .chzn-container,
	.login .chzn-drop {
		width: 230px !important;
	}
	#toolbar [class^="icon-"],
	#toolbar [class*=" icon-"] {
		background-color: transparent;
		border-right: medium none;
		width: 10px;
	}
}
table label {
	margin: 0;
}
td.has-context {
	height: 23px;
}
td.nowrap.has-context {
	width: 45%;
}
.subhead {
	background: #F0F0F0;
	border-bottom: 1px solid #dedede;
	color: #0C192E;
	text-shadow: 0 1px 0 #FFF;
	margin-bottom: 10px;
	min-height: 51px;
}
.subhead-collapse {
	margin-bottom: 19px;
}
.subhead-collapse.collapse {
	height: auto;
	overflow: visible;
}
.btn-toolbar {
	margin-bottom: 5px;
}
.btn-toolbar .btn-wrapper {
	display: inline-block;
	margin: 0 0 8px 5px;
}
.subhead-fixed {
	position: fixed;
	width: 100%;
	top: 30px;
	z-index: 100;
}
@media (max-width: 767px) {
	body {
		-webkit-overflow-scrolling: touch;
	}
	.subhead {
		margin-left: -20px;
		margin-right: -20px;
		padding-left: 10px;
		padding-right: 10px;
	}
}
.subhead h1 {
	font-size: 17px;
	font-weight: normal;
	margin-left: 10px;
	margin-top: 6px;
}
#toolbar {
	margin-bottom: 2px;
	margin-top: 12px;
}
#toolbar .btn {
	line-height: 24px;
	margin-right: 4px;
	padding: 0 10px;
}
#toolbar .btn-success {
	min-width: 148px;
}
#toolbar .btn-primary [class^="icon-"],
#toolbar .btn-primary [class*=" icon-"],
#toolbar .btn-warning [class^="icon-"],
#toolbar .btn-warning [class*=" icon-"],
#toolbar .btn-danger [class^="icon-"],
#toolbar .btn-danger [class*=" icon-"],
#toolbar .btn-success [class^="icon-"],
#toolbar .btn-success [class*=" icon-"],
#toolbar .btn-info [class^="icon-"],
#toolbar .btn-info [class*=" icon-"],
#toolbar .btn-inverse [class^="icon-"],
#toolbar .btn-inverse [class*=" icon-"] {
	background-color: transparent;
	border-right: 0;
	border-left: 0;
	width: 16px;
	margin-left: 0;
	margin-right: 0;
}
#toolbar #toolbar-options,
#toolbar #toolbar-help {
	float: right;
}
#toolbar [class^="icon-"],
#toolbar [class*=" icon-"] {
	background-color: #e6e6e6;
	border-radius: 3px 0 0 3px;
	border-right: 1px solid #b3b3b3;
	height: auto;
	line-height: inherit;
	margin: 0 6px 0 -10px;
	opacity: 1;
	text-shadow: none;
	width: 28px;
	z-index: -1;
}
#toolbar iframe .btn-group .btn {
	margin-left: -1px !important;
}
html[dir=rtl] #toolbar #toolbar-options,
html[dir=rtl] #toolbar #toolbar-help {
	float: left;
}
@media (max-width: 767px) {
	.subhead-fixed {
		position: static;
		width: auto;
	}
}
.btn-subhead {
	display: none;
}
@media (min-width: 480px) {
	#filter-bar {
		height: 29px;
	}
}
@media (max-width: 479px) {
	.navbar .btn {
		margin: 0;
	}
	.btn-subhead {
		display: block;
		margin: 10px 0;
	}
	.subhead-collapse.collapse {
		height: 0;
		overflow: hidden;
	}
	.btn-toolbar .btn-wrapper {
		display: block;
		margin: 0px 10px 5px 10px;
	}
	.btn-toolbar .btn-wrapper .btn {
		width: 100% !important;
	}
	.subhead {
		background: none repeat scroll 0 0 transparent;
		border-bottom: 0 solid #dedede;
	}
	#toolbar [class^="icon-"],
	#toolbar [class*=" icon-"] {
		background-color: transparent;
		border-right: medium none;
		width: 10px;
	}
}
@media (max-width: 319px) {
	.view-login .navbar-fixed-bottom {
		display: none;
	}
}
ul.treeselect,
ul.treeselect li {
	margin: 0;
	padding: 0;
}
ul.treeselect {
	margin-top: 8px;
}
ul.treeselect li {
	padding: 2px 10px 2px;
	list-style: none;
}
ul.treeselect i.treeselect-toggle {
	line-height: 18px;
}
ul.treeselect label {
	font-size: 1em;
	margin-left: 8px;
}
ul.treeselect label.nav-header {
	padding: 0;
}
ul.treeselect input {
	margin: 2px 0 0 8px;
}
ul.treeselect .treeselect-menu {
	margin: 0 6px;
}
ul.treeselect ul.dropdown-menu {
	margin: 0;
}
ul.treeselect ul.dropdown-menu li {
	padding: 0 5px;
	border: none;
}
.tree-holder .folder-url,
.tree-holder .file {
	position: relative;
	background-color: #fefefe;
	margin-bottom: 4px;
	padding: 0 10px;
	line-height: 32px;
	border: 1px solid rgba(0,0,0,0.08);
}
.tree-holder .folder-url,
.tree-holder .folder-url:hover,
.tree-holder .folder-url:focus {
	font-weight: bold;
	background-color: #f5f5f5;
	color: #3071a9;
}
.tree-holder .active {
	background-color: #3071a9;
	color: #fff;
	box-shadow: -3px 0 0 #36a2ff !important;
}
.tree-holder .active.folder-url {
	background-color: #f5f5f5;
	color: #3071a9;
}
.tree-holder .active.file:hover {
	background-color: #3071a9;
}
.tree-holder ul ul {
	box-shadow: -3px 0 0 rgba(0,0,0,0.08);
	padding-right: 0;
}
.tree-holder ul ul .folder-url,
.tree-holder ul ul .file {
	box-shadow: -3px 0 0 #3071a9;
	border-left: 0;
}
.break-word {
	word-break: break-all;
	word-wrap: break-word;
}
.disabled {
	cursor: default;
	background-image: none;
	opacity: 0.65;
	filter: alpha(opacity=65);
	-webkit-box-shadow: none;
	-moz-box-shadow: none;
	box-shadow: none;
}
.j-links-separator {
	margin: 20px 0px;
	width: 100%;
	height: 0px;
	border-top: 2px solid #DDDDDD;
}
.container-main,
#system-debug {
	padding-bottom: 50px;
}
.pagination-toolbar {
	margin: 0;
}
.pagination-toolbar a {
	line-height: 26px;
}
.pull-right > .dropdown-menu,
.dropdown-reverse {
	left: auto;
	right: 0;
}
.nav-filters hr {
	margin: 5px 0;
}
#assignment.tab-pane {
	min-height: 500px;
}
@media (max-width: 979px) {
	.container-fluid {
		padding-left: 10px;
		padding-right: 10px;
	}
}
@media (min-width: 768px) {
	body {
		padding-top: 30px;
	}
	.nav-collapse.collapse.in {
		height: auto !important;
	}
}
@media (max-width: 767px) {
	.container-fluid {
		padding-left: 0;
		padding-right: 0;
	}
}
@media (max-width: 479px) {
	.pagination a {
		padding: 5px;
	}
	.btn-group.divider,
	.header .row-fluid .span3,
	.header .row-fluid .span7 {
		display: none;
	}
	.btn-group + .btn-group {
		margin-left: 10px;
	}
}
.info-labels {
	margin-top: -5px;
	margin-bottom: 10px;
}
.sortable-handler.inactive {
	opacity: 0.3;
	filter: alpha(opacity=30);
}
.alert-joomlaupdate {
	text-align: center;
}
.alert-joomlaupdate button {
	vertical-align: baseline;
}
.j-jed-message {
	line-height: 2em;
	color: #333333;
}
.moor-box {
	z-index: 3;
}
.admin .chzn-container .chzn-drop {
	z-index: 1060;
}
.item-associations {
	margin: 0;
}
.item-associations li {
	list-style: none;
	display: inline-block;
	margin: 0 0 3px 0;
}
.item-associations li a {
	color: #ffffff;
}
#flag img {
	padding-top: 6px;
	vertical-align: top;
}
.tooltip {
	max-width: 400px;
}
.tooltip-inner {
	max-width: none;
	text-align: left;
	text-shadow: none;
}
th .tooltip-inner {
	font-weight: normal;
}
.tooltip.hasimage {
	opacity: 1;
}
#permissions-sliders .chzn-container {
	margin-top: -5px;
	position: absolute;
}
#permissions-sliders .table td {
	padding: 8px 8px 9px;
}
.img-preview > img {
	max-height: 100%;
}
.alert-no-items {
	margin-top: 20px;
}
@media (max-width: 767px) {
	html[dir=rtl] #toolbar #toolbar-options,
	html[dir=rtl] #toolbar #toolbar-help,
	#toolbar #toolbar-options,
	#toolbar #toolbar-help {
		float: none;
	}
}
#permissions-sliders .input-small {
	width: 120px;
}
.editor {
	overflow: hidden;
	position: relative;
}
.editor textarea.mce_editable {
	box-sizing: border-box;
}
a.grid_false {
	display: inline-block;
	height: 16px;
	width: 16px;
	background-image: url('../images/admin/publish_r.png');
}
a.grid_true {
	display: inline-block;
	height: 16px;
	width: 16px;
	background-image: url('../images/admin/icon-16-allow.png');
}
textarea,
input,
.uneditable-input {
	box-shadow: none !important;
}
textarea:focus,
input:focus,
.uneditable-input:focus {
	box-shadow: none;
	border: 1px solid #3071A9;
}
.js-pstats-data-details dd {
	margin-left: 240px;
}
.js-pstats-data-details dt {
	width: 220px;
}
#permissions table td,
#page-permissions table td {
	vertical-align: middle;
}
#permissions table select,
#page-permissions table select {
	margin-bottom: 0;
}
.js-stools-container-bar .btn-primary .caret {
	border-bottom: 4px solid #fff;
}
.input-append .add-on,
.input-append .btn,
.input-append .btn-group > .dropdown-toggle,
.input-prepend .add-on,
.input-prepend .btn,
.input-prepend .btn-group > .dropdown-toggle {
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.alert,
.alert-options,
.badge,
.breadcrumb > li,
.close,
.input-append .add-on,
.input-prepend .add-on,
.label,
.nav-header,
.nav-list .nav-header,
.nav-list > .active > a,
.nav-list > .active > a:focus,
.nav-list > .active > a:hover,
.nav-list > li > a,
.nav-tabs.nav-dark,
.navbar .brand,
.navbar .nav > li > a,
.navbar-inverse .brand,
.navbar-inverse .nav > li > a,
.navbar-inverse .navbar-search .search-query.focused,
.navbar-inverse .navbar-search .search-query:focus,
.progress .bar,
.subhead {
	text-shadow: none;
}
.popover-content {
	min-height: 33px;
}
.lead,
.navbar .brand,
.hero-unit,
.hero-unit .lead {
	font-weight: 400;
}
@media (min-width: 1200px) {
	#permissions .tab-content {
		position: sticky;
		top: 90px;
	}
}
.com_cpanel .well {
	padding: 8px 14px;
	border: 1px solid rgba(0,0,0,0.05);
}
.com_cpanel .well .module-title.nav-header {
	color: #555;
}
.com_cpanel .well > .row-striped,
.com_cpanel .well > .list-striped {
	margin: 0 -14px;
}
.com_cpanel .well > .row-striped > .row-fluid,
.com_cpanel .well > .list-striped > .row-fluid {
	padding: 8px 14px;
}
.com_cpanel .well > .row-striped > .row-fluid [class*="span"],
.com_cpanel .well > .list-striped > .row-fluid [class*="span"] {
	margin-left: 0;
}
.com_cpanel .well > .row-striped > li,
.com_cpanel .well > .list-striped > li {
	padding-left: 15px;
	padding-right: 15px;
}
.com_postinstall fieldset {
	background-color: #fafafa;
	border: 1px solid #ccc;
	border-radius: 5px;
	margin: 0 0 18px;
	padding: 4px 18px 18px;
}
.com_postinstall fieldset .btn {
	margin-top: 10px;
}
.com_postinstall legend {
	border: 0 none;
	display: inline-block;
	padding: 0 5px;
	margin-bottom: 0;
	width: auto;
}
.com_privacy .well {
	padding: 8px 14px;
	border: 1px solid rgba(0,0,0,0.05);
}
.com_privacy .well .module-title.nav-header {
	color: #555;
}
.com_privacy .well > .row-striped,
.com_privacy .well > .list-striped {
	margin: 0 -14px;
}
.com_privacy .well > .row-striped > .row-fluid,
.com_privacy .well > .list-striped > .row-fluid {
	padding: 8px 14px;
}
.com_privacy .well > .row-striped > .row-fluid [class*="span"],
.com_privacy .well > .list-striped > .row-fluid [class*="span"] {
	margin-left: 0;
}
.com_privacy .well > .row-striped > li,
.com_privacy .well > .list-striped > li {
	padding-left: 15px;
	padding-right: 15px;
}
#menu-assignment {
	position: relative;
}
#menu-assignment .menu-links {
	margin-top: 15px;
	margin-left: 0;
	-webkit-column-count: 4;
	-moz-column-count: 4;
	column-count: 4;
	-moz-column-gap: 15px;
	-webkit-column-gap: 15px;
	column-gap: 15px;
}
#menu-assignment .menu-links > li {
	display: inline-block;
	vertical-align: top;
	margin-bottom: 15px;
	width: 100%;
	list-style: none;
	page-break-inside: avoid;
	break-inside: avoid;
}
#menu-assignment .menu-links-block {
	background-color: #fafafa;
	border: 1px solid #ddd;
	border-radius: 3px;
	padding: 15px;
}
@media (max-width: 1199px) {
	#menu-assignment .menu-links {
		-webkit-column-count: 3;
		-moz-column-count: 3;
		column-count: 3;
	}
}
@media (max-width: 767px) {
	#menu-assignment .menu-links {
		-webkit-column-count: auto;
		-moz-column-count: auto;
		column-count: auto;
	}
}
templates/isis/css/template-rtl.css000060400000625641152453623430013446 0ustar00article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
nav,
section {
	display: block;
}
audio,
canvas,
video {
	display: inline-block;
	*display: inline;
	*zoom: 1;
}
audio:not([controls]) {
	display: none;
}
html {
	font-size: 100%;
	-webkit-text-size-adjust: 100%;
	-ms-text-size-adjust: 100%;
}
a:focus {
	outline: thin dotted #333;
	outline: 5px auto -webkit-focus-ring-color;
	outline-offset: -2px;
}
a:hover,
a:active {
	outline: 0;
}
sub,
sup {
	position: relative;
	font-size: 75%;
	line-height: 0;
	vertical-align: baseline;
}
sup {
	top: -0.5em;
}
sub {
	bottom: -0.25em;
}
img {
	max-width: 100%;
	width: auto \9;
	height: auto;
	vertical-align: middle;
	border: 0;
	-ms-interpolation-mode: bicubic;
}
#map_canvas img,
.google-maps img,
.gm-style img {
	max-width: none;
}
button,
input,
select,
textarea {
	margin: 0;
	font-size: 100%;
	vertical-align: middle;
}
button,
input {
	*overflow: visible;
	line-height: normal;
}
button::-moz-focus-inner,
input::-moz-focus-inner {
	padding: 0;
	border: 0;
}
button,
html input[type="button"],
input[type="reset"],
input[type="submit"] {
	-webkit-appearance: button;
	cursor: pointer;
}
label,
select,
button,
input[type="button"],
input[type="reset"],
input[type="submit"],
input[type="radio"],
input[type="checkbox"] {
	cursor: pointer;
}
input[type="search"] {
	-webkit-box-sizing: content-box;
	-moz-box-sizing: content-box;
	box-sizing: content-box;
	-webkit-appearance: textfield;
}
input[type="search"]::-webkit-search-decoration,
input[type="search"]::-webkit-search-cancel-button {
	-webkit-appearance: none;
}
textarea {
	overflow: auto;
	vertical-align: top;
}
@media print {
	* {
		text-shadow: none !important;
		color: #000 !important;
		background: transparent !important;
		box-shadow: none !important;
	}
	a,
	a:visited {
		text-decoration: underline;
	}
	a[href]:after {
		content: " (" attr(href) ")";
	}
	abbr[title]:after {
		content: " (" attr(title) ")";
	}
	.ir a:after,
	a[href^="javascript:"]:after,
	a[href^="#"]:after {
		content: "";
	}
	pre,
	blockquote {
		border: 1px solid #999;
		page-break-inside: avoid;
	}
	thead {
		display: table-header-group;
	}
	tr,
	img {
		page-break-inside: avoid;
	}
	img {
		max-width: 100% !important;
	}
	@page {
		margin: 0.5cm;
	}
	p,
	h2,
	h3 {
		orphans: 3;
		widows: 3;
	}
	h2,
	h3 {
		page-break-after: avoid;
	}
}
.clearfix {
	*zoom: 1;
}
.clearfix:before,
.clearfix:after {
	display: table;
	content: "";
	line-height: 0;
}
.clearfix:after {
	clear: both;
}
.hide-text {
	font: 0/0 a;
	color: transparent;
	text-shadow: none;
	background-color: transparent;
	border: 0;
}
.input-block-level {
	display: block;
	width: 100%;
	min-height: 28px;
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
}
body {
	margin: 0;
	font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
	font-size: 13px;
	line-height: 18px;
	color: #333;
	background-color: #fff;
}
a {
	color: #3071a9;
	text-decoration: none;
}
a:hover,
a:focus {
	color: #1f496e;
	text-decoration: underline;
}
.img-rounded {
	-webkit-border-radius: 6px;
	-moz-border-radius: 6px;
	border-radius: 6px;
}
.img-polaroid {
	padding: 4px;
	background-color: #fff;
	border: 1px solid #ccc;
	border: 1px solid rgba(0,0,0,0.2);
	-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.1);
	-moz-box-shadow: 0 1px 3px rgba(0,0,0,0.1);
	box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.img-circle {
	-webkit-border-radius: 500px;
	-moz-border-radius: 500px;
	border-radius: 500px;
}
.row {
	margin-left: -20px;
	*zoom: 1;
}
.row:before,
.row:after {
	display: table;
	content: "";
	line-height: 0;
}
.row:after {
	clear: both;
}
[class*="span"] {
	float: left;
	min-height: 1px;
	margin-left: 20px;
}
.container,
.navbar-static-top .container,
.navbar-fixed-top .container,
.navbar-fixed-bottom .container {
	width: 940px;
}
.span12 {
	width: 940px;
}
.span11 {
	width: 860px;
}
.span10 {
	width: 780px;
}
.span9 {
	width: 700px;
}
.span8 {
	width: 620px;
}
.span7 {
	width: 540px;
}
.span6 {
	width: 460px;
}
.span5 {
	width: 380px;
}
.span4 {
	width: 300px;
}
.span3 {
	width: 220px;
}
.span2 {
	width: 140px;
}
.span1 {
	width: 60px;
}
.offset12 {
	margin-left: 980px;
}
.offset11 {
	margin-left: 900px;
}
.offset10 {
	margin-left: 820px;
}
.offset9 {
	margin-left: 740px;
}
.offset8 {
	margin-left: 660px;
}
.offset7 {
	margin-left: 580px;
}
.offset6 {
	margin-left: 500px;
}
.offset5 {
	margin-left: 420px;
}
.offset4 {
	margin-left: 340px;
}
.offset3 {
	margin-left: 260px;
}
.offset2 {
	margin-left: 180px;
}
.offset1 {
	margin-left: 100px;
}
.row-fluid {
	width: 100%;
	*zoom: 1;
}
.row-fluid:before,
.row-fluid:after {
	display: table;
	content: "";
	line-height: 0;
}
.row-fluid:after {
	clear: both;
}
.row-fluid [class*="span"] {
	display: block;
	width: 100%;
	min-height: 28px;
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
	float: left;
	margin-left: 2.1276595744681%;
	*margin-left: 2.0744680851064%;
}
.row-fluid [class*="span"]:first-child {
	margin-left: 0;
}
.row-fluid .controls-row [class*="span"] + [class*="span"] {
	margin-left: 2.1276595744681%;
}
.row-fluid .span12 {
	width: 100%;
	*width: 99.946808510638%;
}
.row-fluid .span11 {
	width: 91.489361702128%;
	*width: 91.436170212766%;
}
.row-fluid .span10 {
	width: 82.978723404255%;
	*width: 82.925531914894%;
}
.row-fluid .span9 {
	width: 74.468085106383%;
	*width: 74.414893617021%;
}
.row-fluid .span8 {
	width: 65.957446808511%;
	*width: 65.904255319149%;
}
.row-fluid .span7 {
	width: 57.446808510638%;
	*width: 57.393617021277%;
}
.row-fluid .span6 {
	width: 48.936170212766%;
	*width: 48.882978723404%;
}
.row-fluid .span5 {
	width: 40.425531914894%;
	*width: 40.372340425532%;
}
.row-fluid .span4 {
	width: 31.914893617021%;
	*width: 31.86170212766%;
}
.row-fluid .span3 {
	width: 23.404255319149%;
	*width: 23.351063829787%;
}
.row-fluid .span2 {
	width: 14.893617021277%;
	*width: 14.840425531915%;
}
.row-fluid .span1 {
	width: 6.3829787234043%;
	*width: 6.3297872340426%;
}
.row-fluid .offset12 {
	margin-left: 104.25531914894%;
	*margin-left: 104.14893617021%;
}
.row-fluid .offset12:first-child {
	margin-left: 102.12765957447%;
	*margin-left: 102.02127659574%;
}
.row-fluid .offset11 {
	margin-left: 95.744680851064%;
	*margin-left: 95.63829787234%;
}
.row-fluid .offset11:first-child {
	margin-left: 93.617021276596%;
	*margin-left: 93.510638297872%;
}
.row-fluid .offset10 {
	margin-left: 87.234042553191%;
	*margin-left: 87.127659574468%;
}
.row-fluid .offset10:first-child {
	margin-left: 85.106382978723%;
	*margin-left: 85%;
}
.row-fluid .offset9 {
	margin-left: 78.723404255319%;
	*margin-left: 78.617021276596%;
}
.row-fluid .offset9:first-child {
	margin-left: 76.595744680851%;
	*margin-left: 76.489361702128%;
}
.row-fluid .offset8 {
	margin-left: 70.212765957447%;
	*margin-left: 70.106382978723%;
}
.row-fluid .offset8:first-child {
	margin-left: 68.085106382979%;
	*margin-left: 67.978723404255%;
}
.row-fluid .offset7 {
	margin-left: 61.702127659574%;
	*margin-left: 61.595744680851%;
}
.row-fluid .offset7:first-child {
	margin-left: 59.574468085106%;
	*margin-left: 59.468085106383%;
}
.row-fluid .offset6 {
	margin-left: 53.191489361702%;
	*margin-left: 53.085106382979%;
}
.row-fluid .offset6:first-child {
	margin-left: 51.063829787234%;
	*margin-left: 50.957446808511%;
}
.row-fluid .offset5 {
	margin-left: 44.68085106383%;
	*margin-left: 44.574468085106%;
}
.row-fluid .offset5:first-child {
	margin-left: 42.553191489362%;
	*margin-left: 42.446808510638%;
}
.row-fluid .offset4 {
	margin-left: 36.170212765957%;
	*margin-left: 36.063829787234%;
}
.row-fluid .offset4:first-child {
	margin-left: 34.042553191489%;
	*margin-left: 33.936170212766%;
}
.row-fluid .offset3 {
	margin-left: 27.659574468085%;
	*margin-left: 27.553191489362%;
}
.row-fluid .offset3:first-child {
	margin-left: 25.531914893617%;
	*margin-left: 25.425531914894%;
}
.row-fluid .offset2 {
	margin-left: 19.148936170213%;
	*margin-left: 19.042553191489%;
}
.row-fluid .offset2:first-child {
	margin-left: 17.021276595745%;
	*margin-left: 16.914893617021%;
}
.row-fluid .offset1 {
	margin-left: 10.63829787234%;
	*margin-left: 10.531914893617%;
}
.row-fluid .offset1:first-child {
	margin-left: 8.5106382978723%;
	*margin-left: 8.4042553191489%;
}
[class*="span"].hide,
.row-fluid [class*="span"].hide {
	display: none;
}
[class*="span"].pull-right,
.row-fluid [class*="span"].pull-right {
	float: right;
}
.container {
	margin-right: auto;
	margin-left: auto;
	*zoom: 1;
}
.container:before,
.container:after {
	display: table;
	content: "";
	line-height: 0;
}
.container:after {
	clear: both;
}
.container-fluid {
	padding-right: 20px;
	padding-left: 20px;
	*zoom: 1;
}
.container-fluid:before,
.container-fluid:after {
	display: table;
	content: "";
	line-height: 0;
}
.container-fluid:after {
	clear: both;
}
p {
	margin: 0 0 9px;
}
.lead {
	margin-bottom: 18px;
	font-size: 19.5px;
	font-weight: 200;
	line-height: 27px;
}
small {
	font-size: 85%;
}
strong {
	font-weight: bold;
}
em {
	font-style: italic;
}
cite {
	font-style: normal;
}
.muted {
	color: #999;
}
a.muted:hover,
a.muted:focus {
	color: #808080;
}
.text-warning {
	color: #8a6d3b;
}
a.text-warning:hover,
a.text-warning:focus {
	color: #66512c;
}
.text-error {
	color: #a94442;
}
a.text-error:hover,
a.text-error:focus {
	color: #843534;
}
.text-info {
	color: #31708f;
}
a.text-info:hover,
a.text-info:focus {
	color: #245269;
}
.text-success {
	color: #3c763d;
}
a.text-success:hover,
a.text-success:focus {
	color: #2b542c;
}
.text-left {
	text-align: left;
}
.text-right {
	text-align: right;
}
.text-center {
	text-align: center;
}
h1,
h2,
h3,
h4,
h5,
h6 {
	margin: 9px 0;
	font-family: inherit;
	font-weight: bold;
	line-height: 18px;
	color: inherit;
	text-rendering: optimizelegibility;
}
h1 small,
h2 small,
h3 small,
h4 small,
h5 small,
h6 small {
	font-weight: normal;
	line-height: 1;
	color: #999;
}
h1,
h2,
h3 {
	line-height: 36px;
}
h1 {
	font-size: 35.75px;
}
h2 {
	font-size: 29.25px;
}
h3 {
	font-size: 22.75px;
}
h4 {
	font-size: 16.25px;
}
h5 {
	font-size: 13px;
}
h6 {
	font-size: 11.05px;
}
h1 small {
	font-size: 22.75px;
}
h2 small {
	font-size: 16.25px;
}
h3 small {
	font-size: 13px;
}
h4 small {
	font-size: 13px;
}
.page-header {
	padding-bottom: 8px;
	margin: 18px 0 27px;
	border-bottom: 1px solid #eee;
}
ul,
ol {
	padding: 0;
	margin: 0 0 9px 25px;
}
ul ul,
ul ol,
ol ol,
ol ul {
	margin-bottom: 0;
}
li {
	line-height: 18px;
}
ul.unstyled,
ol.unstyled {
	margin-left: 0;
	list-style: none;
}
ul.inline,
ol.inline {
	margin-left: 0;
	list-style: none;
}
ul.inline > li,
ol.inline > li {
	display: inline-block;
	*display: inline;
	*zoom: 1;
	padding-left: 5px;
	padding-right: 5px;
}
dl {
	margin-bottom: 18px;
}
dt,
dd {
	line-height: 18px;
}
dt {
	font-weight: bold;
}
dd {
	margin-left: 9px;
}
.dl-horizontal {
	*zoom: 1;
}
.dl-horizontal:before,
.dl-horizontal:after {
	display: table;
	content: "";
	line-height: 0;
}
.dl-horizontal:after {
	clear: both;
}
.dl-horizontal dt {
	float: left;
	width: 160px;
	clear: left;
	text-align: right;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.dl-horizontal dd {
	margin-left: 180px;
}
hr {
	margin: 18px 0;
	border: 0;
	border-top: 1px solid #eee;
	border-bottom: 1px solid #fff;
}
abbr[title],
abbr[data-original-title] {
	cursor: help;
	border-bottom: 1px dotted #999;
}
abbr.initialism {
	font-size: 90%;
	text-transform: uppercase;
}
blockquote {
	padding: 0 0 0 15px;
	margin: 0 0 18px;
	border-left: 5px solid #eee;
}
blockquote p {
	margin-bottom: 0;
	font-size: 16.25px;
	font-weight: 300;
	line-height: 1.25;
}
blockquote small {
	display: block;
	line-height: 18px;
	color: #999;
}
blockquote small:before {
	content: '\2014 \00A0';
}
blockquote.pull-right {
	float: right;
	padding-right: 15px;
	padding-left: 0;
	border-right: 5px solid #eee;
	border-left: 0;
}
blockquote.pull-right p,
blockquote.pull-right small {
	text-align: right;
}
blockquote.pull-right small:before {
	content: '';
}
blockquote.pull-right small:after {
	content: '\00A0 \2014';
}
q:before,
q:after,
blockquote:before,
blockquote:after {
	content: "";
}
address {
	display: block;
	margin-bottom: 18px;
	font-style: normal;
	line-height: 18px;
}
code,
pre {
	padding: 0 3px 2px;
	font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
	font-size: 11px;
	color: #333;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
code {
	padding: 2px 4px;
	color: #d14;
	background-color: #f7f7f9;
	border: 1px solid #e1e1e8;
	white-space: nowrap;
}
pre {
	display: block;
	padding: 8.5px;
	margin: 0 0 9px;
	font-size: 12px;
	line-height: 18px;
	word-break: break-all;
	word-wrap: break-word;
	white-space: pre;
	white-space: pre-wrap;
	background-color: #f5f5f5;
	border: 1px solid #ccc;
	border: 1px solid rgba(0,0,0,0.15);
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
pre.prettyprint {
	margin-bottom: 18px;
}
pre code {
	padding: 0;
	color: inherit;
	white-space: pre;
	white-space: pre-wrap;
	background-color: transparent;
	border: 0;
}
.pre-scrollable {
	max-height: 340px;
	overflow-y: scroll;
}
form {
	margin: 0 0 18px;
}
fieldset {
	padding: 0;
	margin: 0;
	border: 0;
}
legend {
	display: block;
	width: 100%;
	padding: 0;
	margin-bottom: 18px;
	font-size: 19.5px;
	line-height: 36px;
	color: #333;
	border: 0;
	border-bottom: 1px solid #e5e5e5;
}
legend small {
	font-size: 13.5px;
	color: #999;
}
label,
input,
button,
select,
textarea {
	font-size: 13px;
	font-weight: normal;
	line-height: 18px;
}
input,
button,
select,
textarea {
	font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
label {
	display: block;
	margin-bottom: 5px;
}
select,
textarea,
input[type="text"],
input[type="password"],
input[type="datetime"],
input[type="datetime-local"],
input[type="date"],
input[type="month"],
input[type="time"],
input[type="week"],
input[type="number"],
input[type="email"],
input[type="url"],
input[type="search"],
input[type="tel"],
input[type="color"],
.uneditable-input {
	display: inline-block;
	height: 18px;
	padding: 4px 6px;
	margin-bottom: 9px;
	font-size: 13px;
	line-height: 18px;
	color: #555;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
	vertical-align: middle;
}
input,
textarea,
.uneditable-input {
	width: 206px;
}
textarea {
	height: auto;
}
textarea,
input[type="text"],
input[type="password"],
input[type="datetime"],
input[type="datetime-local"],
input[type="date"],
input[type="month"],
input[type="time"],
input[type="week"],
input[type="number"],
input[type="email"],
input[type="url"],
input[type="search"],
input[type="tel"],
input[type="color"],
.uneditable-input {
	background-color: #fff;
	border: 1px solid #ccc;
	-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);
	-moz-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);
	box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);
	-webkit-transition: border linear .2s, box-shadow linear .2s;
	-moz-transition: border linear .2s, box-shadow linear .2s;
	-o-transition: border linear .2s, box-shadow linear .2s;
	transition: border linear .2s, box-shadow linear .2s;
}
textarea:focus,
input[type="text"]:focus,
input[type="password"]:focus,
input[type="datetime"]:focus,
input[type="datetime-local"]:focus,
input[type="date"]:focus,
input[type="month"]:focus,
input[type="time"]:focus,
input[type="week"]:focus,
input[type="number"]:focus,
input[type="email"]:focus,
input[type="url"]:focus,
input[type="search"]:focus,
input[type="tel"]:focus,
input[type="color"]:focus,
.uneditable-input:focus {
	border-color: rgba(82,168,236,0.8);
	outline: 0;
	outline: thin dotted \9;
	-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
	-moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
	box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
}
input[type="radio"],
input[type="checkbox"] {
	margin: 4px 0 0;
	*margin-top: 0;
	margin-top: 1px \9;
	line-height: normal;
}
input[type="file"],
input[type="image"],
input[type="submit"],
input[type="reset"],
input[type="button"],
input[type="radio"],
input[type="checkbox"] {
	width: auto;
}
select,
input[type="file"] {
	height: 28px;
	*margin-top: 4px;
	line-height: 28px;
}
select {
	width: 220px;
	border: 1px solid #ccc;
	background-color: #fff;
}
select[multiple],
select[size] {
	height: auto;
}
select:focus,
input[type="file"]:focus,
input[type="radio"]:focus,
input[type="checkbox"]:focus {
	outline: thin dotted #333;
	outline: 5px auto -webkit-focus-ring-color;
	outline-offset: -2px;
}
.uneditable-input,
.uneditable-textarea {
	color: #999;
	background-color: #fcfcfc;
	border-color: #ccc;
	-webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,0.025);
	-moz-box-shadow: inset 0 1px 2px rgba(0,0,0,0.025);
	box-shadow: inset 0 1px 2px rgba(0,0,0,0.025);
	cursor: not-allowed;
}
.uneditable-input {
	overflow: hidden;
	white-space: nowrap;
}
.uneditable-textarea {
	width: auto;
	height: auto;
}
input:-moz-placeholder,
textarea:-moz-placeholder {
	color: #999;
}
input:-ms-input-placeholder,
textarea:-ms-input-placeholder {
	color: #999;
}
input::-webkit-input-placeholder,
textarea::-webkit-input-placeholder {
	color: #999;
}
.radio,
.checkbox {
	min-height: 18px;
	padding-left: 20px;
}
.radio input[type="radio"],
.checkbox input[type="checkbox"] {
	float: left;
	margin-left: -20px;
}
.controls > .radio:first-child,
.controls > .checkbox:first-child {
	padding-top: 5px;
}
.radio.inline,
.checkbox.inline {
	display: inline-block;
	padding-top: 5px;
	margin-bottom: 0;
	vertical-align: middle;
}
.radio.inline + .radio.inline,
.checkbox.inline + .checkbox.inline {
	margin-left: 10px;
}
.input-mini {
	width: 60px;
}
.input-small {
	width: 90px;
}
.input-medium {
	width: 150px;
}
.input-large {
	width: 210px;
}
.input-xlarge {
	width: 270px;
}
.input-xxlarge {
	width: 530px;
}
input[class*="span"],
select[class*="span"],
textarea[class*="span"],
.uneditable-input[class*="span"],
.row-fluid input[class*="span"],
.row-fluid select[class*="span"],
.row-fluid textarea[class*="span"],
.row-fluid .uneditable-input[class*="span"] {
	float: none;
	margin-left: 0;
}
.input-append input[class*="span"],
.input-append .uneditable-input[class*="span"],
.input-prepend input[class*="span"],
.input-prepend .uneditable-input[class*="span"],
.row-fluid input[class*="span"],
.row-fluid select[class*="span"],
.row-fluid textarea[class*="span"],
.row-fluid .uneditable-input[class*="span"],
.row-fluid .input-prepend [class*="span"],
.row-fluid .input-append [class*="span"] {
	display: inline-block;
}
input,
textarea,
.uneditable-input {
	margin-left: 0;
}
.controls-row [class*="span"] + [class*="span"] {
	margin-left: 20px;
}
input.span12,
textarea.span12,
.uneditable-input.span12 {
	width: 926px;
}
input.span11,
textarea.span11,
.uneditable-input.span11 {
	width: 846px;
}
input.span10,
textarea.span10,
.uneditable-input.span10 {
	width: 766px;
}
input.span9,
textarea.span9,
.uneditable-input.span9 {
	width: 686px;
}
input.span8,
textarea.span8,
.uneditable-input.span8 {
	width: 606px;
}
input.span7,
textarea.span7,
.uneditable-input.span7 {
	width: 526px;
}
input.span6,
textarea.span6,
.uneditable-input.span6 {
	width: 446px;
}
input.span5,
textarea.span5,
.uneditable-input.span5 {
	width: 366px;
}
input.span4,
textarea.span4,
.uneditable-input.span4 {
	width: 286px;
}
input.span3,
textarea.span3,
.uneditable-input.span3 {
	width: 206px;
}
input.span2,
textarea.span2,
.uneditable-input.span2 {
	width: 126px;
}
input.span1,
textarea.span1,
.uneditable-input.span1 {
	width: 46px;
}
.controls-row {
	*zoom: 1;
}
.controls-row:before,
.controls-row:after {
	display: table;
	content: "";
	line-height: 0;
}
.controls-row:after {
	clear: both;
}
.controls-row [class*="span"],
.row-fluid .controls-row [class*="span"] {
	float: left;
}
.controls-row .checkbox[class*="span"],
.controls-row .radio[class*="span"] {
	padding-top: 5px;
}
input[disabled],
select[disabled],
textarea[disabled],
input[readonly],
select[readonly],
textarea[readonly] {
	cursor: not-allowed;
	background-color: #eee;
}
input[type="radio"][disabled],
input[type="checkbox"][disabled],
input[type="radio"][readonly],
input[type="checkbox"][readonly] {
	background-color: transparent;
}
.control-group.warning .control-label,
.control-group.warning .help-block,
.control-group.warning .help-inline {
	color: #8a6d3b;
}
.control-group.warning .checkbox,
.control-group.warning .radio,
.control-group.warning input,
.control-group.warning select,
.control-group.warning textarea {
	color: #8a6d3b;
}
.control-group.warning input,
.control-group.warning select,
.control-group.warning textarea {
	border-color: #8a6d3b;
}
.control-group.warning input:focus,
.control-group.warning select:focus,
.control-group.warning textarea:focus {
	border-color: #66512c;
}
.control-group.warning .input-prepend .add-on,
.control-group.warning .input-append .add-on {
	color: #8a6d3b;
	background-color: #fcf8e3;
	border-color: #8a6d3b;
}
.control-group.error .control-label,
.control-group.error .help-block,
.control-group.error .help-inline {
	color: #a94442;
}
.control-group.error .checkbox,
.control-group.error .radio,
.control-group.error input,
.control-group.error select,
.control-group.error textarea {
	color: #a94442;
}
.control-group.error input,
.control-group.error select,
.control-group.error textarea {
	border-color: #a94442;
}
.control-group.error input:focus,
.control-group.error select:focus,
.control-group.error textarea:focus {
	border-color: #843534;
}
.control-group.error .input-prepend .add-on,
.control-group.error .input-append .add-on {
	color: #a94442;
	background-color: #f2dede;
	border-color: #a94442;
}
.control-group.success .control-label,
.control-group.success .help-block,
.control-group.success .help-inline {
	color: #3c763d;
}
.control-group.success .checkbox,
.control-group.success .radio,
.control-group.success input,
.control-group.success select,
.control-group.success textarea {
	color: #3c763d;
}
.control-group.success input,
.control-group.success select,
.control-group.success textarea {
	border-color: #3c763d;
}
.control-group.success input:focus,
.control-group.success select:focus,
.control-group.success textarea:focus {
	border-color: #2b542c;
}
.control-group.success .input-prepend .add-on,
.control-group.success .input-append .add-on {
	color: #3c763d;
	background-color: #dff0d8;
	border-color: #3c763d;
}
.control-group.info .control-label,
.control-group.info .help-block,
.control-group.info .help-inline {
	color: #31708f;
}
.control-group.info .checkbox,
.control-group.info .radio,
.control-group.info input,
.control-group.info select,
.control-group.info textarea {
	color: #31708f;
}
.control-group.info input,
.control-group.info select,
.control-group.info textarea {
	border-color: #31708f;
}
.control-group.info input:focus,
.control-group.info select:focus,
.control-group.info textarea:focus {
	border-color: #245269;
}
.control-group.info .input-prepend .add-on,
.control-group.info .input-append .add-on {
	color: #31708f;
	background-color: #d9edf7;
	border-color: #31708f;
}
input:focus:invalid,
textarea:focus:invalid,
select:focus:invalid {
	color: #b94a48;
	border-color: #ee5f5b;
}
input:focus:invalid:focus,
textarea:focus:invalid:focus,
select:focus:invalid:focus {
	border-color: #e9322d;
	-webkit-box-shadow: 0 0 6px #f8b9b7;
	-moz-box-shadow: 0 0 6px #f8b9b7;
	box-shadow: 0 0 6px #f8b9b7;
}
.form-actions {
	padding: 17px 20px 18px;
	margin-top: 18px;
	margin-bottom: 18px;
	background-color: #F0F0F0;
	border-top: 1px solid #e5e5e5;
	*zoom: 1;
}
.form-actions:before,
.form-actions:after {
	display: table;
	content: "";
	line-height: 0;
}
.form-actions:after {
	clear: both;
}
.help-block,
.help-inline {
	color: #595959;
}
.help-block {
	display: block;
	margin-bottom: 9px;
}
.help-inline {
	display: inline-block;
	*display: inline;
	*zoom: 1;
	vertical-align: middle;
	padding-left: 5px;
}
.input-append,
.input-prepend {
	display: inline-block;
	margin-bottom: 9px;
	vertical-align: middle;
	font-size: 0;
	white-space: nowrap;
}
.input-append input,
.input-append select,
.input-append .uneditable-input,
.input-append .dropdown-menu,
.input-append .popover,
.input-prepend input,
.input-prepend select,
.input-prepend .uneditable-input,
.input-prepend .dropdown-menu,
.input-prepend .popover {
	font-size: 13px;
}
.input-append input,
.input-append select,
.input-append .uneditable-input,
.input-prepend input,
.input-prepend select,
.input-prepend .uneditable-input {
	position: relative;
	margin-bottom: 0;
	*margin-left: 0;
	vertical-align: top;
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.input-append input:focus,
.input-append select:focus,
.input-append .uneditable-input:focus,
.input-prepend input:focus,
.input-prepend select:focus,
.input-prepend .uneditable-input:focus {
	z-index: 2;
}
.input-append .add-on,
.input-prepend .add-on {
	display: inline-block;
	width: auto;
	height: 18px;
	min-width: 16px;
	padding: 4px 5px;
	font-size: 13px;
	font-weight: normal;
	line-height: 18px;
	text-align: center;
	text-shadow: 0 1px 0 #fff;
	background-color: #eee;
	border: 1px solid #ccc;
}
.input-append .add-on,
.input-append .btn,
.input-append .btn-group > .dropdown-toggle,
.input-prepend .add-on,
.input-prepend .btn,
.input-prepend .btn-group > .dropdown-toggle {
	vertical-align: top;
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.input-prepend .add-on,
.input-prepend .btn {
	margin-right: -1px;
}
.input-prepend .add-on:first-child,
.input-prepend .btn:first-child {
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
}
.input-append input,
.input-append select,
.input-append .uneditable-input {
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
}
.input-append input + .btn-group .btn:last-child,
.input-append select + .btn-group .btn:last-child,
.input-append .uneditable-input + .btn-group .btn:last-child {
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.input-append .add-on,
.input-append .btn,
.input-append .btn-group {
	margin-left: -1px;
}
.input-append .add-on:last-child,
.input-append .btn:last-child,
.input-append .btn-group:last-child > .dropdown-toggle {
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.input-prepend.input-append input,
.input-prepend.input-append select,
.input-prepend.input-append .uneditable-input {
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.input-prepend.input-append input + .btn-group .btn,
.input-prepend.input-append select + .btn-group .btn,
.input-prepend.input-append .uneditable-input + .btn-group .btn {
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.input-prepend.input-append .add-on:first-child,
.input-prepend.input-append .btn:first-child {
	margin-right: -1px;
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
}
.input-prepend.input-append .add-on:last-child,
.input-prepend.input-append .btn:last-child {
	margin-left: -1px;
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.input-prepend.input-append .btn-group:first-child {
	margin-left: 0;
}
input.search-query {
	padding-right: 14px;
	padding-right: 4px \9;
	padding-left: 14px;
	padding-left: 4px \9;
	margin-bottom: 0;
	-webkit-border-radius: 15px;
	-moz-border-radius: 15px;
	border-radius: 15px;
}
.form-search .input-append .search-query,
.form-search .input-prepend .search-query {
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.form-search .input-append .search-query {
	-webkit-border-radius: 14px 0 0 14px;
	-moz-border-radius: 14px 0 0 14px;
	border-radius: 14px 0 0 14px;
}
.form-search .input-append .btn {
	-webkit-border-radius: 0 14px 14px 0;
	-moz-border-radius: 0 14px 14px 0;
	border-radius: 0 14px 14px 0;
}
.form-search .input-prepend .search-query {
	-webkit-border-radius: 0 14px 14px 0;
	-moz-border-radius: 0 14px 14px 0;
	border-radius: 0 14px 14px 0;
}
.form-search .input-prepend .btn {
	-webkit-border-radius: 14px 0 0 14px;
	-moz-border-radius: 14px 0 0 14px;
	border-radius: 14px 0 0 14px;
}
.js-stools-field-filter .input-prepend,
.js-stools-field-filter .input-append {
	margin-bottom: 0;
}
.form-search input,
.form-search textarea,
.form-search select,
.form-search .help-inline,
.form-search .uneditable-input,
.form-search .input-prepend,
.form-search .input-append,
.form-inline input,
.form-inline textarea,
.form-inline select,
.form-inline .help-inline,
.form-inline .uneditable-input,
.form-inline .input-prepend,
.form-inline .input-append,
.form-horizontal input,
.form-horizontal textarea,
.form-horizontal select,
.form-horizontal .help-inline,
.form-horizontal .uneditable-input,
.form-horizontal .input-prepend,
.form-horizontal .input-append {
	display: inline-block;
	*display: inline;
	*zoom: 1;
	margin-bottom: 0;
	vertical-align: middle;
}
.form-search .hide,
.form-inline .hide,
.form-horizontal .hide {
	display: none;
}
.form-search label,
.form-inline label,
.form-search .btn-group,
.form-inline .btn-group {
	display: inline-block;
}
.form-search .input-append,
.form-inline .input-append,
.form-search .input-prepend,
.form-inline .input-prepend {
	margin-bottom: 0;
}
.form-search .radio,
.form-search .checkbox,
.form-inline .radio,
.form-inline .checkbox {
	padding-left: 0;
	margin-bottom: 0;
	vertical-align: middle;
}
.form-search .radio input[type="radio"],
.form-search .checkbox input[type="checkbox"],
.form-inline .radio input[type="radio"],
.form-inline .checkbox input[type="checkbox"] {
	float: left;
	margin-right: 3px;
	margin-left: 0;
}
.control-group {
	margin-bottom: 9px;
}
legend + .control-group {
	margin-top: 18px;
	-webkit-margin-top-collapse: separate;
}
.form-horizontal .control-group {
	margin-bottom: 18px;
	*zoom: 1;
}
.form-horizontal .control-group:before,
.form-horizontal .control-group:after {
	display: table;
	content: "";
	line-height: 0;
}
.form-horizontal .control-group:after {
	clear: both;
}
.form-horizontal .control-label {
	float: left;
	width: 160px;
	padding-top: 5px;
	text-align: right;
}
.form-horizontal .controls {
	*display: inline-block;
	*padding-left: 20px;
	margin-left: 180px;
	*margin-left: 0;
}
.form-horizontal .controls:first-child {
	*padding-left: 180px;
}
.form-horizontal .help-block {
	margin-bottom: 0;
}
.form-horizontal input + .help-block,
.form-horizontal select + .help-block,
.form-horizontal textarea + .help-block,
.form-horizontal .uneditable-input + .help-block,
.form-horizontal .input-prepend + .help-block,
.form-horizontal .input-append + .help-block {
	margin-top: 9px;
}
.form-horizontal .form-actions {
	padding-left: 180px;
}
.control-label .hasPopover,
.control-label .hasTooltip {
	display: inline-block;
}
.subform-repeatable-wrapper .btn-group>.btn.button {
	min-width: 0;
}
.subform-repeatable-wrapper .ui-sortable-helper {
	background: #fff;
}
.subform-repeatable-wrapper tr.ui-sortable-helper {
	display: table;
}
@media (min-width: 980px) and (max-width: 1215px) {
	.float-cols .control-label {
		float: none;
	}
	.float-cols .controls {
		margin-left: 0;
	}
}
table {
	max-width: 100%;
	background-color: transparent;
	border-collapse: collapse;
	border-spacing: 0;
}
.table {
	width: 100%;
	margin-bottom: 18px;
}
.table th,
.table td {
	padding: 8px;
	line-height: 18px;
	text-align: left;
	vertical-align: top;
	border-top: 1px solid #ddd;
}
.table th {
	font-weight: bold;
}
.table thead th {
	vertical-align: bottom;
}
.table caption + thead tr:first-child th,
.table caption + thead tr:first-child td,
.table colgroup + thead tr:first-child th,
.table colgroup + thead tr:first-child td,
.table thead:first-child tr:first-child th,
.table thead:first-child tr:first-child td {
	border-top: 0;
}
.table tbody + tbody {
	border-top: 2px solid #ddd;
}
.table .table {
	background-color: #fff;
}
.table-condensed th,
.table-condensed td {
	padding: 4px 5px;
}
.table-bordered {
	border: 1px solid #ddd;
	border-collapse: separate;
	*border-collapse: collapse;
	border-left: 0;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.table-bordered th,
.table-bordered td {
	border-left: 1px solid #ddd;
}
.table-bordered caption + thead tr:first-child th,
.table-bordered caption + tbody tr:first-child th,
.table-bordered caption + tbody tr:first-child td,
.table-bordered colgroup + thead tr:first-child th,
.table-bordered colgroup + tbody tr:first-child th,
.table-bordered colgroup + tbody tr:first-child td,
.table-bordered thead:first-child tr:first-child th,
.table-bordered tbody:first-child tr:first-child th,
.table-bordered tbody:first-child tr:first-child td {
	border-top: 0;
}
.table-bordered thead:first-child tr:first-child > th:first-child,
.table-bordered tbody:first-child tr:first-child > td:first-child,
.table-bordered tbody:first-child tr:first-child > th:first-child {
	-webkit-border-top-left-radius: 3px;
	-moz-border-radius-topleft: 3px;
	border-top-left-radius: 3px;
}
.table-bordered thead:first-child tr:first-child > th:last-child,
.table-bordered tbody:first-child tr:first-child > td:last-child,
.table-bordered tbody:first-child tr:first-child > th:last-child {
	-webkit-border-top-right-radius: 3px;
	-moz-border-radius-topright: 3px;
	border-top-right-radius: 3px;
}
.table-bordered thead:last-child tr:last-child > th:first-child,
.table-bordered tbody:last-child tr:last-child > td:first-child,
.table-bordered tbody:last-child tr:last-child > th:first-child,
.table-bordered tfoot:last-child tr:last-child > td:first-child,
.table-bordered tfoot:last-child tr:last-child > th:first-child {
	-webkit-border-bottom-left-radius: 3px;
	-moz-border-radius-bottomleft: 3px;
	border-bottom-left-radius: 3px;
}
.table-bordered thead:last-child tr:last-child > th:last-child,
.table-bordered tbody:last-child tr:last-child > td:last-child,
.table-bordered tbody:last-child tr:last-child > th:last-child,
.table-bordered tfoot:last-child tr:last-child > td:last-child,
.table-bordered tfoot:last-child tr:last-child > th:last-child {
	-webkit-border-bottom-right-radius: 3px;
	-moz-border-radius-bottomright: 3px;
	border-bottom-right-radius: 3px;
}
.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {
	-webkit-border-bottom-left-radius: 0;
	-moz-border-radius-bottomleft: 0;
	border-bottom-left-radius: 0;
}
.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {
	-webkit-border-bottom-right-radius: 0;
	-moz-border-radius-bottomright: 0;
	border-bottom-right-radius: 0;
}
.table-bordered caption + thead tr:first-child th:first-child,
.table-bordered caption + tbody tr:first-child td:first-child,
.table-bordered colgroup + thead tr:first-child th:first-child,
.table-bordered colgroup + tbody tr:first-child td:first-child {
	-webkit-border-top-left-radius: 3px;
	-moz-border-radius-topleft: 3px;
	border-top-left-radius: 3px;
}
.table-bordered caption + thead tr:first-child th:last-child,
.table-bordered caption + tbody tr:first-child td:last-child,
.table-bordered colgroup + thead tr:first-child th:last-child,
.table-bordered colgroup + tbody tr:first-child td:last-child {
	-webkit-border-top-right-radius: 3px;
	-moz-border-radius-topright: 3px;
	border-top-right-radius: 3px;
}
.table-striped tbody > tr:nth-child(odd) > td,
.table-striped tbody > tr:nth-child(odd) > th {
	background-color: #f9f9f9;
}
.table-hover tbody tr:hover > td,
.table-hover tbody tr:hover > th {
	background-color: #F0F0F0;
}
table td[class*="span"],
table th[class*="span"],
.row-fluid table td[class*="span"],
.row-fluid table th[class*="span"] {
	display: table-cell;
	float: none;
	margin-left: 0;
}
.table td.span1,
.table th.span1 {
	float: none;
	width: 44px;
	margin-left: 0;
}
.table td.span2,
.table th.span2 {
	float: none;
	width: 124px;
	margin-left: 0;
}
.table td.span3,
.table th.span3 {
	float: none;
	width: 204px;
	margin-left: 0;
}
.table td.span4,
.table th.span4 {
	float: none;
	width: 284px;
	margin-left: 0;
}
.table td.span5,
.table th.span5 {
	float: none;
	width: 364px;
	margin-left: 0;
}
.table td.span6,
.table th.span6 {
	float: none;
	width: 444px;
	margin-left: 0;
}
.table td.span7,
.table th.span7 {
	float: none;
	width: 524px;
	margin-left: 0;
}
.table td.span8,
.table th.span8 {
	float: none;
	width: 604px;
	margin-left: 0;
}
.table td.span9,
.table th.span9 {
	float: none;
	width: 684px;
	margin-left: 0;
}
.table td.span10,
.table th.span10 {
	float: none;
	width: 764px;
	margin-left: 0;
}
.table td.span11,
.table th.span11 {
	float: none;
	width: 844px;
	margin-left: 0;
}
.table td.span12,
.table th.span12 {
	float: none;
	width: 924px;
	margin-left: 0;
}
.table tbody tr.success > td {
	background-color: #dff0d8;
}
.table tbody tr.error > td {
	background-color: #f2dede;
}
.table tbody tr.warning > td {
	background-color: #fcf8e3;
}
.table tbody tr.info > td {
	background-color: #d9edf7;
}
.table-hover tbody tr.success:hover > td {
	background-color: #d0e9c6;
}
.table-hover tbody tr.error:hover > td {
	background-color: #ebcccc;
}
.table-hover tbody tr.warning:hover > td {
	background-color: #faf2cc;
}
.table-hover tbody tr.info:hover > td {
	background-color: #c4e3f3;
}
.table-noheader {
	border-collapse: collapse;
}
.table-noheader thead {
	display: none;
}
.dropup,
.dropdown {
	position: relative;
}
.dropdown-toggle {
	*margin-bottom: -3px;
}
.dropdown-toggle:active,
.open .dropdown-toggle {
	outline: 0;
}
.caret {
	display: inline-block;
	width: 0;
	height: 0;
	vertical-align: top;
	border-top: 4px solid #000;
	border-right: 4px solid transparent;
	border-left: 4px solid transparent;
	content: "";
}
.dropdown .caret {
	margin-top: 8px;
	margin-left: 2px;
}
.dropdown-menu {
	position: absolute;
	top: 100%;
	left: 0;
	z-index: 1000;
	display: none;
	float: left;
	min-width: 160px;
	padding: 5px 0;
	margin: 2px 0 0;
	list-style: none;
	background-color: #fff;
	border: 1px solid #ccc;
	border: 1px solid rgba(0,0,0,0.2);
	*border-right-width: 2px;
	*border-bottom-width: 2px;
	-webkit-border-radius: 6px;
	-moz-border-radius: 6px;
	border-radius: 6px;
	-webkit-box-shadow: 0 5px 10px rgba(0,0,0,0.2);
	-moz-box-shadow: 0 5px 10px rgba(0,0,0,0.2);
	box-shadow: 0 5px 10px rgba(0,0,0,0.2);
	-webkit-background-clip: padding-box;
	-moz-background-clip: padding;
	background-clip: padding-box;
}
.dropdown-menu.pull-right {
	right: 0;
	left: auto;
}
.dropdown-menu .divider {
	*width: 100%;
	height: 1px;
	margin: 8px 1px;
	*margin: -5px 0 5px;
	overflow: hidden;
	background-color: #F0F0F0;
	border-bottom: 1px solid #fff;
}
.dropdown-menu .menuitem-group {
	margin: 4px 1px;
	overflow: hidden;
	border-top: 1px solid #eee;
	border-bottom: 1px solid #eee;
	background-color: #eee;
	color: #555;
	text-transform: capitalize;
	font-size: 95%;
	padding: 3px 20px;
}
.dropdown-menu > li > a {
	display: block;
	padding: 3px 20px;
	clear: both;
	font-weight: normal;
	line-height: 18px;
	color: #333;
	white-space: nowrap;
}
.dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus,
.dropdown-submenu:hover > a,
.dropdown-submenu:focus > a {
	text-decoration: none;
	color: #fff;
	background-color: #2d6ca2;
	background-image: -moz-linear-gradient(top,#3071a9,#2a6496);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#3071a9),to(#2a6496));
	background-image: -webkit-linear-gradient(top,#3071a9,#2a6496);
	background-image: -o-linear-gradient(top,#3071a9,#2a6496);
	background-image: linear-gradient(to bottom,#3071a9,#2a6496);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2f70a9', endColorstr='#ff296395', GradientType=0);
}
.dropdown-menu > .active > a,
.dropdown-menu > .active > a:hover,
.dropdown-menu > .active > a:focus {
	color: #333;
	text-decoration: none;
	outline: 0;
	background-color: #2d6ca2;
	background-image: -moz-linear-gradient(top,#3071a9,#2a6496);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#3071a9),to(#2a6496));
	background-image: -webkit-linear-gradient(top,#3071a9,#2a6496);
	background-image: -o-linear-gradient(top,#3071a9,#2a6496);
	background-image: linear-gradient(to bottom,#3071a9,#2a6496);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2f70a9', endColorstr='#ff296395', GradientType=0);
}
.dropdown-menu > .disabled > a,
.dropdown-menu > .disabled > a:hover,
.dropdown-menu > .disabled > a:focus {
	color: #999;
}
.dropdown-menu > .disabled > a:hover,
.dropdown-menu > .disabled > a:focus {
	text-decoration: none;
	background-color: transparent;
	background-image: none;
	filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
	cursor: default;
}
.open {
	*z-index: 1000;
}
.open > .dropdown-menu {
	display: block;
}
.dropdown-backdrop {
	position: fixed;
	left: 0;
	right: 0;
	bottom: 0;
	top: 0;
	z-index: 990;
}
.pull-right > .dropdown-menu {
	right: 0;
	left: auto;
}
.dropup .caret,
.navbar-fixed-bottom .dropdown .caret {
	border-top: 0;
	border-bottom: 4px solid #000;
	content: "";
}
.dropup .dropdown-menu,
.navbar-fixed-bottom .dropdown .dropdown-menu {
	top: auto;
	bottom: 100%;
	margin-bottom: 1px;
}
.dropdown-submenu {
	position: relative;
}
.dropdown-submenu > .dropdown-menu {
	top: 0;
	left: 100%;
	margin-top: -6px;
	margin-left: -1px;
	-webkit-border-radius: 6px 6px 6px 6px;
	-moz-border-radius: 6px 6px 6px 6px;
	border-radius: 6px 6px 6px 6px;
}
.dropdown-submenu:hover > .dropdown-menu {
	display: block;
}
.dropup .dropdown-submenu > .dropdown-menu {
	top: auto;
	bottom: 0;
	margin-top: 0;
	margin-bottom: -2px;
	-webkit-border-radius: 5px 5px 5px 0;
	-moz-border-radius: 5px 5px 5px 0;
	border-radius: 5px 5px 5px 0;
}
.dropdown-submenu > a:after {
	display: block;
	content: " ";
	float: right;
	width: 0;
	height: 0;
	border-color: transparent;
	border-style: solid;
	border-width: 5px 0 5px 5px;
	border-left-color: #cccccc;
	margin-top: 5px;
	margin-right: -10px;
}
.dropdown-submenu:hover > a:after {
	border-left-color: #fff;
}
.dropdown-submenu.pull-left {
	float: none;
}
.dropdown-submenu.pull-left > .dropdown-menu {
	left: -100%;
	margin-left: 10px;
	-webkit-border-radius: 6px 0 6px 6px;
	-moz-border-radius: 6px 0 6px 6px;
	border-radius: 6px 0 6px 6px;
}
.dropdown .dropdown-menu .nav-header {
	padding-left: 20px;
	padding-right: 20px;
}
.typeahead {
	z-index: 1051;
	margin-top: 2px;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.well {
	min-height: 20px;
	padding: 19px;
	margin-bottom: 20px;
	background-color: #F0F0F0;
	border: 1px solid #F0F0F0;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.well blockquote {
	border-color: #f0f0f0;
	border-color: rgba(0,0,0,0.15);
}
.well-large {
	padding: 24px;
	-webkit-border-radius: 6px;
	-moz-border-radius: 6px;
	border-radius: 6px;
}
.well-small {
	padding: 9px;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.fade {
	opacity: 0;
	-webkit-transition: opacity .15s linear;
	-moz-transition: opacity .15s linear;
	-o-transition: opacity .15s linear;
	transition: opacity .15s linear;
}
.fade.in {
	opacity: 1;
}
.collapse {
	position: relative;
	height: 0;
	overflow: hidden;
	-webkit-transition: height .35s ease;
	-moz-transition: height .35s ease;
	-o-transition: height .35s ease;
	transition: height .35s ease;
}
.collapse.in {
	height: auto;
}
.close {
	float: right;
	font-size: 20px;
	font-weight: bold;
	line-height: 18px;
	color: #000;
	text-shadow: 0 1px 0 #ffffff;
	opacity: 0.2;
	filter: alpha(opacity=20);
}
.close:hover,
.close:focus {
	color: #000;
	text-decoration: none;
	cursor: pointer;
	opacity: 0.4;
	filter: alpha(opacity=40);
}
button.close {
	padding: 3;
	cursor: pointer;
	background: transparent;
	border: 0;
	-webkit-appearance: none;
}
.alert-options {
	float: right;
	line-height: 18px;
	color: #000;
	text-shadow: 0 1px 0 #ffffff;
	opacity: 0.2;
	filter: alpha(opacity=20);
}
.alert-options:hover,
.alert-options:focus {
	color: #000;
	text-decoration: none;
	cursor: pointer;
	opacity: 0.4;
	filter: alpha(opacity=40);
}
.btn {
	display: inline-block;
	*display: inline;
	*zoom: 1;
	padding: 4px 12px;
	margin-bottom: 0;
	font-size: 13px;
	line-height: 18px;
	text-align: center;
	vertical-align: middle;
	cursor: pointer;
	background-color: #f3f3f3;
	color: #333;
	border: 1px solid #b3b3b3;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
	box-shadow: 0 1px 2px rgba(0,0,0,0.05);
}
.btn:hover,
.btn:focus {
	background-color: #e6e6e6;
	text-decoration: none;
	text-shadow: none;
}
.btn:focus {
	outline: thin dotted #333;
	outline: 5px auto -webkit-focus-ring-color;
	outline-offset: -2px;
}
.btn.active,
.btn:active {
	background-image: none;
	outline: 0;
}
.btn.disabled,
.btn[disabled] {
	cursor: default;
	background-image: none;
	opacity: 0.65;
	filter: alpha(opacity=65);
	-webkit-box-shadow: none;
	-moz-box-shadow: none;
	box-shadow: none;
}
.btn-large {
	padding: 11px 19px;
	font-size: 16.25px;
	-webkit-border-radius: 6px;
	-moz-border-radius: 6px;
	border-radius: 6px;
}
.btn-large [class^="icon-"],
.btn-large [class*=" icon-"] {
	margin-top: 4px;
}
.btn-small {
	padding: 2px 10px;
	font-size: 12px;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.btn-small [class^="icon-"],
.btn-small [class*=" icon-"] {
	margin-top: 0;
}
.btn-mini [class^="icon-"],
.btn-mini [class*=" icon-"] {
	margin-top: -1px;
}
.btn-mini {
	padding: 0 6px;
	font-size: 9.75px;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.btn-block {
	display: block;
	width: 100%;
	padding-left: 0;
	padding-right: 0;
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
}
.btn-block + .btn-block {
	margin-top: 5px;
}
input[type="submit"].btn-block,
input[type="reset"].btn-block,
input[type="button"].btn-block {
	width: 100%;
}
.btn-primary,
.btn-warning,
.btn-danger,
.btn-success,
.btn-info,
.btn-inverse {
	box-shadow: 0 1px 2px rgba(0,0,0,0.05);
}
.btn-primary {
	border: 1px solid #15497c;
	border: 1px solid rgba(0,0,0,0.2);
	color: #fff;
	background-color: #2384d3;
}
.btn-primary:hover,
.btn-primary:focus {
	background-color: #185b91;
	color: #fff;
	text-decoration: none;
}
.btn-warning {
	border: 1px solid #f89406;
	border: 1px solid rgba(0,0,0,0.2);
	color: #fff;
	background-color: #f89406;
}
.btn-warning:hover,
.btn-warning:focus {
	background-color: #ad6704;
	color: #fff;
	text-decoration: none;
	text-shadow: none;
}
.btn-danger {
	border: 1px solid #bd362f;
	border: 1px solid rgba(0,0,0,0.2);
	color: #fff;
	background-color: #bd362f;
}
.btn-danger:hover,
.btn-danger:focus {
	background-color: #802420;
	color: #fff;
	text-decoration: none;
}
.btn-success {
	border: 1px solid #378137;
	border: 1px solid rgba(0,0,0,0.2);
	color: #fff;
	background-color: #46a546;
}
.btn-success:hover,
.btn-success:focus {
	background-color: #2f6f2f;
	color: #fff;
	text-decoration: none;
}
.btn-info {
	border: 1px solid #2f96b4;
	border: 1px solid rgba(0,0,0,0.2);
	color: #fff;
	background-color: #2f96b4;
}
.btn-info:hover,
.btn-info:focus {
	background-color: #1f6377;
	color: #fff;
	text-decoration: none;
}
.btn-inverse {
	border: 1px solid #444;
	border: 1px solid rgba(0,0,0,0.2);
	color: #fff;
	background-color: #444;
}
.btn-inverse:hover,
.btn-inverse:focus {
	background-color: #1e1e1e;
	color: #fff;
	text-decoration: none;
}
button.btn,
input[type="submit"].btn {
	*padding-top: 3px;
	*padding-bottom: 3px;
}
button.btn::-moz-focus-inner,
input[type="submit"].btn::-moz-focus-inner {
	padding: 0;
	border: 0;
}
button.btn.btn-large,
input[type="submit"].btn.btn-large {
	*padding-top: 7px;
	*padding-bottom: 7px;
}
button.btn.btn-small,
input[type="submit"].btn.btn-small {
	*padding-top: 3px;
	*padding-bottom: 3px;
}
button.btn.btn-mini,
input[type="submit"].btn.btn-mini {
	*padding-top: 1px;
	*padding-bottom: 1px;
}
.btn-link,
.btn-link:active,
.btn-link[disabled] {
	background-color: transparent;
	background-image: none;
	-webkit-box-shadow: none;
	-moz-box-shadow: none;
	box-shadow: none;
}
.btn-link {
	border-color: transparent;
	cursor: pointer;
	color: #3071a9;
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.btn-link:hover,
.btn-link:focus {
	color: #1f496e;
	text-decoration: underline;
	background-color: transparent;
}
.btn-link[disabled]:hover,
.btn-link[disabled]:focus {
	color: #333;
	text-decoration: none;
}
.btn-group {
	position: relative;
	display: inline-block;
	*display: inline;
	*zoom: 1;
	font-size: 0;
	vertical-align: middle;
	white-space: nowrap;
	*margin-left: .3em;
}
.btn-group:first-child {
	*margin-left: 0;
}
.btn-group .btn + .btn {
	margin-left: -1px;
}
.btn-group + .btn-group {
	margin-left: 5px;
}
.btn-toolbar {
	font-size: 0;
	margin-top: 9px;
	margin-bottom: 9px;
}
.btn-toolbar > .btn + .btn,
.btn-toolbar > .btn-group + .btn,
.btn-toolbar > .btn + .btn-group {
	margin-left: 5px;
}
.btn-group > .btn {
	position: relative;
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.btn-group > .btn-micro {
	margin-left: -1px;
}
.btn-group > .btn,
.btn-group > .dropdown-menu,
.btn-group > .popover {
	font-size: 13px;
}
.btn-group > .btn-mini {
	font-size: 9.75px;
}
.btn-group > .btn-small {
	font-size: 12px;
}
.btn-group > .btn-large {
	font-size: 16.25px;
}
.btn-group > .btn:first-child {
	margin-left: 0;
	-webkit-border-top-left-radius: 3px;
	-moz-border-radius-topleft: 3px;
	border-top-left-radius: 3px;
	-webkit-border-bottom-left-radius: 3px;
	-moz-border-radius-bottomleft: 3px;
	border-bottom-left-radius: 3px;
}
.btn-group > .btn:last-child,
.btn-group > .dropdown-toggle {
	-webkit-border-top-right-radius: 3px;
	-moz-border-radius-topright: 3px;
	border-top-right-radius: 3px;
	-webkit-border-bottom-right-radius: 3px;
	-moz-border-radius-bottomright: 3px;
	border-bottom-right-radius: 3px;
}
.btn-group > .btn.large:first-child {
	margin-left: 0;
	-webkit-border-top-left-radius: 6px;
	-moz-border-radius-topleft: 6px;
	border-top-left-radius: 6px;
	-webkit-border-bottom-left-radius: 6px;
	-moz-border-radius-bottomleft: 6px;
	border-bottom-left-radius: 6px;
}
.btn-group > .btn.large:last-child,
.btn-group > .large.dropdown-toggle {
	-webkit-border-top-right-radius: 6px;
	-moz-border-radius-topright: 6px;
	border-top-right-radius: 6px;
	-webkit-border-bottom-right-radius: 6px;
	-moz-border-radius-bottomright: 6px;
	border-bottom-right-radius: 6px;
}
.btn-group > .btn:hover,
.btn-group > .btn:focus,
.btn-group > .btn:active,
.btn-group > .btn.active {
	z-index: 2;
}
.btn-group .dropdown-toggle:active,
.btn-group.open .dropdown-toggle {
	outline: 0;
}
.btn-group > .btn + .dropdown-toggle {
	padding-left: 8px;
	padding-right: 8px;
	*padding-top: 5px;
	*padding-bottom: 5px;
}
.btn-group > .btn-mini + .dropdown-toggle {
	padding-left: 5px;
	padding-right: 5px;
	*padding-top: 2px;
	*padding-bottom: 2px;
}
.btn-group > .btn-small + .dropdown-toggle {
	*padding-top: 5px;
	*padding-bottom: 4px;
}
.btn-group > .btn-large + .dropdown-toggle {
	padding-left: 12px;
	padding-right: 12px;
	*padding-top: 7px;
	*padding-bottom: 7px;
}
.btn-group.open .dropdown-toggle {
	background-image: none;
}
.btn-group.open .btn.dropdown-toggle {
	background-color: #e6e6e6;
}
.btn-group.open .btn-primary.dropdown-toggle {
	background-color: #15497c;
}
.btn-group.open .btn-warning.dropdown-toggle {
	background-color: #c67605;
}
.btn-group.open .btn-danger.dropdown-toggle {
	background-color: #942a25;
}
.btn-group.open .btn-success.dropdown-toggle {
	background-color: #378137;
}
.btn-group.open .btn-info.dropdown-toggle {
	background-color: #24748c;
}
.btn-group.open .btn-inverse.dropdown-toggle {
	background-color: #222;
}
.btn .caret {
	margin-top: 8px;
	margin-left: 0;
}
.btn-large .caret {
	margin-top: 6px;
}
.btn-large .caret {
	border-left-width: 5px;
	border-right-width: 5px;
	border-top-width: 5px;
}
.btn-mini .caret,
.btn-small .caret {
	margin-top: 8px;
}
.dropup .btn-large .caret {
	border-bottom-width: 5px;
}
.btn-primary .caret {
	border-top-color: #1f496e;
	border-bottom-color: #1f496e;
}
.btn-warning .caret,
.btn-danger .caret,
.btn-info .caret,
.btn-success .caret,
.btn-inverse .caret {
	border-top-color: #fff;
	border-bottom-color: #fff;
}
.btn-group-vertical {
	display: inline-block;
	*display: inline;
	*zoom: 1;
}
.btn-group-vertical > .btn {
	display: block;
	float: none;
	max-width: 100%;
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.btn-group-vertical > .btn + .btn {
	margin-left: 0;
	margin-top: -1px;
}
.btn-group-vertical > .btn:first-child {
	-webkit-border-radius: 3px 3px 0 0;
	-moz-border-radius: 3px 3px 0 0;
	border-radius: 3px 3px 0 0;
}
.btn-group-vertical > .btn:last-child {
	-webkit-border-radius: 0 0 3px 3px;
	-moz-border-radius: 0 0 3px 3px;
	border-radius: 0 0 3px 3px;
}
.btn-group-vertical > .btn-large:first-child {
	-webkit-border-radius: 6px 6px 0 0;
	-moz-border-radius: 6px 6px 0 0;
	border-radius: 6px 6px 0 0;
}
.btn-group-vertical > .btn-large:last-child {
	-webkit-border-radius: 0 0 6px 6px;
	-moz-border-radius: 0 0 6px 6px;
	border-radius: 0 0 6px 6px;
}
.alert {
	padding: 8px 35px 8px 14px;
	margin-bottom: 18px;
	text-shadow: 0 1px 0 rgba(255,255,255,0.5);
	background-color: #fcf8e3;
	border: 1px solid #faebcc;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.alert,
.alert h4 {
	color: #8a6d3b;
}
.alert h4 {
	margin: 0 0 .5em;
}
.alert .close {
	position: relative;
	top: -2px;
	right: -21px;
	line-height: 18px;
	cursor: pointer;
}
.alert-success {
	background-color: #dff0d8;
	border-color: #d6e9c6;
	color: #3c763d;
}
.alert-success h4 {
	color: #3c763d;
}
.alert-danger,
.alert-error {
	background-color: #f2dede;
	border-color: #ebccd1;
	color: #a94442;
}
.alert-danger h4,
.alert-error h4 {
	color: #a94442;
}
.alert-info {
	background-color: #d9edf7;
	border-color: #bce8f1;
	color: #31708f;
}
.alert-info h4 {
	color: #31708f;
}
.alert-block {
	padding-top: 14px;
	padding-bottom: 14px;
}
.alert-block > p,
.alert-block > ul {
	margin-bottom: 0;
}
.alert-block p + p {
	margin-top: 5px;
}
.nav {
	margin-left: 0;
	margin-bottom: 18px;
	list-style: none;
}
.nav > li > a {
	display: block;
}
.nav > li > a:hover,
.nav > li > a:focus {
	text-decoration: none;
	background-color: #eee;
}
.nav > li > a > img {
	max-width: none;
}
.nav > .pull-right {
	float: right;
}
.nav-header {
	display: block;
	padding: 3px 15px;
	font-size: 11px;
	font-weight: bold;
	line-height: 18px;
	color: #999;
	text-shadow: 0 1px 0 rgba(255,255,255,0.5);
	text-transform: uppercase;
}
.nav li + .nav-header {
	margin-top: 9px;
}
.nav-list {
	padding-left: 15px;
	padding-right: 15px;
	margin-bottom: 0;
}
.nav-list > li > a,
.nav-list .nav-header {
	margin-left: -15px;
	margin-right: -15px;
	text-shadow: 0 1px 0 rgba(255,255,255,0.5);
}
.nav-list > li > a {
	padding: 3px 15px;
}
.nav-list > .active > a,
.nav-list > .active > a:hover,
.nav-list > .active > a:focus {
	color: #fff;
	text-shadow: 0 -1px 0 rgba(0,0,0,0.2);
	background-color: #3071a9;
}
.nav-list [class^="icon-"],
.nav-list [class*=" icon-"] {
	margin-right: 2px;
}
.nav-list .divider {
	*width: 100%;
	height: 1px;
	margin: 8px 1px;
	*margin: -5px 0 5px;
	overflow: hidden;
	background-color: #e5e5e5;
	border-bottom: 1px solid #fff;
}
.nav-tabs,
.nav-pills {
	*zoom: 1;
}
.nav-tabs:before,
.nav-tabs:after,
.nav-pills:before,
.nav-pills:after {
	display: table;
	content: "";
	line-height: 0;
}
.nav-tabs:after,
.nav-pills:after {
	clear: both;
}
.nav-tabs > li,
.nav-pills > li {
	float: left;
}
.nav-tabs > li > a,
.nav-pills > li > a {
	padding-right: 12px;
	padding-left: 12px;
	margin-right: 2px;
	line-height: 14px;
}
.nav-tabs {
	border-bottom: 1px solid #ddd;
}
.nav-tabs > li {
	margin-bottom: -1px;
}
.nav-tabs > li > a {
	padding-top: 8px;
	padding-bottom: 8px;
	line-height: 18px;
	border: 1px solid transparent;
	-webkit-border-radius: 4px 4px 0 0;
	-moz-border-radius: 4px 4px 0 0;
	border-radius: 4px 4px 0 0;
}
.nav-tabs > li > a:hover,
.nav-tabs > li > a:focus {
	border-color: #eee #eee #ddd;
}
.nav-tabs > .active > a,
.nav-tabs > .active > a:hover,
.nav-tabs > .active > a:focus {
	color: #555;
	background-color: #fff;
	border: 1px solid #ddd;
	border-bottom-color: transparent;
	cursor: default;
}
.nav-pills > li > a {
	padding-top: 8px;
	padding-bottom: 8px;
	margin-top: 2px;
	margin-bottom: 2px;
	-webkit-border-radius: 5px;
	-moz-border-radius: 5px;
	border-radius: 5px;
}
.nav-pills > .active > a,
.nav-pills > .active > a:hover,
.nav-pills > .active > a:focus {
	color: #fff;
	background-color: #3071a9;
}
.nav-stacked > li {
	float: none;
}
.nav-stacked > li > a {
	margin-right: 0;
}
.nav-tabs.nav-stacked {
	border-bottom: 0;
}
.nav-tabs.nav-stacked > li > a {
	border: 1px solid #ddd;
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.nav-tabs.nav-stacked > li:first-child > a {
	-webkit-border-top-right-radius: 4px;
	-moz-border-radius-topright: 4px;
	border-top-right-radius: 4px;
	-webkit-border-top-left-radius: 4px;
	-moz-border-radius-topleft: 4px;
	border-top-left-radius: 4px;
}
.nav-tabs.nav-stacked > li:last-child > a {
	-webkit-border-bottom-right-radius: 4px;
	-moz-border-radius-bottomright: 4px;
	border-bottom-right-radius: 4px;
	-webkit-border-bottom-left-radius: 4px;
	-moz-border-radius-bottomleft: 4px;
	border-bottom-left-radius: 4px;
}
.nav-tabs.nav-stacked > li > a:hover,
.nav-tabs.nav-stacked > li > a:focus {
	border-color: #ddd;
	z-index: 2;
}
.nav-pills.nav-stacked > li > a {
	margin-bottom: 3px;
}
.nav-pills.nav-stacked > li:last-child > a {
	margin-bottom: 1px;
}
.nav-tabs .dropdown-menu {
	-webkit-border-radius: 0 0 6px 6px;
	-moz-border-radius: 0 0 6px 6px;
	border-radius: 0 0 6px 6px;
}
.nav-pills .dropdown-menu {
	-webkit-border-radius: 6px;
	-moz-border-radius: 6px;
	border-radius: 6px;
}
.nav .dropdown-toggle .caret {
	border-top-color: #3071a9;
	border-bottom-color: #3071a9;
	margin-top: 6px;
}
.nav .dropdown-toggle:hover .caret,
.nav .dropdown-toggle:focus .caret {
	border-top-color: #1f496e;
	border-bottom-color: #1f496e;
}
.nav-tabs .dropdown-toggle .caret {
	margin-top: 8px;
}
.nav .active .dropdown-toggle .caret {
	border-top-color: #fff;
	border-bottom-color: #fff;
}
.nav-tabs .active .dropdown-toggle .caret {
	border-top-color: #555;
	border-bottom-color: #555;
}
.nav > .dropdown.active > a:hover,
.nav > .dropdown.active > a:focus {
	cursor: pointer;
}
.nav-tabs .open .dropdown-toggle,
.nav-pills .open .dropdown-toggle,
.nav > li.dropdown.open.active > a:hover,
.nav > li.dropdown.open.active > a:focus {
	color: #fff;
	background-color: #999;
	border-color: #999;
}
.nav li.dropdown.open .caret,
.nav li.dropdown.open.active .caret,
.nav li.dropdown.open a:hover .caret,
.nav li.dropdown.open a:focus .caret {
	border-top-color: #fff;
	border-bottom-color: #fff;
	opacity: 1;
	filter: alpha(opacity=100);
}
.tabs-stacked .open > a:hover,
.tabs-stacked .open > a:focus {
	border-color: #999;
}
.tabbable {
	*zoom: 1;
}
.tabbable:before,
.tabbable:after {
	display: table;
	content: "";
	line-height: 0;
}
.tabbable:after {
	clear: both;
}
.tab-content {
	overflow: auto;
}
.tabs-below > .nav-tabs,
.tabs-right > .nav-tabs,
.tabs-left > .nav-tabs {
	border-bottom: 0;
}
.tab-content > .tab-pane,
.pill-content > .pill-pane {
	display: none;
}
.tab-content > .active,
.pill-content > .active {
	display: block;
}
.tabs-below > .nav-tabs {
	border-top: 1px solid #ddd;
}
.tabs-below > .nav-tabs > li {
	margin-top: -1px;
	margin-bottom: 0;
}
.tabs-below > .nav-tabs > li > a {
	-webkit-border-radius: 0 0 4px 4px;
	-moz-border-radius: 0 0 4px 4px;
	border-radius: 0 0 4px 4px;
}
.tabs-below > .nav-tabs > li > a:hover,
.tabs-below > .nav-tabs > li > a:focus {
	border-bottom-color: transparent;
	border-top-color: #ddd;
}
.tabs-below > .nav-tabs > .active > a,
.tabs-below > .nav-tabs > .active > a:hover,
.tabs-below > .nav-tabs > .active > a:focus {
	border-color: transparent #ddd #ddd #ddd;
}
.tabs-left > .nav-tabs > li,
.tabs-right > .nav-tabs > li {
	float: none;
}
.tabs-left > .nav-tabs > li > a,
.tabs-right > .nav-tabs > li > a {
	min-width: 74px;
	margin-right: 0;
	margin-bottom: 3px;
}
.tabs-left > .nav-tabs {
	float: left;
	margin-right: 19px;
	border-right: 1px solid #ddd;
}
.tabs-left > .nav-tabs > li > a {
	margin-right: -1px;
	-webkit-border-radius: 4px 0 0 4px;
	-moz-border-radius: 4px 0 0 4px;
	border-radius: 4px 0 0 4px;
}
.tabs-left > .nav-tabs > li > a:hover,
.tabs-left > .nav-tabs > li > a:focus {
	border-color: #eee #ddd #eee #eee;
}
.tabs-left > .nav-tabs .active > a,
.tabs-left > .nav-tabs .active > a:hover,
.tabs-left > .nav-tabs .active > a:focus {
	border-color: #ddd transparent #ddd #ddd;
	*border-right-color: #fff;
}
.tabs-right > .nav-tabs {
	float: right;
	margin-left: 19px;
	border-left: 1px solid #ddd;
}
.tabs-right > .nav-tabs > li > a {
	margin-left: -1px;
	-webkit-border-radius: 0 4px 4px 0;
	-moz-border-radius: 0 4px 4px 0;
	border-radius: 0 4px 4px 0;
}
.tabs-right > .nav-tabs > li > a:hover,
.tabs-right > .nav-tabs > li > a:focus {
	border-color: #eee #eee #eee #ddd;
}
.tabs-right > .nav-tabs .active > a,
.tabs-right > .nav-tabs .active > a:hover,
.tabs-right > .nav-tabs .active > a:focus {
	border-color: #ddd #ddd #ddd transparent;
	*border-left-color: #fff;
}
.nav > .disabled > a {
	color: #999;
}
.nav > .disabled > a:hover,
.nav > .disabled > a:focus {
	text-decoration: none;
	background-color: transparent;
	cursor: default;
}
.navbar {
	overflow: visible;
	margin-bottom: 18px;
	*position: relative;
	*z-index: 2;
}
.navbar-inner {
	min-height: 40px;
	padding-left: 20px;
	padding-right: 20px;
	background-color: #fafafa;
	background-image: -moz-linear-gradient(top,#ffffff,#f2f2f2);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#ffffff),to(#f2f2f2));
	background-image: -webkit-linear-gradient(top,#ffffff,#f2f2f2);
	background-image: -o-linear-gradient(top,#ffffff,#f2f2f2);
	background-image: linear-gradient(to bottom,#ffffff,#f2f2f2);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);
	border: 1px solid #d4d4d4;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
	-webkit-box-shadow: 0 1px 4px rgba(0,0,0,0.065);
	-moz-box-shadow: 0 1px 4px rgba(0,0,0,0.065);
	box-shadow: 0 1px 4px rgba(0,0,0,0.065);
	*zoom: 1;
}
.navbar-inner:before,
.navbar-inner:after {
	display: table;
	content: "";
	line-height: 0;
}
.navbar-inner:after {
	clear: both;
}
.navbar .container {
	width: auto;
}
.nav-collapse.collapse {
	height: auto;
	overflow: visible;
}
.navbar .brand {
	float: left;
	display: block;
	padding: 11px 20px 11px;
	margin-left: -20px;
	font-size: 20px;
	font-weight: 200;
	color: #555;
	text-shadow: 0 1px 0 #ffffff;
}
.navbar .brand:hover,
.navbar .brand:focus {
	text-decoration: none;
}
.navbar-text {
	margin-bottom: 0;
	line-height: 40px;
	color: #555;
}
.navbar-link {
	color: #555;
}
.navbar-link:hover,
.navbar-link:focus {
	color: #333;
}
.navbar .divider-vertical {
	height: 40px;
	margin: 0 9px;
	border-left: 1px solid #f2f2f2;
	border-right: 1px solid #ffffff;
}
.navbar .btn,
.navbar .btn-group {
	margin-top: 5px;
}
.navbar .btn-group .btn,
.navbar .input-prepend .btn,
.navbar .input-append .btn,
.navbar .input-prepend .btn-group,
.navbar .input-append .btn-group {
	margin-top: 0;
}
.navbar-form {
	margin-bottom: 0;
	*zoom: 1;
}
.navbar-form:before,
.navbar-form:after {
	display: table;
	content: "";
	line-height: 0;
}
.navbar-form:after {
	clear: both;
}
.navbar-form input,
.navbar-form select,
.navbar-form .radio,
.navbar-form .checkbox {
	margin-top: 5px;
}
.navbar-form input,
.navbar-form select,
.navbar-form .btn {
	display: inline-block;
	margin-bottom: 0;
}
.navbar-form input[type="image"],
.navbar-form input[type="checkbox"],
.navbar-form input[type="radio"] {
	margin-top: 3px;
}
.navbar-form .input-append,
.navbar-form .input-prepend {
	margin-top: 5px;
	white-space: nowrap;
}
.navbar-form .input-append input,
.navbar-form .input-prepend input {
	margin-top: 0;
}
.navbar-search {
	position: relative;
	float: left;
	margin-top: 5px;
	margin-bottom: 0;
}
.navbar-search .search-query {
	margin-bottom: 0;
	padding: 4px 14px;
	font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
	font-size: 13px;
	font-weight: normal;
	line-height: 1;
	-webkit-border-radius: 15px;
	-moz-border-radius: 15px;
	border-radius: 15px;
}
.navbar-static-top {
	position: static;
	margin-bottom: 0;
}
.navbar-static-top .navbar-inner {
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.navbar-fixed-top,
.navbar-fixed-bottom {
	position: fixed;
	right: 0;
	left: 0;
	z-index: 1030;
	margin-bottom: 0;
}
.navbar-fixed-top .navbar-inner,
.navbar-static-top .navbar-inner {
	border-width: 0 0 1px;
}
.navbar-fixed-bottom .navbar-inner {
	border-width: 1px 0 0;
}
.navbar-fixed-top .navbar-inner,
.navbar-fixed-bottom .navbar-inner {
	padding-left: 0;
	padding-right: 0;
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.navbar-static-top .container,
.navbar-fixed-top .container,
.navbar-fixed-bottom .container {
	width: 940px;
}
.navbar-fixed-top {
	top: 0;
}
.navbar-fixed-top .navbar-inner,
.navbar-static-top .navbar-inner {
	-webkit-box-shadow: 0 1px 10px rgba(0,0,0,.1);
	-moz-box-shadow: 0 1px 10px rgba(0,0,0,.1);
	box-shadow: 0 1px 10px rgba(0,0,0,.1);
}
.navbar-fixed-bottom {
	bottom: 0;
}
.navbar-fixed-bottom .navbar-inner {
	-webkit-box-shadow: 0 -1px 10px rgba(0,0,0,.1);
	-moz-box-shadow: 0 -1px 10px rgba(0,0,0,.1);
	box-shadow: 0 -1px 10px rgba(0,0,0,.1);
}
.navbar .nav {
	position: relative;
	left: 0;
	display: block;
	float: left;
	margin: 0 10px 0 0;
}
.navbar .nav.pull-right {
	float: right;
	margin-right: 0;
}
.navbar .nav > li {
	float: left;
}
.navbar .nav > li > a {
	float: none;
	padding: 11px 15px 11px;
	color: #555;
	text-decoration: none;
	text-shadow: 0 1px 0 #ffffff;
}
.navbar .nav .dropdown-toggle .caret {
	margin-top: 8px;
}
.navbar .nav > li > a:focus,
.navbar .nav > li > a:hover {
	background-color: transparent;
	color: #333;
	text-decoration: none;
}
.navbar .nav > li > a:focus {
	outline: 2px solid #5e9ed6;
}
.navbar .nav > .active > a,
.navbar .nav > .active > a:hover,
.navbar .nav > .active > a:focus {
	color: #555;
	text-decoration: none;
	background-color: #e6e6e6;
	-webkit-box-shadow: inset 0 3px 8px rgba(0,0,0,0.125);
	-moz-box-shadow: inset 0 3px 8px rgba(0,0,0,0.125);
	box-shadow: inset 0 3px 8px rgba(0,0,0,0.125);
}
.navbar .btn-navbar {
	display: none;
	float: right;
	padding: 7px 10px;
	margin-left: 5px;
	margin-right: 5px;
	background-color: #f2f2f2;
	*background-color: #f2f2f2;
	-webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
	-moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
	box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
}
.navbar .btn-navbar:hover,
.navbar .btn-navbar:focus,
.navbar .btn-navbar:active,
.navbar .btn-navbar.active,
.navbar .btn-navbar.disabled,
.navbar .btn-navbar[disabled] {
	color: #fff;
	background-color: #d9d9d9;
	*background-color: #d9d9d9;
}
.navbar .btn-navbar:active,
.navbar .btn-navbar.active {
	background-color: #f2f2f2;
}
.navbar .btn-navbar .icon-bar {
	display: block;
	width: 18px;
	height: 2px;
	background-color: #f5f5f5;
	-webkit-border-radius: 1px;
	-moz-border-radius: 1px;
	border-radius: 1px;
	-webkit-box-shadow: 0 1px 0 rgba(0,0,0,0.25);
	-moz-box-shadow: 0 1px 0 rgba(0,0,0,0.25);
	box-shadow: 0 1px 0 rgba(0,0,0,0.25);
}
.btn-navbar .icon-bar + .icon-bar {
	margin-top: 3px;
}
.navbar .nav > li > .dropdown-menu:before {
	content: '';
	display: inline-block;
	border-left: 7px solid transparent;
	border-right: 7px solid transparent;
	border-bottom: 7px solid #ccc;
	border-bottom-color: rgba(0,0,0,0.2);
	position: absolute;
	top: -7px;
	left: 9px;
}
.navbar .nav > li > .dropdown-menu:after {
	content: '';
	display: inline-block;
	border-left: 6px solid transparent;
	border-right: 6px solid transparent;
	border-bottom: 6px solid #fff;
	position: absolute;
	top: -6px;
	left: 10px;
}
.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
	border-top: 7px solid #ccc;
	border-top-color: rgba(0,0,0,0.2);
	border-bottom: 0;
	bottom: -7px;
	top: auto;
}
.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
	border-top: 6px solid #fff;
	border-bottom: 0;
	bottom: -6px;
	top: auto;
}
.navbar .nav li.dropdown > a:hover .caret,
.navbar .nav li.dropdown > a:focus .caret {
	border-top-color: #333;
	border-bottom-color: #333;
}
.navbar .nav li.dropdown.open > .dropdown-toggle,
.navbar .nav li.dropdown.active > .dropdown-toggle,
.navbar .nav li.dropdown.open.active > .dropdown-toggle {
	background-color: #e6e6e6;
	color: #555;
}
.navbar .nav li.dropdown > .dropdown-toggle .caret {
	border-top-color: #555;
	border-bottom-color: #555;
}
.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
	border-top-color: #555;
	border-bottom-color: #555;
}
.navbar .pull-right > li > .dropdown-menu,
.navbar .nav > li > .dropdown-menu.pull-right {
	left: auto;
	right: 0;
}
.navbar .pull-right > li > .dropdown-menu:before,
.navbar .nav > li > .dropdown-menu.pull-right:before {
	left: auto;
	right: 12px;
}
.navbar .pull-right > li > .dropdown-menu:after,
.navbar .nav > li > .dropdown-menu.pull-right:after {
	left: auto;
	right: 13px;
}
.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
	left: auto;
	right: 100%;
	margin-left: 0;
	margin-right: -1px;
	-webkit-border-radius: 6px 0 6px 6px;
	-moz-border-radius: 6px 0 6px 6px;
	border-radius: 6px 0 6px 6px;
}
.navbar-inverse .navbar-inner {
	background-color: #13294a;
	background-image: -moz-linear-gradient(top,#152d53,#10223e);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#152d53),to(#10223e));
	background-image: -webkit-linear-gradient(top,#152d53,#10223e);
	background-image: -o-linear-gradient(top,#152d53,#10223e);
	background-image: linear-gradient(to bottom,#152d53,#10223e);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff142c52', endColorstr='#ff0f213e', GradientType=0);
	border-color: #0b172a;
}
.navbar-inverse .brand,
.navbar-inverse .nav > li > a {
	color: #d9d9d9;
	text-shadow: 0 -1px 0 rgba(0,0,0,0.25);
}
.navbar-inverse .brand:hover,
.navbar-inverse .brand:focus,
.navbar-inverse .nav > li > a:hover,
.navbar-inverse .nav > li > a:focus {
	color: #fff;
}
.navbar-inverse .brand {
	color: #d9d9d9;
}
.navbar-inverse .navbar-text {
	color: #d9d9d9;
}
.navbar-inverse .nav > li > a:focus,
.navbar-inverse .nav > li > a:hover {
	background-color: transparent;
	color: #fff;
}
.navbar-inverse .nav .active > a,
.navbar-inverse .nav .active > a:hover,
.navbar-inverse .nav .active > a:focus {
	color: #fff;
	background-color: #10223e;
}
.navbar-inverse .navbar-link {
	color: #d9d9d9;
}
.navbar-inverse .navbar-link:hover,
.navbar-inverse .navbar-link:focus {
	color: #fff;
}
.navbar-inverse .divider-vertical {
	border-left-color: #10223e;
	border-right-color: #152d53;
}
.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
	background-color: #10223e;
	color: #fff;
}
.navbar-inverse .nav li.dropdown > a:hover .caret,
.navbar-inverse .nav li.dropdown > a:focus .caret {
	border-top-color: #fff;
	border-bottom-color: #fff;
}
.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
	border-top-color: #d9d9d9;
	border-bottom-color: #d9d9d9;
}
.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
	border-top-color: #fff;
	border-bottom-color: #fff;
}
.navbar-inverse .navbar-search .search-query {
	color: #fff;
	background-color: #2959a4;
	border-color: #10223e;
	-webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
	-moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
	box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
	-webkit-transition: none;
	-moz-transition: none;
	-o-transition: none;
	transition: none;
}
.navbar-inverse .navbar-search .search-query:-moz-placeholder {
	color: #ccc;
}
.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
	color: #ccc;
}
.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
	color: #ccc;
}
.navbar-inverse .navbar-search .search-query:focus,
.navbar-inverse .navbar-search .search-query.focused {
	padding: 5px 15px;
	color: #333;
	text-shadow: 0 1px 0 #fff;
	background-color: #fff;
	border: 0;
	-webkit-box-shadow: 0 0 3px rgba(0,0,0,0.15);
	-moz-box-shadow: 0 0 3px rgba(0,0,0,0.15);
	box-shadow: 0 0 3px rgba(0,0,0,0.15);
	outline: 0;
}
.navbar-inverse .btn-navbar {
	background-color: #10223e;
	*background-color: #10223e;
}
.navbar-inverse .btn-navbar:hover,
.navbar-inverse .btn-navbar:focus,
.navbar-inverse .btn-navbar:active,
.navbar-inverse .btn-navbar.active,
.navbar-inverse .btn-navbar.disabled,
.navbar-inverse .btn-navbar[disabled] {
	color: #fff;
	background-color: #050c16;
	*background-color: #050c16;
}
.navbar-inverse .btn-navbar:active,
.navbar-inverse .btn-navbar.active {
	background-color: #10223e;
}
.breadcrumb {
	padding: 8px 15px;
	margin: 0 0 18px;
	list-style: none;
	background-color: #f5f5f5;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.breadcrumb > li {
	display: inline-block;
	*display: inline;
	*zoom: 1;
	text-shadow: 0 1px 0 #fff;
}
.breadcrumb > li > .divider {
	padding: 0 5px;
	color: #ccc;
}
.breadcrumb > .active {
	color: #999;
}
.pagination {
	margin: 18px 0;
}
.pagination ul {
	display: inline-block;
	*display: inline;
	*zoom: 1;
	margin-left: 0;
	margin-bottom: 0;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
	-webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.05);
	-moz-box-shadow: 0 1px 2px rgba(0,0,0,0.05);
	box-shadow: 0 1px 2px rgba(0,0,0,0.05);
}
.pagination ul > li {
	display: inline;
}
.pagination ul > li > a,
.pagination ul > li > span {
	float: left;
	padding: 4px 12px;
	line-height: 18px;
	text-decoration: none;
	background-color: #fff;
	border: 1px solid #ddd;
	border-left-width: 0;
}
.pagination ul > li > a:hover,
.pagination ul > li > a:focus,
.pagination ul > .active > a,
.pagination ul > .active > span {
	background-color: #F0F0F0;
}
.pagination ul > .active > a,
.pagination ul > .active > span {
	color: #999;
	cursor: default;
}
.pagination ul > .disabled > span,
.pagination ul > .disabled > a,
.pagination ul > .disabled > a:hover,
.pagination ul > .disabled > a:focus {
	color: #999;
	background-color: transparent;
	cursor: default;
}
.pagination ul > li:first-child > a,
.pagination ul > li:first-child > span {
	border-left-width: 1px;
	-webkit-border-top-left-radius: 3px;
	-moz-border-radius-topleft: 3px;
	border-top-left-radius: 3px;
	-webkit-border-bottom-left-radius: 3px;
	-moz-border-radius-bottomleft: 3px;
	border-bottom-left-radius: 3px;
}
.pagination ul > li:last-child > a,
.pagination ul > li:last-child > span {
	-webkit-border-top-right-radius: 3px;
	-moz-border-radius-topright: 3px;
	border-top-right-radius: 3px;
	-webkit-border-bottom-right-radius: 3px;
	-moz-border-radius-bottomright: 3px;
	border-bottom-right-radius: 3px;
}
.pagination-centered {
	text-align: center;
}
.pagination-right {
	text-align: right;
}
.pagination-large ul > li > a,
.pagination-large ul > li > span {
	padding: 11px 19px;
	font-size: 16.25px;
}
.pagination-large ul > li:first-child > a,
.pagination-large ul > li:first-child > span {
	-webkit-border-top-left-radius: 6px;
	-moz-border-radius-topleft: 6px;
	border-top-left-radius: 6px;
	-webkit-border-bottom-left-radius: 6px;
	-moz-border-radius-bottomleft: 6px;
	border-bottom-left-radius: 6px;
}
.pagination-large ul > li:last-child > a,
.pagination-large ul > li:last-child > span {
	-webkit-border-top-right-radius: 6px;
	-moz-border-radius-topright: 6px;
	border-top-right-radius: 6px;
	-webkit-border-bottom-right-radius: 6px;
	-moz-border-radius-bottomright: 6px;
	border-bottom-right-radius: 6px;
}
.pagination-mini ul > li:first-child > a,
.pagination-mini ul > li:first-child > span,
.pagination-small ul > li:first-child > a,
.pagination-small ul > li:first-child > span {
	-webkit-border-top-left-radius: 3px;
	-moz-border-radius-topleft: 3px;
	border-top-left-radius: 3px;
	-webkit-border-bottom-left-radius: 3px;
	-moz-border-radius-bottomleft: 3px;
	border-bottom-left-radius: 3px;
}
.pagination-mini ul > li:last-child > a,
.pagination-mini ul > li:last-child > span,
.pagination-small ul > li:last-child > a,
.pagination-small ul > li:last-child > span {
	-webkit-border-top-right-radius: 3px;
	-moz-border-radius-topright: 3px;
	border-top-right-radius: 3px;
	-webkit-border-bottom-right-radius: 3px;
	-moz-border-radius-bottomright: 3px;
	border-bottom-right-radius: 3px;
}
.pagination-small ul > li > a,
.pagination-small ul > li > span {
	padding: 2px 10px;
	font-size: 12px;
}
.pagination-mini ul > li > a,
.pagination-mini ul > li > span {
	padding: 0 6px;
	font-size: 9.75px;
}
.pager {
	margin: 18px 0;
	list-style: none;
	text-align: center;
	*zoom: 1;
}
.pager:before,
.pager:after {
	display: table;
	content: "";
	line-height: 0;
}
.pager:after {
	clear: both;
}
.pager li {
	display: inline;
}
.pager li > a,
.pager li > span {
	display: inline-block;
	padding: 5px 14px;
	background-color: #fff;
	border: 1px solid #ddd;
	-webkit-border-radius: 15px;
	-moz-border-radius: 15px;
	border-radius: 15px;
}
.pager li > a:hover,
.pager li > a:focus {
	text-decoration: none;
	background-color: #f5f5f5;
}
.pager .next > a,
.pager .next > span {
	float: right;
}
.pager .previous > a,
.pager .previous > span {
	float: left;
}
.pager .disabled > a,
.pager .disabled > a:hover,
.pager .disabled > a:focus,
.pager .disabled > span {
	color: #999;
	background-color: #fff;
	cursor: default;
}
.modal-backdrop {
	position: fixed;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;
	z-index: 1040;
	background-color: #000;
}
.modal-backdrop.fade {
	opacity: 0;
}
.modal-backdrop,
.modal-backdrop.fade.in {
	opacity: 0.8;
	filter: alpha(opacity=80);
}
.modal-header {
	padding: 9px 15px;
	border-bottom: 1px solid #eee;
}
.modal-header .close {
	margin-top: 2px;
}
.modal-header h3 {
	margin: 0;
	line-height: 30px;
}
.modal-body {
	width: 98%;
	position: relative;
	max-height: 400px;
	padding: 1%;
}
.modal-body iframe {
	width: 100%;
	max-height: none;
	border: 0 !important;
}
.modal-form {
	margin-bottom: 0;
}
.modal-footer {
	padding: 14px 15px 15px;
	margin-bottom: 0;
	text-align: right;
	background-color: #f5f5f5;
	border-top: 1px solid #ddd;
	-webkit-border-radius: 0 0 6px 6px;
	-moz-border-radius: 0 0 6px 6px;
	border-radius: 0 0 6px 6px;
	-webkit-box-shadow: inset 0 1px 0 #fff;
	-moz-box-shadow: inset 0 1px 0 #fff;
	box-shadow: inset 0 1px 0 #fff;
	*zoom: 1;
}
.modal-footer:before,
.modal-footer:after {
	display: table;
	content: "";
	line-height: 0;
}
.modal-footer:after {
	clear: both;
}
.modal-footer .btn + .btn {
	margin-left: 5px;
	margin-bottom: 0;
}
.modal-footer .btn-group .btn + .btn {
	margin-left: -1px;
}
.modal-footer .btn-block + .btn-block {
	margin-left: 0;
}
.tooltip {
	position: absolute;
	z-index: 1030;
	display: block;
	visibility: visible;
	font-size: 11px;
	line-height: 1.4;
	opacity: 0;
	filter: alpha(opacity=0);
}
.tooltip.in {
	opacity: 0.8;
	filter: alpha(opacity=80);
}
.tooltip.top {
	margin-top: -3px;
	padding: 5px 0;
}
.tooltip.right {
	margin-left: 3px;
	padding: 0 5px;
}
.tooltip.bottom {
	margin-top: 3px;
	padding: 5px 0;
}
.tooltip.left {
	margin-left: -3px;
	padding: 0 5px;
}
.tooltip-inner {
	max-width: 200px;
	padding: 8px;
	color: #fff;
	text-align: center;
	text-decoration: none;
	background-color: #000;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.tooltip-arrow {
	position: absolute;
	width: 0;
	height: 0;
	border-color: transparent;
	border-style: solid;
}
.tooltip.top .tooltip-arrow {
	bottom: 0;
	left: 50%;
	margin-left: -5px;
	border-width: 5px 5px 0;
	border-top-color: #000;
}
.tooltip.right .tooltip-arrow {
	top: 50%;
	left: 0;
	margin-top: -5px;
	border-width: 5px 5px 5px 0;
	border-right-color: #000;
}
.tooltip.left .tooltip-arrow {
	top: 50%;
	right: 0;
	margin-top: -5px;
	border-width: 5px 0 5px 5px;
	border-left-color: #000;
}
.tooltip.bottom .tooltip-arrow {
	top: 0;
	left: 50%;
	margin-left: -5px;
	border-width: 0 5px 5px;
	border-bottom-color: #000;
}
.popover {
	position: absolute;
	top: 0;
	left: 0;
	z-index: 1060;
	display: none;
	max-width: 276px;
	padding: 1px;
	text-align: left;
	background-color: #fff;
	-webkit-background-clip: padding-box;
	-moz-background-clip: padding;
	background-clip: padding-box;
	border: 1px solid #ccc;
	border: 1px solid rgba(0,0,0,0.2);
	-webkit-border-radius: 6px;
	-moz-border-radius: 6px;
	border-radius: 6px;
	-webkit-box-shadow: 0 5px 10px rgba(0,0,0,0.2);
	-moz-box-shadow: 0 5px 10px rgba(0,0,0,0.2);
	box-shadow: 0 5px 10px rgba(0,0,0,0.2);
	white-space: normal;
}
.popover.top {
	margin-top: -10px;
}
.popover.right {
	margin-left: 10px;
}
.popover.bottom {
	margin-top: 10px;
}
.popover.left {
	margin-left: -10px;
}
.popover-title {
	margin: 0;
	padding: 8px 14px;
	font-size: 14px;
	font-weight: normal;
	line-height: 18px;
	background-color: #f7f7f7;
	border-bottom: 1px solid #ebebeb;
	-webkit-border-radius: 5px 5px 0 0;
	-moz-border-radius: 5px 5px 0 0;
	border-radius: 5px 5px 0 0;
}
.popover-title:empty {
	display: none;
}
.popover-content {
	padding: 9px 14px;
}
.popover .arrow,
.popover .arrow:after {
	position: absolute;
	display: block;
	width: 0;
	height: 0;
	border-color: transparent;
	border-style: solid;
}
.popover .arrow {
	border-width: 11px;
}
.popover .arrow:after {
	border-width: 10px;
	content: "";
}
.popover.top .arrow {
	left: 50%;
	margin-left: -11px;
	border-bottom-width: 0;
	border-top-color: #999;
	border-top-color: rgba(0,0,0,0.25);
	bottom: -11px;
}
.popover.top .arrow:after {
	bottom: 1px;
	margin-left: -10px;
	border-bottom-width: 0;
	border-top-color: #fff;
}
.popover.right .arrow {
	top: 50%;
	left: -11px;
	margin-top: -11px;
	border-left-width: 0;
	border-right-color: #999;
	border-right-color: rgba(0,0,0,0.25);
}
.popover.right .arrow:after {
	left: 1px;
	bottom: -10px;
	border-left-width: 0;
	border-right-color: #fff;
}
.popover.bottom .arrow {
	left: 50%;
	margin-left: -11px;
	border-top-width: 0;
	border-bottom-color: #999;
	border-bottom-color: rgba(0,0,0,0.25);
	top: -11px;
}
.popover.bottom .arrow:after {
	top: 1px;
	margin-left: -10px;
	border-top-width: 0;
	border-bottom-color: #fff;
}
.popover.left .arrow {
	top: 50%;
	right: -11px;
	margin-top: -11px;
	border-right-width: 0;
	border-left-color: #999;
	border-left-color: rgba(0,0,0,0.25);
}
.popover.left .arrow:after {
	right: 1px;
	border-right-width: 0;
	border-left-color: #fff;
	bottom: -10px;
}
.thumbnails {
	margin-left: -20px;
	list-style: none;
	*zoom: 1;
}
.thumbnails:before,
.thumbnails:after {
	display: table;
	content: "";
	line-height: 0;
}
.thumbnails:after {
	clear: both;
}
.row-fluid .thumbnails {
	margin-left: 0;
}
.thumbnails > li {
	float: left;
	margin-bottom: 18px;
	margin-left: 20px;
}
.thumbnail {
	display: block;
	padding: 4px;
	line-height: 18px;
	border: 1px solid #ddd;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
	-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.055);
	-moz-box-shadow: 0 1px 3px rgba(0,0,0,0.055);
	box-shadow: 0 1px 3px rgba(0,0,0,0.055);
	-webkit-transition: all .2s ease-in-out;
	-moz-transition: all .2s ease-in-out;
	-o-transition: all .2s ease-in-out;
	transition: all .2s ease-in-out;
}
a.thumbnail:hover,
a.thumbnail:focus {
	border-color: #3071a9;
	-webkit-box-shadow: 0 1px 4px rgba(0,105,214,0.25);
	-moz-box-shadow: 0 1px 4px rgba(0,105,214,0.25);
	box-shadow: 0 1px 4px rgba(0,105,214,0.25);
}
.thumbnail > img {
	display: block;
	max-width: 100%;
	margin-left: auto;
	margin-right: auto;
}
.thumbnail .caption {
	padding: 9px;
	color: #555;
}
.media,
.media-body {
	overflow: hidden;
	*overflow: visible;
	zoom: 1;
}
.media,
.media .media {
	margin-top: 15px;
}
.media:first-child {
	margin-top: 0;
}
.media-object {
	display: block;
}
.media-heading {
	margin: 0 0 5px;
}
.media > .pull-left {
	margin-right: 10px;
}
.media > .pull-right {
	margin-left: 10px;
}
.media-list {
	margin-left: 0;
	list-style: none;
}
.label,
.badge {
	display: inline-block;
	padding: 2px 4px;
	font-size: 10.998px;
	font-weight: bold;
	line-height: 14px;
	color: #fff;
	vertical-align: baseline;
	white-space: nowrap;
	text-shadow: 0 -1px 0 rgba(0,0,0,0.25);
	background-color: #999;
}
.label {
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.badge {
	padding-left: 9px;
	padding-right: 9px;
	-webkit-border-radius: 9px;
	-moz-border-radius: 9px;
	border-radius: 9px;
}
.label:empty,
.badge:empty {
	display: none;
}
a.label:hover,
a.label:focus,
a.badge:hover,
a.badge:focus {
	color: #fff;
	text-decoration: none;
	cursor: pointer;
}
.label-important,
.badge-important {
	background-color: #a94442;
}
.label-important[href],
.badge-important[href] {
	background-color: #843534;
}
.label-warning,
.badge-warning {
	background-color: #f89406;
}
.label-warning[href],
.badge-warning[href] {
	background-color: #c67605;
}
.label-success,
.badge-success {
	background-color: #3c763d;
}
.label-success[href],
.badge-success[href] {
	background-color: #2b542c;
}
.label-info,
.badge-info {
	background-color: #31708f;
}
.label-info[href],
.badge-info[href] {
	background-color: #245269;
}
.label-inverse,
.badge-inverse {
	background-color: #333;
}
.label-inverse[href],
.badge-inverse[href] {
	background-color: #1a1a1a;
}
.btn .label,
.btn .badge {
	position: relative;
	top: -1px;
}
.btn-mini .label,
.btn-mini .badge {
	top: 0;
}
@-webkit-keyframes progress-bar-stripes {
	from {
		background-position: 40px 0;
	}
	to {
		background-position: 0 0;
	}
}
@-moz-keyframes progress-bar-stripes {
	from {
		background-position: 40px 0;
	}
	to {
		background-position: 0 0;
	}
}
@-ms-keyframes progress-bar-stripes {
	from {
		background-position: 40px 0;
	}
	to {
		background-position: 0 0;
	}
}
@-o-keyframes progress-bar-stripes {
	from {
		background-position: 0 0;
	}
	to {
		background-position: 40px 0;
	}
}
@keyframes progress-bar-stripes {
	from {
		background-position: 40px 0;
	}
	to {
		background-position: 0 0;
	}
}
.progress {
	overflow: hidden;
	height: 18px;
	margin-bottom: 18px;
	background-color: #f7f7f7;
	background-image: -moz-linear-gradient(top,#f5f5f5,#f9f9f9);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));
	background-image: -webkit-linear-gradient(top,#f5f5f5,#f9f9f9);
	background-image: -o-linear-gradient(top,#f5f5f5,#f9f9f9);
	background-image: linear-gradient(to bottom,#f5f5f5,#f9f9f9);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
	-webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,0.1);
	-moz-box-shadow: inset 0 1px 2px rgba(0,0,0,0.1);
	box-shadow: inset 0 1px 2px rgba(0,0,0,0.1);
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.progress .bar {
	width: 0%;
	height: 100%;
	color: #fff;
	float: left;
	font-size: 12px;
	text-align: center;
	text-shadow: 0 -1px 0 rgba(0,0,0,0.25);
	background-color: #0e90d2;
	background-image: -moz-linear-gradient(top,#149bdf,#0480be);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));
	background-image: -webkit-linear-gradient(top,#149bdf,#0480be);
	background-image: -o-linear-gradient(top,#149bdf,#0480be);
	background-image: linear-gradient(to bottom,#149bdf,#0480be);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
	-webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,0.15);
	-moz-box-shadow: inset 0 -1px 0 rgba(0,0,0,0.15);
	box-shadow: inset 0 -1px 0 rgba(0,0,0,0.15);
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
	-webkit-transition: width .6s ease;
	-moz-transition: width .6s ease;
	-o-transition: width .6s ease;
	transition: width .6s ease;
}
.progress .bar + .bar {
	-webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
	-moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
	box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
}
.progress-striped .bar {
	background-color: #149bdf;
	background-image: -webkit-gradient(linear,0 100%,100% 0,color-stop(.25,rgba(255,255,255,0.15)),color-stop(.25,transparent),color-stop(.5,transparent),color-stop(.5,rgba(255,255,255,0.15)),color-stop(.75,rgba(255,255,255,0.15)),color-stop(.75,transparent),to(transparent));
	background-image: -webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: -moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: -o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	-webkit-background-size: 40px 40px;
	-moz-background-size: 40px 40px;
	-o-background-size: 40px 40px;
	background-size: 40px 40px;
}
.progress.active .bar {
	-webkit-animation: progress-bar-stripes 2s linear infinite;
	-moz-animation: progress-bar-stripes 2s linear infinite;
	-ms-animation: progress-bar-stripes 2s linear infinite;
	-o-animation: progress-bar-stripes 2s linear infinite;
	animation: progress-bar-stripes 2s linear infinite;
}
.progress-danger .bar,
.progress .bar-danger {
	background-color: #dd514c;
	background-image: -moz-linear-gradient(top,#ee5f5b,#c43c35);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));
	background-image: -webkit-linear-gradient(top,#ee5f5b,#c43c35);
	background-image: -o-linear-gradient(top,#ee5f5b,#c43c35);
	background-image: linear-gradient(to bottom,#ee5f5b,#c43c35);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
}
.progress-danger.progress-striped .bar,
.progress-striped .bar-danger {
	background-color: #ee5f5b;
	background-image: -webkit-gradient(linear,0 100%,100% 0,color-stop(.25,rgba(255,255,255,0.15)),color-stop(.25,transparent),color-stop(.5,transparent),color-stop(.5,rgba(255,255,255,0.15)),color-stop(.75,rgba(255,255,255,0.15)),color-stop(.75,transparent),to(transparent));
	background-image: -webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: -moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: -o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
}
.progress-success .bar,
.progress .bar-success {
	background-color: #5eb95e;
	background-image: -moz-linear-gradient(top,#62c462,#57a957);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));
	background-image: -webkit-linear-gradient(top,#62c462,#57a957);
	background-image: -o-linear-gradient(top,#62c462,#57a957);
	background-image: linear-gradient(to bottom,#62c462,#57a957);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
}
.progress-success.progress-striped .bar,
.progress-striped .bar-success {
	background-color: #62c462;
	background-image: -webkit-gradient(linear,0 100%,100% 0,color-stop(.25,rgba(255,255,255,0.15)),color-stop(.25,transparent),color-stop(.5,transparent),color-stop(.5,rgba(255,255,255,0.15)),color-stop(.75,rgba(255,255,255,0.15)),color-stop(.75,transparent),to(transparent));
	background-image: -webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: -moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: -o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
}
.progress-info .bar,
.progress .bar-info {
	background-color: #4bb1cf;
	background-image: -moz-linear-gradient(top,#5bc0de,#339bb9);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));
	background-image: -webkit-linear-gradient(top,#5bc0de,#339bb9);
	background-image: -o-linear-gradient(top,#5bc0de,#339bb9);
	background-image: linear-gradient(to bottom,#5bc0de,#339bb9);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
}
.progress-info.progress-striped .bar,
.progress-striped .bar-info {
	background-color: #5bc0de;
	background-image: -webkit-gradient(linear,0 100%,100% 0,color-stop(.25,rgba(255,255,255,0.15)),color-stop(.25,transparent),color-stop(.5,transparent),color-stop(.5,rgba(255,255,255,0.15)),color-stop(.75,rgba(255,255,255,0.15)),color-stop(.75,transparent),to(transparent));
	background-image: -webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: -moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: -o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
}
.progress-warning .bar,
.progress .bar-warning {
	background-color: #faa732;
	background-image: -moz-linear-gradient(top,#fbb450,#f89406);
	background-image: -webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));
	background-image: -webkit-linear-gradient(top,#fbb450,#f89406);
	background-image: -o-linear-gradient(top,#fbb450,#f89406);
	background-image: linear-gradient(to bottom,#fbb450,#f89406);
	background-repeat: repeat-x;
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffab44f', endColorstr='#fff89406', GradientType=0);
}
.progress-warning.progress-striped .bar,
.progress-striped .bar-warning {
	background-color: #fbb450;
	background-image: -webkit-gradient(linear,0 100%,100% 0,color-stop(.25,rgba(255,255,255,0.15)),color-stop(.25,transparent),color-stop(.5,transparent),color-stop(.5,rgba(255,255,255,0.15)),color-stop(.75,rgba(255,255,255,0.15)),color-stop(.75,transparent),to(transparent));
	background-image: -webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: -moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: -o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
	background-image: linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);
}
.accordion {
	margin-bottom: 18px;
}
.accordion-group {
	margin-bottom: 2px;
	border: 1px solid #e5e5e5;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
}
.accordion-heading {
	border-bottom: 0;
}
.accordion-heading .accordion-toggle {
	display: block;
	padding: 8px 15px;
}
.accordion-toggle {
	cursor: pointer;
}
.accordion-inner {
	padding: 9px 15px;
	border-top: 1px solid #e5e5e5;
}
.carousel {
	position: relative;
	margin-bottom: 18px;
	line-height: 1;
}
.carousel-inner {
	overflow: hidden;
	width: 100%;
	position: relative;
}
.carousel-inner > .item {
	display: none;
	position: relative;
	-webkit-transition: .6s ease-in-out left;
	-moz-transition: .6s ease-in-out left;
	-o-transition: .6s ease-in-out left;
	transition: .6s ease-in-out left;
}
.carousel-inner > .item > img,
.carousel-inner > .item > a > img {
	display: block;
	line-height: 1;
}
.carousel-inner > .active,
.carousel-inner > .next,
.carousel-inner > .prev {
	display: block;
}
.carousel-inner > .active {
	left: 0;
}
.carousel-inner > .next,
.carousel-inner > .prev {
	position: absolute;
	top: 0;
	width: 100%;
}
.carousel-inner > .next {
	left: 100%;
}
.carousel-inner > .prev {
	left: -100%;
}
.carousel-inner > .next.left,
.carousel-inner > .prev.right {
	left: 0;
}
.carousel-inner > .active.left {
	left: -100%;
}
.carousel-inner > .active.right {
	left: 100%;
}
.carousel-control {
	position: absolute;
	top: 40%;
	left: 15px;
	width: 40px;
	height: 40px;
	margin-top: -20px;
	font-size: 60px;
	font-weight: 100;
	line-height: 30px;
	color: #fff;
	text-align: center;
	background: #222;
	border: 3px solid #fff;
	-webkit-border-radius: 23px;
	-moz-border-radius: 23px;
	border-radius: 23px;
	opacity: 0.5;
	filter: alpha(opacity=50);
}
.carousel-control.right {
	left: auto;
	right: 15px;
}
.carousel-control:hover,
.carousel-control:focus {
	color: #fff;
	text-decoration: none;
	opacity: 0.9;
	filter: alpha(opacity=90);
}
.carousel-indicators {
	position: absolute;
	top: 15px;
	right: 15px;
	z-index: 5;
	margin: 0;
	list-style: none;
}
.carousel-indicators li {
	display: block;
	float: left;
	width: 10px;
	height: 10px;
	margin-left: 5px;
	text-indent: -999px;
	background-color: #ccc;
	background-color: rgba(255,255,255,0.25);
	border-radius: 5px;
}
.carousel-indicators .active {
	background-color: #fff;
}
.carousel-caption {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	padding: 15px;
	background: #333;
	background: rgba(0,0,0,0.75);
}
.carousel-caption h4,
.carousel-caption p {
	color: #fff;
	line-height: 18px;
}
.carousel-caption h4 {
	margin: 0 0 5px;
}
.carousel-caption p {
	margin-bottom: 0;
}
.hero-unit {
	padding: 60px;
	margin-bottom: 30px;
	font-size: 18px;
	font-weight: 200;
	line-height: 27px;
	color: inherit;
	background-color: #eee;
	-webkit-border-radius: 6px;
	-moz-border-radius: 6px;
	border-radius: 6px;
}
.hero-unit h1 {
	margin-bottom: 0;
	font-size: 60px;
	line-height: 1;
	color: inherit;
	letter-spacing: -1px;
}
.hero-unit li {
	line-height: 27px;
}
.pull-right {
	float: right;
}
.pull-left {
	float: left;
}
.hide {
	display: none;
}
.show {
	display: block;
}
.invisible {
	visibility: hidden;
}
.affix {
	position: fixed;
}
@-ms-viewport {
	width: device-width;
}
.hidden {
	display: none;
	visibility: hidden;
}
.visible-phone {
	display: none !important;
}
.visible-tablet {
	display: none !important;
}
.hidden-desktop {
	display: none !important;
}
.visible-desktop {
	display: inherit !important;
}
@media (min-width: 768px) and (max-width: 979px) {
	.hidden-desktop {
		display: inherit !important;
	}
	.visible-desktop {
		display: none !important;
	}
	.visible-tablet {
		display: inherit !important;
	}
	.hidden-tablet {
		display: none !important;
	}
}
@media (max-width: 767px) {
	.hidden-desktop {
		display: inherit !important;
	}
	.visible-desktop {
		display: none !important;
	}
	.visible-phone {
		display: inherit !important;
	}
	.hidden-phone {
		display: none !important;
	}
}
.visible-print {
	display: none !important;
}
@media print {
	.visible-print {
		display: inherit !important;
	}
	.hidden-print {
		display: none !important;
	}
}
@media (max-width: 767px) {
	body {
		padding-left: 20px;
		padding-right: 20px;
	}
	.navbar-fixed-top,
	.navbar-fixed-bottom,
	.navbar-static-top {
		margin-left: -20px;
		margin-right: -20px;
	}
	.container-fluid {
		padding: 0;
	}
	.dl-horizontal dt {
		float: none;
		clear: none;
		width: auto;
		text-align: left;
	}
	.dl-horizontal dd {
		margin-left: 0;
	}
	.dropdown-menu .menuitem-group {
		background-color: #10223e;
		color: #eee;
	}
	.container {
		width: auto;
	}
	.row-fluid {
		width: 100%;
	}
	.row,
	.thumbnails {
		margin-left: 0;
	}
	.thumbnails > li {
		float: none;
		margin-left: 0;
	}
	[class*="span"],
	.uneditable-input[class*="span"],
	.row-fluid [class*="span"] {
		float: none;
		display: block;
		width: 100%;
		margin-left: 0;
		-webkit-box-sizing: border-box;
		-moz-box-sizing: border-box;
		box-sizing: border-box;
	}
	.span12,
	.row-fluid .span12 {
		width: 100%;
		-webkit-box-sizing: border-box;
		-moz-box-sizing: border-box;
		box-sizing: border-box;
	}
	.row-fluid [class*="offset"]:first-child {
		margin-left: 0;
	}
	.input-large,
	.input-xlarge,
	.input-xxlarge,
	input[class*="span"],
	select[class*="span"],
	textarea[class*="span"],
	.uneditable-input {
		display: block;
		width: 100%;
		min-height: 28px;
		-webkit-box-sizing: border-box;
		-moz-box-sizing: border-box;
		box-sizing: border-box;
	}
	.input-prepend input,
	.input-append input,
	.input-prepend input[class*="span"],
	.input-append input[class*="span"] {
		display: inline-block;
	}
	.controls-row [class*="span"] + [class*="span"] {
		margin-left: 0;
	}
}
@media (max-width: 480px) {
	.nav-collapse {
		-webkit-transform: translate3d(0,0,0);
	}
	.page-header h1 small {
		display: block;
		line-height: 18px;
	}
	input[type="checkbox"],
	input[type="radio"] {
		border: 1px solid #ccc;
	}
	.form-horizontal .control-label {
		float: none;
		width: auto;
		padding-top: 0;
		text-align: left;
	}
	.form-horizontal .controls {
		margin-left: 0;
	}
	.form-horizontal .control-list {
		padding-top: 0;
	}
	.form-horizontal .form-actions {
		padding-left: 10px;
		padding-right: 10px;
	}
	.tag-category input#filter-search,
	.newsfeed-category input#filter-search {
		width: auto;
		margin-bottom: 9px;
	}
	.category-list input#filter-search {
		width: auto;
	}
	.media .pull-left,
	.media .pull-right {
		float: none;
		display: block;
		margin-bottom: 10px;
	}
	.media-object {
		margin-right: 0;
		margin-left: 0;
	}
	.modal-header .close {
		padding: 10px;
		margin: -10px;
	}
	.carousel-caption {
		position: static;
	}
}
@media (min-width: 768px) and (max-width: 979px) {
	.row {
		margin-left: -20px;
		*zoom: 1;
	}
	.row:before,
	.row:after {
		display: table;
		content: "";
		line-height: 0;
	}
	.row:after {
		clear: both;
	}
	[class*="span"] {
		float: left;
		min-height: 1px;
		margin-left: 20px;
	}
	.container,
	.navbar-static-top .container,
	.navbar-fixed-top .container,
	.navbar-fixed-bottom .container {
		width: 724px;
	}
	.span12 {
		width: 724px;
	}
	.span11 {
		width: 662px;
	}
	.span10 {
		width: 600px;
	}
	.span9 {
		width: 538px;
	}
	.span8 {
		width: 476px;
	}
	.span7 {
		width: 414px;
	}
	.span6 {
		width: 352px;
	}
	.span5 {
		width: 290px;
	}
	.span4 {
		width: 228px;
	}
	.span3 {
		width: 166px;
	}
	.span2 {
		width: 104px;
	}
	.span1 {
		width: 42px;
	}
	.offset12 {
		margin-left: 764px;
	}
	.offset11 {
		margin-left: 702px;
	}
	.offset10 {
		margin-left: 640px;
	}
	.offset9 {
		margin-left: 578px;
	}
	.offset8 {
		margin-left: 516px;
	}
	.offset7 {
		margin-left: 454px;
	}
	.offset6 {
		margin-left: 392px;
	}
	.offset5 {
		margin-left: 330px;
	}
	.offset4 {
		margin-left: 268px;
	}
	.offset3 {
		margin-left: 206px;
	}
	.offset2 {
		margin-left: 144px;
	}
	.offset1 {
		margin-left: 82px;
	}
	.row-fluid {
		width: 100%;
		*zoom: 1;
	}
	.row-fluid:before,
	.row-fluid:after {
		display: table;
		content: "";
		line-height: 0;
	}
	.row-fluid:after {
		clear: both;
	}
	.row-fluid [class*="span"] {
		display: block;
		width: 100%;
		min-height: 28px;
		-webkit-box-sizing: border-box;
		-moz-box-sizing: border-box;
		box-sizing: border-box;
		float: left;
		margin-left: 2.76243094%;
		*margin-left: 2.70923945%;
	}
	.row-fluid [class*="span"]:first-child {
		margin-left: 0;
	}
	.row-fluid .controls-row [class*="span"] + [class*="span"] {
		margin-left: 2.76243094%;
	}
	.row-fluid .span12 {
		width: 100%;
		*width: 99.94680851%;
	}
	.row-fluid .span11 {
		width: 91.43646409%;
		*width: 91.3832726%;
	}
	.row-fluid .span10 {
		width: 82.87292818%;
		*width: 82.81973669%;
	}
	.row-fluid .span9 {
		width: 74.30939227%;
		*width: 74.25620078%;
	}
	.row-fluid .span8 {
		width: 65.74585635%;
		*width: 65.69266486%;
	}
	.row-fluid .span7 {
		width: 57.18232044%;
		*width: 57.12912895%;
	}
	.row-fluid .span6 {
		width: 48.61878453%;
		*width: 48.56559304%;
	}
	.row-fluid .span5 {
		width: 40.05524862%;
		*width: 40.00205713%;
	}
	.row-fluid .span4 {
		width: 31.49171271%;
		*width: 31.43852122%;
	}
	.row-fluid .span3 {
		width: 22.9281768%;
		*width: 22.87498531%;
	}
	.row-fluid .span2 {
		width: 14.36464088%;
		*width: 14.31144939%;
	}
	.row-fluid .span1 {
		width: 5.80110497%;
		*width: 5.74791348%;
	}
	.row-fluid .offset12 {
		margin-left: 105.52486188%;
		*margin-left: 105.4184789%;
	}
	.row-fluid .offset12:first-child {
		margin-left: 102.76243094%;
		*margin-left: 102.65604796%;
	}
	.row-fluid .offset11 {
		margin-left: 96.96132597%;
		*margin-left: 96.85494299%;
	}
	.row-fluid .offset11:first-child {
		margin-left: 94.19889503%;
		*margin-left: 94.09251205%;
	}
	.row-fluid .offset10 {
		margin-left: 88.39779006%;
		*margin-left: 88.29140708%;
	}
	.row-fluid .offset10:first-child {
		margin-left: 85.63535912%;
		*margin-left: 85.52897614%;
	}
	.row-fluid .offset9 {
		margin-left: 79.83425414%;
		*margin-left: 79.72787116%;
	}
	.row-fluid .offset9:first-child {
		margin-left: 77.0718232%;
		*margin-left: 76.96544023%;
	}
	.row-fluid .offset8 {
		margin-left: 71.27071823%;
		*margin-left: 71.16433525%;
	}
	.row-fluid .offset8:first-child {
		margin-left: 68.50828729%;
		*margin-left: 68.40190431%;
	}
	.row-fluid .offset7 {
		margin-left: 62.70718232%;
		*margin-left: 62.60079934%;
	}
	.row-fluid .offset7:first-child {
		margin-left: 59.94475138%;
		*margin-left: 59.8383684%;
	}
	.row-fluid .offset6 {
		margin-left: 54.14364641%;
		*margin-left: 54.03726343%;
	}
	.row-fluid .offset6:first-child {
		margin-left: 51.38121547%;
		*margin-left: 51.27483249%;
	}
	.row-fluid .offset5 {
		margin-left: 45.5801105%;
		*margin-left: 45.47372752%;
	}
	.row-fluid .offset5:first-child {
		margin-left: 42.81767956%;
		*margin-left: 42.71129658%;
	}
	.row-fluid .offset4 {
		margin-left: 37.01657459%;
		*margin-left: 36.91019161%;
	}
	.row-fluid .offset4:first-child {
		margin-left: 34.25414365%;
		*margin-left: 34.14776067%;
	}
	.row-fluid .offset3 {
		margin-left: 28.45303867%;
		*margin-left: 28.3466557%;
	}
	.row-fluid .offset3:first-child {
		margin-left: 25.69060773%;
		*margin-left: 25.58422476%;
	}
	.row-fluid .offset2 {
		margin-left: 19.88950276%;
		*margin-left: 19.78311978%;
	}
	.row-fluid .offset2:first-child {
		margin-left: 17.12707182%;
		*margin-left: 17.02068884%;
	}
	.row-fluid .offset1 {
		margin-left: 11.32596685%;
		*margin-left: 11.21958387%;
	}
	.row-fluid .offset1:first-child {
		margin-left: 8.56353591%;
		*margin-left: 8.45715293%;
	}
	input,
	textarea,
	.uneditable-input {
		margin-left: 0;
	}
	.controls-row [class*="span"] + [class*="span"] {
		margin-left: 20px;
	}
	input.span12,
	textarea.span12,
	.uneditable-input.span12 {
		width: 710px;
	}
	input.span11,
	textarea.span11,
	.uneditable-input.span11 {
		width: 648px;
	}
	input.span10,
	textarea.span10,
	.uneditable-input.span10 {
		width: 586px;
	}
	input.span9,
	textarea.span9,
	.uneditable-input.span9 {
		width: 524px;
	}
	input.span8,
	textarea.span8,
	.uneditable-input.span8 {
		width: 462px;
	}
	input.span7,
	textarea.span7,
	.uneditable-input.span7 {
		width: 400px;
	}
	input.span6,
	textarea.span6,
	.uneditable-input.span6 {
		width: 338px;
	}
	input.span5,
	textarea.span5,
	.uneditable-input.span5 {
		width: 276px;
	}
	input.span4,
	textarea.span4,
	.uneditable-input.span4 {
		width: 214px;
	}
	input.span3,
	textarea.span3,
	.uneditable-input.span3 {
		width: 152px;
	}
	input.span2,
	textarea.span2,
	.uneditable-input.span2 {
		width: 90px;
	}
	input.span1,
	textarea.span1,
	.uneditable-input.span1 {
		width: 28px;
	}
}
@media (min-width: 1200px) {
	.row {
		margin-left: -30px;
		*zoom: 1;
	}
	.row:before,
	.row:after {
		display: table;
		content: "";
		line-height: 0;
	}
	.row:after {
		clear: both;
	}
	[class*="span"] {
		float: left;
		min-height: 1px;
		margin-left: 30px;
	}
	.container,
	.navbar-static-top .container,
	.navbar-fixed-top .container,
	.navbar-fixed-bottom .container {
		width: 1170px;
	}
	.span12 {
		width: 1170px;
	}
	.span11 {
		width: 1070px;
	}
	.span10 {
		width: 970px;
	}
	.span9 {
		width: 870px;
	}
	.span8 {
		width: 770px;
	}
	.span7 {
		width: 670px;
	}
	.span6 {
		width: 570px;
	}
	.span5 {
		width: 470px;
	}
	.span4 {
		width: 370px;
	}
	.span3 {
		width: 270px;
	}
	.span2 {
		width: 170px;
	}
	.span1 {
		width: 70px;
	}
	.offset12 {
		margin-left: 1230px;
	}
	.offset11 {
		margin-left: 1130px;
	}
	.offset10 {
		margin-left: 1030px;
	}
	.offset9 {
		margin-left: 930px;
	}
	.offset8 {
		margin-left: 830px;
	}
	.offset7 {
		margin-left: 730px;
	}
	.offset6 {
		margin-left: 630px;
	}
	.offset5 {
		margin-left: 530px;
	}
	.offset4 {
		margin-left: 430px;
	}
	.offset3 {
		margin-left: 330px;
	}
	.offset2 {
		margin-left: 230px;
	}
	.offset1 {
		margin-left: 130px;
	}
	.row-fluid {
		width: 100%;
		*zoom: 1;
	}
	.row-fluid:before,
	.row-fluid:after {
		display: table;
		content: "";
		line-height: 0;
	}
	.row-fluid:after {
		clear: both;
	}
	.row-fluid [class*="span"] {
		display: block;
		width: 100%;
		min-height: 28px;
		-webkit-box-sizing: border-box;
		-moz-box-sizing: border-box;
		box-sizing: border-box;
		float: left;
		margin-left: 2.76243094%;
		*margin-left: 2.70923945%;
	}
	.row-fluid [class*="span"]:first-child {
		margin-left: 0;
	}
	.row-fluid .controls-row [class*="span"] + [class*="span"] {
		margin-left: 2.76243094%;
	}
	.row-fluid .span12 {
		width: 100%;
		*width: 99.94680851%;
	}
	.row-fluid .span11 {
		width: 91.43646409%;
		*width: 91.3832726%;
	}
	.row-fluid .span10 {
		width: 82.87292818%;
		*width: 82.81973669%;
	}
	.row-fluid .span9 {
		width: 74.30939227%;
		*width: 74.25620078%;
	}
	.row-fluid .span8 {
		width: 65.74585635%;
		*width: 65.69266486%;
	}
	.row-fluid .span7 {
		width: 57.18232044%;
		*width: 57.12912895%;
	}
	.row-fluid .span6 {
		width: 48.61878453%;
		*width: 48.56559304%;
	}
	.row-fluid .span5 {
		width: 40.05524862%;
		*width: 40.00205713%;
	}
	.row-fluid .span4 {
		width: 31.49171271%;
		*width: 31.43852122%;
	}
	.row-fluid .span3 {
		width: 22.9281768%;
		*width: 22.87498531%;
	}
	.row-fluid .span2 {
		width: 14.36464088%;
		*width: 14.31144939%;
	}
	.row-fluid .span1 {
		width: 5.80110497%;
		*width: 5.74791348%;
	}
	.row-fluid .offset12 {
		margin-left: 105.52486188%;
		*margin-left: 105.4184789%;
	}
	.row-fluid .offset12:first-child {
		margin-left: 102.76243094%;
		*margin-left: 102.65604796%;
	}
	.row-fluid .offset11 {
		margin-left: 96.96132597%;
		*margin-left: 96.85494299%;
	}
	.row-fluid .offset11:first-child {
		margin-left: 94.19889503%;
		*margin-left: 94.09251205%;
	}
	.row-fluid .offset10 {
		margin-left: 88.39779006%;
		*margin-left: 88.29140708%;
	}
	.row-fluid .offset10:first-child {
		margin-left: 85.63535912%;
		*margin-left: 85.52897614%;
	}
	.row-fluid .offset9 {
		margin-left: 79.83425414%;
		*margin-left: 79.72787116%;
	}
	.row-fluid .offset9:first-child {
		margin-left: 77.0718232%;
		*margin-left: 76.96544023%;
	}
	.row-fluid .offset8 {
		margin-left: 71.27071823%;
		*margin-left: 71.16433525%;
	}
	.row-fluid .offset8:first-child {
		margin-left: 68.50828729%;
		*margin-left: 68.40190431%;
	}
	.row-fluid .offset7 {
		margin-left: 62.70718232%;
		*margin-left: 62.60079934%;
	}
	.row-fluid .offset7:first-child {
		margin-left: 59.94475138%;
		*margin-left: 59.8383684%;
	}
	.row-fluid .offset6 {
		margin-left: 54.14364641%;
		*margin-left: 54.03726343%;
	}
	.row-fluid .offset6:first-child {
		margin-left: 51.38121547%;
		*margin-left: 51.27483249%;
	}
	.row-fluid .offset5 {
		margin-left: 45.5801105%;
		*margin-left: 45.47372752%;
	}
	.row-fluid .offset5:first-child {
		margin-left: 42.81767956%;
		*margin-left: 42.71129658%;
	}
	.row-fluid .offset4 {
		margin-left: 37.01657459%;
		*margin-left: 36.91019161%;
	}
	.row-fluid .offset4:first-child {
		margin-left: 34.25414365%;
		*margin-left: 34.14776067%;
	}
	.row-fluid .offset3 {
		margin-left: 28.45303867%;
		*margin-left: 28.3466557%;
	}
	.row-fluid .offset3:first-child {
		margin-left: 25.69060773%;
		*margin-left: 25.58422476%;
	}
	.row-fluid .offset2 {
		margin-left: 19.88950276%;
		*margin-left: 19.78311978%;
	}
	.row-fluid .offset2:first-child {
		margin-left: 17.12707182%;
		*margin-left: 17.02068884%;
	}
	.row-fluid .offset1 {
		margin-left: 11.32596685%;
		*margin-left: 11.21958387%;
	}
	.row-fluid .offset1:first-child {
		margin-left: 8.56353591%;
		*margin-left: 8.45715293%;
	}
	input,
	textarea,
	.uneditable-input {
		margin-left: 0;
	}
	.controls-row [class*="span"] + [class*="span"] {
		margin-left: 30px;
	}
	input.span12,
	textarea.span12,
	.uneditable-input.span12 {
		width: 1156px;
	}
	input.span11,
	textarea.span11,
	.uneditable-input.span11 {
		width: 1056px;
	}
	input.span10,
	textarea.span10,
	.uneditable-input.span10 {
		width: 956px;
	}
	input.span9,
	textarea.span9,
	.uneditable-input.span9 {
		width: 856px;
	}
	input.span8,
	textarea.span8,
	.uneditable-input.span8 {
		width: 756px;
	}
	input.span7,
	textarea.span7,
	.uneditable-input.span7 {
		width: 656px;
	}
	input.span6,
	textarea.span6,
	.uneditable-input.span6 {
		width: 556px;
	}
	input.span5,
	textarea.span5,
	.uneditable-input.span5 {
		width: 456px;
	}
	input.span4,
	textarea.span4,
	.uneditable-input.span4 {
		width: 356px;
	}
	input.span3,
	textarea.span3,
	.uneditable-input.span3 {
		width: 256px;
	}
	input.span2,
	textarea.span2,
	.uneditable-input.span2 {
		width: 156px;
	}
	input.span1,
	textarea.span1,
	.uneditable-input.span1 {
		width: 56px;
	}
	.thumbnails {
		margin-left: -30px;
	}
	.thumbnails > li {
		margin-left: 30px;
	}
	.row-fluid .thumbnails {
		margin-left: 0;
	}
}
@media (max-width: 767px) {
	body {
		padding-top: 0;
	}
	.navbar-fixed-top,
	.navbar-fixed-bottom {
		position: static;
	}
	.navbar-fixed-top {
		margin-bottom: 18px;
	}
	.navbar-fixed-bottom {
		margin-top: 18px;
	}
	.navbar-fixed-top .navbar-inner,
	.navbar-fixed-bottom .navbar-inner {
		padding: 5px;
	}
	.navbar .container {
		width: auto;
		padding: 0;
	}
	.navbar .brand {
		padding-left: 10px;
		padding-right: 10px;
		margin: 0 0 0 -5px;
	}
	.nav-collapse {
		clear: both;
	}
	.nav-collapse .nav {
		float: none;
		margin: 0 0 9px;
	}
	.nav-collapse .nav > li {
		float: none;
	}
	.nav-collapse .nav > li > a {
		margin-bottom: 2px;
	}
	.nav-collapse .nav > .divider-vertical {
		display: none;
	}
	.nav-collapse .nav .nav-header {
		color: #555;
		text-shadow: none;
	}
	.nav-collapse .nav > li > a,
	.nav-collapse .dropdown-menu a {
		padding: 9px 15px;
		font-weight: bold;
		color: #555;
		-webkit-border-radius: 3px;
		-moz-border-radius: 3px;
		border-radius: 3px;
	}
	.nav-collapse .btn {
		padding: 4px 10px 4px;
		font-weight: normal;
		-webkit-border-radius: 3px;
		-moz-border-radius: 3px;
		border-radius: 3px;
	}
	.nav-collapse .dropdown-menu li + li a {
		margin-bottom: 2px;
	}
	.nav-collapse .nav > li > a:hover,
	.nav-collapse .nav > li > a:focus,
	.nav-collapse .dropdown-menu a:hover,
	.nav-collapse .dropdown-menu a:focus {
		background-color: #f2f2f2;
	}
	.navbar-inverse .nav-collapse .nav > li > a,
	.navbar-inverse .nav-collapse .dropdown-menu a {
		color: #d9d9d9;
	}
	.navbar-inverse .nav-collapse .nav > li > a:hover,
	.navbar-inverse .nav-collapse .nav > li > a:focus,
	.navbar-inverse .nav-collapse .dropdown-menu a:hover,
	.navbar-inverse .nav-collapse .dropdown-menu a:focus {
		background-color: #10223e;
	}
	.nav-collapse.in .btn-group {
		margin-top: 5px;
		padding: 0;
	}
	.nav-collapse .dropdown-menu {
		position: static;
		top: auto;
		left: auto;
		float: none;
		display: none;
		max-width: none;
		margin: 0 15px;
		padding: 0;
		background-color: transparent;
		border: none;
		-webkit-border-radius: 0;
		-moz-border-radius: 0;
		border-radius: 0;
		-webkit-box-shadow: none;
		-moz-box-shadow: none;
		box-shadow: none;
	}
	.nav-collapse .open > .dropdown-menu {
		display: block;
	}
	.nav-collapse .dropdown-menu:before,
	.nav-collapse .dropdown-menu:after {
		display: none;
	}
	.nav-collapse .dropdown-menu .divider {
		display: none;
	}
	.nav-collapse .nav > li > .dropdown-menu:before,
	.nav-collapse .nav > li > .dropdown-menu:after {
		display: none;
	}
	.nav-collapse .navbar-form,
	.nav-collapse .navbar-search {
		float: none;
		padding: 9px 15px;
		margin: 9px 0;
		border-top: 1px solid #f2f2f2;
		border-bottom: 1px solid #f2f2f2;
		-webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
		-moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
		box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
	}
	.navbar-inverse .nav-collapse .navbar-form,
	.navbar-inverse .nav-collapse .navbar-search {
		border-top-color: #10223e;
		border-bottom-color: #10223e;
	}
	.navbar .nav-collapse .nav.pull-right {
		float: none;
		margin-left: 0;
	}
	.nav-collapse,
	.nav-collapse.collapse {
		overflow: hidden;
		height: 0;
	}
	.navbar .btn-navbar {
		display: block;
	}
	.navbar-static .navbar-inner {
		padding-left: 10px;
		padding-right: 10px;
	}
}
@media (min-width: 768px) {
	.nav-collapse.collapse {
		height: auto !important;
		overflow: visible !important;
	}
}
.small {
	font-size: 11px;
}
iframe,
svg {
	max-width: 100%;
}
.nowrap {
	white-space: nowrap;
}
.center,
.table td.center,
.table th.center {
	text-align: center;
}
a.disabled,
a.disabled:hover {
	color: #999999;
	background-color: transparent;
	cursor: default;
	text-decoration: none;
}
.hero-unit {
	text-align: center;
}
.hero-unit .lead {
	margin-bottom: 18px;
	font-size: 20px;
	font-weight: 200;
	line-height: 27px;
}
.btn .caret {
	margin-bottom: 7px;
}
.btn.btn-micro .caret {
	margin: 5px 0;
}
.blog-row-rule,
.blog-item-rule {
	border: 0;
}
body.modal {
	padding-top: 0;
}
.row-even,
.row-odd {
	padding: 5px;
	width: 99%;
	border-bottom: 1px solid #ddd;
}
.row-odd {
	background-color: transparent;
}
.row-even {
	background-color: #f9f9f9;
}
.blog-row-rule,
.blog-item-rule {
	border: 0;
}
.row-fluid .row-reveal {
	visibility: hidden;
}
.row-fluid:hover .row-reveal {
	visibility: visible;
}
.btn-wide {
	width: 80%;
}
.nav-list > li.offset > a {
	padding-left: 30px;
	font-size: 12px;
}
.blog-row-rule,
.blog-item-rule {
	border: 0;
}
.row-fluid .offset1 {
	margin-left: 8.382978723%;
}
.row-fluid .offset2 {
	margin-left: 16.89361702%;
}
.row-fluid .offset3 {
	margin-left: 25.404255317%;
}
.row-fluid .offset4 {
	margin-left: 33.914893614%;
}
.row-fluid .offset5 {
	margin-left: 42.425531911%;
}
.row-fluid .offset6 {
	margin-left: 50.93617020799999%;
}
.row-fluid .offset7 {
	margin-left: 59.446808505%;
}
.row-fluid .offset8 {
	margin-left: 67.95744680199999%;
}
.row-fluid .offset9 {
	margin-left: 76.468085099%;
}
.row-fluid .offset10 {
	margin-left: 84.97872339599999%;
}
.row-fluid .offset11 {
	margin-left: 91.489361693%;
}
.navbar .nav > li > a.btn {
	padding: 4px 10px;
	line-height: 18px;
}
.nav-tabs.nav-dark {
	border-bottom: 1px solid #333;
	text-shadow: 1px 1px 1px #000;
}
.nav-tabs.nav-dark > li > a {
	color: #F8F8F8;
}
.nav-tabs.nav-dark > li > a:hover {
	border-color: #333 #333 #111;
	background-color: #777777;
}
.nav-tabs.nav-dark > .active > a,
.nav-tabs.nav-dark > .active > a:hover {
	color: #ffffff;
	background-color: #555555;
	border: 1px solid #222;
	border-bottom-color: transparent;
}
.thumbnail.pull-left {
	margin: 0 10px 10px 0;
}
.thumbnail.pull-right {
	margin: 0 0 10px 10px;
}
.width-10 {
	width: 10px;
}
.width-20 {
	width: 20px;
}
.width-30 {
	width: 30px;
}
.width-40 {
	width: 40px;
}
.width-50 {
	width: 50px;
}
.width-60 {
	width: 60px;
}
.width-70 {
	width: 70px;
}
.width-80 {
	width: 80px;
}
.width-90 {
	width: 90px;
}
.width-100 {
	width: 100px;
}
.height-10 {
	height: 10px;
}
.height-20 {
	height: 20px;
}
.height-30 {
	height: 30px;
}
.height-40 {
	height: 40px;
}
.height-50 {
	height: 50px;
}
.height-60 {
	height: 60px;
}
.height-70 {
	height: 70px;
}
.height-80 {
	height: 80px;
}
.height-90 {
	height: 90px;
}
.height-100 {
	height: 100px;
}
hr.hr-condensed {
	margin: 10px 0;
}
.list-striped,
.row-striped {
	list-style: none;
	line-height: 18px;
	text-align: left;
	vertical-align: middle;
	border-top: 1px solid #ddd;
	margin-left: 0;
}
.list-striped li,
.list-striped dd,
.row-striped .row,
.row-striped .row-fluid {
	border-bottom: 1px solid #ddd;
	padding: 8px;
}
.list-striped li:nth-child(odd),
.list-striped dd:nth-child(odd),
.row-striped .row:nth-child(odd),
.row-striped .row-fluid:nth-child(odd) {
	background-color: #f9f9f9;
}
.list-striped li:hover,
.list-striped dd:hover,
.row-striped .row:hover,
.row-striped .row-fluid:hover {
	background-color: #F0F0F0;
}
.row-striped .row-fluid {
	width: 100%;
	box-sizing: border-box;
}
.row-striped .row-fluid [class*="span"] {
	min-height: 10px;
}
.row-striped .row-fluid [class*="span"] {
	margin-left: 8px;
}
.row-striped .row-fluid [class*="span"]:first-child {
	margin-left: 0;
}
.list-condensed li {
	padding: 4px 5px;
}
.row-condensed .row,
.row-condensed .row-fluid {
	padding: 4px 5px;
}
.list-bordered,
.row-bordered {
	list-style: none;
	line-height: 18px;
	text-align: left;
	vertical-align: middle;
	margin-left: 0;
	border: 1px solid #ddd;
	-webkit-border-radius: 4px;
	-moz-border-radius: 4px;
	border-radius: 4px;
}
.radio.btn-group input[type=radio] {
	display: none;
}
.radio.btn-group > label {
	-webkit-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;
}
.radio.btn-group > label:first-of-type {
	margin-left: 0;
	-webkit-border-bottom-left-radius: 4px;
	border-bottom-left-radius: 4px;
	-webkit-border-top-left-radius: 4px;
	border-top-left-radius: 4px;
	-moz-border-radius-bottomleft: 4px;
	-moz-border-radius-topleft: 4px;
}
fieldset.radio.btn-group {
	padding-left: 0;
}
.iframe-bordered {
	border: 1px solid #ddd;
}
.tab-content {
	overflow: visible;
}
.tabs-left .tab-content {
	overflow: auto;
}
.nav-tabs > li > span {
	display: block;
	margin-right: 2px;
	padding-right: 12px;
	padding-left: 12px;
	padding-top: 8px;
	padding-bottom: 8px;
	line-height: 18px;
	border: 1px solid transparent;
	-webkit-border-radius: 4px 4px 0 0;
	-moz-border-radius: 4px 4px 0 0;
	border-radius: 4px 4px 0 0;
}
.btn-micro {
	padding: 1px 4px;
	font-size: 10px;
	line-height: 8px;
}
.btn-group > .btn-micro {
	font-size: 10px;
}
.tip-wrap {
	max-width: 200px;
	padding: 3px 8px;
	color: #fff;
	text-align: center;
	text-decoration: none;
	background-color: #000;
	-webkit-border-radius: 4px;
	-moz-border-radius: 4px;
	border-radius: 4px;
	z-index: 100;
}
.page-header {
	margin: 2px 0px 10px 0px;
	padding-bottom: 5px;
}
.input-prepend > .add-on,
.input-append > .add-on {
	vertical-align: top;
}
.input-prepend .chzn-container-single .chzn-single {
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.input-prepend .chzn-container-single .chzn-single-with-drop {
	-webkit-border-radius: 0 3px 0 0;
	-moz-border-radius: 0 3px 0 0;
	border-radius: 0 3px 0 0;
}
.input-append .chzn-container-single .chzn-single {
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
}
.input-append .chzn-container-single .chzn-single-with-drop {
	-webkit-border-radius: 3px 0 0 0;
	-moz-border-radius: 3px 0 0 0;
	border-radius: 3px 0 0 0;
}
.input-prepend.input-append .chzn-container-single .chzn-single,
.input-prepend.input-append .chzn-container-single .chzn-single-with-drop {
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.element-invisible {
	position: absolute;
	padding: 0;
	margin: 0;
	border: 0;
	height: 1px;
	width: 1px;
	overflow: hidden;
}
.element-invisible:focus {
	width: auto;
	height: auto;
	overflow: auto;
	background: #eee;
	color: #000;
	padding: 1em;
}
.form-vertical .control-label {
	float: none;
	width: auto;
	padding-right: 0;
	padding-top: 0;
	text-align: left;
}
.form-vertical .controls {
	margin-left: 0;
}
.width-auto {
	width: auto;
}
.btn-group .chzn-results {
	white-space: normal;
}
.accordion-body.in:hover {
	overflow: visible;
}
.invalid {
	color: #9d261d;
	font-weight: bold;
}
input.invalid {
	border: 1px solid #9d261d;
	background: #f2dede;
}
select.chzn-done.invalid + .chzn-container.chzn-container-single > a.chzn-single,
select.chzn-done.invalid + .chzn-container.chzn-container-multi > ul.chzn-choices {
	border-color: #9d261d;
	color: #9d261d;
}
.tooltip {
	max-width: 400px;
}
.tooltip-inner {
	max-width: none;
	text-align: left;
	text-shadow: none;
}
th .tooltip-inner {
	font-weight: normal;
}
.tooltip.hasimage {
	opacity: 1;
}
.tip-text {
	text-align: left;
}
.btn-group > .btn + .dropdown-backdrop + .btn {
	margin-left: -1px;
}
.btn-group > .btn + .dropdown-backdrop + .dropdown-toggle {
	padding-left: 8px;
	padding-right: 8px;
	-webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
	-moz-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
	box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
	*padding-top: 5px;
	*padding-bottom: 5px;
}
.btn-group > .btn-mini + .dropdown-backdrop + .dropdown-toggle {
	padding-left: 5px;
	padding-right: 5px;
	*padding-top: 2px;
	*padding-bottom: 2px;
}
.btn-group > .btn-small + .dropdown-backdrop + .dropdown-toggle {
	*padding-top: 5px;
	*padding-bottom: 4px;
}
.btn-group > .btn-large + .dropdown-backdrop + .dropdown-toggle {
	padding-left: 12px;
	padding-right: 12px;
	*padding-top: 7px;
	*padding-bottom: 7px;
}
.dropdown-menu {
	text-align: left;
}
.alert-link {
	font-weight: bold;
}
.alert .alert-link {
	color: #66512c;
}
.alert-success .alert-link {
	color: #2b542c;
}
.alert-danger .alert-link,
.alert-error .alert-link {
	color: #843534;
}
.alert-info .alert-link {
	color: #245269;
}
div.modal {
	position: fixed;
	top: 5%;
	left: 50%;
	z-index: 1050;
	width: 80%;
	margin-left: -40%;
	background-color: #fff;
	border: 1px solid #999;
	border: 1px solid rgba(0,0,0,0.3);
	*border: 1px solid #999;
	-webkit-border-radius: 6px;
	-moz-border-radius: 6px;
	border-radius: 6px;
	-webkit-box-shadow: 0 3px 7px rgba(0,0,0,0.3);
	-moz-box-shadow: 0 3px 7px rgba(0,0,0,0.3);
	box-shadow: 0 3px 7px rgba(0,0,0,0.3);
	-webkit-background-clip: padding-box;
	-moz-background-clip: padding-box;
	background-clip: padding-box;
	outline: none;
}
div.modal.fade {
	-webkit-transition: opacity .3s linear, top .3s ease-out;
	-moz-transition: opacity .3s linear, top .3s ease-out;
	-o-transition: opacity .3s linear, top .3s ease-out;
	transition: opacity .3s linear, top .3s ease-out;
	top: -25%;
}
div.modal.fade.in {
	top: 5%;
}
.modal-batch {
	overflow-y: visible;
}
.modal-body[class^="jviewport-height"],
.modal-body[class*="jviewport-height"] {
	max-height: none;
}
.jviewport-height10 {
	height: 10vh;
}
.jviewport-height20 {
	height: 20vh;
}
.jviewport-height30 {
	height: 30vh;
}
.jviewport-height40 {
	height: 40vh;
}
.jviewport-height50 {
	height: 50vh;
}
.jviewport-height60 {
	height: 60vh;
}
.jviewport-height70 {
	height: 70vh;
}
.jviewport-height80 {
	height: 80vh;
}
.jviewport-height90 {
	height: 90vh;
}
.jviewport-height100 {
	height: 100vh;
}
div.modal.jviewport-width10 {
	width: 10vw;
	margin-left: -5vw;
}
div.modal.jviewport-width20 {
	width: 20vw;
	margin-left: -10vw;
}
div.modal.jviewport-width30 {
	width: 30vw;
	margin-left: -15vw;
}
div.modal.jviewport-width40 {
	width: 40vw;
	margin-left: -20vw;
}
div.modal.jviewport-width50 {
	width: 50vw;
	margin-left: -25vw;
}
div.modal.jviewport-width60 {
	width: 60vw;
	margin-left: -30vw;
}
div.modal.jviewport-width70 {
	width: 70vw;
	margin-left: -35vw;
}
div.modal.jviewport-width80 {
	width: 80vw;
	margin-left: -40vw;
}
div.modal.jviewport-width90 {
	width: 90vw;
	margin-left: -45vw;
}
div.modal.jviewport-width100 {
	width: 100vw;
	margin-left: -50vw;
}
@media (max-width: 767px) {
	div.modal {
		position: fixed;
		top: 20px;
		left: 20px;
		right: 20px;
		width: auto;
		margin: 0;
	}
	div.modal.fade {
		top: -100px;
	}
	div.modal.fade.in {
		top: 20px;
	}
	div.modal[class*="jviewport-width"] {
		width: auto;
		margin: 0;
	}
}
@media (max-width: 480px) {
	div.modal {
		top: 10px;
		left: 10px;
		right: 10px;
	}
}
@font-face {
	font-family: 'IcoMoon';
	src: url('../../../../media/jui/fonts/IcoMoon.eot');
	src: url('../../../../media/jui/fonts/IcoMoon.eot?#iefix') format('embedded-opentype'), url('../../../../media/jui/fonts/IcoMoon.woff') format('woff'), url('../../../../media/jui/fonts/IcoMoon.ttf') format('truetype'), url('../../../../media/jui/fonts/IcoMoon.svg#IcoMoon') format('svg');
	font-weight: normal;
	font-style: normal;
}
[data-icon]:before {
	font-family: 'IcoMoon';
	content: attr(data-icon);
	speak: none;
}
[class^="icon-"],
[class*=" icon-"] {
	display: inline-block;
	width: 14px;
	height: 14px;
	margin-right: .25em;
	line-height: 14px;
}
[class^="icon-"]:before,
[class*=" icon-"]:before {
	font-family: 'IcoMoon';
	font-style: normal;
	speak: none;
}
[class^="icon-"].disabled,
[class*=" icon-"].disabled {
	font-weight: normal;
}
.icon-joomla:before {
	content: "\e200";
}
.icon-chevron-up:before,
.icon-uparrow:before,
.icon-arrow-up:before {
	content: "\e005";
}
.icon-chevron-right:before,
.icon-rightarrow:before,
.icon-arrow-right:before {
	content: "\e006";
}
.icon-chevron-down:before,
.icon-downarrow:before,
.icon-arrow-down:before {
	content: "\e007";
}
.icon-chevron-left:before,
.icon-leftarrow:before,
.icon-arrow-left:before {
	content: "\e008";
}
.icon-arrow-first:before {
	content: "\e003";
}
.icon-arrow-last:before {
	content: "\e004";
}
.icon-arrow-up-2:before {
	content: "\e009";
}
.icon-arrow-right-2:before {
	content: "\e00a";
}
.icon-arrow-down-2:before {
	content: "\e00b";
}
.icon-arrow-left-2:before {
	content: "\e00c";
}
.icon-arrow-up-3:before {
	content: "\e00f";
}
.icon-arrow-right-3:before {
	content: "\e010";
}
.icon-arrow-down-3:before {
	content: "\e011";
}
.icon-arrow-left-3:before {
	content: "\e012";
}
.icon-menu-2:before {
	content: "\e00e";
}
.icon-arrow-up-4:before {
	content: "\e201";
}
.icon-arrow-right-4:before {
	content: "\e202";
}
.icon-arrow-down-4:before {
	content: "\e203";
}
.icon-arrow-left-4:before {
	content: "\e204";
}
.icon-share:before,
.icon-redo:before {
	content: "\27";
}
.icon-undo:before {
	content: "\28";
}
.icon-forward-2:before {
	content: "\e205";
}
.icon-backward-2:before,
.icon-reply:before {
	content: "\e206";
}
.icon-unblock:before,
.icon-refresh:before,
.icon-redo-2:before {
	content: "\6c";
}
.icon-undo-2:before {
	content: "\e207";
}
.icon-move:before {
	content: "\7a";
}
.icon-expand:before {
	content: "\66";
}
.icon-contract:before {
	content: "\67";
}
.icon-expand-2:before {
	content: "\68";
}
.icon-contract-2:before {
	content: "\69";
}
.icon-play:before {
	content: "\e208";
}
.icon-pause:before {
	content: "\e209";
}
.icon-stop:before {
	content: "\e210";
}
.icon-previous:before,
.icon-backward:before {
	content: "\7c";
}
.icon-next:before,
.icon-forward:before {
	content: "\7b";
}
.icon-first:before {
	content: "\7d";
}
.icon-last:before {
	content: "\e000";
}
.icon-play-circle:before {
	content: "\e00d";
}
.icon-pause-circle:before {
	content: "\e211";
}
.icon-stop-circle:before {
	content: "\e212";
}
.icon-backward-circle:before {
	content: "\e213";
}
.icon-forward-circle:before {
	content: "\e214";
}
.icon-loop:before {
	content: "\e001";
}
.icon-shuffle:before {
	content: "\e002";
}
.icon-search:before {
	content: "\53";
}
.icon-zoom-in:before {
	content: "\64";
}
.icon-zoom-out:before {
	content: "\65";
}
.icon-apply:before,
.icon-edit:before,
.icon-pencil:before {
	content: "\2b";
}
.icon-pencil-2:before {
	content: "\2c";
}
.icon-brush:before {
	content: "\3b";
}
.icon-save-new:before,
.icon-plus-2:before {
	content: "\5d";
}
.icon-minus-sign:before,
.icon-minus-2:before {
	content: "\5e";
}
.icon-delete:before,
.icon-remove:before,
.icon-cancel-2:before {
	content: "\49";
}
.icon-publish:before,
.icon-save:before,
.icon-ok:before,
.icon-checkmark:before {
	content: "\47";
}
.icon-new:before,
.icon-plus:before {
	content: "\2a";
}
.icon-plus-circle:before {
	content: "\e215";
}
.icon-minus:before,
.icon-not-ok:before {
	content: "\4b";
}
.icon-ban-circle:before,
.icon-minus-circle:before {
	content: "\e216";
}
.icon-unpublish:before,
.icon-cancel:before {
	content: "\4a";
}
.icon-cancel-circle:before {
	content: "\e217";
}
.icon-checkmark-2:before {
	content: "\e218";
}
.icon-checkmark-circle:before {
	content: "\e219";
}
.icon-info:before {
	content: "\e220";
}
.icon-info-2:before,
.icon-info-circle:before {
	content: "\e221";
}
.icon-question:before,
.icon-question-sign:before,
.icon-help:before {
	content: "\45";
}
.icon-question-2:before,
.icon-question-circle:before {
	content: "\e222";
}
.icon-notification:before {
	content: "\e223";
}
.icon-notification-2:before,
.icon-notification-circle:before {
	content: "\e224";
}
.icon-pending:before,
.icon-warning:before {
	content: "\48";
}
.icon-warning-2:before,
.icon-warning-circle:before {
	content: "\e225";
}
.icon-checkbox-unchecked:before {
	content: "\3d";
}
.icon-checkin:before,
.icon-checkbox:before,
.icon-checkbox-checked:before {
	content: "\3e";
}
.icon-checkbox-partial:before {
	content: "\3f";
}
.icon-square:before {
	content: "\e226";
}
.icon-radio-unchecked:before {
	content: "\e227";
}
.icon-radio-checked:before,
.icon-generic:before {
	content: "\e228";
}
.icon-circle:before {
	content: "\e229";
}
.icon-signup:before {
	content: "\e230";
}
.icon-grid:before,
.icon-grid-view:before {
	content: "\58";
}
.icon-grid-2:before,
.icon-grid-view-2:before {
	content: "\59";
}
.icon-menu:before {
	content: "\5a";
}
.icon-list:before,
.icon-list-view:before {
	content: "\31";
}
.icon-list-2:before {
	content: "\e231";
}
.icon-menu-3:before {
	content: "\e232";
}
.icon-folder-open:before,
.icon-folder:before {
	content: "\2d";
}
.icon-folder-close:before,
.icon-folder-2:before {
	content: "\2e";
}
.icon-folder-plus:before {
	content: "\e234";
}
.icon-folder-minus:before {
	content: "\e235";
}
.icon-folder-3:before {
	content: "\e236";
}
.icon-folder-plus-2:before {
	content: "\e237";
}
.icon-folder-remove:before {
	content: "\e238";
}
.icon-file:before {
	content: "\e016";
}
.icon-file-2:before {
	content: "\e239";
}
.icon-file-add:before,
.icon-file-plus:before {
	content: "\29";
}
.icon-file-minus:before {
	content: "\e017";
}
.icon-file-check:before {
	content: "\e240";
}
.icon-file-remove:before {
	content: "\e241";
}
.icon-save-copy:before,
.icon-copy:before {
	content: "\e018";
}
.icon-stack:before {
	content: "\e242";
}
.icon-tree:before {
	content: "\e243";
}
.icon-tree-2:before {
	content: "\e244";
}
.icon-paragraph-left:before {
	content: "\e246";
}
.icon-paragraph-center:before {
	content: "\e247";
}
.icon-paragraph-right:before {
	content: "\e248";
}
.icon-paragraph-justify:before {
	content: "\e249";
}
.icon-screen:before {
	content: "\e01c";
}
.icon-tablet:before {
	content: "\e01d";
}
.icon-mobile:before {
	content: "\e01e";
}
.icon-box-add:before {
	content: "\51";
}
.icon-box-remove:before {
	content: "\52";
}
.icon-download:before {
	content: "\e021";
}
.icon-upload:before {
	content: "\e022";
}
.icon-home:before {
	content: "\21";
}
.icon-home-2:before {
	content: "\e250";
}
.icon-out-2:before,
.icon-new-tab:before {
	content: "\e024";
}
.icon-out-3:before,
.icon-new-tab-2:before {
	content: "\e251";
}
.icon-link:before {
	content: "\e252";
}
.icon-picture:before,
.icon-image:before {
	content: "\2f";
}
.icon-pictures:before,
.icon-images:before {
	content: "\30";
}
.icon-palette:before,
.icon-color-palette:before {
	content: "\e014";
}
.icon-camera:before {
	content: "\55";
}
.icon-camera-2:before,
.icon-video:before {
	content: "\e015";
}
.icon-play-2:before,
.icon-video-2:before,
.icon-youtube:before {
	content: "\56";
}
.icon-music:before {
	content: "\57";
}
.icon-user:before {
	content: "\22";
}
.icon-users:before {
	content: "\e01f";
}
.icon-vcard:before {
	content: "\6d";
}
.icon-address:before {
	content: "\70";
}
.icon-share-alt:before,
.icon-out:before {
	content: "\26";
}
.icon-enter:before {
	content: "\e257";
}
.icon-exit:before {
	content: "\e258";
}
.icon-comment:before,
.icon-comments:before {
	content: "\24";
}
.icon-comments-2:before {
	content: "\25";
}
.icon-quote:before,
.icon-quotes-left:before {
	content: "\60";
}
.icon-quote-2:before,
.icon-quotes-right:before {
	content: "\61";
}
.icon-quote-3:before,
.icon-bubble-quote:before {
	content: "\e259";
}
.icon-phone:before {
	content: "\e260";
}
.icon-phone-2:before {
	content: "\e261";
}
.icon-envelope:before,
.icon-mail:before {
	content: "\4d";
}
.icon-envelope-opened:before,
.icon-mail-2:before {
	content: "\4e";
}
.icon-unarchive:before,
.icon-drawer:before {
	content: "\4f";
}
.icon-archive:before,
.icon-drawer-2:before {
	content: "\50";
}
.icon-briefcase:before {
	content: "\e020";
}
.icon-tag:before {
	content: "\e262";
}
.icon-tag-2:before {
	content: "\e263";
}
.icon-tags:before {
	content: "\e264";
}
.icon-tags-2:before {
	content: "\e265";
}
.icon-options:before,
.icon-cog:before {
	content: "\38";
}
.icon-cogs:before {
	content: "\37";
}
.icon-screwdriver:before,
.icon-tools:before {
	content: "\36";
}
.icon-wrench:before {
	content: "\3a";
}
.icon-equalizer:before {
	content: "\39";
}
.icon-dashboard:before {
	content: "\78";
}
.icon-switch:before {
	content: "\e266";
}
.icon-filter:before {
	content: "\54";
}
.icon-purge:before,
.icon-trash:before {
	content: "\4c";
}
.icon-checkedout:before,
.icon-lock:before,
.icon-locked:before {
	content: "\23";
}
.icon-unlock:before {
	content: "\e267";
}
.icon-key:before {
	content: "\5f";
}
.icon-support:before {
	content: "\46";
}
.icon-database:before {
	content: "\62";
}
.icon-scissors:before {
	content: "\e268";
}
.icon-health:before {
	content: "\6a";
}
.icon-wand:before {
	content: "\6b";
}
.icon-eye-open:before,
.icon-eye:before {
	content: "\3c";
}
.icon-eye-close:before,
.icon-eye-blocked:before,
.icon-eye-2:before {
	content: "\e269";
}
.icon-clock:before {
	content: "\6e";
}
.icon-compass:before {
	content: "\6f";
}
.icon-broadcast:before,
.icon-connection:before,
.icon-wifi:before {
	content: "\e01b";
}
.icon-book:before {
	content: "\e271";
}
.icon-lightning:before,
.icon-flash:before {
	content: "\79";
}
.icon-print:before,
.icon-printer:before {
	content: "\e013";
}
.icon-feed:before {
	content: "\71";
}
.icon-calendar:before {
	content: "\43";
}
.icon-calendar-2:before {
	content: "\44";
}
.icon-calendar-3:before {
	content: "\e273";
}
.icon-pie:before {
	content: "\77";
}
.icon-bars:before {
	content: "\76";
}
.icon-chart:before {
	content: "\75";
}
.icon-power-cord:before {
	content: "\32";
}
.icon-cube:before {
	content: "\33";
}
.icon-puzzle:before {
	content: "\34";
}
.icon-attachment:before,
.icon-paperclip:before,
.icon-flag-2:before {
	content: "\72";
}
.icon-lamp:before {
	content: "\74";
}
.icon-pin:before,
.icon-pushpin:before {
	content: "\73";
}
.icon-location:before {
	content: "\63";
}
.icon-shield:before {
	content: "\e274";
}
.icon-flag:before {
	content: "\35";
}
.icon-flag-3:before {
	content: "\e275";
}
.icon-bookmark:before {
	content: "\e023";
}
.icon-bookmark-2:before {
	content: "\e276";
}
.icon-heart:before {
	content: "\e277";
}
.icon-heart-2:before {
	content: "\e278";
}
.icon-thumbs-up:before {
	content: "\5b";
}
.icon-thumbs-down:before {
	content: "\5c";
}
.icon-unfeatured:before,
.icon-asterisk:before,
.icon-star-empty:before {
	content: "\40";
}
.icon-star-2:before {
	content: "\41";
}
.icon-featured:before,
.icon-default:before,
.icon-star:before {
	content: "\42";
}
.icon-smiley:before,
.icon-smiley-happy:before {
	content: "\e279";
}
.icon-smiley-2:before,
.icon-smiley-happy-2:before {
	content: "\e280";
}
.icon-smiley-sad:before {
	content: "\e281";
}
.icon-smiley-sad-2:before {
	content: "\e282";
}
.icon-smiley-neutral:before {
	content: "\e283";
}
.icon-smiley-neutral-2:before {
	content: "\e284";
}
.icon-cart:before {
	content: "\e019";
}
.icon-basket:before {
	content: "\e01a";
}
.icon-credit:before {
	content: "\e286";
}
.icon-credit-2:before {
	content: "\e287";
}
.icon-expired:before {
	content: "\4b";
}
.icon-edit:before {
	color: #24748c;
}
.icon-publish:before,
.icon-save:before,
.icon-ok:before,
.icon-save-new:before,
.icon-save-copy:before,
.btn-toolbar .icon-copy:before {
	color: #378137;
}
.icon-unpublish:before,
.icon-not-ok:before,
.icon-eye-close:before,
.icon-ban-circle:before,
.icon-minus-sign:before,
.btn-toolbar .icon-cancel:before {
	color: #942a25;
}
.icon-featured:before,
.icon-default:before,
.icon-expired:before,
.icon-pending:before {
	color: #c67605;
}
.icon-back:before {
	content: "\e008";
}
html {
	height: 100%;
}
body {
	height: 100%;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	box-sizing: border-box;
}
a:hover,
a:active,
a:focus {
	outline: none;
}
.small {
	font-size: 11px;
}
.row-even .small,
.row-odd .small,
.row-even .small a,
.row-odd .small a {
	color: #888;
}
.content-title {
	font-size: 24px;
	font-weight: normal;
	line-height: 26px;
	margin-top: 0;
}
.well .page-header {
	margin: -10px 0 18px 0;
	padding-bottom: 5px;
}
.well .module-title.nav-header {
	padding: 0 0 7px;
	margin: 0;
	font-size: 13px;
}
.well .row-even p,
.well .row-odd p {
	margin-bottom: 0;
}
h1,
h2,
h3,
h4,
h5,
h6 {
	margin: 12px 0;
}
h1 {
	font-size: 26px;
	line-height: 28px;
}
h2 {
	font-size: 22px;
	line-height: 24px;
}
h3 {
	font-size: 18px;
	line-height: 20px;
}
h4 {
	font-size: 14px;
	line-height: 16px;
}
h5 {
	font-size: 13px;
	line-height: 15px;
}
h6 {
	font-size: 12px;
	line-height: 14px;
}
.truncate {
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.chzn-container .chzn-drop {
	border-radius: 0 0 3px 3px;
}
.control-group .chzn-container {
	max-width: 100%;
}
.control-group .chzn-container .chzn-choices li.search-field,
.control-group .chzn-container .chzn-choices li.search-field input {
	width: 100% !important;
}
.chzn-container-single .chzn-single {
	background-color: #fff;
	background-clip: inherit;
	background-image: none;
	border: 1px solid #ccc;
	border: 1px solid rgba(0,0,0,0.2);
	border-radius: 3px;
	box-shadow: 0 1px 0 rgba(255,255,255,0.2) inset, 0 1px 2px rgba(0,0,0,0.05);
	height: auto;
	line-height: 26px;
}
.chzn-container-single .chzn-single div {
	background-color: #f3f3f3;
	border-left: 1px solid #ccc;
	bottom: 0;
	height: auto;
	text-align: center;
	width: 28px;
}
.chzn-container-single .chzn-single div b {
	background-image: none;
	display: inline-block;
}
.chzn-container-single .chzn-single div b:after {
	content: '\E011';
	font-family: IcoMoon;
}
.chzn-container-single .chzn-single abbr {
	background: none;
	right: 36px;
	top: 0;
}
.chzn-container-single .chzn-single abbr:before {
	font-family: IcoMoon;
	content: '\0049';
	font-size: 10px;
	line-height: 26px;
}
.chzn-container-single .chzn-single abbr:hover {
	color: #000;
}
.chzn-container-single .chzn-search:after {
	content: '\0053';
	font-family: IcoMoon;
	position: relative;
	right: 20px;
	top: 2px;
}
.chzn-container-single .chzn-search input[type="text"] {
	background: none;
	border-radius: 3px;
	border: 1px solid #ccc;
	box-shadow: none;
	height: 25px;
}
.chzn-container-single .chzn-search input[type="text"]:focus {
	border-color: #3071A9;
}
.chzn-container-single .chzn-drop {
	background-clip: padding-box;
	border-color: #3071A9;
	border-radius: 0 0 3px 3px;
}
.chzn-container-active .chzn-single {
	color: #3071A9;
}
.chzn-container-active.chzn-with-drop .chzn-single {
	background-image: none;
	border: 1px solid #3071A9;
	border-bottom-left-radius: 0;
	border-bottom-right-radius: 0;
}
.chzn-container-active.chzn-with-drop .chzn-single div {
	background-color: #f3f3f3;
	border-bottom: 1px solid #ccc;
	border-bottom-left-radius: 3px;
	border-left: 1px solid #ccc;
}
.chzn-container-active.chzn-with-drop .chzn-single div b:after {
	content: '\E00F';
	font-family: IcoMoon;
}
.chzn-container-active.chzn-container-multi .chzn-choices {
	border: 1px solid #3071A9;
	box-shadow: none;
}
.chzn-container .chzn-results {
	background-color: #fff;
	border-radius: 0 0 3px 3px;
	margin: 0;
	padding: 0;
}
.chzn-container .chzn-results li.highlighted {
	background-color: #3071A9;
	background-image: none;
}
.chzn-color[rel="value_"] div {
	background-color: #f3f3f3;
	border-left: 1px solid #ccc;
}
.chzn-color-state.chzn-single div,
.chzn-color.chzn-single[rel="value_0"] div,
.chzn-color.chzn-single[rel="value_1"] div,
.chzn-color-state.chzn-single[rel="value_-1"] div,
.chzn-color-state.chzn-single[rel="value_-2"] div,
.chzn-color.chzn-single[rel="value_hide"] div,
.chzn-color.chzn-single[rel="value_show_no_link"] div,
.chzn-color.chzn-single[rel="value_show_with_link"] div {
	background-color: transparent !important;
	border: none !important;
}
.chzn-container-active .chzn-choices {
	border: 1px solid #3071A9;
}
.chzn-container-multi .chzn-choices {
	background-image: none;
	border-radius: 3px;
	border: 1px solid #ccc;
}
.chzn-container-multi .chzn-choices li.search-choice {
	background-color: #3071A9;
	background-image: none;
	border: 0;
	box-shadow: none;
	color: #fff;
	line-height: 20px;
	padding: 0 7px;
}
.chzn-container-multi .chzn-choices li.search-choice .search-choice-close {
	color: #f5f5f5;
	display: inline-block;
	margin-left: 5px;
	position: relative;
	top: 0;
	left: 0;
	background-image: none;
	font-size: inherit;
}
.chzn-container-multi .chzn-choices li.search-choice .search-choice-close:hover {
	text-decoration: none;
}
.chzn-container-multi .chzn-choices li.search-choice .search-choice-close:before {
	font-family: IcoMoon;
	content: '\004A';
	position: relative;
	right: 1px;
	top: 0;
}
.js-stools .js-stools-container-bar .js-stools-field-filter .chzn-container {
	margin: 1px 0;
	padding: 0 !important;
}
.chzn-color.chzn-single[rel="value_1"],
.chzn-color-reverse.chzn-single[rel="value_0"],
.chzn-color-state.chzn-single[rel="value_1"],
.chzn-color.chzn-single[rel="value_show_no_link"],
.chzn-color.chzn-single[rel="value_show_with_link"] {
	background-color: #46a546;
	*background-color: #46a546;
	box-shadow: 0 1px 2px rgba(0,0,0,0.05);
	color: #ffffff;
}
.chzn-color.chzn-single[rel="value_1"]:hover,
.chzn-color.chzn-single[rel="value_1"]:focus,
.chzn-color.chzn-single[rel="value_1"]:active,
.chzn-color.chzn-single[rel="value_1"].active,
.chzn-color.chzn-single[rel="value_1"].disabled,
.chzn-color.chzn-single[rel="value_1"][disabled],
.chzn-color-reverse.chzn-single[rel="value_0"]:hover,
.chzn-color-reverse.chzn-single[rel="value_0"]:focus,
.chzn-color-reverse.chzn-single[rel="value_0"]:active,
.chzn-color-reverse.chzn-single[rel="value_0"].active,
.chzn-color-reverse.chzn-single[rel="value_0"].disabled,
.chzn-color-reverse.chzn-single[rel="value_0"][disabled],
.chzn-color-state.chzn-single[rel="value_1"]:hover,
.chzn-color-state.chzn-single[rel="value_1"]:focus,
.chzn-color-state.chzn-single[rel="value_1"]:active,
.chzn-color-state.chzn-single[rel="value_1"].active,
.chzn-color-state.chzn-single[rel="value_1"].disabled,
.chzn-color-state.chzn-single[rel="value_1"][disabled],
.chzn-color.chzn-single[rel="value_show_no_link"]:hover,
.chzn-color.chzn-single[rel="value_show_no_link"]:focus,
.chzn-color.chzn-single[rel="value_show_no_link"]:active,
.chzn-color.chzn-single[rel="value_show_no_link"].active,
.chzn-color.chzn-single[rel="value_show_no_link"].disabled,
.chzn-color.chzn-single[rel="value_show_no_link"][disabled],
.chzn-color.chzn-single[rel="value_show_with_link"]:hover,
.chzn-color.chzn-single[rel="value_show_with_link"]:focus,
.chzn-color.chzn-single[rel="value_show_with_link"]:active,
.chzn-color.chzn-single[rel="value_show_with_link"].active,
.chzn-color.chzn-single[rel="value_show_with_link"].disabled,
.chzn-color.chzn-single[rel="value_show_with_link"][disabled] {
	color: #fff;
	background-color: #2f6f2f;
	*background-color: #2f6f2f;
}
.chzn-color.chzn-single[rel="value_1"]:active,
.chzn-color.chzn-single[rel="value_1"].active,
.chzn-color-reverse.chzn-single[rel="value_0"]:active,
.chzn-color-reverse.chzn-single[rel="value_0"].active,
.chzn-color-state.chzn-single[rel="value_1"]:active,
.chzn-color-state.chzn-single[rel="value_1"].active,
.chzn-color.chzn-single[rel="value_show_no_link"]:active,
.chzn-color.chzn-single[rel="value_show_no_link"].active,
.chzn-color.chzn-single[rel="value_show_with_link"]:active,
.chzn-color.chzn-single[rel="value_show_with_link"].active {
	background-color: #46a546;
}
.chzn-color-state.chzn-single[rel="value_0"],
.chzn-color-state.chzn-single[rel="value_-2"] {
	background-color: #bd362f;
	*background-color: #bd362f;
	box-shadow: 0 1px 2px rgba(0,0,0,0.05);
	color: #ffffff;
}
.chzn-color-state.chzn-single[rel="value_0"]:hover,
.chzn-color-state.chzn-single[rel="value_0"]:focus,
.chzn-color-state.chzn-single[rel="value_0"]:active,
.chzn-color-state.chzn-single[rel="value_0"].active,
.chzn-color-state.chzn-single[rel="value_0"].disabled,
.chzn-color-state.chzn-single[rel="value_0"][disabled],
.chzn-color-state.chzn-single[rel="value_-2"]:hover,
.chzn-color-state.chzn-single[rel="value_-2"]:focus,
.chzn-color-state.chzn-single[rel="value_-2"]:active,
.chzn-color-state.chzn-single[rel="value_-2"].active,
.chzn-color-state.chzn-single[rel="value_-2"].disabled,
.chzn-color-state.chzn-single[rel="value_-2"][disabled] {
	color: #fff;
	background-color: #802420;
	*background-color: #802420;
}
.chzn-color-state.chzn-single[rel="value_0"]:active,
.chzn-color-state.chzn-single[rel="value_0"].active,
.chzn-color-state.chzn-single[rel="value_-2"]:active,
.chzn-color-state.chzn-single[rel="value_-2"].active {
	background-color: #bd362f;
}
.CodeMirror {
	height: calc(100vh - 400px);
	min-height: 400px;
	max-height: 800px;
}
.form-horizontal .control-label {
	padding-right: 5px;
	text-align: left;
}
.form-horizontal .control-label .spacer hr {
	width: 380px;
}
@media (max-width: 420px) {
	.form-horizontal .control-label .spacer hr {
		width: 220px;
	}
}
.form-horizontal .field-spacer>.control-label {
	width: auto;
}
.form-horizontal #jform_catid_chzn {
	vertical-align: middle;
}
.form-vertical .control-label > label {
	display: inline-block;
	*display: inline;
	*zoom: 1;
}
.form-vertical .controls {
	margin-left: 0;
}
@media (max-width: 979px) {
	.form-horizontal-desktop .control-label {
		float: none;
		width: auto;
		padding-right: 0;
		padding-top: 0;
		text-align: left;
	}
	.form-horizontal-desktop .control-label > label {
		display: inline-block;
		*display: inline;
		*zoom: 1;
	}
	.form-horizontal-desktop .controls {
		margin-left: 0;
	}
}
@media (max-width: 1199px) {
	.row-fluid .row-fluid .form-horizontal-desktop .control-label {
		float: none;
		width: auto;
		padding-right: 0;
		padding-top: 0;
		text-align: left;
	}
	.row-fluid .row-fluid .form-horizontal-desktop .control-label > label {
		display: inline-block;
		*display: inline;
		*zoom: 1;
	}
	.row-fluid .row-fluid .form-horizontal-desktop .controls {
		margin-left: 0;
	}
}
.form-inline-header {
	margin: 5px 0;
}
.form-inline-header .control-group,
.form-inline-header .control-label,
.form-inline-header .controls {
	display: inline-block;
	*display: inline;
	*zoom: 1;
}
.form-inline-header .control-label {
	width: auto;
	padding-right: 10px;
}
.form-inline-header .controls {
	padding-right: 20px;
}
fieldset[class^="form-"] {
	min-width: 100%;
}
@-moz-document url-prefix() {
	fieldset[class^="form-"] {
		display: table-cell;
	}
}
fieldset.checkboxes input {
	float: left;
}
fieldset.checkboxes li {
	list-style: none;
}
.control-group,
.controls,
.controls input[type="text"],
.controls input[type="number"],
.controls input[type="email"],
.controls select,
.controls textarea {
	max-width: 100%;
}
.controls .btn-group > .btn {
	min-width: 50px;
	margin-left: -1px;
}
.controls .btn-group.btn-group-yesno {
	width: 220px;
	max-width: 100%;
}
.controls .btn-group.btn-group-yesno > .btn {
	width: 50%;
	min-width: 40px;
	padding: 2px 0;
}
input.input-large-text {
	font-size: 18px;
	line-height: 22px;
	height: auto;
}
textarea {
	resize: both;
}
textarea.vert {
	resize: vertical;
}
textarea.noResize {
	resize: none;
}
.subform-repeatable {
	padding-right: 10px;
}
.subform-repeatable > .btn-toolbar {
	margin: 0;
}
.subform-repeatable > .btn-toolbar .group-add {
	line-height: 26px;
	width: 56px;
	font-size: 13px;
	margin-left: 28px;
}
.subform-repeatable-group {
	margin-top: 20px;
	margin-left: 28px;
	border: 1px solid #ccc;
	padding: 8px 25px 15px;
	position: relative;
	border-radius: 3px;
}
.subform-repeatable-group > .btn-toolbar {
	margin: 0;
}
.subform-repeatable-group > .btn-toolbar .btn-group {
	margin-right: 0px;
	margin-top: -1px;
	position: static;
}
.subform-repeatable-group > .btn-toolbar .btn {
	font-size: 13px;
	line-height: 26px;
	background-color: #F3F3F3;
	position: absolute;
}
.subform-repeatable-group > .btn-toolbar .btn span {
	vertical-align: middle;
	line-height: 11px;
}
.subform-repeatable-group > .btn-toolbar .btn.btn-success {
	color: #378137;
	bottom: 0;
	right: 0;
	border-radius: 3px 0 0 0;
	border-width: 1px 0 0 1px;
	padding-top: 1px;
}
.subform-repeatable-group > .btn-toolbar .btn.btn-success .icon-plus:before {
	content: "]";
}
.subform-repeatable-group > .btn-toolbar .btn.btn-danger {
	color: #942a25;
	top: 0;
	right: 0;
	border-radius: 0 0 0 3px;
	border-width: 0 0 1px 1px;
}
.subform-repeatable-group > .btn-toolbar .btn.btn-danger .icon-minus:before {
	content: "I";
}
.subform-repeatable-group > .btn-toolbar .btn.btn-primary {
	color: #24748c;
	color: #333;
	right: 100%;
	top: 50%;
	margin-top: -27px;
	margin-right: 1px;
	border-radius: 3px 0 0 3px;
	border-width: 1px 0 1px 1px;
	line-height: 52px;
}
.subform-repeatable-group > .btn-toolbar .btn.btn-primary .icon-move:before {
	content: "Z";
}
.subform-repeatable-group > .btn-toolbar .btn [class^="icon-"],
.subform-repeatable-group > .btn-toolbar .btn [class*=" icon-"] {
	margin: 0;
}
.subform-repeatable-group > .btn-toolbar .btn:hover {
	background-color: #E6E6E6;
}
.subform-repeatable-group .control-group:last-of-type {
	margin-bottom: 10px;
}
@media (max-width: 979px) {
	.subform-repeatable-group > .btn-toolbar .btn-group {
		margin-bottom: 10px;
	}
}
.subform-table-layout .control-group {
	margin-bottom: 10px;
}
.subform-table-layout .control-group:last-of-type {
	margin-bottom: 0;
}
.subform-table-layout .controls {
	padding-right: 20px;
}
.subform-table-layout input {
	width: 100%;
	max-width: 206px;
}
.subform-table-layout table .btn-group {
	margin: 0 7px;
}
@media (max-width: 1024px) {
	.subform-table-layout .subform-repeatable {
		padding-right: 0;
	}
	.subform-table-layout .subform-repeatable tbody td:last-of-type {
		text-align: right;
		padding-bottom: 15px;
	}
	.subform-table-layout table,
	.subform-table-layout thead,
	.subform-table-layout tbody,
	.subform-table-layout th,
	.subform-table-layout td,
	.subform-table-layout tr {
		display: block;
	}
	.subform-table-layout table {
		border: 1px solid #ddd;
	}
	.subform-table-layout thead th {
		position: absolute;
		top: -9999px;
		left: -9999px;
	}
	.subform-table-layout thead th:last-of-type {
		position: static;
		width: 100% !important;
		text-align: right;
		box-sizing: border-box;
		border-left: 0;
	}
	.subform-table-layout tr {
		margin: 0;
		padding: 0;
		border: 0;
	}
	.subform-table-layout td {
		border: none;
		position: relative;
		padding-left: 50%;
	}
	.subform-table-layout tbody td:first-of-type {
		padding-top: 15px;
		border-top: 1px solid #ddd;
	}
	.subform-table-layout tbody td:first-of-type:before {
		top: 18px;
	}
	.subform-table-layout td:before {
		content: attr(data-column);
		position: absolute;
		top: 13px;
		left: 10px;
		padding-right: 10px;
	}
}
.controls > .radio:first-child,
.controls > .checkbox:first-child {
	padding-top: 0;
}
.form-horizontal .controls > .radio:first-child,
.form-horizontal .controls > .checkbox:first-child {
	padding-top: 5px;
}
.form-horizontal .controls > .radio.btn-group:first-child {
	padding-top: 0;
}
.form-horizontal .controls > .radio.btn-group-yesno:first-child {
	padding-top: 2px;
}
input.field-media-input {
	width: auto;
}
.header {
	background-color: #1a3867;
	border-top: 1px solid rgba(255,255,255,0.2);
	padding: 8px 25px;
}
@media (max-width: 767px) {
	.header {
		padding: 4px 18px;
		margin-left: -20px;
		margin-right: -20px;
	}
}
.header .navbar-search {
	margin-top: 0;
}
@media (max-width: 979px) {
	.header .navbar-search {
		border-top: 0;
		border-bottom: 0;
		-webkit-box-shadow: none;
		-moz-box-shadow: none;
		box-shadow: none;
	}
}
.container-logo {
	float: right;
	text-align: right;
}
.logo {
	width: auto;
	max-width: 100%;
	max-height: 36px;
	height: auto;
}
.page-title {
	color: white;
	font-weight: normal;
	font-size: 20px;
	line-height: 36px;
	margin: 0;
}
.page-title [class^="icon-"],
.page-title [class*=" icon-"] {
	margin-right: 16px;
}
@media (max-width: 767px) {
	.container-logo {
		display: none;
	}
	.page-title {
		font-size: 18px;
		line-height: 28px;
	}
	.page-title [class^="icon-"],
	.page-title [class*=" icon-"] {
		margin-right: 10px;
	}
}
.view-login {
	background-color: #17568c;
	padding-top: 0;
}
.view-login .container {
	width: 300px;
	position: absolute;
	top: 50%;
	left: 50%;
	margin-top: -206px;
	margin-left: -150px;
}
.view-login .navbar-fixed-bottom {
	padding-left: 20px;
	padding-right: 20px;
	text-align: center;
}
.view-login .navbar-fixed-bottom,
.view-login .navbar-fixed-bottom a {
	color: #FCFCFC;
}
.view-login .navbar-inverse.navbar-fixed-bottom,
.view-login .navbar-inverse.navbar-fixed-bottom a {
	color: #555;
}
.view-login .well {
	padding-bottom: 0;
}
.view-login .login-joomla {
	position: absolute;
	left: 50%;
	height: 24px;
	width: 24px;
	margin-left: -12px;
	font-size: 22px;
}
.view-login .navbar-fixed-bottom {
	position: absolute;
}
.view-login .input-medium {
	width: 176px;
}
.view-login #lang_chzn {
	width: 233px !important;
	max-width: none;
}
.view-login #lang_chzn .chzn-single div {
	width: 43px;
}
.view-login .input-prepend .add-on,
.view-login .controls .btn-group > .btn {
	margin-left: 0;
}
.navbar-inverse {
	color: #333;
}
.login .btn-large {
	margin-top: 15px;
}
.login .form-inline .btn-group {
	display: block;
}
@media (max-width: 479px) {
	.login .chzn-single {
		width: 222px !important;
	}
	.login .chzn-container,
	.login .chzn-drop {
		width: 230px !important;
	}
}
@media (max-width: 319px) {
	.view-login .navbar-fixed-bottom {
		display: none;
	}
}
.ventral-space {
	margin-bottom: 5px;
}
ul.manager .height-50 .icon-folder-2 {
	height: 35px;
	width: 35px;
	line-height: 35px;
	font-size: 30px;
}
#imageForm .well {
	margin-bottom: 5px;
}
.thumbnails-media .thumbnail {
	background-color: #f4f4f4;
	border-radius: 3px;
	border: 0;
	box-shadow: 0 0 0 1px rgba(0,0,0,0.05) inset;
	padding: 0px;
	height: 100px;
	width: 100px;
	margin: 8px;
	position: relative;
	text-align: center;
	overflow: hidden;
}
.thumbnails-media .thumbnail .close {
	background-color: #ccc;
	border-left: 1px solid rgba(0,0,0,0.1);
	height: 22px;
	line-height: 22px;
	opacity: 0.3;
	text-align: center;
	width: 22px;
	top: 0;
	right: 0;
}
.thumbnails-media .thumbnail .close:hover {
	background-color: #bbb;
}
.thumbnails-media .thumbnail *,
.thumbnails-media .thumbnail *:before {
	-webkit-transition: all 0.2s ease;
	transition: all 0.2s ease;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}
.thumbnails-media .thumbnail input[type="radio"],
.thumbnails-media .thumbnail input[type="checkbox"] {
	margin: 0;
	opacity: 0.55;
	position: absolute;
	top: 5px;
	left: 5px;
}
.thumbnails-media .thumbnail .controls,
.thumbnails-media .thumbnail .imginfoBorder {
	display: none;
}
.thumbnails-media .imgThumb {
	position: relative;
	z-index: 1;
	width: 100%;
	display: inline-block;
}
.thumbnails-media .imgThumb input {
	display: none;
}
.thumbnails-media .imgThumb label,
.thumbnails-media .imgThumb .imgThumbInside {
	display: block;
	line-height: 100px;
	position: relative;
	width: 100%;
	border-radius: 3px;
	overflow: hidden;
}
.thumbnails-media .imgThumb label:before,
.thumbnails-media .imgThumb .imgThumbInside:before {
	font-family: "IcoMoon";
	font-style: normal;
	content: 'G';
	position: absolute;
	top: 0;
	right: 0;
	background-color: #46a546;
	color: #fff;
	line-height: 26px;
	width: 26px;
	-webkit-transform: scale(0.5);
	transform: scale(0.5);
	opacity: 0;
	border-color: rgba(0,0,0,0.2);
	box-shadow: 0 1px 2px rgba(0,0,0,0.05);
	border-radius: 0 3px;
}
.thumbnails-media .imgThumb img {
	width: auto;
}
.thumbnails-media .selected :checked + label,
.thumbnails-media .selected .imgThumbInside,
.thumbnails-media .imgInput :checked + label,
.thumbnails-media .imgInput .imgThumbInside {
	background-color: #ddd;
}
.thumbnails-media .selected :checked + label:before,
.thumbnails-media .selected .imgThumbInside:before,
.thumbnails-media .imgInput :checked + label:before,
.thumbnails-media .imgInput .imgThumbInside:before {
	-webkit-transform: scale(1);
	transform: scale(1);
	opacity: 1;
}
.thumbnails-media .selected :checked + label:after,
.thumbnails-media .selected .imgThumbInside:after,
.thumbnails-media .imgInput :checked + label:after,
.thumbnails-media .imgInput .imgThumbInside:after {
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	content: '';
	border: 3px solid #46a546;
	border-radius: 5px;
}
.thumbnails-media .imgDelete a.close,
.thumbnails-media .imgPreview a {
	padding: 0;
	position: absolute;
	left: 0;
	z-index: 1;
	height: 26px;
	width: 26px;
}
.thumbnails-media .imgPreview a {
	width: 100%;
}
.thumbnails-media .imgDelete a.close {
	background-color: #bd362f;
	border-color: #bd362f rgba(0,0,0,0.2) rgba(0,0,0,0.2) #bd362f;
	top: 0;
	line-height: 28px;
	font-size: 12px;
	padding-left: 1px;
	color: #fff;
	border-bottom-right-radius: 3px;
	border-top-left-radius: 3px;
	z-index: 10;
	opacity: 0;
	-webkit-transform: scale(0.5);
	transform: scale(0.5);
}
.thumbnails-media .imgDelete a.close:hover {
	background-color: #802420;
}
.thumbnails-media .thumbnail:hover .imgDelete a.close {
	opacity: 1;
	-webkit-transform: scale(1);
	transform: scale(1);
}
.thumbnails-media .imgPreview a,
.thumbnails-media .imgDetails {
	position: absolute;
	left: 0;
	text-align: left;
	background-color: #fff;
	border-color: rgba(0,0,0,0.2);
	bottom: 0;
	line-height: 26px;
	border: 1px solid rgba(0,0,0,0.1);
	border-width: 1px;
	border-radius: 0 3px 0 0;
	z-index: 1;
}
.thumbnails-media .imgPreview a:hover,
.thumbnails-media .imgDetails:hover {
	background-color: #eee;
}
.thumbnails-media .imgDetails {
	padding: 0 5px;
	line-height: 20px;
	color: #555;
}
.thumbnails-media .imgFolder span {
	line-height: 90px;
	font-size: 38px;
	margin: 0;
	width: auto;
}
.thumbnails-media .imgFolder + .imgDetails {
	color: inherit;
}
.com_media .media a + a {
	margin-left: -1px;
}
.com_media .tree-holder {
	padding: 0 15px;
}
#folderframe.thumbnail {
	border: 0;
	box-shadow: none;
	padding: 0;
}
#mediamanager-form {
	margin: 0 -10px;
	overflow-x: hidden;
}
#mediamanager-form > .muted {
	padding: 0px;
}
#mediamanager-form .checkbox {
	padding-left: 30px;
	margin-bottom: 15px;
}
#mediamanager-form .checkbox input {
	margin-top: 3px;
}
#mediamanager-form .thumbnails {
	margin: 0 -8px;
	overflow-x: hidden;
}
#mediamanager-form .thumbnails .thumbnail {
	height: 120px;
	width: 120px;
	margin: 8px;
}
#mediamanager-form .thumbnails .imgThumb label,
#mediamanager-form .thumbnails .imgTotal {
	line-height: 120px;
}
#mediamanager-form .icon-search::before {
	padding-right: 5px;
	padding-left: 1px;
}
#mediamanager-form .height-50 {
	background-color: #fafafa;
	height: 77px;
	position: relative;
	z-index: 1;
	width: 100%;
	display: inline-block;
}
#mediamanager-form .height-50 a,
#mediamanager-form .height-50 .icon-folder-2 {
	display: inline-block;
	line-height: 75px;
	margin-top: -1px;
}
#mediamanager-form .height-50 a:after {
	bottom: 0;
	box-shadow: 0 0 0 1px rgba(0,0,0,0.08) inset;
	content: "";
	display: block;
	left: 0;
	overflow: hidden;
	position: absolute;
	right: 0;
	top: 0;
}
#mediamanager-form .height-50 .icon-folder-2 {
	font-size: 40px;
}
.uploadform {
	margin-top: 20px;
}
body.modal-open {
	-ms-overflow-style: none;
}
.modal-header {
	padding: 0 20px;
	text-align: left;
}
.modal-header h3 {
	font-weight: normal;
	line-height: 50px;
}
.modal-header .close {
	width: 50px;
	margin-top: 0;
	margin-right: -15px;
	font-size: 2rem;
	line-height: 50px;
	border-left: 1px solid #ccc;
}
.modal-body {
	padding: 0;
	width: 100%;
	height: auto;
	max-height: none;
}
.modal-body .container-fluid {
	padding-top: 15px;
	padding-bottom: 15px;
}
.modal-footer {
	clear: both;
}
.contentpane {
	padding: 10px;
	height: auto;
}
@media (min-width: 768px) {
	.row-fluid .modal-batch [class*="span"] {
		margin-left: 0;
	}
}
.container-popup {
	padding: 10px;
}
.field-media-wrapper iframe {
	max-height: 75vh;
}
body .navbar,
body .navbar-fixed-top {
	margin-bottom: 0;
}
.navbar-inner {
	min-height: 0;
	background: #f2f2f2;
	background-image: none;
	filter: none;
}
.navbar-inner .container-fluid {
	padding-left: 10px;
	padding-right: 10px;
	font-size: 15px;
}
.navbar-inverse .navbar-inner {
	background: #10223e;
	background-image: none;
	filter: none;
}
.navbar .navbar-text {
	line-height: 30px;
}
.navbar .admin-logo {
	float: left;
	padding: 7px 12px 0px 15px;
	font-size: 16px;
	color: #555;
}
.navbar .admin-logo:hover {
	color: #333;
}
.navbar-inverse.navbar .admin-logo {
	color: #d9d9d9;
}
.navbar-inverse.navbar .admin-logo:hover {
	color: #ffffff;
}
.navbar .brand {
	float: right;
	display: block;
	padding: 6px 10px;
	margin-left: -20px;
	font-size: inherit;
	font-weight: normal;
}
.navbar .brand:hover,
.navbar .brand:focus {
	text-decoration: none;
}
.navbar .nav > li > a {
	padding: 6px 10px;
}
.navbar .nav > li > a:hover {
	color: white;
}
.navbar .nav > li > a:hover span.carot {
	border-bottom-color: #fff;
	border-top-color: #fff;
}
.navbar .dropdown-menu,
.navbar .nav-user {
	font-size: 13px;
}
.navbar .nav-user .dropdown-menu li span {
	padding-left: 10px;
}
.navbar .nav > li ul {
	overflow-y: auto;
	overflow-x: hidden;
	-webkit-overflow-scrolling: touch;
	-moz-overflow-scrolling: touch;
	-ms-overflow-scrolling: touch;
	-o-overflow-scrolling: touch;
	overflow-scrolling: touch;
	height: auto;
	max-height: 500px;
	margin: 0;
}
.navbar .nav > li ul::-webkit-scrollbar {
	-webkit-appearance: none;
	width: 7px;
}
.navbar .nav > li ul::-webkit-scrollbar-thumb {
	border-radius: 4px;
	background-color: rgba(0,0,0,0.5);
	-webkit-box-shadow: 0 0 1px rgba(255,255,255,0.5);
}
.navbar .nav > li > .dropdown-menu:after {
	display: none;
}
.navbar .nav > .dropdown.open:after {
	content: '';
	display: inline-block;
	border-left: 6px solid transparent;
	border-right: 6px solid transparent;
	border-bottom: 6px solid #fff;
	position: absolute;
	top: 25px;
	left: 10px;
	z-index: 1001;
}
.navbar .empty-nav {
	display: none;
}
.navbar-fixed-top .navbar-inner,
.navbar-static-top .navbar-inner {
	-webkit-box-shadow: none;
	-moz-box-shadow: none;
	box-shadow: none;
}
.dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus,
.dropdown-submenu:hover > a,
.dropdown-submenu:focus > a {
	background-image: none;
}
.navbar-fixed-bottom {
	bottom: 0;
}
.navbar-fixed-bottom .navbar-inner {
	-webkit-box-shadow: none;
	-moz-box-shadow: none;
	box-shadow: none;
}
.navbar .btn-navbar {
	background: #17568c;
	border: 1px solid #0D2242;
	margin-bottom: 2px;
}
@media (max-width: 767px) {
	.navbar .admin-logo {
		margin-left: 10px;
		padding: 9px 9px 0 9px;
	}
}
.navbar-search .search-query {
	background: rgba(255,255,255,0.3);
}
@media (max-width: 979px) {
	.navbar .nav {
		font-size: 13px;
		margin: 0 2px 0 0;
	}
	.navbar .nav > li > a {
		padding: 6px;
	}
}
@media (max-width: 767px) {
	.navbar-search.pull-right {
		float: none;
		text-align: center;
	}
}
@media (max-width: 738px) {
	.navbar .brand {
		font-size: 16px;
	}
}
.nav-collapse .nav li a,
.dropdown-menu a {
	background-image: none;
}
.nav-collapse .dropdown-menu > li img {
	max-width: none;
}
@media (max-width: 767px) {
	.navbar-fixed-top .navbar-inner,
	.navbar-fixed-top .navbar-inner .container-fluid {
		padding: 0;
	}
	.navbar .brand {
		margin-top: 2px;
		float: none;
		text-align: center;
	}
	.navbar .btn-navbar {
		margin-top: 3px;
		margin-right: 3px;
		margin-bottom: 3px;
	}
	.nav-collapse .nav .nav-header {
		color: #fff;
	}
	.nav-collapse .nav,
	.navbar .nav-collapse .nav.pull-right {
		margin: 0;
	}
	.nav-collapse .dropdown-menu {
		margin: 0;
	}
	.nav-collapse .dropdown-menu > li > span {
		display: block;
		padding: 4px 15px;
	}
	.navbar-inverse .nav-collapse .dropdown-menu > li > span {
		color: #d9d9d9;
	}
	.nav-collapse .nav > li > a.dropdown-toggle {
		background-color: rgba(255,255,255,0.07);
		font-size: 12px;
		font-weight: bold;
		color: #eee;
		text-transform: uppercase;
		padding-left: 15px;
	}
	.nav-collapse .nav li a {
		margin-bottom: 0;
		border-top: 1px solid rgba(255,255,255,0.25);
		border-bottom: 1px solid rgba(0,0,0,0.5);
	}
	.nav-collapse .nav li ul li ul.dropdown-menu,
	.nav-collapse .nav li ul li:hover ul.dropdown-menu,
	.nav-collapse .caret {
		display: none !important;
	}
	.nav-collapse .nav > li > a,
	.nav-collapse .dropdown-menu a {
		font-size: 15px;
		font-weight: normal;
		color: #fff;
		-webkit-border-radius: 0;
		-moz-border-radius: 0;
		border-radius: 0;
	}
	.navbar .nav-collapse .nav > li > .dropdown-menu::before,
	.navbar .nav-collapse .nav > li > .dropdown-menu::after,
	.navbar .nav-collapse .dropdown-submenu > a::after {
		display: none;
	}
	.nav-collapse .dropdown-menu li + li a {
		margin-bottom: 0;
	}
}
.quick-icons {
	font-size: 14px;
	margin-bottom: 20px;
}
.quick-icons .nav-header {
	margin: 12px 0 5px;
	font-size: 13px;
}
.quick-icons .nav-header:first-child {
	margin: 0 0 5px;
}
.quick-icons [class^="icon-"],
.quick-icons [class*=" icon-"] {
	margin-right: 9px;
}
.quick-icons [class^="icon-"]:before,
.quick-icons [class*=" icon-"]:before {
	font-size: 16px;
	margin-bottom: 20px;
	line-height: 18px;
}
html[dir=rtl] .quick-icons .nav-list [class^="icon-"],
html[dir=rtl] .quick-icons .nav-list [class*=" icon-"] {
	margin-left: 9px;
	margin-right: 0;
}
.sidebar-nav .nav-list {
	padding-left: 25px;
	padding-right: 25px;
}
.sidebar-nav .nav-list > li > a {
	color: #555;
	padding: 3px 25px;
	margin-left: -26px;
	margin-right: -26px;
}
.sidebar-nav .nav-list > li.active > a {
	color: #fff;
	margin-right: -26px;
}
.sidebar-nav .nav-list > li > a:focus,
.sidebar-nav .nav-list > li > a:hover {
	text-decoration: none;
	color: #fff;
	background-color: #2d6ca2;
	text-shadow: none;
}
.j-sidebar-container {
	position: absolute;
	display: block;
	left: -16.5%;
	width: 16.5%;
	margin: -18px 0 0 -1px;
	padding-top: 28px;
	padding-bottom: 40px;
	clear: both;
	background-color: #F0F0F0;
	border-bottom: 1px solid #dedede;
	border-right: 1px solid #dedede;
	-webkit-border-radius: 0 0 3px 0;
	-moz-border-radius: 0 0 3px 0;
	border-radius: 0 0 3px 0;
}
.j-sidebar-container.j-sidebar-hidden {
	left: -16.5%;
}
.j-sidebar-container.j-sidebar-visible {
	left: 0;
}
.j-sidebar-container .filter-select {
	padding: 0 14px;
}
.j-toggle-sidebar-header h3 {
	font-weight: normal;
	padding: 0 15px;
}
.j-toggle-button-wrapper {
	position: absolute;
	display: block;
	top: 7px;
	padding: 0;
}
.j-toggle-button-wrapper.j-toggle-hidden {
	right: -24px;
}
.j-toggle-button-wrapper.j-toggle-visible {
	right: 7px;
}
.j-toggle-sidebar-button {
	font-size: 16px;
	color: #3071a9;
	text-decoration: none;
	cursor: pointer;
}
.j-toggle-sidebar-button:hover {
	color: #1f496e;
}
#system-message-container,
#j-main-container {
	padding: 0 0 0 5px;
	min-height: 0;
}
#system-message-container.j-toggle-main,
#j-main-container.j-toggle-main,
#system-debug.j-toggle-main {
	float: right;
}
@media (min-width: 768px) {
	.j-toggle-transition {
		-webkit-transition: all 0.3s ease;
		-moz-transition: all 0.3s ease;
		-o-transition: all 0.3s ease;
		transition: all 0.3s ease;
	}
}
@media (max-width: 979px) {
	.j-toggle-button-wrapper.j-toggle-hidden {
		right: -20px;
	}
}
@media (max-width: 767px) {
	.j-sidebar-container {
		position: relative;
		width: 100%;
		margin: 0 0 20px 0;
		padding: 0;
		background: transparent;
		border-right: 0;
		border-bottom: 0;
	}
	.j-sidebar-container.j-sidebar-hidden {
		margin-left: 16.5%;
	}
	.j-sidebar-container.j-sidebar-visible {
		margin-left: 0;
	}
	.j-toggle-sidebar-header,
	.j-toggle-button-wrapper {
		display: none;
	}
	.view-login select {
		width: 232px;
	}
}
@media (max-width: 420px) {
	.j-sidebar-container {
		margin: 0;
	}
	.view-login .input-medium {
		width: 180px;
	}
	.view-login select {
		width: 232px;
	}
}
#status {
	background: #ebebeb;
	border-top: 1px solid #dedede;
	padding: 4px 10px;
	-webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.08);
	-moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.08);
	box-shadow: 0 0 3px rgba(0, 0, 0, 0.08);
	color: #626262;
}
#status .btn-group {
	margin: 0;
}
#status .btn-group.separator:after {
	content: ' ';
	display: block;
	float: left;
	background: #ADADAD;
	margin: 0 10px;
	height: 15px;
	width: 1px;
}
#status .btn-toolbar,
#status p {
	margin: 0px;
}
#status .btn-toolbar,
#status .btn-group {
	font-size: 12px;
}
#status a {
	color: #626262;
}
#status .badge {
	margin-right: .25em;
}
#status.status-top {
	background: #1a3867;
	-webkit-box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.2) inset, 0px -1px 0px rgba(0, 0, 0, 0.3) inset, 0px -1px 0px rgba(0, 0, 0, 0.3);
	-moz-box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.2) inset, 0px -1px 0px rgba(0, 0, 0, 0.3) inset, 0px -1px 0px rgba(0, 0, 0, 0.3);
	box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.2) inset, 0px -1px 0px rgba(0, 0, 0, 0.3) inset, 0px -1px 0px rgba(0, 0, 0, 0.3);
	border-top: 0;
	color: #d9d9d9;
	padding: 2px 20px 6px 20px;
}
#status.status-top a {
	color: #d9d9d9;
}
@media (max-width: 479px) {
	.pagination a {
		padding: 5px;
	}
	.btn-group.divider,
	.header .row-fluid .span3,
	.header .row-fluid .span7 {
		display: none;
	}
	.navbar .btn {
		margin: 0;
	}
	.btn-subhead {
		display: block;
		margin: 10px 0;
	}
	.subhead-collapse.collapse {
		height: 0;
		overflow: hidden;
	}
	.btn-toolbar .btn-wrapper {
		display: block;
		margin: 0px 10px 5px 10px;
	}
	.btn-toolbar .btn-wrapper .btn {
		width: 100% !important;
	}
	.subhead {
		background: none repeat scroll 0 0 transparent;
		border-bottom: 0 solid #dedede;
	}
	.btn-group + .btn-group {
		margin-left: 10px;
	}
	.login .chzn-single {
		width: 222px !important;
	}
	.login .chzn-container,
	.login .chzn-drop {
		width: 230px !important;
	}
	#toolbar [class^="icon-"],
	#toolbar [class*=" icon-"] {
		background-color: transparent;
		border-right: medium none;
		width: 10px;
	}
}
table label {
	margin: 0;
}
td.has-context {
	height: 23px;
}
td.nowrap.has-context {
	width: 45%;
}
.subhead {
	background: #F0F0F0;
	border-bottom: 1px solid #dedede;
	color: #0C192E;
	text-shadow: 0 1px 0 #FFF;
	margin-bottom: 10px;
	min-height: 51px;
}
.subhead-collapse {
	margin-bottom: 19px;
}
.subhead-collapse.collapse {
	height: auto;
	overflow: visible;
}
.btn-toolbar {
	margin-bottom: 5px;
}
.btn-toolbar .btn-wrapper {
	display: inline-block;
	margin: 0 0 8px 5px;
}
.subhead-fixed {
	position: fixed;
	width: 100%;
	top: 30px;
	z-index: 100;
}
@media (max-width: 767px) {
	body {
		-webkit-overflow-scrolling: touch;
	}
	.subhead {
		margin-left: -20px;
		margin-right: -20px;
		padding-left: 10px;
		padding-right: 10px;
	}
}
.subhead h1 {
	font-size: 17px;
	font-weight: normal;
	margin-left: 10px;
	margin-top: 6px;
}
#toolbar {
	margin-bottom: 2px;
	margin-top: 12px;
}
#toolbar .btn {
	line-height: 24px;
	margin-right: 4px;
	padding: 0 10px;
}
#toolbar .btn-success {
	min-width: 148px;
}
#toolbar .btn-primary [class^="icon-"],
#toolbar .btn-primary [class*=" icon-"],
#toolbar .btn-warning [class^="icon-"],
#toolbar .btn-warning [class*=" icon-"],
#toolbar .btn-danger [class^="icon-"],
#toolbar .btn-danger [class*=" icon-"],
#toolbar .btn-success [class^="icon-"],
#toolbar .btn-success [class*=" icon-"],
#toolbar .btn-info [class^="icon-"],
#toolbar .btn-info [class*=" icon-"],
#toolbar .btn-inverse [class^="icon-"],
#toolbar .btn-inverse [class*=" icon-"] {
	background-color: transparent;
	border-right: 0;
	border-left: 0;
	width: 16px;
	margin-left: 0;
	margin-right: 0;
}
#toolbar #toolbar-options,
#toolbar #toolbar-help {
	float: right;
}
#toolbar [class^="icon-"],
#toolbar [class*=" icon-"] {
	background-color: #e6e6e6;
	border-radius: 3px 0 0 3px;
	border-right: 1px solid #b3b3b3;
	height: auto;
	line-height: inherit;
	margin: 0 6px 0 -10px;
	opacity: 1;
	text-shadow: none;
	width: 28px;
	z-index: -1;
}
#toolbar iframe .btn-group .btn {
	margin-left: -1px !important;
}
html[dir=rtl] #toolbar #toolbar-options,
html[dir=rtl] #toolbar #toolbar-help {
	float: left;
}
@media (max-width: 767px) {
	.subhead-fixed {
		position: static;
		width: auto;
	}
}
.btn-subhead {
	display: none;
}
@media (min-width: 480px) {
	#filter-bar {
		height: 29px;
	}
}
@media (max-width: 479px) {
	.navbar .btn {
		margin: 0;
	}
	.btn-subhead {
		display: block;
		margin: 10px 0;
	}
	.subhead-collapse.collapse {
		height: 0;
		overflow: hidden;
	}
	.btn-toolbar .btn-wrapper {
		display: block;
		margin: 0px 10px 5px 10px;
	}
	.btn-toolbar .btn-wrapper .btn {
		width: 100% !important;
	}
	.subhead {
		background: none repeat scroll 0 0 transparent;
		border-bottom: 0 solid #dedede;
	}
	#toolbar [class^="icon-"],
	#toolbar [class*=" icon-"] {
		background-color: transparent;
		border-right: medium none;
		width: 10px;
	}
}
@media (max-width: 319px) {
	.view-login .navbar-fixed-bottom {
		display: none;
	}
}
ul.treeselect,
ul.treeselect li {
	margin: 0;
	padding: 0;
}
ul.treeselect {
	margin-top: 8px;
}
ul.treeselect li {
	padding: 2px 10px 2px;
	list-style: none;
}
ul.treeselect i.treeselect-toggle {
	line-height: 18px;
}
ul.treeselect label {
	font-size: 1em;
	margin-left: 8px;
}
ul.treeselect label.nav-header {
	padding: 0;
}
ul.treeselect input {
	margin: 2px 0 0 8px;
}
ul.treeselect .treeselect-menu {
	margin: 0 6px;
}
ul.treeselect ul.dropdown-menu {
	margin: 0;
}
ul.treeselect ul.dropdown-menu li {
	padding: 0 5px;
	border: none;
}
.tree-holder .folder-url,
.tree-holder .file {
	position: relative;
	background-color: #fefefe;
	margin-bottom: 4px;
	padding: 0 10px;
	line-height: 32px;
	border: 1px solid rgba(0,0,0,0.08);
}
.tree-holder .folder-url,
.tree-holder .folder-url:hover,
.tree-holder .folder-url:focus {
	font-weight: bold;
	background-color: #f5f5f5;
	color: #3071a9;
}
.tree-holder .active {
	background-color: #3071a9;
	color: #fff;
	box-shadow: -3px 0 0 #36a2ff !important;
}
.tree-holder .active.folder-url {
	background-color: #f5f5f5;
	color: #3071a9;
}
.tree-holder .active.file:hover {
	background-color: #3071a9;
}
.tree-holder ul ul {
	box-shadow: -3px 0 0 rgba(0,0,0,0.08);
	padding-right: 0;
}
.tree-holder ul ul .folder-url,
.tree-holder ul ul .file {
	box-shadow: -3px 0 0 #3071a9;
	border-left: 0;
}
.break-word {
	word-break: break-all;
	word-wrap: break-word;
}
.disabled {
	cursor: default;
	background-image: none;
	opacity: 0.65;
	filter: alpha(opacity=65);
	-webkit-box-shadow: none;
	-moz-box-shadow: none;
	box-shadow: none;
}
.j-links-separator {
	margin: 20px 0px;
	width: 100%;
	height: 0px;
	border-top: 2px solid #DDDDDD;
}
.container-main,
#system-debug {
	padding-bottom: 50px;
}
.pagination-toolbar {
	margin: 0;
}
.pagination-toolbar a {
	line-height: 26px;
}
.pull-right > .dropdown-menu,
.dropdown-reverse {
	left: auto;
	right: 0;
}
.nav-filters hr {
	margin: 5px 0;
}
#assignment.tab-pane {
	min-height: 500px;
}
@media (max-width: 979px) {
	.container-fluid {
		padding-left: 10px;
		padding-right: 10px;
	}
}
@media (min-width: 768px) {
	body {
		padding-top: 30px;
	}
	.nav-collapse.collapse.in {
		height: auto !important;
	}
}
@media (max-width: 767px) {
	.container-fluid {
		padding-left: 0;
		padding-right: 0;
	}
}
@media (max-width: 479px) {
	.pagination a {
		padding: 5px;
	}
	.btn-group.divider,
	.header .row-fluid .span3,
	.header .row-fluid .span7 {
		display: none;
	}
	.btn-group + .btn-group {
		margin-left: 10px;
	}
}
.info-labels {
	margin-top: -5px;
	margin-bottom: 10px;
}
.sortable-handler.inactive {
	opacity: 0.3;
	filter: alpha(opacity=30);
}
.alert-joomlaupdate {
	text-align: center;
}
.alert-joomlaupdate button {
	vertical-align: baseline;
}
.j-jed-message {
	line-height: 2em;
	color: #333333;
}
.moor-box {
	z-index: 3;
}
.admin .chzn-container .chzn-drop {
	z-index: 1060;
}
.item-associations {
	margin: 0;
}
.item-associations li {
	list-style: none;
	display: inline-block;
	margin: 0 0 3px 0;
}
.item-associations li a {
	color: #ffffff;
}
#flag img {
	padding-top: 6px;
	vertical-align: top;
}
.tooltip {
	max-width: 400px;
}
.tooltip-inner {
	max-width: none;
	text-align: left;
	text-shadow: none;
}
th .tooltip-inner {
	font-weight: normal;
}
.tooltip.hasimage {
	opacity: 1;
}
#permissions-sliders .chzn-container {
	margin-top: -5px;
	position: absolute;
}
#permissions-sliders .table td {
	padding: 8px 8px 9px;
}
.img-preview > img {
	max-height: 100%;
}
.alert-no-items {
	margin-top: 20px;
}
@media (max-width: 767px) {
	html[dir=rtl] #toolbar #toolbar-options,
	html[dir=rtl] #toolbar #toolbar-help,
	#toolbar #toolbar-options,
	#toolbar #toolbar-help {
		float: none;
	}
}
#permissions-sliders .input-small {
	width: 120px;
}
.editor {
	overflow: hidden;
	position: relative;
}
.editor textarea.mce_editable {
	box-sizing: border-box;
}
a.grid_false {
	display: inline-block;
	height: 16px;
	width: 16px;
	background-image: url('../images/admin/publish_r.png');
}
a.grid_true {
	display: inline-block;
	height: 16px;
	width: 16px;
	background-image: url('../images/admin/icon-16-allow.png');
}
textarea,
input,
.uneditable-input {
	box-shadow: none !important;
}
textarea:focus,
input:focus,
.uneditable-input:focus {
	box-shadow: none;
	border: 1px solid #3071A9;
}
.js-pstats-data-details dd {
	margin-left: 240px;
}
.js-pstats-data-details dt {
	width: 220px;
}
#permissions table td,
#page-permissions table td {
	vertical-align: middle;
}
#permissions table select,
#page-permissions table select {
	margin-bottom: 0;
}
.js-stools-container-bar .btn-primary .caret {
	border-bottom: 4px solid #fff;
}
.input-append .add-on,
.input-append .btn,
.input-append .btn-group > .dropdown-toggle,
.input-prepend .add-on,
.input-prepend .btn,
.input-prepend .btn-group > .dropdown-toggle {
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.alert,
.alert-options,
.badge,
.breadcrumb > li,
.close,
.input-append .add-on,
.input-prepend .add-on,
.label,
.nav-header,
.nav-list .nav-header,
.nav-list > .active > a,
.nav-list > .active > a:focus,
.nav-list > .active > a:hover,
.nav-list > li > a,
.nav-tabs.nav-dark,
.navbar .brand,
.navbar .nav > li > a,
.navbar-inverse .brand,
.navbar-inverse .nav > li > a,
.navbar-inverse .navbar-search .search-query.focused,
.navbar-inverse .navbar-search .search-query:focus,
.progress .bar,
.subhead {
	text-shadow: none;
}
.popover-content {
	min-height: 33px;
}
.lead,
.navbar .brand,
.hero-unit,
.hero-unit .lead {
	font-weight: 400;
}
@media (min-width: 1200px) {
	#permissions .tab-content {
		position: sticky;
		top: 90px;
	}
}
.com_cpanel .well {
	padding: 8px 14px;
	border: 1px solid rgba(0,0,0,0.05);
}
.com_cpanel .well .module-title.nav-header {
	color: #555;
}
.com_cpanel .well > .row-striped,
.com_cpanel .well > .list-striped {
	margin: 0 -14px;
}
.com_cpanel .well > .row-striped > .row-fluid,
.com_cpanel .well > .list-striped > .row-fluid {
	padding: 8px 14px;
}
.com_cpanel .well > .row-striped > .row-fluid [class*="span"],
.com_cpanel .well > .list-striped > .row-fluid [class*="span"] {
	margin-left: 0;
}
.com_cpanel .well > .row-striped > li,
.com_cpanel .well > .list-striped > li {
	padding-left: 15px;
	padding-right: 15px;
}
.com_postinstall fieldset {
	background-color: #fafafa;
	border: 1px solid #ccc;
	border-radius: 5px;
	margin: 0 0 18px;
	padding: 4px 18px 18px;
}
.com_postinstall fieldset .btn {
	margin-top: 10px;
}
.com_postinstall legend {
	border: 0 none;
	display: inline-block;
	padding: 0 5px;
	margin-bottom: 0;
	width: auto;
}
.com_privacy .well {
	padding: 8px 14px;
	border: 1px solid rgba(0,0,0,0.05);
}
.com_privacy .well .module-title.nav-header {
	color: #555;
}
.com_privacy .well > .row-striped,
.com_privacy .well > .list-striped {
	margin: 0 -14px;
}
.com_privacy .well > .row-striped > .row-fluid,
.com_privacy .well > .list-striped > .row-fluid {
	padding: 8px 14px;
}
.com_privacy .well > .row-striped > .row-fluid [class*="span"],
.com_privacy .well > .list-striped > .row-fluid [class*="span"] {
	margin-left: 0;
}
.com_privacy .well > .row-striped > li,
.com_privacy .well > .list-striped > li {
	padding-left: 15px;
	padding-right: 15px;
}
#menu-assignment {
	position: relative;
}
#menu-assignment .menu-links {
	margin-top: 15px;
	margin-left: 0;
	-webkit-column-count: 4;
	-moz-column-count: 4;
	column-count: 4;
	-moz-column-gap: 15px;
	-webkit-column-gap: 15px;
	column-gap: 15px;
}
#menu-assignment .menu-links > li {
	display: inline-block;
	vertical-align: top;
	margin-bottom: 15px;
	width: 100%;
	list-style: none;
	page-break-inside: avoid;
	break-inside: avoid;
}
#menu-assignment .menu-links-block {
	background-color: #fafafa;
	border: 1px solid #ddd;
	border-radius: 3px;
	padding: 15px;
}
@media (max-width: 1199px) {
	#menu-assignment .menu-links {
		-webkit-column-count: 3;
		-moz-column-count: 3;
		column-count: 3;
	}
}
@media (max-width: 767px) {
	#menu-assignment .menu-links {
		-webkit-column-count: auto;
		-moz-column-count: auto;
		column-count: auto;
	}
}
.pull-right {
	float: left;
}
.pull-left {
	float: right;
}
.table th,
.table td {
	text-align: right;
}
.navbar .brand {
	float: right;
	padding: 8px 20px 8px 12px;
	margin-right: -20px;
	margin-left: 0;
}
.navbar .nav,
.navbar .nav > li {
	float: left;
}
.navbar .nav.pull-right {
	margin-right: 10px;
	margin-left: 0px;
}
.pull-right > .dropdown-menu {
	left: 0;
	right: auto;
}
[class*="span"] {
	float: right;
	margin-right: 20px;
	margin-left: 0px;
}
.row-fluid [class*="span"] {
	float: right;
	margin-right: 2.127659574%;
	*margin-right: 2.0744680846382977%;
	margin-left: 0px !important;
	*margin-left: 0px !important;
}
.row-fluid [class*="span"]:first-child {
	margin-right: 0;
}
.form-horizontal .control-label {
	float: right;
	width: auto;
	padding-left: 5px;
	padding-right: 0;
	text-align: right;
}
.form-horizontal .controls {
	*display: inline-block;
	*padding-right: 20px;
	margin-right: 160px;
	*margin-right: 0;
	margin-left: 0;
	text-align: right;
	margin-top: 6px;
}
.form-horizontal .controls:first-child {
	*padding-right: 160px;
}
.form-vertical .controls {
	*display: inline-block;
	*padding-right: 20px;
	margin-right: 0;
	*margin-right: 0;
	margin-left: 0;
	text-align: right;
	margin-top: 6px;
}
.form-vertical .control-label {
	float: none;
	padding-right: 0;
	padding-top: 0;
	text-align: right;
	width: auto;
}
.chzn-container-single-nosearch .chzn-search input {
	position: absolute;
	left: -9000px;
	display: none;
}
.nav-tabs > li,
.nav-pills > li {
	float: right;
}
.nav-stacked > li {
	float: none;
}
.btn-group > .btn {
	float: right;
	margin-right: -1px;
	margin-left: 0;
}
.btn-group > .btn:first-child {
	margin-right: 0;
}
.btn-group > .btn:first-child,
.radio.btn-group > label:first-of-type {
	margin-left: 0;
	-webkit-border-bottom-left-radius: 4px;
	border-bottom-left-radius: 4px;
	-webkit-border-top-left-radius: 4px;
	border-top-left-radius: 4px;
	-moz-border-radius-bottomleft: 4px;
	-moz-border-radius-topleft: 4px;
	-webkit-border-bottom-right-radius: 4px;
	border-bottom-right-radius: 4px;
	-webkit-border-top-right-radius: 4px;
	border-top-right-radius: 4px;
	-moz-border-radius-bottomright: 4px;
	-moz-border-radius-topright: 4px;
}
.btn-group > .btn:last-child,
.btn-group > .dropdown-toggle {
	-webkit-border-top-right-radius: 0px;
	border-top-right-radius: 0px;
	-webkit-border-bottom-right-radius: 0px;
	border-bottom-right-radius: 0px;
	-moz-border-radius-topright: 0px;
	-moz-border-radius-bottomright: 0px;
	-webkit-border-top-left-radius: 4px;
	border-top-left-radius: 4px;
	-webkit-border-bottom-left-radius: 4px;
	border-bottom-left-radius: 4px;
	-moz-border-radius-topleft: 4px;
	-moz-border-radius-bottomleft: 4px;
}
.btn-group > .btn.large:first-child {
	-webkit-border-bottom-left-radius: 0px;
	border-bottom-left-radius: 0px;
	-webkit-border-top-left-radius: 0px;
	border-top-left-radius: 0px;
	-moz-border-radius-bottomleft: 0px;
	-moz-border-radius-topleft: 0px;
	margin-right: 0;
	-webkit-border-bottom-right-radius: 6px;
	border-bottom-right-radius: 6px;
	-webkit-border-top-right-radius: 6px;
	border-top-right-radius: 6px;
	-moz-border-radius-bottomright: 6px;
	-moz-border-radius-topright: 6px;
}
.btn-group > .btn.large:last-child,
.btn-group > .large.dropdown-toggle {
	-webkit-border-top-right-radius: 0px;
	border-top-right-radius: 0px;
	-webkit-border-bottom-right-radius: 0px;
	border-bottom-right-radius: 0px;
	-moz-border-radius-topright: 0px;
	-moz-border-radius-bottomright: 0px;
	-webkit-border-top-left-radius: 6px;
	border-top-left-radius: 6px;
	-webkit-border-bottom-left-radius: 6px;
	border-bottom-left-radius: 6px;
	-moz-border-radius-topleft: 6px;
	-moz-border-radius-bottomleft: 6px;
}
.btn-group > .btn:first-child:last-child {
	margin-left: 0;
	-webkit-border-top-left-radius: 4px;
	border-top-left-radius: 4px;
	-webkit-border-bottom-left-radius: 4px;
	border-bottom-left-radius: 4px;
	-moz-border-radius-topleft: 4px;
	-moz-border-radius-bottomleft: 4px;
	-webkit-border-bottom-right-radius: 4px;
	border-bottom-right-radius: 4px;
	-webkit-border-top-right-radius: 4px;
	border-top-right-radius: 4px;
	-moz-border-radius-bottomright: 4px;
	-moz-border-radius-topright: 4px;
}
.input-prepend .add-on {
	float: right;
}
.input-append .add-on {
	float: none;
}
.input-prepend .add-on,
.input-prepend .btn {
	margin-left: -1px;
	margin-right: 0;
}
.input-prepend .add-on:first-child,
.input-prepend .btn:first-child {
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.input-append input,
.input-append select,
.input-append .uneditable-input {
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.input-append .uneditable-input {
	border-left-color: #ccc;
	border-right-color: #eee;
}
.input-append .add-on:last-child,
.input-append .btn:last-child {
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
}
.input-prepend.input-append input,
.input-prepend.input-append select,
.input-prepend.input-append .uneditable-input {
	-webkit-border-radius: 0;
	-moz-border-radius: 0;
	border-radius: 0;
}
.input-prepend.input-append .add-on:first-child,
.input-prepend.input-append .btn:first-child {
	margin-left: -1px;
	margin-right: 0px;
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
	float: right;
}
.input-prepend.input-append .add-on:last-child,
.input-prepend.input-append .btn:last-child {
	margin-right: -1px;
	margin-left: 0px;
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
}
.input-prepend input,
.input-prepend select,
.input-prepend .uneditable-input {
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
}
body {
	direction: rtl;
}
.pager .next a {
	float: left;
}
.pager .previous a {
	float: right;
}
.icon-arrow-right {
	background-position: -241px -94px;
	float: left;
	padding-right: 3px;
}
.icon-arrow-left {
	background-position: -264px -95px;
}
.icon-refresh {
	background-position: -240px -23px;
}
#refresh-status {
	background-position: right center;
	padding-left: 0;
	padding-right: 25px;
}
.radio input[type="radio"],
.checkbox input[type="checkbox"] {
	float: right;
	margin-right: 2px;
	margin-left: 5px;
}
.list-striped,
.row-striped {
	list-style: none;
	line-height: 18px;
	text-align: right;
}
.btn-group + .btn-group {
	margin-right: 5px;
	margin-left: 0px;
}
.tabs-left > .nav-tabs {
	float: right;
	margin-left: 19px;
	border-left: 1px solid #DDD;
	margin-right: 0px;
	border-right: 0px;
}
.tabs-left > .nav-tabs .active > a,
.tabs-left > .nav-tabs .active > a:hover {
	border-color: #DDD #DDD #DDD transparent;
}
.tabs-left > .nav-tabs > li > a {
	margin-left: -1px;
	-webkit-border-radius: 0 4px 4px 0;
	-moz-border-radius: 0 4px 4px 0;
	border-radius: 0 4px 4px 0;
	margin-right: 0px;
}
.controls > .radio:first-child,
.controls > .checkbox:first-child {
	padding-top: 0px;
}
.btn-toolbar {
	margin-top: 14px;
	margin-bottom: 3px;
}
.navbar .nav > li {
	float: right;
}
.icon-folder-2 {
	line-height: 25px;
	padding-left: 5px;
}
.navbar .nav > li > a {
	padding: 8px 10px;
	color: #FFFFFF;
}
.navigation .nav li li .nav-child {
	left: auto;
	right: 100%;
}
.navigation .nav li li .nav-child:before {
	left: auto;
	right: -7px;
	border-left: 7px solid rgba(0,0,0,0.2);
	border-right-width: 0;
}
.navigation .nav li li .nav-child:after {
	left: auto;
	right: -6px;
	border-left: 6px solid #ffffff;
	border-right-width: 0;
}
.container-logo {
	padding-top: 6px;
	float: left;
	text-align: left;
}
.modal-header .close {
	float: left;
}
.pagination a {
	float: right;
}
.pagination ul {
	display: inline-block;
	*display: inline;
	*zoom: 1;
	margin-right: 0;
	margin-bottom: 0;
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	border-radius: 3px;
	-webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.05);
	-moz-box-shadow: 0 1px 2px rgba(0,0,0,0.05);
	box-shadow: 0 1px 2px rgba(0,0,0,0.05);
}
.pagination a {
	float: right;
	padding: 0 14px;
	line-height: 34px;
	text-decoration: none;
	border: 1px solid #ddd;
	border-right-width: 0;
}
.pagination li:first-child a {
	border-right-width: 1px;
	-webkit-border-radius: 0 3px 3px 0;
	-moz-border-radius: 0 3px 3px 0;
	border-radius: 0 3px 3px 0;
}
.pagination li:last-child a {
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
}
.pagination-centered {
	text-align: center;
}
.pagination-right {
	text-align: right;
}
.icon-first:before {
	content: "\e000";
}
.icon-previous:before {
	content: "\7d";
}
.icon-last:before {
	content: "\7b";
}
.icon-next:before {
	content: "\7c";
}
.dl-horizontal dt {
	float: right;
	text-align: left;
	clear: right;
}
.dl-horizontal dd {
	margin-left: 0;
	margin-right: 180px;
}
.dl-horizontal dt,
.profile> ul {
	margin: 9px 25px 0 0;
}
.dropdown-submenu > a:after {
	float: left;
	border-width: 5px 5px 5px 0;
	margin-left: -10px;
	border-left-color: transparent;
	border-right-color: #CCC;
}
.badge {
	margin-left: 10px;
}
.tip-text {
	text-align: right;
}
.icon-file-add:before {
	content: "(";
}
.icon-eye-open:before,
.icon-eye:before {
	content: ">";
}
.icon-checkin:before,
.icon-checkbox:before {
	content: "<";
}
.icon-save-new:before,
.icon-plus-2:before {
	content: "[";
}
.btn-toolbar .btn + .btn,
.btn-toolbar .btn-group + .btn,
.btn-toolbar .btn + .btn-group {
	margin-left: 0;
	margin-right: 5px;
}
.btn-toolbar .btn-wrapper {
	display: inline-block;
	margin: 0 5px 5px 0;
}
.btn-group > .btn + .btn {
	margin-left: 0;
	margin-right: -1px;
}
.input-append .add-on,
.input-append .btn,
.input-prepend .add-on,
.input-prepend .btn {
	margin-left: 0;
	margin-right: -1px;
}
.table-bordered {
	border-right-width: 0;
	border-left-width: 1px;
	border-right-style: none;
	border-left-style: solid;
	border-right-color: -moz-use-text-color;
	border-left-color: #DDDDDD;
}
.chzn-container-single .chzn-single {
	padding-right: 8px;
	padding-left: 0;
}
.chzn-container-single .chzn-single span {
	margin-left: 26px;
	margin-right: 0;
}
.chzn-container-single .chzn-single abbr {
	left: 26px;
	right: auto;
}
.chzn-container-single .chzn-single div {
	left: 0;
	right: auto;
}
.chzn-container-multi .chzn-choices li {
	float: right;
}
.chzn-container-multi .chzn-choices .search-choice {
	margin-right: 5px;
	margin-left: 0;
	padding-right: 5px;
	padding-left: 20px;
}
.chzn-container-multi .chzn-choices .search-choice .search-choice-close {
	left: 3px;
	right: auto;
}
.chzn-container.chzn-with-drop .chzn-drop {
	right: 0;
	left: auto;
}
.chzn-container-single.chzn-container-single-nosearch .chzn-search {
	position: absolute;
	right: -9999px;
	left: auto;
}
.chzn-container .chzn-drop {
	right: -9999px;
	left: auto;
}
.alert {
	padding-right: 14px;
	padding-left: 35px;
}
.alert .close {
	left: -21px;
	right: auto;
}
.close {
	float: left;
}
.form-search .radio,
.form-search .checkbox,
.form-inline .radio,
.form-inline .checkbox {
	margin-bottom: 9px;
}
.form-search .radio input[type="radio"],
.form-search .checkbox input[type="checkbox"],
.form-inline .radio input[type="radio"],
.form-inline .checkbox input[type="checkbox"] {
	float: right;
	margin-left: 3px;
	margin-right: 0;
}
.com_media .container-main .media {
	display: inline-block;
}
.thumbnails > li {
	float: right;
	margin-bottom: 18px;
	margin-right: 20px;
}
#mediamanager-form .description,
#mediamanager-form .filesize,
#mediamanager-form .dimensions {
	direction: ltr;
}
.popover,
.tooltip-inner {
	text-align: right;
}
.popover.top .arrow,
.popover.bottom .arrow {
	margin-right: -11px;
}
.popover.top .arrow:after,
.popover.bottom .arrow:after {
	margin-right: -10px;
}
@media (max-width: 480px) {
	.btn-toolbar .btn-wrapper {
		display: block;
		margin: 0 0 5px 0;
	}
	.btn-toolbar .btn-wrapper .btn {
		margin-left: 0px;
		margin-right: 10px;
	}
}
#pop-print {
	float: left;
	margin: 10px;
}
#install_url,
#install_directory,
#jform_customurl,
#jform_link,
#jform_params_url,
input[type="url"] {
	text-align: left;
	direction: ltr;
}
#aside .nav .nav-child {
	border-left: 0;
	border-right: 2px solid #ddd;
	padding-left: 0;
	padding-right: 5px;
}
.dropdown-menu {
	text-align: right;
}
[class^="icon-"],
[class*=" icon-"] {
	margin-left: .25em;
}
.navbar .admin-logo {
	float: right;
	padding: 7px 15px 0px 12px;
}
.navbar .brand {
	float: left;
	padding: 6px 10px;
}
.navbar .nav {
	margin: 0 0 0 10px;
}
.navbar .nav > li > a {
	padding: 6px 10px;
}
.navbar .nav > li ul {
	overflow-y: auto;
	overflow-x: hidden;
	-webkit-overflow-scrolling: touch;
	-moz-overflow-scrolling: touch;
	-ms-overflow-scrolling: touch;
	-o-overflow-scrolling: touch;
	overflow-scrolling: touch;
	height: auto;
	max-height: 500px;
	margin: 0;
}
.navbar .nav > li ul::-webkit-scrollbar {
	-webkit-appearance: none;
	width: 7px;
}
.navbar .nav > li ul::-webkit-scrollbar-thumb {
	border-radius: 4px;
	background-color: rgba(0,0,0,0.5);
	-webkit-box-shadow: 0 0 1px rgba(255,255,255,0.5);
}
.navbar .nav-user .dropdown-menu li span {
	padding-left: 0;
	padding-right: 10px;
}
.navbar .nav > .dropdown.open:after {
	right: 10px;
	width: 0;
}
.navbar .empty-nav {
	display: none;
}
#toolbar .btn {
	padding: 0 10px;
}
#toolbar [class^="icon-"],
#toolbar [class*=" icon-"] {
	border-radius: 0 3px 3px 0;
	border-right: 0;
	border-left: 1px solid #b3b3b3;
	margin: 0 -10px 0 6px;
}
.chzn-container-single .chzn-single {
	padding-left: 8px;
}
.chzn-container-single .chzn-single div {
	border-left: 0;
	border-right: 1px solid #cccccc;
}
.chzn-container-single .chzn-single abbr {
	left: 36px;
}
.chzn-container-active.chzn-with-drop .chzn-single div {
	background-color: #f3f3f3;
	border-bottom: 1px solid #cccccc;
	border-bottom-left-radius: 0px;
	border-bottom-right-radius: 3px;
	border-left: 1px solid #cccccc;
}
.chzn-container-multi .chzn-choices .search-choice {
	padding-left: 7px;
}
.chzn-container-multi .chzn-choices .search-choice .search-choice-close {
	margin-left: 0;
	margin-right: 3px;
}
.chzn-container .chzn-single.chzn-color[rel="value_0"] div,
.chzn-container .chzn-single.chzn-color[rel="value_1"] div {
	border-right: none;
}
.chzn-container-single .chzn-search::after {
	left: 20px;
	right: auto;
}
.container-logo {
	padding-top: 0;
	float: left;
	text-align: left;
}
.page-title [class^="icon-"],
.page-title [class*=" icon-"] {
	margin-right: 0;
	margin-left: 16px;
}
@media (max-width: 767px) {
	.navbar .admin-logo {
		margin-right: 10px;
		padding: 9px 9px 0 9px;
	}
	.navbar .btn-navbar {
		float: left;
		margin-right: 5px;
		margin-left: 3px;
	}
	.navbar .nav-collapse .nav.pull-left {
		float: none;
		margin-left: 0;
		margin-right: 0;
	}
	.nav-collapse .nav > li {
		float: none;
	}
	.page-title [class^="icon-"],
	.page-title [class*=" icon-"] {
		margin-left: 10px;
	}
}
#status {
	padding: 4px 10px;
}
#status .btn-group {
	margin: 0;
}
#status .btn-group.separator:after {
	content: ' ';
	display: block;
	float: left;
	background: #ADADAD;
	margin: 0 10px;
	height: 15px;
	width: 1px;
}
#status .badge {
	margin-left: .25em;
	margin-right: 0;
}
.dropdown-menu > li > a {
	text-align: right;
}
.btn-group.btn-group-yesno > .btn,
.btn-group > .btn,
.btn-group > .btn + .dropdown-toggle {
	float: none;
}
a.grid_false {
	display: inline-block;
	height: 16px;
	width: 16px;
	background-image: url('../images/admin/publish_r.png');
}
a.grid_true {
	display: inline-block;
	height: 16px;
	width: 16px;
	background-image: url('../images/admin/icon-16-allow.png');
}
.view-login .login-joomla {
	position: absolute;
	right: 50%;
	height: 24px;
	width: 24px;
	margin-right: -12px;
	font-size: 22px;
}
.view-login .input-medium {
	width: 169px;
}
.login .chzn-single {
	width: 219px !important;
}
.login .chzn-container,
.login .chzn-drop {
	width: 227px !important;
	max-width: 227px !important;
}
.login .input-prepend .chzn-container-single .chzn-single {
	-webkit-border-radius: 3px 0 0 3px;
	-moz-border-radius: 3px 0 0 3px;
	border-radius: 3px 0 0 3px;
	border-right: 0px;
}
.j-sidebar-container {
	position: absolute;
	display: block;
	left: auto;
	right: -16.5%;
	padding-top: 28px;
	padding-bottom: 40px;
	clear: both;
	margin: -10px -1px 0 0;
	border-right: 0;
	border-left: 1px solid #d3d3d3;
}
.j-sidebar-container.j-sidebar-hidden {
	left: auto;
	right: -16.5%;
}
.j-sidebar-container.j-sidebar-visible {
	left: auto;
	right: 0;
}
.j-toggle-sidebar-header {
	padding: 10px 19px 10px 0;
}
.sidebar {
	padding: 3px 4px 3px 3px;
}
.j-toggle-button-wrapper.j-toggle-hidden {
	right: auto;
	left: -24px;
}
.j-toggle-button-wrapper.j-toggle-visible {
	right: auto;
	left: 10px;
}
.j-sidebar-container .icon-folder-2 {
	line-height: 15px;
	padding-left: 0;
}
#system-message-container,
#j-main-container {
	padding: 0 5px 0 0;
}
#system-message-container.j-toggle-main,
#j-main-container.j-toggle-main,
#system-debug.j-toggle-main {
	float: left;
}
@media (max-width: 979px) {
	.j-toggle-button-wrapper.j-toggle-hidden {
		right: auto;
		left: -20px;
	}
}
@media (max-width: 767px) {
	.j-sidebar-container {
		position: relative;
		padding: 0;
		border-right: 0;
		border-left: 0;
	}
	.j-sidebar-container.j-sidebar-hidden {
		margin-left: auto;
		margin-right: 16.5%;
	}
	.j-sidebar-container.j-sidebar-visible {
		margin-left: auto;
		margin-right: 0;
	}
	.view-login select {
		width: 229px;
	}
}
#j-main-container.expanded {
	margin-right: 0;
}
@media (min-width: 768px) {
	.row-fluid [class*="span"] {
		margin-right: 15px;
		margin-left: 0;
	}
	.row-fluid .modal-batch [class*="span"] {
		margin-right: 0;
	}
}
.row-fluid .modal-batch [class*="span"] {
	margin-right: 0;
}
@media (max-width: 479px) {
	.btn-toolbar .btn-wrapper .btn {
		width: 100% !important;
		margin-right: 0px;
	}
	.btn-toolbar .btn-wrapper {
		margin: 0 10px 5px 10px;
	}
}
@media (max-width: 420px) {
	.j-sidebar-container {
		margin: 0;
	}
	.view-login .input-medium {
		width: 173px;
	}
	.view-login select {
		width: 229px;
	}
}
.js-pstats-data-details dd {
	margin-right: 240px;
}
.modal-footer button {
	float: left;
}
.modal-header {
	text-align: right;
}
#mediamanager-form .thumbnails-media .thumbnail {
	margin-left: 18px !important;
	margin-right: 0;
	direction: ltr;
	text-align: center;
}
.thumbnails-media .imgThumb label::before,
.thumbnails-media .imgThumb .imgThumbInside::before {
	left: 0;
	right: auto;
	border-radius: 3px 0;
}
.thumbnails-media .thumbnail input[type="radio"],
.thumbnails-media .thumbnail input[type="checkbox"] {
	left: auto;
	right: 5px;
}
.thumbnails-media .imgDelete a.close {
	border-radius: 0 3px;
}
.thumbnails-media .imgPreview a,
.thumbnails-media .imgDetails {
	border-radius: 3px 0;
	border-width: 1px;
	left: 0;
	right: 0;
	text-align: left;
	direction: ltr;
}
.thumbnails-media .imgPreview a {
	width: 100%;
}
.subform-table-layout td {
	padding-left: 10px;
}
.subform-table-layout td::before {
	content: attr(data-column);
	left: auto;
	right: 10px;
	padding-left: 10px;
	padding-right: 0;
}
.subform-table-layout .subform-repeatable tbody td:last-of-type {
	text-align: left;
}
.subform-table-layout .form-horizontal .controls {
	margin-top: 0;
}
.tree-holder ul ul {
	padding-right: 15px;
	box-shadow: 3px 0 0 rgba(0,0,0,0.08);
	padding-left: 0;
}
.tree-holder ul ul .folder-url,
.tree-holder ul ul .file {
	box-shadow: 3px 0 0 #3071a9;
	border-right: 0;
	border-left: 1px solid rgba(0,0,0,0.08);
}
.dropdown-reverse {
	left: 0;
	right: auto;
}
.com_cpanel .well > .row-striped > .row-fluid [class*="span"],
.com_cpanel .well > .list-striped > .row-fluid [class*="span"] {
	margin-right: 0;
}
templates/isis/images/login-joomla-inverse.png000060400000001016152453623430015525 0ustar00�PNG


IHDRJ~�s�IDATxu��]QE׷j�f�u��V��fX�VT۶m۶��d2y�o_�=�\�HfߙD&")�T����V��r���"IO�Uh��ϗ1�1`JC
2'��Z���7>q�
��|�	���&p�ĶT���_{�3��I�����"-X�1�ۨLm��G�i����i�m�	:�P�2�j��sғ���c'�ޓW~j8�نod���`���+���ԧ��c��sY�]	��`_iH@yni��M�"�@��q��@^�q�.3�͗p%7l�\b?�/����0_�1Fq��}9n�2�;zv�\M5zK^
sS_���dZ[5�F=&(�<o�%$5������%e9d���Cq����0!�~=mo�ڔ�P=-4�S��e,L5����g'�B��ShMh�رԡ�TD|�)*4Il�鑎ԔΧ�f��D:s�ޤ!��H��P����Q�n�mIEND�B`�templates/isis/images/logo.png000060400000011044152453623430012427 0ustar00�PNG


IHDR9�D��IDATx��pT��/����p�lw��[�ݩauW�X��.uo%��;R.n�6���O'��3;������B�g�U�&$9�yr6��o�vk(��$bp�`<JB2[�KQ�������"t��L������.�EP.�C�L��'�\X����x��C�������2�JCL&S`�g����ѩ�[Pn،l��8��������3�A�)���y�P�������D.H�"��-��b2����H��q��|����Fh��'�7�	���3�	&���P>�k�&��L�e(�����a2��9
�C�����|,� ��d2ó���e-Q�-�x�P~�� &�)p��o(_�eU�­��{&y�%�/�&AL&S`�'?��4:�֔�"��Yo���O�.�8$�(���K|�/�Ĕe���z����}|�
x�!��8��_�t>������%:I~�����}� �,��[���z��!V��1T��H$��O:ID�7�[�T��N,A <��oĔeM����ᯡ,N�^�,A}�������2�C*T:�a
,h�'�v�I�۫�t��U�d�����C[<�_�z��h�fxLfx��o 8�c(�P�>0�h��P.Gu������:����3@�6��֓	��u!:�]v̅J�\T�d*3<&3</c1��>�`��'8�O<A����2J������_oY�HZ|"�\��������F��=\Dkd�vg���g��jt�jK���l���٢�-��[�*y!���ʅo����ڈFY�E	t�������s]�b(��� :�l!U7�,U��Zm�-�Z~�=��6P.l5�c
fx�W�!(�"�+u�ס\X�$:c`�s��T#:���;��,P.�b�� ���؆/��,<à\8<u�5�+:���H���*�ٔvұ���;���f3<�@b�@Q����IPμi	��Β#i�_�^%A�k7�g�h�}{��[P�������ס\�(��'ʣ��*�0$�Bu4@�4
P���lȥ�	q��i�C�A9d�௭���n��( �)�*��&��DT@>��v�l>�5�O.��rfj�5��_�nn�TT��t6���E��m:���lz0�q΄-2�=���G7<�-8�{H@2R��D�p�xC9�4�P,�A�$!5M�qG�#���8�8� i��"~�
�i�C
�Cxݐ�� �D$��!R��d�#;�&�#���SO�=D�:lHD�ݯ��a&����_����Q��cx�2ʕ"�	s­�c�z���U]�Nt������ec�=���o��c���3��nb:A2�0�#)��~�d���#�E�o��l/��8�?Ó�d�Axr�	|����������d�k�ᩁx�Ŋ�U�=�a�a.^zU![p��eT�,��B�.�T���t�3 �IxZb����4v"Q8��p�􄸩�#Ζ��؏m؊���D8��
�A��>W�w{�]�F�{Ԅ�V��Rp����gێ�^�h�\�.Nk��G���Ea�
�]�9<a����Q��ӓ��H�9��{����	��4->8��M�=&�yq��}l�H��rC49Qm1��&m)
Bh�p�C������1��b:�ю"�`x�w��E ��h�g�
���c�-�	
@4��
���w�3xі��p�;X��AY'_��������1���8e��÷]V�3N��)T�8CX��u�y�e]��t�<��Ɂ��5�DU��`0N�~;P��'���9!nʅv�
����������N!bPv�W���{x�V�1��&��U0w�/I`zTp��!��gv����
��)�-!�I�0�AX���|q�L����@f <ٱ
�[��/(��H��(q�;��$B!^b�9�G/�!�v8�~��x�N@߻\��q��E!^P�n�_�^yFT�9��n�sqcXN�Q�k�{h�d(>X���:����g�}�!v�����3d�p���b:�	ɀ:���$4�d@軃Rn^��A_*�B�,7�lx����f�W����ю�O�2�l�C��bD���˾��z�;V��`�h��.��֩z.HK/<Ep��C|�%�KAc�f1�]A%����U��"<�Q�A��gH�9�k��E[��>>R.<}g��g֑�>������g��pfZd��᧙0�J�9�J�P��gb��\�$�S�W
�h=r@Tz�}�P
�c�o%$M9܃�q}q��$<g��A�@��m��L�� >�
	��s�>�B��uH���ؼ�ި��紑�  ��E�
��\�9ci3�|l4>�	L��k���/�!�;���S��}}���w�d���"��@�$�m셾 ~�% �C�#
J�����n0sG�����D�4~��u���S4������`xr�w��� ��tQ���%�O�C�[>�;>����&�h���u���Ӂ�(@3��||b-'��3w�?;m��'�U����H�g9�,mg���X���,�C_��!��B��-���<�[���S�v��U��AC�Bx��r�O�/��&<�u�@x�U�l�Cx~s����7����Xs����P�O%�9�����B_f��f��c�[���S�.<6T��AU�ejx���&�3}f�8`^T���uo8=���l���f}g�����,<?���ym��G,<p�zB��ڽ�/C�:��|}g��T���S�
��a���X�\H�~Okdzdh]�":�|kV�SR8����`�\&7�>(>{D³
�f+�M��A軂��S��b�}�Xx���=��}˼�IP.�CtD�)n@�������5b�k���w}ݏ.�g�\�`}�������!��~��_ i )Nb��/u�Tx�c��ҁ�w�\�q��������u����~��c��P.l
��w�335`����R��;D}���#�q��E�,�ְ߿!>6��Sm�
mP�[�yʅ�G�M��Q!"j�E{}t:��=�>s�^sO�8�E�ʅ��N<H�{��G'���]�p�V�� ^�_B_�@�\x����*�A| ;f"���2�P.�83u[�ƃ�|ڼ�ǧ�9��{T���!�p!��raS�E��B_<j@4%q��0�E�q�bP�T�o
�z�&�ϰ�THOe\��K���
�@O;�@��đ�v��ɑH#����)5����;�?��.����*�B0J�3��MU1Wa��*��� ��~������`<�C<T�"�{���4�5�K��!Zc�<Ou�����&
!(�i8�T(b���{9ux]�n������/�hމg�.�[*
��AM�JG".�U��x@e"na7�b:��Y��0Oc�¯��Ѯ��E|���m�h�5�S.4�pD �;����>�w	���SPE��܆��13<@�b3�!rB\ȇv�]p��o.��H
��G''�����4,�m��t�����/�l�-9��MH8��X��Pn�Fw�����E��p&�������
N �vo��
��/�G�A6�3�O���p�T|����&?f�*-'�
Vh_�����wGe�i <k�h��!h������3�����$���yp3x��%a�@ܐc����x!�kp�}lD($V�Rxރ�i/X}�In2�-�P��(��(L@a*⡁��}��QB�`�ߢ3���#:�ɡ��|�Pă�O5t���op�H�����@KH�%D���j���Cx}P�E�0�����"VcjB
�Ms�K�y
6��,�M3��ik�f�
���c7b�WK�]l��ة����u!v�a/� w���?���+n$��Ыe�䐲q���}���,U�C]�@zb�����(��B?�8�?�f���?(�h��x��<�nh�Z(�@^TA�4�
�AE�ǭ��/(�?�ݯ��ݿ+ɀ
h�`�׾&�b����;'*��&���Gs���A�
��P����� *�D��� �CL&S`�p�ǒ�"�}�����P~p!&�)p��'�����|(�Aq��d
��\�����N_��7��H1O<&���
P��0���X��1��
b�L)��ۘ����w�<�� &�)p���?@��wv1��CL&S`�'��ܐ�~O=�B��D�}�e2���v]�ʠ����e�]���L�OZ|c���:� @���)܄r�8�@L&S��G�O>�E$.!7qs�dj|j��u��2va
�BL&S`��G.����m�IEND�B`�templates/isis/images/printButton.png000060400000001175152453623430014023 0ustar00�PNG


IHDR�aDIDATx���^A�ϝ���gk۶ݠ�Զ���Fˠ6�TQ��ڶw�{�w_�k}���99wU�y��&_c� �@ C,��/+C��;?}j@�¼s�Ko����5\xM�/ŭ��H�*.
�������%(G�
R
�#����%�2?R���||��o�T�+p��@�RU���"�lV�S�Bz��:
N�<����J� HA�Hr�|�5�� E�ƍ}U\�V�x5E��X��+a8CCp"oIII�+X�gw���E��	!a ����^%�n
B(�ٳ�Y�޽/Ι3g69_��:t@pp0�¾}�����`�!C�,]�DC|��
�ڵs�Ç�(˲������Q\�����q����2M���`X�|���P͚5CZZZ�{^UYY����
KKKQ\+((�x�flP!0��S\\̏9
Gu��Æ
�x�Z����\ѢE���CG�m�����d�=}s��Ebb"lۆrz�����Ɏ�p��C8�h
K
����QfY���S&O��Ԯ8xp��
��
��?XJ
�
t���`��}u�$�r�:2	?cBIEND�B`�templates/isis/images/joomla.png000060400000035204152453623430012754 0ustar00�PNG


IHDRf�J)�:KIDATx��xǶ��	s^�پ�|�WS�e��Pfff��܋ep8)s����m�T4��:�{�[��ZQ�ڧ�˙����33;�2_��QK�1G/	�3)?K\��ֻ�-&�O�tW�3�{5�*��`9>�n-1�O�z�a0��RJ)��
����?B�ю�`;����_H�O�-�2lى�[8	C`�RJ��-��d�#�A�@j���n��'�z�O�#N}B����lRJ)�t��v	������s���i0]	��^o&&{DuBc�ܞ0�RJ)��'��E�z��q0]	��H�ɽ�d�V#v���RJ�l�%UU$��������݅&�
����=N4��0���RJ��%Y���z�²��.���&��=w9�nE�̲�0���RJ��C�>!��>Q�s�;����ɿ���܍���P�g�|RJ)���6o���:K����.0�R�z':��\G�����R*Ll[�	;������'���D��/C(��}��S��R*�
�K6`��N#|JCy<���[?÷0b��4�x�(�<D�'��ġ0`;��da����#`�RJ�|�x(iX?�.�������g��r��������S��{�g8s�Ix5���7�]�E����}����)�xL>)����r��\)�E��m-ncyb���G�"�ڥ�l���¼�C0���RJa�p��
�s����G�C'8�2>�0�˓�IJp���|5�
�|QJ)����_N��><����q&{&�m�x���8��'?vR�R�|RJ)�
����Gtt��:yt�=l#ܧ�'����e�z��t�y0���RJ7	9���L���	�$�c���垹%o/�+��08&_�RJ)CB�O�I99��>Ip9�eAo�����p夏�w��[����{�(��R��8��C�W
�~OK<�!K�7�|�j��9��g�?�$�4�)'"U���x�`�E)��2�g��K��:A���z[�\&��~Ƣ����V���܋�O�=�t�{�|��0]]IiЧ�l���������� (�z���ϧ��ꯟ����K�߁DD�N�?����&I�?$���s9��>�ϭ��B���$�>a�>��z�Ҿ�IJ�m�	�S�M��f�7���7-1��R���*�l���N�i�O����x)�}o� f�Y~�x>������Y���5�?$>�1�2�I�y��oB��
��q��A�M����d盔��O�]�7�7��7�
��ڀ�-���o$N�QJ�r>��g(�'_`*L������(���a �o��6ܗ�����,W���X��U	��L��Ir��&�/��#��Q{��M�WN�r����������.x#^��~�X��rq*�RA��Kc
�(IQF-�S`JN�նA�����0�?�6�^�oa���X�F��Q�"����L���J_��O����((���[�ʉ�;�����K
��S�a���7:l40F)UJ�Ϩ;�
�
��	����ZH���l�My:va�]Y�v�<���@��$���N@&�F����鋪&~d��W&�=��Va��/�9��8���
xM��2�З6�*,�Q���t�
��m(&�z_����~o���1���!����>��há�����lbF	�������8���e�����{Ծ�}�p�J�-���)x«a�sc���J��7�5��;�ؠ��*(���oc,��b
L稌mēvtJ@��l�8\Bl!n�_p̭����Ћ�!��Q^!>)p?�#I�v�ry*v��?�鈽��+����$���O�w���o�3��b��^X��~w�V�P�>q&��龢9Vl$ ��R&:���d?��6r�)�4�%7X���=L��K�MĞ���.S@��b�뼟 �����|NLpm������s��-
&����,�'�P��8�zg���&~��Y
��)�GѾ���*���J�
u���������6���#cu������q,�E�T{�9�{��|+˭�o;l/$q�^b_�-Ɯ��j�P[u�2!�����g���~?C����l��#[�%a]�PJ��{�f�ڢ:�B/_+L��۝c]d�_�`��`��1���^*�����~���i\'駙i�F��0���g
	^�8�3`]�b��R����F� �I��:j`�,�P�|;�~�[a�Kь�쿳�W�{����o`
�|o��lw=LZm��o�Y��#��俰�,���fL�I�c���T�F�a����p'��J��2@ʰ�Sd@���i��UQ�=��-��5�fy�`�OG�Q���i�3a(��qgy=9���*\hc�`� y�1Ѧ���iA��05�3v�)/Z[�y�!0iq�;���cC�aT4 J�z�
[Pꜟ��)���s�c�~��`?��&�����~�L�e�o��;�c@���/��0�,�s��m��?a�ߵ�bƗ5�Em�0ip��ɅB��0*>�^R��W(UhW�œ~\�{@9w�0������!�ϵ�́�=�]r��(�������w$�Ő�?�/����w��(��^<�?��~)G�����gaT����J�h@�3K�i��N���e\����g�7ڂ�Mdy�"�Ay�]��8<M��I�^�J1`/�[$'w)�&&��`j�f�L�"L�T��)���o����t����LD��T�*�����k����)#.���v�Pb���x>qL�����[!��1��M��I?�ֻɿHH��r+q_��{���zFѝ�(��R:�^��*U�q�hE
O�_�~��q
��<�X+U`*�}{��v�AL� 9z�6�修l�N6��	�*�.���t����k���{{�a"z
 >�hc��R�6��#��N�"�e��_o	L�~]�1 ��s����t�#��|��w`���N���4�F@��0I8���3�x:�B�s���F����*����f����@�F�Z�|�ސ�}�< ^xz:�0z��s���cM����d�P�Z�wB�7<���$D���=��]�0�.��saȌ��f��!�ݠW���P�x���R7�8�ؿ}	�'%N��������&S��<�&۩,���}a��-�x���s�M���fS2��ב%�u*�����έ�� ͭ���	=��>��,�	Ï�������.�[Py!�s�;d�e\�M������^��?���<λ�i	w�U�	0*�k�Q�؈W�}y�oSޞ�1��J�n��Zob%ֱ��XǗI=۬��	^ǣ��}��#�5����%�oc����
��?�I�J�5�z�+b���?!��6����S��ӈ��G��E};�'�����]�#�^�����]W�Im�V��%�װ�ް�D�[�
�<%۩؉�8��yxo󸫨��\by-˟P~�m��<�!�wF>n�q�`@���{�B��l,�=�wY���g��l���1�%,g�\���K��;�R�qO[����?������C�>���yoH�1ɼY�
0��C�����$��c�å8��]8��	Yb�B�F���{��Cv㞵�nt}��G#X܈C�Õ�ނ����Su�gr���?��TU������ԩsN�X3��J�L�?�ֈ��W����ۿF��!҇��'�쁣�`X�\w[>צ���4T��g��@�O��3^����S��B�j�P鯀9`��C�S	�v���9�����h��Q�"Ao�H��/�Y�߂<��EP����W�W��l�3����c�AU�T�܏�X.��sx�C�o���V��o����g��f�����
x��K��5\`�
�����ك�Oro���/�lű�8R���1<�y�c-.�\��<=�h* ��@sx�=�OΉ���Y;��fB�%�?�wۃs�X���5�{n��Q�JJ�u����~X#�l1(Rdž������yߑ�<skl�Q�y����%=���
[���.�����a�V���$�
��P��o�@��=�*�jq��B���R$�]0Z�CH�
_��;c[�Ƀ=x����wHm�z
0�o���!�[��F�{��@Kv��{�f��Hs���Q�5�̈́�KιRߓ���;�@틂L�P��OR��@}�	S��U}�;��Ϻϋ*�v�%�_�,d��c.����H����c!m��&K�4��?`�l�{�?����������a0V"!�f�2&��0��q
��^\ˍ�O��&}!to������!뛙�����)�2�wd۫?f�WJ2��ME�

�l���K�os��῜[�f���
6}���-�Hh!�uѮ�A��07���ߔ2ڔ�t#�S���1�L���y�W�a�cv��{�A�i��8�����z
}�<�2�����^e��|0.P�Q޳�n��XPX#�0����x�
_{~FӴ���-cX���U���@W
"���CVӳ
=�q��Ȏ����=�?|��(���J4�*S�E+a�YNWv�v����tr������f5����JX�υ~��>�s>S3=P3~�1�ov�י#���U)	����<�s
��߭�[�g�l�3J�2n\$dr�U��io�n1��� 8��0� ���O���S1�V!�F@���8L}���0ۥ�Ej�PP���]���P|�vBe{0a���@a1�}rit]X)��^�{���Qf�#���ql���i���g׶����=��>�?	L�Df�˳(e���3̥�*�{�/�s���!��?��y��E��(co WZO��ƃ�ܸ��"�{�<Aaz&�^��0~�,�9��'�J�m�!��=j��U��	uf�����:<)	�|������H)�2��!{mW���"��Q���c�$��e8�,���V��ח <��뾢�*�)���W8��#���p�C�#%H��>�a��(��q�K?�s�˵_�9(�`�K��M��d<�2��mQ��3��b��o�6�0I@iwBy�q
�P}y��s�R��T0M�K������>ۙ�>�R������J���?�v�Z�~�jC@]���*h�#�A�y���ހ��{�޳�[ԻL���t��*��x0К�o�<y���ȃL|�����y��{��	����k$x��g�v[�����m�����	o�K�Kl��pt���z�~��/����1��	��*��'�r�:
R�G<2�hO�Ki�δ[t�R/M�&��k�Ԛ�����<��
2���Р���uJ�� �V�J�B����`���	�=G)���"���'�\	t,O"[��4�����o)��e��l���-ι��"���=�mږ��8�%>�}�|K��8��%r�1v�트�H��!��	�w����?83�]�ca��Bh�<f�S_,��r}�:�5�g|�2��3>��?�@���u���|��w*�Lg�'��1-��J��`�^&T����L0\��.�����R��=*�`��;#�ҮT�`�"0���s�)���~�
�����1&�����
��1k?`�
�sG�/��Ǝķ�sĭ��w=��~�@�Qn��L*4�~����i#ߋN�K���u��r�[�np���Tv��ȟ�o�.�]��+���{}zc{�)v�|���z	����Mj���u��-���Tjw�^��0~$l��u1z�D�:�}�\i���M�~^�jP䷀W�k�G�nS5����dF� et�x�)���b�p~#`T�i"n7���o�3��q݉U�.��y�U�:e$�A�k�����<���!��}Y)��I�>FGf�g��	�/�z��
�d|�N�*
?��$����;�l�� �W��k�{գ+�}��y��}�f`�8�;�LjPP	���c��@��9�B�O0�@���n����>"�1n#`F��(��(
5�#@+}�1���\گ�`���0���P�K0�ӄ���$H��v�5*�m>�}J��np��7"?��&!�*��z�s���)�D���{!ނm�Qj=�M��#�������#RM��g��a���@�Ts�QW����H�^���5��D�e���*�,���@�@-a��@=�o�QS������p`TvӐ����t{u�Z���	X�	8���D,�ࣛ���_8�
�8�e����
���a"�`���zِ�u�.�2(C~L���@>�v��O��6!kd������7!���띂�u��ck`���WL��j�gˡ~i�V+�{.&d�j����(K�z����~�)<P�����=l�-WWv|mI$�/Y�@-1�؃� 0M$B��?���ܭݪ!�:����>s��s�����A	����)U��=�_�W�cg������~�H
����Ҿ�[pM�3�BBg�qP�
A	q�I��k:;#l���L���l�02�Q��~hh�U�{�\�`���Xo����!���LC��7;����M��s�U��^gFS��������q�&ⱕA����g���B.�OtJ]i�5�5�,3+Jq�z��~�b;Y>��L�õ�볇��O�?�z�L6{���w�75�~�	A�o��
���v�����K4�{��c���2�+��5d�V�kC��Jk��nF������k�.��zB��	̇�4\kWxs��=���Cz[O���7��X���&$@��֟��K:L�`s�c��^�ä�=���((y�~�*%1ʙ���A^W�v)xg��Se�k�)\�x�UC�:�tg��DZ�m�{`f�0���)6�8p�2�����</�=^�R�����X�]3�}�?s�Ծ�;kҾ�3��^����6p�V��f��
F������!�;`���#��=;�^���i�K8
P[Ю �m�G[ZI0�|�s��)d�%*������6áWG۷+�3`ʌ�<�\�5�g��5�̀��:��Q9�U�Z������Գ��'�Ͳ�P��;�_H�k�u.��)3nw��e�1ʰ(Q`ص3.ޠL!k�yoص3f�2��ϗ���Q��j�z_�F����ܻ#��D��S��
~N[0M��Kw�y1�����3�[�V�쨠&{e�+�R�߾'��H�c�=��]>�q�I TC/]Hg?��F�&%_p�l9�tȄ='"��@WNj��bSzs��r�A`ʌ�̯��³�s	.�D�E�V�7��vևC�~mW�F�������Œ�5���v1ڊ0Iv6�s�C+0�&���C��l�XЮaٗ�=0e��:�!���Å��r���A|�r�����~�H�w�����(�������VZtтo�+�z��M�]��Tʡ|��nQ��{0�i� ���	,5JsX�S�
�g~6#�F����*�`���u�W�צ
��o���q덀^�V����LT���&��Bm9�P�����#\�����/=�s&F�ߔ�� u�M�>T��2Zғ%��G Vi�2b���u���uꫪFfg�� �I�@[Iy��=��G��'��ޝ3+4Bż��M�稙���Y���� ����ʿ�V�^COF�����pp���WF�]0h)��M��,���X+G.�J/;�#�r�nƣ� r糑�[7�!W�f�^\X�bFhy#l=:WU�~ׇ�η���<�Z}�#��=pW��z�ؓsӦ?�)G�;~�߰���b�;Jf	E�=��;�W�u֧C1 d@��~��B��ܰA��:��O�m>ܫ�*�)�{�/`��86��K�o��=��)��	���*.2/��kxSu/�.s�>�^i7: ���Ę���9E�n�	�
�H�-�7vDV#�m��SvX�ܩ���`6��H`�@*�4@��څ� �F��f$�Z���s�7L������F��bP,(\��>DwԊ?w�d{09�������[��=�����!`ʘ�8׼��P����8J�f��k0e��HIߺ
�5h���S ���t�˟�@�
����� t�c�^P9��`ʗ���s��4�`|FohU:��$[��(jF���5����棦TN�*��;
:�7��ڧ5>�#�7G"��H��Ob��h�N?^ٿ�B�䷊�P%�OiR���<��r�����2�I����mh ��p�6�7`�y�����k�T@�(w��5U3�C��v�ީ2�%�F�]�K�P^�@�cd���_[����˒@�����%g� w�Z�P�6��尫�v8��0&*�~L�d��~Ϝ��A�~~�î����2��ά'�Q0�1�
�Ы�Efq��Dh��֮#U���O��s\U�N+s��� �R~��]�Xo]v4�A^�Շ��734s���d�>�i��KY��
�H��Y~c	@�)��kl�\�� c��)�8�+�T��/)����?i{f���j^;���P��)?��V<~�����
������(�dƉR��jj��
�a)`k��"q�k�P�
�h
�� �Vb�!ԭ�˲=�K�F�R��5e��)����ȹ�a�..�5��S�4Ռ�y�EwD����adc[�h���T������݊���e��_Bd���wu5�2��H�^��l0I�1��6/�:��^C�����.(�Vp[���S?�53����LhT#��^/�|G��Wj퟾�%�%�&T! )
K��~��
^׳�,O�)KlIX
�D,d����Z�F���T�e��{J����Ю�ApA�D�!��;�I�l�r����j�)w}�%����H<WT|}�q0�Kpe䞄V�\���F��n�(�v(�w����Ju	t�
n����}ʿ���3�G�ώQ����5p(�s��P�R0Md���6}�Y�s��E���M8d
�}�*�_GS�"��d�k��]qv��)C�T��͢��܇��,�B@�j�]1�m}�Y�W82T�f@������*�/�����+�h҆^>@d	@fi��r�+b��o�&0>���	�CnFٙ�u���U����$��J����`�1�g�jWY�4awS{i��ly���t���`ʐ��Q�
mz9�g(��2?�L�T�̀���Z�ۺڠ"K�������{��Kr�c�_
NV�*�
�,��ԓ��@@0�q=����U���_��>�# .5p�̓�>��62�?�'���1`�@�ߗhO=6L�:��Y[V���0C#�;Kl�s.�_��5�r�����Z��}����V���5[��K�L�����=�!�3���֥�t���DϚKb	@՜����������{�
-k��/ ��i�Υ�ٱ�+)�U���}XC������7p�?�^��
L#E'���N$�o�򟡯E�
�kj�&	(�˝{ď�iR�ٝ�ˏ�3�z�<��<TǩYH�>��6�}�J��#�Rό�^u/…D�S&�䚟�?Uk����ב�4 K"���A�{@_���1i��GfT����ח�B�<�x+�R�AyE
��3���#rnj@��c������}	[�I@k��]�|���n˖�a�V�	f�~O��`��R�g�.��9`�����ER�Wy��w�*�6��^��eb\J鋄���� 4��y������Ry��R��J1���7`�C���A�O�P3i����u}^�%���{/�Zv���r��gʄm��W�ѩ�(m�V����b@�ho&)(�6p�V�?=b���	��ݯ&O�
Ё���[i����y�IU�����_ϲ�BvS�P�7��H':6�BzS%�χN%yV��K�1�p��RT��J�n�� n3 �oV{�ƭ?3�~��`J� �������
�n��%�|�\px�5��#��vصs:
�v����d��`
0ֵ\n���+�
��H�J��:�q�>�}an���c����;���E���	�?@���B��u�ۗh�9��	��㡧�U�EN����@�A����C}h)2�Б�>	��]O��e�ƨ�A^U�ߜ��Х�K�D'
���(�e�
�c���YS��C���3���{��"t|��p�`��^v��(���Ua\S�k�RT�泝mE��u���j�Ep�R��M}��O5�z��<��P@�"�VyH	���Njcu
�Z�������.T1���}3^
�*�Q�gTZTЩt�Sέq�)�eT�X��|Q��f��em���(�E�����+�'�|�=�����t;�?�/s����ϏS(�߫T?:v���A?�c�Z��k��&��5�q!Ý���͸�C`QF=�
qr�W)gI�p��=���$E��y��H:���N�}�L=�Tq$�vI,(�LI��v��S�f@���L�@���ʟ�u���/�Y���;��Np.ߩ:Ѽ�~�l|�V�푓�-�$�`?�3_OV�7&���G��M�{}����/�l����4�9��+�y?�H���3�:ȬAi����A/�UE�X��Ƀ_���Q��ɤ��
��q�eS���񯢡ߧ�La!WA$�L\�������ߎ�=����q���-�w�U&��Q
Ij(`�I�P�?P4O1��o؍��>���P�\1F�i�ަ��"��������~H*������{٪�,��eWЙ��ږ�2q�U*1(��	��|��ά�%����Xh&�1�N;_o��?��T���i(�j������c��W��'jh/F��n����T�T�*���c�Z���%ھ��"[3ެ��-y��5����X�u�W��a���н+�,���ΰ�3W��s-V�@����s��J��@�o�V
���5RP�h%��Ch��H3����r-:�"Ǧ$���
�t5
J������M�/��R�	�
|��՟�c�����7)B\N+�n|���U���X⁼v�u>����@��x�F���U����q
��s�+�xh�9��{������3���ʿ�)������)�I�k�_D��[φ_4b��J�,���>�V���^��'�qx���l�`�U(�!��Π��F,`S v��?p��dL�ǿ�u�>��o`��,ޱ��*�%�g䋌�q�Y����i :d�m�g��!���(�O����콠�1�z�˼�Z�a&mA���?C[0	��N#���^p�7&#�������=�J�Q� �@>�r0ɩ@!�.W�6��'!� ��IH���͐;�a�o�;n"k�o)���;��Ӿ<|��g'���
��>��1(��8�L���d\m����0����K�3|�3��C�?^����d�kǾ�b�N0����J[yf��q���Tlo���%�_�:�g�������
,��!��?Va�@n�_ۊ����5��6�������+�����ȿ!���s�>管���f�����?$�	��H=���B�di<c7��{��Tf����.x��X�88��3���4����1:K�0dJ��,�hg��,����Ĉ'�Tڋu�范�b���<x�c��ߌ���-�(�U��z�T�H�F�'�t"��g0^��s	�A�_��� �'L*jJ�=��x%�َ&��b�+y�?���	`�'��M�iO�9[%���]#�$<1�Rg	���C�e�*�iט��"=rBށw`Pד���o�({���=�E��E�W��lZW%~�ױ)�y�-�wVp�>�3�p�	�:��&c�.d��NJ����
.@�<
R�.�~u�F%|��CN�5�k�*-X?��UD�FG��C>J�!u�.$��@0Ϳ	��H�,��LϫܯH�������a�k���̓���O��y���l?n������Т5���{w
x�z3A��JO+����]�Qܜ߁��px.4��b��B��3Ȳ�~@��d8���)�}o'p-/A�,G?x�qmL(��{��p�)�\h�P����ȒS	���0�Fz�I<��I��(����{�6
�3��G���p>ä]� �	>V��:����_��9_+�<�p}�����[��@�ޘ���s���Hf���E���$���3r���z���"Rq^���7�����ڷ#g�	��r�zV�-�t�=�������w���vyj�D�
n/��G�n�=V��#�E��)��9�ў�=�uՏ��9��Ye�Y���@SOm���+R^8H{�~�i.��^�����̀8�R�_�-�%]���1n]�6��zBmA��}Lq��g��3<
����=h�,�$�|�);W���E1P��v�?�r�g<�(��2�Wa���(��3q����W��7
��/��`�F�ͷ��QIn����`u#�0�4�	_A�{L��{\�k�
�8�(dǔ+ϵ�@����r���f83
V"�#�Si��9-K�o�0���>��U�n��/�Qw�
��Ѿy
�WQ�<�H�?�H���>�M��q��U[i�O�f���F��#�{`Ǿ�d��A^���^�} �ӾȺ���_��Z����Ki�7�y�ξ����^�{f,�	&	�\�n=ϛ�ਢ��@���������y�{�������T
�n�1@�ߏNTJ8����㉶��<�t��0ib�=��G9y8XE�'�?%�ax��G��h���K8~��v�v`J�v 9���6�9�i���h/��u�T�=�?�=��A���S��w�u�{�<y�8�=D:�轀)�������^0��l
�ȴ�]�ޅlgh��:�w��]7\�u!wE�L���$w�ˆ6��s��D�D�9�k-�qc���~ȓ���`,��`�U�LJfql��t��d�¿8�by��ːATx����'߱e��X���Ĺ��ڻXK� �㵶mu�ֶ��w��m۶m۶m{lϿ��R���o�{�%���s5��qN����q%NA�?c~X�������	B�����V����
�~s;����*�3�!^!�_bh1��[&��0������jS�5�{!�E}�SWF�^o/�ُ|����ǭ~���&�0��Q6�ʖ���q��7
Bɍ��jXSDDD� }*����p��'�N��=�6j��l봷z~����g��������3
�Ú"""R�7�^�>����F��߮��� �&>�
��'G�y���{Z��1^�5EDD�ҁ��}���wLv >a�,���p�E�q�*��я!�^���Ni��;���._:�*��Z��7�S/e<,C���Wg���@�y/��xi �'���h@��H?��3��'���+�ڃ@����0��F>l����/j��|�ia"""M0����7��ߗ�E(�;���J���;�=�q�v��8���|��[?	�&i��ތ�m'}��^��5a�G]�3�O�4l��`]�_�2��՗�-1Q�P�1��>Ƈbs.[Ɨ�8���>�$�$���=�>+��s�b1����X����`���,F�.3h�ji�K3��ߜ�z��{��0����
aM-\�����υ߁��ycSXo�o�^QЃ1����w�������|�ȗ���>Č�ތ���?�a��
�-��#`Mi{ �'��G����X_@h��ܝ	�VA��퉩_bvX�DDD�� �wtG���>��
ևv����
�Z�����:�������3���s�uVX_��Ղ��A��p���DDD�����贳!�ܰ��^5�7}�g��{'�Xw�O�0߅�����b,�`<#�/#���5ȏ�{�7��	�;����/��>�b����x�������{�\���W�'S�u7��
ܒ���;��R���
��}�lJF�/�w�?M��qj��]܄YN� lr��P;��S��IEND�B`�templates/isis/images/pdf_button.png000060400000000774152453623430013643 0ustar00�PNG


IHDR�a�IDATx���QFۆ��X�ʰa�Zam�v����6��6g�c�l��ݗ�9ə}�"�j8�h����V���\����8�� P�[�nݜ���Q�PU�kB�}�iBe��,#s�(�ضm[J�W'}`��s`�|
۶��:EA$�˲`v���%y�u!͟�~�i�F�y#Q&O�ƀ�b.�s���N���x'� ����?�_gJ��G</.p��0|B�G�~�6SB��NHT\ Λ�����}��IL�3���<�I��7,�ǐ�p�����#�N���;�G���=n�-�����Ma��e�o�b�W. z��w`�{a�*��:��G��|����j\o�!��J|A��	j���!��ίS�g��`l�Ӵ��ɣT8G�GJ�I���k[��Z��g�B��{�¶lҋJ��[������$!k�t�L����$IEND�B`�templates/isis/images/system/sort_asc.png000060400000000200152453623430014620 0ustar00�PNG


IHDR�|�lGIDATx��G@!��^�Wp���';�	�7�K��������U��6=ҢŎ4k�$�U��OT��A�x���H���IEND�B`�templates/isis/images/system/sort_desc.png000060400000000207152453623430014777 0ustar00�PNG


IHDR�|�lNIDATx��1�`^��4	/�q�+�jo�!2�o|�u���\\�b�8�ڭ���ݙ��ZL`��0E�1��i���T�IEND�B`�templates/isis/images/emailButton.png000060400000001057152453623430013755 0ustar00�PNG


IHDR�a�IDATxՒ%�UKF�̹�_��]#����h�E_d"
��;���s��������ߗ�O�8r���#�ľZ���)�P���S���yz��3�B��=hײ��`*�Z:t`;i�JD��">\����t����<j�d��[�'�<(��Y�M�ӺG��ky�����W�.��Ǯi�M��Zސ}��da>ɝ?*�z63IAЀ�!���
���ߗI�'�H���4�qg���B�k3�:�@*"htu���D���8B�A�G.���q�21.|��$�[��'�fI�b�/ĉ^m4B�c;D��i��Z!W���s�%�,r��!�@@``�(��J�.�3	B� �F��� ����Q�#�B��d&��!%t��\O�r�O%�F��`}:Ɗ�ī���L'�W;�QP�
��'���-FE<*��.B+���V2	�I�ku��B��U��?|+N��†�!0$H)��W�^+ױ�a�Y�>�>���9L��_rS��IEND�B`�templates/isis/images/admin/filter_16.png000060400000000367152453623430014360 0ustar00�PNG


IHDR�a�IDATxݏ5RCDs�1��%���
�qwww�O6�
tg�|+�� 5��$��ɣR�"KAm�%����{�,,�ގ
 �n�D�l��m<��8z�cq�Mj\��D,��p<��qKU`i�a<>��7�f/>,�����;�ؼ����i\��J[+���=�Z5!����-�IEND�B`�templates/isis/images/admin/publish_r.png000060400000001017152453623430014545 0ustar00�PNG


IHDR�a�IDATx����q�o��ݳ�m�6���?d�v=��]S�����;��{�9ۥ�HjҔ����BK�@3�W�栾\�_Q	>E9��ԕ�+��'����µ��$�6���=>X��k����9�si�N��q}����P�:ϸ�y��D}"]��w�^��=�.c)��(���=�&�vU�T��Y@�W���m�������s�M�����p����6R�̅���M��дwo�g��")6��q�g|��#ؽ�bą6�^
ĆUO8�/�+ۗf~��>�ZႮ�0'�"��EOm\b+�|f��$K-a.O6�M5/������:T���j�8���,��x7��gw���j�ՕW�uhC!�;B��P^g�Ԇ��N���Nܗ��!���e�����15m?�&��Nh�%}K��x���"{$�i��Zn�P�f	E6�&0�}x��F��G�����h�0IEND�B`�templates/isis/images/admin/publish_g.png000060400000000632152453623430014534 0ustar00�PNG


IHDR��h6tRNS����6OIDATxc�����O����H���g�~�t�	�~�����r����ON�y
4��޽{א�4�=�����xA�����(�۷�(*�p��)t0�m�^X��
E�{��ٻk�o�=�� ��WK��p@�4Э@��v4;�?n�����/��h����s��
��s�����K睭*â�}	��C�@S��޼%�w
[���n�Xâ�J�;G��	�D{8ҎK%oTz��	v
Ժ+����@Tv�t۩e@Y�1
�ӿ�t�ò�����-i�<p!	i�=�ꀚ!q$�"b�=0��+ �Z^v��N�IEND�B`�templates/isis/images/admin/icon-16-allowinactive.png000060400000000527152453623430016576 0ustar00�PNG


IHDR�aIDATx�уn�Q�ƍ�x���>©��3���l�^g۶�:��h;��ڗ����R*p�g4��Fǭ|Va��8|��Қ�y���h�P��ڀ��fc�D��Æ���ǒ��_踹7��;{t\��y�g@�M.[�n6N=�0�P�S}(,�r��f_�?���H�;̿U[��:��&#�e9��"~�s��Q{$�􅠰#Vȍ{b��^�c�d��
�2O[�z �s��IP�W�m�n��qPү2o3m��(�v
,���E�.Bޟ�_�v�Y�^��IEND�B`�templates/isis/images/admin/icon-16-protected.png000060400000000615152453623430015724 0ustar00�PNG


IHDR�aTIDATxݐ��a�7��醵�fnm۶wr��ضm3���za5�x��?���-�X|�����b�C(���O�����+�VX~{{d���?������?y-��I�XJ��u�������Z&�[.��H�L��	(���Q�������\���G�(�?��S�=���?����ɢ������bSF�']��8|��銀��v>74טp���x�\�����lی������c�������3��;SpilN]�g
�:��7
�� ��d���ő�������4`��ۯ�}�ՎLq9���t�U�` �l�՛p��ʀV���I��HIEND�B`�templates/isis/images/admin/uparrow0.png000060400000000713152453623430014337 0ustar00�PNG


IHDR�2j�IDATx���A�:���^\�zq^�ƪm+�m�qQm��ֳ}���'��5&��=}����X�N�5���}���WQ+�LMW;�NM�8A��@��S�����L��
��m�c�9y7\7�?��J3o�!�� ����N����{�Y¨#Q4t�X,BJ:�F��Z�M��6Š���I�m膴����<¨��PyΡ�|���6('�o̓��xF��ˮ��M���
����j����˧O���vz��E����ϟ���P���,}��e"�	��r	��%3K6��2A��ֆ��.8yיY����F�,���K�.n�%8�N�Y
����l�X,&�ܚ��	�#�^}>���v맥f��Ǐw	?��,��~�n�&N���Yz��m��^�W���bڿIEND�B`�templates/isis/images/admin/downarrow0.png000060400000000711152453623430014660 0ustar00�PNG


IHDR�2j�IDATx����q�sP+�F�1�8��jۊjۊQ3�m��g��{��[~��%��߷�����@;�y�y�����u� �p����g#*
N�����,�/G�����*Ny���AD��,+��!�O/T�tf\u�!������]`&�����^�8������b�}�C^K�,�����:;|xdr�s%Cfa��Ձ�B+m��*�=yH(��d/��_C��GH
�	^Vj�ߨe�}�}�6�v��=T�K߿�#!�������
�fs�Z
f���R}}�5�����RSS��L�x�b�du)@�Ղ�*z	���=ݥ��Fy-e@��	BB�h�C�+���B�|!������ׇ�"^Qv�>�\C��GH
�	*ݥ�?֊B�Oy4�y~�IEND�B`�templates/isis/images/admin/trash.png000060400000000775152453623430013711 0ustar00�PNG


IHDR�a�IDATx���\A@�̲�m�����q��eP3Nj۶��ms��t�~���$<�ˡ~��h4��ͯ_�����6m�tv�ҥ3*d@Q
�2�9r�ȁH$"�?��7oʎ;6���^93i8~���ˤ�e��2m�����={]��*���CnIѪs�)Z�
�L-;��lܐ�����D0
�-�~�����aS�ƭ��s��!/��������~h��ƈ8�ī�>��/��ĕA�qӣM[��0��p��OA�z���8��h*��L�"'J����\��ee"�D��(�a� D��a[�3��8��c�n��f4��'od�e3x1o�����&=�̴��=�
�A\�*��FQy2P�,�y�ɍΈE(//ϙ��_��FP*w $���Yq3}ԹƏ�O�k�bhBp���q�,����7�̜Y�b!�hqIEND�B`�templates/isis/images/admin/blank.png000060400000000121152453623430013640 0ustar00�PNG


IHDR7n�$tRNS���
IDATxch��L��IEND�B`�templates/isis/images/admin/downarrow.png000060400000000711152453623430014600 0ustar00�PNG


IHDR�2j�IDATx����q�sP+�F�1�8��jۊjۊQ3�m��g��{��[~��%��߷�����@;�y�y�����u� �p����g#*
N�����,�/G�����*Ny���AD��,+��!�O/T�tf\u�!������]`&�����^�8������b�}�C^K�,�����:;|xdr�s%Cfa��Ձ�B+m��*�=yH(��d/��_C��GH
�	^Vj�ߨe�}�}�6�v��=T�K߿�#!�������
�fs�Z
f���R}}�5�����RSS��L�x�b�du)@�Ղ�*z	���=ݥ��Fy-e@��	BB�h�C�+���B�|!������ׇ�"^Qv�>�\C��GH
�	*ݥ�?֊B�Oy4�y~�IEND�B`�templates/isis/images/admin/note_add_16.png000060400000000637152453623430014650 0ustar00�PNG


IHDR��h6fIDATx��3��QE����o�J�v���Z۶m۶mdm�z{�ƞ�wFw�y��%�
�E^Z(��u?(5�)m�=�?HV�(�>��q�6 ?��T���" �aΚϴ����m�SGٮ �6ұ��p�$��*X�5!T�f-ؽ����u���%|���x|�m�)<��"!Ap���&˂�.u����	r*`/��x:{��w�?���8�B�\T`W��r5{U�O�:r*���	"N�lhL}r��]�7�Gѫ�s��j8xv������{�
.M��O�K�y�Џ��0|���/�e��S�6;;;��n�p<�w|g�	��i��V$IEND�B`�templates/isis/images/admin/filesave.png000060400000002023152453623430014352 0ustar00�PNG


IHDR ����IDATHǵ�KOW����g��Q#��V,Pc�"��`�H�t�,Zu��#�UR��Q�HWi[�*
�t���<�pC1�1O{&��ئhIUu��+�9��=����G:k��h����EQ�c���ܿ�`1�u�k?�}��|������,�*cR�/W��,�w:����\���&���$���PO��.���p����5n�)loovw�@Qd@�}����۶4w�<��2�ւV�-,,�"8�@Qu-9:ha
�R��dj��P�����H̕u#hC<'��*�QȊ�"���1�s9��s0���088������[Z�aT���BGGF`u�d.d�'�3�`�Q�-b���A'4
/�JB<��\�k�����?��S����#�t�'�O�������cY�� P��Q@b�x�
�O��Ez���F@Շ���D��'Ʊ�1��-0
���ح�N	z�9LMM�����K�H�P�)�~�حT��>�=x���4ꗎj��&&rp/M�4~�u��:NEf�Q:�)&3i��Mc�F��c�!0??�>,m7[���bs�B��a|� $l,��!��&��ZV˱m��2	��i����T:�&�$S�8k+�Y�l���R�2�W��0yj���8Gs���ȃy�^�#Gy�iZ�,733s�x��������<p��u1=�@b'E݈w�omm������q
��ߙ���04�&B%P��r���C&������I1nnn��.YA���c٬�xty�J�έ;������	���j&���ԍ�Y�6H��j��N<��^]I���e0M�ض(�����h�ժQ!T��*^���`B����,?Ž-��̓��5��]F�~���y��z�N�y`�y ����X�?��

b��Gz	�φ(3�$H�p_���}�"�IEND�B`�templates/isis/images/admin/expandall.png000060400000000303152453623430014523 0ustar00�PNG


IHDR

E5N'PLTE���Fz�������������������������]|tRNS@��fJIDATx�E�A� A;$�B���,�=X���*�o�U)�I��I�w�Hc�HT��^���j�k-��o�sT�����\IEND�B`�templates/isis/images/admin/icon-16-deny.png000060400000000551152453623430014671 0ustar00�PNG


IHDR�a0IDATxœ�a�/�&��m۶m���&w�˞��̳m��zg��/�<����������,}c9�o�]r���
�T	���臺�k�)/))v�#�еViޒB)I�X�׎��QHC5HK�FT�}B�i��kN�,��o��Y�u%�ka:^
����!�KYҢ���
F���H�� �YWWp����%�i��}r8t��8����@�%���ѷ��8H�Fe�(;��8�	p ta7:�:�
�v����,�4nF�umD�A��BZ����ف3�Jy!܇�C�a��^bw��m�3��w~IEND�B`�templates/isis/images/admin/icon-16-notice-note.png000060400000000751152453623430016160 0ustar00�PNG


IHDR�a�IDATx��3�XI�o�}~k۶m7k�F�:�/U��I�&���4���.g�7���7��L�1L:�?l
O���N�y��X�ָR
H��p��(�;��l������1:�/DU>w�����p�j���Q����G�b�G:�����M*wx$�	X�W��ЧD�����*�a<$�����BA(Q�����f	i�lN�)�畨PZڟw��O�/���� OC(�-""��"b��?�G���#�K�����O;䵴9d$���t�d^�۬�e���""Zd����P�&�B}�
���㚡��S)��6�W�K�����t_�����U�E��M��q��G4�\��5E�c����t""*E�z>���ʣ�&�K�?	t�.�W�5���	H��xS�\���a�)2�$`0�������IEND�B`�templates/isis/images/admin/checked_out.png000060400000000606152453623430015036 0ustar00�PNG


IHDR�aMIDATxc�	H�-�0u�����_�r���n�Dj.J�1w����F�����̂e+׼_�b�{ _����|����Y���
+֬�|��x5�lX�b� �.WQ�2����	�0y� ]������vN�������2m�y��7̜9���_�0c��/�����U�����d��G�����c����*��?o���G��	�%�m��t��V��:�6`O:A*ZqP\��P��߿����K�O�:����3�/_������96�
PPQ3�IJ��cמ����9�߾�����_�i��Qq���s�BgI��IEND�B`�templates/isis/images/admin/sort_desc.png000060400000000153152453623430014543 0ustar00�PNG


IHDR	�8��tRNS�[�"�$IDATxc�	� ��?���3�2A �$F"w��.IEND�B`�templates/isis/images/admin/downarrow-1.png000060400000000261152453623430014736 0ustar00�PNG


IHDR��h6tRNS���7X}fIDATxc�O" Yè�����;:�hwK˖���

�jk���۷85�FC@
��t��Y��~�~,)	�zm\�K�ӟ_�<�7<��p(��w�'C%�k
�y�j�IEND�B`�templates/isis/images/admin/tick.png000060400000000302152453623430013504 0ustar00�PNG


IHDR��7��IDATx��� E�	���!��"	'	'�$�߽W�?n.�7�7�	�|��LL������J�֑���K�B��]��
$VL�3��K9t�g�	��9@]�v�L��JQ]y��M�_�\�)�����3q�÷Ì3IEND�B`�templates/isis/images/admin/sort_asc.png000060400000000152152453623430014372 0ustar00�PNG


IHDR	�8��tRNS�[�"�#IDATxc����Ǚ��$�1�d1�L �d�	��"r�m�IEND�B`�templates/isis/images/admin/publish_y.png000060400000000567152453623430014565 0ustar00�PNG


IHDR�a>IDATxc���?EC�UK��&��?'���?��?�`}���e��fy�|h`;�����'�&�k���,�X
���q����Z�Ϗ`�o�9\���ϑ/�Y�A�(<؁0`�;����(|���8�Y	K؀Gy��p	�n6�w���<�D�_�yރ
xB����N`5�S+�����b��X
xY�
�$
���I�Y��<,����s�0xs��P�@b$�WM�D%�_3���g����U�@2�(�?��}�����Q�l���������g`�z���f	�\��"U���(r�IEND�B`�templates/isis/images/admin/icon-16-allow.png000060400000000531152453623430015046 0ustar00�PNG


IHDR�a IDATx��%pA��߫�*^�W�&��#WTQefffffff��j����Q�;�,����/M�R��FRW>+��]Ç�3%SǕ�.����Š�k?M��̨!o}�l�>����(PHm�:�V��3jO.헲sNs}�s��ֿ���sFl/U��O��$u��u�T�����r�|&��ޛl��^*��Bө�μ����0B�UXx��^=��X�����DՁ�u`�B+�ѱ�w@#��m+��qD1B���Ա�
w@�J4�Ǯ���'+���f&�,��IEND�B`�templates/isis/images/admin/disabled.png000060400000000267152453623430014333 0ustar00�PNG


IHDR��7�~IDATx���0D��I<A�X	�P	�c��4�������)�=������T���v�-�"�`�|��[����E�%I�
]/X����LJa7t�W�"ѻ���^�Ӡ4ꠐ0��9C�9��AIEND�B`�templates/isis/images/admin/icon-16-add.png000060400000001162152453623430014461 0ustar00�PNG


IHDR�a9IDATx����F����}�m۶m�:�m{X[����߶U�e�=���d2j�h�=>NU����k����m�P�C��$�{>3�9*��{�o躻_�;Z��:)�V<#B�BX�R8a�W�����6�=]WmE���b��2�V��k�ߝj��*�Zx
�W���Y��#�\�
�%��>���X��"1����W�8#Yq�g���H�>��y����=�*Y����=3�N����A@������>�VÚ�Ӄ��@�t@ж�w8~�]((�l{>H�/�D�|3�W�А$�������P�{�A���R���,�"PKW��?�.�_�~���k���0{�a�Ϧ�,���s[OT�X
���e#@>�a�9���Ŀm�*��>��@�)�2U�Q"�U�lFz��b�sާ�-����E���%��%��?���I�FjH��6�I�'n���؞�٣<RET-�zdžD�[} ٮl�֣lH�9��bD&L���Vnd�gV'ש��W��
�G78��f:0x��Vf�I�hϯ��Qa�uuB�R�IEND�B`�templates/isis/images/admin/featured.png000060400000000254152453623430014357 0ustar00�PNG


IHDR��7�sIDATxc�O���x=^�����)�*��O�}����h
�あ��!P,n����yTi _$�f?��D�|��`�r&�O�}P��A��"YT�g�7��T��d?L1�	_�����VNIEND�B`�templates/isis/images/admin/uparrow-1.png000060400000000267152453623430014421 0ustar00�PNG


IHDR��h6tRNS���7X}lIDATxc�O" _è�G�O?�|�X
o<8��v,4� ���W'��y{Ѷ��Oo��4��V�� �`j8^RS�@SRRpj��t)]X��ΛD{���9w� �84�ӝsKguIEND�B`�templates/isis/images/admin/icon-16-denyinactive.png000060400000000541152453623430016413 0ustar00�PNG


IHDR�a(IDATxc�����p߀���	`��"�M�(�σ==^f$4�ix�������~����": ⱅ6N�π�_��6<qsŠ��6<�
�����������GN�x�萆����y�e��ݶᡛmÓ�8����K�]Æ��a�*Lw�k���rbo������6\3�h��d���C�;��
/��p�h�Ec���fZ�\2Ѱ�e��p�\�ᨿ'V|�ڸᜑczᔡ�c����
D`�i☾��Q}��oB:��l�@܀�4{u�8���@���u���IEND�B`�templates/isis/images/admin/menu_divider.png000060400000000113152453623430015224 0ustar00�PNG


IHDR���IDAT[c<p���P�BI�u�:�IEND�B`�templates/isis/images/admin/publish_x.png000060400000000647152453623430014563 0ustar00�PNG


IHDR�anIDATx���Q��_mۍ����ncm����;{q�):�Z{Pqj�տc�&��y��������s£�{�R|gŻ��QlxJ��A��'� �z'S�5���G\�o?�8���-�Zl���I��E��1�O�1v��J?�n�K���)����P�4��Q誻�Ӎ���1�~��|`�4o�T.��¡Ք�@'��>�{EZOF�,���s�ݳ��T6�����H�uϳ�d�rt�����Ral��+>E�j	پS~p)��C ��u�ܻ���^�@�|)��'6҃�nן����;�Z�Al�oH�ހm�~�/x5�z|�.7�7��n�Q��ov ��и$z$�{[H��Nli���OIEND�B`�templates/isis/images/admin/uparrow.png000060400000000713152453623430014257 0ustar00�PNG


IHDR�2j�IDATx���A�:���^\�zq^�ƪm+�m�qQm��ֳ}���'��5&��=}����X�N�5���}���WQ+�LMW;�NM�8A��@��S�����L��
��m�c�9y7\7�?��J3o�!�� ����N����{�Y¨#Q4t�X,BJ:�F��Z�M��6Š���I�m膴����<¨��PyΡ�|���6('�o̓��xF��ˮ��M���
����j����˧O���vz��E����ϟ���P���,}��e"�	��r	��%3K6��2A��ֆ��.8yיY����F�,���K�.n�%8�N�Y
����l�X,&�ܚ��	�#�^}>���v맥f��Ǐw	?��,��~�n�&N���Yz��m��^�W���bڿIEND�B`�templates/isis/images/admin/icon-16-links.png000060400000001044152453623430015050 0ustar00�PNG


IHDR�a�IDATx���Q�O\��S������I�m>۶m�wgv϶;�wP'�F����0ESk{
�ᷓ7~Rn�L�3:�Z<@�ą��9��b�b�k"[C���ډ�Fd��VNL�6�
r��S����n���/儞�H�'{�ag��3���RX$wS��1����v"����yp���..��s{V�����
Ǎ��h#¾���].��{�c�����;�	��"�Kz�KYy9M&3M��<���;��-o��+�#��>vvt���A���g�5L6�y*��i���rOm�-=g|e�&�ɨ��}�k�<w��O��9�����<�a���:��0��K<���Ǎ�K�s�t/���tT�{��XM��������/x�@�����IHL�5�䒙orqٝ4�V�Ν,�Yq??�͍���q�Lm�����+�r2q;�x�G<�ש��i.�ō�B�J �e��N"n�j��{yt�+��i@IEND�B`�templates/isis/images/admin/collapseall.png000060400000000262152453623430015052 0ustar00�PNG


IHDR

E5N$PLTE���E|���������������������� ��tRNS@��f<IDATx�U�I� A�d��I�(}�� �䢊�U3U7�i�C\�v��>���*��€a�IEND�B`�templates/isis/images/login-joomla.png000060400000000776152453623440014071 0ustar00�PNG


IHDRJ~�s�IDATxu�3�&v@��X�m�J�8Ml��٭m�Z۶�m�qn���on���5�.n�2�E?h�8"�X�����+
5$�<�!9��y��ZIj��_|��*E�N�}�$�CC�T1C&
�uJ~ӭ��B�E�����0ë޵\�Ѝ�7��n�p���U��|κ9��+p���l�i�_p��)x�O�����FZ6�KA�ɀ�`�b/9�h�Gi�	�f�Nn�?x�n�)�ȏ�ܬ�������>�f���h;���F?� ��H<�*~��w��V�_4�,K���9�{�.L�`�b߂s�J�'�O`-`��o��nM���w��-,��}��\����&k%g��o!.�"Y��Q&#�I��= 9��<��2 �>4�����������A(2��
��,LU
U�Q]�E\����*����̑]SIEND�B`�templates/isis/images/logo-inverse.png000060400000007400152453623440014102 0ustar00�PNG


IHDR���?��IDATx��xU�+���U�	��ڕ��B;3y�+���Rt}/*��D���⡲��A���uE m�[h�� . "�ڤM�t�&�6%��<���}�dr�̝ss�9�&��m�	���%�3�.�4W�4ԓ'Nq��e}Hw�z-�&�K�$��E!I�$7%l��O-��>�M�BW��Н+��w$�ijB8�Z.L�n]�M�?%IǒK,J�MR%�PR�-�L���NEgS�0UY)+8*�l�4���\�Ք��ݺF����i#I�2&n'&ʏ&��L��1��()=\�B�+���%>���,�<��6��++��H!ݭ��#�L,RA	:?�Ԫ�ߥ��b�[ӊ�t�#K�r�X���wdE]��%��
��V�t��ѰD͞Q�yڅ�����S���`�p'�9B@�TX��2�#�p:��y�ˆ���aaa�9�����j�M���q횝9��c/�s��p��N)��	6��[�JBa 0��.
�եlj���b�'G<ڬ-M.yI;�/-Y�4���C9>�d���8���*9&�i��5���yӰa�o��=���d��dY�h��q�8Fx��)���\�v�^(�0>�giH��c�w9[Y�>;�m�}�F\�d?i1
A�p�+���1[\Ԙ��4�I��@�ýB�9����~(�_Û����'���8�c�N��k#"����=8��o�(\��>/L|J�q.���������H���g�8>?���l'קd�8G��Ǔ/59��3[�|���ׇ��/QR��@���3��P�9�\��`��x��ϡ���IV�=�w�,�=
����q���4�/��nx ��垶^������#ǁ������C|}�y=h|�����Wc���D�6p�v�>bi�<e��w�M�I�dQ�D�gl�H�9����������%'�Y�0�~�X)
���Z�u����s��#��
ϯ
�asK�8@4$�@���lDS��m����٢]�)~Q�ybS�|v!�ͷ.Y��K:�ɢWB�7�Go�w�K�[��%�Aw�f<�4�o~�ï�12�!�A�*x�.�#+�a`Źp�+1QEл�υ�`d����_�х0�AJ�&�8NĹ70�OH]��?M�����0�q�$�oc�6���3�'h̝�����:���YN�&;�Xr�?�IGKV�
/�^s��v�	���q��j-b�b�Fy��<q��#z��+�>x�I�®��^�-�X���@	���/G�yޑ��	��
�|�ل��v#����
�b4�
>�T@�B�����'�1q�GD���pљ0��'=.�.M�6�^�B���>�J��xL�
�k�	?����ZLX�����}R�9�F|��ƽ�V��,i�L�|L��'��Rw�z
��.��.�N���@6"������ߎA@z�)�3�A�Fx�͖V�8���y�j%O��x�%8������cѵ�@X�v7����\��:g�Rr�6a?c��ǃ��j����Sm"**�22<�m�j�g����n�~+�]d\�4wSZL����ƛ�6O�D��1�-#�Hy$|W'c�G��_��}��S��M&�UB��W[�����9zj�gf�e�|�|<,k���ic����Ȉ�������b����$��9�8��3�2<�fU���3>��4�z�J�΀퉐��G�뗹���x�FI����_�D���<ӵ��2kH����0��4@<���Qt.2�t#�x�&��LAA�!#�̓[{c\Q�� n�7���<�6�;�Q|;i�c��n�7�5�=x�l����B���JB����j��c3��U�\"���M+�6OYk���J��=&�����L�[����A��);�{61��9V����Ȩ����gk���IE1ҋIX�=3�2L�7�c�0�*L��ϥZ
�M�@���Gi2���ݟQ� 8a�ܗ�=�K��><1��o�I�V����Y�v����h�w�"�f���G�~~GLF�=f�
��hfM�8��yD�I�"�����#<Nq>Ӄ���d��nR��pv�e��P*z
��|@@c�4D�2�!=���^Ү{5xqT���?�-s��}�h힝��!B�C��Z>o�eLj��Q��e~�`�?������e��ǤU8b�+���(������)���ص訬y���8�>Ƨefeg���H�8�7n(;z����yx��4*�Q��������vA���L�h���tv�C��Y�?L��)����1�[7�fV�0�fnWF-؞0�Km�D�Vr��V���Vi��3&m�����s����.�~L�;�lU�s�<���$=I^»\�+��M�M�a��h���p���t�aߥ���u##H�$<�I�,i���}M�A�jF#���@x���0��TI���K�A0�2w̫��>#�.H.1���5:�����oLF�2:��e��.�'���9&��y�v�)��\�D�t�d5S
���D���Bo�#,�b�Ǽz��49եeN�ApS���<��v`����H��gA��m!�3�͖��H>48<�=Ǥ�W�fTj�Ve3��|������eK�ƤW�g���n�����:Y��cm�q���7)�|I{���hSN�Nd�&�A2�7RM1��\�:Hi�Xiv��L��it�v��x�����Y��
c��K�	xSu�n�� ������lK��B�	��G���?�������C |b��1�+&�N��og�2ra�3!y�J�p�j�<p`luII�Q�c��?d�u���'�8%%���4y/ZLUQ*��?&4o�j<�^r�Z*�R۷G�o�>�D�|2��c1��<��?)^��:x��[	�>*��1ɨ�A��T!=$�L�ϋ��O��3��>x:�m�셇�߁X/����1���ƽ_�Y�����d���A1"�{dO�����u�>x�g(���
��~����J+�`J�.�	 TpHZ�`9k�ͨ"`Z��Y�8yM��B��r�˕
��8�z���~Չ�X��J�U~���"=�:GA-�����o1�;�ˀVMmּ�{�~�kiW��Ƶk4dL<�Y9`Ԯ�I�^V�
����~�T?��_G�-��H�e�,���1��C<ǨM�l��Z5\9��%�6"V���w��Z�-ql�����	�%'n���}T�@EgT5ONY�F#?`�[�bפ�}!��O��
WT꧇�e��L#H(��IR"H�Vfe=�c�--�-p}˲Wv.�4����t���4
�Tin��g4��L&���[�Z�u�?<��W���pZ��s;�{���4;���Q����"���l��s�"��
@��]h(��8����E5���0���J�e}�5��Q�7Q\�Ci�w�T�W��ˡ�t��Ѱ$m�y;�R�����6[
��� 
z�Vi���Fpl��B� 5��uy!ݭk���!Pn�I����Kv�q	����uNe�`z�Ƀ֫�~��~�2|P@��&�$��C�[�>ʞG,�D�A�%
Aqq��OEߑ���,8*X��E�A&�����ݺ��f�M���OelZ�S�Kw�9}{���(�&�%}y��������֥������%IEND�B`�templates/isis/login.php000060400000011016152453623440011335 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Templates.isis
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var JDocumentHtml $this */

$app  = JFactory::getApplication();
$lang = JFactory::getLanguage();

// Output as HTML5
$this->setHtml5(true);

// Gets the FrontEnd Main page Uri
$frontEndUri = JUri::getInstance(JUri::root());
$frontEndUri->setScheme(((int) $app->get('force_ssl', 0) === 2) ? 'https' : 'http');

// Color Params
$background_color = $this->params->get('loginBackgroundColor') ?: '';
$color_is_light   = $background_color && colorIsLight($background_color);

// Add JavaScript Frameworks
JHtml::_('bootstrap.framework');
JHtml::_('bootstrap.tooltip');

// Add html5 shiv
JHtml::_('script', 'jui/html5.js', array('version' => 'auto', 'relative' => true, 'conditional' => 'lt IE 9'));

// Add Stylesheets
JHtml::_('stylesheet', 'template' . ($this->direction === 'rtl' ? '-rtl' : '') . '.css', array('version' => 'auto', 'relative' => true));

// Load optional RTL Bootstrap CSS
JHtml::_('bootstrap.loadCss', false, $this->direction);

// Load specific language related CSS
JHtml::_('stylesheet', 'administrator/language/' . $lang->getTag() . '/' . $lang->getTag() . '.css', array('version' => 'auto'));

// Load custom.css
JHtml::_('stylesheet', 'custom.css', array('version' => 'auto', 'relative' => true));

// Detecting Active Variables
$option   = $app->input->getCmd('option', '');
$view     = $app->input->getCmd('view', '');
$layout   = $app->input->getCmd('layout', '');
$task     = $app->input->getCmd('task', '');
$itemid   = $app->input->getCmd('Itemid', '');
$sitename = htmlspecialchars($app->get('sitename', ''), ENT_QUOTES, 'UTF-8');

function colorIsLight($color)
{
	$r = hexdec(substr($color, 1, 2));
	$g = hexdec(substr($color, 3, 2));
	$b = hexdec(substr($color, 5, 2));

	$yiq = (($r * 299) + ($g * 587) + ($b * 114)) / 1000;

	return $yiq >= 200;
}

// Background color
if ($background_color)
{
	$this->addStyleDeclaration('
	.view-login {
		background-color: ' . $background_color . ';
	}');
}

// Responsive Styles
$this->addStyleDeclaration('
	@media (max-width: 480px) {
		.view-login .container {
			margin-top: -170px;
		}
		.btn {
			font-size: 13px;
			padding: 4px 10px 4px;
		}
	}');

// Check if debug is on
if (JPluginHelper::isEnabled('system', 'debug') && ($app->get('debug_lang', 0) || $app->get('debug', 0)))
{
	$this->addStyleDeclaration('
	.view-login .container {
		position: static;
		margin-top: 20px;
		margin-left: auto;
		margin-right: auto;
	}
	.view-login .navbar-fixed-bottom {
		position: relative;
	}');
}
?>
<!DOCTYPE html>
<html lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
<head>
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="IE=edge" />
	<jdoc:include type="head" />
</head>
<body class="site <?php echo $option . ' view-' . $view . ' layout-' . $layout . ' task-' . $task . ' itemid-' . $itemid . ' '; ?>">
	<!-- Container -->
	<div class="container">
		<div id="content">
			<!-- Begin Content -->
			<div id="element-box" class="login well">
				<?php if ($loginLogoFile = $this->params->get('loginLogoFile')) : ?>
					<img src="<?php echo JUri::root() . htmlspecialchars($loginLogoFile, ENT_QUOTES); ?>" alt="<?php echo $sitename; ?>" />
				<?php else: ?>
					<img src="<?php echo $this->baseurl; ?>/templates/<?php echo $this->template; ?>/images/joomla.png" alt="<?php echo $sitename; ?>" />
				<?php endif; ?>
				<hr />
				<jdoc:include type="message" />
				<jdoc:include type="component" />
			</div>
			<noscript>
				<?php echo JText::_('JGLOBAL_WARNJAVASCRIPT'); ?>
			</noscript>
			<!-- End Content -->
		</div>
	</div>
	<div class="navbar<?php echo $color_is_light ? ' navbar-inverse' : ''; ?> navbar-fixed-bottom hidden-phone">
		<p class="pull-right">
			&copy; <?php echo date('Y'); ?> <?php echo $sitename; ?>
		</p>
		<a class="login-joomla hasTooltip" href="https://www.joomla.org" target="_blank"  rel="noopener noreferrer" title="<?php echo JHtml::_('tooltipText', 'TPL_ISIS_ISFREESOFTWARE'); ?>"><span class="icon-joomla"></span></a>
		<a href="<?php echo htmlspecialchars($frontEndUri->toString(), ENT_COMPAT, 'UTF-8'); ?>" target="_blank" class="pull-left">
			<span class="icon-out-2"></span>
			<?php echo JText::_('COM_LOGIN_RETURN_TO_SITE_HOME_PAGE'); ?>
		</a>
	</div>
	<jdoc:include type="modules" name="debug" style="none" />
</body>
</html>
templates/isis/template_preview.png000060400000067473152453623440013620 0ustar00�PNG


IHDR���ja��PLTE"B(E)J
#I*I(DHTm�����������������̾����������������־�ž�ƛ�z�nl�{r�����Y����w�������֜����뮣������޶���������Ĵ����ݙ�� ;�33ߡ��jf�GEۉQ���i��j���|�������������������֌��������������RRRu�����������qsz������u|��JE�\W��y��ͤӀ���zzz�|}���rrr���������~�������㺸䆋ô����Ӻ�������
1��������JJJ[[[���������3��������fffqho�������������֘�����CJ_���挑�v��������b�Չ��e����Ó�ݥ��*R	 C!:2R7Ic4;VZn�K\z.I$9Y2A]gp�e|�Qd�7Mk0R9cBsDSt*;`���”��`eu���:j|��]u�(\]��Lm�r�����Kr�:k'.T{��ѫ���ѭ��s��6]vx�����������޼��.Z����	11Z3?k:cI|S�BzBsP�R�J�J�CK�&S�[�0a�+Q�=8i]�iVI}Cz@m���Ar�4=7lH���,%�&���b��%a�:NJ9����m�Y�m�&{�???q��u��?lS�s<M4b*J(((������&��u��3��z��`��>��L��O��j��h�އ�����333L��0��'B	1S	2Z
9c���k�IDATx�	n#�#��?�A�ƒg�^ڕ�d#����K�:L��<��8t쩫�8B��Izs�*͟����������f�]
�x��kwuk`��9?x4m��'�1���Q�Ԋ�b��b5�^����4E����JME-mj�>����h���IJ�T�t���C�i���7B�X��`�M�6�1��&�u�6���l�ǖ,���9<t�*8��䚦������9� �:�*�W�90MqG��X
V��_����.�ʭ옵d|-A4�:��w����9����؏�}��9�`&��j��i����qsvyf���T	����}�U/�+i4�歴�k�G���9������4�=� F)m*!7�מ�f@mL@
Ǵ�~%���1_���@�
�u���V�XY�E�KO�����Y��O�3(Q���:��^��� �J�e����S��L#�O댼&��qLmcE�)�K�o��9i?w� �7����>�~�{9r��k��]V����0�'�:��r�H�uK�����CHs7n��a|�;�><W�@4
:�b�sG���S{{���?I�,����7GU��}�'�MP�ۀ��^컁e���7G�}v��٨����x��/�o�z����䛅��0���L`u�.�T������6��f�߶g�̠���+�2�s��?�
�O#�RJ$�J�<����/	�:��%7O
0���~�F��b��IH{7�>&����&a\�EP*G�_��l�����eNw����2pw��_��i9�.�G�!ՀD��x�����
��|a��/>t��&
&?&��qi�D2��N2l��0���F{��s����䀭��1x�i�{��K$u��u����1[3�Sy��A�hz{z��	Zށ�� 0��2�˜�r�ªv�Z��rIWm��O����4���b3�<:>����/��j>��-�3��C�ڴ:�A�^ 7DM����܊r(���zX�Cܷڷ֣3Z_�`�����`��\�J.%K��m�;������t���XXJY���d�Om���V�V�΅&�+zbqa2#����a�z��"�P������@�D����3v>4�~N�#�S@)��=B�Px:���j��(����"bG�(mϲ�4	$�l�4�S?:��1�^B����R2P	m7$#��I����B��3dd+A�|���6ݾRw�7P}}�(����zC����m�������Z�?;��ƭ���4�V��/�&�2e�E�+y]�!�0x�g�
G�h!�%��|�8��C���C��b������G���a����/=��2[��mQ�3���֞��a�9�d橉�)��0(�u���Zp�E�bHj �?��R �^����HT"E�X�RR!4sBT�$Y�S*�	����Tb���\�'x�Up0ő7��=��~�$���%�W
�oDׯ��}&8�U�:e0�w��(���Y���B�BE��`%�%����L�r�^J��ʴ�Ak�r�2��8ߊA�6;�D��k����]�I��ZF-�[�ٔ�~)��[
9�2� U��(W	�v08W]�
.�w��p�&@�V}鶐Ed�
8
�1�
�R��<X"�
A5T緷O`�-��fX��7u��be�R��"�4P�)@���=������>�}KLș��o5�T�V����<-���~��K{�_��b"�K�‹����(b؇l�~2w�6���H�VD�H;=�ŵ�JY��`����B`NH����N�N�i�R,hq��xt����>((C�:m�\�i�z�)���kO�DH�_�ݿ^��˯��W�$-��#[�{���Z렢R^�
5�iK��f¶�L�O�O�4-�K�~d|����!�5^wf�=(
yCZ��1��Siv�ս�ihǘ�K�UpE|+A����hE����jN�f@��X��c����:��tf��n��g������iGz&�����}������W����O�z����z�wu��2���|�52��X�n���m����0����82����pH��J5�!�����"\�ӎu��`̌����
!�'J@�R��׮)p̕���IH��l2���׮�bV���hT��Z8�Y=��
T}J�R9�u�@רA)�+O�����������^�b�������zS�����R4a��!��Ubv�8�r�>lk詶�A��:j�f�m�}ěU��č��{�g���w'�5__X�
*�L;�D��*T�3w9i�,��hr��YJ��������9�s�u���z���#��:�O���-��k�%����?����_���wk>6}��R���o%�M��0�ԛr�]�4k5�z��7Q���!jsX�} ij�x#����!�C��ѲW&����m��+2���y�̄g;�e�-S�#��9!�g��C\"�
\�\^'���q��I, 3���i�u�[צ�s��6�k
��:��8Ke��q�y�{?i��>���]_�b��ˋ�:2 L��QّB�k��w�a��.4����4@\�es��2S��<�����^�D�^��j��swy�e�9��5m��]gK$H��"hI��qQ�+�PH#�FbRJ��R�K(�+{T���k�:�"MG����H7�v ^(���>���ޏ��Up`Vj�+��ەNz�1�Bl!�3�`u+OȤ��5?P\���v+/��;1��ξ�_�.��[xw	���/�ռ�>)�;^(f�%���N51`�UK�iy�>�_t1%�,e^���Hv&�[��՗���Kɾ�,b�����KQ���g����s�m]tfPV_K�J���L�m�2��ަ��V�9���7h�2$�0������낡��Bם��U�w�;Ë� K?sA����{_�q����_�	�/�k��t	���E ��F/��cǀ��/�kyփ��s��1��cD$��X.�`l��H�X!"�ɘ	=���L0A,�]�^FW�dف�v��n��(v.�{�	�`����3 6d	��2�!�}Z$�%Lv*��@@"BY�)�;v��W0�\ҵ�9\�<h�� {\"	rڭ��$�\(�y��:�-��G�WRBn`{�
������������l
%1l€�;ϷQ���@�!�/��iD׎J��\G4"3����Țg��KU��"�(��I�и�zF�&��^"]�}�3[��L#=	���N�_�L�D3���$v�Źo�zb�-��&I�+�U#̸^��Y�R��냊n���Yd�1���F^F��ܜi;Ҽ��doF`�<�(l���jXKuW�.�#�Щ��i�
���"���F`#�>5�l�eϔ
n��K\�'�k�g>o뇪�Ǧ��'��Y��߭��a�δ�H@����&kj\�)�X����QK�lQ��€�!^�zG_��{�,�����@��D��������R�(ɚҩŊ����q�˞_YH�Z��I%�H�q�ot����C���t[&ެ�(�V���t�ǵ�*I}���ӂ��l�iMY��-�R56k�k�� ��WSI�(�ڠ�"	��=`��r��eb�}���Ջ߭���O�f��_2Í�\I/�L˹��r��L�[���w����J�����
�x�s�ѩ��͵5��
]�	FHXH�^r��2Bnnv��#∄����m��-G�O�y���CFzϚ;�j���n�{��z�}��)BL�(s��[��I�2�Bk<���
6�=xX��I5T�"}_ݒ���D�鲢�5s.Y��ir�P�4�J����ve�%�'O8���Gg.'G�8Ӈ��׭��I�.���<��#�O~pf��pXRi��m+���Uշ���2�rhoݲ-!�i�:=*�[�7d�G��pzI�'�<՗#۷��v�%��Dh�mG��ЉJ����L�i�+��ʖc\F��[�ãm�܍���ՃޚZ��O�j%�]���^��>�'�G<���v`:�oˑ���9�	S0oM[�����Fd��\�w���X~��֭�;*)�� ��H��[1j"@�
�W��'�f{��+���u��0\��Q�t��8�.O�Г��@�5��@�w�����9���)����90b�� �*[>�!�JČ�?�9&��(�����@�Sf&���p|a�;�9��t`�ly�p�Q����H���4�7�lG�3��V��gxK9��=y��^����_lN�H��࿵ؿ�o��}\J0��]�R�s0\V��.׀w�܇é���<�`�׀}����N�4�Z�+��m��p���g��=��p�
���@=��x�]����T�q�8����Ro�Fi���n��-���.��٬y�ЬQ=Y���P����h��_����#�M��8pq6?bnXN��f�p�]����32��mm�C�9%�bd��D��QU!����+e@��{�^�t@:�
�-X�eZ!VA9b��U|&��(�w,+��˗mQD�a��M�aJ)��C����P��3`9�A��N8�{���}"��)�!Y	1ME&TTL�1K�!�j!g��`�D�Xp#4�4!�}>_ĞBF��:�p29��!V<��& rf]�����Q"�Li�$��L��%��B)��Ke)�-U%UMi>#ȒQcj�$ӑ$s�ƇMSF��~���)���H��Ne�mՌz)�Y?�������A�wmc�?��j�`@�׆�A��~��K)���zo����L���Ή�y��V_��-��N;��)O06��������m���tӭ����H���8��j��ho3wj���5@f���T�L�2f�z�5U�M1XA}  up�s,L�|�Ӕ�N��4��凙��N�y*���3.�����?��t����'��r���V*�
Hw@з�ֱsg˽�4Dcj�Rc9I1F��B2e�3C1��Q�|-�a��>�h��s���ũM4>�����w06�Es�{�x���MW�~��W��z�0�/\��Z���#h+؀'vl߾c�{����-�qU]*�ƥ!u��D�?��V�D̂1P����?��/�#�؞����X�:T��S7}�]��u���c���6i�cC޾b��kϊ��Z��x�>���U�6[�>�v���ы'2;�B�`�Z.!0$j9&$I1,��̒b�	ܡ�gޛ���M�\����}-o��cqA��3���[�H��oL7O�	�^ʢ��@I�b��i#:���sPرs!�pWrr	�hc�o=�Ӆ��Yc���;�1*�(���,r+�%���E���
:a<�������v+�9GG\>�Ḕ�p��Ue@p���P=�p`�\�����
^�pz��������ί��cAtЦ$ࡨ8�C�k�
G��R�)�
���Ό?�;�6�-A�F�XU���B(�-Sd�/X)VY��������b/����wK�EX�'����>�`����f�������ŋ+�ֹEJ�t�4%S�Jv}]�{�zyۇ{�9��MH����`�����'�q�Cp��G����2L��|.`�=~s���:��΂�\�: ���O�g�a�6��t���ؤ5r�!ر��`. �����ƹ����7#0��M��# �,���L���d��;��n �m�-.i�Q̄Qi�� �C@���[_��~�	��7�j/�)�<}ү*0B���@�you���a��4e0Q����7qxV�`fn&>�.��i��	O@^�i�s�
�G]$2!@���ot�2���I�<=�f�	�O@�
w���oBD�$ �e	H�o�=,\��x>�m��֣���	"l��d�^M��H�У��I׭����
$�4_y����37���0L"��� {���2L���hO���,�%`�n'���(���>�0?;��iav�xx�>g3B�,��']�a�����ٌ�a/�Cp���'�������x:^�?	$��� ��MB؋}e����x�,��1����A�wȂ�ow�-�����r���l��}	�“ޟ���
x�x!��w�.n�'���NB��al�Q@O@��!Y��I��<t�=`�\?�������-�Q��+`���~I	���a 8F��{�뭁�}<����<>8d�1�nuй���#���H`�DU�G�"9��Oyz��X���{�XN\�Xΐb�1M�u)��%<��	X���S@^�vh�F�/�i]�4Iυ�h<���<�#w�.����$�%����
��闥�
O@od�ѽ<������cy��' �9�Yp���{���ds3e&����{�y��ln�9>��s䮽���~w�|M%A�O��BL��i�0X�χ�HU�t��ң�X:�	���b���iQ���eF~�=��	Z3�x`�u
H���9�V¥�o^2|c��s��k�i3MtIW�H)w2"�7O��K�≡�}0u�V��W��A����~g���wO�{����PO��*�n�v���F�R�W<M�~{��V�i�8m�a�G�@,\���k%}<t,�0\�ne�zs��ߵ�a�]�S�[?|��׿�~���|u}�?l�^�qcu�0�L)Q輟d²�����e�E"�ث���7m4����G�� ��A�h��6/�>x�p�?޿{uu�������˷�n�{zu�0�.>P�<����Y0�����LB��W�����_�_�z����`�ޝ{���Ρ���%D^( q5͂�	��:C0�����?�v��o���ݿg���lx�������g;�#;c�S@��D���wh"�=�Y0wk_��.�/V�`fx8n"��	�M�	�GJ_��.I��C. ��;���WUD��hY��Rpvƞ��{
�wگ�(�U5��IВmSH��I��az������|��;����_��ǿ���3}��)�1�UQ�￿( ��a$0�p8H��c�o����\"xvi20Z���dy)6����d�9��_?�����տ�����p�޽;���۾����}���Γۛ�vYy�?�PR����5��\�冩��3�q��v��@ĥ��ڕ�D:���D.�.΅
�&e�	t]��Xw��+�}1؍�L�_����
/�b��7�o^]ݺz�ۧ�?ܴ�o�}�}�1�M�EQ��t�r���g����tly!'���A9�r��8�H�"d�8<)V���c�\�7I���9-;��=���=	�cc�2F�����(	�9u��V�SL����W7���t���ի
���us����U�%QEIQ	XV
I��.�*嵼�
�/���r��<ֿ��v��%	��dYQ�r#3�/���3ƹ�[q�
x�\?���O�������:u��%6V�q�A�J��j4�E`#7˳�(�BMY6��,VCT@4<�,���8�@�_�@�R`cý!���,x����"�G��-��?�,�,Jٽ��[s�l�&�A�"@[x8u@D��e�F{���?�.LBς��) ����V�~�pH���G�b$o�����Cp���]~
����<3�Zؓ[�`O���"�upL_^�R:����Be�x�z'!���u.�Fk�l����`+��T}U���i1��>�O�u�.!����� X���h��8L=^�n��{@~�,������0t�a�;��2��m��W����0<�t����
�q
�<iϐ��e�e��{���!\�(R B
�$�spB�)�؜�2n�䐬9��u@�-.�[�\#A��Zw�$�IU�v�^V@�j�*���|B�x\���c���4�."ͪ�xm!�T��ki�^;�L/���-ם3����q��`@������+`,~R�k�9z-�4��d"S�A3;�ʀ������Ol@��� ���ݸ�>�00�9�TS����N㨰��<yzA#�K�����Ƃ� �vqq�r��rُ��f���(g��+�˥k�;W�[�����(�ޫX��]��Z���i���גi�Pˉ|r�HjI)�^�_\�խ'��n���[W�V���֎=_ű��O�WQT�%%�DD��na1n@C�q�21U̕#�ɵ����S�r�nF�R�P	�g�bv<�������ZU`����L�ߣ{��z��|�q���
kg�J�1�9�By�U:��I�����+3�Ѥ�����f�9���
�����7�?����u��Ooo��ը���DQ��1]RD)0�Gb��t
܀��5C�jA�VV��'Ӣ����ɓS�y�է�Tx����ϒ+ha�O+Y�X�Q��q��mGq�
�(�K�qk?��������k�q(��/�E����67]�dF�HT��>�\���;�7�l?�z�����铵'W<�w����>A�Š�f�ER���$�@N6۱.��Œ��8���#��!�x���eNd0�i�K�;����|��S�'�Z�Y0���7,{d�p=�,l@�����F����7z�`��)�>x�h.`�= ���I�a�	X� �m�ͳ�;o���]% q1��0Mݜ��lƌlOB�f����鞄���MBl�l��[#_����\(�I��k쵯]'9p�zu1���U����e�h��a���/
��?��Cp6[���^�	��%C�kXY1|_�=m�i9*f�Z ��<�7���)"��h.��ဟ�l����7�QU4�I5)�+w1�����ٜ&�빢:������/"�G��dZ��ܼhk
Ԟ!e�q��y�������I�hD�$��EC54!�?�Q5�4�����Y5�k-}�W��K	h9~���n��D�����M"%�.@*�|M�U�R�2P� �A@���$��[��Wqu�s7����	�L�	�$! 8 ���b
���h5j�,�R{h�b�sD|���7��D+��>3���ͻշ������"Z��^^\G��'���te13��Y#SA�pn|4y����n�ēF�$�) C��2����c��j�i�:$��f�Ɲ�Fʞc�R�VO*�)
X%�ʳ3����H)��s`}�>�%pA
IA�W��g�z����I��&�1�d^���虩5,-���pqf�hOB��dӲmϲ]��e����{��
h�����[O�n։�x���y�dsk���f7���
#��)�V��
[�0���T4������ѹٕj\�eO�-����/~:�f!�yܘ]ɋo/�]H����/�����B9����g�@�cu����=p�:Ww�6�4�a��������#�J�I��X
�
I����}�C�.Y�qC����LG����
9�
�Ʀ��|�
���>]B��M+�gk�ɸ�]<��׆��X,G"�I�R��%7	�����[��o~a�`����y��=�Zۼ:�s�Ν�QNP),˲P�3��	9�����!`H����Y��Tm�����a�����1�w��@����b3ٰ_�&lhݨ�R;x�e� �S����"��k�F��ck����j
{��!!�����X�ރ�����q��	�CS��XM!AS5�R2Z�B�!���}����OB��^LFFU=	C+H��^���iU��׌�	��$�Y��7��_&2�����d�e�2
���4F�g�j_�(���3���0��at�;������RԌ�J<�)	�J�n�����s!���{\B�Iȫ�����`g��3�z=^��G6/����K@
����j7���v�v����T4	�*�J�y4D�	J3'������%�:���h��(�s����Ed���)���ޕ�d"31�NL�S���lc���u�u����x����[KD,�i
�\>�náW!�' *�8�/��L��4�j��F�����s��u]��Nь_ō�^HW�Ű:��"^Nʱ�Բ��r�H�����'��H�|����µ�|z�Rr���G�K�W���_�K�{^9۱:��L��1=��G&���9��C:�.�Չq!6�nF�s�2 �x`�$D�%�=fr��[�u`�7��I���щ\���{	����Y�U]K&%����FS���h2�iC�B�����������X{��(R6GtS��`��x��|[x��hQ �$2J�*�eĪ4������Дk����q�����pͺ�{|�O�߿8�G�O��c��v+��#(D{88��Γ.׮l�������8Qv9��>/ �M�������8��
�?J���"`�2�M�$DODB������qi!�FSH�%"A� ������x���e/�8�3��`=��F��9_A��qt�D>.�����N�ἤ����W�>�B4�%�4��\M��]��ўw=�㼜�5Q�.(i��54&`.P�x?o$��@,�U*��ȹ*30q�Gqޏ��K�DD�dm�,M���=���9 �)��9@�������:��y=��±�V�� i�.*i=I�tME5!'��'��
��@�9����ߖ���ɮdY��H��k��L��S�+�j��E�4#�/`w���z5�X�����@&���XҦ�d�RN&�������K����GjY�'f�Se��=f�Y0�蒆TO@yV��e4�gϨ�-%�3j\����{����*Kuff��dvn����tEC�F;���e
���2�x!9>��5-�QE�u�=JN��YM,�
u��ƃ��{<@v������s0�<�Im��N��!��,�%z2::�[57�a:��:��
�}��w�}�z��u���LL�4a��M�$ �D��HH
��o���(α�qٺ��<	9
i,��H��s���2V�1���|�1M�HI
�JN��7I@���IH��MFӣidƌD�X�1�7�3�h\��� �����Kz܋'�ze������h�[3���Xƌ�b���K�|b>���3RU�t)��WҊd,[��7.˂]�M!ERBȔ���LC!&1B�"�d��KB��	�X�. ����|&��_��m�䵢���d��)w��Y������H/Q��o�r$���`���|r�i�|
�활p���.Gq.�v����o.�E�����O���HO��%�#�gW�}�/ߵ\ �Z7�F@��ЎW������8����˓P����,?[,�}�t�7�)5^���ϺI��>�5B.`�Ț�ڛP�x��
�Q0'|�ʳ�W�+�ք/;���gg҅dvN�YQO�I��.�0��s<*����O��O��Z6���5�7d/����+p���$
���{b�)Z}���ê�/9vr ��ȥ����s�i#��xfo@c��LV_�L�1�@��	6(d>���62є5g/U�`
2RL���{/�~s��mF��_��H�K��S��ic	?m�c�΅�t3�?MWUgf2��Ωs���@�:6 =C�ӎN��Ϛe��L�RY�ի���l���b|��2���eREHHO�v�MH"KHf#��P�~z_d��"�0�v�H�㓧a0�k2�9�aB�:C���f5!�67r{���F�ZR��5�vղ���y�MaQ��eMK��BI�sh���"\��F_�A�i���	e��*|Ӊh@;�l.�?6
6��Wr�_��4Ӷ�˹�,�)j��P�V)q;\x�e%u[+����6}�i���@��K�g9����I�ywW_���v�]��qҲ��ި��#�s?�l����d���w��T�-f���By!ӳe�P���b1��`P	X��m=A�?1�!��G.�QO0�?g�o���8�Y٠��=��n���!L�
za:7�G�����n���;���,�L�o�r���y��t���>Vx�]0M�p�ǵ�V�kq�=�a_�f��м���|��d#����~K����qU��験�:����2� ���/����5hZ(���
�0h������.�/��9|�h���O���G�"^�F�ћ0<}�ޕN���	�?�Z���8�(�i���G./�%�����X�|�&�����[�-��j��jêa��n���2�HÄS�gɗ���X����
�2
S���L:�bhH���QUr{O�Ex���L+��Z�}��9� v?1��?@!�|� X&�q�׉qX�����a��E��0���F������j�'D^Ԗ���D�H���2��p�J�P��l@��g����&;��4 8$F��Q�b��C:� �a��Ĭ!>���Y��
��R����E��-���ۼym�`qX5̝�q�������;0	y�C�G�u�І�x�764�J��Z
#-�f�j��BV-�j�UKȼ�7 @x��w��]��0O/t�/�[������~v|p��F����\e��3땍M"��xT��R�bv7�L�$6/��j5�'�m=.V
sB����t��9|{�P�	B�����<���yR�l0U�e�p����@�@�LU��m�<�c�� ��� �	'V3T��[y�S��$��!�2+�.tj�*Fh����:�;}��l�n5��4x�d�V1�Y��;V��BrGv�*��V3��y@�Wô|(�b�&e�a��>�01o�j��hĔ���0�h�+���?�|���������m��^螺26�eB����z@6����t�!�'��	p���MڬO=z��Á~������<||ul��ʛ@f����AH���b�4@��L����w��w#��3�F�����i���N�E�Q���n�r�N0o:ȿ�Z���LF�b��g�s�nBP�TÐaFLl0_�$����Ao��;91�R��8@�a�M�J�.Qr�^��
�H:M��jt��^lTr�?ݼ����k�u=���r4�'�;�TT�˨�J��F �n�x @h�m�i����5 Z�sچ;O^��k  �B��{"�����=�Y�P��iۓHGT^X-�����e��A(ⷋzv{���j�
@^
3�3:��$�_}�\���ty��a���$d�NB��FXYlۛ���PT}�VS˻K����v˻�m�DQ�݉.Ɖ�t9>Š�o��=�h���P�\_G߸c������;
�\�X�����\0��Y�A%��	���+泱rt9�\�^�(�,�R���E"`S���lV���e?rD�_��v�1)~ur5���7��0�:G��B0 �BR�<D؃dބ�S%��+���;[��j��Ք�13�,
��J&��.�$�Խ���r��_��D��ZfC|@�˗��0��8��1�&ȷ��,`zd���tݯ���.��4�����T�&\-Xsf��0��M�kn���׸��-��3�̌�F.~x�Jx��X��}��;8&�xx|"ڨ��P�G)����|��2�z!�s:�~u�6����lliҳ�|���PpYE���˴
��0�$c�=7���+O&�`3�/�(��u�
��8��*�2͘]g!
�}�r_���twf�sճ
�n�Q��g|�9v#ק�`�z���X+[[+����X�I��L;������nD�a?�!)OG���݆�M�55���
��0�~�4L��"�!$a���^@a�E��:�;�3�ַ�X��UYc�s�{��&+��ɋ�\n����^L_*9%�≤�ʨyR��ha)������TD|/�b�X�H�h"i ���é���]r��!�	��@���������t��
��7��q�8���͕Fl(��7Lj$#�j��R�ZI/i����v^Ҵ�vQ/�ԥ��Zڎ�oUm�XZTU-���j��
��) ct���ݺ&u����Y�կ����G�` �j�{�c]�1�aG2��7*@m����RY_�QTӴi���c��BY���[��f����骁��=�
�j�A���#�~a�o~�
�x|@�s+U_����j���d�q��Jeos��/X{�D�-�R���D9M�&��x(M����r<SN�R�x<QLƊ�K�xt���D�7̬���t���. ���%�8i5��;�q���¶��L�،]\�&�
R?0�A%���WO�<#�q��bz|5�^3��[���P>�}�uAә����<x�(n���s
ܭ��8"�U�p+x�]p-�� �6���4�$���o�~��X��+����M
�۠�T��������\{i�n#|q�׿4�yh-Au������ ��_��\as�l����.��I;,v�e^�}��g8jp!�H�8��^��66N��c���_\��Y9�K>�$��ZB�ܿ�ߟb�1�3��!�ǯ���\���k�.�W����KW����Ǐ�<.GPi��F!������\_�<���ϵ���S�o����T����Ff����Cz|��x*8���#�>�s���"!q�����ן�����9HD��.
�I�AC$$�D���T � ���y)	��K�u��z�������w��Ց�޿���ģ��	���a��R��7�#�G����'��F��d?SeO�QЋT/��DtA��<6	~��nE�f��H�'����Cr���DݕC�]j�>���2lNG��p;vJB��'!�����k��[�K���6�ho�u(F�e5��l���h�s�Sd{w�M$�t/�Iw� ��91�
Vz\„�=����`8�q����,7N��8���[������WZ�>�'��ab#ю�1����{�v_�Œ��e��;e�(F[H���21	���+B��s�24��=O{�=�eh���yv�Lo�s�!�w:0���.�{@ج��-��zn��ۋ��D�D�^(R�5�\\P�r�Ҹ���UWM��y�*��t[ 0B�a��>���Ov��	��\0���?IW���Ұ���r����_��*����IKE���n\��I���d2���T<O&�#&q��D�ga��kևm!ط��"����`�H�U���Rӌ?>_I��a�,��}���#p}���(��a0�;yT�C"L�.6��$µX0�w�<.�r
5:=�0訣��5�U�Mm�\0/]��냐�e�<�+���L

m�`�ĵ��LՋAat
3��y���'�7�W��}
�����s�6���˙~��k��^��c^�!�]�FS�������^.��Ը)x)�/��O�}�:��>z�h��.��2`\
�+��a�*��_��É>{�դ�\{@���:\�=
!�=`]St%�p}�8�0?���"5�{��Ņ�!`eC�P����E�J�1CMDP#|2B@5�@��`BJ	�2�V5J��!�=��E�dB��[@60|9����6sbg���	�B*ɹ���kTY�,�S!��<�r
��mbT(R��azL_0:x�N�4�H
Vt!�J/�=3`�=`�4z���@0,�x���/��Ȁ6��	&���:	x��1=`Е�Q@sM_�՗�':		��+�0�z�D�G�RR��8+�s���{@���(�!��I�q	���b�)d���6�k����y��laP�p{�yEmݮ(`�3����w�E�N�]�E�RDQM%^�IȽ���\�oɀ(�ς���l9��씻_��O���|�?������d����u�TJ�ϧw'>�%�xe%X�K�,x�->�U���6"�4C
�W��?~�2r��O��f��	�j^�H�������y�F�a>5EUQ4=y�j�[�}B�������	���'��ث��~?�!�����K-�?T1�[q�@@R���P�ρ<#�OW75��|@��G��
�Ihm�N��{�F*�GRd���喴2��!k�M:�_�	m~��Y^1�%��W��v���:"��討ń�!��R���,OI����ڣ$�J�&��lz���� ���`?x�`l��}0�N�8�T
�����du �I�����÷rtfMn�➵y��:A��l���
 ٲ�lj�;ݭ>�H�F��1�W���5��c�.�� ��*�5�'k�w�Ku�^
P`$�Y��L^k�5LK$G�YC'!��aΣ"�}�F���{��T�T��1�GF?�T{"�vpk���~���mN�G�l���(>s�,"[��䐟���C��:�F��
�\�>�@S5M����T�ks���Sxh�?Y��N�z�C�PAP��>_���.	���
p	���`�,z�m��e��\�u0��	6�w��-4����W(�9�T�+��}�B���+BG�h>[<�Ud�l���Umm�=���
@q���63��}���3J��k�&���B��=�s'G�t
jX?������'e��͝b7ǭ�����f����3䋾�q"�=�����20$�R��K�
�Rɕy�W8GdJzɕ%�{Rՙ-\�3�RuRp)K�s㥞�/�D��5�Z����,�7Z��/��|�,	*��R�$�`�_�}��ճl��aB⇖a&!����gT�ǕS�Z;u���=��J�h��:�ϳ����w���0�I��X6]d�CwB:=��I�6���>��$$�7�9�Y���0���_��q��՗Y0bH�;!CYq1΄Y[��gUf�=�7��o�j�7L;>697��5�������R����84� (�$B��S�a\�L.!�֍P3,��M�
�P���ع���}{�ϙ��໚[^궮�����]*�;P"N��!&���Nl�wG)�:�w&�D�����R 0�I6H�\��`������/&mv>q��B
-1�
@O��sS�G#����
v�%�H�`�݇i,�F`*�]1*�Up�@�t���+U��x���Xmwu $m���
;$I��[�9��QX�P�_��D�+:��B��Gq�2��ʙ�+P��u�>A]�R�N����Nԣ������m�
���?��*{[��p�A�?�!@�šX�#Q�ކ�
<??�aV[�VF�ɢXݱ���aP��X��`��jl���gj�V��@k��#+��x쎧I����e�ypA��Cp�U0�z�-���Xv�����ؚ�?�y`�αi$�/���yc|���p�����p�����a�7���)��i��ӓ�ϔ�Uȑ�}|��s���h+ te�^)i��Q��Im��lz� _3�NӴ��/�	X)쯈#��`�Q=���m�9��w�����hx��|��w��	Ь���.@�{0�$R]���/Bpeɑ=��T��@�A����0W�᫽�;['��ʘ��B]\5�9Q�N���ʜb�UwT�'���<��L����'��e�;-��ğ��gxHQ�"@��(����J0.!@(P���n7[��:\�cqĔ��PR`X�|jԱ#a84湲�xZ�����}P�A�-��jC�ƟI�)e>���o	��qw�EF\��X��(ǘ#	���f'��
�c��	�c���`�)�N��k����".-NY��H�(����� (	Z��TdQK���L*�h�-�I��-��io؀�{����.���Nf�@:�9jx��q��T7��
]� �����<��`E	a/�ܲ�3<\��1J�+fF�[���9�����U�������t����ù��}6��7�X24���$�;K����,�G]��)��WT��ݹ.2�Q�q)D���`��If�?;�2�ks��ڨ��z�H5�Y��=.���750;1�^^�u<fF��G#�NɄcWg�8#@��\�@f��v1�e�ࠋ6�R�@ĮEf��s<�?$J�WG]���3n��5m�+6�;�43l�b���4a1���7yD2m��QY0�<]}�d���
r��!���"��T.����(���of�
ܢ�O�L6z�0R��}>
��鍽�0�ɱM[J۔ҭJ)���ǎm����k��1�M�ݟG��c�·�Z��k���Ň�IW����z�> �&u�h�!mv(���~ҿ
�m�[�I��%
��	�=���w�s���É,�=���V�޺T�m�׉��僠��̣·W}B7��Խ՟'�t�G�SX��\Wfe�Ć�f�]���ڵ��JG'�]tis�"����8�J�RK�C�+^`xT�b�)�^��K)M'�Ki�JyNI(e��J��s<ƒ��3�Y |#�4��ȭ&'��(cO���(A7ӎ]���ʴ�E���!�Q�����1%:�L���@���8��?O\xO��ġ�"u}I�"�v�Rӧ�B�
��ѶMܤ�{}������f��
<�Șd����(HWx�b"L!�����!�
�>��Ui(At(ڃ�P�B�!��U�m�=����(JB�P,V��AHņG���0��e^C�ܕ�hU�G-��B周k���������<NLw�r��QW���;�	#痷�
�T���x�+X��s@�D�.�
!We|�	�'S�و;�
ธ��&$}9jB#��}����g�0־gSm����g�^Wh�5,BQ].;�ǒ�m��n���-w�ҌZ�6�&D�ރ��b��m��G�M��u5���
��aJ%?,:l���)�?�=�$���)w��S�P�'�O�{v����
bR/օ�6�$/~	�`H'�B���z��fZu=�&�V
�aN+��,-힞����#-��Q�Cjp������x�i�?��r+�Cz�d�
��J��Uvƨ��0��?��?1�x�	�0�a�����0�l61��Nſ�9u�����p%�.tN��/���ǃ��y��[��c�=K��&���2�?��݇Ǐ#܋��fT��V�OB�F����&j�+�(<<��g]�EHN�2	Pj<�
+�I0AC"�w�y��t^7��xNy�ɅoQ�i��� ��M,R��S>���Ȣ*ð^��(�k󺥱��,����6�K��?�5�H��
j�<�w7u>`xa1�o��!\d�ӎ�f_.yd�
ی�Lv+ �t���zʗM�WS����u‘K����C�=q�P��f�\O�;I�+�ԏ<�s�64���+c׏��s3�q���X�gF�;�����U���k�T�f"�s�E>��� Ѽ��0�/����=��	/���ԉ��`��M
����ls�қ�_F�a������}��E@��0��C}�e���V����B�{|T}rR���j�-w�p�H�������|�V�0����Cm@z�0p��*�x���fh\.�Z�:�	ݰ������@�٤��4�.QxK�:A��zc��S�7�L3� �x�![�P�cc%��ۇy��C��8(Z�� �君����C�ԧ�&���J���%<�|�π�)$��l>�~/�朿(�>(	�~�O���"�!�>Y4�֍�$t�����������O���G�:I��(�i'#IJ�pb4����?ʃ���DX��-��v!��
��4tG��K��K.�/�Q�#�TN�4�1>��䛏y�>�+�`�Ot#��c��)U+��/
�˔��U�Q(+r8�V@nj�N�`L��� V�S���ʑ���#���(��d{�ޥX}?tih�Hk��Y�@�����x��.�]��C�.�H�����9��d-�xTς��Ǒ�b����	ʔxR�K`弹Vp�wv�a�qX��Dñ~�q���V���8��P
+�؇��� i�;�6.�����G�эF�!.��@t�|�r��B�;o�v`�����˔ꕋ%��L��7�+ ��W�\.��������OU$Q#�SE�Z����tUD��ۑ��u}�w�~�%����Z���r���<,�
����|B��G��Iu�x�Q��V�x~F`f�Ж|LĄ�O�y�e��ȣwM�to>��Oz�8k�j�穙� \O4�0%􊮴��(�%I����l$ڜ�p~��gɍ�"�*V�{�#�{�N2`����y,���>����X�7��7=�Cn����R8f��w�`f��!י]k���
��?��Z���x�"�����,E��sآm�YH���p����a�ۀ/���dž�p��-���?�#G�?�Q��ձ:��lm�>�+P.E��w��٪�}����[n��Nx���2܂9�+w�t�g��7�G�Ћؒy�� bJ���gf��c穟Ȓ,����ܮI����88�\�؅ �E������U'����b�ـ����L�\l,�������1f��g�gq�`҆頀�c?Ҟ߻с>���v�`WU�Z�� E�^�R4����,V����9�o��@ਤ$�&v��=��3����|������u����w�G���!<��}n��/�z�������	Ğ\$x5E�-o/,��/�渄/tN�5o�!{p�2�R�%���?	�ܸ+D�8���[�/Z��Q�W����eA@Z#�o�?����;
����:��g�#
r5���5� #�W���@j�6�ԳK%���˚1�u�d�b���o��V��D��{�Q-�cL��%T;�h����p ��38�R;�����>7��Qg�m><�}ݎ`?�ߊC	h��h�oT�!N�����d�j�>�����1�0zs]�k����x��o�v|O���wx+G)�ҷ�C����HF�(�ֲ�$h�J�9�r�7ǡW(�l_�&˳u�����@��#D"q/���h�Y�!8�'�›���F@Z����7q'
���d�g��Rm�g���8��R���E�WU�k�yʣ�+�}���}�3e�`���)8����Pq�	�\�+�D7χ�Q-6����h����$�b�e��m���;��qސ_Ӯ�iH�!}�p��p��1�Ԏ�J�@&�ugV�V�/r�ߪ6�@o&�K� ���J@Ł��R�+��t��)�8&͝�*~�|x��G�/�yi�i>�V$��d��cp���y����:!�@q��l�x�f�����
�@�^�����B*(�i�O_��,sp���>���g�pP!�����p�!�]�2�	Q�$j���>��<��R����x�n��$�`�tdb0ًF2�7�I��O��6�d��,�τ/��*��t[���j/��C�v=�dqH�O8����kp�+��C	Hy���p�6����=�n�рv�]�T��1��%w��F73�p^p1ӱ&@Z�&��aU�
��,7p8&���㍸��p�l��As�����v�46 pHa���`k>�<1U"0���|�N�1��#����ƫL/�vjo������&����ڇ�L�u�����#�U�9u= �8b?�e�����IZր�<����5h<�)��Nq,�0�WX�(�Y/�>�1���<k������IB#��|	��+�p���Xt�6���B��!����M��t��?4N0�׵�X/X[m�`g#�"�½f��Œ�|�W͡,,|�#�gpd����8ŽV��p���|�MHu�pp>(�ˡ9�O�_�-8v�P��2���PGP��e ␔�g͎�G�9�E>�����u1<�6u�:�M�AC�f���l��j���ѭ!��B+�q�	x��6p,������P�D)&���п���xk.wǥ�2y�m70�i��)���W;66G\6�9/��h�*GQ}�@���2�w�KCdf��Eѯ� {�y�$S��Q��|<s*����#}r�)n�Д�Kñ �{����NY�~V�1݈ԕ>u"}�"FRfk
8��G&>�\ ����4Do�p���1���.�$ ��9R�V^�G����p,�}*�UJ@�н�O��H��*������,��?]*�����̞m'�;ӥ�lVa�����?:��9�y'3;!��p	.�Ʊ�uF�]q������KE�r	.t��38��,�]���HH��7̷G���C4`‹��F��{310%���)�ES�c��	 �M0@9Os���1L4'��{�	��ù�?]'�?��������p�����ƒ8�c����o?�Co@���������+��2yz�
f	���
�]w�d�y����G��-`�L�o�|�NC\��K�:��>9!��[����m��h@7���V��/h�ܢ��xM@�(w*��% p�M��
�%�.����Ó��J:�N;n���А��� �n��y�|;�x�\��y����I8X
�wY!���d�xűB@u[ %݈c]���xUz����>Ʊ���XK�!R?��<�\q|q�y^�?[���k[��0rJ�����{)��W �c�ȕFn�ߧa�$n?OF8t�� �T,+�a J@������X�}�n�A�֪��h�A0x88��ni>ı#�7��Z�֢$Y?s��@����
�fw��t�f�Dm�	&���.�ы�����H��l���B?��ȅ>T���1.9 {6�_%�G���ZJ�e���Ɓ��9���|xD`���
N��	�s�C�M~"�~9=5�E��󂮬�jҺ�o�Z'DkcX
��u��9Wq�#{"�K�,!T?�*Ⱦ�*N�������h���4�Ghwi
�ee��7q��}>8����h�f��
�����
���/)�3P�x	���Ld�,U�M�7����p�h�	���5��<�*;��XU���U���Jӎ���t���e�
�p@qE�
��p�>hRzt`�0s�����EW��k��I
�i�~ʛG�WS�U��8p
8RM;�HЧs3�$[��1׿��\����!O@���G���_�/����x��\rN'�N�g�:�.Q�
	Xg�3�
ӽpͺ�5e���W����q`�l�E��\$������g�rt�E��M��}��F$L�p@~�x���.p(���J@�����G8�/v���$�<����i������2m�ĚD4o���;#�$�|`-�H��Q��QS\�n�uB*H�6��u�k8tlx!�3�(�Z}�z�m<}��X��6��A�R0��jp,)��G"��z7��*��Z���+8v��΀~A@�4
;�X�S����b-����P�_5�k�b}���V��S	����{s̴��x��خ��_v]�	�8�Z0d��cA�r����N����(F�g

)>�(ߙIHMk>��[��IO��Ɲp��2�b��NN�q�s(>�]q�ぽ��4�]�9�wz?0;�|l>��:4��,W��a)Hሶ���C|�tӐ�� �ϔű���]�������Rw���{]8����i���z�0��g���+��њl� ���b�9ă<��b<�íߘ��1�.��h��8��:��o����	��>Ȟ����ep/��8����+���ot�qt�Ά�㲀�5`��%��E��ÀQ"|e�~<�?{��˖ȁ[��#]p(Y�8,��0�#�(�>����x:��'�{&��������@�I���}p��a��2q��a'�V�?�J�[�{{+K1�!����h�p�w���K�P�#�e��" p�	X�	xg�N�b��_�i^����Lr��D�ze ������뿴�
(�%���s
g���tADo
٥s��%P7hp_��p�%�.�c�ؾ�e�O83���8�N���㕆�G�l�.7�iy�~}'D._Ⱋ�(��``����;��ܾ��/��%�a��c"��tBpe�%���s>��G��
��,����a�V_��`�����_���#��G�(��S(����o� �=jk�ˆ���t�%3$��J?��0����%إ[/�m�1S�p��*�K��
�$DW8&�~�cz��#g�����Ӊ�hqd�0>�~�w(���f����#a�ni����M�u��G��q�HX�]�%8tA����(���'J�u�#w_p��8�eE�lš�������| ?zHT��p׹t,J[�ȫo‡q�C� �,�A��3�?.!vN��J�������͖�Xڱ��L��c&	;#inC(%������|"`�M��,����Y��r�X̵b��G����;��#���o��Oe��[&+�n�4�d��E/,�+�w	G#6��bp��Ǯ/��o��J�m'���"?J���,��X�8)�á���xkqh6q��烄9���8��?�t2aA�GnxRj��c�����
��\�����_OG�g+>؊xopPjP��	X{ɟ�{��,	�]��GI�2�dX1zk�ۍ�yA��$�.�^+lo�38lk�;h���{��q|1t�=7���L�RU۰��8!��RT��S]��:!�B��)!k��χo��(����e�8�=!O�ӣ���X���	�t_�a�x�q���	��y�0�J����=��VR�"�\@��c㞐V��
��=!����v����@⩦ \Z7�1φ����Ps_v �g|u�w[�)!�~���o[�8�h�r��l'�R�|��0�c�7��=Y
�����`�Zq�g�8uK�=o^?�p���=_�I�݄��#0�?���9�t�����,��$)#�{k�Fz\� ��(�N�>�r���7�{���U|Z�}76qb2��j@��g��8%���o�q������{rm!��0=y����Q������P\���\��r?���u�'iA@�I��K+T�/I�8VwBlޖ����~z/�?h��w�8K@n��DC�����o�`T���-uzBfU��
�����?F�±�ܚ�vBT\���˯���)�\۶�st#rrD��q��qz�p^V����+�۾/��@k�n��u�6@�~�ѻ~[&Q�x�W����ud���C;���8V���S�?�I����u±Æd퓊�mc$�|�ǝj�w�Y�k���E���J{���U~mT>����e?-p������+�v�~q�|y)e�����1x>��Z"���3*�|v�&����.8��)�*`.e'=�-]�dv��jR�V�����D�	�϶�g�?��<��~ �w�pZ�k��A��!��O?F&��eೞ�2�9��cg�;�P�o뎛wr6�$�>��I�Sp`�˷����uM������CU}�����Q�0��}��p����K��]ѼPJ� �(�B�cp\?
�ù��n�hG�
:���+�}��s�gڝ&��u���q�|4�95$ɘ6�_x�tk��?~�Ǐ'
m�X�(�_�m�3
Mҋ\+`>�Z��G\��Qj�~
G�}�8
�߃~�������x�q�a�-�g<z~#ȏNj3O�K[�w��)�w��ɪыNp�8��
��;���U����[��?���|�8ɭ��WS�C�8 �}�Bh���f鲘�Z�x]sw��&p&�D2���/b��p��������|;��!�?���|���t'q1vQΒ>y^�f~0��R�~d�y]p��"���p7�F��\w�8�[�� �l�!C���t�1�ѱ�gm��m�X�*��^���ѻ��`F��8���Ŀ�)�S�w��ۥ�t`*�R4��47[s�Ϲ�qܸ	��uťו�?[z]���:���<4p~%ė�s�w����xN9Ъ]��8�[���u(tZHgP�>�3��x]�N�)�yE0�u�q1�=�#��H�g~z���"Yճ���pO�QU���u���]���[�x[��.p��^��K"��w��1�w̺�QZ�)��YP�ipE�r�ʏV�Cn���v_����?(�����?�57b*zX�)W똫Wۂu�����t��w���4����h��L�W�Ϡ�n7R�3	��W[1����,`#w��Nv�jN/�����e�RA��́qUd�U�#��2�ޣv�js����c��p��q���}�l6�.m���ƥ��|y�"�[�x�w�_#쨦b<t�	kst!B��J#��q���UP��<*�C� ���G�K�����lIEND�B`�templates/isis/cpanel.php000060400000000461152453623440011471 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Templates.isis
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

require_once __DIR__ . '/index.php';
templates/isis/index.php000060400000026062152453623440011343 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Templates.isis
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 * @since       3.0
 */

defined('_JEXEC') or die;

/** @var JDocumentHtml $this */

$app   = JFactory::getApplication();
$lang  = JFactory::getLanguage();
$input = $app->input;
$user  = JFactory::getUser();

// Output as HTML5
$this->setHtml5(true);

// Gets the FrontEnd Main page Uri
$frontEndUri = JUri::getInstance(JUri::root());
$frontEndUri->setScheme(((int) $app->get('force_ssl', 0) === 2) ? 'https' : 'http');
$mainPageUri = $frontEndUri->toString();

// Add JavaScript Frameworks
JHtml::_('bootstrap.framework');

// Add filter polyfill for IE8
JHtml::_('behavior.polyfill', array('filter'), 'lte IE 9');

// Add template js
JHtml::_('script', 'template.js', array('version' => 'auto', 'relative' => true));

// Add html5 shiv
JHtml::_('script', 'jui/html5.js', array('version' => 'auto', 'relative' => true, 'conditional' => 'lt IE 9'));

// Add Stylesheets
JHtml::_('stylesheet', 'template' . ($this->direction === 'rtl' ? '-rtl' : '') . '.css', array('version' => 'auto', 'relative' => true));

// Load specific language related CSS
JHtml::_('stylesheet', 'administrator/language/' . $lang->getTag() . '/' . $lang->getTag() . '.css', array('version' => 'auto'));

// Load custom.css
JHtml::_('stylesheet', 'custom.css', array('version' => 'auto', 'relative' => true));

JHtml::_('stylesheet', 'responsive.css', array('version' => 'auto', 'relative' => true));


// Detecting Active Variables
$option   = $input->get('option', '');
$view     = $input->get('view', '');
$layout   = $input->get('layout', '');
$task     = $input->get('task', '');
$itemid   = $input->get('Itemid', 0, 'int');
$sitename = htmlspecialchars($app->get('sitename', ''), ENT_QUOTES, 'UTF-8');
$cpanel   = $option === 'com_cpanel';

$hidden = $app->input->get('hidemainmenu');

$showSubmenu          = false;
$this->submenumodules = JModuleHelper::getModules('submenu');

foreach ($this->submenumodules as $submenumodule)
{
	$output = JModuleHelper::renderModule($submenumodule);

	if ($output !== '')
	{
		$showSubmenu = true;
		break;
	}
}

// Template Parameters
$displayHeader = $this->params->get('displayHeader', '1');
$statusFixed   = $this->params->get('statusFixed', '1');
$stickyToolbar = $this->params->get('stickyToolbar', '1');

// Header classes
$navbar_color    = $this->params->get('templateColor') ?: '';
$header_color    = $displayHeader && $this->params->get('headerColor') ? $this->params->get('headerColor') : '';
$navbar_is_light = $navbar_color && colorIsLight($navbar_color);
$header_is_light = $header_color && colorIsLight($header_color);

if ($displayHeader)
{
	// Logo file
	if ($this->params->get('logoFile'))
	{
		$logo = JUri::root() . htmlspecialchars($this->params->get('logoFile'), ENT_QUOTES);
	}
	else
	{
		$logo = $this->baseurl . '/templates/' . $this->template . '/images/logo' . ($header_is_light ? '-inverse' : '') . '.png';
	}
}

function colorIsLight($color)
{
	$r = hexdec(substr($color, 1, 2));
	$g = hexdec(substr($color, 3, 2));
	$b = hexdec(substr($color, 5, 2));

	$yiq = (($r * 299) + ($g * 587) + ($b * 114)) / 1000;

	return $yiq >= 200;
}

// Pass some values to javascript
$offset = 20;

if ($displayHeader || !$statusFixed)
{
	$offset = 30;
}

$stickyBar = 0;

if ($stickyToolbar)
{
	$stickyBar = 'true';
}

// Template color
if ($navbar_color)
{
	$this->addStyleDeclaration('
	.navbar-inner,
	.navbar-inverse .navbar-inner,
	.dropdown-menu li > a:hover,
	.dropdown-menu .active > a,
	.dropdown-menu .active > a:hover,
	.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
	.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
	.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle,
	#status.status-top {
		background: ' . $navbar_color . ';
	}');
}

// Template header color
if ($header_color)
{
	$this->addStyleDeclaration('
	.header {
		background: ' . $header_color . ';
	}');
}

// Sidebar background color
if ($this->params->get('sidebarColor'))
{
	$this->addStyleDeclaration('
	.nav-list > .active > a,
	.nav-list > .active > a:hover {
		background: ' . $this->params->get('sidebarColor') . ';
	}');
}

// Link color
if ($this->params->get('linkColor'))
{
	$this->addStyleDeclaration('
	a,
	.j-toggle-sidebar-button {
		color: ' . $this->params->get('linkColor') . ';
	}');
}
?>
<!DOCTYPE html>
<html lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
<head>
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="IE=edge" />
	<jdoc:include type="head" />
</head>
<body class="admin <?php echo $option . ' view-' . $view . ' layout-' . $layout . ' task-' . $task . ' itemid-' . $itemid; ?>" data-basepath="<?php echo JURI::root(true); ?>">
<!-- Top Navigation -->
<nav class="navbar<?php echo $navbar_is_light ? '' : ' navbar-inverse'; ?> navbar-fixed-top">
	<div class="navbar-inner">
		<div class="container-fluid">
			<?php if ($this->params->get('admin_menus') != '0') : ?>
				<a href="#" class="btn btn-navbar collapsed" data-toggle="collapse" data-target=".nav-collapse">
					<span class="element-invisible"><?php echo JTEXT::_('TPL_ISIS_TOGGLE_MENU'); ?></span>
					<span class="icon-bar"></span>
					<span class="icon-bar"></span>
					<span class="icon-bar"></span>
				</a>
			<?php endif; ?>

			<!-- skip to content -->
			<a class="element-invisible" href="#skiptarget"><?php echo JText::_('TPL_ISIS_SKIP_TO_MAIN_CONTENT'); ?></a>

			<a class="admin-logo <?php echo ($hidden ? 'disabled' : ''); ?>" <?php echo ($hidden ? '' : 'href="' . $this->baseurl . '/index.php"'); ?>>
				<span class="icon-joomla"></span>
				<div class="element-invisible">
					<?php echo JText::_('TPL_ISIS_CONTROL_PANEL'); ?>
				</div>
			</a>

			<a class="brand hidden-desktop hidden-tablet" href="<?php echo $mainPageUri; ?>" title="<?php echo JText::sprintf('TPL_ISIS_PREVIEW', $sitename); ?>" target="_blank"><?php echo JHtml::_('string.truncate', $sitename, 14, false, false); ?>
				<span class="icon-out-2 small"></span></a>

			<div<?php echo ($this->params->get('admin_menus') != '0') ? ' class="nav-collapse collapse"' : ''; ?>>
				<jdoc:include type="modules" name="menu" style="none" />
				<ul class="nav nav-user<?php echo ($this->direction == 'rtl') ? ' pull-left' : ' pull-right'; ?>">
					<li class="dropdown">
						<a class="<?php echo ($hidden ? ' disabled' : 'dropdown-toggle'); ?>" data-toggle="<?php echo ($hidden ? '' : 'dropdown'); ?>" <?php echo ($hidden ? '' : 'href="#"'); ?>><span class="icon-user"></span>
							<span class="caret"></span>
							<div class="element-invisible">
								<?php echo JText::_('TPL_ISIS_USERMENU'); ?>
							</div>
						</a>
						<ul class="dropdown-menu">
							<?php if (!$hidden) : ?>
								<li>
									<span>
										<span class="icon-user"></span>
										<strong><?php echo htmlspecialchars($user->name, ENT_QUOTES, 'UTF-8'); ?></strong>
									</span>
								</li>
								<li class="divider"></li>
								<li>
									<a href="index.php?option=com_admin&amp;task=profile.edit&amp;id=<?php echo $user->id; ?>"><?php echo JText::_('TPL_ISIS_EDIT_ACCOUNT'); ?></a>
								</li>
								<li class="divider"></li>
								<li class="">
									<a href="<?php echo JRoute::_('index.php?option=com_login&task=logout&' . JSession::getFormToken() . '=1'); ?>"><?php echo JText::_('TPL_ISIS_LOGOUT'); ?></a>
								</li>
							<?php endif; ?>
						</ul>
					</li>
				</ul>
				<a class="brand visible-desktop visible-tablet" href="<?php echo $mainPageUri; ?>" title="<?php echo JText::sprintf('TPL_ISIS_PREVIEW', $sitename); ?>" target="_blank"><?php echo JHtml::_('string.truncate', $sitename, 14, false, false); ?>
					<span class="icon-out-2 small"></span></a>
			</div>
			<!--/.nav-collapse -->
		</div>
	</div>
</nav>
<!-- Header -->
<?php if ($displayHeader) : ?>
	<header class="header<?php echo $header_is_light ? ' header-inverse' : ''; ?>">
		<div class="container-logo">
			<img src="<?php echo $logo; ?>" class="logo" alt="<?php echo $sitename;?>" />
		</div>
		<div class="container-title">
			<jdoc:include type="modules" name="title" />
		</div>
	</header>
<?php endif; ?>
<?php if (!$statusFixed && $this->countModules('status')) : ?>
	<!-- Begin Status Module -->
	<div id="status" class="navbar status-top hidden-phone">
		<div class="btn-toolbar">
			<jdoc:include type="modules" name="status" style="no" />
		</div>
		<div class="clearfix"></div>
	</div>
	<!-- End Status Module -->
<?php endif; ?>
<?php if (!$cpanel) : ?>
	<!-- Subheader -->
	<a class="btn btn-subhead" data-toggle="collapse" data-target=".subhead-collapse"><?php echo JText::_('TPL_ISIS_TOOLBAR'); ?>
		<span class="icon-wrench"></span></a>
	<div class="subhead-collapse collapse" id="isisJsData" data-tmpl-sticky="<?php echo $stickyBar; ?>" data-tmpl-offset="<?php echo $offset; ?>">
		<div class="subhead">
			<div class="container-fluid">
				<div id="container-collapse" class="container-collapse"></div>
				<div class="row-fluid">
					<div class="span12">
						<!-- target for skip to content link -->
						<a id="skiptarget" class="element-invisible"><?php echo JText::_('TPL_ISIS_SKIP_TO_MAIN_CONTENT_HERE'); ?></a>
						<jdoc:include type="modules" name="toolbar" style="no" />
					</div>
				</div>
			</div>
		</div>
	</div>
<?php else : ?>
	<div style="margin-bottom: 20px">
		<!-- target for skip to content link -->
		<a id="skiptarget" class="element-invisible"><?php echo JText::_('TPL_ISIS_SKIP_TO_MAIN_CONTENT_HERE'); ?></a>
	</div>
<?php endif; ?>
<!-- container-fluid -->
<div class="container-fluid container-main">
	<section id="content">
		<!-- Begin Content -->
		<jdoc:include type="modules" name="top" style="xhtml" />
		<div class="row-fluid">
			<?php if ($showSubmenu) : ?>
			<div class="span2">
				<jdoc:include type="modules" name="submenu" style="none" />
			</div>
			<div class="span10">
				<?php else : ?>
				<div class="span12">
					<?php endif; ?>
					<jdoc:include type="message" />
					<jdoc:include type="component" />
				</div>
			</div>
			<?php if ($this->countModules('bottom')) : ?>
				<jdoc:include type="modules" name="bottom" style="xhtml" />
			<?php endif; ?>
			<!-- End Content -->
	</section>

	<?php if (!$this->countModules('status') || (!$statusFixed && $this->countModules('status'))) : ?>
		<footer class="footer">
			<p class="text-center">
				<jdoc:include type="modules" name="footer" style="no" />
				&copy; <?php echo $sitename; ?> <?php echo date('Y'); ?></p>
		</footer>
	<?php endif; ?>
</div>
<?php if ($statusFixed && $this->countModules('status')) : ?>
	<!-- Begin Status Module -->
	<div id="status" class="navbar navbar-fixed-bottom hidden-phone">
		<div class="btn-toolbar">
			<div class="btn-group pull-right">
				<p>
					<jdoc:include type="modules" name="footer" style="no" />
					&copy; <?php echo date('Y'); ?> <?php echo $sitename; ?>
				</p>

			</div>
			<jdoc:include type="modules" name="status" style="no" />
		</div>
	</div>
	<!-- End Status Module -->
<?php endif; ?>
<jdoc:include type="modules" name="debug" style="none" />
</body>
</html>
templates/isis/favicon.ico000060400000003743152453623440011645 0ustar00�PNG


IHDR�asRGB���	pHYs��$iTXtXML:com.adobe.xmp<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:tiff="http://ns.adobe.com/tiff/1.0/"
            xmlns:exif="http://ns.adobe.com/exif/1.0/"
            xmlns:dc="http://purl.org/dc/elements/1.1/"
            xmlns:xmp="http://ns.adobe.com/xap/1.0/">
         <tiff:ResolutionUnit>2</tiff:ResolutionUnit>
         <tiff:Compression>5</tiff:Compression>
         <tiff:XResolution>72</tiff:XResolution>
         <tiff:Orientation>1</tiff:Orientation>
         <tiff:YResolution>72</tiff:YResolution>
         <exif:PixelXDimension>16</exif:PixelXDimension>
         <exif:ColorSpace>1</exif:ColorSpace>
         <exif:PixelYDimension>16</exif:PixelYDimension>
         <dc:subject>
            <rdf:Seq/>
         </dc:subject>
         <xmp:ModifyDate>2015:03:15 13:03:46</xmp:ModifyDate>
         <xmp:CreatorTool>Pixelmator 3.3.1</xmp:CreatorTool>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
>Iv]XIDAT8}�]h\E�ϙ�{wﺻI]m�XClK4�RE�w-E��(->�f|)y�~(Z�"ȢA�R�h�Z�B46M��-$ӆ6&-k41����c�xn��S��\����s��g;^��t}�Pc{���յ��
׽�uQ��{VJ�5"I"�:�����X���7���O))����:L;�j8�lQ�P ��%!��럒|2��qye��4��m�m<3�@�!��$�+c粒���J�ۤ-S�R��Hk�A8$��k���
)��[�O�/�ov,�6�˔�}�O0|�
��n�����N�ҀF�{Ӂ�{ǽLK�)��{�|�G�� ʭ�"W���?��X-����Y�W�~Rn�2�˰o.� x�*S߇�Kê:
�4`DF�oԝ.(Y�&pKq��ѵX�n���9�bbn��|��cc�N��ݛZĴ�&��ܖۑ�t�B���Trj]ޱ*�Sxqd�w?��	p�|���n�)3^E8Y��⑷g"rU`Wn�A�O�5���?�H�lpY[��Q8��+��]��r�q�oޱe��t����j	Z�G�O\}�����r���7�wَ�C����V6t�b70j�#Ū�!��_WH+��R����F&/������Ϗ��j.9W���xZA!�/�W>	`[�X;���GP���w6�V���R�{4w�e��WD�0�Α�h�������Lȣ��%J�Л��z����=i ZϰŠ��Q����^"���O:58՛�k��~h���l`M��ǽS�qV1DZ���m���hb��w�yu�K����o��;�������DS(IEND�B`�templates/isis/less/pages/_com_templates.less000060400000001531152453623440015445 0ustar00// Template Menu Assignment

#menu-assignment {
	position: relative;
	.menu-links {
		margin-top: 15px;
		margin-left: 0;
		-webkit-column-count: 4;
		-moz-column-count: 4;
		column-count: 4;
		-moz-column-gap: 15px;
		-webkit-column-gap: 15px;
		column-gap: 15px;
		> li {
			display: inline-block;
			vertical-align: top;
			margin-bottom: 15px;
			width: 100%;
			list-style: none;
			page-break-inside: avoid;
			break-inside: avoid;
		}
	}
	.menu-links-block {
		background-color: #fafafa;
	    border: 1px solid #ddd;
	    border-radius: 3px;
	    padding: 15px;
	}
}
@media (max-width: @xl-max) {
	#menu-assignment .menu-links {
		-webkit-column-count: 3;
		-moz-column-count: 3;
		column-count: 3;
	}
}
@media (max-width: @md-max) {
	#menu-assignment .menu-links {
		-webkit-column-count: auto;
		-moz-column-count: auto;
		column-count: auto;
	}
}
templates/isis/less/pages/_com_cpanel.less000060400000000561152453623440014713 0ustar00// com_cpanel

.com_cpanel {
	.well {
		padding: 8px 14px;
		border: 1px solid rgba(0,0,0,0.05);
		.module-title.nav-header {
			color: #555;
		}
		> .row-striped, > .list-striped {
			margin: 0 -14px;
			> .row-fluid {
				padding: 8px 14px;
				[class*="span"] {
					margin-left: 0;
				}
			}
			> li {
				padding-left: 15px;
				padding-right: 15px;
			}
		}
	}
}templates/isis/less/pages/_com_privacy.less000060400000000563152453623440015130 0ustar00// com_privacy

.com_privacy {
	.well {
		padding: 8px 14px;
		border: 1px solid rgba(0,0,0,0.05);
		.module-title.nav-header {
			color: #555;
		}
		> .row-striped, > .list-striped {
			margin: 0 -14px;
			> .row-fluid {
				padding: 8px 14px;
				[class*="span"] {
					margin-left: 0;
				}
			}
			> li {
				padding-left: 15px;
				padding-right: 15px;
			}
		}
	}
}templates/isis/less/pages/_com_postinstall.less000060400000000502152453623440016020 0ustar00// com_postinstall

.com_postinstall {
	fieldset {
		background-color: #fafafa;
		border: 1px solid #ccc;
		border-radius: 5px;
		margin: 0 0 18px;
		padding: 4px 18px 18px;
		.btn {
			margin-top: 10px;
		}
	}
	legend {
		border: 0 none;
		display: inline-block;
		padding: 0 5px;
		margin-bottom: 0;
		width: auto;
	}
}
templates/isis/less/blocks/_forms.less000060400000013433152453623440014121 0ustar00// Forms


// Normalize LTR Label (JBS request)
// --------------------------

.form-horizontal {
	// Float the labels left
	.control-label {
		padding-right: 5px;
		text-align: left;
		// Set a width for the spacer hr so it shows
		.spacer hr {
			width: 380px;
			@media (max-width: 420px) {
				width: 220px;
			}
		}
	}
	.field-spacer>.control-label{
		width: auto;
	}
	#jform_catid_chzn {
		vertical-align: middle;
	}
}

.form-vertical {
	.control-label {
		> label {
			display: inline-block;
			.ie7-inline-block();
		}
	}
	.controls {
		margin-left: 0;
	}
}
@media (max-width: @lg-max) {
	.form-horizontal-desktop {
		.control-label {
			float: none;
			width: auto;
			padding-right: 0;
			padding-top: 0;
			text-align: left;
			> label {
				display: inline-block;
				.ie7-inline-block();
			}
		}
		.controls {
			margin-left: 0;
		}
	}
}

@media (max-width: @xl-max) {
	.row-fluid .row-fluid .form-horizontal-desktop {
		.control-label {
			float: none;
			width: auto;
			padding-right: 0;
			padding-top: 0;
			text-align: left;
			> label {
				display: inline-block;
				.ie7-inline-block();
			}
		}
		.controls {
			margin-left: 0;
		}
	}
}

.form-inline-header {
	margin: 5px 0;
	.control-group,
	.control-label,
	.controls {
		display: inline-block;
		.ie7-inline-block();
	}
	.control-label {
		width: auto;
		padding-right: 10px;
	}
	.controls {
		padding-right: 20px;
	}
}
/* Make fieldsets responsive */
fieldset[class^="form-"] {
	min-width: 100%;
}
/* Make fieldsets responsive in Firefox. See http://getbootstrap.com/css/#tables-responsive */
@-moz-document url-prefix() {
  fieldset[class^="form-"] { display: table-cell; }
}

/* Display checkboxes without bullets in list */
fieldset.checkboxes input {
	float: left;
}

fieldset.checkboxes li {
	list-style: none;
}

/* Make form elements responsive */
.control-group,
.controls,
.controls input[type="text"],
.controls input[type="number"],
.controls input[type="email"],
.controls select,
.controls textarea
{
	max-width: 100%;
}

/* Min-width on buttons */
.controls .btn-group > .btn {
	min-width: 50px;
	margin-left: -1px;
}

.controls .btn-group.btn-group-yesno {
	width: 220px;
	max-width: 100%;
	> .btn {
		width: 50%;
		min-width: 40px;
		padding: 2px 0;
	}
}

/* Title field */
input.input-large-text {
	font-size: 18px;
	line-height: 22px;
	height: auto;
}

/* Customize Textarea Resizing */
textarea {
	resize: both;
}

textarea.vert {
	resize: vertical;
}

textarea.noResize {
	resize: none;
}

/* Repeatable SubForm */
.subform-repeatable {
	padding-right: 10px;
	> .btn-toolbar {
		margin: 0;
		.group-add {
			line-height: 26px;
			width: 56px;
			font-size: 13px;
			margin-left: 28px;
		}
	}
}
.subform-repeatable-group {
	margin-top: 20px;
	margin-left: 28px;
	border: 1px solid @inputBorder;
	padding: 8px 25px 15px;
	position: relative;
	border-radius: @inputBorderRadius;
	> .btn-toolbar {
		margin: 0;
		.btn-group {
			margin-right: 0px;
			margin-top: -1px;
			position: static;
		}
		.btn {
			font-size: 13px;
			line-height: 26px;
			background-color: #F3F3F3;
			position: absolute;
			span {
				vertical-align: middle;
				line-height: 11px;
			}
			&.btn-success {
				color: #378137;
				bottom: 0;
				right: 0;
				border-radius: @inputBorderRadius 0 0 0;
				border-width: 1px 0 0 1px;
				padding-top: 1px;
				.icon-plus:before {
					content: "]";
				}
			}
			&.btn-danger {
				color: #942a25;
				top: 0;
				right: 0;
				border-radius: 0 0 0 @inputBorderRadius;
				border-width: 0 0 1px 1px;
				.icon-minus:before {
					content: "I";

				}
			}
			&.btn-primary {
				color: #24748c;
				color: #333;
				right: 100%;
				top: 50%;
				margin-top: -27px;
				margin-right: 1px;
				border-radius: @inputBorderRadius 0 0 @inputBorderRadius;
				border-width: 1px 0 1px 1px;
				line-height: 52px;
				.icon-move:before {
					content: "Z";
				}
			}
			[class^="icon-"], [class*=" icon-"] {
				margin: 0;
			}
			&:hover {
				background-color: #E6E6E6;
			}
		}
	}
	&:nth-child(odd) {
	}
	&:nth-child(even) {
	}
	&:last-of-type {
	}
	.control-group:last-of-type {
		margin-bottom: 10px;
	}
}
@media (max-width: @lg-max) {
	.subform-repeatable-group > .btn-toolbar .btn-group {
		margin-bottom: 10px;
	}
}

.subform-table-layout {
	.control-group {
		margin-bottom: 10px;
		&:last-of-type {
			margin-bottom: 0;
		}
	}
	.controls {
		padding-right: 20px;
	}
	.btn-group {

	}
	input {
		width: 100%;
		max-width: 206px;
	}
	table .btn-group {
		margin: 0 7px;
	}
}
@media (max-width: 1024px) {
	.subform-table-layout {
		.subform-repeatable {
			padding-right: 0;
			tbody td:last-of-type {
				text-align: right;
				padding-bottom: 15px;
			}
		}
		table, thead, tbody, th, td, tr {
			display: block;
		}
		table {
			border: 1px solid #ddd;
		}
		thead {

			th {
				position: absolute;
				top: -9999px;
				left: -9999px;
				&:last-of-type {
					position: static;
					width: 100% !important;
					text-align: right;
					box-sizing: border-box;
					border-left: 0;
				}
			}
		}
		tr {
			margin: 0;
    		padding: 0;
			border: 0;
		}
		td {
			border: none;
			position: relative;
			padding-left: 50%;
		}
		tbody {
			td:first-of-type {
				padding-top: 15px;
				border-top: 1px solid #ddd;
				&:before {top:18px;}
			}
		}

		td:before {
			content: attr(data-column);
			position: absolute;
			top: 13px;
			left: 10px;
			padding-right: 10px;
		}
	}
}

/* Remove unneeded space between label and field in vertical forms */
.controls > .radio:first-child,
.controls > .checkbox:first-child {
	padding-top: 0;

	.form-horizontal & {
		padding-top: 5px;
	}
}

/* Align btn-group to label */
.form-horizontal .controls > .radio.btn-group:first-child {
	padding-top: 0;
}

/* Align btn-group-yesno to label */
.form-horizontal .controls > .radio.btn-group-yesno:first-child {
	padding-top: 2px;
}

/* Fix field media width */
input.field-media-input {
	width: auto;
}
templates/isis/less/blocks/_tables.less000060400000002140152453623440014236 0ustar00// Tables

@media (max-width: @sm-max) {

	.pagination a {
		padding: 5px;
	}

	.btn-group.divider,
	.header .row-fluid .span3,
	.header .row-fluid .span7 {
		display: none;
	}

	.navbar .btn {
		margin: 0;
	}

	.btn-subhead {
		display: block;
		margin: 10px 0;
	}

	.subhead-collapse.collapse {
		height: 0;
		overflow: hidden;
	}

	.btn-toolbar .btn-wrapper {
		display: block;
		margin:0px 10px 5px 10px;
	}

	.btn-toolbar .btn-wrapper .btn {
		width: 100% !important;
	}

	.subhead {
		background: none repeat scroll 0 0 transparent;
		border-bottom: 0 solid darken(@wellBackground, 7%);
	}

	.btn-group + .btn-group {
		margin-left: 10px;
	}

	.login .chzn-single {
		width: 222px !important;
	}

	.login .chzn-container,
	.login .chzn-drop {
		width: 230px !important;
	}
	#toolbar [class^="icon-"], #toolbar [class*=" icon-"] {
	    background-color: transparent;
	    border-right: medium none;
	    width: 10px;
	}
}

/* Tables */
table label {
	margin: 0;
}

td.has-context {
	// Fixes difference in height between normal and hover on cell with context
	height: 23px;
}

td.nowrap.has-context {
	width: 45%;
}templates/isis/less/blocks/_utility-classes.less000060400000000261152453623440016124 0ustar00// Utility Classes

.break-word {
	word-break: break-all;
	word-wrap: break-word;
}

.disabled {
	cursor: default;
	background-image: none;
	.opacity(65);
	.box-shadow(none);
}
templates/isis/less/blocks/_custom.less000060400000011357152453623440014310 0ustar00// Custom

/* Links */
.j-links-separator {
	margin: 20px 0px;
	width: 100%;
	height: 0px;
	border-top: 2px solid #DDDDDD;
}
/* Main Container & System Debug Padding */
.container-main,
#system-debug {
	padding-bottom: 50px;
}

/* Pagination in toolbar */
.pagination-toolbar {
	margin: 0;
}

.pagination-toolbar a {
	line-height: 26px;
}

/* Dropdown */
.pull-right > .dropdown-menu,
.dropdown-reverse {
	left: auto;
	right: 0;
}

/* Nav list filters */
.nav-filters hr {
	margin: 5px 0;
}
/* Module Assignment Tab */
#assignment.tab-pane {
	min-height: 500px;
}

@media (max-width: @lg-max) {
	.container-fluid {
		padding-left: 10px;
		padding-right: 10px;
	}
}

@media (min-width: @md) {
	body {
		padding-top: 30px;
	}

	.nav-collapse.collapse.in {
		height: auto !important;
	}
}

@media (max-width: @md-max) {
	.container-fluid {
		padding-left: 0;
		padding-right: 0;
	}
}

@media (max-width: @sm-max) {

	.pagination a {
		padding: 5px;
	}

	.btn-group.divider,
	.header .row-fluid .span3,
	.header .row-fluid .span7 {
		display: none;
	}

	.btn-group + .btn-group {
		margin-left: 10px;
	}
}

/* Extension type labels */
.info-labels {
	margin-top: -5px;
	margin-bottom: 10px;
}

/* Sortable list*/
.sortable-handler.inactive {
	opacity: 0.3;
	filter: alpha(opacity=30);
}
/* Joomla and Extension update message */
.alert-joomlaupdate {
	text-align: center;
	button {
		vertical-align: baseline;
	}
}
.j-jed-message {
	line-height: 2em;
	color:#333333;
}

/* z-index issues */
.moor-box {
	z-index: 3;
}

.admin .chzn-container .chzn-drop {
	z-index: 1060;
}

/* Item associations */
.item-associations {
	margin: 0;
}

.item-associations li {
	list-style: none;
	display: inline-block;
	margin: 0 0 3px 0;
}

.item-associations li a {
	color: #ffffff;
}

/* Content Languages flag */
#flag img {
	padding-top: 6px;
	vertical-align: top;
}
/* Tweaking of tooltips */
.tooltip {
	max-width: 400px;
}

.tooltip-inner {
	max-width: none;
	text-align: left;
	text-shadow: none;
}

th .tooltip-inner {
	font-weight: normal;
}

.tooltip.hasimage {
	opacity: 1;
}

/* Permissions dropdown display */
#permissions-sliders {
	.chzn-container {
		margin-top: -5px;
		position: absolute;
	}
	.table td {
		padding: 8px 8px 9px;
	}
}

.img-preview > img {
	max-height: 100%;
}

.alert-no-items {
	margin-top: 20px;
}
@media (max-width: @md-max) {
	html[dir=rtl] #toolbar #toolbar-options,
	html[dir=rtl] #toolbar #toolbar-help,
	#toolbar #toolbar-options,
	#toolbar #toolbar-help {
		float: none;
	}
}

/* Widen the drop downs for the Permissions Field */
#permissions-sliders .input-small {
	width: 120px;
}
.editor {
	overflow: hidden;
	position: relative
}

.editor textarea.mce_editable {
	box-sizing: border-box;
}
/* For grid.boolean */
a.grid_false {
	display: inline-block;
	height: 16px;
	width: 16px;
	background-image: url('../images/admin/publish_r.png');
}

a.grid_true {
	display: inline-block;
	height: 16px;
	width: 16px;
	background-image: url('../images/admin/icon-16-allow.png');
}

/* Box-shadow from focused fields */
textarea, input, .uneditable-input {
	box-shadow: none !important;
}
textarea:focus, input:focus, .uneditable-input:focus {
	box-shadow: none;
	border: 1px solid @inputBorderHighlight;
}

/* Stats plugin */
.js-pstats-data-details dd {
	margin-left: 240px;
}
.js-pstats-data-details dt {
	width: 220px;
}

/* ACL Permission page */
#permissions,
#page-permissions {
	table {
		td {
			vertical-align: middle;
		}
		select {
			margin-bottom: 0;
		}
	}
}

.js-stools-container-bar .btn-primary .caret {
  border-bottom: 4px solid @white;
}

.input-append .add-on, .input-append .btn, .input-append .btn-group > .dropdown-toggle, .input-prepend .add-on, .input-prepend .btn, .input-prepend .btn-group > .dropdown-toggle {
  -webkit-border-radius: 0 @inputBorderRadius @inputBorderRadius 0;
  -moz-border-radius: 0 @inputBorderRadius @inputBorderRadius 0;
  border-radius: 0 @inputBorderRadius @inputBorderRadius 0;
}

/* Removes Text Shadows */
.alert,
.alert-options,
.badge,
.breadcrumb > li,
.close,
.input-append .add-on,
.input-prepend .add-on,
.label,
.nav-header,
.nav-list .nav-header,
.nav-list > .active > a,
.nav-list > .active > a:focus,
.nav-list > .active > a:hover,
.nav-list > li > a,
.nav-tabs.nav-dark,
.navbar .brand,
.navbar .nav > li > a,
.navbar-inverse .brand,
.navbar-inverse .nav > li > a,
.navbar-inverse .navbar-search .search-query.focused,
.navbar-inverse .navbar-search .search-query:focus,
.progress .bar,
.subhead {
  text-shadow: none;
}

/* Popover minimum height - overwrite bootstrap default */
.popover-content {
    min-height: 33px;
}

/* Overrid font-weight 200 */
.lead, .navbar .brand, .hero-unit, .hero-unit .lead {
	font-weight: 400;
}

/* Stick permissions tab */
@media (min-width: @xl) {
	#permissions {
		.tab-content {
			position: sticky;
			top: 90px;
		}
	}
}
templates/isis/less/blocks/_login.less000060400000002401152453623440014074 0ustar00// Login

.view-login {
	background-color: @loginBackground;
	padding-top: 0;

	.container {
		width: 300px;
		position: absolute;
		top: 50%;
		left: 50%;
		margin-top: -206px;
		margin-left: -150px;
	}
	.navbar-fixed-bottom {
		padding-left: 20px;
		padding-right: 20px;
		text-align: center;
	}
	.navbar-fixed-bottom,
	.navbar-fixed-bottom a {
		color: #FCFCFC;
	}
	.navbar-inverse.navbar-fixed-bottom,
	.navbar-inverse.navbar-fixed-bottom a {
		color: @gray;
	}
	.well {
		padding-bottom: 0;
	}
	.login-joomla {
		position: absolute;
		left: 50%;
		height: 24px;
		width: 24px;
		margin-left: -12px;
		font-size: 22px;
	}
	.navbar-fixed-bottom {
		position: absolute;
	}
	.input-medium {
		width: 176px;
	}
	#lang_chzn {
		width: 233px !important;
		max-width: none;
		.chzn-single div {
			width:43px;
		}
	}
	.input-prepend .add-on, .controls .btn-group > .btn {
		margin-left:0;
	}
}

.navbar-inverse {
	color: @textColor;
}

.login {
	.btn-large {
		margin-top: 15px;
	}
	.form-inline .btn-group {
		display:block;
	}
}

@media (max-width: @sm-max) {
	.login .chzn-single {
		width: 222px !important;
	}

	.login .chzn-container,
	.login .chzn-drop {
		width: 230px !important;
	}
}


@media (max-width: @xs-max) {
	.view-login .navbar-fixed-bottom {
		display: none;
	}

}templates/isis/less/blocks/_toolbar.less000060400000005272152453623440014437 0ustar00// Toolbar

/* Subhead */
.subhead {
	background: @wellBackground;
	border-bottom: 1px solid darken(@wellBackground, 7%);
	color: #0C192E;
	text-shadow: 0 1px 0 #FFF;
	margin-bottom: 10px;
	min-height: 51px;
}

.subhead-collapse {
	margin-bottom: 19px;
}

.subhead-collapse.collapse {
	height: auto;
	overflow: visible;
}

.btn-toolbar {
	margin-bottom: 5px;
	.btn-wrapper {
		display: inline-block;
		margin: 0 0 8px 5px;
	}
}

.subhead-fixed {
	position: fixed;
	width: 100%;
	top: 30px;
	z-index: 100;
}
@media (max-width: @md-max) {
	/* Fix ios scrolling inside bootstrap modals */
	body {
		-webkit-overflow-scrolling: touch;
	}
	.subhead {
		margin-left: -20px;
		margin-right: -20px;
		padding-left: 10px;
		padding-right: 10px;
	}
}

.subhead h1 {
	font-size: 17px;
	font-weight: normal;
	margin-left: 10px;
	margin-top: 6px;
}

/* Toolbar */
#toolbar {
	margin-bottom: 2px;
    margin-top: 12px;
	.btn {
	    line-height: 24px;
	    margin-right: 4px;
	    padding: 0 10px;
	}
	.btn-success {
		min-width: 148px;
	}
	.btn-primary,
	.btn-warning,
	.btn-danger,
	.btn-success,
	.btn-info,
	.btn-inverse {
		[class^="icon-"], [class*=" icon-"] {
			background-color: transparent;
			border-right: 0;
			border-left: 0;
			width: 16px;
			margin-left: 0;
			margin-right: 0;
		}
	}
	#toolbar-options, #toolbar-help {
		float: right;
	}
	[class^="icon-"], [class*=" icon-"] {
		background-color: @btnBackgroundHighlight;
	    border-radius: 3px 0 0 3px;
	    border-right: 1px solid @btnBorder;
	    height: auto;
	    line-height: inherit;
	    margin: 0 6px 0 -10px;
	    opacity: 1;
	    text-shadow: none;
	    width: 28px;
	    z-index: -1;
	}
	iframe .btn-group .btn {
		margin-left: -1px !important;
	}
} 
html[dir=rtl] #toolbar #toolbar-options,
html[dir=rtl] #toolbar #toolbar-help {
	float: left;
}

@media (max-width: @md-max) {
	.subhead-fixed {
		position: static;
		width: auto;
	}
}

/* Subhead (toolbar) Collapse Button */
.btn-subhead {
	display: none;
}
@media (min-width: @sm) {
	#filter-bar {
		// Fix for Firefox
		height: 29px;
	}
}

@media (max-width: @sm-max) {
	.navbar .btn {
		margin: 0;
	}

	.btn-subhead {
		display: block;
		margin: 10px 0;
	}

	.subhead-collapse.collapse {
		height: 0;
		overflow: hidden;
	}

	.btn-toolbar .btn-wrapper {
		display: block;
		margin:0px 10px 5px 10px;
	}

	.btn-toolbar .btn-wrapper .btn {
		width: 100% !important;
	}

	.subhead {
		background: none repeat scroll 0 0 transparent;
		border-bottom: 0 solid darken(@wellBackground, 7%);
	}

	#toolbar [class^="icon-"], #toolbar [class*=" icon-"] {
	    background-color: transparent;
	    border-right: medium none;
	    width: 10px;
	}
}

@media (max-width: @xs-max) {
	.view-login .navbar-fixed-bottom {
		display: none;
	}
}
templates/isis/less/blocks/_quickicons.less000060400000000731152453623440015140 0ustar00// Quick-icons

.quick-icons {
	font-size: 14px;
	margin-bottom: 20px;
	.nav-header {
		margin: 12px 0 5px;
		font-size: 13px;
		&:first-child {
			margin: 0 0 5px;
		}
	}
	[class^="icon-"],
	[class*=" icon-"] {
		margin-right: 9px;
		&:before {
			font-size: 16px;
			margin-bottom: 20px;
			line-height: 18px;
		}
	}
}

html[dir=rtl] .quick-icons .nav-list [class^="icon-"], html[dir=rtl] .quick-icons .nav-list [class*=" icon-"] {
	margin-left: 9px;
	margin-right: 0;
}
templates/isis/less/blocks/_header.less000060400000001665152453623440014227 0ustar00// header

.header {
	background-color: @headerBackground;
	border-top: 1px solid rgba(255, 255, 255, 0.2);
	padding: 8px 25px;
}

@media (max-width: @md-max) {
	.header {
		padding: 4px 18px;
		margin-left: -20px;
		margin-right: -20px;
	}
}

.header .navbar-search {
	margin-top: 0;
}

@media (max-width: @lg-max) {
	.header .navbar-search {
		border-top: 0;
		border-bottom: 0;
		.box-shadow(none);
	}
}

/* Logo */
.container-logo {
	float: right;
	text-align: right;
}

.logo {
    width: auto;
    max-width: 100%;
    max-height: 36px;
    height: auto;
}

/* Page Title */
.page-title {
	color: white;
	font-weight: normal;
	font-size: 20px;
	line-height: 36px;
	margin: 0;
	[class^="icon-"],
	[class*=" icon-"] {
		margin-right: 16px;
	}
}

@media (max-width: @md-max) {
	.container-logo {
		display: none;
	}

	.page-title {
		font-size: 18px;
		line-height: 28px;
		[class^="icon-"],
		[class*=" icon-"] {
			margin-right: 10px;
		}
	}
}
templates/isis/less/blocks/_chzn-override.less000060400000013243152453623440015551 0ustar00.chzn-container {
    .chzn-drop {
        border-radius: 0 0 3px 3px;
    }
}

// Fluid width
.control-group .chzn-container {
    max-width: 100%;
    .chzn-choices li.search-field,
    .chzn-choices li.search-field input { // Fix for #13594
        width: 100% !important; 
    }
}

.chzn-container-single {
    .chzn-single {
        background-color: @white;
        background-clip: inherit;
        background-image: none;
        border: 1px solid @inputBorder;
        border: 1px solid rgba(0, 0, 0, 0.2);
        border-radius: 3px;
        box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.05);
        height: auto;
        line-height: 26px;
        div {
            background-color: @btnBackground;
            border-left: 1px solid @inputBorder;
            bottom: 0;
            height: auto;
            text-align: center;
            width: 28px;
            b {
                background-image: none;
                display: inline-block;
                &:after {
                    content: '\E011';
                    font-family: IcoMoon;
                }
            }
        }       
        abbr {
            background: none;
            right: 36px;
            top: 0;
            &:before {
                font-family: IcoMoon;
                content: '\0049';
                font-size: 10px;
                line-height: 26px;
            }
            &:hover {
                color: #000;
            }
        }
    }
    .chzn-search {
        &:after {
            content: '\0053';
            font-family: IcoMoon;
            position: relative;
            right: 20px;
            top: 2px;
        }
        input[type="text"] {
            background: none;
            border-radius: @inputBorderRadius;
            border: 1px solid @inputBorder;
            box-shadow: none;
            height: 25px;
            &:focus {
                border-color: @inputBorderHighlight;
            }
        }
    } 
    .chzn-drop {
        background-clip: padding-box;
        border-color: @inputBorderHighlight;
        border-radius: 0 0 3px 3px;
    }
}
.chzn-container-active {
    .chzn-single {
        color: @inputBorderHighlight;
    }
    &.chzn-with-drop {
        .chzn-single {
            background-image: none;
            border: 1px solid @inputBorderHighlight;
            border-bottom-left-radius: 0;
            border-bottom-right-radius: 0;
            div {
                background-color: @btnBackground;
                border-bottom: 1px solid @inputBorder;
                border-bottom-left-radius: @inputBorderRadius;
                border-left: 1px solid @inputBorder;
                b {
                    &:after {
                        content: '\E00F';
                        font-family: IcoMoon;
                    }
                }
            }
        }
    }
    &.chzn-container-multi {
        .chzn-choices {
            border: 1px solid @inputBorderHighlight;
            box-shadow: none;
        }
    }
}
.chzn-container .chzn-results {
    background-color: @white;
    border-radius: 0 0 @inputBorderRadius @inputBorderRadius;
    margin: 0;
    padding: 0;
    li.highlighted {
        background-color: @inputBorderHighlight;
        background-image: none;
    }
}
.chzn-color[rel="value_"] div {
    background-color: @btnBackground;
    border-left: 1px solid @inputBorder;
}
.chzn-color-state.chzn-single,
.chzn-color.chzn-single[rel="value_0"],
.chzn-color.chzn-single[rel="value_1"],
.chzn-color-state.chzn-single[rel="value_-1"],
.chzn-color-state.chzn-single[rel="value_-2"],
.chzn-color.chzn-single[rel="value_hide"],
.chzn-color.chzn-single[rel="value_show_no_link"],
.chzn-color.chzn-single[rel="value_show_with_link"] {
    div {
        background-color: transparent !important;
        border: none !important;
    }
} 
.chzn-container-active .chzn-choices {
    border: 1px solid @inputBorderHighlight;
}
.chzn-container-multi {
    .chzn-choices {
        background-image: none;
        border-radius: @inputBorderRadius;
        border: 1px solid @inputBorder;
        li.search-choice {
            background-color: @inputBorderHighlight;
            background-image: none;
            border: 0;
            box-shadow: none;
            color: #fff;
            line-height: 20px;
            padding: 0 7px;
            .search-choice-close {
                color: #f5f5f5;
                display: inline-block;
                margin-left: 5px;
                position: relative;
                top: 0;
                left: 0;
                background-image: none;
                font-size: inherit;
                &:hover {
                    text-decoration: none;
                }
                &:before {
                    font-family: IcoMoon;
                    content: '\004A';
                    position: relative;
                    right: 1px;
                    top: 0;
                }
            }
        }
    }
}
.js-stools .js-stools-container-bar .js-stools-field-filter .chzn-container {
    margin: 1px 0;
    padding: 0 !important;
}

/* Chosen color styles */
.chzn-color.chzn-single[rel="value_1"],
.chzn-color-reverse.chzn-single[rel="value_0"],
.chzn-color-state.chzn-single[rel="value_1"],
.chzn-color.chzn-single[rel="value_show_no_link"],
.chzn-color.chzn-single[rel="value_show_with_link"] {
	.buttonBackground(@btnSuccessBackground, @btnSuccessBackgroundHighlight);
	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
	color: #ffffff;
}

.chzn-color-state.chzn-single[rel="value_0"],
.chzn-color-state.chzn-single[rel="value_-2"] {
    .buttonBackground(@btnDangerBackground, @btnDangerBackgroundHighlight);
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
	color: #ffffff;
}
templates/isis/less/blocks/_media.less000060400000011770152453623440014054 0ustar00// Media 

/* Spacing below buttons in media manager */
.ventral-space{
	margin-bottom: 5px;
}

/* Media Manager folder icon override */
ul.manager .height-50 .icon-folder-2 {
	height: 35px;
	width: 35px;
	line-height: 35px;
	font-size: 30px;
}

#imageForm {
	.well {
		margin-bottom: 5px;
	}
}
.thumbnails-media {
	@thumbSize:100px;
	.thumbnail {
		background-color: #f4f4f4;
		border-radius: @inputBorderRadius;
		border: 0;
		box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) inset;
		padding: 0px;
		height: @thumbSize;
		width: @thumbSize;
		margin: 8px;
		position: relative;
		text-align: center;
		overflow: hidden;
		.close {
			background-color: #ccc;
			border-left: 1px solid rgba(0, 0, 0, 0.1);
		    height: 22px;
		    line-height: 22px;
		    opacity: 0.3;
		    text-align: center;
		    width: 22px;
		    top: 0;
		    right: 0;
		    &:hover {
		    	background-color: #bbb;
		    }
		}
		*, *:before {
			-webkit-transition: all 0.2s ease;
			transition: all 0.2s ease;
			-webkit-box-sizing: border-box;
			box-sizing: border-box;
	    }
	    input[type="radio"], input[type="checkbox"] {
			margin: 0;
			opacity: 0.55;
			position: absolute;
			top: 5px;
			left: 5px;
		}
		.controls, .imginfoBorder {
			display: none;
		}
	}
	.imgThumb {
	    position: relative;
	    z-index: 1;
	    width:100%;
	    display: inline-block;
	    input {
	    	display: none;
	    }
	    label, .imgThumbInside {
	    	display: block;
	    	line-height: @thumbSize;
	    	position: relative;
	    	width: 100%;
	    	border-radius: @inputBorderRadius;
	    	overflow: hidden;
	    	&:before {
		  		font-family: "IcoMoon";
    			font-style: normal;
    			content: 'G';
    			position: absolute;
    			top: 0;
    			right: 0;
    			background-color: @btnSuccessBackground;
    			color: #fff;
    			line-height: 26px;
    			width: 26px;
				-webkit-transform: scale(0.5);
				transform: scale(0.5);
				opacity: 0;
				border-color: rgba(0, 0, 0, 0.2);
				box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
				border-radius: 0 @inputBorderRadius;
	    	}
	    }
	    img {
	    	width: auto;
	    }
	}
	.selected, .imgInput {
		:checked + label, .imgThumbInside {
		    background-color: #ddd;
			&:before {
				-webkit-transform: scale(1);
				transform: scale(1);
				opacity: 1;
			}
			&:after {
				position: absolute;
				top: 0;
				left: 0;
				right: 0;
				bottom: 0;
				content: '';
				border: 3px solid @btnSuccessBackground;
				border-radius: 5px;
			}
		}
	}
	.imgDelete a.close, .imgPreview a {
	    padding: 0;
	    position: absolute;
	    left: 0;
	    z-index: 1;
	    height: 26px;
	    width: 26px;
	}
	.imgPreview a {
		width: 100%;
	}
	.imgDelete a.close {
	    background-color: @btnDangerBackground;
	    border-color: @btnDangerBackground rgba(0, 0, 0, 0.2) rgba(0, 0, 0, 0.2) @btnDangerBackground;
	    top: 0;
	    line-height: 28px;
	    font-size: 12px;
	    padding-left: 1px;
	    color: #fff;
		border-bottom-right-radius: @inputBorderRadius;
		border-top-left-radius: @inputBorderRadius;
		z-index: 10;
		opacity: 0;
		-webkit-transform: scale(0.5);
		transform: scale(0.5);
		&:hover {
			background-color: darken(@btnDangerBackground, 15%);
		}
	}
	.thumbnail:hover .imgDelete a.close {
		opacity: 1;
		-webkit-transform: scale(1);
		transform: scale(1);
	}
	.imgPreview a, .imgDetails {
		position: absolute;
		left:0;
		text-align: left;
	    background-color: #fff;
	    border-color: rgba(0, 0, 0, 0.2);
	    bottom: 0;
	    line-height: 26px;
		border: 1px solid rgba(0, 0, 0, 0.1);
		border-width: 1px; 
		border-radius: 0 @inputBorderRadius 0 0;
		z-index: 1;
		&:hover {
			background-color: #eee;
		}
	}
	.imgDetails {
		padding: 0 5px;
		line-height: 20px;
		color: #555;
	}
	.imgFolder {
		span {
			line-height: 90px;
			font-size: 38px;
			margin: 0;
			width: auto;
		}
	}
	.imgFolder + .imgDetails {
		color: inherit;
	}
}

// Media Manager
.com_media {
	.media a + a {
		margin-left: -1px;
	}
	.tree-holder {
		padding: 0 15px;
	}
}
#folderframe.thumbnail {
	border: 0;
	box-shadow: none;
	padding: 0;
}
#mediamanager-form {
	margin: 0 -10px;
	overflow-x: hidden;
	> .muted {
		padding: 0px;
	}
	.checkbox {
		padding-left: 30px;
		margin-bottom: 15px;
		input {
			margin-top: 3px;
		}
	}
	.thumbnails {
		margin: 0 -8px;
		overflow-x: hidden;
		.thumbnail {
			height: 120px;
			width: 120px;
			margin: 8px
		}
		.imgThumb label, .imgTotal {
			line-height: 120px;
		}
	}
	.icon-search::before {
		padding-right: 5px;
		padding-left: 1px;
	}
	.height-50 {
	    background-color: #fafafa;
	    height: 77px;
	    position: relative;
	    z-index: 1;
	    width:100%;
	    display: inline-block;
	    a, .icon-folder-2 {
	    	display: inline-block;
	    	line-height: 75px;
	    	margin-top: -1px;
	    }
	    a {
	    	&:after {
			    bottom: 0;
			    box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.08) inset;
			    content: "";
			    display: block;
			    left: 0;
			    overflow: hidden;
			    position: absolute;
			    right: 0;
			    top: 0;
			}
	    }
	    .icon-folder-2 {
	    	font-size: 40px;
	    }
	}
}

.uploadform {
	margin-top: 20px;
}
templates/isis/less/blocks/_treeselect.less000060400000002421152453623440015125 0ustar00// Tree Select 

ul.treeselect,
ul.treeselect li {
	margin: 0;
	padding: 0;
}

ul.treeselect {
	margin-top: 8px;
}

ul.treeselect li {
	padding: 2px 10px 2px;
	list-style: none;
}

ul.treeselect i.treeselect-toggle {
	line-height: 18px;
}

ul.treeselect label {
	font-size: 1em;
	margin-left: 8px;
}

ul.treeselect label.nav-header {
	padding: 0;
}

ul.treeselect input {
	margin: 2px 0 0 8px;
}

ul.treeselect .treeselect-menu {
	margin: 0 6px;
}

ul.treeselect ul.dropdown-menu {
	margin: 0;
}

ul.treeselect ul.dropdown-menu li {
	padding: 0 5px;
	border: none;
}

.tree-holder {
	.folder-url, .file {
		position: relative;
		background-color: #fefefe;
		margin-bottom: 4px;
    	padding: 0 10px;
		line-height: 32px;
		border: 1px solid rgba(0, 0, 0, 0.08);
		
	}
	.folder-url, .folder-url:hover, .folder-url:focus {
		font-weight: bold;
		background-color: #f5f5f5;
		color: @linkColor;
	}
	.active {
		background-color: @linkColor;
		color: #fff;
		box-shadow: -3px 0 0 #36a2ff !important;
		&.folder-url {
			background-color: #f5f5f5;
			color: @linkColor;
		}
		&.file:hover {
			background-color: #3071a9;
		}
	}
	ul {
		ul {
			box-shadow: -3px 0 0 rgba(0, 0, 0, 0.08);
			padding-right: 0;
			.folder-url, .file {
				box-shadow: -3px 0 0 @linkColor;
				border-left: 0;
			}
		}
	}
}
templates/isis/less/blocks/_navbar.less000060400000011101152453623440014232 0ustar00// Navbar

body .navbar,
body .navbar-fixed-top {
	margin-bottom: 0;
}

.navbar-inner {
	min-height: 0;
	background: @navbarBackground;
	background-image: none;
	filter: none;
	.container-fluid {
		padding-left: 10px;
		padding-right: 10px;
		font-size: 15px;
	}
}

.navbar-inverse {
	.navbar-inner {
		background: @navbarInverseBackground;
		background-image: none;
		filter: none;
	}
}

.navbar {
	.navbar-text {
		line-height: 30px;
	}
	.admin-logo {
		float: left;
		padding: 7px 12px 0px 15px;
		font-size: 16px;
		color: @gray;
		&:hover {
			color: @grayDark;
		}
		.navbar-inverse& {
			color: #d9d9d9;
			&:hover {
				color: #ffffff;
			}
		}
	}
	.brand {
		float: right;
		display: block;
		padding: 6px 10px;
		margin-left: -20px;
		font-size: inherit;
		font-weight: normal;
		&:hover,
		&:focus {
			text-decoration: none;
		}
	}
	.nav > li > a {
		padding: 6px 10px;
		&:hover {
			color: white;
		}
		&:hover span.carot {
			border-bottom-color: #fff;
    		border-top-color: #fff;
		}
	}
	.dropdown-menu,
	.nav-user {
		font-size: 13px;
	}
	.nav-user .dropdown-menu li span {
		padding-left: 10px;
	}
	.nav > li ul {
		overflow-y: auto;
		overflow-x: hidden;
		-webkit-overflow-scrolling: touch;
		-moz-overflow-scrolling: touch;
		-ms-overflow-scrolling: touch;
		-o-overflow-scrolling: touch;
		overflow-scrolling: touch;
		height: auto;
		max-height: 500px;
		margin: 0;
		&::-webkit-scrollbar {
			-webkit-appearance: none;
			width: 7px;
		}
		&::-webkit-scrollbar-thumb {
			border-radius: 4px;
			background-color: rgba(0,0,0,.5);
			-webkit-box-shadow: 0 0 1px rgba(255,255,255,.5);
		}
	}
	.nav > li > .dropdown-menu:after {
		display: none;
	}
	.nav > .dropdown.open:after {
		content: '';
		display: inline-block;
		border-left: 6px solid transparent;
		border-right: 6px solid transparent;
		border-bottom: 6px solid #fff;
		position: absolute;
		top: 25px;
		left: 10px;
		z-index: 1001;
	}
	.empty-nav {
		display: none;
	}
}

.navbar-fixed-top,
.navbar-static-top {
	.navbar-inner {
		.box-shadow(none);
	}
}
.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus, .dropdown-submenu:hover > a, .dropdown-submenu:focus > a {
	background-image: none;
}

// Fixed to bottom
.navbar-fixed-bottom {
	bottom: 0;
	.navbar-inner {
		.box-shadow(none);
	}
}

.navbar .btn-navbar {
	background: #17568c;
	border: 1px solid #0D2242;
	margin-bottom: 2px;
}

@media (max-width: @md-max) {
	.navbar .admin-logo {
		margin-left: 10px;
		padding: 9px 9px 0 9px;
	}
}

/* Search Module */
.navbar-search .search-query {
	background: rgba(255, 255, 255, 0.3);
}

@media (max-width: @lg-max) {
	.navbar {
		.nav {
			font-size: 13px;
			margin: 0 2px 0 0;
			> li {
				> a {
					padding: 6px;
				}
			}
		}
	}
}

@media (max-width: @md-max) {
	.navbar-search.pull-right {
		float: none;
		text-align: center;
	}
}

@media (max-width: 738px) {
	.navbar {
		.brand {
			font-size: 16px;

		}
	}
}

// Navbar
.nav-collapse .nav li a,
.dropdown-menu a {
	background-image: none;
}

.nav-collapse .dropdown-menu > li {
	img {
		max-width: none;
	}
}

@media (max-width: @navbarCollapseWidth) {
	.navbar-fixed-top .navbar-inner,
	.navbar-fixed-top .navbar-inner .container-fluid {
		padding: 0;
	}

	.navbar .brand {
		margin-top: 2px;
		float: none;
		text-align: center;
	}

	.navbar .btn-navbar {
		margin-top: 3px;
		margin-right: 3px;
		margin-bottom: 3px;
	}

	.nav-collapse .nav .nav-header {
		color: @white;
	}

	.nav-collapse .nav,
	.navbar .nav-collapse .nav.pull-right {
		margin: 0;
	}

	.nav-collapse .dropdown-menu {
		margin: 0;
	}

	.nav-collapse .dropdown-menu > li > span {
		display: block;
		padding: 4px 15px;
	}

	.navbar-inverse .nav-collapse .dropdown-menu > li > span {
		color: @navbarInverseLinkColor;
	}

	.nav-collapse .nav > li > a.dropdown-toggle {
		background-color: rgba(255, 255, 255, 0.07);
		font-size: 12px;
		font-weight: bold;
		color: @grayLighter;
		text-transform: uppercase;
		padding-left: 15px;
	}

	.nav-collapse .nav li a {
		margin-bottom: 0;
		border-top: 1px solid rgba(255, 255, 255, 0.25);
		border-bottom: 1px solid rgba(0, 0, 0, 0.5);
	}

	.nav-collapse .nav li ul li ul.dropdown-menu,
	.nav-collapse .nav li ul li:hover ul.dropdown-menu,
	.nav-collapse .caret {
		display: none !important;
	}

	.nav-collapse .nav > li > a,
	.nav-collapse .dropdown-menu a {
		font-size: 15px;
		font-weight: normal;
		color: @white;
		.border-radius(0);
	}

	.navbar .nav-collapse .nav > li > .dropdown-menu::before,
	.navbar .nav-collapse .nav > li > .dropdown-menu::after,
	.navbar .nav-collapse .dropdown-submenu > a::after {
		display: none;
	}

	.nav-collapse .dropdown-menu li + li a {
		margin-bottom: 0;
	}
}templates/isis/less/blocks/_modals.less000060400000001417152453623440014251 0ustar00// Modals

body.modal-open {
	-ms-overflow-style: none;
}

.modal-header {
  padding: 0 20px;
  text-align: left;
  h3 {
  	font-weight: normal;
  	line-height: 50px;
  }
  .close {
    width: 50px;
    margin-top: 0;
    margin-right: -15px;
    font-size: 2rem;
    line-height: 50px;
    border-left: 1px solid #ccc;
  }
}

.modal-body {
  padding: 0;
  width: 100%;
  height: auto;
  max-height: none;
  .container-fluid {
    padding-top: 15px;
    padding-bottom: 15px;
  }
}

.modal-footer {
	clear: both;
}

.contentpane {
  padding: 10px;
  height: auto
}

@media (min-width: @md) {
	.row-fluid .modal-batch [class*="span"] {
		margin-left: 0;
	}
}

// Component pop-up
.container-popup {
	padding: 10px;
}

// Media modal
.field-media-wrapper iframe {
  max-height: 75vh;
}templates/isis/less/blocks/_status.less000060400000001500152453623440014306 0ustar00// Status

#status {
	background: #ebebeb;
	border-top: 1px solid #dedede;
	padding: 4px 10px;
	.box-shadow(~"0 0 3px rgba(0, 0, 0, 0.08)");
	color: #626262;

	.btn-group {
		margin: 0;
	}
	.btn-group.separator:after {
		content: ' ';
		display: block;
		float: left;
		background: #ADADAD;
		margin: 0 10px;
		height: 15px;
		width: 1px;
	}
	.btn-toolbar, p {
		margin: 0px;
	}
	.btn-toolbar, .btn-group {
		font-size: 12px;
	}
	a {
		color: #626262;
	}
	.badge {
		margin-right: .25em;
	}
}
/* Status Module in top position */
#status.status-top {
	background: @headerBackground;
	.box-shadow(~"0px 1px 0px rgba(255, 255, 255, 0.2) inset, 0px -1px 0px rgba(0, 0, 0, 0.3) inset, 0px -1px 0px rgba(0, 0, 0, 0.3)");
	border-top: 0;
	color: @navbarInverseText;
	padding: 2px 20px 6px 20px;

	a {
		color: @navbarInverseLinkColor;
	}
}templates/isis/less/blocks/_editors.less000060400000000145152453623440014440 0ustar00// Editors

.CodeMirror {
	height: calc(~"100vh - 400px");
	min-height: 400px;
	max-height: 800px;
}
templates/isis/less/blocks/_sidebar.less000060400000004476152453623440014413 0ustar00// Sidebar

.sidebar-nav .nav-list {
	padding-left: 25px;
	padding-right: 25px;
}

.sidebar-nav .nav-list > li > a {
	color: #555;
	padding: 3px 25px;
	margin-left: -26px;
	margin-right: -26px;
}

.sidebar-nav .nav-list > li.active > a {
	color: #fff;
	margin-right: -26px;
}
.sidebar-nav .nav-list > li > a:focus,
.sidebar-nav .nav-list > li > a:hover {
	text-decoration: none;
	color: #fff;
	background-color: #2d6ca2;
    text-shadow: none;
}

/* For collapsible sidebar */
.j-sidebar-container {
	position: absolute;
	display: block;
	left: -16.5%;
	width: 16.5%;
	margin: -18px 0 0 -1px;
	padding-top: 28px;
	padding-bottom: 40px;
	clear: both;
	background-color: @wellBackground;
	border-bottom: 1px solid darken(@wellBackground, 7%);
	border-right: 1px solid darken(@wellBackground, 7%);
	.border-radius(0 0 @baseBorderRadius 0);
	&.j-sidebar-hidden {
		left: -16.5%;
	}
	&.j-sidebar-visible {
		left: 0;
	}
	.filter-select {
		padding: 0 14px;
	}
}

.j-toggle-sidebar-header {
	h3 {
		font-weight: normal;
		padding: 0 15px;
	}
}

.j-toggle-button-wrapper {
	position: absolute;
	display: block;
	top: 7px;
	padding: 0;
	&.j-toggle-hidden {
		right: -24px;
	}
	&.j-toggle-visible {
		right: 7px;
	}
}

.j-toggle-sidebar-button {
	font-size: 16px;
	color: @linkColor;
	text-decoration: none;
	cursor: pointer;
	&:hover {
		color: @linkColorHover;
	}
}

#system-message-container,
#j-main-container {
	padding: 0 0 0 5px;
	min-height: 0;
}

#system-message-container.j-toggle-main,
#j-main-container.j-toggle-main,
#system-debug.j-toggle-main {
	float: right;
}

@media (min-width: @md) {
	.j-toggle-transition {
		.transition(all 0.3s ease);
	}
}

@media (max-width: @lg-max) {
	.j-toggle-button-wrapper.j-toggle-hidden {
		right: -20px;
	}
}

@media (max-width: @md-max) {
	.j-sidebar-container {
		position: relative;
		width: 100%;
		margin: 0 0 20px 0;
		padding: 0;
		background: transparent;
		border-right: 0;
		border-bottom: 0;
	}

	.j-sidebar-container.j-sidebar-hidden {
		margin-left: 16.5%;
	}

	.j-sidebar-container.j-sidebar-visible {
		margin-left: 0;
	}

	.j-toggle-sidebar-header,
	.j-toggle-button-wrapper {
		display: none;
	}

	.view-login {
		select {
			width: 232px;
		}
	}
}

@media (max-width: 420px) {
	.j-sidebar-container {
		margin: 0;
	}

	.view-login {
		.input-medium {
			width: 180px;
		}
		select {
			width: 232px
		}
	}
}templates/isis/less/blocks/_global.less000060400000002176152453623440014235 0ustar00// Global

/* Body */
html {
	height: 100%;
}

body {
	height: 100%;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	box-sizing: border-box;
}

a:hover,
a:active,
a:focus {
	outline: none;
}

/* Typography */
.small {
	font-size: 11px;
}

.row-even .small,
.row-odd .small,
.row-even .small a,
.row-odd .small a {
	color: #888;
}

/* Page Title in Content */
.content-title {
	font-size: 24px;
	font-weight: normal;
	line-height: 26px;
	margin-top: 0;
}

/* Content */
.well .page-header {
	margin: -10px 0 18px 0;
	padding-bottom: 5px;
}

.well .module-title.nav-header {
	padding: 0 0 7px;
	margin: 0;
	font-size: 13px;
}

.well .row-even p,
.well .row-odd p {
	margin-bottom: 0;
}

/* Headings */

h1, h2, h3, h4, h5, h6 {
	margin: (@baseLineHeight / 1.5) 0;
}

h1 {
	font-size: 26px;
	line-height: 28px;
}

h2 {
	font-size: 22px;
	line-height: 24px;
}

h3 {
	font-size: 18px;
	line-height: 20px;
}

h4 {
	font-size: 14px;
	line-height: 16px;
}

h5 {
	font-size: 13px;
	line-height: 15px;
}

h6 {
	font-size: 12px;
	line-height: 14px;
}

.truncate {
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
templates/isis/less/icomoon.less000060400000002077152453623440013024 0ustar00@font-face {
	font-family: 'IcoMoon';
	src: url('../../../../media/jui/fonts/IcoMoon.eot');
	src: url('../../../../media/jui/fonts/IcoMoon.eot?#iefix') format('embedded-opentype'),
	url('../../../../media/jui/fonts/IcoMoon.woff') format('woff'),
	url('../../../../media/jui/fonts/IcoMoon.ttf') format('truetype'),
	url('../../../../media/jui/fonts/IcoMoon.svg#IcoMoon') format('svg');
	font-weight: normal;
	font-style: normal;
}
@import "../../../../media/jui/less/icomoon.less";
.icon-edit:before {
	color: @btnInfoBackgroundHighlight;
}
.icon-publish:before,
.icon-save:before,
.icon-ok:before,
.icon-save-new:before,
.icon-save-copy:before,
.btn-toolbar .icon-copy:before {
	color: @btnSuccessBackgroundHighlight;
}
.icon-unpublish:before,
.icon-not-ok:before,
.icon-eye-close:before,
.icon-ban-circle:before,
.icon-minus-sign:before,
.btn-toolbar .icon-cancel:before {
	color: @btnDangerBackgroundHighlight;
}
.icon-featured:before,
.icon-default:before,
.icon-expired:before,
.icon-pending:before {
	color: @btnWarningBackgroundHighlight;
}
.icon-back:before {
	content: "\e008";
}templates/isis/less/template.less000060400000007047152453623440013176 0ustar00// CSS Reset
@import "../../../../media/jui/less/reset.less";
// Core variables and mixins
@import "variables.less";
// Custom for this template
@import "bootstrap/mixins.less";
// Grid system and page structure
@import "../../../../media/jui/less/scaffolding.less";
@import "../../../../media/jui/less/grid.less";
@import "../../../../media/jui/less/layouts.less";
// Base CSS
@import "../../../../media/jui/less/type.less";
@import "../../../../media/jui/less/code.less";
@import "../../../../media/jui/less/forms.less";
@import "../../../../media/jui/less/tables.less";
// Components: common
// @import "../../../../media/jui/less/sprites.less";
@import "../../../../media/jui/less/dropdowns.less";
@import "bootstrap/wells.less";
@import "../../../../media/jui/less/component-animations.less";
@import "../../../../media/jui/less/close.less";
// Components: Buttons & Alerts
@import "bootstrap/buttons.less";
@import "bootstrap/button-groups.less";
@import "../../../../media/jui/less/alerts.less";
// Note: alerts share common CSS with buttons and thus have styles in buttons.less
// Components: Nav
@import "../../../../media/jui/less/navs.less";
@import "../../../../media/jui/less/navbar.less";
@import "../../../../media/jui/less/breadcrumbs.less";
@import "../../../../media/jui/less/pagination.less";
@import "../../../../media/jui/less/pager.less";
// Components: Popovers
@import "../../../../media/jui/less/modals.less";
@import "../../../../media/jui/less/tooltip.less";
@import "../../../../media/jui/less/popovers.less";
// Components: Misc
@import "../../../../media/jui/less/thumbnails.less";
@import "../../../../media/jui/less/media.less";
@import "../../../../media/jui/less/labels-badges.less";
@import "../../../../media/jui/less/progress-bars.less";
@import "../../../../media/jui/less/accordion.less";
@import "../../../../media/jui/less/carousel.less";
@import "../../../../media/jui/less/hero-unit.less";
// Utility classes
@import "../../../../media/jui/less/utilities.less";
// RESPONSIVE CLASSES
// ------------------
@import "../../../../media/jui/less/responsive-utilities.less";
// MEDIA QUERIES
// ------------------
// Phones to portrait tablets and narrow desktops
@import "../../../../media/jui/less/responsive-767px-max.less";
// Tablets to regular desktops
@import "bootstrap/responsive-768px-979px.less";
// Large desktops
@import "bootstrap/responsive-1200px-min.less";
// RESPONSIVE NAVBAR
// ------------------
// From 979px and below, show a button to toggle navbar contents
@import "../../../../media/jui/less/responsive-navbar.less";
// Extended for JUI
@import "../../../../media/jui/less/bootstrap-extended.less";
// Has to be last to override when necessary
// div.modal (instead of .modal)
@import "../../../../media/jui/less/modals.joomla.less";
@import "../../../../media/jui/less/responsive-767px-max.joomla.less";
// Icon Font
@import "icomoon.less";

// Blocks
@import "blocks/_global.less";
@import "blocks/_chzn-override.less";
@import "blocks/_editors.less";
@import "blocks/_forms.less";
@import "blocks/_header.less";
@import "blocks/_login.less";
@import "blocks/_media.less";
@import "blocks/_modals.less";
@import "blocks/_navbar.less";
@import "blocks/_quickicons.less";
@import "blocks/_sidebar.less";
@import "blocks/_status.less";
@import "blocks/_tables.less";
@import "blocks/_toolbar.less";
@import "blocks/_treeselect.less";
@import "blocks/_utility-classes.less";
@import "blocks/_custom.less";

// Pages
@import "pages/_com_cpanel.less";
@import "pages/_com_postinstall.less";
@import "pages/_com_privacy.less";
@import "pages/_com_templates.less";
templates/isis/less/bootstrap/responsive-768px-979px.less000060400000010254152453623440017357 0ustar00//
// Responsive: Tablet to desktop
// --------------------------------------------------


@media (min-width: 768px) and (max-width: 979px) {

  // Fixed grid
  #grid > .core(@gridColumnWidth768, @gridGutterWidth768);

  // Fluid grid
   .row-fluid {
    width: 100%;
    *zoom: 1;
  }
  .row-fluid:before,
  .row-fluid:after {
    display: table;
    content: "";
    line-height: 0;
  }
  .row-fluid:after {
    clear: both;
  }
  .row-fluid [class*="span"] {
    display: block;
    width: 100%;
    min-height: 28px;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    float: left;
    margin-left: 2.76243094%;
    *margin-left: 2.70923945%;
  }
  .row-fluid [class*="span"]:first-child {
    margin-left: 0;
  }
  .row-fluid .controls-row [class*="span"] + [class*="span"] {
    margin-left: 2.76243094%;
  }
  .row-fluid .span12 {
    width: 100%;
    *width: 99.94680851%;
  }
  .row-fluid .span11 {
    width: 91.43646409%;
    *width: 91.3832726%;
  }
  .row-fluid .span10 {
    width: 82.87292818%;
    *width: 82.81973669%;
  }
  .row-fluid .span9 {
    width: 74.30939227%;
    *width: 74.25620078%;
  }
  .row-fluid .span8 {
    width: 65.74585635%;
    *width: 65.69266486%;
  }
  .row-fluid .span7 {
    width: 57.18232044%;
    *width: 57.12912895%;
  }
  .row-fluid .span6 {
    width: 48.61878453%;
    *width: 48.56559304%;
  }
  .row-fluid .span5 {
    width: 40.05524862%;
    *width: 40.00205713%;
  }
  .row-fluid .span4 {
    width: 31.49171271%;
    *width: 31.43852122%;
  }
  .row-fluid .span3 {
    width: 22.9281768%;
    *width: 22.87498531%;
  }
  .row-fluid .span2 {
    width: 14.36464088%;
    *width: 14.31144939%;
  }
  .row-fluid .span1 {
    width: 5.80110497%;
    *width: 5.74791348%;
  }
  .row-fluid .offset12 {
    margin-left: 105.52486188%;
    *margin-left: 105.4184789%;
  }
  .row-fluid .offset12:first-child {
    margin-left: 102.76243094%;
    *margin-left: 102.65604796%;
  }
  .row-fluid .offset11 {
    margin-left: 96.96132597%;
    *margin-left: 96.85494299%;
  }
  .row-fluid .offset11:first-child {
    margin-left: 94.19889503%;
    *margin-left: 94.09251205%;
  }
  .row-fluid .offset10 {
    margin-left: 88.39779006%;
    *margin-left: 88.29140708%;
  }
  .row-fluid .offset10:first-child {
    margin-left: 85.63535912%;
    *margin-left: 85.52897614%;
  }
  .row-fluid .offset9 {
    margin-left: 79.83425414%;
    *margin-left: 79.72787116%;
  }
  .row-fluid .offset9:first-child {
    margin-left: 77.0718232%;
    *margin-left: 76.96544023%;
  }
  .row-fluid .offset8 {
    margin-left: 71.27071823%;
    *margin-left: 71.16433525%;
  }
  .row-fluid .offset8:first-child {
    margin-left: 68.50828729%;
    *margin-left: 68.40190431%;
  }
  .row-fluid .offset7 {
    margin-left: 62.70718232%;
    *margin-left: 62.60079934%;
  }
  .row-fluid .offset7:first-child {
    margin-left: 59.94475138%;
    *margin-left: 59.8383684%;
  }
  .row-fluid .offset6 {
    margin-left: 54.14364641%;
    *margin-left: 54.03726343%;
  }
  .row-fluid .offset6:first-child {
    margin-left: 51.38121547%;
    *margin-left: 51.27483249%;
  }
  .row-fluid .offset5 {
    margin-left: 45.5801105%;
    *margin-left: 45.47372752%;
  }
  .row-fluid .offset5:first-child {
    margin-left: 42.81767956%;
    *margin-left: 42.71129658%;
  }
  .row-fluid .offset4 {
    margin-left: 37.01657459%;
    *margin-left: 36.91019161%;
  }
  .row-fluid .offset4:first-child {
    margin-left: 34.25414365%;
    *margin-left: 34.14776067%;
  }
  .row-fluid .offset3 {
    margin-left: 28.45303867%;
    *margin-left: 28.3466557%;
  }
  .row-fluid .offset3:first-child {
    margin-left: 25.69060773%;
    *margin-left: 25.58422476%;
  }
  .row-fluid .offset2 {
    margin-left: 19.88950276%;
    *margin-left: 19.78311978%;
  }
  .row-fluid .offset2:first-child {
    margin-left: 17.12707182%;
    *margin-left: 17.02068884%;
  }
  .row-fluid .offset1 {
    margin-left: 11.32596685%;
    *margin-left: 11.21958387%;
  }
  .row-fluid .offset1:first-child {
    margin-left: 8.56353591%;
    *margin-left: 8.45715293%;
  }

  // Input grid
  #grid > .input(@gridColumnWidth768, @gridGutterWidth768);

  // No need to reset .thumbnails here since it's the same @gridGutterWidth

}
templates/isis/less/bootstrap/button-groups.less000060400000013111152453623440016215 0ustar00//
// Button groups
// --------------------------------------------------


// Make the div behave like a button
.btn-group {
  position: relative;
  display: inline-block;
  .ie7-inline-block();
  font-size: 0; // remove as part 1 of font-size inline-block hack
  vertical-align: middle; // match .btn alignment given font-size hack above
  white-space: nowrap; // prevent buttons from wrapping when in tight spaces (e.g., the table on the tests page)
  .ie7-restore-left-whitespace();
  .btn + .btn {
    margin-left: -1px;
  }
}

// Space out series of button groups
.btn-group + .btn-group {
  margin-left: 5px;
}

// Optional: Group multiple button groups together for a toolbar
.btn-toolbar {
  font-size: 0; // Hack to remove whitespace that results from using inline-block
  margin-top: @baseLineHeight / 2;
  margin-bottom: @baseLineHeight / 2;
  > .btn + .btn,
  > .btn-group + .btn,
  > .btn + .btn-group {
    margin-left: 5px;
  }
}

// Float them, remove border radius, then re-add to first and last elements
.btn-group > .btn {
  position: relative;
  .border-radius(0);
}
.btn-group > .btn + .btn {
  // margin-left: -1px;
}
.btn-group > .btn-micro {
  margin-left: -1px;
}
.btn-group > .btn,
.btn-group > .dropdown-menu,
.btn-group > .popover {
  font-size: @baseFontSize; // redeclare as part 2 of font-size inline-block hack
}

// Reset fonts for other sizes
.btn-group > .btn-mini {
  font-size: @fontSizeMini;
}
.btn-group > .btn-small {
  font-size: @fontSizeSmall;
}
.btn-group > .btn-large {
  font-size: @fontSizeLarge;
}

// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
.btn-group > .btn:first-child {
  margin-left: 0;
  .border-top-left-radius(@baseBorderRadius);
  .border-bottom-left-radius(@baseBorderRadius);
}
// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
.btn-group > .btn:last-child,
.btn-group > .dropdown-toggle {
  .border-top-right-radius(@baseBorderRadius);
  .border-bottom-right-radius(@baseBorderRadius);
}
// Reset corners for large buttons
.btn-group > .btn.large:first-child {
  margin-left: 0;
  .border-top-left-radius(@borderRadiusLarge);
  .border-bottom-left-radius(@borderRadiusLarge);
}
.btn-group > .btn.large:last-child,
.btn-group > .large.dropdown-toggle {
  .border-top-right-radius(@borderRadiusLarge);
  .border-bottom-right-radius(@borderRadiusLarge);
}

// On hover/focus/active, bring the proper btn to front
.btn-group > .btn:hover,
.btn-group > .btn:focus,
.btn-group > .btn:active,
.btn-group > .btn.active {
  z-index: 2;
}

// On active and open, don't show outline
.btn-group .dropdown-toggle:active,
.btn-group.open .dropdown-toggle {
  outline: 0;
}



// Split button dropdowns
// ----------------------

// Give the line between buttons some depth
.btn-group > .btn + .dropdown-toggle {
  padding-left: 8px;
  padding-right: 8px;
  *padding-top: 5px;
  *padding-bottom: 5px;
}
.btn-group > .btn-mini + .dropdown-toggle {
  padding-left: 5px;
  padding-right: 5px;
  *padding-top: 2px;
  *padding-bottom: 2px;
}
.btn-group > .btn-small + .dropdown-toggle {
  *padding-top: 5px;
  *padding-bottom: 4px;
}
.btn-group > .btn-large + .dropdown-toggle {
  padding-left: 12px;
  padding-right: 12px;
  *padding-top: 7px;
  *padding-bottom: 7px;
}

.btn-group.open {

  // The clickable button for toggling the menu
  // Remove the gradient and set the same inset shadow as the :active state
  .dropdown-toggle {
    background-image: none;
  }

  // Keep the hover's background when dropdown is open
  .btn.dropdown-toggle {
    background-color: @btnBackgroundHighlight;
  }
  .btn-primary.dropdown-toggle {
    background-color: @btnPrimaryBackgroundHighlight;
  }
  .btn-warning.dropdown-toggle {
    background-color: @btnWarningBackgroundHighlight;
  }
  .btn-danger.dropdown-toggle {
    background-color: @btnDangerBackgroundHighlight;
  }
  .btn-success.dropdown-toggle {
    background-color: @btnSuccessBackgroundHighlight;
  }
  .btn-info.dropdown-toggle {
    background-color: @btnInfoBackgroundHighlight;
  }
  .btn-inverse.dropdown-toggle {
    background-color: @btnInverseBackgroundHighlight;
  }
}


// Reposition the caret
.btn .caret {
  margin-top: 8px;
  margin-left: 0;
}
// Carets in other button sizes
.btn-large .caret {
  margin-top: 6px;
}
.btn-large .caret {
  border-left-width:  5px;
  border-right-width: 5px;
  border-top-width:   5px;
}
.btn-mini .caret,
.btn-small .caret {
  margin-top: 8px;
}
// Upside down carets for .dropup
.dropup .btn-large .caret {
  border-bottom-width: 5px;
}



// Account for other colors
.btn-primary {
  .caret {
    border-top-color: @linkColorHover;
    border-bottom-color: @linkColorHover;
  }
}
.btn-warning,
.btn-danger,
.btn-info,
.btn-success,
.btn-inverse {
  .caret {
    border-top-color: @white;
    border-bottom-color: @white;
  }
}



// Vertical button groups
// ----------------------

.btn-group-vertical {
  display: inline-block; // makes buttons only take up the width they need
  .ie7-inline-block();
}
.btn-group-vertical > .btn {
  display: block;
  float: none;
  max-width: 100%;
  .border-radius(0);
}
.btn-group-vertical > .btn + .btn {
  margin-left: 0;
  margin-top: -1px;
}
.btn-group-vertical > .btn:first-child {
  .border-radius(@baseBorderRadius @baseBorderRadius 0 0);
}
.btn-group-vertical > .btn:last-child {
  .border-radius(0 0 @baseBorderRadius @baseBorderRadius);
}
.btn-group-vertical > .btn-large:first-child {
  .border-radius(@borderRadiusLarge @borderRadiusLarge 0 0);
}
.btn-group-vertical > .btn-large:last-child {
  .border-radius(0 0 @borderRadiusLarge @borderRadiusLarge);
}

templates/isis/less/bootstrap/mixins.less000060400000055565152453623440014717 0ustar00//
// Mixins
// --------------------------------------------------


// UTILITY MIXINS
// --------------------------------------------------

// Clearfix
// --------
// For clearing floats like a boss h5bp.com/q
.clearfix {
  *zoom: 1;
  &:before,
  &:after {
    display: table;
    content: "";
    // Fixes Opera/contenteditable bug:
    // http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952
    line-height: 0;
  }
  &:after {
    clear: both;
  }
}

// Webkit-style focus
// ------------------
.tab-focus() {
  // Default
  outline: thin dotted #333;
  // Webkit
  outline: 5px auto -webkit-focus-ring-color;
  outline-offset: -2px;
}

// Center-align a block level element
// ----------------------------------
.center-block() {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

// IE7 inline-block
// ----------------
.ie7-inline-block() {
  *display: inline; /* IE7 inline-block hack */
  *zoom: 1;
}

// IE7 likes to collapse whitespace on either side of the inline-block elements.
// Ems because we're attempting to match the width of a space character. Left
// version is for form buttons, which typically come after other elements, and
// right version is for icons, which come before. Applying both is ok, but it will
// mean that space between those elements will be .6em (~2 space characters) in IE7,
// instead of the 1 space in other browsers.
.ie7-restore-left-whitespace() {
  *margin-left: .3em;

  &:first-child {
    *margin-left: 0;
  }
}

.ie7-restore-right-whitespace() {
  *margin-right: .3em;
}

// Sizing shortcuts
// -------------------------
.size(@height, @width) {
  width: @width;
  height: @height;
}
.square(@size) {
  .size(@size, @size);
}

// Placeholder text
// -------------------------
.placeholder(@color: @placeholderText) {
  &:-moz-placeholder {
    color: @color;
  }
  &:-ms-input-placeholder {
    color: @color;
  }
  &::-webkit-input-placeholder {
    color: @color;
  }
}

// Text overflow
// -------------------------
// Requires inline-block or block for proper styling
.text-overflow() {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

// CSS image replacement
// -------------------------
// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
.hide-text {
  font: 0/0 a;
  color: transparent;
  text-shadow: none;
  background-color: transparent;
  border: 0;
}


// FONTS
// --------------------------------------------------

#font {
  #family {
    .serif() {
      font-family: @serifFontFamily;
    }
    .sans-serif() {
      font-family: @sansFontFamily;
    }
    .monospace() {
      font-family: @monoFontFamily;
    }
  }
  .shorthand(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
    font-size: @size;
    font-weight: @weight;
    line-height: @lineHeight;
  }
  .serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
    #font > #family > .serif;
    #font > .shorthand(@size, @weight, @lineHeight);
  }
  .sans-serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
    #font > #family > .sans-serif;
    #font > .shorthand(@size, @weight, @lineHeight);
  }
  .monospace(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
    #font > #family > .monospace;
    #font > .shorthand(@size, @weight, @lineHeight);
  }
}


// FORMS
// --------------------------------------------------

// Block level inputs
.input-block-level {
  display: block;
  width: 100%;
  min-height: @inputHeight; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
  .box-sizing(border-box); // Makes inputs behave like true block-level elements
}



// Mixin for form field states
.formFieldState(@textColor: #555, @borderColor: #ccc, @backgroundColor: #f5f5f5) {
  // Set the text color
  .control-label,
  .help-block,
  .help-inline {
    color: @textColor;
  }
  // Style inputs accordingly
  .checkbox,
  .radio,
  input,
  select,
  textarea {
    color: @textColor;
  }
  input,
  select,
  textarea {
    border-color: @borderColor;
    //.box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
    &:focus {
      border-color: darken(@borderColor, 10%);
      @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%);
      //.box-shadow(@shadow);
    }
  }
  // Give a small background color for input-prepend/-append
  .input-prepend .add-on,
  .input-append .add-on {
    color: @textColor;
    background-color: @backgroundColor;
    border-color: @textColor;
  }
}



// CSS3 PROPERTIES
// --------------------------------------------------

// Border Radius
.border-radius(@radius) {
  -webkit-border-radius: @radius;
     -moz-border-radius: @radius;
          border-radius: @radius;
}

// Single Corner Border Radius
.border-top-left-radius(@radius) {
  -webkit-border-top-left-radius: @radius;
      -moz-border-radius-topleft: @radius;
          border-top-left-radius: @radius;
}
.border-top-right-radius(@radius) {
  -webkit-border-top-right-radius: @radius;
      -moz-border-radius-topright: @radius;
          border-top-right-radius: @radius;
}
.border-bottom-right-radius(@radius) {
  -webkit-border-bottom-right-radius: @radius;
      -moz-border-radius-bottomright: @radius;
          border-bottom-right-radius: @radius;
}
.border-bottom-left-radius(@radius) {
  -webkit-border-bottom-left-radius: @radius;
      -moz-border-radius-bottomleft: @radius;
          border-bottom-left-radius: @radius;
}

// Single Side Border Radius
.border-top-radius(@radius) {
  .border-top-right-radius(@radius);
  .border-top-left-radius(@radius);
}
.border-right-radius(@radius) {
  .border-top-right-radius(@radius);
  .border-bottom-right-radius(@radius);
}
.border-bottom-radius(@radius) {
  .border-bottom-right-radius(@radius);
  .border-bottom-left-radius(@radius);
}
.border-left-radius(@radius) {
  .border-top-left-radius(@radius);
  .border-bottom-left-radius(@radius);
}

// Drop shadows
.box-shadow(@shadow) {
  -webkit-box-shadow: @shadow;
     -moz-box-shadow: @shadow;
          box-shadow: @shadow;
}

// Transitions
.transition(@transition) {
  -webkit-transition: @transition;
     -moz-transition: @transition;
       -o-transition: @transition;
          transition: @transition;
}
.transition-delay(@transition-delay) {
  -webkit-transition-delay: @transition-delay;
     -moz-transition-delay: @transition-delay;
       -o-transition-delay: @transition-delay;
          transition-delay: @transition-delay;
}
.transition-duration(@transition-duration) {
  -webkit-transition-duration: @transition-duration;
     -moz-transition-duration: @transition-duration;
       -o-transition-duration: @transition-duration;
          transition-duration: @transition-duration;
}

// Transformations
.rotate(@degrees) {
  -webkit-transform: rotate(@degrees);
     -moz-transform: rotate(@degrees);
      -ms-transform: rotate(@degrees);
       -o-transform: rotate(@degrees);
          transform: rotate(@degrees);
}
.scale(@ratio) {
  -webkit-transform: scale(@ratio);
     -moz-transform: scale(@ratio);
      -ms-transform: scale(@ratio);
       -o-transform: scale(@ratio);
          transform: scale(@ratio);
}
.translate(@x, @y) {
  -webkit-transform: translate(@x, @y);
     -moz-transform: translate(@x, @y);
      -ms-transform: translate(@x, @y);
       -o-transform: translate(@x, @y);
          transform: translate(@x, @y);
}
.skew(@x, @y) {
  -webkit-transform: skew(@x, @y);
     -moz-transform: skew(@x, @y);
      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twitter/bootstrap/issues/4885
       -o-transform: skew(@x, @y);
          transform: skew(@x, @y);
  -webkit-backface-visibility: hidden; // See https://github.com/twitter/bootstrap/issues/5319
}
.translate3d(@x, @y, @z) {
  -webkit-transform: translate3d(@x, @y, @z);
     -moz-transform: translate3d(@x, @y, @z);
       -o-transform: translate3d(@x, @y, @z);
          transform: translate3d(@x, @y, @z);
}

// Backface visibility
// Prevent browsers from flickering when using CSS 3D transforms.
// Default value is `visible`, but can be changed to `hidden
// See git pull https://github.com/dannykeane/bootstrap.git backface-visibility for examples
.backface-visibility(@visibility){
	-webkit-backface-visibility: @visibility;
	   -moz-backface-visibility: @visibility;
	        backface-visibility: @visibility;
}

// Background clipping
// Heads up: FF 3.6 and under need "padding" instead of "padding-box"
.background-clip(@clip) {
  -webkit-background-clip: @clip;
     -moz-background-clip: @clip;
          background-clip: @clip;
}

// Background sizing
.background-size(@size) {
  -webkit-background-size: @size;
     -moz-background-size: @size;
       -o-background-size: @size;
          background-size: @size;
}


// Box sizing
.box-sizing(@boxmodel) {
  -webkit-box-sizing: @boxmodel;
     -moz-box-sizing: @boxmodel;
          box-sizing: @boxmodel;
}

// User select
// For selecting text on the page
.user-select(@select) {
  -webkit-user-select: @select;
     -moz-user-select: @select;
      -ms-user-select: @select;
       -o-user-select: @select;
          user-select: @select;
}

// Resize anything
.resizable(@direction) {
  resize: @direction; // Options: horizontal, vertical, both
  overflow: auto; // Safari fix
}

// CSS3 Content Columns
.content-columns(@columnCount, @columnGap: @gridGutterWidth) {
  -webkit-column-count: @columnCount;
     -moz-column-count: @columnCount;
          column-count: @columnCount;
  -webkit-column-gap: @columnGap;
     -moz-column-gap: @columnGap;
          column-gap: @columnGap;
}

// Optional hyphenation
.hyphens(@mode: auto) {
  word-wrap: break-word;
  -webkit-hyphens: @mode;
     -moz-hyphens: @mode;
      -ms-hyphens: @mode;
       -o-hyphens: @mode;
          hyphens: @mode;
}

// Opacity
.opacity(@opacity) {
  opacity: @opacity / 100;
  filter: ~"alpha(opacity=@{opacity})";
}



// BACKGROUNDS
// --------------------------------------------------

// Add an alphatransparency value to any background or border color (via Elyse Holladay)
#translucent {
  .background(@color: @white, @alpha: 1) {
    background-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
  }
  .border(@color: @white, @alpha: 1) {
    border-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
    .background-clip(padding-box);
  }
}

// Gradient Bar Colors for buttons and alerts
.gradientBar(@primaryColor, @secondaryColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {
  color: @textColor;
  text-shadow: @textShadow;
  #gradient > .vertical(@primaryColor, @secondaryColor);
  border-color: @secondaryColor @secondaryColor darken(@secondaryColor, 15%);
  // No idea why this is here, as it makes the border grey instead of the given colors
  // border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%);
}

// Gradients
#gradient {
  .horizontal(@startColor: #555, @endColor: #333) {
    background-color: @endColor;
    background-image: -moz-linear-gradient(left, @startColor, @endColor); // FF 3.6+
    background-image: -webkit-gradient(linear, 0 0, 100% 0, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
    background-image: -webkit-linear-gradient(left, @startColor, @endColor); // Safari 5.1+, Chrome 10+
    background-image: -o-linear-gradient(left, @startColor, @endColor); // Opera 11.10
    background-image: linear-gradient(to right, @startColor, @endColor); // Standard, IE10
    background-repeat: repeat-x;
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@startColor),argb(@endColor))); // IE9 and down
  }
  .vertical(@startColor: #555, @endColor: #333) {
    background-color: mix(@startColor, @endColor, 60%);
    background-image: -moz-linear-gradient(top, @startColor, @endColor); // FF 3.6+
    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
    background-image: -webkit-linear-gradient(top, @startColor, @endColor); // Safari 5.1+, Chrome 10+
    background-image: -o-linear-gradient(top, @startColor, @endColor); // Opera 11.10
    background-image: linear-gradient(to bottom, @startColor, @endColor); // Standard, IE10
    background-repeat: repeat-x;
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down
  }
  .directional(@startColor: #555, @endColor: #333, @deg: 45deg) {
    background-color: @endColor;
    background-repeat: repeat-x;
    background-image: -moz-linear-gradient(@deg, @startColor, @endColor); // FF 3.6+
    background-image: -webkit-linear-gradient(@deg, @startColor, @endColor); // Safari 5.1+, Chrome 10+
    background-image: -o-linear-gradient(@deg, @startColor, @endColor); // Opera 11.10
    background-image: linear-gradient(@deg, @startColor, @endColor); // Standard, IE10
  }
  .horizontal-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) {
    background-color: mix(@midColor, @endColor, 80%);
    background-image: -webkit-gradient(left, linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor));
    background-image: -webkit-linear-gradient(left, @startColor, @midColor @colorStop, @endColor);
    background-image: -moz-linear-gradient(left, @startColor, @midColor @colorStop, @endColor);
    background-image: -o-linear-gradient(left, @startColor, @midColor @colorStop, @endColor);
    background-image: linear-gradient(to right, @startColor, @midColor @colorStop, @endColor);
    background-repeat: no-repeat;
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down, gets no color-stop at all for proper fallback
  }

  .vertical-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) {
    background-color: mix(@midColor, @endColor, 80%);
    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor));
    background-image: -webkit-linear-gradient(@startColor, @midColor @colorStop, @endColor);
    background-image: -moz-linear-gradient(top, @startColor, @midColor @colorStop, @endColor);
    background-image: -o-linear-gradient(@startColor, @midColor @colorStop, @endColor);
    background-image: linear-gradient(@startColor, @midColor @colorStop, @endColor);
    background-repeat: no-repeat;
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down, gets no color-stop at all for proper fallback
  }
  .radial(@innerColor: #555, @outerColor: #333) {
    background-color: @outerColor;
    background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@innerColor), to(@outerColor));
    background-image: -webkit-radial-gradient(circle, @innerColor, @outerColor);
    background-image: -moz-radial-gradient(circle, @innerColor, @outerColor);
    background-image: -o-radial-gradient(circle, @innerColor, @outerColor);
    // > Joomla JUI
    /* Joomla JUI NOTE: makes radial gradient IE 10+, also confirmed in Bootstrap, https://github.com/twbs/bootstrap/issues/7462 */
    background-image: radial-gradient(circle, @innerColor, @outerColor);
    // < Joomla JUI
    background-repeat: no-repeat;
  }
  .striped(@color: #555, @angle: 45deg) {
    background-color: @color;
    background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,.15)), color-stop(.75, rgba(255,255,255,.15)), color-stop(.75, transparent), to(transparent));
    background-image: -webkit-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
    background-image: -moz-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
    background-image: -o-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
    background-image: linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
  }
}
// Reset filters for IE
.reset-filter() {
  filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
}



// COMPONENT MIXINS
// --------------------------------------------------

// Horizontal dividers
// -------------------------
// Dividers (basically an hr) within dropdowns and nav lists
.nav-divider(@top: #e5e5e5, @bottom: @white) {
  // IE7 needs a set width since we gave a height. Restricting just
  // to IE7 to keep the 1px left/right space in other browsers.
  // It is unclear where IE is getting the extra space that we need
  // to negative-margin away, but so it goes.
  *width: 100%;
  height: 1px;
  margin: ((@baseLineHeight / 2) - 1) 1px; // 8px 1px
  *margin: -5px 0 5px;
  overflow: hidden;
  background-color: @top;
  border-bottom: 1px solid @bottom;
}

// Button backgrounds
// ------------------
.buttonBackground(@startColor, @endColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {
  // gradientBar will set the background to a pleasing blend of these, to support IE<=9
  //.gradientBar(@startColor, @endColor, @textColor, @textShadow);
  background-color: @startColor;
  *background-color: @startColor; /* Darken IE7 buttons by default so they stand out more given they won't have borders */
  //.reset-filter();

  // in these cases the gradient won't cover the background, so we override
  &:hover, &:focus, &:active, &.active, &.disabled, &[disabled] {
    color: @textColor;
    background-color: darken(@endColor, 5%);
    *background-color: darken(@endColor, 5%);
  }

  // IE 7 + 8 can't handle box-shadow to show active, so we darken a bit ourselves
  &:active,
  &.active {
    background-color: @startColor;
  }
}

// Navbar vertical align
// -------------------------
// Vertically center elements in the navbar.
// Example: an element has a height of 30px, so write out `.navbarVerticalAlign(30px);` to calculate the appropriate top margin.
.navbarVerticalAlign(@elementHeight) {
  margin-top: (@navbarHeight - @elementHeight) / 2;
}



// Grid System
// -----------

// Centered container element
.container-fixed() {
  margin-right: auto;
  margin-left: auto;
  .clearfix();
}

// Table columns
.tableColumns(@columnSpan: 1) {
  float: none; // undo default grid column styles
  width: ((@gridColumnWidth) * @columnSpan) + (@gridGutterWidth * (@columnSpan - 1)) - 16; // 16 is total padding on left and right of table cells
  margin-left: 0; // undo default grid column styles
}

// Make a Grid
// Use .makeRow and .makeColumn to assign semantic layouts grid system behavior
.makeRow() {
  margin-left: @gridGutterWidth * -1;
  .clearfix();
}
.makeColumn(@columns: 1, @offset: 0) {
  float: left;
  margin-left: (@gridColumnWidth * @offset) + (@gridGutterWidth * (@offset - 1)) + (@gridGutterWidth * 2);
  width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
}

// The Grid
#grid {

  .core (@gridColumnWidth, @gridGutterWidth) {

    .spanX (@index) when (@index > 0) {
      .span@{index} { .span(@index); }
      .spanX(@index - 1);
    }
    .spanX (0) {}

    .offsetX (@index) when (@index > 0) {
      .offset@{index} { .offset(@index); }
      .offsetX(@index - 1);
    }
    .offsetX (0) {}

    .offset (@columns) {
      margin-left: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns + 1));
    }

    .span (@columns) {
      width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
    }

    .row {
      margin-left: @gridGutterWidth * -1;
      .clearfix();
    }

    [class*="span"] {
      float: left;
      min-height: 1px; // prevent collapsing columns
      margin-left: @gridGutterWidth;
    }

    // Set the container width, and override it for fixed navbars in media queries
    .container,
    .navbar-static-top .container,
    .navbar-fixed-top .container,
    .navbar-fixed-bottom .container { .span(@gridColumns); }

    // generate .spanX and .offsetX
    .spanX (@gridColumns);
    .offsetX (@gridColumns);

  }

  .fluid (@fluidGridColumnWidth, @fluidGridGutterWidth) {

    .spanX (@index) when (@index > 0) {
      .span@{index} { .span(@index); }
      .spanX(@index - 1);
    }
    .spanX (0) {}

    .offsetX (@index) when (@index > 0) {
      .offset@{index} { .offset(@index); }
      .offset@{index}:first-child { .offsetFirstChild(@index); }
      .offsetX(@index - 1);
    }
    .offsetX (0) {}

    .offset (@columns) {
      margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth*2);
  	  *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + (@fluidGridGutterWidth*2) - (.5 / @gridRowWidth * 100 * 1%);
    }

    .offsetFirstChild (@columns) {
      margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth);
      *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);
    }

    .span (@columns) {
      width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1));
      *width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%);
    }

    .row-fluid {
      width: 100%;
      .clearfix();
      [class*="span"] {
        .input-block-level();
        float: left;
        margin-left: @fluidGridGutterWidth;
        *margin-left: @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);
      }
      [class*="span"]:first-child {
        margin-left: 0;
      }

      // Space grid-sized controls properly if multiple per line
      .controls-row [class*="span"] + [class*="span"] {
        margin-left: @fluidGridGutterWidth;
      }

      // generate .spanX and .offsetX
      .spanX (@gridColumns);
      .offsetX (@gridColumns);
    }

  }

  .input(@gridColumnWidth, @gridGutterWidth) {

    .spanX (@index) when (@index > 0) {
      input.span@{index}, textarea.span@{index}, .uneditable-input.span@{index} { .span(@index); }
      .spanX(@index - 1);
    }
    .spanX (0) {}

    .span(@columns) {
      width: ((@gridColumnWidth) * @columns) + (@gridGutterWidth * (@columns - 1)) - 14;
    }

    input,
    textarea,
    .uneditable-input {
      margin-left: 0; // override margin-left from core grid system
    }

    // Space grid-sized controls properly if multiple per line
    .controls-row [class*="span"] + [class*="span"] {
      margin-left: @gridGutterWidth;
    }

    // generate .spanX
    .spanX (@gridColumns);

  }
}
templates/isis/less/bootstrap/buttons.less000060400000013145152453623440015072 0ustar00//
// Buttons
// --------------------------------------------------


// Base styles
// --------------------------------------------------

// Core
.btn {
  display: inline-block;
  .ie7-inline-block();
  padding: 4px 12px;
  margin-bottom: 0; // For input.btn
  font-size: @baseFontSize;
  line-height: @baseLineHeight;
  text-align: center;
  vertical-align: middle;
  cursor: pointer;
  background-color: @btnBackground;
  color: #333;
  //  .buttonBackground(@btnBackground, @btnBackgroundHighlight, @grayDark, 0 1px 1px rgba(255,255,255,.75));
  border: 1px solid @btnBorder;
  .border-radius(@baseBorderRadius);
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
  &:hover,
  &:focus {
    background-color: @btnBackgroundHighlight;
    text-decoration: none;
    text-shadow: none;
  }

  // Focus state for keyboard and accessibility
  &:focus {
    .tab-focus();
  }

  // Active state
  &.active,
  &:active {
    background-image: none;
    outline: 0;
    //    .box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)");
  }

  // Disabled state
  &.disabled,
  &[disabled] {
    cursor: default;
    background-image: none;
    .opacity(65);
    .box-shadow(none);
  }

}



// Button Sizes
// --------------------------------------------------

// Large
.btn-large {
  padding: @paddingLarge;
  font-size: @fontSizeLarge;
  .border-radius(@borderRadiusLarge);
}
.btn-large [class^="icon-"],
.btn-large [class*=" icon-"] {
  margin-top: 4px;
}

// Small
.btn-small {
  padding: @paddingSmall;
  font-size: @fontSizeSmall;
  .border-radius(@borderRadiusSmall);
}
.btn-small [class^="icon-"],
.btn-small [class*=" icon-"] {
  margin-top: 0;
}
.btn-mini [class^="icon-"],
.btn-mini [class*=" icon-"] {
  margin-top: -1px;
}

// Mini
.btn-mini {
  padding: @paddingMini;
  font-size: @fontSizeMini;
  .border-radius(@borderRadiusSmall);
}


// Block button
// -------------------------

.btn-block {
  display: block;
  width: 100%;
  padding-left: 0;
  padding-right: 0;
  .box-sizing(border-box);
}

// Vertically space out multiple block buttons
.btn-block + .btn-block {
  margin-top: 5px;
}

// Specificity overrides
input[type="submit"],
input[type="reset"],
input[type="button"] {
  &.btn-block {
    width: 100%;
  }
}



// Alternate buttons
// --------------------------------------------------

.btn-primary,
.btn-warning,
.btn-danger,
.btn-success,
.btn-info,
.btn-inverse {
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
}

// Provide *some* extra contrast for those who can get it
.btn-primary.active,
.btn-warning.active,
.btn-danger.active,
.btn-success.active,
.btn-info.active,
.btn-inverse.active {
  //  color: rgba(255,255,255,.75);
}

// Set the backgrounds
// -------------------------
.btn-primary {
  border: 1px solid @btnPrimaryBackgroundHighlight;
  border: 1px solid rgba(0, 0, 0, 0.2);
  color: #fff;
  background-color: @btnPrimaryBackground;
  &:hover,
  &:focus {
    background-color: darken(@btnPrimaryBackground, 15%);
    color: #fff;
    text-decoration: none;
  }
}
// Warning appears are orange
.btn-warning {
  border: 1px solid @btnWarningBackground;
  border: 1px solid rgba(0, 0, 0, 0.2);
  color: #fff;
  background-color: @btnWarningBackground;
  &:hover,
  &:focus {
    background-color: darken(@btnWarningBackground, 15%);
    color: #fff;
    text-decoration: none;
    text-shadow: none;
  }
}
// Danger and error appear as red
.btn-danger {
  border: 1px solid @btnDangerBackground;
  border: 1px solid rgba(0, 0, 0, 0.2);
  color: #fff;
  background-color: @btnDangerBackground;
  &:hover,
  &:focus {
    background-color: darken(@btnDangerBackground, 15%);
    color: #fff;
    text-decoration: none;
  }
}
// Success appears as green
.btn-success {
  border: 1px solid @btnSuccessBackgroundHighlight;
  border: 1px solid rgba(0, 0, 0, 0.2);
  color: #fff;
  background-color: @btnSuccessBackground;
  &:hover,
  &:focus {
    background-color: darken(@btnSuccessBackground, 15%);
    color: #fff;
    text-decoration: none;
  }
}
// Info appears as a neutral blue
.btn-info {
  border: 1px solid @btnInfoBackground;
  border: 1px solid rgba(0, 0, 0, 0.2);
  color: #fff;
  background-color: @btnInfoBackground;
  &:hover,
  &:focus {
    background-color: darken(@btnInfoBackground, 15%);
    color: #fff;
    text-decoration: none;
  }
}
// Inverse appears as dark gray
.btn-inverse {
  border: 1px solid @btnInverseBackground;
  border: 1px solid rgba(0, 0, 0, 0.2);
  color: #fff;
  background-color: @btnInverseBackground;
  &:hover,
  &:focus {
    background-color: darken(@btnInverseBackground, 15%);
    color: #fff;
    text-decoration: none;
  }
}


// Cross-browser Jank
// --------------------------------------------------

button.btn,
input[type="submit"].btn {

  // Firefox 3.6 only I believe
  &::-moz-focus-inner {
    padding: 0;
    border: 0;
  }

  // IE7 has some default padding on button controls
  *padding-top: 3px;
  *padding-bottom: 3px;

  &.btn-large {
    *padding-top: 7px;
    *padding-bottom: 7px;
  }
  &.btn-small {
    *padding-top: 3px;
    *padding-bottom: 3px;
  }
  &.btn-mini {
    *padding-top: 1px;
    *padding-bottom: 1px;
  }
}


// Link buttons
// --------------------------------------------------

// Make a button look and behave like a link
.btn-link,
.btn-link:active,
.btn-link[disabled] {
  background-color: transparent;
  background-image: none;
  .box-shadow(none);
}
.btn-link {
  border-color: transparent;
  cursor: pointer;
  color: @linkColor;
  .border-radius(0);
}
.btn-link:hover,
.btn-link:focus {
  color: @linkColorHover;
  text-decoration: underline;
  background-color: transparent;
}
.btn-link[disabled]:hover,
.btn-link[disabled]:focus {
  color: @grayDark;
  text-decoration: none;
}
templates/isis/less/bootstrap/responsive-1200px-min.less000060400000010420152453623440017273 0ustar00//
// Responsive: Large desktop and up
// --------------------------------------------------


@media (min-width: 1200px) {

  // Fixed grid
  #grid > .core(@gridColumnWidth1200, @gridGutterWidth1200);

  // Fluid grid
   .row-fluid {
    width: 100%;
    *zoom: 1;
  }
  .row-fluid:before,
  .row-fluid:after {
    display: table;
    content: "";
    line-height: 0;
  }
  .row-fluid:after {
    clear: both;
  }
  .row-fluid [class*="span"] {
    display: block;
    width: 100%;
    min-height: 28px;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    float: left;
    margin-left: 2.76243094%;
    *margin-left: 2.70923945%;
  }
  .row-fluid [class*="span"]:first-child {
    margin-left: 0;
  }
  .row-fluid .controls-row [class*="span"] + [class*="span"] {
    margin-left: 2.76243094%;
  }
  .row-fluid .span12 {
    width: 100%;
    *width: 99.94680851%;
  }
  .row-fluid .span11 {
    width: 91.43646409%;
    *width: 91.3832726%;
  }
  .row-fluid .span10 {
    width: 82.87292818%;
    *width: 82.81973669%;
  }
  .row-fluid .span9 {
    width: 74.30939227%;
    *width: 74.25620078%;
  }
  .row-fluid .span8 {
    width: 65.74585635%;
    *width: 65.69266486%;
  }
  .row-fluid .span7 {
    width: 57.18232044%;
    *width: 57.12912895%;
  }
  .row-fluid .span6 {
    width: 48.61878453%;
    *width: 48.56559304%;
  }
  .row-fluid .span5 {
    width: 40.05524862%;
    *width: 40.00205713%;
  }
  .row-fluid .span4 {
    width: 31.49171271%;
    *width: 31.43852122%;
  }
  .row-fluid .span3 {
    width: 22.9281768%;
    *width: 22.87498531%;
  }
  .row-fluid .span2 {
    width: 14.36464088%;
    *width: 14.31144939%;
  }
  .row-fluid .span1 {
    width: 5.80110497%;
    *width: 5.74791348%;
  }
  .row-fluid .offset12 {
    margin-left: 105.52486188%;
    *margin-left: 105.4184789%;
  }
  .row-fluid .offset12:first-child {
    margin-left: 102.76243094%;
    *margin-left: 102.65604796%;
  }
  .row-fluid .offset11 {
    margin-left: 96.96132597%;
    *margin-left: 96.85494299%;
  }
  .row-fluid .offset11:first-child {
    margin-left: 94.19889503%;
    *margin-left: 94.09251205%;
  }
  .row-fluid .offset10 {
    margin-left: 88.39779006%;
    *margin-left: 88.29140708%;
  }
  .row-fluid .offset10:first-child {
    margin-left: 85.63535912%;
    *margin-left: 85.52897614%;
  }
  .row-fluid .offset9 {
    margin-left: 79.83425414%;
    *margin-left: 79.72787116%;
  }
  .row-fluid .offset9:first-child {
    margin-left: 77.0718232%;
    *margin-left: 76.96544023%;
  }
  .row-fluid .offset8 {
    margin-left: 71.27071823%;
    *margin-left: 71.16433525%;
  }
  .row-fluid .offset8:first-child {
    margin-left: 68.50828729%;
    *margin-left: 68.40190431%;
  }
  .row-fluid .offset7 {
    margin-left: 62.70718232%;
    *margin-left: 62.60079934%;
  }
  .row-fluid .offset7:first-child {
    margin-left: 59.94475138%;
    *margin-left: 59.8383684%;
  }
  .row-fluid .offset6 {
    margin-left: 54.14364641%;
    *margin-left: 54.03726343%;
  }
  .row-fluid .offset6:first-child {
    margin-left: 51.38121547%;
    *margin-left: 51.27483249%;
  }
  .row-fluid .offset5 {
    margin-left: 45.5801105%;
    *margin-left: 45.47372752%;
  }
  .row-fluid .offset5:first-child {
    margin-left: 42.81767956%;
    *margin-left: 42.71129658%;
  }
  .row-fluid .offset4 {
    margin-left: 37.01657459%;
    *margin-left: 36.91019161%;
  }
  .row-fluid .offset4:first-child {
    margin-left: 34.25414365%;
    *margin-left: 34.14776067%;
  }
  .row-fluid .offset3 {
    margin-left: 28.45303867%;
    *margin-left: 28.3466557%;
  }
  .row-fluid .offset3:first-child {
    margin-left: 25.69060773%;
    *margin-left: 25.58422476%;
  }
  .row-fluid .offset2 {
    margin-left: 19.88950276%;
    *margin-left: 19.78311978%;
  }
  .row-fluid .offset2:first-child {
    margin-left: 17.12707182%;
    *margin-left: 17.02068884%;
  }
  .row-fluid .offset1 {
    margin-left: 11.32596685%;
    *margin-left: 11.21958387%;
  }
  .row-fluid .offset1:first-child {
    margin-left: 8.56353591%;
    *margin-left: 8.45715293%;
  }

  // Input grid
  #grid > .input(@gridColumnWidth1200, @gridGutterWidth1200);

  // Thumbnails
  .thumbnails {
    margin-left: -@gridGutterWidth1200;
  }
  .thumbnails > li {
    margin-left: @gridGutterWidth1200;
  }
  .row-fluid .thumbnails {
    margin-left: 0;
  }

}
templates/isis/less/bootstrap/wells.less000060400000001041152453623440014512 0ustar00//
// Wells
// --------------------------------------------------


// Base class
.well {
  min-height: 20px;
  padding: 19px;
  margin-bottom: 20px;
  background-color: @wellBackground;
  border: 1px solid @wellBackground;
  .border-radius(@baseBorderRadius);
  //.box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
  blockquote {
    border-color: #f0f0f0;
    border-color: rgba(0,0,0,.15);
  }
}

// Sizes
.well-large {
  padding: 24px;
  .border-radius(@borderRadiusLarge);
}
.well-small {
  padding: 9px;
  .border-radius(@borderRadiusSmall);
}
templates/isis/less/variables.less000060400000023777152453623440013343 0ustar00//
// Variables
// --------------------------------------------------

// > Joomla JUI
// Responsive Breakpoints
// -------------------------
@xs:                    320px;
@sm:                    480px;
@md:                    768px;
@lg:                    980px;
@xl:                    1200px;

@xs-max:                @xs - 1;
@sm-max:                @sm - 1;
@md-max:                @md - 1;
@lg-max:                @lg - 1;
@xl-max:                @xl - 1;
// < Joomla JUI

// Global values
// --------------------------------------------------


// Grays
// -------------------------
@black:                 #000;
@grayDarker:            #222;
@grayDark:              #333;
@gray:                  #555;
@grayLight:             #999;
@grayLighter:           #eee;
@white:                 #fff;


// Accent colors
// -------------------------
@blue:                  #049cdb;
@blueDark:              #0064cd;
@green:                 #46a546;
@red:                   #9d261d;
@yellow:                #ffc40d;
@orange:                #f89406;
@pink:                  #c3325f;
@purple:                #7a43b6;


// Scaffolding
// -------------------------
@bodyBackground:        @white;
@textColor:             @grayDark;


// Links
// -------------------------
@linkColor:             darken(#428bca, 10%);
@linkColorHover:        darken(@linkColor, 15%);


// Typography
// -------------------------
@sansFontFamily:        "Helvetica Neue", Helvetica, Arial, sans-serif;
@serifFontFamily:       Georgia, "Times New Roman", Times, serif;
@monoFontFamily:        Monaco, Menlo, Consolas, "Courier New", monospace;
// > Joomla JUI
@baseFontSize:          13px;
// < Joomla JUI
@baseFontFamily:        @sansFontFamily;
// > Joomla JUI
@baseLineHeight:        18px;
// < Joomla JUI
@altFontFamily:         @serifFontFamily;

@headingsFontFamily:    inherit; // empty to use BS default, @baseFontFamily
@headingsFontWeight:    bold;    // instead of browser default, bold
@headingsColor:         inherit; // empty to use BS default, @textColor


// Component sizing
// -------------------------
// Based on 14px font-size and 20px line-height

@fontSizeLarge:         @baseFontSize * 1.25; // ~18px
// > Joomla JUI
@fontSizeSmall:         ceil(@baseFontSize * 0.85); // ~12px
// < Joomla JUI
@fontSizeMini:          @baseFontSize * 0.75; // ~11px

@paddingLarge:          11px 19px; // 44px
@paddingSmall:          2px 10px;  // 26px
@paddingMini:           0 6px;   // 22px

@baseBorderRadius:      3px;
@borderRadiusLarge:     6px;
@borderRadiusSmall:     3px;


// Tables
// -------------------------
@tableBackground:                   transparent; // overall background-color
@tableBackgroundAccent:             #f9f9f9; // for striping
@tableBackgroundHover:              #F0F0F0; // for hover
@tableBorder:                       #ddd; // table and cell border

// Buttons
// -------------------------
@btnBackground:                     #f3f3f3;
@btnBackgroundHighlight:            darken(@grayLighter, 3%);
@btnBorder:                         lighten(@grayLight, 10%);

// > Joomla JUI
@btnPrimaryBackground:              #2384d3;
@btnPrimaryBackgroundHighlight:     #15497c;
// < Joomla JUI

@btnInfoBackground:                 #2f96b4;
@btnInfoBackgroundHighlight:        darken(@btnInfoBackground, 10%);

@btnSuccessBackground:              #46a546;
@btnSuccessBackgroundHighlight:     darken(@btnSuccessBackground, 10%);

@btnWarningBackground:              @orange;
@btnWarningBackgroundHighlight:     darken(@btnWarningBackground, 10%);

@btnDangerBackground:               #bd362f;
@btnDangerBackgroundHighlight:      darken(@btnDangerBackground, 10%);

@btnInverseBackground:              #444;
@btnInverseBackgroundHighlight:     @grayDarker;


// Forms
// -------------------------
@inputBackground:               @white;
@inputBorder:                   #ccc;
@inputBorderHighlight:			#3071A9;
@inputBorderRadius:             3px;
@inputDisabledBackground:       @grayLighter;
@formActionsBackground:         #F0F0F0;
@inputHeight:                   @baseLineHeight + 10px; // base line-height + 8px vertical padding + 2px top/bottom border


// Dropdowns
// -------------------------
@dropdownBackground:            @white;
@dropdownBorder:                rgba(0,0,0,.2);
@dropdownDividerTop:            #F0F0F0;
@dropdownDividerBottom:         @white;

@dropdownLinkColor:             @grayDark;
@dropdownLinkColorHover:        @white;
@dropdownLinkColorActive:       @dropdownLinkColor;

@dropdownLinkBackgroundHover:   @dropdownLinkBackgroundActive;
@dropdownLinkBackgroundActive:  @linkColor;



// COMPONENT VARIABLES
// --------------------------------------------------


// Z-index master list
// -------------------------
// Used for a bird's eye view of components dependent on the z-axis
// Try to avoid customizing these :)
@zindexDropdown:          1000;
@zindexTooltip:           1030;
@zindexFixedNavbar:       1030;
@zindexModalBackdrop:     1040;
@zindexModal:             1050;
@zindexPopover:           1060;


// Sprite icons path
// -------------------------
@iconSpritePath:          "../img/glyphicons-halflings.png";
@iconWhiteSpritePath:     "../img/glyphicons-halflings-white.png";


// Input placeholder text color
// -------------------------
@placeholderText:         @grayLight;


// Hr border color
// -------------------------
@hrBorder:                @grayLighter;


// Horizontal forms & lists
// -------------------------
@horizontalComponentOffset:       180px;


// Wells
// -------------------------
@wellBackground:                  #F0F0F0;


// Navbar
// -------------------------
// > Joomla JUI
@navbarCollapseWidth:             @md-max;
// < Joomla JUI
@navbarCollapseDesktopWidth:      (@navbarCollapseWidth + 1);

@navbarHeight:                    40px;
@navbarBackgroundHighlight:       #ffffff;
@navbarBackground:                darken(@navbarBackgroundHighlight, 5%);
@navbarBorder:                    darken(@navbarBackground, 12%);

@navbarText:                      @gray;
@navbarLinkColor:                 @gray;
@navbarLinkColorHover:            @grayDark;
@navbarLinkColorActive:           @gray;
@navbarLinkBackgroundHover:       transparent;
@navbarLinkBackgroundActive:      darken(@navbarBackground, 5%);

@navbarBrandColor:                @navbarLinkColor;

// Inverted navbar
// > Joomla JUI
@navbarInverseBackground:                darken(@headerBackground, 10%);
@navbarInverseBackgroundHighlight:       darken(@headerBackground, 5%);
@navbarInverseBorder:                    darken(@headerBackground, 15%);

@navbarInverseText:                      lighten(@grayLight, 25%);
@navbarInverseLinkColor:                 lighten(@grayLight, 25%);
// < Joomla JUI
@navbarInverseLinkColorHover:            @white;
@navbarInverseLinkColorActive:           @navbarInverseLinkColorHover;
@navbarInverseLinkBackgroundHover:       transparent;
@navbarInverseLinkBackgroundActive:      @navbarInverseBackground;

@navbarInverseSearchBackground:          lighten(@navbarInverseBackground, 25%);
@navbarInverseSearchBackgroundFocus:     @white;
@navbarInverseSearchBorder:              @navbarInverseBackground;
@navbarInverseSearchPlaceholderColor:    #ccc;

@navbarInverseBrandColor:                @navbarInverseLinkColor;


// Pagination
// -------------------------
@paginationBackground:                #fff;
@paginationBorder:                    #ddd;
@paginationActiveBackground:          #F0F0F0;


// Hero unit
// -------------------------
@heroUnitBackground:              @grayLighter;
@heroUnitHeadingColor:            inherit;
@heroUnitLeadColor:               inherit;


// Form states and alerts
// -------------------------
@warningText:             #8a6d3b;
@warningBackground:       #fcf8e3;
@warningBorder:           darken(spin(@warningBackground, -10), 5%);

@errorText:               #a94442;
@errorBackground:         #f2dede;
@errorBorder:             darken(spin(@errorBackground, -10), 5%);

@successText:             #3c763d;
@successBackground:       #dff0d8;
@successBorder:           darken(spin(@successBackground, -10), 5%);

@infoText:                #31708f;
@infoBackground:          #d9edf7;
@infoBorder:              darken(spin(@infoBackground, -10), 7%);


// Tooltips and popovers
// -------------------------
@tooltipColor:            #fff;
@tooltipBackground:       #000;
@tooltipArrowWidth:       5px;
@tooltipArrowColor:       @tooltipBackground;

@popoverBackground:       #fff;
@popoverArrowWidth:       10px;
@popoverArrowColor:       #fff;
@popoverTitleBackground:  darken(@popoverBackground, 3%);

// Special enhancement for popovers
@popoverArrowOuterWidth:  @popoverArrowWidth + 1;
@popoverArrowOuterColor:  rgba(0,0,0,.25);



// GRID
// --------------------------------------------------


// Default 940px grid
// -------------------------
@gridColumns:             12;
@gridColumnWidth:         60px;
@gridGutterWidth:         20px;
@gridRowWidth:            (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1));

// 1200px min
@gridColumnWidth1200:     70px;
@gridGutterWidth1200:     30px;
@gridRowWidth1200:        (@gridColumns * @gridColumnWidth1200) + (@gridGutterWidth1200 * (@gridColumns - 1));

// 768px-979px
@gridColumnWidth768:      42px;
@gridGutterWidth768:      20px;
@gridRowWidth768:         (@gridColumns * @gridColumnWidth768) + (@gridGutterWidth768 * (@gridColumns - 1));


// Fluid grid
// -------------------------
@fluidGridColumnWidth:         percentage(@gridColumnWidth/@gridRowWidth);
@fluidGridGutterWidth:         percentage(@gridGutterWidth/@gridRowWidth);

// 1200px min
@fluidGridColumnWidth1200:     percentage(@gridColumnWidth1200/@gridRowWidth1200);
@fluidGridGutterWidth1200:     percentage(@gridGutterWidth1200/@gridRowWidth1200);

// 768px-979px
@fluidGridColumnWidth768:      percentage(@gridColumnWidth768/@gridRowWidth768);
@fluidGridGutterWidth768:      percentage(@gridGutterWidth768/@gridRowWidth768);


// > Joomla JUI
// Login
// -------------------------
@loginBackground:                  #17568c;

// Header
// -------------------------
@headerBackground:                 #1a3867;
@headerBackgroundHighlight:        #17568c;
// < Joomla JUItemplates/isis/less/template-rtl.less000060400000017004152453623440013767 0ustar00@import "template.less";
@import "../../../../media/jui/less/bootstrap-rtl.less";

.navbar {
	.admin-logo {
		float: right;
		padding: 7px 15px 0px 12px;
	}
	.brand {
		float: left;
		padding: 6px 10px;
	}
	.nav {
		margin: 0 0 0 10px;
		> li > a {
			padding: 6px 10px;
		}
		> li ul {
			overflow-y: auto;
			overflow-x: hidden;
			-webkit-overflow-scrolling: touch;
			-moz-overflow-scrolling: touch;
			-ms-overflow-scrolling: touch;
			-o-overflow-scrolling: touch;
			overflow-scrolling: touch;
			height: auto;
			max-height: 500px;
			margin: 0;
			&::-webkit-scrollbar {
				-webkit-appearance: none;
				width: 7px;
			}
			&::-webkit-scrollbar-thumb {
				border-radius: 4px;
				background-color: rgba(0,0,0,.5);
				-webkit-box-shadow: 0 0 1px rgba(255,255,255,.5);
			}
		}
	}
	.nav-user .dropdown-menu li span {
	padding-left: 0;
	padding-right: 10px;
	}
	.nav > .dropdown.open:after {
		right: 10px;
		width: 0;
	}
	.empty-nav {
		display: none;
	}
}

#toolbar {
	.btn {
	    padding: 0 10px;
	}
	[class^="icon-"], [class*=" icon-"] {
	    border-radius: 0 3px 3px 0;
	    border-right: 0;
	    border-left: 1px solid #b3b3b3;
	    margin: 0 -10px 0 6px;
	}
}
.chzn-container-single .chzn-single {
    padding-left: 8px;
    div {
	    border-left: 0;
	    border-right: 1px solid #cccccc;
	}
	abbr {
    	left: 36px;
	}
}
.chzn-container-active.chzn-with-drop .chzn-single div {
    background-color: #f3f3f3;
    border-bottom: 1px solid #cccccc;
    border-bottom-left-radius: 0px;
    border-bottom-right-radius: 3px;
    border-left: 1px solid #cccccc;
}
.chzn-container-multi .chzn-choices .search-choice {
    padding-left: 7px;
    .search-choice-close {
	    margin-left: 0;
	    margin-right: 3px;
	}
}
.chzn-container .chzn-single.chzn-color[rel="value_0"] div,
.chzn-container .chzn-single.chzn-color[rel="value_1"] div {
  border-right: none;
}
.chzn-container-single .chzn-search::after {
    left: 20px;
    right: auto;
}

.container-logo {
	padding-top: 0;
	float: left;
	text-align: left;
}

.page-title {
	[class^="icon-"],
	[class*=" icon-"] {
		margin-right: 0;
		margin-left: 16px;
	}
}

@media (max-width: @md-max) {
	.navbar {
		.admin-logo {
			margin-right: 10px;
			padding: 9px 9px 0 9px;
		}
		.btn-navbar {
			float: left;
			margin-right: 5px;
			margin-left: 3px;
		}
		.nav-collapse .nav.pull-left {
			float: none;
			margin-left: 0;
			margin-right: 0;
		}
	}

	.nav-collapse .nav > li {
		float: none;
	}

	.page-title {
		[class^="icon-"],
		[class*=" icon-"] {
			margin-left: 10px;
		}
	}
}

/* Status module */
#status {
	padding: 4px 10px;

	.btn-group {
		margin: 0;
	}
	.btn-group.separator:after {
		content: ' ';
		display: block;
		float: left;
		background: #ADADAD;
		margin: 0 10px;
		height: 15px;
		width: 1px;
	}
	.badge {
		margin-left: .25em;
		margin-right: 0;
	}
}

/* Menus */
.dropdown-menu > li > a {
	text-align: right;
}

/* btn-group */
.btn-group.btn-group-yesno > .btn, .btn-group > .btn, .btn-group > .btn + .dropdown-toggle {
	float: none;
}

/* For grid.boolean */
a.grid_false {
	display: inline-block;
	height: 16px;
	width: 16px;
	background-image: url('../images/admin/publish_r.png');
}

a.grid_true {
	display: inline-block;
	height: 16px;
	width: 16px;
	background-image: url('../images/admin/icon-16-allow.png');
}

/* Login */
.view-login {
	.login-joomla {
		position: absolute;
		right: 50%;
		height: 24px;
		width: 24px;
		margin-right: -12px;
		font-size: 22px;
	}
	.input-medium {
		width: 169px;
	}
}
.login {
	.chzn-single {
		width: 219px !important;
	}
	.chzn-container,
	.chzn-drop {
		width: 227px !important;
		max-width: 227px !important;
	}
	.input-prepend .chzn-container-single .chzn-single {
		.border-radius(3px 0 0 3px);
		border-right:0px;
	}
}

/* For collapsible sidebar */
.j-sidebar-container {
	position: absolute;
	display: block;
	left: auto;
	right: -16.5%;
	padding-top: 28px;
	padding-bottom: 40px;
	clear: both;
	margin: -10px -1px 0 0;
	border-right: 0;
	border-left: 1px solid #d3d3d3;
}

.j-sidebar-container.j-sidebar-hidden {
	left: auto;
	right: -16.5%;
}

.j-sidebar-container.j-sidebar-visible {
	left: auto;
	right: 0;
}

.j-toggle-sidebar-header {
	padding: 10px 19px 10px 0;
}

.sidebar {
	padding: 3px 4px 3px 3px;
}

.j-toggle-button-wrapper {
	&.j-toggle-hidden {
		right: auto;
		left: -24px;
	}
	&.j-toggle-visible {
		right: auto;
		left: 10px;
	}
}

.j-sidebar-container .icon-folder-2 {
    line-height: 15px;
    padding-left: 0;
}

#system-message-container,
#j-main-container {
	padding: 0 5px 0 0;
}

#system-message-container.j-toggle-main,
#j-main-container.j-toggle-main,
#system-debug.j-toggle-main {
	float: left;
}

@media (max-width: @lg-max) {
	.j-toggle-button-wrapper.j-toggle-hidden {
		right: auto;
		left: -20px;
	}
}

@media (max-width: @md-max) {
	.j-sidebar-container {
		position: relative;
		padding: 0;
		border-right: 0;
		border-left: 0;
	}

	.j-sidebar-container.j-sidebar-hidden {
		margin-left: auto;
		margin-right: 16.5%;
	}

	.j-sidebar-container.j-sidebar-visible {
		margin-left: auto;
		margin-right: 0;
	}

	/* login */
	.view-login {
		select {
			width: 229px
		}
	}
}

#j-main-container.expanded {
	margin-right: 0;
}

/* Modal batch */
@media (min-width: @md) {
	.row-fluid [class*="span"] {
		margin-right: 15px;
		margin-left: 0;
	}

	.row-fluid .modal-batch [class*="span"] {
		margin-right: 0;
	}
}

.row-fluid .modal-batch [class*="span"] {
	margin-right: 0;
}

/* Extended Responsive Styles */
@media (max-width: @sm-max) {
	.btn-toolbar .btn-wrapper .btn {
		width: 100% !important;
		margin-right:0px;
	}
	.btn-toolbar .btn-wrapper {
		margin:0 10px 5px 10px;
	}
}

@media (max-width: 420px) {
	.j-sidebar-container {
		margin: 0;
	}
	/* login */
	.view-login {
		.input-medium {
			width: 173px;
		}
		select {
			width: 229px
		}
	}
}

/* Stats plugin */
.js-pstats-data-details dd {
	margin-right: 240px;
}

/* Modal footer */
.modal-footer button {
	float: left;
}

/* Modal Header text align right even if parent container centered */
.modal-header {
	text-align: right;
}


/* Media Manager */
#mediamanager-form .thumbnails-media .thumbnail {
    margin-left: 18px !important;
    margin-right: 0;
    direction: ltr;
    text-align: center;
}
.thumbnails-media .imgThumb label::before, .thumbnails-media .imgThumb .imgThumbInside::before {
	left: 0;
	right: auto;
	border-radius: 3px 0;
}
.thumbnails-media .thumbnail input[type="radio"], .thumbnails-media .thumbnail input[type="checkbox"] {
    left: auto;
    right: 5px;
}
.thumbnails-media .imgDelete a.close {
	border-radius: 0 3px;
}
.thumbnails-media .imgPreview a, .thumbnails-media .imgDetails {
    border-radius: 3px 0;
    border-width: 1px;
    left: 0;
    right: 0;
    text-align: left;
    direction: ltr;
}
.thumbnails-media .imgPreview a {
	width: 100%;
}

/* SubForms (Table) */
.subform-table-layout {
	td {
		padding-left: 10px;
		&::before {
			content: attr(data-column);
			left: auto;
			right: 10px;
			padding-left: 10px;
			padding-right: 0;
		}
	}
	.subform-repeatable tbody td:last-of-type {
		text-align: left;
	}
	.form-horizontal .controls {
		margin-top: 0;
	}
}

/* com_templates */
.tree-holder {
	ul {
		ul {
			padding-right: 15px;
			box-shadow: 3px 0 0 rgba(0, 0, 0, 0.08);
			padding-left: 0;
			.folder-url, .file {
				box-shadow: 3px 0 0 @linkColor;
				border-right: 0;
				border-left: 1px solid rgba(0, 0, 0, 0.08);
			}
		}
	}
}

/* Dropdown */
.dropdown-reverse {
	left: 0;
	right: auto;
}

/* CPanel Site Information mod_stats_admin */
.com_cpanel .well > .row-striped > .row-fluid [class*="span"],
.com_cpanel .well > .list-striped > .row-fluid [class*="span"] {
	margin-right: 0;
}
templates/isis/template_thumbnail.png000060400000017400152453623440014103 0ustar00�PNG


IHDR���Gl�PLTE;�33PPP@l�������1@\3f��Azh�:���P�W��,P���bq�X������̿��-U�>l$G����p/`�=i�����d�E���F����8��
2XBr̙����WdtLMM���(D{��	*II{~��z�P�����:clz�Yj�
"@Gv���*I�/
6\���fff}��|��0SHXt�ff���-Rw�oI幻n��R��������G�׌��J�I{Fb�{��	0R�����𗛦�0I'J������rw�Ez$9Zڇ@!B���ATq2[�Ң׸�3��JZk\���� x�Lm�p��㜚Raz������2eh�����Br2Ik��സ����������;~O������1:j0ST���ڧ��x���̫�۶�����@mAs�ʛ���\y�N�������GVc���W�?Z����c�ښ��V�����r���{����ϽS�I[z33f��������z�ެ���fb��l{�������t��_n����S]t���3Jw�����Ŭ����Gv������\j�-lo��B|;e�n��!4So����ȭ8Gc���'D���`~�������s���DW���J�dl�鯵s�Ğ�Ճ�������$Ht :��������ɛ������������J{�����쪦����旕
�ɡ��E�����Gq�Q�ct�k����趺�����ț��������ž�Iavcy*R9cRj�=l:e6]Pl�$DjRe�Qt�#����IDATx�R�0��dn�1�惙JZS��o
��ߥ~a�n����v�f����s��.v�6��������B<A���A�����j#Q�C�s娔�������,��0Ws9�O.��e��e@���UkUef���'I������&'�VhD�4u�>AA�ee�7�iN�5_��[Y�
Cq|��=-���޷�\�{�K�e�!Me��ߪ���
'n���UϺ��c�'��{�-�b�ת�d#��w.,J-�&I�&\h���s9Z瑓�=��ʛ��a@�;颌v��ůP�u�/�Gr䆛mYs~���̆7@��DX��G2_��?t�g�R����.� U�����Ən�ZPݏP�`kl��c���+`����	�W�u��tG��
X:�*�Wa���Yϧ�Zk�f�&�C�Q��e�c"�I.��ha
ܽw�:�԰�(��/kN=�� ��f���HZ�99R9�-��pb6=�t�x���n)w㾁�2��6�w4K:F\�_�$s� F��%��1���֎�g##a���dH��'mNԞ�z&@���q<0��1E�Uss<Gf�޹�_�z�ɑ����r��C��μ�J)>�&'�M�u�ҎI�wp���Ъ�r&-d���"�O%U�Q�xD*��)瓾���}�D�f��l�?Y�n,�a�N݆�1�;�p�s��m绠���Z�F8�t	V�\n�t�$
�s�8+3k��UR�Āk� �0�(+D!����4Wa���9B>\WE'Y7X#���8v��8~:d��+�.N"w4\]姳<�'|bٮ��T{j'����ht�?͆�fV.���(_Y��wX��e�ь�
C�>F5�j���`�ņ��Eb��翇__?<�������i,Og4;���z���jvH�.%OV谶�ܚg�c-%{��Pgk�K<��-�Q&�v�:^���hIW�[�훽��t5;�5��Y�e$����k<��`B�ʅ����t��VK��(P�@�p�����|���Ν��6�����	.
�C��c�l�<�V�9/����@z���A~@�-
��A@%�k�˜]z�z��g�� Rzһ�����z\;�Ny�
"�T�K���`�/�b�l��V�}Ȑ�����v��s��ɽ���}��;��.٠E�O�h���h�����n��b�&��<��ND�NS��Е7�#�gܴX�g1I5z�`�����0��|^ؼ;��:j��v|悔t�{|�s�8�w�8XX�c0��pP5����χ�D�����+.�,�W���h��Շ�zI�C�.�g_IOX�R��(�.Wˠ��⿖ޓ��ʦ������jmy��Ь�s�]me�?�3�������Q�T�2�Q?x`��2���;��
ιJgi�ƀm�	��7 ��u����u������b :��ng~ǕȆc9:j��zH�ɘ�qӱ��p�+��	�6-���$:�nhȦ[S�,Q�olT*�̺͝�ξ�с�+�P�9j�;K�Iul;ݷ��!׏ԇȡ!J�=�نP���X�X	Y3R�N0��Ut���>����Ji+��~�@��#k�#��C~>�
Қ�+'^y�+_��+O]��]+9�H�N<����+��Ś�Aеf�6�+A��u�\�s��'&6�ؼy�O��į�:��8�ۜ�MJ�|pY'���IO']w���N��T�����>���QrI3�~���i2D���H{:��퐿m��A~���u�˻.k7�;��h��Y�0/69��X�YwY1�<�V�s`���Ï}���|x���K�w��c=����+t��>��tHݍ|��TUa/���UN�U�����s�9�B�P1�f��zz]$�Z������Cf���� �M�%�
�1�0��@24W=r����s�D�����谈{�fŢyt���x��H��M�M��YqT�Y���k�P������N'@�ȷ��N� �[������_��x@GL^;z��c;F���0DB\K'����n�Y��:�Q��P�������_F�P(l�H3�,��%o�2����r��ds�I0`B�;�^��HrH���Y>PWП;Yf��l�'u��?ɯ�g��֠N�Pd�0M��Q��L(�T7Q/�:���Mm��
4�u�1��0�uaal�79W���Wm���q\�s�GP�>[�N�^	�g�-���#�M^bP�����s��%S�i���k9�����.
��&cf+DP���yg@��J+p�n�X�2÷�p�����Ρ���Lg�N�e!�ȱ��8d����HEq�Kw�,��M锨
֋\t��lIB<�l�l-�D��2B�iqu$Y/�R��E�~�Q�k�X��l��Y��1�}C�~t(M����$���9�dsG�u��"K�_w�-���=�Tqt ���=�un����X���;]�}��+��G��:V�L�:�s�y^���|f�[G
���lu7�����jݝ/ժ�������d�����K��pi�U��rK�����E�b�B�u#Xk@ҟ/;ʞ �sKy��1+9X��[ ׂ���`j7O?Q����Fr`Cw�e%���]���jM�<�ݍ�uc��љ;�Ė-S##0 F�"�E�f@�A�%h��iw!z��y��-|�5�~�??8�K.y��k�m�`��d��ݖ�p����,�\PN��a˙���n����Fc
�N	��.�N:���S�P���1�5���ۆ�`pK^g�ъ���#����^"�϶!��l���Oj!Ph�o�it���w���<��gSS�L���0gm�q۱-�6�QSm�y��$������s�871�c~�am0������
u`i�b`(�lc�����xb�HJd6��\gۋ�4_&�n�%�Y�n�ރªH���'�fNX��Q�����/����6^�;�!(�n\֡&C�j�ZC�@�'M��T�|�k�?�ell��dc��BC�GmZs,ƅ�(x���Z1�Ȑ�u�u�s�>w�ч�����Ӱ��yR��m�A��B5w C�%��7w7&��X�l:ۆxF� �Q�����*	I���rH�2��O`!�m��K�4���l���É!D�G�C)	P�@Fqs}G��ժ�v�~���ܢ5��g�y��'_���_�d����]�<~�m�^F�݊U"��⪀Ja�
 �lIv+����=w�ɹ���ɱ��=��Ͻ^��'�Q�ȱb�s��dj�H�B
4���� �:Y����+�E�9`�gTd�5�"k���k��8:��㸁��� ~ï@i5wo)]�ܝ4�0�ZEB������9�J`N������"g�}�[R'lJG��N��k/��16zm�04�k���5�л�d[� �h�襂�3o8sr���ɭ�'���C4�k�;�1E:r(��`��M*:�QL �21����W�h��:0$���wJW��,^�u6O��F�d�ư~�R'���t�*O�s:�����չL��
�?*�eI�b�+�k����U}^�bIG%�M��6��-��a��*�W���BSl*��[Au����&���u��Y,
��j�����֙e(��У2�ô(ecQ�"˦vy�`1+2�1ؔ/r.;<�f�Ŝ��(�W��ZTz�~�'���iJ��3Jm���.KdNˉB�:-�D��ጴȹIU�����$��
��s�8}c��W�"�7��.+�s��?�����g�{ս����s�u�G�x��*�A�
�R)ᴕJ
����:�ξ9�装���r�D�e���=��d�w��ݑzl�1��=�}���V�=�kKWE�.��m���\����\��?�;���o�o���'�Kqd�$��Ű��}�!��j�������QhJ)�8���9���U�:�v�������?�s�4�_��Q춶̓$|v�y�+��
��k��.Z1�VJH0%�GMa*�'	��� *����DF���}���H+j���п^M�R��z��}~ޥ\#�&�B]EG���j��Y=�j
�T}\\mmr�#2u�¿�
���#8Up\���{��Cv��Fm/��X�ba�V4��T=i�>�M:�P��� �󮮳��u�'T��U8ƒ�5P6i]���tv���j��f�h�Q��2��@�u�h��t��(hpQ_Ů؝�"����t`�d��p(����蘮�Ϻ@[D˯�@"��{knVF���V��Q
1�hM
�^�]Z���f#]l�Uq�Tn�<�4��y��}�bɒ�#�lK���m��(U~�����K��u�N7�C�t��✕Yg!��[�]��*hh��%*��މV�x���v�l��{y�GY�����AcS��q���@���R(#E7����u�e��k�G�LL������^oޞ�[��@#?`
�P���WN�{
%�:F��U��r0x���tRڼ�
�$M���kOkoub�X)D�]�Ξo�z��৖�$55��Re
SMq�M�
V�
p��E��R�P[,h�>J���lfM�������<��y����5�Y�N���8�>B((Gx�~�2�q�oh��"#��FG-�|H�lwN38LM����7E����Y�1t��B8�TQ@�ǡ���g�K�Hb�"�Mq��1|b�X�N
s벸��.N�g�4�'.[	e�٪�fS!M#{-)����i
�DF>DZs�PjtT?���\�~�m�,�v�㳌<�I`�cggG�*8!mw<:L�-s�<�����Ύ�u�MA��K���]=��u���⣇e��g��c��䋐��nS���k���p�ѱ��n��9 �y�����F��M���SfS���M�x4��QJhr��TG3����óCQ_�G��O��a?�K�5y64¨��'ggVgq<�x_2
�mQP�*'�A_�m����ڛ����V����x����JFb
ook\��Ǐ�٪�.|�,��x|}�(NF�OO����Ӵ�I�|v�g�$�]x�P^[J�Q
2?;�P�����,#���TW������_I9?;�����l6���>�8��G`jo��5J����Ð��莣KR�Fk��x��N�c��i��e���5�A̱5ƴ�Ǎ8m����&�LR��/�>�~{�/�⋸l�[|~�.pe�ۓ4|���,C�H�3�"�� CKp8��D����02X�
C�8�l(ᙸaE��Q�*Xn|g�̯���և���a���g�9�yCI�8}+���Ex���G�G��Z������.e��XEQ����\��$�����L�s��b� 3���|���L��">rb.���Ge~��7���p�l���ɮ�U
2$6;�h�5�G7�{M����r8/qz�Aь�3�^*5�x�]��k�fiQ��
�� �5�s��g���w��E;>D��>�A!�7�s��$8Uu��-J��J�D�t2z��o���)V׷[
>ì7��(�U�C�W�</�Gp�5����8�)�eE����(Q>��7$4(�-�g� }�o�4[PX���ͱD�];�u.���8;
ߘw=>
�Pl�|B���`��U���2��t������Jq�p@P�����ͧY��nדR�Ex��f3�����ӑ�ߖ��r��&1G���`^O�)͍�D7��G׏6�N�(�DJk�z�3k�.�~�����mu�|�ߗ�`����iZ�r�nıX�W�o�5�p}�-=Z����t�D��ht���Ū������
8�ms��<�
j8��d���޶-��4:�I�<��k(P?ˆ~~vf8bЉm�*,;X~(�[Y�9��)u��Y��>��򼤁�-���Y��Mu�����tr>�x�l\K�#�����f@�����Į,I���D|�M�W������
��T��{M�7���%<���69B^��~���2�<��+�T:�i���uZl�
����}{o�S��(s��XE\�
�������5�A�y*0j��O�L%�e	�wA-w�7۸餅v�?V7[WIx�.�q��1e��(,����
�ہ���OP��IgOw(,�9A%S2"2#J���6���z�4��#������6����A��H�`���i�rv��������yj���l�nyv�Fl����,:�F��Fg�H'�Mq�޺W��9$������xȄ��i:�ёtF�[�����it0r;��ze��T����M�vā��8-q�i¬�cm�[RS��W�x͋3ޠ��_�
Dd��@i*г�La6�͘
bv���V���8:�9IoM�*h�|F�T�>�Ѱ�s��R�ʘ
�C��8Ē�Nu��)΋$��g􍢙ͻ�i��N�s�;��<����j�Ӎ8R�8�[>Au�Y�ʼn�
��ȟ#�>q�Q�'{3h�AӲ��n�{'��jq��]_�;��0�/�Q��H1��ߵY�uC1�(gn�-t�9�څ�DP%=?���H���7��r،p�!�L�	����X����Y7��D�
V�
�R@�(�F�:�\��;��^�^��wh�o�"��46�
�L�euP�Κ^�|
[t��
�б!�e��8Ɇ ��ct��� �l�l�J*P
h�W�W��.�֒l�mv5U���*[�^6B��N��<�aj�z�<�^�ppB�P7�q�lMw���#��3�O�wn�y��������(���A���I:��p�*]yr�t����H�7�p
���h��wjك=ٚ��%�.ֶd�����of�+�9���h�7q��;9����O�sIEND�B`�templates/isis/js/application.js000060400000000274152453623440012775 0ustar00$('.dropdown-toggle').dropdown()
$('.collapse').collapse('show')
$('#myModal').modal('hide')
$('.typeahead').typeahead()
$('.tabs').button()
$('.tip').tooltip()
$(".alert-message").alert()templates/isis/js/template.js000060400000027044152453623440012311 0ustar00/**
 * @package     Joomla.Administrator
 * @subpackage  Templates.isis
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 * @since       3.0
 */

jQuery(function($)
{
	'use strict';

	var $w = $(window);

	$(document.body)
		// add color classes to chosen field based on value
		.on('liszt:ready', 'select[class^="chzn-color"], select[class*=" chzn-color"]', function() {
			var $select = $(this);
			var cls = this.className.replace(/^.(chzn-color[a-z0-9-_]*)$.*/, '$1');
			var $container = $select.next('.chzn-container').find('.chzn-single');

			$container.addClass(cls).attr('rel', 'value_' + $select.val());
			$select.on('change click', function() {
				$container.attr('rel', 'value_' + $select.val());
			});
		})
		// Handle changes to (radio) button groups
		.on('change', '.btn-group input:radio', function () {
			var $this = $(this);
			var $group = $this.closest('.btn-group');
			var name = $this.prop('name');
			var reversed = $group.hasClass('btn-group-reversed');

			$group.find('input:radio[name="' + name + '"]').each(function () {
				var $input = $(this);
				// Get the enclosing label
				var $label = $input.closest('label');
				var inputId = $input.attr('id');
				var inputVal = $input.val();
				var btnClass = 'primary';

				// Include any additional labels for this control
				if (inputId) {
					$label = $label.add($('label[for="' + inputId + '"]'));
				}

				if ($input.prop('checked')) {
					if (inputVal != '') {
						btnClass = (inputVal == 0 ? !reversed : reversed) ? 'danger' : 'success';
					}

					$label.addClass('active btn-' + btnClass);
				} else {
					$label.removeClass('active btn-success btn-danger btn-primary');
				}
			})
		})
		.on('subform-row-add', initTemplate);

	initTemplate();

	// Called once on domready, again when a subform row is added
	function initTemplate(event, container)
	{
		var $container = $(container || document);

		// Create tooltips
		$container.find('*[rel=tooltip]').tooltip();

		// Turn radios into btn-group
		$container.find('.radio.btn-group label').addClass('btn');

		// Handle disabled, prevent clicks on the container, and add disabled style to each button
		$container.find('fieldset.btn-group:disabled').each(function() {
			$(this).css('pointer-events', 'none').off('click').find('.btn').addClass('disabled');
		});

		// Setup coloring for buttons
		$container.find('.btn-group input:checked').each(function() {
			var $input  = $(this);
			var $label = $('label[for=' + $input.attr('id') + ']');
			var btnClass = 'primary';

			if ($input.val() != '')
			{
				var reversed = $input.parent().hasClass('btn-group-reversed');
				btnClass = ($input.val() == 0 ? !reversed : reversed) ? 'danger' : 'success';
			}

			$label.addClass('active btn-' + btnClass);
		});
	}


	/**
	 * Append submenu items to empty UL on hover allowing a scrollable dropdown
	 */
	if ($w.width() > 767)
	{
		var menuScroll = $('#menu > li > ul'),
			emptyMenu  = $('#nav-empty'),
			linkWidth,
			menuWidth,
			offsetLeft;

		$('#menu > li').on('click mouseenter', function() {

			// Set max-height (and width if scroll) for dropdown menu, depending of window height
			var $self            = $(this),
				$dropdownMenu    = $self.children('ul'),
				windowHeight     = $w.height(),
				linkHeight       = $self.outerHeight(true),
				statusHeight     = $('#status').outerHeight(true),
				menuHeight       = $dropdownMenu.height(),
				menuOuterHeight  = $dropdownMenu.outerHeight(true),
				scrollMenuWidth  = $dropdownMenu.width() + 15,
				maxHeight        = windowHeight - (linkHeight + statusHeight + (menuOuterHeight - menuHeight) + 20),
				linkPaddingLeft  = $self.children('a').css('padding-left');

			if (maxHeight < menuHeight)
			{
				$dropdownMenu.css('width', scrollMenuWidth);
			}
			else if (maxHeight > menuHeight)
			{
				$dropdownMenu.css('width', 'auto');
			}

			$dropdownMenu.css('max-height', maxHeight);

			// Get the submenu position
			linkWidth   = $self.outerWidth(true);
			menuWidth   = $dropdownMenu.width();
			offsetLeft  = Math.round($self.offset().left) - parseInt(linkPaddingLeft);

			emptyMenu.empty().hide();

		});

		menuScroll.find('.dropdown-submenu > a').on('mouseover', function() {

			var $self           = $(this),
				dropdown        = $self.next('ul'),
				submenuWidth    = dropdown.outerWidth(),
				offsetTop       = $self.offset().top,
				linkPaddingTop  = parseInt(dropdown.css('padding-top')) + parseInt($self.css('padding-top')),
				scroll          = $w.scrollTop() + linkPaddingTop;

			// Set the submenu position
			if ($('html').attr('dir') == 'rtl')
			{
				emptyMenu.css({
					top : offsetTop - scroll,
					left: offsetLeft - (menuWidth - linkWidth) - submenuWidth
				});
			}
			else
			{
				emptyMenu.css({
					top : offsetTop - scroll,
					left: offsetLeft + menuWidth
				});
			}

			// Append items to empty <ul> and show it
			dropdown.hide();
			emptyMenu.show().html(dropdown.html());

			// Check if the full element is visible. If not, adjust the position
			if (emptyMenu.Jvisible() !== true)
			{
				emptyMenu.css({
					top : ($w.height() - emptyMenu.outerHeight()) - $('#status').height()
				});
			}

		});

		menuScroll.find('a.no-dropdown').on('mouseenter', function() {

			emptyMenu.empty().hide();

		});

		// obtain a reference to the original handler
		var _clearMenus = $._data(document, 'events').click.filter(function (el) {
			return el.namespace === 'data-api.dropdown' && el.selector === undefined
		})[0].handler;

		// disable the old listener
		$(document)
			.off('click.data-api.dropdown', _clearMenus)
			.on('click.data-api.dropdown', function(e) {
				e.button === 2 || _clearMenus();

				if (!$('#menu').find('> li').hasClass('open'))
				{
					emptyMenu.empty().hide();
				}
			});

		$.fn.Jvisible = function(partial,hidden)
		{
			if (this.length < 1)
			{
				return;
			}

			var $t = this.length > 1 ? this.eq(0) : this,
				t  = $t.get(0)

			var viewTop         = $w.scrollTop(),
				viewBottom      = (viewTop + $w.height()) - $('#status').height(),
				offset          = $t.offset(),
				_top            = offset.top,
				_bottom         = _top + $t.height(),
				compareTop      = partial === true ? _bottom : _top,
				compareBottom   = partial === true ? _top : _bottom;

			return !!t.offsetWidth * t.offsetHeight && ((compareBottom <= viewBottom) && (compareTop >= viewTop));
		};

	}

	/**
	 * USED IN: All views with toolbar and sticky bar enabled
	 */
	var navTop;
	var isFixed = false;

	if (document.getElementById('isisJsData') && document.getElementById('isisJsData').getAttribute('data-tmpl-sticky') == "true") {
		processScrollInit();
		processScroll();

		$(window).on('resize', processScrollInit);
		$(window).on('scroll', processScroll);
	}

	function processScrollInit() {
		if ($('.subhead').length) {
			navTop = $('.subhead').length && $('.subhead').offset().top - parseInt(document.getElementById('isisJsData').getAttribute('data-tmpl-offset'));

			// Fix the container top
			$(".container-main").css("top", $('.subhead').height() + $('nav.navbar').height());

			// Only apply the scrollspy when the toolbar is not collapsed
			if (document.body.clientWidth > 480) {
				$('.subhead-collapse').height($('.subhead').height());
				$('.subhead').scrollspy({offset: {top: $('.subhead').offset().top - $('nav.navbar').height()}});
			}
		}
	}

	function processScroll() {
		if ($('.subhead').length) {
			var scrollTop = $(window).scrollTop();
			if (scrollTop >= navTop && !isFixed) {
				isFixed = true;
				$('.subhead').addClass('subhead-fixed');

				// Fix the container top
				$(".container-main").css("top", $('.subhead').height() + $('nav.navbar').height());
			} else if (scrollTop <= navTop && isFixed) {
				isFixed = false;
				$('.subhead').removeClass('subhead-fixed');
			}
		}
	}

	/**
	 * USED IN: All list views to hide/show the sidebar
	 */
	window.toggleSidebar = function(force)
	{
		var context = 'jsidebar';

		var $sidebar = $('#j-sidebar-container'),
			$main = $('#j-main-container'),
			$message = $('#system-message-container'),
			$debug = $('#system-debug'),
			$toggleSidebarIcon = $('#j-toggle-sidebar-icon'),
			$toggleButtonWrapper = $('#j-toggle-button-wrapper'),
			$toggleButton = $('#j-toggle-sidebar-button'),
			$sidebarToggle = $('#j-toggle-sidebar');

		var openIcon = 'icon-arrow-left-2',
			closedIcon = 'icon-arrow-right-2';

		var $visible = $sidebarToggle.is(":visible");

		if (jQuery(document.querySelector("html")).attr('dir') == 'rtl')
		{
			openIcon = 'icon-arrow-right-2';
			closedIcon = 'icon-arrow-left-2';
		}

		var isComponent = $('body').hasClass('component');

		$sidebar.removeClass('span2').addClass('j-sidebar-container');
		$message.addClass('j-toggle-main');
		$main.addClass('j-toggle-main');
		if (!isComponent) {
			$debug.addClass('j-toggle-main');
		}

		var mainHeight = $main.outerHeight()+30,
			sidebarHeight = $sidebar.outerHeight(),
			bodyWidth = $('body').outerWidth(),
			sidebarWidth = $sidebar.outerWidth(),
			contentWidth = $('#content').outerWidth(),
			contentWidthRelative = contentWidth / bodyWidth * 100,
			mainWidthRelative = (contentWidth - sidebarWidth) / bodyWidth * 100;

		if (force)
		{
			// Load the value from localStorage
			if (typeof(Storage) !== "undefined")
			{
				$visible = localStorage.getItem(context);
			}

			// Need to convert the value to a boolean
			$visible = ($visible == 'true');
		}
		else
		{
			$message.addClass('j-toggle-transition');
			$sidebar.addClass('j-toggle-transition');
			$toggleButtonWrapper.addClass('j-toggle-transition');
			$main.addClass('j-toggle-transition');
			if (!isComponent) {
				$debug.addClass('j-toggle-transition');
			}
		}

		if ($visible)
		{
			$sidebarToggle.hide();
			$sidebar.removeClass('j-sidebar-visible').addClass('j-sidebar-hidden');
			$toggleButtonWrapper.removeClass('j-toggle-visible').addClass('j-toggle-hidden');
			$toggleSidebarIcon.removeClass('j-toggle-visible').addClass('j-toggle-hidden');
			$message.removeClass('span10').addClass('span12');
			$main.removeClass('span10').addClass('span12 expanded');
			$toggleSidebarIcon.removeClass(openIcon).addClass(closedIcon);
			$toggleButton.attr( 'data-original-title', Joomla.JText._('JTOGGLE_SHOW_SIDEBAR') );
			$sidebar.attr('aria-hidden', true);
			$sidebar.find('a').attr('tabindex', '-1');
			$sidebar.find(':input').attr('tabindex', '-1');

			if (!isComponent) {
				$debug.css( 'width', contentWidthRelative + '%' );
			}

			if (typeof(Storage) !== "undefined")
			{
				// Set the last selection in localStorage
				localStorage.setItem(context, true);
			}
		}
		else
		{
			$sidebarToggle.show();
			$sidebar.removeClass('j-sidebar-hidden').addClass('j-sidebar-visible');
			$toggleButtonWrapper.removeClass('j-toggle-hidden').addClass('j-toggle-visible');
			$toggleSidebarIcon.removeClass('j-toggle-hidden').addClass('j-toggle-visible');
			$message.removeClass('span12').addClass('span10');
			$main.removeClass('span12 expanded').addClass('span10');
			$toggleSidebarIcon.removeClass(closedIcon).addClass(openIcon);
			$toggleButton.attr( 'data-original-title', Joomla.JText._('JTOGGLE_HIDE_SIDEBAR') );
			$sidebar.removeAttr('aria-hidden');
			$sidebar.find('a').removeAttr('tabindex');
			$sidebar.find(':input').removeAttr('tabindex');

			if (!isComponent && bodyWidth > 768 && mainHeight < sidebarHeight)
			{
				$debug.css( 'width', mainWidthRelative + '%' );
			}
			else if (!isComponent)
			{
				$debug.css( 'width', contentWidthRelative + '%' );
			}

			if (typeof(Storage) !== "undefined")
			{
				// Set the last selection in localStorage
				localStorage.setItem( context, false );
			}
		}
	}
});
templates/isis/js/classes.js000060400000002164152453623440012127 0ustar00// Add classes

window.onload=function() {
var input = document.getElementsByTagName("input");
for (var i = 0; i < input.length; i++) {
    if (input[i].className == 'button') {
        input[i].className = 'btn btn-primary';
    }
}

var button = document.getElementsByTagName("button");
for (var i = 0; i < input.length; i++) {
    if (button[i].className == 'button') {
        button[i].className = 'btn btn-primary';
    }
}

var p = document.getElementsByTagName("p");
for (var i = 0; i < p.length; i++) {
    if (p[i].className == 'readmore') {
        p[i].className = 'btn';
    }
}

var table = document.getElementsByTagName("table");
for (var i = 0; i < table.length; i++) {
    if (table[i].className == 'category') {
        table[i].className = 'table table-striped';
    }
}

var ul = document.getElementsByTagName("ul");
for (var i = 0; i < ul.length; i++) {
    if (ul[i].className == 'actions') {
        ul[i].className = 'nav nav-pills';
    }
}

var ul = document.getElementsByTagName("ul");
for (var i = 0; i < ul.length; i++) {
    if (ul[i].className == 'pagenav') {
        ul[i].className = 'pagination';
    }
}
}templates/isis/component.php000060400000003311152453623440012226 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Templates.isis
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var JDocumentHtml $this */

$app  = JFactory::getApplication();
$lang = JFactory::getLanguage();

// Output as HTML5
$this->setHtml5(true);

// Add JavaScript Frameworks
JHtml::_('bootstrap.framework');

// Add filter polyfill for IE8
JHtml::_('behavior.polyfill', array('filter'), 'lte IE 9');

// Add template js
JHtml::_('script', 'template.js', array('version' => 'auto', 'relative' => true));

// Add html5 shiv
JHtml::_('script', 'jui/html5.js', array('version' => 'auto', 'relative' => true, 'conditional' => 'lt IE 9'));

// Add Stylesheets
JHtml::_('stylesheet', 'template' . ($this->direction === 'rtl' ? '-rtl' : '') . '.css', array('version' => 'auto', 'relative' => true));

// Load optional RTL Bootstrap CSS
JHtml::_('bootstrap.loadCss', false, $this->direction);

// Load specific language related CSS
JHtml::_('stylesheet', 'administrator/language/' . $lang->getTag() . '/' . $lang->getTag() . '.css', array('version' => 'auto'));

// Load custom.css
JHtml::_('stylesheet', 'custom.css', array('version' => 'auto', 'relative' => true));

// Link color
if ($this->params->get('linkColor'))
{
	$this->addStyleDeclaration('a { color: ' . $this->params->get('linkColor') . '; }');
}
?>
<!DOCTYPE html>
<html lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
<head>
	<jdoc:include type="head" />
</head>
<body class="contentpane component">
	<jdoc:include type="message" />
	<jdoc:include type="component" />
</body>
</html>
templates/isis/language/en-GB/en-GB.tpl_isis.ini000060400000004645152453623440015417 0ustar00; Joomla! Project
; (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

ISIS="Isis Administrator template"
TPL_ISIS_CLEAR_CACHE="Clear Cache"
TPL_ISIS_COLOR_DESC="Choose a colour for the navigation bar."
TPL_ISIS_COLOR_HEADER_DESC="Choose a colour for the header."
TPL_ISIS_COLOR_HEADER_LABEL="Header Colour"
TPL_ISIS_COLOR_LABEL="Nav Bar Colour"
TPL_ISIS_COLOR_LOGIN_BACKGROUND_DESC="Choose a colour for the background of the login screen."
TPL_ISIS_COLOR_LOGIN_BACKGROUND_LABEL="Login Background Colour"
TPL_ISIS_COLOR_SIDEBAR_DESC="Choose a colour for the Sidebar Background."
TPL_ISIS_COLOR_SIDEBAR_LABEL="Sidebar Colour"
TPL_ISIS_COLOR_LINK_DESC="Choose a colour for the Link."
TPL_ISIS_COLOR_LINK_LABEL="Link Colour"
TPL_ISIS_CONTROL_PANEL="Control Panel"
TPL_ISIS_EDIT_ACCOUNT="Edit Account"
TPL_ISIS_FIELD_ADMIN_MENUS_DESC="If you intend to use Joomla Administrator on a monitor, set this to 'No'. It will prevent the collapse of the Administrator menus when reducing the width of the window. Default is 'Yes'."
TPL_ISIS_FIELD_ADMIN_MENUS_LABEL="Collapse Administrator Menu"
TPL_ISIS_HEADER_DESC="Optional display of header."
TPL_ISIS_HEADER_LABEL="Display Header"
TPL_ISIS_INSTALLER="Installer"
TPL_ISIS_ISFREESOFTWARE="Joomla is free software released under the GNU General Public License."
TPL_ISIS_LOGIN_LOGO_DESC="Select or upload a custom logo for the login area of administrator template."
TPL_ISIS_LOGIN_LOGO_LABEL="Login Logo"
TPL_ISIS_LOGO_DESC="Upload a custom logo for the administrator template."
TPL_ISIS_LOGO_LABEL="Logo"
TPL_ISIS_LOGOUT="Logout"
TPL_ISIS_PREVIEW="Preview %s"
TPL_ISIS_SKIP_TO_MAIN_CONTENT="Skip to Main Content"
TPL_ISIS_SKIP_TO_MAIN_CONTENT_HERE="Main content begins here"
TPL_ISIS_STATUS_BOTTOM="Fixed bottom"
TPL_ISIS_STATUS_DESC="Choose the location of the status module."
TPL_ISIS_STATUS_LABEL="Status Module Position"
TPL_ISIS_STATUS_TOP="Top"
TPL_ISIS_STICKY_DESC="Optionally set the toolbar to a fixed (pinned) location."
TPL_ISIS_STICKY_LABEL="Pinned Toolbar"
TPL_ISIS_TOGGLE_MENU="Toggle Navigation"
TPL_ISIS_TOOLBAR="Toolbar"
TPL_ISIS_USERMENU="User Menu"
TPL_ISIS_XML_DESCRIPTION="Continuing the Egyptian god/goddess theme (Khepri from 1.5 and Hathor from 1.6), Isis is the Joomla 3 administrator template based on Bootstrap and the launch of the Joomla User Interface library (JUI)."
templates/isis/language/en-GB/en-GB.tpl_isis.sys.ini000060400000001627152453623440016231 0ustar00; Joomla! Project
; (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

ISIS="Isis Administrator template"
TPL_ISIS_POSITION_BOTTOM="Bottom"
TPL_ISIS_POSITION_CPANEL="Cpanel"
TPL_ISIS_POSITION_CP_SHELL="Unused"
TPL_ISIS_POSITION_DEBUG="Debug"
TPL_ISIS_POSITION_FOOTER="Footer"
TPL_ISIS_POSITION_ICON="Quick Icons"
TPL_ISIS_POSITION_LOGIN="Login"
TPL_ISIS_POSITION_MENU="Menu"
TPL_ISIS_POSITION_POSTINSTALL="Postinstall"
TPL_ISIS_POSITION_STATUS="Status"
TPL_ISIS_POSITION_SUBMENU="Submenu"
TPL_ISIS_POSITION_TITLE="Title"
TPL_ISIS_POSITION_TOOLBAR="Toolbar"
TPL_ISIS_XML_DESCRIPTION="Continuing the Egyptian god/goddess theme (Khepri from 1.5 and Hathor from 1.6), Isis is the Joomla 3 administrator template based on Bootstrap and the launch of the Joomla User Interface library (JUI)."
templates/isis/html/com_media/medialist/thumbs_folders.php000060400000003142152453623440020102 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

?>
<?php foreach ($this->folders as $i => $folder) : ?>
	<li class="imgOutline thumbnail height-80 width-80 center">
		<?php if ($this->canDelete):?>
			<a class="close delete-item" target="_top" href="index.php?option=com_media&amp;task=folder.delete&amp;tmpl=index&amp;<?php echo JSession::getFormToken(); ?>=1&amp;folder=<?php echo rawurlencode($this->state->folder); ?>&amp;rm[]=<?php echo $this->escape($folder->name); ?>" rel="<?php echo $this->escape($folder->name); ?> :: <?php echo $this->escape($folder->files) + $this->escape($folder->folders); ?>" title="<?php echo JText::_('JACTION_DELETE');?>">&#215;</a>
			<div class="pull-left">
				<?php echo JHtml::_('grid.id', $i, $this->escape($folder->name), false, 'rm', 'cb-folder'); ?>
			</div>
			<div class="clearfix"></div>
		<?php endif;?>

		<div class="height-50">
			<a href="index.php?option=com_media&amp;view=mediaList&amp;tmpl=component&amp;folder=<?php echo rawurlencode($folder->path_relative); ?>" target="folderframe">
				<span class="icon-folder-2"></span>
			</a>
		</div>

		<div class="small">
			<a href="index.php?option=com_media&amp;view=mediaList&amp;tmpl=component&amp;folder=<?php echo rawurlencode($folder->path_relative); ?>" target="folderframe">
				<?php echo JHtml::_('string.truncate', $this->escape($folder->name), 10, false); ?>
			</a>
		</div>
	</li>
<?php endforeach; ?>
templates/isis/html/com_media/medialist/thumbs_imgs.php000060400000004010152453623440017376 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

$params     = new Registry;
$dispatcher = JEventDispatcher::getInstance();
?>

<?php foreach ($this->images as $i => $img) : ?>
	<?php $dispatcher->trigger('onContentBeforeDisplay', array('com_media.file', &$img, &$params, 0)); ?>
	<li class="imgOutline thumbnail center">

		<?php if ($this->canDelete):?>
		<div class="imgDelete">
			<a class="close delete-item" target="_top"
			href="index.php?option=com_media&amp;task=file.delete&amp;tmpl=index&amp;<?php echo JSession::getFormToken(); ?>=1&amp;folder=<?php echo rawurlencode($this->state->folder); ?>&amp;rm[]=<?php echo $this->escape($img->name); ?>"
			rel="<?php echo $this->escape($img->name); ?>" title="<?php echo JText::_('JACTION_DELETE'); ?>"><span class="icon-delete"> </span></a>
		</div>
		<?php endif; ?>

		<div class="imgThumb imgInput">
			<?php if ($this->canDelete):?>
			<?php echo JHtml::_('grid.id', $i, $this->escape($img->name), false, 'rm', 'cb-image'); ?>
			<?php endif; ?>
			<label for="cb-image<?php echo $i ?>">
				<?php echo JHtml::_('image', COM_MEDIA_BASEURL . '/' . $this->escape($img->path_relative), JText::sprintf('COM_MEDIA_IMAGE_TITLE', $this->escape($img->title), JHtml::_('number.bytes', $img->size)), array('width' => $img->width_60, 'height' => $img->height_60)); ?>
			</label>
		</div>

		<div class="imgPreview nowrap small">
			<a href="<?php echo COM_MEDIA_BASEURL . '/' . str_replace('%2F', '/', rawurlencode($img->path_relative)); ?>" title="<?php echo $this->escape($img->name); ?>" class="preview truncate">
				<span class="icon-search" aria-hidden="true"></span><?php echo $this->escape($img->name); ?>
			</a>
		</div>
	</li>
	<?php $dispatcher->trigger('onContentAfterDisplay', array('com_media.file', &$img, &$params, 0)); ?>
<?php endforeach; ?>
templates/isis/html/com_media/imageslist/default_folder.php000060400000001527152453623440020234 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$input = JFactory::getApplication()->input;
?>
<li class="imgOutline thumbnail height-80 width-80 center">
	<a href="index.php?option=com_media&amp;view=imagesList&amp;tmpl=component&amp;folder=<?php echo rawurlencode($this->_tmp_folder->path_relative); ?>&amp;asset=<?php echo $input->getCmd('asset');?>&amp;author=<?php echo $input->getCmd('author');?>" target="imageframe">
		<div class="imgFolder">
			<span class="icon-folder-2"></span>
		</div>
		<div class="small">
			<?php echo JHtml::_('string.truncate', $this->escape($this->_tmp_folder->name), 10, false); ?>
		</div>
	</a>
</li>
templates/isis/html/com_media/imageslist/default_image.php000060400000002553152453623440020043 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

$params     = new Registry;
$dispatcher = JEventDispatcher::getInstance();
$dispatcher->trigger('onContentBeforeDisplay', array('com_media.file', &$this->_tmp_img, &$params, 0));
?>

<li class="imgOutline thumbnail height-80 width-80 center">
	<a class="img-preview" href="javascript:ImageManager.populateFields('<?php echo $this->escape($this->_tmp_img->path_relative); ?>')" title="<?php echo $this->escape($this->_tmp_img->name); ?>" >
		<div class="imgThumb">
			<div class="imgThumbInside">
			<?php echo JHtml::_('image', $this->baseURL . '/' . $this->escape($this->_tmp_img->path_relative), JText::sprintf('COM_MEDIA_IMAGE_TITLE', $this->escape($this->_tmp_img->title), JHtml::_('number.bytes', $this->_tmp_img->size)), array('width' => $this->_tmp_img->width_60, 'height' => $this->_tmp_img->height_60)); ?>
			</div>
		</div>
		<div class="imgDetails small">
			<?php echo JHtml::_('string.truncate', $this->escape($this->_tmp_img->name), 10, false); ?>
		</div>
	</a>
</li>
<?php
$dispatcher->trigger('onContentAfterDisplay', array('com_media.file', &$this->_tmp_img, &$params, 0));
templates/isis/html/editor_content.css000060400000002001152453623440014204 0ustar00body {
        background: #000;
        font-family: Arial,sans-serif;
        line-height: 1.3em;
        font-size: 96%;
        color: #333;
}

h1 {
        font-family:Helvetica ,Arial,sans-serif;
        font-size: 16px;
        font-weight: bold;
        color: #ff0000;
}

h2 {
        font-family: Arial, Helvetica,sans-serif;
        font-size: 14px;
        font-weight: normal;
        color: #333;
}

h3 {
  font-weight: bold;
  font-family: Helvetica,Arial,sans-serif;
  font-size: 19px;
  color: #135cae;
}

h4 {
        font-weight: bold;
        font-family: Arial, Helvetica, sans-serif;
        color: #333;
}

a:link, a:visited {
        color: #1B57B1; text-decoration: none;
        font-weight: normal;
}

a:hover {
        color: #00c;        text-decoration: underline;
        font-weight: normal;
}

div.caption       { padding: 0 10px 0 10px; }
div.caption img   { border: 1px solid #CCC; }
div.caption p     { font-size: .90em; color: #666; text-align: center; }

div.teaser { background:#ccc; }
templates/isis/html/pagination.php000060400000011737152453623440013334 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.Isis
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * This is a file to add template specific chrome to pagination rendering.
 *
 * pagination_list_footer
 * 	Input variable $list is an array with offsets:
 * 		$list[limit]		: int
 * 		$list[limitstart]	: int
 * 		$list[total]		: int
 * 		$list[limitfield]	: string
 * 		$list[pagescounter]	: string
 * 		$list[pageslinks]	: string
 *
 * pagination_list_render
 * 	Input variable $list is an array with offsets:
 * 		$list[all]
 * 			[data]		: string
 * 			[active]	: boolean
 * 		$list[start]
 * 			[data]		: string
 * 			[active]	: boolean
 * 		$list[previous]
 * 			[data]		: string
 * 			[active]	: boolean
 * 		$list[next]
 * 			[data]		: string
 * 			[active]	: boolean
 * 		$list[end]
 * 			[data]		: string
 * 			[active]	: boolean
 * 		$list[pages]
 * 			[{PAGE}][data]		: string
 * 			[{PAGE}][active]	: boolean
 *
 * pagination_item_active
 * 	Input variable $item is an object with fields:
 * 		$item->base	: integer
 * 		$item->link	: string
 * 		$item->text	: string
 *
 * pagination_item_inactive
 * 	Input variable $item is an object with fields:
 * 		$item->base	: integer
 * 		$item->link	: string
 * 		$item->text	: string
 *
 * This gives template designers ultimate control over how pagination is rendered.
 *
 * NOTE: If you override pagination_item_active OR pagination_item_inactive you MUST override them both
 */


/**
 * Renders the pagination list
 *
 * @param   array  $list  Array containing pagination information
 *
 * @return  string  HTML markup for the full pagination object
 *
 * @since   3.0
 */
function pagination_list_render($list)
{
	// Calculate to display range of pages
	$currentPage = 1;
	$range = 1;
	$step = 5;
	foreach ($list['pages'] as $k => $page)
	{
		if (!$page['active'])
		{
			$currentPage = $k;
		}
	}
	if ($currentPage >= $step)
	{
		if ($currentPage % $step == 0)
		{
			$range = ceil($currentPage / $step) + 1;
		}
		else
		{
			$range = ceil($currentPage / $step);
		}
	}

	$html = '<ul class="pagination-list">';
	$html .= $list['start']['data'];
	$html .= $list['previous']['data'];

	foreach ($list['pages'] as $k => $page)
	{
		$html .= $page['data'];
	}

	$html .= $list['next']['data'];
	$html .= $list['end']['data'];

	$html .= '</ul>';
	return $html;
}

/**
 * Renders an active item in the pagination block
 *
 * @param   JPaginationObject  $item  The current pagination object
 *
 * @return  string  HTML markup for active item
 *
 * @since   3.0
 */
function pagination_item_active(&$item)
{
	$class = '';

	// Check for "Start" item
	if ($item->text == JText::_('JLIB_HTML_START'))
	{
		$display = '<span class="icon-first"></span>';
	}

	// Check for "Prev" item
	if ($item->text == JText::_('JPREV'))
	{
		$item->text = JText::_('JPREVIOUS');
		$display = '<span class="icon-previous"></span>';
	}

	// Check for "Next" item
	if ($item->text == JText::_('JNEXT'))
	{
		$display = '<span class="icon-next"></span>';
	}

	// Check for "End" item
	if ($item->text == JText::_('JLIB_HTML_END'))
	{
		$display = '<span class="icon-last"></span>';
	}

	// If the display object isn't set already, just render the item with its text
	if (!isset($display))
	{
		$display = $item->text;
		$class   = ' class="hidden-phone"';
	}

	if ($item->base > 0)
	{
		$limit = 'limitstart.value=' . $item->base;
	}
	else
	{
		$limit = 'limitstart.value=0';
	}

	$title = '';
	if (!is_numeric($item->text))
	{
		JHtml::_('bootstrap.tooltip');
		$title = ' class="hasTooltip" title="' . $item->text . '"';
	}

	return '<li' . $class . '><a' . $title . ' href="#" onclick="document.adminForm.' . $item->prefix . $limit . '; Joomla.submitform();return false;">' . $display . '</a></li>';
}

/**
 * Renders an inactive item in the pagination block
 *
 * @param   JPaginationObject  $item  The current pagination object
 *
 * @return  string  HTML markup for inactive item
 *
 * @since   3.0
 */
function pagination_item_inactive(&$item)
{
	// Check for "Start" item
	if ($item->text == JText::_('JLIB_HTML_START'))
	{
		return '<li class="disabled"><a><span class="icon-first"></span></a></li>';
	}

	// Check for "Prev" item
	if ($item->text == JText::_('JPREV'))
	{
		return '<li class="disabled"><a><span class="icon-previous"></span></a></li>';
	}

	// Check for "Next" item
	if ($item->text == JText::_('JNEXT'))
	{
		return '<li class="disabled"><a><span class="icon-next"></span></a></li>';
	}

	// Check for "End" item
	if ($item->text == JText::_('JLIB_HTML_END'))
	{
		return '<li class="disabled"><a><span class="icon-last"></span></a></li>';
	}

	// Check if the item is the active page
	if (isset($item->active) && $item->active)
	{
		return '<li class="active hidden-phone"><a>' . $item->text . '</a></li>';
	}

	// Doesn't match any other condition, render a normal item
	return '<li class="disabled hidden-phone"><a>' . $item->text . '</a></li>';
}
templates/isis/html/mod_version/default.php000060400000000573152453623440015147 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_version
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<?php if (!empty($version)) : ?>
	<?php echo $version; ?>
	<?php echo '&nbsp;&mdash;&nbsp;'; ?>
<?php endif; ?>
templates/isis/html/modules.php000060400000004030152453623440012637 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Templates.isis
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * This is a file to add template specific chrome to module rendering.  To use it you would
 * set the style attribute for the given module(s) include in your template to use the style
 * for each given modChrome function.
 *
 * eg.  To render a module mod_test in the submenu style, you would use the following include:
 * <jdoc:include type="module" name="test" style="submenu" />
 *
 * This gives template designers ultimate control over how modules are rendered.
 *
 * NOTICE: All chrome wrapping methods should be named: modChrome_{STYLE} and take the same
 * two arguments.
 */

/*
 * Module chrome for rendering the module in a submenu
 */
function modChrome_title($module, &$params, &$attribs)
{
	if ($module->content)
	{
		echo '<div class="module-title"><h6>' . $module->title . '</h6></div>';
		echo $module->content;
	}
}

function modChrome_no($module, &$params, &$attribs)
{
	if ($module->content)
	{
		echo $module->content;
	}
}

function modChrome_well($module, &$params, &$attribs)
{
	if ($module->content)
	{
		$moduleTag     = $params->get('module_tag', 'div');
		$bootstrapSize = (int) $params->get('bootstrap_size');
		$moduleClass   = $bootstrapSize ? ' span' . $bootstrapSize : '';
		$headerTag     = htmlspecialchars($params->get('header_tag', 'h2'), ENT_COMPAT, 'UTF-8');

		// Temporarily store header class in variable
		$headerClass   = $params->get('header_class');
		$headerClass   = $headerClass ? ' ' . htmlspecialchars($headerClass, ENT_COMPAT, 'UTF-8') : '';

		echo '<' . $moduleTag . ' class="well well-small' . $moduleClass . '">';

			if ($module->showtitle)
			{
				echo '<' . $headerTag . ' class="module-title nav-header' . $headerClass . '">' . $module->title . '</' . $headerTag . '>';
			}

			echo $module->content;
		echo '</' . $moduleTag . '>';
	}
}
templates/isis/html/layouts/joomla/pagination/links.php000060400000003705152453623440017431 0ustar00<?php
/**
 * @package     Joomla.Site
 * @subpackage  Layout
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

$list = $displayData['list'];
$pages = $list['pages'];
$pagesTotal = $list['pagesTotal'];

$options = new Registry($displayData['options']);

$showLimitBox   = $options->get('showLimitBox', 0);
$showPagesLinks = $options->get('showPagesLinks', true);
$showLimitStart = $options->get('showLimitStart', true);
?>

<div class="pagination pagination-toolbar clearfix">

	<?php if ($showLimitBox) : ?>
		<div class="limit pull-right">
			<?php echo $list['limitfield']; ?>
		</div>
	<?php endif; ?>

	<?php if ($showPagesLinks && (!empty($pages))) : ?>
		<nav role="navigation" aria-label="<?php echo JText::_('JLIB_HTML_PAGINATION'); ?>">
			<ul class="pagination-list">
				<?php
					$pages['start']['pagOptions'] = array('addText' => ' (' . JText::sprintf('JLIB_HTML_PAGE_CURRENT_OF_TOTAL', 1, $pagesTotal) . ')');
					echo JLayoutHelper::render('joomla.pagination.link', $pages['start']);
					echo JLayoutHelper::render('joomla.pagination.link', $pages['previous']); ?>
				<?php foreach ($pages['pages'] as $page) :
					$page['pagOptions'] = array('liClass' => 'hidden-phone');
				?>
					<?php echo JLayoutHelper::render('joomla.pagination.link', $page); ?>
				<?php endforeach; ?>
				<?php
					echo JLayoutHelper::render('joomla.pagination.link', $pages['next']);
					$pages['end']['pagOptions'] = array('addText' => ' (' . JText::sprintf('JLIB_HTML_PAGE_CURRENT_OF_TOTAL', $pagesTotal, $pagesTotal) . ')');
					echo JLayoutHelper::render('joomla.pagination.link', $pages['end']); ?>
			</ul>
		</nav>
	<?php endif; ?>

	<?php if ($showLimitStart) : ?>
		<input type="hidden" name="<?php echo $list['prefix']; ?>limitstart" value="<?php echo $list['limitstart']; ?>" />
	<?php endif; ?>

</div>
templates/isis/html/layouts/joomla/pagination/link.php000060400000005475152453623440017254 0ustar00<?php
/**
 * @package     Joomla.Site
 * @subpackage  Layout
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var JPaginationObject $item */
$item = $displayData['data'];

if (!empty($displayData['pagOptions']))
{
	$options = new Joomla\Registry\Registry($displayData['pagOptions']);
	$liClass = $options->get('liClass', '');
	$addText = $options->get('addText', '');
}
else
{
	$liClass = $addText = '';
}

$display = $item->text;

switch ((string) $item->text)
{
	// Check for "Start" item
	case JText::_('JLIB_HTML_START') :
		$icon = 'icon-backward icon-first';
		$aria = JText::sprintf('JLIB_HTML_GOTO_POSITION', strtolower($item->text));
		break;

	// Check for "Prev" item
	case JText::_('JPREV') :
		$item->text = JText::_('JPREVIOUS');
		$icon = 'icon-step-backward icon-previous';
		$aria = JText::sprintf('JLIB_HTML_GOTO_POSITION', strtolower($item->text));
		break;

	// Check for "Next" item
	case JText::_('JNEXT') :
		$icon = 'icon-step-forward icon-next';
		$aria = JText::sprintf('JLIB_HTML_GOTO_POSITION', strtolower($item->text));
		break;

	// Check for "End" item
	case JText::_('JLIB_HTML_END') :
		$icon = 'icon-forward icon-last';
		$aria = JText::sprintf('JLIB_HTML_GOTO_POSITION', strtolower($item->text));
		break;

	default:
		$icon = null;
		$aria = JText::sprintf('JLIB_HTML_GOTO_PAGE', $item->text);
		break;
}

$item->text .= $addText ?: '';

if ($icon !== null)
{
	$display = '<span class="' . $icon . '" aria-hidden="true"></span>';
}

if ($displayData['active'])
{
	if ($item->base > 0)
	{
		$limit = 'limitstart.value=' . $item->base;
	}
	else
	{
		$limit = 'limitstart.value=0';
	}

	$cssClasses = array();

	$title = '';

	if (!is_numeric($item->text))
	{
		JHtml::_('bootstrap.tooltip');
		$cssClasses[] = 'hasTooltip';
		$title = ' title="' . $item->text . '" ';
	}

	$onClick = 'document.adminForm.' . $item->prefix . 'limitstart.value=' . ($item->base > 0 ? $item->base : '0') . '; Joomla.submitform();return false;';
}
else
{
	$class = (property_exists($item, 'active') && $item->active) ? 'active' : 'disabled';
	if ($class != 'active')
	{
		$class .= $liClass ? ($class ? ' ' : '') . $liClass : '';
	}
}
?>
<?php if ($displayData['active']) : ?>
	<li<?php echo $liClass ? ' class="' . $liClass . '"' : ''; ?>>
		<a aria-label="<?php echo $aria; ?>" <?php echo $cssClasses ? 'class="' . implode(' ', $cssClasses) . '"' : ''; ?> <?php echo $title; ?> href="#" onclick="<?php echo $onClick; ?>">
			<?php echo $display; ?>
		</a>
	</li>
<?php else : ?>
	<li class="<?php echo $class; ?>">
	<span <?php echo $class == 'active' ? 'aria-current="true" aria-label="' . JText::sprintf('JLIB_HTML_PAGE_CURRENT', $item->text) . '"' : ''; ?>>
		<?php echo $display; ?>
	</span>
	</li>
<?php endif;
templates/isis/html/layouts/joomla/system/message.php000060400000002007152453623440017122 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.Isis
 *
 * @copyright   (C) 2014 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$msgList = $displayData['msgList'];

$alert = array('error' => 'alert-error', 'warning' => '', 'notice' => 'alert-info', 'message' => 'alert-success');
?>
<div id="system-message-container">
	<?php if (is_array($msgList) && $msgList) : ?>
		<?php foreach ($msgList as $type => $msgs) : ?>
			<div class="alert <?php echo isset($alert[$type]) ? $alert[$type] : 'alert-' . $type; ?>">
				<button type="button" class="close" data-dismiss="alert">&times;</button>
				<?php if (!empty($msgs)) : ?>
					<h4 class="alert-heading"><?php echo JText::_($type); ?></h4>
					<?php foreach ($msgs as $msg) : ?>
						<div class="alert-message"><?php echo $msg; ?></div>
					<?php endforeach; ?>
				<?php endif; ?>
			</div>
		<?php endforeach; ?>
	<?php endif; ?>
</div>
templates/isis/html/layouts/joomla/form/field/user.php000060400000010534152453623440017162 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Layout
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

extract($displayData);

/**
 * Layout variables
 * -----------------
 * @var   string   $autocomplete    Autocomplete attribute for the field.
 * @var   boolean  $autofocus       Is autofocus enabled?
 * @var   string   $class           Classes for the input.
 * @var   string   $description     Description of the field.
 * @var   boolean  $disabled        Is this field disabled?
 * @var   string   $group           Group the field belongs to. <fields> 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::_('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&field={field-user-id}&ismoo=0');

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, 'class' => 'field-user-input-name', 'value' => $this->escape($userName)
);

if ($class)
{
	$inputAttributes['class'] .= ' ' . $class;
}

if ($size)
{
	$inputAttributes['size'] = (int) $size;
}

if ($required)
{
	$inputAttributes['required'] = 'required';
}

if (!$readonly)
{
	$inputAttributes['placeholder'] = JText::_('JLIB_FORM_SELECT_USER');
}

?>
<div class="field-user-wrapper"
	 data-url="<?php echo (string) $uri; ?>"
	 data-modal=".modal"
	 data-modal-width="100%"
	 data-modal-height="400px"
	 data-input=".field-user-input"
	 data-input-name=".field-user-input-name"
	 data-button-select=".button-select">
	<div class="input-append">
		<input <?php echo ArrayHelper::toString($inputAttributes); ?> readonly />
		<?php if (!$readonly) : ?>
			<button
				type="button"
				class="btn btn-primary button-select"
				title="<?php echo JText::_('JLIB_FORM_CHANGE_USER'); ?>"
				aria-label="<?php echo JText::_('JLIB_FORM_CHANGE_USER'); ?>"
				>
				<span class="icon-user" aria-hidden="true"></span>
			</button>
			<?php echo JHtml::_(
				'bootstrap.renderModal',
				'userModal_' . $id,
				array(
					'title'       => JText::_('JLIB_FORM_CHANGE_USER'),
					'closeButton' => true,
					'footer'      => '<button type="button" class="btn" data-dismiss="modal">' . JText::_('JCANCEL') . '</button>',
				)
			); ?>
		<?php endif; ?>
	</div>
	<?php if (!$readonly) : ?>
		<input type="hidden" id="<?php echo $id; ?>_id" name="<?php echo $name; ?>" value="<?php echo (int) $value; ?>" class="field-user-input<?php echo $class ? ' ' . $class : ''; ?>" data-onchange="<?php echo $this->escape($onchange); ?>" />
	<?php endif; ?>
</div>
templates/isis/html/layouts/joomla/form/field/media.php000060400000011163152453623440017262 0ustar00<?php
/**
 * @package     Joomla.Admin
 * @subpackage  Layout
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Layout variables
 * ---------------------
 *
 * @var  string   $asset The asset text
 * @var  string   $authorField The label text
 * @var  integer  $authorId The author id
 * @var  string   $class The class text
 * @var  boolean  $disabled True if field is disabled
 * @var  string   $folder The folder text
 * @var  string   $id The label text
 * @var  string   $link The link text
 * @var  string   $name The name text
 * @var  string   $preview The preview image relative path
 * @var  integer  $previewHeight The image preview height
 * @var  integer  $previewWidth The image preview width
 * @var  string   $onchange  The onchange text
 * @var  boolean  $readonly True if field is readonly
 * @var  integer  $size The size text
 * @var  string   $value The value text
 * @var  string   $src The path and filename of the image
 */
extract($displayData);

// The button.
if ($disabled != true)
{
	JHtml::_('bootstrap.tooltip');
}

$attr = '';

// Initialize some field attributes.
$attr .= !empty($class) ? ' class="input-small hasTooltip field-media-input ' . $class . '"' : ' class="input-small hasTooltip field-media-input"';
$attr .= !empty($size) ? ' size="' . $size . '"' : '';

// Initialize JavaScript field attributes.
$attr .= !empty($onchange) ? ' onchange="' . $onchange . '"' : '';

switch ($preview)
{
	case 'no': // Deprecated parameter value
	case 'false':
	case 'none':
		$showPreview = false;
		$showAsTooltip = false;
		break;
	case 'yes': // Deprecated parameter value
	case 'true':
	case 'show':
		$showPreview = true;
		$showAsTooltip = false;
		break;
	case 'tooltip':
	default:
		$showPreview = true;
		$showAsTooltip = true;
		break;
}

// Pre fill the contents of the popover
if ($showPreview)
{
	if ($value && file_exists(JPATH_ROOT . '/' . $value))
	{
		$src = JUri::root() . $value;
	}
	else
	{
		$src = JText::_('JLIB_FORM_MEDIA_PREVIEW_EMPTY');
	}
}

// The URL for the modal
$url    = ($readonly ? ''
	: ($link ?: 'index.php?option=com_media&amp;view=images&amp;tmpl=component&amp;asset='
		. $asset . '&amp;author=' . $authorId)
	. '&amp;fieldid={field-media-id}&amp;ismoo=0&amp;folder=' . $folder);
?>
<div class="field-media-wrapper"
	data-basepath="<?php echo JUri::root(); ?>"
	data-url="<?php echo $url; ?>"
	data-modal=".modal"
	data-modal-width="100%"
	data-modal-height="645px"
	data-input=".field-media-input"
	data-button-select=".button-select"
	data-button-clear=".button-clear"
	data-button-save-selected=".button-save-selected"
	data-preview="<?php echo $showPreview ? 'true' : 'false'; ?>"
	data-preview-as-tooltip="<?php echo $showAsTooltip ? 'true' : 'false'; ?>"
	data-preview-container=".field-media-preview"
	data-preview-width="<?php echo $previewWidth; ?>"
	data-preview-height="<?php echo $previewHeight; ?>"
>
	<?php
	// Render the modal
	echo JHtml::_(
		'bootstrap.renderModal',
		'imageModal_' . $id,
		array(
			'title'       => JText::_('JLIB_FORM_CHANGE_IMAGE'),
			'closeButton' => true,
		)
	);

	JHtml::_('script', 'media/mediafield.min.js', array('version' => 'auto', 'relative' => true));
	?>
	<?php if ($showPreview && $showAsTooltip) : ?>
	<div class="input-prepend input-append">
		<span rel="popover" class="add-on pop-helper field-media-preview"
			title="<?php echo	JText::_('JLIB_FORM_MEDIA_PREVIEW_SELECTED_IMAGE'); ?>" data-content="<?php echo JText::_('JLIB_FORM_MEDIA_PREVIEW_EMPTY'); ?>"
			data-original-title="<?php echo JText::_('JLIB_FORM_MEDIA_PREVIEW_SELECTED_IMAGE'); ?>" data-trigger="hover">
			<span class="icon-eye" aria-hidden="true"></span>
		</span>
	<?php else: ?>
	<div class="input-append">
		<?php endif; ?>
		<input type="text" name="<?php echo $name; ?>" id="<?php echo $id; ?>" value="<?php echo htmlspecialchars($value, ENT_COMPAT, 'UTF-8'); ?>" readonly="readonly"<?php echo $attr; ?>/>
		<?php if ($disabled != true) : ?>
			<button type="button" class="btn button-select"><?php echo JText::_('JLIB_FORM_BUTTON_SELECT'); ?></button>
			<button
				type="button"
				class="btn hasTooltip button-clear"
				title="<?php echo JText::_('JLIB_FORM_BUTTON_CLEAR'); ?>"
				aria-label="<?php echo JText::_('JLIB_FORM_BUTTON_CLEAR'); ?>"
				>
				<span class="icon-remove" aria-hidden="true"></span>
			</button>
		<?php endif; ?>
	</div>
	<?php if ($showPreview && !$showAsTooltip) : ?>
		<div class="field-media-preview" style="width: <?php echo $previewWidth; ?>px; max-height: <?php echo $previewHeight; ?>px;margin-top:10px;"></div>
	<?php endif; ?>
</div>
templates/isis/html/layouts/joomla/toolbar/versions.php000060400000002545152453623440017473 0ustar00<?php
/**
 * @package     Joomla.Site
 * @subpackage  Layout
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Layout variables
 * ---------------------
 *
 * @var  string   $itemId The item id number
 * @var  string   $typeId The type id number
 * @var  string   $title The link text
 * @var  string   $typeAlias The component type
 */
extract($displayData);
JHtml::_('script', 'com_contenthistory/admin-history-versions.js', array('version' => 'auto', 'relative' => true));

$link = 'index.php?option=com_contenthistory&amp;view=history&amp;layout=modal&amp;tmpl=component&amp;item_id='
	. (int) $itemId . '&amp;type_id=' . $typeId . '&amp;type_alias='
	. $typeAlias . '&amp;' . JSession::getFormToken() . '=1';

echo JHtml::_(
	'bootstrap.renderModal',
	'versionsModal',
	array(
		'url'    => $link,
		'title'  => JText::_('COM_CONTENTHISTORY_MODAL_TITLE'),
		'height' => '300px',
		'width'  => '800px',
		'footer' => '<button type="button" class="btn" data-dismiss="modal">'
			. JText::_('JTOOLBAR_CLOSE') . '</button>'
	)
);
?>
<button type="button" onclick="jQuery('#versionsModal').modal('show')" class="btn btn-small" data-toggle="modal">
	<span class="icon-archive" aria-hidden="true"></span><?php echo $title; ?>
</button>
templates/isis/templateDetails.xml000060400000010324152453623440013360 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install PUBLIC "-//Joomla! 2.5//DTD template 1.0//EN" "https://www.joomla.org/xml/dtd/2.5/template-install.dtd">
<extension version="3.1" type="template" client="administrator">
	<name>isis</name>
	<version>1.0</version>
	<creationDate>3/30/2012</creationDate>
	<author>Kyle Ledbetter</author>
	<authorEmail>admin@joomla.org</authorEmail>
	<copyright>(C) 2012 Open Source Matters, Inc.</copyright>
	<description>TPL_ISIS_XML_DESCRIPTION</description>
	<files>
		<filename>component.php</filename>
		<filename>cpanel.php</filename>
		<filename>favicon.ico</filename>
		<filename>index.php</filename>
		<filename>login.php</filename>
		<filename>templateDetails.xml</filename>
		<filename>template_preview.png</filename>
		<filename>template_thumbnail.png</filename>
		<folder>css</folder>
		<folder>html</folder>
		<folder>images</folder>
		<folder>img</folder>
		<folder>js</folder>
		<folder>language</folder>
	<folder>less</folder>
	</files>
	<positions>
		<position>menu</position>
		<position>submenu</position>
		<position>toolbar</position>
		<position>title</position>
		<position>status</position>
		<position>icon</position>
		<position>cp_shell</position>
		<position>cpanel</position>
		<position>bottom</position>
		<position>footer</position>
		<position>login</position>
		<position>debug</position>
	</positions>
	<languages folder="language">
		<language tag="en-GB">en-GB/en-GB.tpl_isis.ini</language>
		<language tag="en-GB">en-GB/en-GB.tpl_isis.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="advanced">

				<field 
					name="templateColor" 
					type="color" 
					label="TPL_ISIS_COLOR_LABEL"
					description="TPL_ISIS_COLOR_DESC" 
					class="" 
					default="#10223E"
					validate="color"
				/>

				<field 
					name="headerColor" 
					type="color" 
					label="TPL_ISIS_COLOR_HEADER_LABEL"
					description="TPL_ISIS_COLOR_HEADER_DESC" 
					class="" 
					default="#1A3867"
					validate="color"
				/>

				<field 
					name="sidebarColor" 
					type="color" 
					label="TPL_ISIS_COLOR_SIDEBAR_LABEL"
					description="TPL_ISIS_COLOR_SIDEBAR_DESC" 
					class="" 
					default="#3071a9"
					validate="color"
				/>

				<field 
					name="linkColor" 
					type="color" 
					label="TPL_ISIS_COLOR_LINK_LABEL"
					description="TPL_ISIS_COLOR_LINK_DESC" 
					class="" 
					default="#3071a9"
					validate="color"
				/>

				<field 
					name="loginBackgroundColor" 
					type="color" 
					label="TPL_ISIS_COLOR_LOGIN_BACKGROUND_LABEL"
					description="TPL_ISIS_COLOR_LOGIN_BACKGROUND_DESC"
					class="" 
					default="#17568C"
					validate="color"
				/>

				<field 
					name="logoFile" 
					type="media" 
					label="TPL_ISIS_LOGO_LABEL"
					description="TPL_ISIS_LOGO_DESC"
					class="" 
					default=""
				 />

				<field 
					name="loginLogoFile" 
					type="media" 
					label="TPL_ISIS_LOGIN_LOGO_LABEL"
					description="TPL_ISIS_LOGIN_LOGO_DESC"
					class="" 
					default=""
				 />

				<field 
					name="admin_menus"
					type="radio"
					label="TPL_ISIS_FIELD_ADMIN_MENUS_LABEL"
					description="TPL_ISIS_FIELD_ADMIN_MENUS_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field 
					name="displayHeader" 
					type="radio"
					label="TPL_ISIS_HEADER_LABEL"
					description="TPL_ISIS_HEADER_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field 
					name="statusFixed" 
					type="list"
					label="TPL_ISIS_STATUS_LABEL"
					description="TPL_ISIS_STATUS_DESC"
					default="1"
					filter="integer"
					>
					<option value="1">TPL_ISIS_STATUS_BOTTOM</option>
					<option value="0">TPL_ISIS_STATUS_TOP</option>
				</field>

				<field 
					name="stickyToolbar" 
					type="radio"
					label="TPL_ISIS_STICKY_LABEL"
					description="TPL_ISIS_STICKY_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

			</fieldset>
		</fields>
	</config>
</extension>
index.php000060400000002771152453623440006377 0ustar00<?php
/**
 * @package    Joomla.Administrator
 *
 * @copyright  (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license    GNU General Public License version 2 or later; see LICENSE.txt
 */

/**
 * Define the application's minimum supported PHP version as a constant so it can be referenced within the application.
 */
define('JOOMLA_MINIMUM_PHP', '5.3.10');

if (version_compare(PHP_VERSION, JOOMLA_MINIMUM_PHP, '<'))
{
	die('Your host needs to use PHP ' . JOOMLA_MINIMUM_PHP . ' or higher to run this version of Joomla!');
}

// Saves the start time and memory usage.
$startTime = microtime(1);
$startMem  = memory_get_usage();

/**
 * Constant that is checked in included files to prevent direct access.
 * define() is used in the installation folder rather than "const" to not error for PHP 5.2 and lower
 */
define('_JEXEC', 1);

if (file_exists(__DIR__ . '/defines.php'))
{
	include_once __DIR__ . '/defines.php';
}

if (!defined('_JDEFINES'))
{
	define('JPATH_BASE', __DIR__);
	require_once JPATH_BASE . '/includes/defines.php';
}

require_once JPATH_BASE . '/includes/framework.php';
require_once JPATH_BASE . '/includes/helper.php';
require_once JPATH_BASE . '/includes/subtoolbar.php';

// Set profiler start time and memory usage and mark afterLoad in the profiler.
JDEBUG ? JProfiler::getInstance('Application')->setStart($startTime, $startMem)->mark('afterLoad') : null;

// Instantiate the application.
$app = JFactory::getApplication('administrator');

// Execute the application.
$app->execute();
help/en-GB/toc.json000060400000012370152453623440010053 0ustar00{"COMPONENTS_ASSOCIATIONS":"COMPONENTS_ASSOCIATIONS","COMPONENTS_ASSOCIATIONS_EDIT":"COMPONENTS_ASSOCIATIONS_EDIT","COMPONENTS_BANNERS_BANNERS":"COMPONENTS_BANNERS_BANNERS","COMPONENTS_BANNERS_BANNERS_EDIT":"COMPONENTS_BANNERS_BANNERS_EDIT","COMPONENTS_BANNERS_CATEGORIES":"COMPONENTS_BANNERS_CATEGORIES","COMPONENTS_BANNERS_CATEGORY_EDIT":"COMPONENTS_BANNERS_CATEGORIES_EDIT","COMPONENTS_BANNERS_CLIENTS":"COMPONENTS_BANNERS_CLIENTS","COMPONENTS_BANNERS_CLIENTS_EDIT":"COMPONENTS_BANNERS_CLIENTS_EDIT","COMPONENTS_BANNERS_TRACKS":"COMPONENTS_BANNERS_TRACKS","COMPONENTS_CONTACTS_CONTACTS":"COMPONENTS_CONTACTS_CONTACTS","COMPONENTS_CONTACTS_CONTACTS_EDIT":"COMPONENTS_CONTACTS_CONTACTS_EDIT","COMPONENTS_CONTACT_CATEGORIES":"COMPONENTS_CONTACT_CATEGORIES","COMPONENTS_CONTACT_CATEGORY_EDIT":"COMPONENTS_CONTACT_CATEGORIES_EDIT","COMPONENTS_CONTENT_CATEGORIES":"COMPONENTS_CONTENT_CATEGORIES","COMPONENTS_CONTENT_CATEGORY_EDIT":"COMPONENTS_CONTENT_CATEGORIES_EDIT","COMPONENTS_FIELDS_FIELDS":"COMPONENTS_FIELDS_FIELDS","COMPONENTS_FIELDS_FIELDS_EDIT":"COMPONENTS_FIELDS_FIELDS_EDIT","COMPONENTS_FIELDS_FIELD_GROUPS":"COMPONENTS_FIELDS_FIELD_GROUPS","COMPONENTS_FIELDS_FIELD_GROUPS_EDIT":"COMPONENTS_FIELDS_FIELD_GROUPS_EDIT","COMPONENTS_FINDER_MANAGE_CONTENT_MAPS":"COMPONENTS_FINDER_MANAGE_CONTENT_MAPS","COMPONENTS_FINDER_MANAGE_INDEXED_CONTENT":"COMPONENTS_FINDER_MANAGE_INDEXED_CONTENT","COMPONENTS_FINDER_MANAGE_SEARCH_FILTERS":"COMPONENTS_FINDER_MANAGE_SEARCH_FILTERS","COMPONENTS_FINDER_MANAGE_SEARCH_FILTERS_EDIT":"COMPONENTS_FINDER_MANAGE_SEARCH_FILTERS_EDIT","COMPONENTS_JOOMLA_UPDATE":"COMPONENTS_JOOMLA_UPDATE","COMPONENTS_MESSAGING_INBOX":"COMPONENTS_MESSAGING_INBOX","COMPONENTS_MESSAGING_READ":"COMPONENTS_MESSAGING_READ","COMPONENTS_MESSAGING_WRITE":"COMPONENTS_MESSAGING_WRITE","COMPONENTS_NEWSFEEDS_CATEGORIES":"COMPONENTS_NEWSFEEDS_CATEGORIES","COMPONENTS_NEWSFEEDS_CATEGORY_EDIT":"COMPONENTS_NEWSFEEDS_CATEGORIES_EDIT","COMPONENTS_NEWSFEEDS_FEEDS":"COMPONENTS_NEWSFEEDS_FEEDS","COMPONENTS_NEWSFEEDS_FEEDS_EDIT":"COMPONENTS_NEWSFEEDS_FEEDS_EDIT","COMPONENTS_REDIRECT_MANAGER":"COMPONENTS_REDIRECT_MANAGER","COMPONENTS_REDIRECT_MANAGER_EDIT":"COMPONENTS_REDIRECT_MANAGER_EDIT","COMPONENTS_SEARCH":"COMPONENTS_SEARCH","COMPONENTS_TAGS_MANAGER":"COMPONENTS_TAGS_MANAGER","COMPONENTS_TAGS_MANAGER_EDIT":"COMPONENTS_TAGS_MANAGER_EDIT","COMPONENTS_WEBLINKS_CATEGORIES":"COMPONENTS_WEBLINKS_CATEGORIES","COMPONENTS_WEBLINKS_CATEGORY_EDIT":"COMPONENTS_WEBLINKS_CATEGORIES_EDIT","COMPONENTS_WEBLINKS_LINKS":"COMPONENTS_WEBLINKS_LINKS","COMPONENTS_WEBLINKS_LINKS_EDIT":"COMPONENTS_WEBLINKS_LINKS_EDIT","CONTENT_ARTICLE_MANAGER":"CONTENT_ARTICLE_MANAGER","CONTENT_ARTICLE_MANAGER_EDIT":"CONTENT_ARTICLE_MANAGER_EDIT","CONTENT_FEATURED_ARTICLES":"CONTENT_FEATURED_ARTICLES","CONTENT_MEDIA_MANAGER":"CONTENT_MEDIA_MANAGER","EXTENSIONS_EXTENSION_MANAGER_DATABASE":"EXTENSIONS_EXTENSION_MANAGER_DATABASE","EXTENSIONS_EXTENSION_MANAGER_DISCOVER":"EXTENSIONS_EXTENSION_MANAGER_DISCOVER","EXTENSIONS_EXTENSION_MANAGER_INSTALL":"EXTENSIONS_EXTENSION_MANAGER_INSTALL","EXTENSIONS_EXTENSION_MANAGER_LANGUAGES":"EXTENSIONS_EXTENSION_MANAGER_LANGUAGES","EXTENSIONS_EXTENSION_MANAGER_MANAGE":"EXTENSIONS_EXTENSION_MANAGER_MANAGE","EXTENSIONS_EXTENSION_MANAGER_UPDATE":"EXTENSIONS_EXTENSION_MANAGER_UPDATE","EXTENSIONS_EXTENSION_MANAGER_WARNINGS":"EXTENSIONS_EXTENSION_MANAGER_WARNINGS","EXTENSIONS_LANGUAGE_MANAGER_CONTENT":"EXTENSIONS_LANGUAGE_MANAGER_CONTENT","EXTENSIONS_LANGUAGE_MANAGER_EDIT":"EXTENSIONS_LANGUAGE_MANAGER_EDIT","EXTENSIONS_LANGUAGE_MANAGER_INSTALLED":"EXTENSIONS_LANGUAGE_MANAGER_INSTALLED","EXTENSIONS_LANGUAGE_MANAGER_OVERRIDES":"EXTENSIONS_LANGUAGE_MANAGER_OVERRIDES","EXTENSIONS_LANGUAGE_MANAGER_OVERRIDES_EDIT":"EXTENSIONS_LANGUAGE_MANAGER_OVERRIDES_EDIT","EXTENSIONS_MODULE_MANAGER":"EXTENSIONS_MODULE_MANAGER","EXTENSIONS_MODULE_MANAGER_EDIT":"EXTENSIONS_MODULE_MANAGER_EDIT","EXTENSIONS_PLUGIN_MANAGER":"EXTENSIONS_PLUGIN_MANAGER","EXTENSIONS_PLUGIN_MANAGER_EDIT":"EXTENSIONS_PLUGIN_MANAGER_EDIT","EXTENSIONS_TEMPLATE_MANAGER_STYLES":"EXTENSIONS_TEMPLATE_MANAGER_STYLES","EXTENSIONS_TEMPLATE_MANAGER_STYLES_EDIT":"EXTENSIONS_TEMPLATE_MANAGER_STYLES_EDIT","EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES":"EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES","EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES_EDIT":"EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES_EDIT","EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES_EDIT_SOURCE":"EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES_EDIT_SOURCE","MENUS_MENU_ITEM_MANAGER":"MENUS_MENU_ITEM_MANAGER","MENUS_MENU_ITEM_MANAGER_EDIT":"MENUS_MENU_ITEM_MANAGER_EDIT","MENUS_MENU_MANAGER":"MENUS_MENU_MANAGER","MENUS_MENU_MANAGER_EDIT":"MENUS_MENU_MANAGER_EDIT","SITE_GLOBAL_CONFIGURATION":"SITE_GLOBAL_CONFIGURATION","SITE_MAINTENANCE_CLEAR_CACHE":"SITE_MAINTENANCE_CLEAR_CACHE","SITE_MAINTENANCE_GLOBAL_CHECK-IN":"SITE_MAINTENANCE_GLOBAL_CHECK-IN","SITE_MAINTENANCE_PURGE_EXPIRED_CACHE":"SITE_MAINTENANCE_PURGE_EXPIRED_CACHE","SITE_SYSTEM_INFORMATION":"SITE_SYSTEM_INFORMATION","START_HERE":"START_HERE","USERS_ACCESS_LEVELS":"USERS_ACCESS_LEVELS","USERS_ACCESS_LEVELS_EDIT":"USERS_ACCESS_LEVELS_EDIT","USERS_DEBUG_USERS":"USERS_DEBUG_USER","USERS_GROUPS_EDIT":"USERS_GROUPS_EDIT","USERS_MASS_MAIL_USERS":"USERS_MASS_MAIL_USERS","USERS_USER_MANAGER_EDIT":"USERS_USER_MANAGER_EDIT","USERS_USER_NOTES":"USERS_USER_NOTES","USERS_USER_NOTES_EDIT":"USERS_USER_NOTES_EDIT"}help/helpsites.xml000060400000000345152453623440010224 0ustar00<?xml version="1.0" encoding="utf-8"?>
<joshelp>
	<sites>
		<site tag="en-GB" url="https://help.joomla.org/proxy?keyref=Help{major}{minor}:{keyref}&amp;lang={langcode}">English (GB) - Joomla help wiki</site>
	</sites>
</joshelp>
language/it-IT/it-IT.com_icagenda.sys.ini000060400000010371152453623440014117 0ustar00; iCagenda
; Copyright (c)2012-2015 Cyril Rezé (Lyr!C) / JoomliC.com - All rights reserved.
; License GNU General Public License version 3 or later <http://www.gnu.org/licenses/gpl.html>
; Note : All ini files need to be saved as UTF-8 - No BOM
;
; ADMIN					: com_icagenda.sys.ini
; Translation Platform	: https://www.transifex.com/projects/p/icagenda/


; Install
ICAGENDA = " iCagenda"
COM_ICAGENDA_INSTALL_THIS_RELEASE = "Installazione della versione di iCagenda : "
COM_ICAGENDA_INSTALL_CACHE_VERSION = "Versione precedentemente installata presente nella cache : "
COM_ICAGENDA_INSTALL_MINIMUM_JOOMLA_VERSION = "Versione minima di Joomla! per consentire l'installazione di iCagenda : "
COM_ICAGENDA_INSTALL_CURRENT_JOOMLA_VERSION = "La tua versione di Joomla! è : "
COM_ICAGENDA_INSTALL_ERROR_JOOMLA_VERSION = "<b>ERRORE</b> : impossibile installare iCagenda su una versione di joomla! anteriore a "
COM_ICAGENDA_INSTALL_INCORRECT_VERSION = "Versione non corretta. Impossibile aggiornare "
COM_ICAGENDA_PREFLIGHT_ = "pre-installazione"
COM_ICAGENDA_WELCOME_1 = "Prima installazione sul vostro sito di <b>iCagenda</b> v "
COM_ICAGENDA_WELCOME_2 = " Installazione completata con successo!<br/>"
COM_ICAGENDA_WELCOME_3 = "Benvenuto !!!<br/>"
COM_ICAGENDA_INSTALL = "Prima installazione sul vostro sito dell'extensione iCagenda - v "
COM_ICAGENDA_UPDATE = "Aggiornato al"
COM_ICAGENDA_POSTFLIGHT= "post-installazione "
COM_ICAGENDA_UNINSTALL = "Disinstallazione avvenuta con successo<br/>Grazie per aver usato <b>iCagenda</b>. Speriamo che tu torni ad usare iCagenda Presto!<br/><br/><i><b><span style='font-size: 11px'>Jooml!C &#8226; iCagenda &#8226; <a href='http://www.joomlic.com' target='_blank'>www.joomlic.com</a></span></b></i>"
COM_ICAGENDA_TO = " VAI "
COM_ICAGENDA_VIDEO_GETTING_STARTED = "Iniziare con iCagenda"
COM_ICAGENDA_VIDEO_TUTORIALS = "Video Tutorials"
COM_ICAGENDA_FOLDER_CREATION = "Creazione di directory"
COM_ICAGENDA_FOLDER = "Directory"
COM_ICAGENDA_CREATED = "Creata!"
COM_ICAGENDA_CREATION_FAILED = "Creazione fallita!"
COM_ICAGENDA_PLEASE_CREATE_MANUALLY = "Crea la directory manualmente"
COM_ICAGENDA_EXISTS = "Directory esistente!"

; Install details of iCagenda features
COM_ICAGENDA_FEATURES_LANGUAGES = "Lingue incluse:"
COM_ICAGENDA_FEATURES_TRANSLATION_PACKS = "Translation Packs :"
COM_ICAGENDA_FEATURES_BACKEND = "<b>Back-End :</b> Gestione categorie, Creazione di eventi, Gestione registrazioni, Newsletter, Gestione Theme pack..."
COM_ICAGENDA_FEATURES_FRONTEND = "<b>Front-End :</b> Elenco degli eventi, Dettaglio eventi, Proponi un evento, Registrazione agli eventi, Condivisione sui social network, GoogleMaps, scelta del thema..."

; iCagenda
COM_ICAGENDA = "iCagenda"
COM_ICAGENDA_MENU = " <i class='icon-calendar-3'></i> <b>!Cagenda</b>"
COM_ICAGENDA_XML_DESCRIPTION = "Componente per la gestione di un Agenda Eventi"
COM_ICAGENDA_DESC = "<i><b><span style='font-size: 11px'>Jooml!C &#8226; iCagenda &#8226; <a href='http://www.joomlic.com' target='_blank'>www.joomlic.com</a></span></b></i>"
COM_ICAGENDA_TITLE_ICAGENDA = "<i class='icon-home-2'></i> Pannello di Controllo"
COM_ICAGENDA_CATEGORIES = "Categorie"
COM_ICAGENDA_MENU_CATEGORIES = "<i class='icon-folder-3'></i> Categorie"
COM_ICAGENDA_CATEGORY_ADD = "Inserisci una categoria"
COM_ICAGENDA_EVENTS = "<i class='icon-calendar-3'></i> Eventi"
COM_ICAGENDA_EVENT_ADD = "Inserisci un Evento"
COM_ICAGENDA_REGISTRATION = "<i class='icon-signup'></i> Registrazioni"
COM_ICAGENDA_MENU_CUSTOMFIELDS = "<i class='icon-list-2'></i> Custom Fields"
COM_ICAGENDA_MENU_FEATURES = "<i class='icon-checkbox'></i> Features"
COM_ICAGENDA_MAIL = "<i class='icon-envelope-opened'></i> Newsletter"
COM_ICAGENDA_LOCATIONS = "Location"
COM_ICAGENDA_INFO = "<i class='icon-info-2'></i> Info"
COM_ICAGENDA_THEMES = "<i class='icon-palette'></i> Themi"

; view
COM_ICAGENDA_SUBMIT_VIEW_DEFAULT_TITLE = "Proponi un Evento"
COM_ICAGENDA_SUBMIT_VIEW_DEFAULT_DESC = "Visualizza un form per proporre eventi da frontend"
COM_ICAGENDA_LIST_VIEW_DEFAULT_TITLE = "Lista Eventi"
COM_ICAGENDA_LIST_VIEW_DEFAULT_DESC = "Consente di visualizzare un elenco di eventi, futuri e/0 passati, filtrati (opzionale) per ubicazione, categoria, ecc ... "
COM_ICAGENDA_LIST_VIEW_SEARCH_TITLE = "Ricerca Evento"
COM_ICAGENDA_LIST_VIEW_SEARCH_DESC = "Visualizza una pagina di ricerca"
language/it-IT/it-IT.plg_search_icagenda.sys.ini000060400000000770152453623440015452 0ustar00; iCagenda
; Copyright (c)2012-2014 Cyril Rezé (Lyr!C) / JoomliC.com - All rights reserved.
; License GNU General Public License version 3 or later <http://www.gnu.org/licenses/gpl.html>
; Note : All ini files need to be saved as UTF-8
;
; ICAGENDA_PLG_SEARCH	: plg_search_icagenda.sys.ini
; Translation Platform	: https://www.transifex.com/projects/p/icagenda/


ICAGENDA_PLG_SEARCH = "Search - iCagenda"
ICAGENDA_PLG_SEARCH_XML_DESCRIPTION = "Il plugin iCagenda Search consente la ricerca di eventi."
language/it-IT/it-IT.com_icagenda.ini000060400000277063152453623440013317 0ustar00; iCagenda
; Copyright (c)2012-2015 Cyril Rezé (Lyr!C) / JoomliC.com - All rights reserved.
; License GNU General Public License version 3 or later <http://www.gnu.org/licenses/gpl.html>
; Note : All ini files need to be saved as UTF-8 - No BOM
;
; ADMIN					: com_icagenda.ini
; Translation Platform	: https://www.transifex.com/projects/p/icagenda/


; iC global strings
ICTITLE="Titolo"
ICDESC="Descrizione"
ICLIST="Lista"
ICCATEGORY="categoria"
ICCATEGORIES="Categorie"
ICDATE="Data"
ICDATES="Date"
ICINFORMATION="Informazioni"

IC_EVENT="Evento"
IC_EVENTS="Eventi"
IC_TIME_START="Ora di inizio"
IC_TIME_END="Ora di fine evento"
IC_NAME="Nome e cognome"
IC_USERNAME="Nik name"
IC_READMORE="Leggi tutto"
IC_DEFAULT="Default"
IC_ARTICLE="Articolo"
IC_CUSTOM_TEXT="Testo Personalizzabile"
IC_USER_GROUPS="User Groups"
IC_MANAGERS="Gestori"
IC_FRONTEND="Front-End"
IC_MORE_INFORMATION="vedi Informazioni"
IC_ONLY_EVENTS_LIST="Solo su Lista Eventi"
IC_ONLY_EVENT_DETAILS="Solo su Dettaglio Eventi"
IC_META="Meta"
IC_FULLDESC="Descrizione completa"
IC_SHORTDESC="Descrizione breve"
IC_AUTO_INTROTEXT="Auto-Introtext"
IC_SHORTDESCRIPTION="Descrizione breve"
IC_SHORT_AND_FULL_DESCRIPTION="Descrizione breve e descrizione completa"
IC_AUTO="Auto"
IC_USERS="Utenti"
IC_NOT_SPECIFIED="Non Specificato"
IC_HIDE_THIS_MESSAGE="Nascondi questo Messaggio"
IC_SELECT_AN_OPTION="Scegli un opzione"
IC_LOADING="Caricamento in corso...."

; Libraries Error Messages
ICAGENDA_CLASS_NOT_FOUND="La classe %s non è stata trovata."
ICAGENDA_CAN_NOT_LOAD="iCagenda non può essere caricato per il seguente motivo(s):"
IC_LIBRARY_NOT_LOADED="La Librertia iC non è installata correttamente o non viene caricata."
ICAGENDA_A_FOLDER_IS_MISSING="La Directory non esiste"
ICAGENDA_IS_NOT_CORRECTLY_INSTALLED="Sembra che l'estensione non è installata correttamente."
ICAGENDA_INSTALL_AGAIN="Per cortesia re-installa il componente iCagenda"
IC_ALTERNATIVELY="Alternative"
IC_PLEASE="Cortesemente"
IC_LIBRARY_CHECK_PLUGIN_AND_LIBRARY="controlla se la libreria <strong>iC Library</strong> ed il <strong>plug-in di sistema iC Library</strong> è installato e abilitato."
ICAGENDA_UTILITIES_FIX_MANUAL="estrarre l'archivio di installazione e copiare la directory %s all'interno della directory %s."
ICAGENDA_INSTALLATION_IS_BROKEN="La vostra installazione di iCagenda è corrotta, si prega di re-installare il componente."

; PHP config error message
COM_ICAGENDA_YOUR_PHP_VERSION_IS="La tua versione di PHP è %s"
COM_ICAGENDA_PHP_VERSION_JOOMLA_RECOMMENDED="La versione raccomandata di PHP da Joomla è %s"
COM_ICAGENDA_PHP_VERSION_ICAGENDA_RECOMMENDATION="Se possibile, si consiglia vivamente di effettuare l'aggiornamento a questa versione minima, per evitare eventuali problemi di bug o errori, questo può accadere nelle prossime versioni di iCagenda"
COM_ICAGENDA_PHP_ERROR_FOPEN="L'impostazione PHP allow_url_fopen è disabilitata. Questa impostazione deve essere abilitata per la copia di immagini remote (URL). In caso contrario, le miniature non potranno essere create dall'indirizzo dell'immagine."
COM_ICAGENDA_PHP_ERROR_FOPEN_COPY_BMP="La funzione PHP allow_url_fopen è disabilitata!"
COM_ICAGENDA_PHP_ERROR_FOPEN_COPY_BMP_INFO="Questa impostazione deve essere attivata per la creazione di miniature da un url che contengono bmp."
COM_ICAGENDA_PHP_ERROR_GD="Sembra che GD non è installato sul vostro server! Questa impostazione deve essere abilitata per generare le miniature."

; Alert messages
COM_ICAGENDA_ICTHUMB_ERROR="Errore"
COM_ICAGENDA_ICTHUMB_ERROR_INFO="Impossibile creare miniature"
COM_ICAGENDA_TRASH_FRONTEND_SUBMITTED_1="Eventi inseriti da frontend, e mai editati. <br /> Primadi eliminare definitivamente questo evento, fai clic su %s, e poi su %s."
COM_ICAGENDA_TRASH_FRONTEND_SUBMITTED="Eventi inseriti da frontend, e mai editati. <br /> Prima di rimuovere definitivamente questi eventi, per ciascuno di essi, cliccare su %s, e poi su %s."
COM_ICAGENDA_TRASH_FRONTEND_REGISTRATION_1="Registrazioni inserite in frontend, e mai modificate.<br />Prima di essere in grado di rimuovere definitivamente questa registrazione, clicca su %s, e quindi %s."
COM_ICAGENDA_TRASH_FRONTEND_REGISTRATION="Registrazioni inserite in frontend, e mai modificate.<br />Prima di poter rimuovere definitivamente tali registrazioni, per ognuno di essi, cliccare su %s, e quindi %s."
COM_ICAGENDA_THEME_PACKS_COMPATIBILITY="Il pacchetto del tema è compatibile"
COM_ICAGENDA_ALERT_EVENTS_FILE_MISSING_DESC="Per utilizzare l'opzione 'Tutte le date' nei pacchetti del tema elencati qui sotto, si dovrà provvedere ad aggiornare questi pacchetti."
COM_ICAGENDA_THEME_PACKS_INCOMPATIBLE_ALERT="Per utilizzare il %s funzionalità con il Theme Pack qui sotto elencati, sarà necessario aggiornare il pacchetto."
COM_ICAGENDA_EVENTS_PHPFILE_MISSING_PACKS_LIST="Lista dei temi incompatibili"
COM_ICAGENDA_ALERT_NO_CATEGORY_PUBLISHED="È necessario pubblicare almeno una categoria per poter essere in grado di aggiungere o modificare un evento."
COM_ICAGENDA_ALERT_S_TEXT_S_EXCEEDS_CHARACTER_LIMIT="Il %s memorizzato nel database supera il limite di caratteri attualmente impostato."
COM_ICAGENDA_ALERT_EDIT_TEXT_TO_FIT_CHAR_LIMIT="Fai attenzione a modificarla in modo che non viene troncata, e si adatti entro il limite massimo di caratteri."
COM_ICAGENDA_ALERT_S_TEXT_S_CURRENTLY_STORED_IN_DATABASE="%s attualmente memorizzato nel database"
COM_ICAGENDA_ALERT_EVENT_SAVE_WARNING="Alias esistente quindi un numero verrà inserito alla fine. È possibile modificare nuovamente l'evento per personalizzare l'alias."

; General
COM_ICAGENDA="iCagenda"
COM_ICAGENDA_COMPONENT_LABEL="iCagenda"
COM_ICAGENDA_COMPONENT_DESC="Componente per la gestione di un'agenda eventi"
COM_ICAGENDA_INFORMATION="Estensione per la gestionie Eventi<br/>Joomla!<sup>&#174;</sup> 2.5 & 3.x"
COM_ICAGENDA_DESC="<table><tr><td><img src='../media/com_icagenda/images/iconicagenda48.png' alt='' /></td><td width='10px'></td><td><big><big><b>iCagenda</b></big>&trade;</big><br/>Estensione per la gestione di Eventi in Joomla!</td></tr></table><br/><br/><i><small>Jooml!C &#8226; iCagenda &#8226; <a href='http://www.joomlic.com' target='_blank'>www.joomlic.com</a></small></i>"
COM_ICAGENDA_FILTER_SEARCH_CATEGORIES_DESC="Cerca nelle categorie"
COM_ICAGENDA_FILTER_SEARCH_EVENTS_DESC="Cerca negli eventi"
COM_ICAGENDA_FILTER_SEARCH_FEATURES_DESC="Cerca nelle features"

; ToS
COM_ICAGENDA_TERMS_OF_SERVICE="Termini del Servizio"
COM_ICAGENDA_TERMS_OF_SERVICE_AGREE="Accetta i termini del servizio"
COM_ICAGENDA_TERMS_OF_SERVICE_NOT_CHECKED_SUBMIT_EVENT="Per inviare un evento è necessario accettare i termini del servizio!"

COM_ICAGENDA_TERMS_IMPORTANT_INFOS="<strong>I PRESENTI TERMINI E CONDIZIONI  SONO FORNITI A SOLO A SCOPO DI ESEMPIO, E NON SONO AFFATTO CONSIDERATE ESAUSTIVE NÉ IN PERFETTA ARMONIA CON LE LEGGI DEL SUO PAESE.</strong><br /> È possibile modificare questo testo utilizzando la funzione integrata in Joomla (vedi: Estensioni> Gestione lingua> Overrides> Nuovo, ricercando il valore % s). <br /> In alternativa, è possibile utilizzare un articolo esistente del tuo sito, oppure creare un contenuto personalizzato. <br /> Ricorda anche di tenere conto delle leggi vigenti in materia di cookie, la tutela della privacy e dei dati personali raccolti."

COM_ICAGENDA_TOS="<li>%s si riserva il diritto di approvare, modificare, rifiutare o rimuovere qualsiasi lista di eventi in questo sito per qualsiasi ragione. </li> <li>È illegale ogni forma di discriminazione in base a sesso, età, razza, convinzioni politiche o religiose non sia prevista una esenzione ai sensi della normativa pertinente. %s non accetteranno eventi inserzioni che appaiono contrarie alla legge. </li><li>Avete letto i Termini di servizio nella sua interezza e comprendere ciò che avete letto. </li><li>L'utente accetta di rispettare da i Termini di servizio stabiliti per questo sito</li>"

COM_ICAGENDA_REGISTRATION_TERMS="<p>Benvenuto in [SITENAME].<br />Utilizzando o accedendo a qualsiasi parte dei servizi , si accettano tutti i termini e le condizioni contenuti nel presente documento e le disposizioni operative legate al sito [SITENAME]. Con questo documento ci riserviamo il diritto e a nostra esclusiva discrezione, di modificare o sostituire, in qualsiasi momento, i termini e le condizioni del presente Regolamento. </p>\n\n\n\nIf you do not agree to any of such terms, conditions, rules, policies or procedures, do not use or access the services. [SITENAME] reserves the right, at its sole discretion, to modify or replace any of the terms or conditions of this TOS at any time.</p><ol><li><strong>YOUR REGISTRATION OBLIGATIONS</strong><br /><p>To be a registered user of the Services, you agree to: (a) provide true, accurate, current and complete information about yourself as prompted by the Site registration form (the "_QQ_"Registration Data"_QQ_"). If you provide any information that is untrue, inaccurate, not current or incomplete, or [SITENAME] has reasonable grounds to suspect that such information is untrue, inaccurate, not current or incomplete, [SITENAME] has the right to suspend or terminate all of your registrations and refuse any and all of your current or future use of the Services (or any portion thereof). [SITENAME] is concerned about the safety and privacy of all its users, particularly children. For this reason, you must be at least 18 years of age, or the legal age of majority where you reside if that jurisdiction has an older age of majority, to register for an event. </p></li><li><strong>PRIVACY</strong><br /><p>Any information submitted or provided by you to the Services may be publicly accessible. You should take care to protect private information or information that is important to you. [SITENAME] shall not be responsible for protecting any such information and is not liable for the protection of privacy of electronic mail or other information transferred through the Internet or any other network that you may use. Please be aware that if you decide to disclose personally identifiable information on the Services, this information may become public. [SITENAME] does not control and shall not be responsible for the acts of you or any other users (whether Organizers, Buyers, other non-Organizers or otherwise) of the Services.</p></li><li><strong>ACCEPTANCE OF TERMS</strong><br /><p>You have read the Terms and Conditions in its entirety and understand what you have read.<br />You agree to abide by the Terms of Service established for this site</p></li></ol>"

; Form
COM_ICAGENDA_FORM_REQUIRED_INFO="Tutti i campi contrassegnati con * (asterisco) sono obbligatori."
COM_ICAGENDA_FORM_NC="Sei pregato di assicurarti che il form sia compilato completamente e con dati validi."
COM_ICAGENDA_FORM_VALIDATE_FIELD_REQUIRED="Campo Richiesto:"
COM_ICAGENDA_FORM_VALIDATE_FIELD_REQUIRED_NAME="Campo richiesto: %s"
COM_ICAGENDA_FORM_VALIDATE_LBL="Form validation"
COM_ICAGENDA_FORM_VALIDATE_DESC="Server side validation is the minimum since everything before that can be overridden on the user side. But client-side is the most user-friendly one, so using both is not a bad idea (especially since the latter is unobtrusive and won't give problems on javascript-disabled or -problematic client browsers)."
COM_ICAGENDA_FORM_SERVER_VALIDATION="Server-Side"
COM_ICAGENDA_FORM_SERVER_CLIENT_VALIDATION="Server-Side & Client-Side"

; Thumbnails
COM_ICAGENDA_THUMB_LARGE_LBL="Large Size"
COM_ICAGENDA_THUMB_LARGE_DESC=""
COM_ICAGENDA_THUMB_MEDIUM_LBL="Medium Size"
COM_ICAGENDA_THUMB_MEDIUM_DESC=""
COM_ICAGENDA_THUMB_SMALL_LBL="Small Size"
COM_ICAGENDA_THUMB_SMALL_DESC=""
COM_ICAGENDA_THUMB_XSMALL_LBL="XSmall Size"
COM_ICAGENDA_THUMB_XSMALL_DESC=""
IC_WIDTH="Larghezza"
IC_HEIGHT="Altezza"
IC_QUALITY="Qualità"
IC_CROPPED="Ritaglio"
IC100="100"
IC95="95"
IC90="90"
IC85="85"
IC80="80"
IC75="75"
IC70="70"
IC60="60"
IC50="50"

; Titles Bar Admin
COM_ICAGENDA_ADMIN_TITLE_ICAGENDA="<div style="_QQ_"float:right"_QQ_"> <img src="_QQ_"../media/com_icagenda/images/iconicagenda36.png"_QQ_" alt="_QQ_"logo"_QQ_" /></div> iCagenda <span style="_QQ_"font-size:14px;"_QQ_">- iCagenda</span>"

; Global Options Component
COM_ICAGENDA_FORM_LABEL="Form"

COM_ICAGENDA_ACCESS_HEADING="Accedi"
COM_ICAGENDA_CONFIGURATION="Parametri ed Autorizzazioni <b>iCagenda</b> "
COM_ICAGENDA_DISPLAY_LABEL="Parametri"
COM_ICAGENDA_DISPLAY_DESC="Opzioni per la visualizzazione da front-end della 'lista eventi' e dei 'dettagli dell'evento'"
COM_ICAGENDA_ADDTHIS="AddThis - Condividi nei Social Networks"
COM_ICAGENDA_ADDTHIS_LABEL="AddThis"
COM_ICAGENDA_ADDTHIS_DESC="Aumentare il traffico ed aiuta i visitatori a condividere gli eventi su Facebook, Twitter e altri social network<br>iCagenda integra il codice di monitoraggio per AddThis dando il modo migliore per condividere i tuoi eventi su tutti i social network.<br><a href="_QQ_"http://www.addthis.com"_QQ_" target="_QQ_"_blank"_QQ_">AddThis.com</a> | <a href="_QQ_"http://www.addthis.com/register"_QQ_" target="_QQ_"_blank"_QQ_">Crea un account adesso</a>"
COM_ICAGENDA_ADDTHIS_NOTE="I profili AddThis consentono agli editori di organizzare e condividere su AddThis dati analitici con i membri del team o clienti."
COM_ICAGENDA_ADDTHIS_ID_LABEL="AddThis ID profilo"
COM_ICAGENDA_ADDTHIS_ID_DESC="ID del tuo profilo (ad esempio: ra-123a456bc789d0ef)"
COM_ICAGENDA_ADDTHIS_LIST_LABEL	= "Lista Eventi"
COM_ICAGENDA_ADDTHIS_LIST_DESC="Visualizza la condivisione sui social network nella pagina elenco eventi "
COM_ICAGENDA_ADDTHIS_EVENT_LABEL="Dettagli Evento"
COM_ICAGENDA_ADDTHIS_EVENT_DESC="Visualizza la condivisione sui social network nella pagina dei dettagli dell'evento"
COM_ICAGENDA_ADDTHIS_FLOAT_LABEL="Rendi la posizione flottante"
COM_ICAGENDA_ADDTHIS_FLOAT_DESC="Posizione flottante per AddThis: a sinistra, a destra, o disabilitata"
COM_ICAGENDA_ADDTHIS_ICON_LABEL="Dimensioni icone"
COM_ICAGENDA_ADDTHIS_ICON_DESC="Dimensioni icone, 16x16 o 32x32 pixel"
COM_ICAGENDA_ADDTHIS_16="<img src="_QQ_"../media/com_icagenda/images/addthis_16x16.png"_QQ_" alt="_QQ_"addthis_16x16"_QQ_" />"
COM_ICAGENDA_ADDTHIS_32="<img src="_QQ_"../media/com_icagenda/images/addthis_32x32.png"_QQ_" alt="_QQ_"addthis_32x32"_QQ_" />"

;Events List
COM_ICAGENDA_LIST_PARAMS_DESC="Opzioni di visualizzazione per il front-end della vista 'lista di eventi'"
COM_ICAGENDA_LIST_PARAMS_LABEL="Parametri visualizzazione lista eventi"

COM_ICAGENDA_LIST_FILTERS="Filtra la lista Eventi"
COM_ICAGENDA_ALL_DATES="Tutte le date di ogni evento"
COM_ICAGENDA_ONLY_NEXT="Solo Date PROSSIME/SUCCESSIVE"
;
COM_ICAGENDA_LIST_TYPE_LBL="Visualizza tutte le date"
COM_ICAGENDA_LIST_TYPE_DESC="Se impostatop su 'SI' (default), tutte le date di ogni evento saranno visualizzate nella lista principale.<br />Su 'NO', verrà visualizzato ogni evento una sola volta nella lista principale, e la data utilizzato per visualizzare l'evento sarà la prossima data (o il periodo corrente a) se l'evento è in corso o imminente, la data passata (o del periodo passato da a) se l'evento è passato."

COM_ICAGENDA_LIST_HEADER="Intestazione"
COM_ICAGENDA_LIST_HEADER_LABEL="Opzioni di visualizzazione"
COM_ICAGENDA_LIST_HEADER_DESC="opzione di visualizzazione per l'intestazione della lista degli eventi"
COM_ICAGENDA_LIST_HEADER_ONLY_TITLE="Solo titolo"
COM_ICAGENDA_LIST_HEADER_ONLY_SUBTITLE="Solo informazioni sottotitoli"
COM_ICAGENDA_LIST_ARROWS_TEXT_LABEL="Visualizza testo successivo/precedente"
COM_ICAGENDA_LIST_ARROWS_TEXT_DESC="Inserisci il testo con indicazioni avanti/indietro nella lista eventi"

COM_ICAGENDA_LIST_PAGINATION_LABEL="Paginazione"
COM_ICAGENDA_LIST_PAGINATION_TEXT_DESC="Visualizza Paginazione"

COM_ICAGENDA_LIST_NAVIGATOR="Scorri la vista eventi"
COM_ICAGENDA_LIST_NAVIGATOR_POSITION_LABEL="Posizione barra navigazione"
COM_ICAGENDA_LIST_NAVIGATOR_POSITION_DESC="Mostra frecce di navigazione prima o dopo la lista eventi"
COM_ICAGENDA_TOP="Alto"
COM_ICAGENDA_BOTTOM="Basso"
COM_ICAGENDA_TOP_AND_BOTTOM="Sopra & Sotto"

; Date Box
COM_ICAGENDA_LIST_DATEBOX="Box data"
COM_ICAGENDA_LIST_DATEBOX_DAY_DISPLAY_LABEL="Giorno"
COM_ICAGENDA_LIST_DATEBOX_DAY_DISPLAY_DESC="Visualiza/nascondi il giorno nel box della data nella lista degli eventi."
COM_ICAGENDA_LIST_DATEBOX_MONTH_DISPLAY_LABEL="Mese"
COM_ICAGENDA_LIST_DATEBOX_MONTH_DISPLAY_DESC="Visualizza/nascondi il Mese nel box della data nella lista degli eventi"
COM_ICAGENDA_LIST_DATEBOX_YEAR_DISPLAY_LABEL="Anno"
COM_ICAGENDA_LIST_DATEBOX_YEAR_DISPLAY_DESC="Visualizza/Nascondi l'Anno nel box della data nella lista degli eventi"
COM_ICAGENDA_LIST_DATEBOX_TIME_DISPLAY_LABEL="Ora"
COM_ICAGENDA_LIST_DATEBOX_TIME_DISPLAY_DESC="Mostra/Nascondi l'ora nella casella data nella lista degli eventi."

; List Information
COM_ICAGENDA_LIST_TITLE_LENGTH_LABEL="Lunghezza Titolo"
COM_ICAGENDA_LIST_TITLE_LENGTH_DESC="Limite dei caratteri del titolo nella lista degli eventi. Se lasciato vuoto, verrà visualizzato il titolo completo."
COM_ICAGENDA_LIST_INFORMATION="Informazioni nella lista degli eventi"
COM_ICAGENDA_LIST_VENUE_DISPLAY_LABEL="Il nome del locale"
COM_ICAGENDA_LIST_VENUE_DISPLAY_DESC="Visualizza/Nascondi il nome del locale nella lista degli eventi"
COM_ICAGENDA_LIST_CITY_DISPLAY_LABEL="Città"
COM_ICAGENDA_LIST_CITY_DISPLAY_DESC="Visualizza/Nascondi il nome della cità nella lista degli eventi"
COM_ICAGENDA_LIST_COUNTRY_DISPLAY_LABEL="Provincia"
COM_ICAGENDA_LIST_COUNTRY_DISPLAY_DESC="Visualizza/Nascondi la provincia nella lista degli eventi"
COM_ICAGENDA_LIST_INTROTEXT_DISPLAY_LABEL="Intro Text"
COM_ICAGENDA_LIST_INTROTEXT_DISPLAY_DESC="Mostra/Nascondi il testo Introduttivo dell'evento nella lista degli eventi.<br /> Se impostato su 'Auto', la descrizione breve verrà mostrata. Se non esiste, iCagenda genererà un testo introduttivo dalla descrizione completa (Auto-introtext), e se la descrizione completa non esiste, il tag meta-description non verrà mostrato. <br /> Se impostato su 'Short Desc' , verrà visualizzata la descrizione breve. <br /> Se impostato su 'Auto-introtext', verrà mostrato il testo generato. <br /> Su 'Nascondi', nessun testo introduttivo verrà mostrato."

; Event Details
COM_ICAGENDA_EVENT_PARAMS_DESC="Opzioni di visualizzazione lato front-end per la vista 'dettagli evento'"
COM_ICAGENDA_EVENT_PARAMS_LABEL="Dettagli evento"

COM_ICAGENDA_EVENT_DESCRIPTION_DISPLAY_LABEL="Testo descrizione"
COM_ICAGENDA_EVENT_DESCRIPTION_DISPLAY_DESC="Descrizione contenuto nei dettagli dell'evento Vista. <br /> Se impostato su 'Auto', iCagenda visualizzerà la descrizione completa se questa esiste, mentre se non esiste, non verrà mostrato niente. <br /> Se impostato su 'Descrizione completa ', la descrizione completa dell'evento verrà mostrata. <br /> Se impostato su 'descrizione breve', verrà visualizzata solo la descrizione breve. <br /> su 'completa descrizione e descrizione breve', verranno visualizzate le descrizioni breve e completa. <br /> su 'nascondi', nessuna descrizione sarà visualizzata."
COM_ICAGENDA_LIST_OF_PARTICIPANTS_LABEL="Lista dei Participanti"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_DESC="Mostra o nascondi la lista dei partecipanti nei dettagli della vista evento"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_SLIDE_LABEL="Effetto Slide"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_SLIDE_DESC="Effetto slide utilizzato per la lista dei partecipanti"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_DISPLAY_LABEL="Opzioni di visualizzazione della lista"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_DISPLAY_DESC="Modifica la visualizzazione della lista dei partecipanti (avatar usa Gravatar.com)<br><b>Full</b>: gravatar + nb nr prenotazioni + data<br><b>Avatar & Username</b>: gravatar e nome di registrazione<br><b>Username</b>: semplice elenco dei nomi degli utenti registrati"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_DISPLAY_FULL="Posti esauriti"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_DISPLAY_AVATAR="Avatar & Username"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_DISPLAY_NAMES="Username"
COM_ICAGENDA_LIST_DISPLAY_FULL_COLUMN_LABEL="Nr di colonne (Completo)"
COM_ICAGENDA_LIST_DISPLAY_FULL_COLUMN_DESC="Selezionare il numero di colonne per la visualizzazione completa della lista dei partecipanti"
COM_ICAGENDA_INFORMATION_LABEL="Dettaglio informazioni"
COM_ICAGENDA_INFORMATION_DESC="Mostra o nascondi le informazioni dei dettagli nella vista Dettagli degli eventi"
COM_ICAGENDA_TARGET_LINK_LABEL="Website URL Target"
COM_ICAGENDA_TARGET_LINK_DESC="Seleziona la modalità di apertura pagina del link"
COM_ICAGENDA_GOOGLE_MAPS_DESC="Mostra o nascondi Google Maps nella vista Dettagli degli eventi"
COM_ICAGENDA_EVENT_DATES="Elenco delle date (pagina dettagli evento)"
COM_ICAGENDA_EVENT_ALL_DATES="Tutte le date"
COM_ICAGENDA_EVENT_ALL_DATES_DESC="Questa è la lista di date per un evento, che viene visualizzato nella pagina dei dettagli della manifestazione."
COM_ICAGENDA_EVENT_SINGLE_DATES_LABEL="Singole Date"
COM_ICAGENDA_EVENT_SINGLE_DATES_DESC="Mostra o nascondi le singole date in 'Tutte le date' (Solo nella pagina dettaglio evento)"
COM_ICAGENDA_EVENT_SINGLE_DATES_LIST_LABEL="Tipo di elenco"
COM_ICAGENDA_EVENT_SINGLE_DATES_LIST_DESC="Selezionare il tipo di elenco per le singole date (Solo per la pagina dettaglio evento)"
COM_ICAGENDA_EVENT_SINGLE_DATES_VERTICAL="Lista Verticale"
COM_ICAGENDA_EVENT_SINGLE_DATES_HORIZONTAL="Lista orizzontale"
COM_ICAGENDA_EVENT_PERIOD_LABEL="Date periodo"
COM_ICAGENDA_EVENT_PERIOD_DESC="Mostra o nascondi le date per il periodo in 'Tutte le date' (Solo per la pagina dettaglio evento)"
COM_ICAGENDA_OVERRIDE_BUTTON_TEXT_DESC="È possibile inserire un testo personalizzato per il pulsante di registrazione. Questo sostituirà il testo principale utilizzato per questo pulsante. Se lasciato vuoto verrà utilizzato "_QQ_"Registrati"_QQ_"."
;
; Register to an event
COM_ICAGENDA_REGISTRATIONS_LABEL="Registrazioni"
COM_ICAGENDA_REGISTRATIONS_DESC="Configurazione globale per la registrazione di eventi"
COM_ICAGENDA_REGISTRATION_ACCESS_LEVEL_DESC="Il gruppo utenti che è autorizzato a visualizzare il modulo di registrazione nel frontend."
COM_ICAGENDA_REGISTRATION_TO_EVENT_DESC="Opzioni per il form di registrazione evento da frontend"
COM_ICAGENDA_REGISTRATION_LIMIT_EMAIL_LABEL="1 registrazione / email"
COM_ICAGENDA_REGISTRATION_LIMIT_EMAIL_DESC="La registrazione è limitata ad un unico indirizzo e-mail"
COM_ICAGENDA_REGISTRATION_LIMIT_DATE_LABEL="1 registrazione / data"
COM_ICAGENDA_REGISTRATION_LIMIT_DATE_DESC="La registrazione per data è limitata ad un unico indirizzo e-mail. Se impostato su 'Sì', l'utente può registrarsi 1 volta, per ogni singola data, con lo stesso indirizzo email."
COM_ICAGENDA_REGISTRATION_JOOMLA_USER_NAME_LABEL="Gli utenti registrati"
COM_ICAGENDA_REGISTRATION_JOOMLA_USER_NAME_DESC="Se il completamento automatico è abilitato, indicare username o il nome utente."
COM_ICAGENDA_REGISTRATION_JOOMLA_USER_AUTOFILL_LABEL="Riempimento automatico Nome e Email"
COM_ICAGENDA_REGISTRATION_JOOMLA_USER_AUTOFILL_DESC="Completa oppure no i campi nome ed email con le informazioni collegate al profilo utente di Joomla."
COM_ICAGENDA_REGISTRATION_EMAIL_FIELD="Form Email"
COM_ICAGENDA_REGISTRATION_EMAIL_DISPLAY_LABEL="Email"
COM_ICAGENDA_REGISTRATION_EMAIL_DISPLAY_DESC="Mostra o nascondi i campi del modulo e-mail"
COM_ICAGENDA_REGISTRATION_EMAIL_CONFIRM_FIELD="Conferma il campo del form email"
COM_ICAGENDA_REGISTRATION_EMAIL_CONFIRM_DISPLAY_LABEL="Conferma email"
COM_ICAGENDA_REGISTRATION_EMAIL_CONFIRM_DISPLAY_DESC="Visualizza o nascondi Conferma il campo del form email"
COM_ICAGENDA_REGISTRATION_EMAIL_REQUIRED_LABEL="Email richiesta"
COM_ICAGENDA_REGISTRATION_EMAIL_REQUIRED_DESC="Imposta se il Email è richiesto durante la registrazione"
COM_ICAGENDA_REGISTRATION_EMAIL_CHECKDNSRR_LABEL="Convalida per email"
COM_ICAGENDA_REGISTRATION_EMAIL_CHECKDNSRR_DESC="Non è richiesta la funzione di convalida email, ma è utile. Questa funzione utilizza la funzione PHP 'checkdnsrr' per verificare il dominio di un indirizzo di posta elettronica e se presente sul server, iCagenda esegue una convalida della mail dell'utente dopo l'invio<br /> <br /> Questo per evitare: <br />- l'invio di email da parte di spammer con domini esistenti ma che non contengono un nome valido<br /> - errori da parte di utenti reali che scrivono in modo errato il loro indirizzo email (errori di battitura) <br /> <br /> Le funzionalità del server sono controllati da iCagenda. Se 'checkdnsrr' non è presente, questa opzione non avrà alcun effetto."
COM_ICAGENDA_REGISTRATION_EMAIL_CHECKDNSRR_NOT_PRESENT_1="La validazione delle email non sarà eseguita su questo server!"
COM_ICAGENDA_REGISTRATION_EMAIL_CHECKDNSRR_NOT_PRESENT_2="L'attivazione di questa funzione non avrà alcun effetto. Richiede "_QQ_"checkdnsrr"_QQ_" da attivare nel sistema rivolgedovi al vostro servizio di hosting."
COM_ICAGENDA_REGISTRATION_PHONE_FIELD="Campo Form per il telefono"
COM_ICAGENDA_REGISTRATION_PHONE_DISPLAY_LABEL="Telefono"
COM_ICAGENDA_REGISTRATION_PHONE_DISPLAY_DESC="Nascondi o visualizza il campo per il telefono"
COM_ICAGENDA_REGISTRATION_PHONE_REQUIRED_LABEL="Numero di telefono richiesto"
COM_ICAGENDA_REGISTRATION_PHONE_REQUIRED_DESC="Imposta se il numero di telefono è richiesto durante la registrazione"
COM_ICAGENDA_REGISTRATION_NOTES_FIELD="Note per i campi del Form"
COM_ICAGENDA_REGISTRATION_NOTES_DISPLAY_LABEL="Note"
COM_ICAGENDA_REGISTRATION_NOTES_DISPLAY_DESC="Visualizza o nascondi le note per i campi del form"

COM_ICAGENDA_TITLE_REGISTRATION_NOTIFICATIONS="Notifiche di Registrazione"

COM_ICAGENDA_NOTIFICATION_BY_EMAIL_ADMIN="Notifica Email ad un amministratore"
COM_ICAGENDA_NOTIFICATION_BY_EMAIL_ADMIN_LBL="Invia Notifica per Email"
COM_ICAGENDA_NOTIFICATION_BY_EMAIL_ADMIN_DESC="Abilita/disabilita l'invio della email di notifica"
COM_ICAGENDA_NOTIFICATION_BY_EMAIL_ADMIN_SELECTION_INFO="Seleziona chi riceverà l'e-mail di notifica quando un nuovo utente si registra ad un evento.<ul><li><b>Email sito:</b>indirizzo di posta elettronica impostato in configurazione globale di Joomla come e-mail predefinita.</li><li><b>Email di contatto:</b>indirizzo e-mail inserito come email di contatto per l'evento.</li><li><b>Lista email personalizzata:</b>gli indirizzi di posta elettronica indicati nella lista personalizzatal.</li></ul>"
COM_ICAGENDA_EMAIL_SITE="Email sito"
COM_ICAGENDA_EMAIL_CREATOR="Crea Email"
COM_ICAGENDA_EMAIL_EVENT_CONTACT="Email di Contatto"
COM_ICAGENDA_EMAIL_CUSTOM_LIST="Lista emails personalizzata"
COM_ICAGENDA_REGISTRATION_EMAIL_ADMIN_CUSTOM_LIST_DESC="Inserire ciascun indirizzo di posta elettronica separato da una virgola"
COM_ICAGENDA_EMAILADMINSEND_PLACEHOLDER="name@mail.com, example@me.com, test@test.com"

COM_ICAGENDA_REGISTRATION_EMAIL_USER="Email di conferma all'utente"
COM_ICAGENDA_CONFIRMATION_BY_EMAIL_USER_LBL="Invia una email di conferma"
COM_ICAGENDA_CONFIRMATION_BY_EMAIL_USER_DESC="Abilita/disabilita l'invio di una mail di conferma alla persona che si iscrive ad un evento."
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_DEFAULT_LABEL="Utilizzo di Default (multi-language)"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_DEFAULT_DESC="Impostare se si utilizza una e-mail di default (tradotto con language pack) o utilizzare una email personalizzata (non traducibile)"
COM_ICAGENDA_CUSTOM_EMAILS="Email personalizzata"

; Custom User Confirmation Email
COM_ICAGENDA_REGISTRATION_EMAIL_USER_NOTICE="È possibile utilizzare i seguenti Tag:<br /><br /><table><tr><td><b>User:</b></td><td width="_QQ_"30"_QQ_"></td><td><b>Website:</b></td><td width="_QQ_"30"_QQ_"></td><td><b>Info evento:</b></td></tr><tr><td valign="_QQ_"top"_QQ_"><ul><li>[NAME]=Nome</li><li>[EMAIL]=Email</li><li>[PHONE]=Telefono</li><li>[PLACES]=Numero di posti</li><li>[CUSTOMFIELDS]=Lista dei campi personalizzati</li><li>[NOTES]=Messaggi</li></ul></td><td width="_QQ_"30"_QQ_"></td><td valign="_QQ_"top"_QQ_"><ul><li>[SITENAME]=Nome del sito</li><li>[SITEURL]=Url del sito</li></ul></td><td width="_QQ_"30"_QQ_"></td><td valign="_QQ_"top"_QQ_"><ul><li>[TITLE]=Titolo</li><li>[EVENTURL]=Link Evento</li><li>[AUTHOR]=Autore</li><li>[AUTHOREMAIL]=Email Autore</li><li>[CONTACTEMAIL]=Contto email per l'evento</li><li>[DATETIME]=Singola data e ora</li><li>[DATE]=Data</li><li>[TIME]=Ora</li><li>[STARTDATE]=Data Inizio</li><li>[ENDDATE]=Data Fine</li><li>[STARTDATETIME]=Data e ora di inizio</li><li>[ENDDATETIME]=Data e ora Fine Evento</li></ul></td></tr></table><br />"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD="Email personalizzata se registrati all'evento per un periodo (da... a...)"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_CUSTOM_SUBJECT_LBL="Oggetto personalizzato"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_CUSTOM_SUBJECT_DESC="Inserisci l'oggetto personalizzato"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_CUSTOM_BODY_LBL	= "Personalizza corpo"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_CUSTOM_BODY_DESC="Inserisci corpo personalizzato"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE="Personalizza l'email se registrato con data singola"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_CUSTOM_SUBJECT_LBL="personalizza Oggetto"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_CUSTOM_SUBJECT_DESC="Inserisci oggetto personalizzato"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_CUSTOM_BODY_LBL="personalizza corpo"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_CUSTOM_BODY_DESC="Inserisci corpo personalizzato"

; Registration - Notification Emails to User
COM_ICAGENDA_EMAILUSERSUBJECTDATE_PLACEHOLDER="La tua registrazione all'evento '[TITLE]' su [SITENAME]"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_DEFAULT_BODY="Salve [NAME],<br/><br/>Ti sei registrato a questo >Evento '[TITLE]'.<br/><br/>Se si desidera rivedere i dettagli dell'evento, clicca sul link seguente o, se non è cliccabile, copialo e incollalo nella barra degli indirizzi del tuo browser. <br/>[EVENTURL]<br/><br/>Questa email contiene i dati personali inseriti al momento della registrazione per questo evento sul sito web [SITEURL].<br/><br/>Nome: [NAME]<br/>Email: [EMAIL]<br/>Telefono: [PHONE]<br/>Nr di posti: [PLACES]<br/>Periodo: da [STARTDATETIME] a [ENDDATETIME]<br/>[CUSTOMFIELDS]<br/>Note: [NOTES]<br/><br/>È possibile richiedere informazioni, modificare i propri dati personali o cancellare la tua iscrizione inviando una mail a: [AUTHOREMAIL]<br/><br/>Cordiali saluti,<br/>[SITENAME]"

COM_ICAGENDA_EMAILUSERSUBJECTPERIOD_PLACEHOLDER="La tua registrazione all'evento '[TITLE]' su [SITENAME]"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_DEFAULT_BODY="Ciao [NAME], <br/><br/> Ti sei registrato all'evento '[TITLE]'. <br/><br/> Se volete rivedere i dettagli di questo evento, clicca sul seguente link o, se non è cliccabile, copialo e incollarlo sul tuo browser. <br/> [EVENTURL] <br/><br/> questa e-mail contiene i dati personali inseriti al momento della registrazione per questo evento sul sito web [SITEURL]. <br /> <br/> Nome: [NAME] <br/>Email: [EMAIL] <br/> Telefono: [PHONE] <br/> Numero di posti: [PLACES] <br/> Data: [DATETIME]<br/>[CUSTOMFIELDS]<br/>Note: [NOTES]<br/><br/>È possibile richiedere informazioni, modificare i propri dati personali o cancellare la tua iscrizione inviando una mail a: [AUTHOREMAIL]<br/><br/>Cordiali Saluti,<br/>[SITENAME]"

; Registration - Terms and Conditions
COM_ICAGENDA_REGISTRATION_TERMS_LABEL="Termini e Condizioni"
COM_ICAGENDA_REGISTRATION_TERMS_DESC="Se attivata, verranno visualizzati i Termini e Condizioni che devono essere letti dall'utente prima dell'invio del modulo di registrazione, questi dovranno essere accetatti per procedere all'invio della registrazione."
COM_ICAGENDA_REGISTRATION_TERMS_TEXTTYPE_LABEL="Testo"
COM_ICAGENDA_REGISTRATION_TERMS_TEXTTYPE_DESC="Selezionare il testo utilizzato per i Termini e Condizioni."
;
; Submit an event
COM_ICAGENDA_SUBMIT_AN_EVENT_LABEL="Proponi un evento"
COM_ICAGENDA_SUBMIT_AN_EVENT_DESC="Opzioni per il form proponi evento da frontend"

COM_ICAGENDA_SUBMIT_EVENT_IMAGE_DISPLAY_LABEL="Immagine Evento"
COM_ICAGENDA_SUBMIT_EVENT_IMAGE_DISPLAY_DESC="Mostra/Nascondi il campo 'Immagine Evento' nel form"
COM_ICAGENDA_SUBMIT_EVENT_IMAGE_MAX_SIZE_LABEL="Max Image Size (in KB)"
COM_ICAGENDA_SUBMIT_EVENT_IMAGE_MAX_SIZE_DESC="Massima dimensione per upload immagine (in kilobytes)."
COM_ICAGENDA_SUBMIT_EVENT_IMAGE_MAX_SIZE_MENU_DESC="Dimensione massima di upload per immagine (in kilobytes). Se lasciato vuoto, verrà usata l'impostazione globale."
COM_ICAGENDA_SUBMIT_PERIOD_DISPLAY_LABEL="Periodo"
COM_ICAGENDA_SUBMIT_PERIOD_DISPLAY_DESC="Mostra/Nascondi il campo 'Eventi in un Periodo' nel form"
COM_ICAGENDA_SUBMIT_WEEKDAYS_DISPLAY_LABEL="Giorni Feriali"
COM_ICAGENDA_SUBMIT_WEEKDAYS_DISPLAY_DESC="Mostra/Nascondi il campo 'Giorni Feriali' nel form"
COM_ICAGENDA_SUBMIT_DATES_DISPLAY_LABEL="Singole date"
COM_ICAGENDA_SUBMIT_DATES_DISPLAY_DESC="Mostra/nascondi 'Singole Date' nei campi del form"
COM_ICAGENDA_SUBMIT_DISPLAYTIME_DISPLAY_LABEL="Visualizza ora"
COM_ICAGENDA_SUBMIT_DISPLAYTIME_DISPLAY_DESC="Mostra/Nascondi 'l'ora' nel campo del form"
COM_ICAGENDA_SUBMIT_SHORTDESC_DISPLAY_LABEL="Descrizione breve"
COM_ICAGENDA_SUBMIT_SHORTDESC_DISPLAY_DESC="Mostra/Nascondi 'descrizione breve' nel campo del form"
COM_ICAGENDA_SUBMIT_DESCRIPTION_DISPLAY_LABEL="Descrizione"
COM_ICAGENDA_SUBMIT_DESCRIPTION_DISPLAY_DESC="Mostra/Nascondi il campo 'Descrizione' nel Form"
COM_ICAGENDA_SUBMIT_METADESCRIPTION_DISPLAY_LABEL="Meta Description"
COM_ICAGENDA_SUBMIT_METADESCRIPTION_DISPLAY_DESC="Mostra/Nascondi il campo meta description nel form"
COM_ICAGENDA_SUBMIT_VENUE_DISPLAY_LABEL="Sede dell'evento"
COM_ICAGENDA_SUBMIT_VENUE_DISPLAY_DESC="Mostra/Nascondi il campo 'posti disponibili' nel form"
COM_ICAGENDA_SUBMIT_EMAIL_DISPLAY_LABEL="Email di Contatto"
COM_ICAGENDA_SUBMIT_EMAIL_DISPLAY_DESC="Mostra/Nascondi il campo 'Email' nel Form"
COM_ICAGENDA_SUBMIT_PHONE_DISPLAY_LABEL="Numero di Telefono per contatti"
COM_ICAGENDA_SUBMIT_PHONE_DISPLAY_DESC="Visualizza/Nascondi il campo 'Telefono' nel form"
COM_ICAGENDA_SUBMIT_WEBSITE_DISPLAY_LABEL="Sito web dell'evento"
COM_ICAGENDA_SUBMIT_WEBSITE_DISPLAY_DESC="Mostra/Nascondi il campo 'Sito web' nel Form"
COM_ICAGENDA_SUBMIT_CUSTOMFIELDS_DISPLAY_DESC="Mosta/Nascondi  i 'campi personalizzati' nel form (1)"
COM_ICAGENDA_SUBMIT_ATTACHMENT_DISPLAY_LABEL="File Allegato"
COM_ICAGENDA_SUBMIT_ATTACHMENT_DISPLAY_DESC="Mostra/Nascondi il campo 'File' nel Form"
COM_ICAGENDA_SUBMIT_GMAP_DISPLAY_LABEL="Google Maps"
COM_ICAGENDA_SUBMIT_GMAP_DISPLAY_DESC="Mostra/Nascondi il campo 'Google Maps' nel form"
COM_ICAGENDA_SUBMIT_REGISTRATION_OPTIONS_DISPLAY_LABEL="Opzioni di Registrazione"
COM_ICAGENDA_SUBMIT_REGISTRATION_OPTIONS_DISPLAY_DESC="Mostra/Nascondi le opzioni di registrazione nei campi del form (è possibile visualizzare solo le opzioni di registrazione solo se la registrazione è attivata in nelle opzioni globali)."


COM_ICAGENDA_SUBMIT_PERMISSIONS_LABEL="Permessi"
COM_ICAGENDA_SUBMIT_FRONTEND_ACCESS_LABEL="Autorizzazioni di accesso da Front-end"
COM_ICAGENDA_SUBMIT_FRONTEND_ACCESS_DESC="Selezionare i livelli di accesso autorizzati per 'Proporre un Evento' da front-end. Su Joomla 2.5, è possibile utilizzare Ctrl-clic (Windows) o Cmd (Mac) per selezionare più di un elemento."
COM_ICAGENDA_SUBMIT_NOT_LOGIN_LBL="Non sei loggato nella pagina"
COM_ICAGENDA_SUBMIT_NOT_LOGIN_DESC="Inserire il contenuto personalizzato per la pagina da visualizzare quando l'utente non è connesso. Per impostazione predefinita, il testo 'Devi essere loggato per proporre un evento!' sarà visualizzato."
COM_ICAGENDA_SUBMIT_NO_RIGHTS_LBL="Non puoi accedere"
COM_ICAGENDA_SUBMIT_NO_RIGHTS_DESC="Inserire il contenuto personalizzato per la pagina da visualizzare quando un utente connesso non ha diritti di accesso al modulo 'Proponi un Evento'. Per impostazione predefinita, il testo 'Non sei autorizzato a proporre un evento.' sarà visualizzato."
COM_ICAGENDA_SUBMIT_APPROVAL_LABEL="Permessi di approvazione"
COM_ICAGENDA_SUBMIT_APPROVAL_GROUPS_DESC="Selezionare i gruppi di utenti autorizzati ad approvare gli eventi proposti da frontend. Tutti gli utenti autorizzati riceveranno una mail di notifica quando un nuovo evento viene proposto. Su Joomla 2.5, è possibile utilizzare Ctrl-clic (Windows) o Cmd (Mac) per selezionare più di un elemento."
COM_ICAGENDA_SUBMIT_MANAGERS_NOTE="Gli eventi proposti da Frontend da un utente (gestore) appartenente ad un gruppo autorizzato, saranno approvati automaticamente."

COM_ICAGENDA_SUBMIT_RETURN_LBL="Redirect dopo la Validazione"
COM_ICAGENDA_SUBMIT_RETURN_DESC="Se dopo la registrazione non si desidera reindirizzare alla pagina di conferma gli utenti, è possibile impostare un link diverso o selezionare un articolo di joomla."

COM_ICAGENDA_SUBMIT_TOS_LABEL="Termini e condizioni d'utilizzo"
COM_ICAGENDA_SUBMIT_TOS_DESC="Se attivata, verranno visualizzati i Termini di servizio che devono essere controllati dall'utente prima dell'invio del form, accettandone i Termini di servizio."
COM_ICAGENDA_SUBMIT_TOS_TEXTTYPE_LABEL="Testo"
COM_ICAGENDA_SUBMIT_TOS_TEXTTYPE_DESC="Selezionare il testo utilizzato per i Termini di servizio."
COM_ICAGENDA_SUBMIT_TOS_TYPE_DEFAULT_LBL="Stringa tradotta predefinita:"

; General Settings
COM_ICAGENDA_GLOBAL_PARAMS_LABEL="Impostazioni Generali"
COM_ICAGENDA_GLOBAL_PARAMS_DESC="Impostazioni Generali di iCagenda"
COM_ICAGENDA_GLOBAL_PARAMS_INFO="Le impostazioni generali dell'estensione iCagenda, sono parametri comuni in altri componenti, moduli e plugin."

; Responsive Media queries settings
COM_ICAGENDA_SCREEN_WIDTH_THRESHOLDS_LABEL="Larghezza schermo Responsive"
COM_ICAGENDA_LARGE_WIDTH_THRESHOLD_LABEL="Schermo grande"
COM_ICAGENDA_LARGE_WIDTH_THRESHOLD_DESC="Immettere la larghezza minima per la dimensione dello schermo di grandi dimensioni (di solito un computer desktop). Questo definisce la larghezza dello schermo (in pixel), oltre la quale il CSS incluso nei file [nome tema] _component_large e [nome tema] _module_large sarà efficace. Questa funzionalità saranno ignorati se il valore è impostato a zero o se il file CSS appropriata non esiste."
COM_ICAGENDA_MEDIUM_WIDTH_THRESHOLD_LABEL="Schermo Medio"
COM_ICAGENDA_MEDIUM_WIDTH_THRESHOLD_DESC="Immettere la larghezza minima dello schermo per lo schermo di medie dimensioni (di solito un computer portatile). Questo definisce la larghezza dello schermo (in pixel), oltre la quale il CSS incluso nei file [nome tema] _component_medium e [nome tema] _module_medium sarà efficace. Questa funzionalità saranno ignorati se il valore è impostato a zero o se il file CSS appropriata non esiste."
COM_ICAGENDA_SMALL_WIDTH_THRESHOLD_LABEL="Schermo Piccolo"
COM_ICAGENDA_SMALL_WIDTH_THRESHOLD_DESC="Immettere la larghezza minima per lo schermo di piccole dimensioni (di solito un computer tablet). Schermo di dimensioni inferiori a questo sono considerati come i telefoni cellulari. Questo definisce la larghezza dello schermo (in pixel), oltre la quale il CSS incluso nei file [nome tema] _component_small e [nome tema] _module_small sarà efficace. Per le dimensioni dello schermo inferiori a tale valore soglia, il CSS nei file [nome tema] _component_xsmall e [nome tema] _module_xsmall sarà efficace. Inoltre, per piccoli schermi supplementari, il tooltip nel modulo calendario riempirà lo schermo. Questa funzionalità sarà ignorati se il valore è impostato a zero o se il file CSS appropriata non esiste."

; Date Time Options
COM_ICAGENDA_DATETIME_LABEL="Ora e data"
COM_ICAGENDA_TIME_FORMAT_LABEL="Formato Data"
COM_ICAGENDA_TIME_FORMAT_DESC="Visualizza il formato data in 24h, 12h am/pm"
COM_ICAGENDA_24="24h"
COM_ICAGENDA_12="12h am/pm"
COM_ICAGENDA_TIMEDISPLAY_DEFAULT_LABEL="Visualizza ora di default"
COM_ICAGENDA_TIMEDISPLAY_DEFAULT_DESC="Seleziona se l'opzione 'ora' è impostata di default su 'Mostra' o 'nascondi' quando si crea un nuovo evento."
COM_ICAGENDA_FIRSTDAY_WEEK_LABEL="Primo giorno della settimana"
COM_ICAGENDA_FIRSTDAY_WEEK_DESC="Seleziona il primo giorno della settimana (utilizzato quando viene visualizzato l'elenco dei giorni feriali)."

; Icons Bar
COM_ICAGENDA_ICONS="Icone"

; Print Icon
COM_ICAGENDA_ICON_PRINT_LABEL="Stampa"
COM_ICAGENDA_ICON_PRINT_DESC="Visualizza/Nascondi Icona 'Stampa'"

; Add 2 Cal Icon - List of Events
COM_ICAGENDA_ICON_ADDTOCAL_LABEL="Aggiugi al calendario"
COM_ICAGENDA_ICON_ADDTOCAL_DESC="Visualizza/Nascondi Icona 'Aggiungi al Calendario'"
COM_ICAGENDA_ICON_ADDTOCAL_SIZE_LABEL="Dimensione Icona Calendario"
COM_ICAGENDA_ICON_ADDTOCAL_SIZE_DESC="Selezionare la dimensione in pixel delle icone del calendario"
COM_ICAGENDA_ICON_ADDTOCAL_OPTIONS_LABEL="Calendari"
COM_ICAGENDA_ICON_ADDTOCAL_OPTIONS_DESC="Se 'Aggiungi a Cal' l'icona è attivata, la selezione dei calendari verrà visualizzato in 'Aggiungi a Cal'"
COM_ICAGENDA_VCAL_ICAL_LABEL="iCal Calendar"
COM_ICAGENDA_GCALENDAR_LABEL="Google Calendar"
COM_ICAGENDA_OUTLOOK_LABEL="Outlook Calendar"
COM_ICAGENDA_LIVE_CALENDAR_LABEL="Windows Live Calendar"
COM_ICAGENDA_YAHOO_CALENDAR_LABEL="Yahoo Calendar"

; Thumbnail Generator
COM_ICAGENDA_THUMBNAILS_LABEL="Miniature"
COM_ICAGENDA_ICTHUMB_LABEL="Genera Miniature"
COM_ICAGENDA_ICTHUMB_DESC="Attivare o disattivare la generazione delle miniature. <br /> Si consiglia di disattivare questa opzione solo se si incontrano bug o una visualizzazione strana della pagina (frontend e/o amministrazione)."

; Categories admin
COM_ICAGENDA_CATEGORY_SELECT_LIST="Select list Categoria"
COM_ICAGENDA_CATEGORY_ORDER_LABEL="Ordina categoria"
COM_ICAGENDA_CATEGORY_SELECT_LIST_ORDER_DESC="L'ordine in cui verranno mostrate le categorie nella lista di selezione."
COM_ICAGENDA_CATEGORY_SELECT_LIST_DEFAULT_LABEL="Categoria di default"
COM_ICAGENDA_CATEGORY_SELECT_LIST_DEFAULT_DESC="Categoria selezionata per impostazione predefinita."
COM_ICAGENDA_CATEGORY_SELECT_LIST_STATUS_ADMIN_LABEL="Stato Categoria - Admin"
COM_ICAGENDA_CATEGORY_SELECT_LIST_STATUS_ADMIN_DESC="Lo stato delle categorie da visualizzare in Admin Categoria Select List."
COM_ICAGENDA_CATEGORY_SELECT_LIST_STATUS_SITE_LABEL="Stato Categoria - Site"
COM_ICAGENDA_CATEGORY_SELECT_LIST_STATUS_SITE_DESC="Lo stato delle categorie da visualizzare nell Frontend Categoria Select List."

; Autofill Username and email
COM_ICAGENDA_JOOMLA_USER_LABEL="Autocompletamento Utente Joomla"

; Plugin Autologin
COM_ICAGENDA_SENDING_EMAIL_LABEL="Invia Emails"
COM_ICAGENDA_AUTOLOGIN_LABEL="Autologin"
COM_ICAGENDA_AUTOLOGIN_DESC="l plugin iCagenda per il login automatico consente ad un utente di connettersi automaticamente quando si clicca su una URL non pubblica inserito in una e-mail di notifica. È possibile disattivare questa funzione utilizzando questa opzione."

; Miscellaneous Global Options
COM_ICAGENDA_MISCELLANEOUS_LABEL="Miscellaneous"

COM_ICAGENDA_EVENT_TITLE_LBL="Titolo Evento"
COM_ICAGENDA_TEXT_TRANSFORM_LBL="Trasforma Testo"
COM_ICAGENDA_TEXT_TRANSFORM_DESC="Controllo primo carattere maiuscolo"
IC_FIRST_UPPERCASE="Primo carattere maiuscolo"
IC_CAPITALIZE="Capitalize"
IC_UPPERCASE="Maiuscolo"
IC_LOWERCASE="Minuscolo"
COM_ICAGENDA_SHORT_DESCRIPTION_LBL="Descrizione breve"
COM_ICAGENDA_SHORT_DESCRIPTION_LIMIT_DESC="Limite caratteri nella descrizione breve"
COM_ICAGENDA_META_DESCRIPTION_LBL="Meta Description"
COM_ICAGENDA_META_DESCRIPTION_LIMIT_DESC="Limite di caratteri del Meta Description. Le Meta descrizioni possono essere di qualsiasi lunghezza, ma i motori di ricerca in genere troncano frammenti più lunghi di 160 caratteri. E 'meglio tenere meta descrizioni tra i 150 e i 160 caratteri."
COM_ICAGENDA_AUTO_SHORT_DESCRIPTION_LBL="Auto-Introtext"
COM_ICAGENDA_AUTO_INTROTEXT_LIMIT_DESC="Limite di caratteri del testo dell'introduzione generato dalla descrizione completa."
COM_ICAGENDA_HTML_FILTERING_LABEL="Filtra HTML"
COM_ICAGENDA_FILTERING_SHORTDESC_DESC="Determina come l'HTML sarà filtrato in 'auto-introtext'."
COM_ICAGENDA_ALL_ITALIC="Tutto corsivo"
COM_ICAGENDA_NO_HTML="No HTML"
COM_ICAGENDA_AUTHORIZED_HTML_TAGS="Tag HTML autorizzati"
COM_ICAGENDA_FILTERING_SHORTDESC_AUTHORIZED_HTML_TAGS_DESC="Seleziona i tag HTML accettati in 'Auto-introtext'. Selezionare uno o più elementi dalla lista. L'uso di etichette selezionate dipenderà dal vostro editor, e il codice sorgente HTML utilizzato nella descrizione (disattivare il proprio editor per visualizzare i tag HTML della descrizione dell'evento). Non verranno presi in considerazione gli stili inlinea. In Joomla 2.5, è possibile utilizzare Ctrl-clic (Windows) o Cmd-clic (Mac) per selezionare più di un elemento."
COM_ICAGENDA_CUSTOMIZATION="Personalizzazione"
COM_ICAGENDA_CUSTOM_CSS_ACTIVATION_LBL="Carica CSS personalizzato"
COM_ICAGENDA_CUSTOM_CSS_ACTIVATION_DESC="Dovremmo caricare il codice CSS personalizzato?"
COM_ICAGENDA_CUSTOM_CSS_LBL="Codice CSS personalizzato"
COM_ICAGENDA_CUSTOM_CSS_DESC="Crea il tuo CSS personalizzato da aggiungere agli stili di iCagenda o sovrascrivi le classi e gli stili del CSS esistente"
COM_ICAGENDA_CUSTOM_CSS_HINT="Inserisci il tuo codice CSS personalizzato qui..."

; PRO Options
COM_ICAGENDA_COPY_LABEL="Mostra/Nascondi "_QQ_"Powered by iCagenda"_QQ_" &#3664; Hide &#3663; Show &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b>PRO version : <a href="_QQ_"http://www.joomlic.com/extensions/icagenda"_QQ_" target="_QQ_"_blank"_QQ_">Acquista il componente</a></b>"
COM_ICAGENDA_COPY_DESC="Mostra/Nascondi "_QQ_"Powered by iCagenda"_QQ_""
COM_ICAGENDA_PRO_LABEL="OPZIONI versione PRO"
COM_ICAGENDA_PRO_ACCOUNT_INFO="<h2>Pro Account <small>(aggiornamenti e supporto Ticket)</small></h2>Una volta ordinata una versione commerciale di iCagenda, un account personale verrà creato dal JoomliC TEAM entro 2 giorni lavorativi nel sito:<a href='http://pro.joomlic.com' target='_blank'><strong>pro.joomlic.com</strong></a><br /><br /><h3>È possibile attivare gli aggionamenti LIVE della versione Pro in 2 modi:</h3><ul><li>Inserendo il <strong>Pro ID</strong> Download Key</li><li><strong>o</strong> il tuo <strong>Nome utente e password</strong> usati nel sito pro.joomlic.com</li></ul><i>prima di procedere con l'aggiornamento, ripulisci la cache del sito cliccando su 'Refresh'</i>"
COM_ICAGENDA_PRO_COPY_LABEL="Visualizza/Nascondi "_QQ_"Powered by iCagenda"_QQ_""
COM_ICAGENDA_PRO_COPY_DESC="Visualizza la firma "_QQ_"Powered by iCagenda"_QQ_""
PRO_JOOMLIC_UPDATES_INFORMATION="Informazioni su aggiornamenti PRO"
PRO_JOOMLIC_USERNAME_LBL="Username"
PRO_JOOMLIC_USERNAME_DESC="Inserire il nome utente per il sito pro.joomlic.com per abilitare gli aggiornamenti della relase PRO."
PRO_JOOMLIC_PASSWORD="Password"
PRO_JOOMLIC_PASSWORD_DESC="Inserire la password per il sito pro.joomlic.com per abilitare gli aggiornamenti della relase PRO."
COM_ICAGENDA_PRO_ID_LABEL="ID Pro"
COM_ICAGENDA_PRO_ID_DESC="Inserisci il tuo ID Pro per consentire gli aggiornamenti in tempo reale per la versione Professionale."
COM_ICAGENDA_PRO_CONFIG_LIVEUPDATE_MINSTABILITY_LABEL="Relase minima sabile per le notifiche di aggiornamento"
COM_ICAGENDA_PRO_UPDATE_SERVER="Update server"
COM_ICAGENDA_PRO_CONFIG_LIVEUPDATE_MINSTABILITY_DESC="Selezionare il livello minimo di stabilità di rilascio per il quale sarete avvisati che un nuovo aggiornamento se disponibile. Sei pregato di utilizzare solo stabile o RC su siti di produzione! Aiutaci a testare versioni iCagenda su server in tempo reale con l'installazione di alpha e beta (di prova)."
ICAGENDA_STABILITY_TESTING="Testing (Alpha and beta)"
ICAGENDA_STABILITY_ALPHA="Alpha"
ICAGENDA_STABILITY_BETA="Beta"
ICAGENDA_STABILITY_RC="Release Candidate"
ICAGENDA_STABILITY_STABLE="Stabile"

; PRO Messages
COM_ICAGENDA_PRO_WELCOME="Benvenuto su %s!"
COM_ICAGENDA_PRO_WELCOME_PRO_ACCOUNT_INFO="Dopo l'acquisto %s su Share-it, verrà creato un account dal Team JoomliC entro 2 giorni lavorativi sul sito: %s"
COM_ICAGENDA_PRO_WELCOME_PRO_NOTIFICATION_EMAILS="Riceverai 2 email di notifica da %s"
COM_ICAGENDA_PRO_WELCOME_PRO_NOTIFICATION_EMAILS_FIRST="Prima e-mail con il tuo nome utente e password per accedere al sito %s"
COM_ICAGENDA_PRO_WELCOME_PRO_NOTIFICATION_EMAILS_SECOND="Seconda e-mail con i dettagli della sottoscrizione."
COM_ICAGENDA_PRO_WELCOME_PRO_CHECK_YOUR_EMAIL="Controlla la tua email (anche dentro la casella SPAM  della tua webmail)."
COM_ICAGENDA_PRO_WELCOME_PRO_FIRST_LOGIN_1="La prima volta che accedi a %s, sarai in grado di modificare il tuo profilo con nome utente e password di tua preferenza."
COM_ICAGENDA_PRO_WELCOME_PRO_FIRST_LOGIN_2="Sarà possibile cliccare sul pulsante per il download PRO ID"
COM_ICAGENDA_PRO_WELCOME_PRO_OPTIONS="Copia/Incolla la tua Key Pro ID nelle opzioni globali del componente %s"
COM_ICAGENDA_PRO_WELCOME_PRO_ID_1="Pro ID è necessario per prodedere con gli aggiornamenti di %s dal tuo sito Joomla."
;COM_ICAGENDA_PRO_WELCOME_PRO_ID_2="Fai ATTENZIONE!! Ogni volta che editeraii il tuo profilo, la Key Pro ID cambierà, se lo farai ricorda di aggiornare la key nelle opzioni globali di iCagenda."
COM_ICAGENDA_PRO_WELCOME_CONTACT="Non esitate a contattarci in qualsiasi momento per ulteriore assistenza durante il tuo abbonamento. Usa un linguaggio semplice e cerca di esprimere al meglio il problema"
COM_ICAGENDA_PRO_WELCOME_SUPPORT="Si prega di non utilizzare l'e-mail di contatto per questioni tecniche o di supporto. Utilizza invece il nostro %s"
COM_ICAGENDA_PRO_WELCOME_NOTE="Nota: Quando ci contatterai via e-mail, non dimenticare di utilizzare l'indirizzo email fornito durante l'acquisto su Share-it, o, nel caso di un indirizzo email diverso, specificare il numero d'ordine. Cestineremo tutte le email che non rispettano questi parametri."
COM_ICAGENDA_WELCOME_RELOAD="Ricarica Messaggio di benvenuto"
COM_ICAGENDA_WELCOME_RELOAD_DESC="Ricaricare il messaggio di benvenuto contenente le informazioni sui vostri primi passi con iCagenda Pro."
COM_ICAGENDA_WELCOME_HIDE_SUCCESS="Messaggio di benvenuto nascosto con successo"

; Captcha
COM_ICAGENDA_CAPTCHA="Captcha"
COM_ICAGENDA_CAPTCHA_LABEL="Captcha Plugin"
COM_ICAGENDA_CAPTCHA_DESC="Selezionare il plugin captcha che verrà utilizzato nel form di iCagenda. Potrebbe essere necessario configurare il vostro plugin captcha nella gestione del Plugin.<br />Se si seleziona 'Usa Default', assicurati che un plugin captcha sia selezionato nella configurazione globale di joomla."
;
COM_ICAGENDA_REGISTRATION_CAPTCHA_DESC="Mostra/Nascondi il captcha nel form 'Registrazione'. È possibile impostare il Plugin Captcha nella scheda 'Impostazioni generali' nelle opzioni di iCagenda."
COM_ICAGENDA_SUBMIT_CAPTCHA_DESC="Mostra/Nascondi il captcha nel form 'Invia un evento'. È possibile impostare il Plugin Captcha nella scheda 'Impostazioni generali' dentro le opzioni di iCagenda."
COM_ICAGENDA_MENU_SUBMIT_CAPTCHA_DESC="Seleziona il plugin captcha che verrà utilizzato nella form 'Proponi un evento'. Potrebbe essere necessario configurare e abilitare il plug nella gestione plug in di joomla. <br /> Se hai selezionanto 'Usa Globali', assicurati che un plugin captcha è stato selezionato in Configurazione Globale di iCagenda."
COM_ICAGENDA_NONE_SELECTED="- Non Selezionato -"

; Items and messages
COM_ICAGENDA_N_ITEMS_ARCHIVED="%d evento archiviato con successo"
COM_ICAGENDA_N_ITEMS_ARCHIVED_1="%d evento archiviato con successo"
COM_ICAGENDA_N_ITEMS_CHECKED_IN_0="Nessun elemento sbloccato"
COM_ICAGENDA_N_ITEMS_CHECKED_IN_1="%d elemento sbloccato con successo"
COM_ICAGENDA_N_ITEMS_CHECKED_IN_MORE="%d elemento sbloccato con successo"
COM_ICAGENDA_N_ITEMS_DELETED="%d elementi eliminati con successo"
COM_ICAGENDA_N_ITEMS_DELETED_1="%d elementi eliminati con successo"
COM_ICAGENDA_N_ITEMS_PUBLISHED="%d elementi pubblicati con successo"
COM_ICAGENDA_N_ITEMS_PUBLISHED_1="%d elementi pubblicati con successo"
COM_ICAGENDA_N_ITEMS_TRASHED="%d elemento spostato nel cestino"
COM_ICAGENDA_N_ITEMS_TRASHED_1="%d elemento spostato nel cestino"
COM_ICAGENDA_N_ITEMS_UNPUBLISHED="%d elemento sospeso con successo"
COM_ICAGENDA_N_ITEMS_UNPUBLISHED_1="%d elemento sospeso con successo"
COM_ICAGENDA_NO_ITEM_SELECTED="nessun elemento selezionato"
COM_ICAGENDA_SAVE_SUCCESS="registrazione salvata con successo"

; Filters Select
COM_ICAGENDA_SELECT_STATE="- Stato -"
COM_ICAGENDA_SELECT_CATEGORY="- Categoria -"
COM_ICAGENDA_SELECT_DATES="- Date -"
COM_ICAGENDA_SELECT_SITE_ITEMID="- Frontend Item ID -"

COM_ICAGENDA_SELECT_EVENT="- Seleziona Evento -"
COM_ICAGENDA_SELECT_DATE="- Seleziona Data -"
COM_ICAGENDA_SELECT_NO_EVENT_SELECTED="Nessun evento selezionato"

; Categories list
COM_ICAGENDA_TITLE_CATEGORIES="Categorie"
COM_ICAGENDA_CATEGORIES_TITLE="Nome Categoria"
COM_ICAGENDA_CATEGORIES_COLOR="Colore"

; Events list
COM_ICAGENDA_TITLE_EVENTS="Eventi"
COM_ICAGENDA_EVENTS_TITLE="Titolo"
COM_ICAGENDA_EVENTS_USERNAME="Utente"
COM_ICAGENDA_EVENTS_CATID="Categoria"
COM_ICAGENDA_EVENTS_IMAGE="Immagine"
COM_ICAGENDA_EVENTS_NEXT="Eventi successivi"
COM_ICAGENDA_EVENTS_COMPLETED="evento passato"
COM_ICAGENDA_EVENTS_NEXT_PAST="Ultima data"
COM_ICAGENDA_EVENTS_NEXT_FUTUR="Prossima data "
COM_ICAGENDA_EVENTS_NEXT_TODAY="Eventi di oggi: "
COM_ICAGENDA_EVENTS_PLACE="Luogo"
COM_ICAGENDA_EVENTS_APPROVAL="Approvazione"
COM_ICAGENDA_EVENTS_APPROVAL_DESC="Approva o disapprova un evento"
COM_ICAGENDA_TOOLBAR_APPROVE="Approvare"
COM_ICAGENDA_APPROVED="Approvato"
COM_ICAGENDA_UNAPPROVED="Non Approvato"
COM_ICAGENDA_N_EVENTS_APPROVED="%s Eventi approvati con successo"
COM_ICAGENDA_N_EVENTS_APPROVED_0="Nessun Evento approvato"
COM_ICAGENDA_N_EVENTS_APPROVED_1="Evento approvato con successo"

; Warning events list
COM_ICAGENDA_EVENTS_NEXT_ALERT="Attenzione ! Nessuna data valida"
COM_ICAGENDA_INVALID_PICTURE_LINK="Link immagine non valido!"
COM_ICAGENDA_NO_VALID_DATE="Data non valida!"
COM_ICAGENDA_ERROR_MIME_TYPE="Errore mime-type !!!"
COM_ICAGENDA_ERROR_MIME_TYPE_NO_THUMBNAIL="le miniature non possono essere create"
COM_ICAGENDA_ERROR_MIME_TYPE_INFO="L'estensione del file <i>%s</i> non è corretta in quanto il mime-types è <i>%s</i>."
COM_ICAGENDA_NOT_AUTHORIZED_IMAGE_TYPE="Il formato immagine è sbagliato!"
COM_ICAGENDA_NOT_AUTHORIZED_IMAGE_TYPE_INFO="La creazione di miniature è compatibile con i seguenti formati: jpg, jpeg, png, gif e bmp."
COM_ICAGENDA_FORM_NO_DATES_ALERT="Si prega di compilare le date dell'evento"

; Registrations
COM_ICAGENDA_REGISTRATIONS_SELECT_STATUS="- Stato Registrazioni -"
COM_ICAGENDA_REGISTRATIONS_SELECT_CATEGORY="- Seleziona Categoria -"
COM_ICAGENDA_REGISTRATIONS_SELECT_EVENT="- Seleziona Evento -"
COM_ICAGENDA_REGISTRATIONS_SELECT_DATE="- Seleziona Data -"
COM_ICAGENDA_TITLE_REGISTRATION="iscrizioni"
COM_ICAGENDA_REGISTRATION_INFORMATION="Informazioni sulla registrazione"
COM_ICAGENDA_REGISTRATION_USER="User Name"
COM_ICAGENDA_REGISTRATION_USER_ID="User ID"
COM_ICAGENDA_REGISTRATION_NO_USER_ID="Registrato come visitatore"
COM_ICAGENDA_REGISTRATION_USERID="Username"
COM_ICAGENDA_REGISTRATION_EVENTID="Evento"
COM_ICAGENDA_REGISTRATION_DATE="Data"
COM_ICAGENDA_REGISTRATION_ALL_DATES="Tutte le date"
COM_ICAGENDA_REGISTRATION_ALL_PERIOD="Tutti gli eventi del periodo"
COM_ICAGENDA_REGISTRATION_NUMBER_PLACES="Numero di persone"
COM_ICAGENDA_REGISTRATION_PEOPLE="N.P."
COM_ICAGENDA_REGISTRATION_EMAIL="Email"
COM_ICAGENDA_REGISTRATION_PHONE="Telefono"
COM_ICAGENDA_REGISTRATION_EVENT_NOT_PUBLISHED="Evento non pubblicato"
COM_ICAGENDA_REGISTRATION_TICKETS="posti/biglietti"

; Registrations Export
COM_ICAGENDA_REGISTRATIONS_DOWNLOAD="Scarica la lista delle Registrazioni"
COM_ICAGENDA_REGISTRATIONS_EXPORT="Esporta"
COM_ICAGENDA_CANCEL="cancellare"
COM_ICAGENDA_EXPORT_SEPARATOR_LABEL="Separatore"
COM_ICAGENDA_EXPORT_SEPARATOR_DESC="Selezionare virgola (default) o punto e virgola per separare i valori."
IC_COMMA="Virgola [ , ]"
IC_SEMICOLON="Punto e Virgola [ ; ]"
COM_ICAGENDA_EXPORT_COMPRESSED_LABEL="Compresso"
COM_ICAGENDA_EXPORT_COMPRESSED_DESC="Opzioni di compressione per il file da esportare"
COM_ICAGENDA_EXPORT_BASENAME_LABEL="Nome File"
COM_ICAGENDA_EXPORT_BASENAME_DESC="Il nome del file modello può contenere <br /> __SITE__ per il nome del sito <br /> __EVENTID__ per l'ID evento <br /> __EVENT__ per il titolo dell'evento <br /> __DATE__ per la data salvata nel database."
COM_ICAGENDA_NO_EVENT_TITLE="No Titolo"
COM_ICAGENDA_EXPORT_ERR_ZIP_ADAPTER_FAILURE="Zip adapter fallito"
COM_ICAGENDA_EXPORT_ERR_ZIP_CREATE_FAILURE="Creazione ZIP fallito"
COM_ICAGENDA_EXPORT_ERR_ZIP_DELETE_FAILURE="eliminazione ZIP fallita"

; Registration Edit
COM_ICAGENDA_LEGEND_NEW_REGISTRATION="Nuova registrazione"
COM_ICAGENDA_LEGEND_EDIT_REGISTRATION="Edita la Registrazione"
COM_ICAGENDA_REGISTRATION_TYPE_FOR_THIS_EVENT="'Tipo di Registrazione' opzione per questo evento è: %s"
COM_ICAGENDA_REGISTRATION_NO_DATE_SELECTED="Nessuna data selezionata"
COM_ICAGENDA_REGISTRATION_ERROR_DATE_CONTROL="iCagenda non era in grado di controllare la data di registrazione e convertirlo nel nuovo formato standard di data ora utilizzato durante la registrazione nel database (introdotto a partire dalla versione 3.3.3).<br />Grazie per selezionare la data %s prima di salvare la voce, in questo modo verrà aggiornato il valore corretto nel database."
COM_ICAGENDA_REGISTRATION_DATE_NO_LONGER_EXISTS="La data %s non esiste più!"
COM_ICAGENDA_REGISTRATION_PERIOD_NO_LONGER_EXISTS="La registrazione per un periodo completo (non singole date) non è più disponibile perché i giorni della settimana adsso sono selezionati per questo evento."
COM_ICAGENDA_REGISTRATION_BY_DATE_NO_LONGER_POSSIBLE="La data salvata per questa registrazione non è più disponibile, perché il tipo di registrazione degli eventi adesso è '%s'. Seleziona '%s' se si desidera aggiornare la registrazione."
COM_ICAGENDA_REGISTRATION_FOR_ALL_DATES_NO_LONGER_POSSIBLE="La registrazione per tutte le date della manifestazione non è più disponibile, perché il tipo di registrazione degli eventi adesso è '%s'. Sei pregato di selezionare una data se desideri aggiornare la registrazione."
COM_ICAGENDA_REGISTRATION_NO_EVENT_SELECTED_ALERT="Sei pregato di selezionare un evento per questa nuova registrazione."


; Category Edit
COM_ICAGENDA_LEGEND_NEW_CATEGORY="Nuova Categoria"
COM_ICAGENDA_LEGEND_EDIT_CATEGORY="Edita Categoria"
COM_ICAGENDA_TITLE_CATEGORY="Categoria"
COM_ICAGENDA_LEGEND_CATEGORY="Categoria"
COM_ICAGENDA_FORM_LBL_CATEGORY_TITLE="Titolo"
COM_ICAGENDA_FORM_DESC_CATEGORY_TITLE="Scegli un titolo per la categoria"
COM_ICAGENDA_FORM_LBL_CATEGORY_COLOR="Colore"
COM_ICAGENDA_FORM_DESC_CATEGORY_COLOR="Scegli un colore per la categoria"
COM_ICAGENDA_FORM_LBL_CATEGORY_DESC="Descrizione"
COM_ICAGENDA_FORM_DESC_CATEGORY_DESC="Descrizione della categoria"

; Event Edit
COM_ICAGENDA_TITLE_EVENT="Eventi"
;
; Right Sidebar
COM_ICAGENDA_TITLE_SIDEBAR_DETAILS="Dettagli"
;
; Panel Publishing Options
COM_ICAGENDA_ACCESS_DESC="Gruppo di livello di accesso al quale è permesso vedere questo evento."
;
; Panel Event
COM_ICAGENDA_LEGEND_NEW_EVENT="Nuovo Evento"
COM_ICAGENDA_LEGEND_EDIT_EVENT="Modifica Evento"
COM_ICAGENDA_FORM_LBL_EVENT_TITLE="Titolo"
COM_ICAGENDA_FORM_DESC_EVENT_TITLE="Inserisci un titolo per l'evento"
COM_ICAGENDA_FORM_LBL_EVENT_USERNAME="Utente"
COM_ICAGENDA_FORM_DESC_EVENT_USERNAME="Nome utente che ha creato l'evento"
COM_ICAGENDA_FORM_LBL_EVENT_CATID="Categoria"
COM_ICAGENDA_FORM_DESC_EVENT_CATID="Categoria a cui è assegnato questo evento"
COM_ICAGENDA_FORM_DESC_LANGUAGE="Assegna una lingua a questo evento"
;
; Panel Attachments
COM_ICAGENDA_LEGEND_ALLEG="Allegati da scaricare"
COM_ICAGENDA_FORM_LBL_EVENT_IMAGE="Immagine Evento"
COM_ICAGENDA_FORM_DESC_EVENT_IMAGE="Aggiunge una immagine all'evento"
COM_ICAGENDA_FORM_LBL_EVENT_FILE="File dell'evento (PDF)"
COM_ICAGENDA_FORM_DESC_EVENT_FILE="Allega un file dell'evento"
;
; Panel Dates
COM_ICAGENDA_LEGEND_DATES="Date"
COM_ICAGENDA_DATES_HELP="Nota: è possibile selezionare diverse opzioni e combinazioni per le date dell'evento. <small style="_QQ_"text-decoration:underline; float:right;"_QQ_">leggi tutto</small>"
COM_ICAGENDA_DATES_HELP_INTRO="È possibile aggiungere un evento che si svolge in un periodo, con una data di inizio e una data di fine, e / o singole date:"
COM_ICAGENDA_DATES_HELP_LINE1="Eventi con una singola data, e l'ora di inizio"
COM_ICAGENDA_DATES_HELP_EXAMPLE1="Ad esempio, un concerto che inizia alle 20:00 e si svolge solo il giorno selezionato."
COM_ICAGENDA_DATES_HELP_LINE2="Eventi con date diverse, consecutivi o meno, con un orario di inizio, che possono essere diversi per ogni data."
COM_ICAGENDA_DATES_HELP_EXAMPLE2="Ad esempio, un concerto che si terrà una settimana di Venerdì e Sabato, e la settimana successiva il Venerdì. Questo concerto può iniziare in tempi diversi, ed è possibile aggiungere nuove date in qualsiasi momento."
COM_ICAGENDA_DATES_HELP_LINE3="Evento in un periodo (dal ... al ...)."
COM_ICAGENDA_DATES_HELP_EXAMPLE3="Ad esempio, un festival musicale che inizia il Giovedi alle ore 14:00 e termina Domenica alle 23:00. In questo caso, inserire la data di inizio e data di fine."
COM_ICAGENDA_DATES_HELP_LINE4="L'evento si svolge in un periodo e si desidera aggiungere determinate ore."
COM_ICAGENDA_DATES_HELP_EXAMPLE4="Per esempio: Un gruppo partecipa a un festival di musica da Giovedi 14:00 a Domenica ore 23:00. Giovedi ', la band suona alle 16:30, Sabato alle 18:00 e Domenica alle 13:15. È quindi possibile inserire il periodo della manifestazione (da Giovedi a Domenica 14:00 23:00) e aggiungere le singole date con il tempo, quando la band è sul palco."
COM_ICAGENDA_DATES_HELP_LINE5="L'evento si svolge in un periodo, e altre date che non sono in questo periodo."
COM_ICAGENDA_DATES_HELP_EXAMPLE5="Ad esempio, un evento che si svolge dal Lunedi alla Domenica (date in un periodo), e un'altra settimana il Martedì e Venerdì (singole date)."
;
COM_ICAGENDA_LEGEND_PERIOD_DATES="Evento per un periodo"
COM_ICAGENDA_FORM_LBL_EVENTPERIOD_START="Data ed Ora Inizio Evento"
COM_ICAGENDA_FORM_DESC_EVENTPERIOD_START="Inserisci la data e l'ora di inizio evento"
COM_ICAGENDA_FORM_LBL_EVENTPERIOD_END="Data ed Ora di Fine Evento"
COM_ICAGENDA_FORM_DESC_EVENTPERIOD_END="Inserisci la data e l'ora di fine evento"
COM_ICAGENDA_FORM_LBL_WEEK_DAYS="Giorni della settimana"
COM_ICAGENDA_FORM_WEEK_DAYS_INFO_TITLE="Selezione i giorni della settimana"
COM_ICAGENDA_FORM_WEEK_DAYS_INFO_DESC="È possibile dividere il periodo in date singole selezionando i giorni della settimana.<br />Se lasciato vuoto, il periodo non sarà diviso, e sarà considerato come un intero periodo (da ... a ...).<br /><small>È possibile utilizzare Ctrl-click (Windows) o Cmd-clic (Mac) per selezionare più di un elemento.</small>"
COM_ICAGENDA_FORM_ALL_WEEK_DAYS="Tutti i giorni della settimana"
;
COM_ICAGENDA_LEGEND_SINGLE_DATES="Singole date"
COM_ICAGENDA_FORM_LBL_EVENT_DATES="Data Evento"
COM_ICAGENDA_FORM_DESC_EVENT_DATES="La data dell'evento"
COM_ICAGENDA_ADD_DATE="Aggiungi data"
COM_ICAGENDA_DELETE_DATE="cancella"
COM_ICAGENDA_TB_DATE="Data"
COM_ICAGENDA_TB_ACT="Inserisci"
COM_ICAGENDA_FORM_LBL_EVENT_NEXT="prossime date"
COM_ICAGENDA_FORM_DESC_EVENT_NEXT="Indica la data dell'evento più vicina"
;
COM_ICAGENDA_DISPLAY_TIME_LABEL="Visualizza ora"
COM_ICAGENDA_DISPLAY_TIME_DESC="Visualizza o nascondi l'ora degli eventi"
;
; Panel Information
COM_ICAGENDA_LEGEND_INFORMATION="Informazioni"
;
; Panel Venue
COM_ICAGENDA_LEGEND_VENUE="Sede dell'evento"
COM_ICAGENDA_FORM_LBL_EVENT_VENUE="Luogo designato"
COM_ICAGENDA_FORM_DESC_EVENT_VENUE="il luogo dove ha sede l'evento  (Museo degli uffizi, la Torre Eiffel, Stadio Artemio Franchi, London Concert Hall, Casa tua, Scuola, Università, ...)"
;
COM_ICAGENDA_LEGEND_PLACE="Luogo dell'evento"
COM_ICAGENDA_FORM_LBL_EVENT_PLACE="Location"
COM_ICAGENDA_FORM_DESC_EVENT_PLACE="Breve descrizione del luogo, ad esempio "_QQ_"stadio Comunale Artemio Franchi di Firenze"_QQ_""
COM_ICAGENDA_FORM_LBL_EVENT_CITY="Città"
COM_ICAGENDA_FORM_DESC_EVENT_CITY="Città luogo dell'evento"
COM_ICAGENDA_FORM_LBL_EVENT_COUNTRY="Nazione"
COM_ICAGENDA_FORM_DESC_EVENT_COUNTRY="Nazione dove si svolge l'evento"
;
COM_ICAGENDA_LEGEND_CONTACT="Informazioni Contatti"
COM_ICAGENDA_FORM_LBL_EVENT_EMAIL="Email"
COM_ICAGENDA_FORM_DESC_EVENT_EMAIL="Email dell'utente che ha inserito l'evento"
COM_ICAGENDA_FORM_LBL_EVENT_PHONE="Telefono"
COM_ICAGENDA_FORM_DESC_EVENT_PHONE="Indicare il numero di telefono per prenotare"
COM_ICAGENDA_FORM_LBL_EVENT_WEBSITE="Sito Web"
COM_ICAGENDA_FORM_DESC_EVENT_WEBSITE="sito web di riferimento dell'evento o del promotore"
;
; Panel Features
COM_ICAGENDA_LEGEND_FEATURES="Features Eventi "
COM_ICAGENDA_FORM_LBL_EVENT_FEATURES="Features"
COM_ICAGENDA_FORM_DESC_EVENT_FEATURES="Selezionare le feature(s) da applicare a questo evento"
COM_ICAGENDA_FORM_DESC_EVENT_FEATURES_FILTER="Selezionare le feature (s) che si desiderano utilizzare per filtrare gli eventi per questa voce di menu. Attenzione, se si seleziona una singola caratteristica, verranno selezionati solo gli eventi in cui tale feature è presente. However, if more than one feature is selected, use the 'All Features or Any Feature?' option to determine how selections are made."
;
; Panel Description
COM_ICAGENDA_LEGEND_DESC="Informazioni Supplementari"
COM_ICAGENDA_FORM_EVENT_SHORT_DESCRIPTION_LBL="Descrizione breve"
COM_ICAGENDA_FORM_EVENT_SHORT_DESCRIPTION_DESC="Un paragrafo opzionale da usare come 'testo introduttivo' di un evento, nella lista degli eventi."
COM_ICAGENDA_FORM_LBL_EVENT_DESC="Descrizione"
COM_ICAGENDA_FORM_DESC_EVENT_DESC="Descrizione dell'Evento"
COM_ICAGENDA_FORM_EVENT_METADESC_LBL="Meta Description"
COM_ICAGENDA_FORM_EVENT_METADESC_DESC="Un paragrafo opzionale da utilizzare come descrizione della pagina evento nell'output HTML. Questo in genere viene visualizzato nei risultati dei motori di ricerca."
; OLD: COM_ICAGENDA_FORM_EVENT_METADESC_DESC="Un paragrafo opzionale da utilizzare come descrizione della pagina evento nell'output HTML. Questo in genere viene visualizzato nei risultati dei motori di ricerca e verrà utilizzato come descrizione di Open Graph quando verrà condiviso sui social network. La Meta description dovrebbe essere tra i 150 e i 160 caratteri. Se vuoto, iCagenda genererà automaticamente per voi una breve meta-descrizione basata sulla descrizione completa."
COM_ICAGENDA_MAXIMUM_N_CHARACTERS="Max %s caratteri"
COM_ICAGENDA_N_REMAINING="(%s rimanenti)"
;
; Panel Options
COM_ICAGENDA_REGISTRATION_OPTIONS="Opzioni registrazione"
COM_ICAGENDA_REGISTRATION_LABEL="Attiva registrazioni"
COM_ICAGENDA_REGISTRATION_DESC="Abilita la registrazione per gli eventi"
COM_ICAGENDA_REGISTRATION_LINK_LBL="Link alla pagina di registrazione"
COM_ICAGENDA_REGISTRATION_LINK_DESC="Se non si desidera utilizzare il modulo di registrazione di iCagenda, è possibile impostare un link diverso ad altro strumento per registrarsi, quale una pagina di registrazione personalizzata, oppure selezionare un articolo. Nota: iCagenda non salverà i dati usando questi metodi alternativi."
COM_ICAGENDA_REGISTRATION_LINK_ARTICLE="Articolo"
COM_ICAGENDA_REGISTRATION_LINK_URL="URL"

COM_ICAGENDA_REGISTRATION_FORM_OPTIONS_LABEL="Opzioni Form di Registrazione"
COM_ICAGENDA_TYPE_REG_LABEL="Tipo di registrazione"
COM_ICAGENDA_TYPE_REG_DESC="Selezionare il tipo di registrazione: per data (visualizza una select list delle date), o per tutte le date dell'evento."
COM_ICAGENDA_REG_BY_DATE_OR_PERIOD="Tutte le opzioni"
COM_ICAGENDA_REG_BY_INDIVIDUAL_DATE="per data"
COM_ICAGENDA_REG_FOR_ALL_DATES="Per tutte le date"
COM_ICAGENDA_REG_FOR_ALL_PERIOD="Per periodo"
COM_ICAGENDA_ADMIN_REGISTRATION_BY_INDIVIDUAL_DATE="seleziona l'elenco delle date"
COM_ICAGENDA_ADMIN_REGISTRATION_FOR_ALL_DATES="per tutte le date dell'evento"
COM_ICAGENDA_ADMIN_REGISTRATION_FOR_ALL_PERIOD="per tutto il periodo"
COM_ICAGENDA_MAX_REGISTRATIONS_LABEL="Numero registrazioni consentite"
COM_ICAGENDA_MAX_REGISTRATIONS_DESC="Numero massimo di biglietti disponibili per la data (o per periodo, se i giorni della settimana non sono selezionati).<br /> Se <strong> il tipo di registrazione </strong> è impostato su 'Per tutte le date dell'evento', il numero massimo di i biglietti saranno impostati per l'intero evento, e non per la data."
COM_ICAGENDA_MAX_PER_REGISTRATION_LABEL="MAX. Tickets/Posti/Registrazioni"
COM_ICAGENDA_MAX_PER_REGISTRATION_DESC="Numero Max di prenotazioni/registrazioni per singolo utente"
COM_ICAGENDA_CUSTOM_TEXT="Testo personalizzato"
COM_ICAGENDA_REGISTRATION_BUTTON="Pulsante di Registrazione"
COM_ICAGENDA_REGISTRATION_REGISTER="Registrati"
COM_ICAGENDA_REGISTRATION_BUTTON_TEXT="Testo sul pulsante di registrazione"
COM_ICAGENDA_REGISTRATION_BUTTON_TEXT_DESC="È possibile inserire un testo personalizzato per il pulsante di registrazione. Questo sostituisce il testo principale utilizzato per questo pulsante, e se impostato, il valore impostato nelle opzioni globali di iCagenda."
COM_ICAGENDA_BROWSER_TARGET="Target"
COM_ICAGENDA_REGISTRATION_LINK_BROWSER_TARGET_DESC="Target nel Browser del pulsante di registrazione."
;
COM_ICAGENDA_ADDTHIS_DISPLAY_SHARING="Visualizza la condivisione"
;
; Google Maps
COM_ICAGENDA_LEGEND_GOOGLE_MAPS="Google Maps"
COM_ICAGENDA_GOOGLE_MAPS_SUBTITLE_LBL="Seleziona il luogo direttamente sulla mappa."
COM_ICAGENDA_GOOGLE_MAPS_NOTE1="La mappa mostra l'indirizzo selezionato anche quando vengono visualizzati gli indirizzi suggeriti."
COM_ICAGENDA_GOOGLE_MAPS_NOTE2="E' possibile regolare la posizione del marker sulla mappa."
COM_ICAGENDA_GOOGLE_MAPS_ADDRESS_LBL="Indirizzo"
COM_ICAGENDA_GOOGLE_MAPS_LATITUDE_LBL="Latitudine"
COM_ICAGENDA_GOOGLE_MAPS_LONGITUDE_LBL="Longitudine"
COM_ICAGENDA_GOOGLE_MAPS_REVERSE="Trasforma l'indirizzo dopo il trascinamento del Marker?"
COM_ICAGENDA_GOOGLE_MAPS_LEGEND="È possibile trascinare l'indicatore (marker) nella posizione corretta"
COM_ICAGENDA_FORM_LBL_EVENT_LOCATION="Inserisci l'indirizzo dell'evento"
COM_ICAGENDA_FORM_DESC_EVENT_LOCATION="ad esempio: Via Nazionale, 1, 50123 Firenze, Italia"
COM_ICAGENDA_FORM_LBL_EVENT_MAP="<i>Posizione geografica</i>"
COM_ICAGENDA_FORM_DESC_EVENT_MAP="Posizione su Google Maps del luogo dell'evento (spostare il cursore sulla mappa per regolare automaticamente)"
COM_ICAGENDA_FORM_LBL_EVENT_GPS="<i>Coordinate GPS</i>"
;
; Event Panel Publishing
COM_ICAGENDA_FORM_FRONTEND_OPTIONS="Informazioni Form nel Frontend"
COM_ICAGENDA_FORM_FRONTEND_SUBMIT_ITEMID_LBL="Menu Item ID"
COM_ICAGENDA_FORM_FRONTEND_SUBMIT_ITEMID_DESC="ID della voce di menu utilizzata per mostrare questo evento nel frontend."
;
; Locations
COM_ICAGENDA_LOCATION_NAME_LBL="Nome della Location"
;
; Warning Messages Box
COM_ICAGENDA_FORM_WARNING="Attenzione !"
COM_ICAGENDA_FORM_ALERT_UNPUBLISHED="Il tuo evento non sarà pubblicato: nessuna data valida per questo evento"
COM_ICAGENDA_FORM_ERROR_NO_STARTDATE="Errore: È stata specificata una data di fine evento, ma nessuna data di inizio evento è stata indicata"
COM_ICAGENDA_FORM_ERROR_NO_ENDDATE="Errore: È stata specificata una data di inizio evento, ma nessuna data di fine evento è stata indicata"
COM_ICAGENDA_FORM_ERROR_INVALID_PERIOD="Periodo non valido: l'inizio è successivo alla fine"
;
; Not in use currently, but you can keep this lines of translation
COM_ICAGENDA_FORM_LBL_EVENT_ADDRESS="Indirizzo"
COM_ICAGENDA_FORM_DESC_EVENT_ADDRESS="Indica l'indirizzo del luogo dove si svolge l'evento"

; Custom Fields List
COM_ICAGENDA_TITLE_CUSTOMFIELDS="Campi personalizzati"
COM_ICAGENDA_CUSTOMFIELDS="Campi personalizzati"
COM_ICAGENDA_CUSTOMFIELDS_NONE="Non è pubblicato nessun campo personalizzato "
COM_ICAGENDA_CUSTOMFIELDS_FILTER_OPTION_SELECT_PARENT_FORM="- Seleziona Parent Form -"
COM_ICAGENDA_CUSTOMFIELDS_FILTER_OPTION_SELECT_TYPE="- Seleziona Type -"
COM_ICAGENDA_CUSTOMFIELDS_FILTER_SEARCH_DESC="Cerca nei campi personalizzati"

; Custom Field Edit
COM_ICAGENDA_CUSTOMFIELD_LEGEND_NEW="Nuovo campo personalizzato"
COM_ICAGENDA_CUSTOMFIELD_LEGEND_EDIT="Modifica campo personalizzato"
COM_ICAGENDA_CUSTOMFIELD_PANEL_TITLE="Campo personalizzato"
COM_ICAGENDA_CUSTOMFIELD_TITLE_LBL="Title"
COM_ICAGENDA_CUSTOMFIELD_TITLE_DESC="Titolo del campo"
COM_ICAGENDA_CUSTOMFIELD_SLUG_LBL="Nome"
COM_ICAGENDA_CUSTOMFIELD_SLUG_DESC="Se lasciato vuoto, lo Slug sarà generato automaticamente. <br />Lo Slug è il nome della tabella del database sul quale questo campo personalizzato viene salvato. Questo deve essere univoco. <br /> Si prega di utilizzare solo lettere minuscole az, numeri 0-9 e underscore. Non utilizzare caratteri accentati (ad esempio à) o caratteri con segni diacritici (ad esempio δ)."
COM_ICAGENDA_CUSTOMFIELD_PARENT_FORM_LBL="Parent Form"
COM_ICAGENDA_CUSTOMFIELD_PARENT_FORM_DESC="Il Form in cui visualizzare questo campo personalizzato."
COM_ICAGENDA_CUSTOMFIELD_PARENT_SELECT="- Seleziona Parent Form -"
COM_ICAGENDA_CUSTOMFIELD_PARENT_REGISTRATION_FORM="Form di registrazione"
COM_ICAGENDA_CUSTOMFIELD_PARENT_EVENT_EDIT="Form Evento"
COM_ICAGENDA_CUSTOMFIELD_TYPE_LBL="Tipo di campo"
COM_ICAGENDA_CUSTOMFIELD_TYPE_DESC="Type per il campo"
COM_ICAGENDA_CUSTOMFIELD_TYPE_SELECT="- Seleziona Tipo di campo -"
COM_ICAGENDA_CUSTOMFIELD_TYPE_TEXT="Testo"
COM_ICAGENDA_CUSTOMFIELD_TYPE_LIST="Drop-down List"
COM_ICAGENDA_CUSTOMFIELD_TYPE_RADIO="Radio Buttons"
COM_ICAGENDA_CUSTOMFIELD_OPTIONS_LBL="Opzioni"
COM_ICAGENDA_CUSTOMFIELD_OPTIONS_DESC="<h4>Testo</ h4> <p>Inserisci il testo segnaposto deve essere indicato nel campo<br /><em>Ad esempio in un campo personalizzato con titolo. 'Qual è il tuo dolce preferito?': </ em></ p><pre>la tua torta preferita ... </ pre><hr> <h4>Elenco a discesa e pulsanti di opzione</ h4><p>Immettere ciascuna opzione su una nuova riga utilizzando la convenzione di VALUE=LABEL per  ogni riga<br /><em> Per esempio in un campo personalizzato con titolo 'Di che sesso sei?':</ em></ p><pre> F=Femmina<br />M=Maschio</pre><em> in questo esempio, 'Femmina' e 'Maschio' saranno gli elementi dell'elenco a discesa.<br /> 'F' o 'M' sarà il valore restituito dall'elemento selezionato.</ em><br /><br />Se si desidera impostare l'opzione di default in base alla selezione, aggiungere '= X' dopo la coppia di VALUE=LABEL  (ad es. F=Maschio=X)."
COM_ICAGENDA_CUSTOMFIELD_REQUIRED_LBL="Richiesto"
COM_ICAGENDA_CUSTOMFIELD_REQUIRED_DESC="Quando il campo è richiesto"
COM_ICAGENDA_CUSTOMFIELD_DESCRIPTION_DESC="Questa descrizione sarà visualizzata nelle informazioni del tooltip, quando hovering the <i class="_QQ_"iCicon-info-circle"_QQ_"></i> icon (opzionale)."
;
; DATABASE error message
COM_ICAGENDA_CUSTOMFIELD_DATABASE_ERROR_AUTO_SLUG="iCagenda ha cercato di generare un nome con il titolo %s, ma il nome auto-generato %s esiste già."
COM_ICAGENDA_CUSTOMFIELD_DATABASE_ERROR_UNIQUE_SLUG="Un altro campo personalizzato ha lo stesso nome"

; Features list
COM_ICAGENDA_TITLE_FEATURES="Features"
COM_ICAGENDA_LEGEND_NEW_FEATURE="Nuova Feature"
COM_ICAGENDA_LEGEND_EDIT_FEATURE="Modifica Feature"
COM_ICAGENDA_FEATURES_TITLE="Titolo"
COM_ICAGENDA_FEATURES_SHOW_ICON="Visualizza icona"
COM_ICAGENDA_FEATURES_ICON="Icone"
COM_ICAGENDA_FEATURES_SHOW_FILTER="Visualizza filtro"

; Feature Edit
COM_ICAGENDA_TITLE_FEATURE="Feature"
COM_ICAGENDA_FORM_FEATURE_TITLE_LABEL="Titolo"
COM_ICAGENDA_FORM_FEATURE_TITLE_DESC="Inserisci il titolo per la features"
COM_ICAGENDA_FORM_FEATURE_ICON_LABEL="Seleziona Icona"
COM_ICAGENDA_FORM_FEATURE_ICON_DESC="Il nome del file icona da utilizzare per questa funzione. Icone delle funzioni si trovano in [IMAGES FOLDER]/icagenda/feature_icons/nn_bit/  dove nn è la dimensione delle icone)."
COM_ICAGENDA_FORM_FEATURE_NEW_ICON_LABEL="<strong>Oppure</strong> crea una nuova icona<br /><small>(jpg, jpeg, gif, png)</small>"
COM_ICAGENDA_FORM_FEATURE_NEW_ICON_DESC="È possibile selezionare un'immagine per generare una nuova icona a disposizione funzionalità in tutte le taglie (16, 24, 32, 48 e 64 bit). Il nome del file icona verrà filtrato per ottenere un nome di file al sicuro url. l'icona della feature supporta i formati JPG, JPEG, GIF e PNG."
COM_ICAGENDA_FORM_FEATURE_ICON_ALT_LABEL="Valore ALT per icona"
COM_ICAGENDA_FORM_FEATURE_ICON_ALT_DESC="Inserisci il testo utilizzato per popolare l'attributo ALT del tag dell'immagine. Questo testo viene utilizzato per aiutare l'accessibilità e viene utilizzato anche come un tooltip quando l'icona viene aleggiava con il mouse se richiesto nelle opzioni principali iCagenda (questo campo è opzionale)."
COM_ICAGENDA_FORM_FEATURE_SHOW_FILTER_LABEL="Visualizza nel filtro?"
COM_ICAGENDA_FORM_FEATURE_SHOW_FILTER_DESC="Indica se includere la funzione quando si visualizzano le opzioni di filtro evento per la configurazione voce di menu."
COM_ICAGENDA_FORM_FEATURE_DESCRIPTION_LABEL="Descrizione"
COM_ICAGENDA_FORM_FEATURE_DESCRIPTION_DESC="Descrizione Feature"
;
; Feature error message
COM_ICAGENDA_FORM_FEATURE_MIMETYPE_ERROR="Le icone supportate per le Feature,  devono essere nel formato  JPG, JPEG, GIF e PNG. Seleziona un altra immagine."

; Menus Options
COM_ICAGENDA_LOGO="<img src='../media/com_icagenda/images/iconicagenda48.png' alt='' />"
COM_ICAGENDA_SLOGAN="Componente per la gestione di un'agenda eventi"
COM_ICAGENDA_TITLE="<table><tr><td><img src='../media/com_icagenda/images/iconicagenda48.png' alt='' /></td><td width='10px'></td><td>Estensione per gestire Eventi in joomla!</td></tr></table>"
COM_ICAGENDA_FOOTER="<hr><i><small>Jooml!C &#8226; iCagenda &#8226; <a href='http://www.joomlic.com' target='_blank'>www.joomlic.com</a></small></i>"
COM_ICAGENDA_MENU_OPTIONS="<b>!Cagenda Opzioni</b>"
COM_MENUS_ICAGENDA_FIELDSET_LABEL="<b>!Cagenda Opzioni</b>"
COM_MENUS_BASIC_FIELDSET_LABEL="iCagenda - Parametri della <i>lista degli eventi</i>"
COM_MENUS_FILTER_FIELDSET_LABEL="Filtra"

COM_ICAGENDA_LBL_TIME="Seleziona gli Eventi"
COM_ICAGENDA_DESC_TIME="Selezionare gli eventi da visualizzare (futuri, passati o tutti)"
COM_ICAGENDA_OPTION_TODAY_AND_UPCOMING="Non ci sono eventi oggi"
COM_ICAGENDA_OPTION_TODAY="Gli eventi di Oggi"

COM_ICAGENDA_TIME_LBL="Filtra per data"
COM_ICAGENDA_TIME_DESC="Visualizza tutte, passate, attuali di oggi e/o prossimi eventi"
COM_ICAGENDA_OPTION_PAST_EVENTS="Eventi Passati"
COM_ICAGENDA_OPTION_CURRENT_EVENTS_TODAY_EVENTS="Eventi di oggi Prossimi Eventi"
COM_ICAGENDA_OPTION_CURRENT_EVENTS_TODAY_AND_UPCOMING_EVENTS="Evento Corrente e Tutti i prossimi"
COM_ICAGENDA_OPTION_UPCOMING_EVENTS="Prossimi Eventi"
COM_ICAGENDA_OPTION_ALL_EVENTS="Tutti gli Eventi"

COM_ICAGENDA_LBL_CATEGORY="Filtra per categoria"
COM_ICAGENDA_DESC_CATEGORY="Impone un filtro per categoria.<br/> In Joomla 2.5, è possibile utilizzare Ctrl-click (Windows) o Cmd-clic (Mac) per selezionare più di un elemento.<br /> In Joomla 3, se il campo verrà lasciato vuoto, verranno visualizzate tutte le categorie."
COM_ICAGENDA_ALL="Tutti"
COM_ICAGENDA_ALL_F="TUTTE"
COM_ICAGENDA_ALL_CATEGORIES="Tutte le Categorie"
COM_ICAGENDA_LBL_DATE="Ordina per Data"
COM_ICAGENDA_DESC_DATE="Ordina gli eventi per data.<br />Se selezionate 'Data Discendente', invertirete l'ordine cronologico, dallevento più prossimo, all'evento più vecchio (la data più vecchia sarà alla fine). <br /> Se selezionate 'Data Ascendente', l'ordine cronologico sarà impostato in maniera che verrà visualizzata prima la data dell'evento più vecchio, (la data più vecchia sarà prima)."
COM_ICAGENDA_DATE_ASC="Data Ascendente"
COM_ICAGENDA_DATE_DESC="Data Discendente"

; Features Menu Options
COM_ICAGENDA_MENU_EVENT_FEATURES_INCLUDE_EXCLUDE_LBL="Includi o escludi Features?"
COM_ICAGENDA_MENU_EVENT_FEATURES_INCLUDE_EXCLUDE_DESC="Indica se la feature dell'evento selezionato (eventualmente selezionalo) devono essere utilizzati per includere o escludere eventi dall'elenco. Questo permetterà di creare delle voci di menu complementari per dividere una serie di eventi in due gruppi (ad esempio, libero e non libero)."
COM_ICAGENDA_MENU_EVENT_FEATURES_INCLUDE="Includi Features"
COM_ICAGENDA_MENU_EVENT_FEATURES_EXCLUDE="Escludi Features"
COM_ICAGENDA_MENU_EVENT_FEATURES_ALL_OR_ANY_LBL="Tutte le Features o qualsiasi Feature?"
COM_ICAGENDA_MENU_EVENT_FEATURES_ALL_OR_ANY_DESC="Indica, quando è selezionato più di una feature, se tutte le feature dell'evento devono essere presenti per l'evento o solo una singola feature."
COM_ICAGENDA_MENU_EVENT_FEATURES_ANY_ONE_FEATURE="Qualsiasi o una  feature"
COM_ICAGENDA_MENU_EVENT_FEATURES_ALL_FEATURES_REQUIRED="Tutte le features richieste"

COM_MENUS_VIEW_FIELDSET_LABEL="Mostra"
COM_ICAGENDA_SHORT_DESCRIPTION_LBL="Descrizione breve"
COM_ICAGENDA_LBL_LIMIT="limite caratteri"
COM_ICAGENDA_DESC_LIMIT="Limite di caratteri auto creati dalla descizione completa per il testo di introduzione."
COM_ICAGENDA_LBL_CUSTOM_VALUE="Valore personalizzato"
COM_ICAGENDA_DESC_CUSTOM_VALUE="Inserisci un valore personalizzato, se non si vuole utilizzare il valore nelle opzioni generali"

COM_ICAGENDA_DISPLAY_CATINFOS_LABEL="Informazioni Categoria"
COM_ICAGENDA_DISPLAY_CATINFOS_DESC="Visualizza le informazioni selezionate per ciascuna categoria dell'elenco degli eventi (lista pagina principale)"

COM_ICAGENDA_LBL_NUMERO="Num. Eventi"
COM_ICAGENDA_DESC_NUMERO="Scegli il numero di eventi da visualizzare per pagina"
COM_ICAGENDA_LBL_FORMAT="Formato per la data"
COM_ICAGENDA_DESC_FORMAT="Seleziona il formato della data"
COM_ICAGENDA_SELECT_FORMAT="Seleziona il formato della data"
COM_ICAGENDA_DATE_FORMAT_NOTE1="La funzione Formato Data rileva la lingua di default che usa Joomla, al fine di fornire i formati di data standard nella vostra lingua. Se la tua lingua non è disponibile per iCagenda, l'inglese verrà utilizzata come lingua predefinita."
COM_ICAGENDA_DATE_FORMAT_NOTE2="in tutti i casi, è possibile scegliere un formato standard internationale personalizzabile, con un separatore."
COM_ICAGENDA_DATE_FORMAT_DEFAULT="Lingua Predefinita"
COM_ICAGENDA_DATE_FORMAT_CURRENT="Nella tua lingua corrente"
COM_ICAGENDA_DATE_FORMAT_ISO="Formato data internazionale (ISO)"
COM_ICAGENDA_DATE_FORMAT_SEPARATOR="Formati data globali con separatore"
COM_ICAGENDA_DATE_FORMAT_DMY="DMY (giorno, mese, anno)"
COM_ICAGENDA_DATE_FORMAT_MDY="MDY (mese, giorno, anno)"
COM_ICAGENDA_DATE_FORMAT_YMD="YMD (anno, mese, giorno)"

; Selection of the Theme Pack layout for calendar module
COM_ICAGENDA_THEME_PACK_LBL="Theme Pack"
COM_ICAGENDA_THEME_PACK_DESC="Selezionare il Theme Pack iCagenda da utilizzare per il layout dei contenuti (elenco degli eventi e dei dettagli degli eventi)."

COM_ICAGENDA_LBL_TEMPLATE="Tema grafico"
COM_ICAGENDA_DESC_TEMPLATE="Scegli il tema grafico da applicare alla pagina"
COM_ICAGENDA_LBL_DATE_SEPARATOR="Carattere Separatore"
COM_ICAGENDA_DESC_DATE_SEPARATOR="Inserisci un separatore per la data alternativo"
COM_ICAGENDA_DESC_DATE_COMPONENTS_SEPARATOR="Separatore per i componenti (sostituisci lo spazio bianco '␣')"
COM_ICAGENDA_LBL_MWIDTH="Larghezza della mappa"
COM_ICAGENDA_DESC_MWIDTH="larghezza della mappa (in px oppure in %)"
COM_ICAGENDA_LBL_MHEIGHT="Altezza della mappa"
COM_ICAGENDA_DESC_MHEIGHT="larghezza della mappa (in px oppure in %)"

; Newsletter
COM_ICAGENDA_TITLE_NEWSLETTER="Nuova Newsletter"
COM_ICAGENDA_TITLE_MAIL="Invia la Newsletter"
COM_ICAGENDA_FORM_LBL_NEWSLETTER_LIST="Lista iscritti"
COM_ICAGENDA_FORM_DESC_NEWSLETTER_LIST="lista iscritti da utilizzare per inviare informazioni sugli eventi"
COM_ICAGENDA_FORM_LBL_NEWSLETTER_OBJ="Oggetto"
COM_ICAGENDA_FORM_DESC_NEWSLETTER_OBJ="Indica l'oggetto della e-mail"
COM_ICAGENDA_NEWSLETTER_NO_OBJ_ALERT="Inserisci un oggetto"
COM_ICAGENDA_FORM_LBL_NEWSLETTER_BODY="Contenuto"
COM_ICAGENDA_FORM_DESC_NEWSLETTER_BODY="Il contenuto della Newsletter"
COM_ICAGENDA_NEWSLETTER_NO_BODY_ALERT="Sei pregato di scrivere un messaggio"
COM_ICAGENDA_NEWSLETTER_ERROR_ALERT="Impossibile inviare il messaggio"
COM_ICAGENDA_NEWSLETTER_SUCCESS="La newsletter è stata inviata con successo!"
COM_ICAGENDA_NEWSLETTER_NB_EMAIL_SEND="Numero di email inviate"
COM_ICAGENDA_NEWSLETTER_NB_EMAIL_NOT_SEND="%s indirizzi e-mail duplicati non inviati."
COM_ICAGENDA_NEWSLETTER_NO_EVENT_SELECTED="Seleziona evento e data"
COM_ICAGENDA_NEWSLETTER_NO_DATE_SELECTED="Seleziona la data"
ICAGENDA_JTOOLBAR_SEND="Invia"

; Themes
COM_ICAGENDA_THEMES="Gestione Temi"
COM_ICAGENDA_THEME_MANAGER="Gestore temi"
COM_ICAGENDA_TITLE_THEMES="Temi"
COM_ICAGENDA_UPLOAD_THEME_PACKAGE_FILE="Installa il Tema Grafico"
COM_ICAGENDA_UPLOAD_FILE="ZIP file"
COM_ICAGENDA_UPLOAD_FILE="ZIP file"
COM_ICAGENDA_INSTALL="Installa"
COM_ICAGENDA_UPLOAD_AND_INSTALL="Carica & Installa"
COM_ICAGENDA_THEMES_LIST_TITLE="Temi Installati"
COM_ICAGENDA_THEME_INSTALLED_VERSION="Versione Installata"
COM_ICAGENDA_THEME_LATEST_VERSION="Ultima Versione"
COM_ICAGENDA_THEME_NO_PREVIEW="Preview non disponibile"
COM_ICAGENDA_THEME_AUTHOR="Autore"
COM_ICAGENDA_THEME_AUTHOR_WEBSITE="Sito Web"
COM_ICAGENDA_THEME_UPDATE="Aggiornamento alla versione"
COM_ICAGENDA_THEME_AUTHOR_CONTACT="Contatta l'autore del tema per l'ultima versione"
COM_ICAGENDA_THEME_LATEST="Questa è la versione più recente"
COM_ICAGENDA_THEME_NB_THEMES_1="Ci sono"
COM_ICAGENDA_THEME_NB_THEMES_2="temi installati"
COM_ICAGENDA_THEME_UNKNOWN="Sconosciuto"
COM_ICAGENDA_CLICK_TO_ENLARGE="Clicca per ingrandire"

; Theme Packs Installation messages
COM_ICAGENDA_ERROR="Errore"
COM_ICAGENDA_SUCCESS_THEME_INSTALLED="tema installato con successo !"
COM_ICAGENDA_ERROR_THEME_APPLICATION_AREA="Errore durante l'installazione del tema !"
COM_ICAGENDA_ERROR_FIND_INSTALL_PACKAGE="Impossibile trovare il pacchetto d'installazione"
COM_ICAGENDA_ERROR_INSTALL_PATH_NOT_EXISTS="Il percorso d'installazione non esiste"
COM_ICAGENDA_ERROR_FIND_INFO_INSTALL_PACKAGE="Impossibile trovare le informazioni richieste nel pacchetto di installazione"
COM_ICAGENDA_ERROR_INSTALL_FILE_UPLOAD="Installazione impossibile. Controlla i permessi di Upload"
COM_ICAGENDA_ERROR_INSTALL_ZLIB="Il programma di installazione non può continuare finché Zlib non è installato, contatta il tuo fornitore di hosting."
COM_ICAGENDA_ERROR_NO_FILE_SELECTED="Nessun file selezionato"
COM_ICAGENDA_ERROR_UPLOAD_FILE="Si è verificato un errore durante il caricamento del file sul server."
COM_ICAGENDA_ERROR_NO_THEME_FILE="nessun file tema per iCagenda"
COM_ICAGENDA_ERROR_XML_INSTALL_ICAGENDA="Errore: Impossibile trovare un file XML valido per l'installazione di iCagenda."
COM_ICAGENDA_ERROR_XML_INSTALL="Errore: Impossibile trovare un file XML di configurazione nel pacchetto."
COM_ICAGENDA_FOLDER_NOT_EXISTS="La directory non esiste"
COM_ICAGENDA_ERROR_COPY_FOLDER_TO="Impossibile copiare la directory"
COM_ICAGENDA_FILE_NOT_EXISTS="Il file non esiste"
COM_ICAGENDA_ERROR_COPY_FILE_TO="Impossibile copiare il file"
COM_ICAGENDA_ERROR_INSTALL_FILE="Errore: Problema durante l'installazione del service pack"

; Locations (futur release ?)
COM_ICAGENDA_TITLE_LOCATIONS="Location"
COM_ICAGENDA_LOCATIONS_NAME="Nome"
COM_ICAGENDA_LOCATIONS_CITY="Città"
COM_ICAGENDA_LOCATIONS_ADDRESS="Indirizzo"

; Location (futur release ?)
COM_ICAGENDA_TITLE_LOCATION="Luogo"
COM_ICAGENDA_FORM_LBL_LOCATION_NAME="Nome"
COM_ICAGENDA_FORM_DESC_LOCATION_NAME="Nome del luogo che identifica il posto dove si terrà l'evento"
COM_ICAGENDA_FORM_LBL_LOCATION_CITY="Città"
COM_ICAGENDA_FORM_DESC_LOCATION_CITY="Città, paese, comune(da preferire la forma: 'ile de france (Paris)')"
COM_ICAGENDA_FORM_LBL_LOCATION_ADDRESS="indirizzo"
COM_ICAGENDA_FORM_DESC_LOCATION_ADDRESS="Indirizzo completo di via, numero, città, regione, paese, etc..."
COM_ICAGENDA_FORM_LBL_LOCATION_DESC="Descrizione"
COM_ICAGENDA_FORM_DESC_LOCATION_DESC="Breve descrizione luogo"

; Panel
COM_ICAGENDA_PANEL_ICAGENDA="iCagenda"
COM_ICAGENDA_FORM_LBL_EVENT_PARAMS="Parametri"
COM_ICAGENDA_TITLE_ICAGENDA="pannello di Controllo"
COM_ICAGENDA_TITLE_ICAGENDA_IMAGE="<img src='../media/com_icagenda/images/blanck.png'/ alt='' >"
COM_ICAGENDA_PANEL_EVENT_MANAGER="Gestione degli Eventi"
COM_ICAGENDA_PANEL_REGIST_MANAGER="Gestione Iscrizioni"
COM_ICAGENDA_PANEL_UPDATE_LOGS="ChangeLog"
COM_ICAGENDA_FEATURES_BACKEND="<b>Back-End :</b> Gestione delle categorie, creazione eventi, gestione iscritti, newsletter..."
COM_ICAGENDA_FEATURES_FRONTEND="<b>Front-End :</b> Inscrizione agli eventi, condividere sui social network, GoogleMaps, scelta del thema..."
COM_ICAGENDA_PANEL_TEXT="<i>Estensione basata su xcal 2 (beta) creata da JonxDuo.</i><br />\nQuesta estensione è in fase di sviluppo sotto il nome di <b>iCagenda</b>.<br />\nL'obiettivo di questo nuovo progetto, per gentile concessione del suo creatore originale, è quello di consentire la continuazione e lo sviluppo di questa estensione per una versione stabile e scalabile.<br />\n<b>iCagenda</b> è stato progettato per essere compatibile (con poche modifiche) con la prossima versione di joomla 3.0 STS! ® e le sue versioni future.<br />\nUn ringraziamento particolare a JonxDuo per tutto il suo lavoro."
COM_ICAGENDA_PANEL_CATEGORY="Categorie"
COM_ICAGENDA_PANEL_NEW_CATEGORY="inserisci<br/>una categoria"
COM_ICAGENDA_PANEL_EVENTS="Lista degli<br/>Eventi"
COM_ICAGENDA_PANEL_NEW_EVENT="Inserisci<br/>un Evento"
COM_ICAGENDA_PANEL_LOCATIONS="Location"
COM_ICAGENDA_PANEL_NEW_LOCATION="Inserisci una location"
COM_ICAGENDA_PANEL_REGISTRATION="Iscrizione"
COM_ICAGENDA_PANEL_NEWSLETTER="Newsletter"
COM_ICAGENDA_ADDITIONALS_LABEL="Addizionali"
COM_ICAGENDA_PANEL_CUSTOMFIELDS="Campi personalizzati"
COM_ICAGENDA_PANEL_FEATURES="Features"
COM_ICAGENDA_PANEL_THEMES="Installazione<br />Temi"
COM_ICAGENDA_PANEL_ALERT="In Costruzione....<br />\nFunzioni presto disponibili!"
COM_ICAGENDA_PANEL_UPDATE_AND_INFOS=" Update & info"
COM_ICAGENDA_INFO="Info"
COM_ICAGENDA_VERSION="Versione"
COM_ICAGENDA_COPYRIGHT="Copyright"
COM_ICAGENDA_LICENSE="Licenza"
COM_ICAGENDA_LIBRARIES="Librerie"
COM_ICAGENDA_NEWS="Config. Richiesta<br>& Novità"
COM_ICAGENDA_DONATE="Dona con PayPal"
COM_ICAGENDA_TRANSLATOR="Traduzioni"
COM_ICAGENDA_PANEL_TRANSLATION="Crediti Traduzioni"
COM_ICAGENDA_PANEL_TRANSLATION_PACKS="Translation Packs"
COM_ICAGENDA_PANEL_TRANSLATION_PACKS_DONWLOAD="Download Language Pack"
COM_ICAGENDA_PANEL_SITE_VISIT="Visita il sito"
COM_ICAGENDA_PANEL_HELP_FORUM="Forum di Aiuto"
COM_ICAGENDA_PANEL_LEAD_DEVELOPER="Sviluppatore principale"
COM_ICAGENDA_PANEL_DEVELOPMENT_AID="collaboratori sviluppo"
COM_ICAGENDA_PANEL_BETATESTER="beta tester"
COM_ICAGENDA_PANEL_TEAM="Team iCagenda e membri del forum"
COM_ICAGENDA_PANEL_THANKS="Grazie a tutti Voi per la partecipazione al progetto!"
COM_ICAGENDA_PANEL_VERSION="La tua versione"
COM_ICAGENDA_PANEL_DATE="Data versione"
COM_ICAGENDA_PANEL_COPYRIGHT="Tutti i diritti riservati <br /> iCagenda&trade; è distribuito secondo i termini della Licenza GNU General Public License 3 o versione successiva; vedi LICENSE.txt <br /> Se utilizzi iCagenda&trade; sei pregato di inviare una valutazione e una revisione nella. JED:"
COM_ICAGENDA_PANEL_FREE_VERSION="Questa è una versione non commerciale di iCagenda&trade;. Rimuovi 'Powered by iCagenda', acquistando la versione commerciale. Non ci sono altre limitazioni in termini di funzionalità, ma con l'acquisto di una versione PRO ci aiuterete nel suo sviluppo e supporto."
COM_ICAGENDA_PANEL_PRO_VERSION="Con un account Pro, si avrà accesso a"
COM_ICAGENDA_PANEL_PRO_MODULE_IC_EVENT_LIST="Modulo iC Event List"
COM_ICAGENDA_PURCHASE="Acquista la versione PRO"
COM_ICAGENDA_PURCHASE_1_YEAR="PRO 12 MESI"
COM_ICAGENDA_PURCHASE_UNLIMITED="PRO ILLIMITATO"
COM_ICAGENDA_VERSIONS_COMPARISON="Versioni a confronto"
COM_ICAGENDA_VIDEO_GETTING_STARTED="Primi passi con iCagenda"
COM_ICAGENDA_VIDEO_TUTORIALS="Video Tutorials"
COM_ICAGENDA_PANEL_CONTRIBUTORS="Collaboratori iCagenda"
COM_ICAGENDA_PANEL_SPECIAL_THANKS="Grazie per l'aiuto allo sviluppo di importanti sezioni!"
COM_ICAGENDA_PANEL_THANKS_TEXT="Vorremmo ringraziare i nostri collaboratori, per l'impegno profuso e lo sforzo di rendere questo software quello che è. Queste persone hanno aiutato testando ed investendo tempo in questo progetto. Hanno creato e mantenuto la comunità di utenti iCagenda. iCagenda è disponibile in tutto il mondo, un grande ringraziamento ai traduttori!"
COM_ICAGENDA_PANEL_TEAM_1="video tutorial, coordinatore italiano e moderatore generale"
COM_ICAGENDA_PANEL_TEAM_2="Beta-Tester generale, moderatore principale"
COM_ICAGENDA_PANEL_TEAM_3="Moderatori del Forum"
COM_ICAGENDA_PANEL_TEAM_CODE_CONTRIBUTORS="Code Contributors"


; Traductions dates.js
SA="Sa"
SU="Do"
MO="Lu"
TU="Ma"
WE="Me"
TH="Gi"
FR="Ve"

; Traductions textes timepiker.js
COM_ICAGENDA_TP_CURRENT="Attuale"
COM_ICAGENDA_TP_CLOSE="Salva"
COM_ICAGENDA_TP_TITLE="Scegli l'ora"
COM_ICAGENDA_TP_TIME="Orario"
COM_ICAGENDA_TP_HOUR="Ore"
COM_ICAGENDA_TP_MINUTE="Minuti"

; iCagenda Live Update
LIVEUPDATE_INSTALL_ERROR="Errore di installazione %s"
LIVEUPDATE_INSTALL_SUCCESS="nstallazione %s avvenuta con successo"
LIVEUPDATE_INSTALL_TYPE_COMPONENT="Componente"
LIVEUPDATE_INSTALL_TYPE_FILE="file"
LIVEUPDATE_INSTALL_TYPE_LANGUAGE="lingua"
LIVEUPDATE_INSTALL_TYPE_LIBRARY="libreria"
LIVEUPDATE_INSTALL_TYPE_MODULE="modulo"
LIVEUPDATE_INSTALL_TYPE_PACKAGE="pacchetto"
LIVEUPDATE_INSTALL_TYPE_PLUGIN="plugin"
LIVEUPDATE_INSTALL_TYPE_TEMPLATE="template"

; iCagenda Live Update
LIVEUPDATE_ERROR_NEEDS_PRO_ID="Devi inserire il tuo ID Pro nelle opzioni globali del componente prima di tentare di eseguire l'aggiornamento alla versione più recente. Il pulsante di aggiornamento rimarrà disattivato fino a quando non l'avrai fatto."
LIVEUPDATE_NAGSCREEN_HEAD_ICAGENDA="ATTENZIONE! Si sta per installare una versione pre-release di iCagenda."
LIVEUPDATE_NAGSCREEN_VERSION_ICAGENDA="Versione Pre-release (iCagenda %s - %s)."
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ALERT_TOP="Il ciclo di vita di una versione del software è la somma delle fasi di sviluppo e di maturità per un pezzo di software."
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ICAGENDA_ALPHA="Alpha"
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ALERT_ALPHA="può essere instabile e potrebbe causare crash o perdita di dati."
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ICAGENDA_BETA="Beta"
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ALERT_BETA="in genere hanno molte più bug in un software completo, nonché questioni di velocità/prestazioni."
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ICAGENDA_RC="RC (Release Candidate)"
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ALERT_RC="Questa versione pre-release è potenzialmente un prodotto finale, pronta per il rilascio e con meno bug significativi."
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ALERT_BOTTOM="Se non sei sicuro di ciò che stai per fare, clicca sul tasto 'Indietro'.<br />Se siete assolutamente certi di capire i rischi connessi con l'installazione di versioni instabili, fare clic sul pulsante qui sotto per continuare il installazione di questa release."
LIVEUPDATE_NAGSCREEN_FOOTER_ICAGENDA="info:"

; Admin Permissions
COM_ICAGENDA_ACCESS_VIEW_CATEGORIES="Accesso Amministrazione Categorie"
COM_ICAGENDA_ACCESS_VIEW_CATEGORIES_DESC="Consente agli utenti del gruppo di accedere all'amministrazione categorie per iCagenda."
COM_ICAGENDA_ACCESS_VIEW_EVENTS="Accesso Amministrazione Eventi"
COM_ICAGENDA_ACCESS_VIEW_EVENTS_DESC="Consente agli utenti del gruppo di accedere all'amministrazione eventi per i iCagenda."
COM_ICAGENDA_ACCESS_VIEW_REGISTRATIONS="Accesso amministrazione iscrizioni"
COM_ICAGENDA_ACCESS_VIEW_REGISTRATIONS_DESC="Consente agli utenti del gruppo di accedere all'amministrazione registrazioni per iCagenda."
COM_ICAGENDA_ACCESS_VIEW_NEWSLETTER="Accesso Aministrazione Newsletter"
COM_ICAGENDA_ACCESS_VIEW_NEWSLETTER_DESC="Consente agli utenti del gruppo di accedere all'amministrazione Newsletter per iCagenda."
COM_ICAGENDA_ACCESS_VIEW_THEMES="Accesso gestione Temi per icagenda"
COM_ICAGENDA_ACCESS_VIEW_THEMES_DESC="Consente agli utenti del gruppo di accedere alla gestione dei temi di iCagenda."
COM_ICAGENDA_ACCESS_VIEW_CUSTOMFIELDS="Accesso Amministrazione Campi Personalizzati"
COM_ICAGENDA_ACCESS_VIEW_CUSTOMFIELDS_DESC="Consente agli utenti del gruppo di accedere all'amministrazione dei campi personalizzati per iCagenda."
COM_ICAGENDA_ACCESS_VIEW_FEATURES="Accesso Amministrazione Features"
COM_ICAGENDA_ACCESS_VIEW_FEATURES_DESC="Consente agli utenti del gruppo di accedere all'amministrazione delle funzionalità di iCagenda."

COM_ICAGENDA_FEATURES_ICONSIZE_LIST_LABEL="Lista Features dimensioni icone"
COM_ICAGENDA_FEATURES_ICONSIZE_LIST_DESC="Selezionare la dimensione delle icone delle feature da visualizzare nella lista degli eventi principale."
COM_ICAGENDA_FEATURES_ICONSIZE_EVENT_LABEL="Dimensioni icone Features Eventi"
COM_ICAGENDA_FEATURES_ICONSIZE_EVENT_DESC="Selezionare la dimensione delle icone delle feature da visualizzare nella pagina singolo evento."
COM_ICAGENDA_FEATURES_ICONSIZE_NONE="Non visualizzare le icone"
COM_ICAGENDA_FEATURES_ICONSIZE_16="16 bit icons"
COM_ICAGENDA_FEATURES_ICONSIZE_24="24 bit icons"
COM_ICAGENDA_FEATURES_ICONSIZE_32="32 bit icons"
COM_ICAGENDA_FEATURES_ICONSIZE_48="48 bit icons"
COM_ICAGENDA_FEATURES_ICONSIZE_64="64 bit icons"
COM_ICAGENDA_SHOW_FEATURE_ICON_TITLE_LABEL="Visualizza il titolo delle icone delle Features?"
COM_ICAGENDA_SHOW_FEATURE_ICON_TITLE_DESC="Selezionare se il valore inserito per l'attributo ALT delle icone verrà utilizzato anche come attributo per il tag TITLE (per fornire un valore al tooltip quando il mouse viene passato sopra)."

; Override the 'do not use' value for the icon file selector drop-down list
JOPTION_DO_NOT_USE="- Icona non richiesta -"

; Common Strings for Modules
ICAGENDA_FILTERING_SHORTDESC_LABEL="Filtra HTML per Auto-Introtext"
ICAGENDA_FILTERING_SHORTDESC_DESC="Determina come l'HTML viene filtrato in Auto-Introtext."
ICAGENDA_GLOBAL_OPTION="Utilizza le opzione globali di iCagenda"
ICAGENDA_FILTERING_NO_HTML="No HTML"
ICAGENDA_FILTERING_ALL_ITALIC="Tutto corsivo"

ICAGENDA_AUTO_INTROTEXT_LIMIT_LABEL="Limite caratteri Auto-Introtext"
ICAGENDA_AUTO_INTROTEXT_LIMIT_DESC="Limite caratteri del testo dell'introduzione auto-creato dalla descrizione completa (quando utilizzato)."


;
; DEPRECATED
;
ICEVENT="Evento"
ICEVENTS="Eventi"
language/it-IT/it-IT.com_acymailing.sys.ini000060400000001313152453623440014475 0ustar00COM_ACYMAILING="AcyMailing"
ACYMAILING="AcyMailing"
COM_ACYMAILING_CONFIGURATION="AcyMailing"
USERS="Utenti"
LISTS="Gestione Liste"
TEMPLATES="Modelli"
NEWSLETTERS="Newsletter"
AUTONEWSLETTERS="Smart-Newsletters"
CAMPAIGN="Campagna"
QUEUE="Coda"
STATISTICS="Statistiche"
CONFIGURATION="Configurazione"
UPDATE_ABOUT="Aggiorna / Info"
COM_ACYMAILING_ARCHIVE_VIEW_DEFAULT_TITLE="Archivio Elenchi Email (Singolo)"
COM_ACYMAILING_FRONTSUBSCRIBER_VIEW_DEFAULT_TITLE="Front-end gestione degli utenti"
COM_ACYMAILING_LISTS_VIEW_DEFAULT_TITLE="Archivio Elenchi Email (Tutti)"
COM_ACYMAILING_FRONTNEWSLETTER_VIEW_DEFAULT_TITLE="Creare una Newsletter"
COM_ACYMAILING_USER_VIEW_DEFAULT_TITLE="Creare/modificare un abbonamento"
language/it-IT/it-IT.plg_system_ic_library.ini000060400000001001152453623440015264 0ustar00; iCagenda
; Copyright (c)2014 Cyril Rezé (Lyr!C) / JoomliC.com - All rights reserved.
; License GNU General Public License version 3 or later <http://www.gnu.org/licenses/gpl.html>
; Note : All ini files need to be saved as UTF-8
;
; PLG_SYSTEM_IC_LIBRARY	: plg_system_ic_library.ini
; Translation Platform	: https://www.transifex.com/projects/p/icagenda/


PLG_SYSTEM_IC_LIBRARY = "System - iC Library"
PLG_SYSTEM_IC_LIBRARY_XML_DESCRIPTION = "Questo plugin utilizza le classi della libreria iC (by Jooml!C)."
language/it-IT/it-IT.plg_search_icagenda.ini000060400000002164152453623440014634 0ustar00; iCagenda
; Copyright (c)2012-2014 Cyril Rezé (Lyr!C) / JoomliC.com - All rights reserved.
; License GNU General Public License version 3 or later <http://www.gnu.org/licenses/gpl.html>
; Note : All ini files need to be saved as UTF-8
;
; ICAGENDA_PLG_SEARCH	: plg_search_icagenda.ini
; Translation Platform	: https://www.transifex.com/projects/p/icagenda/


ICAGENDA_PLG_SEARCH = "Search - iCagenda"
ICAGENDA_PLG_SEARCH_XML_DESCRIPTION = "Il plugin iCagenda Search abilita la ricerca degli eventi."

ICAGENDA_PLG_SEARCH_NAME_LABEL = "Sezione"
ICAGENDA_PLG_SEARCH_NAME_DESC = "Per impostazione predefinita, la ricerca userà 'Eventi' come il nome della sezione del modulo di ricerca. Se si desidera utilizzare un termine alternativo per gli eventi, è possibile immettere il valore in questo campo."

ICAGENDA_PLG_SEARCH_TARGET_LABEL = "Target"
ICAGENDA_PLG_SEARCH_TARGET_DESC = "Target del browser quando si fa clic sul collegamento all'evento."

ICAGENDA_PLG_SEARCH_SECTION_EVENTS = "Eventi"

ICAGENDA_PLG_SEARCH_ALERT_NO_ICAGENDA_MENUITEM = "Ricerca in eventi disabilitata: nessuna voce di menu alla lista degli eventi è pubblicata."
language/it-IT/it-IT.plg_system_ic_library.sys.ini000060400000001020152453623440016102 0ustar00; iCagenda
; Copyright (c)2014 Cyril Rezé (Lyr!C) / JoomliC.com - All rights reserved.
; License GNU General Public License version 3 or later <http://www.gnu.org/licenses/gpl.html>
; Note : All ini files need to be saved as UTF-8
;
; PLG_SYSTEM_IC_LIBRARY	: plg_system_ic_library.sys.ini
; Translation Platform	: https://www.transifex.com/projects/p/icagenda/


PLG_SYSTEM_IC_LIBRARY = "Libreria di Sistema iC Library"
PLG_SYSTEM_IC_LIBRARY_XML_DESCRIPTION = "Questo plugin utilizza le classi della libreria iC (by Jooml!C)."
language/bg-BG/bg-BG.com_acymailing.sys.ini000060400000001666152453623440014370 0ustar00COM_ACYMAILING="AcyMailing"
ACYMAILING="AcyMailing"
COM_ACYMAILING_CONFIGURATION="AcyMailing"
USERS="Потребители"
LISTS="Списъци"
TEMPLATES="Шаблони"
NEWSLETTERS="Писма"
AUTONEWSLETTERS="Smart-Newsletters"
CAMPAIGN="Кампания"
QUEUE="Опашка"
STATISTICS="Статистика"
CONFIGURATION="Конфигурация"
UPDATE_ABOUT="Обноваване / За"
COM_ACYMAILING_ARCHIVE_VIEW_DEFAULT_TITLE="Изпращане архив на списъка (единичен)"
COM_ACYMAILING_FRONTSUBSCRIBER_VIEW_DEFAULT_TITLE="Управление на абонатите през потребителската част"
COM_ACYMAILING_LISTS_VIEW_DEFAULT_TITLE="Изпращане архив на списъка (всички)"
COM_ACYMAILING_FRONTNEWSLETTER_VIEW_DEFAULT_TITLE="Създай бюлетин"
COM_ACYMAILING_USER_VIEW_DEFAULT_TITLE="Създай или редактирай абонамент"
language/es-ES/es-ES.com_acymailing.sys.ini000060400000001321152453623440014450 0ustar00COM_ACYMAILING="AcyMailing"
ACYMAILING="AcyMailing"
COM_ACYMAILING_CONFIGURATION="AcyMailing"
USERS="Usuarios"
LISTS="Listas"
TEMPLATES="Plantillas"
NEWSLETTERS="Boletines"
AUTONEWSLETTERS="Smart-Newsletters"
CAMPAIGN="Campaña"
QUEUE="Cola"
STATISTICS="Estadísticas"
CONFIGURATION="Configuración"
UPDATE_ABOUT="Actualizar / Sobre"
COM_ACYMAILING_ARCHIVE_VIEW_DEFAULT_TITLE="Archivo de Lista de Correo (Único)"
COM_ACYMAILING_FRONTSUBSCRIBER_VIEW_DEFAULT_TITLE="Gestión de usuarios en el Front-end"
COM_ACYMAILING_LISTS_VIEW_DEFAULT_TITLE="Archivo de Lista de Correo (Todos)"
COM_ACYMAILING_FRONTNEWSLETTER_VIEW_DEFAULT_TITLE="Crear Boletín"
COM_ACYMAILING_USER_VIEW_DEFAULT_TITLE="Crear/modificar una suscripción"
language/es-ES/es-ES.plg_xmap_com_content.ini000060400000005535152453623440015072 0ustar00XMAP_SETTING_EXPAND_CATEGORIES="Expandir Categorias"
XMAP_SETTING_EXPAND_CATEGORIES_DESC="Seleccione "Si" para incluir todos los artículos que se encuentran dentro de cada categoría en el mapa de sitio"
XMAP_SETTING_EXPAND_FEATURED="Expandir Destacados"
XMAP_SETTING_EXPAND_FEATURED_DESC="Set true if Xmap should include the articles within each &quot;Featured Articles&quot; link (usually the frontpage menu item)"
XMAP_SETTING_SHOW_UNAUTH_LINKS="Show Unauthorized Links"
XMAP_SETTING_SHOW_UNAUTH_LINKS_DESC="If yes, will show links to content to registered content even if you are not logged in.  The user will need to login to see the item in full."
XMAP_SETTING_MAX_ART_CAT="Max. Artículos por Categoríay"
XMAP_SETTING_MAX_ART_CAT_DESC="Número máximo de artículos por categoría que se incluirán en el mapa de sitio (0 = sin límite)"
XMAP_SETTING_MAX_ART_AGE="Max. Article's Age in days"
XMAP_SETTING_MAX_ART_AGE_DESC="The maximun number of days that an article must have to be included in the sitemap. (0 for no limit)"
XMAP_SETTING_CAT_PRIORITY="Prioridad Categorias"
XMAP_SETTING_CAT_PRIORITY_DESC="Set the priority for the categories"
XMAP_SETTING_CAT_CHANCE_FREQ="Fecuencia de actualización Cagegorias"
XMAP_SETTING_CAT_CHANCE_FREQ_DESC="Set the chage frequency for the categories"
XMAP_SETTING_ART_PRIORITY="Article Priority"
XMAP_SETTING_ART_PRIORITY_DESC="Set the priority for articles"
XMAP_SETTING_ART_CHANCE_FREQ="Article Change frequency"
XMAP_SETTING_ART_CHANCE_FREQ_DESC="Set the chage frequency for articles"
XMAP_SETTING_ADD_PAGEBREAKS_LABEL="Incluir saltos de página"
XMAP_SETTING_ADD_PAGEBREAKS_DESC="Seleccione si para incluir las sub-páginas de un artículo en el mapa del sitio."
XMAP_SETTING_ADD_IMAGES_LABEL="Incluir imágenes?"
XMAP_SETTING_ADD_IMAGES_DESC="If yes, will parse the content of the article searching for images to add them to the site map. Valid Only for XML site map (Search engines Sitemap)"
XMAP_NEWS_FIELDSET_LABEL="Google News Sitemap Settings"
XMAP_SETTING_NEWS_KEYWORDS_DESC="Which keywords should we use for Google News Sitemap?"
XMAP_SETTING_NEWS_KEYWORDS_LABEL="Keywords"
XMAP_SETTING_NEWS_KEYWORDS_METAKEYS="Article's Metakeys"
XMAP_SETTING_NEWS_KEYWORDS_CATTITLE="Catetegory Title"
XMAP_SETTING_NEWS_KEYWORDS_METAKEYS_CATTITLE="Article's Metakeys + Category Title"
XMAP_SETTING_NEWS_KEYWORDS_NONE="None"

; Generic Extension settings strings
COM_PLUGINS_BASIC_FIELDSET_LABEL="Opciones Básicas"
COM_PLUGINS_XML_FIELDSET_LABEL="XML Sitemap Settings"
COM_PLUGINS_NEWS_FIELDSET_LABEL="News Sitemap Settings"
XMAP_OPTION_USE_PARENT_MENU="Use Parent Menu Settings"
XMAP_OPTION_NEVER="Never"
XMAP_OPTION_ALWAYS="Always"
XMAP_OPTION_XML_ONLY="In XML Sitemap Only"
XMAP_OPTION_HTML_ONLY="In HTML Sitemap Only"
XMAP_OPTION_WEEKLY="Weekly"
XMAP_OPTION_DAILY="Daily"
XMAP_OPTION_MONTHLY="Monthly"
XMAP_OPTION_YEARLY="Yearly"
XMAP_OPTION_HOURLY="Hourly"

language/es-ES/es-ES.com_xmap.ini000060400000016343152453623440012475 0ustar00; $Id$
; Xmap component
; Guillermo Vargas (guille@vargas.co.cr)
; Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
; GNU General Public License version 2 or later; see LICENSE.txt
;

; Component Instalation strings
XMAP_INSTALLING_XMAP="Installing Xmap component - The site map generator for Joomla!"
XMAP_UPGRADING_XMAP="Upgrading Xmap component - The site map generator for Joomla!"
XMAP_UNISTALLING_XMAP_EXTENSIONS="Unistalling Xmap's extensions"
XMAP_INSTALLED_EXTENSION_X="Installing %s extension"
XMAP_NOT_INSTALLED_EXTENSION_X="It was not possible to install the extension for %s"

XMAP_HEADING_XML_STATS="Estadísiticas Mapa XML"
XMAP_HEADING_HTML_STATS="Estadísticas Mapa HTML"
XMAP_HEADING_NUM_LINKS="Num. Enlaces"
XMAP_HEADING_NUM_HITS="Visitas"
XMAP_HEADING_LAST_VISIT="Ult. Visita"
XMAP_HEADING_SITEMAP="Mapa de Sitio"
XMAP_HEADING_DEFAULT="Predeterminado"
XMAP_HEADING_ID="ID"
XMAP_HEADING_PUBLISHED="Publicado"
XMAP_HEADING_ACCESS="Acceso"
XMAP_SUBMENU_SITEMAPS="Mapas de sitio"
XMAP_SUBMENU_EXTENSIONS="Extensiones"
XMAP_SUBMENU_SETTINGS="Configuración"
XMAP_TOOLBAR_SET_DEFAULT="Predeterminar"
XMAP_SITEMAPS_TITLE="Gestión de Mapas de sitio"
DATE_MINUTES_AGO="Hace %d minutos"
DATE_HOURS_MINUTES_AGO="Hace %d horas y %d minutos"
DATE_DAYS_HOURS_AGO="Hace %d dias y %d horas"
DATE_NEVER="Nunca"
XMAP_INTROTEXT_LABEL="Texto Introductorio"
XMAP_INTROTEXT_DESC="Digite el texto que se mostrará en la parte superior del site map"
XMAP_PRIORITY="Prioridad"
XMAP_CHANGE_FREQUENCY="Fecuencia de cambios"
XMAP_PAGE_ADD_SITEMAP="Nuevo mapa de sitio"
XMAP_PAGE_EDIT_SITEMAP="Editar mapa de sitio"
XMAP_SITEMAP_DETAILS_FIELDSET="Detalles del Mapa de sitio"
XMAP_XML_LINK="XML Sitemap"
XMAP_XML_LINK_TOOLTIP="Ir a la versión XML del mapa de sitio, utilice este URL para agregar su mapa de sitio en Google u otros motores de búsqueda."
XMAP_NEWS_LINK="News Sitemap"
XMAP_NEWS_LINK_TOOLTIP="Ir a la versión &ldquo;News&rdquo; del mapa de sitio, utilice este URL para enviar sus últimas noticias a Google News"
XMAP_IMAGES_LINK="Images Sitemap"
XMAP_IMAGES_LINK_TOOLTIP="Ir a la versión &ldquo;Images&rdquo; del mapa del sitio, utilice este URL para agregar su mapa de sitio en Google u otros motores de búsqueda."

XMAP_MESSAGE_EXTENSIONS_DISABLED="Xmap ha detectado que las siguientes extensiones podrían ayudarle a agregar mas contenido en su mapa de sitio pero están deshabilitadas. Es necesario que las habilite manualmente visitando el <a href='index.php?option=com_plugins&view=plugins&filter_type=xmap&filter_folder=xmap'>administrador de extensiones</a>: %s"
COM_XMAP_SITEMAPS_N_ITEMS_UNPUBLISHED="%d mapas de sitio se han despublicado correctamente"
COM_XMAP_SITEMAPS_N_ITEMS_UNPUBLISHED_1="%d mapa de sitio se ha despublicado correctamente"
COM_XMAP_SITEMAPS_N_ITEMS_PUBLISHED="%d mapas de sitio se han publicado correctamente"
COM_XMAP_SITEMAPS_N_ITEMS_PUBLISHED_1="%d mapa de sitio se ha publicado correctamente"
COM_XMAP_SITEMAPS_N_ITEMS_TRASHED="%d mapas de sitio enviados a la papelera correctamente"
COM_XMAP_SITEMAPS_N_ITEMS_TRASHED_1="%d mapa de sitio enviado a la papelera correctamente"
COM_XMAP_SITEMAPS_N_ITEMS_DELETED="%d mapas de sitio eliminados correctamente"
COM_XMAP_SITEMAPS_N_ITEMS_DELETED_1="%d mapa de sitio eliminado correctamente"

XMAP_FIELDSET_MENUS="Menus"
XMAP_FIELDSET_OPTIONS="Opciones"
XMAP_FIELDSET_METADATA="Metadata"
XMAP_ATTRIBS_SHOW_INTRO_LABEL="Texto Introductorio"
XMAP_ATTRIBS_SHOW_INTRO_DESC="Debemos mostrar el texto introductorio en el mapa del sitio?"
XMAP_ATTRIBS_SHOW_MENU_TITLE_LABEL="Título del Menú"
XMAP_ATTRIBS_SHOW_MENU_TITLE_DESC="Debemos mostrar el título del menú en el mapa del sitio?"
XMAP_ATTRIBS_CLASSNAME_LABEL="Clase CSS"
XMAP_ATTRIBS_CLASSNAME_DESC="La clase CSS para utilizar en este mapa de sitio."
XMAP_ATTRIBS_COLUMNS_LABEL="# Columnas"
XMAP_ATTRIBS_COLUMNS_DESC="Indique el número de columnas en que se debe desplegar el mapa de sitio HTML. (Esta propiedad solo tiene validez si el mapa del sitio tiene mas de un menú)"
XMAP_ATTRIBS_EXTERNAL_LINKS_IMAGE_LABEL="Imagen para enlaces externos"
XMAP_ATTRIBS_EXTERNAL_LINKS_IMAGE_DESC="Seleccione una imágen para diferenciar los enlaces externos de los internos."
XMAP_ATTRIBS_COMPRESS_XML_LABEL="Comprimir XML"
XMAP_ATTRIBS_COMPRESS_XML_DESC="Debemos comprimir el mapa de sitio en formato XML?"
XMAP_ATTRIBS_BEAUTIFY_XML_LABEL="Embellecer XML"
XMAP_ATTRIBS_BEAUTIFY_XML_DESC="Seleccione 'Si' para darle estilo al mapa de sitio en formato XML. Esto aplica para humanos solamente y no afecta en ningún sentido el comportamiento de los buscadores o robots. Si su mapa de sitio se muestra como una página en blanco o su navegador despliega errores entonces intente deshabilitando esta opción."
XMAP_ATTRIBS_NEWS_PUBLICATION_NAME_LABEL="Publication Name"
XMAP_ATTRIBS_NEWS_PUBLICATION_NAME_DESC="Este es el nombre de la publicación. Debe coincidir exactamente con el nombre que aparezca en los artículos de su sitio incluidos en news.google.com/news?ned=es, omitiendo cualquier paréntesis posterior. Por ejemplo, si el nombre aparece en Google Noticias como &ldquo;El Mundo (suscripción)&rdquo;, debe utilizar el nombre &ldquo;El Mundo&rdquo;"
XMAP_ATTRIBS_NEWS_POSTS_KEYWORDS_LABEL="Posts keywords"
XMAP_ATTRIBS_NEWS_POSTS_KEYWORDS_DESC="Comma separated list of keywords to describe your posts. Default to the post's category title."
XMAP_ATTRIBS_INCLUDE_LINK_LABEL="Enlace al autor"
XMAP_ATTRIBS_INCLUDE_LINK_DESC="Incluir un enlace (link) al sitio de Xmap al pie del site map HTML."

; Extension edit page
XMAP_PAGE_EDIT_EXTENSION="Editar Extensión"
XMAP_N_EXTENSIONS_UNPUBLISHED="%s extensiones despublicadas"
XMAP_N_EXTENSIONS_PUBLISHED="%s extensiones publicadas"
XMAP_EXTENSION_DETAILS="Detalles"
XMAP_EXTENSION_AUTHOR="Autor"
XMAP_EXTENSION_AUTHOR_EMAIL="Email del Autor"
XMAP_EXTENSION_AUTHOR_WEBSITE="Sitio WEB del Autor"
XMAP_EXTENSION_DESCRIPTION="Descripción"

XMAP_DESC_EXTENSIONS="Lista de extensiones para Xmap instaladas"
XMAP_HEADING_AUTHOR="Autor"
XMAP_HEADING_DATE="Fecha"
XMAP_HEADING_FOLDER="Carpeta"
XMAP_HEADING_NUM="Núm."
XMAP_HEADING_PLUGIN="Extensión"
XMAP_HEADING_VERSION="Versión"
XMAP_INSTALL="Instalar"
XMAP_INSTALL_DIRECTORY="Carpeta de instalación"
XMAP_INSTALL_FROM_DIRECTORY="Instalar desde carpeta"
XMAP_INSTALL_FROM_URL="Instalar desde URL"
XMAP_INSTALL_NEW_EXTENSION="Instalar una nueva extensión"
XMAP_INSTALL_URL="URL de instalación"
XMAP_PACKAGE_FILE="Archivo de instalación"
XMAP_PLEASE_ENTER_A_URL="Por favor ingrese una URL"
XMAP_PLEASE_SELECT_A_DIRECTORY="Por favor indique una carpeta"
XMAP_PLEASE_SELECT_A_FILE_TO_UPLOAD="Por favor indique un archivo para instalar"
XMAP_UPLOAD_FILE="Subir archivo"
XMAP_UPLOAD_PACKAGE_FILE="Subir archivo de instalación"
XMAP_EXTENSION_MANAGER_TITLE="Administrador de Extensiones"
XMAP_EXTENSIONS_TITLE="Extensiones"



; Generic Extension settings strings
XMAP_BASIC_FIELDSET_LABEL="Opciones Básicas"
XMAP_XML_FIELDSET_LABEL="Opciones para el Mapa de Sitio XML "
XMAP_OPTION_USE_PARENT_MENU="Usar opciones del menú"
XMAP_OPTION_NEVER="Nunca"
XMAP_OPTION_ALWAYS="Siempre"
XMAP_OPTION_XML_ONLY="Solo en el Mapa de Sitio XML"
XMAP_OPTION_HTML_ONLY="Solo en el Mapa de Sitio HTML"
XMAP_OPTION_WEEKLY="Semanalmente"
XMAP_OPTION_DAILY="Diariamente"
XMAP_OPTION_MONTHLY="Mensualmente"
XMAP_OPTION_YEARLY="Anualmente"
XMAP_OPTION_HOURLY="Cada hora"
language/es-ES/es-ES.com_xmap.sys.ini000060400000001764152453623440013313 0ustar00; $Id$
; Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
; GNU General Public License version 2 or later; see LICENSE.txt
; Guillermo Vargas (guille@vargas.co.cr)
;

COM_XMAP="Xmap"
COM_XMAP_TITLE="Xmap"

;
; View and layout titles and descriptions
;
COM_XMAP_SITEMAP_HTML_VIEW_DEFAULT_TITLE="Mapa de Sitio HTML"
COM_XMAP_SITEMAP_HTML_VIEW_DEFAULT_DESC="Muestra un mapa de sitio en formato HTML"
COM_XMAP_SITEMAP_XML_VIEW_DEFAULT_TITLE="Mapa de Sitio XML"
COM_XMAP_SITEMAP_XML_VIEW_DEFAULT_DESC="Mustra un mapa de sitio en formato XML"

COM_XMAP_SELECT_AN_SITEMAP="Seleccione un mapa de sitio"
COM_XMAP_SELECT_A_SITEMAP="Un mapa de sitio"
COM_XMAP_CHANGE_SITEMAP_BUTTON="Cambiar"
COM_XMAP_CHANGE_SITEMAP="Seleccionar un mapa de sitio de una lista"

COM_INSTALLER_TYPE_XMAP_EXT="Xmap Extension"
COM_XMAP_ATTRIBS_SITEMAP_SETTINGS_LABEL="Sitemap Settings"
COM_XMAP_INCLUDE_CSS_LABEL="Include Xmap's Style"
COM_XMAP_INCLUDE_CSS_DESC="Select yes to include the CSS file with the styles for the sitemap"language/es-ES/es-ES.plg_xmap_com_weblinks.ini000060400000002535152453623440015233 0ustar00XMAP_WL_PLUGIN_DESCRIPTION="Adds support for Weblinks component"
XMAP_WL_SETTING_SHOW_LINKS_LABEL="Show Links?"
XMAP_WL_SETTING_SHOW_LINKS_DESC="Should we include links into the site map?"
XMAP_WL_SETTING_MAX_LINKS_LABEL="Max links"
XMAP_WL_SETTING_MAX_LINKS_DESC="Max number of links per category to include on sitemap (Leave empty for no limit)"

; Generic Extension settings strings
COM_PLUGINS_BASIC_FIELDSET_LABEL="Basic Settings"
COM_PLUGINS_XML_FIELDSET_LABEL="XML Sitemap Settings"
COM_PLUGINS_NEWS_FIELDSET_LABEL="News Sitemap Settings"
XMAP_OPTION_USE_PARENT_MENU="Use Parent Menu Settings"
XMAP_OPTION_NEVER="Never"
XMAP_OPTION_ALWAYS="Always"
XMAP_OPTION_XML_ONLY="In XML Sitemap Only"
XMAP_OPTION_HTML_ONLY="In HTML Sitemap Only"
XMAP_OPTION_WEEKLY="Weekly"
XMAP_OPTION_DAILY="Daily"
XMAP_OPTION_MONTHLY="Monthly"
XMAP_OPTION_YEARLY="Yearly"
XMAP_OPTION_HOURLY="Hourly"

XMAP_WL_CATEGORY_PRIORITY_LABEL="Category Priority"
XMAP_WL_CATEGORY_PRIORITY_DESC="Set the priority for the categories"
XMAP_WL_CATEGORY_CHANGEFREQ_LABEL="Category Change frequency"
XMAP_WL_CATEGORY_CHANGEFREQ_DESC="Set the change frequency for the categories"
XMAP_WL_LINK_PRIORITY_LABEL="Link Priority"
XMAP_WL_LINK_PRIORITY_DESC="Set the priority for the links"
XMAP_WL_LINK_CHANGEFREQ_LABEL="Link Change frequency"
XMAP_WL_LINK_CHANGEFREQ_DESC="Set the change frequency for the links"language/nl-NL/nl-NL.plg_xmap_com_content.ini000060400000006155152453623440015101 0ustar00XMAP_SETTING_EXPAND_CATEGORIES="Klap categorieën uit"
XMAP_SETTING_EXPAND_CATEGORIES_DESC="Zet op ja als Xmap alle artikelen binnen iedere categorie moet opnemen"
XMAP_SETTING_EXPAND_FEATURED="Klap speciale artikelen uit"
XMAP_SETTING_EXPAND_FEATURED_DESC="Zet op ja als Xmap alle artikelen binnen "_QQ_"speciale artikelen"_QQ_" moet opnemen (meestal het home menu item)"
XMAP_SETTING_INCLUDE_ARCHIVED="Gearchiveerde opnemen"
XMAP_SETTING_INCLUDE_ARCHIVED_DESC="Selecteer indien de gearchiveerde artikelen in de sitemap moeten worden opgenomen"
XMAP_SETTING_SHOW_UNAUTH_LINKS="Toon ongeautoriseerde links"
XMAP_SETTING_SHOW_UNAUTH_LINKS_DESC="Indien dit is ingesteld op ja worden links naar inhoud voor geregistreerden getoond, ook als men niet is ingelogd. Men dient in te loggen om het toegang te krijgen to het volledige item."
XMAP_SETTING_MAX_ART_CAT="Max. Artikelen per categorie"
XMAP_SETTING_MAX_ART_CAT_DESC="Maximum aantal artikelen per categorie in de sitemap (0 voor geen limiet)."
XMAP_SETTING_MAX_ART_AGE="Max. leeftijd van artikelen in dagen"
XMAP_SETTING_MAX_ART_AGE_DESC="Het maximum aantal dagen dat een artikel opgenomen moet worden in de sitemap. (0 voor geen limiet)"
XMAP_SETTING_CAT_PRIORITY="Prioriteit van categorieën"
XMAP_SETTING_CAT_PRIORITY_DESC="Stel de prioriteit van de categorieën in"
XMAP_SETTING_CAT_CHANCE_FREQ="Wijzigfrequentie van categorieën"
XMAP_SETTING_CAT_CHANCE_FREQ_DESC="Stel de wijzigfrequentie van categorieën in"
XMAP_SETTING_ART_PRIORITY="Prioriteit van artikelen"
XMAP_SETTING_ART_PRIORITY_DESC="Stel de prioriteit van artikelen in"
XMAP_SETTING_ART_CHANCE_FREQ="Wijzigfrequentie van artikelen"
XMAP_SETTING_ART_CHANCE_FREQ_DESC="Stel de wijzigfrequentie van artikelen in"
XMAP_SETTING_ADD_PAGEBREAKS_LABEL="Voeg pagina-overgang toe"
XMAP_SETTING_ADD_PAGEBREAKS_DESC="Zo ja, dan zullen de subpagina's van een artikel in de sitemap worden opgenomen."
XMAP_SETTING_ADD_IMAGES_LABEL="Voeg afbeeldingen toe?"
XMAP_SETTING_ADD_IMAGES_DESC="Zo ja, dan zal de inhoud van artikelen doorzocht worden op afbeeldingen zodat ze toegevoegd worden aan de sitemap. Alleen geldig voor XML sitemap (zoekmachine sitemap)"
XMAP_NEWS_FIELDSET_LABEL="Google nieuws sitemap instellingen"
XMAP_SETTING_NEWS_KEYWORDS_DESC="Welk trefwoord moet gebruikt worden voor Google nieuws sitemap?"
XMAP_SETTING_NEWS_KEYWORDS_LABEL="Trefwoorden"
XMAP_SETTING_NEWS_KEYWORDS_METAKEYS="Artikelen metakeys"
XMAP_SETTING_NEWS_KEYWORDS_CATTITLE="Categorie titel"
XMAP_SETTING_NEWS_KEYWORDS_METAKEYS_CATTITLE="Artikelen metakeys + categorie titel"
XMAP_SETTING_NEWS_KEYWORDS_NONE="Geen"


; Generic Extension settings strings
COM_PLUGINS_BASIC_FIELDSET_LABEL="Standaard instellingen"
COM_PLUGINS_XML_FIELDSET_LABEL="XML sitemap instellingen"
COM_PLUGINS_NEWS_FIELDSET_LABEL="Nieuws sitemap instellingen"
XMAP_OPTION_USE_PARENT_MENU="Gebruik Hoofdmenu instellingen"
XMAP_OPTION_NEVER="Nooit"
XMAP_OPTION_ALWAYS="Altijd"
XMAP_OPTION_XML_ONLY="Alleen in XML sitemap"
XMAP_OPTION_HTML_ONLY="Alleen in HTML sitemap"
XMAP_OPTION_WEEKLY="Wekelijks"
XMAP_OPTION_DAILY="Dagelijks"
XMAP_OPTION_MONTHLY="Maandelijks"
XMAP_OPTION_YEARLY="Jaarlijks"
XMAP_OPTION_HOURLY="Ieder uur"language/nl-NL/nl-NL.com_xmap.ini000060400000014430152453623440012500 0ustar00; $Id$
; Xmap component
; Guillermo Vargas (guille@vargas.co.cr)
; Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
; GNU General Public License version 2 or later; see LICENSE.txt
;

; Component Instalation strings
XMAP_INSTALLING_XMAP="Installeren van Xmap component - De sitemap generator voor Joomla!"
XMAP_UPGRADING_XMAP="Bijwerken Xmap component - De sitemap generator voor Joomla!"
XMAP_UNISTALLING_XMAP_EXTENSIONS="Deïnstalleren Xmap extensies"
XMAP_INSTALLED_EXTENSION_X="Installeren %s extensie"
XMAP_NOT_INSTALLED_EXTENSION_X="Het was niet mogelijk de extensie voor %s te installeren"
XMAP_INSTALL_ERROR_EXTENSION="Fout bij het installeren van de extensie"
XMAP_INSTALL_SUCCESS_EXTENSION="Installatie van extensie was succesvol"

XMAP_HEADING_XML_STATS="XML sitemap statistieken"
XMAP_HEADING_HTML_STATS="HTML sitemap statistieken"
XMAP_HEADING_NUM_LINKS="Aant. items"
XMAP_HEADING_NUM_HITS="Hits"
XMAP_HEADING_LAST_VISIT="Laatste bezoek"
XMAP_HEADING_SITEMAP="Sitemap"
XMAP_HEADING_DEFAULT="Standaard"
XMAP_HEADING_ID="ID"
XMAP_HEADING_PUBLISHED="Gepubliceerd"
XMAP_HEADING_ACCESS="Toegang"
XMAP_SUBMENU_SITEMAPS="Sitemaps"
XMAP_SUBMENU_EXTENSIONS="Extensies"
XMAP_SUBMENU_SETTINGS="Instellingen"
XMAP_TOOLBAR_SET_DEFAULT="Als standaard instellen"
XMAP_SITEMAPS_TITLE="Sitemapbeheer"
DATE_MINUTES_AGO="%d minuten geleden"
DATE_HOURS_MINUTES_AGO="%d uur en %d minuten geleden"
DATE_DAYS_HOURS_AGO="%d dagen en %d uur geleden"
DATE_NEVER="Nooit"
XMAP_INTROTEXT_LABEL="Introtekst"
XMAP_INTROTEXT_DESC="Geef de tekst die getoond wordt boven de sitemap"
XMAP_PRIORITY="Prioriteit"
XMAP_CHANGE_FREQUENCY="Frequentie aanpassen"
XMAP_PAGE_ADD_SITEMAP="Nieuwe sitemap"
XMAP_PAGE_EDIT_SITEMAP="Wijzig sitemap"
XMAP_SITEMAP_DETAILS_FIELDSET="Sitemap details"
XMAP_XML_LINK="XML sitemap"
XMAP_XML_LINK_TOOLTIP="Ga naar de XML versie van de sitemap, gebruik deze URL om uw sitemap bij Google en andere zoekmachines aan te melden."
XMAP_NEWS_LINK="Nieuws sitemap"
XMAP_NEWS_LINK_TOOLTIP="Ga naar de &ldquo;Nieuws&rdquo; versie van de sitemap, gebruik deze URL om de sitemap naar Google nieuws te verzenden."


XMAP_MESSAGE_EXTENSIONS_DISABLED="Xmap heeft gemerkt dat de volgende extensies kunnen helpen om meer inhoud op uw site te krijgen, maar ze zijn gedeactiveerd. U moet ze handmatig activeren door te gaan naar <a href='index.php?option=com_plugins&view=plugins&filter_type=xmap'>extensiebeheer</a>: %s"
COM_XMAP_SITEMAPS_N_ITEMS_UNPUBLISHED="%d sitemaps succesvol gedepubliceerd"
COM_XMAP_SITEMAPS_N_ITEMS_UNPUBLISHED_1="%d sitemap succesvol gedepubliceerd"
COM_XMAP_SITEMAPS_N_ITEMS_PUBLISHED="%d sitemaps succesvol gepubliceerd"
COM_XMAP_SITEMAPS_N_ITEMS_PUBLISHED_1="%d sitemap succesvol gepubliceerd"
COM_XMAP_SITEMAPS_N_ITEMS_TRASHED="%d sitemaps succesvol gepubliceerd"
COM_XMAP_SITEMAPS_N_ITEMS_TRASHED_1="%d sitemap succesvol naar trash verplaatst"
COM_XMAP_SITEMAPS_N_ITEMS_DELETED="%d sitemaps succesvol verwijderd"
COM_XMAP_SITEMAPS_N_ITEMS_DELETED_1="%d sitemap succesvol verwijderd"

XMAP_FIELDSET_MENUS="Menu's"
XMAP_FIELDSET_OPTIONS="Opties"
XMAP_FIELDSET_METADATA="Metadata"
XMAP_ATTRIBS_SHOW_INTRO_LABEL="Introtekst"
XMAP_ATTRIBS_SHOW_INTRO_DESC="Moet de introtekst in de HTML sitemap getoond worden?"
XMAP_ATTRIBS_SHOW_MENU_TITLE_LABEL="Menutitel"
XMAP_ATTRIBS_SHOW_MENU_TITLE_DESC="Moet de menutitel boven ieder menu getoond worden"
XMAP_ATTRIBS_CLASSNAME_LABEL="CSS classnaam"
XMAP_ATTRIBS_CLASSNAME_DESC="De CSS class die gebruikt moet worden voor deze sitemap."
XMAP_ATTRIBS_COLUMNS_LABEL="# kolommen"
XMAP_ATTRIBS_COLUMNS_DESC="Geef het aantal kolommen in de HTML. (Dit heeft alleen effect als het aantal menu's in de sitemap groter dan 1 is)"
XMAP_ATTRIBS_EXTERNAL_LINKS_IMAGE_LABEL="Externe links afbeelding"
XMAP_ATTRIBS_EXTERNAL_LINKS_IMAGE_DESC="Selecteer de afbeelding die gebruikt moet worden voor de externe links"
XMAP_ATTRIBS_COMPRESS_XML_LABEL="Compres XML"
XMAP_ATTRIBS_COMPRESS_XML_DESC="Moet de XML sitemap gecomprest worden?"
XMAP_ATTRIBS_BEAUTIFY_XML_LABEL="Verbeter XML"
XMAP_ATTRIBS_BEAUTIFY_XML_DESC="Selecteer ja om styling aan de XML sitemap uitvoer toe te voegen. Dit is alleen voor mensen en beïnvloed op geen enkele wijze het gedrag voor robots. Deactiveer, als er een witte sitemap ontstaat of er fouten in de browser optreden, deze instelling."
XMAP_FIELDSET_NEWS_OPTIONS="Nieuws sitemap"
XMAP_ATTRIBS_NEWS_PUBLICATION_NAME_LABEL="Publicatie naam"
XMAP_ATTRIBS_NEWS_PUBLICATION_NAME_DESC="Dit is de naam van de nieuws publicatie. Het moet exact overeenkomen met de naam die verschijnt van uw artikelen bij news.google.com, met weglaten van woorden tussen haakjes. Bijvoorbeeld, als de naam verschijnt in Google nieuws als &ldquo;De voorbeeld krant (abonnement)&rdquo;, moet de naam, &ldquo;De voorbeeld krant&rdquo; gebruikt worden."
XMAP_ATTRIBS_NEWS_POSTS_KEYWORDS_LABEL="Bericht trefwoorden"
XMAP_ATTRIBS_NEWS_POSTS_KEYWORDS_DESC="Een door komma's gescheiden lijst van trefwoorden om uw berichten te beschrijven. Standaard de categorie titel van de berichten."
XMAP_ATTRIBS_INCLUDE_LINK_LABEL="Link to author"
XMAP_ATTRIBS_INCLUDE_LINK_DESC="Include the link to Xmap's home at the bottom of the HTML site map."

; Extension edit page
XMAP_PAGE_EDIT_EXTENSION="Wijzig extensie"
XMAP_N_EXTENSIONS_UNPUBLISHED="%s extensies gedepubliceerd"
XMAP_N_EXTENSIONS_PUBLISHED="%s extensies gepubliceerd"
XMAP_EXTENSION_DETAILS="Details"
XMAP_EXTENSION_AUTHOR="Auteur"
XMAP_EXTENSION_AUTHOR_EMAIL="E-mailadres van auteur"
XMAP_EXTENSION_AUTHOR_WEBSITE="Website van auteur"
XMAP_EXTENSION_DESCRIPTION="Beschrijving"

XMAP_DESC_EXTENSIONS="Lijst met geïnstalleerde Xmap extensies"
XMAP_HEADING_AUTHOR="Auteur"
XMAP_HEADING_DATE="Datum"
XMAP_HEADING_FOLDER="Map"
XMAP_HEADING_NUM="Num."
XMAP_HEADING_PLUGIN="Plugin"
XMAP_HEADING_VERSION="Versie"
XMAP_INSTALL="Installeer"
XMAP_INSTALL_DIRECTORY="Installeer map"
XMAP_INSTALL_FROM_DIRECTORY="Installeer vanaf map"
XMAP_INSTALL_FROM_URL="Installeer vanaf URL"
XMAP_INSTALL_NEW_EXTENSION="Installeer nieuwe extensie"
XMAP_INSTALL_URL="Installeer URL"
XMAP_PACKAGE_FILE="Package bestand"
XMAP_PLEASE_ENTER_A_URL="Geef aub een URL"
XMAP_PLEASE_SELECT_A_DIRECTORY="Geef aub een map"
XMAP_PLEASE_SELECT_A_FILE_TO_UPLOAD="Geef aub een bestand om te uploaden"
XMAP_UPLOAD_FILE="Upload bestand"
XMAP_UPLOAD_PACKAGE_FILE="Upload package bestand"
XMAP_EXTENSION_MANAGER_TITLE="Extensiebeheer"
XMAP_EXTENSIONS_TITLE="Extensies"
language/nl-NL/nl-NL.com_acymailing.sys.ini000060400000001300152453623440014455 0ustar00COM_ACYMAILING="AcyMailing"
ACYMAILING="AcyMailing"
COM_ACYMAILING_CONFIGURATION="AcyMailing"
USERS="Gebruikers"
LISTS="Lijsten"
TEMPLATES="Templates"
NEWSLETTERS="Nieuwsbrieven"
AUTONEWSLETTERS="Smart-Newsletters"
CAMPAIGN="Campagne"
QUEUE="Wachtrij"
STATISTICS="Statistieken"
CONFIGURATION="Configuratie"
UPDATE_ABOUT="Update / info"
COM_ACYMAILING_ARCHIVE_VIEW_DEFAULT_TITLE="Mail Lijst Archief (enkel)"
COM_ACYMAILING_FRONTSUBSCRIBER_VIEW_DEFAULT_TITLE="Front-end gebruiker beheer"
COM_ACYMAILING_LISTS_VIEW_DEFAULT_TITLE="Mail Lijst Archieven (Alles)"
COM_ACYMAILING_FRONTNEWSLETTER_VIEW_DEFAULT_TITLE="Aanmaken nieuwsbrief"
COM_ACYMAILING_USER_VIEW_DEFAULT_TITLE="Aanmaken/wijzig een inschrijving"
language/nl-NL/nl-NL.plg_xmap_com_weblinks.ini000060400000002733152453623440015243 0ustar00XMAP_WL_PLUGIN_DESCRIPTION="Voegt ondersteuning voor de weblinks component toe"
XMAP_WL_SETTING_SHOW_LINKS_LABEL="Toon links?"
XMAP_WL_SETTING_SHOW_LINKS_DESC="Moeten links opgenomen worden in de sitemap?"
XMAP_WL_SETTING_MAX_LINKS_LABEL="Max aantal links"
XMAP_WL_SETTING_MAX_LINKS_DESC="Max aantal links per categorie die moeten worden opgenomen in de sitemap (Laat leeg voor geen limiet)"

; Generic Extension settings strings
COM_PLUGINS_BASIC_FIELDSET_LABEL="Standaard instellingen"
COM_PLUGINS_XML_FIELDSET_LABEL="XML sitemap instellingen"
COM_PLUGINS_NEWS_FIELDSET_LABEL="Nieuws sitemap instellingen"
XMAP_OPTION_USE_PARENT_MENU="Gebruik Hoofdmenu instellingen"
XMAP_OPTION_NEVER="Nooit"
XMAP_OPTION_ALWAYS="Altijd"
XMAP_OPTION_XML_ONLY="Alleen in XML sitemap"
XMAP_OPTION_HTML_ONLY="Alleen in HTML sitemap"
XMAP_OPTION_WEEKLY="Wekelijks"
XMAP_OPTION_DAILY="Dagelijks"
XMAP_OPTION_MONTHLY="Maandelijks"
XMAP_OPTION_YEARLY="Jaarlijks"
XMAP_OPTION_HOURLY="Ieder uur"

XMAP_WL_CATEGORY_PRIORITY_LABEL="Prioriteit van categorieën"
XMAP_WL_CATEGORY_PRIORITY_DESC="Stel de prioriteit van de categorieën in"
XMAP_WL_CATEGORY_CHANGEFREQ_LABEL="Wijzigfrequentie van categorieën"
XMAP_WL_CATEGORY_CHANGEFREQ_DESC="Stel de wijzigfrequentie van categorieën in"
XMAP_WL_LINK_PRIORITY_LABEL="Prioriteit van links"
XMAP_WL_LINK_PRIORITY_DESC="Stel de prioriteit van links in"
XMAP_WL_LINK_CHANGEFREQ_LABEL="Wijzigfrequentie van links"
XMAP_WL_LINK_CHANGEFREQ_DESC="Stel de wijzigfrequentie van links in"language/nl-NL/nl-NL.com_xmap.sys.ini000060400000001720152453623440013313 0ustar00; $Id$
; Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
; GNU General Public License version 2 or later; see LICENSE.txt
; Guillermo Vargas (guille@vargas.co.cr)
;

COM_XMAP="Xmap"
COM_XMAP_TITLE="Xmap"

;
; View and layout titles and descriptions
;
COM_XMAP_SITEMAP_HTML_VIEW_DEFAULT_TITLE="HTML Site map"
COM_XMAP_SITEMAP_HTML_VIEW_DEFAULT_DESC="Toon een sitemap in HTML formaat"
COM_XMAP_SITEMAP_XML_VIEW_DEFAULT_TITLE="XML sitemap"
COM_XMAP_SITEMAP_XML_VIEW_DEFAULT_DESC="Toon een sitemap in XML formaat"

COM_XMAP_SELECT_AN_SITEMAP="Kies een sitemap"
COM_XMAP_SELECT_A_SITEMAP="Een sitemap"
COM_XMAP_CHANGE_SITEMAP_BUTTON="Wijzig"
COM_XMAP_CHANGE_SITEMAP="Selecteer een sitemap uit de lijst"

COM_INSTALLER_TYPE_XMAP_EXT="Xmap extensie"
COM_XMAP_ATTRIBS_SITEMAP_SETTINGS_LABEL="Sitemap instellingen"
COM_XMAP_INCLUDE_CSS_LABEL="Xmap's stijl gebruiken"
COM_XMAP_INCLUDE_CSS_DESC="Selecteer Ja om het CSS bestand met de stijlen voor de Sitemap te gebruiken"language/ja-JP/ja-JP.com_acymailing.sys.ini000060400000001450152453623440014425 0ustar00COM_ACYMAILING="AcyMailing"
ACYMAILING="AcyMailing"
COM_ACYMAILING_CONFIGURATION="AcyMailing"
USERS="ユーザ"
LISTS="リスト"
TEMPLATES="テンプレート"
NEWSLETTERS="ニュースレター"
AUTONEWSLETTERS="スマートニュースレター"
CAMPAIGN="キャンペーン"
QUEUE="キュー"
STATISTICS="統計"
CONFIGURATION="設定"
UPDATE_ABOUT="更新 / その他"
COM_ACYMAILING_ARCHIVE_VIEW_DEFAULT_TITLE="メーリングリストアーカイブ (シングル)"
COM_ACYMAILING_FRONTSUBSCRIBER_VIEW_DEFAULT_TITLE="フロントエンドのユーザ管理"
COM_ACYMAILING_LISTS_VIEW_DEFAULT_TITLE="メーリングリストアーカイブ (すべて)"
COM_ACYMAILING_FRONTNEWSLETTER_VIEW_DEFAULT_TITLE="ニュースレターを作成"
COM_ACYMAILING_USER_VIEW_DEFAULT_TITLE="購読を作成 / 変更"
language/index.html000060400000000352152453623440010330 0ustar00<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->

<html><head><title></title></head><body></body></html>language/ru-RU/ru-RU.plg_system_googlic_analytics.sys.ini000060400000001424152453623440017535 0ustar00; GoogliC Analytics en-GB
; @version	$version 1.2.3 JoomliC 2012-05-20$
; @author	MSV


PLG_SYSTEM_GOOGLIC_ANALYTICS="Система - GoogliC Analytics"
PLG_SYSTEM_GOOGLIC_ANALYTICS_XML_DESCRIPTION="<iframe src="_QQ_"http://www.joomlic.com/infosic/googlic/en_googlic_analytics_124.html"_QQ_" frameborder="_QQ_"0"_QQ_" height="_QQ_"250"_QQ_" width="_QQ_"100%"_QQ_"></iframe><br/><br/><a href="_QQ_"index.php?option=com_plugins&view=plugins&filter_search=GoogliC"_QQ_">Активируйте плагин</a> и вставьте ID ресурса для отслеживания статистики вашего сайта.<br/><br/><i><small>Системный плагин GoogliC Analytics by Jooml!C - <a href='http://www.joomlic.com' target='_blanck'>www.joomlic.com</a></small></i>"language/ru-RU/ru-RU.com_xmap.sys.ini000060400000002257152453623440013405 0ustar00; $Id$
; Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
; GNU General Public License version 2 or later; see LICENSE.txt
; Guillermo Vargas (guille@vargas.co.cr)
;

COM_XMAP="Xmap"
COM_XMAP_TITLE="Xmap"

;
; View and layout titles and descriptions
;
COM_XMAP_SITEMAP_HTML_VIEW_DEFAULT_TITLE="Карта сайта в HTML"
COM_XMAP_SITEMAP_HTML_VIEW_DEFAULT_DESC="Отображать карту сайта в HTML формате"
COM_XMAP_SITEMAP_XML_VIEW_DEFAULT_TITLE="Карта сайта в XML"
COM_XMAP_SITEMAP_XML_VIEW_DEFAULT_DESC="Отображать карту сайта в XML формате"

COM_XMAP_SELECT_AN_SITEMAP="Выберите карту сайта"
COM_XMAP_SELECT_A_SITEMAP="Карта сайта"
COM_XMAP_CHANGE_SITEMAP_BUTTON="Изменить"
COM_XMAP_CHANGE_SITEMAP="Выберите карту сайта из списка"

COM_INSTALLER_TYPE_XMAP_EXT="Xmap расширение"
COM_XMAP_ATTRIBS_SITEMAP_SETTINGS_LABEL="Настройки Sitemap"
COM_XMAP_INCLUDE_CSS_LABEL="Включить Xmap's стиль"
COM_XMAP_INCLUDE_CSS_DESC="Выберите <b>Да</b>, для включения CSS-файла со стилями для sitemap"language/ru-RU/ru-RU.plg_xmap_com_weblinks.ini000060400000004014152453623440015321 0ustar00XMAP_WL_PLUGIN_DESCRIPTION="Дополнительная поддержка для компонента Weblinks"
XMAP_WL_SETTING_SHOW_LINKS_LABEL="Показать ссылки?"
XMAP_WL_SETTING_SHOW_LINKS_DESC="Должна ли карта сайта содержать в себе ссылки?"
XMAP_WL_SETTING_MAX_LINKS_LABEL="Максимум ссылок"
XMAP_WL_SETTING_MAX_LINKS_DESC="Максимальное количество ссылок из категории содержащихся в карте сайта (Оставьте поле пустым для снятия ограничений)"

; Generic Extension settings strings
COM_PLUGINS_BASIC_FIELDSET_LABEL="Основные настройки"
COM_PLUGINS_XML_FIELDSET_LABEL="Настройки XML карты"
COM_PLUGINS_NEWS_FIELDSET_LABEL="Настройки новостей карты сайта"
XMAP_OPTION_USE_PARENT_MENU="Использовать настройки родительского меню"
XMAP_OPTION_NEVER="Никогда"
XMAP_OPTION_ALWAYS="Всегда"
XMAP_OPTION_XML_ONLY="Только в XML карте"
XMAP_OPTION_HTML_ONLY="Только в HTML карте"
XMAP_OPTION_WEEKLY="Еженедельно"
XMAP_OPTION_DAILY="Ежедневно"
XMAP_OPTION_MONTHLY="Ежемесячно"
XMAP_OPTION_YEARLY="Ежегодно"
XMAP_OPTION_HOURLY="Ежечасно"

XMAP_WL_CATEGORY_PRIORITY_LABEL="Приоритет категории"
XMAP_WL_CATEGORY_PRIORITY_DESC="Задайте приоритет для категорий"
XMAP_WL_CATEGORY_CHANGEFREQ_LABEL="Частота изменения категории"
XMAP_WL_CATEGORY_CHANGEFREQ_DESC="Задайте частоту изменения для категорий"
XMAP_WL_LINK_PRIORITY_LABEL="Приоритет ссылки"
XMAP_WL_LINK_PRIORITY_DESC="Задайте приоритет для ссылки"
XMAP_WL_LINK_CHANGEFREQ_LABEL="Частота изменения ссылки"
XMAP_WL_LINK_CHANGEFREQ_DESC="Задайте частоту изменения для ссылки"language/ru-RU/ru-RU.plg_xmap_com_content.ini000060400000010632152453623440015160 0ustar00XMAP_SETTING_EXPAND_CATEGORIES="Раскрывать категории"
XMAP_SETTING_EXPAND_CATEGORIES_DESC="Должен ли Xmap содержать ссылку по каждой статье в категории"
XMAP_SETTING_EXPAND_FEATURED="Раскрывать избранное"
XMAP_SETTING_EXPAND_FEATURED_DESC="Должен ли Xmap содержать ссылку по каждой статье в "_QQ_"Избранные статьи"_QQ_" (обычно пункт меню главной страницы)"
XMAP_SETTING_INCLUDE_ARCHIVED="Вносить архивы"
XMAP_SETTING_INCLUDE_ARCHIVED_DESC="Определите, следует ли в карту сайта вносить архивные статьи"
XMAP_SETTING_SHOW_UNAUTH_LINKS="Показать неразрешенные ссылки"
XMAP_SETTING_SHOW_UNAUTH_LINKS_DESC="Если <b>Да</b>, будут показаны ссылки на содержание, даже если вы не авторизованы на сайте. Пользователю необходимо будет авторизоваться, чтобы увидеть пункт в полном объеме."
XMAP_SETTING_MAX_ART_CAT="Макс. статей в категории"
XMAP_SETTING_MAX_ART_CAT_DESC="Максимальное количество статей в категории, внесенных в карту сайта. (0 - нет ограничений)."
XMAP_SETTING_MAX_ART_AGE="Макс. период доб. статей"
XMAP_SETTING_MAX_ART_AGE_DESC="Максимальное количество дней содержания материалов в карте сайта. (0 - нет ограничений)"
XMAP_SETTING_CAT_PRIORITY="Приоритет категории"
XMAP_SETTING_CAT_PRIORITY_DESC="Установите приоритет для категорий"
XMAP_SETTING_CAT_CHANCE_FREQ="Частота изменения категории"
XMAP_SETTING_CAT_CHANCE_FREQ_DESC="Установите периодичность проверки изменения категорий"
XMAP_SETTING_ART_PRIORITY="Приоритет статьи"
XMAP_SETTING_ART_PRIORITY_DESC="Установить приоритет для статей"
XMAP_SETTING_ART_CHANCE_FREQ="Частота изменения статьи"
XMAP_SETTING_ART_CHANCE_FREQ_DESC="Установите периодичность проверки изменения материалов"
XMAP_SETTING_ADD_PAGEBREAKS_LABEL="Добавлять разрыв страницы"
XMAP_SETTING_ADD_PAGEBREAKS_DESC="Если <b>Да</b>, карта сайта будет включать в себя подстраницы материала."
XMAP_SETTING_ADD_IMAGES_LABEL="Добавлять изображения?"
XMAP_SETTING_ADD_IMAGES_DESC="Если <b>Да</b>, будет анализироваться содержание статьи на наличия изображений, чтобы добавить их в карту сайта. Действительно только для XML карты (поисковые системы карты сайта)"
XMAP_NEWS_FIELDSET_LABEL="Настройки Google News Sitemap"
XMAP_SETTING_NEWS_KEYWORDS_DESC="Какие ключевые слова нужно использовать в карте сайта для Google News?"
XMAP_SETTING_NEWS_KEYWORDS_LABEL="Ключевые слова"
XMAP_SETTING_NEWS_KEYWORDS_METAKEYS="Ключевые слова материалов"
XMAP_SETTING_NEWS_KEYWORDS_CATTITLE="Название категории"
XMAP_SETTING_NEWS_KEYWORDS_METAKEYS_CATTITLE="Metakeys материалов + Название категории"
XMAP_SETTING_NEWS_KEYWORDS_NONE="Ничего"


; Generic Extension settings strings
COM_PLUGINS_BASIC_FIELDSET_LABEL="Основные настройки"
COM_PLUGINS_XML_FIELDSET_LABEL="Настройки XML карты"
COM_PLUGINS_NEWS_FIELDSET_LABEL="Настройки новостей карты сайта"
XMAP_OPTION_USE_PARENT_MENU="Использовать настройки родительского меню"
XMAP_OPTION_NEVER="Никогда"
XMAP_OPTION_ALWAYS="Всегда"
XMAP_OPTION_XML_ONLY="Только в XML карте"
XMAP_OPTION_HTML_ONLY="Только в HTML карте"
XMAP_OPTION_WEEKLY="Еженедельно"
XMAP_OPTION_DAILY="Ежедневно"
XMAP_OPTION_MONTHLY="Ежемесячно"
XMAP_OPTION_YEARLY="Ежегодно"
XMAP_OPTION_HOURLY="Ежечасно"language/ru-RU/ru-RU.com_acymailing.sys.ini000060400000001654152453623440014555 0ustar00COM_ACYMAILING="AcyMailing"
ACYMAILING="AcyMailing"
COM_ACYMAILING_CONFIGURATION="AcyMailing"
USERS="Пользователи"
LISTS="Рассылки"
TEMPLATES="Шаблоны"
NEWSLETTERS="Сообщения"
AUTONEWSLETTERS="Умные письма"
CAMPAIGN="Кампания"
QUEUE="Очередь"
STATISTICS="Статистика"
CONFIGURATION="Конфигурация"
UPDATE_ABOUT="Обновления / О программе"
COM_ACYMAILING_ARCHIVE_VIEW_DEFAULT_TITLE="Архив списков рассылки (один)"
COM_ACYMAILING_FRONTSUBSCRIBER_VIEW_DEFAULT_TITLE="Управление пользователями"
COM_ACYMAILING_LISTS_VIEW_DEFAULT_TITLE="Архив списков рассылки (все)"
COM_ACYMAILING_FRONTNEWSLETTER_VIEW_DEFAULT_TITLE="Создание рассылок"
COM_ACYMAILING_USER_VIEW_DEFAULT_TITLE="Пользователь: создание/изменение подписки"
language/ru-RU/ru-RU.com_xmap.ini000060400000021261152453623440012564 0ustar00; $Id$
; Xmap component
; Guillermo Vargas (guille@vargas.co.cr)
; Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
; GNU General Public License version 2 or later; see LICENSE.txt
;

; Component Instalation strings
XMAP_INSTALLING_XMAP="Установка Xmap компонента - создающего карту сайта для Joomla!"
XMAP_UPGRADING_XMAP="Обновление Xmap компонента - создающего карту сайта для Joomla!"
XMAP_UNISTALLING_XMAP_EXTENSIONS="Удаление Xmap расширений"
XMAP_INSTALLED_EXTENSION_X="Установка %s расширения"
XMAP_NOT_INSTALLED_EXTENSION_X="Не удалось установить расширение для %s"
XMAP_INSTALL_ERROR_EXTENSION="При установке расширения возникла ошибка"
XMAP_INSTALL_SUCCESS_EXTENSION="Расширение успешно установлено"

XMAP_HEADING_XML_STATS="Статистика XML карты"
XMAP_HEADING_HTML_STATS="Статистика HTML карты"
XMAP_HEADING_NUM_LINKS="№ ссылки"
XMAP_HEADING_NUM_HITS="Просмотры"
XMAP_HEADING_LAST_VISIT="Последнее посещение"
XMAP_HEADING_SITEMAP="Карта сайта"
XMAP_HEADING_DEFAULT="По умолчанию"
XMAP_HEADING_ID="ID"
XMAP_HEADING_PUBLISHED="Публикация"
XMAP_HEADING_ACCESS="Доступ"
XMAP_SUBMENU_SITEMAPS="Карты сайта"
XMAP_SUBMENU_EXTENSIONS="Расширения"
XMAP_SUBMENU_SETTINGS="Настройки"
XMAP_TOOLBAR_SET_DEFAULT="Установить по умолчанию"
XMAP_SITEMAPS_TITLE="Менеджер карты сайта"
DATE_MINUTES_AGO="%d мин. назад"
DATE_HOURS_MINUTES_AGO="%d час. и %d мин. назад"
DATE_DAYS_HOURS_AGO="%d дн. и %d час. назад"
DATE_NEVER="Никогда"
XMAP_INTROTEXT_LABEL="Вводный текст"
XMAP_INTROTEXT_DESC="Введите текст, который будет показан над карта"
XMAP_PRIORITY="Приоритет"
XMAP_CHANGE_FREQUENCY="Частота изменения"
XMAP_PAGE_ADD_SITEMAP="Новая карта"
XMAP_PAGE_EDIT_SITEMAP="Изменить карту"
XMAP_SITEMAP_DETAILS_FIELDSET="Подробности карты сайта"
XMAP_XML_LINK="XML Sitemap"
XMAP_XML_LINK_TOOLTIP="Перейдите к XML версии карты сайта, используйте этот адрес для отправки вашей карты на Google и другие поисковые системы."
XMAP_NEWS_LINK="Новости Sitemap"
XMAP_NEWS_LINK_TOOLTIP="Зайдите в раздел &ldquo;Новости&rdquo;, версия карты сайта, используйте этот адрес для отправки вашей карты на Google News."


XMAP_MESSAGE_EXTENSIONS_DISABLED="Xmap обнаружил, что следующие расширения могут помочь получить больше содержания в карте сайта, но они отключены, вам нужно вручную включить их посетив <a href='index.php?option=com_plugins&view=plugins&filter_type=xmap&filter_folder=xmap'>Менеджер расширений</a>: %s"
COM_XMAP_SITEMAPS_N_ITEMS_UNPUBLISHED="%d карты сайта успешно сняты с публикации"
COM_XMAP_SITEMAPS_N_ITEMS_UNPUBLISHED_1="%d карта сайта успешно снята с публикации"
COM_XMAP_SITEMAPS_N_ITEMS_PUBLISHED="%d карты сайта успешно опубликованы"
COM_XMAP_SITEMAPS_N_ITEMS_PUBLISHED_1="%d карта сайта успешно опубликована"
COM_XMAP_SITEMAPS_N_ITEMS_TRASHED="%d карты сайта успешно перенесены в корзину"
COM_XMAP_SITEMAPS_N_ITEMS_TRASHED_1="%d карта сайта успешно перенесена в корзину"
COM_XMAP_SITEMAPS_N_ITEMS_DELETED="%d карты сайта успешно удалены"
COM_XMAP_SITEMAPS_N_ITEMS_DELETED_1="%d карта сайта успешно удалена"

XMAP_FIELDSET_MENUS="Меню"
XMAP_FIELDSET_OPTIONS="Параметры"
XMAP_FIELDSET_METADATA="Meta-данные"
XMAP_ATTRIBS_SHOW_INTRO_LABEL="Вводный текст"
XMAP_ATTRIBS_SHOW_INTRO_DESC="Должен ли быть показан вводный текст в HTML карте сайта?"
XMAP_ATTRIBS_SHOW_MENU_TITLE_LABEL="Название меню"
XMAP_ATTRIBS_SHOW_MENU_TITLE_DESC="Должен ли быть показан заголовок меню в верхней части каждого меню"
XMAP_ATTRIBS_CLASSNAME_LABEL="Имя CSS класса"
XMAP_ATTRIBS_CLASSNAME_DESC="CSS класс, используемый для этой карты сайта."
XMAP_ATTRIBS_COLUMNS_LABEL="№ колонки"
XMAP_ATTRIBS_COLUMNS_DESC="Определите число колонок для HTML. (Это имеет значение только, если число меню на карте сайта больше 1)"
XMAP_ATTRIBS_EXTERNAL_LINKS_IMAGE_LABEL="Картинка внешних ссылок"
XMAP_ATTRIBS_EXTERNAL_LINKS_IMAGE_DESC="Выберите изображение, которое будет использоваться для внешних ссылок"
XMAP_ATTRIBS_COMPRESS_XML_LABEL="Сжимать XML"
XMAP_ATTRIBS_COMPRESS_XML_DESC="Следует ли сжимать XML карту сайта?"
XMAP_ATTRIBS_BEAUTIFY_XML_LABEL="Украшать XML"
XMAP_ATTRIBS_BEAUTIFY_XML_DESC="Выберите <b>Да</b>, чтобы добавить некоторые стили в исходящую XML карту сайта. Это только для людей и не влияет на поведение роботов. Если вы видите белый (пустой) экран карты сайта или ошибки в браузере, попробуйте отключить эту функцию."
XMAP_FIELDSET_NEWS_OPTIONS="Новости Sitemap"
XMAP_ATTRIBS_NEWS_PUBLICATION_NAME_LABEL="Название публикации"
XMAP_ATTRIBS_NEWS_PUBLICATION_NAME_DESC="Это название опубликованной новости. Оно должно точно соответствовать названию, поскольку показывается в ваших статьях на news.google.com, исключая любое перемещение заключенное в скобки. Например, если название в Google News показывается как &ldquo;Временный пример (подписка)&rdquo;, нужно использовать только название, &ldquo;Временный пример&rdquo;."
XMAP_ATTRIBS_NEWS_POSTS_KEYWORDS_LABEL="Keywords сообщений"
XMAP_ATTRIBS_NEWS_POSTS_KEYWORDS_DESC="Разделенный запятыми список ключевых слов, чтобы описать свои сообщения. По умолчанию -- это название поста в категории."
XMAP_ATTRIBS_INCLUDE_LINK_LABEL="Link to author"
XMAP_ATTRIBS_INCLUDE_LINK_DESC="Include the link to Xmap's home at the bottom of the HTML site map."

; Extension edit page
XMAP_PAGE_EDIT_EXTENSION="Изменить расширение"
XMAP_N_EXTENSIONS_UNPUBLISHED="%s расширения не опубликованы"
XMAP_N_EXTENSIONS_PUBLISHED="%s расширения опубликованы"
XMAP_EXTENSION_DETAILS="Детали"
XMAP_EXTENSION_AUTHOR="Автор"
XMAP_EXTENSION_AUTHOR_EMAIL="Email автора"
XMAP_EXTENSION_AUTHOR_WEBSITE="Сайт автора"
XMAP_EXTENSION_DESCRIPTION="Описание"

XMAP_DESC_EXTENSIONS="Список установленных Xmap расширений"
XMAP_HEADING_AUTHOR="Автор"
XMAP_HEADING_DATE="Дата"
XMAP_HEADING_FOLDER="Папка"
XMAP_HEADING_NUM="№"
XMAP_HEADING_PLUGIN="Плагин"
XMAP_HEADING_VERSION="Версия"
XMAP_INSTALL="Установить"
XMAP_INSTALL_DIRECTORY="Папка установки"
XMAP_INSTALL_FROM_DIRECTORY="Установить из папки"
XMAP_INSTALL_FROM_URL="Установить из URL"
XMAP_INSTALL_NEW_EXTENSION="Установить новое расширение"
XMAP_INSTALL_URL="URL установки"
XMAP_PACKAGE_FILE="Файл пакета"
XMAP_PLEASE_ENTER_A_URL="Пожалуйста, введите URL"
XMAP_PLEASE_SELECT_A_DIRECTORY="Пожалуйста, выберите папку"
XMAP_PLEASE_SELECT_A_FILE_TO_UPLOAD="Пожалуйста, выберите файл для загрузки"
XMAP_UPLOAD_FILE="Загрузить файл"
XMAP_UPLOAD_PACKAGE_FILE="Загрузить файл пакета"
XMAP_EXTENSION_MANAGER_TITLE="Менеджер расширений"
XMAP_EXTENSIONS_TITLE="Расширения"
language/ru-RU/ru-RU.plg_system_googlic_analytics.ini000060400000010046152453623440016720 0ustar00; GoogliC Analytics ru-RU
; @version	$version 1.2.3 JoomliC 2012-05-20$
; @author	MSV

PLG_SYSTEM_GOOGLIC_ANALYTICS="System - GoogliC Analytics"
PLG_SYSTEM_GOOGLIC_ANALYTICS_XML_DESCRIPTION="<iframe src="_QQ_"http://www.joomlic.com/infosic/googlic/en_plugin_googlic_124.html"_QQ_" frameborder="_QQ_"0"_QQ_" height="_QQ_"250"_QQ_" width="_QQ_"550"_QQ_"></iframe><br/><br/><i><small>Системный плагин GoogliC Analytics by Jooml!C - <a href='http://www.joomlic.com' target='_blanck'>www.joomlic.com</a></small></i>"
COM_PLUGINS_GOOGLIC_FIELDSET_LABEL="&nbsp;&nbsp;&nbsp;<img src="_QQ_"../media/googlic_analytics/images/googlic16.png"_QQ_"/>Параметры GoogliC Analytics"
PLG_SYSTEM_GOOGLIC_ANALYTICS_GOOGLE_TITRE="GOOGLE ANALYTICS ID"
PLG_SYSTEM_GOOGLIC_ANALYTICS_GOOGLE_NOTE="Введите свой ID ресурса предоставленный Google Analytics. <a href="_QQ_"http://www.google.com/analytics/"_QQ_" target="_QQ_"_blanck"_QQ_">Создать аккаунт google analytics</a>."
PLG_SYSTEM_GOOGLIC_ANALYTICS_ID_SUIVI_LABEL="ID ресурса &nbsp;<img src="_QQ_"../media/googlic_analytics/images/info.png"_QQ_"/>"
PLG_SYSTEM_GOOGLIC_ANALYTICS_ID_SUIVI_DESC="Ваш идентификатор ресурса, вида <b>UA-XXXXX-Y</b> или <b>UA-XXXXX-YY</b>."
PLG_SYSTEM_GOOGLIC_ANALYTICS_FILTRES_TITRE="ФИЛЬТРЫ ОТСЛЕЖИВАНИЯ ДЛЯ РАЗЛИЧНЫХ ГРУПП ПОЛЬЗОВАТЕЛЕЙ"
PLG_SYSTEM_GOOGLIC_ANALYTICS_FILTRES_NOTE="Выберите группы пользователей, которые не должны отслеживать статистику Google Analytics."
PLG_SYSTEM_GOOGLIC_ANALYTICS_GROUPES_EXCLUS_LABEL="Не отслеживать группы: &nbsp;<img src="_QQ_"../media/googlic_analytics/images/info.png"_QQ_"/>"
PLG_SYSTEM_GOOGLIC_ANALYTICS_GROUPES_EXCLUS_DESC="Удерживайте Ctrl (Windows) или Command (Mac) на клавиатуре при нажатии на группы пользователей, чтобы выделить несколько"
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_TITRE="ПАРАМЕТРЫ ОТСЛЕЖИВАНИЕ ВЕБ-САЙТОВ (Стандартные)"
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_NOTE="<dl><big>ПАРАМЕТРЫ</big><dt><br/><b>Один домен (по умолчанию)</b> : </dt><dd>www.yourdomain.com</i></dd><dt><b>Один домен с несколькими субдоменами</b> : </dt><dd>www.yourdomain.com</i></dd><dd>store.yourdomain.com</i></dd><dd>forum.yourdomain.com</i></dd><dt><b>Несколько доменов верхнего уровня</b> :</dt><dd>www.yourdomain.com</i></dd><dd>www.yourdomain.uk</i></dd><dd>www.yourdomain.eu</i></dd></dl><br/>"
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_ATTENTION="Внимание! Не изменяйте эти значения.<br/>Если вы не знаете, что это такое, оставьте настройки по умолчанию."
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_LABEL="Что вы отслеживаете? &nbsp;<img src="_QQ_"../media/googlic_analytics/images/info.png"_QQ_"/>"
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_DESC="<b>+</b> Дополнительная информация: google.com/analytics."
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_DOMAINE="Один домен (по умолчанию)"
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_SOUSDOMAINES="Один домен с несколькими субдоменами"
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_EXT_DOMAINES="Несколько доменов верхнего уровня"
PLG_SYSTEM_GOOGLIC_ANALYTICS_DOMAINE_NOTE="Начиная с версии 1.2.3, ваше доменное имя будет автоматически вставлено в код отслеживания google analytics"
STYLE_BOX="color:#EEE;background-color:#333;margin:10px 0;padding:10px 8px;border-bottom:5px solid #ce0000;border-radius: 3px;"
STYLE_RED="color:#cc0000;background-color:#FFFFFF; font-weight: bold; padding:10px 8px; margin:0 45px;border:1px red dotted; text-align: center;"
STYLE_NOTE="color:#666; margin:0; padding:5px;"
language/overrides/index.html000060400000000037152453623440012332 0ustar00<!DOCTYPE html><title></title>
language/en-GB/en-GB.com_cache.ini000060400000005577152453623440012532 0ustar00; Joomla! Project
; (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_CACHE="Cache"
COM_CACHE_BACK_CACHE_MANAGER="Return to Cache"
COM_CACHE_CLEAR_CACHE_ADMIN="Clear Cache Administrator"
COM_CACHE_CLEAR_CACHE="Maintenance: Clear Cache"
COM_CACHE_CLEAR_CACHE_ADMIN_TITLE="Maintenance: Clear Cache (Administrator)"
COM_CACHE_CLEAR_CACHE_SITE_TITLE="Maintenance: Clear Cache (Site)"
COM_CACHE_PURGE_EXPIRED_CACHE="Maintenance: Clear Expired Cache"
COM_CACHE_CONFIGURATION="Cache: Options"
COM_CACHE_ERROR_CACHE_CONNECTION_FAILED="Could not connect to the cache store to fetch the cache data."
COM_CACHE_ERROR_CACHE_DRIVER_UNSUPPORTED="Could not read the cache data, the configured cache handler is not supported by this environment."
COM_CACHE_EXPIRED_ITEMS_HAVE_BEEN_DELETED="The selected cache group(s) have been cleared."
COM_CACHE_EXPIRED_ITEMS_HAVE_BEEN_PURGED="Expired cached items have been cleared."
COM_CACHE_EXPIRED_ITEMS_DELETE_ERROR="Error clearing cache group(s): %s."
COM_CACHE_EXPIRED_ITEMS_PURGING_ERROR="Error clearing expired cached items."
COM_CACHE_FILTER_SEARCH_DESC="Search in cache group."
COM_CACHE_FILTER_SEARCH_LABEL="Search Cache"
COM_CACHE_GROUP="Cache Group"
COM_CACHE_HEADING_GROUP_ASC="Cache Group ascending"
COM_CACHE_HEADING_GROUP_DESC="Cache Group descending"
COM_CACHE_HEADING_COUNT_ASC="Number of Files ascending"
COM_CACHE_HEADING_COUNT_DESC="Number of Files descending"
COM_CACHE_HEADING_SIZE_ASC="Size ascending"
COM_CACHE_HEADING_SIZE_DESC="Size descending"
COM_CACHE_MANAGER="Cache"
COM_CACHE_MSG_ALL_CACHE_GROUPS_CLEARED="All cache group(s) have been cleared."
COM_CACHE_MSG_SOME_CACHE_GROUPS_CLEARED="Only some cache group(s) have been cleared."
COM_CACHE_NUMBER_OF_FILES="Number of Files"
COM_CACHE_PURGE_CACHE_ADMIN="Clear Cache Administrator"
COM_CACHE_PURGE_EXPIRED="Clear Expired Cache"
COM_CACHE_PURGE_EXPIRED_ITEMS="Clear expired items"
COM_CACHE_PURGE_INSTRUCTIONS="Select the Clear Expired Cache icon in the toolbar to delete all expired cache files. Note: Cache files that are still current will not be deleted."
COM_CACHE_RESOURCE_INTENSIVE_WARNING="This can be resource intensive on sites with a large number of items!"
COM_CACHE_SIZE="Size"
COM_CACHE_SELECT_CLIENT="- Select Location -"
COM_CACHE_XML_DESCRIPTION="Component for cache management."

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_CACHE="Changes apply to this component only.<br /><em><strong>Inherited</strong></em> - a Global Configuration setting or higher level setting is applied.<br /><em><strong>Denied</strong></em> always wins - whatever is set at the Global or higher level and applies to all child elements.<br /><em><strong>Allowed</strong></em> will enable the action for this component unless overruled by a Global Configuration setting."
language/en-GB/en-GB.plg_system_logrotation.sys.ini000060400000000526152453623440016242 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_LOGROTATION="System - Log Rotation"
PLG_SYSTEM_LOGROTATION_XML_DESCRIPTION="This plugin periodically rotates system log files."
language/en-GB/en-GB.plg_editors-xtd_weblink.ini000060400000000755152453623440015445 0ustar00; Joomla! Project
; Copyright (C) 2005 - 2020 Open Source Matters. All rights reserved.
; License GNU General Public License version 2 or later; see LICENSE.txt, see LICENSE.php
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS-XTD_WEBLINK="Button - Web Link"
PLG_EDITORS-XTD_WEBLINK_BUTTON_WEBLINK="Web Link"
PLG_EDITORS-XTD_WEBLINK_XML_DESCRIPTION="Displays a button to make it possible to insert web links into an Article. Displays a popup allowing you to choose the web link."
language/en-GB/en-GB.plg_editors_codemirror.sys.ini000060400000000502152453623440016165 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CODEMIRROR_XML_DESCRIPTION="This plugin loads the CodeMirror editor."
PLG_EDITORS_CODEMIRROR="Editor - CodeMirror"
language/en-GB/en-GB.mod_latest.sys.ini000060400000000555152453623440013570 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8


MOD_LATEST="Articles - Latest"
MOD_LATEST_XML_DESCRIPTION="This module shows a list of the most recently created Articles."
MOD_LATEST_LAYOUT_DEFAULT="Default"

language/en-GB/en-GB.plg_system_privacyconsent.sys.ini000060400000000717152453623440016752 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_PRIVACYCONSENT="System - Privacy Consent"
PLG_SYSTEM_PRIVACYCONSENT_XML_DESCRIPTION="Basic plugin to request user's consent to the site's privacy policy. Existing users who have not consented yet will be redirected on login to update their profile."language/en-GB/en-GB.plg_captcha_recaptcha.ini000060400000012624152453623440015077 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CAPTCHA_RECAPTCHA="CAPTCHA - reCAPTCHA"
PLG_CAPTCHA_RECAPTCHA_XML_DESCRIPTION="This CAPTCHA plugin uses the reCAPTCHA service to prevent spammers while it helps to digitize books, newspapers and old radio shows. To get a site and secret key for your domain, go to <a href="_QQ_"https://www.google.com/recaptcha"_QQ_" target="_QQ_"_blank"_QQ_">https://www.google.com/recaptcha</a>. To use this for new account registration, go to Options in the User Manager and select CAPTCHA - reCAPTCHA as the CAPTCHA."
PLG_PLG_RECAPTCHA_VERSION_1_POSTINSTALL_ACTION="Update reCAPTCHA settings"
PLG_PLG_RECAPTCHA_VERSION_1_POSTINSTALL_BODY="Support for reCAPTCHA v1 will be turned off by Google on March 31, 2018. Please update the settings in the reCAPTCHA plugin to use Version 2.0."
PLG_PLG_RECAPTCHA_VERSION_1_POSTINSTALL_TITLE="reCAPTCHA v1 - discontinued"
; Params
PLG_RECAPTCHA_VERSION_1_WARNING_LABEL="You have selected Version 1.0. As of March 31, 2018 this will no longer work and you should use Version 2.0."
PLG_RECAPTCHA_VERSION_DESC="Version 2.0 is the recommended version."
PLG_RECAPTCHA_VERSION_LABEL="Version"
PLG_RECAPTCHA_CALLBACK_DESC="(Optional) JavaScript callback, executed after successful reCAPTCHA response."
PLG_RECAPTCHA_CALLBACK_LABEL="Callback"
PLG_RECAPTCHA_ERROR_CALLBACK_DESC="(Optional) JavaScript callback, executed when the reCAPTCHA encounters an error."
PLG_RECAPTCHA_ERROR_CALLBACK_LABEL="Error Callback"
PLG_RECAPTCHA_EXPIRED_CALLBACK_DESC="(Optional) JavaScript callback, executed when the reCAPTCHA expired."
PLG_RECAPTCHA_EXPIRED_CALLBACK_LABEL="Expired Callback"
PLG_RECAPTCHA_LANG_DESC="Select the language for the reCAPTCHA. If default is set and the language file has a custom translation, it will be used."
PLG_RECAPTCHA_LANG_LABEL="Language"
PLG_RECAPTCHA_PRIVATE_KEY_DESC="Used in the communication between your server and the reCAPTCHA server. Be sure to keep it a secret. See the plugin description for instructions on getting a secret key."
PLG_RECAPTCHA_PRIVATE_KEY_LABEL="Secret Key"
PLG_RECAPTCHA_PUBLIC_KEY_DESC="Used in the JavaScript code that is served to your users. See the plugin description for instructions on getting a site key."
PLG_RECAPTCHA_PUBLIC_KEY_LABEL="Site Key"
PLG_RECAPTCHA_SIZE_DESC="Select the size for the reCAPTCHA field."
PLG_RECAPTCHA_SIZE_LABEL="Size"
PLG_RECAPTCHA_TABINDEX_DESC="The tabindex of the reCAPTCHA widget."
PLG_RECAPTCHA_TABINDEX_LABEL="Tabindex"
PLG_RECAPTCHA_THEME_BLACKGLASS="BlackGlass"
PLG_RECAPTCHA_THEME_CLEAN="Clean"
PLG_RECAPTCHA_THEME_COMPACT="Compact"
PLG_RECAPTCHA_THEME_DARK="Dark"
PLG_RECAPTCHA_THEME_DESC="Defines which theme to use for reCAPTCHA."
PLG_RECAPTCHA_THEME_LABEL="Theme"
PLG_RECAPTCHA_THEME_LIGHT="Light"
PLG_RECAPTCHA_THEME_NORMAL="Normal"
PLG_RECAPTCHA_THEME_RED="Red"
PLG_RECAPTCHA_THEME_WHITE="White"
; The following two strings are deprecated and will be removed with 4.0. They generate wrong plural detection in Crowdin.
PLG_RECAPTCHA_VERSION_1="1.0"
PLG_RECAPTCHA_VERSION_2="2.0"
PLG_RECAPTCHA_VERSION_V1="1.0"
PLG_RECAPTCHA_VERSION_V2="2.0"
; Error messages
PLG_RECAPTCHA_ERROR_EMPTY_SOLUTION="Please complete the CAPTCHA."
PLG_RECAPTCHA_ERROR_INCORRECT_CAPTCHA_SOL="The CAPTCHA was incorrect."
PLG_RECAPTCHA_ERROR_INVALID_REFERRER="reCAPTCHA API keys are tied to a specific domain name for security reasons."
PLG_RECAPTCHA_ERROR_INVALID_REQUEST_COOKIE="The challenge parameter of the verify script was incorrect."
PLG_RECAPTCHA_ERROR_INVALID_SITE_PRIVATE_KEY="We weren't able to verify the secret key."
PLG_RECAPTCHA_ERROR_INVALID_SITE_PUBLIC_KEY="We weren't able to verify the site key."
PLG_RECAPTCHA_ERROR_NO_IP="For security reasons, you must pass the remote IP address to reCAPTCHA."
PLG_RECAPTCHA_ERROR_NO_PRIVATE_KEY="reCAPTCHA plugin needs a secret key to be set in its parameters. Please contact a site administrator."
PLG_RECAPTCHA_ERROR_NO_PUBLIC_KEY="reCAPTCHA plugin needs a site key to be set in its parameters. Please contact a site administrator."
PLG_RECAPTCHA_ERROR_RECAPTCHA_NOT_REACHABLE="Unable to contact the reCAPTCHA verify server."
PLG_RECAPTCHA_ERROR_UNKNOWN="Unknown error."
PLG_RECAPTCHA_ERROR_VERIFY_PARAMS_INCORRECT="The parameters to verify were incorrect, make sure you are passing all the required parameters."
; Privacy notice
PLG_RECAPTCHA_PRIVACY_CAPABILITY_IP_ADDRESS="The reCAPTCHA plugin integrates with Google's reCAPTCHA system as a spam protection service. As part of this service, the IP address of the user answering the captcha challenge is transmitted to Google."
; Uncomment(remove the ";" from the beginning of the line) the following lines if reCAPTCHA is not available in your language
; When uncommenting, do NOT translate PLG_RECAPTCHA_CUSTOM_LANG
; As of 01/01/2012, the following languages do not need translation: en, nl, fr, de, pt, ru, es, tr
;PLG_RECAPTCHA_AUDIO_CHALLENGE="Get an audio challenge"
;PLG_RECAPTCHA_CANT_HEAR_THIS="Download sound as MP3"
;PLG_RECAPTCHA_CUSTOM_LANG="true"
;PLG_RECAPTCHA_HELP_BTN="Help"
;PLG_RECAPTCHA_INCORRECT_TRY_AGAIN="Incorrect. Try again."
;PLG_RECAPTCHA_INSTRUCTIONS_AUDIO="Type what you hear:"
;PLG_RECAPTCHA_INSTRUCTIONS_VISUAL="Type the two words:"
;PLG_RECAPTCHA_PLAY_AGAIN="Play sound again"
;PLG_RECAPTCHA_REFRESH_BTN="Get a new challenge"
;PLG_RECAPTCHA_VISUAL_CHALLENGE="Get a visual challenge"
language/en-GB/en-GB.plg_finder_weblinks.ini000060400000000663152453623440014627 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FINDER_WEBLINKS="Smart Search - Web Links"
PLG_FINDER_WEBLINKS_XML_DESCRIPTION="This plugin indexes Joomla! Web Links."

PLG_FINDER_QUERY_FILTER_BRANCH_P_WEB_LINK="Web links"
PLG_FINDER_QUERY_FILTER_BRANCH_S_WEB_LINK="Web link"
language/en-GB/en-GB.plg_privacy_message.ini000060400000000573152453623440014643 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_PRIVACY_MESSAGE="Privacy - User Messages"
PLG_PRIVACY_MESSAGE_XML_DESCRIPTION="Responsible for processing privacy related requests for the core Joomla user messages data."
language/en-GB/en-GB.plg_system_sef.sys.ini000060400000000562152453623440014456 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SEF_XML_DESCRIPTION="Adds SEF support to links in the document. It operates directly on the HTML and does not require a special tag."
PLG_SYSTEM_SEF="System - SEF"language/en-GB/en-GB.plg_system_log.sys.ini000060400000000464152453623440014463 0ustar00; Joomla! Project
; (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_LOG_XML_DESCRIPTION="Provides logging when the user login fails."
PLG_SYSTEM_LOG="System - User Log"
language/en-GB/en-GB.plg_fields_media.sys.ini000060400000000574152453623440014705 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_MEDIA="Fields - Media"
PLG_FIELDS_MEDIA_XML_DESCRIPTION="This plugin lets you create new fields of type 'media' in any extensions where custom fields are supported."
language/en-GB/en-GB.com_login.ini000060400000001006152453623440012556 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_LOGIN="Login"
COM_LOGIN_JOOMLA_ADMINISTRATION_LOGIN="Joomla! Administration Login"
COM_LOGIN_RETURN_TO_SITE_HOME_PAGE="Go to site home page"
COM_LOGIN_VALID="Use a valid username and password to gain access to the Administrator Backend."
COM_LOGIN_XML_DESCRIPTION="This component lets users login to the site."
language/en-GB/en-GB.plg_fields_imagelist.ini000060400000001731152453623440014763 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_IMAGELIST="Fields - Imagelist"
PLG_FIELDS_IMAGELIST_LABEL="List of Images (%s)"
; Don't translate "images" in the string below.
PLG_FIELDS_IMAGELIST_PARAMS_DIRECTORY_DESC="The directory with the image files to be listed, relative to \"images\" directory in Joomla! root."
PLG_FIELDS_IMAGELIST_PARAMS_DIRECTORY_LABEL="Directory"
PLG_FIELDS_IMAGELIST_PARAMS_IMAGE_CLASS_DESC="The class which is added to the image (src tag)."
PLG_FIELDS_IMAGELIST_PARAMS_IMAGE_CLASS_LABEL="Image Class"
PLG_FIELDS_IMAGELIST_PARAMS_MULTIPLE_DESC="Allow multiple values to be selected."
PLG_FIELDS_IMAGELIST_PARAMS_MULTIPLE_LABEL="Multiple"
PLG_FIELDS_IMAGELIST_XML_DESCRIPTION="This plugin lets you create new fields of type 'imagelist' in any extensions where custom fields are supported."
language/en-GB/en-GB.plg_system_logout.sys.ini000060400000000645152453623440015214 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_LOGOUT_XML_DESCRIPTION="The system logout plugin enables Joomla to redirect the user to the home page if they choose to logout while they are on a protected access page."
PLG_SYSTEM_LOGOUT="System - Logout"
language/en-GB/en-GB.plg_editors-xtd_menu.sys.ini000060400000000613152453623440015564 0ustar00; Joomla! Project
; (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS-XTD_MENU="Button - Menu"
PLG_EDITORS-XTD_MENU_XML_DESCRIPTION="Displays a button to insert menu item links into an Article. Displays a popup allowing you to choose the menu item."
language/en-GB/en-GB.localise.php000060400000003136152453623440012421 0ustar00<?php
/**
 * @package    Joomla.Language
 *
 * @copyright  (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license    GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * en-GB localise class.
 *
 * @since  1.6
 */
abstract class En_GBLocalise
{
	/**
	 * Returns the potential suffixes for a specific number of items
	 *
	 * @param   integer  $count  The number of items.
	 *
	 * @return  array  An array of potential suffixes.
	 *
	 * @since   1.6
	 */
	public static function getPluralSuffixes($count)
	{
		if ($count == 0)
		{
			return array('0');
		}
		elseif ($count == 1)
		{
			return array('ONE', '1');
		}
		else
		{
			return array('OTHER', 'MORE');
		}
	}

	/**
	 * Returns the ignored search words
	 *
	 * @return  array  An array of ignored search words.
	 *
	 * @since   1.6
	 */
	public static function getIgnoredSearchWords()
	{
		return array('and', 'in', 'on');
	}

	/**
	 * Returns the lower length limit of search words
	 *
	 * @return  integer  The lower length limit of search words.
	 *
	 * @since   1.6
	 */
	public static function getLowerLimitSearchWord()
	{
		return 3;
	}

	/**
	 * Returns the upper length limit of search words
	 *
	 * @return  integer  The upper length limit of search words.
	 *
	 * @since   1.6
	 */
	public static function getUpperLimitSearchWord()
	{
		return 20;
	}

	/**
	 * Returns the number of chars to display when searching
	 *
	 * @return  integer  The number of chars to display when searching.
	 *
	 * @since   1.6
	 */
	public static function getSearchDisplayedCharactersNumber()
	{
		return 200;
	}
}
language/en-GB/en-GB.mod_latestactions.sys.ini000060400000000517152453623440015147 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8


MOD_LATESTACTIONS="Action Logs - Latest"
MOD_LATESTACTIONS_XML_DESCRIPTION="This module shows a list of the most recent actions."

language/en-GB/en-GB.com_privacy.ini000060400000040312152453623440013126 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_PRIVACY="Privacy"
COM_PRIVACY_ACTION_DELETE_DATA="Delete Data"
COM_PRIVACY_ACTION_EMAIL_EXPORT_DATA="Email Data Export"
COM_PRIVACY_ACTION_EXPORT_DATA="Export Data"
COM_PRIVACY_ACTION_LOG_ADMIN_COMPLETED_REQUEST="User <a href='{accountlink}'>{username}</a> completed <a href='{itemlink}'>request #{id}</a> for {subjectemail}"
COM_PRIVACY_ACTION_LOG_ADMIN_CREATED_REQUEST="User <a href='{accountlink}'>{username}</a> created <a href='{itemlink}'>request #{id}</a> for {subjectemail}"
COM_PRIVACY_ACTION_LOG_ADMIN_INVALIDATED_REQUEST="User <a href='{accountlink}'>{username}</a> invalidated <a href='{itemlink}'>request #{id}</a> for {subjectemail}"
COM_PRIVACY_ACTION_LOG_CONFIRMED_REQUEST="{subjectemail} has confirmed <a href='{itemlink}'>request #{id}</a>"
COM_PRIVACY_ACTION_LOG_CREATED_REQUEST="{subjectemail} has submitted <a href='{itemlink}'>request #{id}</a>"
COM_PRIVACY_ACTION_LOG_EXPORT="User <a href='{accountlink}'>{username}</a> exported the data for <a href='{itemlink}'>request #{id}</a>"
COM_PRIVACY_ACTION_LOG_EXPORT_EMAILED="User <a href='{accountlink}'>{username}</a> emailed the data export for <a href='{itemlink}'>request #{id}</a> to the recipient"
COM_PRIVACY_ACTION_LOG_REMOVE="User <a href='{accountlink}'>{username}</a> removed the data for <a href='{itemlink}'>request #{id}</a>"
COM_PRIVACY_ACTION_LOG_REMOVE_BLOCKED="User <a href='{accountlink}'>{username}</a> attempted to remove the data for <a href='{itemlink}'>request #{id}</a> however this action was blocked"
COM_PRIVACY_ACTION_VIEW="View Request"
COM_PRIVACY_BADGE_URGENT_REQUEST="Urgent"
COM_PRIVACY_CONFIGURATION="Privacy: Options"
COM_PRIVACY_CONSENTS_FILTER_STATE="State of Consents"
COM_PRIVACY_CONSENTS_FILTER_SUBJECT="Subject"
COM_PRIVACY_CONSENTS_INVALIDATED_ALL="All consents of this subject have been invalidated."
COM_PRIVACY_CONSENTS_STATE_INVALIDATED="Invalidated Consent"
COM_PRIVACY_CONSENTS_STATE_OBSOLETE="Obsolete Consent"
COM_PRIVACY_CONSENTS_STATE_VALID="Valid Consent"
COM_PRIVACY_CONSENTS_SUBJECT_DEFAULT="All Subjects"
COM_PRIVACY_CONSENTS_TOOLBAR_INVALIDATE_ALL="Invalidate all Consents"
COM_PRIVACY_CONSENTS_TOOLBAR_INVALIDATE_ALL_CONFIRM_MSG="Do you really want to invalidate all consents of the selected subject? This will force users to have to give their consent again."
COM_PRIVACY_CONSENTS_TOOLBAR_INVALIDATE="Invalidate Consent"
COM_PRIVACY_CONSENTS_TOOLBAR_INVALIDATE_CONFIRM_MSG="Do you really want to invalidate the selected consents? This will force users to have to give their consent again."
COM_PRIVACY_CORE_CAPABILITY_COMMUNICATION_WITH_JOOMLA_ORG="When a network connection is available, a Joomla installation will attempt to communicate with the joomla.org servers for various capabilities, to include:<ul><li>Checking for updates for the Joomla application</li><li>Help screens for core Joomla extensions</li><li>The Install from Web service (opt-in)</li><li>The statistics collection server (opt-in)</li></ul>As with all HTTP requests, the IP address of your server will be transmitted as part of the request. For information on how Joomla processes data on its servers, please review our <a href=\"https://www.joomla.org/privacy-policy.html\" target=\"_blank\" rel=\"noopener noreferrer\">privacy policy</a>."
; The placeholder for this key is the configured log path for the site.
COM_PRIVACY_CORE_CAPABILITY_LOGGING_IP_ADDRESS="Joomla's logging system records the IP address of the visitor which leads to a message being written to its log files. These log files are used to record various activity on a Joomla site, including information related to core updates, invalid login attempts, unhandled errors, and development information such as the use of deprecated APIs. The format of these log files may be customised by any extension which configures a logger, therefore you are encouraged to download and review the log files for your website which may be found at `%s`."
COM_PRIVACY_CORE_CAPABILITY_SESSION_IP_ADDRESS_AND_COOKIE="All requests to a Joomla website start a session which stores the IP address in the session data and creates a session cookie in the user's browser. The IP address is used as a security measure to help protect against potential session hijacking attacks and this information is deleted once the session has expired and its data purged. The session cookie's name is based on a randomly generated hash and therefore does not have a constant identifier. The session cookie is destroyed once the session has expired or the user has exited their browser."
COM_PRIVACY_DASHBOARD_BADGE_ACTIVE_REQUESTS_0="<span class=\"badge badge-info\">%d</span> Active Requests"
COM_PRIVACY_DASHBOARD_BADGE_ACTIVE_REQUESTS_1="<span class=\"badge badge-warning\">%d</span> Active Request"
COM_PRIVACY_DASHBOARD_BADGE_ACTIVE_REQUESTS_MORE="<span class=\"badge badge-warning\">%d</span> Active Requests"
COM_PRIVACY_DASHBOARD_BADGE_TOTAL_REQUESTS_0="<span class=\"badge badge-info\">%d</span> Total Requests"
COM_PRIVACY_DASHBOARD_BADGE_TOTAL_REQUESTS_1="<span class=\"badge badge-info\">%d</span> Total Request"
COM_PRIVACY_DASHBOARD_BADGE_TOTAL_REQUESTS_MORE="<span class=\"badge badge-info\">%d</span> Total Requests"
COM_PRIVACY_DASHBOARD_HEADING_CHECK="Check"
COM_PRIVACY_DASHBOARD_HEADING_REQUEST_COUNT="# of Requests"
COM_PRIVACY_DASHBOARD_HEADING_REQUEST_STATUS="Status"
COM_PRIVACY_DASHBOARD_HEADING_REQUEST_TYPE="Request Type"
COM_PRIVACY_DASHBOARD_HEADING_STATUS="Status"
COM_PRIVACY_DASHBOARD_HEADING_STATUS_CHECK="Status Check"
COM_PRIVACY_DASHBOARD_HEADING_TOTAL_REQUEST_COUNT="Total Request Count"
COM_PRIVACY_DASHBOARD_NO_REQUESTS="There are no requests."
COM_PRIVACY_DASHBOARD_VIEW_REQUESTS="View Requests"
COM_PRIVACY_DATA_REMOVED="Data removed"
COM_PRIVACY_EDIT_PRIVACY_CONSENT_PLUGIN="Edit Privacy Consents Plugin"
COM_PRIVACY_EDIT_PRIVACY_POLICY="Edit Privacy Policy"
COM_PRIVACY_EXTENSION_CAPABILITY_PERSONAL_INFO="In order to process information requests, information about the user must be collected and logged for the purposes of retaining an audit log. The request system is based on an individual's email address which will be used to link the request to an existing site user if able."
; You can use the following merge codes for all COM_PRIVACY_EMAIL strings:
; [SITENAME]  Site name, as set in Global Configuration.
; [URL]       URL of the site's frontend page.
; [TOKENURL]  URL of the confirm page with the token prefilled.
; [FORMURL]   URL of the confirm page where the user can paste their token.
; [TOKEN]     The confirmation token.
; \n          Newline character. Use it to start a new line in the email.
COM_PRIVACY_EMAIL_ADMIN_REQUEST_BODY_EXPORT_REQUEST="An administrator for [URL] has created a request to export personal information related to this email address. As a security measure, you must confirm that this is a valid request for your personal information from this website.\n\nIf this was a mistake, just ignore this email and nothing will happen.\n\nIn order to confirm this request, you can complete one of the following tasks:\n\n1. Visit the following URL: [TOKENURL]\n\n2. Copy your token from this email, visit the referenced URL, and paste your token into the form.\nURL: [FORMURL]\nToken: [TOKEN]\n\nPlease note that this token is only valid for 24 hours from the time this email was sent."
COM_PRIVACY_EMAIL_ADMIN_REQUEST_BODY_REMOVE_REQUEST="An administrator for [URL] has created a request to remove all personal information related to this email address. As a security measure, you must confirm that this is a valid request for your personal information to be removed from this website.\n\nIf this was a mistake, just ignore this email and nothing will happen.\n\nIn order to confirm this request, you can complete one of the following tasks:\n\n1. Visit the following URL: [TOKENURL]\n\n2. Copy your token from this email, visit the referenced URL, and paste your token into the form.\nURL: [FORMURL]\nToken: [TOKEN]\n\nPlease note that this token is only valid for 24 hours from the time this email was sent."
COM_PRIVACY_EMAIL_ADMIN_REQUEST_SUBJECT_EXPORT_REQUEST="Information Request Created at [SITENAME]"
COM_PRIVACY_EMAIL_ADMIN_REQUEST_SUBJECT_REMOVE_REQUEST="Information Deletion Request Created at [SITENAME]"
COM_PRIVACY_EMAIL_DATA_EXPORT_COMPLETED_BODY="An administrator for [URL] has completed the data export you requested and a copy of the information can be found in the file attached to this message."
COM_PRIVACY_EMAIL_DATA_EXPORT_COMPLETED_SUBJECT="Data Export for [SITENAME]"
COM_PRIVACY_ERROR_ACTIVE_REQUEST_FOR_EMAIL="There is already an active information request for this email address, the active request should be completed before starting a new one."
COM_PRIVACY_ERROR_CANNOT_CREATE_REQUEST_FOR_SELF="You can't create an information request for yourself."
COM_PRIVACY_ERROR_CANNOT_CREATE_REQUEST_WHEN_SENDMAIL_DISABLED="Information requests can't be created when sending mail is disabled."
COM_PRIVACY_ERROR_CANNOT_EXPORT_UNCONFIRMED_REQUEST="The data for an unconfirmed request can't be exported."
COM_PRIVACY_ERROR_CANNOT_REMOVE_DATA="The data for this request can't be removed."
COM_PRIVACY_ERROR_CANNOT_REMOVE_UNCONFIRMED_REQUEST="The data for an unconfirmed request can't be removed."
COM_PRIVACY_ERROR_COMPLETE_TRANSITION_NOT_PERMITTED="This record can't be updated to \"Completed\" status."
COM_PRIVACY_ERROR_EXPORT_EMAIL_FAILED="Export failed with the following error: %s"
COM_PRIVACY_ERROR_INVALID_TRANSITION_NOT_PERMITTED="This record can't be updated to \"Invalid\" status."
COM_PRIVACY_ERROR_REMOVE_DATA_FAILED="Removal failed with the following error: %s"
COM_PRIVACY_ERROR_REQUEST_ID_REQUIRED_FOR_EXPORT="A request ID is required to export data."
COM_PRIVACY_ERROR_REQUEST_ID_REQUIRED_FOR_REMOVE="A request ID is required to remove data."
COM_PRIVACY_ERROR_REQUEST_TYPE_NOT_EXPORT="Only export requests may be exported."
COM_PRIVACY_ERROR_REQUEST_TYPE_NOT_REMOVE="Only removal requests may have their data removed."
COM_PRIVACY_ERROR_UNKNOWN_REQUEST_TYPE="Unknown information request type."
COM_PRIVACY_EXPORT_EMAILED="The data export has been emailed."
COM_PRIVACY_FIELD_REQUESTED_AT_LABEL="Date Requested"
COM_PRIVACY_FIELD_REQUEST_TYPE_DESC="The type of information request."
COM_PRIVACY_FIELD_REQUEST_TYPE_LABEL="Request Type"
COM_PRIVACY_FIELD_STATUS_DESC="The status of the information request."
COM_PRIVACY_FILTER_SEARCH_LABEL="Search Requests"
COM_PRIVACY_HEADING_ACTION_LOG="Action Log"
COM_PRIVACY_HEADING_ACTIONS="Actions"
COM_PRIVACY_HEADING_CONSENTS_BODY="Body"
COM_PRIVACY_HEADING_CONSENTS_CREATED="Created"
COM_PRIVACY_HEADING_CONSENTS_SUBJECT="Subject"
COM_PRIVACY_HEADING_CORE_CAPABILITIES="Joomla Core Capabilities"
COM_PRIVACY_HEADING_CREATED_ASC="Created ascending"
COM_PRIVACY_HEADING_CREATED_DESC="Created descending"
COM_PRIVACY_HEADING_EMAIL_ASC="Email ascending"
COM_PRIVACY_HEADING_EMAIL_DESC="Email descending"
COM_PRIVACY_HEADING_REQUEST_INFORMATION="Request Information"
COM_PRIVACY_HEADING_REQUEST_TYPE="Request Type"
COM_PRIVACY_HEADING_REQUEST_TYPE_ASC="Request Type ascending"
COM_PRIVACY_HEADING_REQUEST_TYPE_DESC="Request Type descending"
COM_PRIVACY_HEADING_REQUEST_TYPE_TYPE_EXPORT="Export"
COM_PRIVACY_HEADING_REQUEST_TYPE_TYPE_REMOVE="Remove"
COM_PRIVACY_HEADING_REQUESTED_AT="Requested"
COM_PRIVACY_HEADING_REQUESTED_AT_ASC="Requested ascending"
COM_PRIVACY_HEADING_REQUESTED_AT_DESC="Requested descending"
COM_PRIVACY_HEADING_STATUS_ASC="Status ascending"
COM_PRIVACY_HEADING_STATUS_DESC="Status descending"
COM_PRIVACY_HEADING_SUBJECT_ASC="Subject ascending"
COM_PRIVACY_HEADING_SUBJECT_DESC="Subject descending"
COM_PRIVACY_HEADING_USERID="User ID"
COM_PRIVACY_HEADING_USERID_ASC="User ID ascending"
COM_PRIVACY_HEADING_USERID_DESC="User ID descending"
COM_PRIVACY_HEADING_USERNAME_ASC="Username ascending"
COM_PRIVACY_HEADING_USERNAME_DESC="Username descending"
COM_PRIVACY_MSG_CAPABILITIES_ABOUT_THIS_INFORMATION="About This Information"
COM_PRIVACY_MSG_CAPABILITIES_INTRODUCTION="The information on this screen is collected from extensions which report their privacy related capabilities to this system. It is intended to help site owners be aware of the capabilities of installed extensions and provide information to help owners create local site policies such as a privacy policy. As this screen requires extensions to support its reporting system, and only displays information from enabled extensions, this should not be considered a complete list and you are encouraged to consult each extension's documentation for more information."
COM_PRIVACY_MSG_CAPABILITIES_NO_CAPABILITIES="There are no reported extension capabilities."
COM_PRIVACY_MSG_CONFIRM_EMAIL_SENT_TO_USER="A confirmation email for this request has been sent to the user."
COM_PRIVACY_MSG_CONSENTS_NO_CONSENTS="There are no stored consents."
COM_PRIVACY_MSG_EXTENSION_NO_CAPABILITIES="This extension does not report any capabilities."
COM_PRIVACY_MSG_REQUESTS_NO_REQUESTS="There are no information requests matching your query."
COM_PRIVACY_N_CONSENTS_INVALIDATED="%s consents were invalidated."
COM_PRIVACY_N_CONSENTS_INVALIDATED_1="%s consent was invalidated."
COM_PRIVACY_NOTIFY_DESC="Show a notification when there are requests older than the specified number of days."
COM_PRIVACY_NOTIFY_LABEL="Days To Consider Request Urgent"
COM_PRIVACY_OPTION_LABEL="Options"
COM_PRIVACY_POSTINSTALL_TITLE="Increased Management Of Users Privacy"
COM_PRIVACY_POSTINSTALL_BODY="<p>With the introduction of GDPR for EU citizens and similar regulations elsewhere in the world it may be necessary for you to request consent before storing any <strong>Personal Information</strong> of a user.</p><p>Joomla 3.9 introduces new capabilities to assist you in creating site privacy policies and collecting user consent. In addition a workflow is available to help you manage user information requests such as requests for removing their personal data from your site.</p><p>For further information on this new feature read the <a href='https://docs.joomla.org/J3.x:Privacy' target='_new'>Privacy documentation</a>.</p>"
COM_PRIVACY_REQUEST_COMPLETED="The request has been completed."
COM_PRIVACY_REQUEST_INVALIDATED="The request has been invalidated."
COM_PRIVACY_SELECT_REQUEST_TYPE="- Select Request Type -"
COM_PRIVACY_SHOW_URGENT_REQUESTS="Show Urgent Requests"
COM_PRIVACY_STATUS_CHECK_NOT_AVAILABLE="Not Available"
COM_PRIVACY_STATUS_CHECK_OUTSTANDING_URGENT_REQUESTS="Outstanding Urgent Requests"
COM_PRIVACY_STATUS_CHECK_OUTSTANDING_URGENT_REQUESTS_DESCRIPTION="Requests which are older than %d days, as set in the component configuration."
COM_PRIVACY_STATUS_CHECK_PRIVACY_POLICY_PUBLISHED="Published Privacy Policy"
COM_PRIVACY_STATUS_CHECK_REQUEST_FORM_MENU_ITEM_PUBLISHED="Published Request Form Menu Item"
COM_PRIVACY_STATUS_CHECK_SENDMAIL_DISABLED="Mail Sending Disabled"
COM_PRIVACY_STATUS_CHECK_SENDMAIL_DISABLED_DESCRIPTION="Mail Sending must be enabled, it is a requirement to use the request system"
COM_PRIVACY_STATUS_CHECK_SENDMAIL_ENABLED="Mail Sending Enabled"
COM_PRIVACY_STATUS_COMPLETED="Completed"
COM_PRIVACY_STATUS_CONFIRMED="Confirmed"
COM_PRIVACY_STATUS_INVALID="Invalid"
COM_PRIVACY_STATUS_PENDING="Pending"
COM_PRIVACY_SEARCH_IN_EMAIL="Search in requestor email address. Prefix with ID: to search for a request ID."
COM_PRIVACY_SEARCH_IN_USERNAME="Search in username. Prefix with ID: to search for a consent ID. Prefix with UID: to search for a User ID."
COM_PRIVACY_SUBMENU_CAPABILITIES="Capabilities"
COM_PRIVACY_SUBMENU_CONSENTS="Consents"
COM_PRIVACY_SUBMENU_DASHBOARD="Dashboard"
COM_PRIVACY_SUBMENU_REQUESTS="Requests"
COM_PRIVACY_TOOLBAR_COMPLETE="Complete"
COM_PRIVACY_TOOLBAR_INVALIDATE="Invalidate"
COM_PRIVACY_USER_FIELD_EMAIL_DESC="The email address of the individual owning the information being requested."
COM_PRIVACY_VIEW_CAPABILITIES="Privacy: Extension Capabilities"
COM_PRIVACY_VIEW_CONSENTS="Privacy: Consents"
COM_PRIVACY_VIEW_DASHBOARD="Privacy: Dashboard"
COM_PRIVACY_VIEW_REQUEST_ADD_REQUEST="Privacy: New Information Request"
COM_PRIVACY_VIEW_REQUEST_SHOW_REQUEST="Privacy: Review Information Request"
COM_PRIVACY_VIEW_REQUESTS="Privacy: Information Requests"
COM_PRIVACY_WARNING_CANNOT_CREATE_REQUEST_WHEN_SENDMAIL_DISABLED="Information requests can't be created when sending mail is disabled."
COM_PRIVACY_XML_DESCRIPTION="Component for managing privacy related actions."
language/en-GB/en-GB.plg_system_backuponupdate.sys.ini000060400000001536152453623440016710 0ustar00;; @package   akeebabackup
;; @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
;; @license   GNU General Public License version 3, or later

PLG_SYSTEM_BACKUPONUPDATE="System - Backup on update"
PLG_SYSTEM_BACKUPONUPDATE_XML_DESCRIPTION="Makes Akeeba Backup take a full site backup before updating your site with the Joomla! Update component which comes with Joomla!."

PLG_SYSTEM_BACKUPONUPDATE_PROFILE_LABEL="Backup Profile"
PLG_SYSTEM_BACKUPONUPDATE_PROFILE_DESC="Choose the backup profile which will be used to take a full site backup before updating/upgrading Joomla! with the Joomla! Update component."

COM_AKEEBA_CONFIG_DESCRIPTION_LABEL="Description"
COM_AKEEBA_CONFIG_DESCRIPTION_DESC="The description of the backup record. Leave empty for a description similar to “Automatic backup before updating Joomla! 1.2.3 to 1.4.5”."language/en-GB/en-GB.com_search.ini000060400000004742152453623440012725 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_SEARCH="Search"
COM_SEARCH_ALL_WORDS="All Words"
COM_SEARCH_ALPHABETICAL="Alphabetical"
COM_SEARCH_ANY_WORDS="Any Words"
COM_SEARCH_CONFIG_FIELD_CREATED_DATE_DESC="Show created date."
COM_SEARCH_CONFIG_FIELD_CREATED_DATE_LABEL="Created Date"
COM_SEARCH_CONFIG_GATHER_SEARCH_STATISTICS_DESC="Record the search phrases submitted by visitors."
COM_SEARCH_CONFIG_GATHER_SEARCH_STATISTICS_LABEL="Gather Search Statistics"
COM_SEARCH_CONFIG_FIELD_OPENSEARCH_NAME_LABEL="OpenSearch Name"
COM_SEARCH_CONFIG_FIELD_OPENSEARCH_NAME_DESC="Name displayed for this site as a search provider."
COM_SEARCH_CONFIG_FIELD_OPENSEARCH_DESCRIPTON_LABEL="OpenSearch Description"
COM_SEARCH_CONFIG_FIELD_OPENSEARCH_DESCRIPTON_DESC="Description displayed for this site as a search provider."
COM_SEARCH_CONFIGURATION="Search: Options"
COM_SEARCH_EXACT_PHRASE="Exact phrase"
COM_SEARCH_FIELD_DESC="Word, words or phrase to search for."
COM_SEARCH_FIELD_LABEL="Search Term (Optional)"
COM_SEARCH_FIELD_SEARCH_PHRASES_DESC="Show the search options."
COM_SEARCH_FIELD_SEARCH_PHRASES_LABEL="Use Search Options"
COM_SEARCH_FIELD_SEARCH_AREAS_DESC="Show the search areas checkboxes."
COM_SEARCH_FIELD_SEARCH_AREAS_LABEL="Use Search Areas"
COM_SEARCH_FIELDSET_OPTIONAL_LABEL="Optional Search Term"
COM_SEARCH_FIELDSET_SEARCH_OPTIONS_LABEL="Search"
COM_SEARCH_FOR_DESC="The type of search."
COM_SEARCH_FOR_LABEL="Search For"
COM_SEARCH_HEADING_PHRASE="Search Phrase"
COM_SEARCH_HEADING_SEARCH_TERM_ASC="Search Phrase ascending"
COM_SEARCH_HEADING_SEARCH_TERM_DESC="Search Phrase descending"
COM_SEARCH_HEADING_RESULTS="Results"
COM_SEARCH_HIDE_SEARCH_RESULTS="Hide Search Results"
COM_SEARCH_LOGGING_DISABLED="Gathering statistics disabled. Enable it in the Options."
COM_SEARCH_LOGGING_ENABLED="Gathering statistics enabled"
COM_SEARCH_MANAGER_SEARCHES="Search Term Analysis"
COM_SEARCH_MOST_POPULAR="Popularity"
COM_SEARCH_NEWEST_FIRST="Newest First"
COM_SEARCH_NO_RESULTS="Off"
COM_SEARCH_OLDEST_FIRST="Oldest First"
COM_SEARCH_ORDERING_DESC="Defines what ordering results are listed in."
COM_SEARCH_ORDERING_LABEL="Results Ordering"
COM_SEARCH_SAVED_SEARCH_OPTIONS="Default Search Options"
COM_SEARCH_SEARCH_IN_PHRASE="Search in phrases."
COM_SEARCH_SHOW_SEARCH_RESULTS="Show Search Results"
COM_SEARCH_XML_DESCRIPTION="Component for search functions."
language/en-GB/en-GB.plg_fields_calendar.ini000060400000001604152453623440014555 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_CALENDAR="Fields - Calendar"
PLG_FIELDS_CALENDAR_DEFAULT_VALUE_LABEL="Default Date"
PLG_FIELDS_CALENDAR_DEFAULT_VALUE_DESC="This is the default date. The value can be an ISO 8601 format (YYYY-MM-DD HH:MM:SS) or NOW, which displays the actual date."
PLG_FIELDS_CALENDAR_LABEL="Calendar (%s)"
PLG_FIELDS_CALENDAR_PARAMS_SHOWTIME_DESC="If enabled, the calendar field expects a date and time and will also display the time. The formats are localised using the regular language strings."
PLG_FIELDS_CALENDAR_PARAMS_SHOWTIME_LABEL="Show Time"
PLG_FIELDS_CALENDAR_XML_DESCRIPTION="This plugin lets you create new fields of type 'calendar' in any extensions where custom fields are supported."
language/en-GB/en-GB.com_mailto.sys.ini000060400000000442152453623440013553 0ustar00; Joomla! Project
; (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_MAILTO="Mail to"
COM_MAILTO_XML_DESCRIPTION="A generic mail to friend component."

language/en-GB/en-GB.com_associations.ini000060400000006534152453623440014160 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_ASSOCIATIONS="Multilingual Associations"
COM_ASSOCIATIONS_ADD_NEW_ASSOCIATION="Add new association"
COM_ASSOCIATIONS_ASSOCIATED_ITEM="Target"
COM_ASSOCIATIONS_CHANGE_TARGET="Change Target"
COM_ASSOCIATIONS_COMPONENT_NOT_SUPPORTED="The extension %s does not support multilingual associations."
COM_ASSOCIATIONS_COMPONENT_SELECTOR_DESC="Select a component from this list"
COM_ASSOCIATIONS_COMPONENT_SELECTOR_LABEL="Select component"
COM_ASSOCIATIONS_CONFIGURATION="Multilingual Associations: Options"
COM_ASSOCIATIONS_COPY_REFERENCE="Copy Reference to Target"
COM_ASSOCIATIONS_DELETE_ORPHANS="Delete Orphans"
COM_ASSOCIATIONS_DELETE_ORPHANS_FAILED="Failed to delete orphans."
COM_ASSOCIATIONS_DELETE_ORPHANS_NONE="There were no orphans to delete."
COM_ASSOCIATIONS_DELETE_ORPHANS_SUCCESS="All orphans have been deleted."
COM_ASSOCIATIONS_EDIT_ASSOCIATION="Edit association"
COM_ASSOCIATIONS_EDIT_HIDE_REFERENCE="Hide Reference"
COM_ASSOCIATIONS_EDIT_SHOW_REFERENCE="Show Reference"
COM_ASSOCIATIONS_ERROR_NO_ASSOC="The Multilingual Associations component can't be used if the site is not set as multilingual and/or Associations is not enabled in the <a href="_QQ_"%s"_QQ_">Language Filter plugin</a>."
COM_ASSOCIATIONS_ERROR_NO_TYPE="The item type selected does not exist for this component."
COM_ASSOCIATIONS_FILTER_MENUTYPE_DESC="Select a Menu"
COM_ASSOCIATIONS_FILTER_MENUTYPE_LABEL="Menu"
COM_ASSOCIATIONS_FILTER_SEARCH_DESC="Search an item by its title"
COM_ASSOCIATIONS_FILTER_SEARCH_LABEL="Search item"
COM_ASSOCIATIONS_FILTER_SELECT_ITEM_TYPE="- Select Item Type -"
COM_ASSOCIATIONS_HEADING_ASSOCIATION="Associations"
COM_ASSOCIATIONS_HEADING_MENUTYPE="Menu"
COM_ASSOCIATIONS_HEADING_MENUTYPE_ASC="Menu ascending"
COM_ASSOCIATIONS_HEADING_MENUTYPE_DESC="Menu descending"
COM_ASSOCIATIONS_HEADING_NO_ASSOCIATION="Not Associated"
COM_ASSOCIATIONS_ITEMS="Items"
COM_ASSOCIATIONS_NO_ASSOCIATION="There is no association for this language"
COM_ASSOCIATIONS_NOTICE_NO_SELECTORS="Please select an Item Type and a reference language to view the associations."
COM_ASSOCIATIONS_PURGE="Delete All Associations"
COM_ASSOCIATIONS_PURGE_CONFIRM_PROMPT="Are you sure you want to delete all associations? Confirming will permanently delete them!"
COM_ASSOCIATIONS_PURGE_FAILED="Failed to delete all associations."
COM_ASSOCIATIONS_PURGE_NONE="There were no associations to delete."
COM_ASSOCIATIONS_PURGE_SUCCESS="All associations have been deleted."
COM_ASSOCIATIONS_REFERENCE_ITEM="Reference"
COM_ASSOCIATIONS_SAVE_REFERENCE="Save Reference"
COM_ASSOCIATIONS_SAVE_TARGET="Save Target"
COM_ASSOCIATIONS_SELECT_MENU="- Select Menu -"
COM_ASSOCIATIONS_SELECT_TARGET="Select Target"
COM_ASSOCIATIONS_SELECT_TARGET_LANGUAGE="- Select Target Language -"
COM_ASSOCIATIONS_TITLE="Associations"
COM_ASSOCIATIONS_TITLE_EDIT="Multilingual Associations: Edit Associations (%1$s &gt; %2$s)"
COM_ASSOCIATIONS_TITLE_LIST="Multilingual Associations (%1$s &gt; %2$s)"
COM_ASSOCIATIONS_TITLE_LIST_SELECT="Multilingual Associations: Select Item Type and Language"
COM_ASSOCIATIONS_XML_DESCRIPTION="Improved multilingual content management component"
COM_ASSOCIATIONS_YOU_ARE_NOT_ALLOWED_TO_CHECKIN_THIS_ITEM="You can't check in this item"
language/en-GB/en-GB.com_config.sys.ini000060400000001414152453623440013533 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_CONFIG="Configuration"
COM_CONFIG_XML_DESCRIPTION="Configuration Manager"

COM_CONFIG_COMPONENT_VIEW_DEFAULT_DESC="Display the configuration options for the selected component."
COM_CONFIG_COMPONENT_VIEW_DEFAULT_TITLE="Component Configuration Options"
COM_CONFIG_CONFIG_VIEW_DEFAULT_DESC="Displays global site configuration options."
COM_CONFIG_CONFIG_VIEW_DEFAULT_TITLE="Site Configuration Options"
COM_CONFIG_TEMPLATES_VIEW_DEFAULT_DESC="Displays template parameter options if the template allows this."
COM_CONFIG_TEMPLATES_VIEW_DEFAULT_TITLE="Display Template Options"
language/en-GB/en-GB.plg_system_jce.sys.ini000060400000000425152453623440014440 0ustar00; JCE Project
; Copyright (C) 2006 - 2016 Ryan Demmer. All rights reserved
; GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html

; Note : All ini files need to be saved as UTF-8
PLG_SYSTEM_JCE="System - JCE"
PLG_SYSTEM_JCE_XML_DESCRIPTION="JCE System Plugin"language/en-GB/en-GB.plg_editors-xtd_article.sys.ini000060400000000612152453623440016242 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_ARTICLE_XML_DESCRIPTION="Displays a button to insert links to articles into an Article. Displays a popup allowing you to choose the article."
PLG_EDITORS-XTD_ARTICLE="Button - Article"


language/en-GB/en-GB.plg_system_languagefilter.ini000060400000006176152453623440016064 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_LANGUAGEFILTER="System - Language Filter"
PLG_SYSTEM_LANGUAGEFILTER_BROWSER_SETTINGS="Browser Settings"
PLG_SYSTEM_LANGUAGEFILTER_FIELD_ALTERNATE_META_DESC="Add alternative meta tags for items with associated items in other languages."
PLG_SYSTEM_LANGUAGEFILTER_FIELD_ALTERNATE_META_LABEL="Add Alternate Meta Tags"
PLG_SYSTEM_LANGUAGEFILTER_FIELD_AUTOMATIC_CHANGE_DESC="This option will automatically change the content language used in the Frontend when a user site language is changed."
PLG_SYSTEM_LANGUAGEFILTER_FIELD_AUTOMATIC_CHANGE_LABEL="Automatic Language Change"
PLG_SYSTEM_LANGUAGEFILTER_FIELD_COOKIE_DESC="Language cookies can be set to expire at the end of the session or after a year. Default is session."
PLG_SYSTEM_LANGUAGEFILTER_FIELD_COOKIE_LABEL="Cookie Lifetime"
PLG_SYSTEM_LANGUAGEFILTER_FIELD_DETECT_BROWSER_DESC="Choose site default language or try to detect the browser settings language. It will default to site language if browser settings can't be found."
PLG_SYSTEM_LANGUAGEFILTER_FIELD_DETECT_BROWSER_LABEL="Language Selection for new Visitors"
PLG_SYSTEM_LANGUAGEFILTER_FIELD_ITEM_ASSOCIATIONS_DESC="This option will allow item associations when switching from one language to another. Default home menu items are always associated."
PLG_SYSTEM_LANGUAGEFILTER_FIELD_ITEM_ASSOCIATIONS_LABEL="Associations"
PLG_SYSTEM_LANGUAGEFILTER_FIELD_XDEFAULT_DESC="This option will add the x-default meta tag to improve SEO."
PLG_SYSTEM_LANGUAGEFILTER_FIELD_XDEFAULT_LABEL="Add x-default Meta Tag"
PLG_SYSTEM_LANGUAGEFILTER_FIELD_XDEFAULT_LANGUAGE_DESC="Choose the x-default language."
PLG_SYSTEM_LANGUAGEFILTER_FIELD_XDEFAULT_LANGUAGE_LABEL="x-default Language"
PLG_SYSTEM_LANGUAGEFILTER_OPTION_DEFAULT_LANGUAGE="Default frontend language"
PLG_SYSTEM_LANGUAGEFILTER_FIELD_REMOVE_DEFAULT_PREFIX_DESC="Remove the defined URL Language Code of the Content Language that corresponds to the default site language when Search Engine Friendly URLs is set to 'Yes'."
PLG_SYSTEM_LANGUAGEFILTER_FIELD_REMOVE_DEFAULT_PREFIX_LABEL="Remove URL Language Code"
PLG_SYSTEM_LANGUAGEFILTER_OPTION_SESSION="Session"
PLG_SYSTEM_LANGUAGEFILTER_OPTION_YEAR="Year"
PLG_SYSTEM_LANGUAGEFILTER_PRIVACY_CAPABILITY_LANGUAGE_COOKIE="On a site which supports multiple languages, this plugin can be configured to set a cookie on the user's browser which remembers their language preference. This cookie is used to redirect users to their preferred language when visiting the site and creating a new session. The cookie's name is based on a randomly generated hash and therefore does not have a constant identifier."
PLG_SYSTEM_LANGUAGEFILTER_SITE_LANGUAGE="Site Language"
PLG_SYSTEM_LANGUAGEFILTER_XML_DESCRIPTION="This plugin filters the displayed content depending on language.<br /><strong>This plugin is to be enabled only when the Language Switcher module is published.</strong><br />If this plugin is activated, it is recommended to also publish the Administrator multilingual status module."
language/en-GB/en-GB.plg_fields_calendar.sys.ini000060400000000610152453623440015366 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_CALENDAR="Fields - Calendar"
PLG_FIELDS_CALENDAR_XML_DESCRIPTION="This plugin lets you create new fields of type 'calendar' in any extensions where custom fields are supported."
language/en-GB/en-GB.plg_editors_codemirror.ini000060400000011225152453623440015354 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CODEMIRROR_FIELD_ACTIVELINE_COLOR_DESC="The colour to use for highlighting the active line. Will be displayed at 50% opacity."
PLG_CODEMIRROR_FIELD_ACTIVELINE_COLOR_LABEL="Active Line Colour"
PLG_CODEMIRROR_FIELD_ACTIVELINE_DESC="Adds a highlight to the line the cursor is on."
PLG_CODEMIRROR_FIELD_ACTIVELINE_LABEL="Highlight Active Line"
PLG_CODEMIRROR_FIELD_AUTOCLOSEBRACKET_DESC="Automatic bracket completion."
PLG_CODEMIRROR_FIELD_AUTOCLOSEBRACKET_LABEL="Bracket Completion"
PLG_CODEMIRROR_FIELD_AUTOCLOSETAGS_DESC="Automatic tag completion."
PLG_CODEMIRROR_FIELD_AUTOCLOSETAGS_LABEL="Tag Completion"
; The following two strings are deprecated and will be removed in J4
PLG_CODEMIRROR_FIELD_AUTOFOCUS_DESC="Auto focus."
PLG_CODEMIRROR_FIELD_AUTOFOCUS_LABEL="Auto Focus"
PLG_CODEMIRROR_FIELD_CODEFOLDING_DESC="Allow blocks of code to be folded."
PLG_CODEMIRROR_FIELD_CODEFOLDING_LABEL="Code Folding"
PLG_CODEMIRROR_FIELD_FONT_FAMILY_DESC="The font to use in the editor. If not installed, will be loaded from https://www.google.com/fonts/."
PLG_CODEMIRROR_FIELD_FONT_FAMILY_LABEL="Font"
PLG_CODEMIRROR_FIELD_FONT_SIZE_DESC="The size of the font in the editor."
PLG_CODEMIRROR_FIELD_FONT_SIZE_LABEL="Font Size (px)"
PLG_CODEMIRROR_FIELD_FULLSCREEN_DESC="Select the function key to use to toggle fullscreen mode."
PLG_CODEMIRROR_FIELD_FULLSCREEN_LABEL="Toggle Fullscreen"
PLG_CODEMIRROR_FIELD_FULLSCREEN_MOD_DESC="Select any modifier keys to use with the fullscreen toggle key."
PLG_CODEMIRROR_FIELD_FULLSCREEN_MOD_LABEL="Use Modifiers"
PLG_CODEMIRROR_FIELD_HIGHLIGHT_MATCH_COLOR_DESC="The background colour to use for highlighting matching tags. Will be displayed at 50% opacity."
PLG_CODEMIRROR_FIELD_HIGHLIGHT_MATCH_COLOR_LABEL="Matching Tag Colour"
PLG_CODEMIRROR_FIELD_KEYMAP_DESC="Make CodeMirror work like other popular editors."
PLG_CODEMIRROR_FIELD_KEYMAP_EMACS="Emacs"
PLG_CODEMIRROR_FIELD_KEYMAP_LABEL="Key Map"
PLG_CODEMIRROR_FIELD_KEYMAP_SUBLIME="Sublime Text"
PLG_CODEMIRROR_FIELD_KEYMAP_VIM="Vim"
PLG_CODEMIRROR_FIELD_LINE_HEIGHT_DESC="The height of one line of text. This is in ems, meaning that 1.0 is equal to the font size and 2.0 is equal to 2x the font size."
PLG_CODEMIRROR_FIELD_LINE_HEIGHT_LABEL="Line Height (em)"
PLG_CODEMIRROR_FIELD_LINENUMBERS_DESC="Display line numbers."
PLG_CODEMIRROR_FIELD_LINENUMBERS_LABEL="Line Numbers"
PLG_CODEMIRROR_FIELD_LINEWRAPPING_DESC="Enable/Disable line wrapping."
PLG_CODEMIRROR_FIELD_LINEWRAPPING_LABEL="Line Wrapping"
PLG_CODEMIRROR_FIELD_MARKERGUTTER_DESC="Code Marker and Code Folding."
PLG_CODEMIRROR_FIELD_MARKERGUTTER_LABEL="Gutters"
PLG_CODEMIRROR_FIELD_MATCHBRACKETS_DESC="Highlight matching brackets."
PLG_CODEMIRROR_FIELD_MATCHBRACKETS_LABEL="Match Brackets"
PLG_CODEMIRROR_FIELD_MATCHTAGS_DESC="Highlight matching tags."
PLG_CODEMIRROR_FIELD_MATCHTAGS_LABEL="Match Tags"
PLG_CODEMIRROR_FIELD_PREVIEW_DESC="An example of what your CodeMirror editor fields will look like with the current settings (save to update)."
PLG_CODEMIRROR_FIELD_PREVIEW_LABEL="Preview"
PLG_CODEMIRROR_FIELD_SELECTIONMATCHES_DESC="Highlight instances of the selected word throughout the document."
PLG_CODEMIRROR_FIELD_SELECTIONMATCHES_LABEL="Highlight Selection Matches"
PLG_CODEMIRROR_FIELD_THEME_DESC="Sets the colours for the editor."
PLG_CODEMIRROR_FIELD_THEME_LABEL="Theme"
PLG_CODEMIRROR_FIELD_VALUE_FONT_FAMILY_DEFAULT="Browser Default"
PLG_CODEMIRROR_FIELD_VALUE_FULLSCREEN_MOD_ALT="Alt"
PLG_CODEMIRROR_FIELD_VALUE_FULLSCREEN_MOD_CMD="Command"
PLG_CODEMIRROR_FIELD_VALUE_FULLSCREEN_MOD_CTRL="Control"
PLG_CODEMIRROR_FIELD_VALUE_FULLSCREEN_MOD_SHIFT="Shift"
PLG_CODEMIRROR_FIELD_VALUE_SCROLLBARSTYLE_DEFAULT="Default"
PLG_CODEMIRROR_FIELD_VALUE_SCROLLBARSTYLE_DESC="Select the scrollbar style you'd like CodeMirror to use."
PLG_CODEMIRROR_FIELD_VALUE_SCROLLBARSTYLE_LABEL="Scrollbar Style"
PLG_CODEMIRROR_FIELD_VALUE_SCROLLBARSTYLE_OVERLAY="Overlay"
PLG_CODEMIRROR_FIELD_VALUE_SCROLLBARSTYLE_SIMPLE="Simple"
PLG_CODEMIRROR_FIELD_VALUE_THEME_DARK="Dark"
PLG_CODEMIRROR_FIELD_VALUE_THEME_LIGHT="Light"
PLG_CODEMIRROR_FIELD_VIM_KEYBINDING_DESC="Select this option to make CodeMirror work in Vim mode."
PLG_CODEMIRROR_FIELD_VIM_KEYBINDING_LABEL="Vim Keybinding"
PLG_CODEMIRROR_FIELDSET_APPEARANCE_OPTIONS_LABEL="Appearance Options"
PLG_CODEMIRROR_FIELDSET_TOOLBAR_OPTIONS_LABEL="Toolbar Options"
PLG_CODEMIRROR_TOGGLE_FULL_SCREEN="Press %1$s %2$s to toggle Full Screen editing."
PLG_CODEMIRROR_XML_DESCRIPTION="This plugin loads the CodeMirror editor."
PLG_EDITORS_CODEMIRROR="Editor - CodeMirror"
language/en-GB/en-GB.plg_privacy_consents.sys.ini000060400000000573152453623440015670 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_PRIVACY_CONSENTS="Privacy - Consents"
PLG_PRIVACY_CONSENTS_XML_DESCRIPTION="Responsible for processing privacy related requests for the core Joomla privacy consents data."
language/en-GB/en-GB.plg_fields_integer.sys.ini000060400000000604152453623440015255 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_INTEGER="Fields - Integer"
PLG_FIELDS_INTEGER_XML_DESCRIPTION="This plugin lets you create new fields of type 'integer' in any extensions where custom fields are supported."
language/en-GB/en-GB.plg_fields_color.ini000060400000000642152453623440014123 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_COLOR="Fields - Colour"
PLG_FIELDS_COLOR_LABEL="Colour (%s)"
PLG_FIELDS_COLOR_XML_DESCRIPTION="This plugin lets you create new fields of type 'color' in any extensions where custom fields are supported."
language/en-GB/en-GB.com_config.ini000060400000063146152453623440012730 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_CONFIG="Configuration"
COM_CONFIG_ACTION_ADMIN_DESC="Allows users in the group to perform any action over the whole site regardless of any other permission settings."
COM_CONFIG_ACTION_CREATE_DESC="Allows users in the group to create any content in any extension."
COM_CONFIG_ACTION_DELETE_DESC="Allows users in the group to delete any content in any extension."
COM_CONFIG_ACTION_EDIT_DESC="Allows users in the group to edit any content in any extension."
COM_CONFIG_ACTION_EDITOWN_DESC="Allows users in the group to edit any content they own in any extension."
COM_CONFIG_ACTION_EDITVALUE_DESC="Allows users in the group to edit any value of custom fields submitted in any extension."
COM_CONFIG_ACTION_EDITSTATE_DESC="Allows users in the group to edit the state of any content in any extension."
COM_CONFIG_ACTION_LOGIN_ADMIN_DESC="Allows users in the group to login to the Backend Administrator site."
COM_CONFIG_ACTION_LOGIN_OFFLINE_DESC="Allows users in the group to access the Frontend site when site is offline."
COM_CONFIG_ACTION_LOGIN_SITE_DESC="Allows users in the group to login to the Frontend site."
COM_CONFIG_ACTION_MANAGE_DESC="Allows users in the group to access all of the administration interface except Global Configuration."
COM_CONFIG_ACTION_OPTIONS_DESC="Allows users in the group to edit the options except the permissions of any extension."
COM_CONFIG_CACHE_SETTINGS="Cache Settings"
COM_CONFIG_CACHE_WARNING="Failed to clear cache automatically, you may need to do so manually."
COM_CONFIG_COMPONENT_FIELDSET_LABEL="Component"
COM_CONFIG_COMPONENT_NO_CONFIG_FIELDS_MESSAGE="This component has no configuration options."
COM_CONFIG_COOKIE_SETTINGS="Cookie Settings"
COM_CONFIG_DATABASE_SETTINGS="Database Settings"
COM_CONFIG_DEBUG_SETTINGS="Debug Settings"
COM_CONFIG_ERROR_CACHE_PATH_NOTWRITABLE="The cache folder is not writable: %s"
COM_CONFIG_ERROR_CACHE_CONNECTION_FAILED="Could not connect to the cache handler to clean the cache."
COM_CONFIG_ERROR_CACHE_DRIVER_UNSUPPORTED="Could not clean the cache, the configured cache handler is not supported by this environment."
COM_CONFIG_ERROR_COMPONENT_ASSET_NOT_FOUND="The asset for the component could not be found. Permissions have not been saved."
COM_CONFIG_ERROR_CONFIG_EXTENSION_NOT_FOUND="The Global Configuration extension could not be found. Text filter settings have not been saved."
COM_CONFIG_ERROR_CONFIGURATION_PHP_NOTUNWRITABLE="Could not make configuration.php unwritable."
COM_CONFIG_ERROR_CONFIGURATION_PHP_NOTWRITABLE="Could not make configuration.php writable."
COM_CONFIG_ERROR_CUSTOM_CACHE_PATH_NOTWRITABLE_USING_DEFAULT="The folder at %1$s is not writable and cannot be used for the cache, using the default %2$s instead."
; The following 2 strings are deprecated and will be removed with 4.0.
COM_CONFIG_ERROR_HELPREFRESH_ERROR_STORE="The new Help Sites list could not be saved."
COM_CONFIG_ERROR_HELPREFRESH_FETCH="The current Help Sites list could not be fetched from the remote server."
COM_CONFIG_ERROR_ROOT_ASSET_NOT_FOUND="The asset for global configuration could not be found. Permissions have not been saved."
COM_CONFIG_ERROR_SSL_NOT_AVAILABLE="HTTPS has not been enabled as it is not available on this server. HTTPS connection test failed with the following error: <em>%s</em>"
COM_CONFIG_ERROR_SSL_NOT_AVAILABLE_HTTP_CODE="HTTPS version of the site returned an invalid HTTP status code."
COM_CONFIG_ERROR_REMOVING_SUPER_ADMIN="You can't remove your own Super User permissions."
COM_CONFIG_ERROR_UNKNOWN_BEFORE_SAVING="A plugin reported an unknown error before saving the configuration."
COM_CONFIG_ERROR_WRITE_FAILED="Could not write to the configuration file"
COM_CONFIG_FIELD_CACHE_HANDLER_DESC="Choose the cache handler. Native caching mechanism is file-based. Please make sure the cache folders are writable."
COM_CONFIG_FIELD_CACHE_HANDLER_LABEL="Cache Handler"
COM_CONFIG_FIELD_CACHE_PLATFORMPREFIX_LABEL="Platform Specific Caching"
COM_CONFIG_FIELD_CACHE_PLATFORMPREFIX_DESC="Enable or disable platform specific caching. Enable when HTML output on mobile differs from other devices. (Default disabled.)"
COM_CONFIG_FIELD_CACHE_LABEL="System Cache"
COM_CONFIG_FIELD_CACHE_DESC="Enable or disable caching and set caching level. Conservative level: smaller system cache, Progressive level (default): faster, bigger system cache, includes module renderers cache. Not appropriate for extremely large sites."
COM_CONFIG_FIELD_CACHE_PATH_DESC="Please specify a writable folder to store cache files if you do not wish to use the default folder."
COM_CONFIG_FIELD_CACHE_PATH_LABEL="Path to Cache Folder"
COM_CONFIG_FIELD_CACHE_TIME_DESC="The maximum length of time in minutes for a cache file to be stored before it is refreshed."
COM_CONFIG_FIELD_CACHE_TIME_LABEL="Cache Time"
COM_CONFIG_FIELD_COOKIE_DOMAIN_DESC="Domain to use when setting session cookies. Precede domain with '.' if cookie should be valid for all subdomains."
COM_CONFIG_FIELD_COOKIE_DOMAIN_LABEL="Cookie Domain"
COM_CONFIG_FIELD_COOKIE_PATH_DESC="Path the cookie should be valid for."
COM_CONFIG_FIELD_COOKIE_PATH_LABEL="Cookie Path"
COM_CONFIG_FIELD_DATABASE_HOST_DESC="The hostname for your database entered during the installation process. Do not edit this field unless absolutely necessary (eg the transfer of the database to a new hosting provider)."
COM_CONFIG_FIELD_DATABASE_HOST_LABEL="Host"
COM_CONFIG_FIELD_DATABASE_NAME_DESC="The name for your database entered during the installation process. Do not edit this field unless absolutely necessary (eg the transfer of the database to a new hosting provider)."
COM_CONFIG_FIELD_DATABASE_NAME_LABEL="Database Name"
COM_CONFIG_FIELD_DATABASE_PASSWORD_DESC="The password for access to your database. Do not edit this field unless absolutely necessary (eg after the transfer of the database to a new hosting provider)."
COM_CONFIG_FIELD_DATABASE_PASSWORD_LABEL="Database Password"
COM_CONFIG_FIELD_DATABASE_PREFIX_DESC="The prefix used for your database tables, created during the installation process. Do not edit this field unless absolutely necessary (eg the transfer of the database to a new hosting provider)."
COM_CONFIG_FIELD_DATABASE_PREFIX_LABEL="Database Tables Prefix"
COM_CONFIG_FIELD_DATABASE_TYPE_DESC="The type of database in use, selected during the installation process. Do not edit this field unless you are migrating to a different type of database, perhaps due to changing your hosting provider."
COM_CONFIG_FIELD_DATABASE_TYPE_LABEL="Database Type"
COM_CONFIG_FIELD_DATABASE_USERNAME_DESC="The username for access to your database entered during the installation process. Do not edit this field unless absolutely necessary (eg the transfer of the database to a new hosting provider)."
COM_CONFIG_FIELD_DATABASE_USERNAME_LABEL="Database Username"
COM_CONFIG_FIELD_DEBUG_CONST="Constant"
COM_CONFIG_FIELD_DEBUG_CONST_LANG_DESC="Select if you should display the language constant or the language value when debugging the language strings."
COM_CONFIG_FIELD_DEBUG_CONST_LANG_LABEL="Language Display"
COM_CONFIG_FIELD_DEBUG_LANG_DESC="Select if the debugging indicators (<strong>** ... **</strong>) or (<strong>?? ... ??</strong>) for the Joomla Language files will be displayed. Debug Language will work without Debug System being activated, but you will not get the additional detailed references that will help you correct any errors."
COM_CONFIG_FIELD_DEBUG_LANG_LABEL="Debug Language"
COM_CONFIG_FIELD_DEBUG_SYSTEM_DESC="If enabled, diagnostic information, language translation and SQL errors (if present) will be displayed. The information will be displayed at the foot of every page you view within the Joomla Backend and Frontend. It is not advisable to leave the debug mode activated when running a live website."
COM_CONFIG_FIELD_DEBUG_SYSTEM_LABEL="Debug System"
COM_CONFIG_FIELD_DEBUG_VALUE="Value"
COM_CONFIG_FIELD_DEFAULT_ACCESS_LEVEL_DESC="Select the default access level for new content, menu items and other items created on your site."
COM_CONFIG_FIELD_DEFAULT_ACCESS_LEVEL_LABEL="Default Access Level"
COM_CONFIG_FIELD_DEFAULT_EDITOR_DESC="Select the default text editor for your site. Registered Users will be able to change their preference in their personal details if you allow that option."
COM_CONFIG_FIELD_DEFAULT_EDITOR_LABEL="Default Editor"
COM_CONFIG_FIELD_DEFAULT_CAPTCHA_DESC="Select the default captcha for your site. You may need to enter required information for your captcha plugin in the Plugin Manager."
COM_CONFIG_FIELD_DEFAULT_CAPTCHA_LABEL="Default Captcha"
COM_CONFIG_FIELD_DEFAULT_FEED_LIMIT_DESC="Select the number of content items to show in the feed(s)."
COM_CONFIG_FIELD_DEFAULT_FEED_LIMIT_LABEL="Default Feed Limit"
COM_CONFIG_FIELD_DEFAULT_LIST_LIMIT_DESC="Sets the default length of lists in the Control Panel for all users."
COM_CONFIG_FIELD_DEFAULT_LIST_LIMIT_LABEL="Default List Limit"
COM_CONFIG_FIELD_ERROR_REPORTING_DESC="Select the level of reporting. See the Help Screen for full details."
COM_CONFIG_FIELD_ERROR_REPORTING_LABEL="Error Reporting"
COM_CONFIG_FIELD_FEED_EMAIL_DESC="The RSS and Atom news feeds include the author's email address. Select Author Email Address to use each author's email address (from the User Manager) in the news feed. Select Site Email Address to include the site 'Mail from' email address for each article."
COM_CONFIG_FIELD_FEED_EMAIL_LABEL="Feed Email Address"
COM_CONFIG_FIELD_FILTERS_DEFAULT_BLACK_LIST="Default Blacklist"
COM_CONFIG_FIELD_FILTERS_CUSTOM_BLACK_LIST="Custom Blacklist"
COM_CONFIG_FIELD_FILTERS_NO_HTML="No HTML"
COM_CONFIG_FIELD_FILTERS_NO_FILTER="No Filtering"
COM_CONFIG_FIELD_FILTERS_WHITE_LIST="Whitelist"
COM_CONFIG_FRONTEDITING_DESC="Select if you want inline editing for modules and menu items (support may depend on your template)."
COM_CONFIG_FRONTEDITING_LABEL="Inline Editing"
COM_CONFIG_FRONTEDITING_MENUSANDMODULES="Modules & Menus"
COM_CONFIG_FRONTEDITING_MENUSANDMODULES_ADMIN_TOO="Modules & Menus (administrator too)"
COM_CONFIG_FRONTEDITING_MODULES="Modules"
COM_CONFIG_FIELD_FORCE_SSL_DESC="Force site access in the selected areas to occur only with HTTPS (encrypted HTTP connections with the https:// protocol prefix) and also force the use of secure cookies. Note, you must have HTTPS enabled on your server or load balancer to utilise this option. Enable 'Behind Load Balancer' if your SSL terminates on your load balancer but your site is served on http on its webserver."
COM_CONFIG_FIELD_FORCE_SSL_LABEL="Force HTTPS"
COM_CONFIG_FIELD_FTP_ENABLE_DESC="Enable the built in FTP (File Transfer Protocol) functionality which is needed, in some server environments, instead of the normal upload functionality of Joomla."
COM_CONFIG_FIELD_FTP_ENABLE_LABEL="Enable FTP"
COM_CONFIG_FIELD_FTP_HOST_DESC="Enter the name of the host of your FTP server."
COM_CONFIG_FIELD_FTP_HOST_LABEL="FTP Host"
COM_CONFIG_FIELD_FTP_PASSWORD_DESC="Enter your FTP password."
COM_CONFIG_FIELD_FTP_PASSWORD_LABEL="FTP Password"
COM_CONFIG_FIELD_FTP_PORT_DESC="Enter the port that FTP should be accessed by. The default is port 21."
COM_CONFIG_FIELD_FTP_PORT_LABEL="FTP Port"
COM_CONFIG_FIELD_FTP_ROOT_DESC="The path to the root folder of the FTP server. The root folder is the base folder to which the FTP server is allowed access."
COM_CONFIG_FIELD_FTP_ROOT_LABEL="FTP Root"
COM_CONFIG_FIELD_FTP_USERNAME_DESC="The username used to access the FTP server."
COM_CONFIG_FIELD_FTP_USERNAME_LABEL="FTP Username"
COM_CONFIG_FIELD_GZIP_COMPRESSION_DESC="Compress buffered output if supported."
COM_CONFIG_FIELD_GZIP_COMPRESSION_LABEL="Gzip Page Compression"
; The following two strings are deprecated and will be removed with 4.0.
COM_CONFIG_FIELD_HELP_SERVER_DESC="Select the name of the help server from which your system will collect the help screen displays."
COM_CONFIG_FIELD_HELP_SERVER_LABEL="Help Server"
COM_CONFIG_FIELD_LOG_PATH_DESC="Please specify a folder to store log files."
COM_CONFIG_FIELD_LOG_PATH_LABEL="Path to Log Folder"
COM_CONFIG_FIELD_MAIL_FROM_EMAIL_DESC="The email address that will be used to send site email."
COM_CONFIG_FIELD_MAIL_FROM_EMAIL_LABEL="From Email"
COM_CONFIG_FIELD_MAIL_FROM_NAME_DESC="Text displayed in the header &quot;From:&quot; field when sending a site email. Usually the site name."
COM_CONFIG_FIELD_MAIL_FROM_NAME_LABEL="From Name"
COM_CONFIG_FIELD_MAIL_REPLY_TO_EMAIL_LABEL="Reply To Email"
COM_CONFIG_FIELD_MAIL_REPLY_TO_EMAIL_DESC="The email address that will be used to receive end user(s) reply"
COM_CONFIG_FIELD_MAIL_REPLY_TO_NAME_LABEL="Reply To Name"
COM_CONFIG_FIELD_MAIL_REPLY_TO_NAME_DESC="Text displayed in the header &quot;To:&quot; field when end user(s) replying to received email"
COM_CONFIG_FIELD_MAIL_MAILONLINE_DESC="Select Yes to turn on mail sending, select No to turn off mail sending. Warning: It is recommended to put the site offline when disabling the mail function!"
COM_CONFIG_FIELD_MAIL_MAILONLINE_LABEL="Send Mail"
COM_CONFIG_FIELD_MAIL_MASSMAILOFF_DESC="Select Yes to disable the Mass Mail Users function, select No to make it active."
COM_CONFIG_FIELD_MAIL_MASSMAILOFF_LABEL="Disable Mass Mail"
COM_CONFIG_FIELD_MAIL_MAILER_DESC="Select which mailer for the delivery of site email."
COM_CONFIG_FIELD_MAIL_MAILER_LABEL="Mailer"
COM_CONFIG_FIELD_MAIL_SENDMAIL_PATH_DESC="Enter the path to the sendmail program folder on the host server."
COM_CONFIG_FIELD_MAIL_SENDMAIL_PATH_LABEL="Sendmail Path"
COM_CONFIG_FIELD_MAIL_SMTP_AUTH_DESC="Select Yes if your SMTP Host requires SMTP Authentication."
COM_CONFIG_FIELD_MAIL_SMTP_AUTH_LABEL="SMTP Authentication"
COM_CONFIG_FIELD_MAIL_SMTP_HOST_DESC="Enter the name of the SMTP host."
COM_CONFIG_FIELD_MAIL_SMTP_HOST_LABEL="SMTP Host"
COM_CONFIG_FIELD_MAIL_SMTP_PASSWORD_DESC="Enter the password for the SMTP host."
COM_CONFIG_FIELD_MAIL_SMTP_PASSWORD_LABEL="SMTP Password"
COM_CONFIG_FIELD_MAIL_SMTP_PORT_DESC="Enter the port number of the SMTP server Joomla will use to send emails. Usually:<br />- 25 when using an unsecure mail server<br />- 465 when using a secure server with SMTPS<br />- 25 or 587 when using a secure server with SMTP with STARTTLS extension."
COM_CONFIG_FIELD_MAIL_SMTP_PORT_LABEL="SMTP Port"
COM_CONFIG_FIELD_MAIL_SMTP_SECURE_DESC="Select the security model of the SMTP server Joomla will use to send emails.<br />- None for no encryption<br />- SSL/TLS for SMTPS (usually on port 465)<br />- STARTTLS for SMTP with STARTTLS extension (usually on port 25 or port 587)"
COM_CONFIG_FIELD_MAIL_SMTP_SECURE_LABEL="SMTP Security"
COM_CONFIG_FIELD_MAIL_SMTP_USERNAME_DESC="Enter the username for access to the SMTP host."
COM_CONFIG_FIELD_MAIL_SMTP_USERNAME_LABEL="SMTP Username"
COM_CONFIG_FIELD_MEMCACHE_COMPRESSION_DESC="Memcache(d) compression."
COM_CONFIG_FIELD_MEMCACHE_COMPRESSION_LABEL="Memcache(d) Compression"
COM_CONFIG_FIELD_MEMCACHE_HOST_DESC="Memcache(d) server host."
COM_CONFIG_FIELD_MEMCACHE_HOST_LABEL="Memcache(d) Server Host"
COM_CONFIG_FIELD_MEMCACHE_PERSISTENT_DESC="Persistent Memcache(d)."
COM_CONFIG_FIELD_MEMCACHE_PERSISTENT_LABEL="Persistent Memcache(d)"
COM_CONFIG_FIELD_MEMCACHE_PORT_DESC="Memcache(d) server port."
COM_CONFIG_FIELD_MEMCACHE_PORT_LABEL="Memcache(d) Server Port"
COM_CONFIG_FIELD_REDIS_AUTH_DESC="Redis server authentication."
COM_CONFIG_FIELD_REDIS_AUTH_LABEL="Redis Server Authentication"
COM_CONFIG_FIELD_REDIS_DB_DESC="Redis database."
COM_CONFIG_FIELD_REDIS_DB_LABEL="Redis Database"
COM_CONFIG_FIELD_REDIS_HOST_DESC="Redis server host."
COM_CONFIG_FIELD_REDIS_HOST_LABEL="Redis Server Host"
COM_CONFIG_FIELD_REDIS_PERSISTENT_DESC="Persistent Redis."
COM_CONFIG_FIELD_REDIS_PERSISTENT_LABEL="Persistent Redis"
COM_CONFIG_FIELD_REDIS_PORT_DESC="Redis server port."
COM_CONFIG_FIELD_REDIS_PORT_LABEL="Redis Server Port"
COM_CONFIG_FIELD_LOADBALANCER_ENABLE_DESC="If your site is behind a load balancer or reverse proxy, enable this setting so that IP addresses and other configurations within Joomla automatically take this into account."
COM_CONFIG_FIELD_LOADBALANCER_ENABLE_LABEL="Behind Load Balancer"
COM_CONFIG_FIELD_METAAUTHOR_DESC="Show the author meta tag when viewing articles."
COM_CONFIG_FIELD_METAAUTHOR_LABEL="Show Author Meta Tag"
COM_CONFIG_FIELD_METADESC_DESC="Enter a description of the overall website that may be used by search engines. Generally, a maximum of 20 words is best."
COM_CONFIG_FIELD_METADESC_LABEL="Site Meta Description"
COM_CONFIG_FIELD_METAKEYS_DESC="Enter the keywords and phrases that best describe your website. Separate keywords and phrases with a comma."
COM_CONFIG_FIELD_METAKEYS_LABEL="Site Meta Keywords"
COM_CONFIG_FIELD_METALANGUAGE_DESC="Places the selected language in the metadata for the site."
COM_CONFIG_FIELD_METALANGUAGE_LABEL="Site Meta Language"
COM_CONFIG_FIELD_METAVERSION_LABEL="Show Joomla Version"
COM_CONFIG_FIELD_METAVERSION_DESC="Show the Joomla version number in the generator meta tag."
COM_CONFIG_FIELD_OFFLINE_IMAGE_DESC="Select or upload an optional image to be displayed on the default offline page. Make sure the image is less than 400px wide."
COM_CONFIG_FIELD_OFFLINE_IMAGE_LABEL="Offline Image"
COM_CONFIG_FIELD_OFFLINE_MESSAGE_DESC="The custom offline message will be used if the 'Offline Message' field is set to 'Use Custom Message'."
COM_CONFIG_FIELD_OFFLINE_MESSAGE_LABEL="Custom Message"
COM_CONFIG_FIELD_PROXY_ENABLE_DESC="Enable Joomla to use a proxy which is needed in some server environments to fetch URLs like in the Joomla Update component."
COM_CONFIG_FIELD_PROXY_ENABLE_LABEL="Enable Outbound Proxy"
COM_CONFIG_FIELD_PROXY_HOST_DESC="Enter the name of the host of your Proxy server."
COM_CONFIG_FIELD_PROXY_HOST_LABEL="Outbound Proxy Host"
COM_CONFIG_FIELD_PROXY_PASSWORD_DESC="Enter your Proxy password."
COM_CONFIG_FIELD_PROXY_PASSWORD_LABEL="Outbound Proxy Password"
COM_CONFIG_FIELD_PROXY_PORT_DESC="Enter the port that Proxy should be accessed by."
COM_CONFIG_FIELD_PROXY_PORT_LABEL="Outbound Proxy Port"
COM_CONFIG_FIELD_PROXY_USERNAME_DESC="The username used to access the Proxy server."
COM_CONFIG_FIELD_PROXY_USERNAME_LABEL="Outbound Proxy Username"
COM_CONFIG_FIELD_SECRET_DESC="This is an auto-generated, unique alphanumeric code for every Joomla installation. It is used for security functions."
COM_CONFIG_FIELD_SECRET_LABEL="Secret"
COM_CONFIG_FIELD_SEF_REWRITE_DESC="Select to use a server's rewrite engine to catch URLs that meet specific conditions and rewrite them as directed. Available for IIS 7 and Apache. <br /><strong>Apache users only!</strong><br />Rename htaccess.txt to .htaccess before activating.<br /><strong>IIS 7 users only!</strong><br />Rename web.config.txt to web.config and install IIS URL Rewrite Module before activating.<br />"
COM_CONFIG_FIELD_SEF_REWRITE_LABEL="Use URL Rewriting"
COM_CONFIG_FIELD_SEF_SUFFIX_DESC="If yes, the system will add a suffix to the URL based on the document type."
COM_CONFIG_FIELD_SEF_SUFFIX_LABEL="Add Suffix to URL"
COM_CONFIG_FIELD_SEF_URL_DESC="Select if the URLs are optimised for Search Engines."
COM_CONFIG_FIELD_SEF_URL_LABEL="Search Engine Friendly URLs"
COM_CONFIG_FIELD_SERVER_TIMEZONE_DESC="Choose a city in the list to configure the date and time for display."
COM_CONFIG_FIELD_SERVER_TIMEZONE_LABEL="Website Time Zone"
COM_CONFIG_FIELD_SESSION_HANDLER_DESC="The mechanism by which Joomla identifies a User once they are connected to the website using non-persistent cookies.<br />If 'PHP' is selected, the <em>session.save_handler</em> value from the PHP configuration will be used."
COM_CONFIG_FIELD_SESSION_HANDLER_LABEL="Session Handler"
COM_CONFIG_FIELD_SESSION_TIME_DESC="Auto log out a User after they have been inactive for the entered number of minutes. Do not set too high."
COM_CONFIG_FIELD_SESSION_TIME_LABEL="Session Lifetime"
COM_CONFIG_FIELD_SHARED_SESSION_DESC="When enabled, a user's session is shared between the frontend and administrator sections of the site. Note that changing this value will invalidate all existing sessions on the site. This is not available when the \"Force HTTPS\" option is set to \"Administrator Only\"."
COM_CONFIG_FIELD_SHARED_SESSION_LABEL="Shared Sessions"
COM_CONFIG_FIELD_SITE_DISPLAY_MESSAGE_DESC="Display or not a Frontend message when the site is offline. The custom offline message uses the value defined in the 'Custom message' field. The language offline message uses the value defined in the site language ini file."
COM_CONFIG_FIELD_SITE_DISPLAY_MESSAGE_LABEL="Offline Message"
COM_CONFIG_FIELD_SITE_NAME_DESC="Enter the name of your website. This will be used in various locations (eg the Backend browser title bar and <em>Site Offline</em> pages)."
COM_CONFIG_FIELD_SITE_NAME_LABEL="Site Name"
COM_CONFIG_FIELD_SITE_OFFLINE_DESC="Select if access to the Site Frontend is available. If Yes, the Frontend will display or not a message depending on the settings below."
COM_CONFIG_FIELD_SITE_OFFLINE_LABEL="Site Offline"
COM_CONFIG_FIELD_SITENAME_PAGETITLES_DESC="Begin or end all Page Titles with the site name (for example, My Site Name - My Article Name)."
COM_CONFIG_FIELD_SITENAME_PAGETITLES_LABEL="Site Name in Page Titles"
COM_CONFIG_FIELD_TEMP_PATH_DESC="Please specify a writable folder to store temporary files."
COM_CONFIG_FIELD_TEMP_PATH_LABEL="Path to Temp Folder"
COM_CONFIG_FIELD_UNICODESLUGS_DESC="Choose between transliteration and unicode aliases. Transliteration is the default."
COM_CONFIG_FIELD_UNICODESLUGS_LABEL="Unicode Aliases"
COM_CONFIG_FIELD_VALUE_ADMINISTRATOR_ONLY="Administrator Only"
COM_CONFIG_FIELD_VALUE_AFTER="After"
COM_CONFIG_FIELD_VALUE_AUTHOR_EMAIL="Author Email"
COM_CONFIG_FIELD_VALUE_BEFORE="Before"
COM_CONFIG_FIELD_VALUE_CACHE_OFF="OFF - Caching disabled"
COM_CONFIG_FIELD_VALUE_CACHE_CONSERVATIVE="ON - Conservative caching"
COM_CONFIG_FIELD_VALUE_CACHE_PROGRESSIVE="ON - Progressive caching"
COM_CONFIG_FIELD_VALUE_DEVELOPMENT="Development"
COM_CONFIG_FIELD_VALUE_DISPLAY_OFFLINE_MESSAGE_CUSTOM="Use Custom Message"
COM_CONFIG_FIELD_VALUE_DISPLAY_OFFLINE_MESSAGE_LANGUAGE="Use Site Language Default Message"
COM_CONFIG_FIELD_VALUE_ENTIRE_SITE="Entire Site"
COM_CONFIG_FIELD_VALUE_MAXIMUM="Maximum"
COM_CONFIG_FIELD_VALUE_NO_EMAIL="No Email"
COM_CONFIG_FIELD_VALUE_NONE="None"
COM_CONFIG_FIELD_VALUE_PHP_MAIL="PHP Mail"
COM_CONFIG_FIELD_VALUE_SENDMAIL="Sendmail"
COM_CONFIG_FIELD_VALUE_SIMPLE="Simple"
COM_CONFIG_FIELD_VALUE_SITE_EMAIL="Site Email"
COM_CONFIG_FIELD_VALUE_SMTP="SMTP"
COM_CONFIG_FIELD_VALUE_SSL="SSL/TLS"
COM_CONFIG_FIELD_VALUE_SYSTEM_DEFAULT="System Default"
COM_CONFIG_FIELD_VALUE_TLS="STARTTLS"
COM_CONFIG_FTP_DETAILS="FTP Login Details"
COM_CONFIG_FTP_DETAILS_TIP="For updating your configuration.php file, Joomla will most likely need your FTP account details. Please enter them in the form fields below."
COM_CONFIG_FTP_SETTINGS="FTP Settings"
COM_CONFIG_GLOBAL_CONFIGURATION="Global Configuration"
COM_CONFIG_HELPREFRESH_SUCCESS="The Help Sites list has been refreshed."
COM_CONFIG_LOCATION_SETTINGS="Location Settings"
COM_CONFIG_MAIL_SETTINGS="Mail Settings"
COM_CONFIG_METADATA_SETTINGS="Metadata Settings"
COM_CONFIG_PERMISSION_SETTINGS="Permission Settings"
COM_CONFIG_PERMISSIONS="Permissions"
COM_CONFIG_PROXY_SETTINGS="Proxy Settings"
COM_CONFIG_SAVE_SUCCESS="Configuration saved."
COM_CONFIG_SENDMAIL_ACTION_BUTTON="Send Test Mail"
COM_CONFIG_SENDMAIL_BODY="This is a test mail sent using "_QQ_"%s"_QQ_". Your email settings are correct!"
COM_CONFIG_SENDMAIL_ERROR="Test mail could not be sent."
COM_CONFIG_SENDMAIL_METHOD_MAIL="PHP Mail"
COM_CONFIG_SENDMAIL_METHOD_SENDMAIL="Sendmail"
COM_CONFIG_SENDMAIL_METHOD_SMTP="SMTP"
COM_CONFIG_SENDMAIL_SUBJECT="Test mail from %s"
COM_CONFIG_SENDMAIL_SUCCESS="The email was sent to <strong>%s</strong> using <strong>%s</strong>. You should check that you've received the test email."
COM_CONFIG_SENDMAIL_SUCCESS_FALLBACK="The email was sent to <strong>%s</strong> but using <strong>%s</strong> as fallback. You should check that you've received the test email."
COM_CONFIG_SEO_SETTINGS="SEO Settings"
COM_CONFIG_SERVER="Server"
COM_CONFIG_SERVER_SETTINGS="Server Settings"
COM_CONFIG_SESSION_SETTINGS="Session Settings"
COM_CONFIG_SITE_SETTINGS="Site Settings"
COM_CONFIG_SYSTEM="System"
COM_CONFIG_SYSTEM_SETTINGS="System Settings"
COM_CONFIG_TEXT_FILTER_SETTINGS="Text Filter Settings"
COM_CONFIG_TEXT_FILTERS="Text Filters"
COM_CONFIG_TEXT_FILTERS_DESC="These text filter settings will be applied to all text editor fields in the selected groups.<br />These filtering options give more control over the HTML your content providers submit. You can be as strict or as liberal as you require to suit your site's needs. The filtering is opt-in and the default settings provide good protection against markup commonly associated with website attacks."
COM_CONFIG_TEXT_FILTERS_NOTE="WARNING: You have configured a parent group with the setting 'No Filtering' - this setting can't be overridden in child groups and any other configured filter will not be applied."
COM_CONFIG_XML_DESCRIPTION="Configuration Manager"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_CONFIG="If you change the setting, it will apply to this and all child groups, components and content. Note that:<br /><em><strong>Inherited</strong></em> means that the permissions from the parent group will be used.<br /><em><strong>Denied</strong></em> means that no matter what the parent group's setting is, the group being edited can't take this action.<br /><em><strong>Allowed</strong></em> means that the group being edited will be able to take this action (but if this is in conflict with the parent group it will have no impact; a conflict will be indicated by <em><strong>Not Allowed (Locked)</strong></em> under Calculated Settings).<br /><em><strong>Not Set</strong></em> is used only for the Public group in global configuration. The Public group is the parent of all other groups. If a permission is not set, it is treated as deny but can be changed for child groups, components, categories and items."
language/en-GB/en-GB.mod_quickicon.sys.ini000060400000000622152453623440014254 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_QUICKICON="Quick Icons"
MOD_QUICKICON_XML_DESCRIPTION="This module shows Quick Icons that are visible on the Control Panel (administrator area home page)"
MOD_QUICKICON_LAYOUT_DEFAULT="Default"

language/en-GB/en-GB.plg_editors-xtd_readmore.ini000060400000001102152453623440015573 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS-XTD_READMORE="Button - Readmore"
PLG_READMORE_ALREADY_EXISTS="There is already a Read more ... link that has been inserted. Only one link is permitted. Use {pagebreak} to split the page up further."
PLG_READMORE_BUTTON_READMORE="Read More"
PLG_READMORE_XML_DESCRIPTION="Enables a button which allows you to insert the <em>Read more ...</em> link into an Article."language/en-GB/en-GB.com_actionlogs.sys.ini000060400000000700152453623440014425 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_ACTIONLOGS="User Actions Log"
COM_ACTIONLOGS_VIEW_DEFAULT_DESC="Shows a list of user actions."
COM_ACTIONLOGS_VIEW_DEFAULT_TITLE="User Action Log"
COM_ACTIONLOGS_XML_DESCRIPTION="Displays a log of actions performed by users on your website."language/en-GB/en-GB.plg_finder_tags.ini000060400000000615152453623440013744 0ustar00; Joomla! Project
; (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8


PLG_FINDER_QUERY_FILTER_BRANCH_P_TAG="Tags"
PLG_FINDER_QUERY_FILTER_BRANCH_S_TAG="Tag"
PLG_FINDER_TAGS="Smart Search - Tags"
PLG_FINDER_TAGS_XML_DESCRIPTION="This plugin indexes Joomla! Tags."
language/en-GB/en-GB.plg_content_contact.ini000060400000002005152453623440014637 0ustar00; Joomla! Project
; (C) 2014 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CONTENT_CONTACT="Content - Contact"
PLG_CONTENT_CONTACT_XML_DESCRIPTION="Provides a link between the content author and the contact item that can be used for an Author Profile."
PLG_CONTENT_CONTACT_PARAM_URL_LABEL="Redirection"
PLG_CONTENT_CONTACT_PARAM_URL_DESCRIPTION="You can link the author name to:<ul><li>Associated contact page.<li>Webpage specified in the associated contact profile.<li>Email specified in the associated contact profile.</ul>"
PLG_CONTENT_CONTACT_PARAM_URL_URL="Internal contact page"
PLG_CONTENT_CONTACT_PARAM_URL_WEBPAGE="Webpage from contact"
PLG_CONTENT_CONTACT_PARAM_URL_EMAIL="Email from contact"
PLG_CONTENT_CONTACT_PARAM_ALIAS_LABEL="Apply link also to alias name"
PLG_CONTENT_CONTACT_PARAM_ALIAS_DESCRIPTION="Link to the real user data even if an author alias is set in article options."
language/en-GB/en-GB.plg_editors_jce.sys.ini000060400000000471152453623440014566 0ustar00; JCE Project
; Copyright (C) 2006 - 2013 Ryan Demmer. All rights reserved
; GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html

; Note : All ini files need to be saved as UTF-8
PLG_EDITORS_JCE			="Editor - JCE"
WF_EDITOR_PLUGIN_TITLE	="Editor - JCE"
WF_EDITOR_PLUGIN_DESC	="JCE Editor Plugin"
language/en-GB/en-GB.com_jce.ini000060400000327015152453623440012222 0ustar00; JCE Project
; Copyright (C) 2006 - 2020 Ryan Demmer. All rights reserved
; GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
; Note : All ini files need to be saved as UTF-8

;# Description
COM_JCE="JCE Editor"
JCE="JCE Editor"
COM_JCE_XML_DESCRIPTION="<p>JCE is a WYSIWYG Editor Extension for Joomla.</p><p>JCE would not exist without these great projects:<br /><ul><li><a href='http://www.joomla.org' target='_blank'>Joomla!</a></li><li><a href='https://tinymce.com' target='_blank'>TinyMCE</a></li><li><a href='https://jquery.com' target='_blank'>JQuery</a></li><li><a href='https://getuikit.com/' target='_blank'>UIKit</a></li><li>Font Icons by <a href='https://icomoon.io/'>IcoMoon.</a></li><li>Fugue Icons Copyright © <a href='http://p.yusukekamiyamane.com/'>Yusuke Kamiyamane.</a> All rights reserved.</li></ul></p><p>JCE is dedicated to my father.</p><p>For a full changelog see <a target='_blank' href='https://www.joomlacontenteditor.net/support/changelog/editor'>https://www.joomlacontenteditor.net/support/changelog/editor</a></p>"

WF_ADMIN_VERSION="Version"
WF_EDITOR_TITLE="JCE Editor"

COM_JCE_CONFIGURATION="Preferences"

;#################### Sub-menu & View names ##############################
WF_ADMINISTRATION="JCE Administration"
WF_CPANEL="Control Panel"
WF_CONFIGURATION="Editor Global Configuration"
WF_CONFIG="Editor Global Configuration"
WF_PROFILES="Editor Profiles"
WF_MEDIABOX="JCE MediaBox Parameters"
WF_HELP="Help"

;#################### Tables Install / Restore Errors ####################
WF_INSTALL_PROFILES_NOFILE_ERROR="Profile XML file not found"
WF_INSTALL_PROFILES_ERROR="Profiles import failed"
WF_INSTALL_PLUGINS_NOFILE_ERROR="Plugins XML file not found"
WF_INSTALL_PLUGINS_ERROR="Plugins import failed"

;#################### CPanel #############################################
WF_CPANEL_TITLE="Control Panel"
WF_CPANEL_LICENCE="Licence"
WF_CPANEL_LICENCE_DESC="The Licence JCE is released under"
WF_CPANEL_VERSION="Version"
WF_CPANEL_VERSION_DESC="The Editor version currently installed"
WF_CPANEL_UPDATE="Updates"
WF_CPANEL_UPDATE_CHECK="Check for Updates"
WF_CPANEL_FEED="News Feed"
WF_CPANEL_FEED_DESC="Show JCE Latest News Feed"
WF_CPANEL_FEED_NONE="No News Feed Available"
WF_CPANEL_FEED_LIMIT="News Feed Limit"
WF_CPANEL_FEED_LIMIT_DESC="Number of News Feed items to show	"
WF_CPANEL_FEED_DISABLED="News Feed Disabled"
WF_CPANEL_FEED_ENABLE="Enable News Feed"
WF_CPANEL_FEED_LOAD="Loading Feed..."
WF_CPANEL_HELP="JCE Control Panel Help"
WF_CPANEL_HELP_ABOUT="About the JCE Control Panel"
WF_CPANEL_HELP_PREFERENCES="Options"
WF_CPANEL_HELP_UPDATES="Updates"
WF_CPANEL_SUPPORT="Support"
WF_CPANEL_SUPPORT_DESC="Documentation, FAQ, Tutorials and Forum"
WF_CPANEL_BROWSER="JCE File Browser"

WF_CPANEL_BROWSER_WIDTH="File Browser Width"
WF_CPANEL_BROWSER_WIDTH_DESC="Width of the Control Panel File Browser dialog"
WF_CPANEL_BROWSER_HEIGHT="File Browser Height"

WF_CPANEL_REPLACE_MEDIAMANAGER_LABEL="JCE File Browser in Image Fields"
WF_CPANEL_REPLACE_MEDIAMANAGER_DESCRIPTION="Replace the Joomla Media Manager in Joomla Image fields with the JCE File Browser"

;#################### Preferences #####################################
WF_PREFERENCES_UPDATES="Update Options"
WF_PREFERENCES_STANDARD="General Options"
WF_PREFERENCES_SAVED="Options Saved"
WF_HELP_CUSTOM="Custom Help Site"
WF_HELP_CUSTOM_DESC="Use a custom site for Help Documentation instead of the JCE site."
WF_HELP_URL="Help URL"
WF_HELP_URL_DESC="Custom URL to a Help site (no trailing slash)"
WF_HELP_URL_METHOD="Help URL Method"
WF_HELP_URL_METHOD_DESC="The Help URL Method to use for finding a help file. The options are Key Reference - using the Joomla Article Manager Key Reference system - or SEF - which loads a help article using a SEF url, eg: https://www.joomlacontenteditor.net/support/documentation/editor/about"
WF_HELP_URL_KEYREFERENCE="Key Reference"
WF_HELP_URL_SEF="SEF URL"
WF_HELP_PATTERN="Help URL Pattern"
WF_HELP_PATTERN_DESC="A replacement pattern to use for creating a Help URL if the SEF URL option is selected. The pattern should include a series of numbered variables separated by a character, eg: /$1/$2/$3"
WF_PREFERENCES="Options"
WF_PREFERENCES_TITLE="Administration Options"
WF_PREFERENCES_PERMISSIONS="Permissions"

WF_UPDATES_KEY="Update Key"
WF_UPDATES_KEY_DESC="Subscription Key required for JCE Pro updates. Available in Your Account at https://www.joomlacontenteditor.net/your-account"

WF_ADMIN_INLINE_HELP="Inline Admin Help"
WF_ADMIN_INLINE_HELP_DESC="Show help descriptions for each parameter as inline boxes below the parameter. Alternatively, when set to No, the parameter descriptions will be shown in a tooltip when hovering over the parameter label."

;#################### Global Configuration ############################
WF_CONFIG_TITLE="JCE Editor Global Configuration"
WF_CONFIG_DESC="Edit the JCE Editor Global Configuration"
WF_CONFIG_CLEANUP="Cleanup & Output"
WF_CONFIG_FORMAT="Formatting & Display"
WF_CONFIG_ADVANCED="Advanced"
WF_CONFIG_OTHER="Miscellaneous"
WF_CONFIG_HELP="JCE Global Configuration Help"
WF_CONFIG_HELP_ABOUT="JCE Global Configuration"
WF_CONFIG_HELP_CLEANUP="Cleanup & Output"
WF_CONFIG_HELP_FORMAT="Formatting and Display"
WF_CONFIG_HELP_ADVANCED="Advanced Options"
WF_CONFIG_HELP_COMPRESSION="Compression Options"
WF_CONFIG_COMPRESSION="Compression Options"
WF_CONFIG_SAVED="Configuration Saved"

;#################### Profiles #######################################
WF_PROFILES_TITLE="JCE Editor Profiles"
WF_PROFILES_DESC="Create / Edit profiles for the editor"
WF_PROFILES_LIST="List"
WF_PROFILES_NAME="Name"
WF_PROFILES_NAME_DESC="Name of the Profile"
WF_PROFILES_STATE="State"
WF_PROFILES_DESCRIPTION="Description"
WF_PROFILES_DESCRIPTION_DESC="Short description of the Profile"
WF_PROFILES_ORDERING="Ordering"
WF_PROFILES_ORDERING_DESC="Ordering of the Profile"
WF_PROFILES_EDIT="Edit Profile"
WF_PROFILES_SETUP="Setup"
WF_PROFILES_SETUP_DESC="Set name, description, ordering and restriction settings for the profile"
WF_PROFILES_FEATURES="Features & Layout"
WF_PROFILES_FEATURES_DESC="Set available buttons and commands for the profile"
WF_PROFILES_FEATURES_ADDITIONAL="Additional Features"
WF_PROFILES_FEATURES_LAYOUT="Editor Layout"
WF_PROFILES_ASSIGNMENT="Assignment"
WF_PROFILES_DETAILS="Details"
WF_PROFILES_COMPONENTS="Components"
WF_PROFILES_COMPONENTS_DESC="Assign the Profile to the selected components. This profile will only be available when using one of the selected components. Check 'All Components' for normal operation."
WF_PROFILES_COMPONENTS_ALL="All Components"
WF_PROFILES_COMPONENTS_SELECT="Select from list"
WF_PROFILES_AREA="Area"
WF_PROFILES_AREA_FRONTEND="Front-end"
WF_PROFILES_AREA_BACKEND="Back-end"
WF_PROFILES_AREA_DESC="Assign the profile to this Joomla! Area"
WF_PROFILES_TOGGLE_ALL="Toggle All"
WF_PROFILES_REMOVE_USERS="Remove Users"
WF_PROFILES_EXPORT="Export"
WF_PROFILES_IMPORT="Import Profile"
WF_PROFILES_IMPORT_IMPORT="Import"
WF_PROFILES_IMPORT_BROWSE_ERROR="Incorrect file type : File must be an XML file"
WF_PROFILES_IMPORT_NOFILE="Import failed : No file to import from"
WF_PROFILES_SAVED_CHANGES="Changes saved to profile '%s'"
WF_PROFILES_SAVED="Profile '%s' saved"
WF_PROFILES_GROUPS="User Group"
WF_PROFILES_GROUPS_DESC="Assign the Profile to the selected User Groups"
WF_PROFILES_USERS="Users"
WF_PROFILES_USERS_DESC="Assign the Profile to the selected Users"
WF_PROFILES_USERS_ADD="Add Users"
WF_PROFILES_FEATURES_LAYOUT_AVAILABLE="Available Buttons & Toolbars"
WF_PROFILES_FEATURES_LAYOUT_AVAILABLE_DESC="Available buttons not yet assigned to the Editor Layout<ul><li>These buttons will not appear in the editor layout when editing.</li><li>Buttons or rows can be dragged into the Current Editor Layout to make them available.</li></ul>"
WF_PROFILES_FEATURES_LAYOUT_EDITOR="Current Editor Layout"
WF_PROFILES_FEATURES_LAYOUT_EDITOR_DESC="Buttons assigned to the Editor Layout<ul><li>Drag & Drop buttons or rows to re-order.</li><li>Buttons or rows can be removed from the layout by dragging them into the Available Buttons layout.</li></ul>"
WF_PROFILES_EDITOR_SETUP="Cleanup & Output"
WF_PROFILES_EDITOR_FILESYSTEM="Filesystem"
WF_PROFILES_EDITOR_PARAMETERS="Editor Parameters"
WF_PROFILES_EDITOR="Editor Parameters"
WF_PROFILES_EDITOR_PARAMETERS_DESC="Set editor parameters for the profile"
WF_PROFILES_EDITOR_TYPOGRAPHY="Typography"
WF_PROFILES_PLUGIN_PARAMETERS="Plugin Parameters"
WF_PROFILES_PLUGINS="Plugin Parameters"
WF_PROFILES_EDITOR_ADVANCED="Advanced"
WF_PROFILES_PLUGIN_PARAMETERS_DESC="Set available parameters for each plugin"
WF_PROFILES_PLUGINS_STANDARD="Standard Parameters"
WF_PROFILES_PLUGINS_STANDARD_DESC="Standard Parameters for the plugin"
WF_PROFILES_PLUGINS_DEFAULTS="Default Values"
WF_PROFILES_PLUGINS_DEFAULTS_DESC="Set default values for plugin options"
WF_PROFILES_PLUGINS_ACCESS="Permissions"
WF_PROFILES_PLUGINS_ACCESS_DESC="Enable or disable plugin features"
WF_PROFILES_PLUGINS_ADVANCED="Advanced Parameters"
WF_PROFILES_PLUGINS_ADVANCED_DESC="Set advanced plugin parameters"
WF_PROFILES_NO_PLUGINS="No Plugins in Editor Layout"
WF_PROFILES_UPLOAD_FAILED="Profile file upload failed"
WF_PROFILES_UPLOAD_NOFILE="Profile upload file not found"
WF_PROFILES_SELECT_ERROR="No Profile selected"
WF_PROFILES_IMPORT_ERROR="Profile import failed"
WF_PROFILES_IMPORT_SUCCESS="%s Profile(s) imported successfully"
WF_PROFILES_DELETED="%s Profile(s) deleted successfully"
WF_PROFILES_COPIED="%s Profile(s) copied successfully"
WF_PROFILES_COPY_OF="Copy of %s"
WF_PROFILES_COPY="Copy"
WF_PROFILES_HELP="JCE Profiles Help"
WF_PROFILES_HELP_ABOUT="About Profiles"
WF_PROFILES_HELP_MANAGE="Managing Profiles"
WF_PROFILES_HELP_MANAGE_COPY="Copying Profiles"
WF_PROFILES_HELP_MANAGE_DELETE="Deleting Profiles"
WF_PROFILES_HELP_MANAGE_EXPORT="Exporting Profiles"
WF_PROFILES_HELP_MANAGE_IMPORT="Importing Profiles"
WF_PROFILES_HELP_MANAGE_ORDERING="Ordering Profiles"
WF_PROFILES_HELP_MANAGE_ENABLE="Enable and Disable Profiles"
WF_PROFILES_HELP_EDIT="Creating and Editing Profiles"
WF_PROFILES_HELP_EDIT_SETUP="Setup"
WF_PROFILES_HELP_EDIT_FEATURES="Features & Layout"
WF_PROFILES_HELP_EDIT_EDITOR="Editor Parameters"
WF_PROFILES_HELP_EDIT_PLUGINS="Plugin Parameters"
WF_PROFILES_HELP_EDIT_WIDGETS="Parameter Widgets"
WF_PROFILES_SAMPLE_DEFAULT="Default Profile for all users with edit access"
WF_PROFILES_SAMPLE_FRONT="Sample Front-end Profile for Authors, Editors, Publishers"
WF_PROFILES_CHECKED_OUT="The Profile %s is being edited"
WF_PROFILES_VIEW_SELECT="Please select a %s to %s"
WF_PROFILES_DEFAULT_DESC="Default Profile for all users"
WF_PROFILES_FRONTEND_DESC="Sample Front-end Profile"
WF_PROFILES_ENABLED="Enabled"
WF_PROFILES_ENABLED_DESC="Profile State"
WF_PROFILES_PLUGINS_BUTTONS="Buttons"
WF_PROFILES_PLUGINS_BUTTONS_DESC="Select plugin buttons"
WF_PROFILES_DEVICE_DESKTOP="Desktop"
WF_PROFILES_DEVICE_TABLET="Tablet"
WF_PROFILES_DEVICE_PHONE="Phone"
WF_PROFILES_DELETE="Delete"
WF_PROFILES_MOVE_DOWN="Move Down"
WF_PROFILES_MOVE_UP="Move Up"
WF_PROFILES_DEVICE="Device"
WF_PROFILES_DEVICE_DESC="User device, eg: Desktop, Tablet or Phone"
WF_PROFILES_CUSTOM="Custom Query"
WF_PROFILES_CUSTOM_DESC="Assign the profile based on query matches (e.g., view=article, id=4)"
WF_PROFILES_CUSTOM_KEY="Key"
WF_PROFILES_CUSTOM_VALUE="Value"

COM_JCE_N_ITEMS_DELETED="%s profiles deleted."
COM_JCE_N_ITEMS_EXPORTED="%s profiles imported."
COM_JCE_N_ITEMS_COPIED="%s profiles copied."
COM_JCE_N_ITEMS_PUBLISHED="%s profiles published."
COM_JCE_N_ITEMS_UNPUBLISHED="%s profiles unpublished."
COM_JCE_N_ITEMS_CHECKED_IN="%s items checked in."

WF_TOOLBAR_IMPORT="Import"

WF_PROFILES_AREA_FILTER_SELECT="- Select Area -"
WF_PROFILES_DEVICE_FILTER_SELECT="-- Select Device -"
WF_PROFILES_COMPONENTS_FILTER_SELECT="- Select Component -"
WF_PROFILES_GROUPS_FILTER_SELECT="- Select User Group -"

;################### Users ########################
WF_USERS_NAME="Name"
WF_USERS_USERNAME="Username"
WF_USERS_GROUP="Group"
WF_USERS_GROUP_SELECT="Select Group"

;#################### Plugins Import Errors ###########################
WF_PLUGINS_IMPORT_ERROR="Unable to import plugins data"
WF_PLUGINS_IMPORT_SUCCESS="Plugins table data imported successfully"

;#################### MediaBox #######################################
WF_MEDIABOX_TITLE="JCE MediaBox"
WF_MEDIABOX_CONFIGURATION="JCE MediaBox Configuration"
WF_MEDIABOX_DESC="Edit JCE MediaBox parameters"
WF_MEDIABOX_HELP="JCE MediaBox Configuration Help"
WF_MEDIABOX_HELP_CONFIG="Configuration"
WF_MEDIABOX_PARAMETERS="MediaBox Parameters"
WF_MEDIABOX_SAVED="MediaBox Parameters Saved."

;#################### Database Delete / Restore ######################
WF_DB_CREATE_RESTORE="[Create / Restore]"
WF_DB_PROFILES_ERROR="The Profiles database table does not exist or is empty"

;#################### Tools / Elements ################################
WF_SERVER_UPLOAD_SIZE="Your server's maximum upload size"
WF_TOOLS_EDITABLESELECT_LABEL="Edit value..."
WF_COLORPICKER_PICKER="Picker"
WF_COLORPICKER_COLORPICKER="Colour Picker"
WF_COLORPICKER_PALETTE="Web"
WF_COLORPICKER_NAMED="Named"
WF_COLORPICKER_TEMPLATE="Template"
WF_COLORPICKER_CUSTOM="Custom"
WF_COLORPICKER_COLOR="Colour"
WF_COLORPICKER_APPLY="Apply"
WF_COLORPICKER_NAME="Name"
WF_EXTENSION_MAPPER="Extension Mapper"
WF_EXTENSION_MAPPER_TYPE_NEW="Add new type..."
WF_EXTENSION_MAPPER_GROUP_NEW="Add new group..."

;#################### Parameters ################################
NO_PARAMETERS="There are no parameters for this item"

;#################### Parameters - Config Setup ################################
WF_PARAM_NONE="There are no parameters for this item"
WF_PARAM_EDITOR_WIDTH="Editor Width"
WF_PARAM_EDITOR_WIDTH_DESC="Width of the Editor window in % or px. If %, add % symbol, eg: 80% Leave blank to use the original width of the textarea."
WF_PARAM_EDITOR_HEIGHT="Editor Height"
WF_PARAM_EDITOR_HEIGHT_DESC="Height of the Editor window in % or px. If %, add % symbol, eg: 80% Leave blank to use the original height of the textarea."
WF_PARAM_EDITOR_STATE="Editor State"
WF_PARAM_EDITOR_STATE_DESC="Default Editor State - On/Off"
WF_PARAM_EDITOR_TOGGLE_LABEL="Editor Toggle Label"
WF_PARAM_EDITOR_TOGGLE_LABEL_DESC="Text for the Editor Toggle link, eg: [Toggle Editor]"
WF_PARAM_EDITOR_TOGGLE="Editor Toggle"
WF_PARAM_EDITOR_TOGGLE_DESC="Allow Editor Toggling - switching the editor on and off"
WF_PARAM_EDITOR_GLOBAL_CSS="Editor Styles"
WF_PARAM_EDITOR_PROFILE_CSS="Editor Styles"
WF_PARAM_EDITOR_GLOBAL_CSS_DESC="CSS file to use for editor content styling and Styles list options<ul><li>Template CSS file - Use the default css file (template.css or template_css.css) of your Joomla! template</li><li>Custom CSS File - Use a custom CSS file specified in the <strong>Custom CSS File</strong> field</li><li>Default - Use default JCE Editor styles</li></ul>"
WF_PARAM_EDITOR_PROFILE_CSS_DESC="Specify how to integrate the Custom CSS files and Custom Styles with the Editor Styles set in the Editor Global Configuration.<ul><li>Add - Add the <strong>Custom CSS Files</strong> to the Editor Styles. Add the <strong>Custom Styles</strong> to the Styles list.</li><li>Overwrite - Replace the Editor Styles with the <strong>Custom CSS Files</strong> and <strong>Custom Styles</strong>.</li><li>Inherit - Use the Editor Styles set in the Editor Global Configuration only (Default)</li></ul>"
WF_PARAM_CSS_TEMPLATE="Template CSS File"
WF_PARAM_CSS_CUSTOM="Custom CSS Files"
WF_PARAM_CSS_CUSTOM_DESC="Use a custom CSS file for styling the editor content and as a source for classes in the Styles list if <strong>Editor Styles</strong> is set to <strong>Custom CSS Files</strong><br />Enter the relative url of the replacement css file.<br />The $template variable will be replaced by your active template name.<br />separate multiple stylesheets with a comma, eg: templates/$template/css/sheet1.css,<br />templates/$template/css/sheet2.css<br />Clear your browser cache after changing the Editor Styles setting."
WF_PARAM_CSS_INHERIT="Inherit"
WF_PARAM_CSS_ADD="Add"
WF_PARAM_CSS_OVERWRITE="Overwrite"
WF_PARAM_TOOLBAR_LOCATION="Toolbar Position"
WF_PARAM_TOOLBAR_LOCATION_DESC="Position of the Editor toolbar"
WF_PARAM_TOOLBAR_ALIGN="Toolbar Alignment"
WF_PARAM_TOOLBAR_ALIGN_DESC="Alignment of the Editor toolbar"
WF_PARAM_RELATIVE="Relative URLs"
WF_PARAM_RELATIVE_DESC="Use relative URLS for all images, links etc. in content items. Recommended."
WF_PARAM_ROOT_BLOCK="Container Element & Enter Key"
WF_PARAM_ROOT_BLOCK_DESC="Select Container Element and Enter Key behaviour :<ul><li><strong>Paragraph Container & Paragraph on Enter (Default)</strong><br />All Text and non-block elements will be wrapped in a Paragraph, and pressing the Enter key will create a new Paragraph. SHIFT+Enter creates a linebreak.</li><li><strong>Div Container & Div on Enter</strong><br />All Text and non-block elements will be wrapped in a DIV, and pressing the Enter key will create a new DIV. SHIFT+Enter creates a linebreak.</li><li><strong>No Container & Paragraph on Enter</strong><br />Text and non-block elements will not be wrapped. Pressing the Enter key will create a new Paragraph. SHIFT+Enter creates a linebreak.</li><li><strong>No Container & Linebreak on Enter</strong><br />Text and non-block elements will not be wrapped. Pressing the Enter key will create a linebreak. SHIFT+Enter creates a paragraph.</li></ul>"

WF_PARAM_EDITOR_CUSTOM_CSS="Custom CSS"
WF_PARAM_EDITOR_CUSTOM_CSS_DESC="Custom CSS rules to add to the editor content area. This can be used to override styles from your site template  eg: p { font-size:14px; }"

WF_OPTION_DIV="Div : Div"
WF_OPTION_PARAGRAPH="Paragraph : Paragraph"
WF_OPTION_DIV_LINEBREAK="Div : Linebreak"
WF_OPTION_PARAGRAPH_LINEBREAK="Paragraph : Linebreak"
WF_OPTION_PARAGRAPH_MIXED="None : Paragraph"
WF_OPTION_LINEBREAK="None : Linebreak"

WF_PARAM_EDITOR_PROFILE_ROOT_BLOCK_DESC="Select Container Element and Enter Key behaviour :<ul><li><strong>Paragraph Container & Paragraph on Enter</strong><br />All Text and non-block elements will be wrapped in a Paragraph, and pressing the Enter key will create a new Paragraph. SHIFT+Enter creates a linebreak.</li><li><strong>Div Container & Div on Enter</strong><br />All Text and non-block elements will be wrapped in a DIV, and pressing the Enter key will create a new DIV. SHIFT+Enter creates a linebreak.</li><li><strong>No Container & Paragraph on Enter</strong><br />Text and non-block elements will not be wrapped. Pressing the Enter key will create a new Paragraph. SHIFT+Enter creates a linebreak.</li><li><strong>No Container & Linebreak on Enter</strong><br />Text and non-block elements will not be wrapped. Pressing the Enter key will create a linebreak. SHIFT+Enter creates a paragraph.</li><li><strong>Inherit (Default)</strong><br />Use Global Configuration settings.</ul>"
WF_PARAM_EDITOR_TOOLBAR_THEME="Toolbar Theme"
WF_PARAM_EDITOR_TOOLBAR_THEME_DESC="Theme for the editor toolbar"
WF_PARAM_EDITOR_SKIN_CLASSIC="Classic"
WF_PARAM_EDITOR_SKIN_CLASSIC_TOUCH="Classic Touch"
WF_PARAM_EDITOR_SKIN_OFFICE_BLUE="Office Blue"
WF_PARAM_EDITOR_SKIN_OFFICE_SILVER="Office Silver"
WF_PARAM_EDITOR_SKIN_OFFICE_BLACK="Office Black"
WF_PARAM_EDITOR_SKIN_RETINA_TOUCH="Retina Touch"
WF_PARAM_EDITOR_SKIN_RETINA_DARK="Retina Dark"
WF_PARAM_EDITOR_SKIN_MODERN="Modern"
WF_PARAM_EDITOR_SKIN_RETINA="Retina"
WF_PARAM_COMPRESS_JAVASCRIPT="Compress Javascript"
WF_PARAM_COMPRESS_JAVASCRIPT_DESC="Combine and compress all editor javascript files to speed up loading."
WF_PARAM_COMPRESS_CSS="Compress CSS"
WF_PARAM_COMPRESS_CSS_DESC="Combine and compress editor css files to speed up loading."
WF_PARAM_COMPRESS_GZIP="Compress with Gzip"
WF_PARAM_COMPRESS_GZIP_DESC="Gzip compressed files to further reduce their size. Disabled by default as this may not work on all servers."
WF_PARAM_COMPRESS_CACHE_VALIDATION="Enforce Cache Validation"
WF_PARAM_COMPRESS_CACHE_VALIDATION_DESC="Dynamically generated content - like these compressed files - are not automatically cached by the browser. Enforced Cache Validation creates a mechanism by which the browser can identify if the content has changed, and therefore whether it should be cached, or whether an existing cached version should be used."

WF_PARAM_NAMED="Named"
WF_PARAM_NUMERIC="Numeric"
WF_PARAM_PARAGRAPHS="Paragraphs (p)"
WF_PARAM_PARAGRAPH="Paragraph"
WF_PARAM_LINEBREAK="Linebreak"
WF_PARAM_DIV="Div"
WF_PARAM_CLASSIC="Classic"
WF_PARAM_USE_COOKIES="Use Cookies"
WF_PARAM_USE_COOKIES_DESC="Allow cookies for storing function states eg: editor on / off and plugins current directory. Default is Yes."
WF_PARAM_EDITOR_TOOLBAR_ALIGN="Toolbar Alignment"
WF_PARAM_EDITOR_TOOLBAR_ALIGN_DESC="Alignment of the toolbar buttons"
WF_PARAM_EDITOR_TOOLBAR_LOCATION="Toolbar Location"
WF_PARAM_EDITOR_TOOLBAR_LOCATION_DESC="Location of the Editor Toolbar"
WF_PARAM_EDITOR_STATUSBAR_LOCATION="Statusbar Location"
WF_PARAM_EDITOR_STATUSBAR_LOCATION_DESC="Location of the Editor Statusbar"
WF_PARAM_EDITOR_PATH="Show Editor Path"
WF_PARAM_EDITOR_PATH_DESC="Show the Editor Element Path"
WF_PARAM_EDITOR_RESIZING="Allow Editor Resizing"
WF_PARAM_EDITOR_RESIZING_DESC="Allow the Editor to be resized by dragging the editor window"
WF_PARAM_EDITOR_RESIZE_HORIZONTAL="Allow Horizontal Editor Resizing"
WF_PARAM_EDITOR_RESIZE_HORIZONTAL_DESC="Allow the Editor to be resized horizontally by dragging the editor window"
WF_PARAM_EDITOR_RESIZE_COOKIE="Store Editor Size"
WF_PARAM_EDITOR_RESIZE_COOKIE_DESC="Store the resized Editor size using a cookie"
WF_PARAM_EDITOR_BODY_CLASS="Editor Class"
WF_PARAM_EDITOR_BODY_CLASS_DESC="A classname, or list of classnames (separated by a space) to be applied to the editor content area. eg: content-area"

WF_PARAM_EDITOR_WORDCOUNT="Word Count"
WF_PARAM_EDITOR_WORDCOUNT_DESC="Show a Word Count in the editor Statusbar"

WF_PARAM_EDITOR_ACTIVE_TAB="Active Tab"
WF_PARAM_EDITOR_ACTIVE_TAB_DESC="Select the default editor tab to display"
WF_PARAM_EDITOR_ACTIVE_TAB_WYSIWYG="Editor"
WF_PARAM_EDITOR_ACTIVE_TAB_CODE="Code"
WF_PARAM_EDITOR_ACTIVE_TAB_PREVIEW="Preview"

WF_PARAM_EDITOR_CONVERT_URLS="URL Conversion"
WF_PARAM_EDITOR_CONVERT_URLS_DESC="Select the method used to convert site specific URLs in content.<ul><li>Relative - The site's protocol and domain are removed from the URL</li><li>Absolute: The site's protocol and domain are added to the URL</li><li>None: The URL is left as it is</li></ul>"

WF_PARAM_EDITOR_XTD_BUTTONS="Show Editor-xtd Buttons"
WF_PARAM_EDITOR_XTD_BUTTONS_DESC="Show the Joomla Editor-xtd plugin buttons below the editor."

;#################### Parameters - Config Cleanup ################################
WF_PARAM_CLEANUP="Validate HTML"
WF_PARAM_CLEANUP_DESC="Set to Yes (recommended) to format and cleanup content based on the Doctype selected below."
WF_PARAM_SANITIZE_HTML="Sanitize HTML"
WF_PARAM_SANITIZE_HTML_DESC="Set to Yes (recommended) to Use DOMPurify to remove unsafe elements, attributes, and risky URLs to prevent XSS (Cross-Site Scripting) attacks. This operates independently of HTML Validation."
WF_PARAM_EDITOR_PROFILE_CLEANUP_DESC="Set to Yes (recommended) to format and cleanup content based on the Doctype selected below. If Inherit is selected the Global Configuration settings for this parameter will be used."
WF_PARAM_EDITOR_PROFILE_SANITIZE_HTML_DESC="Set to Yes (recommended) to Use DOMPurify to remove unsafe elements, attributes, and risky URLs to prevent XSS (Cross-Site Scripting) attacks. This operates independently of HTML Validation. If Inherit is selected the Global Configuration settings for this parameter will be used."
WF_PARAM_PLUGIN_MODE="Plugin Mode"
WF_PARAM_PLUGIN_MODE_DESC="If true, & and ' are not encoded when content is saved to compensate for poorly designed 3rd party Joomla! plugins."
WF_PARAM_JAVASCRIPT="Allow Javascript"
WF_PARAM_JAVASCRIPT_DESC="Allow Javascript code in Code Blocks and the Code Editor. This include javascript in &lt;script&gt; tags, event attributes and other attribute values."
WF_PARAM_CSS="Allow CSS"
WF_PARAM_CSS_DESC="Allow CSS code in &lt;style&gt; tags in Code Blocks and the Code Editor."
WF_PARAM_ELEMENTS="Extended Elements"
WF_PARAM_ELEMENTS_DESC="Extend functionality by adding in extra elements here, in the form element[attribute1&#124;attribute2]. Elements added here will be removed from the Prohibited Elements list.<br /><strong>Only applies if 'Cleanup HTML' is 'Yes'</strong>"
WF_PARAM_NO_ELEMENTS="Prohibited Elements"
WF_PARAM_NO_ELEMENTS_DESC="List of prohibited elements. For security purposes the following elements will always be removed unless an appropriate plugin or configuration setting is installed or enabled - applet, iframe, object, embed, script, style, body, bgsound, base, basefont, frame, frameset, head, html, id, ilayer, layer, link, meta, name, title, xml<br /><strong>Only applies if 'Cleanup HTML' is 'Yes'</strong>"
WF_PARAM_INVALID_ATTRIBUTES="Prohibited Attributes"
WF_PARAM_INVALID_ATTRIBUTES_DESC="List of prohibited attributes, eg: dynsrc,lowsrc. Can accept regular expression values, eg: on([a-z]+) will remove all event attributes (onclick, onmouseover etc.)<br /><strong>Only applies if 'Cleanup HTML' is 'Yes'</strong>"
WF_PARAM_INVALID_ATTRIBUTE_VALUES="Prohibited Attribute Values"
WF_PARAM_INVALID_ATTRIBUTE_VALUES_DESC="List of prohibited attribute values in the CSS Attribute Selector format, eg: img[title='test'] will remove the title attribute value from all img tags with the value 'test'.<br />Accepts the CSS 2.1 and CSS 3 Attribute Selectors - <ul><li>Attribute starts with value : tag[name^='value']<br />eg: img[src='data:image'] will remove all base64 encoded paths from img src attributes</li><li>Attribute equals value : tag[name='value']</li><li>Attribute is not equal to value : name!='value'</li><li>Attribute ends with value : tag[name$='value']<br />eg: img[src$='.jpg'] will remove all img src values that contain paths with the .jpg extension</li></ul><br /><strong>Only applies if 'Cleanup HTML' is 'Yes'</strong>"
WF_PARAM_PHP="Allow PHP"
WF_PARAM_PHP_DESC="Allow PHP code in Code Blocks and the Code Editor. Full support may require an additional front-end content or system plugin to be installed."
WF_PARAM_ENTITY_ENCODING="Entity Encoding"
WF_PARAM_ENTITY_ENCODING_DESC="Entity encoding method to be used by the editor. "
WF_PARAM_PROTECT_SHORTCODE="Protect Shortcode"
WF_PARAM_PROTECT_SHORTCODE_DESC="EXPERIMENTAL - Protect the contents of shortcode tags, eg: {tag}content{/tag} from processing by the editor"
WF_PARAM_ALLOW_CUSTOM_XML="Allow Custom XML"
WF_PARAM_ALLOW_CUSTOM_XML_DESC="Allow editing of custom XML code in Code Blocks and the Code Editor."

WF_PARAM_CODE_BLOCKS="Code Blocks"
WF_PARAM_CODE_BLOCKS_DESC_WARNING="<strong>Caution:</strong> Enabling any of these options will allow users of the editor to create content and effect changes to the site - directly or indirectly - that could present a security risk to the site and its visitors. These options should therefore only be enabled in profiles assigned to trusted users and user groups."

WF_PARAM_CODE_BLOCKS_ENABLE="Enable Code Blocks"
WF_PARAM_CODE_BLOCKS_ENABLE_DESC="Display scripts and code in visible, editable Code Blocks in the editor. If disabled, placeholders will be used to indicate the presence of scripts in content, which must then be edited in the Code Editor."

WF_PARAM_EDITOR_STYLE_RESET="High Contrast Mode"
WF_PARAM_EDITOR_STYLE_RESET_DESC="Forces a high contrast styling of editor content with left aligned, black text on a white background. Set to Auto to detect whether this is neccessary based on the contrast of the background colour and body text colour."

WF_PARAM_PAD_EMPTY_TAGS="Pad Empty Tags"
WF_PARAM_PAD_EMPTY_TAGS_DESC="By default, some empty tags (p, h1-6, pre, div, address, caption) are padded with a non-breaking space so they maintain there structure when rendered by the browser. Without the space, some browsers would not render the tags correctly unless additional css is used.<br /><br />Set this option to <strong>No</strong> to remove the non-breaking space when the editor is toggled or the content is saved."

WF_PARAM_VALIDATE_STYLES="Validate Styles"
WF_PARAM_VALIDATE_STYLES_DESC="Allow only a valid CSS syntax for the style atttribute value on all elements."

WF_PARAM_ALLOW_EVENT_ATTRIBUTES="Allow Event Attributes"
WF_PARAM_ALLOW_EVENT_ATTRIBUTES_DESC="Allow event attributes, eg: onclick, onload etc. on all elements. As event attributes are able to execute javascript code, they should only be allowed for trusted users."

;#################### Parameters - Config General ################################
WF_PARAM_CUSTOM_COLORS="Custom Colours"
WF_PARAM_CUSTOM_COLORS_DESC="A comma separated list of colours to be used by the ColourPicker, in Hex format, eg: #ff0000."
WF_PARAM_CUSTOM_CONFIG="Custom Configuration Variables"
WF_PARAM_CUSTOM_CONFIG_DESC="Specify optional values to set or override editor configuration options."
WF_PARAM_FONTS="Fonts"
WF_PARAM_FONTS_NEW="Add new font..."
WF_PARAM_FONTS_DESC="Fonts to include in the Font Famliy list.<br />Uncheck a font to remove it from the list, add a new font by clicking the 'Add new font' button. Drag to re-order fonts."
WF_PARAM_FONT_SIZES="Font Sizes"
WF_PARAM_FONT_SIZES_DESC="Comma separated list of font size values eg: 8pt,10pt,12pt,14pt,18pt,24pt,36pt"
WF_PARAM_BLOCK_FORMAT="Format Elements"
WF_PARAM_BLOCK_FORMAT_DESC="Block elements for the Format Select List.</br />Uncheck to remove the item from the list. Drag to re-order."
WF_BLOCK_FORMAT_PREVIEW_STYLES="Show Format Preview"
WF_BLOCK_FORMAT_PREVIEW_STYLES_DESC="Show a simple styled preview of each format item in the list using the site template styles."
WF_PARAM_DOCTYPE="Doctype"
WF_PARAM_DOCTYPE_DESC="Doctype to validate HTML with (if Validate HTML is set to Yes)<ul><li>HTML4 : Validate using the HTML4 Transitional specification</li><li>HTML5 : Validate using the HTML5 specification</li><li>Mixed : Validate using a combination of the HTML4 and HTML5 specification</li></ul>"
WF_PARAM_DOCTYPE_MIXED="Mixed"
WF_PARAM_EDITOR_PROFILE_DOCTYPE_DESC="Doctype to validate HTML with (if Validate HTML is set to Yes)<ul><li>HTML4 : Validate using the HTML4 Transitional specification</li><li>HTML5 : Validate using the HTML5 specification</li><li>Mixed : Validate using a combination of the HTML4 and HTML5 specification</li><li>Inherit : Use the Doctype set in the Global Configuration</li></ul>"
WF_PARAM_INLINE_UPLOAD="Inline Upload"
WF_PARAM_INLINE_UPLOAD_DESC="Allow drag & drop and placeholder uploading for this plugin in the editor content area."

;## Object Resizing ##
WF_PARAM_OBJECT_RESIZING="Object Resizing"
WF_PARAM_OBJECT_RESIZING_DESC="Allow media objects - images, video, tables - to be drag resized in the editor window"

;#################### Parameters - Config Plugins ################################
WF_PARAM_FOLDER_TREE="Folder Tree"
WF_PARAM_FOLDER_TREE_DESC="Use Folder Tree for directory navigation in 'Manager' plugins"
WF_PARAM_UPLOAD_EXISTS="Upload Conflict Action"
WF_PARAM_UPLOAD_EXISTS_DESC="Select the action for dealing with upload conflicts (where a file of the same name as the uploaded file already exists in the target folder)"
WF_PARAM_UPLOAD_EXISTS_OVERWRITE="Overwrite Existing File"
WF_PARAM_UPLOAD_EXISTS_UNIQUE="Create Unique File Name for uploaded file"
WF_PARAM_UPLOAD_SUFFIX="File Name Suffix"
WF_PARAM_UPLOAD_SUFFIX_DESC="A suffix to add to an uploaded or pasted file if the file already exists. The default value is '_copy'. Add a $ to the suffix to add a number increment, eg: _$, will yield _1, _2 etc."
WF_PARAM_UPLOAD_ADD_RANDOM="Random upload file name"
WF_PARAM_UPLOAD_ADD_RANDOM_DESC="Append a 5 character random string to the name of uploaded files for added security."
WF_PARAM_UPLOAD_REMOVE_EXIF="Remove Image EXIF data"
WF_PARAM_UPLOAD_REMOVE_EXIF_DESC="Remove image <a href='https://en.wikipedia.org/wiki/Exchangeable_image_file_format' title='EXIF'>EXIF</a> data from uploaded JPEG and PNG files"
WF_PARAM_UPLOAD_QUALITY="Upload Quality (%)"
WF_PARAM_UPLOAD_QUALITY_DESC="Default JPEG quality for uploaded images"
WF_PARAM_WEBSAFE_MODE="Websafe File Names"
WF_PARAM_WEBSAFE_MODE_DESC="Format to use when creating websafe file and folder names. UTF-8 will allow full UTF-8 characters and A-Za-z0-9._-~ in the name, ASCII will convert some UTF-8 Latin characters into ASCII equivalents, eg: ë -> e, õ -> o etc. and will only allow A-Za-z0-9._-~ characters in the name."
WF_PARAM_WEBSAFE_ALLOW_SPACES="Allow spaces in file/folder names"
WF_PARAM_WEBSAFE_ALLOW_SPACES_DESC="Set to Yes to allow spaces in file and folder names or select a character to use as a replacement for the space."
WF_PARAM_WEBSAFE_TEXTCASE="Text Case"
WF_PARAM_WEBSAFE_TEXTCASE_DESC="Select the text case to use for file/folder names."
WF_PARAM_DATE_FORMAT="Date Format"
WF_PARAM_DATE_FORMAT_DESC="Date Format to use when displaying the Modified date of Files and Folders, eg: %d/%m/%Y, %H:%M will display as 13/12/1984, 14:00"
WF_PARAM_VALIDATE_MIMETYPE="Validate Mimetype"
WF_PARAM_VALIDATE_MIMETYPE_DESC="For additional security when uploading, check the mimetype of the uploaded file against its extension. If enabled and the server does not support the PHP fileinfo or mime_content_type functions, the mimetype check will be skipped."
WF_PARAM_BROWSER_POSITION="File Browser Position"
WF_PARAM_BROWSER_POSITION_DESC="Position of the File Browser in the dialog. Default is Bottom"
WF_PARAM_LIST_LIMIT="File Browser List Size"
WF_PARAM_LIST_LIMIT_DESC="Number of files/folders to display in the File Browser file / folder list"
WF_PARAM_EXTENSIONS="Permitted File Extensions"
WF_PARAM_EXTENSIONS_DESC="List of permitted file extensions for uploading and displaying, organized by type. To edit the list, click the pencil icon. You can move extensions between groups by using drag and drop. Extensions can be deactivated by unchecking their corresponding checkbox. To add a custom extension, use the input field at the bottom of the list. Click the plus icon to add a new input field, or the trash icon to remove an existing one."
WF_PARAM_BUTTONS="Buttons"
WF_PARAM_BUTTONS_DESC="Select the buttons to display in the editor toolbar"
WF_PARAM_KEEP_NBSP="Keep non-breaking spaces"
WF_PARAM_KEEP_NBSP_DESC="When Entity Encoding is set to UTF-8, convert UTF-8 spaces to non-breaking spaces (recommended)"

WF_PARAM_TOTAL_FILES_LIMIT="Total Files Limit"
WF_PARAM_TOTAL_FILES_LIMIT_DESC="Set a limit on the total number of files the File Directory Path can contain (including all sub-folders), eg: 50. Uploads will be restricted when this limit it reached. Leave blank for no limit."
WF_PARAM_TOTAL_FILES_SIZE_LIMIT="Total File Size Limit"
WF_PARAM_TOTAL_FILES_SIZE_LIMIT_DESC="Set a limit on the total size the File Directory Path can be, in Mb, eg: 10. Uploads will be restricted when this limit it reached. Leave blank for no limit."

WF_BROWSER_ALLOW_DOWNLOAD="Allow File Download"
WF_BROWSER_ALLOW_DOWNLOAD_DESC="Allow direct downloading of files listed in the File Browser by pressing the ALT key while clicking on the file name."

WF_PARAM_CUSTOM_ATTRIBUTES="Custom Attributes"
WF_PARAM_CUSTOM_ATTRIBUTES_DESC="Default values for custom attributes. Set the name of the attribute and the default value. Check the <strong>Boolean</strong> option to set this as a boolean attribute."
WF_PARAM_CUSTOM_ATTRIBUTES_NAME="Attribute Name"
WF_PARAM_CUSTOM_ATTRIBUTES_VALUE="Attribute Value"

;#################### Plugin / Command Titles and Descriptions ################################
WF_CONTEXTMENU_TITLE="Context Menu"
WF_CONTEXTMENU_DESC="Adds a Context Menu with editor commands and buttons when right-clicking in the editor."
WF_BROWSER_TITLE="File Browser"
WF_BROWSER_DESC="Adds a File Browser option to the Link plugin and for specific fields in the Tables, Image Manager and Styles plugins. Required by the JCE Media Field."
WF_INLINEPOPUPS_TITLE="Inline Popups"
WF_INLINEPOPUPS_DESC="Plugin Dialog windows are opened in an inline element rather than a new browser window which overcomes limits imposed by popup blockers."
WF_PASTE_TITLE="Paste"
WF_PASTETEXT_TITLE="Paste As Plain Text"
WF_SPELLCHECKER_TITLE="Spellchecker"
WF_SPELLCHECKER_DESC="Spellchekcer using the Google Spell Checking service or as an interface for PSPell, Aspell or Enchant."
WF_ATTRIBUTES_TITLE="Attributes"
WF_SOURCE_TITLE="Code Editor"
WF_SOURCE_DESC="Edit the HTML source code of an article"
WF_ANCHOR_TITLE="Anchor"
WF_ANCHOR_DESC="Create and edit anchors"
WF_ARTICLE_TITLE="Article Breaks"
WF_ARTICLE_DESC="Insert and edit Joomla!© Readmore and Pagebreak elements"
WF_BACKCOLOR_TITLE="Background Colour"
WF_BACKCOLOR_LIST_TITLE="Custom Background Colours"
WF_BACKCOLOR_LIST_DESC="A comma separated list of custom colours, in hex format, to display in the Font Background Colour drop-down, eg: #cccccc,#dddddd,#eeeeee"
WF_BACKCOLOR_DESC="Apply and edit text background colour."
WF_BOLD_TITLE="Bold"
WF_BOLD_DESC="Apply or remove a bold effect on selected text."
WF_BULLIST_TITLE="Unordered List"
WF_JUSTIFYCENTER_TITLE="Justify Centre"
WF_JUSTIFYCENTER_DESC="Centre align text or elements"
WF_CHARMAP_TITLE="Character Map"
WF_CHARMAP_DESC="Select a special character from a dialog to insert"
WF_CLEANUP_TITLE="Code Cleanup"
WF_CLEANUP_DESC="Cleanup HTML code"
WF_DIRECTIONALITY_TITLE="Directionality"
WF_DIRECTIONALITY_DESC="Set the directionality on an element (eg: left-to-right or right-to-left)"
WF_FONTSELECT_TITLE="Font Family Select"
WF_FONTSELECT_DESC="Set the font-family on selected text eg: Arial"
WF_FONTSIZESELECT_TITLE="Font Size Select"
WF_FONTSIZESELECT_DESC="Set the font-size on selected text eg: 10px"
WF_FORECOLOR_TITLE="Text Colour"
WF_FORECOLOR_DESC="Change the colour of selected text"
WF_FORECOLOR_LIST_TITLE="Custom Text Colours"
WF_FORECOLOR_LIST_DESC="A comma separated list of custom colours, in hex format, to display in the Text Colour drop-down, eg: #000000,#444444,#888888"
WF_FORMATSELECT_TITLE="Format Select"
WF_FORMATSELECT_DESC="Apply a block format to the selected text or element, eg: Paragraph will wrap the selected text in a paragraph element"
WF_JUSTIFYFULL_TITLE="Justify Full"
WF_JUSTIFYFULL_DESC="Format selected text to full the width of the container element"
WF_FULLSCREEN_TITLE="Full Screen"
WF_FULLSCREEN_DESC="Expand the editor to full the screen."
WF_HELP_TITLE="Help"
WF_HELP_DESC="Open the Editor Help dialog"
WF_HR_TITLE="Horizontal Rule"
WF_HR_DESC="Insert a Horizontal Rule"
WF_IMGMANAGER_TITLE="Image Manager"
WF_IMGMANAGER_DESC="Upload, delete, rename and insert images"
WF_INDENT_TITLE="Indent"
WF_INDENT_DESC="Indent the selected text or element"
WF_ITALIC_TITLE="Italic"
WF_ITALIC_DESC="Apply or remove italics to the selected text"
WF_LAYER_TITLE="Layer"
WF_LAYER_DESC="Insert and edit floating DIV layer elements"
WF_JUSTIFYLEFT_TITLE="Justify Left"
WF_JUSTIFYLEFT_DESC="Align selected text or elements left"
WF_LINK_TITLE="Link"
WF_LINK_DESC="Insert and edit links to articles, web pages, files or e-mail addresses."
WF_MEDIA_TITLE="Media Support"
WF_MEDIA_DESC="Adds support for OBJECT, EMBED, AUDIO, VIDEO and IFRAME elements. Required by the Media Manager, IFrames and to embed iframe based media such as Youtube, Vimeo etc."
WF_NEWDOCUMENT_TITLE="New Document"
WF_NEWDOCUMENT_DESC="Clear the current document"
WF_NONBREAKING_TITLE="Non-Breaking Space"
WF_NONBREAKING_DESC="Insert a non-breaking space"
WF_NUMLIST_TITLE="Ordered List"
WF_OUTDENT_TITLE="Outdent"
WF_OUTDENT_DESC="Remove the indentation on the selected element"
WF_PREVIEW_TITLE="Preview Tab"
WF_PREVIEW_DESC="Preview the current article"
WF_PRINT_TITLE="Print"
WF_PRINT_DESC="Print the article contents"
WF_REDO_TITLE="Redo"
WF_REDO_DESC="Redo the last action"
WF_REMOVEFORMAT_TITLE="Remove Format"
WF_REMOVEFORMAT_DESC="Remove Formatting on the selected text or element"
WF_JUSTIFYRIGHT_TITLE="Justify Right"
WF_JUSTIFYRIGHT_DESC="Align selected text or elements right"
WF_SEARCHREPLACE_TITLE="Search & Replace"
WF_SEARCHREPLACE_DESC="Find and replace text in the article"
WF_STRIKETHROUGH_TITLE="Strike Through"
WF_STRIKETHROUGH_DESC="Apply or remove a strikethrough on the selected text"
WF_STYLE_TITLE="Styles"
WF_STYLE_DESC="Edit the CSS styles on an element"
WF_STYLESELECT_TITLE="Style Select"
WF_STYLESELECT_DESC="Select a CSS class to apply to the selected text or element. The Style List is populated with the classes form your template stylesheet based on Profile parameters"
WF_SUB_TITLE="Subscript"
WF_SUB_DESC="Apply or remove a subscript on the selected text. The text size will be reduced and the text set slightly below the normal line of type."
WF_SUP_TITLE="Superscript"
WF_SUP_DESC="Apply or remove a superscript on the selected text. The text size will be reduced and the text set slightly above the normal line of type."
WF_TABLE_TITLE="Tables"
WF_TABLE_DESC="Insert and Edit Tables. Includes tools for inserting, removing and merging cells and rows"
WF_TEXTCASE_TITLE="Text Case"
WF_TEXTCASE_DESC="Change the case of the selected text. Options include Sentence case, Camel Case, UPPERCASE and lowercase."
WF_UNDERLINE_TITLE="Underline"
WF_UNDERLINE_DESC="Apply or remove an underline on the selected text"
WF_UNDO_TITLE="Undo"
WF_UNDO_DESC="Undo the last action"
WF_UNLINK_TITLE="Unlink"
WF_UNLINK_DESC="Remove the link on the selected text or element"
WF_VISUALAID_TITLE="Visual Aid"
WF_VISUALAID_DESC="Toggle Visual Aids."
WF_VISUALCHARS_TITLE="Visual Characters"
WF_VISUALCHARS_DESC="Toggle Visual Characters. These include visual representations of non-breaking spaces"
WF_BLOCKQUOTE_TITLE="Blockquote"
WF_BLOCKQUOTE_DESC="Insert or remove a Blockquote"

WF_CITE_TITLE="Citation"
WF_Q_TITLE="Quotation"
WF_ABBR_TITLE="Abbreviation"
WF_INS_TITLE="Insertion"
WF_ACRONYM_TITLE="Acronym"
WF_DEL_TITLE="Deletion"
WF_COLORPICKER_TITLE="Colour Picker"
WF_VISUALBLOCKS_TITLE="VisualBlocks"
WF_VISUALBLOCKS_DESC="Display a visual representation of block elements"
WF_KITCHENSINK_TITLE="Toggle Toolbars"
WF_KITCHENSINK_DESC="Show / Hide the toolbar rows below the row this button is in"
WF_LISTS_TITLE="Lists"
WF_LISTS_DESC="Ordered (numbered) and Unordered (bullet) lists"
WF_ADVANCED_CHARMAP_TITLE="Character Map"

WF_FONTCOLOR_TITLE="Font Colour"
WF_FONTCOLOR_DESC="Apply font color and background-color styles to a text selection"

;#################### Article Breaks ################################
WF_ARTICLE_PARAM_HIDE_BUTTONS="Hide Joomla! Readmore / PageBreak"
WF_ARTICLE_PARAM_HIDE_BUTTONS_DESC="Hide the Joomla! Readmore and Pagebreak buttons at the bottom of the editor as Article Breaks performs the same functions better."
WF_ARTICLE_PARAM_SHOW_READMORE="Show Readmore button"
WF_ARTICLE_PARAM_SHOW_READMORE_DESC="Show the Readmore button in the Editor Toolbar."
WF_ARTICLE_PARAM_SHOW_PAGEBREAK="Show Pagebreak button"
WF_ARTICLE_PARAM_SHOW_PAGEBREAK_DESC="Show the Pagebreak button in the Editor Toolbar."
WF_ARTICLE_READMORE="Readmore"
WF_ARTILCE_PAGEBREAK="Pagebreak"

;#################### Autosave ################################
WF_AUTOSAVE_TITLE="AutoBackup"
WF_AUTOSAVE_DESC="Automatically save drafts of the current article at regular intervals"
WF_AUTOSAVE_ASK_BEFORE_UNLOAD="Ask before Unload"
WF_AUTOSAVE_ASK_BEFORE_UNLOAD_DESC="Ask before closing the editor or navigating away from the page if there are unsaved changes."
WF_AUTOSAVE_INTERVAL="Backup Interval (seconds)"
WF_AUTOSAVE_INTERVAL_DESC="Backup every X seconds. Set to 0 to disable automatic backups."
WF_AUTOSAVE_RETENTION="Storage time (minutes)"
WF_AUTOSAVE_RETENTION_DESC="Store backup for X minutes. Set to 0 to disable automatic backups."

;#################### File Browser ################################n
WF_BROWSER_HELP_ABOUT="About the File Browser"
WF_BROWSER_HELP_INTERFACE="The File Browser Interface"
WF_BROWSER_HELP_INSERT="Inserting a file"

WF_BROWSER_MEDIAFIELD_OPTIONS="Media Field Options"
WF_BROWSER_MEDIAFIELD_CONVERSION="Enable Conversion"
WF_BROWSER_MEDIAFIELD_CONVERSION_DESC="Convert the Joomla Media Field to one that supports the JCE File Browser"
WF_BROWSER_MEDIAFIELD_UPLOAD="Direct Upload"
WF_BROWSER_MEDIAFIELD_UPLOAD_DESC="Allow Direct Upload features on the JCE Media Field and converted Media Fields via an additional upload button and drag & drop."
WF_BROWSER_MEDIAFIELD_ENABLE="Enable JCE Media Fields"
WF_BROWSER_MEDIAFIELD_ENABLE_DESC="Enable JCE Media Fields for this profile. This includes JCE Media Fields and any converted Joomla Media Fields."
WF_BROWSER_MEDIAFIELD_SELECT_BUTTON="Select Button"
WF_BROWSER_MEDIAFIELD_SELECT_BUTTON_DESC="Show the Select button on the JCE Media Field to select and manage files using the JCE File Browser."

;#################### Autosave ################################
WF_AUTOSAVE_ASK="Ask before unload"
WF_AUTOSAVE_ASK_DESC="Ask before restoring content"
WF_AUTOSAVE_INTERVAL="Backup Interval (seconds)"
WF_AUTOSAVE_INTERVAL_DESC="Backup every X seconds"
WF_AUTOSAVE_RETENTION="Storage time (minutes)"
WF_AUTOSAVE_RETENTION_DESC="Store backup for X minutes"
WF_AUTOSAVE_MINLENGTH="Minimum Content Length"
WF_AUTOSAVE_MINLENGTH_DESC="An article must be at least this many characters long before a backup will occur"

;#################### Link ################################
WF_LINK_JOOMLALINKS_TITLE="Joomla! Links"
WF_LINK_JOOMLALINKS_DESC="Link to Joomla! internal content for the Link Browser"
WF_TAB_LINK="Link"
WF_LINK_PARAM_DEFAULT_TARGET="Default Target"
WF_LINK_PARAM_DEFAULT_TARGET_DESC="Select Default Target"
WF_LINK_PARAM_FILE_BROWSER="Show File Browser Button"
WF_LINK_PARAM_FILE_BROWSER_DESC="This will show a file browser button next to the URL field which will open a File Browser dialog when clicked allowing the user to create links to files."
WF_LINK_LINK="Link"
WF_LINK_LINK_TEXT="Text"
WF_LINK_LINK_TEXT_DESC="If no content selection is made or if the selection is plain text, enter new or edit the text for the link here"
WF_LABEL_ANCHORS="Article Anchors"
WF_LABEL_ANCHORS_DESC="List of available anchors in the current article to link to."
WF_LABEL_LINKBROWSER="Link Browser"
WF_LABEL_EMAIL="E-Mail"
WF_LABEL_HREFLANG="Target Language Code"
WF_LABEL_HREFLANG_DESC="Language code of the target url"
WF_LABEL_MIME_TYPE="Target MIME Type"
WF_LABEL_MIME_TYPE_DESC="MIME (Multipurpose Internet Mail Extensions) Type of the target url eg: text/html"
WF_LABEL_CHARSET="Target character encoding"
WF_LABEL_CHARSET_DESC="Character encoding of the target url, eg: utf-8"
WF_LABEL_REL="Relationship page to target"
WF_LABEL_REL_DESC="Relationship between the current page and the target url"
WF_LABEL_REV="Relationship target to page"
WF_LABEL_REV_DESC="Relationship target url and the current page"
WF_LINK_HELP_ABOUT="What is Link?"
WF_LINK_HELP_INTERFACE="About the Interface"
WF_LINK_HELP_LINKS="The Link Browser"
WF_LINK_HELP_INSERT="Inserting/Updating a Link"
WF_LINK_HELP_EVENTS="The Events Tab"
WF_LINK_HELP_ADVANCED="The Advanced Tab"
WF_LINK_HELP_EMAIL="Creating an E-mail address"
WF_LINK_HELP_POPUP="Creating a Popup"
WF_LINK_PARAM_TAB_ADVANCED="Show Advanced Tab"
WF_LINK_PARAM_TAB_ADVANCED_DESC="Show the Advanced tab for setting additional, advanced link options"
WF_LINK_SHOW_ANCHOR="Show Anchor List"
WF_LINK_SHOW_ANCHOR_DESC="Show the Anchor List options in the Link dialog"
WF_LINK_SHOW_TARGET="Show Target List"
WF_LINK_SHOW_TARGET_DESC="Show the Target List options in the Link dialog"
WF_LINK_AUTOLINK_EMAIL="Autolink Emails"
WF_LINK_AUTOLINK_EMAIL_DESC="Automatically convert email addresses into mailto links when typed or pasted into the editor."
WF_LINK_AUTOLINK_URL="Autolink URLs"
WF_LINK_AUTOLINK_URL_DESC="Automatically convert urls into links when typed or pasted into the editor."

WF_ELEMENT_SELECTION="Mixed / Element Selection"

WF_LINK_QUICKLINK="Quick Link"
WF_LINK_QUICKLINK_DESC="Enable or Disable the QuickLink drop-down on the Link button"

WF_LINK_SHOW_TITLE="Show Title"
WF_LINK_SHOW_TITLE_DESC="Show the Title field in the Link dialog"
WF_LINK_SHOW_CLASSES="Show Classes List"
WF_LINK_SHOW_CLASSES_DESC="Show the Classes List in the Link dialog."

;#################### Tables ################################
WF_TABLES_TABLE_TITLE="Insert / Edit Table"
WF_TABLES_ROW_TITLE="Edit Row"
WF_TABLES_CELL_TITLE="Edit Cell"
WF_TABLES_MERGE_TITLE="Merge Cells"
WF_TAB_MERGE="Merge"
;#################### Help ################################
WF_EDITOR_HELP_ABOUT="About the Editor"
WF_EDITOR_HELP_TOOLBAR="Editor Toolbar"
WF_EDITOR_HELP_CONTENT="Editor Content Area"
WF_EDITOR_HELP_PATH="Element Path"
WF_EDITOR_HELP_BUTTONS="Editor Buttons"
WF_EDITOR_HELP_LICENCE="Licence"
WF_EDITOR_HELP_ACKNOWLEDGEMENTS="Acknowledgements"
WF_EDITOR_HELP_PLUGINS="Plugins"
WF_EDITOR_HELP_BASICS="Editing Basics"
WF_EDITOR_HELP_SELECTION="Selecting text and elements"
WF_EDITOR_HELP_FORMAT="Formatting text and elements"
WF_EDITOR_HELP_FORMAT_BOLD="Bold, Italic, Underline and Strikethrough"
WF_EDITOR_HELP_FORMAT_BLOCKS="Headers, Block Elements and Blockquote"
WF_EDITOR_HELP_FORMAT_SUB="Superscript and Subscript"
WF_EDITOR_HELP_FORMAT_FONT="Font Styling"
WF_EDITOR_HELP_FORMAT_ALIGN="Alignment"
WF_EDITOR_HELP_FORMAT_INDENT="Indent and Outdent"
WF_EDITOR_HELP_FORMAT_ATTRIBUTES="Editing element attributes"
WF_EDITOR_HELP_LISTS="Creating Lists"
WF_EDITOR_HELP_READMORE="Readmore and Page Break"
WF_EDITOR_HELP_LINKS="Creating and Editing Links"
WF_EDITOR_HELP_IMAGES="Inserting images"
WF_EDITOR_HELP_TABLES="Inserting Tables"
WF_EDITOR_HELP_PASTE="Cut, Copy & Paste"
WF_EDITOR_HELP_SPELLCHECKER="Spellchecker"

;#################### Image Manager ################################
WF_IMGMANAGER_HIDE_BUTTONS="Hide Joomla! Image Button"
WF_IMGMANAGER_HIDE_BUTTONS_DESC="Hide Joomla! Image Button"
WF_IMGMANAGER_HELP="Image Manager Help"
WF_IMGMANAGER_HELP_ABOUT="What is the Image Manager?"
WF_IMGMANAGER_HELP_INTERFACE="About the Interface"
WF_IMGMANAGER_HELP_ROLLOVER="Rollover Images"
WF_IMGMANAGER_HELP_ADVANCED="The Advanced Tab"
WF_IMGMANAGER_HELP_INSERT="Inserting/Updating"
WF_LABEL_MOUSEOVER="Mouseover"
WF_LABEL_MOUSEOVER_DESC="Image to be displayed when the mouse is over the element"
WF_LABEL_MOUSEOUT="Mouseout"
WF_LABEL_MOUSEOUT_DESC="Image to be displayed when the mouse is not over the element"
WF_LABEL_ROLLOVER_ENABLE_DESC="Click to enable image rollover."
WF_LABEL_ROLLOVER_IMAGE="Rollover Image"
WF_LABEL_USEMAP="Image Map"
WF_LABEL_USEMAP_DESC="Id of associated image map, eg: #map"
WF_TAB_IMAGE="Image"
WF_TAB_ROLLOVER="Rollover"
WF_IMGMANAGER_SHOW_DIMENSIONS="Show Dimensions Options"
WF_IMGMANAGER_SHOW_DIMENSIONS_DESC="User can see and set the image dimensions (width and height)"
WF_IMGMANAGER_SHOW_ALIGN="Show Alignment Options"
WF_IMGMANAGER_SHOW_ALIGN_DESC="User can see and set the image alignment"
WF_IMGMANAGER_SHOW_MARGIN="Show Margin Options"
WF_IMGMANAGER_SHOW_MARGIN_DESC="User can see and set the margin values around the image"
WF_IMGMANAGER_SHOW_BORDER="Show Border Options"
WF_IMGMANAGER_SHOW_BORDER_DESC="User can see and set the image border options (width, style, colour)"
WF_IMGMANAGER_SHOW_CLASSES="Show Classes List"
WF_IMGMANAGER_SHOW_CLASSES_DESC="User can see and set image classes in the Advanced tab or Basic Dialog"
WF_IMGMANAGER_PARAM_TAB_ROLLOVER="Show Rollover Tab"
WF_IMGMANAGER_PARAM_TAB_ROLLOVER_DESC="Show the Rollover tab with additional options for creating image rollovers"
WF_IMGMANAGER_PARAM_TAB_ADVANCED="Show Advanced Tab"
WF_IMGMANAGER_PARAM_TAB_ADVANCED_DESC="Show the Advanced tab for setting additional, advanced image options"
WF_IMGMANAGER_PARAM_ALWAYS_INCLUDE_DIMENSIONS="Always Include Dimensions"
WF_IMGMANAGER_PARAM_ALWAYS_INCLUDE_DIMENSIONS_DESC="If Yes, image dimensions will always be included when inserting images. If No, dimensions will only be included if they are different to the original image dimensions. Default is Yes."

;#################### Media Support ################################
WF_MEDIA_PARAM_IFRAMES="Allow IFrames"
WF_MEDIA_PARAM_IFRAMES_DESC="Allow IFrame elements to be included in content.<ul><li>Select <strong>Yes</strong> to allow any content to be loaded in an iframe.</li><li><strong>Local Content Only</strong> will only allow content from this site.</li><li><strong>Local Content and Supported Media Only</strong> will allow content from this site and content from Youtube, Vimeo, Dailymotion, Scribd, Soundcloud, Slideshare, Spotify, Twitch, Ted and Calendly.</li></ul>"
WF_MEDIA_PARAM_IFRAMES_LOCAL="Local Content Only"
WF_MEDIA_PARAM_IFRAMES_SUPPORTED_MEDIA="Local Content and Supported Media Only"
WF_MEDIA_PARAM_VIDEO="Allow VIDEO Elements"
WF_MEDIA_PARAM_VIDEO_DESC="Allow VIDEO elements to be included in content"
WF_MEDIA_PARAM_AUDIO="Allow AUDIO Elements"
WF_MEDIA_PARAM_AUDIO_DESC="Allow AUDIO elements to be included in content"
WF_MEDIA_PARAM_OBJECT="Allow OBJECT Elements"
WF_MEDIA_PARAM_OBJECT_DESC="Allow OBJECT elements to be included in content. This is required to embed PDF files and some legacy formats eg: Adobe Flash Player®"
WF_MEDIA_PARAM_EMBED="Allow EMBED Elements"
WF_MEDIA_PARAM_EMBED_DESC="Allow EMBED elements to be included in content. This is required to embed some legacy formats eg: Adobe Flash Player®"

WF_MEDIA_PARAM_MEDIA_PREVIEW="Media Previews"
WF_MEDIA_PARAM_MEDIA_PREVIEW_DESC="Show a live preview in the editor of IFrame media, ie: Youtube, Vimeo, etc. instead of a media placeholder."

WF_MEDIA_IFRAMES_SUPPORTED_MEDIA="Supported Media"
WF_MEDIA_IFRAMES_SUPPORTED_MEDIA_DESC="Select common media providers to allow and/or add Custom Url values to validate user input against."

WF_MEDIA_PARAM_LOCAL_ONLY="Local Content Only"

WF_MEDIA_IFRAMES_SANDBOX="Sandbox Iframes"
WF_MEDIA_IFRAMES_SANDBOX_DESC="Enable the sandbox attribute on iframes to restrict the content within the iframe."
WF_MEDIA_IFRAMES_SANDBOX_EXCLUSIONS="Sandbox URL Exclusions"
WF_MEDIA_IFRAMES_SANDBOX_EXCLUSIONS_DESC="URL patterns to exclude from the sandbox attribute, eg: https://www.joomla.org"

WF_MEDIA_STRICT_MEDIA_EMBEDS="Strict Media Embeds"
WF_MEDIA_STRICT_MEDIA_EMBEDS_DESC="Embed media using the default tag for the media mime type, eg:  &lt;video&gt; for video files, &lt;audio&gt; for audio files, &lt;iframe&gt; for Youtube etc."

;#################### Paste ################################
WF_PASTE_PARAM_CLASSES="Strip Class Attributes"
WF_PASTE_PARAM_CLASSES_DESC="Set whether or not class attributes are stripped when pasting. By default all classes are removed from Word/Office content. When pasting from Word/Office, all 'mso' classes are removed, regardless of this setting."
WF_OPTION_PASTE_CLASSES_WORD_ONLY="Only from Word/Office Content"
WF_PASTE_PARAM_LISTED="As Listed"
WF_PASTE_PARAM_SPANS="Remove all SPANS"
WF_PASTE_PARAM_SPANS_DESC="Remove all spans from pasted content"
WF_PASTE_PARAM_STYLES="Remove all Styles"
WF_PASTE_PARAM_STYLES_DESC="Remove styles from pasted content"
WF_PASTE_PARAM_RETAIN_STYLES="Styles to keep"
WF_PASTE_PARAM_RETAIN_STYLES_DESC="Comma separated list of style properties to <strong>keep</strong> when pasting if <strong>Remove all Styles</strong> is <strong>YES</strong>.<br />Example: font-weight,text-decoration."
WF_PASTE_PARAM_REMOVE_STYLES="Styles to remove"
WF_PASTE_PARAM_REMOVE_STYLES_DESC="Comma separated list of style properties to <strong>remove</strong> when pasting if <strong>Remove all Styles</strong> is <strong>NO</strong>.<br />Example: font-size,font-family,color."

WF_PASTE_PARAM_REMOVE_STYLES_WEBKIT="Remove Webkit Styles"
WF_PASTE_PARAM_REMOVE_STYLES_WEBKIT_DESC="If Yes, removes all style information when pasting in WebKit since it has a serious paste bug. Default is No. "
WF_PASTE_PARAM_WIDTH="Dialog Width"
WF_PASTE_PARAM_WIDTH_DESC="Width of the Paste Dialog in pixels (px)"
WF_PASTE_PARAM_HEIGHT="Dialog Height"
WF_PASTE_PARAM_HEIGHT_DESC="Height of the Paste Dialog in pixels (px)"
WF_PASTE_PARAM_REMOVE_PARAGRAPHS="Remove empty paragraphs"
WF_PASTE_PARAM_REMOVE_PARAGRAPHS_DESC="Empty paragraphs are removed from pasted content or converted into linebreaks if the Global Configuration 'Newlines' option is set to 'Linebreaks'."
WF_PASTE_PARAM_PASTE_TEXT="Allow Paste As Plain Text"
WF_PASTE_PARAM_PASTE_TEXT_DESC="Allow users to paste content as plain text (stripped of html)"
WF_PASTE_PARAM_PASTE_HTML="Allow Paste As HTML"
WF_PASTE_PARAM_PASTE_HTML_DESC="Allow users to paste content with html intact. Word specific and other html will automatically be cleaned based on the parameter settings."
WF_PASTE_PARAM_DIALOG="Use Paste dialog"
WF_PASTE_PARAM_DIALOG_DESC="Always use the Paste Dialog when pasting (except when using CTRL+V)"
WF_PASTE_FORCE_CLEANUP="Microsoft Word® cleanup"
WF_PASTE_FORCE_CLEANUP_DESC="Content from applications like Microsoft Word® and OpenOffice.org Writer often include code not suitable for HTML documents. The cleanup action will attempt to convert or remove this code."
WF_PASTE_FORCE_CLEANUP_DETECT="Only if detected"
WF_PASTE_FORCE_CLEANUP_ALWAYS="Always"
WF_PASTE_HELP_ABOUT="Using the Paste Buttons"
WF_PASTE_PARAM_ATTRIBUTES="Remove Attributes"
WF_PASTE_PARAM_ATTRIBUTES_DESC="A comma separated list of attributes to remove, eg: lang,align"
WF_PASTE_PARAM_REMOVE_TAGS="Remove Tags"
WF_PASTE_PARAM_REMOVE_TAGS_DESC="A comma separated list of tags to remove, eg: img,object,iframe"
WF_PASTE_PARAM_KEEP_TAGS="Keep Tags"
WF_PASTE_PARAM_KEEP_TAGS_DESC="A comma separated list of tags to keep, all other tags will be removed. eg: img,strong,em"
WF_PASTE_PARAM_PROCESS_FOOTNOTES="Process Footnotes"
WF_PASTE_PARAM_PROCESS_FOOTNOTES_DESC="Convert, unlink or remove footnote links in Office documents.<ul><li>Convert - Convert footnote links into valid anchor links</li><li>Unlink - Remove the footnote link but keep the footnote text.</li><li>Remove - Remove the footnote link completely including the text.</li></ul>"
WF_PASTE_PARAM_PROCESS_FOOTNOTES_CONVERT="Convert"
WF_PASTE_PARAM_PROCESS_FOOTNOTES_UNLINK="Unlink"
WF_PASTE_PARAM_PROCESS_FOOTNOTES_REMOVE="Remove"
WF_PASTE_PARAM_UPLOAD_IMAGES="Process images for upload"
WF_PASTE_PARAM_UPLOAD_IMAGES_DESC="Convert images in pasted content into placeholders from which an image can be selected and uploaded. If disabled, images will be removed."
WF_PASTE_PARAM_FILTER="Remove by Regular Expression"
WF_PASTE_PARAM_FILTER_DESC="Remove content by Regular Expression, eg: /joomla/gi will remove all instances of the word 'joomla' and 'Joomla'. Separate multiple expressions with a semi-colon."
WF_PASTE_PARAM_ALLOW_EVENT_ATTRIBUTES="Allow Event Attributes"
WF_PASTE_PARAM_ALLOW_EVENT_ATTRIBUTES_DESC="Allow event attributes, eg: onclick, onload etc. to be retained when pasting content from external sources, such as web pages. Event attributes are removed by default as they can pose a security risk."

WF_PASTE_CLEANUP_MODE="Clean Up Mode"
WF_PASTE_CLEANUP_MODE_DESC="Select the level of cleanup to apply to pasted content.<ul><li><strong>Clean HTML</strong> - Default. Remove all styles, classes and extraneous HTML to produce clean HTML content. Best when pasting from Office documents (Word, Excel etc.)</li><li><strong>Keep Classes</strong> - As with Clean HTML but keeps class attributes.</li><li><strong>Keep Styles</strong> - As with Keep Classes but also keeps style attributes (in Word / Office content only)</li><li><strong>Custom</strong> - Use the Custom Cleanup settings below.</li></ul>"
WF_PASTE_CLEANUP_MODE_CLEAN_HTML="Clean HTML"
WF_PASTE_CLEANUP_MODE_KEEP_CLASSES="Keep Classes"
WF_PASTE_CLEANUP_MODE_KEEP_STYLES="Keep Styles"
WF_PASTE_CLEANUP_MODE_CUSTOM="Custom"

;#################### Spellchecker ################################
WF_SPELLCHECKER_PARAM_ENGINE="Engine"
WF_SPELLCHECKER_PARAM_ENGINE_DESC="Select a spellchecking engine."
WF_SPELLCHECKER_PARAM_BROWSER="Browser Spellcheck"
WF_SPELLCHECKER_PARAM_ENCHANT="EnchantSpell"
WF_SPELLCHECKER_PARAM_PSPELL_PHP="PHP PSpell"
WF_SPELLCHECKER_PARAM_PSPELL_CLINE="Commmand Line PSpell"
WF_SPELLCHECKER_PARAM_LANGUAGES="Languages"
WF_SPELLCHECKER_PARAM_LANGUAGES_DESC="List of languages. List the default language first, eg: English=en,Deutsch=de"
WF_SPELLCHECKER_PARAM_PSPELL_MODE="PSPELL Mode"
WF_SPELLCHECKER_PARAM_PSPELL_MODE_DESC="PSpell specific option. PSpell has various modes that makes it more or less exact it has a impact on performance."
WF_SPELLCHECKER_PARAM_PSPELL_SPELLING="PSPELL Spelling Parameter"
WF_SPELLCHECKER_PARAM_PSPELL_SPELLING_DESC="PSpell specific setting. Enables you to control the spelling parameter of PSpell. (Advanced users only)."
WF_SPELLCHECKER_PARAM_PSPELL_JARGON="PSPELL Jargon"
WF_SPELLCHECKER_PARAM_PSPELL_JARGON_DESC="PSpell specific setting. Enables you to control the jargon parameter of PSpell. (Advanced users only)."
WF_SPELLCHECKER_PARAM_PSPELL_ENCODING="PSPELL Encoding"
WF_SPELLCHECKER_PARAM_PSPELL_ENCODING_DESC="PSpell specific setting. Enables you to control the encoding parameter of PSpell. (Advanced users only)."
WF_SPELLCHECKER_PARAM_PSPELLSHELL="PSpell location"
WF_SPELLCHECKER_PARAM_PSPELLSHELL_DESC="Location of PSpell executable file. This option is only used if the PspellShell engine is selected."
WF_SPELLCHECKER_PARAM_PSPELLSHELL_TMP="TMP Directory"
WF_SPELLCHECKER_PARAM_PSPELLSHELL_TMP_DESC="Location of a writable temp directory."
WF_SPELLCHECKER_PARAM_PSPELL_DICTIONARY="PSpell Dictionary"
WF_SPELLCHECKER_PARAM_PSPELL_DICTIONARY_DESC="Relative Path to PSPell Dictionary"
WF_SPELLCHECKER_BROWSER_STATE_DESC="Set the Browser Spellchecker On by default"
WF_SPELLCHECKER_SUGGESTIONS="Show Suggestions"
WF_SPELLCHECKER_SUGGESTIONS_DESC="Show a list of suggestions for misspelled words in a right-click (context) menu. When set to No, misspelled words will be marked in the editor, but right-click will show the normal editor menu."

;#################### Tables ############################################
WF_TABLES_TITLE="Tables"
WF_TABLES_HELP_EDIT="Creating and Editing Tables"
WF_TABLES_HELP_DELETE="Deleting Tables"
WF_TABLES_HELP_ROWS="Creating and Editing Table Rows"
WF_TABLES_HELP_CELLS="Creating and Editing Table Cells"
WF_TABLES_PARAM_WIDTH="Width"
WF_TABLES_PARAM_WIDTH_DESC="Default Table Width (pixels or percent, eg: 100% or 100px)"
WF_TABLES_PARAM_HEIGHT="Height"
WF_TABLES_PARAM_HEIGHT_DESC="Default Table Height (pixels or percent, eg: 100% or 100px)"
WF_TABLES_PARAM_BORDER="Border"
WF_TABLES_PARAM_BORDER_DESC="Default Border Width"
WF_TABLES_PARAM_COLS="Columns"
WF_TABLES_PARAM_COLS_DESC="Default Number of Columns"
WF_TABLES_PARAM_ROWS="Rows"
WF_TABLES_PARAM_ROWS_DESC="Default Number of Rows"
WF_TABLES_PARAM_CELLPADDING="Cell Padding"
WF_TABLES_PARAM_CELLPADDING_DESC="Default Cell Padding"
WF_TABLES_PARAM_CELLSPACING="Cell Spacing"
WF_TABLES_PARAM_CELLSPACING_DESC="Default Cell Spacing"

;#################### Style ############################################
WF_TAB_TEXT="Text"
WF_TAB_BACKGROUND="Background"
WF_TAB_BOX="Box"
WF_TAB_LIST="List"
WF_TAB_BLOCK="Block"
WF_TAB_BORDER="Border"
WF_TAB_POSITIONING="Positioning"

;#################### XHTMLXtras  #####################################
WF_TAB_STANDARD="Standard"
WF_TAB_EVENTS="Events"
WF_LABEL_DRAGGABLE="Draggable"
WF_LABEL_CONTENTEDITBALE="Contenteditable"
WF_LABEL_HIDDEN="Hidden"
WF_LABEL_SPELLCHECK="Spellcheck"
WF_LABEL_OTHER="Other"

;#################### Lists  #####################################
WF_LISTS_LOWER_ALPHA="Lower alpha"
WF_LISTS_LOWER_GREEK="Lower greek"
WF_LISTS_LOWER_ROMAN="Lower roman"
WF_LISTS_UPPER_ALPHA="Upper alpha"
WF_LISTS_UPPER_ROMAN="Upper roman"
WF_LISTS_CIRCLE="Circle"
WF_LISTS_DISC="Disc"
WF_LISTS_SQUARE="Square"
WF_LISTS_STYLES="List Styles"
WF_LISTS_STYLES_DESC="Select the styles available for the List"
WF_LISTS_CUSTOM_CLASSES="Custom Classes"
WF_LISTS_CUSTOM_CLASSES_DESC="A list of class names to use for the Classes list instead classes extracted from the site's template stylesheets. Classes listed must be defined in the template stylesheets."

;#################### Manager Parameters ################################
WF_PARAM_DIRECTORY="File Directory Path"
WF_PARAM_DIRECTORY_DESC="<p>Relative path to the file directory. If left blank, the first configured value is used (or <em>images</em> if none is set).<br/>Paths are relative to the site root and must begin with an existing static folder (e.g. images/$username, not $username/…).<br/>If a Label is not set, the last segment of the path is used as the label, eg: images/files&nbsp;→ Files<br/>Entries can be <strong>reordered by drag &amp; drop</strong>; the <strong>first</strong> entry is used as the default and in single-path contexts.<br/>This path can contain the variables:</p><ul><li>$id - user ID</li><li>$username - user username</li><li>$usertype or $usergroup - user group, e.g. <em>author</em></li><li>$profile or $group - editor profile name</li><li>$context - component option, e.g. com_content</li><li>$year - current year, e.g. 2025</li><li>$month - current month number, e.g. 09</li><li>$day - current day number, e.g. 10</li><li>$hour - current hour (24-hour), e.g. 23</li></ul><p>See the full guide: <a href='https://www.joomlacontenteditor.net/support/tutorials/editor/setting-the-file-directory-path' target='_blank' rel='noopener'>Setting the File Directory Path</a></p>"
WF_PARAM_DIRECTORY_PATH="Path"
WF_PARAM_DIRECTORY_LABEL="Label"

WF_PARAM_DIRECTORY_FILTER="Directory Filter"
WF_PARAM_DIRECTORY_FILTER_DESC="Remove access to the following folders in the File Directory Path. Alternatively, add a + sign in front of the folder name to allow access to this folder only.<br />Example: images/files will remove access to the images/files folder and +images/files will allow access <strong>only</strong> to the images/files folder. <strong>Note:</strong> This is not a security feature and should not be used as such."
WF_PARAM_ALLOW_ROOT="Allow Root Access"
WF_PARAM_ALLOW_ROOT_DESC="Allow access to the Filesystem root directory. Setting this option to Yes will ignore any value set in the File Directory Path. <strong>This is not recommended for security reasons.</strong> If set to No and if the File Directory Path value is blank, the File Directory Path will default to images."
WF_PARAM_DIRECTORY_RESTRICTED="Restricted Directories"
WF_PARAM_DIRECTORY_RESTRICTED_DESC="List of directories that will not be displayed or accessible if <strong>Allow Root Access</strong> is <strong>Yes</strong>. Default is all Joomla! system folders."
WF_PARAM_DIRECTORY_CREATE="Create File Directory"
WF_PARAM_DIRECTORY_CREATE_DESC="Create above directory on first load if it does not exist."
WF_PARAM_UPLOAD_SIZE="Upload file size (KB)"
WF_PARAM_UPLOAD_SIZE_DESC="Maximum allowed size in kilobytes of uploaded files. <br />Cannot be greater than the Server Upload Size. <br />Default value is 1024 KB."
WF_PARAM_VIEWABLE="Viewable Files"
WF_PARAM_VIEWABLE_DESC="List of files that are able to be viewed in a popup window"
WF_PARAM_UPLOAD="Upload"
WF_PARAM_UPLOAD_DESC="User can upload files"
WF_PARAM_FOLDER_CREATE="Folder Create"
WF_PARAM_FOLDER_CREATE_DESC="User can create folders"
WF_PARAM_FOLDER_DELETE="Folder Delete"
WF_PARAM_FOLDER_DELETE_DESC="User can delete folders"
WF_PARAM_FOLDER_RENAME="Folder Rename"
WF_PARAM_FOLDER_RENAME_DESC="User can rename folders"
WF_PARAM_FILE_DELETE="File Delete"
WF_PARAM_FILE_DELETE_DESC="User can delete files"
WF_PARAM_FILE_RENAME="File Rename"
WF_PARAM_FILE_RENAME_DESC="User can rename files"
WF_PARAM_FILE_PASTE="File Cut/Copy/Paste"
WF_PARAM_FILE_PASTE_DESC="User can Cut/Copy/Paste files"
WF_PARAM_FILESYSTEM="Filesystem"
WF_PARAM_FILESYSTEM_DESC="Select the Filesystem to use for the File Browser"
NOT_SET="-- Not Set --"
WF_PARAM_NOT_SET="-- Not Set --"
WF_PARAM_FOLDER_PASTE="Folder Cut/Copy/Paste"
WF_PARAM_FOLDER_PASTE_DESC="User can Cut/Copy/Paste folders"

WF_PARAM_HELP_BUTTON="Help Button"
WF_PARAM_HELP_BUTTON_DESC="Show the Help button in the File Browser toolbar"

;#################### Margin ################################
WF_PARAM_MARGIN_TOP="Margin Top"
WF_PARAM_MARGIN_TOP_DESC="Default Top Margin value in pixels (px)"
WF_PARAM_MARGIN_BOTTOM="Margin Bottom"
WF_PARAM_MARGIN_BOTTOM_DESC="Default Bottom Margin value in pixels (px)"
WF_PARAM_MARGIN_LEFT="Margin Left"
WF_PARAM_MARGIN_LEFT_DESC="Default Left Margin value in pixels (px)"
WF_PARAM_MARGIN_RIGHT="Margin Right"
WF_PARAM_MARGIN_RIGHT_DESC="Default Right Margin value in pixels (px)"
WF_LABEL_MARGIN="Margin"
WF_LABEL_MARGIN_DESC="Space between the element and adjacent elements or text."

;#################### Border ################################
WF_PARAM_BORDER_ENABLE="Enable Border"
WF_PARAM_BORDER_ENABLE_DESC="Border option enabled by default"
WF_PARAM_BORDER_WIDTH="Border Width"
WF_PARAM_BORDER_WIDTH_DESC="Default Border width in pixels (px)"
WF_PARAM_BORDER_STYLE="Border Style"
WF_PARAM_BORDER_STYLE_DESC="Default Border Style"
WF_PARAM_BORDER_COLOR="Border Colour"
WF_PARAM_BORDER_COLOR_DESC="Default Border Colour"
WF_PARAM_BORDER_THICK="Thick"
WF_PARAM_BORDER_THIN="Thin"
WF_PARAM_BORDER_MEDIUM="Medium"
WF_LABEL_BORDER="Border"
WF_LABEL_BORDER_DESC="Creates a border around an element with the selected parameters"
WF_OPTION_BORDER_THIN="thin"
WF_OPTION_BORDER_THICK="thick"
WF_OPTION_BORDER_MEDIUM="medium"
WF_OPTION_BORDER_NONE="none"
WF_OPTION_BORDER_SOLID="solid"
WF_OPTION_BORDER_DASHED="dashed"
WF_OPTION_BORDER_DOTTED="dotted"
WF_OPTION_BORDER_DOUBLE="double"
WF_OPTION_BORDER_GROOVE="groove"
WF_OPTION_BORDER_INSET="inset"
WF_OPTION_BORDER_OUTSET="outset"
WF_OPTION_BORDER_RIDGE="ridge"
WF_LABEL_BORDER_ENABLE="Enable Border"
WF_LABEL_BORDER_ENABLE_DESC="Enable Border by default"
WF_LABEL_BORDER_WIDTH_DESC="Width of the border in pixels or named width"
WF_LABEL_BORDER_STYLE_DESC="Style of the border"
WF_LABEL_BORDER_COLOR_DESC="Hex Colour of the border (eg: #000000)"

;#################### Align ################################
WF_PARAM_ALIGN_DEFAULT="Alignment"
WF_PARAM_ALIGN_DEFAULT_DESC="Default Alignment"
WF_LABEL_ALIGN="Alignment"
WF_OPTION_ALIGN_DEFAULT="--Not Set--"
WF_OPTION_ALIGN_BASELINE="Baseline"
WF_OPTION_ALIGN_TOP="Top"
WF_OPTION_ALIGN_MIDDLE="Middle"
WF_OPTION_ALIGN_BOTTOM="Bottom"
WF_OPTION_ALIGN_TEXTTOP="TextTop"
WF_OPTION_ALIGN_ABSMIDDLE="Absolute Middle"
WF_OPTION_ALIGN_ABSBOTTOM="Absolute Bottom"
WF_OPTION_ALIGN_LEFT="Left"
WF_OPTION_ALIGN_RIGHT="Right"
WF_OPTION_ALIGN_CENTER="Centre"
WF_OPTION_ALIGN_JUSTIFIED="Justified"
WF_LABEL_ALIGN_DESC="Position of the element on the page or in relation to other elements."

;#################### Admin Labels ################################
WF_LABEL_FILTER="Filter"
WF_LABEL_GO="Go"
WF_LABEL_SEARCH="Search"
WF_LABEL_RESET="Reset"
WF_LABEL_SEARCH_OPTIONS="Search Options"

;#################### Generic ################################
WF_LABEL_NAME="Name"
WF_LABEL_NAME_DESC="Defines a unique name for the element"
WF_LABEL_VERSION="Version"
WF_LABEL_AUTHOR="Author"
WF_LABEL_LANGUAGE="Language"
WF_LABEL_DATE="Date"
WF_LABEL_SIZE="Size"
WF_LABEL_AUTHOR_INFO="Author Information"
WF_LABEL_TOP="Top"
WF_LABEL_BOTTOM="Bottom"
WF_LABEL_DEFAULT="Default"
WF_LABEL_SAVE="Save"
WF_LABEL_APPLY="Apply"
WF_LABEL_SAVECLOSE="Save & Close"
WF_LABEL_SELECT="Select"
WF_LABEL_OK="Ok"
WF_LABEL_CANCEL="Cancel"
WF_LABEL_REFRESH="Refresh"
WF_LABEL_HELP="Help"
WF_LABEL_INSERT="Insert"
WF_LABEL_PROPERTIES="Properties"
WF_LABEL_ATTRIBUTES="Attributes"
WF_LABEL_ADVANCED="Advanced"
WF_LABEL_PREVIEW="Preview"
WF_LABEL_BYTES="Bytes"
WF_LABEL_KB="KB"
WF_LABEL_MB="MB"
WF_LABEL_BROWSE="Browse"
WF_LABEL_BROWSER="File Browser"
WF_LABEL_SHOW="Show"
WF_LABEL_DETAILS="Details"
WF_LABEL_FOLDERS="Folders"
WF_LABEL_DIMENSIONS="Dimensions"
WF_LABEL_DIMENSIONS_DESC="Width and Height of the element in pixels."
WF_LABEL_PROPORTIONAL="Proportional"
WF_LABEL_URL="URL"
WF_LABEL_URL_DESC="Relative location of the image, file, article or document, eg: image.jpg (Required)"
WF_LABEL_TITLE="Title"
WF_LABEL_TITLE_DESC="Text to display in a simple tooltip when the mouse is placed over the element."
WF_LABEL_STYLE="Style"
WF_LABEL_STYLE_DESC="List of inline css properties to be applied to the element."
WF_LABEL_COLOR="Colour"
WF_LABEL_CLASS_LIST="Class List"
WF_LABEL_CLASS_LIST_DESC="List of available template css classes"
WF_LABEL_CLASSES="Classes"
WF_LABEL_CLASSES_DESC="List (separated by a space) of css classes to be applied to the element."
WF_LABEL_ALT="Alternate Text"
WF_LABEL_ALT_DESC="A short description of the image (XHTML/WAI 508 Required)"
WF_LABEL_EQUAL="Equalize"
WF_OPTION_YES="Yes"
WF_OPTION_NO="No"
WF_OPTION_NOT_SET="--Not Set--"
WF_OPTION_NONE="None"
WF_OPTION_ALL="All"
WF_OPTION_CENTER="Centre"
WF_OPTION_TOP="Top"
WF_OPTION_BOTTOM="Bottom"
WF_OPTION_EXTERNAL="External"
WF_OPTION_AUTO="Auto"
WF_OPTION_ON="On"
WF_OPTION_OFF="Off"
WF_OPTION_BASIC="Basic"
WF_OPTION_ADVANCED="Advanced"
WF_LABEL_LANG="Language Code"
WF_LABEL_LANG_DESC="Language code of the element, eg: en-GB"
WF_LABEL_ID="Id"
WF_LABEL_ID_DESC="Unique identifier that distinguishes the element from others in the document."
WF_LABEL_ACCESSKEY="Access Key"
WF_LABEL_ACCESSKEY_DESC="Keyboard shortcut to access the element"
WF_LABEL_TABINDEX="Tab Index"
WF_LABEL_TABINDEX_DESC="Tab order of the element"
WF_LABEL_WIDTH="Width"
WF_LABEL_HEIGHT="Height"
WF_LABEL_ADDRESS="Address"
WF_LABEL_LONGDESC="Long Description"
WF_LABEL_LONGDESC_DESC="Url to a document containing a detailed description of the image."
WF_LABEL_ENABLE="Enable"
WF_LABEL_TEXT="Text"
WF_LABEL_OPTIONS="Options"
WF_LABEL_LINK="Link"
WF_LABEL_PLUGINS="Plugins"
WF_LABEL_PLUGIN="Plugin"
WF_LABEL_EXTENSIONS="Extensions"
WF_LABEL_EXTENSION="Extension"
WF_LABEL_TYPE="Type"
WF_LABEL_TYPE_DESC="Media Type"
WF_LABEL_USERNAME="Username"
WF_LABEL_PASSWORD="Password"
WF_LABEL_ERROR="Error"
WF_LABEL_ROOT="Root"
WF_MESSAGE_TREE="Building Tree List..."
WF_MESSAGE_LOAD="Loading..."
WF_LABEL_HOME="Home"
WF_ALERT_DELETE="Delete Selected Item(s)?"
WF_ALERT_RENAME="Renaming files/folders will break existing links. Continue?"
WF_LABEL_ALL_FILES="All Files"
WF_LABEL_ALERT="Alert"
WF_MESSAGE_REQUIRED="The following fields are required:"
WF_LABEL_STATE="State"
WF_STATE_DESC="Set plugin state"

WF_LABEL_NEW="New"
WF_LABEL_ADD="Add"
WF_LABEL_LINKS="Links"
WF_LABEL_REMOVE="Remove"
WF_LABEL_UPDATE="Update"
WF_LABEL_VALUE="Value"
WF_LABEL_OR="Or"
WF_LABEL_NAME="Name"

WF_OPTION_DEFAULT="Default"
WF_OPTION_INHERIT="Inherit"
WF_OPTION_HIDE="Hide"
WF_OPTION_IMAGE="Image"
WF_OPTION_SHOW="Show"
WF_OPTION_TEXT="Text"
WF_OPTION_STATE="State"
WF_OPTION_INHERIT="Inherit"
WF_OPTION_WEBSAFE_ALLOW_SPACES_UNDERSCORE="Replace with an underscore _"
WF_OPTION_WEBSAFE_ALLOW_SPACES_DASH="Replace with a dash -"
WF_OPTION_WEBSAFE_ALLOW_SPACES_PERIOD="Replace with a period ."

WF_OPTION_TEXT_LEVEL_ELEMENTS="Text-level Elements"
WF_OPTION_GROUPING_ELEMENTS="Grouping Elements"
WF_OPTION_SECTION_ELEMENTS="Section Elements"
WF_STYLEFORMAT_ELEMENT="Tag"
WF_STYLEFORMAT_ELEMENT_DESC="Tag that the style creates, eg: span. Select 'None' to apply format to the selected tag"
WF_STYLEFORMAT_STYLES="Styles"
WF_STYLEFORMAT_STYLES_DESC="Optional list of CSS styles to apply, separated by a semi-colon eg: color:#ff0000;font-weight:bold"
WF_STYLEFORMAT_TITLE="Title"
WF_STYLEFORMAT_TITLE_DESC="Title of the format option (Required)"
WF_STYLEFORMAT_CLASSES="Classes"
WF_STYLEFORMAT_CLASSES_DESC="Optional list of classes the format will apply, separated by a space, eg: class1 class2 class3"
WF_STYLEFORMAT_ATTRIBUTES="Attributes"
WF_STYLEFORMAT_ATTRIBUTES_DESC="List of attributes to apply, in a name/value format, separated by a space, eg: title='Example' data-value='true'"
WF_STYLEFORMAT_SELECTOR="Element Selector"
WF_STYLEFORMAT_SELECTOR_DESC="Apply the format to elements matching this CSS element selector only, eg: img,a,span Leave blank for all."
WF_STYLEFORMAT_NEW="Add new style..."
WF_OPTION_SELECTED_ELEMENT="None (Apply to selected Tag)"
WF_OPTION_UPPERCASE="UPPERCASE"
WF_OPTION_LOWERCASE="lowercase"
WF_OPTION_FORM_ELEMENTS="Form Elements"

WF_LABEL_FONTS="Fonts"

WF_OPTION_RELATIVE="Relative"
WF_OPTION_ABSOLUTE="Absolute"

WF_LABEL_LOADING="Loading"
WF_LABEL_LOADING_DESC="Indicates how the browser should load the image: <ul><li>Eager: Loads the image immediately, regardless of whether or not the image is currently within the visible viewport (this is the default value).</li><li>Lazy: Defers loading the image until it reaches a calculated distance from the viewport, as defined by the browser.</li></ul>"
WF_OPTION_LOADING_LAZY="Lazy"
WF_OPTION_LOADING_EAGER="Eager"

WF_LABEL_ENABLE_FILEBROWSER="Enable File Browser"
WF_LABEL_ENABLE_FILEBROWSER_DESC="Show a File Browser icon in the URL field. Clicking on the icon will open the File Browser and allow the user to manage files, and select a file to insert."

WF_LABEL_BOOLEAN="Boolean"
WF_LABEL_FOLDER_UP="Up"
wF_LABEL_GRID_SIZE="Grid Size"
WF_LABEL_GRID_SIZE_INCREASE="Increase Grid Size"
WF_LABEL_GRID_SIZE_DECREASE="Decrease Grid Size"

WF_LABEL_CUSTOM_CLASSES="Custom Classes"
WF_LABEL_CUSTOM_CLASSES_DESC="A list of class names to use for the Classes list instead classes extracted from the site's template stylesheets. Classes listed must be defined in the template stylesheets."

;#################### Position (Border, Margin, Padding etc) ################################
WF_OPTION_LEFT="Left"
WF_OPTION_RIGHT="Right"
WF_OPTION_TOP_LEFT="Top Left"
WF_OPTION_TOP_RIGHT="Top Right"
WF_OPTION_BOTTOM_LEFT="Bottom Left"
WF_OPTION_BOTTOM_RIGHT="Bottom Right"

;#################### Target ################################
WF_LABEL_TARGET="Target"
WF_LABEL_TARGET_DESC="Specifies where the link destination document will be loaded."
WF_OPTION_TARGET_SELF="Open in current window / frame"
WF_OPTION_TARGET_PARENT="Open in parent window / frame"
WF_OPTION_TARGET_TOP="Open in top frame (replaces all frames)"
WF_OPTION_TARGET_BLANK="Open in new window"

;#################### Clear ################################
WF_LABEL_CLEAR="Clear"
WF_LABEL_CLEAR_DESC="Sides of the element where other elements cannot be situated."
WF_OPTION_CLEAR_LEFT="Left"
WF_OPTION_CLEAR_RIGHT="Right"
WF_OPTION_CLEAR_BOTH="Both"
WF_OPTION_CLEAR_NONE="None"

;#################### Language Direction ################################
WF_LABEL_DIR="Language Direction"
WF_LABEL_DIR_DESC="Text direction of the element"
WF_OPTION_LTR="Left to Right"
WF_OPTION_RTL="Right to Left"

;#################### Buttons ################################
WF_BUTTON_HELP="Help"
WF_BUTTON_INSERT="Insert"
WF_BUTTON_CANCEL="Cancel"
WF_BUTTON_REFRESH="Refresh"
WF_BUTTON_UPLOAD="Upload"
WF_BUTTON_FOLDER_NEW="New Folder"
WF_BUTTON_DELETE="Delete"
WF_BUTTON_RENAME="Rename"
WF_BUTTON_COPY="Copy"
WF_BUTTON_CUT="Cut"
WF_BUTTON_PASTE="Paste"
WF_BUTTON_VIEW="View"
WF_BUTTON_FILE_INSERT="Insert"

;#################### Plugin Tabs ################################
WF_TAB_GENERAL="General"
WF_TAB_ADVANCED="Advanced"
WF_TAB_POPUP="Popup"
WF_TAB_POPUPS="Popups"

;#################### Popups ################################
WF_POPUPS="Popups"
WF_POPUP_ENABLE="Enable Popup"
WF_POPUP_ENABLE_DESC="Click to enable popups. Additional 3rd party plugins may be required."
WF_POPUP_TYPE_DESC="Select Popup Type from available options"
WF_POPUP_TYPE="Popup Type"
WF_POPUP_TYPE_SELECT="Select Type"
WF_POPUP_MEDIABOX="Requires <a href='http://www.joomlacontenteditor.net/mediabox' title='JCE MediaBox' target='_blank'><strong>JCE MediaBox</strong></a>"
WF_POPUP_TEXT_DESC="If no content selection is made or if the selection is plain text, enter new text or edit the text for the link here"
WF_POPUP_TEXT="Text"

;#################### Manager Help ################################
WF_MANAGER_HELP="Manager Help"
WF_MANAGER_HELP_UPLOAD="Upload a file"
WF_MANAGER_HELP_DELETE="Delete a file / folder"
WF_MANAGER_HELP_RENAME="Rename a file / folder"
WF_MANAGER_HELP_CREATE="Create a folder"

;#################### Manager Errors ################################
WF_MANAGER_NEW_FOLDER_ERROR="Unable to create folder - '%s'"
WF_MANAGER_MOVE_FILES_ERROR="Unable to move item - '%s'"
WF_MANAGER_COPY_FILES_ERROR="Unable to copy item - '%s'"
WF_MANAGER_RENAME_FILES_ERROR="Unable to rename file - '%s'"
WF_MANAGER_RENAME_FOLDERS_ERROR="Unable to rename folder - '%s'"
WF_MANAGER_DELETE_FOLDERS_ERROR="Unable to delete folder - '%s'"
WF_MANAGER_DELETE_FILES_ERROR="Unable to delete file - '%s'"
WF_MANAGER_UPLOAD_ERROR="Upload failed!"
WF_MANAGER_UPLOAD_NOSUPPORT="Upload method not supported"
WF_MANAGER_FOLDER_NOT_EMPTY="Unable to delete folder - '%s'. Folder not empty"
WF_MANAGER_FOLDER_EXISTS="A folder with the name '%s' already exists"
WF_MANAGER_FILE_EXISTS="A file with the name '%s' already exists in this folder"

WF_MANAGER_UPLOAD_INVALID_EXT_ERROR="Upload failed : Invalid file type"
WF_MANAGER_UPLOAD_INVALID_IMAGE_ERROR="Upload failed : Not a valid image file."
WF_MANAGER_UPLOAD_RESTRICTED_ERROR="Upload failed : Restricted"
WF_MANAGER_UPLOAD_MIME_ERROR="Upload failed: Invalid Mime Type"

WF_MANAGER_COPY_INTO_ERROR="Unable to copy folder - Folders cannot be copied into themselves."
WF_MANAGER_UPLOAD_SIZE_ERROR="Upload failed - %s (%s Kb) exceeds the maximum allowed size of %s Kb"

WF_MANAGER_FILE_LIMIT_ERROR="File limit reached."
WF_MANAGER_FILE_SIZE_LIMIT_ERROR="Size limit reached."
WF_MANAGER_UPLOAD_EXIF_REMOVE_ERROR="Upload failed: Exif data could not be removed from this image."

;#################### Manager File suffix ################################
WF_MANAGER_FILE_SUFFIX="_copy"

;#################### Extensions ################################
WF_LABEL_EXTENSION_ENABLE="Enable"
WF_LABEL_EXTENSION_ENABLE_DESC="Enable this extension for the plugin"
WF_EXTENSIONS_LINKS_TITLE="Links"
WF_EXTENSIONS_LINKS_DESC="Link Extensions"
WF_EXTENSIONS_POPUPS_TITLE="Popups"
WF_EXTENSIONS_POPUPS_DESC="Popup Extensions"
WF_EXTENSIONS_FILESYSTEM_TITLE="Filesystem"
WF_EXTENSIONS_FILESYSTEM_TITLE_DESC="Filesystem used for File Browser"
WF_FILESYSTEM_PARAMETERS="FileSystem Parameters"
WF_FILESYSTEM_JOOMLA_TITLE="Joomla! (Default)"
WF_FILESYSTEM_JOOMLA_DESC="Native Joomla! Filesystem functions"
WF_EXTENSIONS_AGGREGATOR_TITLE="Media Options"
WF_EXTENSIONS_AGGREGATOR_DEFAULT_DESC="Select and set options for various media sources"
WF_EXTENSIONS_POPUPS_DEFAULT_LABEL="Default"
WF_EXTENSIONS_POPUPS_DEFAULT_DESC="Select the default Popup type to use. Selecting a default will enable and create popups of this type for all new links."

;## JCE JoomlaLinks ##
WF_LINKS_JOOMLALINKS_TITLE="Joomla! Links"
WF_LINKS_JOOMLALINKS_DESC="Adds Joomla! Content, Menu, WebLink and Contact links to the Link Browser."
WF_LINKS_JOOMLALINKS_MENU="Menu"
WF_LINKS_JOOMLALINKS_CONTENT="Content"
WF_LINKS_JOOMLALINKS_UNCATEGORIZED="Uncategorized"
WF_LINKS_JOOMLALINKS_WEBLINKS="Weblinks"
WF_LINKS_JOOMLALINKS_TAGS="Tags"
WF_LINKS_JOOMLALINKS_CONTACTS="Contacts"
WF_LINKS_JOOMLALINKS_PARAM_CONTENT="Content List"
WF_LINKS_JOOMLALINKS_PARAM_CONTENT_DESC="Show Content Links List"
WF_LINKS_JOOMLALINKS_PARAM_UNCATEGORIZED="Uncategorized List"
WF_LINKS_JOOMLALINKS_PARAM_UNCATEGORIZED_DESC="Show Uncategorized Links List"
WF_LINKS_JOOMLALINKS_PARAM_MENU="Menu List"
WF_LINKS_JOOMLALINKS_PARAM_MENU_DESC="Show Menu Links List"
WF_LINKS_JOOMLALINKS_PARAM_CONTACT="Contact List"
WF_LINKS_JOOMLALINKS_PARAM_CONTACT_DESC="Show Contacts Links List"
WF_LINKS_JOOMLALINKS_PARAM_WEBLINKS="Weblinks List"
WF_LINKS_JOOMLALINKS_PARAM_WEBLINKS_DESC="Show Weblinks Links List"
WF_LINKS_JOOMLALINKS_PARAM_TAGS="Tags List"
WF_LINKS_JOOMLALINKS_PARAM_TAGS_DESC="Show Tags Links List"
WF_LINKS_JOOMLALINKS_PARAM_ARTICLE_ALIAS="Add Article Alias"
WF_LINKS_JOOMLALINKS_PARAM_ARTICLE_ALIAS_DESC="Add alias to article links"
WF_LINKS_JOOMLALINKS_PARAM_ARTICLE_MENU_LINK="Resolve Menu Links"
WF_LINKS_JOOMLALINKS_PARAM_ARTICLE_MENU_LINK_DESC="Resolve menu alias links eg: index.php?Itemid=30 to the full menu link if available. Default is No."
WF_LINKS_JOOMLALINKS_PARAM_WEBLINKS_ALIAS="Add Weblinks Alias"
WF_LINKS_JOOMLALINKS_PARAM_WEBLINKS_ALIAS_DESC="Add alias to weblink links"
WF_LINKS_JOOMLALINKS_PARAM_ARTICLE_UNPUBLISHED="Show unpublished"
WF_LINKS_JOOMLALINKS_PARAM_ARTICLE_UNPUBLISHED_DESC="Show published and unpublished articles"
WF_LINKS_JOOMLALINKS_PARAM_TAGS_ALIAS="Add Tags Alias"
WF_LINKS_JOOMLALINKS_PARAM_TAGS_ALIAS_DESC="Add alias to tag links"

WF_LINKS_JOOMLALINKS_SEF_URL="Convert to SEF"
WF_LINKS_JOOMLALINKS_SEF_URL_DESC="URLs are converted to SEF URLs where possible. As this option can have long term consequences with content storage (the SEF URL will be stored with the article content in the database and will not be automatically updated when changes are made to SEF settings), it is not recommended for most users."

WF_LINKS_JOOMLALINKS_ITEMID="Include ItemId"
WF_LINKS_JOOMLALINKS_ITEMID_DESC="Include the ItemId (the menu associated with the link) in the link URL."

; ## JCE MediaBox ##
WF_POPUPS_JCEMEDIABOX_TITLE="JCE MediaBox Popups"
WF_POPUPS_JCEMEDIABOX_DESC="Create and editor popup links for JCE MediaBox"

WF_POPUPS_JCEMEDIABOX_OPTION_TITLE="Title"
WF_POPUPS_JCEMEDIABOX_OPTION_TITLE_DESC="Title for the popup"
WF_POPUPS_JCEMEDIABOX_CAPTION="Caption"
WF_POPUPS_JCEMEDIABOX_CAPTION_DESC="Caption for the popup."
WF_POPUPS_JCEMEDIABOX_GROUP="Group"
WF_POPUPS_JCEMEDIABOX_GROUP_DESC="Group to associate this popup with. Popups in the same group will be shown as a gallery."
WF_POPUPS_JCEMEDIABOX_PARAMS="Parameters"
WF_POPUPS_JCEMEDIABOX_PARAMS_DESC="Set additional parameters for the popup or popup content. A parameter name and value are required. Click the Add button to add parameters and the remove button to remove them."
WF_POPUPS_JCEMEDIABOX_DIMENSIONS="Dimensions"
WF_POPUPS_JCEMEDIABOX_DIMENSIONS_DESC="Width / Height of the popup window in pixels. Omit either or both values to use fullscreen dimensions."
WF_POPUPS_JCEMEDIABOX_ICON="Popup Icon"
WF_POPUPS_JCEMEDIABOX_ICON_DESC="Enable / Disable display of popup icon on target item"
WF_POPUPS_JCEMEDIABOX_ICON_POSITION="Icon Position"
WF_POPUPS_JCEMEDIABOX_ICON_POSITION_DESC="Position of the popup icon on the target item. If target item is a text link, position is limited to left / right."
WF_POPUPS_JCEMEDIABOX_ICON_TOP_LEFT="Top Left"
WF_POPUPS_JCEMEDIABOX_ICON_BOTTOM_LEFT="Bottom Left"
WF_POPUPS_JCEMEDIABOX_ICON_TOP_RIGHT="Top Right"
WF_POPUPS_JCEMEDIABOX_ICON_BOTTOM_RIGHT="Bottom Right"
WF_POPUPS_JCEMEDIABOX_UTILITIES_REQUIRED="The JCE Utilities plugin must be installed and enabled to use the Popup feature."
WF_POPUPS_JCEMEDIABOX_AUTO="Auto Popup"
WF_POPUPS_JCEMEDIABOX_AUTO_DESC="Popup will open automatically on page load based on the selected setting.<br />Single - open once per browser session.<br /> Multiple - open on every page load."
WF_POPUPS_JCEMEDIABOX_AUTO_SINGLE="Single"
WF_POPUPS_JCEMEDIABOX_AUTO_MULTIPLE="Multiple"
WF_POPUPS_JCEMEDIABOX_HIDE="Hide Popup Link"
WF_POPUPS_JCEMEDIABOX_HIDE_DESC="Hides the popup link and child elements. Useful when creating image galleries launched from a single link."
WF_POPUPS_JCEMEDIABOX_MEDIATYPE="Media Type"
WF_POPUPS_JCEMEDIABOX_MEDIATYPE_DESC="Select Popup Media Type. This is crucial in determining how the popup will load. Some formats such as images and social media like Youtube and Vimeo etc. can be detected from the popup url by JCE MediaBox"
WF_POPUPS_JCEMEDIABOX_IMAGE="Image"
WF_POPUPS_JCEMEDIABOX_INTERNAL="Internal Links"
WF_POPUPS_JCEMEDIABOX_EXTERNAL="External Links / IFrame"
WF_POPUPS_JCEMEDIABOX_FLASH="Adobe® Flash®"
WF_POPUPS_JCEMEDIABOX_QUICKTIME="Quicktime®"
WF_POPUPS_JCEMEDIABOX_WINDOWSMEDIA="Windows Media Player®"
WF_POPUPS_JCEMEDIABOX_DIRECTOR="Adobe® Shockwave®"
WF_POPUPS_JCEMEDIABOX_REAL="RealPlayer®"
WF_POPUPS_JCEMEDIABOX_SILVERLIGHT="Silverlight®"
WF_POPUPS_JCEMEDIABOX_DIVX="DivX®"
WF_POPUPS_JCEMEDIABOX_VIDEO_MP4="MP4 Video"
WF_POPUPS_JCEMEDIABOX_VIDEO_WEBM="WebM Video"
WF_POPUPS_JCEMEDIABOX_AUDIO_MP3="MP3 Audio"
WF_POPUPS_JCEMEDIABOX_AUDIO_WEBM="WebM Audio"
WF_POPUPS_JCEMEDIABOX_YOUTUBE="Youtube Video"
WF_POPUPS_JCEMEDIABOX_VIMEO="Vimeo Video"
WF_POPUPS_JCEMEDIABOX_VERSION_ERROR="Version %s or later of the <a href='http://www.joomlacontenteditor.net/downloads/mediabox' target='_blank' title='JCE MediaBox'>JCE MediaBox System Plugin</a> is required"

WF_AGGREGATOR_MORE_OPTIONS="Additional Options"

; ## Youtube Aggregator ##
WF_AGGREGATOR_YOUTUBE_TITLE="Youtube"
WF_AGGREGATOR_YOUTUBE_DESC="Youtube - External Media Resource"
WF_AGGREGATOR_YOUTUBE_CONTROLS="Show Controls"
WF_AGGREGATOR_YOUTUBE_CONTROLS_DESC="Show Player Controls"
WF_AGGREGATOR_YOUTUBE_RELATED="Related Videos"
WF_AGGREGATOR_YOUTUBE_RELATED_DESC="Select the scope of related videos to show when the video finishes."
WF_AGGREGATOR_YOUTUBE_RELATED_ALL="Any related videos"
WF_AGGREGATOR_YOUTUBE_RELATED_CHANNEL="Same channel only"
WF_AGGREGATOR_YOUTUBE_MODESTBRANDING="Modest Branding"
WF_AGGREGATOR_YOUTUBE_MODESTBRANDING_DESC="This parameter lets you use a YouTube player that does not show a YouTube logo. Check this option to prevent the YouTube logo from displaying in the control bar. Note that a small YouTube text label will still display in the upper-right corner of a paused video when the user's mouse pointer hovers over the player."
WF_AGGREGATOR_YOUTUBE_PRIVACY="Privacy-enhanced mode"
WF_AGGREGATOR_YOUTUBE_PRIVACY_DESC="Privacy-enhanced mode allows you to embed YouTube videos without using cookies that track viewing behaviour. See - <a href='https://support.google.com/youtube/answer/171780?hl=en-GB#zippy=%2Cturn-on-privacy-enhanced-mode' target='_blank'>Privacy-enhanced mode</a>"
WF_AGGREGATOR_YOUTUBE_AUTOPLAY="Autoplay"
WF_AGGREGATOR_YOUTUBE_AUTOPLAY_DESC="Sets whether or not the initial video will autoplay when the player loads"
WF_AGGREGATOR_YOUTUBE_LOOP="Loop"
WF_AGGREGATOR_YOUTUBE_LOOP_DESC="In the case of a single video player, checking this option will cause the player to play the initial video again and again. In the case of a playlist player (or custom player), the player will play the entire playlist and then start again at the first video."
WF_AGGREGATOR_YOUTUBE_PLAYLIST="Playlist"
WF_AGGREGATOR_YOUTUBE_PLAYLIST_DESC="Value is a comma-separated list of video IDs to play. If you specify a value, the first video that plays will be the VIDEO_ID specified in the URL path, and the videos specified in the playlist parameter will play thereafter."
WF_AGGREGATOR_YOUTUBE_START="Start"
WF_AGGREGATOR_YOUTUBE_START_DESC="This parameter causes the player to begin playing the video at the given number of seconds from the start of the video"
WF_AGGREGATOR_YOUTUBE_END="End"
WF_AGGREGATOR_YOUTUBE_END_DESC="This parameter specifies the time, measured in seconds from the start of the video, when the player should stop playing the video"
WF_AGGREGATOR_YOUTUBE_WIDTH_DESC="Default Width to use for the Video"
WF_AGGREGATOR_YOUTUBE_HEIGHT_DESC="Default Height to use for the Video"
WF_AGGREGATOR_YOUTUBE_PARAMS="Parameters"
WF_AGGREGATOR_YOUTUBE_PARAMS_DESC="Additional parameters for the video"
WF_AGGREGATOR_YOUTUBE_MUTE="Mute"
WF_AGGREGATOR_YOUTUBE_MUTE_DESC="Sets whether or not the initial video will be muted when the player loads"

; ## Vimeo Aggregator ##
WF_AGGREGATOR_VIMEO_TITLE="Vimeo"
WF_AGGREGATOR_VIMEO_DESC="Vimeo - External Media Resource"
WF_AGGREGATOR_VIMEO_COLOR="Colour"
WF_AGGREGATOR_VIMEO_COLOR_DESC="Player Colour"
WF_AGGREGATOR_VIMEO_EMBED="Use Old Embed Method"
WF_AGGREGATOR_VIMEO_EMBED_DESC="Embed Vimeo video using OBJECT and EMBED elements instead of IFrame"
WF_AGGREGATOR_VIMEO_AUTOPLAY="Autoplay"
WF_AGGREGATOR_VIMEO_AUTOPLAY_DESC="Sets whether or not the initial video will autoplay when the player loads"
WF_AGGREGATOR_VIMEO_LOOP="Loop"
WF_AGGREGATOR_VIMEO_LOOP_DESC="Checking this option will cause the player to play the video again and again."
WF_AGGREGATOR_VIMEO_FULLSCREEN="Fullscreen"
WF_AGGREGATOR_VIMEO_FULLSCREEN_DESC="Allow Fullscreen option"
WF_AGGREGATOR_VIMEO_BYLINE="Byline"
WF_AGGREGATOR_VIMEO_BYLINE_DESC="Show Intro Byline"
WF_AGGREGATOR_VIMEO_PORTRAIT="Portrait"
WF_AGGREGATOR_VIMEO_PORTRAIT_DESC="Show Intro Portrait"
WF_AGGREGATOR_VIMEO_INTROTITLE="Title"
WF_AGGREGATOR_VIMEO_INTROTITLE_DESC="Show Intro Title"
WF_AGGREGATOR_VIMEO_INTRO="Intro Options"
WF_AGGREGATOR_VIMEO_INTRO_DESC="Show Into Options"
WF_AGGREGATOR_VIMEO_WIDTH_DESC="Default Width to use for the Video"
WF_AGGREGATOR_VIMEO_HEIGHT_DESC="Default Height to use for the Video"
WF_AGGREGATOR_VIMEO_SPECIAL="Special stuff"
WF_AGGREGATOR_VIMEO_DNT="Do Not Track"
WF_AGGREGATOR_VIMEO_DNT_DESC="Whether to prevent the player from tracking session data, including cookies. Setting this argument to true also blocks video stats."

; ## Dailymotion Aggregator
WF_AGGREGATOR_DAILYMOTION_TITLE="Dailymotion"
WF_AGGREGATOR_DAILYMOTION_DESC="Dailymotion - External Media Resource"
WF_AGGREGATOR_DAILYMOTION_SIZE="Player size"
WF_AGGREGATOR_DAILYMOTION_START="Start at"
WF_AGGREGATOR_DAILYMOTION_AUTOPLAY="Autoplay"
WF_AGGREGATOR_DAILYMOTION_SIZE_SMALL="Small (320 x 180)"
WF_AGGREGATOR_DAILYMOTION_SIZE_MEDIUM="Medium (480 x 270)"
WF_AGGREGATOR_DAILYMOTION_SIZE_LARGE="Large (560 x 315)"
WF_AGGREGATOR_DAILYMOTION_SIZE_CUSTOM="Custom Width"

; ## Video Options
WF_AGGREGATOR_VIDEO_TITLE="HTML5 Video"
WF_AGGREGATOR_VIDEO_AUTOPLAY="Autoplay"
WF_AGGREGATOR_VIDEO_AUTOPLAY_DESC="Sets whether or not the video will autoplay when the player loads"
WF_AGGREGATOR_VIDEO_LOOP="Loop"
WF_AGGREGATOR_VIDEO_LOOP_DESC="Checking this option will cause the player to play the video again and again."
WF_AGGREGATOR_VIDEO_CONTROLS="Show Controls"
WF_AGGREGATOR_VIDEO_CONTROLS_DESC="Show Player Controls"
WF_AGGREGATOR_VIDEO_MUTE="Mute"
WF_AGGREGATOR_VIDEO_MUTE_DESC="Set the video volume to off (muted)"
WF_AGGREGATOR_VIDEO_WIDTH_DESC="Default Width to use for the Video"
WF_AGGREGATOR_VIDEO_HEIGHT_DESC="Default Height to use for the Video"

; ## Audio Options
WF_AGGREGATOR_AUDIO_TITLE="HTML5 Audio"
WF_AGGREGATOR_AUDIO_AUTOPLAY="Autoplay"
WF_AGGREGATOR_AUDIO_AUTOPLAY_DESC="Sets whether or not the audio will autoplay when the player loads"
WF_AGGREGATOR_AUDIO_LOOP="Loop"
WF_AGGREGATOR_AUDIO_LOOP_DESC="Checking this option will cause the player to play the audio again and again."
WF_AGGREGATOR_AUDIO_CONTROLS="Show Controls"
WF_AGGREGATOR_AUDIO_CONTROLS_DESC="Show Player Controls"
WF_AGGREGATOR_AUDIO_MUTE="Mute"
WF_AGGREGATOR_AUDIO_MUTE_DESC="Set the audio volume to off (muted)"

; ## ACL Permissions ##
JACTION_ADMIN="Configure Component"
JACTION_ADMIN_COMPONENT_DESC="Allow users in this group to edit the Permissions options for this extension"
JACTION_MANAGE="Access Component"
JACTION_MANAGE_COMPONENT_DESC="Allow users in this group to access this extension"
WF_ACTION_CONFIG="Editor Global Configuration"
WF_ACTION_CONFIG_DESC="Allow users in this group to access and edit the Editor Global Configuration"
WF_ACTION_PROFILES="Editor Profiles"
WF_ACTION_PROFILES_DESC="Allow users in this group to access and edit Editor Profiles"
WF_ACTION_PREFERENCES="Administration Options"
WF_ACTION_PREFERENCES_DESC="Allow users in this group to access and edit the Administration Options"
WF_ACTION_INSTALLER="Install Add-ons"
WF_ACTION_INSTALLER_DESC="Allow users in this group to Install Add-ons"
WF_ACTION_BROWSER="File Browser"
WF_ACTION_BROWSER_DESC="Allow users in this group to access the File Browser"
WF_ACTION_MEDIABOX="JCE MediaBox Parameters"
WF_ACTION_MEDIABOX_DESC="Allow users in this group to access the MediaBox Parameters"
WF_RULES_ACTION="Action"
WF_RULES_ALLOWED="Allowed"
WF_RULES_DENIED="Denied"
WF_RULES_GROUP="%s"
WF_RULES_GROUPS="Groups"
WF_RULES_NOT_SET="Not Set"
WF_RULES_SELECT_ALLOW_DENY_GROUP="Allow or deny %s for users in the %s group"
WF_RULES_SELECT_SETTING="Select New Setting"
WF_RULES_SETTINGS_DESC="Manage the permission settings for the user groups below"

; ## Filegroups && Trademark Labels ##
WF_FILEGROUP_ALL="All Files"
WF_FILEGROUP_IMAGE="Images"
WF_FILEGROUP_HTML="HTML Files"
WF_FILEGROUP_ARCHIVE="Archive Files"
WF_FILEGROUP_TEXT="Text Files"
WF_FILEGROUP_VIDEO="Video"
WF_FILEGROUP_AUDIO="Audio"
WF_FILEGROUP_ACROBAT="Adobe® Acrobat®"
WF_FILEGROUP_EXCEL="Microsoft Excel®"
WF_FILEGROUP_WORD="Microsoft Word®"
WF_FILEGROUP_POWERPOINT="Microsoft Powerpoint®"
WF_FILEGROUP_OFFICE="Microsoft Office®"
WF_FILEGROUP_FLASH="Adobe® Flash®"
WF_FILEGROUP_SHOCKWAVE="Adobe® Shockwave®"
WF_FILEGROUP_QUICKTIME="Quicktime®"
WF_FILEGROUP_WINDOWSMEDIA="Windows Media Player®"
WF_FILEGROUP_SILVERLIGHT="Silverlight®"
WF_FILEGROUP_DIVX="DivX®"
WF_FILEGROUP_OPENOFFICE="OpenOffice.org"
WF_FILEGROUP_REAL="RealPlayer®"

; ## Link Search ##
WF_EXTENSIONS_SEARCH_TITLE="Search"
WF_EXTENSIONS_SEARCH_DEFAULT=""

WF_SEARCH_ALL_WORDS="All words"
WF_SEARCH_ALPHABETICAL="Alphabetical"
WF_SEARCH_ANY_WORDS="Any words"
WF_SEARCH_ERROR_ENTERKEYWORD="Enter a search keyword"
WF_SEARCH_ERROR_IGNOREKEYWORD="One or more common words were ignored in the search."
WF_SEARCH_ERROR_SEARCH_MESSAGE="Search term must be a minimum of %1$s characters and a maximum of %2$s characters."
WF_SEARCH_EXACT_PHRASE="Exact Phrase"
WF_SEARCH_FIELD_SEARCH_AREAS_DESC="Show the search areas checkboxes"
WF_SEARCH_FIELD_SEARCH_AREAS_LABEL="Use Search Areas"
WF_SEARCH_FOR="Search for:"
WF_SEARCH_MOST_POPULAR="Most Popular"
WF_SEARCH_NEWEST_FIRST="Newest First"
WF_SEARCH_OLDEST_FIRST="Oldest First"
WF_SEARCH_ORDERING="Ordering:"
WF_SEARCH_SEARCH="Search"
WF_SEARCH_SEARCH_AGAIN="Search Again"
WF_SEARCH_SEARCH_KEYWORD="Search Keyword:"
WF_SEARCH_SEARCH_KEYWORD_N_RESULTS="<strong>Total: %s results found.</strong>"
WF_SEARCH_SEARCH_ONLY="Search Only:"
WF_SEARCH_SEARCH_RESULT="Search Result"
WF_CATEGORY="Category"
WF_LINK_SEARCH_TITLE="Link Search"
WF_SEARCH_LINK_TITLE="Link Search"
WF_LINK_SEARCH_DESC="Search for links and anchors in Joomla! Extensions"
WF_PARAM_LINK_SEARCH_PLUGINS="Link Search Plugins"
WF_PARAM_LINK_SEARCH_PLUGINS_DESC="Joomla! Search Plugins available to Link Search"
WF_LINK_SEARCH_SEF_URL="Convert to SEF"
WF_LINK_SEARCH_SEF_URL_DESC="URLs returned in the search are converted to SEF URLs where possible. As this option can have long term consequences with content storage (the SEF URL will be stored with the article content in the database and will not be automatically updated when changes are made to SEF settings), it is not recommended for most users."
WF_LINK_SEARCH_ITEMID="Include ItemId"
WF_LINK_SEARCH_ITEMID_DESC="Include the ItemId (the menu associated with the link) in the link URL."
ALERTNOTAUTH="You are not authorised to view this resource."

WF_LINK_HELP_BUTTON="Help Button"
WF_LINK_HELP_BUTTON_DESC="Show the Help button in the Link dialog"

; Styles
WF_STYLES_TITLE="Edit CSS Style"
WF_STYLES_APPLY="Apply"
WF_STYLES_TEXT_TAB="Text"
WF_STYLES_BACKGROUND_TAB="Background"
WF_STYLES_BLOCK_TAB="Block"
WF_STYLES_BOX_TAB="Box"
WF_STYLES_BORDER_TAB="Border"
WF_STYLES_LIST_TAB="List"
WF_STYLES_POSITIONING_TAB="Positioning"
WF_STYLES_TEXT_PROPS="Text"
WF_STYLES_TEXT_FONT="Font"
WF_STYLES_TEXT_SIZE="Size"
WF_STYLES_TEXT_WEIGHT="Weight"
WF_STYLES_TEXT_STYLE="Style"
WF_STYLES_TEXT_VARIANT="Variant"
WF_STYLES_TEXT_LINEHEIGHT="Line height"
WF_STYLES_TEXT_CASE="Case"
WF_STYLES_TEXT_COLOR="Color"
WF_STYLES_TEXT_DECORATION="Decoration"
WF_STYLES_TEXT_OVERLINE="overline"
WF_STYLES_TEXT_UNDERLINE="underline"
WF_STYLES_TEXT_STRIKETROUGH="strikethrough"
WF_STYLES_TEXT_BLINK="blink"
WF_STYLES_TEXT_NONE="none"
WF_STYLES_BACKGROUND_COLOR="Background color"
WF_STYLES_BACKGROUND_IMAGE="Background image"
WF_STYLES_BACKGROUND_REPEAT="Repeat"
WF_STYLES_BACKGROUND_ATTACHMENT="Attachment"
WF_STYLES_BACKGROUND_HPOS="Horizontal position"
WF_STYLES_BACKGROUND_VPOS="Vertical position"
WF_STYLES_BLOCK_WORDSPACING="Word spacing"
WF_STYLES_BLOCK_LETTERSPACING="Letter spacing"
WF_STYLES_BLOCK_VERTICAL_ALIGNMENT="Vertical alignment"
WF_STYLES_BLOCK_TEXT_ALIGN="Text align"
WF_STYLES_BLOCK_TEXT_INDENT="Text indent"
WF_STYLES_BLOCK_WHITESPACE="Whitespace"
WF_STYLES_BLOCK_DISPLAY="Display"
WF_STYLES_BOX_WIDTH="Width"
WF_STYLES_BOX_HEIGHT="Height"
WF_STYLES_BOX_FLOAT="Float"
WF_STYLES_BOX_CLEAR="Clear"
WF_STYLES_PADDING="Padding"
WF_STYLES_SAME="Same for all"
WF_STYLES_TOP="Top"
WF_STYLES_RIGHT="Right"
WF_STYLES_BOTTOM="Bottom"
WF_STYLES_LEFT="Left"
WF_STYLES_MARGIN="Margin"
WF_STYLES_STYLE="Style"
WF_STYLES_WIDTH="Width"
WF_STYLES_HEIGHT="Height"
WF_STYLES_COLOR="Color"
WF_STYLES_LIST_TYPE="Type"
WF_STYLES_BULLET_IMAGE="Bullet image"
WF_STYLES_POSITION="Position"
WF_STYLES_POSITIONING_TYPE="Type"
WF_STYLES_VISIBILITY="Visibility"
WF_STYLES_ZINDEX="Z-index"
WF_STYLES_OVERFLOW="Overflow"
WF_STYLES_PLACEMENT="Placement"
WF_STYLES_CLIP="Clip"
WF_STYLES_TOGGLE_INSERT_SPAN="Insert span at selection"

; Tables
WF_TABLE_GENERAL_TAB="General"
WF_TABLE_ADVANCED_TAB="Advanced"
WF_TABLE_GENERAL_PROPS="General properties"
WF_TABLE_ADVANCED_PROPS="Advanced properties"
WF_TABLE_ROWTYPE="Row type"
WF_TABLE_WIDTH="Width"
WF_TABLE_HEIGHT="Height"
WF_TABLE_COLS="Cols"
WF_TABLE_ROWS="Rows"
WF_TABLE_CELLSPACING="Cellspacing"
WF_TABLE_CELLPADDING="Cellpadding"
WF_TABLE_BORDER="Border"
WF_TABLE_ALIGN="Alignment"
WF_TABLE_ALIGN_DESC="Alignment of the table"
WF_TABLE_ALIGN_DEFAULT="Default"
WF_TABLE_ALIGN_LEFT="Left"
WF_TABLE_ALIGN_RIGHT="Right"
WF_TABLE_ALIGN_MIDDLE="Center"
WF_TABLE_ROW_TITLE="Table row properties"
WF_TABLE_CELL_TITLE="Table cell properties"
WF_TABLE_CELL_TYPE="Cell type"
WF_TABLE_VALIGN="Vertical alignment"
WF_TABLE_ALIGN_TOP="Top"
WF_TABLE_ALIGN_BOTTOM="Bottom"
WF_TABLE_BORDERCOLOR="Border color"
WF_TABLE_BGCOLOR="Background color"
WF_TABLE_MERGE_CELLS_TITLE="Merge table cells"
WF_TABLE_ID="Id"
WF_TABLE_STYLE="Style"
WF_TABLE_LANGDIR="Language direction"
WF_TABLE_LANGCODE="Language code"
WF_TABLE_MIME="Target MIME type"
WF_TABLE_LTR="Left to right"
WF_TABLE_RTL="Right to left"
WF_TABLE_BGIMAGE="Background image"
WF_TABLE_SUMMARY="Summary"
WF_TABLE_TD="Data"
WF_TABLE_TH="Header"
WF_TABLE_CELL_CELL="Update current cell"
WF_TABLE_CELL_ROW="Update all cells in row"
WF_TABLE_CELL_ALL="Update all cells in table"
WF_TABLE_ROW_ROW="Update current row"
WF_TABLE_ROW_ODD="Update odd rows in table"
WF_TABLE_ROW_EVEN="Update even rows in table"
WF_TABLE_ROW_ALL="Update all rows in table"
WF_TABLE_THEAD="Table Head"
WF_TABLE_TBODY="Table Body"
WF_TABLE_TFOOT="Table Foot"
WF_TABLE_SCOPE="Scope"
WF_TABLE_ROWGROUP="Row Group"
WF_TABLE_COLGROUP="Col Group"
WF_TABLE_COL_LIMIT="You've exceeded the maximum number of columns of {$cols}."
WF_TABLE_ROW_LIMIT="You've exceeded the maximum number of rows of {$rows}."
WF_TABLE_CELL_LIMIT="You've exceeded the maximum number of cells of {$cells}."
WF_TABLE_MISSING_SCOPE="Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table."
WF_TABLE_CAPTION="Table caption"
WF_TABLE_FRAME="Frame"
WF_TABLE_FRAME_NONE="none"
WF_TABLE_FRAME_GROUPS="groups"
WF_TABLE_FRAME_ROWS="rows"
WF_TABLE_FRAME_COLS="cols"
WF_TABLE_FRAME_ALL="all"
WF_TABLE_RULES="Rules"
WF_TABLE_RULES_VOID="void"
WF_TABLE_RULES_ABOVE="above"
WF_TABLE_RULES_BELOW="below"
WF_TABLE_RULES_HSIDES="hsides"
WF_TABLE_RULES_LHS="lhs"
WF_TABLE_RULES_RHS="rhs"
WF_TABLE_RULES_VSIDES="vsides"
WF_TABLE_RULES_BOX="box"
WF_TABLE_RULES_BORDER="border"

WF_TABLE_CELL_PROPS="Table cell properties"
WF_TABLE_COL_AFTER="Insert column after"
WF_TABLE_COL_BEFORE="Insert column before"
WF_TABLE_COL_DELETE="Delete Column"
WF_TABLE_DELETE="Delete Table"
WF_TABLE_INSERT="Insert / Edit Table"
WF_TABLE_MERGE="Merge table cells"
WF_TABLE_ROW_AFTER="Insert row after"
WF_TABLE_ROW_BEFORE="Insert row before"
WF_TABLE_ROW_DELETE="Delete row"
WF_TABLE_ROW_PROPS="Table row properties"
WF_TABLE_SPLIT="Split merged table cells"
WF_TABLE_PAD_EMPTY_CELLS="Pad empty cells"
WF_TABLE_PAD_EMPTY_CELLS_DESC="Pad empty table cells with a non-breaking space. This is required to maintain the structure of empty cells and to display their border and background colour. Default is Yes."
WF_TABEL_COL="Column"
WF_TABEL_ROW="Row"

WF_TABLE_SHOW_BUTTONS="Show Buttons"
WF_TABLE_SHOW_BUTTONS_DESC="Show all table buttons in the editor toolbar. By default all buttons will be shown. If set to No, the buttons will be collapsed into a dropdown menu on the main table button."

; Reference dialog
WF_REFERENCE_TITLE="Reference"
WF_REFERENCE_DESC="Markup content with Insertion, Deletion, Acronym and Abbreviation elements."
WF_REFERENCE_DATETIME_FORMAT="Date Format"
WF_REFERENCE_DATETIME_FORMAT_DESC="A date format string for the datetime attribute. See <a href='https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats#local_date_and_time_strings' target='_blank'>|(MDN Web Docs) Date and time formats used in HTML</a> for a list of formats"

; Accessability
WF_ACCESSABILITY_USAGE_TITLE="General Usage"

WF_TAB_META="General"
WF_TAB_APPEARANCE="Appearance"

;## Styles Select ##
WF_STYLESELECT_STYLES="Styles List Options"
WF_STYLESELECT_STYLES_DESC="Select which sources to use for the Styles List items<ul><li>Editor Stylesheets - Styles extracted from stylesheets as configured in the Editor Configuration, this Editor Profile or the Custom Stylesheet field below.</li><li>Custom Styles and Classes - Custom Styles created in the <strong>Custom Styles</strong> list and classes listed in the <strong>Custom Classes</strong> field.</li></ul>"
WF_STYLESELECT_STYLESHEET="Editor Stylesheets"
WF_STYLESELECT_STYLES_CUSTOM="Custom Styles and Classes"
WF_STYLESELECT_CUSTOM="Custom Styles"
WF_STYLESELECT_CUSTOM_DESC="Create Custom Styles to add to the Styles list by specifying a title, tag and optional CSS style and class."
WF_STYLESELECT_CUSTOM_CLASSES="Custom Classes"
WF_STYLESELECT_CUSTOM_CLASSES_DESC="A comma separated list of class names to include in the Styles list."
WF_STYLESELECT_STYLES_SORT="Sort Styles Alphabetically"
WF_STYLESELECT_STYLES_SORT_DESC="Sort styles extracted from stylesheets alphabetically from A - Z"
WF_STYLESELECT_STYLES_PREVIEW_STYLES="Show Style Preview"
WF_STYLESELECT_STYLES_PREVIEW_STYLES_DESC="Show a simple styled preview of each style item in the list"
WF_STYLESELECT_STYLESHEET_CUSTOM="Custom Stylesheet"
WF_STYLESELECT_STYLESHEET_CUSTOM_DESC="A custom stylesheet containing css classes to display in the Style Select list. The classes must exist in your template stylesheet."

;## Non Editable ##
WF_NONEDITABLE_TITLE="Non-Editable Content"
WF_NONEDITABLE_DESC="Mark content as editable or non-editable using special class names: mceEditable and mceNonEditable"
WF_NONEDITABLE_NONEDITABLE_CLASS="Non-Editable Class"
WF_NONEDITABLE_NONEDITABLE_CLASS_DESC="Classname to use to mark content as non-editable. Default is <em>mceNonEditable</em>"
WF_NONEDITABLE_EDITABLE_CLASS="Editable Class"
WF_NONEDITABLE_EDITABLE_CLASS_DESC="Classname to use to mark content as editable within existing non-editable regions. Default is <em>mceEditable</em>"

;## Clipboard ##
WF_OPTION_CUT="Cut"
WF_OPTION_COPY="Copy"
WF_OPTION_PASTE="Paste"
WF_OPTION_PASTETEXT="Paste as plain text"
WF_CLIPBOARD_DESC="Cut, Copy Paste"
WF_CLIPBOARD_TITLE="Clipboard"

;## Preview ##
WF_PREVIEW_PARAM_PROCESS_CONTENT="Process Content"
WF_PREVIEW_PARAM_PROCESS_CONTENT_DESC="Process editor content through Joomla Content Plugins before displaying the preview."

WF_LOREM_IPSUM="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua."

WF_LINK_SEARCH_REMOVE_ALIAS="Remove Alias"
WF_LINK_SEARCH_REMOVE_ALIAS_DESC="Remove the alias from found links"

WF_PARAM_WORDCOUNT_LIMIT="Word Count Limit"
WF_PARAM_WORDCOUNT_LIMIT_DESC="When a limit above 0 is set, the Word Count will display the number of words of the limit remaining, showing a negative number when limit is exceeded. Set as 0 for no limit."
WF_PARAM_WORDCOUNT_ALERT="Word Count Alert"
WF_PARAM_WORDCOUNT_ALERT_DESC="Show an alert message when the word count limit is reached."

WF_CHARMAP_APPEND="Add Characters"
WF_CHARMAP_APPEND_DESC="Add characters to the Character Map using Key / Value pairs, where the Key is the Character Numeric Code, eg: &amp;#8756; and the Value is the Character Name, eg: Therefore"
WF_CHARMAP_APPEND_CODE="Code"
WF_CHARMAP_APPEND_TEXT="Description"

WF_JOOMLABUTTONS_TITLE="Joomla Editor Buttons"
WF_JOOMLABUTTONS_DESC="Display a dropdown list of Joomla Editor-Xtd buttons in the editor toolbar instead of below the editor."

WF_LANGCODE_TITLE="Language Code"
WF_LANGCODE_DESC="Set a language code on an element or selection"

;## Emotions ##
WF_EMOTIONS_TITLE="Emoticons"
WF_EMOTIONS_DESC="Insert an emotion character image"
WF_EMOTIONS_PARAM_URL="Emoticons URL"
WF_EMOTIONS_PARAM_URL_DESC="Relative URL to Emoticons image folder. Default is Emoticons plugin img folder."
WF_EMOTIONS_PARAM_SMILIES="Emoticons List"
WF_EMOTIONS_PARAM_SMILIES_DESC="Comma separated list of emoticons including extension, eg: smiley-confused.gif,smiley-cool.gif"

;## Simple Dialogs ##
WF_URL_FILE_BROWSER="Enable File Browser"
WF_URL_FILE_BROWSER_DESC="Enable access to a File Browser from the URL field to manage and select files"

WF_FILE_BROWSER_OPTIONS="File Browser Options"

WF_PARAM_BASIC_DIALOG="Use Basic Dialog"
WF_PARAM_BASIC_DIALOG_DESC="Use a simplified dialog for this plugin"

; Startup Content
WF_PARAM_STARTUP_CONTENT="Startup Content"
WF_PARAM_STARTUP_CONTENT_DESC="Select a file or some html content to be loaded into the empty editor on startup."
WF_PARAM_STARTUP_CONTENT_URL="File"
WF_PARAM_STARTUP_CONTENT_URL_DESC="A relative url of an html or text file to load as startup content."
WF_PARAM_STARTUP_CONTENT_HTML="HTML"
WF_PARAM_STARTUP_CONTENT_HTML_DESC="An HTML snippet to use as startup content."

; Search Plugins
PLG_SEARCH_CONTENT_CONTENT="Articles"
PLG_SEARCH_CATEGORIES_CATEGORIES="Categories"
PLG_SEARCH_CONTACTS_CONTACTS="Contacts"
PLG_SEARCH_TAGS_TAGS="Tags"
PLG_SEARCH_WEBLINKS_WEBLINKS="Weblinks"

WF_PARAM_FIGURE_TAG_STYLE="Figure Styles"
WF_PARAM_FIGURE_TAG_STYLE_DESC="Style the Figure and Figcaption tags for improved content display. This is often needed to override unsuitable styling applied to the Figure tag by the template and browser."language/en-GB/en-GB.mod_status.sys.ini000060400000000566152453623440013621 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_STATUS="User Status"
MOD_STATUS_XML_DESCRIPTION="This module shows the status of the logged-in users and various shortcut links."
MOD_STATUS_LAYOUT_DEFAULT="Default"

language/en-GB/en-GB.com_postinstall.sys.ini000060400000001072152453623440014642 0ustar00; Joomla! Project
; (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_POSTINSTALL="Post-installation Messages"
COM_POSTINSTALL_MESSAGES_VIEW_DEFAULT_DESC="Displays post-installation and post-upgrade messages for Joomla! and its extensions."
COM_POSTINSTALL_MESSAGES_VIEW_DEFAULT_TITLE="Post-Installation Messages"
COM_POSTINSTALL_XML_DESCRIPTION="Displays post-installation and post-upgrade messages for Joomla! and its extensions."
language/en-GB/en-GB.plg_privacy_content.ini000060400000000557152453623440014673 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_PRIVACY_CONTENT="Privacy - Content"
PLG_PRIVACY_CONTENT_XML_DESCRIPTION="Responsible for processing privacy related requests for the core Joomla content data."
language/en-GB/en-GB.com_contact.ini000060400000054716152453623440013121 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_CONTACT="Contacts"
COM_CONTACT_BASIC_OPTIONS_FIELDSET_LABEL="Contact Display Options"
; COM_CONTACT_BATCH_MENU_LABEL is deprecated, use JLIB_HTML_BATCH_MENU_LABEL instead.
COM_CONTACT_BATCH_MENU_LABEL="To Move or Copy your selection please select a Category."
COM_CONTACT_BATCH_OPTIONS="Batch process the selected contacts"
COM_CONTACT_BATCH_TIP="If a category is selected for move/copy, any actions selected will be applied to the copied or moved contacts. Otherwise, all actions are applied to the selected contacts."
COM_CONTACT_CATEGORIES_VIEW_DEFAULT_DESC="Shows a list of contact categories within a category."
COM_CONTACT_CATEGORY_VIEW_DEFAULT_DESC="This view lists the contacts in a category."
COM_CONTACT_CHANGE_CONTACT="Select or Change Contact"
; COM_CONTACT_CHANGE_CONTACT_BUTTON deprecated, use COM_CONTACT_CHANGE_CONTACT instead.
COM_CONTACT_CHANGE_CONTACT_BUTTON="Change Contact"
COM_CONTACT_CONFIG_INTEGRATION_SETTINGS_DESC="These settings determine how the Contact Component will integrate with other extensions."
COM_CONTACT_CONFIGURATION="Contacts: Options"
COM_CONTACT_CONTACT_DETAILS="Details"
COM_CONTACT_CONTACT_DISPLAY_DETAILS="Display options for the individual contact page."
COM_CONTACT_CONTACT_SETTINGS_LABEL="Contact Options"
COM_CONTACT_CONTACT_VIEW_DEFAULT_DESC="This links to the contact information for one contact."
COM_CONTACT_CONTACTS="Contacts"
COM_CONTACT_DETAILS="Contact Information"
COM_CONTACT_EDIT_CONTACT="Edit Contact"
COM_CONTACT_EDIT_DETAILS="Edit contact information displayed on an individual page."
COM_CONTACT_ERROR_UNIQUE_ALIAS="Another Contact from this category has the same alias (remember it may be a trashed item)."
COM_CONTACT_ERROR_ALL_LANGUAGE_ASSOCIATED="A contact item set to All languages can't be associated. Associations have not been set."
COM_CONTACT_FIELD_ARTICLES_DISPLAY_NUM_DESC="Number of articles to list."
COM_CONTACT_FIELD_ARTICLES_DISPLAY_NUM_LABEL="# Articles to List"
COM_CONTACT_FIELD_ARTICLES_SHOW_DESC="If this contact is mapped to a user, and if this is set to Show, then a list of articles created by this user will show."
COM_CONTACT_FIELD_ARTICLES_SHOW_LABEL="Show User Articles"
COM_CONTACT_FIELD_BREADCRUMBS_DESC="Show or hide category breadcrumbs."
COM_CONTACT_FIELD_BREADCRUMBS_LABEL="Show Category Breadcrumbs"
COM_CONTACT_FIELD_CAPTCHA_DESC="Select the captcha plugin that will be used in the contact form. You may need to enter required information for your captcha plugin in the Plugin Manager.<br />If 'Use Global' is selected, make sure a captcha plugin is selected in Global Configuration."
COM_CONTACT_FIELD_CAPTCHA_LABEL="Allow Captcha on Contact"
COM_CONTACT_FIELD_CATEGORIES_DESC="Displays a list of contact categories within a category."
COM_CONTACT_FIELD_CATEGORIES_LABEL="Choose a Parent Category"
COM_CONTACT_FIELD_CATEGORY_DESC="Select a contact category to display."
COM_CONTACT_FIELD_CATEGORY_LABEL="Select a Category"
COM_CONTACT_FIELD_CONFIG_ALLOW_VCARD_DESC="Allow vCard to be displayed."
COM_CONTACT_FIELD_CONFIG_ALLOW_VCARD_LABEL="Allow vCard"
COM_CONTACT_FIELD_CONFIG_BANNED_EMAIL_DESC="Email addresses not allowed to submit contact form. Separate multiple email addresses with a semicolon."
COM_CONTACT_FIELD_CONFIG_BANNED_EMAIL_LABEL="Banned Email"
COM_CONTACT_FIELD_CONFIG_BANNED_SUBJECT_DESC="Subjects not allowed in contact form. Separate multiple subjects with a semicolon."
COM_CONTACT_FIELD_CONFIG_BANNED_SUBJECT_LABEL="Banned Subject"
COM_CONTACT_FIELD_CONFIG_BANNED_TEXT_DESC="Text not allowed in contact form body. Separate multiple words with a semicolon."
COM_CONTACT_FIELD_CONFIG_BANNED_TEXT_LABEL="Banned Text"
COM_CONTACT_FIELD_CONFIG_CATEGORIES_DESC="These settings apply for Contact Categories Options unless they are changed for a specific menu item."
COM_CONTACT_FIELD_CONFIG_CATEGORY_DESC="These settings apply for Contact Category Options unless they are changed for a specific menu item."
COM_CONTACT_FIELD_CONFIG_CONTACT_FORM="Form"
COM_CONTACT_FIELD_CONFIG_COUNTRY_DESC="Show or hide a Country column in the list of Contacts."
COM_CONTACT_FIELD_CONFIG_COUNTRY_LABEL="Country"
COM_CONTACT_FIELD_CONFIG_CUSTOM_REPLY_DESC="Turns off the automated reply, allowing for Plugins to handle integration with other systems."
COM_CONTACT_FIELD_CONFIG_CUSTOM_REPLY_LABEL="Custom Reply"
COM_CONTACT_FIELD_CONFIG_EMAIL_DESC="Show or hide an Email column in the list of Contacts."
COM_CONTACT_FIELD_CONFIG_FAX_DESC="Show or hide a Fax column in the list of Contacts."
COM_CONTACT_FIELD_CONFIG_FAX_LABEL="Fax"
COM_CONTACT_FIELD_CONFIG_INDIVIDUAL_CONTACT_DESC="These settings apply for single Contact unless they are changed for a specific menu item or Contact."
COM_CONTACT_FIELD_CONFIG_INDIVIDUAL_CONTACT_DISPLAY="Contact"
COM_CONTACT_FIELD_CONFIG_SHOW_IMAGE_LABEL="Image"
COM_CONTACT_FIELD_CONFIG_SHOW_IMAGE_DESC="Show or hide an Image column in the list of Contacts."
COM_CONTACT_FIELD_CONFIG_MOBILE_DESC="Show or hide show a Mobile column in the list of Contacts."
COM_CONTACT_FIELD_CONFIG_MOBILE_LABEL="Mobile"
COM_CONTACT_FIELD_CONFIG_PHONE_DESC="Show or hide a Phone column in the list of Contacts."
COM_CONTACT_FIELD_CONFIG_PHONE_LABEL="Phone"
COM_CONTACT_FIELD_CONFIG_POSITION_DESC="Show or hide a Position column in the list of Contacts."
COM_CONTACT_FIELD_CONFIG_POSITION_LABEL="Position"
COM_CONTACT_FIELD_CONFIG_REDIRECT_DESC="Enter an alternative URL where the user will be redirected to after mail is sent."
COM_CONTACT_FIELD_CONFIG_REDIRECT_LABEL="Contact Redirect"
COM_CONTACT_FIELD_CONFIG_SESSION_CHECK_DESC="Check for the existence of session cookie. This means that users without cookies enabled will not be able to send emails."
COM_CONTACT_FIELD_CONFIG_SESSION_CHECK_LABEL="Session Check"
COM_CONTACT_FIELD_CONFIG_STATE_LABEL="State or County"
COM_CONTACT_FIELD_CONFIG_STATE_DESC="Show or hide a State or County column in the list of Contacts."
COM_CONTACT_FIELD_CONFIG_SUBURB_DESC="Show or hide a City or Suburb column in the list of Contacts."
COM_CONTACT_FIELD_CONFIG_SUBURB_LABEL="City or Suburb"
COM_CONTACT_FIELD_CONFIG_TABLE_OF_CONTACTS_DESC="These settings apply for Contact List Options unless they are changed for a specific menu item."
COM_CONTACT_FIELD_CONFIG_VCARD_DESC="Show or hide a vCard column in the list of Contacts."
COM_CONTACT_FIELD_CONFIG_VCARD_LABEL="vCard"
COM_CONTACT_FIELD_CONTACT_SHOW_CATEGORY_DESC="If &quot;Hide&quot;, the Contact Category will not show. If &quot;Show Without Link&quot;, Category will show as text. If &quot;Show With Link&quot;, Category will show as a link to a Single Category Menu Item."
COM_CONTACT_FIELD_CONTACT_SHOW_CATEGORY_LABEL="Contact Category"
COM_CONTACT_FIELD_CONTACT_SHOW_LIST_DESC="If Show, the user will be able to change which contact is shown by selecting a contact from a dropdown list of all contacts in the current contact category."
COM_CONTACT_FIELD_CONTACT_SHOW_LIST_LABEL="Show Contact List"
COM_CONTACT_FIELD_CREATED_BY_ALIAS_DESC="Enter an alias to be displayed instead of the name of the user who created the contact."
COM_CONTACT_FIELD_CREATED_BY_ALIAS_LABEL="Created By Alias"
COM_CONTACT_FIELD_CREATED_BY_DESC="Select the name of the user who created the contact."
COM_CONTACT_FIELD_CREATED_DESC="Date when the contact was created."
COM_CONTACT_FIELD_CREATED_LABEL="Created Date"
; The following six strings are deprecated and will be removed in 4.0
COM_CONTACT_FIELD_EMAIL_BANNED_EMAIL_DESC="Email addresses not allowed to submit contact form. Separate multiple email addresses with a semicolon."
COM_CONTACT_FIELD_EMAIL_BANNED_EMAIL_LABEL="Banned Email"
COM_CONTACT_FIELD_EMAIL_BANNED_SUBJECT_DESC="Subjects not allowed in contact form. Separate multiple subjects with a semicolon."
COM_CONTACT_FIELD_EMAIL_BANNED_SUBJECT_LABEL="Banned Subject"
COM_CONTACT_FIELD_EMAIL_BANNED_TEXT_DESC="Text not allowed in contact form body. Separate multiple words with a semicolon."
COM_CONTACT_FIELD_EMAIL_BANNED_TEXT_LABEL="Banned Text"
COM_CONTACT_FIELD_EMAIL_EMAIL_COPY_DESC="Hide or Show checkbox to allow copy of email to be sent to submitter."
COM_CONTACT_FIELD_EMAIL_EMAIL_COPY_LABEL="Send Copy to Submitter"
COM_CONTACT_FIELD_EMAIL_SHOW_FORM_DESC="Show or hide the contact form."
COM_CONTACT_FIELD_EMAIL_SHOW_FORM_LABEL="Contact Form"
COM_CONTACT_FIELD_FEATURED_DESC="If marked yes, will be displayed in featured view."
COM_CONTACT_FIELD_FEEDLINK_DESC="Show or hide a feed link for this contact category."
COM_CONTACT_FIELD_FEEDLINK_LABEL="Feed Link"
COM_CONTACT_FIELD_ICONS_ADDRESS_DESC="Select or upload an image for the Address icon. If none selected, the default icon will be displayed."
COM_CONTACT_FIELD_ICONS_ADDRESS_LABEL="Address Icon"
COM_CONTACT_FIELD_ICONS_EMAIL_DESC="Select or upload an image for the Email icon. If none selected, the default icon will be displayed."
COM_CONTACT_FIELD_ICONS_EMAIL_LABEL="Email Icon"
COM_CONTACT_FIELD_ICONS_FAX_DESC="Select or upload an image for the Fax icon. If none selected, the default icon will be displayed."
COM_CONTACT_FIELD_ICONS_FAX_LABEL="Fax Icon"
COM_CONTACT_FIELD_ICONS_MISC_DESC="Select or upload an image for the Misc icon. If none selected, the default icon will be displayed."
COM_CONTACT_FIELD_ICONS_MISC_LABEL="Misc Icon"
COM_CONTACT_FIELD_ICONS_MOBILE_DESC="Select or upload an image for the Mobile icon. If none selected, the default icon will be displayed."
COM_CONTACT_FIELD_ICONS_MOBILE_LABEL="Mobile Icon"
COM_CONTACT_FIELD_ICONS_SETTINGS_DESC="Show icons, text or nothing next to the information."
COM_CONTACT_FIELD_ICONS_SETTINGS_LABEL="Settings"
COM_CONTACT_FIELD_ICONS_TELEPHONE_DESC="Select or upload an image for the Telephone icon. If none selected, the default icon will be displayed."
COM_CONTACT_FIELD_ICONS_TELEPHONE_LABEL="Telephone Icon"
COM_CONTACT_FIELD_IMAGE_ALIGN_DESC="Alignment of the image."
COM_CONTACT_FIELD_IMAGE_ALIGN_LABEL="Image Alignment"
COM_CONTACT_FIELD_INFORMATION_ADDRESS_DESC="Contact's address."
COM_CONTACT_FIELD_INFORMATION_ADDRESS_LABEL="Address"
COM_CONTACT_FIELD_INFORMATION_COUNTRY_DESC="Contact's country."
COM_CONTACT_FIELD_INFORMATION_COUNTRY_LABEL="Country"
COM_CONTACT_FIELD_INFORMATION_EMAIL_DESC="Contact's email."
COM_CONTACT_FIELD_INFORMATION_FAX_DESC="Contact's fax."
COM_CONTACT_FIELD_INFORMATION_FAX_LABEL="Fax"
COM_CONTACT_FIELD_INFORMATION_MISC_DESC="Contact's miscellaneous information."
COM_CONTACT_FIELD_INFORMATION_MISC_LABEL="Miscellaneous Information"
COM_CONTACT_FIELD_INFORMATION_MOBILE_DESC="Contact's mobile phone."
COM_CONTACT_FIELD_INFORMATION_MOBILE_LABEL="Mobile"
COM_CONTACT_FIELD_INFORMATION_POSITION_DESC="Contact's position."
COM_CONTACT_FIELD_INFORMATION_POSITION_LABEL="Position"
COM_CONTACT_FIELD_INFORMATION_POSTCODE_DESC="Contact's Postal/ZIP code."
COM_CONTACT_FIELD_INFORMATION_POSTCODE_LABEL="Postal/ZIP Code"
COM_CONTACT_FIELD_INFORMATION_STATE_DESC="Contact's state or county."
COM_CONTACT_FIELD_INFORMATION_STATE_LABEL="State or County"
COM_CONTACT_FIELD_INFORMATION_SUBURB_DESC="Contact's city or suburb."
COM_CONTACT_FIELD_INFORMATION_SUBURB_LABEL="City or Suburb"
COM_CONTACT_FIELD_INFORMATION_TELEPHONE_DESC="Contact's telephone."
COM_CONTACT_FIELD_INFORMATION_TELEPHONE_LABEL="Telephone"
COM_CONTACT_FIELD_INFORMATION_WEBPAGE_DESC="Contact's Website. IDN (International) Links are converted to punycode when they are saved."
COM_CONTACT_FIELD_INFORMATION_WEBPAGE_LABEL="Website"
COM_CONTACT_FIELD_INITIAL_SORT_DESC="Choose the field or fields by which contacts will be sorted."
COM_CONTACT_FIELD_INITIAL_SORT_LABEL="Sort By"
COM_CONTACT_FIELD_LANGUAGE_DESC="Assign a language for this contact."
COM_CONTACT_FIELD_LIMIT_BOX_DESC="Show or hide limit box."
COM_CONTACT_FIELD_LIMIT_BOX_LABEL="Limit box"
COM_CONTACT_FIELD_LINK_NAME_DESC="An additional link for this contact."
COM_CONTACT_FIELD_LINKA_DESC="Enter a URL for Link A."
COM_CONTACT_FIELD_LINKA_LABEL="Link A URL"
COM_CONTACT_FIELD_LINKA_NAME_LABEL="Link A Label"
COM_CONTACT_FIELD_LINKB_DESC="Enter a URL for Link B."
COM_CONTACT_FIELD_LINKB_LABEL="Link B URL"
COM_CONTACT_FIELD_LINKB_NAME_LABEL="Link B Label"
COM_CONTACT_FIELD_LINKC_DESC="Enter a URL for Link C."
COM_CONTACT_FIELD_LINKC_LABEL="Link C URL"
COM_CONTACT_FIELD_LINKC_NAME_LABEL="Link C Label"
COM_CONTACT_FIELD_LINKD_DESC="Enter a URL for Link D."
COM_CONTACT_FIELD_LINKD_LABEL="Link D URL"
COM_CONTACT_FIELD_LINKD_NAME_LABEL="Link D Label"
COM_CONTACT_FIELD_LINKE_DESC="Enter a URL for Link E."
COM_CONTACT_FIELD_LINKE_LABEL="Link E URL"
COM_CONTACT_FIELD_LINKE_NAME_LABEL="Link E Label"
COM_CONTACT_FIELD_LINKED_USER_DESC="Linked Joomla User."
COM_CONTACT_FIELD_LINKED_USER_LABEL="Linked User"
COM_CONTACT_FIELD_LINKED_USER_LABEL_ASC="Linked User ascending"
COM_CONTACT_FIELD_LINKED_USER_LABEL_DESC="Linked User descending"
COM_CONTACT_FIELD_MODIFIED_BY_DESC="Name of the user who modified this contact."
COM_CONTACT_FIELD_MODIFIED_DESC="The date and time that the contact was last modified."
COM_CONTACT_FIELD_NAME_DESC="Contact name."
COM_CONTACT_FIELD_NAME_LABEL="Name"
COM_CONTACT_FIELD_NUM_CONTACTS_DESC="Number of Contacts to display as list."
COM_CONTACT_FIELD_NUM_CONTACTS_LABEL="Number of Contacts"
COM_CONTACT_FIELD_PARAMS_ADD_MAILTO_LINK_DESC="Adds a mailto: link to the displayed email address."
COM_CONTACT_FIELD_PARAMS_ADD_MAILTO_LINK_LABEL="Add Mailto: Link"
COM_CONTACT_FIELD_PARAMS_CONTACT_E_MAIL_DESC="Show or hide contact email."
COM_CONTACT_FIELD_PARAMS_CONTACT_POSITION_DESC="Show or hide position."
COM_CONTACT_FIELD_PARAMS_CONTACT_POSITION_LABEL="Contact's Position"
COM_CONTACT_FIELD_PARAMS_COUNTRY_DESC="Show or hide country."
COM_CONTACT_FIELD_PARAMS_COUNTRY_LABEL="Country"
COM_CONTACT_FIELD_PARAMS_FAX_DESC="Show or hide fax number."
COM_CONTACT_FIELD_PARAMS_FAX_LABEL="Fax"
COM_CONTACT_FIELD_PARAMS_IMAGE_DESC="Select or upload the contact image."
COM_CONTACT_FIELD_PARAMS_IMAGE_LABEL="Image"
COM_CONTACT_FIELD_PARAMS_MISC_INFO_DESC="Show or hide miscellaneous information."
COM_CONTACT_FIELD_PARAMS_MISC_INFO_LABEL="Miscellaneous Information"
COM_CONTACT_FIELD_PARAMS_MOBILE_DESC="Show or hide mobile number."
COM_CONTACT_FIELD_PARAMS_MOBILE_LABEL="Mobile Phone"
COM_CONTACT_FIELD_PARAMS_NAME_DESC="Show or hide name of the contact."
COM_CONTACT_FIELD_PARAMS_NAME_LABEL="Name"
COM_CONTACT_FIELD_PARAMS_POST-ZIP_CODE_DESC="Show or hide the Postal/ZIP code."
COM_CONTACT_FIELD_PARAMS_POST-ZIP_CODE_LABEL="Postal/ZIP Code"
COM_CONTACT_FIELD_PARAMS_SHOW_IMAGE_DESC="Show or hide image."
COM_CONTACT_FIELD_PARAMS_SHOW_IMAGE_LABEL="Image"
COM_CONTACT_FIELD_PARAMS_STATE-COUNTY_DESC="Show or hide state or county."
COM_CONTACT_FIELD_PARAMS_STATE-COUNTY_LABEL="State or County"
COM_CONTACT_FIELD_PARAMS_STREET_ADDRESS_DESC="Show or hide street address."
COM_CONTACT_FIELD_PARAMS_STREET_ADDRESS_LABEL="Street Address"
COM_CONTACT_FIELD_PARAMS_TELEPHONE_DESC="Show or hide telephone number."
COM_CONTACT_FIELD_PARAMS_TELEPHONE_LABEL="Telephone"
COM_CONTACT_FIELD_PARAMS_TOWN-SUBURB_DESC="Show or hide city or suburb."
COM_CONTACT_FIELD_PARAMS_TOWN-SUBURB_LABEL="City or Suburb"
COM_CONTACT_FIELD_PARAMS_VCARD_DESC="Show or hide a link to allow export to vCard format."
COM_CONTACT_FIELD_PARAMS_VCARD_LABEL="vCard"
COM_CONTACT_FIELD_PARAMS_WEBPAGE_DESC="Show or hide webpage."
COM_CONTACT_FIELD_PARAMS_WEBPAGE_LABEL="Webpage"
COM_CONTACT_FIELD_PRESENTATION_DESC="Determines the style used to display sections of the contact form."
COM_CONTACT_FIELD_PRESENTATION_LABEL="Display Format"
COM_CONTACT_FIELD_PROFILE_SHOW_DESC="If the contact is mapped to a user and this option is set to Show, then the profile of the user will be shown in the contact details."
COM_CONTACT_FIELD_PROFILE_SHOW_LABEL="User Profile"
COM_CONTACT_FIELD_PUBLISH_DOWN_DESC="An optional date to Finish Publishing the contact."
COM_CONTACT_FIELD_PUBLISH_DOWN_LABEL="Finish Publishing"
COM_CONTACT_FIELD_PUBLISH_UP_DESC="An optional date to Start Publishing the contact."
COM_CONTACT_FIELD_PUBLISH_UP_LABEL="Start Publishing"
COM_CONTACT_FIELD_SHOW_CAT_ITEMS_DESC="Show or hide the number of contacts in category."
COM_CONTACT_FIELD_SHOW_CAT_ITEMS_LABEL="# Contacts in Category"
COM_CONTACT_FIELD_SHOW_CATEGORY_DESC="Displays the category."
COM_CONTACT_FIELD_SHOW_LINKS_DESC="Show or hide the contact links."
COM_CONTACT_FIELD_SHOW_LINKS_LABEL="Contact Links"
COM_CONTACT_FIELD_SHOW_CAT_TAGS_DESC="Show or hide the tags for a contact category."
COM_CONTACT_FIELD_SHOW_CAT_TAGS_LABEL="Category Tags"
COM_CONTACT_FIELD_SHOW_TAGS_DESC="Show or hide the tags for a contact."
COM_CONTACT_FIELD_SHOW_TAGS_LABEL="Tags"
COM_CONTACT_FIELD_SHOW_INFO_LABEL="Contact Information"
COM_CONTACT_FIELD_SHOW_INFO_DESC="Show or hide the contact information."
COM_CONTACT_FIELD_SORTNAME1_DESC="The part of the name to use as the first sort field."
COM_CONTACT_FIELD_SORTNAME1_LABEL="First Sort Field"
COM_CONTACT_FIELD_SORTNAME2_DESC="The part of the name to use as the second sort field."
COM_CONTACT_FIELD_SORTNAME2_LABEL="Second Sort Field"
COM_CONTACT_FIELD_SORTNAME3_DESC="The part of the name to use as the third sort field."
COM_CONTACT_FIELD_SORTNAME3_LABEL="Third Sort Field"
COM_CONTACT_FIELD_USER_CUSTOM_FIELDS_SHOW_LABEL="Show User Custom Fields"
COM_CONTACT_FIELD_USER_CUSTOM_FIELDS_SHOW_DESC="Show user custom fields which belong to all or only selected field groups."
COM_CONTACT_FIELD_VALUE_ICONS="Icons"
COM_CONTACT_FIELD_VALUE_NAME="Name"
COM_CONTACT_FIELD_VALUE_NO_LINK="Show Without Link"
COM_CONTACT_FIELD_VALUE_NONE="None"
COM_CONTACT_FIELD_VALUE_ORDERING="Ordering"
COM_CONTACT_FIELD_VALUE_PLAIN="Plain"
COM_CONTACT_FIELD_VALUE_SLIDERS="Sliders"
COM_CONTACT_FIELD_VALUE_SORT_NAME="Sort Name"
COM_CONTACT_FIELD_VALUE_TABS="Tabs"
COM_CONTACT_FIELD_VALUE_TEXT="Text"
COM_CONTACT_FIELD_VALUE_USE_CONTACT_SETTINGS="Use Contact Settings"
COM_CONTACT_FIELD_VALUE_WITH_LINK="Show With Link"
COM_CONTACT_FIELD_VERSION_LABEL="Revision"
COM_CONTACT_FIELD_VERSION_DESC="A count of the number of times this contact has been revised."
COM_CONTACT_FIELDS_CONTACT_FIELDS_TITLE="Contacts: Fields"
COM_CONTACT_FIELDS_CONTACT_FIELD_ADD_TITLE="Contacts: New Field"
COM_CONTACT_FIELDS_CONTACT_FIELD_EDIT_TITLE="Contacts: Edit Field"
COM_CONTACT_FIELDS_CONTEXT_CONTACT="Contact"
COM_CONTACT_FIELDS_CONTEXT_MAIL="Mail"
COM_CONTACT_FIELDSET_CONTACT_FORM="Contact form"
COM_CONTACT_FIELDSET_CONTACT_LABEL="Form"
COM_CONTACT_FIELDSET_CONTACTFORM_LABEL="Mail Options"
COM_CONTACT_FIELDSET_OPTIONS="Display Options"
COM_CONTACT_FILTER_DESC="Choose the type of filter to display per default."
COM_CONTACT_FILTER_LABEL="Filter field"
COM_CONTACT_FILTER_SEARCH_DESC="Search in contact name and alias. Prefix with ID: to search for a contact ID."
COM_CONTACT_FILTER_SEARCH_LABEL="Search Contacts"
COM_CONTACT_ICONS_SETTINGS="Icons"
COM_CONTACT_HEADING_ASSOCIATION="Association"
COM_CONTACT_HITS_DESC="Number of hits for this contact."
COM_CONTACT_ID_LABEL="ID"
; The following 2 strings are deprecated and will be removed with 4.0.
COM_CONTACT_ITEM_ASSOCIATIONS_FIELDSET_LABEL="Contact Item Associations"
COM_CONTACT_ITEM_ASSOCIATIONS_FIELDSET_DESC="Multilingual only! This choice will only display if the Language Filter parameter 'Item Associations' is set to 'Yes'. Choose a contact item for the target language. This association will let the Language Switcher module redirect to the associated contact item in another language. If used, make sure to display the Language switcher module on the relevant pages. A contact item set to language 'All' can't be associated."
COM_CONTACT_MAIL_FIELDSET_LABEL="Mail Options"
COM_CONTACT_MANAGER_CONTACT="Contacts: New/Edit"
COM_CONTACT_MANAGER_CONTACT_EDIT="Contacts: Edit"
COM_CONTACT_MANAGER_CONTACT_NEW="Contacts: New"
COM_CONTACT_MANAGER_CONTACTS="Contacts"
COM_CONTACT_N_ITEMS_ARCHIVED="%d contacts archived."
COM_CONTACT_N_ITEMS_ARCHIVED_1="%d contact archived."
COM_CONTACT_N_ITEMS_CHECKED_IN_0="No contact checked in."
COM_CONTACT_N_ITEMS_CHECKED_IN_1="%d contact checked in."
COM_CONTACT_N_ITEMS_CHECKED_IN_MORE="%d contacts checked in."
COM_CONTACT_N_ITEMS_DELETED="%d contacts deleted."
COM_CONTACT_N_ITEMS_DELETED_1="%d contact deleted."
COM_CONTACT_N_ITEMS_FEATURED="%d contacts featured."
COM_CONTACT_N_ITEMS_FEATURED_1="%d contact featured."
COM_CONTACT_N_ITEMS_PUBLISHED="%d contacts published."
COM_CONTACT_N_ITEMS_PUBLISHED_1="%d contact published."
COM_CONTACT_N_ITEMS_TRASHED="%d contacts trashed."
COM_CONTACT_N_ITEMS_TRASHED_1="%d contact trashed."
COM_CONTACT_N_ITEMS_UNFEATURED="%d contacts unfeatured."
COM_CONTACT_N_ITEMS_UNFEATURED_1="%d contact unfeatured."
COM_CONTACT_N_ITEMS_UNPUBLISHED="%d contacts unpublished."
COM_CONTACT_N_ITEMS_UNPUBLISHED_1="%d contact unpublished."
COM_CONTACT_NAME_DESC="Contact name."
COM_CONTACT_NEW_CONTACT="New Contact"
COM_CONTACT_NO_ITEM_SELECTED="No contacts selected."
COM_CONTACT_OPTIONS="Options"
COM_CONTACT_SAVE_SUCCESS="Contact saved."
COM_CONTACT_SEARCH_IN_NAME="Search contacts by name"
COM_CONTACT_SELECT_A_CONTACT="Select a Contact"
COM_CONTACT_SELECT_CONTACT_DESC="Select or create a contact to be displayed."
COM_CONTACT_SELECT_CONTACT_LABEL="Select Contact"
COM_CONTACT_SELECT_USER="Select User"
COM_CONTACT_SHOW_EMAIL_ADDRESS_DESC="Show email address."
COM_CONTACT_SHOW_EMAIL_ADDRESS_LABEL="Email Address"
COM_CONTACT_SHOW_EMPTY_CATEGORIES_DESC="If Show, empty categories will display. A category is only empty if it has no Contacts or subcategories."
COM_CONTACT_SUBMENU_CATEGORIES="Categories"
COM_CONTACT_SUBMENU_CONTACTS="Contacts"
COM_CONTACT_TIP_ASSOCIATION="Associated contacts"
COM_CONTACT_TOGGLE_TO_FEATURE="Toggle to change contact state to 'Featured'."
COM_CONTACT_TOGGLE_TO_UNFEATURE="Toggle to change contact state to 'Unfeatured'."
COM_CONTACT_UNFEATURED="Unfeatured contact"
COM_CONTACT_WARNING_CATEGORY="This category is invalid."
COM_CONTACT_WARNING_PROVIDE_VALID_NAME="Please provide a valid name."
COM_CONTACT_WARNING_PROVIDE_VALID_URL="Please provide a valid URL."
COM_CONTACT_WARNING_SELECT_CONTACT_TOPUBLISH="Please select a contact to publish."
COM_CONTACT_XML_DESCRIPTION="This component shows a listing of contact information."
JGLOBAL_FIELDSET_MISCELLANEOUS="Miscellaneous Information"
JGLOBAL_NEWITEMSLAST_DESC="New Contacts default to the last position. Ordering can be changed after this Contact is saved."
JLIB_HTML_BATCH_USER_LABEL="Set Linked User"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_CONTACT="Changes apply to this component only.<br /><em><strong>Inherited</strong></em> - a Global Configuration setting or higher level setting is applied.<br /><em><strong>Denied</strong></em> always wins - whatever is set at the Global or higher level and applies to all child elements.<br /><em><strong>Allowed</strong></em> will enable the action for this component unless overruled by a Global Configuration setting."
language/en-GB/en-GB.plg_content_confirmconsent.sys.ini000060400000000605152453623440017054 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CONTENT_CONFIRMCONSENT="Content - Confirm Consent"
PLG_CONTENT_CONFIRMCONSENT_XML_DESCRIPTION="This plugin adds a required consent checkbox to a form eg the core contact component."
language/en-GB/en-GB.plg_system_updatenotification.sys.ini000060400000001211152453623440017562 0ustar00; Joomla! Project
; (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_UPDATENOTIFICATION="System - Joomla! Update Notification"
PLG_SYSTEM_UPDATENOTIFICATION_XML_DESCRIPTION="This plugin periodically checks for the availability of new Joomla! versions. When one is found it will send you an email, reminding you to update Joomla!. Pro Tip: You can customise the email message by overriding the language string keys PLG_SYSTEM_UPDATENOTIFICATION_EMAIL_SUBJECT and PLG_SYSTEM_UPDATENOTIFICATION_EMAIL_BODY."language/en-GB/en-GB.plg_authentication_gmail.ini000060400000004433152453623440015651 0ustar00; Joomla! Project
; (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_AUTHENTICATION_GMAIL="Authentication - Gmail"
PLG_GMAIL_ERROR_ACCOUNT_DISABLED_OR_NOT_ACTIVATED="Your local account is disabled or not activated."
PLG_GMAIL_ERROR_LOCAL_USERNAME_CONFLICT="A local username conflicts with your Gmail username."
PLG_GMAIL_FIELD_APPLYSUFFIX_DESC="Options for applying the suffix: Don't apply the suffix, only apply the suffix if missing (any user supplied suffix will be used) or always apply the suffix replacing any user supplied suffix."
PLG_GMAIL_FIELD_APPLYSUFFIX_LABEL="Apply Username Suffix"
PLG_GMAIL_FIELD_BACKEND_LOGIN_DESC="Allow Backend login via Gmail account?"
PLG_GMAIL_FIELD_BACKEND_LOGIN_LABEL="Backend Login"
PLG_GMAIL_FIELD_SUFFIX_DESC="A suffix to use for the username, typically gmail.com (or googlemail.com) is the suffix but you may wish to use a Google Apps for Your Domain suffix, this doesn't include the @ symbol. If left blank username suffix will be ignored."
PLG_GMAIL_FIELD_SUFFIX_LABEL="Username Suffix"
PLG_GMAIL_FIELD_USER_BLACKLIST_DESC="A list of usernames not permitted to log in via the Gmail plugin. The usernames should be separated by a comma."
PLG_GMAIL_FIELD_USER_BLACKLIST_LABEL="User Blacklist"
PLG_GMAIL_FIELD_VALUE_APPLYSUFFIXALWAYS="Always use suffix"
PLG_GMAIL_FIELD_VALUE_APPLYSUFFIXMISSING="Apply suffix if missing"
PLG_GMAIL_FIELD_VALUE_NOAPPLYSUFFIX="Don't Apply Suffix"
PLG_GMAIL_FIELD_VERIFYPEER_DESC="Verify the peer connection using a CA certificate. In some situations authentication will fail due to certificate issues, disabling this should resolve the situation in that case."
PLG_GMAIL_FIELD_VERIFYPEER_LABEL="Verify Peer"
PLG_GMAIL_XML_DESCRIPTION="Handles User Authentication with a Gmail or Googlemail account (Requires cURL).<br />Users may need to enable <em>Access for less secure apps</em> at <a href="_QQ_"https://www.google.com/settings/security/lesssecureapps"_QQ_" target="_QQ_"_blank"_QQ_">https://www.google.com/settings/security/lesssecureapps</a> to be able to log in using this method.<br /><strong> Warning! You must have at least one authentication plugin enabled or you will lose all access to your site.</strong>"language/en-GB/en-GB.plg_system_p3p.sys.ini000060400000000726152453623440014405 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_P3P_XML_DESCRIPTION="The system P3P policy plugin allows Joomla! to send a customised string of P3P policy tags in the HTTP header. This is required for the sessions to work on certain browsers, ie Internet Explorer 6 and 7."
PLG_SYSTEM_P3P="System - P3P Policy"
language/en-GB/en-GB.plg_system_sef.ini000060400000001226152453623440013637 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SEF_XML_DESCRIPTION="Adds SEF support to links in the document. It operates directly on the HTML and does not require a special tag."
PLG_SYSTEM_SEF="System - SEF"
PLG_SEF_DOMAIN_LABEL="Site Domain"
PLG_SEF_DOMAIN_DESCRIPTION="If your site can be accessed through more than one domain enter the preferred (sometimes referred to as canonical) domain here. <br /><strong>Note:</strong> https://example.com and https://www.example.com are different domains."language/en-GB/en-GB.plg_system_privacyconsent.ini000060400000010040152453623440016123 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_PRIVACYCONSENT="System - Privacy Consent"
PLG_SYSTEM_PRIVACYCONSENT_BODY="<p>The user consented to storing their user information using the IP address <strong>%s</strong></p><p>The user agent string of the user's browser was:<br/>%s</p><p>This information was automatically recorded when the user submitted their details on the web site and checked the confirm box</p>"
PLG_SYSTEM_PRIVACYCONSENT_CACHETIMEOUT_DESC="How often the check is performed"
PLG_SYSTEM_PRIVACYCONSENT_CACHETIMEOUT_LABEL="Periodic check (days)"
PLG_SYSTEM_PRIVACYCONSENT_CONSENT="User <a href='{accountlink}'>{username}</a> consented to the privacy policy."
PLG_SYSTEM_PRIVACYCONSENT_CONSENTEXPIRATION_DESC="Number of days after which the privacy consent shall expire."
PLG_SYSTEM_PRIVACYCONSENT_CONSENTEXPIRATION_LABEL="Expiration"
; You can use the following merge codes for the EMAIL strings:
; [SITENAME]  Site name, as set in Global Configuration.
; [URL]       URL of the site's frontend page.
; [TOKENURL]  URL of the remind page with the token prefilled.
; [FORMURL]   URL of the remind page where the user can paste their token.
; [TOKEN]     The remind token.
; \n          Newline character. Use it to start a new line in the email.
PLG_SYSTEM_PRIVACYCONSENT_EMAIL_REMIND_BODY="Your Privacy Consent given at [URL] will expire in few days, you can renew the privacy consent for this website.\n\nIn order to do this, you can complete one of the following tasks:\n\n1. Visit the following URL: [TOKENURL]\n\n2. Copy your token from this email, visit the referenced URL, and paste your token into the form.\nURL: [FORMURL]\nToken: [TOKEN]\n\nPlease note that this token is only valid for this account."
PLG_SYSTEM_PRIVACYCONSENT_EMAIL_REMIND_SUBJECT="Privacy Consent at [SITENAME]"
PLG_SYSTEM_PRIVACYCONSENT_EXPIRATION_FIELDSET_LABEL="Expiration"
PLG_SYSTEM_PRIVACYCONSENT_FIELD_ARTICLE_DESC="Select the article from the list or create a new one."
PLG_SYSTEM_PRIVACYCONSENT_FIELD_ARTICLE_LABEL="Privacy Article"
PLG_SYSTEM_PRIVACYCONSENT_FIELD_DESC="Read the full privacy policy"
PLG_SYSTEM_PRIVACYCONSENT_FIELD_ENABLED_DESC="When enabled it performs checks for consent expiration"
PLG_SYSTEM_PRIVACYCONSENT_FIELD_ENABLED_LABEL="Enable"
PLG_SYSTEM_PRIVACYCONSENT_FIELD_ERROR="Agreement to the site's Privacy Policy is required."
PLG_SYSTEM_PRIVACYCONSENT_FIELD_LABEL="Privacy Policy"
PLG_SYSTEM_PRIVACYCONSENT_LABEL="Web Site Privacy"
PLG_SYSTEM_PRIVACYCONSENT_NOTE_FIELD_DEFAULT="By signing up to this web site and agreeing to the Privacy Policy you agree to this web site storing your information."
PLG_SYSTEM_PRIVACYCONSENT_NOTE_FIELD_DESC="A summary of the site's privacy policy. If left blank then the default message will be used."
PLG_SYSTEM_PRIVACYCONSENT_NOTE_FIELD_LABEL="Short Privacy Policy"
PLG_SYSTEM_PRIVACYCONSENT_NOTIFICATION_USER_PRIVACY_EXPIRED_SUBJECT="Privacy Consent Expired"
PLG_SYSTEM_PRIVACYCONSENT_NOTIFICATION_USER_PRIVACY_EXPIRED_MESSAGE="Privacy consent has expired for %1$s."
PLG_SYSTEM_PRIVACYCONSENT_OPTION_AGREE="I agree"
PLG_SYSTEM_PRIVACYCONSENT_OPTION_DO_NOT_AGREE="I do not agree"
PLG_SYSTEM_PRIVACYCONSENT_REDIRECT_MESSAGE_DEFAULT="Please confirm that you consent to this web site storing your information by agreeing to the privacy policy."
PLG_SYSTEM_PRIVACYCONSENT_REDIRECT_MESSAGE_DESC="Custom message to be displayed on redirect. If left blank then the default message will be used."
PLG_SYSTEM_PRIVACYCONSENT_REDIRECT_MESSAGE_LABEL="Redirect Message"
PLG_SYSTEM_PRIVACYCONSENT_REMINDBEFORE_DESC="Number of days to send a reminder before the expiration of the privacy consent."
PLG_SYSTEM_PRIVACYCONSENT_REMINDBEFORE_LABEL="Remind"
PLG_SYSTEM_PRIVACYCONSENT_SUBJECT="Privacy Policy"
PLG_SYSTEM_PRIVACYCONSENT_XML_DESCRIPTION="Basic plugin to request user's consent to the site's privacy policy. Existing users who have not consented yet will be redirected on login to update their profile."
language/en-GB/en-GB.plg_editors-xtd_contact.ini000060400000000703152453623440015436 0ustar00; Joomla! Project
; (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS-XTD_CONTACT="Button - Contact"
PLG_EDITORS-XTD_CONTACT_BUTTON_CONTACT="Contact"
PLG_EDITORS-XTD_CONTACT_XML_DESCRIPTION="Displays a button to insert links to Contacts in an article. Displays a popup allowing you to choose the contact."
language/en-GB/en-GB.plg_fields_checkboxes.sys.ini000060400000000620152453623440015734 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_CHECKBOXES="Fields - Checkboxes"
PLG_FIELDS_CHECKBOXES_XML_DESCRIPTION="This plugin lets you create new fields of type 'checkboxes' in any extensions where custom fields are supported."
language/en-GB/en-GB.mod_privacy_dashboard.ini000060400000000544152453623440015141 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_PRIVACY_DASHBOARD="Privacy Dashboard"
MOD_PRIVACY_DASHBOARD_XML_DESCRIPTION="The Privacy Dashboard Module shows information about privacy requests."
language/en-GB/en-GB.com_icagenda.ini000060400000260061152453623440013211 0ustar00; iCagenda
; Copyright (c)2012-2015 Cyril Rezé (Lyr!C) / JoomliC.com - All rights reserved.
; License GNU General Public License version 3 or later <http://www.gnu.org/licenses/gpl.html>
; Note : All ini files need to be saved as UTF-8 - No BOM
;
; ADMIN					: com_icagenda.ini
; Translation Platform	: https://www.transifex.com/projects/p/icagenda/


; iC global strings
ICTITLE="Title"
ICDESC="Description"
ICLIST="List"
ICCATEGORY="Category"
ICCATEGORIES="Categories"
ICDATE="Date"
ICDATES="Dates"
ICINFORMATION="Information"

IC_EVENT="Event"
IC_EVENTS="Events"
IC_TIME_START="Time Start"
IC_TIME_END="Time End"
IC_NAME="Name"
IC_USERNAME="User Name"
IC_READMORE="Read More"
IC_DEFAULT="Default"
IC_ARTICLE="Article"
IC_CUSTOM_TEXT="Custom Text"
IC_USER_GROUPS="User Groups"
IC_MANAGERS="Managers"
IC_FRONTEND="Front-End"
IC_MORE_INFORMATION="More information"
IC_ONLY_EVENTS_LIST="Only on Events List"
IC_ONLY_EVENT_DETAILS="Only on Event Details"
IC_META="Meta"
IC_FULLDESC="Full Description"
IC_SHORTDESC="Short Desc"
IC_AUTO_INTROTEXT="Auto-Introtext"
IC_SHORTDESCRIPTION="Short Description"
IC_SHORT_AND_FULL_DESCRIPTION="Short and Full Description"
IC_AUTO="Auto"
IC_USERS="Users"
IC_NOT_SPECIFIED="Not specified"
IC_HIDE_THIS_MESSAGE="Hide this message"
IC_SELECT_AN_OPTION="Select an option"
IC_LOADING="Loading..."

; Libraries Error Messages
ICAGENDA_CLASS_NOT_FOUND="Class %s not found."
ICAGENDA_CAN_NOT_LOAD="iCagenda can not load for the following reason(s):"
IC_LIBRARY_NOT_LOADED="iC Library is not correctly installed or is not loaded."
ICAGENDA_A_FOLDER_IS_MISSING="A folder is missing."
ICAGENDA_IS_NOT_CORRECTLY_INSTALLED="It seems that extension is not correctly installed."
ICAGENDA_INSTALL_AGAIN="Please install again the component iCagenda."
IC_ALTERNATIVELY="Alternatively"
IC_PLEASE="Please"
IC_LIBRARY_CHECK_PLUGIN_AND_LIBRARY="check if <strong>iC Library</strong> and the <strong>system plugin iC Library</strong> are installed and enabled."
ICAGENDA_UTILITIES_FIX_MANUAL="extract the installation archive and copy the %s directory inside %s directory."
ICAGENDA_INSTALLATION_IS_BROKEN="Your iCagenda installation is broken, please re-install the component."

; PHP config error message
COM_ICAGENDA_YOUR_PHP_VERSION_IS="Your PHP version is %s."
COM_ICAGENDA_PHP_VERSION_JOOMLA_RECOMMENDED="The PHP version recommended by Joomla is %s"
COM_ICAGENDA_PHP_VERSION_ICAGENDA_RECOMMENDATION="We strongly recommend that you upgrade to this minimum version if at all possible, to prevent eventual issues, bugs, or errors as may happen in future releases of iCagenda"
COM_ICAGENDA_PHP_ERROR_FOPEN="The PHP allow_url_fopen setting is disabled. This setting must be enabled for the copy of remote images (URL). If not, thumbnails may not be created from image url."
COM_ICAGENDA_PHP_ERROR_FOPEN_COPY_BMP="The PHP allow_url_fopen setting is disabled!"
COM_ICAGENDA_PHP_ERROR_FOPEN_COPY_BMP_INFO="This setting must be enabled for the creation of thumbnails to work from a bmp url."
COM_ICAGENDA_PHP_ERROR_GD="It looks like GD is not installed on your server! This setting must be enabled for Thumbnail Generator to work."

; Alert messages
COM_ICAGENDA_ICTHUMB_ERROR="Error"
COM_ICAGENDA_ICTHUMB_ERROR_INFO="Unable to create thumbnails"
COM_ICAGENDA_TRASH_FRONTEND_SUBMITTED_1="Events submitted in frontend, and never edited. <br />Before to be able to definitely remove this event, click on %s, and then on %s."
COM_ICAGENDA_TRASH_FRONTEND_SUBMITTED="Events submitted in frontend, and never edited. <br />Before to be able to definitely remove those events, for each one of them, click on %s, and then on %s."
COM_ICAGENDA_TRASH_FRONTEND_REGISTRATION_1="Registrations submitted in frontend, and never edited. <br />Before to be able to definitely remove this registration, click on %s, and then on %s."
COM_ICAGENDA_TRASH_FRONTEND_REGISTRATION="Registrations submitted in frontend, and never edited. <br />Before to be able to definitely remove those registrations, for each one of them, click on %s, and then on %s."
COM_ICAGENDA_THEME_PACKS_COMPATIBILITY="Theme Packs Compatibility"
COM_ICAGENDA_ALERT_EVENTS_FILE_MISSING_DESC="To use the 'All Dates' option with the Theme Packs listed bellow, you will have to upgrade those packs."
COM_ICAGENDA_THEME_PACKS_INCOMPATIBLE_ALERT="To use the %s functionnality with the Theme Pack(s) listed bellow, you will have to upgrade the pack(s)."
COM_ICAGENDA_EVENTS_PHPFILE_MISSING_PACKS_LIST="List of Incompatible Theme Packs:"
COM_ICAGENDA_ALERT_NO_CATEGORY_PUBLISHED="You have to publish at least one category to be able to add or edit an event."
COM_ICAGENDA_ALERT_S_TEXT_S_EXCEEDS_CHARACTER_LIMIT="The %s stored in the database exceeds the character limit currently set."
COM_ICAGENDA_ALERT_EDIT_TEXT_TO_FIT_CHAR_LIMIT="Please edit it so that it is not truncated, and it fits within the maximum character limit."
COM_ICAGENDA_ALERT_S_TEXT_S_CURRENTLY_STORED_IN_DATABASE="%s currently stored in the database"
COM_ICAGENDA_ALERT_EVENT_SAVE_WARNING="Alias already existed so a number was added at the end. You can re-edit the event to customise the alias."

; General
COM_ICAGENDA="iCagenda"
COM_ICAGENDA_COMPONENT_LABEL="iCagenda"
COM_ICAGENDA_COMPONENT_DESC="Events Management Extension for Joomla!"
COM_ICAGENDA_INFORMATION="Events management extension<br/>Joomla!<sup>&#174;</sup> 2.5 & 3.x"
COM_ICAGENDA_DESC="<table><tr><td><img src='../media/com_icagenda/images/iconicagenda48.png' alt='' /></td><td width='10px'></td><td><big><big><b>iCagenda</b></big>&trade;</big><br/>Events Management Extension for Joomla!</td></tr></table><br/><br/><i><small>Jooml!C &#8226; iCagenda &#8226; <a href='http://www.joomlic.com' target='_blank'>www.joomlic.com</a></small></i>"
COM_ICAGENDA_FILTER_SEARCH_CATEGORIES_DESC="Search in categories"
COM_ICAGENDA_FILTER_SEARCH_EVENTS_DESC="Search in events"
COM_ICAGENDA_FILTER_SEARCH_FEATURES_DESC="Search in features"

; ToS
COM_ICAGENDA_TERMS_OF_SERVICE="Terms of Service:"
COM_ICAGENDA_TERMS_OF_SERVICE_AGREE="Agree to Terms of Service."
COM_ICAGENDA_TERMS_OF_SERVICE_NOT_CHECKED_SUBMIT_EVENT="To submit an event you must agree to our terms of service!"

COM_ICAGENDA_TERMS_IMPORTANT_INFOS="These Terms and Conditions (TOS) are provided for informational purposes only, and are by no means considered exhaustive nor in perfect harmony with the laws of your country. <br />You can change this text using the override system integrated into Joomla (see: Extensions > Language Manager > Overrides > New, and search for %s). <br />Alternatively, you can use an existing article or custom content. <br />Also remember to take into account applicable laws regarding cookies, protection of privacy and personal data collected."

COM_ICAGENDA_TOS="<li>%s reserves the right to approve, edit, reject or remove any event listing on this site for any reason whatsoever.</li> <li>It is unlawful to include discrimination on the basis of sex, age, race, political or religious beliefs unless covered by an exemption under relevant legislation. %s will not accept events listings that appear to be contrary to law.</li><li>You have read the Terms of Service in its entirety and understand what you have read.</li><li>You agree to abide by the Terms of Service established for this site</li>"

COM_ICAGENDA_REGISTRATION_TERMS="<p>Welcome to [SITENAME].<br />By using or accessing any part of the services, you agree to all of the terms and conditions contained herein and all other operating rules, policies and procedures that may be published from time to time on the site [SITENAME]. If you do not agree to any of such terms, conditions, rules, policies or procedures, do not use or access the services. [SITENAME] reserves the right, at its sole discretion, to modify or replace any of the terms or conditions of this TOS at any time.</p><ol><li><strong>YOUR REGISTRATION OBLIGATIONS</strong><br /><p>To be a registered user of the Services, you agree to: (a) provide true, accurate, current and complete information about yourself as prompted by the Site registration form (the "Registration Data"). If you provide any information that is untrue, inaccurate, not current or incomplete, or [SITENAME] has reasonable grounds to suspect that such information is untrue, inaccurate, not current or incomplete, [SITENAME] has the right to suspend or terminate all of your registrations and refuse any and all of your current or future use of the Services (or any portion thereof). [SITENAME] is concerned about the safety and privacy of all its users, particularly children. For this reason, you must be at least 18 years of age, or the legal age of majority where you reside if that jurisdiction has an older age of majority, to register for an event. </p></li><li><strong>PRIVACY</strong><br /><p>Any information submitted or provided by you to the Services may be publicly accessible. You should take care to protect private information or information that is important to you. [SITENAME] shall not be responsible for protecting any such information and is not liable for the protection of privacy of electronic mail or other information transferred through the Internet or any other network that you may use. Please be aware that if you decide to disclose personally identifiable information on the Services, this information may become public. [SITENAME] does not control and shall not be responsible for the acts of you or any other users (whether Organizers, Buyers, other non-Organizers or otherwise) of the Services.</p></li><li><strong>ACCEPTANCE OF TERMS</strong><br /><p>You have read the Terms and Conditions in its entirety and understand what you have read.<br />You agree to abide by the Terms of Service established for this site</p></li></ol>"

; Form
COM_ICAGENDA_FORM_REQUIRED_INFO="All fields with an * are required."
COM_ICAGENDA_FORM_NC="Please make sure the form is complete and valid."
COM_ICAGENDA_FORM_VALIDATE_FIELD_REQUIRED="Field required:"
COM_ICAGENDA_FORM_VALIDATE_FIELD_REQUIRED_NAME="Field required: %s"
COM_ICAGENDA_FORM_VALIDATE_LBL="Form validation"
COM_ICAGENDA_FORM_VALIDATE_DESC="Server side validation is the minimum since everything before that can be overridden on the user side. But client-side is the most user-friendly one, so using both is not a bad idea (especially since the latter is unobtrusive and won't give problems on javascript-disabled or -problematic client browsers)."
COM_ICAGENDA_FORM_SERVER_VALIDATION="Server-Side"
COM_ICAGENDA_FORM_SERVER_CLIENT_VALIDATION="Server-Side & Client-Side"

; Thumbnails
COM_ICAGENDA_THUMB_LARGE_LBL="Large Size"
COM_ICAGENDA_THUMB_LARGE_DESC=""
COM_ICAGENDA_THUMB_MEDIUM_LBL="Medium Size"
COM_ICAGENDA_THUMB_MEDIUM_DESC=""
COM_ICAGENDA_THUMB_SMALL_LBL="Small Size"
COM_ICAGENDA_THUMB_SMALL_DESC=""
COM_ICAGENDA_THUMB_XSMALL_LBL="XSmall Size"
COM_ICAGENDA_THUMB_XSMALL_DESC=""
IC_WIDTH="Width"
IC_HEIGHT="Height"
IC_QUALITY="Quality"
IC_CROPPED="Cropped"
IC100="100"
IC95="95"
IC90="90"
IC85="85"
IC80="80"
IC75="75"
IC70="70"
IC60="60"
IC50="50"

; Titles Bar Admin
COM_ICAGENDA_ADMIN_TITLE_ICAGENDA="<div style="_QQ_"float:right"_QQ_"> <img src="_QQ_"../media/com_icagenda/images/iconicagenda36.png"_QQ_" alt="_QQ_"logo"_QQ_" /></div> iCagenda <span style="_QQ_"font-size:14px;"_QQ_">- iCagenda</span>"

; Global Options Component
COM_ICAGENDA_FORM_LABEL="Form"

COM_ICAGENDA_ACCESS_HEADING="Access"
COM_ICAGENDA_CONFIGURATION="Parameters and Permissions <b>iCagenda</b>"
COM_ICAGENDA_DISPLAY_LABEL="Parameters"
COM_ICAGENDA_DISPLAY_DESC="Options for the front-end display of the 'list of events' and 'event details' view"
COM_ICAGENDA_ADDTHIS="AddThis - Share on Social Networks"
COM_ICAGENDA_ADDTHIS_LABEL="AddThis"
COM_ICAGENDA_ADDTHIS_DESC="Increase traffic by helping visitors share to Facebook, Twitter and other social sites.<br>iCagenda integrates the tracking code for AddThis giving you the best way to share your events on all Social Networks.<br><a href="_QQ_"http://www.addthis.com"_QQ_" target="_QQ_"_blank"_QQ_">AddThis.com</a> | <a href="_QQ_"http://www.addthis.com/register"_QQ_" target="_QQ_"_blank"_QQ_">Create an account</a>"
COM_ICAGENDA_ADDTHIS_NOTE="AddThis Profiles allow publishers to organize and share AddThis analytics data with team members or clients."
COM_ICAGENDA_ADDTHIS_ID_LABEL="AddThis Profile ID"
COM_ICAGENDA_ADDTHIS_ID_DESC="Your AddThis Profile ID (eg: ra-123a456bc789d0ef)"
COM_ICAGENDA_ADDTHIS_LIST_LABEL	= "Events list"
COM_ICAGENDA_ADDTHIS_LIST_DESC="Display sharing on social networks on the event list page"
COM_ICAGENDA_ADDTHIS_EVENT_LABEL="Event details"
COM_ICAGENDA_ADDTHIS_EVENT_DESC="Display sharing on social networks on the event details page"
COM_ICAGENDA_ADDTHIS_FLOAT_LABEL="Floating position"
COM_ICAGENDA_ADDTHIS_FLOAT_DESC="AddThis floating position to left or right, or disable"
COM_ICAGENDA_ADDTHIS_ICON_LABEL="Size of icons"
COM_ICAGENDA_ADDTHIS_ICON_DESC="Size of icons, 16x16 or 32x32 pixels"
COM_ICAGENDA_ADDTHIS_16="<img src="_QQ_"../media/com_icagenda/images/addthis_16x16.png"_QQ_" alt="_QQ_"addthis_16x16"_QQ_" />"
COM_ICAGENDA_ADDTHIS_32="<img src="_QQ_"../media/com_icagenda/images/addthis_32x32.png"_QQ_" alt="_QQ_"addthis_32x32"_QQ_" />"

;Events List
COM_ICAGENDA_LIST_PARAMS_DESC="Options for the front-end display of the 'list of events' view"
COM_ICAGENDA_LIST_PARAMS_LABEL="Events List"

COM_ICAGENDA_LIST_FILTERS="Events List Filters"
COM_ICAGENDA_ALL_DATES="All dates of each event"
COM_ICAGENDA_ONLY_NEXT="Only NEXT/LAST date"
;
COM_ICAGENDA_LIST_TYPE_LBL="Display All Dates"
COM_ICAGENDA_LIST_TYPE_DESC="If set to 'YES' (default), all dates of each event will be displayed in the main list.<br />If set to 'NO', each event will be displayed only one time in the main list, and the date used to display the event will be the next date (or current period from to) if event is ongoing or upcoming, the past date (or past period from to) if event is past."

COM_ICAGENDA_LIST_HEADER="Header Display"
COM_ICAGENDA_LIST_HEADER_LABEL="Display Option"
COM_ICAGENDA_LIST_HEADER_DESC="Display option for the Header of the list of events"
COM_ICAGENDA_LIST_HEADER_ONLY_TITLE="Only Title"
COM_ICAGENDA_LIST_HEADER_ONLY_SUBTITLE="Only Subtitle Information"
COM_ICAGENDA_LIST_ARROWS_TEXT_LABEL="Display text next/previous"
COM_ICAGENDA_LIST_ARROWS_TEXT_DESC="Insert text with forward/back arrows in event list"

COM_ICAGENDA_LIST_PAGINATION_LABEL="Pagination"
COM_ICAGENDA_LIST_PAGINATION_TEXT_DESC="Display pagination"

COM_ICAGENDA_LIST_NAVIGATOR="Events List Navigation"
COM_ICAGENDA_LIST_NAVIGATOR_POSITION_LABEL="Navigation Position"
COM_ICAGENDA_LIST_NAVIGATOR_POSITION_DESC="Display Navigation Arrows on Top or on Bottom of the Events list"
COM_ICAGENDA_TOP="Top"
COM_ICAGENDA_BOTTOM="Bottom"
COM_ICAGENDA_TOP_AND_BOTTOM="Top & Bottom"

; Date Box
COM_ICAGENDA_LIST_DATEBOX="Date Box"
COM_ICAGENDA_LIST_DATEBOX_DAY_DISPLAY_LABEL="Day"
COM_ICAGENDA_LIST_DATEBOX_DAY_DISPLAY_DESC="Show/Hide the day in the date box of list of events."
COM_ICAGENDA_LIST_DATEBOX_MONTH_DISPLAY_LABEL="Month"
COM_ICAGENDA_LIST_DATEBOX_MONTH_DISPLAY_DESC="Show/Hide the Month in the date box of list of events."
COM_ICAGENDA_LIST_DATEBOX_YEAR_DISPLAY_LABEL="Year"
COM_ICAGENDA_LIST_DATEBOX_YEAR_DISPLAY_DESC="Show/Hide the Year in the date box of list of events."
COM_ICAGENDA_LIST_DATEBOX_TIME_DISPLAY_LABEL="Time"
COM_ICAGENDA_LIST_DATEBOX_TIME_DISPLAY_DESC="Show/Hide the Time in the date box of list of events."

; List Information
COM_ICAGENDA_LIST_TITLE_LENGTH_LABEL="Title Length"
COM_ICAGENDA_LIST_TITLE_LENGTH_DESC="Character limit of the Title in the list of events. If left empty, the full title will be displayed."
COM_ICAGENDA_LIST_INFORMATION="Information in list of events"
COM_ICAGENDA_LIST_VENUE_DISPLAY_LABEL="Venue's name"
COM_ICAGENDA_LIST_VENUE_DISPLAY_DESC="Show/Hide the venue's name in list of events."
COM_ICAGENDA_LIST_CITY_DISPLAY_LABEL="City"
COM_ICAGENDA_LIST_CITY_DISPLAY_DESC="Show/Hide the city in list of events."
COM_ICAGENDA_LIST_COUNTRY_DISPLAY_LABEL="Country"
COM_ICAGENDA_LIST_COUNTRY_DISPLAY_DESC="Show/Hide the country in list of events."
COM_ICAGENDA_LIST_INTROTEXT_DISPLAY_LABEL="Intro Text"
COM_ICAGENDA_LIST_INTROTEXT_DISPLAY_DESC="Show/Hide the Intro Text of the event in the list of events.<br />If set to 'Auto', the short description will show. If does not exist, iCagenda will generate an introduction text from the full description (Auto-Introtext), and if full description does not exist, the meta-description will show if not empty.<br />If set to 'Short Desc', the short description will show.<br />If set to 'Auto-Introtext', auto-introtext will show.<br />If set to 'Hide', no introduction text will show."

; Event Details
COM_ICAGENDA_EVENT_PARAMS_DESC="Options for the front-end display of the 'event details' view"
COM_ICAGENDA_EVENT_PARAMS_LABEL="Event Details"

COM_ICAGENDA_EVENT_DESCRIPTION_DISPLAY_LABEL="Description Text"
COM_ICAGENDA_EVENT_DESCRIPTION_DISPLAY_DESC="Description content in the event details view.<br />If set to 'Auto', iCagenda will display the full description if exists, and if not, the short description will show if exists.<br />If set to 'Full Description', the full description of the event will show.<br />If set to 'Short Description', the short description of the event will show.<br />If set to 'Short and Full Description', both short and full descriptions of the event will show.<br />If set to 'Hide', no description will show."
COM_ICAGENDA_LIST_OF_PARTICIPANTS_LABEL="List of Participants"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_DESC="Show or Hide List of Participants in event details view"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_SLIDE_LABEL="Slide Effect"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_SLIDE_DESC="Slide effect used for list of participants"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_DISPLAY_LABEL="List Display Options"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_DISPLAY_DESC="Change the display of the list of participants (avatar is using Gravatar.com)<br><b>Full</b>: gravatar + nb of tickets + date<br><b>Avatar & Username</b>: gravatar and the name of the registered user<br><b>Username</b>: simple list of the names of the registered users"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_DISPLAY_FULL="Full"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_DISPLAY_AVATAR="Avatar & Username"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_DISPLAY_NAMES="Username"
COM_ICAGENDA_LIST_DISPLAY_FULL_COLUMN_LABEL="Nb of columns (Full)"
COM_ICAGENDA_LIST_DISPLAY_FULL_COLUMN_DESC="Select the number of columns for Full Display of the list of participants"
COM_ICAGENDA_INFORMATION_LABEL="Information Details"
COM_ICAGENDA_INFORMATION_DESC="Show or Hide Information Details in event details view"
COM_ICAGENDA_TARGET_LINK_LABEL="Website URL Target"
COM_ICAGENDA_TARGET_LINK_DESC="Select how the link opens the website of the event"
COM_ICAGENDA_GOOGLE_MAPS_DESC="Show or Hide Google Maps in event details view"
COM_ICAGENDA_EVENT_DATES="List of Dates (Page event details)"
COM_ICAGENDA_EVENT_ALL_DATES="All Dates"
COM_ICAGENDA_EVENT_ALL_DATES_DESC="This is the list of dates for an event, which is displayed in the event's details page."
COM_ICAGENDA_EVENT_SINGLE_DATES_LABEL="Single Dates"
COM_ICAGENDA_EVENT_SINGLE_DATES_DESC="Show or Hide Single Dates in 'All Dates' (Page event details only)"
COM_ICAGENDA_EVENT_SINGLE_DATES_LIST_LABEL="List Model"
COM_ICAGENDA_EVENT_SINGLE_DATES_LIST_DESC="Select the model for the list of single dates (Page event details only)"
COM_ICAGENDA_EVENT_SINGLE_DATES_VERTICAL="Vertical List"
COM_ICAGENDA_EVENT_SINGLE_DATES_HORIZONTAL="Horizontal List"
COM_ICAGENDA_EVENT_PERIOD_LABEL="Period Dates"
COM_ICAGENDA_EVENT_PERIOD_DESC="Show or Hide Period Dates in 'All Dates' (Page event details only)"
COM_ICAGENDA_OVERRIDE_BUTTON_TEXT_DESC="You can enter a custom text for registration button. This overrides the core text used for this button. If left blank, "_QQ_"Register"_QQ_" will be used."
;
; Register to an event
COM_ICAGENDA_REGISTRATIONS_LABEL="Registrations"
COM_ICAGENDA_REGISTRATIONS_DESC="Global configuration for registration to events"
COM_ICAGENDA_REGISTRATION_ACCESS_LEVEL_DESC="The access level group that is allowed to view the frontend registration form."
COM_ICAGENDA_REGISTRATION_TO_EVENT_DESC="Options of the form to register for an event in the frontend"
COM_ICAGENDA_REGISTRATION_LIMIT_EMAIL_LABEL="1 registration / email"
COM_ICAGENDA_REGISTRATION_LIMIT_EMAIL_DESC="Registration is limited to one submission per email address"
COM_ICAGENDA_REGISTRATION_LIMIT_DATE_LABEL="1 registration / date"
COM_ICAGENDA_REGISTRATION_LIMIT_DATE_DESC="Registration is limited to one submission per email address and per date. If set to 'Yes', User can register 1 time, for each date of the event, with the same email address."
COM_ICAGENDA_REGISTRATION_JOOMLA_USER_NAME_LABEL="Logged-in Users"
COM_ICAGENDA_REGISTRATION_JOOMLA_USER_NAME_DESC="If Autofill is enabled, show Name or User Name."
COM_ICAGENDA_REGISTRATION_JOOMLA_USER_AUTOFILL_LABEL="Autofill Name and Email"
COM_ICAGENDA_REGISTRATION_JOOMLA_USER_AUTOFILL_DESC="Complete or not form fields Name and Email with the profile information of a Joomla user connected."
COM_ICAGENDA_REGISTRATION_EMAIL_FIELD="Email Form Field"
COM_ICAGENDA_REGISTRATION_EMAIL_DISPLAY_LABEL="Email"
COM_ICAGENDA_REGISTRATION_EMAIL_DISPLAY_DESC="Show or Hide Email form field"
COM_ICAGENDA_REGISTRATION_EMAIL_CONFIRM_FIELD="Confirm Email Form Field"
COM_ICAGENDA_REGISTRATION_EMAIL_CONFIRM_DISPLAY_LABEL="Confirm Email"
COM_ICAGENDA_REGISTRATION_EMAIL_CONFIRM_DISPLAY_DESC="Show or Hide Confirm Email form field"
COM_ICAGENDA_REGISTRATION_EMAIL_REQUIRED_LABEL="Email Required"
COM_ICAGENDA_REGISTRATION_EMAIL_REQUIRED_DESC="Set if Email Address is required during registration"
COM_ICAGENDA_REGISTRATION_EMAIL_CHECKDNSRR_LABEL="Deep Email Validation"
COM_ICAGENDA_REGISTRATION_EMAIL_CHECKDNSRR_DESC="Deep Email Validation function is not required, but useful. This function uses 'checkdnsrr' php function to check the domain of an email address and if present on your server, iCagenda performs a validation on the user email after submit.<br /><br />It avoids:<br /> - spammer submission using non existing domains in their email address<br /> - errors by genuine users (misspelled or typo email address)<br /><br />Server capabilities are checked by iCagenda. If 'checkdnsrr' is not present, this option will have no effect."
COM_ICAGENDA_REGISTRATION_EMAIL_CHECKDNSRR_NOT_PRESENT_1="Deep email validation not available on your server!"
COM_ICAGENDA_REGISTRATION_EMAIL_CHECKDNSRR_NOT_PRESENT_2="Activating this function will have no effect. It requires "_QQ_"checkdnsrr"_QQ_" to be implemented on the system."
COM_ICAGENDA_REGISTRATION_PHONE_FIELD="Phone Form Field"
COM_ICAGENDA_REGISTRATION_PHONE_DISPLAY_LABEL="Phone"
COM_ICAGENDA_REGISTRATION_PHONE_DISPLAY_DESC="Show or Hide Phone form field"
COM_ICAGENDA_REGISTRATION_PHONE_REQUIRED_LABEL="Phone Required"
COM_ICAGENDA_REGISTRATION_PHONE_REQUIRED_DESC="Set if Phone number is required during registration"
COM_ICAGENDA_REGISTRATION_NOTES_FIELD="Notes Form Field"
COM_ICAGENDA_REGISTRATION_NOTES_DISPLAY_LABEL="Notes"
COM_ICAGENDA_REGISTRATION_NOTES_DISPLAY_DESC="Show or Hide Notes form field"

COM_ICAGENDA_TITLE_REGISTRATION_NOTIFICATIONS="Registration Notifications"

COM_ICAGENDA_NOTIFICATION_BY_EMAIL_ADMIN="Notification email to admin"
COM_ICAGENDA_NOTIFICATION_BY_EMAIL_ADMIN_LBL="Sending a notification email"
COM_ICAGENDA_NOTIFICATION_BY_EMAIL_ADMIN_DESC="Enable/disable sending of email notification"
COM_ICAGENDA_NOTIFICATION_BY_EMAIL_ADMIN_SELECTION_INFO="Select who will receive the notification email when a new user registers for an event.<ul><li><b>Site email:</b> email address set in global configuration of Joomla as default email used for site emails.</li><li><b>Creator email:</b> email address of the user who created the event.</li><li><b>Contact's email:</b> email address entered as contact's email for the event.</li><li><b>Custom list of emails:</b> the email addresses indicated in the custom list of emails.</li></ul>"
COM_ICAGENDA_EMAIL_SITE="Site email"
COM_ICAGENDA_EMAIL_CREATOR="Creator email"
COM_ICAGENDA_EMAIL_EVENT_CONTACT="Contact's email"
COM_ICAGENDA_EMAIL_CUSTOM_LIST="Custom list of emails"
COM_ICAGENDA_REGISTRATION_EMAIL_ADMIN_CUSTOM_LIST_DESC="Enter each email address separated by a comma"
COM_ICAGENDA_EMAILADMINSEND_PLACEHOLDER="name@mail.com, example@me.com, test@test.com"

COM_ICAGENDA_REGISTRATION_EMAIL_USER="Confirmation email to user"
COM_ICAGENDA_CONFIRMATION_BY_EMAIL_USER_LBL="Sending a confirmation email"
COM_ICAGENDA_CONFIRMATION_BY_EMAIL_USER_DESC="Enable/disable sending of an email of confirmation to the person who registers for an event."
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_DEFAULT_LABEL="Use Default (multi-language)"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_DEFAULT_DESC="Set if using emails by default (translated into language pack) or use custom emails (not translatable)"
COM_ICAGENDA_CUSTOM_EMAILS="Custom emails"

; Custom User Confirmation Email
COM_ICAGENDA_REGISTRATION_EMAIL_USER_NOTICE="You can use the following Data Tags:<br /><br /><table><tr><td><b>User:</b></td><td width="_QQ_"30"_QQ_"></td><td><b>Website:</b></td><td width="_QQ_"30"_QQ_"></td><td><b>Event info:</b></td></tr><tr><td valign="_QQ_"top"_QQ_"><ul><li>[NAME]=Name</li><li>[EMAIL]=Email</li><li>[PHONE]=Phone number</li><li>[PLACES]=Number of tickets</li><li>[CUSTOMFIELDS]=List of custom fields</li><li>[NOTES]=Message</li></ul></td><td width="_QQ_"30"_QQ_"></td><td valign="_QQ_"top"_QQ_"><ul><li>[SITENAME]=Name of the site</li><li>[SITEURL]=Url of the site</li></ul></td><td width="_QQ_"30"_QQ_"></td><td valign="_QQ_"top"_QQ_"><ul><li>[TITLE]=Title</li><li>[EVENTURL]=Event Link</li><li>[AUTHOR]=Author</li><li>[AUTHOREMAIL]=Email of the author</li><li>[CONTACTEMAIL]=Contact's email of the event</li><li>[DATETIME]=Single date with time</li><li>[DATE]=Date</li><li>[TIME]=Time</li><li>[STARTDATE]=Start Date</li><li>[ENDDATE]=End date</li><li>[STARTDATETIME]=Start date and time</li><li>[ENDDATETIME]=End date and time</li></ul></td></tr></table><br />"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD="Custom Email if registered to event over a period (from... to...)"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_CUSTOM_SUBJECT_LBL="Custom Subject"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_CUSTOM_SUBJECT_DESC="Enter your custom subject"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_CUSTOM_BODY_LBL	= "Custom Body"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_CUSTOM_BODY_DESC="Enter your custom body"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE="Custom Email if registered to a single date"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_CUSTOM_SUBJECT_LBL="Custom Subject"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_CUSTOM_SUBJECT_DESC="Enter your custom subject"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_CUSTOM_BODY_LBL="Custom Body"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_CUSTOM_BODY_DESC="Enter your custom body"

; Registration - Notification Emails to User
COM_ICAGENDA_EMAILUSERSUBJECTDATE_PLACEHOLDER="Your registration to event '[TITLE]' on [SITENAME]"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_DEFAULT_BODY="Hello [NAME],<br/><br/>You have registered to event '[TITLE]'.<br/><br/>If you want to see again the details of this event, please click on the following link or, if it's not clickable, copy and paste it to your browser.<br/>[EVENTURL]<br/><br/>This email contains your personal information entered when registering for this event on the website [SITEURL].<br/><br/>Name: [NAME]<br/>Email: [EMAIL]<br/>Phone: [PHONE]<br/>Nb of tickets: [PLACES]<br/>Period: from [STARTDATETIME] to [ENDDATETIME]<br/>[CUSTOMFIELDS]<br/>Notes: [NOTES]<br/><br/>You can request information, modify your personal details or cancel your registration by sending an email to: [AUTHOREMAIL]<br/><br/>Best regards,<br/>[SITENAME]"

COM_ICAGENDA_EMAILUSERSUBJECTPERIOD_PLACEHOLDER="Your registration to event '[TITLE]' on [SITENAME]"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_DEFAULT_BODY="Hello [NAME],<br/><br/>You have registered to event '[TITLE]'.<br/><br/>If you want to see again the details of this event, please click on the following link or, if it's not clickable, copy and paste it to your browser.<br/>[EVENTURL]<br/><br/>This email contains your personal information entered when registering for this event on the website [SITEURL].<br/><br/>Name: [NAME]<br/>Email: [EMAIL]<br/>Phone: [PHONE]<br/>Nb of tickets: [PLACES]<br/>Date : [DATETIME]<br/>[CUSTOMFIELDS]<br/>Notes: [NOTES]<br/><br/>You can request information, modify your personal details or cancel your registration by sending an email to: [AUTHOREMAIL]<br/><br/>Best regards,<br/>[SITENAME]"

; Registration - Terms and Conditions
COM_ICAGENDA_REGISTRATION_TERMS_LABEL="Terms and Conditions"
COM_ICAGENDA_REGISTRATION_TERMS_DESC="If enabled, the Terms and Conditions will be displayed and need to be checked by the user before submission of the registration form, for agreement to the Terms and Conditions."
COM_ICAGENDA_REGISTRATION_TERMS_TEXTTYPE_LABEL="Text"
COM_ICAGENDA_REGISTRATION_TERMS_TEXTTYPE_DESC="Select the text used for the Terms and Conditions."
;
; Submit an event
COM_ICAGENDA_SUBMIT_AN_EVENT_LABEL="Submit an Event"
COM_ICAGENDA_SUBMIT_AN_EVENT_DESC="Options of the form to submit an event in the frontend"

COM_ICAGENDA_SUBMIT_EVENT_IMAGE_DISPLAY_LABEL="Event Image"
COM_ICAGENDA_SUBMIT_EVENT_IMAGE_DISPLAY_DESC="Show/Hide 'Event Image' form field"
COM_ICAGENDA_SUBMIT_EVENT_IMAGE_MAX_SIZE_LABEL="Maximum Image Size (in KB)"
COM_ICAGENDA_SUBMIT_EVENT_IMAGE_MAX_SIZE_DESC="The maximum size for an image upload (in kilobytes)."
COM_ICAGENDA_SUBMIT_EVENT_IMAGE_MAX_SIZE_MENU_DESC="The maximum size for an image upload (in kilobytes). If left empty, will use the global setting."
COM_ICAGENDA_SUBMIT_PERIOD_DISPLAY_LABEL="Period"
COM_ICAGENDA_SUBMIT_PERIOD_DISPLAY_DESC="Show/Hide 'Event over a Period' form fields"
COM_ICAGENDA_SUBMIT_WEEKDAYS_DISPLAY_LABEL="Week Days"
COM_ICAGENDA_SUBMIT_WEEKDAYS_DISPLAY_DESC="Show/Hide 'Week Days' select form field"
COM_ICAGENDA_SUBMIT_DATES_DISPLAY_LABEL="Single Dates"
COM_ICAGENDA_SUBMIT_DATES_DISPLAY_DESC="Show/Hide 'Single Dates' form fields"
COM_ICAGENDA_SUBMIT_DISPLAYTIME_DISPLAY_LABEL="Time Display"
COM_ICAGENDA_SUBMIT_DISPLAYTIME_DISPLAY_DESC="Show/Hide 'Time Display' form field"
COM_ICAGENDA_SUBMIT_SHORTDESC_DISPLAY_LABEL="Short Description"
COM_ICAGENDA_SUBMIT_SHORTDESC_DISPLAY_DESC="Show/Hide 'Short Description' form field"
COM_ICAGENDA_SUBMIT_DESCRIPTION_DISPLAY_LABEL="Description"
COM_ICAGENDA_SUBMIT_DESCRIPTION_DISPLAY_DESC="Show/Hide 'Description' form field"
COM_ICAGENDA_SUBMIT_METADESCRIPTION_DISPLAY_LABEL="Meta Description"
COM_ICAGENDA_SUBMIT_METADESCRIPTION_DISPLAY_DESC="Show/Hide 'Meta Description' form field"
COM_ICAGENDA_SUBMIT_VENUE_DISPLAY_LABEL="Venue for the event"
COM_ICAGENDA_SUBMIT_VENUE_DISPLAY_DESC="Show/Hide 'Venue' form field"
COM_ICAGENDA_SUBMIT_EMAIL_DISPLAY_LABEL="Contact's Email"
COM_ICAGENDA_SUBMIT_EMAIL_DISPLAY_DESC="Show/Hide 'Email' form field"
COM_ICAGENDA_SUBMIT_PHONE_DISPLAY_LABEL="Contact's Telephone"
COM_ICAGENDA_SUBMIT_PHONE_DISPLAY_DESC="Show/Hide 'Telephone' form field"
COM_ICAGENDA_SUBMIT_WEBSITE_DISPLAY_LABEL="Event's Website"
COM_ICAGENDA_SUBMIT_WEBSITE_DISPLAY_DESC="Show/Hide 'Website' form field"
COM_ICAGENDA_SUBMIT_CUSTOMFIELDS_DISPLAY_DESC="Show/Hide 'Custom Fields' form field(s)"
COM_ICAGENDA_SUBMIT_ATTACHMENT_DISPLAY_LABEL="File attachment"
COM_ICAGENDA_SUBMIT_ATTACHMENT_DISPLAY_DESC="Show/Hide 'File' form field"
COM_ICAGENDA_SUBMIT_GMAP_DISPLAY_LABEL="Google Maps"
COM_ICAGENDA_SUBMIT_GMAP_DISPLAY_DESC="Show/Hide 'Google Maps' form fields"
COM_ICAGENDA_SUBMIT_REGISTRATION_OPTIONS_DISPLAY_LABEL="Registration options"
COM_ICAGENDA_SUBMIT_REGISTRATION_OPTIONS_DISPLAY_DESC="Show/Hide 'Registration options' form fields (You can show 'Registration Options' only if registration is enabled in Global Options)."


COM_ICAGENDA_SUBMIT_PERMISSIONS_LABEL="Permissions"
COM_ICAGENDA_SUBMIT_FRONTEND_ACCESS_LABEL="Access Permissions to Form (Frontend)"
COM_ICAGENDA_SUBMIT_FRONTEND_ACCESS_DESC="Select the Access Levels authorised to 'Submit an Event' in frontend. On Joomla 2.5, you can use Ctrl-click (Windows) or Cmd-click (Mac) to select more than one item."
COM_ICAGENDA_SUBMIT_NOT_LOGIN_LBL="Not Logged-in Page"
COM_ICAGENDA_SUBMIT_NOT_LOGIN_DESC="Enter your custom content for the page to display when the user is not logged-in. By default, the text 'You must be logged-in to submit an event!' will be displayed."
COM_ICAGENDA_SUBMIT_NO_RIGHTS_LBL="Not Access Page"
COM_ICAGENDA_SUBMIT_NO_RIGHTS_DESC="Enter your custom content for the page to display when a logged-in user has no access rights to the 'Submit an Event' form. By default, the text 'You are not authorised to submit an event.' will be displayed."
COM_ICAGENDA_SUBMIT_APPROVAL_LABEL="Approval Permissions"
COM_ICAGENDA_SUBMIT_APPROVAL_GROUPS_DESC="Select the User Groups authorised to approve submitted events in frontend. All authorised users will receive a notification email when a new event submitted. On Joomla 2.5, you can use Ctrl-click (Windows) or Cmd-click (Mac) to select more than one item."
COM_ICAGENDA_SUBMIT_MANAGERS_NOTE="Events submitted in Frontend by a user (manager) belonging to an authorized group will be automatically approved."

COM_ICAGENDA_SUBMIT_RETURN_LBL="Redirect after Validation"
COM_ICAGENDA_SUBMIT_RETURN_DESC="If you don't want to redirect user after form submission to the iCagenda confirmation page, you can set an external/internal link, or select an article."

COM_ICAGENDA_SUBMIT_TOS_LABEL="Terms of Service"
COM_ICAGENDA_SUBMIT_TOS_DESC="If enabled, the Terms of Service will be displayed and need to be checked by the user before submission of the form, for agreement to the Terms of Service."
COM_ICAGENDA_SUBMIT_TOS_TEXTTYPE_LABEL="Text"
COM_ICAGENDA_SUBMIT_TOS_TEXTTYPE_DESC="Select the text used for the Terms of Service."
COM_ICAGENDA_SUBMIT_TOS_TYPE_DEFAULT_LBL="Default string of translation:"

; General Settings
COM_ICAGENDA_GLOBAL_PARAMS_LABEL="General Settings"
COM_ICAGENDA_GLOBAL_PARAMS_DESC="General Settings of iCagenda"
COM_ICAGENDA_GLOBAL_PARAMS_INFO="The general settings of the extension iCagenda are the common parameters used in component, modules and plugins."

; Responsive Media queries settings
COM_ICAGENDA_SCREEN_WIDTH_THRESHOLDS_LABEL="Responsive Screen Threshold Widths"
COM_ICAGENDA_LARGE_WIDTH_THRESHOLD_LABEL="Large Screen Threshold"
COM_ICAGENDA_LARGE_WIDTH_THRESHOLD_DESC="Enter the threshold screen width for the large size screen (usually a desktop computer). This defines the screen width (in pixels), above which the CSS included in the files [theme name]_component_large and [theme name]_module_large will be effective. This feature will be ignored if the value is set to zero or if the appropriate CSS file does not exist."
COM_ICAGENDA_MEDIUM_WIDTH_THRESHOLD_LABEL="Medium Screen Threshold"
COM_ICAGENDA_MEDIUM_WIDTH_THRESHOLD_DESC="Enter the threshold screen width for the medium size screen (usually a laptop computer). This defines the screen width (in pixels), above which the CSS included in the files [theme name]_component_medium and [theme name]_module_medium will be effective. This feature will be ignored if the value is set to zero or if the appropriate CSS file does not exist."
COM_ICAGENDA_SMALL_WIDTH_THRESHOLD_LABEL="Small Screen Threshold"
COM_ICAGENDA_SMALL_WIDTH_THRESHOLD_DESC="Enter the threshold screen width for the small size screen (usually a tablet computer). Screen sizes smaller than this are considered to be mobile phones. This defines the screen width (in pixels), above which the CSS included in the files [theme name]_component_small and [theme name]_module_small will be effective. For screen sizes below this threshold value, the CSS in the files [theme name]_component_xsmall and [theme name]_module_xsmall will be effective. In addition, for extra small screens, the tooltip in the calendar module will fill the screen. This feature will be ignored if the value is set to zero or if the appropriate CSS file does not exist."

; Date Time Options
COM_ICAGENDA_DATETIME_LABEL="Date Time"
COM_ICAGENDA_TIME_FORMAT_LABEL="Time Format"
COM_ICAGENDA_TIME_FORMAT_DESC="Time display format 24h or 12h am / pm"
COM_ICAGENDA_24="24h"
COM_ICAGENDA_12="12h am/pm"
COM_ICAGENDA_TIMEDISPLAY_DEFAULT_LABEL="Default Time Display"
COM_ICAGENDA_TIMEDISPLAY_DEFAULT_DESC="Select if 'Time Display' option is set by default on 'Show' or 'hide' when creating a new event."
COM_ICAGENDA_FIRSTDAY_WEEK_LABEL="First day of the week"
COM_ICAGENDA_FIRSTDAY_WEEK_DESC="Select the first day of the week (used when list of weekdays is displayed)."

; Icons Bar
COM_ICAGENDA_ICONS="Icons"

; Print Icon
COM_ICAGENDA_ICON_PRINT_LABEL="Print"
COM_ICAGENDA_ICON_PRINT_DESC="Show/Hide 'Print' icon"

; Add 2 Cal Icon - List of Events
COM_ICAGENDA_ICON_ADDTOCAL_LABEL="Add to Calendar"
COM_ICAGENDA_ICON_ADDTOCAL_DESC="Show/Hide 'Add to Cal' icon"
COM_ICAGENDA_ICON_ADDTOCAL_SIZE_LABEL="Calendar icons size"
COM_ICAGENDA_ICON_ADDTOCAL_SIZE_DESC="Select the size in pixels of the calendar icons"
COM_ICAGENDA_ICON_ADDTOCAL_OPTIONS_LABEL="Calendars"
COM_ICAGENDA_ICON_ADDTOCAL_OPTIONS_DESC="If 'Add to Cal' icon is activated, the selection of calendars will be displayed in 'Add to Cal'"
COM_ICAGENDA_VCAL_ICAL_LABEL="iCal Calendar"
COM_ICAGENDA_GCALENDAR_LABEL="Google Calendar"
COM_ICAGENDA_OUTLOOK_LABEL="Outlook Calendar"
COM_ICAGENDA_LIVE_CALENDAR_LABEL="Windows Live Calendar"
COM_ICAGENDA_YAHOO_CALENDAR_LABEL="Yahoo Calendar"

; Thumbnail Generator
COM_ICAGENDA_THUMBNAILS_LABEL="Thumbnails"
COM_ICAGENDA_ICTHUMB_LABEL="Thumbnail Generator"
COM_ICAGENDA_ICTHUMB_DESC="Enable or disable the thumbnail generator.<br />We recommend that you disable this option only if you encounter any bugs or a weird display of the page (frontend and/or admin)."

; Categories admin
COM_ICAGENDA_CATEGORY_SELECT_LIST="Category Select List"
COM_ICAGENDA_CATEGORY_ORDER_LABEL="Category Order"
COM_ICAGENDA_CATEGORY_SELECT_LIST_ORDER_DESC="The order that categories will show in select list."
COM_ICAGENDA_CATEGORY_SELECT_LIST_DEFAULT_LABEL="Default Category"
COM_ICAGENDA_CATEGORY_SELECT_LIST_DEFAULT_DESC="The category selected by default."
COM_ICAGENDA_CATEGORY_SELECT_LIST_STATUS_ADMIN_LABEL="Category Status - Admin"
COM_ICAGENDA_CATEGORY_SELECT_LIST_STATUS_ADMIN_DESC="The status of the categories to be displayed in Admin Category Select List."
COM_ICAGENDA_CATEGORY_SELECT_LIST_STATUS_SITE_LABEL="Category Status - Site"
COM_ICAGENDA_CATEGORY_SELECT_LIST_STATUS_SITE_DESC="The status of the categories to be displayed in Frontend Category Select List."

; Autofill Username and email
COM_ICAGENDA_JOOMLA_USER_LABEL="Joomla User Autofill"

; Plugin Autologin
COM_ICAGENDA_SENDING_EMAIL_LABEL="Sending Emails"
COM_ICAGENDA_AUTOLOGIN_LABEL="Autologin"
COM_ICAGENDA_AUTOLOGIN_DESC="The iCagenda Autologin plugin allows to automatically connect an authorized user when clicking on a not public URL inserted in a notification email. You can disable this function by using this option."

; Miscellaneous Global Options
COM_ICAGENDA_MISCELLANEOUS_LABEL="Miscellaneous"

COM_ICAGENDA_EVENT_TITLE_LBL="Event Title"
COM_ICAGENDA_TEXT_TRANSFORM_LBL="Text Transform"
COM_ICAGENDA_TEXT_TRANSFORM_DESC="Control the capitalization of text"
IC_FIRST_UPPERCASE="First character to uppercase"
IC_CAPITALIZE="Capitalize"
IC_UPPERCASE="Uppercase"
IC_LOWERCASE="Lowercase"
COM_ICAGENDA_SHORT_DESCRIPTION_LBL="Short Description"
COM_ICAGENDA_SHORT_DESCRIPTION_LIMIT_DESC="Character limit of the Short Description."
COM_ICAGENDA_META_DESCRIPTION_LBL="Meta Description"
COM_ICAGENDA_META_DESCRIPTION_LIMIT_DESC="Character limit of the Meta Description. Meta descriptions can be any length, but search engines generally truncate snippets longer than 160 characters. It is best to keep meta descriptions between 150 and 160 characters."
COM_ICAGENDA_AUTO_SHORT_DESCRIPTION_LBL="Auto-Introtext"
COM_ICAGENDA_AUTO_INTROTEXT_LIMIT_DESC="Character limit of the Auto-created introduction text from the full description."
COM_ICAGENDA_HTML_FILTERING_LABEL="HTML Filtering"
COM_ICAGENDA_FILTERING_SHORTDESC_DESC="Determines how HTML will be filtered in 'Auto-Introtext'."
COM_ICAGENDA_ALL_ITALIC="All italicized"
COM_ICAGENDA_NO_HTML="No HTML"
COM_ICAGENDA_AUTHORIZED_HTML_TAGS="Authorized HTML tags"
COM_ICAGENDA_FILTERING_SHORTDESC_AUTHORIZED_HTML_TAGS_DESC="Select the HTML tags authorized in 'Auto-Introtext'. Select one or more items from the list. Usage of tags selected will depend on your editor, and the html source code used in your description (toggle your editor to view html tags of your event description). Inline styles won't be taken into consideration. On Joomla 2.5, you can use Ctrl-click (Windows) or Cmd-click (Mac) to select more than one item."
COM_ICAGENDA_CUSTOMIZATION="Customization"
COM_ICAGENDA_CUSTOM_CSS_ACTIVATION_LBL="Load Custom CSS"
COM_ICAGENDA_CUSTOM_CSS_ACTIVATION_DESC="Should we load the Custom CSS Code entered bellow?"
COM_ICAGENDA_CUSTOM_CSS_LBL="Custom CSS Code"
COM_ICAGENDA_CUSTOM_CSS_DESC="Create custom CSS stylesheets to add to the iCagenda styles or to override existing CSS styles and classes."
COM_ICAGENDA_CUSTOM_CSS_HINT="Enter your custom CSS code here..."

; PRO Options
COM_ICAGENDA_COPY_LABEL="Show/Hide "_QQ_"Powered by iCagenda"_QQ_" &#3664; Hide &#3663; Show &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b>PRO version : <a href="_QQ_"http://www.joomlic.com/extensions/icagenda"_QQ_" target="_QQ_"_blank"_QQ_">Purchase</a></b>"
COM_ICAGENDA_COPY_DESC="Show/Hide "_QQ_"Powered by iCagenda"_QQ_""
COM_ICAGENDA_PRO_LABEL="PRO OPTIONS"
COM_ICAGENDA_PRO_ACCOUNT_INFO="<h2>Pro Account <small>(Updates and Ticket Support)</small></h2>Once you order a commercial version of iCagenda, a personal account will be created by JoomliC Team within 2 business days on site: <a href='http://pro.joomlic.com' target='_blank'><strong>pro.joomlic.com</strong></a><br /><br /><h3>You can enable Pro Live Updates in 2 ways:</h3><ul><li>Enter the <strong>Pro ID</strong> Download Key</li><li><strong>OR</strong> enter your <strong>Username and Password</strong> to the site pro.joomlic.com</li></ul><i>Before first update, please click on 'Refresh update information' button to clean the download url cache.</i>"
COM_ICAGENDA_PRO_COPY_LABEL="Show/Hide "_QQ_"Powered by iCagenda"_QQ_""
COM_ICAGENDA_PRO_COPY_DESC="Display the signature "_QQ_"Powered by iCagenda"_QQ_""
PRO_JOOMLIC_UPDATES_INFORMATION="Pro Updates Information"
PRO_JOOMLIC_USERNAME_LBL="Username"
PRO_JOOMLIC_USERNAME_DESC="Enter the username to the site pro.joomlic.com in order to enable live updates of the Professional release."
PRO_JOOMLIC_PASSWORD="Password"
PRO_JOOMLIC_PASSWORD_DESC="Enter the password to the site pro.joomlic.com in order to enable live updates of the Professional release."
COM_ICAGENDA_PRO_ID_LABEL="Pro ID"
COM_ICAGENDA_PRO_ID_DESC="Enter your Pro ID download key to enable live updates of the Professional release."
COM_ICAGENDA_PRO_CONFIG_LIVEUPDATE_MINSTABILITY_LABEL="Minimum release stability for update notifications"
COM_ICAGENDA_PRO_UPDATE_SERVER="Update server"
COM_ICAGENDA_PRO_CONFIG_LIVEUPDATE_MINSTABILITY_DESC="Select the minimum release stability level for which you will be notified that a new update is available. Please use only Stable or RC on production sites! Help us testing iCagenda releases on live servers by installing alphas and betas (Testing)."
ICAGENDA_STABILITY_TESTING="Testing (Alpha and beta)"
ICAGENDA_STABILITY_ALPHA="Alpha"
ICAGENDA_STABILITY_BETA="Beta"
ICAGENDA_STABILITY_RC="Release Candidate"
ICAGENDA_STABILITY_STABLE="Stable"

; PRO Messages
COM_ICAGENDA_PRO_WELCOME="Welcome on %s!"
COM_ICAGENDA_PRO_WELCOME_PRO_ACCOUNT_INFO="After purchasing %s on Share-it, a personal account will be created manually by JoomliC Team within 2 business days on site : %s"
COM_ICAGENDA_PRO_WELCOME_PRO_NOTIFICATION_EMAILS="You will received 2 notification emails from %s"
COM_ICAGENDA_PRO_WELCOME_PRO_NOTIFICATION_EMAILS_FIRST="First email with your username and password to login at %s website."
COM_ICAGENDA_PRO_WELCOME_PRO_NOTIFICATION_EMAILS_SECOND="Second email with your subscription details."
COM_ICAGENDA_PRO_WELCOME_PRO_CHECK_YOUR_EMAIL="Please check your email (spam box on your webmail too)."
COM_ICAGENDA_PRO_WELCOME_PRO_FIRST_LOGIN_1="When first login at %s, you will be able to edit your profil with username and password of your preference."
COM_ICAGENDA_PRO_WELCOME_PRO_FIRST_LOGIN_2="Then, you will have access at your Pro ID download key."
COM_ICAGENDA_PRO_WELCOME_PRO_OPTIONS="Copy/paste your Pro ID key in the 'PRO OPTIONS' tab of the component global options%s"
COM_ICAGENDA_PRO_WELCOME_PRO_ID_1="Pro ID is required to process updates of %s from your Joomla website."
;COM_ICAGENDA_PRO_WELCOME_PRO_ID_2="Thank you for paying attention to the fact that each edition of your profile, change your main Pro ID download key."
COM_ICAGENDA_PRO_WELCOME_CONTACT="Do not hesitate to contact us anytime for further assistance during your subscription."
COM_ICAGENDA_PRO_WELCOME_SUPPORT="Please do not use the contact email for technical questions or support. Use our %s instead."
COM_ICAGENDA_PRO_WELCOME_NOTE="Note: When contacting us by email, do not forget to use the email address given during your purchase on Share-it, or in the case of a different email address, specify your order number. This will prevent your email to be discarded."
COM_ICAGENDA_WELCOME_RELOAD="Reload Welcome Message"
COM_ICAGENDA_WELCOME_RELOAD_DESC="Reload the welcome message containing information about your first steps with iCagenda Pro."
COM_ICAGENDA_WELCOME_HIDE_SUCCESS="Welcome Message hide successfully"

; Captcha
COM_ICAGENDA_CAPTCHA="Captcha"
COM_ICAGENDA_CAPTCHA_LABEL="Captcha Plugin"
COM_ICAGENDA_CAPTCHA_DESC="Select the captcha plugin that will be used in the site forms of iCagenda component. You may need to enter required information for your captcha plugin in the Plugin Manager.<br />If 'Use Default' is selected, make sure a captcha plugin is selected in Global Configuration."
;
COM_ICAGENDA_REGISTRATION_CAPTCHA_DESC="Show/Hide the captcha in the 'Registration' form. You can set the Captcha Plugin in the 'General Settings' tab of iCagenda Options."
COM_ICAGENDA_SUBMIT_CAPTCHA_DESC="Show/Hide the captcha in the 'Submit an Event' form. You can set the Captcha Plugin in the 'General Settings' tab of iCagenda Options."
COM_ICAGENDA_MENU_SUBMIT_CAPTCHA_DESC="Select the captcha plugin that will be used in the 'Submit an Event' form. You may need to enter required information for your captcha plugin in the Plugin Manager.<br />If 'Use Global' is selected, make sure a captcha plugin is selected in Global Configuration of iCagenda."
COM_ICAGENDA_NONE_SELECTED="- None Selected -"

; Items and messages
COM_ICAGENDA_N_ITEMS_ARCHIVED="% d items saved successfully"
COM_ICAGENDA_N_ITEMS_ARCHIVED_1="% d item saved successfully"
COM_ICAGENDA_N_ITEMS_CHECKED_IN_0="No element tested successfully"
COM_ICAGENDA_N_ITEMS_CHECKED_IN_1="% d element tested successfully"
COM_ICAGENDA_N_ITEMS_CHECKED_IN_MORE="% d is checked successfully"
COM_ICAGENDA_N_ITEMS_DELETED="% d items deleted successfully"
COM_ICAGENDA_N_ITEMS_DELETED_1="% d item successfully deleted"
COM_ICAGENDA_N_ITEMS_PUBLISHED="% d items published successfully"
COM_ICAGENDA_N_ITEMS_PUBLISHED_1="% d item published successfully"
COM_ICAGENDA_N_ITEMS_TRASHED="% d items trashed"
COM_ICAGENDA_N_ITEMS_TRASHED_1="% d item trashed"
COM_ICAGENDA_N_ITEMS_UNPUBLISHED="% d items not published"
COM_ICAGENDA_N_ITEMS_UNPUBLISHED_1="% d item is not published"
COM_ICAGENDA_NO_ITEM_SELECTED="Nothing selected"
COM_ICAGENDA_SAVE_SUCCESS="Item successfully saved"

; Filters Select
COM_ICAGENDA_SELECT_STATE="- Status -"
COM_ICAGENDA_SELECT_CATEGORY="- Category -"
COM_ICAGENDA_SELECT_DATES="- Dates -"
COM_ICAGENDA_SELECT_SITE_ITEMID="- Frontend Item ID -"

COM_ICAGENDA_SELECT_EVENT="- Select Event -"
COM_ICAGENDA_SELECT_DATE="- Select Date -"
COM_ICAGENDA_SELECT_NO_EVENT_SELECTED="No event selected"

; Categories list
COM_ICAGENDA_TITLE_CATEGORIES="Categories"
COM_ICAGENDA_CATEGORIES_TITLE="Title"
COM_ICAGENDA_CATEGORIES_COLOR="Colour"

; Events list
COM_ICAGENDA_TITLE_EVENTS="Events"
COM_ICAGENDA_EVENTS_TITLE="Title"
COM_ICAGENDA_EVENTS_USERNAME="Username"
COM_ICAGENDA_EVENTS_CATID="Category"
COM_ICAGENDA_EVENTS_IMAGE="Image"
COM_ICAGENDA_EVENTS_NEXT="Date"
COM_ICAGENDA_EVENTS_COMPLETED="Event Completed"
COM_ICAGENDA_EVENTS_NEXT_PAST="Last Date : "
COM_ICAGENDA_EVENTS_NEXT_FUTUR="Next Date : "
COM_ICAGENDA_EVENTS_NEXT_TODAY="TODAY : "
COM_ICAGENDA_EVENTS_PLACE="Place"
COM_ICAGENDA_EVENTS_APPROVAL="Approval"
COM_ICAGENDA_EVENTS_APPROVAL_DESC="Approve or Unapprove an event"
COM_ICAGENDA_TOOLBAR_APPROVE="Approve"
COM_ICAGENDA_APPROVED="Approved"
COM_ICAGENDA_UNAPPROVED="Unapproved"
COM_ICAGENDA_N_EVENTS_APPROVED="%s Events successfully approved"
COM_ICAGENDA_N_EVENTS_APPROVED_0="No event approved"
COM_ICAGENDA_N_EVENTS_APPROVED_1="Event successfully approved"

; Warning events list
COM_ICAGENDA_EVENTS_NEXT_ALERT="Warning : no valid date!"
COM_ICAGENDA_INVALID_PICTURE_LINK="Invalid picture link!"
COM_ICAGENDA_NO_VALID_DATE="No valid date!"
COM_ICAGENDA_ERROR_MIME_TYPE="Error mime-type !!!"
COM_ICAGENDA_ERROR_MIME_TYPE_NO_THUMBNAIL="Thumbnails cannot be created."
COM_ICAGENDA_ERROR_MIME_TYPE_INFO="Your file extension <i>%s</i> is not correct, as the mime-type is <i>%s</i>."
COM_ICAGENDA_NOT_AUTHORIZED_IMAGE_TYPE="Wrong image file format!"
COM_ICAGENDA_NOT_AUTHORIZED_IMAGE_TYPE_INFO="Thumbnails creation is compatible with the following formats: jpg, jpeg, png, gif and bmp."
COM_ICAGENDA_FORM_NO_DATES_ALERT="Please fill in the dates of the event."

; Registrations
COM_ICAGENDA_REGISTRATIONS_SELECT_STATUS="- Registration Status -"
COM_ICAGENDA_REGISTRATIONS_SELECT_CATEGORY="- Select Category -"
COM_ICAGENDA_REGISTRATIONS_SELECT_EVENT="- Select Event -"
COM_ICAGENDA_REGISTRATIONS_SELECT_DATE="- Select Date -"
COM_ICAGENDA_TITLE_REGISTRATION="Registrations"
COM_ICAGENDA_REGISTRATION_INFORMATION="Registration Information"
COM_ICAGENDA_REGISTRATION_USER="User Name"
COM_ICAGENDA_REGISTRATION_USER_ID="User ID"
COM_ICAGENDA_REGISTRATION_NO_USER_ID="Registered as visitor"
COM_ICAGENDA_REGISTRATION_USERID="Username"
COM_ICAGENDA_REGISTRATION_EVENTID="Event"
COM_ICAGENDA_REGISTRATION_DATE="Date"
COM_ICAGENDA_REGISTRATION_ALL_DATES="All dates"
COM_ICAGENDA_REGISTRATION_ALL_PERIOD="All event period"
COM_ICAGENDA_REGISTRATION_NUMBER_PLACES="Number of people"
COM_ICAGENDA_REGISTRATION_PEOPLE="N.P."
COM_ICAGENDA_REGISTRATION_EMAIL="Email"
COM_ICAGENDA_REGISTRATION_PHONE="Phone"
COM_ICAGENDA_REGISTRATION_EVENT_NOT_PUBLISHED="Event not published"
COM_ICAGENDA_REGISTRATION_TICKETS="Tickets"

; Registrations Export
COM_ICAGENDA_REGISTRATIONS_DOWNLOAD="Download List of Registrations"
COM_ICAGENDA_REGISTRATIONS_EXPORT="Export"
COM_ICAGENDA_CANCEL="Cancel"
COM_ICAGENDA_EXPORT_SEPARATOR_LABEL="Separator"
COM_ICAGENDA_EXPORT_SEPARATOR_DESC="Select comma (default) or semicolon to separate values."
IC_COMMA="Comma [ , ]"
IC_SEMICOLON="Semicolon [ ; ]"
COM_ICAGENDA_EXPORT_COMPRESSED_LABEL="Compressed"
COM_ICAGENDA_EXPORT_COMPRESSED_DESC="Option to compress file for export."
COM_ICAGENDA_EXPORT_BASENAME_LABEL="File Name"
COM_ICAGENDA_EXPORT_BASENAME_DESC="File name pattern which can contain<br />__SITE__ for the site name<br />__EVENTID__ for the event ID<br />__EVENT__ for the event title<br />__DATE__ for the date saved in database."
COM_ICAGENDA_NO_EVENT_TITLE="No Title"
COM_ICAGENDA_EXPORT_ERR_ZIP_ADAPTER_FAILURE="Zip adapter failure"
COM_ICAGENDA_EXPORT_ERR_ZIP_CREATE_FAILURE="Zip create failure"
COM_ICAGENDA_EXPORT_ERR_ZIP_DELETE_FAILURE="Zip delete failure"

; Registration Edit
COM_ICAGENDA_LEGEND_NEW_REGISTRATION="New registration"
COM_ICAGENDA_LEGEND_EDIT_REGISTRATION="Edit Registration"
COM_ICAGENDA_REGISTRATION_TYPE_FOR_THIS_EVENT="'Registration Type' option for this event is : %s"
COM_ICAGENDA_REGISTRATION_NO_DATE_SELECTED="No date selected"
COM_ICAGENDA_REGISTRATION_ERROR_DATE_CONTROL="iCagenda was not able to control the registration date and convert it to the new standard date format now used when recording in the database (introduced since version 3.3.3).<br />Thank you kindly to select the date %s below before saving the entry, if you want to upgrade this value in the database."
COM_ICAGENDA_REGISTRATION_DATE_NO_LONGER_EXISTS="The date %s no longer exists!"
COM_ICAGENDA_REGISTRATION_PERIOD_NO_LONGER_EXISTS="Registration for a full period (not divided into single dates) is not anymore available because week days are now selected for this event."
COM_ICAGENDA_REGISTRATION_BY_DATE_NO_LONGER_POSSIBLE="The date saved for this registration is not available anymore, because event registration type is now '%s'. Please select '%s' if you want to update this registration."
COM_ICAGENDA_REGISTRATION_FOR_ALL_DATES_NO_LONGER_POSSIBLE="Registration for all dates of the event is not available anymore, because event registration type is now '%s'. Please select a date if you want to update this registration."
COM_ICAGENDA_REGISTRATION_NO_EVENT_SELECTED_ALERT="Please select an event for this new registration."


; Category Edit
COM_ICAGENDA_LEGEND_NEW_CATEGORY="New Category"
COM_ICAGENDA_LEGEND_EDIT_CATEGORY="Edit Category"
COM_ICAGENDA_TITLE_CATEGORY="Category"
COM_ICAGENDA_LEGEND_CATEGORY="Category"
COM_ICAGENDA_FORM_LBL_CATEGORY_TITLE="Title"
COM_ICAGENDA_FORM_DESC_CATEGORY_TITLE="Select the category title"
COM_ICAGENDA_FORM_LBL_CATEGORY_COLOR="Colour"
COM_ICAGENDA_FORM_DESC_CATEGORY_COLOR="Select the colour of the category"
COM_ICAGENDA_FORM_LBL_CATEGORY_DESC="Description"
COM_ICAGENDA_FORM_DESC_CATEGORY_DESC="Category description"

; Event Edit
COM_ICAGENDA_TITLE_EVENT="Event"
;
; Right Sidebar
COM_ICAGENDA_TITLE_SIDEBAR_DETAILS="Details"
;
; Panel Publishing Options
COM_ICAGENDA_ACCESS_DESC="The access level group that is allowed to view this event."
;
; Panel Event
COM_ICAGENDA_LEGEND_NEW_EVENT="New Event"
COM_ICAGENDA_LEGEND_EDIT_EVENT="Edit Event"
COM_ICAGENDA_FORM_LBL_EVENT_TITLE="Title"
COM_ICAGENDA_FORM_DESC_EVENT_TITLE="Title of the event"
COM_ICAGENDA_FORM_LBL_EVENT_USERNAME="Username"
COM_ICAGENDA_FORM_DESC_EVENT_USERNAME="Editor's Username"
COM_ICAGENDA_FORM_LBL_EVENT_CATID="Category"
COM_ICAGENDA_FORM_DESC_EVENT_CATID="Select the category to which belong in the event"
COM_ICAGENDA_FORM_DESC_LANGUAGE="Assign a language to this event."
;
; Panel Attachments
COM_ICAGENDA_LEGEND_ALLEG="Attachments"
COM_ICAGENDA_FORM_LBL_EVENT_IMAGE="Event Image"
COM_ICAGENDA_FORM_DESC_EVENT_IMAGE="Image for the event (jpg, jpeg, png, gif, bmp)"
COM_ICAGENDA_FORM_LBL_EVENT_FILE="File"
COM_ICAGENDA_FORM_DESC_EVENT_FILE="Attach a file to the event"
;
; Panel Dates
COM_ICAGENDA_LEGEND_DATES="Dates"
COM_ICAGENDA_DATES_HELP="Note: You can select several options and combinations for the dates of the event. <small style="_QQ_"text-decoration:underline; float:right;"_QQ_">Read More</small>"
COM_ICAGENDA_DATES_HELP_INTRO="You can add an event taking place over a period, with a start date and an end date, and/or single dates:"
COM_ICAGENDA_DATES_HELP_LINE1="Event with a single date, and a start time"
COM_ICAGENDA_DATES_HELP_EXAMPLE1="eg a concert that starts at 20:00 and takes place only the selected day."
COM_ICAGENDA_DATES_HELP_LINE2="Event with several dates, consecutive or otherwise, with a start time, which may be different for each date."
COM_ICAGENDA_DATES_HELP_EXAMPLE2="eg a concert that would take place a week on Friday and Saturday, and the following week on Friday. This concert can started at different times, and you can add new dates at any time."
COM_ICAGENDA_DATES_HELP_LINE3="Event over a period (from ... to ...)."
COM_ICAGENDA_DATES_HELP_EXAMPLE3="eg a music festival which starts on Thursday at 14:00 and ends on Sunday at 23:00. In this case, you enter the start date and end date."
COM_ICAGENDA_DATES_HELP_LINE4="The event takes place over a period and you want to add specific hours."
COM_ICAGENDA_DATES_HELP_EXAMPLE4="eg A band participates in a music festival from Thursday 14:00 to Sunday 23:00. On Thursday, the band plays at 16:30, Saturday at 18:00 and Sunday at 13:15. You can then enter the period of the event (from Thursday 14:00 to Sunday 23:00) and add the single dates with time, when the band is on stage."
COM_ICAGENDA_DATES_HELP_LINE5="The event takes place over a period, and other dates that are not in this period."
COM_ICAGENDA_DATES_HELP_EXAMPLE5="eg an event which takes place from Monday to Sunday (dates over a period) and another week on Tuesday and Friday (single dates)."
;
COM_ICAGENDA_LEGEND_PERIOD_DATES="Event over a Period"
COM_ICAGENDA_FORM_LBL_EVENTPERIOD_START="Start Date"
COM_ICAGENDA_FORM_DESC_EVENTPERIOD_START="Date and time of beginning of event"
COM_ICAGENDA_FORM_LBL_EVENTPERIOD_END="End Date"
COM_ICAGENDA_FORM_DESC_EVENTPERIOD_END="Date and time of end of event"
COM_ICAGENDA_FORM_LBL_WEEK_DAYS="Week Days"
COM_ICAGENDA_FORM_WEEK_DAYS_INFO_TITLE="Selection of Week Days"
COM_ICAGENDA_FORM_WEEK_DAYS_INFO_DESC="You can split the period into single dates by selecting the days of the week.<br />If left empty, the period will not be divided, and will be considered as a full period (from ... to ... ).<br /><small>You can use Ctrl-click (Windows) or Cmd-click (Mac) to select more than one item.</small>"
COM_ICAGENDA_FORM_ALL_WEEK_DAYS="All the days of the week"
;
COM_ICAGENDA_LEGEND_SINGLE_DATES="Single Dates"
COM_ICAGENDA_FORM_LBL_EVENT_DATES="Date"
COM_ICAGENDA_FORM_DESC_EVENT_DATES="Select the dates of the event"
COM_ICAGENDA_ADD_DATE="Add"
COM_ICAGENDA_DELETE_DATE="Delete"
COM_ICAGENDA_TB_DATE="Date"
COM_ICAGENDA_TB_ACT="Actions"
COM_ICAGENDA_FORM_LBL_EVENT_NEXT="Closest date"
COM_ICAGENDA_FORM_DESC_EVENT_NEXT="Indicates the date of the event closest"
;
COM_ICAGENDA_DISPLAY_TIME_LABEL="Time Display"
COM_ICAGENDA_DISPLAY_TIME_DESC="Show or Hide Time of the event"
;
; Panel Information
COM_ICAGENDA_LEGEND_INFORMATION="Information"
;
; Panel Venue
COM_ICAGENDA_LEGEND_VENUE="Venue for the event"
COM_ICAGENDA_FORM_LBL_EVENT_VENUE="Venue"
COM_ICAGENDA_FORM_DESC_EVENT_VENUE="the place where event happens (MoMA, Eiffel Tower, European Stadium, London Concert Hall, Your Home, School, University, Building...)"
;
COM_ICAGENDA_LEGEND_PLACE="Place of the event"
COM_ICAGENDA_FORM_LBL_EVENT_PLACE="Name"
COM_ICAGENDA_FORM_DESC_EVENT_PLACE="Name of the place where the event will take place (MoMA, Eiffel Tower, European Stadium, London Concert Hall, ...)"
COM_ICAGENDA_FORM_LBL_EVENT_CITY="City"
COM_ICAGENDA_FORM_DESC_EVENT_CITY="The city where the event takes place"
COM_ICAGENDA_FORM_LBL_EVENT_COUNTRY="Country"
COM_ICAGENDA_FORM_DESC_EVENT_COUNTRY="The country where the event takes place"
;
COM_ICAGENDA_LEGEND_CONTACT="Contact Details"
COM_ICAGENDA_FORM_LBL_EVENT_EMAIL="Email"
COM_ICAGENDA_FORM_DESC_EVENT_EMAIL="Contact's Email"
COM_ICAGENDA_FORM_LBL_EVENT_PHONE="Telephone"
COM_ICAGENDA_FORM_DESC_EVENT_PHONE="Contact's Telephone"
COM_ICAGENDA_FORM_LBL_EVENT_WEBSITE="Website"
COM_ICAGENDA_FORM_DESC_EVENT_WEBSITE="Event's Website"
;
; Panel Features
COM_ICAGENDA_LEGEND_FEATURES="Event Features"
COM_ICAGENDA_FORM_LBL_EVENT_FEATURES="Features"
COM_ICAGENDA_FORM_DESC_EVENT_FEATURES="Select the feature(s) that apply to this event"
COM_ICAGENDA_FORM_DESC_EVENT_FEATURES_FILTER="Select the feature(s) that you wish to use to filter events for this menu item. Please note that if a single feature is selected, only events where that feature is present will be selected. However, if more than one feature is selected, use the 'All Features or Any Feature?' option to determine how selections are made."
;
; Panel Description
COM_ICAGENDA_LEGEND_DESC="Description"
COM_ICAGENDA_FORM_EVENT_SHORT_DESCRIPTION_LBL="Short Description"
COM_ICAGENDA_FORM_EVENT_SHORT_DESCRIPTION_DESC="An optional paragraph to be used as the 'Intro Text' of an event, in the list of events."
COM_ICAGENDA_FORM_LBL_EVENT_DESC="Description"
COM_ICAGENDA_FORM_DESC_EVENT_DESC="Event Description"
COM_ICAGENDA_FORM_EVENT_METADESC_LBL="Meta Description"
COM_ICAGENDA_FORM_EVENT_METADESC_DESC="An optional paragraph to be used as the description of the event page in the HTML output. This will generally display in the results of search engines."
; OLD: COM_ICAGENDA_FORM_EVENT_METADESC_DESC="An optional paragraph to be used as the description of the event page in the HTML output. This will generally display in the results of search engines and will be used as description for Open Graph when sharing on social networks. Meta description should be 150 to 160 characters. If empty, iCagenda will automatically generate for you a short meta-description based on full description."
COM_ICAGENDA_MAXIMUM_N_CHARACTERS="Maximum %s characters"
COM_ICAGENDA_N_REMAINING="(%s remaining)"
;
; Panel Options
COM_ICAGENDA_REGISTRATION_OPTIONS="Registration options"
COM_ICAGENDA_REGISTRATION_LABEL="Registration"
COM_ICAGENDA_REGISTRATION_DESC="Enable registration for this event"
COM_ICAGENDA_REGISTRATION_LINK_LBL="Link to Registration Page"
COM_ICAGENDA_REGISTRATION_LINK_DESC="If you don't want to use iCagenda Registration Form, you can set an external/internal link to your custom registration page, or select an article. Note: iCagenda won't saved data if usage of an URL or an article."
COM_ICAGENDA_REGISTRATION_LINK_ARTICLE="Article"
COM_ICAGENDA_REGISTRATION_LINK_URL="URL"

COM_ICAGENDA_REGISTRATION_FORM_OPTIONS_LABEL="Registration Form Options"
COM_ICAGENDA_TYPE_REG_LABEL="Registration Type"
COM_ICAGENDA_TYPE_REG_DESC="Select the type for registration : by date (displays a select list of dates), or for all dates of the event."
COM_ICAGENDA_REG_BY_DATE_OR_PERIOD="all options"
COM_ICAGENDA_REG_BY_INDIVIDUAL_DATE="by date"
COM_ICAGENDA_REG_FOR_ALL_DATES="for all dates"
COM_ICAGENDA_REG_FOR_ALL_PERIOD="for all event period"
COM_ICAGENDA_ADMIN_REGISTRATION_BY_INDIVIDUAL_DATE="select list of dates"
COM_ICAGENDA_ADMIN_REGISTRATION_FOR_ALL_DATES="for all dates of the event"
COM_ICAGENDA_ADMIN_REGISTRATION_FOR_ALL_PERIOD="for all the period"
COM_ICAGENDA_MAX_REGISTRATIONS_LABEL="Nb of tickets"
COM_ICAGENDA_MAX_REGISTRATIONS_DESC="Maximum number of tickets available per date (or per period if no week days selected).<br />If <strong>Registration Type</strong> option is set to 'For all the dates of the event', the maximun number of tickets will be set to the whole event, and not per date."
COM_ICAGENDA_MAX_PER_REGISTRATION_LABEL="MAX. Tickets/Registration"
COM_ICAGENDA_MAX_PER_REGISTRATION_DESC="Maximum number of tickets available during one registration"
COM_ICAGENDA_CUSTOM_TEXT="Custom Text"
COM_ICAGENDA_REGISTRATION_BUTTON="Registration Button"
COM_ICAGENDA_REGISTRATION_REGISTER="Register"
COM_ICAGENDA_REGISTRATION_BUTTON_TEXT="Button text to register"
COM_ICAGENDA_REGISTRATION_BUTTON_TEXT_DESC="You can enter a custom text for Registration button. This overrides the core text used for this button and, if set, the value set in global options of iCagenda."
COM_ICAGENDA_BROWSER_TARGET="Target"
COM_ICAGENDA_REGISTRATION_LINK_BROWSER_TARGET_DESC="Browser target of the registration button."
;
COM_ICAGENDA_ADDTHIS_DISPLAY_SHARING="Display sharing"
;
; Google Maps
COM_ICAGENDA_LEGEND_GOOGLE_MAPS="Google Maps"
COM_ICAGENDA_GOOGLE_MAPS_SUBTITLE_LBL="Address picker, with instant display selection on map."
COM_ICAGENDA_GOOGLE_MAPS_NOTE1="The map displays selected address, even while you navigate in autocomplete suggestions."
COM_ICAGENDA_GOOGLE_MAPS_NOTE2="You can even adjust marker position on the map."
COM_ICAGENDA_GOOGLE_MAPS_ADDRESS_LBL="Address"
COM_ICAGENDA_GOOGLE_MAPS_LATITUDE_LBL="Latitude"
COM_ICAGENDA_GOOGLE_MAPS_LONGITUDE_LBL="Longitude"
COM_ICAGENDA_GOOGLE_MAPS_REVERSE="Reverse Address after Marker Drag?"
COM_ICAGENDA_GOOGLE_MAPS_LEGEND="You can drag and drop the marker to the correct location"
COM_ICAGENDA_FORM_LBL_EVENT_LOCATION="Enter location to view map"
COM_ICAGENDA_FORM_DESC_EVENT_LOCATION="Enter location to view map: full address, street number, city, state, ..."
COM_ICAGENDA_FORM_LBL_EVENT_MAP="<i>Geographic Location</i>"
COM_ICAGENDA_FORM_DESC_EVENT_MAP="Location on Google Maps where the event takes place (move the cursor over the map to adjust automatically)"
COM_ICAGENDA_FORM_LBL_EVENT_GPS="<i>GPS</i>"
;
; Event Panel Publishing
COM_ICAGENDA_FORM_FRONTEND_OPTIONS="Frontend Form Information"
COM_ICAGENDA_FORM_FRONTEND_SUBMIT_ITEMID_LBL="Menu Item ID"
COM_ICAGENDA_FORM_FRONTEND_SUBMIT_ITEMID_DESC="ID of the menu item used to submit this event in frontend."
;
; Locations
COM_ICAGENDA_LOCATION_NAME_LBL="Name of Location"
;
; Warning Messages Box
COM_ICAGENDA_FORM_WARNING="Warning !"
COM_ICAGENDA_FORM_ALERT_UNPUBLISHED="Your event will not be published: no valid date for this event"
COM_ICAGENDA_FORM_ERROR_NO_STARTDATE="Error: You have specified an end date, but no start date for your event"
COM_ICAGENDA_FORM_ERROR_NO_ENDDATE="Error: You have specified a start date but no end date for your event"
COM_ICAGENDA_FORM_ERROR_INVALID_PERIOD="Period invalid : the beginning is later than the end"
;
; Not in use currently, but you can keep this lines of translation
COM_ICAGENDA_FORM_LBL_EVENT_ADDRESS="Address"
COM_ICAGENDA_FORM_DESC_EVENT_ADDRESS="Full address, street number, city, state, ..."

; Custom Fields List
COM_ICAGENDA_TITLE_CUSTOMFIELDS="Custom Fields"
COM_ICAGENDA_CUSTOMFIELDS="Custom Fields"
COM_ICAGENDA_CUSTOMFIELDS_NONE="No custom fields published"
COM_ICAGENDA_CUSTOMFIELDS_FILTER_OPTION_SELECT_PARENT_FORM="- Select Parent Form -"
COM_ICAGENDA_CUSTOMFIELDS_FILTER_OPTION_SELECT_TYPE="- Select Type -"
COM_ICAGENDA_CUSTOMFIELDS_FILTER_SEARCH_DESC="Search in custom fields"

; Custom Field Edit
COM_ICAGENDA_CUSTOMFIELD_LEGEND_NEW="New Custom Field"
COM_ICAGENDA_CUSTOMFIELD_LEGEND_EDIT="Edit Custom Field"
COM_ICAGENDA_CUSTOMFIELD_PANEL_TITLE="Custom Field"
COM_ICAGENDA_CUSTOMFIELD_TITLE_LBL="Title"
COM_ICAGENDA_CUSTOMFIELD_TITLE_DESC="Title of the field"
COM_ICAGENDA_CUSTOMFIELD_SLUG_LBL="Slug"
COM_ICAGENDA_CUSTOMFIELD_SLUG_DESC="If left empty, the Slug will be automatically generated.<br />Slug is the internal name under which this custom field is saved in database. This one should be unique.<br />Please only use lowercase letters a-z, numbers 0-9 and underscores. Do not use accented characters (e.g. à) or characters with diacritics (e.g. δ)."
COM_ICAGENDA_CUSTOMFIELD_PARENT_FORM_LBL="Parent Form"
COM_ICAGENDA_CUSTOMFIELD_PARENT_FORM_DESC="The form where to display this custom field."
COM_ICAGENDA_CUSTOMFIELD_PARENT_SELECT="- Select Parent Form -"
COM_ICAGENDA_CUSTOMFIELD_PARENT_REGISTRATION_FORM="Registration Form"
COM_ICAGENDA_CUSTOMFIELD_PARENT_EVENT_EDIT="Event Form"
COM_ICAGENDA_CUSTOMFIELD_TYPE_LBL="Field Type"
COM_ICAGENDA_CUSTOMFIELD_TYPE_DESC="Type for the field"
COM_ICAGENDA_CUSTOMFIELD_TYPE_SELECT="- Select Field Type -"
COM_ICAGENDA_CUSTOMFIELD_TYPE_TEXT="Text"
COM_ICAGENDA_CUSTOMFIELD_TYPE_LIST="Drop-down List"
COM_ICAGENDA_CUSTOMFIELD_TYPE_RADIO="Radio Buttons"
COM_ICAGENDA_CUSTOMFIELD_OPTIONS_LBL="Options"
COM_ICAGENDA_CUSTOMFIELD_OPTIONS_DESC="<h4>Text</h4><p>Enter the placeholder text to be shown in the field.<br /><em>Example for a custom field with Title 'What is your favorite cake?':</em></p><pre>Your favorite cake...</pre><hr><h4>Drop-down List & Radio Buttons</h4><p>Enter each option on a new line using the convention VALUE=LABEL with one unique value/label pair per line.<br /><em>Example for a custom field with Title 'What is your Gender?':</em></p><pre>F=Female<br />M=Male</pre><em>In this example, 'Female' and 'Male' will be the items in the drop-down list.<br />'F' or 'M' will be the value returned by the selected item.</em><br /><br />If you want to set an option as selected, add '=X' after the value/label pair to be selected by default (eg. value=label=X)."
COM_ICAGENDA_CUSTOMFIELD_REQUIRED_LBL="Required"
COM_ICAGENDA_CUSTOMFIELD_REQUIRED_DESC="If the field is required"
COM_ICAGENDA_CUSTOMFIELD_DESCRIPTION_DESC="This description will be displayed in the info tooltip, when hovering the <i class="_QQ_"iCicon-info-circle"_QQ_"></i> icon (optional)."
;
; DATABASE error message
COM_ICAGENDA_CUSTOMFIELD_DATABASE_ERROR_AUTO_SLUG="iCagenda has tried to generate a slug with the title %s, but the auto-generated slug %s already exists."
COM_ICAGENDA_CUSTOMFIELD_DATABASE_ERROR_UNIQUE_SLUG="Another custom field has the same slug"

; Features list
COM_ICAGENDA_TITLE_FEATURES="Features"
COM_ICAGENDA_LEGEND_NEW_FEATURE="New Feature"
COM_ICAGENDA_LEGEND_EDIT_FEATURE="Edit Feature"
COM_ICAGENDA_FEATURES_TITLE="Title"
COM_ICAGENDA_FEATURES_SHOW_ICON="Show Icon"
COM_ICAGENDA_FEATURES_ICON="Icon"
COM_ICAGENDA_FEATURES_SHOW_FILTER="Show Filter"

; Feature Edit
COM_ICAGENDA_TITLE_FEATURE="Feature"
COM_ICAGENDA_FORM_FEATURE_TITLE_LABEL="Title"
COM_ICAGENDA_FORM_FEATURE_TITLE_DESC="Enter the feature title"
COM_ICAGENDA_FORM_FEATURE_ICON_LABEL="Select Icon"
COM_ICAGENDA_FORM_FEATURE_ICON_DESC="The name of the icon file to use for this feature. Feature icons are located in [IMAGES FOLDER]/icagenda/feature_icons/nn_bit/ where nn is the icon size)."
COM_ICAGENDA_FORM_FEATURE_NEW_ICON_LABEL="<strong>OR</strong> create a new icon<br /><small>(jpg, jpeg, gif, png)</small>"
COM_ICAGENDA_FORM_FEATURE_NEW_ICON_DESC="You can select an image to generate a new feature icon available in all sizes (16, 24, 32, 48 and 64 bit). The icon file name will be filtered to get an url safe file name. Feature icon supports the JPG, JPEG, GIF and PNG formats."
COM_ICAGENDA_FORM_FEATURE_ICON_ALT_LABEL="Icon ALT Value"
COM_ICAGENDA_FORM_FEATURE_ICON_ALT_DESC="Enter the text used to populate the ALT attribute of the image tag. This text is used to aid accessibility and is also used as a tooltip when the icon is hovered by the mouse if requested in the iCagenda main options (this field is optional)."
COM_ICAGENDA_FORM_FEATURE_SHOW_FILTER_LABEL="Show in the Filter?"
COM_ICAGENDA_FORM_FEATURE_SHOW_FILTER_DESC="Indicates whether to include the feature when displaying event filtering options for menu item configuration."
COM_ICAGENDA_FORM_FEATURE_DESCRIPTION_LABEL="Description"
COM_ICAGENDA_FORM_FEATURE_DESCRIPTION_DESC="Feature description"
;
; Feature error message
COM_ICAGENDA_FORM_FEATURE_MIMETYPE_ERROR="Feature icon supports the JPG, JPEG, GIF and PNG formats. Please select another image."

; Menus Options
COM_ICAGENDA_LOGO="<img src='../media/com_icagenda/images/iconicagenda48.png' alt='' />"
COM_ICAGENDA_SLOGAN="Events Management Extension for Joomla!"
COM_ICAGENDA_TITLE="<table><tr><td><img src='../media/com_icagenda/images/iconicagenda48.png' alt='' /></td><td width='10px'></td><td>Events Management Extension for Joomla!</td></tr></table>"
COM_ICAGENDA_FOOTER="<hr><i><small>Jooml!C &#8226; iCagenda &#8226; <a href='http://www.joomlic.com' target='_blank'>www.joomlic.com</a></small></i>"
COM_ICAGENDA_MENU_OPTIONS="<b>!Cagenda Options</b>"
COM_MENUS_ICAGENDA_FIELDSET_LABEL="<b>!Cagenda Options</b>"
COM_MENUS_BASIC_FIELDSET_LABEL="iCagenda - Parameters of the <i>list of events</i>"
COM_MENUS_FILTER_FIELDSET_LABEL="Filters"

COM_ICAGENDA_LBL_TIME="Selection of events"
COM_ICAGENDA_DESC_TIME="Display All, Past, Today and/or Upcoming events"
COM_ICAGENDA_OPTION_TODAY_AND_UPCOMING="Today and Upcoming events"
COM_ICAGENDA_OPTION_TODAY="Today's events"

COM_ICAGENDA_TIME_LBL="Filter by Date"
COM_ICAGENDA_TIME_DESC="Display all, past, current events today and/or upcoming events"
COM_ICAGENDA_OPTION_PAST_EVENTS="Past Events"
COM_ICAGENDA_OPTION_CURRENT_EVENTS_TODAY_EVENTS="Current and Today's Upcoming Events"
COM_ICAGENDA_OPTION_CURRENT_EVENTS_TODAY_AND_UPCOMING_EVENTS="Current and All Upcoming Events"
COM_ICAGENDA_OPTION_UPCOMING_EVENTS="Upcoming Events"
COM_ICAGENDA_OPTION_ALL_EVENTS="All Events"

COM_ICAGENDA_LBL_CATEGORY="Filter by Category"
COM_ICAGENDA_DESC_CATEGORY="Imposes a filter by category.<br />In Joomla 2.5, you can use Ctrl-click (Windows) or Cmd-click (Mac) to select more than one item.<br />In Joomla 3, if field left empty, all categories will be displayed."
COM_ICAGENDA_ALL="All"
COM_ICAGENDA_ALL_F="All"
COM_ICAGENDA_ALL_CATEGORIES="All Categories"
COM_ICAGENDA_LBL_DATE="Order by Dates"
COM_ICAGENDA_DESC_DATE="Ordering of events by dates.<br />If 'Date Descending' selected, reverse chronological order, from latest to earliest (the oldest date will be at end).<br />If 'Date Ascending' selected, chronological order, from earliest to latest (the oldest date will be first)."
COM_ICAGENDA_DATE_ASC="Date Ascending"
COM_ICAGENDA_DATE_DESC="Date Descending"

; Features Menu Options
COM_ICAGENDA_MENU_EVENT_FEATURES_INCLUDE_EXCLUDE_LBL="Include or Exclude Features?"
COM_ICAGENDA_MENU_EVENT_FEATURES_INCLUDE_EXCLUDE_DESC="Indicate whether the selected Event Feature(s) (if any selected) are to be used to include or exclude Events from the list. This allows complementary menu items to be created that divide a set of Events into two groups (e.g. free and not free)."
COM_ICAGENDA_MENU_EVENT_FEATURES_INCLUDE="Include Features"
COM_ICAGENDA_MENU_EVENT_FEATURES_EXCLUDE="Exclude Features"
COM_ICAGENDA_MENU_EVENT_FEATURES_ALL_OR_ANY_LBL="All Features or Any Feature?"
COM_ICAGENDA_MENU_EVENT_FEATURES_ALL_OR_ANY_DESC="Indicate, when more than one feature has been selected, whether all Event Features must be present for the Event to be selected or only a single Event Feature."
COM_ICAGENDA_MENU_EVENT_FEATURES_ANY_ONE_FEATURE="Any One Feature"
COM_ICAGENDA_MENU_EVENT_FEATURES_ALL_FEATURES_REQUIRED="All Features Required"

COM_MENUS_VIEW_FIELDSET_LABEL="Display"
COM_ICAGENDA_SHORT_DESCRIPTION_LBL="Short description"
COM_ICAGENDA_LBL_LIMIT="Character limit"
COM_ICAGENDA_DESC_LIMIT="Character limit of the Auto-created introduction text from the full description."
COM_ICAGENDA_LBL_CUSTOM_VALUE="Custom value"
COM_ICAGENDA_DESC_CUSTOM_VALUE="Enter a custom value, when not use of Global Option"

COM_ICAGENDA_DISPLAY_CATINFOS_LABEL="Category Information"
COM_ICAGENDA_DISPLAY_CATINFOS_DESC="Display selected information for each category of the list of events (list main page)"

COM_ICAGENDA_LBL_NUMERO="Number/page"
COM_ICAGENDA_DESC_NUMERO="Number of items to display per page"
COM_ICAGENDA_LBL_FORMAT="Date Format"
COM_ICAGENDA_DESC_FORMAT="Select a Date format"
COM_ICAGENDA_SELECT_FORMAT="Select Date Format"
COM_ICAGENDA_DATE_FORMAT_NOTE1="The Date Format function is detecting your current language in Joomla admin, in order to provide you standard date formats in your culture. If your language is not available in iCagenda, English date formats will be display as default."
COM_ICAGENDA_DATE_FORMAT_NOTE2="In all cases, you also have the option to choose a customizable international standard format, with a separator."
COM_ICAGENDA_DATE_FORMAT_DEFAULT="Default language"
COM_ICAGENDA_DATE_FORMAT_CURRENT="In your current language"
COM_ICAGENDA_DATE_FORMAT_ISO="International date format (ISO)"
COM_ICAGENDA_DATE_FORMAT_SEPARATOR="Global Date Formats with separator"
COM_ICAGENDA_DATE_FORMAT_DMY="DMY (day, month, year)"
COM_ICAGENDA_DATE_FORMAT_MDY="MDY (month, day, year)"
COM_ICAGENDA_DATE_FORMAT_YMD="YMD (year, month, day)"

; Selection of the Theme Pack layout for calendar module
COM_ICAGENDA_THEME_PACK_LBL="Theme Pack"
COM_ICAGENDA_THEME_PACK_DESC="Select the iCagenda Theme Pack to use for layout of the content (list of events and event details)."

COM_ICAGENDA_LBL_TEMPLATE="Theme"
COM_ICAGENDA_DESC_TEMPLATE="Theme used for the page"
COM_ICAGENDA_LBL_DATE_SEPARATOR="Separator for dates"
COM_ICAGENDA_DESC_DATE_SEPARATOR="Separator for dates (eg. "_QQ_" / "_QQ_" for date format with ␣ )"
COM_ICAGENDA_DESC_DATE_COMPONENTS_SEPARATOR="Separator of the components (replaces the white space '␣')"
COM_ICAGENDA_LBL_MWIDTH="Map Width"
COM_ICAGENDA_DESC_MWIDTH="Google Maps width (in px or %)"
COM_ICAGENDA_LBL_MHEIGHT="Map Height"
COM_ICAGENDA_DESC_MHEIGHT="Google Maps height (in px or %)"

; Newsletter
COM_ICAGENDA_TITLE_NEWSLETTER="Newsletter"
COM_ICAGENDA_TITLE_MAIL="Send Newsletter"
COM_ICAGENDA_FORM_LBL_NEWSLETTER_LIST="Mailing List"
COM_ICAGENDA_FORM_DESC_NEWSLETTER_LIST="Mailing list for users registered for this event"
COM_ICAGENDA_FORM_LBL_NEWSLETTER_OBJ="Subject"
COM_ICAGENDA_FORM_DESC_NEWSLETTER_OBJ="Subject of the Newsletter"
COM_ICAGENDA_NEWSLETTER_NO_OBJ_ALERT="Please complete the subject!"
COM_ICAGENDA_FORM_LBL_NEWSLETTER_BODY="Content"
COM_ICAGENDA_FORM_DESC_NEWSLETTER_BODY="Content of the Newsletter"
COM_ICAGENDA_NEWSLETTER_NO_BODY_ALERT="Please complete the body of the message!"
COM_ICAGENDA_NEWSLETTER_ERROR_ALERT="Error: Failed to send email!"
COM_ICAGENDA_NEWSLETTER_SUCCESS="Newsletter sent successfully!"
COM_ICAGENDA_NEWSLETTER_NB_EMAIL_SEND="Number of emails sent"
COM_ICAGENDA_NEWSLETTER_NB_EMAIL_NOT_SEND="%s duplicate emails not sent."
COM_ICAGENDA_NEWSLETTER_NO_EVENT_SELECTED="Please select event and date"
COM_ICAGENDA_NEWSLETTER_NO_DATE_SELECTED="Please select date"
ICAGENDA_JTOOLBAR_SEND="Send"

; Themes
COM_ICAGENDA_THEMES="Themes"
COM_ICAGENDA_THEME_MANAGER="Theme Manager"
COM_ICAGENDA_TITLE_THEMES="Themes"
COM_ICAGENDA_UPLOAD_THEME_PACKAGE_FILE="Theme Pack to send"
COM_ICAGENDA_UPLOAD_FILE="Zip file"
COM_ICAGENDA_UPLOAD_FILE="Upload File"
COM_ICAGENDA_INSTALL="Install"
COM_ICAGENDA_UPLOAD_AND_INSTALL="Upload & Install"
COM_ICAGENDA_THEMES_LIST_TITLE="Theme packs installed"
COM_ICAGENDA_THEME_INSTALLED_VERSION="Installed Version"
COM_ICAGENDA_THEME_LATEST_VERSION="Latest Version"
COM_ICAGENDA_THEME_NO_PREVIEW="Preview not available"
COM_ICAGENDA_THEME_AUTHOR="Author"
COM_ICAGENDA_THEME_AUTHOR_WEBSITE="Website"
COM_ICAGENDA_THEME_UPDATE="Update to"
COM_ICAGENDA_THEME_AUTHOR_CONTACT="Please contact the author of the theme to know the latest version available"
COM_ICAGENDA_THEME_LATEST="You have the latest version"
COM_ICAGENDA_THEME_NB_THEMES_1="There are"
COM_ICAGENDA_THEME_NB_THEMES_2="theme packs installed"
COM_ICAGENDA_THEME_UNKNOWN="unknown"
COM_ICAGENDA_CLICK_TO_ENLARGE="Click to enlarge"

; Theme Packs Installation messages
COM_ICAGENDA_ERROR="Error"
COM_ICAGENDA_SUCCESS_THEME_INSTALLED="Theme Installed successfully!"
COM_ICAGENDA_ERROR_THEME_APPLICATION_AREA="Error when installing theme package"
COM_ICAGENDA_ERROR_FIND_INSTALL_PACKAGE="Unable to find install package"
COM_ICAGENDA_ERROR_INSTALL_PATH_NOT_EXISTS="Install path does not exist"
COM_ICAGENDA_ERROR_FIND_INFO_INSTALL_PACKAGE="Unable to find required information in install package"
COM_ICAGENDA_ERROR_INSTALL_FILE_UPLOAD="The installer cannot continue until file uploads are enabled for the server."
COM_ICAGENDA_ERROR_INSTALL_ZLIB="The installer cannot continue until Zlib is installed."
COM_ICAGENDA_ERROR_NO_FILE_SELECTED="No file selected"
COM_ICAGENDA_ERROR_UPLOAD_FILE="There was an error uploading file to the server."
COM_ICAGENDA_ERROR_NO_THEME_FILE="No iCagenda Theme File"
COM_ICAGENDA_ERROR_XML_INSTALL_ICAGENDA="Error: Could not find an iCagenda Theme XML installation file in the package."
COM_ICAGENDA_ERROR_XML_INSTALL="Error: Could not find an XML installation file in the package."
COM_ICAGENDA_FOLDER_NOT_EXISTS="Folder does not exist"
COM_ICAGENDA_ERROR_COPY_FOLDER_TO="Failed to copy folder to"
COM_ICAGENDA_FILE_NOT_EXISTS="File does not exist"
COM_ICAGENDA_ERROR_COPY_FILE_TO="Failed to copy file to"
COM_ICAGENDA_ERROR_INSTALL_FILE="Error: Problem while installing package"

; Locations (futur release ?)
COM_ICAGENDA_TITLE_LOCATIONS="Locations"
COM_ICAGENDA_LOCATIONS_NAME="Name"
COM_ICAGENDA_LOCATIONS_CITY="City"
COM_ICAGENDA_LOCATIONS_ADDRESS="Address"

; Location (futur release ?)
COM_ICAGENDA_TITLE_LOCATION="Location"
COM_ICAGENDA_FORM_LBL_LOCATION_NAME="Name"
COM_ICAGENDA_FORM_DESC_LOCATION_NAME="Name that identifies the place that will be the location"
COM_ICAGENDA_FORM_LBL_LOCATION_CITY="City"
COM_ICAGENDA_FORM_DESC_LOCATION_CITY="The city where the event takes place"
COM_ICAGENDA_FORM_LBL_LOCATION_ADDRESS="Address"
COM_ICAGENDA_FORM_DESC_LOCATION_ADDRESS="Full address, street number, city, state, ..."
COM_ICAGENDA_FORM_LBL_LOCATION_DESC="Description"
COM_ICAGENDA_FORM_DESC_LOCATION_DESC="Short description of the location"

; Panel
COM_ICAGENDA_PANEL_ICAGENDA="iCagenda"
COM_ICAGENDA_FORM_LBL_EVENT_PARAMS="Params"
COM_ICAGENDA_TITLE_ICAGENDA="Control Panel"
COM_ICAGENDA_TITLE_ICAGENDA_IMAGE="<img src='../media/com_icagenda/images/blanck.png'/ alt='' >"
COM_ICAGENDA_PANEL_EVENT_MANAGER="Events Management"
COM_ICAGENDA_PANEL_REGIST_MANAGER="Registrations Management"
COM_ICAGENDA_PANEL_UPDATE_LOGS="ChangeLog"
COM_ICAGENDA_FEATURES_BACKEND="<b>Back-End :</b> Category management, creation of events, registration management, newsletter..."
COM_ICAGENDA_FEATURES_FRONTEND="<b>Front-End :</b> Register for events, sharing on social networks, GoogleMaps, choice of templates..."
COM_ICAGENDA_PANEL_TEXT="<p><i>Based on xCal 2 (beta) created by JonxDuo.</i><br/>This component is now developped under the name <b>iCagenda</b>.<br/>The purpose of this fork is to allow a new team to develop this project, with the permission of its original creator, to a stable release, and to a project that will be developed to integrate with joomla! STS &#174; 3.0 and future releases.<br/>Special Thank You to <i>JonxDuo</i> for all his work done.</p>"
COM_ICAGENDA_PANEL_CATEGORY="Categories"
COM_ICAGENDA_PANEL_NEW_CATEGORY="Add<br/>new category"
COM_ICAGENDA_PANEL_EVENTS="Events"
COM_ICAGENDA_PANEL_NEW_EVENT="Add<br/>new event"
COM_ICAGENDA_PANEL_LOCATIONS="Locations"
COM_ICAGENDA_PANEL_NEW_LOCATION="New Location"
COM_ICAGENDA_PANEL_REGISTRATION="Registrations"
COM_ICAGENDA_PANEL_NEWSLETTER="Newsletter"
COM_ICAGENDA_ADDITIONALS_LABEL="Additionals"
COM_ICAGENDA_PANEL_CUSTOMFIELDS="Custom Fields"
COM_ICAGENDA_PANEL_FEATURES="Features"
COM_ICAGENDA_PANEL_THEMES="Install a Theme Pack"
COM_ICAGENDA_PANEL_ALERT="Under construction... Soon!"
COM_ICAGENDA_PANEL_UPDATE_AND_INFOS=" Update & info"
COM_ICAGENDA_INFO="Info"
COM_ICAGENDA_VERSION="Version"
COM_ICAGENDA_COPYRIGHT="Copyright"
COM_ICAGENDA_LICENSE="License"
COM_ICAGENDA_LIBRARIES="Libraries"
COM_ICAGENDA_NEWS="Minimum Config.<br>& News"
COM_ICAGENDA_DONATE="Donate via PayPal"
COM_ICAGENDA_TRANSLATOR="Translator"
COM_ICAGENDA_PANEL_TRANSLATION="Translations Credits"
COM_ICAGENDA_PANEL_TRANSLATION_PACKS="Translation Packs"
COM_ICAGENDA_PANEL_TRANSLATION_PACKS_DONWLOAD="Download a Translation Pack"
COM_ICAGENDA_PANEL_SITE_VISIT="Visit us on"
COM_ICAGENDA_PANEL_HELP_FORUM="Help Forum"
COM_ICAGENDA_PANEL_LEAD_DEVELOPER="Lead Developer"
COM_ICAGENDA_PANEL_DEVELOPMENT_AID="iCagenda Development Aid"
COM_ICAGENDA_PANEL_BETATESTER="Betatester"
COM_ICAGENDA_PANEL_TEAM="iCagenda Team and Forum Members"
COM_ICAGENDA_PANEL_THANKS="Thank you to everyone for your participation in the project!"
COM_ICAGENDA_PANEL_VERSION="Your version"
COM_ICAGENDA_PANEL_DATE="Date"
COM_ICAGENDA_PANEL_COPYRIGHT="All Rights Reserved.<br />iCagenda&trade; is distributed under the terms of the GNU General Public License version 3 or later; see LICENSE.txt.<br />If you use iCagenda&trade;, please post a rating and a review at the JED : "
COM_ICAGENDA_PANEL_FREE_VERSION="This is a free version of iCagenda&trade;. Remove the signature 'Powered by iCagenda', by purchasing a paid version. There aren`t other limitations in functionality, but by purchasing a pro version you help us continue development and support."
COM_ICAGENDA_PANEL_PRO_VERSION="With a Pro account, you will have access to"
COM_ICAGENDA_PANEL_PRO_MODULE_IC_EVENT_LIST="iC Event List Module"
COM_ICAGENDA_PURCHASE="BUY PRO NOW"
COM_ICAGENDA_PURCHASE_1_YEAR="PRO 12 MONTHS"
COM_ICAGENDA_PURCHASE_UNLIMITED="PRO UNLIMITED"
COM_ICAGENDA_VERSIONS_COMPARISON="Versions Comparison"
COM_ICAGENDA_VIDEO_GETTING_STARTED="Getting Started with iCagenda"
COM_ICAGENDA_VIDEO_TUTORIALS="Video Tutorials"
COM_ICAGENDA_PANEL_CONTRIBUTORS="iCagenda Contributors"
COM_ICAGENDA_PANEL_SPECIAL_THANKS="Special thank you for their support on important issues!"
COM_ICAGENDA_PANEL_THANKS_TEXT="We would like to thank our contributors, whose efforts make this software what it is. These people have helped by testing and helping, and by giving time to this project. They have created and maintained the community of iCagenda users. iCagenda is available worldwide thanks to these people!"
COM_ICAGENDA_PANEL_TEAM_1="Video tutorials, Italian coordinator, General moderator"
COM_ICAGENDA_PANEL_TEAM_2="Lead Beta Tester, General moderator"
COM_ICAGENDA_PANEL_TEAM_3="Forum moderators"
COM_ICAGENDA_PANEL_TEAM_CODE_CONTRIBUTORS="Code Contributors"


; Traductions dates.js
SA="Sa"
SU="Su"
MO="Mo"
TU="Tu"
WE="We"
TH="Th"
FR="Fr"

; Traductions textes timepiker.js
COM_ICAGENDA_TP_CURRENT="Now"
COM_ICAGENDA_TP_CLOSE="Validate"
COM_ICAGENDA_TP_TITLE="Select the time"
COM_ICAGENDA_TP_TIME="Time"
COM_ICAGENDA_TP_HOUR="Hour"
COM_ICAGENDA_TP_MINUTE="Minute"

; iCagenda Live Update
LIVEUPDATE_INSTALL_ERROR="Error installing %s"
LIVEUPDATE_INSTALL_SUCCESS="Installing %s was successful."
LIVEUPDATE_INSTALL_TYPE_COMPONENT="component"
LIVEUPDATE_INSTALL_TYPE_FILE="file"
LIVEUPDATE_INSTALL_TYPE_LANGUAGE="language"
LIVEUPDATE_INSTALL_TYPE_LIBRARY="library"
LIVEUPDATE_INSTALL_TYPE_MODULE="module"
LIVEUPDATE_INSTALL_TYPE_PACKAGE="package"
LIVEUPDATE_INSTALL_TYPE_PLUGIN="plugin"
LIVEUPDATE_INSTALL_TYPE_TEMPLATE="template"

; iCagenda Live Update
LIVEUPDATE_ERROR_NEEDS_PRO_ID="You have to supply your Pro ID to the component's global options before trying to upgrade to the latest release. The upgrade button will remain disabled until you do that."
LIVEUPDATE_NAGSCREEN_HEAD_ICAGENDA="WARNING! You are about to install a pre-release version of iCagenda."
LIVEUPDATE_NAGSCREEN_VERSION_ICAGENDA="Pre-release version (iCagenda %s - %s)."
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ALERT_TOP="A software release life cycle is the sum of the phases of development and maturity for a piece of computer software."
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ICAGENDA_ALPHA="Alpha"
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ALERT_ALPHA="can be unstable and could cause crashes or data loss."
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ICAGENDA_BETA="Beta"
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ALERT_BETA="will generally have many more bugs in it than completed software, as well as speed/performance issues."
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ICAGENDA_RC="RC (Release Candidate)"
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ALERT_RC="pre-release version with potential to be a final product, which is ready to release unless significant bugs emerge."
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ALERT_BOTTOM="If you are not sure about what you are about to do, please click on 'Back' button.<br />If you are absolutely certain you understand the risks involved with the installation of unstable releases, please click the button below to continue the installation of this release."
LIVEUPDATE_NAGSCREEN_FOOTER_ICAGENDA="info:"

; Admin Permissions
COM_ICAGENDA_ACCESS_VIEW_CATEGORIES="Access Administration Categories"
COM_ICAGENDA_ACCESS_VIEW_CATEGORIES_DESC="Allows users in the group to access the categories administration for iCagenda."
COM_ICAGENDA_ACCESS_VIEW_EVENTS="Access Administration Events"
COM_ICAGENDA_ACCESS_VIEW_EVENTS_DESC="Allows users in the group to access the events administration for iCagenda."
COM_ICAGENDA_ACCESS_VIEW_REGISTRATIONS="Access Administration Registrations"
COM_ICAGENDA_ACCESS_VIEW_REGISTRATIONS_DESC="Allows users in the group to access the registrations administration for iCagenda."
COM_ICAGENDA_ACCESS_VIEW_NEWSLETTER="Access Administration Newsletter"
COM_ICAGENDA_ACCESS_VIEW_NEWSLETTER_DESC="Allows users in the group to access the newsletter administration for iCagenda."
COM_ICAGENDA_ACCESS_VIEW_THEMES="Access Theme Packs Manager"
COM_ICAGENDA_ACCESS_VIEW_THEMES_DESC="Allows users in the group to access the Theme Packs Manager of iCagenda."
COM_ICAGENDA_ACCESS_VIEW_CUSTOMFIELDS="Access Administration Custom Fields"
COM_ICAGENDA_ACCESS_VIEW_CUSTOMFIELDS_DESC="Allows users in the group to access the custom fields administration for iCagenda."
COM_ICAGENDA_ACCESS_VIEW_FEATURES="Access Administration Features"
COM_ICAGENDA_ACCESS_VIEW_FEATURES_DESC="Allows users in the group to access the features administration for iCagenda."

COM_ICAGENDA_FEATURES_ICONSIZE_LIST_LABEL="List Features Icon Size"
COM_ICAGENDA_FEATURES_ICONSIZE_LIST_DESC="Select the size of the feature icons to be displayed in the main event list."
COM_ICAGENDA_FEATURES_ICONSIZE_EVENT_LABEL="Event Features Icon Size"
COM_ICAGENDA_FEATURES_ICONSIZE_EVENT_DESC="Select the size of the feature icons to be displayed in the single event page."
COM_ICAGENDA_FEATURES_ICONSIZE_NONE="Do not display icons"
COM_ICAGENDA_FEATURES_ICONSIZE_16="16 bit icons"
COM_ICAGENDA_FEATURES_ICONSIZE_24="24 bit icons"
COM_ICAGENDA_FEATURES_ICONSIZE_32="32 bit icons"
COM_ICAGENDA_FEATURES_ICONSIZE_48="48 bit icons"
COM_ICAGENDA_FEATURES_ICONSIZE_64="64 bit icons"
COM_ICAGENDA_SHOW_FEATURE_ICON_TITLE_LABEL="Show Feature Icon Title?"
COM_ICAGENDA_SHOW_FEATURE_ICON_TITLE_DESC="Select whether the value entered for the ALT attribute of the icon image will also be used as the TITLE attribute (to provide a tooltip value when the mouse is hovered)."

; Override the 'do not use' value for the icon file selector drop-down list
JOPTION_DO_NOT_USE="- Icon Not Required -"

; Common Strings for Modules
ICAGENDA_FILTERING_SHORTDESC_LABEL="HTML Filtering Auto-Introtext"
ICAGENDA_FILTERING_SHORTDESC_DESC="Determines how HTML will be filtered in Auto-Introtext."
ICAGENDA_GLOBAL_OPTION="Use iCagenda global option"
ICAGENDA_FILTERING_NO_HTML="No HTML"
ICAGENDA_FILTERING_ALL_ITALIC="All italicized"

ICAGENDA_AUTO_INTROTEXT_LIMIT_LABEL="Auto-Introtext character limit"
ICAGENDA_AUTO_INTROTEXT_LIMIT_DESC="Character limit of the auto-created introduction text from the full description (when used)."


;
; DEPRECATED
;
ICEVENT="Event"
ICEVENTS="Events"
language/en-GB/en-GB.plg_content_vote.sys.ini000060400000000455152453623440015005 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CONTENT_VOTE="Content - Vote"
PLG_VOTE_XML_DESCRIPTION="Add Voting functionality to Articles."language/en-GB/en-GB.plg_editors-xtd_weblink.sys.ini000060400000000673152453623440016261 0ustar00; Joomla! Project
; Copyright (C) 2005 - 2020 Open Source Matters. All rights reserved.
; License GNU General Public License version 2 or later; see LICENSE.txt, see LICENSE.php
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS-XTD_WEBLINK="Button - Web Link"
PLG_EDITORS-XTD_WEBLINK_XML_DESCRIPTION="Displays a button to make it possible to insert web links into an Article. Displays a popup allowing you to choose the web link."
language/en-GB/en-GB.mod_multilangstatus.sys.ini000060400000000531152453623440015526 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_MULTILANGSTATUS="Multilingual Status"
MOD_MULTILANGSTATUS_XML_DESCRIPTION="This module shows the status of the multilingual parameters."

language/en-GB/en-GB.mod_status.ini000060400000003265152453623440013003 0ustar00; Joomla! Project
; (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_STATUS="User Status"
MOD_STATUS_BACKEND_USERS_0="Administrators"
MOD_STATUS_BACKEND_USERS_1="Administrator"
MOD_STATUS_BACKEND_USERS_MORE="Administrators"
MOD_STATUS_FIELD_SHOW_VIEWSITE_LABEL="View Site"
MOD_STATUS_FIELD_SHOW_VIEWSITE_DESC="Show a link to the website home page."
MOD_STATUS_FIELD_LINK_VIEWADMIN_LABEL="Show Admin"
MOD_STATUS_FIELD_SHOW_VIEWADMIN_LABEL="View Administrator"
MOD_STATUS_FIELD_SHOW_VIEWADMIN_DESC="Show a link to open a new Administrator window."
MOD_STATUS_FIELD_SHOW_LOGGEDIN_USERS_ADMIN_DESC="Show the number of users logged-in to the Backend."
MOD_STATUS_FIELD_SHOW_LOGGEDIN_USERS_ADMIN_LABEL="Logged-in Backend Users"
MOD_STATUS_FIELD_SHOW_LOGGEDIN_USERS_DESC="Show the number of users logged-in to the Frontend."
MOD_STATUS_FIELD_SHOW_LOGGEDIN_USERS_LABEL="Logged-in Users"
MOD_STATUS_FIELD_SHOW_MESSAGES_DESC="Show the messages count for the current user's inbox."
MOD_STATUS_FIELD_SHOW_MESSAGES_LABEL="Messages"
MOD_STATUS_LOG_OUT="Log out"
MOD_STATUS_MESSAGES_0="%d Messages"
MOD_STATUS_MESSAGES_1="%d Message"
MOD_STATUS_MESSAGES_MORE="%d Messages"
MOD_STATUS_MESSAGES_LABEL_0="Messages"
MOD_STATUS_MESSAGES_LABEL_1="Message"
MOD_STATUS_MESSAGES_LABEL_MORE="Messages"
MOD_STATUS_TOTAL_USERS_0="Users"
MOD_STATUS_TOTAL_USERS_1="User"
MOD_STATUS_TOTAL_USERS_MORE="Users"
MOD_STATUS_USERS_0="Visitors"
MOD_STATUS_USERS_1="Visitor"
MOD_STATUS_USERS_MORE="Visitors"
MOD_STATUS_XML_DESCRIPTION="This module shows the status of the logged-in users and various shortcut links."
language/en-GB/en-GB.com_installer.sys.ini000060400000003141152453623440014262 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_INSTALLER="Installer"
COM_INSTALLER_DATABASE_VIEW_DEFAULT_DESC="Check and fix any database issues with your website."
COM_INSTALLER_DATABASE_VIEW_DEFAULT_TITLE="Check Database"
COM_INSTALLER_DISCOVER_VIEW_DEFAULT_DESC="Discover extensions that have not gone through the normal installation process."
COM_INSTALLER_DISCOVER_VIEW_DEFAULT_TITLE="Discover Extensions"
COM_INSTALLER_INSTALL_VIEW_DEFAULT_DESC="Install extensions into your Joomla! installation."
COM_INSTALLER_INSTALL_VIEW_DEFAULT_TITLE="Install Extensions"
COM_INSTALLER_LANGUAGES_VIEW_DEFAULT_DESC="Install Language packs into your Joomla! website."
COM_INSTALLER_LANGUAGES_VIEW_DEFAULT_TITLE="Install Languages"
COM_INSTALLER_MANAGE_VIEW_DEFAULT_DESC="Manage extensions that are already installed on your Joomla! website."
COM_INSTALLER_MANAGE_VIEW_DEFAULT_TITLE="Manage Extensions"
COM_INSTALLER_UPDATESITES_VIEW_DEFAULT_DESC="Manage "_QQ_"Update Sites"_QQ_" for various installed extensions."
COM_INSTALLER_UPDATESITES_VIEW_DEFAULT_TITLE="Update Sites"
COM_INSTALLER_UPDATE_VIEW_DEFAULT_DESC="Find and Install updates for the installed extensions."
COM_INSTALLER_UPDATE_VIEW_DEFAULT_TITLE="Update Extensions"
COM_INSTALLER_WARNINGS_VIEW_DEFAULT_DESC="Displays warnings related to your installed extensions."
COM_INSTALLER_WARNINGS_VIEW_DEFAULT_TITLE="Warnings"
COM_INSTALLER_XML_DESCRIPTION="Installer component for adding, removing and upgrading extensions."
language/en-GB/en-GB.plg_twofactorauth_totp.sys.ini000060400000001366152453623440016240 0ustar00; Joomla! Project
; (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_TWOFACTORAUTH_TOTP="Two Factor Authentication - Google Authenticator"
PLG_TWOFACTORAUTH_TOTP_XML_DESCRIPTION="Allows users on your site to use two factor authentication using <a href="_QQ_"https://en.wikipedia.org/wiki/Google_Authenticator"_QQ_" target="_QQ_"_blank"_QQ_">Google Authenticator</a> or other compatible time-based One Time Password generators such as <a href="_QQ_"https://freeotp.github.io/"_QQ_" target="_QQ_"_blank"_QQ_">FreeOTP</a>. To use two factor authentication please edit the user profile and enable two factor authentication."language/en-GB/en-GB.plg_system_jce.ini000060400000001040152453623440013615 0ustar00; JCE Project
; Copyright (C) 2006 - 2019 Ryan Demmer. All rights reserved
; GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html

; Note : All ini files need to be saved as UTF-8
PLG_SYSTEM_JCE="System - JCE"
PLG_SYSTEM_JCE_XML_DESCRIPTION="JCE System Plugin"

PLG_SYSTEM_JCE_COLUMN_STYLES_LABEL="Load Column Styles"
PLG_SYSTEM_JCE_COLUMN_STYLES_DESC="Load the stylesheet for the display of columns. This is required to correctly display columns created in the editor with the Columns tool, if no CSS Framework was selected."
language/en-GB/en-GB.plg_content_pagenavigation.ini000060400000002445152453623440016210 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CONTENT_PAGENAVIGATION="Content - Page Navigation"
PLG_PAGENAVIGATION_FIELD_DISPLAY_DESC="Choose what to display as the link text."
PLG_PAGENAVIGATION_FIELD_DISPLAY_LABEL="Link Text"
PLG_PAGENAVIGATION_FIELD_POSITION_DESC="The position of the <em>Page Navigation</em> function on the viewed page in relation to the text."
PLG_PAGENAVIGATION_FIELD_POSITION_LABEL="Position"
PLG_PAGENAVIGATION_FIELD_RELATIVE_DESC="Assigns the relative location for the Position parameter. Text will place it directly above or below the article content. Full Article will place it above or below the full display including title and readmore."
PLG_PAGENAVIGATION_FIELD_RELATIVE_LABEL="Relative To"
PLG_PAGENAVIGATION_FIELD_VALUE_ABOVE="Above"
PLG_PAGENAVIGATION_FIELD_VALUE_ARTICLE="Full Article"
PLG_PAGENAVIGATION_FIELD_VALUE_BELOW="Below"
PLG_PAGENAVIGATION_FIELD_VALUE_NEXTPREV="Next/Previous (static text)"
PLG_PAGENAVIGATION_FIELD_VALUE_TEXT="Text"
PLG_PAGENAVIGATION_FIELD_VALUE_TITLE="Title of the Article"
PLG_PAGENAVIGATION_XML_DESCRIPTION="Enables you to add <em>Next &amp; Previous</em> functionality to an Article."
language/en-GB/en-GB.plg_system_stats.ini000060400000004532152453623440014223 0ustar00; Joomla! Project
; (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_STATS="System - Joomla! Statistics"
PLG_SYSTEM_STATS_BTN_NEVER_SEND="Never"
PLG_SYSTEM_STATS_BTN_SEND_ALWAYS="Always"
PLG_SYSTEM_STATS_BTN_SEND_NOW="Once"
; The following two strings are deprecated for 4.0
PLG_SYSTEM_STATS_DEBUG_DESC="Enable debug for testing purposes. Statistics will be sent on every page load."
PLG_SYSTEM_STATS_DEBUG_LABEL="Debug"
PLG_SYSTEM_STATS_INTERVAL_DESC="Statistics will be sent every X hours. The default is 12."
PLG_SYSTEM_STATS_INTERVAL_LABEL="Interval (hours)"
PLG_SYSTEM_STATS_LABEL_CMS_VERSION="CMS Version"
PLG_SYSTEM_STATS_LABEL_DB_TYPE="DB Type"
PLG_SYSTEM_STATS_LABEL_DB_VERSION="DB Version"
PLG_SYSTEM_STATS_LABEL_MESSAGE_TITLE="Joomla! would like your permission to collect some basic statistics."
PLG_SYSTEM_STATS_LABEL_PHP_VERSION="PHP Version"
PLG_SYSTEM_STATS_LABEL_SERVER_OS="Server OS"
PLG_SYSTEM_STATS_LABEL_UNIQUE_ID="Unique ID"
PLG_SYSTEM_STATS_MODE_DESC="Select the way that you want the statistics to be sent."
PLG_SYSTEM_STATS_MODE_LABEL="Mode"
PLG_SYSTEM_STATS_MODE_OPTION_ALWAYS_SEND="Always send"
PLG_SYSTEM_STATS_MODE_OPTION_NEVER_SEND="Never send"
PLG_SYSTEM_STATS_MODE_OPTION_ON_DEMAND="On demand"
PLG_SYSTEM_STATS_MSG_ALLOW_SENDING_DATA="Enable Joomla Statistics?"
PLG_SYSTEM_STATS_MSG_JOOMLA_WANTS_TO_SEND_DATA="To better understand our install base and end user environments it is helpful if you send some site information back to a Joomla! controlled central server. No identifying data is captured at any point. You can change these settings later from Plugins > System - Joomla! Statistics."
PLG_SYSTEM_STATS_MSG_WHAT_DATA_WILL_BE_SENT="Select here to see the information that will be sent."
PLG_SYSTEM_STATS_RESET_UNIQUE_ID="Reset Unique ID"
PLG_SYSTEM_STATS_UNIQUE_ID_DESC="An identifier that allows the Joomla! project to count unique installs of the plugin. This is sent with the statistics back to the server."
PLG_SYSTEM_STATS_UNIQUE_ID_LABEL="Unique ID"
PLG_SYSTEM_STATS_XML_DESCRIPTION="System Plugin that sends environment statistics to a server controlled by the Joomla! project for statistical analysis. Statistics sent include PHP version, CMS version, Database type, Database version and Server type."
language/en-GB/en-GB.plg_finder_tags.sys.ini000060400000000714152453623440014561 0ustar00; Joomla! Project
; (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FINDER_STATISTICS_TAG="Tag"
PLG_FINDER_TAGS="Smart Search - Tags"
PLG_FINDER_TAGS_ERROR_ACTIVATING_PLUGIN="Could not automatically activate the &quot;Smart Search - Tags&quot; plugin."
PLG_FINDER_TAGS_XML_DESCRIPTION="This plugin indexes Joomla! Tags."
language/en-GB/en-GB.tpl_isis.ini000060400000005220152453623440012440 0ustar00; Joomla! Project
; (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

ISIS="Isis Administrator template"
TPL_ISIS_CLEAR_CACHE="Clear Cache"
TPL_ISIS_COLOR_DESC="Choose a colour for the navigation bar. If left blank, the default value will be used."
TPL_ISIS_COLOR_HEADER_DESC="Choose a colour for the header. If left blank, the default value will be used."
TPL_ISIS_COLOR_HEADER_LABEL="Header Colour"
TPL_ISIS_COLOR_LABEL="Nav Bar Colour"
TPL_ISIS_COLOR_LOGIN_BACKGROUND_DESC="Choose a colour for the background of the login screen. If left blank, the default value will be used."
TPL_ISIS_COLOR_LOGIN_BACKGROUND_LABEL="Login Background Colour"
TPL_ISIS_COLOR_SIDEBAR_DESC="Choose a colour for the Sidebar Background. If left blank, the default value will be used."
TPL_ISIS_COLOR_SIDEBAR_LABEL="Sidebar Colour"
TPL_ISIS_COLOR_LINK_DESC="Choose a colour for the Link. If left blank, the default value will be used."
TPL_ISIS_COLOR_LINK_LABEL="Link Colour"
TPL_ISIS_CONTROL_PANEL="Control Panel"
TPL_ISIS_EDIT_ACCOUNT="Edit Account"
TPL_ISIS_FIELD_ADMIN_MENUS_DESC="If you intend to use Joomla Administrator on a monitor, set this to 'No'. It will prevent the collapse of the Administrator menus when reducing the width of the window. Default is 'Yes'."
TPL_ISIS_FIELD_ADMIN_MENUS_LABEL="Collapse Administrator Menu"
TPL_ISIS_HEADER_DESC="Optional display of header."
TPL_ISIS_HEADER_LABEL="Display Header"
TPL_ISIS_INSTALLER="Installer"
TPL_ISIS_ISFREESOFTWARE="Joomla is free software released under the GNU General Public License."
TPL_ISIS_LOGIN_LOGO_DESC="Select or upload a custom logo for the login area of administrator template."
TPL_ISIS_LOGIN_LOGO_LABEL="Login Logo"
TPL_ISIS_LOGO_DESC="Upload a custom logo for the administrator template."
TPL_ISIS_LOGO_LABEL="Logo"
TPL_ISIS_LOGOUT="Logout"
TPL_ISIS_PREVIEW="Preview %s"
TPL_ISIS_SKIP_TO_MAIN_CONTENT="Skip to Main Content"
TPL_ISIS_SKIP_TO_MAIN_CONTENT_HERE="Main content begins here"
TPL_ISIS_STATUS_BOTTOM="Fixed bottom"
TPL_ISIS_STATUS_DESC="Choose the location of the status module."
TPL_ISIS_STATUS_LABEL="Status Module Position"
TPL_ISIS_STATUS_TOP="Top"
TPL_ISIS_STICKY_DESC="Optionally set the toolbar to a fixed (pinned) location."
TPL_ISIS_STICKY_LABEL="Pinned Toolbar"
TPL_ISIS_TOGGLE_MENU="Toggle Navigation"
TPL_ISIS_TOOLBAR="Toolbar"
TPL_ISIS_USERMENU="User Menu"
TPL_ISIS_XML_DESCRIPTION="Continuing the Egyptian god/goddess theme (Khepri from 1.5 and Hathor from 1.6), Isis is the Joomla 3 administrator template based on Bootstrap and the launch of the Joomla User Interface library (JUI)."
language/en-GB/en-GB.plg_fields_user.ini000060400000001004152453623440013754 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_USER="Fields - User"
PLG_FIELDS_USER_DEFAULT_VALUE_DESC="The default user."
PLG_FIELDS_USER_DEFAULT_VALUE_LABEL="Default User"
PLG_FIELDS_USER_LABEL="User (%s)"
PLG_FIELDS_USER_XML_DESCRIPTION="This plugin lets you create new fields of type 'user' in any extensions where custom fields are supported."
language/en-GB/en-GB.com_languages.sys.ini000060400000001517152453623440014240 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_LANGUAGES="Languages"
COM_LANGUAGES_INSTALLED_VIEW_DEFAULT_DESC="Displays language packs installed into your Joomla! website."
COM_LANGUAGES_INSTALLED_VIEW_DEFAULT_TITLE="Installed Languages"
COM_LANGUAGES_LANGUAGES_VIEW_DEFAULT_DESC="Create or manage content languages for your Joomla! website."
COM_LANGUAGES_LANGUAGES_VIEW_DEFAULT_TITLE="Content Languages"
COM_LANGUAGES_OVERRIDE_VIEW_DEFAULT_DESC="Here you assign custom text for a language key that you want to use instead of language pack default text."
COM_LANGUAGES_OVERRIDE_VIEW_DEFAULT_TITLE="Language Overrides"
COM_LANGUAGES_XML_DESCRIPTION="Component for language management."
language/en-GB/en-GB.plg_finder_categories.ini000060400000000515152453623440015132 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FINDER_CATEGORIES="Smart Search - Categories"
PLG_FINDER_CATEGORIES_XML_DESCRIPTION="This plugin indexes Joomla! Categories."
language/en-GB/en-GB.com_xmap.sys.ini000060400000001773152453623440013243 0ustar00; $Id$
; Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
; GNU General Public License version 2 or later; see LICENSE.txt
; Guillermo Vargas (guille@vargas.co.cr)
;

COM_XMAP="Xmap"
COM_XMAP_TITLE="Xmap"
COM_XMAP_XML_DESC="Xmap - Sitemap Generator for Joomla!"

;
; View and layout titles and descriptions
;
COM_XMAP_SITEMAP_HTML_VIEW_DEFAULT_TITLE="HTML Site map"
COM_XMAP_SITEMAP_HTML_VIEW_DEFAULT_DESC="Display a Site map in HTML format"
COM_XMAP_SITEMAP_XML_VIEW_DEFAULT_TITLE="XML Sitemap"
COM_XMAP_SITEMAP_XML_VIEW_DEFAULT_DESC="Display an Site map in XML format"

COM_XMAP_SELECT_AN_SITEMAP="Choose a site map"
COM_XMAP_SELECT_A_SITEMAP="A site map"
COM_XMAP_CHANGE_SITEMAP_BUTTON="Change"
COM_XMAP_CHANGE_SITEMAP="Select a site map from the list"

COM_INSTALLER_TYPE_XMAP_EXT="Xmap Extension"
COM_XMAP_ATTRIBS_SITEMAP_SETTINGS_LABEL="Sitemap Settings"
COM_XMAP_INCLUDE_CSS_LABEL="Include Xmap's Style"
COM_XMAP_INCLUDE_CSS_DESC="Select yes to include the CSS file with the styles for the sitemap"language/en-GB/en-GB.lib_fof40.ini000060400000007170152453623440012364 0ustar00;; @package     FOF
;; @copyright   Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
;; @license     GNU GPL version 3 or later

; Download helper
LIB_FOF40_DOWNLOAD_ERR_COULDNOTDOWNLOADFROMURL="Could not download from %s"
LIB_FOF40_DOWNLOAD_ERR_COULDNOTWRITELOCALFILE="Local file %s is not writeable"
LIB_FOF40_DOWNLOAD_ERR_CURL_ERROR="The download failed: cURL error %s: %s"
LIB_FOF40_DOWNLOAD_ERR_FOPEN_ERROR="The download failed: fopen returned no header information"
LIB_FOF40_DOWNLOAD_ERR_HTTPERROR="Unexpected HTTP status %s"

LIB_FOF40_MODEL_ERR_GET_NAME="FOF: Model: Cannot get Model's name"
LIB_FOF40_CONTROLLER_ERR_GET_NAME="FOF: Controller: Cannot get Controller's name"
LIB_FOF40_VIEW_ERR_GET_NAME="FOF: Controller: Cannot get View's name"

LIB_FOF40_TRANSPARENTAUTH_ERR_NOT_FOUND="FOF: TransparentAuthentication %s not found"
LIB_FOF40_DISPATCHER_ERR_NOT_FOUND="FOF: Dispatcher %s not found"
LIB_FOF40_TOOLBAR_ERR_NOT_FOUND="FOF: Toolbar %s not found"
LIB_FOF40_CONTROLLER_ERR_NOT_FOUND="FOF: Controller %s not found"
LIB_FOF40_MODEL_ERR_NOT_FOUND="FOF: Model %s not found"
LIB_FOF40_VIEW_ERR_NOT_FOUND="FOF: View %s not found"

LIB_FOF40_CONTROLLER_ERR_LOCKED="This item is already checked out by another user"

LIB_FOF40_TRANSPARENTAUTHENTICATION_INVALIDAUTHMETHOD="Invalid Transparent Authentication method '%u'."

LIB_FOF40_MODEL_ERR_BIND="FOF: %s::bind() argument is %s, not an object or array"
LIB_FOF40_MODEL_ERR_COULDNOTLOAD="Could not load record"
LIB_FOF40_MODEL_ERR_NOITEMSFOUND="No items found in %s"
LIB_FOF40_MODEL_ERR_CANNOTLOCKNOTLOADEDRECORD="Cannot lock a record which has not been loaded"
LIB_FOF40_MODEL_ERR_NOASSETKEY="Table must have an asset key defined and a value for the table id in order to track assets"
LIB_FOF40_MODEL_ERR_NOCONTENTTYPE="Content type for %s is not set."

LIB_FOF40_MODEL_ERR_TREE_INCOMPATIBLETABLE="Database table %s is not compatible with TreeModel: it does not have lft/rgt columns"
LIB_FOF40_MODEL_ERR_TREE_UNEXPECTEDPK="No primary key provided or deleting this record is not allowed"
LIB_FOF40_MODEL_ERR_TREE_UNSUPPORTEDMETHOD="Method %s() is not supported by TreeModel"
LIB_FOF40_MODEL_ERR_TREE_ONLYINROOT="Method %s() is only allowed for root nodes"
LIB_FOF40_MODEL_ERR_TREE_INVALIDLFTRGT_PARENT="Invalid lft/rgt values in parent node"
LIB_FOF40_MODEL_ERR_TREE_INVALIDLFTRGT_SIBLING="Invalid lft/rgt values in sibling node"
LIB_FOF40_MODEL_ERR_TREE_INVALIDLFTRGT_OTHER="Invalid lft/rgt values in current node"
LIB_FOF40_MODEL_ERR_TREE_INVALIDLFTRGT_CURRENT="Invalid lft/rgt values in other node"
LIB_FOF40_MODEL_ERR_TREE_ROOTNOTFOUND="No root found for table %s, node lft=%s"

LIB_FOF40_MODEL_ERR_FILTER_INVALIDFIELD="Invalid field object"
LIB_FOF40_MODEL_ERR_FILTER_NODBOBJECT="Database object unspecified creating a %s filter"

LIB_FOF40_TOOLBAR_ERR_MISSINGARGUMENT="The '%s' attribute is required for the '%s' button type"
LIB_FOF40_TOOLBAR_ERR_UNKNOWNBUTTONTYPE="Unknown button type %s"

LIB_FOF40_VIEW_MODELNOTINVIEW="The model %s does not exist in view %s"
LIB_FOF40_VIEW_UNRECOGNISEDEXTENSION="FOF: Unrecognised extension in view template %s"
LIB_FOF40_VIEW_POSSIBLYSUHOSIN="FOF: Could not write to your cache directory. Please make your cache directories (cache and administrator/cache under your site's root) writeable to PHP by changing the permissions. Alternatively, ask your host to make sure that they have not disabled the stream_wrapper_register() function in PHP. Moreover, if your host is using the Suhosin patch for PHP ask them to whitelist the fof:// stream wrapper in their server's php.ini file. If you do not understand what this means please contact your host and paste this entire message to them."
language/en-GB/en-GB.com_xmap.ini000060400000014364152453623440012426 0ustar00; $Id$
; Xmap component
; Guillermo Vargas (guille@vargas.co.cr)
; Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
; GNU General Public License version 2 or later; see LICENSE.txt
;

; Component Instalation strings
XMAP_INSTALLING_XMAP="Installing Xmap component - The site map generator for Joomla!"
XMAP_UPGRADING_XMAP="Upgrading Xmap component - The site map generator for Joomla!"
XMAP_UNISTALLING_XMAP_EXTENSIONS="Unistalling Xmap's extensions"
XMAP_INSTALLED_EXTENSION_X="Installing %s extension"
XMAP_NOT_INSTALLED_EXTENSION_X="It was not possible to install the extension for %s"
XMAP_INSTALL_ERROR_EXTENSION="Error installing extension"
XMAP_INSTALL_SUCCESS_EXTENSION="Installing extension was successful"

XMAP_HEADING_XML_STATS="XML Sitemap stats"
XMAP_HEADING_HTML_STATS="HTML Sitemap stats"
XMAP_HEADING_NUM_LINKS="Num. Items"
XMAP_HEADING_NUM_HITS="Hits"
XMAP_HEADING_LAST_VISIT="Last Visited"
XMAP_HEADING_SITEMAP="Sitemap"
XMAP_HEADING_DEFAULT="Default"
XMAP_HEADING_ID="ID"
XMAP_HEADING_PUBLISHED="Published"
XMAP_HEADING_ACCESS="Access"
XMAP_SUBMENU_SITEMAPS="Sitemaps"
XMAP_SUBMENU_EXTENSIONS="Extensions"
XMAP_SUBMENU_SETTINGS="Settings"
XMAP_TOOLBAR_SET_DEFAULT="Set Default"
XMAP_SITEMAPS_TITLE="Sitemaps Manager"
DATE_MINUTES_AGO="%d minutes ago"
DATE_HOURS_MINUTES_AGO="%d hours and %d minutes ago"
DATE_DAYS_HOURS_AGO="%d days and %d hours ago"
DATE_NEVER="Never"
XMAP_INTROTEXT_LABEL="Intro Text"
XMAP_INTROTEXT_DESC="Enter the text that will be displayed above the site map"
XMAP_PRIORITY="Priority"
XMAP_CHANGE_FREQUENCY="Change Frequency"
XMAP_PAGE_ADD_SITEMAP="New Sitemap"
XMAP_PAGE_EDIT_SITEMAP="Edit Sitemap"
XMAP_SITEMAP_DETAILS_FIELDSET="Sitemap Details"
XMAP_XML_LINK="XML Sitemap"
XMAP_XML_LINK_TOOLTIP="Go to the XML version of the sitemap, use this url to submit your sitemap to Google and other search engines."
XMAP_NEWS_LINK="News Sitemap"
XMAP_NEWS_LINK_TOOLTIP="Go to the &ldquo;News&rdquo; version of the sitemap, use this url to submit your sitemap to Google News."
XMAP_IMAGES_LINK="Images Sitemap"
XMAP_IMAGES_LINK_TOOLTIP="Go to the &ldquo;Images&rdquo; version of the sitemap, use this url to submit your sitemap to Google and other search engines."

XMAP_MESSAGE_EXTENSIONS_DISABLED="Xmap have detected that the following extensions can help you to get more content in your site map but they are disabled, you have to manually enable them visiting the <a href='index.php?option=com_plugins&view=plugins&filter_type=xmap&filter_folder=xmap'>extensions manager</a>: %s"
COM_XMAP_SITEMAPS_N_ITEMS_UNPUBLISHED="%d sitemaps successfully unpublished"
COM_XMAP_SITEMAPS_N_ITEMS_UNPUBLISHED_1="%d sitemap successfully unpublished"
COM_XMAP_SITEMAPS_N_ITEMS_PUBLISHED="%d sitemaps successfully published"
COM_XMAP_SITEMAPS_N_ITEMS_PUBLISHED_1="%d sitemap successfully published"
COM_XMAP_SITEMAPS_N_ITEMS_TRASHED="%d sitemaps successfully published"
COM_XMAP_SITEMAPS_N_ITEMS_TRASHED_1="%d sitemap successfully trashed"
COM_XMAP_SITEMAPS_N_ITEMS_DELETED="%d sitemaps successfully deleted"
COM_XMAP_SITEMAPS_N_ITEMS_DELETED_1="%d sitemap successfully deleted"

XMAP_FIELDSET_MENUS="Menus"
XMAP_FIELDSET_OPTIONS="Options"
XMAP_FIELDSET_METADATA="Metadata"
XMAP_ATTRIBS_SHOW_INTRO_LABEL="Intro text"
XMAP_ATTRIBS_SHOW_INTRO_DESC="Should we show the intro text in the HTML sitemap?"
XMAP_ATTRIBS_SHOW_MENU_TITLE_LABEL="Menu title"
XMAP_ATTRIBS_SHOW_MENU_TITLE_DESC="Should we show the menu title at the top of each menu"
XMAP_ATTRIBS_CLASSNAME_LABEL="CSS Class name"
XMAP_ATTRIBS_CLASSNAME_DESC="The CSS class to use for this sitemap."
XMAP_ATTRIBS_COLUMNS_LABEL="# Cols"
XMAP_ATTRIBS_COLUMNS_DESC="Specify the number of columns for the HTML. (This only has effect if the number of menus on the sitemap is greater than 1)"
XMAP_ATTRIBS_EXTERNAL_LINKS_IMAGE_LABEL="External Links Image"
XMAP_ATTRIBS_EXTERNAL_LINKS_IMAGE_DESC="Select the image to use for the external links"
XMAP_ATTRIBS_COMPRESS_XML_LABEL="Compress XML"
XMAP_ATTRIBS_COMPRESS_XML_DESC="Should be compress the XML sitemap?"
XMAP_ATTRIBS_BEAUTIFY_XML_LABEL="Beautify XML"
XMAP_ATTRIBS_BEAUTIFY_XML_DESC="Select yes to add some styling to XML Sitemap Output. This for humans only and does not affect the behavior for robots at all. If you are seeing a white sitemap or errors in your browser, try disabling this."
XMAP_FIELDSET_NEWS_OPTIONS="News Sitemap"
XMAP_ATTRIBS_NEWS_PUBLICATION_NAME_LABEL="Publication Name"
XMAP_ATTRIBS_NEWS_PUBLICATION_NAME_DESC="This is the name of the news publication. It must exactly match the name as it appears on your articles in news.google.com, omitting any trailing parentheticals. For example, if the name appears in Google News as &ldquo;The Example Times (subscription)&rdquo;, you should use the name, &ldquo;The Example Times&rdquo;."
XMAP_ATTRIBS_NEWS_POSTS_KEYWORDS_LABEL="Posts keywords"
XMAP_ATTRIBS_NEWS_POSTS_KEYWORDS_DESC="Comma separated list of keywords to describe your posts. Default to the post's category title."
XMAP_ATTRIBS_INCLUDE_LINK_LABEL="Link to author"
XMAP_ATTRIBS_INCLUDE_LINK_DESC="Include the link to Xmap's home at the bottom of the HTML site map."

; Extension edit page
XMAP_PAGE_EDIT_EXTENSION="Edit Extension"
XMAP_N_EXTENSIONS_UNPUBLISHED="%s extensions unpublished"
XMAP_N_EXTENSIONS_PUBLISHED="%s extensions published"
XMAP_EXTENSION_DETAILS="Details"
XMAP_EXTENSION_AUTHOR="Author"
XMAP_EXTENSION_AUTHOR_EMAIL="Author's Email"
XMAP_EXTENSION_AUTHOR_WEBSITE="Author's website"
XMAP_EXTENSION_DESCRIPTION="Description"

XMAP_DESC_EXTENSIONS="List of installed Xmap Extensions"
XMAP_HEADING_AUTHOR="Author"
XMAP_HEADING_DATE="Date"
XMAP_HEADING_FOLDER="Folder"
XMAP_HEADING_NUM="Num."
XMAP_HEADING_PLUGIN="Plug-in"
XMAP_HEADING_VERSION="Version"
XMAP_INSTALL="Install"
XMAP_INSTALL_DIRECTORY="Install directory"
XMAP_INSTALL_FROM_DIRECTORY="Install from directory"
XMAP_INSTALL_FROM_URL="Install from URL"
XMAP_INSTALL_NEW_EXTENSION="Install new extension"
XMAP_INSTALL_URL="Install URL"
XMAP_PACKAGE_FILE="Package file"
XMAP_PLEASE_ENTER_A_URL="Please enter a URL"
XMAP_PLEASE_SELECT_A_DIRECTORY="Please select a directory"
XMAP_PLEASE_SELECT_A_FILE_TO_UPLOAD="Please select a file to upload"
XMAP_UPLOAD_FILE="Upload file"
XMAP_UPLOAD_PACKAGE_FILE="Upload package file"
XMAP_EXTENSION_MANAGER_TITLE="Extension Manager"
XMAP_EXTENSIONS_TITLE="Extensions"
XMAP_FILTER_SEARCH_DESC="Search in title"language/en-GB/en-GB.com_wrapper.sys.ini000060400000000757152453623440013757 0ustar00; Joomla! Project
; (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_WRAPPER="Wrapper"
COM_WRAPPER_XML_DESCRIPTION="Displays an iframe to wrap an external page or site into Joomla!"
COM_WRAPPER_WRAPPER_VIEW_DEFAULT_DESC="Displays a URL in an iframe."
COM_WRAPPER_WRAPPER_VIEW_DEFAULT_OPTION="Default"
COM_WRAPPER_WRAPPER_VIEW_DEFAULT_TITLE="Iframe Wrapper"
language/en-GB/en-GB.com_redirect.sys.ini000060400000000457152453623440014075 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_REDIRECT="Redirects"
COM_REDIRECT_XML_DESCRIPTION="This component implements link redirection."
language/en-GB/en-GB.plg_search_tags.ini000060400000001260152453623440013737 0ustar00; Joomla! Project
; (C) 2014 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SEARCH_TAGS="Search - Tags"
PLG_SEARCH_TAGS_FIELD_SEARCHLIMIT_DESC="Number of search items to return."
PLG_SEARCH_TAGS_FIELD_SEARCHLIMIT_LABEL="Search Limit"
PLG_SEARCH_TAGS_FIELD_SHOW_TAGGED_ITEMS_DESC="Display or not the items that hold the tags related to the search."
PLG_SEARCH_TAGS_FIELD_SHOW_TAGGED_ITEMS_LABEL="Show Tagged Items"
PLG_SEARCH_TAGS_ITEM_TAGGED_WITH="%s tagged with: %s"
PLG_SEARCH_TAGS_TAGS="Tags"
PLG_SEARCH_TAGS_XML_DESCRIPTION="Enables searching in Tags."
language/en-GB/en-GB.plg_system_remember.sys.ini000060400000000471152453623440015476 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_REMEMBER_XML_DESCRIPTION="Provides remember me functionality."
PLG_SYSTEM_REMEMBER="System - Remember Me"
language/en-GB/en-GB.plg_quickicon_jce.ini000060400000000542152453623440014264 0ustar00; JCE Project
; Copyright (C) 2006 - 2012 Ryan Demmer. All rights reserved
; GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
; Note : All ini files need to be saved as UTF-8

PLG_QUICKICON_JCE="Quick Icon - JCE File Browser"
PLG_QUICKICON_JCE_XML_DESCRIPTION="JCE File Browser Quick Icon"
PLG_QUICKICON_JCE_TITLE="JCE File Browser"
language/en-GB/en-GB.plg_fields_textarea.ini000060400000002336152453623440014624 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_TEXTAREA="Fields - Textarea"
PLG_FIELDS_TEXTAREA_LABEL="Text Area (%s)"
PLG_FIELDS_TEXTAREA_PARAMS_COLS_DESC="The width of the visible text area in characters. If omitted the width is determined by the browser. The value does not limit the number of characters that may be entered."
PLG_FIELDS_TEXTAREA_PARAMS_COLS_LABEL="Columns"
PLG_FIELDS_TEXTAREA_PARAMS_FILTER_DESC="Allow the system to save certain html tags or raw data."
PLG_FIELDS_TEXTAREA_PARAMS_FILTER_LABEL="Filter"
PLG_FIELDS_TEXTAREA_PARAMS_MAXLENGTH_LABEL="Maximum Length"
PLG_FIELDS_TEXTAREA_PARAMS_MAXLENGTH_DESC="The maximum number of characters that can be entered."
PLG_FIELDS_TEXTAREA_PARAMS_ROWS_DESC="The height of the visible text area in lines. If omitted the height is determined by the browser. The value does not limit the number of lines that may be entered."
PLG_FIELDS_TEXTAREA_PARAMS_ROWS_LABEL="Rows"
PLG_FIELDS_TEXTAREA_XML_DESCRIPTION="This plugin lets you create new fields of type 'textarea' in any extensions where custom fields are supported."
language/en-GB/en-GB.com_finder.ini000060400000043364152453623440012732 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_FINDER="Smart Search"
COM_FINDER_ALLOW_EMPTY_QUERY_DESC="Only if a filter is selected, allow an empty search string to initiate a search within the filter constraints."
COM_FINDER_ALLOW_EMPTY_QUERY_LABEL="Allow Empty Search"
COM_FINDER_AN_ERROR_HAS_OCCURRED="An Error Has Occurred"
COM_FINDER_CONFIG_ALLOW_EMPTY_QUERY_DESCRIPTION="Only if a filter is selected, allow an empty search string to initiate a search within the filter restraints."
COM_FINDER_CONFIG_ALLOW_EMPTY_QUERY_LABEL="Allow Empty Search"
COM_FINDER_CONFIG_BATCH_SIZE_DESCRIPTION="The batch size controls how many items are processed per batch. Large batch sizes require lots of memory whereas small batch sizes require less memory but execute more requests which tends to take longer."
COM_FINDER_CONFIG_BATCH_SIZE_LABEL="Indexer Batch Size"
COM_FINDER_CONFIG_DESCRIPTION_LENGTH_DESC="Description text for search results will be truncated to the specified character length."
COM_FINDER_CONFIG_DESCRIPTION_LENGTH_DESCRIPTION="Description text for search results will be truncated to the specified character length."
COM_FINDER_CONFIG_DESCRIPTION_LENGTH_LABEL="Description Length"
COM_FINDER_CONFIG_ENABLE_LOGGING_DESCRIPTION="Enable this option to create a log file in your site's logs folder during the index process. This file is useful for troubleshooting issues with the index process. It is recommended that logging be disabled unless necessary."
COM_FINDER_CONFIG_ENABLE_LOGGING_LABEL="Enable Logging"
COM_FINDER_CONFIG_EXPAND_ADVANCED_DESC="Toggle if the advanced search options should be expanded by default."
COM_FINDER_CONFIG_EXPAND_ADVANCED_DESCRIPTION="Toggle if the advanced search options should be expanded by default."
COM_FINDER_CONFIG_EXPAND_ADVANCED_LABEL="Expand Advanced Search"
COM_FINDER_CONFIG_FIELD_OPENSEARCH_DESCRIPTON_DESCRIPTION="Description displayed for this site as a search provider."
COM_FINDER_CONFIG_FIELD_OPENSEARCH_DESCRIPTON_LABEL="OpenSearch Description"
COM_FINDER_CONFIG_FIELD_OPENSEARCH_NAME_DESCRIPTION="Name displayed for this site as a search provider."
COM_FINDER_CONFIG_FIELD_OPENSEARCH_NAME_LABEL="OpenSearch Name"
COM_FINDER_CONFIG_GATHER_SEARCH_STATISTICS_DESCRIPTION="Record the search phrases submitted by visitors."
COM_FINDER_CONFIG_GATHER_SEARCH_STATISTICS_LABEL="Gather Search Statistics"
COM_FINDER_CONFIG_HILIGHT_CONTENT_SEARCH_TERMS_DESCRIPTION="Toggle if search terms should be highlighted in search results."
COM_FINDER_CONFIG_HILIGHT_CONTENT_SEARCH_TERMS_LABEL="Highlight Search Terms"
COM_FINDER_CONFIG_IMPORT_EXPORT="Import/Export"
COM_FINDER_CONFIG_IMPORT_EXPORT_HELP="Help"
COM_FINDER_CONFIG_IMPORT_EXPORT_INSTRUCTIONS="To export your configuration options, select the Export button in the toolbar above.<br /><br />To import an existing configuration, select the browse button to choose a file from your hard drive or copy/paste the data into the text field below and then select the Import button in the toolbar above."
COM_FINDER_CONFIG_IMPORT_FROM_FILE="Import From File:"
COM_FINDER_CONFIG_IMPORT_FROM_STRING="Import From Text:"
COM_FINDER_CONFIG_IMPORT_TOOLBAR_TITLE="Smart Search: Import/Export Configuration"
COM_FINDER_CONFIG_MEMORY_TABLE_LIMIT_DESCRIPTION="The memory table limit should not be changed unless you are getting errors indicating that the finder_tokens or finder_tokens_aggregate tables are full. The default is 30,000."
COM_FINDER_CONFIG_MEMORY_TABLE_LIMIT_LABEL="Memory Table Limit"
COM_FINDER_CONFIG_META_MULTIPLIER_DESCRIPTION="The multiplier is used to control how much influence matching text has on the overall relevance score of a search result. A multiplier is considered in relationship to the other multipliers. The metadata comes from a number of sources including the meta keywords and meta description, author names, etc."
COM_FINDER_CONFIG_META_MULTIPLIER_LABEL="Metadata Weight Multiplier"
COM_FINDER_CONFIG_MISC_MULTIPLIER_DESCRIPTION="The multiplier is used to control how much influence matching text has on the overall relevance score of a search result. A multiplier is considered in relationship to the other multipliers. The miscellaneous text comes from a number of sources including comments and other associated data."
COM_FINDER_CONFIG_MISC_MULTIPLIER_LABEL="Misc. Text Weight Multiplier"
COM_FINDER_CONFIG_PATH_MULTIPLIER_DESCRIPTION="The multiplier is used to control how much influence matching text has on the overall relevance score of a search result. A multiplier is considered in relationship to the other multipliers. The path text comes from the SEF URL of the content."
COM_FINDER_CONFIG_PATH_MULTIPLIER_LABEL="Path Text Weight Multiplier"
COM_FINDER_CONFIG_SHOW_ADVANCED_DESC="Toggle if users should be able to see advanced search options."
COM_FINDER_CONFIG_SHOW_ADVANCED_DESCRIPTION="Toggle if users should be able to see advanced search options."
COM_FINDER_CONFIG_SHOW_ADVANCED_LABEL="Advanced Search"
COM_FINDER_CONFIG_SHOW_ADVANCED_TIPS_DESCRIPTION="Toggle if users should be able to see advanced search tips."
COM_FINDER_CONFIG_SHOW_ADVANCED_TIPS_LABEL="Advanced Tips"
COM_FINDER_CONFIG_SHOW_AUTOSUGGEST_DESCRIPTION="Toggle if automatic search suggestions should be displayed."
COM_FINDER_CONFIG_SHOW_AUTOSUGGEST_LABEL="Search Suggestions"
COM_FINDER_CONFIG_SHOW_DATE_FILTERS_DESC="Show the start and end date filters in the advanced search."
COM_FINDER_CONFIG_SHOW_DATE_FILTERS_DESCRIPTION="Show the start and end date filters in the advanced search."
COM_FINDER_CONFIG_SHOW_DATE_FILTERS_LABEL="Date Filters"
COM_FINDER_CONFIG_SHOW_DESCRIPTION_DESC="Toggle if the description should be displayed with search results."
COM_FINDER_CONFIG_SHOW_DESCRIPTION_DESCRIPTION="Toggle if the description should be displayed with search results."
COM_FINDER_CONFIG_SHOW_DESCRIPTION_LABEL="Result Description"
COM_FINDER_CONFIG_SHOW_EXPLAINED_QUERY_DESC="Show or hide a detailed explanation of the search requested."
COM_FINDER_CONFIG_SHOW_EXPLAINED_QUERY_LABEL="Query Explanation"
; The following 4 strings are deprecated and will be removed with 4.0.
COM_FINDER_CONFIG_SHOW_FEED_DESC="Show the syndication feed link."
COM_FINDER_CONFIG_SHOW_FEED_LABEL="Show Feed"
COM_FINDER_CONFIG_SHOW_FEED_TEXT_DESC="Show the associated text with the feed, otherwise the title is shown in the feed."
COM_FINDER_CONFIG_SHOW_FEED_TEXT_LABEL="Show Feed Text"
COM_FINDER_CONFIG_SHOW_SUGGESTED_QUERY_DESC="Whether to suggest alternative search terms when a search produces no results."
COM_FINDER_CONFIG_SHOW_SUGGESTED_QUERY_LABEL="Did You Mean"
COM_FINDER_CONFIG_SHOW_URL_DESC="Show the associated URL that for the item."
COM_FINDER_CONFIG_SHOW_URL_DESCRIPTION="Show the associated URL for the item."
COM_FINDER_CONFIG_SHOW_URL_LABEL="Result URL"
COM_FINDER_CONFIG_SORT_DIRECTION_DESC="The direction in which to sort the search results."
COM_FINDER_CONFIG_SORT_DIRECTION_LABEL="Sort Direction"
COM_FINDER_CONFIG_SORT_OPTION_ASCENDING="Ascending"
COM_FINDER_CONFIG_SORT_OPTION_DESCENDING="Descending"
COM_FINDER_CONFIG_SORT_OPTION_LIST_PRICE="List price"
COM_FINDER_CONFIG_SORT_OPTION_RELEVANCE="Relevance"
COM_FINDER_CONFIG_SORT_OPTION_START_DATE="Date"
COM_FINDER_CONFIG_SORT_ORDER_DESC="The field on which to sort the search results."
COM_FINDER_CONFIG_SORT_ORDER_LABEL="Sort Field"
COM_FINDER_CONFIG_STEMMER_DESCRIPTION="The language stemmer to use. Choose snowball if a stemmer for your language is not available or you have multilingual content."
COM_FINDER_CONFIG_STEMMER_ENABLE_DESCRIPTION="Enable language stemming if available."
COM_FINDER_CONFIG_STEMMER_ENABLE_LABEL="Enable Stemmer"
COM_FINDER_CONFIG_STEMMER_FR="French Only"
COM_FINDER_CONFIG_STEMMER_LABEL="Stemmer"
COM_FINDER_CONFIG_STEMMER_PORTER_EN="English Only"
COM_FINDER_CONFIG_STEMMER_SNOWBALL="Snowball"
COM_FINDER_CONFIG_TEXT_MULTIPLIER_DESCRIPTION="The multiplier is used to control how much influence matching text has on the overall relevance score of a search result. A multiplier is considered in relationship to the other multipliers. The body text comes from the summary and/or body of the content."
COM_FINDER_CONFIG_TEXT_MULTIPLIER_LABEL="Body Text Weight Multiplier"
COM_FINDER_CONFIG_TITLE_MULTIPLIER_DESCRIPTION="The multiplier is used to control how much influence matching text has on the overall relevance score of a search result. A multiplier is considered in relationship to the other multipliers. The title text comes from the title of the content."
COM_FINDER_CONFIG_TITLE_MULTIPLIER_LABEL="Title Text Weight Multiplier"
COM_FINDER_CONFIGURATION="Smart Search: Options"
COM_FINDER_CREATE_FILTER="Create a filter."
COM_FINDER_EDIT_FILTER="Edit Filter"
COM_FINDER_EXPORT="Export"
COM_FINDER_FIELD_CREATED_BY_ALIAS_DESC="Displayed name of the filter creator."
COM_FINDER_FIELD_CREATED_BY_ALIAS_LABEL="Alias"
COM_FINDER_FIELD_CREATED_BY_DESC="Creator of the filter."
COM_FINDER_FIELD_CREATED_BY_LABEL="Created By"
COM_FINDER_FIELD_MODIFIED_DESCRIPTION="The date and time that the filter was last modified."
COM_FINDER_FIELDSET_INDEX_OPTIONS_DESCRIPTION="Indexing options"
COM_FINDER_FIELDSET_INDEX_OPTIONS_LABEL="Index"
COM_FINDER_FIELDSET_SEARCH_OPTIONS_DESCRIPTION="Smart Search options"
COM_FINDER_FIELDSET_SEARCH_OPTIONS_LABEL="Smart Search"
COM_FINDER_FILTER_BRANCH_LABEL="Search by %s"
COM_FINDER_FILTER_BY="Show %s:"
COM_FINDER_FILTER_CONTENT_MAP_DESC="Filter the indexed content by content map."
COM_FINDER_FILTER_CONTENT_MAP_LABEL="Select the Content Map"
COM_FINDER_FILTER_EDIT_TOOLBAR_TITLE="Smart Search: Edit Filter"
COM_FINDER_FILTER_END_DATE_DESCRIPTION="Format YYYY-MM-DD"
COM_FINDER_FILTER_END_DATE_LABEL="End Date"
COM_FINDER_FILTER_FIELDSET_DETAILS="Filter Details"
COM_FINDER_FILTER_FIELDSET_PARAMS="Filter Timeline"
COM_FINDER_FILTER_HIDE_ALL="Collapse all"
COM_FINDER_FILTER_MAP_COUNT="Map Count"
COM_FINDER_FILTER_MAP_COUNT_DESCRIPTION="The number of maps included in the filter."
COM_FINDER_FILTER_NEW_TOOLBAR_TITLE="Smart Search: New Filter"
COM_FINDER_FILTER_SEARCH_DESCRIPTION="Filter the list by a title."
COM_FINDER_FILTER_SELECT_CONTENT_MAP="- Select Content Map -"
COM_FINDER_FILTER_SELECT_ALL_LABEL="Search All"
COM_FINDER_FILTER_START_DATE_DESCRIPTION="Format YYYY-MM-DD"
COM_FINDER_FILTER_START_DATE_LABEL="Start Date"
COM_FINDER_FILTER_TIMESTAMP="Created On"
COM_FINDER_FILTER_SHOW_ALL="Expand all"
COM_FINDER_FILTER_TITLE_DESCRIPTION="The title of the filter."
COM_FINDER_FILTER_WHEN_AFTER="After"
COM_FINDER_FILTER_WHEN_BEFORE="Before"
COM_FINDER_FILTER_WHEN_END_DATE_DESCRIPTION="When to search relative to the end date (before, after or exactly)"
COM_FINDER_FILTER_WHEN_END_DATE_LABEL="When (End Date)"
COM_FINDER_FILTER_WHEN_EXACTLY="Exactly"
COM_FINDER_FILTER_WHEN_START_DATE_DESCRIPTION="When to search relative to the start date (before, after or exactly)"
COM_FINDER_FILTER_WHEN_START_DATE_LABEL="When (Start Date)"
COM_FINDER_FILTERS="Filters"
COM_FINDER_FILTERS_DELETE_CONFIRMATION="Are you sure you want to delete the selected filters(s)?"
COM_FINDER_FILTERS_TOOLBAR_TITLE="Smart Search: Search Filters"
COM_FINDER_GO="Go"
COM_FINDER_HEADING_CHILDREN="Maps"
COM_FINDER_HEADING_CREATED_BY="Created By"
COM_FINDER_HEADING_CREATED_BY_ASC="Created By ascending"
COM_FINDER_HEADING_CREATED_BY_DESC="Created By descending"
COM_FINDER_HEADING_CREATED_ON="Created On"
COM_FINDER_HEADING_CREATED_ON_ASC="Created On ascending"
COM_FINDER_HEADING_CREATED_ON_DESC="Created On descending"
COM_FINDER_HEADING_INDEXER="Smart Search Indexer"
COM_FINDER_HEADING_MAP_COUNT="Map Count"
COM_FINDER_HEADING_MAP_COUNT_ASC="Map Count ascending"
COM_FINDER_HEADING_MAP_COUNT_DESC="Map Count descending"
COM_FINDER_HEADING_NODES="Items"
COM_FINDER_IMPORT="Import"
COM_FINDER_INDEX="Index"
COM_FINDER_INDEX_CONFIRM_DELETE_PROMPT="Are you sure you want to delete the selected item(s)?"
COM_FINDER_INDEX_CONFIRM_PURGE_PROMPT="Are you sure you want to delete ALL items from the index? This can take a long time on large sites."
COM_FINDER_INDEX_DATE_INFO="<strong>Published Start:</strong> %s<br /><strong>Published End:</strong> %s<br /><strong>Content Start:</strong> %s<br /><strong>Content End:</strong> %s"
COM_FINDER_INDEX_DATE_INFO_TITLE="Link Date Information"
COM_FINDER_INDEX_FILTER_BY_STATE="Any Published State"
COM_FINDER_INDEX_HEADING_DETAILS="Details"
COM_FINDER_INDEX_HEADING_INDEX_DATE="Last Updated"
COM_FINDER_INDEX_HEADING_INDEX_DATE_ASC="Last Updated ascending"
COM_FINDER_INDEX_HEADING_INDEX_DATE_DESC="Last Updated descending"
COM_FINDER_INDEX_HEADING_INDEX_TYPE="Type"
COM_FINDER_INDEX_HEADING_INDEX_TYPE_ASC="Type ascending"
COM_FINDER_INDEX_HEADING_INDEX_TYPE_DESC="Type descending"
COM_FINDER_INDEX_HEADING_LINK_URL="Raw URL"
COM_FINDER_INDEX_HEADING_LINK_URL_ASC="Raw URL ascending"
COM_FINDER_INDEX_HEADING_LINK_URL_DESC="Raw URL descending"
COM_FINDER_INDEX_NO_CONTENT="No content matches your search criteria."
COM_FINDER_INDEX_NO_DATA="No content has been indexed."
COM_FINDER_INDEX_PLUGIN_CONTENT_NOT_ENABLED="The <a href="_QQ_"%s"_QQ_">Smart Search Content Plugin</a> is disabled. Changes to content will not update the Smart Search index if you do not enable this plugin."
COM_FINDER_INDEX_PURGE_FAILED="Failed to delete selected items."
COM_FINDER_INDEX_PURGE_SUCCESS="All items have been deleted."
COM_FINDER_INDEX_SEARCH_DESC="Search in title, URL and last updated date."
COM_FINDER_INDEX_SEARCH_LABEL="Search Indexed Content"
COM_FINDER_INDEX_TIP="Start the indexer by pressing the Index button in the toolbar."
COM_FINDER_INDEX_TOOLBAR_PURGE="Clear Index"
COM_FINDER_INDEX_TOOLBAR_TITLE="Smart Search: Indexed Content"
COM_FINDER_INDEX_TYPE_FILTER="Any Type of Content"
COM_FINDER_INDEXER_HEADER_COMPLETE="Indexing Complete"
COM_FINDER_INDEXER_HEADER_ERROR="An Error Has Occurred"
COM_FINDER_INDEXER_HEADER_INIT="Starting Indexer"
COM_FINDER_INDEXER_HEADER_OPTIMIZE="Optimising Index"
COM_FINDER_INDEXER_HEADER_RUNNING="Indexer Running"
COM_FINDER_INDEXER_INVALID_DRIVER="The indexer does not support processing on the %s database driver."
COM_FINDER_INDEXER_INVALID_PARSER="Invalid parser type %s"
COM_FINDER_INDEXER_INVALID_STEMMER="Invalid stemmer type %s"
COM_FINDER_INDEXER_MESSAGE_COMPLETE="The indexing process is complete. It is now safe to close this window."
COM_FINDER_INDEXER_MESSAGE_INIT="The indexer is starting. Do not close this window."
COM_FINDER_INDEXER_MESSAGE_OPTIMIZE="The index tables are being optimised for the best possible performance. Do not close this window."
COM_FINDER_INDEXER_MESSAGE_RUNNING="Your content is being indexed. Do not close this window."
COM_FINDER_ITEM_X_ONLY="%s Only"
COM_FINDER_ITEMS="Content"
COM_FINDER_MAP_PUBLISH_FAILED="The selected map(s) could not be published. The returned error message is: %s."
COM_FINDER_MAP_PUBLISH_SUCCESS="The selected map(s) were published."
COM_FINDER_MAP_UNPUBLISH_FAILED="The selected map(s) could not be unpublished. The returned error message is: %s."
COM_FINDER_MAP_UNPUBLISH_SUCCESS="The selected map(s) were unpublished."
COM_FINDER_MAPS="Maps"
COM_FINDER_MAPS_BRANCH_LINK="Select to show the children in this branch."
COM_FINDER_MAPS_BRANCHES="Branches Only"
COM_FINDER_MAPS_CONFIRM_DELETE_PROMPT="Are you sure you want to delete the selected map(s)?"
COM_FINDER_MAPS_COUNT_PUBLISHED_ITEMS="Published Indexed Content"
COM_FINDER_MAPS_COUNT_UNPUBLISHED_ITEMS="Unpublished Indexed Content"
COM_FINDER_MAPS_MULTILANG="Note: Language filter system plugin has been enabled, so this branch will not be used."
COM_FINDER_MAPS_NO_CONTENT="No results to display. Either no content has been indexed or no content meets your filter criteria."
COM_FINDER_MAPS_RETURN_TO_BRANCHES="Return to Map Groups"
COM_FINDER_MAPS_SELECT_BRANCH="- Select Map Group -"
COM_FINDER_MAPS_SELECT_TYPE="- Select Type of Content -"
COM_FINDER_MAPS_TOOLBAR_TITLE="Smart Search: Content Maps"
COM_FINDER_MESSAGE_RETURNED="The following message was returned by the server:"
COM_FINDER_N_ITEMS_CHECKED_IN_0="No item checked in."
COM_FINDER_N_ITEMS_CHECKED_IN_1="%d item checked in."
COM_FINDER_N_ITEMS_CHECKED_IN_MORE="%d items checked in."
COM_FINDER_N_ITEMS_DELETED="%d items deleted."
COM_FINDER_N_ITEMS_DELETED_1="%d item deleted."
COM_FINDER_N_ITEMS_PUBLISHED="%d items published."
COM_FINDER_N_ITEMS_PUBLISHED_1="%d item published."
COM_FINDER_N_ITEMS_TRASHED="%d items trashed."
COM_FINDER_N_ITEMS_TRASHED_1="%d item trashed."
COM_FINDER_N_ITEMS_UNPUBLISHED="%d items unpublished."
COM_FINDER_N_ITEMS_UNPUBLISHED_1="%d item unpublished."
COM_FINDER_NO_ERROR_RETURNED="No error was returned. Make sure error reporting is enabled."
COM_FINDER_NO_FILTERS="No filters have been created yet."
COM_FINDER_NO_RESULTS="No results match your search criteria."
COM_FINDER_NO_RESULTS_OR_FILTERS="No results match your search criteria or no filters have been created yet."
COM_FINDER_QUERY_FILTER_TODAY="Today"
COM_FINDER_QUERY_OPERATOR_AND="And"
COM_FINDER_QUERY_OPERATOR_NOT="Not"
COM_FINDER_QUERY_OPERATOR_OR="Or"
COM_FINDER_SEARCH_FILTER_SEARCH_DESC="Search in filter title."
COM_FINDER_SEARCH_FILTER_SEARCH_LABEL="Search Filters"
COM_FINDER_SEARCH_LABEL="Search %s:"
COM_FINDER_SEARCH_SEARCH_QUERY_DESC="Search in content map title."
COM_FINDER_SEARCH_SEARCH_QUERY_LABEL="Search Content Maps"
COM_FINDER_SELECT_SEARCH_FILTER="Select filter"
COM_FINDER_STATISTICS="Statistics"
COM_FINDER_STATISTICS_LINK_TYPE_COUNT="Count"
COM_FINDER_STATISTICS_LINK_TYPE_HEADING="Link Type"
COM_FINDER_STATISTICS_LINK_TYPE_TOTAL="Total"
COM_FINDER_STATISTICS_STATS_DESCRIPTION="The indexed content on this site includes %s terms across %s links with %s attributes in %s branches."
COM_FINDER_STATISTICS_TITLE="Smart Search Statistics"
COM_FINDER_SUBMENU_FILTERS="Search Filters"
COM_FINDER_SUBMENU_INDEX="Indexed Content"
COM_FINDER_SUBMENU_MAPS="Content Maps"
COM_FINDER_UPDATER_MESSAGE_COMPLETE="Smart Search is up to date."
COM_FINDER_UPDATER_MESSAGE_OPTIMIZE="Smart Search is optimising."
COM_FINDER_UPDATER_MESSAGE_PROCESS="Smart Search is updating."
COM_FINDER_XML_DESCRIPTION="Smart Search."
language/en-GB/en-GB.plg_actionlog_akeebabackup.sys.ini000060400000000555152453623440016734 0ustar00;; @package   akeebabackup
;; @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
;; @license   GNU General Public License version 3, or later

PLG_ACTIONLOG_AKEEBABACKUP="Action Log - Akeeba Backup"
PLG_ACTIONLOG_AKEEBABACKUP_XML_DESCRIPTION="Automatically log user actions performed on Akeeba Backup component inside Joomla! User Actions Log"language/en-GB/en-GB.plg_fields_user.sys.ini000060400000000570152453623440014600 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_USER="Fields - User"
PLG_FIELDS_USER_XML_DESCRIPTION="This plugin lets you create new fields of type 'user' in any extensions where custom fields are supported."
language/en-GB/en-GB.plg_twofactorauth_totp.ini000060400000012053152453623440015416 0ustar00; Joomla! Project
; (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_TWOFACTORAUTH_TOTP="Two Factor Authentication - Google Authenticator"
PLG_TWOFACTORAUTH_TOTP_ERR_VALIDATIONFAILED="You did not enter a valid security code. Please check your Google Authenticator setup and make sure that the time on your device matches the time on the site."
PLG_TWOFACTORAUTH_TOTP_INTRO="This feature allows you to use Google Authenticator, or a compatible application such as FreeOTP, for two factor authentication. In addition to your username and password you will also need to provide a six digit security code to be able to login to this site. The security code is rotated every 30 seconds. This provides extra protection against hackers logging in to your account even if they were able to get hold of your password."
PLG_TWOFACTORAUTH_TOTP_METHOD_TITLE="Google Authenticator"
PLG_TWOFACTORAUTH_TOTP_POSTINSTALL_TITLE="Two Factor Authentication is Available"
PLG_TWOFACTORAUTH_TOTP_POSTINSTALL_BODY="<p>Joomla! comes with a built-in two factor authentication system. It secures your site login with a secondary secret code that's changing every 30 seconds. You can use your mobile device and the <a href="_QQ_"https://en.wikipedia.org/wiki/Google_Authenticator"_QQ_" target="_QQ_"_blank"_QQ_">Google Authenticator</a> app to produce that code.</p><p>By selecting the button below:</p><ul><li>Joomla! will enable the two factor authentication plugins</li><li>Two Factor Authentication is going to be available for all users.</li><li>Each user can configure Two Factor Authentication in User Details.</li><li>You can always disable Two Factor Authentication plugin, or configure it for Backend usage only.</li><li>You will be taken to your user profile page where you can find more information on two factor authentication and enable it for your user account.</li></ul>"
PLG_TWOFACTORAUTH_TOTP_POSTINSTALL_ACTION="Enable two factor authentication"
PLG_TWOFACTORAUTH_TOTP_SECTION_ADMIN="Administrator (Backend)"
PLG_TWOFACTORAUTH_TOTP_SECTION_BOTH="Both"
PLG_TWOFACTORAUTH_TOTP_SECTION_DESC="In which sections of your site do you want to enable two factor authentication?"
PLG_TWOFACTORAUTH_TOTP_SECTION_LABEL="Site Section"
PLG_TWOFACTORAUTH_TOTP_SECTION_SITE="Site (Frontend)"
PLG_TWOFACTORAUTH_TOTP_STEP1_HEAD="Step 1 - Get Google Authenticator"
PLG_TWOFACTORAUTH_TOTP_STEP1_ITEM1="Official Google Authenticator app for Android, iOS and BlackBerry"
; Check the URL and change the part hl=en to your language tag if this is available (example hl=de; hl=zh-cn; hl=zh-tw)
PLG_TWOFACTORAUTH_TOTP_STEP1_ITEM1_LINK="https://support.google.com/accounts/bin/answer.py?hl=en&answer=1066447"
PLG_TWOFACTORAUTH_TOTP_STEP1_ITEM2="Compatible clients for other devices and operating system (listed in Wikipedia)."
; Change and check this link if there is a translation in your language available. (current: German, Spanish, French, Japanese, Polish)
PLG_TWOFACTORAUTH_TOTP_STEP1_ITEM2_LINK="https://en.wikipedia.org/wiki/Google_Authenticator#Implementation"
PLG_TWOFACTORAUTH_TOTP_STEP1_TEXT="Download and install <a href="_QQ_"https://en.wikipedia.org/wiki/Google_Authenticator"_QQ_" target="_QQ_"_blank"_QQ_">Google Authenticator</a>, or a compatible application such as <a href="_QQ_"https://freeotp.github.io/"_QQ_" target="_QQ_"_blank"_QQ_">FreeOTP</a>, on your smartphone or desktop. Use one of the following:"
PLG_TWOFACTORAUTH_TOTP_STEP1_WARN="Please remember to sync your device's clock with a time-server. Time drift in your device may cause an inability to log in to your site."
PLG_TWOFACTORAUTH_TOTP_STEP2_ACCOUNT="Account"
PLG_TWOFACTORAUTH_TOTP_STEP2_ALTTEXT="Alternatively, you can scan the following QR code in Google Authenticator."
PLG_TWOFACTORAUTH_TOTP_STEP2_HEAD="Step 2 - Set up"
PLG_TWOFACTORAUTH_TOTP_STEP2_KEY="Key"
PLG_TWOFACTORAUTH_TOTP_STEP2_RESET="If you want to change the key, disable the two factor authentication. When you try enabling it again it will generate a new key."
PLG_TWOFACTORAUTH_TOTP_STEP2_TEXT="You will need to enter the following information to Google Authenticator or a compatible app."
PLG_TWOFACTORAUTH_TOTP_STEP3_HEAD="Step 3 - Activate Two Factor Authentication"
PLG_TWOFACTORAUTH_TOTP_STEP3_SECURITYCODE="Security Code"
PLG_TWOFACTORAUTH_TOTP_STEP3_TEXT="To verify that everything is set up properly, please enter the security code displayed in Google Authenticator in the field below. Afterwards, please save your user profile. If the code is correct, the Two Factor Authentication feature will be enabled."
PLG_TWOFACTORAUTH_TOTP_XML_DESCRIPTION="Allows users on your site to use two factor authentication using <a href="_QQ_"https://en.wikipedia.org/wiki/Google_Authenticator"_QQ_" target="_QQ_"_blank"_QQ_">Google Authenticator</a> or other compatible time-based One Time Password generators such as <a href="_QQ_"https://freeotp.github.io/"_QQ_" target="_QQ_"_blank"_QQ_">FreeOTP</a>. To use two factor authentication please edit the user profile and enable two factor authentication."
language/en-GB/en-GB.mod_login.sys.ini000060400000000564152453623440013404 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_LOGIN_XML_DESCRIPTION="This module displays a username and password login form. It can't be unpublished."
MOD_LOGIN="Login Form"
MOD_LOGIN_LAYOUT_DEFAULT="Default"

language/en-GB/en-GB.plg_privacy_user.sys.ini000060400000000554152453623440015011 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_PRIVACY_USER="Privacy - User Accounts"
PLG_PRIVACY_USER_XML_DESCRIPTION="Responsible for processing privacy related requests for the core Joomla user data."
language/en-GB/en-GB.plg_fields_integer.ini000060400000001772152453623440014447 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_INTEGER="Fields - Integer"
PLG_FIELDS_INTEGER_LABEL="Integer (%s)"
PLG_FIELDS_INTEGER_PARAMS_FIRST_DESC="This value is the lowest on the list."
PLG_FIELDS_INTEGER_PARAMS_FIRST_LABEL="First"
PLG_FIELDS_INTEGER_PARAMS_LAST_DESC="This value is the highest on the list."
PLG_FIELDS_INTEGER_PARAMS_LAST_LABEL="Last"
PLG_FIELDS_INTEGER_PARAMS_MULTIPLE_DESC="Allow multiple values to be selected."
PLG_FIELDS_INTEGER_PARAMS_MULTIPLE_LABEL="Multiple"
PLG_FIELDS_INTEGER_PARAMS_STEP_DESC="Each option will be the previous option incremented by this integer, starting with the first value until the last value is reached."
PLG_FIELDS_INTEGER_PARAMS_STEP_LABEL="Step"
PLG_FIELDS_INTEGER_XML_DESCRIPTION="This plugin lets you create new fields of type 'integer' in any extensions where custom fields are supported."
language/en-GB/en-GB.plg_installer_packageinstaller.ini000060400000002232152453623440017042 0ustar00; Joomla! Project
; (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_INSTALLER_PACKAGEINSTALLER_DRAG_FILE_HERE="Drag and drop file here to upload."
PLG_INSTALLER_PACKAGEINSTALLER_EXTENSION_PACKAGE_FILE="Extension package file"
PLG_INSTALLER_PACKAGEINSTALLER_INSTALLING="Installing ..."
PLG_INSTALLER_PACKAGEINSTALLER_NO_PACKAGE="Please select a package to upload"
PLG_INSTALLER_PACKAGEINSTALLER_PLUGIN_XML_DESCRIPTION="This plugin allows you to install packages from your local computer."
PLG_INSTALLER_PACKAGEINSTALLER_SELECT_FILE="Or browse for file"
PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_AND_INSTALL="Upload & Install"
PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_ERROR_EMPTY="Error: Server returns empty response."
PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_ERROR_UNKNOWN="Error: Unknown error or invalid JSON output."
PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_INSTALL_JOOMLA_EXTENSION="Upload & Install Joomla Extension"
PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_PACKAGE_FILE="Upload Package File"
PLG_INSTALLER_PACKAGEINSTALLER_UPLOADING="Uploading ..."
language/en-GB/en-GB.plg_content_vote.ini000060400000001214152453623440014162 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CONTENT_VOTE="Content - Vote"
PLG_VOTE_BOTTOM="Bottom"
PLG_VOTE_LABEL="Please Rate"
PLG_VOTE_POSITION_DESC="Set where the voting is displayed."
PLG_VOTE_POSITION_LABEL="Position"
PLG_VOTE_RATE="Rate"
PLG_VOTE_STAR_ACTIVE="Star Active"
PLG_VOTE_STAR_INACTIVE="Star Inactive"
PLG_VOTE_TOP="Top"
PLG_VOTE_USER_RATING="User Rating:&#160;%1$s&#160;/&#160;%2$s"
PLG_VOTE_VOTE="Vote %s"
PLG_VOTE_XML_DESCRIPTION="Add Voting functionality to Articles."
language/en-GB/en-GB.com_plugins.ini000060400000005370152453623440013137 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_PLUGINS="Plugins"
COM_PLUGINS_ADVANCED_FIELDSET_LABEL="Advanced"
COM_PLUGINS_BASIC_FIELDSET_LABEL="Basic"
COM_PLUGINS_CONFIGURATION="Plugin: Options"
COM_PLUGINS_ELEMENT_HEADING="Element"
COM_PLUGINS_ERROR_FILE_NOT_FOUND="The file %s could not be found."
COM_PLUGINS_FIELD_ELEMENT_DESC="Plugin main file name."
COM_PLUGINS_FIELD_ELEMENT_LABEL="Plugin File"
COM_PLUGINS_FIELD_ENABLED_DESC="The enabled status of this plugin."
COM_PLUGINS_FIELD_FOLDER_DESC="Category/folder of plugins this plugin belongs to."
COM_PLUGINS_FIELD_FOLDER_LABEL="Plugin Type"
COM_PLUGINS_FIELD_NAME_DESC="The name of the plugin as defined in its xml."
COM_PLUGINS_FIELD_NAME_LABEL="Plugin Name"
COM_PLUGINS_FILTER_SEARCH_LABEL="Search Plugins"
COM_PLUGINS_FOLDER_HEADING="Type"
COM_PLUGINS_HEADING_ELEMENT_ASC="Element ascending"
COM_PLUGINS_HEADING_ELEMENT_DESC="Element descending"
COM_PLUGINS_HEADING_FOLDER_ASC="Type ascending"
COM_PLUGINS_HEADING_FOLDER_DESC="Type descending"
COM_PLUGINS_MANAGER_PLUGIN="Plugins: %s"
COM_PLUGINS_MANAGER_PLUGINS="Plugins"
COM_PLUGINS_MSG_MANAGE_NO_PLUGINS="There are no plugins installed matching your query."
COM_PLUGINS_N_ITEMS_CHECKED_IN_0="No plugin checked in."
COM_PLUGINS_N_ITEMS_CHECKED_IN_1="%d plugin checked in."
COM_PLUGINS_N_ITEMS_CHECKED_IN_MORE="%d plugins checked in."
COM_PLUGINS_N_ITEMS_PUBLISHED="%d plugins enabled."
COM_PLUGINS_N_ITEMS_PUBLISHED_1="Plugin enabled."
COM_PLUGINS_N_ITEMS_UNPUBLISHED="%d plugins disabled."
COM_PLUGINS_N_ITEMS_UNPUBLISHED_1="Plugin disabled."
COM_PLUGINS_NAME_HEADING="Plugin Name"
COM_PLUGINS_NO_ITEM_SELECTED="No plugins selected."
COM_PLUGINS_OPTION_ELEMENT="- Select Element -"
COM_PLUGINS_OPTION_FOLDER="- Select Type -"
COM_PLUGINS_PLUGIN="Plugin"
COM_PLUGINS_PLUGINS="Plugins"
COM_PLUGINS_SAVE_SUCCESS="Plugin saved."
COM_PLUGINS_SEARCH_IN_TITLE="Search in plugin name. Prefix with ID: to search for a plugin ID."
COM_PLUGINS_XML_DESCRIPTION="This component manages Joomla plugins."
COM_PLUGINS_XML_ERR="Plugins XML data not available."
JLIB_HTML_PUBLISH_ITEM="Enable plugin"
JLIB_HTML_UNPUBLISH_ITEM="Disable plugin"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_PLUGINS="Changes apply to this component only.<br /><em><strong>Inherited</strong></em> - a Global Configuration setting or higher level setting is applied.<br /><em><strong>Denied</strong></em> always wins - whatever is set at the Global or higher level and applies to all child elements.<br /><em><strong>Allowed</strong></em> will enable the action for this component unless overruled by a Global Configuration setting."
language/en-GB/en-GB.mod_title.sys.ini000060400000000514152453623440013410 0ustar00; Joomla! Project
; (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_TITLE="Title"
MOD_TITLE_XML_DESCRIPTION="This module shows the Toolbar Component Title."
MOD_TITLE_LAYOUT_DEFAULT="Default"

language/en-GB/en-GB.plg_system_stats.sys.ini000060400000000770152453623440015040 0ustar00; Joomla! Project
; (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_STATS="System - Joomla! Statistics"
PLG_SYSTEM_STATS_XML_DESCRIPTION="System Plugin that sends environment statistics to a server controlled by the Joomla! project for statistical analysis. Statistics sent include PHP version, CMS version, Database type, Database version and Server type."
language/en-GB/en-GB.com_cache.sys.ini000060400000001005152453623440013325 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_CACHE="Cache"
COM_CACHE_CACHE_VIEW_DEFAULT_DESC="Maintenance: Clear Cache"
COM_CACHE_CACHE_VIEW_DEFAULT_TITLE="Clear Cache"
COM_CACHE_PURGE_VIEW_DEFAULT_DESC="Maintenance: Clear Expired Cache"
COM_CACHE_PURGE_VIEW_DEFAULT_TITLE="Clear Expired Cache"
COM_CACHE_XML_DESCRIPTION="Component for cache management."
language/en-GB/en-GB.plg_system_highlight.ini000060400000000510152453623440015024 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_HIGHLIGHT="System - Highlight"
PLG_SYSTEM_HIGHLIGHT_XML_DESCRIPTION="System plugin to highlight specified terms."
language/en-GB/en-GB.plg_fields_text.sys.ini000060400000000570152453623440014606 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_TEXT="Fields - Text"
PLG_FIELDS_TEXT_XML_DESCRIPTION="This plugin lets you create new fields of type 'text' in any extensions where custom fields are supported."
language/en-GB/en-GB.com_modules.sys.ini000060400000001404152453623440013735 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_MODULES="Modules"
COM_MODULES_ACTION_EDITFRONTEND="Frontend Editing"
COM_MODULES_ACTION_EDITFRONTEND_COMPONENT_DESC="Allows users in the group to edit in Frontend."
COM_MODULES_GENERAL="General"
COM_MODULES_MODULES_VIEW_DEFAULT_DESC="Shows a list of modules to manage"
COM_MODULES_MODULES_VIEW_DEFAULT_TITLE="Module Manager"
COM_MODULES_REDIRECT_EDIT_DESC="Select if module editing should be opened in the site or administration interface."
COM_MODULES_REDIRECT_EDIT_LABEL="Edit Module"
COM_MODULES_XML_DESCRIPTION="Component for module management on the Backend."
language/en-GB/en-GB.plg_system_redirect.sys.ini000060400000000602152453623440015475 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_REDIRECT="System - Redirect"
PLG_SYSTEM_REDIRECT_XML_DESCRIPTION="The system redirect plugin enables the Joomla Redirect system to catch missing pages and redirect users."
language/en-GB/en-GB.plg_search_contacts.ini000060400000000766152453623440014631 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SEARCH_CONTACTS="Search - Contacts"
PLG_SEARCH_CONTACTS_CONTACTS="Contacts"
PLG_SEARCH_CONTACTS_FIELD_SEARCHLIMIT_DESC="Number of search items to return."
PLG_SEARCH_CONTACTS_FIELD_SEARCHLIMIT_LABEL="Search Limit"
PLG_SEARCH_CONTACTS_XML_DESCRIPTION="Enables searching of the Contact Component."language/en-GB/en-GB.plg_search_categories.ini000060400000001006152453623440015124 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8


PLG_SEARCH_CATEGORIES_CATEGORIES="Categories"
PLG_SEARCH_CATEGORIES="Search - Categories"
PLG_SEARCH_CATEGORIES_FIELD_SEARCHLIMIT_DESC="Number of search items to return."
PLG_SEARCH_CATEGORIES_FIELD_SEARCHLIMIT_LABEL="Search Limit"
PLG_SEARCH_CATEGORIES_XML_DESCRIPTION="Enables searching of Category information."language/en-GB/en-GB.plg_system_sessiongc.ini000060400000003210152453623440015052 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_SESSIONGC="System - Session Data Purge"
PLG_SYSTEM_SESSIONGC_ENABLE_SESSION_GC_DESC="When enabled, this plugin will attempt to purge expired data based on the frequency calculated by the probability and divisor."
PLG_SYSTEM_SESSIONGC_ENABLE_SESSION_GC_LABEL="Enable Session Data Cleanup"
PLG_SYSTEM_SESSIONGC_ENABLE_SESSION_METADATA_GC_DESC="When enabled, this plugin will clean optional session metadata from the database. Note that this operation will not run when the database handler is in use as that data is cleared as part of the Session Data Cleanup operation."
PLG_SYSTEM_SESSIONGC_ENABLE_SESSION_METADATA_GC_LABEL="Enable Session Metadata Cleanup"
PLG_SYSTEM_SESSIONGC_GC_DIVISOR_DESC="In combination with the probability field, these two fields are used to determine the frequency of the session data cleanup operation being triggered on a request. The probability is calculated by using probability/divisor, e.g. 1/100 means there is a 1% chance that the process runs on each request."
PLG_SYSTEM_SESSIONGC_GC_DIVISOR_LABEL="Divisor"
PLG_SYSTEM_SESSIONGC_GC_PROBABILITY_DESC="In combination with the divisor field, these two fields are used to determine the frequency of the session data cleanup operation being triggered on a request."
PLG_SYSTEM_SESSIONGC_GC_PROBABILITY_LABEL="Probability"
PLG_SYSTEM_SESSIONGC_XML_DESCRIPTION="System Plugin that purges expired data and metadata depending on the session handler set in Global Configuration."
language/en-GB/en-GB.plg_content_fields.ini000060400000001371152453623440014457 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CONTENT_FIELDS="Content - Fields"
PLG_CONTENT_FIELDS_XML_DESCRIPTION="This plugin allows you to display a custom field which has been inserted with the 'Button - Fields' plugin or using Syntax: {field #} directly into the editor area.<br><strong>Possible Syntax:</strong><br><ul><li><code>{field 1}</code> will display the field with the ID 1</li><li><code>{field 1,foo}</code> will display the selected field using the alternative layout 'foo'.</li><li><code>{fieldgroup 2}</code> will display all fields within the fieldgroup with the ID 2.</li></ul>"
language/en-GB/en-GB.com_cpanel.sys.ini000060400000000657152453623440013540 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_CPANEL="Control Panel"
COM_CPANEL_XML_DESCRIPTION="Control Panel component."

COM_CPANEL_CPANEL_VIEW_DEFAULT_TITLE="Control Panel"
COM_CPANEL_CPANEL_VIEW_DEFAULT_TITLE_DESC="Shows the Joomla! Administration Dashboard page."
language/en-GB/en-GB.plg_quickicon_phpversioncheck.sys.ini000060400000000644152453623440017536 0ustar00; Joomla! Project
; (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_QUICKICON_PHPVERSIONCHECK="Quick Icon - PHP Version Check"
PLG_QUICKICON_PHPVERSIONCHECK_XML_DESCRIPTION="Checks the support status of your installation's PHP version and raises a warning if not fully supported."
language/en-GB/en-GB.plg_installer_urlinstaller.sys.ini000060400000000560152453623440017070 0ustar00; Joomla! Project
; (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_INSTALLER_URLINSTALLER_PLUGIN_XML_DESCRIPTION="This plugin allows you to install packages from a URL."
PLG_INSTALLER_URLINSTALLER="Installer - Install from URL"
language/en-GB/en-GB.plg_user_profile.ini000060400000006044152453623440014157 0ustar00; Joomla! Project
; (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_CONTENT_CHANGE_ARTICLE="Select or Change article"
COM_CONTENT_CHANGE_ARTICLE_BUTTON="Select/Change"
COM_CONTENT_SELECT_AN_ARTICLE="Select an Article"
PLG_USER_PROFILE="User - Profile"
PLG_USER_PROFILE_ERROR_INVALID_DOB="The date of birth you entered is invalid. Please enter a valid date."
PLG_USER_PROFILE_ERROR_INVALID_DOB_FUTURE_DATE="The date of birth you entered is in the future."
PLG_USER_PROFILE_FIELD_ABOUT_ME_DESC="Choose an option for the field About Me."
PLG_USER_PROFILE_FIELD_ABOUT_ME_LABEL="About Me"
PLG_USER_PROFILE_FIELD_ADDRESS1_DESC="Choose an option for the field Address1."
PLG_USER_PROFILE_FIELD_ADDRESS1_LABEL="Address 1"
PLG_USER_PROFILE_FIELD_ADDRESS2_DESC="Choose an option for the field Address2."
PLG_USER_PROFILE_FIELD_ADDRESS2_LABEL="Address 2"
PLG_USER_PROFILE_FIELD_CITY_DESC="Choose an option for the field City."
PLG_USER_PROFILE_FIELD_CITY_LABEL="City"
PLG_USER_PROFILE_FIELD_COUNTRY_DESC="Choose an option for the field Country."
PLG_USER_PROFILE_FIELD_COUNTRY_LABEL="Country"
PLG_USER_PROFILE_FIELD_DOB_DESC="Choose an option for the field Date of Birth."
PLG_USER_PROFILE_FIELD_DOB_LABEL="Date of Birth"
PLG_USER_PROFILE_FIELD_FAVORITE_BOOK_DESC="Choose an option for the field Favourite Book."
PLG_USER_PROFILE_FIELD_FAVORITE_BOOK_LABEL="Favourite Book"
PLG_USER_PROFILE_FIELD_NAME_PROFILE_REQUIRE_USER="User profile fields for profile edit form"
PLG_USER_PROFILE_FIELD_NAME_REGISTER_REQUIRE_USER="User profile fields for registration and administrator user forms"
PLG_USER_PROFILE_FIELD_PHONE_DESC="Choose an option for the field Phone."
PLG_USER_PROFILE_FIELD_PHONE_LABEL="Phone"
PLG_USER_PROFILE_FIELD_POSTAL_CODE_DESC="Choose an option for the field Postal/ZIP Code."
PLG_USER_PROFILE_FIELD_POSTAL_CODE_LABEL="Postal/ZIP Code"
PLG_USER_PROFILE_FIELD_REGION_DESC="Choose an option for the field Region."
PLG_USER_PROFILE_FIELD_REGION_LABEL="Region"
PLG_USER_PROFILE_FIELD_TOS_ARTICLE_DESC="Select the desired Terms of Service article from the list."
PLG_USER_PROFILE_FIELD_TOS_ARTICLE_LABEL="Select TOS Article"
PLG_USER_PROFILE_FIELD_TOS_DESC="Agree to terms of service."
PLG_USER_PROFILE_FIELD_TOS_DESC_SITE="Please read the Terms of Service. You will not be able to register if you do not agree with them."
PLG_USER_PROFILE_FIELD_TOS_LABEL="Terms of Service"
PLG_USER_PROFILE_FIELD_WEB_SITE_DESC="Choose an option for the field website."
PLG_USER_PROFILE_FIELD_WEB_SITE_LABEL="Website"
PLG_USER_PROFILE_FILL_FIELD_DESC_SITE="If required, please fill this field."
PLG_USER_PROFILE_OPTION_AGREE="I agree"
PLG_USER_PROFILE_OPTION_DO_NOT_AGREE="I do not agree"
PLG_USER_PROFILE_SLIDER_LABEL="User Profile"
; Adapt the following string to the format you entered in the 'DATE_FORMAT_CALENDAR_DATE'
PLG_USER_PROFILE_SPACER_DOB="The date of birth entered should use the format Year-Month-Day, ie 0000-00-00"
PLG_USER_PROFILE_XML_DESCRIPTION="User Profile Plugin"
language/en-GB/en-GB.plg_authentication_joomla.sys.ini000060400000000721152453623440016652 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_AUTH_JOOMLA_XML_DESCRIPTION="Handles Joomla's default User authentication.<br /><strong> Warning! You must have at least one authentication plugin enabled or you will lose all access to your site.</strong>"
PLG_AUTHENTICATION_JOOMLA="Authentication - Joomla"language/en-GB/en-GB.plg_system_actionlogs.sys.ini000060400000000563152453623440016044 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_ACTIONLOGS="System - User Actions Log"
PLG_SYSTEM_ACTIONLOGS_XML_DESCRIPTION="Records the actions of users on the site so they can be reviewed if required."
language/en-GB/en-GB.mod_latest.ini000060400000007601152453623440012752 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_LATEST="Articles - Latest"
MOD_LATEST_CREATED="Created"
MOD_LATEST_CREATED_BY="Created By"
MOD_LATEST_FIELD_AUTHORS_DESC="A filter for the authors."
MOD_LATEST_FIELD_AUTHORS_LABEL="Authors"
MOD_LATEST_FIELD_CATEGORY_DESC="Select Articles from a specific Category or all Categories."
MOD_LATEST_FIELD_COUNT_DESC="The number of items to display (default 5)."
MOD_LATEST_FIELD_COUNT_LABEL="Count"
MOD_LATEST_FIELD_ORDERING_DESC="Ordering options."
MOD_LATEST_FIELD_ORDERING_LABEL="Order"
MOD_LATEST_FIELD_VALUE_AUTHORS_ANYONE="Anyone"
MOD_LATEST_FIELD_VALUE_AUTHORS_BY_ME="Added or modified by me"
MOD_LATEST_FIELD_VALUE_AUTHORS_NOT_BY_ME="Not added or modified by me"
MOD_LATEST_FIELD_VALUE_ORDERING_ADDED="Recently Added First"
MOD_LATEST_FIELD_VALUE_ORDERING_MODIFIED="Recently Modified First"
MOD_LATEST_LATEST_ITEMS="Latest Items"
MOD_LATEST_NO_MATCHING_RESULTS="No Matching Results"
MOD_LATEST_TITLE="Recently Created Articles"
MOD_LATEST_TITLE_CREATED="Last Added Articles"
MOD_LATEST_TITLE_CREATED_1="Last Added Article"
MOD_LATEST_TITLE_CREATED_MORE="Last %1$s Added Articles"
MOD_LATEST_TITLE_CREATED_NOT_ME="Last Added Articles Not By Me"
MOD_LATEST_TITLE_CREATED_NOT_ME_1="Last Added Article Not By Me"
MOD_LATEST_TITLE_CREATED_NOT_ME_MORE="Last %1$s Added Articles Not By Me"
MOD_LATEST_TITLE_CREATED_BY_ME="Last Added Articles By Me"
MOD_LATEST_TITLE_CREATED_BY_ME_1="Last Added Article By Me"
MOD_LATEST_TITLE_CREATED_BY_ME_MORE="Last %1$s Added Articles By Me"
MOD_LATEST_TITLE_CREATED_CATEGORY="Last Added Articles (%2$s category)"
MOD_LATEST_TITLE_CREATED_CATEGORY_1="Last Added Article (%2$s category)"
MOD_LATEST_TITLE_CREATED_CATEGORY_MORE="Last %1$s Added Articles (%2$s category)"
MOD_LATEST_TITLE_CREATED_CATEGORY_BY_ME="Last Added Articles By Me (%2$s category)"
MOD_LATEST_TITLE_CREATED_CATEGORY_BY_ME_1="Last Added Article By Me (%2$s category)"
MOD_LATEST_TITLE_CREATED_CATEGORY_BY_ME_MORE="Last %1$s Added Articles By Me (%2$s category)"
MOD_LATEST_TITLE_CREATED_CATEGORY_NOT_ME="Last Added Articles Not By Me (%2$s category)"
MOD_LATEST_TITLE_CREATED_CATEGORY_NOT_ME_1="Last Added Article Not By Me (%2$s category)"
MOD_LATEST_TITLE_CREATED_CATEGORY_NOT_ME_MORE="Last %1$s Added Articles Not By Me (%2$s category)"
MOD_LATEST_TITLE_MODIFIED="Last Modified Articles"
MOD_LATEST_TITLE_MODIFIED_1="Last Modified Article"
MOD_LATEST_TITLE_MODIFIED_MORE="Last %1$s Modified Articles"
MOD_LATEST_TITLE_MODIFIED_BY_ME="Last Modified Articles By Me"
MOD_LATEST_TITLE_MODIFIED_BY_ME_1="Last Modified Article By Me"
MOD_LATEST_TITLE_MODIFIED_BY_ME_MORE="Last %1$s Modified Articles By Me"
MOD_LATEST_TITLE_MODIFIED_NOT_ME="Last Modified Articles Not By Me"
MOD_LATEST_TITLE_MODIFIED_NOT_ME_1="Last Modified Article Not By Me"
MOD_LATEST_TITLE_MODIFIED_NOT_ME_MORE="Last %1$s Modified Articles Not By Me"
MOD_LATEST_TITLE_MODIFIED_CATEGORY="Last Modified Articles (%2$s category)"
MOD_LATEST_TITLE_MODIFIED_CATEGORY_1="Last Modified Article (%2$s category)"
MOD_LATEST_TITLE_MODIFIED_CATEGORY_MORE="Last %1$s Modified Articles (%2$s category)"
MOD_LATEST_TITLE_MODIFIED_CATEGORY_BY_ME="Last Modified Articles By Me (%2$s category)"
MOD_LATEST_TITLE_MODIFIED_CATEGORY_BY_ME_1="Last Modified Article By Me (%2$s category)"
MOD_LATEST_TITLE_MODIFIED_CATEGORY_BY_ME_MORE="Last %1$s Modified Articles By Me (%2$s category)"
MOD_LATEST_TITLE_MODIFIED_CATEGORY_NOT_ME="Last Modified Articles Not By Me (%2$s category)"
MOD_LATEST_TITLE_MODIFIED_CATEGORY_NOT_ME_1="Last Modified Article Not By Me (%2$s category)"
MOD_LATEST_TITLE_MODIFIED_CATEGORY_NOT_ME_MORE="Last %1$s Modified Articles Not By Me (%2$s category)"
MOD_LATEST_UNEXISTING="<i>Non existent</i>"
MOD_LATEST_XML_DESCRIPTION="This module shows a list of the most recently created Articles."
language/en-GB/en-GB.com_search.sys.ini000060400000000717152453623440013540 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_SEARCH="Search"
COM_SEARCH_SEARCH_VIEW_DEFAULT_DESC="Display search results."
COM_SEARCH_SEARCH_VIEW_DEFAULT_OPTION="Default"
COM_SEARCH_SEARCH_VIEW_DEFAULT_TITLE="Search Form or Search Results"
COM_SEARCH_XML_DESCRIPTION="Component for search functions."
language/en-GB/en-GB.plg_system_remember.ini000060400000000607152453623440014662 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_REMEMBER_XML_DESCRIPTION="Provides remember me functionality. The cookie authentication plugin must be enabled for this plugin to function."
PLG_SYSTEM_REMEMBER="System - Remember Me"
language/en-GB/en-GB.plg_finder_newsfeeds.ini000060400000000674152453623440014776 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FINDER_NEWSFEEDS="Smart Search - News Feeds"
PLG_FINDER_NEWSFEEDS_XML_DESCRIPTION="This plugin indexes Joomla! News feeds."

PLG_FINDER_QUERY_FILTER_BRANCH_P_NEWS_FEED="News feeds"
PLG_FINDER_QUERY_FILTER_BRANCH_S_NEWS_FEED="News feed"

language/en-GB/en-GB.plg_fields_editor.sys.ini000060400000000600152453623440015102 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_EDITOR="Fields - Editor"
PLG_FIELDS_EDITOR_XML_DESCRIPTION="This plugin lets you create new fields of type 'editor' in any extensions where custom fields are supported."
language/en-GB/en-GB.mod_toolbar.sys.ini000060400000000604152453623440013731 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_TOOLBAR="Toolbar"
MOD_TOOLBAR_XML_DESCRIPTION="This module shows the toolbar icons used to control actions throughout the Administrator area."
MOD_TOOLBAR_LAYOUT_DEFAULT="Default"

language/en-GB/en-GB.tpl_hathor.ini000060400000005042152453623440012760 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

HATHOR="Hathor Administrator template"
TPL_HATHOR_ALTERNATE_MENU_DESC="Use the alternative menu which integrates mouse and keyboard. JavaScript Required. The regular menu for Hathor is accessible with or without JavaScript, but leaves the mouse and keyboard independent."
TPL_HATHOR_ALTERNATE_MENU_LABEL="Alternative Menu"
TPL_HATHOR_BOLD_TEXT_DESC="Use bold text."
TPL_HATHOR_BOLD_TEXT_LABEL="Bold Text"
TPL_HATHOR_CHANGED_DEFAULT_TEMPLATE_TO_ISIS="We have set the default administrator template style to '%s'"
TPL_HATHOR_CHECKMARK_ALL="Checkmark All"
TPL_HATHOR_COLOUR_CHOICE_BLUE="Blue"
TPL_HATHOR_COLOUR_CHOICE_DESC="Select the colour palette to use with the template. You can use this option to select a high contrast version or use it to create custom branding."
TPL_HATHOR_COLOUR_CHOICE_LABEL="Select Colour"
TPL_HATHOR_COLOUR_CHOICE_STANDARD="Standard"
TPL_HATHOR_COLOUR_CHOICE_HIGH_CONTRAST="High Contrast"
TPL_HATHOR_COLOUR_CHOICE_BROWN="Brown"
TPL_HATHOR_COM_MENUS_MENU="Menu"
TPL_HATHOR_COM_MODULES_CUSTOM_POSITION_LABEL="Select"
TPL_HATHOR_CPANEL_LINK_TEXT="Return to Control Panel"
TPL_HATHOR_GO="Go"
TPL_HATHOR_LOGO_DESC="Select or upload a custom logo for the administrator template."
TPL_HATHOR_LOGO_LABEL="Logo"
TPL_HATHOR_MAIN_MENU="Main Menu"
TPL_HATHOR_MESSAGE_POSTINSTALL_TITLE="Information about the Hathor administrator template"
TPL_HATHOR_MESSAGE_POSTINSTALL_BODY="The Hathor administrator template style is set as your personal or global default administrator template. Please note - any new features for Joomla will only be available with the Isis template. We recommend that you switch your default backend template style to Isis. You can do this by selecting the button below. This will only change the default setting for the administrator template, if you have access to it, as well as your personal default style, if necessary. It does not change the frontend template or any other user's settings."
TPL_HATHOR_MESSAGE_POSTINSTALL_ACTION="Set the default administrator template style to Isis"
TPL_HATHOR_SHOW_SITE_NAME_DESC="Show the site name in the template header."
TPL_HATHOR_SHOW_SITE_NAME_LABEL="Show Site Name"
TPL_HATHOR_SKIP_TO_MAIN_CONTENT="Skip to Main Content"
TPL_HATHOR_SUB_MENU="Sub Menu"
TPL_HATHOR_XML_DESCRIPTION="Hathor is an accessible Administrator template for Joomla! The Colour CSS files can also be used for custom colour branding."
language/en-GB/en-GB.plg_search_newsfeeds.sys.ini000060400000000477152453623440015612 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SEARCH_NEWSFEEDS="Search - News Feeds"
PLG_SEARCH_NEWSFEEDS_XML_DESCRIPTION="Enables searching of news feeds."

language/en-GB/en-GB.com_newsfeeds.ini000060400000024260152453623440013440 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_NEWSFEEDS="News Feeds"
; COM_NEWSFEEDS_BATCH_MENU_LABEL is deprecated, use JLIB_HTML_BATCH_MENU_LABEL instead.
COM_NEWSFEEDS_BATCH_MENU_LABEL="To Move or Copy your selection please select a Category."
COM_NEWSFEEDS_BATCH_OPTIONS="Batch process the selected news feeds"
COM_NEWSFEEDS_BATCH_TIP="If a category is selected for move/copy, any actions selected will be applied to the copied or moved news feeds. Otherwise, all actions are applied to the selected news feeds."
COM_NEWSFEEDS_CACHE_TIME_HEADING="Cache Time"
COM_NEWSFEEDS_CACHE_TIME_HEADING_ASC="Cache Time ascending"
COM_NEWSFEEDS_CACHE_TIME_HEADING_DESC="Cache Time descending"
COM_NEWSFEEDS_CATEGORIES_DESC="These settings apply for News Feeds Categories Options unless they are changed for a specific menu item."
COM_NEWSFEEDS_CHANGE_FEED="Select or Change News Feed"
; COM_NEWSFEEDS_CHANGE_FEED_BUTTON is deprecated, use COM_NEWSFEEDS_CHANGE_FEED instead;
COM_NEWSFEEDS_CHANGE_FEED_BUTTON="Select Feed"
COM_NEWSFEEDS_CONFIG_INTEGRATION_SETTINGS_DESC="These settings determine how the Newsfeeds Component will integrate with other extensions."
COM_NEWSFEEDS_CONFIGURATION="News Feed: Options"
COM_NEWSFEEDS_EDIT_NEWSFEED="Edit News Feed"
COM_NEWSFEEDS_ERROR_UNIQUE_ALIAS="Another News feed from this category has the same alias (remember it may be a trashed item)."
COM_NEWSFEEDS_ERROR_ALL_LANGUAGE_ASSOCIATED="A news feed item set to All languages can't be associated. Associations have not been set."
COM_NEWSFEEDS_FEED_CATEGORY_OPTIONS_LABEL="Feeds Category Display Options"
COM_NEWSFEEDS_FIELD_CACHETIME_DESC="The number of minutes before the news feed cache is refreshed."
COM_NEWSFEEDS_FIELD_CACHETIME_LABEL="Cache Time"
COM_NEWSFEEDS_FIELD_CATEGORIES_OPTIONS_LABEL="Feeds Categories Display Options"
COM_NEWSFEEDS_FIELD_CATEGORY_DESC="The category that this feed is assigned to."
COM_NEWSFEEDS_FIELD_CHARACTER_COUNT_DESC="Number of characters to display per feed. 0 will show all the text."
COM_NEWSFEEDS_FIELD_CHARACTER_COUNT_LABEL="Characters Count"
COM_NEWSFEEDS_FIELD_CHARACTERS_COUNT_DESC="Number of characters to include in the feed. 0 will show all the text."
COM_NEWSFEEDS_FIELD_CHARACTERS_COUNT_LABEL="Characters Count"
COM_NEWSFEEDS_FIELD_CONFIG_CATEGORY_SETTINGS_DESC="These settings apply for News Feeds Category Options unless they are changed for a specific menu item."
COM_NEWSFEEDS_FIELD_CONFIG_LIST_SETTINGS_DESC="These settings apply for List Layout Options unless they are changed for a specific menu item."
COM_NEWSFEEDS_FIELD_CONFIG_NEWSFEED_SETTINGS_DESC="These settings apply for single news feeds unless they are changed for a specific menu item or news feed."
COM_NEWSFEEDS_FIELD_CONFIG_NEWSFEED_SETTINGS_LABEL="News Feed"
COM_NEWSFEEDS_FIELD_DESCRIPTION_DESC="Enter a description for the feed."
COM_NEWSFEEDS_FIELD_FEED_DISPLAY_ORDER_DESC="The order used to display the feed."
COM_NEWSFEEDS_FIELD_FEED_DISPLAY_ORDER_LABEL="Feed Display Order"
COM_NEWSFEEDS_FIELD_FEED_OPTIONS_DESC="Feeds display options."
COM_NEWSFEEDS_FIELD_FEED_OPTIONS_LABEL="Feeds Display Options"
COM_NEWSFEEDS_FIELD_FIRST_DESC="Select or upload the image to be displayed."
COM_NEWSFEEDS_FIELD_FIRST_LABEL="First Image"
COM_NEWSFEEDS_FIELD_IMAGE_ALT_DESC="Alternative text used for visitors without access to images. Replaced with caption text if it is present."
COM_NEWSFEEDS_FIELD_IMAGE_ALT_LABEL="Alt Text"
COM_NEWSFEEDS_FIELD_IMAGE_CAPTION_DESC="Caption attached to the image."
COM_NEWSFEEDS_FIELD_IMAGE_CAPTION_LABEL="Caption"
COM_NEWSFEEDS_FIELD_LANGUAGE_DESC="Assign a language to this news feed."
COM_NEWSFEEDS_FIELD_LINK_DESC="Link to the news feed. IDN (International) Links are converted to punycode when they are saved."
COM_NEWSFEEDS_FIELD_LINK_LABEL="Link"
COM_NEWSFEEDS_FIELD_MODIFIED_BY_DESC="Name of the user who modified this news feed."
COM_NEWSFEEDS_FIELD_MODIFIED_DESC="The date and time the news feed was last modified."
COM_NEWSFEEDS_FIELD_NUM_ARTICLES_COLUMN_DESC="Show or hide the Number of Articles in each Feed (You can set this value in each News feed)."
COM_NEWSFEEDS_FIELD_NUM_ARTICLES_COLUMN_LABEL="# Articles"
COM_NEWSFEEDS_FIELD_NUM_ARTICLES_DESC="Number of articles from the feed to display."
COM_NEWSFEEDS_FIELD_NUM_ARTICLES_LABEL="Number of Articles"
COM_NEWSFEEDS_FIELD_NUMBER_ITEMS_LIST_DESC="Default number of feeds to list on a page."
COM_NEWSFEEDS_FIELD_NUMBER_ITEMS_LIST_LABEL="# Feeds to List"
COM_NEWSFEEDS_FIELD_NUMFEEDS_DESC="Number of feeds to display."
COM_NEWSFEEDS_FIELD_NUMFEEDS_LABEL="Number of Feeds"
COM_NEWSFEEDS_FIELD_OPTIONS="Feed"
COM_NEWSFEEDS_FIELD_RTL_DESC="Select the language direction of the feed."
COM_NEWSFEEDS_FIELD_RTL_LABEL="Language Direction"
COM_NEWSFEEDS_FIELD_SECOND_DESC="Select or upload the second image to be displayed."
COM_NEWSFEEDS_FIELD_SECOND_LABEL="Second Image"
COM_NEWSFEEDS_FIELD_SELECT_CATEGORY_DESC="Choose a feed category to display."
COM_NEWSFEEDS_FIELD_SELECT_FEED_DESC="Select a feed to display."
COM_NEWSFEEDS_FIELD_SELECT_FEED_LABEL="Feed"
COM_NEWSFEEDS_FIELD_SHOW_CAT_ITEMS_DESC="Show or hide the number of news feeds in category."
COM_NEWSFEEDS_FIELD_SHOW_CAT_ITEMS_LABEL="# Feeds in Category"
COM_NEWSFEEDS_FIELD_SHOW_CAT_TAGS_DESC="Show the tags for a category."
COM_NEWSFEEDS_FIELD_SHOW_CAT_TAGS_LABEL="Show Tags"
COM_NEWSFEEDS_FIELD_SHOW_FEED_DESCRIPTION_DESC="Show or hide feed description."
COM_NEWSFEEDS_FIELD_SHOW_FEED_DESCRIPTION_LABEL="Feed Description"
COM_NEWSFEEDS_FIELD_SHOW_FEED_IMAGE_DESC="Show or hide feed images."
COM_NEWSFEEDS_FIELD_SHOW_FEED_IMAGE_LABEL="Feed Image"
COM_NEWSFEEDS_FIELD_SHOW_ITEM_DESCRIPTION_DESC="Show or hide feed content."
COM_NEWSFEEDS_FIELD_SHOW_ITEM_DESCRIPTION_LABEL="Feed Content"
COM_NEWSFEEDS_FIELD_SHOW_LINKS_DESC="Show or hide feed links URL."
COM_NEWSFEEDS_FIELD_SHOW_LINKS_LABEL="Feed Links"
COM_NEWSFEEDS_FIELD_SHOW_TAGS_DESC="Show the tags for a news feed."
COM_NEWSFEEDS_FIELD_SHOW_TAGS_LABEL="Show Tags"
COM_NEWSFEEDS_FIELD_VALUE_LTR="Left to Right Direction"
COM_NEWSFEEDS_FIELD_VALUE_NONE="None"
COM_NEWSFEEDS_FIELD_VALUE_RTL="Right to Left Direction"
COM_NEWSFEEDS_FIELD_VALUE_SITE="Site Language Direction"
COM_NEWSFEEDS_FIELD_VERSION_LABEL="Revision"
COM_NEWSFEEDS_FIELD_VERSION_DESC="A count of the number of times this news feed has been revised."
COM_NEWSFEEDS_FIELDSET_IMAGES="Images"
COM_NEWSFEEDS_FIELDSET_MORE_OPTIONS_LABEL="Feed Display Options"
COM_NEWSFEEDS_FILTER_SEARCH_DESC="Search in news feed title and alias. Prefix with ID: to search for a news feed ID."
COM_NEWSFEEDS_FILTER_SEARCH_LABEL="Search News Feeds"
COM_NEWSFEEDS_FLOAT_DESC="Controls placement of the image."
COM_NEWSFEEDS_FLOAT_FIRST_LABEL="First Image Float"
COM_NEWSFEEDS_FLOAT_LABEL="Image Float"
COM_NEWSFEEDS_FLOAT_SECOND_LABEL="Second Image Float"
COM_NEWSFEEDS_HEADING_ASSOCIATION="Association"
COM_NEWSFEEDS_HITS_DESC="Number of hits for this news feed."
; The following 2 strings are deprecated and will be removed with 4.0.
COM_NEWSFEEDS_ITEM_ASSOCIATIONS_FIELDSET_LABEL="News Feed Item Association"
COM_NEWSFEEDS_ITEM_ASSOCIATIONS_FIELDSET_DESC="Multilingual only! This choice will only display if the Language Filter parameter 'Item Associations' is set to 'Yes'. Choose a news feed item for the target language. This association will let the Language Switcher module redirect to the associated news feed item in another language. If used, make sure to display the Language switcher module on the relevant pages. A news feed item set to language 'All' can't be associated."
COM_NEWSFEEDS_LEFT="Left"
COM_NEWSFEEDS_MANAGER_NEWSFEED="News Feeds: New/Edit"
COM_NEWSFEEDS_MANAGER_NEWSFEED_NEW="News Feeds: New"
COM_NEWSFEEDS_MANAGER_NEWSFEED_EDIT="News Feeds: Edit"
COM_NEWSFEEDS_MANAGER_NEWSFEEDS="News Feeds"
COM_NEWSFEEDS_N_ITEMS_ARCHIVED="%d news feeds archived."
COM_NEWSFEEDS_N_ITEMS_ARCHIVED_1="News feed archived."
COM_NEWSFEEDS_N_ITEMS_CHECKED_IN_0="No news feed checked in."
COM_NEWSFEEDS_N_ITEMS_CHECKED_IN_1="News feed checked in."
COM_NEWSFEEDS_N_ITEMS_CHECKED_IN_MORE="%d news feeds checked in."
COM_NEWSFEEDS_N_ITEMS_DELETED="%d news feeds deleted."
COM_NEWSFEEDS_N_ITEMS_DELETED_1="News feed deleted."
COM_NEWSFEEDS_N_ITEMS_PUBLISHED="%d news feeds published."
COM_NEWSFEEDS_N_ITEMS_PUBLISHED_1="News feed published."
COM_NEWSFEEDS_N_ITEMS_TRASHED="%d news feeds trashed."
COM_NEWSFEEDS_N_ITEMS_TRASHED_1="News feed trashed."
COM_NEWSFEEDS_N_ITEMS_UNPUBLISHED="%d news feeds unpublished."
COM_NEWSFEEDS_N_ITEMS_UNPUBLISHED_1="News feed unpublished."
COM_NEWSFEEDS_NEW_NEWSFEED="New News Feed"
COM_NEWSFEEDS_NEWSFEEDS="Newsfeeds"
COM_NEWSFEEDS_NO_ITEM_SELECTED="No news feeds selected."
COM_NEWSFEEDS_NONE="None"
COM_NEWSFEEDS_NUM_ARTICLES_HEADING="# Articles"
COM_NEWSFEEDS_NUM_ARTICLES_HEADING_ASC="# Articles ascending"
COM_NEWSFEEDS_NUM_ARTICLES_HEADING_DESC="# Articles descending"
COM_NEWSFEEDS_PUBLISH_ITEM="Publish News Feed"
COM_NEWSFEEDS_RIGHT="Right"
COM_NEWSFEEDS_SAVE_SUCCESS="News feed saved."
COM_NEWSFEEDS_SEARCH_IN_TITLE="Search"
COM_NEWSFEEDS_SELECT_A_FEED="Select a News Feed"
COM_NEWSFEEDS_SELECT_FEED="Select feed"
COM_NEWSFEEDS_SHOW_EMPTY_CATEGORIES_DESC="If Show, empty categories will display. A category is only empty if it has no news feeds or subcategories."
COM_NEWSFEEDS_SUBMENU_CATEGORIES="Categories"
COM_NEWSFEEDS_SUBMENU_NEWSFEEDS="News Feeds"
COM_NEWSFEEDS_TIP_ASSOCIATION="Associated news feeds"
COM_NEWSFEEDS_UNPUBLISH_ITEM="Unpublish News Feed"
COM_NEWSFEEDS_WARNING_PROVIDE_VALID_NAME="Please provide a valid name."
COM_NEWSFEEDS_XML_DESCRIPTION="This component manages RSS and Atom news feeds."
JGLOBAL_NEWITEMSLAST_DESC="New news feeds default to the last position. The ordering can be changed after this news feed has been saved."

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_NEWSFEEDS="Changes apply to this component only.<br /><em><strong>Inherited</strong></em> - a Global Configuration setting or higher level setting is applied.<br /><em><strong>Denied</strong></em> always wins - whatever is set at the Global or higher level and applies to all child elements.<br /><em><strong>Allowed</strong></em> will enable the action for this component unless overruled by a Global Configuration setting."
language/en-GB/en-GB.com_joomlaupdate.sys.ini000060400000001005152453623440014746 0ustar00; Joomla! Project
; (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_JOOMLAUPDATE="Joomla! Update"
COM_JOOMLAUPDATE_XML_DESCRIPTION="One-click update to the latest Joomla release."

COM_JOOMLAUPDATE_DEFAULT_VIEW_DEFAULT_DESC="Check for Joomla! updates and update your website with the latest available release."
COM_JOOMLAUPDATE_DEFAULT_VIEW_DEFAULT_TITLE="View Joomla! Updates"
language/en-GB/en-GB.plg_fields_image.ini000060400000000640152453623440014065 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_IMAGE="Fields - Image"
PLG_FIELDS_IMAGE_LABEL="Image (%s)"
PLG_FIELDS_IMAGE_XML_DESCRIPTION="This plugin lets you create new fields of type 'image' in any extensions where custom fields are supported."
language/en-GB/en-GB.plg_installer_folderinstaller.sys.ini000060400000000574152453623440017546 0ustar00; Joomla! Project
; (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_INSTALLER_FOLDERINSTALLER="Installer - Install from Folder"
PLG_INSTALLER_FOLDERINSTALLER_PLUGIN_XML_DESCRIPTION="This plugin allows you to install packages from a folder."
language/en-GB/en-GB.plg_fields_url.sys.ini000060400000000564152453623440014427 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_URL="Fields - URL"
PLG_FIELDS_URL_XML_DESCRIPTION="This plugin lets you create new fields of type 'URL' in any extensions where custom fields are supported."
language/en-GB/en-GB.com_akeeba.sys.ini000060400000006627152453623440013511 0ustar00;; @package   akeebabackup
;; @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
;; @license   GNU General Public License version 3, or later

; For the default menu item
COM_AKEEBA="Akeeba Backup"

; For the admin menu manager which uses the name attribute of the XML manifest
AKEEBA="Akeeba Backup"

;; Language keys for custom form Fields
;; ================================================================================

COM_AKEEBA_FORMFIELD_BACKUPPROFILES_NONE="(None)"

;; Menu items for Joomla! 3.7
;; ================================================================================

COM_AKEEBA_VIEW_CPANEL_TITLE="Control Panel"
COM_AKEEBA_VIEW_CPANEL_DESC="The main page of Akeeba Backup which lets you configure, take, manage and restore backups."

COM_AKEEBA_VIEW_BACKUP_TITLE="Backup"
COM_AKEEBA_VIEW_BACKUP_DESC="Take a backup"
COM_AKEEBA_VIEW_BACKUP_PROFILE_LABEL="Force backup profile"
COM_AKEEBA_VIEW_BACKUP_PROFILE_DESC="Select the backup profile to switch to before taking a backup. Choose '(None)' to use the current backup profile, whatever it is."
COM_AKEEBA_VIEW_BACKUP_AUTOSTART_LABEL="Start immediately"
COM_AKEEBA_VIEW_BACKUP_AUTOSTART_DESC="Should the backup start immediately? If it does the user will not have the chance to enter a backup description and comments."
COM_AKEEBA_VIEW_BACKUP_HIDETOOLBAR_LABEL="Hide toolbar"
COM_AKEEBA_VIEW_BACKUP_HIDETOOLBAR_DESC="Should the toolbar with the Help and Control Panel buttons be hidden?"
COM_AKEEBA_VIEW_BACKUP_RETURNURL_LABEL="Return URL"
COM_AKEEBA_VIEW_BACKUP_RETURNURL_DESC="Enter an internal URL to return to after the backup is complete. For example: enter <code>index.php</code> to return to Joomla's control panel or <code>index.php%3Foption%26com_akeeba</code> to return to Akeeba Backup's control panel. <br/> <strong>WARNING</strong> Due to the way the Joomla! menu manager works the URL you enter MUST be URL-encoded. You can do that by saving the menu item <em>twice in a row</em>. This is a known bug / missing feature in Joomla! itself."

COM_AKEEBA_VIEW_CONFIGURATION_TITLE="Configuration"
COM_AKEEBA_VIEW_CONFIGURATION_DESC="Configure the currently active backup profile."

COM_AKEEBA_VIEW_MANAGE_TITLE="Manage Backups"
COM_AKEEBA_VIEW_MANAGE_DESC="Manage backup attempts, including choosing to restore any older backup."

COM_AKEEBA_VIEW_RESTORE_TITLE="Restore Latest Backup"
COM_AKEEBA_VIEW_RESTORE_DESC="Restore the latest backup taken with a specific backup profile. Please read the documentation."
COM_AKEEBA_VIEW_RESTORE_PROFILE_LABEL="Backup Profile"
COM_AKEEBA_VIEW_RESTORE_PROFILE_DESC="Restore the latest backup taken with this backup profile. <strong>IMPORTANT!</strong> It will only look for the latest backup taken with this profile. The backup archive MUST exist on your server. If you have deleted it, or if it's stored remotely, you will get an error. Restoring remotely stored backups requires you to go to Manage Backups first and fetch them back to your server."

COM_AKEEBA_VIEW_TRANSFER_TITLE="Transfer Site Wizard"
COM_AKEEBA_VIEW_TRANSFER_DESC="Lets you restore the latest backup to a different location / server. <strong>IMPORTANT!</strong> It will only look for the latest backup taken. The backup archive MUST exist on your server. If you have deleted it, or if it's stored remotely, you will be told to take a new backup. Transferring remotely stored backups requires you to go to Manage Backups first and fetch them back to your server."language/en-GB/en-GB.plg_search_contacts.sys.ini000060400000000504152453623440015434 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SEARCH_CONTACTS="Search - Contacts"
PLG_SEARCH_CONTACTS_XML_DESCRIPTION="Enables searching of the Contact Component."language/en-GB/en-GB.plg_editors_tinymce.ini000060400000027022152453623440014661 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS_TINYMCE="Editor - TinyMCE"
PLG_TINY_BUTTON_TOGGLE_EDITOR="Toggle editor"
PLG_TINY_CONFIG_TEXTFILTER_ACL_DESC="If on, the text filter from the Joomla Global Configuration for every user group is applied. <br />If off, the filters as defined here are used for all user groups."
PLG_TINY_CONFIG_TEXTFILTER_ACL_LABEL="Use Joomla Text Filter"
PLG_TINY_ERR_CUSTOMCSSFILENOTPRESENT="The file name %s was entered in the TinyMCE Custom CSS field. This file could not be found in the default template folder. No styles are available."
PLG_TINY_ERR_EDITORCSSFILENOTPRESENT="Could not find the file 'editor.css' in the template or templates/system folder. No styles are available."
PLG_TINY_ERR_UNSUPPORTEDBROWSER="Drag and drop image upload is not available for your browser. Please consider using a fully HTML5 compatible browser."
PLG_TINY_FIELD_ADVIMAGE_DESC="Turn on/off a more advanced image dialog."
PLG_TINY_FIELD_ADVIMAGE_LABEL="Advanced Image"
PLG_TINY_FIELD_ADVLIST_DESC="Turn on/off to enable to set number formats and bullet types in ordered and unordered lists."
PLG_TINY_FIELD_ADVLIST_LABEL="Advanced List"
PLG_TINY_FIELD_ALIGN_DESC="Turn on/off to enable the alignment of the text."
PLG_TINY_FIELD_ALIGN_LABEL="Text Alignment"
PLG_TINY_FIELD_BLOCKQUOTE_DESC="Turn on/off blockquotes."
PLG_TINY_FIELD_BLOCKQUOTE_LABEL="Blockquote"
PLG_TINY_FIELD_CODESAMPLE_DESC="Turn on/off code highlighting"
PLG_TINY_FIELD_CODESAMPLE_LABEL="Code Sample"
PLG_TINY_FIELD_COLORS_DESC="Show or hide the Colours control buttons."
PLG_TINY_FIELD_COLORS_LABEL="Colours"
PLG_TINY_FIELD_CONTEXTMENU_DESC="Turn on/off Context Menu."
PLG_TINY_FIELD_CONTEXTMENU_LABEL="Context Menu"
PLG_TINY_FIELD_CSS_DESC="By default the Plugin looks for an editor.css file. If it can't find one in the default template CSS folder, it loads the editor.css file from the system template."
PLG_TINY_FIELD_CSS_LABEL="Template CSS Classes"
PLG_TINY_FIELD_CUSTOMBUTTON_DESC="Add custom button(s)."
PLG_TINY_FIELD_CUSTOMBUTTON_LABEL="Custom Button"
PLG_TINY_FIELD_CUSTOMPLUGIN_DESC="Add custom plugin(s)."
PLG_TINY_FIELD_CUSTOMPLUGIN_LABEL="Custom Plugin"
PLG_TINY_FIELD_CUSTOM_CSS_DESC="Optional CSS file that will override the standard editor.css file. Enter a file name to point to a file in the CSS folder of the default template (for example, templates/beez3/css/). Or enter a full URL path to the custom CSS file. If you enter a value in this field, this file will be used instead of the editor.css file."
PLG_TINY_FIELD_CUSTOM_CSS_LABEL="Custom CSS Classes"
PLG_TINY_FIELD_CUSTOM_PATH_DESC="The directory with the image files to be listed relative to the default image folder (set in Media > Options)."
PLG_TINY_FIELD_CUSTOM_PATH_LABEL="Images Directory"
PLG_TINY_FIELD_DATE_DESC="Show or hide the Insert Date button."
PLG_TINY_FIELD_DATE_LABEL="Insert Date"
PLG_TINY_FIELD_DIRECTION_DESC="Choose default text direction."
PLG_TINY_FIELD_DIRECTION_LABEL="Text Direction"
PLG_TINY_FIELD_DRAG_DROP_DESC="Enable drag and drop for uploading images"
PLG_TINY_FIELD_DRAG_DROP_LABEL="Images Drag and Drop"
PLG_TINY_FIELD_ELEMENTS_DESC="Allows the addition of specific valid elements to the existing rule set."
PLG_TINY_FIELD_ELEMENTS_LABEL="Extended Valid Elements"
PLG_TINY_FIELD_ENCODING_DESC="Controls how HTML entities are encoded. Recommended setting is 'raw'. 'named' = used named entity encoding (for example, '&lt;'). 'numeric' = use numeric HTML encoding (for example, '%03c'). raw = Do not encode HTML entities. Note that searching content may not work properly if setting is not 'raw'."
PLG_TINY_FIELD_ENCODING_LABEL="Entity Encoding"
PLG_TINY_FIELD_FONTS_DESC="Show or hide the Font control selectors."
PLG_TINY_FIELD_FONTS_LABEL="Fonts"
PLG_TINY_FIELD_FULLSCREEN_DESC="Show or hide the Fullscreen button."
PLG_TINY_FIELD_FULLSCREEN_LABEL="Fullscreen"
PLG_TINY_FIELD_FUNCTIONALITY_DESC="Select level of functionality."
PLG_TINY_FIELD_FUNCTIONALITY_LABEL="Functionality"
PLG_TINY_FIELD_HR_DESC="Show or hide the Horizontal Rule button."
PLG_TINY_FIELD_HR_LABEL="Horizontal Rule"
PLG_TINY_FIELD_HTMLHEIGHT_DESC="Height of HTML editor. Only applies in Advanced and Extended mode."
PLG_TINY_FIELD_HTMLHEIGHT_LABEL="HTML Height"
PLG_TINY_FIELD_HTMLWIDTH_DESC="Width of HTML editor. Should normally be left empty to let it flow. Only applies in Advanced and Extended mode."
PLG_TINY_FIELD_HTMLWIDTH_LABEL="HTML Width"
PLG_TINY_FIELD_INLINEPOPUPS_DESC="All dialogs to open as floating div layers instead of popup windows. This option can be very useful to get around popup blockers."
PLG_TINY_FIELD_INLINEPOPUPS_LABEL="Inline Popups"
PLG_TINY_FIELD_LABEL_ADVANCEDPARAMS="Advanced"
PLG_TINY_FIELD_LANGCODE_DESC="Editor UI Language. The value will be used if Automatic language is not set."
PLG_TINY_FIELD_LANGCODE_LABEL="Language Code"
PLG_TINY_FIELD_LANGSELECT_DESC="If Yes, editor language will automatically match selected UI language. If the tiny language does not exist, the editor language will default to English."
PLG_TINY_FIELD_LANGSELECT_LABEL="Automatic Language Selection"
PLG_TINY_FIELD_LINK_DESC="Select to enable the Link icons."
PLG_TINY_FIELD_LINK_LABEL="Links"
PLG_TINY_FIELD_MEDIA_DESC="Show or hide the Media button."
PLG_TINY_FIELD_MEDIA_LABEL="Media"
PLG_TINY_FIELD_MOBILE_DESC="This mode puts any mobile devices into the simple functionality with enlarged buttons for easy access."
PLG_TINY_FIELD_MOBILE_LABEL="Mobile Mode"
PLG_TINY_FIELD_NAME_EXTENDED_LABEL="<strong>Extended Mode Options</strong><br />Below you can set the access level for each one of the fields individually.<br />Please keep in mind that these options will only have an effect in <strong>Extended</strong> mode."
PLG_TINY_FIELD_NEWLINES_DESC="New lines will be created using the selected option."
PLG_TINY_FIELD_NEWLINES_LABEL="New Lines"
PLG_TINY_FIELD_NONBREAKING_DESC="Insert non-breaking space entities."
PLG_TINY_FIELD_NONBREAKING_LABEL="Non-breaking"
PLG_TINY_FIELD_NUMBER_OF_SETS_LABEL="Number of Sets"
PLG_TINY_FIELD_NUMBER_OF_SETS_DESC="Number of sets that can be created. Minimum 3"
PLG_TINY_FIELD_PASTE_DESC="Show or hide the Paste button."
PLG_TINY_FIELD_PASTE_LABEL="Paste"
PLG_TINY_FIELD_PATH_DESC="If set to ON, it displays the set classes for the marked text."
PLG_TINY_FIELD_PATH_LABEL="Element Path"
PLG_TINY_FIELD_PRINT_DESC="Turn on/off the print and print preview icons in the editor."
PLG_TINY_FIELD_PRINT_LABEL="Print/Preview"
PLG_TINY_FIELD_PROHIBITED_DESC="Elements that will be cleaned from the text. Do not leave empty - if you do not want to prohibit anything enter dummy text eg cms."
PLG_TINY_FIELD_PROHIBITED_LABEL="Prohibited Elements"
PLG_TINY_FIELD_RESIZE_HORIZONTAL_DESC="Enable/disable the horizontal resizing."
PLG_TINY_FIELD_RESIZE_HORIZONTAL_LABEL="Horizontal Resizing"
PLG_TINY_FIELD_RESIZING_DESC="Enable/disable the resizing of the editor area (vertically and also horizontally if 'Horizontal Resizing' is enabled)."
PLG_TINY_FIELD_RESIZING_LABEL="Resizing"
PLG_TINY_FIELD_RTL_DESC="Show or hide the RTL button."
PLG_TINY_FIELD_RTL_LABEL="Directionality"
; The two following strings are deprecated
PLG_TINY_FIELD_SAVEWARNING_DESC="Gives warning if you cancel without saving changes."
PLG_TINY_FIELD_SAVEWARNING_LABEL="Save Warning"
PLG_TINY_FIELD_SEARCH-REPLACE_DESC="Show or hide the Search &amp; Replace button."
PLG_TINY_FIELD_SEARCH-REPLACE_LABEL="Search &amp; Replace"
PLG_TINY_FIELD_SETACCESS_DESC="Restrict users that will use this set to those in the selected user groups.<br>If a user belongs to multiple groups, the set used will be the one which is assigned to a group higher in the hierarchy.<br>Example: if a set is assigned to Author and another set to Publishers, if the user belongs to both groups, the set assigned to Publishers will be used."
PLG_TINY_FIELD_SETACCESS_LABEL="Assign this Set to"
PLG_TINY_FIELD_SKIN_ADMIN_DESC="Select skin for the Administrator Backend interface."
PLG_TINY_FIELD_SKIN_ADMIN_LABEL="Administrator Skin"
PLG_TINY_FIELD_SKIN_DESC="Select skin for the Frontend interface."
PLG_TINY_FIELD_SKIN_INFO_DESC="Copy your new skins to: /media/editors/tinymce/skins."
PLG_TINY_FIELD_SKIN_INFO_LABEL="For customised skins go to: <a href="_QQ_"http://skin.tiny.cloud"_QQ_" target="_QQ_"_blank"_QQ_">Skin Creator</a>"
PLG_TINY_FIELD_SKIN_LABEL="Site Skin"
PLG_TINY_FIELD_SMILIES_DESC="Show or hide the Smilies buttons."
PLG_TINY_FIELD_SMILIES_LABEL="Smilies"
PLG_TINY_FIELD_TABLE_DESC="Show or hide the Table control buttons."
PLG_TINY_FIELD_TABLE_LABEL="Table"
PLG_TINY_FIELD_TEMPLATE_DESC="Show or hide the Insert predefined template content button."
PLG_TINY_FIELD_TEMPLATE_LABEL="Template"
PLG_TINY_FIELD_URLS_DESC="URL behaviour."
PLG_TINY_FIELD_URLS_LABEL="URLs"
PLG_TINY_FIELD_VALIDELEMENTS_DESC="Defines which elements will stay in the edited text when the editor saves (the default rule set for this option is a mixture of the full HTML5 and HTML4 specification)."
PLG_TINY_FIELD_VALIDELEMENTS_LABEL="Valid Elements"
PLG_TINY_FIELD_VALUE_ABSOLUTE="Absolute"
PLG_TINY_FIELD_VALUE_ADVANCED="Advanced"
PLG_TINY_FIELD_VALUE_ALWAYS="Always"
PLG_TINY_FIELD_VALUE_BOTTOM="Bottom"
PLG_TINY_FIELD_VALUE_BR="BR Elements"
PLG_TINY_FIELD_VALUE_CENTER="Center"
PLG_TINY_FIELD_VALUE_DEFAULT="Default"
PLG_TINY_FIELD_VALUE_EXTENDED="Extended"
PLG_TINY_FIELD_VALUE_FRONT="Front Only"
PLG_TINY_FIELD_VALUE_LEFT="Left"
PLG_TINY_FIELD_VALUE_LTR="Left to Right"
PLG_TINY_FIELD_VALUE_NAMED="named"
PLG_TINY_FIELD_VALUE_NEVER="Never"
PLG_TINY_FIELD_VALUE_NUMERIC="numeric"
PLG_TINY_FIELD_VALUE_P="P Elements"
PLG_TINY_FIELD_VALUE_RAW="raw"
PLG_TINY_FIELD_VALUE_RELATIVE="Relative"
PLG_TINY_FIELD_VALUE_RIGHT="Right"
PLG_TINY_FIELD_VALUE_RTL="Right to Left"
PLG_TINY_FIELD_VALUE_SIMPLE="Simple"
PLG_TINY_FIELD_VALUE_TOP="Top"
PLG_TINY_FIELD_VISUALBLOCKS_DESC="See the outline of HTML block elements."
PLG_TINY_FIELD_VISUALBLOCKS_LABEL="Visualblocks"
PLG_TINY_FIELD_VISUALCHARS_DESC="See invisible characters, specifically non-breaking spaces."
PLG_TINY_FIELD_VISUALCHARS_LABEL="Visualchars"
PLG_TINY_FIELD_WORDCOUNT_DESC="Turn on/off word count."
PLG_TINY_FIELD_WORDCOUNT_LABEL="Word Count"
PLG_TINY_LEGACY_WARNING="The <a href="_QQ_"%s"_QQ_">TinyMCE Editor Plugin</a> has been updated. Currently it uses your existing configuration. By editing the plugin, you can now assign and customise various layouts to specific user groups. <br />Warning: when editing the plugin, you will lose all your previous settings!"
PLG_TINY_SET_TARGET_PANEL_DESCRIPTION="<strong>Existing sets of the TinyMCE panel, and options for each set.</strong><br />In each set you can add or remove from <strong>the available menus and buttons</strong>."
PLG_TINY_SET_TITLE="Set %s"
PLG_TINY_SET_PRESET_BUTTON_ADVANCED="Use advanced preset"
PLG_TINY_SET_PRESET_BUTTON_MEDIUM="Use medium preset"
PLG_TINY_SET_PRESET_BUTTON_SIMPLE="Use simple preset"
PLG_TINY_SET_SOURCE_PANEL_DESCRIPTION="<strong>All available menus and buttons.</strong><br />Use them (drag and drop) to edit or build your custom TinyMCE panel."
PLG_TINY_TEMPLATE_LAYOUT1_DESC="HTML layout."
PLG_TINY_TEMPLATE_LAYOUT1_TITLE="Layout"
PLG_TINY_TEMPLATE_SNIPPET1_DESC="Simple HTML snippet."
PLG_TINY_TEMPLATE_SNIPPET1_TITLE="Simple Snippet"
; TinyMCE toolbar buttons
PLG_TINY_TOOLBAR_BUTTON_FONTSELECT="Font Select"
PLG_TINY_TOOLBAR_BUTTON_FONTSIZESELECT="Font Size Select"
PLG_TINY_TOOLBAR_BUTTON_FORMATSELECT="Format Select"
PLG_TINY_TOOLBAR_BUTTON_STYLESELECT="Style Select"
PLG_TINY_TOOLBAR_BUTTON_SEPARATOR="Separator"
PLG_TINY_XML_DESCRIPTION="TinyMCE is a platform independent web based JavaScript HTML WYSIWYG Editor."
language/en-GB/en-GB.com_menus.ini000060400000042644152453623440012612 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_MENUS="Menus"
COM_MENUS_ACTION_COLLAPSE="Collapse"
COM_MENUS_ACTION_DESELECT="Deselect"
COM_MENUS_ACTION_EXPAND="Expand"
COM_MENUS_ACTION_SELECT="Select"
COM_MENUS_ADD_MENU_MODULE="Add a module for this menu"
COM_MENUS_ADMIN_ACCESS_DESC="Filter by viewing access level."
COM_MENUS_ADMIN_ACCESS_LABEL="Access"
COM_MENUS_ADMIN_AUTHOR_DESC="Filter by author."
COM_MENUS_ADMIN_AUTHOR_LABEL="Author"
COM_MENUS_ADMIN_CATEGORY_DESC="Filter by category."
COM_MENUS_ADMIN_CATEGORY_LABEL="Category"
COM_MENUS_ADMIN_FILTER_DESC="Apply filters to the menu item."
COM_MENUS_ADMIN_FILTER_LABEL="Filter"
COM_MENUS_ADMIN_LANGUAGE_DESC="Filter by language."
COM_MENUS_ADMIN_LANGUAGE_LABEL="Language"
COM_MENUS_ADMIN_LEVEL_DESC="The number of subcategory levels to display."
COM_MENUS_ADMIN_LEVEL_LABEL="Subcategory Levels"
COM_MENUS_ADMIN_TAGS_DESC="Filter by tags."
COM_MENUS_ADMIN_TAGS_LABEL="Tags"
COM_MENUS_ADVANCED_FIELDSET_LABEL="Advanced"
COM_MENUS_BASIC_FIELDSET_LABEL="Options"
COM_MENUS_BATCH_MENU_ITEM_CANNOT_CREATE="You are not allowed to create new menu items."
COM_MENUS_BATCH_MENU_ITEM_CANNOT_EDIT="You are not allowed to edit menu items."
COM_MENUS_BATCH_MENU_LABEL="To Move or Copy your selection please select a Menu or parent item."
COM_MENUS_BATCH_OPTIONS="Batch process the selected menu items"
COM_MENUS_BATCH_TIP="If a menu or parent is selected for move/copy, any actions selected will be applied to the copied or moved menu items. Otherwise, all actions are applied to the selected menu items."
COM_MENUS_CHANGE_MENUITEM="Select or Change Menu Item"
COM_MENUS_CONFIGURATION="Menus: Options"
COM_MENUS_EDIT_MENUITEM="Edit Menu Item"
COM_MENUS_EDIT_MODULE_SETTINGS="Edit module settings"
COM_MENUS_ERROR_ALL_LANGUAGE_ASSOCIATED="A menu item set to All languages can't be associated. Associations have not been set."
COM_MENUS_ERROR_ALREADY_HOME="Menu item already set to home."
COM_MENUS_ERROR_MENUTYPE="Please change the Menu type. The term 'main' is reserved for internal usage."
COM_MENUS_ERROR_MENUTYPE_HOME="The term 'main' is reserved for internal usage."
COM_MENUS_ERROR_MENUTYPE_NOT_FOUND="The Menu type doesn't exist."
COM_MENUS_ERROR_ONE_HOME="Only one menu item can be a home link for each language."
COM_MENUS_EXTENSION_PUBLISHED_DISABLED="Component disabled and menu item published."
COM_MENUS_EXTENSION_PUBLISHED_ENABLED="Component enabled and menu item published."
COM_MENUS_EXTENSION_UNPUBLISHED_DISABLED="Component disabled and menu item unpublished."
COM_MENUS_EXTENSION_UNPUBLISHED_ENABLED="Component enabled and menu item unpublished."
COM_MENUS_FIELD_FEEDLINK_DESC="Display a feed link for this menu item."
COM_MENUS_FIELD_FEEDLINK_LABEL="Feed link"
COM_MENUS_FIELD_PRESET_LABEL="Import a preset"
COM_MENUS_FIELD_PRESET_DESC="Select a preset if you want to populate this menu with the menu items in that preset. Otherwise leave this empty."
COM_MENUS_FIELD_VALUE_IGNORE="Ignore"
COM_MENUS_FIELD_VALUE_NEW_WITH_NAV="New Window With Navigation"
COM_MENUS_FIELD_VALUE_NEW_WITHOUT_NAV="New Without Navigation"
COM_MENUS_FIELD_VALUE_PARENT="Parent"
COM_MENUS_FIELDSET_RULES="Permissions"
COM_MENUS_FILTER_PARENT_MENU_ITEM_DESC="Filters the menu items list where the parent is this selected menu item."
COM_MENUS_FILTER_PARENT_MENU_ITEM_LABEL="Parent Menu Item"
COM_MENUS_FILTER_SELECT_PARENT_MENU_ITEM="- Select Parent Menu Item -"
COM_MENUS_GRID_UNSET_LANGUAGE="Unset %s Default"
COM_MENUS_HEADING_ASSIGN_MODULE="Module"
COM_MENUS_HEADING_ASSOCIATION="Association"
COM_MENUS_HEADING_DISPLAY="Display"
COM_MENUS_HEADING_HOME="Home"
COM_MENUS_HEADING_HOME_ASC="Home ascending"
COM_MENUS_HEADING_HOME_DESC="Home descending"
COM_MENUS_HEADING_LEVELS="View Level"
COM_MENUS_HEADING_LINKED_MODULES="Linked Modules"
COM_MENUS_HEADING_MENU="Menu"
COM_MENUS_HEADING_MENU_ASC="Menu ascending"
COM_MENUS_HEADING_MENU_DESC="Menu descending"
COM_MENUS_HEADING_NUMBER_MENU_ITEMS="Number of Menu Items"
COM_MENUS_HEADING_POSITION="Position"
COM_MENUS_HEADING_PUBLISHED_ITEMS="Published"
COM_MENUS_HEADING_TRASHED_ITEMS="Trashed"
COM_MENUS_HEADING_UNPUBLISHED_ITEMS="Unpublished"
COM_MENUS_HTML_PUBLISH="Publish menu item"
COM_MENUS_HTML_PUBLISH_ALIAS="Publish the menu item alias"
COM_MENUS_HTML_PUBLISH_DISABLED="Publish menu item::Component disabled"
COM_MENUS_HTML_PUBLISH_ENABLED="Publish menu item::Component enabled"
COM_MENUS_HTML_PUBLISH_HEADING="Publish the heading menu item"
COM_MENUS_HTML_PUBLISH_SEPARATOR="Publish the separator menu item"
COM_MENUS_HTML_PUBLISH_URL="Publish the URL menu item"
COM_MENUS_HTML_UNPUBLISH_ALIAS="Unpublish the menu item alias"
COM_MENUS_HTML_UNPUBLISH_DISABLED="Unpublish menu item::Component disabled"
COM_MENUS_HTML_UNPUBLISH_ENABLED="Unpublish menu item::Component enabled"
COM_MENUS_HTML_UNPUBLISH_HEADING="Unpublish the heading menu item"
COM_MENUS_HTML_UNPUBLISH_SEPARATOR="Unpublish the separator menu item"
COM_MENUS_HTML_UNPUBLISH_URL="Unpublish the URL menu item"
COM_MENUS_INTEGRATION_FIELDSET_LABEL="Integration"
; The following 2 strings are deprecated and will be removed with 4.0.
COM_MENUS_ITEM_ASSOCIATIONS_FIELDSET_LABEL="Menu Item Associations"
COM_MENUS_ITEM_ASSOCIATIONS_FIELDSET_DESC="Multilingual only! This choice will only display if the Language Filter parameter 'Item Associations' is set to 'Yes'. Choose a menu item for the target language. This association will let the Language Switcher module redirect to the associated menu item in another language. If used, make sure to display the Language switcher module on the relevant pages. A menu item set to language 'All' can't be associated."
COM_MENUS_ITEM_DETAILS="Details"
COM_MENUS_ITEM_FIELD_ALIAS_DESC="The alias is used in the URL when SEF is on."
COM_MENUS_ITEM_FIELD_ALIAS_MENU_DESC="Menu Item to link to."
COM_MENUS_ITEM_FIELD_ALIAS_MENU_LABEL="Menu Item"
COM_MENUS_ITEM_FIELD_ALIAS_REDIRECT_DESC="If set to Yes then visitors will be redirected to the linked menu item."
COM_MENUS_ITEM_FIELD_ALIAS_REDIRECT_LABEL="Use Redirection"
COM_MENUS_ITEM_FIELD_ANCHOR_CSS_DESC="An optional class to apply to the menu hyperlink."
COM_MENUS_ITEM_FIELD_ANCHOR_CSS_LABEL="Link Class"
COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_DESC="An optional, custom description for the title attribute of the menu hyperlink."
COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_LABEL="Link Title Attribute"
COM_MENUS_ITEM_FIELD_ANCHOR_REL_DESC="An optional, custom rel attribute to get more information about the menu hyperlink (search engines purpose)."
COM_MENUS_ITEM_FIELD_ANCHOR_REL_LABEL="Link Rel Attribute"
COM_MENUS_ITEM_FIELD_ASSIGNED_DESC="Shows which menu the link will appear in."
COM_MENUS_ITEM_FIELD_ASSIGNED_LABEL="Menu"
COM_MENUS_ITEM_FIELD_ASSOCIATION_NO_VALUE="- No association -"
COM_MENUS_ITEM_FIELD_BROWSERNAV_DESC="Target browser window when the menu item is selected."
COM_MENUS_ITEM_FIELD_BROWSERNAV_LABEL="Target Window"
COM_MENUS_ITEM_FIELD_COMPONENTS_CONTAINER_HIDE_ITEMS_DESC="Select the menu items that should or should not be shown under this container. If there are no items to show, then this container will also be hidden.<br>Please note that when you install a new component it will be displayed by default until you come back here and hide it too."
COM_MENUS_ITEM_FIELD_COMPONENTS_CONTAINER_HIDE_ITEMS_LABEL="Show or Hide Menu Items"
COM_MENUS_ITEM_FIELD_HIDE_UNASSIGNED="Hide Unassigned Modules"
COM_MENUS_ITEM_FIELD_HIDE_UNASSIGNED_DESC="Show or hide modules unassigned to this menu item."
COM_MENUS_ITEM_FIELD_HIDE_UNASSIGNED_LABEL="Unassigned Modules"
COM_MENUS_ITEM_FIELD_HIDE_UNPUBLISHED="Hide Unpublished Modules"
COM_MENUS_ITEM_FIELD_HIDE_UNPUBLISHED_DESC="Show or hide modules that are unpublished."
COM_MENUS_ITEM_FIELD_HIDE_UNPUBLISHED_LABEL="Unpublished Modules"
COM_MENUS_ITEM_FIELD_HOME_DESC="Sets this menu item as the default or home page of the site. You must have a default page set at all times."
COM_MENUS_ITEM_FIELD_HOME_LABEL="Default Page"
COM_MENUS_ITEM_FIELD_LANGUAGE_DESC="Assign a language to this menu item."
COM_MENUS_ITEM_FIELD_LINK_DESC="Link for this menu."
COM_MENUS_ITEM_FIELD_LINK_LABEL="Link"
COM_MENUS_ITEM_FIELD_MENU_IMAGE_DESC="Select or upload an optional image to be used with the menu hyperlink."
COM_MENUS_ITEM_FIELD_MENU_IMAGE_LABEL="Link Image"
COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_DESC="An optional class to apply to the image."
COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_LABEL="Image Class"
COM_MENUS_ITEM_FIELD_MENU_SHOW_DESC="Select 'No' if you want to hide this menu item. Note any submenu items will also be hidden."
COM_MENUS_ITEM_FIELD_MENU_SHOW_LABEL="Display in Menu"
COM_MENUS_ITEM_FIELD_MENU_TEXT_DESC="If the optional image is added, adds the menu title next to the image. Default is 'Yes'."
COM_MENUS_ITEM_FIELD_MENU_TEXT_LABEL="Add Menu Title"
COM_MENUS_ITEM_FIELD_NOTE_DESC="An optional note to display in the Menu Manager."
COM_MENUS_ITEM_FIELD_ORDERING_DESC="The menu item will be placed in the menu after the selected menu item."
COM_MENUS_ITEM_FIELD_ORDERING_LABEL="Ordering"
COM_MENUS_ITEM_FIELD_ORDERING_TEXT="Ordering will be available after saving."
COM_MENUS_ITEM_FIELD_ORDERING_VALUE_FIRST="- First -"
COM_MENUS_ITEM_FIELD_ORDERING_VALUE_LAST="- Last -"
COM_MENUS_ITEM_FIELD_PAGE_CLASS_DESC="Optional CSS class to add to elements in this page. This allows CSS styling specific to this page."
COM_MENUS_ITEM_FIELD_PAGE_CLASS_LABEL="Page Class"
COM_MENUS_ITEM_FIELD_PAGE_HEADING_DESC="Optional alternative text for the Page heading."
COM_MENUS_ITEM_FIELD_PAGE_HEADING_LABEL="Page Heading"
COM_MENUS_ITEM_FIELD_PAGE_TITLE_DESC="Optional text for the &quot;Browser page title&quot; element. If blank, a default value is used based on the Menu Item Title."
COM_MENUS_ITEM_FIELD_PAGE_TITLE_LABEL="Browser Page Title"
COM_MENUS_ITEM_FIELD_PARENT_DESC="Select a parent item."
COM_MENUS_ITEM_FIELD_PARENT_LABEL="Parent Item"
COM_MENUS_ITEM_FIELD_SECURE_DESC="Selects if this link should use HTTPS (encrypted HTTP connections with the https:// protocol prefix). Note, you must have HTTPS enabled on your server to utilise this option."
COM_MENUS_ITEM_FIELD_SECURE_LABEL="Secure"
COM_MENUS_ITEM_FIELD_SHOW_PAGE_HEADING_DESC="Show or hide the Browser Page Title in the heading of the page ( If no optional text entered - will default to value based on the Menu Item Title ). The Page heading is usually displayed inside the &quot;H1&quot; tag."
COM_MENUS_ITEM_FIELD_SHOW_PAGE_HEADING_LABEL="Show Page Heading"
COM_MENUS_ITEM_FIELD_TEMPLATE_DESC="Select a specific template style for this menu item or use the default template."
COM_MENUS_ITEM_FIELD_TEMPLATE_LABEL="Template Style"
COM_MENUS_ITEM_FIELD_TEXT_SEPARATOR_DESC="Choose whether this separator will be displayed as a label. If the title has only dashes (-) and spaces, it will not be displayed as a label."
COM_MENUS_ITEM_FIELD_TEXT_SEPARATOR_LABEL="Display as a label"
COM_MENUS_ITEM_FIELD_TITLE_DESC="The title of the menu item that will display in the menu."
COM_MENUS_ITEM_FIELD_TITLE_LABEL="Menu Title"
COM_MENUS_ITEM_FIELD_TYPE_DESC="The type of link: Component, URL, Alias, Separator or Heading."
COM_MENUS_ITEM_FIELD_TYPE_LABEL="Menu Item Type"
COM_MENUS_ITEM_IS_DEFAULT="Is default"
COM_MENUS_ITEM_MODULE_ASSIGNMENT="Module Assignment"
COM_MENUS_ITEM_REQUIRED="Required"
COM_MENUS_ITEM_ROOT="Menu Item Root"
COM_MENUS_ITEMS_REBUILD_FAILED="Failed rebuilding Menu Items list."
COM_MENUS_ITEMS_REBUILD_SUCCESS="Menu items list rebuilt."
COM_MENUS_ITEMS_SEARCH_FILTER="Search in title, alias and notes. Prefix with ID: to search for a menu item ID."
COM_MENUS_ITEMS_SEARCH_FILTER_LABEL="Search Menu Items"
COM_MENUS_ITEMS_SET_HOME_0="No menu item set to home."
COM_MENUS_ITEMS_SET_HOME_1="1 menu item set to home."
COM_MENUS_ITEMS_SET_HOME_MORE="%d menu items set to home."
COM_MENUS_ITEMS_UNSET_HOME="1 menu item unset to home."
COM_MENUS_LABEL_HIDDEN="Hidden"
COM_MENUS_LAYOUT_FEATURED_OPTIONS="Layout"
COM_MENUS_LAYOUT_MENUTYPE_OPTIONS_LABEL="Menu Type"
COM_MENUS_LINKTYPE_OPTIONS_LABEL="Link Type"
COM_MENUS_MENU_CLIENT_ID_LABEL="Client"
COM_MENUS_MENU_CLIENT_ID_DESC="Select if this Menu is to be used in the Site or the Administrator."
COM_MENUS_MENU_CONFIRM_DELETE="Are you sure you want to delete these menus? Confirming will delete the selected menu types, all their menu items and the associated menu modules."
COM_MENUS_MENU_DESCRIPTION_DESC="A description about the purpose of the menu."
COM_MENUS_MENU_DETAILS="Menu Details"
COM_MENUS_MENU_EXPORT_BUTTON="Download as Preset"
COM_MENUS_MENU_ITEM_SAVE_SUCCESS="Menu item saved."
COM_MENUS_MENU_MENUTYPE_DESC="The system name of the menu."
COM_MENUS_MENU_MENUTYPE_LABEL="Menu Type"
COM_MENUS_MENU_SAVE_SUCCESS="Menu saved"
COM_MENUS_MENU_SEARCH_FILTER="Search in Title or Menu type"
COM_MENUS_MENU_SPRINTF="Menu: %s"
COM_MENUS_MENUS="Menu items"
COM_MENUS_MENU_TYPE_PROTECTED_MAIN_LABEL="Main (Protected)"
COM_MENUS_MENU_TITLE_DESC="The title of the menu to display in the Administrator Menubar and lists."
COM_MENUS_MENUS_FILTER_SEARCH_DESC="Search in title and menu type."
COM_MENUS_MENUS_FILTER_SEARCH_LABEL="Search Menus"
; in the following string
; %1$s is for module title, %2$s is for access-title, %3$s is for position
COM_MENUS_MODULE_ACCESS_POSITION="%1$s <small>(%2$s in %3$s)</small>"
COM_MENUS_MODULE_SHOW_VARIES="Varies"
COM_MENUS_MODULES="Modules"
COM_MENUS_N_ITEMS_CHECKED_IN_0="No menu item checked in."
COM_MENUS_N_ITEMS_CHECKED_IN_1="%d menu item checked in."
COM_MENUS_N_ITEMS_CHECKED_IN_MORE="%d menu items checked in."
COM_MENUS_N_ITEMS_DELETED="%d menu items deleted."
COM_MENUS_N_ITEMS_DELETED_1="%d menu item deleted."
COM_MENUS_N_ITEMS_FAILED_PUBLISHING="Failed publishing %d menu items as at least one of their parents is unpublished or one of their children is checked out."
COM_MENUS_N_ITEMS_FAILED_PUBLISHING_1="Failed publishing %d menu item as at least one of its parents is unpublished or one of its children is checked out."
COM_MENUS_N_ITEMS_PUBLISHED="%d menu items published."
COM_MENUS_N_ITEMS_PUBLISHED_1="%d menu item published."
COM_MENUS_N_ITEMS_TRASHED="%d menu items trashed."
COM_MENUS_N_ITEMS_TRASHED_1="%d menu item trashed."
COM_MENUS_N_ITEMS_UNPUBLISHED="%d menu items unpublished."
COM_MENUS_N_ITEMS_UNPUBLISHED_1="%d menu item unpublished."
COM_MENUS_N_MENUS_DELETED="%d menu types deleted."
COM_MENUS_N_MENUS_DELETED_1="Menu type deleted."
COM_MENUS_NEW_MENUITEM="New Menu Item"
COM_MENUS_NO_ITEM_SELECTED="No menu items selected."
COM_MENUS_NO_MENUS_SELECTED="No menu selected."
COM_MENUS_OPTION_SELECT_COMPONENT="- Select Component -"
COM_MENUS_OPTION_SELECT_LEVEL="- Select Max Levels -"
COM_MENUS_PAGE_OPTIONS_LABEL="Page Display"
COM_MENUS_PRESET_IMPORT_SUCCESS="Menu was saved and the menu items were imported from the selected preset."
COM_MENUS_PRESET_IMPORT_FAILED="Menu was saved but failed to import the preset: %s"
COM_MENUS_PRESET_LOAD_FAILED="Failed to load the specified preset."
COM_MENUS_REQUEST_FIELDSET_LABEL="Required Settings"
COM_MENUS_SAVE_SUCCESS="Menu item saved."
COM_MENUS_SELECT_A_MENUITEM="Select a Menu Item"
COM_MENUS_SELECT_MENU="- Select Menu -"
COM_MENUS_SELECT_MENU_FILTER_NOT_TRASHED="Filter the list by a state other than trashed or clear the filter."
COM_MENUS_SELECT_MENU_FIRST="To use batch processing, please first select a Menu in the manager."
COM_MENUS_SELECT_MENU_FIRST_EXPORT="To use export, please first select a valid Menu in the manager."
COM_MENUS_SUBMENU_ITEMS="Menu Items"
COM_MENUS_SUBMENU_MENUS="Menus"
COM_MENUS_SUCCESS_REORDERED="Menu item reordered."
COM_MENUS_TIP_ALIAS_LABEL="<strong>Warning!</strong><br />Leave the alias field empty if the menu item alias and the menu item linked to by the alias have the same parent."
COM_MENUS_TIP_ASSOCIATION="Associated menu items"
COM_MENUS_TITLE_EDIT_ITEM="Menu Manager: Title Edit Item"
COM_MENUS_TITLE_TRANSLATION="Title (%s)"
COM_MENUS_TOOLBAR_SET_HOME="Home"
COM_MENUS_TYPE_ALIAS="Menu Item Alias"
COM_MENUS_TYPE_ALIAS_DESC="Create an alias to another menu item."
COM_MENUS_TYPE_CHOOSE="Select a Menu Item Type:"
COM_MENUS_TYPE_CONTAINER="Components Menu Container"
COM_MENUS_TYPE_CONTAINER_DESC="This will create a container menu which will show the items in the protected menu type 'main'. You can also selectively hide or show menu items."
COM_MENUS_TYPE_EXTERNAL_URL="URL"
COM_MENUS_TYPE_EXTERNAL_URL_DESC="An external or internal URL."
COM_MENUS_TYPE_HEADING="Menu Heading"
COM_MENUS_TYPE_HEADING_DESC="A heading for the parent of submenu items."
COM_MENUS_TYPE_SEPARATOR="Separator"
COM_MENUS_TYPE_SEPARATOR_DESC="A separator with or without a text label, useful to separate items within a menu."
COM_MENUS_TYPE_SYSTEM="System Links"
COM_MENUS_TYPE_UNEXISTING="Component '%s' does not exist."
COM_MENUS_TYPE_UNKNOWN="Unknown"
COM_MENUS_VIEW_EDIT_ITEM_TITLE="Menus: Edit Item"
COM_MENUS_VIEW_EDIT_MENU_TITLE="Menus: Edit"
COM_MENUS_VIEW_ITEMS_ALL_TITLE="Menus: All Menu Items"
COM_MENUS_VIEW_ITEMS_MENU_TITLE="Menus: Items (%s)"
COM_MENUS_VIEW_ITEMS_TITLE="Menus: Items"
COM_MENUS_VIEW_MENUS_TITLE="Menus"
COM_MENUS_VIEW_NEW_ITEM_TITLE="Menus: New Item"
COM_MENUS_VIEW_NEW_MENU_TITLE="Menus: Add"
COM_MENUS_XML_DESCRIPTION="Component for creating menus."

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_MENUS="Changes apply to this component only.<br /><em><strong>Inherited</strong></em> - a Global Configuration setting or higher level setting is applied.<br /><em><strong>Denied</strong></em> always wins - whatever is set at the Global or higher level and applies to all child elements.<br /><em><strong>Allowed</strong></em> will enable the action for this component unless overruled by a Global Configuration setting."
language/en-GB/en-GB.plg_search_weblinks.sys.ini000060400000000504152453623440015434 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SEARCH_WEBLINKS="Search - Web Links"
PLG_SEARCH_WEBLINKS_XML_DESCRIPTION="Enables searching of Web Links Component."
language/en-GB/en-GB.plg_system_t3.j25.compat.ini000060400000000035152453623440015266 0ustar00JGLOBAL_HITS_COUNT="Hits: %s"language/en-GB/en-GB.com_templates.sys.ini000060400000001057152453623440014267 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_TEMPLATES="Templates"
COM_TEMPLATES_STYLE_VIEW_DEFAULT_DESC="Shows a List of Template styles"
COM_TEMPLATES_STYLE_VIEW_DEFAULT_TITLE="Template Styles"
COM_TEMPLATES_TEMPLATES_VIEW_DEFAULT_DESC="Shows a List of Installed Templates"
COM_TEMPLATES_TEMPLATES_VIEW_DEFAULT_TITLE="Templates"
COM_TEMPLATES_XML_DESCRIPTION="This component manages templates."
language/en-GB/en-GB.com_menus.sys.ini000060400000001670152453623440013421 0ustar00; Joomla! Project
; (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_MENUS="Menus"
COM_MENUS_ITEMS_CHOOSE_MENU_DESC="Choose a Menutype for the target page.<br><br>Not to be confused with the <strong>Menu</strong> under which this menu item will be assigned."
COM_MENUS_ITEMS_CHOOSE_MENU_LABEL="Choose a Menutype"
COM_MENUS_ITEMS_VIEW_DEFAULT_DESC="Shows a list of menu items"
COM_MENUS_ITEMS_VIEW_DEFAULT_TITLE="Menu Items"
COM_MENUS_ITEM_VIEW_EDIT_DESC="Shows a form to create a new menu item"
COM_MENUS_ITEM_VIEW_EDIT_TITLE="New Menu Item"
COM_MENUS_MENUS_VIEW_DEFAULT_DESC="Shows a list of Menu Types"
COM_MENUS_MENUS_VIEW_DEFAULT_TITLE="Menus"
COM_MENUS_MENU_VIEW_EDIT_DESC="Shows a form to create a new menu"
COM_MENUS_MENU_VIEW_EDIT_TITLE="New Menu"
COM_MENUS_XML_DESCRIPTION="Component for creating menus."
language/en-GB/en-GB.plg_system_akversioncheck.ini000060400000002614152453623440016063 0ustar00PLG_SYSTEM_AKVERSIONCHECK="System - Akeeba extensions version check"
PLG_SYSTEM_AKVERSIONCHECK_XML_DESCRIPTION="Allows Joomla Update to report the correct compatibility of Akeeba Ltd's extensions with Joomla 4. This plugin can not be disabled except after upgrading your site to Joomla 4 or later."

PLG_SYSTEM_AKVERSIONCHECK_LBL_TITLE="Outdated Akeeba extensions detected"
PLG_SYSTEM_AKVERSIONCHECK_LBL_CONTENT="You have some outdated Akeeba extensions installed on your site which will not work on Joomla 4. You need to remove them before updating your site to Joomla 4."
PLG_SYSTEM_AKVERSIONCHECK_LBL_MAGICERASER="Please use our <a href='%s'>MagicEraser</a> software to automatically remove obsolete extensions before upgrading your site to Joomla 4."
PLG_SYSTEM_AKVERSIONCHECK_LBL_MAGICERASER_WITH_SUBS="Please use our <a href='%s'>MagicEraser</a> software to automatically remove obsolete extensions, except Akeeba Subscriptions, before upgrading your site to Joomla 4."
PLG_SYSTEM_AKVERSIONCHECK_LBL_AKEEBASUBSCRIPTIONS="You must manually uninstall Akeeba Subscriptions by uninstalling the <code>Akeeba Subscriptions package</code> extension from your site. <strong>Watch out!</strong> You will lose all your subscription data in the process. Kindly note that Akeeba Subscriptions has been End of Life since April 2019, with its End of Life announced in November 2013 — more than <em>five years</em> in advance."language/en-GB/en-GB.plg_user_terms.ini000060400000002443152453623440013650 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_USER_TERMS="User - Terms and Conditions"
PLG_USER_TERMS_FIELD_ARTICLE_DESC="Select the article from the list or create a new one."
PLG_USER_TERMS_FIELD_ARTICLE_LABEL="Terms & Conditions Article"
PLG_USER_TERMS_FIELD_DESC="Read the full terms and conditions."
PLG_USER_TERMS_FIELD_ERROR="Agreement to the site's Terms & Conditions is required."
PLG_USER_TERMS_FIELD_LABEL="Terms & Conditions"
PLG_USER_TERMS_LABEL="Terms & Conditions"
PLG_USER_TERMS_LOGGING_CONSENT_TO_TERMS="User <a href='{accountlink}'>{username}</a> consented to the terms and conditions during registration."
PLG_USER_TERMS_NOTE_FIELD_DEFAULT="By signing up to this web site you accept the Terms & Conditions."
PLG_USER_TERMS_NOTE_FIELD_DESC="A summary of the site's terms & conditions. If left blank then the default message will be used."
PLG_USER_TERMS_NOTE_FIELD_LABEL="Short Terms & Conditions"
PLG_USER_TERMS_OPTION_AGREE="I agree"
PLG_USER_TERMS_OPTION_DO_NOT_AGREE="I do not agree"
PLG_USER_TERMS_SUBJECT="Privacy Policy"
PLG_USER_TERMS_XML_DESCRIPTION="Basic plugin to request user's consent to the site's terms and conditions."
language/en-GB/en-GB.plg_actionlog_joomla.ini000060400000010144152453623440014775 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_ACTIONLOG_JOOMLA="Action Log - Joomla"
PLG_ACTIONLOG_JOOMLA_APPLICATION_ADMINISTRATOR="admin"
PLG_ACTIONLOG_JOOMLA_APPLICATION_SITE="site"
PLG_ACTIONLOG_JOOMLA_XML_DESCRIPTION="Record the actions of users on the site for Joomla core extensions so they can be reviewed if required."
; Content types title
PLG_ACTIONLOG_JOOMLA_TYPE_ACCESS_LEVEL="access level"
PLG_ACTIONLOG_JOOMLA_TYPE_APPLICATION_CONFIG="Global Configuration"
PLG_ACTIONLOG_JOOMLA_TYPE_ARTICLE="article"
PLG_ACTIONLOG_JOOMLA_TYPE_BANNER="banner"
PLG_ACTIONLOG_JOOMLA_TYPE_BANNER_CLIENT="banner client"
PLG_ACTIONLOG_JOOMLA_TYPE_CATEGORY="category"
PLG_ACTIONLOG_JOOMLA_TYPE_COMPONENT="component"
PLG_ACTIONLOG_JOOMLA_TYPE_COMPONENT_CONFIG="Component Configuration"
PLG_ACTIONLOG_JOOMLA_TYPE_CONTACT="contact"
PLG_ACTIONLOG_JOOMLA_TYPE_FILE="file"
PLG_ACTIONLOG_JOOMLA_TYPE_LANGUAGE="language"
PLG_ACTIONLOG_JOOMLA_TYPE_LIBRARY="library"
PLG_ACTIONLOG_JOOMLA_TYPE_LINK="link redirect"
PLG_ACTIONLOG_JOOMLA_TYPE_LINK_REDIRECT="link redirect"
PLG_ACTIONLOG_JOOMLA_TYPE_MEDIA="media"
PLG_ACTIONLOG_JOOMLA_TYPE_MENU="menu"
PLG_ACTIONLOG_JOOMLA_TYPE_MENU_ITEM="menu item"
PLG_ACTIONLOG_JOOMLA_TYPE_MODULE="module"
PLG_ACTIONLOG_JOOMLA_TYPE_NEWSFEED="newsfeed"
PLG_ACTIONLOG_JOOMLA_TYPE_PACKAGE="package"
PLG_ACTIONLOG_JOOMLA_TYPE_PLUGIN="plugin"
PLG_ACTIONLOG_JOOMLA_TYPE_STYLE="template style"
PLG_ACTIONLOG_JOOMLA_TYPE_TAG="tag"
PLG_ACTIONLOG_JOOMLA_TYPE_TEMPLATE="template"
PLG_ACTIONLOG_JOOMLA_TYPE_USER="user"
PLG_ACTIONLOG_JOOMLA_TYPE_USER_GROUP="user group"
PLG_ACTIONLOG_JOOMLA_TYPE_USER_NOTE="user note"
PLG_ACTIONLOG_JOOMLA_USER_CACHE="User <a href='{accountlink}'>{username}</a> deleted cache group {group}"
PLG_ACTIONLOG_JOOMLA_USER_CHECKIN="User <a href='{accountlink}'>{username}</a> performed a check in to table {table}"
PLG_ACTIONLOG_JOOMLA_USER_LOG="User <a href='{accountlink}'>{username}</a> purged one or more rows from the action log"
PLG_ACTIONLOG_JOOMLA_USER_LOGEXPORT="User <a href='{accountlink}'>{username}</a> exported one or more rows from the action log"
PLG_ACTIONLOG_JOOMLA_USER_LOGGED_IN="User <a href='{accountlink}'>{username}</a> logged in to {app}"
PLG_ACTIONLOG_JOOMLA_USER_LOGGED_OUT="User <a href='{accountlink}'>{username}</a> logged out from {app}"
PLG_ACTIONLOG_JOOMLA_USER_LOGIN_FAILED="User <a href='{accountlink}'>{username}</a> tried to login to {app}"
PLG_ACTIONLOG_JOOMLA_USER_REGISTRATION_ACTIVATE="User <a href='{accountlink}'>{username}</a> activated the account"
PLG_ACTIONLOG_JOOMLA_USER_REGISTERED="User <a href='{accountlink}'>{username}</a> registered for an account"
PLG_ACTIONLOG_JOOMLA_USER_REMIND="User <a href='{accountlink}'>{username}</a> requested a username reminder for their account"
PLG_ACTIONLOG_JOOMLA_USER_RESET_COMPLETE="User <a href='{accountlink}'>{username}</a> completed the password reset for their account"
PLG_ACTIONLOG_JOOMLA_USER_RESET_REQUEST="User <a href='{accountlink}'>{username}</a> requested a password reset for their account"
PLG_ACTIONLOG_JOOMLA_USER_UPDATE="User <a href='{accountlink}'>{username}</a> updated Joomla from {oldversion} to {version}"
; Component
PLG_ACTIONLOG_JOOMLA_APPLICATION_CONFIG_UPDATED="User <a href='{accountlink}'>{username}</a> changed settings of the application configuration"
PLG_ACTIONLOG_JOOMLA_COMPONENT_CONFIG_UPDATED="User <a href='{accountlink}'>{username}</a> changed settings of the component {extension_name}"
; Extensions
PLG_ACTIONLOG_JOOMLA_EXTENSION_INSTALLED="User <a href='{accountlink}'>{username}</a> installed the {type} {extension_name}"
PLG_ACTIONLOG_JOOMLA_EXTENSION_UNINSTALLED="User <a href='{accountlink}'>{username}</a> uninstalled the {type} {extension_name}"
PLG_ACTIONLOG_JOOMLA_EXTENSION_UPDATED="User <a href='{accountlink}'>{username}</a> updated the {type} {extension_name}"
PLG_ACTIONLOG_JOOMLA_PLUGIN_INSTALLED="User <a href='{accountlink}'>{username}</a> installed the plugin <a href='index.php?option=com_plugins&task=plugin.edit&extension_id={id}'>{extension_name}</a>"
language/en-GB/en-GB.com_slideshowck.sys.ini000060400000000651152453623440014607 0ustar00; license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
; Note : All ini files need to be saved as UTF-8


COM_SLIDESHOWCK="Slideshow CK"
COM_SLIDESHOWCK_DESC="Slideshow CK shows your images and content into a slider. Touch - mobile - responsive - rtl"
SLIDESHOWCK_DESC="Slideshow CK shows your images and content into a slider. Touch - mobile - responsive - rtl"
COM_SLIDESHOWCK_CONFIGURATION="Slideshow CK Configuration"language/en-GB/en-GB.plg_search_icagenda.ini000060400000002047152453623440014540 0ustar00; iCagenda
; Copyright (c)2012-2015 Cyril Rezé (Lyr!C) / JoomliC.com - All rights reserved.
; License GNU General Public License version 3 or later <http://www.gnu.org/licenses/gpl.html>
; Note : All ini files need to be saved as UTF-8
;
; ICAGENDA_PLG_SEARCH	: plg_search_icagenda.ini
; Translation Platform	: https://www.transifex.com/projects/p/icagenda/


ICAGENDA_PLG_SEARCH = "Search - iCagenda"
ICAGENDA_PLG_SEARCH_XML_DESCRIPTION = "The iCagenda Search plugin enables searching in events."

ICAGENDA_PLG_SEARCH_NAME_LABEL = "Section"
ICAGENDA_PLG_SEARCH_NAME_DESC = "By default, search will use 'Events' as the section name in the search form. If you wish to use an alternative term for events, you can enter the value in this field."

ICAGENDA_PLG_SEARCH_TARGET_LABEL = "Target"
ICAGENDA_PLG_SEARCH_TARGET_DESC = "Target browser window when the link to an event is clicked."

ICAGENDA_PLG_SEARCH_SECTION_EVENTS = "Events"

ICAGENDA_PLG_SEARCH_ALERT_NO_ICAGENDA_MENUITEM = "Searching in events disabled: no menu item to the list of events is published."
language/en-GB/en-GB.com_contact.sys.ini000060400000002721152453623440013723 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_CONTACT="Contacts"
COM_CONTACT_CATEGORIES="Categories"
COM_CONTACT_CATEGORIES_VIEW_DEFAULT_DESC="Shows a list of contact categories within a category."
COM_CONTACT_CATEGORIES_VIEW_DEFAULT_OPTION="Default"
COM_CONTACT_CATEGORIES_VIEW_DEFAULT_TITLE="List All Contact Categories"
COM_CONTACT_CATEGORY_ADD_TITLE="Contacts: New Category"
COM_CONTACT_CATEGORY_EDIT_TITLE="Contacts: Edit Category"
COM_CONTACT_CATEGORY_VIEW_DEFAULT_DESC="This view lists the contacts in a category."
COM_CONTACT_CATEGORY_VIEW_DEFAULT_OPTION="Default"
COM_CONTACT_CATEGORY_VIEW_DEFAULT_TITLE="List Contacts in a Category"
COM_CONTACT_CONTACT_VIEW_DEFAULT_DESC="This links to the contact information for one contact."
COM_CONTACT_CONTACT_VIEW_DEFAULT_OPTION="Default"
COM_CONTACT_CONTACT_VIEW_DEFAULT_TITLE="Single Contact"
COM_CONTACT_CONTENT_TYPE_CONTACT="Contact"
COM_CONTACT_CONTENT_TYPE_CATEGORY="Contact Category"
COM_CONTACT_FEATURED_VIEW_DEFAULT_DESC="This view lists the featured contacts."
COM_CONTACT_FEATURED_VIEW_DEFAULT_OPTION="Default"
COM_CONTACT_FEATURED_VIEW_DEFAULT_TITLE="Featured Contacts"
COM_CONTACT_CONTACTS="Contacts"
COM_CONTACT_TAGS_CONTACT="Contact"
COM_CONTACT_TAGS_CATEGORY="Contact Category"
COM_CONTACT_XML_DESCRIPTION="This component shows a listing of Contact Information."
language/en-GB/en-GB.plg_fields_list.ini000060400000001355152453623440013762 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_LIST="Fields - List"
PLG_FIELDS_LIST_LABEL="List (%s)"
PLG_FIELDS_LIST_PARAMS_MULTIPLE_DESC="Allow multiple values to be selected."
PLG_FIELDS_LIST_PARAMS_MULTIPLE_LABEL="Multiple"
PLG_FIELDS_LIST_PARAMS_OPTIONS_DESC="The values of the list."
PLG_FIELDS_LIST_PARAMS_OPTIONS_LABEL="List Values"
PLG_FIELDS_LIST_PARAMS_OPTIONS_VALUE_LABEL="Value"
PLG_FIELDS_LIST_PARAMS_OPTIONS_NAME_LABEL="Text"
PLG_FIELDS_LIST_XML_DESCRIPTION="This plugin lets you create new fields of type 'list' in any extensions where custom fields are supported."
language/en-GB/en-GB.plg_quickicon_privacycheck.sys.ini000060400000000664152453623440017020 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_QUICKICON_PRIVACYCHECK="Quick Icon - Joomla! Privacy Requests Notification"
PLG_QUICKICON_PRIVACYCHECK_XML_DESCRIPTION="Checks for privacy requests that need to be handled and notifies you when you visit the Control Panel page."
language/en-GB/en-GB.plg_editors-xtd_image.ini000060400000000677152453623440015077 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS-XTD_IMAGE="Button - Image"
PLG_IMAGE_BUTTON_IMAGE="Image"
PLG_IMAGE_XML_DESCRIPTION="Displays a button to insert images into an Article. Displays a popup allowing you to configure an image's properties and upload new image files."

language/en-GB/en-GB.plg_quickicon_phpversioncheck.ini000060400000004237152453623440016723 0ustar00; Joomla! Project
; (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_QUICKICON_PHPVERSIONCHECK="Quick Icon - PHP Version Check"
; Key 1 is the server's current PHP version, key 2 is the date at which support will end for the current PHP version
PLG_QUICKICON_PHPVERSIONCHECK_SECURITY_ONLY="Your PHP version, %1$s, is only receiving security fixes from the PHP project at this time. This means your PHP version will soon no longer be supported. We recommend planning to upgrade to a newer PHP version before it reaches end of support on %2$s. Joomla will be faster and more secure if you upgrade to a newer PHP version. Please contact your host for upgrade instructions."
; Key 1 is the server's current PHP version, key 2 is the recommended PHP version, and key 3 is the date at which support will end for the recommended PHP version
PLG_QUICKICON_PHPVERSIONCHECK_UNSUPPORTED="We have detected that your server is using PHP %1$s which is obsolete and no longer receives official security updates by its developers. The Joomla! Project recommends upgrading your site to PHP %2$s or later which will receive security updates at least until %3$s. Please ask your host to make PHP %2$s or a later version the default version for your site. If your host is already PHP %2$s ready please enable PHP %2$s on your site's root and 'administrator' directories – typically you can do this yourself through a tool in your hosting control panel, but it's best to ask your host if you are unsure."
; Key 1 is the server's current PHP version
PLG_QUICKICON_PHPVERSIONCHECK_UNSUPPORTED_JOOMLA_OUTDATED="We have detected that your server is using PHP %1$s which is obsolete and no longer receives official security updates by its developers. Furthermore, we cannot recommend a newer PHP version because you are using an outdated Joomla! version. We recommend updating Joomla! and then following further PHP upgrade instructions."
PLG_QUICKICON_PHPVERSIONCHECK_XML_DESCRIPTION="Checks the support status of your installation's PHP version and raises a warning if not fully supported."
language/en-GB/en-GB.plg_quickicon_joomlaupdate.ini000060400000002057152453623440016212 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_QUICKICON_JOOMLAUPDATE="Quick Icon - Joomla Update Notification"
PLG_QUICKICON_JOOMLAUPDATE_CHECKING="Checking Joomla..."
PLG_QUICKICON_JOOMLAUPDATE_ERROR="Unknown Joomla..."
PLG_QUICKICON_JOOMLAUPDATE_GROUP_DESC="The group of this plugin (this value is compared with the group value used in <strong>Quick Icons</strong> modules to inject icons)."
PLG_QUICKICON_JOOMLAUPDATE_GROUP_LABEL="Group"
PLG_QUICKICON_JOOMLAUPDATE_UPDATEFOUND="Joomla <span class='label label-important'>%s</span>, Update now!"
PLG_QUICKICON_JOOMLAUPDATE_UPDATEFOUND_BUTTON="Update Now"
PLG_QUICKICON_JOOMLAUPDATE_UPDATEFOUND_MESSAGE="Joomla <span class='label label-important'>%s</span> is available:"
PLG_QUICKICON_JOOMLAUPDATE_UPTODATE="Joomla is up to date."
PLG_QUICKICON_JOOMLAUPDATE_XML_DESCRIPTION="Checks for Joomla updates and notifies you when you visit the Control Panel page."
language/en-GB/en-GB.plg_fields_usergrouplist.sys.ini000060400000000634152453623440016552 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_USERGROUPLIST="Fields - Usergrouplist"
PLG_FIELDS_USERGROUPLIST_XML_DESCRIPTION="This plugin lets you create new fields of type 'usergrouplist' in any extensions where custom fields are supported."
language/en-GB/en-GB.plg_xmap_com_content.ini000060400000005706152453623440015022 0ustar00XMAP_CONTENT_PLUGIN_DESCRIPTION="Add support for articles and categories"
XMAP_SETTING_EXPAND_CATEGORIES="Expand Categories"
XMAP_SETTING_EXPAND_CATEGORIES_DESC="Set true if Xmap should include the articles within each category link"
XMAP_SETTING_EXPAND_FEATURED="Expand Featured"
XMAP_SETTING_EXPAND_FEATURED_DESC="Set true if Xmap should include the articles within each &quot;Featured Articles&quot; link (usually the frontpage menu item)"
XMAP_SETTING_INCLUDE_ARCHIVED="Include Archived"
XMAP_SETTING_INCLUDE_ARCHIVED_DESC="Select when should the archived articles be included in the sitemap"
XMAP_SETTING_SHOW_UNAUTH_LINKS="Show Unauthorized Links"
XMAP_SETTING_SHOW_UNAUTH_LINKS_DESC="If yes, will show links to content to registered content even if you are not logged in.  The user will need to login to see the item in full."
XMAP_SETTING_MAX_ART_CAT="Max. Articles per Category"
XMAP_SETTING_MAX_ART_CAT_DESC="Maximum number of articles per category to include in the sitemap (0 for no limit)."
XMAP_SETTING_MAX_ART_AGE="Max. Article's Age in days"
XMAP_SETTING_MAX_ART_AGE_DESC="The maximun number of days that an article must have to be included in the sitemap. (0 for no limit)"
XMAP_SETTING_CAT_PRIORITY="Category Priority"
XMAP_SETTING_CAT_PRIORITY_DESC="Set the priority for the categories"
XMAP_SETTING_CAT_CHANCE_FREQ="Category Change frequency"
XMAP_SETTING_CAT_CHANCE_FREQ_DESC="Set the chage frequency for the categories"
XMAP_SETTING_ART_PRIORITY="Article Priority"
XMAP_SETTING_ART_PRIORITY_DESC="Set the priority for articles"
XMAP_SETTING_ART_CHANCE_FREQ="Article Change frequency"
XMAP_SETTING_ART_CHANCE_FREQ_DESC="Set the chage frequency for articles"
XMAP_SETTING_ADD_PAGEBREAKS_LABEL="Add Pagebreak"
XMAP_SETTING_ADD_PAGEBREAKS_DESC="If yes, will include the sub-pages of the article into the sitemap."
XMAP_SETTING_ADD_IMAGES_LABEL="Add images?"
XMAP_SETTING_ADD_IMAGES_DESC="If yes, will parse the content of the article searching for images to add them to the site map. Valid Only for XML site map (Search engines Sitemap) "
XMAP_NEWS_FIELDSET_LABEL="Google News Sitemap Settings"
XMAP_SETTING_NEWS_KEYWORDS_DESC="Which keywords should we use for Google News Sitemap?"
XMAP_SETTING_NEWS_KEYWORDS_LABEL="Keywords"
XMAP_SETTING_NEWS_KEYWORDS_METAKEYS="Article's Metakeys"
XMAP_SETTING_NEWS_KEYWORDS_CATTITLE="Catetegory Title"
XMAP_SETTING_NEWS_KEYWORDS_METAKEYS_CATTITLE="Article's Metakeys + Category Title"
XMAP_SETTING_NEWS_KEYWORDS_NONE="None"


; Generic Extension settings strings
COM_PLUGINS_BASIC_FIELDSET_LABEL="Basic Settings"
COM_PLUGINS_XML_FIELDSET_LABEL="XML Sitemap Settings"
COM_PLUGINS_NEWS_FIELDSET_LABEL="News Sitemap Settings"
XMAP_OPTION_USE_PARENT_MENU="Use Parent Menu Settings"
XMAP_OPTION_NEVER="Never"
XMAP_OPTION_ALWAYS="Always"
XMAP_OPTION_XML_ONLY="In XML Sitemap Only"
XMAP_OPTION_HTML_ONLY="In HTML Sitemap Only"
XMAP_OPTION_WEEKLY="Weekly"
XMAP_OPTION_DAILY="Daily"
XMAP_OPTION_MONTHLY="Monthly"
XMAP_OPTION_YEARLY="Yearly"
XMAP_OPTION_HOURLY="Hourly"language/en-GB/en-GB.plg_quickicon_eos310.sys.ini000060400000000652152453623440015354 0ustar00; Joomla! Project
; (C) 2021 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_QUICKICON_EOS310="Quick Icon - Joomla! 3.10 End Of Support Notification"
PLG_QUICKICON_EOS310_XML_DESCRIPTION="Checks for the end of support status of Joomla 3.10 and notifies you when visiting the Control Panel page."
language/en-GB/en-GB.com_ajax.ini000060400000001370152453623440012375 0ustar00; Joomla! Project
; (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8


COM_AJAX="Ajax Interface"
COM_AJAX_XML_DESCRIPTION="An extendable Ajax interface for Joomla."
COM_AJAX_SPECIFY_FORMAT="Please specify a valid response format, other than that of HTML, such as json, raw, debug, etc."
COM_AJAX_METHOD_NOT_EXISTS="Method %s does not exist."
COM_AJAX_FILE_NOT_EXISTS="The file at %s does not exist."
COM_AJAX_MODULE_NOT_ACCESSIBLE="Module %s is not published, you do not have access to it, or it's not assigned to the current menu item."
COM_AJAX_TEMPLATE_NOT_ACCESSIBLE="Template %s is not assigned to the current menu item."
language/en-GB/en-GB.plg_editors-xtd_fields.sys.ini000060400000001124152453623440016064 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS-XTD_FIELDS="Button - Field"
PLG_EDITORS-XTD_FIELDS_XML_DESCRIPTION="Displays a button to insert a custom field into an editor area. Displays a popup allowing you to choose the field.<br/><strong>Warning!</strong>: the custom field will not be rendered if the <a href=\"index.php?option=com_plugins&view=plugins&filter[folder]=content\">Content - Fields</a> plugin is not enabled."
language/en-GB/en-GB.com_users.sys.ini000060400000005237152453623440013436 0ustar00; Joomla! Project
; (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_USERS="Users"
COM_USERS_CONTENT_TYPE_CATEGORY="User Notes Category"
COM_USERS_CONTENT_TYPE_NOTE="User Notes"
COM_USERS_CONTENT_TYPE_USER="User"
COM_USERS_GROUPS_VIEW_DEFAULT_DESC="Shows a List of User Groups"
COM_USERS_GROUPS_VIEW_DEFAULT_TITLE="User Groups"
COM_USERS_GROUP_VIEW_EDIT_DESC="Shows a form to create a new User Group"
COM_USERS_GROUP_VIEW_EDIT_TITLE="Create User Group"
COM_USERS_LEVELS_VIEW_DEFAULT_DESC="Shows a List of Access Levels"
COM_USERS_LEVELS_VIEW_DEFAULT_TITLE="Access Levels"
COM_USERS_LEVEL_VIEW_EDIT_DESC="Shows a form to create a new Access Level"
COM_USERS_LEVEL_VIEW_EDIT_TITLE="Create Access Level"
COM_USERS_MAIL_VIEW_DEFAULT_DESC="Shows a form to send mass email to multiple users."
COM_USERS_MAIL_VIEW_DEFAULT_TITLE="Mass Mail Users"
COM_USERS_NOTES_VIEW_DEFAULT_DESC="Shows a List of User Notes"
COM_USERS_NOTES_VIEW_DEFAULT_TITLE="User Notes"
COM_USERS_NOTE_VIEW_EDIT_DESC="Shows a form to create a new User Note"
COM_USERS_NOTE_VIEW_EDIT_TITLE="Create User Note"
COM_USERS_TAGS_CATEGORY="User Note Category"
COM_USERS_USERS_VIEW_DEFAULT_DESC="Shows a List of Users"
COM_USERS_USERS_VIEW_DEFAULT_TITLE="Users"
COM_USERS_USER_VIEW_EDIT_DESC="Shows a form to create a new User Account"
COM_USERS_USER_VIEW_EDIT_TITLE="Create User"
COM_USER_LOGIN_VIEW_DEFAULT_DESC="Displays a login form."
COM_USER_LOGIN_VIEW_DEFAULT_OPTION="Login Form"
COM_USER_LOGIN_VIEW_DEFAULT_TITLE="Login Form"
COM_USER_LOGOUT_VIEW_DEFAULT_DESC="Direct logout and redirect to page."
COM_USER_LOGOUT_VIEW_DEFAULT_OPTION="Logout"
COM_USER_LOGOUT_VIEW_DEFAULT_TITLE="Logout"
COM_USER_PROFILE_EDIT_DEFAULT_DESC="Edit a user profile."
COM_USER_PROFILE_EDIT_DEFAULT_OPTION="Edit User Profile"
COM_USER_PROFILE_EDIT_DEFAULT_TITLE="Edit User Profile"
COM_USER_PROFILE_VIEW_DEFAULT_DESC="Displays a user profile."
COM_USER_PROFILE_VIEW_DEFAULT_OPTION="User Profile"
COM_USER_PROFILE_VIEW_DEFAULT_TITLE="User Profile"
COM_USER_REGISTRATION_VIEW_DEFAULT_DESC="Displays a registration form."
COM_USER_REGISTRATION_VIEW_DEFAULT_OPTION="Default"
COM_USER_REGISTRATION_VIEW_DEFAULT_TITLE="Registration Form"
COM_USER_REMIND_VIEW_DEFAULT_DESC="Displays a username reminder request."
COM_USER_REMIND_VIEW_DEFAULT_OPTION="Default"
COM_USER_REMIND_VIEW_DEFAULT_TITLE="Username Reminder Request"
COM_USER_RESET_VIEW_DEFAULT_DESC="Displays a request to reset password."
COM_USER_RESET_VIEW_DEFAULT_OPTION="Default"
COM_USER_RESET_VIEW_DEFAULT_TITLE="Password Reset"
COM_USERS_XML_DESCRIPTION="Component for managing users."
language/en-GB/en-GB.plg_installer_folderinstaller.ini000060400000000765152453623440016733 0ustar00; Joomla! Project
; (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_INSTALLER_FOLDERINSTALLER_TEXT="Install from Folder"
PLG_INSTALLER_FOLDERINSTALLER_BUTTON="Check and Install"
PLG_INSTALLER_FOLDERINSTALLER_NO_INSTALL_PATH="Please enter a Folder."
PLG_INSTALLER_FOLDERINSTALLER_PLUGIN_XML_DESCRIPTION="This plugin allows you to install packages from a folder."
language/en-GB/en-GB.plg_editors_jce.ini000060400000001346152453623440013753 0ustar00; JCE Project
; Copyright (C) 2006 - 2019 Ryan Demmer. All rights reserved
; GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html

; Note : All ini files need to be saved as UTF-8
PLG_EDITORS_JCE			="Editor - JCE"
WF_EDITOR_PLUGIN_TITLE	="JCE Editor Plugin"
WF_EDITOR_PLUGIN_DESC	="JCE Editor Plugin"

WF_EDITOR_PLUGIN_PARAMS_DESC		="All Editor Parameters are set in the <a href='index.php?option=com_jce&view=config'>JCE Configuration</a> and <a href='index.php?option=com_jce&view=groups'>JCE Editor Profiles</a>"
PLUGIN_REMOVED_LANG_FILE_MISSING	="Plugin disabled. Language file <em>'%s'</em> missing"
COMPONENT_NOT_INSTALLED				="The JCE Administration Component is not installed! The Editor cannot function without it!"
language/en-GB/en-GB.plg_search_icagenda.sys.ini000060400000000767152453623440015364 0ustar00; iCagenda
; Copyright (c)2012-2015 Cyril Rezé (Lyr!C) / JoomliC.com - All rights reserved.
; License GNU General Public License version 3 or later <http://www.gnu.org/licenses/gpl.html>
; Note : All ini files need to be saved as UTF-8
;
; ICAGENDA_PLG_SEARCH	: plg_search_icagenda.sys.ini
; Translation Platform	: https://www.transifex.com/projects/p/icagenda/


ICAGENDA_PLG_SEARCH = "Search - iCagenda"
ICAGENDA_PLG_SEARCH_XML_DESCRIPTION = "The iCagenda Search plugin enables searching in events."
language/en-GB/en-GB.plg_content_contact.sys.ini000060400000000601152453623440015454 0ustar00; Joomla! Project
; (C) 2014 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CONTENT_CONTACT="Content - Contact"
PLG_CONTENT_CONTACT_XML_DESCRIPTION="Provides a link between the content author and the contact item that can be used for an Author Profile."
language/en-GB/en-GB.plg_system_log.ini000060400000000732152453623440013644 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_LOG_XML_DESCRIPTION="Provides logging when the user login fails."
PLG_SYSTEM_LOG="System - User Log"
PLG_SYSTEM_LOG_FIELD_LOG_USERNAME_DESC="This option will log the username used when an authentication fails."
PLG_SYSTEM_LOG_FIELD_LOG_USERNAME_LABEL="Log Usernames"
language/en-GB/en-GB.com_media.sys.ini000060400000000671152453623440013351 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_MEDIA="Media"
COM_MEDIA_MEDIA_VIEW_DEFAULT_DESC="Upload or manage images and other media files on you Joomla! website."
COM_MEDIA_MEDIA_VIEW_DEFAULT_TITLE="Media Manager"
COM_MEDIA_XML_DESCRIPTION="Component for managing site media."
language/en-GB/en-GB.mod_feed.sys.ini000060400000000531152453623440013171 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_FEED="Feed Display"
MOD_FEED_XML_DESCRIPTION="This module allows the displaying of a syndicated feed."
MOD_FEED_LAYOUT_DEFAULT="Default"

language/en-GB/en-GB.com_akeeba.ini000060400000554444152453623440012701 0ustar00;; @package   akeebabackup
;; @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
;; @license   GNU General Public License version 3, or later

AKEEBA_COMMON_UPDATE_UPDATEFOUND="Joomla reports that %s <b>%s</b> is available for installation."
AKEEBA_COMMON_UPDATE_UPDATENOW="Install %s %s"
AKEEBA_COMMON_UPDATE_MOREINFO="More information"
AKEEBA_COMMON_UPDATE_HAVETROUBLE="Trouble updating?"
AKEEBA_COMMON_UPDATE_DISCLAIMER="<span class='akeeba-label--warning'>Disclaimer</span> Extension update information is provided by Joomla running on your site. This message simply relays this information; Akeeba Ltd cannot guarantee its accuracy. Please visit <a href='%s'>our Compatibility page</a> to find the latest available version of %s for Joomla %s and PHP %s installed on your site."
AKEEBA_COMMON_UPDATE_DEVREL_HEADER="The <strong>development release</strong> %s is currently installed on your site."
AKEEBA_COMMON_UPDATE_DEVREL_INFO="Presumably you are using the development release because our support asked you to in order to test a new feature or verify a bug fix. Before installing version %s please make sure that it was released <em>after</em> %s, the date when your currently installed development release was published. Otherwise any new features or bug fixes will be removed. If you are not sure please click on the “More information” button below."

COM_AKEEBA="Akeeba Backup"
COM_AKEEBA_ALICE="Troubleshooter - ALICE"
COM_AKEEBA_ALICE_HEADER_CHECK="Check performed"
COM_AKEEBA_ALICE_HEADER_RESULT="Result"
COM_AKEEBA_ALICE_ANALYZE_RAW_OUTPUT="The log analyzer has detected one or more backup issues. If following this log analyzer's suggestions and our troubleshooting documentation's instructions doesn't work and you have an active subscription on our site please file a new ticket pasting the following <em>log analysis text output</em> to help us provide you with faster support."
COM_AKEEBA_ALICE_ERR_ANALYZEFAILED_HEADER="Log analysis failed"
COM_AKEEBA_ALICE_ERR_ANALYZEFAILED_INFO="The log analysis has been halted. The log analyzer reported the following error:"

COM_AKEEBA_ALICE_ANALYZE="Analyse Log"
COM_AKEEBA_ALICE_ANALYZE_LABEL_PROGRESS="Analysis progress"
COM_AKEEBA_ALICE_ERR_CANNOT_OPEN_LOGFILE="Log file analysis failed: could not open log file %s for reading."
COM_AKEEBA_ALICE_ANALYSIS_REPORT_HEAD="Log analysis is complete"
COM_AKEEBA_ALICE_ANALYSIS_REPORT_LBL_SUMMARY="ALICE finished its log analysis. A total of %d different checks were executed."
COM_AKEEBA_ALICE_ANALYSIS_REPORT_LBL_SUMMARY_SUCCESS="No backup issues were detected."
COM_AKEEBA_ALICE_ANALYSIS_REPORT_LBL_SUMMARY_WARNINGS="We only detected some minor issues which typically do not cause backup failure."
COM_AKEEBA_ALICE_ANALYSIS_REPORT_LBL_SUMMARY_ERRORS="We detected a major issue which may have caused your backup to fail."
COM_AKEEBA_ALICE_ANALYSIS_REPORT_LBL_ERROR="Detected Error"
COM_AKEEBA_ALICE_ANALYSIS_REPORT_LBL_WARNINGS="Detected Warnings"
COM_AKEEBA_ALICE_ANALYSIS_REPORT_LBL_SOLUTION="Possible solution:"
COM_AKEEBA_ALICE_ANALYSIS_REPORT_LBL_NEXTSTEPS="If the solution presented above did not help you solve your issue and you have an active support subscription on our site please file a support request including: 1. a ZIP file with your backup log file; and 2. the text on this page. Please do not include <em>only</em> this information, it will make our replies slower and less accurate. Do try to also describe your backup issue in more detail such as why you believe there is a problem, when the problem started happening, any corrective steps you took yourself and any information you think would be relevant in helping us better understand what is going on."
COM_AKEEBA_ALICE_ANALYSIS_REPORT_LBL_ERRORHELP="If you do not understand what the error above means and you have an active support subscription on our site please file a support request including all of the text on this page. This will let us help you most efficiently. Thank you!"

COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS="Checking system requirements"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_DATABASE="Database type and version"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_DATABASE_SOLUTION="Akeeba Backup only supports MySQL 5.0.47 or later"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_DATABASE_UNSUPPORTED="Your database server is not supported, yet. Detected database type: %s"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_DATABASE_UNKNOWN="We could not detect your database type. Detected type: %s"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_DATABASE_VERSION_TOO_OLD="Database version too old. Detected version: %s"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_DBPERMISSIONS="Database permissions"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_DBPERMISSIONS_ERROR="It seems that you can't execute SHOW TABLE and/or SHOW VIEW statements on your database."
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_DBPERMISSIONS_SOLUTION="Please contact your host"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_MEMORY="Available memory"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_MEMORY_SOLUTION="Please contact your host and ask them for instructions to increase your PHP memory limit."
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_MEMORY_TOO_FEW="Akeeba Backup needs at least 16Mb of available memory. Detected available memory: %sMb"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_PHP_VERSION="PHP version"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_PHP_VERSION_ERR_TOO_OLD="PHP Version too old. Detected version: %s"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_PHP_VERSION_SOLUTION="Akeeba Backup needs PHP 5.6 or PHP 7"

COM_AKEEBA_ALICE_ANALYZE_FILESYSTEM="Checking filesystem errors"
COM_AKEEBA_ALICE_ANALYZE_FILESYSTEM_LARGE_DIRECTORIES_ERROR="The following directories have a very large number of elements: \n%s"
COM_AKEEBA_ALICE_ANALYZE_FILESYSTEM_LARGE_DIRECTORIES_SOLUTION="You should switch the scan engine to <strong>Large Site Scanner</strong>"
COM_AKEEBA_ALICE_ANALYZE_FILESYSTEM_LARGE_FILES_ERROR="The following files are too big and can cause backup issues: \n%s"
COM_AKEEBA_ALICE_ANALYZE_FILESYSTEM_LARGE_FILES_SOLUTION="Please try excluding these files using the Files and Directories Exclusion feature or delete them if you are sure you don't need them on your site."
COM_AKEEBA_ALICE_ANALYZE_FILESYSTEM_LARGE_DIRECTORIES="Large directories"
COM_AKEEBA_ALICE_ANALYZE_FILESYSTEM_LARGE_FILES="Large files issues"
COM_AKEEBA_ALICE_ANALYZE_FILESYSTEM_MULTIPLE_SITES="Multiple Joomla! installations"
COM_AKEEBA_ALICE_ANALYZE_FILESYSTEM_MULTIPLE_SITES_ERROR="Found Joomla! installations in the following subdirectories: \n%s"
COM_AKEEBA_ALICE_ANALYZE_FILESYSTEM_MULTIPLE_SITES_SOLUTION="You should exclude these subdirectories since they could lead to timeout issues."

COM_AKEEBA_ALICE_ANALYZE_RUNTIMEERRORS="Checking runtime errors"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_CORRUPTED_INSTALL="Installation integrity"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_CORRUPTED_INSTALL_ERROR="It seems that your installation is broken. This could happen when the host applies very strict security rules, mistakenly identifying Akeeba Backup files as security threats and deleting or renaming them without asking you."
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_CORRUPTED_INSTALL_SOLUTION="Please re-install Akeeba Backup <strong>without uninstalling it</strong>. If this doesn't help please contact your host at once."
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_DBADD_JSAME="Additional database - Joomla database inclusion"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_DBADD_JSAME_ERROR="You added Joomla database as additional database; some server could refuse a second connection to the same db, resulting in a backup error"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_DBADD_JSAME_SOLUTION="Remove Joomla database from the additional databases"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_DBADD_NO_PROFILE="Could not detect the used profile, test skipped"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_DBADD_WRONG="Additional database - Wrong access details"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_DBADD_WRONG_ERROR="One (or more) additional database has invalid access details"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_DBADD_WRONG_SOLUTION="Please review the connection details of additional databases"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_ERRORFILES="Error log files"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_ERRORFILES_FOUND="Error log files are included inside archive backup:<br/>%s"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_ERRORFILES_SOLUTION="You can exclude these files using the following regular expression: <strong>#(/php_error_cpanel\.|php_error_cpanel\.|/error_)log#</strong>"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_KETTENRAD="Backup engine state saving issues"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_KETTENRAD_SOLUTION="It seems that a single request was processed more than once by your server. This leads to failures during the backup process or corrupted archives; you should contact your host and report this issue."
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_KETTENRAD_STARTING_MORE_ONCE="Trying to start step %s more than once."
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_PART_SIZE="Post-processing engine and archive part size"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_PART_SIZE_ERROR="A post-processing engine is found, but no part size is set; this could lead to timeout issues"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_PART_SIZE_SOLUTION="Set a part size inside backup profile configuration."
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TIMEOUT="Timeout while backing up"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TIMEOUT_KETTENRAD_BROKEN="There is already an issue with the backup engine saving its state. Please fix it before continuing."
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TIMEOUT_MAX_EXECUTION="The backup script reached a timeout limit. Detected timeout: %s"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TIMEOUT_SOLUTION="Please try setting min execution time to 1, max execution time to 10 seconds (or if the PHP timeout is less than 10 seconds, use 75% of the PHP timeout), runtime bias 75%"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TOOMANYROWS="Table row count"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TOOMANYROWS_ERROR="You are trying to backup tables with a lot of rows (more than 1 million):\n%s"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TOOMANYROWS_ROWS="rows"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TOOMANYROWS_SOLUTION="You should exclude these tables using the <strong>Database Tables Exclusion</strong> feature"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TOOMANYROWS_TABLE="Table"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TOOMANYDBS="Number of tables being saved"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TOOMANYDBS_ERROR="You are trying to backup too many tables. Please avoid backing up different Joomla! installation at once."
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TOOMANYDBS_SOLUTION="You can exclude non-core tables using the following regular expression: <strong>!/^#__/</strong>"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_WINCANTAPPEND="Backup archive writing issues"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_WINCANTAPPEND_ERROR="Could not open archive file for append."
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_WINCANTAPPEND_SOLUTION="Please check if you have enough disk space, or if resources are being depleted or if you need to prevent system (Windows) backup and antivirus scanning while the backup takes place."

COM_AKEEBA_BACKUP="Backup Now"
COM_AKEEBA_BACKUP_ANALYSELOG="Analyse Log File (ALICE)"
COM_AKEEBA_BACKUP_ANGIE_PASSWORD_WARNING_1="Your backup restoration script (ANGIE) will only be accessible if you provide the password you have set up in the previous page, before clicking the Backup Now button. If you don't remember setting up a password, your browser has auto-completed the password on the Configuration page <strong>without asking you</strong>. This is done by many password managers and browsers."
COM_AKEEBA_BACKUP_ANGIE_PASSWORD_WARNING_2="Modern browsers and password managers do not allow us to override this behaviour. We have put a JavaScript defense against this kind of non-consensual auto-filling of the password field in the Configuration page. However, if you save the Configuration page within approximately half a second after it loads this defense will not have a chance to run."

COM_AKEEBA_BACKUP_ANGIE_PASSWORD_WARNING_HEADER="WARNING: You have set up an ANGIE password"
COM_AKEEBA_BACKUP_DEFAULT_DESCRIPTION="Backup taken on"
COM_AKEEBA_BACKUP_ERROR_UNWRITABLEOUTPUT_AUTOBACKUP="The automatic backup can not be started because your output directory is not writable. Please follow the instructions below to fix this issue."
COM_AKEEBA_BACKUP_ERROR_UNWRITABLEOUTPUT_COMMON="In order to fix this issue, please go to the <a href=\"%s\">Configuration Page</a> and set the Output Directory to <tt>[DEFAULT_OUTPUT]</tt> (all caps, including the brackets). If this still doesn't work, please take a look <a href=\"%s\">at our troubleshooting instructions</a>"
COM_AKEEBA_BACKUP_ERROR_UNWRITABLEOUTPUT_NORMALBACKUP="Akeeba Backup can not take a backup of your site because the output directory is not writable. Please follow the instructions below to fix this issue."
COM_AKEEBA_BACKUP_ERR_KETTENRAD_TIMEOUT="Akeeba Backup has timed out. Please read the documentation."
COM_AKEEBA_BACKUP_HEADER_BACKUPFAILED="Backup Failed"
COM_AKEEBA_BACKUP_HEADER_BACKUPFINISHED="Backup Completed Successfully"
COM_AKEEBA_BACKUP_HEADER_BACKUPRETRY="Backup Halted and Will Resume Automatically"
COM_AKEEBA_BACKUP_HEADER_BACKUPWITHRETURNURLFINISHED="The process was completed successfully"
COM_AKEEBA_BACKUP_HEADER_STARTNEW="Start a new backup"
COM_AKEEBA_BACKUP_LABEL_COMMENT="Backup comment"
COM_AKEEBA_BACKUP_LABEL_COMMENT_HELP="This will appear in both the Manage Backups page and inside the backup archive (in the installation/README.html file) for your convenience."
COM_AKEEBA_BACKUP_LABEL_DESCRIPTION="Short description"
COM_AKEEBA_BACKUP_LABEL_DESCRIPTION_HELP="This will appear in the Manage Backups page for your convenience."
COM_AKEEBA_BACKUP_LABEL_DETECTEDQUIRKS="Akeeba Backup may not work as expected"
COM_AKEEBA_BACKUP_LABEL_DOMAIN_FINISHED="Finalising the backup process"
COM_AKEEBA_BACKUP_LABEL_DOMAIN_INIT="Initialising backup process"
COM_AKEEBA_BACKUP_LABEL_DOMAIN_INSTALLER="Embedding the installer in the archive"
COM_AKEEBA_BACKUP_LABEL_DOMAIN_PACKDB="Backing up databases"
COM_AKEEBA_BACKUP_LABEL_DOMAIN_PACKING="Backing up files"
COM_AKEEBA_BACKUP_LABEL_PROGRESS="Backup Progress"
COM_AKEEBA_BACKUP_LABEL_QUIRKSLIST="Akeeba Backup detected the following potential problems:"
COM_AKEEBA_BACKUP_LABEL_RESTORE_DEFAULT="Restore default"
COM_AKEEBA_BACKUP_LABEL_START="Backup Now!"
COM_AKEEBA_BACKUP_LABEL_WARNINGS="Warnings"
COM_AKEEBA_BACKUP_STATS="Backup Statistics"
COM_AKEEBA_BACKUP_STATUS_NONE="No backup taken"
COM_AKEEBA_BACKUP_TEXT_AVGWARNING="You are running AVG Antivirus with Link Scanner enabled. This is known to cause backup issues. Please disable the Link Scanner feature if you run into any problems.\n\nAre you sure you want to continue despite this warning?"
COM_AKEEBA_BACKUP_TEXT_BACKINGUP="Please do not browse to another page <strong>or switch to another browser tab / window or another application</strong> unless you see a completion or error message."
COM_AKEEBA_BACKUP_TEXT_BACKUPFAILED="The backup operation has been halted because an error was detected.<br />The last error message was:"
COM_AKEEBA_BACKUP_TEXT_BACKUPFAILEDRETRY="The backup operation has been halted because an error was detected. However, Akeeba Backup will attempt to resume the backup. If you do not want to resume the backup please click the Cancel button below."
COM_AKEEBA_BACKUP_TEXT_BACKUPFINISHED="Backup finished on"
COM_AKEEBA_BACKUP_TEXT_BACKUPHALT="Backup halted"
COM_AKEEBA_BACKUP_TEXT_BACKUPHALT_DESC="The backup will resume in %d seconds"
COM_AKEEBA_BACKUP_TEXT_BACKUPRESUME="Backup resumed on"
COM_AKEEBA_BACKUP_TEXT_BACKUPSTARTED="Backup started on"
COM_AKEEBA_BACKUP_TEXT_BACKUPWARNING="The backup raised a warning"
COM_AKEEBA_BACKUP_TEXT_BTNRESUME="Resume"
COM_AKEEBA_BACKUP_TEXT_CONGRATS="Congratulations! The backup process has completed successfully.<br/>You can now navigate to another page."
COM_AKEEBA_BACKUP_TEXT_LASTERRORMESSAGEWAS="For your information, the last error message was:"
COM_AKEEBA_BACKUP_TEXT_LASTRESPONSE="Last server response %ss ago"
COM_AKEEBA_BACKUP_TEXT_PLEASEWAITFORREDIRECTION="Please wait; you are being redirected to the next page.<br/>This may take 5-30 seconds, depending on your Internet connection."
COM_AKEEBA_BACKUP_TEXT_READLOGFAIL="Please click the 'View Log' button on the toolbar to view the Akeeba Backup log file for further information."
COM_AKEEBA_BACKUP_TEXT_READLOGFAILPRO="Please click the 'Analyse Log' button below have Akeeba Backup analyse its log file for further information."
COM_AKEEBA_BACKUP_TEXT_RTFMTOSOLVE="We strongly recommend going through the step-by-step instructions in our <a href=\"%s\">troubleshooting wizard</a> to easily resolve this issue yourself."
COM_AKEEBA_BACKUP_TEXT_RTFMTOSOLVEPRO="Following the suggestions of ALICE, our log analyser, may not be enough. The automatic log analyser cannot cover all possible problem cases."
COM_AKEEBA_BACKUP_TEXT_SOLVEISSUE_CORE="If this doesn't help, you may consider <a href=\"%s\">buying a subscription</a> so that you can ask for support in our <a href=\"%s\">support ticket system</a>."
COM_AKEEBA_BACKUP_TEXT_SOLVEISSUE_LOG="If you do post to our ticket system, please remember to ZIP and attach your <a href=\"%s\">backup log file</a> in your post so that we can help you faster."
COM_AKEEBA_BACKUP_TEXT_SOLVEISSUE_PRO="If this doesn't help, please do not hesitate to ask for support in our <a href=\"%s\">support ticket system</a>. Do note that you need an active subscription to request assistance through the ticket system. If Akeeba Backup Professional was installed on your site by a third party -e.g. your web developer- please do not contact Akeeba Ltd for support. Instead, contact the person who installed the software on your site and request assistance to solve this issue."
COM_AKEEBA_BACKUP_TEXT_WILLRETRY="The backup will resume in"
COM_AKEEBA_BACKUP_TEXT_WILLRETRYSECONDS="seconds"
COM_AKEEBA_BACKUP_TROUBLESHOOTINGDOCS="Troubleshooting Documentation"
COM_AKEEBA_BROWSER_ERR_BASEDIR="The specified directory is subject to open_basedir restrictions. It can neither be used for backup output, nor its contents, if any, can be listed."
COM_AKEEBA_BROWSER_ERR_NONROOT="For your information: This directory is outside your site's web root."
COM_AKEEBA_BROWSER_ERR_NOTEXISTS="The specified directory doesn't exist!"
COM_AKEEBA_BROWSER_LBL_GO="Go"
COM_AKEEBA_BROWSER_LBL_GOPARENT="&lt;up one level&gt;"
COM_AKEEBA_BROWSER_LBL_USE="Use"
COM_AKEEBA_BUADMIN="Manage Backups"
COM_AKEEBA_BUADMIN_BTN_DONTSHOWTHISAGAIN="Got it!"
COM_AKEEBA_BUADMIN_BTN_REMINDME="Remind me next time"
COM_AKEEBA_BUADMIN_ERROR_INVALIDDOWNLOAD="Can't download the file of the specified backup record"
COM_AKEEBA_BUADMIN_ERROR_INVALIDID="Invalid backup record identifier"
COM_AKEEBA_BUADMIN_LABEL_COMMENT="Comment"
COM_AKEEBA_BUADMIN_LABEL_DELETEFILES="Delete Files"
COM_AKEEBA_BUADMIN_LABEL_DESCRIPTION="Description"
COM_AKEEBA_BUADMIN_LABEL_DURATION="Duration"
COM_AKEEBA_BUADMIN_LABEL_HOWDOIRESTORE_LEGEND="How do I restore my backups?"
COM_AKEEBA_BUADMIN_LABEL_HOWDOIRESTORE_TEXT_CORE="<p>You can restore your backups on any server, even a different one than the one you took your backup on. Follow our <a href=\"%s\" target=\"_blank\">video tutorial</a>. You will need to <a href=\"%3$s\" target=\"_blank\">download Akeeba Kickstart Core (free of charge)</a> to extract the backup archives, just like the tutorial tells you to do.</p>"
COM_AKEEBA_BUADMIN_LABEL_HOWDOIRESTORE_TEXT_PRO="<p>It's easy! Select the check box next to a backup entry. Now click on the <em>Restore</em> button in the toolbar.</p><p>If you want to restore to a new, public server you can use the <a href=\"%2$s\">Site Transfer Wizard</a>. If you'd rather do it manually or restore to your own computer or Intranet please watch our <a href=\"%1$s\" target=\"_blank\">video tutorial</a> and <a href=\"%3$s\" target=\"_blank\">download Akeeba Kickstart Core (free of charge)</a>  to extract the backup archives.</p>"
COM_AKEEBA_BUADMIN_LABEL_HOWDOIRESTORE_TEXT_CORE_INFO_ABOUT_PRO="<strong>It <em>can</em> be easier than this.</strong>You can restore backup archives on the same or a different server from Akeeba Backup's interface. No need to transfer files yourself. Find out about these and many more features available exclusively in <a href=\"%s\">Akeeba Backup Professional</a>!"
COM_AKEEBA_BUADMIN_LABEL_ID="ID"
COM_AKEEBA_BUADMIN_LABEL_MANAGEANDDL="Manage &amp; Download"
COM_AKEEBA_BUADMIN_LABEL_NODESCRIPTION="(no description)"
COM_AKEEBA_BUADMIN_LABEL_ORIGIN="Origin"
COM_AKEEBA_BUADMIN_LABEL_ORIGIN_BACKEND="Backend"
COM_AKEEBA_BUADMIN_LABEL_ORIGIN_CLI="Command-line"
COM_AKEEBA_BUADMIN_LABEL_ORIGIN_FRONTEND="Frontend"
COM_AKEEBA_BUADMIN_LABEL_ORIGIN_JSON="JSON API"
COM_AKEEBA_BUADMIN_LABEL_PART="Part %02d"
COM_AKEEBA_BUADMIN_LABEL_PROFILEID="Profile"
COM_AKEEBA_BUADMIN_LABEL_REMOTEFILEMGMT="Manage remotely stored files"
COM_AKEEBA_BUADMIN_LABEL_RESTORE="Restore"
COM_AKEEBA_BUADMIN_LABEL_SIZE="Size"
COM_AKEEBA_BUADMIN_LABEL_START="Backup Start Time"
COM_AKEEBA_BUADMIN_LABEL_STATUS="Status"
COM_AKEEBA_BUADMIN_LABEL_STATUS_FAIL="Failed"
COM_AKEEBA_BUADMIN_LABEL_STATUS_OBSOLETE="Obsolete"
COM_AKEEBA_BUADMIN_LABEL_STATUS_OK="OK"
COM_AKEEBA_BUADMIN_LABEL_STATUS_PENDING="Pending"
COM_AKEEBA_BUADMIN_LABEL_STATUS_REMOTE="Remote"
COM_AKEEBA_BUADMIN_LABEL_TYPE="Type"
COM_AKEEBA_BUADMIN_LBL_ARCHIVEEXISTS="Is my backup archive still available on my server?"
COM_AKEEBA_BUADMIN_LBL_ARCHIVENAME="What's it called?"
COM_AKEEBA_BUADMIN_LBL_ARCHIVENAME_PAST="What was it called?"
COM_AKEEBA_BUADMIN_LBL_ARCHIVEPATH="Where can I find it on my server?"
COM_AKEEBA_BUADMIN_LBL_ARCHIVEPATH_PAST="Where was it on my server?"
COM_AKEEBA_BUADMIN_LBL_BACKUPINFO="Backup Archive Information"
COM_AKEEBA_BUADMIN_LBL_DOWNLOAD_PARTS="Your backup consists of %d part files. You <em>must</em> download all of them and put them in the same directory for the archive extraction and backup restoration to succeed."
COM_AKEEBA_BUADMIN_LBL_DOWNLOAD_TITLE="Downloading through your browser may corrupt the files"
COM_AKEEBA_BUADMIN_LBL_DOWNLOAD_TITLE_NODOWNLOAD="Use FTP or SFTP to download the backup archives"
COM_AKEEBA_BUADMIN_LBL_DOWNLOAD_WARNING="We recommend closing this dialog and using FTP in <code>Binary</code> transfer mode or SFTP to download your backup archives."
COM_AKEEBA_BUADMIN_LBL_DOWNLOAD_WARNING_NODOWNLOAD="Downloading backup archives through the browser will <strong>CORRUPT</strong> the backup archives, making them impossible to restore. Close this dialog and use FTP in <code>Binary</code> transfer mode or SFTP to download your backup archives."
COM_AKEEBA_BUADMIN_LBL_DOWNLOAD_WARNING_NODOWNLOAD_MULTIPART_1="The file you need to download is called <code>%s</code>"
COM_AKEEBA_BUADMIN_LBL_DOWNLOAD_WARNING_NODOWNLOAD_MULTIPART_2="Your backup archive consists of two files with the file name <code>%s</code> and the extensions <code>%s</code> and <code>%s</code>. <strong>IMPORTANT!</strong> You need to download <em>both</em> files. When restoring your site please also upload both files together with <code>kickstart.php</code>. If you fail to do that your backup archive cannot be restored."
COM_AKEEBA_BUADMIN_LBL_DOWNLOAD_WARNING_NODOWNLOAD_MULTIPART="Your backup archive consists of %u files with the file name <code>%s</code> and the extensions <code>%s</code> as well as <code>%s</code> through <code>%s</code>. <strong>IMPORTANT!</strong> You need to download <em>all of these</em> files. When restoring your site please also upload all of these files together with <code>kickstart.php</code>. If you fail to do that your backup archive cannot be restored."
COM_AKEEBA_BUADMIN_LBL_LOGFILEID="Log file ID"
COM_AKEEBA_BUADMIN_LOG_DOWNLOAD="Download"
COM_AKEEBA_BUADMIN_LOG_DOWNLOAD_CONFIRM="Downloading backup archives through your browser is prone\nto failure, file corruption and file truncation due to reasons\nobjectively outside our control (server configuration, site\nconfiguration, third party plugins and browser configuration).\n\nWe VERY STRONGLY recommend that you only ever\ndownload backup archives through FTP in Binary transfer\nmode (do not use Auto or ASCII; it will corrupt your backup\narchives) by using client software such as FileZilla,\n CyberDuck, WinSCP or similar; or by using the\nfile manager feature of your host‘s hosting control panel.\n\nIf you continue with this download you are explicitly agreeing\nthat you are waiving your right to support for any backup\narchive download, extraction or restoration issue and you\nunderstand that any such requests will not be replied to.\n\nAre you sure you want to continue?"
COM_AKEEBA_BUADMIN_LOG_EDITCOMMENT="View / Edit comment"
COM_AKEEBA_BUADMIN_LOG_SAVEDOK="The changes to the backup entry have been saved successfully"
COM_AKEEBA_BUADMIN_LOG_SAVEERROR="The changes to the backup entry have not been saved"
COM_AKEEBA_BUADMIN_MSG_DELETED="Backup entry and archive were deleted successfully"
COM_AKEEBA_BUADMIN_MSG_DELETEDFILE="Backup archive was deleted successfully"
COM_AKEEBA_COMMON_EMAIL_DEAFULT_SUBJECT="You have a new backup part"
COM_AKEEBA_COMMON_PHPVERSIONTOOOLD_WARNING_BODY="Your site is running on PHP %s which has stopped receiving security updates since %s. Using this on a live site is <b>dangerous</b>: unpatched security issues can get your site hacked. Moreover, we can only guarantee support for obsolete versions of PHP after nine months since their end-of-life date. Therefore, support for your version of PHP may be dropped any time after %s. We strongly advise you to ask your host to upgrade your site to PHP %s or later."
COM_AKEEBA_COMMON_PHPVERSIONTOOOLD_WARNING_TITLE="You are using an obsolete PHP version"
COM_AKEEBA_COMMON_UPDATE_INFORMATION_RELOADED="The update information has been reloaded from the server"
COM_AKEEBA_CONFIG="Configuration"
COM_AKEEBA_CONFIG_ADVANCED="Advanced configuration"
COM_AKEEBA_CONFIG_ADVANCED_SBALF_DESC="Akeeba Backup will break the processing step after archiving a large file. When you enable this option, Akeeba Backup will work faster. However, this may result to timeout or Internal Server errors."
COM_AKEEBA_CONFIG_ADVANCED_SBALF_LABEL="Disable step break after large files"
COM_AKEEBA_CONFIG_ADVANCED_SBBD_DESC="Akeeba Backup will break the processing step whenever it starts working on a new domain. This improves the verbosity of the process, but it extends the backup time by 10-20 seconds. When you enable this option, Akeeba Backup will work faster. However, you might experience a jumpy behaviour in the steps reported on the backup page."
COM_AKEEBA_CONFIG_ADVANCED_SBBD_LABEL="Disable step break between domains"
COM_AKEEBA_CONFIG_ADVANCED_SBBLF_DESC="Akeeba Backup will break the processing step before archiving a large file. When you enable this option, Akeeba Backup will work faster. However, this may result to timeout or Internal Server errors."
COM_AKEEBA_CONFIG_ADVANCED_SBBLF_LABEL="Disable step break before large files"
COM_AKEEBA_CONFIG_ADVANCED_SBPA_DESC="Akeeba Backup will break the processing step if it thinks that it will run out of time before it archives a file. This calculation is not entirely accurate and may result in slower backups. When you enable this option, Akeeba Backup will work faster. However, this may result to timeout or Internal Server errors."
COM_AKEEBA_CONFIG_ADVANCED_SBPA_LABEL="Disable proactive step breaking"
COM_AKEEBA_CONFIG_ADVANCED_SBPP_DESC="Akeeba Backup will break the processing step between sub-steps of the backup finalisation and post-processing. This can add about 10 seconds to the overall backup time. When you enable this option, Akeeba Backup will work faster. However, this may result to timeout or Internal Server errors."
COM_AKEEBA_CONFIG_ADVANCED_SBPP_LABEL="Disable step break in finalisation"
COM_AKEEBA_CONFIG_ADVANCED_SETTIMELIMIT_DESC="If your server doesn't run PHP in Safe Mode and supports set_time_limit(), Akeeba Backup will attempt to set an infinite PHP maximum execution time to work around potential timeout issues"
COM_AKEEBA_CONFIG_ADVANCED_SETTIMELIMIT_LABEL="Set an infinite PHP time limit"
COM_AKEEBA_CONFIG_ADVANCED_SETMEMLIMIT_DESC="Tells Akeeba Backup to try and increase PHP's memory limit to a ridiculously high value (16Gb). This allows you to compress larger files and upload larger backup archives using memory-heavy remote storage options such as WebDAV. Note: this only sets the limit for the maximum memory consumption. In most cases, Akeeba Backup's backup engine consumes <em>far less</em> memory than that, typically in the low 20Mb area. Compressing and uploading larger files also requires changing other options in the backup profile's Configuration page."
COM_AKEEBA_CONFIG_ADVANCED_SETMEMLIMIT_LABEL="Set a large memory limit"
COM_AKEEBA_CONFIG_ANGIE_KEY_DESCRIPTION="If you are using the ANGIE embedded installer script you can optionally password-protect it, preventing unauthorised access to the installer. When you run the installer you will be asked to enter this password. Please note that the password is case sensitive, i.e. ABC, abc and Abc are three different passwords."
COM_AKEEBA_CONFIG_ANGIE_KEY_TITLE="ANGIE Password"
COM_AKEEBA_CONFIG_ARBITRARYFEEMAIL_DESC="Send email to this address (leave blank to email all Super Users)"
COM_AKEEBA_CONFIG_ARBITRARYFEEMAIL_LABEL="Email address"
COM_AKEEBA_CONFIG_ARCHIVENAME_DESCRIPTION="Naming template for the backup archive, where applicable. You can use the following macros:<ul><li><b>[HOST]</b> The host name. WARNING! This tag doesn't work in CRON mode.</li><li><b>[DATE]</b> Current date</li><li><b>[TIME_TZ]</b> Current time and timezone</li></ul>More are available; please consult the documentation."
COM_AKEEBA_CONFIG_ARCHIVENAME_TITLE="Backup archive name"
COM_AKEEBA_CONFIG_ARCHIVERENGINE_DESCRIPTION="Defines Akeeba Backup's archive format. Some engines, such as the DirectFTP, do not actually produce archives, but take care of transferring your files to other servers."
COM_AKEEBA_CONFIG_ARCHIVERENGINE_TITLE="Archiver engine"
COM_AKEEBA_CONFIG_AUTORESUME_DESCRIPTION="When this option is unchecked Akeeba Backup will halt the backup when the server responds with an error. When this option is enabled, Akeeba Backup will try to resume the backup by repeating the last step. This only applies to back-end backups. It will also not let you successfully resume all backups which result in an error: only backup attempts temporarily blocked by server CPU usage restrictions or network outage issues can be resumed."
COM_AKEEBA_CONFIG_AUTORESUME_MAXRETRIES_DESCRIPTION="How many times should Akeeba Backup retry resuming the backup before finally giving up. 3 to 5 retries work best on most servers."
COM_AKEEBA_CONFIG_AUTORESUME_MAXRETRIES_TITLE="Maximum retries of a backup step after an AJAX error"
COM_AKEEBA_CONFIG_AUTORESUME_TIMEOUT_DESCRIPTION="How many seconds to wait before resuming the backup. It is advisable to set this to 30 seconds or more (120 seconds is recommended in most cases) to give your server the necessary time to unblock the backup process before Akeeba Backup retries to complete it."
COM_AKEEBA_CONFIG_AUTORESUME_TIMEOUT_TITLE="Wait period before retrying the backup step"
COM_AKEEBA_CONFIG_AUTORESUME_TITLE="Resume backup after an AJAX error has occurred"
COM_AKEEBA_CONFIG_AUTOUPDATE_NOTIFY="Notify only"
COM_AKEEBA_CONFIG_AUTOUPDATE_NOTIFY_UPDATE="Notify and update"
COM_AKEEBA_CONFIG_AUTOUPDATE_SETTINGS_DESC="What should the auto-update CLI script do?"
COM_AKEEBA_CONFIG_AUTOUPDATE_SETTINGS_LABEL="Auto-update CLI settings"
COM_AKEEBA_CONFIG_AUTOUPDATE_UPDATE="Update only"
COM_AKEEBA_CONFIG_AZURE_ACCOUNTNAME_DESCRIPTION="The name of your account. If your endpoint is foobar.blob.core.windows.net then your account name is <b>foobar</b> and you must type <em>foobar</em> in this box."
COM_AKEEBA_CONFIG_AZURE_ACCOUNTNAME_TITLE="Account name"
COM_AKEEBA_CONFIG_AZURE_CONTAINER_DESCRIPTION="The Windows Azure BLOB Storage container to hold the backup archives. The container must already exist."
COM_AKEEBA_CONFIG_AZURE_CONTAINER_TITLE="Container"
COM_AKEEBA_CONFIG_AZURE_DIRECTORY_DESCRIPTION="The directory within the Windows Azure BLOB Storage container to store the backup archives. To store everything on the container's root, please leave blank."
COM_AKEEBA_CONFIG_AZURE_DIRECTORY_TITLE="Directory"
COM_AKEEBA_CONFIG_AZURE_KEY_DESCRIPTION="You can find your Primary Access Key at your account page on windows.azure.com. Copy and paste it here. It always has two equal signs at the end."
COM_AKEEBA_CONFIG_AZURE_KEY_TITLE="Primary Access Key"
COM_AKEEBA_CONFIG_BACKEND_HEADER_DESC="Options instructing Akeeba Backup how to handle back-end scripting"
COM_AKEEBA_CONFIG_BACKEND_HEADER_LABEL="Back-end"
COM_AKEEBA_CONFIG_BACKUPTYPE_ALLDB="All configured databases (archive file)"
COM_AKEEBA_CONFIG_BACKUPTYPE_DBONLY="Main site database only (SQL file)"
COM_AKEEBA_CONFIG_BACKUPTYPE_DESCRIPTION="Which kind of site backup you want Akeeba Backup to perform"
COM_AKEEBA_CONFIG_BACKUPTYPE_FILEONLY="Site files only"
COM_AKEEBA_CONFIG_BACKUPTYPE_FULL="Full site backup"
COM_AKEEBA_CONFIG_BACKUPTYPE_INCFILE="Files only, incremental"
COM_AKEEBA_CONFIG_BACKUPTYPE_INCFULL="Full site, incremental files"
COM_AKEEBA_CONFIG_BACKUPTYPE_TITLE="Backup Type"
COM_AKEEBA_CONFIG_BACTHSIZE_DESCRIPTION="Lowering this value will conserve memory and avoid HTTP 500 errors while backing up huge tables"
COM_AKEEBA_CONFIG_BACTHSIZE_TITLE="Number of rows per batch"
COM_AKEEBA_CONFIG_BIGFILETHRESHOLD_DESCRIPTION="Files over this size will be stored uncompressed, or their processing will span multiple steps (depending on the archiver engine) in order to avoid timeouts. We suggest increasing this value only on fast and reliable servers."
COM_AKEEBA_CONFIG_BIGFILETHRESHOLD_TITLE="Big file threshold"
COM_AKEEBA_CONFIG_BLANKOUTPASS_DESCRIPTION="Removes the username and password of database connections from the backup"
COM_AKEEBA_CONFIG_BLANKOUTPASS_TITLE="Blank out username/password"
COM_AKEEBA_CONFIG_BOX_CHUNKUPLOAD_ENABLE="Enable chunk upload"
COM_AKEEBA_CONFIG_BOX_CHUNKUPLOAD_SIZE="Chunk size"
COM_AKEEBA_CONFIG_BOX_OPENOAUTH_DESC="Click on this button to open a new window where you can log in to your account with the storage provider. Then, please close the popup window and click on the Step 2 button below."
COM_AKEEBA_CONFIG_BOX_OPENOAUTH_TITLE="Authorisation - Start Here"
COM_AKEEBA_CONFIG_BOX_TOKEN_DESC="Click on this button after having clicked on the Authorisation – Start Here button and logged in to your storage provider account."
COM_AKEEBA_CONFIG_BOX_TOKEN_TITLE="Authentication - Step 2"
COM_AKEEBA_CONFIG_CHUNKSIZE_DESCRIPTION="Akeeba Backup processes large file in small chunks, in order to avoid timeouts. This parameter defines the maximum chunk size for this kind of processing."
COM_AKEEBA_CONFIG_CHUNKSIZE_TITLE="Chunk size for large files processing"
COM_AKEEBA_CONFIG_CLIENTSIDEWAIT_DESCRIPTION="When this box is unchecked (default) and the backup step finishes in less time than the configured minimum execution time Akeeba Backup will have the server wait until that time is reached. This may cause some very restrictive servers to kill your backup. Checking this box will implement the waiting period on the browser, working around this limitation. IMPORTANT: This option only applies to back-end backups. Front-end, JSON API (remote) and Command-Line (CLI) backups always implement the wait at the server side."
COM_AKEEBA_CONFIG_CLIENTSIDEWAIT_TITLE="Client-side implementation of minimum execution time"
COM_AKEEBA_CONFIG_CLOUDFILESAPIKEY_DESCRIPTION="Your CloudFiles API key"
COM_AKEEBA_CONFIG_CLOUDFILESAPIKEY_TITLE="API Key"
COM_AKEEBA_CONFIG_CLOUDFILESCONTAINER_DESCRIPTION="The CloudFiles container to hold the backup archives"
COM_AKEEBA_CONFIG_CLOUDFILESCONTAINER_TITLE="Container"
COM_AKEEBA_CONFIG_CLOUDFILESDIRECTORY_DESCRIPTION="The directory within the CloudFiles container to store the backup archives. To store everything on the container's root, please leave blank."
COM_AKEEBA_CONFIG_CLOUDFILESDIRECTORY_TITLE="Directory"
COM_AKEEBA_CONFIG_CLOUDFILESUSERNAME_DESCRIPTION="Your CloudFiles user name"
COM_AKEEBA_CONFIG_CLOUDFILESUSERNAME_TITLE="Username"
COM_AKEEBA_CONFIG_CLOUDME_DIRECTORY_DESCRIPTION="The directory within your CloudMe account where the backup archives will be stored. Leave blank to store files inside the CloudMe folder root."
COM_AKEEBA_CONFIG_CLOUDME_DIRECTORY_TITLE="Directory"
COM_AKEEBA_CONFIG_CLOUDME_PASSWORD_DESCRIPTION="Password"
COM_AKEEBA_CONFIG_CLOUDME_PASSWORD_TITLE="Password"
COM_AKEEBA_CONFIG_CLOUDME_USERNAME_DESCRIPTION="Username"
COM_AKEEBA_CONFIG_CLOUDME_USERNAME_TITLE="Username"
COM_AKEEBA_CONFIG_COUNTQUOTA_ENABLE_DESCRIPTION="When enabled, Akeeba Backup will erase old backup files if they are more than the limit defined below."
COM_AKEEBA_CONFIG_COUNTQUOTA_ENABLE_TITLE="Enable count quota"
COM_AKEEBA_CONFIG_COUNTQUOTA_VALUE_DESCRIPTION="Akeeba Backup will erase old backup files if they are more than the limit defined in this setting. Multi-part backups are considered as <i>one</i> file!<br/><br/><b>Tip</b>: Select Custom and type in your desired value if it's not on the list."
COM_AKEEBA_CONFIG_COUNTQUOTA_VALUE_TITLE="Count quota"
COM_AKEEBA_CONFIG_DATEFORMAT_DESC="Change how the Start date/time of backups is displayed in the Manage Backups page. Leave blank to use the default formatting. You can use the formatting options of PHP's date function, see: http://www.php.net/manual/en/function.date.php"
COM_AKEEBA_CONFIG_DATEFORMAT_LABEL="Date format"
COM_AKEEBA_CONFIG_DELETEAFTER_DESCRIPTION="If enabled, the backup archive will be removed from this server as soon as post-processing finishes successfully."
COM_AKEEBA_CONFIG_DELETEAFTER_TITLE="Delete archive after processing"
COM_AKEEBA_CONFIG_DEREFERENCESYMLINKS_DESCRIPTION="When enabled, symbolic links will be followed just like normal files and directories. When not checked, symbolic links will not be followed. If you are using symbolic links which lead to an infinite link loop, uncheck this option."
COM_AKEEBA_CONFIG_DEREFERENCESYMLINKS_TITLE="Dereference symlinks"
COM_AKEEBA_CONFIG_DESKTOP_NOTIFICATIONS_DESC="Should you be asked to allow desktop notifications to be displayed? Desktop notifications appear when the backups starts, finishes, throws a warning or halts. They are only displayed on compatible browsers (typically: Chrome, Safari, Firefox, Opera) if you give Akeeba Backup the permission to display desktop notifications when prompted in the Control Panel page. This option only controls whether this prompt should be displayed. Once you accept or decline the desktop notification messages permissions this setting has <b>no effect</b>. The only way to enable or disable desktop notifications will be through your browser's settings."
COM_AKEEBA_CONFIG_DESKTOP_NOTIFICATIONS_LABEL="Ask for Desktop Notifications permissions"
COM_AKEEBA_CONFIG_DIRECTFTP_FTPS_DESCRIPTION="If enabled, Akeeba Backup will try to connect to your FTP server using an SSL-encrypted connection. <strong>This is not the same as SFTP, SCP or \"Secure FTP\"!</strong> Do note that if your server doesn't support this method you will get connection errors."
COM_AKEEBA_CONFIG_DIRECTFTP_FTPS_TITLE="Use FTP over SSL (FTPS)"
COM_AKEEBA_CONFIG_DIRECTFTP_HOST_DESCRIPTION="FTP server's host name, without the protocol. This means that <tt>ftp://example.com</tt> is <b>invalid</b> and <tt>example.com</tt> is valid. Akeeba Backup only supports FTP and FTPS servers. It <u>does not</u> support SFTP, SCP and other SSH variants."
COM_AKEEBA_CONFIG_DIRECTFTP_HOST_TITLE="Host name"
COM_AKEEBA_CONFIG_DIRECTFTP_INITDIR_DESCRIPTION="The absolute <b>FTP</b> path to the directory where the files will be uploaded. If unsure, connect to your server with FileZilla, browse to the intended directory and copy the path appearing on the right-hand pane above the directory list. It is usually something short, like <tt>/public_html</tt>."
COM_AKEEBA_CONFIG_DIRECTFTP_INITDIR_TITLE="Initial directory"
COM_AKEEBA_CONFIG_DIRECTFTP_PASSIVE_DESCRIPTION="Use FTP passive mode when transferring data. This is enabled by default as it is the only method which works through firewalls commonly installed on web servers. Do not disable unless you are certain that your web server is not behind a firewall and that your FTP server absolutely requires Active mode file transfers."
COM_AKEEBA_CONFIG_DIRECTFTP_PASSIVE_TITLE="Use passive mode"
COM_AKEEBA_CONFIG_DIRECTFTP_PASSWORD_DESCRIPTION="FTP server's password. It is usually case sensitive. If unsure, please contact your network administrator."
COM_AKEEBA_CONFIG_DIRECTFTP_PASSWORD_TITLE="Password"
COM_AKEEBA_CONFIG_DIRECTFTP_PORT_DESCRIPTION="FTP server's port. The most common setting is 21. If unsure, please contact your network administrator."
COM_AKEEBA_CONFIG_DIRECTFTP_PORT_TITLE="Port"
COM_AKEEBA_CONFIG_DIRECTFTP_TEST_DESCRIPTION="Use this button to test the FTP connection and view the connection errors on failure."
COM_AKEEBA_CONFIG_DIRECTFTP_TEST_FAIL="Could not connect to the remote FTP server."
COM_AKEEBA_CONFIG_DIRECTFTP_TEST_OK="Connection to remote FTP server was established successfully!"
COM_AKEEBA_CONFIG_DIRECTFTP_TEST_TITLE="Test FTP connection"
COM_AKEEBA_CONFIG_DIRECTFTP_USER_DESCRIPTION="FTP server's user name. It is usually case sensitive. If unsure, please contact your network administrator."
COM_AKEEBA_CONFIG_DIRECTFTP_USER_TITLE="User name"
COM_AKEEBA_CONFIG_DIRECTSFTP_HOST_DESCRIPTION="Please enter the host name or IP address of your SFTP server"
COM_AKEEBA_CONFIG_DIRECTSFTP_HOST_TITLE="Host name"
COM_AKEEBA_CONFIG_DIRECTSFTP_INITDIR_DESCRIPTION="Please enter the directory where the files will be uploaded to. If unsure, use an SFTP desktop client, connect to your server, navigate to the desired directory and copy the path displayed in here. The path must be in absolute format, e.g. /users/myusername/public_html"
COM_AKEEBA_CONFIG_DIRECTSFTP_INITDIR_TITLE="Initial directory"
COM_AKEEBA_CONFIG_DIRECTSFTP_PASSWORD_DESCRIPTION="The SFTP password"
COM_AKEEBA_CONFIG_DIRECTSFTP_PASSWORD_TITLE="Password"
COM_AKEEBA_CONFIG_DIRECTSFTP_PORT_DESCRIPTION="The usual port for SFTP connections is 22. If your server is using a different port, please enter it here."
COM_AKEEBA_CONFIG_DIRECTSFTP_PORT_TITLE="Port"
COM_AKEEBA_CONFIG_DIRECTSFTP_TEST_DESCRIPTION="Use this button to test the SFTP connection and view the connection errors on failure."
COM_AKEEBA_CONFIG_DIRECTSFTP_TEST_FAIL="Could not connect to the remote SFTP server. The error message was:"
COM_AKEEBA_CONFIG_DIRECTSFTP_TEST_OK="Successfully connected to the remote SFTP server. Note: the initial directory setting was not tested."
COM_AKEEBA_CONFIG_DIRECTSFTP_TEST_TITLE="Test SFTP connection"
COM_AKEEBA_CONFIG_DIRECTSFTP_USER_DESCRIPTION="The SFTP username. Please note that your SFTP server must allow username/password authentication."
COM_AKEEBA_CONFIG_DIRECTSFTP_USER_TITLE="Username"
COM_AKEEBA_CONFIG_DOWNLOADID_DESC="This is required to enable live updates of the Professional release. Please visit https://www.akeeba.com/my-subscriptions.html to get your personal Download ID."
COM_AKEEBA_CONFIG_DOWNLOADID_LABEL="Download ID"
COM_AKEEBA_CONFIG_DREAMOBJECTS_CLUSTER_TITLE="Cluster"
COM_AKEEBA_CONFIG_DREAMOBJECTS_CLUSTER_DESCRIPTION="Which DreamObjects server cluster you want to use."
COM_AKEEBA_CONFIG_DREAMOBJECTS_CLUSTER_WEST="US West (until October 1st, 2018)"
COM_AKEEBA_CONFIG_DREAMOBJECTS_CLUSTER_EAST="US East (since June 21, 2018)"
COM_AKEEBA_CONFIG_DREAMOBJECTSACCESSKEY_DESCRIPTION="Your DreamObjects Access Key, made available to you under the DreamHost control panel"
COM_AKEEBA_CONFIG_DREAMOBJECTSACCESSKEY_TITLE="Access Key"
COM_AKEEBA_CONFIG_DREAMOBJECTSBUCKET_DESCRIPTION="Your DreamObjects bucket name. Make sure it's typed as shown in the DreamHost control panel"
COM_AKEEBA_CONFIG_DREAMOBJECTSBUCKET_TITLE="Bucket"
COM_AKEEBA_CONFIG_DREAMOBJECTSDIRECTORY_DESCRIPTION="The directory within your bucket where the backup archives will be stored. Leave blank to store files inside the bucket's root."
COM_AKEEBA_CONFIG_DREAMOBJECTSDIRECTORY_TITLE="Directory"
COM_AKEEBA_CONFIG_DREAMOBJECTSLOWERCASE_DESCRIPTION="If enabled, Akeeba Backup will try to change the bucket name to all lowercase letters, i.e. MyBucket will be converted to mybucket. If you have created a bucket with uppercase letters, e.g. MyNewBucket, uncheck this option and make sure the bucket name is spelled exactly as it appears in your DreamHost control panel."
COM_AKEEBA_CONFIG_DREAMOBJECTSLOWERCASE_TITLE="Lowercase bucket name"
COM_AKEEBA_CONFIG_DREAMOBJECTSSECRETKEY_DESCRIPTION="Your DreamObjects Secret Key, made available to you under the DreamHost control panel"
COM_AKEEBA_CONFIG_DREAMOBJECTSSECRETKEY_TITLE="Secret Key"
COM_AKEEBA_CONFIG_DREAMOBJECTSUSESSL_DESCRIPTION="If enabled, a secure (HTTPS) connection will be used when uploading your files. While it increases security of transferred data, it also increases the possibility of backup failure due to timeout."
COM_AKEEBA_CONFIG_DREAMOBJECTSUSESSL_TITLE="Use SSL"
COM_AKEEBA_CONFIG_DROPBOXDIRECTORY_DESCRIPTION="The directory within your Dropbox account where the backup archives will be stored. Leave blank to store files inside the root."
COM_AKEEBA_CONFIG_DROPBOXDIRECTORY_TITLE="Directory"
COM_AKEEBA_CONFIG_DROPBOXTOKENSECRET_DESCRIPTION="First, use the Authorisation – Start Here button above. Then please copy the Access Token and Refresh Token here."
COM_AKEEBA_CONFIG_DROPBOXTOKENSECRET_TITLE="Token Secret Key"
COM_AKEEBA_CONFIG_DROPBOXTOKEN_DESCRIPTION="First, use the Authorisation – Start Here button above. Then please copy the Access Token and Refresh Token here."
COM_AKEEBA_CONFIG_DROPBOXTOKEN_TITLE="Access Token"
COM_AKEEBA_CONFIG_DROPBOXUID_DESCRIPTION="This is the Access Token which connects Akeeba Backup to Dropbox. This is <strong>site-specific</strong> and short lived. If you have multiple sites, you must use the Authorisation – Start Here button on each and every site you want authorise. Please <strong>DO NOT</strong> copy the access or refresh token across multiple sites. It will cause the Dropbox authentication to become out of sync and you'll need to reconnect all of your sites with Dropbox."
COM_AKEEBA_CONFIG_DROPBOXREFRESHTOKEN_TITLE="Refresh Token"
COM_AKEEBA_CONFIG_DROPBOXREFRESHTOKEN_DESCRIPTION="This is the Refresh Token which connects Akeeba Backup to Dropbox. This is <strong>site-specific</strong> and used to re-authorise the Dropbox connection when the short-lived Access Token expires. If you have multiple sites, you must use the Authorisation – Start Here button on each and every site you want authorise. Please <strong>DO NOT</strong> copy the access or refresh token across multiple sites. It will cause the Dropbox authentication to become out of sync and you'll need to reconnect all of your sites with Dropbox."
COM_AKEEBA_CONFIG_DROPBOXUID_TITLE="User ID"
COM_AKEEBA_CONFIG_DUMPENGINE_DESCRIPTION="Defines how Akeeba Backup will process your database(s) in order to produce a database backup file."
COM_AKEEBA_CONFIG_DUMPENGINE_TITLE="Database backup engine"
COM_AKEEBA_CONFIG_DUMP_DIVIDER_COMMON="Common Settings"
COM_AKEEBA_CONFIG_DUMP_DIVIDER_MYSQL="MySQL Settings"
COM_AKEEBA_CONFIG_DUMP_DIVIDER_REVERSE="Reverse engineering database dump settings"
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_DIRECTFTP_DESCRIPTION="Transfers the site files to a remote FTP server, without archiving them first"
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_DIRECTFTP_TITLE="DirectFTP"
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_DIRECTSFTP_DESCRIPTION="Transfers the site files to a remote SFTP server, without archiving them first. WARNING: Your source server needs to have PHP's SSL2 extension installed."
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_DIRECTSFTP_TITLE="DirectSFTP"
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_JPA_DESCRIPTION="An open-source archive format optimised for fast archive creation and extraction using PHP code"
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_JPA_TITLE="JPA format (recommended)"
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_JPS_DESCRIPTION="Creates archives encrypted with the industry-standard AES-128 encryption method, in a format very similar to JPA. Requires either of the mcrypt or openssl PHP extensions to be installed and activated on your site."
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_JPS_TITLE="Encrypted Archives (JPS)"
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_ZIPNATIVE_DESCRIPTION="The ZIP archive will be created using PHP's ZipArchive class. IMPORTANT: This engine does not support archive splitting or symlink handling and can, therefore, lead to backup issues. If you get timeout errors, AJAX errors or Internal Server Error messages you will have to switch to a different archiver engine and enable archive splitting."
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_ZIPNATIVE_TITLE="ZIP using ZipArchive class"
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_ZIP_DESCRIPTION="Standard ZIP files, a.k.a. \"Compressed folders\", natively supported by all leading operating systems"
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_ZIP_TITLE="ZIP format"
COM_AKEEBA_CONFIG_ENGINE_DUMP_NATIVE_DESCRIPTION="Uses PHP code to produce an accurate database dump"
COM_AKEEBA_CONFIG_ENGINE_DUMP_NATIVE_TITLE="Native MySQL backup engine"
COM_AKEEBA_CONFIG_ENGINE_DUMP_REVERSE_TITLE="Reverse engineering database dump engine"
COM_AKEEBA_CONFIG_ENGINE_DUMP_REVERSE_DESCRIPTION="Uses the INFORMATION_SCHEMA views to create a backup of your database. The only one that works on non-MySQL databases. If you are backing up MySQL databases only please use the Native MySQL Backup Engine which is faster and more accurate."

COM_AKEEBA_CONFIG_ENGINE_POSTPROC_AZURE_DESCRIPTION="Uploads the backup archive to Microsoft Windows Azure BLOB Storage."
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_AZURE_TITLE="Upload to Microsoft Windows Azure BLOB Storage"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_CLOUDFILES_DESCRIPTION="Uploads the backup archive to RackSpace CloudFiles.<br/><strong>Remember to set a split archive size of 2-30Mb or you risk backup failure due to timeouts!</strong>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_CLOUDFILES_TITLE="Upload to RackSpace CloudFiles"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_CLOUDME_DESCRIPTION="Uploads the backup archive to CloudMe.<br/><strong>Remember to set a split archive size of 2-30Mb or you risk backup failure due to timeouts!</strong>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_CLOUDME_TITLE="Upload to CloudMe"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_DREAMOBJECTS_DESCRIPTION="Uploads the backup archive to DreamObjects.<br/><strong>Remember to set a split archive size of 2-30Mb or you risk backup failure due to timeouts!</strong>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_DREAMOBJECTS_TITLE="Upload to DreamObjects"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_DROPBOX2_DESCRIPTION="Uploads the backup archive to Dropbox using the Dropbox V2 API. This API is faster and lets you easily connect your Dropbox account to multiple sites."
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_DROPBOX2_TITLE="Upload to Dropbox (v2 API)"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_DROPBOX_DESCRIPTION="Uploads the backup archive to Dropbox. This uses the old API which might go away at any time in the future. We recommend you to use the v2 API method instead."
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_DROPBOX_TITLE="Upload to Dropbox (v1 API)"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_EMAIL_DESCRIPTION="Sends you the backup archive as an email attachment.<br/><strong>Remember to set a split archive size of 1-2Mb or you risk backup failure due to timeouts and memory outage!</strong>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_EMAIL_TITLE="Send by Email"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_FTP_DESCRIPTION="Uploads the backup archive to a remote FTP or FTPS (FTP over Implicit SSL) server.<br/><strong>Remember to set a split archive size of 2-30Mb or you risk backup failure due to timeouts!</strong>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_FTP_TITLE="Upload to Remote FTP server"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_GOOGLEDRIVE_DESCRIPTION="Uploads the backup archive to Google Drive. Please read the documentation."
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_GOOGLEDRIVE_TITLE="Upload to Google Drive"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_GOOGLESTORAGE_DESCRIPTION="Uploads the backup archive to Google Storage using the legacy S3 API emulation. This is deprecated and will be removed in the future. Please use the JSON API option instead.<br/><strong>Remember to set a split archive size of 2-30Mb or you risk backup failure due to timeouts!</strong>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_GOOGLESTORAGE_TITLE="Upload to Google Storage (Legacy S3 API)"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_IDRIVESYNC_DESCRIPTION="Uploads the backup archive to iDriveSync EVS (iDriveSync.com).<br/><strong>Remember to set a split archive size of 2-30Mb or you risk backup failure due to timeouts!</strong>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_IDRIVESYNC_TITLE="Upload to iDriveSync"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_NONE_DESCRIPTION="Leaves the backup archive files on the server"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_NONE_TITLE="No post-processing"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_ONEDRIVE_DESCRIPTION="Uploads the backup archive to Microsoft OneDrive. This only supports personal drives, created using your personal Microsoft Account. It does not support OneDrive for Business and OneDrive accounts created through a school / work account or a Microsoft Office 365 subscription. This upload method will be REMOVED in a future version of Akeeba Backup. Use the Upload To Microsoft OneDrive method instead."
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_ONEDRIVE_TITLE="Upload to Microsoft OneDrive (LEGACY)"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_S3_DESCRIPTION="Uploads the backup archive to Amazon S3. It allows you to use both the new (AWS4) authentication required for newer S3 location and the old (AWS2) authentication required for third party storage providers offerring an S3-compatible API.<br/><strong>If you disable multipart uploads remember to set a split archive size of 2-30Mb or you risk backup failure due to timeouts!</strong><br/>If you want to use Amazon STS instead of an Access and Secret Key please read the documentation."
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_S3_TITLE="Upload to Amazon S3"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_SFTP_DESCRIPTION="Uploads the backup archive to a remote SFTP (SSH) server. This is a file transfer over SSH using a protocol called SFTP which is <em>entirely different</em> to FTP and FTPS.<br/><strong>Remember to set a split archive size of 2-30Mb or you risk backup failure due to timeouts!</strong>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_SFTP_TITLE="Upload to Remote SFTP (SSH) server"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_SUGARSYNC_DESCRIPTION="Uploads the backup archive to SugarSync.<br/><strong>Remember to set a split archive size of 2-30Mb or you risk backup failure due to timeouts!</strong>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_SUGARSYNC_TITLE="Upload to SugarSync"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_WEBDAV_DESCRIPTION="Uploads the backup archive to any storage service that supports WebDAV protocol.<br/><strong>Remember to set a split archive size of 2-30Mb or you risk backup failure due to timeouts!</strong>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_WEBDAV_TITLE="Upload using WebDAV"
COM_AKEEBA_CONFIG_ENGINE_SCAN_LARGE_DESCRIPTION="A file scanner optimised for backing up sites with directories containing hundreds of files (e.g. blogs and news portals)"
COM_AKEEBA_CONFIG_ENGINE_SCAN_LARGE_TITLE="Large Site Scanner"
COM_AKEEBA_CONFIG_ENGINE_SCAN_SMART_DESCRIPTION="Intelligently balances scanning speed and time-out avoidance"
COM_AKEEBA_CONFIG_ENGINE_SCAN_SMART_TITLE="Smart scanner"
COM_AKEEBA_CONFIG_ERR_DECRYPTION="Could not decrypt settings. Your server does not support settings encryption or the encryption key file has been modified or deleted."
COM_AKEEBA_CONFIG_EXTENDEDINSERTS_DESCRIPTION="If checked, the database dump will be made of extended INSERT statements, i.e. a single statement to restore multiple rows of data. It is highly recommended that you keep this option enabled as it will speed up the restoration process and works around query quota limits on restrictive hosts."
COM_AKEEBA_CONFIG_EXTENDEDINSERTS_TITLE="Generate extended INSERTs"
COM_AKEEBA_CONFIG_FAILURE_EMAILADDRESS_DESC="Send email to this address (leave blank to email all Super Users)"
COM_AKEEBA_CONFIG_FAILURE_EMAILADDRESS_LABEL="Email address"
COM_AKEEBA_CONFIG_FAILURE_EMAILBODY_DESC="Leave blank to use the default. You can use all of Akeeba Backup's variables you can use for naming archive files, e.g. [HOST] and [DATE]."
COM_AKEEBA_CONFIG_FAILURE_EMAILBODY_LABEL="Email Body"
COM_AKEEBA_CONFIG_FAILURE_EMAILSUBJECT_DESC="Leave blank to use the default. You can use all of Akeeba Backup's variables you can use for naming archive files, e.g. [HOST] and [DATE]"
COM_AKEEBA_CONFIG_FAILURE_EMAILSUBJECT_LABEL="Email Subject"
COM_AKEEBA_CONFIG_FAILURE_FEBENABLE_DESC="Allows checking for failed backups using a front-end scheduling URL. Please remember to go to Akeeba Backup, click on Options, then the Frontend tab. Set “Enable Legacy Front-end Backup API (remote CRON jobs)” to Yes to enable this feature."
COM_AKEEBA_CONFIG_FAILURE_FEBENABLE_LABEL="Enabled failed backups check from the front-end"
COM_AKEEBA_CONFIG_FAILURE_SEPARATOR="<strong>Check for failed backups</strong>"
COM_AKEEBA_CONFIG_FAILURE_TIMEOUT_DESC="A backup will be considered stuck (failed) after this many seconds of inactivity.<br/>DON'T TOUCH THIS VALUE UNLESS YOU KNOW WHAT YOU'RE DOING!"
COM_AKEEBA_CONFIG_FAILURE_TIMEOUT_LABEL="Stuck backup timeout"
COM_AKEEBA_CONFIG_FEEMAILBODY_DESC="Leave blank to use default. You can use all of Akeeba Backup's variables you can use for naming archive files, e.g. [HOST] and [DATE]. You can also use [PROFILENUMBER] for the current profile's number, [PROFILENAME] for the current profile's name, [PARTCOUNT] for the number of total generated backup archive's parts, [FILELIST] for a list of backup archive parts and [REMOTESTATUS] for an indication on whether the upload to remote storage completed successfully."
COM_AKEEBA_CONFIG_FEEMAILBODY_LABEL="Email Body"
COM_AKEEBA_CONFIG_FEEMAILSUBJECT_DESC="Leave blank to use default. You can use all of Akeeba Backup's variables you can use for naming archive files, e.g. [HOST] and [DATE]"
COM_AKEEBA_CONFIG_FEEMAILSUBJECT_LABEL="Email Subject"
COM_AKEEBA_CONFIG_FRONTENDEMAIL_DESC="Send a notification e-mail after taking a backup with the Front-end Baclup (Legacy API) or JSON API feature."
COM_AKEEBA_CONFIG_FRONTENDEMAIL_LABEL="Email on backup completion"
COM_AKEEBA_CONFIG_FRONTEND_HEADER_DESC="<strong>These options only apply to Akeeba Backup Professional</strong>. Control the remote and scheduled features options for Akeeba Backup. For more information on scheduling backups please check the Scheduling Information page in Akeeba Backup Professional or our documentation."
COM_AKEEBA_CONFIG_FRONTEND_HEADER_LABEL="Front-end backup"
COM_AKEEBA_CONFIG_FTPTEST_BADPREFIX="You are NOT supposed to add the ftp:// prefix to your FTP Hostname. Please remove the ftp:// prefix and retry."
COM_AKEEBA_CONFIG_GOOGLEDRIVE_ACCESSTOKEN_DESCRIPTION="First, use the Authorisation – Start Here button above. Then please copy the Access Token and Refresh Token here."
COM_AKEEBA_CONFIG_GOOGLEDRIVE_ACCESSTOKEN_TITLE="Access Token"
COM_AKEEBA_CONFIG_GOOGLEDRIVE_DIRECTORY_DESCRIPTION="The directory within the Google Drive to store the backup archives. Please use forward slashes. Correct: some/thing. Wrong: some\\thing. A single forward slash means that archives will be stored in the drive's root. READ THE DOCUMENTATION: Paths in Google Drive are ambiguous!"
COM_AKEEBA_CONFIG_GOOGLEDRIVE_DIRECTORY_TITLE="Directory"
COM_AKEEBA_CONFIG_GOOGLEDRIVE_REFRESHTOKEN_TITLE="Refresh Token"
COM_AKEEBA_CONFIG_GOOGLESTORAGEACCESSKEY_DESCRIPTION="Your Google Storage Access Key, made available to you under the Google Cloud Storage key management tool (https://code.google.com/apis/console#:storage:legacy)"
COM_AKEEBA_CONFIG_GOOGLESTORAGEACCESSKEY_TITLE="Access Key"
COM_AKEEBA_CONFIG_GOOGLESTORAGEBUCKET_DESCRIPTION="Your Google Storage bucket name. Make sure it's typed as shown in the Google Cloud Storage browser web application (https://sandbox.google.com/storage)"
COM_AKEEBA_CONFIG_GOOGLESTORAGEBUCKET_TITLE="Bucket"
COM_AKEEBA_CONFIG_GOOGLESTORAGEDIRECTORY_DESCRIPTION="The directory within your bucket where the backup archives will be stored. Leave blank to store files inside the bucket's root."
COM_AKEEBA_CONFIG_GOOGLESTORAGEDIRECTORY_TITLE="Directory"
COM_AKEEBA_CONFIG_GOOGLESTORAGELOWERCASE_DESCRIPTION="If enabled, Akeeba Backup will try to change the bucket name to all lowercase letters, i.e. MyBucket will be converted to mybucket. If you have created a bucket with uppercase letters, e.g. MyNewBucket, uncheck this option and make sure the bucket name is spelled exactly as it appears in your Google Cloud Storage browser web application (https://sandbox.google.com/storage)."
COM_AKEEBA_CONFIG_GOOGLESTORAGELOWERCASE_TITLE="Lowercase bucket name"
COM_AKEEBA_CONFIG_GOOGLESTORAGESECRETKEY_DESCRIPTION="Your Google Storage Secret Key, made available to you under the Google Cloud Storage key management tool (https://code.google.com/apis/console#:storage:legacy)"
COM_AKEEBA_CONFIG_GOOGLESTORAGESECRETKEY_TITLE="Secret Key"
COM_AKEEBA_CONFIG_GOOGLESTORAGEUSESSL_DESCRIPTION="If enabled, a secure (HTTPS) connection will be used when uploading your files. While it increases security of transferred data, it also increases the possibility of backup failure due to timeout."
COM_AKEEBA_CONFIG_GOOGLESTORAGEUSESSL_TITLE="Use SSL"
COM_AKEEBA_CONFIG_GOOGLESTORAGE_STORAGECLASS_TITLE="Storage Class"
COM_AKEEBA_CONFIG_GOOGLESTORAGE_STORAGECLASS_DESCRIPTION="Change the storage class of the uploaded backup archives. “None” means that the files will be stored with the default storage class specified in your bucket. Please note that options other than Standard may be cheaper to store but they may incur additional fees if you download them or delete them. Please consult Google for pricing information."
COM_AKEEBA_CONFIG_GOOGLESTORAGE_STORAGECLASS_NONE="None (let the bucket decide)"
COM_AKEEBA_CONFIG_GOOGLESTORAGE_STORAGECLASS_STANDARD="Standard Storage"
COM_AKEEBA_CONFIG_GOOGLESTORAGE_STORAGECLASS_NEARLINE="Nearline Storage"
COM_AKEEBA_CONFIG_GOOGLESTORAGE_STORAGECLASS_COLDLINE="Coldline Storage"

COM_AKEEBA_CONFIG_HEADER_BASIC="Basic Configuration"
COM_AKEEBA_CONFIG_HEADER_CONFWIZ="Let Akeeba Backup configure itself?"
COM_AKEEBA_CONFIG_HEADER_OPTIONALFILTERS="Optional filters"
COM_AKEEBA_CONFIG_HEADER_QUOTA="Quota management"
COM_AKEEBA_CONFIG_HEADER_TUNING="Fine tuning"
COM_AKEEBA_CONFIG_INSTALLER_DESCRIPTION="When performing a full site backup, Akeeba Backup embeds the restoration script defined here to the archive. This allows a restoration of your site from scratch, without having to install your CMS or Akeeba Backup, even when your site or server is completely destroyed"
COM_AKEEBA_CONFIG_INSTALLER_TITLE="Embedded restoration script"
COM_AKEEBA_CONFIG_JPS_KEY_DESCRIPTION="This key will be used to encrypt your archive's contents. The key is case sensitive, i.e. ABC, abc and Abc are three different passwords. Keep a copy of the password in a safe place! If you lose it there is no way to recover it."
COM_AKEEBA_CONFIG_JPS_KEY_TITLE="Encryption key"
COM_AKEEBA_CONFIG_JPS_PBKDF2USESTATICSALT_TITLE="Archive-wide key expansion"
COM_AKEEBA_CONFIG_JPS_PBKDF2USESTATICSALT_DESCRIPTION="When enabled (default), your password will be expanded to a cryptographic key used throughout the archive. This is fast but in the very unlikely event that an attacker with ample resources manages to reverse engineer the cryptographic key from one encrypted block in the file -without brute forcing your password itself- they can then decrypt the entire backup archive. When disabled a different cryptographic key will be derived from your password on each encrypted block which is MUCH slower but protects you against this type of attack, requiring the attacker to brute force the password which is much slower."
COM_AKEEBA_CONFIG_LARGEDIRTHRESHOLD_DESCRIPTION="When a directory contains over this number of files or directories it is considered \"large\". Therefore, Akeeba Backup will try re-scanning it in the next step to avoid backup timeouts. A value too small will cause the backup to considerably slow down. Increase - unless you get timeout errors - to speed up the backup."
COM_AKEEBA_CONFIG_LARGEDIRTHRESHOLD_TITLE="Large directory threshold"
COM_AKEEBA_CONFIG_LARGEFILE_DESCRIPTION="Files larger than this threshold will be packed in their own step to prevent the possibility of a timeout. Values between 2 and 10Mb work best on most servers."
COM_AKEEBA_CONFIG_LARGEFILE_TITLE="Large file threshold"
COM_AKEEBA_CONFIG_LARGE_DIRTHRESHOLD_DESCRIPTION="How many directories to scan on each step. Recommended setting: 50. Larger values make the backup marginally faster but more likely to time out."
COM_AKEEBA_CONFIG_LARGE_DIRTHRESHOLD_TITLE="Directory scanning batch size"
COM_AKEEBA_CONFIG_LARGE_FILESTHRESHOLD_DESCRIPTION="How many files to scan and compress on each step. Recommended setting: 100. Larger values make the backup marginally faster but more likely to time out or run out of memory."
COM_AKEEBA_CONFIG_LARGE_FILESTHRESHOLD_TITLE="File scanning batch size"
COM_AKEEBA_CONFIG_LBL_CONFWIZ_AFTER="After Akeeba Backup has finished configuring itself you can take a backup or fine tune its configuration manually."
COM_AKEEBA_CONFIG_LBL_CONFWIZ_INTRO="It looks like you have not configured Akeeba Backup yet. Click on the Configuration Wizard button below to let it configure itself."
COM_AKEEBA_CONFIG_LIVEUPDATE_HEADER_DESC="This section is internally used by Akeeba Backup when performing live update checks"
COM_AKEEBA_CONFIG_LIVEUPDATE_HEADER_LABEL="Live update"
COM_AKEEBA_CONFIG_LOGLEVEL_DEBUG="All Information and Debug"
COM_AKEEBA_CONFIG_LOGLEVEL_DESCRIPTION="This option determines how verbose the backup log will be."
COM_AKEEBA_CONFIG_LOGLEVEL_ERROR="Errors only"
COM_AKEEBA_CONFIG_LOGLEVEL_INFO="All Information"
COM_AKEEBA_CONFIG_LOGLEVEL_NONE="None"
COM_AKEEBA_CONFIG_LOGLEVEL_TITLE="Log Level"
COM_AKEEBA_CONFIG_LOGLEVEL_WARNING="Errors and Warnings"
COM_AKEEBA_CONFIG_MAXAGEQUOTA_ENABLE_DESCRIPTION="Automatically remove old backups based on when the day they were taken on. WARNING: ENABLING THIS WILL CAUSE ALL OTHER QUOTA SETTINGS (COUNT AND SIZE) TO BE IGNORED."
COM_AKEEBA_CONFIG_MAXAGEQUOTA_ENABLE_TITLE="Enable maximum backup age quotas"
COM_AKEEBA_CONFIG_MAXAGEQUOTA_KEEPDAY_DESCRIPTION="Backups taken on this day of the month will not be deleted. Leave the default setting, 1, to always preserve the backups taken on the 1st day of the month"
COM_AKEEBA_CONFIG_MAXAGEQUOTA_KEEPDAY_TITLE="Don't delete backups taken on this day of the month"
COM_AKEEBA_CONFIG_MAXAGEQUOTA_MAXDAYS_DESCRIPTION="Backups older than this number of days will be automatically deleted. Leave the default setting, 31, to keep all backups from the last month"
COM_AKEEBA_CONFIG_MAXAGEQUOTA_MAXDAYS_TITLE="Maximum backup age, in days"
COM_AKEEBA_CONFIG_MAXEXECTIME_DESCRIPTION="Each Akeeba Backup step will last <i>at most</i> as long as defined here. Use a value lower than your PHP maximum execution time. Usually, setting this to 10 seconds is adequate, except on very restrictive hosts.<b>Tip</b>: Select Custom and type in your desired value if it's not on the list."
COM_AKEEBA_CONFIG_MAXEXECTIME_TITLE="Maximum execution time"
COM_AKEEBA_CONFIG_MAXPACKET_DESCRIPTION="The maximum size, in bytes, of each extended INSERT statement. It is recommended to keep it low enough so that MySQL doesn't throw an error while restoring your database dump."
COM_AKEEBA_CONFIG_MAXPACKET_TITLE="Max packet size for extended INSERTs"
COM_AKEEBA_CONFIG_MINEXECTIME_DESCRIPTION="Each Akeeba Backup step will last <i>at least</i> as long as defined here. This is required to work around anti-DoS security solutions. If you get 403 Forbidden or AJAX errors, please increase this setting. Setting it to 0 disables this feature.<br/><br/><b>Tip</b>: Select Custom and type in your desired value if it's not on the list."
COM_AKEEBA_CONFIG_MINEXECTIME_TITLE="Minimum execution time"
COM_AKEEBA_CONFIG_MYSQL5FEATURES_ENABLE_DESCRIPTION="When enabled, Akeeba Backup will try to dump these advanced MySQL 5 database entities. If your backup hangs during the backup stage, you might have to disable this."
COM_AKEEBA_CONFIG_MYSQL5FEATURES_ENABLE_TITLE="Dump PROCEDUREs, FUNCTIONs and TRIGGERs"
COM_AKEEBA_CONFIG_MYSQLNOBTREE_TIP="Removes USING BTREE and USING HASH from table index definitions in dump files. This is required for restoring to servers which have either of the indexing engines turned off (e.g. on newest XAMPP versions). WARNING! THIS MAY CAUSE RESTORATION PROBLEMS ON SOME SERVERS."
COM_AKEEBA_CONFIG_MYSQLNOBTREE_TITLE="Skip index engine"
COM_AKEEBA_CONFIG_NODEPENDENCIES_DESCRIPTION="When enabled, Akeeba Backup will not track dependencies between tables and views. Use this only when you have hundreds of database tables and you are not using MySQL VIEWs, FUNCTIONs, PROCEDUREs, TRIGGERs or tables using the (extremely rarely used) TEMPORARY, MEMORY, MERGE or FEDERATED engines."
COM_AKEEBA_CONFIG_NODEPENDENCIES_TITLE="No dependency tracking"
COM_AKEEBA_CONFIG_NOTIFICATION_EMAIL_DESC="The email address that will receive update notifications"
COM_AKEEBA_CONFIG_NOTIFICATION_EMAIL_LABEL="Email for update notifications"
COM_AKEEBA_CONFIG_NOTIFICATION_FREQ_LABEL="Notification frequency"
COM_AKEEBA_CONFIG_NOTIFICATION_TIME_DAY="days"
COM_AKEEBA_CONFIG_NOTIFICATION_TIME_HOUR="hours"
COM_AKEEBA_CONFIG_NOTIFICATION_TIME_LABEL="Notification time"
COM_AKEEBA_CONFIG_NOTIFICATION_TIME_MIN="minutes"
COM_AKEEBA_CONFIG_OBSOLETEQUOTA_ENABLE_DESCRIPTION="Total number of obsolete records (backups whose files have been deleted) to keep in the Manage Backups page. Set to 0 for no limit."
COM_AKEEBA_CONFIG_OBSOLETEQUOTA_ENABLE_TITLE="Obsolete records to keep"
COM_AKEEBA_CONFIG_ONEDRIVE_ACCESSTOKEN_DESCRIPTION="First, use the Authorisation – Start Here button above. Then please copy the Access Token and Refresh Token here. Do NOT share the same token on many sites. Instead, authenticate each site separately."
COM_AKEEBA_CONFIG_ONEDRIVE_ACCESSTOKEN_TITLE="Access Token"

COM_AKEEBA_CONFIG_ONEDRIVE_REFRESHDRIVES_TITLE="Reload the list of Drives"
COM_AKEEBA_CONFIG_ONEDRIVE_DRIVE_TITLE="Drive"
COM_AKEEBA_CONFIG_ONEDRIVE_DRIVE_DESCRIPTION="Choose which Drive (OneDrive Personal, OneDrive for Business or SharePoint) your account has access to will be used to store the backups. You need to finish authentication before this list is populated. Only makes sense when you have access to more than one OneDrive drives (e.g. your Microsoft account is part of an organisation's subscription). If unsure use the “Default Drive” option which uses your default personal Drive — typically equivalent to the first “Drive (OneDrive Personal)” option you see below."
COM_AKEEBA_CONFIG_ONEDRIVE_DRIVE_OPT_PERSONAL="Default Drive"

COM_AKEEBA_CONFIG_ONEDRIVE_DIRECTORY_DESCRIPTION="The directory within the Microsoft OneDrive drive to store the backup archives. Please use forward slashes, not backslahes and always put a forward slash in front. Correct: /some/thing. Wrong: some\\thing. A single forward slash means that archives will be stored in the drive's root."
COM_AKEEBA_CONFIG_ONEDRIVE_DIRECTORY_TITLE="Directory"
COM_AKEEBA_CONFIG_ONEDRIVE_REFRESHTOKEN_DESCRIPTION="First, use the Authorisation – Start Here button above. Then please copy the Access Token and Refresh Token here."
COM_AKEEBA_CONFIG_ONEDRIVE_REFRESHTOKEN_TITLE="Refresh Token"
COM_AKEEBA_CONFIG_OPTIONALFILTERS_DATECONDITIONAL_ENABLED_DESCRIPTION="When enabled, only files modified after a specific date and time will be backed up."
COM_AKEEBA_CONFIG_OPTIONALFILTERS_DATECONDITIONAL_ENABLED_TITLE="Date conditional filter"
COM_AKEEBA_CONFIG_OPTIONALFILTERS_DATECONDITIONAL_START_DESCRIPTION="Akeeba Backup will backup files modified after this date and time. The format is YYYY-MM-DD hh:mm:ss. All dates and times are expressed in your server's timezone."
COM_AKEEBA_CONFIG_OPTIONALFILTERS_DATECONDITIONAL_START_TITLE="Backup files modified after"
COM_AKEEBA_CONFIG_OPTIONALFILTERS_ERRORLOGS_ENABLED_DESCRIPTION="Automatically exclude error log files, e.g. <code>error_log</code>, no matter where they are on the site being backed up. These files change their size while the backup is in progress which may lead to corrupt backups."
COM_AKEEBA_CONFIG_OPTIONALFILTERS_ERRORLOGS_ENABLED_TITLE="Exclude error logs"
COM_AKEEBA_CONFIG_OPTIONALFILTERS_FINDER_ENABLED_DESCRIPTION="When enabled, the contents of the terms and taxonomy tables of Finder (Smart Search) are skipped from the backup. You are strongly recommended to do that for performance reasons. After restoring your site, please go to Components, Smart Search and click on the Index button to rebuild those tables."
COM_AKEEBA_CONFIG_OPTIONALFILTERS_FINDER_ENABLED_TITLE="Skip Finder terms and taxonomy tables"
COM_AKEEBA_CONFIG_OPTIONALFILTERS_HOSTSTATS_ENABLED_DESCRIPTION="When enabled, Akeeba Backup will automatically exclude the most common host-specific folders for storing access statistics for your site. These folders are read-only by your web site user, causing restoration issues if they are backed up."
COM_AKEEBA_CONFIG_OPTIONALFILTERS_HOSTSTATS_ENABLED_TITLE="Exclude host-specific stats folders"
COM_AKEEBA_CONFIG_OUTDIR_DESCRIPTION="This is the directory on your server where Akeeba Backup will store the backup archives and the backup log file. You can use the following macros:<ul><li><b>[DEFAULT_OUTPUT]</b> The default output directory</li><li><b>[SITEROOT]</b> Your site's root directory</li><li><b>[ROOTPARENT]</b> One directory above your site's root</li></ul>"
COM_AKEEBA_CONFIG_OUTDIR_TITLE="Output Directory"
COM_AKEEBA_CONFIG_PARTSIZE_DESCRIPTION="Akeeba Backup can create split (multi-part) archives in order to work around size restrictions under various circumstances. This option defines the maximum size of each archive part. If you reduce it to 0, the multi-part feature is disabled.</br><b>Important:</b>If you are using a data processing engine which transfers archives to a remote location (e.g. cloud storage) use a setting around 1 to 5 Mb for optimal results."
COM_AKEEBA_CONFIG_PARTSIZE_TITLE="Part size for split archives"
COM_AKEEBA_CONFIG_PLATFORM="Site overrides"
COM_AKEEBA_CONFIG_PLATFORM_DBDATABASE_DESCRIPTION="The name of the database to backup. Only used when the site database override checkbox is ticked."
COM_AKEEBA_CONFIG_PLATFORM_DBDATABASE_TITLE="Database name"
COM_AKEEBA_CONFIG_PLATFORM_DBDRIVER_DESCRIPTION="Select the database driver to use when connecting to the site's database. Only used when the site database override checkbox is ticked."
COM_AKEEBA_CONFIG_PLATFORM_DBDRIVER_TITLE="Database driver"
COM_AKEEBA_CONFIG_PLATFORM_DBHOST_DESCRIPTION="The hostname or IP address of the database server. Usually localhost or 127.0.0.1. Only used when the site database override checkbox is ticked."
COM_AKEEBA_CONFIG_PLATFORM_DBHOST_TITLE="Database server hostname"
COM_AKEEBA_CONFIG_PLATFORM_DBPASSWORD_DESCRIPTION="The password to connect to the site's database. Only used when the site database override checkbox is ticked."
COM_AKEEBA_CONFIG_PLATFORM_DBPASSWORD_TITLE="Password"
COM_AKEEBA_CONFIG_PLATFORM_DBPORT_DESCRIPTION="(optional) The port the database server listens to. If you are unsure, leave this option empty to use the default port (3306 for MySQL servers). Only used when the site database override checkbox is ticked."
COM_AKEEBA_CONFIG_PLATFORM_DBPORT_TITLE="Database server port"
COM_AKEEBA_CONFIG_PLATFORM_DBPREFIX_DESCRIPTION="The prefix of the database to backup including the underscore, e.g. <tt>jos_</tt>. Only used when the site database override checkbox is ticked."
COM_AKEEBA_CONFIG_PLATFORM_DBPREFIX_TITLE="Prefix"
COM_AKEEBA_CONFIG_PLATFORM_DBUSERNAME_DESCRIPTION="The username to connect to the site's database. Only used when the site database override checkbox is ticked."
COM_AKEEBA_CONFIG_PLATFORM_DBUSERNAME_TITLE="Username"
COM_AKEEBA_CONFIG_PLATFORM_NEWROOT_DESCRIPTION="When you have enabled the Site Root Override option above, Akeeba Backup will back up all files and directories under this site's root"
COM_AKEEBA_CONFIG_PLATFORM_NEWROOT_TITLE="Force Site Root"
COM_AKEEBA_CONFIG_PLATFORM_OVERRIDEDB_DESCRIPTION="When it is unchecked (default) Akeeba Backup will automatically back up the database the site it is installed in connects to (your Joomla! database). When checked, it will back up a different database, using the connection details you provide below."
COM_AKEEBA_CONFIG_PLATFORM_OVERRIDEDB_TITLE="Site database override"
COM_AKEEBA_CONFIG_PLATFORM_OVERRIDEROOT_DESCRIPTION="When it is unchecked (default) Akeeba Backup will use back up all files and directories under the root of the site it is installed in. When enabled, it will backup files and directories under the directory selected in Force Site Root below."
COM_AKEEBA_CONFIG_PLATFORM_OVERRIDEROOT_TITLE="Site root override"
COM_AKEEBA_CONFIG_POSTPROCFTP_FTPS_DESCRIPTION="If enabled, Akeeba Backup will try to connect to your FTP server using an SSL-encrypted connection. <strong>This is not the same as SFTP, SCP or \"Secure FTP\"!</strong> Do note that if your server doesn't support this method you will get connection errors."
COM_AKEEBA_CONFIG_POSTPROCFTP_FTPS_TITLE="Use FTP over SSL (FTPS)"
COM_AKEEBA_CONFIG_POSTPROCFTP_HOST_DESCRIPTION="FTP server's host name, without the protocol. This means that <tt>ftp://example.com</tt> is <b>invalid</b> and <tt>example.com</tt> is valid. This engine only supports FTP and FTPS servers. It <u>does not</u> support SFTP, SCP and other SSH variants."
COM_AKEEBA_CONFIG_POSTPROCFTP_HOST_TITLE="Host name"
COM_AKEEBA_CONFIG_POSTPROCFTP_INITDIR_DESCRIPTION="The absolute <b>FTP</b> path to the directory where the files will be uploaded. If unsure, connect to your server with FileZilla, browse to the intended directory and copy the path appearing on the right-hand pane above the directory list. It is usually something short, like <tt>/public_html</tt>."
COM_AKEEBA_CONFIG_POSTPROCFTP_INITDIR_TITLE="Initial directory"
COM_AKEEBA_CONFIG_POSTPROCFTP_OPTSUBDIR_DESCRIPTION="The relative path to the initial directory, it will be created if it doesn't exists. Leave it empty to upload the archives directly inside the initial directory. You can use the following macros:<ul><li><b>[HOST]</b> The host name. WARNING! This tag doesn't work in CRON mode.</li><li><b>[DATE]</b> Current date</li><li><b>[TIME]</b> Current time</li></ul>More are available; please consult the documentation."
COM_AKEEBA_CONFIG_POSTPROCFTP_OPTSUBDIR_TITLE="Subdirectory"
COM_AKEEBA_CONFIG_POSTPROCFTP_PASSIVE_DESCRIPTION="Use FTP passive mode when transferring data. This is enabled by default as it is the only method which works through firewalls commonly installed on web servers. Do not deactivate unless you are certain that your web server is not behind a firewall and that your FTP server absolutely requires Active mode file transfers."
COM_AKEEBA_CONFIG_POSTPROCFTP_PASSIVE_TITLE="Use passive mode"
COM_AKEEBA_CONFIG_POSTPROCFTP_PASSWORD_DESCRIPTION="FTP server's password. It is usually case sensitive. If unsure, please contact your network administrator."
COM_AKEEBA_CONFIG_POSTPROCFTP_PASSWORD_TITLE="Password"
COM_AKEEBA_CONFIG_POSTPROCFTP_PORT_DESCRIPTION="FTP server's port. The most common setting is 21. If unsure, please contact your network administrator."
COM_AKEEBA_CONFIG_POSTPROCFTP_PORT_TITLE="Port"
COM_AKEEBA_CONFIG_POSTPROCFTP_TEST_DESCRIPTION="Use this button to test the FTP connection and view the connection errors on failure."
COM_AKEEBA_CONFIG_POSTPROCFTP_TEST_TITLE="Test FTP connection"
COM_AKEEBA_CONFIG_POSTPROCFTP_USER_DESCRIPTION="FTP server's user name. It is usually case sensitive. If unsure, please contact your network administrator."
COM_AKEEBA_CONFIG_POSTPROCFTP_USER_TITLE="User name"
COM_AKEEBA_CONFIG_POSTPROCPARTS_DESCRIPTION="When enabled, Akeeba Backup will run the post-processing engine against each part as soon as it is complete. When disabled, Akeeba Backup will run the post-processing for all parts at the end of the backup process."
COM_AKEEBA_CONFIG_POSTPROCPARTS_TITLE="Process each part immediately"
COM_AKEEBA_CONFIG_POSTPROCSFTP_HOST_DESCRIPTION="SFTP server's host name, without the protocol. This means that <tt>sftp://example.com</tt> or <tt>ssh://example.com</tt> is <b>invalid</b> and must NOT be used, but <tt>example.com</tt> is valid and MUST be used. This engine only supports SFTP (SSH) servers. It <u>does not</u> support FTP, FTPS or any other FTP variant. It requires the PHP SSH2 extension to be installed and enabled."
COM_AKEEBA_CONFIG_POSTPROCSFTP_HOST_TITLE="Host name"
COM_AKEEBA_CONFIG_POSTPROCSFTP_INITDIR_DESCRIPTION="The absolute <b>SFTP</b> path (usually the same as the filesystem path) to the directory where the files will be uploaded. If unsure, connect to your server with FileZilla, browse to the intended directory and copy the path appearing on the right-hand pane above the directory list. It is usually something long, like <tt>/home/myuser/public_html</tt>."
COM_AKEEBA_CONFIG_POSTPROCSFTP_INITDIR_TITLE="Initial directory"
COM_AKEEBA_CONFIG_POSTPROCSFTP_PASSWORD_DESCRIPTION="SFTP server's password. It is usually case sensitive. If unsure, please contact your network administrator."
COM_AKEEBA_CONFIG_POSTPROCSFTP_PASSWORD_TITLE="Password"
COM_AKEEBA_CONFIG_POSTPROCSFTP_PORT_DESCRIPTION="SFTP server's port. The most common setting is 22. If unsure, please contact your network administrator."
COM_AKEEBA_CONFIG_POSTPROCSFTP_PORT_TITLE="Port"
COM_AKEEBA_CONFIG_POSTPROCSFTP_PRIVKEY_DESCRIPTION="READ THE DOCUMENTATION BEFORE USING. The absolute filesystem path to an RSA / DSA private key file used to connect to the remote server. If it's encrypted, enter the passphrase in the password field above. If you have no idea what this is, or if you think you have to ask for support about it, leave it blank and don't ask us about it."
COM_AKEEBA_CONFIG_POSTPROCSFTP_PRIVKEY_TITLE="Private Key File (advanced)"
COM_AKEEBA_CONFIG_POSTPROCSFTP_PUBKEY_DESCRIPTION="READ THE DOCUMENTATION BEFORE USING. The absolute filesystem path to an RSA / DSA public key file used to connect to the remote server. If you have no idea what this is, or if you think you have to ask for support about it, leave it blank and don't ask us about it."
COM_AKEEBA_CONFIG_POSTPROCSFTP_PUBKEY_TITLE="Public Key File (advanced)"
COM_AKEEBA_CONFIG_POSTPROCSFTP_TEST_DESCRIPTION="Use this button to test the SFTP connection and view the connection errors on failure."
COM_AKEEBA_CONFIG_POSTPROCSFTP_TEST_TITLE="Test SFTP connection"
COM_AKEEBA_CONFIG_POSTPROCSFTP_USER_DESCRIPTION="SFTP server's user name. It is usually case sensitive. If unsure, please contact your network administrator."
COM_AKEEBA_CONFIG_POSTPROCSFTP_USER_TITLE="User name"
COM_AKEEBA_CONFIG_POSTPROC_IDRIVESYNC_DIRECTORY_DESCRIPTION="The directory within your iDriveSync account where the backup archives will be stored. Leave blank or set to / to store files inside your account's root."
COM_AKEEBA_CONFIG_POSTPROC_IDRIVESYNC_DIRECTORY_TITLE="Directory"
COM_AKEEBA_CONFIG_POSTPROC_IDRIVESYNC_NEWENDPOINT_DESCRIPTION="Starting from mid-2016, new users have to use the new API endpoint"
COM_AKEEBA_CONFIG_POSTPROC_IDRIVESYNC_NEWENDPOINT_TITLE="Use the new endpoint"
COM_AKEEBA_CONFIG_POSTPROC_IDRIVESYNC_PASSWORD_DESCRIPTION="Your iDriveSync password"
COM_AKEEBA_CONFIG_POSTPROC_IDRIVESYNC_PASSWORD_TITLE="Password"
COM_AKEEBA_CONFIG_POSTPROC_IDRIVESYNC_PVTKEY_DESCRIPTION="Your iDriveSync private key. Only if you are already using a private key in your iDriveSync account."
COM_AKEEBA_CONFIG_POSTPROC_IDRIVESYNC_PVTKEY_TITLE="Private key (optional)"
COM_AKEEBA_CONFIG_POSTPROC_IDRIVESYNC_USERNAME_DESCRIPTION="The username or e-mail address you've used to subscribe to iDriveSync"
COM_AKEEBA_CONFIG_POSTPROC_IDRIVESYNC_USERNAME_TITLE="Username or e-mail"
COM_AKEEBA_CONFIG_PROCEMAIL_ADDRESS_DESCRIPTION="The email address where the backup files will be sent to"
COM_AKEEBA_CONFIG_PROCEMAIL_ADDRESS_TITLE="Email address"
COM_AKEEBA_CONFIG_PROCEMAIL_SUBJECT_DESCRIPTION="The subject of the email (optional). This is option is here to primarily help you distinguish between backups from multiple sites."
COM_AKEEBA_CONFIG_PROCEMAIL_SUBJECT_TITLE="Email subject"
COM_AKEEBA_CONFIG_PROCENGINE_DESCRIPTION="Post-processing engines allow Akeeba Backup to transfer finalised backup archive parts to other servers and remote storage providers."
COM_AKEEBA_CONFIG_PROCENGINE_TITLE="Post-processing engine"
COM_AKEEBA_CONFIG_PUSH_APIKEY_DESC="Go to https://www.pushbullet.com/account and copy the Access Token from that page into the text box here. It is used to send push messages to your account. You may paste several tokens separated by commas. Note: the Access Token is visible to all people who have access to this configuration page."
COM_AKEEBA_CONFIG_PUSH_APIKEY_LABEL="Pushbullet Access Token"
COM_AKEEBA_CONFIG_PUSH_HEADER_DESC="Here you can configure push notifications for backup events to be sent directly to your phone, tablet, notebook or desktop computer. You need to download the free-of-charge, third party application <a href='http://pushbullet.com/'>Pushbullet</a> first."
COM_AKEEBA_CONFIG_PUSH_HEADER_LABEL="Push Notifications"
COM_AKEEBA_CONFIG_PUSH_PREFERENCE_DESC="Should Akeeba Backup send you notifications and, if so, how?"
COM_AKEEBA_CONFIG_PUSH_PREFERENCE_LABEL="Push notifications"
COM_AKEEBA_CONFIG_PUSH_PREFERENCE_OPT_NONE="Disabled"
COM_AKEEBA_CONFIG_PUSH_PREFERENCE_OPT_PUSHBULLET="Pushbullet"
COM_AKEEBA_CONFIG_QUICKICON_DESC="When checked, Akeeba Backup will display an one-click backup icon at the top of the Control Panel page. Clicking on it will activate this profile and take a backup without any further action necessary from you."
COM_AKEEBA_CONFIG_QUICKICON_LABEL="One-click backup icon"
COM_AKEEBA_CONFIG_REMOTEQUOTA_ENABLE_DESCRIPTION="When enabled, the quota settings below will be applied to files stored on remote storage, such as Amazon S3 or remote FTP servers."
COM_AKEEBA_CONFIG_LOCAL_HEAD="Local Files Quotas"
COM_AKEEBA_CONFIG_REMOTE_HEAD="Remote Files Quotas"
COM_AKEEBA_CONFIG_REMOTEQUOTA_ENABLE_TITLE="Enable remote files quotas"
COM_AKEEBA_CONFIG_REMOTEQUOTALATEST_TITLE="Current backup participates in remote file quotas"
COM_AKEEBA_CONFIG_REMOTEQUOTALATEST_DESCRIPTION="When enabled the backup which is in progress participates in the remote file quotas. This can be problematic; if the backup is partially uploaded to the remote storage and the quota settings are such that only the latest backup is preserved you might end up without a valid backup stored remotely. Disabling it will make it less likely that you end up without a valid backup in remote storage at the expense of storing one more backup archive remotely."
COM_AKEEBA_CONFIG_RUNTIMEBIAS_DESCRIPTION="This defines how conservative Akeeba Backup will be when trying to avoid a time-out. The lower this value, the more conservative it gets. If you get time-out errors, please try decreasing both the Maximum Execution Time and this setting.<b>Tip</b>: Select Custom and type in your desired value if it's not on the list."
COM_AKEEBA_CONFIG_RUNTIMEBIAS_TITLE="Execution time bias"
COM_AKEEBA_CONFIG_S3ACCESSKEY_DESCRIPTION="Your Amazon S3 Access Key, made available to you under your personal Amazon Web Services profile page"
COM_AKEEBA_CONFIG_S3ACCESSKEY_TITLE="Access Key"
COM_AKEEBA_CONFIG_S3BUCKET_DESCRIPTION="Your Amazon S3 bucket name"
COM_AKEEBA_CONFIG_S3BUCKET_TITLE="Bucket"
COM_AKEEBA_CONFIG_S3CUSTOMENDPOINT_DESCRIPTION="For use with third party storage services implementing an S3-compatible API. Enter the endpoint (API URL) of the third party storage service's S3-compatible API. IMPORTANT: If you are using Amazon S3 you <strong>MUST LEAVE THIS BLANK</strong>."
COM_AKEEBA_CONFIG_S3CUSTOMENDPOINT_TITLE="Custom endpoint"
COM_AKEEBA_CONFIG_S3DIRECTORY_DESCRIPTION="The directory within your bucket where the backup archives will be stored. Leave blank to store files inside the bucket's root."
COM_AKEEBA_CONFIG_S3DIRECTORY_TITLE="Directory"
COM_AKEEBA_CONFIG_S3LEGACY_DESCRIPTION="When enabled, all uploads to Amazon S3 will be forced to be single part. Use this if you get RequestTimeout errors from the S3 engine when uploading backup parts."
COM_AKEEBA_CONFIG_S3LEGACY_TITLE="Disable multipart uploads"
COM_AKEEBA_CONFIG_S3SECRETKEY_DESCRIPTION="Your Amazon S3 Secret Key, made available to you under your personal Amazon Web Services profile page"
COM_AKEEBA_CONFIG_S3SECRETKEY_TITLE="Secret Key"
COM_AKEEBA_CONFIG_S3USESSL_DESCRIPTION="If enabled, a secure (HTTPS) connection will be used when uploading your files. While it increases security of transferred data, it also increases the possibility of backup failure due to timeout."
COM_AKEEBA_CONFIG_S3USESSL_TITLE="Use SSL"
COM_AKEEBA_CONFIG_SAVENEW_DEFAULT_PROFILE_NAME="New backup profile"
COM_AKEEBA_CONFIG_SAVE_OK="The configuration has been saved"
COM_AKEEBA_CONFIG_SCANENGINE_DESCRIPTION="Defines how Akeeba Backup will crawl your site's files and folders in order to determine which of them have to be backed up."
COM_AKEEBA_CONFIG_SCANENGINE_TITLE="Filesystem scanner engine"
COM_AKEEBA_CONFIG_SECRETWORD_DESC="This password will be used with the Front-end Backup (Legacy API) and JSON API features to protect them against unauthorized access. Akeeba Backup will NOT enable these features unless you use a long, complex password here. Consult the documentation for more information."
COM_AKEEBA_CONFIG_SECRETWORD_LABEL="Secret key"
COM_AKEEBA_CONFIG_SECURITY_HEADER_DESC="Security settings"
COM_AKEEBA_CONFIG_SECURITY_HEADER_LABEL="Security"
COM_AKEEBA_CONFIG_SECURITY_USEENCRYPTION_DESCRIPTION="When enabled, configuration settings are encrypted using the industry-standard AES-128 encryption."
COM_AKEEBA_CONFIG_SECURITY_USEENCRYPTION_LABEL="Use encryption"
COM_AKEEBA_CONFIG_SECURITY_NO_FLUSH_LABEL="No flush()"
COM_AKEEBA_CONFIG_SECURITY_NO_FLUSH_DESCRIPTION="Disables the use of flush() during AJAX operations. Only enable on very broken servers where the backup won't even start."
COM_AKEEBA_CONFIG_SFTPTEST_BADPREFIX="You are NOT supposed to add the sftp:// prefix to your SFTP Hostname. Please remove the sftp:// prefix and retry."
COM_AKEEBA_CONFIG_SIZEQUOTA_ENABLE_DESCRIPTION="When activated, Akeeba Backup will erase old backup files if the total size of backup archives exceeds the value defined below. This setting is applied <b>per profile</b>."
COM_AKEEBA_CONFIG_SIZEQUOTA_ENABLE_TITLE="Enable size quota"
COM_AKEEBA_CONFIG_SIZEQUOTA_VALUE_DESCRIPTION="If the total size of backup archives taken with the current profile exceeds this limit, the oldest backups will be deleted from the server.<br/><br/><b>Tip</b>: Select Custom and type in your desired value if it's not on the list."
COM_AKEEBA_CONFIG_SIZEQUOTA_VALUE_TITLE="Size quota"
COM_AKEEBA_CONFIG_SPLITDBDUMP_DESCRIPTION="Your database dumps will be split in small files to improve compression and avoid file size issues on certain cheap hosts. Ideally, you should use half the size of your Big File Threshold. Set to 0 to disable splitting and creating a single huge dump file per database."
COM_AKEEBA_CONFIG_SPLITDBDUMP_TITLE="Size for split SQL dump files"
COM_AKEEBA_CONFIG_SUGARSYNC_DIRECTORY_DESCRIPTION="Which directory to store the backup files in. If the first part of the directory doesn't match the name of a SugarSync sync folder, the directory will be created inside your Magic Briefcase folder. You may use the same variables you use for backup archive names, e.g. [HOST] for your site's domain name or [DATE] for the current date."
COM_AKEEBA_CONFIG_SUGARSYNC_DIRECTORY_TITLE="Directory"
COM_AKEEBA_CONFIG_SUGARSYNC_EMAIL_DESCRIPTION="The email address for your SugarSync account"
COM_AKEEBA_CONFIG_SUGARSYNC_EMAIL_TITLE="Email"
COM_AKEEBA_CONFIG_SUGARSYNC_PASSWORD_DESCRIPTION="The password for your SugarSync account"
COM_AKEEBA_CONFIG_SUGARSYNC_PASSWORD_TITLE="Password"
COM_AKEEBA_CONFIG_UI_AJAXERRORDLG_TEXT="An error has occurred while waiting for an AJAX response:"
COM_AKEEBA_CONFIG_UI_AJAXERRORDLG_TITLE="AJAX Error"
COM_AKEEBA_CONFIG_UI_BROWSE="Browse..."
COM_AKEEBA_CONFIG_UI_BROWSER_TITLE="Directory Browser"
COM_AKEEBA_CONFIG_UI_CONFIG="Configure..."
COM_AKEEBA_CONFIG_UI_FTPBROWSER_TITLE="FTP Directory Browser"
COM_AKEEBA_CONFIG_UI_REFRESH="Refresh"
COM_AKEEBA_CONFIG_UI_ROOTDIR="Using the site's root for backup output or temporary file storage will lead to backup failure. I am overriding your setting."
COM_AKEEBA_CONFIG_UI_SETTINGS_NOTSECURED="Your server does not support encryption of your configuration settings. We strongly advise you not to store any passwords in the configuration."
COM_AKEEBA_CONFIG_UI_SETTINGS_SECURED="Your settings are secured by 128-bit encryption. You can safely store your passwords in the configuration."
COM_AKEEBA_CONFIG_UI_SFTPBROWSER_TITLE="SFTP Directory Browser"
COM_AKEEBA_CONFIG_UPLOADKICKSTART_DESCRIPTION="When checked a copy of Akeeba Kickstart Professional will be uploaded to the remote storage specified in the Post-processing Engine above (except for the None and Email engines). This makes sense when using FTP or SFTP to transfer your site to a different server: both your backup archive and Kickstart, used to extract it, will be uploaded to your remote server. After the backup is complete you can just launch Kickstart on the remote site and proceed with its restoration. So simple!"
COM_AKEEBA_CONFIG_UPLOADKICKSTART_TITLE="Upload Kickstart to remote storage"
COM_AKEEBA_CONFIG_USAGESTATS_DESC="Help us improve our software by anonymously and automatically reporting your PHP, MySQL and Joomla! versions. This information will help us decide which versions of Joomla!, PHP and MySQL to support in future versions. Note: we do NOT collect your site name, IP address or any other directly or indirectly unique identifying information."
COM_AKEEBA_CONFIG_USAGESTATS_LABEL="Enable anonymous PHP, MySQL and Joomla! version reporting"
COM_AKEEBA_CONFIG_USEDBSTORAGE_DESCRIPTION="Normally, Akeeba Backup is using files inside your Temporary Directory to store temporary data between backup steps. When this option is enabled, Akeeba Backup will use database records instead. On some low quality hosts this option may cause \"MySQL server has gone away\" or a \"MySQL query limit exceeded\" errors during backup."
COM_AKEEBA_CONFIG_USEDBSTORAGE_TITLE="Use database storage for temporary data"
COM_AKEEBA_CONFIG_USEIFRAMES_DESCRIPTION="If enabled, Akeeba Backup will use hidden IFRAMEs instead of the regular AJAX communications to the server. Use only if you experience strange server errors."
COM_AKEEBA_CONFIG_USEIFRAMES_TITLE="Use IFRAMEs instead of AJAX"
COM_AKEEBA_CONFIG_VIRTUALFOLDER_DESCRIPTION="If you have configured any off-site directories, their contents will appear inside the archive as subdirectories of this virtual directory. It is virtual because it doesn't really exist on your server. It only exists inside the backup archive. Make sure the virtual directory name does not clash with an existing directory in order to avoid data loss."
COM_AKEEBA_CONFIG_VIRTUALFOLDER_TITLE="Virtual directory for off-site files"
COM_AKEEBA_CONFIG_WEBDAV_DIRECTORY_TITLE="Directory"
COM_AKEEBA_CONFIG_WEBDAV_DIRECTORY_DESCRIPTION="Directory"
COM_AKEEBA_CONFIG_WEBDAV_PASSWORD_DESCRIPTION="Password"
COM_AKEEBA_CONFIG_WEBDAV_PASSWORD_TITLE="Password"
COM_AKEEBA_CONFIG_WEBDAV_URL_TITLE="WebDAV base URL"
COM_AKEEBA_CONFIG_WEBDAV_URL_DESCRIPTION="WebDAV base URL"
COM_AKEEBA_CONFIG_WEBDAV_USERNAME_DESCRIPTION="Username"
COM_AKEEBA_CONFIG_WEBDAV_USERNAME_TITLE="Username"
COM_AKEEBA_CONFIG_WHERE_ARE_THE_FILTERS="If you are looking for the filters &ndash;e.g. for excluding files, directories and database tables&ndash; please click on the Cancel button to get back to the Control Panel page where you can access these features directly."
COM_AKEEBA_CONFIG_ZIPCDGLUECHUNKSIZE_DESCRIPTION="ZIP files are comprised of a data section and a \"directory\" section. Those sections are processed in parallel by Akeeba Backup and joined during the archive finalisation stage. This parameter determines how much data will be processed at once during this stage. You shouldn't need to change this setting unless you have severe memory exhaustion problems."
COM_AKEEBA_CONFIG_ZIPCDGLUECHUNKSIZE_TITLE="Chunk size for Central Directory processing"
COM_AKEEBA_CONFIGURATION="Akeeba Backup <small>Component Configuration Options</small>"
COM_AKEEBA_CONFWIZ="Configuration Wizard"
COM_AKEEBA_CONFWIZ_AJAX="Checking asynchronous requests to your server"
COM_AKEEBA_CONFWIZ_CONGRATS="Congratulations! You have completed the automatic configuration wizard. You can now test your new configuration by running a backup, or fine-tune them in the Configuration page."
COM_AKEEBA_CONFWIZ_DBOPT="Optimising Database Dump engine settings"
COM_AKEEBA_CONFWIZ_DIRECTORY="Examining Output Directory"
COM_AKEEBA_CONFWIZ_HEADER_FAILED="Configuration Wizard Failure"
COM_AKEEBA_CONFWIZ_HEADER_FINISHED="Finished Benchmarking"
COM_AKEEBA_CONFWIZ_INTROTEXT="The Configuration Wizard runs a series of benchmarks on your server to determine the optimal backup settings for your site. Please do not navigate away from this page. It is normal to appear frozen for periods up to three (3) minutes, depending on your server speed."
COM_AKEEBA_CONFWIZ_MAXEXEC="Optimising the maximum execution time"
COM_AKEEBA_CONFWIZ_MINEXEC="Optimising the minimum execution time"
COM_AKEEBA_CONFWIZ_PROGRESS="Benchmarking in Progress"
COM_AKEEBA_CONFWIZ_SPLITSIZE="Determining the required part size for split archives"
COM_AKEEBA_CONFWIZ_FLUSH="Checking whether <code>flush()</code> works on your server"
COM_AKEEBA_CONFWIZ_UI_CANTDBOPT="Akeeba Backup could not determine the optimal database dump settings. Make sure your server runs on MySQL 5.0 or later and that your database user is allowed to run the SHOW TABLE STATUS command before running this wizard again."
COM_AKEEBA_CONFWIZ_UI_CANTDETERMINEMINEXEC="Could not determine the minimum execution time. This indicates a severe problem communicating with your server. Please try configuring Akeeba Backup manually."
COM_AKEEBA_CONFWIZ_UI_CANTDETERMINEPARTSIZE="Akeeba Backup could not determine a part size suitable for your server. Please ensure you have adequate free space on your account and run this wizard again."
COM_AKEEBA_CONFWIZ_UI_CANTFIXDIRECTORIES="Akeeba Backup could not find a writable output and temporary directory. Please give write permissions to the administrator/components/com_akeeba/backup directory and run this wizard again."
COM_AKEEBA_CONFWIZ_UI_CANTSAVEMAXEXEC="Akeeba Backup could not save the maximum execution time preferences. You will have to configure it manually."
COM_AKEEBA_CONFWIZ_UI_CANTSAVEMINEXEC="Could not save the minimum execution time preference. You will have to configure Akeeba Backup manually."
COM_AKEEBA_CONFWIZ_UI_CANTUSEAJAX="Akeeba Backup could not communicate with your server using an asynchronous AJAX request. Please contact our support ticket system for further instructions."
COM_AKEEBA_CONFWIZ_UI_EXECTOOLOW="Akeeba Backup detected that your server requires a maximum execution time that is too low to be practical. You are better off switching hosts or asking your host to increase PHP's maximum execution time and lift any CPU usage limitations from your account."
COM_AKEEBA_CONFWIZ_UI_MINEXECTRY="Trying %s seconds"
COM_AKEEBA_CONFWIZ_UI_PARTSIZE="Testing a part size of %s Mb"
COM_AKEEBA_CONFWIZ_UI_SAVEMINEXEC="Saving the minimum execution time preference"
COM_AKEEBA_CONFWIZ_UI_SAVINGMAXEXEC="Saving maximum execution time preference"
COM_AKEEBA_CONFWIZ_UI_TRYAJAX="Trying to make an asynchronous AJAX request to your server"
COM_AKEEBA_CONTROLPANEL="Control Panel"
COM_AKEEBA_CONTROLPANEL_WARN_PERMS_L1="Akeeba Backup could not determine the permissions of the <tt>media/com_akeeba</tt> directory."
COM_AKEEBA_CONTROLPANEL_WARN_PERMS_L2="Please do one of the following:"
COM_AKEEBA_CONTROLPANEL_WARN_PERMS_L3A="Activate Joomla!'s FTP mode in Global Configuration"
COM_AKEEBA_CONTROLPANEL_WARN_PERMS_L3B="Change the permissions of the <tt>media/com_akeeba</tt> directory and all of its subdirectories to 0755 and all of its files to 0644 using your FTP client."
COM_AKEEBA_CONTROLPANEL_WARN_PERMS_L4="Akeeba Backup <strong><u>will most likely not work at all</u></strong> if you do not perform these steps. Do not ask for support if you can see this message. All the information you need is already on this message."
COM_AKEEBA_CONTROLPANEL_WARN_WARNING="WARNING"
COM_AKEEBA_CONTROLPANEL_MSG_REBUILTTABLES="<h1>Oops! Your Akeeba Backup database tables are corrupt.</h1><p>Akeeba Backup has detected that its database tables were missing or corrupt and attempted to fix this issue automatically. Please try accessing Akeeba Backup again; this error message should go away and Akeeba Backup should load without a problem. If this message appears again please contact your host and ask them to check the integrity of your database and the permissions of your database user (it needs to be able to create and modify database tables).</p>"
COM_AKEEBA_CPANEL_BTN_FESECRETWORD_RESET="Apply the suggested Secret Key"
COM_AKEEBA_CPANEL_ERR_FESECRETWORD_BANNED="The secret key is a known bad password. Please do not dictionary words, movie / series names, the names of your loved ones or pets."
COM_AKEEBA_CPANEL_ERR_FESECRETWORD_HEADER="The front-end and remote backup features are disabled"
COM_AKEEBA_CPANEL_ERR_FESECRETWORD_INTRO="Your <em>Secret Key</em> is insecure and can be easily guessed. In order to protect your site Akeeba Backup has disabled access to front-end and remote backup until you enter a secure Secret Key. The problem detected is:"
COM_AKEEBA_CPANEL_ERR_FESECRETWORD_RESET="Could not change the Secret Key"
COM_AKEEBA_CPANEL_ERR_FESECRETWORD_TOOSHORT="The secret key is too short. Use a secret key at least 8 characters long."
COM_AKEEBA_CPANEL_ERR_FESECRETWORD_TOOSIMPLE="The secret key is too simple. Try using lower and upper case letters, numbers and punctuation."
COM_AKEEBA_CPANEL_ERR_FESECRETWORD_WHATTODO_COMMON="Alternatively, click the button below to reset the secret key to the suggested value <code>%s</code> In either case you will need to update your remote backup services and/or CRON jobs with the new Secret Key."
COM_AKEEBA_CPANEL_ERR_FESECRETWORD_WHATTODO_JOOMLA="Please click on Options, Front-end and enter a more complex secret key."
COM_AKEEBA_CPANEL_ERR_FESECRETWORD_WHATTODO_SOLO="Please click on System Configuration, Public API and enter a more complex secret key."
COM_AKEEBA_CPANEL_ERR_INVALIDDOWNLOADID="Invalid Download ID format. Please follow our instructions to get your Download ID. Do not enter your username, e-mail address or password in this box."
COM_AKEEBA_CPANEL_HEADER_ADVANCED="Advanced Operations"
COM_AKEEBA_CPANEL_HEADER_BASICOPS="Basic Operations"
COM_AKEEBA_CPANEL_HEADER_INCLUDEEXCLUDE="Include and Exclude Information"
COM_AKEEBA_CPANEL_HEADER_QUICKBACKUP="One-click Backup"
COM_AKEEBA_CPANEL_HEADER_TROUBLESHOOTING="Troubleshooting"
COM_AKEEBA_CPANEL_LABEL_STATUSSUMMARY="Status Summary"
COM_AKEEBA_CPANEL_LBL_STATUS_ERROR="Detected errors prohibit intended operation"
COM_AKEEBA_CPANEL_LBL_STATUS_OK="Akeeba Backup is ready to backup your site"
COM_AKEEBA_CPANEL_LBL_STATUS_WARNING="Akeeba Backup is ready to backup your site, but there are potential issues"
COM_AKEEBA_CPANEL_LBL_UNWRITABLE="Unwritable"
COM_AKEEBA_CPANEL_LBL_WRITABLE="Writable"
COM_AKEEBA_CPANEL_MSG_APPLYDLID="Apply Download ID"
COM_AKEEBA_CPANEL_MSG_FESECRETWORD_RESET="The Secret Key has been changed to <code>%s</code>"
COM_AKEEBA_CPANEL_MSG_MOREINFO="More information"
COM_AKEEBA_CPANEL_MSG_MUSTENTERDLID="You need to enter your Download ID"
COM_AKEEBA_CPANEL_MSG_PASTEDLID="Paste your Download ID and press the button"
COM_AKEEBA_CPANEL_MSG_RELOADUPDATE="Reload update information"
COM_AKEEBA_CPANEL_MSG_UPDATEFOUND="An updated version of Akeeba Backup (<b>%s</b>) is available for installation."
COM_AKEEBA_CPANEL_MSG_UPDATENOW="Update to %s"
COM_AKEEBA_CPANEL_PROFILE_BUTTON="Switch Profiles"
COM_AKEEBA_CPANEL_PROFILE_SWITCH_ERROR="Error switching the active profile"
COM_AKEEBA_CPANEL_PROFILE_SWITCH_OK="Profile changed successfully"
COM_AKEEBA_CPANEL_PROFILE_TITLE="Active Profile"
COM_AKEEBA_CPANEL_WARNING_Q001="Output directory unwritable"
COM_AKEEBA_CPANEL_WARNING_Q003="Using site root as Output or Temporary directory"
COM_AKEEBA_CPANEL_WARNING_Q004="PHP memory_limit too low"
COM_AKEEBA_CPANEL_WARNING_Q101="Output directory is restricted by open_basedir"
COM_AKEEBA_CPANEL_WARNING_Q103="Maximum execution time is too low"
COM_AKEEBA_CPANEL_WARNING_Q104="Temp directory is the same as the site root"
COM_AKEEBA_CPANEL_WARNING_Q106="Your database table name prefix contains one or more uppercase letters"
COM_AKEEBA_CPANEL_WARNING_Q201="Outdated PHP version"
COM_AKEEBA_CPANEL_WARNING_Q202="CRC calculation issue"
COM_AKEEBA_CPANEL_WARNING_Q203="Default output directory in use"
COM_AKEEBA_CPANEL_WARNING_Q204="Disabled functions may affect operation"
COM_AKEEBA_CPANEL_WARNING_Q401="ZIP format selected"
COM_AKEEBA_CPANEL_WARNING_QNONE="No problems detected"
COM_AKEEBA_CPANL_ERR_MBSTRING="<strong>Your version of PHP does not have the mbstring extension installed or activated</strong>. Having it enabled is a Joomla! requirement. Joomla! and Akeeba Backup will not work properly. Please ask your host to enable the mbstring extension on PHP %s running on your server."
COM_AKEEBA_DBFILTER="Database Tables Exclusion"
COM_AKEEBA_DBFILTER_LABEL_EXCLUDENONCORE="Exclude non-core tables"
COM_AKEEBA_DBFILTER_LABEL_NUKEFILTERS="Reset all filters"
COM_AKEEBA_DBFILTER_LABEL_ROOTDIR="Current database:"
COM_AKEEBA_DBFILTER_LABEL_SITEDB="Site's main database"
COM_AKEEBA_DBFILTER_LABEL_TABLES="Database tables, views, procedures, functions and triggers"
COM_AKEEBA_DBFILTER_TABLE_FUNCTION="Stored function"
COM_AKEEBA_DBFILTER_TABLE_MISC="Merge, temporary, memory, federated, blackhole or miscellaneous table type<br/>Its data is never backed up by Akeeba Backup."
COM_AKEEBA_DBFILTER_TABLE_PROCEDURE="Stored procedure"
COM_AKEEBA_DBFILTER_TABLE_TABLE="MyISAM or InnoDB database table"
COM_AKEEBA_DBFILTER_TABLE_TRIGGER="Database trigger"
COM_AKEEBA_DBFILTER_TABLE_VIEW="MySQL View"
COM_AKEEBA_DBFILTER_TYPE_REGEXTABLEDATA="Do not backup a table's contents"
COM_AKEEBA_DBFILTER_TYPE_REGEXTABLES="Exclude a table"
COM_AKEEBA_DBFILTER_TYPE_TABLEDATA="Do not backup its contents"
COM_AKEEBA_DBFILTER_TYPE_TABLES="Exclude this"
COM_AKEEBA_DISCOVER="Import Archives"
COM_AKEEBA_DISCOVER_ERROR_NODIRECTORY="You have not selected a valid directory"
COM_AKEEBA_DISCOVER_ERROR_NOFILES="There are no archive files to import in the selected directory. Please go back and select another directory."
COM_AKEEBA_DISCOVER_ERROR_NOFILESSELECTED="You didn't select any files to import."
COM_AKEEBA_DISCOVER_LABEL_DIRECTORY="Directory"
COM_AKEEBA_DISCOVER_LABEL_FILES="Archive Files Detected"
COM_AKEEBA_DISCOVER_LABEL_GOBACK="Go back to the directory selection"
COM_AKEEBA_DISCOVER_LABEL_IMPORT="Import the files"
COM_AKEEBA_DISCOVER_LABEL_IMPORTDONE="Import operation completed successfully."
COM_AKEEBA_DISCOVER_LABEL_IMPORTEDDESCRIPTION="Imported backup archive"
COM_AKEEBA_DISCOVER_LABEL_S3IMPORT="Are your archives stored on Amazon S3? Click <a href=\"%s\">here</a> to download and import them in a single step!"
COM_AKEEBA_DISCOVER_LABEL_SCAN="Scan for files"
COM_AKEEBA_DISCOVER_LABEL_SELECTDIR="Select a directory containing backup archives"
COM_AKEEBA_DISCOVER_LABEL_SELECTFILES="Please select the files to import. Hold the CTRL or Command key while clicking on the files in order to make a multiple files selection."
COM_AKEEBA_ENGINE_TEXTEXTRACT_DESC="When enabled Akeeba Backup will go through the archive extraction process without writing anything to the disk. This makes sure that the archive is not corrupt. IMPORTANT: this feature will NOT work when the <em>Process each part immediately</em> option is enabled in the Post-processing Engine configuration. Also note that this will increase the time required to complete the backup process and use substantially more memory and CPU resources. Finally do keep in mind that this feature only makes sure the archive can be extracted, it does NOT test whether the database data can be restored or if the restored site works correctly. It's still up to you to do a complete test restoration."
COM_AKEEBA_ENGINE_TEXTEXTRACT_ERR_ENGINENOTFOUND="The restore.php file was not found inside the main directory of Akeeba Backup. The integrity of the backup archive cannot be tested."
COM_AKEEBA_ENGINE_TEXTEXTRACT_ERR_INTEGRITYCHECKFAILED="The integrity check of the backup archive failed. The archive is corrupt. Message received from the extraction engine: %s"
COM_AKEEBA_ENGINE_TEXTEXTRACT_ERR_INVALIDARCHIVERTYPE="The Archiver Engine you have selected is not producing JPA, JPS or ZIP backup archives. The archive integrity check does not apply to this engine. To disable this message please go to the Configuration page and disable the 'Archive integrity check' option."
COM_AKEEBA_ENGINE_TEXTEXTRACT_ERR_PROCESSIMMEDIATELY="You have enabled the 'Process each part immediately' option in the Post-processing Engine. The archive integrity cannot run since some or all of the archive parts are no longer present on your server. You will need to check your backup archives manually. To disable this message please go to the Configuration page and disable the 'Archive integrity check' option."
COM_AKEEBA_ENGINE_TEXTEXTRACT_LBL="Archive integrity check"
COM_AKEEBA_FILEFILTERS="Files and Directories Exclusion"
COM_AKEEBA_FILEFILTERS_EDITOR_TITLE="Edit"
COM_AKEEBA_FILEFILTERS_LABEL_ADDNEWFILTER="Add new filter:"
COM_AKEEBA_FILEFILTERS_LABEL_DIRS="Subdirectories"
COM_AKEEBA_FILEFILTERS_LABEL_FILES="Files"
COM_AKEEBA_FILEFILTERS_LABEL_FILTERITEM="Filter Item"
COM_AKEEBA_FILEFILTERS_LABEL_NORMALVIEW="Browser View"
COM_AKEEBA_FILEFILTERS_LABEL_NUKEFILTERS="Reset all filters"
COM_AKEEBA_FILEFILTERS_LABEL_ROOTDIR="Root directory:"
COM_AKEEBA_FILEFILTERS_LABEL_TABULARVIEW="Summary View"
COM_AKEEBA_FILEFILTERS_LABEL_TYPE="Type"
COM_AKEEBA_FILEFILTERS_LABEL_UIERRORFILTER="An error occurred while applying the filter for &quot;%s&quot;."
COM_AKEEBA_FILEFILTERS_LABEL_UIROOT="&lt;root&gt;"
COM_AKEEBA_FILEFILTERS_LABEL_VIEWALL="List all exclusions"
COM_AKEEBA_FILEFILTERS_TYPE_APPLYTOALLDIRS="Apply to all listed folders"
COM_AKEEBA_FILEFILTERS_TYPE_APPLYTOALLFILES="Apply to all listed files"
COM_AKEEBA_FILEFILTERS_TYPE_DIRECTORIES="Exclude Directory"
COM_AKEEBA_FILEFILTERS_TYPE_DIRECTORIES_ALL="Exclude all directories"
COM_AKEEBA_FILEFILTERS_TYPE_FILES="Exclude File"
COM_AKEEBA_FILEFILTERS_TYPE_FILES_ALL="Exclude all files"
COM_AKEEBA_FILEFILTERS_TYPE_SKIPDIRS="Skip Subdirectories"
COM_AKEEBA_FILEFILTERS_TYPE_SKIPDIRS_ALL="Skip all directories"
COM_AKEEBA_FILEFILTERS_TYPE_SKIPFILES="Skip Files"
COM_AKEEBA_FILEFILTERS_TYPE_SKIPFILES_ALL="Skip all files"
COM_AKEEBA_FTPBROWSER_ERROR_HOSTNAME="Invalid FTP host or port"
COM_AKEEBA_FTPBROWSER_ERROR_NOACCESS="Directory doesn't exist or you don't have enough permissions to access it"
COM_AKEEBA_FTPBROWSER_ERROR_UNSUPPORTED="Sorry, your FTP server doesn't support our FTP directory browser."
COM_AKEEBA_FTPBROWSER_ERROR_USERPASS="Invalid FTP username or password"
COM_AKEEBA_FTPBROWSER_LBL_ERROR="An error occurred"
COM_AKEEBA_FTPBROWSER_LBL_INSTRUCTIONS="Click on a directory to navigate into it. Click on Use to select that directory, Cancel to abort the procedure."
COM_AKEEBA_INCLUDEFOLDER="Off-site Directories Inclusion"
COM_AKEEBA_INCLUDEFOLDER_LABEL_DIRECTORY="Directory"
COM_AKEEBA_INCLUDEFOLDER_LABEL_DIRECTORY_HELP="The directory on your server which will be included in the backup. This feature is meant only for directories located outside your site's root. Directories inside the site's root are always backed-up automatically, unless you exclude them using the File and Directory Exclusion feature."
COM_AKEEBA_INCLUDEFOLDER_LABEL_VINCLUDEDIR="Virtual subdirectory"
COM_AKEEBA_INCLUDEFOLDER_LABEL_VINCLUDEDIR_HELP="The files are stored in the archive inside a subdirectory of the Virtual directory for off-site files, defined in your configuration (default: external_files). You can customise the name of that directory. Set it to a single forward slash (it's this character: /) and your external files will be placed inside your site's root. This is useful if you want to override certain files in the backup, e.g. your configuration.php file or customise the template of the installation script."
COM_AKEEBA_INFORMATION_TRANSLATION_AUTHOR="Nicholas K. Dionysopoulos"
COM_AKEEBA_INFORMATION_TRANSLATION_AUTHOR_URL="http://www.dionysopoulos.me"
COM_AKEEBA_INFORMATION_TRANSLATION_CREDITS="Translation Credits"
COM_AKEEBA_INFORMATION_TRANSLATION_LANGUAGE="English (Great Britain)"
COM_AKEEBA_LBL_BATCH_COPY="Copy"
COM_AKEEBA_LBL_CPANEL_NEEDSDLID="You must enter your <b>Download ID</b> before you can update Akeeba Backup Professional. <a href='%s' target='_blank'>If you don't know your download ID, please click here</a>."
COM_AKEEBA_LBL_CPANEL_NEEDSUPGRADE="<strong>Entering the Download ID is not sufficient for enabling Akeeba Backup Professional's features</strong>. You will need to download and install the Akeeba Backup Professional package on your site <em>twice</em>, without uninstalling the Core version. For more information and detailed instructions please take a look at our <a href='%s'>video tutorial on upgrading Akeeba Backup Core to Professional</a>."
COM_AKEEBA_LBL_PROFILES_SAVED="The profile was successfully saved"
COM_AKEEBA_LBL_PROFILE_COPIED="The Profile and its associated settings have been copied successfully"
COM_AKEEBA_LBL_PROFILE_DELETED="The Profile has been successfully deleted"
COM_AKEEBA_LBL_PROFILE_SAVED="The Profile was saved successfully"
COM_AKEEBA_LOG="View Log"
COM_AKEEBA_LOG_CHOOSE_FILE_TITLE="Please choose a log file to display:"
COM_AKEEBA_LOG_CHOOSE_FILE_VALUE="- Select a backup origin -"
COM_AKEEBA_LOG_ERROR_LOGFILENOTEXISTS="The log file does not exist in your output directory"
COM_AKEEBA_LOG_ERROR_UNREADABLE="The log file is unreadable"
COM_AKEEBA_LOG_LABEL_DOWNLOAD="Download log file"
COM_AKEEBA_LOG_NONE_FOUND="No log file was found"
COM_AKEEBA_MULTIDB="Multiple Databases Definitions"
COM_AKEEBA_MULTIDB_ERR_MISSINGINFO="You must specify a database driver, hostname, username, password and database name at a minimum."
COM_AKEEBA_MULTIDB_GUI_LBL_CANCEL="Cancel"
COM_AKEEBA_MULTIDB_GUI_LBL_CONNECTFAIL="Could not connect to database. Please check your settings. Last error:"
COM_AKEEBA_MULTIDB_GUI_LBL_CONNECTOK="Connected to database!"
COM_AKEEBA_MULTIDB_GUI_LBL_DATABASE="Database name"
COM_AKEEBA_MULTIDB_GUI_LBL_DRIVER="Database driver"
COM_AKEEBA_MULTIDB_GUI_LBL_HOST="Database server hostname"
COM_AKEEBA_MULTIDB_GUI_LBL_LOADING="Loading; please wait..."
COM_AKEEBA_MULTIDB_GUI_LBL_PASSWORD="Password"
COM_AKEEBA_MULTIDB_GUI_LBL_PORT="Database server port"
COM_AKEEBA_MULTIDB_GUI_LBL_PREFIX="Prefix"
COM_AKEEBA_MULTIDB_GUI_LBL_SAVE="Save"
COM_AKEEBA_MULTIDB_GUI_LBL_SAVEFAIL="Saving failed; please retry"
COM_AKEEBA_MULTIDB_GUI_LBL_TEST="Test Connection"
COM_AKEEBA_MULTIDB_GUI_LBL_USERNAME="Username"
COM_AKEEBA_MULTIDB_LABEL_DATABASE="Database name"
COM_AKEEBA_MULTIDB_LABEL_HOST="Database server host name"
COM_AKEEBA_PROFILES="Profiles Management"
COM_AKEEBA_PROFILES_BTN_EXPORT="Export"
COM_AKEEBA_PROFILES_COLLABEL_DESCRIPTION="Description"
COM_AKEEBA_PROFILES_ERR_IMPORT_FAILED="Profile import failed"
COM_AKEEBA_PROFILES_ERR_IMPORT_INVALID="Invalid file. This doesn't look like an exported profile .json file."
COM_AKEEBA_PROFILES_HEADER_IMPORT="Import"
COM_AKEEBA_PROFILES_LABEL_DESCRIPTION="Profile Description"
COM_AKEEBA_PROFILES_LABEL_DESCRIPTION_TOOLTIP="Enter a description for this profile. It doesn&apos;t have to be unique and is only used to help you with distinguishing individual profiles."
COM_AKEEBA_PROFILES_LBL_IMPORT_HELP="Select an exported profile .json file from this or a different site to quickly import its settings."
COM_AKEEBA_PROFILES_MSG_IMPORT_COMPLETE="Profile successfully imported"
COM_AKEEBA_PROFILES_PAGETITLE_EDIT="Edit Profile"
COM_AKEEBA_PROFILES_PAGETITLE_NEW="New Profile"
COM_AKEEBA_PROFILE_ERR_CANNOTDELETEDEFAULT="You can not delete the default profile (the one with id=1)"
COM_AKEEBA_PROFILE_ERR_CANNOTDELETEACTIVE="You can not delete the currently active profile. Please go to the Control Panel page, select a different profile and then come back to this page to delete profile #%d."
COM_AKEEBA_PUSH_ENDBACKUP_FAIL_BODY="Akeeba Backup has detected that the backup of your site \"%s\" located in %s has failed."
COM_AKEEBA_PUSH_ENDBACKUP_FAIL_BODY_WITH_MESSAGE="Akeeba Backup has detected that the backup of your site \"%s\" located in %s has failed. The backup failure message is:\n%s"
COM_AKEEBA_PUSH_ENDBACKUP_FAIL_SUBJECT="Failed backup for %s"
COM_AKEEBA_PUSH_ENDBACKUP_SUCCESS_BODY="Akeeba Backup has successfully finished backing up your site \"%s\" located in %s on %s."
COM_AKEEBA_PUSH_ENDBACKUP_SUCCESS_SUBJECT="Successful backup for %s"
COM_AKEEBA_PUSH_ENDBACKUP_WARNINGS_BODY="Akeeba Backup has finished backing up your site \"%s\" located in %s on %s but warnings have been issued. This could mean that files have not been backed up or, if you are automatically uploading the backup to remote storage, the upload may have failed\nYou have to review the warnings and make sure that your backup has completed successfully. We advise you to always test a backup which resulted in warnings being issued to make sure that it is working properly. You can do so by restoring it to a local server. Remember that an untested backup is as good as no backup at all."
COM_AKEEBA_PUSH_ENDBACKUP_WARNINGS_SUBJECT="Backup finished with warnings for %s"
COM_AKEEBA_PUSH_STARTBACKUP_BODY="Akeeba Backup has begun taking a backup of site \"%s\" located in %s on %s."
COM_AKEEBA_PUSH_STARTBACKUP_SUBJECT="Backup started for %s"
COM_AKEEBA_REGEXDBFILTERS="RegEx Database Tables Exclusion"
COM_AKEEBA_REGEXFSFILTERS="RegEx Files and Directories Exclusion"
COM_AKEEBA_REMOTEFILES="Remotely stored files management"
COM_AKEEBA_REMOTEFILES_DELETE="Delete"
COM_AKEEBA_REMOTEFILES_ERR_CANTDELETE="Could not delete the remotely stored file. The error was: "
COM_AKEEBA_REMOTEFILES_ERR_CANTDOWNLOAD="Could not download file. The error was: "
COM_AKEEBA_REMOTEFILES_ERR_CANTOPENFILE="Can't open local file %s for writing; aborting the download process"
COM_AKEEBA_REMOTEFILES_ERR_INVALIDID="Invalid download ID specified"
COM_AKEEBA_REMOTEFILES_ERR_NOTSUPPORTED="Sorry, the remote storage engine you are using does not support downloading or deleting files stored remotely."
COM_AKEEBA_REMOTEFILES_ERR_NOTSUPPORTED_HEADER="No remote file operations available"
COM_AKEEBA_REMOTEFILES_ERR_NOTSUPPORTED_ALREADYONSERVER="You have already deleted the remotely stored files using Akeeba Backup."
COM_AKEEBA_REMOTEFILES_ERR_DOWNLOADEDTOFILE_ALREADY="You have already fetched back the remotely stored file to your site's server. Select the backup record and click on Delete Files to remove the file stored on your site's server to re-enable this button."
COM_AKEEBA_REMOTEFILES_ERR_DELETE_ALREADY="You have already deleted the remotely stored file. You need to transfer the file again for the remote file download and delete features to be available again."
COM_AKEEBA_REMOTEFILES_ERR_UNSUPPORTED="This functionality is currently not supported by the post-processing engine used by the current backup record."
COM_AKEEBA_REMOTEFILES_INPROGRESS_HEADER="Operation in progress"
COM_AKEEBA_REMOTEFILES_INPROGRESS_LBL_PLEASEWAIT="Loading, please wait."
COM_AKEEBA_REMOTEFILES_INPROGRESS_LBL_UNDERWAY="The operation you requested is currently under way."
COM_AKEEBA_REMOTEFILES_INPROGRESS_LBL_WAITINGINFO="You will receive an update on its progress in as little as a few seconds or as much as three minutes."
COM_AKEEBA_REMOTEFILES_FETCH="Fetch back to server"
COM_AKEEBA_REMOTEFILES_LBL_DOWNLOADEDSOFAR="Downloaded %u bytes of %u total bytes (%u %%)"
COM_AKEEBA_REMOTEFILES_LBL_DOWNLOADLOCALLY="Download to your desktop"
COM_AKEEBA_REMOTEFILES_LBL_JUSTFINISHED="Finished downloading your backup set from the remote storage back to the local server"
COM_AKEEBA_REMOTEFILES_LBL_JUSTFINISHEDELETING="Remotely stored files have been deleted successfully"
COM_AKEEBA_REMOTEFILES_PART="Part #%u"
COM_AKEEBA_RESTORE="Site Restoration"
COM_AKEEBA_RESTORE_ERROR_ARCHIVE_MISSING="The backup archive could not be located"
COM_AKEEBA_RESTORE_ERROR_CANT_WRITE="Could not write restoration.php. Please make sure the administrator/components/com_akeeba directory is writable."
COM_AKEEBA_RESTORE_ERROR_INVALID_RECORD="Invalid backup record"
COM_AKEEBA_RESTORE_ERROR_INVALID_TYPE="Invalid file type. The integrated restoration will only work with JPA and ZIP files."
COM_AKEEBA_RESTORE_ERROR_NO_LATEST="There is no backup taken with profile #%d or the backup archive is not present on your server. Please use the Manage Backup page to identify your backups, fetch them back to your server (if they are stored remotely) and restore them."
COM_AKEEBA_RESTORE_LABEL_BYTESEXTRACTED="Bytes extracted"
COM_AKEEBA_RESTORE_LABEL_BYTESREAD="Bytes read"
COM_AKEEBA_RESTORE_LABEL_DONOTCLOSE="Do not close this window or navigate to another page while the archive extraction is in progress"
COM_AKEEBA_RESTORE_LABEL_EXTRACTIONMETHOD="Files extraction method"
COM_AKEEBA_RESTORE_LABEL_EXTRACTIONMETHOD_DIRECT="Write directly to files"
COM_AKEEBA_RESTORE_LABEL_EXTRACTIONMETHOD_FTP="Use the FTP layer"
COM_AKEEBA_RESTORE_LABEL_EXTRACTIONMETHOD_HYBRID="Hybrid (write directly, use FTP layer only when necessary)"
COM_AKEEBA_RESTORE_LABEL_FAILED="The extraction has failed"
COM_AKEEBA_RESTORE_LABEL_FAILED_INFO="Extraction of the backup archive has failed.<br/>The last error message was:"
COM_AKEEBA_RESTORE_LABEL_FILESEXTRACTED="Files extracted"
COM_AKEEBA_RESTORE_LABEL_FINALIZE="Finalise restoration"
COM_AKEEBA_RESTORE_LABEL_FTPOPTIONS="FTP Layer Options"
COM_AKEEBA_RESTORE_LABEL_INPROGRESS="Archive extraction in progress"
COM_AKEEBA_RESTORE_LABEL_JPSOPTIONS="Secure Archive Options"
COM_AKEEBA_RESTORE_LABEL_REMOTETIP="<strong>Tip</strong>: In order to restore to a remote server select the \"Use the FTP layer\" option and supply your remote server's FTP connection information in the FTP Layer Options below.<br/>Use the Hybrid option and give the current site's FTP connection information if the restoration fails with unwriteable files."
COM_AKEEBA_RESTORE_LABEL_RUNINSTALLER="Run the site restoration script"
COM_AKEEBA_RESTORE_LABEL_START="Start Restoration"
COM_AKEEBA_RESTORE_LABEL_SUCCESS="The extraction was completed successfully"
COM_AKEEBA_RESTORE_LABEL_SUCCESS_INFO2="You must now run the Akeeba Backup Restoration Script. <em>Do not close this window!</em>. After the restoration is over, close the Akeeba Backup Restoration Script's window and click the new Finalise Restoration button below to remove the <tt>installation</tt> directory and begin using your restored site."
COM_AKEEBA_RESTORE_LABEL_SUCCESS_INFO2B="If, however, you are restoring to a remote site <em>do not</em> click either button. Instead, visit the restoration script's URL at <tt>http://<var>www.yoursite.com</var>/installation/index.php</tt>. After the restoration is over, click on \"Remove the installation folder\" link on the restoration script's final page or, if this fails, remove the <tt>installation</tt> directory from that site using your favourite FTP application."
COM_AKEEBA_S3IMPORT="Import Archives from S3"
COM_AKEEBA_S3IMPORT_ERR_CANTWRITE="Can not write to your output directory; please check the permissions"
COM_AKEEBA_S3IMPORT_ERR_NOTENOUGHINFO="Not enough information to connect to S3"
COM_AKEEBA_S3IMPORT_ERR_NOTFOUND="The file was not found in your S3 bucket"
COM_AKEEBA_S3IMPORT_LABEL_CHANGEBUCKET="Change bucket"
COM_AKEEBA_S3IMPORT_LABEL_CONNECT="Connect to S3"
COM_AKEEBA_S3IMPORT_LABEL_SELECTBUCKET="- Bucket -"
COM_AKEEBA_S3IMPORT_MSG_IMPORTCOMPLETE="The archive was successfully imported to your site"
COM_AKEEBA_S3_REGION_NONE="None (ATTENTION! ONLY USE WITH THE v2 SIGNATURE METHOD)"
COM_AKEEBA_S3_REGION_CUSTOM_OR_NONE="Custom / None"
COM_AKEEBA_S3_REGION_USEAST2="US East (Ohio)"
COM_AKEEBA_S3_REGION_USEAST1="US East (N. Virginia)"
COM_AKEEBA_S3_REGION_USWEST1="US West (N. California)"
COM_AKEEBA_S3_REGION_USWEST2="US West (Oregon)"
COM_AKEEBA_S3_REGION_AFSOUTH1="Africa, South (Cape Town)"
COM_AKEEBA_S3_REGION_APEAST1="Asia Pacific, East (Hong Kong)"
COM_AKEEBA_S3_REGION_APSOUTH1="Asia Pacific, South (Mumbai)"
COM_AKEEBA_S3_REGION_APNORTHEAST3="Asia Pacific, Southeast (Osaka)"
COM_AKEEBA_S3_REGION_APNORTHEAST2="Asia Pacific, Northeast (Seoul)"
COM_AKEEBA_S3_REGION_APSOUTHEAST1="Asia Pacific, Southeast (Singapore)"
COM_AKEEBA_S3_REGION_APSOUTHEAST2="Asia Pacific, Southeast (Sydney)"
COM_AKEEBA_S3_REGION_APNORTHEAST1="Asia Pacific, Northeast (Tokyo)"
COM_AKEEBA_S3_REGION_CACENTRAL1="Canada (Central)"
COM_AKEEBA_S3_REGION_CNNORTH1="China, North (Beijing)"
COM_AKEEBA_S3_REGION_CNNORTHWEST1="China, Northwest (Ningxia)"
COM_AKEEBA_S3_REGION_EUCENTRAL1="Europe, Central (Frankfurt)"
COM_AKEEBA_S3_REGION_EUNORTH1="Europe, North (Stockholm)"
COM_AKEEBA_S3_REGION_EUWEST1="Europe, West (Ireland)"
COM_AKEEBA_S3_REGION_EUWEST2="Europe, West (London)"
COM_AKEEBA_S3_REGION_EUWEST3="Europe, West (Paris)"
COM_AKEEBA_S3_REGION_EUSOUTH1="Europe, South (Milan)"
COM_AKEEBA_S3_REGION_SAEAST1="South America, East (São Paulo)"
COM_AKEEBA_S3_REGION_MESOUTH1="Middle East, South (Bahrain)"
COM_AKEEBA_S3_REGION_APSOUTH2="Asia Pacific, South (Hyderabad)"
COM_AKEEBA_S3_REGION_APSOUTHEAST3="Asia Pacific, Southeast (Jakarta)"
COM_AKEEBA_S3_REGION_APSOUTHEAST4="Asia Pacific, Southeast (Melbourne)"
COM_AKEEBA_S3_REGION_EUSOUTH2="Europe, South (Spain)"
COM_AKEEBA_S3_REGION_EUCENTRAL2="Europe, Central (Zurich)"
COM_AKEEBA_S3_REGION_MECENTRAL1="Middle East, Central (UAE)"
COM_AKEEBA_S3_REGION_USGOVEAST1="AWS GovCloud (US-East)"
COM_AKEEBA_S3_REGION_USGOVEAST2="AWS GovCloud (US-West)"
COM_AKEEBA_S3_REGION_DESCRIPTION="Choose the S3 region where your bucket is located in. Please consult http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region <strong>ATTENTION! Due to Amazon's API you MUST select the location of your bucket when using the v4 signature method. The v4 signature method is MANDATORY for all buckets created in any region which went online after January 2014 such as Frankfurt and Sao Paolo.</strong> This is an Amazon restriction, not an Akeeba Backup restriction. Thank you for your understanding."
COM_AKEEBA_S3_REGION_TITLE="Amazon S3 Region"
COM_AKEEBA_S3_CUSTOM_REGION_TITLE="Custom Amazon S3 Region"
COM_AKEEBA_S3_CUSTOM_REGION_DESCRIPTION="Set the option above to “Custom / None” and enter here the name of the region you want to use, e.g. <code>us-east-1</code> for US East (N. Virginia).<br/>This is meant to be used with new S3 regions we have not already listed above or with third party S3-compatible services which use the S3 v4 API and their own, custom, service-specific region names."

COM_AKEEBA_CONFIG_S3RRS_TITLE="Storage class"
COM_AKEEBA_CONFIG_S3RRS_DESCRIPTION="Select the storage class for your data. Standard is the regular storage for business critical data. Please consult the Amazon S3 documentation for the description of each storage class."
COM_AKEEBA_S3_RRS_RRS="Reduced Redundancy Storage"
COM_AKEEBA_S3_RRS_STANDARD="Standard storage"
COM_AKEEBA_S3_RRS_STANDARD_IA="Standard - Infrequent Access"
COM_AKEEBA_S3_RRS_ONEZONE_IA="One Zone - Infrequent Access"
COM_AKEEBA_S3_RRS_INTELLIGENT_TIERING="Intelligent Tiering"
COM_AKEEBA_S3_RRS_GLACIER="Glacier"
COM_AKEEBA_S3_RRS_DEEP_ARCHIVE="Deep Archive"

COM_AKEEBA_S3_SIGNATURE_DESCRIPTION="Specify the request signature method. Use v4 if unsure. You may have to use v2 with third party storage services (i.e. when you specify a custom endpoint)."
COM_AKEEBA_S3_SIGNATURE_TITLE="Signature method"
COM_AKEEBA_S3_SIGNATURE_V2="v2 (legacy mode, third party storage providers)"
COM_AKEEBA_S3_SIGNATURE_V4="v4 (preferred for Amazon S3)"
COM_AKEEBA_SCHEDULE="Schedule Automatic Backups"
COM_AKEEBA_SCHEDULE_LBL_ALTCLICRON="Alternative Command-Line CRON jobs"
COM_AKEEBA_SCHEDULE_LBL_ALTCLICRON_INFO="This method is recommended only if the regular Command-Line CRON job does not complete. This method internally uses the front-end backup method and is a little slower than the native CLI method."
COM_AKEEBA_SCHEDULE_LBL_CHECK_BACKUPS="Check Backup Status"
COM_AKEEBA_SCHEDULE_LBL_CHECKHEADERINFO="<p>When a scheduled backup fails it typically means that PHP stopped working before the backup is complete. Therefore Akeeba Backup cannot notify you of the backup failure in the same way it notifies you for the backup finishing successfully or with warnings.</p><p>To solve that problem you can schedule the latest backup checks to run after the expected end of your backup run. Not sure when would that be? Ideally, it should be the length of the last successful backup recorded in the Manage Backups page plus half an hour.</p><p>You can schedule this check with many different methods, just like the backup itself. Below you will find more information about each scheduling method available for backup checks. If you are unsure which one to use we recommend that you use the same scheduling method as your backups.</p>"
COM_AKEEBA_SCHEDULE_LBL_FRONTENDCHECK="Front-end Backup Check Feature"
COM_AKEEBA_SCHEDULE_LBL_CLICRON="Command-Line CRON jobs (recommended)"
COM_AKEEBA_SCHEDULE_LBL_CLICRON_INFO="This is the recommended method for all servers supporting command-line CRON jobs. This method bypasses the web interface of Joomla!, achieving maximum backup speed."
COM_AKEEBA_SCHEDULE_LBL_CLIGENERICIMPROTANTINFO="Important"
COM_AKEEBA_SCHEDULE_LBL_CLIGENERICINFO="Remember to substitute <em>%s</em> with the real path to your host's PHP <strong>CLI (Command Line Interface)</strong> executable. Do remember that you must use the PHP CLI executable; the PHP CGI (Common Gateway Interface) executable will <em>not</em> work with our CRON scripts. If unsure what this means, please consult your host. They are the only people who can provide this information."
COM_AKEEBA_SCHEDULE_LBL_JSONAPIBACKUP="Remote Backup (JSON API) Feature"
COM_AKEEBA_SCHEDULE_LBL_JSONAPIBACKUP_INFO="You can use this method to take backups of your site remotely using our software that supports such a feature (e.g. Akeeba Remote CLI and Akeeba UNiTE)."
COM_AKEEBA_SCHEDULE_LBL_JSONAPI_DISABLED="Please go to Akeeba Backup, click on Options, then the Frontend tab. Set “Enable JSON API (remote backup)” to Yes to enable this feature."
COM_AKEEBA_SCHEDULE_LBL_JSONAPI_ARCCLI="Akeeba Remote CLI"
COM_AKEEBA_SCHEDULE_LBL_JSONAPI_ARCCLI_INTRO="You can use the Akeeba Remote CLI command line application to take backups of your sites remotely. You can schedule these commands on your computer, or another server, to automate your backups."
COM_AKEEBA_SCHEDULE_LBL_JSONAPI_ARCCLI_DOCKER="To take a backup using the Akeeba Remote CLI through <strong>Docker</strong> run the following command:"
COM_AKEEBA_SCHEDULE_LBL_JSONAPI_ARCCLI_PHAR="To take a backup using the Akeeba Remote CLI using the <strong>PHAR archive</strong> you can  download from our site run the following command:"
COM_AKEEBA_SCHEDULE_LBL_JSONAPI_OTHER="Other tools"
COM_AKEEBA_SCHEDULE_LBL_JSONAPI_INTRO="If you are using Akeeba UNiTE, or other software using the Remote JSON API, you will have to provide the following information."
COM_AKEEBA_SCHEDULE_LBL_JSONAPI_ENDPOINT="Endpoint URL"
COM_AKEEBA_SCHEDULE_LBL_JSONAPI_SECRET="Secret Key"
COM_AKEEBA_SCHEDULE_LBL_JSONAPI_DISCLAIMER="Akeeba Ltd does not endorse, accept liability, or provide support for third party software or services interfacing Akeeba Backup over the JSON API. We will provide support for taking backups with the Akeeba JSON API only if the Secret Key is generated automatically by our software and the request concerns using our own Akeeba JSON API client software (e.g. Akeeba Remote CLI)."
COM_AKEEBA_SCHEDULE_LBL_FRONTENDBACKUP="Front-end Backup Feature"
COM_AKEEBA_SCHEDULE_LBL_FRONTENDBACKUP_INFO="This method uses a public URL and a secret key to trigger a backup of your site. The backup progresses by means of HTTP redirects. Please note that most hosts' URL-based 'CRON' jobs, as well as most third-party URL-based CRON services, do not support HTTP redirects. If the examples with wget and curl below don't work for you, please use the front-end backup URL with the very cheap webcron.org third party service."
COM_AKEEBA_SCHEDULE_LBL_FRONTENDBACKUP_MANYMETHODS="The front-end backup feature can be used with a great variety of methods. Click the tabs below to see all each method's description. Remember that all of them are explained in detail in our documentation."
COM_AKEEBA_SCHEDULE_LBL_FRONTENDBACKUP_TAB_CURL="cURL"
COM_AKEEBA_SCHEDULE_LBL_FRONTENDBACKUP_TAB_SCRIPT="PHP Script"
COM_AKEEBA_SCHEDULE_LBL_FRONTENDBACKUP_TAB_URL="URL"
COM_AKEEBA_SCHEDULE_LBL_FRONTENDBACKUP_TAB_WEBCRON="WebCron.org"
COM_AKEEBA_SCHEDULE_LBL_FRONTENDBACKUP_TAB_WGET="WGet"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_CURL="CRON scheduling using curl (macOS, Linux, some hosts):"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_CUSTOMSCRIPT="Custom PHP script to run the front-end backup:"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_DISABLED="The front-end backup feature of Akeeba Backup is not enabled. You cannot use this scheduling method unless you enable it. Please go to Akeeba Backup's Control Panel, click on the Options button in the toolbar and enable the front-end backup feature. Do not forget to also specify a secret key of your liking."
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_RAWURL="URL for use with your own scripts and third party services:"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_SECRET="The front-end backup feature's secret key is empty. You cannot use this scheduling method unless you create a secret key. Please go to Akeeba Backup's Control Panel, click on the Options button in the toolbar and enter a secret key of your liking."
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON="Configuration of a backup job with WebCron.org:"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_ALERTS="Alerts"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_ALERTS_INFO="If you have already set up alert methods in webcron.org's interface, we recommend choosing an alert method here and not checking the 'Only on error' so that you always get a notification when the backup CRON job runs."
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_EXECUTIONTIME="Execution time"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_EXECUTIONTIME_INFO="That's the grid below the other options. Select when and how often you want your CRON job to run."
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_INFO="Log in to webcron.org. In the CRON area, click on the New Cron button. Below you'll find what you have to enter at webcron.org's interface."
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_LOGIN="Login"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_LOGINPASSWORD_INFO="Leave this blank"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_NAME="Name of cronjob"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_NAME_INFO="Anything you like, e.g. <em>Backup of my site</em>"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_PASSWORD="Password"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_THENCLICKSUBMIT="Finally, click on the Submit button to finish setting up your CRON job."
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_TIMEOUT="Timeout"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_TIMEOUT_INFO="180sec; if the backup doesn't complete, increase it. Most sites will work with a setting of 180 or 600 here. If you have a very big site which takes more than 5 minutes to back itself up, you might consider using Akeeba Backup Professional and the native CLI CRON job instead, as it's much more cost-effective."
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_URL="Url you want to execute"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WGET="CRON scheduling using wget (most hosts, most Linux distributions):"
COM_AKEEBA_SCHEDULE_LBL_LEGACYAPI_DISABLED="Please go to Akeeba Backup, click on Options, then the Frontend tab. Set “Enable Legacy Front-end Backup API (remote CRON jobs)” to Yes to enable this feature."
COM_AKEEBA_SCHEDULE_BTN_ENABLE_LEGACYAPI="Enable the Legacy Front-end Backup API"
COM_AKEEBA_SCHEDULE_BTN_ENABLE_JSONAPI="Enable the Akeeba JSON API"
COM_AKEEBA_SCHEDULE_BTN_RESET_SECRETWORD="Reset the Secret Key"
COM_AKEEBA_SCHEDULE_LBL_GENERICREADDOC="Read the documentation"
COM_AKEEBA_SCHEDULE_LBL_GENERICUSECLI="Use the following command in your host's CRON interface:"
COM_AKEEBA_SCHEDULE_LBL_HEADERINFO="Akeeba Backup offers several scheduling methods. You will find more information about each scheduling method below. Please do read the documentation of each scheduling method. It will answer a lot of your questions and will help you schedule your backups more easily."
COM_AKEEBA_SCHEDULE_LBL_RUN_BACKUPS="Run Backups"
COM_AKEEBA_SCHEDULE_LBL_UPGRADENOW="Upgrade Now"
COM_AKEEBA_SCHEDULE_LBL_UPGRADETOPRO="This feature is only available in Akeeba Backup Professional"
COM_AKEEBA_SFTPBROWSER_ERROR_HOSTNAME="Invalid SFTP host or port"
COM_AKEEBA_SFTPBROWSER_ERROR_KEYFILE="Invalid SFTP private or public key file, or the passphrase (password) to the private key file is incorrect"
COM_AKEEBA_SFTPBROWSER_ERROR_NOACCESS="Directory doesn't exist, is empty or you don't have enough permissions to access it"
COM_AKEEBA_SFTPBROWSER_ERROR_UNSUPPORTED="Sorry, your SFTP server doesn't support our SFTP directory browser."
COM_AKEEBA_SFTPBROWSER_ERROR_USERPASS="Invalid SFTP username or password"
COM_AKEEBA_SFTPBROWSER_LBL_ERROR="An error occurred"
COM_AKEEBA_SFTPBROWSER_LBL_GOPARENT="&lt;up one level&gt;"
COM_AKEEBA_SFTPBROWSER_LBL_INSTRUCTIONS="Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure."
COM_AKEEBA_TITLE_ALICES="Troubleshooter - ALICE (Akeeba Log Inspection and Cause Elimination)"
COM_AKEEBA_TRANSFER="Site Transfer Wizard"
COM_AKEEBA_TRANSFER_BTN_FTP_DETECT="Detect"
COM_AKEEBA_TRANSFER_BTN_FTP_PROCEED="Proceed with restoration"
COM_AKEEBA_TRANSFER_BTN_OPEN_KICKSTART="Run Kickstart"
COM_AKEEBA_TRANSFER_BTN_RESET="Reset"
COM_AKEEBA_TRANSFER_DESC="Transfers the archive by running the \"%s\" post-processing engine against the archive."
COM_AKEEBA_TRANSFER_ERR_WRONGSSL="Your site has an invalid or self-signed SSL certificate. For security reasons the site transfer cannot proceed. Please click Reset to restart the site transfer and use a URL without <code>https://</code>. This is necessary when you are trying to transfer your site before transferring your domain name to the new host. Alternatively, please contact your host for obtaining a valid SSL certificate. Even a free one issued through the no cost Let's Encrypt certification authority will do."
COM_AKEEBA_TRANSFER_ERR_DNS="The domain name of the URL you have entered (%s) cannot be resolved from the server where Akeeba Backup is running on. If you have recently registered or transffered the domain name please allow more time until DNS servers are updated (typically 6 to 48 hours). Otherwise please check the DNS settings of your domain name."
COM_AKEEBA_TRANSFER_ERR_CANNOTACCESSTESTFILE="Akeeba Backup cannot verify that the connection information you entered corresponds to the site URL you have entered. If you are trying to restore inside a subdirectory of an existing site this means that the main site is blocking access to the subdirectory; please contact your site administrator. In any other case you have entered the wrong connection information, most likely a wrong directory. Please contact your host and ask them for the correct connection information, <em>including the directory</em>, which corresponds to your the URL you have entered in this wizard. Then come back here, enter the correct information and continue with the restoration."
COM_AKEEBA_TRANSFER_ERR_CANNOTREADLOCALFILE="Akeeba Backup cannot read from the local backup file <code>%s</code>. This wizard has failed. Please take a new backup and retry. Do note that files have been left behind on your new server; you may want to remove them manually."
COM_AKEEBA_TRANSFER_ERR_CANNOTRUNKICKSTART="Akeeba Backup cannot run Akeeba Kickstart on your new site. If you are trying to restore inside a subdirectory of an existing site this means that the main site is blocking access to the subdirectory; please contact your site administrator. In any other case you need to contact your host and verify that your default PHP version matches Kickstart's minimum requirements."
COM_AKEEBA_TRANSFER_ERR_CANNOTUPLOADARCHIVE="Akeeba Backup cannot upload the backup file <code>%s</code>. It's possible that your new site's server has ran out of disk space or a server protection is blocking the transmission of the data. Please try transferring your site by selecting the Manually transfer option. Do note that files have been left behind on your new server; you may want to remove them manually."
COM_AKEEBA_TRANSFER_ERR_CANNOTUPLOADKICKSTART="Akeeba Backup cannot upload Akeeba Kickstart to your new site's root. Please check that you have entered the correct connection information and that it's possible for the FTP/SFTP user to write files into the directory you selected. If you already have kickstart.php and kickstart.transfer.php on the remote site please remove them before retrying transferring your site."
COM_AKEEBA_TRANSFER_ERR_CANNOTUPLOADTEMP="Akeeba Backup cannot upload a chunk of your backup archive from the local file <code>%s</code> to the remote file <code>%s</code>. Please check that your remote server allows uploading files and there is enough disk space on it for your backup archive file(s)."
COM_AKEEBA_TRANSFER_ERR_CANNOTUPLOADTESTFILE="Akeeba Backup cannot upload a test file called <code>%s</code> to your new site's root. Please check that you have entered the correct connection information and that it's possible for the FTP/SFTP user to write files into the directory you selected."
COM_AKEEBA_TRANSFER_ERR_CANNOTWRITEREMOTEFILES="Unfortunately, Akeeba Backup has determined it cannot write directly to files on your remote server. This wizard cannot proceed. You will have to use the \"Manually\" transfer method."
COM_AKEEBA_TRANSFER_ERR_COMPLETEBACKUP="No such backup is found. Click the Backup Now button to take a new backup now."
COM_AKEEBA_TRANSFER_ERR_ERRORFROMREMOTE="Akeeba Backup has received an error from the remote server while trying to upload the backup archive. The error was: %s"
COM_AKEEBA_TRANSFER_ERR_EXISTINGSITE="Another site already exists in that location. Please remove the existing site before transfering a new site there. Trying to overwrite an existing site will most likely result in a broken site you won't be able to fix."
COM_AKEEBA_TRANSFER_ERR_HTACCESS="A <code>%s</code> file was found in your new site's root. This file can interfere with the site transfer process. Please remove it before proceeding with the site transfer. Please note that the file may be <em>hidden</em>. If you don't see this file in your hosting control panel file browser or FTP client software please ask your host for more information on removing this file."
COM_AKEEBA_TRANSFER_ERR_OVERRIDE="Ignore detected errors and transfer the site anyway"
COM_AKEEBA_TRANSFER_ERR_INVALIDID="Invalid upload ID specified"
COM_AKEEBA_TRANSFER_ERR_NEWURL_BTN="Check"
COM_AKEEBA_TRANSFER_ERR_NEWURL_BTN_IGNOREERROR="I want to ignore this warning and proceed <strong>at my own risk</strong>"
COM_AKEEBA_TRANSFER_ERR_NEWURL_INVALID="The URL you entered is invalid."
COM_AKEEBA_TRANSFER_ERR_NEWURL_NOTEXISTS="Your server cannot access the URL you have entered. Please check that you typed it correctly. Also note that newly assigned or transferred domain names may take <strong>up to 48 hours</strong> before they are visible to every server and computer connected to the Internet."
COM_AKEEBA_TRANSFER_ERR_NEWURL_SAME="The URL you entered is the same as the one you are restoring from. This is not supported by this wizard. For backup restoration without using the wizard please consult our video tutorial following the link below."
COM_AKEEBA_TRANSFER_ERR_NOTENOUGHSPACE="The site transfer cannot proceed. You need approximately %s of free space but your server reports that only %s is currently available. Please make more space on your server."
COM_AKEEBA_TRANSFER_ERR_SAMESITE="You have entered the connection information to the site you are transfering from. <strong>Your mistake would have deleted your own site</strong>. You need to enter the FTP/SFTP connection information to the site you are transferring <strong>to</strong> (new site or new server). Please fix the information above and retry."
COM_AKEEBA_TRANSFER_ERR_SPACE="You only have <span></span> of free space. You need more free space to transfer your site. Please contact your host."
COM_AKEEBA_TRANSFER_HEAD_MANUALTRANSFER="Manual transfer"
COM_AKEEBA_TRANSFER_HEAD_PREREQUISITES="Prerequisites"
COM_AKEEBA_TRANSFER_HEAD_REMOTECONNECTION="Connection to New Site"
COM_AKEEBA_TRANSFER_HEAD_UPLOAD="Upload and restore"
COM_AKEEBA_TRANSFER_LBL_COMPLETEBACKUP="A complete, full site backup"
COM_AKEEBA_TRANSFER_LBL_COMPLETEBACKUP_INFO="Backup found; taken on %s"
COM_AKEEBA_TRANSFER_LBL_FTP_DIRECTORY="FTP/SFTP Directory"
COM_AKEEBA_TRANSFER_LBL_FTP_HOST="Host name"
COM_AKEEBA_TRANSFER_LBL_FTP_PASSIVE="Passive mode"
COM_AKEEBA_TRANSFER_LBL_FTP_PASSWORD="Password"
COM_AKEEBA_TRANSFER_LBL_FTP_PORT="Port"
COM_AKEEBA_TRANSFER_LBL_FTP_PRIVATEKEY="SFTP Private Key file"
COM_AKEEBA_TRANSFER_LBL_FTP_PUBKEY="SFTP Public Key file"
COM_AKEEBA_TRANSFER_LBL_FTP_USERNAME="Username"
COM_AKEEBA_TRANSFER_LBL_MANUALTRANSFER_INFO="Follow the instructions in the video to transfer your site manually. Information about the backup archive can be found below the video link (scroll down)."
COM_AKEEBA_TRANSFER_LBL_MANUALTRANSFER_MULTIPART="You must transfer <strong>all</strong> %u files:"
COM_AKEEBA_TRANSFER_LBL_MANUALTRANSFER_LINK="Watch the video tutorial"
COM_AKEEBA_TRANSFER_LBL_NEWURL="The URL to your new site"
COM_AKEEBA_TRANSFER_LBL_NEWURL_TIP="Enter the URL to the site you are restoring to"
COM_AKEEBA_TRANSFER_LBL_OPEN_KICKSTART_INFO="Kickstart will let you extract the backup archive and begin restoration on the remote server."
COM_AKEEBA_TRANSFER_LBL_SPACE="Approximately %s of free space on your new site"
COM_AKEEBA_TRANSFER_LBL_TRANSFERMETHOD="File transfer method"
COM_AKEEBA_TRANSFER_LBL_UPLOAD_BACKUP="Uploading the backup archive"
COM_AKEEBA_TRANSFER_LBL_UPLOAD_KICKSTART="Uploading Kickstart"
COM_AKEEBA_TRANSFER_LBL_VALIDATING="Validating…"
COM_AKEEBA_TRANSFER_MSG_DONE="Uploading is complete!"
COM_AKEEBA_TRANSFER_MSG_FAILED="Upload of your archive failed."
COM_AKEEBA_TRANSFER_MSG_START="Preparing to upload your archive. This will take some time. Please wait."
COM_AKEEBA_TRANSFER_MSG_UPLOADINGFRAG="Continuing the upload of archive part %s of %s. Currently processing chunk %s. Please wait."
COM_AKEEBA_TRANSFER_MSG_UPLOADINGPART="Uploading archive part %s of %s. Please wait."
COM_AKEEBA_TRANSFER_TITLE="Transfer Archive"
COM_AKEEBA_TRANSFER_WARN_FIREWALLED_BODY="Some of the transfer methods listed above and marked with &#128274; are blocked by a firewall on your server. If you use them this wizard will most likely fail. Please contact your host and ask them to disable the firewall or add firewall exceptions before transferring your site. Alternatively, please select Manually above, click on Proceed with restoration and follow the instructions for a manual site transfer."
COM_AKEEBA_TRANSFER_WARN_FIREWALLED_HEAD="Server firewall blocking file transfers - THIS WIZARD MAY FAIL"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_FATALERROR="Fatal errors"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_FATALERROR_ERROR="The following fatal error happened while taking a backup. Please review and fix it before continuing: \n%s"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_FATALERROR_SOLUTION="If you do not understand what this means and you have an active subscription to our site, please file a new support ticket making sure that 1. you have ZIPped and attached the backup log file and 2. you have pasted the text output visible at the top of this page."
COM_AKEEBA_LOG_SIZE_WARNING="Your log file is %s Mb big. Trying to display it in the browser may crash the browser or cause a timeout error on your server. Please use the Download Log button above to download the log file to your computer instead. You can open and read the log with any plain text editor."
COM_AKEEBA_LOG_SHOW_LOG="Show log"
COM_AKEEBA_CPANEL_MSG_CLOUDFLARE_WARN="CloudFlare's Rocket Loader will prevent you from using Akeeba Backup"
COM_AKEEBA_CPANEL_MSG_CLOUDFLARE_WARN1="We have detected that CloudFlare Rocket Loader is enabled on your site. This feature will interfere with JavaScript on your site, mixing up the order scripts are loaded therefore causing JavaScript errors. Please disable the Rocket Loader feature to let Joomla's and Akeeba Backup's JavaScript work correctly. For further information and instructions please refer to <a href='%s' target='_blank'>CloudFlare's documentation</a>."
COM_AKEEBA_CPANEL_ERR_UPDATE_STUCK="We have detected that one or more tables with the <strong>%sak_</strong> prefix are broken. Akeeba Backup will not work properly. Please ask your host to repair these tables and then <a href='%s'>click here</a> to let Akeeba Backup update its database tables."
COM_AKEEBA_TRANSFER_FORCE_HEADER="Forced Mode activated"
COM_AKEEBA_TRANSFER_FORCE_BODY="You are running Site Transfer Wizard in Forced Mode. This means that some sanity checks which normally run before the site transfer will not be executed. As a result the transfer may overwrite an existing site, end up in a different URL than the one you expected or simply fail. <strong>This is a power user feature. Please do not continue if you don't feel comfortable with it.</strong>"
COM_AKEEBA_CPANEL_WARNING_Q013="Using component folder as Output directory"
COM_AKEEBA_CONFIG_BACKEND_LOCALTIME_LABEL="Local time in Manage Backups"
COM_AKEEBA_CONFIG_BACKEND_LOCALTIME_DESC="Should we translate the backup start time to the currently logged in user's timezone in the Manage Backups page? If set to No all backup start times appear in the GMT timezone. This option DOES NOT affect the [DATE] and [TIME] variables for backup file naming or the default description; Use the Backup timezone option to change how these variables work."
COM_AKEEBA_CONFIG_BACKEND_TIMEZONETEXT_LABEL="Timezone suffix"
COM_AKEEBA_CONFIG_BACKEND_TIMEZONETEXT_DESC="The timezone suffix to display next to the backup start time in the Manage Backups page.<br/>None: no suffix is displayed (not recommended).<br/>Time Zone: an abbreviated time zone, e.g. CEST for Central Europe Summer Time.<br/>GMT Offset: the offset from the GMT timezone, e.g. GMT+01:00 (= two hours ahead of GMT i.e. Central Europe Standard Time). Please note that during daylights savings GMT offset is +1 hour to the regular timezone. This offset difference WILL be shown in this format."
COM_AKEEBA_CONFIG_BACKEND_TIMEZONETEXT_NONE="None"
COM_AKEEBA_CONFIG_BACKEND_TIMEZONETEXT_ABBREVIATION="Time Zone"
COM_AKEEBA_CONFIG_BACKEND_TIMEZONETEXT_GMTOFFSET="GMT Offset"
COM_AKEEBA_ALICE_ANALYZE_FILESYSTEM_OLD_BACKUPS="Old backups included"
COM_AKEEBA_ALICE_ANALYZE_FILESYSTEM_OLD_BACKUPS_ERROR="The following old backups are included in the current backup: \n%s"
COM_AKEEBA_ALICE_ANALYZE_FILESYSTEM_OLD_BACKUPS_SOLUTION="Delete or exclude those from the backup."
COM_AKEEBA_COMMON_EMAIL_BODY_INFO="The new backup was taken with profile #%s. It consists of %s part(s). The full list of files of this backup set is the following:"
COM_AKEEBA_COMMON_EMAIL_BODY_OK="Akeeba Backup has completed backing up your site using the front-end backup feature. You may visit the site's administrator section to download the backup."
COM_AKEEBA_COMMON_EMAIL_SUBJECT_OK="Akeeba Backup has taken a new backup"
COM_AKEEBA_COMMON_ERR_NOT_ENABLED="Operation not permitted"
COM_AKEEBA_EMAIL_POSTPROCESSING_FAILED="Post-processing (upload to remote storage) has FAILED."
COM_AKEEBA_EMAIL_POSTPROCESSING_SUCCESS="Post-processing (upload to remote storage) was successful."
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_DIRECTFTPCURL_TITLE="DirectFTP over cURL"
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_DIRECTFTPCURL_DESCRIPTION="Transfers the site files to a remote FTP server, without archiving them first. This archiver engine uses the cURL library which provides better compatiblity with a wide range of FTP servers."
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_DIRECTFTPCURL_PASVWORKAROUND_TITLE="Passive mode workaround"
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_DIRECTFTPCURL_PASVWORKAROUND_DESCRIPTION="Some badly configured or misbehaving FTP servers return the wrong IP address when FTP Passive mode is enabled. Enable this option to force the FTP library to ignore the wrong IP returned by the FTP server, instead using the FTP server's public IP."
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_FTPCURL_TITLE="Upload to Remote FTP server using cURL"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_FTPCURL_DESCRIPTION="Uploads the backup archive to a remote FTP or FTPS (FTP over Implicit SSL) server.<br/>This post-processing engine uses the cURL library which provides better compatiblity with a wide range of FTP servers.<br/><strong>Remember to set a split archive size of 2-30Mb or you risk backup failure due to timeouts!</strong>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_SFTPCURL_TITLE="Upload to Remote SFTP (SSH) server using cURL"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_SFTPCURL_DESCRIPTION="Uploads the backup archive to a remote SFTP (SSH) server. This is a file transfer over SSH using a protocol called SFTP which is <em>entirely different</em> to FTP and FTPS.<br/>This post-processing engine uses cURL for the data transfer, a library which is compatible with a wide range of SFTP servers.<br/><strong>Remember to set a split archive size of 2-30Mb or you risk backup failure due to timeouts!</strong>"
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_DIRECTSFTPCURL_TITLE="DirectSFTP over cURL"
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_DIRECTSFTPCURL_DESCRIPTION="Transfers the site files to a remote SFTP server, without archiving them first. This archiver engine uses the cURL library which provides better compatiblity with a wide range of FTP servers."
COM_AKEEBA_TRANSFER_LBL_TRANSFERMETHOD_FTP="FTP, native PHP functions"
COM_AKEEBA_TRANSFER_LBL_TRANSFERMETHOD_FTPCURL="FTP, using cURL"
COM_AKEEBA_TRANSFER_LBL_TRANSFERMETHOD_FTPS="FTPS, native PHP functions"
COM_AKEEBA_TRANSFER_LBL_TRANSFERMETHOD_FTPSCURL="FTPS, using cURL"
COM_AKEEBA_TRANSFER_LBL_TRANSFERMETHOD_SFTP="SFTP, native PHP SSH2 extension"
COM_AKEEBA_TRANSFER_LBL_TRANSFERMETHOD_SFTPCURL="SFTP, using cURL"
COM_AKEEBA_TRANSFER_LBL_TRANSFERMETHOD_MANUALLY="Manually"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_GOOGLESTORAGEJSON_DESCRIPTION="Uploads the backup archive to Google Storage using the modern JSON API. This is the recommended integration with Google Storage.<br/><strong>Remember to set a split archive size of 2-30Mb or you risk backup failure due to timeouts!</strong>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_GOOGLESTORAGEJSON_TITLE="Upload to Google Storage (JSON API)"
COM_AKEEBA_CONFIG_GOOGLESTORAGEJSON_CREDS_TITLE="Contents of googlestorage.json (read the documentation)"
COM_AKEEBA_CONFIG_GOOGLESTORAGEJSON_CREDS_DESC="Paste here the contents of the JSON credentials file Google Cloud Console produced when setting up the Service Account for the backup software. Remember to include the curly braces in the beginning and end of the text."
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_ONEDRIVEBUSINESS_TITLE="Upload to Microsoft OneDrive or OneDrive for Business"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_ONEDRIVEBUSINESS_DESCRIPTION="Uploads the backup archive to Microsoft OneDrive or Microsoft OneDrive for Business."
COM_AKEEBA_CONFIG_FORCEDBACKUPTZ_LABEL="Backup timezone"
COM_AKEEBA_CONFIG_FORCEDBACKUPTZ_DESC="The backup date and time -as recorded in the filename, default description and emails- will be expressed in this timezone. This options affects all backup origins i.e. all backups, no matter how they are taken (through Akeeba Backup itself, the remote JSON API etc)."
COM_AKEEBA_CONFIG_FORCEDBACKUPTZ_DEFAULT="Default Joomla! behavior"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_BACKBLAZE_TITLE="Upload to BackBlaze B2"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_BACKBLAZE_DESCRIPTION="Uploads the backup archive to BackBlaze."
COM_AKEEBA_CONFIG_BACKBLAZE_ACCOUNTID_TITLE="Application Key ID"
COM_AKEEBA_CONFIG_BACKBLAZE_ACCOUNTID_DESCRIPTION="Enter your BackBlaze application key ID. You can find this information in <a href='https://secure.backblaze.com/b2_buckets.htm'>your BackBlaze account page</a> after clicking on 'Show Account ID and Application Key'. If you are using your master key please enter your Account ID instead."
COM_AKEEBA_CONFIG_BACKBLAZE_APPLICATIONKEY_TITLE="Application Key"
COM_AKEEBA_CONFIG_BACKBLAZE_APPLICATIONKEY_DESCRIPTION="Enter your BackBlaze application key. You can find this information in <a href='https://secure.backblaze.com/b2_buckets.htm'>your BackBlaze account page</a> after clicking on 'Show Account ID and Application Key'. <strong>WARNING</strong>! This is only shown to you ONCE by BackBlaze. To display it again you will have to regenerate the Application Key, causing ALL previously linked instances of Akeeba Backup to get unlinked until you enter there the <em>new</em> Application Key."
COM_AKEEBA_CONFIG_BACKBLAZE_BUCKET_TITLE="Bucket"
COM_AKEEBA_CONFIG_BACKBLAZE_BUCKET_DESCRIPTION="Your Backblaze bucket name"
COM_AKEEBA_CONFIG__BACKBLAZE_DIRECTORY_TITLE="Directory"
COM_AKEEBA_CONFIG_BACKBLAZE_DIRECTORY_DESCRIPTION="The directory within your bucket where the backup archives will be stored. Leave blank to store files inside the bucket's root."
COM_AKEEBA_CONFIG_BACKBLAZE_DISABLEMULTIPART_TITLE="Disable multipart uploads"
COM_AKEEBA_CONFIG_BACKBLAZE_DISABLEMULTIPART_DESCRIPTION="When you enable this option Akeeba Backup will perform single part uploads to Backblaze. You will need to use a smaller Part Size for Split Archives setting in the Archiver Engine configuration to prevent the upload from timing out, causing the backup process to fail."
COM_AKEEBA_TRANSFER_ERR_CANTCREATETEMPCHUNK="Cannot create a temporary file on this server. Please check that your temporary directory is correctly set up and writeable by the user the web server is currently runnning under."
COM_AKEEBA_TRANSFER_LBL_TRANSFERMODE="Archive transfer mode"
COM_AKEEBA_TRANSFER_LBL_TRANSFERMODE_INFO="The backup archive files are transferred in small chunks to the remote server and then assembled into whole files there. This option controls how these small chunks are transferred."
COM_AKEEBA_TRANSFER_LBL_TRANSFERMODE_POST="Over HTTP / HTTPS"
COM_AKEEBA_TRANSFER_LBL_TRANSFERMODE_CHUNKED="Over FTP / SFTP"
COM_AKEEBA_TRANSFER_LBL_CHUNKSIZE="Chunk size"
COM_AKEEBA_TRANSFER_LBL_CHUNKSIZE_INFO="The backup archive files are transferred in small chunks to the remote server. This determines the size of these chunks. Too small sizes may cause the remote server to block you, mistaking you as an abuser, causing an upload error to be displayed. Too large sizes may result in a timeout error on either the source or the remote server, causing an AJAX Error to be displayed. Typically, values between 5M to 20M work best."

COM_AKEEBA_CONFIG_ENGINE_POSTPROC_OVH_TITLE="Upload to OVH Object Storage"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_OVH_DESCRIPTION="Uploads the backup archive to OVH Object Storage. <br/><strong>Remember to set a split archive size of 2-30Mb or you risk backup failure due to timeouts!</strong>"
COM_AKEEBA_CONFIG_OVH_PROJECTID_TITLE="Project ID"
COM_AKEEBA_CONFIG_OVH_PROJECTID_DESCRIPTION="Your OVH cloud server project ID. In OVH's cloud manager expand your Server and click on the Storage link. In the main page area you see the name of the server and right below it there is a 32 character alphanumeric string such as a0b1c2d3e4f56789abcdef0123456789. This is the Project ID you need to enter here."
COM_AKEEBA_CONFIG_OVH_USERNAME_TITLE="OpenStack Username"
COM_AKEEBA_CONFIG_OVH_USERNAME_DESCRIPTION="THIS IS NOT YOUR OVH LOGIN USERNAME! Create a user from your OVH cloud manager, Servers, expand your server, click on OpenStack, click on Add User. Copy the ID of the created user here."
COM_AKEEBA_CONFIG_OVH_PASSWORD_TITLE="OpenStack Password"
COM_AKEEBA_CONFIG_OVH_PASSWORD_DESCRIPTION="THIS IS NOT YOUR OVH LOGIN PASSWORD! Create a user from your OVH cloud manager, Servers, expand your server, click on OpenStack, click on Add User. Copy the Password of the created user here."
COM_AKEEBA_CONFIG_OVH_CONTAINERURL_TITLE="Container URL"
COM_AKEEBA_CONFIG_OVH_CONTAINERURL_DESCRIPTION="THIS IS NOT THE STORAGE CONTAINER NAME! Go to your OVH cloud manager, Servers, expand your server, click on Storage. You will see the Container URL written there above the list of your files. Copy it here."
COM_AKEEBA_CONFIG_OVH_DIRECTORY_TITLE="Directory"
COM_AKEEBA_CONFIG_OVH_DIRECTORY_DESCRIPTION="The directory within the OVH object storage container to store the backup archives. To store everything on the container's root, please leave blank."

COM_AKEEBA_CONFIG_ENGINE_POSTPROC_SWIFT_TITLE="Upload to OpenStack Swift object storage"
COM_AKEEBA_CONFIG_SWIFT_AUTHURL_DESCRIPTION="The endpoint for the Keystone service of your OpenStack installation. DO include the version. DO NOT include the /token suffix. Example: https://authentication.example.com/v2.0"
COM_AKEEBA_CONFIG_SWIFT_AUTHURL_TITLE="Authentication URL"
COM_AKEEBA_CONFIG_SWIFT_CONTAINERURL_DESCRIPTION="The API endpoint for your object storage container, e.g. https://storage.example.com/v1/AUTH_abcdef0123456789abcdef0123456789/my-container"
COM_AKEEBA_CONFIG_SWIFT_CONTAINERURL_TITLE="Container URL"
COM_AKEEBA_CONFIG_SWIFT_DIRECTORY_DESCRIPTION="The directory within the OpenStack Swift object storage container to store the backup archives. To store everything on the container's root, please leave blank."
COM_AKEEBA_CONFIG_SWIFT_DIRECTORY_TITLE="Directory"
COM_AKEEBA_CONFIG_SWIFT_PASSWORD_DESCRIPTION="The OpenStack API password for your cloud."
COM_AKEEBA_CONFIG_SWIFT_PASSWORD_TITLE="OpenStack Password"
COM_AKEEBA_CONFIG_SWIFT_TENANTID_DESCRIPTION="Your OpenStack tenant ID (Keystone v2) or project ID (Keystone v3) , e.g. a0b1c2d3e4f56789abcdef0123456789"
COM_AKEEBA_CONFIG_SWIFT_TENANTID_TITLE="Tenant ID / Project ID"
COM_AKEEBA_CONFIG_SWIFT_USERNAME_DESCRIPTION="The OpenStack API username for your cloud."
COM_AKEEBA_CONFIG_SWIFT_USERNAME_TITLE="OpenStack Username"
COM_AKEEBA_CONFIG_SWIFT_KEYSTONE_VERSION_TITLE="Keystone version"
COM_AKEEBA_CONFIG_SWIFT_KEYSTONE_VERSION_DESCRIPTION="Choose which version of OpenStack Keystone authentication service is used by your storage provider. If unsure please ask your storage provider."
COM_AKEEBA_CONFIG_SWIFT_KEYSTONE_VERSION_V2="Keystone v2 (Legacy)"
COM_AKEEBA_CONFIG_SWIFT_KEYSTONE_VERSION_V3="Keystone v3"
COM_AKEEBA_CONFIG_SWIFT_DOMAIN_TITLE="Keystone v3 Authentication Domain"
COM_AKEEBA_CONFIG_SWIFT_DOMAIN_DESCRIPTION="Only used with Keystone v3 authentication. This is the authentication domain for the Keystone v3 service, <strong>NOT</strong> the hostname of the Keystone authentication server. In most cases it's <code>default</code> or <code>Default</code>. If unsure please ask your storage provider."

COM_AKEEBA_CONFIG_GOOGLEDRIVE_REFRESHTEAMDRIVES_TITLE="Reload the list of Drives"
COM_AKEEBA_CONFIG_GOOGLEDRIVE_TEAMDRIVE_TITLE="Drive"
COM_AKEEBA_CONFIG_GOOGLEDRIVE_TEAMDRIVE_DESCRIPTION="Which Google Drive you want your files stored into. You need to finish authentication before this list is populated. Only makes sense when you have access to Google Team Drives (e.g. G Suite business or enterprise plan users). If unsure use the “Google Drive (personal)” option."
COM_AKEEBA_CONFIG_GOOGLEDRIVE_TEAMDRIVE_OPT_PERSONAL="Google Drive (personal)"
COM_AKEEBA_CONFIG_GOOGLEDRIVE_UPLOADTOSHAREDWITHME_TITLE="Upload to “Shared With Me” folders"
COM_AKEEBA_CONFIG_GOOGLEDRIVE_UPLOADTOSHAREDWITHME_DESCRIPTION="When enabled, Akeeba Backup will look for folders in the Shared With me collection before looking for a same-named folder in your Drive. This is much slower and might lead to uploading into the wrong folder if many shared folders with the same named exist in your Google Drive account."

COM_AKEEBA_CONFIG_BACKEND_SHOWDELETEONRESTORE_LABEL="Show the “Delete everything before extraction” option"
COM_AKEEBA_CONFIG_BACKEND_SHOWDELETEONRESTORE_DESC="Should I give users restoring a site the option to delete everything before extracing an archive? This option only applies to the Professional version of our software. WARNING! THIS IS EXTREMELY DANGEROUS. READ THE DOCUMENTATION VERY CAREFULLY BEFORE ENABLING IT. IF YOU USE THIS FEATURE DURING RESTORATION YOU ARE WAIVING ANY RIGHT TO REQUEST SUPPORT AND ASSUME ALL RESPONSIBILITY AND LIABILITY."
COM_AKEEBA_RESTORE_LABEL_ZAPBEFORE="Delete everything before extraction"
COM_AKEEBA_RESTORE_LABEL_ZAPBEFORE_HELP="Tries to delete all existing files and folders under your site's root directory before extracting the backup archive. It DOES NOT take into account which files and folders exist in the backup archive or which files and folders are excluded during backup. Files and folders deleted by this feature CAN NOT be recovered. <strong>WARNING! THIS MAY DELETE FILES AND FOLDERS WHICH DO NOT BELONG TO YOUR SITE. THIS FEATURE IS ONLY MEANT FOR VERY EXPERIENCED USERS WHO UNDERSTAND THE RISKS. USE WITH EXTREME CAUTION. BY ENABLING THIS FEATURE YOU ASSUME ALL RESPONSIBILITY AND LIABILITY. FURTHERMORE YOU WAIVE ANY RIGHT TO REQUEST SUPPORT FROM AKEEBA LTD.</strong>"
COM_AKEEBA_CONFIG_OPTIONALFILTERS_ACTIONLOGS_ENABLED_TITLE="Joomla! User Actions Log"
COM_AKEEBA_CONFIG_OPTIONALFILTERS_ACTIONLOGS_ENABLED_DESCRIPTION="In Joomla! 3.9 and later user actions are logged inside the database, creating a table with millions of rows and slowing down your backup. Check this option to exclude such data."

COM_AKEEBA_CONFIG_ENGINE_POSTPROC_BOX_TITLE="Upload to Box.com"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_BOX_DESCRIPTION="Uploads the backup archive to Box.com. Please read the documentation."
COM_AKEEBA_CONFIG_BOX_DIRECTORY_TITLE="Directory"
COM_AKEEBA_CONFIG_BOX_DIRECTORY_DESCRIPTION="The directory within your Box account where the backup archives will be stored. Leave blank to store files inside the Box folder root."

COM_AKEEBA_CONFIG_BOX_REFRESHTOKEN_TITLE="Refresh Token"
COM_AKEEBA_CONFIG_BOX_REFRESHTOKEN_DESCRIPTION="First, use the Authorisation – Start Here button above. Then please copy the Access Token and Refresh Token here. Do NOT share the same token on many sites. Instead, authenticate each site separately."
COM_AKEEBA_CONFIG_BOX_ACCESSTOKEN_TITLE="Access Token"

COM_AKEEBA_S3_REGION_EUWNORTH1="EU (Stockholm)"

COM_AKEEBA_RESTORE_LABEL_TIME_HEAD="Timing settings (advanced)"
COM_AKEEBA_RESTORE_LABEL_MIN_EXEC="Minimum execution time (seconds)"
COM_AKEEBA_RESTORE_LABEL_MIN_EXEC_TIP="Each files extraction step will not return for this many seconds. Set higher than the maximum setting below to add “dead time” in each step, reducing resource usage."
COM_AKEEBA_RESTORE_LABEL_MAX_EXEC="Maximum execution time (seconds)"
COM_AKEEBA_RESTORE_LABEL_MAX_EXEC_TIP="Files will be extracted for at most this many seconds in each step. Increase to make extraction faster. Decrease to prevent server timeouts."

COM_AKEEBA_S3_ACCESS_TITLE="Bucket access"
COM_AKEEBA_S3_ACCESS_DESCRIPTION="How the API will access the bucket. If unsure use Virtual Hosting. Virtual Hosting is the recommended, supported method for Amazon S3 which uses a URL like https://BUCKET.ENDPOINT to access the bucket. Path Access is an unsupported, deprecated method which uses a URL like https://ENDPOINT/BUCKET to access the bucket. You should only use Path Access if a third party storage provider with an Amazon S3-compatible API asks you to do that."
COM_AKEEBA_S3_ACCESS_VIRTUALHOST="Virtual Hosting (recommended)"
COM_AKEEBA_S3_ACCESS_PATH="Path Access (legacy)"

COM_AKEEBA_DBFILTER_TABLE_META_ROWCOUNT="Number of rows"

COM_AKEEBA_CONFIG_FRONTEND_EMAIL_WHEN_LABEL="When to send the email"
COM_AKEEBA_CONFIG_FRONTEND_EMAIL_WHEN_DESC="When should I send the email on backup completion? Always means every time a backup completed. Upload Failed means that the email is only sent if the backup is complete but the upload to remote storage did not complete successfully. If the backup fails no email can be sent by this feature; check the Schedule Automatic Backups page for information on receiving email about failed backups."
COM_AKEEBA_CONFIG_FRONTEND_EMAIL_WHEN_ALWAYS="Always"
COM_AKEEBA_CONFIG_FRONTEND_EMAIL_WHEN_FAILEDUPLOAD="Upload Failed"

COM_AKEEBA_CONFIG_SUGARSYNC_ACCESS_TITLE="Access Key ID"
COM_AKEEBA_CONFIG_SUGARSYNC_ACCESS_DESCRIPTION="Enter your Access Key ID. Create one at https://www.sugarsync.com/developer/account"
COM_AKEEBA_CONFIG_SUGARSYNC_PRIVATE_TITLE="Private Access Key"
COM_AKEEBA_CONFIG_SUGARSYNC_PRIVATE_DESCRIPTION="Enter the Private Access Key corresponding to your Access Key ID. Create one at https://www.sugarsync.com/developer/account"

COM_AKEEBA_CONFIG_BACKEND_DARKMODE_LABEL="Dark Mode"
COM_AKEEBA_CONFIG_BACKEND_DARKMODE_DESC="Control if and when Akeeba Backup's interface will display with an alternate theme, using vibrant colors on a darker background (“dark mode”). Auto = automatic switch between light and dark mode based on system theme on supported browsers, e.g. Safari. Never = disabled; Akeeba Backup will display with a bright background. Always = always use dark mode colors. We strongly recommend using a dark administrator template when enabling Dark Mode in either Auto or Always modes."
COM_AKEEBA_CONFIG_BACKEND_DARKMODE_AUTO="Auto"
COM_AKEEBA_CONFIG_BACKEND_DARKMODE_NEVER="Never"
COM_AKEEBA_CONFIG_BACKEND_DARKMODE_ALWAYS="Always"

COM_AKEEBA_CONFIG_ENGINE_POSTPROC_PCLOUD_DESCRIPTION="Uploads the backup archive to pCloud. THIS POST-PROCESSING ENGINE WILL BE REMOVED. AUTHENTICATION IS NOT WORKING BECAUSE OF ISSUES ON pCloud's API SERVER."
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_PCLOUD_TITLE="Upload to pCloud (DO NOT USE - WILL BE REMOVED)"
COM_AKEEBA_CONFIG_PCLOUD_DIRECTORY_TITLE="Directory"
COM_AKEEBA_CONFIG_PCLOUD_DIRECTORY_DESCRIPTION="The name of the directory on pCloud where the backup archive will be stored. <strong>The directory MUST already exist, otherwise the upload will fail.</strong>"
COM_AKEEBA_CONFIG_PCLOUD_ACCESSTOKEN_DESCRIPTION="<strong>WARNING! AUTHENTICATION IS NOT WORKING BECAUSE OF ISSUES ON pCloud's API SERVER. THIS POST-PROCESSING ENGINE WILL BE REMOVED IN A FUTURE VERSION OF AKEEBA BACKUP.</strong>."
COM_AKEEBA_CONFIG_PCLOUD_ACCESSTOKEN_TITLE="Access Token"

COM_AKEEBA_CONFIG_JSONAPI_ENABLED_LABEL="Enable JSON API (remote backup)"
COM_AKEEBA_CONFIG_JSONAPI_ENABLED_DESC="The Akeeba Backup JSON API allows you to take and manage backups, as well as manage Akeeba Backup options remotely. You need to enable this option if you plan on taking, downloading or manage backups for example with Akeeba Remote CLI, Akeeba UNiTE and backup scheduling services."

COM_AKEEBA_CONFIG_LEGACYAPI_ENABLED_LABEL="Enable Legacy Front-end Backup API (remote CRON jobs)"
COM_AKEEBA_CONFIG_LEGACYAPI_ENABLED_DESC="The Legacy Front-end Backup API allows you to take scheduled backups using URL access tools such as wget, curl. You need to enable this option if you plan on taking backups with your host's CRON server using wget or curl; or when you plan on using a third party CRON service such as WebCRON.org. Whenever possible we recommend using the Native CLI CRON script or the Akeeba Backup JSON API instead as they are much more secure options."

COM_AKEEBA_CONTROLPANEL_HEAD_PROUPSELL="Make your life easier"
COM_AKEEBA_CONTROLPANEL_HEAD_LBL_PROUPSELL_1="Add scheduled backups, automatic upload to 40+ cloud storage providers, integrated restoration, a site transfer wizard and much more with <strong>Akeeba Backup Professional</strong>."
COM_AKEEBA_CONTROLPANEL_HEAD_LBL_PROUPSELL_2="A single license is valid for <strong>unlimited sites</strong>. It even includes personal support from the developers who write this software."
COM_AKEEBA_CONTROLPANEL_HEAD_LBL_DISCOUNT="Use the coupon code <strong>%s</strong> to subscribe with a <strong>20%%</strong> introductory discount."
COM_AKEEBA_CONTROLPANEL_BTN_LEARNMORE="Learn more about <strong>Akeeba Backup Professional</strong>"
COM_AKEEBA_CONTROLPANEL_BTN_HIDE="Remind me in 15 days"

COM_AKEEBA_BACKUP_LBL_UPGRADENAG="Tired of seeing this page? You can automate your backups with Akeeba Backup Professional."

COM_AKEEBA_CONFIG_DROPBOX_TEAM_TITLE="Dropbox for Business"
COM_AKEEBA_CONFIG_DROPBOX_TEAM_DESC="Check if you are a member of a team using Dropbox for Business and want to use your team's folder to store backups. Remember to prefix the Directory below with the name of your team folder. For example, if Dropbox' web interface shows an “Acme Corp Team Folder” in the Files page and you want to put your backups in a folder called “Backups” inside it you should use the Directory name <code>Acme Corp Team Folder/Backups</code>, not just <code>Backups</code>."

COM_AKEEBA_CPANEL_HEAD_OUTDIR_INVALID="Invalid output directory"
COM_AKEEBA_CPANEL_HEAD_OUTDIR_UNFIXABLE="Unfixable output directory security issue"
COM_AKEEBA_CPANEL_HEAD_OUTDIR_INSECURE="Insecure output directory"
COM_AKEEBA_CPANEL_HEAD_OUTDIR_INSECURE_ALT="Possibly insecure output directory and backup filename"
COM_AKEEBA_CPANEL_LBL_OUTDIR_LISTABLE="Akeeba Backup detected that your backup output directory <code>%s</code> is under your site's web root. Its contents, including your backup archives, are accessible over the web. Moreover, it's possible to list the files in the directory i.e. it gives a listing of your backup archives when you access it with a web browser. <strong>This is a major security issue</strong>. An attacker can access this folder from a web browser and download your backup archives directly, bypassing your site's security."
COM_AKEEBA_CPANEL_LBL_OUTDIR_FILEREADABLE="Akeeba Backup detected that your backup output directory <code>%s</code> is under your site's web root. Its contents, including your backup archives, are accessible over the web. However, it is NOT possible to list the files in the directory with a web browser. <strong>This can be a security issue</strong>. An attacker can guess the name of the backup archive and download it directly, bypassing your site's security."
COM_AKEEBA_CPANEL_LBL_OUTDIR_ISSYSTEM="Moreover, your output directory is the same as or a subdirectory of a folder that is used by Joomla and its extensions for its own, publicly accessible files."
COM_AKEEBA_CPANEL_LBL_OUTDIR_ISSYSTEM_FIX="You need go to the Configuration page of Akeeba Backup and select a different output directory."
COM_AKEEBA_CPANEL_LBL_OUTDIR_DELETEORBEHACKED="Until you do that we <strong>VERY STRONGLY RECOMMEND</strong> not taking a backup of your site and, if you already had, delete all backup archives and backup log files. <strong>FAILURE TO FOLLOW THESE INSTRUCTIONS WILL VERY LIKELY RESULT IN YOUR SITE BEING COMPROMISED (HACKED).</strong>"
COM_AKEEBA_CPANEL_LBL_OUTDIR_CLICKTHEBUTTON="Click the button below to fix this issue. Here's what it does."
COM_AKEEBA_CPANEL_LBL_OUTDIR_FIX_SECURITYFILES="A <code>.htaccess</code> and a <code>web.config</code> file will be written to that folder. On most servers this is enough to prevent direct web downloads of any file inside it and disables the listing of its files. We also have a solution for the servers where these special files don't have an effect. Another three files called <code>index.php</code>, <code>index.html</code> and <code>index.htm</code> will also be written to that folder. These index files prevent the web server from listing the names of the backup archives and backup log files."
COM_AKEEBA_CPANEL_LBL_OUTDIR_FIX_RANDOM="Your “Backup output filename” will be amended to include the <code>[RANDOM]</code> variable in it. This makes guessing the backup filenames practically impossible by adding 16 different, random letters and / or numbers in the backup archive filename every time you take a backup."
COM_AKEEBA_CPANEL_LBL_OUTDIR_TRASHHOST="Unfortunately, your server does not support any reasonable method to secure the directory. No matter what we do it will always list the names of the files it contains and allow you to download them from a browser. Your one and only option is to create a backup output directory above your site's root."
COM_AKEEBA_CPANEL_BTN_FIXSECURITY="Fix the security of my backups"
COM_AKEEBA_BUADMIN_LABEL_FROZEN="Frozen"
COM_AKEEBA_BUADMIN_LABEL_ACTION_FREEZE="Freeze record"
COM_AKEEBA_BUADMIN_LABEL_ACTION_UNFREEZE="Unfreeze record"
COM_AKEEBA_BUADMIN_FREEZE_OK="Record(s) correctly frozen"
COM_AKEEBA_BUADMIN_FREEZE_ERROR="An error occurred while trying to freeze selected records: %s"
COM_AKEEBA_BUADMIN_UNFREEZE_OK="Record(s) correctly unfrozen"
COM_AKEEBA_BUADMIN_UNFREEZE_ERROR="An error occurred while trying to unfreeze selected records: %s"
COM_AKEEBA_BUADMIN_FROZENRECORD_ERROR="Can not perform selected action to a frozen record"
COM_AKEEBA_BUADMIN_LABEL_FROZEN_SELECT="Frozen"
COM_AKEEBA_BUADMIN_LABEL_FROZEN_FROZEN="Frozen"
COM_AKEEBA_BUADMIN_LABEL_FROZEN_UNFROZEN="Unfrozen"
COM_AKEEBA_CONFIG_S3_DUALSTACK_TITLE="Enable IPv6 (dual-stack) support"
COM_AKEEBA_CONFIG_S3_DUALSTACK_DESCRIPTION="Should we use the dual-stack endpoints for Amazon S3? This allows accessing S3 over IPv6 for servers which support IPv6. Servers without IPv6 support will still be able to access S3 over IPv4. It has no effect if you are using a custom endpoint."

COM_AKEEBA_CONFIG_PERMISSIONS_TITLE="Archive permissions"
COM_AKEEBA_CONFIG_PERMISSIONS_DESCRIPTION="Set up the file permissions for the backup archive files. Only applies on Linux, macOS, BSD and other UNIX-style hosts (NOT Windows). If unsure leave as 0666. Changing that may make it impossible to download and / or delete backup archive files over FTP and SFTP. If your server is using PHP-FPM or otherwise runs PHP under the same user as your site's system account use 0600 for best security."
COM_AKEEBA_CONFIG_PERMISSIONS_0600="0600 – Tight security. might cause problems on low end servers"
COM_AKEEBA_CONFIG_PERMISSIONS_0644="0644 – Medium security, for use on single site servers"
COM_AKEEBA_CONFIG_PERMISSIONS_0666="0666 – Lax security, maximum compatibility with commercial hosts"

COM_AKEEBA_ALICE_ERR_NOLOGS="No log files for <strong>failed</strong> backups were found."
COM_AKEEBA_ALICE_HEAD_ONLYFAILED="ALICE only works on <em>failed</em> backups"
COM_AKEEBA_ALICE_LBL_ONLYFAILED_SHOWINGLOGS="ALICE is a tool to analyze the log files of <em>failed</em> backups and — in most cases — give you the most likely cause for the backup failure. It is not meant to analyse the log files of successful backups. Doing that would return nonsensical, misleading or outright wrong results. For this reason we will only show you the log files of <em>failed</em> backups."
COM_AKEEBA_ALICE_LBL_ONLYFAILED_WHATISFAILED="Please remember that backups which didn't finish uploading the backup archive to remote storage are not failed. The root cause for these problems cannot be detected by ALICE anyway. If you have this kind of problem you need to file a support ticket in our site's Support section. If someone else installed Akeeba Backup Professional for you on your site please contact that person instead; you won't be able to file a support ticket on our site in this case."
COM_AKEEBA_ALICE_LBL_ONLYFAILED_IFNOFAILED="If your backup failed but you do not see it on this page please wait for <em>three (3) minutes</em>, go back to the Akeeba Backup Control Panel page and then come back here. There's a reason for that. In some cases the backup failure is caused by a server error. In these cases the backup is marked as still-in-progress instead of failed since PHP stops running, therefore our PHP code which would mark the backup as failed doesn't get the chance to run. When you visit the Control Panel page any backup marked as still-in-progress for more than 3 minutes will be marked as failed. Hence the need to wait and <em>then</em> go back to the Control Panel page."

COM_AKEEBA_RESTORE_LABEL_STEALTHMODE="Enable Stealth Mode while restoring"
COM_AKEEBA_RESTORE_LABEL_STEALTHMODE_HELP="Visitors to your site coming from a different IP address than yours will be temporarily redirected to <code>installation/offline.html</code>, a file telling them your site is currently under maintenance. Only works on servers which support <code>.htaccess</code> files. Please read the documentation for more information."

COM_AKEEBA_CPANEL_WARNING_Q400="Akeeba Backup 8 is not supported on Joomla 4 or later; please upgrade to Akeeba Backup 9."

COM_AKEEBA_CONFIG_POSTPROC_ABORT_ON_FAIL_TITLE="Fail backup on upload failure"
COM_AKEEBA_CONFIG_POSTPROC_ABORT_ON_FAIL_DESCRIPTION="Immediately stops the backup process, marking it as failed, if an upload error occurs. <strong>This option can be misleading and dangerous.</strong> You may have a full, valid backup which simply failed uploading in whole or in part. Enabling this option will remove the remaining backup archive files from your server and leave behind any archive files (partially) uploaded to the remote storage. In other words, you are left with no working backup. There are only very few use cases where this makes more sense than the default behaviour which allows you to resume the backup archive file upload through the Manage Backups page. As a result, we strongly recommend that this option is enabled onl yby expert users who fully understand the implications of doing so."

COM_AKEEBA_CONFIG_OAUTH2_HEADER_LABEL="OAuth2 Helpers"
COM_AKEEBA_CONFIG_OAUTH2_HEADER_DESC="Only for the Professional version. Allows you to have a custom OAuth2 helper URL instead of using the one provided by Akeeba Ltd. Please read the documentation."

COM_AKEEBA_CONFIG_OAUTH2_CLIENT_BOX_LABEL="OAuth2 Helper for Box.com"
COM_AKEEBA_CONFIG_OAUTH2_CLIENT_BOX_DESC="Use Box.com with your own OAuth2 API application instead of using the one provided by Akeeba Ltd. Please read the documentation."
COM_AKEEBA_CONFIG_BOX_CLIENT_ID_LABEL="Client ID"
COM_AKEEBA_CONFIG_BOX_CLIENT_ID_DESC="The Client ID you get from Box.com for your API application."
COM_AKEEBA_CONFIG_BOX_CLIENT_SECRET_LABEL="Client Secret"
COM_AKEEBA_CONFIG_BOX_CLIENT_SECRET_DESC="The Client Secret you get from Box.com for your API application."

COM_AKEEBA_CONFIG_OAUTH2_CLIENT_DROPBOX_LABEL="OAuth2 Helper for Dropbox"
COM_AKEEBA_CONFIG_OAUTH2_CLIENT_DROPBOX_DESC="Use Dropbox with your own OAuth2 API application instead of using the one provided by Akeeba Ltd. Please read the documentation."
COM_AKEEBA_CONFIG_DROPBOX_CLIENT_ID_LABEL="Client ID"
COM_AKEEBA_CONFIG_DROPBOX_CLIENT_ID_DESC="The Client ID you get from Dropbox for your API application."
COM_AKEEBA_CONFIG_DROPBOX_CLIENT_SECRET_LABEL="Client Secret"
COM_AKEEBA_CONFIG_DROPBOX_CLIENT_SECRET_DESC="The Client Secret you get from Dropbox for your API application."

COM_AKEEBA_CONFIG_OAUTH2_CLIENT_GOOGLEDRIVE_LABEL="OAuth2 Helper for Google Drive"
COM_AKEEBA_CONFIG_OAUTH2_CLIENT_GOOGLEDRIVE_DESC="Use Google Drive with your own OAuth2 API application instead of using the one provided by Akeeba Ltd. Please read the documentation."
COM_AKEEBA_CONFIG_GOOGLEDRIVE_CLIENT_ID_LABEL="Client ID"
COM_AKEEBA_CONFIG_GOOGLEDRIVE_CLIENT_ID_DESC="The Client ID you get from the Google Cloud Console for your API application."
COM_AKEEBA_CONFIG_GOOGLEDRIVE_CLIENT_SECRET_LABEL="Client Secret"
COM_AKEEBA_CONFIG_GOOGLEDRIVE_CLIENT_SECRET_DESC="The Client Secret you get from the Google Cloud Console for your API application."

COM_AKEEBA_CONFIG_OAUTH2_CLIENT_ONEDRIVEBUSINESS_LABEL="OAuth2 Helper for OneDrive"
COM_AKEEBA_CONFIG_OAUTH2_CLIENT_ONEDRIVEBUSINESS_DESC="Use OneDrive with your own OAuth2 API application instead of using the one provided by Akeeba Ltd. Please read the documentation."
COM_AKEEBA_CONFIG_ONEDRIVEBUSINESS_CLIENT_ID_LABEL="Client ID"
COM_AKEEBA_CONFIG_ONEDRIVEBUSINESS_CLIENT_ID_DESC="The Client ID you get from OneDrive for your API application."
COM_AKEEBA_CONFIG_ONEDRIVEBUSINESS_CLIENT_SECRET_LABEL="Client Secret"
COM_AKEEBA_CONFIG_ONEDRIVEBUSINESS_CLIENT_SECRET_DESC="The Client Secret you get from OneDrive for your API application."

COM_AKEEBA_CONFIG_OAUTH2URLFIELD_YOU_WILL_NEED="You will need the following URLs."
COM_AKEEBA_CONFIG_OAUTH2URLFIELD_CALLBACK_URL="Callback URL"
COM_AKEEBA_CONFIG_OAUTH2URLFIELD_HELPER_URL="OAuth2 Helper URL"
COM_AKEEBA_CONFIG_OAUTH2URLFIELD_REFRESH_URL="OAuth2 Refresh URL"

COM_AKEEBA_CONFIG_COMMON_OAUTH2_TYPE_TITLE="OAuth2 Helper"
COM_AKEEBA_CONFIG_COMMON_OAUTH2_TYPE_DESCRIPTION="Choose which set of OAuth2 helper URLs to use. Please read the documentation."
COM_AKEEBA_CONFIG_COMMON_OAUTH2_TYPE_OPT_AKEEBA="Provided by Akeeba Ltd"
COM_AKEEBA_CONFIG_COMMON_OAUTH2_TYPE_OPT_CUSTOM="Custom"
COM_AKEEBA_CONFIG_COMMON_OAUTH2_HELPER_TITLE="OAuth2 Helper URL"
COM_AKEEBA_CONFIG_COMMON_OAUTH2_HELPER_DESCRIPTION="The full URL to the OAuth2 authentication helper. Please read the documentation."
COM_AKEEBA_CONFIG_COMMON_OAUTH2_REFRESH_TITLE="OAuth2 Refresh URL"
COM_AKEEBA_CONFIG_COMMON_OAUTH2_REFRESH_DESCRIPTION="The full URL to the OAuth2 refresh token helper. Please read the documentation."language/en-GB/en-GB.plg_content_sudesign_audio.sys.ini000060400000003501152453623440017025 0ustar00SD_DESCRIPTION_POSTINSTALL="Thank you for your trust! If you have any problems, do not hesitate to contact us on joomla@sudesign.fr !<br>The plugin is automatically activated, but if you want to configure it <a href='%s'>click here</a>"
SD_DESCRIPTION="<div style='font-family: Verdana;font-size: 1.2em;font-weight: normal;'>Simple Audio Shortcode - Based on MediaElement.js
<br />
<br /><b>Shortcode usage:</b>
<br /> - <b>Simple :</b> [audio src=&quot;source.mp3&quot;]
<br /> - <b>Advanced :</b> [audio src=&quot;source.mp3&quot; loop=&quot;on&quot; preload=&quot;auto&quot; autoplay=&quot;on&quot;]
<br />
<br /><b>Mandatory parameter :</b>
<br /> - <b>src</b> : URL of your audio file  (the alias &quot;mp3&quot; parameter exist too)
<br />
<br /><b>Optional parameters :</b>
<br /> - <b>loop</b> : on / <u>off</u> = Allows for the looping of media
<br /> - <b>autoplay</b> : on / <u>off</u> = Causes the media to automatically play as soon as the media file is ready.
<br /> - <b>preload</b> : <u>none</u> / auto / metadata = Specifies if and how the audio should be loaded when the page loads, by default the audio should not be loaded when the page loads, <b>auto</b> = the audio should be loaded entirely when the page loads, <b>metadata</b> = only metadata should be loaded when the page loads.
<br /> - <b>style</b> : custom CSS code CSS qui sera applied to the audio tag
<br /> - <b>id</b> : audio tag ID
<br /> - <b>class</b> : audio tag Class
<br /> - <b>hidden</b> : on / <u>off</u> = hidden the player
<br /> - <b>showvolume</b> : <u>on</u> / off = hidden volume group
<br /> - <b>txtcolor</b> : change text color, accept classic css colors : #f00, red, rgba(255,0,0,0.5) ..
<br /> - <b>btcolor</b> : change color of main buttons : black, red, green, blue or white (default)
<br />
<br /><i><u>Underscore</u> value = default value</i></div>"language/en-GB/en-GB.plg_captcha_recaptcha.sys.ini000060400000001310152453623440015702 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CAPTCHA_RECAPTCHA_XML_DESCRIPTION="This CAPTCHA plugin uses the reCAPTCHA service to prevent spammers while it helps to digitize books, newspapers and old radio shows. To get a site and secret key for your domain, go to <a href="_QQ_"https://www.google.com/recaptcha"_QQ_" target="_QQ_"_blank"_QQ_">https://www.google.com/recaptcha</a>. To use this for new account registration, go to Options in the User Manager and select CAPTCHA - reCAPTCHA as the CAPTCHA."
PLG_CAPTCHA_RECAPTCHA="CAPTCHA - reCAPTCHA"
language/en-GB/en-GB.plg_sampledata_blog.sys.ini000060400000000550152453623440015410 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SAMPLEDATA_BLOG="Sample Data - Blog"
PLG_SAMPLEDATA_BLOG_XML_DESCRIPTION="Provides the blog sample data. Can be installed using the sample data module."
language/en-GB/en-GB.com_templates.ini000060400000040451152453623440013453 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_TEMPLATES="Templates"
COM_TEMPLATES_ADVANCED_FIELDSET_LABEL="Advanced"
COM_TEMPLATES_ARE_YOU_SURE="Are you sure?"
COM_TEMPLATES_ASSIGNED_1="Assigned to one menu item."
COM_TEMPLATES_ASSIGNED_MORE="Assigned to %d menu items."
COM_TEMPLATES_BASIC_FIELDSET_LABEL="Options"
COM_TEMPLATES_BUTTON_CLOSE_FILE="Close File"
COM_TEMPLATES_BUTTON_COPY_TEMPLATE="Copy Template"
COM_TEMPLATES_BUTTON_COPY_FILE="Copy File"
COM_TEMPLATES_BUTTON_CREATE="Create"
COM_TEMPLATES_BUTTON_CROP="Crop"
COM_TEMPLATES_BUTTON_DELETE="Delete"
COM_TEMPLATES_BUTTON_DELETE_FILE="Delete File"
COM_TEMPLATES_BUTTON_EXTRACT_ARCHIVE="Extract Here"
COM_TEMPLATES_BUTTON_FILE="New File"
COM_TEMPLATES_BUTTON_FOLDERS="Manage Folders"
COM_TEMPLATES_BUTTON_LESS="Compile LESS"
COM_TEMPLATES_BUTTON_PREVIEW="Template Preview"
COM_TEMPLATES_BUTTON_RENAME="Rename"
COM_TEMPLATES_BUTTON_RENAME_FILE="Rename File"
COM_TEMPLATES_BUTTON_RESIZE="Resize"
COM_TEMPLATES_BUTTON_UPLOAD="Upload"
COM_TEMPLATES_CHECK_FILE_OWNERSHIP="Check file ownership"
COM_TEMPLATES_CLICK_TO_ENLARGE="Select to enlarge."
COM_TEMPLATES_COMPILE_ERROR="An error occurred. Failed to compile."
COM_TEMPLATES_COMPILE_LESS="You should compile %s to generate a CSS file."
COM_TEMPLATES_COMPILE_SUCCESS="Successfully compiled LESS."
COM_TEMPLATES_CONFIG_FIELDSET_DESC="Global configuration for templates."
COM_TEMPLATES_CONFIG_POSITIONS_DESC="Enable the preview of the module positions in the template by appending tp=1 to the web address. Also enables the Preview button in the list of templates."
COM_TEMPLATES_CONFIG_POSITIONS_LABEL="Preview Module Positions"
COM_TEMPLATES_CONFIG_FONT_DESC="These file types will be available for font preview."
COM_TEMPLATES_CONFIG_FONT_LABEL="Valid Font Formats"
COM_TEMPLATES_CONFIG_IMAGE_DESC="These file types will be available for cropping and resizing."
COM_TEMPLATES_CONFIG_IMAGE_LABEL="Valid Image Formats"
COM_TEMPLATES_CONFIG_SOURCE_DESC="These file types will be available for editing."
COM_TEMPLATES_CONFIG_SOURCE_LABEL="Valid Source Formats"
COM_TEMPLATES_CONFIG_SUPPORTED_DESC="Be careful before changing the file types. Read the tool tips before editing."
COM_TEMPLATES_CONFIG_SUPPORTED_LABEL="Supported File Formats"
COM_TEMPLATES_CONFIG_UPLOAD_DESC="The maximum upload size for files inside Template Manager."
COM_TEMPLATES_CONFIG_UPLOAD_LABEL="Upload Size (MB)"
COM_TEMPLATES_CONFIGURATION="Template: Options"
COM_TEMPLATES_COPY_SUCCESS="New template called %s was installed."
COM_TEMPLATES_CROP_AREA_ERROR="Crop area not selected."
COM_TEMPLATES_DIRECTORY_NOT_WRITABLE="The template folder is not writable. Some features may not work."
COM_TEMPLATES_ERR_XML="Template XML data not available"
COM_TEMPLATES_ERROR_CANNOT_DELETE_LAST_STYLE="Can't delete the last style of a template. To uninstall/delete a template go to: Extensions-> Manage-> Manage-> Select template to be deleted-> Select 'Uninstall'."
COM_TEMPLATES_ERROR_CANNOT_UNSET_DEFAULT_STYLE="Can't unset default style."
COM_TEMPLATES_ERROR_COULD_NOT_COPY="Unable to copy template files to temporary folder."
COM_TEMPLATES_ERROR_COULD_NOT_INSTALL="Unable to install new template from temporary folder."
COM_TEMPLATES_ERROR_COULD_NOT_WRITE="Unable to delete temporary folder."
COM_TEMPLATES_ERROR_CREATE_NOT_PERMITTED="Unable to create temporary folder."
COM_TEMPLATES_ERROR_DUPLICATE_TEMPLATE_NAME="A template with this name already is installed."
COM_TEMPLATES_ERROR_EDITOR_DISABLED="Either the CodeMirror or the None editor plugin should be enabled to edit template files."
COM_TEMPLATES_ERROR_EXECUTABLE="Can't upload executable files."
COM_TEMPLATES_ERROR_EXTENSION_RECORD_NOT_FOUND="Extension record not found in database."
COM_TEMPLATES_ERROR_FAILED_TO_SAVE_FILENAME="An error occurred. The file %s could not be saved."
COM_TEMPLATES_ERROR_FILE_CREATE="Failed to create file."
COM_TEMPLATES_ERROR_FILE_DELETE="An error occurred. Failed to delete the file."
COM_TEMPLATES_ERROR_FILE_FORMAT="File format not supported."
COM_TEMPLATES_ERROR_FILE_RENAME="An error occurred. Failed to rename file."
COM_TEMPLATES_ERROR_FILE_UPLOAD="Failed to upload file."
COM_TEMPLATES_ERROR_FOLDER_CREATE="Failed to create folder."
COM_TEMPLATES_ERROR_FONT_FILE_NOT_FOUND="Font file not found."
COM_TEMPLATES_ERROR_IMAGE_FILE_NOT_FOUND="Image file not found."
COM_TEMPLATES_ERROR_INDEX_DELETE="The file index.php can't be deleted. Make changes in the editor if you want to change the file."
COM_TEMPLATES_ERROR_INVALID_FROM_NAME="Template to copy from can't be found."
COM_TEMPLATES_ERROR_INVALID_TEMPLATE_NAME="Invalid template name. Please use only letters, numbers, dashes and underscores."
COM_TEMPLATES_ERROR_RENAME_INDEX="The file index.php can't be renamed."
COM_TEMPLATES_ERROR_ROOT_DELETE="The root folder can't be deleted."
COM_TEMPLATES_ERROR_SAVE_DISABLED_TEMPLATE="Unable to save a style associated to a disabled template."
COM_TEMPLATES_ERROR_SOURCE_FILE_NOT_FOUND="Source file not found."
COM_TEMPLATES_ERROR_SOURCE_FILE_NOT_UNWRITABLE="Source file can't be returned to unwritable status."
COM_TEMPLATES_ERROR_SOURCE_FILE_NOT_WRITABLE="Source file not writable."
COM_TEMPLATES_ERROR_SOURCE_ID_FILENAME_MISMATCH="Stored ID does not match the submitted one."
COM_TEMPLATES_ERROR_STYLE_NOT_FOUND="Style not found."
COM_TEMPLATES_ERROR_STYLE_REQUIRES_TITLE="The style requires a title."
COM_TEMPLATES_ERROR_TEMPLATE_FOLDER_NOT_FOUND="Template folder not found."
COM_TEMPLATES_ERROR_UPLOAD_INPUT="No file was found."
COM_TEMPLATES_ERROR_WARNFILENAME="Invalid file name. Please correct the name of the file and upload again."
COM_TEMPLATES_ERROR_WARNFILETOOLARGE="File bigger than 2 MB can't be uploaded."
COM_TEMPLATES_ERROR_WARNFILETYPE="File format not supported."
COM_TEMPLATES_ERROR_WARNIEXSS="Can't be uploaded. Has XSS."
COM_TEMPLATES_FIELD_CLIENT_DESC="Whether this template is used for the Frontend (0) or the Backend (1)."
COM_TEMPLATES_FIELD_CLIENT_LABEL="Location"
COM_TEMPLATES_FIELD_HOME_ADMINISTRATOR_DESC="This template style is defined as the default."
COM_TEMPLATES_FIELD_HOME_LABEL="Default"
COM_TEMPLATES_FIELD_HOME_SITE_DESC="If the multilingual functionality is not implemented, please limit your choice between <b>No</b> and <b>All</b>. This template style will be defined as the global default template style.<br />If the <b>System - Language Filter</b> plugin is enabled and you use different template styles depending on your content languages please assign a language to this style."
COM_TEMPLATES_FIELD_SOURCE_DESC="Source code."
COM_TEMPLATES_FIELD_SOURCE_LABEL="Source Code"
COM_TEMPLATES_FIELD_TEMPLATE_DESC="Template name."
COM_TEMPLATES_FIELD_TEMPLATE_LABEL="Template"
COM_TEMPLATES_FIELD_TITLE_DESC="Style name."
COM_TEMPLATES_FIELD_TITLE_LABEL="Style Name"
COM_TEMPLATES_FILE_ARCHIVE_OPEN_FAIL="Failed to open the archive file."
COM_TEMPLATES_FILE_ARCHIVE_EXISTS="Some files with the same name already exist."
COM_TEMPLATES_FILE_ARCHIVE_NOT_FOUND="Archive file not found."
COM_TEMPLATES_FILE_ARCHIVE_EXTRACT_SUCCESS="Successfully extracted the archive file."
COM_TEMPLATES_FILE_ARCHIVE_EXTRACT_FAIL="Failed to extract the archive file."
COM_TEMPLATES_FILE_CREATE_ERROR="An error occurred creating the file."
COM_TEMPLATES_FILE_CREATE_SUCCESS="File created."
COM_TEMPLATES_FILE_CONTENT_PREVIEW="File Content Preview"
COM_TEMPLATES_FILE_COPY_FAIL="Failed to copy the file."
COM_TEMPLATES_FILE_COPY_SUCCESS="The current file was copied as %s."
COM_TEMPLATES_FILE_CROP_ERROR="Failed to crop image."
COM_TEMPLATES_FILE_CROP_SUCCESS="Image cropped."
COM_TEMPLATES_FILE_DELETE_ERROR="Not able to delete the file."
COM_TEMPLATES_FILE_DELETE_FAIL="Not able to delete the file."
COM_TEMPLATES_FILE_DELETE_SUCCESS="File deleted."
COM_TEMPLATES_FILE_NEW_NAME_DESC="Enter the name of the new copied file."
COM_TEMPLATES_FILE_NEW_NAME_LABEL="Copied File Name"
COM_TEMPLATES_FILE_EXISTS="File with the same name already exists."
COM_TEMPLATES_FILE_INFO="File Information"
COM_TEMPLATES_FILE_NAME="File Name"
COM_TEMPLATES_FILE_PERMISSIONS="The File Permissions are %s"
COM_TEMPLATES_FILE_RENAME_ERROR="An error occurred renaming the file."
COM_TEMPLATES_FILE_RENAME_SUCCESS="File renamed."
COM_TEMPLATES_FILE_RESIZE_ERROR="Failed to resize image."
COM_TEMPLATES_FILE_RESIZE_SUCCESS="Image resized."
COM_TEMPLATES_FILE_SAVE_SUCCESS="File saved."
COM_TEMPLATES_FILE_UNSUPPORTED_ARCHIVE="Unsupported files present inside the zip file."
COM_TEMPLATES_FILE_UPLOAD_ERROR="There was an error uploading the file."
COM_TEMPLATES_FILE_UPLOAD_SUCCESS="Successfully uploaded file."
COM_TEMPLATES_FILTER_TEMPLATE="- Select Template -"
COM_TEMPLATES_FOLDER_CREATE_ERROR="There was an error creating the folder."
COM_TEMPLATES_FOLDER_CREATE_SUCCESS="Folder created."
COM_TEMPLATES_FOLDER_DELETE_ERROR="An error occurred. Failed to delete folder."
COM_TEMPLATES_FOLDER_DELETE_SUCCESS="Folder deleted."
COM_TEMPLATES_FOLDER_ERROR="Not able to create folder."
COM_TEMPLATES_FOLDER_EXISTS="Folder with the same name already exists."
COM_TEMPLATES_FOLDER_NAME="Folder Name"
COM_TEMPLATES_FOLDER_NOT_EXISTS="The folder does not exist."
COM_TEMPLATES_FTP_DESC="For updating the template source files, Joomla will most likely need your FTP account details. Please enter them in the form fields below."
COM_TEMPLATES_FTP_TITLE="FTP Login Details"
COM_TEMPLATES_GRID_UNSET_LANGUAGE="Unset %s Default"
COM_TEMPLATES_HOME_BUTTON="Documentation"
COM_TEMPLATES_HOME_HEADING="Select a File"
COM_TEMPLATES_HOME_TEXT="You can select from a number of options for customising the look of your templates. The Template Manager supports Source files, Image files, Font files, Zip archives and most of the operations that can be performed on those files. Select a file and you are good to go. Check the documentation if you want to know more."
COM_TEMPLATES_HEADING_ASSIGNED="Assigned"
COM_TEMPLATES_HEADING_DEFAULT="Default"
COM_TEMPLATES_HEADING_DEFAULT_ASC="Default ascending"
COM_TEMPLATES_HEADING_DEFAULT_DESC="Default descending"
COM_TEMPLATES_HEADING_IMAGE="Image"
COM_TEMPLATES_HEADING_LOCATION_ASC="Location ascending"
COM_TEMPLATES_HEADING_LOCATION_DESC="Location descending"
COM_TEMPLATES_HEADING_PAGES="Pages"
COM_TEMPLATES_HEADING_STYLE="Style"
COM_TEMPLATES_HEADING_STYLE_ASC="Style ascending"
COM_TEMPLATES_HEADING_STYLE_DESC="Style descending"
COM_TEMPLATES_HEADING_TEMPLATE="Template"
COM_TEMPLATES_HEADING_TEMPLATE_ASC="Template ascending"
COM_TEMPLATES_HEADING_TEMPLATE_DESC="Template descending"
COM_TEMPLATES_IMAGE_HEIGHT="Height"
COM_TEMPLATES_IMAGE_WIDTH="Width"
COM_TEMPLATES_INVALID_FILE_NAME="Invalid file name. Please choose a file name with a-z, A-Z, 0-9, - and _."
COM_TEMPLATES_INVALID_FILE_TYPE="File type not selected."
COM_TEMPLATES_INVALID_FOLDER_NAME="Invalid folder name. Please choose a folder name with a-z, A-Z, 0-9, - and _."
COM_TEMPLATES_MANAGER="Templates"
COM_TEMPLATES_MANAGER_ADD_STYLE="Templates: Add Style"
COM_TEMPLATES_MANAGER_EDIT_FILE="Templates: Edit File"
COM_TEMPLATES_MANAGER_EDIT_STYLE="Templates: Edit Style"
COM_TEMPLATES_MANAGE_FOLDERS="Manage Folders"
COM_TEMPLATES_MANAGER_STYLES="Templates: Styles"
COM_TEMPLATES_MANAGER_STYLES_ADMIN="Templates: Styles (Administrator)"
COM_TEMPLATES_MANAGER_STYLES_SITE="Templates: Styles (Site)"
COM_TEMPLATES_MANAGER_TEMPLATES="Templates"
COM_TEMPLATES_MANAGER_TEMPLATES_ADMIN="Templates: Templates (Administrator)"
COM_TEMPLATES_MANAGER_TEMPLATES_SITE="Templates: Templates (Site)"
COM_TEMPLATES_MANAGER_VIEW_TEMPLATE="Templates: Customise (%s)"
COM_TEMPLATES_MENU_CHANGED_1="1 menu item has been assigned or unassigned to this style."
COM_TEMPLATES_MENU_CHANGED_MORE="%d menu items have been assigned or unassigned to this style."
COM_TEMPLATES_MENUS_ASSIGNMENT="Menu Assignment"
COM_TEMPLATES_MODAL_FILE_DELETE="The file %s will be deleted."
COM_TEMPLATES_MSG_MANAGE_NO_STYLES="There are no styles installed matching your query."
COM_TEMPLATES_MSG_MANAGE_NO_TEMPLATES="There are no templates installed matching your query."
COM_TEMPLATES_N_ITEMS_DELETED="%d template styles deleted."
COM_TEMPLATES_N_ITEMS_DELETED_1="Template style deleted."
COM_TEMPLATES_NEW_FILE_HEADER="Create or Upload a new file."
COM_TEMPLATES_NEW_FILE_NAME="New File Name"
COM_TEMPLATES_NEW_FILE_SELECT="Select a file type"
COM_TEMPLATES_NEW_FILE_TYPE="File Type"
COM_TEMPLATES_NO_TEMPLATE_SELECTED="No template selected."
COM_TEMPLATES_OPTION_NONE=":: None ::"
; Deprecated 4.0
COM_TEMPLATES_OPTION_SELECT_PAGE="- Select Page -"
COM_TEMPLATES_OPTION_SELECT_MENU_ITEM="- Select Menu Item -"
COM_TEMPLATES_OVERRIDE_CREATED="Override created in "
COM_TEMPLATES_OVERRIDE_EXISTS="Override already exists."
COM_TEMPLATES_OVERRIDE_FAILED="Failed to create override."
COM_TEMPLATES_OVERRIDE_SUCCESS="Successfully created the override."
COM_TEMPLATES_OVERRIDES_COMPONENTS="Components"
COM_TEMPLATES_OVERRIDES_LAYOUTS="Layouts"
COM_TEMPLATES_OVERRIDES_MODULES="Modules"
COM_TEMPLATES_OVERRIDES_PLUGINS="Plugins"
COM_TEMPLATES_PREVIEW="Preview"
COM_TEMPLATES_RENAME_FILE="Rename file %s"
COM_TEMPLATES_RESIZE_IMAGE="Resize Image"
COM_TEMPLATES_SOURCE_CODE="Source"
COM_TEMPLATES_SITE_PREVIEW="Site Preview"
COM_TEMPLATES_STYLE_CANNOT_DELETE_DEFAULT_STYLE="Can't delete default style."
COM_TEMPLATES_STYLE_SAVE_SUCCESS="Style saved."
COM_TEMPLATES_STYLES_FILTER_SEARCH_DESC="Search in style description."
COM_TEMPLATES_STYLES_PAGES_ALL="Default for all pages"
COM_TEMPLATES_STYLES_PAGES_ALL_LANGUAGE="Default for %s pages"
COM_TEMPLATES_STYLES_PAGES_SELECTED="Assigned on %s pages"
COM_TEMPLATES_STYLES_PAGES_NONE="Not assigned"
COM_TEMPLATES_SUBMENU_STYLES="Styles"
COM_TEMPLATES_SUBMENU_TEMPLATES="Templates"
COM_TEMPLATES_SUCCESS_DUPLICATED="Style duplicated."
COM_TEMPLATES_SUCCESS_HOME_SET="Default style set."
COM_TEMPLATES_SUCCESS_HOME_UNSET="Default style unset."
COM_TEMPLATES_TAB_DESCRIPTION="Template Description"
COM_TEMPLATES_TAB_EDITOR="Editor"
COM_TEMPLATES_TAB_OVERRIDES="Create Overrides"
COM_TEMPLATES_TEMPLATE_ADD_CSS="Add new stylesheet"
COM_TEMPLATES_TEMPLATE_ADD_ERROR="Add custom error page template (optional)."
COM_TEMPLATES_TEMPLATE_CLOSE="Close"
COM_TEMPLATES_TEMPLATE_COPY="Copy Template"
COM_TEMPLATES_TEMPLATE_CSS="Stylesheets"
COM_TEMPLATES_TEMPLATE_DESCRIPTION="Template description."
COM_TEMPLATES_TEMPLATE_DETAILS="%s Details and Files"
COM_TEMPLATES_TEMPLATE_EDIT_CSS="Edit %s"
COM_TEMPLATES_TEMPLATE_EDIT_ERROR="Edit error page template"
COM_TEMPLATES_TEMPLATE_EDIT_MAIN="Edit main page template"
COM_TEMPLATES_TEMPLATE_EDIT_OFFLINEVIEW="Edit offline page template"
COM_TEMPLATES_TEMPLATE_EDIT_PRINTVIEW="Edit print view template"
COM_TEMPLATES_TEMPLATE_FILENAME="Editing file &quot;%s&quot; in template &quot;%s&quot;."
COM_TEMPLATES_TEMPLATE_FILES="Template Files"
COM_TEMPLATES_TEMPLATE_HTML="HTML files"
COM_TEMPLATES_TEMPLATE_MASTER_FILES="Template Master Files"
COM_TEMPLATES_TEMPLATE_NEW_NAME_DESC="Enter the name of the new template. Please use letters, numbers and underscore only."
COM_TEMPLATES_TEMPLATE_NEW_NAME_LABEL="New Template Name"
COM_TEMPLATES_TEMPLATE_NO_PREVIEW="No preview available. You can enable preview in the options."
COM_TEMPLATES_TEMPLATE_NO_PREVIEW_ADMIN="No preview available for Administrator templates"
COM_TEMPLATES_TEMPLATE_NO_PREVIEW_DESC="To enable template previews, enable the Preview Module Positions option in Template Options."
COM_TEMPLATES_TEMPLATE_NOT_SPECIFIED="Template not specified."
COM_TEMPLATES_TEMPLATE_PREVIEW="Preview"
COM_TEMPLATES_TEMPLATES_FILTER_SEARCH_DESC="Search in template name or folder name."
COM_TEMPLATES_TOGGLE_FULL_SCREEN="Press Ctrl-Q to toggle Full Screen editing."
COM_TEMPLATES_TOOLBAR_SET_HOME="Default"
COM_TEMPLATES_WARNING_FORMAT_WILL_NOT_BE_VISIBLE="You have created a new file with the extension '%s'. This is supported but as you did not have that file extension in the list of supported formats this can't be displayed. Please double check the options for Templates and add the format if needed."
COM_TEMPLATES_XML_DESCRIPTION="This component manages templates"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_TEMPLATES="Changes apply to this component only.<br /><em><strong>Inherited</strong></em> - a Global Configuration setting or higher level setting is applied.<br /><em><strong>Denied</strong></em> always wins - whatever is set at the Global or higher level and applies to all child elements.<br /><em><strong>Allowed</strong></em> will enable the action for this component unless overruled by a Global Configuration setting."
language/en-GB/en-GB.plg_finder_newsfeeds.sys.ini000060400000001001152453623440015574 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FINDER_NEWSFEEDS="Smart Search - News Feeds"
PLG_FINDER_NEWSFEEDS_ERROR_ACTIVATING_PLUGIN="Could not automatically activate the &quot;Smart Search - Joomla! News Feeds&quot; plugin."
PLG_FINDER_NEWSFEEDS_XML_DESCRIPTION="This plugin indexes Joomla! News feeds."
PLG_FINDER_STATISTICS_NEWS_FEED="News Feed"
language/en-GB/en-GB.plg_editors-xtd_pagebreak.ini000060400000000737152453623440015733 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS-XTD_PAGEBREAK="Button - Page Break"
PLG_EDITORSXTD_PAGEBREAK_BUTTON_PAGEBREAK="Page Break"
PLG_EDITORSXTD_PAGEBREAK_XML_DESCRIPTION="Provides a button to enable a page break to be inserted into an Article. A popup allows you to configure the settings to be used."
language/en-GB/en-GB.plg_extension_jce.ini000060400000000442152453623440014312 0ustar00; JCE Project
; Copyright (C) 2006 - 2016 Ryan Demmer. All rights reserved
; GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html

; Note : All ini files need to be saved as UTF-8
PLG_EXTENSION_JCE="Extension - JCE"
PLG_EXTENSION_JCE_XML_DESCRIPTION="JCE Extension Plugin"
language/en-GB/en-GB.plg_fields_mediajce.ini000060400000006130152453623440014544 0ustar00; JCE
; Copyright (C) 2009 - 2018 Ryan Demmer. All rights reserved.
; License GNU General Public License version 2 or later; see LICENSE.txt, see LICENSE.php
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_MEDIAJCE="Fields - Media JCE"
PLG_FIELDS_MEDIAJCE_XML_DESCRIPTION="JCE Media Field Plugin"
PLG_FIELDS_MEDIAJCE_LABEL="JCE File Browser (media)"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIATYPE_LABEL="Media Type"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIATYPE_DESC="The type of media to display in the File Browser. Set a type, eg: images, media, documents, files, or enter in a comma separated list of extensions, eg: pdf,doc,xls"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_CLASS_LABEL="Media Class"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_CLASS_DESC="A space separated list of classes to add to the element"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_DESCRIPTION_LABEL="Description"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_DESCRIPTION_DESC="A description for the media item. For images, this will be set as the alt attribute, for files as the file link text."
PLG_FIELDS_MEDIAJCE_PARAMS_EXTENDEDMEDIA_LABEL="Extended Media"
PLG_FIELDS_MEDIAJCE_PARAMS_EXTENDEDMEDIA_DESC="Show additional fields to set parameters for each media field."
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_CAPTION_CLASS_LABEL="Caption Class"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_CAPTION_CLASS_DESC="A space separated list of classes to add to the caption element if enabled"

PLG_FIELDS_MEDIAJCE_PARAMS_LEGACYMEDIA_LABEL="Legacy Media Support"
PLG_FIELDS_MEDIAJCE_PARAMS_LEGACYMEDIA_DESC="Support legacy Media fields that require single input values."

PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_LABEL="Target"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_DESC="Specifies where the link destination document will be loaded, if the Media Type is not images."
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_BLANK="Open in new window"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_SELF="Open in current window / frame"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_PARENT="Open in parent window / frame"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_TOP="Open in top frame (replaces all frames)"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_DOWNLOAD="Download"

PLG_FIELDS_MEDIAJCE_PARAMS_DISPLAYTYPE_LABEL="Display Type"
PLG_FIELDS_MEDIAJCE_PARAMS_DISPLAYTYPE_DESC="The display type for the media item, eg: Embed or Link"
PLG_FIELDS_MEDIAJCE_PARAMS_DISPLAYTYPE_EMBED="Embed"
PLG_FIELDS_MEDIAJCE_PARAMS_DISPLAYTYPE_LINK="Link"

PLG_FIELDS_MEDIAJCE_BUTTON_UPLOAD="Upload"

PLG_FIELDS_MEDIAJCE_MEDIA_FILE_LABEL="File"
PLG_FIELDS_MEDIAJCE_MEDIA_TEXT_LABEL="Description"
PLG_FIELDS_MEDIAJCE_MEDIA_TYPE_LABEL="Type"
PLG_FIELDS_MEDIAJCE_MEDIA_WIDTH_LABEL="Width"
PLG_FIELDS_MEDIAJCE_MEDIA_HEIGHT_LABEL="Height"
PLG_FIELDS_MEDIAJCE_MEDIA_CAPTION_LABEL="Caption"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_FOLDER_LABEL="Media Path"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_FOLDER_DESC="Path where media files are located, relative to the first File Directory Path set in the Editor Profile. Prefix the path with : to match directly against a configured File Directory Path entry, allowing access to any designated directory store. If no matching entry is found, the path falls back to relative behaviour."language/en-GB/en-GB.com_privacy.sys.ini000060400000002430152453623440013742 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_PRIVACY="Privacy"
COM_PRIVACY_CONFIRM_VIEW_DEFAULT_DESC="Displays a form to confirm an information request."
COM_PRIVACY_CONFIRM_VIEW_DEFAULT_OPTION="Default"
COM_PRIVACY_CONFIRM_VIEW_DEFAULT_TITLE="Confirm Request"
COM_PRIVACY_CONSENTS_VIEW_DEFAULT_DESC="Shows a list of user consents"
COM_PRIVACY_CONSENTS_VIEW_DEFAULT_TITLE="Privacy: Consents"
COM_PRIVACY_DASHBOARD_VIEW_DEFAULT_DESC="A dashboard related to the site's privacy settings and information requests."
COM_PRIVACY_DASHBOARD_VIEW_DEFAULT_TITLE="Privacy: Dashboard"
COM_PRIVACY_REMIND_VIEW_DEFAULT_DESC="Displays a form to extend the privacy consent"
COM_PRIVACY_REMIND_VIEW_DEFAULT_TITLE="Extend Consent"
COM_PRIVACY_REQUEST_VIEW_DEFAULT_DESC="Displays a form to submit an information request."
COM_PRIVACY_REQUEST_VIEW_DEFAULT_OPTION="Default"
COM_PRIVACY_REQUEST_VIEW_DEFAULT_TITLE="Create Request"
COM_PRIVACY_REQUESTS_VIEW_DEFAULT_DESC="Shows a list of user information requests"
COM_PRIVACY_REQUESTS_VIEW_DEFAULT_TITLE="Privacy: Information Requests"
COM_PRIVACY_XML_DESCRIPTION="Component for managing privacy related actions."
language/en-GB/en-GB.plg_fields_editor.ini000060400000002106152453623440014270 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_EDITOR="Fields - Editor"
PLG_FIELDS_EDITOR_LABEL="Editor (%s)"
PLG_FIELDS_EDITOR_PARAMS_BUTTONS_HIDE_LABEL="Hide Buttons"
PLG_FIELDS_EDITOR_PARAMS_FILTER_DESC="Allow the system to save certain html tags or raw data."
PLG_FIELDS_EDITOR_PARAMS_FILTER_LABEL="Filter"
PLG_FIELDS_EDITOR_PARAMS_HEIGHT_DESC="Defines the height (in pixels) of the WYSIWYG editor and defaults to 250px."
PLG_FIELDS_EDITOR_PARAMS_HEIGHT_LABEL="Height"
PLG_FIELDS_EDITOR_PARAMS_SHOW_BUTTONS_DESC="Should the editors-xtd plugin buttons be shown?"
PLG_FIELDS_EDITOR_PARAMS_SHOW_BUTTONS_LABEL="Show Buttons"
PLG_FIELDS_EDITOR_PARAMS_WIDTH_DESC="Defines the width (in pixels) of the WYSIWYG editor and defaults to 100%."
PLG_FIELDS_EDITOR_PARAMS_WIDTH_LABEL="Width"
PLG_FIELDS_EDITOR_XML_DESCRIPTION="This plugin lets you create new fields of type 'editor' in any extensions where custom fields are supported."
language/en-GB/en-GB.plg_system_sessiongc.sys.ini000060400000000627152453623440015700 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_SESSIONGC="System - Session Data Purge"
PLG_SYSTEM_SESSIONGC_XML_DESCRIPTION="System Plugin that purges expired data and metadata depending on the session handler set in Global Configuration."
language/en-GB/en-GB.mod_stats_admin.sys.ini000060400000000712152453623440014575 0ustar00; Joomla! Project
; (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_STATS_ADMIN="Statistics"
MOD_STATS_LAYOUT_DEFAULT="Default"
MOD_STATS_XML_DESCRIPTION="The Statistics Module shows information about your server installation together with statistics on the website users and the number of Articles in your database."

language/en-GB/en-GB.plg_content_emailcloak.ini000060400000001131152453623440015304 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CONTENT_EMAILCLOAK="Content - Email Cloaking"
PLG_CONTENT_EMAILCLOAK_LINKABLE="As linkable mailto address"
PLG_CONTENT_EMAILCLOAK_MODE_DESC="Select how email addresses will be displayed."
PLG_CONTENT_EMAILCLOAK_MODE_LABEL="Mode"
PLG_CONTENT_EMAILCLOAK_NONLINKABLE="Non-linkable Text"
PLG_CONTENT_EMAILCLOAK_XML_DESCRIPTION="Cloaks all email addresses in content from spambots using JavaScript."language/en-GB/en-GB.com_categories.sys.ini000060400000001627152453623440014421 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_CATEGORIES="Categories"
COM_CATEGORIES_CATEGORIES_VIEW_DEFAULT_DESC="Shows a List of All categories in the selected component."
COM_CATEGORIES_CATEGORIES_VIEW_DEFAULT_TITLE="List All Categories"
COM_CATEGORIES_CATEGORY_VIEW_EDIT_DESC="Create a new Category in the selected component."
COM_CATEGORIES_CATEGORY_VIEW_EDIT_TITLE="Create New Category"
COM_CATEGORIES_CHOOSE_COMPONENT_DESC="Select a component to which this category should be linked. <br />If a component using categories is not shown in the list, please create at least one category for it using the default regular menu."
COM_CATEGORIES_CHOOSE_COMPONENT_LABEL="Choose a Component"
COM_CATEGORIES_XML_DESCRIPTION="This component manages categories."
language/en-GB/en-GB.plg_system_debug.sys.ini000060400000000556152453623440014772 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_DEBUG_XML_DESCRIPTION="This plugin provides a variety of system information and help for the creation of translation files."
PLG_SYSTEM_DEBUG="System - Debug"
language/en-GB/en-GB.plg_user_joomla.sys.ini000060400000000731152453623440014612 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_USER_JOOMLA="User - Joomla!"
PLG_USER_JOOMLA_XML_DESCRIPTION="Handles Joomla's default User synchronisation.<br /><strong>Warning! You must have enabled at least one plugin that handles the user session management or you will lose all access to your site.</strong>"
language/en-GB/en-GB.com_banners.sys.ini000060400000001327152453623440013721 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_BANNERS="Banners"
COM_BANNERS_BANNERS="Banners"
COM_BANNERS_CATEGORY_ADD_TITLE="Banners: Add Category"
COM_BANNERS_CATEGORY_EDIT_TITLE="Banners: Edit Category"
COM_BANNERS_CATEGORIES="Categories"
COM_BANNERS_CONTENT_TYPE_BANNER="Banner"
COM_BANNERS_CONTENT_TYPE_CLIENT="Banner Client"
COM_BANNERS_CONTENT_TYPE_CATEGORY="Banner Category"
COM_BANNERS_CLIENTS="Clients"
COM_BANNERS_TAGS_CATEGORY="Banner Category"
COM_BANNERS_TRACKS="Tracks"
COM_BANNERS_XML_DESCRIPTION="This component manages banners and banner clients."
language/en-GB/en-GB.com_languages.ini000060400000036270152453623440013427 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_LANGUAGES="Languages"
COM_LANGUAGES_CONFIGURATION="Languages: Options"
COM_LANGUAGES_ERR_DELETE="Select a language to delete"
COM_LANGUAGES_ERR_NO_LANGUAGE_SELECTED="No language selected."
COM_LANGUAGES_ERR_PUBLISH="Select a language to publish."
COM_LANGUAGES_ERROR_LANG_TAG="<br />The Language Tag should have 2 or 3 lowercase letters corresponding to the ISO language, a dash and 2 uppercase letters corresponding to the ISO country code. <br />This should be the exact prefix used for the language installed or to be installed. Example: en-GB, srp-ME."
COM_LANGUAGES_ERROR_LANGUAGE_METAFILE_MISSING="Could not load %s language meta XML file from %s."
COM_LANGUAGES_ERROR_SEF="<br />The \"URL Language Code\" should have only alphanumeric characters and dashes (-).<br />To use UTF-8 characters, \"Unicode Aliases\" should be set to \"Yes\" in Global Configuration."
COM_LANGUAGES_FIELD_DESCRIPTION_DESC="Enter a description for the language."
COM_LANGUAGES_FIELD_IMAGE_DESC="Name of the image file for this language when using the &quot;Use image flags&quot; Language Switcher basic option. Example: if 'en' is chosen, then the image will be en.gif. Images and CSS for this module are in media/mod_languages/."
COM_LANGUAGES_FIELD_IMAGE_LABEL="Image"
COM_LANGUAGES_FIELD_LANG_TAG_DESC="Enter the language tag – example: en-GB for English (en-GB). This should be the exact prefix used for the language installed or to be installed."
COM_LANGUAGES_FIELD_LANG_TAG_LABEL="Language Tag"
COM_LANGUAGES_INSTALL="Install Languages"
COM_LANGUAGES_INSTALLED_FILTER_SEARCH_DESC="Search in title and language tag."
COM_LANGUAGES_INSTALLED_FILTER_SEARCH_LABEL="Search Installed Languages"
COM_LANGUAGES_OVERRIDE_ERROR_RESERVED_WORDS="YES, NO, NULL, FALSE, ON, OFF, NONE, TRUE are reserved words and can't be used as language constants."
COM_LANGUAGES_OVERRIDE_FIELD_BOTH_LABEL="For Both Locations"
COM_LANGUAGES_OVERRIDE_FIELD_BOTH_DESC="If this box is checked the override will be stored for both administrator (Backend) and site (Frontend). This is essential for creating language overrides for some plugins because their language files, while stored in backend, are also used in frontend (example: plg_content_vote).<br />Please note that the two overrides will be completely independent from each other after storing them."
COM_LANGUAGES_OVERRIDE_FIELD_CLIENT_LABEL="Location"
COM_LANGUAGES_OVERRIDE_FIELD_CLIENT_DESC="Indicates if the override is created for the site (Frontend) or Administrator (Backend) client."
COM_LANGUAGES_OVERRIDE_FIELD_FILE_LABEL="File"
COM_LANGUAGES_OVERRIDE_FIELD_FILE_DESC="Language overrides are stored in a specific INI file (as it's the case for the original texts, too). Here you can see in which file the current override is stored."
COM_LANGUAGES_OVERRIDE_FIELD_LANGUAGE_LABEL="Language"
COM_LANGUAGES_OVERRIDE_FIELD_LANGUAGE_DESC="Language for which the constant is overridden."
COM_LANGUAGES_OVERRIDE_FIELD_KEY_LABEL="Language Constant"
COM_LANGUAGES_OVERRIDE_FIELD_KEY_DESC="The language constant of the string you want to override."
COM_LANGUAGES_OVERRIDE_FIELD_OVERRIDE_LABEL="Text"
COM_LANGUAGES_OVERRIDE_FIELD_OVERRIDE_DESC="Enter the text that you want to be displayed instead of the original one.<br /><strong>Please note</strong> that there may be placeholders (eg %s, %d or %1$s) in the text which could be important (they will be replaced by other texts before displaying), so you should leave them in there."
COM_LANGUAGES_OVERRIDE_FIELD_SEARCHSTRING_LABEL="Search Text"
COM_LANGUAGES_OVERRIDE_FIELD_SEARCHSTRING_DESC="Please enter the text to search for here. It may be in any of the language files."
COM_LANGUAGES_OVERRIDE_FIELD_SEARCHTYPE_LABEL="Search For"
COM_LANGUAGES_OVERRIDE_FIELD_SEARCHTYPE_DESC="Select if you want to search for constant names or the values (the actual text)."
COM_LANGUAGES_OVERRIDE_FIELD_SEARCHTYPE_CONSTANT="Constant"
COM_LANGUAGES_OVERRIDE_FIELD_SEARCHTYPE_TEXT="Value"
COM_LANGUAGES_OVERRIDE_FIRST_SELECT_MESSAGE="To create a new override, please first select a language and client."
COM_LANGUAGES_OVERRIDE_SELECT_LANGUAGE="- Select Language & Client -"
COM_LANGUAGES_FIELD_PUBLISHED_DESC="Whether this content language is published or not. If published, it will display as a choice in the Language Switcher module in Frontend."
COM_LANGUAGES_FIELD_LANG_CODE_DESC="This Language Code will be appended to the site URL. When SEF is enabled, you will get https://example.com/en/. If SEF is disabled the suffix &amp;lang=en will be appended at the end of the URL. Note <em>the Language Code must be unique among all the languages</em>."
COM_LANGUAGES_FIELD_LANG_CODE_LABEL="URL Language Code"
COM_LANGUAGES_FIELD_SITE_NAME_DESC="Enter a custom site name for this content language. If the site name is set to display, this custom site name will be used instead of the Global Configuration setting."
COM_LANGUAGES_FIELD_SITE_NAME_LABEL="Custom Site Name"
COM_LANGUAGES_FIELDSET_SITE_NAME_LABEL="Site Name"
COM_LANGUAGES_FIELD_TITLE_DESC="The name of the language as it will appear in the lists."
COM_LANGUAGES_FIELD_TITLE_NATIVE_DESC="Title in native language."
COM_LANGUAGES_FIELD_TITLE_NATIVE_LABEL="Title Native"
COM_LANGUAGES_FILTER_CLIENT_LABEL="Filter Location:"
COM_LANGUAGES_FTP_DESC="For setting Languages as default, Joomla will most likely need your FTP account details. Please enter them in the form fields below."
COM_LANGUAGES_FTP_TITLE="FTP Login Details"
COM_LANGUAGES_HEADING_AUTHOR="Author"
COM_LANGUAGES_HEADING_AUTHOR_ASC="Author ascending"
COM_LANGUAGES_HEADING_AUTHOR_DESC="Author descending"
COM_LANGUAGES_HEADING_AUTHOR_EMAIL="Author Email"
COM_LANGUAGES_HEADING_AUTHOR_EMAIL_ASC="Author Email ascending"
COM_LANGUAGES_HEADING_AUTHOR_EMAIL_DESC="Author Email descending"
COM_LANGUAGES_HEADING_DATE="Date"
COM_LANGUAGES_HEADING_DATE_ASC="Date ascending"
COM_LANGUAGES_HEADING_DATE_DESC="Date descending"
COM_LANGUAGES_HEADING_DEFAULT="Default"
COM_LANGUAGES_HEADING_DEFAULT_ASC="Default ascending"
COM_LANGUAGES_HEADING_DEFAULT_DESC="Default descending"
COM_LANGUAGES_HEADING_HOMEPAGE="Home"
COM_LANGUAGES_HEADING_HOMEPAGE_ASC="Home ascending"
COM_LANGUAGES_HEADING_HOMEPAGE_DESC="Home descending"
COM_LANGUAGES_HEADING_LANGUAGE="Language"
COM_LANGUAGES_HEADING_LANGUAGE_ASC="Language ascending"
COM_LANGUAGES_HEADING_LANGUAGE_DESC="Language descending"
COM_LANGUAGES_HEADING_LANG_CODE="URL Language Code"
COM_LANGUAGES_HEADING_LANG_CODE_ASC="URL Language Code ascending"
COM_LANGUAGES_HEADING_LANG_CODE_DESC="URL Language Code descending"
COM_LANGUAGES_HEADING_LANG_IMAGE="Image"
COM_LANGUAGES_HEADING_LANG_IMAGE_ASC="Image ascending"
COM_LANGUAGES_HEADING_LANG_IMAGE_DESC="Image descending"
COM_LANGUAGES_HEADING_LANG_TAG="Language Tag"
COM_LANGUAGES_HEADING_LANG_TAG_ASC="Language Tag ascending"
COM_LANGUAGES_HEADING_LANG_TAG_DESC="Language Tag descending"
COM_LANGUAGES_HEADING_VERSION="Version"
COM_LANGUAGES_HEADING_VERSION_ASC="Version ascending"
COM_LANGUAGES_HEADING_VERSION_DESC="Version descending"
COM_LANGUAGES_HEADING_TITLE_NATIVE="Native Title"
COM_LANGUAGES_HEADING_TITLE_NATIVE_ASC="Native Title ascending"
COM_LANGUAGES_HEADING_TITLE_NATIVE_DESC="Native Title descending"
COM_LANGUAGES_HOMEPAGE="Home"
COM_LANGUAGES_MSG_DEFAULT_LANGUAGE_SAVED="Default Language Saved. This does not affect users that have chosen a specific language on their profile or on the login page.<br /><strong class="_QQ_"red"_QQ_">Warning!</strong> When using the multilingual functionality (ie when the plugin System - Language Filter is enabled) the Site Default Language also has to be a published Content language."
COM_LANGUAGES_MSG_SWITCH_ADMIN_LANGUAGE_SUCCESS="The Administrator Language has been switched to &quot;<strong>%s</strong>&quot;."
COM_LANGUAGES_MULTILANGSTATUS_CONTACTS_ERROR="Some of the contacts linked to the user <strong>%s</strong> are incorrect."
COM_LANGUAGES_MULTILANGSTATUS_CONTACTS_ERROR_TIP="Warning! A user/author should have only one contact to which is assigned language 'All' OR one contact for each published Content Language."
COM_LANGUAGES_MULTILANGSTATUS_CONTENT_LANGUAGE_PUBLISHED="Published Content Languages"
COM_LANGUAGES_MULTILANGSTATUS_DEFAULT_HOME_MODULE_PUBLISHED="This site is set as a multilingual site. The menu module displaying the Home menu item set to language &quot;All&quot; should not be published."
COM_LANGUAGES_MULTILANGSTATUS_ERROR_CONTENT_LANGUAGE="A Default Home page is assigned to the <strong>%s</strong> Content Language although a Site Language for this Content Language is not installed or published AND/OR the Content Language is not published."
COM_LANGUAGES_MULTILANGSTATUS_ERROR_CONTENT_LANGUAGE_TRASHED="The Content Language <strong>%s</strong> is trashed."
COM_LANGUAGES_MULTILANGSTATUS_ERROR_LANGUAGE_TAG="The Content Language tag <strong>%s</strong> does not match the Site Language tag. Check that the Site Language is installed and published and the correct language tag is used for the Content Language. Example: for English (en-GB) both tags should be 'en-GB'."
COM_LANGUAGES_MULTILANGSTATUS_HOMES_MISSING="This site is set as a multilingual site. One or more of the Default Home pages for the published Content languages are missing although the Language Filter plugin is enabled AND/OR one or more Language Switcher modules are published."
COM_LANGUAGES_MULTILANGSTATUS_HOMES_PUBLISHED="Published Default Home pages"
COM_LANGUAGES_MULTILANGSTATUS_HOMES_PUBLISHED_ALL="1 assigned to language 'All'."
COM_LANGUAGES_MULTILANGSTATUS_HOMES_PUBLISHED_INCLUDING_ALL="Published Default Home pages (including 1 assigned to language &quot;All&quot;)."
COM_LANGUAGES_MULTILANGSTATUS_LANGSWITCHER_PUBLISHED="Published Language Switcher Modules."
COM_LANGUAGES_MULTILANGSTATUS_LANGSWITCHER_UNPUBLISHED="This site is set as a multilingual site, at least one Language Switcher module set to language &quot;All&quot; has to be published. Disregard this message if you do not use a language switcher module but direct links."
COM_LANGUAGES_MULTILANGSTATUS_LANGUAGEFILTER="Language Filter Plugin"
COM_LANGUAGES_MULTILANGSTATUS_LANGUAGEFILTER_DISABLED="This site is set as a multilingual site. The Language Filter plugin is not enabled although one or more Language Switcher modules AND/OR one or more specific Content language Default Home pages are published."
COM_LANGUAGES_MULTILANGSTATUS_NONE="This site is not set as a multilingual site."
COM_LANGUAGES_MULTILANGSTATUS_SITE_LANG_PUBLISHED="Published Site Languages"
COM_LANGUAGES_MULTILANGSTATUS_USELESS_HOMES="This site is not set as a multilingual site.<br /><strong>Note</strong>: at least one Default Home page is assigned to a Content Language. This will not break a monolingual site but is useless."
COM_LANGUAGES_N_ITEMS_DELETED="%d Content Languages deleted."
COM_LANGUAGES_N_ITEMS_DELETED_1="%d Content Language deleted."
COM_LANGUAGES_N_ITEMS_PUBLISHED="%d Content Languages published."
COM_LANGUAGES_N_ITEMS_PUBLISHED_1="%d Content Language published."
COM_LANGUAGES_N_ITEMS_TRASHED="%d Content Languages trashed."
COM_LANGUAGES_N_ITEMS_TRASHED_1="%d Content Language trashed."
COM_LANGUAGES_N_ITEMS_UNPUBLISHED="%d Content Languages unpublished. <br /><strong class="_QQ_"red"_QQ_">Warning!</strong> When using the multilingual functionality (ie when the plugin System - Language Filter is enabled) the Site Default Language also has to be a published Content language."
COM_LANGUAGES_N_ITEMS_UNPUBLISHED_1="%d Content Language unpublished. <br /><strong class="_QQ_"red"_QQ_">Warning!</strong> When using the multilingual functionality (ie when the plugin System - Language Filter is enabled) the Site Default Language also has to be a published Content language."
COM_LANGUAGES_NO_ITEM_SELECTED="No languages selected."
COM_LANGUAGES_SAVE_SUCCESS="Content Language saved."
COM_LANGUAGES_SEARCH_IN_TITLE="Search in title."
COM_LANGUAGES_SUBMENU_CONTENT="Content Languages"
COM_LANGUAGES_SUBMENU_INSTALLED="Installed"
COM_LANGUAGES_SUBMENU_INSTALLED_ADMINISTRATOR="Installed - Administrator"
COM_LANGUAGES_SUBMENU_INSTALLED_SITE="Installed - Site"
COM_LANGUAGES_SUBMENU_OVERRIDES="Overrides"
COM_LANGUAGES_SWITCH_ADMIN="Switch Language"
COM_LANGUAGES_VIEW_INSTALLED_ADMIN_TITLE="Languages: Installed (Administrator)"
COM_LANGUAGES_VIEW_INSTALLED_SITE_TITLE="Languages: Installed (Site)"
COM_LANGUAGES_VIEW_INSTALLED_TITLE="Languages: Installed"
COM_LANGUAGES_VIEW_LANGUAGE_EDIT_EDIT_TITLE="Languages: Edit Content Language"
COM_LANGUAGES_VIEW_LANGUAGE_EDIT_NEW_TITLE="Languages: New Content Language"
COM_LANGUAGES_VIEW_LANGUAGES_TITLE="Languages: Content"
COM_LANGUAGES_VIEW_OVERRIDE_CLIENT_SITE="Site"
COM_LANGUAGES_VIEW_OVERRIDE_CLIENT_ADMINISTRATOR="Administrator"
COM_LANGUAGES_VIEW_OVERRIDE_EDIT_TITLE="Languages: Edit Override"
COM_LANGUAGES_VIEW_OVERRIDE_EDIT_NEW_OVERRIDE_LEGEND="Create a New Override"
COM_LANGUAGES_VIEW_OVERRIDE_EDIT_EDIT_OVERRIDE_LEGEND="Edit this Override"
COM_LANGUAGES_VIEW_OVERRIDE_LANGUAGE="%1$s [%2$s]"
COM_LANGUAGES_VIEW_OVERRIDE_MORE_RESULTS="More Results"
COM_LANGUAGES_VIEW_OVERRIDE_NO_RESULTS="No matching texts found."
COM_LANGUAGES_VIEW_OVERRIDE_REFRESHING="Please wait while the cache is recreated."
COM_LANGUAGES_VIEW_OVERRIDE_REQUEST_ERROR="Error while performing an Ajax request."
COM_LANGUAGES_VIEW_OVERRIDE_RESULTS_LEGEND="Search Results"
COM_LANGUAGES_VIEW_OVERRIDE_SAVE_SUCCESS="Language Override was saved."
COM_LANGUAGES_VIEW_OVERRIDE_SEARCH_BUTTON="Search"
COM_LANGUAGES_VIEW_OVERRIDE_SEARCH_LEGEND="Search text you want to change."
COM_LANGUAGES_VIEW_OVERRIDE_SEARCH_TIP="A language string is composed of two parts: a specific language constant and its value.<br />For example, in the string: COM_CONTENT_READ_MORE=&quot;Read more: &quot;<br />'<u>COM_CONTENT_READ_MORE</u>' is the constant and '<u>Read more: </u>' is the value.<br />You have to use the specific language constant to create an override of the value.<br />Therefore, you can search for the constant or the value you want to change with the search field below.<br />By selecting the desired result the correct constant will automatically be inserted into the form."
COM_LANGUAGES_VIEW_OVERRIDES_FILTER_SEARCH_DESC="Search constant or text."
COM_LANGUAGES_VIEW_OVERRIDES_KEY="Constant"
COM_LANGUAGES_VIEW_OVERRIDES_LANGUAGES_BOX_ITEM="%1$s - %2$s"
COM_LANGUAGES_VIEW_OVERRIDES_N_ITEMS_DELETED="%d language overrides were deleted."
COM_LANGUAGES_VIEW_OVERRIDES_N_ITEMS_DELETED_1="%d language override was deleted."
COM_LANGUAGES_VIEW_OVERRIDES_NO_ITEM_SELECTED="You haven't selected any overrides."
COM_LANGUAGES_VIEW_OVERRIDES_PURGE="Clear Cache"
COM_LANGUAGES_VIEW_OVERRIDES_PURGE_SUCCESS="Overrider cache table cleared."
COM_LANGUAGES_VIEW_OVERRIDES_TEXT="Text"
COM_LANGUAGES_VIEW_OVERRIDES_TITLE="Languages: Overrides"
COM_LANGUAGES_XML_DESCRIPTION="Component for language management"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_LANGUAGES="Changes apply to this component only.<br /><em><strong>Inherited</strong></em> - a Global Configuration setting or higher level setting is applied.<br /><em><strong>Denied</strong></em> always wins - whatever is set at the Global or higher level and applies to all child elements.<br /><em><strong>Allowed</strong></em> will enable the action for this component unless overruled by a Global Configuration setting."
language/en-GB/en-GB.plg_system_t3.sys.ini000060400000000054152453623440014223 0ustar00PLG_T3_XML_DESCRIPTION="T3 Framework plugin"language/en-GB/en-GB.plg_system_cache.sys.ini000060400000000446152453623440014745 0ustar00; Joomla! Project
; (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8


PLG_CACHE_XML_DESCRIPTION="Provides page caching."
PLG_SYSTEM_CACHE="System - Page Cache"
language/en-GB/en-GB.plg_fields_textarea.sys.ini000060400000000610152453623440015432 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_TEXTAREA="Fields - Textarea"
PLG_FIELDS_TEXTAREA_XML_DESCRIPTION="This plugin lets you create new fields of type 'textarea' in any extensions where custom fields are supported."
language/en-GB/en-GB.plg_privacy_contact.sys.ini000060400000000560152453623440015463 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_PRIVACY_CONTACT="Privacy - Contacts"
PLG_PRIVACY_CONTACT_XML_DESCRIPTION="Responsible for processing privacy related requests for the core Joomla contact data."
language/en-GB/en-GB.xml000060400000001645152453623440010643 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metafile version="3.9" client="administrator">
	<name>English (en-GB)</name>
	<version>3.10.12</version>
	<creationDate>July 2023</creationDate>
	<author>Joomla! Project</author>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<description><![CDATA[en-GB administrator language]]></description>
	<metadata>
		<name>English (United Kingdom)</name>
		<nativeName>English (United Kingdom)</nativeName>
		<tag>en-GB</tag>
		<rtl>0</rtl>
		<locale>en_GB.utf8, en_GB.UTF-8, en_GB, eng_GB, en, english, english-uk, uk, gbr, britain, england, great britain, uk, united kingdom, united-kingdom</locale>
		<firstDay>0</firstDay>
		<weekEnd>0,6</weekEnd>
		<calendar>gregorian</calendar>
	</metadata>
	<params />
</metafile>
language/en-GB/en-GB.plg_quickicon_akeebabackup.ini000060400000000764152453623440016127 0ustar00;; @package   akeebabackup
;; @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
;; @license   GNU General Public License version 3, or later

PLG_QUICKICON_AKEEBABACKUP_OK="Backup is up-to-date"
PLG_QUICKICON_AKEEBABACKUP_BACKUPREQUIRED="<strong>Backup required!</strong>"

PLG_QUICKICON_AKEEBABACKUP_LBL_NOTSUPPORTEDINJOOMLA3="This module is no longer supported on Joomla! 2.5 and later. Please use the <strong>Quick Icon - Akeeba Backup Notification</strong> plugin instead."language/en-GB/en-GB.plg_editors-xtd_image.sys.ini000060400000000640152453623440015702 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS-XTD_IMAGE="Button - Image"
PLG_IMAGE_XML_DESCRIPTION="Displays a button to insert images into an Article. Displays a popup allowing you to configure an image's properties and upload new image files."

language/en-GB/en-GB.com_jce.sys.ini000060400000002247152453623440013034 0ustar00; JCE Project
; Copyright (C) 2006 - 2020 Ryan Demmer. All rights reserved
; GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
; Note : All ini files need to be saved as UTF-8

COM_JCE="JCE Editor"
COM_JCE_XML_DESCRIPTION="<p>JCE is a WYSIWYG Editor Extension for Joomla.</p><p>JCE would not exist without these great projects:<br /><ul><li><a href='http://www.joomla.org' target='_blank'>Joomla!</a></li><li><a href='https://tinymce.com' target='_blank'>TinyMCE</a></li><li><a href='https://jquery.com' target='_blank'>JQuery</a></li><li><a href='https://getuikit.com/' target='_blank'>UIKit</a></li><li>Font Icons by <a href='https://icomoon.io/'>IcoMoon.</a></li><li>Fugue Icons Copyright © <a href='http://p.yusukekamiyamane.com/'>Yusuke Kamiyamane.</a> All rights reserved.</li></ul></p><p>JCE is dedicated to my father.</p><p>For a full changelog see <a target='_blank' href='https://www.joomlacontenteditor.net/support/changelog/editor'>https://www.joomlacontenteditor.net/support/changelog/editor</a></p>"

COM_JCE_MENU_PROFILES="Profiles"
COM_JCE_MENU_CONFIG="Global Configuration"
COM_JCE_MENU_CPANEL="Control Panel"
COM_JCE_MENU_FILEBROWSER="File Browser"
language/en-GB/en-GB.plg_fields_media.ini000060400000001753152453623440014070 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_MEDIA="Fields - Media"
PLG_FIELDS_MEDIA_LABEL="Media (%s)"
PLG_FIELDS_MEDIA_PARAMS_DIRECTORY_DESC="The directory with the image files to be listed relative to the default image folder (set in Media > Options)."
PLG_FIELDS_MEDIA_PARAMS_DIRECTORY_LABEL="Directory"
PLG_FIELDS_MEDIA_PARAMS_IMAGE_CLASS_DESC="The class which is added to the image (src tag)."
PLG_FIELDS_MEDIA_PARAMS_IMAGE_CLASS_LABEL="Image Class"
PLG_FIELDS_MEDIA_PARAMS_PREVIEW_DESC="Shows or hides the preview of the selected image."
PLG_FIELDS_MEDIA_PARAMS_PREVIEW_INLINE="Inline"
PLG_FIELDS_MEDIA_PARAMS_PREVIEW_LABEL="Preview"
PLG_FIELDS_MEDIA_PARAMS_PREVIEW_TOOLTIP="Tooltip"
PLG_FIELDS_MEDIA_XML_DESCRIPTION="This plugin lets you create new fields of type 'media' in any extensions where custom fields are supported."
language/en-GB/en-GB.plg_editors-xtd_pagebreak.sys.ini000060400000000650152453623440016542 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS-XTD_PAGEBREAK="Button - Page Break"
PLG_EDITORSXTD_PAGEBREAK_XML_DESCRIPTION="Provides a button to enable a page break to be inserted into an Article. A popup allows you to configure the settings to be used."
language/en-GB/en-GB.plg_system_logrotation.ini000060400000001162152453623440015422 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_LOGROTATION="System - Log Rotation"
PLG_SYSTEM_LOGROTATION_XML_DESCRIPTION="This plugin periodically rotates system log files."
PLG_SYSTEM_LOGROTATION_CACHETIMEOUT_LABEL="Log Rotation (in days)"
PLG_SYSTEM_LOGROTATION_CACHETIMEOUT_DESC="How often should the logs be rotated."
PLG_SYSTEM_LOGROTATION_LOGSTOKEEP_DESC="The maximum number of old logs to keep."
PLG_SYSTEM_LOGROTATION_LOGSTOKEEP_LABEL="Maximum Logs"
language/en-GB/en-GB.plg_installer_urlinstaller.ini000060400000000767152453623440016264 0ustar00; Joomla! Project
; (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_INSTALLER_URLINSTALLER_BUTTON="Check and Install"
PLG_INSTALLER_URLINSTALLER_INSTALLER_URLFOLDERINSTALLER="Installer - Install from URL."
PLG_INSTALLER_URLINSTALLER_PLUGIN_XML_DESCRIPTION="This plugin allows you to install packages from a URL."
PLG_INSTALLER_URLINSTALLER_TEXT="Install from URL"
language/en-GB/en-GB.plg_installer_jce.sys.ini000060400000000455152453623440015114 0ustar00; JCE
; Copyright (C) 2009 - 2024 Ryan Demmer. All rights reserved.
; License GNU General Public License version 2 or later; see LICENSE.txt, see LICENSE.php
; Note : All ini files need to be saved as UTF-8

PLG_INSTALLER_JCE="Installer - JCE"
PLG_INSTALLER_JCE_XML_DESCRIPTION="JCE Installer Plugin"
language/en-GB/en-GB.plg_system_ic_library.ini000060400000001007152453623440015176 0ustar00; iCagenda
; Copyright (c)2014-2015 Cyril Rezé (Lyr!C) / JoomliC.com - All rights reserved.
; License GNU General Public License version 3 or later <http://www.gnu.org/licenses/gpl.html>
; Note : All ini files need to be saved as UTF-8
;
; PLG_SYSTEM_IC_LIBRARY	: plg_system_ic_library.ini
; Translation Platform	: https://www.transifex.com/projects/p/icagenda/


PLG_SYSTEM_IC_LIBRARY = "System - iC Library"
PLG_SYSTEM_IC_LIBRARY_XML_DESCRIPTION = "This plugin allows to use classes of the iC Library (by Jooml!C)."
language/en-GB/en-GB.plg_system_t3.ini000060400000132430152453623440013412 0ustar00; GLOBAL
T3_GLOBAL_TOGGLE_FOLDING		        = "Collapse / Expand"

; OVERVIEW
T3_OVERVIEW_LABEL                   = "Overview"
T3_OVERVIEW_NAME                    = "Name:"
T3_OVERVIEW_VERSION                 = "Version:"
T3_OVERVIEW_CREATE_DATE             = "Released Date:"
T3_OVERVIEW_AUTHOR                  = "Author:"

T3_OVERVIEW_TPL_INFO                = "Template Information"
T3_OVERVIEW_FRMWRK_INFO             = "Framework Information"

T3_OVERVIEW_CHECK_UPDATE            = "Check for new version"
T3_OVERVIEW_GO_DOWNLOAD             = "Update now"

T3_OVERVIEW_FMRWRK_NAME             = "T3 Framework"
T3_OVERVIEW_TPL_SAME                = "Congrats! You are using latest version of %s!"
T3_OVERVIEW_TPL_SAME_MSG            = "Your version is <strong>%s</strong>"
T3_OVERVIEW_TPL_NEW_MSG             = "Your version is <strong>%s</strong>. %s's latest version is <strong>%s</strong>."
T3_OVERVIEW_TPL_NEW                 = "Dude! There's a newer version for your %s!"
T3_OVERVIEW_TPL_DL_CENTER           = "Download Center"
T3_OVERVIEW_TPL_UPDATE_CENTER       = "Update Center"
T3_OVERVIEW_TPL_VERSION             = "You are using %s version %s"
T3_OVERVIEW_TPL_VERSION_MSG         = "This template is not available on Joomla Update channel"

T3_OVERVIEW_FRMWRK_SAME             = "Congrats! You are using latest version of %s!"
T3_OVERVIEW_FRMWRK_SAME_MSG         = "Your version is <strong>%s</strong>"
T3_OVERVIEW_FRMWRK_NEW              = "Dude! There's a newer version for your %s!"
T3_OVERVIEW_FRMWRK_NEW_MSG          = "Your version is <strong>%s</strong>. %s's latest version is <strong>%s</strong>."

T3_OVERVIEW_FAILED_GETLIST          = "Cannot get extension list from repository"
T3_OVERVIEW_CHK_UPDATE_OK           = "Checking Completed"

T3_FRMWRK_OVERVIEW                  = "Framework Overview"
T3_FRMWRK_DESC_1                    = "T3 Framework"
T3_FRMWRK_DESC_2                    = "The ''All New'' T3"
T3_FRMWRK_DESC_3                    = "Our T3 framework is the most popular template framework for Joomla. It powers all our T3 based templates and is available for Joomla 2.5 and 3.0. For the ease of upgrades the framework is in the plugin format and is installed separately. With over 3 years of active development T3 framework has come a long way and is more robust, user friendly, feature rich, easy to customize and not to mention the responsive layouts support which not only looks good on all browsers and devices but also works like a charm."
T3_FRMWRK_DESC_4                    = "Resources:"
T3_FRMWRK_DESC_5                    = "<a href='https://github.com/t3framework/t3/tags' title='Download Link'>Download Link</a>"
T3_FRMWRK_DESC_6                    = "<a href='http://t3-framework.org/documentation.html' title='Documentation Link'>Documentation Link</a>"
T3_FRMWRK_DESC_7                    = "<a href='https://github.com/t3framework/t3/blob/master/CHANGELOG.md' title='Change log Link'>Change log Link</a>"
T3_FRMWRK_DESC_8                    = "<a href='http://update.joomlart.com' title='Version & Update'>Version & Update</a>"
T3_FRMWRK_DESC_9                    = "<a href='http://www.joomlart.com/forums/forumdisplay.php?411-JA-T3V3-Framework' title='Forum Link'>Forum Link</a>"


; GENERAL
T3_GENERAL_LABEL                      = "General"
T3_GENERAL_DESC                       = "The following settings will be applied for all styles, themes and layouts"
T3_GENERAL_DEVELOPMENT_LABEL          = "Development Mode"
T3_GENERAL_DEVELOPMENT_DESC           = "When Development Mode is enabled, less is used instead of css"
T3_GENERAL_DEVELOPMENT_FOLDER_LABEL   = "Development Folder"
T3_GENERAL_DEVELOPMENT_FOLDER_DESC    = "When Development Mode is enabled, T3 will compile every LESS files to CSS files into this folder for easy tracking. This folder must be writable."
T3_GENERAL_THEMER_LABEL               = "ThemeMagic"
T3_GENERAL_THEMER_DESC                = "Enable this option to access ThemeMagic customization panel."
T3_GENERAL_LEGACY_CSS_LABEL           = "Legacy Compatible"
T3_GENERAL_LEGACY_CSS_DESC            = "Load some important compatible styles for Bootstrap 2 and Font Awesome 3.x"
T3_GENERAL_RESPONSIVE_LABEL           = "Responsive"
T3_GENERAL_RESPONSIVE_DESC            = "Enable this if this template supports responsive layout. Switching this option need re-build LESS to CSS."
T3_GENERAL_NON_RESPON_WIDTH_LABEL     = "Non-Responsive Width"
T3_GENERAL_NON_RESPON_WIDTH_DESC      = "Container width for non-responsive layout"
T3_GENERAL_BUILD_RTL_LABEL            = "Build RTL CSS"
T3_GENERAL_BUILD_RTL_DESC             = "Enable this option will allow the compiling LESS to CSS process to also build the CSS file for RTL languages"

T3_GENERAL_OPTIMIZE_LABEL             ="Optimization"
T3_GENERAL_OPTIMIZE_DESC              ="Enable compress CSS/JS. These options only available when Development Mode is off"

T3_GENERAL_ASSETS_MINIFY_LABEL            = "Optimize CSS"
T3_GENERAL_ASSETS_MINIFY_DESC             = "When you enable this option, compressed CSS files will be used (.min.css files)"
T3_GENERAL_ASSETS_MINIFYJS_LABEL          = "Optimize JS"
T3_GENERAL_ASSETS_MINIFYJS_DESC           = "Combined and compress Javascript files"
T3_GENERAL_ASSETS_MINIFYJS_TOOL_LABEL     = "JS Compress Tool"
T3_GENERAL_ASSETS_MINIFYJS_TOOL_DESC      = "Choose tool to compress Javascript"
T3_GENERAL_ASSETS_MINIFYJS_TOOL_JSMIN     = "JSMin"
T3_GENERAL_ASSETS_MINIFYJS_TOOL_CLOSURE   = "Closure Compiler"
T3_GENERAL_ASSETS_MINIFYJS_EXCLUDE_LABEL  = "Exclude files"
T3_GENERAL_ASSETS_MINIFYJS_EXCLUDE_DESC   = "Enter the file you DO NOT like to apply minify. Separated by a comma"

T3_GENERAL_ASSETS_FOLDER_LABEL      = "T3 Assets Folder"
T3_GENERAL_ASSETS_FOLDER_DESC       = "When Development Mode or Optimize CSS is set to ''YES'', T3 will join and compress most possible CSS files into one or serveral files for site performance. This folder must be writable. This folder is configured at your Joomla! root level"
T3_GENERAL_REMOVE_T3LOGO_LABEL      = "Show T3 Logo"
T3_GENERAL_REMOVE_T3LOGO_DESC       = "T3 logo in footer. We recommend you do this so that we can help spread T3 to the word"


; JOOMLA CORE ENHANCEMENT
T3_GENERAL_JCORE_LABEL              = "Core Joomla!"
T3_GENERAL_JCORE_DESC               = "Enhance Core Joomla! options"
T3_GENERAL_JCORE_LINKED_TITLES_LABEL= "Link Title for Article View"
T3_GENERAL_JCORE_LINKED_TITLES_DESC = "Override setting for Link Title in Article View. This setting only applies for Single Article view."


; THEME
T3_THEME_LABEL                      = "Theme"
T3_THEME_DESC                       = "The visual settings below are for themes of your selected style."
T3_THEME_THEME_LABEL                = "Theme"
T3_THEME_THEME_DESC                 = "Select a theme"
T3_THEME_LOGOTYPE_LABEL             = "Logo Type"
T3_THEME_LOGOTYPE_DESC              = "Select image logo type or text logo type"
T3_THEME_LOGOTYPE_TEXT              = "Text"
T3_THEME_LOGOTYPE_IMAGE             = "Image"
T3_THEME_SITENAME_LABEL             = "Site Name"
T3_THEME_SITENAME_DESC              = "Site Name"
T3_THEME_SITENAME_HINT              = "Your site name goes here"
T3_THEME_SLOGAN_LABEL               = "Slogan"
T3_THEME_SLOGAN_DESC                = "Slogan"
T3_THEME_SLOGAN_HINT                = "Your slogan goes here"
T3_THEME_LOGOIMAGE_LABEL            = "Logo Image"
T3_THEME_LOGOIMAGE_DESC             = "Browse image to replace current logo image"
T3_THEME_LOGOWIDTH_LABEL            = "Logo Width"
T3_THEME_LOGOWIDTH_DESC             = "Logo Width"
T3_THEME_LOGOHEIGHT_LABEL           = "Logo Height"
T3_THEME_LOGOHEIGHT_DESC            = "Logo Height"

T3_THEME_ENABLE_LOGOIMAGE_SM_LABEL  ="Enable Small Logo"
T3_THEME_ENABLE_LOGOIMAGE_SM_DESC   ="Enable this option to allow select a new version logo for small screen"
T3_THEME_LOGOIMAGE_SM_LABEL         ="Small Logo Image"
T3_THEME_LOGOIMAGE_SM_DESC          ="Small Logo Image"

; LAYOUT
T3_LAYOUT_LABEL                     = "Layout"
T3_LAYOUT_DESC                      = "Based on <b>Bootstrap Grid</b>, you can add up to 6 module positions to a spotlight area which can be resized by adjusting the resizer bar to the left/right.<br /> You can change the module position by clicking on the <b>configuration icon</b> on the top right."
T3_LAYOUT_LAYOUT_LABEL              = "Position & Responsive Configuration"
T3_LAYOUT_LAYOUT_DESC               = "Select a layout to be configured. Select the Positions that are going to be used in the above selected layout then configure the responsive layouts (enable, disable, change size module position in specific layouts)"
T3_LAYOUT_CONFIG_TITLE              = "Layout Configuration"
T3_LAYOUT_CONFIG_DESC               = "Layout Configuration"
T3_LAYOUT_POPOVER_TITLE             = "Select a position"
T3_LAYOUT_POPOVER_DESC              = ""
T3_LAYOUT_RESPON_PTITLE             = "Visibility"
T3_LAYOUT_RESPON_PDESC              = ""
T3_LAYOUT_EMPTY_POSITION            = "None"
T3_LAYOUT_DEFAULT_POSITION          = "Default"
T3_LAYOUT_LOGO_TEXT                 = "Logo"
T3_LAYOUT_UNKN_WIDTH                = "Auto"
T3_LAYOUT_POS_WIDTH                 = "Position Width"
T3_LAYOUT_POS_NAME                  = "Position Name"
T3_LAYOUT_MODE_STRUCTURE            = "Module Positions"
T3_LAYOUT_MODE_LAYOUT               = "Responsive Layout"
T3_LAYOUT_RESET_ALL                 = "Reset All"
T3_LAYOUT_RESET_PER_DEVICE          = "Reset layout for current device"
T3_LAYOUT_RESET_POSITION            = "Reset Positions"
T3_LAYOUT_TOGG_FULLSCREEN           = "Toggle Fullscreen"
T3_LAYOUT_LOAD_ERROR                = "The layout cannot be loaded. There might be some errors in the layout file."
T3_LAYOUT_EDIT_POSITION             = "Click here to edit position"
T3_LAYOUT_SHOW_POSITION             = "Click here to show this position on current device layout"
T3_LAYOUT_HIDE_POSITION             = "Click here to hide this position on current device layout"
T3_LAYOUT_CHANGE_NUMPOS             = "Click here to select number of positions you want to display"
T3_LAYOUT_DRAG_RESIZE               = "Drag me to resize"
T3_LAYOUT_HIDDEN_POS_DESC           = "Currently hidden positions on Spotlight"
T3_LAYOUT_CUSTOM_POSITION           = "Custom Position"

T3_LAYOUT_DVI_DEFAULT               = "Default"
T3_LAYOUT_DVI_WIDE                  = "Wide"
T3_LAYOUT_DVI_NORMAL                = "Normal"
T3_LAYOUT_DVI_XTABLET               = "XTablet"
T3_LAYOUT_DVI_TABLET                = "Tablet"
T3_LAYOUT_DVI_MOBILE                = "Mobile"
T3_LAYOUT_DVI_LG                    = "Large"
T3_LAYOUT_DVI_MD                    = "Medium"
T3_LAYOUT_DVI_SM                    = "Small"
T3_LAYOUT_DVI_XS                    = "Extra Small"

T3_LAYOUT_ASK_ADD_LAYOUT            = "That’s awesome way to start customizing..."
T3_LAYOUT_ASK_ADD_LAYOUT_DESC       = "Give it a cool name, how about <em>domain_layout</em>?"
T3_LAYOUT_ASK_CORRECT_NAME          = "Please enter alpha numeric name"
T3_LAYOUT_ASK_DEL_LAYOUT            = "Hmm, are you sure to do it?"
T3_LAYOUT_ASK_DEL_LAYOUT_DESC       = "<ul><li>Deleting a layout will remove the cloned layout file in <em style='color:red;'>{root}/templates/{template_name}/custom/tpls</em> folder as well as the corresponding layout setting file .ini in <em style='color:red;'>{root}/templates/{template_name}/custom/etc/layout</em>.</li><li>You can delete cloned layout and user setting to keep thing neat and clean. To delete default layouts you must use Purge action.</li><li>This action cannot be undone!</li></ul>"
T3_LAYOUT_ASK_PURGE_LAYOUT_DESC     = "<ul><li>Purging a layout will remove the .php layout file in both <em style='color:red;'>{root}/templates/{template_name}/tpls</em> and <em style='color:red;'>{root}/templates/{template_name}/custom/tpls</em> folder as well as the corresponding layout setting file .ini in <em style='color:red;'>{root}/templates/{template_name}/etc/layout</em> and <em style='color:red;'>{root}/templates/{template_name}/custom/etc/layout</em>.</li><li>You can delete cloned layout to keep thing neat and clean. However, deleting default layouts is NOT recommended.</li><li>This action cannot be undone!</li></ul>"
T3_LAYOUT_INVALID_DATA_TO_SAVE      = "Incorrect data format"
T3_LAYOUT_OPERATION_FAILED          = "Saving progress is failed. It might cause by file permission"
T3_LAYOUT_SAVE_SUCCESSFULLY         = "Layout changes has been saved successfully"
T3_LAYOUT_NOT_FOUND                 = "The source layout does not found"
T3_CUSTOM_LAYOUT_NOT_FOUND          = "The source layout does not found"
T3_LAYOUT_EXISTED                   = "New layout already exists"
T3_LAYOUT_DELETE_FAIL               = "Failed to delete layout"
T3_LAYOUT_DELETE_SUCCESSFULLY       = "Layout delete successfully"
T3_LAYOUT_NO_PERMISSION             = "You do not have permission to make change of theme"
T3_LAYOUT_UNKNOW_ACTION             = "Unknown request"
T3_LAYOUT_LAYOUT_NAME               = "Layout name"
T3_LAYOUT_LABEL_CLONEIT             = "Clone it!"
T3_LAYOUT_LABEL_DELETEIT            = "Got it! delete this layout!"
T3_LAYOUT_LABEL_SAVE_AS_COPY        = "Save as Copy"
T3_LAYOUT_LABEL_DELETE              = "Delete"
T3_LAYOUT_LABEL_PURGE               = "Purge"
T3_LAYOUT_DESC_DELETE               = "Remove cloned layout & setting"
T3_LAYOUT_DESC_PURGE                = "Remove both cloned and default layout"
T3_LAYOUT_SUBLAYOUT_LABEL           = "Sub Layout"
T3_LAYOUT_SUBLAYOUT_DESC             = "Layout for page which is not directly linked to a menu item. -Use Default- value to use the same above layout."
T3_LAYOUT_SKIPCONTENT_LABEL			= "Skip component content"
T3_LAYOUT_SKIPCONTENT_DESC			= "Select pages which you want to skip display component content. Example: Home"
; NAVIGATION 
T3_NAVIGATION_LABEL                     = "Navigation"
T3_NAVIGATION_DESC                      = "The tab includes settings of the Megamenu - a missing feature in Joomla!. With an intuitive configuration visualization, you can setup an advanced menu in a few clicks."
T3_NAVIGATION_MEGAMENU_CONFIG           = "Megamenu"
T3_NAVIGATION_TRIGGER_LABEL             = "Dropdown Trigger"
T3_NAVIGATION_TRIGGER_DESC              = "Mouse Event to trigger dropdown menu"
T3_NAVIGATION_TRIG_HOVER                = "Hover"
T3_NAVIGATION_TRIG_CLICK                = "Click"
T3_NAVIGATION_ANIMATION_LABEL           = "Animation"
T3_NAVIGATION_ANIMATION_DESC            = "Select animation for Megamenu"
T3_NAVIGATION_ANIMATION_DURATION_LABEL  = "Duration"
T3_NAVIGATION_ANIMATION_DURATION_DESC   = "Animation effect duration for dropdown of Megamenu (in miliseconds)"
T3_NAVIGATION_COLLAPSE_OFFCANVAS        = "Off-Canvas Navigation"
T3_NAVIGATION_COLLAPSE_OFFCANVAS_DESC   = "Enable Off-Canvas Navigation type for Collapsed menu on small screen"
T3_NAVIGATION_COLLAPSE_LABEL            = "Always show submenu"
T3_NAVIGATION_COLLAPSE_DESC             = "Always show submenu when collapse"

T3_NAVIGATION_COLLAPSE_GROUP_LABEL      = "Collapse navigation for small screens"
T3_NAVIGATION_COLLAPSE_GROUP_DESC       = "Enable default Bootstrap collapse navigation for main navigation on small screens. This option should be turned off if you want to use Off-canvas style for collapse navigation"
T3_NAVIGATION_COLLAPSE_ENABLE_LABEL     = "Enable"
T3_NAVIGATION_COLLAPSE_ENABLE_DESC      = "Enable collapsible navigation for Main navigation"

T3_NAVIGATION_TYPE_LABEL                = "Navigation Style"
T3_NAVIGATION_BOOTSTRAP                 = "Bootstrap"
T3_NAVIGATION_MEGAMENU                  = "Megamenu"
T3_NAVIGATION_TYPE_DESC                 = "<h4>Joomla Module</h4> This is default Joomla menu system.<br /><h3>Megamenu</h3> A new feature supported in T3 Framework (a missing feature in Joomla)."

T3_NAVIGATION_MEGAMENU_GROUP_LABEL     	= "Megamenu Configuration"
T3_NAVIGATION_MEGAMENU_GROUP_DESC      	= "Enable Megamenu first then go to Megamenu setting panel to configure Megamenu"
T3_NAVIGATION_MM_ENABLE_LABEL           = "Enable MegaMenu"
T3_NAVIGATION_MM_ENABLE_DESC            = "Enable or disable Megamenu"
T3_NAVIGATION_MM_TYPE_LABEL             = "Menu"
T3_NAVIGATION_MM_TYPE_DESC              = "Select a menu to configure Megamenu for the menu items in the selected menu."
T3_NAVIGATION_ACL_LABEL                 = "Access"
T3_NAVIGATION_ACL_DESC                  = "The access level group that allow to view menu"

T3_NAVIGATION_SAVE_SUCCESSFULLY         = "Configuration changes saved successfully"
T3_NAVIGATION_SAVE_FAILED               = "Configuration has not been saved"
T3_NAVIGATION_DELETE_SUCCESSFULLY       = "Configuration has been deleted successfully"
T3_NAVIGATION_DELETE_FAILED             = "Error!!! Can't delete the configuration"
T3_NAVIGATION_ASK_DELETE                = "Megamenu"
T3_NAVIGATION_ASK_DELETE_DESC           = "Are you sure you want to delete configuration?"
T3_NAVIGATION_LABEL_DELETEIT            = "Delete"

T3_NAVIGATION_MM_TITLE                  = "Megamenu configuration"
T3_NAVIGATION_MM_SUBMENU                = "Submenu"
T3_NAVIGATION_MM_SUBMENU_DESC           = "Enable or disable submenus"
T3_NAVIGATION_MM_GROUP                  = "Group"
T3_NAVIGATION_MM_GROUP_DESC             = "Group submenu items and display in the same level of this menu item"
T3_NAVIGATION_MM_POSITIONS              = "Positions"
T3_NAVIGATION_MM_POSITIONS_DESC         = "Move menu item to right or left column"
T3_NAVIGATION_MM_EX_CLASS               = "Extra Class"
T3_NAVIGATION_MM_EX_CLASS_DESC          = "Add extra class to style megamenu."
T3_NAVIGATION_MM_ICON                   = "Icon"
T3_NAVIGATION_MM_ICON_DESC              = "Add Icon for Menu Item. Click Icon label to visit bootstrap icons page and get Icon Class. E.g.: [icon-search], [fa fa-home], [glyphicon glyphicon-heart],... without square brackets. Note: [fa] and [glyphicon] icons support by Bootstrap 3 base theme only"
T3_NAVIGATION_MM_CAPTION                = "Item caption"
T3_NAVIGATION_MM_CAPTION_DESC           = "Item caption"
T3_NAVIGATION_MM_WIDTH_SPAN             = "Width (1-12)"
T3_NAVIGATION_MM_WIDTH_SPAN_DESC        = "Add the appropriate number of span columns"
T3_NAVIGATION_MM_MOVE_LEFT              = "Move to Left Column"
T3_NAVIGATION_MM_MOVE_RIGHT             = "Move to Right Column"
T3_NAVIGATION_MM_MODULE                 = "Module"
T3_NAVIGATION_MM_MODULE_DESC            = "Select module to place in MegaMenu"
T3_NAVIGATION_MM_SELECT_MODULE          = "Select Module"
T3_NAVIGATION_MM_SAVE                   = "Save"
T3_NAVIGATION_MM_RESET                  = "Reset"
T3_NAVIGATION_MM_TOOLBOX                = "Megamenu Toolbox"
T3_NAVIGATION_MM_TOOLBOX_DESC           = "This toolbox includes all settings of megamenu, just select menu then configure. There are 3 level of configuration: sub-megamenu setting, column setting and menu item setting."
T3_NAVIGATION_MM_ITEM_CONF              = "Item Configuration"
T3_NAVIGATION_MM_SUBMNEU_CONF           = "Submenu Configuration"
T3_NAVIGATION_MM_COLUMN_CONF            = "Column Configuration"
T3_NAVIGATION_MM_ADD_REMOVE_COLUMN      = "Add/remove Column"
T3_NAVIGATION_MM_ADD_REMOVE_COLUMN_DESC = "Click <i class='icon-plus-sign'></i> to add a new column right after the column selection<br />Click <i class='icon-minus-sign'></i> to remove the selected column"
T3_NAVIGATION_MM_SUBMNEU_GRID           = "Add row"
T3_NAVIGATION_MM_SUBMNEU_GRID_DESC      = "Add a new row to the selected submenu"
T3_NAVIGATION_MM_SUBMNEU_WIDTH_PX       = "Submenu Width (px)"
T3_NAVIGATION_MM_SUBMNEU_WIDTH_PX_DESC  = "Set submenu width(in pixel)"
T3_NAVIGATION_MM_ALIGN                  = "Alignment"
T3_NAVIGATION_MM_ALIGN_DESC             = "Align submenu"
T3_NAVIGATION_MM_ALIGN_LEFT             = "Left"
T3_NAVIGATION_MM_ALIGN_CENTER           = "Center"
T3_NAVIGATION_MM_ALIGN_RIGHT            = "Right"
T3_NAVIGATION_MM_ALIGN_JUSTIFY          = "Justify"
T3_NAVIGATION_MM_HIDE_COLLAPSE          = "Hide when collapse"
T3_NAVIGATION_MM_HIDE_COLLAPSE_DESC     = "Hide this column when the menu is collapsed on small screen"
T3_NAVIGATION_MM_LOADING                = "Loading Menu..."
T3_NAVIGATION_MM_GROUP_STYLE            = "Tab Style"
T3_NAVIGATION_MM_GROUP_STYLE_DESC       = "Display submenu as tabs"

; ASSIGNMENT 
T3_MENUS_ASSIGNMENT_LABEL       = "Assignment"
T3_MENUS_ASSIGNMENT_DESC        = "Assign the current template style to the selected menu items that can be viewed by users."

; THEMEMAGIC 
T3_TM_TITLE                     = "ThemeMagic"
T3_TM_MINIMIZE                  = "Minimize"
T3_TM_THEME_LABEL               = "Theme"
T3_TM_BACK_TO_ADMIN             = "Back to Administrator"
T3_TM_EXIT                      = "Exit ThemeMagic"
T3_TM_CUSTOMIZING               = "You are customizing:"
T3_TM_PREVIEW                   = "Preview"
T3_TM_SAVE                      = "Save"
T3_TM_SAVEAS                    = "Save As"
T3_TM_DELETE                    = "Delete"
T3_TM_LABEL_OK                  = "Accept"
T3_TM_THEME_MAGIC               = "Theme magic"
T3_TM_THEME_NAME                = "Theme name"
T3_TM_ASK_ADD_THEME             = "Please enter new theme name"
T3_TM_ASK_DEL_THEME             = "Are you sure you want to delete this theme?"
T3_TM_ASK_SAVE_CHANGED          = "Theme <span class='text-info'>%THEME%</span> has been modified, save changes?"
T3_TM_ASK_OVERWRITE_THEME       = "Theme <span class='text-info'>%THEME%</span> already exists. Do you want to replace the existing file?"
T3_TM_ASK_CORRECT_NAME          = "Please enter alpha numeric name"
T3_TM_UNKNOWN_THEME             = "Unknown theme name"
T3_TM_INVALID_DATA_TO_SAVE      = "The data does not have correct format"
T3_TM_OPERATION_FAILED          = "Saving progress was failed. It might cause by file permission"
T3_TM_SAVE_SUCCESSFULLY         = "Theme changes saved successfully"
T3_TM_NOT_FOUND                 = "The source theme was not found"
T3_TM_EXISTED                   = "This theme already exists"
T3_TM_CLONE_SUCCESSFULLY        = "Theme cloned successfully"
T3_TM_DELETE_FAIL               = "Delete theme"
T3_TM_DELETE_SUCCESSFULLY       = "Theme deleted successfully"
T3_TM_COMPILE_FAILED            = "Theme complied unsucessfully"
T3_TM_COMPILE_SUCCESS           = "Theme compiled successfully"
T3_TM_PLUGIN_NOT_READY          = "T3 plugin is not ready"
T3_TM_NO_PERMISSION             = "You don't have permission to make change of theme"
T3_TM_UNKNOW_ACTION             = "Unknown request"
T3_TM_PREVIEW_ERROR             = "You have navigated to another page which using another template or your current preview page does not support LESS. ThemeMagic has been temporarily disabled."


; GRID EXTENED
T3_TM_GRID                              = "Grid"
T3_TM_VARS_SCFD_WIDE_WIDTH_LABEL        = "Wide Layout Width"
T3_TM_VARS_SCFD_WIDE_WIDTH_DESC         = "Wide Layout Width"
T3_TM_VARS_SCFD_WIDE_GUTTER_LABEL       = "Wide Gutter Width"
T3_TM_VARS_SCFD_WIDE_GUTTER_DESC        = "Wide Gutter Width"

T3_TM_VARS_SCFD_NORMAL_WIDTH_LABEL      = "Normal Layout Width"
T3_TM_VARS_SCFD_NORMAL_WIDTH_DESC       = "Normal Layout Width"
T3_TM_VARS_SCFD_NORMAL_GUTTER_LABEL     = "Normal Gutter Width"
T3_TM_VARS_SCFD_NORMAL_GUTTER_DESC      = "Normal Gutter Width"

T3_TM_VARS_SCFD_XTABLET_WIDTH_LABEL     = "XTablet Layout Width"
T3_TM_VARS_SCFD_XTABLET_WIDTH_DESC      = "XTablet Layout Width"
T3_TM_VARS_SCFD_XTABLET_GUTTER_LABEL    = "XTablet Gutter Width"
T3_TM_VARS_SCFD_XTABLET_GUTTER_DESC     = "XTablet Gutter Width"

T3_TM_VARS_SCFD_TABLET_WIDTH_LABEL      = "Tablet Layout Width"
T3_TM_VARS_SCFD_TABLET_WIDTH_DESC       = "Tablet Layout Width"
T3_TM_VARS_SCFD_TABLET_GUTTER_LABEL     = "Tablet Gutter Width"
T3_TM_VARS_SCFD_TABLET_GUTTER_DESC      = "Tablet Gutter Width"

T3_TM_VARS_SCFD_LG_WIDTH_LABEL          = "Large Desktop Width"
T3_TM_VARS_SCFD_LG_WIDTH_DESC           = "Large Desktop Width"

T3_TM_VARS_SCFD_MID_WIDTH_LABEL         = "Desktop Width"
T3_TM_VARS_SCFD_MID_WIDTH_DESC          = "Desktop Width"

T3_TM_VARS_SCFD_SM_WIDTH_LABEL          = "Tablet Width"
T3_TM_VARS_SCFD_SM_WIDTH_DESC           = "Tablet Width"


; SCAFFOLDING 
T3_TM_SCAFFOLDING                       = "Scaffolding"
T3_TM_VARS_BODY_BKG_LABEL               = "Background Color"
T3_TM_VARS_BODY_BKG_DESC                = "Background Color"
T3_TM_VARS_TEXT_COLOR_LABEL             = "Text Color"
T3_TM_VARS_TEXT_COLOR_DESC              = "Text Color"
T3_TM_VARS_LINK_COLOR_LABEL             = "Link Color"
T3_TM_VARS_LINK_COLOR_DESC              = "Link Color"

; VISUAL 
T3_TM_VISUAL                            = "Visual"
T3_TM_VARS_ELEMENT_RADIUS_LABEL         = "Elements Radius"
T3_TM_VARS_ELEMENT_RADIUS_DESC          = "Elements Radius"
T3_TM_VARS_NAVBAR_INVERTED_LABEL        = "Navbar Inverted"
T3_TM_VARS_NAVBAR_INVERTED_LDESC        = "Navbar Inverted"
T3_TM_VARS_SPOTLIGHT_INVERTED_LABEL     = "Spotlight Inverted"
T3_TM_VARS_SPOTLIGHT_INVERTED_DESC      = "Spotlight Inverted"
T3_TM_VARS_HIDE_SLOGAN_LABEL            = "Hide Slogan"
T3_TM_VARS_HIDE_SLOGAN_DESC             = "Hide Slogan"

; MODULE 
T3_TM_MODULE                            = "Module"
T3_TM_VARS_MODULE_BGCOLOR_LABEL         = "Module Background Color"
T3_TM_VARS_MODULE_BGCOLOR_DESC          = "Module Background Color"
T3_TM_VARS_MODULE_COLOR_LABEL           = "Module Text Color"
T3_TM_VARS_MODULE_COLOR_DESC            = "Module Text Color"
T3_TM_VARS_MODULE_TITLE_BGCOLOR_LABEL   = "Module Title Background Color"
T3_TM_VARS_MODULE_TITLE_BGCOLOR_DESC    = "Module Title Background Color"
T3_TM_VARS_MODULE_TITLE_COLOR_LABEL     = "Module Title Text Color"
T3_TM_VARS_MODULE_TITLE_COLOR_DESC      = "Module Title Text Color"

; SPOTLIGHTS 
T3_TM_SPOTLIGHTS                        = "Spotlights"
T3_TM_VARS_INVERT_SPOTLIGHT_LABEL       = "Use 'inverted' spotlights"
T3_TM_VARS_INVERT_SPOTLIGHT_DESC        = "Use 'inverted' spotlights"

; TYPO
T3_TM_TYPO                              = "Typo"
T3_TM_VARS_FONTSIZE_LABEL               = "Font Size"
T3_TM_VARS_FONTSIZE_DESC                = "Font Size"

T3_TM_VARS_FONTFAMILY_LABEL             = "Font Family"
T3_TM_VARS_FONTFAMILY_DESC              = "Font Family"
T3_TM_VARS_FONTFAMILY_SERIF             = "Serif"
T3_TM_VARS_FONTFAMILY_SANS_SERIF        = "Sans Serif"
T3_TM_VARS_FONTFAMILY_MONOSPACE         = "Monospace"
T3_TM_VARS_HEADINGFONTFAMILY_LABEL      = "Heading Font Family"
T3_TM_VARS_HEADINGFONTFAMILY_DESC       = "Heading Font Family"

T3_TM_VARS_FONTFAMILY_CUSTOM            = "Custom Font"
T3_TM_VARS_FONTFAMILY_CUSTOM_LABEL      = "Custom Font"
T3_TM_VARS_FONTFAMILY_CUSTOM_DESC       = "Example: 'Segoe UI', Arial, sans-serif. If you need load external font, go to tab Advanced and put your font urls in External CSS Urls param"

;ADVANCED
T3_TM_ADVANCED                          = "Advanced"
T3_TM_VARS_IMPORT_EXTERNAL_URLS_LABEL   = "External CSS Urls"
T3_TM_VARS_IMPORT_EXTERNAL_URLS_DESC    = "List external css urls here to import. It's usefull to load web fonts such as Google Fonts. List each url in a line"


; INJECTION
T3_INJECTION_LABEL                      = "Custom Code"
T3_INJECTION_DESC                       = "Add custom code to some special positions of webpage. Those markup will not filter. Please be careful when copy code from other websites."
T3_INJECTION_OPEN_HEAD_LABEL            = "After &lt;head&gt;"
T3_INJECTION_OPEN_HEAD_DESC             = "Add custom code right after open &lt;head&gt; tag"
T3_INJECTION_CLOSE_HEAD_LABEL           = "Before &lt;/head&gt;"
T3_INJECTION_CLOSE_HEAD_DESC            = "Add custom code before closing &lt;/head&gt; tag"
T3_INJECTION_OPEN_BODY_LABEL            = "After &lt;body&gt;"
T3_INJECTION_OPEN_BODY_DESC             = "Add custom code right after open &lt;body&gt; tag"
T3_INJECTION_CLOSE_BODY_LABEL           = "Before &lt;/body&gt;"
T3_INJECTION_CLOSE_BODY_DESC            = "Add custom code before closing &lt;/body&gt; tag"
T3_INJECTION_DEBUG_LABEL                = "Show debug module position"
T3_INJECTION_DEBUG_DESC                 = "Add modules in debug position before closing &lt;/body&gt; tag"


; TOUR GUIDE
T3_TOUR_INTRO_1                   = "Welcome to T3!"
T3_TOUR_INTRO_2                   = "Are you ready to discover the best framework for Joomla! yet? Click the buttons below to start your travel and having fun!"
T3_TOUR_CTRL_START                = "Start the tour!"
T3_TOUR_CTRL_END                  = "End"
T3_TOUR_CTRL_NEXT                 = "Next"
T3_TOUR_CTRL_PREV                 = "Prev"

T3_TOUR_INTRO_FIRST                 = "<h1>Welcome to T3!</h1><p>Are you ready to discover the best framework for Joomla! yet? Click the buttons below to start your travel and having fun!</p>"
T3_TOUR_INTRO_TOUR1                 = "The settings are applied for all themes, layouts. Setting included in the tab: enable or disable development mode, responsive and ThemeMagic feature."
T3_TOUR_INTRO_TOUR2                 = "The settings in the tab is also included in the ThemeMagic. The settings allow you to select default theme for the style and change logo if you wish."
T3_TOUR_INTRO_TOUR3                 = "JA T3 comes with multiple layouts, in the layout setting, it allows to configure/customize the layout you wish to use in each style. Each layout contains number of block, and each block includes one or many module positions."
T3_TOUR_INTRO_TOUR4                 = "The tab includes settings of the Megamenu - a missing feature in Joomla!. With Megamenu, you can create any type of menu that your site needs."
T3_TOUR_INTRO_TOUR5                 = "The settings let you override template. In your site, you can use multiple styles simultaneously, each style is applied in specific menus. The menus that are assigned in settings of style A will override the same menus in default style."

T3_TOUR_GUIDE_1_TITLE               = "Compile LESS to CSS"
T3_TOUR_GUIDE_1_CONTENT               = "<div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/enable-development.png' alt='' /></div> <p>Feel free to enable the option when you are in development mode. This option will allow you to compile LESS to CSS. Whatever changes in your customization for the LESS files will then be compiled to the corresponding CSS files, which are the actual files that get your site running on.</p>"
T3_TOUR_GUIDE_2_TITLE               = "ThemeMagic"
T3_TOUR_GUIDE_2_CONTENT               = "<div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/thememagic-admin.png' alt='' /></div> <p>ThemeMagic is the visual customization. It includes multiple parameters which allow you to customize as you wish. The changes in the front-end are displayed on the right panel.</p>"
T3_TOUR_GUIDE_3_TITLE               = "Select Style to Edit"
T3_TOUR_GUIDE_3_CONTENT               = "<div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/list-of-styles.png' alt='' /></div> <p>You can use this option to quickly select style for customization.</p>"
T3_TOUR_GUIDE_4_TITLE               = "Language of current style"
T3_TOUR_GUIDE_4_CONTENT               = "Select the language that you wish to set as default if your site is multilingual. If your site is in a single language only, this field will be disabled."
T3_TOUR_GUIDE_5_TITLE               = "Template version and update"
T3_TOUR_GUIDE_5_CONTENT               = "To check out whether or not your T3 Blank template is up to date, simply click on the button and get the status. If it's not up to the latest version, no worry, you can get the upgrade for free."
T3_TOUR_GUIDE_6_TITLE               = "FrameWork version and update"
T3_TOUR_GUIDE_6_CONTENT               = "This button allows you to: <ol><li>Check and</li><li>Update the latest version of framework in case yours are not up to date.</li>"
T3_TOUR_GUIDE_7_TITLE               = "Global Settings"
T3_TOUR_GUIDE_7_CONTENT               = "<div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/global-settings.png' alt='' /></div> <p>The settings are applied for all styles, themes, layouts. Setting included in the tab: enable or disable development mode, responsive and ThemeMagic feature.</p>"
T3_TOUR_GUIDE_8_TITLE               = "Development mode"
T3_TOUR_GUIDE_8_CONTENT               = "Please enable this option when you are in development mode. It should be turned off if you are not developing your site so that your site speed is better."
T3_TOUR_GUIDE_9_TITLE               = "Enable ThemeMagic"
T3_TOUR_GUIDE_9_CONTENT               = "<p>If you want to use ThemeMagic to customize your theme, you gotta have to enable the ThemeMagic first.</p><div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/theme-magic.png' alt='' /></div> <p>Click on the ThemeMagic to go to the ThemeMagic configuration panel. </p>"
T3_TOUR_GUIDE_10_TITLE                = "Enable or Disable responsive"
T3_TOUR_GUIDE_10_CONTENT              = "T3 allows you to enable responsive feature or not. If you select No, your site is a non-responsive website."
T3_TOUR_GUIDE_11_TITLE                = "Theme Settings"
T3_TOUR_GUIDE_11_CONTENT              = "<div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/list-of-themes.png' alt='' /></div> <p>The settings in the tab are also included in the ThemeMagic. The settings allow you to select default theme for the style and change logo if you wish.</p>"
T3_TOUR_GUIDE_12_TITLE                = "Select theme for current style"
T3_TOUR_GUIDE_12_CONTENT              = "<div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/list-of-themes.png' alt='' /></div> <p>T3 supports multiple Themes, select the Theme you want to apply for the style then customize it as you wish.</p>"
T3_TOUR_GUIDE_13_TITLE                = "Logo Setting"
T3_TOUR_GUIDE_13_CONTENT              = "<div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/logo.png' alt='' /></div> <p>You can use either image or text logo type. To change your current logo, just select a new logo image, it will automatically replace the current logo. Note that this settings can be configured in the ThemeMagic as well.</p>"
T3_TOUR_GUIDE_14_TITLE                = "Layout Settings"
T3_TOUR_GUIDE_14_CONTENT              = "<div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/list-of-layouts.png' alt='' /></div> <p>JA T3 comes with multiple layouts, in the layout setting, it allows to configure/customize the layout you wish to use in each style. Each layout contains number of block, and each block includes one or many module positions.</p>"
T3_TOUR_GUIDE_15_TITLE                = "Assign layout to current style"
T3_TOUR_GUIDE_15_CONTENT              = "<div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/select-layout-to-configure.png' alt='' /></div> <p>From the multiple layouts, select the one that the style uses. You can easily customize the layout using the Layout Configuration below.</p>"
T3_TOUR_GUIDE_16_TITLE                = ""
T3_TOUR_GUIDE_16_CONTENT              = ""
T3_TOUR_GUIDE_17_TITLE                = "MegaMenu Settings"
T3_TOUR_GUIDE_17_CONTENT              = "The tab includes settings of the Megamenu - a missing feature in Joomla!. With Megamenu, you can create any type of menu that your site needs."
T3_TOUR_GUIDE_18_TITLE                = "Enable or disable MegaMenu"
T3_TOUR_GUIDE_18_CONTENT              = "If you only want to use Joomla! menu system,  just turn it off"
T3_TOUR_GUIDE_19_TITLE                = "Menu Assignment"
T3_TOUR_GUIDE_19_CONTENT              = "<div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/menu-assign.png' alt='' /></div><p>The settings let you override template. In your site, you can use multiple styles simultaneously, each style is applied in specific menus. The menus that are assigned in settings of style A will override the same menus in default style.</p>"
T3_TOUR_GUIDE_20_TITLE                = "Module Positions Setting"
T3_TOUR_GUIDE_20_CONTENT              = "<div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/layout.png' alt='' /></div><p>Using the button to assign module position to the block.</p><div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/layout-module.png' alt='' /></div><p>You can set the number of module positions for a spotlight block.</p>"
T3_TOUR_GUIDE_21_TITLE                = "Module Positions"
T3_TOUR_GUIDE_21_CONTENT              = "Select the positions that are going to be used in the above selected layout. In other words, this will allow you to freely configure which content to be displayed in that specific selected layout according to your preferences."
T3_TOUR_GUIDE_22_TITLE                = "Responsive Layout"
T3_TOUR_GUIDE_22_CONTENT              = "<div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/responsive-layout.png' alt='' /></div><p>In this setting panel, you can enable/disable and resize the module positions for the spotlight blocks only for each specific layout: wide, mobile, tablet, etc.</p>"
T3_TOUR_GUIDE_23_TITLE                = "Layouts Configuration"
T3_TOUR_GUIDE_23_CONTENT              = "<div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/enable-disable-position.png' alt='' /></div><p>Using the icon to enable/disable the module position for the spotlight block in the current layout.</p><div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/resize-module-position.png' alt='' /></div><p>Drag to resize the module position (basegrid: 12). Please do keep in mind that it is applied in the current modifying layout only and not applied to all unless you make changes in each layout accordingly.</p>"
T3_TOUR_GUIDE_25_TITLE                = "Navigation Configuration"
T3_TOUR_GUIDE_25_CONTENT              = "<div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/navigation-setting.png' alt='' /></div><p>This place let you set the behavior of the main navigation bar. It also let you choose a cool feature of T3 - Megamenu and its options.</p>"
T3_TOUR_GUIDE_26_TITLE                = "Option to open sub-menu"
T3_TOUR_GUIDE_26_CONTENT              = "You can select to display sub-menu when hovering or clicking on its parent menu."
T3_TOUR_GUIDE_27_TITLE                = "Select Menu"
T3_TOUR_GUIDE_27_CONTENT              = "Select menu for current style, each style can be assigned different menu."
T3_TOUR_GUIDE_28_TITLE                = "Enable Megamenu"
T3_TOUR_GUIDE_28_CONTENT              = "<div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/enable-megamenu.png' alt='' /></div><p>Enable this option so that Megamenu will be active in this style. After enable this option, go to Megamenu setting panel to configure megamenu.</p>"
T3_TOUR_GUIDE_29_TITLE                = "Collapse menu in small screens"
T3_TOUR_GUIDE_29_CONTENT              = "<div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/collapse-menu.png' alt='' /></div><p>Enable this option to use default Bootstrap navigation (dropdown menu style) on small screens like iPhone, tablet</p>"
T3_TOUR_GUIDE_30_TITLE                = "Custom Code"
T3_TOUR_GUIDE_30_CONTENT              = "<div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/injection.png' alt='' /></div></p>Thinking of a way to add-in a custom code after and before the special tags (such as &lt;head&gt;&lt;/head&gt;, &lt;body>&gt;&lt;/body&gt;)? Worry free, we have your back!</p>"
T3_TOUR_GUIDE_31_TITLE                = "Megamenu Configuration"
T3_TOUR_GUIDE_31_CONTENT              = "<div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/megamenu.png' alt='' /></div><p>We provide you a huge canvas for to focus on configuring your Megamenu. This feature is what Joomla is lacking of and gurantee to change your classic navigation system experience.</p>"
T3_TOUR_GUIDE_32_TITLE                = "Add-ons Configuration"
T3_TOUR_GUIDE_32_CONTENT              = "<div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/off-canvas.png' alt='' /></div><p>This tab will include the add-ons. Right now, it has configurations for Off-Canvas sidebar.</p>"
T3_TOUR_GUIDE_33_TITLE                = "Build CSS for RTL"
T3_TOUR_GUIDE_33_CONTENT              = "<div class='t3-admin-tour-img'><img src='http://static.joomlart.com/images/jat3v3-documents/tour-guide/rebuild-rtl.png' alt='' /></div><p>If you use RTL language layout, when compile LESS to CSS, you need to enable this option so that it will build CSS for RTL.</p>"


T3_TOUR_GUIDE_DISMISS_1               = "Dismiss"
T3_TOUR_GUIDE_DISMISS_2               = "Ok, got it!"
T3_TOUR_GUIDE_DISMISS_3               = "Roger"
T3_TOUR_GUIDE_DISMISS_4               = "Cool!"
T3_TOUR_GUIDE_DISMISS_5               = "Thanks, that's Awesome"
T3_TOUR_GUIDE_DISMISS_6               = "Got it dude!"
T3_TOUR_QUICK_HELP                  = "Click here to get more help"


; MISC
T3_TOOLBAR_SAVE               = "Save"
T3_TOOLBAR_SAVECLOSE            = "Save &amp; Close"
T3_TOOLBAR_SAVE_AS_CLONE          = "Save as Copy"
T3_TOOLBAR_COMPILE_LESS_CSS         = "LESS to CSS"
T3_TOOLBAR_COMPILE_LESS_CSS_DESC      = "Compile LESS to CSS"
T3_TOOLBAR_COMPILE_THIS           = "[%s] theme only"
T3_TOOLBAR_COMPILE_THIS_DESC        = "Compile the theme for current template style only"
T3_TOOLBAR_THEMER             = "ThemeMagic"
T3_TOOLBAR_THEMER_DESC            = "ThemeMagic"
T3_TOOLBAR_COPY               = "Copy"
T3_TOOLBAR_CLOSE              = "Close"
T3_TOOLBAR_DELETE               = "Delete"
T3_TOOLBAR_HELP               = "Help"
T3_TOOLBAR_MEGAMENU             = "Megamenu"
T3_TOOLBAR_MEGAMENU_DESC          = "Go to Megamenu configuration page"

T3_SELECT_STYLE_LABEL             = "Current Style"
T3_SELECT_STYLE_DESC              = "Select a style from T3 template to customize"
T3_LBL_OK                     = "Ok"
T3_LBL_VIEWTHEMER               = "ThemeMagic"

T3_MSG_PLUGIN_NOT_READY             = "T3 Framework is not ready"
T3_MSG_FAILED_INIT_BASE             = "Base theme is not ready"
T3_MSG_COMPILE_SUCCESS              = "Successfully compile LESS to CSS"
T3_MSG_COMPILE_FAILURE              = "<h4>Compile LESS to CSS failed</h4><p>%s</p>"
T3_MSG_UNKNOWN_ERROR              = "Unexpected error. Please refresh the page try again later."
T3_MSG_NO_PERMISSION              = "You does have permission to make change of theme"
T3_MSG_UNKNOW_ACTION              = "Unknown request"
T3_MSG_ENABLE_THEMEMAGIC            = "Please enable ThemeMagic Mode in General tab first"
T3_MSG_MEGAMENU_NOT_USED            = "This will direct you to the Megamenu Configuration page. However, you have chosen using the Joomla Module over Megamenu, hence the Megamenu Configuration is not necessary in this case. Please click again to continue!"
T3_MSG_WARNING                  = "Warning!"
T3_MSG_FILE_NOT_WRITABLE            = "File system Not writable. Please check again server file permission."
T3_MSG_PACKAGE_DAMAGED              = "The framework has not been installed correctly"
T3_MSG_DEVFOLDER_NOT_WRITABLE           = "Cannot create css cached file in development folder: %s"
T3_MSG_LESS_NOT_VALID             = "Template Less structure was not compatible with T3 compiler"
T3_MSG_MODULE_NOT_AVAIL             = "This module might not available with current Access Level"
T3_MSG_CANNOT_DETECT_TEMPLATE       = "Cannot detect current T3 template"
T3_MSG_SWITCH_RESPONSIVE_MODE       = "Please save the config then re-build LESS to CSS to enable/disable Responsive mode"


; ADDON
T3_ADDON_LABEL                          = "Add-ons"
T3_ADDON_DESC                           = "Built-in Add-ons for T3 Framework"
T3_ADDON_OFFCANVAS_GROUP_LABEL          = "Off-canvas Sidebar"
T3_ADDON_OFFCANVAS_GROUP_DESC         = "Enable off-canvas sidebar then select effect for the Off-canvas sidebar."
T3_ADDON_OFFCANVAS_ENABLE_LABEL         = "Enable"
T3_ADDON_OFFCANVAS_ENABLE_DESC          = "Enable to load off-canvas library"
T3_ADDON_OFFCANVAS_EFFECT_LABEL         = "Off-Canvas Effect"
T3_ADDON_OFFCANVAS_EFFECT_DESC          = "Sidebar transition effect for Off-canvas menu"
T3_ADDON_OFFCANVAS_EFFECT_1             = "Slide in on top"
T3_ADDON_OFFCANVAS_EFFECT_2             = "Reveal"
T3_ADDON_OFFCANVAS_EFFECT_3             = "Push"
T3_ADDON_OFFCANVAS_EFFECT_4             = "Slide along"
T3_ADDON_OFFCANVAS_EFFECT_5             = "Reverse slide out"
T3_ADDON_OFFCANVAS_EFFECT_6             = "Rotate pusher"
T3_ADDON_OFFCANVAS_EFFECT_7             = "3D rotate in"
T3_ADDON_OFFCANVAS_EFFECT_8             = "3D rotate out"
T3_ADDON_OFFCANVAS_EFFECT_9             = "Scale down pusher"
T3_ADDON_OFFCANVAS_EFFECT_10            = "Scale up"
T3_ADDON_OFFCANVAS_EFFECT_11            = "Scale & Rotate pusher"
T3_ADDON_OFFCANVAS_EFFECT_12            = "Open door"
T3_ADDON_OFFCANVAS_EFFECT_13            = "Fall down"
T3_ADDON_OFFCANVAS_EFFECT_14            = "Delayed 3D rotate"

; ADDON - Extras
T3_ADDON_THEME_EXTRAS_LABEL             = "Template Extended styles"
T3_ADDON_THEME_EXTRAS_DESC              = "This allow you load extra style file for the selected menu items"
T3_ADDON_THEME_EXTRAS_ALL               = "All pages"
T3_ADDON_THEME_EXTRAS_NONE              = "Not use"

; Extra fields
T3_EXTRA_FIELDS_GROUP_LABEL             = "Extra Fields"
T3_EXTRA_FIELDS_GROUP_DESC              = "Extend Article's fields for current category"
T3_EXTRA_FIELDS_LABEL                   = "Extra Fields Group"
T3_EXTRA_FIELDS_DESC                    = "Select the extra fields group for extend those articles in this category"language/en-GB/en-GB.plg_fields_radio.sys.ini000060400000000574152453623440014724 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_RADIO="Fields - Radio"
PLG_FIELDS_RADIO_XML_DESCRIPTION="This plugin lets you create new fields of type 'radio' in any extensions where custom fields are supported."
language/en-GB/en-GB.plg_installer_webinstaller.sys.ini000060400000000563152453623440017046 0ustar00; Joomla! Project
; (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_INSTALLER_WEBINSTALLER="Installer - Install from Web"
PLG_INSTALLER_WEBINSTALLER_XML_DESCRIPTION="This plugin offers functionality for the 'Install from Web' tab."
language/en-GB/en-GB.plg_content_emailcloak.sys.ini000060400000000553152453623440016130 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CONTENT_EMAILCLOAK="Content - Email Cloaking"
PLG_CONTENT_EMAILCLOAK_XML_DESCRIPTION="Cloaks all email addresses in content from spambots using JavaScript."language/en-GB/en-GB.mod_custom.ini000060400000000742152453623440012767 0ustar00; Joomla! Project
; (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_CUSTOM="Custom"
MOD_CUSTOM_FIELD_PREPARE_CONTENT_DESC="Optionally prepare the content with Joomla Content Plugins."
MOD_CUSTOM_FIELD_PREPARE_CONTENT_LABEL="Prepare Content"
MOD_CUSTOM_XML_DESCRIPTION="This module allows you to create your own Module using a WYSIWYG editor."
language/en-GB/en-GB.com_contenthistory.ini000060400000006411152453623440014547 0ustar00; Joomla! Project
; (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_CONTENTHISTORY_BUTTON_COMPARE_ALL_ROWS_DESC="Select to see all values for the item, including ones that haven't changed."
COM_CONTENTHISTORY_BUTTON_COMPARE_ALL_ROWS="All Values"
COM_CONTENTHISTORY_BUTTON_COMPARE_CHANGED_ROWS_DESC="Select to see only those values that have changed."
COM_CONTENTHISTORY_BUTTON_COMPARE_CHANGED_ROWS="Changed Values"
COM_CONTENTHISTORY_BUTTON_COMPARE_DESC="Choose two versions and select to compare them."
COM_CONTENTHISTORY_BUTTON_COMPARE_HTML_DESC="Select to see the HTML source code for the changes."
COM_CONTENTHISTORY_BUTTON_COMPARE_HTML="Show HTML Code"
COM_CONTENTHISTORY_BUTTON_COMPARE_TEXT_DESC="Select to see the item changes as text."
COM_CONTENTHISTORY_BUTTON_COMPARE_TEXT="Show Text"
COM_CONTENTHISTORY_BUTTON_COMPARE="Compare"
COM_CONTENTHISTORY_BUTTON_DELETE_DESC="Choose one or more versions and select to permanently delete them."
COM_CONTENTHISTORY_BUTTON_DELETE="Delete"
COM_CONTENTHISTORY_BUTTON_KEEP_DESC="Choose one or more versions and select to toggle the keep forever on or off."
COM_CONTENTHISTORY_BUTTON_KEEP_TOGGLE_OFF="Select to allow this version to be deleted automatically according to the delete schedule."
COM_CONTENTHISTORY_BUTTON_KEEP_TOGGLE_ON="Select to prevent this version being deleted automatically."
COM_CONTENTHISTORY_BUTTON_KEEP="Keep On/Off"
COM_CONTENTHISTORY_BUTTON_LOAD_DESC="This button loads the selected version into the edit form."
COM_CONTENTHISTORY_BUTTON_LOAD="Restore"
COM_CONTENTHISTORY_BUTTON_PREVIEW_DESC="This button allows you to see a preview of the selected version."
COM_CONTENTHISTORY_BUTTON_PREVIEW="Preview"
COM_CONTENTHISTORY_BUTTON_SELECT_ONE="Please select one version."
COM_CONTENTHISTORY_BUTTON_SELECT_TWO="Please select two versions."
COM_CONTENTHISTORY_CHARACTER_COUNT="Character Count"
COM_CONTENTHISTORY_COMPARE_DIFF="Changes"
COM_CONTENTHISTORY_COMPARE_TITLE="Compare View"
COM_CONTENTHISTORY_COMPARE_VALUE1="Saved on %s %s"
COM_CONTENTHISTORY_COMPARE_VALUE2="Saved on %s %s"
COM_CONTENTHISTORY_ERROR_FAILED_LOADING_CONTENT_TYPE="Failed loading content type."
COM_CONTENTHISTORY_ERROR_INVALID_ID="Invalid ID selected."
COM_CONTENTHISTORY_ERROR_KEEP_NOT_PERMITTED="You are not permitted to change the keep forever status."
COM_CONTENTHISTORY_ERROR_VERSION_NOT_FOUND="Version not found."
COM_CONTENTHISTORY_KEEP_VERSION="Keep Forever"
COM_CONTENTHISTORY_MODAL_TITLE="Item Version History"
COM_CONTENTHISTORY_N_ITEMS_DELETED_1="%s history version deleted."
COM_CONTENTHISTORY_N_ITEMS_DELETED="%s history versions deleted."
COM_CONTENTHISTORY_N_ITEMS_KEEP_TOGGLE_1="Successfully changed the keep forever value for %s history version."
COM_CONTENTHISTORY_N_ITEMS_KEEP_TOGGLE="Successfully changed the keep forever value for %s history versions."
COM_CONTENTHISTORY_NO_ITEM_SELECTED="No history version selected."
COM_CONTENTHISTORY_PREVIEW_FIELD="Field"
COM_CONTENTHISTORY_PREVIEW_SUBTITLE_DATE="Preview of version from %s"
COM_CONTENTHISTORY_PREVIEW_SUBTITLE="Version note: %s"
COM_CONTENTHISTORY_PREVIEW_TITLE="Preview of Selected Item"
COM_CONTENTHISTORY_PREVIEW_VALUE="Value"
COM_CONTENTHISTORY_VERSION_NOTE="Version Note"
language/en-GB/en-GB.plg_installer_jce.ini000060400000003267152453623440014303 0ustar00; JCE
; Copyright (C) 2009 - 2024 Ryan Demmer. All rights reserved.
; License GNU General Public License version 2 or later; see LICENSE.txt, see LICENSE.php
; Note : All ini files need to be saved as UTF-8

PLG_INSTALLER_JCE="Installer - JCE"
PLG_INSTALLER_JCE_XML_DESCRIPTION="JCE Installer Plugin"
PLG_INSTALLER_JCE_KEY_WARNING="<strong>JCE Update : </strong>You need to set your Subscription Key to update JCE Pro or JCE Plugins. Please see - <a href='https://www.joomlacontenteditor.net/support/faq/subscription/using-the-subscription-key' target='_blank'><strong>Using the Subscription Key</strong></a>"
PLG_INSTALLER_JCE_KEY_INVALID="<strong>JCE Update : </strong>The Subscription Key you have provided is expired or invalid. Please purchase a new Subscription to continue using this key - <a href='https://www.joomlacontenteditor.net/component/subscriptions/purchase' target='_blank'><strong>Buy or Renew a JCE Subscription</strong></a><br />For more information about the Subscription Key, please see - <a href='https://www.joomlacontenteditor.net/support/faq/subscription/using-the-subscription-key' target='_blank'><strong>Using the Subscription Key</strong></a>"
PLG_INSTALLER_JCE_KEY_LIMIT="<strong>JCE Update : </strong>You have reached the Update Limit for this Subscription Key. Please upgrade to the next Subscription Tier - <a href='https://www.joomlacontenteditor.net/component/subscriptions/purchase' target='_blank'><strong>Buy or Renew a JCE Subscription</strong></a><br />For more information about the Subscription Key, please see - <a href='https://www.joomlacontenteditor.net/support/faq/subscription/using-the-subscription-key' target='_blank'><strong>Using the Subscription Key</strong></a>"language/en-GB/en-GB.mod_popular.ini000060400000004365152453623440013144 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_POPULAR="Popular Articles"
MOD_POPULAR_CREATED="Created"
MOD_POPULAR_FIELD_AUTHORS_DESC="A filter for the Authors."
MOD_POPULAR_FIELD_AUTHORS_LABEL="Authors"
MOD_POPULAR_FIELD_CATEGORY_DESC="Select Articles from a specific Category or all Categories."
MOD_POPULAR_FIELD_COUNT_DESC="The number of items to display (default 5)."
MOD_POPULAR_FIELD_COUNT_LABEL="Count"
MOD_POPULAR_FIELD_VALUE_ADDED_OR_MODIFIED_BY_ME="Added or modified by me"
MOD_POPULAR_FIELD_VALUE_ANYONE="Anyone"
MOD_POPULAR_FIELD_VALUE_NOT_ADDED_OR_MODIFIED_BY_ME="Not added or modified by me"
MOD_POPULAR_ITEMS="Popular Items"
MOD_POPULAR_NO_MATCHING_RESULTS="No Matching Results"
MOD_POPULAR_TITLE="Popular Articles"
MOD_POPULAR_TITLE_1="Top Popular Article"
MOD_POPULAR_TITLE_MORE="Top %1$s Popular Articles"
MOD_POPULAR_TITLE_BY_ME="Top Popular Articles By Me"
MOD_POPULAR_TITLE_BY_ME_1="Top Popular Article By Me"
MOD_POPULAR_TITLE_BY_ME_MORE="Top %1$s Popular Articles By Me"
MOD_POPULAR_TITLE_NOT_ME="Top Popular Articles Not By Me"
MOD_POPULAR_TITLE_NOT_ME_1="Top Popular Article Not By Me"
MOD_POPULAR_TITLE_NOT_ME_MORE="Top %1$s Popular Articles Not By Me"
MOD_POPULAR_TITLE_CATEGORY="Top Popular Articles (%2$s category)"
MOD_POPULAR_TITLE_CATEGORY_1="Top Popular Article (%2$s category)"
MOD_POPULAR_TITLE_CATEGORY_MORE="Top %1$s Popular Articles (%2$s category)"
MOD_POPULAR_TITLE_CATEGORY_BY_ME="Top Popular Articles By Me (%2$s category)"
MOD_POPULAR_TITLE_CATEGORY_BY_ME_1="Top Popular Article By Me (%2$s category)"
MOD_POPULAR_TITLE_CATEGORY_BY_ME_MORE="Top %1$s Popular Articles By Me (%2$s category)"
MOD_POPULAR_TITLE_CATEGORY_NOT_ME="Top Popular Articles Not By Me (%2$s category)"
MOD_POPULAR_TITLE_CATEGORY_NOT_ME_1="Top Popular Article Not By Me (%2$s category)"
MOD_POPULAR_TITLE_CATEGORY_NOT_ME_MORE="Top %1$s Popular Articles Not By Me (%2$s category)"
MOD_POPULAR_UNEXISTING="<i>Non existent</i>"
MOD_POPULAR_XML_DESCRIPTION="This module shows a list of the most popular published Articles that are still current. Some that are shown may have expired even though they are the most recent."
language/en-GB/en-GB.com_joomlaupdate.ini000060400000045023152453623440014141 0ustar00; Joomla! Project
; (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_JOOMLAUPDATE_CHECKED_UPDATES="Checked for updates."
COM_JOOMLAUPDATE_CONFIGURATION="Joomla Update: Options"
COM_JOOMLAUPDATE_CONFIG_CUSTOMURL_DESC="This is a custom XML update source URL, used only when the &quot;Update Source&quot; option is set to &quot;Custom URL&quot;."
COM_JOOMLAUPDATE_CONFIG_CUSTOMURL_LABEL="Custom URL"
COM_JOOMLAUPDATE_CONFIG_SOURCES_DESC="Configure where Joomla gets its update information from."
COM_JOOMLAUPDATE_CONFIG_SOURCES_LABEL="Update Source"
COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_CUSTOM="Custom URL"
COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_CUSTOM_ERROR="The custom URL field is empty."
COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_DEFAULT="Default"
COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_DESC="The update channel Joomla will use to find out if there is an update available."
COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_LABEL="Update Channel"
COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_NEXT="Joomla Next"
COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_TESTING="Testing"
COM_JOOMLAUPDATE_FAILED_TO_CHECK_UPDATES="Failed to check for updates."
COM_JOOMLAUPDATE_MINIMUM_STABILITY_ALPHA="Alpha"
COM_JOOMLAUPDATE_MINIMUM_STABILITY_BETA="Beta"
COM_JOOMLAUPDATE_MINIMUM_STABILITY_DESC="The minimum stability of the extension updates you would like to see. Development is the least stable, Stable is production quality. If an extension doesn't specify a level it is assumed to be Stable."
COM_JOOMLAUPDATE_MINIMUM_STABILITY_DEV="Development"
COM_JOOMLAUPDATE_MINIMUM_STABILITY_LABEL="Minimum Stability"
COM_JOOMLAUPDATE_MINIMUM_STABILITY_RC="Release Candidate"
COM_JOOMLAUPDATE_MINIMUM_STABILITY_STABLE="Stable"
COM_JOOMLAUPDATE_OVERVIEW="Joomla Update"
COM_JOOMLAUPDATE_TOOLBAR_CHECK="Check for Updates"
COM_JOOMLAUPDATE_PREUPDATE_HEADING_CHECKED="Checked"
COM_JOOMLAUPDATE_PREUPDATE_HEADING_REQUIREMENT="Requirement"
COM_JOOMLAUPDATE_PREUPDATE_UNKNOWN_EXTENSION_MANIFESTCACHE_VERSION="Unknown Version"
COM_JOOMLAUPDATE_PREUPDATE_CHECK_EXTENSION_AUTHOR_URL="Extension Author URL"
COM_JOOMLAUPDATE_PREUPDATE_CHECK_NOT_COMPLETE="Pre-Update checks have not been completed yet - please wait."
COM_JOOMLAUPDATE_PREUPDATE_CHECK_COMPLETED_YOU_HAVE_DANGEROUS_PLUGINS="There are plugins installed and enabled that could interfere with the Joomla upgrade and result in a failed upgrade that leaves the site inaccessible.<br><br>You are strongly advised to upgrade, disable or uninstall these plugins before upgrading."
COM_JOOMLAUPDATE_UPDATE_LOG_CLEANUP="Cleaning up after installation."
COM_JOOMLAUPDATE_UPDATE_LOG_COMPLETE="Update to version %s is complete."
; The following two strings are deprecated and will be removed with 4.0
COM_JOOMLAUPDATE_UPDATE_LOG_CONFIRM_FINALISE="The confirm for the finalise step has passed."
COM_JOOMLAUPDATE_UPDATE_LOG_CONFIRM_FINALISE_FAIL="The confirm of the finalise step has failed"
COM_JOOMLAUPDATE_UPDATE_LOG_DELETE_FILES="Deleting removed files and folders."
COM_JOOMLAUPDATE_UPDATE_LOG_FILE="File %s downloaded."
COM_JOOMLAUPDATE_UPDATE_LOG_FINALISE="Finalising installation."
COM_JOOMLAUPDATE_UPDATE_LOG_INSTALL="Starting installation of new version."
COM_JOOMLAUPDATE_UPDATE_LOG_START="Update started by user %2$s (%1$s). Old version is %3$s."
COM_JOOMLAUPDATE_UPDATE_LOG_URL="Downloading update file from %s."
COM_JOOMLAUPDATE_VIEW_COMPLETE_HEADING="Joomla Version Update Status"
COM_JOOMLAUPDATE_VIEW_COMPLETE_MESSAGE="Your site has been updated. Your Joomla version is now %s."
COM_JOOMLAUPDATE_VIEW_DEFAULT_ACTUAL="Actual"
COM_JOOMLAUPDATE_VIEW_DEFAULT_COMPATIBILITY_CHECK="Joomla! %s Compatibility Check"
COM_JOOMLAUPDATE_VIEW_DEFAULT_COMPATIBLE_UPDATE_WARNING="Extensions marked with <span class='label label-warning'>X.X.X</span> have an extension update available for the current version of Joomla which is not marked as compatible with the updated version of Joomla. You should contact the extension developer for more information."
COM_JOOMLAUPDATE_VIEW_DEFAULT_DATABASE_STRUCTURE_NOTICE="Go to 'Extensions - Manage - Database' and use the 'Fix' button."
COM_JOOMLAUPDATE_VIEW_DEFAULT_DATABASE_STRUCTURE_TITLE="Database Table Structure Up to Date"
COM_JOOMLAUPDATE_VIEW_DEFAULT_DESCRIPTION_BREAK="Extensions marked with <span class='label label-important'>No</span> or <span class='label'>Missing Compatibility Tag</span> might break your website. Please consult with the developer before upgrading."
COM_JOOMLAUPDATE_VIEW_DEFAULT_DESCRIPTION_MISSING_TAG="Extensions marked with <span class='label'>Missing Compatibility Tag</span> indicate the developer has not included <a href='https://docs.joomla.org/Special:MyLanguage/Deploying_an_Update_Server' target='_blank' rel='noopener noreferrer'>compatibility information.</a>"
COM_JOOMLAUPDATE_VIEW_DEFAULT_DESCRIPTION_UPDATE_REQUIRED="Extensions marked with <span class='label label-warning'>Yes (X.X.X)</span> might require an update."
COM_JOOMLAUPDATE_VIEW_DEFAULT_DIRECTIVE="Directive"
COM_JOOMLAUPDATE_VIEW_DEFAULT_DOWNLOAD_IN_PROGRESS="Downloading update file. Please wait ..."
COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_DIRECTORY="FTP Root"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXPLANATION_AND_LINK_TO_DOCS="The pre-update check provides you with information about the readiness of your server, settings and installed extensions for the update.<br>You can find more information about this page and how to prepare for updating Joomla in the <a class='pre-update-docs' href='https://docs.joomla.org/Pre-Update_Check' target='_blank' rel='noopener noreferrer'>pre-update check documentation</a>."
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_RUNNING_PRE_UPDATE_CHECKS="Running Pre-Update Checks"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_RUNNING_PRE_UPDATE_CHECKS_NOTES="Please be patient whilst we run the pre-update checks on your extensions."
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_PRE_UPDATE_CHECKS_FAILED="Pre-Update Checks Failed"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_PRE_UPDATE_CHECKS_FAILED_NOTES="It was not possible to check the compatibility of these plugins. The request to the update server either timed out or returned an error."
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_PROBABLY_COMPATIBLE="No Update Required"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_PROBABLY_COMPATIBLE_NOTES="<p>The extension developer states that the currently installed version is compatible.</p><p id='updateyellowwarning' class='hidden'>Please note that if you see a version highlighted as <span class='label label-warning'>X.X.X</span> then the extension developer is offering a newer version of the extension for your current version of Joomla than they do for the new version of Joomla. You should check with the extension developer if this is correct before you ugprade Joomla.</p>"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_REQUIRING_UPDATES_TO_BE_COMPATIBLE="Update Required"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_REQUIRING_UPDATES_TO_BE_COMPATIBLE_NOTES="<p>Please update these extensions before updating Joomla.</p><p id='updateorangewarning' class='hidden'>Please take extra care if this updated version of the extension is not also listed as compatible with your current version of Joomla.</p>"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_UPDATE_SERVER_OFFERS_NO_COMPATIBLE_VERSION="Update Information Unavailable"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_UPDATE_SERVER_OFFERS_NO_COMPATIBLE_VERSION_NOTES="Extension does not offer a compatible version for the selected target version of Joomla. This could mean the extension does not use the Joomla update system or the developer has not provided compatibility information for this Joomla version yet."
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_SHOW_LESS_COMPATIBILITY_INFORMATION="[ Less Detail %s ]"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_SHOW_MORE_COMPATIBILITY_INFORMATION="[ More Detail %s ]"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_COMPATIBLE="Compatible"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_COMPATIBLE_WITH_JOOMLA_VERSION="Joomla %s Compatible Version"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_INSTALLED_VERSION="Installed Version"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_NAME="Extension Name"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_TYPE="Extension Type"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_NO_COMPATIBILITY_INFORMATION="No Compatibility Information"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_WARNING_UNKNOWN="Unkown error"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_SERVER_ERROR="Update Server error"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS="Extensions Pre-Update Check"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_NONE="No extensions installed."
COM_JOOMLAUPDATE_VIEW_DEFAULT_NON_CORE_BACKEND_TEMPLATE_USED_NOTICE="We detected that you are not using a core admin template. You might find the upgrade process smoother if you <a href='index.php?option=com_templates&view=styles&client_id=1'>switch</a> to use the Isis template."
COM_JOOMLAUPDATE_VIEW_DEFAULT_NON_CORE_PLUGIN_BEING_CHECKED="The system is currently checking these plugins to see if they could cause problems during the upgrade.<br><br>Please be patient while the checks are completed."
COM_JOOMLAUPDATE_VIEW_DEFAULT_NON_CORE_PLUGIN_CONFIRMATION="Do you wish to ignore the warnings about potentially incompatible plugins and to proceed with the upgrade?"
COM_JOOMLAUPDATE_VIEW_DEFAULT_POTENTIALLY_DANGEROUS_PLUGIN="Potential Upgrade Issue"
COM_JOOMLAUPDATE_VIEW_DEFAULT_POTENTIALLY_DANGEROUS_PLUGIN_CONFIRM_MESSAGE="Are you sure you want to ignore the warnings about potentially incompatible plugins and proceed with the upgrade?"
COM_JOOMLAUPDATE_VIEW_DEFAULT_POTENTIALLY_DANGEROUS_PLUGIN_DESC="This extension includes a plugin that could cause the upgrade to fail.<br><br>To perform the Joomla upgrade safely you should either upgrade this extension to a version compatible with your target version of Joomla or disable the relevant plugin(s) and check again.<br><br>For more information about the relevant plugins please check the 'Live Update' tab."
COM_JOOMLAUPDATE_VIEW_DEFAULT_POTENTIALLY_DANGEROUS_PLUGIN_LIST="The following plugins could cause problems during the upgrade"
COM_JOOMLAUPDATE_VIEW_DEFAULT_HELP="More Information"
COM_JOOMLAUPDATE_VIEW_DEFAULT_DB_NOT_SUPPORTED="Your database type is not supported"
COM_JOOMLAUPDATE_VIEW_DEFAULT_DB_NOT_SUPPORTED_DESC="An update to Joomla %1$s was found, but your current database type is not supported by the new version.<br>For further details take a look at <a href="_QQ_"https://downloads.joomla.org/technical-requirements"_QQ_">the minimum requirements for Joomla %1$s</a>."
COM_JOOMLAUPDATE_VIEW_DEFAULT_PHP_VERSION_NOT_SUPPORTED="Your PHP version is not supported"
COM_JOOMLAUPDATE_VIEW_DEFAULT_PHP_VERSION_NOT_SUPPORTED_DESC="An update to Joomla %1$s was found, but your currently installed PHP version does not match <a href="_QQ_"https://downloads.joomla.org/technical-requirements"_QQ_">the minimum requirements for Joomla %1$s</a>."
COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_NOTICE="Warning"
COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_NOTICE_MESSAGE="The FTP method is not supported when you are upgrading to Joomla 4.0.0 or later."
COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_HOSTNAME="FTP Host"
COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_PASSWORD="FTP Password"
COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_PORT="FTP Port"
COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_USERNAME="FTP Username"
COM_JOOMLAUPDATE_VIEW_DEFAULT_INFOURL="Additional Information"
COM_JOOMLAUPDATE_VIEW_DEFAULT_INSTALLAGAIN="Reinstall Joomla core files"
COM_JOOMLAUPDATE_VIEW_DEFAULT_INSTALLED="Installed Joomla version"
COM_JOOMLAUPDATE_VIEW_DEFAULT_INSTALLUPDATE="Install the Update"
COM_JOOMLAUPDATE_VIEW_DEFAULT_INSTALL_SELF_UPDATE_FIRST="You must update to the latest version of the Joomla Update Component before you can update Joomla!"
COM_JOOMLAUPDATE_VIEW_DEFAULT_LATEST="Latest Joomla version"
COM_JOOMLAUPDATE_VIEW_DEFAULT_METHOD="Installation method"
COM_JOOMLAUPDATE_VIEW_DEFAULT_METHOD_DIRECT="Write files directly"
COM_JOOMLAUPDATE_VIEW_DEFAULT_METHOD_FTP="Write files using FTP"
COM_JOOMLAUPDATE_VIEW_DEFAULT_METHOD_HYBRID="Hybrid (use FTP only if needed)"
COM_JOOMLAUPDATE_VIEW_DEFAULT_NOUPDATES="No updates available."
COM_JOOMLAUPDATE_VIEW_DEFAULT_NOUPDATESNOTICE="You already have the latest Joomla version, %s."
COM_JOOMLAUPDATE_VIEW_DEFAULT_NO_DOWNLOAD_URL="Update unavailable"
COM_JOOMLAUPDATE_VIEW_DEFAULT_NO_DOWNLOAD_URL_DESC="An update to Joomla %1$s was found, but it wasn't possible to download that update. There are three possibilities why this happens:<br>- Your host doesn't support <a href="_QQ_"https://downloads.joomla.org/technical-requirements"_QQ_">the minimum requirements for Joomla %1$s</a> and there is no alternative download for your configuration available.<br>- The update to Joomla %1$s is not available for your stability level.<br>- There is a problem with the Joomla Update Server.<br><br>Please try to download the update package from <a href="_QQ_"https://downloads.joomla.org/latest"_QQ_">the official Joomla download page</a> and use the Upload and Update tab."
COM_JOOMLAUPDATE_VIEW_DEFAULT_NO_LIVE_UPDATE="A new version of the Joomla Update Component is available."
COM_JOOMLAUPDATE_VIEW_DEFAULT_NO_LIVE_UPDATE_DESC="You must update this first before you can update Joomla! <a class=\"alert-link\" href="_QQ_"index.php?option=com_installer&view=update"_QQ_">Click here to update the component</a>."
COM_JOOMLAUPDATE_VIEW_DEFAULT_PACKAGE="Update package URL"
COM_JOOMLAUPDATE_VIEW_DEFAULT_PACKAGE_REINSTALL="Reinstall package URL"
COM_JOOMLAUPDATE_VIEW_DEFAULT_PREUPDATE_CHECK="Pre-Update Check for Joomla %s"
COM_JOOMLAUPDATE_VIEW_DEFAULT_RECOMMENDED="Recommended"
COM_JOOMLAUPDATE_VIEW_DEFAULT_RECOMMENDED_SETTINGS_PASSED="Recommended PHP Settings : Passed"
COM_JOOMLAUPDATE_VIEW_DEFAULT_RECOMMENDED_SETTINGS_WARNING="Recommended PHP Settings : Warning"
COM_JOOMLAUPDATE_VIEW_DEFAULT_RECOMMENDED_SETTINGS_DESC="These settings are recommended for PHP in order to ensure full compatibility with Joomla. However, Joomla! will still operate if your settings do not quite match the recommended configuration."
COM_JOOMLAUPDATE_VIEW_DEFAULT_REQUIRED_SETTINGS_PASSED="Required PHP & Database Settings : Passed"
COM_JOOMLAUPDATE_VIEW_DEFAULT_REQUIRED_SETTINGS_WARNING="Required PHP & Database Settings : Warning"
COM_JOOMLAUPDATE_VIEW_DEFAULT_TAB_ONLINE="Live Update"
COM_JOOMLAUPDATE_VIEW_DEFAULT_TAB_PRE_UPDATE_CHECK="Pre-Update Check"
COM_JOOMLAUPDATE_VIEW_DEFAULT_TAB_UPLOAD="Upload & Update"
COM_JOOMLAUPDATE_VIEW_DEFAULT_UPDATEFOUND="A Joomla update was found."
COM_JOOMLAUPDATE_VIEW_DEFAULT_UPDATES_INFO_CUSTOM="You are on the &quot;%s&quot; update channel. This is not an official Joomla update channel."
COM_JOOMLAUPDATE_VIEW_DEFAULT_UPDATES_INFO_DEFAULT="You are on the &quot;%s&quot; update channel. Through this channel you'll receive notifications for all updates of the current Joomla release (3.x)"
COM_JOOMLAUPDATE_VIEW_DEFAULT_UPDATES_INFO_NEXT="You are on the &quot;%s&quot; update channel. Through this channel you'll receive notifications for all updates of the current Joomla release (3.x) and you will also be notified when the future major release (4.x) will be available. Before upgrading to 4.x you'll need to assess its compatibility with your environment."
COM_JOOMLAUPDATE_VIEW_DEFAULT_UPDATES_INFO_TESTING="You are on the &quot;%s&quot; update channel. This channel is designed for testing new releases and fixes in Joomla.<br />It is only intended for JBS (Joomla Bug Squad&trade;) members and others within the Joomla community who are testing. Do not use this setting on a production site."
COM_JOOMLAUPDATE_VIEW_DEFAULT_UPDATE_NOTICE="Before you update Joomla, ensure that the installed extensions are available for the new Joomla version. <br>You are strongly advised to make a <strong>backup</strong> of your site's files and database before you start updating."
COM_JOOMLAUPDATE_VIEW_DEFAULT_UPLOAD_INTRO="You can use this feature to update Joomla if your server is behind a firewall or otherwise unable to contact the update servers. First download the Joomla <em>Upgrade Package</em> in ZIP format from <a class=\"alert-link\" href=\"%s\">the official Joomla download page</a>. Then use the fields below to upload and install it."
COM_JOOMLAUPDATE_VIEW_PROGRESS="Update progress"
COM_JOOMLAUPDATE_VIEW_UPDATE_BYTESEXTRACTED="Bytes extracted"
COM_JOOMLAUPDATE_VIEW_UPDATE_BYTESREAD="Bytes read"
COM_JOOMLAUPDATE_VIEW_UPDATE_CHECKSUM_WRONG="File Checksum Failed"
COM_JOOMLAUPDATE_VIEW_UPDATE_DOWNLOADFAILED="Download of update package failed."
COM_JOOMLAUPDATE_VIEW_UPDATE_FILESEXTRACTED="Files extracted"
COM_JOOMLAUPDATE_VIEW_UPDATE_FINALISE_CONFIRM_AND_CONTINUE="Confirm & Continue"
COM_JOOMLAUPDATE_VIEW_UPDATE_FINALISE_HEAD="Joomla Update is finishing and cleaning up"
COM_JOOMLAUPDATE_VIEW_UPDATE_FINALISE_HEAD_DESC="To complete the update Process please confirm your identity by re-entering the login information for your site &quot;%s&quot; below."
COM_JOOMLAUPDATE_VIEW_UPDATE_INPROGRESS="Updating your Joomla files. Please wait ..."
COM_JOOMLAUPDATE_VIEW_UPDATE_PERCENT="Percent complete"
COM_JOOMLAUPDATE_VIEW_UPLOAD_CAPTIVE_INTRO_BODY="Make sure that the update file you have uploaded comes from the official Joomla download page. Afterwards, please confirm that you want to install it by re-entering the login information for your site &quot;%s&quot; below."
COM_JOOMLAUPDATE_VIEW_UPLOAD_CAPTIVE_INTRO_HEAD="Are you sure you want to install the file you uploaded?"
COM_JOOMLAUPDATE_VIEW_UPLOAD_PACKAGE_FILE="Joomla package file"
COM_JOOMLAUPDATE_XML_DESCRIPTION="Updates Joomla to the latest version with one click."

;Copy of INSTL constants (Pre-Update check)
INSTL_DATABASE_SUPPORT="Database Support:"
INSTL_DATABASE_SUPPORTED="Database Supported (%s)"
INSTL_DISPLAY_ERRORS="Display Errors"
INSTL_FILE_UPLOADS="File Uploads"
INSTL_JSON_SUPPORT_AVAILABLE="JSON Support"
INSTL_MAGIC_QUOTES_GPC="Magic Quotes GPC Off"
INSTL_MAGIC_QUOTES_RUNTIME="Magic Quotes Runtime"
INSTL_MB_LANGUAGE_IS_DEFAULT="MB Language is Default"
INSTL_MB_STRING_OVERLOAD_OFF="MB String Overload Off"
INSTL_NOTICEMBLANGNOTDEFAULT="PHP mbstring language is not set to neutral. This can be set locally by entering <strong>php_value mbstring.language neutral</strong> in your <code>.htaccess</code> file."
INSTL_NOTICEMBSTRINGOVERLOAD="PHP mbstring function overload is set. This can be turned off locally by entering <strong>php_value mbstring.func_overload 0</strong> in your <code>.htaccess</code> file."
INSTL_OUTPUT_BUFFERING="Output Buffering"
INSTL_PARSE_INI_FILE_AVAILABLE="INI Parser Support"
INSTL_PHP_VERSION_NEWER="PHP Version >= %s"
INSTL_REGISTER_GLOBALS="Register Globals Off"
INSTL_SAFE_MODE="Safe Mode"
INSTL_SESSION_AUTO_START="Session Auto Start"
INSTL_XML_SUPPORT="XML Support"
INSTL_ZIP_SUPPORT_AVAILABLE="Native ZIP support"
INSTL_ZLIB_COMPRESSION_SUPPORT="Zlib Compression Support"
language/en-GB/en-GB.plg_privacy_user.ini000060400000000702152453623440014167 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_PRIVACY_USER="Privacy - User Accounts"
PLG_PRIVACY_USER_ERROR_CANNOT_REMOVE_SUPER_USER="Cannot remove a super user account."
PLG_PRIVACY_USER_XML_DESCRIPTION="Responsible for processing privacy related requests for the core Joomla user data."
language/en-GB/en-GB.plg_quickicon_jcefilebrowser.ini000060400000000612152453623440016526 0ustar00; JCE Project
; Copyright (C) 2006 - 2012 Ryan Demmer. All rights reserved
; GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
; Note : All ini files need to be saved as UTF-8

PLG_QUICKICON_JCEFILEBROWSER="Quick Icon - JCE File Browser"
PLG_QUICKICON_JCEFILEBROWSER_XML_DESCRIPTION="Control Panel Quick Icon for the JCE File Browser"
WF_QUICKICON_BROWSER="JCE File Browser"language/en-GB/en-GB.com_wrapper.ini000060400000003220152453623440013126 0ustar00; Joomla! Project
; (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_WRAPPER="Wrapper"
COM_WRAPPER_FIELD_ADD_DESC="By default, http:// will be added unless it detects http:// or https:// in the URL you provide. This allows you to switch off this functionality."
COM_WRAPPER_FIELD_ADD_LABEL="Auto Add"
COM_WRAPPER_FIELD_FRAME_DESC="Show frame border which wrap the iframe."
COM_WRAPPER_FIELD_FRAME_LABEL="Frame Border"
COM_WRAPPER_FIELD_HEIGHT_DESC="Height of the iframe window in pixels."
COM_WRAPPER_FIELD_HEIGHT_LABEL="Height"
COM_WRAPPER_FIELD_HEIGHTAUTO_DESC="If height is set to auto, the height will automatically be set to the size of the external page. This will only work for pages on your own domain. If you see a JavaScript error, make sure this parameter is disabled. This will break XHTML compatibility for this page."
COM_WRAPPER_FIELD_HEIGHTAUTO_LABEL="Auto Height"
COM_WRAPPER_FIELD_LABEL_SCROLLBARSPARAMS="Scroll Bar Parameters"
COM_WRAPPER_FIELD_SCROLLBARS_DESC="Show or hide the horizontal &amp; vertical scrollbars. If you choose 'Auto', make sure the Auto advanced parameter is set."
COM_WRAPPER_FIELD_SCROLLBARS_LABEL="Scroll Bars"
COM_WRAPPER_FIELD_URL_DESC="URL to site/file you wish to display within the iframe."
COM_WRAPPER_FIELD_URL_LABEL="URL"
COM_WRAPPER_FIELD_VALUE_AUTO="Auto"
COM_WRAPPER_FIELD_WIDTH_DESC="Width of the iframe window. You may enter an absolute figure in pixels or a relative figure by adding a %."
COM_WRAPPER_XML_DESCRIPTION="Displays an iframe to wrap an external page or site into Joomla!"
language/en-GB/en-GB.mod_privacy_dashboard.sys.ini000060400000000624152453623440015755 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_PRIVACY_DASHBOARD="Privacy Dashboard"
MOD_PRIVACY_DASHBOARD_XML_DESCRIPTION="The Privacy Dashboard Module shows information about privacy requests."
MOD_PRIVACY_DASHBOARD_LAYOUT_DEFAULT="Default"

language/en-GB/en-GB.plg_editors-xtd_article.ini000060400000000655152453623440015434 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_ARTICLE_BUTTON_ARTICLE="Article"
PLG_ARTICLE_XML_DESCRIPTION="Displays a button to insert links to articles into an Article. Displays a popup allowing you to choose the article."
PLG_EDITORS-XTD_ARTICLE="Button - Article"
language/en-GB/en-GB.plg_user_profile.sys.ini000060400000000444152453623440014772 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_USER_PROFILE="User - Profile"
PLG_USER_PROFILE_XML_DESCRIPTION="User Profile Plugin"
language/en-GB/en-GB.plg_twofactorauth_yubikey.sys.ini000060400000001113152453623440016721 0ustar00; Joomla! Project
; (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_TWOFACTORAUTH_YUBIKEY="Two Factor Authentication - YubiKey"
PLG_TWOFACTORAUTH_YUBIKEY_XML_DESCRIPTION="Allows users on your site to use two factor authentication using a YubiKey secure hardware token. Users need their own Yubikey available from https://www.yubico.com/. To use two factor authentication users have to edit their user profile and enable two factor authentication."
language/en-GB/en-GB.plg_quickicon_joomlaupdate.sys.ini000060400000000621152453623440017022 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_QUICKICON_JOOMLAUPDATE="Quick Icon - Joomla! Update Notification"
PLG_QUICKICON_JOOMLAUPDATE_XML_DESCRIPTION="Checks for Joomla! updates and notifies you when you visit the Control Panel page."
language/en-GB/en-GB.mod_submenu.ini000060400000000501152453623440013124 0ustar00; Joomla! Project
; (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_SUBMENU="Administrator Sub-Menu"
MOD_SUBMENU_XML_DESCRIPTION="This module shows the Sub-Menu Navigation Module."

language/en-GB/en-GB.com_actionlogs.ini000060400000007405152453623440013621 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_ACTIONLOGS="User Actions Log"
COM_ACTIONLOGS_ACTION="Action"
COM_ACTIONLOGS_ACTION_ASC="Action ascending"
COM_ACTIONLOGS_ACTION_DESC="Action descending"
COM_ACTIONLOGS_ACTION_VIEWLOGS="View logs"
COM_ACTIONLOGS_ACTION_VIEWLOGS_DESC="Allows users in the group to view the logs."
COM_ACTIONLOGS_COMMA="Comma"
COM_ACTIONLOGS_CONFIGURATION="User Actions Log: Options"
COM_ACTIONLOGS_CSV_DELIMITER_DESC="Set the separator for values in the CSV export."
COM_ACTIONLOGS_CSV_DELIMITER_LABEL="CSV Delimiter"
COM_ACTIONLOGS_DATE="Date"
COM_ACTIONLOGS_DISABLED="Disabled"
COM_ACTIONLOGS_EMAIL_DESC="This is the latest action performed by a user on your website."
COM_ACTIONLOGS_EMAIL_SUBJECT="Latest User Actions"
COM_ACTIONLOGS_EXPORT_ALL_CSV="Export All as CSV"
COM_ACTIONLOGS_EXPORT_CSV="Export Selected as CSV"
COM_ACTIONLOGS_EXTENSION="Extension"
COM_ACTIONLOGS_EXTENSION_ASC="Extension ascending"
COM_ACTIONLOGS_EXTENSION_DESC="Extension descending"
COM_ACTIONLOGS_EXTENSION_FILTER_DESC="Search in the User Action logs by extension"
COM_ACTIONLOGS_ERROR_COULD_NOT_EXPORT_DATA="Could not export data."
COM_ACTIONLOGS_FILTER_SEARCH_DESC="Search in username. Prefix with ID: to search for an actionlog ID. Prefix with ITEM_ID: to search for an actionlog item ID."
COM_ACTIONLOGS_IP_ADDRESS="IP Address"
COM_ACTIONLOGS_IP_ADDRESS_ASC="IP Address ascending"
COM_ACTIONLOGS_IP_ADDRESS_DESC="IP Address descending"
COM_ACTIONLOGS_IP_INVALID="Invalid IP"
COM_ACTIONLOGS_IP_LOGGING_DESC="Enable logging the IP address of users."
COM_ACTIONLOGS_IP_LOGGING_LABEL="IP Logging"
COM_ACTIONLOGS_LOG_EXTENSIONS_DESC="Select events to be logged."
COM_ACTIONLOGS_LOG_EXTENSIONS_LABEL="Events To Log"
COM_ACTIONLOGS_MANAGER_USERLOGS="User Actions Log"
COM_ACTIONLOGS_N_ITEMS_DELETED="%s logs deleted."
COM_ACTIONLOGS_N_ITEMS_DELETED_1="%s log deleted."
COM_ACTIONLOGS_NAME="Name"
COM_ACTIONLOGS_NAME_ASC="Name ascending"
COM_ACTIONLOGS_NAME_DESC="Name descending"
COM_ACTIONLOGS_NO_ITEM_SELECTED="Please first make a selection from the list."
COM_ACTIONLOGS_NO_LOGS_TO_EXPORT="There are no User Action logs to export."
COM_ACTIONLOGS_OPTION_FILTER_DATE="- Select Date -"
COM_ACTIONLOGS_OPTION_RANGE_NEVER="Never"
COM_ACTIONLOGS_OPTION_RANGE_PAST_1MONTH="In the last month"
COM_ACTIONLOGS_OPTION_RANGE_PAST_3MONTH="In the last 3 months"
COM_ACTIONLOGS_OPTION_RANGE_PAST_6MONTH="In the last 6 months"
COM_ACTIONLOGS_OPTION_RANGE_PAST_WEEK="In the last week"
COM_ACTIONLOGS_OPTION_RANGE_PAST_YEAR="In the last year"
COM_ACTIONLOGS_OPTION_RANGE_POST_YEAR="More than a year ago"
COM_ACTIONLOGS_OPTION_RANGE_TODAY="Today"
COM_ACTIONLOGS_OPTIONS="Options"
COM_ACTIONLOGS_POSTINSTALL_BODY="<p>With the release of Joomla 3.9.0 you can now log all administrative actions performed by your users in supported extensions. It is now easy to see who did what and when they did it.</p><p>The logs can be reviewed in Joomla or exported for external use.</p><p>For further information on this new feature read the <a href='https://docs.joomla.org/J3.x:User_Action_Logs' target='_new'>User Action Logs documentation.</a></p>"
COM_ACTIONLOGS_POSTINSTALL_TITLE="User Actions Can Now Be Logged"
COM_ACTIONLOGS_PURGE_CONFIRM="Are you sure want to delete all User Action logs?"
COM_ACTIONLOGS_PURGE_FAIL="Failed to delete all User Action logs."
COM_ACTIONLOGS_PURGE_SUCCESS="All User Action logs have been deleted."
COM_ACTIONLOGS_SELECT_EXTENSION="- Select Extension -"
COM_ACTIONLOGS_SELECT_USER="- Select User -"
COM_ACTIONLOGS_SEMICOLON="Semicolon"
COM_ACTIONLOGS_TOOLBAR_PURGE="Purge"
COM_ACTIONLOGS_XML_DESCRIPTION="Displays a log of actions performed by users on your website."
language/en-GB/en-GB.plg_finder_content.ini000060400000001177152453623440014464 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FINDER_CONTENT="Smart Search - Content"
PLG_FINDER_CONTENT_XML_DESCRIPTION="Updates the indexes of Joomla! Articles whenever an article is created, modified or deleted. NOTE the Content - Smart Search plugin must be enabled."

PLG_FINDER_QUERY_FILTER_BRANCH_P_ARTICLE="Articles"
PLG_FINDER_QUERY_FILTER_BRANCH_P_AUTHOR="Authors"

PLG_FINDER_QUERY_FILTER_BRANCH_S_ARTICLE="Article"
PLG_FINDER_QUERY_FILTER_BRANCH_S_AUTHOR="Author"


language/en-GB/en-GB.com_modules.ini000060400000026707152453623440013135 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_MODULES="Modules"
COM_MODULES_ACTION_EDITFRONTEND="Frontend Editing"
COM_MODULES_ACTION_EDITFRONTEND_COMPONENT_DESC="Allows users in the group to edit in Frontend."
COM_MODULES_ADMIN_LANG_FILTER_FIELDSET_LABEL="Administrator Modules"
COM_MODULES_ADMIN_LANG_FILTER_DESC="Allows filtering administrator modules per administrator language."
COM_MODULES_ADMIN_LANG_FILTER_LABEL="Language Filtering"
COM_MODULES_ADVANCED_FIELDSET_LABEL="Advanced"
COM_MODULES_ASSIGNED_VARIES_EXCEPT="All except selected"
COM_MODULES_ASSIGNED_VARIES_ONLY="Selected"
COM_MODULES_BASIC_FIELDSET_LABEL="Options"
COM_MODULES_BATCH_POSITION_LABEL="Set Position"
COM_MODULES_BATCH_POSITION_NOCHANGE="Keep original Position"
COM_MODULES_BATCH_POSITION_NOPOSITION="No Module Position"
COM_MODULES_BATCH_OPTIONS="Batch process the selected modules"
COM_MODULES_BATCH_TIP="If choosing to copy a module, any other actions selected will be applied to the copied module. Otherwise, all actions are applied to the selected module. When copying and not changing position, it is nevertheless necessary to select 'Keep Original Position' in the dropdown."
COM_MODULES_CHANGE_POSITION_BUTTON="Select"
COM_MODULES_CHANGE_POSITION_TITLE="Change"
COM_MODULES_CONFIGURATION="Module: Options"
COM_MODULES_CUSTOM_OUTPUT="Custom Output"
COM_MODULES_ERR_XML="Module XML data not available"
COM_MODULES_ERROR_CANNOT_FIND_MODULE="Can't find module"
COM_MODULES_ERROR_CANNOT_GET_MODULE="Can't get module"
COM_MODULES_ERROR_INVALID_EXTENSION="Invalid module"
COM_MODULES_ERROR_NO_MODULES_SELECTED="No module selected."
COM_MODULES_EXTENSION_PUBLISHED_DISABLED="Module disabled and published."
COM_MODULES_EXTENSION_PUBLISHED_ENABLED="Module enabled and published."
COM_MODULES_EXTENSION_UNPUBLISHED_DISABLED="Module disabled and unpublished."
COM_MODULES_EXTENSION_UNPUBLISHED_ENABLED="Module enabled and unpublished."
COM_MODULES_EXTRA_STYLE_DESC="Specify the style for the module or the modules in the position selected."
COM_MODULES_EXTRA_STYLE_TITLE="Module(s) style"
COM_MODULES_FIELD_AUTOMATIC_TITLE_LABEL="Automatic Title"
COM_MODULES_FIELD_AUTOMATIC_TITLE_DESC="Set yes if you want an automatic translated title. Its use depends on the Administrator template."
COM_MODULES_FIELD_CACHE_TIME_DESC="The time in seconds before the module is recached."
COM_MODULES_FIELD_CACHE_TIME_LABEL="Cache Time"
COM_MODULES_FIELD_CACHING_DESC="Use the global cache setting to cache the content of this module or disable caching for this module."
COM_MODULES_FIELD_CACHING_LABEL="Caching"
COM_MODULES_FIELD_CLIENT_ID_DESC="The location of the module, Frontend or Backend. You can't change this value."
COM_MODULES_FIELD_CLIENT_ID_LABEL="Module Location"
COM_MODULES_FIELD_CONTENT_DESC="Text"
COM_MODULES_FIELD_CONTENT_LABEL="Text"
COM_MODULES_FIELD_CONTENT_TOO_LARGE="The content exceeds allowed limits"
COM_MODULES_FIELD_MODULE_DESC="Module type."
COM_MODULES_FIELD_MODULE_LABEL="Module Type"
COM_MODULES_FIELD_MODULECLASS_SFX_DESC="A suffix to be applied to the CSS class of the module. This allows for individual module styling."
COM_MODULES_FIELD_MODULECLASS_SFX_LABEL="Module Class Suffix"
COM_MODULES_FIELD_NOTE_DESC="An optional note to display in the Module Manager."
COM_MODULES_FIELD_NOTE_LABEL="Note"
COM_MODULES_FIELD_POSITION_DESC="You may select a module position from the list of pre-defined positions or enter your own module position by typing the name in the field and pressing enter."
COM_MODULES_FIELD_POSITION_LABEL="Position"
COM_MODULES_FIELD_PUBLISH_DOWN_DESC="An optional date to Finish Publishing the module."
COM_MODULES_FIELD_PUBLISH_DOWN_LABEL="Finish Publishing"
COM_MODULES_FIELD_PUBLISH_UP_DESC="An optional date to Start Publishing the module."
COM_MODULES_FIELD_PUBLISH_UP_LABEL="Start Publishing"
COM_MODULES_FIELD_PUBLISHED_DESC="If published, this module will display on your site Frontend or Backend depending on the module."
COM_MODULES_FIELD_SHOWTITLE_DESC="Show or hide module title on display. Effect will depend on the chrome style in the template."
COM_MODULES_FIELD_SHOWTITLE_LABEL="Show Title"
COM_MODULES_FIELD_TITLE_DESC="Module must have a title."
COM_MODULES_FIELD_VALUE_NOCACHING="No caching"
COM_MODULES_FIELD_MODULE_TAG_LABEL="Module Tag"
COM_MODULES_FIELD_MODULE_TAG_DESC="The HTML tag for module."
COM_MODULES_FIELD_BOOTSTRAP_SIZE_LABEL="Bootstrap Size"
COM_MODULES_FIELD_BOOTSTRAP_SIZE_DESC="An option to specify how many columns the module will use."
COM_MODULES_FIELD_HEADER_TAG_LABEL="Header Tag"
COM_MODULES_FIELD_HEADER_TAG_DESC="The HTML tag for module header/title."
COM_MODULES_FIELD_HEADER_CLASS_LABEL="Header Class"
COM_MODULES_FIELD_HEADER_CLASS_DESC="The CSS class for module header/title."
COM_MODULES_FIELD_MODULE_STYLE_LABEL="Module Style"
COM_MODULES_FIELD_MODULE_STYLE_DESC="Use this option to override the template style for its position."
COM_MODULES_FIELDSET_RULES="Permissions"
COM_MODULES_FILTER_SEARCH_DESC="Filter by position name."
COM_MODULES_GENERAL_FIELDSET_DESC="Configure module edit interface settings."
COM_MODULES_HEADING_MODULE="Type"
COM_MODULES_HEADING_MODULE_ASC="Type ascending"
COM_MODULES_HEADING_MODULE_DESC="Type descending"
COM_MODULES_HEADING_PAGES="Pages"
COM_MODULES_HEADING_PAGES_ASC="Pages ascending"
COM_MODULES_HEADING_PAGES_DESC="Pages descending"
COM_MODULES_HEADING_POSITION="Position"
COM_MODULES_HEADING_POSITION_ASC="Position ascending"
COM_MODULES_HEADING_POSITION_DESC="Position descending"
COM_MODULES_HEADING_TEMPLATES="Templates"
COM_MODULES_HTML_PUBLISH_DISABLED="Publish module::Extension disabled"
COM_MODULES_HTML_PUBLISH_ENABLED="Publish module::Extension enabled"
COM_MODULES_HTML_UNPUBLISH_DISABLED="Unpublish module::Extension disabled"
COM_MODULES_HTML_UNPUBLISH_ENABLED="Unpublish module::Extension enabled"
COM_MODULES_MANAGER_MODULE="Modules: %s"
COM_MODULES_MANAGER_MODULE_ADD="Modules: Add New Module"
COM_MODULES_MANAGER_MODULE_EDIT="Modules: Edit Module"
COM_MODULES_MANAGER_MODULES="Modules"
COM_MODULES_MANAGER_MODULES_ADMIN="Modules (Administrator)"
COM_MODULES_MANAGER_MODULES_SITE="Modules (Site)"
COM_MODULES_MENU_ASSIGNMENT="Menu Assignment"
COM_MODULES_MENU_ITEM_SEPARATOR="Separator"
COM_MODULES_MENU_ITEM_HEADING="Heading"
COM_MODULES_MENU_ITEM_ALIAS="Alias"
COM_MODULES_MENU_ITEM_URL="URL"
COM_MODULES_MODULE_ASSIGN="Module Assignment"
COM_MODULES_MODULE="Module"
COM_MODULES_MODULE_DESCRIPTION="Module Description"
COM_MODULES_MODULE_TEMPLATE_POSITION="%1$s (%2$s)"
COM_MODULES_MODULES="Modules"
COM_MODULES_MODULES_FILTER_SEARCH_DESC="Search in module title and note. Prefix with ID: to search for a module ID."
COM_MODULES_MODULES_FILTER_SEARCH_LABEL="Search Modules"
COM_MODULES_MSG_MANAGE_NO_MODULES="There are no modules matching your query"
COM_MODULES_MSG_MANAGE_EXTENSION_DISABLED="This module is disabled. Use Extensions => Manage to enable it."
COM_MODULES_N_ITEMS_ARCHIVED="%d modules archived."
COM_MODULES_N_ITEMS_ARCHIVED_1="%d module archived."
COM_MODULES_N_ITEMS_CHECKED_IN_0="No module checked in."
COM_MODULES_N_ITEMS_CHECKED_IN_1="%d module checked in."
COM_MODULES_N_ITEMS_CHECKED_IN_MORE="%d modules checked in."
COM_MODULES_N_ITEMS_DELETED="%d modules deleted."
COM_MODULES_N_ITEMS_DELETED_1="%d module deleted."
COM_MODULES_N_ITEMS_PUBLISHED="%d modules published."
COM_MODULES_N_ITEMS_PUBLISHED_1="%d module published."
COM_MODULES_N_ITEMS_TRASHED="%d modules trashed."
COM_MODULES_N_ITEMS_TRASHED_1="%d module trashed."
COM_MODULES_N_ITEMS_UNPUBLISHED="%d modules unpublished."
COM_MODULES_N_ITEMS_UNPUBLISHED_1="%d module unpublished."
COM_MODULES_N_MODULES_DUPLICATED="%d modules duplicated."
COM_MODULES_N_MODULES_DUPLICATED_1="%d module duplicated."
COM_MODULES_NO_ITEM_SELECTED="No modules selected."
COM_MODULES_NODESCRIPTION="No description available."
COM_MODULES_NONE=":: None ::"
COM_MODULES_OPTION_MENU_ALL="On all pages"
COM_MODULES_OPTION_MENU_EXCLUDE="On all pages except those selected"
COM_MODULES_OPTION_MENU_INCLUDE="Only on the pages selected"
COM_MODULES_OPTION_MENU_NONE="No pages"
COM_MODULES_OPTION_ORDER_POSITION="%d. %s"
COM_MODULES_OPTION_POSITION_TEMPLATE_DEFINED="Template"
COM_MODULES_OPTION_POSITION_USER_DEFINED="User"
COM_MODULES_OPTION_SELECT_CLIENT="- Select Type -"
COM_MODULES_OPTION_SELECT_MENU_ITEM="- Select Menu Item -"
COM_MODULES_OPTION_SELECT_MODULE="- Select Type -"
; Deprecated 4.0
COM_MODULES_OPTION_SELECT_PAGE="- Select Page -"
COM_MODULES_OPTION_SELECT_POSITION="- Select Position -"
COM_MODULES_OPTION_SELECT_TYPE="- Select type -"
COM_MODULES_POSITION_ANALYTICS="Analytics"
COM_MODULES_POSITION_BANNER="Banner"
COM_MODULES_POSITION_BOTTOM="Bottom"
COM_MODULES_POSITION_BREADCRUMB="Breadcrumb"
COM_MODULES_POSITION_BREADCRUMBS="Breadcrumbs"
COM_MODULES_POSITION_DEBUG="Debug"
COM_MODULES_POSITION_FOOTER="Footer"
COM_MODULES_POSITION_HEADER="Header"
COM_MODULES_POSITION_LEFT2="Left 2"
COM_MODULES_POSITION_LEFT="Left"
COM_MODULES_POSITION_MAINNAV="Main Navigation"
COM_MODULES_POSITION_NAV="Navigation"
COM_MODULES_POSITION_OFFLINE="Offline"
COM_MODULES_POSITION_POSITION-0="Position 0"
COM_MODULES_POSITION_POSITION-10="Position 10"
COM_MODULES_POSITION_POSITION-11="Position 11"
COM_MODULES_POSITION_POSITION-12="Position 12"
COM_MODULES_POSITION_POSITION-13="Position 13"
COM_MODULES_POSITION_POSITION-14="Position 14"
COM_MODULES_POSITION_POSITION-15="Position 15"
COM_MODULES_POSITION_POSITION-1="Position 1"
COM_MODULES_POSITION_POSITION-2="Position 2"
COM_MODULES_POSITION_POSITION-3="Position 3"
COM_MODULES_POSITION_POSITION-4="Position 4"
COM_MODULES_POSITION_POSITION-5="Position 5"
COM_MODULES_POSITION_POSITION-6="Position 6"
COM_MODULES_POSITION_POSITION-7="Position 7"
COM_MODULES_POSITION_POSITION-8="Position 8"
COM_MODULES_POSITION_POSITION-9="Position 9"
COM_MODULES_POSITION_RIGHT2="Right 2"
COM_MODULES_POSITION_RIGHT="Right"
COM_MODULES_POSITION_SUB1="Sub 1"
COM_MODULES_POSITION_SUB2="Sub 2"
COM_MODULES_POSITION_SUB3="Sub 3"
COM_MODULES_POSITION_SUB4="Sub 4"
COM_MODULES_POSITION_SUB5="Sub 5"
COM_MODULES_POSITION_SUB6="Sub 6"
COM_MODULES_POSITION_SUB="Sub"
COM_MODULES_POSITION_SUBNAV="Sub Navigation"
COM_MODULES_POSITION_SYNDICATE="Syndicate"
COM_MODULES_POSITION_TOP2="Top 2"
COM_MODULES_POSITION_TOP3="Top 3"
COM_MODULES_POSITION_TOP4="Top 4"
COM_MODULES_POSITION_TOP="Top"
COM_MODULES_POSITION_USER1="User 1"
COM_MODULES_POSITION_USER2="User 2"
COM_MODULES_POSITION_USER3="User 3"
COM_MODULES_POSITION_USER4="User 4"
COM_MODULES_POSITION_USER5="User 5"
COM_MODULES_POSITION_USER6="User 6"
COM_MODULES_POSITION_USER7="User 7"
COM_MODULES_POSITION_USER8="User 8"
COM_MODULES_SAVE_SUCCESS="Module saved"
COM_MODULES_TYPE_CHOOSE="Select a Module Type:"
COM_MODULES_XML_DESCRIPTION="Component for module management in Backend"
COM_MODULES_ADD_CUSTOM_POSITION="Add custom position"
COM_MODULES_CUSTOM_POSITION="Active Positions"
COM_MODULES_TYPE_OR_SELECT_POSITION="Type or Select a Position"
COM_MODULES_DESELECT="Deselect"
COM_MODULES_EXPAND="Expand"
COM_MODULES_COLLAPSE="Collapse"
COM_MODULES_SUBITEMS="Sub-items:"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_MODULES="Changes apply to this component only.<br /><em><strong>Inherited</strong></em> - a Global Configuration setting or higher level setting is applied.<br /><em><strong>Denied</strong></em> always wins - whatever is set at the Global or higher level and applies to all child elements.<br /><em><strong>Allowed</strong></em> will enable the action for this component unless overruled by a Global Configuration setting."
language/en-GB/en-GB.plg_system_fmalertcookies.sys.ini000060400000011342152453623440016706 0ustar00PLG_SYSTEM_FMALERTCOOKIES="Folcomedia - Plugin use cookies alert" 
PLG_SYSTEM_FMALERTCOOKIES_XML_DESCRIPTION = "Folcomedia - Plugin use cookies alert<br/><br/>
<b style='color:red'>The fields will appear when the plugin is enabled and saved.</b><br/><br/>
You can add your own CSS rules from editing the file <b style='color:black'>custom.css</b> by going through an FTP program in <b style='color:black'>plugins/system/fmalertcookies/assets/css/custom.css</b><br/><br/>
This plugin is designed to display a message on the home page of your site to alert the user that your site uses cookies to collect other information.
<br/><br/>
<a class='btn btn-default' href=\"index.php?option=com_plugins&view=plugins&filter_search=folcomedia\">Configuration</a><br/><br/>
**** V 1.3.5 ****<br/>
- Fixed a problem with the version of PHP 7.2<br/>
- Added German language (Thomas Sommer).<br/><br/>
**** V 1.3.2 ****<br/>
- Improved SEO preventing spam search engines to index the cookie alert.<br/><br/>
**** V 1.3.1 ****<br/>
- Corrections de bugs.<br/>
- Visual enhancements language tabs.<br/><br/>
**** V 1.3.0 ****<br/>
- The plugin can now block all cookies until the message was not accepted.<br/><br/>
**** V 1.2.15 ****<br/>
- Fixed a problem when SEO the alert was at the top of your page.<br/>
- Possibility to show or not the message when your site is down for maintenance.<br/>
- Added CSS tag to allow you to change the message as you wish.<br/><br/>
**** V 1.2.14 ****<br/>
- Adding a donation button to support the project.<br/>
- Added Hungarian language (Thanks to Zoltan Balazs).<br/>
- Correction W3C.<br/><br/>
**** V 1.2.12 + 1.2.13 ****<br/>
- Plugin Optimization.<br/><br/>
**** V 1.2.11 ****<br/>
- Removing the Bootstrap framework<br/>
- Optimization plugin for compatibility with sites.<br/><br/>
**** V 1.2.10 ****<br/>
- Improves compatibility with other extensions.<br/><br/>
**** V 1.2.9 ****<br/>
- Fixed a erro with W3C.<br/>
- Fixed a bug when importing the file on certain sites.<br/>
- Fixed a bug with lifetime of cookies.<br/><br/>
**** V 1.2.8 ****<br/>
- Fixed a bug with sites which use multiple templates.<br/><br/>
**** V 1.2.7 ****<br/>
- Improved SEO.<br/>
- Improved display of the plugin on mobile.<br/>
- Fixed a problem of alert display pop-up mode on mobile.<br/>
- Added a warning message when your default language of your site is not instantiated in content languages.<br/><br/>
**** V 1.2.6 ****<br/>
- Added a FAQ and Documentation link in the support tab.<br/>
- Various optimizations.<br/><br/>
**** V 1.2.5 ****<br/>
- The warning message does not appear when your site is offline.<br/>
- You can now not charge the Bootsrap library.<br/><br/>
**** V 1.2.4 ****<br/>
- Fixed a bug in pop-up mode.<br/><br/>
**** V 1.2.3 ****<br/>
- Implementation of verifying the presence of a cookie plugin javascript to display or not the message.<br/><br/>
**** V 1.2.2 ****<br/>
- Fixed bug for displaying pop-up.<br/><br/>
**** V 1.2.1 ****<br/>
- Ability to choose the life of the cookie.<br/>
- Ability to choose the background color of the buttons.<br/>
- Fixed the plugin on multi-path sites.<br/><br/> 
**** V 1.2.0 ****<br/>
- Added option to transparency of the alert message.<br/>
- You can Show / Hide the alert based languages.<br/>
- You can now Export and Import your setup.<br/><br/>
**** V 1.1.8 ****<br/>
- You can choose to display the alert message on the page explaining the use of cookies.<br/><br/>
**** V 1.1.7 ****<br/>
- Resolution bugs with CSS rules.<br/>
- Choosing the bootstrap version.<br/><br/>
**** V 1.1.6 ****<br/>
- Fixed z-index parameter to display the message above your site.<br/>
- Added a custom.css file to add your own CSS rules.<br/><br/>
**** V 1.1.5 ****<br/>
- Set margins around the message.<br/>
- Setting the position of the content.<br/><br/>
**** V 1.1.4 ****<br/>
- Ability to set the warning message on the screen.<br/>
- It is now possible to set the size of the alert message in pixels or percentage.<br/>
- Selection in the order of the buttons.<br/>
- Ability to display buttons line or following text.<br/><br/>
**** V 1.1.3 ****<br/>
- Added multilanguage. <br/><br/>
**** V 1.1.2 ****<br/>
- Improving the timeliness.<br/>
- Fixed bugs.
<br/><br/><br/><br/>"

PLG_SYSTEM_FMALERTCOOKIES_MESSAGE_ALERTE_LANGUE_DEFAUT_NON_PRESENTE = "<br/><br/>Attention  !!! <br/><br/>We have detected that your site uses the default language \"%1$s\".<br/><br/>
However, this language is not listed in the content languages.<br/><br/>
To show the alert message in this language, please add it by navigating to:<br/><br/>
<i>Extensions > Language Manager > Content > New </i><br/><br/>
 Or click on the link <a target=\"_blank\" href=\"%2$sadministrator/index.php?option=com_languages&view=languages\">Install a content language</a> and then on \"New\"."
language/en-GB/en-GB.mod_sampledata.ini000060400000001166152453623440013571 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_SAMPLEDATA="Sample Data"
MOD_SAMPLEDATA_CONFIRM_START="Proceeding will install a sample data set into your Joomla website. This process can't be reverted once done."
MOD_SAMPLEDATA_INVALID_RESPONSE="There is an error in a sample data plugin. Response is invalid."
MOD_SAMPLEDATA_ITEM_ALREADY_PROCESSED="This sample data set is already installed."
MOD_SAMPLEDATA_XML_DESCRIPTION="This Module allows to install sample data."
language/en-GB/en-GB.plg_system_weblinks.sys.ini000060400000000570152453623440015516 0ustar00; Joomla! Project
; Copyright (C) 2005 - 2020 Open Source Matters. All rights reserved.
; License GNU General Public License version 2 or later; see LICENSE.txt, see LICENSE.php
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_WEBLINKS="System - Web Links"
PLG_SYSTEM_WEBLINKS_XML_DESCRIPTION="This plugin returns statistical information about Joomla! Web Links."
language/en-GB/en-GB.plg_twofactorauth_yubikey.ini000060400000005133152453623440016112 0ustar00; Joomla! Project
; (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_TWOFACTORAUTH_YUBIKEY="Two Factor Authentication - YubiKey"

PLG_TWOFACTORAUTH_YUBIKEY_ERR_VALIDATIONFAILED="You did not enter a valid YubiKey secret code or the YubiCloud servers are unreachable at this time."
PLG_TWOFACTORAUTH_YUBIKEY_INTRO="This feature allows you to use a YubiKey secure hardware token for two factor authentication. In addition to your username and password you will also need to insert your YubiKey into your computer's USB port, select inside the Secret Key area of the site's login area and touch YubiKey's gold disk. The secret code generated by your YubiKey is unique to your device and changes constantly. This provides extra protection against hackers logging in to your account even if they were able to get hold of your password."
PLG_TWOFACTORAUTH_YUBIKEY_METHOD_TITLE="YubiKey"
PLG_TWOFACTORAUTH_TOTP_RESET_HEAD="Your YubiKey is already linked to your user account."
PLG_TWOFACTORAUTH_TOTP_RESET_TEXT="Your YubiKey is already linked to your user account. If you want to unlink your YubiKey from your user account or use another YubiKey, please first disable two factor authentication and save your user profile. Then come back to this user profile page and re-activate two factor authentication with the YubiKey method."
PLG_TWOFACTORAUTH_YUBIKEY_SECTION_ADMIN="Administrator (Backend)"
PLG_TWOFACTORAUTH_YUBIKEY_SECTION_BOTH="Both"
PLG_TWOFACTORAUTH_YUBIKEY_SECTION_DESC="In which sections of your site do you want to enable two factor authentication?"
PLG_TWOFACTORAUTH_YUBIKEY_SECTION_LABEL="Site Section"
PLG_TWOFACTORAUTH_YUBIKEY_SECTION_SITE="Site (Frontend)"
PLG_TWOFACTORAUTH_YUBIKEY_SECURITYCODE="Security Code"
PLG_TWOFACTORAUTH_YUBIKEY_STEP1_HEAD="Set up"
PLG_TWOFACTORAUTH_YUBIKEY_STEP1_TEXT="Please insert your YubiKey device into your computer's USB port. Select the Security Code field below. Then touch the gold disk on your YubiKey device for one second. Afterwards, please save your user profile. If the code generated by your YubiKey is validated by YubiCloud the Two Factor Authentication feature will be enabled and this YubiKey will be linked with your user account."
PLG_TWOFACTORAUTH_YUBIKEY_XML_DESCRIPTION="Allows users on your site to use two factor authentication using a YubiKey secure hardware token. Users need their own Yubikey available from https://www.yubico.com/. To use two factor authentication users have to edit their user profile and enable two factor authentication."

language/en-GB/en-GB.plg_content_fields.sys.ini000060400000000673152453623440015300 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CONTENT_FIELDS="Content - Fields"
PLG_CONTENT_FIELDS_XML_DESCRIPTION="This plugin allows you to display a custom field which has been inserted with the 'Button - Fields' plugin or using Syntax: {field #} directly into the editor area."
language/en-GB/en-GB.plg_authentication_cookie.sys.ini000060400000001022152453623440016635 0ustar00; Joomla! Project
; (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_AUTH_COOKIE_XML_DESCRIPTION="Handles Joomla's cookie User authentication.<br /><strong> Warning! You must have at least one other authentication plugin enabled.</strong><br />You will also need a plugin such as the System - Remember Me plugin to implement cookie login."
PLG_AUTHENTICATION_COOKIE="Authentication - Cookie"
language/en-GB/en-GB.com_admin.sys.ini000060400000001176152453623440013363 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_ADMIN="System Information"
COM_ADMIN_XML_DESCRIPTION="Administration system information component."

COM_ADMIN_HELP_VIEW_DEFAULT_DESC="Get help on various pages in your Joomla administrator interface."
COM_ADMIN_HELP_VIEW_DEFAULT_TITLE="Joomla! Help"
COM_ADMIN_SYSINFO_VIEW_DEFAULT_DESC="View detailed information about your Joomla site and server configuration settings."
COM_ADMIN_SYSINFO_VIEW_DEFAULT_TITLE="System Information"
language/en-GB/en-GB.plg_fields_image.sys.ini000060400000000574152453623440014710 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_IMAGE="Fields - Image"
PLG_FIELDS_IMAGE_XML_DESCRIPTION="This plugin lets you create new fields of type 'image' in any extensions where custom fields are supported."
language/en-GB/en-GB.plg_content_finder.ini000060400000001326152453623440014460 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CONTENT_FINDER="Content - Smart Search"
PLG_CONTENT_FINDER_XML_DESCRIPTION="Changes to content will not update the Smart Search index if you do not enable this plugin."

PLG_FINDER_QUERY_FILTER_BRANCH_P__="All"

PLG_FINDER_QUERY_FILTER_BRANCH_S_TYPE="Type"
PLG_FINDER_QUERY_FILTER_BRANCH_S_LANGUAGE="Language"
PLG_FINDER_QUERY_FILTER_BRANCH_S_CATEGORY="Category"

PLG_FINDER_QUERY_FILTER_BRANCH_P_TYPE="Types"
PLG_FINDER_QUERY_FILTER_BRANCH_P_LANGUAGE="Languages"
PLG_FINDER_QUERY_FILTER_BRANCH_P_CATEGORY="Categories"
language/en-GB/en-GB.plg_fields_checkboxes.ini000060400000001265152453623440015125 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_CHECKBOXES="Fields - Checkboxes"
PLG_FIELDS_CHECKBOXES_LABEL="Checkboxes (%s)"
PLG_FIELDS_CHECKBOXES_PARAMS_OPTIONS_DESC="The values of the checkboxes."
PLG_FIELDS_CHECKBOXES_PARAMS_OPTIONS_LABEL="Checkbox Values"
PLG_FIELDS_CHECKBOXES_PARAMS_OPTIONS_VALUE_LABEL="Value"
PLG_FIELDS_CHECKBOXES_PARAMS_OPTIONS_NAME_LABEL="Text"
PLG_FIELDS_CHECKBOXES_XML_DESCRIPTION="This plugin lets you create new fields of type 'checkboxes' in any extensions where custom fields are supported."
language/en-GB/en-GB.plg_system_akversioncheck.sys.ini000060400000000452152453623440016676 0ustar00PLG_SYSTEM_AKVERSIONCHECK="System - Akeeba extensions version check"
PLG_SYSTEM_AKVERSIONCHECK_XML_DESCRIPTION="Allows Joomla Update to report the correct compatibility of Akeeba Ltd's extensions with Joomla 4. This plugin can not be disabled except after upgrading your site to Joomla 4 or later."language/en-GB/en-GB.com_cpanel.ini000060400000022354152453623440012721 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_CPANEL="Control Panel"
COM_CPANEL_HEADER_SUBMENU="Submenu"
COM_CPANEL_HEADER_SYSTEM="System"
COM_CPANEL_LINK_CHECKIN="Global Check-in"
COM_CPANEL_LINK_CLEAR_CACHE="Clear Cache"
COM_CPANEL_LINK_DASHBOARD="Dashboard"
COM_CPANEL_LINK_EXTENSIONS="Install Extensions"
COM_CPANEL_LINK_GLOBAL_CONFIG="Global Configuration"
COM_CPANEL_LINK_SYSINFO="System Information"
COM_CPANEL_MESSAGES_BODY_NOCLOSE="There are important post-installation messages that require your attention."
COM_CPANEL_MESSAGES_BODYMORE_NOCLOSE="This information area won't appear when you have hidden all the messages."
COM_CPANEL_MESSAGES_REVIEW="Read Messages"
COM_CPANEL_MESSAGES_TITLE="You have post-installation messages"
; Translators: Don't touch the code part in the following message, Starting with ## Mod rewrite ...
COM_CPANEL_MSG_ADDNOSNIFF_BODY="<p>Joomla is now shipped with additional security hardenings in the default htaccess.txt and web.config.txt files. These hardenings disable the so called MIME-type sniffing feature in web browsers. The sniffing leads to specific attack vectors, where scripts in normally harmless file formats (eg images) will be executed, leading to Cross-Site-Scripting vulnerabilities.</p><p>The security team recommends to manually apply the necessary changes to existing .htaccess or web.config files, as those files can not be updated automatically.</p><p><strong>Changes for .htaccess</strong><br />Add the following lines before \"## Mod_rewrite in use.\":</p><pre>&lt;IfModule mod_headers.c&gt;\nHeader always set X-Content-Type-Options \"nosniff\"\n&lt;/IfModule&gt;</pre><p><strong>Changes for web.config</strong><br />Add the following lines right after \"&lt;/rewrite&gt;\":</p><pre>&lt;httpProtocol&gt;\n  &lt;customHeaders&gt;\n    &lt;add name=\"X-Content-Type-Options\" value=\"nosniff\" /&gt;\n  &lt;/customHeaders&gt;\n&lt;/httpProtocol&gt;</pre>"
COM_CPANEL_MSG_ADDNOSNIFF_TITLE=".htaccess & web.config Security Update"
COM_CPANEL_MSG_EACCELERATOR_BODY="eAccelerator is not compatible with Joomla! By selecting the Change to File Caching button below we will change the cache handler to file. If you want to use a different cache handler, please change it in the Global Configuration page."
COM_CPANEL_MSG_EACCELERATOR_BUTTON="Change to File."
COM_CPANEL_MSG_EACCELERATOR_TITLE="eAccelerator is not compatible with Joomla!"
COM_CPANEL_MSG_HTACCESS_BODY="A change to the default .htaccess and web.config files was made in Joomla! 3.4 to disallow folder listings by default.  Users are recommended to implement this change in their files.  Please see <a href="_QQ_"https://docs.joomla.org/Special:MyLanguage/Preconfigured_htaccess"_QQ_">this page</a> for more information."
COM_CPANEL_MSG_HTACCESS_TITLE=".htaccess & web.config Update"
COM_CPANEL_MSG_HTACCESSSVG_TITLE="Additional XSS protection for the usage of SVG files"
COM_CPANEL_MSG_HTACCESSSVG_BODY="<p>Since 3.9.21 Joomla is shipped with an additional security rule in the default htaccess.txt. This rule will protect users of svg files from potential Cross-Site-Scripting (XSS) vulnerabilities.<br>The security team recommends to manually apply the necessary changes to any existing .htaccess file, as this file can not be updated automatically.</p><p><strong>Changes for .htaccess</strong></p><pre>&lt;FilesMatch \"\.svg$\"&gt;\n  &lt;IfModule mod_headers.c&gt;\n    Header always set Content-Security-Policy \"script-src 'none'\"\n  &lt;/IfModule&gt;\n&lt;/FilesMatch&gt;</pre><p>Currently we are not aware of a method to conditionally configure this on IIS web servers, please contact your hosting provider for further assistance.</p>"
COM_CPANEL_MSG_JOOMLA40_PRE_CHECKS_TITLE="Prepare for the next Major Release of Joomla"
COM_CPANEL_MSG_JOOMLA40_PRE_CHECKS_BODY="<p>Beginning with Joomla! 4.0 we are raising the minimum server requirements. If you are seeing this message then your current configuration does not meet these new minimum requirements.</p><p>The <a href="_QQ_"https://developer.joomla.org/news/788-joomla-4-on-the-move.html"_QQ_"><strong>minimum</strong> requirements</a> are the following:</p><ul><li>PHP 7.2.5</li><li>MySQL 5.6</li><li>MariaDB 10.1</li><li>PostgreSQL 11.0</li><li>MS SQL will <strong>not</strong> be supported</li><li>MySQL using the legacy `ext/mysql` PHP extension will <strong>not</strong> be supported, either the MySQLi or \"MySQL (PDO)\" driver must be used instead</li><li>PostgreSQL using the `ext/pgsql` PHP extension will <strong>not</strong> be supported, the \"PostgreSQL (PDO)\" driver must be used instead</li></ul><p>Please contact your hosting provider to ask how you can meet these raised server requirements - it is usually a very simple change. When you meet these new requirements then this message will no longer be displayed.</p>"
COM_CPANEL_MSG_LANGUAGEACCESS340_TITLE="You have possible issues with your multilingual settings"
COM_CPANEL_MSG_LANGUAGEACCESS340_BODY="Since Joomla! 3.4.0 you may have issues with the System - Language Filter plugin on your website. To fix them please open the <a href="_QQ_"index.php?option=com_languages&view=languages"_QQ_">Language Manager</a> and save each content language manually to make sure an Access level is saved."
; The following two strings are deprecated and will be removed with 4.0
COM_CPANEL_MSG_PHPVERSION_BODY="Beginning with Joomla! 3.3, the version of PHP this site is using will no longer be supported. Joomla! 3.3 will require at least <a href="_QQ_"https://community.joomla.org/blogs/leadership/1798-raising-the-bar-on-security.html"_QQ_">PHP version 5.3.10 to provide enhanced security features to its users</a>."
COM_CPANEL_MSG_PHPVERSION_TITLE="Your PHP Version Will Be Unsupported in Joomla! 3.3"
COM_CPANEL_MSG_ROBOTS_TITLE="robots.txt Update"
COM_CPANEL_MSG_ROBOTS_BODY="A change to the default robots.txt files was made in Joomla! 3.3 to allow Google to access templates and media files by default to improve SEO. This change is not applied automatically on upgrades and users are recommended to review the changes in the robots.txt.dist file and implement these changes in their own robots.txt file."
COM_CPANEL_MSG_STATS_COLLECTION_BODY="<p>Since Joomla! 3.5 a statistics plugin will submit anonymous data to the Joomla Project. This will only submit the Joomla version, PHP version, database engine and version, and server operating system.</p><p>This data is collected to ensure that future versions of Joomla can take advantage of the latest database and PHP features without affecting significant numbers of users. The need for this became clear when a minimum of PHP 5.3.10 was required when Joomla! 3.3 implemented the more secure Bcrypt passwords.</p><p>In the interest of full transparency and to help developers <a href="_QQ_"https://developer.joomla.org/about/stats.html"_QQ_">this data is publicly available.</a> An API and graphs will show the Joomla version, PHP versions and database engines in use.</p><p>If you do not wish to provide the Joomla Project with this information you can disable the plugin called System - Joomla Statistics.</p>"
COM_CPANEL_MSG_STATS_COLLECTION_TITLE="Stats Collection in Joomla"
COM_CPANEL_MSG_TEXTFILTER3919_BODY="<p>As part of our security team's review, we have made some changes to the default settings for the global text filters in a new Joomla installation. The default setting for the 'Public', 'Guest' and 'Registered' groups is now 'No HTML'. As these changes are only applied to new installations, we strongly recommend that you review these changes and update your site from: System -> Global Configuration -> Text Filters</p>"
COM_CPANEL_MSG_TEXTFILTER3919_TITLE="Updated Text Filter Recommendations"
COM_CPANEL_MSG_UPDATEDEFAULTSETTINGS_BODY="<p>As part of our security team's review, we have made some changes to the default settings in a new Joomla installation. As these changes are only applied to new installations, we strongly recommend that you review these changes and update your site.</p><p>The changed settings are:</p><ul><li>Global Configuration > Text Filters: The default \"Administrator\" user group has changed from \"No Filtering\" to \"Default Blacklist\"</li><li>Users > Send Password: The option to send a user their password in plain text when an account is created is now disabled by default</li><li>Media Manager: Flash files (\"swf\" file extension and \"application/x-shockwave-flash\" MIME Type) are not allowed to be uploaded</li><li>Articles > Show Email: The option to show an email icon with articles is disabled by default</li></ul><p>We have created a <a href=\"https://docs.joomla.org/Special:MyLanguage/J3.x:Joomla_3.8.8_notes_about_the_changed_default_settings\">dedicated documentation page</a> explaining these changes.</p>"
COM_CPANEL_MSG_UPDATEDEFAULTSETTINGS_TITLE="Updated site security recommendations"
COM_CPANEL_WELCOME_BEGINNERS_MESSAGE="<p>Community resources are available for new users.</p><ul><li><a href="_QQ_"https://docs.joomla.org/Special:MyLanguage/Portal:Beginners"_QQ_">Joomla! Beginners Guide</a></li><li><a href="_QQ_"https://forum.joomla.org/viewforum.php?f=706"_QQ_">New to Joomla! Forum</a></li></ul>"
COM_CPANEL_WELCOME_BEGINNERS_TITLE="Welcome to Joomla!"
COM_CPANEL_XML_DESCRIPTION="Control Panel component"
language/en-GB/en-GB.plg_search_content.sys.ini000060400000000464152453623440015275 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SEARCH_CONTENT="Search - Content"
PLG_SEARCH_CONTENT_XML_DESCRIPTION="Enables searching in Articles."language/en-GB/en-GB.plg_fields_sql.sys.ini000060400000000564152453623440014424 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_SQL="Fields - SQL"
PLG_FIELDS_SQL_XML_DESCRIPTION="This plugin lets you create new fields of type 'sql' in any extensions where custom fields are supported."
language/en-GB/en-GB.com_installer.ini000060400000057626152453623440013466 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_INSTALLER="Installer"
COM_INSTALLER_AUTHOR_INFORMATION="Author Information"
COM_INSTALLER_CACHETIMEOUT_DESC="For how many hours should Joomla cache update information. This is also the cache time for the Update Notification Plugin, if enabled"
COM_INSTALLER_CACHETIMEOUT_LABEL="Updates Caching (in hours)"
COM_INSTALLER_CONFIGURATION="Installer: Options"
COM_INSTALLER_CONFIRM_UNINSTALL="Are you sure you want to uninstall? Confirming will permanently delete the selected item(s)!"
COM_INSTALLER_CURRENT_VERSION="Installed"
COM_INSTALLER_DISCOVER_FILTER_SEARCH_DESC="Search in discovered extension name. Prefix with ID: to search for an extension ID."
COM_INSTALLER_DISCOVER_FILTER_SEARCH_LABEL="Search Discovered Extensions"
COM_INSTALLER_ENABLED_UPDATES_1=", 1 disabled site was enabled."
COM_INSTALLER_ENABLED_UPDATES_MORE=", %s disabled sites were enabled."
COM_INSTALLER_ERROR_DISABLE_DEFAULT_TEMPLATE_NOT_PERMITTED="Disable default template is not permitted."
COM_INSTALLER_ERROR_METHOD="Method Not Implemented"
COM_INSTALLER_ERROR_NO_EXTENSIONS_SELECTED="No extensions selected."
COM_INSTALLER_ERROR_NO_UPDATESITES_SELECTED="No update sites selected."
COM_INSTALLER_EXTENSION_DISABLE="Disable extension"
COM_INSTALLER_EXTENSION_DISABLED="Disabled extension"
COM_INSTALLER_EXTENSION_ENABLE="Enable extension"
COM_INSTALLER_EXTENSION_ENABLED="Enabled extension"
COM_INSTALLER_EXTENSION_PACKAGE_FILE="Extension package file"
COM_INSTALLER_EXTENSION_PROTECTED="Protected extension"
COM_INSTALLER_EXTENSION_PUBLISHED="Extension enabled."
COM_INSTALLER_EXTENSION_UNPUBLISHED="Extension disabled."
COM_INSTALLER_FAILED_TO_ENABLE_UPDATES=", failed to enable updates"
COM_INSTALLER_FILTER_LABEL="Search by Extension Name"
COM_INSTALLER_HEADER_DATABASE="Extensions: Database"
COM_INSTALLER_HEADER_DISCOVER="Extensions: Discover"
COM_INSTALLER_HEADER_INSTALL="Extensions: Install"
COM_INSTALLER_HEADER_LANGUAGES="Extensions: Install Languages"
COM_INSTALLER_HEADER_MANAGE="Extensions: Manage"
COM_INSTALLER_HEADER_UPDATE="Extensions: Update"
COM_INSTALLER_HEADER_UPDATESITES="Extensions: Update Sites"
COM_INSTALLER_HEADER_WARNINGS="Extensions: Warnings"
COM_INSTALLER_HEADING_CLIENT="Client"
COM_INSTALLER_HEADING_DETAILS_URL="Details URL"
COM_INSTALLER_HEADING_DETAILSURL="URL Details"
COM_INSTALLER_HEADING_FOLDER="Folder"
COM_INSTALLER_HEADING_FOLDER_ASC="Folder ascending"
COM_INSTALLER_HEADING_FOLDER_DESC="Folder descending"
COM_INSTALLER_HEADING_ID="ID"
COM_INSTALLER_HEADING_INSTALLTYPE="Install Type"
COM_INSTALLER_HEADING_LANGUAGE_TAG="Language Tag"
COM_INSTALLER_HEADING_LANGUAGE_TAG_ASC="Language Tag ascending"
COM_INSTALLER_HEADING_LANGUAGE_TAG_DESC="Language Tag descending"
COM_INSTALLER_HEADING_LOCATION="Location"
COM_INSTALLER_HEADING_LOCATION_ASC="Location ascending"
COM_INSTALLER_HEADING_LOCATION_DESC="Location descending"
COM_INSTALLER_HEADING_NAME="Name"
COM_INSTALLER_HEADING_NAME_ASC="Name ascending"
COM_INSTALLER_HEADING_NAME_DESC="Name descending"
COM_INSTALLER_HEADING_PACKAGE_ID="Package ID"
COM_INSTALLER_HEADING_PACKAGE_ID_ASC="Package ID ascending"
COM_INSTALLER_HEADING_PACKAGE_ID_DESC="Package ID descending"
COM_INSTALLER_HEADING_TYPE="Type"
COM_INSTALLER_HEADING_TYPE_ASC="Type ascending"
COM_INSTALLER_HEADING_TYPE_DESC="Type descending"
COM_INSTALLER_HEADING_UPDATESITE_NAME="Update Site"
COM_INSTALLER_HEADING_UPDATESITE_NAME_ASC="Update Site ascending"
COM_INSTALLER_HEADING_UPDATESITE_NAME_DESC="Update Site descending"
COM_INSTALLER_HEADING_UPDATESITEID="ID"
COM_INSTALLER_INSTALL_BUTTON="Install"
COM_INSTALLER_INSTALL_CHECKSUM_WRONG="The checksum verification failed. Please make sure you are using the correct update server!"
COM_INSTALLER_INSTALL_DIRECTORY="Install Folder"
COM_INSTALLER_INSTALL_ERROR="Error installing %s"
COM_INSTALLER_INSTALL_FROM_DIRECTORY="Install from Folder"
COM_INSTALLER_INSTALL_FROM_URL="Install from URL"
COM_INSTALLER_INSTALL_FROM_WEB="Install from Web"
COM_INSTALLER_INSTALL_FROM_WEB_ADD_TAB="Add &quot;Install from Web&quot; tab"
COM_INSTALLER_INSTALL_FROM_WEB_INFO="<a class="_QQ_"alert-link"_QQ_" href="_QQ_"https://extensions.joomla.org"_QQ_" target="_QQ_"_blank"_QQ_">Joomla! Extensions Directory&trade; (JED)</a> now available with <a class="_QQ_"alert-link"_QQ_" href="_QQ_"https://docs.joomla.org/Special:MyLanguage/Install_from_Web"_QQ_" target="_QQ_"_blank"_QQ_">Install from Web</a> on this page."
COM_INSTALLER_INSTALL_FROM_WEB_TOS="By selecting "_QQ_"Add Install from Web tab"_QQ_" below, you agree to the JED <a class="_QQ_"alert-link"_QQ_" href="_QQ_"https://extensions.joomla.org/tos"_QQ_" target="_QQ_"_blank"_QQ_">Terms of Service</a> and all applicable third party license terms."
COM_INSTALLER_INSTALL_LANGUAGE_SUCCESS="Installation of the <strong>%s</strong> language was successful."
COM_INSTALLER_INSTALL_SUCCESS="Installation of the %s was successful."
COM_INSTALLER_INSTALL_URL="Install URL"
COM_INSTALLER_INVALID_EXTENSION_UPDATE="Invalid extension update"
COM_INSTALLER_LABEL_HIDEPROTECTED_DESC="Hide protected extensions. Protected extensions can't be uninstalled."
COM_INSTALLER_LABEL_HIDEPROTECTED_LABEL="Hide Protected Extensions"
COM_INSTALLER_LANGUAGES_AVAILABLE_LANGUAGES="Available Languages"
COM_INSTALLER_LANGUAGES_FILTER_SEARCH_DESC="Search in language name and language tag."
COM_INSTALLER_LANGUAGES_FILTER_SEARCH_LABEL="Search Languages"
COM_INSTALLER_MANAGE_FILTER_SEARCH_DESC="Search in extension name. Prefix with ID: to search for an extension ID."
COM_INSTALLER_MANAGE_FILTER_SEARCH_LABEL="Search Extensions"
COM_INSTALLER_MINIMUM_STABILITY_ALPHA="Alpha"
COM_INSTALLER_MINIMUM_STABILITY_BETA="Beta"
COM_INSTALLER_MINIMUM_STABILITY_DESC="The minimum stability of the extension updates you would like to see. Development is the least stable, Stable is production quality. If an extension doesn't specify a level it is assumed to be Stable."
COM_INSTALLER_MINIMUM_STABILITY_DEV="Development"
COM_INSTALLER_MINIMUM_STABILITY_LABEL="Minimum Stability"
COM_INSTALLER_MINIMUM_STABILITY_STABLE="Stable"
COM_INSTALLER_MINIMUM_STABILITY_RC="Release Candidate"
COM_INSTALLER_MSG_DATABASE="This screen allows to you check that your database table structure is up to date with changes from the previous versions."
COM_INSTALLER_MSG_DATABASE_ADD_COLUMN="Table %2$s does not have column %3$s. (From file %1$s.)"
COM_INSTALLER_MSG_DATABASE_ADD_INDEX="Table %2$s does not have index %3$s. (From file %1$s.)"
COM_INSTALLER_MSG_DATABASE_CHANGE_COLUMN_TYPE="Table %2$s has the wrong type or attributes for column %3$s with type %4$s. (From file %1$s.)"
COM_INSTALLER_MSG_DATABASE_CHECKED_OK="%s database changes were checked."
COM_INSTALLER_MSG_DATABASE_CREATE_TABLE="Table %2$s does not exist. (From file %1$s.)"
COM_INSTALLER_MSG_DATABASE_DRIVER="Database driver: %s."
COM_INSTALLER_MSG_DATABASE_DROP_COLUMN="Table %2$s should not have column %3$s. (From file %1$s.)"
COM_INSTALLER_MSG_DATABASE_DROP_INDEX="Table %2$s should not have index %3$s. (From file %1$s.)"
COM_INSTALLER_MSG_DATABASE_ERRORS="Warning: Database is not up to date!"
COM_INSTALLER_MSG_DATABASE_FILTER_ERROR="No default text filters found."
COM_INSTALLER_MSG_DATABASE_INFO="Other Information"
COM_INSTALLER_MSG_DATABASE_OK="Database table structure is up to date."
COM_INSTALLER_MSG_DATABASE_SCHEMA_ERROR="Database schema version (%s) does not match CMS version (%s)."
COM_INSTALLER_MSG_DATABASE_SCHEMA_VERSION="Database schema version (in #__schemas): %s."
COM_INSTALLER_MSG_DATABASE_SKIPPED="%s database changes did not alter table structure and were skipped."
COM_INSTALLER_MSG_DATABASE_UPDATE_VERSION="Update version (in #__extensions): %s."
COM_INSTALLER_MSG_DATABASE_UPDATEVERSION_ERROR="Database update version (%s) does not match CMS version (%s)."
COM_INSTALLER_MSG_DATABASE_UTF8_CONVERSION_UTF8="The Joomla! Core database tables have not been converted yet to UTF-8."
COM_INSTALLER_MSG_DATABASE_UTF8_CONVERSION_UTF8MB4="The Joomla! Core database tables have not been converted yet to UTF-8 Multibyte (utf8mb4)."
COM_INSTALLER_MSG_DESCFTP="For installing or uninstalling Extensions, Joomla will most likely need your FTP account details. Please enter them in the form fields below."
COM_INSTALLER_MSG_DESCFTPTITLE="FTP Login Details"
COM_INSTALLER_MSG_DISCOVER_DESCRIPTION="Discover extensions that have not gone through the normal installation process."
COM_INSTALLER_MSG_DISCOVER_FAILEDTOPURGEEXTENSIONS="Failed to clear discovered extensions"
COM_INSTALLER_MSG_DISCOVER_INSTALLFAILED="Discover install failed."
COM_INSTALLER_MSG_DISCOVER_INSTALLSUCCESSFUL="Discover install successful."
COM_INSTALLER_MSG_DISCOVER_NOEXTENSION="<strong>No extensions have been discovered.</strong> Select Discover to find new extensions that might be available for install."
COM_INSTALLER_MSG_DISCOVER_NOEXTENSIONSELECTED="No extension selected."
COM_INSTALLER_MSG_DISCOVER_PURGEDDISCOVEREDEXTENSIONS="Cleared discovered extensions."
COM_INSTALLER_MSG_ERROR_CANT_CONNECT_TO_UPDATESERVER="Can't connect to %s"
COM_INSTALLER_MSG_INSTALL_ENTER_A_URL="Please enter a URL"
COM_INSTALLER_MSG_INSTALL_INVALID_URL="Invalid URL"
COM_INSTALLER_MSG_INSTALL_INVALID_URL_SCHEME="Please enter a valid URL starting with http or https."
COM_INSTALLER_MSG_INSTALL_NO_FILE_SELECTED="No file selected."
COM_INSTALLER_MSG_INSTALL_PATH_DOES_NOT_HAVE_A_VALID_PACKAGE="Path does not have a valid package."
COM_INSTALLER_MSG_INSTALL_PLEASE_ENTER_A_PACKAGE_DIRECTORY="Please enter a package folder."
COM_INSTALLER_MSG_INSTALL_PLEASE_SELECT_A_DIRECTORY="Please select a folder."
COM_INSTALLER_MSG_INSTALL_PLEASE_SELECT_A_PACKAGE="Please select a package location."
COM_INSTALLER_MSG_INSTALL_WARNINSTALLFILE="The installer can't continue until file uploads are enabled for the server."
COM_INSTALLER_MSG_INSTALL_WARNINSTALLUPLOADERROR="There was an error uploading this file to the server."
COM_INSTALLER_MSG_INSTALL_WARNINSTALLZLIB="The installer can't continue until Zlib is installed."
COM_INSTALLER_MSG_LANGUAGES_CANT_FIND_REMOTE_MANIFEST="The installer can't get the URL to the XML manifest file of the %s language."
COM_INSTALLER_MSG_LANGUAGES_CANT_FIND_REMOTE_PACKAGE="The installer can't get the URL to the remote %s language."
COM_INSTALLER_MSG_LANGUAGES_NOLANGUAGES="There are no available languages to install at the moment. Please select the &quot;Find languages&quot; button to check for updates on the Joomla! Languages server. You will need an internet connection for this to work."
COM_INSTALLER_MSG_LANGUAGES_TRY_LATER="Try again later or <a href="_QQ_"https://community.joomla.org/translations/joomla-3-translations.html"_QQ_">contact the language team coordinator</a>."
COM_INSTALLER_MSG_MANAGE_NOEXTENSION="There are no extensions installed matching your query."
COM_INSTALLER_MSG_MANAGE_NOUPDATESITE="There are no update sites matching your query."
COM_INSTALLER_MSG_N_DATABASE_ERROR_PANEL="%d Database Problems Found."
COM_INSTALLER_MSG_N_DATABASE_ERROR_PANEL_1="1 Database Problem Found."
COM_INSTALLER_MSG_UPDATE_ERROR="Error updating %s."
COM_INSTALLER_MSG_UPDATE_NODESC="No description available for this item."
COM_INSTALLER_MSG_UPDATE_NOUPDATES="There are no updates available at the moment. Please check again later."
COM_INSTALLER_MSG_UPDATE_SITES_COUNT_CHECK="Some update sites are disabled. You may want to check the <a href="_QQ_"%s"_QQ_">Update Sites Manager</a>."
COM_INSTALLER_MSG_UPDATE_SUCCESS="Updating %s was successful."
COM_INSTALLER_MSG_UPDATE_UPDATE="Update"
COM_INSTALLER_MSG_UPDATESITES_DELETE_ERROR="An error has occurred while trying to delete "_QQ_"%s"_QQ_" update site: %s."
COM_INSTALLER_MSG_UPDATESITES_DELETE_CANNOT_DELETE="%s update site cannot be deleted."
COM_INSTALLER_MSG_UPDATESITES_N_DELETE_UPDATESITES_DELETED="%s update sites have been deleted."
COM_INSTALLER_MSG_UPDATESITES_N_DELETE_UPDATESITES_DELETED_1="1 update site has been deleted."
COM_INSTALLER_MSG_UPDATESITES_REBUILD_EXTENSION_PLUGIN_NOT_ENABLED="The <a href="_QQ_"%s"_QQ_">Joomla Extension Plugin</a> is disabled. This plugin must be enabled to rebuild the update sites."
COM_INSTALLER_MSG_UPDATESITES_REBUILD_MESSAGE="Update sites have been rebuilt. No extension with an update site has been discovered."
COM_INSTALLER_MSG_UPDATESITES_REBUILD_NOT_PERMITTED="Rebuilding update sites is not permitted."
COM_INSTALLER_MSG_UPDATESITES_REBUILD_WARNING="Update sites have been rebuilt. No extension with updates sites discovered."
COM_INSTALLER_MSG_UPDATESITES_REBUILD_SUCCESS="Update sites have been rebuilt from manifest files."
COM_INSTALLER_MSG_WARNING_NO_LANGUAGES_UPDATESERVER="The update table is not up to date. Please <a href="_QQ_"index.php?option=com_installer&view=updatesites"_QQ_" target="_QQ_"_blank"_QQ_">rebuild your update server table</a>"
COM_INSTALLER_MSG_WARNINGFURTHERINFO="Further information on warnings"
COM_INSTALLER_MSG_WARNINGFURTHERINFODESC="For more information on warnings, see the <a href="_QQ_"https://docs.joomla.org"_QQ_" target="_QQ_"_blank"_QQ_">Joomla! Documentation Site</a>."
COM_INSTALLER_MSG_WARNINGS_FILEUPLOADISDISABLEDDESC="File uploads are required to upload extensions into the installer."
COM_INSTALLER_MSG_WARNINGS_FILEUPLOADSDISABLED="File uploads disabled."
COM_INSTALLER_MSG_WARNINGS_JOOMLATMPNOTSET="The Joomla temporary folder is not set."
COM_INSTALLER_MSG_WARNINGS_JOOMLATMPNOTSETDESC="The Joomla temporary folder is where Joomla copies an extension, extracts the extension and the files are copied into the correct directories. If this configuration is not set in configuration.php ($tmp_path) then you won't be able to upload extensions. Create a folder to enable Joomla to write to the folder to fix the issue."
COM_INSTALLER_MSG_WARNINGS_JOOMLATMPNOTWRITEABLE="The Joomla temporary folder is not writable or does not exist."
COM_INSTALLER_MSG_WARNINGS_JOOMLATMPNOTWRITEABLEDESC="The Joomla temporary folder is not writeable by the Joomla instance, or may not exist, which may cause issues when trying to upload extensions to Joomla. If you are having issues uploading extensions, make sure the folder defined in your configuration.php exists or check the '%s' and set it to be writeable and see if this fixes the issue."
COM_INSTALLER_MSG_WARNINGS_LOWMEMORYDESC="Low PHP memory limit."
COM_INSTALLER_MSG_WARNINGS_LOWMEMORYWARN="Your PHP memory limit is set below 8MB which may cause some issues when installing large extensions. Please set your memory limit to at least 16MB."
COM_INSTALLER_MSG_WARNINGS_MEDMEMORYDESC="Potentially low PHP memory limit."
COM_INSTALLER_MSG_WARNINGS_MEDMEMORYWARN="Your PHP memory limit is set below 16MB which may cause some issues when installing large extensions. Please set your memory limit to at least 16MB."
COM_INSTALLER_MSG_WARNINGS_NONE="No warnings detected."
COM_INSTALLER_MSG_WARNINGS_NOTCOMPLETE="<h1>Warning: Update Not Complete!</h1><p>The update is only partially complete. Please do the second update to complete the process.</p>"
COM_INSTALLER_MSG_WARNINGS_NOTICE="There are some warnings detected."
COM_INSTALLER_MSG_WARNINGS_PHPUPLOADNOTSET="The PHP temporary folder is not set."
COM_INSTALLER_MSG_WARNINGS_PHPUPLOADNOTSETDESC="The PHP temporary folder is the folder that PHP uses to store an uploaded file before Joomla can access this file. Whilst the folder not being set isn't always a problem, if you are having issues with manifest files not being detected or uploaded files not being detected, setting this in your php.ini file might fix the issue."
COM_INSTALLER_MSG_WARNINGS_PHPUPLOADNOTWRITEABLE="The PHP temporary folder is not writeable."
COM_INSTALLER_MSG_WARNINGS_PHPUPLOADNOTWRITEABLEDESC="The PHP temporary folder is not writeable by the Joomla! instance, which may cause issues when trying to upload extensions to Joomla. If you are having issues uploading extensions, check the '%s' and set it to be writeable and see if this fixes the issue."
COM_INSTALLER_MSG_WARNINGS_SMALLPOSTSIZE="Small PHP maximum POST size."
COM_INSTALLER_MSG_WARNINGS_SMALLPOSTSIZEDESC="The maximum POST size sets the most amount of data that can be sent via POST to the server. This includes form submissions for articles, media (images, videos) and packages. This value is less than 8MB which may impact on uploading large packages. This is set in the php.ini under post_max_size."
COM_INSTALLER_MSG_WARNINGS_SMALLUPLOADSIZE="Maximum PHP file upload size is too small: This is set in php.ini in both upload_max_filesize and post_max_size settings of your PHP settings (located in php.ini and/or .htaccess file)."
COM_INSTALLER_MSG_WARNINGS_SMALLUPLOADSIZEDESC="The maximum file size for uploads is set to less than 8MB which may impact on uploading large packages."
COM_INSTALLER_MSG_WARNINGS_UPDATE_NOTICE="Before updating ensure that the update is compatible with your Joomla! installation. <br>You are strongly advised to make a <strong>backup</strong> of your site's files and database before you start updating."
COM_INSTALLER_MSG_WARNINGS_UPLOADBIGGERTHANPOST="PHP Upload Size bigger than POST size."
COM_INSTALLER_MSG_WARNINGS_UPLOADBIGGERTHANPOSTDESC="The value of the upload_max_filesize in the php.ini file is greater than the post_max_size variable. The post_max_size variable will take precedence and block requests larger than it. This is generally a server misconfiguration when trying to increase upload sizes. Please increase the upload_max_filesize to at least match the post_max_size variable or vice versa."
COM_INSTALLER_MSG_WARNINGS_UPLOADFILETOOBIG="The selected file cannot be uploaded as it is bigger than the maximum upload size."
COM_INSTALLER_N_EXTENSIONS_PUBLISHED="%d extensions enabled."
COM_INSTALLER_N_EXTENSIONS_PUBLISHED_1="%d extension enabled."
COM_INSTALLER_N_EXTENSIONS_UNPUBLISHED="%d extensions disabled."
COM_INSTALLER_N_EXTENSIONS_UNPUBLISHED_1="%d extension disabled."
COM_INSTALLER_N_UPDATESITES_PUBLISHED="%d update sites enabled."
COM_INSTALLER_N_UPDATESITES_PUBLISHED_1="%d update site enabled."
COM_INSTALLER_N_UPDATESITES_UNPUBLISHED="%d update sites disabled."
COM_INSTALLER_N_UPDATESITES_UNPUBLISHED_1="%d update site disabled."
COM_INSTALLER_NEW_INSTALL="New Install"
COM_INSTALLER_NEW_VERSION="Available"
COM_INSTALLER_NO_INSTALL_TYPE_FOUND="No Install Type Found"
COM_INSTALLER_NO_INSTALLATION_PLUGINS_FOUND="No installation plugin has been enabled. At least one must be enabled to be able to use the installer. Go to the <a href='index.php?option=com_plugins&view=plugins&filter[folder]=installer' title='Plugin Manager'>Plugin Manager</a> to enable the plugins."
COM_INSTALLER_PACKAGE_DOWNLOAD_FAILED="Failed to download package. Download it and install manually from <a href='%1$s'>%1$s</a>."
COM_INSTALLER_PACKAGE_FILE="Package File"
COM_INSTALLER_PREFERENCES_DESCRIPTION="Fine tune how extensions installation and updates work."
COM_INSTALLER_PREFERENCES_LABEL="Preferences"
COM_INSTALLER_REINSTALL_BUTTON="Reinstall"
COM_INSTALLER_SHOW_JED_INFORMATION_DESC="Show or hide the information at the top of the installer page about the Joomla! Extensions Directory&trade;."
COM_INSTALLER_SHOW_JED_INFORMATION_HIDE_MESSAGE="Hide message"
COM_INSTALLER_SHOW_JED_INFORMATION_LABEL="Joomla! Extensions Directory"
COM_INSTALLER_SHOW_JED_INFORMATION_SHOW_MESSAGE="Show message"
COM_INSTALLER_SHOW_JED_INFORMATION_TOOLTIP="Opens Installer Options for setting to hide this Joomla! Extensions Directory&trade; message."
COM_INSTALLER_SUBMENU_DATABASE="Database"
COM_INSTALLER_SUBMENU_DISCOVER="Discover"
COM_INSTALLER_SUBMENU_INSTALL="Install"
COM_INSTALLER_SUBMENU_LANGUAGES="Install Languages"
COM_INSTALLER_SUBMENU_MANAGE="Manage"
COM_INSTALLER_SUBMENU_UPDATE="Update"
COM_INSTALLER_SUBMENU_UPDATESITES="Update Sites"
COM_INSTALLER_SUBMENU_WARNINGS="Warnings"
COM_INSTALLER_TITLE_DATABASE="Extensions: Database"
COM_INSTALLER_TITLE_DISCOVER="Extensions: Discover"
COM_INSTALLER_TITLE_INSTALL="Extensions: Install"
COM_INSTALLER_TITLE_LANGUAGES="Extensions: Install Languages"
COM_INSTALLER_TITLE_MANAGE="Extension: Manage"
COM_INSTALLER_TITLE_UPDATE="Extension: Update"
COM_INSTALLER_TITLE_UPDATESITES="Extensions: Update Sites"
COM_INSTALLER_TITLE_WARNINGS="Extensions: Warnings"
COM_INSTALLER_TOOLBAR_DATABASE_FIX="Fix"
COM_INSTALLER_TOOLBAR_DISCOVER="Discover"
COM_INSTALLER_TOOLBAR_FIND_LANGUAGES="Find languages"
COM_INSTALLER_TOOLBAR_FIND_UPDATES="Find Updates"
COM_INSTALLER_TOOLBAR_INSTALL="Install"
COM_INSTALLER_TOOLBAR_PURGE="Clear Cache"
COM_INSTALLER_TOOLBAR_UPDATE="Update"
COM_INSTALLER_TYPE_CLIENT="Location"
COM_INSTALLER_TYPE_COMPONENT="Component"
COM_INSTALLER_TYPE_FILE="File"
COM_INSTALLER_TYPE_LANGUAGE="Language"
COM_INSTALLER_TYPE_LIBRARY="Library"
COM_INSTALLER_TYPE_MODULE="Module"
COM_INSTALLER_TYPE_NONAPPLICABLE="N/A"
COM_INSTALLER_TYPE_PACKAGE="Package"
COM_INSTALLER_TYPE_PLUGIN="Plugin"
COM_INSTALLER_TYPE_TEMPLATE="Template"
COM_INSTALLER_TYPE_TYPE_COMPONENT="component"
COM_INSTALLER_TYPE_TYPE_FILE="file"
COM_INSTALLER_TYPE_TYPE_LANGUAGE="language"
COM_INSTALLER_TYPE_TYPE_LIBRARY="library"
COM_INSTALLER_TYPE_TYPE_MODULE="module"
COM_INSTALLER_TYPE_TYPE_PACKAGE="package"
COM_INSTALLER_TYPE_TYPE_PLUGIN="plugin"
COM_INSTALLER_TYPE_TYPE_TEMPLATE="template"
COM_INSTALLER_UNABLE_TO_FIND_INSTALL_PACKAGE="Unable to find install package"
COM_INSTALLER_UNABLE_TO_INSTALL_JOOMLA_PACKAGE="The Joomla package cannot be installed through the Extension Manager. Please use the <a href='%s'>Joomla! Update</a> component to update Joomla."
COM_INSTALLER_UNINSTALL_ERROR="Error uninstalling %s."
; This string is deprecated and will be removed with 4.0.
COM_INSTALLER_UNINSTALL_LANGUAGE="A language should always have been installed as a package. <br />To uninstall a language, filter type by package and uninstall the package."
COM_INSTALLER_UNINSTALL_SUCCESS="Uninstalling the %s was successful."
COM_INSTALLER_UNPACK_ERROR="Failed to extract file: %s"
COM_INSTALLER_UPDATE_FILTER_SEARCH_DESC="Search in extension name. Prefix with ID:, UID: or EID: to search for an update ID, update site ID or extension ID."
COM_INSTALLER_UPDATE_FILTER_SEARCH_LABEL="Search Extensions with Updates"
COM_INSTALLER_UPDATESITE_DISABLE="Disable update site"
COM_INSTALLER_UPDATESITE_DISABLED="Disabled update site"
COM_INSTALLER_UPDATESITE_ENABLE="Enable update site"
COM_INSTALLER_UPDATESITE_ENABLED="Enabled update site"
COM_INSTALLER_UPDATESITES_FILTER_SEARCH_DESC="Search in extension name. Prefix with ID: to search for an update site ID."
COM_INSTALLER_UPDATESITES_FILTER_SEARCH_LABEL="Search Update Sites"
COM_INSTALLER_UPLOAD_AND_INSTALL="Upload &amp; Install"
COM_INSTALLER_UPLOAD_INSTALL_JOOMLA_EXTENSION="Upload & Install Joomla Extension"
COM_INSTALLER_UPLOAD_PACKAGE_FILE="Upload Package File"
COM_INSTALLER_VALUE_CLIENT_SELECT="- Select Location -"
COM_INSTALLER_VALUE_FOLDER_NONAPPLICABLE="N/A"
COM_INSTALLER_VALUE_FOLDER_SELECT="- Select Folder -"
COM_INSTALLER_VALUE_STATE_SELECT="- Select Status -"
COM_INSTALLER_VALUE_TYPE_SELECT="- Select Type -"
COM_INSTALLER_WEBINSTALLER_INSTALL_OBSOLETE="The Install from Web plugin needs to be updated."
COM_INSTALLER_WEBINSTALLER_INSTALL_UPDATE_AVAILABLE="There is a new update available for the Install from Web plugin. It is advisable that you update as soon as possible."
COM_INSTALLER_WEBINSTALLER_INSTALL_WEB_CONFIRM="Please confirm the installation by selecting the Install button"
COM_INSTALLER_WEBINSTALLER_INSTALL_WEB_CONFIRM_NAME="Extension Name"
COM_INSTALLER_WEBINSTALLER_INSTALL_WEB_CONFIRM_URL="Install from"
COM_INSTALLER_WEBINSTALLER_INSTALL_WEB_LOADING="Loading ..."
COM_INSTALLER_WEBINSTALLER_INSTALL_WEB_LOADING_ERROR="Can't connect to the Joomla! server. Please try again later."
COM_INSTALLER_WEBINSTALLER_LOAD_APPS="Select to load extensions browser"
COM_INSTALLER_XML_DESCRIPTION="Installer component for adding, removing and upgrading extensions"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_INSTALLER="Changes apply to this component only.<br /><em><strong>Inherited</strong></em> - a Global Configuration setting or higher level setting is applied.<br /><em><strong>Denied</strong></em> always wins - whatever is set at the Global or higher level and applies to all child elements.<br /><em><strong>Allowed</strong></em> will enable the action for this component unless overruled by a Global Configuration setting."
language/en-GB/en-GB.com_weblinks.ini000060400000022565152453623440013301 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_WEBLINKS="Web Links"
COM_WEBLINKS_ACCESS_HEADING="Access"
COM_WEBLINKS_BATCH_OPTIONS="Batch process the selected links"
COM_WEBLINKS_BATCH_TIP="If a category is selected for move/copy, any actions selected will be applied to the copied or moved links. Otherwise, all actions are applied to the selected links."
COM_WEBLINKS_CATEGORIES_DESC="These settings apply for Web Links Categories Options unless they are changed for a specific menu item."
COM_WEBLINKS_CATEGORY_DESC="These settings apply for Web Links Category Options unless they are changed for a specific menu item."
COM_WEBLINKS_CHANGE_WEBLINK="Select or Change Web Link"
COM_WEBLINKS_COMPONENT_DESC="These settings apply for Web Links unless they are changed for a specific menu item or web link."
COM_WEBLINKS_COMPONENT_LABEL="Web Link"
COM_WEBLINKS_CONFIG_INTEGRATION_SETTINGS_DESC="These settings determine how the Web Links Component will integrate with other extensions."
COM_WEBLINKS_CONFIGURATION="Web Links Manager Options"
COM_WEBLINKS_EDIT_WEBLINK="Edit Web Link"
COM_WEBLINKS_ERR_TABLES_NAME="There is already a Web Link with that name in this category. Please try again."
COM_WEBLINKS_ERR_TABLES_PROVIDE_URL="Please provide a valid URL"
COM_WEBLINKS_ERR_TABLES_TITLE="Your web link must have a title."
COM_WEBLINKS_ERROR_UNIQUE_ALIAS="Another web link from this category has the same alias (remember it may be a trashed item)."
COM_WEBLINKS_FIELD_ALIAS_DESC="The alias is for internal use only. Leave this blank and Joomla will fill in a default value from the title. It has to be unique for each web link in the same category."
COM_WEBLINKS_FIELD_CATEGORY_DESC="Choose a category for this Web link."
COM_WEBLINKS_FIELD_CATEGORYCHOOSE_DESC="Please choose a Web Links category to display."
COM_WEBLINKS_FIELD_CAPTCHA_DESC="Select the captcha plugin that will be used in the web link submit form. You may need to enter required information for your captcha plugin in the Plugin Manager.<br />If 'Use Default' is selected, make sure a captcha plugin is selected in Global Configuration."
COM_WEBLINKS_FIELD_CAPTCHA_LABEL="Allow Captcha on Web Link"
COM_WEBLINKS_FIELD_CONFIG_CAT_SHOWNUMBERS_DESC="Show or hide the number of Web Links in each Category."
COM_WEBLINKS_FIELD_CONFIG_CAT_SHOWNUMBERS_LABEL="# Web Links"
COM_WEBLINKS_FIELD_CONFIG_COUNTCLICKS_DESC="If set to yes, the number of times the link has been clicked will be recorded."
COM_WEBLINKS_FIELD_CONFIG_COUNTCLICKS_LABEL="Count Clicks"
COM_WEBLINKS_FIELD_CONFIG_DESCRIPTION_DESC="Show or hide the description below."
COM_WEBLINKS_FIELD_CONFIG_HITS_DESC="Show or hide hits."
COM_WEBLINKS_FIELD_CONFIG_ICON_DESC="If Icon is chosen above, select an icon to display with the Web Links. If none is selected, the default icon will be used."
COM_WEBLINKS_FIELD_CONFIG_ICON_LABEL="Select Icon"
COM_WEBLINKS_FIELD_CONFIG_LINKDESCRIPTION_DESC="Show or hide the links description."
COM_WEBLINKS_FIELD_CONFIG_LINKDESCRIPTION_LABEL="Links Description"
COM_WEBLINKS_FIELD_CONFIG_OTHERCATS_DESC="Show or hide other categories."
COM_WEBLINKS_FIELD_CONFIG_OTHERCATS_LABEL="Other Categories"
COM_WEBLINKS_FIELD_CONFIG_SHOWREPORT_DESC="Show or hide the Report Bad Link option."
COM_WEBLINKS_FIELD_CONFIG_SHOWREPORT_LABEL="Reports"
COM_WEBLINKS_FIELD_COUNTCLICKS_DESC="If set to yes, the number of times the link has been clicked will be recorded."
COM_WEBLINKS_FIELD_COUNTCLICKS_LABEL="Count Clicks"
COM_WEBLINKS_FIELD_DESCRIPTION_DESC="Enter a description for the web link."
COM_WEBLINKS_FIELD_DISPLAY_NUM_DESC="Default number of Web links to list on a page."
COM_WEBLINKS_FIELD_DISPLAY_NUM_LABEL="# of Web links to List"
COM_WEBLINKS_FIELD_FIRST_DESC="The image to be displayed."
COM_WEBLINKS_FIELD_FIRST_LABEL="First Image"

COM_WEBLINKS_FIELD_HEIGHT_DESC="Height of the target popup or modal window. Defaults to 600x500 if one field is left empty."
COM_WEBLINKS_FIELD_HEIGHT_LABEL="Height"
COM_WEBLINKS_FIELD_ICON_DESC="Displays a text, an icon or nothing with the Web links. Default is 'Icon'."
COM_WEBLINKS_FIELD_ICON_LABEL="Text/Icon/Web Link Only"
COM_WEBLINKS_FIELD_ICON_OPTION_ICON="Icon"
COM_WEBLINKS_FIELD_ICON_OPTION_TEXT="Text"
COM_WEBLINKS_FIELD_ICON_OPTION_WEBLINK="Web Link Only"
COM_WEBLINKS_FIELD_IMAGE_ALT_DESC="Alternative text used for visitors without access to images. Replaced with caption text if it is present."
COM_WEBLINKS_FIELD_IMAGE_ALT_LABEL="Alt Text"
COM_WEBLINKS_FIELD_IMAGE_CAPTION_DESC="Caption attached to the image."
COM_WEBLINKS_FIELD_IMAGE_CAPTION_LABEL="Caption"

COM_WEBLINKS_FIELD_LANGUAGE_DESC="Assign a language to this web link."
COM_WEBLINKS_FIELD_MODIFIED_DESC="The date and time the link was last modified."
COM_WEBLINKS_FIELD_SECOND_DESC="The second image to be displayed."
COM_WEBLINKS_FIELD_SECOND_LABEL="Second Image"
COM_WEBLINKS_FIELD_SELECT_CATEGORY_DESC="Select a web links category to display."
COM_WEBLINKS_FIELD_SELECT_CATEGORY_LABEL="Select a Category"
COM_WEBLINKS_FIELD_SHOW_CAT_TAGS_DESC="Show the tags for a category."
COM_WEBLINKS_FIELD_SHOW_CAT_TAGS_LABEL="Show Tags"
COM_WEBLINKS_FIELD_SHOW_TAGS_DESC="Show the tags for a web link."
COM_WEBLINKS_FIELD_SHOW_TAGS_LABEL="Show Tags"
COM_WEBLINKS_FIELD_STATE_DESC="Set publication status."
COM_WEBLINKS_FIELD_TARGET_DESC="Target browser window when the link is selected."
COM_WEBLINKS_FIELD_TARGET_LABEL="Target"
COM_WEBLINKS_FIELD_TITLE_DESC="Web Link must have a title."
COM_WEBLINKS_FIELD_URL_DESC="You must enter a URL. IDN (International) Links are converted to punycode when they are saved."
COM_WEBLINKS_FIELD_URL_LABEL="URL"
COM_WEBLINKS_FIELD_VALUE_REPORTED="Reported"
COM_WEBLINKS_FIELD_VERSION_DESC="A count of the number of times this web link has been revised."
COM_WEBLINKS_FIELD_VERSION_LABEL="Revision"
COM_WEBLINKS_FIELD_WIDTH_DESC="Width of the target popup or modal window. Defaults to 600x500 if one field is left empty."
COM_WEBLINKS_FIELD_WIDTH_LABEL="Width"
COM_WEBLINKS_FIELDSET_IMAGES="Images"
COM_WEBLINKS_FIELDSET_OPTIONS="Options"
COM_WEBLINKS_FILTER_CATEGORY="Filter Category"
COM_WEBLINKS_FILTER_SEARCH_DESC="Search in web link title and alias. Prefix with ID: to search for a web link ID."
COM_WEBLINKS_FILTER_SEARCH_LABEL="Search Web Links"
COM_WEBLINKS_FILTER_STATE="Filter State"
COM_WEBLINKS_FLOAT_FIRST_DESC="Controls placement of the first image."
COM_WEBLINKS_FLOAT_FIRST_LABEL="First Image Float"
COM_WEBLINKS_FLOAT_SECOND_DESC="Controls placement of the second image."
COM_WEBLINKS_FLOAT_SECOND_LABEL="Second Image Float"
COM_WEBLINKS_HEADING_ASSOCIATION="Association"
COM_WEBLINKS_HITS_DESC="Number of hits for this web link."
COM_WEBLINKS_LEFT="Left"
COM_WEBLINKS_LIST_LAYOUT_DESC="These settings apply for Web Links List Layout Options unless they are changed for a specific menu item."
COM_WEBLINKS_MANAGER_WEBLINK="Web Links"
COM_WEBLINKS_MANAGER_WEBLINKS="Web Links"
COM_WEBLINKS_MANAGER_WEBLINK_EDIT="Web Link: Edit"
COM_WEBLINKS_MANAGER_WEBLINK_NEW="Web Link: New"
COM_WEBLINKS_N_ITEMS_ARCHIVED="%d web links archived."
COM_WEBLINKS_N_ITEMS_ARCHIVED_1="%d web link archived."
COM_WEBLINKS_N_ITEMS_CHECKED_IN_0="No web link checked in."
COM_WEBLINKS_N_ITEMS_CHECKED_IN_1="%d web link checked in."
COM_WEBLINKS_N_ITEMS_CHECKED_IN_MORE="%d web links checked in."
COM_WEBLINKS_N_ITEMS_DELETED="%d web links deleted."
COM_WEBLINKS_N_ITEMS_DELETED_1="%d web link deleted."
COM_WEBLINKS_N_ITEMS_PUBLISHED="%d web links published."
COM_WEBLINKS_N_ITEMS_PUBLISHED_1="%d web link published."
COM_WEBLINKS_N_ITEMS_TRASHED="%d web links trashed."
COM_WEBLINKS_N_ITEMS_TRASHED_1="%d web link trashed."
COM_WEBLINKS_N_ITEMS_UNPUBLISHED="%d web links unpublished."
COM_WEBLINKS_N_ITEMS_UNPUBLISHED_1="%d web link unpublished."
COM_WEBLINKS_NEW_WEBLINK="New Web Link"
COM_WEBLINKS_NONE="None"
COM_WEBLINKS_OPTION_FILTER_ACCESS="- Filter Access -"
COM_WEBLINKS_OPTION_FILTER_CATEGORY="- Filter Category -"
COM_WEBLINKS_OPTION_FILTER_PUBLISHED="- Filter State -"
COM_WEBLINKS_OPTIONS="Options"
COM_WEBLINKS_ORDER_HEADING="Order"
COM_WEBLINKS_RIGHT="Right"
COM_WEBLINKS_SAVE_SUCCESS="Web link saved"
COM_WEBLINKS_SEARCH_IN_TITLE="Search in title"
COM_WEBLINKS_SELECT_A_WEBLINK="Select Web Link"
COM_WEBLINKS_SHOW_EMPTY_CATEGORIES_DESC="If Show, empty categories will display. A category is only empty if it has no Web links or subcategories."
COM_WEBLINKS_SUBMENU_CATEGORIES="Categories"
COM_WEBLINKS_SUBMENU_WEBLINKS="Web Links"
COM_WEBLINKS_WEBLINKS="Web Links"
COM_WEBLINKS_XML_DESCRIPTION="Component for web links management"
JGLOBAL_NO_ITEM_SELECTED="No web links selected"
JGLOBAL_NEWITEMSLAST_DESC="New Web links default to the last position. Ordering can be changed after this Web link is saved."
JLIB_APPLICATION_ERROR_BATCH_CANNOT_CREATE="You are not allowed to create new web links in this category."
JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT="You are not allowed to edit one or more of these web links."

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_WEBLINKS="Changes apply to this component only.<br /><em><strong>Inherited</strong></em> - a Global Configuration setting or higher level setting is applied.<br /><em><strong>Denied</strong></em> always wins - whatever is set at the Global or higher level and applies to all child elements.<br /><em><strong>Allowed</strong></em> will enable the action for this component unless overruled by a Global Configuration setting."
language/en-GB/en-GB.plg_editors-xtd_readmore.sys.ini000060400000000563152453623440016422 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS-XTD_READMORE="Button - Readmore"
PLG_READMORE_XML_DESCRIPTION="Enables a button which allows you to insert the <em>Read more ...</em> link into an Article."language/en-GB/en-GB.plg_editors-xtd_menu.ini000060400000000663152453623440014754 0ustar00; Joomla! Project
; (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS-XTD_MENU="Button - Menu"
PLG_EDITORS-XTD_MENU_BUTTON_MENU="Menu"
PLG_EDITORS-XTD_MENU_XML_DESCRIPTION="Displays a button to insert menu item links into an Article. Displays a popup allowing you to choose the menu item."
language/en-GB/en-GB.plg_authentication_joomla.ini000060400000001137152453623440016037 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_AUTH_JOOMLA_ERR_SECRET_CODE_WITHOUT_TFA="You need to enable two factor authentication in your user profile to use the secret code field."
PLG_AUTH_JOOMLA_XML_DESCRIPTION="Handles Joomla's default User authentication.<br /><strong> Warning! You must have at least one authentication plugin enabled or you will lose all access to your site.</strong>"
PLG_AUTHENTICATION_JOOMLA="Authentication - Joomla"language/en-GB/en-GB.plg_content_loadmodule.ini000060400000001761152453623440015341 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CONTENT_LOADMODULE="Content - Load Modules"
PLG_LOADMODULE_FIELD_STYLE_DESC="Code that will wrap Modules."
PLG_LOADMODULE_FIELD_STYLE_LABEL="Style"
PLG_LOADMODULE_FIELD_VALUE_DIVS="Wrapped by Divs"
PLG_LOADMODULE_FIELD_VALUE_HORIZONTAL="Wrapped by table (horizontal)"
PLG_LOADMODULE_FIELD_VALUE_MULTIPLEDIVS="Wrapped by Multiple Divs"
PLG_LOADMODULE_FIELD_VALUE_RAW="No wrapping (raw output)"
PLG_LOADMODULE_FIELD_VALUE_TABLE="Wrapped by table (column)"
PLG_LOADMODULE_XML_DESCRIPTION="Within content this plugin loads a Module by ID, Syntax: {loadmoduleid 1} or a Module by position, Syntax: {loadposition user1} or a Module by name, Syntax: {loadmodule mod_login}. Optionally can specify module style and for loadmodule a specific module by title, Syntax: {loadmodule mod_login,module title,style}."
language/en-GB/en-GB.plg_authentication_ldap.sys.ini000060400000000715152453623440016314 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_AUTHENTICATION_LDAP="Authentication - LDAP"
PLG_LDAP_XML_DESCRIPTION="Handles User Authentication against an LDAP server.<br /><strong> Warning! You must have at least one authentication plugin enabled or you will lose all access to your site.</strong>"
language/en-GB/en-GB.plg_quickicon_privacycheck.ini000060400000002027152453623440016176 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_QUICKICON_PRIVACYCHECK="Quick Icon - Joomla! Privacy Requests Notification"
PLG_QUICKICON_PRIVACYCHECK_CHECKING="Checking requests ..."
PLG_QUICKICON_PRIVACYCHECK_ERROR="Unknown requests ..."
PLG_QUICKICON_PRIVACYCHECK_GROUP_DESC="The group of this plugin (this value is compared with the group value used in <strong>Quick Icons</strong> modules to inject icons)."
PLG_QUICKICON_PRIVACYCHECK_GROUP_LABEL="Group"
PLG_QUICKICON_PRIVACYCHECK_REQUESTFOUND="Urgent Privacy Requests"
PLG_QUICKICON_PRIVACYCHECK_REQUESTFOUND_BUTTON="View Requests"
PLG_QUICKICON_PRIVACYCHECK_REQUESTFOUND_MESSAGE="Urgent Privacy Request(s) to manage."
PLG_QUICKICON_PRIVACYCHECK_NOREQUEST="No Urgent Requests."
PLG_QUICKICON_PRIVACYCHECK_XML_DESCRIPTION="Checks for privacy requests that need to be handled and notifies you when you visit the Control Panel page."
language/en-GB/en-GB.plg_fields_radio.ini000060400000001200152453623440014072 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_RADIO="Fields - Radio"
PLG_FIELDS_RADIO_LABEL="Radio (%s)"
PLG_FIELDS_RADIO_PARAMS_OPTIONS_DESC="The values of the radio list."
PLG_FIELDS_RADIO_PARAMS_OPTIONS_NAME_LABEL="Text"
PLG_FIELDS_RADIO_PARAMS_OPTIONS_LABEL="Radio Values"
PLG_FIELDS_RADIO_PARAMS_OPTIONS_VALUE_LABEL="Value"
PLG_FIELDS_RADIO_XML_DESCRIPTION="This plugin lets you create new fields of type 'radio' in any extensions where custom fields are supported."
language/en-GB/en-GB.plg_fields_repeatable.ini000060400000002114152453623440015105 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_REPEATABLE="Fields - Repeatable"
PLG_FIELDS_REPEATABLE_LABEL="Repeatable (%s)"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_NAME_DESC="The name of the field to display in the form"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_NAME_LABEL="Name"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_TYPE_DESC="Set the field type"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_TYPE_EDITOR="Editor"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_TYPE_LABEL="Type"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_TYPE_MEDIA="Media"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_TYPE_NUMBER="Number"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_TYPE_TEXT="Text"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_TYPE_TEXTAREA="Text Area"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDS_DESC="Add one or more form fields"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDS_LABEL="Form Fields"
PLG_FIELDS_REPEATABLE_XML_DESCRIPTION="Plugin to create a repeatable form with customizable fields."
language/en-GB/en-GB.mod_login.ini000060400000001344152453623440012564 0ustar00; Joomla! Project
; (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_LOGIN="Login Form"
MOD_LOGIN_FIELD_USESECURE_DESC="Submit encrypted login data using HTTPS (encrypted HTTP connections with the https:// protocol prefix). Note, you must have HTTPS enabled on your server to utilise this option."
MOD_LOGIN_FIELD_USESECURE_LABEL="Encrypt Login Form"
MOD_LOGIN_LANGUAGE="Language"
MOD_LOGIN_LOGIN="Log in"
MOD_LOGIN_XML_DESCRIPTION="This module displays a username and password login form. It should not be unpublished."
MOD_LOGIN_REMIND="Forgot your username?"
MOD_LOGIN_RESET="Forgot your password?"
language/en-GB/en-GB.plg_fields_repeatable.sys.ini000060400000000534152453623440015726 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_REPEATABLE="Fields - Repeatable"
PLG_FIELDS_REPEATABLE_XML_DESCRIPTION="Plugin to create a repeatable form with customizable fields."
language/en-GB/en-GB.plg_actionlog_akeebabackup.ini000060400000004356152453623440016122 0ustar00;; @package   akeebabackup
;; @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
;; @license   GNU General Public License version 3, or later

PLG_ACTIONLOG_AKEEBABACKUP="Action Log - Akeeba Backup"
PLG_ACTIONLOG_AKEEBABACKUP_XML_DESCRIPTION="Automatically log user actions performed on Akeeba Backup component inside Joomla! User Actions Log"

COM_AKEEBA_LOGS_PROFILE_ADD="User <a href=\"{accountlink}\">{username}</a> created the backup profile {title}"
COM_AKEEBA_LOGS_PROFILE_DELETE="User <a href=\"{accountlink}\">{username}</a> tried to delete the backup profile(s) {title}"
COM_AKEEBA_LOGS_CONFIGURATION_EDIT="User <a href=\"{accountlink}\">{username}</a> modified the configuration settings for profile {title}"
COM_AKEEBA_LOGS_BACKUP_RUN="User <a href=\"{accountlink}\">{username}</a> started a new backup for profile {title}"
COM_AKEEBA_LOGS_MANAGE_DOWNLOAD="User <a href=\"{accountlink}\">{username}</a> tried to download a backup archive. {title}"
COM_AKEEBA_LOGS_MANAGE_DELETE="User <a href=\"{accountlink}\">{username}</a> deleted the backup entry for ID {title}"
COM_AKEEBA_LOGS_MANAGE_DELETEFILES="User <a href=\"{accountlink}\">{username}</a> deleted the archives for backup {title}"
COM_AKEEBA_LOGS_REMOTEFILE_DOWNLOAD="User <a href=\"{accountlink}\">{username}</a> tried to download a backup archive stored on remote server. {title}"
COM_AKEEBA_LOGS_REMOTEFILE_FETCH="User <a href=\"{accountlink}\">{username}</a> tried to fetch to server a backup archive stored on remote server. {title}"
COM_AKEEBA_LOGS_REMOTEFILE_DELETE="User <a href=\"{accountlink}\">{username}</a> tried to delete the remote archives for backup {title}"
COM_AKEEBA_LOGS_UPLOADS_ADD="User <a href=\"{accountlink}\">{username}</a> tried to upload local archives to the remote engine for backup {title}"
COM_AKEEBA_LOGS_LOG_DOWNLOAD="User <a href=\"{accountlink}\">{username}</a> downloaded the log file for backup {title}"
COM_AKEEBA_LOGS_DISCOVER_IMPORT="User <a href=\"{accountlink}\">{username}</a> imported backup archive {title}"
COM_AKEEBA_LOGS_S3IMPORT_IMPORT="User <a href=\"{accountlink}\">{username}</a> imported from S3 the backup archive {title}"
COM_AKEEBA_LOGS_TRANSFER_RUN="User <a href=\"{accountlink}\">{username}</a> started a site transfer to URL {title}"language/en-GB/en-GB.com_tags.sys.ini000060400000003353152453623440013230 0ustar00; Joomla! Project
; (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_TAGS="Tags"
COM_TAGS_CONTENT_TYPE_ARTICLE="Article"
COM_TAGS_CONTENT_TYPE_ARTICLE_CATEGORY="Article Category"
COM_TAGS_CONTENT_TYPE_BANNER="Banner"
COM_TAGS_CONTENT_TYPE_BANNER_CLIENT="Banner Client"
COM_TAGS_CONTENT_TYPE_BANNERS_CATEGORY="Banner Category"
COM_TAGS_CONTENT_TYPE_CONTACT="Contact"
COM_TAGS_CONTENT_TYPE_CONTACT_CATEGORY="Contact Category"
COM_TAGS_CONTENT_TYPE_NEWSFEED="News Feed"
COM_TAGS_CONTENT_TYPE_NEWSFEEDS_CATEGORY="News Feed Category"
COM_TAGS_CONTENT_TYPE_TAG="Tag"
COM_TAGS_CONTENT_TYPE_USER="User"
COM_TAGS_CONTENT_TYPE_USER_NOTES="User Notes"
COM_TAGS_CONTENT_TYPE_USER_NOTES_CATEGORY="User Notes Category"
COM_TAGS_CONTENT_TYPE_WEBLINK="Web Link"
COM_TAGS_CONTENT_TYPE_WEBLINKS_CATEGORY="Web Links Category"
COM_TAGS_TAG="Tag"
COM_TAGS_TAG_VIEW_DEFAULT_DESC="This links to a list of items with specific tags."
COM_TAGS_TAG_VIEW_DEFAULT_OPTION="Default"
COM_TAGS_TAG_VIEW_DEFAULT_TITLE="Tagged Items"
COM_TAGS_TAG_VIEW_LIST_COMPACT_OPTION="Compact layout"
COM_TAGS_TAG_VIEW_LIST_COMPACT_TITLE="Compact List of Tagged Items"
COM_TAGS_TAG_VIEW_LIST_DESC="List of items that have been tagged with the selected tags."
COM_TAGS_TAG_VIEW_LIST_OPTION="List view options"
COM_TAGS_TAG_VIEW_LIST_TITLE="Tagged items list"
COM_TAGS_TAGS="Tags"
COM_TAGS_TAGS_VIEW_COMPACT_DESC="Compact list of tags."
COM_TAGS_TAGS_VIEW_COMPACT_TITLE="Compact Tags View"
COM_TAGS_TAGS_VIEW_DEFAULT_DESC="This links to a detailed list of all tags."
COM_TAGS_TAGS_VIEW_DEFAULT_TITLE="List All Tags"
COM_TAGS_XML_DESCRIPTION="A component for tagging content items."
language/en-GB/en-GB.plg_authentication_ldap.ini000060400000006733152453623440015505 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_AUTHENTICATION_LDAP="Authentication - LDAP"
PLG_LDAP_FIELD_AUTHMETHOD_DESC="The authorisation method to validate the credentials."
PLG_LDAP_FIELD_AUTHMETHOD_LABEL="Authorisation Method"
PLG_LDAP_FIELD_BASEDN_DESC="The base DN of your LDAP server, eg o=example.com."
PLG_LDAP_FIELD_BASEDN_LABEL="Base DN"
PLG_LDAP_FIELD_EMAIL_DESC="LDAP attribute which has the User's email address."
PLG_LDAP_FIELD_EMAIL_LABEL="Map: Email"
PLG_LDAP_FIELD_FULLNAME_DESC="LDAP attribute which has the User's full name."
PLG_LDAP_FIELD_FULLNAME_LABEL="Map: Full Name"
PLG_LDAP_FIELD_IGNORE_REQCERT_TLS_DESC="When enabled ignore the server certificate, this is useful when running for example Samba 4 with a self-signed certificate."
PLG_LDAP_FIELD_IGNORE_REQCERT_TLS_LABEL="Ignore Certificate"
PLG_LDAP_FIELD_HOST_DESC="Eg: openldap.example.com."
PLG_LDAP_FIELD_HOST_LABEL="Host"
PLG_LDAP_FIELD_LDAPDEBUG_DESC="Enables debug hardcoded to level 7"
PLG_LDAP_FIELD_LDAPDEBUG_LABEL="Debug"
PLG_LDAP_FIELD_NEGOCIATE_DESC="Negotiate TLS encryption with the LDAP server. This requires all traffic to and from the LDAP server to be encrypted."
PLG_LDAP_FIELD_NEGOCIATE_LABEL="Negotiate TLS"
PLG_LDAP_FIELD_PASSWORD_DESC="The Connect Password is the password of an administrative account. This is used in Authenticate then Bind and Authenticated Compare authorisation methods."
PLG_LDAP_FIELD_PASSWORD_LABEL="Connect Password"
PLG_LDAP_FIELD_PORT_DESC="Default port is 389."
PLG_LDAP_FIELD_PORT_LABEL="Port"
PLG_LDAP_FIELD_REFERRALS_DESC="This option sets the value of the LDAP_OPT_REFERRALS flag. You will need to set it to No for Windows 2003 servers."
PLG_LDAP_FIELD_REFERRALS_LABEL="Follow Referrals"
PLG_LDAP_FIELD_SEARCHSTRING_DESC="A query string used to search for a given User. The [search] keyword is dynamically replaced by the User-provided login. An example string is: uid=[search]. Several strings can be used separated by semicolons. Only used when searching."
PLG_LDAP_FIELD_SEARCHSTRING_LABEL="Search String"
PLG_LDAP_FIELD_UID_DESC="LDAP Attribute which has the User's Login ID. For Active Directory this is sAMAccountName."
PLG_LDAP_FIELD_UID_LABEL="Map: User ID"
PLG_LDAP_FIELD_USERNAME_DESC="The Connect Username and Connect Password define connection parameters for the DN lookup phase. Two options are available:- Anonymous DN lookup (leave both fields blank); Administrative connection: Connect Username is the username of an administrative account, for example Administrator. Connect password is the actual password of your administrative account."
PLG_LDAP_FIELD_USERNAME_LABEL="Connect Username"
PLG_LDAP_FIELD_USERSDN_DESC="The [username] keyword is dynamically replaced by the User-provided login. An example string is: uid=[username], dc=my-domain, dc=com. Several strings can be used, separated by semicolons. Only used for direct binds."
PLG_LDAP_FIELD_USERSDN_LABEL="User's DN"
PLG_LDAP_FIELD_V3_DESC="Default is LDAP2, but the latest versions of OpenLdap require clients to use LDAPV3."
PLG_LDAP_FIELD_V3_LABEL="LDAP V3"
PLG_LDAP_FIELD_VALUE_BINDSEARCH="Bind and Search"
PLG_LDAP_FIELD_VALUE_BINDUSER="Bind Directly as User"
PLG_LDAP_XML_DESCRIPTION="Handles User Authentication against an LDAP server.<br /><strong> Warning! You must have at least one authentication plugin enabled or you will lose all access to your site.</strong>"
language/en-GB/en-GB.plg_editors_none.sys.ini000060400000000454152453623440014765 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS_NONE="Editor - None"
PLG_NONE_XML_DESCRIPTION="This loads a basic text entry field."
language/en-GB/en-GB.plg_system_fmalertcookies.ini000060400000036414152453623440016100 0ustar00PLG_SYSTEM_FMALERTCOOKIES="Folcomedia - Plugin alerte utilisation cookies"
PLG_SYSTEM_FMALERTCOOKIES_XML_DESCRIPTION="<b style='color:red'>The fields will appear when the plugin is enabled and saved.</b><br/><br/>
You can add your own CSS rules from editing the file <b style='color:black'>custom.css</b> by going through an FTP program in <b style='color:black'>plugins/system/fmalertcookies/assets/css/custom.css</b><br/><br/>
This plugin is designed to display a message on the home page of your site to alert the user that your site uses cookies to collect other information.<br/><br/>
**** V 1.3.5 ****<br/>
- Fixed a problem with the version of PHP 7.2<br/>
- Added German language (Thomas Sommer).<br/><br/>
**** V 1.3.2 ****<br/>
- Improved SEO preventing spam search engines to index the cookie alert.<br/><br/>
**** V 1.3.1 ****<br/>
- Corrections de bugs.<br/>
- Visual enhancements language tabs.<br/><br/>
**** V 1.3.0 ****<br/>
- The plugin can now block all cookies until the message was not accepted.<br/><br/>
**** V 1.2.15 ****<br/>
- Fixed a problem when SEO the alert was at the top of your page.<br/>
- Possibility to show or not the message when your site is down for maintenance.<br/>
- Added CSS tag to allow you to change the message as you wish.<br/><br/>
**** V 1.2.14 ****<br/>
- Adding a donation button to support the project.<br/>
- Added Hungarian language (Thanks to Zoltan Balazs).<br/>
- Correction W3C.<br/><br/>
**** V 1.2.12 + 1.2.13 ****<br/>
- Plugin Optimization.<br/><br/>
**** V 1.2.11 ****<br/>
- Removing the Bootstrap framework<br/>
- Optimization plugin for compatibility with sites.<br/><br/>
**** V 1.2.10 ****<br/>
- Improves compatibility with other extensions.<br/><br/>
**** V 1.2.9 ****<br/>
- Fixed a erro with W3C.<br/>
- Fixed a bug when importing the file on certain sites.<br/>
- Fixed a bug with lifetime of cookies.<br/><br/>
**** V 1.2.8 ****<br/>
- Fixed a bug with sites which use multiple templates.<br/><br/>
**** V 1.2.7 ****<br/>
- Improved SEO.<br/>
- Improved display of the plugin on mobile.<br/>
- Fixed a problem of alert display pop-up mode on mobile.<br/>
- Added a warning message when your default language of your site is not instantiated in content languages.<br/><br/>
**** V 1.2.6 ****<br/>
- Added a FAQ and Documentation link in the support tab.<br/>
- Various optimizations.<br/><br/>
**** V 1.2.5 ****<br/>
- The warning message does not appear when your site is offline.<br/>
- You can now not charge the Bootsrap library.<br/><br/>
**** V 1.2.4 ****<br/>
- Fixed a bug in pop-up mode.<br/><br/>
**** V 1.2.3 ****<br/>
- Implementation of verifying the presence of a cookie plugin javascript to display or not the message.<br/><br/>
**** V 1.2.2 ****<br/>
- Fixed bug for displaying pop-up.<br/><br/>
**** V 1.2.1 ****<br/>
- Ability to choose the life of the cookie.<br/>
- Ability to choose the background color of the buttons.<br/>
- Fixed the plugin on multi-path sites.<br/><br/>
**** V 1.2.0 ****<br/>
- Added option to transparency of the alert message.<br/>
- You can Show / Hide the alert based languages.<br/>
- You can now Export and Import your setup.<br/><br/>
**** V 1.1.8 ****<br/>
- You can choose to display the alert message on the page explaining the use of cookies.<br/><br/>
**** V 1.1.7 ****<br/>
- Resolution bugs with CSS rules.<br/>
- Choosing the bootstrap version.<br/><br/>
**** V 1.1.6 ****<br/>
- Fixed z-index parameter to display the message above your site.<br/>
- Added a custjoomlaom.css file to add your own CSS rules.<br/><br/>
**** V 1.1.5 ****<br/>
- Set margins around the message.<br/>
- Setting the position of the content.<br/><br/>
**** V 1.1.4 ****<br/>
- Ability to set the warning message on the screen.<br/>
- It is now possible to set the size of the alert message in pixels or percentage.<br/>
- Selection in the order of the buttons.<br/>
- Ability to display buttons line or following text.<br/><br/>
**** V 1.1.3 ****<br/>
- Added multilanguage. <br/><br/>
**** V 1.1.2 ****<br/>
- Improving the timeliness.<br/>
- Fixed bugs."

PLG_SYSTEM_FMALERTCOOKIES_TITLE_PARAMS = "Display"
PLG_SYSTEM_FMALERTCOOKIES_TITLE_BOUTONS = "Buttons"
PLG_SYSTEM_FMALERTCOOKIES_TITLE_SUPPORT = "Support"
PLG_SYSTEM_FMALERTCOOKIES_SAISIE_LANGUE = "&lt;img src=/media/mod_languages/images/%s.gif /&gt;"

PLG_SYSTEM_FMALERTCOOKIES_HEADER_BTN_MORE_LABEL = "<hr><b>button 'More'</b><hr>"
PLG_SYSTEM_FMALERTCOOKIES_HEADER_BTN_CLOSE_LABEL = "<hr><b>Close Button / Accept cookies</b><hr>"
PLG_SYSTEM_FMALERTCOOKIES_HEADER_GENERAL_LABEL = "<hr><b>Generalities</b><hr>"
PLG_SYSTEM_FMALERTCOOKIES_HEADER_BORDURE_LABEL = "<hr><b> Borders</b><hr>"
PLG_SYSTEM_FMALERTCOOKIES_HEADER_ALERTE_LABEL = "<hr><b> Warning message</b><hr>"

PLG_SYSTEM_FMALERTCOOKIES_AJOUTER_JQUERY_LABEL = "Use jQuery (V. 1.11.1)" 
PLG_SYSTEM_FMALERTCOOKIES_AJOUTER_JQUERY_DESC = "This plugin requires the jQuery library to function" 
PLG_SYSTEM_FMALERTCOOKIES_NO_USE_JQUERY_SITE = "No - I prefer to use jQuery already on my site." 
PLG_SYSTEM_FMALERTCOOKIES_YES_USE_JQUERY_PLUGIN = "Yes - I would like this plugin add jQuery."

PLG_SYSTEM_FMALERTCOOKIES_TYPE_AFFICHAGE_LABEL = "Display Mode "
PLG_SYSTEM_FMALERTCOOKIES_TYPE_AFFICHAGE_DESC = "Choose the display mode"
PLG_SYSTEM_FMALERTCOOKIES_POPUP = "Popup"
PLG_SYSTEM_FMALERTCOOKIES_ENCADRE = "Box"

PLG_SYSTEM_FMALERTCOOKIES_TYPE_BORDURE_LABEL = "Type"
PLG_SYSTEM_FMALERTCOOKIES_TYPE_BORDURE_DESC = "Choose the type of border you want to display around your message"
PLG_SYSTEM_FMALERTCOOKIES_ARRONDI = "Rounded"
PLG_SYSTEM_FMALERTCOOKIES_RECTANGULAIRE = "Rectangular"
PLG_SYSTEM_FMALERTCOOKIES_SANS_BORDURE = "None"

PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BORDURE_LABEL = "Size (px)"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BORDURE_DESC = "Choose the size of the borders"

PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BORDURE_LABEL = "Color"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BORDURE_DESC = " Choose the color of your borders "

PLG_SYSTEM_FMALERTCOOKIES_COULEUR_TEXTE_LABEL = "Text color"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_TEXTE_DESC = "Select text color"

PLG_SYSTEM_FMALERTCOOKIES_COULEUR_FOND_LABEL = "Background Color"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_FOND_DESC = "Choose the background color you want to display"

PLG_SYSTEM_FMALERTCOOKIES_POSITION_LABEL = "Position"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_DESC = "If you choose the display mode "Pop-up" it will be centered directly on your page."
PLG_SYSTEM_FMALERTCOOKIES_HAUT = "Top"
PLG_SYSTEM_FMALERTCOOKIES_BAS = "Footer"

PLG_SYSTEM_FMALERTCOOKIES_TEXTE_READMORE_LABEL = "Text button \"<i><b>More</b></i>\""
PLG_SYSTEM_FMALERTCOOKIES_TEXTE_READMORE_DESC = "Select the button text more"

PLG_SYSTEM_FMALERTCOOKIES_LINK_READMORE_MENU_LABEL = "Link button \"<i><b>More</b></i>\""
PLG_SYSTEM_FMALERTCOOKIES_LINK_READMORE_MENU_DESC = "Choose the menu display explanations of uses of your cookies"

PLG_SYSTEM_FMALERTCOOKIES_TEXTE_CLOSE_LABEL = "text button \"<i><b>Close</b></i>\""
PLG_SYSTEM_FMALERTCOOKIES_TEXTE_CLOSE_DESC = "Select the text of the button to close the text"

PLG_SYSTEM_FMALERTCOOKIES_TEXTE_LABEL = "text"
PLG_SYSTEM_FMALERTCOOKIES_TEXTE_DESC = "Text to be displayed to inform your visitors that your site uses cookies."

PLG_SYSTEM_FMALERTCOOKIES_TAILLE_CADRE_LABEL = "Size of alert (px / %)"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_CADRE_DESC = "Frame size.<br/>Remember to put either px or % at the end of your value.<br/>Default size is in pixels (px)"

PLG_SYSTEM_FMALERTCOOKIES_BTN_MORE_LABEL = "Display"
PLG_SYSTEM_FMALERTCOOKIES_BTN_MORE_DESC = "Display the button 'More'"

PLG_SYSTEM_FMALERTCOOKIES_BTN_CLOSE_LABEL = "Display"
PLG_SYSTEM_FMALERTCOOKIES_BTN_CLOSE_DESC = "Show the 'Close' button"

;BTN
PLG_SYSTEM_FMALERTCOOKIES_FIRST_BTN_LABEL = "Order of buttons"
PLG_SYSTEM_FMALERTCOOKIES_FIRST_BTN_DESC = "Choose the order of the buttons"
PLG_SYSTEM_FMALERTCOOKIES_FIRST_BTN_CLOSE = "The Button \"Close\" first"
PLG_SYSTEM_FMALERTCOOKIES_FIRST_BTN_MORE = "The Button \"More\" first"

PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_LABEL = "Position of buttons"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_DESC = "Select available are buttons from the text."
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_A_LA_LIGNE = "Wrap"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_MEME_LIGNE = "On the same line as the text"


PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_LARGE = "Close"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_DEFAULT = " Normal"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_SMALL = "Small"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_MINI = "Tiny"

PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_CENTRER = "Center"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_GAUCHE = "Left"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_DROITE = "Right"

PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_DEFAULT = "Gray"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_BLEU_FONCE = " Dark Blue "
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_BLEU_CLAIR = " Light Blue "
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_VERT = "Green"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_ORANGE = "Orange"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_ROUGE = "Red"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_NOIR = " Black"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_RIEN = "None / Link"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_CUSTOM = "Custom"

;MORE BTN
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_MORE_LABEL = "Position"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_MORE_DESC = "Positioning the 'Close' button"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_MORE_LABEL = "Size"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_MORE_DESC = "Size of your button"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_MORE_LABEL = "Theme"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_MORE_DESC = "Background color of your button"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_TEXTE_MORE_LABEL = "Text Color"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_TEXTE_MORE_DESC = "Text color of your button"
PLG_SYSTEM_FMALERTCOOKIES_ANCRE_LINK_READMORE_MENU_LABEL = "Anchor"
PLG_SYSTEM_FMALERTCOOKIES_ANCRE_LINK_READMORE_MENU_DESC = "If you have a specific anchor on the page , you can learn here."

;BTN CLOSE
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_CLOSE_LABEL = "Position"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_CLOSE_DESC = "Positioning the 'Close' button"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_CLOSE_LABEL = "Size"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_CLOSE_DESC = "Size of your button"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_CLOSE_LABEL = "Theme"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_CLOSE_DESC = "Background color of your button"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_TEXTE_CLOSE_LABEL = "Text Color"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_TEXTE_CLOSE_DESC = "text color of your button"

;SUPPORT
PLG_SYSTEM_FMALERTCOOKIES_SUPPORT_LABEL = "<b>Folcomedia</b><br/><br/>
<u>Mail :</u><br/><a href='mailto:contact@folcomedia.fr'>contact@folcomedia.fr</a><br/><br/>
<u>Phone :</u><br/>+33(0)4 48 06 00 96<br/><br/>
<u>Website:</u><br/><a target='_blank' href='http://www.folcomedia.fr'>http://www.folcomedia.fr</a><br/><br/>
<u>Comment :</u><br/><a target='_blank' href='http://extensions.joomla.org/extensions/site-management/cookie-control/27308?qh=YToxOntpOjA7czoxMDoiZm9sY29tZWRpYSI7fQ%3D%3D'>http://extensions.joomla.org</a><br/><br/>
<u>Note :</u><br/>If you want to take advantage of new features in this plugin, thank you for contacting us.<br/><br/>
<u>Translate :</u><br/>If you want to help us translating this extension in your language, thank you for contacting us.<br/><br/>
<u>Gifts :</u><br/>You can make a donation to support the project <br/> You can very well use this plugin without spending money.<br/>"

PLG_SYSTEM_FMALERTCOOKIES_MYLANGUAGE_LABEL = "Default Language"
PLG_SYSTEM_FMALERTCOOKIES_MYLANGUAGE_DESC = "Displays the text of the default language in case you have not completed the text of other languages."

PLG_SYSTEM_FMALERTCOOKIES_POSITION_FIXE_LABEL = "fixed position"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_FIXE_DESC = "Allows the frame to stay displayed on the screen m ^ me on the elevator you move your browser"

PLG_SYSTEM_FMALERTCOOKIES_MARGE_EXT_LABEL = "Outer margins (px)"
PLG_SYSTEM_FMALERTCOOKIES_MARGE_EXT_DESC = "Fill the outer margins of the size you want"

PLG_SYSTEM_FMALERTCOOKIES_POSITION_CONTENU_LABEL = "Position of content"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_CONTENU_DESC = "Position Message Content + buttons"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_CONTENU_CENTRER = "Center"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_CONTENU_GAUCHE = "Left"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_CONTENU_DROITE = "Right"

PLG_SYSTEM_FMALERTCOOKIES_MARGE_INT_LABEL = "Interior Margins (px)"
PLG_SYSTEM_FMALERTCOOKIES_MARGE_INT_DESC = "Fill the size of inland margins you want"

PLG_SYSTEM_FMALERTCOOKIES_UTILISER_BOOTSTRAP_LABEL = "Version of Bootstrap"
PLG_SYSTEM_FMALERTCOOKIES_UTILISER_BOOTSTRAP_DESC = "At some sites, the jQuery version is too old bootstrap version 3 will not be compatible, that is why it will take you choose the version 2."
PLG_SYSTEM_FMALERTCOOKIES_UTILISER_BOOTSTRAP_VERSION_NONE = "None"
PLG_SYSTEM_FMALERTCOOKIES_UTILISER_BOOTSTRAP_VERSION2 = "Bootstrap 2"
PLG_SYSTEM_FMALERTCOOKIES_UTILISER_BOOTSTRAP_VERSION3 = "Bootstrap 3"

PLG_SYSTEM_FMALERTCOOKIES_AFFICHAGE_MSG_PAGE_COOKIE_DESC = "Do you want to show the warning message on the same page explaining the use of cookies after clicking the button \" More \""
PLG_SYSTEM_FMALERTCOOKIES_AFFICHAGE_MSG_PAGE_COOKIE_LABEL = "Show message"
PLG_SYSTEM_FMALERTCOOKIES_AFFICHAGE_MSG_PAGE_COOKIE_ALL_PAGES = "On all pages of the site"
PLG_SYSTEM_FMALERTCOOKIES_AFFICHAGE_MSG_PAGE_COOKIE_NOT_ALL_PAGES = "On all pages of the site except the page explaining the use of cookies"

PLG_SYSTEM_FMALERTCOOKIES_NUM_OPACITY_LABEL = "Transparency"
PLG_SYSTEM_FMALERTCOOKIES_NUM_OPACITY_DESC = "Display the alert transparent.<br/>0 = Transparent<br/>100 = Opaque"

PLG_SYSTEM_FMALERTCOOKIES_UPLOAD = "Export Configuration"
PLG_SYSTEM_FMALERTCOOKIES_IMPORT = "Import Settings"
PLG_SYSTEM_FMALERTCOOKIES_CONF_UPLOAD_OK = "Configuration imported successfully."
PLG_SYSTEM_FMALERTCOOKIES_CONF_UPLOAD_KO = "An error occurred while importing the configuration file."

PLG_SYSTEM_FMALERTCOOKIES_LANGUE_ACTIVATE_DESC = "Show or hide the warning message when the visitor is on the site with this language."
PLG_SYSTEM_FMALERTCOOKIES_LANGUE_ACTIVATE_LABEL = "Alert message"

;V1.2.1
PLG_SYSTEM_FMALERTCOOKIES_DUREE_COOKIE_LABEL = "Lifetime of cookie (day)"
PLG_SYSTEM_FMALERTCOOKIES_DUREE_COOKIE_DESC = "Choose the life of the cookie in the day, arrived at that date a new request will be via the alert message."

PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_CLOSE_CUSTOM_LABEL = "Color custom button"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_CLOSE_CUSTOM_DESC = "If you choose \"Custom\" in the choice of the theme of the button, the color you have chosen will be considered."

PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_MORE_CUSTOM_LABEL = "Color custom button"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_MORE_CUSTOM_DESC = "If you choose \"Custom\" in the choice of the theme of the button, the color you have chosen will be considered."

;V1.2.15
PLG_SYSTEM_FMALERTCOOKIES_DISPLAY_OFFLINE = "Show message site offline"
PLG_SYSTEM_FMALERTCOOKIES_DISPLAY_OFFLINE_DESC = "You can choose to display the warning message even if your site is down for maintenance"

;V1.3.0
PLG_SYSTEM_FMALERTCOOKIES_DELETE_COOKIE = "Block cookies"
PLG_SYSTEM_FMALERTCOOKIES_DELETE_COOKIE_DESC = "Would you like the plugin block all cookies from the site as the alert was not accepted?"

;1.3.2
PLG_SYSTEM_FMALERTCOOKIES_TITLE_SEO = "SEO"
PLG_SYSTEM_FMALERTCOOKIES_USER_AGENT_LABEL = "Protecting Your SEO"
PLG_SYSTEM_FMALERTCOOKIES_USER_AGENT_DESC = "The plugin will prevent search engine robots above to see the banner cookies when they visit your site."language/en-GB/en-GB.plg_content_joomla.sys.ini000060400000000615152453623440015307 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CONTENT_JOOMLA="Content - Joomla"
PLG_CONTENT_JOOMLA_XML_DESCRIPTION="This plugin does category processing for core extensions; sends an email when new article is submitted in the Frontend."language/en-GB/en-GB.plg_fields_url.ini000060400000001155152453623440013607 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_URL="Fields - URL"
PLG_FIELDS_URL_LABEL="URL (%s)"
PLG_FIELDS_URL_PARAMS_RELATIVE_DESC="Are relative URLs allowed."
PLG_FIELDS_URL_PARAMS_RELATIVE_LABEL="Relative"
PLG_FIELDS_URL_PARAMS_SCHEMES_DESC="The allowed schemes."
PLG_FIELDS_URL_PARAMS_SCHEMES_LABEL="Schemes"
PLG_FIELDS_URL_XML_DESCRIPTION="This plugin lets you create new fields of type 'URL' in any extensions where custom fields are supported."
language/en-GB/en-GB.com_fields.sys.ini000060400000000437152453623440013540 0ustar00; Joomla! Project
; (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_FIELDS="Fields"
COM_FIELDS_XML_DESCRIPTION="Component to manage custom fields."
language/en-GB/en-GB.mod_toolbar.ini000060400000000535152453623440013117 0ustar00; Joomla! Project
; (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_TOOLBAR="Toolbar"
MOD_TOOLBAR_XML_DESCRIPTION="This module shows the toolbar icons used to control actions throughout the Administrator area."language/en-GB/en-GB.plg_fields_imagelist.sys.ini000060400000000614152453623440015577 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_IMAGELIST="Fields - Imagelist"
PLG_FIELDS_IMAGELIST_XML_DESCRIPTION="This plugin lets you create new fields of type 'imagelist' in any extensions where custom fields are supported."
language/en-GB/en-GB.ini000060400000173414152453623440010626 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

; Common boolean values
; Note: YES, NO, TRUE, FALSE are reserved words in INI format.

; Keep this string on top
JERROR_PARSING_LANGUAGE_FILE="&#160;: error(s) in line(s) %s"

J1="1"
J2="2"
J3="3"
J4="4"
J5="5"
J6="6"
J7="7"
J8="8"
J9="9"
J10="10"
J15="15"
J20="20"
J25="25"
J30="30"
J50="50"
J75="75"
J100="100"
J150="150"
J200="200"
J250="250"
J300="300"
J500="500"

JH1="h1"
JH2="h2"
JH3="h3"
JH4="h4"
JH5="h5"
JH6="h6"

ERROR="Error"
INFO="Info"
MESSAGE="Message"
NOTICE="Notice"
WARNING="Warning"

JADMINISTRATION="Administration"
JADMINISTRATOR="Administrator"
JALL="All"
JALL_LANGUAGE="All"
JAPPLY="Save"
JARCHIVED="Archived"
JAUTHOR="Author"
JAUTHOR_ASC="Author ascending"
JAUTHOR_DESC="Author descending"
JASSOCIATIONS_ASC="Associations ascending"
JASSOCIATIONS_DESC="Associations descending"
JCANCEL="Cancel"
JCATEGORIES="Categories"
JCATEGORY="Category"
JCATEGORY_ASC="Category ascending"
JCATEGORY_DESC="Category descending"
JCATEGORY_SPRINTF="Category: %s"
JCLEAR="Clear"
JCLIENT="Location"
JCONFIG_PERMISSIONS_DESC="Default permissions used for all content in this component."
JCONFIG_PERMISSIONS_LABEL="Permissions"
JCURRENT="Current"
JDATE="Date"
JDATE_ASC="Date ascending"
JDATE_DESC="Date descending"
JDAY="Day"
JDEFAULT="Default"
JDEFAULTLANGUAGE="Language - Default"
JDETAILS="Details"
JDISABLED="Disabled"
JENABLED="Enabled"
JFALSE="False"
JFEATURED="Featured"
JFEATURED_ASC="Featured ascending"
JFEATURED_DESC="Featured descending"
JUNFEATURED="Unfeatured"
JFEATURE="Feature"
JUNFEATURE="Unfeature"
JHELP="Help"
JHIDE="Hide"
JINVALID_TOKEN="The most recent request was denied because it had an invalid security token. Please refresh the page and try again."
JINVALID_TOKEN_NOTICE="The security token did not match. The request was aborted to prevent any security breach. Please try again."
JLOGIN="Log in"
JLOGOUT="Log out"
JMENU_MULTILANG_WARNING_MISSING_MODULES="An administrator menu module for <strong>%s</strong> does not exist. <br>Create a custom administrator menu and module for each administrator language or publish a menu module set to All languages."
JMODIFY="Modify"
JMONTH="Month"
JMONTH_PUBLISHED="Month (published)"
JNEVER="Never"
JNEXT="Next"
JNEXT_TITLE="Next article: %s"
JNO="No"
JNONE="None"
JOFF="Off"
JON="On"
JONLY="Only"
JOPTIONS="Options"
JPREV="Prev"
JPREVIOUS="Previous"
JPREVIOUS_TITLE="Previous article: %s"
JPROTECTED="Protected"
JPUBLISHED="Published"
JRECORD_NUMBER="Record Number"
JREGISTER="Register"
JORDERINGDISABLED="Please sort by order to enable reordering"
JSAVE="Save &amp; Close"
JSELECT="Select"
JSTATUS="Status"
JSTATUS_ASC="Status ascending"
JSTATUS_DESC="Status descending"
JSHOW="Show"
JSITE="Site"
JSUBMIT="Submit"
JTAG="Tags"
JTAG_DESC="Assign tags to content items. You may select a tag from the pre-defined list or enter a new tag by typing the name in the field and pressing enter."
JTAG_FIELD_SELECT_DESC="Select the tag to use."
JTOOLBAR="Toolbar"
JTRASH="Trash"
JTRASHED="Trashed"
JTRUE="True"
JUNARCHIVE="Remove from archive status"
JUNDEFINED="Undefined"
JUNPROTECTED="Unprotected"
JUNPUBLISHED="Unpublished"
JYEAR="Year"
JVERSION="Version"
JYES="Yes"
JACTIONS="Actions for: %s"

JACTION_ADMIN="Configure ACL & Options"
JACTION_ADMIN_COMPONENT_DESC="Allows users in the group to edit the options and permissions of this extension."
JACTION_ADMIN_GLOBAL="Super User"
JACTION_ADMIN_GLOBAL_DESC="Allows users in the group to perform any action regardless of the settings."
JACTION_COMPONENT_SETTINGS="Component Settings"
JACTION_CREATE="Create"
JACTION_CREATE_COMPONENT_DESC="Allows users in the group to create any content in this extension."
JACTION_DELETE="Delete"
JACTION_DELETE_COMPONENT_DESC="Allows users in the group to delete any content in this extension."
JACTION_EDIT="Edit"
JACTION_EDIT_COMPONENT_DESC="Allows users in the group to edit any content in this extension."
JACTION_EDITOWN="Edit Own"
JACTION_EDITOWN_COMPONENT_DESC="Allows users in the group to edit any content they submitted in this extension."
JACTION_EDITVALUE="Edit Custom Field Value"
JACTION_EDITVALUE_COMPONENT_DESC="Allows users in the group to edit any value of custom fields submitted in this extension."
JACTION_EDITSTATE="Edit State"
JACTION_EDITSTATE_COMPONENT_DESC="Allows users in the group to change the state of any content in this extension."
JACTION_LOGIN_ADMIN="Administrator Login"
JACTION_LOGIN_OFFLINE="Offline Access"
JACTION_LOGIN_SITE="Site Login"
JACTION_MANAGE="Access Administration Interface"
JACTION_MANAGE_COMPONENT_DESC="Allows users in the group to access the administration interface for this extension."
JACTION_OPTIONS="Configure Options Only"
JACTION_OPTIONS_COMPONENT_DESC="Allows users in the group to edit the options except the permissions of this extension."

JBROWSERTARGET_MODAL="Modal"
JBROWSERTARGET_NEW="Open in new window"
JBROWSERTARGET_PARENT="Open in parent window"
JBROWSERTARGET_POPUP="Open in popup"

JERROR_ALERTNOAUTHOR="You are not authorised to view this resource."
JERROR_ALERTNOTEMPLATE="The template for this display is not available."
JERROR_AN_ERROR_HAS_OCCURRED="An error has occurred."
JERROR_CORE_CREATE_NOT_PERMITTED="Create not permitted."
JERROR_CORE_DELETE_NOT_PERMITTED="Delete not permitted."
JERROR_COULD_NOT_FIND_TEMPLATE="Could not find template "_QQ_"%s"_QQ_"."
JERROR_INVALID_CONTROLLER="Invalid controller"
JERROR_INVALID_CONTROLLER_CLASS="Invalid controller class"
JERROR_LAYOUT_PREVIOUS_ERROR="Previous Error"
JERROR_LOADFILE_FAILED="Error loading form file"
JERROR_LOADING_MENUS="Error loading Menus: %s"
JERROR_LOGIN_DENIED="You do not have access to the Administrator section of this site."
JERROR_MAGIC_QUOTES="Your host needs to disable magic_quotes_gpc to run this version of Joomla!"
JERROR_NO_ITEMS_SELECTED="No item(s) selected."
JERROR_NOLOGIN_BLOCKED="Login denied! Your account has either been blocked or you have not activated it yet."
JERROR_SENDING_EMAIL="Email could not be sent."
JERROR_SESSION_STARTUP="Error starting the session."
JERROR_SAVE_FAILED="Could not save data. Error: %s"

JFIELD_ACCESS_DESC="The access level group that is allowed to view this item."
JFIELD_ACCESS_LABEL="Access"
JFIELD_ALIAS_DESC="The Alias will be used in the SEF URL. Leave this blank and Joomla will fill in a default value from the title. This value will depend on the SEO settings (Global Configuration->Site). <br />Using Unicode will produce UTF-8 aliases. You may also enter manually any UTF-8 character. Spaces and some forbidden characters will be changed to hyphens.<br />When using default transliteration it will produce an alias in lower case and with dashes instead of spaces. You may enter the Alias manually. Use lowercase letters and hyphens (-). No spaces or underscores are allowed. Default value will be a date and time if the title is typed in non-latin letters."
JFIELD_ALIAS_LABEL="Alias"
JFIELD_ALIAS_PLACEHOLDER="Auto-generate from title"
JFIELD_ALT_COMPONENT_LAYOUT_DESC="Use a layout from the supplied component view or overrides in the templates."
JFIELD_ALT_LAYOUT_LABEL="Layout"
JFIELD_ALT_MODULE_LAYOUT_DESC="Use a layout from the supplied module or overrides in the templates."
JFIELD_ALT_PAGE_TITLE_DESC="An optional alternative page title to set that will change the TITLE tag in the HTML output."
JFIELD_ALT_PAGE_TITLE_LABEL="Alternative Page Title"
JFIELD_ASSET_ID_DESC="Asset ID"
JFIELD_ASSET_ID_LABEL="Asset ID"
JFIELD_BASIS_LOGIN_DESCRIPTION_DESC="Text to display on login page."
JFIELD_BASIS_LOGIN_DESCRIPTION_LABEL="Login Description Text"
JFIELD_BASIS_LOGIN_DESCRIPTION_SHOW_DESC="Show or hide login description."
JFIELD_BASIS_LOGIN_DESCRIPTION_SHOW_LABEL="Login Description"
JFIELD_BASIS_LOGOUT_DESCRIPTION_DESC="Text for logout page."
JFIELD_BASIS_LOGOUT_DESCRIPTION_LABEL="Logout Description Text"
JFIELD_BASIS_LOGOUT_DESCRIPTION_SHOW_DESC="Show or hide logout description."
JFIELD_BASIS_LOGOUT_DESCRIPTION_SHOW_LABEL="Logout Description"
JFIELD_CATEGORY_DESC="The category that this item is assigned to. You may select an existing category or enter a new category by typing the name in the field and pressing enter."
JFIELD_DISPLAY_READONLY_DESC="Whether to display the field on forms when read-only. Inherit defaults to value set in field group."
JFIELD_DISPLAY_READONLY_LABEL="Display When Read-Only"
JFIELD_ENABLED_DESC="The enabled status of this item."
JFIELD_FIELDS_CATEGORY_DESC="Select the category that this field is assigned to."
JFIELD_KEY_REFERENCE_DESC="Used to store information referring to an external resource."
JFIELD_KEY_REFERENCE_LABEL="Key Reference"
JFIELD_LANGUAGE_DESC="Assign a language to this article."
JFIELD_LANGUAGE_LABEL="Language"
JFIELD_LOGIN_IMAGE_DESC="Select or upload an image to display on login page."
JFIELD_LOGIN_IMAGE_LABEL="Login Image"
JFIELD_LOGIN_REDIRECT_URL_DESC="If a URL is entered here, users will be redirected to it after login.<br />The URL must be internal (eg: index.php?Itemid=999)."
JFIELD_LOGIN_REDIRECT_URL_LABEL="Login Redirect"
JFIELD_LOGOUT_IMAGE_DESC="Select or upload an image to display on logout page."
JFIELD_LOGOUT_IMAGE_LABEL="Logout Image"
JFIELD_LOGOUT_REDIRECT_URL_DESC="If a URL is entered here, users will be redirected to it after logout.<br />The URL must be internal (eg: index.php?Itemid=999)."
JFIELD_LOGOUT_REDIRECT_URL_LABEL="Logout Redirect"
JFIELD_LOGOUT_REDIRECT_PAGE_DESC="Select or create the page the user will be redirected to after ending their current session by logging out. The default is to stay on the same page."
JFIELD_LOGOUT_REDIRECT_PAGE_LABEL="Logout Redirection Page"
JFIELD_META_DESCRIPTION_DESC="An optional paragraph to be used as the description of the page in the HTML output. This will generally display in the results of search engines."
JFIELD_META_DESCRIPTION_LABEL="Meta Description"
JFIELD_META_KEYWORDS_DESC="An optional comma-separated list of keywords and/or phrases to be used in the HTML output."
JFIELD_META_KEYWORDS_LABEL="Meta Keywords"
JFIELD_META_RIGHTS_DESC="Describe what rights others have to use this content."
JFIELD_META_RIGHTS_LABEL="Content Rights"
JFIELD_METADATA_AUTHOR_DESC="The author of this content."
JFIELD_METADATA_RIGHTS_DESC="Publication rights for the content."
JFIELD_METADATA_RIGHTS_LABEL="Rights"
JFIELD_METADATA_ROBOTS_DESC="Robots instructions."
JFIELD_METADATA_ROBOTS_LABEL="Robots"
JFIELD_METADATA_XREFERENCE_DESC="An optional reference used to link to external data sources."
JFIELD_METADATA_XREFERENCE_LABEL="Cross Reference"
JFIELD_MODULE_LANGUAGE_DESC="Assign a language to this module."
JFIELD_NAME_DESC="The name will be used to identify the field. Leave this blank and Joomla will fill in a default value from the title."
JFIELD_NAME_LABEL="Name"
JFIELD_NAME_PLACEHOLDER="Auto-generate from title"
JFIELD_NOTE_DESC="Note"
JFIELD_NOTE_LABEL="Note"
JFIELD_OPTION_NONE="None"
JFIELD_ORDERING_DESC="Select the ordering."
JFIELD_ORDERING_LABEL="Ordering"
JFIELD_PARAMS_LABEL="Options"
JFIELD_PLG_SEARCH_ALL_DESC="Include published items in the search."
JFIELD_PLG_SEARCH_ALL_LABEL="Search Published"
JFIELD_PLG_SEARCH_ARCHIVED_DESC="Include archived items in the search."
JFIELD_PLG_SEARCH_ARCHIVED_LABEL="Search Archived"
JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC="Sets the maximum number of results to return."
JFIELD_PLG_SEARCH_SEARCHLIMIT_LABEL="Search Limit"
JFIELD_PUBLISHED_DESC="Set publication status."
JFIELD_READMORE_DESC="Add a custom text instead of Read More."
JFIELD_READMORE_LABEL="Read More Text"
JFIELD_SPACER_LABEL="<span style="_QQ_"width:auto"_QQ_"><hr /></span>"
JFIELD_TITLE_DESC="Title"
JFIELD_VERSION_HISTORY_DESC="This button allows you to open a window to view older versions of this item."
JFIELD_VERSION_HISTORY_LABEL="Prior Versions"
JFIELD_VERSION_HISTORY_SELECT="View Prior Versions"
JFIELD_XREFERENCE_DESC="An optional field to allow this record to be cross-referenced to an external data system if required."
JFIELD_XREFERENCE_LABEL="External Reference"
JGLOBAL_ACROSS="Across"
JGLOBAL_ACTION_PERMISSIONS_LABEL="Permissions"
JGLOBAL_ACTION_PERMISSIONS_DESCRIPTION="Set the action permissions for this asset"
JGLOBAL_ADD_CUSTOM_CATEGORY="Add new Category"
JGLOBAL_ALL_ARTICLE="Max Levels Articles"
JGLOBAL_ALL_LIST="Max Levels as List"
JGLOBAL_ALLOW_COMMENTS_DESC="If Yes, viewers will be able to add and view comments for the article."
JGLOBAL_ALLOW_COMMENTS_LABEL="Allow Comments"
JGLOBAL_ALLOW_RATINGS_DESC="If Yes, viewers will be able to add and view ratings for the article."
JGLOBAL_ALLOW_RATINGS_LABEL="Allow Ratings"
JGLOBAL_ARCHIVE_ARTICLES_FIELD_INTROTEXTLIMIT_DESC="Please enter in a numeric character limit value. The introtext will be trimmed to the number of characters you enter."
JGLOBAL_ARCHIVE_ARTICLES_FIELD_INTROTEXTLIMIT_LABEL="Intro text Limit"
JGLOBAL_ARCHIVE_OPTIONS="Archive"
JGLOBAL_ARTICLE_COUNT_DESC="Show or hide a count of articles in each category."
JGLOBAL_ARTICLE_COUNT_LABEL="Article Count"
JGLOBAL_ARTICLE_MANAGER_ORDER="Ordering"
JGLOBAL_ARTICLE_MANAGER_REVERSE_ORDER="Ordering Reverse"
JGLOBAL_ARTICLE_ORDER_DESC="The order that articles will show in."
JGLOBAL_ARTICLE_ORDER_LABEL="Article Order"
JGLOBAL_ARTICLES="Articles"
JGLOBAL_ASSOC_NOT_POSSIBLE="To define associations, please make sure the item language is not set to 'All'."
JGLOBAL_ASSOCIATIONS_NEW_ITEM_WARNING="To create associations, first save the item."
JGLOBAL_ASSOCIATIONS_PROPAGATE_BUTTON="Propagate"
JGLOBAL_ASSOCIATIONS_PROPAGATE_FAILED="Failed propagating associations. You may have to select or create them manually."
JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_ALL="All existing associations have been set."
JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_NONE="No associations exist to propagate."
JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_SOME="Associations have been set for: %s"
JGLOBAL_ASSOCIATIONS_PROPAGATE_TIP="Propagates this item's existing associations."
JGLOBAL_ASSOCIATIONS_RESET_WARNING="The language has been changed. If you save this item again it will reset the available associations. If this was not intended, close the item."
JGLOBAL_AUTH_ACCESS_DENIED="Access Denied"
JGLOBAL_AUTH_ACCESS_GRANTED="Access Granted"
JGLOBAL_AUTH_BIND_FAILED="Failed binding to LDAP server"
JGLOBAL_AUTH_CANCEL="Authentication cancelled"
JGLOBAL_AUTH_CURL_NOT_INSTALLED="Curl isn't installed"
JGLOBAL_AUTH_EMPTY_PASS_NOT_ALLOWED="Empty password not allowed."
JGLOBAL_AUTH_FAIL="Authentication failed"
JGLOBAL_AUTH_FAILED="Failed to authenticate: %s"
JGLOBAL_AUTH_INCORRECT="Incorrect username/password"
JGLOBAL_AUTH_INVALID_PASS="Username and password do not match or you do not have an account yet."
JGLOBAL_AUTH_INVALID_SECRETKEY="The two factor authentication Secret Key is invalid."
; The following 2 strings are deprecated and will be removed with 4.0.
JGLOBAL_AUTH_NO_BIND="Unable to bind to LDAP"
JGLOBAL_AUTH_NO_CONNECT="Unable to connect to LDAP server"
JGLOBAL_AUTH_NO_REDIRECT="Could not redirect to server: %s"
JGLOBAL_AUTH_NO_USER="Username and password do not match or you do not have an account yet."
JGLOBAL_AUTH_NOT_CONNECT="Unable to connect to authentication service."
JGLOBAL_AUTH_NOT_CREATE_DIR="Could not create the FileStore folder %s. Please check the effective permissions."
JGLOBAL_AUTH_PASS_BLANK="LDAP can't have blank password"
JGLOBAL_AUTH_UNKNOWN_ACCESS_DENIED="Result Unknown. Access Denied"
JGLOBAL_AUTH_USER_BLACKLISTED="User is blacklisted."
JGLOBAL_AUTH_USER_NOT_FOUND="Unable to find user."
JGLOBAL_AUTHOR_ALPHABETICAL="Author Alphabetical"
JGLOBAL_AUTHOR_REVERSE_ALPHABETICAL="Author Reverse Alphabetical"
JGLOBAL_AUTO="Auto"
JGLOBAL_BATCH_MOVE_PARENT_NOT_FOUND="Can't find the destination parent for this move."
JGLOBAL_BATCH_MOVE_ROW_NOT_FOUND="Can't find the destination row for this move."
JGLOBAL_BATCH_PROCESS="Process"
JGLOBAL_BLOG="Blog"
JGLOBAL_BLOG_LAYOUT_OPTIONS="Blog Layout"
JGLOBAL_CATEGORIES_OPTIONS="Categories"
JGLOBAL_CATEGORY_LAYOUT_DESC="Layout"
JGLOBAL_CATEGORY_LAYOUT_LABEL="Choose a Layout"
JGLOBAL_CATEGORY_MANAGER_ORDER="Category Order"
JGLOBAL_CATEGORY_NOT_FOUND="Category not found"
JGLOBAL_CATEGORY_OPTIONS="Category"
JGLOBAL_CATEGORY_ORDER_DESC="The order that categories will show in."
JGLOBAL_CATEGORY_ORDER_LABEL="Category Order"
JGLOBAL_CENTER="Center"
JGLOBAL_CHECK_ALL="Check All Items"
JGLOBAL_CHOOSE_CATEGORY_DESC="Select or create a category to be displayed."
JGLOBAL_CHOOSE_CATEGORY_LABEL="Choose a Category"
JGLOBAL_CHOOSE_COMPONENT_DESC="Choose a component from the list."
JGLOBAL_CHOOSE_COMPONENT_LABEL="Choose a component"
JGLOBAL_CLICK_TO_SORT_THIS_COLUMN="Select to sort by this column"
JGLOBAL_CLICK_TO_TOGGLE_STATE="Select icon to toggle state."
JGLOBAL_CONFIRM_DELETE="Are you sure you want to delete? Confirming will permanently delete the selected item(s)!"
JGLOBAL_COPY="(copy)"
JGLOBAL_CREATED="Created"
JGLOBAL_CREATED_DATE="Created Date"
JGLOBAL_CUSTOM_CATEGORY="New Categories"
JGLOBAL_CUSTOM_FIELDS_ENABLE_DESC="Enable the creation of custom fields."
JGLOBAL_CUSTOM_FIELDS_ENABLE_LABEL="Enable Custom Fields"
JGLOBAL_DATE_FORMAT_DESC="Optional format string for showing the date. For example, D M Y for day month year or you can use d-m-y for a short version eg. 28-12-16. See https://php.net/date. If left blank, it uses DATE_FORMAT_LC1 from your language file."
JGLOBAL_DATE_FORMAT_LABEL="Date Format"
JGLOBAL_DESCRIPTION="Description"
JGLOBAL_DISPLAY_NUM="Display #"
JGLOBAL_DISPLAY_SELECT_DESC="Show or hide the Display Select dropdown listbox."
JGLOBAL_DISPLAY_SELECT_LABEL="Display Select"
JGLOBAL_DOWN="Down"
JGLOBAL_EDIT_ITEM="Edit item"
JGLOBAL_EDIT_PREFERENCES="Edit Preferences"
JGLOBAL_EMAIL="Email"
JGLOBAL_EMAIL_DOMAIN_NOT_ALLOWED="The email domain <strong>%s</strong> is not allowed. Please enter another email address."
JGLOBAL_EMPTY_CATEGORIES_DESC="Show or hide categories that have no articles and no subcategories."
JGLOBAL_EMPTY_CATEGORIES_LABEL="Empty Categories"
JGLOBAL_ERROR_INSUFFICIENT_BATCH_INFORMATION="Insufficient information to perform the batch operation"
JGLOBAL_FEED_SHOW_READMORE_DESC="Displays a &quot;Read More&quot; link in the news feeds if Intro Text is set to Show."
JGLOBAL_FEED_SHOW_READMORE_LABEL="Show &quot;Read More&quot;"
JGLOBAL_FEED_SUMMARY_DESC="If set to Intro Text, only the Intro Text of each article will show in the news feed. If set to Full Text, the whole article will show in the news feed."
JGLOBAL_FEED_SUMMARY_LABEL="Include in Feed"
JGLOBAL_FEED_TITLE="News Feeds"
JGLOBAL_FIELDS="Fields"
JGLOBAL_FIELDS_TITLE="Custom Fields"
JGLOBAL_FIELD_ADD="Add"
JGLOBAL_FIELD_GROUPS="Field Groups"
JGLOBAL_FIELD_CATEGORIES_CHOOSE_CATEGORY_DESC="Categories that are within this category will be displayed."
JGLOBAL_FIELD_CATEGORIES_CHOOSE_CATEGORY_LABEL="Select a Top Level Category"
JGLOBAL_FIELD_CATEGORIES_DESC_DESC="If you enter some text in this field, it will replace the Top Level Category Description, if it has one."
JGLOBAL_FIELD_CATEGORIES_DESC_LABEL="Alternative Description"
JGLOBAL_FIELD_CREATED_BY_ALIAS_DESC="Uses another name than the author's for display."
JGLOBAL_FIELD_CREATED_BY_ALIAS_LABEL="Author's Alias"
JGLOBAL_FIELD_CREATED_BY_DESC="The user who created this."
JGLOBAL_FIELD_CREATED_BY_LABEL="Created By"
JGLOBAL_FIELD_CREATED_DESC="Created Date."
JGLOBAL_FIELD_CREATED_LABEL="Created Date"
JGLOBAL_FIELD_FIELD_CACHETIME_DESC="The number of minutes before the cache is refreshed."
JGLOBAL_FIELD_FIELD_ORDERING_LABEL="Order"
JGLOBAL_FIELD_FIELD_ORDERING_DESC="Order items will be displayed in."
JGLOBAL_FIELD_ID_DESC="Record number in the database."
JGLOBAL_FIELD_ID_LABEL="ID"
JGLOBAL_FIELD_LAYOUT_DESC="Default layout to use for items."
JGLOBAL_FIELD_LAYOUT_LABEL="Choose a Layout"
JGLOBAL_FIELD_MODIFIED_LABEL="Modified Date"
JGLOBAL_FIELD_MODIFIED_BY_DESC="The user who did the last modification."
JGLOBAL_FIELD_MODIFIED_BY_LABEL="Modified By"
JGLOBAL_FIELD_MOVE="Move"
JGLOBAL_FIELD_NUM_CATEGORY_ITEMS_DESC="Number of categories to display for each level."
JGLOBAL_FIELD_NUM_CATEGORY_ITEMS_LABEL="Number of Categories"
JGLOBAL_FIELD_PUBLISH_DOWN_DESC="An optional date to stop publishing."
JGLOBAL_FIELD_PUBLISH_DOWN_LABEL="Finish Publishing"
JGLOBAL_FIELD_PUBLISH_UP_DESC="An optional date to start publishing."
JGLOBAL_FIELD_PUBLISH_UP_LABEL="Start Publishing"
JGLOBAL_FIELD_REMOVE="Remove"
JGLOBAL_FIELD_SHOW_BASE_DESCRIPTION_DESC="Show description of the top level category or alternatively replace with the text from the description field found in the menu item. If using Root as a top level category, the description field has to be filled."
JGLOBAL_FIELD_SHOW_BASE_DESCRIPTION_LABEL="Top Level Category Description"
JGLOBAL_FIELD_VERSION_NOTE_DESC="Enter an optional note for this version of the item."
JGLOBAL_FIELD_VERSION_NOTE_LABEL="Version Note"
JGLOBAL_FIELDSET_ASSOCIATIONS="Associations"
JGLOBAL_FIELDSET_DISPLAY_OPTIONS="Display"
JGLOBAL_FIELDSET_IMAGE_OPTIONS="Images"
JGLOBAL_FIELDSET_INTEGRATION="Integration"
JGLOBAL_FIELDSET_METADATA_OPTIONS="Metadata"
JGLOBAL_FIELDSET_OPTIONS="Options"
JGLOBAL_FIELDSET_CONTENT="Content"
JGLOBAL_FIELDSET_PUBLISHING="Publishing"
JGLOBAL_FIELDSET_DESCRIPTION="Description"
JGLOBAL_FIELDSET_ADVANCED="Advanced"
JGLOBAL_FIELDSET_BASIC="Options"
JGLOBAL_FILTER_ATTRIBUTES_DESC="3. List additional attributes, separating each attribute name with a space or comma. For example: <i>class,title,id</i>."
JGLOBAL_FILTER_ATTRIBUTES_LABEL="Filter Attributes<sup>3</sup>"
JGLOBAL_FILTER_CLIENT="- Select Location -"
JGLOBAL_FILTER_FIELD_DESC="Show or hide a filter field for the list."
JGLOBAL_FILTER_FIELD_LABEL="Filter Field"
JGLOBAL_FILTER_GROUPS_DESC="This sets the user groups that you want filters applied to. Other groups will have no filtering performed."
JGLOBAL_FILTER_GROUPS_LABEL="Filter Groups"
JGLOBAL_FILTER_TAGS_DESC="2. List additional tags, separating each tag name with a space or comma. For example: <i>p,div,span</i>."
JGLOBAL_FILTER_TAGS_LABEL="Filter Tags<sup>2</sup>"
JGLOBAL_FILTER_TYPE_DESC="1. Blacklist allows all tags and attributes except for those in the blacklist.<br /><strong>--</strong> Tags for the Default Blacklist include: 'applet', 'body', 'bgsound', 'base', 'basefont', 'canvas', 'embed', 'frame', 'frameset', 'head', 'html', 'id', 'iframe', 'ilayer', 'layer', 'link', 'meta', 'name', 'object', 'script', 'style', 'title', 'xml'<br /><strong>--</strong> Attributes for the Default Blacklist include: 'action', 'background', 'codebase', 'dynsrc', 'lowsrc', 'formaction'<br /><strong>--</strong> You can blacklist additional tags and attributes by adding to the Filter Tags and Filter Attributes fields, separating each tag or attribute name with a comma.<br /><strong>--</strong> Custom Blacklist allows you to override the Default Blacklist. Add the tags and attributes to be blacklisted in the Filter Tags and Filter Attributes fields.</p><p>Whitelist allows only the tags listed in the Filter Tags and Filter Attributes fields.</p><p>No HTML removes all HTML tags from the content when it is saved.</p><p>Please note that these settings work regardless of the editor that you are using. <br />Even if you are using a WYSIWYG editor, the filtering settings may strip additional tags and attributes prior to saving information in the database."
JGLOBAL_FILTER_TYPE_LABEL="Filter Type<sup>1</sup>"
JGLOBAL_FULL_TEXT="Full Text"
JGLOBAL_GT="&gt;"
; The following strings is deprecated and will be removed with 4.0.
JGLOBAL_HELPREFRESH_BUTTON="Refresh"
JGLOBAL_HISTORY_LIMIT_OPTIONS_DESC="The maximum number of old versions of an item to save. If zero, all old versions will be saved."
JGLOBAL_HISTORY_LIMIT_OPTIONS_LABEL="Maximum Versions"
JGLOBAL_HITS="Hits"
JGLOBAL_HITS_ASC="Hits ascending"
JGLOBAL_HITS_DESC="Hits descending"
; Deprecated, will be removed with 4.0. Please do not translate the following language string
JGLOBAL_INDEX_FOLLOW="index, follow"
; Deprecated, will be removed with 4.0. Please do not translate the following language string
JGLOBAL_INDEX_NOFOLLOW="index, nofollow"
JGLOBAL_INHERIT="Inherit"
JGLOBAL_INTEGRATION_LABEL="Integration"
JGLOBAL_INTRO_TEXT="Intro Text"
JGLOBAL_ISFREESOFTWARE="%s is free software released under the <a href="_QQ_"https://www.gnu.org/licenses/gpl-2.0.html"_QQ_" target="_QQ_"_blank"_QQ_">GNU General Public License</a>."
JGLOBAL_KEEP_TYPING="Keep typing ..."
JGLOBAL_LANGUAGE_VERSION_NOT_PLATFORM="Language pack does not match this Joomla! version. Some strings may be missing and will be displayed in English."
JGLOBAL_LEAST_HITS="Least Hits"
JGLOBAL_LEFT="Left"
JGLOBAL_LINK_AUTHOR_DESC="If set to Yes, the Name of the article's Author will be linked to its contact page. You must create a contact linked to the author's user record, <strong>and the &quot;Content - Contact&quot; plugin must be enabled</strong>, for this to be in effect."
JGLOBAL_LINK_AUTHOR_LABEL="Link Author"
JGLOBAL_LINK_CATEGORY_DESC="If set to Yes, and if Show Category is set to 'Show', the Category Title will link to a layout showing articles in that Category."
JGLOBAL_LINK_CATEGORY_LABEL="Link Category"
JGLOBAL_LINK_PARENT_CATEGORY_DESC="If set to Yes, and if Show Parent is set to 'Show', the Parent Category Title will link to a layout showing articles in that Category."
JGLOBAL_LINK_PARENT_CATEGORY_LABEL="Link Parent"
JGLOBAL_LINKED_TITLES_DESC="If set to Yes, the article title will be a link to the article."
JGLOBAL_LINKED_TITLES_LABEL="Linked Titles"
JGLOBAL_LIST="List"
JGLOBAL_LIST_ALIAS="(<span>Alias</span>: %s)"
JGLOBAL_LIST_ALIAS_NOTE="(<span>Alias</span>: %s, <span>Note</span>: %s)"
JGLOBAL_LIST_AUTHOR_DESC="Show or hide the article author in the list of articles."
JGLOBAL_LIST_AUTHOR_LABEL="Show Author in List"
JGLOBAL_LIST_HITS_DESC="Show or hide article hits in the list of articles."
JGLOBAL_LIST_HITS_LABEL="Show Hits in List"
JGLOBAL_LIST_LAYOUT_OPTIONS="List Layouts"
JGLOBAL_LIST_NAME="(<span>Name</span>: %s)"
JGLOBAL_LIST_NAME_NOTE="(<span>Name</span>: %s, <span>Note</span>: %s)"
JGLOBAL_LIST_NOTE="(<span>Note</span>: %s)"
JGLOBAL_LIST_RATINGS_DESC="Whether to show article ratings in the list of articles."
JGLOBAL_LIST_RATINGS_LABEL="Show Ratings in List"
JGLOBAL_LIST_TITLE_DESC="If Show, Category Title will show in the list of categories."
JGLOBAL_LIST_TITLE_LABEL="Category Title"
JGLOBAL_LIST_VOTES_DESC="Whether to show article votes in the list of articles."
JGLOBAL_LIST_VOTES_LABEL="Show Votes in List"
JGLOBAL_LOOKING_FOR="Looking for"
JGLOBAL_LT="&lt;"
JGLOBAL_MAXIMUM_CATEGORY_LEVELS_DESC="The number of subcategory levels to display."
JGLOBAL_MAXIMUM_CATEGORY_LEVELS_LABEL="Subcategory Levels"
JGLOBAL_MAXIMUM_UPLOAD_SIZE_LIMIT="Maximum upload size: <strong>%s</strong>"
JGLOBAL_MAXLEVEL_DESC="Maximum number of levels of subcategories to show."
JGLOBAL_MAXLEVEL_LABEL="Subcategory Levels"
JGLOBAL_MENU_SELECTION="Menu Selection:"
JGLOBAL_MODIFIED="Modified"
JGLOBAL_MODIFIED_DATE="Modified Date"
JGLOBAL_MOST_HITS="Most Hits"
JGLOBAL_MOST_RECENT_FIRST="Most Recent First"
JGLOBAL_MULTI_COLUMN_ORDER_DESC="Order articles down or across columns."
JGLOBAL_MULTI_COLUMN_ORDER_LABEL="Multi Column Order"
JGLOBAL_MULTI_LEVEL="Multi Level"
JGLOBAL_NEWITEMSFIRST_DESC="New items default to the first position. The ordering can be changed after this item is saved."
JGLOBAL_NEWITEMSLAST_DESC="New items default to the last position. The ordering can be changed after this item is saved."
JGLOBAL_NO_ITEM_SELECTED="No items selected"
JGLOBAL_NO_ORDER="No Order"
; Deprecated, will be removed with 4.0. Please do not translate the following language string
JGLOBAL_NOINDEX_FOLLOW="noindex, follow"
; Deprecated, will be removed with 4.0. Please do not translate the following language string
JGLOBAL_NOINDEX_NOFOLLOW="noindex, nofollow"
JGLOBAL_NONAPPLICABLE="N/A"
JGLOBAL_NUM_COLUMNS_DESC="The number of columns in which to show Intro Articles. Normally 1, 2, or 3."
JGLOBAL_NUM_COLUMNS_LABEL="# Columns"
JGLOBAL_NUM_INTRO_ARTICLES_DESC="Number of articles to show after the leading article. Articles will be shown in columns."
JGLOBAL_NUM_INTRO_ARTICLES_LABEL="# Intro Articles"
JGLOBAL_NUM_LEADING_ARTICLES_DESC="Number of leading articles to display as full-width at the beginning of the page."
JGLOBAL_NUM_LEADING_ARTICLES_LABEL="# Leading Articles"
JGLOBAL_NUM_LINKS_DESC="Number of articles to display as links, normally below the Intro Articles."
JGLOBAL_NUM_LINKS_LABEL="# Links"
JGLOBAL_NUMBER_CATEGORY_ITEMS_DESC="If Show, the number of articles in the category will show."
JGLOBAL_NUMBER_CATEGORY_ITEMS_LABEL="Show Article Count"
JGLOBAL_NUMBER_ITEMS_LIST_DESC="Default number of articles to list on a page."
JGLOBAL_NUMBER_ITEMS_LIST_LABEL="# Articles to List"
JGLOBAL_NO_MATCHING_RESULTS="No Matching Results"
JGLOBAL_OLDEST_FIRST="Oldest First"
JGLOBAL_ORDER_ASCENDING="Ascending"
JGLOBAL_ORDER_DESCENDING="Descending"
JGLOBAL_ORDER_DIRECTION_LABEL="Direction"
JGLOBAL_ORDER_DIRECTION_DESC="Sort order. Descending is highest to lowest. Ascending is lowest to highest."
JGLOBAL_ORDERING="Article Order"
JGLOBAL_ORDERING_DATE_DESC="If articles are ordered by date, which date to use."
JGLOBAL_ORDERING_DATE_LABEL="Date for Ordering"
JGLOBAL_OTPMETHOD_NONE="Disable Two Factor Authentication"
JGLOBAL_PAGINATION_DESC="Show or hide Pagination support. Pagination provides page links at the bottom of the page that allow the User to navigate to additional pages. These are needed if the Information will not fit on one page."
JGLOBAL_PAGINATION_LABEL="Pagination"
JGLOBAL_PAGINATION_RESULTS_DESC="Show or hide pagination results information, for example, &quot;Page 1 of 4&quot;."
JGLOBAL_PAGINATION_RESULTS_LABEL="Pagination Results"
JGLOBAL_PASSWORD="Password"
JGLOBAL_PASSWORD_RESET_REQUIRED="You are required to reset your password before proceeding."
JGLOBAL_PERMISSIONS_ANCHOR="Set Permissions"
JGLOBAL_PREVIEW="Preview"
JGLOBAL_PUBLISHED_DATE="Published Date"
JGLOBAL_RANDOM_ORDER="Random Order"
JGLOBAL_RATINGS="Ratings"
JGLOBAL_RATINGS_ASC="Ratings ascending"
JGLOBAL_RATINGS_DESC="Ratings descending"
JGLOBAL_RECORD_HITS_DESC="Record the number of hits."
JGLOBAL_RECORD_HITS_LABEL="Record Hits"
JGLOBAL_RECORD_NUMBER="Record ID: %d"
JGLOBAL_REMEMBER_ME="Remember Me"
JGLOBAL_REVERSE_ORDERING="Article Reverse Order"
JGLOBAL_RIGHT="Right"
JGLOBAL_ROOT="Root"
JGLOBAL_ROOT_PARENT="- No parent -"
JGLOBAL_SAVE_HISTORY_OPTIONS_DESC="Automatically save old versions of an item. If set to Yes, old versions of items are saved automatically. When editing, you may restore from a previous version of the item."
JGLOBAL_SAVE_HISTORY_OPTIONS_LABEL="Enable Versions"
JGLOBAL_SECRETKEY="Secret Key"
JGLOBAL_SECRETKEY_HELP="If you have enabled two factor authentication in your user account please enter your secret key. If you do not know what this means, you can leave this field blank."
; The following 4 strings are deprecated and will be removed with 4.0.
JGLOBAL_SEF_ADVANCED_DESC="Modern routing enables advanced features but may change your URLs. Legacy routing ensures full compatibility for existing sites. This is configured per component."
JGLOBAL_SEF_ADVANCED_LABEL="URL Routing"
JGLOBAL_SEF_ADVANCED_LEGACY="Legacy"
JGLOBAL_SEF_ADVANCED_MODERN="Modern"
JGLOBAL_SEF_NOIDS_DESC="Remove the IDs from the URLs of this component."
JGLOBAL_SEF_NOIDS_LABEL="Remove IDs from URLs"
JGLOBAL_SEF_TITLE="Routing"
JGLOBAL_SELECT_ALLOW_DENY_GROUP="Change %s permission for %s group."
JGLOBAL_SELECT_AN_OPTION="Select an option"
JGLOBAL_SELECT_NO_RESULTS_MATCH="No results match"
JGLOBAL_SELECT_SOME_OPTIONS="Select some options"
JGLOBAL_SELECTED_UPLOAD_FILE_SIZE="Selected file size: <strong>%s</strong>"
JGLOBAL_SELECTION_ALL="Select All"
JGLOBAL_SELECTION_INVERT="Toggle Selection"
JGLOBAL_SELECTION_INVERT_ALL="Toggle All Selections"
JGLOBAL_SELECTION_NONE="Clear Selection"
JGLOBAL_SHOW_ASSOCIATIONS_DESC="Multilingual only. If set to Show, the associated articles flags or URL Language Code will be displayed."
JGLOBAL_SHOW_ASSOCIATIONS_LABEL="Show Associations"
JGLOBAL_SHOW_AUTHOR_DESC="If set to Show, the Name of the article's Author will be displayed."
JGLOBAL_SHOW_AUTHOR_LABEL="Show Author"
JGLOBAL_SHOW_CATEGORY_DESC="If set to Show, the title of the article&rsquo;s category will show."
JGLOBAL_SHOW_CATEGORY_DESCRIPTION_DESC="Show or hide the description of the selected Category."
JGLOBAL_SHOW_CATEGORY_DESCRIPTION_LABEL="Category Description"
JGLOBAL_SHOW_CATEGORY_IMAGE_DESC="Show or hide the image of the selected Category."
JGLOBAL_SHOW_CATEGORY_IMAGE_LABEL="Category Image"
JGLOBAL_SHOW_CATEGORY_HEADING_TITLE_TEXT_LABEL="Show Subcategories Text"
JGLOBAL_SHOW_CATEGORY_HEADING_TITLE_TEXT_DESC="If Show, the &quot;Subcategories&quot; will show as a subheading on the page. The subheading is usually displayed inside the &quot;H3&quot; tag."
JGLOBAL_SHOW_CATEGORY_LABEL="Show Category"
JGLOBAL_SHOW_CATEGORY_TITLE="Category Title"
JGLOBAL_SHOW_CATEGORY_TITLE_DESC="If Show, the Category Title will show as a subheading on the page. The subheading is usually displayed inside the &quot;H2&quot; tag."
JGLOBAL_SHOW_CREATE_DATE_DESC="If set to Show, the date and time an Article was created will be displayed."
JGLOBAL_SHOW_CREATE_DATE_LABEL="Show Create Date"
JGLOBAL_SHOW_DATE_DESC="Show or hide a date column in the list of articles, or select which date you wish to show."
JGLOBAL_SHOW_DATE_LABEL="Show Date"
JGLOBAL_SHOW_EMAIL_ICON_DESC="Show or hide the email link. This allows you to email an article."
JGLOBAL_SHOW_EMAIL_ICON_LABEL="Show Email"
JGLOBAL_SHOW_EMPTY_CATEGORIES_DESC="If Show, empty categories will display. A category is only empty if it has no items or subcategories."
JGLOBAL_SHOW_EMPTY_CATEGORIES_LABEL="Empty Categories"
JGLOBAL_SHOW_FEATURED_ARTICLES_DESC="Select to show, hide or only display featured articles."
JGLOBAL_SHOW_FEATURED_ARTICLES_LABEL="Featured Articles"
JGLOBAL_SHOW_FEED_LINK_DESC="Show or hide an RSS Feed Link. (A Feed Link will show up as a feed icon in the address bar of most modern browsers)."
JGLOBAL_SHOW_FEED_LINK_LABEL="Show Feed Link"
JGLOBAL_SHOW_FLAG_DESC="If set to 'Yes', will display language choice as image flags. Otherwise will use the content language URL Language Code."
JGLOBAL_SHOW_FLAG_LABEL="Use Image Flags"
JGLOBAL_SHOW_FULL_DESCRIPTION="Show full description ..."
JGLOBAL_SHOW_HEADINGS_DESC="Show or hide the headings in list layouts."
JGLOBAL_SHOW_HEADINGS_LABEL="Table Headings"
JGLOBAL_SHOW_HITS_DESC="If set to Show, the number of Hits on a particular Article will be displayed."
JGLOBAL_SHOW_HITS_LABEL="Show Hits"
JGLOBAL_SHOW_ICONS_DESC="Print and email will utilise icons or text."
JGLOBAL_SHOW_ICONS_LABEL="Show Icons"
JGLOBAL_SHOW_INTRO_DESC="If set to Show, the Intro Text of the article will show when you drill down to the article. If set to Hide, only the part of the article after the &quot;Read More&quot; break will show."
JGLOBAL_SHOW_INTRO_LABEL="Show Intro Text"
JGLOBAL_SHOW_MODIFY_DATE_DESC="If set to Show, the date and time an Article was last modified will be displayed."
JGLOBAL_SHOW_MODIFY_DATE_LABEL="Show Modify Date"
JGLOBAL_SHOW_NAVIGATION_DESC="If set to Show, shows a navigation link (Next, Previous) between articles."
JGLOBAL_SHOW_NAVIGATION_LABEL="Show Navigation"
JGLOBAL_SHOW_PARENT_CATEGORY_DESC="If set to Show, the title of the article&rsquo;s parent category will show."
JGLOBAL_SHOW_PARENT_CATEGORY_LABEL="Show Parent"
JGLOBAL_SHOW_PRINT_ICON_DESC="Show or hide the print. This allows you to print an article."
JGLOBAL_SHOW_PRINT_ICON_LABEL="Show Print"
JGLOBAL_SHOW_PUBLISH_DATE_DESC="If set to Show, the date and time an Article was published will be displayed."
JGLOBAL_SHOW_PUBLISH_DATE_LABEL="Show Publish Date"
JGLOBAL_SHOW_READMORE_DESC="If set to Show, the Read more ...Link will show if Main text has been provided for the Article."
JGLOBAL_SHOW_READMORE_LABEL="Show &quot;Read More&quot;"
JGLOBAL_SHOW_READMORE_TITLE_DESC="If set to show the title of the Article will be shown on the Read More button."
JGLOBAL_SHOW_READMORE_TITLE_LABEL="Show Title with Read More"
JGLOBAL_SHOW_READMORE_LIMIT_DESC="Set a limit of number of characters in Article Title to show in Read More button."
JGLOBAL_SHOW_READMORE_LIMIT_LABEL="Read More Limit"
JGLOBAL_SHOW_SUBCATEGORIES_DESCRIPTION_DESC="Show or hide the subcategories descriptions."
JGLOBAL_SHOW_SUBCATEGORIES_DESCRIPTION_LABEL="Subcategories Descriptions"
JGLOBAL_SHOW_SUBCATEGORY_CONTENT_LABEL="Include Subcategories"
JGLOBAL_SHOW_SUBCATEGORY_CONTENT_DESC="If None, only articles from this category will show. If a number, all articles from the category and the subcategories up to and including that level will show in the blog."
JGLOBAL_SHOW_TAGS_DESC="Show the tags for this link."
JGLOBAL_SHOW_TAGS_LABEL="Show Tags"
JGLOBAL_SHOW_TITLE_DESC="If set to Show, the article title is shown."
JGLOBAL_SHOW_TITLE_LABEL="Show Title"
JGLOBAL_SHOW_UNAUTH_LINKS_DESC="If set to Yes, links to registered content will be shown even if you are not logged-in. You will need to log in to access the full item."
JGLOBAL_SHOW_UNAUTH_LINKS_LABEL="Show Unauthorised Links"
JGLOBAL_SHOW_VOTE_DESC="If set to show, a voting system will be enabled for Articles."
JGLOBAL_SHOW_VOTE_LABEL="Show Voting"
JGLOBAL_SINGLE_LEVEL="Single Level"
JGLOBAL_SORT_BY="Sort Table By:"
JGLOBAL_START_PUBLISH_AFTER_FINISH="Item start publishing date must be before finish publishing date"
JGLOBAL_SUBHEADING_DESC="Optional text to show as a subheading."
JGLOBAL_SUBHEADING_LABEL="Page Subheading"
JGLOBAL_SUBMENU_CHECKIN="Check-in"
JGLOBAL_SUBMENU_CLEAR_CACHE="Clear Cache"
JGLOBAL_SUBMENU_PURGE_EXPIRED_CACHE="Clear Expired Cache"
JGLOBAL_SUBSLIDER_BLOG_EXTENDED_LABEL="The option below gives the ability to include articles from subcategories in the Blog layout."
JGLOBAL_SUBSLIDER_BLOG_LAYOUT_LABEL="If a field is left blank, global settings will be used."
JGLOBAL_SUBSLIDER_DRILL_CATEGORIES_LABEL="These options are also used when you select <br />one of the category links, on the first page and/or thereafter,<br />unless they are changed for a specific menu item."
JGLOBAL_TITLE="Title"
JGLOBAL_TITLE_ASC="Title ascending"
JGLOBAL_TITLE_DESC="Title descending"
JGLOBAL_TITLE_ALPHABETICAL="Title Alphabetical"
JGLOBAL_TITLE_REVERSE_ALPHABETICAL="Title Reverse Alphabetical"
JGLOBAL_TOGGLE_FEATURED="Toggle featured status."
JGLOBAL_TOP="Top"
JGLOBAL_TPL_CPANEL_LINK_TEXT="Return to Control Panel"
JGLOBAL_TYPE_OR_SELECT_CATEGORY="Type or Select a Category"
JGLOBAL_TYPE_OR_SELECT_SOME_OPTIONS="Type or select some options"
JGLOBAL_TYPE_OR_SELECT_SOME_TAGS="Type or select some tags"
JGLOBAL_USE_GLOBAL="Use Global"
JGLOBAL_USE_GLOBAL_VALUE="Use Global (%s)"
JGLOBAL_USERNAME="Username"
JGLOBAL_VALIDATION_FORM_FAILED="Invalid form"
JGLOBAL_VIEW_SITE="View Site"
JGLOBAL_VOTES="Votes"
JGLOBAL_VOTES_ASC="Votes ascending"
JGLOBAL_VOTES_DESC="Votes descending"
JGLOBAL_WARNJAVASCRIPT="Warning! JavaScript must be enabled for proper operation of the Administrator Backend."
JGLOBAL_WIDTH="Width"

JGRID_HEADING_ACCESS="Access"
JGRID_HEADING_ACCESS_ASC="Access ascending"
JGRID_HEADING_ACCESS_DESC="Access descending"
JGRID_HEADING_CREATED_BY="Created by"
JGRID_HEADING_ID="ID"
JGRID_HEADING_ID_ASC="ID ascending"
JGRID_HEADING_ID_DESC="ID descending"
JGRID_HEADING_LANGUAGE="Language"
JGRID_HEADING_LANGUAGE_ASC="Language ascending"
JGRID_HEADING_LANGUAGE_DESC="Language descending"
JGRID_HEADING_MENU_ITEM_TYPE="Menu Item Type"
JGRID_HEADING_ORDERING="Ordering"
JGRID_HEADING_ORDERING_ASC="Ordering ascending"
JGRID_HEADING_ORDERING_DESC="Ordering descending"

JHELP_COMPONENTS_ACTIONLOGS="Components_Actionlogs"
JHELP_COMPONENTS_ASSOCIATIONS="Components_Associations"
JHELP_COMPONENTS_ASSOCIATIONS_EDIT="Components_Associations_Edit"
JHELP_COMPONENTS_BANNERS_BANNERS_EDIT="Components_Banners_Banners_Edit"
JHELP_COMPONENTS_BANNERS_BANNERS="Components_Banners_Banners"
JHELP_COMPONENTS_BANNERS_CATEGORIES="Components_Banners_Categories"
JHELP_COMPONENTS_BANNERS_CATEGORY_ADD="Components_Banners_Categories_Edit"
JHELP_COMPONENTS_BANNERS_CATEGORY_EDIT="Components_Banners_Categories_Edit"
JHELP_COMPONENTS_BANNERS_CLIENTS_EDIT="Components_Banners_Clients_Edit"
JHELP_COMPONENTS_BANNERS_CLIENTS="Components_Banners_Clients"
JHELP_COMPONENTS_BANNERS_TRACKS="Components_Banners_Tracks"
JHELP_COMPONENTS_CACHE_MANAGER_SETTINGS="Components_Cache_Manager_Settings"
JHELP_COMPONENTS_CHECK-IN_CONFIGURATION="Components_Check-in_Configuration"
JHELP_COMPONENTS_COM_ACTIONLOGS_OPTIONS="Components_User_Actionlogs_Options"
JHELP_COMPONENTS_COM_ASSOCIATIONS_OPTIONS="Components_Associations_Options"
JHELP_COMPONENTS_COM_BANNERS_OPTIONS="Components_Banner_Manager_Options"
JHELP_COMPONENTS_COM_CACHE_OPTIONS="Components_Cache_Manager_Settings"
JHELP_COMPONENTS_COM_CHECKIN_OPTIONS="Components_Check_in_Configuration"
JHELP_COMPONENTS_COM_CONTACT_OPTIONS="Components_Contact_Manager_Options"
JHELP_COMPONENTS_COM_CONTENT_OPTIONS="Components_Article_Manager_Options"
JHELP_COMPONENTS_COM_FINDER_OPTIONS="Components_Smart_Search_Configuration"
JHELP_COMPONENTS_COM_INSTALLER_OPTIONS="Components_Installer_Configuration"
JHELP_COMPONENTS_COM_JOOMLAUPDATE_OPTIONS="Components_Joomla_Update_Configuration"
JHELP_COMPONENTS_COM_LANGUAGES_OPTIONS="Components_Language_Manager_Options"
JHELP_COMPONENTS_COM_MEDIA_OPTIONS="Components_Media_Manager_Options"
JHELP_COMPONENTS_COM_MENUS_OPTIONS="Components_Menus_Configuration"
JHELP_COMPONENTS_COM_MESSAGES_OPTIONS="Components_Messages_Configuration"
JHELP_COMPONENTS_COM_MODULES_OPTIONS="Components_Module_Manager_Options"
JHELP_COMPONENTS_COM_NEWSFEEDS_OPTIONS="Components_News_Feed_Manager_Options"
JHELP_COMPONENTS_COM_PLUGINS_OPTIONS="Components_Plugin_Manager_Options"
JHELP_COMPONENTS_COM_PRIVACY_OPTIONS="Components_Privacy_Options"
JHELP_COMPONENTS_COM_POSTINSTALL_OPTIONS="Components_Post_installation_Messages_Configuration"
JHELP_COMPONENTS_COM_REDIRECT_OPTIONS="Components_Redirect_Manager_Options"
JHELP_COMPONENTS_COM_SEARCH_OPTIONS="Components_Search_Manager_Options"
JHELP_COMPONENTS_COM_TAGS_OPTIONS="Components_Tags_Manager_Options"
JHELP_COMPONENTS_COM_TEMPLATES_OPTIONS="Components_Template_Manager_Options"
JHELP_COMPONENTS_COM_USERS_OPTIONS="Components_Users_Configuration"
JHELP_COMPONENTS_COM_WEBLINKS_OPTIONS="Components_Web_Links_Manager_Options"
JHELP_COMPONENTS_CONTACT_CATEGORIES="Components_Contacts_Categories"
JHELP_COMPONENTS_CONTACT_CATEGORY_ADD="Components_Contacts_Categories_Edit"
JHELP_COMPONENTS_CONTACT_CATEGORY_EDIT="Components_Contacts_Categories_Edit"
JHELP_COMPONENTS_CONTACTS_CONTACTS_EDIT="Components_Contacts_Contacts_Edit"
JHELP_COMPONENTS_CONTACTS_CONTACTS="Components_Contacts_Contacts"
JHELP_COMPONENTS_CONTENT_CATEGORIES="Components_Content_Categories"
JHELP_COMPONENTS_CONTENT_CATEGORY_ADD="Components_Content_Categories_Edit"
JHELP_COMPONENTS_CONTENT_CATEGORY_EDIT="Components_Content_Categories_Edit"
JHELP_COMPONENTS_FIELDS_FIELDS="Components_Fields_Fields"
JHELP_COMPONENTS_FIELDS_FIELDS_EDIT="Components_Fields_Fields_Edit"
JHELP_COMPONENTS_FIELDS_FIELD_GROUPS="Components_Fields_Field_Groups"
JHELP_COMPONENTS_FIELDS_FIELD_GROUPS_EDIT="Components_Fields_Field_Groups_Edit"
JHELP_COMPONENTS_FINDER_MANAGE_CONTENT_MAPS="Components_Finder_Manage_Content_Maps"
JHELP_COMPONENTS_FINDER_MANAGE_INDEXED_CONTENT="Components_Finder_Manage_Indexed_Content"
JHELP_COMPONENTS_FINDER_MANAGE_SEARCH_FILTERS_EDIT="Components_Finder_Manage_Search_Filters_Edit"
JHELP_COMPONENTS_FINDER_MANAGE_SEARCH_FILTERS="Components_Finder_Manage_Search_Filters"
JHELP_COMPONENTS_INSTALLER_CONFIGURATION="Components_Installer_Configuration"
JHELP_COMPONENTS_JOOMLA_UPDATE="Components_Joomla_Update"
JHELP_COMPONENTS_JOOMLA_UPDATE_CONFIGURATION="Components_Joomla_Update_Configuration"
JHELP_COMPONENTS_MENUS_CONFIGURATION="Components_Menus_Configuration"
JHELP_COMPONENTS_MESSAGES_CONFIGURATION="Components_Messages_Configuration"
JHELP_COMPONENTS_MESSAGING_INBOX="Components_Messaging_Inbox"
JHELP_COMPONENTS_MESSAGING_READ="Components_Messaging_Read"
JHELP_COMPONENTS_MESSAGING_WRITE="Components_Messaging_Write"
JHELP_COMPONENTS_NEWSFEEDS_CATEGORIES="Components_Newsfeeds_Categories"
JHELP_COMPONENTS_NEWSFEEDS_CATEGORY_ADD="Components_Newsfeeds_Categories_Edit"
JHELP_COMPONENTS_NEWSFEEDS_CATEGORY_EDIT="Components_Newsfeeds_Categories_Edit"
JHELP_COMPONENTS_NEWSFEEDS_FEEDS_EDIT="Components_Newsfeeds_Feeds_Edit"
JHELP_COMPONENTS_NEWSFEEDS_FEEDS="Components_Newsfeeds_Feeds"
JHELP_COMPONENTS_POST_INSTALLATION_MESSAGES="Components_Post_installation_Messages"
JHELP_COMPONENTS_PRIVACY_CAPABILITIES="Components_Privacy_Capabilities"
JHELP_COMPONENTS_PRIVACY_CONSENTS="Components_Privacy_Consents"
JHELP_COMPONENTS_PRIVACY_DASHBOARD="Components_Privacy_Dashboard"
JHELP_COMPONENTS_PRIVACY_REQUEST="Components_Privacy_Request"
JHELP_COMPONENTS_PRIVACY_REQUEST_EDIT="Components_Privacy_Request_Edit"
JHELP_COMPONENTS_PRIVACY_REQUESTS="Components_Privacy_Requests"
JHELP_COMPONENTS_REDIRECT_MANAGER_EDIT="Components_Redirect_Manager_Edit"
JHELP_COMPONENTS_REDIRECT_MANAGER="Components_Redirect_Manager"
JHELP_COMPONENTS_SEARCH="Components_Search"
JHELP_COMPONENTS_SMART_SEARCH_CONFIGURATION="Components_Smart_Search_Configuration"
JHELP_COMPONENTS_TAGS_MANAGER="Components_Tags_Manager"
JHELP_COMPONENTS_TAGS_MANAGER_EDIT="Components_Tags_Manager_Edit"
JHELP_COMPONENTS_USERS_CATEGORIES="Users_User_Note_Categories"
JHELP_COMPONENTS_USERS_CATEGORY_ADD="Users_User_Note_Category_Edit"
JHELP_COMPONENTS_USERS_CATEGORY_EDIT="Users_User_Note_Category_Edit"
JHELP_COMPONENTS_WEBLINKS_CATEGORIES="Components_Weblinks_Categories"
JHELP_COMPONENTS_WEBLINKS_CATEGORY_ADD="Components_Weblinks_Categories_Edit"
JHELP_COMPONENTS_WEBLINKS_CATEGORY_EDIT="Components_Weblinks_Categories_Edit"
JHELP_COMPONENTS_WEBLINKS_LINKS_EDIT="Components_Weblinks_Links_Edit"
JHELP_COMPONENTS_WEBLINKS_LINKS="Components_Weblinks_Links"
JHELP_CONTENT_ARTICLE_MANAGER="Content_Article_Manager"
JHELP_CONTENT_ARTICLE_MANAGER_EDIT="Content_Article_Manager_Edit"
JHELP_CONTENT_FEATURED_ARTICLES="Content_Featured_Articles"
JHELP_CONTENT_MEDIA_MANAGER="Content_Media_Manager"
JHELP_EXTENSIONS_EXTENSION_MANAGER_DATABASE="Extensions_Extension_Manager_Database"
JHELP_EXTENSIONS_EXTENSION_MANAGER_DISCOVER="Extensions_Extension_Manager_Discover"
JHELP_EXTENSIONS_EXTENSION_MANAGER_INSTALL="Extensions_Extension_Manager_Install"
JHELP_EXTENSIONS_EXTENSION_MANAGER_LANGUAGES="Extensions_Extension_Manager_languages"
JHELP_EXTENSIONS_EXTENSION_MANAGER_MANAGE="Extensions_Extension_Manager_Manage"
JHELP_EXTENSIONS_EXTENSION_MANAGER_UPDATE="Extensions_Extension_Manager_Update"
JHELP_EXTENSIONS_EXTENSION_MANAGER_UPDATESITES="Extensions_Extension_Manager_Updatesites"
JHELP_EXTENSIONS_EXTENSION_MANAGER_WARNINGS="Extensions_Extension_Manager_Warnings"
JHELP_EXTENSIONS_LANGUAGE_MANAGER_CONTENT="Extensions_Language_Manager_Content"
JHELP_EXTENSIONS_LANGUAGE_MANAGER_EDIT="Extensions_Language_Manager_Edit"
JHELP_EXTENSIONS_LANGUAGE_MANAGER_INSTALLED="Extensions_Language_Manager_Installed"
JHELP_EXTENSIONS_LANGUAGE_MANAGER_OVERRIDES="Extensions_Language_Manager_Overrides"
JHELP_EXTENSIONS_LANGUAGE_MANAGER_OVERRIDES_EDIT="Extensions_Language_Manager_Overrides_Edit"
JHELP_EXTENSIONS_MODULE_MANAGER="Extensions_Module_Manager"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_CUSTOM="Extensions_Module_Manager_Admin_Custom"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_FEED="Extensions_Module_Manager_Admin_Feed"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_LATEST="Extensions_Module_Manager_Admin_Latest"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_LATESTACTIONS="Extensions_Module_Manager_Admin_Latestactions"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_LOGGED="Extensions_Module_Manager_Admin_Logged"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_LOGIN="Extensions_Module_Manager_Admin_Login"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_MENU="Extensions_Module_Manager_Admin_Menu"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_MULTILANG="Extensions_Module_Manager_Admin_Multilang"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_ONLINE="Extensions_Module_Manager_Admin_Online"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_POPULAR="Extensions_Module_Manager_Admin_Popular"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_PRIVACY_DASHBOARD="Extensions_Module_Manager_Admin_Privacy_Dashboard"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_QUICKICON="Extensions_Module_Manager_Admin_Quickicon"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_STATUS="Extensions_Module_Manager_Admin_Status"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_SUBMENU="Extensions_Module_Manager_Admin_Submenu"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_TITLE="Extensions_Module_Manager_Admin_Title"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_TOOLBAR="Extensions_Module_Manager_Admin_Toolbar"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_UNREAD="Extensions_Module_Manager_Admin_Unread"
JHELP_EXTENSIONS_MODULE_MANAGER_ARTICLES_ARCHIVE="Extensions_Module_Manager_Articles_Archive"
JHELP_EXTENSIONS_MODULE_MANAGER_ARTICLES_CATEGORIES="Extensions_Module_Manager_Articles_Categories"
JHELP_EXTENSIONS_MODULE_MANAGER_ARTICLES_CATEGORY="Extensions_Module_Manager_Articles_Category"
JHELP_EXTENSIONS_MODULE_MANAGER_ARTICLES_NEWSFLASH="Extensions_Module_Manager_Articles_Newsflash"
JHELP_EXTENSIONS_MODULE_MANAGER_ARTICLES_RELATED="Extensions_Module_Manager_Articles_Related"
JHELP_EXTENSIONS_MODULE_MANAGER_BANNERS="Extensions_Module_Manager_Banners"
JHELP_EXTENSIONS_MODULE_MANAGER_BREADCRUMBS="Extensions_Module_Manager_Breadcrumbs"
JHELP_EXTENSIONS_MODULE_MANAGER_CUSTOM_HTML="Extensions_Module_Manager_Custom_HTML"
JHELP_EXTENSIONS_MODULE_MANAGER_EDIT="Extensions_Module_Manager_Edit"
JHELP_EXTENSIONS_MODULE_MANAGER_FEED_DISPLAY="Extensions_Module_Manager_Feed_Display"
JHELP_EXTENSIONS_MODULE_MANAGER_FOOTER="Extensions_Module_Manager_Footer"
JHELP_EXTENSIONS_MODULE_MANAGER_LANGUAGE_SWITCHER="Extensions_Module_Manager_Language_Switcher"
JHELP_EXTENSIONS_MODULE_MANAGER_LATEST_NEWS="Extensions_Module_Manager_Latest_News"
JHELP_EXTENSIONS_MODULE_MANAGER_LATEST_USERS="Extensions_Module_Manager_Latest_Users"
JHELP_EXTENSIONS_MODULE_MANAGER_LOGIN="Extensions_Module_Manager_Login"
JHELP_EXTENSIONS_MODULE_MANAGER_MENU="Extensions_Module_Manager_Menu"
JHELP_EXTENSIONS_MODULE_MANAGER_MOST_READ="Extensions_Module_Manager_Most_Read"
JHELP_EXTENSIONS_MODULE_MANAGER_RANDOM_IMAGE="Extensions_Module_Manager_Random_Image"
JHELP_EXTENSIONS_MODULE_MANAGER_SEARCH="Extensions_Module_Manager_Search"
JHELP_EXTENSIONS_MODULE_MANAGER_SMART_SEARCH="Extensions_Module_Manager_Smart_Search"
JHELP_EXTENSIONS_MODULE_MANAGER_STATISTICS="Extensions_Module_Manager_Statistics"
JHELP_EXTENSIONS_MODULE_MANAGER_SYNDICATION_FEEDS="Extensions_Module_Manager_Syndication_Feeds"
JHELP_EXTENSIONS_MODULE_MANAGER_TAGS_POPULAR="Extensions_Module_Manager_Tags_Popular"
JHELP_EXTENSIONS_MODULE_MANAGER_TAGS_SIMILAR="Extensions_Module_Manager_Tags_Similar"
JHELP_EXTENSIONS_MODULE_MANAGER_WEBLINKS="Extensions_Module_Manager_Weblinks"
JHELP_EXTENSIONS_MODULE_MANAGER_WHO_ONLINE="Extensions_Module_Manager_Who_Online"
JHELP_EXTENSIONS_MODULE_MANAGER_WRAPPER="Extensions_Module_Manager_Wrapper"
JHELP_EXTENSIONS_PLUGIN_MANAGER="Extensions_Plugin_Manager"
JHELP_EXTENSIONS_PLUGIN_MANAGER_EDIT="Extensions_Plugin_Manager_Edit"
JHELP_EXTENSIONS_TEMPLATE_MANAGER_STYLES="Extensions_Template_Manager_Styles"
JHELP_EXTENSIONS_TEMPLATE_MANAGER_STYLES_EDIT="Extensions_Template_Manager_Styles_Edit"
JHELP_EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES="Extensions_Template_Manager_Templates"
JHELP_EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES_EDIT="Extensions_Template_Manager_Templates_Edit"
JHELP_EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES_EDIT_SOURCE="Extensions_Template_Manager_Templates_Edit_Source"
JHELP_GLOSSARY="Glossary"
JHELP_MENUS_MENU_ITEM_ARTICLE_ARCHIVED="Menus_Menu_Item_Article_Archived"
JHELP_MENUS_MENU_ITEM_ARTICLE_CATEGORIES="Menus_Menu_Item_Article_Categories"
JHELP_MENUS_MENU_ITEM_ARTICLE_CATEGORY_BLOG="Menus_Menu_Item_Article_Category_Blog"
JHELP_MENUS_MENU_ITEM_ARTICLE_CATEGORY_LIST="Menus_Menu_Item_Article_Category_List"
JHELP_MENUS_MENU_ITEM_ARTICLE_CREATE="Menus_Menu_Item_Article_Create"
JHELP_MENUS_MENU_ITEM_ARTICLE_FEATURED="Menus_Menu_Item_Article_Featured"
JHELP_MENUS_MENU_ITEM_ARTICLE_SINGLE_ARTICLE="Menus_Menu_Item_Article_Single_Article"
JHELP_MENUS_MENU_ITEM_CONTACT_CATEGORIES="Menus_Menu_Item_Contact_Categories"
JHELP_MENUS_MENU_ITEM_CONTACT_CATEGORY="Menus_Menu_Item_Contact_Category"
JHELP_MENUS_MENU_ITEM_CONTACT_FEATURED="Menus_Menu_Item_Contact_Featured"
JHELP_MENUS_MENU_ITEM_CONTACT_SINGLE_CONTACT="Menus_Menu_Item_Contact_Single_Contact"
JHELP_MENUS_MENU_ITEM_DISPLAY_SITE_CONFIGURATION="Menus_Menu_Item_Display_Site_Configuration"
JHELP_MENUS_MENU_ITEM_DISPLAY_TEMPLATE_OPTIONS="Menus_Menu_Item_Display_Template_Options"
JHELP_MENUS_MENU_ITEM_EXTERNAL_URL="Menus_Menu_Item_External_URL"
JHELP_MENUS_MENU_ITEM_FINDER_SEARCH="Menus_Menu_Item_Finder_Search"
JHELP_MENUS_MENU_ITEM_MANAGER="Menus_Menu_Item_Manager"
JHELP_MENUS_MENU_ITEM_MANAGER_EDIT="Menus_Menu_Item_Manager_Edit"
JHELP_MENUS_MENU_ITEM_MENU_ITEM_ALIAS="Menus_Menu_Item_Menu_Item_Alias"
JHELP_MENUS_MENU_ITEM_MENU_ITEM_HEADING="Menus_Menu_Item_Menu_Item_Heading"
JHELP_MENUS_MENU_ITEM_NEWSFEED_CATEGORIES="Menus_Menu_Item_Newsfeed_Categories"
JHELP_MENUS_MENU_ITEM_NEWSFEED_CATEGORY="Menus_Menu_Item_Newsfeed_Category"
JHELP_MENUS_MENU_ITEM_NEWSFEED_SINGLE_NEWSFEED="Menus_Menu_Item_Newsfeed_Single_Newsfeed"
JHELP_MENUS_MENU_ITEM_PRIVACY_CONFIRM_REQUEST="Menus_Menu_Item_Privacy_Confirm_Request"
JHELP_MENUS_MENU_ITEM_PRIVACY_CREATE_REQUEST="Menus_Menu_Item_Privacy_Create_Request"
JHELP_MENUS_MENU_ITEM_PRIVACY_REMIND_REQUEST="Menus_Menu_Item_Privacy_Remind_Request"
JHELP_MENUS_MENU_ITEM_SEARCH_RESULTS="Menus_Menu_Item_Search_Results"
JHELP_MENUS_MENU_ITEM_TAGS_ITEMS_COMPACT_LIST="Menus_Menu_Item_Tags_Items_Compact_List"
JHELP_MENUS_MENU_ITEM_TAGS_ITEMS_LIST="Menus_Menu_Item_Tags_Items_List"
JHELP_MENUS_MENU_ITEM_TAGS_ITEMS_LIST_ALL="Menus_Menu_Item_Tags_Items_List_All"
JHELP_MENUS_MENU_ITEM_TEXT_SEPARATOR="Menus_Menu_Item_Text_Separator"
JHELP_MENUS_MENU_ITEM_USER_LOGIN="Menus_Menu_Item_User_Login"
JHELP_MENUS_MENU_ITEM_USER_LOGOUT="Menus_Menu_Item_User_Logout"
JHELP_MENUS_MENU_ITEM_USER_PASSWORD_RESET="Menus_Menu_Item_User_Password_Reset"
JHELP_MENUS_MENU_ITEM_USER_PROFILE="Menus_Menu_Item_User_Profile"
JHELP_MENUS_MENU_ITEM_USER_PROFILE_EDIT="Menus_Menu_Item_User_Profile_Edit"
JHELP_MENUS_MENU_ITEM_USER_REGISTRATION="Menus_Menu_Item_User_Registration"
JHELP_MENUS_MENU_ITEM_USER_REMINDER="Menus_Menu_Item_User_Reminder"
JHELP_MENUS_MENU_ITEM_WEBLINK_CATEGORIES="Menus_Menu_Item_Weblink_Categories"
JHELP_MENUS_MENU_ITEM_WEBLINK_CATEGORY="Menus_Menu_Item_Weblink_Category"
JHELP_MENUS_MENU_ITEM_WEBLINK_SUBMIT="Menus_Menu_Item_Weblink_Submit"
JHELP_MENUS_MENU_ITEM_WRAPPER="Menus_Menu_Item_Wrapper"
JHELP_MENUS_MENU_MANAGER="Menus_Menu_Manager"
JHELP_MENUS_MENU_MANAGER_EDIT="Menus_Menu_Manager_Edit"
JHELP_SITE_GLOBAL_CONFIGURATION="Site_Global_Configuration"
JHELP_SITE_MAINTENANCE_CLEAR_CACHE="Site_Maintenance_Clear_Cache"
JHELP_SITE_MAINTENANCE_GLOBAL_CHECK-IN="Site_Maintenance_Global_Check-in"
JHELP_SITE_MAINTENANCE_PURGE_EXPIRED_CACHE="Site_Maintenance_Purge_Expired_Cache"
JHELP_SITE_SYSTEM_INFORMATION="Site_System_Information"
JHELP_ADMIN_USER_PROFILE_EDIT="Site_My_Profile"
JHELP_START_HERE="Start_Here"
JHELP_USERS_ACCESS_LEVELS="Users_Access_Levels"
JHELP_USERS_ACCESS_LEVELS_EDIT="Users_Access_Levels_Edit"
JHELP_USERS_DEBUG_GROUPS="Users_Debug_Groups"
JHELP_USERS_DEBUG_USERS="Users_Debug_Users"
JHELP_USERS_GROUPS="Users_Groups"
JHELP_USERS_GROUPS_EDIT="Users_Groups_Edit"
JHELP_USERS_MASS_MAIL_USERS="Users_Mass_Mail_Users"
JHELP_USERS_USER_MANAGER="Users_User_Manager"
JHELP_USERS_USER_MANAGER_EDIT="Users_User_Manager_Edit"
JHELP_USERS_USER_NOTES="Users_User_Notes"
JHELP_USERS_USER_NOTES_EDIT="Users_User_Notes_Edit"

; if there is an error connecting database before initialisation, en-GB.lib_joomla.ini can't be loaded
; we therefore have to load the strings from en-GB.ini

JLIB_DATABASE_ERROR_ADAPTER_MYSQL="The MySQL adapter 'mysql' is not available."
JLIB_DATABASE_ERROR_ADAPTER_MYSQLI="The MySQL adapter 'mysqli' is not available."
JLIB_DATABASE_ERROR_CONNECT_DATABASE="Unable to connect to the Database: %s"
JLIB_DATABASE_ERROR_CONNECT_MYSQL="Could not connect to MySQL."
JLIB_DATABASE_ERROR_DATABASE_CONNECT="Could not connect to database"
JLIB_DATABASE_ERROR_LOAD_DATABASE_DRIVER="Unable to load Database Driver: %s"
JLIB_ERROR_INFINITE_LOOP="Infinite loop detected in JError"

JOPTION_ACCESS_SHOW_ALL_ACCESS="Show All Access"
JOPTION_ACCESS_SHOW_ALL_GROUPS="Show All Groups"
JOPTION_ACCESS_SHOW_ALL_LEVELS="Show All Access Levels"
JOPTION_ALL_CATEGORIES="- All Categories -"
JOPTION_ANY_CATEGORY="Any Category"
JOPTION_ANY="Any"
JOPTION_DO_NOT_USE="- None Selected -"
JOPTION_FROM_COMPONENT="---From Component---"
JOPTION_FROM_MODULE="---From Module---"
JOPTION_FROM_TEMPLATE="---From %s Template---"
JOPTION_FROM_STANDARD="---From Global Options---"
JOPTION_MENUS="Menus"
JOPTION_NO_USER="- No User -"
JOPTION_OPTIONAL="Optional"
JOPTION_ORDER_FIRST="Order First"
JOPTION_ORDER_LAST="Order Last"
JOPTION_REQUIRED="Required"
JOPTION_SELECT_ACCESS="- Select Access -"
JOPTION_SELECT_AUTHOR_ALIAS="- Select Author Alias -"
JOPTION_SELECT_AUTHOR_ALIASES="- Select Author Aliases -"
JOPTION_SELECT_AUTHOR="- Select Author -"
JOPTION_SELECT_AUTHORS="- Select Authors -"
JOPTION_SELECT_CATEGORY="- Select Category -"
JOPTION_SELECT_EDITOR="- Select Editor -"
JOPTION_SELECT_IMAGE="- Select Image -"
JOPTION_SELECT_LANGUAGE="- Select Language -"
JOPTION_SELECT_MENU="- Select Menu -"
JOPTION_SELECT_MENU_ITEM="- Select Menu Item -"
JOPTION_SELECT_PUBLISHED="- Select Status -"
JOPTION_SELECT_TEMPLATE="- Select Template -"
JOPTION_SELECT_MAX_LEVELS="- Select Max Levels -"
JOPTION_SELECT_TAG="- Select Tag -"
JOPTION_UNASSIGNED="Unassigned"
JOPTION_USE_DEFAULT_MODULE_SETTING="- Use Default Module Setting -"
JOPTION_USE_DEFAULT="- Use Default -"
JOPTION_USE_MENU_REQUEST_SETTING="- Use Menu or Request Setting -"

JSEARCH_FILTER_LABEL="Filter:"
JSEARCH_FILTER_CLEAR="Clear"
JSEARCH_FILTER_SUBMIT="Search"
JSEARCH_FILTER="Search"
JSEARCH_TITLE="Search %s"
JSEARCH_RESET="Reset"

JTOGGLE_SIDEBAR_LABEL="Sidebar"
JTOGGLE_HIDE_SIDEBAR="Hide the sidebar"
JTOGGLE_SHOW_SIDEBAR="Show the sidebar"

JTOOLBAR_APPLY="Save"
JTOOLBAR_ARCHIVE="Archive"
JTOOLBAR_ASSIGN="Assign"
JTOOLBAR_ASSOCIATIONS="Associations"
JTOOLBAR_BACK="Back"
JTOOLBAR_BATCH="Batch"
JTOOLBAR_BULK_IMPORT="Bulk Import"
JTOOLBAR_CANCEL="Cancel"
JTOOLBAR_CHECKIN="Check-in"
JTOOLBAR_CLOSE="Close"
JTOOLBAR_DEFAULT="Default"
JTOOLBAR_DELETE="Delete"
JTOOLBAR_DELETE_ALL="Delete All"
JTOOLBAR_DISABLE="Disable"
JTOOLBAR_DUPLICATE="Duplicate"
JTOOLBAR_EDIT="Edit"
JTOOLBAR_EDIT_CSS="Edit CSS"
JTOOLBAR_EDIT_HTML="Edit HTML"
JTOOLBAR_EMPTY_TRASH="Empty trash"
JTOOLBAR_ENABLE="Enable"
JTOOLBAR_EXPORT="Export"
JTOOLBAR_HELP="Help"
JTOOLBAR_INSTALL="Install"
JTOOLBAR_NEW="New"
JTOOLBAR_OPTIONS="Options"
JTOOLBAR_PUBLISH="Publish"
JTOOLBAR_PURGE_CACHE="Clear Cache"
JTOOLBAR_REBUILD="Rebuild"
JTOOLBAR_REBUILD_FAILED="Rebuild failed: %s"
JTOOLBAR_REBUILD_SUCCESS="Successfully rebuilt"
JTOOLBAR_REFRESH_CACHE="Refresh Cache"
JTOOLBAR_REMOVE="Remove"
JTOOLBAR_SAVE="Save &amp; Close"
JTOOLBAR_SAVE_AND_NEW="Save &amp; New"
JTOOLBAR_SAVE_AS_COPY="Save as Copy"
JTOOLBAR_UNARCHIVE="Unarchive"
JTOOLBAR_UNINSTALL="Uninstall"
JTOOLBAR_UNPUBLISH="Unpublish"
JTOOLBAR_UPLOAD="Upload"
JTOOLBAR_TRASH="Trash"
JTOOLBAR_UNTRASH="Untrash"
JTOOLBAR_VERSIONS="Versions"

JWARNING_PUBLISH_MUST_SELECT="You must select at least one item to publish."
JWARNING_ARCHIVE_MUST_SELECT="You must select at least one item to archive."
JWARNING_UNPUBLISH_MUST_SELECT="You must select at least one item to unpublish."
JWARNING_TRASH_MUST_SELECT="You must select at least one item to remove."
JWARNING_DELETE_MUST_SELECT="You must select at least one item to permanently delete."
JWARNING_REMOVE_ROOT_USER="You are logged-in using the emergency Root User setting in configuration.php.<br />You should remove $root_user from the configuration.php as soon as you have restored control to your site to avoid future security breaches.<br /><a href='%s'>Select here to try to do it automatically.</a>"
JWARNING_REMOVE_ROOT_USER_ADMIN="The emergency Root User setting is enabled for the user(id): %s.<br />You should remove $root_user from the configuration.php as soon as you have restored control to your site to avoid future security breaches.<br /><a href='%s'>Select here to try to do it automatically.</a>"

; Date format

DATE_FORMAT_LC="l, d F Y"
DATE_FORMAT_LC1="l, d F Y"
DATE_FORMAT_LC2="l, d F Y H:i"
DATE_FORMAT_LC3="d F Y"
DATE_FORMAT_LC4="Y-m-d"
DATE_FORMAT_LC5="Y-m-d H:i"
DATE_FORMAT_LC6="Y-m-d H:i:s"
DATE_FORMAT_JS1="y-m-d"
DATE_FORMAT_CALENDAR_DATE="%Y-%m-%d"
DATE_FORMAT_CALENDAR_DATETIME="%Y-%m-%d %H:%M:%S"
DATE_FORMAT_FILTER_DATE="Y-m-d"
DATE_FORMAT_FILTER_DATETIME="Y-m-d H:i:s"

; Months

JANUARY_SHORT="Jan"
JANUARY="January"
FEBRUARY_SHORT="Feb"
FEBRUARY="February"
MARCH_SHORT="Mar"
MARCH="March"
APRIL_SHORT="Apr"
APRIL="April"
MAY_SHORT="May"
MAY="May"
JUNE_SHORT="Jun"
JUNE="June"
JULY_SHORT="Jul"
JULY="July"
AUGUST_SHORT="Aug"
AUGUST="August"
SEPTEMBER_SHORT="Sep"
SEPTEMBER="September"
OCTOBER_SHORT="Oct"
OCTOBER="October"
NOVEMBER_SHORT="Nov"
NOVEMBER="November"
DECEMBER_SHORT="Dec"
DECEMBER="December"

; Days of the Week

SAT="Sat"
SATURDAY="Saturday"
SUN="Sun"
SUNDAY="Sunday"
MON="Mon"
MONDAY="Monday"
TUE="Tue"
TUESDAY="Tuesday"
WED="Wed"
WEDNESDAY="Wednesday"
THU="Thu"
THURSDAY="Thursday"
FRI="Fri"
FRIDAY="Friday"

; Localised number format

DECIMALS_SEPARATOR="."
THOUSANDS_SEPARATOR=","

; Time Zones - this data has been removed as it is no longer used by Joomla 3.x

; Mailer Codes
PHPMAILER_PROVIDE_ADDRESS="You must provide at least one recipient email address."
PHPMAILER_MAILER_IS_NOT_SUPPORTED="Mailer is not supported."
PHPMAILER_EXECUTE="Could not execute: "
PHPMAILER_EXTENSION_MISSING="Extension missing: "
PHPMAILER_INSTANTIATE="Could not start mail function."
PHPMAILER_AUTHENTICATE="SMTP Error! Could not authenticate."
PHPMAILER_FROM_FAILED="The following from address failed: "
PHPMAILER_RECIPIENTS_FAILED="SMTP Error! The following recipients failed: "
PHPMAILER_DATA_NOT_ACCEPTED="SMTP Error! Data not accepted."
PHPMAILER_CONNECT_HOST="SMTP Error! Could not connect to SMTP host."
PHPMAILER_FILE_ACCESS="Could not access file: "
PHPMAILER_FILE_OPEN="File Error: Could not open file: "
PHPMAILER_ENCODING="Unknown encoding: "
PHPMAILER_SIGNING_ERROR="Signing error: "
PHPMAILER_SMTP_ERROR="SMTP server error: "
PHPMAILER_EMPTY_MESSAGE="Empty message body"
PHPMAILER_INVALID_ADDRESS="Invalid address"
PHPMAILER_VARIABLE_SET="Can't set or reset variable: "
PHPMAILER_SMTP_CONNECT_FAILED="SMTP connect failed"
PHPMAILER_TLS="Could not start TLS"

; Database types (allows for a more descriptive label than the internal name)
MYSQL="MySQL"
MYSQLI="MySQLi"
ORACLE="Oracle"
PGSQL="PostgreSQL (PDO)"
PDOMYSQL="MySQL (PDO)"
POSTGRESQL="PostgreSQL"
SQLAZURE="Microsoft SQL Azure"
SQLITE="SQLite"
SQLSRV="Microsoft SQL Server"

; Search tools
JSEARCH_TOOLS="Search Tools"
JSEARCH_TOOLS_DESC="Filter the list items."
JSEARCH_TOOLS_ORDERING="Order by:"
language/en-GB/en-GB.mod_feed.ini000060400000003201152453623440012351 0ustar00; Joomla! Project
; (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_FEED="Feed Display"
MOD_FEED_ERR_CACHE="Please make cache folder writable."
MOD_FEED_ERR_NO_URL="No feed URL specified."
MOD_FEED_ERR_FEED_NOT_RETRIEVED="Feed not found."
MOD_FEED_FIELD_DATE_DESC="Show the publication date of the feed."
MOD_FEED_FIELD_DATE_LABEL="Feed Date"
MOD_FEED_FIELD_DESCRIPTION_DESC="Show the description text for the whole Feed."
MOD_FEED_FIELD_DESCRIPTION_LABEL="Feed Description"
MOD_FEED_FIELD_IMAGE_DESC="Show the image associated with the whole feed."
MOD_FEED_FIELD_IMAGE_LABEL="Feed Image"
MOD_FEED_FIELD_ITEMDATE_DESC="Show the publication date of individual RSS Items."
MOD_FEED_FIELD_ITEMDATE_LABEL="Publication Date"
MOD_FEED_FIELD_ITEMDESCRIPTION_DESC="Show the Description or Intro text of individual RSS Items."
MOD_FEED_FIELD_ITEMDESCRIPTION_LABEL="Item Description"
MOD_FEED_FIELD_ITEMS_DESC="Enter number of RSS items to display."
MOD_FEED_FIELD_ITEMS_LABEL="Items"
MOD_FEED_FIELD_RSSTITLE_DESC="Display news feed title."
MOD_FEED_FIELD_RSSTITLE_LABEL="Feed Title"
MOD_FEED_FIELD_RSSURL_DESC="Enter the URL of the RSS/RDF/ATOM feed."
MOD_FEED_FIELD_RSSURL_LABEL="Feed URL"
MOD_FEED_FIELD_RTL_DESC="Display feed in RTL direction."
MOD_FEED_FIELD_RTL_LABEL="RTL Feed"
MOD_FEED_FIELD_WORDCOUNT_DESC="Allows you to limit the amount of visible Item description text. 0 will show all the text."
MOD_FEED_FIELD_WORDCOUNT_LABEL="Word Count"
MOD_FEED_XML_DESCRIPTION="This module allows the displaying of a syndicated feed."
language/en-GB/en-GB.plg_fields_list.sys.ini000060400000000570152453623440014575 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_LIST="Fields - List"
PLG_FIELDS_LIST_XML_DESCRIPTION="This plugin lets you create new fields of type 'list' in any extensions where custom fields are supported."
language/en-GB/en-GB.mod_custom.sys.ini000060400000000552152453623440013603 0ustar00; Joomla! Project
; (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_CUSTOM="Custom"
MOD_CUSTOM_XML_DESCRIPTION="This module allows you to create your own Module using a WYSIWYG editor."
MOD_CUSTOM_LAYOUT_DEFAULT="Default"

language/en-GB/en-GB.plg_extension_joomla.sys.ini000060400000000503152453623440015645 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_EXTENSION_JOOMLA="Extension - Joomla"
PLG_EXTENSION_JOOMLA_XML_DESCRIPTION="Manage the update sites for extensions."language/en-GB/en-GB.plg_finder_contacts.ini000060400000001172152453623440014623 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FINDER_CONTACTS="Smart Search - Contacts"
PLG_FINDER_CONTACTS_XML_DESCRIPTION="This plugin indexes Joomla! Contacts."

PLG_FINDER_QUERY_FILTER_BRANCH_P_CONTACT="Contacts"
PLG_FINDER_QUERY_FILTER_BRANCH_P_COUNTRY="Countries"
PLG_FINDER_QUERY_FILTER_BRANCH_P_REGION="Regions"

PLG_FINDER_QUERY_FILTER_BRANCH_S_CONTACT="Contact"
PLG_FINDER_QUERY_FILTER_BRANCH_S_COUNTRY="Country"
PLG_FINDER_QUERY_FILTER_BRANCH_S_REGION="Region"

language/en-GB/en-GB.plg_system_highlight.sys.ini000060400000000702152453623440015644 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_HIGHLIGHT="System - Highlight"
PLG_SYSTEM_HIGHLIGHT_ERROR_ACTIVATING_PLUGIN="Could not automatically activate the &quot;System - Highlight&quot; plugin"
PLG_SYSTEM_HIGHLIGHT_XML_DESCRIPTION="System plugin to highlight specified terms."
language/en-GB/en-GB.plg_content_pagebreak.ini000060400000004677152453623440015146 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8


PLG_CONTENT_PAGEBREAK="Content - Page Break"
PLG_CONTENT_PAGEBREAK_ALL_PAGES="All Pages"
PLG_CONTENT_PAGEBREAK_ARTICLE_INDEX="Article Index"
PLG_CONTENT_PAGEBREAK_NO_TITLE="No title"
PLG_CONTENT_PAGEBREAK_PAGES="Pages"
PLG_CONTENT_PAGEBREAK_PAGE_NUM="Page %s"
PLG_CONTENT_PAGEBREAK_SHOW_ALL_DESC="Displays the full article."
PLG_CONTENT_PAGEBREAK_SHOW_ALL_LABEL="Show All"
PLG_CONTENT_PAGEBREAK_SITE_ARTICLEINDEXTEXT="Custom Article Index Heading"
PLG_CONTENT_PAGEBREAK_SITE_ARTICLEINDEXTEXT_DESC="Enter a custom text for the Article Index Heading. If empty, standard will be used."
PLG_CONTENT_PAGEBREAK_SITE_ARTICLEINDEX_DESC="Show or hide Article Index Heading. The Heading displays on top of the Table of Contents."
PLG_CONTENT_PAGEBREAK_SITE_ARTICLEINDEX_LABEL="Article Index Heading"
PLG_CONTENT_PAGEBREAK_SITE_TITLE_DESC="Title and heading attributes from Plugin added to Site Title tag."
PLG_CONTENT_PAGEBREAK_SITE_TITLE_LABEL="Show Site Title"
PLG_CONTENT_PAGEBREAK_SLIDERS="Sliders"
PLG_CONTENT_PAGEBREAK_STYLE_DESC="Display the article with separate pages, tabs or sliders."
PLG_CONTENT_PAGEBREAK_STYLE_LABEL="Presentation Style"
PLG_CONTENT_PAGEBREAK_TABS="Tabs"
PLG_CONTENT_PAGEBREAK_TOC_DESC="Display a table of contents on multipage Articles."
PLG_CONTENT_PAGEBREAK_TOC_LABEL="Table of Contents"
PLG_CONTENT_PAGEBREAK_XML_DESCRIPTION="Allow the creation of a paginated article with an optional table of contents.<br /><br />Insert page breaks through the use of the page break button normally found in the WYSIWYG editor toolbar. The location of the page break in an article will be displayed in the editor as a simple horizontal line.<br /><br />The text displayed will depend on the options chosen and may be either the title, alternate text (if provided) or page numbers. <br /><br />The HTML usage is:<br />&lt;hr class=&quot;system-pagebreak&quot; /&gt;<br />&lt;hr class=&quot;system-pagebreak&quot; title=&quot;The page title&quot; /&gt; or <br />&lt;hr class=&quot;system-pagebreak&quot; alt=&quot;The first page&quot; /&gt; or <br />&lt;hr class=&quot;system-pagebreak&quot; title=&quot;The page title&quot; alt=&quot;The first page&quot; /&gt; or <br />&lt;hr class=&quot;system-pagebreak&quot; alt=&quot;The first page&quot; title=&quot;The page title&quot; /&gt;"
language/en-GB/en-GB.mod_logged.sys.ini000060400000000534152453623440013532 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8


MOD_LOGGED="Logged-in Users"
MOD_LOGGED_XML_DESCRIPTION="This module shows a list of the Logged-in Users."
MOD_LOGGED_LAYOUT_DEFAULT="Default"

language/en-GB/en-GB.plg_user_terms.sys.ini000060400000000543152453623440014464 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_USER_TERMS="User - Terms and Conditions"
PLG_USER_TERMS_XML_DESCRIPTION="Basic plugin to request user's consent to the site's terms and conditions."language/en-GB/en-GB.plg_system_debug.ini000060400000016405152453623440014155 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_DEBUG_BYTES="Bytes"
PLG_DEBUG_CALL_STACK="Call Stack"
PLG_DEBUG_CALL_STACK_CALLER="Caller"
PLG_DEBUG_CALL_STACK_FILE_AND_LINE="File and line number"
PLG_DEBUG_CALL_STACK_SAME_FILE="<em>Same as call in the line below.</em>"
PLG_DEBUG_ERRORS="Errors"
PLG_DEBUG_EXPLAIN="Explain"
PLG_DEBUG_FIELD_ALLOWED_GROUPS_DESC="Optionally restrict users that can see debug information to those in the selected user groups. If none selected, all users will see the debug information."
PLG_DEBUG_FIELD_ALLOWED_GROUPS_LABEL="Allowed Groups"
PLG_DEBUG_FIELD_EXECUTEDSQL_DESC="If enabled, executed SQL queries will be logged. Only use this setting for short periods of time and for benchmarking purposes."
PLG_DEBUG_FIELD_EXECUTEDSQL_LABEL="Log Executed Queries"
PLG_DEBUG_FIELD_LANGUAGE_ERRORFILES_DESC="Display a list of the language files that are in error according to the Joomla ini specification."
PLG_DEBUG_FIELD_LANGUAGE_ERRORFILES_LABEL="Show Errors When Parsing Language Files"
PLG_DEBUG_FIELD_LANGUAGE_FILES_DESC="Display a list of the language files that Joomla has tried to load."
PLG_DEBUG_FIELD_LANGUAGE_FILES_LABEL="Show Language Files"
PLG_DEBUG_FIELD_LANGUAGE_STRING_DESC="Display a list of the untranslated language strings."
PLG_DEBUG_FIELD_LANGUAGE_STRING_LABEL="Show Language String"
PLG_DEBUG_FIELD_LOGS_DESC="Display a list of logged messages."
PLG_DEBUG_FIELD_LOGS_LABEL="Show Log Entries"
PLG_DEBUG_FIELD_LOG_CATEGORIES_DESC="A comma separated list of log categories to include. Common log categories include but are not limited to: database, databasequery, database-error, deprecated and jerror. If empty, all categories will be shown."
PLG_DEBUG_FIELD_LOG_CATEGORIES_LABEL="Log Categories"
PLG_DEBUG_FIELD_LOG_CATEGORY_MODE_DESC="Select if the listed categories should be included or excluded."
PLG_DEBUG_FIELD_LOG_CATEGORY_MODE_EXCLUDE="Exclude"
PLG_DEBUG_FIELD_LOG_CATEGORY_MODE_INCLUDE="Include"
PLG_DEBUG_FIELD_LOG_CATEGORY_MODE_LABEL="Log Category Mode"
PLG_DEBUG_FIELD_LOG_DEPRECATED_DESC="If enabled, API marked as deprecated will be logged. Only use this setting for short periods of time for refactoring purposes."
PLG_DEBUG_FIELD_LOG_DEPRECATED_LABEL="Log Deprecated API"
PLG_DEBUG_FIELD_LOG_EVERYTHING_DESC="If enabled, all log messages produced by Joomla! will be logged except for deprecated API and database queries. Only use this setting for short periods of time for site debugging purposes."
PLG_DEBUG_FIELD_LOG_EVERYTHING_LABEL="Log Almost Everything"
PLG_DEBUG_FIELD_LOG_PRIORITIES_ALERT="Alert"
PLG_DEBUG_FIELD_LOG_PRIORITIES_ALL="All"
PLG_DEBUG_FIELD_LOG_PRIORITIES_CRITICAL="Critical"
PLG_DEBUG_FIELD_LOG_PRIORITIES_DEBUG="Debug"
PLG_DEBUG_FIELD_LOG_PRIORITIES_DESC="Select which log priority levels to display."
PLG_DEBUG_FIELD_LOG_PRIORITIES_EMERGENCY="Emergency"
PLG_DEBUG_FIELD_LOG_PRIORITIES_ERROR="Error"
PLG_DEBUG_FIELD_LOG_PRIORITIES_INFO="Info"
PLG_DEBUG_FIELD_LOG_PRIORITIES_LABEL="Log Priorities"
PLG_DEBUG_FIELD_LOG_PRIORITIES_NOTICE="Notice"
PLG_DEBUG_FIELD_LOG_PRIORITIES_WARNING="Warning"
PLG_DEBUG_FIELD_MEMORY_DESC="Display the total memory usage."
PLG_DEBUG_FIELD_MEMORY_LABEL="Show Memory Usage"
PLG_DEBUG_FIELD_PROFILING_DESC="Display the profiling waypoints."
PLG_DEBUG_FIELD_PROFILING_LABEL="Show Profiling"
PLG_DEBUG_FIELD_QUERIES_DESC="Display a list of the queries executed while displaying the page."
PLG_DEBUG_FIELD_QUERIES_LABEL="Show Queries"
PLG_DEBUG_FIELD_QUERY_TYPES_DESC="Display a list of unique query types and their number of occurrences for the current page. Useful for finding out about repeated queries that are either redundant or which can be grouped into a single, more efficient query."
PLG_DEBUG_FIELD_QUERY_TYPES_LABEL="Show Query Types"
PLG_DEBUG_FIELD_REFRESH_ASSETS_DESC="If enabled will, on each page reload, add a different hash to every script/stylesheet file with auto version so that they never use the browser cache."
PLG_DEBUG_FIELD_REFRESH_ASSETS_LABEL="Refresh Assets"
PLG_DEBUG_FIELD_SESSION_DESC="Display the session data."
PLG_DEBUG_FIELD_SESSION_LABEL="Show Session Data"
PLG_DEBUG_FIELD_STRIP_FIRST_DESC="In multi-word strings, always strip the first word."
PLG_DEBUG_FIELD_STRIP_FIRST_LABEL="Strip First Word"
PLG_DEBUG_FIELD_STRIP_PREFIX_DESC="Strip words from the beginning of the string. For multiple words, use the format: (word1|word2)."
PLG_DEBUG_FIELD_STRIP_PREFIX_LABEL="Strip From Start"
PLG_DEBUG_FIELD_STRIP_SUFFIX_DESC="Strip words from the end of the string. For multiple words, use the format: (word1|word2)."
PLG_DEBUG_FIELD_STRIP_SUFFIX_LABEL="Strip From End"
PLG_DEBUG_LANGUAGE_FIELDSET_LABEL="Language"
PLG_DEBUG_LANGUAGE_FILES_IN_ERROR="Parsing errors in language files"
PLG_DEBUG_LANGUAGE_FILES_LOADED="Language Files Loaded"
PLG_DEBUG_LANG_LOADED="Loaded"
PLG_DEBUG_LANG_NOT_LOADED="Not loaded"
PLG_DEBUG_LINK_FORMAT="Add xdebug.file_link_format directive to your php.ini file to have links for files."
PLG_DEBUG_LOGGING_FIELDSET_LABEL="Logging"
PLG_DEBUG_LOGS="Log Messages"
PLG_DEBUG_LOGS_DEPRECATED_FOUND_TEXT="The code that is marked as deprecated will not work in upcoming Joomla versions, please review it."
PLG_DEBUG_LOGS_DEPRECATED_FOUND_TITLE="%s deprecated messages logged!"
PLG_DEBUG_LOGS_LOGGED="%s messages logged"
PLG_DEBUG_MEMORY="Memory"
PLG_DEBUG_MEMORY_USED_FOR_QUERY="Query memory: %s Memory before query: %s"
PLG_DEBUG_MEMORY_USAGE="Memory Usage"
PLG_DEBUG_NO_PROFILE="No SHOW PROFILE (maybe because there are more than 100 queries)"
PLG_DEBUG_OTHER_QUERIES="OTHER Tables:"
PLG_DEBUG_PROFILE="Profile"
PLG_DEBUG_PROFILE_INFORMATION="Profile Information"
PLG_DEBUG_QUERIES="Database Queries"
PLG_DEBUG_QUERIES_LOGGED="%d Queries Logged"
PLG_DEBUG_QUERIES_TIME="Database queries total: %s"
PLG_DEBUG_QUERY_AFTER_LAST="After last query: %s"
PLG_DEBUG_QUERY_DUPLICATES="Duplicate queries"
PLG_DEBUG_QUERY_DUPLICATES_FOUND="Duplicate found!"
PLG_DEBUG_QUERY_DUPLICATES_NUMBER="%s duplicates"
PLG_DEBUG_QUERY_DUPLICATES_TOTAL_NUMBER="%s duplicate found!"
PLG_DEBUG_QUERY_EXPLAIN_NOT_POSSIBLE="EXPLAIN not possible on query: %s"
PLG_DEBUG_QUERY_TIME="Query Time: %s"
PLG_DEBUG_QUERY_TYPES_LOGGED="%d Query Types Logged, Sorted by Occurrences."
PLG_DEBUG_QUERY_TYPE_AND_OCCURRENCES="%2$d &#215; %1$s"
PLG_DEBUG_ROWS_RETURNED_BY_QUERY="Rows returned: %s"
PLG_DEBUG_SELECT_QUERIES="SELECT Tables:"
PLG_DEBUG_SESSION="Session"
PLG_DEBUG_TIME="Time"
PLG_DEBUG_TITLE="Joomla! Debug Console"
PLG_DEBUG_UNKNOWN_FILE="Unknown file"
PLG_DEBUG_UNTRANSLATED_STRINGS="Untranslated Strings"
PLG_DEBUG_WARNING_NO_INDEX="NO INDEX KEY COULD BE USED"
PLG_DEBUG_WARNING_NO_INDEX_DESC="This table probably has a missing index on WHERE equalities and/or JOIN ON column(s) or is written in a way that no index can be used, causing a time-consuming full table scan."
PLG_DEBUG_WARNING_USING_FILESORT="Using filesort"
PLG_DEBUG_WARNING_USING_FILESORT_DESC="This table probably has a missing index on WHERE/ON equality column(s) ending by the ORDER BY column(s) or is written in a way that no index can be used, causing a time-consuming filesort."
PLG_DEBUG_XML_DESCRIPTION="This plugin provides a variety of system information as well as help for the creation of translation files."
PLG_SYSTEM_DEBUG="System - Debug"
language/en-GB/en-GB.mod_menu.ini000060400000013314152453623440012420 0ustar00; Joomla! Project
; (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_MENU="Administrator Menu"
MOD_MENU_CLEAR_CACHE="Clear Cache"
MOD_MENU_COMPONENTS="Components"
MOD_MENU_COM_ACTIONLOGS="User Actions Log"
MOD_MENU_COM_CONTENT="Content"
MOD_MENU_COM_CONTENT_ARTICLE_MANAGER="Articles"
MOD_MENU_COM_CONTENT_CATEGORY_MANAGER="Categories"
MOD_MENU_COM_CONTENT_FEATURED="Featured Articles"
MOD_MENU_COM_CONTENT_NEW_ARTICLE="Add New Article"
MOD_MENU_COM_CONTENT_NEW_CATEGORY="Add New Category"
MOD_MENU_COM_LANGUAGES_SUBMENU_CONTENT="Content Languages"
MOD_MENU_COM_LANGUAGES_SUBMENU_INSTALLED="Installed"
MOD_MENU_COM_LANGUAGES_SUBMENU_OVERRIDES="Overrides"
MOD_MENU_COM_PRIVACY="Privacy"
MOD_MENU_COM_TEMPLATES_SUBMENU_STYLES="Styles"
MOD_MENU_COM_TEMPLATES_SUBMENU_TEMPLATES="Templates"
MOD_MENU_COM_USERS="Users"
MOD_MENU_COM_USERS_ADD_GROUP="Add New Group"
MOD_MENU_COM_USERS_ADD_LEVEL="Add New Access Level"
MOD_MENU_COM_USERS_ADD_USER="Add New User"
MOD_MENU_COM_USERS_GROUPS="Groups"
MOD_MENU_COM_USERS_LEVELS="Access Levels"
MOD_MENU_COM_USERS_USERS="Users"
MOD_MENU_COM_USERS_USER_MANAGER="Manage"
MOD_MENU_COM_USERS_ADD_NOTE="Add User Note"
MOD_MENU_COM_USERS_NOTES="User Notes"
MOD_MENU_COM_USERS_NOTE_CATEGORIES="User Note Categories"
MOD_MENU_CONFIGURATION="Global Configuration"
MOD_MENU_CONTROL_PANEL="Control Panel"
MOD_MENU_EXTENSIONS_EXTENSIONS="Extensions"
MOD_MENU_EXTENSIONS_EXTENSION_MANAGER="Manage"
MOD_MENU_EXTENSIONS_LANGUAGE_MANAGER="Language(s)"
MOD_MENU_EXTENSIONS_MODULE_MANAGER="Modules"
MOD_MENU_EXTENSIONS_PLUGIN_MANAGER="Plugins"
MOD_MENU_EXTENSIONS_TEMPLATE_MANAGER="Templates"
MOD_MENU_FIELD_CHECK_DESC="Check for the presence of important menu items."
MOD_MENU_FIELD_CHECK_LABEL="Check Menu"
MOD_MENU_FIELD_FORUMURL_DESC="Enter the URL to a forum other than the default."
MOD_MENU_FIELD_FORUMURL_LABEL="Custom Support Forum"
MOD_MENU_FIELD_MENUTYPE_LABEL="Menu to Show"
MOD_MENU_FIELD_MENUTYPE_DESC="Choose which menu should be rendered with this instance of module."
MOD_MENU_FIELD_MENUTYPE_OPTION_PREDEFINED="Use a Preset"
MOD_MENU_FIELD_PRESET_LABEL="Choose Preset"
MOD_MENU_FIELD_PRESET_DESC="Choose a preset to use as the backend menu"
MOD_MENU_FIELD_SHOWHELP="Help Menu"
MOD_MENU_FIELD_SHOWHELP_DESC="Show or hide the Help menu which includes links to various joomla.org sites useful to users."
MOD_MENU_FIELD_SHOWNEW="Add New Shortcuts"
MOD_MENU_FIELD_SHOWNEW_DESC="Show or hide various 'Add New ...' shortcuts against users, groups, access levels, articles and categories."
MOD_MENU_FIELDS="Fields"
MOD_MENU_FIELDS_GROUP="Field Groups"
MOD_MENU_GLOBAL_CHECKIN="Global Check-in"
MOD_MENU_HELP="Help"
MOD_MENU_HELP_COMMUNITY="Community Portal"
MOD_MENU_HELP_CURRENT="Help with this page"
MOD_MENU_HELP_DEVELOPER="Developer Resources"
MOD_MENU_HELP_DOCUMENTATION="Documentation Wiki"
MOD_MENU_HELP_EXTENSIONS="Joomla! Extensions"
MOD_MENU_HELP_JOOMLA="Joomla! Help"
MOD_MENU_HELP_LINKS="Useful Joomla! links"
MOD_MENU_HELP_RESOURCES="Joomla! Resources"
MOD_MENU_HELP_SECURITY="Security Centre"
MOD_MENU_HELP_SHOP="Joomla! Shop"
MOD_MENU_HELP_SUPPORT_OFFICIAL_FORUM="Official Support Forum"
; the string below will be used if the localised sample data has a URL for the desired community forum or if the 'Custom Support Forum' field parameter in the Administrator Menu module has a URL
MOD_MENU_HELP_SUPPORT_CUSTOM_FORUM="Custom Support Forum"
; Enter in the string below the # of the specific language forum in https://forum.joomla.org/ (example: 19 for French). If left empty, it will use '511' which is the section for all languages forums.
MOD_MENU_HELP_SUPPORT_OFFICIAL_LANGUAGE_FORUM_VALUE="511"
; If you have chosen to display in the string above the section for all languages, translate the string below. 
; If you have displayed the specific language forum, use something like "Official French Forum" in your language. 
MOD_MENU_HELP_SUPPORT_OFFICIAL_LANGUAGE_FORUM="Official Language Forums"
MOD_MENU_HELP_TRANSLATIONS="Joomla! Translations"
MOD_MENU_HELP_XCHANGE="Stack Exchange"
MOD_MENU_HOME_DEFAULT="Home"
MOD_MENU_HOME_MULTIPLE="Warning! Multiple homes!"
MOD_MENU_IMPORTANT_ITEM_MENU_MANAGER="Menu Manager"
MOD_MENU_IMPORTANT_ITEM_MODULE_MANAGER="Module Manager"
MOD_MENU_IMPORTANT_ITEM_COMPONENTS_CONTAINER="Components Container"
MOD_MENU_IMPORTANT_ITEMS_INACCESSIBLE_LIST_WARNING="The administrator menu <strong>%1$s</strong> does not have - <strong>%2$s</strong>. Select to <strong><a href='%3$s'>turn on the menu recovery mode</a></strong>."
MOD_MENU_INSTALLER_SUBMENU_DATABASE="Database"
MOD_MENU_INSTALLER_SUBMENU_DISCOVER="Discover"
MOD_MENU_INSTALLER_SUBMENU_INSTALL="Install"
MOD_MENU_INSTALLER_SUBMENU_LANGUAGES="Install Languages"
MOD_MENU_INSTALLER_SUBMENU_MANAGE="Manage"
MOD_MENU_INSTALLER_SUBMENU_UPDATE="Update"
MOD_MENU_INSTALLER_SUBMENU_UPDATESITES="Update Sites"
MOD_MENU_INSTALLER_SUBMENU_WARNINGS="Warnings"
MOD_MENU_LOGOUT="Logout"
MOD_MENU_MASS_MAIL_USERS="Mass Mail Users"
MOD_MENU_MEDIA_MANAGER="Media"
MOD_MENU_MENUS="Menus"
MOD_MENU_MENUS_ALL_ITEMS="All Menu Items"
MOD_MENU_MENU_MANAGER="Manage"
MOD_MENU_MENU_MANAGER_NEW_MENU="Add New Menu"
MOD_MENU_MENU_MANAGER_NEW_MENU_ITEM="Add New Menu Item"
MOD_MENU_NEW_PRIVATE_MESSAGE="New Private Message"
MOD_MENU_PURGE_EXPIRED_CACHE="Clear Expired Cache"
MOD_MENU_READ_PRIVATE_MESSAGES="Read Private Messages"
MOD_MENU_RECOVERY_EXIT="Exit Recovery Mode"
MOD_MENU_RECOVERY_MENU_ROOT="Menu Recovery"
MOD_MENU_SETTINGS="Settings"
MOD_MENU_MAINTENANCE="Maintenance"
MOD_MENU_SYSTEM_INFORMATION="System Information"
MOD_MENU_SYSTEM="System"
MOD_MENU_TOOLS="Tools"
MOD_MENU_USER_PROFILE="My Profile"
MOD_MENU_XML_DESCRIPTION="This module displays an administrator menu module."
language/en-GB/en-GB.plg_captcha_recaptcha_invisible.ini000060400000005077152453623440017147 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CAPTCHA_RECAPTCHA_INVISIBLE="CAPTCHA - Invisible reCAPTCHA"
PLG_CAPTCHA_RECAPTCHA_INVISIBLE_XML_DESCRIPTION="This CAPTCHA plugin uses the Invisible reCAPTCHA service. To get a site and secret key for your domain, go to <a href="_QQ_"https://www.google.com/recaptcha"_QQ_" target="_QQ_"_blank"_QQ_">https://www.google.com/recaptcha</a>."
; Params
PLG_RECAPTCHA_INVISIBLE_BADGE_BOTTOMLEFT="Bottom left"
PLG_RECAPTCHA_INVISIBLE_BADGE_BOTTOMRIGHT="Bottom right"
PLG_RECAPTCHA_INVISIBLE_BADGE_DESC="Positioning of the reCAPTCHA badge."
PLG_RECAPTCHA_INVISIBLE_BADGE_INLINE="Inline"
PLG_RECAPTCHA_INVISIBLE_BADGE_LABEL="Badge"
PLG_RECAPTCHA_INVISIBLE_CALLBACK_DESC="(Optional) JavaScript callback, executed after successful reCAPTCHA response."
PLG_RECAPTCHA_INVISIBLE_CALLBACK_LABEL="Callback"
PLG_RECAPTCHA_INVISIBLE_ERROR_CALLBACK_DESC="(Optional) JavaScript callback, executed when the reCAPTCHA encounters an error."
PLG_RECAPTCHA_INVISIBLE_ERROR_CALLBACK_LABEL="Error Callback"
PLG_RECAPTCHA_INVISIBLE_EXPIRED_CALLBACK_DESC="(Optional) JavaScript callback, executed when the reCAPTCHA expired."
PLG_RECAPTCHA_INVISIBLE_EXPIRED_CALLBACK_LABEL="Expired Callback"
PLG_RECAPTCHA_INVISIBLE_PRIVATE_KEY_DESC="Used in the communication between your server and the reCAPTCHA server. Be sure to keep it a secret."
PLG_RECAPTCHA_INVISIBLE_PRIVATE_KEY_LABEL="Secret Key"
PLG_RECAPTCHA_INVISIBLE_PUBLIC_KEY_DESC="Used in the JavaScript code that is served to your users."
PLG_RECAPTCHA_INVISIBLE_PUBLIC_KEY_LABEL="Site Key"
PLG_RECAPTCHA_INVISIBLE_TABINDEX_DESC="The tabindex of the challenge."
PLG_RECAPTCHA_INVISIBLE_TABINDEX_LABEL="Tabindex"
; Privacy notice
PLG_RECAPTCHA_INVISIBLE_PRIVACY_CAPABILITY_IP_ADDRESS="The Invisible reCAPTCHA plugin integrates with Google's reCAPTCHA system as a spam protection service. As part of this service, the IP address of the user answering the captcha challenge is transmitted to Google."
; Error messages
PLG_RECAPTCHA_INVISIBLE_ERROR_EMPTY_SOLUTION="Empty solution not allowed."
PLG_RECAPTCHA_INVISIBLE_ERROR_NO_IP="For security reasons, you must pass the remote IP address to reCAPTCHA."
PLG_RECAPTCHA_INVISIBLE_ERROR_NO_PRIVATE_KEY="reCAPTCHA plugin needs a secret key to be set in its parameters. Please contact a site administrator."
PLG_RECAPTCHA_INVISIBLE_ERROR_NO_PUBLIC_KEY="reCAPTCHA plugin needs a site key to be set in its parameters. Please contact a site administrator."
language/en-GB/en-GB.plg_system_weblinks.ini000060400000000643152453623440014702 0ustar00; Joomla! Project
; Copyright (C) 2005 - 2020 Open Source Matters. All rights reserved.
; License GNU General Public License version 2 or later; see LICENSE.txt, see LICENSE.php
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_WEBLINKS="System - Web Links"
PLG_SYSTEM_WEBLINKS_STATISTICS="Web Links"
PLG_SYSTEM_WEBLINKS_XML_DESCRIPTION="This plugin returns statistical information about Joomla! Web Links."
language/en-GB/en-GB.plg_fields_mediajce.sys.ini000060400000000552152453623440015363 0ustar00; JCE
; Copyright (C) 2009 - 2018 Ryan Demmer. All rights reserved.
; License GNU General Public License version 2 or later; see LICENSE.txt, see LICENSE.php
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_MEDIAJCE="Fields - Media JCE"
PLG_FIELDS_MEDIAJCE_XML_DESCRIPTION="JCE Media Field Plugin"
PLG_FIELDS_MEDIAJCE_LABEL="JCE File Browser (media)"language/en-GB/en-GB.plg_quickicon_extensionupdate.sys.ini000060400000000704152453623440017557 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_QUICKICON_EXTENSIONUPDATE="Quick Icon - Joomla! Extensions Updates Notification"
PLG_QUICKICON_EXTENSIONUPDATE_XML_DESCRIPTION="Checks for updates of your installed third-party extensions and notifies you when you visit the Control Panel page."
language/en-GB/en-GB.plg_content_pagebreak.sys.ini000060400000002315152453623440015746 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8


PLG_CONTENT_PAGEBREAK="Content - Page Break"
PLG_CONTENT_PAGEBREAK_XML_DESCRIPTION="Allow the creation of a paginated article with an optional table of contents.<br /><br />Insert page breaks through the use of the page break button normally found in the WYSIWYG editor toolbar. The location of the page break in an article will be displayed in the editor as a simple horizontal line.<br /><br />The text displayed will depend on the options chosen and may be either the title, alternate text (if provided) or page numbers. <br /><br />The HTML usage is:<br />&lt;hr class=&quot;system-pagebreak&quot; /&gt;<br />&lt;hr class=&quot;system-pagebreak&quot; title=&quot;The page title&quot; /&gt; or <br />&lt;hr class=&quot;system-pagebreak&quot; alt=&quot;The first page&quot; /&gt; or <br />&lt;hr class=&quot;system-pagebreak&quot; title=&quot;The page title&quot; alt=&quot;The first page&quot; /&gt; or <br />&lt;hr class=&quot;system-pagebreak&quot; alt=&quot;The first page&quot; title=&quot;The page title&quot; /&gt;"
language/en-GB/en-GB.plg_privacy_consents.ini000060400000000573152453623440015053 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_PRIVACY_CONSENTS="Privacy - Consents"
PLG_PRIVACY_CONSENTS_XML_DESCRIPTION="Responsible for processing privacy related requests for the core Joomla privacy consents data."
language/en-GB/en-GB.plg_finder_categories.sys.ini000060400000000772152453623440015754 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FINDER_CATEGORIES="Smart Search - Categories"
PLG_FINDER_CATEGORIES_ERROR_ACTIVATING_PLUGIN="Could not automatically activate the &quot;Smart Search - Categories&quot; plugin."
PLG_FINDER_CATEGORIES_XML_DESCRIPTION="This plugin indexes Joomla! Categories."
PLG_FINDER_STATISTICS_CATEGORY="Category"
language/en-GB/en-GB.plg_quickicon_extensionupdate.ini000060400000002242152453623440016741 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_QUICKICON_EXTENSIONUPDATE="Quick Icon - Joomla! Extensions Updates Notification"
PLG_QUICKICON_EXTENSIONUPDATE_CHECKING="Checking extensions ..."
PLG_QUICKICON_EXTENSIONUPDATE_ERROR="Unknown extensions ..."
PLG_QUICKICON_EXTENSIONUPDATE_GROUP_DESC="The group of this plugin (this value is compared with the group value used in <strong>Quick Icons</strong> modules to inject icons)."
PLG_QUICKICON_EXTENSIONUPDATE_GROUP_LABEL="Group"
PLG_QUICKICON_EXTENSIONUPDATE_UPDATEFOUND="Updates are available! <span class='label label-important'>%s</span>"
PLG_QUICKICON_EXTENSIONUPDATE_UPDATEFOUND_BUTTON="View Updates"
PLG_QUICKICON_EXTENSIONUPDATE_UPDATEFOUND_MESSAGE="<span class='label label-important'>%s</span> Extension Update(s) are available:"
PLG_QUICKICON_EXTENSIONUPDATE_UPTODATE="All extensions are up to date."
PLG_QUICKICON_EXTENSIONUPDATE_XML_DESCRIPTION="Checks for updates of your installed third-party extensions and notifies you when you visit the Control Panel page."
language/en-GB/en-GB.plg_authentication_cookie.ini000060400000003175152453623440016033 0ustar00; Joomla! Project
; (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_AUTH_COOKIE_ERROR_LOG_INVALIDATED_COOKIES="The authentication tokens were invalidated for user %u because there was no matching record."
PLG_AUTH_COOKIE_ERROR_LOG_LOGIN_FAILED="Cookie login failed for user %u."
PLG_AUTH_COOKIE_FIELD_COOKIE_LIFETIME_DESC="The number of days until the authentication cookie will expire. Other factors may cause it to expire before this. Longer lengths are less secure."
PLG_AUTH_COOKIE_FIELD_COOKIE_LIFETIME_LABEL="Cookie Lifetime"
PLG_AUTH_COOKIE_FIELD_KEY_LENGTH_DESC="The length of the key to use to encrypt the cookie. Longer lengths are more secure, but they will slow performance."
PLG_AUTH_COOKIE_FIELD_KEY_LENGTH_LABEL="Key Length"
PLG_AUTH_COOKIE_PRIVACY_CAPABILITY_COOKIE="In conjunction with a plugin which supports a \"Remember Me\" feature, such as the \"System - Remember Me\" plugin, this plugin creates a cookie in the user's browser if a \"Remember Me\" checkbox is selected when logging into the website. This cookie can be identified with the prefix `joomla_remember_me` and is used to automatically log users into the website when they visit and are not already logged in."
PLG_AUTH_COOKIE_XML_DESCRIPTION="Handles Joomla's cookie User authentication.<br /><strong> Warning! You must have at least one other authentication plugin enabled.</strong> <br />You will also need a plugin such as the System - Remember Me plugin to implement cookie login."
PLG_AUTHENTICATION_COOKIE="Authentication - Cookie"
language/en-GB/en-GB.plg_user_joomla.ini000060400000004207152453623440013777 0ustar00; Joomla! Project
; (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_USER_JOOMLA="User - Joomla!"
PLG_USER_JOOMLA_FIELD_AUTOREGISTER_DESC="Automatically create Registered Users where possible."
PLG_USER_JOOMLA_FIELD_AUTOREGISTER_LABEL="Auto-create Users"
PLG_USER_JOOMLA_FIELD_FORCELOGOUT_DESC="Set to No to disable this."
PLG_USER_JOOMLA_FIELD_FORCELOGOUT_LABEL="Force Logout for all Sessions?"
PLG_USER_JOOMLA_FIELD_MAILTOUSER_DESC="When an administrator creates a user account, this determines if an email, which has their username and password, is sent to the user."
PLG_USER_JOOMLA_FIELD_MAILTOUSER_LABEL="Notification Mail to User"
PLG_USER_JOOMLA_FIELD_STRONG_PASSWORDS_DESC="If set to yes, use the bcrypt encryption method if available in this version of PHP."
PLG_USER_JOOMLA_FIELD_STRONG_PASSWORDS_LABEL="Strong Passwords"
PLG_USER_JOOMLA_NEW_USER_EMAIL_BODY="Hello %s,\n\n\nYou have been added as a User to %s by an Administrator.\n\nThis email has your username and password to log in to %s\n\nUsername: %s\nPassword: %s\n\n\nPlease do not respond to this message as it is automatically generated and is for information purposes only."
PLG_USER_JOOMLA_NEW_USER_EMAIL_SUBJECT="New User Details"
PLG_USER_JOOMLA_POSTINSTALL_STRONGPW_BTN="Enable Strong Password Encryption"
PLG_USER_JOOMLA_POSTINSTALL_STRONGPW_TEXT="As a security feature, Joomla allows you to switch to strong password encryption.<br />To turn strong passwords on select the button below. Alternatively you can edit the User - Joomla plugin and change the strong password setting to On.<br />Before enabling you should verify that all third party registration/login, user management or bridge extensions installed on your site support this strong password encryption."
PLG_USER_JOOMLA_POSTINSTALL_STRONGPW_TITLE="Strong passwords"
PLG_USER_JOOMLA_XML_DESCRIPTION="Handles Joomla's default User synchronisation.<br /><strong>Warning! You must have enabled at least one plugin that handles the user session management or you will lose all access to your site.</strong>"
language/en-GB/en-GB.plg_installer_webinstaller.ini000060400000004040152453623440016223 0ustar00; Joomla! Project
; (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_INSTALLER_WEBINSTALLER="Installer - Install from Web"
PLG_INSTALLER_WEBINSTALLER_CANNOT_INSTALL_EXTENSION_IN_PLUGIN="This extension cannot be installed using the install from web system. Please visit the developer's website to purchase/download."
PLG_INSTALLER_WEBINSTALLER_ERROR_PLUGIN_INCLUDED_IN_CORE="Plugin installation has been aborted. The Install from Web plugin is included in core as of Joomla! 4.0."
; This string is not used.
PLG_INSTALLER_WEBINSTALLER_LOAD_APPS="Display the extensions"
; The [SITEURL] placeholder should not be translated as it is used in the JavaScript API to insert the correct URL
PLG_INSTALLER_WEBINSTALLER_REDIRECT_TO_EXTERNAL_SITE_TO_INSTALL="You will be redirected to the following link to complete the registration/purchase: [SITEURL]"
; This string is deprecated and not used in version 2.0 of the plugin but is required for compatibility with 1.x releases due to the language files being bundled in the CMS package.
PLG_INSTALLER_WEBINSTALLER_TAB_POSITION_DESC="Place the Install from Web tab first or last."
; This string is deprecated and not used in version 2.0 of the plugin but is required for compatibility with 1.x releases due to the language files being bundled in the CMS package.
PLG_INSTALLER_WEBINSTALLER_TAB_POSITION_LABEL="Tab Position"
; This string is deprecated and not used in version 2.0 of the plugin but is required for compatibility with 1.x releases due to the language files being bundled in the CMS package.
PLG_INSTALLER_WEBINSTALLER_TAB_POSITION_FIRST="First"
; This string is deprecated and not used in version 2.0 of the plugin but is required for compatibility with 1.x releases due to the language files being bundled in the CMS package.
PLG_INSTALLER_WEBINSTALLER_TAB_POSITION_LAST="Last"
PLG_INSTALLER_WEBINSTALLER_XML_DESCRIPTION="This plugin offers functionality for the 'Install from Web' tab."
language/en-GB/en-GB.mod_popular.sys.ini000060400000000721152453623440013751 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_POPULAR_XML_DESCRIPTION="This module shows a list of the most popular published Articles that are still current. Some that are shown may have expired even though they are the most recent."
MOD_POPULAR="Popular Articles"
MOD_POPULAR_LAYOUT_DEFAULT="Default"

language/en-GB/en-GB.plg_editors-xtd_module.sys.ini000060400000000573152453623440016112 0ustar00; Joomla! Project
; (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS-XTD_MODULE="Button - Module"
PLG_MODULE_XML_DESCRIPTION="Displays a button to insert a module into an Article. Displays a popup allowing you to choose the module."
language/en-GB/en-GB.plg_user_contactcreator.sys.ini000060400000000543152453623440016345 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CONTACTCREATOR_XML_DESCRIPTION="Plugin to automatically create contact information for new users."
PLG_USER_CONTACTCREATOR="User - Contact Creator"
language/en-GB/en-GB.mod_logged.ini000060400000001433152453623440012714 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8


MOD_LOGGED="Logged-in Users"
MOD_LOGGED_ADMINISTRATOR="Administrator"
MOD_LOGGED_EDIT_USER="Edit user"
MOD_LOGGED_FIELD_COUNT_DESC="The number of items to display (default 5)."
MOD_LOGGED_FIELD_COUNT_LABEL="Count"
MOD_LOGGED_FIELD_NAME_DESC="Displays name or username."
MOD_LOGGED_LAST_ACTIVITY="Last Activity"
MOD_LOGGED_LOGOUT="Logout"
MOD_LOGGED_NAME="Name"
MOD_LOGGED_SITE="Site"
MOD_LOGGED_TITLE="Last Logged-in Users"
MOD_LOGGED_TITLE_1="Last Logged-in User"
MOD_LOGGED_TITLE_MORE="Last %s Logged-in Users"
MOD_LOGGED_XML_DESCRIPTION="This module shows a list of the Logged-in Users."
language/en-GB/en-GB.com_ajax.sys.ini000060400000000452152453623440013212 0ustar00; Joomla! Project
; (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8


COM_AJAX="Ajax Interface"
COM_AJAX_XML_DESCRIPTION="An extendable Ajax interface for Joomla."
language/en-GB/en-GB.plg_privacy_message.sys.ini000060400000000573152453623440015460 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_PRIVACY_MESSAGE="Privacy - User Messages"
PLG_PRIVACY_MESSAGE_XML_DESCRIPTION="Responsible for processing privacy related requests for the core Joomla user messages data."
language/en-GB/en-GB.plg_finder_content.sys.ini000060400000001126152453623440015273 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FINDER_CONTENT="Smart Search - Content"
PLG_FINDER_CONTENT_ERROR_ACTIVATING_PLUGIN="Could not automatically activate the &quot;Smart Search - Content&quot; plugin."
PLG_FINDER_CONTENT_XML_DESCRIPTION="Updates the indexes of Joomla! Articles whenever an article is created, modified or deleted. NOTE the Content - Smart Search plugin must be enabled."
PLG_FINDER_STATISTICS_ARTICLE="Article"
language/en-GB/en-GB.plg_fields_color.sys.ini000060400000000575152453623440014745 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_COLOR="Fields - Colour"
PLG_FIELDS_COLOR_XML_DESCRIPTION="This plugin lets you create new fields of type 'color' in any extensions where custom fields are supported."
language/en-GB/en-GB.com_postinstall.ini000060400000002101152453623440014017 0ustar00; Joomla! Project
; (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_POSTINSTALL="Post-installation Messages"
COM_POSTINSTALL_BTN_HIDE="Hide this message"
COM_POSTINSTALL_BTN_RESET="Reset Messages"
COM_POSTINSTALL_CONFIGURATION="Post-installation Messages: Options"
COM_POSTINSTALL_HIDE_ALL_MESSAGES="Hide all messages"
COM_POSTINSTALL_LBL_MESSAGES="Post-installation and Upgrade Messages"
COM_POSTINSTALL_LBL_NOMESSAGES_DESC="You have read all the messages."
COM_POSTINSTALL_LBL_NOMESSAGES_TITLE="No Messages"
COM_POSTINSTALL_LBL_RELEASENEWS="Release news <a href="_QQ_"https://www.joomla.org/announcements/release-news.html"_QQ_">from the Joomla! Project</a>"
COM_POSTINSTALL_LBL_SINCEVERSION="Since version %s"
COM_POSTINSTALL_MESSAGES_FOR="Showing messages for"
COM_POSTINSTALL_MESSAGES_TITLE="Post-installation Messages for %s"
COM_POSTINSTALL_XML_DESCRIPTION="Displays post-installation and post-upgrade messages for Joomla and its extensions."
language/en-GB/en-GB.com_finder.sys.ini000060400000000610152453623440013532 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_FINDER="Smart Search"
COM_FINDER_MENU_SEARCH_VIEW_DEFAULT_TEXT="The default search layout."
COM_FINDER_MENU_SEARCH_VIEW_DEFAULT_TITLE="Search"
COM_FINDER_XML_DESCRIPTION="Smart Search"
language/en-GB/en-GB.plg_content_loadmodule.sys.ini000060400000001127152453623440016152 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CONTENT_LOADMODULE="Content - Load Modules"
PLG_LOADMODULE_XML_DESCRIPTION="Within content this plugin loads a Module by ID, Syntax: {loadmoduleid 1} or a Module by position, Syntax: {loadposition user1} or a Module by name, Syntax: {loadmodule mod_login}. Optionally can specify module style and for loadmodule a specific module by title, Syntax: {loadmodule mod_login,module title,style}."
language/en-GB/en-GB.plg_extension_joomla.ini000060400000000565152453623440015040 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_EXTENSION_JOOMLA="Extension - Joomla"
PLG_EXTENSION_JOOMLA_XML_DESCRIPTION="Manage the update sites for extensions."
PLG_EXTENSION_JOOMLA_UNKNOWN_SITE="Unknown Site"
language/en-GB/en-GB.plg_editors-xtd_fields.ini000060400000001200152453623440015242 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS-XTD_FIELDS="Button - Field"
PLG_EDITORS-XTD_FIELDS_BUTTON_FIELD="Field"
PLG_EDITORS-XTD_FIELDS_XML_DESCRIPTION="Displays a button to insert a custom field into an editor area. Displays a popup allowing you to choose the field.<br/><strong>Warning!</strong>: the custom field will not be rendered if the <a href=\"index.php?option=com_plugins&view=plugins&filter[folder]=content\">Content - Fields</a> plugin is not enabled."
language/en-GB/en-GB.lib_joomla.ini000060400000167632152453623440012741 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

; Common boolean values
; Note: YES, NO, TRUE, FALSE are reserved words in INI format.

; Keep this string on top
JERROR_PARSING_LANGUAGE_FILE="&#160;: error(s) in line(s) %s"

JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN="Access forbidden."
JLIB_APPLICATION_ERROR_APPLICATION_GET_NAME="JApplication: :getName() : Can't get or parse class name."
JLIB_APPLICATION_ERROR_APPLICATION_LOAD="Unable to load application: %s"
JLIB_APPLICATION_ERROR_BATCH_CANNOT_CREATE="You are not allowed to create new items in this category."
JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT="You are not allowed to edit one or more of these items."
JLIB_APPLICATION_ERROR_BATCH_FAILED="Batch process failed with following error: %s"
JLIB_APPLICATION_ERROR_BATCH_MOVE_CATEGORY_NOT_FOUND="Can't find the destination category for this move."
JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND="Can't find the item being moved."
JLIB_APPLICATION_ERROR_CHECKIN_FAILED="Check-in failed with the following error: %s"
JLIB_APPLICATION_ERROR_CHECKIN_NOT_CHECKED="Item is not checked out."
JLIB_APPLICATION_ERROR_CHECKIN_USER_MISMATCH="The user checking in does not match the user who checked out the item."
JLIB_APPLICATION_ERROR_CHECKOUT_FAILED="Check-out failed with the following error: %s"
JLIB_APPLICATION_ERROR_CHECKOUT_USER_MISMATCH="The user checking out does not match the user who checked out the item."
JLIB_APPLICATION_ERROR_COMPONENT_NOT_FOUND="Component not found."
JLIB_APPLICATION_ERROR_COMPONENT_NOT_LOADING="Error loading component: %1$s, %2$s"
JLIB_APPLICATION_ERROR_CONTROLLER_GET_NAME="JController: :getName() : Can't get or parse class name."
JLIB_APPLICATION_ERROR_CREATE_RECORD_NOT_PERMITTED="Create record not permitted."
JLIB_APPLICATION_ERROR_DELETE_NOT_PERMITTED="Delete not permitted."
JLIB_APPLICATION_ERROR_EDITSTATE_NOT_PERMITTED="Edit state is not permitted."
JLIB_APPLICATION_ERROR_EDIT_ITEM_NOT_PERMITTED="Edit is not permitted."
JLIB_APPLICATION_ERROR_EDIT_NOT_PERMITTED="Edit not permitted."
JLIB_APPLICATION_ERROR_HISTORY_ID_MISMATCH="Error restoring item version from history."
JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION="Insufficient information to perform the batch operation."
JLIB_APPLICATION_ERROR_INVALID_CONTROLLER_CLASS="Invalid controller class: %s"
JLIB_APPLICATION_ERROR_INVALID_CONTROLLER="Invalid controller: name='%s', format='%s'"
JLIB_APPLICATION_ERROR_LAYOUTFILE_NOT_FOUND="Layout %s not found."
JLIB_APPLICATION_ERROR_LIBRARY_NOT_FOUND="Library not found."
JLIB_APPLICATION_ERROR_LIBRARY_NOT_LOADING="Error loading library: %1$s, %2$s"
JLIB_APPLICATION_ERROR_MENU_LOAD="Error loading menu: %s"
JLIB_APPLICATION_ERROR_MODEL_GET_NAME="JModel: :getName() : Can't get or parse class name."
JLIB_APPLICATION_ERROR_MODULE_LOAD="Error loading module %s"
JLIB_APPLICATION_ERROR_PATHWAY_LOAD="Unable to load pathway: %s"
JLIB_APPLICATION_ERROR_REORDER_FAILED="Reorder failed. Error: %s"
JLIB_APPLICATION_ERROR_ROUTER_LOAD="Unable to load router: %s"
JLIB_APPLICATION_ERROR_MODELCLASS_NOT_FOUND="Model class %s not found in file."
JLIB_APPLICATION_ERROR_SAVE_FAILED="Save failed with the following error: %s"
JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED="Save not permitted."
JLIB_APPLICATION_ERROR_TABLE_NAME_NOT_SUPPORTED="Table %s not supported. File not found."
JLIB_APPLICATION_ERROR_TASK_NOT_FOUND="Task [%s] not found."
JLIB_APPLICATION_ERROR_UNHELD_ID="You are not permitted to use that link to directly access that page (#%d)."
JLIB_APPLICATION_ERROR_VIEW_CLASS_NOT_FOUND="View class not found [class, file]: %1$s, %2$s"
JLIB_APPLICATION_ERROR_VIEW_GET_NAME_SUBSTRING="JView: :getName() : Your classname has the substring 'view'. This causes problems when extracting the classname from the name of your objects view. Avoid Object names with the substring 'view'."
JLIB_APPLICATION_ERROR_VIEW_GET_NAME="JView: :getName() : Can't get or parse class name."
JLIB_APPLICATION_ERROR_VIEW_NOT_FOUND="View not found [name, type, prefix]: %1$s, %2$s, %3$s"
JLIB_APPLICATION_SAVE_SUCCESS="Item saved."
JLIB_APPLICATION_SUBMIT_SAVE_SUCCESS="Item submitted."
JLIB_APPLICATION_SUCCESS_BATCH="Batch process completed."
JLIB_APPLICATION_SUCCESS_ITEM_REORDERED="Ordering saved."
JLIB_APPLICATION_SUCCESS_ORDERING_SAVED="Ordering saved."
JLIB_APPLICATION_SUCCESS_LOAD_HISTORY="Prior version restored. Saved on %s %s."

JLIB_LOGIN_AUTHENTICATE="Username and password do not match or you do not have an account yet."

JLIB_CACHE_ERROR_CACHE_HANDLER_LOAD="Unable to load Cache Handler: %s"
JLIB_CACHE_ERROR_CACHE_STORAGE_LOAD="Unable to load Cache Storage: %s"

JLIB_CAPTCHA_ERROR_PLUGIN_NOT_FOUND="Captcha plugin not set or not found. Please contact a site administrator."

JLIB_CLIENT_ERROR_JFTP_NO_CONNECT="JFTP: :connect: Could not connect to host ' %1$s ' on port ' %2$s '"
JLIB_CLIENT_ERROR_JFTP_NO_CONNECT_SOCKET="JFTP: :connect: Could not connect to host ' %1$s ' on port ' %2$s '. Socket error number: %3$s and error message: %4$s"
JLIB_CLIENT_ERROR_JFTP_BAD_RESPONSE="JFTP: :connect: Bad response. Server response: %s [Expected: 220]"
JLIB_CLIENT_ERROR_JFTP_BAD_USERNAME="JFTP: :login: Bad Username. Server response: %1$s [Expected: 331]. Username sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_BAD_PASSWORD="JFTP: :login: Bad Password. Server response: %1$s [Expected: 230]. Password sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_PWD_BAD_RESPONSE_NATIVE="FTP: :pwd: Bad response."
JLIB_CLIENT_ERROR_JFTP_PWD_BAD_RESPONSE="JFTP: :pwd: Bad response. Server response: %s [Expected: 257]"
JLIB_CLIENT_ERROR_JFTP_SYST_BAD_RESPONSE_NATIVE="JFTP: :syst: Bad response."
JLIB_CLIENT_ERROR_JFTP_SYST_BAD_RESPONSE="JFTP: :syst: Bad response. Server response: %s [Expected: 215]"
JLIB_CLIENT_ERROR_JFTP_CHDIR_BAD_RESPONSE_NATIVE="JFTP: :chdir: Bad response."
JLIB_CLIENT_ERROR_JFTP_CHDIR_BAD_RESPONSE="JFTP: :chdir: Bad response. Server response: %1$s [Expected: 250]. Path sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_REINIT_BAD_RESPONSE_NATIVE="JFTP: :reinit: Bad response."
JLIB_CLIENT_ERROR_JFTP_REINIT_BAD_RESPONSE="JFTP: :reinit: Bad response. Server response: %s [Expected: 220]"
JLIB_CLIENT_ERROR_JFTP_RENAME_BAD_RESPONSE_NATIVE="JFTP: :rename: Bad response."
JLIB_CLIENT_ERROR_JFTP_RENAME_BAD_RESPONSE_FROM="JFTP: :rename: Bad response. Server response: %1$s [Expected: 350]. From path sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_RENAME_BAD_RESPONSE_TO="JFTP: :rename: Bad response. Server response: %1$s [Expected: 250]. To path sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_CHMOD_BAD_RESPONSE_NATIVE="JFTP: :chmod: Bad response."
JLIB_CLIENT_ERROR_JFTP_CHMOD_BAD_RESPONSE="JFTP: :chmod: Bad response. Server response: %1$s [Expected: 250]. Path sent: %2$s. Mode sent: %3$s"
JLIB_CLIENT_ERROR_JFTP_DELETE_BAD_RESPONSE_NATIVE="JFTP: :delete: Bad response."
JLIB_CLIENT_ERROR_JFTP_DELETE_BAD_RESPONSE="JFTP: :delete: Bad response. Server response: %1$s [Expected: 250]. Path sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_MKDIR_BAD_RESPONSE_NATIVE="JFTP: :mkdir: Bad response."
JLIB_CLIENT_ERROR_JFTP_MKDIR_BAD_RESPONSE="JFTP: :mkdir: Bad response. Server response: %1$s [Expected: 257]. Path sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_RESTART_BAD_RESPONSE_NATIVE="JFTP: :restart: Bad response."
JLIB_CLIENT_ERROR_JFTP_RESTART_BAD_RESPONSE="JFTP: :restart: Bad response. Server response: %1$s [Expected: 350]. Restart point sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_CREATE_BAD_RESPONSE_BUFFER="JFTP: :create: Bad response."
JLIB_CLIENT_ERROR_JFTP_CREATE_BAD_RESPONSE_PASSIVE="JFTP: :create: Unable to use passive mode."
JLIB_CLIENT_ERROR_JFTP_CREATE_BAD_RESPONSE="JFTP: :create: Bad response. Server response: %1$s [Expected: 150 or 125]. Path sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_CREATE_BAD_RESPONSE_TRANSFER="JFTP: :create: Transfer Failed. Server response: %1$s [Expected: 226]. Path sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_READ_BAD_RESPONSE_BUFFER="JFTP: :read: Bad response."
JLIB_CLIENT_ERROR_JFTP_READ_BAD_RESPONSE_PASSIVE="JFTP: :read: Unable to use passive mode."
JLIB_CLIENT_ERROR_JFTP_READ_BAD_RESPONSE="JFTP: :read: Bad response. Server response: %1$s [Expected: 150 or 125]. Path sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_READ_BAD_RESPONSE_TRANSFER="JFTP: :read: Transfer Failed. Server response: %1$s [Expected: 226]. Path sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_GET_BAD_RESPONSE="JFTP: :get: Bad response."
JLIB_CLIENT_ERROR_JFTP_GET_PASSIVE="JFTP: :get: Unable to use passive mode."
JLIB_CLIENT_ERROR_JFTP_GET_WRITING_LOCAL="JFTP: :get: Unable to open local file for writing. Local path: %s"
JLIB_CLIENT_ERROR_JFTP_GET_BAD_RESPONSE_RETR="JFTP: :get: Bad response. Server response: %1$s [Expected: 150 or 125]. Path sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_GET_BAD_RESPONSE_TRANSFER="JFTP: :get: Transfer Failed. Server response: %1$s [Expected: 226]. Path sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_STORE_PASSIVE="JFTP: :store: Unable to use passive mode."
JLIB_CLIENT_ERROR_JFTP_STORE_BAD_RESPONSE="JFTP: :store: Bad response."
JLIB_CLIENT_ERROR_JFTP_STORE_READING_LOCAL="JFTP: :store: Unable to open local file for reading. Local path: %s"
JLIB_CLIENT_ERROR_JFTP_STORE_FIND_LOCAL="JFTP: :store: Unable to find local file. Local path: %s"
JLIB_CLIENT_ERROR_JFTP_STORE_BAD_RESPONSE_STOR="JFTP: :store: Bad response. Server response: %1$s [Expected: 150 or 125]. Path sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_STORE_DATA_PORT="JFTP: :store: Unable to write to data port socket."
JLIB_CLIENT_ERROR_JFTP_STORE_BAD_RESPONSE_TRANSFER="JFTP: :store: Transfer Failed. Server response: %1$s [Expected: 226]. Path sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_WRITE_PASSIVE="JFTP: :write: Unable to use passive mode."
JLIB_CLIENT_ERROR_JFTP_WRITE_BAD_RESPONSE="JFTP: :write: Bad response."
JLIB_CLIENT_ERROR_JFTP_WRITE_BAD_RESPONSE_STOR="JFTP: :write: Bad response. Server response: %1$s [Expected: 150 or 125]. Path sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_WRITE_DATA_PORT="JFTP: :write: Unable to write to data port socket."
JLIB_CLIENT_ERROR_JFTP_WRITE_BAD_RESPONSE_TRANSFER="JFTP: :write: Transfer Failed. Server response: %1$s [Expected: 226]. Path sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_APPEND_PASSIVE="JFTP: :append: Unable to use passive mode"
JLIB_CLIENT_ERROR_JFTP_APPEND_BAD_RESPONSE="JFTP: :append: Bad response"
JLIB_CLIENT_ERROR_JFTP_APPEND_BAD_RESPONSE_APPE="JFTP: :append: Bad response. Server response: %1$s [Expected: 150 or 125]. Path sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_APPEND_DATA_PORT="JFTP: :append: Unable to write to data port socket"
JLIB_CLIENT_ERROR_JFTP_APPEND_BAD_RESPONSE_TRANSFER="JFTP: :append: Transfer Failed. Server response: %1$s [Expected: 226]. Path sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_SIZE_BAD_RESPONSE="JFTP: :size: Bad response"
JLIB_CLIENT_ERROR_JFTP_SIZE_PASSIVE="JFTP: :size: Unable to use passive mode"
JLIB_CLIENT_ERROR_JFTP_LISTNAMES_PASSIVE="JFTP: :listNames: Unable to use passive mode"
JLIB_CLIENT_ERROR_JFTP_LISTNAMES_BAD_RESPONSE="JFTP: :listNames: Bad response"
JLIB_CLIENT_ERROR_JFTP_LISTNAMES_BAD_RESPONSE_NLST="JFTP: :listNames: Bad response. Server response: %1$s [Expected: 150 or 125]. Path sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_LISTNAMES_BAD_RESPONSE_TRANSFER="JFTP: :listNames: Transfer Failed. Server response: %1$s [Expected: 226]. Path sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_LISTDETAILS_BAD_RESPONSE="JFTP: :listDetails: Bad response."
JLIB_CLIENT_ERROR_JFTP_LISTDETAILS_PASSIVE="JFTP: :listDetails: Unable to use passive mode."
JLIB_CLIENT_ERROR_JFTP_LISTDETAILS_BAD_RESPONSE_LIST="JFTP: :listDetails: Bad response. Server response: %1$s [Expected: 150 or 125]. Path sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_LISTDETAILS_BAD_RESPONSE_TRANSFER="JFTP: :listDetails: Transfer Failed. Server response: %1$s [Expected: 226]. Path sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_LISTDETAILS_UNRECOGNISED="JFTP: :listDetails: Unrecognised folder listing format."
JLIB_CLIENT_ERROR_JFTP_PUTCMD_UNCONNECTED="JFTP: :_putCmd: Not connected to the control port."
JLIB_CLIENT_ERROR_JFTP_PUTCMD_SEND="JFTP: :_putCmd: Unable to send command: %s"
JLIB_CLIENT_ERROR_JFTP_VERIFYRESPONSE="JFTP: :_verifyResponse: Timeout or unrecognised response while waiting for a response from the server. Server response: %s"
JLIB_CLIENT_ERROR_JFTP_PASSIVE_CONNECT_PORT="JFTP: :_passive: Not connected to the control port."
JLIB_CLIENT_ERROR_JFTP_PASSIVE_RESPONSE="JFTP: :_passive: Timeout or unrecognised response while waiting for a response from the server. Server response: %s"
JLIB_CLIENT_ERROR_JFTP_PASSIVE_IP_OBTAIN="JFTP: :_passive: Unable to obtain IP and port for data transfer. Server response: %s"
JLIB_CLIENT_ERROR_JFTP_PASSIVE_IP_VALID="JFTP: :_passive: IP and port for data transfer not valid. Server response: %s"
JLIB_CLIENT_ERROR_JFTP_PASSIVE_CONNECT="JFTP: :_passive: Could not connect to host %1$s on port %2$s. Socket error number: %3$s and error message: %4$s"
JLIB_CLIENT_ERROR_JFTP_MODE_BINARY="JFTP: :_mode: Bad response. Server response: %s [Expected: 200]. Mode sent: Binary."
JLIB_CLIENT_ERROR_JFTP_MODE_ASCII="JFTP: :_mode: Bad response. Server response: %s [Expected: 200]. Mode sent: Ascii."
JLIB_CLIENT_ERROR_HELPER_SETCREDENTIALSFROMREQUEST_FAILED="Looks like User's credentials are no good."
JLIB_CLIENT_ERROR_LDAP_ADDRESS_NOT_AVAILABLE="Address not available."

JLIB_CMS_WARNING_PROVIDE_VALID_NAME="Please provide a valid, non-blank title."

JLIB_DATABASE_ERROR_ADAPTER_MYSQL="The MySQL adapter 'mysql' is not available."
JLIB_DATABASE_ERROR_ADAPTER_MYSQLI="The MySQL adapter 'mysqli' is not available."
JLIB_DATABASE_ERROR_BIND_FAILED_INVALID_SOURCE_ARGUMENT="%s: :bind failed. Invalid source argument."
JLIB_DATABASE_ERROR_ARTICLE_UNIQUE_ALIAS="Another article from this category has the same alias (remember it may be a trashed item)."
JLIB_DATABASE_ERROR_CATEGORY_UNIQUE_ALIAS="Another category with the same parent category has the same alias (remember it may be a trashed item)."
JLIB_DATABASE_ERROR_CHECK_FAILED="%s: :check Failed - %s"
JLIB_DATABASE_ERROR_CHECKIN_FAILED="%s: :check-in failed - %s"
JLIB_DATABASE_ERROR_CHECKOUT_FAILED="%s: :check-out failed - %s"
JLIB_DATABASE_ERROR_CHILD_ROWS_CHECKED_OUT="Child rows checked out."
JLIB_DATABASE_ERROR_CLASS_DOES_NOT_SUPPORT_ORDERING="%s does not support ordering."
JLIB_DATABASE_ERROR_CLASS_IS_MISSING_FIELD="Missing field in the database: %s &#160; %s."
JLIB_DATABASE_ERROR_CLASS_NOT_FOUND_IN_FILE="Table class %s not found in file."
JLIB_DATABASE_ERROR_CONNECT_DATABASE="Unable to connect to the Database: %s"
JLIB_DATABASE_ERROR_CONNECT_MYSQL="Could not connect to MySQL."
JLIB_DATABASE_ERROR_DATABASE_CONNECT="Could not connect to database."
JLIB_DATABASE_ERROR_DATABASE_UPGRADE_FAILED="MySQL Database Upgrade failed. Please check the <a href="_QQ_"index.php?option=com_installer&view=database"_QQ_">Database Fixer</a>."
JLIB_DATABASE_ERROR_DELETE_CATEGORY="Left-Right data inconsistency. Can't delete category."
JLIB_DATABASE_ERROR_DELETE_FAILED="%s: :delete failed - %s"
JLIB_DATABASE_ERROR_DELETE_ROOT_CATEGORIES="Root categories can't be deleted."
JLIB_DATABASE_ERROR_EMAIL_INUSE="The email address you entered is already in use. Please enter another email address."
JLIB_DATABASE_ERROR_EMPTY_ROW_RETURNED="The database row is empty."
JLIB_DATABASE_ERROR_FUNCTION_FAILED="DB function failed with error number %s <br /><span style="_QQ_"color: red;"_QQ_">%s</span>"
JLIB_DATABASE_ERROR_GET_NEXT_ORDER_FAILED="%s: :getNextOrder failed - %s"
JLIB_DATABASE_ERROR_GET_TREE_FAILED="%s: :getTree Failed - %s"
JLIB_DATABASE_ERROR_GETNODE_FAILED="%s: :_getNode Failed - %s"
JLIB_DATABASE_ERROR_GETROOTID_FAILED="%s: :getRootId Failed - %s"
JLIB_DATABASE_ERROR_HIT_FAILED="%s: :hit failed - %s"
JLIB_DATABASE_ERROR_INVALID_LOCATION="%s: :setLocation - Invalid location."
JLIB_DATABASE_ERROR_INVALID_NODE_RECURSION="%s: :move Failed - Can't move the node to be a child of itself."
JLIB_DATABASE_ERROR_INVALID_PARENT_ID="Invalid parent ID."
JLIB_DATABASE_ERROR_LANGUAGE_NO_TITLE="The language should have a title."
JLIB_DATABASE_ERROR_LANGUAGE_UNIQUE_IMAGE="A content language already exists with this Image."
JLIB_DATABASE_ERROR_LANGUAGE_UNIQUE_LANG_CODE="A content language already exists with this Language Tag."
JLIB_DATABASE_ERROR_LANGUAGE_UNIQUE_SEF="A content language already exists with this URL Language Code."
JLIB_DATABASE_ERROR_LOAD_DATABASE_DRIVER="Unable to load Database Driver: %s"
JLIB_DATABASE_ERROR_MENUTYPE="Some menu items or some menu modules related to this menutype are checked out by another user or the default menu item is in this menu."
JLIB_DATABASE_ERROR_MENUTYPE_CHECKOUT="The user checking out does not match the user who checked out this menu and/or its linked menu module."
JLIB_DATABASE_ERROR_MENUTYPE_EMPTY="Menu type empty."
JLIB_DATABASE_ERROR_MENUTYPE_EXISTS="Menu type exists: %s"
JLIB_DATABASE_ERROR_MENU_CANNOT_UNSET_DEFAULT="The Language parameter for this menu item must be set to 'All'. At least one Default menu item must have Language set to All, even if the site is multilingual."
JLIB_DATABASE_ERROR_MENU_CANNOT_UNSET_DEFAULT_DEFAULT="At least one menu item has to be set as Default."
JLIB_DATABASE_ERROR_MENU_UNPUBLISH_DEFAULT_HOME="Can't unpublish default home."
JLIB_DATABASE_ERROR_MENU_DEFAULT_CHECKIN_USER_MISMATCH="The current home menu for this language is checked out."
JLIB_DATABASE_ERROR_MENU_UNIQUE_ALIAS="The alias <strong>%1$s</strong> is already being used by <strong>%2$s</strong> menu item in the <strong>%3$s</strong> menu (remember it may be a trashed item)."
JLIB_DATABASE_ERROR_MENU_UNIQUE_ALIAS_ROOT="Another menu item has the same alias in Root (remember it may be a trashed item). Root is the top level parent."
JLIB_DATABASE_ERROR_MENU_HOME_NOT_COMPONENT="The home menu item must be a component."
JLIB_DATABASE_ERROR_MENU_HOME_NOT_UNIQUE_IN_MENU="A menu should have only one Default home."
JLIB_DATABASE_ERROR_MENU_ROOT_ALIAS_COMPONENT="A first level menu item alias can't be 'component'."
JLIB_DATABASE_ERROR_MENU_ROOT_ALIAS_FOLDER="A first level menu item alias can't be '%s' because '%s' is a sub-folder of your joomla installation folder."
JLIB_DATABASE_ERROR_MOVE_FAILED="%s: :move failed - %s"
JLIB_DATABASE_ERROR_MUSTCONTAIN_A_TITLE_CATEGORY="Category must have a title."
JLIB_DATABASE_ERROR_MUSTCONTAIN_A_TITLE_EXTENSION="Extension must have a title."
JLIB_DATABASE_ERROR_MUSTCONTAIN_A_TITLE_MENUITEM="Menu Item must have a title."
JLIB_DATABASE_ERROR_MUSTCONTAIN_A_TITLE_MODULE="Module must have a title."
JLIB_DATABASE_ERROR_MUSTCONTAIN_A_TITLE_UPDATESITE="Update site must have a title."
JLIB_DATABASE_ERROR_NEGATIVE_NOT_PERMITTED="%s can't be negative."
JLIB_DATABASE_ERROR_NO_ROWS_SELECTED="No rows selected."
JLIB_DATABASE_ERROR_NOT_SUPPORTED_FILE_NOT_FOUND="Table %s not supported. File not found."
JLIB_DATABASE_ERROR_NULL_PRIMARY_KEY="Null primary key not allowed."
JLIB_DATABASE_ERROR_ORDERDOWN_FAILED="%s: :orderDown Failed - %s"
JLIB_DATABASE_ERROR_ORDERUP_FAILED="%s: :orderUp Failed - %s"
JLIB_DATABASE_ERROR_PLEASE_ENTER_A_USER_NAME="Please enter a username."
JLIB_DATABASE_ERROR_PLEASE_ENTER_YOUR_NAME="Please enter your name."
JLIB_DATABASE_ERROR_PUBLISH_FAILED="%s: :publish failed - %s"
JLIB_DATABASE_ERROR_REBUILD_FAILED="%s: :rebuild Failed - %s"
JLIB_DATABASE_ERROR_REBUILDPATH_FAILED="%s: :rebuildPath Failed - %s"
JLIB_DATABASE_ERROR_REORDER_FAILED="%s: :reorder failed - %s"
JLIB_DATABASE_ERROR_REORDER_UPDATE_ROW_FAILED="%s: :reorder update the row %s failed - %s"
JLIB_DATABASE_ERROR_ROOT_NODE_NOT_FOUND="Root node not found."
JLIB_DATABASE_ERROR_STORE_FAILED_UPDATE_ASSET_ID="The asset_id field could not be updated."
JLIB_DATABASE_ERROR_STORE_FAILED="%1$s: :store failed<br />%2$s"
JLIB_DATABASE_ERROR_USERGROUP_PARENT_ID_NOT_VALID="There has to be at least one root usergroup"
JLIB_DATABASE_ERROR_USERGROUP_TITLE="User group must have a title."
JLIB_DATABASE_ERROR_USERGROUP_TITLE_EXISTS="User group title already exists. Title must be unique with the same parent."
JLIB_DATABASE_ERROR_USERLEVEL_NAME_EXISTS="Level with the name &quot;%s&quot; already exists."
JLIB_DATABASE_ERROR_USERNAME_CANNOT_CHANGE="Can't use this username."
JLIB_DATABASE_ERROR_USERNAME_INUSE="Username in use."
JLIB_DATABASE_ERROR_VALID_AZ09="Please enter a valid username. No space at beginning or end, at least %d characters, must <strong>not</strong> have the following characters: < > \ &quot; ' &#37; ; ( ) & and be less than 150 characters long."
JLIB_DATABASE_ERROR_VALID_MAIL="The email address you entered is invalid. Please enter another email address."
JLIB_DATABASE_ERROR_VIEWLEVEL="Viewlevel must have a title."
JLIB_DATABASE_FUNCTION_NOERROR="DB function reports no errors."
JLIB_DATABASE_QUERY_FAILED="Database query failed (error # %s): %s"

JLIB_DOCUMENT_ERROR_UNABLE_LOAD_DOC_CLASS="Unable to load document class."
JLIB_ENVIRONMENT_SESSION_EXPIRED="Your session has expired. Please log in again."
JLIB_ENVIRONMENT_SESSION_INVALID="Invalid session cookie. Please check that you have cookies enabled in your web browser."
JLIB_ERROR_COMPONENTS_ACL_CONFIGURATION_FILE_MISSING_OR_IMPROPERLY_STRUCTURED="The %s component's ACL configuration file is either missing or improperly structured."
JLIB_ERROR_INFINITE_LOOP="Infinite loop detected in JError."
JLIB_EVENT_ERROR_DISPATCHER="JEventDispatcher: :register: Event handler not recognised. Handler: %s"
JLIB_FILESYSTEM_BZIP_NOT_SUPPORTED="BZip2 Not Supported."
JLIB_FILESYSTEM_BZIP_UNABLE_TO_READ="Unable to read archive (bz2)."
JLIB_FILESYSTEM_BZIP_UNABLE_TO_WRITE="Unable to write archive (bz2)."
JLIB_FILESYSTEM_BZIP_UNABLE_TO_WRITE_FILE="Unable to write file (bz2)."
JLIB_FILESYSTEM_GZIP_NOT_SUPPORTED="GZlib Not Supported."
JLIB_FILESYSTEM_GZIP_UNABLE_TO_READ="Unable to read archive (gz)."
JLIB_FILESYSTEM_GZIP_UNABLE_TO_WRITE="Unable to write archive (gz)."
JLIB_FILESYSTEM_GZIP_UNABLE_TO_WRITE_FILE="Unable to write file (gz)."
JLIB_FILESYSTEM_GZIP_UNABLE_TO_DECOMPRESS="Unable to decompress data."
JLIB_FILESYSTEM_TAR_UNABLE_TO_READ="Unable to read archive (tar)."
JLIB_FILESYSTEM_TAR_UNABLE_TO_DECOMPRESS="Unable to decompress data."
JLIB_FILESYSTEM_TAR_UNABLE_TO_CREATE_DESTINATION="Unable to create destination."
JLIB_FILESYSTEM_TAR_UNABLE_TO_WRITE_ENTRY="Unable to write entry."
JLIB_FILESYSTEM_ZIP_NOT_SUPPORTED="Zlib Not Supported."
JLIB_FILESYSTEM_ZIP_UNABLE_TO_READ="Unable to read archive (zip)."
JLIB_FILESYSTEM_ZIP_INFO_FAILED="Get ZIP Information failed."
JLIB_FILESYSTEM_ZIP_UNABLE_TO_CREATE_DESTINATION="Unable to create destination."
JLIB_FILESYSTEM_ZIP_UNABLE_TO_WRITE_ENTRY="Unable to write entry."
JLIB_FILESYSTEM_ZIP_UNABLE_TO_READ_ENTRY="Unable to read entry."
JLIB_FILESYSTEM_ZIP_UNABLE_TO_OPEN_ARCHIVE="Unable to open archive."
JLIB_FILESYSTEM_ZIP_INVALID_ZIP_DATA="Invalid ZIP data."
JLIB_FILESYSTEM_STREAM_FAILED="Failed to register string stream."
JLIB_FILESYSTEM_UNKNOWNARCHIVETYPE="Unknown Archive type."
JLIB_FILESYSTEM_UNABLE_TO_LOAD_ARCHIVE="Unable to load archive."
JLIB_FILESYSTEM_ERROR_JFILE_FIND_COPY="JFile: :copy: Can't find or read file: %s"
JLIB_FILESYSTEM_ERROR_JFILE_STREAMS="JFile: :copy(%1$s, %2$s): %3$s"
JLIB_FILESYSTEM_ERROR_COPY_FAILED="Copy failed."
JLIB_FILESYSTEM_ERROR_COPY_FAILED_ERR01="Copy failed: %1$s to %2$s"
JLIB_FILESYSTEM_DELETE_FAILED="Failed deleting %s"
JLIB_FILESYSTEM_CANNOT_FIND_SOURCE_FILE="Can't find source file."
JLIB_FILESYSTEM_ERROR_JFILE_MOVE_STREAMS="JFile: :move: %s"
JLIB_FILESYSTEM_ERROR_RENAME_FILE="Rename failed."
JLIB_FILESYSTEM_ERROR_READ_UNABLE_TO_OPEN_FILE="JFile: :read: Unable to open file: %s"
JLIB_FILESYSTEM_ERROR_WRITE_STREAMS="JFile: :write(%1$s): %2$s"
JLIB_FILESYSTEM_ERROR_UPLOAD="JFile: :upload: %s"
JLIB_FILESYSTEM_ERROR_WARNFS_ERR01="Warning: Failed to change file permissions!"
JLIB_FILESYSTEM_ERROR_WARNFS_ERR02="Warning: Failed to move file!"
JLIB_FILESYSTEM_ERROR_WARNFS_ERR03="Warning: File %s not uploaded for security reasons!"
JLIB_FILESYSTEM_ERROR_WARNFS_ERR04="Warning: Failed to move file: %1$s to %2$s"
JLIB_FILESYSTEM_ERROR_FIND_SOURCE_FOLDER="Can't find source folder."
JLIB_FILESYSTEM_ERROR_FOLDER_EXISTS="Folder already exists."
JLIB_FILESYSTEM_ERROR_FOLDER_CREATE="Unable to create target folder."
JLIB_FILESYSTEM_ERROR_FOLDER_OPEN="Unable to open source folder."
JLIB_FILESYSTEM_ERROR_FOLDER_LOOP="Infinite loop detected."
JLIB_FILESYSTEM_ERROR_FOLDER_PATH="Path not in open_basedir paths."
JLIB_FILESYSTEM_ERROR_COULD_NOT_CREATE_DIRECTORY="Could not create folder."
JLIB_FILESYSTEM_ERROR_DELETE_BASE_DIRECTORY="You can't delete a base folder."
JLIB_FILESYSTEM_ERROR_PATH_IS_NOT_A_FOLDER="JFolder: :delete: Path is not a folder. Path: %s"
JLIB_FILESYSTEM_ERROR_FOLDER_DELETE="JFolder: :delete: Could not delete folder. Path: %s"
JLIB_FILESYSTEM_ERROR_FOLDER_RENAME="Rename failed: %s"
JLIB_FILESYSTEM_ERROR_PATH_IS_NOT_A_FOLDER_FILES="JFolder: :files: Path is not a folder. Path: %s"
JLIB_FILESYSTEM_ERROR_PATH_IS_NOT_A_FOLDER_FOLDER="JFolder: :folder: Path is not a folder. Path: %s"
JLIB_FILESYSTEM_ERROR_STREAMS_FILE_SIZE="Failed to get file size. This may not work for all streams!"
JLIB_FILESYSTEM_ERROR_STREAMS_FILE_NOT_OPEN="File not open."
JLIB_FILESYSTEM_ERROR_STREAMS_FILENAME="File name not set."
JLIB_FILESYSTEM_ERROR_NO_DATA_WRITTEN="Warning: No data written."
JLIB_FILESYSTEM_ERROR_STREAMS_FAILED_TO_OPEN_WRITER="Failed to open writer: %s"
JLIB_FILESYSTEM_ERROR_STREAMS_FAILED_TO_OPEN_READER="Failed to open reader: %s"
JLIB_FILESYSTEM_ERROR_STREAMS_NOT_UPLOADED_FILE="Not an uploaded file!"

JLIB_FILTER_PARAMS_ALNUM="Alpha Numeric"
JLIB_FILTER_PARAMS_FLOAT="Float"
JLIB_FILTER_PARAMS_INTEGER="Integer"
JLIB_FILTER_PARAMS_RAW="Raw"
JLIB_FILTER_PARAMS_SAFEHTML="Safe HTML"
JLIB_FILTER_PARAMS_TEL="Telephone"
JLIB_FILTER_PARAMS_TEXT="Text"

JLIB_FORM_BUTTON_CLEAR="Clear"
JLIB_FORM_BUTTON_SELECT="Select"
JLIB_FORM_CHANGE_IMAGE="Change Image"
JLIB_FORM_CHANGE_IMAGE_BUTTON="Change Image Button"
JLIB_FORM_CHANGE_USER="Select User"
JLIB_FORM_ERROR_FIELDS_CATEGORY_ERROR_EXTENSION_EMPTY="Extension attribute is empty in the category field."
JLIB_FORM_ERROR_FIELDS_GROUPEDLIST_ELEMENT_NAME="Unknown element type: %s"
JLIB_FORM_ERROR_NO_DATA="No data."
JLIB_FORM_ERROR_VALIDATE_FIELD="Invalid xml field."
JLIB_FORM_ERROR_XML_FILE_DID_NOT_LOAD="XML file did not load."
JLIB_FORM_FIELD_INVALID="Invalid field:&#160"
JLIB_FORM_INPUTMODE="latin"
JLIB_FORM_INVALID_FORM_OBJECT="Invalid Form Object: :%s"
JLIB_FORM_INVALID_FORM_RULE="Invalid Form Rule: :%s"
JLIB_FORM_MEDIA_PREVIEW_ALT="Selected image."
JLIB_FORM_MEDIA_PREVIEW_EMPTY="No image selected."
JLIB_FORM_MEDIA_PREVIEW_SELECTED_IMAGE="Selected image."
JLIB_FORM_MEDIA_PREVIEW_TIP_TITLE="Preview"
JLIB_FORM_SELECT_USER="Select a User"
JLIB_FORM_VALIDATE_FIELD_INVALID="Invalid field: %s"
JLIB_FORM_VALIDATE_FIELD_REQUIRED="Field required: %s"
JLIB_FORM_VALIDATE_FIELD_RULE_MISSING="Validation Rule missing: %s"
JLIB_FORM_VALIDATE_FIELD_URL_SCHEMA_MISSING="Invalid URL: URL schema is missing in %1$s. Please add one of the following at the beginning: %2$s."
JLIB_FORM_VALUE_CACHE_APC="Alternative PHP Cache"
JLIB_FORM_VALUE_CACHE_APCU="APC User Cache"
JLIB_FORM_VALUE_CACHE_CACHELITE="Cache_Lite"
JLIB_FORM_VALUE_CACHE_EACCELERATOR="eAccelerator"
JLIB_FORM_VALUE_CACHE_FILE="File"
JLIB_FORM_VALUE_CACHE_MEMCACHE="Memcache"
JLIB_FORM_VALUE_CACHE_MEMCACHED="Memcached (Experimental)"
JLIB_FORM_VALUE_CACHE_REDIS="Redis"
JLIB_FORM_VALUE_CACHE_WINCACHE="Windows Cache"
JLIB_FORM_VALUE_CACHE_XCACHE="XCache"
JLIB_FORM_VALUE_SESSION_APC="Alternative PHP Cache"
JLIB_FORM_VALUE_SESSION_APCU="APC User Cache"
JLIB_FORM_VALUE_SESSION_DATABASE="Database"
JLIB_FORM_VALUE_SESSION_EACCELERATOR="eAccelerator"
JLIB_FORM_VALUE_SESSION_MEMCACHE="Memcache"
JLIB_FORM_VALUE_SESSION_MEMCACHED="Memcached (Experimental)"
JLIB_FORM_VALUE_SESSION_NONE="PHP"
JLIB_FORM_VALUE_SESSION_REDIS="Redis"
JLIB_FORM_VALUE_SESSION_WINCACHE="Windows Cache"
JLIB_FORM_VALUE_SESSION_XCACHE="XCache"
JLIB_FORM_VALUE_TIMEZONE_UTC="Universal Time, Coordinated (UTC)"
JLIB_FORM_VALUE_FROM_TEMPLATE="From Template"
JLIB_FORM_VALUE_INHERITED="Inherited"

JLIB_HTML_ACCESS_MODIFY_DESC_CAPTION_ACL="ACL"
JLIB_HTML_ACCESS_MODIFY_DESC_CAPTION_TABLE="Table"
JLIB_HTML_ACCESS_SUMMARY_DESC_CAPTION="ACL Summary Table"
JLIB_HTML_ACCESS_SUMMARY_DESC="Shown below is an overview of the permission settings for this article. Select the tabs above to customise these settings by action."
JLIB_HTML_ACCESS_SUMMARY="Summary."
JLIB_HTML_ADD_TO_ROOT="Add to root."
JLIB_HTML_ADD_TO_THIS_MENU="Add to this menu."
JLIB_HTML_BATCH_ACCESS_LABEL="Set Access Level"
JLIB_HTML_BATCH_ACCESS_LABEL_DESC="Not making a selection will keep the original access levels when processing."
JLIB_HTML_BATCH_COPY="Copy"
JLIB_HTML_BATCH_FLIPORDERING_LABEL="Reverse the ordering of all articles in the selected categories"
JLIB_HTML_BATCH_LANGUAGE_LABEL="Set Language"
JLIB_HTML_BATCH_LANGUAGE_LABEL_DESC="Not making a selection will keep the original language when processing."
JLIB_HTML_BATCH_LANGUAGE_NOCHANGE="- Keep original Language -"
JLIB_HTML_BATCH_MENU_LABEL="To Move or Copy your selection please select a Category."
JLIB_HTML_BATCH_MOVE="Move"
JLIB_HTML_BATCH_MOVE_QUESTION="Do you want to move the items or make a copy of them?"
JLIB_HTML_BATCH_NO_CATEGORY="- Don't move or copy -"
JLIB_HTML_BATCH_NOCHANGE="- Keep original Access Levels -"
JLIB_HTML_BATCH_TAG_LABEL="Add Tag"
JLIB_HTML_BATCH_TAG_LABEL_DESC="Add a tag to selected items."
JLIB_HTML_BATCH_TAG_NOCHANGE="- Keep original Tags -"
JLIB_HTML_BATCH_USER_LABEL="Set User."
JLIB_HTML_BATCH_USER_LABEL_DESC="Not making a selection will keep the original user when processing."
JLIB_HTML_BATCH_USER_NOCHANGE="- Keep original User -"
JLIB_HTML_BATCH_USER_NOUSER="No User."
JLIB_HTML_BEHAVIOR_ABOUT_THE_CALENDAR="About the Calendar"
JLIB_HTML_BEHAVIOR_CLOSE="Close"
JLIB_HTML_BEHAVIOR_DATE_SELECTION="Date selection:\n"
JLIB_HTML_BEHAVIOR_DISPLAY_S_FIRST="Display %s first"
JLIB_HTML_BEHAVIOR_DRAG_TO_MOVE="Drag to move."
JLIB_HTML_BEHAVIOR_GO_TODAY="Go to today"
JLIB_HTML_BEHAVIOR_GREEN="Green"
JLIB_HTML_BEHAVIOR_HOLD_MOUSE="- Hold mouse button on any of the buttons above for faster selection."
JLIB_HTML_BEHAVIOR_MONTH_SELECT="- Use the < and > buttons to select month\n"
JLIB_HTML_BEHAVIOR_NEXT_MONTH_HOLD_FOR_MENU="Select to move to the next month. Select and hold for a list of the months."
JLIB_HTML_BEHAVIOR_NEXT_YEAR_HOLD_FOR_MENU="Select to move to the next year. Select and hold for a list of years."
JLIB_HTML_BEHAVIOR_OPEN_CALENDAR="Open the calendar"
JLIB_HTML_BEHAVIOR_PREV_MONTH_HOLD_FOR_MENU="Select to move to the previous month. Select and hold for a list of the months."
JLIB_HTML_BEHAVIOR_PREV_YEAR_HOLD_FOR_MENU="Select to move to the previous year. Select and hold for a list of years."
JLIB_HTML_BEHAVIOR_SELECT_DATE="Select a date."
JLIB_HTML_BEHAVIOR_SHIFT_CLICK_OR_DRAG_TO_CHANGE_VALUE="(Shift-)Select or Drag to change the value."
JLIB_HTML_BEHAVIOR_TIME="Time:"
JLIB_HTML_BEHAVIOR_TODAY="Today"
JLIB_HTML_BEHAVIOR_TT_DATE_FORMAT="%a, %b %e"
JLIB_HTML_BEHAVIOR_WK="wk"
JLIB_HTML_BEHAVIOR_YEAR_SELECT="- Use the « and » buttons to select year\n"
JLIB_HTML_BUTTON_BASE_CLASS="Could not load button base class."
JLIB_HTML_BUTTON_NO_LOAD="Could not load button %s (%s);"
JLIB_HTML_BUTTON_NOT_DEFINED="Button not defined for type = %s"
JLIB_HTML_CALENDAR="Calendar"
JLIB_HTML_CHECKED_OUT="Checked out"
JLIB_HTML_CHECKIN="Check-in"
JLIB_HTML_CLOAKING="This email address is being protected from spambots. You need JavaScript enabled to view it."
JLIB_HTML_DATE_RELATIVE_DAYS="%s days ago."
JLIB_HTML_DATE_RELATIVE_DAYS_1="%s day ago."
JLIB_HTML_DATE_RELATIVE_DAYS_0="%s days ago."
JLIB_HTML_DATE_RELATIVE_HOURS="%s hours ago."
JLIB_HTML_DATE_RELATIVE_HOURS_1="%s hour ago."
JLIB_HTML_DATE_RELATIVE_HOURS_0="%s hours ago."
JLIB_HTML_DATE_RELATIVE_LESSTHANAMINUTE="Less than a minute ago."
JLIB_HTML_DATE_RELATIVE_MINUTES="%s minutes ago."
JLIB_HTML_DATE_RELATIVE_MINUTES_1="%s minute ago."
JLIB_HTML_DATE_RELATIVE_MINUTES_0="%s minutes ago."
JLIB_HTML_DATE_RELATIVE_WEEKS="%s weeks ago."
JLIB_HTML_DATE_RELATIVE_WEEKS_1="%s week ago."
JLIB_HTML_DATE_RELATIVE_WEEKS_0="%s weeks ago."
JLIB_HTML_EDIT_MENU_ITEM="Edit menu item."
JLIB_HTML_EDIT_MENU_ITEM_ID="Item ID: %s"
JLIB_HTML_EDIT_MODULE="Edit module"
JLIB_HTML_EDIT_MODULE_IN_POSITION="Position: %s"
JLIB_HTML_EDITOR_CANNOT_LOAD="Can't load the editor."
JLIB_HTML_END="End"
JLIB_HTML_ERROR_FUNCTION_NOT_SUPPORTED="Function not supported."
JLIB_HTML_ERROR_NOTFOUNDINFILE="%s: :%s not found in file."
JLIB_HTML_ERROR_NOTSUPPORTED_NOFILE="%s: :%s not supported. File not found."
JLIB_HTML_ERROR_NOTSUPPORTED="%s: :%s not supported."
JLIB_HTML_GOTO_PAGE="Go to page %s"
JLIB_HTML_GOTO_POSITION="Go to %s page"
JLIB_HTML_MOVE_DOWN="Move Down"
JLIB_HTML_MOVE_UP="Move Up"
JLIB_HTML_NO_PARAMETERS_FOR_THIS_ITEM="There are no parameters for this item."
JLIB_HTML_NO_RECORDS_FOUND="No records found."
JLIB_HTML_PAGE_CURRENT="Page %s"
JLIB_HTML_PAGE_CURRENT_OF_TOTAL="Page %s of %s"
JLIB_HTML_PAGINATION="Pagination"
JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST="Please first make a selection from the list."
JLIB_HTML_PUBLISH_ITEM="Publish Item"
JLIB_HTML_PUBLISHED_EXPIRED_ITEM="Published, but has Expired."
JLIB_HTML_PUBLISHED_FINISHED="Finish: %s"
JLIB_HTML_PUBLISHED_ITEM="Published and is Current."
JLIB_HTML_PUBLISHED_PENDING_ITEM="Published, but is Pending."
JLIB_HTML_PUBLISHED_START="Start: %s"
JLIB_HTML_RESULTS_OF="Results %s - %s of %s"
JLIB_HTML_SAVE_ORDER="Save Order"
JLIB_HTML_SELECT_STATE="Select State"
JLIB_HTML_START="Start"
JLIB_HTML_UNPUBLISH_ITEM="Unpublish Item"
JLIB_HTML_VIEW_ALL="View All"
JLIB_HTML_SETDEFAULT_ITEM="Set default"
JLIB_HTML_UNSETDEFAULT_ITEM="Unset default"

JLIB_INSTALLER_ABORT="Aborting language installation: %s"
JLIB_INSTALLER_ABORT_ALREADYINSTALLED="Extension is already installed."
JLIB_INSTALLER_ABORT_ALREADY_EXISTS="Extension %1$s: Extension %2$s already exists."
JLIB_INSTALLER_ABORT_COMP_BUILDADMINMENUS_FAILED="Error building Administrator Menus."
JLIB_INSTALLER_ABORT_COMP_COPY_MANIFEST="Component %1$s: Could not copy PHP manifest file."
JLIB_INSTALLER_ABORT_COMP_COPY_SETUP="Component %1$s: Could not copy setup file."
JLIB_INSTALLER_ABORT_COMP_FAIL_ADMIN_FILES="Component %s: Failed to copy administrator files."
JLIB_INSTALLER_ABORT_COMP_FAIL_SITE_FILES="Component %s: Failed to copy site files."
JLIB_INSTALLER_ABORT_COMP_INSTALL_COPY_SETUP="Component Install: Could not copy setup file."
JLIB_INSTALLER_ABORT_COMP_INSTALL_CUSTOM_INSTALL_FAILURE="Component Install: Custom install routine failure."
JLIB_INSTALLER_ABORT_COMP_INSTALL_MANIFEST="Component Install: Could not copy PHP manifest file."
JLIB_INSTALLER_ABORT_COMP_INSTALL_PHP_INSTALL="Component Install: Could not copy PHP install file."
JLIB_INSTALLER_ABORT_COMP_INSTALL_PHP_UNINSTALL="Component Install: Could not copy PHP uninstall file."
JLIB_INSTALLER_ABORT_COMP_INSTALL_ROLLBACK="Component Install: %s"
JLIB_INSTALLER_ABORT_COMP_INSTALL_SQL_ERROR="Component Install: SQL error file %s"
JLIB_INSTALLER_ABORT_COMP_UPDATESITEMENUS_FAILED="Component Install: Failed to update menu items."
JLIB_INSTALLER_ABORT_COMP_UPDATE_ADMIN_ELEMENT="Component Update: The XML file did not have an administration element."
JLIB_INSTALLER_ABORT_COMP_UPDATE_COPY_SETUP="Component Update: Could not copy setup file."
JLIB_INSTALLER_ABORT_COMP_UPDATE_MANIFEST="Component Update: Could not copy PHP manifest file."
JLIB_INSTALLER_ABORT_COMP_UPDATE_PHP_INSTALL="Component Update: Could not copy PHP install file."
JLIB_INSTALLER_ABORT_COMP_UPDATE_PHP_UNINSTALL="Component Update: Could not copy PHP uninstall file."
JLIB_INSTALLER_ABORT_COMP_UPDATE_ROLLBACK="Component Update: %s"
JLIB_INSTALLER_ABORT_COMP_UPDATE_SQL_ERROR="Component Update: SQL error file %s"
JLIB_INSTALLER_ABORT_CREATE_DIRECTORY="Extension %1$s: Failed to create folder: %2$s"
JLIB_INSTALLER_ABORT_DEBUG="Installation unexpectedly stopped:"
JLIB_INSTALLER_ABORT_DETECTMANIFEST="Unable to detect manifest file."
JLIB_INSTALLER_ABORT_DIRECTORY="Extension %1$s: Another %2$s is already using the named folder: %3$s. Are you trying to install the same extension again?"
JLIB_INSTALLER_ABORT_ERROR_DELETING_EXTENSIONS_RECORD="Could not delete the extension's record from the database."
JLIB_INSTALLER_ABORT_EXTENSIONNOTVALID="Extension is not valid."
JLIB_INSTALLER_ABORT_FILE_INSTALL_COPY_SETUP="Files Install: Could not copy setup file."
JLIB_INSTALLER_ABORT_FILE_INSTALL_CUSTOM_INSTALL_FAILURE="Files Install: Custom install routine failure."
JLIB_INSTALLER_ABORT_FILE_INSTALL_FAIL_SOURCE_DIRECTORY="Files Install: Failed to find source folder: %s"
JLIB_INSTALLER_ABORT_FILE_INSTALL_ROLLBACK="Files Install: %s"
JLIB_INSTALLER_ABORT_FILE_INSTALL_SQL_ERROR="Files %1$s: SQL error file %2$s"
JLIB_INSTALLER_ABORT_FILE_ROLLBACK="Files Install: %s"
JLIB_INSTALLER_ABORT_FILE_SAME_NAME="Files Install: Another extension with same name already exists."
JLIB_INSTALLER_ABORT_FILE_UPDATE_SQL_ERROR="Files Update: SQL error file %s"
JLIB_INSTALLER_ABORT_INSTALL_CUSTOM_INSTALL_FAILURE="Extension %s: Custom install routine failure."
JLIB_INSTALLER_ABORT_LIB_COPY_FILES="Library %s: Could not copy files from the source."
JLIB_INSTALLER_ABORT_LIB_INSTALL_ALREADY_INSTALLED="Library Install: Library already installed."
JLIB_INSTALLER_ABORT_LIB_INSTALL_COPY_SETUP="Library Install: Could not copy setup file."
JLIB_INSTALLER_ABORT_LIB_INSTALL_CORE_FOLDER="Library Install: Library has the same name as a core folder."
JLIB_INSTALLER_ABORT_LIB_INSTALL_FAILED_TO_CREATE_DIRECTORY="Library Install: Failed to create folder: %s"
JLIB_INSTALLER_ABORT_LIB_INSTALL_NOFILE="Library Install: No library file specified."
JLIB_INSTALLER_ABORT_LIB_INSTALL_ROLLBACK="Library Install: %s"
JLIB_INSTALLER_ABORT_LOAD_DETAILS="Failed to load extension details."
JLIB_INSTALLER_ABORT_MANIFEST="Extension %1$s: Could not copy PHP manifest file."
JLIB_INSTALLER_ABORT_METHODNOTSUPPORTED="Method not supported for this extension type."
JLIB_INSTALLER_ABORT_METHODNOTSUPPORTED_TYPE="Method not supported for this extension type: %s"
JLIB_INSTALLER_ABORT_MOD_COPY_FILES="Module %s: Could not copy files from the source."
JLIB_INSTALLER_ABORT_MOD_INSTALL_COPY_SETUP="Module Install: Could not copy setup file."
JLIB_INSTALLER_ABORT_MOD_INSTALL_CREATE_DIRECTORY="Module %1$s: Failed to create folder: %2$s"
JLIB_INSTALLER_ABORT_MOD_INSTALL_CUSTOM_INSTALL_FAILURE="Module Install: Custom install routine failure."
JLIB_INSTALLER_ABORT_MOD_INSTALL_DIRECTORY="Module %1$s: Another module is already using folder: %2$s"
JLIB_INSTALLER_ABORT_MOD_INSTALL_MANIFEST="Module Install: Could not copy PHP manifest file."
JLIB_INSTALLER_ABORT_MOD_INSTALL_NOFILE="Module %s: No module file specified."
JLIB_INSTALLER_ABORT_MOD_INSTALL_SQL_ERROR="Module %1$s: SQL error file %2$s"
JLIB_INSTALLER_ABORT_MOD_ROLLBACK="Module %1$s: %2$s"
JLIB_INSTALLER_ABORT_MOD_UNINSTALL_UNKNOWN_CLIENT="Module Uninstall: Unknown client type [%s]"
JLIB_INSTALLER_ABORT_MOD_UNKNOWN_CLIENT="Module %1$s: Unknown client type [%2$s]"
JLIB_INSTALLER_ABORT_NOINSTALLPATH="Install path does not exist."
JLIB_INSTALLER_ABORT_NOUPDATEPATH="Update path does not exist."
JLIB_INSTALLER_ABORT_PACK_INSTALL_COPY_SETUP="Package Install: Could not copy setup file."
JLIB_INSTALLER_ABORT_PACK_INSTALL_CREATE_DIRECTORY="Package Install: Failed to create folder: %s."
JLIB_INSTALLER_ABORT_PACKAGE_INSTALL_CUSTOM_INSTALL_FAILURE="Package Install: Custom install routine failure."
JLIB_INSTALLER_ABORT_PACKAGE_INSTALL_MANIFEST="Installation failed: Could not copy PHP manifest file."
JLIB_INSTALLER_ABORT_PACK_INSTALL_ERROR_EXTENSION="Package %1$s: There was an error installing an extension: %2$s"
JLIB_INSTALLER_ABORT_PACK_INSTALL_NO_FILES="Package %s: There were no files to install!"
JLIB_INSTALLER_ABORT_PACK_INSTALL_NO_PACK="Package %s: No package file specified."
JLIB_INSTALLER_ABORT_PACK_INSTALL_ROLLBACK="Package Install: %s"
JLIB_INSTALLER_ABORT_PLG_COPY_FILES="Plugin %s: Could not copy files from the source."
JLIB_INSTALLER_ABORT_PLG_INSTALL_ALLREADY_EXISTS="Plugin %1$s: Plugin %2$s already exists."
JLIB_INSTALLER_ABORT_PLG_INSTALL_COPY_SETUP="Plugin %s: Could not copy setup file."
JLIB_INSTALLER_ABORT_PLG_INSTALL_CREATE_DIRECTORY="Plugin %1$s: Failed to create folder: %2$s"
JLIB_INSTALLER_ABORT_PLG_INSTALL_CUSTOM_INSTALL_FAILURE="Plugin Install: Custom install routine failure."
JLIB_INSTALLER_ABORT_PLG_INSTALL_DIRECTORY="Plugin %1$s: Another plugin is already using folder: %2$s"
JLIB_INSTALLER_ABORT_PLG_INSTALL_MANIFEST="Plugin %s: Could not copy PHP manifest file."
JLIB_INSTALLER_ABORT_PLG_INSTALL_NO_FILE="Plugin %s: No plugin file specified."
JLIB_INSTALLER_ABORT_PLG_INSTALL_ROLLBACK="Plugin %1$s: %2$s"
JLIB_INSTALLER_ABORT_PLG_INSTALL_SQL_ERROR="Plugin %1$s: SQL error file %2$s"
JLIB_INSTALLER_ABORT_PLG_UNINSTALL_SQL_ERROR="Plugin Uninstall: SQL error file %s"
JLIB_INSTALLER_ABORT_REFRESH_MANIFEST_CACHE="Refresh Manifest Cache failed: %s Extension is not currently installed."
JLIB_INSTALLER_ABORT_REFRESH_MANIFEST_CACHE_VALID="Refresh Manifest Cache failed: Extension is not valid."
JLIB_INSTALLER_ABORT_ROLLBACK="Extension %1$s: %2$s"
JLIB_INSTALLER_ABORT_SQL_ERROR="Extension %1$s: SQL error processing query: %2$s"
JLIB_INSTALLER_ABORT_TPL_INSTALL_ALREADY_INSTALLED="Template Install: Template already installed."
JLIB_INSTALLER_ABORT_TPL_INSTALL_ANOTHER_TEMPLATE_USING_DIRECTORY="Template Install: There is already a Template using the named folder: %s. Are you trying to install the same template again?"
JLIB_INSTALLER_ABORT_TPL_INSTALL_COPY_FILES="Template Install: Could not copy files from the %s source."
JLIB_INSTALLER_ABORT_TPL_INSTALL_COPY_SETUP="Template Install: Could not copy setup file."
JLIB_INSTALLER_ABORT_TPL_INSTALL_FAILED_CREATE_DIRECTORY="Template Install: Failed to create folder: %s"
JLIB_INSTALLER_ABORT_TPL_INSTALL_ROLLBACK="Template Install: %s"
JLIB_INSTALLER_ABORT_TPL_INSTALL_UNKNOWN_CLIENT="Template Install: Unknown client type [%s]"
JLIB_INSTALLER_AVAILABLE_UPDATE_PHP_VERSION="For the extension %1$s version %2$s is available, but it requires at least PHP version %3$s while your system only has %4$s"
JLIB_INSTALLER_AVAILABLE_UPDATE_DB_MINIMUM="For the extension %1$s version %2$s is available, but your current database %3$s is version %4$s and is not supported. Please contact your web host to update your Database version to at least version %5$s."
JLIB_INSTALLER_AVAILABLE_UPDATE_DB_TYPE="For the extension %1$s version %2$s is available, but your current database %3$s is not supported anymore."
JLIB_INSTALLER_PURGED_UPDATES="Cleared updates"
JLIB_INSTALLER_FAILED_TO_PURGE_UPDATES="Failed to clear updates."
JLIB_INSTALLER_DEFAULT_STYLE="%s - Default"
JLIB_INSTALLER_DISCOVER="Discover"
JLIB_INSTALLER_DISCOVER_INSTALL="Discover Install"
JLIB_INSTALLER_ERROR_CANNOT_UNINSTALL_CHILD_OF_PACKAGE="The %s extension is part of a package which does not allow individual extensions to be uninstalled."
JLIB_INSTALLER_ERROR_COMP_DISCOVER_STORE_DETAILS="Component Discover install: Failed to store component details."
JLIB_INSTALLER_ERROR_COMP_FAILED_TO_CREATE_DIRECTORY="Component %1$s: Failed to create folder: %2$s."
JLIB_INSTALLER_ERROR_COMP_INSTALL_ADMIN_ELEMENT="Component Install: The XML file did not have an administration element."
JLIB_INSTALLER_ERROR_COMP_INSTALL_DIR_ADMIN="Component Install: Another component is already using folder: %s"
JLIB_INSTALLER_ERROR_COMP_INSTALL_DIR_SITE="Component Install: Another component is already using folder: %s"
JLIB_INSTALLER_ERROR_COMP_INSTALL_FAILED_TO_CREATE_DIRECTORY_ADMIN="Component Install: Failed to create administrator folder: %s"
JLIB_INSTALLER_ERROR_COMP_INSTALL_FAILED_TO_CREATE_DIRECTORY_SITE="Component Install: Failed to create site folder: %s"
JLIB_INSTALLER_ERROR_COMP_REFRESH_MANIFEST_CACHE="Component Refresh manifest cache: Failed to store component details."
JLIB_INSTALLER_ERROR_COMP_REMOVING_ADMIN_MENUS_FAILED="Could not delete the Administrator menus."
JLIB_INSTALLER_ERROR_COMP_UNINSTALL_CUSTOM="Component Uninstall: Custom Uninstall script unsuccessful."
JLIB_INSTALLER_ERROR_COMP_UNINSTALL_FAILED_DELETE_CATEGORIES="Component Uninstall: Unable to delete the component categories."
JLIB_INSTALLER_ERROR_COMP_UNINSTALL_ERRORREMOVEMANUALLY="Component Uninstall: Can't uninstall. Please remove manually."
JLIB_INSTALLER_ERROR_COMP_UNINSTALL_ERRORUNKOWNEXTENSION="Component Uninstall: Unknown Extension."
JLIB_INSTALLER_ERROR_COMP_UNINSTALL_FAILED_REMOVE_DIRECTORY_ADMIN="Component Uninstall: Unable to remove the component administrator folder."
JLIB_INSTALLER_ERROR_COMP_UNINSTALL_FAILED_REMOVE_DIRECTORY_SITE="Component Uninstall: Unable to remove the component site folder."
JLIB_INSTALLER_ERROR_COMP_UNINSTALL_NO_OPTION="Component Uninstall: Option field empty, can't remove files."
JLIB_INSTALLER_ERROR_COMP_UNINSTALL_SQL_ERROR="Component Uninstall: SQL error file %s"
JLIB_INSTALLER_ERROR_COMP_UNINSTALL_WARNCORECOMPONENT="Component Uninstall: Trying to uninstall a core component."
JLIB_INSTALLER_ERROR_COMP_UPDATE_FAILED_TO_CREATE_DIRECTORY_ADMIN="Component Update: Failed to create administrator folder: %s"
JLIB_INSTALLER_ERROR_COMP_UPDATE_FAILED_TO_CREATE_DIRECTORY_SITE="Component Update: Failed to create site folder: %s"
JLIB_INSTALLER_ERROR_CREATE_DIRECTORY="JInstaller: :Install: Failed to create folder: %s"
JLIB_INSTALLER_ERROR_CREATE_FOLDER_FAILED="Failed to create folder [%s]"
JLIB_INSTALLER_ERROR_DEPRECATED_FORMAT="Deprecated install format (client="_QQ_"both"_QQ_"), use package installer in future."
JLIB_INSTALLER_ERROR_DISCOVER_INSTALL_UNSUPPORTED="A %s extension can not be installed using the discover method. Please install this extension from Extension Manager: Install."
JLIB_INSTALLER_ERROR_DOWNGRADE="Sorry! You cannot downgrade from version %s to %s"
JLIB_INSTALLER_ERROR_DOWNLOAD_SERVER_CONNECT="Error connecting to the server: %s"
JLIB_INSTALLER_ERROR_FAIL_COPY_FILE="JInstaller: :Install: Failed to copy file %1$s to %2$s"
JLIB_INSTALLER_ERROR_FAIL_COPY_FOLDER="JInstaller: :Install: Failed to copy folder %1$s to %2$s"
JLIB_INSTALLER_ERROR_FAILED_READING_NETWORK_RESOURCES="Failed reading network resource: %s"
JLIB_INSTALLER_ERROR_FILE_EXISTS="JInstaller: :Install: File already exists %s"
JLIB_INSTALLER_ERROR_FILE_FOLDER="Error on deleting file or folder %s"
JLIB_INSTALLER_ERROR_FILE_UNINSTALL_INVALID_MANIFEST="Files Uninstall: Invalid manifest file."
JLIB_INSTALLER_ERROR_FILE_UNINSTALL_INVALID_NOTFOUND_MANIFEST="Files Uninstall: Manifest file invalid or not found."
JLIB_INSTALLER_ERROR_FILE_UNINSTALL_LOAD_ENTRY="Files Uninstall: Could not load extension entry."
JLIB_INSTALLER_ERROR_FILE_UNINSTALL_LOAD_MANIFEST="Files Uninstall: Could not load manifest file."
JLIB_INSTALLER_ERROR_FILE_UNINSTALL_SQL_ERROR="Files Uninstall: SQL error file %s"
JLIB_INSTALLER_ERROR_FILE_UNINSTALL_WARNCOREFILE="File Uninstall: Trying to uninstall core files."
JLIB_INSTALLER_ERROR_FOLDER_IN_USE="Another extension is already using folder [%s]"
JLIB_INSTALLER_ERROR_LANG_DISCOVER_STORE_DETAILS="Language Discover install: Failed to store language details."
JLIB_INSTALLER_ERROR_LANG_UNINSTALL_DEFAULT="This language can't be uninstalled as long as it is defined as a default language."
JLIB_INSTALLER_ERROR_LANG_UNINSTALL_DIRECTORY="Language Uninstall: Unable to remove the specified Language folder."
JLIB_INSTALLER_ERROR_LANG_UNINSTALL_ELEMENT_EMPTY="Language Uninstall: Element is empty, can't uninstall files."
JLIB_INSTALLER_ERROR_LANG_UNINSTALL_PATH_EMPTY="Language Uninstall: Language path is empty, can't uninstall files."
JLIB_INSTALLER_ERROR_LANG_UNINSTALL_PROTECTED="This language can't be uninstalled. It is protected in the database (usually en-GB)."
JLIB_INSTALLER_ERROR_LIB_DISCOVER_STORE_DETAILS="Library Discover install: Failed to store library details."
JLIB_INSTALLER_ERROR_LIB_REFRESH_MANIFEST_CACHE="Library Refresh manifest cache: Failed to store library details."
JLIB_INSTALLER_ERROR_LIB_UNINSTALL_INVALID_MANIFEST="Library Uninstall: Invalid manifest file."
JLIB_INSTALLER_ERROR_LIB_UNINSTALL_INVALID_NOTFOUND_MANIFEST="Library Uninstall: Manifest file invalid or not found."
JLIB_INSTALLER_ERROR_LIB_UNINSTALL_LOAD_MANIFEST="Library Uninstall: Could not load manifest file."
JLIB_INSTALLER_ERROR_LIB_UNINSTALL_WARNCORELIBRARY="Library Uninstall: Trying to uninstall a core library."
JLIB_INSTALLER_ERROR_LOAD_XML="JInstaller: :Install: Failed to load XML File: %s"
JLIB_INSTALLER_ERROR_MOD_DISCOVER_STORE_DETAILS="Module Discover install: Failed to store module details."
JLIB_INSTALLER_ERROR_MOD_REFRESH_MANIFEST_CACHE="Module Refresh manifest cache: Failed to store module details."
JLIB_INSTALLER_ERROR_MOD_UNINSTALL_ERRORUNKOWNEXTENSION="Module Uninstall: Unknown Extension."
JLIB_INSTALLER_ERROR_MOD_UNINSTALL_EXCEPTION="Module Uninstall: %s"
JLIB_INSTALLER_ERROR_MOD_UNINSTALL_INVALID_NOTFOUND_MANIFEST="Module Uninstall: Manifest file invalid or not found."
JLIB_INSTALLER_ERROR_MOD_UNINSTALL_SQL_ERROR="Module Uninstall: SQL error file %s"
JLIB_INSTALLER_ERROR_MOD_UNINSTALL_WARNCOREMODULE="Module Uninstall: Trying to uninstall a core module: %s"
JLIB_INSTALLER_ERROR_NO_CORE_LANGUAGE="No core pack exists for the language [%s]"
JLIB_INSTALLER_ERROR_NO_FILE="JInstaller: :Install: File does not exist %s"
JLIB_INSTALLER_ERROR_NO_LANGUAGE_TAG="The package did not specify a language tag. Are you trying to install an old language package?"
JLIB_INSTALLER_ERROR_NOTFINDJOOMLAXMLSETUPFILE="JInstaller: :Install: Can't find Joomla XML setup file."
JLIB_INSTALLER_ERROR_NOTFINDXMLSETUPFILE="JInstaller: :Install: Can't find XML setup file."
JLIB_INSTALLER_ERROR_PACK_REFRESH_MANIFEST_CACHE="Package Refresh manifest cache: Failed to store package details."
JLIB_INSTALLER_ERROR_PACK_SETTING_PACKAGE_ID="Could not record the package ID for this package's extensions."
JLIB_INSTALLER_ERROR_PACK_UNINSTALL_INVALID_MANIFEST="Package Uninstall: Invalid manifest file."
JLIB_INSTALLER_ERROR_PACK_UNINSTALL_INVALID_NOTFOUND_MANIFEST="Package Uninstall: Manifest file invalid or not found: %s"
JLIB_INSTALLER_ERROR_PACK_UNINSTALL_LOAD_MANIFEST="Package Uninstall: Could not load manifest file."
JLIB_INSTALLER_ERROR_PACK_UNINSTALL_MANIFEST_NOT_REMOVED="Package Uninstall: Errors were detected, manifest file not removed!"
JLIB_INSTALLER_ERROR_PACK_UNINSTALL_MISSINGMANIFEST="Package Uninstall: Missing manifest file."
JLIB_INSTALLER_ERROR_PACK_UNINSTALL_NOT_PROPER="Package Uninstall: This extension may have already been uninstalled or might not have been uninstalled properly: %s"
JLIB_INSTALLER_ERROR_PACK_UNINSTALL_WARNCOREPACK="Package Uninstall: Trying to uninstall core package."
JLIB_INSTALLER_ERROR_PLG_DISCOVER_STORE_DETAILS="Plugin Discover install: Failed to store plugin details."
JLIB_INSTALLER_ERROR_PLG_REFRESH_MANIFEST_CACHE="Plugin Refresh manifest cache: Failed to store plugin details."
JLIB_INSTALLER_ERROR_PLG_UNINSTALL_ERRORUNKOWNEXTENSION="Plugin Uninstall: Unknown Extension."
JLIB_INSTALLER_ERROR_PLG_UNINSTALL_FOLDER_FIELD_EMPTY="Plugin Uninstall: Folder field empty, can't remove files."
JLIB_INSTALLER_ERROR_PLG_UNINSTALL_INVALID_MANIFEST="Plugin Uninstall: Invalid manifest file."
JLIB_INSTALLER_ERROR_PLG_UNINSTALL_INVALID_NOTFOUND_MANIFEST="Plugin Uninstall: Manifest file invalid or not found."
JLIB_INSTALLER_ERROR_PLG_UNINSTALL_LOAD_MANIFEST="Plugin Uninstall: Could not load manifest file."
JLIB_INSTALLER_ERROR_PLG_UNINSTALL_WARNCOREPLUGIN="Plugin Uninstall: Trying to uninstall a core plugin: %s"
JLIB_INSTALLER_ERROR_SQL_ERROR="JInstaller: :Install: Error SQL %s"
JLIB_INSTALLER_ERROR_SQL_FILENOTFOUND="JInstaller: :Install: SQL File not found %s"
JLIB_INSTALLER_ERROR_SQL_READBUFFER="JInstaller: :Install: SQL File Buffer Read Error."
JLIB_INSTALLER_ERROR_TPL_DISCOVER_STORE_DETAILS="Template Discover install: Failed to store template details."
JLIB_INSTALLER_ERROR_TPL_REFRESH_MANIFEST_CACHE="Template Refresh manifest cache: Failed to store template details."
JLIB_INSTALLER_ERROR_TPL_UNINSTALL_ERRORUNKOWNEXTENSION="Template Uninstall: Unknown Extension."
JLIB_INSTALLER_ERROR_TPL_UNINSTALL_INVALID_CLIENT="Template Uninstall: Invalid client."
JLIB_INSTALLER_ERROR_TPL_UNINSTALL_INVALID_NOTFOUND_MANIFEST="Template Uninstall: Manifest file invalid or not found."
JLIB_INSTALLER_ERROR_TPL_UNINSTALL_TEMPLATE_DEFAULT="Template Uninstall: Can't remove default template."
JLIB_INSTALLER_ERROR_TPL_UNINSTALL_TEMPLATE_DIRECTORY="Template Uninstall: Folder does not exist, can't remove files."
JLIB_INSTALLER_ERROR_TPL_UNINSTALL_TEMPLATE_ID_EMPTY="Template Uninstall: Template ID is empty, can't uninstall files."
JLIB_INSTALLER_ERROR_TPL_UNINSTALL_WARNCORETEMPLATE="Template Uninstall: Trying to uninstall a core template: %s"
JLIB_INSTALLER_ERROR_UNKNOWN_CLIENT_TYPE="Unknown Client Type [%s]"
JLIB_INSTALLER_FILE_ERROR_MOVE="Error on moving file %s"
JLIB_INSTALLER_INCORRECT_SEQUENCE="Downgrading from version %1$s to version %2$s is not allowed."
JLIB_INSTALLER_INSTALL="Install"
JLIB_INSTALLER_MINIMUM_JOOMLA="You don't have the minimum Joomla version requirement of J%s"
JLIB_INSTALLER_MINIMUM_PHP="Your server doesn't meet the minimum PHP version requirement of %s"
JLIB_INSTALLER_NOTICE_LANG_RESET_USERS="Language set to Default for %d users."
JLIB_INSTALLER_NOTICE_LANG_RESET_USERS_1="Language set to Default for %d user."
JLIB_INSTALLER_UNINSTALL="Uninstall"
JLIB_INSTALLER_UPDATE="Update"
JLIB_INSTALLER_ERROR_EXTENSION_INVALID_CLIENT_IDENTIFIER="Invalid client identifier specified in extension manifest."
JLIB_INSTALLER_ERROR_PACK_UNINSTALL_UNKNOWN_EXTENSION="Trying to uninstall unknown extension from package. This extension may have already been removed earlier."
JLIB_INSTALLER_NOT_ERROR="If the error is related to the installation of TinyMCE language files it has no effect on the installation of the language(s). Some language packs created prior to Joomla! 3.2.0 may try to install separate TinyMCE language files. As these are now included in the core they no longer need to be installed."
JLIB_INSTALLER_UPDATE_LOG_QUERY="Ran query from file %1$s. Query text: %2$s."
JLIB_INSTALLER_WARNING_UNABLE_TO_INSTALL_CONTENT_LANGUAGE="Unable to create a content language for %s language: %s"

JLIB_JS_AJAX_ERROR_CONNECTION_ABORT="A connection abort has occurred while fetching the JSON data."
JLIB_JS_AJAX_ERROR_NO_CONTENT="No content was returned."
JLIB_JS_AJAX_ERROR_OTHER="An error has occurred while fetching the JSON data: HTTP %s status code."
JLIB_JS_AJAX_ERROR_PARSE="A parse error has occurred while processing the following JSON data:<br/><code style="_QQ_"color:inherit;white-space:pre-wrap;padding:0;margin:0;border:0;background:inherit;"_QQ_">%s</code>"
JLIB_JS_AJAX_ERROR_TIMEOUT="A timeout has occurred while fetching the JSON data."

JLIB_LANGUAGE_ERROR_CANNOT_LOAD_METAFILE="Could not load %s language XML file from %s."
JLIB_LANGUAGE_ERROR_CANNOT_LOAD_METADATA="Could not load %s metadata from %s."

JLIB_LOGIN_AUTHORISATION="Your access has been authorised."
JLIB_LOGIN_DENIED="Your access has been denied."
JLIB_LOGIN_EXPIRED="Your authentication has expired."

JLIB_MAIL_FUNCTION_DISABLED="The mail() function has been disabled and the mail can't be sent."
JLIB_MAIL_FUNCTION_OFFLINE="The mail function has been disabled by an administrator."
JLIB_MAIL_INVALID_EMAIL_SENDER="Invalid email sender: %s"

JLIB_MEDIA_ERROR_UPLOAD_INPUT="Unable to upload file."
JLIB_MEDIA_ERROR_WARNFILENAME="File name must only have alphanumeric characters and no spaces."
JLIB_MEDIA_ERROR_WARNFILETOOLARGE="This file is too large to upload."
JLIB_MEDIA_ERROR_WARNFILETYPE="This file type is not supported."
JLIB_MEDIA_ERROR_WARNIEXSS="Possible IE XSS Attack found."
JLIB_MEDIA_ERROR_WARNINVALID_IMG="Not a valid image."
JLIB_MEDIA_ERROR_WARNINVALID_MIME="Invalid mime type detected."
JLIB_MEDIA_ERROR_WARNINVALID_MIMETYPE="Illegal mime type detected: %s"
JLIB_MEDIA_ERROR_WARNNOTADMIN="Uploaded file is not an image file and you do not have permission."

JLIB_MENUS_PRESET_JOOMLA="Preset - Joomla"
JLIB_MENUS_PRESET_MODERN="Preset - Modern"

JLIB_NO_EDITOR_PLUGIN_PUBLISHED="Unable to display an editor because no editor plugin is published."

JLIB_PLUGIN_ERROR_LOADING_PLUGINS="Error loading Plugins: %s"
JLIB_REGISTRY_EXCEPTION_LOAD_FORMAT_CLASS="Unable to load format class."

JLIB_RULES_ACTION="Action"
JLIB_RULES_ALLOWED="Allowed"
JLIB_RULES_ALLOWED_ADMIN="Allowed (Super User)"
JLIB_RULES_ALLOWED_INHERITED="Allowed (Inherited)"
JLIB_RULES_CALCULATED_SETTING="Calculated Setting"
JLIB_RULES_CONFLICT="Conflict"
JLIB_RULES_DATABASE_FAILURE="Failed storing the data to the database."
JLIB_RULES_DENIED="Denied"
JLIB_RULES_GROUP="%s"
JLIB_RULES_GROUPS="Groups"
JLIB_RULES_INHERIT="Inherit"
JLIB_RULES_INHERITED="Inherited"
JLIB_RULES_NOT_ALLOWED="Not Allowed"
JLIB_RULES_NOT_ALLOWED_ADMIN_CONFLICT="Conflict"
JLIB_RULES_NOT_ALLOWED_DEFAULT="Not Allowed (Default)"
JLIB_RULES_NOT_ALLOWED_INHERITED="Not Allowed (Inherited)"
JLIB_RULES_NOT_ALLOWED_LOCKED="Not Allowed (Locked)"
JLIB_RULES_NOT_SET="Not Set"
JLIB_RULES_NOTICE_RECALCULATE_GROUP_PERMISSIONS="Super User permissions changed. Save or reload to recalculate this group permissions."
JLIB_RULES_NOTICE_RECALCULATE_GROUP_CHILDS_PERMISSIONS="Permissions changed in a group with child groups. Save or reload to recalculate the child groups permissions."
JLIB_RULES_REQUEST_FAILURE="Failed sending the data to server."
JLIB_RULES_SAVE_BEFORE_CHANGE_PERMISSIONS="Please save before changing permissions."
JLIB_RULES_SELECT_ALLOW_DENY_GROUP="Allow or deny %s for users in the %s group."
JLIB_RULES_SELECT_SETTING="Select New Setting"
JLIB_RULES_SETTING_NOTES="If you change the setting, it will apply to this and all child groups, components and content. Note that <em><strong>Denied</strong></em> will overrule any inherited setting and also the setting in any child group, component or content. In the case of a setting conflict, <em><strong>Deny</strong></em> will take precedence. <em><strong>Not Set</strong></em> is equivalent to <em><strong>Denied</strong></em> but can be changed in child groups, components and content."
JLIB_RULES_SETTING_NOTES_ITEM="If you change the setting, it will apply to this item. Note that:<br /><em><strong>Inherited</strong></em> means that the permissions from global configuration, parent group and category will be used.<br /><em><strong>Denied</strong></em> means that no matter what the global configuration, parent group or category settings are, the group being edited can't take this action on this item.<br /><em><strong>Allowed</strong></em> means that the group being edited will be able to take this action for this item (but if this is in conflict with the global configuration, parent group or category it will have no impact; a conflict will be indicated by <em><strong>Not Allowed (Inherited)</strong></em> under Calculated Settings)."
JLIB_RULES_SETTINGS_DESC="Manage the permission settings for the user groups below. See notes at the bottom."

JLIB_STEMMER_INVALID_STEMMER="Invalid stemmer type %s"

JLIB_UNKNOWN="Unknown"
JLIB_UPDATER_ERROR_COLLECTION_FOPEN="The PHP allow_url_fopen setting is disabled. This setting must be enabled for the updater to work."
JLIB_UPDATER_ERROR_COLLECTION_OPEN_URL="Update: :Collection: Could not open %s"
JLIB_UPDATER_ERROR_COLLECTION_PARSE_URL="Update: :Collection: Could not parse %s"
JLIB_UPDATER_ERROR_EXTENSION_OPEN_URL="Update: :Extension: Could not open %s"
JLIB_UPDATER_ERROR_EXTENSION_PARSE_URL="Update: :Extension: Could not parse %s"
JLIB_UPDATER_ERROR_OPEN_UPDATE_SITE="Update: Could not open update site #%d &quot;%s&quot;, URL: %s"
JLIB_USER_ERROR_AUTHENTICATION_FAILED_LOAD_PLUGIN="JAuthentication: :authenticate: Failed to load plugin: %s"
JLIB_USER_ERROR_AUTHENTICATION_LIBRARIES="JAuthentication: :__construct: Could not load authentication libraries."
JLIB_USER_ERROR_BIND_ARRAY="Unable to bind array to user object."
JLIB_USER_ERROR_CANNOT_CHANGE_SUPER_USER="A user is not allowed to change permissions of a Super User group."
JLIB_USER_ERROR_CANNOT_CHANGE_OWN_GROUPS="A user is not allowed to change permissions of their own group(s)."
JLIB_USER_ERROR_CANNOT_CHANGE_OWN_PARENT_GROUPS="A user is not allowed to change permissions of their own group(s) parent group(s)."
JLIB_USER_ERROR_CANNOT_DEMOTE_SELF="You can't remove your own Super User permissions."
JLIB_USER_ERROR_CANNOT_REUSE_PASSWORD="You can't reuse your current password, please enter a new password."
JLIB_USER_ERROR_ID_NOT_EXISTS="JUser: :_load: User %s does not exist."
JLIB_USER_ERROR_NOT_SUPERADMIN="Only users with Super User permissions can change other Super User user accounts."
JLIB_USER_ERROR_PASSWORD_NOT_MATCH="Passwords do not match. Please re-enter password."
JLIB_USER_ERROR_UNABLE_TO_FIND_USER="Unable to find a user with given activation string."
JLIB_USER_ERROR_UNABLE_TO_LOAD_USER="JUser: :_load: Unable to load user with ID: %s"
JLIB_USER_EXCEPTION_ACCESS_USERGROUP_INVALID="User group does not exist."
JLIB_UTIL_ERROR_APP_INSTANTIATION="Application Startup Error."
JLIB_UTIL_ERROR_CONNECT_DATABASE="JDatabase: :getInstance: Could not connect to database <br />joomla.library: %1$s - %2$s"
JLIB_UTIL_ERROR_DOMIT="DommitDocument is deprecated. Use DomDocument instead."
JLIB_UTIL_ERROR_LOADING_FEED_DATA="Error loading feed data."
JLIB_UTIL_ERROR_XML_LOAD="Failed loading XML file."
language/en-GB/en-GB.plg_system_cache.ini000060400000002302152453623440014121 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CACHE_FIELD_BROWSERCACHE_DESC="If yes, use mechanism for storing page cache in the browser."
PLG_CACHE_FIELD_BROWSERCACHE_LABEL="Use Browser Caching"
PLG_CACHE_FIELD_EXCLUDE_DESC="Specify which URLs you want to exclude from caching, each on a separate line. Regular expressions are supported, eg. <br /><strong>about\-[a-z]+</strong> - will exclude all URLs that have 'about-', for example 'about-us', 'about-me', 'about-joomla' etc.<br /><strong>/component/users/</strong> - will exclude all URLs that have /component/users/.<br /><strong>com_users</strong> - will exclude all Users component pages."
PLG_CACHE_FIELD_EXCLUDE_LABEL="Exclude URLs"
PLG_CACHE_FIELD_EXCLUDE_MENU_ITEMS_DESC="Select which menu items you want to exclude from caching."
PLG_CACHE_FIELD_EXCLUDE_MENU_ITEMS_LABEL="Exclude Menu Items"
PLG_CACHE_FIELD_LIFETIME_DESC="Page cache lifetime in minutes."
PLG_CACHE_FIELD_LIFETIME_LABEL="Cache Lifetime"
PLG_CACHE_XML_DESCRIPTION="Provides page caching."
PLG_SYSTEM_CACHE="System - Page Cache"
language/en-GB/en-GB.mod_title.ini000060400000000450152453623440012572 0ustar00; Joomla! Project
; (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_TITLE="Title"
MOD_TITLE_XML_DESCRIPTION="This module shows the Toolbar Component Title."
language/en-GB/en-GB.com_newsfeeds.sys.ini000060400000002436152453623440014256 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_NEWSFEEDS="News Feeds"
COM_NEWSFEEDS_CATEGORIES="Categories"
COM_NEWSFEEDS_CATEGORIES_VIEW_DEFAULT_DESC="Show all the news feed categories within a category."
COM_NEWSFEEDS_CATEGORIES_VIEW_DEFAULT_OPTION="Default"
COM_NEWSFEEDS_CATEGORIES_VIEW_DEFAULT_TITLE="List All News Feed Categories"
COM_NEWSFEEDS_CATEGORY_ADD_TITLE="News Feed: Add Category"
COM_NEWSFEEDS_CATEGORY_EDIT_TITLE="News Feed: Edit Category"
COM_NEWSFEEDS_CATEGORY_VIEW_DEFAULT_DESC="Show all news feeds within a category."
COM_NEWSFEEDS_CATEGORY_VIEW_DEFAULT_OPTION="Default"
COM_NEWSFEEDS_CATEGORY_VIEW_DEFAULT_TITLE="List News Feeds in a Category"
COM_NEWSFEEDS_CONTENT_TYPE_NEWSFEED="News feed"
COM_NEWSFEEDS_CONTENT_TYPE_CATEGORY="News Feed Category"
COM_NEWSFEEDS_FEEDS="Feeds"
COM_NEWSFEEDS_NEWSFEED_VIEW_DEFAULT_DESC="Show a single news feed."
COM_NEWSFEEDS_NEWSFEED_VIEW_DEFAULT_OPTION="Default"
COM_NEWSFEEDS_NEWSFEED_VIEW_DEFAULT_TITLE="Single News Feed"
COM_NEWSFEEDS_TAGS_NEWSFEED="News Feed"
COM_NEWSFEEDS_TAGS_CATEGORY="News Feed Category"
COM_NEWSFEEDS_XML_DESCRIPTION="This component manages RSS and Atom news feeds."
language/en-GB/en-GB.com_admin.ini000060400000033523152453623440012547 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_ADMIN="System Information"
COM_ADMIN_ALPHABETICAL_INDEX="Alphabetical Index"
COM_ADMIN_CACHE_DIRECTORY="(Cache Folder)"
COM_ADMIN_CLEAR_RESULTS="Clear results"
COM_ADMIN_CONFIGURATION_FILE="Configuration File"
COM_ADMIN_DATABASE_COLLATION="Database Collation"
COM_ADMIN_DATABASE_CONNECTION_COLLATION="Database Connection Collation"
COM_ADMIN_DATABASE_TYPE="Database Type"
COM_ADMIN_DATABASE_VERSION="Database Version"
COM_ADMIN_DIRECTORY="Folder"
COM_ADMIN_DIRECTORY_PERMISSIONS="Folder Permissions"
COM_ADMIN_DISABLED_FUNCTIONS="Disabled Functions"
COM_ADMIN_DISPLAY_ERRORS="Display Errors"
COM_ADMIN_DOWNLOAD_SYSTEM_INFORMATION_TEXT="Download as text"
COM_ADMIN_DOWNLOAD_SYSTEM_INFORMATION_JSON="Download as JSON"
COM_ADMIN_EXTENSIONS="Extensions"
COM_ADMIN_FILE_UPLOADS="File Uploads"
COM_ADMIN_GLOSSARY="Glossary"
COM_ADMIN_GO="Go"
COM_ADMIN_HELP="Joomla! Help"
COM_ADMIN_HELP_COMPONENTS_ACTIONLOGS="Action Logs"
COM_ADMIN_HELP_COMPONENTS_ASSOCIATIONS="Multilingual Associations"
COM_ADMIN_HELP_COMPONENTS_ASSOCIATIONS_EDIT="Multilingual Associations: Select"
COM_ADMIN_HELP_COMPONENTS_BANNERS_BANNERS="Banners"
COM_ADMIN_HELP_COMPONENTS_BANNERS_BANNERS_EDIT="Banners: New/Edit"
COM_ADMIN_HELP_COMPONENTS_BANNERS_CATEGORIES="Banners: Categories"
COM_ADMIN_HELP_COMPONENTS_BANNERS_CATEGORIES_EDIT="Banners: Categories - New/Edit"
COM_ADMIN_HELP_COMPONENTS_BANNERS_CLIENTS="Banners: Clients"
COM_ADMIN_HELP_COMPONENTS_BANNERS_CLIENTS_EDIT="Banners: Clients - New/Edit"
COM_ADMIN_HELP_COMPONENTS_BANNERS_TRACKS="Banners: Tracks"
COM_ADMIN_HELP_COMPONENTS_CONTACTS_CONTACTS="Contacts"
COM_ADMIN_HELP_COMPONENTS_CONTACTS_CONTACTS_EDIT="Contacts: New/Edit"
COM_ADMIN_HELP_COMPONENTS_CONTACT_CATEGORIES="Contacts: Categories"
COM_ADMIN_HELP_COMPONENTS_CONTACT_CATEGORIES_EDIT="Contacts: Categories - New/Edit"
COM_ADMIN_HELP_COMPONENTS_CONTENT_CATEGORIES="Articles: Categories"
COM_ADMIN_HELP_COMPONENTS_CONTENT_CATEGORIES_EDIT="Articles: Categories - New/Edit"
COM_ADMIN_HELP_COMPONENTS_FIELDS_FIELDS="Fields"
COM_ADMIN_HELP_COMPONENTS_FIELDS_FIELDS_EDIT="Fields: New/Edit"
COM_ADMIN_HELP_COMPONENTS_FIELDS_FIELD_GROUPS="Field Groups"
COM_ADMIN_HELP_COMPONENTS_FIELDS_FIELD_GROUPS_EDIT="Field Groups: New/Edit"
COM_ADMIN_HELP_COMPONENTS_FINDER_MANAGE_CONTENT_MAPS="Smart Search: Content Maps"
COM_ADMIN_HELP_COMPONENTS_FINDER_MANAGE_INDEXED_CONTENT="Smart Search: Indexed Content"
COM_ADMIN_HELP_COMPONENTS_FINDER_MANAGE_SEARCH_FILTERS_EDIT="Smart Search: Filters - New/Edit"
COM_ADMIN_HELP_COMPONENTS_FINDER_MANAGE_SEARCH_FILTERS="Smart Search: Search Filters"
COM_ADMIN_HELP_COMPONENTS_JOOMLA_UPDATE="Joomla Update"
COM_ADMIN_HELP_COMPONENTS_MESSAGING_INBOX="Private Messages: Inbox"
COM_ADMIN_HELP_COMPONENTS_MESSAGING_READ="Private Messages: Read"
COM_ADMIN_HELP_COMPONENTS_MESSAGING_WRITE="Private Messages: Write"
COM_ADMIN_HELP_COMPONENTS_NEWSFEEDS_CATEGORIES="News Feeds: Categories"
COM_ADMIN_HELP_COMPONENTS_NEWSFEEDS_CATEGORIES_EDIT="News Feeds: Categories - New/Edit"
COM_ADMIN_HELP_COMPONENTS_NEWSFEEDS_FEEDS="News Feeds"
COM_ADMIN_HELP_COMPONENTS_NEWSFEEDS_FEEDS_EDIT="News Feeds: New/Edit"
COM_ADMIN_HELP_COMPONENTS_POST_INSTALLATION_MESSAGES="Post-Installation Messages"
COM_ADMIN_HELP_COMPONENTS_PRIVACY_CAPABILITIES="Privacy: Extension Capabilities"
COM_ADMIN_HELP_COMPONENTS_PRIVACY_CONSENTS="Privacy: Consents"
COM_ADMIN_HELP_COMPONENTS_PRIVACY_DASHBOARD="Privacy: Dashboard"
COM_ADMIN_HELP_COMPONENTS_PRIVACY_REQUEST="Privacy: Review Information Request"
COM_ADMIN_HELP_COMPONENTS_PRIVACY_REQUEST_EDIT="Privacy: New Information Request"
COM_ADMIN_HELP_COMPONENTS_PRIVACY_REQUESTS="Privacy: Information Requests"
COM_ADMIN_HELP_COMPONENTS_REDIRECT_MANAGER="Redirect: Links"
COM_ADMIN_HELP_COMPONENTS_REDIRECT_MANAGER_EDIT="Redirect: Links - New/Edit"
COM_ADMIN_HELP_COMPONENTS_SEARCH="Search"
COM_ADMIN_HELP_COMPONENTS_TAGS_MANAGER="Tags"
COM_ADMIN_HELP_COMPONENTS_TAGS_MANAGER_EDIT="Tags: New/Edit"
COM_ADMIN_HELP_COMPONENTS_WEBLINKS_CATEGORIES="Web Links: Categories"
COM_ADMIN_HELP_COMPONENTS_WEBLINKS_CATEGORIES_EDIT="Web Links: Categories - New/Edit"
COM_ADMIN_HELP_COMPONENTS_WEBLINKS_LINKS="Web Links"
COM_ADMIN_HELP_COMPONENTS_WEBLINKS_LINKS_EDIT="Web Links: New/Edit"
COM_ADMIN_HELP_CONTENT_ARTICLE_MANAGER="Articles"
COM_ADMIN_HELP_CONTENT_ARTICLE_MANAGER_EDIT="Articles: New/Edit"
COM_ADMIN_HELP_CONTENT_FEATURED_ARTICLES="Articles: Featured "
COM_ADMIN_HELP_CONTENT_MEDIA_MANAGER="Media"
COM_ADMIN_HELP_EXTENSIONS_EXTENSION_MANAGER_DATABASE="Extensions: Check Database"
COM_ADMIN_HELP_EXTENSIONS_EXTENSION_MANAGER_DISCOVER="Extensions: Discover"
COM_ADMIN_HELP_EXTENSIONS_EXTENSION_MANAGER_INSTALL="Extensions: Install"
COM_ADMIN_HELP_EXTENSIONS_EXTENSION_MANAGER_LANGUAGES="Extensions: Install Accredited Language Translations"
COM_ADMIN_HELP_EXTENSIONS_EXTENSION_MANAGER_MANAGE="Extensions: Manage"
COM_ADMIN_HELP_EXTENSIONS_EXTENSION_MANAGER_UPDATE="Extensions: Update"
COM_ADMIN_HELP_EXTENSIONS_EXTENSION_MANAGER_WARNINGS="Extensions: Warnings"
COM_ADMIN_HELP_EXTENSIONS_LANGUAGE_MANAGER_CONTENT="Languages: Content"
COM_ADMIN_HELP_EXTENSIONS_LANGUAGE_MANAGER_EDIT="Languages: New/Edit"
COM_ADMIN_HELP_EXTENSIONS_LANGUAGE_MANAGER_INSTALLED="Languages: Installed"
COM_ADMIN_HELP_EXTENSIONS_LANGUAGE_MANAGER_OVERRIDES="Languages: Overrides"
COM_ADMIN_HELP_EXTENSIONS_LANGUAGE_MANAGER_OVERRIDES_EDIT="Languages: Overrides - New/Edit"
COM_ADMIN_HELP_EXTENSIONS_MODULE_MANAGER="Modules"
COM_ADMIN_HELP_EXTENSIONS_MODULE_MANAGER_EDIT="Modules: Edit"
COM_ADMIN_HELP_EXTENSIONS_PLUGIN_MANAGER="Plugins"
COM_ADMIN_HELP_EXTENSIONS_PLUGIN_MANAGER_EDIT="Plugins: New/Edit"
COM_ADMIN_HELP_EXTENSIONS_TEMPLATE_MANAGER_STYLES="Templates: Styles"
COM_ADMIN_HELP_EXTENSIONS_TEMPLATE_MANAGER_STYLES_EDIT="Templates: Styles - Edit"
COM_ADMIN_HELP_EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES="Templates"
COM_ADMIN_HELP_EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES_EDIT="Templates: Edit"
COM_ADMIN_HELP_EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES_EDIT_SOURCE="Templates: Source - Edit"
COM_ADMIN_HELP_GLOSSARY="Glossary"
COM_ADMIN_HELP_MENUS_MENU_ITEM_MANAGER="Menu: Items"
COM_ADMIN_HELP_MENUS_MENU_ITEM_MANAGER_EDIT="Menu: Items New/Edit"
COM_ADMIN_HELP_MENUS_MENU_MANAGER="Menus"
COM_ADMIN_HELP_MENUS_MENU_MANAGER_EDIT="Menus: New/Edit"
COM_ADMIN_HELP_SITE_GLOBAL_CONFIGURATION="Global Configuration"
COM_ADMIN_HELP_SITE_MAINTENANCE_CLEAR_CACHE="Cache: Clear Cache"
COM_ADMIN_HELP_SITE_MAINTENANCE_GLOBAL_CHECK-IN="Global Check-in"
COM_ADMIN_HELP_SITE_MAINTENANCE_PURGE_EXPIRED_CACHE="Cache: Clear Expired Cache"
COM_ADMIN_HELP_SITE_SYSTEM_INFORMATION="System Information"
COM_ADMIN_HELP_START_HERE="Start Here"
COM_ADMIN_HELP_USERS_ACCESS_LEVELS="Users: Access Levels"
COM_ADMIN_HELP_USERS_ACCESS_LEVELS_EDIT="Users: Access Levels - New/Edit"
COM_ADMIN_HELP_USERS_DEBUG_USER="Users: Debug Users Permissions"
COM_ADMIN_HELP_USERS_GROUPS="Users: Groups"
COM_ADMIN_HELP_USERS_GROUPS_EDIT="Users: Groups - New/Edit"
COM_ADMIN_HELP_USERS_MASS_MAIL_USERS="Mass Mail Users"
COM_ADMIN_HELP_USERS_USER_NOTES="Users: User Notes"
COM_ADMIN_HELP_USERS_USER_NOTES_EDIT="Users: User Notes - New/Edit"
COM_ADMIN_HELP_USERS_USER_MANAGER="Users"
COM_ADMIN_HELP_USERS_USER_MANAGER_EDIT="Users: New/Edit"
COM_ADMIN_ICONV_AVAILABLE="Iconv Available"
COM_ADMIN_INFORMATION="System Information"
COM_ADMIN_JOOMLA_VERSION="Joomla! Version"
COM_ADMIN_LATEST_VERSION_CHECK="Latest Version Check"
COM_ADMIN_LICENSE="License"
COM_ADMIN_LOG_DIRECTORY="(Log folder)"
COM_ADMIN_MAGIC_QUOTES="Magic Quotes"
COM_ADMIN_MAX_INPUT_VARS="Maximum Input Variables"
COM_ADMIN_MBSTRING_ENABLED="Multibyte String (mbstring) Enabled"
COM_ADMIN_MCRYPT_ENABLED="Mcrypt Enabled"
COM_ADMIN_NA="n/a"
COM_ADMIN_OPEN_BASEDIR="Open basedir"
COM_ADMIN_OUTPUT_BUFFERING="Output Buffering"
COM_ADMIN_PHP_BUILT_ON="PHP Built On"
COM_ADMIN_PHP_INFORMATION="PHP Information"
COM_ADMIN_PHP_SETTINGS="PHP Settings"
COM_ADMIN_PHP_VERSION="PHP Version"
COM_ADMIN_PHPINFO_DISABLED="The built in phpinfo() function has been disabled by your host."
COM_ADMIN_PLATFORM_VERSION="Joomla! Platform Version"
COM_ADMIN_POSTINSTALL_MSG_BEHIND_LOAD_BALANCER_ACTION="Enable Behind Load Balancer Setting"
COM_ADMIN_POSTINSTALL_MSG_BEHIND_LOAD_BALANCER_DESCRIPTION="<p>For Joomla sites hosted behind Load Balancers and Reverse Proxies a new Global Configuration setting has been introduced with Joomla 3.9.26</p><p>This setting, when enabled, will allow your Load Balancer/Reverse Proxy to provide the real IP address of your visitors. This IP will then be used in your Action Logs and used for tracking voting on articles (if these features are enabled).</p><p><strong>Only sites behind a Load Balancer/Reverse Proxy will wish to enable this feature.</strong></p>"
COM_ADMIN_POSTINSTALL_MSG_BEHIND_LOAD_BALANCER_TITLE="New Server Setting \"Behind Load Balancer\""
COM_ADMIN_POSTINSTALL_MSG_HTACCESS_AUTOINDEX_DESCRIPTION="<p>Before 3.9.22 the default htaccess.txt file contained erroneous code meant for disabling directory listings. The security team recommends to manually apply the necessary changes to any existing .htaccess file, as this file can not be updated automatically.</p><p>The old code:</p><pre>&lt;IfModule autoindex&gt;\n  IndexIgnore *\n&lt;/IfModule&gt;</pre><p>The new code:</p><pre>&lt;IfModule mod_autoindex.c&gt;\n  IndexIgnore *\n&lt;/IfModule&gt;</pre>"
COM_ADMIN_POSTINSTALL_MSG_HTACCESS_AUTOINDEX_TITLE=".htaccess Update Concerning Directory Listings"
COM_ADMIN_REGISTER_GLOBALS="Register Globals"
COM_ADMIN_RELEVANT_PHP_SETTINGS="Relevant PHP Settings"
COM_ADMIN_SAFE_MODE="Safe Mode"
COM_ADMIN_SAVE_SUCCESS="Profile saved."
COM_ADMIN_SEARCH="Search"
COM_ADMIN_SESSION_AUTO_START="Session Auto Start"
COM_ADMIN_SESSION_SAVE_PATH="Session Save Path"
COM_ADMIN_SETTING="Setting"
COM_ADMIN_SHORT_OPEN_TAGS="Short Open Tags"
COM_ADMIN_START_HERE="Start here"
COM_ADMIN_STATUS="Status"
COM_ADMIN_SYSTEM_INFO="System Info"
COM_ADMIN_SYSTEM_INFORMATION="System Information"
COM_ADMIN_TEMP_DIRECTORY="(Temp folder)"
COM_ADMIN_UNWRITABLE="Unwritable"
COM_ADMIN_USER_ACCOUNT_DETAILS="My Profile Details"
COM_ADMIN_USER_AGENT="User Agent"
COM_ADMIN_USER_FIELD_BACKEND_LANGUAGE_DESC="Select the Language for the Administrator Backend interface. This will only affect this User."
COM_ADMIN_USER_FIELD_BACKEND_LANGUAGE_LABEL="Backend Language"
COM_ADMIN_USER_FIELD_BACKEND_TEMPLATE_DESC="Select the template style for the Administrator Backend interface. This will only affect this User."
COM_ADMIN_USER_FIELD_BACKEND_TEMPLATE_LABEL="Backend Template Style"
COM_ADMIN_USER_FIELD_EDITOR_DESC="Editor for this user."
COM_ADMIN_USER_FIELD_EDITOR_LABEL="Editor"
COM_ADMIN_USER_FIELD_EMAIL_DESC="Enter an email address for the user."
COM_ADMIN_USER_FIELD_FRONTEND_LANGUAGE_DESC="Select the Language for the Frontend interface. This will only affect this User."
COM_ADMIN_USER_FIELD_FRONTEND_LANGUAGE_LABEL="Frontend Language"
; The following two strings are deprecated and will be removed with 4.0.
COM_ADMIN_USER_FIELD_HELPSITE_DESC="Help site for this user."
COM_ADMIN_USER_FIELD_HELPSITE_LABEL="Help Site"
COM_ADMIN_USER_FIELD_LASTVISIT_DESC="Last visit date."
COM_ADMIN_USER_FIELD_LASTVISIT_LABEL="Last Visit Date"
COM_ADMIN_USER_FIELD_NAME_DESC="Enter the name of the user."
COM_ADMIN_USER_FIELD_NOCHANGE_USERNAME_DESC="If you want to change your Username, please contact a site administrator."
COM_ADMIN_USER_FIELD_PASSWORD1_MESSAGE="The passwords you entered do not match. Please enter your desired password in the password field and confirm your entry by entering it in the confirm password field."
COM_ADMIN_USER_FIELD_PASSWORD2_DESC="Confirm the user's password."
COM_ADMIN_USER_FIELD_PASSWORD2_LABEL="Confirm Password"
COM_ADMIN_USER_FIELD_PASSWORD_DESC="Enter the password for the user."
COM_ADMIN_USER_FIELD_REGISTERDATE_DESC="Registration date."
COM_ADMIN_USER_FIELD_REGISTERDATE_LABEL="Registration Date"
COM_ADMIN_USER_FIELD_TIMEZONE_DESC="Time zone for this user."
COM_ADMIN_USER_FIELD_TIMEZONE_LABEL="Time Zone"
COM_ADMIN_USER_FIELD_USERNAME_DESC="Enter the login name (Username) for the user."
COM_ADMIN_USER_FIELD_USERNAME_LABEL="Login Name"
COM_ADMIN_USER_HEADING_NAME="Name"
COM_ADMIN_USER_SETTINGS_FIELDSET_LABEL="Basic Settings"
COM_ADMIN_VALUE="Value"
COM_ADMIN_VIEW="View"
COM_ADMIN_VIEW_PROFILE_TITLE="My Profile"
COM_ADMIN_WEBSERVER_TO_PHP_INTERFACE="WebServer to PHP Interface"
COM_ADMIN_WEB_SERVER="Web Server"
COM_ADMIN_WRITABLE="Writable"
COM_ADMIN_XML_DESCRIPTION="Administration system information component."
COM_ADMIN_XML_ENABLED="XML Enabled"
COM_ADMIN_ZIP_ENABLED="Native ZIP Enabled"
COM_ADMIN_ZLIB_ENABLED="Zlib Enabled"

; Messages
COM_USERS_MSG_NOT_ENOUGH_INTEGERS_N="Password does not have enough digits. At least %s digits are required."
COM_USERS_MSG_NOT_ENOUGH_INTEGERS_N_1="Password does not have enough digits. At least 1 digit is required."
COM_USERS_MSG_NOT_ENOUGH_LOWERCASE_LETTERS_N="Password does not have enough lower case characters. At least %s lower case characters are required."
COM_USERS_MSG_NOT_ENOUGH_LOWERCASE_LETTERS_N_1="Password does not have enough lower case characters. At least 1 lower case character is required."
COM_USERS_MSG_NOT_ENOUGH_SYMBOLS_N="Password does not have enough symbols (such as !@#$). At least %s symbols are required."
COM_USERS_MSG_NOT_ENOUGH_SYMBOLS_N_1="Password does not have enough symbols (such as !@#$). At least 1 symbol is required."
COM_USERS_MSG_NOT_ENOUGH_UPPERCASE_LETTERS_N="Password does not have enough upper case characters. At least %s upper case characters are required."
COM_USERS_MSG_NOT_ENOUGH_UPPERCASE_LETTERS_N_1="Password does not have enough upper case characters. At least 1 upper case character is required."
COM_USERS_MSG_PASSWORD_TOO_LONG="Password is too long. Passwords must be less than 100 characters."
COM_USERS_MSG_PASSWORD_TOO_SHORT_N="Password is too short. Passwords must have at least %s characters."
COM_USERS_MSG_SPACES_IN_PASSWORD="Password must not have spaces at the beginning or end."
language/en-GB/en-GB.plg_content_confirmconsent.ini000060400000001732152453623440016241 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CONTENT_CONFIRMCONSENT="Content - Confirm Consent"
PLG_CONTENT_CONFIRMCONSENT_CONSENTBOX_LABEL="Privacy Note"
PLG_CONTENT_CONFIRMCONSENT_FIELD_ARTICLE_DESC="Select the article from the list or create a new one."
PLG_CONTENT_CONFIRMCONSENT_FIELD_ARTICLE_LABEL="Privacy Article"
PLG_CONTENT_CONFIRMCONSENT_FIELD_NOTE_DEFAULT="By submitting this form you agree to the Privacy Policy of this website and the storing of the submitted information."
PLG_CONTENT_CONFIRMCONSENT_FIELD_NOTE_DESC="A summary of the site's privacy policy. If left blank then the default message will be used."
PLG_CONTENT_CONFIRMCONSENT_FIELD_NOTE_LABEL="Short Privacy Policy"
PLG_CONTENT_CONFIRMCONSENT_XML_DESCRIPTION="This plugin adds a required consent checkbox to a form eg the core contact component."
language/en-GB/en-GB.plg_content_sudesign_audio.ini000060400000001067152453623440016215 0ustar00PLG_CONTENT_SUDESIGN_AUDIO="SUDesign : Simple Audio Shortcode"
SD_INCLUDE_MEDIAELEMENT="Include MediaElement.js"
SD_INCLUDE_MEDIAELEMENT_DESC="Include or not the lib JS/CSS MediaElement, if a module or your template already use it, please select 'no'"
SD_OUI="Yes"
SD_NON="No"
SD_INCLUDE_JQUERY="Include jQuery"
SD_INCLUDE_JQUERY_DESC="jQuery is probably already included in your installation, if the plugin does not work correctly, try turning on this option"
SD_DEFAULT_WIDTH="Default player width"
SD_DEFAULT_WIDTH_DESC="Setup here the default player width, un PX"language/en-GB/en-GB.plg_actionlog_joomla.sys.ini000060400000000605152453623440015613 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_ACTIONLOG_JOOMLA="Action Log - Joomla"
PLG_ACTIONLOG_JOOMLA_XML_DESCRIPTION="Record the actions of users on the site for Joomla core extensions so they can be reviewed if required."
language/en-GB/en-GB.tpl_hathor.sys.ini000060400000001513152453623440013574 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

HATHOR="Hathor Administrator template"
TPL_HATHOR_POSITION_CP_SHELL="Unused"
TPL_HATHOR_POSITION_CPANEL="Control Panel"
TPL_HATHOR_POSITION_DEBUG="Debug"
TPL_HATHOR_POSITION_FOOTER="Footer"
TPL_HATHOR_POSITION_ICON="Quick Icons"
TPL_HATHOR_POSITION_LOGIN="Login"
TPL_HATHOR_POSITION_MENU="Menu"
TPL_HATHOR_POSITION_POSTINSTALL="Postinstall"
TPL_HATHOR_POSITION_STATUS="Status"
TPL_HATHOR_POSITION_SUBMENU="Submenu"
TPL_HATHOR_POSITION_TITLE="Title"
TPL_HATHOR_POSITION_TOOLBAR="Toolbar"
TPL_HATHOR_XML_DESCRIPTION="Hathor is an accessible Administrator template for Joomla! The Colour CSS files can also be used for custom colour branding."language/en-GB/en-GB.plg_system_languagecode.sys.ini000060400000000603152453623440016313 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_LANGUAGECODE="System - Language Code"
PLG_SYSTEM_LANGUAGECODE_XML_DESCRIPTION="Provides ability to change the language code in the generated HTML document to improve SEO."

language/en-GB/en-GB.plg_privacy_actionlogs.ini000060400000000557152453623440015363 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_PRIVACY_ACTIONLOGS="Privacy - Action Logs"
PLG_PRIVACY_ACTIONLOGS_XML_DESCRIPTION="Responsible for exporting the action log data for a user's privacy request."
language/en-GB/en-GB.plg_fields_sql.ini000060400000002244152453623440013604 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_SQL="Fields - SQL"
PLG_FIELDS_SQL_CREATE_NOT_POSSIBLE="Only a Super User can create or edit an SQL field!"
PLG_FIELDS_SQL_LABEL="SQL (%s)"
PLG_FIELDS_SQL_PARAMS_MULTIPLE_DESC="Allow multiple values to be selected."
PLG_FIELDS_SQL_PARAMS_MULTIPLE_LABEL="Multiple"
; In the string below the terms 'value' and 'text' should not be translated
PLG_FIELDS_SQL_PARAMS_QUERY_DESC="The SQL query which will provide the data for the dropdown list. The query must return two columns; one called 'value' which will hold the values of the list items; the other called 'text' with the text in the dropdown list."
PLG_FIELDS_SQL_PARAMS_QUERY_LABEL="Query"
; This string is deprecated and will be removed with 4.0.
PLG_FIELDS_SQL_RULES_ADAPTED="For increased security the edit permission for this SQL field was set to denied for all non Super Users."
PLG_FIELDS_SQL_XML_DESCRIPTION="This plugin lets you create new fields of type 'sql' in any extensions where custom fields are supported."
language/en-GB/en-GB.plg_privacy_contact.ini000060400000000560152453623440014646 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_PRIVACY_CONTACT="Privacy - Contacts"
PLG_PRIVACY_CONTACT_XML_DESCRIPTION="Responsible for processing privacy related requests for the core Joomla contact data."
language/en-GB/en-GB.com_content.ini000060400000041513152453623440013127 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_CONTENT="Articles"
COM_CONTENT_ACCESS_DELETE_DESC="New setting for <strong>delete actions</strong> on this article and the calculated setting based on the parent category and group permissions."
COM_CONTENT_ACCESS_EDIT_DESC="New setting for <strong>edit actions</strong> on this article and the calculated setting based on the parent category and group permissions."
COM_CONTENT_ACCESS_EDITSTATE_DESC="New setting for <strong>edit state actions</strong> on this article and the calculated setting based on the parent category and group permissions."
COM_CONTENT_ARTICLE_CONTENT="Content"
COM_CONTENT_ARTICLE_DETAILS="Article Details"
COM_CONTENT_ARTICLES_TITLE="Articles"
COM_CONTENT_ATTRIBS_ARTICLE_SETTINGS_LABEL="Options"
COM_CONTENT_ATTRIBS_FIELDSET_LABEL="Options"
; COM_CONTENT_BATCH_MENU_LABEL is deprecated, use JLIB_HTML_BATCH_MENU_LABEL instead.
COM_CONTENT_BATCH_MENU_LABEL="To Move or Copy your selection please select a Category."
COM_CONTENT_BATCH_OPTIONS="Batch process the selected articles"
COM_CONTENT_BATCH_TIP="If a category is selected for move/copy, any actions selected will be applied to the copied or moved articles. Otherwise, all actions are applied to the selected articles."
COM_CONTENT_CHANGE_ARTICLE="Select or Change article"
COM_CONTENT_CHANGE_ARTICLE_BUTTON="Select/Change"
COM_CONTENT_CHOOSE_CATEGORY_DESC="Select a parent category."
COM_CONTENT_CONFIG_ARTICLE_SETTINGS_DESC="These settings apply for article layouts unless they are changed for a specific menu item or article."
COM_CONTENT_CONFIG_BLOG_SETTINGS_DESC="These settings apply for blog or featured layouts unless they are changed for a specific menu item."
COM_CONTENT_CONFIG_BLOG_SETTINGS_LABEL="Blog/Featured Layouts"
COM_CONTENT_CONFIG_CATEGORIES_SETTINGS_DESC="These settings apply for Articles Categories Options, unless they are changed by the individual category or menu settings."
COM_CONTENT_CONFIG_CATEGORY_SETTINGS_DESC="These settings apply for Articles Category Options unless they are changed by the individual category or menu settings."
COM_CONTENT_CONFIG_EDITOR_LAYOUT="These options control the layout of the article editing page."
COM_CONTENT_CONFIG_INTEGRATION_SETTINGS_DESC="These settings determine how the Article Component will integrate with other extensions."
COM_CONTENT_CONFIG_LIST_SETTINGS_DESC="These settings apply for List Layouts Options unless they are changed for a specific menu item or category."
COM_CONTENT_CONFIGURATION="Articles: Options"
COM_CONTENT_CREATE_ARTICLE_CANCEL_REDIRECT_MENU_DESC="Select the page the user will be redirected to after Canceling article submission. The default is to redirect to the same article submission page (cleaning form)."
COM_CONTENT_CREATE_ARTICLE_CANCEL_REDIRECT_MENU_LABEL="Cancel Redirect"
COM_CONTENT_CREATE_ARTICLE_CATEGORY_DESC="If set to 'Yes', this page will only let you create articles in the category selected below."
COM_CONTENT_CREATE_ARTICLE_CATEGORY_LABEL="Specific Category"
COM_CONTENT_CREATE_ARTICLE_CUSTOM_CANCEL_REDIRECT_DESC="If set to 'Yes', you can set a redirection page, distinct from above 'Submission/Cancel Redirect', to redirect to when user Cancels article submission.<br />If set to 'No', when user Cancels article submission, the user is redirected to the above 'Submission/Cancel Redirect' page."
COM_CONTENT_CREATE_ARTICLE_CUSTOM_CANCEL_REDIRECT_LABEL="Custom Redirect on Cancel"
COM_CONTENT_CREATE_ARTICLE_ERROR="When default category is enabled, a category should be selected."
COM_CONTENT_CREATE_ARTICLE_REDIRECTMENU_DESC="Select the page the user will be redirected to after a successful article submission and after cancel (if not set differently below). The default is to redirect to the home page."
COM_CONTENT_CREATE_ARTICLE_REDIRECTMENU_LABEL="Submission/Cancel Redirect"
COM_CONTENT_DRILL_CATEGORIES_LABEL="List or Blog: after choosing the display,<br />make sure you define the Options in the desired layout."
COM_CONTENT_DRILL_DOWN_LAYOUT_DESC="When drilling down to a category, show articles in a list or blog layout."
COM_CONTENT_DRILL_DOWN_LAYOUT_LABEL="List or Blog Layout"
COM_CONTENT_EDIT_ARTICLE="Edit Article"
COM_CONTENT_EDIT_CATEGORY="Edit Category"
COM_CONTENT_EDITORCONFIG_FIELDSET_LABEL="Configure Edit Screen"
COM_CONTENT_EDITING_LAYOUT="Editing Layout"
COM_CONTENT_ERROR_ALL_LANGUAGE_ASSOCIATED="A content item set to All languages can't be associated. Associations have not been set."
COM_CONTENT_FEATURED="Featured Article"
COM_CONTENT_FEATURED_ARTICLES="Featured Articles"
COM_CONTENT_FEATURED_CATEGORIES_DESC="Optional list of categories. If selected, only featured articles from the selected categories will show."
COM_CONTENT_FEATURED_CATEGORIES_LABEL="Select Categories"
COM_CONTENT_FEATURED_ORDER="Featured Articles Order"
COM_CONTENT_FEATURED_TITLE="Articles: Featured"
COM_CONTENT_FIELD_BROWSER_PAGE_TITLE_DESC="Optional text for the &quot;Browser page title&quot; element to be used when the article is viewed with a non-article menu item. If blank, the article's title is used instead."
COM_CONTENT_FIELD_BROWSER_PAGE_TITLE_LABEL="Browser Page Title"
COM_CONTENT_FIELD_ARTICLETEXT_DESC="Enter the article content in the text area."
COM_CONTENT_FIELD_ARTICLETEXT_LABEL="Article Text"
COM_CONTENT_FIELD_CAPTCHA_DESC="Select the captcha plugin that will be used in the article submit form. You may need to enter required information for your captcha plugin in the Plugin Manager.<br />If 'Use Global' is selected, make sure a captcha plugin is selected in Global Configuration."
COM_CONTENT_FIELD_CAPTCHA_LABEL="Allow Captcha on submit"
COM_CONTENT_FIELD_CREATED_BY_ALIAS_DESC="Enter an alias to be displayed instead of the name of the user who created the article."
COM_CONTENT_FIELD_CREATED_BY_ALIAS_LABEL="Created by Alias"
COM_CONTENT_FIELD_CREATED_BY_DESC="Select the name of the user who created the article."
COM_CONTENT_FIELD_CREATED_BY_LABEL="Created By"
COM_CONTENT_FIELD_CREATED_DESC="Created date."
COM_CONTENT_FIELD_CREATED_LABEL="Created Date"
COM_CONTENT_FIELD_FEATURED_DESC="Assign the article to the featured blog layout."
COM_CONTENT_FIELD_FULL_DESC="Select or upload an image for the single article display."
COM_CONTENT_FIELD_FULL_LABEL="Full Article Image"
COM_CONTENT_FIELD_FULLTEXT="Full text"
COM_CONTENT_FIELD_HITS_DESC="Number of hits for this article."
COM_CONTENT_FIELD_IMAGE_DESC="The image to be displayed."
COM_CONTENT_FIELD_IMAGE_ALT_DESC="Alternative text used for visitors without access to images."
COM_CONTENT_FIELD_IMAGE_ALT_LABEL="Alt Text"
COM_CONTENT_FIELD_IMAGE_CAPTION_DESC="Caption attached to the image."
COM_CONTENT_FIELD_IMAGE_CAPTION_LABEL="Caption"
COM_CONTENT_FIELD_IMAGE_OPTIONS="Image Options"
COM_CONTENT_FIELD_INFOBLOCK_POSITION_DESC="Puts the article information block above or below the text or splits it into two separate blocks, one above and the other below."
COM_CONTENT_FIELD_INFOBLOCK_POSITION_LABEL="Position of Article Info"
COM_CONTENT_FIELD_INFOBLOCK_TITLE_DESC="Displays the 'Article Info' title on top of the article information block."
COM_CONTENT_FIELD_INFOBLOCK_TITLE_LABEL="Article Info Title"
COM_CONTENT_FIELD_INTRO_DESC="Image for the intro text layouts such as blogs and featured."
COM_CONTENT_FIELD_INTRO_LABEL="Intro Image"
COM_CONTENT_FIELD_INTROTEXT="Intro Text"
COM_CONTENT_FIELD_LANGUAGE_DESC="The language that the article is assigned to."
COM_CONTENT_FIELD_MODIFIED_DESC="The date and time that the article was last modified."
COM_CONTENT_FIELD_NOTE_DESC="An optional note to display in the article list."
COM_CONTENT_FIELD_NOTE_LABEL="Note"
COM_CONTENT_FIELD_OPTION_ABOVE="Above"
COM_CONTENT_FIELD_OPTION_BELOW="Below"
COM_CONTENT_FIELD_OPTION_SPLIT="Split"
COM_CONTENT_FIELD_PUBLISH_DOWN_DESC="An optional date to Finish Publishing the article."
COM_CONTENT_FIELD_PUBLISH_DOWN_LABEL="Finish Publishing"
COM_CONTENT_FIELD_PUBLISH_UP_DESC="An optional date to Start Publishing the article."
COM_CONTENT_FIELD_PUBLISH_UP_LABEL="Start Publishing"
COM_CONTENT_FIELD_SELECT_ARTICLE_DESC="Select or create an article to be displayed."
COM_CONTENT_FIELD_SELECT_ARTICLE_LABEL="Select Article"
COM_CONTENT_FIELD_SHOW_CAT_TAGS_DESC="Show the tags for the category."
COM_CONTENT_FIELD_SHOW_CAT_TAGS_LABEL="Show Tags"
COM_CONTENT_FIELD_SHOW_TAGS_DESC="Show the tags for each article."
COM_CONTENT_FIELD_SHOW_TAGS_LABEL="Show Tags"
COM_CONTENT_FIELD_URL_DESC="The actual link to which users will be redirected."
COM_CONTENT_FIELD_URL_LINK_TEXT_DESC="Text to display for the link."
COM_CONTENT_FIELD_URL_LINK_TEXT_LABEL="Link Text"
COM_CONTENT_FIELD_URLA_LABEL="Link A"
COM_CONTENT_FIELD_URLA_LINK_TEXT_LABEL="Link A Text"
COM_CONTENT_FIELD_URLB_LABEL="Link B"
COM_CONTENT_FIELD_URLB_LINK_TEXT_LABEL="Link B Text"
COM_CONTENT_FIELD_URLC_LABEL="Link C"
COM_CONTENT_FIELD_URLC_LINK_TEXT_LABEL="Link C Text"
COM_CONTENT_FIELD_URLS_OPTIONS="URL Options"
COM_CONTENT_FIELD_URLSPOSITION_LABEL="Positioning of the Links"
COM_CONTENT_FIELD_URLSPOSITION_DESC="Display the links above or below the content."
COM_CONTENT_FIELD_VALUE_USE_ARTICLE_SETTINGS="Use Article Settings"
COM_CONTENT_FIELD_VERSION_DESC="A count of the number of times this article has been revised."
COM_CONTENT_FIELD_VERSION_LABEL="Revision"
COM_CONTENT_FIELD_XREFERENCE_DESC="An optional reference used to link to external data sources."
COM_CONTENT_FIELD_XREFERENCE_LABEL="External Reference"
COM_CONTENT_FIELDS_ARTICLE_FIELDS_TITLE="Articles: Fields"
COM_CONTENT_FIELDS_ARTICLE_FIELD_ADD_TITLE="Articles: New Field"
COM_CONTENT_FIELDS_ARTICLE_FIELD_EDIT_TITLE="Articles: Edit Field"
COM_CONTENT_FIELDS_TYPE_MODAL_ARTICLE="Article"
COM_CONTENT_FIELDSET_PUBLISHING="Publishing"
COM_CONTENT_FIELDSET_RULES="Permissions"
COM_CONTENT_FIELDSET_URLS_AND_IMAGES="Images and Links"
COM_CONTENT_FILTER_SEARCH_DESC="Search in title, alias and note. Prefix with ID: or AUTHOR: or CONTENT: to search for an article ID, article author or search in article content."
COM_CONTENT_FILTER_SEARCH_LABEL="Search Articles"
COM_CONTENT_FLOAT_DESC="Controls placement of the image."
COM_CONTENT_FLOAT_FULLTEXT_LABEL="Full Text Image Float"
COM_CONTENT_FLOAT_LABEL="Image Float"
COM_CONTENT_FLOAT_INTRO_LABEL="Intro Image Float"
COM_CONTENT_HEADING_ASSOCIATION="Association"
COM_CONTENT_HEADING_DATE_CREATED="Date Created"
COM_CONTENT_HEADING_DATE_MODIFIED="Date Modified"
COM_CONTENT_HEADING_DATE_PUBLISH_UP="Start Publishing"
COM_CONTENT_HEADING_DATE_PUBLISH_DOWN="Finish Publishing"
COM_CONTENT_ID_LABEL="ID"
; The following 2 strings are deprecated and will be removed with 4.0.
COM_CONTENT_ITEM_ASSOCIATIONS_FIELDSET_LABEL="Content Item Associations"
COM_CONTENT_ITEM_ASSOCIATIONS_FIELDSET_DESC="Multilingual only! This choice will only display if the Language Filter parameter 'Item Associations' is set to 'Yes'. Choose a content item for the target language. This association will let the Language Switcher module redirect to the associated content item in another language. If used, make sure to display the Language switcher module on the relevant pages. A content item set to language 'All' can't be associated."
COM_CONTENT_LEFT="Left"
COM_CONTENT_MODIFIED_ASC="Date Modified ascending"
COM_CONTENT_MODIFIED_DESC="Date Modified descending"
COM_CONTENT_MONTH="Month"
COM_CONTENT_N_ITEMS_ARCHIVED="%s articles archived."
COM_CONTENT_N_ITEMS_ARCHIVED_1="%s article archived."
COM_CONTENT_N_ITEMS_CHECKED_IN_0="No article checked in."
COM_CONTENT_N_ITEMS_CHECKED_IN_1="%d article checked in."
COM_CONTENT_N_ITEMS_CHECKED_IN_MORE="%d articles checked in."
COM_CONTENT_N_ITEMS_DELETED="%s articles deleted."
COM_CONTENT_N_ITEMS_DELETED_1="%s article deleted."
COM_CONTENT_N_ITEMS_FEATURED="%s articles featured."
COM_CONTENT_N_ITEMS_FEATURED_1="%s article featured."
COM_CONTENT_N_ITEMS_PUBLISHED="%s articles published."
COM_CONTENT_N_ITEMS_PUBLISHED_1="%s article published."
COM_CONTENT_N_ITEMS_TRASHED="%s articles trashed."
COM_CONTENT_N_ITEMS_TRASHED_1="%s article trashed."
COM_CONTENT_N_ITEMS_UNFEATURED="%s articles unfeatured."
COM_CONTENT_N_ITEMS_UNFEATURED_1="%s article unfeatured."
COM_CONTENT_N_ITEMS_UNPUBLISHED="%s articles unpublished."
COM_CONTENT_N_ITEMS_UNPUBLISHED_1="%s article unpublished."
COM_CONTENT_NEW_ARTICLE="New Article"
COM_CONTENT_NO_ARTICLES_DESC="If Show, the message 'There are no articles in this category' will display when there are no articles in the category or when 'Empty Categories' is set to show."
COM_CONTENT_NO_ARTICLES_LABEL="No Articles Message"
COM_CONTENT_NO_ITEM_SELECTED="Please first make a selection from the list."
COM_CONTENT_NONE="None"
COM_CONTENT_NUMBER_CATEGORY_ITEMS_DESC="If Show, the number of articles in the category will show."
COM_CONTENT_NUMBER_CATEGORY_ITEMS_LABEL="# Articles in Category"
COM_CONTENT_PAGE_ADD_ARTICLE="Articles: New"
COM_CONTENT_PAGE_EDIT_ARTICLE="Articles: Edit"
COM_CONTENT_PAGE_VIEW_ARTICLE="Articles: View"
COM_CONTENT_PAGEBREAK_DOC_TITLE="Page Break"
COM_CONTENT_PAGEBREAK_INSERT_BUTTON="Insert Page Break"
COM_CONTENT_PAGEBREAK_TITLE="Page Title:"
COM_CONTENT_PAGEBREAK_TOC="Table of Contents Alias:"
COM_CONTENT_PUBLISH_DOWN_ASC="Finish Publishing ascending"
COM_CONTENT_PUBLISH_DOWN_DESC="Finish Publishing descending"
COM_CONTENT_PUBLISH_UP_ASC="Start Publishing ascending"
COM_CONTENT_PUBLISH_UP_DESC="Start Publishing descending"
COM_CONTENT_RIGHT="Right"
COM_CONTENT_SAVE_SUCCESS="Article saved."
COM_CONTENT_SAVE_WARNING="Alias already existed so a number was added at the end. You can re-edit the article to customise the alias."
COM_CONTENT_SELECT_AN_ARTICLE="Select an Article"
COM_CONTENT_SHARED_DESC="These settings apply for Shared Options in List, Blog and Featured unless they are changed by the menu settings."
COM_CONTENT_SHARED_LABEL="Shared"
COM_CONTENT_SHOW_ARTICLE_OPTIONS_DESC="Show or hide the article options tab in the Backend article edit view. These options allow overriding of the global options."
COM_CONTENT_SHOW_ARTICLE_OPTIONS_LABEL="Show Article Options"
COM_CONTENT_SHOW_EMPTY_CATEGORIES_DESC="If Show, empty categories will display. A category is only empty if it has no articles or subcategories."
COM_CONTENT_SHOW_IMAGES_URLS_BACK_DESC="Show or hide fields to insert images and links in the Administrator."
COM_CONTENT_SHOW_IMAGES_URLS_BACK_LABEL="Administrator Images and Links"
COM_CONTENT_SHOW_IMAGES_URLS_FRONT_DESC="Show or hide fields to insert images and links when Frontend editing."
COM_CONTENT_SHOW_IMAGES_URLS_FRONT_LABEL="Frontend Images and Links"
COM_CONTENT_SHOW_PUBLISHING_OPTIONS_DESC="Show or hide the publishing options tab in the article edit view. These options allow changes in dates and author identities."
COM_CONTENT_SHOW_PUBLISHING_OPTIONS_LABEL="Show Publishing Options"
COM_CONTENT_SLIDER_EDITOR_CONFIG="Configure Edit Screen"
COM_CONTENT_SUBMENU_CATEGORIES="Categories"
COM_CONTENT_SUBMENU_FEATURED="Featured Articles"
COM_CONTENT_TIP_ASSOCIATION="Associated articles"
COM_CONTENT_TOGGLE_TO_FEATURE="Toggle to change article state to 'Featured'"
COM_CONTENT_TOGGLE_TO_UNFEATURE="Toggle to change article state to 'Unfeatured'"
COM_CONTENT_UNFEATURED="Unfeatured Article"
COM_CONTENT_URL_FIELD_BROWSERNAV_LABEL="URL Target Window"
COM_CONTENT_URL_FIELD_BROWSERNAV_DESC="Target browser window when the link is selected."
COM_CONTENT_URL_FIELD_A_BROWSERNAV_LABEL="URL A Target Window"
COM_CONTENT_URL_FIELD_B_BROWSERNAV_LABEL="URL B Target Window"
COM_CONTENT_URL_FIELD_C_BROWSERNAV_LABEL="URL C Target Window"
COM_CONTENT_WARNING_PROVIDE_VALID_NAME="Please provide a valid, non-blank title."
COM_CONTENT_XML_DESCRIPTION="Article management component."

JGLOBAL_NO_ITEM_SELECTED="No articles selected"
JLIB_APPLICATION_ERROR_BATCH_CANNOT_CREATE="You are not allowed to create new articles in this category."
JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT="You are not allowed to edit one or more of these articles."

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_CONTENT="Changes apply to this component only.<br /><em><strong>Inherited</strong></em> - a Global Configuration setting or higher level setting is applied.<br /><em><strong>Denied</strong></em> always wins - whatever is set at the Global or higher level and applies to all child elements.<br /><em><strong>Allowed</strong></em> will enable the action for this component unless overruled by a Global Configuration setting."
JLIB_RULES_SETTING_NOTES_ITEM_COM_CONTENT_ARTICLE="Changes apply to this article only.<br /><em><strong>Inherited</strong></em> - a Global Configuration setting or higher level setting is applied.<br /><em><strong>Denied</strong></em> always wins - whatever is set at the Global or higher level and applies to all child elements.<br /><em><strong>Allowed</strong></em> will enable the action for this component unless overruled by a Global Configuration setting."

; Fields overrides
COM_CONTENT_ARTICLE_CATEGORIES_TITLE="Articles: Field Groups"
COM_CONTENT_ARTICLE_CATEGORY_ADD_TITLE="Articles: New Field Group"
COM_CONTENT_ARTICLE_CATEGORY_EDIT_TITLE="Articles: Edit Field Group"
language/en-GB/en-GB.mod_menu.sys.ini000060400000000532152453623440013233 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_MENU="Administrator Menu"
MOD_MENU_XML_DESCRIPTION="This module displays an administrator menu module."
MOD_MENU_LAYOUT_DEFAULT="Default"

language/en-GB/en-GB.plg_system_languagecode.ini000060400000001641152453623440015501 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_LANGUAGECODE="System - Language Code"
PLG_SYSTEM_LANGUAGECODE_FIELD_DESC="Changes the language code used for the <em>%s</em> language."
PLG_SYSTEM_LANGUAGECODE_FIELDSET_DESC="Changes the language code for the generated HTML document. Example usage: You have installed the fr-FR language pack and want the Search Engines to recognise the page as aimed at French-speaking Canada. Add the tag 'fr-CA' to the corresponding field for 'fr-FR' to resolve this."
PLG_SYSTEM_LANGUAGECODE_FIELDSET_LABEL="Language Codes"
PLG_SYSTEM_LANGUAGECODE_XML_DESCRIPTION="Provides the ability to change the language code in the generated HTML document to improve SEO.<br />The fields will appear when the plugin is enabled and saved."
language/en-GB/en-GB.com_icagenda.sys.ini000060400000007756152453623440014040 0ustar00; iCagenda
; Copyright (c)2012-2015 Cyril Rezé (Lyr!C) / JoomliC.com - All rights reserved.
; License GNU General Public License version 3 or later <http://www.gnu.org/licenses/gpl.html>
; Note : All ini files need to be saved as UTF-8 - No BOM
;
; ADMIN					: com_icagenda.sys.ini
; Translation Platform	: https://www.transifex.com/projects/p/icagenda/


; Install
ICAGENDA = " iCagenda"
COM_ICAGENDA_INSTALL_THIS_RELEASE = "Installing component manifest file version : "
COM_ICAGENDA_INSTALL_CACHE_VERSION = "Current manifest cache component version : "
COM_ICAGENDA_INSTALL_MINIMUM_JOOMLA_VERSION = "Installing component manifest file minimum Joomla version : "
COM_ICAGENDA_INSTALL_CURRENT_JOOMLA_VERSION = "Current Joomla version : "
COM_ICAGENDA_INSTALL_ERROR_JOOMLA_VERSION = "<b>ERROR</b> : Cannot install com_icagenda in a Joomla release prior to "
COM_ICAGENDA_INSTALL_INCORRECT_VERSION = "Incorrect version sequence. Cannot upgrade "
COM_ICAGENDA_PREFLIGHT_ = "preflight "
COM_ICAGENDA_WELCOME_1 = "First installation of <b>iCagenda</b> v "
COM_ICAGENDA_WELCOME_2 = " successfully completed!<br/>"
COM_ICAGENDA_WELCOME_3 = "Welcome !!!<br/>"
COM_ICAGENDA_INSTALL = "First installation on your website of iCagenda - v "
COM_ICAGENDA_UPDATE = "updated to "
COM_ICAGENDA_POSTFLIGHT= "postflight "
COM_ICAGENDA_UNINSTALL = "Successful uninstallation.<br/>Thank you for using <b>iCagenda</b>. Hoping to see you soon!<br/><br/><i><b><span style='font-size: 11px'>Jooml!C &#8226; iCagenda &#8226; <a href='http://www.joomlic.com' target='_blank'>www.joomlic.com</a></span></b></i>"
COM_ICAGENDA_TO = " to "
COM_ICAGENDA_VIDEO_GETTING_STARTED = "Getting Started with iCagenda"
COM_ICAGENDA_VIDEO_TUTORIALS = "Video Tutorials"
COM_ICAGENDA_FOLDER_CREATION = "Folder Creation"
COM_ICAGENDA_FOLDER = "Folder"
COM_ICAGENDA_CREATED = "created!"
COM_ICAGENDA_CREATION_FAILED = "creation failed!"
COM_ICAGENDA_PLEASE_CREATE_MANUALLY = "Please create it manually."
COM_ICAGENDA_EXISTS = "exists!"

; Install details of iCagenda features
COM_ICAGENDA_FEATURES_LANGUAGES = "Languages included:"
COM_ICAGENDA_FEATURES_TRANSLATION_PACKS = "Translation Packs :"
COM_ICAGENDA_FEATURES_BACKEND = "<b>Back-End :</b> Category management, creation of events, registration management, newsletter, Theme Pack manager..."
COM_ICAGENDA_FEATURES_FRONTEND = "<b>Front-End :</b> List of Events, Event details view, Submit an Event, Register to events, sharing on social networks, GoogleMaps, choice of theme..."

; iCagenda
COM_ICAGENDA = "iCagenda"
COM_ICAGENDA_MENU = " <i class='icon-calendar-3'></i> <b>!Cagenda</b>"
COM_ICAGENDA_XML_DESCRIPTION = "Events Management Extension for Joomla!"
COM_ICAGENDA_DESC = "<i><b><span style='font-size: 11px'>Jooml!C &#8226; iCagenda &#8226; <a href='http://www.joomlic.com' target='_blank'>www.joomlic.com</a></span></b></i>"
COM_ICAGENDA_TITLE_ICAGENDA = "<i class='icon-home-2'></i> Control Panel"
COM_ICAGENDA_CATEGORIES = "Categories"
COM_ICAGENDA_MENU_CATEGORIES = "<i class='icon-folder-3'></i> Categories"
COM_ICAGENDA_CATEGORY_ADD = "Add new category"
COM_ICAGENDA_EVENTS = "<i class='icon-calendar-3'></i> Events"
COM_ICAGENDA_EVENT_ADD = "Add new event"
COM_ICAGENDA_REGISTRATION = "<i class='icon-signup'></i> Registrations"
COM_ICAGENDA_MENU_CUSTOMFIELDS = "<i class='icon-list-2'></i> Custom Fields"
COM_ICAGENDA_MENU_FEATURES = "<i class='icon-checkbox'></i> Features"
COM_ICAGENDA_MAIL = "<i class='icon-envelope-opened'></i> Newsletter"
COM_ICAGENDA_LOCATIONS = "Locations"
COM_ICAGENDA_INFO = "<i class='icon-info-2'></i> Info"
COM_ICAGENDA_THEMES = "<i class='icon-palette'></i> Themes"

; view
COM_ICAGENDA_SUBMIT_VIEW_DEFAULT_TITLE = "Submit an Event"
COM_ICAGENDA_SUBMIT_VIEW_DEFAULT_DESC = "Display a form to submit an event in the frontend"
COM_ICAGENDA_LIST_VIEW_DEFAULT_TITLE = "List of events"
COM_ICAGENDA_LIST_VIEW_DEFAULT_DESC = "Displays a list of events, future and/or past, filtered (optional) by category, etc ..."
COM_ICAGENDA_LIST_VIEW_SEARCH_TITLE = "Search"
COM_ICAGENDA_LIST_VIEW_SEARCH_DESC = "Display a search page"
language/en-GB/en-GB.com_categories.ini000060400000016075152453623440013607 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

CATEGORIES_FIELDSET_OPTIONS="Options"
COM_CATEGORIES="Categories"
COM_CATEGORIES_ACCESS_CREATE_DESC="New setting for <strong>create actions</strong> in this category and the calculated setting based on the parent category and group permissions."
COM_CATEGORIES_ACCESS_DELETE_DESC="New setting for <strong>delete actions</strong> on this category and the calculated setting based on the parent category and group permissions."
COM_CATEGORIES_ACCESS_EDIT_DESC="New setting for <strong>edit actions</strong> on this category and the calculated setting based on the parent category and group permissions."
COM_CATEGORIES_ACCESS_EDITOWN_DESC="New setting for <strong>edit own actions</strong> on this category and the calculated setting based on the parent category and group permissions."
COM_CATEGORIES_ACCESS_EDITSTATE_DESC="New setting for <strong>edit state actions</strong> on this category and the calculated setting based on the parent category and group permissions."
COM_CATEGORIES_BASIC_FIELDSET_LABEL="Options"
COM_CATEGORIES_BATCH_CANNOT_CREATE="You are not allowed to create new categories in this category."
COM_CATEGORIES_BATCH_CANNOT_EDIT="You are not allowed to edit one or more of these categories."
; COM_CATEGORIES_BATCH_CATEGORY_LABEL is deprecated, use JLIB_HTML_BATCH_MENU_LABEL instead.
COM_CATEGORIES_BATCH_CATEGORY_LABEL="To Move or Copy your selection please select a Category."
COM_CATEGORIES_BATCH_OPTIONS="Batch process the selected categories."
COM_CATEGORIES_BATCH_TIP="If a category is selected for move/copy, any actions selected will be applied to the copied or moved categories. Otherwise, all actions are applied to the selected categories."
COM_CATEGORIES_CATEGORIES_BASE_TITLE="Categories"
COM_CATEGORIES_CATEGORIES_TITLE="%s: Categories"
COM_CATEGORIES_CATEGORY_ADD_TITLE="%s: New Category"
COM_CATEGORIES_CATEGORY_BASE_ADD_TITLE="Categories: New Category"
COM_CATEGORIES_CATEGORY_BASE_EDIT_TITLE="Categories: Edit Category"
COM_CATEGORIES_CATEGORY_EDIT_TITLE="%s: Edit Category"
COM_CATEGORIES_CATEGORY_OPTIONS="Category"
COM_CATEGORIES_CHANGE_CATEGORY="Select or Change Category"
COM_CATEGORIES_DELETE_NOT_ALLOWED="Delete not allowed for category %s."
COM_CATEGORIES_DESCRIPTION_DESC="Enter an optional category description in the text area."
COM_CATEGORIES_EDIT_CATEGORY="Edit Category"
COM_CATEGORIES_ERROR_ALL_LANGUAGE_ASSOCIATED="A category item set to All languages can't be associated. Associations have not been set."
COM_CATEGORIES_FIELD_BASIC_LABEL="Options"
COM_CATEGORIES_FIELD_HITS_DESC="Number of hits for this category."
COM_CATEGORIES_FIELD_IMAGE_ALT_LABEL="Alt Text"
COM_CATEGORIES_FIELD_IMAGE_ALT_DESC="Alternative text used for visitors without access to images."
COM_CATEGORIES_FIELD_IMAGE_DESC="Select or upload an image for this category."
COM_CATEGORIES_FIELD_IMAGE_LABEL="Image"
COM_CATEGORIES_FIELD_LANGUAGE_DESC="Assign a language to this category."
COM_CATEGORIES_FIELD_NOTE_DESC="An optional note to display in the category list."
COM_CATEGORIES_FIELD_NOTE_LABEL="Note"
COM_CATEGORIES_FIELD_PARENT_DESC="Select a parent category."
COM_CATEGORIES_FIELD_PARENT_LABEL="Parent"
COM_CATEGORIES_FIELDSET_DETAILS="Category Details"
COM_CATEGORIES_FIELDSET_PUBLISHING="Publishing"
COM_CATEGORIES_FIELDSET_RULES="Permissions"
COM_CATEGORIES_FILTER_SEARCH_DESC="Search in title, alias and note. Prefix with ID: to search for a category ID."
COM_CATEGORIES_FILTER_SEARCH_LABEL="Search Categories"
COM_CATEGORIES_HAS_SUBCATEGORY_ITEMS="%d items are assigned to this category's subcategories."
COM_CATEGORIES_HAS_SUBCATEGORY_ITEMS_1="%d item is assigned to one of this category's subcategories."
; The following 2 strings are deprecated and will be removed with 4.0.
COM_CATEGORIES_ITEM_ASSOCIATIONS_FIELDSET_LABEL="Category Item Associations"
COM_CATEGORIES_ITEM_ASSOCIATIONS_FIELDSET_DESC="Multilingual only! This choice will only display if the Language Filter parameter 'Item Associations' is set to 'Yes'. Choose a category item for the target language. This association will let the Language Switcher module redirect to the associated category item in another language. If used, make sure to display the Language switcher module on the relevant pages. A category item set to language 'All' can't be associated."
COM_CATEGORIES_ITEMS_SEARCH_FILTER="Search"
COM_CATEGORIES_N_ITEMS_ARCHIVED="%d categories archived."
COM_CATEGORIES_N_ITEMS_ARCHIVED_1="%d category archived."
COM_CATEGORIES_N_ITEMS_ASSIGNED="%d items are assigned to this category."
COM_CATEGORIES_N_ITEMS_ASSIGNED_1="%d item is assigned to this category."
COM_CATEGORIES_N_ITEMS_CHECKED_IN_0="No category checked in."
COM_CATEGORIES_N_ITEMS_CHECKED_IN_1="%d category checked in."
COM_CATEGORIES_N_ITEMS_CHECKED_IN_MORE="%d categories checked in."
COM_CATEGORIES_N_ITEMS_DELETED="%d categories deleted."
COM_CATEGORIES_N_ITEMS_DELETED_1="%d category deleted."
COM_CATEGORIES_N_ITEMS_FAILED_PUBLISHING="Failed publishing %d categories as at least one of their parents is unpublished or one of their children is checked out."
COM_CATEGORIES_N_ITEMS_FAILED_PUBLISHING_1="Failed publishing %d category as at least one of its parents is unpublished or one of its children is checked out."
COM_CATEGORIES_N_ITEMS_PUBLISHED="%d categories published."
COM_CATEGORIES_N_ITEMS_PUBLISHED_1="%d category published."
COM_CATEGORIES_N_ITEMS_TRASHED="%d categories trashed."
COM_CATEGORIES_N_ITEMS_TRASHED_1="%d category trashed."
COM_CATEGORIES_N_ITEMS_UNPUBLISHED="%d categories unpublished."
COM_CATEGORIES_N_ITEMS_UNPUBLISHED_1="%d category unpublished."
COM_CATEGORIES_NEW_CATEGORY="New Category"
COM_CATEGORIES_NO_ITEM_SELECTED="Please first make a selection from the list."
COM_CATEGORIES_PATH_LABEL="Category Path"
COM_CATEGORIES_REBUILD_FAILURE="Failed rebuilding Categories tree data."
COM_CATEGORIES_REBUILD_SUCCESS="Categories tree data rebuilt."
COM_CATEGORIES_SAVE_SUCCESS="Category saved."
COM_CATEGORIES_SELECT_A_CATEGORY="Select a Category"
COM_CATEGORIES_TIP_ASSOCIATION="Associated categories"
COM_CATEGORIES_XML_DESCRIPTION="This component manages categories."
COM_CATEGORY_COUNT_ARCHIVED_ITEMS="Archived items"
COM_CATEGORY_COUNT_PUBLISHED_ITEMS="Published items"
COM_CATEGORY_COUNT_TRASHED_ITEMS="Trashed items"
COM_CATEGORY_COUNT_UNPUBLISHED_ITEMS="Unpublished items"
COM_CATEGORY_HEADING_ASSOCIATION="Association"
JGLOBAL_NO_ITEM_SELECTED="No categories selected."
JLIB_HTML_ACCESS_SUMMARY_DESC="Shown below is an overview of the permission settings for this category. Select the tabs above to customise these settings by action."
JLIB_RULES_SETTING_NOTES_ITEM="Changes apply to this category and all child categories.<br /><em><strong>Inherited</strong></em> - a Global Configuration setting or higher level setting is applied.<br /><em><strong>Denied</strong></em> always wins - whatever is set at the Global or higher level and applies to all child elements.<br /><em><strong>Allowed</strong></em> will enable the action for this component unless overruled by a Global Configuration setting."
language/en-GB/en-GB.plg_user_contactcreator.ini000060400000002254152453623440015531 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CONTACTCREATOR_ERR_FAILED_CREATING_CONTACT="Automatic contact creation failed. Please contact a site administrator."
PLG_CONTACTCREATOR_ERR_NO_CATEGORY="Contact automatic creation failed because contact category is not set!"
PLG_CONTACTCREATOR_FIELD_AUTOMATIC_WEBPAGE_DESC="A formatted string to automatically generate a contact's web page. [name] is replaced with the name, [username] is replaced with the username, [userid] is replaced with the user ID and [email] is replaced with the email."
PLG_CONTACTCREATOR_FIELD_AUTOMATIC_WEBPAGE_LABEL="Automatic Webpage"
PLG_CONTACTCREATOR_FIELD_AUTOPUBLISH_DESC="Optionally have the contact default to published or unpublished."
PLG_CONTACTCREATOR_FIELD_AUTOPUBLISH_LABEL="Automatically Publish the Contact"
PLG_CONTACTCREATOR_FIELD_CATEGORY_DESC="Category to assign contacts to by default."
PLG_CONTACTCREATOR_XML_DESCRIPTION="Plugin to automatically create contact information for new users."
PLG_USER_CONTACTCREATOR="User - Contact Creator"
language/en-GB/en-GB.com_users.ini000060400000066707152453623440012632 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_USERS="Users"
COM_USERS_ACTIONS_AVAILABLE="Actions Permitted"
COM_USERS_ACTIVATED="Activated"
COM_USERS_ADD_NOTE="Add a Note"
COM_USERS_ASSIGNED_GROUPS="Assigned User Groups"
COM_USERS_BATCH_ADD="Add To Group"
COM_USERS_BATCH_DELETE="Delete From Group"
COM_USERS_BATCH_GROUP="Select Group"
COM_USERS_BATCH_OPTIONS="Batch process the selected users"
COM_USERS_BATCH_SET="Set To Group"
COM_USERS_CATEGORIES_TITLE="User Notes: Categories"
COM_USERS_CATEGORY_HEADING="Category"
COM_USERS_CONFIG_DOMAIN_OPTIONS="Email Domain Options"
COM_USERS_CONFIG_FIELD_ALLOWREGISTRATION_DESC="If set to Yes, new Users are allowed to self-register."
COM_USERS_CONFIG_FIELD_ALLOWREGISTRATION_LABEL="Allow User Registration"
COM_USERS_CONFIG_FIELD_CAPTCHA_DESC="Select the captcha plugin that will be used in the registration, password and username reminder forms. You may need to enter required information for your captcha plugin in the Plugin Manager.<br />If 'Use Global' is selected, make sure a captcha plugin is selected in Global Configuration."
COM_USERS_CONFIG_FIELD_CAPTCHA_LABEL="Captcha"
COM_USERS_CONFIG_FIELD_CHANGEUSERNAME_DESC="Allow users to change their Username when editing their profile."
COM_USERS_CONFIG_FIELD_CHANGEUSERNAME_LABEL="Change Username"
COM_USERS_CONFIG_FIELD_DOMAIN_NAME_DESC="Enter a domain name. Wildcards (*) are supported. For example:<br /><strong>*</strong> allows or disallows all domains;<br /><strong>*.com</strong> allows or disallows all .com domains;<br /><strong>*.joomla.org</strong> allows or disallows all joomla.org subdomains."
COM_USERS_CONFIG_FIELD_DOMAIN_NAME_LABEL="Domain Name"
COM_USERS_CONFIG_FIELD_DOMAIN_RULE_DESC="Select whether to allow or disallow the domain."
COM_USERS_CONFIG_FIELD_DOMAIN_RULE_LABEL="Rule"
COM_USERS_CONFIG_FIELD_DOMAIN_RULE_OPTION_ALLOW="Allow"
COM_USERS_CONFIG_FIELD_DOMAIN_RULE_OPTION_DISALLOW="Disallow"
COM_USERS_CONFIG_FIELD_DOMAINS_DESC="Enter a list of allowed and disallowed email domains. By default, all domains are allowed."
COM_USERS_CONFIG_FIELD_DOMAINS_LABEL="Email Domains"
COM_USERS_CONFIG_FIELD_FRONTEND_LANG_DESC="If 'Frontend User Parameters' is set to 'Show', users will be able to select their Frontend language preference when registering."
COM_USERS_CONFIG_FIELD_FRONTEND_LANG_LABEL="Frontend Language"
COM_USERS_CONFIG_FIELD_FRONTEND_RESET_COUNT_DESC="The maximum number of password resets allowed within the time period. Zero indicates no limit."
COM_USERS_CONFIG_FIELD_FRONTEND_RESET_COUNT_LABEL="Maximum Reset Count"
COM_USERS_CONFIG_FIELD_FRONTEND_RESET_TIME_DESC="The time period, in hours, for the reset counter."
COM_USERS_CONFIG_FIELD_FRONTEND_RESET_TIME_LABEL="Reset Time"
COM_USERS_CONFIG_FIELD_FRONTEND_USERPARAMS_DESC="If set to Show, Users will be able to select their language, editor and Help Site preferences on their details screen when logged-in to the Frontend."
COM_USERS_CONFIG_FIELD_FRONTEND_USERPARAMS_LABEL="Frontend User Parameters"
COM_USERS_CONFIG_FIELD_GUEST_USER_GROUP_DESC="The default Group that will be applied to Guest (not logged-in) Users."
COM_USERS_CONFIG_FIELD_GUEST_USER_GROUP_LABEL="Guest User Group"
COM_USERS_CONFIG_FIELD_MAILBODY_SUFFIX_DESC="This is added after the mail text."
COM_USERS_CONFIG_FIELD_MAILBODY_SUFFIX_LABEL="Mailbody Suffix"
COM_USERS_CONFIG_FIELD_MAILTOADMIN_DESC="If set to Yes then a notification mail will be sent to administrators if 'New User Account Activation' is set to 'None' or 'Self'."
COM_USERS_CONFIG_FIELD_MAILTOADMIN_LABEL="Send Mail to Administrators"
COM_USERS_CONFIG_FIELD_MINIMUM_INTEGERS="Minimum Integers"
COM_USERS_CONFIG_FIELD_MINIMUM_INTEGERS_DESC="Set the minimum number of integers that must be included in a password."
COM_USERS_CONFIG_FIELD_MINIMUM_LOWERCASE="Minimum Lower Case"
COM_USERS_CONFIG_FIELD_MINIMUM_LOWERCASE_DESC="Set the minimum number of lower case alphabetical characters required for a password."
COM_USERS_CONFIG_FIELD_MINIMUM_PASSWORD_LENGTH="Minimum Length"
COM_USERS_CONFIG_FIELD_MINIMUM_PASSWORD_LENGTH_DESC="Set the minimum length for a password."
COM_USERS_CONFIG_FIELD_MINIMUM_SYMBOLS="Minimum Symbols"
COM_USERS_CONFIG_FIELD_MINIMUM_SYMBOLS_DESC="Set the minimum number of symbols (such as !@#$) required in a password."
COM_USERS_CONFIG_FIELD_MINIMUM_UPPERCASE="Minimum Upper Case"
COM_USERS_CONFIG_FIELD_MINIMUM_UPPERCASE_DESC="Set the minimum number of upper case alphabetical characters required for a password."
COM_USERS_CONFIG_FIELD_NEW_USER_TYPE_DESC="The default group that will be applied to New Users Registering via the Frontend."
COM_USERS_CONFIG_FIELD_NEW_USER_TYPE_LABEL="New User Registration Group"
COM_USERS_CONFIG_FIELD_NOTES_HISTORY="User Notes History"
COM_USERS_CONFIG_FIELD_SENDPASSWORD_LABEL="Send Password"
COM_USERS_CONFIG_FIELD_SENDPASSWORD_DESC="If set to Yes the user's first password will be emailed to the user as part of the registration mail."
COM_USERS_CONFIG_FIELD_SUBJECT_PREFIX_DESC="This is added in front of each mail subject."
COM_USERS_CONFIG_FIELD_SUBJECT_PREFIX_LABEL="Subject Prefix"
COM_USERS_CONFIG_FIELD_USERACTIVATION_DESC="If set to None the user will be registered immediately. If set to Self the User will be emailed a link to activate their account before they can log in. If set to Administrator the user will be emailed a link to verify their email address and then all users set to receive system emails and who have the permission to create users will be notified to activate the user's account."
COM_USERS_CONFIG_FIELD_USERACTIVATION_LABEL="New User Account Activation"
COM_USERS_CONFIG_FIELD_USERACTIVATION_OPTION_ADMINACTIVATION="Administrator"
COM_USERS_CONFIG_FIELD_USERACTIVATION_OPTION_SELFACTIVATION="Self"
COM_USERS_CONFIG_IMPORT_FAILED="An error was encountered while importing the configuration: %s."
COM_USERS_CONFIG_INTEGRATION_SETTINGS_DESC="These settings determine how the Users Component will integrate with other extensions."
COM_USERS_CONFIG_PASSWORD_OPTIONS="Password Options"
COM_USERS_CONFIG_SAVE_FAILED="An error was encountered while saving the configuration: %s."
COM_USERS_CONFIG_USER_OPTIONS="User Options"
COM_USERS_CONFIGURATION="Users: Options"
COM_USERS_COUNT_ENABLED_USERS="Enabled Users"
COM_USERS_COUNT_DISABLED_USERS="Disabled Users"
COM_USERS_DEBUG_DESC="Display the Advanced Permission Reports."
COM_USERS_DEBUG_EXPLICIT_ALLOW="Allowed"
COM_USERS_DEBUG_EXPLICIT_DENY="Forbidden"
COM_USERS_DEBUG_GROUP="Advanced Permissions Report"
COM_USERS_DEBUG_GROUPS_LABEL="Advanced Groups Permissions"
COM_USERS_DEBUG_GROUPS_DESC="Display the Advanced Groups Permissions Reports."
COM_USERS_DEBUG_IMPLICIT_DENY="Not Allowed"
COM_USERS_DEBUG_LABEL="Advanced"
COM_USERS_DEBUG_LEGEND="Legend:"
COM_USERS_DEBUG_USER="Advanced Permissions Report"
COM_USERS_DEBUG_USERS_LABEL="Advanced Users Permissions"
COM_USERS_DEBUG_USERS_DESC="Display the Advanced Users Permissions Reports."
COM_USERS_DELETE_ERROR_INVALID_GROUP="You can't delete user groups to which you belong."
COM_USERS_DESIRED_PASSWORD="Enter your desired password."
COM_USERS_EDIT_NOTE="Edit Note"
COM_USERS_EDIT_NOTE_N="Editing note with ID #%d"
COM_USERS_EDIT_USER="Edit User %s"
COM_USERS_EMPTY_REVIEW="-"
COM_USERS_EMPTY_SUBJECT="- No subject -"
COM_USERS_ERROR_CANNOT_BATCH_SUPERUSER="A non-Super User can't perform batch operations on Super Users."
COM_USERS_ERROR_INVALID_GROUP="Invalid Group"
COM_USERS_ERROR_LEVELS_NOLEVELS_SELECTED="No View Permission Level(s) selected."
COM_USERS_ERROR_NO_ADDITIONS="The selected user(s) are already assigned to the selected group."
COM_USERS_ERROR_VIEW_LEVEL_IN_USE="You can't delete the view access level '%d:%s' because it is being used by content."
COM_USERS_ERROR_SECRET_CODE_WITHOUT_TFA="You have entered a Secret Code but two factor authentication is not enabled in your user account. If you want to use a secret code to secure your login please edit your user profile and enable two factor authentication."
COM_USERS_FIELD_CATEGORY_ID_LABEL="Category"
COM_USERS_FIELD_ID_LABEL="ID"
COM_USERS_FIELD_LOGIN_MENUITEM="Menu Item"
COM_USERS_FIELD_LOGIN_REDIRECT_PLACEHOLDER="index.php?Itemid=999&lang=en-GB"
COM_USERS_FIELD_LOGIN_REDIRECT_CHOICE_DESC="'Internal URL' lets you manually enter any internal URL in the Redirect field. 'Menu Item' lets you directly select an existing menu item.<br />For a multilingual site, it is recommended to use 'Menu Item'."
COM_USERS_FIELD_LOGIN_REDIRECT_CHOICE_LABEL="Choose Login Redirect Type"
COM_USERS_FIELD_LOGIN_REDIRECT_ERROR="Only one of the login redirect fields should have a value."
COM_USERS_FIELD_LOGIN_REDIRECTMENU_DESC="Select or create the page the user will be redirected to after a successful login. The default is to stay on the same page."
COM_USERS_FIELD_LOGIN_REDIRECTMENU_LABEL="Menu Item Login Redirect"
COM_USERS_FIELD_LOGIN_URL="Internal URL"
COM_USERS_FIELD_LOGOUT_REDIRECT_CHOICE_DESC="'Internal URL' lets you manually enter any internal URL in the Redirect field. 'Menu Item' lets you directly select an existing menu item.<br />For a multilingual site, it is recommended to use 'Menu Item'."
COM_USERS_FIELD_LOGOUT_REDIRECT_CHOICE_LABEL="Choose Logout Redirect Type"
COM_USERS_FIELD_LOGOUT_REDIRECT_ERROR="Only one of the logout redirect fields should have a value."
COM_USERS_FIELD_LOGOUT_REDIRECTMENU_DESC="Select or create the page the user will be redirected to after ending their current session by logging out. The default is to stay on the same page."
COM_USERS_FIELD_LOGOUT_REDIRECTMENU_LABEL="Menu Item Logout Redirect"
COM_USERS_FIELD_NOTEBODY_DESC="Note"
COM_USERS_FIELD_NOTEBODY_LABEL="Note"
COM_USERS_FIELD_REVIEW_TIME_DESC="Review Date is a manually entered date you can use as fits in your workflow. Examples would be to put in a date when you want to review a user or the last date you reviewed the user."
COM_USERS_FIELD_REVIEW_TIME_LABEL="Review Date"
COM_USERS_FIELD_STATE_DESC="Set publication status."
COM_USERS_FIELD_SUBJECT_DESC="The subject line for the note."
COM_USERS_FIELD_SUBJECT_LABEL="Subject"
COM_USERS_FIELD_USER_ID_LABEL="User"
COM_USERS_FIELDS_USER_FIELDS_TITLE="Users: Fields"
COM_USERS_FIELDS_USER_FIELD_ADD_TITLE="Users: New Field"
COM_USERS_FIELDS_USER_FIELD_EDIT_TITLE="Users: Edit Field"
COM_USERS_FILTER_ACTIVE="- Select Active State -"
COM_USERS_FILTER_COMPONENT_LABEL="Component"
COM_USERS_FILTER_COMPONENT_DESC="Component to debug."
COM_USERS_FILTER_LABEL="Filter Users by:&#160;"
COM_USERS_FILTER_LEVEL_END_LABEL="Level End"
COM_USERS_FILTER_LEVEL_END_DESC="Asset end level."
COM_USERS_FILTER_LEVEL_START_LABEL="Level Start"
COM_USERS_FILTER_LEVEL_START_DESC="Asset start level."
COM_USERS_FILTER_NOTES="Show notes list for this user"
COM_USERS_FILTER_STATE="- Select State -"
COM_USERS_FILTER_USER_GROUP="Filter User Group"
COM_USERS_FILTER_USERGROUP="- Select Group -"
COM_USERS_GROUP_FIELD_PARENT_DESC="Choose a Parent for this Group."
COM_USERS_GROUP_FIELD_PARENT_LABEL="Group Parent"
COM_USERS_GROUP_FIELD_TITLE_DESC="Enter a Title for the Group."
COM_USERS_GROUP_FIELD_TITLE_LABEL="Group Title"
COM_USERS_GROUP_SAVE_SUCCESS="Group saved."
COM_USERS_GROUPS_CONFIRM_DELETE="Are you sure you wish to delete groups that have users?"
COM_USERS_GROUPS_N_ITEMS_DELETED="%d User Groups deleted."
COM_USERS_GROUPS_N_ITEMS_DELETED_1="1 User Group deleted."
COM_USERS_GROUPS_NO_ITEM_SELECTED="No User Groups selected."
COM_USERS_HEADING_ACTIVATED="Activated"
COM_USERS_HEADING_ACTIVATED_ASC="Activated ascending"
COM_USERS_HEADING_ACTIVATED_DESC="Activated descending"
COM_USERS_HEADING_ASSET_NAME="Asset Name"
COM_USERS_HEADING_ASSET_NAME_ASC="Asset Name ascending"
COM_USERS_HEADING_ASSET_NAME_DESC="Asset Name descending"
COM_USERS_HEADING_ASSET_TITLE="Asset Title"
COM_USERS_HEADING_ASSET_TITLE_ASC="Asset Title ascending"
COM_USERS_HEADING_ASSET_TITLE_DESC="Asset Title descending"
COM_USERS_HEADING_CATEGORY="Category"
COM_USERS_HEADING_CATEGORY_ASC="Category ascending"
COM_USERS_HEADING_CATEGORY_DESC="Category descending"
COM_USERS_HEADING_EMAIL_ASC="Email ascending"
COM_USERS_HEADING_EMAIL_DESC="Email descending"
COM_USERS_HEADING_ENABLED="Enabled"
COM_USERS_HEADING_ENABLED_ASC="Enabled ascending"
COM_USERS_HEADING_ENABLED_DESC="Enabled descending"
COM_USERS_HEADING_GROUP_TITLE="Group Title"
COM_USERS_HEADING_GROUP_TITLE_ASC="Group Title ascending"
COM_USERS_HEADING_GROUP_TITLE_DESC="Group Title descending"
COM_USERS_HEADING_GROUPS="User Groups"
COM_USERS_HEADING_LAST_VISIT_DATE="Last Visit Date"
COM_USERS_HEADING_LAST_VISIT_DATE_ASC="Last visit date ascending"
COM_USERS_HEADING_LAST_VISIT_DATE_DESC="Last visit date descending"
COM_USERS_HEADING_LEVEL_NAME="Level Name"
COM_USERS_HEADING_LEVEL_NAME_ASC="Level Name ascending"
COM_USERS_HEADING_LEVEL_NAME_DESC="Level Name descending"
COM_USERS_HEADING_LFT="LFT"
COM_USERS_HEADING_LFT_ASC="LFT ascending"
COM_USERS_HEADING_LFT_DESC="LFT descending"
COM_USERS_HEADING_NAME="Name"
COM_USERS_HEADING_NAME_ASC="Name ascending"
COM_USERS_HEADING_NAME_DESC="Name descending"
COM_USERS_HEADING_REGISTRATION_DATE="Registration Date"
COM_USERS_HEADING_REGISTRATION_DATE_ASC="Registration date ascending"
COM_USERS_HEADING_REGISTRATION_DATE_DESC="Registration date descending"
COM_USERS_HEADING_REVIEW="Review Date"
COM_USERS_HEADING_REVIEW_ASC="Review Date ascending"
COM_USERS_HEADING_REVIEW_DESC="Review Date descending"
COM_USERS_HEADING_SUBJECT="Subject"
COM_USERS_HEADING_SUBJECT_ASC="Subject ascending"
COM_USERS_HEADING_SUBJECT_DESC="Subject descending"
COM_USERS_HEADING_USER="User"
COM_USERS_HEADING_USER_ASC="User ascending"
COM_USERS_HEADING_USER_DESC="User descending"
COM_USERS_HEADING_USERNAME_ASC="Username ascending"
COM_USERS_HEADING_USERNAME_DESC="Username descending"
COM_USERS_HEADING_USERS_IN_GROUP="Users in group"
COM_USERS_LEVEL_DETAILS="Level Details"
COM_USERS_LEVEL_FIELD_TITLE_DESC="Enter a Title for this Access level."
COM_USERS_LEVEL_FIELD_TITLE_LABEL="Level Title"
COM_USERS_LEVEL_HEADER_ERROR="User header access level error."
COM_USERS_LEVEL_SAVE_SUCCESS="Access level saved."
COM_USERS_LEVELS_N_ITEMS_DELETED="%d View Permission Level deleted."
COM_USERS_LEVELS_N_ITEMS_DELETED_1="1 View Permission Level deleted."
COM_USERS_MAIL_DETAILS="Details"
COM_USERS_MAIL_EMAIL_SENT_TO_N_USERS="Email sent to %s users."
COM_USERS_MAIL_EMAIL_SENT_TO_N_USERS_1="Email sent to one user."
COM_USERS_MAIL_FIELD_EMAIL_DISABLED_USERS_DESC="If checked, disabled users will be included when sending mail."
COM_USERS_MAIL_FIELD_EMAIL_DISABLED_USERS_LABEL="Send to Disabled Users"
COM_USERS_MAIL_FIELD_GROUP_DESC="Choose a group to send the mail to."
COM_USERS_MAIL_FIELD_GROUP_LABEL="Group:"
COM_USERS_MAIL_FIELD_MESSAGE_DESC="Enter a default message."
COM_USERS_MAIL_FIELD_MESSAGE_LABEL="Message"
COM_USERS_MAIL_FIELD_RECURSE_DESC="If checked, the email will also be sent to users who are members of any child groups of the selected groups."
COM_USERS_MAIL_FIELD_RECURSE_LABEL="Mail to Child User Groups"
COM_USERS_MAIL_FIELD_SEND_AS_BLIND_CARBON_COPY_DESC="Hide the recipient list and use the site email address for the To: field."
COM_USERS_MAIL_FIELD_SEND_AS_BLIND_CARBON_COPY_LABEL="Recipients as BCC"
COM_USERS_MAIL_FIELD_SEND_IN_HTML_MODE_DESC="If checked, the email will be sent with HTML tags. If not checked, email will be sent in plain text."
COM_USERS_MAIL_FIELD_SEND_IN_HTML_MODE_LABEL="Send in HTML Mode"
COM_USERS_MAIL_FIELD_SUBJECT_DESC="Enter the subject of the mail."
COM_USERS_MAIL_FIELD_SUBJECT_LABEL="Subject"
COM_USERS_MAIL_FIELD_VALUE_ALL_USERS_GROUPS="All Users Groups"
COM_USERS_MAIL_MESSAGE="Message"
COM_USERS_MAIL_NO_USERS_COULD_BE_FOUND_IN_THIS_GROUP="No users could be found in this group."
COM_USERS_MAIL_ONLY_YOU_COULD_BE_FOUND_IN_THIS_GROUP="You are the only user in this group."
COM_USERS_MAIL_PLEASE_FILL_IN_THE_FORM_CORRECTLY="Please fill in the form correctly."
COM_USERS_MAIL_PLEASE_FILL_IN_THE_MESSAGE="Please enter a message"
COM_USERS_MAIL_PLEASE_FILL_IN_THE_SUBJECT="Please enter a subject"
COM_USERS_MAIL_PLEASE_SELECT_A_GROUP="Please select a Group"
COM_USERS_MAIL_THE_MAIL_COULD_NOT_BE_SENT="The mail could not be sent."
COM_USERS_MASS_MAIL="Mass Mail Users"
COM_USERS_MASS_MAIL_DESC="Mass Mail options."
COM_USERS_MSG_NOT_ENOUGH_INTEGERS_N="Password does not have enough digits. At least %s digits are required."
COM_USERS_MSG_NOT_ENOUGH_INTEGERS_N_1="Password does not have enough digits. At least 1 digit is required."
COM_USERS_MSG_NOT_ENOUGH_LOWERCASE_LETTERS_N="Password does not have enough lower case characters. At least %s lower case characters are required."
COM_USERS_MSG_NOT_ENOUGH_LOWERCASE_LETTERS_N_1="Password does not have enough lower case characters. At least 1 lower case character is required."
COM_USERS_MSG_NOT_ENOUGH_SYMBOLS_N="Password does not have enough symbols (such as !@#$). At least %s symbols are required."
COM_USERS_MSG_NOT_ENOUGH_SYMBOLS_N_1="Password does not have enough symbols (such as !@#$). At least 1 symbol is required."
COM_USERS_MSG_NOT_ENOUGH_UPPERCASE_LETTERS_N="Password does not have enough upper case characters. At least %s upper case characters are required."
COM_USERS_MSG_NOT_ENOUGH_UPPERCASE_LETTERS_N_1="Password does not have enough upper case characters. At least 1 upper case character is required."
COM_USERS_MSG_PASSWORD_TOO_LONG="Password is too long. Passwords must be less than 100 characters."
COM_USERS_MSG_PASSWORD_TOO_SHORT_N="Password is too short. Passwords must have at least %s characters."
COM_USERS_MSG_SPACES_IN_PASSWORD="Password must not have spaces at the beginning or end."
COM_USERS_N_LEVELS_DELETED="%d View Access Levels removed."
COM_USERS_N_LEVELS_DELETED_0="No View Access Levels removed."
COM_USERS_N_LEVELS_DELETED_1="%d View Access Level removed."
COM_USERS_N_USER_NOTES="Display %d notes"
COM_USERS_N_USER_NOTES_1="Display %d note"
COM_USERS_N_USER_NOTES_0="No notes to display"
COM_USERS_N_USERS_ACTIVATED="%s Users activated."
COM_USERS_N_USERS_ACTIVATED_0="No user activated."
COM_USERS_N_USERS_ACTIVATED_1="User activated."
COM_USERS_N_USERS_BLOCKED="%s Users blocked."
COM_USERS_N_USERS_BLOCKED_0="No User blocked."
COM_USERS_N_USERS_BLOCKED_1="User blocked."
COM_USERS_N_USERS_UNBLOCKED="%s Users enabled."
COM_USERS_N_USERS_UNBLOCKED_0="No User enabled."
COM_USERS_N_USERS_UNBLOCKED_1="User enabled."
COM_USERS_NEW_NOTE="New Note"
COM_USERS_NO_ACTION="No Action"
COM_USERS_NO_NOTES="No notes available for this user."
COM_USERS_NO_LEVELS_SELECTED="No Viewing Access Levels selected."
COM_USERS_NOTE_N_SUBJECT="#%d %s"
COM_USERS_NOTES="User Notes: New/Edit"
COM_USERS_NOTES_FOR_USER="Notes for user %s (ID #%d)"
COM_USERS_NOTES_N_ITEMS_ARCHIVED="%d User Notes archived."
COM_USERS_NOTES_N_ITEMS_ARCHIVED_1="%d User Note archived."
COM_USERS_NOTES_N_ITEMS_CHECKED_IN="%d User Notes checked in."
COM_USERS_NOTES_N_ITEMS_CHECKED_IN_1="%d User Note checked in."
COM_USERS_NOTES_N_ITEMS_DELETED="%d User Notes deleted."
COM_USERS_NOTES_N_ITEMS_DELETED_1="%d User Note deleted."
COM_USERS_NOTES_N_ITEMS_PUBLISHED="%d User Notes published."
COM_USERS_NOTES_N_ITEMS_PUBLISHED_1="%d User Note published."
COM_USERS_NOTES_N_ITEMS_TRASHED="%d User Notes trashed."
COM_USERS_NOTES_N_ITEMS_TRASHED_1="%d User Note trashed."
COM_USERS_NOTES_N_ITEMS_UNPUBLISHED="%d User Notes unpublished."
COM_USERS_NOTES_N_ITEMS_UNPUBLISHED_1="%d User Note unpublished."
COM_USERS_OPTION_FILTER_DATE="- Select Registration Date -"
COM_USERS_OPTION_FILTER_LAST_VISIT_DATE="- Select Last Visit Date -"
COM_USERS_OPTION_RANGE_NEVER="never"
COM_USERS_OPTION_RANGE_PAST_1MONTH="in the last month"
COM_USERS_OPTION_RANGE_PAST_3MONTH="in the last 3 months"
COM_USERS_OPTION_RANGE_PAST_6MONTH="in the last 6 months"
COM_USERS_OPTION_RANGE_PAST_WEEK="in the last week"
COM_USERS_OPTION_RANGE_PAST_YEAR="in the last year"
COM_USERS_OPTION_RANGE_POST_YEAR="more than a year ago"
COM_USERS_OPTION_RANGE_TODAY="today"
COM_USERS_OPTION_LEVEL_CATEGORY="%d (top category)"
COM_USERS_OPTION_LEVEL_COMPONENT="%d (component)"
COM_USERS_OPTION_LEVEL_DEEPER="%d (deeper)"
COM_USERS_OPTION_SELECT_COMPONENT="- Select Component -"
COM_USERS_OPTION_SELECT_LEVEL_END="- Select End Level -"
COM_USERS_OPTION_SELECT_LEVEL_START="- Select Start Level -"
COM_USERS_PASSWORD_RESET_REQUIRED="Password Reset Required"
COM_USERS_REQUIRE_PASSWORD_RESET="Require Password Reset"
COM_USERS_REVIEW_HEADING="Review Date"
COM_USERS_SEARCH_ACCESS_LEVELS="Search Viewing Access Levels"
COM_USERS_SEARCH_ASSETS="Search Assets"
COM_USERS_SEARCH_GROUPS_LABEL="Search User Groups"
COM_USERS_SEARCH_IN_GROUPS="Search in group title. Prefix with ID: to search for a group ID."
COM_USERS_SEARCH_IN_NAME="Search in name, username or email. Prefix with ID: to search for a user ID."
COM_USERS_SEARCH_IN_NOTE_TITLE="Search in subject, name or username. Prefix with ID: or UID: to search for a note ID or user ID."
COM_USERS_SEARCH_IN_LEVEL_NAME="Search in level name. Prefix with ID: to search for an access level ID."
COM_USERS_SEARCH_IN_ASSETS="Search in asset name or title."
COM_USERS_SEARCH_TITLE_LEVELS="Search Access Levels"
COM_USERS_SEARCH_USER_NOTES="Search User Notes"
COM_USERS_SEARCH_USERS="Search Users"
COM_USERS_SETTINGS_FIELDSET_LABEL="Basic Settings"
COM_USERS_SUBMENU_GROUPS="User Groups"
COM_USERS_SUBMENU_LEVELS="Viewing Access Levels"
COM_USERS_SUBMENU_NOTES="User Notes"
COM_USERS_SUBMENU_NOTE_CATEGORIES="User Note Categories"
COM_USERS_SUBMENU_USERS="Users"
COM_USERS_SUBJECT_HEADING="Subject"
COM_USERS_TOOLBAR_ACTIVATE="Activate"
COM_USERS_TOOLBAR_BLOCK="Block"
COM_USERS_TOOLBAR_MAIL_SEND_MAIL="Send email"
COM_USERS_TOOLBAR_UNBLOCK="Unblock"
COM_USERS_UNACTIVATED="Unactivated"
COM_USERS_USER_ACCOUNT_DETAILS="Account Details"
COM_USERS_USER_BATCH_FAILED="An error was encountered while performing the batch operation: %s."
COM_USERS_USER_BATCH_SUCCESS="Batch operation completed."
COM_USERS_USER_FIELD_BACKEND_LANGUAGE_DESC="Select the Language for the Administrator Backend interface. This will only affect this User."
COM_USERS_USER_FIELD_BACKEND_LANGUAGE_LABEL="Backend Language"
COM_USERS_USER_FIELD_BACKEND_TEMPLATE_DESC="Select the template style for the Administrator Backend interface. This will only affect this User."
COM_USERS_USER_FIELD_BACKEND_TEMPLATE_LABEL="Backend Template Style"
COM_USERS_USER_FIELD_BLOCK="Blocked"
COM_USERS_USER_FIELD_BLOCK_DESC="Enable or Block this user."
COM_USERS_USER_FIELD_BLOCK_LABEL="User Status"
COM_USERS_USER_FIELD_EDITOR_DESC="Editor for this user."
COM_USERS_USER_FIELD_EDITOR_LABEL="Editor"
COM_USERS_USER_FIELD_EMAIL_DESC="Enter an email address for the user."
COM_USERS_USER_FIELD_ENABLE="Enabled"
COM_USERS_USER_FIELD_FRONTEND_LANGUAGE_DESC="Select the Language for the Frontend interface. This will only affect this User."
COM_USERS_USER_FIELD_FRONTEND_LANGUAGE_LABEL="Frontend Language"
; The following two strings are deprecated and will be removed with 4.0.
COM_USERS_USER_FIELD_HELPSITE_DESC="Help site for this user."
COM_USERS_USER_FIELD_HELPSITE_LABEL="Help Site"
COM_USERS_USER_FIELD_LASTRESET_DESC="Date and time of last password reset."
COM_USERS_USER_FIELD_LASTRESET_LABEL="Last Reset Date"
COM_USERS_USER_FIELD_LASTVISIT_DESC="Last visit date."
COM_USERS_USER_FIELD_LASTVISIT_LABEL="Last Visit Date"
COM_USERS_USER_FIELD_NAME_DESC="Enter the name of the user."
COM_USERS_USER_FIELD_NAME_LABEL="Name"
COM_USERS_USER_FIELD_PASSWORD1_MESSAGE="The passwords you entered do not match. Please enter your desired password in the password field and confirm your entry by entering it in the confirm password field."
COM_USERS_USER_FIELD_PASSWORD2_DESC="Confirm the user's password."
COM_USERS_USER_FIELD_PASSWORD2_LABEL="Confirm Password"
COM_USERS_USER_FIELD_PASSWORD_DESC="Enter the password for the user."
COM_USERS_USER_FIELD_REGISTERDATE_DESC="Registration date."
COM_USERS_USER_FIELD_REGISTERDATE_LABEL="Registration Date"
COM_USERS_USER_FIELD_REQUIRERESET_DESC="Setting this option to yes requires the user to reset their password the next time they log into the site."
COM_USERS_USER_FIELD_REQUIRERESET_LABEL="Require Password Reset"
COM_USERS_USER_FIELD_RESETCOUNT_DESC="Number of password resets since last reset date."
COM_USERS_USER_FIELD_RESETCOUNT_LABEL="Password Reset Count"
COM_USERS_USER_FIELD_SENDEMAIL_DESC="If set to yes, the user will receive system emails."
COM_USERS_USER_FIELD_SENDEMAIL_LABEL="Receive System Emails"
COM_USERS_USER_FIELD_TIMEZONE_DESC="Time zone for this user."
COM_USERS_USER_FIELD_TIMEZONE_LABEL="Time Zone"
COM_USERS_USER_FIELD_TWOFACTOR_LABEL="Authentication Method"
COM_USERS_USER_FIELD_TWOFACTOR_DESC="Which two factor authentication method you want to activate on the user account."
COM_USERS_USER_FIELD_USERNAME_DESC="Enter the login name (Username) for the user."
COM_USERS_USER_FIELD_USERNAME_LABEL="Login Name"
COM_USERS_USER_GROUPS_HAVING_ACCESS="User Groups Having Viewing Access"
COM_USERS_USER_HEADING="User"
COM_USERS_USER_OTEPS="One time emergency passwords"
COM_USERS_USER_OTEPS_DESC="If you do not have access to your two factor authentication device you can use any of the following passwords instead of a regular security code. Each one of these emergency passwords is immediately destroyed upon use. We recommend printing these passwords out and keeping the printout in a safe and accessible location, eg your wallet or a safety deposit box."
COM_USERS_USER_OTEPS_WAIT_DESC="There are no emergency one time passwords generated in your account. The passwords will be generated automatically and displayed here as soon as you activate two factor authentication."
COM_USERS_USER_SAVE_FAILED="An error was encountered while saving the member: %s."
COM_USERS_USER_SAVE_SUCCESS="User saved."
COM_USERS_USER_TWO_FACTOR_AUTH="Two Factor Authentication"
COM_USERS_USERGROUP_DETAILS="User Group Details"
COM_USERS_USERS_ERROR_CANNOT_BLOCK_SELF="You can't block yourself."
COM_USERS_USERS_ERROR_CANNOT_EDIT_OWN_GROUP="You can't edit your own user groups. User groups saving was skipped."
COM_USERS_USERS_ERROR_CANNOT_DELETE_SELF="You can't delete yourself."
COM_USERS_USERS_ERROR_CANNOT_DEMOTE_SELF="You can't remove your own Super User permissions."
COM_USERS_USERS_ERROR_CANNOT_REQUIRERESET_SELF="You can't require a Password reset for yourself."
COM_USERS_USERS_ERROR_CANNOT_SAVE_ACCOUNT_WITHOUT_GROUPS="You can't save a user account without selecting at least one user group."
COM_USERS_USERS_MULTIPLE_GROUPS="Multiple groups"
COM_USERS_USERS_N_ITEMS_DELETED="%d users deleted."
COM_USERS_USERS_N_ITEMS_DELETED_1="1 user deleted."
COM_USERS_USERS_NO_ITEM_SELECTED="No Users selected."
COM_USERS_VIEW_DEBUG_GROUP_TITLE="Advanced Permissions Report for Group #%d, %s"
COM_USERS_VIEW_DEBUG_USER_TITLE="Advanced Permissions Report for User #%d, %s"
COM_USERS_VIEW_EDIT_GROUP_TITLE="Users: Edit Group"
COM_USERS_VIEW_EDIT_LEVEL_TITLE="Users: Edit Viewing Access Level"
COM_USERS_VIEW_EDIT_PROFILE_TITLE="Users: Edit Profile"
COM_USERS_VIEW_EDIT_USER_TITLE="Users: Edit"
COM_USERS_VIEW_GROUPS_TITLE="Users: Groups"
COM_USERS_VIEW_LEVELS_TITLE="Users: Viewing Access Levels"
COM_USERS_VIEW_NEW_GROUP_TITLE="Users: New Group"
COM_USERS_VIEW_NEW_LEVEL_TITLE="Users: New Viewing Access Level"
COM_USERS_VIEW_NEW_USER_TITLE="Users: New"
COM_USERS_VIEW_NOTES_TITLE="User Notes"
COM_USERS_VIEW_USERS_TITLE="Users"
COM_USERS_XML_DESCRIPTION="Component for managing users"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_USERS="Changes apply to this component only.<br /><em><strong>Inherited</strong></em> - a Global Configuration setting or higher level setting is applied.<br /><em><strong>Denied</strong></em> always wins - whatever is set at the Global or higher level and applies to all child elements.<br /><em><strong>Allowed</strong></em> will enable the action for this component unless overruled by a Global Configuration setting."

; Categories overrides
COM_CATEGORIES_CATEGORY_ADD_TITLE="User Notes: New Category"
COM_CATEGORIES_CATEGORY_EDIT_TITLE="User Notes: Edit Category"
language/en-GB/en-GB.plg_content_joomla.ini000060400000001426152453623440014473 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CONTENT_JOOMLA="Content - Joomla"
PLG_CONTENT_JOOMLA_FIELD_CHECK_CATEGORIES_DESC="Check that categories are fully empty before they are deleted."
PLG_CONTENT_JOOMLA_FIELD_CHECK_CATEGORIES_LABEL="Check Category Deletion"
PLG_CONTENT_JOOMLA_FIELD_EMAIL_NEW_FE_DESC="Email users if 'Send email' is on when there is a new article submitted via the Frontend."
PLG_CONTENT_JOOMLA_FIELD_EMAIL_NEW_FE_LABEL="Email on New Site Article"
PLG_CONTENT_JOOMLA_XML_DESCRIPTION="This plugin does category processing for core extensions; sends an email when new article is submitted in the Frontend."language/en-GB/en-GB.plg_system_actionlogs.ini000060400000004275152453623440015233 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_ACTIONLOGS="System - User Actions Log"
PLG_SYSTEM_ACTIONLOGS_EXTENSIONS_NOTIFICATIONS="Select events to be notified for"
PLG_SYSTEM_ACTIONLOGS_EXTENSIONS_NOTIFICATIONS_DESC="Select events to be sent to your email as notifications"
PLG_SYSTEM_ACTIONLOGS_INFO_DESC="The Action Log - Joomla plugin is disabled"
PLG_SYSTEM_ACTIONLOGS_INFO_LABEL="Information"
PLG_SYSTEM_ACTIONLOGS_JOOMLA_ACTIONLOG_DISABLED="Action Log - Joomla"
PLG_SYSTEM_ACTIONLOGS_JOOMLA_ACTIONLOG_DISABLED_REDIRECT="The %s plugin is disabled."
PLG_SYSTEM_ACTIONLOGS_LOG_DELETE_PERIOD="Days to delete logs after"
PLG_SYSTEM_ACTIONLOGS_LOG_DELETE_PERIOD_DESC="Enter 0 if you don't want to delete the logs."
PLG_SYSTEM_ACTIONLOGS_NOTIFICATIONS="Send notifications for User Actions Log"
PLG_SYSTEM_ACTIONLOGS_NOTIFICATIONS_DESC="Send a notifications of users' actions log to your email"
PLG_SYSTEM_ACTIONLOGS_OPTIONS="User Actions Log Options"
PLG_SYSTEM_ACTIONLOGS_XML_DESCRIPTION="Records the actions of users on the site so they can be reviewed if required."
; Common content type log messages
PLG_SYSTEM_ACTIONLOGS_CONTENT_ADDED="User <a href=\"{accountlink}\">{username}</a> added new {type} <a href=\"{itemlink}\">{title}</a>"
PLG_SYSTEM_ACTIONLOGS_CONTENT_ARCHIVED="User <a href=\"{accountlink}\">{username}</a> archived the {type} <a href=\"{itemlink}\">{title}</a>"
PLG_SYSTEM_ACTIONLOGS_CONTENT_UPDATED="User <a href=\"{accountlink}\">{username}</a> updated the {type} <a href=\"{itemlink}\">{title}</a>"
PLG_SYSTEM_ACTIONLOGS_CONTENT_PUBLISHED="User <a href=\"{accountlink}\">{username}</a> published the {type} <a href=\"{itemlink}\">{title}</a>"
PLG_SYSTEM_ACTIONLOGS_CONTENT_UNPUBLISHED="User <a href=\"{accountlink}\">{username}</a> unpublished the {type} <a href=\"{itemlink}\">{title}</a>"
PLG_SYSTEM_ACTIONLOGS_CONTENT_TRASHED="User <a href=\"{accountlink}\">{username}</a> trashed the {type} <a href=\"{itemlink}\">{title}</a>"
PLG_SYSTEM_ACTIONLOGS_CONTENT_DELETED="User <a href=\"{accountlink}\">{username}</a> deleted the {type} {title}"
language/en-GB/en-GB.plg_installer_packageinstaller.sys.ini000060400000000611152453623440017656 0ustar00; Joomla! Project
; (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_INSTALLER_PACKAGEINSTALLER="Installer - Install from Upload"
PLG_INSTALLER_PACKAGEINSTALLER_PLUGIN_XML_DESCRIPTION="This plugin allows you to install packages from your local computer."
language/en-GB/en-GB.mod_version.ini000060400000001130152453623440013132 0ustar00; Joomla! Project
; (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_VERSION="Joomla! Version Information"
MOD_VERSION_FORMAT_DESC="The long version includes code name and date."
MOD_VERSION_FORMAT_LABEL="Version Format"
MOD_VERSION_FORMAT_LONG="Long"
MOD_VERSION_FORMAT_SHORT="Short"
MOD_VERSION_PRODUCT_DESC="Include the text &quot;Joomla!&quot;."
MOD_VERSION_PRODUCT_LABEL="Show Joomla!"
MOD_VERSION_XML_DESCRIPTION="This module displays the Joomla! version."language/en-GB/en-GB.plg_system_redirect.ini000060400000002613152453623440014664 0ustar00; Joomla! Project
; (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_REDIRECT="System - Redirect"
PLG_SYSTEM_REDIRECT_ERROR_UPDATING_DATABASE="An error occurred while updating the database."
PLG_SYSTEM_REDIRECT_FIELD_COLLECT_URLS_DESC="This option controls the collection of URLs. This is useful to avoid unnecessary load on the database."
PLG_SYSTEM_REDIRECT_FIELD_COLLECT_URLS_LABEL="Collect URLs"
PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_DESC="Define regular expressions or terms which should be excluded in saving."
PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_LABEL="Exclude URLs"
PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_REGEXP_DESC="Should the term be handled as regular expression."
PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_REGEXP_LABEL="Regular Expression"
PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_TERM_DESC="A regular expression or a term which should be excluded."
PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_TERM_LABEL="Term"
PLG_SYSTEM_REDIRECT_FIELD_STORE_FULL_URL_DESC="Save the expired URL as absolute (include domain) or relative (exclude domain)."
PLG_SYSTEM_REDIRECT_FIELD_STORE_FULL_URL_LABEL="Include Domain Name in Expired URL"
PLG_SYSTEM_REDIRECT_XML_DESCRIPTION="The system redirect plugin enables the Joomla Redirect system to catch missing pages and redirect users."
language/en-GB/en-GB.plg_system_logout.ini000060400000000777152453623440014405 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_LOGOUT_XML_DESCRIPTION="The system logout plugin enables Joomla to redirect the user to the home page if they choose to logout while they are on a protected access page."
PLG_SYSTEM_LOGOUT="System - Logout"
PLG_SYSTEM_LOGOUT_REDIRECT="You have been redirected to the home page following logout."

language/en-GB/en-GB.com_associations.sys.ini000060400000000515152453623440014766 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_ASSOCIATIONS="Multilingual Associations"
COM_ASSOCIATIONS_XML_DESCRIPTION="Improved multilingual content management component"language/en-GB/en-GB.plg_quickicon_jce.sys.ini000060400000000466152453623440015106 0ustar00; JCE Project
; Copyright (C) 2006 - 2012 Ryan Demmer. All rights reserved
; GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
; Note : All ini files need to be saved as UTF-8

PLG_QUICKICON_JCE="Quick Icon - JCE File Browser"
PLG_QUICKICON_JCE_XML_DESCRIPTION="JCE File Browser Quick Icon"language/en-GB/en-GB.plg_extension_jce.sys.ini000060400000000441152453623440015126 0ustar00; JCE Project
; Copyright (C) 2006 - 2016 Ryan Demmer. All rights reserved
; GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html

; Note : All ini files need to be saved as UTF-8
PLG_EXTENSION_JCE="Extension - JCE"
PLG_EXTENSION_JCE_XML_DESCRIPTION="JCE Extension Plugin"language/en-GB/en-GB.plg_captcha_recaptcha_invisible.sys.ini000060400000001040152453623440017746 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CAPTCHA_RECAPTCHA_INVISIBLE="CAPTCHA - Invisible reCAPTCHA"
PLG_CAPTCHA_RECAPTCHA_INVISIBLE_XML_DESCRIPTION="This CAPTCHA plugin uses the Invisible reCAPTCHA service. To get a site and secret key for your domain, go to <a href="_QQ_"https://www.google.com/recaptcha"_QQ_" target="_QQ_"_blank"_QQ_">https://www.google.com/recaptcha</a>."
language/en-GB/en-GB.mod_sampledata.sys.ini000060400000000464152453623440014406 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_SAMPLEDATA="Sample Data"
MOD_SAMPLEDATA_XML_DESCRIPTION="This Module allows to install sample data."
language/en-GB/en-GB.mod_quickicon.ini000060400000003112152453623440013434 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_QUICKICON="Quick Icons"
MOD_QUICKICON_ADD_NEW_ARTICLE="New Article"
MOD_QUICKICON_ARTICLE_MANAGER="Articles"
MOD_QUICKICON_CATEGORY_MANAGER="Categories"
MOD_QUICKICON_CLEAR_CACHE="Clear Cache"
MOD_QUICKICON_CONFIGURATION="Configuration"
MOD_QUICKICON_CONTENT="Content"
MOD_QUICKICON_EXTENSIONS="Extensions"
MOD_QUICKICON_EXTENSION_MANAGER="Extension Manager"
MOD_QUICKICON_FRONTPAGE_MANAGER="Front Page Manager"
MOD_QUICKICON_GLOBAL_CHECKIN="Global Check-in"
MOD_QUICKICON_GLOBAL_CONFIGURATION="Global"
MOD_QUICKICON_GROUP_DESC="The group of this module (this value is compared with the group value used in <b>Quick Icons</b> plugins to inject icons). The 'mod_quickicon' group always displays the Joomla! core icons."
MOD_QUICKICON_GROUP_LABEL="Group"
MOD_QUICKICON_INSTALL_EXTENSIONS="Install Extensions"
MOD_QUICKICON_LANGUAGE_MANAGER="Language(s)"
MOD_QUICKICON_MAINTENANCE="Maintenance"
MOD_QUICKICON_MEDIA_MANAGER="Media"
MOD_QUICKICON_MENU_MANAGER="Menu(s)"
MOD_QUICKICON_MODULE_MANAGER="Modules"
MOD_QUICKICON_PROFILE="Edit Profile"
MOD_QUICKICON_STRUCTURE="Structure"
MOD_QUICKICON_SYSTEM_INFORMATION="System Information"
MOD_QUICKICON_TEMPLATE_MANAGER="Templates"
MOD_QUICKICON_TITLE="Quick Icons"
MOD_QUICKICON_USER_MANAGER="Users"
MOD_QUICKICON_USERS="Users"
MOD_QUICKICON_XML_DESCRIPTION="This module shows Quick Icons that are visible on the Control Panel (administrator area home page)."
language/en-GB/en-GB.plg_authentication_gmail.sys.ini000060400000001374152453623440016467 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_AUTHENTICATION_GMAIL="Authentication - Gmail"
PLG_GMAIL_XML_DESCRIPTION="Handles User Authentication with a Gmail or Googlemail account (Requires cURL).<br />Users may need to enable <em>Access for less secure apps</em> at <a href="_QQ_"https://www.google.com/settings/security/lesssecureapps"_QQ_" target="_QQ_"_blank"_QQ_">https://www.google.com/settings/security/lesssecureapps</a> to be able to log in using this method.<br /><strong> Warning! You must have at least one authentication plugin enabled or you will lose all access to your site.</strong>"
language/en-GB/en-GB.mod_submenu.sys.ini000060400000000546152453623440013752 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_SUBMENU="Administrator Sub-Menu"
MOD_SUBMENU_XML_DESCRIPTION="This module shows the Sub-Menu Navigation Module."
MOD_SUBMENU_LAYOUT_DEFAULT="Default"

language/en-GB/en-GB.com_contenthistory.sys.ini000060400000000460152453623440015362 0ustar00; Joomla! Project
; (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_CONTENTHISTORY="Content History"
COM_CONTENTHISTORY_XML_DESCRIPTION="Content History Component."
language/en-GB/en-GB.plg_system_googlic_analytics.ini000060400000006460152453623440016561 0ustar00; GoogliC Analytics en-GB
; @version	$version 1.2.3 JoomliC 2012-05-20$
; @author	JoomliC <info@joomlic.com>
; @link		http://www.joomlic.com

PLG_SYSTEM_GOOGLIC_ANALYTICS="System - GoogliC Analytics"
PLG_SYSTEM_GOOGLIC_ANALYTICS_XML_DESCRIPTION="<iframe src="_QQ_"http://www.joomlic.com/infosic/googlic/en_plugin_googlic_124.html"_QQ_" frameborder="_QQ_"0"_QQ_" height="_QQ_"250"_QQ_" width="_QQ_"550"_QQ_"></iframe><br/><br/><i><small>System Plugin GoogliC Analytics by Jooml!C - <a href='http://www.joomlic.com' target='_blanck'>www.joomlic.com</a></small></i>"
COM_PLUGINS_GOOGLIC_FIELDSET_LABEL="&nbsp;&nbsp;&nbsp;<img src="_QQ_"../media/googlic_analytics/images/googlic16.png"_QQ_"/> GoogliC Analytics Parameters"
PLG_SYSTEM_GOOGLIC_ANALYTICS_GOOGLE_TITRE="GOOGLE ANALYTICS ID"
PLG_SYSTEM_GOOGLIC_ANALYTICS_GOOGLE_NOTE="Enter your Property ID provided by Google Analytics. <a href="_QQ_"http://www.google.com/analytics/"_QQ_" target="_QQ_"_blanck"_QQ_">Create an account google analytics</a>."
PLG_SYSTEM_GOOGLIC_ANALYTICS_ID_SUIVI_LABEL="Property ID &nbsp;<img src="_QQ_"../media/googlic_analytics/images/info.png"_QQ_"/>"
PLG_SYSTEM_GOOGLIC_ANALYTICS_ID_SUIVI_DESC="Your web-property ID. Takes the form <b>UA-XXXXX-Y</b> or <b>UA-XXXXX-YY</b>."
PLG_SYSTEM_GOOGLIC_ANALYTICS_FILTRES_TITRE="USER GROUPS TRACKING FILTERS"
PLG_SYSTEM_GOOGLIC_ANALYTICS_FILTRES_NOTE="Select the user groups that should not be tracked by Google Analytics statistics."
PLG_SYSTEM_GOOGLIC_ANALYTICS_GROUPES_EXCLUS_LABEL="User groups not to track &nbsp;<img src="_QQ_"../media/googlic_analytics/images/info.png"_QQ_"/>"
PLG_SYSTEM_GOOGLIC_ANALYTICS_GROUPES_EXCLUS_DESC="Hold down the Ctrl (Windows) or Command (Mac) on your keyboard while clicking on groups of users to select multiple."
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_TITRE="WEBSITE TRACKING OPTIONS (Standard)"
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_NOTE="<dl><big>OPTIONS</big><dt><br/><b>A single domain (default)</b> : </dt><dd>www.yourdomain.com</i></dd><dt><b>One domain with multiple subdomains</b> : </dt><dd>www.yourdomain.com</i></dd><dd>store.yourdomain.com</i></dd><dd>forum.yourdomain.com</i></dd><dt><b>Multiple top-level domains</b> :</dt><dd>www.yourdomain.com</i></dd><dd>www.yourdomain.uk</i></dd><dd>www.yourdomain.eu</i></dd></dl><br/>"
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_ATTENTION="Caution! Make these adjustments knowingly.<br/>If you do not know what it is, leave the default settings."
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_LABEL="What are you tracking? &nbsp;<img src="_QQ_"../media/googlic_analytics/images/info.png"_QQ_"/>"
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_DESC="<b>+</b> more info : google.com/analytics."
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_DOMAINE="A single domain (default)"
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_SOUSDOMAINES="One domain with multiple subdomains"
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_EXT_DOMAINES="Multiple top-level domains"
PLG_SYSTEM_GOOGLIC_ANALYTICS_DOMAINE_NOTE="Since version 1.2.3, your domain name is automatically inserted in the google analytics tracking code."
STYLE_BOX="color:#EEE;background-color:#333;margin:10px 0;padding:10px 8px;border-bottom:5px solid #ce0000;border-radius: 3px;"
STYLE_RED="color:#cc0000;background-color:#FFFFFF; font-weight: bold; padding:10px 8px; margin:0 45px;border:1px red dotted; text-align: center;"
STYLE_NOTE="color:#666; margin:0; padding:5px;"
language/en-GB/en-GB.mod_version.sys.ini000060400000000542152453623440013755 0ustar00; Joomla! Project
; (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_VERSION="Joomla! Version Information"
MOD_VERSION_LAYOUT_DEFAULT="Default"
MOD_VERSION_XML_DESCRIPTION="This module displays the Joomla! version."
language/en-GB/en-GB.plg_search_newsfeeds.ini000060400000000766152453623440014776 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SEARCH_NEWSFEEDS="Search - News Feeds"
PLG_SEARCH_NEWSFEEDS_FIELD_SEARCHLIMIT_DESC="Number of search items to return."
PLG_SEARCH_NEWSFEEDS_FIELD_SEARCHLIMIT_LABEL="Search Limit"
PLG_SEARCH_NEWSFEEDS_NEWSFEEDS="News Feeds"
PLG_SEARCH_NEWSFEEDS_XML_DESCRIPTION="Enables searching of News feeds."
language/en-GB/en-GB.plg_search_tags.sys.ini000060400000000450152453623440014554 0ustar00; Joomla! Project
; (C) 2014 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SEARCH_TAGS="Search - Tags"
PLG_SEARCH_TAGS_XML_DESCRIPTION="Enables searching in Tags."
language/en-GB/en-GB.com_content.sys.ini000060400000005107152453623440013743 0ustar00; Joomla! Project
; (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_CONTENT="Articles"
COM_CONTENT_ARCHIVE_VIEW_DEFAULT_DESC="Display all archived articles."
COM_CONTENT_ARCHIVE_VIEW_DEFAULT_OPTION="Default"
COM_CONTENT_ARCHIVE_VIEW_DEFAULT_TITLE="Archived Articles"
COM_CONTENT_ARTICLE_MANAGER="Articles"
COM_CONTENT_ARTICLE_VIEW_DEFAULT_DESC="Display a single article."
COM_CONTENT_ARTICLE_VIEW_DEFAULT_OPTION="Default"
COM_CONTENT_ARTICLE_VIEW_DEFAULT_TITLE="Single Article"
COM_CONTENT_ARTICLE_VIEW_EDIT_DESC="Shows a form to create a New Article."
COM_CONTENT_ARTICLE_VIEW_EDIT_TITLE="Create an Article"
COM_CONTENT_ARTICLES="Articles"
COM_CONTENT_ARTICLES_VIEW_DEFAULT_DESC="Shows a list of all the articles."
COM_CONTENT_ARTICLES_VIEW_DEFAULT_TITLE="List All Articles"
COM_CONTENT_CATEGORIES="Categories"
COM_CONTENT_CATEGORIES_VIEW_DEFAULT_DESC="Shows a list of all the article categories within a category."
COM_CONTENT_CATEGORIES_VIEW_DEFAULT_OPTION="Default"
COM_CONTENT_CATEGORIES_VIEW_DEFAULT_TITLE="List All Categories"
COM_CONTENT_CATEGORY_ADD_TITLE="Articles: New Category"
COM_CONTENT_CATEGORY_EDIT_TITLE="Articles: Edit Category"
COM_CONTENT_CATEGORY_VIEW_BLOG_DESC="Displays article introductions in a single or multi-column layout."
COM_CONTENT_CATEGORY_VIEW_BLOG_OPTION="Blog"
COM_CONTENT_CATEGORY_VIEW_BLOG_TITLE="Category Blog"
COM_CONTENT_CATEGORY_VIEW_DEFAULT_DESC="Displays a list of articles in a category."
COM_CONTENT_CATEGORY_VIEW_DEFAULT_OPTION="List"
COM_CONTENT_CATEGORY_VIEW_DEFAULT_TITLE="Category List"
COM_CONTENT_CATEGORY_VIEW_FEATURED_DESC="Show all featured articles from one or multiple categories in a single or multi-column layout."
COM_CONTENT_CATEGORY_VIEW_FEATURED_OPTION="Default"
COM_CONTENT_CATEGORY_VIEW_FEATURED_TITLE="Featured Articles Single Category"
COM_CONTENT_CONTENT_TYPE_ARTICLE="Article"
COM_CONTENT_CONTENT_TYPE_CATEGORY="Article Category"
COM_CONTENT_FEATURED="Featured"
COM_CONTENT_FEATURED_VIEW_DEFAULT_DESC="Displays article introductions in a single or multi-column layout for featured articles from all categories."
COM_CONTENT_FEATURED_VIEW_DEFAULT_OPTION="Default"
COM_CONTENT_FEATURED_VIEW_DEFAULT_TITLE="Featured Articles"
COM_CONTENT_FORM_VIEW_DEFAULT_DESC="Create a new article."
COM_CONTENT_FORM_VIEW_DEFAULT_OPTION="Create"
COM_CONTENT_FORM_VIEW_DEFAULT_TITLE="Create Article"
COM_CONTENT_TAGS_ARTICLE="Article"
COM_CONTENT_TAGS_CATEGORY="Article Category"
COM_CONTENT_XML_DESCRIPTION="Article management component."
language/en-GB/en-GB.plg_search_content.ini000060400000001306152453623440014454 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SEARCH_CONTENT="Search - Content"
PLG_SEARCH_CONTENT_FIELD_ARCHIVED_DESC="Enables searching of Archived Articles."
PLG_SEARCH_CONTENT_FIELD_ARCHIVED_LABEL="Archived Articles"
PLG_SEARCH_CONTENT_FIELD_CONTENT_DESC="Enables searching of all Articles."
PLG_SEARCH_CONTENT_FIELD_CONTENT_LABEL="Articles"
PLG_SEARCH_CONTENT_FIELD_SEARCHLIMIT_DESC="Number of search items to return."
PLG_SEARCH_CONTENT_FIELD_SEARCHLIMIT_LABEL="Search Limit"
PLG_SEARCH_CONTENT_XML_DESCRIPTION="Enables searching in Articles."language/en-GB/en-GB.plg_search_categories.sys.ini000060400000000511152453623440015741 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SEARCH_CATEGORIES="Search - Categories"
PLG_SEARCH_CATEGORIES_XML_DESCRIPTION="Enables searching of Category information."language/en-GB/en-GB.plg_quickicon_jcefilebrowser.sys.ini000060400000000542152453623440017345 0ustar00; JCE Project
; Copyright (C) 2006 - 2012 Ryan Demmer. All rights reserved
; GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html
; Note : All ini files need to be saved as UTF-8

PLG_QUICKICON_JCEFILEBROWSER="Quick Icon - JCE File Browser"
PLG_QUICKICON_JCEFILEBROWSER_XML_DESCRIPTION="Control Panel Quick Icon for the JCE File Browser"language/en-GB/en-GB.com_tags.ini000060400000027743152453623440012424 0ustar00; Joomla! Project
; (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_TAGS="Tags"
COM_TAGS_ALL="All"
COM_TAGS_ALL_TAGS_DESCRIPTION_DESC="Description to display at the heading of tags list."
COM_TAGS_ALL_TAGS_DESCRIPTION_LABEL="Heading Description"
COM_TAGS_ALL_TAGS_MEDIA_DESC="Select or upload the image to display in the heading of the tags list."
COM_TAGS_ALL_TAGS_MEDIA_LABEL="Heading Image File"
COM_TAGS_ANY="Any"
COM_TAGS_BASE_ADD_TITLE="Tags: New"
COM_TAGS_BASE_EDIT_TITLE="Tags: Edit"
COM_TAGS_BASIC_FIELDSET_LABEL="Options"
COM_TAGS_BATCH_CANNOT_CREATE="You are not allowed to create new tags."
COM_TAGS_BATCH_CANNOT_EDIT="You are not allowed to edit tags."
COM_TAGS_BATCH_OPTIONS="Batch process the selected tags"
COM_TAGS_BATCH_TIP="Actions will apply to chosen Tags."
COM_TAGS_COMPACT_COLUMNS_LABEL="Number of Columns"
COM_TAGS_CONFIG_TAG_MIN_LENGTH_LABEL="Minimum Search Length"
COM_TAGS_CONFIG_TAG_MIN_LENGTH_DESC="This setting controls the minimum character length for the search and adding tags using the tags field Ajax mode."
COM_TAGS_CONFIG_ALL_TAGS_FIELD_LAYOUT_DESC="Choose a default layout for List of all tags."
COM_TAGS_CONFIG_ALL_TAGS_FIELD_LAYOUT_LABEL="Default List All Tags Layout"
COM_TAGS_CONFIG_ALL_TAGS_SETTINGS_DESC="These settings apply for a List of all Tags unless they are changed for a specific menu item."
COM_TAGS_CONFIG_ALL_TAGS_SETTINGS_LABEL="List All Tags"
COM_TAGS_CONFIG_DATA_ENTRY_SETTINGS_DESC="These settings control the way tags are entered."
COM_TAGS_CONFIG_DATA_ENTRY_SETTINGS_LABEL="Data Entry"
COM_TAGS_CONFIG_INTEGRATION_SETTINGS_DESC="These settings determine how the Tags Component will integrate with other extensions."
COM_TAGS_CONFIG_NUMBER_OF_ITEMS="Number of Items Tagged"
COM_TAGS_CONFIG_SELECTION_SETTINGS_DESC="These settings control which items get selected in the Tagged Items list layouts."
COM_TAGS_CONFIG_SELECTION_SETTINGS_LABEL="Item Selection"
COM_TAGS_CONFIG_SHARED_SETTINGS_DESC="These settings apply to all tag layouts unless they are changed for a specific menu item."
COM_TAGS_CONFIG_SHARED_SETTINGS_LABEL="Shared Layout"
COM_TAGS_CONFIG_TAG_SETTINGS_DESC="These settings apply for a Tagged Items List or Compact List of Tagged Items unless they are changed for a specific menu item."
COM_TAGS_CONFIG_TAG_SETTINGS_LABEL="Tagged Items"
COM_TAGS_CONFIG_TAGGED_ITEMS_FIELD_LAYOUT_DESC="Choose a default layout for tagged items. This layout will be used when a user selects a tag that doesn't have a menu item defined."
COM_TAGS_CONFIG_TAGGED_ITEMS_FIELD_LAYOUT_LABEL="Default Tagged Items Layout"
COM_TAGS_CONFIGURATION="Tags: Options"
COM_TAGS_COUNT_ARCHIVED_ITEMS="Archived items"
COM_TAGS_COUNT_PUBLISHED_ITEMS="Published items"
COM_TAGS_COUNT_TRASHED_ITEMS="Trashed items"
COM_TAGS_COUNT_UNPUBLISHED_ITEMS="Unpublished items"
COM_TAGS_DELETE_NOT_ALLOWED="Delete not allowed for tag %s."
COM_TAGS_DESCRIPTION_DESC="Enter an optional tag description in the text area."
COM_TAGS_ERROR_UNIQUE_ALIAS="Another Tag has the same alias (remember it may be a trashed item)."
COM_TAGS_EXCLUDE="Exclude"
COM_TAGS_FIELD_CONFIG_HITS_DESC="Displays the number of hits."
COM_TAGS_FIELD_CONFIG_TAGDESCRIPTION_DESC="Configure com_tags."
COM_TAGS_FIELD_CONFIG_TAGDESCRIPTION_LABEL="Tags"
COM_TAGS_FIELD_CONTENT_TYPE_DESC="Only tagged items of these types will be displayed."
COM_TAGS_FIELD_CONTENT_TYPE_LABEL="Content types"
COM_TAGS_FIELD_CREATED_DATE_DESC="The date and time that the tag was created."
COM_TAGS_FIELD_FULL_DESC="Select or upload an image that will be displayed in the single tag view."
COM_TAGS_FIELD_FULL_LABEL="Full Image"
COM_TAGS_FIELD_HITS_DESC="Number of hits for this tag."
COM_TAGS_FIELD_IMAGE_ALT_DESC="Alt text for the image."
COM_TAGS_FIELD_IMAGE_ALT_LABEL="Alt"
COM_TAGS_FIELD_IMAGE_CAPTION_DESC="Caption for the image."
COM_TAGS_FIELD_IMAGE_CAPTION_LABEL="Caption"
COM_TAGS_FIELD_IMAGE_DESC="Select or upload an image for this tag."
COM_TAGS_FIELD_IMAGE_LABEL="Image"
COM_TAGS_FIELD_INTRO_DESC="Select or upload an image that will be displayed as part of a list."
COM_TAGS_FIELD_INTRO_LABEL="Teaser Image"
COM_TAGS_FIELD_ITEM_BODY_DESC="Show the body for each item."
COM_TAGS_FIELD_LANGUAGE_DESC="Assign a language to this tag."
COM_TAGS_FIELD_LANGUAGE_FILTER_DESC="Optionally filter the list of tags based on language."
COM_TAGS_FIELD_LANGUAGE_FILTER_LABEL="Language Filter"
COM_TAGS_FIELD_MODIFIED_DESC="The date and time that the tag was last modified."
COM_TAGS_FIELD_NOTE_DESC="An optional note to display in the tag list."
COM_TAGS_FIELD_NOTE_LABEL="Note"
COM_TAGS_FIELD_NUMBER_ITEMS_LIST_DESC="Default number of tagged items to list on a page."
COM_TAGS_FIELD_NUMBER_ITEMS_LIST_LABEL="# Items to List"
COM_TAGS_FIELD_PARENT_DESC="Select a parent tag."
COM_TAGS_FIELD_PARENT_LABEL="Parent"
COM_TAGS_FIELD_PARENT_TAG_DESC="If set only tags that are direct children of the selected tag will be displayed."
COM_TAGS_FIELD_PARENT_TAG_LABEL="Parent Tag"
COM_TAGS_FIELD_SELECT_TAG_DESC="Select one or more tags."
COM_TAGS_FIELD_TAG_BODY_DESC="Show or hide the tag description."
COM_TAGS_FIELD_TAG_BODY_LABEL="Description."
COM_TAGS_FIELD_TAG_LABEL="Tag"
COM_TAGS_FIELD_TAG_LINK_CLASS="CSS Class for tag link"
COM_TAGS_FIELD_TAG_LINK_CLASS_DESC="Add specific CSS classes for the tag link. If left blank the default 'label label-info' is used."
COM_TAGS_FIELD_TYPE_DESC="Only tags of the selected types will be displayed (optional)."
COM_TAGS_FIELD_TYPE_LABEL="Content Type"
COM_TAGS_FIELDSET_DETAILS="Tag Details"
COM_TAGS_FIELDSET_OPTIONS="Options"
COM_TAGS_FIELDSET_PUBLISHING="Publishing"
COM_TAGS_FIELDSET_TAGGED_ITEMS="Tagged Items"
COM_TAGS_FIELDSET_URLS_AND_IMAGES="Links and Images"
COM_TAGS_FILTER_SEARCH_DESC="Search in tag title, alias and note. Prefix with ID: to search for a tag ID."
COM_TAGS_FILTER_SEARCH_LABEL="Search Tags"
COM_TAGS_FLOAT_DESC="Float attribute for the image."
COM_TAGS_FLOAT_LABEL="Float"
COM_TAGS_HAS_SUBCATEGORY_ITEMS="%d items are assigned to this tag's subtags."
COM_TAGS_HAS_SUBCATEGORY_ITEMS_1="%d item is assigned to one of this tag's subtags."
COM_TAGS_INCLUDE="Include"
COM_TAGS_INCLUDE_CHILDREN_DESC="Include or exclude child tags from the result list for a tag."
COM_TAGS_INCLUDE_CHILDREN_LABEL="Child Tags"
COM_TAGS_ITEM_OPTIONS="Item Options"
COM_TAGS_ITEMS_SEARCH_FILTER="Search"
COM_TAGS_LEFT="Left"
COM_TAGS_LIST_ALL_SELECTION_OPTIONS="Selection Options"
COM_TAGS_LIST_MAX_CHARACTERS_DESC="The maximum number of characters to display from the description in each tag."
COM_TAGS_LIST_MAX_CHARACTERS_LABEL="Maximum Characters"
COM_TAGS_LIST_MAX_DESC="The maximum number of results to return."
COM_TAGS_LIST_MAX_LABEL="Maximum Items"
COM_TAGS_LIST_SELECTION_OPTIONS="Item Selection Options"
COM_TAGS_MANAGER_TAGS="Tags"
COM_TAGS_MATCH_COUNT="Number of matching tags"
COM_TAGS_N_ITEMS_ARCHIVED="%d tags archived."
COM_TAGS_N_ITEMS_ARCHIVED_1="%d tag archived."
COM_TAGS_N_ITEMS_CHECKED_IN_0="No tag checked in."
COM_TAGS_N_ITEMS_CHECKED_IN_1="%d tag checked in."
COM_TAGS_N_ITEMS_CHECKED_IN_MORE="%d tags checked in."
COM_TAGS_N_ITEMS_DELETED="%d tags deleted."
COM_TAGS_N_ITEMS_DELETED_1="%d tag deleted."
COM_TAGS_N_ITEMS_FAILED_PUBLISHING="Failed publishing %d tags as at least one of their parents is unpublished or one of their children is checked out."
COM_TAGS_N_ITEMS_FAILED_PUBLISHING_1="Failed publishing %d tag as at least one of its parents is unpublished or one of its children is checked out."
COM_TAGS_N_ITEMS_PUBLISHED="%d tags published."
COM_TAGS_N_ITEMS_PUBLISHED_1="%d tag published."
COM_TAGS_N_ITEMS_TRASHED="%d tags trashed."
COM_TAGS_N_ITEMS_TRASHED_1="%d tag trashed."
COM_TAGS_N_ITEMS_UNPUBLISHED="%d tags unpublished."
COM_TAGS_N_ITEMS_UNPUBLISHED_1="%d tag unpublished."
COM_TAGS_NONE="None"
COM_TAGS_NUMBER_COLUMNS_DESC="Number of columns to arrange the tags in. Note that this may not be the number displayed if 12 does not divide evenly into it because display is based on a 12 column grid."
COM_TAGS_NUMBER_TAG_ITEMS_DESC="Shows the number of items with a given tag."
COM_TAGS_NUMBER_TAG_ITEMS_LABEL="Show Number of Items"
COM_TAGS_OPTIONS="Tag Options"
COM_TAGS_PAGINATION_OPTIONS="Pagination Options"
COM_TAGS_REBUILD_FAILURE="Failed rebuilding Tags tree data."
COM_TAGS_REBUILD_SUCCESS="Tags tree data rebuilt."
COM_TAGS_RIGHT="Right"
COM_TAGS_SAVE_SUCCESS="Tag saved."
COM_TAGS_SEARCH_TYPE_DESC="All will return items that have all of the tags. Any will return items that have at least one of the tags."
COM_TAGS_SEARCH_TYPE_LABEL="Match Type"
COM_TAGS_SELECT_TAGTYPE="- Select Tag Type -"
COM_TAGS_SHOW_ALL_TAGS_DESCRIPTION_DESC="Optional description to show at the top of the all tags list."
COM_TAGS_SHOW_ALL_TAGS_DESCRIPTION_LABEL="Heading Description"
COM_TAGS_SHOW_ALL_TAGS_IMAGE_DESC="Shows an image at the heading of the tags list."
COM_TAGS_SHOW_ALL_TAGS_IMAGE_LABEL="Show Heading Image"
COM_TAGS_SHOW_EMPTY_TAG_DESC="Show empty tags."
COM_TAGS_SHOW_ITEM_BODY_DESC="Show or hide the body text for the tagged items."
COM_TAGS_SHOW_ITEM_BODY_LABEL="Item Body"
COM_TAGS_SHOW_ITEM_DESCRIPTION_DESC="Show or hide the description for each tag listed."
COM_TAGS_SHOW_ITEM_DESCRIPTION_LABEL="Tag Descriptions"
COM_TAGS_SHOW_ITEM_IMAGE_DESC="Shows the first image for each item in the list."
COM_TAGS_SHOW_ITEM_IMAGE_LABEL="Item Images"
COM_TAGS_SHOW_TAG_BODY_DESC="For a layout with one tag, show the tag description."
COM_TAGS_SHOW_TAG_BODY_LABEL="Show Tag Description"
COM_TAGS_SHOW_TAG_DESCRIPTION_DESC="Show or hide the description for the tag (only used when a single tag is selected)."
COM_TAGS_SHOW_TAG_DESCRIPTION_LABEL="Tag Description"
COM_TAGS_SHOW_TAG_IMAGE_DESC="For a layout with one tag, show the image for the tag."
COM_TAGS_SHOW_TAG_IMAGE_LABEL="Tag Image"
COM_TAGS_SHOW_TAG_LIST_DESCRIPTION_LABEL="Description"
COM_TAGS_SHOW_TAG_TITLE_DESC="For a layout with one tag, show the tag name."
COM_TAGS_SHOW_TAG_TITLE_LABEL="Show Tag Name"
COM_TAGS_SUBSLIDER_DRILL_TAG_LIST_LABEL="Options for each item in the list."
COM_TAGS_TAG_FIELD_MODE_AJAX="AJAX"
COM_TAGS_TAG_FIELD_MODE_DESC="Ajax mode searches tags while typing and allows you on the fly tag creation. Nested tags show you a nested view with all the available tags."
COM_TAGS_TAG_FIELD_MODE_LABEL="Tag Entry Mode"
COM_TAGS_TAG_FIELD_MODE_NESTED="Nested"
COM_TAGS_TAG_LIST_DESCRIPTION_DESC="Optional description to show at the top of the list. For example, this can be used when you have a layout that includes more than one tag."
COM_TAGS_TAG_LIST_DESCRIPTION_LABEL="Layout Description"
COM_TAGS_TAG_LIST_FIELD_ITEM_DESCRIPTION_LABEL="Item Body"
COM_TAGS_TAG_LIST_ITEM_DESCRIPTION_DESC="Shows the body text for the individual items (depends on the source table)."
COM_TAGS_TAG_LIST_ITEM_HITS_DESC="Shows the number of hits for each individual item."
COM_TAGS_TAG_LIST_MEDIA_DESC="Select or upload the tag image (full image)."
COM_TAGS_TAG_LIST_MEDIA_LABEL="Image"
COM_TAGS_TAG_LIST_SHOW_DATE_DESC="Show Date"
COM_TAGS_TAG_LIST_SHOW_DATE_LABEL="Show  or hide a date column in the compact list layout. Select Hide to hide the date, or select which date you wish to show."
COM_TAGS_TAG_LIST_SHOW_HEADINGS_DESC="Show or hide the headings in the compact list layout."
COM_TAGS_TAG_LIST_SHOW_HEADINGS_LABEL="Table Headings"
COM_TAGS_TAG_LIST_SHOW_ITEM_IMAGE_DESC="Shows the image for each item."
COM_TAGS_TAG_LIST_SHOW_ITEM_IMAGE_LABEL="Item Image"
COM_TAGS_TAG_LIST_SHOW_ITEM_DESCRIPTION_DESC="Show or hide the description for each item in the list. The length may be limited using the Maximum Characters option."
COM_TAGS_TAG_LIST_SHOW_ITEM_DESCRIPTION_LABEL="Item Description"
COM_TAGS_TAG_VIEW_LIST_DESC="Displays a compact list of items with the selected tags."
COM_TAGS_TAG_VIEW_LIST_OPTION="List view options"
COM_TAGS_TAG_VIEW_LIST_TITLE="Tagged items list"
COM_TAGS_TAGGED_ITEMS_ACCESS="Access"
COM_TAGS_TAGGED_ITEMS_AUTHOR="Author"
COM_TAGS_TAGGED_ITEMS_DATE="Date"
COM_TAGS_TAGGED_ITEMS_ID="ID"
COM_TAGS_TAGGED_ITEMS_LANGUAGE="Language"
COM_TAGS_TAGGED_ITEMS_TITLE="Title"
COM_TAGS_XML_DESCRIPTION="This component manages tags."
JGLOBAL_NO_ITEM_SELECTED="No tags selected"
language/en-GB/en-GB.plg_system_ic_library.sys.ini000060400000001013152453623440016010 0ustar00; iCagenda
; Copyright (c)2014-2015 Cyril Rezé (Lyr!C) / JoomliC.com - All rights reserved.
; License GNU General Public License version 3 or later <http://www.gnu.org/licenses/gpl.html>
; Note : All ini files need to be saved as UTF-8
;
; PLG_SYSTEM_IC_LIBRARY	: plg_system_ic_library.sys.ini
; Translation Platform	: https://www.transifex.com/projects/p/icagenda/


PLG_SYSTEM_IC_LIBRARY = "System - iC Library"
PLG_SYSTEM_IC_LIBRARY_XML_DESCRIPTION = "This plugin allows to use classes of the iC Library (by Jooml!C)."
language/en-GB/en-GB.plg_system_fields.ini000060400000000533152453623440014330 0ustar00; Joomla! Project
; (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_FIELDS="System - Fields"
PLG_SYSTEM_FIELDS_XML_DESCRIPTION="The system fields plugin that is required to display the custom fields."
language/en-GB/en-GB.plg_editors-xtd_contact.sys.ini000060400000000622152453623440016253 0ustar00; Joomla! Project
; (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS-XTD_CONTACT="Button - Contact"
PLG_EDITORS-XTD_CONTACT_XML_DESCRIPTION="Displays a button to insert links to Contacts in an article. Displays a popup allowing you to choose the contact."
language/en-GB/en-GB.com_fields.ini000060400000020566152453623440012730 0ustar00; Joomla! Project
; (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_FIELDS="Fields"
COM_FIELDS_BATCH_GROUP_LABEL="To Move or Copy your selection please select a group."
COM_FIELDS_BATCH_GROUP_OPTION_NONE="- No Group -"
COM_FIELDS_ERROR_UNIQUE_NAME="Another Field has the same name (remember it may be a trashed item or it may be already present as a custom field in another extension)."
COM_FIELDS_FIELDS_FILTER_SEARCH_DESC="Search in field name, title or note. Prefix with ID: to search for a field ID. Prefix with AUTHOR: to search for a field author."
COM_FIELDS_FIELD_CLASS_DESC="The class attributes of the field in the edit form. If multiple classes are needed, list them with spaces."
COM_FIELDS_FIELD_CLASS_LABEL="Field Class"
COM_FIELDS_FIELD_DEFAULT_VALUE_DESC="The default value of the field."
COM_FIELDS_FIELD_DEFAULT_VALUE_LABEL="Default Value"
COM_FIELDS_FIELD_DESCRIPTION_DESC="A description of the field that will be displayed in the label tooltip."
COM_FIELDS_FIELD_DISPLAY_AFTER_DISPLAY="After Display"
COM_FIELDS_FIELD_DISPLAY_AFTER_TITLE="After Title"
COM_FIELDS_FIELD_DISPLAY_BEFORE_DISPLAY="Before Display"
COM_FIELDS_FIELD_DISPLAY_DESC="Joomla offers some content events which are triggered during the content creation process. This is the place to define how the custom fields should be integrated into content."
COM_FIELDS_FIELD_DISPLAY_LABEL="Automatic Display"
COM_FIELDS_FIELD_DISPLAY_NO_DISPLAY="Do not automatically display"
COM_FIELDS_FIELD_EDITABLE_IN_ADMIN="Administrator"
COM_FIELDS_FIELD_EDITABLE_IN_BOTH="Both"
COM_FIELDS_FIELD_EDITABLE_IN_DESC="On which part of the site should the field be editable?"
COM_FIELDS_FIELD_EDITABLE_IN_LABEL="Editable In"
COM_FIELDS_FIELD_EDITABLE_IN_SITE="Site"
COM_FIELDS_FIELD_FORMOPTIONS_HEADING="Form Options"
COM_FIELDS_FIELD_GROUP_DESC="The group this field belongs to."
COM_FIELDS_FIELD_GROUP_LABEL="Field Group"
COM_FIELDS_FIELD_IMAGE_ALT_DESC="Alternative text used for visitors without access to images."
COM_FIELDS_FIELD_IMAGE_ALT_LABEL="Alt Text"
COM_FIELDS_FIELD_IMAGE_DESC="Image label."
COM_FIELDS_FIELD_IMAGE_LABEL="Image"
COM_FIELDS_FIELD_INVALID_DEFAULT_VALUE="The default value is invalid."
COM_FIELDS_FIELD_LABEL_DESC="The label of the field to display."
COM_FIELDS_FIELD_LABEL_FORM_CLASS_DESC="The class of the label in the form."
COM_FIELDS_FIELD_LABEL_FORM_CLASS_LABEL="Label Class"
COM_FIELDS_FIELD_LABEL_LABEL="Label"
COM_FIELDS_FIELD_LABEL_RENDER_CLASS_DESC="The class of the label in the output."
COM_FIELDS_FIELD_LABEL_RENDER_CLASS_LABEL="Label Class"
COM_FIELDS_FIELD_LANGUAGE_DESC="Assign a language to this field."
COM_FIELDS_FIELD_LAYOUT_DESC="Choose an alternate layout."
COM_FIELDS_FIELD_LAYOUT_LABEL="Layout"
COM_FIELDS_FIELD_NOTE_DESC="An optional note for the field."
COM_FIELDS_FIELD_NOTE_LABEL="Note"
COM_FIELDS_FIELD_N_ITEMS_ARCHIVED="%d fields archived"
COM_FIELDS_FIELD_N_ITEMS_ARCHIVED_1="%d field archived"
COM_FIELDS_FIELD_N_ITEMS_CHECKED_IN="%d fields checked in"
COM_FIELDS_FIELD_N_ITEMS_CHECKED_IN_0="No field checked in"
COM_FIELDS_FIELD_N_ITEMS_CHECKED_IN_1="%d field checked in"
COM_FIELDS_FIELD_N_ITEMS_DELETED="%d fields deleted"
COM_FIELDS_FIELD_N_ITEMS_DELETED_1="%d field deleted"
COM_FIELDS_FIELD_N_ITEMS_PUBLISHED="%d fields published"
COM_FIELDS_FIELD_N_ITEMS_PUBLISHED_1="%d field published"
COM_FIELDS_FIELD_N_ITEMS_TRASHED="%d fields trashed"
COM_FIELDS_FIELD_N_ITEMS_TRASHED_1="%d field trashed"
COM_FIELDS_FIELD_N_ITEMS_UNPUBLISHED="%d fields unpublished"
COM_FIELDS_FIELD_N_ITEMS_UNPUBLISHED_1="%d field unpublished"
COM_FIELDS_FIELD_PERMISSION_DELETE_DESC="New setting for <strong>delete actions</strong> on this field and the calculated setting based on the parent extension and group permissions."
COM_FIELDS_FIELD_PERMISSION_EDITSTATE_DESC="New setting for <strong>edit state actions</strong> on this field and the calculated setting based on the parent extension and group permissions."
COM_FIELDS_FIELD_PERMISSION_EDITVALUE_DESC="Who can edit the custom field value in the form editor?"
COM_FIELDS_FIELD_PERMISSION_EDIT_DESC="New setting for <strong>edit actions</strong> on this field and the calculated setting based on the parent extension and group permissions."
COM_FIELDS_FIELD_PLACEHOLDER_DESC="Placeholder text which will appear inside the field as a hint to the user for the required input."
COM_FIELDS_FIELD_PLACEHOLDER_LABEL="Placeholder"
COM_FIELDS_FIELD_RENDEROPTIONS_HEADING="Render Options"
COM_FIELDS_FIELD_RENDER_CLASS_DESC="The class attributes of the field when the field is rendered. If multiple classes are needed, list them with spaces."
COM_FIELDS_FIELD_RENDER_CLASS_LABEL="Render Class"
COM_FIELDS_FIELD_REQUIRED_DESC="Is this a mandatory field?"
COM_FIELDS_FIELD_REQUIRED_LABEL="Required"
COM_FIELDS_FIELD_SAVE_SUCCESS="Field saved"
COM_FIELDS_FIELD_SHOWLABEL_DESC="Show or Hide the label when the field renders."
COM_FIELDS_FIELD_SHOWLABEL_LABEL="Show Label"
COM_FIELDS_FIELD_TYPE_DESC="The type of the field."
COM_FIELDS_FIELD_TYPE_LABEL="Type"
COM_FIELDS_FIELD_USE_GLOBAL="Use settings from Plugin"
COM_FIELDS_FIELD_VALUE_RENDER_CLASS_DESC="The class of the field value in the output."
COM_FIELDS_FIELD_VALUE_RENDER_CLASS_LABEL="Value Class"
COM_FIELDS_GROUPS_FILTER_SEARCH_DESC="Search in field group title. Prefix with ID: to search for a field group ID."
COM_FIELDS_GROUP_N_ITEMS_ARCHIVED="%d field groups archived"
COM_FIELDS_GROUP_N_ITEMS_ARCHIVED_1="%d field group archived"
COM_FIELDS_GROUP_N_ITEMS_CHECKED_IN="%d field groups checked in"
COM_FIELDS_GROUP_N_ITEMS_CHECKED_IN_0="No field group checked in"
COM_FIELDS_GROUP_N_ITEMS_CHECKED_IN_1="%d field group checked in"
COM_FIELDS_GROUP_N_ITEMS_DELETED="%d field groups deleted"
COM_FIELDS_GROUP_N_ITEMS_DELETED_1="%d field group deleted"
COM_FIELDS_GROUP_N_ITEMS_PUBLISHED="%d field groups published"
COM_FIELDS_GROUP_N_ITEMS_PUBLISHED_1="%d field group published"
COM_FIELDS_GROUP_N_ITEMS_TRASHED="%d field groups trashed"
COM_FIELDS_GROUP_N_ITEMS_TRASHED_1="%d field group trashed"
COM_FIELDS_GROUP_N_ITEMS_UNPUBLISHED="%d field groups unpublished"
COM_FIELDS_GROUP_N_ITEMS_UNPUBLISHED_1="%d field group unpublished"
COM_FIELDS_GROUP_PERMISSION_CREATE_DESC="New setting for <strong>create actions</strong> in this field group and the calculated setting based on the parent extension permissions."
COM_FIELDS_GROUP_PERMISSION_DELETE_DESC="New setting for <strong>delete actions</strong> on this field group and the calculated setting based on the parent extension permissions."
COM_FIELDS_GROUP_PERMISSION_EDITOWN_DESC="New setting for <strong>edit own actions</strong> on this field group and the calculated setting based on the parent extension permissions."
COM_FIELDS_GROUP_PERMISSION_EDITSTATE_DESC="New setting for <strong>edit state actions</strong> on this field group and the calculated setting based on the parent extension permissions."
COM_FIELDS_GROUP_PERMISSION_EDITVALUE_DESC="Who can edit the field value in the form editor."
COM_FIELDS_GROUP_PERMISSION_EDIT_DESC="New setting for <strong>edit actions</strong> on this field group and the calculated setting based on the parent extension permissions."
COM_FIELDS_GROUP_SAVE_SUCCESS="Field Group saved"
COM_FIELDS_MUSTCONTAIN_A_TITLE_FIELD="Field must have a title."
COM_FIELDS_MUSTCONTAIN_A_TITLE_GROUP="Field Group must have a title."
COM_FIELDS_SYSTEM_PLUGIN_NOT_ENABLED="The <a href="_QQ_"%s"_QQ_">System - Fields</a> plugin is disabled. Custom fields will not display until you enable this plugin."
COM_FIELDS_VIEW_FIELDS_BATCH_OPTIONS="Batch process the selected fields."
COM_FIELDS_VIEW_FIELDS_SELECT_CATEGORY="- Select Assigned Category -"
COM_FIELDS_VIEW_FIELDS_SELECT_GROUP="- Select Field Group -"
COM_FIELDS_VIEW_FIELDS_SORT_GROUP_ASC="Field Group ascending"
COM_FIELDS_VIEW_FIELDS_SORT_GROUP_DESC="Field Group descending"
COM_FIELDS_VIEW_FIELDS_SORT_TYPE_ASC="Type ascending"
COM_FIELDS_VIEW_FIELDS_SORT_TYPE_DESC="Type descending"
COM_FIELDS_VIEW_FIELDS_TITLE="%s: Fields"
COM_FIELDS_VIEW_FIELD_ADD_TITLE="%s: New Field"
COM_FIELDS_VIEW_FIELD_EDIT_TITLE="%s: Edit Field"
COM_FIELDS_VIEW_FIELD_FIELDSET_GENERAL="General"
COM_FIELDS_VIEW_GROUPS_BATCH_OPTIONS="Batch process the selected field groups."
COM_FIELDS_VIEW_GROUPS_TITLE="%s: Field Groups"
COM_FIELDS_VIEW_GROUP_ADD_TITLE="%s: New Field Group"
COM_FIELDS_VIEW_GROUP_EDIT_TITLE="%s: Edit Field Group"
COM_FIELDS_XML_DESCRIPTION="Component to manage custom fields."
language/en-GB/en-GB.plg_system_languagefilter.sys.ini000060400000000555152453623440016674 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_LANGUAGEFILTER="System - Language Filter"
PLG_SYSTEM_LANGUAGEFILTER_XML_DESCRIPTION="This plugin filters the displayed content depending on language."
language/en-GB/en-GB.plg_quickicon_eos310.ini000060400000005100152453623440014530 0ustar00; Joomla! Project
; (C) 2021 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_QUICKICON_EOS310="Quick Icon - Joomla 3.10 End Of Support Notification"
PLG_QUICKICON_EOS310_GROUPNAME_EOS="End Of Support"
PLG_QUICKICON_EOS310_GROUPNAME_INFO="Upgrade Information"
PLG_QUICKICON_EOS310_GROUPNAME_WARNING="Support Status"
PLG_QUICKICON_EOS310_MESSAGE_ERROR_SUPPORT_ENDED="<p>Support has ended for your version of Joomla 3.10. <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Migrate to Joomla 4</a> <span class=\"icon-new-tab\"></span>as soon as possible.</p>"
PLG_QUICKICON_EOS310_MESSAGE_ERROR_SUPPORT_ENDED_SHORT="Support has ended for Joomla 3.10 <span class=\"icon-new-tab\"></span>"
PLG_QUICKICON_EOS310_MESSAGE_INFO_01="<p>Joomla 4 has arrived! Find out all that Joomla 4 has to offer you. Check the landing page for <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Joomla 4 features</a> <span class=\"icon-new-tab\"></span>and improvements.</p>"
PLG_QUICKICON_EOS310_MESSAGE_INFO_01_SHORT="Joomla 4 has arrived! <span class=\"icon-new-tab\"></span>"
PLG_QUICKICON_EOS310_MESSAGE_INFO_02="<p>When is the time to migrate to Joomla 4? Once the extensions your site needs are compatible. Learn <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">how to use the Pre-Update Checker</a>. <span class=\"icon-new-tab\"></span></p>"
PLG_QUICKICON_EOS310_MESSAGE_INFO_02_SHORT="Use Pre-Update Check for extension compatibility <span class=\"icon-new-tab\"></span>"
PLG_QUICKICON_EOS310_MESSAGE_WARNING_SECURITY_ONLY="<p>Joomla 3.10 has entered security only mode. Support ends %1$s. Start <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">planning to migrate</a> <span class=\"icon-new-tab\"></span>to Joomla 4 today.</p>"
PLG_QUICKICON_EOS310_MESSAGE_WARNING_SECURITY_ONLY_SHORT="Joomla 3.10 to end support on %1$s. <span class=\"icon-new-tab\"></span>"
PLG_QUICKICON_EOS310_MESSAGE_WARNING_SUPPORT_ENDING="<p>Support ends on %1$s for Joomla 3.10. <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Migrate to Joomla 4</a> <span class=\"icon-new-tab\"></span>as soon as possible.</p>"
PLG_QUICKICON_EOS310_MESSAGE_WARNING_SUPPORT_ENDING_SHORT="End of support for Joomla 3.10 on %1$s. <span class=\"icon-new-tab\"></span>"
PLG_QUICKICON_EOS310_SNOOZE_BUTTON="Snooze this message for all users"
PLG_QUICKICON_EOS310_XML_DESCRIPTION="Checks for the end of support status of Joomla 3.10 and notifies you when visiting the Control Panel page."
language/en-GB/en-GB.plg_editors_tinymce.sys.ini000060400000000531152453623440015472 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS_TINYMCE="Editor - TinyMCE"
PLG_TINY_XML_DESCRIPTION="TinyMCE is a platform independent web based JavaScript HTML WYSIWYG Editor."
language/en-GB/en-GB.plg_quickicon_akeebabackup.sys.ini000060400000003030152453623440016731 0ustar00;; @package   akeebabackup
;; @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
;; @license   GNU General Public License version 3, or later

PLG_QUICKICON_AKEEBABACKUP="Quick Icon - Akeeba Backup Notification"
PLG_QUICKICON_AKEEBABACKUP_XML_DESCRIPTION="Displays an Akeeba Backup icon in your administrator back-end, notifying you when a backup is overdue (configurable)."

PLG_QUICKICON_AKEEBABACKUP_GROUP_DESC="The group of this plugin (this value is compared with the group value used in <strong>Quick Icons</strong> modules to inject icons)"
PLG_QUICKICON_AKEEBABACKUP_GROUP_LABEL="Group"

PLG_QUICKICON_AKEEBABACKUP_LBL_WARNINGS="Enable warning icon"
PLG_QUICKICON_AKEEBABACKUP_DESC_WARNINGS="When enabled, the Akeeba Backup logo icon displays a small warning sign if the backup is failed or outdated (see below)."
PLG_QUICKICON_AKEEBABACKUP_LBL_WARNFAILED="Warn on failed backups"
PLG_QUICKICON_AKEEBABACKUP_DESC_WARNFAILED="When both this and the previous options are enabled, a warning icon is displayed if the last backup is failed."
PLG_QUICKICON_AKEEBABACKUP_LBL_PERIOD="Stale backup time, in hours"
PLG_QUICKICON_AKEEBABACKUP_DESC_PERIOD="Assume that a backup is stale if this many hours have passed since the last successful backup. If the backup is stale, a warning icon is displayed if the first option is enabled."

PLG_QUICKICON_AKEEBABACKUP_PROFILE_LABEL="Backup Profile"
PLG_QUICKICON_AKEEBABACKUP_PROFILE_DESC="Choose the backup profile which will be used to take a full site backup when the backup icon is clicked."language/en-GB/en-GB.com_messages.ini000060400000011725152453623440013266 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_MESSAGES="Messaging"
COM_MESSAGES_ADD="New Private Message"
COM_MESSAGES_CONFIG_SAVED="Configuration saved."
COM_MESSAGES_CONFIGURATION="Messages: Options"
COM_MESSAGES_ERR_INVALID_USER="Invalid user"
COM_MESSAGES_ERR_SEND_FAILED="The user has locked their mailbox. Message failed."
COM_MESSAGES_ERROR_COULD_NOT_SEND_INVALID_RECIPIENT="The email message cannot be sent due to an invalid recipient address."
COM_MESSAGES_ERROR_COULD_NOT_SEND_INVALID_REPLYTO="The email message cannot be sent due to an invalid reply-to address."
COM_MESSAGES_ERROR_INVALID_FROM_USER="Invalid sender"
COM_MESSAGES_ERROR_INVALID_MESSAGE="Invalid message content"
COM_MESSAGES_ERROR_INVALID_SUBJECT="Invalid subject"
COM_MESSAGES_ERROR_INVALID_TO_USER="Invalid recipient"
COM_MESSAGES_ERROR_MISSING_ROOT_ASSET_GROUPS="Missing root asset groups to send notification."
COM_MESSAGES_ERROR_NO_GROUPS_SET_AS_SUPER_USER="There are no groups set with super user permissions."
COM_MESSAGES_ERROR_NO_USERS_SET_AS_SUPER_USER="There are no users set with super user permissions."
COM_MESSAGES_ERROR_RECIPIENT_NOT_AUTHORISED="Recipient is not authorised to receive messages."
COM_MESSAGES_FIELD_AUTO_PURGE_DESC="Automatically delete private messages after the given number of days."
COM_MESSAGES_FIELD_AUTO_PURGE_LABEL="Auto-delete Messages (days)"
COM_MESSAGES_FIELD_DATE_TIME_LABEL="Posted"
COM_MESSAGES_FIELD_LOCK_DESC="Lock your private message inbox."
COM_MESSAGES_FIELD_LOCK_LABEL="Lock Inbox"
COM_MESSAGES_FIELD_MAIL_ON_NEW_DESC="Email me when a new private message arrives."
COM_MESSAGES_FIELD_MAIL_ON_NEW_LABEL="Email New Messages"
COM_MESSAGES_FIELD_MESSAGE_DESC="You must enter a message."
COM_MESSAGES_FIELD_MESSAGE_LABEL="Message"
COM_MESSAGES_FIELD_SUBJECT_DESC="You must enter a subject."
COM_MESSAGES_FIELD_SUBJECT_LABEL="Subject"
COM_MESSAGES_FIELD_USER_ID_FROM_LABEL="From"
COM_MESSAGES_FIELD_USER_ID_TO_DESC="You must select a recipient."
COM_MESSAGES_FIELD_USER_ID_TO_LABEL="Recipient"
COM_MESSAGES_FILTER_SEARCH_LABEL="Search Messages"
COM_MESSAGES_FILTER_STATES_DESC="Filter by message state."
COM_MESSAGES_FILTER_STATES_LABEL="State"
COM_MESSAGES_HEADING_FROM="From"
COM_MESSAGES_HEADING_FROM_ASC="From ascending"
COM_MESSAGES_HEADING_FROM_DESC="From descending"
COM_MESSAGES_HEADING_READ="Read"
COM_MESSAGES_HEADING_READ_ASC="Read ascending"
COM_MESSAGES_HEADING_READ_DESC="Read descending"
COM_MESSAGES_HEADING_SUBJECT="Subject"
COM_MESSAGES_HEADING_SUBJECT_ASC="Subject ascending"
COM_MESSAGES_HEADING_SUBJECT_DESC="Subject descending"
COM_MESSAGES_INVALID_REPLY_ID="Invalid recipient"
COM_MESSAGES_MANAGER_MESSAGES="Private Messages"
COM_MESSAGES_MARK_AS_READ="Mark as Read"
COM_MESSAGES_MARK_AS_UNREAD="Mark as Unread"
COM_MESSAGES_MY_SETTINGS="My Settings"
COM_MESSAGES_N_ITEMS_DELETED="%d messages deleted."
COM_MESSAGES_N_ITEMS_DELETED_1="Message deleted."
COM_MESSAGES_N_ITEMS_PUBLISHED="%d messages marked as read."
COM_MESSAGES_N_ITEMS_PUBLISHED_1="Message marked as read."
COM_MESSAGES_N_ITEMS_TRASHED="%d messages trashed."
COM_MESSAGES_N_ITEMS_TRASHED_1="Message trashed."
COM_MESSAGES_N_ITEMS_UNPUBLISHED="%d messages marked as unread."
COM_MESSAGES_N_ITEMS_UNPUBLISHED_1="Message marked as unread."
COM_MESSAGES_NEW_MESSAGE="New Message from %1$s at %2$s"
; The following string is deprecated and will be removed in Joomla 4.0
COM_MESSAGES_NEW_MESSAGE_ARRIVED="A new private message has arrived from %s"
COM_MESSAGES_NO_ITEM_SELECTED="No messages selected."
COM_MESSAGES_OPTION_READ="Read"
COM_MESSAGES_OPTION_UNREAD="Unread"
COM_MESSAGES_PLEASE_LOGIN="Please log in to %s to read your message."
COM_MESSAGES_RE="Re:"
COM_MESSAGES_READ="Messages"
COM_MESSAGES_READ_PRIVATE_MESSAGE="Read Private Message"
COM_MESSAGES_SAVE_SUCCESS="Message sent."
COM_MESSAGES_SEARCH_IN_SUBJECT="Search in message subject and description."
COM_MESSAGES_TOOLBAR_MARK_AS_READ="Mark as Read"
COM_MESSAGES_TOOLBAR_MARK_AS_UNREAD="Mark as Unread"
COM_MESSAGES_TOOLBAR_MY_SETTINGS="My Settings"
COM_MESSAGES_TOOLBAR_REPLY="Reply"
COM_MESSAGES_TOOLBAR_SEND="Send"
COM_MESSAGES_VIEW_PRIVATE_MESSAGE="Private Messages: View"
COM_MESSAGES_WRITE_PRIVATE_MESSAGE="Private Messages: Write"
COM_MESSAGES_XML_DESCRIPTION="Component for private messaging support in Backend."
; The following string is deprecated and will be removed with 4.0.
JLIB_APPLICATION_SAVE_SUCCESS="Message sent."

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_MESSAGES="Changes apply to this component only.<br /><em><strong>Inherited</strong></em> - a Global Configuration setting or higher level setting is applied.<br /><em><strong>Denied</strong></em> always wins - whatever is set at the Global or higher level and applies to all child elements.<br /><em><strong>Allowed</strong></em> will enable the action for this component unless overruled by a Global Configuration setting."
language/en-GB/en-GB.plg_fields_text.ini000060400000001272152453623440013771 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_TEXT="Fields - Text"
PLG_FIELDS_TEXT_LABEL="Text (%s)"
PLG_FIELDS_TEXT_PARAMS_FILTER_DESC="Allow the system to save certain html tags or raw data."
PLG_FIELDS_TEXT_PARAMS_FILTER_LABEL="Filter"
PLG_FIELDS_TEXT_PARAMS_MAXLENGTH_LABEL="Maximum Length"
PLG_FIELDS_TEXT_PARAMS_MAXLENGTH_DESC="The maximum number of characters that can be entered."
PLG_FIELDS_TEXT_XML_DESCRIPTION="This plugin lets you create new fields of type 'text' in any extensions where custom fields are supported."
language/en-GB/en-GB.plg_editors-xtd_module.ini000060400000000635152453623440015274 0ustar00; Joomla! Project
; (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS-XTD_MODULE="Button - Module"
PLG_MODULE_BUTTON_MODULE="Module"
PLG_MODULE_XML_DESCRIPTION="Displays a button to insert a module into an Article. Displays a popup allowing you to choose the module."
language/en-GB/en-GB.plg_xmap_com_weblinks.ini000060400000002535152453623440015163 0ustar00XMAP_WL_PLUGIN_DESCRIPTION="Adds support for Weblinks component"
XMAP_WL_SETTING_SHOW_LINKS_LABEL="Show Links?"
XMAP_WL_SETTING_SHOW_LINKS_DESC="Should we include links into the site map?"
XMAP_WL_SETTING_MAX_LINKS_LABEL="Max links"
XMAP_WL_SETTING_MAX_LINKS_DESC="Max number of links per category to include on sitemap (Leave empty for no limit)"

; Generic Extension settings strings
COM_PLUGINS_BASIC_FIELDSET_LABEL="Basic Settings"
COM_PLUGINS_XML_FIELDSET_LABEL="XML Sitemap Settings"
COM_PLUGINS_NEWS_FIELDSET_LABEL="News Sitemap Settings"
XMAP_OPTION_USE_PARENT_MENU="Use Parent Menu Settings"
XMAP_OPTION_NEVER="Never"
XMAP_OPTION_ALWAYS="Always"
XMAP_OPTION_XML_ONLY="In XML Sitemap Only"
XMAP_OPTION_HTML_ONLY="In HTML Sitemap Only"
XMAP_OPTION_WEEKLY="Weekly"
XMAP_OPTION_DAILY="Daily"
XMAP_OPTION_MONTHLY="Monthly"
XMAP_OPTION_YEARLY="Yearly"
XMAP_OPTION_HOURLY="Hourly"

XMAP_WL_CATEGORY_PRIORITY_LABEL="Category Priority"
XMAP_WL_CATEGORY_PRIORITY_DESC="Set the priority for the categories"
XMAP_WL_CATEGORY_CHANGEFREQ_LABEL="Category Change frequency"
XMAP_WL_CATEGORY_CHANGEFREQ_DESC="Set the change frequency for the categories"
XMAP_WL_LINK_PRIORITY_LABEL="Link Priority"
XMAP_WL_LINK_PRIORITY_DESC="Set the priority for the links"
XMAP_WL_LINK_CHANGEFREQ_LABEL="Link Change frequency"
XMAP_WL_LINK_CHANGEFREQ_DESC="Set the change frequency for the links"language/en-GB/en-GB.plg_content_pagenavigation.sys.ini000060400000000566152453623440017027 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CONTENT_PAGENAVIGATION="Content - Page Navigation"
PLG_PAGENAVIGATION_XML_DESCRIPTION="Enables you to add <em>Next &amp; Previous</em> functionality to an Article."


language/en-GB/en-GB.com_checkin.ini000060400000003256152453623440013063 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_CHECKIN="Check-in"
COM_CHECKIN_CONFIGURATION="Check-in: Options"
COM_CHECKIN_DATABASE_TABLE="Database Table"
COM_CHECKIN_DATABASE_TABLE_ASC="Database Table ascending"
COM_CHECKIN_DATABASE_TABLE_DESC="Database Table descending"
COM_CHECKIN_FILTER_SEARCH_DESC="Search database tables with items to check-in."
COM_CHECKIN_FILTER_SEARCH_LABEL="Search Database Tables"
COM_CHECKIN_GLOBAL_CHECK_IN="Maintenance: Global Check-in"
COM_CHECKIN_ITEMS_TO_CHECK_IN="Items to check-in"
COM_CHECKIN_ITEMS_TO_CHECK_IN_ASC="Items to check-in ascending"
COM_CHECKIN_ITEMS_TO_CHECK_IN_DESC="Items to check-in descending"
COM_CHECKIN_N_ITEMS_CHECKED_IN_0="No item checked in."
COM_CHECKIN_N_ITEMS_CHECKED_IN_1="1 item checked in."
COM_CHECKIN_N_ITEMS_CHECKED_IN_MORE="%s items checked in."
COM_CHECKIN_NO_ITEMS="There are no tables with checked out items or there are no tables with checked out items that match your search."
COM_CHECKIN_TABLE="<em>%s</em> table"
COM_CHECKIN_XML_DESCRIPTION="Check-in Component."

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_CHECKIN="Changes apply to this component only.<br /><em><strong>Inherited</strong></em> - a Global Configuration setting or higher level setting is applied.<br /><em><strong>Denied</strong></em> always wins - whatever is set at the Global or higher level and applies to all child elements.<br /><em><strong>Allowed</strong></em> will enable the action for this component unless overruled by a Global Configuration setting."
language/en-GB/en-GB.plg_system_p3p.ini000060400000001232152453623440013561 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_P3P_XML_DESCRIPTION="The system P3P policy plugin allows Joomla! to send a customised string of P3P policy tags in the HTTP header. This is required for the sessions to work on certain browsers, ie Internet Explorer 6 and 7."
PLG_SYSTEM_P3P="System - P3P Policy"
PLG_P3P_HEADER_DESCRIPTION="Enter your P3P policy tags. For more information consult The Platform for Privacy Preferences specification, https://www.w3.org/TR/P3P/"
PLG_P3P_HEADER_LABEL="P3P Tags"language/en-GB/en-GB.com_checkin.sys.ini000060400000000663152453623440013677 0ustar00; Joomla! Project
; (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_CHECKIN="Check-in"
COM_CHECKIN_XML_DESCRIPTION="Check-in Component"

COM_CHECKIN_CHECKIN_VIEW_DEFAULT_DESC="Shows a list of checked out items from all components/tables."
COM_CHECKIN_CHECKIN_VIEW_DEFAULT_TITLE="Global Check-in"
language/en-GB/en-GB.com_media.ini000060400000016711152453623440012536 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_MEDIA="Media"
COM_MEDIA_ALIGN="Image Float"
COM_MEDIA_ALIGN_DESC="This will apply the classes 'pull-left', 'pull-center' or 'pull-right' to the '<figure>' or '<img>' element."
COM_MEDIA_BROWSE_FILES="Browse files"
COM_MEDIA_CAPTION="Caption"
COM_MEDIA_CAPTION_CLASS_LABEL="Caption Class"
COM_MEDIA_CAPTION_CLASS_DESC="This will apply the entered class to the '<figcaption>' element. For example: 'text-left', 'text-right', 'text-center'."
COM_MEDIA_CLEAR_LIST="Clear List"
COM_MEDIA_CONFIGURATION="Media: Options"
COM_MEDIA_CREATE_COMPLETE="Create Complete: %s"
COM_MEDIA_CREATE_FOLDER="Create Folder"
COM_MEDIA_CREATE_NEW_FOLDER="Create New Folder"
COM_MEDIA_CURRENT_PROGRESS="Current progress"
COM_MEDIA_DELETE_COMPLETE="Delete Complete: %s"
COM_MEDIA_DESCFTPTITLE="FTP Login Details"
COM_MEDIA_DESCFTP="To upload, change and delete media files, Joomla will most likely need your FTP account details. Please enter them in the form fields below."
COM_MEDIA_DETAIL_VIEW="Detail View"
COM_MEDIA_DIRECTORY="Folder"
COM_MEDIA_DIRECTORY_UP="Folder Up"
COM_MEDIA_ERROR_BAD_REQUEST="Bad Request"
COM_MEDIA_ERROR_BEFORE_DELETE_0="No error occurred before deleting the media."
COM_MEDIA_ERROR_BEFORE_DELETE_1="An error occurred before deleting the media: %2$s"
COM_MEDIA_ERROR_BEFORE_DELETE_MORE="Some errors occurred before deleting the media: %2$s"
COM_MEDIA_ERROR_BEFORE_SAVE_0="No error occurred before saving the media."
COM_MEDIA_ERROR_BEFORE_SAVE_1="An error occurred before saving the media: %2$s"
COM_MEDIA_ERROR_BEFORE_SAVE_MORE="Some errors occurred before saving the media: %2$s"
COM_MEDIA_ERROR_CREATE_NOT_PERMITTED="Create not permitted."
COM_MEDIA_ERROR_FILE_EXISTS="File already exists."
COM_MEDIA_ERROR_UNABLE_TO_CREATE_FOLDER_WARNDIRNAME="Unable to create folder. Folder name must only have alphanumeric characters and no spaces."
COM_MEDIA_ERROR_UNABLE_TO_BROWSE_FOLDER_WARNDIRNAME="Unable to browse:&#160;%s. Folder name must only have alphanumeric characters and no spaces."
COM_MEDIA_ERROR_UNABLE_TO_DELETE_FILE_WARNFILENAME="Unable to delete:&#160;%s. File name must only have alphanumeric characters and no spaces."
COM_MEDIA_ERROR_UNABLE_TO_DELETE_FOLDER_NOT_EMPTY="Unable to delete:&#160;%s. Folder is not empty!"
COM_MEDIA_ERROR_UNABLE_TO_DELETE_FOLDER_WARNDIRNAME="Unable to delete:&#160;%s."
COM_MEDIA_ERROR_UNABLE_TO_DELETE="Unable to delete:&#160;"
COM_MEDIA_ERROR_UNABLE_TO_UPLOAD_FILE="Unable to upload file."
COM_MEDIA_ERROR_UPLOAD_INPUT="Please input a file to upload."
COM_MEDIA_ERROR_WARNFILENAME="File name must only have alphanumeric characters and no spaces."
COM_MEDIA_ERROR_WARNFILENOTSAFE="You have tried to upload file(s) that are not safe."
COM_MEDIA_ERROR_WARNFILETOOLARGE="This file is too large to upload."
COM_MEDIA_ERROR_WARNFILETYPE="This file type is not supported."
COM_MEDIA_ERROR_WARNIEXSS="Possible IE XSS Attack found."
COM_MEDIA_ERROR_WARNINVALID_IMG="Not a valid image."
COM_MEDIA_ERROR_WARNINVALID_FOLDER="Invalid folder provided."
COM_MEDIA_ERROR_WARNINVALID_MIME="Illegal or invalid mime type detected."
COM_MEDIA_ERROR_WARNNOTADMIN="Uploaded file is not an image file and you are not a manager or higher."
COM_MEDIA_ERROR_WARNNOTEMPTY="Not empty!"
COM_MEDIA_ERROR_WARNUPLOADTOOLARGE="Total size of upload exceeds the limit."
COM_MEDIA_FIELD_CHECK_MIME_DESC="Use MIME Magic or Fileinfo to try to verify files. Try disabling this if you get invalid mime type errors."
COM_MEDIA_FIELD_CHECK_MIME_LABEL="Check MIME Types"
COM_MEDIA_FIELD_IGNORED_EXTENSIONS_DESC="Ignored file extensions for MIME type checking and restricted uploads."
COM_MEDIA_FIELD_IGNORED_EXTENSIONS_LABEL="Ignored Extensions"
COM_MEDIA_FIELD_ILLEGAL_MIME_TYPES_DESC="A comma separated list of illegal MIME types to upload (blacklist)."
COM_MEDIA_FIELD_ILLEGAL_MIME_TYPES_LABEL="Illegal MIME Types"
COM_MEDIA_FIELD_LEGAL_EXTENSIONS_DESC="Extensions (file types) you are allowed to upload (comma separated)."
COM_MEDIA_FIELD_LEGAL_EXTENSIONS_LABEL="Legal Extensions (File Types)"
COM_MEDIA_FIELD_LEGAL_IMAGE_EXTENSIONS_DESC="Image extensions (file types) you are allowed to upload (comma separated). These are used to check for valid image headers."
COM_MEDIA_FIELD_LEGAL_IMAGE_EXTENSIONS_LABEL="Legal Image Extensions (File Types)"
COM_MEDIA_FIELD_LEGAL_MIME_TYPES_DESC="A comma separated list of legal MIME types to upload."
COM_MEDIA_FIELD_LEGAL_MIME_TYPES_LABEL="Legal MIME Types"
COM_MEDIA_FIELD_MAXIMUM_SIZE_DESC="The maximum size for an upload (in megabytes). Use zero for no limit. Note: your server has a maximum limit."
COM_MEDIA_FIELD_MAXIMUM_SIZE_LABEL="Maximum Size (in MB)"
COM_MEDIA_FIELD_PATH_FILE_FOLDER_DESC="Enter the path to the files folder relative to the root of your webspace. Warning! Changing to another path than the default 'images' may break your links. Note: Do not start the path with a slash!"
COM_MEDIA_FIELD_PATH_FILE_FOLDER_LABEL="Path to Files Folder"
COM_MEDIA_FIELD_PATH_IMAGE_FOLDER_DESC="Enter the path to the images folder relative to the root of your webspace. This path <strong>has to be the same as path to files (default) or to a subfolder of the path to file folder.</strong>. Note: Do not start the path with a slash!"
COM_MEDIA_FIELD_PATH_IMAGE_FOLDER_LABEL="Path to Images Folder"
COM_MEDIA_FIELD_RESTRICT_UPLOADS_DESC="Restrict uploads for lower than manager users to images if Fileinfo or MIME Magic isn't installed."
COM_MEDIA_FIELD_RESTRICT_UPLOADS_LABEL="Restrict Uploads"
COM_MEDIA_FIELDSET_OPTIONS_LABEL="Media"
COM_MEDIA_FILES="Files"
COM_MEDIA_FILESIZE="File size"
COM_MEDIA_FOLDER="Folder"
COM_MEDIA_FOLDERS="Media Folders"
COM_MEDIA_FOLDERS_PATH_LABEL="<strong>Warning! Path Folder</strong><br />Changing the 'Path to files folder' from the default of 'images' may break your links.<br />The 'Path to images' folder has to be the same or a subfolder of 'Path to files'."
COM_MEDIA_IMAGE_DESCRIPTION="Image Description"
COM_MEDIA_IMAGE_DIMENSIONS="%1$s x %2$s"
COM_MEDIA_IMAGE_TITLE="%1$s - %2$s"
COM_MEDIA_IMAGE_URL="Image URL"
COM_MEDIA_INSERT_IMAGE="Insert Image"
COM_MEDIA_INSERT="Insert"
COM_MEDIA_INVALID_REQUEST="Invalid Request"
COM_MEDIA_MEDIA="Media"
COM_MEDIA_NAME="Image Name"
COM_MEDIA_NO_IMAGES_FOUND="No Images Found"
COM_MEDIA_NOT_SET="Not Set"
COM_MEDIA_OVERALL_PROGRESS="Overall Progress"
COM_MEDIA_PIXEL_DIMENSIONS="Dimensions (px)"
COM_MEDIA_PREVIEW="Preview"
COM_MEDIA_START_UPLOAD="Start Upload"
COM_MEDIA_THUMBNAIL_VIEW="Thumbnail View"
COM_MEDIA_TITLE="Image Title"
COM_MEDIA_UPLOAD_COMPLETE="Upload Complete: %s"
COM_MEDIA_UPLOAD_FILE="Upload file"
; The following two strings are deprecated with 3.7.0 and will be removed in 4.0
COM_MEDIA_UPLOAD_FILES="Upload files (Maximum Size: %s MB)"
COM_MEDIA_UPLOAD_FILES_NOLIMIT="Upload files (No maximum size)"
COM_MEDIA_UPLOAD_SUCCESSFUL="Upload Successful"
COM_MEDIA_UPLOAD="Upload"
COM_MEDIA_UP="Up"
COM_MEDIA_XML_DESCRIPTION="Component for managing site media"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_MEDIA="Changes apply to this component only.<br /><em><strong>Inherited</strong></em> - a Global Configuration setting or higher level setting is applied.<br /><em><strong>Denied</strong></em> always wins - whatever is set at the Global or higher level and applies to all child elements.<br /><em><strong>Allowed</strong></em> will enable the action for this component unless overruled by a Global Configuration setting."
language/en-GB/en-GB.tpl_isis.sys.ini000060400000001627152453623440013264 0ustar00; Joomla! Project
; (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

ISIS="Isis Administrator template"
TPL_ISIS_POSITION_BOTTOM="Bottom"
TPL_ISIS_POSITION_CPANEL="Cpanel"
TPL_ISIS_POSITION_CP_SHELL="Unused"
TPL_ISIS_POSITION_DEBUG="Debug"
TPL_ISIS_POSITION_FOOTER="Footer"
TPL_ISIS_POSITION_ICON="Quick Icons"
TPL_ISIS_POSITION_LOGIN="Login"
TPL_ISIS_POSITION_MENU="Menu"
TPL_ISIS_POSITION_POSTINSTALL="Postinstall"
TPL_ISIS_POSITION_STATUS="Status"
TPL_ISIS_POSITION_SUBMENU="Submenu"
TPL_ISIS_POSITION_TITLE="Title"
TPL_ISIS_POSITION_TOOLBAR="Toolbar"
TPL_ISIS_XML_DESCRIPTION="Continuing the Egyptian god/goddess theme (Khepri from 1.5 and Hathor from 1.6), Isis is the Joomla 3 administrator template based on Bootstrap and the launch of the Joomla User Interface library (JUI)."
language/en-GB/en-GB.plg_search_weblinks.ini000060400000000767152453623440014632 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SEARCH_WEBLINKS="Search - Web Links"
PLG_SEARCH_WEBLINKS_FIELD_SEARCHLIMIT_DESC="Number of search items to return."
PLG_SEARCH_WEBLINKS_FIELD_SEARCHLIMIT_LABEL="Search Limit"
PLG_SEARCH_WEBLINKS_WEBLINKS="Web Links"
PLG_SEARCH_WEBLINKS_XML_DESCRIPTION="Enables searching of Web Links Component."
language/en-GB/en-GB.com_banners.ini000060400000036246152453623440013114 0ustar00; Joomla! Project
; (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_BANNERS="Banners"
COM_BANNERS_BANNER_DETAILS="Details"
COM_BANNERS_BANNER_SAVE_SUCCESS="Banner saved."
COM_BANNERS_BANNERS_FILTER_SEARCH_DESC="Search in banner name and alias. Prefix with ID: to search for a banner ID."
COM_BANNERS_BANNERS_FILTER_SEARCH_LABEL="Search Banners"
COM_BANNERS_BANNERS_HTML_PIN_BANNER="Pinned banner"
COM_BANNERS_BANNERS_HTML_UNPIN_BANNER="Unpinned banner"
COM_BANNERS_BANNERS_N_ITEMS_ARCHIVED="%d banners archived."
COM_BANNERS_BANNERS_N_ITEMS_ARCHIVED_1="%d banner archived."
COM_BANNERS_BANNERS_N_ITEMS_CHECKED_IN_0="No banner checked in."
COM_BANNERS_BANNERS_N_ITEMS_CHECKED_IN_1="%d banner checked in."
COM_BANNERS_BANNERS_N_ITEMS_CHECKED_IN_MORE="%d banners checked in."
COM_BANNERS_BANNERS_N_ITEMS_DELETED="%d banners deleted."
COM_BANNERS_BANNERS_N_ITEMS_DELETED_1="%d banner deleted."
COM_BANNERS_BANNERS_N_ITEMS_PUBLISHED="%d banners published."
COM_BANNERS_BANNERS_N_ITEMS_PUBLISHED_1="%d banner published."
COM_BANNERS_BANNERS_N_ITEMS_TRASHED="%d banners trashed."
COM_BANNERS_BANNERS_N_ITEMS_TRASHED_1="%d banner trashed."
COM_BANNERS_BANNERS_N_ITEMS_UNPUBLISHED="%d banners unpublished."
COM_BANNERS_BANNERS_N_ITEMS_UNPUBLISHED_1="%d banner unpublished."
COM_BANNERS_BANNERS_NO_ITEM_SELECTED="No Banners selected."
COM_BANNERS_BANNERS_PINNED="Pinned Banner"
COM_BANNERS_BANNERS_UNPINNED="Unpinned Banner"
COM_BANNERS_BATCH_CLIENT_LABEL="Set Client"
COM_BANNERS_BATCH_CLIENT_LABEL_DESC="Not making a selection will keep the original client when processing."
COM_BANNERS_BATCH_CLIENT_NOCHANGE="- Keep original Client -"
COM_BANNERS_BATCH_OPTIONS="Batch process the selected banners"
COM_BANNERS_BATCH_TIP="If a category is selected for move/copy, any actions selected will be applied to the copied or moved banners. Otherwise, all actions are applied to the selected banners."
COM_BANNERS_BEGIN_DESC="Banner begin date"
COM_BANNERS_BEGIN_HINT="Begin date (yyyy-mm-dd)"
COM_BANNERS_BEGIN_LABEL="Begin Date"
COM_BANNERS_CANCEL="Cancel"
COM_BANNERS_CLICK="Click"
COM_BANNERS_CLIENT_SAVE_SUCCESS="Client saved."
COM_BANNERS_CLIENTS_FILTER_SEARCH_DESC="Search in client name. Prefix with ID: to search for a client ID."
COM_BANNERS_CLIENTS_FILTER_SEARCH_LABEL="Search Clients"
COM_BANNERS_CLIENTS_N_ITEMS_ARCHIVED="%d clients archived."
COM_BANNERS_CLIENTS_N_ITEMS_ARCHIVED_1="%d client archived."
COM_BANNERS_CLIENTS_N_ITEMS_CHECKED_IN_0="No client checked in."
COM_BANNERS_CLIENTS_N_ITEMS_CHECKED_IN_1="%d client checked in."
COM_BANNERS_CLIENTS_N_ITEMS_CHECKED_IN_MORE="%d clients checked in."
COM_BANNERS_CLIENTS_N_ITEMS_DELETED="%d clients deleted."
COM_BANNERS_CLIENTS_N_ITEMS_DELETED_1="%d client deleted."
COM_BANNERS_CLIENTS_N_ITEMS_PUBLISHED="%d clients published."
COM_BANNERS_CLIENTS_N_ITEMS_PUBLISHED_1="%d client published."
COM_BANNERS_CLIENTS_N_ITEMS_TRASHED="%d clients trashed."
COM_BANNERS_CLIENTS_N_ITEMS_TRASHED_1="%d client trashed."
COM_BANNERS_CLIENTS_N_ITEMS_UNPUBLISHED="%d clients unpublished."
COM_BANNERS_CLIENTS_N_ITEMS_UNPUBLISHED_1="%d client unpublished."
COM_BANNERS_CLIENTS_NO_ITEM_SELECTED="No clients selected."
COM_BANNERS_CONFIGURATION="Banners: Options"
COM_BANNERS_COUNT_ARCHIVED_ITEMS="Archived banners"
COM_BANNERS_COUNT_PUBLISHED_ITEMS="Published banners"
COM_BANNERS_COUNT_TRASHED_ITEMS="Trashed banners"
COM_BANNERS_COUNT_UNPUBLISHED_ITEMS="Unpublished banners"
COM_BANNERS_DEFAULT="Default (%s)"
COM_BANNERS_DELETE_MSG="Are you sure you want to delete all these tracks?"
COM_BANNERS_EDIT_BANNER="Edit Banner"
COM_BANNERS_EDIT_CLIENT="Details"
COM_BANNERS_END_DESC="Banner end date"
COM_BANNERS_END_HINT="End date (yyyy-mm-dd)"
COM_BANNERS_END_LABEL="End Date"
COM_BANNERS_ERR_ZIP_ADAPTER_FAILURE="Zip adapter failure"
COM_BANNERS_ERR_ZIP_CREATE_FAILURE="Zip create failure"
COM_BANNERS_ERR_ZIP_DELETE_FAILURE="Zip delete failure"
COM_BANNERS_ERROR_UNIQUE_ALIAS="Another Banner from this category has the same alias (remember it may be a trashed item)."
COM_BANNERS_EXTRA="Additional Information"
COM_BANNERS_FIELD_ALIAS_DESC="The alias is for internal use only. Leave this blank and Joomla will fill in a default value from the title. It has to be unique for each banner in the same category."
COM_BANNERS_FIELD_ALT_DESC="Alternative text used for visitors without access to images."
COM_BANNERS_FIELD_ALT_LABEL="Alt Text"
COM_BANNERS_FIELD_BANNEROWNPREFIX_DESC="Use own prefix or the client prefix."
COM_BANNERS_FIELD_BANNEROWNPREFIX_LABEL="Use Own Prefix"
COM_BANNERS_FIELD_BASENAME_DESC="File name pattern which can have<br />__SITE__ for the site name<br />__CATID__ for the category ID<br />__CATNAME__ for the category name<br />__CLIENTID__ for the client ID<br />__CLIENTNAME__ for the client name<br />__TYPE__ for the type<br />__TYPENAME__ for the type name<br />__BEGIN__ for the begin date<br />__END__ for the end date."
COM_BANNERS_FIELD_BASENAME_LABEL="File Name"
COM_BANNERS_FIELD_CATEGORY_DESC="Choose a category for this banner."
COM_BANNERS_FIELD_CLICKS_DESC="Displays the number of clicks on the banner. Select reset if desired."
COM_BANNERS_FIELD_CLICKS_LABEL="Total Clicks"
COM_BANNERS_FIELD_CLICKURL_DESC="The URL used when the banner is clicked on."
COM_BANNERS_FIELD_CLICKURL_LABEL="Click URL"
COM_BANNERS_FIELD_CLIENT_DESC="Choose a client for this banner."
COM_BANNERS_FIELD_CLIENT_LABEL="Client"
COM_BANNERS_FIELD_CLIENT_METAKEYWORDPREFIX_DESC="When matching Meta keywords, only search for Meta keywords with this prefix (improves performance)."
COM_BANNERS_FIELD_CLIENT_METAKEYWORDPREFIX_LABEL="Meta Keyword Prefix"
COM_BANNERS_FIELD_CLIENT_METAKEYWORDS_DESC="Enter the meta keywords for the clients' banners."
COM_BANNERS_FIELD_CLIENT_NAME_DESC="Enter a name for the client."
COM_BANNERS_FIELD_CLIENT_NAME_LABEL="Client Name"
COM_BANNERS_FIELD_CLIENT_STATE_DESC="Defines the status of the client."
COM_BANNERS_FIELD_CLIENTOWNPREFIX_DESC="Use own prefix or the component prefix."
COM_BANNERS_FIELD_CLIENTOWNPREFIX_LABEL="Use Own Prefix"
COM_BANNERS_FIELD_COMPRESSED_DESC="Option to compress file for export."
COM_BANNERS_FIELD_COMPRESSED_LABEL="Compressed"
COM_BANNERS_FIELD_CONTACT_DESC="Enter the name of a user as contact."
COM_BANNERS_FIELD_CONTACT_LABEL="Contact Name"
COM_BANNERS_FIELD_CREATED_BY_ALIAS_DESC="Enter an alias to be displayed instead of the name of the user who created the banner."
COM_BANNERS_FIELD_CREATED_BY_ALIAS_LABEL="Created by Alias"
COM_BANNERS_FIELD_CREATED_BY_DESC="Select the name of the user who created the banner."
COM_BANNERS_FIELD_CREATED_BY_LABEL="Created By"
COM_BANNERS_FIELD_CREATED_DESC="Banner created date."
COM_BANNERS_FIELD_CREATED_LABEL="Created Date"
COM_BANNERS_FIELD_CUSTOMCODE_DESC="Enter your custom code for the banner."
COM_BANNERS_FIELD_CUSTOMCODE_LABEL="Custom Code"
COM_BANNERS_FIELD_DESCRIPTION_DESC="Enter a description for the banner."
COM_BANNERS_FIELD_EMAIL_DESC="Enter a valid Contact email."
COM_BANNERS_FIELD_EMAIL_LABEL="Contact Email"
COM_BANNERS_FIELD_EXTRAINFO_DESC="Enter extra information for this client."
COM_BANNERS_FIELD_EXTRAINFO_LABEL="Additional Information"
COM_BANNERS_FIELD_HEIGHT_DESC="The height of the banner."
COM_BANNERS_FIELD_HEIGHT_LABEL="Height"
COM_BANNERS_FIELD_IMAGE_DESC="Select or upload an image for this banner."
COM_BANNERS_FIELD_IMAGE_LABEL="Image"
COM_BANNERS_FIELD_IMPMADE_DESC="Displays the number of impressions made for the banner."
COM_BANNERS_FIELD_IMPMADE_LABEL="Total Impressions"
COM_BANNERS_FIELD_IMPTOTAL_DESC="Total limit of impressions defined for the banner."
COM_BANNERS_FIELD_IMPTOTAL_LABEL="Max. Impressions"
COM_BANNERS_FIELD_LANGUAGE_DESC="Assign a language to this banner."
COM_BANNERS_FIELD_METAKEYWORDPREFIX_DESC="When matching Meta keywords, only search for Meta keywords with this prefix (improves performance)."
COM_BANNERS_FIELD_METAKEYWORDPREFIX_LABEL="Meta Keyword Prefix"
COM_BANNERS_FIELD_METAKEYWORDS_DESC="Enter the meta keywords for the banner."
COM_BANNERS_FIELD_MODIFIED_BY_DESC="Name of the user who modified this banner."
COM_BANNERS_FIELD_NAME_DESC="Enter a name for the banner."
COM_BANNERS_FIELD_NAME_LABEL="Name"
COM_BANNERS_FIELD_PUBLISH_DOWN_DESC="An optional date to Finish Publishing the banner."
COM_BANNERS_FIELD_PUBLISH_DOWN_LABEL="Finish Publishing"
COM_BANNERS_FIELD_PUBLISH_UP_DESC="An optional date to Start Publishing the banner."
COM_BANNERS_FIELD_PUBLISH_UP_LABEL="Start Publishing"
COM_BANNERS_FIELD_PURCHASETYPE_DESC="Select the type of purchase in the list."
COM_BANNERS_FIELD_PURCHASETYPE_LABEL="Purchase Type"
COM_BANNERS_FIELD_STATE_DESC="Defines the status of the banner."
COM_BANNERS_FIELD_STICKY_DESC="Whether or not the Banner is 'pinned'. If one or more Banners in a Category are pinned, they will take priority over Banners that are not pinned. For example, if two Banners in a Category are pinned and a third Banner is not pinned, the third Banner will not display if the module setting is 'Pinned, Randomise'. Only the two pinned Banners will display."
COM_BANNERS_FIELD_STICKY_LABEL="Pinned"
COM_BANNERS_FIELD_TRACKCLICK_DESC="Record the number of clicks on the banners on a daily basis."
COM_BANNERS_FIELD_TRACKCLICK_LABEL="Track Clicks"
COM_BANNERS_FIELD_TRACKIMPRESSION_DESC="Record the impressions (views) of the banners on a daily basis."
COM_BANNERS_FIELD_TRACKIMPRESSION_LABEL="Track Impressions"
COM_BANNERS_FIELD_TRACKROBOTSIMPRESSION_DESC="Include search engines in the count of impressions."
COM_BANNERS_FIELD_TRACKROBOTSIMPRESSION_LABEL="Impressions by Search Engines"
COM_BANNERS_FIELD_TYPE_DESC="Choose the type of banner. Select Image to display an image. Select Custom to enter your custom code."
COM_BANNERS_FIELD_TYPE_LABEL="Type"
; The following five strings are deprecated and will be removed with 4.0. They generate wrong plural detection in Crowdin.
COM_BANNERS_FIELD_VALUE_1="Unlimited"
COM_BANNERS_FIELD_VALUE_2="Yearly"
COM_BANNERS_FIELD_VALUE_3="Monthly"
COM_BANNERS_FIELD_VALUE_4="Weekly"
COM_BANNERS_FIELD_VALUE_5="Daily"
COM_BANNERS_FIELD_VALUE_UNLIMITED="Unlimited"
COM_BANNERS_FIELD_VALUE_YEARLY="Yearly"
COM_BANNERS_FIELD_VALUE_MONTHLY="Monthly"
COM_BANNERS_FIELD_VALUE_WEEKLY="Weekly"
COM_BANNERS_FIELD_VALUE_DAILY="Daily"
COM_BANNERS_FIELD_VALUE_CUSTOM="Custom"
COM_BANNERS_FIELD_VALUE_IMAGE="Image"
COM_BANNERS_FIELD_VALUE_USECLIENTDEFAULT="-- Use Client Default --"
COM_BANNERS_FIELD_VALUE_USECOMPONENTDEFAULT="-- Use Component Default --"
COM_BANNERS_FIELD_VERSION_LABEL="Revision"
COM_BANNERS_FIELD_VERSION_DESC="A count of the number of times this banner has been revised."
COM_BANNERS_FIELD_WIDTH_LABEL="Width"
COM_BANNERS_FIELD_WIDTH_DESC="The width of the banner."
COM_BANNERS_FIELDSET_CONFIG_BANNER_OPTIONS_DESC="These settings apply to version history for Banners, Banner Categories and Banner Clients."
COM_BANNERS_FIELDSET_CONFIG_BANNER_OPTIONS_LABEL="History"
COM_BANNERS_FIELDSET_CONFIG_CLIENT_OPTIONS_LABEL="Client"
COM_BANNERS_FIELDSET_CONFIG_CLIENT_OPTIONS_DESC="These settings apply for all clients unless they are changed for a specific client."
COM_BANNERS_FILENAME="%1$s-banners-tracks-%2$s"
COM_BANNERS_GROUP_LABEL_PUBLISHING_DETAILS="Publishing Options"
COM_BANNERS_GROUP_LABEL_BANNER_DETAILS="Banner Details"
COM_BANNERS_HEADING_ACTIVE="Active"
COM_BANNERS_HEADING_ACTIVE_ASC="Active ascending"
COM_BANNERS_HEADING_ACTIVE_DESC="Active descending"
COM_BANNERS_HEADING_BANNERS="Banners"
COM_BANNERS_HEADING_BANNERS_ASC="Banners ascending"
COM_BANNERS_HEADING_BANNERS_DESC="Banners descending"
COM_BANNERS_HEADING_CLICKS="Clicks"
COM_BANNERS_HEADING_CLICKS_ASC="Clicks ascending"
COM_BANNERS_HEADING_CLICKS_DESC="Clicks descending"
COM_BANNERS_HEADING_CLIENT="Client"
COM_BANNERS_HEADING_CLIENT_ASC="Client ascending"
COM_BANNERS_HEADING_CLIENT_DESC="Client descending"
COM_BANNERS_HEADING_CONTACT="Contact"
COM_BANNERS_HEADING_CONTACT_ASC="Contact ascending"
COM_BANNERS_HEADING_CONTACT_DESC="Contact descending"
COM_BANNERS_HEADING_COUNT="Count"
COM_BANNERS_HEADING_COUNT_ASC="Count ascending"
COM_BANNERS_HEADING_COUNT_DESC="Count descending"
COM_BANNERS_HEADING_IMPRESSIONS="Impressions"
COM_BANNERS_HEADING_IMPRESSIONS_ASC="Impressions ascending"
COM_BANNERS_HEADING_IMPRESSIONS_DESC="Impressions descending"
COM_BANNERS_HEADING_METAKEYWORDS="Meta Keywords"
COM_BANNERS_HEADING_NAME="Name"
COM_BANNERS_HEADING_NAME_ASC="Name ascending"
COM_BANNERS_HEADING_NAME_DESC="Name descending"
COM_BANNERS_HEADING_PURCHASETYPE="Purchase Type"
COM_BANNERS_HEADING_PURCHASETYPE_ASC="Purchase Type ascending"
COM_BANNERS_HEADING_PURCHASETYPE_DESC="Purchase Type descending"
COM_BANNERS_HEADING_STICKY="Pinned"
COM_BANNERS_HEADING_STICKY_ASC="Pinned ascending"
COM_BANNERS_HEADING_STICKY_DESC="Pinned descending"
COM_BANNERS_HEADING_TYPE="Type"
COM_BANNERS_HEADING_TYPE_ASC="Type ascending"
COM_BANNERS_HEADING_TYPE_DESC="Type descending"
COM_BANNERS_IMPRESSION="Impression"
COM_BANNERS_IMPRESSIONS="%1$s of %2$s"
COM_BANNERS_MANAGER="Banners"
COM_BANNERS_MANAGER_BANNER_EDIT="Banners: Edit"
COM_BANNERS_MANAGER_BANNER_NEW="Banners: New"
COM_BANNERS_MANAGER_BANNERS="Banners"
COM_BANNERS_MANAGER_CLIENT_EDIT="Banners: Edit Client"
COM_BANNERS_MANAGER_CLIENT_NEW="Banners: New Client"
COM_BANNERS_MANAGER_CLIENTS="Banners: Clients"
COM_BANNERS_MANAGER_TRACKS="Banners: Tracks"
COM_BANNERS_METADATA="Metadata"
COM_BANNERS_FIELD_MODIFIED_DESC="The date and time that the banner was last modified."
COM_BANNERS_N_BANNERS_STUCK="%d banners pinned."
COM_BANNERS_N_BANNERS_STUCK_1="%d banner pinned."
COM_BANNERS_N_BANNERS_UNSTUCK="%d banners unpinned."
COM_BANNERS_N_BANNERS_UNSTUCK_1="%d banner unpinned."
COM_BANNERS_NEW_BANNER="New Banner"
COM_BANNERS_NEW_CLIENT="New Client"
COM_BANNERS_NO_BANNERS_SELECTED="No banners selected."
COM_BANNERS_NO_CLIENT="- No client -"
COM_BANNERS_NO_CLIENTS_SELECTED="No clients selected."
COM_BANNERS_NOCATEGORYNAME="No category"
COM_BANNERS_NOCLIENTNAME="No client"
COM_BANNERS_RESET_CLICKS="Reset clicks"
COM_BANNERS_RESET_IMPMADE="Reset impressions"
COM_BANNERS_SEARCH_IN_TITLE="Search in title"
COM_BANNERS_SELECT_CLIENT="- Select Client -"
COM_BANNERS_SELECT_TYPE="- Select Type -"
COM_BANNERS_SUBMENU_BANNERS="Banners"
COM_BANNERS_SUBMENU_CATEGORIES="Categories"
COM_BANNERS_SUBMENU_CLIENTS="Clients"
COM_BANNERS_SUBMENU_TRACKS="Tracks"
COM_BANNERS_TRACKS_DELETE="Delete Tracks"
COM_BANNERS_TRACKS_DOWNLOAD="Download tracks"
COM_BANNERS_TRACKS_EXPORT="Export"
COM_BANNERS_TRACKS_FILTER_SEARCH_DESC="Search in track name and track client name."
COM_BANNERS_TRACKS_FILTER_SEARCH_LABEL="Search Tracks"
COM_BANNERS_TRACKS_NO_ITEMS_DELETED="No Tracks to Delete."
COM_BANNERS_TRACKS_N_ITEMS_DELETED="%d tracks deleted."
COM_BANNERS_TRACKS_N_ITEMS_DELETED_1="%d track deleted."
COM_BANNERS_TYPE1="Impressions"
COM_BANNERS_TYPE2="Clicks"
COM_BANNERS_UNLIMITED="Unlimited"
COM_BANNERS_XML_DESCRIPTION="This component manages banners and banner clients."

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_BANNERS="Changes apply to this component only.<br /><em><strong>Inherited</strong></em> - a Global Configuration setting or higher level setting is applied.<br /><em><strong>Denied</strong></em> always wins - whatever is set at the Global or higher level and applies to all child elements.<br /><em><strong>Allowed</strong></em> will enable the action for this component unless overruled by a Global Configuration setting."
language/en-GB/en-GB.mod_stats_admin.ini000060400000002210152453623440013753 0ustar00; Joomla! Project
; (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_STATS_ADMIN="Statistics"
MOD_STATS_ARTICLES="Articles"
MOD_STATS_ARTICLES_VIEW_HITS="Articles View Hits"
MOD_STATS_CACHING="Caching"
MOD_STATS_FIELD_COUNTER_DESC="Display hit counter."
MOD_STATS_FIELD_COUNTER_LABEL="Hit Counter"
MOD_STATS_FIELD_INCREASECOUNTER_DESC="Enter the number of hits to increase the counter by."
MOD_STATS_FIELD_INCREASECOUNTER_LABEL="Increase Counter"
MOD_STATS_FIELD_SERVERINFO_DESC="Display server information."
MOD_STATS_FIELD_SERVERINFO_LABEL="Server Information"
MOD_STATS_FIELD_SITEINFO_DESC="Display site information."
MOD_STATS_FIELD_SITEINFO_LABEL="Site Information"
MOD_STATS_GZIP="Gzip"
MOD_STATS_MYSQL="MySQL"
MOD_STATS_OS="OS"
MOD_STATS_PHP="PHP"
MOD_STATS_TIME="Time"
MOD_STATS_USERS="Users"
MOD_STATS_WEBLINKS="Web Links"
MOD_STATS_XML_DESCRIPTION="The Statistics Module shows information about your server installation together with statistics on the website users and the number of Articles in your database."
language/en-GB/en-GB.plg_editors_none.ini000060400000000454152453623440014150 0ustar00; Joomla! Project
; (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS_NONE="Editor - None"
PLG_NONE_XML_DESCRIPTION="This loads a basic text entry field."
language/en-GB/en-GB.com_plugins.sys.ini000060400000000650152453623440013750 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_PLUGINS="Plugins"
COM_PLUGINS_PLUGINS_VIEW_DEFAULT_DESC="Shows a list of plugins to manage"
COM_PLUGINS_PLUGINS_VIEW_DEFAULT_TITLE="Plugin Manager"
COM_PLUGINS_XML_DESCRIPTION="This component manages Joomla plugins."
language/en-GB/en-GB.plg_system_backuponupdate.ini000060400000002256152453623440016073 0ustar00;; @package   akeebabackup
;; @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
;; @license   GNU General Public License version 3, or later

PLG_SYSTEM_BACKUPONUPDATE_TITLE="System - Backup on update"
PLG_SYSTEM_BACKUPONUPDATE_DESCRIPTION="Allows you to automatically take a backup with Akeeba Backup before updating Joomla!&trade; with its built-in Joomla! Update component."

PLG_SYSTEM_BACKUPONUPDATE_LBL_TITLE="Backup on Update – Powered by Akeeba Backup"
PLG_SYSTEM_BACKUPONUPDATE_LBL_CONTENT_ACTIVE="Akeeba Backup will automatically take a backup of your site before Joomla!&trade; is updated."
PLG_SYSTEM_BACKUPONUPDATE_LBL_CONTENT_INACTIVE="Akeeba Backup will <strong>NOT</strong> take a backup of your site before Joomla!&trade; is updated."
PLG_SYSTEM_BACKUPONUPDATE_LBL_TOGGLE_ACTIVATE="Enable automatic backups"
PLG_SYSTEM_BACKUPONUPDATE_LBL_TOGGLE_DEACTIVATE="Disable automatic backups"
PLG_SYSTEM_BACKUPONUPDATE_LBL_CONTENT_TIP="Tip: If you want to permanently disable this feature please unpublish the System - Backup on Update plugin."

PLG_SYSTEM_BACKUPONUPDATE_DEFAULT_DESCRIPTION="Automatic backup before updating Joomla! [VERSION_FROM] to [VERSION_TO]"language/en-GB/en-GB.plg_finder_weblinks.sys.ini000060400000000761152453623440015443 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FINDER_STATISTICS_WEB_LINK="Web Link"
PLG_FINDER_WEBLINKS="Smart Search - Web Links"
PLG_FINDER_WEBLINKS_ERROR_ACTIVATING_PLUGIN="Could not automatically activate the &quot;Smart Search - Web Links&quot; plugin."
PLG_FINDER_WEBLINKS_XML_DESCRIPTION="This plugin indexes Joomla! Web Links."
language/en-GB/en-GB.plg_system_updatenotification.ini000060400000011722152453623440016755 0ustar00; Joomla! Project
; (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_UPDATENOTIFICATION="System - Joomla! Update Notification"
PLG_SYSTEM_UPDATENOTIFICATION_EMAIL_LBL="Super User Emails"
PLG_SYSTEM_UPDATENOTIFICATION_EMAIL_DESC="A comma separated list of the email addresses which will receive the update notification emails. The addresses in the list MUST belong to existing users of your site who have the Super User privilege. If none of the listed emails belongs to Super Users, or if it's left blank, all Super Users of this site will receive the update notification email."
; You can use the following merge codes:
; [NEWVERSION]		New Joomla! version, e.g. 1.2.3
; [CURVERSION]		Currently installed Joomla! version, e.g. 1.2.0
; [SITENAME]		Site name, as set in Global Configuration.
; [URL]				URL of the site's frontend page.
; [LINK]			Update URL (link to com_joomlaupdate, will request login if the Super User isn't already logged in).
; [RELEASENEWS]		URL to the release news on joomla.org
; \n				Newline character. Use it to start a new line in the email.
PLG_SYSTEM_UPDATENOTIFICATION_EMAIL_SUBJECT="Joomla! Update available for [SITENAME] – [URL]"
PLG_SYSTEM_UPDATENOTIFICATION_EMAIL_BODY="This email IS NOT sent by the Joomla! project. It is sent automatically by your own site,\n[SITENAME] - [URL] \n\n================================================================================\nUPDATE INFORMATION\n================================================================================\n\nYour site has discovered that there is an updated version of Joomla! available for download.\n\nJoomla! version currently installed:        [CURVERSION]\nJoomla! version available for installation: [NEWVERSION]\n\nThis email is sent to you by your site to remind you of this fact.\nThe Joomla! project will never contact you directly about available updates of Joomla! on your site.\n\n================================================================================\nUPDATE INSTRUCTIONS\n================================================================================\n\nTo install the update on [SITENAME] please select the following link. (If the URL is not a link, copy & paste it to your browser).\n\nUpdate link: [LINK]\n\nRelease News can be found here: [RELEASENEWS]\n\n================================================================================\nWHY AM I RECEIVING THIS EMAIL?\n================================================================================\n\nThis email has been automatically sent by a plugin provided by Joomla!, the software which powers your site.\nThis plugin looks for updated versions of Joomla! and sends an email notification to its administrators.\nYou will receive several similar emails from your site until you either update the software or disable these emails.\n\nTo disable these emails, please unpublish the 'System - Joomla! Update Notification' plugin in the Plugin Manager on your site.\n\nIf you do not understand what Joomla! is and what you need to do please do not contact the Joomla! project.\nThey are NOT sending you this email and they cannot help you. Instead, please contact the person who built or manages your site.\n\nIf you are the person who built or manages your website, please note that this plugin may have been activated automatically when you installed or updated Joomla! on your site.\n\n================================================================================\nWHO SENT ME THIS EMAIL?\n================================================================================\n\nThis email is sent to you by your own site, [SITENAME]"
PLG_SYSTEM_UPDATENOTIFICATION_LANGUAGE_OVERRIDE_LBL="Email Language"
PLG_SYSTEM_UPDATENOTIFICATION_LANGUAGE_OVERRIDE_DESC="Select a language for the update notification emails. Set to Auto to send them in the site language at the time."
PLG_SYSTEM_UPDATENOTIFICATION_LANGUAGE_OVERRIDE_NONE="Auto"
PLG_SYSTEM_UPDATENOTIFICATION_POSTINSTALL_UPDATECACHETIME="The Joomla! Update Notification will not run in this configuration"
PLG_SYSTEM_UPDATENOTIFICATION_POSTINSTALL_UPDATECACHETIME_BODY="In your Installer Configuration you have set the Option Update Cache (in Hours) to 0 this means that Joomla is not caching the Update. This means an email should be sent on every page visit but this is not possible. Please increase the value (6 is default) or confirm that the Joomla! Update Notification will never send you mails."
PLG_SYSTEM_UPDATENOTIFICATION_POSTINSTALL_UPDATECACHETIME_ACTION="Set it back to the default setting (6 Hours)"
PLG_SYSTEM_UPDATENOTIFICATION_XML_DESCRIPTION="This plugin periodically checks for the availability of new Joomla! versions. When one is found it will send you an email, reminding you to update Joomla!. Pro Tip: You can customise the email message by overriding the language string keys PLG_SYSTEM_UPDATENOTIFICATION_EMAIL_SUBJECT and PLG_SYSTEM_UPDATENOTIFICATION_EMAIL_BODY."
language/en-GB/install.xml000060400000001232152453623440011411 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension version="3.9" client="administrator" type="language" method="upgrade">
	<name>English (en-GB)</name>
	<tag>en-GB</tag>
	<version>3.10.12</version>
	<creationDate>July 2023</creationDate>
	<author>Joomla! Project</author>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<copyright>(C) 2013 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<description>en-GB administrator language</description>
	<files>
		<folder>/</folder>
		<filename file="meta">install.xml</filename>
	</files>
	<params />
</extension>
language/en-GB/en-GB.mod_multilangstatus.ini000060400000000530152453623440014710 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_MULTILANGSTATUS="Multilingual Status"
MOD_MULTILANGSTATUS_XML_DESCRIPTION="This module shows the status of the multilingual parameters."
language/en-GB/en-GB.plg_finder_contacts.sys.ini000060400000000754152453623440015445 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FINDER_CONTACTS="Smart Search - Contacts"
PLG_FINDER_CONTACTS_ERROR_ACTIVATING_PLUGIN="Could not automatically activate the &quot;Smart Search - Contacts&quot; plugin."
PLG_FINDER_CONTACTS_XML_DESCRIPTION="This plugin indexes Joomla! Contacts."
PLG_FINDER_STATISTICS_CONTACT="Contact"
language/en-GB/en-GB.com_redirect.ini000060400000015216152453623440013257 0ustar00; Joomla! Project
; (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_REDIRECT="Redirects"
COM_REDIRECT_ADVANCED_OPTIONS="Advanced"
COM_REDIRECT_BATCH_OPTIONS="Bulk process to add new URLs"
COM_REDIRECT_BATCH_TIP="Enter expired URL (mandatory) with a new URL (optional) separated with %1$s (eg old-url%1$snew-url). Each line one entry!"
COM_REDIRECT_BULK_SEPARATOR_DESC="The separator used for bulk import, by default it is '|' but it can be ',' for a copy / paste from a CSV file for instance."
COM_REDIRECT_BULK_SEPARATOR_LABEL="Bulk Import Separator"
COM_REDIRECT_BUTTON_UPDATE_LINKS="Update Links"
COM_REDIRECT_CLEAR_FAIL="Failed to delete disabled links."
COM_REDIRECT_CLEAR_SUCCESS="All disabled links have been deleted."
COM_REDIRECT_COLLECT_MODAL_URLS_DISABLED="%1$s The 'Collect URLs' option in the %2$s is disabled. Error page URLs will not be collected by this component."
COM_REDIRECT_COLLECT_URLS_ENABLED="%1$s The option 'Collect URLs' is enabled."
; The following string is deprecated and will be removed with 4.0.
COM_REDIRECT_COLLECT_URLS_DISABLED="The 'Collect URLs' option in the <a href="_QQ_"%s"_QQ_">Redirect System Plugin</a> is disabled. Error page URLs will not be collected by this component."
COM_REDIRECT_CONFIGURATION="Redirect: Options"
COM_REDIRECT_DEFAULT_IMPORT_STATE_DESC="When batch importing redirects, enable or disable by default."
COM_REDIRECT_DEFAULT_IMPORT_STATE_LABEL="Import State"
COM_REDIRECT_DISABLE_LINK="Disable Link"
COM_REDIRECT_EDIT_LINK="Edit Link #%d"
COM_REDIRECT_EDIT_PLUGIN_SETTINGS="Edit Plugin Settings"
COM_REDIRECT_ENABLE_LINK="Enable Link"
COM_REDIRECT_ERROR_DESTINATION_URL_REQUIRED="The redirect must have a destination URL"
COM_REDIRECT_ERROR_DUPLICATE_OLD_URL="The source URL must be unique."
COM_REDIRECT_ERROR_DUPLICATE_URLS="The source and destination URLs can't be the same."
COM_REDIRECT_ERROR_SOURCE_URL_REQUIRED="The redirect must have a source URL."
COM_REDIRECT_FILTER_SEARCH_DESC="Search in expired URL, new URL, referring page and comment. Prefix with ID: to search for a link ID."
COM_REDIRECT_FILTER_SEARCH_LABEL="Search Links"
COM_REDIRECT_FILTER_FILTER_HTTP_HEADER_LABEL="HTTP Status Code"
COM_REDIRECT_FILTER_FILTER_HTTP_HEADER_DESC="Filter by the redirect HTTP Status Code."
COM_REDIRECT_FILTER_SELECT_OPTION_HTTP_HEADER="- Select HTTP Status Code -"
COM_REDIRECT_FIELD_COMMENT_DESC="Sometimes it is helpful to describe the URLs for redirect management later on."
COM_REDIRECT_FIELD_COMMENT_LABEL="Comment"
COM_REDIRECT_FIELD_CREATED_DATE_LABEL="Created Date"
COM_REDIRECT_FIELD_NEW_URL_DESC="Enter the URL to be redirected to."
COM_REDIRECT_BATCH_UPDATE_WITH_NEW_URL="Batch update new URL(s)"
COM_REDIRECT_FIELD_NEW_URL_LABEL="New URL"
COM_REDIRECT_FIELD_OLD_URL_DESC="Enter the URL that has to be redirected."
COM_REDIRECT_FIELD_OLD_URL_LABEL="Expired URL"
COM_REDIRECT_FIELD_REFERRER_LABEL="Link Referrer"
COM_REDIRECT_FIELD_REDIRECT_STATUS_CODE_LABEL="Redirect Status Code"
COM_REDIRECT_FIELD_REDIRECT_STATUS_CODE_DESC="Choose the HTTP 1.1 status code to associate with the redirect."
COM_REDIRECT_FIELD_UPDATED_DATE_LABEL="Last Updated Date"
COM_REDIRECT_HEADING_CREATED_DATE="Created Date"
COM_REDIRECT_HEADING_CREATED_DATE_ASC="Created Date ascending"
COM_REDIRECT_HEADING_CREATED_DATE_DESC="Created Date descending"
COM_REDIRECT_HEADING_HITS="404 Hits"
COM_REDIRECT_HEADING_HITS_ASC="404 Hits ascending"
COM_REDIRECT_HEADING_HITS_DESC="404 Hits descending"
COM_REDIRECT_HEADING_NEW_URL="New URL"
COM_REDIRECT_HEADING_NEW_URL_ASC="New URL ascending"
COM_REDIRECT_HEADING_NEW_URL_DESC="New URL descending"
COM_REDIRECT_HEADING_OLD_URL="Expired URL"
COM_REDIRECT_HEADING_OLD_URL_ASC="Expired URL ascending"
COM_REDIRECT_HEADING_OLD_URL_DESC="Expired URL descending"
COM_REDIRECT_HEADING_REFERRER="Referring Page"
COM_REDIRECT_HEADING_REFERRER_ASC="Referring Page ascending"
COM_REDIRECT_HEADING_REFERRER_DESC="Referring Page descending"
COM_REDIRECT_HEADING_STATUS_CODE="Status Code"
COM_REDIRECT_HEADING_STATUS_CODE_ASC="Status Code ascending"
COM_REDIRECT_HEADING_STATUS_CODE_DESC="Status Code descending"
COM_REDIRECT_HEADING_UPDATE_LINKS="Update selected links to the following new URL."
COM_REDIRECT_MANAGER_LINK="Redirects: New/Edit"
COM_REDIRECT_MANAGER_LINK_EDIT="Redirects: Edit"
COM_REDIRECT_MANAGER_LINK_NEW="Redirects: New"
COM_REDIRECT_MANAGER_LINKS="Redirects: Links"
COM_REDIRECT_MODE_LABEL="Activate Advanced Mode"
COM_REDIRECT_MODE_DESC="Enable more advanced functionality for the component. Only use this if you know what you're doing."
COM_REDIRECT_N_ITEMS_ARCHIVED="%d links archived."
COM_REDIRECT_N_ITEMS_ARCHIVED_1="Link archived."
COM_REDIRECT_N_ITEMS_DELETED="%d links deleted."
COM_REDIRECT_N_ITEMS_DELETED_1="Link deleted."
COM_REDIRECT_N_ITEMS_PUBLISHED="%d links enabled."
COM_REDIRECT_N_ITEMS_PUBLISHED_1="Link enabled."
COM_REDIRECT_N_ITEMS_TRASHED="%d links trashed."
COM_REDIRECT_N_ITEMS_TRASHED_1="Link trashed."
COM_REDIRECT_N_ITEMS_UNPUBLISHED="%d links disabled."
COM_REDIRECT_N_ITEMS_UNPUBLISHED_1="Link disabled."
COM_REDIRECT_N_LINKS_ADDED="%d links added."
COM_REDIRECT_N_LINKS_ADDED_1="1 link has been added."
COM_REDIRECT_N_LINKS_UPDATED="%d links updated."
COM_REDIRECT_N_LINKS_UPDATED_1="1 link has been updated."
COM_REDIRECT_NEW_LINK="New Link"
COM_REDIRECT_NO_ITEM_ADDED="No links added."
COM_REDIRECT_NO_ITEM_SELECTED="No links selected."
COM_REDIRECT_NO_SEPARATOR_FOUND="The separator %s was not found in your import."
; The following string is deprecated and will be removed with 4.0.
COM_REDIRECT_PLUGIN_DISABLED="The <a href="_QQ_"%s"_QQ_">Redirect System Plugin</a> is disabled. It needs to be enabled for this component to work."
COM_REDIRECT_PLUGIN_ENABLED="The Redirect Plugin is enabled."
COM_REDIRECT_PLUGIN_MODAL_DISABLED="The %s is disabled. It needs to be enabled for this component to work."
COM_REDIRECT_REDIRECTED_ON="Redirected on: %s."
COM_REDIRECT_SAVE_SUCCESS="Link saved."
COM_REDIRECT_SEARCH_LINKS="Search in link fields."
COM_REDIRECT_SYSTEM_PLUGIN="Redirect System Plugin"
COM_REDIRECT_TOOLBAR_PURGE="Purge Disabled"
COM_REDIRECT_XML_DESCRIPTION="This component implements link redirection."

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_REDIRECT="Changes apply to this component only.<br /><em><strong>Inherited</strong></em> - a Global Configuration setting or higher level setting is applied.<br /><em><strong>Denied</strong></em> always wins - whatever is set at the Global or higher level and applies to all child elements.<br /><em><strong>Allowed</strong></em> will enable the action for this component unless overruled by a Global Configuration setting."
language/en-GB/en-GB.com_messages.sys.ini000060400000000613152453623440014075 0ustar00; Joomla! Project
; (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_MESSAGES="Messaging"
COM_MESSAGES_ADD="New Private Message"
COM_MESSAGES_READ="Read Private Messages"
COM_MESSAGES_XML_DESCRIPTION="Component for private messaging support in the Backend."language/en-GB/en-GB.plg_content_finder.sys.ini000060400000000570152453623440015275 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_CONTENT_FINDER="Content - Smart Search"
PLG_CONTENT_FINDER_XML_DESCRIPTION="Changes to content will not update the Smart Search index if you do not enable this plugin."
language/en-GB/en-GB.plg_sampledata_blog.ini000060400000021314152453623440014574 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SAMPLEDATA_BLOG="Sample Data - Blog"
PLG_SAMPLEDATA_BLOG_OVERVIEW_DESC="Sample data which will set up a blog site.<br>If the site is multilingual, the data will be tagged to the active backend language."
PLG_SAMPLEDATA_BLOG_OVERVIEW_TITLE="Blog Sample data"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_0_FULLTEXT=""
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_0_INTROTEXT="<p>This tells you a bit about this blog and the person who writes it. </p><p>When you are logged in you will be able to edit this page by selecting the edit icon.</p>"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_0_TITLE="About"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_1_FULLTEXT=""
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_1_INTROTEXT="<p>Here are some basic tips for working on your site.</p><ul><li>Joomla! has a 'front end' that you are looking at now and an 'administrator' or 'back end' which is where you do the more advanced work of creating your site such as setting up the menus and deciding what modules to show. You need to login to the administrator separately using the same user name and password that you used to login to this part of the site.</li><li>One of the first things you will probably want to do is change the site title and tag line and to add a logo. To do this select the Template Settings link in the top menu. To change your site description, browser title, default email and other items, select Site Settings. More advanced configuration options are available in the administrator.</li><li>To totally change the look of your site you will probably want to install a new template. In the Extensions menu select Extensions Manager and then go to the Install tab. There are many free and commercial templates available for Joomla.</li><li>As you have already seen, you can control who can see different parts of you site. When you work with modules, articles or weblinks setting the Access level to Registered will mean that only logged in users can see them</li><li>When you create a new article or other kind of content you also can save it as Published or Unpublished. If it is Unpublished site visitors will not be able to see it but you will.</li><li>You can learn much more about working with Joomla from the <a href='https://docs.joomla.org/'>Joomla documentation site</a> and get help from other users at the <a href='https://forum.joomla.org/'>Joomla forums</a>. In the administrator there are help buttons on every page that provide detailed information about the functions on that page.</li></ul>"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_1_TITLE="Working on Your Site"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_2_FULLTEXT=""
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_2_INTROTEXT="<p>This is a sample blog posting.</p><p>If you log in to the site (the Author Login link is on the very bottom of this page) you will be able to edit it and all of the other existing articles. You will also be able to create a new article and make other changes to the site.</p><p>As you add and modify articles you will see how your site changes and also how you can customise it in various ways.</p><p>Go ahead, you can't break it.</p>"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_2_TITLE="Welcome to your blog"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_3_FULLTEXT="<p>On the full page you will see both the introductory content and the rest of the article. You can change the settings to hide the introduction if you want.</p><p></p><p></p><p></p>"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_3_INTROTEXT="<p>Your home page is set to display the four most recent articles from the blog category in a column. Then there are links to the next two oldest articles. You can change those numbers by editing the content options settings in the blog tab in your site administrator. There is a link to your site administrator in the top menu.</p><p>If you want to have your blog post broken into two parts, an introduction and then a full length separate page, use the Read More button to insert a break.</p>"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_3_TITLE="About your home page"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_4_FULLTEXT=""
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_4_INTROTEXT="<p>Your site has some commonly used modules already preconfigured. These include:</p><ul><li>Image Module which holds the image beneath the menu. This is a Custom module that you can edit to change the image.</li><li>Most Read Posts which lists articles based on the number of times they have been read.</li><li>Older Articles which lists out articles by month.</li><li>Syndicate which allows your readers to read your posts in a news reader.</li><li>Popular Tags, which will appear if you use tagging on your articles. Enter a tag in the Tags field when editing.</li></ul><p>Each of these modules has many options which you can experiment with in the Module Manager in your site Administrator. Moving your mouse over a module and selecting the edit icon will take you to an edit screen for that module. Always be sure to save and close any module you edit.</p><p>Joomla! also includes many other modules you can incorporate in your site. As you develop your site you may want to add more module that you can find at the <a href='https://extensions.joomla.org/'>Joomla Extensions Directory.</a></p>"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_4_TITLE="Your Modules"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_5_FULLTEXT=""
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_5_INTROTEXT="<p>Templates control the look and feel of your website.</p><p>This blog is installed with the Protostar template.</p><p>You can edit the options by selecting the Working on Your Site, Template Settings link in the top menu (visible when you login).</p><p>For example you can change the site background color, highlights color, site title, site description and title font used.</p><p>More options are available in the site administrator. You may also install a new template using the extension manager.</p>"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_5_TITLE="Your Template"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_CATEGORY_0_TITLE="Blog"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_CATEGORY_1_TITLE="Help"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_0_TITLE="Blog"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_1_TITLE="About"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_2_TITLE="Author Login"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_3_TITLE="Create a Post"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_4_TITLE="Working on Your Site"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_5_TITLE="Site Administrator"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_6_TITLE="Change Password"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_7_TITLE="Log out"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_8_TITLE="Author Login"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_9_TITLE="Site Settings"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_10_TITLE="Template Settings"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_MENU_0_DESCRIPTION="The main menu for the site"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_MENU_0_TITLE="Main Menu Blog"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_MENU_1_DESCRIPTION=""
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_MENU_1_TITLE="Author Menu"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_MENU_2_DESCRIPTION=""
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_MENU_2_TITLE="Bottom Menu"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_0_TITLE="Main Menu Blog"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_1_TITLE="Author Menu"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_2_TITLE="Syndication"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_3_TITLE="Archived Articles"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_4_TITLE="Most Read Posts"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_5_TITLE="Older Posts"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_6_TITLE="Bottom Menu"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_7_TITLE="Search"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_8_TITLE="Image"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_9_TITLE="Popular Tags"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_10_TITLE="Similar Items"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_11_TITLE="Site Information"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_12_TITLE="Release News"
PLG_SAMPLEDATA_BLOG_STEP_FAILED="Step %1$u Failed: %2$s"
PLG_SAMPLEDATA_BLOG_STEP_SKIPPED="Step %1$u Skipped: '%2$s' is either not installed or disabled."
PLG_SAMPLEDATA_BLOG_STEP1_SUCCESS="Step 1: Articles done!"
PLG_SAMPLEDATA_BLOG_STEP2_SUCCESS="Step 2: Menus done!"
PLG_SAMPLEDATA_BLOG_STEP3_SUCCESS="Step 3: Modules done!"
PLG_SAMPLEDATA_BLOG_XML_DESCRIPTION="Provides the blog sample data. Can be installed using the sample data module."
language/en-GB/en-GB.plg_privacy_content.sys.ini000060400000000557152453623440015510 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_PRIVACY_CONTENT="Privacy - Content"
PLG_PRIVACY_CONTENT_XML_DESCRIPTION="Responsible for processing privacy related requests for the core Joomla content data."
language/en-GB/en-GB.plg_system_googlic_analytics.sys.ini000060400000001366152453623440017376 0ustar00; GoogliC Analytics en-GB
; @version	$version 1.2.3 JoomliC 2012-05-20$
; @author	JoomliC <info@joomlic.com>
; @link		http://www.joomlic.com

PLG_SYSTEM_GOOGLIC_ANALYTICS="System - GoogliC Analytics"
PLG_SYSTEM_GOOGLIC_ANALYTICS_XML_DESCRIPTION="<iframe src="_QQ_"http://www.joomlic.com/infosic/googlic/en_googlic_analytics_124.html"_QQ_" frameborder="_QQ_"0"_QQ_" height="_QQ_"250"_QQ_" width="_QQ_"100%"_QQ_"></iframe><br/><br/><a href="_QQ_"index.php?option=com_plugins&view=plugins&filter_search=GoogliC"_QQ_">Activate the plugin</a> and insert your web-property ID to establish the statistics of your site.<br/><br/><i><small>System Plugin GoogliC Analytics by Jooml!C - <a href='http://www.joomlic.com' target='_blanck'>www.joomlic.com</a></small></i>"language/en-GB/en-GB.plg_privacy_actionlogs.sys.ini000060400000000557152453623440016200 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_PRIVACY_ACTIONLOGS="Privacy - Action Logs"
PLG_PRIVACY_ACTIONLOGS_XML_DESCRIPTION="Responsible for exporting the action log data for a user's privacy request."
language/en-GB/en-GB.plg_fields_usergrouplist.ini000060400000001371152453623440015734 0ustar00; Joomla! Project
; (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_USERGROUPLIST="Fields - Usergrouplist"
PLG_FIELDS_USERGROUPLIST_DEFAULT_VALUE_DESC="A comma separated list of user group ids."
PLG_FIELDS_USERGROUPLIST_DEFAULT_VALUE_LABEL="Default User Groups"
PLG_FIELDS_USERGROUPLIST_LABEL="User Groups (%s)"
PLG_FIELDS_USERGROUPLIST_PARAMS_MULTIPLE_DESC="Allow multiple values to be selected."
PLG_FIELDS_USERGROUPLIST_PARAMS_MULTIPLE_LABEL="Multiple"
PLG_FIELDS_USERGROUPLIST_XML_DESCRIPTION="This plugin lets you create new fields of type 'usergrouplist' in any extensions where custom fields are supported."
language/en-GB/en-GB.plg_system_fields.sys.ini000060400000000533152453623440015145 0ustar00; Joomla! Project
; (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_FIELDS="System - Fields"
PLG_SYSTEM_FIELDS_XML_DESCRIPTION="The system fields plugin that is required to display the custom fields."
language/en-GB/en-GB.com_login.sys.ini000060400000000446152453623440013402 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_LOGIN="Login"
COM_LOGIN_XML_DESCRIPTION="This component lets users login to the site."
language/en-GB/en-GB.mod_latestactions.ini000060400000001260152453623440014326 0ustar00; Joomla! Project
; (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_LATESTACTIONS="Action Logs - Latest"
MOD_LATESTACTIONS_FIELD_COUNT_LABEL="Count"
MOD_LATESTACTIONS_FIELD_COUNT_DESC="The number of items to display (default 5)."
MOD_LATESTACTIONS_LAYOUT_DEFAULT="Default"
MOD_LATEST_ACTIONS_NO_MATCHING_RESULTS="No Matching Results"
MOD_LATESTACTIONS_TITLE="Last Actions"
MOD_LATESTACTIONS_TITLE_1="Last Action"
MOD_LATESTACTIONS_TITLE_MORE="Last %s Actions"
MOD_LATESTACTIONS_XML_DESCRIPTION="This module shows a list of the most recent actions."
language/en-GB/en-GB.com_weblinks.sys.ini000060400000002470152453623440014107 0ustar00; Joomla! Project
; (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

COM_WEBLINKS="Web Links"
COM_WEBLINKS_CATEGORIES="Categories"
COM_WEBLINKS_CATEGORIES_VIEW_DEFAULT_DESC="Show all the web link categories within a category."
COM_WEBLINKS_CATEGORIES_VIEW_DEFAULT_OPTION="Default"
COM_WEBLINKS_CATEGORIES_VIEW_DEFAULT_TITLE="List All Web Link Categories"
COM_WEBLINKS_CATEGORY_ADD_TITLE="Category Manager: Add A New Web Links Category"
COM_WEBLINKS_CATEGORY_EDIT_TITLE="Category Manager: Edit A Web Links Category"
COM_WEBLINKS_CATEGORY_VIEW_DEFAULT_DESC="Displays a list of Web Links for a category."
COM_WEBLINKS_CATEGORY_VIEW_DEFAULT_OPTION="Default"
COM_WEBLINKS_CATEGORY_VIEW_DEFAULT_TITLE="List Web Links in a Category"
COM_WEBLINKS_CONTENT_TYPE_WEBLINK="Web Link"
COM_WEBLINKS_CONTENT_TYPE_CATEGORY="Web Links Category"
COM_WEBLINKS_FORM_VIEW_DEFAULT_DESC="Display a form to submit a web link in the Frontend."
COM_WEBLINKS_FORM_VIEW_DEFAULT_OPTION="Default"
COM_WEBLINKS_FORM_VIEW_DEFAULT_TITLE="Submit a Web Link"
COM_WEBLINKS_LINKS="Links"
COM_WEBLINKS_TAGS_WEBLINK="Web Link"
COM_WEBLINKS_TAGS_CATEGORY="Web Link Category"
COM_WEBLINKS_XML_DESCRIPTION="Component for web links management."

language/fr-FR/fr-FR.plg_system_updatenotification.ini000060400000013537152453623440017033 0ustar00; @date        2015-10-28
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters, Inc. (https://www.joomla.org)
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SYSTEM_UPDATENOTIFICATION="Système - Notification de Mise à jour de Joomla!"
PLG_SYSTEM_UPDATENOTIFICATION_EMAIL_LBL="E-mails des Super Utilisateurs"
PLG_SYSTEM_UPDATENOTIFICATION_EMAIL_DESC="Une liste d'adresses e-mail, séparées par une virgule, qui recevront l'e-mail de notification de mise à jour. Les adresses de cette liste DOIVENT appartenir à des Super Utilisateurs. Si aucune des adresses n'appartient à un Super Utilisateur ou si le champ n'est pas rempli, tous les Super Utilisateurs du site recevront l'e-mail."
; You can use the following merge codes:
; [NEWVERSION]		New Joomla! version, e.g. 1.2.3
; [CURVERSION]		Currently installed Joomla! version, e.g. 1.2.0
; [SITENAME]		Site name, as set in Global Configuration.
; [URL]				URL of the site's frontend page.
; [LINK]			Update URL (link to com_joomlaupdate, will request login if the Super User isn't already logged in).
; [RELEASENEWS]		URL to the release news on joomla.org
; \n				Newline character. Use it to start a new line in the email.
PLG_SYSTEM_UPDATENOTIFICATION_EMAIL_SUBJECT="Mise à jour de Joomla disponible pour [SITENAME] – [URL]"
PLG_SYSTEM_UPDATENOTIFICATION_EMAIL_BODY="Cet e-mail n'est pas envoyé par le projet Joomla!. Il est envoyé automatiquement par votre propre site,\n[SITENAME] - [URL]\n\n================================================================================\nINFORMATION DE MISE À JOUR \n================================================================================\n\nVotre site a découvert qu'une nouvelle version de Joomla! était disponible au téléchargement.\n\nVersion de Joomla! installée:  [CURVERSION]\nVersion de Joomla! disponible à installer : [NEWVERSION]\n\nCet e-mail est envoyé par votre site à titre de rappel.\n Le projet Joomla! ne vous contactera jamais directement pour vous prévenir de la disponibilité d'une mise à jour de Joomla! sur votre site. \n\n================================================================================\nINSTRUCTIONS DE MISE À JOUR\n================================================================================\n\nPour installer la mise à jour sur [SITENAME] cliquer sur le lien suivant. (Si l'URL n'est pas un lien, copier/coller dans votre navigateur).\n\nLien de mise à jour : [LINK]\n\nLes informations de mise à jour sont disponibles ici : [RELEASENEWS]\n\n================================================================================\nPOURQUOI JE REÇOIS CET E-MAIL ?\n================================================================================\n\nCet e-mail a été envoyé automatiquement par un plug-in fourni par Joomla!, le logiciel qui fait fonctionner votre site. Ce plug-in cherche les mises à jour de Joomla! et envoie une notification par mail aux administrateurs du site. Vous recevrez plusieurs messages similaires aussi longtemps que vous n'aurez pas fait la mise à jour ou désactivé le plug-in.\n\nPour ne plus recevoir ces mails, désactiver le 'Système - Notification de Mise à jour de Joomla!' plug-in dans le gestionnaire de plug-ins sur votre site.\n\nSi vous ne comprenez pas ce qu'est Joomla! et ce qu'il vous faut faire, merci de ne pas contacter le projet Joomla!. Ils ne vous envoient pas ce mail et ne peuvent vous aider. Contactez plutôt la personne qui a construit ou est en charge de votre site.\n\nSi vous avez construit ou êtes en charge de ce site, notez que ce plug-in a pu être activé automatiquement quand vous avez installé ou mis à jour Joomla! sur votre site.\n\n================================================================================\nQUI M'A ENVOYÉ CET E-MAIL?\n================================================================================\n\nCet e-mail est envoyé automatiquement par votre site, [SITENAME]"
PLG_SYSTEM_UPDATENOTIFICATION_LANGUAGE_OVERRIDE_LBL="Langue de l'e-mail"
PLG_SYSTEM_UPDATENOTIFICATION_LANGUAGE_OVERRIDE_DESC="Si vous choisissez 'Automatique' (par défaut), la notification de mise à jour aux Super utilisateurs sera dans la langue du site de la page affichée au moment où le plug-in est déclenché.<br />Pour les sites (multilingues ou non) où plusieurs langues sont installées, la langue de la page chargée peut être une langue que le Super utilisateur qui reçoit l'e-mail ne comprend pas. En sélectionnant une langue, vous forcez les e-mails à employer cette langue spécifique."
PLG_SYSTEM_UPDATENOTIFICATION_LANGUAGE_OVERRIDE_NONE="Automatique"
PLG_SYSTEM_UPDATENOTIFICATION_POSTINSTALL_UPDATECACHETIME="La notification de mise à jour de Joomla! ne fonctionne pas avec cette configuration."
PLG_SYSTEM_UPDATENOTIFICATION_POSTINSTALL_UPDATECACHETIME_BODY="Joomla ne cache pas la mise à jour car le paramètre de mise à jour de cache dans la configuration d'installation est fixé à 0 (en heures). Cela veut dire qu'un e-mail serait envoyé à chaque visite de page, mais ceci n'est pas possible. Merci d'augmenter la valeur (la valeur par défaut est 6) ou confirmer que le plugin de notification de mise à jour de Joomla! ne doit jamais envoyer d'e-mails."
PLG_SYSTEM_UPDATENOTIFICATION_POSTINSTALL_UPDATECACHETIME_ACTION="Revenir au paramètre par défaut (6 heures)"
PLG_SYSTEM_UPDATENOTIFICATION_XML_DESCRIPTION="Ce plug-in vérifie périodiquement la disponibilité de nouvelles versions de Joomla! Quand une mise à jour est trouvée, un e-mail est envoyé pour rappeler de mettre à jour. <br />Astuce pro : il est possible de modifier le message en substituant le contenu des constantes suivantes : PLG_SYSTEM_UPDATENOTIFICATION_EMAIL_SUBJECT et PLG_SYSTEM_UPDATENOTIFICATION_EMAIL_BODY."
language/fr-FR/fr-FR.plg_content_geshi.ini000060400000001113152453623440014352 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2016 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2016 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt, see LICENSE.php
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_CONTENT_GESHI="Contenu - Code Highlighter (GeSHi)"
PLG_CONTENT_GESHI_XML_DESCRIPTION="Affiche du code formaté dans les articles, en se basant sur le moteur de coloration syntaxique GeSHi"language/fr-FR/fr-FR.plg_system_log.sys.ini000060400000000774152453623440014537 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_LOG_XML_DESCRIPTION="Fonction de journalisation du site en cas d'échec de l'authentification"
PLG_SYSTEM_LOG="Système - Log"language/fr-FR/fr-FR.plg_system_sef.sys.ini000060400000001074152453623440014525 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_SEF_XML_DESCRIPTION="Ajoute le support SEF aux liens dans les contenus.<br />Fonctionne directement sur le code HTML, sans nécessiter de balises spéciales."
PLG_SYSTEM_SEF="Système - SEF"language/fr-FR/fr-FR.plg_twofactorauth_yubikey.ini000060400000005743152453623440016171 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_TWOFACTORAUTH_YUBIKEY="Authentification en deux étapes - YubiKey"

PLG_TWOFACTORAUTH_YUBIKEY_ERR_VALIDATIONFAILED="Vous n'avez pas saisi un code secret valide pour YubiKey ou les serveurs YubiCloud sont impossibles à joindre en ce moment."
PLG_TWOFACTORAUTH_YUBIKEY_INTRO="Cette fonctionnalité permet d'utiliser une clé USB YubiKey pour implémenter l'authentification en deux étapes. En plus de votre identifiant et mot de passe il faut aussi insérer la clé dans un port USB, cliquer dans le champ de Clé secrète de l'interface de connexion et presser sur le disque doré de la YubiKey. Le code secret généré par la YubiKey est unique pour votre dispositif et change de façon permanente. Ceci fournit une protection supplémentaire contre les hackers se connectant sur votre compte, même s'ils ont pu se procurer votre mot de passe."
PLG_TWOFACTORAUTH_YUBIKEY_METHOD_TITLE="YubiKey"
PLG_TWOFACTORAUTH_TOTP_RESET_HEAD="Votre Yubikey est déjà associée à votre compte utilisateur."
PLG_TWOFACTORAUTH_TOTP_RESET_TEXT="Votre Yubikey est déjà associée à votre compte utilisateur. Si vous désirez ne plus l'associer ou utiliser une autre YubiKey, désactiver d'abord l'authentification en deux étapes et sauvegarder votre profil utilisateur. Puis, modifier à nouveau votre profil et ré-activez l'authentification en deux étapes avec la méthode YubiKey."
PLG_TWOFACTORAUTH_YUBIKEY_SECTION_ADMIN="Administration"
PLG_TWOFACTORAUTH_YUBIKEY_SECTION_BOTH="Les deux"
PLG_TWOFACTORAUTH_YUBIKEY_SECTION_DESC="Choisir les sections de votre site pour lesquelles vous désirez activer l'authentification en deux étapes."
PLG_TWOFACTORAUTH_YUBIKEY_SECTION_LABEL="Section du site"
PLG_TWOFACTORAUTH_YUBIKEY_SECTION_SITE="Site"
PLG_TWOFACTORAUTH_YUBIKEY_SECURITYCODE="Code de sécurité"
PLG_TWOFACTORAUTH_YUBIKEY_STEP1_HEAD="Paramètres"
PLG_TWOFACTORAUTH_YUBIKEY_STEP1_TEXT="Merci d'insérer votre clé YubiKey dans un port USB. Cliquer dans le champ de Clé secrète de l'interface de connexion et presser sur le disque doré de la YubiKey pendant une seconde. Puis sauvegarder votre profil utilisateur. Si le code généré par votre YubiKey est validé par YubiCloud, l'authentification en deux étapes sera activée et cette YubiKey sera associée à votre compte utilisateur."
PLG_TWOFACTORAUTH_YUBIKEY_XML_DESCRIPTION="Permet aux utilisateurs de votre site d'utiliser l'authentification en deux étapes en se servant d'une clé USB de sécurité YubiKey. Les utilisateurs doivent se procurer leur propre YubiKey sur https://www.yubico.com/. Pour utiliser l'authentification en deux étapes, modifier le profil de l'utilisateur et l'activer."

language/fr-FR/fr-FR.plg_xmap_com_content.ini000060400000007747152453623440015101 0ustar00; @package     Xmap
; @copyright   2007 - 2012 Joomla! Vargas. All rights reserved.
; @subpackage  fr-FR.plg_xmap_com_content.ini 
; @description Traduction francophone - fr-FR
; @version     2.3.0 - 23.10.2012
; @author      Mihàly Marti alias Sarki
; @copyright   Joomlatutos.com - www.joomlautos.com
; @license     GNU General Public License version 2, or later
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8 - No BOM

XMAP_CONTENT_PLUGIN="Xmap - Plug-in pour Contenus Joomla"
XMAP_CONTENT_PLUGIN_DESCRIPTION="Ce plug-in permet de prendre en charge les articles et les catégories dans les plans de site générés par Xmap."
XMAP_SETTING_EXPAND_CATEGORIES="Articles"
XMAP_SETTING_EXPAND_CATEGORIES_DESC="Choisissez si, et dans quel type de plan de site, les articles doivent être inclus sous les liens de catégorie."
XMAP_SETTING_EXPAND_FEATURED="Articles 'En vedette'"
XMAP_SETTING_EXPAND_FEATURED_DESC="Choisissez si, et dans quel type de plan de site, les articles en vedette doivent être inclus sous les liens de type 'Articles en vedette'."
XMAP_SETTING_INCLUDE_ARCHIVED="Articles archivés"
XMAP_SETTING_INCLUDE_ARCHIVED_DESC="Choisissez si, et dans quel type de plan de site, les articles archivés doivent être inclus."
XMAP_SETTING_SHOW_UNAUTH_LINKS="Liens non autorisés"
XMAP_SETTING_SHOW_UNAUTH_LINKS_DESC="Choisissez si, et dans quel type de plan de site, les liens vers les contenus nécessitant d'être enregistré doivent être inclus (l'utilisateur aura besoin de se connecter pour les consulter)."
XMAP_SETTING_ADD_PAGEBREAKS_LABEL="Liens 'Saut de page'"
XMAP_SETTING_ADD_PAGEBREAKS_DESC="Choisissez si, et dans quel type de plan de site, les liens vers les sous-pages des articles doivent être inclus."
XMAP_SETTING_MAX_ART_CAT="Articles par catégorie"
XMAP_SETTING_MAX_ART_CAT_DESC="Nombre maximum d'articles par catégorie s'ils sont inclus (0 pour aucune limite)."
XMAP_SETTING_MAX_ART_AGE="Articles depuis X jours"
XMAP_SETTING_MAX_ART_AGE_DESC="Inclure uniquement les articles ajoutés depuis le nombre de jours indiqué (0 pour aucune limite)."
XMAP_SETTING_CAT_PRIORITY="Priorité des catégories"
XMAP_SETTING_ADD_IMAGES_LABEL="Ajouter les images"
XMAP_SETTING_ADD_IMAGES_DESC="Si activé, Xmap va analyser le contenu de l'article à la recherche d'images pour les ajouter au plan du site. Valable uniquement pour le plan du site XML (moteurs de recherche)"
XMAP_SETTING_CAT_PRIORITY_DESC="Sélectionnez la priorité pour les catégories."
XMAP_SETTING_CAT_CHANCE_FREQ="Fréquence des catégories"
XMAP_SETTING_CAT_CHANCE_FREQ_DESC="Sélectionnez la fréquence de modification des catégories."
XMAP_SETTING_ART_PRIORITY="Priorité des articles"
XMAP_SETTING_ART_PRIORITY_DESC="Sélectionnez la priorité pour les articles."
XMAP_SETTING_ART_CHANCE_FREQ="Fréquence des articles"
XMAP_SETTING_ART_CHANCE_FREQ_DESC="Sélectionnez la fréquence de modification des articles."
XMAP_NEWS_FIELDSET_LABEL="Réglages plan du site Google News"
XMAP_SETTING_NEWS_KEYWORDS_DESC="Spécifiez les mots-clés qui doivent-être utilisés pour le plan du site Google News"
XMAP_SETTING_NEWS_KEYWORDS_LABEL="Mots-clés"
XMAP_SETTING_NEWS_KEYWORDS_METAKEYS="Mots-clés des articles"
XMAP_SETTING_NEWS_KEYWORDS_CATTITLE="Titre des catégories"
XMAP_SETTING_NEWS_KEYWORDS_METAKEYS_CATTITLE="Mots-clés des articles & Titre des catégories"
XMAP_SETTING_NEWS_KEYWORDS_NONE="Aucun"


; Generic Extension settings strings
COM_PLUGINS_BASIC_FIELDSET_LABEL="Paramètres de base"
COM_PLUGINS_XML_FIELDSET_LABEL="Paramètres du plan de site XML"
COM_PLUGINS_NEWS_FIELDSET_LABEL="Paramètres du plan de site Google News"
XMAP_OPTION_USE_PARENT_MENU="Utiliser les paramètres du menu parent"
XMAP_OPTION_NEVER="Jamais"
XMAP_OPTION_ALWAYS="Toujours"
XMAP_OPTION_XML_ONLY="Uniquement dans le plan du site XML "
XMAP_OPTION_HTML_ONLY="Uniquement dans le plan du site HTML"
XMAP_OPTION_WEEKLY="Hebdomadaire"
XMAP_OPTION_DAILY="Quotidien"
XMAP_OPTION_MONTHLY="Mensuel"
XMAP_OPTION_YEARLY="Annuel"
XMAP_OPTION_HOURLY="Heure"language/fr-FR/fr-FR.com_content.ini000060400000046377152453623440013214 0ustar00; @date        2014-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_CONTENT="Articles"
COM_CONTENT_ACCESS_DELETE_DESC="Droit de suppression de cet article."
COM_CONTENT_ACCESS_EDIT_DESC="Droit de modification de cet article."
COM_CONTENT_ACCESS_EDITSTATE_DESC="Droit de modification du statut de cet article."
COM_CONTENT_ARTICLE_CONTENT="Contenu"
COM_CONTENT_ARTICLE_DETAILS="Détails de l'article"
COM_CONTENT_ARTICLES_TITLE="Articles"
COM_CONTENT_ATTRIBS_ARTICLE_SETTINGS_LABEL="Paramètres"
COM_CONTENT_ATTRIBS_FIELDSET_LABEL="Paramètres"
; COM_CONTENT_BATCH_MENU_LABEL is deprecated, use JLIB_HTML_BATCH_MENU_LABEL instead.
COM_CONTENT_BATCH_MENU_LABEL="Sélectionner une catégorie où 'Déplacer/Copier'"
COM_CONTENT_BATCH_OPTIONS="Traitement"
COM_CONTENT_BATCH_TIP="Si une catégorie est sélectionnée pour copier/déplacer, les actions sélectionnées seront appliquées aux articles copiés ou déplacés. Sinon, toutes les actions seront appliquées aux articles sélectionnés."
COM_CONTENT_CHANGE_ARTICLE="Sélectionner ou changer cet article"
COM_CONTENT_CHANGE_ARTICLE_BUTTON="Sélectionner / Changer"
COM_CONTENT_CHOOSE_CATEGORY_DESC="Sélectionner une catégorie parente"
COM_CONTENT_CONFIG_ARTICLE_SETTINGS_DESC="Ces paramètres s'appliquent à l'affichage des articles, sauf s'ils sont supplantés par ceux d'un article spécifique ou d'un lien de menu."
COM_CONTENT_CONFIG_BLOG_SETTINGS_DESC="Ces paramètres s'appliquent à l'affichage de type 'Blog' ou 'En vedette', sauf s'ils sont supplantés par les paramètres d'un lien de menu."
COM_CONTENT_CONFIG_BLOG_SETTINGS_LABEL="Blog/En vedette"
COM_CONTENT_CONFIG_CATEGORIES_SETTINGS_DESC="Ces paramètres s'appliquent à l'affichage des catégories, sauf s'ils sont supplantés par ceux d'une catégorie parente ou d'un lien de menu."
COM_CONTENT_CONFIG_CATEGORY_SETTINGS_DESC="Ces paramètres s'appliquent à l'affichage d'une catégorie, sauf s'ils sont supplantés par ceux d'une catégorie spécifique, d'une catégorie parente ou d'un lien de menu."
COM_CONTENT_CONFIG_EDITOR_LAYOUT="Ces paramètres définissent les options présentes dans la page de création/modification d'article."
COM_CONTENT_CONFIG_INTEGRATION_SETTINGS_DESC="Ces paramètres déterminent la manière dont le composant 'Articles' interagit avec les autres extensions."
COM_CONTENT_CONFIG_LIST_SETTINGS_DESC="Ces paramètres s'appliquent au mode d'affichage en liste, sauf s'ils sont supplantés par ceux d'une catégorie parente ou d'un lien de menu."
COM_CONTENT_CONFIGURATION="Articles : Paramètres"
COM_CONTENT_CREATE_ARTICLE_CANCEL_REDIRECT_MENU_DESC="Sélectionnez la page vers laquelle l'utilisateur sera redirigé après l'annulation de de la création de l'article. La valeur par défaut est de rediriger vers la même page de création d'article (formulaire mis à zéro)."
COM_CONTENT_CREATE_ARTICLE_CANCEL_REDIRECT_MENU_LABEL="Redirection après annulation"
COM_CONTENT_CREATE_ARTICLE_CATEGORY_DESC="Si 'Oui', cette page ne vous laissera créer des articles que dans la catégorie choisie ci-dessous."
COM_CONTENT_CREATE_ARTICLE_CATEGORY_LABEL="Catégorie spécifique"
COM_CONTENT_CREATE_ARTICLE_CUSTOM_CANCEL_REDIRECT_DESC="Si 'Oui', vous pouvez définir une page de redirection, distincte de la 'Redirection/ Annulation après soumission', lorsque l'utilisateur annule la création de l'article. <br /> Si 'Non', lorsque l'utilisateur annule la création de l'article, il est redirigé vers la page définie par 'Redirection/Annulation après soumission' ci-dessus."
COM_CONTENT_CREATE_ARTICLE_CUSTOM_CANCEL_REDIRECT_LABEL="Redirection personnalisée après annulation"
COM_CONTENT_CREATE_ARTICLE_ERROR="Lorsque la catégorie par défaut est activée, une catégorie doit être sélectionnée."
COM_CONTENT_CREATE_ARTICLE_REDIRECTMENU_DESC="Choisissez la page vers laquelle l'utilisateur sera redirigé après soumission et annulation d'article (si non définie différemment ci-dessous). Par défaut la redirection s'effectue vers la page d'accueil."
COM_CONTENT_CREATE_ARTICLE_REDIRECTMENU_LABEL="Redirection après soumission ou annulation"
COM_CONTENT_DRILL_CATEGORIES_LABEL="Liste ou Blog : après avoir choisi le mode,<br />assurez-vous de bien avoir défini les paramètres dans le mode d'affichage souhaité."
COM_CONTENT_DRILL_DOWN_LAYOUT_DESC="Choisissez si les articles doivent être affichés en liste ou en blog lors de l'exploration d'une catégorie."
COM_CONTENT_DRILL_DOWN_LAYOUT_LABEL="Affichage en Liste ou en Blog"
COM_CONTENT_EDIT_ARTICLE="Modifier l'article"
COM_CONTENT_EDIT_CATEGORY="Modifier la catégorie"
COM_CONTENT_EDITORCONFIG_FIELDSET_LABEL="Paramètres de création/modification"
COM_CONTENT_EDITING_LAYOUT="Agencement"
COM_CONTENT_ERROR_ALL_LANGUAGE_ASSOCIATED="Un article assigné au paramètre langue 'Toutes' ne peut pas être associé. Les associations n'ont pas été appliquées."
COM_CONTENT_FEATURED="Article en vedette"
COM_CONTENT_FEATURED_ARTICLES="Articles en vedette"
COM_CONTENT_FEATURED_CATEGORIES_DESC="Liste optionnelle des catégories. Seuls les articles en vedette appartenant à ces catégories seront affichés. "
COM_CONTENT_FEATURED_CATEGORIES_LABEL="Sélectionner les catégories"
COM_CONTENT_FEATURED_ORDER="Ordre de présentation des articles en vedette"
COM_CONTENT_FEATURED_TITLE="Articles : en vedette"
COM_CONTENT_FIELD_BROWSER_PAGE_TITLE_DESC="Texte optionnel à afficher dans la page de titre du navigateur quand l'article n'est pas affiché par un élément de menu de type 'Article'. Si le champ n'est pas renseigné, le titre de l'article sera utilisé."
COM_CONTENT_FIELD_BROWSER_PAGE_TITLE_LABEL="Page de titre du navigateur"
COM_CONTENT_FIELD_ARTICLETEXT_DESC="Saisissez le texte de l'article dans la zone de texte"
COM_CONTENT_FIELD_ARTICLETEXT_LABEL="Texte de l'article"
COM_CONTENT_FIELD_CAPTCHA_DESC="Sélectionnez le plug-in Captcha qui doit être utilisé dans les formulaires d'article.<br />Vérifiez que les informations requises soient indiquées dans les paramètres du plug-in, accessible depuis la gestion des plug-ins de Joomla. <br />Si 'Paramètres globaux' est sélectionné, assurez-vous qu'un plug-in Captcha est choisi dans la Configuration globale."
COM_CONTENT_FIELD_CAPTCHA_LABEL="Captcha à utiliser"
COM_CONTENT_FIELD_CREATED_BY_ALIAS_DESC="Saisissez un nom dans ce champ pour remplacer celui de l'auteur de l'article.<br />Utile pour spécifier l'auteur réél d'un article reproduit."
COM_CONTENT_FIELD_CREATED_BY_ALIAS_LABEL="Nom de remplacement"
COM_CONTENT_FIELD_CREATED_BY_DESC="Vous pouvez choisir un utilisateur spécifique comme auteur de l'article."
COM_CONTENT_FIELD_CREATED_BY_LABEL="Créé par"
COM_CONTENT_FIELD_CREATED_DESC="Date de création de l'article."
COM_CONTENT_FIELD_CREATED_LABEL="Date de création"
COM_CONTENT_FIELD_FEATURED_DESC="Assigner l'article au blog des articles 'En vedette'"
COM_CONTENT_FIELD_FULL_DESC="Image de l'introduction de l'article "
COM_CONTENT_FIELD_FULL_LABEL="Image de l'article complet"
COM_CONTENT_FIELD_FULLTEXT="Texte complet"
COM_CONTENT_FIELD_HITS_DESC="Nombre d'affichages de cet article"
COM_CONTENT_FIELD_IMAGE_DESC="L'image à afficher"
COM_CONTENT_FIELD_IMAGE_ALT_DESC="Texte alternatif utilisé pour les utilisateurs qui n'ont pas accès aux images. "
COM_CONTENT_FIELD_IMAGE_ALT_LABEL="Alt texte"
COM_CONTENT_FIELD_IMAGE_CAPTION_DESC="Légende attachée à l'image"
COM_CONTENT_FIELD_IMAGE_CAPTION_LABEL="Légende"
COM_CONTENT_FIELD_IMAGE_OPTIONS="Paramètres des images"
COM_CONTENT_FIELD_INFOBLOCK_POSITION_DESC="Mettre le bloc des informations de l'article au-dessus ou au-dessous du contenu ou, le diviser en deux blocs séparés, l'un au-dessus et l'autre au-dessous."
COM_CONTENT_FIELD_INFOBLOCK_POSITION_LABEL="Position des informations"
COM_CONTENT_FIELD_INFOBLOCK_TITLE_DESC="Affiche le \"Titre d'informations d'article\" au-dessus du bloc d'informations"
COM_CONTENT_FIELD_INFOBLOCK_TITLE_LABEL="Titre d'informations d'article"
COM_CONTENT_FIELD_INTRO_DESC="Image pour le texte d'introduction en affichage 'Blog' et 'En vedette'."
COM_CONTENT_FIELD_INTRO_LABEL="Image d'intro"
COM_CONTENT_FIELD_INTROTEXT="Texte d'intro"
COM_CONTENT_FIELD_LANGUAGE_DESC="Langue à laquelle l'article est assigné."
COM_CONTENT_FIELD_MODIFIED_DESC="Date et heure de la dernière modification de l'article."
COM_CONTENT_FIELD_NOTE_DESC="Une note facultative à afficher dans la liste des articles."
COM_CONTENT_FIELD_NOTE_LABEL="Note"
COM_CONTENT_FIELD_OPTION_ABOVE="Au-dessus"
COM_CONTENT_FIELD_OPTION_BELOW="Au-dessous"
COM_CONTENT_FIELD_OPTION_SPLIT="Diviser"
COM_CONTENT_FIELD_PUBLISH_DOWN_DESC="Indiquez si nécessaire une date de fin de publication.<br />Si vous n'indiquez rien, l'article ne sera pas automatiquement dépublié (le système mettant la valeur '0000-00-00 00:00:00')."
COM_CONTENT_FIELD_PUBLISH_DOWN_LABEL="Fin de publication"
COM_CONTENT_FIELD_PUBLISH_UP_DESC="Indiquez si nécessaire une date de début de publication.<br />Si vous n'indiquez rien, la date de création est utilisée."
COM_CONTENT_FIELD_PUBLISH_UP_LABEL="Début de publication"
COM_CONTENT_FIELD_SELECT_ARTICLE_DESC="Sélectionner ou créer un article à afficher."
COM_CONTENT_FIELD_SELECT_ARTICLE_LABEL="Sélectionner un article"
COM_CONTENT_FIELD_SHOW_CAT_TAGS_DESC="Afficher les tags d'une catégorie."
COM_CONTENT_FIELD_SHOW_CAT_TAGS_LABEL="Afficher les tags"
COM_CONTENT_FIELD_SHOW_TAGS_DESC="Afficher les tags d'un article."
COM_CONTENT_FIELD_SHOW_TAGS_LABEL="Afficher les tags"
COM_CONTENT_FIELD_URL_DESC="Lien vers lequel les utilisateurs seront redirigés."
COM_CONTENT_FIELD_URL_LINK_TEXT_DESC="Texte à afficher pour ce lien"
COM_CONTENT_FIELD_URL_LINK_TEXT_LABEL="Texte du lien"
COM_CONTENT_FIELD_URLA_LABEL="Lien A"
COM_CONTENT_FIELD_URLA_LINK_TEXT_LABEL="Texte du lien A"
COM_CONTENT_FIELD_URLB_LABEL="Lien B"
COM_CONTENT_FIELD_URLB_LINK_TEXT_LABEL="Texte du lien B"
COM_CONTENT_FIELD_URLC_LABEL="Lien C"
COM_CONTENT_FIELD_URLC_LINK_TEXT_LABEL="Texte du lien C"
COM_CONTENT_FIELD_URLS_OPTIONS="Paramètres d'URL"
COM_CONTENT_FIELD_URLSPOSITION_LABEL="Positionnement des liens"
COM_CONTENT_FIELD_URLSPOSITION_DESC="Afficher les liens au-dessus ou au-dessous du contenu"
COM_CONTENT_FIELD_VALUE_USE_ARTICLE_SETTINGS="Utiliser les paramètres des articles"
COM_CONTENT_FIELD_VERSION_DESC="Nombre de fois où l'article a été révisé."
COM_CONTENT_FIELD_VERSION_LABEL="Révision"
COM_CONTENT_FIELD_XREFERENCE_DESC="Valeur utilisée pour lier cet article à un système de données externes tel l'aide intégrée de Joomla."
COM_CONTENT_FIELD_XREFERENCE_LABEL="Référence externe"
COM_CONTENT_FIELDS_ARTICLE_FIELDS_TITLE="Articles : Champs"
COM_CONTENT_FIELDS_ARTICLE_FIELD_ADD_TITLE="Articles : Nouveau champ"
COM_CONTENT_FIELDS_ARTICLE_FIELD_EDIT_TITLE="Articles : Modifier le champ"
COM_CONTENT_FIELDS_TYPE_MODAL_ARTICLE="Article"
COM_CONTENT_FIELDSET_PUBLISHING="Publication"
COM_CONTENT_FIELDSET_RULES="Droits"
COM_CONTENT_FIELDSET_URLS_AND_IMAGES="Images et liens"
COM_CONTENT_FILTER_SEARCH_DESC="Recherche sur titre, alias ou note. Préfixe avec ID: ou AUTHOR: ou CONTENT: recherche l'ID, l'auteur de l'article ou dans le contenu de l'article."
COM_CONTENT_FILTER_SEARCH_LABEL="Recherche d'articles"
COM_CONTENT_FLOAT_DESC="Contrôle du positionnement de l'image"
COM_CONTENT_FLOAT_FULLTEXT_LABEL="Image en texte complet"
COM_CONTENT_FLOAT_LABEL="Position de l'image"
COM_CONTENT_FLOAT_INTRO_LABEL="Image en texte d'intro"
COM_CONTENT_HEADING_ASSOCIATION="Association"
COM_CONTENT_HEADING_DATE_CREATED="Date de création"
COM_CONTENT_HEADING_DATE_MODIFIED="Date de modification"
COM_CONTENT_HEADING_DATE_PUBLISH_UP="Début de publication"
COM_CONTENT_HEADING_DATE_PUBLISH_DOWN="Fin de publication"
COM_CONTENT_ID_LABEL="ID"
; The following 2 strings are deprecated and will be removed with 4.0.
COM_CONTENT_ITEM_ASSOCIATIONS_FIELDSET_LABEL="Associations d'articles"
COM_CONTENT_ITEM_ASSOCIATIONS_FIELDSET_DESC="Choisissez l'élément à associer dans la langue cible.<br />Ce choix ne concerne que les sites multilingues, il ne s'affiche que si le paramètre 'Association' est réglé sur 'Oui' dans le plug-in 'Filtre de langue'.<br /><strong>Note :<strong> l'association d'éléments de langues différentes permet de rediriger l'utilisateur vers un élément spécifique au moment du changement de langue. Pour l'utiliser, assurez-vous que le module de changement de langue soit affiché sur les pages des éléments concernés.<br />Une catégorie au paramètre langue 'Toutes' ne peut pas être associé."
COM_CONTENT_LEFT="Gauche"
COM_CONTENT_MODIFIED_ASC="Date de modification ascendante"
COM_CONTENT_MODIFIED_DESC="Date de modification descendante"
COM_CONTENT_MONTH="Mois"
COM_CONTENT_N_ITEMS_ARCHIVED="%s articles archivés."
COM_CONTENT_N_ITEMS_ARCHIVED_1="%s article archivé."
COM_CONTENT_N_ITEMS_CHECKED_IN_0="Aucun article n'a été déverrouillé"
COM_CONTENT_N_ITEMS_CHECKED_IN_1="%d article déverrouillé"
COM_CONTENT_N_ITEMS_CHECKED_IN_MORE="%d articles déverrouillés"
COM_CONTENT_N_ITEMS_DELETED="%s articles supprimés."
COM_CONTENT_N_ITEMS_DELETED_1="%s article supprimé."
COM_CONTENT_N_ITEMS_FEATURED="%s articles mis en vedette"
COM_CONTENT_N_ITEMS_FEATURED_1="%s article mis en vedette"
COM_CONTENT_N_ITEMS_PUBLISHED="%s articles publiés."
COM_CONTENT_N_ITEMS_PUBLISHED_1="%s article publié."
COM_CONTENT_N_ITEMS_TRASHED="%s articles mis à la corbeille."
COM_CONTENT_N_ITEMS_TRASHED_1="%s article mis à la corbeille."
COM_CONTENT_N_ITEMS_UNFEATURED="%s articles non mis en vedette"
COM_CONTENT_N_ITEMS_UNFEATURED_1="%s article non mis en vedette"
COM_CONTENT_N_ITEMS_UNPUBLISHED="%s articles dépubliés."
COM_CONTENT_N_ITEMS_UNPUBLISHED_1="%s article dépublié."
COM_CONTENT_NEW_ARTICLE="Nouvel article"
COM_CONTENT_NO_ARTICLES_DESC="Afficher/Masquer le message 'Il n'y a aucun article dans cette catégorie' lorsque la catégorie ne contient aucun article, ou lorsque la catégorie est vide et que l'option 'Catégorie(s) vide(s)' est sur 'Afficher'"
COM_CONTENT_NO_ARTICLES_LABEL="Message d'alerte"
COM_CONTENT_NO_ITEM_SELECTED="Veuillez d'abord effectuer une sélection dans la liste."
COM_CONTENT_NONE="Aucun"
COM_CONTENT_NUMBER_CATEGORY_ITEMS_DESC="Afficher/Masquer le nombre d'articles dans une catégorie."
COM_CONTENT_NUMBER_CATEGORY_ITEMS_LABEL="Nombre d'articles"
COM_CONTENT_PAGE_ADD_ARTICLE="Articles : Ajouter"
COM_CONTENT_PAGE_EDIT_ARTICLE="Articles : Modifier"
COM_CONTENT_PAGE_VIEW_ARTICLE="Articles : Afficher l'article"
COM_CONTENT_PAGEBREAK_DOC_TITLE="Saut de page"
COM_CONTENT_PAGEBREAK_INSERT_BUTTON="Insérer le saut de page"
COM_CONTENT_PAGEBREAK_TITLE="Titre de la page :"
COM_CONTENT_PAGEBREAK_TOC="Titre dans l'index :"
COM_CONTENT_PUBLISH_DOWN_ASC="Fin de publication ascendant"
COM_CONTENT_PUBLISH_DOWN_DESC="Fin de publication descendant"
COM_CONTENT_PUBLISH_UP_ASC="Début de publication ascendant"
COM_CONTENT_PUBLISH_UP_DESC="Fin de publication descendant"
COM_CONTENT_RIGHT="Droite"
COM_CONTENT_SAVE_SUCCESS="Article enregistré."
COM_CONTENT_SAVE_WARNING="L'alias existait déjà, un chiffre a donc été ajouté à la fin. Pour changer l'alias, modifier à nouveau l'article."
COM_CONTENT_SELECT_AN_ARTICLE="Sélection d'un article"
COM_CONTENT_SHARED_DESC="Ces paramètres sont partagés pour Liste, Blog et 'En vedette' sauf s'ils sont supplantés dans le lien de menu."
COM_CONTENT_SHARED_LABEL="Paramètres partagés"
COM_CONTENT_SHOW_ARTICLE_OPTIONS_DESC="Afficher/Masquer l'onglet des paramètres d'article dans l'interface de création/modification d'article en administration. Ces paramètres supplantent les paramètres globaux."
COM_CONTENT_SHOW_ARTICLE_OPTIONS_LABEL="Paramètres d'article"
COM_CONTENT_SHOW_EMPTY_CATEGORIES_DESC="Afficher/Masquer les catégories vides. Une catégorie est vide si elle ne comporte ni article ni sous-catégorie."
COM_CONTENT_SHOW_IMAGES_URLS_BACK_DESC="Afficher/Masquer les champs d'insertion d'images et de liens dans l'interface de création/modification d'article en administration."
COM_CONTENT_SHOW_IMAGES_URLS_BACK_LABEL="Images et liens en admin."
COM_CONTENT_SHOW_IMAGES_URLS_FRONT_DESC="Afficher/Masquer les champs d'insertion d'images et de liens dans l'interface de création/modification d'article en frontal du site."
COM_CONTENT_SHOW_IMAGES_URLS_FRONT_LABEL="Images et liens en frontal"
COM_CONTENT_SHOW_PUBLISHING_OPTIONS_DESC="Afficher/Masquer les paramètres de publication en mode création/modification d'article.<br />Ces paramètres permettent les changements des dates et d'auteur."
COM_CONTENT_SHOW_PUBLISHING_OPTIONS_LABEL="Paramètres de publication"
COM_CONTENT_SLIDER_EDITOR_CONFIG="Paramètres de création/modification"
COM_CONTENT_SUBMENU_CATEGORIES="Catégories"
COM_CONTENT_SUBMENU_FEATURED="Articles en vedette"
COM_CONTENT_TIP_ASSOCIATION="Articles associés"
COM_CONTENT_TOGGLE_TO_FEATURE="Cliquez pour mettre le statut de l'article 'En vedette'"
COM_CONTENT_TOGGLE_TO_UNFEATURE="Cliquez pour supprimer le statut 'En vedette' de l'article"
COM_CONTENT_UNFEATURED="Article non mis en vedette"
COM_CONTENT_URL_FIELD_BROWSERNAV_LABEL="Cible de l'URL"
COM_CONTENT_URL_FIELD_BROWSERNAV_DESC="Fenêtre cible du navigateur lorsque le lien est cliqué."
COM_CONTENT_URL_FIELD_A_BROWSERNAV_LABEL="Cible de l'URL A"
COM_CONTENT_URL_FIELD_B_BROWSERNAV_LABEL="Cible de l'URL B"
COM_CONTENT_URL_FIELD_C_BROWSERNAV_LABEL="Cible de l'URL C"
COM_CONTENT_WARNING_PROVIDE_VALID_NAME="Veuillez saisir un texte valide, non vide."
COM_CONTENT_XML_DESCRIPTION="Composant de gestion des articles"

JGLOBAL_NO_ITEM_SELECTED="Aucun article sélectionné"
JLIB_APPLICATION_ERROR_BATCH_CANNOT_CREATE="Vous n'êtes pas autorisé à créer de nouvel article dans cette catégorie."
JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT="Vous n'êtes pas autorisé à modifier un ou plusieurs de ces articles"
; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_CONTENT="Les modification ne s'appliquent qu'à ce composant.<br /><em><strong>Hérité</strong></em> - les droits globaux ou ceux des groupes parents seront utilisés.<br /><em><strong>Refusé</strong></em> - prévaut toujours, quels que soient les droits globaux ou ceux des groupes parents, et s'applique aux éléments enfants.<br /><em><strong>Autorisé</strong></em> - le groupe concerné pourra effectuer cette action dans ce composant sauf si les droits globaux sont différents."
JLIB_RULES_SETTING_NOTES_ITEM_COM_CONTENT_ARTICLE="Les modification des droits s'appliqueront à cet article.<br /><em>Hérité</em> signifie que les droits globaux, du groupe parent et de la catégorie seront utilisés.<br /><em>Refusé</em> signifie que quelque soient les droits globaux, ceux du groupe parent ou de la catégorie, le groupe concerné ne pourra pas effectuer cette action pour cet article.<br /><em>Autorisé</em> signifie que le groupe concerné pourra effectuer cette action pour cet article ; s'il y a conflit avec les droits globaux, ceux du groupe parent ou de la catégorie, la modification ne sera pas appliquée, le label <em>Non autorisé (verrouillé)</em> sera affiché dans la colonne 'Droits appliqués'."
; Fields overrides
COM_CONTENT_ARTICLE_CATEGORIES_TITLE="Articles : Groupes de champs"
COM_CONTENT_ARTICLE_CATEGORY_ADD_TITLE="Articles : Nouveau groupe de champs"
COM_CONTENT_ARTICLE_CATEGORY_EDIT_TITLE="Articles: Modifier le groupe de champs"
language/fr-FR/fr-FR.com_newsfeeds.ini000060400000030626152453623440013513 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_NEWSFEEDS="Fils d'actualité"
; COM_NEWSFEEDS_BATCH_MENU_LABEL is deprecated, use JLIB_HTML_BATCH_MENU_LABEL instead.
COM_NEWSFEEDS_BATCH_MENU_LABEL="Sélectionner la catégorie à déplacer/copier"
COM_NEWSFEEDS_BATCH_OPTIONS="Traitement par lot des fils d'actualité sélectionnés"
COM_NEWSFEEDS_BATCH_TIP="Si une catégorie est sélectionnée pour copier/déplacer, les actions sélectionnées seront appliquées aux fils d'actualité copiés ou déplacés. Sinon, toutes les actions seront appliquées aux fils d'actualité sélectionnés."
COM_NEWSFEEDS_CACHE_TIME_HEADING="Durée du cache"
COM_NEWSFEEDS_CACHE_TIME_HEADING_ASC="Temps de cache ascendant"
COM_NEWSFEEDS_CACHE_TIME_HEADING_DESC="Temps de cache descendant"
COM_NEWSFEEDS_CATEGORIES_DESC="Ces paramètres s'appliquent aux options des catégories de fils d'actualité, à moins qu'ils soient modifiés pour un lien de menu spécifique."
COM_NEWSFEEDS_CHANGE_FEED="Sélectionner ou changer le fil d'actualité"
; COM_NEWSFEEDS_CHANGE_FEED_BUTTON is deprecated, use COM_NEWSFEEDS_CHANGE_FEED instead;
COM_NEWSFEEDS_CHANGE_FEED_BUTTON="Sélectionner le fil"
COM_NEWSFEEDS_CONFIG_INTEGRATION_SETTINGS_DESC="Ces paramètres déterminent la façon dont le composant de fils d'actualité s'intégrera aux autres extensions."
COM_NEWSFEEDS_CONFIGURATION="Fils d'actualité : Paramètres"
COM_NEWSFEEDS_EDIT_NEWSFEED="Modifier le fil d'actualité"
COM_NEWSFEEDS_ERROR_UNIQUE_ALIAS="Un autre fil d'actualité de cette catégorie possède le même alias (rappel : ce fil d'actualité peut se trouver dans la corbeille)"
COM_NEWSFEEDS_ERROR_ALL_LANGUAGE_ASSOCIATED="Un fil d'actualité attribué au paramètre langue 'Toutes' ne peut pas être associé. Les associations n'ont pas été appliquées."
COM_NEWSFEEDS_FEED_CATEGORY_OPTIONS_LABEL="Paramètres d'affichage de la catégorie de fils"
COM_NEWSFEEDS_FIELD_CACHETIME_DESC="Durée de vie, en minutes, des éléments du module dans le cache avant de les réactualiser."
COM_NEWSFEEDS_FIELD_CACHETIME_LABEL="Durée du cache"
COM_NEWSFEEDS_FIELD_CATEGORIES_OPTIONS_LABEL="Paramètres d'affichage des catégories de fils"
COM_NEWSFEEDS_FIELD_CATEGORY_DESC="La catégorie à laquelle ce fil est assigné"
COM_NEWSFEEDS_FIELD_CHARACTER_COUNT_DESC="Nombre de caractères à afficher par fil. 0 affichera tout le texte."
COM_NEWSFEEDS_FIELD_CHARACTER_COUNT_LABEL="Nombre de caractères"
COM_NEWSFEEDS_FIELD_CHARACTERS_COUNT_DESC="Nombre de caractères à inclure dans le fil. 0 affichera tout le texte."
COM_NEWSFEEDS_FIELD_CHARACTERS_COUNT_LABEL="Nombre de caractères"
COM_NEWSFEEDS_FIELD_CONFIG_CATEGORY_SETTINGS_DESC="Ces paramètres s'appliquent aux catégories, à moins qu'ils soient modifiés pour un lien de menu ou un fil d'actualité particulier."
COM_NEWSFEEDS_FIELD_CONFIG_LIST_SETTINGS_DESC="Ces paramètres s'appliquent à la présentation de catégories en liste, à moins qu'ils soient modifiés pour un lien de menu ou un fil d'actualité particulier."
COM_NEWSFEEDS_FIELD_CONFIG_NEWSFEED_SETTINGS_DESC="Ces paramètres s'appliquent à la présentation de chaque catégorie, à moins qu'ils soient modifiés pour un lien de menu ou un fil d'actualité particulier."
COM_NEWSFEEDS_FIELD_CONFIG_NEWSFEED_SETTINGS_LABEL="Fil d'actualité"
COM_NEWSFEEDS_FIELD_DESCRIPTION_DESC="Saisir une description pour le fil."
COM_NEWSFEEDS_FIELD_FEED_DISPLAY_ORDER_DESC="Ordre utilisé pour l'affichage des fils d'actualité"
COM_NEWSFEEDS_FIELD_FEED_DISPLAY_ORDER_LABEL="Ordre des fils"
COM_NEWSFEEDS_FIELD_FEED_OPTIONS_DESC="Paramètres d'affichage des fils"
COM_NEWSFEEDS_FIELD_FEED_OPTIONS_LABEL="Affichage des fils"
COM_NEWSFEEDS_FIELD_FIRST_DESC="Première image à afficher"
COM_NEWSFEEDS_FIELD_FIRST_LABEL="Première image"
COM_NEWSFEEDS_FIELD_IMAGE_ALT_DESC="Texte alternatif (balise 'alt') utilisé pour les visiteurs n'ayant pas accès aux images. Ce texte est remplacé par celui de la légende si elle existe."
COM_NEWSFEEDS_FIELD_IMAGE_ALT_LABEL="Texte alternatif"
COM_NEWSFEEDS_FIELD_IMAGE_CAPTION_DESC="Légende de l'image"
COM_NEWSFEEDS_FIELD_IMAGE_CAPTION_LABEL="Légende"
COM_NEWSFEEDS_FIELD_LANGUAGE_DESC="Assigner ce fil d'actualité à une langue."
COM_NEWSFEEDS_FIELD_LINK_DESC="Lien vers le fil. Les liens IDN (Noms de domaines internationaux) sont convertis en punycode lors de la sauvegarde."
COM_NEWSFEEDS_FIELD_LINK_LABEL="Lien"
COM_NEWSFEEDS_FIELD_MODIFIED_BY_DESC="Nom de l'utilisateur qui a modifié ce fil d'actualité."
COM_NEWSFEEDS_FIELD_MODIFIED_DESC="Date et heure de la dernière modification du fil d'actualité"
COM_NEWSFEEDS_FIELD_NUM_ARTICLES_COLUMN_DESC="Affiche/Masque le nombre d'articles dans chaque fil ( vous pouvez définir ce nombre pour chaque fil )"
COM_NEWSFEEDS_FIELD_NUM_ARTICLES_COLUMN_LABEL="Nombre d'Articles"
COM_NEWSFEEDS_FIELD_NUM_ARTICLES_DESC="Nombre d'articles du fil à afficher"
COM_NEWSFEEDS_FIELD_NUM_ARTICLES_LABEL="Nombre d'articles"
COM_NEWSFEEDS_FIELD_NUMBER_ITEMS_LIST_DESC="Nombre de fils à afficher par défaut sur une page."
COM_NEWSFEEDS_FIELD_NUMBER_ITEMS_LIST_LABEL="Nombre de fils dans la liste"
COM_NEWSFEEDS_FIELD_NUMFEEDS_DESC="Nombre de fils à afficher"
COM_NEWSFEEDS_FIELD_NUMFEEDS_LABEL="Nombre de fils"
COM_NEWSFEEDS_FIELD_OPTIONS="Fil"
COM_NEWSFEEDS_FIELD_RTL_DESC="Sens de lecture de la langue du fil"
COM_NEWSFEEDS_FIELD_RTL_LABEL="Sens de la langue"
COM_NEWSFEEDS_FIELD_SECOND_DESC="Seconde image à afficher"
COM_NEWSFEEDS_FIELD_SECOND_LABEL="Seconde image"
COM_NEWSFEEDS_FIELD_SELECT_CATEGORY_DESC="Choisissez une catégorie de fils à afficher"
COM_NEWSFEEDS_FIELD_SELECT_FEED_DESC="Sélectionnez le fil à afficher"
COM_NEWSFEEDS_FIELD_SELECT_FEED_LABEL="Fils d'actualité"
COM_NEWSFEEDS_FIELD_SHOW_CAT_ITEMS_DESC="Afficher/Masquer le nombre de fils dans la catégorie"
COM_NEWSFEEDS_FIELD_SHOW_CAT_ITEMS_LABEL="Nombre de fils dans la catégorie"
COM_NEWSFEEDS_FIELD_SHOW_CAT_TAGS_DESC="Afficher les tags d'une catégorie."
COM_NEWSFEEDS_FIELD_SHOW_CAT_TAGS_LABEL="Afficher les tags"
COM_NEWSFEEDS_FIELD_SHOW_FEED_DESCRIPTION_DESC="Afficher/Masquer la description du fil d'actualité"
COM_NEWSFEEDS_FIELD_SHOW_FEED_DESCRIPTION_LABEL="Description des fils"
COM_NEWSFEEDS_FIELD_SHOW_FEED_IMAGE_DESC="Afficher/Masquer les images des fils d'actualité"
COM_NEWSFEEDS_FIELD_SHOW_FEED_IMAGE_LABEL="Images des fils"
COM_NEWSFEEDS_FIELD_SHOW_ITEM_DESCRIPTION_DESC="Afficher/Masquer le contenu des fils d'actualité"
COM_NEWSFEEDS_FIELD_SHOW_ITEM_DESCRIPTION_LABEL="Contenu des fils"
COM_NEWSFEEDS_FIELD_SHOW_LINKS_DESC="Afficher ou masquer les liens URL des fils"
COM_NEWSFEEDS_FIELD_SHOW_LINKS_LABEL="Liens des fils"
COM_NEWSFEEDS_FIELD_SHOW_TAGS_DESC="Afficher les tags d'un fil d'actualité"
COM_NEWSFEEDS_FIELD_SHOW_TAGS_LABEL="Afficher les tags"
COM_NEWSFEEDS_FIELD_VALUE_LTR="Écriture de gauche à droite"
COM_NEWSFEEDS_FIELD_VALUE_NONE="Aucun"
COM_NEWSFEEDS_FIELD_VALUE_RTL="Écriture de droite à gauche"
COM_NEWSFEEDS_FIELD_VALUE_SITE="Direction d'écriture de la langue du site"
COM_NEWSFEEDS_FIELD_VERSION_LABEL="Révision"
COM_NEWSFEEDS_FIELD_VERSION_DESC="Nombre de révision du fil d'actualité (correspond au nombre d'application de la fonction 'Enregistrer')."
COM_NEWSFEEDS_FIELDSET_IMAGES="Images"
COM_NEWSFEEDS_FIELDSET_MORE_OPTIONS_LABEL="Paramètres d'affichage des fils"
COM_NEWSFEEDS_FILTER_SEARCH_DESC="Recherche sur titre ou alias du fil d'actualité. Préfixe avec ID: recherche sur l'ID du fil d'actualité."
COM_NEWSFEEDS_FILTER_SEARCH_LABEL="Recherche dans les fils d'actualité"
COM_NEWSFEEDS_FLOAT_DESC="Contrôle de la position de l'image"
COM_NEWSFEEDS_FLOAT_FIRST_LABEL="Float pour la première image"
COM_NEWSFEEDS_FLOAT_LABEL="Position d'image"
COM_NEWSFEEDS_FLOAT_SECOND_LABEL="Float pour la seconde image"
COM_NEWSFEEDS_HEADING_ASSOCIATION="Association"
COM_NEWSFEEDS_HITS_DESC="Nombre de clics pour ce fil d'actualité."
; The following 2 strings are deprecated and will be removed with 4.0.
COM_NEWSFEEDS_ITEM_ASSOCIATIONS_FIELDSET_LABEL="Associations de fils d'actualité"
COM_NEWSFEEDS_ITEM_ASSOCIATIONS_FIELDSET_DESC="Choisissez l'élément à associer dans la langue cible.<br />Ce choix ne concerne que les sites multilingues, il ne s'affiche que si le paramètre 'Association' est réglé sur 'Oui' dans le plug-in 'Filtre de langue'.<br /><strong>Note :<strong> l'association d'éléments de langues différentes permet de rediriger l'utilisateur vers un élément spécifique au moment du changement de langue. Pour l'utiliser, assurez-vous que le module de changement de langue soit affiché sur les pages des éléments concernés.<br />Une catégorie au paramètre langue 'Toutes' ne peut pas être associé."
COM_NEWSFEEDS_LEFT="Gauche"
COM_NEWSFEEDS_MANAGER_NEWSFEED="Fils d'actualité : Nouveau/Modifier"
COM_NEWSFEEDS_MANAGER_NEWSFEED_NEW="Fils d'actualité : Nouveau fil"
COM_NEWSFEEDS_MANAGER_NEWSFEED_EDIT="Fils d'actualité : Modifier un fil"
COM_NEWSFEEDS_MANAGER_NEWSFEEDS="Fils d'actualité"
COM_NEWSFEEDS_N_ITEMS_ARCHIVED="%d fils d'actualité archivés"
COM_NEWSFEEDS_N_ITEMS_ARCHIVED_1="Fil d'actualité archivé"
COM_NEWSFEEDS_N_ITEMS_CHECKED_IN_0="Aucun fil d'actualité déverrouillé"
COM_NEWSFEEDS_N_ITEMS_CHECKED_IN_1="Fil d'actualité déverrouillé"
COM_NEWSFEEDS_N_ITEMS_CHECKED_IN_MORE="%d fils d'actualité déverrouillés"
COM_NEWSFEEDS_N_ITEMS_DELETED="%d fils d'actualité supprimés"
COM_NEWSFEEDS_N_ITEMS_DELETED_1="Fil d'actualité supprimé"
COM_NEWSFEEDS_N_ITEMS_PUBLISHED="%d fils d'actualité activés"
COM_NEWSFEEDS_N_ITEMS_PUBLISHED_1="Fil d'actualité activé"
COM_NEWSFEEDS_N_ITEMS_TRASHED="%d fils d'actualité mis à la corbeille"
COM_NEWSFEEDS_N_ITEMS_TRASHED_1="Fil d'actualité mis à la corbeille"
COM_NEWSFEEDS_N_ITEMS_UNPUBLISHED="%d fils d'actualité désactivés"
COM_NEWSFEEDS_N_ITEMS_UNPUBLISHED_1="Fil d'actualité désactivé"
COM_NEWSFEEDS_NEW_NEWSFEED="Nouveau fil d'actualité"
COM_NEWSFEEDS_NEWSFEEDS="Fils d'actualité"
COM_NEWSFEEDS_NO_ITEM_SELECTED="Aucun fil d'actualité n'est sélectionné"
COM_NEWSFEEDS_NONE="Aucune"
COM_NEWSFEEDS_NUM_ARTICLES_HEADING="Nombre des articles"
COM_NEWSFEEDS_NUM_ARTICLES_HEADING_ASC="Nombre d'articles ascendant"
COM_NEWSFEEDS_NUM_ARTICLES_HEADING_DESC="Nombre d'articles descendant"
COM_NEWSFEEDS_PUBLISH_ITEM="Activer le fil d'actualité"
COM_NEWSFEEDS_RIGHT="Droite"
COM_NEWSFEEDS_SAVE_SUCCESS="Fil d'actualité enregistré"
COM_NEWSFEEDS_SEARCH_IN_TITLE="Recherche"
COM_NEWSFEEDS_SELECT_A_FEED="Sélectionner un fil d'actualité"
COM_NEWSFEEDS_SELECT_FEED="Sélectionner le Fil"
COM_NEWSFEEDS_SHOW_EMPTY_CATEGORIES_DESC="Afficher/Masquer les catégories vides ne contenant ni fil d'actualité ni sous-catégorie."
COM_NEWSFEEDS_SUBMENU_CATEGORIES="Catégories"
COM_NEWSFEEDS_SUBMENU_NEWSFEEDS="Fils d'actualité"
COM_NEWSFEEDS_TIP_ASSOCIATION="Fils d'actualité associés"
COM_NEWSFEEDS_UNPUBLISH_ITEM="Désactiver le fil d'actualité"
COM_NEWSFEEDS_WARNING_PROVIDE_VALID_NAME="Veuillez saisir un nom valide"
COM_NEWSFEEDS_XML_DESCRIPTION="Composant de gestion des fils d'actualité provenant de flux RSS, RDF ou ATOM."
JGLOBAL_NEWITEMSLAST_DESC="Les nouveaux fils prennent par défaut la dernière position. Leur position peut être modifiée après enregistrement."

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_NEWSFEEDS="Les modification ne s'appliquent qu'à ce composant.<br /><em><strong>Hérité</strong></em> - les droits globaux ou ceux des groupes parents seront utilisés.<br /><em><strong>Refusé</strong></em> - prévaut toujours, quels que soient les droits globaux ou ceux des groupes parents, et s'applique aux éléments enfants.<br /><em><strong>Autorisé</strong></em> - le groupe concerné pourra effectuer cette action dans ce composant sauf si les droits globaux sont différents."

[New Strings]
JLIB_RULES_SETTING_NOTES="Les modification ne s'appliquent qu'à ce composant.<br /><em><strong>Hérité</strong></em> - les droits globaux ou ceux des groupes parents seront utilisés.<br /><em><strong>Refusé</strong></em> - prévaut toujours, quels que soient les droits globaux ou ceux des groupes parents, et s'applique aux éléments enfants.<br /><em><strong>Autorisé</strong></em> - le groupe concerné pourra effectuer cette action dans ce composant sauf si les droits globaux sont différents."
language/fr-FR/fr-FR.plg_quickicon_jce.ini000060400000001014152453623440014327 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_QUICKICON_JCE="Icône Raccourci - JCE Gestionnaire de fichiers"
PLG_QUICKICON_JCE_XML_DESCRIPTION="Icône de raccourci du gestionnaire de fichiers de JCE"
PLG_QUICKICON_JCE_TITLE="JCE - Gestionnaire de fichiers"
language/fr-FR/fr-FR.com_messages.ini000060400000013362152453623440013335 0ustar00; @date        2015-01-30
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_MESSAGES="Messagerie privée"
COM_MESSAGES_ADD="Nouveau message privé"
COM_MESSAGES_CONFIG_SAVED="Configuration enregistrée"
COM_MESSAGES_CONFIGURATION="Messages : Paramètres"
COM_MESSAGES_ERR_INVALID_USER="Utilisateur non valide"
COM_MESSAGES_ERR_SEND_FAILED="L'utilisateur a verrouillé sa boîte mail. Le message n'a pu être envoyé."
COM_MESSAGES_ERROR_COULD_NOT_SEND_INVALID_RECIPIENT="Le message électronique ne peut pas être envoyé en raison d'une adresse de destinataire non valide."
COM_MESSAGES_ERROR_COULD_NOT_SEND_INVALID_REPLYTO="Le message électronique ne peut pas être envoyé en raison d'une adresse de réponse ('reply-to') non valide."
COM_MESSAGES_ERROR_INVALID_FROM_USER="Expéditeur non valide"
COM_MESSAGES_ERROR_INVALID_MESSAGE="Contenu du message non valide"
COM_MESSAGES_ERROR_INVALID_SUBJECT="Sujet non valide"
COM_MESSAGES_ERROR_INVALID_TO_USER="Destinataire non valide"
COM_MESSAGES_ERROR_MISSING_ROOT_ASSET_GROUPS="Groupes racine d'asset manquants pour envoyer une notification."
COM_MESSAGES_ERROR_NO_GROUPS_SET_AS_SUPER_USER="Aucun groupe n'est défini avec les droits de Super Utilisateur."
COM_MESSAGES_ERROR_NO_USERS_SET_AS_SUPER_USER="Il n'y a aucun utilisateur défini avec les droits de Super Utilisateur."
COM_MESSAGES_ERROR_RECIPIENT_NOT_AUTHORISED="Le destinataire n'est pas autorisé à recevoir des messages."
COM_MESSAGES_FIELD_AUTO_PURGE_DESC="Effacer automatiquement les messages privés après le nombre de jours choisi."
COM_MESSAGES_FIELD_AUTO_PURGE_LABEL="Auto-effacement des messages (en jours)"
COM_MESSAGES_FIELD_DATE_TIME_LABEL="Posté"
COM_MESSAGES_FIELD_LOCK_DESC="Verrouiller votre boîte de réception pour ne plus recevoir de messages."
COM_MESSAGES_FIELD_LOCK_LABEL="Verrouiller la boîte de réception"
COM_MESSAGES_FIELD_MAIL_ON_NEW_DESC="Envoyer un E-mail quand un nouveau message privé arrive."
COM_MESSAGES_FIELD_MAIL_ON_NEW_LABEL="E-mail pour les nouveaux messages"
COM_MESSAGES_FIELD_MESSAGE_DESC="Vous devez indiquer un message !"
COM_MESSAGES_FIELD_MESSAGE_LABEL="Message"
COM_MESSAGES_FIELD_SUBJECT_DESC="Vous devez indiquer un sujet !"
COM_MESSAGES_FIELD_SUBJECT_LABEL="Sujet"
COM_MESSAGES_FIELD_USER_ID_FROM_LABEL="de"
COM_MESSAGES_FIELD_USER_ID_TO_DESC="Vous devez choisir un destinataire !"
COM_MESSAGES_FIELD_USER_ID_TO_LABEL="Destinataire"
COM_MESSAGES_FILTER_SEARCH_LABEL="Recherche dans les messages"
COM_MESSAGES_FILTER_STATES_DESC="Filtrer par statut des messages"
COM_MESSAGES_FILTER_STATES_LABEL="Statut"
COM_MESSAGES_HEADING_FROM="de"
COM_MESSAGES_HEADING_FROM_ASC="From ascendant"
COM_MESSAGES_HEADING_FROM_DESC="From descendant"
COM_MESSAGES_HEADING_READ="Lu"
COM_MESSAGES_HEADING_READ_ASC="Lu ascendant"
COM_MESSAGES_HEADING_READ_DESC="Lu descendant"
COM_MESSAGES_HEADING_SUBJECT="Sujet"
COM_MESSAGES_HEADING_SUBJECT_ASC="Sujet descendant"
COM_MESSAGES_HEADING_SUBJECT_DESC="Sujet ascendant"
COM_MESSAGES_INVALID_REPLY_ID="Destinataire non valide"
COM_MESSAGES_MANAGER_MESSAGES="Messagerie privée"
COM_MESSAGES_MARK_AS_READ="Marquer comme lu"
COM_MESSAGES_MARK_AS_UNREAD="Marquer comme non lu"
COM_MESSAGES_MY_SETTINGS="Mes paramètres"
COM_MESSAGES_N_ITEMS_DELETED="%d messages supprimés"
COM_MESSAGES_N_ITEMS_DELETED_1="Message supprimé"
COM_MESSAGES_N_ITEMS_PUBLISHED="%d messages marqués comme lus"
COM_MESSAGES_N_ITEMS_PUBLISHED_1="Message marqué comme lu"
COM_MESSAGES_N_ITEMS_TRASHED="%d messages mis à la corbeille"
COM_MESSAGES_N_ITEMS_TRASHED_1="Message mis à la corbeille"
COM_MESSAGES_N_ITEMS_UNPUBLISHED="%d messages marqués comme non lus"
COM_MESSAGES_N_ITEMS_UNPUBLISHED_1="Message marqué comme non lu"
COM_MESSAGES_NEW_MESSAGE="Nouveau message de la part de %1$s sur le site %2$s"
; The following string is deprecated and will be removed in Joomla 4.0
COM_MESSAGES_NEW_MESSAGE_ARRIVED="Un nouveau message privé est arrivé"
COM_MESSAGES_NO_ITEM_SELECTED="Aucun message sélectionné"
COM_MESSAGES_OPTION_READ="Lu"
COM_MESSAGES_OPTION_UNREAD="Non lu"
COM_MESSAGES_PLEASE_LOGIN="Veuillez vous identifier à %s pour lire votre message."
COM_MESSAGES_RE="Re :"
COM_MESSAGES_READ="Messages"
COM_MESSAGES_READ_PRIVATE_MESSAGE="Lire ses messages privés"
COM_MESSAGES_SAVE_SUCCESS="Message envoyé."
COM_MESSAGES_SEARCH_IN_SUBJECT="Rechercher dans le sujet ou la description du message"
COM_MESSAGES_TOOLBAR_MARK_AS_READ="Marquer comme lu"
COM_MESSAGES_TOOLBAR_MARK_AS_UNREAD="Marquer comme non lu"
COM_MESSAGES_TOOLBAR_MY_SETTINGS="Mes Paramètres"
COM_MESSAGES_TOOLBAR_REPLY="Réponse"
COM_MESSAGES_TOOLBAR_SEND="Envoyer"
COM_MESSAGES_VIEW_PRIVATE_MESSAGE="Messagerie privée : Voir les messages"
COM_MESSAGES_WRITE_PRIVATE_MESSAGE="Messagerie privée : Rédiger un message privé"
COM_MESSAGES_XML_DESCRIPTION="Composant gérant la messagerie privée côté administration du site"
; The following string is deprecated and will be removed with 4.0.
JLIB_APPLICATION_SAVE_SUCCESS="Message expédié."

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_MESSAGES="Les modification ne s'appliquent qu'à ce composant.<br /><em><strong>Hérité</strong></em> - les droits globaux ou ceux des groupes parents seront utilisés.<br /><em><strong>Refusé</strong></em> - prévaut toujours, quels que soient les droits globaux ou ceux des groupes parents, et s'applique aux éléments enfants.<br /><em><strong>Autorisé</strong></em> - le groupe concerné pourra effectuer cette action dans ce composant sauf si les droits globaux sont différents."
language/fr-FR/fr-FR.com_jce_pro.sys.ini000060400000003437152453623440013766 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

COM_JCE="Editeur JCE Pro"
COM_JCE_XML_DESCRIPTION="<p>JCE Pro est une version avancée de l'éditeur WYSIWYG pour Joomla, avec des fonctions complémentaires.</p><p>JCE n'existerait pas sans ces grands projets :</p><ul><li><a href='https://www.joomla.org' target='_blank'>Joomla!</a></li><li><a href='https://tinymce.moxiecode.com' target='_blank'>TinyMCE</a></li><li><a href='https://jquery.com' target='_blank'>JQuery</a></li><li>Font Icons de <a href='https://icomoon.io/' target='_blank'>IcoMoon.</a></li><li><a href='https://getuikit.com/' target='_blank'>UIKit</a></li><li>Fugue Icons Copyright © <a href='http://p.yusukekamiyamane.com/'>Yusuke Kamiyamane.</a> Tous droits réservés.</li></ul><p><strong style='color: #8a350b'>Note :</strong> Pour utiliser JCE, vous devez le sélectionner comme éditeur dans la <a href='index.php?option=com_config' title='Configuration de Joomla'>configuration de Joomla...</a></p><p>Vous pouvez connaître les modifications apportées à cette version en consultant ce lien&nbsp;: <a href='https://www.joomlacontenteditor.net/support/changelog/editor' target='_blank'>www.joomlacontenteditor.net/support/changelog/editor</a></p><p>Une réalisation de Ryan Demmer</p><p>Traductions et supports francophones : <a href='https://www.sarki.ch/jce' target='_blank'>www.sarki.ch/jce</a></p>"

COM_JCE_MENU_PROFILES="Gestion des profils"
COM_JCE_MENU_CONFIG="Configuration globale"
COM_JCE_MENU_CPANEL="Panneau de contrôle"
COM_JCE_MENU_FILEBROWSER="Gestionnaire de fichiers"

language/fr-FR/fr-FR.plg_content_sudesign_audio.sys.ini000060400000003336152453623440017103 0ustar00SD_DESCRIPTION_POSTINSTALL="Merci d'avoir installé ce plugin ! Si vous rencontrez le moindre problème, n'hésitez pas à nous contacter sur joomla@sudesign.fr !<br>Le plugin s'est automatiquement activé, mais si vous souhaitez le configurer <a href='%s'>cliquez ici</a>"
SD_DESCRIPTION="<div style='font-family: Verdana;font-size: 1.2em;font-weight: normal;'>Simple Audio Shortcode - Basé sur MediaElement.js
<br />
<br /><b>Utilisation du shortcode :</b>
<br /> - <b>Simple :</b> [audio src=&quot;audio.mp3&quot;]
<br /> - <b>Avancée :</b> [audio src=&quot;source.mp3&quot; loop=&quot;on&quot; preload=&quot;auto&quot; autoplay=&quot;on&quot;]
<br />
<br /><b>Paramètre obligatoire :</b>
<br /> - <b>src</b> : URL de votre fichier audio (l'alias &quot;mp3&quot; existe aussi)
<br />
<br /><b>Paramètres optionnel :</b>
<br /> - <b>loop</b> : on / <u>off</u> = lire le fichier en boucle
<br /> - <b>autoplay</b> : on / <u>off</u> = lire le fichier automatiquement
<br /> - <b>preload</b> : <u>none</u> / auto / metadata = Par défaut le fichier n'est pas pré-chargé, <b>auto</b> = Pré-chargement automatique du fichier, <b>metadata</b> = Pré-charge automatiquement seulement les métadata du fichier.
<br /> - <b>style</b> : code CSS qui sera appliqué à la balise audio
<br /> - <b>id</b> : ID de la balise
<br /> - <b>class</b> : Class de la balise
<br /> - <b>hidden</b> : on / <u>off</u> = cacher le player
<br /> - <b>showvolume</b> : <u>on</u> / off = cacher le groupe du volume
<br /> - <b>txtcolor</b> : couleur du texte, au format CSS : #f00, red, rgba(255,0,0,0.5) ..
<br /> - <b>btcolor</b> : couleur des boutons, soit : black, red, green, blue ou white (default)
<br />
<br /><i>Valeur <u>souligné</u> = valeur par défaut</i></div>"language/fr-FR/fr-FR.plg_authentication_joomla.ini000060400000001437152453623440016112 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_AUTH_JOOMLA_ERR_SECRET_CODE_WITHOUT_TFA="Il vous faut activer l'authentification en deux étapes dans votre profil pour utiliser le code secret."
PLG_AUTH_JOOMLA_XML_DESCRIPTION="Système d'authentification par défaut de Joomla!<br /><strong>Attention</strong>, vous devez laisser activé au moins un plug-in d'authentification pour vous connecter sur le site !"
PLG_AUTHENTICATION_JOOMLA="Authentification - Joomla"language/fr-FR/fr-FR.plg_system_jce.sys.ini000060400000000611152453623440014505 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_JCE="Système - JCE"
PLG_SYSTEM_JCE_XML_DESCRIPTION="Plugin Système JCE"
language/fr-FR/fr-FR.plg_jce_editor-svg.sys.ini000060400000000710152453623440015244 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_JCE_EDITOR_SVG="Graphiques SVG pour JCE"
PLG_JCE_EDITOR_SVG_XML_DESC="Plugin activant la prise en charge des graphiques SVG dans l'éditeur JCE"language/fr-FR/fr-FR.plg_privacy_contact.ini000060400000001131152453623440014711 0ustar00; @date        2018-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_PRIVACY_CONTACT="Confidentialité - Contacts"
PLG_PRIVACY_CONTACT_XML_DESCRIPTION="Responsable du traitement des demandes d'informations liées à la confidentialité pour les données de base des contacts de Joomla."
language/fr-FR/fr-FR.pkg_jce_pro.sys.ini000060400000001702152453623440013762 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PKG_JCE="Pack JCE Pro Extension"
PKG_JCE_XML_DESCRIPTION="Le pack d'installation de JCE Pro inclut le composant d'administration, le plugin éditeur avec des outils complémentaires (Pro), et d'autres plugins nécessaire au fonctionnement de JCE.<br/>Le composant d'administration a pour fonction de gérer la configuration de l'éditeur, les profils utilisateurs JCE et les fonctions de leur barre d'outils, et propose un lien vers son gestionnaire de fichiers.<br /><br /><strong>Note : </strong>pour utiliser l'éditeur JCE, vous devez le déclarer comme éditeur par défaut dans la configuration de Joomla ou, dans les profils utilisateurs Joomla."
language/fr-FR/fr-FR.com_cpanel.sys.ini000060400000001200152453623440013571 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_CPANEL="Panneau d'administration"
COM_CPANEL_XML_DESCRIPTION="Composant de gestion du panneau d'administration"

COM_CPANEL_CPANEL_VIEW_DEFAULT_TITLE="Panneau d'administration"
COM_CPANEL_CPANEL_VIEW_DEFAULT_TITLE_DESC="Affiche le panneau d'administration"
language/fr-FR/fr-FR.tpl_isis.sys.ini000060400000002231152453623440013324 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


ISIS="Template d'administration Isis"
TPL_ISIS_POSITION_BOTTOM="Bas de page"
TPL_ISIS_POSITION_CPANEL="Cpanel"
TPL_ISIS_POSITION_CP_SHELL="Inutilisé"
TPL_ISIS_POSITION_DEBUG="Débogage"
TPL_ISIS_POSITION_FOOTER="Pied de page"
TPL_ISIS_POSITION_ICON="Icônes raccourcis"
TPL_ISIS_POSITION_LOGIN="Connexion"
TPL_ISIS_POSITION_MENU="Menu"
TPL_ISIS_POSITION_POSTINSTALL="Post-installation"
TPL_ISIS_POSITION_STATUS="Statut"
TPL_ISIS_POSITION_SUBMENU="Sous-menu"
TPL_ISIS_POSITION_TITLE="Titre"
TPL_ISIS_POSITION_TOOLBAR="Barre d'outils"
TPL_ISIS_XML_DESCRIPTION="Poursuivant le thème des déesses/dieux égyptiens (Khepri de Joomla 1.5 et Hathor de Joomla 1.6), Isis est le template d'administration de Joomla 3 basé sur Bootstrap et le lancement de la bibliothèque 'Joomla User Interface' (JUI)."
language/fr-FR/fr-FR.plg_jce_editor_codesample.sys.ini000060400000001026152453623440016644 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved.
; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
; Note : All ini files need to be saved as UTF-8

PLG_JCE_EDITOR_CODESAMPLE="Exemple de code pour JCE"
PLG_JCE_EDITOR_CODESAMPLE_TITLE="Exemple de code"
PLG_JCE_EDITOR_CODESAMPLE_DESC="Plugin permettant d'afficher des exemples de code dans les contenus avec l'éditeur JCE."
PLG_JCE_EDITOR_CODESAMPLE_XML_DESC="Plugin permettant d'afficher des exemples de code dans les contenus avec l'éditeur JCE"language/fr-FR/fr-FR.plg_search_contacts.sys.ini000060400000001013152453623440015500 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_SEARCH_CONTACTS="Recherche - Contacts"
PLG_SEARCH_CONTACTS_XML_DESCRIPTION="Intégration des fiches de contact dans la recherche sur le site"language/fr-FR/fr-FR.com_search.sys.ini000060400000001301152453623440013576 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

COM_SEARCH="Recherche"
COM_SEARCH_SEARCH_VIEW_DEFAULT_DESC="Affiche un formulaire de recherche personnalisable"
COM_SEARCH_SEARCH_VIEW_DEFAULT_OPTION="Défaut"
COM_SEARCH_SEARCH_VIEW_DEFAULT_TITLE="Formulaire de recherche / Résultats de recherche"
COM_SEARCH_XML_DESCRIPTION="Composant utilisé pour la recherche dans Joomla."language/fr-FR/fr-FR.com_languages.sys.ini000060400000001765152453623440014315 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_LANGUAGES="Langues"
COM_LANGUAGES_XML_DESCRIPTION="Composant de gestion des langues"

COM_LANGUAGES_INSTALLED_VIEW_DEFAULT_DESC="Affiche les paquets de langue installés sur votre site."
COM_LANGUAGES_INSTALLED_VIEW_DEFAULT_TITLE="Langues installées"
COM_LANGUAGES_LANGUAGES_VIEW_DEFAULT_DESC="Créer ou gérer les langues de contenu de votre site."
COM_LANGUAGES_LANGUAGES_VIEW_DEFAULT_TITLE="Langues de contenu"
COM_LANGUAGES_OVERRIDE_VIEW_DEFAULT_DESC="Cette interface permet de substituer des valeurs (texte) pour des chaînes de traduction."
COM_LANGUAGES_OVERRIDE_VIEW_DEFAULT_TITLE="Substitutions de traduction de langue"
language/fr-FR/fr-FR.plg_search_weblinks.sys.ini000060400000001004152453623440015500 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_SEARCH_WEBLINKS="Recherche - Liens web"
PLG_SEARCH_WEBLINKS_XML_DESCRIPTION="Intégration des liens web dans la recherche sur le site"language/fr-FR/fr-FR.com_redirect.sys.ini000060400000000742152453623440014142 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_REDIRECT="Redirections"
COM_REDIRECT_XML_DESCRIPTION="Ce composant utilise la redirection des URL"
language/fr-FR/fr-FR.com_menus.sys.ini000060400000002321152453623440013463 0ustar00; @date        2015-08-25
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_MENUS="Menus"
COM_MENUS_XML_DESCRIPTION="Composant de création de menus"

COM_MENUS_ITEMS_CHOOSE_MENU_DESC="Choisir un type de menu pour affichage direct de ses liens de menus spécifiques.<br><br>Ne pas confondre avec le <strong>Menu</strong> auquel ce lien est assigné."
COM_MENUS_ITEMS_CHOOSE_MENU_LABEL="Choisir un type de menu"
COM_MENUS_ITEMS_VIEW_DEFAULT_DESC="Affiche la liste des liens de menu."
COM_MENUS_ITEMS_VIEW_DEFAULT_TITLE="Liens de menu"
COM_MENUS_ITEM_VIEW_EDIT_DESC="Affiche un formulaire de création de nouveau lien de menu."
COM_MENUS_ITEM_VIEW_EDIT_TITLE="Nouveau lien de menu"
COM_MENUS_MENUS_VIEW_DEFAULT_DESC="Affiche une liste des types de menu."
COM_MENUS_MENUS_VIEW_DEFAULT_TITLE="Menus"
COM_MENUS_MENU_VIEW_EDIT_DESC="Affiche un formulaire de création de nouveau menu."
COM_MENUS_MENU_VIEW_EDIT_TITLE="Nouveau menu"
language/fr-FR/fr-FR.ini000060400000210721152453623440010667 0ustar00; @date        2014-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


; Common boolean values
; Note: YES, NO, TRUE, FALSE are reserved words in INI format.

; Keep this string on top
JERROR_PARSING_LANGUAGE_FILE=" : erreur(s) ligne(s) %s"

J1="1"
J2="2"
J3="3"
J4="4"
J5="5"
J6="6"
J7="7"
J8="8"
J9="9"
J10="10"
J15="15"
J20="20"
J25="25"
J30="30"
J50="50"
J75="75"
J100="100"
J150="150"
J200="200"
J250="250"
J300="300"
J500="500"

JH1="H1"
JH2="H2"
JH3="H3"
JH4="H4"
JH5="H5"
JH6="h6"

ERROR="Erreur"
INFO="Info"
MESSAGE="Message"
NOTICE="Annonce"
WARNING="Alerte"

JADMINISTRATION="Administration"
JADMINISTRATOR="Administration"
JALL="Tout"
JALL_LANGUAGE="Toutes"
JAPPLY="Enregistrer"
JARCHIVED="Archivé"
JAUTHOR="Auteur"
JAUTHOR_ASC="Auteur ascendant"
JAUTHOR_DESC="Auteur descendant"
JASSOCIATIONS_ASC="Associations ascendant"
JASSOCIATIONS_DESC="Associations descendant"
JCANCEL="Annuler"
JCATEGORIES="Catégories"
JCATEGORY="Catégorie"
JCATEGORY_ASC="Catégorie ascendant"
JCATEGORY_DESC="Catégorie descendant"
JCATEGORY_SPRINTF="Catégorie&nbsp;: %s"
JCLEAR="Effacer"
JCLIENT="Emplacement"
JCONFIG_PERMISSIONS_DESC="Droits appliqués par défaut aux groupes d'utilisateurs."
JCONFIG_PERMISSIONS_LABEL="Droits"
JCURRENT="Courant"
JDATE="Date"
JDATE_ASC="Date ascendant"
JDATE_DESC="Date descendant"
JDAY="Jour"
JDEFAULT="Défaut"
JDEFAULTLANGUAGE="Langue - Défaut"
JDETAILS="Détails"
JDISABLED="Désactivé"
JENABLED="Activé"
JFALSE="Faux"
JFEATURED="En vedette"
JFEATURED_ASC="En vedette ascendant"
JFEATURED_DESC="En vedette descendant"
JUNFEATURED="Non en vedette"
JFEATURE="Mettre en vedette"
JUNFEATURE="Ne pas mettre en vedette"
JHELP="Aide"
JHIDE="Masquer"
JINVALID_TOKEN="La dernière requête a été rejetée car elle contenait un identifiant de sécurité invalide. Veuillez actualiser la page et réessayer."
JINVALID_TOKEN_NOTICE="L'identifiant de sécurité ne correspondait pas. La demande a été interrompue pour empêcher toute violation de la sécurité. Veuillez réessayer."
JLOGIN="Connexion"
JLOGOUT="Déconnexion"
JMENU_MULTILANG_WARNING_MISSING_MODULES="Il n'y a pas de module de menu administrateur pour <strong>%s</strong>. <br>Créer un menu administrateur personnalisé et un module pour chaque langue de l'administration ou publier un module de menu défini pour toutes les langues."
JMODIFY="Modifier"
JMONTH="Mois"
JMONTH_PUBLISHED="Mois (publié)"
JNEVER="Jamais"
JNEXT="Suivante"
JNEXT_TITLE="Article suivant : %s"
JNO="Non"
JNONE="Aucun"
JOFF="Désactivé"
JON="Activé"
JONLY="Seulement"
JOPTIONS="Options"
JPREV="Précédent"
JPREVIOUS="Précédente"
JPREVIOUS_TITLE="Article précédent : %s"
JPROTECTED="Protégé"
JPUBLISHED="Publié"
JRECORD_NUMBER="Numéro d'enregistrement"
JREGISTER="S'inscrire"
JORDERINGDISABLED="Vous devez trier par ordre pour réordonner"
JSAVE="Enregistrer & Fermer"
JSELECT="Sélection"
JSTATUS="Statut"
JSTATUS_ASC="Statut ascendant"
JSTATUS_DESC="Statut descendant"
JSHOW="Afficher"
JSITE="Site"
JSUBMIT="Envoyer"
JTAG="Tags"
JTAG_DESC="Ajouter ou supprimer des tags à cet élément. Il est possible de créer un nouveau tag en entrant le nom dans le champ puis en pressant la touche Enter."
JTAG_FIELD_SELECT_DESC="Sélectionner le tag à utiliser."
JTOOLBAR="Barre d'outils"
JTRASH="Corbeille"
JTRASHED="Dans la corbeille"
JTRUE="Vrai"
JUNARCHIVE="Retirer du statut d'archive"
JUNDEFINED="Indéfini"
JUNPROTECTED="Non protégé"
JUNPUBLISHED="Non publié"
JYEAR="Année"
JVERSION="Version"
JYES="Oui"
JACTIONS="Actions pour : %s"

JACTION_ADMIN="Configurer les permissions et paramètres"
JACTION_ADMIN_COMPONENT_DESC="Droit de modification des paramètres de configuration et des permissions de cette extension."
JACTION_ADMIN_GLOBAL="Super Utilisateur"
JACTION_ADMIN_GLOBAL_DESC="Permet aux utilisateurs du groupe de réaliser toute action indépendamment des réglages."
JACTION_COMPONENT_SETTINGS="Réglages du composant"
JACTION_CREATE="Créer"
JACTION_CREATE_COMPONENT_DESC="Droit de création d'éléments de cette extension."
JACTION_DELETE="Supprimer"
JACTION_DELETE_COMPONENT_DESC="Droit de suppression d'éléments de cette extension."
JACTION_EDIT="Modifier"
JACTION_EDIT_COMPONENT_DESC="Droit de modification d'éléments de cette extension."
JACTION_EDITOWN="Modifier ses éléments"
JACTION_EDITOWN_COMPONENT_DESC="Droit de modification d'éléments par leur auteur."
JACTION_EDITVALUE="Modifier les valeurs des champs personnalisés"
JACTION_EDITVALUE_COMPONENT_DESC="Permet aux utilisateurs du groupe de modifier toute valeur des champs personnalisés soumis dans cette extension."
JACTION_EDITSTATE="Modifier le statut"
JACTION_EDITSTATE_COMPONENT_DESC="Droit de modification du statut des éléments de cette extension."
JACTION_LOGIN_ADMIN="Connexion à l'administration"
JACTION_LOGIN_OFFLINE="Accès hors-ligne"
JACTION_LOGIN_SITE="Connexion au site"
JACTION_MANAGE="Accès à l'administration"
JACTION_MANAGE_COMPONENT_DESC="Droit d'accès à l'interface d'administration de cette extension."
JACTION_OPTIONS="Ne configurer que les paramètres"
JACTION_OPTIONS_COMPONENT_DESC="Autorise les utilisateurs de ce groupe à modifier les paramètres SAUF les permissions de cette extension."

JBROWSERTARGET_MODAL="Ouvrir dans une fenêtre modale"
JBROWSERTARGET_NEW="Ouvrir dans une nouvelle fenêtre"
JBROWSERTARGET_PARENT="Ouvrir dans la fenêtre parente"
JBROWSERTARGET_POPUP="Ouvrir dans une fenêtre popup"

JERROR_ALERTNOAUTHOR="Vous n'êtes pas autorisé(e) à voir cette ressource."
JERROR_ALERTNOTEMPLATE="Le template de cet affichage n'est pas disponible."
JERROR_AN_ERROR_HAS_OCCURRED="Une erreur s'est produite"
JERROR_CORE_CREATE_NOT_PERMITTED="Création non autorisée"
JERROR_CORE_DELETE_NOT_PERMITTED="Suppression non autorisée"
JERROR_COULD_NOT_FIND_TEMPLATE="Impossible de trouver le template \"%s\"."
JERROR_INVALID_CONTROLLER="Contrôleur invalide"
JERROR_INVALID_CONTROLLER_CLASS="Classe du contrôleur invalide"
JERROR_LAYOUT_PREVIOUS_ERROR="Erreur précédente"
JERROR_LOADFILE_FAILED="Erreur de chargement du fichier de formulaire"
JERROR_LOADING_MENUS="Erreur de chargement des menus: %s"
JERROR_LOGIN_DENIED="Vous ne pouvez pas accéder à l'administration de ce site."
JERROR_MAGIC_QUOTES="Votre hôte doit désactiver magic_quotes_gpc pour utiliser cette version de Joomla!"
JERROR_NO_ITEMS_SELECTED="Aucun élément sélectionné."
JERROR_NOLOGIN_BLOCKED="Connexion refusée ! Soit votre compte a été bloqué, soit vous ne l'avez pas encore activé."
JERROR_SENDING_EMAIL="L'e-mail ne peut pas être envoyé."
JERROR_SESSION_STARTUP="Erreur lors de l'initialisation de la session."
JERROR_SAVE_FAILED="Impossible d'enregistrer les données. Erreur: %s"

JFIELD_ACCESS_DESC="Niveau d'accès du groupe et des groupes parents autorisés à voir cet élément."
JFIELD_ACCESS_LABEL="Accès"
JFIELD_ALIAS_DESC="L'alias est utilisé dans les URL SEF de Joomla!.<br />Si vous laissez ce champ vide, l'alias sera créé automatiquement à partir du titre en mode 'Unicode UTF-8', selon les paramètres SEO spécifiés dans la configuration globale.<br />Lors de l'utilisation du paramètre 'Translittération' (par défaut), l'alias est généré en minuscules avec des tirets remplaçant les espaces.<br />Le paramètre 'Unicode' conserve les caractères accentués et cyrilliques.<br />Vous pouvez spécifier l'alias manuellement, en utilisant des minuscules et des tirets. <strong>Attention</strong>, les espaces et les caractères spéciaux ne sont pas autorisés (sauf ceux interprétés par la fonction Unicode si activée) ; la valeur par défaut sera la date et l'heure si le titre est tapé en caractères non-latins."
JFIELD_ALIAS_LABEL="Alias"
JFIELD_ALIAS_PLACEHOLDER="Auto-généré à partir du titre"
JFIELD_ALT_COMPONENT_LAYOUT_DESC="Utiliser la mise en page propre aux fichiers du composant ou la remplacer par celle générée par les fichiers du template."
JFIELD_ALT_LAYOUT_LABEL="Type de mise en page"
JFIELD_ALT_MODULE_LAYOUT_DESC="Utiliser la mise en page propre aux fichiers du module ou la remplacer par celle générée par les fichiers du template."
JFIELD_ALT_PAGE_TITLE_DESC="Titre alternatif optionnel, à utiliser pour une génération spécifique de la balise TITLE."
JFIELD_ALT_PAGE_TITLE_LABEL="Titre alternatif"
JFIELD_ASSET_ID_DESC="Asset ID"
JFIELD_ASSET_ID_LABEL="Asset ID"
JFIELD_BASIS_LOGIN_DESCRIPTION_DESC="Texte à afficher sur la page de connexion."
JFIELD_BASIS_LOGIN_DESCRIPTION_LABEL="Texte de connexion"
JFIELD_BASIS_LOGIN_DESCRIPTION_SHOW_DESC="Afficher/Masquer le texte sur la page de connexion."
JFIELD_BASIS_LOGIN_DESCRIPTION_SHOW_LABEL="Afficher le texte"
JFIELD_BASIS_LOGOUT_DESCRIPTION_DESC="Afficher/Masquer le texte sur la page de déconnexion."
JFIELD_BASIS_LOGOUT_DESCRIPTION_LABEL="Texte de déconnexion"
JFIELD_BASIS_LOGOUT_DESCRIPTION_SHOW_DESC="Texte à afficher sur la page de déconnexion."
JFIELD_BASIS_LOGOUT_DESCRIPTION_SHOW_LABEL="Description de déconnexion"
JFIELD_CATEGORY_DESC="Il est possible de sélectionner une catégorie existante ou saisir une nouvelle catégorie en tapant le nom dans le champ et appuyer sur la touche Entrée."
JFIELD_DISPLAY_READONLY_DESC="Indique si le champ doit être affiché sur les formulaires en lecture seule. Hérite par défaut de la valeur définie dans le groupe de champs."
JFIELD_DISPLAY_READONLY_LABEL="Affichage quand lecture seule"
JFIELD_ENABLED_DESC="Statut d'activation de cet élément."
JFIELD_FIELDS_CATEGORY_DESC="Sélectionner la catégorie assignée à ce champ"
JFIELD_KEY_REFERENCE_DESC="Valeur utilisée pour lier cet article à un système de données externes"
JFIELD_KEY_REFERENCE_LABEL="Clé de référence"
JFIELD_LANGUAGE_DESC="Assigner cet article à une langue."
JFIELD_LANGUAGE_LABEL="Langue"
JFIELD_LOGIN_IMAGE_DESC="Image affichée sur la page de connexion."
JFIELD_LOGIN_IMAGE_LABEL="Image de connexion"
JFIELD_LOGIN_REDIRECT_URL_DESC="Vous pouvez spécifier une URL vers laquelle les utilisateurs seront dirigés après connexion.<br />L'URL doit être interne (ex: index.php?Itemid=999)."
JFIELD_LOGIN_REDIRECT_URL_LABEL="Redirection de connexion"
JFIELD_LOGOUT_IMAGE_DESC="Image à afficher sur la page de déconnexion"
JFIELD_LOGOUT_IMAGE_LABEL="Image de déconnexion"
JFIELD_LOGOUT_REDIRECT_URL_DESC="Vous pouvez spécifier une URL vers laquelle les utilisateurs seront dirigés après déconnexion.<br />L'URL doit être interne (ex: index.php?Itemid=999)."
JFIELD_LOGOUT_REDIRECT_URL_LABEL="Redirection de déconnexion"
JFIELD_LOGOUT_REDIRECT_PAGE_DESC="Sélectionner ou créer la page vers laquelle l'utilisateur sera redirigé après avoir clos la session courante en se déconnectant. La valeur par défaut redirigera vers la page d'origine."
JFIELD_LOGOUT_REDIRECT_PAGE_LABEL="Page de redirection après déconnexion"
JFIELD_META_DESCRIPTION_DESC="La métadonnée 'description' permet d'indexer une description du contenu de la page afin d'améliorer son référencement (~250 caractères).<br />Lorsque le contenu est indexé par un moteur dans les résultats d'une recherche, le texte de cette métadonnée est affiché sous le titre."
JFIELD_META_DESCRIPTION_LABEL="Description"
JFIELD_META_KEYWORDS_DESC="La métadonnée 'keywords' permet d'indexer une série de mots-clés ou d'expressions (séparés par une virgule) liés au thème du contenu."
JFIELD_META_KEYWORDS_LABEL="Mots-clés"
JFIELD_META_RIGHTS_DESC="La métadonnée 'rights' permet d'indexer les droits légaux des contenus."
JFIELD_META_RIGHTS_LABEL="Droits légaux"
JFIELD_METADATA_AUTHOR_DESC="La métadonnée 'author' permet d'indexer l'auteur du contenu."
JFIELD_METADATA_RIGHTS_DESC="Droits de publication sur cet article."
JFIELD_METADATA_RIGHTS_LABEL="Droits"
JFIELD_METADATA_ROBOTS_DESC="La métadonnée 'robots' permet de donner des instructions aux robots :<ul><li>Index, Follow : indexe le contenu et ses liens</li><li>No index, Follow : n'indexe pas le contenu mais ses liens</li><li>Index, No follow : indexe le contenu mais pas ses liens</li><li>No index, No follow : n'indexe ni le contenu ni ses liens</li></ul>"
JFIELD_METADATA_ROBOTS_LABEL="Robots"
JFIELD_METADATA_XREFERENCE_DESC="La métadonnée 'xreference' est utilisée pour lier des sources de données externes."
JFIELD_METADATA_XREFERENCE_LABEL="Référence croisée"
JFIELD_MODULE_LANGUAGE_DESC="Assigner ce module à une langue."
JFIELD_NAME_DESC="Le nom sera utilisé pour identifier le champ. Si laissé vide Joomla remplira une valeur par défaut à partir du titre."
JFIELD_NAME_LABEL="Nom"
JFIELD_NAME_PLACEHOLDER="Générer automatiquement à partir du titre"
JFIELD_NOTE_DESC="Note d'information visible en administration dans l'affichage en liste."
JFIELD_NOTE_LABEL="Note"
JFIELD_OPTION_NONE="Aucun"
JFIELD_ORDERING_DESC="Ordre d'affichage :"
JFIELD_ORDERING_LABEL="Ordre d'affichage"
JFIELD_PARAMS_LABEL="Paramètres"
JFIELD_PLG_SEARCH_ALL_DESC="Intégrer les éléments publiés dans la recherche."
JFIELD_PLG_SEARCH_ALL_LABEL="Recherche dans Publiés"
JFIELD_PLG_SEARCH_ARCHIVED_DESC="Intégrer les éléments archivés dans la recherche."
JFIELD_PLG_SEARCH_ARCHIVED_LABEL="Recherche dans Archivés"
JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC="Nombre maximum de résultats à afficher dans une recherche."
JFIELD_PLG_SEARCH_SEARCHLIMIT_LABEL="Nombre de résultats"
JFIELD_PUBLISHED_DESC="Statut de publication de cet élément."
JFIELD_READMORE_DESC="Vous pouvez attribuer un texte personnalisé au lien 'Lire la suite...'."
JFIELD_READMORE_LABEL="Texte Lire la suite..."
JFIELD_SPACER_LABEL="<span style='width:auto'><hr /></span>"
JFIELD_TITLE_DESC="Titre appliqué à cet élément."
JFIELD_VERSION_HISTORY_DESC="Ce bouton permet d'ouvrir une fenêtre pour visualiser des versions anciennes de cet élément."
JFIELD_VERSION_HISTORY_LABEL="Versions précédentes"
JFIELD_VERSION_HISTORY_SELECT="Visualiser les versions précédentes"
JFIELD_XREFERENCE_DESC="Valeur utilisée pour lier cet article à un système de données externes tel l'aide intégrée de Joomla."
JFIELD_XREFERENCE_LABEL="Clé de référence"
JGLOBAL_ACROSS="Ligne"
JGLOBAL_ACTION_PERMISSIONS_LABEL="Droits"
JGLOBAL_ACTION_PERMISSIONS_DESCRIPTION="Droits d'action sur cet article."
JGLOBAL_ADD_CUSTOM_CATEGORY="Ajouter une nouvelle catégorie"
JGLOBAL_ALL_ARTICLE="Niveaux max. d'articles"
JGLOBAL_ALL_LIST="Niveaux max. dans une liste"
JGLOBAL_ALLOW_COMMENTS_DESC="Si oui, la fonction 'Commentaires sur l'article' sera activée et les utilisateurs pourront les voir et en ajouter."
JGLOBAL_ALLOW_COMMENTS_LABEL="Autoriser les commentaires"
JGLOBAL_ALLOW_RATINGS_DESC="Si oui, la fonction 'Vote sur l'article' sera activée et les utilisateurs pourront les voir et y participer."
JGLOBAL_ALLOW_RATINGS_LABEL="Autoriser les votes"
JGLOBAL_ARCHIVE_ARTICLES_FIELD_INTROTEXTLIMIT_DESC="Indiquez le nombre de caractères devant être affiché en introduction d'article dans un affichage en Blog ou en module."
JGLOBAL_ARCHIVE_ARTICLES_FIELD_INTROTEXTLIMIT_LABEL="Longueur de l'introduction"
JGLOBAL_ARCHIVE_OPTIONS="Archives"
JGLOBAL_ARTICLE_COUNT_DESC="Afficher/Masquer le nombre d'articles dans une catégorie."
JGLOBAL_ARTICLE_COUNT_LABEL="Nombre d'articles"
JGLOBAL_ARTICLE_MANAGER_ORDER="Ordre"
JGLOBAL_ARTICLE_MANAGER_REVERSE_ORDER="Ordre inverse"
JGLOBAL_ARTICLE_ORDER_DESC="Ordre dans lequel les articles doivent être affichés."
JGLOBAL_ARTICLE_ORDER_LABEL="Ordre des articles"
JGLOBAL_ARTICLES="Articles"
JGLOBAL_ASSOC_NOT_POSSIBLE="Pour définir des associations, s'assurer que la langue de cet élément n'est pas assignée à \"Toutes\"."
JGLOBAL_ASSOCIATIONS_NEW_ITEM_WARNING="Pour créer des associations, d'abord sauvegarder l'item."
JGLOBAL_ASSOCIATIONS_PROPAGATE_BUTTON="Propager"
JGLOBAL_ASSOCIATIONS_PROPAGATE_FAILED="Échec de la propagation des associations. Il faudra peut-être les sélectionner ou les créer manuellement."
JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_ALL="Toutes les associations existantes ont été définies."
JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_NONE="Il n'y a aucune association à propager."
JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_SOME="Des associations ont été définies pour : %s"
JGLOBAL_ASSOCIATIONS_PROPAGATE_TIP="Propage les associations existantes de cet item."
JGLOBAL_ASSOCIATIONS_RESET_WARNING="La langue a été changée. Si vous sauvegardez à nouveau cet élément, les associations disponibles seront réinitialisées. Si cela n'était pas votre intention, fermez l'élément."
JGLOBAL_AUTH_ACCESS_DENIED="Accès refusé"
JGLOBAL_AUTH_ACCESS_GRANTED="Accès autorisé"
JGLOBAL_AUTH_BIND_FAILED="Échec de liaison au serveur LDAP"
JGLOBAL_AUTH_CANCEL="Authentification annulée"
JGLOBAL_AUTH_CURL_NOT_INSTALLED="Curl n'est pas installé"
JGLOBAL_AUTH_EMPTY_PASS_NOT_ALLOWED="Vous devez indiquer un mot de passe!"
JGLOBAL_AUTH_FAIL="Authentification échouée"
JGLOBAL_AUTH_FAILED="Échec de l'authentification : %s"
JGLOBAL_AUTH_INCORRECT="Identifiant/Mot de passe incorrect"
JGLOBAL_AUTH_INVALID_PASS="Le mot de passe ne correspond pas au nom d'utilisateur, ou vous n'avez pas encore de compte."
JGLOBAL_AUTH_INVALID_SECRETKEY="La clé secrète d'authentification en deux étapes est invalide."
; The following 2 strings are deprecated and will be removed with 4.0.
JGLOBAL_AUTH_NO_BIND="Liaison LDAP impossible"
JGLOBAL_AUTH_NO_CONNECT="Impossible d'établir la liaison au serveur LDAP"
JGLOBAL_AUTH_NO_REDIRECT="Impossible d'effectuer la redirection sur le serveur : %s"
JGLOBAL_AUTH_NO_USER="Le nom d'utilisateur ne correspond pas au mot de passe, ou vous n'avez pas encore de compte."
JGLOBAL_AUTH_NOT_CONNECT="Impossible de se connecter au service d'authentification."
JGLOBAL_AUTH_NOT_CREATE_DIR="Impossible de créer le répertoire FileStore %s. Veuillez vérifier que vous possédez les droits d'écriture dans le répertoire parent."
JGLOBAL_AUTH_PASS_BLANK="Le système LDAP exige un mot de passe"
JGLOBAL_AUTH_UNKNOWN_ACCESS_DENIED="Résultat inconnu. Accès refusé"
JGLOBAL_AUTH_USER_BLACKLISTED="Utilisateur en liste noire"
JGLOBAL_AUTH_USER_NOT_FOUND="Impossible de trouver l'utilisateur"
JGLOBAL_AUTHOR_ALPHABETICAL="Alphabétique des auteurs"
JGLOBAL_AUTHOR_REVERSE_ALPHABETICAL="Alphabétique inverse des auteurs"
JGLOBAL_AUTO="Automatique"
JGLOBAL_BATCH_MOVE_PARENT_NOT_FOUND="Impossible de trouver la destination parente pour ce déplacement."
JGLOBAL_BATCH_MOVE_ROW_NOT_FOUND="Impossible de trouver la ligne de destination pour ce déplacement."
JGLOBAL_BATCH_PROCESS="Traitement"
JGLOBAL_BLOG="Blog"
JGLOBAL_BLOG_LAYOUT_OPTIONS="Affichage du Blog"
JGLOBAL_CATEGORIES_OPTIONS="Catégories "
JGLOBAL_CATEGORY_LAYOUT_DESC="Sélection de mise en page"
JGLOBAL_CATEGORY_LAYOUT_LABEL="Mise en page"
JGLOBAL_CATEGORY_MANAGER_ORDER="Options de tri de la catégorie"
JGLOBAL_CATEGORY_NOT_FOUND="Catégorie introuvable"
JGLOBAL_CATEGORY_OPTIONS="Catégorie"
JGLOBAL_CATEGORY_ORDER_DESC="Ordre d'affichage des catégories."
JGLOBAL_CATEGORY_ORDER_LABEL="Ordre des catégories"
JGLOBAL_CENTER="Centre"
JGLOBAL_CHECK_ALL="Tout cocher"
JGLOBAL_CHOOSE_CATEGORY_DESC="Sélectionner ou créer une catégorie à afficher."
JGLOBAL_CHOOSE_CATEGORY_LABEL="Sélection de catégorie"
JGLOBAL_CHOOSE_COMPONENT_DESC="Choisir un composant dans la liste"
JGLOBAL_CHOOSE_COMPONENT_LABEL="Choisir un composant"
JGLOBAL_CLICK_TO_SORT_THIS_COLUMN="Cliquez sur l'icône pour trier la colonne"
JGLOBAL_CLICK_TO_TOGGLE_STATE="Cliquer sur l'icône pour changer le statut."
JGLOBAL_CONFIRM_DELETE="Êtes-vous certain de vouloir supprimer ces éléments ? Confirmer supprimera les éléments sélectionnés de façon permanente!"
JGLOBAL_COPY="(copie)"
JGLOBAL_CREATED="Créé"
JGLOBAL_CREATED_DATE="Date de création"
JGLOBAL_CUSTOM_CATEGORY="Nouvelles catégories"
JGLOBAL_CUSTOM_FIELDS_ENABLE_DESC="Activer la création de champs personnalisés."
JGLOBAL_CUSTOM_FIELDS_ENABLE_LABEL="Activer les champs personnalisés"
JGLOBAL_DATE_FORMAT_DESC="Format optionnel d'affichage de la date. Par exemple: 'D, j F Y' pour 'Vendredi, 29 Avril 2016 '. Voir https://php.net/date . Si laissé vide, la valeur de DATE_FORMAT_LC1 de votre fichier de langue sera utilisée."
JGLOBAL_DATE_FORMAT_LABEL="Format de la date"
JGLOBAL_DESCRIPTION="Description"
JGLOBAL_DISPLAY_NUM="Afficher #"
JGLOBAL_DISPLAY_SELECT_DESC="Afficher/Masquer la liste déroulante du sélecteur d'affichage."
JGLOBAL_DISPLAY_SELECT_LABEL="Sélecteur d'affichage"
JGLOBAL_DOWN="Colonne"
JGLOBAL_EDIT_ITEM="Modifier l'élément"
JGLOBAL_EDIT_PREFERENCES="Modifier les préférences"
JGLOBAL_EMAIL="E-mail"
JGLOBAL_EMAIL_DOMAIN_NOT_ALLOWED="Le domaine de mail <strong>%s</strong> n'est pas autorisé. Merci de saisir une autre adresse mail."
JGLOBAL_EMPTY_CATEGORIES_DESC="Afficher/Masquer les catégories qui ne contiennent ni article, ni sous-catégorie."
JGLOBAL_EMPTY_CATEGORIES_LABEL="Catégories vides"
JGLOBAL_ERROR_INSUFFICIENT_BATCH_INFORMATION="Information insuffisante pour effectuer l'opération par lots"
JGLOBAL_FEED_SHOW_READMORE_DESC="Afficher les liens &quot;Lire la suite&quot; dans les fils d'actualité si le texte d'introduction est affiché."
JGLOBAL_FEED_SHOW_READMORE_LABEL="Afficher &quot;Lire la suite&quot;"
JGLOBAL_FEED_SUMMARY_DESC="Le paramètre 'Texte d'introduction' n'affiche que le texte d'introduction des articles dans les fils d'actualité.<br />Le paramètre 'Texte intégral' affiche l'article complet dans les fils d'actualité."
JGLOBAL_FEED_SUMMARY_LABEL="Inclure dans le flux"
JGLOBAL_FEED_TITLE="Fils d'actualité"
JGLOBAL_FIELDS="Champs"
JGLOBAL_FIELDS_TITLE="Champs personnalisés"
JGLOBAL_FIELD_ADD="Ajouter"
JGLOBAL_FIELD_GROUPS="Groupes de champs"
JGLOBAL_FIELD_CATEGORIES_CHOOSE_CATEGORY_DESC="Sélectionnez la catégorie parente des sous-catégories à afficher."
JGLOBAL_FIELD_CATEGORIES_CHOOSE_CATEGORY_LABEL="Catégorie principale"
JGLOBAL_FIELD_CATEGORIES_DESC_DESC="Saisissez du texte dans ce champ pour remplacer la description d'origine de la catégorie principale."
JGLOBAL_FIELD_CATEGORIES_DESC_LABEL="Description alternative"
JGLOBAL_FIELD_CREATED_BY_ALIAS_DESC="Saisissez un nom dans ce champ pour remplacer celui de l'auteur de l'article."
JGLOBAL_FIELD_CREATED_BY_ALIAS_LABEL="Alias"
JGLOBAL_FIELD_CREATED_BY_DESC="Auteur de l'article."
JGLOBAL_FIELD_CREATED_BY_LABEL="Créé par"
JGLOBAL_FIELD_CREATED_DESC="Date de création de l'élément."
JGLOBAL_FIELD_CREATED_LABEL="Date de création"
JGLOBAL_FIELD_FIELD_CACHETIME_DESC="Durée en minutes entre deux actualisation du cache."
JGLOBAL_FIELD_FIELD_ORDERING_LABEL="Ordre"
JGLOBAL_FIELD_FIELD_ORDERING_DESC="Ordre d'affichage des éléments"
JGLOBAL_FIELD_ID_DESC="Numéro d'enregistrement (identification) dans la base de données."
JGLOBAL_FIELD_ID_LABEL="Id"
JGLOBAL_FIELD_LAYOUT_DESC="Choisissez dans la liste déroulante la mise en page à appliquer."
JGLOBAL_FIELD_LAYOUT_LABEL="Mise en page"
JGLOBAL_FIELD_MODIFIED_LABEL="Date de modification"
JGLOBAL_FIELD_MODIFIED_BY_DESC="L'utilisateur qui a effectué la dernière modification de l'article."
JGLOBAL_FIELD_MODIFIED_BY_LABEL="Modifié par"
JGLOBAL_FIELD_MOVE="Déplacer"
JGLOBAL_FIELD_NUM_CATEGORY_ITEMS_DESC="Nombre de catégories à afficher pour chaque niveau."
JGLOBAL_FIELD_NUM_CATEGORY_ITEMS_LABEL="Nombre de catégories"
JGLOBAL_FIELD_PUBLISH_DOWN_DESC="Indiquez si vous le souhaitez une date de fin de publication.<br />Si vous n'indiquez rien, l'article ne sera pas automatiquement au statut 'non publié' grâce à la valeur '0000-00-00 00:00:00'"
JGLOBAL_FIELD_PUBLISH_DOWN_LABEL="Fin de publication"
JGLOBAL_FIELD_PUBLISH_UP_DESC="Indiquez si vous le souhaitez une date de début de publication.<br />Si vous n'indiquez rien, la date de création est utilisée."
JGLOBAL_FIELD_PUBLISH_UP_LABEL="Début de publication"
JGLOBAL_FIELD_REMOVE="Supprimer"
JGLOBAL_FIELD_SHOW_BASE_DESCRIPTION_DESC="Afficher la description de la catégorie principale ou, alternativement, remplacer avec le texte du champ de description du lien de menu.<br />Si vous utilisez la catégorie racine comme principale, vous devez lui donner une description."
JGLOBAL_FIELD_SHOW_BASE_DESCRIPTION_LABEL="Description de la catégorie du niveau supérieur"
JGLOBAL_FIELD_VERSION_NOTE_DESC="Saisir une note facultative pour cette version de cet élément."
JGLOBAL_FIELD_VERSION_NOTE_LABEL="Note de version"
JGLOBAL_FIELDSET_ASSOCIATIONS="Associations"
JGLOBAL_FIELDSET_DISPLAY_OPTIONS="Affichage"
JGLOBAL_FIELDSET_IMAGE_OPTIONS="Images"
JGLOBAL_FIELDSET_INTEGRATION="Intégration"
JGLOBAL_FIELDSET_METADATA_OPTIONS="Métadonnées"
JGLOBAL_FIELDSET_OPTIONS="Paramètres"
JGLOBAL_FIELDSET_CONTENT="Contenu"
JGLOBAL_FIELDSET_PUBLISHING="Publication"
JGLOBAL_FIELDSET_DESCRIPTION="Description"
JGLOBAL_FIELDSET_ADVANCED="Paramètres avancés"
JGLOBAL_FIELDSET_BASIC="Paramètres"
JGLOBAL_FILTER_ATTRIBUTES_DESC="3. Liste des noms d'attributs supplémentaires. Séparez-les par un espace ou une virgule, par exemple : <i>class,title,id</i>"
JGLOBAL_FILTER_ATTRIBUTES_LABEL="Filtrer les attributs<sup>3</sup>"
JGLOBAL_FILTER_CLIENT="- Sélectionnez un emplacement -"
JGLOBAL_FILTER_FIELD_DESC="Afficher/Masquer le champ de filtre dans l'affichage en liste des articles."
JGLOBAL_FILTER_FIELD_LABEL="Champ filtre"
JGLOBAL_FILTER_GROUPS_DESC="Définit les groupes d'utilisateurs auxquels seront appliqués les filtres. Les autres groupes ne seront pas filtrés."
JGLOBAL_FILTER_GROUPS_LABEL="Filtrer les groupes"
JGLOBAL_FILTER_TAGS_DESC="2. Liste des noms de balises spécifiques à filtrer. Séparez-les par un espace ou une virgule,  par exemple : <i>p,div,span</i>"
JGLOBAL_FILTER_TAGS_LABEL="Filtrer les balises<sup>2</sup>"
JGLOBAL_FILTER_TYPE_DESC="1. Listes de filtrage des contenus insérés. <strong>Note : </strong> les filtres s'appliquent au moment de l'enregistrement, quel que soit l'éditeur utilisé ou le mode d'affichage (wysiwyg ou code).<br /><strong>Liste noire par défaut</strong><br />Interdit les balises 'applet', 'body', 'bgsound', 'base', 'basefont', 'canvas', 'embed', 'frame', 'frameset', 'head', 'html', 'id', 'iframe', 'ilayer', 'layer', 'link', 'meta', 'name', 'object', 'script', 'style', 'title', 'xml'<br />Interdit les attributs 'action', 'background', 'codebase', 'dynsrc', 'lowsrc'<br />Vous pouvez ajouter des balises et des attributs dans les champs correspondants en les séparant par une virgule.<br /><strong>Liste noire personnalisée</strong><br />Cette liste remplace la 'Liste noire par défaut' en interdisant uniquement les balises et attributs spécifiés dans les champs correspondants.<br /><strong>Liste blanche</strong><br />Seuls les balises et attributs spécifiés dans les champs seront autorisés.<br /><strong>Pas de HTML</strong> - Attention, supprime toutes les balises et attributs.<br /><strong>Aucun filtre</strong> - Attention, autorise toutes les balises et attributs."
JGLOBAL_FILTER_TYPE_LABEL="Filtrer les types<sup>1</sup>"
JGLOBAL_FULL_TEXT="Article complet"
JGLOBAL_GT="&gt;"
; The following strings is deprecated and will be removed with 4.0.
JGLOBAL_HELPREFRESH_BUTTON="Actualiser"
JGLOBAL_HISTORY_LIMIT_OPTIONS_DESC="Le nombre maximum d'anciennes versions à sauvegarder. Si zéro, toutes les anciennes versions seront sauvegardées."
JGLOBAL_HISTORY_LIMIT_OPTIONS_LABEL="Versions maximum"
JGLOBAL_HITS="Clics"
JGLOBAL_HITS_ASC="Clics ascendant"
JGLOBAL_HITS_DESC="Clics descendant"
; Deprecated, will be removed with 4.0. Please do not translate the following language string
JGLOBAL_INDEX_FOLLOW="index, follow"
; Deprecated, will be removed with 4.0. Please do not translate the following language string
JGLOBAL_INDEX_NOFOLLOW="index, nofollow"
JGLOBAL_INHERIT="Hérité"
JGLOBAL_INTEGRATION_LABEL="Intégration"
JGLOBAL_INTRO_TEXT="Texte d'introduction"
JGLOBAL_ISFREESOFTWARE="%s est un logiciel libre distribué sous licence <a href=\"https://www.gnu.org/licenses/gpl-2.0.html\" target=\"_blank\">GNU/GPL</a>."
JGLOBAL_KEEP_TYPING="Poursuite de l'insertion..."
JGLOBAL_LANGUAGE_VERSION_NOT_PLATFORM="Le pack de langue ne correspond pas à cette version de Joomla!, certaines chaînes de traduction peuvent être absentes et seront affichées en anglais."
JGLOBAL_LEAST_HITS="Moins populaires"
JGLOBAL_LEFT="Gauche"
JGLOBAL_LINK_AUTHOR_DESC="Activer/Désactiver le lien sur le nom de l'auteur vers sa page de contact.<br />Si aucune page de contact n'est attribuée à l'auteur, le lien ne sera pas actif. Le plug-in &quot;Contenu - Contact&quot; doit être activé."
JGLOBAL_LINK_AUTHOR_LABEL="Lien de contact"
JGLOBAL_LINK_CATEGORY_DESC="Activer/Désactiver le lien sur le titre de la catégorie<br />vers l'affichage en liste de ses articles."
JGLOBAL_LINK_CATEGORY_LABEL="Titre cliquable"
JGLOBAL_LINK_PARENT_CATEGORY_DESC="Activer/Désactiver le lien sur le titre de la catégorie parente<br />vers l'affichage en liste de ses articles."
JGLOBAL_LINK_PARENT_CATEGORY_LABEL="Titre cliquable"
JGLOBAL_LINKED_TITLES_DESC="Activer/Désactiver le lien sur le titre vers l'article complet.<br />Utile en affichage de type blog et dans un module (news)."
JGLOBAL_LINKED_TITLES_LABEL="Titre cliquable"
JGLOBAL_LIST="Liste"
JGLOBAL_LIST_ALIAS="(<span>Alias</span> : %s)"
JGLOBAL_LIST_ALIAS_NOTE="(<span>Alias</span>: %s, <span>Note</span> : %s)"
JGLOBAL_LIST_AUTHOR_DESC="Afficher/Masquer l'auteur de l'article l'affichage en liste."
JGLOBAL_LIST_AUTHOR_LABEL="Auteur"
JGLOBAL_LIST_HITS_DESC="Afficher/Masquer le nombre d'affichages de l'article dans l'affichage en liste."
JGLOBAL_LIST_HITS_LABEL="Nombre d'affichages"
JGLOBAL_LIST_LAYOUT_OPTIONS="Listes"
JGLOBAL_LIST_NAME="(<span>Nom</span> : %s)"
JGLOBAL_LIST_NAME_NOTE="(<span>Nom</span> : %s, <span>Note</span> : %s)"
JGLOBAL_LIST_NOTE="(<span>Note</span> : %s)"
JGLOBAL_LIST_RATINGS_DESC="Afficher/masquer l'évaluation des articles dans une liste d'articles."
JGLOBAL_LIST_RATINGS_LABEL="Afficher l'évaluation dans une liste"
JGLOBAL_LIST_TITLE_DESC="Afficher/Masquer le titre des catégories dans l'affichage en liste."
JGLOBAL_LIST_TITLE_LABEL="Nom de la catégorie"
JGLOBAL_LIST_VOTES_DESC="Afficher/masquer le vote des articles dans une liste d'articles."
JGLOBAL_LIST_VOTES_LABEL="Afficher les votes dans les listes"
JGLOBAL_LOOKING_FOR="Vue de"
JGLOBAL_LT="&lt;"
JGLOBAL_MAXIMUM_CATEGORY_LEVELS_DESC="Nombre de niveaux de sous-catégories à afficher."
JGLOBAL_MAXIMUM_CATEGORY_LEVELS_LABEL="Sous-catégories"
JGLOBAL_MAXIMUM_UPLOAD_SIZE_LIMIT="Taille maximum de téléchargement&nbsp;: <strong>%s</strong>"
JGLOBAL_MAXLEVEL_DESC="Nombre de niveaux de sous-catégories à afficher."
JGLOBAL_MAXLEVEL_LABEL="Sous-catégories"
JGLOBAL_MENU_SELECTION="Sélection des menus :"
JGLOBAL_MODIFIED="Modifié"
JGLOBAL_MODIFIED_DATE="Date de modification"
JGLOBAL_MOST_HITS="Les plus populaires"
JGLOBAL_MOST_RECENT_FIRST="Les plus récents en premier"
JGLOBAL_MULTI_COLUMN_ORDER_DESC="Colonne : les articles se suivent à la verticale.<br />Ligne : les articles se suivent à l'horizontal.<br />Note : ce paramètre n'a pas d'influence si l'affichage du blog se fait sur une seule colonne."
JGLOBAL_MULTI_COLUMN_ORDER_LABEL="Succession des articles"
JGLOBAL_MULTI_LEVEL="Multi-niveaux"
JGLOBAL_NEWITEMSFIRST_DESC="Les nouveaux éléments sont classés en premier par défaut. Vous ne pouvez modifier l'ordre qu'après enregistrement."
JGLOBAL_NEWITEMSLAST_DESC="Les nouveaux éléments sont classés en dernier par défaut. Vous ne pouvez modifier l'ordre qu'après enregistrement."
JGLOBAL_NO_ITEM_SELECTED="Aucun élément sélectionné"
JGLOBAL_NO_ORDER="Aucun ordre"
; Deprecated, will be removed with 4.0. Please do not translate the following language string
JGLOBAL_NOINDEX_FOLLOW="noindex, follow"
; Deprecated, will be removed with 4.0. Please do not translate the following language string
JGLOBAL_NOINDEX_NOFOLLOW="noindex, nofollow"
JGLOBAL_NONAPPLICABLE="N/A"
JGLOBAL_NUM_COLUMNS_DESC="Nombre de colonnes utilisées pour l'affichage de l'introduction des articles.<br />En général 1, 2 ou 3."
JGLOBAL_NUM_COLUMNS_LABEL="Nombre de colonnes"
JGLOBAL_NUM_INTRO_ARTICLES_DESC="Nombre d'articles dont seule l'introduction doit être affichée.<br />Les articles sont présentés en une ou plusieurs colonnes.<br />En général, cet affichage est utilisé pour l'ensemble des articles."
JGLOBAL_NUM_INTRO_ARTICLES_LABEL="Introduction des articles"
JGLOBAL_NUM_LEADING_ARTICLES_DESC="Nombre d'articles en pleine largeur à afficher dans le blog."
JGLOBAL_NUM_LEADING_ARTICLES_LABEL="Articles en pleine largeur"
JGLOBAL_NUM_LINKS_DESC="Nombre d'articles dont seul le titre doit être affiché, sous forme de lien.<br />Attention, ces articles ne sont pas affichés dans le blog ce qui peut perturber l'utilisateur."
JGLOBAL_NUM_LINKS_LABEL="Titres avec lien"
JGLOBAL_NUMBER_CATEGORY_ITEMS_DESC="Afficher/Masquer le nombre d'articles de la catégorie."
JGLOBAL_NUMBER_CATEGORY_ITEMS_LABEL="Nombre d'Articles"
JGLOBAL_NUMBER_ITEMS_LIST_DESC="Nombre d'articles par défaut à lister sur une page."
JGLOBAL_NUMBER_ITEMS_LIST_LABEL="Nombre d'Articles dans la Liste"
JGLOBAL_NO_MATCHING_RESULTS="Aucun résultat correspondant"
JGLOBAL_OLDEST_FIRST="Les plus anciens en premier"
JGLOBAL_ORDER_ASCENDING="Ascendant"
JGLOBAL_ORDER_DESCENDING="Descendant"
JGLOBAL_ORDER_DIRECTION_LABEL="Direction"
JGLOBAL_ORDER_DIRECTION_DESC="Ordre : Descendant = du premier au dernier - Ascendant = du dernier au premier."
JGLOBAL_ORDERING="Ordre des articles"
JGLOBAL_ORDERING_DATE_DESC="Si les articles sont classés par date, le type de date à utiliser."
JGLOBAL_ORDERING_DATE_LABEL="Classement par date"
JGLOBAL_OTPMETHOD_NONE="Désactiver l'authentification en deux étapes"
JGLOBAL_PAGINATION_DESC="Afficher/Masquer le support de pagination affichant des liens au bas des pages pour permettre de naviguer entre les pages d'un même contenu.<br />La pagination est nécessaire si les informations sont réparties sur plusieurs pages."
JGLOBAL_PAGINATION_LABEL="Pagination"
JGLOBAL_PAGINATION_RESULTS_DESC="Affiche ou masque le positionnement dans la pagination (exemple : Page 1 de 4)."
JGLOBAL_PAGINATION_RESULTS_LABEL="Position de pagination"
JGLOBAL_PASSWORD="Mot de passe"
JGLOBAL_PASSWORD_RESET_REQUIRED="Vous devez réinitialiser votre mot de passe avant de continuer."
JGLOBAL_PERMISSIONS_ANCHOR="Définir les droits"
JGLOBAL_PREVIEW="Prévisualisation"
JGLOBAL_PUBLISHED_DATE="Date de publication"
JGLOBAL_RANDOM_ORDER="Ordre aléatoire"
JGLOBAL_RATINGS="Évaluations"
JGLOBAL_RATINGS_ASC="Évaluations ascendantes"
JGLOBAL_RATINGS_DESC="Évaluations descendantes"
JGLOBAL_RECORD_HITS_DESC="Enregistrer le nombre d'affichages."
JGLOBAL_RECORD_HITS_LABEL="Enregistrer les affichages"
JGLOBAL_RECORD_NUMBER="ID d'enregistrement : %d"
JGLOBAL_REMEMBER_ME="Se souvenir de moi"
JGLOBAL_REVERSE_ORDERING="Ordre inverse des articles"
JGLOBAL_RIGHT="Droite"
JGLOBAL_ROOT="Racine"
JGLOBAL_ROOT_PARENT="- Pas de parent -"
JGLOBAL_SAVE_HISTORY_OPTIONS_DESC="Sauvegarder automatiquement ou non les versions anciennes d'un élément. Si oui, les versions anciennes seront sauvegardées automatiquement. Quand un élément sera modifié, une version précédente pourra être rétablie."
JGLOBAL_SAVE_HISTORY_OPTIONS_LABEL="Activer l'historique"
JGLOBAL_SECRETKEY="Clé secrète"
JGLOBAL_SECRETKEY_HELP="Si vous avez activé l'authentification en deux étapes dans votre compte utilisateur, merci de saisir votre clé secrète. Si vous ne savez pas ce dont il s'agit, vous pouvez laisser ce champ vide."
; The following 4 strings are deprecated and will be removed with 4.0.
JGLOBAL_SEF_ADVANCED_DESC="Le routage moderne permet des fonctionnalités avancées, mais peut modifier vos URLs. Le routage héritage garantit une compatibilité totale pour les sites existants. Ceci est configuré par composant."
JGLOBAL_SEF_ADVANCED_LABEL="Routage d'URL"
JGLOBAL_SEF_ADVANCED_LEGACY="Héritage"
JGLOBAL_SEF_ADVANCED_MODERN="Moderne"
JGLOBAL_SEF_NOIDS_DESC="Supprimer les IDs des URLs de ce composant."
JGLOBAL_SEF_NOIDS_LABEL="Supprimer les IDs des URLs"
JGLOBAL_SEF_TITLE="Routage"
JGLOBAL_SELECT_ALLOW_DENY_GROUP="Changer les droits %s pour le groupe %s."
JGLOBAL_SELECT_AN_OPTION="Sélectionnez une option"
JGLOBAL_SELECT_NO_RESULTS_MATCH="Aucun résultat trouvé"
JGLOBAL_SELECT_SOME_OPTIONS="Sélectionnez des options"
JGLOBAL_SELECTED_UPLOAD_FILE_SIZE="Taille du fichier sélectionné <strong>%s</strong>"
JGLOBAL_SELECTION_ALL="Tout sélectionner"
JGLOBAL_SELECTION_INVERT="Inverser la sélection"
JGLOBAL_SELECTION_INVERT_ALL="Activer/Désactiver toutes les sélections"
JGLOBAL_SELECTION_NONE="Effacer la sélection"
JGLOBAL_SHOW_ASSOCIATIONS_DESC="Multilingue seulement. Affiche/masque les drapeaux des articles associés ou le Code de langue URL."
JGLOBAL_SHOW_ASSOCIATIONS_LABEL="Afficher les associations"
JGLOBAL_SHOW_AUTHOR_DESC="Afficher/Masquer le nom de l'auteur de l'article."
JGLOBAL_SHOW_AUTHOR_LABEL="Auteur de l'article"
JGLOBAL_SHOW_CATEGORY_DESC="Afficher/Masquer le titre de la catégorie de l'article."
JGLOBAL_SHOW_CATEGORY_DESCRIPTION_DESC="Afficher/Masquer la description des catégories."
JGLOBAL_SHOW_CATEGORY_DESCRIPTION_LABEL="Description"
JGLOBAL_SHOW_CATEGORY_IMAGE_DESC="Afficher/Masquer l'image des catégories."
JGLOBAL_SHOW_CATEGORY_IMAGE_LABEL="Image"
JGLOBAL_SHOW_CATEGORY_HEADING_TITLE_TEXT_LABEL="Texte des sous-catégories"
JGLOBAL_SHOW_CATEGORY_HEADING_TITLE_TEXT_DESC="Si affiché, les &quot;sous-catégories&quot; seront listées dans la page en tant que sous-titres. Les sous-titres sont en général affiché avec l'attribut de balise de titre &quot;H3&quot;."
JGLOBAL_SHOW_CATEGORY_LABEL="Titre de la catégorie"
JGLOBAL_SHOW_CATEGORY_TITLE="Titre de la catégorie"
JGLOBAL_SHOW_CATEGORY_TITLE_DESC="Afficher/Masquer le titre des catégories comme sous-titre de page.<br />Les sous-titres sont habituellement affichés dans une balise 'h2'."
JGLOBAL_SHOW_CREATE_DATE_DESC="Afficher/Masquer la date et l'heure de création."
JGLOBAL_SHOW_CREATE_DATE_LABEL="Date de création"
JGLOBAL_SHOW_DATE_DESC="Afficher/Masquer la colonne de date dans la liste des articles. Sélectionnez 'Masquer' pour cacher la date, sinon sélectionnez quel type de date vous souhaitez afficher."
JGLOBAL_SHOW_DATE_LABEL="Afficher la date"
JGLOBAL_SHOW_EMAIL_ICON_DESC="Afficher/Masquer le lien d'e-mail permettant de suggérer l'article en envoyant son URL à une adresse e-mail."
JGLOBAL_SHOW_EMAIL_ICON_LABEL="Afficher l'e-mail"
JGLOBAL_SHOW_EMPTY_CATEGORIES_DESC="Afficher/Masquer les catégories vides qui ne contiennent ni article, ni sous-catégories."
JGLOBAL_SHOW_EMPTY_CATEGORIES_LABEL="Catégories vides"
JGLOBAL_SHOW_FEATURED_ARTICLES_DESC="Afficher, cacher ou afficher seulement les articles en vedette."
JGLOBAL_SHOW_FEATURED_ARTICLES_LABEL="Articles en vedette"
JGLOBAL_SHOW_FEED_LINK_DESC="Afficher/Masquer un lien de fil d'actualité RSS dans la barre d'adresse de certains navigateurs pour permettre d'afficher le contenu de la page où il se situe sur un autre site ou dans des lecteurs de fils d'actualités.<br />Vous pouvez également utiliser le module 'Fils RSS ou ATOM'."
JGLOBAL_SHOW_FEED_LINK_LABEL="Lien de fil RSS"
JGLOBAL_SHOW_FLAG_DESC="Si oui, affichera le choix de langue sous la forme des images de drapeaux. Sinon affichera le Code langue URL."
JGLOBAL_SHOW_FLAG_LABEL="Utiliser les images de drapeaux"
JGLOBAL_SHOW_FULL_DESCRIPTION="Afficher la description complète..."
JGLOBAL_SHOW_HEADINGS_DESC="Affiche ou masque les en-têtes, en affichage de type liste."
JGLOBAL_SHOW_HEADINGS_LABEL="En-têtes du tableau"
JGLOBAL_SHOW_HITS_DESC="Afficher/Masquer le nombre d'affichages de l'article."
JGLOBAL_SHOW_HITS_LABEL="Nombre d'affichages"
JGLOBAL_SHOW_ICONS_DESC="Afficher/Masquer les icônes en remplacement du texte des liens 'Imprimer' et 'Suggérer par e-mail'."
JGLOBAL_SHOW_ICONS_LABEL="Icônes de l'article"
JGLOBAL_SHOW_INTRO_DESC="Afficher/Masquer le texte d'introduction dans l'affichage complet des articles."
JGLOBAL_SHOW_INTRO_LABEL="Texte d'introduction"
JGLOBAL_SHOW_MODIFY_DATE_DESC="Afficher/Masquer la date et l'heure de modification."
JGLOBAL_SHOW_MODIFY_DATE_LABEL="Date de modification"
JGLOBAL_SHOW_NAVIGATION_DESC="Afficher/Masquer les liens 'Précédent' et 'Suivant' pour naviguer entre les articles d'une même catégorie."
JGLOBAL_SHOW_NAVIGATION_LABEL="Navigation entre articles"
JGLOBAL_SHOW_PARENT_CATEGORY_DESC="Afficher/Masquer le titre de la catégorie parente."
JGLOBAL_SHOW_PARENT_CATEGORY_LABEL="Titre de catégorie parente"
JGLOBAL_SHOW_PRINT_ICON_DESC="Afficher/Masquer le lien permettant à l'utilisateur de lancer une impression de l'article (une imprimante doit être configurée sur l'ordinateur)."
JGLOBAL_SHOW_PRINT_ICON_LABEL="Afficher Imprimer"
JGLOBAL_SHOW_PUBLISH_DATE_DESC="Afficher/Masquer la date et l'heure de publication."
JGLOBAL_SHOW_PUBLISH_DATE_LABEL="Date de publication"
JGLOBAL_SHOW_READMORE_DESC="Afficher/Masquer le lien 'Lire la suite...' lorsque l'article est affiché en format Blog ou dans un module."
JGLOBAL_SHOW_READMORE_LABEL="Lire la suite..."
JGLOBAL_SHOW_READMORE_TITLE_DESC="Afficher/Masquer dans le lien 'Lire la suite...' le titre de l'article en remplacement du texte 'la suite'."
JGLOBAL_SHOW_READMORE_TITLE_LABEL="Titre de l'article"
JGLOBAL_SHOW_READMORE_LIMIT_DESC="Nombre de caractères maximum à afficher dans le lien 'Lire titre de l'article...'"
JGLOBAL_SHOW_READMORE_LIMIT_LABEL="Nombre de caractères"
JGLOBAL_SHOW_SUBCATEGORIES_DESCRIPTION_DESC="Afficher/Masquer la description des sous-catégories."
JGLOBAL_SHOW_SUBCATEGORIES_DESCRIPTION_LABEL="Desc. sous-catégories"
JGLOBAL_SHOW_SUBCATEGORY_CONTENT_LABEL="Inclure les sous-catégories"
JGLOBAL_SHOW_SUBCATEGORY_CONTENT_DESC="Si 'Non' est sélectionné, seuls les articles de la catégorie seront affichés. Si un nombre est choisi, tous les articles de la catégorie et de ses sous-catégories, jusqu'au niveau défini inclus, seront affichés en mode blog."
JGLOBAL_SHOW_TAGS_DESC="Afficher les tags de ce lien"
JGLOBAL_SHOW_TAGS_LABEL="Afficher les tags"
JGLOBAL_SHOW_TITLE_DESC="Afficher/Masquer le titre des articles."
JGLOBAL_SHOW_TITLE_LABEL="Titre de l'article"
JGLOBAL_SHOW_UNAUTH_LINKS_DESC="Afficher/Masquer les liens vers les articles accessibles uniquement aux utilisateurs identifiés sur le site. Pour les utilisateurs non identifiés, il sera demandé de se connecter ou de créer un compte."
JGLOBAL_SHOW_UNAUTH_LINKS_LABEL="Liens non autorisés"
JGLOBAL_SHOW_VOTE_DESC="Afficher/Masquer les votes permettant aux simples utilisateurs de les voir et aux utilisateurs autorisés de voter."
JGLOBAL_SHOW_VOTE_LABEL="Vote sur les articles"
JGLOBAL_SINGLE_LEVEL="Un seul niveau"
JGLOBAL_SORT_BY="Tri des tables par&nbsp;:"
JGLOBAL_START_PUBLISH_AFTER_FINISH="La date de début de publication doit être fixée avant la date de fin de publication."
JGLOBAL_SUBHEADING_DESC="Saisissez si vous le souhaitez un sous titre de page.<br />Les sous-titres sont habituellement affichés dans une balise 'h2'."
JGLOBAL_SUBHEADING_LABEL="Sous-titre de page"
JGLOBAL_SUBMENU_CHECKIN="Déverrouiller"
JGLOBAL_SUBMENU_CLEAR_CACHE="Effacer le cache"
JGLOBAL_SUBMENU_PURGE_EXPIRED_CACHE="Effacer les fichiers cache expirés"
JGLOBAL_SUBSLIDER_BLOG_EXTENDED_LABEL="Cette option permet d'inclure des articles de sous-catégories en affichage blog."
JGLOBAL_SUBSLIDER_BLOG_LAYOUT_LABEL="Si un champ est laissé vide, les paramètres globaux seront utilisés."
JGLOBAL_SUBSLIDER_DRILL_CATEGORIES_LABEL="Ces paramètres sont également utilisés lorsque vous cliquez <br />sur l'un des liens de la catégorie de la première page ou des suivantes.<br />Il peuvent être modifiés dans les paramètres d'un lien de menu."
JGLOBAL_TITLE="Titre"
JGLOBAL_TITLE_ASC="Titre ascendant"
JGLOBAL_TITLE_DESC="Titre descendant"
JGLOBAL_TITLE_ALPHABETICAL="Alphabétique des titres"
JGLOBAL_TITLE_REVERSE_ALPHABETICAL="Alphabétique inverse des titres"
JGLOBAL_TOGGLE_FEATURED="Basculer le statut en vedette"
JGLOBAL_TOP="Haut"
JGLOBAL_TPL_CPANEL_LINK_TEXT="Retour au panneau de contrôle"
JGLOBAL_TYPE_OR_SELECT_CATEGORY="Taper ou sélectionner une catégorie"
JGLOBAL_TYPE_OR_SELECT_SOME_OPTIONS="Saisir ou sélectionner certaines options"
JGLOBAL_TYPE_OR_SELECT_SOME_TAGS="Saisir ou sélectionner certains tags"
JGLOBAL_USE_GLOBAL="Paramètres globaux"
JGLOBAL_USE_GLOBAL_VALUE="Paramètres globaux (%s)"
JGLOBAL_USERNAME="Identifiant"
JGLOBAL_VALIDATION_FORM_FAILED="Formulaire invalide"
JGLOBAL_VIEW_SITE="Voir le site"
JGLOBAL_VOTES="Votes"
JGLOBAL_VOTES_ASC="Votes ascendant"
JGLOBAL_VOTES_DESC="Votes descendant"
JGLOBAL_WARNJAVASCRIPT="Attention : JavaScript doit être activé pour un fonctionnement correct de l'interface d'administration."
JGLOBAL_WIDTH="Largeur"

JGRID_HEADING_ACCESS="Accès"
JGRID_HEADING_ACCESS_ASC="Accès ascendant"
JGRID_HEADING_ACCESS_DESC="Accès descendant"
JGRID_HEADING_CREATED_BY="Créé par"
JGRID_HEADING_ID="Id"
JGRID_HEADING_ID_ASC="ID ascendant"
JGRID_HEADING_ID_DESC="ID descendant"
JGRID_HEADING_LANGUAGE="Langue"
JGRID_HEADING_LANGUAGE_ASC="Langue ascendant"
JGRID_HEADING_LANGUAGE_DESC="Langue descendant"
JGRID_HEADING_MENU_ITEM_TYPE="Type de lien"
JGRID_HEADING_ORDERING="Ordre"
JGRID_HEADING_ORDERING_ASC="Ordre ascendant"
JGRID_HEADING_ORDERING_DESC="Ordre descendant"

JHELP_COMPONENTS_ACTIONLOGS="Components_Actionlogs"
JHELP_COMPONENTS_ASSOCIATIONS="Components_Associations"
JHELP_COMPONENTS_ASSOCIATIONS_EDIT="Components_Associations_Edit"
JHELP_COMPONENTS_BANNERS_BANNERS_EDIT="Components_Banners_Banners_Edit"
JHELP_COMPONENTS_BANNERS_BANNERS="Components_Banners_Banners"
JHELP_COMPONENTS_BANNERS_CATEGORIES="Components_Banners_Categories"
JHELP_COMPONENTS_BANNERS_CATEGORY_ADD="Components_Banners_Categories_Edit"
JHELP_COMPONENTS_BANNERS_CATEGORY_EDIT="Components_Banners_Categories_Edit"
JHELP_COMPONENTS_BANNERS_CLIENTS_EDIT="Components_Banners_Clients_Edit"
JHELP_COMPONENTS_BANNERS_CLIENTS="Components_Banners_Clients"
JHELP_COMPONENTS_BANNERS_TRACKS="Components_Banners_Tracks"
JHELP_COMPONENTS_CACHE_MANAGER_SETTINGS="Components_Cache_Manager_Settings"
JHELP_COMPONENTS_CHECK-IN_CONFIGURATION="Components_Check-in_Configuration"
JHELP_COMPONENTS_COM_ACTIONLOGS_OPTIONS="Components_User_Actionlogs_Options"
JHELP_COMPONENTS_COM_ASSOCIATIONS_OPTIONS="Components_Associations_Options"
JHELP_COMPONENTS_COM_BANNERS_OPTIONS="Components_Banner_Manager_Options"
JHELP_COMPONENTS_COM_CACHE_OPTIONS="Components_Cache_Manager_Settings"
JHELP_COMPONENTS_COM_CHECKIN_OPTIONS="Components_Check_in_Configuration"
JHELP_COMPONENTS_COM_CONTACT_OPTIONS="Components_Contact_Manager_Options"
JHELP_COMPONENTS_COM_CONTENT_OPTIONS="Components_Article_Manager_Options"
JHELP_COMPONENTS_COM_FINDER_OPTIONS="Components_Smart_Search_Configuration"
JHELP_COMPONENTS_COM_INSTALLER_OPTIONS="Components_Installer_Configuration"
JHELP_COMPONENTS_COM_JOOMLAUPDATE_OPTIONS="Components_Joomla_Update_Configuration"
JHELP_COMPONENTS_COM_LANGUAGES_OPTIONS="Components_Language_Manager_Options"
JHELP_COMPONENTS_COM_MEDIA_OPTIONS="Components_Media_Manager_Options"
JHELP_COMPONENTS_COM_MENUS_OPTIONS="Components_Menus_Configuration"
JHELP_COMPONENTS_COM_MESSAGES_OPTIONS="Components_Messages_Configuration"
JHELP_COMPONENTS_COM_MODULES_OPTIONS="Components_Module_Manager_Options"
JHELP_COMPONENTS_COM_NEWSFEEDS_OPTIONS="Components_News_Feed_Manager_Options"
JHELP_COMPONENTS_COM_PLUGINS_OPTIONS="Components_Plugin_Manager_Options"
JHELP_COMPONENTS_COM_PRIVACY_OPTIONS="Components_Privacy_Options"
JHELP_COMPONENTS_COM_POSTINSTALL_OPTIONS="Components_Post_installation_Messages_Configuration"
JHELP_COMPONENTS_COM_REDIRECT_OPTIONS="Components_Redirect_Manager_Options"
JHELP_COMPONENTS_COM_SEARCH_OPTIONS="Components_Search_Manager_Options"
JHELP_COMPONENTS_COM_TAGS_OPTIONS="Components_Tags_Manager_Options"
JHELP_COMPONENTS_COM_TEMPLATES_OPTIONS="Components_Template_Manager_Options"
JHELP_COMPONENTS_COM_USERS_OPTIONS="Components_Users_Configuration"
JHELP_COMPONENTS_COM_WEBLINKS_OPTIONS="Components_Web_Links_Manager_Options"
JHELP_COMPONENTS_CONTACT_CATEGORIES="Components_Contacts_Categories"
JHELP_COMPONENTS_CONTACT_CATEGORY_ADD="Components_Contacts_Categories_Edit"
JHELP_COMPONENTS_CONTACT_CATEGORY_EDIT="Components_Contacts_Categories_Edit"
JHELP_COMPONENTS_CONTACTS_CONTACTS_EDIT="Components_Contacts_Contacts_Edit"
JHELP_COMPONENTS_CONTACTS_CONTACTS="Components_Contacts_Contacts"
JHELP_COMPONENTS_CONTENT_CATEGORIES="Components_Content_Categories"
JHELP_COMPONENTS_CONTENT_CATEGORY_ADD="Components_Content_Categories_Edit"
JHELP_COMPONENTS_CONTENT_CATEGORY_EDIT="Components_Content_Categories_Edit"
JHELP_COMPONENTS_FIELDS_FIELDS="Components_Fields_Fields"
JHELP_COMPONENTS_FIELDS_FIELDS_EDIT="Components_Fields_Fields_Edit"
JHELP_COMPONENTS_FIELDS_FIELD_GROUPS="Components_Fields_Field_Groups"
JHELP_COMPONENTS_FIELDS_FIELD_GROUPS_EDIT="Components_Fields_Field_Groups_Edit"
JHELP_COMPONENTS_FINDER_MANAGE_CONTENT_MAPS="Components_Finder_Manage_Content_Maps"
JHELP_COMPONENTS_FINDER_MANAGE_INDEXED_CONTENT="Components_Finder_Manage_Indexed_Content"
JHELP_COMPONENTS_FINDER_MANAGE_SEARCH_FILTERS_EDIT="Components_Finder_Manage_Search_Filters_Edit"
JHELP_COMPONENTS_FINDER_MANAGE_SEARCH_FILTERS="Components_Finder_Manage_Search_Filters"
JHELP_COMPONENTS_INSTALLER_CONFIGURATION="Components_Installer_Configuration"
JHELP_COMPONENTS_JOOMLA_UPDATE="Components_Joomla_Update"
JHELP_COMPONENTS_JOOMLA_UPDATE_CONFIGURATION="Components_Joomla_Update_Configuration"
JHELP_COMPONENTS_MENUS_CONFIGURATION="Components_Menus_Configuration"
JHELP_COMPONENTS_MESSAGES_CONFIGURATION="Components_Messages_Configuration"
JHELP_COMPONENTS_MESSAGING_INBOX="Components_Messaging_Inbox"
JHELP_COMPONENTS_MESSAGING_READ="Components_Messaging_Read"
JHELP_COMPONENTS_MESSAGING_WRITE="Components_Messaging_Write"
JHELP_COMPONENTS_NEWSFEEDS_CATEGORIES="Components_Newsfeeds_Categories"
JHELP_COMPONENTS_NEWSFEEDS_CATEGORY_ADD="Components_Newsfeeds_Categories_Edit"
JHELP_COMPONENTS_NEWSFEEDS_CATEGORY_EDIT="Components_Newsfeeds_Categories_Edit"
JHELP_COMPONENTS_NEWSFEEDS_FEEDS_EDIT="Components_Newsfeeds_Feeds_Edit"
JHELP_COMPONENTS_NEWSFEEDS_FEEDS="Components_Newsfeeds_Feeds"
JHELP_COMPONENTS_POST_INSTALLATION_MESSAGES="Components_Post_installation_Messages"
JHELP_COMPONENTS_PRIVACY_CAPABILITIES="Components_Privacy_Capabilities"
JHELP_COMPONENTS_PRIVACY_CONSENTS="Components_Privacy_Consents"
JHELP_COMPONENTS_PRIVACY_DASHBOARD="Components_Privacy_Dashboard"
JHELP_COMPONENTS_PRIVACY_REQUEST="Components_Privacy_Request"
JHELP_COMPONENTS_PRIVACY_REQUEST_EDIT="Components_Privacy_Request_Edit"
JHELP_COMPONENTS_PRIVACY_REQUESTS="Components_Privacy_Requests"
JHELP_COMPONENTS_REDIRECT_MANAGER_EDIT="Components_Redirect_Manager_Edit"
JHELP_COMPONENTS_REDIRECT_MANAGER="Components_Redirect_Manager"
JHELP_COMPONENTS_SEARCH="Components_Search"
JHELP_COMPONENTS_SMART_SEARCH_CONFIGURATION="Components_Smart_Search_Configuration"
JHELP_COMPONENTS_TAGS_MANAGER="Components_Tags_Manager"
JHELP_COMPONENTS_TAGS_MANAGER_EDIT="Components_Tags_Manager_Edit"
JHELP_COMPONENTS_USERS_CATEGORIES="Users_User_Note_Categories"
JHELP_COMPONENTS_USERS_CATEGORY_ADD="Users_User_Note_Category_Edit"
JHELP_COMPONENTS_USERS_CATEGORY_EDIT="Users_User_Note_Category_Edit"
JHELP_COMPONENTS_WEBLINKS_CATEGORIES="Components_Weblinks_Categories"
JHELP_COMPONENTS_WEBLINKS_CATEGORY_ADD="Components_Weblinks_Categories_Edit"
JHELP_COMPONENTS_WEBLINKS_CATEGORY_EDIT="Components_Weblinks_Categories_Edit"
JHELP_COMPONENTS_WEBLINKS_LINKS_EDIT="Components_Weblinks_Links_Edit"
JHELP_COMPONENTS_WEBLINKS_LINKS="Components_Weblinks_Links"
JHELP_CONTENT_ARTICLE_MANAGER="Content_Article_Manager"
JHELP_CONTENT_ARTICLE_MANAGER_EDIT="Content_Article_Manager_Edit"
JHELP_CONTENT_FEATURED_ARTICLES="Content_Featured_Articles"
JHELP_CONTENT_MEDIA_MANAGER="Content_Media_Manager"
JHELP_EXTENSIONS_EXTENSION_MANAGER_DATABASE="Extensions_Extension_Manager_Database"
JHELP_EXTENSIONS_EXTENSION_MANAGER_DISCOVER="Extensions_Extension_Manager_Discover"
JHELP_EXTENSIONS_EXTENSION_MANAGER_INSTALL="Extensions_Extension_Manager_Install"
JHELP_EXTENSIONS_EXTENSION_MANAGER_LANGUAGES="Extensions_Extension_Manager_languages"
JHELP_EXTENSIONS_EXTENSION_MANAGER_MANAGE="Extensions_Extension_Manager_Manage"
JHELP_EXTENSIONS_EXTENSION_MANAGER_UPDATE="Extensions_Extension_Manager_Update"
JHELP_EXTENSIONS_EXTENSION_MANAGER_UPDATESITES="Extensions_Extension_Manager_Updatesites"
JHELP_EXTENSIONS_EXTENSION_MANAGER_WARNINGS="Extensions_Extension_Manager_Warnings"
JHELP_EXTENSIONS_LANGUAGE_MANAGER_CONTENT="Extensions_Language_Manager_Content"
JHELP_EXTENSIONS_LANGUAGE_MANAGER_EDIT="Extensions_Language_Manager_Edit"
JHELP_EXTENSIONS_LANGUAGE_MANAGER_INSTALLED="Extensions_Language_Manager_Installed"
JHELP_EXTENSIONS_LANGUAGE_MANAGER_OVERRIDES="Extensions_Language_Manager_Overrides"
JHELP_EXTENSIONS_LANGUAGE_MANAGER_OVERRIDES_EDIT="Extensions_Language_Manager_Overrides_Edit"
JHELP_EXTENSIONS_MODULE_MANAGER="Extensions_Module_Manager"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_CUSTOM="Extensions_Module_Manager_Admin_Custom"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_FEED="Extensions_Module_Manager_Admin_Feed"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_LATEST="Extensions_Module_Manager_Admin_Latest"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_LATESTACTIONS="Extensions_Module_Manager_Admin_Latestactions"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_LOGGED="Extensions_Module_Manager_Admin_Logged"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_LOGIN="Extensions_Module_Manager_Admin_Login"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_MENU="Extensions_Module_Manager_Admin_Menu"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_MULTILANG="Extensions_Module_Manager_Admin_Multilang"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_ONLINE="Extensions_Module_Manager_Admin_Online"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_POPULAR="Extensions_Module_Manager_Admin_Popular"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_PRIVACY_DASHBOARD="Extensions_Module_Manager_Admin_Privacy_Dashboard"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_QUICKICON="Extensions_Module_Manager_Admin_Quickicon"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_STATUS="Extensions_Module_Manager_Admin_Status"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_SUBMENU="Extensions_Module_Manager_Admin_Submenu"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_TITLE="Extensions_Module_Manager_Admin_Title"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_TOOLBAR="Extensions_Module_Manager_Admin_Toolbar"
JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_UNREAD="Extensions_Module_Manager_Admin_Unread"
JHELP_EXTENSIONS_MODULE_MANAGER_ARTICLES_ARCHIVE="Extensions_Module_Manager_Articles_Archive"
JHELP_EXTENSIONS_MODULE_MANAGER_ARTICLES_CATEGORIES="Extensions_Module_Manager_Articles_Categories"
JHELP_EXTENSIONS_MODULE_MANAGER_ARTICLES_CATEGORY="Extensions_Module_Manager_Articles_Category"
JHELP_EXTENSIONS_MODULE_MANAGER_ARTICLES_NEWSFLASH="Extensions_Module_Manager_Articles_Newsflash"
JHELP_EXTENSIONS_MODULE_MANAGER_ARTICLES_RELATED="Extensions_Module_Manager_Articles_Related"
JHELP_EXTENSIONS_MODULE_MANAGER_BANNERS="Extensions_Module_Manager_Banners"
JHELP_EXTENSIONS_MODULE_MANAGER_BREADCRUMBS="Extensions_Module_Manager_Breadcrumbs"
JHELP_EXTENSIONS_MODULE_MANAGER_CUSTOM_HTML="Extensions_Module_Manager_Custom_HTML"
JHELP_EXTENSIONS_MODULE_MANAGER_EDIT="Extensions_Module_Manager_Edit"
JHELP_EXTENSIONS_MODULE_MANAGER_FEED_DISPLAY="Extensions_Module_Manager_Feed_Display"
JHELP_EXTENSIONS_MODULE_MANAGER_FOOTER="Extensions_Module_Manager_Footer"
JHELP_EXTENSIONS_MODULE_MANAGER_LANGUAGE_SWITCHER="Extensions_Module_Manager_Language_Switcher"
JHELP_EXTENSIONS_MODULE_MANAGER_LATEST_NEWS="Extensions_Module_Manager_Latest_News"
JHELP_EXTENSIONS_MODULE_MANAGER_LATEST_USERS="Extensions_Module_Manager_Latest_Users"
JHELP_EXTENSIONS_MODULE_MANAGER_LOGIN="Extensions_Module_Manager_Login"
JHELP_EXTENSIONS_MODULE_MANAGER_MENU="Extensions_Module_Manager_Menu"
JHELP_EXTENSIONS_MODULE_MANAGER_MOST_READ="Extensions_Module_Manager_Most_Read"
JHELP_EXTENSIONS_MODULE_MANAGER_RANDOM_IMAGE="Extensions_Module_Manager_Random_Image"
JHELP_EXTENSIONS_MODULE_MANAGER_SEARCH="Extensions_Module_Manager_Search"
JHELP_EXTENSIONS_MODULE_MANAGER_SMART_SEARCH="Extensions_Module_Manager_Smart_Search"
JHELP_EXTENSIONS_MODULE_MANAGER_STATISTICS="Extensions_Module_Manager_Statistics"
JHELP_EXTENSIONS_MODULE_MANAGER_SYNDICATION_FEEDS="Extensions_Module_Manager_Syndication_Feeds"
JHELP_EXTENSIONS_MODULE_MANAGER_TAGS_POPULAR="Extensions_Module_Manager_Tags_Popular"
JHELP_EXTENSIONS_MODULE_MANAGER_TAGS_SIMILAR="Extensions_Module_Manager_Tags_Similar"
JHELP_EXTENSIONS_MODULE_MANAGER_WEBLINKS="Extensions_Module_Manager_Weblinks"
JHELP_EXTENSIONS_MODULE_MANAGER_WHO_ONLINE="Extensions_Module_Manager_Who_Online"
JHELP_EXTENSIONS_MODULE_MANAGER_WRAPPER="Extensions_Module_Manager_Wrapper"
JHELP_EXTENSIONS_PLUGIN_MANAGER="Extensions_Plugin_Manager"
JHELP_EXTENSIONS_PLUGIN_MANAGER_EDIT="Extensions_Plugin_Manager_Edit"
JHELP_EXTENSIONS_TEMPLATE_MANAGER_STYLES="Extensions_Template_Manager_Styles"
JHELP_EXTENSIONS_TEMPLATE_MANAGER_STYLES_EDIT="Extensions_Template_Manager_Styles_Edit"
JHELP_EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES="Extensions_Template_Manager_Templates"
JHELP_EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES_EDIT="Extensions_Template_Manager_Templates_Edit"
JHELP_EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES_EDIT_SOURCE="Extensions_Template_Manager_Templates_Edit_Source"
JHELP_GLOSSARY="Glossary"
JHELP_MENUS_MENU_ITEM_ARTICLE_ARCHIVED="Menus_Menu_Item_Article_Archived"
JHELP_MENUS_MENU_ITEM_ARTICLE_CATEGORIES="Menus_Menu_Item_Article_Categories"
JHELP_MENUS_MENU_ITEM_ARTICLE_CATEGORY_BLOG="Menus_Menu_Item_Article_Category_Blog"
JHELP_MENUS_MENU_ITEM_ARTICLE_CATEGORY_LIST="Menus_Menu_Item_Article_Category_List"
JHELP_MENUS_MENU_ITEM_ARTICLE_CREATE="Menus_Menu_Item_Article_Create"
JHELP_MENUS_MENU_ITEM_ARTICLE_FEATURED="Menus_Menu_Item_Article_Featured"
JHELP_MENUS_MENU_ITEM_ARTICLE_SINGLE_ARTICLE="Menus_Menu_Item_Article_Single_Article"
JHELP_MENUS_MENU_ITEM_CONTACT_CATEGORIES="Menus_Menu_Item_Contact_Categories"
JHELP_MENUS_MENU_ITEM_CONTACT_CATEGORY="Menus_Menu_Item_Contact_Category"
JHELP_MENUS_MENU_ITEM_CONTACT_FEATURED="Menus_Menu_Item_Contact_Featured"
JHELP_MENUS_MENU_ITEM_CONTACT_SINGLE_CONTACT="Menus_Menu_Item_Contact_Single_Contact"
JHELP_MENUS_MENU_ITEM_DISPLAY_SITE_CONFIGURATION="Menus_Menu_Item_Display_Site_Configuration"
JHELP_MENUS_MENU_ITEM_DISPLAY_TEMPLATE_OPTIONS="Menus_Menu_Item_Display_Template_Options"
JHELP_MENUS_MENU_ITEM_EXTERNAL_URL="Menus_Menu_Item_External_URL"
JHELP_MENUS_MENU_ITEM_FINDER_SEARCH="Menus_Menu_Item_Finder_Search"
JHELP_MENUS_MENU_ITEM_MANAGER="Menus_Menu_Item_Manager"
JHELP_MENUS_MENU_ITEM_MANAGER_EDIT="Menus_Menu_Item_Manager_Edit"
JHELP_MENUS_MENU_ITEM_MENU_ITEM_ALIAS="Menus_Menu_Item_Menu_Item_Alias"
JHELP_MENUS_MENU_ITEM_MENU_ITEM_HEADING="Menus_Menu_Item_Menu_Item_Heading"
JHELP_MENUS_MENU_ITEM_NEWSFEED_CATEGORIES="Menus_Menu_Item_Newsfeed_Categories"
JHELP_MENUS_MENU_ITEM_NEWSFEED_CATEGORY="Menus_Menu_Item_Newsfeed_Category"
JHELP_MENUS_MENU_ITEM_NEWSFEED_SINGLE_NEWSFEED="Menus_Menu_Item_Newsfeed_Single_Newsfeed"
JHELP_MENUS_MENU_ITEM_PRIVACY_CONFIRM_REQUEST="Menus_Menu_Item_Privacy_Confirm_Request"
JHELP_MENUS_MENU_ITEM_PRIVACY_CREATE_REQUEST="Menus_Menu_Item_Privacy_Create_Request"
JHELP_MENUS_MENU_ITEM_PRIVACY_REMIND_REQUEST="Menus_Menu_Item_Privacy_Remind_Request"
JHELP_MENUS_MENU_ITEM_SEARCH_RESULTS="Menus_Menu_Item_Search_Results"
JHELP_MENUS_MENU_ITEM_TAGS_ITEMS_COMPACT_LIST="Menus_Menu_Item_Tags_Items_Compact_List"
JHELP_MENUS_MENU_ITEM_TAGS_ITEMS_LIST="Menus_Menu_Item_Tags_Items_List"
JHELP_MENUS_MENU_ITEM_TAGS_ITEMS_LIST_ALL="Menus_Menu_Item_Tags_Items_List_All"
JHELP_MENUS_MENU_ITEM_TEXT_SEPARATOR="Menus_Menu_Item_Text_Separator"
JHELP_MENUS_MENU_ITEM_USER_LOGIN="Menus_Menu_Item_User_Login"
JHELP_MENUS_MENU_ITEM_USER_LOGOUT="Menus_Menu_Item_User_Logout"
JHELP_MENUS_MENU_ITEM_USER_PASSWORD_RESET="Menus_Menu_Item_User_Password_Reset"
JHELP_MENUS_MENU_ITEM_USER_PROFILE="Menus_Menu_Item_User_Profile"
JHELP_MENUS_MENU_ITEM_USER_PROFILE_EDIT="Menus_Menu_Item_User_Profile_Edit"
JHELP_MENUS_MENU_ITEM_USER_REGISTRATION="Menus_Menu_Item_User_Registration"
JHELP_MENUS_MENU_ITEM_USER_REMINDER="Menus_Menu_Item_User_Reminder"
JHELP_MENUS_MENU_ITEM_WEBLINK_CATEGORIES="Menus_Menu_Item_Weblink_Categories"
JHELP_MENUS_MENU_ITEM_WEBLINK_CATEGORY="Menus_Menu_Item_Weblink_Category"
JHELP_MENUS_MENU_ITEM_WEBLINK_SUBMIT="Menus_Menu_Item_Weblink_Submit"
JHELP_MENUS_MENU_ITEM_WRAPPER="Menus_Menu_Item_Wrapper"
JHELP_MENUS_MENU_MANAGER="Menus_Menu_Manager"
JHELP_MENUS_MENU_MANAGER_EDIT="Menus_Menu_Manager_Edit"
JHELP_SITE_GLOBAL_CONFIGURATION="Site_Global_Configuration"
JHELP_SITE_MAINTENANCE_CLEAR_CACHE="Site_Maintenance_Clear_Cache"
JHELP_SITE_MAINTENANCE_GLOBAL_CHECK-IN="Site_Maintenance_Global_Check-in"
JHELP_SITE_MAINTENANCE_PURGE_EXPIRED_CACHE="Site_Maintenance_Purge_Expired_Cache"
JHELP_SITE_SYSTEM_INFORMATION="Site_System_Information"
JHELP_ADMIN_USER_PROFILE_EDIT="Site_My_Profile"
JHELP_START_HERE="Start_Here"
JHELP_USERS_ACCESS_LEVELS="Users_Access_Levels"
JHELP_USERS_ACCESS_LEVELS_EDIT="Users_Access_Levels_Edit"
JHELP_USERS_DEBUG_GROUPS="Users_Debug_Groups"
JHELP_USERS_DEBUG_USERS="Users_Debug_Users"
JHELP_USERS_GROUPS="Users_Groups"
JHELP_USERS_GROUPS_EDIT="Users_Groups_Edit"
JHELP_USERS_MASS_MAIL_USERS="Users_Mass_Mail_Users"
JHELP_USERS_USER_MANAGER="Users_User_Manager"
JHELP_USERS_USER_MANAGER_EDIT="Users_User_Manager_Edit"
JHELP_USERS_USER_NOTES="Users_User_Notes"
JHELP_USERS_USER_NOTES_EDIT="Users_User_Notes_Edit"

; if there is an error connecting database before initialisation, en-GB.lib_joomla.ini can't be loaded
; we therefore have to load the strings from en-GB.ini

JLIB_DATABASE_ERROR_ADAPTER_MYSQL="L'adaptateur MySQL 'mysql' n'est pas disponible."
JLIB_DATABASE_ERROR_ADAPTER_MYSQLI="L'adaptateur MySQL 'mysqli' n'est pas disponible."
JLIB_DATABASE_ERROR_CONNECT_DATABASE="Échec de connexion à la base de données : %s"
JLIB_DATABASE_ERROR_CONNECT_MYSQL="Échec de connexion à la base de données à MySQL."
JLIB_DATABASE_ERROR_DATABASE_CONNECT="Échec de connexion à la base de données"
JLIB_DATABASE_ERROR_LOAD_DATABASE_DRIVER="Échec du chargement du pilote de base de données : %s"
JLIB_ERROR_INFINITE_LOOP="Boucle infinie détectée dans JError"

JOPTION_ACCESS_SHOW_ALL_ACCESS="Afficher tous les accès"
JOPTION_ACCESS_SHOW_ALL_GROUPS="Afficher tous les groupes"
JOPTION_ACCESS_SHOW_ALL_LEVELS="Afficher tous les niveaux d'accès"
JOPTION_ALL_CATEGORIES="- Toutes les catégories -"
JOPTION_ANY_CATEGORY="N'importe quelle catégorie"
JOPTION_ANY="Tous"
JOPTION_DO_NOT_USE="- Aucune Sélection -"
JOPTION_FROM_COMPONENT="---Du composant---"
JOPTION_FROM_MODULE="---Du module---"
JOPTION_FROM_TEMPLATE="---Du template %s---"
JOPTION_FROM_STANDARD="---Configuration globale---"
JOPTION_MENUS="Menus"
JOPTION_NO_USER="- Aucun utilisateur -"
JOPTION_OPTIONAL="Facultatif"
JOPTION_ORDER_FIRST="Ordre croissant"
JOPTION_ORDER_LAST="Ordre décroissant"
JOPTION_REQUIRED="Requis"
JOPTION_SELECT_ACCESS="- Sélectionner un niveau d'accès -"
JOPTION_SELECT_AUTHOR_ALIAS="- Sélectionner un pseudo d'auteur -"
JOPTION_SELECT_AUTHOR_ALIASES="- Sélectionner des pseudos d'auteur -"
JOPTION_SELECT_AUTHOR="- Sélectionner un auteur -"
JOPTION_SELECT_AUTHORS="- Sélectionner des auteurs -"
JOPTION_SELECT_CATEGORY="- Sélectionner une catégorie -"
JOPTION_SELECT_EDITOR="- Sélectionner un éditeur -"
JOPTION_SELECT_IMAGE="- Sélectionner une image -"
JOPTION_SELECT_LANGUAGE="- Sélectionner une langue -"
JOPTION_SELECT_MENU="- Sélectionner un menu -"
JOPTION_SELECT_MENU_ITEM="- Sélectionner un lien de menu -"
JOPTION_SELECT_PUBLISHED="- Sélectionner un statut -"
JOPTION_SELECT_TEMPLATE="- Sélectionner un template -"
JOPTION_SELECT_MAX_LEVELS="- Sélectionner les niveaux max. -"
JOPTION_SELECT_TAG="- Sélectionner un tag -"
JOPTION_UNASSIGNED="Non assigné"
JOPTION_USE_DEFAULT_MODULE_SETTING="- Utiliser les paramètres par défaut du module -"
JOPTION_USE_DEFAULT="- Paramètres par défaut -"
JOPTION_USE_MENU_REQUEST_SETTING="- Utiliser les paramètres du menu ou du lien -"

JSEARCH_FILTER_LABEL="Filtrer :"
JSEARCH_FILTER_CLEAR="Effacer"
JSEARCH_FILTER_SUBMIT="Rechercher"
JSEARCH_FILTER="Rechercher"
JSEARCH_TITLE="Rechercher %s"
JSEARCH_RESET="Réinitialiser"

JTOGGLE_SIDEBAR_LABEL="Barre latérale"
JTOGGLE_HIDE_SIDEBAR="Cacher la barre latérale"
JTOGGLE_SHOW_SIDEBAR="Afficher la barre latérale"

JTOOLBAR_APPLY="Enregistrer"
JTOOLBAR_ARCHIVE="Archiver"
JTOOLBAR_ASSIGN="Assigner"
JTOOLBAR_ASSOCIATIONS="Associations"
JTOOLBAR_BACK="Retour"
JTOOLBAR_BATCH="Traitement"
JTOOLBAR_BULK_IMPORT="Importer en masse"
JTOOLBAR_CANCEL="Annuler"
JTOOLBAR_CHECKIN="Déverrouiller"
JTOOLBAR_CLOSE="Fermer"
JTOOLBAR_DEFAULT="Défaut"
JTOOLBAR_DELETE="Supprimer"
JTOOLBAR_DELETE_ALL="Tout supprimer"
JTOOLBAR_DISABLE="Désactiver"
JTOOLBAR_DUPLICATE="Dupliquer"
JTOOLBAR_EDIT="Modifier"
JTOOLBAR_EDIT_CSS="Modifier le CSS"
JTOOLBAR_EDIT_HTML="Modifier le HTML"
JTOOLBAR_EMPTY_TRASH="Vider la corbeille"
JTOOLBAR_ENABLE="Activer"
JTOOLBAR_EXPORT="Exporter"
JTOOLBAR_HELP="Aide"
JTOOLBAR_INSTALL="Installer"
JTOOLBAR_NEW="Nouveau"
JTOOLBAR_OPTIONS="Paramètres"
JTOOLBAR_PUBLISH="Publier"
JTOOLBAR_PURGE_CACHE="Effacer le cache"
JTOOLBAR_REBUILD="Reconstruire"
JTOOLBAR_REBUILD_FAILED="Échec de la reconstruction : %s"
JTOOLBAR_REBUILD_SUCCESS="Reconstruit."
JTOOLBAR_REFRESH_CACHE="Régénérer le cache"
JTOOLBAR_REMOVE="Supprimer"
JTOOLBAR_SAVE="Enregistrer & Fermer"
JTOOLBAR_SAVE_AND_NEW="Enregistrer & Nouveau"
JTOOLBAR_SAVE_AS_COPY="Enregistrer une copie"
JTOOLBAR_UNARCHIVE="Désarchiver"
JTOOLBAR_UNINSTALL="Désinstaller"
JTOOLBAR_UNPUBLISH="Dépublier"
JTOOLBAR_UPLOAD="Transférer"
JTOOLBAR_TRASH="Corbeille"
JTOOLBAR_UNTRASH="Restaurer"
JTOOLBAR_VERSIONS="Versions"

JWARNING_PUBLISH_MUST_SELECT="Vous devez sélectionner un élément à publier."
JWARNING_ARCHIVE_MUST_SELECT="Vous devez sélectionner un élément à archiver."
JWARNING_UNPUBLISH_MUST_SELECT="Vous devez sélectionner un élément à dépublier."
JWARNING_TRASH_MUST_SELECT="Vous devez sélectionner un élément à mettre à la corbeille."
JWARNING_DELETE_MUST_SELECT="Vous devez sélectionner un élément à supprimer définitivement."
JWARNING_REMOVE_ROOT_USER="Vous êtes connecté à l'aide du profil utilisateur de secours 'Root' spécifié dans le fichier configuration.php.<br />Pour des raisons de sécurité, vous devez supprimer $root_user du fichier 'configuration.php' dès que vous avez repris le contrôle de votre site.<br /><a href='%s'>Cliquez sur ce lien pour tenter de le supprimer automatiquement</a> (vous devez posséder les droits d'écriture sur le fichier)."
JWARNING_REMOVE_ROOT_USER_ADMIN="Le profil utilisateur de secours 'Root' est actuellement activé pour l’utilisateur  (id): %s.<br />Vous devez supprimer '$root_user' de 'configuration.php' dès que vous avez restauré le contrôle de votre site pour éviter de futures atteintes à la sécurité.<br /><a href='%s'>Cliquer ici pour tenter de le faire automatiquement.</a>"

; Date format

DATE_FORMAT_LC="l j F Y"
DATE_FORMAT_LC1="l j F Y"
DATE_FORMAT_LC2="l j F Y H:i"
DATE_FORMAT_LC3="j F Y"
DATE_FORMAT_LC4="j/m/y"
DATE_FORMAT_LC5="Y-m-d H:i"
DATE_FORMAT_LC6="d-m-Y H:i:s"
DATE_FORMAT_JS1="j/m/y"
DATE_FORMAT_CALENDAR_DATE="%d-%m-%Y"
DATE_FORMAT_CALENDAR_DATETIME="%d-%m-%Y %H:%M:%S"
DATE_FORMAT_FILTER_DATE="d-m-Y"
DATE_FORMAT_FILTER_DATETIME="d-m-Y H:i:s"

; Months

JANUARY_SHORT="Jan"
JANUARY="janvier"
FEBRUARY_SHORT="Fév"
FEBRUARY="février"
MARCH_SHORT="Mar"
MARCH="mars"
APRIL_SHORT="Avr"
APRIL="avril"
MAY_SHORT="Mai"
MAY="mai"
JUNE_SHORT="Jui"
JUNE="juin"
JULY_SHORT="Juil"
JULY="juillet"
AUGUST_SHORT="Aoû"
AUGUST="août"
SEPTEMBER_SHORT="Sep"
SEPTEMBER="septembre"
OCTOBER_SHORT="Oct"
OCTOBER="octobre"
NOVEMBER_SHORT="Nov"
NOVEMBER="novembre"
DECEMBER_SHORT="Déc"
DECEMBER="décembre"

; Days of the Week

SAT="Sam"
SATURDAY="samedi"
SUN="Dim"
SUNDAY="dimanche"
MON="Lun"
MONDAY="lundi"
TUE="Mar"
TUESDAY="mardi"
WED="Mer"
WEDNESDAY="mercredi"
THU="Jeu"
THURSDAY="jeudi"
FRI="Ven"
FRIDAY="vendredi"

; Localised number format

DECIMALS_SEPARATOR=","
THOUSANDS_SEPARATOR=" "

; Time Zones - this data has been removed as it is no longer used by Joomla 3.x

; Mailer Codes
PHPMAILER_PROVIDE_ADDRESS="Vous devez saisir une adresse e-mail de destinataire."
PHPMAILER_MAILER_IS_NOT_SUPPORTED="Mailer n'est pas supporté."
PHPMAILER_EXECUTE="Impossible d'exécuter :"
PHPMAILER_EXTENSION_MISSING="Extension manquante :"
PHPMAILER_INSTANTIATE="Impossible de lancer la fonction mail"
PHPMAILER_AUTHENTICATE="Erreur SMTP : authentification impossible !"
PHPMAILER_FROM_FAILED="Échec de l'adresse suivante :"
PHPMAILER_RECIPIENTS_FAILED="Erreur SMTP ! Échec de l'adresse suivante :"
PHPMAILER_DATA_NOT_ACCEPTED="Erreur SMTP ! Données refusées."
PHPMAILER_CONNECT_HOST="Erreur SMTP ! Impossible de se connecter à l'hôte SMTP."
PHPMAILER_FILE_ACCESS="Impossible d'accéder au fichier :"
PHPMAILER_FILE_OPEN="Erreur fichier ! Impossible d'ouvrir le fichier :"
PHPMAILER_ENCODING="Encodage inconnu :"
PHPMAILER_SIGNING_ERROR="Erreur de signature : "
PHPMAILER_SMTP_ERROR="Erreur serveur SMTP : "
PHPMAILER_EMPTY_MESSAGE="Corps du message vide"
PHPMAILER_INVALID_ADDRESS="Adresse invalide"
PHPMAILER_VARIABLE_SET="Impossible d'initialiser ou de réinitialiser la variable: "
PHPMAILER_SMTP_CONNECT_FAILED="Impossible de connecter par SMTP"
PHPMAILER_TLS="Impossible de lancer TLS"

; Database types (allows for a more descriptive label than the internal name)
MYSQL="MySQL"
MYSQLI="MySQLi"
ORACLE="Oracle"
PGSQL="PostgreSQL (PDO)"
PDOMYSQL="MySQL (PDO)"
POSTGRESQL="PostgreSQL"
SQLAZURE="Microsoft SQL Azure"
SQLITE="SQLite"
SQLSRV="Microsoft SQL Server"

; Search tools
JSEARCH_TOOLS="Outils de recherche"
JSEARCH_TOOLS_DESC="Filtrer les éléments de la liste"
JSEARCH_TOOLS_ORDERING="Ordonner par :"
language/fr-FR/fr-FR.plg_system_debug.sys.ini000060400000001015152453623440015031 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_DEBUG_XML_DESCRIPTION="Affiche les informations système PHP, MySQL et des fichiers langue de la page."
PLG_SYSTEM_DEBUG="Système - Débogage"language/fr-FR/fr-FR.plg_system_languagefilter.sys.ini000060400000001166152453623440016743 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_SYSTEM_LANGUAGEFILTER="Système - Filtre de langue"
PLG_SYSTEM_LANGUAGEFILTER_XML_DESCRIPTION="Filtre d'affichage des contenus en fonction de la langue.<br />Attention, ce plug-in doit être activé avec le module 'Sélecteur de langue' !</strong>"language/fr-FR/fr-FR.plg_installer_jce.sys.ini000060400000000630152453623440015157 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_INSTALLER_JCE="Installateur - JCE"
PLG_INSTALLER_JCE_XML_DESCRIPTION="Plugin Installateur JCE"

language/fr-FR/fr-FR.com_redirect.ini000060400000016772152453623440013337 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_REDIRECT="Redirections"
COM_REDIRECT_ADVANCED_OPTIONS="Avancé"
COM_REDIRECT_BATCH_OPTIONS="Traitement pour ajouter de nouvelles URLs"
COM_REDIRECT_BATCH_TIP="Saisir l'URL obsolète (requis) et la nouvelle URL (facultatif) séparées par %1$s  (c.a.d. url-obsolète%1$snouvelle-url. Une saisie par ligne !"
COM_REDIRECT_BULK_SEPARATOR_DESC="Le séparateur d'importation en vrac. Il s'agit de '|' par défaut, mais cela pourrait être ',' lorsque qu'on utilise par exemple un Copier/Coller d'un fichier CSV."
COM_REDIRECT_BULK_SEPARATOR_LABEL="Séparateur d'importation en vrac"
COM_REDIRECT_BUTTON_UPDATE_LINKS="Mise à jour des liens"
COM_REDIRECT_CLEAR_FAIL="Échec de la suppression des liens non activés."
COM_REDIRECT_CLEAR_SUCCESS="Tous les liens non activés ont été supprimés."
COM_REDIRECT_COLLECT_MODAL_URLS_DISABLED="%1$s Le paramètre 'Recueillir les URLs' dans le %2$s est désactivé. Les URLs de pages d'erreur ne seront pas collectées par ce composant."
COM_REDIRECT_COLLECT_URLS_ENABLED="%1$s Le paramètre 'Recueillir les URLs' est activé."
; The following string is deprecated and will be removed with 4.0.
COM_REDIRECT_COLLECT_URLS_DISABLED="Le paramètre 'Recueillir les URL' est désactivé dane le <a href=\"%s\">plug-in système de redirection</a>. Les URLs des pages d'erreurs ne seront pas collectées."
COM_REDIRECT_CONFIGURATION="Redirection : Paramètres"
COM_REDIRECT_DEFAULT_IMPORT_STATE_DESC="Activer ou désactiver par défaut les liens importés en masse."
COM_REDIRECT_DEFAULT_IMPORT_STATE_LABEL="Statut des liens importés"
COM_REDIRECT_DISABLE_LINK="Désactiver le lien"
COM_REDIRECT_EDIT_LINK="Éditer le lien #%d"
COM_REDIRECT_EDIT_PLUGIN_SETTINGS="Modifier les paramètres du plug-in"
COM_REDIRECT_ENABLE_LINK="Activer le lien"
COM_REDIRECT_ERROR_DESTINATION_URL_REQUIRED="La redirection doit avoir une URL cible"
COM_REDIRECT_ERROR_DUPLICATE_OLD_URL="L'URL d'origine doit être unique."
COM_REDIRECT_ERROR_DUPLICATE_URLS="Les URL source et cible ne peuvent être identiques."
COM_REDIRECT_ERROR_SOURCE_URL_REQUIRED="La redirection doit contenir une URL d'origine"
COM_REDIRECT_FILTER_SEARCH_DESC="Recherche sur l'URL obsolète, la nouvelle URL, la page de référence ou le commentaire. Préfixe avec ID: recherche sur l'ID d'un lien."
COM_REDIRECT_FILTER_SEARCH_LABEL="Recherche de liens"
COM_REDIRECT_FILTER_FILTER_HTTP_HEADER_LABEL="Code de statut HTTP"
COM_REDIRECT_FILTER_FILTER_HTTP_HEADER_DESC="Filtrer par la redirection du code de statut HTTP"
COM_REDIRECT_FILTER_SELECT_OPTION_HTTP_HEADER="- Sélectionner le code de statut HTTP -"
COM_REDIRECT_FIELD_COMMENT_DESC="Il est utile de décrire les URL de la redirection pour une mise à jour ultérieure."
COM_REDIRECT_FIELD_COMMENT_LABEL="Commentaires"
COM_REDIRECT_FIELD_CREATED_DATE_LABEL="Date de création"
COM_REDIRECT_FIELD_NEW_URL_DESC="Indiquez l'URL de redirection."
COM_REDIRECT_BATCH_UPDATE_WITH_NEW_URL="Traitement par lot des nouvelles URL(s)"
COM_REDIRECT_FIELD_NEW_URL_LABEL="Nouvelle URL"
COM_REDIRECT_FIELD_OLD_URL_DESC="Indiquez l'URL à rediriger."
COM_REDIRECT_FIELD_OLD_URL_LABEL="URL expirée"
COM_REDIRECT_FIELD_REFERRER_LABEL="Référence du lien"
COM_REDIRECT_FIELD_REDIRECT_STATUS_CODE_LABEL="Code statut de redirection"
COM_REDIRECT_FIELD_REDIRECT_STATUS_CODE_DESC="Choisir le code statut HTTP 1.1 à associer avec la redirection."
COM_REDIRECT_FIELD_UPDATED_DATE_LABEL="Date de dernière mise à jour"
COM_REDIRECT_HEADING_CREATED_DATE="Date de création"
COM_REDIRECT_HEADING_CREATED_DATE_ASC="Date de création ascendant"
COM_REDIRECT_HEADING_CREATED_DATE_DESC="Date de création descendant"
COM_REDIRECT_HEADING_HITS="Clics 404"
COM_REDIRECT_HEADING_HITS_ASC="Clics 404 ascendant"
COM_REDIRECT_HEADING_HITS_DESC="Clics 404 descendant"
COM_REDIRECT_HEADING_NEW_URL="Nouvelle URL"
COM_REDIRECT_HEADING_NEW_URL_ASC="Nouvelle URL ascendant"
COM_REDIRECT_HEADING_NEW_URL_DESC="Nouvelle URL descendant"
COM_REDIRECT_HEADING_OLD_URL="URL obsolète"
COM_REDIRECT_HEADING_OLD_URL_ASC="Obsolète URL ascendant"
COM_REDIRECT_HEADING_OLD_URL_DESC="Obsolète URL descendant"
COM_REDIRECT_HEADING_REFERRER="Page de référence"
COM_REDIRECT_HEADING_REFERRER_ASC="Page de référence ascendant"
COM_REDIRECT_HEADING_REFERRER_DESC="Page de référence descendant"
COM_REDIRECT_HEADING_STATUS_CODE="Code de statut"
COM_REDIRECT_HEADING_STATUS_CODE_ASC="Code de statut ascendant"
COM_REDIRECT_HEADING_STATUS_CODE_DESC="Code de statut descendant"
COM_REDIRECT_HEADING_UPDATE_LINKS="Mettre à jour les liens sélectionnés pour cette nouvelle URL"
COM_REDIRECT_MANAGER_LINK="Redirection : Nouveau/Modifier"
COM_REDIRECT_MANAGER_LINK_EDIT="Redirection : Modifier"
COM_REDIRECT_MANAGER_LINK_NEW="Redirection : Nouveau"
COM_REDIRECT_MANAGER_LINKS="Redirection : liens"
COM_REDIRECT_MODE_LABEL="Activer le mode avancé"
COM_REDIRECT_MODE_DESC="Activer le mode avancé pour le composant. N'utiliser que si vous savez ce que vous faites."
COM_REDIRECT_N_ITEMS_ARCHIVED="%d liens enregistrés"
COM_REDIRECT_N_ITEMS_ARCHIVED_1="Lien enregistré"
COM_REDIRECT_N_ITEMS_DELETED="%d liens supprimés"
COM_REDIRECT_N_ITEMS_DELETED_1="Lien supprimé"
COM_REDIRECT_N_ITEMS_PUBLISHED="%d liens activés"
COM_REDIRECT_N_ITEMS_PUBLISHED_1="Lien activé"
COM_REDIRECT_N_ITEMS_TRASHED="%d liens mis dans la corbeille"
COM_REDIRECT_N_ITEMS_TRASHED_1="Lien mis dans la corbeille"
COM_REDIRECT_N_ITEMS_UNPUBLISHED="%d liens désactivés"
COM_REDIRECT_N_ITEMS_UNPUBLISHED_1="Lien désactivé"
COM_REDIRECT_N_LINKS_ADDED="%d liens ajoutés"
COM_REDIRECT_N_LINKS_ADDED_1="Un lien a été ajouté"
COM_REDIRECT_N_LINKS_UPDATED="%d liens mis à jour."
COM_REDIRECT_N_LINKS_UPDATED_1="Un lien a été mis à jour"
COM_REDIRECT_NEW_LINK="Nouveau lien"
COM_REDIRECT_NO_ITEM_ADDED="Aucun lien n'a été ajouté"
COM_REDIRECT_NO_ITEM_SELECTED="Aucun lien sélectionné"
COM_REDIRECT_NO_SEPARATOR_FOUND="Le séparateur %s n'a pas été trouvé dans votre importation."
; The following string is deprecated and will be removed with 4.0.
COM_REDIRECT_PLUGIN_DISABLED="Le <a href=\"%s\">plug-in système de redirection</a> est désactivé.  Il doit être activé pour que ce composant fonctionne."
COM_REDIRECT_PLUGIN_ENABLED="Le plug-in de redirection est activé."
COM_REDIRECT_PLUGIN_MODAL_DISABLED="Le %s est désactivé. Il doit être activé pour que ce composant soit fonctionnel."
COM_REDIRECT_REDIRECTED_ON="Redirigé vers : %s."
COM_REDIRECT_SAVE_SUCCESS="Lien sauvegardé"
COM_REDIRECT_SEARCH_LINKS="Recherche dans les champs du lien."
COM_REDIRECT_SYSTEM_PLUGIN="Plug-in système de redirection"
COM_REDIRECT_TOOLBAR_PURGE="Effacer liens non activés"
COM_REDIRECT_XML_DESCRIPTION="Ce composant utilise la redirection des URL"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_REDIRECT="Les modification ne s'appliquent qu'à ce composant.<br /><em><strong>Hérité</strong></em> - les droits globaux ou ceux des groupes parents seront utilisés.<br /><em><strong>Refusé</strong></em> - prévaut toujours, quels que soient les droits globaux ou ceux des groupes parents, et s'applique aux éléments enfants.<br /><em><strong>Autorisé</strong></em> - le groupe concerné pourra effectuer cette action dans ce composant sauf si les droits globaux sont différents."
language/fr-FR/fr-FR.plg_system_redirect.ini000060400000003366152453623440014742 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SYSTEM_REDIRECT="Système - Redirection"
PLG_SYSTEM_REDIRECT_ERROR_UPDATING_DATABASE="Erreur lors de la mise à jour de la base de données"
PLG_SYSTEM_REDIRECT_FIELD_COLLECT_URLS_DESC="Cette option contrôle la collecte des URLs. C'est utile pour éviter une charge inutile sur la base de données."
PLG_SYSTEM_REDIRECT_FIELD_COLLECT_URLS_LABEL="Collecte d'URLs"
PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_DESC="Définir les expressions régulières ou les termes qui devraient être exclus lors de la sauvegarde."
PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_LABEL="Exclure les URLs"
PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_REGEXP_DESC="Le terme devrait-il être traité comme une expression régulière."
PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_REGEXP_LABEL="Expression régulière"
PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_TERM_DESC="Une expression régulière ou un terme qui devrait être exclu."
PLG_SYSTEM_REDIRECT_FIELD_EXCLUDE_URLS_TERM_LABEL="Terme"
PLG_SYSTEM_REDIRECT_FIELD_STORE_FULL_URL_DESC="Enregistrez l'URL expirée en tant qu'absolue (inclure le domaine) ou relative (exclure le domaine)."
PLG_SYSTEM_REDIRECT_FIELD_STORE_FULL_URL_LABEL="Inclure le nom de domaine dans l'URL expirée"
PLG_SYSTEM_REDIRECT_XML_DESCRIPTION="Plug-in système nécessaire au composant de redirection de Joomla! permettant de rediriger des URLs supprimées vers de nouvelles URLs pour éviter les pages d'erreurs."
language/fr-FR/plg_system_jcemediabox.ini000060400000022406152453623440014474 0ustar00; JCE Project
; Copyright (C) 2006 - 2026 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net/
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

; Chaînes de langue pour JCE Media Box 2

PLG_SYSTEM_JCEMEDIABOX="Système - JCE MediaBox 2"
PLG_SYSTEM_JCEMEDIABOX_XML_DESC="<h3>Plugin JCE MediaBox, complément de l'éditeur JCE pour Joomla!</h3><p>JCE MediaBox permet d'afficher des médias (image, flash, flv, quicktime, vmw, avi, mpg, divx, youtube, etc.) et des contenus en popup de styles personnalisables.</p><p>JCE MediaBox permet également d'insérer des infobulles sur du texte ou des médias.</p><p>Présentation et modes d'emploi en anglais sur le site de l'auteur de JCE, Ryan Demmer : <a href='https://www.joomlacontenteditor.net/support/tutorials/jcemediabox' target='_blank' title='Site officiel'>https://www.joomlacontenteditor.net/support/tutorials/jcemediabox</a><br />Suivi de mise à jour : <a href='https://www.joomlacontenteditor.net/support/changelog/mediabox' target='_blank' title='Mises à jour'>https://www.joomlacontenteditor.net/support/changelog/mediabox</a></p><p>Traduction FR, présentation et forum en français par Sarki : <a href='https://www.sarki.ch/jce' target='_blank'>www.sarki.ch/jce</a></p>"

PLG_SYSTEM_JCEMEDIABOX_NOCONVERSION="Aucune conversion"
PLG_SYSTEM_JCEMEDIABOX_CONVERTOPTION="Options de conversion"
PLG_SYSTEM_JCEMEDIABOX_CONVERTOPTION_DESC="Convertir les popups JCE MediaBox en un autre format (support des scripts non inclus&nbsp;!)"

PLG_SYSTEM_JCEMEDIABOX_COMPONENTS="Exclure des composants"
PLG_SYSTEM_JCEMEDIABOX_COMPONENTS_DESC="Sélectionnez les composants qui ne doivent pas charger les bibliothèques de scripts de JCE MediaBox."

PLG_SYSTEM_JCEMEDIABOX_MENU="Restreindre à des liens de menu"
PLG_SYSTEM_JCEMEDIABOX_MENU_DESC="Restreindre le chargement des bibliothèques de scripts de JCE MediaBox aux liens de menus sélectionnés."

PLG_SYSTEM_JCEMEDIABOX_MENU_EXCLUDE="Exclure des liens de menu"
PLG_SYSTEM_JCEMEDIABOX_MENU_EXCLUDE_DESC="Exclure le chargement des bibliothèques de scripts de JCE MediaBox des liens de menus sélectionnés."

PLG_SYSTEM_JCEMEDIABOX_THEME="Thème des Popups"
PLG_SYSTEM_JCEMEDIABOX_THEME_DESC="Thème utilisé pour les fenêtres popup. Les thèmes Bootstrap et UIKit nécessitent un template utilisant l'un de ces frameworks pour être actifs."

PLG_SYSTEM_JCEMEDIABOX_THEME_STANDARD="Standard (Rond grisé)"
PLG_SYSTEM_JCEMEDIABOX_THEME_LIGHT="Flèche de côté (Lightbox)"
PLG_SYSTEM_JCEMEDIABOX_THEME_SHADOW="Simple sur fond noir"
PLG_SYSTEM_JCEMEDIABOX_THEME_SQUEEZE="Rond noir relief"
PLG_SYSTEM_JCEMEDIABOX_THEME_BOOTSTRAP="Bootstrap"
PLG_SYSTEM_JCEMEDIABOX_THEME_UIKIT="UIKit"

PLG_SYSTEM_JCEMEDIABOX_LEGACY="Rétrocompatibilité"
PLG_SYSTEM_JCEMEDIABOX_LEGACY_DESC="Conversion de rétrocompatibilité (Legacy) des popups JCE.<br />Vous devez activer cette option si vous avez créé des popups avec une des toutes premières versions de JCE."

PLG_SYSTEM_JCEMEDIABOX_LIGHTBOX="Remplacer Lightbox/Slimbox"
PLG_SYSTEM_JCEMEDIABOX_LIGHTBOX_DESC="Convertir les popups Lightbox/Slimbox en popup JCE MediaBox. Lorsque cette option est activée, les scripts Lightbox/Slimbox sont désactivés et remplacés par ceux de JCE MediaBox."

PLG_SYSTEM_JCEMEDIABOX_SHADOWBOX="Remplacer Shadowbox"
PLG_SYSTEM_JCEMEDIABOX_SHADOWBOX_DESC="Convertir les popups Shadowbox en popup JCE MediaBox. Lorsque cette option est activée, les scripts Shadowbox sont désactivés et remplacés par ceux de JCE MediaBox."

PLG_SYSTEM_JCEMEDIABOX_WIDTH="Largeur par défaut"
PLG_SYSTEM_JCEMEDIABOX_WIDTH_DESC="Largeur par défaut des fenêtres popup, en pixels (n'indiquez que le chiffre), à appliquer à toutes les fenêtres popup. Laissez vide pour que les fenêtre s'adaptent à la taille de l'image, avec une taille maximale correspondant à celle de la fenêtre du navigateur."
PLG_SYSTEM_JCEMEDIABOX_HEIGHT="Hauteur par défaut"
PLG_SYSTEM_JCEMEDIABOX_HEIGHT_DESC="Hauteur par défaut des fenêtres popup, en pixels (n'indiquez que le chiffre), à appliquer à toutes les fenêtres popup. Laissez vide pour que les fenêtre s'adaptent à la taille de l'image, avec une taille maximale correspondant à celle de la fenêtre du navigateur."

PLG_SYSTEM_JCEMEDIABOX_TRANSITIONSPEED="Vitesse de transition"
PLG_SYSTEM_JCEMEDIABOX_TRANSITIONSPEED_DESC="Vitesse de transition des fenêtres popup, en milliseconde (ms)."
PLG_SYSTEM_JCEMEDIABOX_OVERLAY="Fond derrière popup"
PLG_SYSTEM_JCEMEDIABOX_OVERLAY_DESC="Afficher ou non un fond couvrant l'ensemble de la page derrière les fenêtres popup."
PLG_SYSTEM_JCEMEDIABOX_OVERLAYOPACITY="Opacité du fond"
PLG_SYSTEM_JCEMEDIABOX_OVERLAYOPACITY_DESC="Définissez la valeur d'opacité du fond couvrant l'ensemble de la page derrière les fenêtres popup (0 = transparent, 1 = opaque)"
PLG_SYSTEM_JCEMEDIABOX_OVERLAYCOLOR="Couleur du fond"
PLG_SYSTEM_JCEMEDIABOX_OVERLAYCOLOR_DESC="Indiquez la couleur hexadécimale du fond couvrant l'ensemble de la page derrière les fenêtres popup."
PLG_SYSTEM_JCEMEDIABOX_RESIZE="Taille des popups adaptée"
PLG_SYSTEM_JCEMEDIABOX_RESIZE_DESC="Redimensionner les fenêtres popups si leur taille dépasse la taille de l'écran disponible."
PLG_SYSTEM_JCEMEDIABOX_ICONS="Icône Zoom/Popup"
PLG_SYSTEM_JCEMEDIABOX_ICONS_DESC="Afficher l'icône zoom/popup sur les éléments pouvant s'afficher en popup."
PLG_SYSTEM_JCEMEDIABOX_HIDEOBJECTS="Masquer les Objets/embed"
PLG_SYSTEM_JCEMEDIABOX_HIDEOBJECTS_DESC="Définissez si les éléments objets/embed (vidéo, flash...) doivent être masqués ou non dans les fenêtres popup."
PLG_SYSTEM_JCEMEDIABOX_SCROLLING="Popup toujours centrée"
PLG_SYSTEM_JCEMEDIABOX_SCROLLING_DESC="Définir le comportement des fenêtre popups lors de l'utilisation de l’ascenseur. <strong>Fixe :</strong> la fenêtre popup reste centrée lors de l'utilisation de l’ascenseur. <strong>Défilement :</strong> la fenêtre popup défile avec la page lors de l'utilisation de l'ascenseur."
PLG_SYSTEM_JCEMEDIABOX_SCROLLING_SCROLL="Défilement"
PLG_SYSTEM_JCEMEDIABOX_SCROLLING_FIXED="Fixe"

PLG_SYSTEM_JCEMEDIABOX_SWIPE="Swipe"
PLG_SYSTEM_JCEMEDIABOX_SWIPE_DESC="Activez le support Swipe pour naviguer dans les éléments multimédia d'un groupe JCE MediaBox."

PLG_SYSTEM_JCEMEDIABOX_TOPLEFT="Haut Gauche"
PLG_SYSTEM_JCEMEDIABOX_TOPRIGHT="Haut Droite"
PLG_SYSTEM_JCEMEDIABOX_TOPCENTRE="Haut Centre"
PLG_SYSTEM_JCEMEDIABOX_BOTTOMLEFT="Bas Gauche"
PLG_SYSTEM_JCEMEDIABOX_BOTTOMRIGHT="Bas Droite"
PLG_SYSTEM_JCEMEDIABOX_BOTTOMCENTRE="Bas Centre"

PLG_SYSTEM_JCEMEDIABOX_DYNAMICTHEMES="Thèmes dynamiques"
PLG_SYSTEM_JCEMEDIABOX_DYNAMICTHEMES_DESC="Autoriser ou non la modification du thème des popups par l'ajout de sa variable dans l'URL de la page. Exemple: ...&theme=light"

; Popup
PLG_SYSTEM_JCEMEDIABOX_LABEL_CLOSE="Fermer"
PLG_SYSTEM_JCEMEDIABOX_LABEL_NEXT="Suivant"
PLG_SYSTEM_JCEMEDIABOX_LABEL_PREVIOUS="Précédent"
PLG_SYSTEM_JCEMEDIABOX_LABEL_CANCEL="Annuler"
PLG_SYSTEM_JCEMEDIABOX_LABEL_NUMBERS="{{numbers}}"
PLG_SYSTEM_JCEMEDIABOX_LABEL_NUMBERS_COUNT="{{current}} sur {{total}}"

PLG_SYSTEM_JCEMEDIABOX_CLOSE_ACTION="Fermeture des popups"
PLG_SYSTEM_JCEMEDIABOX_CLOSE_ACTION_DESC="Sélectionnez le système à utiliser pour la fermeture des fenêtres popups."
PLG_SYSTEM_JCEMEDIABOX_CLOSE_BUTTON="Uniquement avec le bouton"
PLG_SYSTEM_JCEMEDIABOX_CLOSE_BUTTON_OVERLAY="Avec le bouton et en cliquant sur le fond"

PLG_SYSTEM_JCEMEDIABOX_LABEL_DOWNLOAD="Télécharger"

PLG_SYSTEM_JCEMEDIABOX_COOKIE_EXPIRY="Durée du cookie Popup auto"
PLG_SYSTEM_JCEMEDIABOX_COOKIE_EXPIRY_DESC="Le cookie permettant de ne pas réaficher les fenêtre popups qui s'ouvrent automatiquement expirera après le nombre de jours indiqué ici. Laissez vide pour une expiration du cookie lorsque l'utilisateur ferme son navigateur."

PLG_SYSTEM_JCEMEDIABOX_MEDIAFALLBACK="Lecteur de média alternatif"
PLG_SYSTEM_JCEMEDIABOX_MEDIAFALLBACK_DESC="Activez cette option pour fournir un lecteur multimédia alternatif basé sur flash pour les éléments utilisant une balise vidéo ou audio non prise en charge par le navigateur du visiteur. Supporte actuellement mp4, mp3, flv, f4v."
PLG_SYSTEM_JCEMEDIABOX_MEDIASELECTOR="Sélecteur CSS"
PLG_SYSTEM_JCEMEDIABOX_MEDIASELECTOR_DESC="Sélecteur CSS des éléments devant être pris en charge par le lecteur multimédia alternatif. Par défaut audio, vidéo."

COM_PLUGINS_OPTIONS_FIELDSET_LABEL="Options"

PLG_SYSTEM_JCEMEDIABOX_EXPAND_ON_CLICK="Icône d'agrandissement"
PLG_SYSTEM_JCEMEDIABOX_EXPAND_ON_CLICK_DESC="Les images redimensionnées pour s'adapter à l'écran s'agrandissent lorsqu'on clique dessus. Si cette option est activée, le curseur se transforme en icône de zoom au survol de l'image, indiquant que l'image peut être agrandie."

PLG_SYSTEM_JCEMEDIABOX_DISPLAY_MODE="Mode d'affichage"
PLG_SYSTEM_JCEMEDIABOX_DISPLAY_MODE_DESC="Choisissez comment le contenu s'affiche dans la fenêtre surgissante (popup). <strong>Ajuster (Fit)</strong> redimensionnera la fenêtre pour qu'elle s'adapte à la zone d'affichage. <strong>Défilement (Scroll)</strong> contraindra la fenêtre à la zone d'affichage tout en permettant au contenu de défiler à l'intérieur du cadre."
PLG_SYSTEM_JCEMEDIABOX_DISPLAY_FIT="Ajuster (Fit)"
PLG_SYSTEM_JCEMEDIABOX_DISPLAY_SCROLL="Défilement (Scroll)"

language/fr-FR/fr-FR.com_cache.sys.ini000060400000001303152453623440013376 0ustar00; @date        2015-07-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_CACHE="Cache"
COM_CACHE_CACHE_VIEW_DEFAULT_DESC="Effacer le cache"
COM_CACHE_CACHE_VIEW_DEFAULT_TITLE="Effacer le cache"
COM_CACHE_PURGE_VIEW_DEFAULT_DESC="Effacer les fichiers cache expirés"
COM_CACHE_PURGE_VIEW_DEFAULT_TITLE="Effacer les fichiers cache expirés"
COM_CACHE_XML_DESCRIPTION="Composant de gestion de cache"
language/fr-FR/fr-FR.plg_system_stats.ini000060400000005632152453623440014275 0ustar00; @date        2015-11-12
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SYSTEM_STATS="Système - Statistiques Joomla"
PLG_SYSTEM_STATS_BTN_NEVER_SEND="Jamais"
PLG_SYSTEM_STATS_BTN_SEND_ALWAYS="Toujours"
PLG_SYSTEM_STATS_BTN_SEND_NOW="Une seule fois"
; The following two strings are deprecated for 4.0
PLG_SYSTEM_STATS_DEBUG_DESC="Activer le débogage pour tester. Les statistiques seront envoyées à chaque chargement de page."
PLG_SYSTEM_STATS_DEBUG_LABEL="Debogage"
PLG_SYSTEM_STATS_INTERVAL_DESC="Les statistiques seront envoyées toutes les x heures. La valeur par défaut est 12."
PLG_SYSTEM_STATS_INTERVAL_LABEL="Intervalle (heures) "
PLG_SYSTEM_STATS_LABEL_CMS_VERSION="Version CMS"
PLG_SYSTEM_STATS_LABEL_DB_TYPE="Type de base de données"
PLG_SYSTEM_STATS_LABEL_DB_VERSION="Version de la base de données"
PLG_SYSTEM_STATS_LABEL_MESSAGE_TITLE="Joomla! aimerait obtenir votre permission pour recueillir des statistiques de base."
PLG_SYSTEM_STATS_LABEL_PHP_VERSION="Version PHP"
PLG_SYSTEM_STATS_LABEL_SERVER_OS="Serveur OS"
PLG_SYSTEM_STATS_LABEL_UNIQUE_ID="ID unique"
PLG_SYSTEM_STATS_MODE_DESC="Sélectionnez la façon dont vous désirez que soient envoyées les statistiques ."
PLG_SYSTEM_STATS_MODE_LABEL="Mode"
PLG_SYSTEM_STATS_MODE_OPTION_ALWAYS_SEND="Toujours envoyer"
PLG_SYSTEM_STATS_MODE_OPTION_NEVER_SEND="Ne jamais envoyer"
PLG_SYSTEM_STATS_MODE_OPTION_ON_DEMAND="À la demande"
PLG_SYSTEM_STATS_MSG_ALLOW_SENDING_DATA="Activer les statistiques Joomla ?"
PLG_SYSTEM_STATS_MSG_JOOMLA_WANTS_TO_SEND_DATA="Afin de mieux comprendre les environnements d'installation et d'utilisation finale, il est utile d'envoyer certaines informations concernant le site vers un serveur central contrôlé par Joomla!. Aucune donnée d'identification n'est capturée à quelque moment que ce soit.  Vous pouvez modifier ces paramètres ultérieurement à partir de  Plug-ins => Système - Statistiques Joomla!."
PLG_SYSTEM_STATS_MSG_WHAT_DATA_WILL_BE_SENT="Cliquer ici pour voir les informations qui seront envoyées."
PLG_SYSTEM_STATS_RESET_UNIQUE_ID="Réinitialiser l'identifiant unique (ID)"
PLG_SYSTEM_STATS_UNIQUE_ID_DESC="Un identifiant permet au projet Joomla de compter les installations uniques du plug-in. Celui-ci est envoyé avec les statistiques vers le serveur."
PLG_SYSTEM_STATS_UNIQUE_ID_LABEL="Identifiant unique"
PLG_SYSTEM_STATS_XML_DESCRIPTION="Plug-in système qui envoie des statistiques sur l'environnement à un serveur contrôlé par le projet Joomla! pour des analyses statistiques. Les statistiques envoyées incluent la version de PHP, du CMS, le type de base de données, la version de base de données et le type de serveur."
language/fr-FR/fr-FR.com_fields.ini000060400000022372152453623440012775 0ustar00; @date        2016-12-15
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters, Inc. (https://www.joomla.org)
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_FIELDS="Champs"
COM_FIELDS_BATCH_GROUP_LABEL="Pour déplacer ou copier votre sélection, merci de sélectionner un groupe."
COM_FIELDS_BATCH_GROUP_OPTION_NONE="- Pas de groupe -"
COM_FIELDS_ERROR_UNIQUE_NAME="Un autre champ a le même nom (rappel : ce champ peut se trouver dans la corbeille ou présent comme champ personnalisé dans une autre extension)."
COM_FIELDS_FIELDS_FILTER_SEARCH_DESC="Recherchez dans le nom, le titre ou la note du champ. Préfixe avec ID : pour rechercher un ID de champ. Préfixe avec AUTHOR : pour rechercher un auteur de champ."
COM_FIELDS_FIELD_CLASS_DESC="Les attributs de classe du champ dans le formulaire d'édition. Si des classes multiples sont nécessaires, les énumérer avec des espaces."
COM_FIELDS_FIELD_CLASS_LABEL="Classe du champ"
COM_FIELDS_FIELD_DEFAULT_VALUE_DESC="La valeur par défaut du champ."
COM_FIELDS_FIELD_DEFAULT_VALUE_LABEL="Valeur par défaut"
COM_FIELDS_FIELD_DESCRIPTION_DESC="La description du champ."
COM_FIELDS_FIELD_DISPLAY_AFTER_DISPLAY="Après l'affichage"
COM_FIELDS_FIELD_DISPLAY_AFTER_TITLE="Après le titre"
COM_FIELDS_FIELD_DISPLAY_BEFORE_DISPLAY="Avant l'affichage"
COM_FIELDS_FIELD_DISPLAY_DESC="Joomla propose des événements de contenu déclenchés lors du processus de création de contenu. Définir ici de quelle façon les champs personnalisés doivent être intégrés dans le contenu."
COM_FIELDS_FIELD_DISPLAY_LABEL="Affichage automatique"
COM_FIELDS_FIELD_DISPLAY_NO_DISPLAY="Ne pas afficher automatiquement"
COM_FIELDS_FIELD_EDITABLE_IN_ADMIN="Administration"
COM_FIELDS_FIELD_EDITABLE_IN_BOTH="Les deux"
COM_FIELDS_FIELD_EDITABLE_IN_DESC="Sur quelle partie du site le champ doit-il être modifiable&nbsp;?"
COM_FIELDS_FIELD_EDITABLE_IN_LABEL="Modifiable"
COM_FIELDS_FIELD_EDITABLE_IN_SITE="Site"
COM_FIELDS_FIELD_FORMOPTIONS_HEADING="Options de formulaire"
COM_FIELDS_FIELD_GROUP_DESC="Le groupe auquel ce champ appartient."
COM_FIELDS_FIELD_GROUP_LABEL="Groupe du champ"
COM_FIELDS_FIELD_IMAGE_ALT_DESC="Texte alternatif pour les visiteurs n'ayant pas accès aux images"
COM_FIELDS_FIELD_IMAGE_ALT_LABEL="Texte 'alt'"
COM_FIELDS_FIELD_IMAGE_DESC="Label d'image"
COM_FIELDS_FIELD_IMAGE_LABEL="Image"
COM_FIELDS_FIELD_INVALID_DEFAULT_VALUE="La valeur par défaut est invalide."
COM_FIELDS_FIELD_LABEL_DESC="Le label du champ à afficher"
COM_FIELDS_FIELD_LABEL_FORM_CLASS_DESC="Classe du label dans le formulaire"
COM_FIELDS_FIELD_LABEL_FORM_CLASS_LABEL="Classe du label"
COM_FIELDS_FIELD_LABEL_LABEL="Label"
COM_FIELDS_FIELD_LABEL_RENDER_CLASS_DESC="Classe du label dans le rendu"
COM_FIELDS_FIELD_LABEL_RENDER_CLASS_LABEL="Classe du label"
COM_FIELDS_FIELD_LANGUAGE_DESC="Assigner une langue à ce champ."
COM_FIELDS_FIELD_LAYOUT_DESC="Choisir un affichage alternatif"
COM_FIELDS_FIELD_LAYOUT_LABEL="Affichage"
COM_FIELDS_FIELD_NOTE_DESC="Note optionnelle pour ce champ"
COM_FIELDS_FIELD_NOTE_LABEL="Note"
COM_FIELDS_FIELD_N_ITEMS_ARCHIVED="%d champs archivés."
COM_FIELDS_FIELD_N_ITEMS_ARCHIVED_1="%d champ archivé."
COM_FIELDS_FIELD_N_ITEMS_CHECKED_IN="%d champs déverrouillés."
COM_FIELDS_FIELD_N_ITEMS_CHECKED_IN_0="Pas de champ à déverouiller"
COM_FIELDS_FIELD_N_ITEMS_CHECKED_IN_1="%d champ déverrouillé."
COM_FIELDS_FIELD_N_ITEMS_DELETED="%d champs supprimés."
COM_FIELDS_FIELD_N_ITEMS_DELETED_1="%d champ supprimé."
COM_FIELDS_FIELD_N_ITEMS_PUBLISHED="%d champs publiés."
COM_FIELDS_FIELD_N_ITEMS_PUBLISHED_1="%d champ publié."
COM_FIELDS_FIELD_N_ITEMS_TRASHED="%d champs mis à la corbeille."
COM_FIELDS_FIELD_N_ITEMS_TRASHED_1="%d champ mis à la corbeille."
COM_FIELDS_FIELD_N_ITEMS_UNPUBLISHED="%d champs dépubliés."
COM_FIELDS_FIELD_N_ITEMS_UNPUBLISHED_1="%d champ dépublié."
COM_FIELDS_FIELD_PERMISSION_DELETE_DESC="Modifier un droit pour <strong>l'action Supprimer</strong> pour ce champ et les droits calculés en fonction de l'extension parente et des permissions de groupe."
COM_FIELDS_FIELD_PERMISSION_EDITSTATE_DESC="Modifier un droit pour <strong>l'action Modifier le statut</strong> pour ce champ et les droits calculés en fonction de l'extension parente et des permissions de groupe."
COM_FIELDS_FIELD_PERMISSION_EDITVALUE_DESC="Chosir qui peut modifier la valeur du champ dans l'éditeur de formulaire."
COM_FIELDS_FIELD_PERMISSION_EDIT_DESC="Modifier un droit pour <strong>l'action Modifier</strong> pour ce champ et les droits calculés en fonction de l'extension parente et des permissions de groupe."
COM_FIELDS_FIELD_PLACEHOLDER_DESC="Le texte qui apparaît dans le champ comme indice pour la submission."
COM_FIELDS_FIELD_PLACEHOLDER_LABEL="Indice"
COM_FIELDS_FIELD_RENDEROPTIONS_HEADING="Options d'affichage"
COM_FIELDS_FIELD_RENDER_CLASS_DESC="Les attributs de classe du champ lorsque le champ est rendu. Si des classes multiples sont nécessaires, les énumérer avec des espaces."
COM_FIELDS_FIELD_RENDER_CLASS_LABEL="Classe de rendu"
COM_FIELDS_FIELD_REQUIRED_DESC="Le champ doit-il être requis?"
COM_FIELDS_FIELD_REQUIRED_LABEL="Requis"
COM_FIELDS_FIELD_SAVE_SUCCESS="Champs sauvegardé."
COM_FIELDS_FIELD_SHOWLABEL_DESC="Afficher ou cacher le label lorsque le champ est affiché."
COM_FIELDS_FIELD_SHOWLABEL_LABEL="Afficher le label"
COM_FIELDS_FIELD_TYPE_DESC="Le type de champ."
COM_FIELDS_FIELD_TYPE_LABEL="Type"
COM_FIELDS_FIELD_USE_GLOBAL="Paramètres du plug-in"
COM_FIELDS_FIELD_VALUE_RENDER_CLASS_DESC="La classe de la valeur du champ dans le rendu."
COM_FIELDS_FIELD_VALUE_RENDER_CLASS_LABEL="Classe de la valeur"
COM_FIELDS_GROUPS_FILTER_SEARCH_DESC="Rechercher dans le titre du groupe de champs. Préfixe avec ID: pour rechercher un ID de groupe de champs."
COM_FIELDS_GROUP_N_ITEMS_ARCHIVED="%d groupes de champs archivés."
COM_FIELDS_GROUP_N_ITEMS_ARCHIVED_1="%d groupe de champs archivé."
COM_FIELDS_GROUP_N_ITEMS_CHECKED_IN="%d groupes de champs déverouillés."
COM_FIELDS_GROUP_N_ITEMS_CHECKED_IN_0="Pas de groupe de champ à déverouiller"
COM_FIELDS_GROUP_N_ITEMS_CHECKED_IN_1="%d groupe de champs déverouillé."
COM_FIELDS_GROUP_N_ITEMS_DELETED="%d groupes de champs supprimés."
COM_FIELDS_GROUP_N_ITEMS_DELETED_1="%d groupe de champs supprimé."
COM_FIELDS_GROUP_N_ITEMS_PUBLISHED="%d groupes de champs publiés."
COM_FIELDS_GROUP_N_ITEMS_PUBLISHED_1="%d groupe de champs publié."
COM_FIELDS_GROUP_N_ITEMS_TRASHED="%d groupes de champs mis à la corbeille."
COM_FIELDS_GROUP_N_ITEMS_TRASHED_1="%d groupe de champs mis à la corbeille."
COM_FIELDS_GROUP_N_ITEMS_UNPUBLISHED="%d groupes de champs dépubliés."
COM_FIELDS_GROUP_N_ITEMS_UNPUBLISHED_1="%d groupe de champs dépublié."
COM_FIELDS_GROUP_PERMISSION_CREATE_DESC="Modifier un droit pour <strong>l'action Créer</strong> pour ce groupe de champs et les droits calculés en fonction de l'extension parente."
COM_FIELDS_GROUP_PERMISSION_DELETE_DESC="Modifier un droit pour <strong>l'action Supprimer</strong> pour ce groupe de champs et les droits calculés en fonction de l'extension parente."
COM_FIELDS_GROUP_PERMISSION_EDITOWN_DESC="Modifier un droit pour <strong>l'action Modifier ses éléments</strong> pour ce groupe de champs et les droits calculés en fonction de l'extension parente."
COM_FIELDS_GROUP_PERMISSION_EDITSTATE_DESC="Modifier un droit pour <strong>l'action Modifier le statut</strong> pour ce groupe de champs et les droits calculés en fonction de l'extension parente."
COM_FIELDS_GROUP_PERMISSION_EDITVALUE_DESC="Qui peut modifier la valeur du champ dans l'éditeur de formulaire."
COM_FIELDS_GROUP_PERMISSION_EDIT_DESC="Modifier un droit pour <strong>l'action Modifier</strong> pour ce groupe de champs et les droits calculés en fonction de l'extension parente."
COM_FIELDS_GROUP_SAVE_SUCCESS="Groupe de champs sauvegardé."
COM_FIELDS_MUSTCONTAIN_A_TITLE_FIELD="Le champ doit avoir un titre."
COM_FIELDS_MUSTCONTAIN_A_TITLE_GROUP="Le groupe de champs doit avoir un titre."
COM_FIELDS_SYSTEM_PLUGIN_NOT_ENABLED="Le plug-in <a href=\"%s\">Système - Champs</a> est désactivé. Les champs personnalisés ne seront pas affiché jusqu'à l'activation de ce plug-in."
COM_FIELDS_VIEW_FIELDS_BATCH_OPTIONS="Traitement par lot des champs sélectionnés"
COM_FIELDS_VIEW_FIELDS_SELECT_CATEGORY="- Sélectionner la catégorie à assigner -"
COM_FIELDS_VIEW_FIELDS_SELECT_GROUP="- Sélectionner un groupe de champs -"
COM_FIELDS_VIEW_FIELDS_SORT_GROUP_ASC="Groupe de champs ascendant"
COM_FIELDS_VIEW_FIELDS_SORT_GROUP_DESC="Groupe de champs descendant"
COM_FIELDS_VIEW_FIELDS_SORT_TYPE_ASC="Type ascendant"
COM_FIELDS_VIEW_FIELDS_SORT_TYPE_DESC="Type descendant"
COM_FIELDS_VIEW_FIELDS_TITLE="%s : Champs"
COM_FIELDS_VIEW_FIELD_ADD_TITLE="%s : Nouveau champ"
COM_FIELDS_VIEW_FIELD_EDIT_TITLE="%s : Modifier le champ"
COM_FIELDS_VIEW_FIELD_FIELDSET_GENERAL="Général"
COM_FIELDS_VIEW_GROUPS_BATCH_OPTIONS="Traitement par lot des groupes de champs sélectionnés"
COM_FIELDS_VIEW_GROUPS_TITLE="%s : Groupes de champs"
COM_FIELDS_VIEW_GROUP_ADD_TITLE="%s : Nouveau groupe de champs"
COM_FIELDS_VIEW_GROUP_EDIT_TITLE="%s : Modifier le groupe de champs"
COM_FIELDS_XML_DESCRIPTION="Composant de gestion des champs personnalisés."
language/fr-FR/fr-FR.mod_title.sys.ini000060400000001144152453623440013460 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

MOD_TITLE="Titre des fonctions et extensions"
MOD_TITLE_XML_DESCRIPTION="Le module 'mod_title' affiche le titre des extensions natives à Joomla ou installées lors de l'affichage de leur interface."
MOD_TITLE_LAYOUT_DEFAULT="Défaut"language/fr-FR/fr-FR.plg_system_ic_library.ini000060400000001030152453623440015242 0ustar00; iCagenda
; Copyright (c)2014 Cyril Rezé (Lyr!C) / JoomliC.com - All rights reserved.
; License GNU General Public License version 3 or later <http://www.gnu.org/licenses/gpl.html>
; Note : All ini files need to be saved as UTF-8
;
; PLG_SYSTEM_IC_LIBRARY	: plg_system_ic_library.ini
; Translation Platform	: https://www.transifex.com/projects/p/icagenda/


PLG_SYSTEM_IC_LIBRARY = "Système - iC Library"
PLG_SYSTEM_IC_LIBRARY_XML_DESCRIPTION = "Ce plug-in permet d'utiliser les classes de la bibliothèque iC Library (by Jooml!C)."
language/fr-FR/fr-FR.plg_system_cache.sys.ini000060400000000757152453623440015022 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8



PLG_CACHE_XML_DESCRIPTION="Fonctionnalité de mise en cache des pages"
PLG_SYSTEM_CACHE="Système - Cache de page"
language/fr-FR/fr-FR.com_akeeba.sys.ini000060400000000266152453623440013552 0ustar00;; @package    AkeebaBackup
;; @copyright  Copyright (c)2006-2016 Nicholas K. Dionysopoulos
;; @license    GNU General Public License version 3, or later

COM_AKEEBA="Akeeba Backup"
language/fr-FR/fr-FR.com_installer.sys.ini000060400000003613152453623440014336 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_INSTALLER="Extensions"
COM_INSTALLER_DATABASE_VIEW_DEFAULT_DESC="Vérifier et corriger les éventuels problème de base de données de votre site."
COM_INSTALLER_DATABASE_VIEW_DEFAULT_TITLE="Vérification de la base de données"
COM_INSTALLER_DISCOVER_VIEW_DEFAULT_DESC="Découvrir des extensions qui ne sont pas passées par le processus normal d'installation."
COM_INSTALLER_DISCOVER_VIEW_DEFAULT_TITLE="Découvrir des extensions"
COM_INSTALLER_INSTALL_VIEW_DEFAULT_DESC="Installation d'extensions dans votre site."
COM_INSTALLER_INSTALL_VIEW_DEFAULT_TITLE="Installation d'extensions"
COM_INSTALLER_LANGUAGES_VIEW_DEFAULT_DESC="Installation de paquets de langues dans votre site."
COM_INSTALLER_LANGUAGES_VIEW_DEFAULT_TITLE="Installation de langues"
COM_INSTALLER_MANAGE_VIEW_DEFAULT_DESC="Gestion des extensions installées dans votre site."
COM_INSTALLER_MANAGE_VIEW_DEFAULT_TITLE="Gestion des extensions"
COM_INSTALLER_UPDATESITES_VIEW_DEFAULT_DESC="Gestion des 'Sites de mise à jour' pour les extensions installées."
COM_INSTALLER_UPDATESITES_VIEW_DEFAULT_TITLE="Sites de mise à jour"
COM_INSTALLER_UPDATE_VIEW_DEFAULT_DESC="Rechercher et installer les mises à jour des extensions installées"
COM_INSTALLER_UPDATE_VIEW_DEFAULT_TITLE="Mises à jour d'extensions"
COM_INSTALLER_WARNINGS_VIEW_DEFAULT_DESC="Afficher les avertissements concernant vos extensions installées."
COM_INSTALLER_WARNINGS_VIEW_DEFAULT_TITLE="Avertissements"
COM_INSTALLER_XML_DESCRIPTION="Composant de gestion des extensions : ajout, suppression et mises à jour"
language/fr-FR/fr-FR.mod_login.sys.ini000060400000001161152453623440013446 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

MOD_LOGIN_XML_DESCRIPTION="Le module 'mod_login' affiche un formulaire de connexion permettant la saisie de l'identifiant et du mot de passe pour accéder à l'administration."
MOD_LOGIN="Formulaire de connexion"
MOD_LOGIN_LAYOUT_DEFAULT="Défaut"language/fr-FR/fr-FR.plg_search_tags.sys.ini000060400000000763152453623440014633 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_SEARCH_TAGS="Recherche - Tags"
PLG_SEARCH_TAGS_XML_DESCRIPTION="Intégration des tags dans la recherche sur le site"
language/fr-FR/fr-FR.mod_version.ini000060400000001447152453623440013215 0ustar00; @date        2015-03-26
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


MOD_VERSION="Information de version Joomla!"
MOD_VERSION_FORMAT_DESC="Inclut le nom de code et la date."
MOD_VERSION_FORMAT_LABEL="Format de la version affichée"
MOD_VERSION_FORMAT_LONG="Long"
MOD_VERSION_FORMAT_SHORT="Court"
MOD_VERSION_PRODUCT_DESC="Inclure le texte &quot;Joomla!&quot;."
MOD_VERSION_PRODUCT_LABEL="Afficher Joomla!"
MOD_VERSION_XML_DESCRIPTION="Ce module affiche des informations sur la version de Joomla!"
language/fr-FR/fr-FR.plg_jce_editor-ipa.ini000060400000001100152453623440014373 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_JCE_EDITOR_IPA="Alphabet phonétique international pour JCE"
PLG_JCE_EDITOR_IPA_XML_DESC="Plugin permettant d'utiliser la carte de caractères de l'alphabet phonétique international avec l'éditeur JCE"

[ipa]
WF_IPA_TITLE="Alphabet phonétique international"
language/fr-FR/fr-FR.mod_privacy_dashboard.sys.ini000060400000001215152453623440016022 0ustar00; @date        2018-09-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


MOD_PRIVACY_DASHBOARD="Tableau de bord de confidentialité"
MOD_PRIVACY_DASHBOARD_XML_DESCRIPTION="Le module Tableau de bord de confidentialité affiche des renseignements sur les demandes d'informations de confidentialité."
MOD_PRIVACY_DASHBOARD_LAYOUT_DEFAULT="Défaut"

language/fr-FR/fr-FR.plg_editors-xtd_module.sys.ini000060400000001077152453623440016162 0ustar00; @date        2015-10-28
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_EDITORS-XTD_MODULE="Bouton - Module"
PLG_MODULE_XML_DESCRIPTION="Affiche un bouton permettant d'insérer un module dans un article. Une fenêtre popup s'ouvre pour pouvoir choisir le module."
language/fr-FR/fr-FR.plg_user_terms.ini000060400000003355152453623440013723 0ustar00; @date        2018-09-02
; @author      Joomla! Project
; @copyright   (C) 2005 - 2022 Open Source Matters, Inc. (https://www.joomla.org)
; @copyright   (C) 2005 - 2022 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_USER_TERMS="Utilisateur - Conditions générales d'utilisation"
PLG_USER_TERMS_FIELD_ARTICLE_DESC="Sélectionner un article dans la liste ou en créer un nouveau."
PLG_USER_TERMS_FIELD_ARTICLE_LABEL="Article des conditions générales d'utilisation"
PLG_USER_TERMS_FIELD_DESC="Lire l'énoncé complet des conditions générales d'utilisation."
PLG_USER_TERMS_FIELD_ERROR="Un accord sur les conditions générales d'utilisation du site est requis."
PLG_USER_TERMS_FIELD_LABEL="Conditions générales d'utilisation"
PLG_USER_TERMS_LABEL="Conditions générales d'utilisation"
PLG_USER_TERMS_LOGGING_CONSENT_TO_TERMS="L'utilisateur <a href='{accountlink}'>{username}</a> a consenti aux conditions générales d'utilisation lors de l'inscription."
PLG_USER_TERMS_NOTE_FIELD_DEFAULT="En vous inscrivant sur ce site Web, vous acceptez les conditions générales d'utilisation."
PLG_USER_TERMS_NOTE_FIELD_DESC="Un résumé des conditions générales du site. Si laissé vide, le message par défaut sera utilisé."
PLG_USER_TERMS_NOTE_FIELD_LABEL="Courtes conditions générales d'utilisation"
PLG_USER_TERMS_OPTION_AGREE="J'accepte"
PLG_USER_TERMS_OPTION_DO_NOT_AGREE="Je n'accepte pas"
PLG_USER_TERMS_SUBJECT="Politique de confidentialité"
PLG_USER_TERMS_XML_DESCRIPTION="Plugin de base pour demander le consentement de l'utilisateur aux conditions générales d'utilisation du site."
language/fr-FR/fr-FR.plg_fields_usergrouplist.sys.ini000060400000001155152453623440016621 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_USERGROUPLIST="Champs - Groupes d'utilisateurs"
PLG_FIELDS_USERGROUPLIST_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'usergrouplist' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_system_redirect.sys.ini000060400000001170152453623440015546 0ustar00; @date        2015-06-04
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SYSTEM_REDIRECT="Système - Redirection"
PLG_SYSTEM_REDIRECT_XML_DESCRIPTION="Plug-in système nécessaire au composant de redirection de Joomla! permettant de rediriger des URLs supprimées vers de nouvelles URLs pour éviter les pages d'erreurs."
language/fr-FR/fr-FR.plg_jce_editor-toc.sys.ini000060400000001120152453623440015226 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_JCE_EDITOR_TOC="Table des matières pour JCE"
PLG_JCE_EDITOR_TOC_XML_DESC	="Plugin JCE permettant de créer une table des matières simple dans les contenus en utilisant les titres existants"

[toc]
WF_TOC_TITLE="Table des matières"
WF_TOC_HEADING_TITLE="Table des matières"
language/fr-FR/fr-FR.com_tags.ini000060400000032551152453623440012465 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_TAGS="Tags"
COM_TAGS_ALL="Tous"
COM_TAGS_ALL_TAGS_DESCRIPTION_DESC="Description affichée en tête de la liste des tags"
COM_TAGS_ALL_TAGS_DESCRIPTION_LABEL="Description d'en-tête"
COM_TAGS_ALL_TAGS_MEDIA_DESC="Image affichée en tête de la liste des tags"
COM_TAGS_ALL_TAGS_MEDIA_LABEL="Image d'en-tête"
COM_TAGS_ANY="N'importe lequel"
COM_TAGS_BASE_ADD_TITLE="Tags : Ajouter un tag"
COM_TAGS_BASE_EDIT_TITLE="Tags : Modifier un tag"
COM_TAGS_BASIC_FIELDSET_LABEL="Paramètres"
COM_TAGS_BATCH_CANNOT_CREATE="Vous n'êtes pas autorisé à créer de nouveaux tags."
COM_TAGS_BATCH_CANNOT_EDIT="Vous n'êtes pas autorisé à modifier des tags."
COM_TAGS_BATCH_OPTIONS="Processus de traitement des tags sélectionnés"
COM_TAGS_BATCH_TIP="Les actions s'appliquent aux tags sélectionnés."
COM_TAGS_COMPACT_COLUMNS_LABEL="Nombre de colonnes"
COM_TAGS_CONFIG_TAG_MIN_LENGTH_LABEL="Nombre minimum de caractères pour la recherche"
COM_TAGS_CONFIG_TAG_MIN_LENGTH_DESC="Ce réglage contrôle le nombre minimum de caractères pour la recherche ainsi que celui d'ajout de tags dans le champ de tags en mode Ajax."
COM_TAGS_CONFIG_ALL_TAGS_FIELD_LAYOUT_DESC="Choisir un affichage par défaut pour la Liste de tous les tags."
COM_TAGS_CONFIG_ALL_TAGS_FIELD_LAYOUT_LABEL="Affichage par défaut Liste de tous les tags"
COM_TAGS_CONFIG_ALL_TAGS_SETTINGS_DESC="Paramètres généraux de l'affichage en liste de tous les tags. Ils seront utilisés sauf si modifiés dans le lien de menu spécifique."
COM_TAGS_CONFIG_ALL_TAGS_SETTINGS_LABEL="Liste de tous les tags"
COM_TAGS_CONFIG_DATA_ENTRY_SETTINGS_DESC="Ces paramètres définissent la façon dont les tags sont saisies."
COM_TAGS_CONFIG_DATA_ENTRY_SETTINGS_LABEL="Paramètres de saisie"
COM_TAGS_CONFIG_INTEGRATION_SETTINGS_DESC="Ces paramètres déterminent la manière dont le composant de tags interagit avec les autres extensions."
COM_TAGS_CONFIG_NUMBER_OF_ITEMS="Nombre d'éléments taggés"
COM_TAGS_CONFIG_SELECTION_SETTINGS_DESC="Ces paramètres déterminent quels éléments sont sélectionnés dans l'affichage en liste des éléments taggés."
COM_TAGS_CONFIG_SELECTION_SETTINGS_LABEL="Sélection d'éléments"
COM_TAGS_CONFIG_SHARED_SETTINGS_DESC="Paramètres généraux de tous les affichages de tags. Ils seront utilisés sauf si modifiés dans le lien de menu spécifique."
COM_TAGS_CONFIG_SHARED_SETTINGS_LABEL="Affichage partagés"
COM_TAGS_CONFIG_TAG_SETTINGS_DESC="Ces paramètres s'appliquent à une liste d'éléments taggés ou une liste compacte d'éléments taggés. Ils seront utilisés sauf si modifiés dans le lien de menu spécifique."
COM_TAGS_CONFIG_TAG_SETTINGS_LABEL="Éléments taggés"
COM_TAGS_CONFIG_TAGGED_ITEMS_FIELD_LAYOUT_DESC="Choisir un affichage par défaut pour les éléments taggés. Cet affichage sera utilisé quand un utilisateur clique sur un tag qui n'a pas de lien de menu défini."
COM_TAGS_CONFIG_TAGGED_ITEMS_FIELD_LAYOUT_LABEL="Affichage par défaut des éléments taggés"
COM_TAGS_CONFIGURATION="Tags : Paramètres"
COM_TAGS_COUNT_ARCHIVED_ITEMS="Éléments archivés"
COM_TAGS_COUNT_PUBLISHED_ITEMS="Éléments publiés"
COM_TAGS_COUNT_TRASHED_ITEMS="Éléments dans la corbeille"
COM_TAGS_COUNT_UNPUBLISHED_ITEMS="Éléments non publiés"
COM_TAGS_DELETE_NOT_ALLOWED="Suppression du tag %s non autorisée. "
COM_TAGS_DESCRIPTION_DESC="Vous pouvez indiquer une description du tag dans le champ de saisie (optionnel)."
COM_TAGS_ERROR_UNIQUE_ALIAS="Un autre tag utilise déjà cet alias (rappel : ce tag peut se trouver dans la corbeille)."
COM_TAGS_EXCLUDE="Exclure"
COM_TAGS_FIELD_CONFIG_HITS_DESC="Affiche le nombre de clics"
COM_TAGS_FIELD_CONFIG_TAGDESCRIPTION_DESC="Configuration de 'com_tags'"
COM_TAGS_FIELD_CONFIG_TAGDESCRIPTION_LABEL="Tags"
COM_TAGS_FIELD_CONTENT_TYPE_DESC="Seuls les éléments taggés de ce type seront affichés."
COM_TAGS_FIELD_CONTENT_TYPE_LABEL="Type de contenu"
COM_TAGS_FIELD_CREATED_DATE_DESC="Date et heure de création du tag."
COM_TAGS_FIELD_FULL_DESC="Image affichée dans la vue d'un tag."
COM_TAGS_FIELD_FULL_LABEL="Image détail"
COM_TAGS_FIELD_HITS_DESC="Nombre de clics sur ce tag"
COM_TAGS_FIELD_IMAGE_ALT_DESC="Texte de la balise 'Alt' de l'image"
COM_TAGS_FIELD_IMAGE_ALT_LABEL="Balise 'Alt'"
COM_TAGS_FIELD_IMAGE_CAPTION_DESC="Légende de l'image"
COM_TAGS_FIELD_IMAGE_CAPTION_LABEL="Légende"
COM_TAGS_FIELD_IMAGE_DESC="Sélectionner une image pour ce tag."
COM_TAGS_FIELD_IMAGE_LABEL="Image"
COM_TAGS_FIELD_INTRO_DESC="Image affichée dans la liste des tags."
COM_TAGS_FIELD_INTRO_LABEL="Image générale"
COM_TAGS_FIELD_ITEM_BODY_DESC="Afficher le corps de chaque article."
COM_TAGS_FIELD_LANGUAGE_DESC="Assigner une langue à ce tag."
COM_TAGS_FIELD_LANGUAGE_FILTER_DESC="Filtre par langue de la liste des tags."
COM_TAGS_FIELD_LANGUAGE_FILTER_LABEL="Filtre de langue"
COM_TAGS_FIELD_MODIFIED_DESC="Date et heure de dernière modification du tag."
COM_TAGS_FIELD_NOTE_DESC="Note optionnelle à afficher dans la liste des tags."
COM_TAGS_FIELD_NOTE_LABEL="Note"
COM_TAGS_FIELD_NUMBER_ITEMS_LIST_DESC="Nombre d'éléments taggés listés sur une page"
COM_TAGS_FIELD_NUMBER_ITEMS_LIST_LABEL="Nombre d'éléments à lister"
COM_TAGS_FIELD_PARENT_DESC="Sélection d'un tag parent."
COM_TAGS_FIELD_PARENT_LABEL="Parent"
COM_TAGS_FIELD_PARENT_TAG_DESC="Si activé, seuls les tags enfants du tag sélectionné seront affichés."
COM_TAGS_FIELD_PARENT_TAG_LABEL="Tag parent"
COM_TAGS_FIELD_SELECT_TAG_DESC="Sélectionnez le tag ou les tags à utiliser."
COM_TAGS_FIELD_TAG_BODY_DESC="Afficher/Masquer la description du tag."
COM_TAGS_FIELD_TAG_BODY_LABEL="Description"
COM_TAGS_FIELD_TAG_LABEL="Tag"
COM_TAGS_FIELD_TAG_LINK_CLASS="Classe CSS du lien des tags"
COM_TAGS_FIELD_TAG_LINK_CLASS_DESC="Vous pouvez indiquer dans ce champs les classes CSS à appliquer au lien des tags. Si laissé vide, la classe 'label label-info' sera utilisée par défaut."
COM_TAGS_FIELD_TYPE_DESC="Seuls les tags des types sélectionnés seront affichés."
COM_TAGS_FIELD_TYPE_LABEL="Type"
COM_TAGS_FIELDSET_DETAILS="Détail"
COM_TAGS_FIELDSET_OPTIONS="Options"
COM_TAGS_FIELDSET_PUBLISHING="Publication"
COM_TAGS_FIELDSET_TAGGED_ITEMS="Éléments taggés"
COM_TAGS_FIELDSET_URLS_AND_IMAGES="Liens et images"
COM_TAGS_FILTER_SEARCH_DESC="Recherche sur titre, alias ou note. Préfixe avec ID: recherche sur l'ID d'un tag."
COM_TAGS_FILTER_SEARCH_LABEL="Recherche de tags"
COM_TAGS_FLOAT_DESC="Attribut de position (float) de l'image."
COM_TAGS_FLOAT_LABEL="Position (float)"
COM_TAGS_HAS_SUBCATEGORY_ITEMS="%d éléments assignés aux sous-tags de ce tag."
COM_TAGS_HAS_SUBCATEGORY_ITEMS_1="%d élément assigné aux sous-tags de ce tag."
COM_TAGS_INCLUDE="Inclure"
COM_TAGS_INCLUDE_CHILDREN_DESC="Inclure ou exclure les tags enfants de la liste des résultats d'un tag."
COM_TAGS_INCLUDE_CHILDREN_LABEL="Tags enfants"
COM_TAGS_ITEM_OPTIONS="Options d'élément"
COM_TAGS_ITEMS_SEARCH_FILTER="Recherche"
COM_TAGS_LEFT="Gauche"
COM_TAGS_LIST_ALL_SELECTION_OPTIONS="Options de sélection"
COM_TAGS_LIST_MAX_CHARACTERS_DESC="Nombre maximal de caractères à afficher dans la description d'un tag."
COM_TAGS_LIST_MAX_CHARACTERS_LABEL="Nombre maximal de caractères"
COM_TAGS_LIST_MAX_DESC="Nombre maximal de résultats à afficher."
COM_TAGS_LIST_MAX_LABEL="Résultats maximum"
COM_TAGS_LIST_SELECTION_OPTIONS="Options de sélection d'éléments"
COM_TAGS_MANAGER_TAGS="Tags"
COM_TAGS_MATCH_COUNT="Nombre de tags correspondants"
COM_TAGS_N_ITEMS_ARCHIVED="%d tags archivés."
COM_TAGS_N_ITEMS_ARCHIVED_1="%d tag archivé."
COM_TAGS_N_ITEMS_CHECKED_IN_0="Aucun tag vérifié."
COM_TAGS_N_ITEMS_CHECKED_IN_1="%d tag vérifié."
COM_TAGS_N_ITEMS_CHECKED_IN_MORE="%d tags vérifiés."
COM_TAGS_N_ITEMS_DELETED="%d tags supprimés."
COM_TAGS_N_ITEMS_DELETED_1="%d tag supprimé."
COM_TAGS_N_ITEMS_FAILED_PUBLISHING="%d tags n'ont pu être publiés car au moins un de leurs tags parents n'est pas publié ou un de leurs tags enfants est verrouillé."
COM_TAGS_N_ITEMS_FAILED_PUBLISHING_1="%d tag n'a pu être publié car au moins un de ses tags parents n'est pas publié ou un de ses tags enfants est verrouillé."
COM_TAGS_N_ITEMS_PUBLISHED="%d tags publiés."
COM_TAGS_N_ITEMS_PUBLISHED_1="%d tag publié."
COM_TAGS_N_ITEMS_TRASHED="%d tags mis à la corbeille."
COM_TAGS_N_ITEMS_TRASHED_1="%d tag mis à la corbeille."
COM_TAGS_N_ITEMS_UNPUBLISHED="%d tags dépubliés."
COM_TAGS_N_ITEMS_UNPUBLISHED_1="%d tag dépublié."
COM_TAGS_NONE="Aucun"
COM_TAGS_NUMBER_COLUMNS_DESC="Nombre de colonne de l'affichage en liste des tags. Note : le nombre maximal de colonnes est 12."
COM_TAGS_NUMBER_TAG_ITEMS_DESC="Afficher le nombre d'éléments ayant le même tag."
COM_TAGS_NUMBER_TAG_ITEMS_LABEL="Afficher le nombre d'éléments"
COM_TAGS_OPTIONS="Options de tag"
COM_TAGS_PAGINATION_OPTIONS="Options de pagination"
COM_TAGS_REBUILD_FAILURE="Échec de la reconstruction de l'arborescence des tags."
COM_TAGS_REBUILD_SUCCESS="Reconstruction de l'arborescence des tags effectuée."
COM_TAGS_RIGHT="Droite"
COM_TAGS_SAVE_SUCCESS="Tag sauvegardé."
COM_TAGS_SEARCH_TYPE_DESC="Le paramètre 'Tous' n'affiche que les éléments ayant exactement les mêmes tags, le paramètre 'N'importe lequel' affiche les éléments ayant au moins un tag identique."
COM_TAGS_SEARCH_TYPE_LABEL="Type de similitude"
COM_TAGS_SELECT_TAGTYPE="- Sélectionner un type de tag -"
COM_TAGS_SHOW_ALL_TAGS_DESCRIPTION_DESC="Afficher la description en tête de la liste des tags."
COM_TAGS_SHOW_ALL_TAGS_DESCRIPTION_LABEL="Description générale"
COM_TAGS_SHOW_ALL_TAGS_IMAGE_DESC="Afficher l'image de description en tête de la liste des tags."
COM_TAGS_SHOW_ALL_TAGS_IMAGE_LABEL="Image de description"
COM_TAGS_SHOW_EMPTY_TAG_DESC="Afficher les tags vides"
COM_TAGS_SHOW_ITEM_BODY_DESC="Afficher/Masquer le contenu des éléments taggés."
COM_TAGS_SHOW_ITEM_BODY_LABEL="Contenu des éléments"
COM_TAGS_SHOW_ITEM_DESCRIPTION_DESC="Afficher/masquer la description de chaque tag listé."
COM_TAGS_SHOW_ITEM_DESCRIPTION_LABEL="Description de chaque tag"
COM_TAGS_SHOW_ITEM_IMAGE_DESC="Afficher la première image de chaque élément de la liste"
COM_TAGS_SHOW_ITEM_IMAGE_LABEL="Image d'élément"
COM_TAGS_SHOW_TAG_BODY_DESC="Afficher la description dans la vue de tag unique."
COM_TAGS_SHOW_TAG_BODY_LABEL="Affichage de la description d'un tag"
COM_TAGS_SHOW_TAG_DESCRIPTION_DESC="Afficher/masquer la description dans l'affichage en détail d'un tag (uniquement si un seul tag est sélectionné)"
COM_TAGS_SHOW_TAG_DESCRIPTION_LABEL="Description du tag"
COM_TAGS_SHOW_TAG_IMAGE_DESC="Afficher l'image dans l'affichage de tag unique"
COM_TAGS_SHOW_TAG_IMAGE_LABEL="Image du tag"
COM_TAGS_SHOW_TAG_LIST_DESCRIPTION_LABEL="Description"
COM_TAGS_SHOW_TAG_TITLE_DESC="Afficher le nom du tag dans la vue d'un tag unique."
COM_TAGS_SHOW_TAG_TITLE_LABEL="Afficher le nom du tag"
COM_TAGS_SUBSLIDER_DRILL_TAG_LIST_LABEL="Options pour chaque élément de la liste."
COM_TAGS_TAG_FIELD_MODE_AJAX="AJAX"
COM_TAGS_TAG_FIELD_MODE_DESC="Mode de recherche AJAX lors de l'insertion du nom d'un nouveau tag pour afficher les tags déjà existants. Les tags imbriqués affichent une vue imbriquée avec tous les tags disponibles"
COM_TAGS_TAG_FIELD_MODE_LABEL="Mode de saisie du champ Tag"
COM_TAGS_TAG_FIELD_MODE_NESTED="Imbriqué"
COM_TAGS_TAG_LIST_DESCRIPTION_DESC="Description optionnelle à afficher en tête de liste. Ceci peut être utilisé par exemple lorsque qu'une vue contient plus d'un tag."
COM_TAGS_TAG_LIST_DESCRIPTION_LABEL="Description de la vue"
COM_TAGS_TAG_LIST_FIELD_ITEM_DESCRIPTION_LABEL="Contenu de l'élément"
COM_TAGS_TAG_LIST_ITEM_DESCRIPTION_DESC="Affiche le contenu des éléments en vue individuelle (en fonction de la source de la table)"
COM_TAGS_TAG_LIST_ITEM_HITS_DESC="Affiche le nombre de clics pour chaque élément"
COM_TAGS_TAG_LIST_MEDIA_DESC="Affiche l'image du tag (image entière)"
COM_TAGS_TAG_LIST_MEDIA_LABEL="Image"
COM_TAGS_TAG_LIST_SHOW_DATE_DESC="Afficher la date"
COM_TAGS_TAG_LIST_SHOW_DATE_LABEL="Afficher ou non la colonne de date dans la vue compacte. Sélectionner masquer pour masquer la date ou choisir le type de date à afficher."
COM_TAGS_TAG_LIST_SHOW_HEADINGS_DESC="Afficher ou non les en-têtes de tableau dans la vue compacte"
COM_TAGS_TAG_LIST_SHOW_HEADINGS_LABEL="En-têtes de tableau"
COM_TAGS_TAG_LIST_SHOW_ITEM_IMAGE_DESC="Affiche l'image de chaque élément"
COM_TAGS_TAG_LIST_SHOW_ITEM_IMAGE_LABEL="Image de l'élément"
COM_TAGS_TAG_LIST_SHOW_ITEM_DESCRIPTION_DESC="Afficher/masquer la description de chaque élément de la liste. Sa longueur peut être limitée en utilisant l'option 'Nombre maximal de caractères'."
COM_TAGS_TAG_LIST_SHOW_ITEM_DESCRIPTION_LABEL="Description de l'élément"
COM_TAGS_TAG_VIEW_LIST_DESC="Affiche une liste compacte des éléments taggés avec les tags sélectionnés"
COM_TAGS_TAG_VIEW_LIST_OPTION="Options d'affichage des listes"
COM_TAGS_TAG_VIEW_LIST_TITLE="Liste des éléments taggés"
COM_TAGS_TAGGED_ITEMS_ACCESS="Accès"
COM_TAGS_TAGGED_ITEMS_AUTHOR="Auteur"
COM_TAGS_TAGGED_ITEMS_DATE="Date"
COM_TAGS_TAGGED_ITEMS_ID="ID"
COM_TAGS_TAGGED_ITEMS_LANGUAGE="Langue"
COM_TAGS_TAGGED_ITEMS_TITLE="Titre"
COM_TAGS_XML_DESCRIPTION="Composant de gestion des tags"
JGLOBAL_NO_ITEM_SELECTED="Aucun tag sélectionné"
language/fr-FR/fr-FR.plg_installer_webinstaller.ini000060400000004513152453623440016300 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_INSTALLER_WEBINSTALLER="Installation - Installation depuis le Web"
PLG_INSTALLER_WEBINSTALLER_CANNOT_INSTALL_EXTENSION_IN_PLUGIN="Cette extension ne peut pas être installée à l'aide de l'installation depuis le Web. Merci de visiter le site Web du développeur pour acheter/télécharger."
PLG_INSTALLER_WEBINSTALLER_ERROR_PLUGIN_INCLUDED_IN_CORE="L'installation du plugin a été interrompue. Le plug-in \"Installation depuis le Web\" est inclus dans le noyau à partir de Joomla! 4.0."
; This string is not used.
PLG_INSTALLER_WEBINSTALLER_LOAD_APPS="Afficher les extensions"
; The [SITEURL] placeholder should not be translated as it is used in the JavaScript API to insert the correct URL
PLG_INSTALLER_WEBINSTALLER_REDIRECT_TO_EXTERNAL_SITE_TO_INSTALL="Vous serez redirigé vers le lien suivant pour compléter votre inscription/achat : [SITEURL]"
; This string is deprecated and not used in version 2.0 of the plugin but is required for compatibility with 1.x releases due to the language files being bundled in the CMS package.
PLG_INSTALLER_WEBINSTALLER_TAB_POSITION_DESC="Choisir l'emplacement de l'onglet ‛Installation depuis le Web'."
; This string is deprecated and not used in version 2.0 of the plugin but is required for compatibility with 1.x releases due to the language files being bundled in the CMS package.
PLG_INSTALLER_WEBINSTALLER_TAB_POSITION_LABEL="Position de l'onglet"
; This string is deprecated and not used in version 2.0 of the plugin but is required for compatibility with 1.x releases due to the language files being bundled in the CMS package.
PLG_INSTALLER_WEBINSTALLER_TAB_POSITION_FIRST="En premier"
; This string is deprecated and not used in version 2.0 of the plugin but is required for compatibility with 1.x releases due to the language files being bundled in the CMS package.
PLG_INSTALLER_WEBINSTALLER_TAB_POSITION_LAST="En dernier"
PLG_INSTALLER_WEBINSTALLER_XML_DESCRIPTION="Ce plug-in permet d'activer l'onglet ‛Installation depuis le Web'."
language/fr-FR/fr-FR.com_actionlogs.sys.ini000060400000001263152453623440014502 0ustar00; @date        2018-09-23
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters, Inc. 
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_ACTIONLOGS="Journal des actions des utilisateurs"
COM_ACTIONLOGS_VIEW_DEFAULT_DESC="Affiche une liste des actions des utilisateurs."
COM_ACTIONLOGS_VIEW_DEFAULT_TITLE="Journal des actions des utilisateurs"
COM_ACTIONLOGS_XML_DESCRIPTION="Affiche un journal des actions effectuées par les utilisateurs sur votre site Web."
language/fr-FR/fr-FR.plg_system_stats.sys.ini000060400000001675152453623440015115 0ustar00; @date        2015-11-12
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

; Joomla! Project
; Copyright (C) 2005 - 2017 Open Source Matters. All rights reserved.
; License GNU General Public License version 2 or later; see LICENSE.txt, see LICENSE.php
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_STATS="Système - Statistiques Joomla"
PLG_SYSTEM_STATS_XML_DESCRIPTION="Plug-in système qui envoie des statistiques sur l'environnement à un serveur contrôlé par le projet Joomla! pour des analyses statistiques. Les statistiques envoyées incluent la version de PHP, du CMS, le type de base de données, la version de base de données et le type de serveur."
language/fr-FR/fr-FR.com_checkin.ini000060400000004235152453623440013131 0ustar00; @date        2015-07-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_CHECKIN="Déverrouillage"
COM_CHECKIN_CONFIGURATION="Suppression des verrous : paramètres"
COM_CHECKIN_DATABASE_TABLE="Table de la base de données"
COM_CHECKIN_DATABASE_TABLE_ASC="Table de la base de données ascendant"
COM_CHECKIN_DATABASE_TABLE_DESC="Table de la base de données descendant"
COM_CHECKIN_FILTER_SEARCH_DESC="Rechercher les tables dans lesquelles il y a des éléments à déverrouiller"
COM_CHECKIN_FILTER_SEARCH_LABEL="Recherche de tables de la base de données"
COM_CHECKIN_GLOBAL_CHECK_IN="Maintenance : Déverrouillage global"
COM_CHECKIN_ITEMS_TO_CHECK_IN="Éléments à déverrouiller"
COM_CHECKIN_ITEMS_TO_CHECK_IN_ASC="Éléments à déverrouiller ascendant"
COM_CHECKIN_ITEMS_TO_CHECK_IN_DESC="Éléments à déverrouiller descendant"
COM_CHECKIN_N_ITEMS_CHECKED_IN_0="Aucun élément déverrouillé"
COM_CHECKIN_N_ITEMS_CHECKED_IN_1="1 élément déverrouillé"
COM_CHECKIN_N_ITEMS_CHECKED_IN_MORE="%s éléments déverrouillés"
COM_CHECKIN_NO_ITEMS="Il n'y a pas de tables contenant des éléments à déverrouiller ou il n'y a pas de tables contenant des éléments à déverrouiller correspondant à votre recherche."
COM_CHECKIN_TABLE="table <em>%s</em>"
COM_CHECKIN_XML_DESCRIPTION="Composant de déverrouillage"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_CHECKIN="Les modification ne s'appliquent qu'à ce composant.<br /><em><strong>Hérité</strong></em> - les droits globaux ou ceux des groupes parents seront utilisés.<br /><em><strong>Refusé</strong></em> - prévaut toujours, quels que soient les droits globaux ou ceux des groupes parents, et s'applique aux éléments enfants.<br /><em><strong>Autorisé</strong></em> - le groupe concerné pourra effectuer cette action dans ce composant sauf si les droits globaux sont différents."
language/fr-FR/fr-FR.plg_installer_packageinstaller.sys.ini000060400000001110152453623440017721 0ustar00; @date        2016-05-10
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_INSTALLER_PACKAGEINSTALLER="Installation - Installation par transfert"
PLG_INSTALLER_PACKAGEINSTALLER_PLUGIN_XML_DESCRIPTION="Ce plug-in permet d'installer des packages depuis votre ordinateur local."
language/fr-FR/fr-FR.plg_privacy_user.sys.ini000060400000001143152453623440015054 0ustar00; @date        2018-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_PRIVACY_USER="Confidentialité - Comptes utilisateurs"
PLG_PRIVACY_USER_XML_DESCRIPTION="Responsable du traitement des demandes d'informations liées à la confidentialité pour les données de base des utilisateurs de Joomla."
language/fr-FR/fr-FR.plg_system_highlight.sys.ini000060400000001271152453623440015716 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_SYSTEM_HIGHLIGHT="Système - Mise en évidence"
PLG_SYSTEM_HIGHLIGHT_ERROR_ACTIVATING_PLUGIN="Impossible d'activer automatiquement le plug-in 'Système - Mise en évidence'. Veuillez l'activer manuellement."
PLG_SYSTEM_HIGHLIGHT_XML_DESCRIPTION="Ce plug-in permet de mettre en évidence  des termes spécifiques."

language/fr-FR/fr-FR.com_languages.ini000060400000042142152453623440013472 0ustar00; @date        2015-01-30
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_LANGUAGES="Langues"
COM_LANGUAGES_CONFIGURATION="Langues : Paramètres"
COM_LANGUAGES_ERR_DELETE="Sélectionnez une langue à supprimer"
COM_LANGUAGES_ERR_NO_LANGUAGE_SELECTED="Aucune langue sélectionnée"
COM_LANGUAGES_ERR_PUBLISH="Sélectionnez une langue à activer"
COM_LANGUAGES_ERROR_LANG_TAG="<br /> Le Tag de langue doit être composé de 2 ou 3 lettres minuscules correspondant au code ISO de la langue, suivies d'un tiret court et de 2 lettres majuscules correspondant au code ISO du pays. <br />Ce doit être le préfixe exact utilisé pour la langue installée ou à installer. Exemples : en-GB, srp-ME."
COM_LANGUAGES_ERROR_LANGUAGE_METAFILE_MISSING="Impossible de charger %s le meta XML du fichier de langue %s."
COM_LANGUAGES_ERROR_SEF="<br />Le \"Code de langue\" ne doit contenir que des caractères alphanumériques et des tirets (-).<br />Pour utiliser des caractères UTF-8, \"Alias Unicode\" doit être activé dans la Configuration globale."
COM_LANGUAGES_FIELD_DESCRIPTION_DESC="Saisir une description pour la langue"
COM_LANGUAGES_FIELD_IMAGE_DESC="Nom du fichier image de cette langue lors de l'activation de l'option basique du Sélecteur de langue 'Utiliser les drapeaux'. Exemple: si 'fr' est choisi, l'image devra être 'fr.gif'. Les images et fichiers CSS de ce module sont dans media/mod_languages/"
COM_LANGUAGES_FIELD_IMAGE_LABEL="Image"
COM_LANGUAGES_FIELD_LANG_TAG_DESC="Saisir le tag de langue – exemple: fr-FR pour Français (FR). Ce doit être le <strong>préfixe exact</strong> utilisé pour la langue installée ou à installer."
COM_LANGUAGES_FIELD_LANG_TAG_LABEL="Tag de Langue"
COM_LANGUAGES_INSTALL="Installation de langues"
COM_LANGUAGES_INSTALLED_FILTER_SEARCH_DESC="Recherche dans le titre ou dans le tag de langue"
COM_LANGUAGES_INSTALLED_FILTER_SEARCH_LABEL="Recherche des langues installées"
COM_LANGUAGES_OVERRIDE_ERROR_RESERVED_WORDS="YES, NO, NULL, FALSE, ON, OFF, NONE, TRUE sont des mots réservés et ne doivent en aucun cas être utilisés comme constantes."
COM_LANGUAGES_OVERRIDE_FIELD_BOTH_LABEL="Dans les deux emplacements"
COM_LANGUAGES_OVERRIDE_FIELD_BOTH_DESC="Activer ce paramètre permet de sauvegarder la substitution dans le site (frontal) ou l'administration (backend). Ceci est essentiel pour les substitutions dans le cas de certains plug-ins car leurs fichiers de langue, quoique présents dans le dossier langue de l'administration, sont aussi utilisés dans le frontal (exemple: plg_content_vote).<br />Notez qu'un fois sauvegardées, les deux substitutions seront traitées de façon indépendante."
COM_LANGUAGES_OVERRIDE_FIELD_CLIENT_LABEL="Emplacement"
COM_LANGUAGES_OVERRIDE_FIELD_CLIENT_DESC="Indique si la substitution est créé pour le site (frontal) ou l'administration (backend)."
COM_LANGUAGES_OVERRIDE_FIELD_FILE_LABEL="Fichier"
COM_LANGUAGES_OVERRIDE_FIELD_FILE_DESC="Les valeurs de traduction sont stockées dans un fichier .ini spécifique dit de 'substitution' (surcharge), ainsi que les valeurs du fichier original.<br />Vous pouvez voir ici dans quel fichier est stockée la valeur actuelle."
COM_LANGUAGES_OVERRIDE_FIELD_LANGUAGE_LABEL="Langue"
COM_LANGUAGES_OVERRIDE_FIELD_LANGUAGE_DESC="Langue constante possédant des valeurs de substitution."
COM_LANGUAGES_OVERRIDE_FIELD_KEY_LABEL="Chaîne de traduction"
COM_LANGUAGES_OVERRIDE_FIELD_KEY_DESC="Chaîne de traduction définissant la valeur que vous souhaitez substituer.<br />Les valeurs traduites par les fichiers langue sont identifiées par une chaîne de traduction; spécifiez ici la chaîne dont vous souhaitez substituer la valeur.<br />Si vous ne connaissez pas la chaîne correspondante, vous pouvez la récupérer en spécifiant sa valeur texte dans le champ de recherche sur la droite. En cliquant sur le résultat souhaité, la chaîne sera automatiquement insérée dans ce champ."
COM_LANGUAGES_OVERRIDE_FIELD_OVERRIDE_LABEL="Texte"
COM_LANGUAGES_OVERRIDE_FIELD_OVERRIDE_DESC="Saisir ici le texte que vous souhaitez afficher en substitution de l'original.<br /><strong>A noter </strong>que des éléments de texte sont parfois issus de variables telles %s, %d ou %1$s que vous devez conserver pour que le texte puisse être adapté correctement au contexte de sa requête. Consulter le fichier original si vous pensez que la chaîne en contient."
COM_LANGUAGES_OVERRIDE_FIELD_SEARCHSTRING_LABEL="Chercher le texte"
COM_LANGUAGES_OVERRIDE_FIELD_SEARCHSTRING_DESC="Veuillez spécifier le texte à rechercher dans tous les fichiers langue."
COM_LANGUAGES_OVERRIDE_FIELD_SEARCHTYPE_LABEL="Rechercher comme"
COM_LANGUAGES_OVERRIDE_FIELD_SEARCHTYPE_DESC="Indiquer si la recherche doit s'effectuer dans les chaînes ou dans les valeurs de traduction (texte)."
COM_LANGUAGES_OVERRIDE_FIELD_SEARCHTYPE_CONSTANT="Chaîne"
COM_LANGUAGES_OVERRIDE_FIELD_SEARCHTYPE_TEXT="Valeur"
COM_LANGUAGES_OVERRIDE_FIRST_SELECT_MESSAGE="Pour créer une nouvelle substitution, sélectionner d'abord une langue et un client."
COM_LANGUAGES_OVERRIDE_SELECT_LANGUAGE="- Sélectionner Langue & Client -"
COM_LANGUAGES_FIELD_PUBLISHED_DESC="Langue de contenu activée ou non. Si activée, elle sera affichée dans la liste de choix des langues dans le sélecteur de langue du site."
COM_LANGUAGES_FIELD_LANG_CODE_DESC="Ce Code de langue sera ajouté à l'URL du site. Quand SEF est activé, cela donnera  https://monsite.com/fr/. Si SEF est désactivé, le suffixe &amp;lang=fr sera ajouté à la fin de l'URL. Note : <em>le Code de Langue doit être unique<em>."
COM_LANGUAGES_FIELD_LANG_CODE_LABEL="Code de langue"
COM_LANGUAGES_FIELD_SITE_NAME_DESC="Saisir un nom de site spécifique pour cette langue de contenu. Si l'affichage du nom du site est paramétré c'est ce nom qui sera utilisé au lieu du nom défini dans la configuration générale."
COM_LANGUAGES_FIELD_SITE_NAME_LABEL="Nom de site spécifique"
COM_LANGUAGES_FIELDSET_SITE_NAME_LABEL="Nom du site"
COM_LANGUAGES_FIELD_TITLE_DESC="Le nom de la langue tel qu'il devra apparaître dans les listes"
COM_LANGUAGES_FIELD_TITLE_NATIVE_DESC="Titre dans la langue native"
COM_LANGUAGES_FIELD_TITLE_NATIVE_LABEL="Titre natif"
COM_LANGUAGES_FILTER_CLIENT_LABEL="Filtrer par emplacement :"
COM_LANGUAGES_FTP_DESC="Pour paramétrer la langue par défaut, Joomla aura besoin des informations d'accès à votre compte FTP. Veuillez les saisir dans le formulaire ci-dessous."
COM_LANGUAGES_FTP_TITLE="Détails de connexion FTP"
COM_LANGUAGES_HEADING_AUTHOR="Auteur"
COM_LANGUAGES_HEADING_AUTHOR_ASC="Auteur ascendant"
COM_LANGUAGES_HEADING_AUTHOR_DESC="Auteur descendant"
COM_LANGUAGES_HEADING_AUTHOR_EMAIL="E-mail de l'auteur "
COM_LANGUAGES_HEADING_AUTHOR_EMAIL_ASC="E-mail de l'auteur ascendant"
COM_LANGUAGES_HEADING_AUTHOR_EMAIL_DESC="E-mail de l'auteur descendant"
COM_LANGUAGES_HEADING_DATE="Date"
COM_LANGUAGES_HEADING_DATE_ASC="Date ascendant"
COM_LANGUAGES_HEADING_DATE_DESC="Date descendant"
COM_LANGUAGES_HEADING_DEFAULT="Défaut"
COM_LANGUAGES_HEADING_DEFAULT_ASC="Défaut ascendant"
COM_LANGUAGES_HEADING_DEFAULT_DESC="Défaut descendant"
COM_LANGUAGES_HEADING_HOMEPAGE="Home"
COM_LANGUAGES_HEADING_HOMEPAGE_ASC="Home ascendant"
COM_LANGUAGES_HEADING_HOMEPAGE_DESC="Home descendant"
COM_LANGUAGES_HEADING_LANGUAGE="Langue"
COM_LANGUAGES_HEADING_LANGUAGE_ASC="Langue ascendant"
COM_LANGUAGES_HEADING_LANGUAGE_DESC="Langue descendant"
COM_LANGUAGES_HEADING_LANG_CODE="Code URL de langue"
COM_LANGUAGES_HEADING_LANG_CODE_ASC="Code URL de langue ascendant"
COM_LANGUAGES_HEADING_LANG_CODE_DESC="Code URL de langue descendant"
COM_LANGUAGES_HEADING_LANG_IMAGE="Image"
COM_LANGUAGES_HEADING_LANG_IMAGE_ASC="Image ascendant"
COM_LANGUAGES_HEADING_LANG_IMAGE_DESC="Image descendant"
COM_LANGUAGES_HEADING_LANG_TAG="Tag de langue"
COM_LANGUAGES_HEADING_LANG_TAG_ASC="Tag de langue ascendant"
COM_LANGUAGES_HEADING_LANG_TAG_DESC="Tag de langue descendant"
COM_LANGUAGES_HEADING_VERSION="Version"
COM_LANGUAGES_HEADING_VERSION_ASC="Version ascendant"
COM_LANGUAGES_HEADING_VERSION_DESC="Version descendant"
COM_LANGUAGES_HEADING_TITLE_NATIVE="Titre natif"
COM_LANGUAGES_HEADING_TITLE_NATIVE_ASC="Titre natif ascendant"
COM_LANGUAGES_HEADING_TITLE_NATIVE_DESC="Titre natif descendant"
COM_LANGUAGES_HOMEPAGE="Page d'accueil"
COM_LANGUAGES_MSG_DEFAULT_LANGUAGE_SAVED="Langue par défaut enregistrée. Ceci n'affecte pas les utilisateurs qui ont choisi une langue spécifique dans leur profil ou sur la page de connexion.<br /><strong class='red'>Attention !</strong> Si vous utilisez la fonctionnalité multilingue (plug-in Système - Filtre de langue activé) la langue par défaut du site doit également être publiée comme langue de contenu."
COM_LANGUAGES_MSG_SWITCH_ADMIN_LANGUAGE_SUCCESS="La langue de l'administration a été changée en &quot;<strong>%s</strong>&quot;."
COM_LANGUAGES_MULTILANGSTATUS_CONTACTS_ERROR="certaines fiches de contact liées à l'utilisateur <strong>%s</strong> sont incorrectes."
COM_LANGUAGES_MULTILANGSTATUS_CONTACTS_ERROR_TIP="Attention, un utilisateur/auteur ne doit avoir qu'une seule fiche de contact auquel est assigné 'Toutes' langues ou, une fiche de contact pour chacune des langues actives."
COM_LANGUAGES_MULTILANGSTATUS_CONTENT_LANGUAGE_PUBLISHED="Langues de contenu publiées"
COM_LANGUAGES_MULTILANGSTATUS_DEFAULT_HOME_MODULE_PUBLISHED="Ce site est paramétré en tant que site multilingue. Le module de menu qui affiche la page d'accueil par défaut assignée à langues \"Toutes\" ne doit pas être publié."
COM_LANGUAGES_MULTILANGSTATUS_ERROR_CONTENT_LANGUAGE="Une page d'accueil par défaut est assignée à la langue <strong>%s</strong> alors que la langue correspondante pour le site n'est pas installée ou publiée, ou/et que cette langue de contenu n'est pas publiée (onglet 'Contenu' dans la gestion des langues)."
COM_LANGUAGES_MULTILANGSTATUS_ERROR_CONTENT_LANGUAGE_TRASHED="La langue de contenu <strong>%s</strong> est dans la corbeille."
COM_LANGUAGES_MULTILANGSTATUS_ERROR_LANGUAGE_TAG="Le tag de la langue de contenu <strong>%s</strong> diffère de celui de la langue de site. Vérifier que la langue de site est installée et publiée, et que le tag de langue correct est utilisé pour la langue de contenu. Exemple : pour English (en-GB) les deux tags doivent être 'en-GB'"
COM_LANGUAGES_MULTILANGSTATUS_HOMES_MISSING="Ce site est paramétré en tant que site multilingue. Une ou plusieurs pages d'accueil par défaut pour les langues publiées sont manquantes alors que le plug-in 'Filtre de langue' est activé, ou/et qu'un ou plusieurs modules 'Changement de langue' sont publiés."
COM_LANGUAGES_MULTILANGSTATUS_HOMES_PUBLISHED="Pages d'accueil par défaut publiées"
COM_LANGUAGES_MULTILANGSTATUS_HOMES_PUBLISHED_ALL="1 assignée à langue 'Toutes'"
COM_LANGUAGES_MULTILANGSTATUS_HOMES_PUBLISHED_INCLUDING_ALL="Pages d'accueil par défaut publiées (incluant 1 assignée à langue 'Toutes')"
COM_LANGUAGES_MULTILANGSTATUS_LANGSWITCHER_PUBLISHED="Modules de changement de langue publiés"
COM_LANGUAGES_MULTILANGSTATUS_LANGSWITCHER_UNPUBLISHED="Ce site est paramétré en tant que site multilingue. Au moins un module Changement de langue assigné à langues 'Toutes' doit être publié. Ne pas tenir compte de ce message si vous n'utilisez pas de modules de changement de langue mais des liens directs."
COM_LANGUAGES_MULTILANGSTATUS_LANGUAGEFILTER="Plug-in Filtre de langue"
COM_LANGUAGES_MULTILANGSTATUS_LANGUAGEFILTER_DISABLED="Ce site est paramétré en tant que site multilingue. Le plug-in Filtre de langue n'est pas activé alors qu'un ou plus des modules de Changement de langue OU/ET une ou plus des pages d'accueil par défaut par langue de contenu sont publiés."
COM_LANGUAGES_MULTILANGSTATUS_NONE="Ce site n'est pas paramétré comme site multilingue"
COM_LANGUAGES_MULTILANGSTATUS_SITE_LANG_PUBLISHED="Langues - Site installées"
COM_LANGUAGES_MULTILANGSTATUS_USELESS_HOMES="Ce site n'est pas paramétré comme site multilingue. <br /><strong>Note</strong>: au moins une page d'accueil par défaut est assignée à une langue de contenu. Ceci n'empêchera pas un site monolingue de fonctionner mais mieux vaut corriger cette erreur."
COM_LANGUAGES_N_ITEMS_DELETED="%d langues de contenu supprimées"
COM_LANGUAGES_N_ITEMS_DELETED_1="%d langue de contenu supprimée"
COM_LANGUAGES_N_ITEMS_PUBLISHED="%d langues de contenu activées"
COM_LANGUAGES_N_ITEMS_PUBLISHED_1="%d langue de contenu activée"
COM_LANGUAGES_N_ITEMS_TRASHED="%d langues de contenu mises à la corbeille"
COM_LANGUAGES_N_ITEMS_TRASHED_1="%d langue de contenu mise à la corbeille"
COM_LANGUAGES_N_ITEMS_UNPUBLISHED="%d langues de contenu désactivées.<br /><strong class='red'>Attention !</strong> Si vous utilisez la fonctionnalité multilinguale (plug-in Système - Filtre de langue activé) la langue par défaut du site doit également être publiée comme langue de contenu."
COM_LANGUAGES_N_ITEMS_UNPUBLISHED_1="%d langue de contenu désactivée.<br /><strong class='red'>Attention !</strong> Si vous utilisez la fonctionnalité multilinguale (plug-in Système - Filtre de langue activé) la langue par défaut du site doit également être publiée comme langue de contenu."
COM_LANGUAGES_NO_ITEM_SELECTED="Aucune langue sélectionnée"
COM_LANGUAGES_SAVE_SUCCESS="Langue de contenu enregistrée"
COM_LANGUAGES_SEARCH_IN_TITLE="Rechercher dans les titres"
COM_LANGUAGES_SUBMENU_CONTENT="Langues de contenu"
COM_LANGUAGES_SUBMENU_INSTALLED="Installées"
COM_LANGUAGES_SUBMENU_INSTALLED_ADMINISTRATOR="Installée(s) - Administration"
COM_LANGUAGES_SUBMENU_INSTALLED_SITE="Installée(s) - Site"
COM_LANGUAGES_SUBMENU_OVERRIDES="Substitutions"
COM_LANGUAGES_SWITCH_ADMIN="Changer de langue"
COM_LANGUAGES_VIEW_INSTALLED_ADMIN_TITLE="Langues: Installées (Administration)"
COM_LANGUAGES_VIEW_INSTALLED_SITE_TITLE="Langues: Installées (Site)"
COM_LANGUAGES_VIEW_INSTALLED_TITLE="Langues : Langues installées"
COM_LANGUAGES_VIEW_LANGUAGE_EDIT_EDIT_TITLE="Langues : Modifier une langue de contenu "
COM_LANGUAGES_VIEW_LANGUAGE_EDIT_NEW_TITLE="Langues : Nouvelle langue de contenu "
COM_LANGUAGES_VIEW_LANGUAGES_TITLE="Langues : Langues de contenu"
COM_LANGUAGES_VIEW_OVERRIDE_CLIENT_SITE="Site"
COM_LANGUAGES_VIEW_OVERRIDE_CLIENT_ADMINISTRATOR="Administration"
COM_LANGUAGES_VIEW_OVERRIDE_EDIT_TITLE="Langues : Substitutions de traduction"
COM_LANGUAGES_VIEW_OVERRIDE_EDIT_NEW_OVERRIDE_LEGEND="Créer une nouvelle substitution"
COM_LANGUAGES_VIEW_OVERRIDE_EDIT_EDIT_OVERRIDE_LEGEND="Modifier cette substitution"
COM_LANGUAGES_VIEW_OVERRIDE_LANGUAGE="%1$s [%2$s]"
COM_LANGUAGES_VIEW_OVERRIDE_MORE_RESULTS="Plus de résultats"
COM_LANGUAGES_VIEW_OVERRIDE_NO_RESULTS="Aucun texte correspondant n'a été trouvé"
COM_LANGUAGES_VIEW_OVERRIDE_REFRESHING="Veuillez patienter pendant la recréation du cache."
COM_LANGUAGES_VIEW_OVERRIDE_REQUEST_ERROR="Erreur lors de l'exécution d'une requête Ajax"
COM_LANGUAGES_VIEW_OVERRIDE_RESULTS_LEGEND="Résultats de la recherche"
COM_LANGUAGES_VIEW_OVERRIDE_SAVE_SUCCESS="La valeur de substitution a été enregistrée."
COM_LANGUAGES_VIEW_OVERRIDE_SEARCH_BUTTON="Rechercher"
COM_LANGUAGES_VIEW_OVERRIDE_SEARCH_LEGEND="Recherche du texte que vous voulez substituer"
COM_LANGUAGES_VIEW_OVERRIDE_SEARCH_TIP="Un élément traduit est composé de deux parties: la chaîne de traduction et la valeur traduite (texte). Exemple:<br />COM_CONTENT_READ_MORE='Lire la suite'<br />'<u>COM_CONTENT_READ_MORE</u>' est la chaîne et '<u>Lire la suite</u>' est la valeur.<br />Vous devez utiliser la chaîne de traduction pour substituer sa valeur.<br />Vous pouvez rechercher la chaîne ou la valeur que vous souhaitez substituer en l'indiquant dans le champ de recherche ci-dessous. En cliquant sur le résultat souhaité, la chaîne sera automatiquement insérée dans ce champ."
COM_LANGUAGES_VIEW_OVERRIDES_FILTER_SEARCH_DESC="Recherche de chaîne ou de texte."
COM_LANGUAGES_VIEW_OVERRIDES_KEY="Chaîne"
COM_LANGUAGES_VIEW_OVERRIDES_LANGUAGES_BOX_ITEM="%1$s - %2$s"
COM_LANGUAGES_VIEW_OVERRIDES_N_ITEMS_DELETED="%d valeurs de substitution ont été supprimées."
COM_LANGUAGES_VIEW_OVERRIDES_N_ITEMS_DELETED_1="%d valeur de substitution a été supprimée."
COM_LANGUAGES_VIEW_OVERRIDES_NO_ITEM_SELECTED="Vous n'avez sélectionné aucune substitution"
COM_LANGUAGES_VIEW_OVERRIDES_PURGE="Purger le cache"
COM_LANGUAGES_VIEW_OVERRIDES_PURGE_SUCCESS="Table de cache 'overrider' purgée."
COM_LANGUAGES_VIEW_OVERRIDES_TEXT="Texte"
COM_LANGUAGES_VIEW_OVERRIDES_TITLE="Langues: Substitutions de traduction"
COM_LANGUAGES_XML_DESCRIPTION="Composant de gestion des langues"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_LANGUAGES="Les modification ne s'appliquent qu'à ce composant.<br /><em><strong>Hérité</strong></em> - les droits globaux ou ceux des groupes parents seront utilisés.<br /><em><strong>Refusé</strong></em> - prévaut toujours, quels que soient les droits globaux ou ceux des groupes parents, et s'applique aux éléments enfants.<br /><em><strong>Autorisé</strong></em> - le groupe concerné pourra effectuer cette action dans ce composant sauf si les droits globaux sont différents."
language/fr-FR/fr-FR.plg_content_pagebreak.sys.ini000060400000002126152453623440016016 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_CONTENT_PAGEBREAK="Contenu - Saut de page"
PLG_CONTENT_PAGEBREAK_XML_DESCRIPTION="Ajoute une table des matières à un article paginé à l'aide d'un bouton accessible sous l'éditeur<br />Dans l'éditeur WYSIWYG, un saut de page s'affiche comme une simple ligne horizontale.<br />Le code ci-dessous présente les différentes syntaxes de ce qui est utilisable.<br /> &lt;hr class='system-pagebreak' /&gt;<br />&lt;hr class='system-pagebreak' title='Titre de la page' /&gt; ou <br />&lt;hr class='system-pagebreak' alt='Première page' /&gt; ou <br />&lt;hr class='system-pagebreak' title='Titre de la page' alt='Première page' /&gt; ou <br />&lt;hr class='system-pagebreak' alt='Première page' title='Titre de la page' /&gt;"language/fr-FR/fr-FR.plg_extension_joomla.sys.ini000060400000001010152453623440015707 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_EXTENSION_JOOMLA="Extensions - Joomla"
PLG_EXTENSION_JOOMLA_XML_DESCRIPTION="Système de gestion des sites de mise à jour des extensions"language/fr-FR/fr-FR.plg_system_log.ini000060400000001332152453623440013711 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_LOG_XML_DESCRIPTION="Fonction de journalisation du site en cas d'échec de l'authentification"
PLG_SYSTEM_LOG="Système - Log"
PLG_SYSTEM_LOG_FIELD_LOG_USERNAME_DESC="Cette option permet la journalisation des noms d'utilisateurs en cas d'échec de l'authentification"
PLG_SYSTEM_LOG_FIELD_LOG_USERNAME_LABEL="Journalisation des noms d'utilisateurs"language/fr-FR/fr-FR.com_banners.ini000060400000042341152453623440013155 0ustar00; @date        2015-01-30
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_BANNERS="Bannières"
COM_BANNERS_BANNER_DETAILS="Détails"
COM_BANNERS_BANNER_SAVE_SUCCESS="Bannière enregistrée."
COM_BANNERS_BANNERS_FILTER_SEARCH_DESC="Recherche sur nom de bannière et alias. Préfixe avec ID: recherche sur l'ID d'une bannière"
COM_BANNERS_BANNERS_FILTER_SEARCH_LABEL="Recherche de bannières"
COM_BANNERS_BANNERS_HTML_PIN_BANNER="Bannière épinglée"
COM_BANNERS_BANNERS_HTML_UNPIN_BANNER="Bannière désépinglée"
COM_BANNERS_BANNERS_N_ITEMS_ARCHIVED="%d bannières archivées."
COM_BANNERS_BANNERS_N_ITEMS_ARCHIVED_1="%d bannière archivée"
COM_BANNERS_BANNERS_N_ITEMS_CHECKED_IN_0="Aucune bannière n'a pu être déverrouillée"
COM_BANNERS_BANNERS_N_ITEMS_CHECKED_IN_1="%d bannière déverrouillée"
COM_BANNERS_BANNERS_N_ITEMS_CHECKED_IN_MORE="%d bannières déverrouillées."
COM_BANNERS_BANNERS_N_ITEMS_DELETED="%d bannières supprimées."
COM_BANNERS_BANNERS_N_ITEMS_DELETED_1="%d bannière supprimée."
COM_BANNERS_BANNERS_N_ITEMS_PUBLISHED="%d bannières publiées"
COM_BANNERS_BANNERS_N_ITEMS_PUBLISHED_1="%d bannière publiée"
COM_BANNERS_BANNERS_N_ITEMS_TRASHED="%d bannières mises à la corbeille"
COM_BANNERS_BANNERS_N_ITEMS_TRASHED_1="%d bannière mise à la corbeille"
COM_BANNERS_BANNERS_N_ITEMS_UNPUBLISHED="%d bannières dépubliées"
COM_BANNERS_BANNERS_N_ITEMS_UNPUBLISHED_1="%d bannière dépubliée"
COM_BANNERS_BANNERS_NO_ITEM_SELECTED="Aucune Bannière sélectionnée"
COM_BANNERS_BANNERS_PINNED="Bannière épinglée"
COM_BANNERS_BANNERS_UNPINNED="Bannière désépinglée"
COM_BANNERS_BATCH_CLIENT_LABEL="Sélectionner un client"
COM_BANNERS_BATCH_CLIENT_LABEL_DESC="Ne pas effectuer de sélection conserve le client original"
COM_BANNERS_BATCH_CLIENT_NOCHANGE="- Conserver le client original -"
COM_BANNERS_BATCH_OPTIONS="Traitement par lot des bannières sélectionnées"
COM_BANNERS_BATCH_TIP="Si une catégorie est sélectionnée pour copier/déplacer, les actions sélectionnées seront appliquées aux bannières copiées ou déplacées. Sinon, toutes les actions seront appliquées aux bannières sélectionnées."
COM_BANNERS_BEGIN_DESC="Date de début de la bannière"
COM_BANNERS_BEGIN_HINT="Date de début (yyyy-mm-dd)"
COM_BANNERS_BEGIN_LABEL="Date de début"
COM_BANNERS_CANCEL="Annuler"
COM_BANNERS_CLICK="Clic"
COM_BANNERS_CLIENT_SAVE_SUCCESS="Client enregistré"
COM_BANNERS_CLIENTS_FILTER_SEARCH_DESC="Recherche sur nom de client. Préfixe avec ID: recherche sur l'ID d'un client"
COM_BANNERS_CLIENTS_FILTER_SEARCH_LABEL="Recherche de clients"
COM_BANNERS_CLIENTS_N_ITEMS_ARCHIVED="%d clients archivés."
COM_BANNERS_CLIENTS_N_ITEMS_ARCHIVED_1="%d client archivé."
COM_BANNERS_CLIENTS_N_ITEMS_CHECKED_IN_0="Aucun client n'a pu être déverrouillé"
COM_BANNERS_CLIENTS_N_ITEMS_CHECKED_IN_1="%d client déverrouillé."
COM_BANNERS_CLIENTS_N_ITEMS_CHECKED_IN_MORE="%d clients déverrouillés."
COM_BANNERS_CLIENTS_N_ITEMS_DELETED="%d clients supprimés."
COM_BANNERS_CLIENTS_N_ITEMS_DELETED_1="%d client supprimé."
COM_BANNERS_CLIENTS_N_ITEMS_PUBLISHED="%d clients publiés."
COM_BANNERS_CLIENTS_N_ITEMS_PUBLISHED_1="%d client publié"
COM_BANNERS_CLIENTS_N_ITEMS_TRASHED="%d clients mis à la corbeille"
COM_BANNERS_CLIENTS_N_ITEMS_TRASHED_1="%d client mis à la corbeille"
COM_BANNERS_CLIENTS_N_ITEMS_UNPUBLISHED="%d clients dépubliés"
COM_BANNERS_CLIENTS_N_ITEMS_UNPUBLISHED_1="%d client dépublié"
COM_BANNERS_CLIENTS_NO_ITEM_SELECTED="Aucun client sélectionné"
COM_BANNERS_CONFIGURATION="Bannières : paramètres"
COM_BANNERS_COUNT_ARCHIVED_ITEMS="Bannières archivées"
COM_BANNERS_COUNT_PUBLISHED_ITEMS="Bannières publiées"
COM_BANNERS_COUNT_TRASHED_ITEMS="Bannières dans la corbeille"
COM_BANNERS_COUNT_UNPUBLISHED_ITEMS="Bannières non publiées"
COM_BANNERS_DEFAULT="Défaut (%s)"
COM_BANNERS_DELETE_MSG="Êtes-vous sûr de vouloir réinitialiser le suivi et supprimer les données enregistrées ?"
COM_BANNERS_EDIT_BANNER="Modifier la bannière"
COM_BANNERS_EDIT_CLIENT="Détails"
COM_BANNERS_END_DESC="Date de fin de la bannière"
COM_BANNERS_END_HINT="Date de fin (yyyy-mm-dd)"
COM_BANNERS_END_LABEL="Date de fin"
COM_BANNERS_ERR_ZIP_ADAPTER_FAILURE="Erreur d'adaptateur ZIP"
COM_BANNERS_ERR_ZIP_CREATE_FAILURE="Erreur de création du Zip"
COM_BANNERS_ERR_ZIP_DELETE_FAILURE="Erreur de suppression du Zip"
COM_BANNERS_ERROR_UNIQUE_ALIAS="Une autre bannière de cette catégorie possède le même alias (rappel : cette bannière peut se trouver dans la corbeille)"
COM_BANNERS_EXTRA="Informations complémentaires"
COM_BANNERS_FIELD_ALIAS_DESC="L'alias est pour usage interne uniquement.<br />Laissez ce champ vide pour qu'il soit créé automatiquement à partir du nom. Il doit être unique pour chaque bannière dans la même catégorie."
COM_BANNERS_FIELD_ALT_DESC="Texte alternatif pour les visiteurs qui n'ont pas accès aux images."
COM_BANNERS_FIELD_ALT_LABEL="Texte alternatif"
COM_BANNERS_FIELD_BANNEROWNPREFIX_DESC="Utiliser un préfixe personnalisé pour les mots-clés ou celui défini dans le profil du client."
COM_BANNERS_FIELD_BANNEROWNPREFIX_LABEL="Utiliser un préfixe"
COM_BANNERS_FIELD_BASENAME_DESC="Modèle de nom de fichier pouvant contenir : __SITE__ (nom du site), __CATID__ (ID de catégorie), __CATNAME__ (nom de catégorie), __CLIENTID__ (ID du client), __CLIENTNAME__ (nom du client), __TYPE__ (type), __TYPENAME__ (nom du type), __BEGIN__ (date de début), __END__ (date de fin)."
COM_BANNERS_FIELD_BASENAME_LABEL="Nom de fichier"
COM_BANNERS_FIELD_CATEGORY_DESC="Sélectionnez une catégorie pour cette bannière"
COM_BANNERS_FIELD_CLICKS_DESC="Indique le nombre de clics sur cette bannière.<br />Vous pouvez réinitialiser le compteur à 0 en cliquant sur le bouton."
COM_BANNERS_FIELD_CLICKS_LABEL="Nbre total de clics"
COM_BANNERS_FIELD_CLICKURL_DESC="URL affichée lorsqu'on clique sur cette bannière."
COM_BANNERS_FIELD_CLICKURL_LABEL="URL pour le clic"
COM_BANNERS_FIELD_CLIENT_DESC="Sélectionnez un client pour cette bannière."
COM_BANNERS_FIELD_CLIENT_LABEL="Client"
COM_BANNERS_FIELD_CLIENT_METAKEYWORDPREFIX_DESC="En cas de recherche sur les mots-clés, restreindre à ceux portant ce préfixe (augmente les performances)."
COM_BANNERS_FIELD_CLIENT_METAKEYWORDPREFIX_LABEL="Préfixe des mots-clés"
COM_BANNERS_FIELD_CLIENT_METAKEYWORDS_DESC="La métadonnée 'keywords' permet d'indexer une série de mots-clés ou d'expressions (séparés par une virgule) liés au thème de la(les) bannière(s)."
COM_BANNERS_FIELD_CLIENT_NAME_DESC="Saisissez un nom pour ce client."
COM_BANNERS_FIELD_CLIENT_NAME_LABEL="Nom du client"
COM_BANNERS_FIELD_CLIENT_STATE_DESC="Attribuez un statut à ce client."
COM_BANNERS_FIELD_CLIENTOWNPREFIX_DESC="Utiliser un préfixe personnalisé pour les mots-clés ou celui défini pour le composant."
COM_BANNERS_FIELD_CLIENTOWNPREFIX_LABEL="Utiliser un préfixe"
COM_BANNERS_FIELD_COMPRESSED_DESC="Options de compression pour l'exportation du fichier."
COM_BANNERS_FIELD_COMPRESSED_LABEL="Compression"
COM_BANNERS_FIELD_CONTACT_DESC="Saisissez le nom d'un utilisateur comme contact."
COM_BANNERS_FIELD_CONTACT_LABEL="Nom du contact"
COM_BANNERS_FIELD_CREATED_BY_ALIAS_DESC="Vous pouvez spécifier un alias à afficher à la place du nom de l'auteur de la bannière."
COM_BANNERS_FIELD_CREATED_BY_ALIAS_LABEL="Créé par (alias)"
COM_BANNERS_FIELD_CREATED_BY_DESC="Vous pouvez choisir un utilisateur spécifique comme auteur de la bannière."
COM_BANNERS_FIELD_CREATED_BY_LABEL="Créé par (auteur)"
COM_BANNERS_FIELD_CREATED_DESC="Date de création de cette bannière."
COM_BANNERS_FIELD_CREATED_LABEL="Date de création"
COM_BANNERS_FIELD_CUSTOMCODE_DESC="Saisissez votre code personnalisé pour cette bannière."
COM_BANNERS_FIELD_CUSTOMCODE_LABEL="Code personnalisé"
COM_BANNERS_FIELD_DESCRIPTION_DESC="Saisissez une description pour cette bannière."
COM_BANNERS_FIELD_EMAIL_DESC="Saisissez l'e-mail du contact."
COM_BANNERS_FIELD_EMAIL_LABEL="E-mail du contact"
COM_BANNERS_FIELD_EXTRAINFO_DESC="Saisissez des informations complémentaires pour ce client."
COM_BANNERS_FIELD_EXTRAINFO_LABEL="Informations complémentaires"
COM_BANNERS_FIELD_HEIGHT_DESC="Hauteur attribuée à cette bannière."
COM_BANNERS_FIELD_HEIGHT_LABEL="Hauteur"
COM_BANNERS_FIELD_IMAGE_DESC="Sélectionner une image pour cette bannière."
COM_BANNERS_FIELD_IMAGE_LABEL="Image"
COM_BANNERS_FIELD_IMPMADE_DESC="Nombre d'affichages de cette bannière.<br />Vous pouvez réinitialiser le compteur à 0 en cliquant sur le bouton."
COM_BANNERS_FIELD_IMPMADE_LABEL="Total des affichages"
COM_BANNERS_FIELD_IMPTOTAL_DESC="Nombre maximum d'affichages autorisés pour cette bannière."
COM_BANNERS_FIELD_IMPTOTAL_LABEL="Nmbr maximum d'affichages"
COM_BANNERS_FIELD_LANGUAGE_DESC="Assigner cette bannière à une langue."
COM_BANNERS_FIELD_METAKEYWORDPREFIX_DESC="Restreindre la recherche sur les mots-clés contenant ce préfixe.<br />(augmente les performances)"
COM_BANNERS_FIELD_METAKEYWORDPREFIX_LABEL="Préfixe des mots-clés"
COM_BANNERS_FIELD_METAKEYWORDS_DESC="La métadonnée 'keywords' permet d'indexer une série de mots-clés ou d'expressions (séparés par une virgule) liés au thème de l'article."
COM_BANNERS_FIELD_MODIFIED_BY_DESC="Nom de l'utilisateur qui a modifié cette bannière."
COM_BANNERS_FIELD_NAME_DESC="Entrez un nom pour la bannière"
COM_BANNERS_FIELD_NAME_LABEL="Nom"
COM_BANNERS_FIELD_PUBLISH_DOWN_DESC="Date pour la fin de publication optionnelle de la bannière."
COM_BANNERS_FIELD_PUBLISH_DOWN_LABEL="Fin de publication"
COM_BANNERS_FIELD_PUBLISH_UP_DESC="Date pour le début de publication optionnel de la bannière."
COM_BANNERS_FIELD_PUBLISH_UP_LABEL="Début de publication"
COM_BANNERS_FIELD_PURCHASETYPE_DESC="Sélectionnez le type de contrat à appliquer."
COM_BANNERS_FIELD_PURCHASETYPE_LABEL="Type de contrat"
COM_BANNERS_FIELD_STATE_DESC="Attribuez un statut à cette bannière."
COM_BANNERS_FIELD_STICKY_DESC="Si une bannière (ou plusieurs) d'une catégorie est 'épinglée', elle aura priorité d'affichage sur les autres. Par exemple, si deux bannière d'une catégorie sont épinglées et qu'une troisième ne l'est pas, cette dernière ne sera pas affichée si les paramètres du module sont sur 'Epinglé/Aléatoire'."
COM_BANNERS_FIELD_STICKY_LABEL="Epinglée"
COM_BANNERS_FIELD_TRACKCLICK_DESC="Enregistrer le nombre de clics par jour sur les bannières."
COM_BANNERS_FIELD_TRACKCLICK_LABEL="Suivi des clics"
COM_BANNERS_FIELD_TRACKIMPRESSION_DESC="Enregistrer le nombre d'affichages par jour sur les bannières."
COM_BANNERS_FIELD_TRACKIMPRESSION_LABEL="Suivi des affichages"
COM_BANNERS_FIELD_TRACKROBOTSIMPRESSION_DESC="Inclure les moteurs de recherche dans le nombre d'affichages."
COM_BANNERS_FIELD_TRACKROBOTSIMPRESSION_LABEL="Affichages par moteurs de recherche"
COM_BANNERS_FIELD_TYPE_DESC="Choisir le type de la bannière.<br />Choisir 'Image' pour afficher une image.<br />Choisir 'Personnalisé' pour insérer un code personnalisé."
COM_BANNERS_FIELD_TYPE_LABEL="Type"
; The following five strings are deprecated and will be removed with 4.0. They generate wrong plural detection in Crowdin.
COM_BANNERS_FIELD_VALUE_1="Illimité"
COM_BANNERS_FIELD_VALUE_2="Annuel"
COM_BANNERS_FIELD_VALUE_3="Mensuel"
COM_BANNERS_FIELD_VALUE_4="Hebdomadaire"
COM_BANNERS_FIELD_VALUE_5="Quotidien"
COM_BANNERS_FIELD_VALUE_UNLIMITED="Illimité"
COM_BANNERS_FIELD_VALUE_YEARLY="Annuel"
COM_BANNERS_FIELD_VALUE_MONTHLY="Mensuel"
COM_BANNERS_FIELD_VALUE_WEEKLY="Hebdomadaire"
COM_BANNERS_FIELD_VALUE_DAILY="Quotidien"
COM_BANNERS_FIELD_VALUE_CUSTOM="Personnalisé"
COM_BANNERS_FIELD_VALUE_IMAGE="Image"
COM_BANNERS_FIELD_VALUE_USECLIENTDEFAULT="-- Utiliser la valeur Client par défaut --"
COM_BANNERS_FIELD_VALUE_USECOMPONENTDEFAULT="-- Utiliser la valeur Composant par défaut --"
COM_BANNERS_FIELD_VERSION_LABEL="Révision"
COM_BANNERS_FIELD_VERSION_DESC="Nombre de révision de la bannière (correspond au nombre d'application de la fonction 'Enregistrer')."
COM_BANNERS_FIELD_WIDTH_LABEL="Largeur"
COM_BANNERS_FIELD_WIDTH_DESC="Largeur attribuée à la bannière."
COM_BANNERS_FIELDSET_CONFIG_BANNER_OPTIONS_DESC="Ces paramètres s'appliquent à l'historique des versions pour les Bannières, les catégories de bannières et les clients."
COM_BANNERS_FIELDSET_CONFIG_BANNER_OPTIONS_LABEL="Versions"
COM_BANNERS_FIELDSET_CONFIG_CLIENT_OPTIONS_LABEL="Client"
COM_BANNERS_FIELDSET_CONFIG_CLIENT_OPTIONS_DESC="Ces paramètres s'appliquent à tous les clients, sauf s'ils sont modifiés pour un client spécifique."
COM_BANNERS_FILENAME="%1$s-banners-tracks-%2$s"
COM_BANNERS_GROUP_LABEL_PUBLISHING_DETAILS="Paramètres de publication"
COM_BANNERS_GROUP_LABEL_BANNER_DETAILS="Détails de bannière"
COM_BANNERS_HEADING_ACTIVE="Actif"
COM_BANNERS_HEADING_ACTIVE_ASC="Actif ascendant"
COM_BANNERS_HEADING_ACTIVE_DESC="Actif descendant"
COM_BANNERS_HEADING_BANNERS="Bannières"
COM_BANNERS_HEADING_BANNERS_ASC="Bannières ascendant"
COM_BANNERS_HEADING_BANNERS_DESC="Bannières descendant"
COM_BANNERS_HEADING_CLICKS="Clics"
COM_BANNERS_HEADING_CLICKS_ASC="Clics ascendant"
COM_BANNERS_HEADING_CLICKS_DESC="Clics descendant"
COM_BANNERS_HEADING_CLIENT="Client"
COM_BANNERS_HEADING_CLIENT_ASC="Client ascendant"
COM_BANNERS_HEADING_CLIENT_DESC="Client descendant"
COM_BANNERS_HEADING_CONTACT="Contact"
COM_BANNERS_HEADING_CONTACT_ASC="Contact ascendant"
COM_BANNERS_HEADING_CONTACT_DESC="Contact descendant"
COM_BANNERS_HEADING_COUNT="Nombre"
COM_BANNERS_HEADING_COUNT_ASC="Nombre ascendant"
COM_BANNERS_HEADING_COUNT_DESC="Nombre descendant"
COM_BANNERS_HEADING_IMPRESSIONS="Affichages"
COM_BANNERS_HEADING_IMPRESSIONS_ASC="Affichages ascendant"
COM_BANNERS_HEADING_IMPRESSIONS_DESC="Affichages descendant"
COM_BANNERS_HEADING_METAKEYWORDS="Mots-clés"
COM_BANNERS_HEADING_NAME="Nom"
COM_BANNERS_HEADING_NAME_ASC="Nom ascendant"
COM_BANNERS_HEADING_NAME_DESC="Nom descendant"
COM_BANNERS_HEADING_PURCHASETYPE="Type de contrat"
COM_BANNERS_HEADING_PURCHASETYPE_ASC="Type de contrat ascendant"
COM_BANNERS_HEADING_PURCHASETYPE_DESC="Type de contrat descendant"
COM_BANNERS_HEADING_STICKY="Épinglée"
COM_BANNERS_HEADING_STICKY_ASC="Épinglée ascendant"
COM_BANNERS_HEADING_STICKY_DESC="Épinglée descendant"
COM_BANNERS_HEADING_TYPE="Type"
COM_BANNERS_HEADING_TYPE_ASC="Type ascendant"
COM_BANNERS_HEADING_TYPE_DESC="Type descendant"
COM_BANNERS_IMPRESSION="Affichage"
COM_BANNERS_IMPRESSIONS="%1$s de %2$s"
COM_BANNERS_MANAGER="Bannières"
COM_BANNERS_MANAGER_BANNER_EDIT="Bannières : Modifier la bannière"
COM_BANNERS_MANAGER_BANNER_NEW="Bannières : Nouvelle bannière"
COM_BANNERS_MANAGER_BANNERS="Bannières"
COM_BANNERS_MANAGER_CLIENT_EDIT="Bannières : Modifier le client"
COM_BANNERS_MANAGER_CLIENT_NEW="Bannières : Nouveau Client"
COM_BANNERS_MANAGER_CLIENTS="Bannières : Clients"
COM_BANNERS_MANAGER_TRACKS="Bannières : Suivi"
COM_BANNERS_METADATA="Métadonnées"
COM_BANNERS_FIELD_MODIFIED_DESC="Date et heure de la dernière modification de la bannière."
COM_BANNERS_N_BANNERS_STUCK="%d bannières épinglées."
COM_BANNERS_N_BANNERS_STUCK_1="%d bannière épinglée."
COM_BANNERS_N_BANNERS_UNSTUCK="%d bannières désépinglées."
COM_BANNERS_N_BANNERS_UNSTUCK_1="%d bannière désépinglée."
COM_BANNERS_NEW_BANNER="Nouvelle Bannière"
COM_BANNERS_NEW_CLIENT="Nouveau Client"
COM_BANNERS_NO_BANNERS_SELECTED="Aucune bannière sélectionnée"
COM_BANNERS_NO_CLIENT="- Aucun client -"
COM_BANNERS_NO_CLIENTS_SELECTED="Aucun client sélectionné"
COM_BANNERS_NOCATEGORYNAME="Aucune catégorie"
COM_BANNERS_NOCLIENTNAME="Aucun client"
COM_BANNERS_RESET_CLICKS="Réinitialiser les clics"
COM_BANNERS_RESET_IMPMADE="Réinitialiser les affichages"
COM_BANNERS_SEARCH_IN_TITLE="Recherche dans les titres"
COM_BANNERS_SELECT_CLIENT="- Sélectionnez un client -"
COM_BANNERS_SELECT_TYPE="- Type -"
COM_BANNERS_SUBMENU_BANNERS="Bannières"
COM_BANNERS_SUBMENU_CATEGORIES="Catégories"
COM_BANNERS_SUBMENU_CLIENTS="Clients"
COM_BANNERS_SUBMENU_TRACKS="Suivi"
COM_BANNERS_TRACKS_DELETE="Réinitialiser"
COM_BANNERS_TRACKS_DOWNLOAD="Télécharger les données de Suivi"
COM_BANNERS_TRACKS_EXPORT="Exportation"
COM_BANNERS_TRACKS_FILTER_SEARCH_DESC="Recherche dans le nom du suivi ou le nom de client du suivi"
COM_BANNERS_TRACKS_FILTER_SEARCH_LABEL="Recherche dans suivi"
COM_BANNERS_TRACKS_NO_ITEMS_DELETED="Aucune donnée de suivi à effacer."
COM_BANNERS_TRACKS_N_ITEMS_DELETED="%d données de suivi supprimées."
COM_BANNERS_TRACKS_N_ITEMS_DELETED_1="%d donnée de suivi supprimée."
COM_BANNERS_TYPE1="Affichages"
COM_BANNERS_TYPE2="Clics"
COM_BANNERS_UNLIMITED="Illimité"
COM_BANNERS_XML_DESCRIPTION="Ce composant gère les bannières et les clients auxquelles elles correspondent"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_BANNERS="Les modifications ne s'appliquent qu'à ce composant.<br /><em><strong>Hérité</strong></em> - les droits globaux ou ceux des groupes parents seront utilisés.<br /><em><strong>Refusé</strong></em> - prévaut toujours, quels que soient les droits globaux ou ceux des groupes parents, et s'applique aux éléments enfants.<br /><em><strong>Autorisé</strong></em> - le groupe concerné pourra effectuer cette action dans ce composant sauf si les droits globaux sont différents."
language/fr-FR/fr-FR.plg_content_emailcloak.sys.ini000060400000001074152453623440016177 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_CONTENT_EMAILCLOAK="Contenu - Protection des e-mails"
PLG_CONTENT_EMAILCLOAK_XML_DESCRIPTION="Protège des robots spammeurs toutes les adresses e-mail dans les contenus (utilise JavaScript)"language/fr-FR/fr-FR.plg_fields_editor.sys.ini000060400000001111152453623440015150 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_EDITOR="Champs - Editeur"
PLG_FIELDS_EDITOR_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'editor' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_fields_imagelist.sys.ini000060400000001131152453623440015642 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_IMAGELIST="Champs - Liste d'images"
PLG_FIELDS_IMAGELIST_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'imagelist' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_installer_urlinstaller.sys.ini000060400000001070152453623440017135 0ustar00; @date        2016-05-10
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_INSTALLER_URLINSTALLER_PLUGIN_XML_DESCRIPTION="Ce plug-in permet d'installer des paquets à partir d'une URL."
PLG_INSTALLER_URLINSTALLER="Installation - Installer à partir d'une URL"
language/fr-FR/fr-FR.com_jce.ini000060400000460511152453623440012271 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

;# Description
COM_JCE="Éditeur JCE"
JCE="Éditeur JCE"
COM_JCE_XML_DESCRIPTION="<p>L'extension JCE est un éditeur WYSIWYG pour Joomla.</p><p>JCE n'existerait pas sans ces grands projets :</p><ul><li><a href='https://www.joomla.org' target='_blank'>Joomla!</a></li><li><a href='https://tinymce.moxiecode.com' target='_blank'>TinyMCE</a></li><li><a href='https://jquery.com' target='_blank'>JQuery</a></li><li><a href='https://getuikit.com/' target='_blank'>UIKit</a></li><li>Font Icons de <a href='https://icomoon.io/'>IcoMoon.</a></li><li>Fugue Icons Copyright © <a href='http://p.yusukekamiyamane.com/' target='_blank'>Yusuke Kamiyamane.</a> Tous droits réservés.</li></ul><p>Vous pouvez connaître les modifications apportées à cette version en consultant ce lien&#160;: <a href='https://www.joomlacontenteditor.net/support/changelog/editor' target='_blank'>www.joomlacontenteditor.net/support/changelog/editor</a></p><p>Une réalisation de <i>Ryan Demmer</i></p><p>Traductions et supports francophones&#160;: <a href='https://www.sarki.ch/jce' target='_blank'>www.sarki.ch/jce</a></p>"

WF_ADMIN_VERSION="Version"
WF_EDITOR_TITLE="Éditeur JCE"

COM_JCE_CONFIGURATION="Préférences"

;#################### Sub-menu & View names ##############################
WF_ADMINISTRATION="Administration JCE"
WF_CPANEL="Panneau de contrôle"
WF_CONFIGURATION="Configuration globale"
WF_CONFIG="Configuration"
WF_PROFILES="Profils JCE"
WF_MEDIABOX="Paramètres JCE MediaBox"
WF_HELP="Aide"

;#################### Tables Install / Restore Errors ####################
WF_INSTALL_PROFILES_NOFILE_ERROR="Fichier XML de profil(s) introuvable"
WF_INSTALL_PROFILES_ERROR="Échec de l'importation du/des profil(s)"
WF_INSTALL_PLUGINS_NOFILE_ERROR="Fichier XML de plugins introuvable"
WF_INSTALL_PLUGINS_ERROR="Échec de l'importation des plugins"

;#################### CPanel #############################################
WF_CPANEL_TITLE="Panneau de contrôle"
WF_CPANEL_LICENCE="Licence"
WF_CPANEL_LICENCE_DESC="JCE est publié sous licence..."
WF_CPANEL_VERSION="Version"
WF_CPANEL_VERSION_DESC="Version de l'éditeur actuellement installée..."
WF_CPANEL_UPDATE="Mises à jour"
WF_CPANEL_UPDATE_CHECK="Vérifier si des mises à jour sont disponibles"
WF_CPANEL_FEED="Flux d'informations"
WF_CPANEL_FEED_DESC="Activer/Désactiver l'affichage des flux d'informations de JCE."
WF_CPANEL_FEED_NONE="Aucun flux d'informations disponible"
WF_CPANEL_FEED_LIMIT="Nombre d'informations"
WF_CPANEL_FEED_LIMIT_DESC="Spécifiez le nombre de flux d'informations à afficher."
WF_CPANEL_FEED_DISABLED="Flux d'informations désactivé"
WF_CPANEL_FEED_ENABLE="Activer le flux d'informations"
WF_CPANEL_FEED_LOAD="Chargement du flux d'informations..."
WF_CPANEL_HELP="Panneau de contrôle d'aide de JCE"
WF_CPANEL_HELP_ABOUT="A propos du panneau de contrôle"
WF_CPANEL_HELP_PREFERENCES="Paramètres"
WF_CPANEL_HELP_UPDATES="Mises à jour"
WF_CPANEL_SUPPORT="Support en anglais"
WF_CPANEL_SUPPORT_DESC="Documentation, FAQ, Tutoriels et Forum"
WF_CPANEL_BROWSER="Gestion de fichiers"

WF_CPANEL_BROWSER_WIDTH="Largeur du gestionnaire de fichiers"
WF_CPANEL_BROWSER_WIDTH_DESC="Largeur de la fenêtre du gestionnaire de fichiers de JCE."
WF_CPANEL_BROWSER_HEIGHT="Hauteur du gestionnaire de fichiers"

WF_CPANEL_REPLACE_MEDIAMANAGER_LABEL="Remplacer le gestionnaire Joomla avec celui de JCE"
WF_CPANEL_REPLACE_MEDIAMANAGER_DESCRIPTION="Remplacer l'appel du gestionnaire de fichiers/médias de Joomla par celui de JCE dans toutes les fonctions qui y font appel."

;#################### Preferences #####################################
WF_PREFERENCES_UPDATES="Mise à jour"
WF_PREFERENCES_STANDARD="Généralités"
WF_PREFERENCES_SAVED="Paramètres enregistrés"
WF_HELP_CUSTOM="Site d'aide personnalisé"
WF_HELP_CUSTOM_DESC="Utilisez un site personnalisé pour la documentation d'aide au lieu du site JCE."
WF_HELP_URL="URL des contenus d'aide"
WF_HELP_URL_DESC="URL du site fournissant l'aide intégrée de JCE disponible dans la barre d'outils et l'ensemble des fenêtres d'outils (pas de slash à la fin)."
WF_HELP_URL_METHOD="Méthode de l'URL d'aide"
WF_HELP_URL_METHOD_DESC="URL du fichier d'aide à utiliser pour l'aide intégrée de JCE. Il s'agit de la fonction 'Key Reference' de Joomla avec le champ 'Référence externe' disponible en édition d'article dans l'onglet 'Publication', qui permet de charger un article d'aide en utilisant une URL SEF, par exemple&#160;: https://www.joomlacontenteditor.net/support/documentation/editor/about"
WF_HELP_URL_KEYREFERENCE="Clé de référence externe"
WF_HELP_URL_SEF="URL SEF"
WF_HELP_PATTERN="Modèle de l'URL d'aide"
WF_HELP_PATTERN_DESC="Un modèle de remplacement à utiliser pour créer une URL d'aide si l'option URL SEF est sélectionnée. Le modèle devrait inclure une série de variables numérotées séparées par un caractère, par exemple: /$1/$2/$3"
WF_PREFERENCES="Paramètres"
WF_PREFERENCES_TITLE="Paramètres de JCE"
WF_PREFERENCES_PERMISSIONS="Droits"

WF_UPDATES_KEY="Clé de mise à jour"
WF_UPDATES_KEY_DESC="L'ID de votre 'Abonnement' à JCE Pro est requis pour sa mise à jour en ligne.<br />Il est disponible sur la page de votre compte, dans la description de votre abonnement : <a href='https://www.joomlacontenteditor.net/your-account' target='_blank'>https://www.joomlacontenteditor.net/your-account</a>"

WF_ADMIN_INLINE_HELP="Aide de l'administration"
WF_ADMIN_INLINE_HELP_DESC="Afficher la description des paramètres de manière visible en-dessous de chacun d'eux (Oui) ou, dans une infobulle lors du survol des paramètres (Non)."

;#################### Global Configuration ############################
WF_CONFIG_TITLE="Configuration globale de JCE"
WF_CONFIG_DESC="Modification de la configuration globale de JCE"
WF_CONFIG_CLEANUP="Nettoyage & Sortie"
WF_CONFIG_FORMAT="Mise en forme & Affichage"
WF_CONFIG_ADVANCED="Paramètres avancés"
WF_CONFIG_OTHER="Divers"
WF_CONFIG_HELP="Aide de la configuration globale de JCE"
WF_CONFIG_HELP_ABOUT="Présentation de la configuration globale"
WF_CONFIG_HELP_CLEANUP="Nettoyage & Sortie"
WF_CONFIG_HELP_FORMAT="Mise en forme & Affichage"
WF_CONFIG_HELP_ADVANCED="Paramètres avancés"
WF_CONFIG_HELP_COMPRESSION="Options de compression"
WF_CONFIG_COMPRESSION="Options de compression"
WF_CONFIG_SAVED="Configuration enregistrée"

;#################### Profiles #######################################
WF_PROFILES_TITLE="Profils de l'éditeur JCE"
WF_PROFILES_DESC="Création/Modification des profils utilisateurs de JCE"
WF_PROFILES_LIST="Liste"
WF_PROFILES_NAME="Nom"
WF_PROFILES_NAME_DESC="Nom indicatif attribué à ce profil."
WF_PROFILES_STATE="Statut"
WF_PROFILES_DESCRIPTION="Description"
WF_PROFILES_DESCRIPTION_DESC="Description courte affiché dans la liste des profils."
WF_PROFILES_ORDERING="Ordre"
WF_PROFILES_ORDERING_DESC="Ordre du profil"
WF_PROFILES_EDIT="Modifier le profil"
WF_PROFILES_SETUP="Généralités"
WF_PROFILES_SETUP_DESC="Nom, description, et paramètres de restriction"
WF_PROFILES_FEATURES="Barre d´outils"
WF_PROFILES_FEATURES_DESC="Fonctions et boutons de l'éditeur"
WF_PROFILES_FEATURES_ADDITIONAL="Fonctions supplémentaires"
WF_PROFILES_FEATURES_LAYOUT="Fonctions de la barre d'outils"
WF_PROFILES_ASSIGNMENT="Attribution"
WF_PROFILES_DETAILS="Détails"
WF_PROFILES_COMPONENTS="Composants"
WF_PROFILES_COMPONENTS_DESC="Vous pouvez sélectionner le ou les composants devant charger ce profil. Cochez 'Tous' pour que tous les composants utilisant JCE chargent ce profil. Pour les composants indiqués ici, ce profil doit être placé au-dessus des profils chargeant tous les composants."
WF_PROFILES_COMPONENTS_ALL="Tous"
WF_PROFILES_COMPONENTS_SELECT="Sélectionnés"
WF_PROFILES_AREA="Interface"
WF_PROFILES_AREA_FRONTEND="Frontal"
WF_PROFILES_AREA_BACKEND="Administration"
WF_PROFILES_AREA_DESC="Vous pouvez sélectionner la ou les interfaces du site devant charger ce profil (frontal et/ou administration). Si une interface n'est pas sélectionnée ici, elle utilisera dans la liste des profils le premier qui suit dans laquelle elle est sélectionnée."
WF_PROFILES_TOGGLE_ALL="Activer/Désactiver tous"
WF_PROFILES_REMOVE_USERS="Supprimer"
WF_PROFILES_EXPORT="Exporter"
WF_PROFILES_IMPORT="Importer un profil"
WF_PROFILES_IMPORT_IMPORT="Importer"
WF_PROFILES_IMPORT_BROWSE_ERROR="Type de fichier incorrect : Le fichier doit être un fichier XML"
WF_PROFILES_IMPORT_NOFILE="Échec de l'importation : Aucun fichier à importer de"
WF_PROFILES_SAVED_CHANGES="Modifications du profil '%s' enregistrées"
WF_PROFILES_SAVED="Profil '%s' enregistré"
WF_PROFILES_GROUPS="Groupe d'utilisateurs"
WF_PROFILES_GROUPS_DESC="Vous pouvez sélectionner les groupes d'utilisateurs auxquels ce profil doit être attribué. Vous pouvez également ne sélectionner aucun groupe et choisir un utilisateur spécifique dans le paramètre suivant."
WF_PROFILES_USERS="Utilisateurs"
WF_PROFILES_USERS_DESC="Vous pouvez sélectionner des utilisateurs spécifiques auxquels ce profil doit être attribué. Ces utilisateurs peuvent être ajoutés à des groupes d'utilisateurs sélectionnés ci-dessus auxquels ils n'appartiennent pas ou, être les seuls à utiliser ce profil. Pour les utilisateurs sélectionnés ici, ce profil doit être placé au-dessus de ceux dont ils font partie par une sélection de groupe d'utilsateurs."
WF_PROFILES_USERS_ADD="Ajouter"
WF_PROFILES_FEATURES_LAYOUT_AVAILABLE="Fonctions désactivées"
WF_PROFILES_FEATURES_LAYOUT_AVAILABLE_DESC="Fonctions disponibles, non activées<ul><li>Les fonctions de cette 'barre d'outils désactivée' ne sont pas chargées dans l'éditeur.</li><li>Vous pouvez activer une fonction en glissant/déplaçant son icône dans la 'barre d'outils activée', ou une série de fonctions en glissant/déplaçant une ligne entière.</li></ul>"
WF_PROFILES_FEATURES_LAYOUT_EDITOR="Fonctions activées"
WF_PROFILES_FEATURES_LAYOUT_EDITOR_DESC="Fonctions actives de l'éditeur<ul><li>Les fonctions placées dans cette 'barre d'outils activée' sont chargées dans l'éditeur.</li><li>Vous pouvez désactiver une fonction en glissant/déplaçant son icône dans la 'barre d'outils désactivée' ci-dessous, ou une série de fonctions en glissant/déplaçant une ligne entière.</li></ul>"
WF_PROFILES_EDITOR_SETUP="Nettoyage et sortie"
WF_PROFILES_EDITOR_FILESYSTEM="Fichier système"
WF_PROFILES_EDITOR_PARAMETERS="Paramètres de l´éditeur"
WF_PROFILES_EDITOR="Paramètres de l´éditeur"
WF_PROFILES_EDITOR_PARAMETERS_DESC="Généralités, options, et fichiers système"
WF_PROFILES_EDITOR_TYPOGRAPHY="Typographie"
WF_PROFILES_PLUGIN_PARAMETERS="Paramètres des plugins"
WF_PROFILES_PLUGINS="Paramètres des plugins"
WF_PROFILES_EDITOR_ADVANCED="Paramètres avancés"
WF_PROFILES_PLUGIN_PARAMETERS_DESC="Paramètres spécifiques de chaque plugin"
WF_PROFILES_PLUGINS_STANDARD="Paramètres standards"
WF_PROFILES_PLUGINS_STANDARD_DESC="Paramètres standards du plugin"
WF_PROFILES_PLUGINS_DEFAULTS="Valeurs par défaut"
WF_PROFILES_PLUGINS_DEFAULTS_DESC="Valeurs par défaut des options du plugin"
WF_PROFILES_PLUGINS_ACCESS="Permissions"
WF_PROFILES_PLUGINS_ACCESS_DESC="Paramètres des permissions du plugin"
WF_PROFILES_PLUGINS_ADVANCED="Paramètres avancés"
WF_PROFILES_PLUGINS_ADVANCED_DESC="Paramètres avancés du plugin"
WF_PROFILES_NO_PLUGINS="Aucun plugin dans la barre d'outils"
WF_PROFILES_UPLOAD_FAILED="Echec de l'envoi du fichier de profil"
WF_PROFILES_UPLOAD_NOFILE="Fichier du profil introuvable"
WF_PROFILES_SELECT_ERROR="Aucun profil sélectionné"
WF_PROFILES_IMPORT_ERROR="Échec de l'importation du profil"
WF_PROFILES_IMPORT_SUCCESS="%s profil(s) importé(s) avec succès"
WF_PROFILES_DELETED="%s profil(s) supprimé(s) avec succès"
WF_PROFILES_COPIED="%s profil(s) copié(s) avec succès"
WF_PROFILES_COPY_OF="Copie de %s"
WF_PROFILES_COPY="Copier"
WF_PROFILES_HELP="Aide des profils de JCE"
WF_PROFILES_HELP_ABOUT="A propos des profils"
WF_PROFILES_HELP_MANAGE="Gestion des profils"
WF_PROFILES_HELP_MANAGE_COPY="Copie de profils"
WF_PROFILES_HELP_MANAGE_DELETE="Suppression de profils"
WF_PROFILES_HELP_MANAGE_EXPORT="Exportation de profils"
WF_PROFILES_HELP_MANAGE_IMPORT="Importation de profils"
WF_PROFILES_HELP_MANAGE_ORDERING="Ordre des profils"
WF_PROFILES_HELP_MANAGE_ENABLE="Activation/Désactivation des profils"
WF_PROFILES_HELP_EDIT="Création/Modification des profils"
WF_PROFILES_HELP_EDIT_SETUP="Généralités"
WF_PROFILES_HELP_EDIT_FEATURES="Barre d'outils"
WF_PROFILES_HELP_EDIT_EDITOR="Paramètres de l´éditeur"
WF_PROFILES_HELP_EDIT_PLUGINS="Paramètres des plugins"
WF_PROFILES_HELP_EDIT_WIDGETS="Paramètres accessoires"
WF_PROFILES_SAMPLE_DEFAULT="Profil par défaut de tous les utilisateurs avec droits de modification."
WF_PROFILES_SAMPLE_FRONT="Profil frontal pour les Auteurs, Rédacteurs, et Éditeurs"
WF_PROFILES_CHECKED_OUT="Le profil %s est en cours de modification"
WF_PROFILES_VIEW_SELECT="Veuillez sélectionner un %s de %s"
WF_PROFILES_DEFAULT_DESC="Profil d´administration (défaut)"
WF_PROFILES_FRONTEND_DESC="Profil pour la rédaction en frontal"
WF_PROFILES_ENABLED="Activé"
WF_PROFILES_ENABLED_DESC="État de publication de ce profil."
WF_PROFILES_PLUGINS_BUTTONS="Boutons"
WF_PROFILES_PLUGINS_BUTTONS_DESC="Boutons à afficher dans la barre d'outils"
WF_PROFILES_DEVICE_DESKTOP="Ordinateur"
WF_PROFILES_DEVICE_TABLET="Tablette"
WF_PROFILES_DEVICE_PHONE="Smartphone"
WF_PROFILES_DELETE="Supprimer"
WF_PROFILES_MOVE_DOWN="Déplacer après"
WF_PROFILES_MOVE_UP="Déplacer avant"
WF_PROFILES_DEVICE="Périphérique"
WF_PROFILES_DEVICE_DESC="Vous pouvez sélectionner les périphériques devant charger ce profil (smartphone, tablette ou ordinateur). Si un périphérique n'est pas sélectionné ici, il utilisera dans la liste des profils le premier qui suit dans lequel il est sélectionné."
WF_PROFILES_CUSTOM="Requête personnalisée"
WF_PROFILES_CUSTOM_DESC="Affecter le profil en fonction des correspondances de requête (exemple, view=article, id=4)"
WF_PROFILES_CUSTOM_KEY="Clé"
WF_PROFILES_CUSTOM_VALUE="Valeur"

COM_JCE_N_ITEMS_DELETED="%s profils supprimés."
COM_JCE_N_ITEMS_EXPORTED="%s profils importés."
COM_JCE_N_ITEMS_COPIED="%s profils copiés."
COM_JCE_N_ITEMS_PUBLISHED="%s profils publiés."
COM_JCE_N_ITEMS_UNPUBLISHED="%s profils dépubliés."
COM_JCE_N_ITEMS_CHECKED_IN="%s éléments vérifiés."

WF_TOOLBAR_IMPORT="Importer"

WF_PROFILES_AREA_FILTER_SELECT="- Interface du site -"
WF_PROFILES_DEVICE_FILTER_SELECT="- Appareil de lecture -"
WF_PROFILES_COMPONENTS_FILTER_SELECT="- Composant -"
WF_PROFILES_GROUPS_FILTER_SELECT="- Groupe d'utilisateurs -"

;################### Users ########################
WF_USERS_NAME="Nom"
WF_USERS_USERNAME="Identifiant"
WF_USERS_GROUP="Groupe"
WF_USERS_GROUP_SELECT="Sélectionnez le groupe"

;#################### Plugins Import Errors ###########################
WF_PLUGINS_IMPORT_ERROR="Impossible d'importer les données des plugins"
WF_PLUGINS_IMPORT_SUCCESS="Table des plugins importée avec succès"

;#################### MediaBox #######################################
WF_MEDIABOX_TITLE="JCE MediaBox"
WF_MEDIABOX_CONFIGURATION="Configuration de JCE MediaBox "
WF_MEDIABOX_DESC="Modifier les paramètres de JCE MediaBox"
WF_MEDIABOX_HELP="Aide à la configuration de JCE MediaBox"
WF_MEDIABOX_HELP_CONFIG="Configuration"
WF_MEDIABOX_PARAMETERS="Paramètres MediaBox"
WF_MEDIABOX_SAVED="Paramètres MediaBox enregistrés"

;#################### Database Delete / Restore ######################
WF_DB_CREATE_RESTORE="[Créer / Restaurer]"
WF_DB_PROFILES_ERROR="La table des profils n'existe pas ou est vide"

;#################### Tools / Elements ################################
WF_SERVER_UPLOAD_SIZE="Limite d'envoi du serveur"
WF_TOOLS_EDITABLESELECT_LABEL="Modifier la valeur..."
WF_COLORPICKER_PICKER="Palette"
WF_COLORPICKER_COLORPICKER="Choix de couleur..."
WF_COLORPICKER_PALETTE="Web"
WF_COLORPICKER_NAMED="Noms"
WF_COLORPICKER_TEMPLATE="Template"
WF_COLORPICKER_CUSTOM="Personnalisée"
WF_COLORPICKER_COLOR="Coleur"
WF_COLORPICKER_APPLY="Appliquer"
WF_COLORPICKER_NAME="Nom"
WF_EXTENSION_MAPPER="Liste des extensions"
WF_EXTENSION_MAPPER_TYPE_NEW="Ajouter un type..."
WF_EXTENSION_MAPPER_GROUP_NEW="Ajouter un groupe..."

;#################### Parameters ################################
NO_PARAMETERS="Il n'y a aucun paramètre pour cet élément"

;#################### Parameters - Config Setup ################################
WF_PARAM_NONE="Il n'y a aucun paramètre pour cet élément"
WF_PARAM_EDITOR_WIDTH="Largeur de l'éditeur"
WF_PARAM_EDITOR_WIDTH_DESC="Largeur de la fenêtre de l'éditeur en % ou en pixels. Si en %, ajoutez le symbole (100%). La largeur indiquée ici n'est pas prise en compte si elle est supérieure à celle de l'interface utilisée (smartphone, tablette, ordinateur)."
WF_PARAM_EDITOR_HEIGHT="Hauteur de l'éditeur"
WF_PARAM_EDITOR_HEIGHT_DESC="Hauteur de la fenêtre de l'éditeur en % ou en pixels. Si en %, ajoutez le symbole (80%). La hauteur indiquée ici est prise en compte quelle que soit la hauteur de l'interface utilisée (smartphone, tablette, ordinateur)."
WF_PARAM_EDITOR_STATE="État de l'éditeur wysiwyg au chargement"
WF_PARAM_EDITOR_STATE_DESC="Choisissez si l'éditeur wysiwyg doit être activé par défaut lors de l'édition d'un contenu ou s'il doit être désactivé afin d'afficher le code source du contenu."
WF_PARAM_EDITOR_TOGGLE_LABEL="Texte du lien activer/désactiver"
WF_PARAM_EDITOR_TOGGLE_LABEL_DESC="Texte utilisé comme lien pour activer ou désactiver l'éditeur wysiwyg afin d'afficher le code source du contenu ; exemple: [Activer/Désactiver]. Note : un texte n'est pas obligatoire car une icône est de toute façon affichée si cette fonction est active."
WF_PARAM_EDITOR_TOGGLE="Lien 'Activer/Désactiver' l'éditeur"
WF_PARAM_EDITOR_TOGGLE_DESC="Afficher un lien permettant de désactiver et réactiver l'éditeur wysiwyg pour afficher le code source du contenu ; cette fonction n'est pas nécessaire si vous utilisez la version Pro de JCE qui intègre un éditeur de code complet avec coloration syntaxique, numérotation des lignes, etc. affichable en onglet."
WF_PARAM_EDITOR_GLOBAL_CSS="Styles CSS dans l'éditeur"
WF_PARAM_EDITOR_PROFILE_CSS="Styles CSS dans l'éditeur"
WF_PARAM_EDITOR_GLOBAL_CSS_DESC="Fichier(s) CSS à utiliser pour les styles des contenus dans la zone de l'éditeur et dans la liste déroulante 'Styles CSS' de la barre d'outils.<ul><li>Fichier(s) CSS personnalisé(s) : indiquez un ou plusieurs fichiers dans le champ 'Fichier(s) CSS personnalisé(s)' s'affichant ci-dessous lorsque ce paramètre est choisi.</li><li>Fichier CSS du template : le fichier CSS par défaut du template est utilisé lorsque ce paramètre est choisi, en général il s'agit du fichier 'template.css' ou 'template_css.css' ; attention, certains templates utilisent des fichiers de noms différents qui ne sont pas détectés&nbsp;!</li><li>Défaut : avec ce paramètre, c'est le fichier CSS de JCE proposant un minimum de styles avec un fond blanc et une écriture noire qui est utilisé.</li></ul>"
WF_PARAM_EDITOR_PROFILE_CSS_DESC="Fichier(s) CSS à utiliser pour les styles des contenus dans la zone de l'éditeur et dans la liste déroulante 'Styles CSS' de la barre d'outils.<ul><li>Ajouter - Ajoute les styles du ou des fichiers spécifiés à la liste des styles déjà disponibles.</li><li>Remplacer - remplace les styles disponibles par ceux du ou des fichiers spécifiés.</li><li>Hérité - Utilise les paramètres de la configuration globale de JCE.</li></ul>Note : le champ permettant de spécifier les fichiers CSS ne s'affiche que si vous choisissez 'Ajouter' ou 'Remplacer'."
WF_PARAM_CSS_TEMPLATE="Fichier par défaut du template"
WF_PARAM_CSS_CUSTOM="Fichier(s) CSS personnalisé(s)"
WF_PARAM_CSS_CUSTOM_DESC="Indiquez le ou les fichiers CSS à utiliser pour les styles des contenus dans la zone de l'éditeur et la liste déroulante 'Styles CSS'.<br />Spécifiez l'URL relative du dossier contenant les fichiers suivi du nom des fichiers.<br />La variable <strong>$template</strong> remplace automatiquement le nom du dossier du template du site utilisé par défaut.<br />Séparez les valeurs multiples par des virgules ; exemple :<br />templates/$template/css/styles1.css,templates/$template/css/styles2.css"
WF_PARAM_CSS_INHERIT="Hérité"
WF_PARAM_CSS_ADD="Ajouter"
WF_PARAM_CSS_OVERWRITE="Remplacer"
WF_PARAM_TOOLBAR_LOCATION="Position de la barre d'outils"
WF_PARAM_TOOLBAR_LOCATION_DESC="Position de la barre d'outils selon la zone de contenu de l'éditeur"
WF_PARAM_TOOLBAR_ALIGN="Alignement de la barre d'outils"
WF_PARAM_TOOLBAR_ALIGN_DESC="Alignement de la barre d'outils selon la zone de contenu de l'éditeur"
WF_PARAM_RELATIVE="URL relatives"
WF_PARAM_RELATIVE_DESC="Une URL relative indique le chemin à partir de la racine de Joomla, alors qu'une URL absolue indique le chemin complet avec l'en-tête http(s).<br />Vous devez utiliser des URLs relatives pour toutes les liens internes, ainsi que pour les images et autres médias dans les contenus si vous développez votre site sur un serveur qui n'est pas celui qui l'hébergera au final, car vos URLs ne seront plus les mêmes lorsque vous l'aurez déménagé.<br />Vous devez utiliser des URLs absolues pour tous les liens internes et éléments intégrés dans les contenus qui seront visualisés depuis un endroit autre que le site telles les newsletters envoyées à des boîtes mail."
WF_PARAM_ROOT_BLOCK="Blocs/Combinaisons clavier"
WF_PARAM_ROOT_BLOCK_DESC="Balise initiale des nouveaux contenus, et actions de la touche 'Enter' et 'SHIFT' + 'Enter'.<ul><li><strong>Paragraphe - Paragraphe</strong> : Nouveau=Paragraphe, Enter=Nouveau paragraphe, SHIFT+Enter=Saut de ligne</li><li><strong>Div - Div</strong> : Nouveau=Div, Enter=Nouvelle div, SHIFT+ENTER=Saut de ligne</li><li><strong>Paragraphe - Saut de ligne (br)</strong> : Nouveau=Paragraphe, Enter=Saut de ligne, SHIFT+Enter=Nouveau paragraphe</li><li><strong>Div - Saut de ligne (br)</strong> : Nouveau=Div, Enter=Saut de ligne, SHIFT+Enter=Nouvelle div</li><li><strong>Aucun - Paragraphe</strong> : Nouveau=Aucune balise, Enter=Nouveau paragraphe, SHIFT+Enter=Saut de ligne</li><li><strong>Aucun - Saut de ligne (br)</strong> : Nouveau=Aucune balise, Enter=Saut de ligne, SHIFT+Enter=Nouveau paragraphe</li></ul>"

WF_PARAM_EDITOR_CUSTOM_CSS="CSS personnalisé"
WF_PARAM_EDITOR_CUSTOM_CSS_DESC="Règles CSS personnalisées à ajouter à la zone de contenu de l'éditeur. Elles peuvent être utilisées pour remplacer les styles du template. Exemple: p { font-size:14px; }"

WF_OPTION_DIV="Div - Div"
WF_OPTION_PARAGRAPH="Paragraphe&#160;- Paragraphe"
WF_OPTION_DIV_LINEBREAK="Div - Saut de ligne"
WF_OPTION_PARAGRAPH_LINEBREAK="Paragraphe&#160;- Saut de ligne"
WF_OPTION_PARAGRAPH_MIXED="Aucun&#160;- Paragraphe"
WF_OPTION_LINEBREAK="Aucun&#160;- Saut de ligne"

WF_PARAM_EDITOR_PROFILE_ROOT_BLOCK_DESC="Balise initiale des nouveaux contenus, et actions de la touche 'Enter' et 'SHIFT' + 'Enter'.<ul><li><strong>Paragraphe - Paragraphe</strong> : Nouveau=Paragraphe, Enter=Nouveau paragraphe, SHIFT+Enter=Saut de ligne</li><li><strong>Div - Div</strong> : Nouveau=Div, Enter=Nouvelle div, SHIFT+ENTER=Saut de ligne</li><li><strong>Paragraphe - Saut de ligne (br)</strong> : Nouveau=Paragraphe, Enter=Saut de ligne, SHIFT+Enter=Nouveau paragraphe</li><li><strong>Div - Saut de ligne (br)</strong> : Nouveau=Div, Enter=Saut de ligne, SHIFT+Enter=Nouvelle div</li><li><strong>Aucun - Paragraphe</strong> : Nouveau=Aucune balise, Enter=Nouveau paragraphe, SHIFT+Enter=Saut de ligne</li><li><strong>Aucun - Saut de ligne (br)</strong> : Nouveau=Aucune balise, Enter=Saut de ligne, SHIFT+Enter=Nouveau paragraphe</li></ul>"
WF_PARAM_EDITOR_TOOLBAR_THEME="Thème de la barre d'outils"
WF_PARAM_EDITOR_TOOLBAR_THEME_DESC="Thème (aspect) appliqué à la barre d'outils de l'éditeur."
WF_PARAM_EDITOR_SKIN_CLASSIC="Classique"
WF_PARAM_EDITOR_SKIN_CLASSIC_TOUCH="Touche classique"
WF_PARAM_EDITOR_SKIN_OFFICE_BLUE="Office Bleu"
WF_PARAM_EDITOR_SKIN_OFFICE_SILVER="Office Argent"
WF_PARAM_EDITOR_SKIN_OFFICE_BLACK="Office Noir"
WF_PARAM_EDITOR_SKIN_RETINA_TOUCH="Touche Retina"
WF_PARAM_EDITOR_SKIN_RETINA_DARK="Retina foncé"
WF_PARAM_EDITOR_SKIN_MODERN="Moderne"
WF_PARAM_EDITOR_SKIN_RETINA="Retina"
WF_PARAM_COMPRESS_JAVASCRIPT="Fusionner le JavaScript"
WF_PARAM_COMPRESS_JAVASCRIPT_DESC="Fusionner les fichiers JavaScript dans un fichier unique et le compresser pour accélérer le chargement&nbsp;; attention, en cas de mises à jour, vous pouvez être amené à désactiver et réactiver cette fonction pour regénérer le fichier."
WF_PARAM_COMPRESS_CSS="Fusionner le CSS"
WF_PARAM_COMPRESS_CSS_DESC="Fusionner les fichiers CSS dans un fichier unique et le compresser pour accélérer le chargement&nbsp;; attention, en cas de mises à jour, vous pouvez être amené à désactiver et réactiver cette fonction pour regénérer le fichier."
WF_PARAM_COMPRESS_GZIP="Compresser avec Gzip"
WF_PARAM_COMPRESS_GZIP_DESC="Utiliser le format de compression des fichiers Gzip pour diminuer encore plus la taille&nbsp;; attention, la fonction Gzip doit être activée sur le serveur&nbsp;!"
WF_PARAM_COMPRESS_CACHE_VALIDATION="Validation du cache"
WF_PARAM_COMPRESS_CACHE_VALIDATION_DESC="Les contenus générés dynamiquement, comme les fichiers compressés, ne sont pas automatiquement mis en cache par le navigateur. La validation forcée du cache crée un mécanisme par lequel le navigateur peut identifier si le contenu a changé, s'il doit le mettre en cache ou s'il peut utiliser la version déjà en cache."

WF_PARAM_NAMED="Noms"
WF_PARAM_NUMERIC="Numérique"
WF_PARAM_PARAGRAPHS="Paragraphes (p)"
WF_PARAM_PARAGRAPH="Paragraphe"
WF_PARAM_LINEBREAK="À la ligne (br)"
WF_PARAM_DIV="Div"
WF_PARAM_CLASSIC="Classique"
WF_PARAM_USE_COOKIES="Utiliser les cookies"
WF_PARAM_USE_COOKIES_DESC="Utiliser les cookies pour mémoriser l'état de fonctions comme par exemple le répertoire courant du gestionnaire de fichiers. 'Oui' par défaut."
WF_PARAM_EDITOR_TOOLBAR_ALIGN="Alignement de la barre d'outils"
WF_PARAM_EDITOR_TOOLBAR_ALIGN_DESC="Alignement de la barre d'outils selon la zone de contenu de l'éditeur."
WF_PARAM_EDITOR_TOOLBAR_LOCATION="Position de la barre d'outils"
WF_PARAM_EDITOR_TOOLBAR_LOCATION_DESC="Position de la barre d'outils selon la zone de contenu de l'éditeur."
WF_PARAM_EDITOR_STATUSBAR_LOCATION="Position de la barre de statut"
WF_PARAM_EDITOR_STATUSBAR_LOCATION_DESC="Position de la barre de statut selon la zone de contenu de l'éditeur."
WF_PARAM_EDITOR_PATH="Balises dans la barre de statut"
WF_PARAM_EDITOR_PATH_DESC="Afficher les balises de l'élément sélectionné dans la barre de statut de l'éditeur. Cette fonction est utile pour sélectionner en 1 clic tout le contenu de la balise, par exemple en cliquant sur 'p' pour sélectionner le paragraphe entier."
WF_PARAM_EDITOR_RESIZING="Redimension de l'éditeur"
WF_PARAM_EDITOR_RESIZING_DESC="Autoriser la redimension horizontale et verticale de l'éditeur par glisser/déplacer en cliquant sur le coin droite du bas."
WF_PARAM_EDITOR_RESIZE_HORIZONTAL="Redimension horizontale"
WF_PARAM_EDITOR_RESIZE_HORIZONTAL_DESC="Autoriser la redimension horizontale de l'éditeur par glisser/déplacer en cliquant sur le coin droite du bas. La redimension verticale reste active."
WF_PARAM_EDITOR_RESIZE_COOKIE="Mémoriser la taille de l'éditeur"
WF_PARAM_EDITOR_RESIZE_COOKIE_DESC="Mémoriser la taille redimensionnée de l'éditeur à l'aide d'un cookie mis en cache navigateur."
WF_PARAM_EDITOR_BODY_CLASS="Classe de la zone d'éditeur"
WF_PARAM_EDITOR_BODY_CLASS_DESC="Nom de classe, ou liste de noms de classes (séparés par un espace) à appliquer à la zone de contenu de l'éditeur. Exemple&nbsp;: content-area"

WF_PARAM_EDITOR_WORDCOUNT="Compteur de mots"
WF_PARAM_EDITOR_WORDCOUNT_DESC="Afficher le nombre de mots dans la barre d'état de l'éditeur"

WF_PARAM_EDITOR_ACTIVE_TAB="Onglet actif"
WF_PARAM_EDITOR_ACTIVE_TAB_DESC="Sélectionner l'onglet à afficher par défaut."
WF_PARAM_EDITOR_ACTIVE_TAB_WYSIWYG="Éditeur wysiwyg"
WF_PARAM_EDITOR_ACTIVE_TAB_CODE="Éditeur de Code"
WF_PARAM_EDITOR_ACTIVE_TAB_PREVIEW="Prévisualisation"

WF_PARAM_EDITOR_CONVERT_URLS="Conversion des URL"
WF_PARAM_EDITOR_CONVERT_URLS_DESC="Sélectionnez la méthode à utiliser pour la conversion des URL dans les contenus.<ul><li>Relatif - Le protocole et le domaine du site sont supprimés de l'URL.</li><li>Absolu - le protocole et le domaine du site sont ajoutés à l'URL.</li><li>Aucun : l'URL est laissée telle quelle.</li></ul>"

WF_PARAM_EDITOR_XTD_BUTTONS="Boutons editors-xtd"
WF_PARAM_EDITOR_XTD_BUTTONS_DESC="Activez cette fonction pour afficher les boutons des plugins editors-xtd sous l'éditeur. Note : ce paramètre n'a pas d'effet si l'icône Joomla est intégrée dans la barre d'outils, les liens des boutons seront visibles dans le menu déroulant de l'icône."

;#################### Parameters - Config Cleanup ################################
WF_PARAM_CLEANUP="Validation HTML"
WF_PARAM_CLEANUP_DESC="Si activé, un nettoyage du code HTML est effectué pour répondre aux spécifications du format HTML choisi."
WF_PARAM_SANITIZE_HTML="Sécurisation HTML"
WF_PARAM_SANITIZE_HTML_DESC="La valeur Oui (recommandé) permet d'utiliser DOMPurify pour supprimer les éléments et attributs dangereux, ainsi que les URL à risque, afin de prévenir les attaques XSS (Cross-Site Scripting). Cette fonction est indépendante de la validation HTML."
WF_PARAM_EDITOR_PROFILE_CLEANUP_DESC="Sélectionnez 'Oui' (recommandé) pour formater et nettoyer les contenus selon le Doctype sélectionné ci-dessous. Si 'Hériter' est sélectionné, les paramètres globaux de configuration seront utilisés."
WF_PARAM_EDITOR_PROFILE_SANITIZE_HTML_DESC="La valeur Oui (recommandé) permet d'utiliser DOMPurify pour supprimer les éléments et attributs dangereux, ainsi que les URL à risque, afin de prévenir les attaques XSS (Cross-Site Scripting). Cette fonction est indépendante de la validation HTML. Si l'option Hériter est sélectionnée, les paramètres de la configuration globale pour ce paramètre seront utilisés. Si 'Hériter' est sélectionné, les paramètres globaux de configuration seront utilisés."
WF_PARAM_PLUGIN_MODE="Compatibilité Plugin"
WF_PARAM_PLUGIN_MODE_DESC="Si activé, les symboles & et ' ne seront pas encodés lors de l'enregistrement de l'article afin de préserver la compatibilité avec certains plugins de contenu."
WF_PARAM_JAVASCRIPT="Autoriser le JavaScript"
WF_PARAM_JAVASCRIPT_DESC="Autoriser le code Javascript dans les blocs de code et l'éditeur de code. Cela inclut JavaScript dans les balises &lt;script&gt;, les attributs d'événement et d'autres valeurs d'attribut."
WF_PARAM_CSS="Autoriser le CSS"
WF_PARAM_CSS_DESC="Autoriser le code CSS dans les balises &lt;style&gt;, dans les blocs de code et l'éditeur de code."
WF_PARAM_ELEMENTS="Éléments étendus"
WF_PARAM_ELEMENTS_DESC="Vous pouvez étendre les fonctions de l'éditeur en ajoutant ici l'appel des éléments souhaités tel element[attribute1&#124;attribute2]. Ces éléments seront retirés de la liste des éléments interdits.<br /><strong>Ne fonctionne que si le 'Nettoyage HTML' est activé.</strong>"
WF_PARAM_NO_ELEMENTS="Éléments interdits"
WF_PARAM_NO_ELEMENTS_DESC="Liste d'éléments, séparés par une virgule, interdits d'insertion dans les contenus.<br />Par défaut, pour des raisons de sécurité, les éléments suivants sont toujours supprimés sauf si des paramètres de configuration le permettent ou si un plugin approprié est installé et activé : script, iframe, object, embed, param, applet.<br /><strong>Ne fonctionne que si le 'Nettoyage HTML' est activé.</strong>"
WF_PARAM_INVALID_ATTRIBUTES="Attributs interdits"
WF_PARAM_INVALID_ATTRIBUTES_DESC="Liste d'attributs interdits, exemple: dynsrc,lowsrc. Peut accepter des valeurs d'expression régulière, exemple: on([a-z]+)<br />Cet exemple supprime tous les attributs d'évènements tels 'onclick', 'onmouseover' etc.<br /><strong>Ne fonctionne que si le 'Nettoyage HTML' est activé.</strong>"
WF_PARAM_INVALID_ATTRIBUTE_VALUES="Valeurs d'attributs interdits"
WF_PARAM_INVALID_ATTRIBUTE_VALUES_DESC="Liste des valeurs d'attributs interdites au format sélecteur d'attribut CSS, par ex. : img[title='test'] supprimera la valeur de l'attribut title de toutes les balises img ayant la valeur 'test'.<br />Accepte les sélecteurs d'attributs CSS 2.1 et CSS 3 - <ul><li>L'attribut commence par la valeur : tag[name^='value']<br />par ex. : img[src^='data:image'] supprimera tous les chemins encodés en base64 des attributs src des images</li><li>L'attribut est égal à la valeur : tag[name='value']</li><li>L'attribut n'est pas égal à la valeur : name!='value'</li><li>L'attribut se termine par la valeur : tag[name$='value']par ex. : img[src$='.jpg'] supprimera toutes les valeurs src d'images contenant des chemins avec l'extension .jpg</li></ul><br /><strong>S'applique uniquement si 'Nettoyer le HTML' est sur 'Oui'</strong>"
WF_PARAM_PHP="Autoriser le PHP"
WF_PARAM_PHP_DESC="Autoriser le code PHP dans les blocs de code et l'éditeur de code, représenté par une icône en mode wysiwyg.<br /><strong>Note :</strong> une extension complémentaire doit être installée et activée pour que le code soit interprété."
WF_PARAM_ENTITY_ENCODING="Type d'encodage"
WF_PARAM_ENTITY_ENCODING_DESC="Type d'encodage utilisé pour les caractères spéciaux et les symboles."
WF_PARAM_PROTECT_SHORTCODE="Protéger les balises shortcode"
WF_PARAM_PROTECT_SHORTCODE_DESC="EXPERIMENTAL - Protéger le contenu des balises shortcode, par exemple {tag}content{/tag}, du traitement par l'éditeur"
WF_PARAM_ALLOW_CUSTOM_XML="Autoriser le XML personnalisé"
WF_PARAM_ALLOW_CUSTOM_XML_DESC="Autoriser la modification de code XML personnalisé dans les blocs de code et l'éditeur de code."

WF_PARAM_CODE_BLOCKS="Blocs de code"
WF_PARAM_CODE_BLOCKS_DESC_WARNING="<strong>Attention&#160;:</strong> activer l'une de ces options permettra aux utilisateurs ayant accès à l'éditeur de créer du contenu et d'apporter des modifications au site - directement ou indirectement - qui pourraient présenter un risque pour la sécurité du site et de ses visiteurs. Ces options ne doivent donc être activées que dans les profils attribués à des utilisateurs et groupes d'utilisateurs approuvés."

WF_PARAM_CODE_BLOCKS_ENABLE="Activer les blocs de code"
WF_PARAM_CODE_BLOCKS_ENABLE_DESC="Affichez les scripts et le code dans des blocs visibles et modifiables dans l'éditeur. Si cette option est désactivée, des espaces réservés seront utilisés pour indiquer la présence de scripts dans le contenu, qui doivent ensuite être modifiés dans l'éditeur de code."

WF_PARAM_EDITOR_STYLE_RESET="Style de base contrasté"
WF_PARAM_EDITOR_STYLE_RESET_DESC="'Oui' applique un style minimal dans la zone d'édition avec un fond blanc, un alignement à gauche et une couleur du texte noire. 'Auto' détecte si le style minimal est nécessaire en fonction du contraste de la couleur d'arrière-plan et de la couleur du texte."

WF_PARAM_PAD_EMPTY_TAGS="Espace balise vide"
WF_PARAM_PAD_EMPTY_TAGS_DESC="Par défaut, certaines balises vides (p, h1-h6, pre, div, adress, caption) sont complétées par un espace insécable afin de maintenir la structure de mise en page dans les différents navigateurs. Sans l'espace insécable, certains navigateurs n'affichent pas les balises vides.<br />Réglez ce paramètre sur <strong>Non</strong> pour supprimer l'espace insécable lorsque l'éditeur est basculé du mode code en mode wysiwyg et lors de l'enregistrement du contenu."

WF_PARAM_VALIDATE_STYLES="Validation des styles"
WF_PARAM_VALIDATE_STYLES_DESC="N'autorisez qu'une syntaxe CSS valide pour la valeur d'attribut style sur tous les éléments."

WF_PARAM_ALLOW_EVENT_ATTRIBUTES="Attributs d'événement"
WF_PARAM_ALLOW_EVENT_ATTRIBUTES_DESC="Autoriser les attributs d'événement tels onclick, onload, etc. sur tous les éléments. Comme les attributs d'événement sont capables d'exécuter du code JavaScript, ils ne devraient être autorisés que pour les utilisateurs de confiance."

;#################### Parameters - Config General ################################
WF_PARAM_CUSTOM_COLORS="Couleurs personnalisées"
WF_PARAM_CUSTOM_COLORS_DESC="Vous pouvez spécifiez en valeur hexadécimale et séparées par une virgule les couleurs à ajouter à la palette de couleurs. Exemple : #59e2a7,#fa95d2"
WF_PARAM_CUSTOM_CONFIG="Valeurs de configuration"
WF_PARAM_CUSTOM_CONFIG_DESC="Spécifiez de nouvelles valeurs ou de remplacement des options de configuration de l'éditeur."
WF_PARAM_FONTS="Polices"
WF_PARAM_FONTS_NEW="Ajouter une nouvelle police..."
WF_PARAM_FONTS_DESC="Polices à inclure dans la liste de la famille de polices<br />Décochez une police pour la retirer de la liste<br />Ajouter une nouvelle police en cliquant sur le bouton 'Ajouter une nouvelle police'<br />Faites glisser pour réorganiser l'ordre des polices."
WF_PARAM_FONT_SIZES="Taille de la police"
WF_PARAM_FONT_SIZES_DESC="Tailles des polices dans la liste déroulante. En pixels (8px,10px,12px,14px,18px,24px,36px), en points (8pt,10pt,12pt,14pt,18pt,24pt,36pt) ou en pourcent (80%,90%,110%,120%,130%,150%,180%).<br />Vous pouvez également utiliser l'encodage suivant : xx-small,x-small,small, medium,large,x-large,xx-large."
WF_PARAM_BLOCK_FORMAT="Formats des blocs"
WF_PARAM_BLOCK_FORMAT_DESC="Balises affichées dans la liste déroulante 'Format' permettant d'attribuer un style aux blocs de contenu.<br />Décochez un éléments pour le supprimer de la liste.<br />Glissez-déplacez les éléments pour réordonner l'ordre d'affichage."
WF_BLOCK_FORMAT_PREVIEW_STYLES="Afficher l'aperçu des formats"
WF_BLOCK_FORMAT_PREVIEW_STYLES_DESC="Affichez un aperçu simple et stylisé dans la liste des formats en utilisant les styles du template de site."
WF_PARAM_DOCTYPE="Type de validation"
WF_PARAM_DOCTYPE_DESC="Type de validation HTML (si l'option Validation HTML est activée)<ul><li>HTML4 : valider en utilisant les spécifications de transition HTML4</li><li>HTML5 : valider en utilisant les spécifications HTML5</li><li>Mixte : valider en utilisant une combinaison des spécifications HTML4 et HTML5</li></ul>"
WF_PARAM_DOCTYPE_MIXED="Mixte"
WF_PARAM_EDITOR_PROFILE_DOCTYPE_DESC="Type de validation HTML (si l'option Validation HTML est activée)<ul><li>HTML4 : valider en utilisant les spécifications de transition HTML4</li><li>HTML5 : valider en utilisant les spécifications HTML5</li><li>Mixte : valider en utilisant une combinaison des spécifications HTML4 et HTML5</li><li>Hérité : utiliser le Doctype défini dans la configuration globale</li></ul>"
WF_PARAM_INLINE_UPLOAD="Ajout par Glisser-déplacer"
WF_PARAM_INLINE_UPLOAD_DESC="Autoriser l'ajout de fichiers par la fonction 'Glisser/Déplacer' dans la zone d'envoi du gestionnaire de fichiers."

;## Object Resizing ##
WF_PARAM_OBJECT_RESIZING="Redimension d'objets"
WF_PARAM_OBJECT_RESIZING_DESC="Autoriser les objets multimédias (images, vidéos, tableaux) à être redimensionnés par glissement dans la fenêtre de l'éditeur."

;#################### Parameters - Config Plugins ################################
WF_PARAM_FOLDER_TREE="Arborescence des dossiers"
WF_PARAM_FOLDER_TREE_DESC="Afficher l'arborescence des dossiers dans la partie gauche du gestionnaire de fichiers pour faciliter l'exploration."
WF_PARAM_UPLOAD_EXISTS="Si fichier existant..."
WF_PARAM_UPLOAD_EXISTS_DESC="Sélectionnez les actions à disposition de l'utilisateur lorsqu'un fichier du même nom existe déjà dans le dossier cible."
WF_PARAM_UPLOAD_EXISTS_OVERWRITE="Remplacer le fichier"
WF_PARAM_UPLOAD_EXISTS_UNIQUE="Nommer différemment"
WF_PARAM_UPLOAD_SUFFIX="Suffixe de nom de fichier"
WF_PARAM_UPLOAD_SUFFIX_DESC="Suffixe à ajouter au nom d'un fichier lors de son envoi ou son collé s'il existe déjà dans le même dossier. La valeur par défaut est '_copy'. Le signe $ ajoute un incrément de nombre, par exemple _$ ajoute _1, _2, etc."
WF_PARAM_UPLOAD_ADD_RANDOM="Renommer les fichiers à l'envoi"
WF_PARAM_UPLOAD_ADD_RANDOM_DESC="Pour éviter de remplacer un fichier ayant le même nom, vous pouvez activer ce paramètre qui ajoutera automatiquement 5 caractères aléatoires au nom des fichiers lors de leur envoi."
WF_PARAM_UPLOAD_REMOVE_EXIF="Supprimer les données EXIF"
WF_PARAM_UPLOAD_REMOVE_EXIF_DESC="Supprimer les données <a href='https://en.wikipedia.org/wiki/Exchangeable_image_file_format' title='EXIF'>EXIF</a> des images JPEG and PNG lors de leur envoi sur le serveur."
WF_PARAM_UPLOAD_QUALITY="Qualité à l'envoi (%)"
WF_PARAM_UPLOAD_QUALITY_DESC="Qualité JPEG par défaut des images envoyées sur le serveur."
WF_PARAM_WEBSAFE_MODE="Fichiers Websafe & Nom des dossiers"
WF_PARAM_WEBSAFE_MODE_DESC="Format à utiliser pour les fichiers Websafe et les noms des dossiers. UTF-8 permet l'utilisation de tous les caractères UTF-8 et, dans les noms A-Z a-z 0-9._-~ ; ASCII convertit certains caractères UTF-8 latin en équivalents ASCII, exemple: ë -> e, õ -> o etc. et permet l'utilisation dans les noms des caractères A-Z a-z 0-9._-~"
WF_PARAM_WEBSAFE_ALLOW_SPACES="Espaces dans les noms"
WF_PARAM_WEBSAFE_ALLOW_SPACES_DESC="Réglez sur 'Oui' pour autoriser les espaces dans les noms de fichiers et de dossiers ou indiquez le caractère à utiliser comme remplacement de l'espace."
WF_PARAM_WEBSAFE_TEXTCASE="Casse du texte"
WF_PARAM_WEBSAFE_TEXTCASE_DESC="Sélectionnez la casse à utiliser pour les noms de fichier et dossier."
WF_PARAM_DATE_FORMAT="Format de date"
WF_PARAM_DATE_FORMAT_DESC="Format de la date de modification des fichiers et des dossiers. Par exemple, %d/%m/%Y, %H:%M affichera comme format: 13/12/1984, 14:00"
WF_PARAM_VALIDATE_MIMETYPE="Validation MIMETYPE"
WF_PARAM_VALIDATE_MIMETYPE_DESC="Paramètres de validation MIMETYPE des formats de fichiers.<br />Pour augmenter la sécurité lors de l'envoi d'un fichier, le type MIME peut être vérifié par son extension. Ce paramètre est désactivé par défaut car ce processus nécessite des fonctions PHP qui ne sont pas disponibles sur tous les serveurs. Toutefois, s'il est activé et que le serveur ne supporte pas les fonctions PHP fileinfo ou mime_content_type, la vérification mimetype sera ignorée."
WF_PARAM_BROWSER_POSITION="Gestionnaire de fichiers"
WF_PARAM_BROWSER_POSITION_DESC="Position du gestionnaire de fichiers dans la boîte de dialogue, 'Bas' par défaut."
WF_PARAM_LIST_LIMIT="Longueur de liste"
WF_PARAM_LIST_LIMIT_DESC="Nombre de fichiers/dossiers affichés en liste sur une même page du gestionnaire de fichiers"
WF_PARAM_EXTENSIONS="Extensions autorisées"
WF_PARAM_EXTENSIONS_DESC="Liste des extensions de fichiers autorisées à être envoyées/affichées, classées par type. Pour modifier la liste, cliquez sur l'icône en forme de crayon. Vous pouvez déplacer les extensions d'un groupe à l'autre par glisser-déplacer. Les extensions peuvent être désactivées en décochant la case correspondante. Pour ajouter une extension personnalisée, utilisez le champ de saisie au bas de la liste. Cliquez sur l'icône plus pour ajouter un nouveau champ de saisie ou sur l'icône corbeille pour supprimer un champ existant."
WF_PARAM_BUTTONS="Boutons affichés"
WF_PARAM_BUTTONS_DESC="Sélectionnez les boutons à afficher dans la barre d'outils de l'éditeur"
WF_PARAM_KEEP_NBSP="Conversion des espaces"
WF_PARAM_KEEP_NBSP_DESC="Convertir les espaces UTF-8 en espaces insécables lorsque le type d'encodage choisi est UTF-8 (recommandé)."

WF_PARAM_TOTAL_FILES_LIMIT="Nombre total de fichiers"
WF_PARAM_TOTAL_FILES_LIMIT_DESC="Nombre total de fichiers que peut contenir le répertoire d'envoi (tous les sous-dossiers compris). Par exemple si fixé à 50, le 51ème fichier ne pourra pas être envoyé. Laissez ce champ vide pour ne fixer aucune limite."
WF_PARAM_TOTAL_FILES_SIZE_LIMIT="Taille totale des fichiers"
WF_PARAM_TOTAL_FILES_SIZE_LIMIT_DESC="Taille totale des fichiers en Mo que peut contenir le répertoire d'envoi et ses sous-répertoires. Par exemple si fixé à 10, le fichier faisant dépasser le quota de 10 Mo ne pourra pas être envoyé. Laissez ce champ vide pour ne pas fixer de limite."

WF_BROWSER_ALLOW_DOWNLOAD="Autoriser le téléchargement de fichiers"
WF_BROWSER_ALLOW_DOWNLOAD_DESC="Autoriser le téléchargement direct des fichiers listés dans le gestionnaire de fichiers, en appuyant sur la touche ALT tout en cliquant sur le nom du fichier."

WF_PARAM_CUSTOM_ATTRIBUTES="Attributs personnalisés"
WF_PARAM_CUSTOM_ATTRIBUTES_DESC="Valeurs par défaut des attributs personnalisés. Définir le nom de l'attribut et la valeur par défaut. Cocher l'option <strong>Booléen</strong> pour définir cet attribut comme booléen."
WF_PARAM_CUSTOM_ATTRIBUTES_NAME="Nom de l'attribut"
WF_PARAM_CUSTOM_ATTRIBUTES_VALUE="Valeur de l'attribut"

;#################### Plugin / Command Titles and Descriptions ################################
WF_CONTEXTMENU_TITLE="Menu contextuel"
WF_CONTEXTMENU_DESC="Afficher un menu contextuel avec des commandes et des icônes lors d'un clic droite sur un élément (les fonctions affichées dépendent de l'élément)."
WF_BROWSER_TITLE="Gestionnaire de fichiers"
WF_BROWSER_DESC="Ajouter l'exploration de fichiers dans le plugin 'Liens' et pour des champs spécifiques des plugins 'Tableaux', 'Images' et 'Styles CSS'. Requis par le champ 'JCE Gestionnaire de fichiers (média)'."
WF_INLINEPOPUPS_TITLE="Popups modales"
WF_INLINEPOPUPS_DESC="Afficher les popups en fenêtre modale (popups classiques dans Joomla) et non en fenêtre de navigateur pour éviter le blocage des systèmes anti-popup."
WF_PASTE_TITLE="Fonctions couper, copier et coller"
WF_PASTETEXT_TITLE="Coller du texte brut"
WF_SPELLCHECKER_TITLE="Vérificateur orthographique"
WF_SPELLCHECKER_DESC="Fonction de vérification orthographique pour les systèmes PSpell, Google Spell, Enchant"
WF_ATTRIBUTES_TITLE="Évènement"
WF_SOURCE_TITLE="Éditeur de code"
WF_SOURCE_DESC="Afficher l'onglet d'édition du code source de la zone de contenu de l'éditeur. A noter que la version Pro de JCE affiche un code coloré, une numérotation de lignes et la fonction Rechercher/Remplacer."
WF_ANCHOR_TITLE="Ancre"
WF_ANCHOR_DESC="Insérer/Modifier une ancre (lien dans le contenu)"
WF_ARTICLE_TITLE="Lire la suite... - Saut de page"
WF_ARTICLE_DESC="Insérer/Modifier un lien 'Lire la suite' ou un 'Saut de page' (page divisée) Joomla!©"
WF_BACKCOLOR_TITLE="Couleur de fond"
WF_BACKCOLOR_LIST_TITLE="Couleurs de fond personnalisées"
WF_BACKCOLOR_LIST_DESC="Liste de couleurs personnalisées à afficher dans le menu déroulant de l'icône 'Couleur de fond' de la barre d'outils. Au format hexadécimal, séparées par des virgules, exemple: #cccccc,#dddddd,#eeeeee"
WF_BACKCOLOR_DESC="Appliquer/Modifier la couleur de fond de l'élément sélectionné."
WF_BOLD_TITLE="Gras"
WF_BOLD_DESC="Appliquer ou supprimer l'effet gras du texte sélectionné."
WF_BULLIST_TITLE="Liste non ordonnée"
WF_JUSTIFYCENTER_TITLE="Aligné au centre"
WF_JUSTIFYCENTER_DESC="Centrer le texte ou l'élément sélectionné."
WF_CHARMAP_TITLE="Caractères spéciaux & Symboles"
WF_CHARMAP_DESC="Sélectionner ou insérer un caractère spécial ou un symbole dans le contenu."
WF_CLEANUP_TITLE="Nettoyer le code"
WF_CLEANUP_DESC="Nettoyer le code HTML des balises redondantes"
WF_DIRECTIONALITY_TITLE="Direction d'écriture"
WF_DIRECTIONALITY_DESC="Attribuer un sens d'écriture au texte, de gauche à droite ou de droite à gauche."
WF_FONTSELECT_TITLE="Polices d´écriture"
WF_FONTSELECT_DESC="Appliquer une police d'écriture spécifique au texte sélectionné. Exemple: Arial"
WF_FONTSIZESELECT_TITLE="Tailles des polices"
WF_FONTSIZESELECT_DESC="Appliquer une taille à la police d'écriture du texte sélectionné. Exemple: 10px"
WF_FORECOLOR_TITLE="Couleur de texte"
WF_FORECOLOR_DESC="Appliquer une couleur à la police d'écriture du texte sélectionné. Exemple: #000000 (noir)"
WF_FORECOLOR_LIST_TITLE="Couleurs de texte personnalisées"
WF_FORECOLOR_LIST_DESC="Liste de couleurs personnalisées à afficher dans le menu déroulant de l'icône 'Couleur de texte' de la barre d'outils. Au format hexadécimal, séparées par des virgules, exemple: #000000,#444444,#888888"
WF_FORMATSELECT_TITLE="Formats"
WF_FORMATSELECT_DESC="Appliquer un format au bloc du contenu sélectionné. Exemple: Paragraphe (l'aspect du paragraphe et des autres formats dépendent en générale de la feuille de style du template)"
WF_JUSTIFYFULL_TITLE="Justifié"
WF_JUSTIFYFULL_DESC="Aligner toutes les lignes du bloc de texte sur toute la largeur, sauf le point final"
WF_FULLSCREEN_TITLE="Plein écran"
WF_FULLSCREEN_DESC="Afficher l'éditeur en pleine page du navigateur web"
WF_HELP_TITLE="Aide"
WF_HELP_DESC="Ouvrir la fenêtre d'aide en ligne (tutoriel)"
WF_HR_TITLE="Ligne horizontale"
WF_HR_DESC="Insérer une ligne horitontale"
WF_IMGMANAGER_TITLE="Gestionnaire d´images"
WF_IMGMANAGER_DESC="Envoyer, gérer, insérer ou renommer des images avec le gestionnaire de fichiers"
WF_INDENT_TITLE="Appliquer un retrait"
WF_INDENT_DESC="Appliquer un retrait à l'élément sélectionné"
WF_ITALIC_TITLE="Italique"
WF_ITALIC_DESC="Appliquer ou supprimer l'effet italique du texte sélectionné"
WF_LAYER_TITLE="Calques (div)"
WF_LAYER_DESC="Insérer une balise div flottante (bloc de contenu)."
WF_JUSTIFYLEFT_TITLE="Aligné à gauche"
WF_JUSTIFYLEFT_DESC="Aligner l'élément sélectionné à gauche"
WF_LINK_TITLE="Gestionnaire de liens"
WF_LINK_DESC="Insérer/Modifier un lien vers une catégorie, un article, un lien de menu, un fichier, une page web, ou une adresse e-mail."
WF_MEDIA_TITLE="Support de médias"
WF_MEDIA_DESC="Activer la prise en charge des éléments OBJECT, EMBED, AUDIO, VIDEO et IFRAME requise par le gestionnaire de médias de JCE pour l'insertion de médias utilisant les iframes telles Youtube, Vimeo, etc."
WF_NEWDOCUMENT_TITLE="Tout supprimer"
WF_NEWDOCUMENT_DESC="Tout supprimer de la zone de contenu de l'éditeur"
WF_NONBREAKING_TITLE="Espace insécable"
WF_NONBREAKING_DESC="Insérer un espace insécable"
WF_NUMLIST_TITLE="Listes chronologiques"
WF_OUTDENT_TITLE="Diminuer le retrait"
WF_OUTDENT_DESC="Diminuer le retrait appliqué à l'élément sélectionné."
WF_PREVIEW_TITLE="Prévisualisation"
WF_PREVIEW_DESC="Afficher l'onglet de prévisualisation du contenu de l'éditeur. A noter que le résultat ne correspond pas obligatoirement au frontal du site selon les styles chargés dans l'éditeur."
WF_PRINT_TITLE="Imprimer"
WF_PRINT_DESC="Imprimer le contenu de l'éditeur."
WF_REDO_TITLE="Rétablir"
WF_REDO_DESC="Rétablir l'action annulée."
WF_REMOVEFORMAT_TITLE="Supprimer les styles"
WF_REMOVEFORMAT_DESC="Supprimer les styles formatés de l'élément sélectionné."
WF_JUSTIFYRIGHT_TITLE="Aligné à droite"
WF_JUSTIFYRIGHT_DESC="Aligner l'élément sélectionné à droite"
WF_SEARCHREPLACE_TITLE="Rechercher - Rechercher/Remplacer"
WF_SEARCHREPLACE_DESC="Rechercher ou Rechercher/Remplacer un élément du contenu de l'éditeur."
WF_STRIKETHROUGH_TITLE="Barré"
WF_STRIKETHROUGH_DESC="Appliquer le style barré au texte sélectionné."
WF_STYLE_TITLE="Styles"
WF_STYLE_DESC="Insérer ou modifier les styles de la balise."
WF_STYLESELECT_TITLE="Styles CSS"
WF_STYLESELECT_DESC="Sélectionnez un style à appliquer au texte ou à l'élément sélectionné. Les styles proviennent du fichier CSS par défaut du template ou, du/des fichiers spécifiées dans la configuration ou le profil JCE utilisé."
WF_SUB_TITLE="Indice"
WF_SUB_DESC="Appliquer ou supprimer la balise de style 'Indice' au texte sélectionné. Le texte est réduit de taille et placé légèrement au dessous de la ligne."
WF_SUP_TITLE="Exposant"
WF_SUP_DESC="Appliquer ou supprimer la balise de style 'Exposant' au texte sélectionné. Le texte est réduit de taille et placé légèrement au dessus de la ligne."
WF_TABLE_TITLE="Gestionnaire de tableaux"
WF_TABLE_DESC="Insérer ou modifier un tableau. Les options incluent les outils de gestion des marges et bordures des lignes et colonnes."
WF_TEXTCASE_TITLE="Casse du texte"
WF_TEXTCASE_DESC="Changer la casse du texte sélectionné. Les options incluent : tout mettre en majuscule ou en minuscule, 1ère lettre en majuscule, et 1ère lettre en majuscule des mots composés."
WF_UNDERLINE_TITLE="Souligné"
WF_UNDERLINE_DESC="Appliquer le style souligné à l'élément sélectionné."
WF_UNDO_TITLE="Annuler"
WF_UNDO_DESC="Annuler la dernière action"
WF_UNLINK_TITLE="Supprimer le lien"
WF_UNLINK_DESC="Supprimer le lien de l'élément sélectionné."
WF_VISUALAID_TITLE="Bordures de tableaux visibles"
WF_VISUALAID_DESC="Afficher les lignes, colonnes et bordures invisibles des tableaux."
WF_VISUALCHARS_TITLE="Afficher les espaces insécables"
WF_VISUALCHARS_DESC="Afficher les espaces insécables par un point surélevé."
WF_BLOCKQUOTE_TITLE="Retrait (blockquote)"
WF_BLOCKQUOTE_DESC="Insérer ou supprimer la balise de style Blockquote"
WF_CITE_TITLE="Citation"
WF_Q_TITLE="Citation longue"
WF_ABBR_TITLE="Abréviation"
WF_INS_TITLE="Insertion"
WF_ACRONYM_TITLE="Acronyme"
WF_DEL_TITLE="Suppression"
WF_COLORPICKER_TITLE="Choix de couleur"
WF_VISUALBLOCKS_TITLE="Blocs visuels"
WF_VISUALBLOCKS_DESC="Afficher/Masquer les blocs de contenu de type paragraphe, div, liste (ul, li), titre, etc."
WF_KITCHENSINK_TITLE="Afficher les outils complémentaires"
WF_KITCHENSINK_DESC="Afficher/Masquer les lignes de la barre d'outils inférieures à celle de ce bouton."
WF_LISTS_TITLE="Listes"
WF_LISTS_DESC="Listes numérotées et à puces"
WF_ADVANCED_CHARMAP_TITLE="Caractères spéciaux & Symboles"

WF_FONTCOLOR_TITLE="Couleur de texte"
WF_FONTCOLOR_DESC="Appliquer/Modifier la couleur du texte sélectionné."

;#################### Article Breaks ################################
WF_ARTICLE_PARAM_HIDE_BUTTONS="Masquer les boutons de Joomla!"
WF_ARTICLE_PARAM_HIDE_BUTTONS_DESC="Masquer les boutons *Lire la suite...* et *Saut de page* de Joomla! placés sous l'éditeur"
WF_ARTICLE_PARAM_SHOW_READMORE="Afficher l'icône Lire la suite"
WF_ARTICLE_PARAM_SHOW_READMORE_DESC="Afficher l'icône 'Lire la suite...' dans la barre d'outils de l'éditeur"
WF_ARTICLE_PARAM_SHOW_PAGEBREAK="Afficher l'icône Saut de page"
WF_ARTICLE_PARAM_SHOW_PAGEBREAK_DESC="Afficher l'icône 'Saut de page' dans la barre d'outils de l'éditeur"
WF_ARTICLE_READMORE="Lire la suite"
WF_ARTILCE_PAGEBREAK="Saut de page"

;#################### Autosave ################################
WF_AUTOSAVE_TITLE="Sauvegarde automatique"
WF_AUTOSAVE_DESC="Enregistrer automatiquement l'article actuel à intervalles réguliers."
WF_AUTOSAVE_ASK_BEFORE_UNLOAD="Demander avant de quitter"
WF_AUTOSAVE_ASK_BEFORE_UNLOAD_DESC="Afficher une demande de confirmation avant de fermer l'éditeur ou de quitter la page si des modifications ne sont pas enregistrées."
WF_AUTOSAVE_INTERVAL="Intervalle de sauvegarde (secondes)"
WF_AUTOSAVE_INTERVAL_DESC="Sauvegarde toutes les X secondes. Définissez la valeur sur 0 pour désactiver les sauvegardes automatiques."
WF_AUTOSAVE_RETENTION="Durée de stockage (minutes)"
WF_AUTOSAVE_RETENTION_DESC="Conserver la sauvegarde pendant X minutes. Définir sur 0 pour désactiver les sauvegardes automatiques."

;#################### File Browser ################################n
WF_BROWSER_HELP_ABOUT="Gestionnaire de fichiers"
WF_BROWSER_HELP_INTERFACE="L'interface"
WF_BROWSER_HELP_INSERT="Insertion de fichier"

WF_BROWSER_MEDIAFIELD_OPTIONS="Options du champ média"
WF_BROWSER_MEDIAFIELD_CONVERSION="Activer la conversion"
WF_BROWSER_MEDIAFIELD_CONVERSION_DESC="Convertir le champ média de Joomla en un champ qui prend en charge l'explorateur de fichiers de JCE."
WF_BROWSER_MEDIAFIELD_UPLOAD="Envoi direct"
WF_BROWSER_MEDIAFIELD_UPLOAD_DESC="Autoriser les fonctions d'envoi direct de fichiers par le champ média de JCE, par les champs multimédias convertis à l'aide d'un bouton supplémentaire et par glisser-déposer."

WF_BROWSER_MEDIAFIELD_ENABLE="Activer les champs média JCE"
WF_BROWSER_MEDIAFIELD_ENABLE_DESC="Activer les champs média JCE pour ce profil. Cela inclut les champs média de JCE et de tous les champs média convertis de Joomla."
WF_BROWSER_MEDIAFIELD_SELECT_BUTTON="Bouton de sélection"
WF_BROWSER_MEDIAFIELD_SELECT_BUTTON_DESC="Affichez le bouton 'Sélectionner dans le champ Média JCE' pour sélectionner et gérer les fichiers à l'aide du gestionnaire de fichiers de JCE."

;#################### Autosave ################################
WF_AUTOSAVE_ASK="Confirmer la restauration"
WF_AUTOSAVE_ASK_DESC="Demander une confirmation avant de restaurer une version précédente de l'élément en cours de rédaction"
WF_AUTOSAVE_INTERVAL="Intervalle de sauvegarde"
WF_AUTOSAVE_INTERVAL_DESC="Intervalle en secondes entre deux sauvegardes automatiques"
WF_AUTOSAVE_RETENTION="Durée de conservation"
WF_AUTOSAVE_RETENTION_DESC="Durée en minutes de la conservation des sauvegardes automatiques"
WF_AUTOSAVE_MINLENGTH="Longueur minimum du contenu"
WF_AUTOSAVE_MINLENGTH_DESC="Nombre de caractères minimum en contenu avant d'enclencher les sauvegardes automatiques"

;#################### Link ################################
WF_LINK_JOOMLALINKS_TITLE="Liens Joomla!"
WF_LINK_JOOMLALINKS_DESC="Liens vers des articles ou des menus de Joomla!"
WF_TAB_LINK="Liens"
WF_LINK_PARAM_DEFAULT_TARGET="Cible par défaut"
WF_LINK_PARAM_DEFAULT_TARGET_DESC="Sélectionner la cible par défaut"
WF_LINK_PARAM_FILE_BROWSER="Bouton Gestionnaire de fichiers"
WF_LINK_PARAM_FILE_BROWSER_DESC="Afficher le bouton d'accès au gestionnaire de fichiers à droite du champ de l'URL permettant de faire un lien sur un fichier"
WF_LINK_LINK="Liens"
WF_LINK_LINK_TEXT="Texte"
WF_LINK_LINK_TEXT_DESC="Texte du lien. Si le lien est effectué sur une image ou un autre média, n'indiquez aucun texte."
WF_LABEL_ANCHORS="Ancre"
WF_LABEL_ANCHORS_DESC="Liste des ancres vers lesquels il est possible de faire un lien, disponibles dans l'article courant."
WF_LABEL_LINKBROWSER="Explorateur de liens"
WF_LABEL_EMAIL="E-Mail"
WF_LABEL_HREFLANG="Code langue de la cible"
WF_LABEL_HREFLANG_DESC="Code de langue de l'URL cible"
WF_LABEL_MIME_TYPE="Type MIME de la cible"
WF_LABEL_MIME_TYPE_DESC="Type MIME (Multipurpose Internet Mail Extensions) de la cible du lien. Exemple&nbsp;: text/html"
WF_LABEL_CHARSET="Encodage des caractères"
WF_LABEL_CHARSET_DESC="Encodage des caractères de l'URL cible. Exemple&nbsp;: utf-8"
WF_LABEL_REL="Relation Contenu - Cible"
WF_LABEL_REL_DESC="Relation entre la page actuelle et l'url cible"
WF_LABEL_REV="Relation Cible - Contenu"
WF_LABEL_REV_DESC="Relation de l'url cible et de la page actuelle"
WF_LINK_HELP_ABOUT="La gestion des liens"
WF_LINK_HELP_INTERFACE="A propos de l'interface"
WF_LINK_HELP_LINKS="Le gestionnaire de liens"
WF_LINK_HELP_INSERT="Insérer/Modifier un lien"
WF_LINK_HELP_EVENTS="Onglet Événement"
WF_LINK_HELP_ADVANCED="Onglet Avancé"
WF_LINK_HELP_EMAIL="Créer une adresse e-mail"
WF_LINK_HELP_POPUP="Créer un Popup"
WF_LINK_PARAM_TAB_ADVANCED="Afficher l'onglet 'Avancé'"
WF_LINK_PARAM_TAB_ADVANCED_DESC="Afficher l'onglet 'Avancé' permettant d'ajouter des paramètres spécifiques au lien"
WF_LINK_SHOW_ANCHOR="Afficher la liste des ancres"
WF_LINK_SHOW_ANCHOR_DESC="Afficher la liste des ancres dans la fenêtre du lien d'ancre"
WF_LINK_SHOW_TARGET="Afficher les cibles"
WF_LINK_SHOW_TARGET_DESC="Afficher la liste des cibles dans la fenêtre de lien"
WF_LINK_AUTOLINK_EMAIL="Lien e-mail automatique"
WF_LINK_AUTOLINK_EMAIL_DESC="Créer le lien vers l'e-mail automatiquement lors de son insertion dans le champ de l'éditeur."
WF_LINK_AUTOLINK_URL="Lien URL automatique"
WF_LINK_AUTOLINK_URL_DESC="Créer le lien vers l'URL automatiquement lors de son insertion dans le champ de l'éditeur."

WF_ELEMENT_SELECTION="Sélection mixte/élément"

WF_LINK_QUICKLINK="Lien rapide"
WF_LINK_QUICKLINK_DESC="Activer ou désactiver le menu déroulant 'Lien rapide' sur le bouton 'Insérer/Modifier un lien'."

WF_LINK_SHOW_TITLE="Afficher le titre"
WF_LINK_SHOW_TITLE_DESC="Afficher le champ 'Titre' dans la boîte de dialogue 'Insérer/Modifier un lien'."
WF_LINK_SHOW_CLASSES="Afficher la liste des classes"
WF_LINK_SHOW_CLASSES_DESC="Afficher la liste des classes dans la boîte de dialogue Lien."

;#################### Tables ################################
WF_TABLES_TABLE_TITLE="Ajouter/Modifier un tableau"
WF_TABLES_ROW_TITLE="Modifier une ligne"
WF_TABLES_CELL_TITLE="Modifier une cellule"
WF_TABLES_MERGE_TITLE="Marge de cellule"
WF_TAB_MERGE="Marge"
;#################### Help ################################
WF_EDITOR_HELP_ABOUT="A propos de l'éditeur"
WF_EDITOR_HELP_TOOLBAR="Barre d'outils"
WF_EDITOR_HELP_CONTENT="Champ de contenu"
WF_EDITOR_HELP_PATH="Chemin des éléments"
WF_EDITOR_HELP_BUTTONS="Icônes de l'éditeur"
WF_EDITOR_HELP_LICENCE="Licence"
WF_EDITOR_HELP_ACKNOWLEDGEMENTS="Remerciements"
WF_EDITOR_HELP_PLUGINS="Plugins"
WF_EDITOR_HELP_BASICS="Bases de rédaction"
WF_EDITOR_HELP_SELECTION="Sélection"
WF_EDITOR_HELP_FORMAT="Formatage"
WF_EDITOR_HELP_FORMAT_BOLD="Gras, italique, souligné et barré"
WF_EDITOR_HELP_FORMAT_BLOCKS="En-têtes, blocs et retraits (blockquote)"
WF_EDITOR_HELP_FORMAT_SUB="Indice et exposant"
WF_EDITOR_HELP_FORMAT_FONT="Styles de polices"
WF_EDITOR_HELP_FORMAT_ALIGN="Alignement"
WF_EDITOR_HELP_FORMAT_INDENT="Augmenter/Diminuer le retrait"
WF_EDITOR_HELP_FORMAT_ATTRIBUTES="Attributs d'élément"
WF_EDITOR_HELP_LISTS="Création de liste"
WF_EDITOR_HELP_READMORE="Lire la suite et Saut de page"
WF_EDITOR_HELP_LINKS="Créer/Modifier un lien"
WF_EDITOR_HELP_IMAGES="Insérer des images"
WF_EDITOR_HELP_TABLES="Insérer des tableaux"
WF_EDITOR_HELP_PASTE="Couper, copier, coller"
WF_EDITOR_HELP_SPELLCHECKER="Vérificateur orthographique"

;#################### Image Manager ################################
WF_IMGMANAGER_HIDE_BUTTONS="Bouton Image de Joomla!"
WF_IMGMANAGER_HIDE_BUTTONS_DESC="Masquer le bouton Image de Joomla!"
WF_IMGMANAGER_HELP="Aide du gestionnaire d'image"
WF_IMGMANAGER_HELP_ABOUT="A propos du gestionnaire d'images"
WF_IMGMANAGER_HELP_INTERFACE="L'interface"
WF_IMGMANAGER_HELP_ROLLOVER="Images rollover"
WF_IMGMANAGER_HELP_ADVANCED="Onglet avancé"
WF_IMGMANAGER_HELP_INSERT="Insérer/Modifier"
WF_LABEL_MOUSEOVER="Mouseover (survol de l'image)"
WF_LABEL_MOUSEOVER_DESC="Image de remplacement affichée lors du survol de l'image par le curseur."
WF_LABEL_MOUSEOUT="Mouseout (sortie du survol)"
WF_LABEL_MOUSEOUT_DESC="Image de base affichée lorsque le curseur n'est pas au-dessus de l'image."
WF_LABEL_ROLLOVER_ENABLE_DESC="Cliquez pour activer la fonction de changement d'image au survol (rollover)."
WF_LABEL_ROLLOVER_IMAGE="Image Rollover "
WF_LABEL_USEMAP="Image Map"
WF_LABEL_USEMAP_DESC="Id d'image map (zone de lien sur l'image). Exemple&nbsp;: #map1"
WF_TAB_IMAGE="Image"
WF_TAB_ROLLOVER="Rollover"
WF_IMGMANAGER_SHOW_DIMENSIONS="Options de taille"
WF_IMGMANAGER_SHOW_DIMENSIONS_DESC="Afficher les options de taille (largeur et hauteur)."
WF_IMGMANAGER_SHOW_ALIGN="Options d'alignement"
WF_IMGMANAGER_SHOW_ALIGN_DESC="Afficher les options d'alignement."
WF_IMGMANAGER_SHOW_MARGIN="Options de marge"
WF_IMGMANAGER_SHOW_MARGIN_DESC="Afficher les options de marge (épaisseur, style, couleur)."
WF_IMGMANAGER_SHOW_BORDER="Options de bordure"
WF_IMGMANAGER_SHOW_BORDER_DESC="Afficher les options de bordure (haut, droite, bas, gauche)."
WF_IMGMANAGER_SHOW_CLASSES="Afficher la liste des classes"
WF_IMGMANAGER_SHOW_CLASSES_DESC="L'utilisateur peut voir et définir les classes des images dans l'onglet Avancé ou la boîte de dialogue de base."
WF_IMGMANAGER_PARAM_TAB_ROLLOVER="Onglet Rollover"
WF_IMGMANAGER_PARAM_TAB_ROLLOVER_DESC="Afficher l'onglet Rollover et ses paramètres pour créer un effet d'image permutée lors de son survol par le curseur"
WF_IMGMANAGER_PARAM_TAB_ADVANCED="Onglet Avancé"
WF_IMGMANAGER_PARAM_TAB_ADVANCED_DESC="Afficher l'onglet Avancé et ses paramètres pour appliquer des spécificités à l'image"
WF_IMGMANAGER_PARAM_ALWAYS_INCLUDE_DIMENSIONS="Toujours inclure les dimensions"
WF_IMGMANAGER_PARAM_ALWAYS_INCLUDE_DIMENSIONS_DESC="Si oui, les dimensions des images seront toujours incluses lors de leur insertion dans les contenus.<br />Si non, les dimensions ne seront incluses que si vous les modifiez. Oui par défaut."

;#################### Media Support ################################
WF_MEDIA_PARAM_IFRAMES="Autoriser les balises iframes"
WF_MEDIA_PARAM_IFRAMES_DESC="Autoriser l'inclusion d'iFrame.<ul><li><strong>Oui</strong> autorise l'inclusion d'iFrame quel que soit la provenance des contenus.</li><li><strong>Contenu local uniquement</strong> autorise uniquement l'inclusion d'iFrame avec des contenus provenant de ce site.</li><li><strong>Contenu local et médias pris en charge</strong> autorise uniquement le chargement d'iFrame avec des contenus provenant de ce site et de Youtube, Vimeo, Dailymotion, Scribd, Soundcloud, Slideshare, Spotify, Twitch, Ted et Calendly.</li></ul>"
WF_MEDIA_PARAM_IFRAMES_LOCAL="Contenu local uniquement"
WF_MEDIA_PARAM_IFRAMES_SUPPORTED_MEDIA="Contenu local et médias pris en charge"
WF_MEDIA_PARAM_VIDEO="Autoriser les balises vidéos"
WF_MEDIA_PARAM_VIDEO_DESC="Autoriser l'utilisation des balises vidéo dans les contenus."
WF_MEDIA_PARAM_AUDIO="Autoriser les balises audio"
WF_MEDIA_PARAM_AUDIO_DESC="Autoriser l'utilisation des balises audio dans les contenus."
WF_MEDIA_PARAM_OBJECT="Autoriser les balises OBJECT"
WF_MEDIA_PARAM_OBJECT_DESC="Autoriser l'utilisation des balises OBJECT dans les contenus. Cette fonction est nécessaire pour intégrer des fichiers PDF et certains formats hérités tel Adobe Flash Player®"
WF_MEDIA_PARAM_EMBED="Autoriser les balises EMBED"
WF_MEDIA_PARAM_EMBED_DESC="Autoriser l'utilisation des balises EMBED dans les contenus. Cette fonction est nécessaire pour intégrer certains formats hérités tel Adobe Flash Player®"

WF_MEDIA_PARAM_MEDIA_PREVIEW="Prévisualisation médias"
WF_MEDIA_PARAM_MEDIA_PREVIEW_DESC="Afficher un aperçu dans l'éditeur des médias en iFrame tels Youtube, Vimeo, etc. au lieu d'un espace média réservé."

WF_MEDIA_IFRAMES_SUPPORTED_MEDIA="Médias pris en charge"
WF_MEDIA_IFRAMES_SUPPORTED_MEDIA_DESC="Sélectionnez les fournisseurs de médias à autoriser et/ou, ajoutez des valeurs d'URL personnalisées pour valider les données saisies par l'utilisateur."

WF_MEDIA_PARAM_LOCAL_ONLY="Contenu local uniquement"

WF_MEDIA_IFRAMES_SANDBOX="Sandbox Iframes"
WF_MEDIA_IFRAMES_SANDBOX_DESC="Activer l'attribut sandbox sur les iframes pour restreindre le contenu à l'intérieur de l'iframe."
WF_MEDIA_IFRAMES_SANDBOX_EXCLUSIONS="Sandbox URL Exclusions"
WF_MEDIA_IFRAMES_SANDBOX_EXCLUSIONS_DESC="Modèles d'URL à exclure de l'attribut sandbox, par exemple : https://www.joomla.org"

WF_MEDIA_STRICT_MEDIA_EMBEDS="Intégration stricte des médias"
WF_MEDIA_STRICT_MEDIA_EMBEDS_DESC="Intégrer les médias en utilisant la balise par défaut pour leur type mime, par exemple :  &lt;video&gt; pour les fichiers vidéo, &lt;audio&gt; pour les fichiers audio, &lt;iframe&gt; pour Youtube, etc."

;#################### Paste ################################
WF_PASTE_PARAM_CLASSES="Nettoyage des styles Word"
WF_PASTE_PARAM_CLASSES_DESC="Supprimer les attributs de classe lors d'insertion de contenu provenant de Word. Note : indépendamment de ce paramètre, les classes 'mso' de Word sont toujours supprimées."
WF_OPTION_PASTE_CLASSES_WORD_ONLY="Uniquement de Word/Office"
WF_PASTE_PARAM_LISTED="En liste"
WF_PASTE_PARAM_SPANS="Supprimer les balises SPAN"
WF_PASTE_PARAM_SPANS_DESC="Supprimer toutes les balises SPAN du contenu"
WF_PASTE_PARAM_STYLES="Supprimer tous les styles"
WF_PASTE_PARAM_STYLES_DESC="Supprimer tous les styles du contenu"
WF_PASTE_PARAM_RETAIN_STYLES="Styles à garder"
WF_PASTE_PARAM_RETAIN_STYLES_DESC="Liste des styles, séparés par une virgule, à conserver si la fonction *Nettoyer les styles* est activée.<br />Si vide, tous les styles seront conservés.<br />Exemple: font-size,font-family,color."
WF_PASTE_PARAM_REMOVE_STYLES="Styles à supprimer"
WF_PASTE_PARAM_REMOVE_STYLES_DESC="Liste de propriétés de style, séparées par des virgules, à <strong>supprimer</strong> lors du 'collé' si le paramètre 'Supprimer tous les styles' est sur 'Non'.<br />Example: font-size,font-family,color."

WF_PASTE_PARAM_REMOVE_STYLES_WEBKIT="Supprimer les styles Webkit"
WF_PASTE_PARAM_REMOVE_STYLES_WEBKIT_DESC="Activer cette fonction pour supprimer toutes les informations de style Webkit en cas de bug dû au code. "
WF_PASTE_PARAM_WIDTH="Largeur de la fenêtre"
WF_PASTE_PARAM_WIDTH_DESC="Largeur en pixels (px) de la fenêtre permettant de coller le contenu"
WF_PASTE_PARAM_HEIGHT="Hauteur de la fenêtre"
WF_PASTE_PARAM_HEIGHT_DESC="Hauteur en pixels (px) de la fenêtre permettant de coller le contenu"
WF_PASTE_PARAM_REMOVE_PARAGRAPHS="Supprimer les paragraphes vides"
WF_PASTE_PARAM_REMOVE_PARAGRAPHS_DESC="Activer la suppression des paragraphes vides ou, leur conversion en saut de ligne si le paramètre *Saut de ligne* est activé pour les nouvelles lignes dans la configuration globale"
WF_PASTE_PARAM_PASTE_TEXT="Coller du texte brut"
WF_PASTE_PARAM_PASTE_TEXT_DESC="Autoriser les utilisateurs à coller du contenu en texte brut (dépouillé de html)"
WF_PASTE_PARAM_PASTE_HTML="Coller du texte HTML"
WF_PASTE_PARAM_PASTE_HTML_DESC="Autoriser les utilisateurs à coller du contenu en conservant les valeurs HTML.<br />Les attributs spécifiques à Word seront automatiquement supprimés selon les paramètres définis plus haut"
WF_PASTE_PARAM_DIALOG="Fenêtre coller"
WF_PASTE_PARAM_DIALOG_DESC="Afficher systématiquement une fenêtre pour coller le contenu, hormis avec la combinaison clavier CTRL+V (nécessaire pour Firefox qui interdit la fonction coller normal)"
WF_PASTE_FORCE_CLEANUP="Nettoyage du code de Microsoft"
WF_PASTE_FORCE_CLEANUP_DESC="Activer la conversion/suppression du code non compatible provenant d'applications de Microsoft® (Word, Excel, Powerpoint) ou OpenOffice.org"
WF_PASTE_FORCE_CLEANUP_DETECT="Seulement s'il est détecté"
WF_PASTE_FORCE_CLEANUP_ALWAYS="Toujours"
WF_PASTE_HELP_ABOUT="Fonctions couper/copier/coller"
WF_PASTE_PARAM_ATTRIBUTES="Supprimer les attributs"
WF_PASTE_PARAM_ATTRIBUTES_DESC="Liste des attributs à supprimer du code. Exemple : lang,align"
WF_PASTE_PARAM_REMOVE_TAGS="Supprimer les tags"
WF_PASTE_PARAM_REMOVE_TAGS_DESC="Liste des balises à supprimer, séparées par des virgules. Ex : img, object, iframe"
WF_PASTE_PARAM_KEEP_TAGS="Conserver les clés de balise"
WF_PASTE_PARAM_KEEP_TAGS_DESC="Liste des clés de balise à conserver, séparées par une virgule. Ex : img,strong,em"
WF_PASTE_PARAM_PROCESS_FOOTNOTES="Traitement du pied de page"
WF_PASTE_PARAM_PROCESS_FOOTNOTES_DESC="Convertir ou supprimer les liens des contenus de pied de page issus des documents Office.<ul><li>Convertir - Convertit les liens en ancres valides</li><li>Supprimer les liens - Supprime les liens mais pas le texte.</li><li>Tout supprimer - Supprime tout le contenu.</li></ul>"
WF_PASTE_PARAM_PROCESS_FOOTNOTES_CONVERT="Convertir"
WF_PASTE_PARAM_PROCESS_FOOTNOTES_UNLINK="Supprimer le lien"
WF_PASTE_PARAM_PROCESS_FOOTNOTES_REMOVE="Supprimer"
WF_PASTE_PARAM_UPLOAD_IMAGES="Traitement des images"
WF_PASTE_PARAM_UPLOAD_IMAGES_DESC="Convertir les images de contenus collés en espaces réservés à partir desquels une image peut être sélectionnée et téléchargée. Si cette option est désactivée, les images seront supprimées des contenus collés."
WF_PASTE_PARAM_FILTER="Supprimer par expression"
WF_PASTE_PARAM_FILTER_DESC="Supprimer des éléments du contenu par expression régulière. Exemple :  /joomla/gi va supprimer toutes les occurrences du mot 'joomla' et 'Joomla'. Plusieurs expressions peuvent être indiquées, séparées par un point-virgule."
WF_PASTE_PARAM_ALLOW_EVENT_ATTRIBUTES="Autoriser les attributs d'événement"
WF_PASTE_PARAM_ALLOW_EVENT_ATTRIBUTES_DESC="Conserver les attributs d'événement tels onclick, onload, etc. lors du collage du contenu à partir de sources externes telles que des pages web. Les attributs d'événement sont supprimés par défaut car ils peuvent poser un risque pour la sécurité."

WF_PASTE_CLEANUP_MODE="Mode nettoyage"
WF_PASTE_CLEANUP_MODE_DESC="Sélectionnez le niveau de nettoyage à appliquer au contenu collé.<ul><li><strong>Nettoyage HTML</strong> - Par défaut. Supprimez tous les styles, classes et codes HTML superflus pour produire un contenu HTML propre. Idéal pour coller à partir de documents Office (Word, Excel, etc.)</li><li><strong>Garder les classes</strong> - Comme avec 'Nettoyage HTML' mais conserve les attributs de classe.</li><li><strong>Garder les styles</strong> - Comme pour 'Garder les classes', mais conserve également les attributs de style (des contenus Word/Office uniquement)</li><li><strong>Personnalisé</strong> - Utilisez les paramètres de nettoyage personnalisés ci-dessous.</li></ul>"
WF_PASTE_CLEANUP_MODE_CLEAN_HTML="Nettoyage HTML"
WF_PASTE_CLEANUP_MODE_KEEP_CLASSES="Garder les classes"
WF_PASTE_CLEANUP_MODE_KEEP_STYLES="Garder les styles"
WF_PASTE_CLEANUP_MODE_CUSTOM="Personnalisé"

;#################### Spellchecker ################################
WF_SPELLCHECKER_PARAM_ENGINE="Moteur de vérification"
WF_SPELLCHECKER_PARAM_ENGINE_DESC="Sélectionnez le moteur utilisé pour la vérification orthographique"
WF_SPELLCHECKER_PARAM_BROWSER="Navigateur web"
WF_SPELLCHECKER_PARAM_ENCHANT="EnchantSpell"
WF_SPELLCHECKER_PARAM_PSPELL_PHP="PHP PSpell"
WF_SPELLCHECKER_PARAM_PSPELL_CLINE="Ligne de commande PSpell"
WF_SPELLCHECKER_PARAM_LANGUAGES="Langues"
WF_SPELLCHECKER_PARAM_LANGUAGES_DESC="Langues disponible dans la liste du vérificateur orthographique<br />Exemple : French=fr,English=en,Deutsch=de"
WF_SPELLCHECKER_PARAM_PSPELL_MODE="Mode PSpell"
WF_SPELLCHECKER_PARAM_PSPELL_MODE_DESC="Paramètre spécifique de PSpell pour varier les modes utilisés en fonction des performances serveur"
WF_SPELLCHECKER_PARAM_PSPELL_SPELLING="Paramètre PSPELL Spelling"
WF_SPELLCHECKER_PARAM_PSPELL_SPELLING_DESC="Paramètre spécifique de PSpell pour le contrôle de l'orthographe (utilisateurs avancés)"
WF_SPELLCHECKER_PARAM_PSPELL_JARGON="Jargon PSpell"
WF_SPELLCHECKER_PARAM_PSPELL_JARGON_DESC="Ce réglage PSpell spécifique permet de contrôler les paramètres du jargon vérifié (utilisateurs avancés)"
WF_SPELLCHECKER_PARAM_PSPELL_ENCODING="Encodage PSpell"
WF_SPELLCHECKER_PARAM_PSPELL_ENCODING_DESC="Ce réglage PSpell spécifique permet de contrôler les paramètres d'encodage des caractères spéciaux (utilisateurs avancés)"
WF_SPELLCHECKER_PARAM_PSPELLSHELL="Localisation PSpell"
WF_SPELLCHECKER_PARAM_PSPELLSHELL_DESC="Localisation du fichier exécutable de PSpell. Ce champ ne doit être spécifié que si l'utilisation de PSpell est activée"
WF_SPELLCHECKER_PARAM_PSPELLSHELL_TMP="Répertoire 'tmp'"
WF_SPELLCHECKER_PARAM_PSPELLSHELL_TMP_DESC="Localisation du répertoire temporaire pour l'écriture"
WF_SPELLCHECKER_PARAM_PSPELL_DICTIONARY="Dictionnaire PSpell"
WF_SPELLCHECKER_PARAM_PSPELL_DICTIONARY_DESC="Chemin relatif du dictionnaire PSPell"
WF_SPELLCHECKER_BROWSER_STATE_DESC="Activez le correcteur orthographique par défaut du navigateur"
WF_SPELLCHECKER_SUGGESTIONS="Afficher les suggestions"
WF_SPELLCHECKER_SUGGESTIONS_DESC="Afficher par un clic droit (en menu contextuel) une liste de suggestions des mots mal orthographiés. Si 'Non', les mots mal orthographiés seront toujours indiqués dans la zone de contenu de l'éditeur, mais le clic droit affichera le menu contextuel habituel de l'éditeur."

;#################### Tables ############################################
WF_TABLES_TITLE="Tableau"
WF_TABLES_HELP_EDIT="Ajouter/Modifier un tableau"
WF_TABLES_HELP_DELETE="Supprimer un tableau"
WF_TABLES_HELP_ROWS="Ajouter/Modifier des lignes"
WF_TABLES_HELP_CELLS="Ajouter/Modifier des cellules"
WF_TABLES_PARAM_WIDTH="Largeur"
WF_TABLES_PARAM_WIDTH_DESC="Largeur par défaut, en pixels ou pourcent ; exemple 100% ou 100px"
WF_TABLES_PARAM_HEIGHT="Hauteur"
WF_TABLES_PARAM_HEIGHT_DESC="Hauteur par défaut, en pixels ou pourcent ; exemple 100% ou 100px"
WF_TABLES_PARAM_BORDER="Bordure"
WF_TABLES_PARAM_BORDER_DESC="Épaisseur par défaut de la bordure"
WF_TABLES_PARAM_COLS="Colonnes"
WF_TABLES_PARAM_COLS_DESC="Nombre de colonnes par défaut"
WF_TABLES_PARAM_ROWS="Lignes"
WF_TABLES_PARAM_ROWS_DESC="Nombre de lignes par défaut"
WF_TABLES_PARAM_CELLPADDING="Marges intérieures"
WF_TABLES_PARAM_CELLPADDING_DESC="Marges intérieures appliquées par défaut aux cellules"
WF_TABLES_PARAM_CELLSPACING="Espacement de cellules"
WF_TABLES_PARAM_CELLSPACING_DESC="Espacement des cellules (marges extérieures) par défaut."

;#################### Style ############################################
WF_TAB_TEXT="Texte"
WF_TAB_BACKGROUND="Fond"
WF_TAB_BOX="Boîte"
WF_TAB_LIST="Liste"
WF_TAB_BLOCK="Bloc"
WF_TAB_BORDER="Bordure"
WF_TAB_POSITIONING="Position"

;#################### XHTMLXtras  #####################################
WF_TAB_STANDARD="Standard"
WF_TAB_EVENTS="Évènements"
WF_LABEL_DRAGGABLE="Glisser/Déplacer"
WF_LABEL_CONTENTEDITBALE="Modifiable"
WF_LABEL_HIDDEN="Masqué"
WF_LABEL_SPELLCHECK="Vérification orthographique"
WF_LABEL_OTHER="Autre"

;#################### Lists  #####################################
WF_LISTS_LOWER_ALPHA="Alphabet en minuscule"
WF_LISTS_LOWER_GREEK="Alphabet grec"
WF_LISTS_LOWER_ROMAN="Chiffre romain en minucule"
WF_LISTS_UPPER_ALPHA="Alphabet en majuscule"
WF_LISTS_UPPER_ROMAN="Chiffre romain en majuscule"
WF_LISTS_CIRCLE="Cercle"
WF_LISTS_DISC="Disque"
WF_LISTS_SQUARE="Carré"
WF_LISTS_STYLES="Styles des listes"
WF_LISTS_STYLES_DESC="Sélectionner les styles disponibles pour les listes"
WF_LISTS_CUSTOM_CLASSES="Classes personnalisées"
WF_LISTS_CUSTOM_CLASSES_DESC="Noms de classes à utiliser pour styliser les listes à la place des classes extraites des feuilles de style du site. Les classes listées doivent également être définies dans les feuilles de style du template."

WF_NUMLIST_STYLES="Listes chronologiques"
WF_BULLIST_STYLES="Listes à puces"
WF_BULLIST_STYLES_DESC="Listes à puces proposées lors du clic sur l'icône de la barre d'outils.<br />Glissez-déplacez les éléments pour les réordonner, le premier de la liste sera celui utilisé par défaut."
WF_NUMLIST_STYLES_DESC="Listes chronologiques proposées lors du clic sur l'icône de la barre d'outils.<br />Glissez-déplacez les éléments pour les réordonner, le premier de la liste sera celui utilisé par défaut."

;#################### Manager Parameters ################################
WF_PARAM_DIRECTORY="Chemin du répertoire principal"
WF_PARAM_DIRECTORY_DESC="<p>Chemin relatif du répertoire principal accessible depuis le gestionnaire de fichiers de JCE. Si laissé vide, la première valeur configurée est utilisée (ou <em>images</em> si aucune n'est définie).<br />Les chemins sont relatifs à la racine du site et doivent commencer par un dossier statique existant (par exemple images/$username, et non $username/...).<br />Si aucune label n'est défini, le dernier segment du chemin est utilisé comme label, par exemple : images/files&nbsp;→ Files<br/>Les entrées peuvent être <strong>réorganisées par glisser-déposer</strong> ; la <strong>première</strong> entrée est utilisée par défaut et dans les contextes à chemin unique.<br />Le chemin peut contenir les variables suivantes : <ul><li>$id - sera remplacé par l'ID de l'utilisateur</li><li>$username - sera remplacé par l'identifiant</li><li>$usertype ou $usergroup - sera remplacé par le type d'utilisateur Joomla, exemple 'Auteur'</li><li>$profile ou $group - sera remplacé par le nom du profil JCE</li><li>$context - sera remplacé par la valeur de l'option du composant, par exemple : com_content</li><li>$year - sera remplacé par la date de l'année courante, exemple : 2025</li><li>$month - sera remplacé par la valeur numérique du mois courant, exemple 06</li><li>$day - sera remplacé par la valeur numérique du jour courant, exemple 10</li><li>$hour - sera remplacé par la valeur numérique de l'heure courante, exemple 23</li></ul><p>Consultez le guide complet : <a href='https://www.joomlacontenteditor.net/support/tutorials/editor/setting-the-file-directory-path' target='_blank' rel='noopener'>Configuration du chemin d'accès au répertoire de fichiers</a></p>"
WF_PARAM_DIRECTORY_PATH="Chemin d'accès"
WF_PARAM_DIRECTORY_LABEL="Label"

WF_PARAM_DIRECTORY_FILTER="Filtre de répertoire"
WF_PARAM_DIRECTORY_FILTER_DESC="Indiquez les répertoires ne devant pas être accessibles ou, ajouter le signe + devant les seuls répertoires devant être accessibles.<br />Exemple: images/fichiers supprime l'accès au dossier images/fichiers et +images/fichiers n'autorise l'accès <strong>qu'à ce dossier</strong>. <strong>Note :</strong> Il ne s'agit pas d'une fonction de sécurité et elle ne doit pas être utilisée comme telle."
WF_PARAM_ALLOW_ROOT="Autoriser l'accès à la racine"
WF_PARAM_ALLOW_ROOT_DESC="Autoriser l'accès au répertoire racine de Joomla. <strong>Attention, ceci n'est pas recommandé pour des raisons de sécurité.</strong> Si le paramètre est sur <i>'Non'</i>, le répertoire par défaut est <i>'images'</i>.  Si le paramètre est sur <i>'Oui'</i>, vous pouvez choisir les répertoires système de Joomla devant rester invisibles et verrouillés."
WF_PARAM_DIRECTORY_RESTRICTED="Répertoires restreints"
WF_PARAM_DIRECTORY_RESTRICTED_DESC="Liste des répertoires qui ne seront ni affichés ni accessibles si le paramètre '<strong>Autoriser l'accès à la racine</strong>' ci-dessus est réglé sur '<strong>Oui</strong>'. Par défaut tout les répertoires '<strong>système</strong>' de Joomla sont sélectionnés."
WF_PARAM_DIRECTORY_CREATE="Créer les répertoires automatiquement"
WF_PARAM_DIRECTORY_CREATE_DESC="Créer le répertoire automatiquement lors de son premier accès s'il n'existe pas."
WF_PARAM_UPLOAD_SIZE="Taille maximale d'envoi"
WF_PARAM_UPLOAD_SIZE_DESC="Taille maximale en kilobyte autorisée par fichier pour l'envoi sur le serveur ; ne peut pas être supérieur au maximum autorisé par le serveur (réglage par défaut : 1024 KB)."
WF_PARAM_VIEWABLE="Liste des fichiers visibles"
WF_PARAM_VIEWABLE_DESC="Liste des fichiers autorisés à être affiché en prévisualisation dans une fenêtre popup."
WF_PARAM_UPLOAD="Envoi sur le serveur"
WF_PARAM_UPLOAD_DESC="Autoriser l'utilisateur à envoyer des fichiers."
WF_PARAM_FOLDER_CREATE="Créer des dossiers"
WF_PARAM_FOLDER_CREATE_DESC="Autoriser l'utilisateur à créer des dossiers."
WF_PARAM_FOLDER_DELETE="Supprimer des dossiers"
WF_PARAM_FOLDER_DELETE_DESC="Autoriser l'utilisateur à supprimer des dossiers."
WF_PARAM_FOLDER_RENAME="Renommer des dossiers"
WF_PARAM_FOLDER_RENAME_DESC="Autoriser l'utilisateur à renommer des fichiers."
WF_PARAM_FILE_DELETE="Supprimer des fichiers"
WF_PARAM_FILE_DELETE_DESC="Autoriser l'utilisateur à supprimer des fichiers."
WF_PARAM_FILE_RENAME="Renommer des fichiers"
WF_PARAM_FILE_RENAME_DESC="Autoriser l'utilisateur à renommer des fichiers."
WF_PARAM_FILE_PASTE="Copier/couper/coller des fichiers"
WF_PARAM_FILE_PASTE_DESC="Autoriser l'utilisateur à copier/couper/coller des fichiers."
WF_PARAM_FILESYSTEM="Fichier système"
WF_PARAM_FILESYSTEM_DESC="Fichier système à utiliser pour le gestionnaire de fichiers."
NOT_SET="-- Non défini --"
WF_PARAM_NOT_SET="-- Non défini --"
WF_PARAM_FOLDER_PASTE="Copier/couper/coller des dossiers"
WF_PARAM_FOLDER_PASTE_DESC="Autoriser l'utilisateur à copier/couper/coller des dossiers."

WF_PARAM_HELP_BUTTON="Bouton d'aide"
WF_PARAM_HELP_BUTTON_DESC="Afficher le bouton d'aide dans la barre d'outils du gestionnaire de fichiers."

;#################### Margin ################################
WF_PARAM_MARGIN_TOP="Marge Haut"
WF_PARAM_MARGIN_TOP_DESC="Valeur en pixels (px) de la marge du haut par défaut."
WF_PARAM_MARGIN_BOTTOM="Marge Bas"
WF_PARAM_MARGIN_BOTTOM_DESC="Valeur en pixels (px) de la marge du bas par défaut."
WF_PARAM_MARGIN_LEFT="Marge Gauche"
WF_PARAM_MARGIN_LEFT_DESC="Valeur en pixels (px) de la marge de gauche par défaut."
WF_PARAM_MARGIN_RIGHT="Marge Droite"
WF_PARAM_MARGIN_RIGHT_DESC="Valeur en pixels (px) de la marge de droite par défaut."
WF_LABEL_MARGIN="Marges extérieures"
WF_LABEL_MARGIN_DESC="Marges extérieures autour du bloc de l'élément, en pixels."

;#################### Border ################################
WF_PARAM_BORDER_ENABLE="Bordure activée"
WF_PARAM_BORDER_ENABLE_DESC="Bordure activée par défaut."
WF_PARAM_BORDER_WIDTH="Épaisseur de bordure"
WF_PARAM_BORDER_WIDTH_DESC="Épaisseur de bordure par défaut en pixels (px)."
WF_PARAM_BORDER_STYLE="Style de bordure"
WF_PARAM_BORDER_STYLE_DESC="Style de bordure par défaut."
WF_PARAM_BORDER_COLOR="Couleur de bordure"
WF_PARAM_BORDER_COLOR_DESC="Couleur de bordure par défaut."
WF_PARAM_BORDER_THICK="Épais"
WF_PARAM_BORDER_THIN="Fin"
WF_PARAM_BORDER_MEDIUM="Moyen"
WF_LABEL_BORDER="Bordure"
WF_LABEL_BORDER_DESC="Bordure affichée autour de l'élément selon les paramètres sélectionnés."
WF_OPTION_BORDER_THIN="Fin"
WF_OPTION_BORDER_THICK="Épais"
WF_OPTION_BORDER_MEDIUM="Moyen"
WF_OPTION_BORDER_NONE="Aucun"
WF_OPTION_BORDER_SOLID="Solide"
WF_OPTION_BORDER_DASHED="Tirets"
WF_OPTION_BORDER_DOTTED="Pointillés"
WF_OPTION_BORDER_DOUBLE="Double"
WF_OPTION_BORDER_GROOVE="Rainure"
WF_OPTION_BORDER_INSET="Intérieur"
WF_OPTION_BORDER_OUTSET="Extérieur"
WF_OPTION_BORDER_RIDGE="Strié"
WF_LABEL_BORDER_ENABLE="Bordure active"
WF_LABEL_BORDER_ENABLE_DESC="Bordure active par défaut."
WF_LABEL_BORDER_WIDTH_DESC="Épaisseur de bordure en pixels ou nommée."
WF_LABEL_BORDER_STYLE_DESC="Style de la bordure."
WF_LABEL_BORDER_COLOR_DESC="Couleur hexadécimale de la bordure."

;#################### Align ################################
WF_PARAM_ALIGN_DEFAULT="Alignement"
WF_PARAM_ALIGN_DEFAULT_DESC="Alignement par défaut"
WF_LABEL_ALIGN="Alignement"
WF_OPTION_ALIGN_DEFAULT="--Non défini--"
WF_OPTION_ALIGN_BASELINE="Ligne de base"
WF_OPTION_ALIGN_TOP="Haut"
WF_OPTION_ALIGN_MIDDLE="Milieu"
WF_OPTION_ALIGN_BOTTOM="Bas"
WF_OPTION_ALIGN_TEXTTOP="Haut du texte"
WF_OPTION_ALIGN_ABSMIDDLE="Milieu absolu"
WF_OPTION_ALIGN_ABSBOTTOM="Bas absolu"
WF_OPTION_ALIGN_LEFT="Gauche"
WF_OPTION_ALIGN_RIGHT="Droite"
WF_OPTION_ALIGN_CENTER="Centré"
WF_OPTION_ALIGN_JUSTIFIED="Justifié"
WF_LABEL_ALIGN_DESC="Alignement de l'élément dans le contenu."

;#################### Admin Labels ################################
WF_LABEL_FILTER="Filtre"
WF_LABEL_GO="Appliquer"
WF_LABEL_SEARCH="Rechercher"
WF_LABEL_RESET="Réinitialiser"
WF_LABEL_SEARCH_OPTIONS="Options de recherche"

;#################### Generic ################################
WF_LABEL_NAME="Nom"
WF_LABEL_NAME_DESC="Définit un nom unique pour l'élément."
WF_LABEL_VERSION="Version"
WF_LABEL_AUTHOR="Auteur"
WF_LABEL_LANGUAGE="Langue"
WF_LABEL_DATE="Date"
WF_LABEL_SIZE="Taille"
WF_LABEL_AUTHOR_INFO="Information sur l'auteur"
WF_LABEL_TOP="Haut"
WF_LABEL_BOTTOM="Bas"
WF_LABEL_DEFAULT="Défaut"
WF_LABEL_SAVE="Sauver"
WF_LABEL_APPLY="Appliquer"
WF_LABEL_SAVECLOSE="Sauver & Fermer"
WF_LABEL_SELECT="Sélectionner"
WF_LABEL_OK="Ok"
WF_LABEL_CANCEL="Annuler"
WF_LABEL_REFRESH="Actualiser"
WF_LABEL_HELP="Aide"
WF_LABEL_INSERT="Insérer"
WF_LABEL_PROPERTIES="Propriétés"
WF_LABEL_ATTRIBUTES="Attributs"
WF_LABEL_ADVANCED="Avancé"
WF_LABEL_PREVIEW="Prévisualisation"
WF_LABEL_BYTES="Octets"
WF_LABEL_KB="Ko"
WF_LABEL_MB="Mo"
WF_LABEL_BROWSE="Parcourir..."
WF_LABEL_BROWSER="Gestionnaire de fichiers"
WF_LABEL_SHOW="Afficher"
WF_LABEL_DETAILS="Détails"
WF_LABEL_FOLDERS="Dossiers"
WF_LABEL_DIMENSIONS="Dimension"
WF_LABEL_DIMENSIONS_DESC="Largeur et hauteur de l'élément en pixels."
WF_LABEL_PROPORTIONAL="Proportionnel"
WF_LABEL_URL="URL"
WF_LABEL_URL_DESC="Chemin relatif du fichier selon la racine du répertoire. Exemple : mon-dossier/image.jpg (l'extension est requise)"
WF_LABEL_TITLE="Titre"
WF_LABEL_TITLE_DESC="Texte affiché en infobulle au survol de l'élément."
WF_LABEL_STYLE="Styles"
WF_LABEL_STYLE_DESC="Liste des propriétés de style appliquées à l'élément sélectionné, séparées par un point-virgule. Exemple : height: 20px; margin: 5px;"
WF_LABEL_COLOR="Couleur"
WF_LABEL_CLASS_LIST="Classes CSS"
WF_LABEL_CLASS_LIST_DESC="Liste des classes css du template utilisé."
WF_LABEL_CLASSES="Classes CSS"
WF_LABEL_CLASSES_DESC="Liste des classes CSS appliquées à l'élément sélectionné, séparées par un espace. Exemple : classe1 classe2 classe3. Note : ces classes doivent être déclarées dans un fichier CSS du template ou chargées différemment."
WF_LABEL_ALT="Description"
WF_LABEL_ALT_DESC="Brève description de l'image (XHTML/WAI 508 Requis)"
WF_LABEL_EQUAL="Égales"
WF_OPTION_YES="Oui"
WF_OPTION_NO="Non"
WF_OPTION_NOT_SET="--Non défini--"
WF_OPTION_NONE="Aucun"
WF_OPTION_ALL="Tous"
WF_OPTION_CENTER="Centre"
WF_OPTION_TOP="Haut"
WF_OPTION_BOTTOM="Bas"
WF_OPTION_EXTERNAL="Externe"
WF_OPTION_AUTO="Auto"
WF_OPTION_ON="Activé"
WF_OPTION_OFF="Désactivé"
WF_OPTION_BASIC="Basique"
WF_OPTION_ADVANCED="Avancé"
WF_LABEL_LANG="Code langue"
WF_LABEL_LANG_DESC="Code langue de l'élément. Exemple&nbsp;: fr-FR"
WF_LABEL_ID="ID de l'élément"
WF_LABEL_ID_DESC="Identifiant unique de l'élément permettant de le distinguer d'autres éléments dans le contenu afin de lui appliquer des propriétés distinctes."
WF_LABEL_ACCESSKEY="Combinaison clavier"
WF_LABEL_ACCESSKEY_DESC="Raccourci clavier pour accéder à l'élément."
WF_LABEL_TABINDEX="Index de tabulation"
WF_LABEL_TABINDEX_DESC="Ordre de tabulation de l'élément."
WF_LABEL_WIDTH="Largeur"
WF_LABEL_HEIGHT="Hauteur"
WF_LABEL_ADDRESS="Adresse"
WF_LABEL_LONGDESC="Longue description"
WF_LABEL_LONGDESC_DESC="Url d'un contenu affichant une description complète de l'image."
WF_LABEL_ENABLE="Activé"
WF_LABEL_TEXT="Texte"
WF_LABEL_OPTIONS="Paramètres"
WF_LABEL_LINK="Lien"
WF_LABEL_PLUGINS="Plugins"
WF_LABEL_PLUGIN="Plugin"
WF_LABEL_EXTENSIONS="Extensions"
WF_LABEL_EXTENSION="Extension"
WF_LABEL_TYPE="Type"
WF_LABEL_TYPE_DESC="Type de contenu"
WF_LABEL_USERNAME="Identifiant"
WF_LABEL_PASSWORD="Mot de passe"
WF_LABEL_ERROR="Erreur"
WF_LABEL_ROOT="Racine"
WF_MESSAGE_TREE="Génération de la liste..."
WF_MESSAGE_LOAD="Chargement..."
WF_LABEL_HOME="Racine"
WF_ALERT_DELETE="Supprimer le(s) élément(s) séléctionné(s) ?"
WF_ALERT_RENAME="Renommer le fichier/dossier ou cassera les liens y conduisant. Vouslez-vous continuer&nbsp;?"
WF_LABEL_ALL_FILES="Tous les fichiers"
WF_LABEL_ALERT="Alerte"
WF_MESSAGE_REQUIRED="Les champs suivants sont obligatoires:"
WF_LABEL_STATE="État du plugin"
WF_STATE_DESC="Spécifiez l'état du plugin, activé ou désactivé."

WF_LABEL_NEW="Nouveau"
WF_LABEL_ADD="Ajouter"
WF_LABEL_LINKS="Liens"
WF_LABEL_REMOVE="Supprimer"
WF_LABEL_UPDATE="Appliquer & Fermer"
WF_LABEL_VALUE="Valeur"
WF_LABEL_OR="Ou"
WF_LABEL_NAME="Nom"

WF_OPTION_DEFAULT="Défaut"
WF_OPTION_INHERIT="Hérité"
WF_OPTION_HIDE="Masquer"
WF_OPTION_IMAGE="Image"
WF_OPTION_SHOW="Afficher"
WF_OPTION_TEXT="Texte"
WF_OPTION_STATE="État"
;WF_OPTION_INHERIT="Hériter" (double)
WF_OPTION_WEBSAFE_ALLOW_SPACES_UNDERSCORE="Remplacer par un trait de soulignement _"
WF_OPTION_WEBSAFE_ALLOW_SPACES_DASH="Remplacer par un tiret -"
WF_OPTION_WEBSAFE_ALLOW_SPACES_PERIOD="Remplacer par un point ."

WF_OPTION_TEXT_LEVEL_ELEMENTS="Éléments de texte"
WF_OPTION_GROUPING_ELEMENTS="Éléments de groupe"
WF_OPTION_SECTION_ELEMENTS="Éléments de section"
WF_STYLEFORMAT_ELEMENT="Balise"
WF_STYLEFORMAT_ELEMENT_DESC="Sélectionnez l'unique balise à laquelle cet élément de styles doit pouvoir s'appliquer. Si 'Aucun', cet élément de styles pourra s'appliquer à toutes les balises compatibles."
WF_STYLEFORMAT_STYLES="Styles"
WF_STYLEFORMAT_STYLES_DESC="Indiquez les styles devant être intégrés à la balise ou au sélecteur lors de l'application de cet élément de styles. Séparez les différents styles par un point-virgule (+ espace à choix).<br />Exemple : color:#ff0000;font-weight:bold;"
WF_STYLEFORMAT_TITLE="Titre"
WF_STYLEFORMAT_TITLE_DESC="Titre de l'élément de styles (requis)"
WF_STYLEFORMAT_CLASSES="Classes CSS"
WF_STYLEFORMAT_CLASSES_DESC="Indiquez la ou les classes CSS devant être intégrées à la balise ou au sélecteur lors de l'application de cet élément de styles. Séparez les différentes classes par un espace.<br />Exemple : classe1 classe2 classe3"
WF_STYLEFORMAT_ATTRIBUTES="Attributs"
WF_STYLEFORMAT_ATTRIBUTES_DESC="Indiquez les attributs devant être intégrés à la balise ou au sélecteur lors de l'application de cet élément de styles. Séparez les différents attributs par un espace.<br />Exemple : title='Exemple' data-value='true'"
WF_STYLEFORMAT_SELECTOR="Sélecteur"
WF_STYLEFORMAT_SELECTOR_DESC="Indiquez l'unique sélecteur auquel cet élément de styles doit pouvoir s'appliquer. Si laissé vide, cet élément de styles pourra s'appliquer à tous les sélecteurs."
WF_STYLEFORMAT_NEW="Ajouter un nouvel élément de styles"
WF_OPTION_SELECTED_ELEMENT="Aucun (peut s'appliquer à toutes balises)"
WF_OPTION_UPPERCASE="MAJUSCULE"
WF_OPTION_LOWERCASE="minuscule"
WF_OPTION_FORM_ELEMENTS="Éléments de formulaire"

WF_LABEL_FONTS="Polices"

WF_OPTION_RELATIVE="Relative"
WF_OPTION_ABSOLUTE="Absolue"

WF_LABEL_LOADING="Chargement..."
WF_LABEL_LOADING_DESC="Indique comment le navigateur doit charger l'image&#160;: <ul><li>Eager : charge l'image indépendamment du fait que l'image se trouve ou non dans la partie visible de la page (c'est la valeur par défaut).</li><li>Lazy&#160;: charge l'image dès qu'elle se trouve à une distance définie de la partie visible de la page, selon les paramètres du navigateur.</li></ul>"
WF_OPTION_LOADING_LAZY="Lazy"
WF_OPTION_LOADING_EAGER="Eager"

WF_LABEL_ENABLE_FILEBROWSER="Icône gestionnaire de fichiers"
WF_LABEL_ENABLE_FILEBROWSER_DESC="Afficher une icône vers le gestionnaire de fichiers dans le champ URL pour permettre de gérer les fichiers et sélectionner celui à insérer."

WF_LABEL_BOOLEAN="Booléen"
WF_LABEL_FOLDER_UP="Haut"
wF_LABEL_GRID_SIZE="Taille de la grille"
WF_LABEL_GRID_SIZE_INCREASE="Augmenter la taille de la grille"
WF_LABEL_GRID_SIZE_DECREASE="Diminuer la taille de la grille"

WF_LABEL_CUSTOM_CLASSES="Classes personnalisées"
WF_LABEL_CUSTOM_CLASSES_DESC="Noms de classes à utiliser pour styliser les listes à la place des classes extraites des feuilles de style du template du site. Les classes listées doivent également être définies dans les feuilles de style du template."

;#################### Position (Border, Margin, Padding etc) ################################
WF_OPTION_LEFT="Gauche"
WF_OPTION_RIGHT="Droite"
WF_OPTION_TOP_LEFT="Haut, Gauche"
WF_OPTION_TOP_RIGHT="Haut, Droite"
WF_OPTION_BOTTOM_LEFT="Bas, Gauche"
WF_OPTION_BOTTOM_RIGHT="Bas, Droite"

;#################### Target ################################
WF_LABEL_TARGET="Cible"
WF_LABEL_TARGET_DESC="Spécifiez la cible du lien dans laquelle le contenu doit s'afficher."
WF_OPTION_TARGET_SELF="Afficher dans la même fenêtre"
WF_OPTION_TARGET_PARENT="Afficher dans le cadre parent (frame)"
WF_OPTION_TARGET_TOP="Afficher dans le cadre racine"
WF_OPTION_TARGET_BLANK="Afficher dans une nouvelle fenêtre"

;#################### Clear ################################
WF_LABEL_CLEAR="Espace&nbsp;vide"
WF_LABEL_CLEAR_DESC="Côté de l'élément devant rester vide, où d'autres éléments (texte, tableaux, image, etc.) ne peuvent pas être affichés.<br />Si 'Gauche', les éléments précédents sont placés sur une ligne précédente. Si droite, les éléments suivants sont placés sur la ligne suivante."
WF_OPTION_CLEAR_LEFT="Gauche"
WF_OPTION_CLEAR_RIGHT="Droite"
WF_OPTION_CLEAR_BOTH="Les deux"
WF_OPTION_CLEAR_NONE="Aucun"

;#################### Language Direction ################################
WF_LABEL_DIR="Direction d'écriture"
WF_LABEL_DIR_DESC="Direction d'écriture du contenu"
WF_OPTION_LTR="Gauche à droite"
WF_OPTION_RTL="Droite à gauche"

;#################### Buttons ################################
WF_BUTTON_HELP="Aide"
WF_BUTTON_INSERT="Insérer"
WF_BUTTON_CANCEL="Annuler"
WF_BUTTON_REFRESH="Actualiser"
WF_BUTTON_UPLOAD="Envoyer"
WF_BUTTON_FOLDER_NEW="Nouveau dossier"
WF_BUTTON_DELETE="Supprimer"
WF_BUTTON_RENAME="Renommer"
WF_BUTTON_COPY="Copier"
WF_BUTTON_CUT="Couper"
WF_BUTTON_PASTE="Coller"
WF_BUTTON_VIEW="Prévisualiser"
WF_BUTTON_FILE_INSERT="Insérer"

;#################### Plugin Tabs ################################
WF_TAB_GENERAL="Généralités"
WF_TAB_ADVANCED="Avancé"
WF_TAB_POPUP="Popup"
WF_TAB_POPUPS="Popups"

;#################### Popups ################################
WF_POPUPS="Popups"
WF_POPUP_ENABLE="Popup activé"
WF_POPUP_ENABLE_DESC="Cliquez pour activer les popups. Un plugin tiers contenant les scripts nécessaires doit être activé, tel JCE MediaBox."
WF_POPUP_TYPE_DESC="Sélectionnez le type de popup à partir des options disponibles"
WF_POPUP_TYPE="Type de popup"
WF_POPUP_TYPE_SELECT="Sélectionnez le type"
WF_POPUP_MEDIABOX="Requiert <a href='https://www.joomlacontenteditor.net/mediabox' title='JCE MediaBox' target='_blank'><strong>JCE MediaBox</strong></a>"
WF_POPUP_TEXT_DESC="Texte du lien. Si le lien est effectué sur une image ou un autre média, n'indiquez aucun texte."
WF_POPUP_TEXT="Texte"

;#################### Manager Help ################################
WF_MANAGER_HELP="Aide du gestionnaire"
WF_MANAGER_HELP_UPLOAD="Envoyer un fichier"
WF_MANAGER_HELP_DELETE="Supprimer un fichier/dossier"
WF_MANAGER_HELP_RENAME="Renommer un fichier/dossier"
WF_MANAGER_HELP_CREATE="Créer un dossier"

;#################### Manager Errors ################################
WF_MANAGER_NEW_FOLDER_ERROR="Impossible de créer le dossier '%s'"
WF_MANAGER_MOVE_FILES_ERROR="Impossible de déplacer l'élément - '%s'"
WF_MANAGER_COPY_FILES_ERROR="Impossible de copier l'élément - '%s'"
WF_MANAGER_RENAME_FILES_ERROR="Impossible de renommer le fichier - '%s'"
WF_MANAGER_RENAME_FOLDERS_ERROR="Impossible de renommer le dossier '%s'"
WF_MANAGER_DELETE_FOLDERS_ERROR="Impossible de supprimer le dossier - '%s'"
WF_MANAGER_DELETE_FILES_ERROR="Impossible de supprimer le fichier - '%s'"
WF_MANAGER_UPLOAD_ERROR="Erreur d'envoi"
WF_MANAGER_UPLOAD_NOSUPPORT="Méthode d'envoi non supportée"
WF_MANAGER_FOLDER_NOT_EMPTY="Impossible de supprimer le dossier - '%s'  (non vide)"
WF_MANAGER_FOLDER_EXISTS="Un dossier avec le nom '%s' existe déjà"
WF_MANAGER_FILE_EXISTS="Un fichier avec le nom '%s' existe déjà dans ce dossier"

WF_MANAGER_UPLOAD_INVALID_EXT_ERROR="Envoi échoué : Type de fichier invalide"
WF_MANAGER_UPLOAD_INVALID_IMAGE_ERROR="Envoi échoué : Fichier image invalide."
WF_MANAGER_UPLOAD_RESTRICTED_ERROR="Envoi échoué : Droits insuffisants"
WF_MANAGER_UPLOAD_MIME_ERROR="Envoi échoué : Type Mime invalide"

WF_MANAGER_COPY_INTO_ERROR="Impossible de copier le dossier - Les dossiers ne peuvent pas être collés sur eux-mêmes."
WF_MANAGER_UPLOAD_SIZE_ERROR="Échec d'envoi : %s (%s Kb) excède la taille maximale autorisée de %s Kb."

WF_MANAGER_FILE_LIMIT_ERROR="Limite du nombre de fichiers atteinte."
WF_MANAGER_FILE_SIZE_LIMIT_ERROR="Limite de taille de fichier atteinte."
WF_MANAGER_UPLOAD_EXIF_REMOVE_ERROR="Envoi échoué : les données Exif ne peuvent pas être supprimées de cette image."

;#################### Manager File suffix ################################
WF_MANAGER_FILE_SUFFIX="_copie"

;#################### Extensions ################################
WF_LABEL_EXTENSION_ENABLE="Activer cette extension"
WF_LABEL_EXTENSION_ENABLE_DESC="Activer les fonctions de cette extension de plugin"
WF_EXTENSIONS_LINKS_TITLE="Liens"
WF_EXTENSIONS_LINKS_DESC="Extensions de lien"
WF_EXTENSIONS_POPUPS_TITLE="Popups"
WF_EXTENSIONS_POPUPS_DESC="Extensions de popup"
WF_EXTENSIONS_FILESYSTEM_TITLE="Fichier système"
WF_EXTENSIONS_FILESYSTEM_TITLE_DESC="Fichier système utilisé pour le gestionnaire de fichiers de JCE."
WF_FILESYSTEM_PARAMETERS="Paramètres du fichier système"
WF_FILESYSTEM_JOOMLA_TITLE="Joomla! (Défaut)"
WF_FILESYSTEM_JOOMLA_DESC="Joomla! Natif, fonctions du fichier système"
WF_EXTENSIONS_AGGREGATOR_TITLE="Options média"
WF_EXTENSIONS_AGGREGATOR_DEFAULT_DESC="Sélectionnez et définissez les options pour les diverses sources des médias."
WF_EXTENSIONS_POPUPS_DEFAULT_LABEL="Défaut"
WF_EXTENSIONS_POPUPS_DEFAULT_DESC="Sélectionnez le type de popup à utiliser par défaut. Sélectionner une valeur par défaut activera et créera des popups de ce type pour tous les nouveaux liens."

;## JCE JoomlaLinks ##
WF_LINKS_JOOMLALINKS_TITLE="Liens Joomla!"
WF_LINKS_JOOMLALINKS_DESC="Ajouter dans le gestionnaire de liens les éléments de Joomla tel les articles, menus, liens web, et contacts."
WF_LINKS_JOOMLALINKS_MENU="Menu"
WF_LINKS_JOOMLALINKS_CONTENT="Articles"
WF_LINKS_JOOMLALINKS_UNCATEGORIZED="Non catégorisé"
WF_LINKS_JOOMLALINKS_WEBLINKS="Liens web"
WF_LINKS_JOOMLALINKS_TAGS="Tags"
WF_LINKS_JOOMLALINKS_CONTACTS="Contacts"
WF_LINKS_JOOMLALINKS_PARAM_CONTENT="Liste des 'Articles publiés'"
WF_LINKS_JOOMLALINKS_PARAM_CONTENT_DESC="Afficher la liste des liens vers les articles"
WF_LINKS_JOOMLALINKS_PARAM_UNCATEGORIZED="Liste des 'Non catégorisés'"
WF_LINKS_JOOMLALINKS_PARAM_UNCATEGORIZED_DESC="Afficher la liste des liens vers les articles non catégorisés."
WF_LINKS_JOOMLALINKS_PARAM_MENU="Liste des 'Liens de menu'"
WF_LINKS_JOOMLALINKS_PARAM_MENU_DESC="Afficher la liste des liens des différents menus."
WF_LINKS_JOOMLALINKS_PARAM_CONTACT="Liste des 'Contacts'"
WF_LINKS_JOOMLALINKS_PARAM_CONTACT_DESC="Afficher la liste des liens vers les contacts."
WF_LINKS_JOOMLALINKS_PARAM_WEBLINKS="Liste des 'Liens Web'"
WF_LINKS_JOOMLALINKS_PARAM_WEBLINKS_DESC="Afficher la liste des liens Web."
WF_LINKS_JOOMLALINKS_PARAM_TAGS="Liste des tags"
WF_LINKS_JOOMLALINKS_PARAM_TAGS_DESC="Afficher la liste des liens vers les tags."
WF_LINKS_JOOMLALINKS_PARAM_ARTICLE_ALIAS="Alias de l'article"
WF_LINKS_JOOMLALINKS_PARAM_ARTICLE_ALIAS_DESC="Utiliser l'alias de l'article dans l'URL du lien."
WF_LINKS_JOOMLALINKS_PARAM_ARTICLE_MENU_LINK="Résoudre les liens du menu"
WF_LINKS_JOOMLALINKS_PARAM_ARTICLE_MENU_LINK_DESC="Remplacer les alias des liens tel 'index.php?Itemid=30' par ceux des liens de menu complets s'ils sont disponibles. Par défaut 'Non'."
WF_LINKS_JOOMLALINKS_PARAM_WEBLINKS_ALIAS="Ajouter l'alias du lien web"
WF_LINKS_JOOMLALINKS_PARAM_WEBLINKS_ALIAS_DESC="Utiliser l'alias du lien web dans l'URL du lien."
WF_LINKS_JOOMLALINKS_PARAM_ARTICLE_UNPUBLISHED="Afficher les articles non publiés"
WF_LINKS_JOOMLALINKS_PARAM_ARTICLE_UNPUBLISHED_DESC="Afficher la liste des articles non publiés en plus des articles publiés."
WF_LINKS_JOOMLALINKS_PARAM_TAGS_ALIAS="Ajouter l'alias du tag"
WF_LINKS_JOOMLALINKS_PARAM_TAGS_ALIAS_DESC="Ajouter l'alias du tag dans le lien."

WF_LINKS_JOOMLALINKS_SEF_URL="Convertir en SEF"
WF_LINKS_JOOMLALINKS_SEF_URL_DESC="Les URL sont converties en URL SEF lorsque possible. Comme cette option a des conséquences sur le stockage de contenu (les URL SEF sont sauvegardées avec le contenu de l'article dans la base de données et ne sont pas automatiquement actualisées lorsque des modifications sont apportées aux paramètres SEF), il n'est pas recommandé pour la plupart des utilisateurs."

WF_LINKS_JOOMLALINKS_ITEMID="Inclure l'itemID"
WF_LINKS_JOOMLALINKS_ITEMID_DESC="Inclure l'itemID (le menu associé au lien) dans l'URL du lien."

; ## JCE MediaBox ##
WF_POPUPS_JCEMEDIABOX_TITLE="Popups JCE MediaBox"
WF_POPUPS_JCEMEDIABOX_DESC="Insérer/Modifier un lien popup JCE MediaBox"

WF_POPUPS_JCEMEDIABOX_OPTION_TITLE="Titre"
WF_POPUPS_JCEMEDIABOX_OPTION_TITLE_DESC="Titre de la fenêtre popup."
WF_POPUPS_JCEMEDIABOX_CAPTION="Légende"
WF_POPUPS_JCEMEDIABOX_CAPTION_DESC="Légende de la fenêtre popup."
WF_POPUPS_JCEMEDIABOX_GROUP="Groupe"
WF_POPUPS_JCEMEDIABOX_GROUP_DESC="Nom de groupe appliqué à la fenêtre popup pour lier les contenus des autres popups de la même page. Cela permet de faire défiler ces contenus dans la même fenêtre popup. N'utilisez pas de caractères spéciaux dans le nom du groupe."
WF_POPUPS_JCEMEDIABOX_PARAMS="Paramètres&nbsp;sup."
WF_POPUPS_JCEMEDIABOX_PARAMS_DESC="Liste des paramètres supplémentaires pour le contenu popup ou contextuel. Un nom de paramètre et un nom de valeur sont requis.<br />Cliquez sur le bouton 'Ajouter' pour ajouter un paramètre et sur le bouton 'Supprimer' pour le supprimer."
WF_POPUPS_JCEMEDIABOX_DIMENSIONS="Dimensions"
WF_POPUPS_JCEMEDIABOX_DIMENSIONS_DESC="Largeur et hauteur en pixels de la fenêtre popup. Si une des deux valeurs n'est pas précisée, la fenêtre s'affichera en plein écran."
WF_POPUPS_JCEMEDIABOX_ICON="Icône du popup"
WF_POPUPS_JCEMEDIABOX_ICON_DESC="Activer/Désactiver l'affichage de l'icône indiquant le lien popup."
WF_POPUPS_JCEMEDIABOX_ICON_POSITION="Position de l'icône"
WF_POPUPS_JCEMEDIABOX_ICON_POSITION_DESC="Position de l'icône du popup par rapport à l'élément du lien.<br />Si l'élément est du texte, utilisez la position 'Gauche' ou 'Droite'.<br />Si l'élément est une image, utilisez les positions 'Haut, Gauche', 'Bas, Gauche', 'Haut, Droite' et 'Bas, Droite'."
WF_POPUPS_JCEMEDIABOX_ICON_TOP_LEFT="Haut, Gauche"
WF_POPUPS_JCEMEDIABOX_ICON_BOTTOM_LEFT="Bas, Gauche"
WF_POPUPS_JCEMEDIABOX_ICON_TOP_RIGHT="Haut, Droite"
WF_POPUPS_JCEMEDIABOX_ICON_BOTTOM_RIGHT="Bas, Droite"
WF_POPUPS_JCEMEDIABOX_UTILITIES_REQUIRED="Le plugin JCE MediaBox doit être installé et activé pour utiliser ce type de popup!"
WF_POPUPS_JCEMEDIABOX_AUTO="Popup automatique"
WF_POPUPS_JCEMEDIABOX_AUTO_DESC="Vous pouvez programmer l'affichage automatique du popup au chargement de la page.<br />Une fois : n'affiche le popup qu'une fois par session de navigateur.<br /> Multiple : affiche le popup à chaque chargement de la page."
WF_POPUPS_JCEMEDIABOX_AUTO_SINGLE="Une fois"
WF_POPUPS_JCEMEDIABOX_AUTO_MULTIPLE="Chaque fois"
WF_POPUPS_JCEMEDIABOX_HIDE="Masquer le lien"
WF_POPUPS_JCEMEDIABOX_HIDE_DESC="Masquer le lien du popup pour un affichage en diaporama uniquement. Attention, ce lien popup et les autres doivent appartenir au même groupe de popups ayant au minimum un lien visible, celui-ci par exemple."
WF_POPUPS_JCEMEDIABOX_MEDIATYPE="Type de contenu"
WF_POPUPS_JCEMEDIABOX_MEDIATYPE_DESC="Spécifiez le type de contenu à afficher afin de déterminer comment la popup doit se charger. <br >Certains formats sont automatiquement détectés par JCE Media Box et ne nécessitent pas d'être précisés (images, médias sociaux Youtube, Vimeo, etc.)."
WF_POPUPS_JCEMEDIABOX_IMAGE="Image"
WF_POPUPS_JCEMEDIABOX_INTERNAL="Liens internes"
WF_POPUPS_JCEMEDIABOX_EXTERNAL="Liens externes / IFrame"
WF_POPUPS_JCEMEDIABOX_FLASH="Adobe® Flash®"
WF_POPUPS_JCEMEDIABOX_QUICKTIME="Quicktime®"
WF_POPUPS_JCEMEDIABOX_WINDOWSMEDIA="Windows Media Player®"
WF_POPUPS_JCEMEDIABOX_DIRECTOR="Adobe® Shockwave®"
WF_POPUPS_JCEMEDIABOX_REAL="RealPlayer®"
WF_POPUPS_JCEMEDIABOX_SILVERLIGHT="Silverlight®"
WF_POPUPS_JCEMEDIABOX_DIVX="DivX®"
WF_POPUPS_JCEMEDIABOX_VIDEO_MP4="Vidéo MP4"
WF_POPUPS_JCEMEDIABOX_VIDEO_WEBM="Vidéo WebM"
WF_POPUPS_JCEMEDIABOX_AUDIO_MP3="Audio MP3"
WF_POPUPS_JCEMEDIABOX_AUDIO_WEBM="Audio WebM"
WF_POPUPS_JCEMEDIABOX_YOUTUBE="Vidéo Youtube"
WF_POPUPS_JCEMEDIABOX_VIMEO="Vidéo Vimeo"
WF_POPUPS_JCEMEDIABOX_VERSION_ERROR="La version %s ou supérieure du <a href='https://www.joomlacontenteditor.net/downloads/mediabox' target='_blank' title='JCE MediaBox'>Plugin système JCE MediaBox</a> est requise!"

WF_AGGREGATOR_MORE_OPTIONS="Options supplémentaires"

; ## Youtube Aggregator ##
WF_AGGREGATOR_YOUTUBE_TITLE="Youtube"
WF_AGGREGATOR_YOUTUBE_DESC="Youtube - Ressource média externe"
WF_AGGREGATOR_YOUTUBE_CONTROLS="Afficher les contrôles"
WF_AGGREGATOR_YOUTUBE_CONTROLS_DESC="Afficher les contrôles du lecteur de médias."
WF_AGGREGATOR_YOUTUBE_RELATED="Afficher les suggestions"
WF_AGGREGATOR_YOUTUBE_RELATED_DESC="Sélectionnez la portée des vidéos connexes à afficher lorsque la vidéo est terminée."
WF_AGGREGATOR_YOUTUBE_RELATED_ALL="Toutes les vidéos en relation"
WF_AGGREGATOR_YOUTUBE_RELATED_CHANNEL="Même canal uniquement"
WF_AGGREGATOR_YOUTUBE_MODESTBRANDING="Signature discrète"
WF_AGGREGATOR_YOUTUBE_MODESTBRANDING_DESC="Masque le logo YouTube dans la barre de contrôle. À noter qu'une petite étiquette de texte YouTube s'affichera toujours dans le coin supérieur droit lors du survol du lecteur lorsqu'il est en pause."
WF_AGGREGATOR_YOUTUBE_PRIVACY="Protection de la vie privée"
WF_AGGREGATOR_YOUTUBE_PRIVACY_DESC="Permet d'intégrer des vidéos YouTube sans utiliser de cookies de suivi du comportement de visualisation. Voir - <a href='https://support.google.com/youtube/answer/171780?hl=en-GB#zippy=%2Cturn-on-privacy-enhanced-mode' target='_blank'>Embed videos and playlists</a>"
WF_AGGREGATOR_YOUTUBE_AUTOPLAY="Lecture automatique"
WF_AGGREGATOR_YOUTUBE_AUTOPLAY_DESC="Activer la lecture automatique de la vidéo lors du chargement du lecteur."
WF_AGGREGATOR_YOUTUBE_LOOP="Boucle"
WF_AGGREGATOR_YOUTUBE_LOOP_DESC="L'activation de cette option permet de lire les vidéos ou les listes de lecture en boucle."
WF_AGGREGATOR_YOUTUBE_PLAYLIST="Liste de lecture"
WF_AGGREGATOR_YOUTUBE_PLAYLIST_DESC="Liste des ID des vidéos à lire, séparés par des virgules. Si vous spécifiez une valeur, la première vidéo lue sera le VIDEO_ID spécifié dans le chemin URL, et les suivantes seront celles de la liste de lecture."
WF_AGGREGATOR_YOUTUBE_START="Lire depuis"
WF_AGGREGATOR_YOUTUBE_START_DESC="Point de lecture de la vidéo, indiqué en secondes à partir de son début."
WF_AGGREGATOR_YOUTUBE_END="Fin"
WF_AGGREGATOR_YOUTUBE_END_DESC="Point d'arrêt de la vidéo, indiqué en secondes à partir de son début."
WF_AGGREGATOR_YOUTUBE_WIDTH_DESC="Largeur par défaut de la vidéo"
WF_AGGREGATOR_YOUTUBE_HEIGHT_DESC="Hauteur par défaut de la vidéo"
WF_AGGREGATOR_YOUTUBE_PARAMS="Paramètres"
WF_AGGREGATOR_YOUTUBE_PARAMS_DESC="Paramètres supplémentaires pour la vidéo."
WF_AGGREGATOR_YOUTUBE_MUTE="Son désactivé"
WF_AGGREGATOR_YOUTUBE_MUTE_DESC="Définit si le son de la vidéo initiale doit être désactivé au chargement du lecteur."

; ## Vimeo Aggregator ##
WF_AGGREGATOR_VIMEO_TITLE="Vimeo"
WF_AGGREGATOR_VIMEO_DESC="Vimeo - Ressource média externe"
WF_AGGREGATOR_VIMEO_COLOR="Couleur"
WF_AGGREGATOR_VIMEO_COLOR_DESC="Couleur du lecteur de médias."
WF_AGGREGATOR_VIMEO_EMBED="Ancienne méthode Embed"
WF_AGGREGATOR_VIMEO_EMBED_DESC="Intégrer la vidéo en utilisant les balises OBJECT et EMBED au lieu d'une iframe."
WF_AGGREGATOR_VIMEO_AUTOPLAY="Lecture automatique"
WF_AGGREGATOR_VIMEO_AUTOPLAY_DESC="Activer la lecture automatique de la vidéo lors du chargement du lecteur de médias."
WF_AGGREGATOR_VIMEO_LOOP="Boucle"
WF_AGGREGATOR_VIMEO_LOOP_DESC="Activer la lecture en boucle de la vidéo."
WF_AGGREGATOR_VIMEO_FULLSCREEN="Pleine page"
WF_AGGREGATOR_VIMEO_FULLSCREEN_DESC="Autoriser l'option 'Plein écran'."
WF_AGGREGATOR_VIMEO_BYLINE="Byline"
WF_AGGREGATOR_VIMEO_BYLINE_DESC="Afficher le Byline d'introduction."
WF_AGGREGATOR_VIMEO_PORTRAIT="Image"
WF_AGGREGATOR_VIMEO_PORTRAIT_DESC="Afficher le portrait d'introduction."
WF_AGGREGATOR_VIMEO_INTROTITLE="Titre"
WF_AGGREGATOR_VIMEO_INTROTITLE_DESC="Afficher le titre d'introduction."
WF_AGGREGATOR_VIMEO_INTRO="Options d'introduction"
WF_AGGREGATOR_VIMEO_INTRO_DESC="Afficher les options d'introduction."
WF_AGGREGATOR_VIMEO_WIDTH_DESC="Largeur par défaut de la vidéo"
WF_AGGREGATOR_VIMEO_HEIGHT_DESC="Hauteur par défaut de la vidéo"
WF_AGGREGATOR_VIMEO_SPECIAL="Paramètres spéciaux"
WF_AGGREGATOR_VIMEO_DNT="Ne pas suivre"
WF_AGGREGATOR_VIMEO_DNT_DESC="Indiquez s'il faut empêcher le lecteur de suivre les données de session, y compris les cookies. La définition de cet argument sur 'Oui' bloque également les statistiques vidéo."

; ## Dailymotion Aggregator
WF_AGGREGATOR_DAILYMOTION_TITLE="Dailymotion"
WF_AGGREGATOR_DAILYMOTION_DESC="Dailymotion - Resource média externe"
WF_AGGREGATOR_DAILYMOTION_SIZE="Taille du lecteur"
WF_AGGREGATOR_DAILYMOTION_START="Lire depuis"
WF_AGGREGATOR_DAILYMOTION_AUTOPLAY="Lecture automatique"
WF_AGGREGATOR_DAILYMOTION_SIZE_SMALL="Petit (320 x 180)"
WF_AGGREGATOR_DAILYMOTION_SIZE_MEDIUM="Moyen (480 x 270)"
WF_AGGREGATOR_DAILYMOTION_SIZE_LARGE="Large (560 x 315)"
WF_AGGREGATOR_DAILYMOTION_SIZE_CUSTOM="Largeur personnalisée"

; ## Video Options
WF_AGGREGATOR_VIDEO_TITLE="Vidéo HTML5"
WF_AGGREGATOR_VIDEO_AUTOPLAY="Lecture automatique"
WF_AGGREGATOR_VIDEO_AUTOPLAY_DESC="Activer la lecture automatique de la vidéo lors du chargement du lecteur de médias."
WF_AGGREGATOR_VIDEO_LOOP="En boucle"
WF_AGGREGATOR_VIDEO_LOOP_DESC="Activer la lecture en boucle de la vidéo."
WF_AGGREGATOR_VIDEO_CONTROLS="Afficher les contrôles"
WF_AGGREGATOR_VIDEO_CONTROLS_DESC="Afficher les contrôles du lecteur de médias."
WF_AGGREGATOR_VIDEO_MUTE="Muet"
WF_AGGREGATOR_VIDEO_MUTE_DESC="Paramétrer par défaut le volume du lecteur de médias au minimum (muet)."
WF_AGGREGATOR_VIDEO_WIDTH_DESC="Largeur par défaut des vidéos"
WF_AGGREGATOR_VIDEO_HEIGHT_DESC="Hauteur par défaut des vidéos"

; ## Audio Options
WF_AGGREGATOR_AUDIO_TITLE="Audio HTML5"
WF_AGGREGATOR_AUDIO_AUTOPLAY="Lecture automatique"
WF_AGGREGATOR_AUDIO_AUTOPLAY_DESC="Activer la lecture automatique de la vidéo lors du chargement du lecteur de médias."
WF_AGGREGATOR_AUDIO_LOOP="En boucle"
WF_AGGREGATOR_AUDIO_LOOP_DESC="Activer la lecture audio en boucle."
WF_AGGREGATOR_AUDIO_CONTROLS="Afficher les contrôles"
WF_AGGREGATOR_AUDIO_CONTROLS_DESC="Afficher les contrôles du lecteur audio."
WF_AGGREGATOR_AUDIO_MUTE="Muet"
WF_AGGREGATOR_AUDIO_MUTE_DESC="Paramétrer par défaut le volume du lecteur audio au minimum (muet)."

; ## ACL Permissions ##
JACTION_ADMIN="Configuration du composant"
JACTION_ADMIN_COMPONENT_DESC="Autoriser les utilisateurs de ce groupe à modifier les options d'autorisation de cette extension"
JACTION_MANAGE="Accès"
JACTION_MANAGE_COMPONENT_DESC="Tous les utilisateurs de ce groupe peuvent accéder au panneau de contrôle de JCE"
WF_ACTION_CONFIG="Configuration globale"
WF_ACTION_CONFIG_DESC="Tous les utilisateurs de ce groupe peuvent accéder et modifier la configuration globale de JCE"
WF_ACTION_PROFILES="Profils de l'éditeur"
WF_ACTION_PROFILES_DESC="Tous les utilisateurs de ce groupe peuvent accéder et modifier les profils de JCE"
WF_ACTION_PREFERENCES="Paramètres de JCE"
WF_ACTION_PREFERENCES_DESC="Tous les utilisateurs de ce groupe peuvent accéder et modifier les paramètres de JCE"
WF_ACTION_INSTALLER="Installeur de compléments"
WF_ACTION_INSTALLER_DESC="Tous les utilisateurs de ce groupe peuvent accéder à l'installeur de compléments JCE"
WF_ACTION_BROWSER="Gestionnaire de fichiers"
WF_ACTION_BROWSER_DESC="Tous les utilisateurs de ce groupe peuvent accéder au gestionnaire de fichiers de JCE"
WF_ACTION_MEDIABOX="Paramètres MediaBox"
WF_ACTION_MEDIABOX_DESC="Tous les utilisateurs de ce groupe peuvent accéder et modifier les paramètres de MediaBox"
WF_RULES_ACTION="Action"
WF_RULES_ALLOWED="Autorisé"
WF_RULES_DENIED="Refusé"
WF_RULES_GROUP="%s"
WF_RULES_GROUPS="Groupes"
WF_RULES_NOT_SET="Non défini"
WF_RULES_SELECT_ALLOW_DENY_GROUP="%s autorisé ou refusé pour les utilisateurs du groupe %s"
WF_RULES_SELECT_SETTING="Sélectionner un nouveau paramètre"
WF_RULES_SETTINGS_DESC="Gestion des droits sur JCE pour les groupes d'utilisateurs ci-dessous"

; ## Filegroups && Trademark Labels ##
WF_FILEGROUP_ALL="Tous les fichiers"
WF_FILEGROUP_IMAGE="Groupe de fichiers Image"
WF_FILEGROUP_HTML="Groupe de fichiers HTML"
WF_FILEGROUP_ARCHIVE="Groupe de fichiers Archive"
WF_FILEGROUP_TEXT="Groupe de fichiers Texte"
WF_FILEGROUP_VIDEO="Vidéo"
WF_FILEGROUP_AUDIO="Audio"
WF_FILEGROUP_ACROBAT="Adobe® Acrobat®"
WF_FILEGROUP_EXCEL="Microsoft Excel®"
WF_FILEGROUP_WORD="Microsoft Word®"
WF_FILEGROUP_POWERPOINT="Microsoft Powerpoint®"
WF_FILEGROUP_OFFICE="Microsoft Office®"
WF_FILEGROUP_FLASH="Adobe® Flash®"
WF_FILEGROUP_SHOCKWAVE="Adobe® Shockwave®"
WF_FILEGROUP_QUICKTIME="Quicktime®"
WF_FILEGROUP_WINDOWSMEDIA="Windows Media Player®"
WF_FILEGROUP_SILVERLIGHT="Silverlight®"
WF_FILEGROUP_DIVX="DivX®"
WF_FILEGROUP_OPENOFFICE="OpenOffice.org"
WF_FILEGROUP_REAL="RealPlayer®"

; ## Link Search ##
WF_EXTENSIONS_SEARCH_TITLE="Recherche"
WF_EXTENSIONS_SEARCH_DEFAULT=""

WF_SEARCH_ALL_WORDS="Tous les mots&nbsp;"
WF_SEARCH_ALPHABETICAL="Alphabétique"
WF_SEARCH_ANY_WORDS="N'importe quel mot&nbsp;"
WF_SEARCH_ERROR_ENTERKEYWORD="Indiquez un mot à rechercher"
WF_SEARCH_ERROR_IGNOREKEYWORD="Un ou plusieurs mots communs ont été ignorés dans cette recherche."
WF_SEARCH_ERROR_SEARCH_MESSAGE="Pour effectuer une recherche, vous devez indiquer au minimum %1$s caractères et au maximum %2$s caractères."
WF_SEARCH_EXACT_PHRASE="Phrase exacte"
WF_SEARCH_FIELD_SEARCH_AREAS_DESC="Afficher l'espace de recherche et les champs de spécification."
WF_SEARCH_FIELD_SEARCH_AREAS_LABEL="Afficher l'espace de recherche"
WF_SEARCH_FOR="Rechercher:"
WF_SEARCH_MOST_POPULAR="Plus populaire"
WF_SEARCH_NEWEST_FIRST="Nouveau d'abord"
WF_SEARCH_OLDEST_FIRST="Ancien d'abord"
WF_SEARCH_ORDERING="Ordre&nbsp;:"
WF_SEARCH_SEARCH="Recherche"
WF_SEARCH_SEARCH_AGAIN="Rechercher à nouveau"
WF_SEARCH_SEARCH_KEYWORD="Mot recherché&nbsp;:"
WF_SEARCH_SEARCH_KEYWORD_N_RESULTS="<strong>Total: %s résultats trouvés.</strong>"
WF_SEARCH_SEARCH_ONLY="Rechercher uniquement dans&nbsp;:"
WF_SEARCH_SEARCH_RESULT="Résultat de recherche"
WF_CATEGORY="Catégorie"
WF_LINK_SEARCH_TITLE="Rechercher un lien"
WF_SEARCH_LINK_TITLE="Rechercher un lien"
WF_LINK_SEARCH_DESC="Paramètres de la recherche d'un lien ou d'une ancre dans un contenu Joomla!"
WF_PARAM_LINK_SEARCH_PLUGINS="Plugins recherche de liens"
WF_PARAM_LINK_SEARCH_PLUGINS_DESC="Plugins de recherche de liens disponibles."
WF_LINK_SEARCH_SEF_URL="Convertir en SEF"
WF_LINK_SEARCH_SEF_URL_DESC="Les URL retournées dans la recherche sont converties en URL SEF lorsque possible. Comme cette option a des conséquences sur le stockage de contenu (les URL SEF sont sauvegardées avec le contenu de l'article dans la base de données et ne sont pas automatiquement actualisées lorsque des modifications sont apportées aux paramètres SEF), il n'est pas recommandé pour la plupart des utilisateurs."
WF_LINK_SEARCH_ITEMID="Inclure l'ItemId"
WF_LINK_SEARCH_ITEMID_DESC="Inclure l'ItemId (le menu associé au lien) dans l'URL du lien."
ALERTNOTAUTH="Vous n'êtes pas autorisé à consulter cette source."

WF_LINK_HELP_BUTTON="Bouton d'aide"
WF_LINK_HELP_BUTTON_DESC="Afficher le bouton d'aide dans la boîte de dialogue du gestionnaire de lien."

; Styles
WF_STYLES_TITLE="Modifier le style CSS"
WF_STYLES_APPLY="Appliquer"
WF_STYLES_TEXT_TAB="Texte"
WF_STYLES_BACKGROUND_TAB="Fond"
WF_STYLES_BLOCK_TAB="Bloc"
WF_STYLES_BOX_TAB="Boîte"
WF_STYLES_BORDER_TAB="Bordure"
WF_STYLES_LIST_TAB="Liste"
WF_STYLES_POSITIONING_TAB="Positionnement"
WF_STYLES_TEXT_PROPS="Texte"
WF_STYLES_TEXT_FONT="Police d'écriture"
WF_STYLES_TEXT_SIZE="Taille"
WF_STYLES_TEXT_WEIGHT="Épaisseur"
WF_STYLES_TEXT_STYLE="Styles"
WF_STYLES_TEXT_VARIANT="Variante"
WF_STYLES_TEXT_LINEHEIGHT="Hauteur de ligne"
WF_STYLES_TEXT_CASE="Casse"
WF_STYLES_TEXT_COLOR="Couleur"
WF_STYLES_TEXT_DECORATION="Décoration"
WF_STYLES_TEXT_OVERLINE="Surligné"
WF_STYLES_TEXT_UNDERLINE="Souligné"
WF_STYLES_TEXT_STRIKETROUGH="Barré"
WF_STYLES_TEXT_BLINK="Clignotant"
WF_STYLES_TEXT_NONE="Aucun"
WF_STYLES_BACKGROUND_COLOR="Couleur de fond"
WF_STYLES_BACKGROUND_IMAGE="Image de fond"
WF_STYLES_BACKGROUND_REPEAT="Répétition"
WF_STYLES_BACKGROUND_ATTACHMENT="Fichier joint"
WF_STYLES_BACKGROUND_HPOS="Position&nbsp;horizontale"
WF_STYLES_BACKGROUND_VPOS="Position&nbsp;verticale"
WF_STYLES_BLOCK_WORDSPACING="Espacement&nbsp;mots"
WF_STYLES_BLOCK_LETTERSPACING="Espacement&nbsp;lettres"
WF_STYLES_BLOCK_VERTICAL_ALIGNMENT="Alignement&nbsp;vertical"
WF_STYLES_BLOCK_TEXT_ALIGN="Alignement&nbsp;horizontal"
WF_STYLES_BLOCK_TEXT_INDENT="Retrait du texte"
WF_STYLES_BLOCK_WHITESPACE="Espace insécable"
WF_STYLES_BLOCK_DISPLAY="Affichage"
WF_STYLES_BOX_WIDTH="Largeur"
WF_STYLES_BOX_HEIGHT="Hauteur"
WF_STYLES_BOX_FLOAT="Position"
WF_STYLES_BOX_CLEAR="Annuler"
WF_STYLES_PADDING="Marges intérieures"
WF_STYLES_SAME="Identique pour tous"
WF_STYLES_TOP="Haut"
WF_STYLES_RIGHT="Droite"
WF_STYLES_BOTTOM="Bas"
WF_STYLES_LEFT="Gauche"
WF_STYLES_MARGIN="Marges extérieures"
WF_STYLES_STYLE="Styles"
WF_STYLES_WIDTH="Largeur"
WF_STYLES_HEIGHT="Hauteur"
WF_STYLES_COLOR="Couleur"
WF_STYLES_LIST_TYPE="Type"
WF_STYLES_BULLET_IMAGE="Liste à puce"
WF_STYLES_POSITION="Position"
WF_STYLES_POSITIONING_TYPE="Type"
WF_STYLES_VISIBILITY="Visibilité"
WF_STYLES_ZINDEX="Z-index"
WF_STYLES_OVERFLOW="Débordement"
WF_STYLES_PLACEMENT="Placement"
WF_STYLES_CLIP="Clip"
WF_STYLES_TOGGLE_INSERT_SPAN="Insérer une balise span avec les styles"

; Tables
WF_TABLE_GENERAL_TAB="Général"
WF_TABLE_ADVANCED_TAB="Avancé"
WF_TABLE_GENERAL_PROPS="Propriétés générales"
WF_TABLE_ADVANCED_PROPS="Propriétés avancées"
WF_TABLE_ROWTYPE="Ligne du tableau"
WF_TABLE_WIDTH="Largeur"
WF_TABLE_HEIGHT="Hauteur"
WF_TABLE_COLS="Colonnes"
WF_TABLE_ROWS="Lignes"
WF_TABLE_CELLSPACING="Espacement de cellules"
WF_TABLE_CELLPADDING="Marges intérieures"
WF_TABLE_BORDER="Bordure"
WF_TABLE_ALIGN="Align.&nbsp;horizontal"
WF_TABLE_ALIGN_DESC="Alignement du tableau"
WF_TABLE_ALIGN_DEFAULT="Défaut"
WF_TABLE_ALIGN_LEFT="Gauche"
WF_TABLE_ALIGN_RIGHT="Droite"
WF_TABLE_ALIGN_MIDDLE="Centre"
WF_TABLE_ROW_TITLE="Propriétés de ligne"
WF_TABLE_CELL_TITLE="Propriétés de cellule"
WF_TABLE_CELL_TYPE="Type"
WF_TABLE_VALIGN="Align.&nbsp;vertical"
WF_TABLE_ALIGN_TOP="Haut"
WF_TABLE_ALIGN_BOTTOM="Bas"
WF_TABLE_BORDERCOLOR="Couleur de bordure"
WF_TABLE_BGCOLOR="Couleur de fond"
WF_TABLE_MERGE_CELLS_TITLE="Fusionner les cellules"
WF_TABLE_ID="Id de l'élément"
WF_TABLE_STYLE="Styles"
WF_TABLE_LANGDIR="Direction d'écriture"
WF_TABLE_LANGCODE="Code langue"
WF_TABLE_MIME="Type MIME de la cible"
WF_TABLE_LTR="Gauche à droite"
WF_TABLE_RTL="Droite à gauche"
WF_TABLE_BGIMAGE="Image de fond"
WF_TABLE_SUMMARY="Résumé"
WF_TABLE_TD="Données"
WF_TABLE_TH="En-tête"
WF_TABLE_CELL_CELL="Modifier la cellule"
WF_TABLE_CELL_ROW="Modifier toutes les cellules de la ligne"
WF_TABLE_CELL_ALL="Modifier toutes les cellules du tableau"
WF_TABLE_ROW_ROW="Modifier la ligne courante"
WF_TABLE_ROW_ODD="Modifier les lignes impaires"
WF_TABLE_ROW_EVEN="Modifier les lignes identiques"
WF_TABLE_ROW_ALL="Modifier toutes les lignes dans la table"
WF_TABLE_THEAD="En-tête du tableau"
WF_TABLE_TBODY="Corps du tableau"
WF_TABLE_TFOOT="Pied du tableau"
WF_TABLE_SCOPE="Application"
WF_TABLE_ROWGROUP="Groupe de lignes"
WF_TABLE_COLGROUP="Groupe de colonnes"
WF_TABLE_COL_LIMIT="Vous avez dépassé le nombre maximal de colonnes de {$cols}."
WF_TABLE_ROW_LIMIT="Vous avez dépassé le nombre maximal de lignes de {$rows}."
WF_TABLE_CELL_LIMIT="Vous avez dépassé le nombre maximal de cellules de {$cells}."
WF_TABLE_MISSING_SCOPE="Êtes-vous sûr de vouloir continuer sans spécifier l'en-tête du tableau ? Sans elle, les utilisateurs malvoyants auront de la peine à comprendre le thème des contenus."
WF_TABLE_CAPTION="Sous-titre du tableau"
WF_TABLE_FRAME="Cadre"
WF_TABLE_FRAME_NONE="aucun"
WF_TABLE_FRAME_GROUPS="groupes"
WF_TABLE_FRAME_ROWS="lignes"
WF_TABLE_FRAME_COLS="colonnes"
WF_TABLE_FRAME_ALL="tous"
WF_TABLE_RULES="Règles"
WF_TABLE_RULES_VOID="nul"
WF_TABLE_RULES_ABOVE="au-dessus"
WF_TABLE_RULES_BELOW="en-dessous"
WF_TABLE_RULES_HSIDES="hsides"
WF_TABLE_RULES_LHS="lhs"
WF_TABLE_RULES_RHS="rhs"
WF_TABLE_RULES_VSIDES="vsides"
WF_TABLE_RULES_BOX="boîte"
WF_TABLE_RULES_BORDER="bordure"

WF_TABLE_CELL_PROPS="Propriétés de la cellule"
WF_TABLE_COL_AFTER="Insérer une colonne après"
WF_TABLE_COL_BEFORE="Insérer une colonne avant"
WF_TABLE_COL_DELETE="Supprimer la colonne"
WF_TABLE_DELETE="Supprimer le tableau"
WF_TABLE_INSERT="Insérer/Modifier un tableau"
WF_TABLE_MERGE="Fusionner les cellules"
WF_TABLE_ROW_AFTER="Insérer une ligne après"
WF_TABLE_ROW_BEFORE="Insérer une ligne avant"
WF_TABLE_ROW_DELETE="Supprimer la ligne"
WF_TABLE_ROW_PROPS="Propriétés de la ligne"
WF_TABLE_SPLIT="Diviser la cellule"
WF_TABLE_PAD_EMPTY_CELLS="Remplir les cellules vides"
WF_TABLE_PAD_EMPTY_CELLS_DESC="Remplir les cellules vides des tableaux avec un espace insécable afin de maintenir l'aspect de la structure et les éléments de style tels la couleur de fond ou les bordures. 'Oui' par défaut."
WF_TABEL_COL="Colonne"
WF_TABEL_ROW="Ligne"

WF_TABLE_SHOW_BUTTONS="Afficher les boutons"
WF_TABLE_SHOW_BUTTONS_DESC="Afficher tous les boutons de gestion de tableau dans la barre d'outils de l'éditeur. Par défaut, tous les boutons seront affichés. Si vous choisissez 'Non', les boutons seront réduits en liste déroulante sur le bouton principal de gestion de tableau."

; Reference dialog
WF_REFERENCE_TITLE="Référence"
WF_REFERENCE_DESC="Baliser le contenu avec des éléments d'insertion, de suppression, d'acronyme et d'abréviation."
WF_REFERENCE_DATETIME_FORMAT="Format de date et heure"
WF_REFERENCE_DATETIME_FORMAT_DESC="Chaîne du format de date pour l'attribut datetime. Voir <a href='https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats#local_date_and_time_strings' target='_blank'>|(MDN Web Docs) Formats de date et d'heure utilisés en HTML</a>."

; Accessability
WF_ACCESSABILITY_USAGE_TITLE="Utilisation générale"

WF_TAB_META="Généralités"
WF_TAB_APPEARANCE="Apparence"

;## Styles Select ##
WF_STYLESELECT_STYLES="Liste des styles"
WF_STYLESELECT_STYLES_DESC="Sélectionnez les sources à utiliser pour les éléments de la liste des styles<ul><li>Feuilles de style de l'éditeur - Styles extraits des feuilles de style tels que configurés dans la configuration de l'éditeur, dans ce profil d'éditeur ou, le champ 'Feuille de style personnalisée' ci-dessous.</li><li>Styles et classes personnalisés : styles personnalisés créés dans la liste <strong>Styles personnalisés</strong> et classes répertoriées dans le champ <strong>Classes personnalisées</strong> .</li></ul>"
WF_STYLESELECT_STYLESHEET="Feuilles de style de l'éditeur"
WF_STYLESELECT_STYLES_CUSTOM="Styles et classes personnalisés"
WF_STYLESELECT_CUSTOM="Styles supplémentaires"
WF_STYLESELECT_CUSTOM_DESC="Vous pouvez créer des éléments de styles à intégrer dans la liste déroulante 'Styles CSS' de la barre d'outils de l'éditeur insérant en même temps plusieurs classes et/ou styles spécifiés ici.<br />Titre : le titre est obligatoire, c'est le nom affiché dans la liste déroulante.<br /> Balise : vous pouvez spécifier à quelle unique type de balise l'élément de style doit pouvoir s'appliquer.<br />Séleteur : vous pouvez spécifier à quel unique sélecteur l'élément de style doit pouvoir s'appliquer.<br />Classes CSS : vous pouvez indiquer des classes CSS à intégrer lors de l'application d'un élément de styles<br />Styles : vous pouvez indiquer des styles à intégrer lors de l'application d'un élément de styles.<br /><strong>Note :</strong> un élément de styles doit contenir au moins un titre et une classe ou un style pour pouvoir être enregistré."
WF_STYLESELECT_CUSTOM_CLASSES="Classes CSS supplémentaires"
WF_STYLESELECT_CUSTOM_CLASSES_DESC="Liste des classes CSS séparées par des virgules à intégrer dans la liste déroulante 'Styles CSS' de la barre d'outils de l'éditeur."
WF_STYLESELECT_STYLES_SORT="Trier les styles alphabétiquement"
WF_STYLESELECT_STYLES_SORT_DESC="Trier les styles extraits des feuilles de style par ordre alphabétique de A à Z"
WF_STYLESELECT_STYLES_PREVIEW_STYLES="Afficher l'aperçu des styles"
WF_STYLESELECT_STYLES_PREVIEW_STYLES_DESC="Affichez un aperçu simple et stylisé dans la liste des styles en utilisant ceux du template de site."
WF_STYLESELECT_STYLESHEET_CUSTOM="Feuille de style personnalisée"
WF_STYLESELECT_STYLESHEET_CUSTOM_DESC="Feuille de style personnalisée contenant des classes css à afficher dans la liste déroulante 'Styles CSS' de l'éditeur.<br /><strong>Attention</strong>, ces classes doivent également être présentes dans la feuille de style du template pour pouvoir s'afficher dans le site."

;## Non Editable ##
WF_NONEDITABLE_TITLE="Contenu non modifiable"
WF_NONEDITABLE_DESC="Marquer le contenu comme modifiable ou non à l'aide des classes spéciales 'mceEditable' et 'mceNonEditable'"
WF_NONEDITABLE_NONEDITABLE_CLASS="Classe de contenu non modifiable"
WF_NONEDITABLE_NONEDITABLE_CLASS_DESC="Nom de classe à utiliser pour marquer un contenu comme non modifiable. La valeur par défaut est <em>mceNonEditable</em>"
WF_NONEDITABLE_EDITABLE_CLASS="Classe de contenu modifiable"
WF_NONEDITABLE_EDITABLE_CLASS_DESC="Nom de classe à utiliser pour marquer un contenu comme modifiable dans les régions non modifiables existantes. La valeur par défaut est <em>mceEditable</em>"

;## Clipboard ##
WF_OPTION_CUT="Couper"
WF_OPTION_COPY="Copier"
WF_OPTION_PASTE="Coller avec styles"
WF_OPTION_PASTETEXT="Coller du texte brut"
WF_CLIPBOARD_DESC="Fonctions couper, copier, coller du 'Presse papier' hérité de votre système d'exploitation et de votre navigateur."
WF_CLIPBOARD_TITLE="Couper, copier, coller"

;## Preview ##
WF_PREVIEW_PARAM_PROCESS_CONTENT="Plugins de contenu"
WF_PREVIEW_PARAM_PROCESS_CONTENT_DESC="Activer le processus de chargement des plugins de contenu Joomla avant d'afficher l'aperçu."

WF_LOREM_IPSUM="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua."

WF_LINK_SEARCH_REMOVE_ALIAS="Supprimer l'alias"
WF_LINK_SEARCH_REMOVE_ALIAS_DESC="Supprimer l'alias des liens trouvés"

WF_PARAM_WORDCOUNT_LIMIT="Limite du nombre de mots"
WF_PARAM_WORDCOUNT_LIMIT_DESC="Lorsqu'une limite est définie le nombre de mots restants  est indiqué, avec un nombre négatif lorsque la limite est dépassée. La valeur 0 permet de ne pas imposer de limite."
WF_PARAM_WORDCOUNT_ALERT="Alerte du nombre de mots"
WF_PARAM_WORDCOUNT_ALERT_DESC="Afficher un message d'alerte lorsque la limite du nombre de mots maximal autorisé est atteinte."

WF_CHARMAP_APPEND="Ajouter des caractères"
WF_CHARMAP_APPEND_DESC="Ajoutez des caractères à la table des caractères en utilisant des paires clé/valeur, où la clé est le code numérique du caractère tel : &amp;#8756; et la valeur est le nom du caractère tel : Therefore"
WF_CHARMAP_APPEND_CODE="Code"
WF_CHARMAP_APPEND_TEXT="Description"

WF_JOOMLABUTTONS_TITLE="Boutons Joomla Editor-Xtd"
WF_JOOMLABUTTONS_DESC="Affichez une liste déroulante avec les raccourcis des plugins Joomla Editor-Xtd dans la barre d'outils de l'éditeur plutôt que de les afficher sous forme de boutons sous l'éditeur."

WF_LANGCODE_TITLE="Code langue"
WF_LANGCODE_DESC="Insérer/Modifier un code langue"

;## Emotions ##
WF_EMOTIONS_TITLE="Émoticônes"
WF_EMOTIONS_DESC="Insérer une émoticône dans le contenu (illustration de personnage émotif)."
WF_EMOTIONS_PARAM_URL="URL des émoticônes"
WF_EMOTIONS_PARAM_URL_DESC="URL relative du dossier des images des émoticônes. Le dossier par défaut est le dossier 'img' de ce plugin (components/com_jce/editor/tiny_mce/plugins/emotions/img)."
WF_EMOTIONS_PARAM_SMILIES="Liste d'émoticônes"
WF_EMOTIONS_PARAM_SMILIES_DESC="Liste d'émoticônes séparés par des virgules, incluant l'extension. Par exemple: smiley-confused.gif, smiley-cool.gif"

;## Simple Dialogs ##
WF_URL_FILE_BROWSER="Accès gestionnaire de fichiers"
WF_URL_FILE_BROWSER_DESC="Activer l'accès au gestionnaire de fichiers par une icône dans le champ URL pour permettre de gérer les fichiers et sélectionner celui à insérer."

WF_FILE_BROWSER_OPTIONS="Options du gestionnaire de fichiers"

WF_PARAM_BASIC_DIALOG="Utiliser la boîte de dialogue de base"
WF_PARAM_BASIC_DIALOG_DESC="Utiliser une boîte de dialogue simplifiée pour ce plugin."

; Startup Content
WF_PARAM_STARTUP_CONTENT="Contenu initial dans l'éditeur"
WF_PARAM_STARTUP_CONTENT_DESC="Sélectionnez un fichier ou un contenu HTML à charger par défaut dans l'éditeur."
WF_PARAM_STARTUP_CONTENT_URL="Fichier"
WF_PARAM_STARTUP_CONTENT_URL_DESC="URL relative d'un fichier HTML ou texte à charger par défaut dans l'éditeur."
WF_PARAM_STARTUP_CONTENT_HTML="HTML"
WF_PARAM_STARTUP_CONTENT_HTML_DESC="Snippet HTML à utiliser comme contenu par défaut dans l'éditeur."

; Search Plugins
PLG_SEARCH_CONTENT_CONTENT="Articles"
PLG_SEARCH_CATEGORIES_CATEGORIES="Catégories"
PLG_SEARCH_CONTACTS_CONTACTS="Contacts"
PLG_SEARCH_TAGS_TAGS="Tags"
PLG_SEARCH_WEBLINKS_WEBLINKS="Liens web"

WF_PARAM_FIGURE_TAG_STYLE="Styles Figure"
WF_PARAM_FIGURE_TAG_STYLE_DESC="Donnez un style aux balises Figure et Figcaption pour améliorer l'affichage du contenu. Cela est souvent nécessaire pour remplacer le style inapproprié appliqué à ces balises par le template et le navigateur."

;## Ajouts de strings manquantes ##
WF_LABEL_ADD="Ajouter"
WF_LABEL_LINKS="Liens"
WF_LABEL_REMOVE="Supprimer"
WF_LABEL_UPDATE="Appliquer & Fermer"
WF_LABEL_VALUE="Valeur"
WF_CPANEL_BROWSER_HEIGHT_DESC="Hauteur de la fenêtre du gestionnaire de fichiers de JCE."
WF_FILEMANAGER_REPLACE_TEXT_DESC="Remplacer le texte du lien avec le nom du fichier ?"
WF_IMAGE_EDITOR_EFFECTS="Effets d'image"
WF_LABEL_BACKGROUND="Fond"
WF_LABEL_PROPERTY="Propriétés"
WF_OPTION_FILEMANAGER_FORMAT_LINK="Lien sur fichier"
WF_OPTION_FILEMANAGER_FORMAT_IFRAME="Fenêtre intégrée (iframe)"
WF_OPTION_JUSTIFIED="Justifié"
WF_PROFILES_PLUGINS__DEFAULT="Paramètres standards"
WF_STYLES_TEXT_FONT_DESC="Polices d'écriture::Liste des polices d'écriture applicable à l'élément sélectionné. Note : Seules les polices disponibles sur tous les systèmes sont affichées ici."
WF_STYLES_TEXT_SIZE_DESC="Taille::Taille de la police d'écriture appliquée à l'élément sélectionné. Note : Vous pouvez indiquer la valeur souhaitée ou la choisir dans la liste déroulante si présente."
WF_STYLES_TEXT_WEIGHT_DESC="Épaisseur::Épaisseur de la police d'écriture appliquée à l'élément sélectionné. Note : Vous pouvez indiquer la valeur souhaitée ou la choisir dans la liste déroulante si présente."
LINK="Liens internes"
WF_PARAM_VALIDATE_STYLES="Validation des styles"
WF_PARAM_VALIDATE_STYLES_DESC="N'autorisez qu'une syntaxe CSS valide pour la valeur d'attribut style sur tous les éléments."
BOOKMARK="Signet"
CHAPTER="Chapitre"
COMPONENTS="Composants"
CONTENTS="Articles"
HELP="Aide"
LAYOUTS="Mise en page"
LIBRARIES="Bibliothèque de scripts"
NEXT="Suivant"
PREV="Précédent"

PARAGRAPH="Paragraphe (p)"
DIV="Div (div)"
HEADING1="Titre 1 (title1)"
HEADING2="Titre 2 (title2)"
HEADING3="Titre 3 (title3)"
HEADING4="Titre 4 (title4)"
HEADING5="Titre 5 (title5)"
HEADING6="Titre 6 (title6)"
BLOCKQUOTE="Retrait (blockquote)"
ADDRESS="Adresse (address)"
CODE="Code (code)"
PREFORMATTED="Préformaté (pre)"
SAMPLE="Code exemple (samp)"
SPAN="Span (span)"
SECTION="Section (section)"
ARTICLE="Article (article)"
ASIDE="Aparté (aside)"
HEADER="En-tête (header)"
FOOTER="Pied de page (footer)"
NAV="Navigation (nav)"
FIGURE="Figure (figure)"

WF_LINK_AUTOLINK_EMAIL="Lien e-mail automatique"
WF_LINK_AUTOLINK_EMAIL_DESC="Créer le lien vers l'e-mail automatiquement lors de son insertion dans le champ de l'éditeur."
WF_LINK_AUTOLINK_URL="Lien URL automatique"
WF_LINK_AUTOLINK_URL_DESC="Créer le lien vers l'URL automatiquement lors de son insertion dans le champ de l'éditeur."

WF_LINKS_JOOMLALINKS_TAGS="Tags"
WF_LINKS_JOOMLALINKS_PARAM_TAGS="Liste des tags"
WF_LINKS_JOOMLALINKS_PARAM_TAGS_DESC="Afficher la liste des liens vers les tags."
WF_LINKS_JOOMLALINKS_PARAM_TAGS_ALIAS="Ajouter l'alias du tag"
WF_LINKS_JOOMLALINKS_PARAM_TAGS_ALIAS_DESC="Ajouter l'alias du tag dans le lien"

;## Supprimés ##
WF_PASTE_PARAM_NONE="Aucun"
WF_PASTE_PARAM_MSO="Spécifique Office/Word"
WF_PARAM_UPLOAD_RUNTIME="Moteur d'envoi de fichiers"
WF_PARAM_UPLOAD_RUNTIME_DESC="Sélectionnez et trier les moteurs utilisés par l'envoi des fichiers, le premier de la liste sera utilisé."
WF_PARAM_UPLOAD_RUNTIME_FLASH="Adobe Flash"
WF_PARAM_UPLOAD_RUNTIME_SILVERLIGHT="Microsoft Silverlight"
WF_PARAM_UPLOAD_RUNTIME_HTML5="HTML 5"
WF_PARAM_UPLOAD_RUNTIME_HTML4="HTML 4"
WF_TABLE_MERGE_TITLE="Fusionner les cellules"

;## Supprimé dans JCE 2.7 ##
;#################### Updates ###########################################
WF_UPDATES="Mises à jour"
WF_UPDATES_UPDATE="Mise à jour"
WF_UPDATES_CHECK="Vérifier les mises à jour"
WF_UPDATES_CHECKING="Vérification de mises à jour..."
WF_UPDATES_DOWNLOAD="Télécharger les mises à jour sélectionnées"
WF_UPDATES_INSTALL="Installer les mises à jour sélectionnées"
WF_UPDATES_INSTALLED="Installé"
WF_UPDATES_NAME="Nom"
WF_UPDATES_VERSION="Version"
WF_UPDATES_AVAILABLE="Mises à jour disponibles"
WF_UPDATES_NONE="Aucune mise à jour disponible"
WF_UPDATES_TYPE="Type"
WF_UPDATES_FULL="Installation complète"
WF_UPDATES_PATCH="Patch de mise à jour"
WF_UPDATES_PRIORITY="Priorité"
WF_UPDATES_HIGH="Haute"
WF_UPDATES_MEDIUM="Moyenne"
WF_UPDATES_LOW="Basse"
WF_UPDATES_AUTH_FAIL="Vous devez avoir un abonnement valable pour mettre à jour ce complément JCE. Veuillez le renouveler ou en créer un.<br />Si vous possédez déjà un abonnement, cliquez sur l'icône 'Paramètres' en haut à droite du composant JCE et insérer la clé fournie, disponible également dans votre profil sur le site de l'auteur."
WF_UPDATES_INSTALL_ERROR="Impossible d'installer la mise à jour."
WF_UPDATES_INFO="Information de mise à jour"
WF_UPDATES_INSTALL_INFO="Information d'installation"
WF_UPDATES_DOWNLOAD_ERROR="Erreur de mise à jour : échec du téléchargement de fichier"
WF_UPDATES_DOWNLOAD_ERROR_DATA_TRANSFER="Erreur de mise à jour : échec du transfert de données"
WF_UPDATES_DOWNLOAD_ERROR_MISSING_DATA="Erreur de mise à jour : données manquantes"
WF_UPDATES_DOWNLOAD_ERROR_NO_CONNECT="Erreur de mise à jour : échec de connexion au serveur de mise à jour"
WF_UPDATES_ERROR_FILE_VERIFICATION_FAIL="Erreur de mise à jour : la vérification du fichier a échoué."
WF_UPDATES_ERROR_FILE_MISSING_OR_INVALID="Erreur de mise à jour : fichier manquant ou invalide."
WF_UPDATES_ERROR_FILE_EXTRACT_FAIL="Erreur de mise à jour : extraction de fichiers échouée, vérifiez les droits d'écriture."
WF_UPDATES_NOSUPPORT="Mise à jour non disponible"
WF_UPDATES_READMORE="Afficher plus"
WF_UPDATES_READLESS="Réduire"

;#################### Installer #######################################
WF_INSTALLER_TITLE="Compléments JCE"
WF_INSTALLER_DESC="Installation et gestion des compléments JCE<br />(plugins, extensions et langues)"
WF_INSTALLER_INSTALL="Installation"
WF_INSTALLER_UNINSTALL="Désinstallation"
WF_INSTALLER_PLUGINS="Plugins"
WF_INSTALLER_PLUGIN="Plugin"
WF_INSTALLER_RESULT="Résultat"
WF_INSTALLER_ADDON="Compléments"
WF_INSTALLER_TYPE="Type"
WF_INSTALLER_VERSION="Version"
WF_INSTALLER_PLUGINS_INSTALLED="Tous les plugins sont correctement installés"
WF_INSTALLER_PLUGIN_INSTALL="Installation du plugin"
WF_INSTALLER_PLUGIN_UNINSTALL="Désinstallation du plugin"
WF_INSTALLER_NO_PLUGINS="Aucun plugin additionnel n'est installé"
WF_INSTALLER_MKDIR_ERROR="Impossible de créer le répertoire"
WF_INSTALLER_EXTENSIONS="Extensions"
WF_INSTALLER_EXTENSION="Extension"
WF_INSTALLER_EXTENSION_INSTALL="Installation de l'extension"
WF_INSTALLER_EXTENSION_UNINSTALL="Désinstallation de l'extension"
WF_INSTALLER_EXTENSION_FIELD_EMPTY="Champ de l'extension vide, impossible de supprimer les fichiers"
WF_INSTALLER_EXTENSION_NO_PLUGIN="Plugin associé non installé"
WF_INSTALLER_EXTENSION_VERSION_ERROR="Extension incompatible ; une version plus récente de cette extension est nécessaire, veuillez effectuer sa mise à jour"
WF_INSTALLER_EXTENSION_PLUGIN_MANIFEST_ERROR="Impossible de localiser le fichier d'installation du plugin"
WF_INSTALLER_NO_PLUGIN_FILE="Aucun fichier de plugin spécifié dans l'installation"
WF_INSTALLER_PHP_INSTALL_FILE_ERROR="Impossible de copier le fichier PHP d'installation"
WF_INSTALLER_PHP_UNINSTALL_FILE_ERROR="Impossible de copier le fichier PHP de désinstallation"
WF_INSTALLER_EXISTS="%s est déjà installé"
WF_INSTALLER_PLUGIN_EXTENSION_ERROR="Impossible d'installer l'extension %s"
WF_INSTALLER_PLUGIN_PROFILE_ERROR="Impossible d'ajouter le plugin dans le groupe *Default*"
WF_INSTALLER_SETUP_COPY_ERROR="Impossible de copier le fichier de configuration"
WF_INSTALLER_CUSTOM_INSTALL_ERROR="Échec de la routine de l'installation personnalisée"
WF_INSTALLER_CUSTOM_UNINSTALL_ERROR="Échec de la routine de désinstallation personnalisée"
WF_INSTALLER_EXTENSIONS_INSTALLED="Tous les plugins et extensions sont correctement installés"
WF_INSTALLER_LANGUAGES="Langues"
WF_INSTALLER_PLUGIN_FIELD_EMPTY="Champ du plugin vide, impossible de supprimer les fichiers"
WF_INSTALLER_MANIFEST_LOAD_ERROR="Impossible de charger le fichier d'installation"
WF_INSTALLER_MANIFEST_INVALID="Fichier d'installation invalide"
WF_INSTALLER_REMOVE_EXTENSION_ERROR="Impossible de supprimer l'extension"
WF_INSTALLER_REMOVE_FROM_PROFILE_ERROR="Impossible de supprimer du profil %s"
WF_INSTALLER_MANIFEST_ERROR="Fichier d'installation invalide ou introuvable. L'entrée a été supprimée dans la base de données mais les fichiers ne sont probablement pas supprimés, veuillez vérifier."
WF_INSTALLER_LANGUAGE_INSTALL="Installation de la langue"
WF_INSTALLER_LANGUAGE="Langue"
WF_INSTALLER_LANGUAGE_UNINSTALL="Désinstallation de la langue"
WF_INSTALLER_LANGUAGE_NO_TAG="Aucun tag de langue spécifié dans le fichier d'installation"
WF_INSTALL_DELETE_FILES_ERROR="Impossible de supprimer les fichiers, vérifiez s'ils ne sont pas verrouillés (CHMOD)"
WF_INSTALLER_LANGUAGE_PATH_EMPTY="Chemin du fichier d'installation de langue absent, impossible de supprimer les fichiers"
WF_INSTALLER_BROWSE="Parcourir..."
WF_INSTALLER_UPLOAD="Installer"
WF_INSTALLER_FILETYPE_ERROR="Type de fichier incorrect ; sont admis : zip,tar,gz,gzip,tgz,tbz2,bz2 ou bzip2 "
WF_INSTALLER_RELATED="Plugins liés à Joomla!"
WF_INSTALLER_NO_RELATED="Aucun plugin lié à Joomla! n'est installé"
WF_INSTALLER_LEGACY_ERROR="Extension Legacy - Ne peut être installée"
WF_INSTALLER_NO_PACKAGE="Échec de l'installation  - Impossible de localiser le fichier d'installation"
WF_INSTALLER_INVALID_SRC="Échec de l'installation - Dossier d'installation invalide"
WF_INSTALLER_NO_FILE="Échec de l'installation - Aucun fichier spécifié"
WF_INSTALLER_PACKAGE="Fichier ou chemin du dossier"
WF_INSTALLER_PACKAGE_DESC="Sélectionnez le fichier d'installation ou spécifiez son chemin complet sur le serveur ou, celui du dossier contenant ses fichiers décompressés"
WF_INSTALLER_INSTALL_DESC="Sélectionnez le fichier d'installation ou spécifiez son chemin complet sur le serveur ou, celui du dossier contenant ses fichiers décompressés"
WF_INSTALLER_UNINSTALL_DESC="Sélectionnez les compléments à supprimer : Extension, Plugin ou Langue"
WF_INSTALLER_PLUGINS_DESC="Liste des plugins JCE installés ; exemple: Captions, IFrames, etc."
WF_INSTALLER_EXTENSIONS_DESC="Liste des extensions JCE installées ; exemple: Fichier système, Liens, MediaPlayer, etc."
WF_INSTALLER_LANGUAGES_DESC="Liste des langues pour JCE installées ; l'anglais, langue par défaut, ne peut pas être supprimé"
WF_INSTALLER_RELATED_DESC="Liste des plugins JCE installés, liés à Joomla! ; exemple: JCE MediaBox"
WF_INSTALLER_HELP="Aide à l'installation de compléments JCE"
WF_INSTALLER_HELP_ABOUT="A propos de l'installeur JCE"
WF_INSTALLER_HELP_REMOVE="Suppression de compléments"
WF_INSTALLER_HELP_REMOVE_PLUGINS="Plugins"
WF_INSTALLER_HELP_REMOVE_LANGUAGES="Langues"
WF_INSTALLER_HELP_REMOVE_RELATED="Plugins liés à Joomla!"
WF_INSTALLER_HELP_INSTALL="Compléments installés"
WF_INSTALL_SUMMARY="Résumé d'installation du pack JCE"
WF_INSTALLER_HELP_INSTALL_UPLOAD="Installation par fichier ou dossier"
WF_INSTALLER_HELP_INSTALL_SEARCH="Recherche et réparation"
WF_INSTALLER_INCORRECT_VERSION="Complément incompatible ; une version plus récente est nécessaire, veuillez effectuer sa mise à jour"
WF_INSTALLER_WARNCOREPLUGIN="%s est plugin système et ne peut être supprimé"
WF_INSTALLER_WARNCOREEXTENSION="%s est une extension système et ne peut être supprimée"
WF_INSTALLER_PLUGIN_FOLDER_ERROR="Impossible de supprimer le dossier du plugin ; veuillez le supprimer manuellement"
WF_INSTALLER_FTP="Détails de connexion FTP"
WF_INSTALLER_FTP_DESC="Pour installer et désinstaller des compléments, suivant la configuration de votre serveur (droits CHMOD), vous pouvez être amené à indiquer dans les champs ci-dessous vos paramètres d'accès FTP"
WF_INSTALLER_NO_LANGUAGES="Aucune langue installée"

WF_INSTALLER_INSTALL_SUCCESS="Extension installée avec succès"
WF_INSTALLER_INSTALL_ERROR="Erreur d'installation de l'extension"
WF_INSTALLER_UNINSTALL_SUCCESS="Extension supprimée avec succès"
WF_INSTALLER_UNINSTALL_ERROR="Erreur de suppression de l'extension"

WF_INSTALLER_EXTRACT_ERROR="Impossible d'extraire l'archive."
WF_INSTALLER_WARNINSTALLZLIB="L'extension zlib pour PHP n'est pas disponible."

; ## Youtube Aggregator ##
WF_AGGREGATOR_YOUTUBE_WIDTH_DESC="Largeur par défaut de la vidéo"
WF_AGGREGATOR_YOUTUBE_HEIGHT_DESC="Hauteur par défaut de la vidéo"


; ## Ajout chaînes manquantes ##
JFIELD_ORDERING_DESC="Ordre d'affichage des profils définissant leur priorité de prise en compte."
JGLOBAL_FIELD_ID_DESC="Numéro d'enregistrement (id) du profil dans la base de données."
RESIZE="Redimension"

;## Supprimé dans JCE 2.8 ##
WF_PREFERENCES_HELP="Aide des paramètres"
WF_PARAM_EDITOR_SKIN_MOBILE="Toucher"
WF_AGGREGATOR_YOUTUBE_SHOWINFO="Afficher les infos"
WF_AGGREGATOR_YOUTUBE_SHOWINFO_DESC="Afficher les infos::Afficher le titre de la vidéo et les actions du lecteur"

; Search/Replace dialog
WF_SEARCHREPLACE_NOTFOUND="La recherche est terminée. L'élément recherché n'a pas pu être trouvée."
WF_SEARCHREPLACE_SEARCH_TITLE="Trouver"
WF_SEARCHREPLACE_REPLACE_TITLE="Rechercher/remplacer"
WF_SEARCHREPLACE_ALLREPLACED="Toutes les occurrences de l'élément recherché ont été remplacées."
WF_SEARCHREPLACE_FINDWHAT="Rechercher"
WF_SEARCHREPLACE_REPLACEWITH="Remplacer par"
WF_SEARCHREPLACE_MCASE="Respecter la casse"
WF_SEARCHREPLACE_FIND="Rechercher"
WF_SEARCHREPLACE_NEXT="Suivant"
WF_SEARCHREPLACE_PREV="Précédent"
WF_SEARCHREPLACE_DIRECTION="Direction"
WF_SEARCHREPLACE_UP="Vers le haut"
WF_SEARCHREPLACE_DOWN="Vers le bas"
WF_SEARCHREPLACE_REPLACE="Remplacer"
WF_SEARCHREPLACE_REPLACEALL="Rempl. tous"
WF_SEARCHREPLACE_WHOLEWORDS="Mots entiers"

; ## Supprimé dans JCE 2.8.4 ##
; ## Google Maps Aggregator ##
WF_AGGREGATOR_GOOGLEMAPS_TITLE="Google Maps"
WF_AGGREGATOR_GOOGLEMAPS_DESC="Google Maps - Source de média externe"

WF_AGGREGATOR_GOOGLEMAPS_HEIGHT_DESC="Hauteur par défaut à utiliser pour la carte"
WF_AGGREGATOR_GOOGLEMAPS_WIDTH_DESC="Largeur par défaut à utiliser pour la carte"

; ## Vine Aggregator
WF_AGGREGATOR_VINE_TITLE="Vine"
WF_AGGREGATOR_VINE_DESC="Vine - Resource média externe"
WF_AGGREGATOR_VINE_TYPE="Type"
WF_AGGREGATOR_VINE_TYPE_DESC="Type::Mise en page de la vidéo"
WF_AGGREGATOR_VINE_SIZE="Poids"
WF_AGGREGATOR_VINE_SIZE_DESC="Taille::Taille de la vidéo"
WF_AGGREGATOR_VINE_SIMPLE="Simple"
WF_AGGREGATOR_VINE_POSTCARD="Carte postale"
WF_AGGREGATOR_VINE_AUDIO="Lecture audio automatique"

; ## Supprimé dans JCE 2.9.1 ##
COM_JCE_N_ITEMS_DELETED_1="%s profil supprimé."
COM_JCE_N_ITEMS_EXPORTED_1="%s profil importé."
COM_JCE_N_ITEMS_COPIED_1="%s profil copié."
COM_JCE_N_ITEMS_PUBLISHED_1="%s profil publié."
COM_JCE_N_ITEMS_UNPUBLISHED_1="%s profil dépublié."
WF_PARAM_CDATA="Scripts XHTML intégrés"
WF_PARAM_CDATA_DESC="Si oui, le JavaScript est encadré de la balise CDATA pour optimiser la validation XHTML."

WF_SEARCH_SEARCH_KEYWORD_N_RESULTS_1="<strong>Total: un résultat trouvé.</strong>"

;## Window Popups ##
WF_POPUPS_WINDOW_TITLE="Popups HTML"
WF_POPUPS_WINDOW_DESC="Affichage du lien dans une fenêtre popup HTML classique ; attention, peut être bloqué par les anti-popup."
WF_POPUPS_WINDOW_OPTION_TITLE="Titre"
WF_POPUPS_WINDOW_OPTION_TITLE_DESC="Titre::Titre de la fenêtre popup."
WF_POPUPS_WINDOW_MODE="Type de fenêtre"
WF_POPUPS_WINDOW_MODE_DESC="Type de fenêtre::Basique : affiche uniquement le contenu<br />Avancé : inclus les options du bouton d'impression, de la désactivation du clic droit, des ascenseurs et de la redimension."
WF_POPUPS_WINDOW_OPTIONS="Options"
WF_POPUPS_WINDOW_SCROLLBARS="Ascenseurs"
WF_POPUPS_WINDOW_SCROLLBARS_DESC="Ascenseurs::Afficher les ascenseurs si le contenu est plus grand que la fenêtre."
WF_POPUPS_WINDOW_RESIZABLE="Redimensionner"
WF_POPUPS_WINDOW_RESIZABLE_DESC="Redimensionner::Autoriser la redimension de la fenêtre."
WF_POPUPS_WINDOW_POSITION="Position"
WF_POPUPS_WINDOW_POSITION_DESC="Position::Position du popup dans la fenêtre du navigateur."
WF_POPUPS_WINDOW_LOCATIONBAR="Afficher la barre d'adresse"
WF_POPUPS_WINDOW_LOCATIONBAR_DESC="Afficher barre d'adresse::Afficher la barre d'adresse URL dans la fenêtre popup."
WF_POPUPS_WINDOW_TOOLBAR="Afficher la barre d'outils"
WF_POPUPS_WINDOW_TOOLBAR_DESC="Afficher la barre d'outils::Afficher la barre d'outils du navigateur dans la fenêtre popup."
WF_POPUPS_WINDOW_LOCATION="Afficher la barre d'adresse"
WF_POPUPS_WINDOW_LOCATION_DESC="Afficher la barre d'adresse::Afficher la barre d'adresse URL du navigateur dans la fenêtre popup."
WF_POPUPS_WINDOW_STATUS="Afficher la barre de statut"
WF_POPUPS_WINDOW_STATUS_DESC="Afficher la barre de statut::Afficher la barre de statut du navigateur dans la fenêtre popup."
WF_POPUPS_WINDOW_MENUBAR="Afficher la barre des menus"
WF_POPUPS_WINDOW_MENUBAR_DESC="Afficher la barre des menus::Afficher la barre des menus du navigateur dans la fenêtre popup."

;## Supprimé dans JCE 2.9.31 ##
; XHTMLXtras dialog
WF_XHTMLXTRAS_ATTRIBUTE_LABEL_TITLE="Titre"
WF_XHTMLXTRAS_ATTRIBUTE_LABEL_ID="ID"
WF_XHTMLXTRAS_ATTRIBUTE_LABEL_CLASS="Classe"
WF_XHTMLXTRAS_ATTRIBUTE_LABEL_STYLE="Style"
WF_XHTMLXTRAS_ATTRIBUTE_LABEL_CITE="Citer"
WF_XHTMLXTRAS_ATTRIBUTE_LABEL_DATETIME="Date/Heure"
WF_XHTMLXTRAS_ATTRIBUTE_LABEL_LANGDIR="Direction du texte"
WF_XHTMLXTRAS_ATTRIBUTE_OPTION_LTR="Gauche à droite"
WF_XHTMLXTRAS_ATTRIBUTE_OPTION_RTL="Droite à gauche"
WF_XHTMLXTRAS_ATTRIBUTE_LABEL_LANGCODE="Langue"
WF_XHTMLXTRAS_ATTRIBUTE_LABEL_TABINDEX="Index de table"
WF_XHTMLXTRAS_ATTRIBUTE_LABEL_ACCESSKEY="Clé d'accès"
WF_XHTMLXTRAS_ATTRIBUTE_EVENTS_TAB="Événements"
WF_XHTMLXTRAS_ATTRIBUTE_ATTRIB_TAB="Attributs"
WF_XHTMLXTRAS_GENERAL_TAB="Général"
WF_XHTMLXTRAS_ATTRIB_TAB="Attributs"
WF_XHTMLXTRAS_EVENTS_TAB="Événements"
WF_XHTMLXTRAS_FIELDSET_GENERAL_TAB="Paramètres généraux"
WF_XHTMLXTRAS_FIELDSET_ATTRIB_TAB="Attributs de l'élément"
WF_XHTMLXTRAS_FIELDSET_EVENTS_TAB="Événements"
WF_XHTMLXTRAS_TITLE_INS_ELEMENT="Insertion"
WF_XHTMLXTRAS_TITLE_DEL_ELEMENT="Suppression"
WF_XHTMLXTRAS_TITLE_ACRONYM_ELEMENT="Acronyme"
WF_XHTMLXTRAS_TITLE_ABBR_ELEMENT="Abréviation"
WF_XHTMLXTRAS_TITLE_CITE_ELEMENT="Citation"
WF_XHTMLXTRAS_REMOVE="Supprimer"
WF_XHTMLXTRAS_INSERT_DATE="Insérer la date et l'heure actuel"
WF_XHTMLXTRAS_OPTION_LTR="Gauche à droite"
WF_XHTMLXTRAS_OPTION_RTL="Droite à gauche"

; #Supprimé dans JCE 2.9.37
WF_MEDIA_PARAM_STRICT="Flash en strict XHTML "
WF_MEDIA_PARAM_STRICT_DESC="Appliquer l'encodage XHTML sctrict pour les fichiers Flash (sans balise 'embed')"
WF_MEDIA_VERSION_FLASH="Version Adobe® Flash® Player"
WF_MEDIA_VERSION_WINDOWSMEDIA="Version Windows® Media Player"
WF_MEDIA_VERSION_QUICKTIME="Version Apple Quicktime® Player"
WF_MEDIA_VERSION_SHOCKWAVE="Version Adobe® Shockwave® Player"
WF_MEDIA_VERSION_JAVA="Version Java"

; #Supprimé dans JCE 2.9.74
WF_PREFERENCES_SECUREPARAMS="Crypter les paramètres des profils"
WF_PREFERENCES_SECUREPARAMS_DESC="Crypter les paramètres des profils JCE en utilisant le standard de cryptage avancé AES128."

;#################### Editor Install ################################
WF_EDITOR_FILES_ERROR="Fichiers de l'éditeur manquants ; veuillez installer le <a href='https://www.joomlacontenteditor.net/support/installation/editor' target='_blank' title='Editor Installation'>Plugin éditeur JCE</a> pour Joomla!"
WF_EDITOR_ENABLED_ERROR="L'éditeur JCE n'est pas activé ; veuillez l'activer dans la gestion des plugins de Joomla!"
WF_EDITOR_DEFAULT_NOTICE="L'éditeur JCE n'est pas l'éditeur par défaut dans la configuration de Joomla!"
WF_EDITOR_INSTALLED_ERROR="Le Plugin éditeur JCE n'est pas installé ; veuillez l'installer par l'installateur de Joomla! ou, décompresser ses fichiers et les envoyer sur le serveur dans leur répertoire de destination et effectuer la finalisation de l'installation depuis le composant"
WF_EDITOR_INSTALLED_MANUAL_ERROR="Les fichiers du plugin éditeur JCE sont présents sur le serveur mais l'installation n'est pas finalisée"
WF_EDITOR_INSTALL="[Finaliser l'installation de l'éditeur JCE]"
WF_EDITOR_FILES_MISSING="Les fichiers de l'éditeur JCE sont absents du serveur"
WF_EDITOR_INSTALL_SUCCESS="Le plugin éditeur JCE a été installé avec succès"
WF_EDITOR_NONE="Aucun éditeur installé"
WF_EDITOR_EXTRACT_ERROR="Erreur lors de l'extraction des fichiers"
WF_EDITOR_REMOVE_ERROR="Impossible de supprimer le plugin éditeur JCE"
WF_EDITOR_REMOVE_SUCCESS="Le plugin éditeur JCE a été supprimé avec succès"
WF_EDITOR_REMOVE_NOT_FOUND="Erreur lors de la suppression du plugin éditeur JCE : l'éditeur est introuvable"

WF_COLORPICKER_TEMPLATE_DESC="Les couleurs suivantes ont été extraites des feuilles de style du template"
WF_PARAM_CALLBACK="Appel de fichier personnalisé"
WF_PARAM_CALLBACK_DESC="Chemin relatif depuis la racine du site du fichier contenant les appels de commandes de l'éditeur."

;#################### Editor ################################
WF_COMPONENT_MISSING="Le composant d'administration de JCE n'est pas installé! L'éditeur JCE ne peut pas fonctionner sans lui!"
WF_COMPONENT_VERSION_ERROR="La version %s du composant WF_Administration est requise. Veuillez télécharger et installer cette version. <a target='_blank' title='Télécharger' href='https://www.joomlacontenteditor.net/downloads/editor'>[Télécharger]</a>"

WF_XHTMLXTRAS_TITLE="XHTML Extras"
WF_XHTMLXTRAS_DESC="Ajouter des propriétés supplémentaires sur un élément comme l'insertion, la suppression, l'acronyme et l'abréviation."
WF_TAB_PAGEBREAK="Saut de page"
;#################### Search Replace ############################################
WF_TAB_SEARCH="Recherche"
WF_TAB_FIND="Rechercher"
WF_TAB_REPLACE="Remplacer"

;###############Ajoutés##############

WF_PARAM_EDITOR_PROFILE_SANITIZE_HTML_DESC="Définissez sur Oui (recommandé) pour utiliser DOMPurify afin de supprimer les éléments, les attributs et les URL risqués afin de prévenir les attaques XSS (Cross-Site Scripting). Cela fonctionne indépendamment de la validation HTML. Si Hérité est sélectionné, les paramètres de configuration globale pour ce paramètre seront utilisés."language/fr-FR/fr-FR.plg_system_highlight.ini000060400000001031152453623440015073 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_SYSTEM_HIGHLIGHT="Système - Mise en évidence"
PLG_SYSTEM_HIGHLIGHT_XML_DESCRIPTION="Ce plug-in permet de mettre en évidence  des termes spécifiques."

language/fr-FR/fr-FR.plg_system_p3p.sys.ini000060400000001216152453623440014450 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_P3P_XML_DESCRIPTION="Le système P3P policy permet à Joomla! de placer une chaîne de tags dans l'en-tête HTTP.<br />Ceci est nécessaire pour que les sessions fonctionnent avec certains navigateurs comme Internet Explorer 6 et 7."
PLG_SYSTEM_P3P="Système - P3P Policy"language/fr-FR/fr-FR.mod_quickicon.sys.ini000060400000001174152453623440014327 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

MOD_QUICKICON="Icônes de raccourcis"
MOD_QUICKICON_XML_DESCRIPTION="Le module 'mod_quickicon' affiche des icônes de raccourcis sur la page d'accueil de l'administration appelée également 'Panneau d'administration'."
MOD_QUICKICON_LAYOUT_DEFAULT="Défaut"language/fr-FR/fr-FR.plg_finder_categories.sys.ini000060400000001361152453623440016017 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_FINDER_CATEGORIES="Indexation - Catégories"
PLG_FINDER_CATEGORIES_ERROR_ACTIVATING_PLUGIN="Impossible d'activer automatiquement le plug-in 'Indexation - Catégories'. Veuillez l'activer manuellement."
PLG_FINDER_CATEGORIES_XML_DESCRIPTION="Ce plug-in permet l'indexation des catégories de Joomla dans la recherche avancée."
PLG_FINDER_STATISTICS_CATEGORY="Catégorie"
language/fr-FR/fr-FR.plg_authentication_cookie.ini000060400000004101152453623440016071 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_AUTH_COOKIE_ERROR_LOG_INVALIDATED_COOKIES="Les identifiants de sécurité d'authentification ont été invalidés pour l'utilisateur %u parce qu'il n'y avait aucun enregistrement correspondant"
PLG_AUTH_COOKIE_ERROR_LOG_LOGIN_FAILED="La connexion par cookie a échoué pour l'utilisateur %u"
PLG_AUTH_COOKIE_FIELD_COOKIE_LIFETIME_DESC="Saisir le nombre de jours avant l'expiration du cookie d'authentification. D'autres facteurs peuvent provoquer son expiration avant ce terme. Plus le nombre choisi est élevé, moins il est sécurisé."
PLG_AUTH_COOKIE_FIELD_COOKIE_LIFETIME_LABEL="Durée du cookie"
PLG_AUTH_COOKIE_FIELD_KEY_LENGTH_DESC="Saisir la longueur de la clé de cryptage. Une longueur importante est plus sécurisée mais ralentit les performances."
PLG_AUTH_COOKIE_FIELD_KEY_LENGTH_LABEL="Longueur de la clé"
PLG_AUTH_COOKIE_PRIVACY_CAPABILITY_COOKIE="En conjonction avec un plugin qui supporte une fonctionnalité \"Remember Me\", comme le plug-in \"Système - Se souvenir de moi\", ce plugin crée un cookie dans le navigateur de l'utilisateur si une case à cocher \"Se souvenir de moi\" est sélectionnée lors de la connexion au site. Ce cookie peut être identifié avec le préfixe `joomla_remember_me` et est utilisé pour connecter automatiquement les utilisateurs au site Web lorsqu'ils le visitent et ne sont pas déjà connectés."
PLG_AUTH_COOKIE_XML_DESCRIPTION="Gère l'authentification Joomla des utilisateurs par cookie<br /><strong> Attention! Vous devez activer au moins un autre plug-in d'authentification.</strong><br />Vous aurez aussi besoin d'un plug-in tel que 'Système - Se souvenir de moi' pour implémenter la connexion par cookie."
PLG_AUTHENTICATION_COOKIE="Authentification - Cookie"
language/fr-FR/fr-FR.plg_system_sessiongc.ini000060400000004107152453623440015130 0ustar00; @date        2018-02-27
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SYSTEM_SESSIONGC="Système - Purge des données de session"
PLG_SYSTEM_SESSIONGC_ENABLE_SESSION_GC_DESC="Lorsqu'il est activé, ce plugin va tenter de purger les données expirées en fonction de la fréquence calculée par la probabilité et le diviseur."
PLG_SYSTEM_SESSIONGC_ENABLE_SESSION_GC_LABEL="Activer le nettoyage des données de session"
PLG_SYSTEM_SESSIONGC_ENABLE_SESSION_METADATA_GC_DESC="Lorsqu'elle est activée, ce plugin nettoiera les métadonnées de session optionnelles de la base de données. Notez que cette opération ne s'exécutera pas lorsque la méthode choisie de configuration des sessions est la base de données car ces données sont effacées dans le cadre de l'opération de nettoyage des données de session."
PLG_SYSTEM_SESSIONGC_ENABLE_SESSION_METADATA_GC_LABEL="Activer le nettoyage des metadonnées de session"
PLG_SYSTEM_SESSIONGC_GC_DIVISOR_DESC="En combinaison avec le champ probabilité, ces deux champs sont utilisés pour déterminer la fréquence de l'opération de nettoyage des données de session déclenchée par une requête. La probabilité est calculée en utilisant probabilité/diviseur. 1/100 signifie qu'il y a 1% de chance que que le processus soit lancé à chaque requête."
PLG_SYSTEM_SESSIONGC_GC_DIVISOR_LABEL="Diviseur"
PLG_SYSTEM_SESSIONGC_GC_PROBABILITY_DESC="En combinaison avec le champ diviseur, ces deux champs sont utilisés pour déterminer la fréquence de l'opération de nettoyage des données de session déclenchée par une requête."
PLG_SYSTEM_SESSIONGC_GC_PROBABILITY_LABEL="Probabilité"
PLG_SYSTEM_SESSIONGC_XML_DESCRIPTION="Purge les données et les métadonnées expirées en fonction du gestionnaire de session défini dans la configuration globale."
language/fr-FR/fr-FR.plg_search_weblinks.ini000060400000001275152453623440014675 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_SEARCH_WEBLINKS="Recherche - Liens web"
PLG_SEARCH_WEBLINKS_FIELD_SEARCHLIMIT_DESC="Nombre de résultats à afficher"
PLG_SEARCH_WEBLINKS_FIELD_SEARCHLIMIT_LABEL="Limite de recherche"
PLG_SEARCH_WEBLINKS_WEBLINKS="Liens web"
PLG_SEARCH_WEBLINKS_XML_DESCRIPTION="Intégration des liens web dans la recherche sur le site"language/fr-FR/fr-FR.plg_finder_newsfeeds.ini000060400000001275152453623440015044 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_FINDER_NEWSFEEDS="Indexation - Fils d'actualité"
PLG_FINDER_NEWSFEEDS_XML_DESCRIPTION="Ce plug-in permet l'indexation des fils d'actualité du composant de Joomla dans la recherche avancée."
PLG_FINDER_QUERY_FILTER_BRANCH_S_NEWS_FEED="Fil d'actualité"
PLG_FINDER_QUERY_FILTER_BRANCH_P_NEWS_FEED="Fils d'actualité"

language/fr-FR/fr-FR.mod_menu.sys.ini000060400000001174152453623440013306 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


MOD_MENU="Menu d'administration"
MOD_MENU_XML_DESCRIPTION="Le module 'mod_menu' affiche les liens d'un menu de l'administration.<br />Ce module doit être placé en position 'menu' avec le template par défaut de Joomla."
MOD_MENU_LAYOUT_DEFAULT="Défaut"

language/fr-FR/fr-FR.plg_fields_textarea.sys.ini000060400000001125152453623440015504 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_TEXTAREA="Champs - Zone de texte"
PLG_FIELDS_TEXTAREA_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'textarea' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_fields_color.ini000060400000001154152453623440014172 0ustar00; @date        2017-01-19
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_COLOR="Champs - Couleur"
PLG_FIELDS_COLOR_LABEL="Couleur (%s)"
PLG_FIELDS_COLOR_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'color' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_privacy_contact.sys.ini000060400000001131152453623440015526 0ustar00; @date        2018-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_PRIVACY_CONTACT="Confidentialité - Contacts"
PLG_PRIVACY_CONTACT_XML_DESCRIPTION="Responsable du traitement des demandes d'informations liées à la confidentialité pour les données de base des contacts de Joomla."
language/fr-FR/fr-FR.plg_search_categories.ini000060400000001317152453623440015201 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_SEARCH_CATEGORIES_CATEGORIES="Catégories"
PLG_SEARCH_CATEGORIES="Recherche - Catégories"
PLG_SEARCH_CATEGORIES_FIELD_SEARCHLIMIT_DESC="Nombre de résultats à afficher"
PLG_SEARCH_CATEGORIES_FIELD_SEARCHLIMIT_LABEL="Limite de recherche"
PLG_SEARCH_CATEGORIES_XML_DESCRIPTION="Intégration des catégories dans la recherche sur le site"language/fr-FR/fr-FR.plg_installer_packageinstaller.ini000060400000002633152453623440017117 0ustar00; @date        2016-05-10
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_INSTALLER_PACKAGEINSTALLER_DRAG_FILE_HERE="Glisser-déposer le fichier à transférer."
PLG_INSTALLER_PACKAGEINSTALLER_EXTENSION_PACKAGE_FILE="Fichier de paquet d'extension"
PLG_INSTALLER_PACKAGEINSTALLER_INSTALLING="Installation en cours..."
PLG_INSTALLER_PACKAGEINSTALLER_NO_PACKAGE="Sélectionner un paquet à transférer"
PLG_INSTALLER_PACKAGEINSTALLER_PLUGIN_XML_DESCRIPTION="Ce plug-in permet d'installer des paquets depuis votre ordinateur local."
PLG_INSTALLER_PACKAGEINSTALLER_SELECT_FILE="Ou rechercher le fichier"
PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_AND_INSTALL="Transférer & installer"
PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_ERROR_EMPTY="Erreur : le serveur renvoie une réponse vide."
PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_ERROR_UNKNOWN="Erreur : erreur inconnue ou génération JSON invalide."
PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_INSTALL_JOOMLA_EXTENSION="Transférer et installer une extension Joomla"
PLG_INSTALLER_PACKAGEINSTALLER_UPLOAD_PACKAGE_FILE="Transférer un paquet"
PLG_INSTALLER_PACKAGEINSTALLER_UPLOADING="Transfert..."
language/fr-FR/fr-FR.plg_installer_folderinstaller.sys.ini000060400000001114152453623440017605 0ustar00; @date        2016-05-10
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_INSTALLER_FOLDERINSTALLER="Installation - Installer à partir d'un répertoire"
PLG_INSTALLER_FOLDERINSTALLER_PLUGIN_XML_DESCRIPTION="Ce plug-in permet d'installer des paquets à partir d'un répertoire."
language/fr-FR/install.xml000060400000041716152453623440011450 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<extension version="3.10" client="administrator" type="language" method="upgrade">
	<name>French (France)</name>
	<tag>fr-FR</tag>
	<version>3.10.12</version>
	<creationDate>2023-07-11</creationDate>
	<author>French translation team : joomla.fr</author>
	<authorEmail>traduction@joomla.fr</authorEmail>
	<authorUrl>http://joomla.fr</authorUrl>
	<copyright>Copyright (C) 2005 - 2022 Joomla.fr and Open Source Matters, Inc. All rights reserved.</copyright>
	<license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>
	<description>fr-FR - Administration language</description>
	<files>
		<filename>fr-FR.ini</filename>
		<filename>fr-FR.com_actionlogs.ini</filename>
		<filename>fr-FR.com_actionlogs.sys.ini</filename>
		<filename>fr-FR.com_admin.ini</filename>
		<filename>fr-FR.com_admin.sys.ini</filename>
		<filename>fr-FR.com_ajax.ini</filename>
		<filename>fr-FR.com_ajax.sys.ini</filename>
		<filename>fr-FR.com_associations.ini</filename>
		<filename>fr-FR.com_associations.sys.ini</filename>
		<filename>fr-FR.com_banners.ini</filename>
		<filename>fr-FR.com_banners.sys.ini</filename>
		<filename>fr-FR.com_cache.ini</filename>
		<filename>fr-FR.com_cache.sys.ini</filename>
		<filename>fr-FR.com_categories.ini</filename>
		<filename>fr-FR.com_categories.sys.ini</filename>
		<filename>fr-FR.com_checkin.ini</filename>
		<filename>fr-FR.com_checkin.sys.ini</filename>
		<filename>fr-FR.com_config.ini</filename>
		<filename>fr-FR.com_config.sys.ini</filename>
		<filename>fr-FR.com_contact.ini</filename>
		<filename>fr-FR.com_contact.sys.ini</filename>
		<filename>fr-FR.com_content.ini</filename>
		<filename>fr-FR.com_content.sys.ini</filename>
		<filename>fr-FR.com_contenthistory.ini</filename>
		<filename>fr-FR.com_contenthistory.sys.ini</filename>
		<filename>fr-FR.com_cpanel.ini</filename>
		<filename>fr-FR.com_cpanel.sys.ini</filename>
		<filename>fr-FR.com_fields.ini</filename>
		<filename>fr-FR.com_fields.sys.ini</filename>
		<filename>fr-FR.com_finder.ini</filename>
		<filename>fr-FR.com_finder.sys.ini</filename>
		<filename>fr-FR.com_installer.ini</filename>
		<filename>fr-FR.com_installer.sys.ini</filename>
		<filename>fr-FR.com_joomlaupdate.ini</filename>
		<filename>fr-FR.com_joomlaupdate.sys.ini</filename>
		<filename>fr-FR.com_languages.ini</filename>
		<filename>fr-FR.com_languages.sys.ini</filename>
		<filename>fr-FR.com_login.ini</filename>
		<filename>fr-FR.com_login.sys.ini</filename>
		<filename>fr-FR.com_mailto.sys.ini</filename>
		<filename>fr-FR.com_media.ini</filename>
		<filename>fr-FR.com_media.sys.ini</filename>
		<filename>fr-FR.com_menus.ini</filename>
		<filename>fr-FR.com_menus.sys.ini</filename>
		<filename>fr-FR.com_messages.ini</filename>
		<filename>fr-FR.com_messages.sys.ini</filename>
		<filename>fr-FR.com_modules.ini</filename>
		<filename>fr-FR.com_modules.sys.ini</filename>
		<filename>fr-FR.com_newsfeeds.ini</filename>
		<filename>fr-FR.com_newsfeeds.sys.ini</filename>
		<filename>fr-FR.com_plugins.ini</filename>
		<filename>fr-FR.com_plugins.sys.ini</filename>
		<filename>fr-FR.com_postinstall.ini</filename>
		<filename>fr-FR.com_postinstall.sys.ini</filename>
		<filename>fr-FR.com_privacy.ini</filename>
		<filename>fr-FR.com_privacy.sys.ini</filename>
		<filename>fr-FR.com_redirect.ini</filename>
		<filename>fr-FR.com_redirect.sys.ini</filename>
		<filename>fr-FR.com_search.ini</filename>
		<filename>fr-FR.com_search.sys.ini</filename>
		<filename>fr-FR.com_tags.ini</filename>
		<filename>fr-FR.com_tags.sys.ini</filename>
		<filename>fr-FR.com_templates.ini</filename>
		<filename>fr-FR.com_templates.sys.ini</filename>
		<filename>fr-FR.com_users.ini</filename>
		<filename>fr-FR.com_users.sys.ini</filename>
		<filename>fr-FR.com_weblinks.ini</filename>
		<filename>fr-FR.com_weblinks.sys.ini</filename>
		<filename>fr-FR.com_wrapper.ini</filename>
		<filename>fr-FR.com_wrapper.sys.ini</filename>
		<filename>fr-FR.lib_joomla.ini</filename>
		<filename>fr-FR.mod_custom.ini</filename>
		<filename>fr-FR.mod_custom.sys.ini</filename>
		<filename>fr-FR.mod_feed.ini</filename>
		<filename>fr-FR.mod_feed.sys.ini</filename>
		<filename>fr-FR.mod_latest.ini</filename>
		<filename>fr-FR.mod_latest.sys.ini</filename>
		<filename>fr-FR.mod_latestactions.ini</filename>
		<filename>fr-FR.mod_latestactions.sys.ini</filename>
		<filename>fr-FR.mod_logged.ini</filename>
		<filename>fr-FR.mod_logged.sys.ini</filename>
		<filename>fr-FR.mod_login.ini</filename>
		<filename>fr-FR.mod_login.sys.ini</filename>
		<filename>fr-FR.mod_menu.ini</filename>
		<filename>fr-FR.mod_menu.sys.ini</filename>
		<filename>fr-FR.mod_multilangstatus.ini</filename>
		<filename>fr-FR.mod_multilangstatus.sys.ini</filename>
		<filename>fr-FR.mod_popular.ini</filename>
		<filename>fr-FR.mod_popular.sys.ini</filename>
		<filename>fr-FR.mod_privacy_dashboard.ini</filename>
		<filename>fr-FR.mod_privacy_dashboard.sys.ini</filename>
		<filename>fr-FR.mod_quickicon.ini</filename>
		<filename>fr-FR.mod_quickicon.sys.ini</filename>
		<filename>fr-FR.mod_sampledata.ini</filename>
		<filename>fr-FR.mod_sampledata.sys.ini</filename>
		<filename>fr-FR.mod_stats_admin.ini</filename>
		<filename>fr-FR.mod_stats_admin.sys.ini</filename>
		<filename>fr-FR.mod_status.ini</filename>
		<filename>fr-FR.mod_status.sys.ini</filename>
		<filename>fr-FR.mod_submenu.ini</filename>
		<filename>fr-FR.mod_submenu.sys.ini</filename>
		<filename>fr-FR.mod_title.ini</filename>
		<filename>fr-FR.mod_title.sys.ini</filename>
		<filename>fr-FR.mod_toolbar.ini</filename>
		<filename>fr-FR.mod_toolbar.sys.ini</filename>
		<filename>fr-FR.mod_version.ini</filename>
		<filename>fr-FR.mod_version.sys.ini</filename>
		<filename>fr-FR.plg_actionlog_joomla.ini</filename>
		<filename>fr-FR.plg_actionlog_joomla.sys.ini</filename>
		<filename>fr-FR.plg_authentication_cookie.ini</filename>
		<filename>fr-FR.plg_authentication_cookie.sys.ini</filename>
		<filename>fr-FR.plg_authentication_gmail.ini</filename>
		<filename>fr-FR.plg_authentication_gmail.sys.ini</filename>
		<filename>fr-FR.plg_authentication_joomla.ini</filename>
		<filename>fr-FR.plg_authentication_joomla.sys.ini</filename>
		<filename>fr-FR.plg_authentication_ldap.ini</filename>
		<filename>fr-FR.plg_authentication_ldap.sys.ini</filename>
		<filename>fr-FR.plg_captcha_recaptcha.ini</filename>
		<filename>fr-FR.plg_captcha_recaptcha.sys.ini</filename>
		<filename>fr-FR.plg_captcha_recaptcha_invisible.ini</filename>
		<filename>fr-FR.plg_captcha_recaptcha_invisible.sys.ini</filename>
		<filename>fr-FR.plg_content_confirmconsent.ini</filename>
		<filename>fr-FR.plg_content_confirmconsent.sys.ini</filename>
		<filename>fr-FR.plg_content_contact.ini</filename>
		<filename>fr-FR.plg_content_contact.sys.ini</filename>
		<filename>fr-FR.plg_content_emailcloak.ini</filename>
		<filename>fr-FR.plg_content_emailcloak.sys.ini</filename>
		<filename>fr-FR.plg_content_fields.ini</filename>
		<filename>fr-FR.plg_content_fields.sys.ini</filename>
		<filename>fr-FR.plg_content_finder.ini</filename>
		<filename>fr-FR.plg_content_finder.sys.ini</filename>
		<filename>fr-FR.plg_content_joomla.ini</filename>
		<filename>fr-FR.plg_content_joomla.sys.ini</filename>
		<filename>fr-FR.plg_content_loadmodule.ini</filename>
		<filename>fr-FR.plg_content_loadmodule.sys.ini</filename>
		<filename>fr-FR.plg_content_pagebreak.ini</filename>
		<filename>fr-FR.plg_content_pagebreak.sys.ini</filename>
		<filename>fr-FR.plg_content_pagenavigation.ini</filename>
		<filename>fr-FR.plg_content_pagenavigation.sys.ini</filename>
		<filename>fr-FR.plg_content_vote.ini</filename>
		<filename>fr-FR.plg_content_vote.sys.ini</filename>
		<filename>fr-FR.plg_editors-xtd_article.ini</filename>
		<filename>fr-FR.plg_editors-xtd_article.sys.ini</filename>
		<filename>fr-FR.plg_editors-xtd_contact.ini</filename>
		<filename>fr-FR.plg_editors-xtd_contact.sys.ini</filename>
		<filename>fr-FR.plg_editors-xtd_fields.ini</filename>
		<filename>fr-FR.plg_editors-xtd_fields.sys.ini</filename>
		<filename>fr-FR.plg_editors-xtd_image.ini</filename>
		<filename>fr-FR.plg_editors-xtd_image.sys.ini</filename>
		<filename>fr-FR.plg_editors-xtd_menu.ini</filename>
		<filename>fr-FR.plg_editors-xtd_menu.sys.ini</filename>
		<filename>fr-FR.plg_editors-xtd_module.ini</filename>
		<filename>fr-FR.plg_editors-xtd_module.sys.ini</filename>
		<filename>fr-FR.plg_editors-xtd_pagebreak.ini</filename>
		<filename>fr-FR.plg_editors-xtd_pagebreak.sys.ini</filename>
		<filename>fr-FR.plg_editors-xtd_readmore.ini</filename>
		<filename>fr-FR.plg_editors-xtd_readmore.sys.ini</filename>
		<filename>fr-FR.plg_editors-xtd_weblink.ini</filename>
		<filename>fr-FR.plg_editors-xtd_weblink.sys.ini</filename>
		<filename>fr-FR.plg_editors_codemirror.ini</filename>
		<filename>fr-FR.plg_editors_codemirror.sys.ini</filename>
		<filename>fr-FR.plg_editors_none.ini</filename>
		<filename>fr-FR.plg_editors_none.sys.ini</filename>
		<filename>fr-FR.plg_editors_tinymce.ini</filename>
		<filename>fr-FR.plg_editors_tinymce.sys.ini</filename>
		<filename>fr-FR.plg_extension_joomla.ini</filename>
		<filename>fr-FR.plg_extension_joomla.sys.ini</filename>
		<filename>fr-FR.plg_fields_calendar.ini</filename>
		<filename>fr-FR.plg_fields_calendar.sys.ini</filename>
		<filename>fr-FR.plg_fields_checkboxes.ini</filename>
		<filename>fr-FR.plg_fields_checkboxes.sys.ini</filename>
		<filename>fr-FR.plg_fields_color.ini</filename>
		<filename>fr-FR.plg_fields_color.sys.ini</filename>
		<filename>fr-FR.plg_fields_editor.ini</filename>
		<filename>fr-FR.plg_fields_editor.sys.ini</filename>
		<filename>fr-FR.plg_fields_image.ini</filename>
		<filename>fr-FR.plg_fields_image.sys.ini</filename>
		<filename>fr-FR.plg_fields_imagelist.ini</filename>
		<filename>fr-FR.plg_fields_imagelist.sys.ini</filename>
		<filename>fr-FR.plg_fields_integer.ini</filename>
		<filename>fr-FR.plg_fields_integer.sys.ini</filename>
		<filename>fr-FR.plg_fields_list.ini</filename>
		<filename>fr-FR.plg_fields_list.sys.ini</filename>
		<filename>fr-FR.plg_fields_media.ini</filename>
		<filename>fr-FR.plg_fields_media.sys.ini</filename>
		<filename>fr-FR.plg_fields_radio.ini</filename>
		<filename>fr-FR.plg_fields_radio.sys.ini</filename>
		<filename>fr-FR.plg_fields_repeatable.ini</filename>
		<filename>fr-FR.plg_fields_repeatable.sys.ini</filename>
		<filename>fr-FR.plg_fields_sql.ini</filename>
		<filename>fr-FR.plg_fields_sql.sys.ini</filename>
		<filename>fr-FR.plg_fields_text.ini</filename>
		<filename>fr-FR.plg_fields_text.sys.ini</filename>
		<filename>fr-FR.plg_fields_textarea.ini</filename>
		<filename>fr-FR.plg_fields_textarea.sys.ini</filename>
		<filename>fr-FR.plg_fields_url.ini</filename>
		<filename>fr-FR.plg_fields_url.sys.ini</filename>
		<filename>fr-FR.plg_fields_user.ini</filename>
		<filename>fr-FR.plg_fields_user.sys.ini</filename>
		<filename>fr-FR.plg_fields_usergrouplist.ini</filename>
		<filename>fr-FR.plg_fields_usergrouplist.sys.ini</filename>
		<filename>fr-FR.plg_finder_categories.ini</filename>
		<filename>fr-FR.plg_finder_categories.sys.ini</filename>
		<filename>fr-FR.plg_finder_contacts.ini</filename>
		<filename>fr-FR.plg_finder_contacts.sys.ini</filename>
		<filename>fr-FR.plg_finder_content.ini</filename>
		<filename>fr-FR.plg_finder_content.sys.ini</filename>
		<filename>fr-FR.plg_finder_newsfeeds.ini</filename>
		<filename>fr-FR.plg_finder_newsfeeds.sys.ini</filename>
		<filename>fr-FR.plg_finder_tags.ini</filename>
		<filename>fr-FR.plg_finder_tags.sys.ini</filename>
		<filename>fr-FR.plg_finder_weblinks.ini</filename>
		<filename>fr-FR.plg_finder_weblinks.sys.ini</filename>
		<filename>fr-FR.plg_installer_folderinstaller.ini</filename>
		<filename>fr-FR.plg_installer_folderinstaller.sys.ini</filename>
		<filename>fr-FR.plg_installer_packageinstaller.ini</filename>
		<filename>fr-FR.plg_installer_packageinstaller.sys.ini</filename>
		<filename>fr-FR.plg_installer_urlinstaller.ini</filename>
		<filename>fr-FR.plg_installer_urlinstaller.sys.ini</filename>
		<filename>fr-FR.plg_installer_webinstaller.ini</filename>
		<filename>fr-FR.plg_installer_webinstaller.sys.ini</filename>
		<filename>fr-FR.plg_privacy_actionlogs.ini</filename>
		<filename>fr-FR.plg_privacy_actionlogs.sys.ini</filename>
		<filename>fr-FR.plg_privacy_consents.ini</filename>
		<filename>fr-FR.plg_privacy_consents.sys.ini</filename>
		<filename>fr-FR.plg_privacy_contact.ini</filename>
		<filename>fr-FR.plg_privacy_contact.sys.ini</filename>
		<filename>fr-FR.plg_privacy_content.ini</filename>
		<filename>fr-FR.plg_privacy_content.sys.ini</filename>
		<filename>fr-FR.plg_privacy_message.ini</filename>
		<filename>fr-FR.plg_privacy_message.sys.ini</filename>
		<filename>fr-FR.plg_privacy_user.ini</filename>
		<filename>fr-FR.plg_privacy_user.sys.ini</filename>
		<filename>fr-FR.plg_quickicon_eos310.ini</filename>
		<filename>fr-FR.plg_quickicon_eos310.sys.ini</filename>
		<filename>fr-FR.plg_quickicon_extensionupdate.ini</filename>
		<filename>fr-FR.plg_quickicon_extensionupdate.sys.ini</filename>
		<filename>fr-FR.plg_quickicon_joomlaupdate.ini</filename>
		<filename>fr-FR.plg_quickicon_joomlaupdate.sys.ini</filename>
		<filename>fr-FR.plg_quickicon_phpversioncheck.ini</filename>
		<filename>fr-FR.plg_quickicon_phpversioncheck.sys.ini</filename>
		<filename>fr-FR.plg_quickicon_privacycheck.ini</filename>
		<filename>fr-FR.plg_quickicon_privacycheck.sys.ini</filename>
		<filename>fr-FR.plg_sampledata_blog.ini</filename>
		<filename>fr-FR.plg_sampledata_blog.sys.ini</filename>
		<filename>fr-FR.plg_search_categories.ini</filename>
		<filename>fr-FR.plg_search_categories.sys.ini</filename>
		<filename>fr-FR.plg_search_contacts.ini</filename>
		<filename>fr-FR.plg_search_contacts.sys.ini</filename>
		<filename>fr-FR.plg_search_content.ini</filename>
		<filename>fr-FR.plg_search_content.sys.ini</filename>
		<filename>fr-FR.plg_search_newsfeeds.ini</filename>
		<filename>fr-FR.plg_search_newsfeeds.sys.ini</filename>
		<filename>fr-FR.plg_search_tags.ini</filename>
		<filename>fr-FR.plg_search_tags.sys.ini</filename>
		<filename>fr-FR.plg_search_weblinks.ini</filename>
		<filename>fr-FR.plg_search_weblinks.sys.ini</filename>
		<filename>fr-FR.plg_system_actionlogs.ini</filename>
		<filename>fr-FR.plg_system_actionlogs.sys.ini</filename>
		<filename>fr-FR.plg_system_cache.ini</filename>
		<filename>fr-FR.plg_system_cache.sys.ini</filename>
		<filename>fr-FR.plg_system_debug.ini</filename>
		<filename>fr-FR.plg_system_debug.sys.ini</filename>
		<filename>fr-FR.plg_system_fields.ini</filename>
		<filename>fr-FR.plg_system_fields.sys.ini</filename>
		<filename>fr-FR.plg_system_highlight.ini</filename>
		<filename>fr-FR.plg_system_highlight.sys.ini</filename>
		<filename>fr-FR.plg_system_languagecode.ini</filename>
		<filename>fr-FR.plg_system_languagecode.sys.ini</filename>
		<filename>fr-FR.plg_system_languagefilter.ini</filename>
		<filename>fr-FR.plg_system_languagefilter.sys.ini</filename>
		<filename>fr-FR.plg_system_log.ini</filename>
		<filename>fr-FR.plg_system_log.sys.ini</filename>
		<filename>fr-FR.plg_system_logout.ini</filename>
		<filename>fr-FR.plg_system_logout.sys.ini</filename>
		<filename>fr-FR.plg_system_logrotation.ini</filename>
		<filename>fr-FR.plg_system_logrotation.sys.ini</filename>
		<filename>fr-FR.plg_system_p3p.ini</filename>
		<filename>fr-FR.plg_system_p3p.sys.ini</filename>
		<filename>fr-FR.plg_system_privacyconsent.ini</filename>
		<filename>fr-FR.plg_system_privacyconsent.sys.ini</filename>
		<filename>fr-FR.plg_system_redirect.ini</filename>
		<filename>fr-FR.plg_system_redirect.sys.ini</filename>
		<filename>fr-FR.plg_system_remember.ini</filename>
		<filename>fr-FR.plg_system_remember.sys.ini</filename>
		<filename>fr-FR.plg_system_sef.ini</filename>
		<filename>fr-FR.plg_system_sef.sys.ini</filename>
		<filename>fr-FR.plg_system_sessiongc.ini</filename>
		<filename>fr-FR.plg_system_sessiongc.sys.ini</filename>
		<filename>fr-FR.plg_system_stats.ini</filename>
		<filename>fr-FR.plg_system_stats.sys.ini</filename>
		<filename>fr-FR.plg_system_updatenotification.ini</filename>
		<filename>fr-FR.plg_system_updatenotification.sys.ini</filename>
		<filename>fr-FR.plg_system_weblinks.ini</filename>
		<filename>fr-FR.plg_system_weblinks.sys.ini</filename>
		<filename>fr-FR.plg_twofactorauth_totp.ini</filename>
		<filename>fr-FR.plg_twofactorauth_totp.sys.ini</filename>
		<filename>fr-FR.plg_twofactorauth_yubikey.ini</filename>
		<filename>fr-FR.plg_twofactorauth_yubikey.sys.ini</filename>
		<filename>fr-FR.plg_user_contactcreator.ini</filename>
		<filename>fr-FR.plg_user_contactcreator.sys.ini</filename>
		<filename>fr-FR.plg_user_joomla.ini</filename>
		<filename>fr-FR.plg_user_joomla.sys.ini</filename>
		<filename>fr-FR.plg_user_profile.ini</filename>
		<filename>fr-FR.plg_user_profile.sys.ini</filename>
		<filename>fr-FR.plg_user_terms.ini</filename>
		<filename>fr-FR.plg_user_terms.sys.ini</filename>
		<filename>fr-FR.tpl_hathor.ini</filename>
		<filename>fr-FR.tpl_hathor.sys.ini</filename>
		<filename>fr-FR.tpl_isis.ini</filename>
		<filename>fr-FR.tpl_isis.sys.ini</filename>
		<filename>fr-FR.localise.php</filename>
		<filename file="meta">install.xml</filename>
		<filename file="meta">fr-FR.xml</filename>
		<filename>index.html</filename>
	</files>
	<params />
</extension>
language/fr-FR/fr-FR.mod_multilangstatus.ini000060400000001012152453623440014754 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

MOD_MULTILANGSTATUS="Statut multilangue"
MOD_MULTILANGSTATUS_XML_DESCRIPTION="Ce module affiche le statut des divers paramètres multilangues."
language/fr-FR/fr-FR.com_media.sys.ini000060400000001202152453623440013410 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_MEDIA="Médias"
COM_MEDIA_XML_DESCRIPTION="Composant de gestion des médias du site"

COM_MEDIA_MEDIA_VIEW_DEFAULT_DESC="Transférer ou gérer les images et autres fichiers médias sur votre site."
COM_MEDIA_MEDIA_VIEW_DEFAULT_TITLE="Gestionnaire de médias"
language/fr-FR/fr-FR.plg_sampledata_blog.sys.ini000060400000001073152453623440015461 0ustar00; @date        2017-09-05
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SAMPLEDATA_BLOG="Données exemples - Blog"
PLG_SAMPLEDATA_BLOG_XML_DESCRIPTION="Fournit des données exemple de type blog qui peuvent être installées par le module de base de données."
language/fr-FR/fr-FR.com_joomlaupdate.sys.ini000060400000001352152453623440015023 0ustar00; @date        2015-05-26
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_JOOMLAUPDATE="Mise à jour de Joomla!"
COM_JOOMLAUPDATE_XML_DESCRIPTION="Mise à jour vers la dernière version de Joomla! en un click"

COM_JOOMLAUPDATE_DEFAULT_VIEW_DEFAULT_DESC="Rechercher les mises à jour de Joomla! et mettre à jour votre site web avec la dernière version disponible."
COM_JOOMLAUPDATE_DEFAULT_VIEW_DEFAULT_TITLE="Mise à jour de Joomla!"
language/fr-FR/fr-FR.lib_joomla.ini000060400000214116152453623440012777 0ustar00; @date        2014-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2022 Open Source Matters, Inc. (https://www.joomla.org)
; @copyright   (C) 2005 - 2022 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


; Common boolean values
; Note: YES, NO, TRUE, FALSE are reserved words in INI format.

; Keep this string on top
JERROR_PARSING_LANGUAGE_FILE="&#160;: erreur(s) ligne(s) %s"

JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN="Accès interdit"
JLIB_APPLICATION_ERROR_APPLICATION_GET_NAME="JApplication: :getName() : impossible d'obtenir ou de parser le nom de la classe."
JLIB_APPLICATION_ERROR_APPLICATION_LOAD="Impossible de charger l'application&#160;: %s"
JLIB_APPLICATION_ERROR_BATCH_CANNOT_CREATE="Vous n'êtes pas autorisé à créer de nouveaux éléments dans cette catégorie."
JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT="Vous n'êtes pas autorisé à effectuer des modifications sur un ou plusieurs des éléments sélectionnés."
JLIB_APPLICATION_ERROR_BATCH_FAILED="Le traitement par lot a échoué avec l'erreur suivante: %s"
JLIB_APPLICATION_ERROR_BATCH_MOVE_CATEGORY_NOT_FOUND="Impossible de trouver la catégorie de destination pour ce déplacement."
JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND="Impossible de trouver l'élément à déplacer."
JLIB_APPLICATION_ERROR_CHECKIN_FAILED="Échec du déverrouillage avec l'erreur suivante&#160;: %s"
JLIB_APPLICATION_ERROR_CHECKIN_NOT_CHECKED="L'élément n'est pas déverrouillé"
JLIB_APPLICATION_ERROR_CHECKIN_USER_MISMATCH="L'utilisateur qui déverrouille ne correspond pas à l'utilisateur/trice qui a verrouillé l'élément."
JLIB_APPLICATION_ERROR_CHECKOUT_FAILED="Echec du déverrouillage avec l'erreur suivante&#160;: %s"
JLIB_APPLICATION_ERROR_CHECKOUT_USER_MISMATCH="L'utilisateur qui déverrouille ne correspond pas à l'utilisateur qui a déverouillé l'élément."
JLIB_APPLICATION_ERROR_COMPONENT_NOT_FOUND="Composant introuvable"
JLIB_APPLICATION_ERROR_COMPONENT_NOT_LOADING="Erreur de chargement du composant&#160;: %1$s, %2$s"
JLIB_APPLICATION_ERROR_CONTROLLER_GET_NAME="JController: :getName() : impossible d'obtenir ou de parser le nom de la classe."
JLIB_APPLICATION_ERROR_CREATE_RECORD_NOT_PERMITTED="Création d'un enregistrement non permise"
JLIB_APPLICATION_ERROR_DELETE_NOT_PERMITTED="Suppression non permise"
JLIB_APPLICATION_ERROR_EDITSTATE_NOT_PERMITTED="L'édition du statut n'est pas autorisée"
JLIB_APPLICATION_ERROR_EDIT_ITEM_NOT_PERMITTED="L'édition n'est pas autorisée"
JLIB_APPLICATION_ERROR_EDIT_NOT_PERMITTED="Édition non permise"
JLIB_APPLICATION_ERROR_HISTORY_ID_MISMATCH="Erreur de restauration de la version depuis l'historique."
JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION="Informations insuffisantes pour exécuter ce traitement."
JLIB_APPLICATION_ERROR_INVALID_CONTROLLER_CLASS="Classe du contrôleur invalide&#160;: %s"
JLIB_APPLICATION_ERROR_INVALID_CONTROLLER="Contrôleur invalide&#160;: %s"
JLIB_APPLICATION_ERROR_LAYOUTFILE_NOT_FOUND="Mise en page %s introuvable"
JLIB_APPLICATION_ERROR_LIBRARY_NOT_FOUND="Librairie introuvable"
JLIB_APPLICATION_ERROR_LIBRARY_NOT_LOADING="Erreur de chargement de la librairie: %1$s, %2$s"
JLIB_APPLICATION_ERROR_MENU_LOAD="Erreur de chargement du menu : %s"
JLIB_APPLICATION_ERROR_MODEL_GET_NAME="JModel: :getName() : impossible d'obtenir ou de parser le nom de la classe."
JLIB_APPLICATION_ERROR_MODULE_LOAD="Erreur de chargement du module %s"
JLIB_APPLICATION_ERROR_PATHWAY_LOAD="Impossible de charger le chemin&#160;: %s"
JLIB_APPLICATION_ERROR_REORDER_FAILED="Échec du tri. Erreur&#160;: %s"
JLIB_APPLICATION_ERROR_ROUTER_LOAD="Impossible de charger le routeur&#160;: %s"
JLIB_APPLICATION_ERROR_MODELCLASS_NOT_FOUND="Classe du modèle %s introuvable dans le fichier"
JLIB_APPLICATION_ERROR_SAVE_FAILED="L'enregistrement a échoué avec l'erreur suivante&#160;: %s"
JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED="Enregistrement non permis"
JLIB_APPLICATION_ERROR_TABLE_NAME_NOT_SUPPORTED="Table %s non supportée. Fichier introuvable."
JLIB_APPLICATION_ERROR_TASK_NOT_FOUND="Tâche [%s] introuvable"
JLIB_APPLICATION_ERROR_UNHELD_ID="Vous n'êtes pas autorisé à utiliser ce lien pour accéder directement à cette page (#%d)."
JLIB_APPLICATION_ERROR_VIEW_CLASS_NOT_FOUND="Classe d'affichage introuvable [class, file] : %1$s, %2$s"
JLIB_APPLICATION_ERROR_VIEW_GET_NAME_SUBSTRING="JView: :getName() : votre nom de classe contient la sous-chaîne « view ». Ceci pose problème lors de l'extraction du nom de la classe à partir du nom de votre affichage d'objets. Évitez les noms d'objets avec la sous-chaîne « view »."
JLIB_APPLICATION_ERROR_VIEW_GET_NAME="JView::getName() : impossible d'obtenir ou de parser le nom de la classe."
JLIB_APPLICATION_ERROR_VIEW_NOT_FOUND="Affichage introuvable [name, type, prefix] : %1$s, %2$s, %3$s"
JLIB_APPLICATION_SAVE_SUCCESS="Élément enregistré."
JLIB_APPLICATION_SUBMIT_SAVE_SUCCESS="Élément proposé."
JLIB_APPLICATION_SUCCESS_BATCH="Traitement par lot effectué."
JLIB_APPLICATION_SUCCESS_ITEM_REORDERED="Élément réordonné."
JLIB_APPLICATION_SUCCESS_ORDERING_SAVED="Ordre enregistré"
JLIB_APPLICATION_SUCCESS_LOAD_HISTORY="Version précédente restaurée. Sauvegardée sur %s %s."

JLIB_LOGIN_AUTHENTICATE="Le nom d'utilisateur et le mot de passe ne correspondent pas"

JLIB_CACHE_ERROR_CACHE_HANDLER_LOAD="Impossible de charger le sous-programme de traitement du cache&#160;: %s"
JLIB_CACHE_ERROR_CACHE_STORAGE_LOAD="Impossible de charger la mémoire cache&#160;: %s"

JLIB_CAPTCHA_ERROR_PLUGIN_NOT_FOUND="Le plug-in Captcha n'est pas défini ou n'a pu être trouvé. Veuillez contacter un administrateur du site"

JLIB_CLIENT_ERROR_JFTP_NO_CONNECT="JFTP: :connect : impossible de se connecter à l'hôte ' %1$s ' sur le port ' %2$s '"
JLIB_CLIENT_ERROR_JFTP_NO_CONNECT_SOCKET="JFTP: :connect : impossible de se connecter à l'hôte ' %1$s ' sur le port ' %2$s '. Numéro d'erreur du socket&#160;: %3$s et message d'erreur&#160;: %4$s"
JLIB_CLIENT_ERROR_JFTP_BAD_RESPONSE="JFTP: :connect : mauvaise réponse. Réponse du serveur&#160;: %s [attendue&#160;: 220]"
JLIB_CLIENT_ERROR_JFTP_BAD_USERNAME="JFTP: :login : mauvais nom d'utilisateur. Réponse du serveur&#160;: %1$s [attendue&#160;: 331]. Nom d'utilisateur envoyé&#160;: %2$s"
JLIB_CLIENT_ERROR_JFTP_BAD_PASSWORD="JFTP: :login : mauvais mot de passe. Réponse du serveur&#160;: %1$s [attendue&#160;: 230]. Mot de passe envoyé&#160;: %2$s"
JLIB_CLIENT_ERROR_JFTP_PWD_BAD_RESPONSE_NATIVE="FTP: :pwd : mauvaise réponse"
JLIB_CLIENT_ERROR_JFTP_PWD_BAD_RESPONSE="JFTP: :pwd : mauvaise réponse. Réponse du serveur&#160;: %s [attendue&#160;: 257]"
JLIB_CLIENT_ERROR_JFTP_SYST_BAD_RESPONSE_NATIVE="JFTP: :syst : mauvaise réponse"
JLIB_CLIENT_ERROR_JFTP_SYST_BAD_RESPONSE="JFTP: :syst : mauvaise réponse. Réponse du serveur&#160;: %s [attendue&#160;: 215]"
JLIB_CLIENT_ERROR_JFTP_CHDIR_BAD_RESPONSE_NATIVE="JFTP: :chdir : mauvaise réponse"
JLIB_CLIENT_ERROR_JFTP_CHDIR_BAD_RESPONSE="JFTP: :chdir : mauvaise réponse. Réponse du serveur&#160;: %1$s [attendue&#160;: 250]. Chemin envoyé&#160;: %2$s"
JLIB_CLIENT_ERROR_JFTP_REINIT_BAD_RESPONSE_NATIVE="JFTP: :reinit : mauvaise réponse"
JLIB_CLIENT_ERROR_JFTP_REINIT_BAD_RESPONSE="JFTP: :reinit : mauvaise réponse. Réponse du serveur&#160;: %s [attendue&#160;: 220]"
JLIB_CLIENT_ERROR_JFTP_RENAME_BAD_RESPONSE_NATIVE="JFTP: :rename : mauvaise réponse"
JLIB_CLIENT_ERROR_JFTP_RENAME_BAD_RESPONSE_FROM="JFTP: :rename : mauvaise réponse. Réponse du serveur&#160;: %1$s [attendue&#160;: 350]. Chemin d'expédition envoyé&#160;: %2$s"
JLIB_CLIENT_ERROR_JFTP_RENAME_BAD_RESPONSE_TO="JFTP: :rename : mauvaise réponse. Réponse du serveur&#160;: %1$s [attendue&#160;: 250]. Chemin de destination envoyé&#160;: %2$s"
JLIB_CLIENT_ERROR_JFTP_CHMOD_BAD_RESPONSE_NATIVE="JFTP: :chmod : mauvaise réponse"
JLIB_CLIENT_ERROR_JFTP_CHMOD_BAD_RESPONSE="JFTP: :chmod : mauvaise réponse. Réponse du serveur&#160;: %1$s [attendue&#160;: 250]. Chemin envoyé&#160;: %2$s. Mode sent: %3$s"
JLIB_CLIENT_ERROR_JFTP_DELETE_BAD_RESPONSE_NATIVE="JFTP: :delete : mauvaise réponse"
JLIB_CLIENT_ERROR_JFTP_DELETE_BAD_RESPONSE="JFTP: :delete : mauvaise réponse. Réponse du serveur&#160;: %1$s [attendue&#160;: 250]. Chemin envoyé&#160;: %2$s"
JLIB_CLIENT_ERROR_JFTP_MKDIR_BAD_RESPONSE_NATIVE="JFTP: :mkdir : mauvaise réponse"
JLIB_CLIENT_ERROR_JFTP_MKDIR_BAD_RESPONSE="JFTP: :mkdir : mauvaise réponse. Réponse du serveur&#160;: %1$s [attendue&#160;: 257]. Chemin envoyé&#160;: %2$s"
JLIB_CLIENT_ERROR_JFTP_RESTART_BAD_RESPONSE_NATIVE="JFTP: :restart : mauvaise réponse"
JLIB_CLIENT_ERROR_JFTP_RESTART_BAD_RESPONSE="JFTP: :restart : mauvaise réponse. Réponse du serveur&#160;: %1$s [attendue&#160;: 350]. Restart point sent: %2$s"
JLIB_CLIENT_ERROR_JFTP_CREATE_BAD_RESPONSE_BUFFER="JFTP: :create : mauvaise réponse"
JLIB_CLIENT_ERROR_JFTP_CREATE_BAD_RESPONSE_PASSIVE="JFTP: :create : impossible d'utiliser le mode passif"
JLIB_CLIENT_ERROR_JFTP_CREATE_BAD_RESPONSE="JFTP: :create : mauvaise réponse. Réponse du serveur&#160;: %1$s [attendue&#160;: 150 or 125]. Chemin envoyé&#160;: %2$s"
JLIB_CLIENT_ERROR_JFTP_CREATE_BAD_RESPONSE_TRANSFER="JFTP: :create : Transfer Failed. Réponse du serveur&#160;: %1$s [attendue&#160;: 226]. Chemin envoyé&#160;: %2$s"
JLIB_CLIENT_ERROR_JFTP_READ_BAD_RESPONSE_BUFFER="JFTP: :read : mauvaise réponse"
JLIB_CLIENT_ERROR_JFTP_READ_BAD_RESPONSE_PASSIVE="JFTP: :read : impossible d'utiliser le mode passif"
JLIB_CLIENT_ERROR_JFTP_READ_BAD_RESPONSE="JFTP: :read : mauvaise réponse. Réponse du serveur&#160;: %1$s [attendue&#160;: 150 or 125]. Chemin envoyé&#160;: %2$s"
JLIB_CLIENT_ERROR_JFTP_READ_BAD_RESPONSE_TRANSFER="JFTP: :read : échec du transfert. Réponse du serveur&#160;: %1$s [attendue&#160;: 226]. Chemin envoyé&#160;: %2$s"
JLIB_CLIENT_ERROR_JFTP_GET_BAD_RESPONSE="JFTP: :get : mauvaise réponse"
JLIB_CLIENT_ERROR_JFTP_GET_PASSIVE="JFTP: :get : impossible d'utiliser le mode passif"
JLIB_CLIENT_ERROR_JFTP_GET_WRITING_LOCAL="JFTP: :get : impossible d'ouvrir le fichier local en écriture. Chemin local&#160;: %s"
JLIB_CLIENT_ERROR_JFTP_GET_BAD_RESPONSE_RETR="JFTP: :get : mauvaise réponse. Réponse du serveur&#160;: %1$s [attendue&#160;: 150 or 125]. Chemin envoyé&#160;: %2$s"
JLIB_CLIENT_ERROR_JFTP_GET_BAD_RESPONSE_TRANSFER="JFTP: :get : échec du transfert. Réponse du serveur&#160;: %1$s [attendue&#160;: 226]. Chemin envoyé&#160;: %2$s"
JLIB_CLIENT_ERROR_JFTP_STORE_PASSIVE="JFTP: :store : impossible d'utiliser le mode passif"
JLIB_CLIENT_ERROR_JFTP_STORE_BAD_RESPONSE="JFTP: :store : mauvaise réponse"
JLIB_CLIENT_ERROR_JFTP_STORE_READING_LOCAL="JFTP: :store : impossible d'ouvrir le fichier local en lecture. Chemin local&#160;: %s"
JLIB_CLIENT_ERROR_JFTP_STORE_FIND_LOCAL="JFTP: :store : impossible de trouver le fichier local. Chemin local&#160;: %s"
JLIB_CLIENT_ERROR_JFTP_STORE_BAD_RESPONSE_STOR="JFTP: :store : mauvaise réponse. Réponse du serveur&#160;: %1$s [attendue&#160;: 150 or 125]. Chemin envoyé&#160;: %2$s"
JLIB_CLIENT_ERROR_JFTP_STORE_DATA_PORT="JFTP: :store : impossible d'écrire vers le socket du port de données"
JLIB_CLIENT_ERROR_JFTP_STORE_BAD_RESPONSE_TRANSFER="JFTP: :store : échec du transfert. Réponse du serveur&#160;: %1$s [attendue&#160;: 226]. Chemin envoyé&#160;: %2$s"
JLIB_CLIENT_ERROR_JFTP_WRITE_PASSIVE="JFTP: :write : impossible d'utiliser le mode passif"
JLIB_CLIENT_ERROR_JFTP_WRITE_BAD_RESPONSE="JFTP: :write : mauvaise réponse"
JLIB_CLIENT_ERROR_JFTP_WRITE_BAD_RESPONSE_STOR="JFTP: :write : mauvaise réponse. Réponse du serveur&#160;: %1$s [attendue&#160;: 150 or 125]. Chemin envoyé&#160;: %2$s"
JLIB_CLIENT_ERROR_JFTP_WRITE_DATA_PORT="JFTP: :write : impossible d'écrire vers le socket du port de données"
JLIB_CLIENT_ERROR_JFTP_WRITE_BAD_RESPONSE_TRANSFER="JFTP: :write : échec du transfert. Réponse du serveur&#160;: %1$s [attendue&#160;: 226]. Chemin envoyé&#160;: %2$s"
JLIB_CLIENT_ERROR_JFTP_APPEND_PASSIVE="JFTP: :append: Impossible d'utiliser le mode passif"
JLIB_CLIENT_ERROR_JFTP_APPEND_BAD_RESPONSE="JFTP: :append: Mauvaise réponse"
JLIB_CLIENT_ERROR_JFTP_APPEND_BAD_RESPONSE_APPE="JFTP: :append: Mauvaise réponse. Réponse du serveur&nbsp;: %1$s [Attendu&nbsp;: 150 ou 125]. Envoyé&nbsp;: %2$s"
JLIB_CLIENT_ERROR_JFTP_APPEND_DATA_PORT="JFTP: :append: Impossible d'écrire sur la prise du port de données"
JLIB_CLIENT_ERROR_JFTP_APPEND_BAD_RESPONSE_TRANSFER="JFTP: :append: Erreur de transfert. Réponse du serveur&nbsp;: %1$s [Attendu&nbsp;: 226]. Envoyé&nbsp;: %2$s"
JLIB_CLIENT_ERROR_JFTP_SIZE_BAD_RESPONSE="JFTP: :size: Mauvaise réponse"
JLIB_CLIENT_ERROR_JFTP_SIZE_PASSIVE="JFTP: :size: Impossible d'utiliser le mode passif"
JLIB_CLIENT_ERROR_JFTP_LISTNAMES_PASSIVE="JFTP: :listNames : impossible d'utiliser le mode passif"
JLIB_CLIENT_ERROR_JFTP_LISTNAMES_BAD_RESPONSE="JFTP: :listNames : mauvaise réponse"
JLIB_CLIENT_ERROR_JFTP_LISTNAMES_BAD_RESPONSE_NLST="JFTP: :listNames : mauvaise réponse. Réponse du serveur&#160;: %1$s [attendue&#160;: 150 or 125]. Chemin envoyé&#160;: %2$s"
JLIB_CLIENT_ERROR_JFTP_LISTNAMES_BAD_RESPONSE_TRANSFER="JFTP: :listNames : échec du transfert. Réponse du serveur&#160;: %1$s [attendue&#160;: 226]. Chemin envoyé&#160;: %2$s"
JLIB_CLIENT_ERROR_JFTP_LISTDETAILS_BAD_RESPONSE="JFTP: :listDetails : mauvaise réponse"
JLIB_CLIENT_ERROR_JFTP_LISTDETAILS_PASSIVE="JFTP: :listDetails : impossible d'utiliser le mode passif"
JLIB_CLIENT_ERROR_JFTP_LISTDETAILS_BAD_RESPONSE_LIST="JFTP: :listDetails : mauvaise réponse. Réponse du serveur&#160;: %1$s [attendue&#160;: 150 or 125]. Chemin envoyé&#160;: %2$s"
JLIB_CLIENT_ERROR_JFTP_LISTDETAILS_BAD_RESPONSE_TRANSFER="JFTP: :listDetails : échec du transfert. Réponse du serveur&#160;: %1$s [attendue&#160;: 226]. Chemin envoyé&#160;: %2$s"
JLIB_CLIENT_ERROR_JFTP_LISTDETAILS_UNRECOGNISED="JFTP: :listDetails : format de listage de répertoire non reconnu"
JLIB_CLIENT_ERROR_JFTP_PUTCMD_UNCONNECTED="JFTP: :_putCmd : non connecté au port de contrôle"
JLIB_CLIENT_ERROR_JFTP_PUTCMD_SEND="JFTP: :_putCmd : impossible d'envoyer la commande %s"
JLIB_CLIENT_ERROR_JFTP_VERIFYRESPONSE="JFTP: :_verifyResponse : délai dépassé ou réponse non reconnue pendant l'attente d'une réponse du serveur. Réponse du serveur&#160;: %s"
JLIB_CLIENT_ERROR_JFTP_PASSIVE_CONNECT_PORT="JFTP: :_passive : non connecté au port de contrôle"
JLIB_CLIENT_ERROR_JFTP_PASSIVE_RESPONSE="JFTP: :_passive : délai dépassé ou réponse non reconnue pendant l'attente d'une réponse du serveur. Réponse du serveur&#160;: %s"
JLIB_CLIENT_ERROR_JFTP_PASSIVE_IP_OBTAIN="JFTP: :_passive : impossible d'obtenir l'IP et le port pour le transfert des données. Réponse du serveur&#160;: %s"
JLIB_CLIENT_ERROR_JFTP_PASSIVE_IP_VALID="JFTP: :_passive : IP et port pour le transfert des données invalides. Réponse du serveur&#160;: %s"
JLIB_CLIENT_ERROR_JFTP_PASSIVE_CONNECT="JFTP: :_passive : impossible de se connecter à l'hôte %1$s sur le port %2$s. Numéro d'erreur de socket&#160;: %3$s et message d'erreur&#160;: %4$s"
JLIB_CLIENT_ERROR_JFTP_MODE_BINARY="JFTP: :_mode : mauvaise réponse. Réponse du serveur&#160;: %s [attendue&#160;: 200]. Mode envoyé&#160;: Binaire"
JLIB_CLIENT_ERROR_JFTP_MODE_ASCII="JFTP: :_mode : mauvaise réponse. Réponse du serveur&#160;: %s [attendue&#160;: 200]. Mode envoyé&#160;: Ascii"
JLIB_CLIENT_ERROR_HELPER_SETCREDENTIALSFROMREQUEST_FAILED="Il semble que les identifiants utilisateur ne soient pas bons..."
JLIB_CLIENT_ERROR_LDAP_ADDRESS_NOT_AVAILABLE="Adresse non disponible."

JLIB_CMS_WARNING_PROVIDE_VALID_NAME="Merci de fournir un titre valide."

JLIB_DATABASE_ERROR_ADAPTER_MYSQL="L'adaptateur MySQL « mysql » n'est pas disponible."
JLIB_DATABASE_ERROR_ADAPTER_MYSQLI="L'adaptateur MySQL « mysqli » n'est pas disponible."
JLIB_DATABASE_ERROR_BIND_FAILED_INVALID_SOURCE_ARGUMENT="%s: :bind échoué. Argument source invalide."
JLIB_DATABASE_ERROR_ARTICLE_UNIQUE_ALIAS="Un autre article de cette catégorie possède le même alias (rappel : cet article peut se trouver dans la corbeille)."
JLIB_DATABASE_ERROR_CATEGORY_UNIQUE_ALIAS="Une autre catégorie avec la même catégorie parente possède le même alias (rappel : cette catégorie peut se trouver dans la corbeille)."
JLIB_DATABASE_ERROR_CHECK_FAILED="%s: :check échoué - %s"
JLIB_DATABASE_ERROR_CHECKIN_FAILED="%s: :checkIn échoué - %s"
JLIB_DATABASE_ERROR_CHECKOUT_FAILED="%s: :checkOut échoué - %s"
JLIB_DATABASE_ERROR_CHILD_ROWS_CHECKED_OUT="Lignes enfants invalidées."
JLIB_DATABASE_ERROR_CLASS_DOES_NOT_SUPPORT_ORDERING="%s ne supporte pas le tri."
JLIB_DATABASE_ERROR_CLASS_IS_MISSING_FIELD="Champ manquant dans la base de données&#160;: %s   %s."
JLIB_DATABASE_ERROR_CLASS_NOT_FOUND_IN_FILE="Classe du tableau %s introuvable dans le fichier."
JLIB_DATABASE_ERROR_CONNECT_DATABASE="Impossible de se connecter à la base de données&#160;: %s"
JLIB_DATABASE_ERROR_CONNECT_MYSQL="Impossible de se connecter à MySQL."
JLIB_DATABASE_ERROR_DATABASE_CONNECT="Impossible de se connecter à la base de données"
JLIB_DATABASE_ERROR_DATABASE_UPGRADE_FAILED="MySQL La mise à jour de la base données MySQL a échoué. Merci de corriger en allant dans <a href=\"index.php?option=com_installer&view=database\">Vérification de la Base de données</a>."
JLIB_DATABASE_ERROR_DELETE_CATEGORY="Données gauche - droite incohérentes. Impossible de supprimer la catégorie."
JLIB_DATABASE_ERROR_DELETE_FAILED="%s: :delete échoué - %s"
JLIB_DATABASE_ERROR_DELETE_ROOT_CATEGORIES="Les catégories racines ne peuvent pas être supprimées."
JLIB_DATABASE_ERROR_EMAIL_INUSE="Cette adresse e-mail est déjà utilisée. Merci d'utiliser une autre adresse e-mail."
JLIB_DATABASE_ERROR_EMPTY_ROW_RETURNED="La ligne de la base de données est vide."
JLIB_DATABASE_ERROR_FUNCTION_FAILED="Fonction DB échouée avec le numéro d'erreur %s <br /><font color='red'>%s</font>"
JLIB_DATABASE_ERROR_GET_NEXT_ORDER_FAILED="%s::getNextOrder échoué - %s"
JLIB_DATABASE_ERROR_GET_TREE_FAILED="%s: :getTree échoué - %s"
JLIB_DATABASE_ERROR_GETNODE_FAILED="%s: :_getNode échoué - %s"
JLIB_DATABASE_ERROR_GETROOTID_FAILED="%s: :getRootId échoué - %s"
JLIB_DATABASE_ERROR_HIT_FAILED="%s: :hit échoué - %s"
JLIB_DATABASE_ERROR_INVALID_LOCATION="%s: :setLocation - Emplacement invalide"
JLIB_DATABASE_ERROR_INVALID_NODE_RECURSION="%s: :move échoué - Impossible de déplacer le nœud pour en faire un enfant de lui-même"
JLIB_DATABASE_ERROR_INVALID_PARENT_ID="ID de parent invalide."
JLIB_DATABASE_ERROR_LANGUAGE_NO_TITLE="La langue doit avoir un titre"
JLIB_DATABASE_ERROR_LANGUAGE_UNIQUE_IMAGE="Une langue de contenu utilise déjà cette image."
JLIB_DATABASE_ERROR_LANGUAGE_UNIQUE_LANG_CODE="Un contenu langue existe déjà avec ce Tag de langue"
JLIB_DATABASE_ERROR_LANGUAGE_UNIQUE_SEF="Un contenu langue existe déjà avec ce code URL de langue"
JLIB_DATABASE_ERROR_LOAD_DATABASE_DRIVER="Impossible de charger le pilote de base de données&#160;: %s"
JLIB_DATABASE_ERROR_MENUTYPE="Certains éléments de menus ou certains modules de menus liés à ce type de menu sont invalidés par un autre utilisateur ou l'élément de menu par défaut est dans ce menu"
JLIB_DATABASE_ERROR_MENUTYPE_CHECKOUT="L'utilisateur invalidant n'est pas celui qui a invalidé ce menu ou le module de menu qui lui est associé."
JLIB_DATABASE_ERROR_MENUTYPE_EMPTY="Type de menu vide"
JLIB_DATABASE_ERROR_MENUTYPE_EXISTS="Ce type de menu existe&#160;: %s"
JLIB_DATABASE_ERROR_MENU_CANNOT_UNSET_DEFAULT="Le menu d'accueil pour les langues ne peut pas être indéterminé"
JLIB_DATABASE_ERROR_MENU_CANNOT_UNSET_DEFAULT_DEFAULT="Un élément de menu au moins doit être déterminé comme Défaut."
JLIB_DATABASE_ERROR_MENU_UNPUBLISH_DEFAULT_HOME="Impossible de dépublier la page d'accueil par défaut"
JLIB_DATABASE_ERROR_MENU_DEFAULT_CHECKIN_USER_MISMATCH="Le menu d'accueil actuel pour cette langue est invalidé"
JLIB_DATABASE_ERROR_MENU_UNIQUE_ALIAS="L'alias <strong>%1$s</strong> est déjà utilisé par le lien de menu <strong>%2$s</strong> dans le menu <strong>%3$s</strong> (rappel : ce lien de menu peut se trouver dans la corbeille)."
JLIB_DATABASE_ERROR_MENU_UNIQUE_ALIAS_ROOT="Un autre lien de menu possède le même alias dans la racine Un autre lien de menu avec le même parent possède cet alias (rappel : ce lien de menu peut se trouver dans la corbeille). La racine est le parent de plus haut niveau."
JLIB_DATABASE_ERROR_MENU_HOME_NOT_COMPONENT="L'élément de menu d'accueil doit être un composant."
JLIB_DATABASE_ERROR_MENU_HOME_NOT_UNIQUE_IN_MENU="Un menu ne doit contenir qu'une seule page d'accueil par défaut."
JLIB_DATABASE_ERROR_MENU_ROOT_ALIAS_COMPONENT="Un alias d'élément de menu de premier niveau ne peut être un 'composant'."
JLIB_DATABASE_ERROR_MENU_ROOT_ALIAS_FOLDER="Un alias d'élément de menu de premier niveau ne peut être  '%s' car '%s' est un sous-dossier de votre dossier d'installation Joomla."
JLIB_DATABASE_ERROR_MOVE_FAILED="%s: :move échoué - %s"
JLIB_DATABASE_ERROR_MUSTCONTAIN_A_TITLE_CATEGORY="La catégorie doit avoir un titre"
JLIB_DATABASE_ERROR_MUSTCONTAIN_A_TITLE_EXTENSION="L'extension doit avoir un titre"
JLIB_DATABASE_ERROR_MUSTCONTAIN_A_TITLE_MENUITEM="L'élément de menu doit avoir un titre."
JLIB_DATABASE_ERROR_MUSTCONTAIN_A_TITLE_MODULE="Le module doit avoir un titre"
JLIB_DATABASE_ERROR_MUSTCONTAIN_A_TITLE_UPDATESITE="Le site de mise à jour doit avoir un titre"
JLIB_DATABASE_ERROR_NEGATIVE_NOT_PERMITTED="%s ne peut être négatif"
JLIB_DATABASE_ERROR_NO_ROWS_SELECTED="Aucune ligne sélectionnée."
JLIB_DATABASE_ERROR_NOT_SUPPORTED_FILE_NOT_FOUND="Table %s non supportée. Fichier introuvable."
JLIB_DATABASE_ERROR_NULL_PRIMARY_KEY="Clé primaire nulle non autorisée."
JLIB_DATABASE_ERROR_ORDERDOWN_FAILED="%s: :orderDown échoué - %s"
JLIB_DATABASE_ERROR_ORDERUP_FAILED="%s: :orderUp échoué - %s"
JLIB_DATABASE_ERROR_PLEASE_ENTER_A_USER_NAME="Veuillez saisir un nom d'utilisateur."
JLIB_DATABASE_ERROR_PLEASE_ENTER_YOUR_NAME="Veuillez saisir votre nom."
JLIB_DATABASE_ERROR_PUBLISH_FAILED="%s: :publish échoué - %s"
JLIB_DATABASE_ERROR_REBUILD_FAILED="%s: :rebuild échoué - %s"
JLIB_DATABASE_ERROR_REBUILDPATH_FAILED="%s: :rebuildPath échoué - %s"
JLIB_DATABASE_ERROR_REORDER_FAILED="%s: :reorder échoué - %s"
JLIB_DATABASE_ERROR_REORDER_UPDATE_ROW_FAILED="%s : :reorder mise à jour de la ligne %s échouée - %s"
JLIB_DATABASE_ERROR_ROOT_NODE_NOT_FOUND="Nœud racine introuvable."
JLIB_DATABASE_ERROR_STORE_FAILED_UPDATE_ASSET_ID="Le champ asset_id n'a pas pu être mis à jour"
JLIB_DATABASE_ERROR_STORE_FAILED="%1$s: :store échoué<br />%2$s"
JLIB_DATABASE_ERROR_USERGROUP_PARENT_ID_NOT_VALID="Il faut au moins un groupe d'utilisateurs racine."
JLIB_DATABASE_ERROR_USERGROUP_TITLE="Le groupe d'utilisateurs doit avoir un titre"
JLIB_DATABASE_ERROR_USERGROUP_TITLE_EXISTS="Le titre du groupe d'utilisateurs existe déjà. Le titre doit être unique."
JLIB_DATABASE_ERROR_USERLEVEL_NAME_EXISTS="Le niveau d'accès &quot;%s&quot; existe déjà."
JLIB_DATABASE_ERROR_USERNAME_CANNOT_CHANGE="Impossible d'utiliser ce nom d'utilisateur"
JLIB_DATABASE_ERROR_USERNAME_INUSE="Nom d'utilisateur utilisé"
JLIB_DATABASE_ERROR_VALID_AZ09="Veuillez entrer un nom d'utilisateur valide. Sans espaces au début ou à la fin, au moins %d caractères, ne doit <strong>pas</strong> contenir les caractères suivants : < > \ &quot; ' &#37; ; ( ) & et ne doit pas dépasser 150 caractères."
JLIB_DATABASE_ERROR_VALID_MAIL="L'adresse e-mail saisie n'est pas valide. Veuillez saisir une autre adresse e-mail."
JLIB_DATABASE_ERROR_VIEWLEVEL="Le niveau d'affichage doit avoir un titre"
JLIB_DATABASE_FUNCTION_NOERROR="La fonction DB ne rapporte aucune erreur"
JLIB_DATABASE_QUERY_FAILED="Requête de base de données échouée (erreur # %s): %s"

JLIB_DOCUMENT_ERROR_UNABLE_LOAD_DOC_CLASS="Impossible de charger la classe du document"
JLIB_ENVIRONMENT_SESSION_EXPIRED="Votre session a expiré. Veuillez vous reconnecter."
JLIB_ENVIRONMENT_SESSION_INVALID="Cookie de session invalide. Vérifier que le navigateur accepte les cookies."
JLIB_ERROR_COMPONENTS_ACL_CONFIGURATION_FILE_MISSING_OR_IMPROPERLY_STRUCTURED="Le fichier de configuration des droits du composant %s est manquant ou incorrectement structuré."
JLIB_ERROR_INFINITE_LOOP="Boucle infinie détectée dans JError"
JLIB_EVENT_ERROR_DISPATCHER="JEventDispatcher::register : sous-programme de traitement des événements non reconnu. Sous-programme&#160;: %s"
JLIB_FILESYSTEM_BZIP_NOT_SUPPORTED="BZip2 non supporté"
JLIB_FILESYSTEM_BZIP_UNABLE_TO_READ="Impossible de lire l'archive (bz2)"
JLIB_FILESYSTEM_BZIP_UNABLE_TO_WRITE="Impossible d'écrire l'archive (bz2)"
JLIB_FILESYSTEM_BZIP_UNABLE_TO_WRITE_FILE="Impossible d'écrire le fichier (bz2)"
JLIB_FILESYSTEM_GZIP_NOT_SUPPORTED="Zlib non supporté"
JLIB_FILESYSTEM_GZIP_UNABLE_TO_READ="Impossible de lire l'archive (gz)"
JLIB_FILESYSTEM_GZIP_UNABLE_TO_WRITE="Impossible d'écrire l'archive (gz)"
JLIB_FILESYSTEM_GZIP_UNABLE_TO_WRITE_FILE="Impossible d'écrire le fichier (gz)"
JLIB_FILESYSTEM_GZIP_UNABLE_TO_DECOMPRESS="Impossible de décompresser les données"
JLIB_FILESYSTEM_TAR_UNABLE_TO_READ="Impossible de lire l'archive (tar)"
JLIB_FILESYSTEM_TAR_UNABLE_TO_DECOMPRESS="Impossible de décompresser les données"
JLIB_FILESYSTEM_TAR_UNABLE_TO_CREATE_DESTINATION="Impossible de créer la destination"
JLIB_FILESYSTEM_TAR_UNABLE_TO_WRITE_ENTRY="Impossible d'écrire l'entrée"
JLIB_FILESYSTEM_ZIP_NOT_SUPPORTED="Zlib non supporté"
JLIB_FILESYSTEM_ZIP_UNABLE_TO_READ="Impossible de lire l'archive (zip)"
JLIB_FILESYSTEM_ZIP_INFO_FAILED="Échec de l'obtention de l'information ZIP"
JLIB_FILESYSTEM_ZIP_UNABLE_TO_CREATE_DESTINATION="Impossible de créer la destination"
JLIB_FILESYSTEM_ZIP_UNABLE_TO_WRITE_ENTRY="Impossible d'écrire l'entrée"
JLIB_FILESYSTEM_ZIP_UNABLE_TO_READ_ENTRY="Impossible de lire l'entrée"
JLIB_FILESYSTEM_ZIP_UNABLE_TO_OPEN_ARCHIVE="Impossible d'ouvrir l'archive"
JLIB_FILESYSTEM_ZIP_INVALID_ZIP_DATA="Données ZIP invalides"
JLIB_FILESYSTEM_STREAM_FAILED="Échec de l'enregistrement du flux de chaînes"
JLIB_FILESYSTEM_UNKNOWNARCHIVETYPE="Type d'archive inconnu"
JLIB_FILESYSTEM_UNABLE_TO_LOAD_ARCHIVE="Impossible de charger l'archive"
JLIB_FILESYSTEM_ERROR_JFILE_FIND_COPY="JFile::copy : impossible de trouver ou de lire le fichier %s"
JLIB_FILESYSTEM_ERROR_JFILE_STREAMS="JFile::copy(%1$s, %2$s) : %3$s"
JLIB_FILESYSTEM_ERROR_COPY_FAILED="Échec de la copie"
JLIB_FILESYSTEM_ERROR_COPY_FAILED_ERR01="Erreur de copie&nbsp;: %1$s vers %2$s"
JLIB_FILESYSTEM_DELETE_FAILED="Échec de la suppression de %s"
JLIB_FILESYSTEM_CANNOT_FIND_SOURCE_FILE="Impossible de trouver le fichier source"
JLIB_FILESYSTEM_ERROR_JFILE_MOVE_STREAMS="JFile::move : %s"
JLIB_FILESYSTEM_ERROR_RENAME_FILE="Échec du renommage"
JLIB_FILESYSTEM_ERROR_READ_UNABLE_TO_OPEN_FILE="JFile::read : impossible d'ouvrir le fichier %s"
JLIB_FILESYSTEM_ERROR_WRITE_STREAMS="JFile::write(%1$s): %2$s"
JLIB_FILESYSTEM_ERROR_UPLOAD="JFile::upload : %s"
JLIB_FILESYSTEM_ERROR_WARNFS_ERR01="Attention : impossible de modifier les permissions du fichier."
JLIB_FILESYSTEM_ERROR_WARNFS_ERR02="Attention : impossible de déplacer le fichier."
JLIB_FILESYSTEM_ERROR_WARNFS_ERR03="Attention : Le fichier %s n'a pas été envoyé sur le serveur pour raison de sécurité!"
JLIB_FILESYSTEM_ERROR_WARNFS_ERR04="Attention: Impossible de déplacer le fichier&nbsp;: %1$s vers %2$s"
JLIB_FILESYSTEM_ERROR_FIND_SOURCE_FOLDER="Impossible de trouver le répertoire source"
JLIB_FILESYSTEM_ERROR_FOLDER_EXISTS="Le répertoire existe déjà"
JLIB_FILESYSTEM_ERROR_FOLDER_CREATE="Impossible de créer le répertoire cible"
JLIB_FILESYSTEM_ERROR_FOLDER_OPEN="Impossible d'ouvrir le répertoire source"
JLIB_FILESYSTEM_ERROR_FOLDER_LOOP="Boucle infinie détectée"
JLIB_FILESYSTEM_ERROR_FOLDER_PATH="Le chemin n'est pas dans les chemins open_basedir"
JLIB_FILESYSTEM_ERROR_COULD_NOT_CREATE_DIRECTORY="Impossible de créer le répertoire"
JLIB_FILESYSTEM_ERROR_DELETE_BASE_DIRECTORY="Vous ne pouvez pas supprimer un répertoire de base."
JLIB_FILESYSTEM_ERROR_PATH_IS_NOT_A_FOLDER="JFolder::delete : le chemin n'est pas un répertoire. Chemin&#160;: %s"
JLIB_FILESYSTEM_ERROR_FOLDER_DELETE="JFolder::delete : impossible de supprimer le répertoire. Chemin&#160;: %s"
JLIB_FILESYSTEM_ERROR_FOLDER_RENAME="Échec du renommage&#160;: %s"
JLIB_FILESYSTEM_ERROR_PATH_IS_NOT_A_FOLDER_FILES="JFolder::files : le chemin n'est pas un répertoire. Chemin&#160;: %s"
JLIB_FILESYSTEM_ERROR_PATH_IS_NOT_A_FOLDER_FOLDER="JFolder::folder : le chemin n'est pas un répertoire. Chemin&#160;: %s"
JLIB_FILESYSTEM_ERROR_STREAMS_FILE_SIZE="Impossible d'obtenir la taille du fichier. Cela peut ne pas fonctionner pour tous les flux."
JLIB_FILESYSTEM_ERROR_STREAMS_FILE_NOT_OPEN="Fichier non ouvert"
JLIB_FILESYSTEM_ERROR_STREAMS_FILENAME="Nom de fichier non réglé"
JLIB_FILESYSTEM_ERROR_NO_DATA_WRITTEN="Attention&#160;: aucune donnée écrite."
JLIB_FILESYSTEM_ERROR_STREAMS_FAILED_TO_OPEN_WRITER="Impossible d'ouvrir en écriture %s"
JLIB_FILESYSTEM_ERROR_STREAMS_FAILED_TO_OPEN_READER="Impossible d'ouvrir en lecture %s"
JLIB_FILESYSTEM_ERROR_STREAMS_NOT_UPLOADED_FILE="Pas un fichier transféré !"

JLIB_FILTER_PARAMS_ALNUM="Alpha numérique"
JLIB_FILTER_PARAMS_FLOAT="Float"
JLIB_FILTER_PARAMS_INTEGER="Nombre entier"
JLIB_FILTER_PARAMS_RAW="Brut"
JLIB_FILTER_PARAMS_SAFEHTML="Safe HTML"
JLIB_FILTER_PARAMS_TEL="Téléphone"
JLIB_FILTER_PARAMS_TEXT="Texte"

JLIB_FORM_BUTTON_CLEAR="Effacer"
JLIB_FORM_BUTTON_SELECT="Sélectionner"
JLIB_FORM_CHANGE_IMAGE="Changer d'image"
JLIB_FORM_CHANGE_IMAGE_BUTTON="Changer l'image du bouton"
JLIB_FORM_CHANGE_USER="Sélectionner un utilisateur"
JLIB_FORM_ERROR_FIELDS_CATEGORY_ERROR_EXTENSION_EMPTY="L'attribut de l'extension est vide dans le champ catégorie"
JLIB_FORM_ERROR_FIELDS_GROUPEDLIST_ELEMENT_NAME="Type d'élément inconnu&#160;: %s"
JLIB_FORM_ERROR_NO_DATA="Aucune donnée"
JLIB_FORM_ERROR_VALIDATE_FIELD="Champ xml invalide"
JLIB_FORM_ERROR_XML_FILE_DID_NOT_LOAD="Le fichier XML n'a pas été chargé"
JLIB_FORM_FIELD_INVALID="Champ invalide&#160;:&#160;"
JLIB_FORM_INPUTMODE="latin"
JLIB_FORM_INVALID_FORM_OBJECT="Objet de formulaire invalide: %s"
JLIB_FORM_INVALID_FORM_RULE="Règle de formulaire invalide: %s"
JLIB_FORM_MEDIA_PREVIEW_ALT="Image sélectionnée"
JLIB_FORM_MEDIA_PREVIEW_EMPTY="Aucune image sélectionnée."
JLIB_FORM_MEDIA_PREVIEW_SELECTED_IMAGE="Image sélectionnée"
JLIB_FORM_MEDIA_PREVIEW_TIP_TITLE="Prévisualisation"
JLIB_FORM_SELECT_USER="Sélectionnez un utilisateur"
JLIB_FORM_VALIDATE_FIELD_INVALID="Champ invalide: %s"
JLIB_FORM_VALIDATE_FIELD_REQUIRED="Champ requis: %s"
JLIB_FORM_VALIDATE_FIELD_RULE_MISSING="Règle de validation manquante: %s"
JLIB_FORM_VALIDATE_FIELD_URL_SCHEMA_MISSING="URL invalide : schéma d'URL manquant dans %1$s. Ajouter l'un des schémas suivants au début : %2$s."
JLIB_FORM_VALUE_CACHE_APC="Cache PHP alternatif"
JLIB_FORM_VALUE_CACHE_APCU="Cache utilisateur APC"
JLIB_FORM_VALUE_CACHE_CACHELITE="Cache_Lite"
JLIB_FORM_VALUE_CACHE_EACCELERATOR="eAccelerator"
JLIB_FORM_VALUE_CACHE_FILE="Fichier"
JLIB_FORM_VALUE_CACHE_MEMCACHE="Mémoire cache"
JLIB_FORM_VALUE_CACHE_MEMCACHED="Mis en mémoire cache (expérimental)"
JLIB_FORM_VALUE_CACHE_REDIS="Redis"
JLIB_FORM_VALUE_CACHE_WINCACHE="Cache de Windows"
JLIB_FORM_VALUE_CACHE_XCACHE="XCache"
JLIB_FORM_VALUE_SESSION_APC="Cache PHP alternatif"
JLIB_FORM_VALUE_SESSION_APCU="Cache utilisateur APC"
JLIB_FORM_VALUE_SESSION_DATABASE="Base de données"
JLIB_FORM_VALUE_SESSION_EACCELERATOR="eAccelerator"
JLIB_FORM_VALUE_SESSION_MEMCACHE="Mémoire cache"
JLIB_FORM_VALUE_SESSION_MEMCACHED="Mis en mémoire cache (expérimental)"
JLIB_FORM_VALUE_SESSION_NONE="PHP"
JLIB_FORM_VALUE_SESSION_REDIS="Redis"
JLIB_FORM_VALUE_SESSION_WINCACHE="Cache Windows"
JLIB_FORM_VALUE_SESSION_XCACHE="XCache"
JLIB_FORM_VALUE_TIMEZONE_UTC="Temps universel, coordonné (UTC)"
JLIB_FORM_VALUE_FROM_TEMPLATE="Du template"
JLIB_FORM_VALUE_INHERITED="Hérité"

JLIB_HTML_ACCESS_MODIFY_DESC_CAPTION_ACL="ACL"
JLIB_HTML_ACCESS_MODIFY_DESC_CAPTION_TABLE="Table"
JLIB_HTML_ACCESS_SUMMARY_DESC_CAPTION="Table du sommaire ACL"
JLIB_HTML_ACCESS_SUMMARY_DESC="Est affichée ci-dessous une vue d'ensemble du réglage des accès pour cet article. Cliquez sur les onglets ci-dessus pour personnaliser ces réglages par action."
JLIB_HTML_ACCESS_SUMMARY="Synthèse"
JLIB_HTML_ADD_TO_ROOT="Ajouter à la racine"
JLIB_HTML_ADD_TO_THIS_MENU="Ajouter à ce menu"
JLIB_HTML_BATCH_ACCESS_LABEL="Sélectionner le niveau d'accès"
JLIB_HTML_BATCH_ACCESS_LABEL_DESC="Si vous n'effectuez aucune sélection, les niveaux d'accès d'origine seront appliqués."
JLIB_HTML_BATCH_COPY="Copier"
JLIB_HTML_BATCH_FLIPORDERING_LABEL="Inverser l’ordre de tous les articles dans les catégories sélectionnées "
JLIB_HTML_BATCH_LANGUAGE_LABEL="Choisir une langue"
JLIB_HTML_BATCH_LANGUAGE_LABEL_DESC="Si aucun choix n'est effectué, la langue d'origine sera appliquée lors du traitement."
JLIB_HTML_BATCH_LANGUAGE_NOCHANGE="- Garder la langue d'origine -"
JLIB_HTML_BATCH_MENU_LABEL="Pour déplacer ou copier la sélection, choisir une catégorie"
JLIB_HTML_BATCH_MOVE="Déplacer"
JLIB_HTML_BATCH_MOVE_QUESTION="Voulez-vous déplacer les éléments ou en faire une copie ?"
JLIB_HTML_BATCH_NO_CATEGORY="- Ne pas déplacer ou copier -"
JLIB_HTML_BATCH_NOCHANGE="- Conserver les niveaux d'origine -"
JLIB_HTML_BATCH_TAG_LABEL="Ajouter un tag"
JLIB_HTML_BATCH_TAG_LABEL_DESC="Ajouter un tag à l'élément sélectionné."
JLIB_HTML_BATCH_TAG_NOCHANGE="- Conserver les tags originaux -"
JLIB_HTML_BATCH_USER_LABEL="Réglez l'utilisateur"
JLIB_HTML_BATCH_USER_LABEL_DESC="Ne pas effectuer de sélection conserve l'utilisateur original lors du processus."
JLIB_HTML_BATCH_USER_NOCHANGE="- Conserveur l'utilisateur -"
JLIB_HTML_BATCH_USER_NOUSER="Aucun utilisateur"
JLIB_HTML_BEHAVIOR_ABOUT_THE_CALENDAR="À propos du calendrier"
JLIB_HTML_BEHAVIOR_CLOSE="Fermer"
JLIB_HTML_BEHAVIOR_DATE_SELECTION="Sélection de la date&#160;:"
JLIB_HTML_BEHAVIOR_DISPLAY_S_FIRST="Afficher %s d'abord"
JLIB_HTML_BEHAVIOR_DRAG_TO_MOVE="Tirer pour déplacer"
JLIB_HTML_BEHAVIOR_GO_TODAY="Aller à aujourd'hui"
JLIB_HTML_BEHAVIOR_GREEN="Vert"
JLIB_HTML_BEHAVIOR_HOLD_MOUSE="- Maintenez enfoncé le bouton de la souris sur l'un des boutons ci-dessus pour une sélection plus rapide."
JLIB_HTML_BEHAVIOR_MONTH_SELECT="- Utilisez les boutons < et > pour sélectionner le mois"
JLIB_HTML_BEHAVIOR_NEXT_MONTH_HOLD_FOR_MENU="Cliquez pour passer au mois suivant. Maintenez cliqué pour une liste de mois."
JLIB_HTML_BEHAVIOR_NEXT_YEAR_HOLD_FOR_MENU="Cliquez pour passer à l'année suivante. Maintenez cliqué pour une liste d'années."
JLIB_HTML_BEHAVIOR_OPEN_CALENDAR="Ouvrir le calendrier"
JLIB_HTML_BEHAVIOR_PREV_MONTH_HOLD_FOR_MENU="Cliquez pour passer au mois précédent. Maintenez cliqué pour une liste de mois."
JLIB_HTML_BEHAVIOR_PREV_YEAR_HOLD_FOR_MENU="Cliquez pour passer à l'année précédente. Maintenez cliqué pour une liste d'années."
JLIB_HTML_BEHAVIOR_SELECT_DATE="Sélectionnez une date."
JLIB_HTML_BEHAVIOR_SHIFT_CLICK_OR_DRAG_TO_CHANGE_VALUE="(Maj-)Clic ou tirez pour modifier la valeur."
JLIB_HTML_BEHAVIOR_TIME="Heure :"
JLIB_HTML_BEHAVIOR_TODAY="Aujourd'hui"
JLIB_HTML_BEHAVIOR_TT_DATE_FORMAT="%a, %b %e"
JLIB_HTML_BEHAVIOR_WK="sem."
JLIB_HTML_BEHAVIOR_YEAR_SELECT="- Utilisez les boutons « et » pour sélectionner l'année"
JLIB_HTML_BUTTON_BASE_CLASS="Impossible de charger la classe de base du bouton."
JLIB_HTML_BUTTON_NO_LOAD="Impossible de charger le bouton %s (%s);"
JLIB_HTML_BUTTON_NOT_DEFINED="Bouton non défini pour le type = %s"
JLIB_HTML_CALENDAR="Calendrier"
JLIB_HTML_CHECKED_OUT="Verrouillé"
JLIB_HTML_CHECKIN="Déverrouiller"
JLIB_HTML_CLOAKING="Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser."
JLIB_HTML_DATE_RELATIVE_DAYS="Il y a %s jours"
JLIB_HTML_DATE_RELATIVE_DAYS_1="Il y a %s jour"
JLIB_HTML_DATE_RELATIVE_DAYS_0="Il y a %s jours"
JLIB_HTML_DATE_RELATIVE_HOURS="Il y a %s heures"
JLIB_HTML_DATE_RELATIVE_HOURS_1="Il y a %s heure"
JLIB_HTML_DATE_RELATIVE_HOURS_0="Il y a %s heures"
JLIB_HTML_DATE_RELATIVE_LESSTHANAMINUTE="Il y a moins d'une minute"
JLIB_HTML_DATE_RELATIVE_MINUTES="Il y a %s minutes"
JLIB_HTML_DATE_RELATIVE_MINUTES_1="Il y a %s minute"
JLIB_HTML_DATE_RELATIVE_MINUTES_0="Il y a %s minutes"
JLIB_HTML_DATE_RELATIVE_WEEKS="Il y a %s semaines"
JLIB_HTML_DATE_RELATIVE_WEEKS_1="Il y a %s semaine"
JLIB_HTML_DATE_RELATIVE_WEEKS_0="Il y a %s semaines"
JLIB_HTML_EDIT_MENU_ITEM="Modifier le lien de menu"
JLIB_HTML_EDIT_MENU_ITEM_ID="Id du lien de menu : %s"
JLIB_HTML_EDIT_MODULE="Modifier le module"
JLIB_HTML_EDIT_MODULE_IN_POSITION="Position: %s"
JLIB_HTML_EDITOR_CANNOT_LOAD="Impossible de charger l'éditeur de texte"
JLIB_HTML_END="Fin"
JLIB_HTML_ERROR_FUNCTION_NOT_SUPPORTED="Fonction non supportée."
JLIB_HTML_ERROR_NOTFOUNDINFILE="%s::%s introuvable dans le fichier."
JLIB_HTML_ERROR_NOTSUPPORTED_NOFILE="%s::%s non supporté. Fichier introuvable."
JLIB_HTML_ERROR_NOTSUPPORTED="%s::%s non supporté."
JLIB_HTML_GOTO_PAGE="Aller à la page %s"
JLIB_HTML_GOTO_POSITION="Aller à la page %s"
JLIB_HTML_MOVE_DOWN="Vers le bas"
JLIB_HTML_MOVE_UP="Vers le haut"
JLIB_HTML_NO_PARAMETERS_FOR_THIS_ITEM="Il n'y a aucun paramètre pour cet élément"
JLIB_HTML_NO_RECORDS_FOUND="Aucun enregistrement trouvé"
JLIB_HTML_PAGE_CURRENT="Page %s"
JLIB_HTML_PAGE_CURRENT_OF_TOTAL="Page %s sur %s"
JLIB_HTML_PAGINATION="Pagination"
JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST="Veuillez d'abord effectuer une sélection dans la liste."
JLIB_HTML_PUBLISH_ITEM="Publier cet élément"
JLIB_HTML_PUBLISHED_EXPIRED_ITEM="Publié, mais a expiré"
JLIB_HTML_PUBLISHED_FINISHED="Fin&#160;: %s"
JLIB_HTML_PUBLISHED_ITEM="Publié et courant"
JLIB_HTML_PUBLISHED_PENDING_ITEM="Publié, mais en attente"
JLIB_HTML_PUBLISHED_START="Début&#160;: %s"
JLIB_HTML_RESULTS_OF="Résultats %s à %s sur %s"
JLIB_HTML_SAVE_ORDER="Enregistrer l'ordre"
JLIB_HTML_SELECT_STATE="Sélectionner le statut"
JLIB_HTML_START="Début"
JLIB_HTML_UNPUBLISH_ITEM="Dépublier lʼélément"
JLIB_HTML_VIEW_ALL="Afficher tout"
JLIB_HTML_SETDEFAULT_ITEM="Régler par défaut"
JLIB_HTML_UNSETDEFAULT_ITEM="Supprimer le réglage par défaut"

JLIB_INSTALLER_ABORT="Interruption de l'installation de la langue : %s"
JLIB_INSTALLER_ABORT_ALREADYINSTALLED="L'extension est déjà installée"
JLIB_INSTALLER_ABORT_ALREADY_EXISTS="Extension %1$s: Extension %2$s existe déjà"
JLIB_INSTALLER_ABORT_COMP_BUILDADMINMENUS_FAILED="Erreur de construction des menus de l'administration"
JLIB_INSTALLER_ABORT_COMP_COPY_MANIFEST="Composant %1$s&#160;: Impossible de copier le fichier manifeste PHP.."
JLIB_INSTALLER_ABORT_COMP_COPY_SETUP="Composant %1$s&#160;: Impossible de copier le fichier d'initialisation."
JLIB_INSTALLER_ABORT_COMP_FAIL_ADMIN_FILES="Composant %s&#160;: Impossible de copier les fichiers administration."
JLIB_INSTALLER_ABORT_COMP_FAIL_SITE_FILES="Component %s&#160;: Impossible de copier les fichiers site."
JLIB_INSTALLER_ABORT_COMP_INSTALL_COPY_SETUP="Installation d'un composant&#160;: impossible de copier le fichier d'initialisation."
JLIB_INSTALLER_ABORT_COMP_INSTALL_CUSTOM_INSTALL_FAILURE="Installation d'un composant&#160;: échec de la routine d'installation personnalisée"
JLIB_INSTALLER_ABORT_COMP_INSTALL_MANIFEST="Installation d'un composant&#160;: impossible de copier le fichier PHP manifest."
JLIB_INSTALLER_ABORT_COMP_INSTALL_PHP_INSTALL="Installation d'un composant&#160;: impossible de copier le fichier PHP d'installation."
JLIB_INSTALLER_ABORT_COMP_INSTALL_PHP_UNINSTALL="Installation d'un composant&#160;: impossible de copier le fichier PHP de désinstallation."
JLIB_INSTALLER_ABORT_COMP_INSTALL_ROLLBACK="Installation d'un composant&#160;: %s"
JLIB_INSTALLER_ABORT_COMP_INSTALL_SQL_ERROR="Installation d'un composant&#160;: erreur SQL du fichier %s"
JLIB_INSTALLER_ABORT_COMP_UPDATESITEMENUS_FAILED="Installation de composant : Impossible de mettre à jour des liens de menu"
JLIB_INSTALLER_ABORT_COMP_UPDATE_ADMIN_ELEMENT="Mise à jour d'un composant&#160;: le fichier XML ne contenait pas d'élément d'administration"
JLIB_INSTALLER_ABORT_COMP_UPDATE_COPY_SETUP="Mise à jour d'un composant&#160;: impossible de copier le fichier d'initialisation."
JLIB_INSTALLER_ABORT_COMP_UPDATE_MANIFEST="Mise à jour d'un composant&#160;: impossible de copier le fichier PHP manifest."
JLIB_INSTALLER_ABORT_COMP_UPDATE_PHP_INSTALL="Mise à jour d'un composant&#160;: impossible de copier le fichier PHP d'installation."
JLIB_INSTALLER_ABORT_COMP_UPDATE_PHP_UNINSTALL="Mise à jour d'un composant&#160;: impossible de copier le fichier PHP de désinstallation."
JLIB_INSTALLER_ABORT_COMP_UPDATE_ROLLBACK="Mise à jour d'un composant&#160;: %s"
JLIB_INSTALLER_ABORT_COMP_UPDATE_SQL_ERROR="Mise à jour d'un composant&#160;: erreur SQL du fichier %s"
JLIB_INSTALLER_ABORT_CREATE_DIRECTORY="Extension %1$s&#160;: Impossible de créer le répertoire : %2$s"
JLIB_INSTALLER_ABORT_DEBUG="Installation terminée de façon inattendue&#160;:"
JLIB_INSTALLER_ABORT_DETECTMANIFEST="Impossible de détecter le fichier manifest"
JLIB_INSTALLER_ABORT_DIRECTORY="Extension %1$s&#160;: Un autre %2$s utilise déjà le répertoire du nom de&#160;: %3$s. Tentez-vous d'installer à nouveau la même extension&#160;?"
JLIB_INSTALLER_ABORT_ERROR_DELETING_EXTENSIONS_RECORD="Impossible de supprimer l'enregistrement de l'extension de la base de données."
JLIB_INSTALLER_ABORT_EXTENSIONNOTVALID="L'extension n'est pas valide"
JLIB_INSTALLER_ABORT_FILE_INSTALL_COPY_SETUP="Installation de fichiers&#160;: impossible de copier le fichier d'initialisation."
JLIB_INSTALLER_ABORT_FILE_INSTALL_CUSTOM_INSTALL_FAILURE="Installation de fichiers&#160;: échec de la routine d'installation personnalisée"
JLIB_INSTALLER_ABORT_FILE_INSTALL_FAIL_SOURCE_DIRECTORY="Installation de fichiers&#160;: impossible de trouver le répertoire source %s"
JLIB_INSTALLER_ABORT_FILE_INSTALL_ROLLBACK="Installation de fichiers&#160;: %s"
JLIB_INSTALLER_ABORT_FILE_INSTALL_SQL_ERROR="Installation de fichiers&#160;: erreur SQL du fichier %s"
JLIB_INSTALLER_ABORT_FILE_ROLLBACK="Installation de fichiers&#160;: %s"
JLIB_INSTALLER_ABORT_FILE_SAME_NAME="Installation de fichiers&#160;: une autre extension avec le même nom existe déjà."
JLIB_INSTALLER_ABORT_FILE_UPDATE_SQL_ERROR="Mise à jour de fichiers&#160;: erreur SQL du fichier %s"
JLIB_INSTALLER_ABORT_INSTALL_CUSTOM_INSTALL_FAILURE="Extension %s: Échec de l'installation personnalisée"
JLIB_INSTALLER_ABORT_LIB_COPY_FILES="Librairie %s&#160;: impossible de copier les fichiers depuis la source"
JLIB_INSTALLER_ABORT_LIB_INSTALL_ALREADY_INSTALLED="Installation de librairie&#160;: la librairie est déjà installée"
JLIB_INSTALLER_ABORT_LIB_INSTALL_COPY_SETUP="Installation de librairie&#160;: impossible de copier le fichier d'initialisation."
JLIB_INSTALLER_ABORT_LIB_INSTALL_CORE_FOLDER="Installation de la bibliothèque: la bibliothèque a le même nom qu'un dossier du noyau."
JLIB_INSTALLER_ABORT_LIB_INSTALL_FAILED_TO_CREATE_DIRECTORY="Installation de librairie&#160;: échec de création du répertoire %s"
JLIB_INSTALLER_ABORT_LIB_INSTALL_NOFILE="Installation de librairie&#160;: aucun fichier de librairie spécifié"
JLIB_INSTALLER_ABORT_LIB_INSTALL_ROLLBACK="Installation de librairie&#160;: %s"
JLIB_INSTALLER_ABORT_LOAD_DETAILS="Échec du chargement des détails de l'extension"
JLIB_INSTALLER_ABORT_MANIFEST="Extension %1$s&#160;: Could not copy PHP manifest file."
JLIB_INSTALLER_ABORT_METHODNOTSUPPORTED="Méthode non supportée pour ce type d'extension"
JLIB_INSTALLER_ABORT_METHODNOTSUPPORTED_TYPE="Méthode non supportée pour ce type d'extension&#160;: %s"
JLIB_INSTALLER_ABORT_MOD_COPY_FILES="Module %s&#160;: Could not copy files from the source"
JLIB_INSTALLER_ABORT_MOD_INSTALL_COPY_SETUP="Installation d'un module&#160;: impossible de copier le fichier d'initialisation."
JLIB_INSTALLER_ABORT_MOD_INSTALL_CREATE_DIRECTORY="Module %1$s : échec de création du répertoire %2$s"
JLIB_INSTALLER_ABORT_MOD_INSTALL_CUSTOM_INSTALL_FAILURE="Installation d'un module&#160;: échec de la routine d'installation personnalisée"
JLIB_INSTALLER_ABORT_MOD_INSTALL_DIRECTORY="Module %1$s : un autre module utilise déjà le répertoire %2$s"
JLIB_INSTALLER_ABORT_MOD_INSTALL_MANIFEST="Installation d'un module&#160;: impossible de copier le fichier manifest PHP."
JLIB_INSTALLER_ABORT_MOD_INSTALL_NOFILE="Module %s : aucun fichier de module spécifié"
JLIB_INSTALLER_ABORT_MOD_INSTALL_SQL_ERROR="Module %1$s : erreur SQL du fichier %2$s"
JLIB_INSTALLER_ABORT_MOD_ROLLBACK="Module %1$s : %2$s"
JLIB_INSTALLER_ABORT_MOD_UNINSTALL_UNKNOWN_CLIENT="Désinstallation d'un module&#160;: type de client inconnu [%s]"
JLIB_INSTALLER_ABORT_MOD_UNKNOWN_CLIENT="Module %1$s : type de client inconnu [%2$s]"
JLIB_INSTALLER_ABORT_NOINSTALLPATH="Le chemin d'installation n'existe pas"
JLIB_INSTALLER_ABORT_NOUPDATEPATH="Le chemin de mise à jour n'existe pas"
JLIB_INSTALLER_ABORT_PACK_INSTALL_COPY_SETUP="Installation d'un paquet&#160;: impossible de copier le fichier d'initialisation."
JLIB_INSTALLER_ABORT_PACK_INSTALL_CREATE_DIRECTORY="Installation d'un paquet&#160;: échec de création du répertoire %s."
JLIB_INSTALLER_ABORT_PACKAGE_INSTALL_CUSTOM_INSTALL_FAILURE="Installation d'un paquet&#160;: Erreur de routine pour installation personnalisée."
JLIB_INSTALLER_ABORT_PACKAGE_INSTALL_MANIFEST="Installation échouée&#160;: impossible de copier le fichier manifest PHP."
JLIB_INSTALLER_ABORT_PACK_INSTALL_ERROR_EXTENSION="Installation d'un paquet&#160;: il y a eu une erreur en installant l'extension %s"
JLIB_INSTALLER_ABORT_PACK_INSTALL_NO_FILES="Installation d'un paquet&#160;: il n'y avait aucun fichier à installer. %s"
JLIB_INSTALLER_ABORT_PACK_INSTALL_NO_PACK="Installation d'un paquet&#160;: aucun fichier paquet spécifié"
JLIB_INSTALLER_ABORT_PACK_INSTALL_ROLLBACK="Installation d'un paquet&#160;: %s"
JLIB_INSTALLER_ABORT_PLG_COPY_FILES="Plug-in %s&#160;: impossible de copier les fichiers depuis la source"
JLIB_INSTALLER_ABORT_PLG_INSTALL_ALLREADY_EXISTS="Plug-in %1$s : le plug-in %2$s existe déjà"
JLIB_INSTALLER_ABORT_PLG_INSTALL_COPY_SETUP="Plug-in %s : impossible de copier le fichier d'initialisation."
JLIB_INSTALLER_ABORT_PLG_INSTALL_CREATE_DIRECTORY="Plug-in %1$s : échec de la création du répertoire %2$s"
JLIB_INSTALLER_ABORT_PLG_INSTALL_CUSTOM_INSTALL_FAILURE="Installation d'un plug-in&#160;: échec de la routine d'installation personnalisée."
JLIB_INSTALLER_ABORT_PLG_INSTALL_DIRECTORY="Plug-in %1$s : un autre plug-in utilise déjà le répertoire %2$s"
JLIB_INSTALLER_ABORT_PLG_INSTALL_MANIFEST="Plug-in %s : impossible de copier le fichier manifest PHP."
JLIB_INSTALLER_ABORT_PLG_INSTALL_NO_FILE="Plug-in %s : aucun fichier plug-in spécifié"
JLIB_INSTALLER_ABORT_PLG_INSTALL_ROLLBACK="Plug-in %1$s : %2$s"
JLIB_INSTALLER_ABORT_PLG_INSTALL_SQL_ERROR="Plug-in %1$s : erreur SQL du fichier %2$s"
JLIB_INSTALLER_ABORT_PLG_UNINSTALL_SQL_ERROR="Désinstallation d'un plug-in&#160;: erreur SQL du fichier %s"
JLIB_INSTALLER_ABORT_REFRESH_MANIFEST_CACHE="Échec de l'actualisation du cache du fichier manifest&#160;: l'extension %s n'est pas installée actuellement."
JLIB_INSTALLER_ABORT_REFRESH_MANIFEST_CACHE_VALID="Échec de l'actualisation du cache du fichier manifest&#160;: l'extension n'est pas valide."
JLIB_INSTALLER_ABORT_ROLLBACK="Extension %1$s&#160;: %2$s"
JLIB_INSTALLER_ABORT_SQL_ERROR="Extension %1$s&#160;: Erreur SQL de traitement de la requête&#160;: %2$s"
JLIB_INSTALLER_ABORT_TPL_INSTALL_ALREADY_INSTALLED="Installation d'un gabarit&#160;: gabarit déjà installé"
JLIB_INSTALLER_ABORT_TPL_INSTALL_ANOTHER_TEMPLATE_USING_DIRECTORY="Installation d'un gabarit&#160;: il y a déjà un gabarit qui utilise le répertoire nommé %s. Essayez-vous d'installer à nouveau le même gabarit ?"
JLIB_INSTALLER_ABORT_TPL_INSTALL_COPY_FILES="Template Install&#160;: impossible de copier les fichiers depuis la source"
JLIB_INSTALLER_ABORT_TPL_INSTALL_COPY_SETUP="Installation d'un gabarit&#160;: impossible de copier le fichier d'initialisation."
JLIB_INSTALLER_ABORT_TPL_INSTALL_FAILED_CREATE_DIRECTORY="Installation d'un gabarit&#160;: échec de la création du répertoire %s"
JLIB_INSTALLER_ABORT_TPL_INSTALL_ROLLBACK="Installation d'un gabarit&#160;: %s"
JLIB_INSTALLER_ABORT_TPL_INSTALL_UNKNOWN_CLIENT="Installation d'un gabarit&#160;: type de client inconnu [%s]"
JLIB_INSTALLER_AVAILABLE_UPDATE_PHP_VERSION="La version %2$s est disponible pour l'extension %1$s, mais elle nécessite au moins la version de PHP %3$s alors que votre système n'utilise que la version %4$s"
JLIB_INSTALLER_AVAILABLE_UPDATE_DB_MINIMUM="La version %2$s de l'extension %1$s est disponible, mais la version %4$s de votre base de donnés %3$s n'est pas compatible. Merci de contacter votre hébergeur pour mettre à jour la version de votre base de donnés en au moins %5$s."
JLIB_INSTALLER_AVAILABLE_UPDATE_DB_TYPE="La version %2$s de l'extension %1$s est disponible, mais votre base de données %3$s n'est plus compatible.."
JLIB_INSTALLER_PURGED_UPDATES="Mises à jour effacées"
JLIB_INSTALLER_FAILED_TO_PURGE_UPDATES="Impossible d'effacer les mises à jour"
JLIB_INSTALLER_DEFAULT_STYLE="%s - Par défaut"
JLIB_INSTALLER_DISCOVER="Découvrir"
JLIB_INSTALLER_DISCOVER_INSTALL="Installation par découverte"
JLIB_INSTALLER_ERROR_CANNOT_UNINSTALL_CHILD_OF_PACKAGE="L'extension %s fait partie d'un paquet qui n'autorise pas la désinstallation d'extensions individuelles."
JLIB_INSTALLER_ERROR_COMP_DISCOVER_STORE_DETAILS="Installation de découverte d'un composant&#160;: échec de l'enregistrement des détails du composant"
JLIB_INSTALLER_ERROR_COMP_FAILED_TO_CREATE_DIRECTORY="Composant %1$s&#160;: impossible de créer le répertoire&#160;: %2$s."
JLIB_INSTALLER_ERROR_COMP_INSTALL_ADMIN_ELEMENT="Installation d'un composant&#160;: le fichier XML ne contenait pas d'élément d'administration."
JLIB_INSTALLER_ERROR_COMP_INSTALL_DIR_ADMIN="Installation d'un composant&#160;: un autre composant utilise déjà le répertoire %s"
JLIB_INSTALLER_ERROR_COMP_INSTALL_DIR_SITE="Installation d'un composant&#160;: un autre composant utilise déjà le répertoire %s"
JLIB_INSTALLER_ERROR_COMP_INSTALL_FAILED_TO_CREATE_DIRECTORY_ADMIN="Installation d'un composant&#160;: échec de la création du répertoire administration %s"
JLIB_INSTALLER_ERROR_COMP_INSTALL_FAILED_TO_CREATE_DIRECTORY_SITE="Installation d'un composant&#160;: échec de la création du répertoire site %s"
JLIB_INSTALLER_ERROR_COMP_REFRESH_MANIFEST_CACHE="Actualisation du cache du fichier manifest du composant&#160;: échec de l'enregistrement des détails du composant"
JLIB_INSTALLER_ERROR_COMP_REMOVING_ADMIN_MENUS_FAILED="Impossible de supprimer les menus d'administration."
JLIB_INSTALLER_ERROR_COMP_UNINSTALL_CUSTOM="Désinstallation d'un composant&#160;: échec du script de désinstallation personnalisée"
JLIB_INSTALLER_ERROR_COMP_UNINSTALL_FAILED_DELETE_CATEGORIES="Désinstallation d'un composant&#160;: impossible de supprimer les catégories du composant."
JLIB_INSTALLER_ERROR_COMP_UNINSTALL_ERRORREMOVEMANUALLY="Désinstallation d'un composant&#160;: désinstallation impossible. Veuillez le supprimer manuellement"
JLIB_INSTALLER_ERROR_COMP_UNINSTALL_ERRORUNKOWNEXTENSION="Désinstallation d'un composant&#160;: extension inconnue"
JLIB_INSTALLER_ERROR_COMP_UNINSTALL_FAILED_REMOVE_DIRECTORY_ADMIN="Désinstallation d'un composant&#160;: impossible de supprimer le répertoire administration du composant"
JLIB_INSTALLER_ERROR_COMP_UNINSTALL_FAILED_REMOVE_DIRECTORY_SITE="Désinstallation d'un composant&#160;: impossible de supprimer le répertoire site du composant"
JLIB_INSTALLER_ERROR_COMP_UNINSTALL_NO_OPTION="Désinstallation d'un composant&#160;: champ d'option vide, impossible de supprimer les fichiers"
JLIB_INSTALLER_ERROR_COMP_UNINSTALL_SQL_ERROR="Désinstallation d'un composant&#160;: erreur SQL dans le fichier %s"
JLIB_INSTALLER_ERROR_COMP_UNINSTALL_WARNCORECOMPONENT="Désinstallation d'un composant&#160;: tentative de désinstallation d'un composant principal"
JLIB_INSTALLER_ERROR_COMP_UPDATE_FAILED_TO_CREATE_DIRECTORY_ADMIN="Mise à jour d'un composant&#160;: échec de la création du répertoire d'administration %s"
JLIB_INSTALLER_ERROR_COMP_UPDATE_FAILED_TO_CREATE_DIRECTORY_SITE="Mise à jour d'un composant&#160;: échec de la création du répertoire du site %s"
JLIB_INSTALLER_ERROR_CREATE_DIRECTORY="JInstaller: :Install: échec de la création du répertoire %s"
JLIB_INSTALLER_ERROR_CREATE_FOLDER_FAILED="Échec de création du répertoire [%s]"
JLIB_INSTALLER_ERROR_DEPRECATED_FORMAT="Format d'installation déprécié (client='both'), utilisez l'installateur de paquets à l'avenir"
JLIB_INSTALLER_ERROR_DISCOVER_INSTALL_UNSUPPORTED="Une extension de type %s ne peut être installée par la méthode 'Découvrir'. Merci d'installer cette extension depuis le Gestionnaire d'extensions -> Installer."
JLIB_INSTALLER_ERROR_DOWNGRADE="Désolé ! Vous ne pouvez pas passer de la version inférieure %s à %s"
JLIB_INSTALLER_ERROR_DOWNLOAD_SERVER_CONNECT="Erreur de connexion au serveur %s"
JLIB_INSTALLER_ERROR_FAIL_COPY_FILE="JInstaller: :Install: échec de la copie du fichier %1$s vers %2$s"
JLIB_INSTALLER_ERROR_FAIL_COPY_FOLDER="JInstaller: :Install: échec de la copie du répertoire %1$s vers %2$s"
JLIB_INSTALLER_ERROR_FAILED_READING_NETWORK_RESOURCES="Échec de lecture de la ressource réseau %s"
JLIB_INSTALLER_ERROR_FILE_EXISTS="JInstaller: :Install: le fichier existe déjà %s"
JLIB_INSTALLER_ERROR_FILE_FOLDER="Erreur d'effacement du fichier ou répertoire %s"
JLIB_INSTALLER_ERROR_FILE_UNINSTALL_INVALID_MANIFEST="Désinstallation de fichiers&#160;: fichier manifest invalide"
JLIB_INSTALLER_ERROR_FILE_UNINSTALL_INVALID_NOTFOUND_MANIFEST="Désinstallation de fichiers&#160;: fichier manifest invalide ou introuvable."
JLIB_INSTALLER_ERROR_FILE_UNINSTALL_LOAD_ENTRY="Désinstallation de fichiers&#160;: impossible de charger l'entrée de l'extension"
JLIB_INSTALLER_ERROR_FILE_UNINSTALL_LOAD_MANIFEST="Désinstallation de fichiers&#160;: impossible de charger le fichier manifest"
JLIB_INSTALLER_ERROR_FILE_UNINSTALL_SQL_ERROR="Désinstallation de fichiers&#160;: erreur SQL dans le fichier %s"
JLIB_INSTALLER_ERROR_FILE_UNINSTALL_WARNCOREFILE="Désinstallation de fichiers&#160;: Tentative de désinstallation de fichiers core."
JLIB_INSTALLER_ERROR_FOLDER_IN_USE="Une autre extension utilise déjà le répertoire [%s]"
JLIB_INSTALLER_ERROR_LANG_DISCOVER_STORE_DETAILS="Installation de découverte d'une langue&#160;: échec de l'enregistrement des détails de la langue"
JLIB_INSTALLER_ERROR_LANG_UNINSTALL_DEFAULT="Cette langue ne peut être désinstallée tant qu'elle est définie comme langue par défaut."
JLIB_INSTALLER_ERROR_LANG_UNINSTALL_DIRECTORY="Désinstallation d'une langue&#160;: impossible de supprimer le répertoire de langue spécifié."
JLIB_INSTALLER_ERROR_LANG_UNINSTALL_ELEMENT_EMPTY="Désinstallation d'une langue&#160;: l'élément est vide, impossible de désinstaller les fichiers"
JLIB_INSTALLER_ERROR_LANG_UNINSTALL_PATH_EMPTY="Désinstallation d'une langue&#160;: le chemin de la langue est vide, impossible de désinstaller les fichiers"
JLIB_INSTALLER_ERROR_LANG_UNINSTALL_PROTECTED="Cette langue ne peut être désinstallée. Elle est protégée dans la base de données (habituellement en-GB)"
JLIB_INSTALLER_ERROR_LIB_DISCOVER_STORE_DETAILS="Installation de découverte d'une librairie&#160;: échec de l'enregistrement des détails de la librairie"
JLIB_INSTALLER_ERROR_LIB_REFRESH_MANIFEST_CACHE="Rafraichissement du cache de manifeste de bibliothèque : Impossible de stocker les détails de la librairie."
JLIB_INSTALLER_ERROR_LIB_UNINSTALL_INVALID_MANIFEST="Désinstallation d'une librairie&#160;: fichier manifest invalide"
JLIB_INSTALLER_ERROR_LIB_UNINSTALL_INVALID_NOTFOUND_MANIFEST="Désinstallation d'une librairie&#160;: fichier manifest invalide ou introuvable."
JLIB_INSTALLER_ERROR_LIB_UNINSTALL_LOAD_MANIFEST="Désinstallation d'une librairie&#160;: impossible de charger le fichier manifest"
JLIB_INSTALLER_ERROR_LIB_UNINSTALL_WARNCORELIBRARY="Désinstallation d'une librairie&#160;: tentative de désinstallation d'une librairie principale"
JLIB_INSTALLER_ERROR_LOAD_XML="JInstaller: :Install: échec du chargement du fichier XML %s"
JLIB_INSTALLER_ERROR_MOD_DISCOVER_STORE_DETAILS="Installation de découverte d'un module&#160;: échec de l'enregistrement des détails du module"
JLIB_INSTALLER_ERROR_MOD_REFRESH_MANIFEST_CACHE="Actualisation du cache du fichier manifest du module&#160;: échec de l'enregistrement des détails du module"
JLIB_INSTALLER_ERROR_MOD_UNINSTALL_ERRORUNKOWNEXTENSION="Désinstallation d'un module&#160;: extension inconnue"
JLIB_INSTALLER_ERROR_MOD_UNINSTALL_EXCEPTION="Désinstallation d'un module&#160;: %s"
JLIB_INSTALLER_ERROR_MOD_UNINSTALL_INVALID_NOTFOUND_MANIFEST="Désinstallation d'un module&#160;: fichier manifest invalide ou introuvable."
JLIB_INSTALLER_ERROR_MOD_UNINSTALL_SQL_ERROR="Désinstallation d'un module&#160;: erreur SQL dans le fichier %s"
JLIB_INSTALLER_ERROR_MOD_UNINSTALL_WARNCOREMODULE="Désinstallation d'un module&#160;: tentative de désinstallation du module principal %s"
JLIB_INSTALLER_ERROR_NO_CORE_LANGUAGE="Il n'existe aucun paquet principal pour la langue [%s]"
JLIB_INSTALLER_ERROR_NO_FILE="JInstaller: :Install: le fichier n'existe pas %s"
JLIB_INSTALLER_ERROR_NO_LANGUAGE_TAG="Le paquet ne spécifiait pas de balise de langue. Essayez-vous d'installer un ancien paquet de langue ?"
JLIB_INSTALLER_ERROR_NOTFINDJOOMLAXMLSETUPFILE="JInstaller: :Install: impossible de trouver un fichier d'initialisation XML Joomla!"
JLIB_INSTALLER_ERROR_NOTFINDXMLSETUPFILE="JInstaller: :Install: impossible de trouver un fichier d'initialisation XML"
JLIB_INSTALLER_ERROR_PACK_REFRESH_MANIFEST_CACHE="Rafraichissement du cache de manifeste de paquet : Impossible de stocker les détails du paquet."
JLIB_INSTALLER_ERROR_PACK_SETTING_PACKAGE_ID="Impossible d'enregistrer l'ID du paquet pour les extensiosn de ce paquet."
JLIB_INSTALLER_ERROR_PACK_UNINSTALL_INVALID_MANIFEST="Désinstallation de paquet&#160;: fichier manifest invalide"
JLIB_INSTALLER_ERROR_PACK_UNINSTALL_INVALID_NOTFOUND_MANIFEST="Désinstallation de paquet&#160;: fichier manifest invalide ou introuvable %s"
JLIB_INSTALLER_ERROR_PACK_UNINSTALL_LOAD_MANIFEST="Désinstallation de paquet&#160;: impossible de charger le fichier manifest"
JLIB_INSTALLER_ERROR_PACK_UNINSTALL_MANIFEST_NOT_REMOVED="Désinstallation de paquet&#160;: des erreurs ont été détectées, fichier manifest non supprimé."
JLIB_INSTALLER_ERROR_PACK_UNINSTALL_MISSINGMANIFEST="Désinstallation de paquet&#160;: fichier manifest manquant"
JLIB_INSTALLER_ERROR_PACK_UNINSTALL_NOT_PROPER="Désinstallation de paquet&#160;: cette extension a peut-être déjà été désinstallée ou n'a pas été installée correctement&#160;: %s"
JLIB_INSTALLER_ERROR_PACK_UNINSTALL_WARNCOREPACK="Désinstallation de paquet&#160;: Tentative de désinstallation de paquets core"
JLIB_INSTALLER_ERROR_PLG_DISCOVER_STORE_DETAILS="Installation de découverte d'un plug-in&#160;: échec de l'enregistrement des détails du plug-in"
JLIB_INSTALLER_ERROR_PLG_REFRESH_MANIFEST_CACHE="Actualisation du cache du fichier manifest du plug-in&#160;: échec de l'enregistrement des détails du plug-in"
JLIB_INSTALLER_ERROR_PLG_UNINSTALL_ERRORUNKOWNEXTENSION="Désinstallation de plug-in&#160;: extension inconnue"
JLIB_INSTALLER_ERROR_PLG_UNINSTALL_FOLDER_FIELD_EMPTY="Désinstallation de plug-in&#160;: champ répertoire vide, impossible de supprimer les fichiers"
JLIB_INSTALLER_ERROR_PLG_UNINSTALL_INVALID_MANIFEST="Désinstallation de plug-in&#160;: fichier manifest invalide"
JLIB_INSTALLER_ERROR_PLG_UNINSTALL_INVALID_NOTFOUND_MANIFEST="Désinstallation de plug-in&#160;: fichier manifest invalide ou introuvable."
JLIB_INSTALLER_ERROR_PLG_UNINSTALL_LOAD_MANIFEST="Désinstallation de plug-in&#160;: impossible de charger le fichier manifest"
JLIB_INSTALLER_ERROR_PLG_UNINSTALL_WARNCOREPLUGIN="Désinstallation de plug-in&#160;: tentative de désinstallation du plug-in principal %s"
JLIB_INSTALLER_ERROR_SQL_ERROR="JInstaller: :Install: erreur SQL %s"
JLIB_INSTALLER_ERROR_SQL_FILENOTFOUND="JInstaller: :Install: fichier SQL introuvable %s"
JLIB_INSTALLER_ERROR_SQL_READBUFFER="JInstaller: :Install: erreur de lecture du tampon du fichier SQL"
JLIB_INSTALLER_ERROR_TPL_DISCOVER_STORE_DETAILS="Installation d'un template : échec de l'enregistrement des détails du template"
JLIB_INSTALLER_ERROR_TPL_REFRESH_MANIFEST_CACHE="Rafraichissement du cache de manifeste de template : Impossible de stocker les détails du template."
JLIB_INSTALLER_ERROR_TPL_UNINSTALL_ERRORUNKOWNEXTENSION="Désinstallation d'un template : extension inconnue"
JLIB_INSTALLER_ERROR_TPL_UNINSTALL_INVALID_CLIENT="Désinstallation d'un template : client invalide."
JLIB_INSTALLER_ERROR_TPL_UNINSTALL_INVALID_NOTFOUND_MANIFEST="Désinstallation d'un template : fichier manifest invalide ou introuvable.."
JLIB_INSTALLER_ERROR_TPL_UNINSTALL_TEMPLATE_DEFAULT="Désinstallation d'un template : impossible de supprimer le template par défaut."
JLIB_INSTALLER_ERROR_TPL_UNINSTALL_TEMPLATE_DIRECTORY="Désinstallation d'un template : le répertoire n'existe pas, suppression des fichiers impossible"
JLIB_INSTALLER_ERROR_TPL_UNINSTALL_TEMPLATE_ID_EMPTY="Désinstallation d'un template : l'ID du template est vide, impossible de désinstaller les fichiers"
JLIB_INSTALLER_ERROR_TPL_UNINSTALL_WARNCORETEMPLATE="Désinstallation d'un template : tentative de désinstallation du template principal %s"
JLIB_INSTALLER_ERROR_UNKNOWN_CLIENT_TYPE="Type de client inconnu [%s]"
JLIB_INSTALLER_FILE_ERROR_MOVE="Erreur de déplacement du fichier %s"
JLIB_INSTALLER_INCORRECT_SEQUENCE="Le retour de la version %1$s à la version %2$s n'est pas autorisé."
JLIB_INSTALLER_INSTALL="Installer"
JLIB_INSTALLER_MINIMUM_JOOMLA="Vous ne disposez pas des exigences minimales de version Joomla pour J%s"
JLIB_INSTALLER_MINIMUM_PHP="Votre serveur ne dispose pas de la version de PHP minimale requise %s"
JLIB_INSTALLER_NOTICE_LANG_RESET_USERS="Langue par défaut de %d utilisateurs"
JLIB_INSTALLER_NOTICE_LANG_RESET_USERS_1="Langue par défaut de %d utilisateur"
JLIB_INSTALLER_UNINSTALL="Désinstaller"
JLIB_INSTALLER_UPDATE="Mettre à jour"
JLIB_INSTALLER_ERROR_EXTENSION_INVALID_CLIENT_IDENTIFIER="Identificateur de client invalide dans le fichier manifest de l'extension."
JLIB_INSTALLER_ERROR_PACK_UNINSTALL_UNKNOWN_EXTENSION="Tentative de désinstallation d'une extension inconnue du paquet. Cette extension a pu être supprimée antérieurement."
JLIB_INSTALLER_NOT_ERROR="Si l'erreur ci-dessus concerne l'installation de fichiers de langue pour TinyMce, elle n'a pas d'effet sur l'installation de(s) langue(s). Certains paquets de langue créés avant la version 3.2.0 de Joomla! peuvent aussi tenter d'installer des fichiers de langue TinyMce. Comme ceux-ci sont dorévanant inclus dans le noyau, ils n'ont plus besoin d'être installés."
JLIB_INSTALLER_UPDATE_LOG_QUERY="Requête lancée à partir du fichier %1$s. Texte de la requête: %2$s."
JLIB_INSTALLER_WARNING_UNABLE_TO_INSTALL_CONTENT_LANGUAGE="Impossible de créer une langue de contenu pour la langue %s&nbsp;: %s"

JLIB_JS_AJAX_ERROR_CONNECTION_ABORT="Une interruption de connexion est survenue lors de la récupération des données JSON."
JLIB_JS_AJAX_ERROR_NO_CONTENT="Aucun contenu n'a été retourné."
JLIB_JS_AJAX_ERROR_OTHER="Une erreur est survenue lors de la récupération des données JSON : code de statut HTTP %s ."
JLIB_JS_AJAX_ERROR_PARSE="Une erreur d'analyse est survenue lors du traitement des données JSON suivantes :<br/><code style=\"color:inherit;white-space:pre-wrap;padding:0;margin:0;border:0;background:inherit;\">%s</code>"
JLIB_JS_AJAX_ERROR_TIMEOUT="Une erreur de délai d'attente (timeout) est survenue lors de la récupération des données JSON."

JLIB_LANGUAGE_ERROR_CANNOT_LOAD_METAFILE="Impossible de charger le fichier XML de langue %s de %s."
JLIB_LANGUAGE_ERROR_CANNOT_LOAD_METADATA="Impossible de charger les metadata %s de %s."

JLIB_LOGIN_AUTHORISATION="Votre accès a été autorisé."
JLIB_LOGIN_DENIED="Votre accès a été refusé."
JLIB_LOGIN_EXPIRED="Votre authentification a expiré."

JLIB_MAIL_FUNCTION_DISABLED="La fonction mail() a été désactivée et le e-mail ne peut être envoyé."
JLIB_MAIL_FUNCTION_OFFLINE="La fonction mail() a été désactivée par un administrateur."
JLIB_MAIL_INVALID_EMAIL_SENDER="Expéditeur d'email invalide : %s"

JLIB_MEDIA_ERROR_UPLOAD_INPUT="Impossible de transférer le fichier."
JLIB_MEDIA_ERROR_WARNFILENAME="Le nom du fichier ne doit contenir que des caractères alphanumériques et pas d'espaces."
JLIB_MEDIA_ERROR_WARNFILETOOLARGE="Ce fichier est trop lourd pour être transféré."
JLIB_MEDIA_ERROR_WARNFILETYPE="Ce type de fichier n'est pas autorisé."
JLIB_MEDIA_ERROR_WARNIEXSS="Découverte d'une possible attaque IE XSS."
JLIB_MEDIA_ERROR_WARNINVALID_IMG="Image non valide."
JLIB_MEDIA_ERROR_WARNINVALID_MIME="Invalide type de mime "
JLIB_MEDIA_ERROR_WARNINVALID_MIMETYPE="Illégal type de mime détecté : %s"
JLIB_MEDIA_ERROR_WARNNOTADMIN="Le fichier à transférer n'est pas un fichier image et vous n'avez pas l'autorisation nécessaire."

JLIB_MENUS_PRESET_JOOMLA="Préréglage - Joomla"
JLIB_MENUS_PRESET_MODERN="Préréglage - Moderne"

JLIB_NO_EDITOR_PLUGIN_PUBLISHED="Impossible d'afficher un éditeur car aucun plug-in d'éditeur n'est activé."

JLIB_PLUGIN_ERROR_LOADING_PLUGINS="Erreur de chargement de plug-ins&#160;: %s"
JLIB_REGISTRY_EXCEPTION_LOAD_FORMAT_CLASS="Impossible de charger la classe format"

JLIB_RULES_ACTION="Action"
JLIB_RULES_ALLOWED="Autorisé"
JLIB_RULES_ALLOWED_ADMIN="Autorisé (Super Utilisateur)."
JLIB_RULES_ALLOWED_INHERITED="Autorisé (Hérité)"
JLIB_RULES_CALCULATED_SETTING="Droits appliqués"
JLIB_RULES_CONFLICT="Conflit"
JLIB_RULES_DATABASE_FAILURE="Échec de stockage des données dans la base de données.  "
JLIB_RULES_DENIED="Refusé"
JLIB_RULES_GROUP="%s"
JLIB_RULES_GROUPS="Groupes"
JLIB_RULES_INHERIT="Hériter"
JLIB_RULES_INHERITED="Hérité"
JLIB_RULES_NOT_ALLOWED="Non autorisé"
JLIB_RULES_NOT_ALLOWED_ADMIN_CONFLICT="Conflit"
JLIB_RULES_NOT_ALLOWED_DEFAULT="Non autorisé (Défaut)"
JLIB_RULES_NOT_ALLOWED_INHERITED="Non autorisé (Hérité)"
JLIB_RULES_NOT_ALLOWED_LOCKED="Non autorisé (verrouillé)."
JLIB_RULES_NOT_SET="Non défini"
JLIB_RULES_NOTICE_RECALCULATE_GROUP_PERMISSIONS="Droits du Super Utilisateur modifiés. Sauvegarder pour recharger la page afin de recalculer les droits de ce groupe."
JLIB_RULES_NOTICE_RECALCULATE_GROUP_CHILDS_PERMISSIONS="Droits modifiés pour un groupe ayant des groupes enfants. Sauvegarder pour recharger la page afin de recalculer les droits des groupes enfants."
JLIB_RULES_REQUEST_FAILURE="Échec de l'envoi des données au serveur."
JLIB_RULES_SAVE_BEFORE_CHANGE_PERMISSIONS="Merci de sauvegarder avant de changer les permissions."
JLIB_RULES_SELECT_ALLOW_DENY_GROUP="Autoriser ou refuser l'action %s aux utilisateurs du groupe %s"
JLIB_RULES_SELECT_SETTING="Modifier un droit"
JLIB_RULES_SETTING_NOTES="Les modifications des droits s'appliqueront à ce groupe ainsi qu'aux groupes enfants, composants et contenus.<br /><em><strong>Refusé</strong></em> l'emporte sur tout droit hérité, ainsi que tout droit d'un groupe enfant, composant ou contenu ; s'il y a conflit, <em><strong>Refusé</strong></em> est appliqué.<br /><em><strong>Non défini</strong></em> est équivalent à <em><strong>Refusé</strong></em> mais peut être modifié dans les groupes enfants, composants et contenus."
JLIB_RULES_SETTING_NOTES_ITEM="Les modifications des droits s'appliqueront à cet élément. Noter que :<br /><em><strong>Hérité</strong></em> signifie que les droits globaux, groupe parent et catégorie seront utilisés.<br /><em><strong>Refusé</strong></em> signifie que quels que soient les droits globaux, ceux du groupe parent ou de la catégorie, le groupe concerné ne pourra utiliser cette action pour cet élément.<br /><em><strong>Autorisé</strong></em> signifie que le groupe concerné pourra utiliser cette action pour cet élément (mais s'il y a conflit avec les droits globaux, le groupe parent ou la catégorie, ceci n'aura pas d'impact). Un conflit sera indiqué par <em><strong>Non autorisé (Hérité)</strong></em> dans la colonne 'Droits appliqués'."
JLIB_RULES_SETTINGS_DESC="Paramètres des droits pour ce groupe d'utilisateurs (voir les notes au bas)."

JLIB_STEMMER_INVALID_STEMMER="Type de langue source invalide %s"

JLIB_UNKNOWN="Inconnu"
JLIB_UPDATER_ERROR_COLLECTION_FOPEN="Le paramètre PHP allow_url_fopen est désactivé. Il doit être activé pour que la mise à jour fonctionne."
JLIB_UPDATER_ERROR_COLLECTION_OPEN_URL="Mise à jour::Collection : impossible d'ouvrir %s"
JLIB_UPDATER_ERROR_COLLECTION_PARSE_URL="Mise à jour::Collection : impossible d'analyser %s"
JLIB_UPDATER_ERROR_EXTENSION_OPEN_URL="Mise à jour::Extension : impossible d'ouvrir %s"
JLIB_UPDATER_ERROR_EXTENSION_PARSE_URL="Mise à jour::Extension : impossible d'analyser %s"
JLIB_UPDATER_ERROR_OPEN_UPDATE_SITE="Mise à jour&#160;: Impossible d'ouvrir le site de mise à jour avec l'ID %d, &quot;%s&quot;, URL&#160;: %s"
JLIB_USER_ERROR_AUTHENTICATION_FAILED_LOAD_PLUGIN="JAuthentication::authenticate : échec du chargement du plug-in %s"
JLIB_USER_ERROR_AUTHENTICATION_LIBRARIES="JAuthentication: :__construct : impossible de charger les librairies d'authentification."
JLIB_USER_ERROR_BIND_ARRAY="Impossible de lier le tableau à l'objet utilisateur"
JLIB_USER_ERROR_CANNOT_CHANGE_SUPER_USER="Un utilisateur n'est pas autorisé à changer les droits d'un groupe Super Utilisateur."
JLIB_USER_ERROR_CANNOT_CHANGE_OWN_GROUPS="Un utilisateur n'est pas autorisé à changer les droits de ses propres groupes."
JLIB_USER_ERROR_CANNOT_CHANGE_OWN_PARENT_GROUPS="Un utilisateur n'est pas autorisé à changer les droits des groupes parents de ses propres groupes."
JLIB_USER_ERROR_CANNOT_DEMOTE_SELF="Vous ne pouvez pas supprimer vos propres droits de Super Utilisateur"
JLIB_USER_ERROR_CANNOT_REUSE_PASSWORD="Vous ne pouvez pas réutiliser votre mot de passe actuel, saisissez un nouveau mot de passe."
JLIB_USER_ERROR_ID_NOT_EXISTS="JUser::_load : l'utilisateur %s n'existe pas"
JLIB_USER_ERROR_NOT_SUPERADMIN="Seuls les membres possédant des droits de Super Utilisateur peuvent modifier les comptes des autres Super Utilisateurs."
JLIB_USER_ERROR_PASSWORD_NOT_MATCH="Les mots de passe ne correspondent pas. Veuillez ressaisir le mot de passe."
JLIB_USER_ERROR_UNABLE_TO_FIND_USER="Impossible de trouver un utilisateur avec la chaîne d'activation donnée"
JLIB_USER_ERROR_UNABLE_TO_LOAD_USER="JUser::_load : impossible de charger l'utilisateur ayant l'ID %s"
JLIB_USER_EXCEPTION_ACCESS_USERGROUP_INVALID="Le groupe d'utilisateurs n'existe pas"
JLIB_UTIL_ERROR_APP_INSTANTIATION="Erreur de lancement de l'application"
JLIB_UTIL_ERROR_CONNECT_DATABASE="JDatabase::getInstance : connexion à la base de données impossible <br />joomla.library : %1$s - %2$s"
JLIB_UTIL_ERROR_DOMIT="DommitDocument est déprécié. Utilisez DomDocument à la place"
JLIB_UTIL_ERROR_LOADING_FEED_DATA="Échec du chargement des données du flux"
JLIB_UTIL_ERROR_XML_LOAD="Échec du chargement du fichier XML"
language/fr-FR/fr-FR.com_cache.ini000060400000006731152453623440012573 0ustar00; @date        2015-07-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_CACHE="Cache"
COM_CACHE_BACK_CACHE_MANAGER="Retourner au cache"
COM_CACHE_CLEAR_CACHE_ADMIN="Purger le cache d'administration"
COM_CACHE_CLEAR_CACHE="Maintenance : Effacer le cache"
COM_CACHE_CLEAR_CACHE_ADMIN_TITLE="Maintenance : Effacer le cache (Administration)"
COM_CACHE_CLEAR_CACHE_SITE_TITLE="Maintenance : Effacer le cache (Site)"
COM_CACHE_PURGE_EXPIRED_CACHE="Maintenance : Effacer les fichiers cache expirés"
COM_CACHE_CONFIGURATION="Cache : paramètres"
COM_CACHE_ERROR_CACHE_CONNECTION_FAILED="Impossible de se connecter à la mémoire cache pour récupérer les données du cache."
COM_CACHE_ERROR_CACHE_DRIVER_UNSUPPORTED="Impossible de lire les données du cache. Le gestionnaire de cache configuré n'est pas pris en charge par cet environnement."
COM_CACHE_EXPIRED_ITEMS_HAVE_BEEN_DELETED="Les groupes de cache sélectionnés ont été effacés."
COM_CACHE_EXPIRED_ITEMS_HAVE_BEEN_PURGED="Les fichiers de cache expirés ont été effacés."
COM_CACHE_EXPIRED_ITEMS_DELETE_ERROR="Erreur d'effacement des groupes de cache: %s."
COM_CACHE_EXPIRED_ITEMS_PURGING_ERROR="Erreur au cours de l'effacement des fichiers de cache expirés."
COM_CACHE_FILTER_SEARCH_DESC="Recherche dans le groupe de cache."
COM_CACHE_FILTER_SEARCH_LABEL="Recherche de cache "
COM_CACHE_GROUP="Groupe de cache"
COM_CACHE_HEADING_GROUP_ASC="Groupe de cache ascendant"
COM_CACHE_HEADING_GROUP_DESC="Groupe de cache descendant"
COM_CACHE_HEADING_COUNT_ASC="Nombre de fichiers ascendant"
COM_CACHE_HEADING_COUNT_DESC="Nombre de fichiers descendant"
COM_CACHE_HEADING_SIZE_ASC="Taille ascendant"
COM_CACHE_HEADING_SIZE_DESC="Taille descendant"
COM_CACHE_MANAGER="Cache"
COM_CACHE_MSG_ALL_CACHE_GROUPS_CLEARED="Tous les groupes de cache ont été effacés."
COM_CACHE_MSG_SOME_CACHE_GROUPS_CLEARED="Seuls certains groupes de cache ont été effacés."
COM_CACHE_NUMBER_OF_FILES="Nombre de fichiers"
COM_CACHE_PURGE_CACHE_ADMIN="Purger le cache d'administration"
COM_CACHE_PURGE_EXPIRED="Effacer les fichiers expirés"
COM_CACHE_PURGE_EXPIRED_ITEMS="Effacer les fichiers cache expirés"
COM_CACHE_PURGE_INSTRUCTIONS="Cliquez sur l'icône 'Effacer les fichiers expirés' dans la barre d'outils pour supprimer du cache tous les fichiers expirés.<br />Note: les fichiers en cache qui sont toujours en vigueur ne seront pas supprimés."
COM_CACHE_RESOURCE_INTENSIVE_WARNING="Ceci peut monopoliser beaucoup de ressources sur des sites avec un grand nombre de fichiers en cache."
COM_CACHE_SIZE="Taille"
COM_CACHE_SELECT_CLIENT="- Sélectionnez l'emplacement -"
COM_CACHE_XML_DESCRIPTION="Gestionnaire de cache"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_CACHE="Les modifications ne s'appliquent qu'à ce composant.<br /><em><strong>Hérité</strong></em> - les droits globaux ou ceux des groupes parents seront utilisés.<br /><em><strong>Refusé</strong></em> - prévaut toujours, quels que soient les droits globaux ou ceux des groupes parents, et s'applique aux éléments enfants.<br /><em><strong>Autorisé</strong></em> - le groupe concerné pourra effectuer cette action dans ce composant sauf si les droits globaux sont différents."
language/fr-FR/fr-FR.plg_quickicon_privacycheck.sys.ini000060400000001264152453623440017065 0ustar00; @date        2018-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_QUICKICON_PRIVACYCHECK="Icône raccourci -  Notification de demandes d'informations de confidentialité"
PLG_QUICKICON_PRIVACYCHECK_XML_DESCRIPTION="Vérifie les demandes d'informations de confidentialité qui doivent être traitées et vous avertit lorsque vous visitez la page du Panneau de configuration."
language/fr-FR/fr-FR.plg_fields_repeatable.sys.ini000060400000001043152453623440015772 0ustar00; @date        2018-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_REPEATABLE="Champs - Répétabilité"
PLG_FIELDS_REPEATABLE_XML_DESCRIPTION="Plugin pour créer un formulaire répétable avec des champs personnalisables."
language/fr-FR/fr-FR.plg_editors-xtd_image.ini000060400000001255152453623440015140 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8 - No BOM


PLG_EDITORS-XTD_IMAGE="Bouton - Image"
PLG_IMAGE_BUTTON_IMAGE="Image"
PLG_IMAGE_XML_DESCRIPTION="Affiche un bouton sous l'éditeur pour insérer des images dans les contenus.<br />Ouvre une fenêtre popup permettant de spécifier les propriétés de l'image et, d'en transférer sur le serveur."

language/fr-FR/fr-FR.plg_sampledata_blog.ini000060400000025143152453623440014650 0ustar00; @date        2017-09-05
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SAMPLEDATA_BLOG="Données exemple - Blog"
PLG_SAMPLEDATA_BLOG_OVERVIEW_DESC="Données exemple pour créer un site de type blog.<br>Si le site est multilingue, les données seront taggées à la langue active de l'administration."
PLG_SAMPLEDATA_BLOG_OVERVIEW_TITLE="Données exemple blog"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_0_FULLTEXT=""
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_0_INTROTEXT="<p>Cette page a pour but de présenter brièvement le blog et la personne qui l'écrit. </p><p>Lorsque vous serez connecté, vous aurez la possibilité de modifier cette page en cliquant sur le lien «&nbsp;Modifier&nbsp;».</p>"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_0_TITLE="A propos de ce site"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_1_FULLTEXT=""
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_1_INTROTEXT="<p>Vous trouverez ici quelques astuces basiques pour travailler sur votre site.</p><ul><li>Joomla! a une partie «&nbsp;Site&nbsp;» (ou frontale), que vous êtes en train de regarder, et une partie «&nbsp;Administration&nbsp;» (ou arrière) qui est l'endroit où vous effectuez le travail plus avancé comme régler les menus ou décider quels modules afficher. Vous devez vous connecter à l'administration séparément en utilisant le même identifiant et le même mot de passe que vous utilisez sur cette partie du site.</li><li>Une des premières choses que vous souhaiterez faire sera probablement de changer le titre du site ansi que sa description. Pour cela, connectez-vous à l'administration puis, dans le menu «&nbsp;Extensions&nbsp;», cliquez sur «&nbsp;Gestion des templates&nbsp;». Ce site est installé avec le template «&nbsp;Protostar&nbsp;» (actuellement utilisé) et le template «&nbsp;Beez3&nbsp;». Pour appliquer un template, cliquez sur l'étoile à droite de son titre, la couleur jaune indique que le template est celui utilisé. En cliquant sur le nom du template, un formulaire est affiché vous permettant de modifier les paramètres selon vos souhaits. Vous pouvez expérimenter les différents paramètres proposés.</li><li>Vous souhaitez probablement installer un nouveau template pour changer l'aspect du site. Pour cela, dans le menu «&nbsp;Extension&nbsp;», cliquez sur «&nbsp;Gestion des extensions&nbsp;», vous accédez à l'onglet «&nbsp;Installation&nbsp;».<br />Il existe de nombreux templates gratuits et commerciaux pour Joomla!</li><li>Comme vous l'avez déjà vu, vous pouvez contrôler qui peut voir les différentes parties de votre site. Quand vous travaillez aves des modules, articles ou liens web, régler le niveau d'accès sur «&nbsp;Enregistré&nbsp;» signifie que seuls les utilisateurs identifiés sur le site pourront y accéder.</li><li>Quand vous créez un nouvel article ou un autre type de contenu, vous pouvez également l'enregistrer comme «&nbsp;Publié&nbsp;» ou «&nbsp;Non-publié&nbsp;». S'il est «&nbsp;Non-publié&nbsp;», les visiteurs du site ne pourront pas le voir, mais vous oui.</li><li>Vous pouvez en apprendre d'avantage sur comment travailler avec Joomla! en consultant le <a href=\"http://docs.joomla.org\">site de documentation Joomla</a> et obtenir de l'aide des autres utilisateurs en consultant les <a href=\"http://forum.joomla.org\">forums Joomla.org</a> (en anglais) et les <a href=\"http://forum.joomla.fr\">forums Joomla.fr</a> (en français).<br />Dans l'administration, un bouton «&nbsp;Aide&nbsp;» est disponible dans toutes les interfaces, vous apportant des informations détaillées sur leur utilisation.</li></ul>"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_1_TITLE="Travailler sur le site"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_2_FULLTEXT=""
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_2_INTROTEXT="<p>Ce site est un exemple d'affichage d'articles sous forme de blog.</p><p>Si vous vous connectez sur le site (le lien «&nbsp;Connexion 'Auteur'&nbsp;» se trouve dans le «&nbsp;Menu bas&nbsp;») vous pourrez modifier cet article ainsi que tous les autres. Vous pourrez également créer un nouvel article.</p><p>En ajoutant et en modifiant vos articles, vous verrez les changements effectués sur votre site et vous pourrez le personnaliser de différentes façons.</p><p>Vous pouvez y aller sans crainte, vous ne casserez rien.</p>"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_2_TITLE="Bienvenue sur votre blog"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_3_FULLTEXT="<p>Sur la page entière vous verrez l'introduction ainsi que le reste de l'article. Vous pouvez changer les réglages afin de cacher le texte d'introduction si vous le souhaitez.</p><p></p><p></p><p></p>"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_3_INTROTEXT="<p>La page d'accueil est paramétrée pour afficher les quatre articles les plus récents de la catégorie «&nbsp;Blog&nbsp;», sous forme de colonne. Il y a ensuite les liens vers les 2 articles précédents. Vous pouvez changer ces nombres en éditant les paramètres de contenu, onglet Blog/En vedette, dans l'administration du site. Vous trouverez un lien vers votre administration dans le menu haut.</p><p>Si vous souhaitez avoir vos articles de blog divisés en deux parties, une introduction et ensuite une page entière, utilisez le bouton «&nbsp;Lire la suite&nbsp;» pour insérer une séparation (tel ci-dessous).</p>"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_3_TITLE="A propos de la page d'accueil"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_4_FULLTEXT=""
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_4_INTROTEXT="<p>Votre site possède quelques modules communs déjà pré-configurés. Cela inclut :</p><ul><li>Le «&nbsp;Module image&nbsp;» qui affiche l'image sous le menu. C'est un module de type «&nbsp;Contenu personnalisé&nbsp;» que vous pouvez modifier pour changer l'image.</li><li>Le module «&nbsp;Articles les plus lus&nbsp;» liste les articles, basé sur le nombre de fois où ils ont été affichés.</li><li>Le module «&nbsp;Articles les plus anciens&nbsp;» liste les articles par mois.</li><li>Le module «&nbsp;Lien de flux RSS&nbsp;» permet à vos lecteurs de lire vos articles dans un lecteur de flux (Fil d'actualité).</li></ul><p>Chacun de ces modules possède de nombreux paramètres que vous pouvez expérimenter dans la «&nbsp;Gestion des modules&nbsp;» à partir de l'administration. Joomla inclut également de nombreux autres modules que vous pouvez incorporer à votre site. En développant votre site, vous souhaiterez sans doute ajouter d'autres modules, vous pourrez en trouver sur le site officiel des extensions de Joomla (<a href=\"https://extensions.joomla.org\">JED - Joomla Extensions Directory)</a> ou sur le site officiel des extensions en français pour Joomla (<a href=\"http://extensions.joomla.fr\" target=\"_blank\">extensions.joomla.fr</a>).</p>"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_4_TITLE="Vos modules"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_5_FULLTEXT=""
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_5_INTROTEXT="<p>Les templates contrôlent l'apparence du votre site. Ce blog, par exemple, est installé avec le template «&nbsp;Protostar&nbsp;».</p><p>Vous pouvez modifier les options dans le «&nbsp;Gestionnaire de templates&nbsp;». Cliquez sur «&nbsp;Mon style par défaut (Protostar)&nbsp;».</p><p>Vous pouvez par exemple changer la couleur du fond du site, le titre du site, la description du site ainsi que la police des titres.</p><p>Plus d'options sont disponibles dans l'administration du site. Vous pouvez également installer un nouveau template en utilisant le gestionnaire d'extensions.</p>"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_ARTICLE_5_TITLE="Votre template"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_CATEGORY_0_TITLE="Blog"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_CONTENT_CATEGORY_1_TITLE="Aide"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_0_TITLE="Blog"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_1_TITLE="A propos de ce site"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_2_TITLE="Connexion auteur"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_3_TITLE="Créer un article"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_4_TITLE="Travailler sur le site"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_5_TITLE="Administration du site"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_6_TITLE="Modifier le mot de passe"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_7_TITLE="Déconnexion"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_8_TITLE="Connexion auteur"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_9_TITLE="Paramètres du site"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_ITEM_10_TITLE="Paramètres du template"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_MENU_0_DESCRIPTION="Le menu principal du site"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_MENU_0_TITLE="Menu principal blog"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_MENU_1_DESCRIPTION=""
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_MENU_1_TITLE="Menu auteur"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_MENU_2_DESCRIPTION=""
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MENUS_MENU_2_TITLE="Menu bas"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_0_TITLE="Menu principal blog"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_1_TITLE="Menu auteur"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_2_TITLE="Liens de flux RSS"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_3_TITLE="Articles archivés"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_4_TITLE="Articles les plus lus"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_5_TITLE="Articles les plus anciens"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_6_TITLE="Menu bas"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_7_TITLE="Recherche"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_8_TITLE="Image"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_9_TITLE="Tags populaires"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_10_TITLE="Articles similaires"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_11_TITLE="Information sur le site"
PLG_SAMPLEDATA_BLOG_SAMPLEDATA_MODULES_MODULE_12_TITLE="Infos de mise à jour"
PLG_SAMPLEDATA_BLOG_STEP_FAILED="Etape %1$u a échoué : %2$s"
PLG_SAMPLEDATA_BLOG_STEP_SKIPPED="Etape %1$u ignorée : '%2$s' n'est pas installé ou désactivé."
PLG_SAMPLEDATA_BLOG_STEP1_SUCCESS="Etape 1 : Articles installés!"
PLG_SAMPLEDATA_BLOG_STEP2_SUCCESS="Etape 2 : Menus installés!"
PLG_SAMPLEDATA_BLOG_STEP3_SUCCESS="Etape 3 : Modules installés!"
PLG_SAMPLEDATA_BLOG_XML_DESCRIPTION="Fournit des données exemple de type blog qui peuvent être installées par le module de base de données."
language/fr-FR/fr-FR.com_users.sys.ini000060400000006670152453623440013510 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_USERS="Utilisateurs"
COM_USERS_XML_DESCRIPTION="Composant pour la gestion des utilisateurs"

COM_USERS_CONTENT_TYPE_CATEGORY="Catégorie de notes d'utilisateur"
COM_USERS_CONTENT_TYPE_NOTE="Notes d'utilisateur"
COM_USERS_CONTENT_TYPE_USER="Utilisateur"
COM_USERS_GROUPS_VIEW_DEFAULT_DESC="Affiche une liste des groupes d'utilisateurs"
COM_USERS_GROUPS_VIEW_DEFAULT_TITLE="Groupes d'utilisateurs"
COM_USERS_GROUP_VIEW_EDIT_DESC="Affiche un formulaire de création d'un nouveau groupe d'utilisateurs"
COM_USERS_GROUP_VIEW_EDIT_TITLE="Créer un groupe d'utilisateurs"
COM_USERS_LEVELS_VIEW_DEFAULT_DESC="Affiche une liste des niveaux d'accès"
COM_USERS_LEVELS_VIEW_DEFAULT_TITLE="Niveaux d'accès"
COM_USERS_LEVEL_VIEW_EDIT_DESC="Affiche un formulaire de création d'un nouveau niveau d'accès"
COM_USERS_LEVEL_VIEW_EDIT_TITLE="Créer un niveau d'accès"
COM_USERS_MAIL_VIEW_DEFAULT_DESC="Affiche un formulaire pour envoi d'e-mails en nombre"
COM_USERS_MAIL_VIEW_DEFAULT_TITLE="Envoi d'e-mails en nombre"
COM_USERS_NOTES_VIEW_DEFAULT_DESC="Affiche une liste des Notes d'utilisateurs"
COM_USERS_NOTES_VIEW_DEFAULT_TITLE="Notes d'utilisateurs"
COM_USERS_NOTE_VIEW_EDIT_DESC="Affiche un formulaire de création d'une nouvelle note d'utilisateur"
COM_USERS_NOTE_VIEW_EDIT_TITLE="Créer une note d'utilisateur"
COM_USERS_TAGS_CATEGORY="Catégorie de notes d'utilisateur"
COM_USERS_USERS_VIEW_DEFAULT_DESC="Affiche une liste des utilisateurs"
COM_USERS_USERS_VIEW_DEFAULT_TITLE="Utilisateurs"
COM_USERS_USER_VIEW_EDIT_DESC="Affiche un formulaire de création d'un nouveau compte d'utilisateur"
COM_USERS_USER_VIEW_EDIT_TITLE="Créer un utilisateur"
COM_USER_LOGIN_VIEW_DEFAULT_DESC="Affiche un formulaire de connexion pour les utilisateurs inscrits"
COM_USER_LOGIN_VIEW_DEFAULT_OPTION="Formulaire de connexion"
COM_USER_LOGIN_VIEW_DEFAULT_TITLE="Connexion"
COM_USER_LOGOUT_VIEW_DEFAULT_DESC="Déconnexion directe et redirection vers la page."
COM_USER_LOGOUT_VIEW_DEFAULT_OPTION="Déconnexion"
COM_USER_LOGOUT_VIEW_DEFAULT_TITLE="Déconnexion"
COM_USER_PROFILE_EDIT_DEFAULT_DESC="Affiche à l'utilisateur connecté un formulaire de modification de son profil"
COM_USER_PROFILE_EDIT_DEFAULT_OPTION="Formulaire de modification du profil"
COM_USER_PROFILE_EDIT_DEFAULT_TITLE="Modification du profil"
COM_USER_PROFILE_VIEW_DEFAULT_DESC="Affiche son profil à l'utilisateur connecté"
COM_USER_PROFILE_VIEW_DEFAULT_OPTION="Profil de l'utilisateur"
COM_USER_PROFILE_VIEW_DEFAULT_TITLE="Profil de l'utilisateur"
COM_USER_REGISTRATION_VIEW_DEFAULT_DESC="Affiche un formulaire d'inscription utilisateur"
COM_USER_REGISTRATION_VIEW_DEFAULT_OPTION="Défaut"
COM_USER_REGISTRATION_VIEW_DEFAULT_TITLE="Enregistrement"
COM_USER_REMIND_VIEW_DEFAULT_DESC="Affiche un formulaire de demande d'envoi par e-mail de l'identifiant"
COM_USER_REMIND_VIEW_DEFAULT_OPTION="Défaut"
COM_USER_REMIND_VIEW_DEFAULT_TITLE="Rappel de l'identifiant"
COM_USER_RESET_VIEW_DEFAULT_DESC="Affiche un formulaire de demande de réinitialisation du mot de passe"
COM_USER_RESET_VIEW_DEFAULT_OPTION="Défaut"
COM_USER_RESET_VIEW_DEFAULT_TITLE="Réinitialisation du mot de passe"
language/fr-FR/fr-FR.com_jce.menu.ini000060400000001040152453623440013220 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

COM_JCE="JCE Administration"
COM_JCE.COM_JCE_MENU_PROFILES="Profils JCE"
COM_JCE.COM_JCE_MENU_CONFIG="Configuration globale"
COM_JCE.COM_JCE_MENU_CPANEL="Panneau de contrôle"
COM_JCE.COM_JCE_MENU_FILEBROWSER="Gestionnaire de fichiers"
language/fr-FR/fr-FR.plg_quickicon_phpversioncheck.sys.ini000060400000001225152453623440017602 0ustar00; @date        2016-10-27
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_QUICKICON_PHPVERSIONCHECK="Icône raccourci - Vérification de la version de PHP"
PLG_QUICKICON_PHPVERSIONCHECK_XML_DESCRIPTION="Vérifie l'état de prise en charge de la version de PHP de votre installation et génère un avertissement si la prise en charge est incomplète. "
language/fr-FR/fr-FR.com_login.ini000060400000001412152453623440012627 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_LOGIN="Connexion"
COM_LOGIN_JOOMLA_ADMINISTRATION_LOGIN="Connexion à l'interface d'administration"
COM_LOGIN_RETURN_TO_SITE_HOME_PAGE="Accéder à la page d'accueil du site"
COM_LOGIN_VALID="Veuillez utiliser un identifiant et un mot de passe valides pour accéder à l'interface d'administration du site."
COM_LOGIN_XML_DESCRIPTION="Ce composant gère la connexion des visiteurs sur le site."
language/fr-FR/fr-FR.plg_content_emailcloak.ini000060400000001460152453623440015361 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_CONTENT_EMAILCLOAK="Contenu - Protection des e-mails"
PLG_CONTENT_EMAILCLOAK_LINKABLE="En tant que lien e-mail"
PLG_CONTENT_EMAILCLOAK_MODE_DESC="Choisissez la façon dont les e-mails seront affichés"
PLG_CONTENT_EMAILCLOAK_MODE_LABEL="Mode"
PLG_CONTENT_EMAILCLOAK_NONLINKABLE="Texte sans lien"
PLG_CONTENT_EMAILCLOAK_XML_DESCRIPTION="Protège des robots spammeurs toutes les adresses e-mail dans les contenus (utilise JavaScript)"
language/fr-FR/fr-FR.plg_system_fmalertcookies.ini000060400000041637152453623440016153 0ustar00PLG_SYSTEM_FMALERTCOOKIES="Folcomedia - Plugin alerte utilisation cookies"
PLG_SYSTEM_FMALERTCOOKIES_XML_DESCRIPTION="<b style='color:red'>Note : les champs apparaissent lorsque le plugin est activé puis enregistré.</b><br/><br/>
Vous pouvez ajouter vos propres règles CSS en allant modifier le fichier <b style='color:black'>custom.css</b> en allant dans par le biais d'un logiciel FTP dans <b style='color:black'>plugins/system/fmalertcookies/assets/css/custom.css</b><br/><br/>
Ce plugin a pour but d'afficher un message sur la page d'accueil de votre site pour alerter l'utilisateur que votre site utilise des cookies pour récolter diverses informations.<br/><br/>
**** V 1.3.5 ****<br/>
- Correction d'un problème avec la version de PHP 7.2<br/>
- Ajout de la langue allemande (Thomas Sommer).<br/><br/>
**** V 1.3.2 ****<br/>
- Amélioration SEO empêchant les robots des moteurs de recherche d'indexer le message d'alerte des cookies.<br/><br/>
**** V 1.3.1 ****<br/>
- Corrections de bugs.<br/>
- Améliorations visuelles des onglets des langues.<br/><br/>
**** V 1.3.0 ****<br/>
- Le plugin peut maintenant bloquer tous les cookies tant que le message n'a pas été accepté.<br/><br/>
**** V 1.2.15 ****<br/>
- Correction d'un problème SEO quand le message d'alerte était en haut de votre page.<br/>
- Possibilité d'afficher ou non le message quand votre site est en maintenance.<br/>
- Ajout de balise CSS afin de vous permettre de modifier le message comme vous le souhaitez.<br/><br/>
**** V 1.2.14 ****<br/>
- Ajout d'un bouton de donation pour soutenir le projet.<br/>
- Ajout de la langue Hongroise (Merci à Zoltan Balazs).<br/>
- Correction W3C.<br/><br/>
**** V 1.2.12 + 1.2.13 ****<br/>
- Optimisation du plugin.<br/><br/>
**** V 1.2.11 ****<br/>
- Suppression du framework Bootstrap.<br/>
- Optimisation du plugin pour la compatibilité avec les sites.<br/><br/>
**** V 1.2.10 ****<br/>
- Augmente la compatibilité avec les autres extensions.<br/><br/>
**** V 1.2.9 ****<br/>
- Correction d'une erreur W3C.<br/>
- Correction d'un bug lors de l'import sur certains sites.<br/>
- Correction d'un bug lors du calcul de la durée de vie du cookie.<br/><br/>
**** V 1.2.8 ****<br/>
- Correction d'un bug avec les sites qui utilisent plusieurs templates.<br/><br/>
**** V 1.2.7 ****<br/>
- Amélioration SEO.<br/>
- Amélioration de l'affichage du plugin sur les mobiles.<br/>
- Correction d'un problème de l'affichage du message d'alerte en mode pop-up sur mobile.<br/>
- Ajout d'un message d'avertissement quand votre langue par défaut de votre site n'est pas instanciée dans les langues de contenu.<br/><br/>
**** V 1.2.6 ****<br/>
- Ajout d'un lien FAQ et Documentation dans l'onglet support.<br/>
- Optimisations diverses.<br/><br/>
**** V 1.2.5 ****<br/>
- Le message d'alerte n'apparaît plus quand votre site est hors-ligne.<br/>
- Vous avez la possibilité maintenant de ne pas charger la librairie Bootsrap.<br/><br/>
**** V 1.2.4 ****<br/>
- Correction d'un bug en mode pop-up.<br/><br/>
**** V 1.2.3 ****<br/>
- Mise en place de la vérification de la présence du cookie du plugin en javascript pour afficher ou non le message.<br/><br/>
**** V 1.2.2 ****<br/>
- Correction d'un bug pour l'affichage en pop-up.<br/><br/>
**** V 1.2.1 ****<br/>
- Possibilité de choisir la durée de vie du cookie.<br/>
- Possibilité de choisir la couleur de fond des boutons.<br/>
- Correction du fonctionnement du plugin sur les sites multi-chemin.<br/><br/>
**** V 1.2.0 ****<br/>
- Ajout du choix de la transparence du message d'alerte.<br/>
- Vous pouvez Afficher / Masquer le message d'alerte en fonction des langues.<br/>
- Vous pouvez maintenant Exporter et Importer votre configuration.<br/><br/>
**** V 1.1.8 ****<br/>
- Vous pouvez choisir d'afficher le message d'alerte sur la page expliquant l'utilisation des cookies.<br/><br/>
**** V 1.1.7 ****<br/>
- Résolution des bugs avec les règles CSS.<br/>
- Choix de la version de bootstrap.<br/><br/>
**** V 1.1.6 ****<br/>
- Correction du paramètre z-index permettant d'afficher le message au-dessus de votre site.<br/>
- Ajout d'un fichier custom.css permettant d'ajouter vos propres règles CSS.<br/><br/>
**** V 1.1.5 ****<br/>
- Paramétrage des marges autour du message.<br/>
- Paramétrage de la position du contenu.<br/><br/>
**** V 1.1.4 ****<br/>
- Possibilité de fixer le message d'alerte sur l'écran.<br/>
- Il est possible dorénavant de définir la taille du message d'alerte en pixel ou en pourcentage.<br/>
- Choix dans l'ordre d'affichage des boutons.<br/>
- Possibilité d'afficher les boutons à la ligne ou à la suite du texte.<br/><br/>
**** V 1.1.3 ****<br/>
- Ajout du multilangue.<br/><br/>
**** V 1.1.2 ****<br/>
- Amélioration de la rapidité d'exécution.<br/>
- Correction de bugs.<br/><br/><br/><br/>"

PLG_SYSTEM_FMALERTCOOKIES_TITLE_PARAMS = "Affichage"
PLG_SYSTEM_FMALERTCOOKIES_TITLE_BOUTONS = "Boutons"
PLG_SYSTEM_FMALERTCOOKIES_TITLE_SUPPORT = "Support"
PLG_SYSTEM_FMALERTCOOKIES_SAISIE_LANGUE = "&lt;img src=/media/mod_languages/images/%s.gif /&gt;"

PLG_SYSTEM_FMALERTCOOKIES_HEADER_BTN_MORE_LABEL = "<hr><b>Bouton 'En savoir plus'</b><hr>"
PLG_SYSTEM_FMALERTCOOKIES_HEADER_BTN_CLOSE_LABEL = "<hr><b>Bouton Fermer / Accepter les cookies</b><hr>"
PLG_SYSTEM_FMALERTCOOKIES_HEADER_GENERAL_LABEL = "<hr><b>Généralités</b><hr>"
PLG_SYSTEM_FMALERTCOOKIES_HEADER_BORDURE_LABEL = "<hr><b>Bordures</b><hr>"
PLG_SYSTEM_FMALERTCOOKIES_HEADER_ALERTE_LABEL = "<hr><b>Message d'alerte</b><hr>"
PLG_SYSTEM_FMALERTCOOKIES_HEADER_IMPORT_LABEL = "<hr><b>Import</b><hr>"
PLG_SYSTEM_FMALERTCOOKIES_HEADER_EXPORT_LABEL = "<hr><b>Export</b><hr>"

PLG_SYSTEM_FMALERTCOOKIES_AJOUTER_JQUERY_LABEL = "Utiliser jQuery (V. 1.11.1)"
PLG_SYSTEM_FMALERTCOOKIES_AJOUTER_JQUERY_DESC = "Ce plugin a besoin de la librairie jQuery pour fonctionner"
PLG_SYSTEM_FMALERTCOOKIES_NO_USE_JQUERY_SITE = "Non - je préfére utiliser jQuery déjà présent sur mon site."
PLG_SYSTEM_FMALERTCOOKIES_YES_USE_JQUERY_PLUGIN = "Oui - je souhaite que ce plugin ajoute jQuery."

PLG_SYSTEM_FMALERTCOOKIES_TYPE_AFFICHAGE_LABEL="Mode d'affichage"
PLG_SYSTEM_FMALERTCOOKIES_TYPE_AFFICHAGE_DESC="Choisissez le mode d'affichage"
PLG_SYSTEM_FMALERTCOOKIES_POPUP="Popup"
PLG_SYSTEM_FMALERTCOOKIES_ENCADRE="Encadré"

PLG_SYSTEM_FMALERTCOOKIES_TYPE_BORDURE_LABEL="Type"
PLG_SYSTEM_FMALERTCOOKIES_TYPE_BORDURE_DESC="Choisissez le type de bordure que vous voulez afficher autour de votre message"
PLG_SYSTEM_FMALERTCOOKIES_ARRONDI="Arrondie"
PLG_SYSTEM_FMALERTCOOKIES_RECTANGULAIRE="Rectangulaire"
PLG_SYSTEM_FMALERTCOOKIES_SANS_BORDURE="Aucune"

PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BORDURE_LABEL = "Taille (px)"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BORDURE_DESC = "Choisissez la taille des bordures"

PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BORDURE_LABEL="Couleur"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BORDURE_DESC="Choisissez la couleur de vos bordures"

PLG_SYSTEM_FMALERTCOOKIES_COULEUR_TEXTE_LABEL="Couleur du texte"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_TEXTE_DESC="Choisissez la couleur du texte"

PLG_SYSTEM_FMALERTCOOKIES_COULEUR_FOND_LABEL="Couleur du fond"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_FOND_DESC="Choisissez la couleur de fond que vous souhaitez afficher"

PLG_SYSTEM_FMALERTCOOKIES_POSITION_LABEL="Position"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_DESC="Si vous avez choisi le mode d'affichage "Pop-up" celui-ci sera directement centré sur votre page."
PLG_SYSTEM_FMALERTCOOKIES_HAUT="Haut de page"
PLG_SYSTEM_FMALERTCOOKIES_BAS="Bas de page"

PLG_SYSTEM_FMALERTCOOKIES_TEXTE_READMORE_LABEL="Texte bouton \"<i><b>En savoir plus</b></i>\""
PLG_SYSTEM_FMALERTCOOKIES_TEXTE_READMORE_DESC="Choisissez le texte du bouton en savoir plus"

PLG_SYSTEM_FMALERTCOOKIES_LINK_READMORE_MENU_LABEL="Lien bouton \"<i><b>En savoir plus</b></i>\""
PLG_SYSTEM_FMALERTCOOKIES_LINK_READMORE_MENU_DESC="Choisissez le menu qui affichera les explications d'utilisations de vos cookies"

PLG_SYSTEM_FMALERTCOOKIES_TEXTE_CLOSE_LABEL="Texte bouton \"<i><b>Fermer</b></i>\""
PLG_SYSTEM_FMALERTCOOKIES_TEXTE_CLOSE_DESC="Choisissez le texte du bouton pour fermer le texte"

PLG_SYSTEM_FMALERTCOOKIES_TEXTE_LABEL="Texte d'information"
PLG_SYSTEM_FMALERTCOOKIES_TEXTE_DESC="Texte à afficher pour informer vos visiteurs que votre site utilise des cookies."

PLG_SYSTEM_FMALERTCOOKIES_TAILLE_CADRE_LABEL="Largeur de l'alerte (px / %)"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_CADRE_DESC="Taille du cadre.<br/>Pensez bien à mettre soit px soit % à la suite de votre valeur.<br/>Par défaut la taille sera en pixel (px)"

PLG_SYSTEM_FMALERTCOOKIES_BTN_MORE_LABEL = "Affichage"
PLG_SYSTEM_FMALERTCOOKIES_BTN_MORE_DESC = "Afficher le bouton 'En savoir plus'"

PLG_SYSTEM_FMALERTCOOKIES_BTN_CLOSE_LABEL = "Affichage"
PLG_SYSTEM_FMALERTCOOKIES_BTN_CLOSE_DESC = "Afficher le bouton 'Fermer'"

;BTN
PLG_SYSTEM_FMALERTCOOKIES_FIRST_BTN_LABEL = "Ordre des bouttons"
PLG_SYSTEM_FMALERTCOOKIES_FIRST_BTN_DESC = "Choisissez l'ordre d'apparition des bouttons"
PLG_SYSTEM_FMALERTCOOKIES_FIRST_BTN_CLOSE = "Le boutton \"Fermer\" en premier"
PLG_SYSTEM_FMALERTCOOKIES_FIRST_BTN_MORE = "Le boutton \"En savoir plus\" en premier"

PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_LABEL = "Position des bouttons"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_DESC = "Choisissez la disposition des bouttons par rapport au texte."
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_A_LA_LIGNE = "Retour à la ligne"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_MEME_LIGNE = "Sur la même ligne que le texte"

PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_LARGE = "Gros"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_DEFAULT = "Normal"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_SMALL = "Petit"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_MINI = "Très petit"

PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_CENTRER = "Centrer"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_GAUCHE = "Gauche"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_DROITE = "Droite"

PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_DEFAULT = "Gris"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_BLEU_FONCE = "Bleu foncé"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_BLEU_CLAIR = "Bleu clair"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_VERT = "Vert"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_ORANGE = "Orange"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_ROUGE = "Rouge"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_NOIR = "Noir"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_RIEN = "Aucun / Lien"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_CUSTOM = "Personnalisée"

;BTN MORE
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_MORE_LABEL = "Position"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_MORE_DESC = "Positionnement du bouton 'Fermer'"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_MORE_LABEL = "Taille"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_MORE_DESC = "Taille de votre bouton"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_MORE_LABEL = "Thème"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_MORE_DESC = "Couleur du fond de votre bouton"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_TEXTE_MORE_LABEL = "Couleur texte"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_TEXTE_MORE_DESC = "Couleur du texte de votre bouton"
PLG_SYSTEM_FMALERTCOOKIES_ANCRE_LINK_READMORE_MENU_LABEL = "Ancre"
PLG_SYSTEM_FMALERTCOOKIES_ANCRE_LINK_READMORE_MENU_DESC = "Si vous avez une ancre précise sur la page, vous pouvez la renseigner ici."

;BTN CLOSE
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_CLOSE_LABEL = "Position"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_CLOSE_DESC = "Positionnement du bouton 'Fermer'"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_CLOSE_LABEL = "Taille"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_CLOSE_DESC = "Taille de votre bouton"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_CLOSE_LABEL = "Thème"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_CLOSE_DESC = "Couleur du fond de votre bouton"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_TEXTE_CLOSE_LABEL = "Couleur texte"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_TEXTE_CLOSE_DESC = "Couleur du texte de votre bouton"

;SUPPORT
PLG_SYSTEM_FMALERTCOOKIES_SUPPORT_LABEL = "<b>Folcomedia</b><br/><br/>
<u>Mail :</u><br/><a href='mailto:contact@folcomedia.fr'>contact@folcomedia.fr</a><br/><br/>
<u>Téléphone :</u><br/>+33(0)4 48 06 00 96<br/><br/>
<u>Site internet :</u><br/><a target='_blank' href='https://www.folcomedia.fr'>https://www.folcomedia.fr</a><br/><br/>
<u>Commentaire :</u><br/><a target='_blank' href='http://extensions.joomla.org/extensions/site-management/cookie-control/27308?qh=YToxOntpOjA7czoxMDoiZm9sY29tZWRpYSI7fQ%3D%3D'>http://extensions.joomla.org</a><br/><br/>
<u>NB :</u><br/>Si vous souhaitez bénéficier de nouvelles fonctionnalités dans ce plugin, merci de nous contacter.<br/><br/>
<u>Traduction :</u><br/>Si vous souhaitez nous aider en traduisant cette extension dans votre langue, merci de nous contacter.<br/><br/>
<u>Dons :</u><br/>Vous pouvez faire un don pour soutenir le projet.<br/>Vous pouvez très bien utiliser ce plugin sans dépenser d'argent.<br/>"


PLG_SYSTEM_FMALERTCOOKIES_MYLANGUAGE_LABEL = "Langue par défaut"
PLG_SYSTEM_FMALERTCOOKIES_MYLANGUAGE_DESC = "Affiche le texte de la langue par défaut au cas où vous n'aurez pas rempli le texte des autres langues."

PLG_SYSTEM_FMALERTCOOKIES_POSITION_FIXE_LABEL = "Position fixe"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_FIXE_DESC = "Permet à l'encadrer de rester affiche sur l'écran m^me sur vous bouger l'ascenseur de votre navigateur"

PLG_SYSTEM_FMALERTCOOKIES_MARGE_EXT_LABEL = "Marges extérieures (px)"
PLG_SYSTEM_FMALERTCOOKIES_MARGE_EXT_DESC = "Renseigner la taille des marges extérieures que vous souhaitez"

PLG_SYSTEM_FMALERTCOOKIES_POSITION_CONTENU_LABEL = "Position du contenu"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_CONTENU_DESC = "Position du contenu (Message + boutons)"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_CONTENU_CENTRER = "Centrer"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_CONTENU_GAUCHE = "Gauche"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_CONTENU_DROITE = "Droite"

PLG_SYSTEM_FMALERTCOOKIES_MARGE_INT_LABEL = "Marges intérieures (px)"
PLG_SYSTEM_FMALERTCOOKIES_MARGE_INT_DESC = "Renseigner la taille des marges interieures que vous souhaitez"

PLG_SYSTEM_FMALERTCOOKIES_UTILISER_BOOTSTRAP_LABEL = "Version de Bootstrap"
PLG_SYSTEM_FMALERTCOOKIES_UTILISER_BOOTSTRAP_DESC = "Sur certains sites, la version de jQuery étant trop ancienne la version 3 de bootstrap ne sera pas compatible, c'est pour cela qu'il vous faudra choisir la version 2."
PLG_SYSTEM_FMALERTCOOKIES_UTILISER_BOOTSTRAP_VERSION_NONE = "Aucune"
PLG_SYSTEM_FMALERTCOOKIES_UTILISER_BOOTSTRAP_VERSION2 = "Bootstrap 2"
PLG_SYSTEM_FMALERTCOOKIES_UTILISER_BOOTSTRAP_VERSION3 = "Bootstrap 3"

PLG_SYSTEM_FMALERTCOOKIES_AFFICHAGE_MSG_PAGE_COOKIE_DESC = "Voulez-vous faire apparaître le message d'alerte même sur la page expliquant l'utilisation des cookies après avoir cliqué sur le bouton \"En savoir plus\""
PLG_SYSTEM_FMALERTCOOKIES_AFFICHAGE_MSG_PAGE_COOKIE_LABEL = "Afficher le message"
PLG_SYSTEM_FMALERTCOOKIES_AFFICHAGE_MSG_PAGE_COOKIE_ALL_PAGES = "Sur toutes les pages du site"
PLG_SYSTEM_FMALERTCOOKIES_AFFICHAGE_MSG_PAGE_COOKIE_NOT_ALL_PAGES = "Sur toutes les pages du site, sauf la page d'explication à l'utilisation des cookies"

PLG_SYSTEM_FMALERTCOOKIES_NUM_OPACITY_LABEL = "Transparence"
PLG_SYSTEM_FMALERTCOOKIES_NUM_OPACITY_DESC = "Faire apparaître le message d'alerte en transparence.<br/>0 = Transparent<br/>100 = Opaque"

PLG_SYSTEM_FMALERTCOOKIES_UPLOAD = "Exporter Configuration"
PLG_SYSTEM_FMALERTCOOKIES_IMPORT = "Importer Configuration"
PLG_SYSTEM_FMALERTCOOKIES_CONF_UPLOAD_OK = "Configuration importée avec succès."
PLG_SYSTEM_FMALERTCOOKIES_CONF_UPLOAD_KO = "Une erreur est survenue lors de l'importation du fichier de configuration."

PLG_SYSTEM_FMALERTCOOKIES_LANGUE_ACTIVATE_DESC = "Affiche ou cache le message d'alerte lorsque le visiteur se trouve sur le site avec cette langue."
PLG_SYSTEM_FMALERTCOOKIES_LANGUE_ACTIVATE_LABEL = "Message d'alerte"

;V1.2.1
PLG_SYSTEM_FMALERTCOOKIES_DUREE_COOKIE_LABEL = "Durée de vie du cookie (j)"
PLG_SYSTEM_FMALERTCOOKIES_DUREE_COOKIE_DESC = "Choisissez la durée de vie du cookie en jour, arrivé à cette date une nouvelle demande se fera via le message d'alerte."

PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_CLOSE_CUSTOM_LABEL = "Couleur bouton personnalisée"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_CLOSE_CUSTOM_DESC = "Si vous avez choisi \"Personnalisée\" dans le choix du thème du bouton, la couleur que vous avez choisie sera prise en compte."

PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_MORE_CUSTOM_LABEL = "Couleur bouton personnalisée"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_MORE_CUSTOM_DESC = "Si vous avez choisi \"Personnalisée\" dans le choix du thème du bouton, la couleur que vous avez choisie sera prise en compte."

;V1.2.15
PLG_SYSTEM_FMALERTCOOKIES_DISPLAY_OFFLINE = "Afficher le message site hors ligne"
PLG_SYSTEM_FMALERTCOOKIES_DISPLAY_OFFLINE_DESC = "Vous pouvez choisir d'afficher le message d'alerte même si votre site est en maintenance"

;V1.3.0
PLG_SYSTEM_FMALERTCOOKIES_DELETE_COOKIE = "Blocage des cookies"
PLG_SYSTEM_FMALERTCOOKIES_DELETE_COOKIE_DESC = "Souhaitez-vous que le plugin bloque tous les cookies du site tant que le message d'alerte n'a pas été accepté ?"

;1.3.2
PLG_SYSTEM_FMALERTCOOKIES_TITLE_SEO = "SEO"
PLG_SYSTEM_FMALERTCOOKIES_USER_AGENT_LABEL = "Protection de votre SEO"
PLG_SYSTEM_FMALERTCOOKIES_USER_AGENT_DESC = "Le plugin empêchera les robots des moteurs de recherche ci-dessus de voir le bandeau de cookies lorsqu´ils visitent votre site."
language/fr-FR/fr-FR.com_associations.ini000060400000007674152453623440014236 0ustar00; @date        2017-01-18
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_ASSOCIATIONS="Associations multilingues"
COM_ASSOCIATIONS_ADD_NEW_ASSOCIATION="Ajouter une association"
COM_ASSOCIATIONS_ASSOCIATED_ITEM="Cible"
COM_ASSOCIATIONS_CHANGE_TARGET="Changer de cible"
COM_ASSOCIATIONS_COMPONENT_NOT_SUPPORTED="L'extension %s ne prend pas en charge les associations multilingues."
COM_ASSOCIATIONS_COMPONENT_SELECTOR_DESC="Sélectionner un composant dans la liste"
COM_ASSOCIATIONS_COMPONENT_SELECTOR_LABEL="Sélectionner un composant"
COM_ASSOCIATIONS_CONFIGURATION="Associations multilingues : Paramètres"
COM_ASSOCIATIONS_COPY_REFERENCE="Copier la référence vers la cible"
COM_ASSOCIATIONS_DELETE_ORPHANS="Supprimer les associations orphelines"
COM_ASSOCIATIONS_DELETE_ORPHANS_FAILED="Échec de la suppression des associations orphelines."
COM_ASSOCIATIONS_DELETE_ORPHANS_NONE="Il n'y avait pas d'associations orphelines à supprimer."
COM_ASSOCIATIONS_DELETE_ORPHANS_SUCCESS="Toutes les associations orphelines ont été supprimées."
COM_ASSOCIATIONS_EDIT_ASSOCIATION="Modifier l'association"
COM_ASSOCIATIONS_EDIT_HIDE_REFERENCE="Cacher la référence"
COM_ASSOCIATIONS_EDIT_SHOW_REFERENCE="Afficher la référence"
COM_ASSOCIATIONS_ERROR_NO_ASSOC="Le composant Associations multilingues ne peut être utilisé si le site n'est pas défini comme multilingue et/ou le champ Associations d'éléments n'est pas activé dans le plugin <a href=\"%s\">Filtre de langue</a>."
COM_ASSOCIATIONS_ERROR_NO_TYPE="Le type d'élément sélectionné n'existe pas pour ce composant."
COM_ASSOCIATIONS_FILTER_MENUTYPE_DESC="Sélectionner un menu"
COM_ASSOCIATIONS_FILTER_MENUTYPE_LABEL="Menu"
COM_ASSOCIATIONS_FILTER_SEARCH_DESC="Rechercher un élément par son titre"
COM_ASSOCIATIONS_FILTER_SEARCH_LABEL="Recherche d'élément"
COM_ASSOCIATIONS_FILTER_SELECT_ITEM_TYPE="- Sélectionner un type d'élément -"
COM_ASSOCIATIONS_HEADING_ASSOCIATION="Associations"
COM_ASSOCIATIONS_HEADING_MENUTYPE="Menu"
COM_ASSOCIATIONS_HEADING_MENUTYPE_ASC="Menu ascendant"
COM_ASSOCIATIONS_HEADING_MENUTYPE_DESC="Menu descendant"
COM_ASSOCIATIONS_HEADING_NO_ASSOCIATION="Pas associé"
COM_ASSOCIATIONS_ITEMS="Éléments"
COM_ASSOCIATIONS_NO_ASSOCIATION="Il n'y a pas d'association dans cette langue"
COM_ASSOCIATIONS_NOTICE_NO_SELECTORS="Merci de sélectionner un type d'élément et une langue pour voir les associations"
COM_ASSOCIATIONS_PURGE="Supprimer toutes les associations"
COM_ASSOCIATIONS_PURGE_CONFIRM_PROMPT="Êtes-vous sûr de vouloir supprimer toutes les associations? Confirmer les supprimera de façon définitive !"
COM_ASSOCIATIONS_PURGE_FAILED="Échec de la suppression des associations."
COM_ASSOCIATIONS_PURGE_NONE="Il n'y avait pas d'associations à supprimer."
COM_ASSOCIATIONS_PURGE_SUCCESS="Toutes les associations ont été supprimées."
COM_ASSOCIATIONS_REFERENCE_ITEM="Référence"
COM_ASSOCIATIONS_SAVE_REFERENCE="Enregistrer référence"
COM_ASSOCIATIONS_SAVE_TARGET="Enregistrer cible"
COM_ASSOCIATIONS_SELECT_MENU="- Selectionner un menu -"
COM_ASSOCIATIONS_SELECT_TARGET="Sélectionner une cible"
COM_ASSOCIATIONS_SELECT_TARGET_LANGUAGE="- Sélectionner la langue de la cible -"
COM_ASSOCIATIONS_TITLE="Associations"
COM_ASSOCIATIONS_TITLE_EDIT="Associations multilingues : Modifier les associations (%1$s &gt; %2$s)"
COM_ASSOCIATIONS_TITLE_LIST="Associations multilingues (%1$s &gt; %2$s)"
COM_ASSOCIATIONS_TITLE_LIST_SELECT="Associations multilingues : Sélectionner un type d'élément et une langue"
COM_ASSOCIATIONS_XML_DESCRIPTION="Composant de gestion de contenu multilingue"
COM_ASSOCIATIONS_YOU_ARE_NOT_ALLOWED_TO_CHECKIN_THIS_ITEM="Vous n'avez pas l'autorisation de déverrouiller cet élément."
language/fr-FR/fr-FR.plg_actionlog_joomla.ini000060400000011340152453623440015044 0ustar00; @date        2018-09-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_ACTIONLOG_JOOMLA="Journal des actions - Joomla"
PLG_ACTIONLOG_JOOMLA_APPLICATION_ADMINISTRATOR="administration"
PLG_ACTIONLOG_JOOMLA_APPLICATION_SITE="site"
PLG_ACTIONLOG_JOOMLA_XML_DESCRIPTION="Enregistre les actions des utilisateurs pour les extensions du noyau Joomla de façon à être vérifiées si nécessaire."
; Content types title
PLG_ACTIONLOG_JOOMLA_TYPE_ACCESS_LEVEL="niveau d'accès"
PLG_ACTIONLOG_JOOMLA_TYPE_APPLICATION_CONFIG="Configuration globale"
PLG_ACTIONLOG_JOOMLA_TYPE_ARTICLE="article"
PLG_ACTIONLOG_JOOMLA_TYPE_BANNER="bannière"
PLG_ACTIONLOG_JOOMLA_TYPE_BANNER_CLIENT="client de bannière"
PLG_ACTIONLOG_JOOMLA_TYPE_CATEGORY="catégorie"
PLG_ACTIONLOG_JOOMLA_TYPE_COMPONENT="composant"
PLG_ACTIONLOG_JOOMLA_TYPE_COMPONENT_CONFIG="Configuration de composant"
PLG_ACTIONLOG_JOOMLA_TYPE_CONTACT="contact"
PLG_ACTIONLOG_JOOMLA_TYPE_FILE="fichier"
PLG_ACTIONLOG_JOOMLA_TYPE_LANGUAGE="langue"
PLG_ACTIONLOG_JOOMLA_TYPE_LIBRARY="librairie"
PLG_ACTIONLOG_JOOMLA_TYPE_LINK="lien de redirection"
PLG_ACTIONLOG_JOOMLA_TYPE_LINK_REDIRECT="redirection de lien"
PLG_ACTIONLOG_JOOMLA_TYPE_MEDIA="média"
PLG_ACTIONLOG_JOOMLA_TYPE_MENU="menu"
PLG_ACTIONLOG_JOOMLA_TYPE_MENU_ITEM="lien de menu"
PLG_ACTIONLOG_JOOMLA_TYPE_MODULE="module"
PLG_ACTIONLOG_JOOMLA_TYPE_NEWSFEED="fil d'actualité"
PLG_ACTIONLOG_JOOMLA_TYPE_PACKAGE="paquet"
PLG_ACTIONLOG_JOOMLA_TYPE_PLUGIN="plug-in"
PLG_ACTIONLOG_JOOMLA_TYPE_STYLE="style de template"
PLG_ACTIONLOG_JOOMLA_TYPE_TAG="tag"
PLG_ACTIONLOG_JOOMLA_TYPE_TEMPLATE="template"
PLG_ACTIONLOG_JOOMLA_TYPE_USER="utilisateur"
PLG_ACTIONLOG_JOOMLA_TYPE_USER_GROUP="groupe d'utilisateurs"
PLG_ACTIONLOG_JOOMLA_TYPE_USER_NOTE="Note utilisateur"
PLG_ACTIONLOG_JOOMLA_USER_CACHE="L'utilisateur <a href='{accountlink}'>{username}</a> a effacé le groupe de cache {group}"
PLG_ACTIONLOG_JOOMLA_USER_CHECKIN="L'utilisateur <a href='{accountlink}'>{username}</a> a déverrouillé un item dans la table {table}"
PLG_ACTIONLOG_JOOMLA_USER_LOG="L'utilisateur <a href='{accountlink}'>{username}</a> a purgé une ou plusieurs lignes du journal des actions"
PLG_ACTIONLOG_JOOMLA_USER_LOGEXPORT="L'utilisateur <a href='{accountlink}'>{username}</a> a exporté une ou plusieurs lignes du journal des actions"
PLG_ACTIONLOG_JOOMLA_USER_LOGGED_IN="L'utilisateur <a href='{accountlink}'>{username}</a> s'est connecté à : {app}"
PLG_ACTIONLOG_JOOMLA_USER_LOGGED_OUT="L'utilisateur <a href='{accountlink}'>{username}</a> s'est déconnecté de : {app}"
PLG_ACTIONLOG_JOOMLA_USER_LOGIN_FAILED="L'utilisateur <a href='{accountlink}'>{username}</a> a tenté de se connecter à {app}"
PLG_ACTIONLOG_JOOMLA_USER_REGISTRATION_ACTIVATE="L'utilisateur <a href='{accountlink}'>{username}</a> a activé le compte"
PLG_ACTIONLOG_JOOMLA_USER_REGISTERED="L'utilisateur <a href='{accountlink}'>{username}</a> s'est enregistré pour la création d'un compte"
PLG_ACTIONLOG_JOOMLA_USER_REMIND="L'utilisateur <a href='{accountlink}'>{username}</a> a demandé un rappel de son identifiant de compte"
PLG_ACTIONLOG_JOOMLA_USER_RESET_COMPLETE="L'utilisateur <a href='{accountlink}'>{username}</a> a terminé la réínitialisation du mot de passe de son compte"
PLG_ACTIONLOG_JOOMLA_USER_RESET_REQUEST="L'utilisateur <a href='{accountlink}'>{username}</a> a demandé la réínitialisation du mot de passe de son compte"
PLG_ACTIONLOG_JOOMLA_USER_UPDATE="L'utilisateur <a href='{accountlink}'>{username}</a> a mis à jour Joomla de la version {oldversion} à la version {version}"
; Component
PLG_ACTIONLOG_JOOMLA_APPLICATION_CONFIG_UPDATED="L'utilisateur <a href='{accountlink}'>{username}</a> a changé les paramètres de la configuration de l'application"
PLG_ACTIONLOG_JOOMLA_COMPONENT_CONFIG_UPDATED="L'utilisateur <a href='{accountlink}'>{username}</a> a changé les paramètres du composant {extension_name}"
; Extensions
PLG_ACTIONLOG_JOOMLA_EXTENSION_INSTALLED="L'utilisateur <a href='{accountlink}'>{username}</a> a installé : {type}, {extension_name}"
PLG_ACTIONLOG_JOOMLA_EXTENSION_UNINSTALLED="L'utilisateur <a href='{accountlink}'>{username}</a> a désinstallé : {type}, {extension_name}"
PLG_ACTIONLOG_JOOMLA_EXTENSION_UPDATED="L'utilisateur <a href='{accountlink}'>{username}</a> a mis à jour : {type}, {extension_name}"
PLG_ACTIONLOG_JOOMLA_PLUGIN_INSTALLED="L'utilisateur <a href='{accountlink}'>{username}</a> a installé le plug-in <a href='index.php?option=com_plugins&task=plugin.edit&extension_id={id}'>{extension_name}</a>"
language/fr-FR/fr-FR.plg_content_geshi.sys.ini000060400000001113152453623440015167 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2016 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2016 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt, see LICENSE.php
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_CONTENT_GESHI="Contenu - Code Highlighter (GeSHi)"
PLG_CONTENT_GESHI_XML_DESCRIPTION="Affiche du code formaté dans les articles, en se basant sur le moteur de coloration syntaxique GeSHi"language/fr-FR/fr-FR.plg_quickicon_privacycheck.ini000060400000002610152453623440016244 0ustar00; @date        2018-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_QUICKICON_PRIVACYCHECK="Icône raccourci -  Notification de demandes d'informations de confidentialité"
PLG_QUICKICON_PRIVACYCHECK_CHECKING="Vérification des demandes..."
PLG_QUICKICON_PRIVACYCHECK_ERROR="Demandes inconnues..."
PLG_QUICKICON_PRIVACYCHECK_GROUP_DESC="Le groupe de ce plugin (cette valeur est comparée à la valeur de groupe utilisée dans les modules <strong> Icônes raccourci </strong> pour injecter des icônes)."
PLG_QUICKICON_PRIVACYCHECK_GROUP_LABEL="Groupe"
PLG_QUICKICON_PRIVACYCHECK_REQUESTFOUND="Demandes urgentes d'informations de confidentialité"
PLG_QUICKICON_PRIVACYCHECK_REQUESTFOUND_BUTTON="Afficher les demandes"
PLG_QUICKICON_PRIVACYCHECK_REQUESTFOUND_MESSAGE="Demandes urgentes d'informations de confidentialité à gérer."
PLG_QUICKICON_PRIVACYCHECK_NOREQUEST="Pas de demandes urgentes."
PLG_QUICKICON_PRIVACYCHECK_XML_DESCRIPTION="Vérifie les demandes d'informations de confidentialité qui doivent être traitées et vous avertit lorsque vous visitez la page du Panneau de configuration."
language/fr-FR/fr-FR.pkg_jce.sys.ini000060400000001614152453623440013104 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PKG_JCE="Pack JCE Extension"
PKG_JCE_XML_DESCRIPTION="Le pack d'installation de JCE inclut le composant d'administration, le plugin éditeur et d'autres plugins nécessaire au fonctionnement de JCE.<br/>Le composant d'administration a pour fonction de gérer la configuration de l'éditeur, les profils utilisateurs JCE et les fonctions de leur barre d'outils, et propose un lien vers son gestionnaire de fichiers.<br /><strong>Note : </strong>pour utiliser l'éditeur JCE, vous devez le déclarer comme éditeur par défaut dans la configuration de Joomla ou, dans les profils utilisateurs Joomla."
language/fr-FR/fr-FR.plg_user_joomla.ini000060400000005173152453623440014052 0ustar00; @date        2014-09-16
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_USER_JOOMLA="Utilisateur - Joomla!"
PLG_USER_JOOMLA_FIELD_AUTOREGISTER_DESC="Création automatique d'utilisateurs enregistrés lorsque c'est possible"
PLG_USER_JOOMLA_FIELD_AUTOREGISTER_LABEL="Création automatique"
PLG_USER_JOOMLA_FIELD_FORCELOGOUT_DESC="Choisir Non pour désactiver ce paramètre."
PLG_USER_JOOMLA_FIELD_FORCELOGOUT_LABEL="Forcer la déconnexion pour toutes les sessions?"
PLG_USER_JOOMLA_FIELD_MAILTOUSER_DESC="Activer ou non la notification e-mail à l'utilisateur avec identifiant et mot de passe quand un administrateur crée un compte."
PLG_USER_JOOMLA_FIELD_MAILTOUSER_LABEL="E-mail de notification à l'utilisateur"
PLG_USER_JOOMLA_FIELD_STRONG_PASSWORDS_DESC="Si activé, la méthode de cryptage BCrypt sera utilisée si elle est disponible dans votre version de PHP."
PLG_USER_JOOMLA_FIELD_STRONG_PASSWORDS_LABEL="Mots de passe renforcé"
PLG_USER_JOOMLA_NEW_USER_EMAIL_BODY="Bonjour %s,\n\n\nVous avez été inscrit sur le site %s par un Administrateur.\n\nCe message contient l'identifiant et le mot de passe nécessaires pour vous connecter sur le site %s\n\nIdentifiant : %s\nMot de passe : %s\n\n\nVeuillez ne pas répondre à ce message envoyé automatiquement pour votre information."
PLG_USER_JOOMLA_NEW_USER_EMAIL_SUBJECT="Paramètres de nouvel utilisateur"
PLG_USER_JOOMLA_POSTINSTALL_STRONGPW_BTN="Activer le cryptage renforcé des mots de passe"
PLG_USER_JOOMLA_POSTINSTALL_STRONGPW_TEXT="Par mesure de sécurité, Joomla 3.2 permet de passer à un cryptage renforcé du mot de passe.  Pour activer les mots de passe renforcés, cliquer sur le bouton ci-dessous. Sinon, vous pouvez modifier le plug-in 'Utilisateur - Joomla' et activer le paramètre 'Mot de passe renforcé'. Avant de l'activer, il faut vérifier que tous les plug-ins d'enregistrement/connexion, gestionnaires d'utilisateurs ou extensions de type bridge codés par des parties tierces prennent en charge le cryptage renforcé du mot de passe."
PLG_USER_JOOMLA_POSTINSTALL_STRONGPW_TITLE="Mots de passe renforcés"
PLG_USER_JOOMLA_XML_DESCRIPTION="Prise en charge de la synchronisation par défaut des utilisateurs de Joomla! <br /><strong>Attention! Il faut impérativement avoir activé au moins un plug-in de gestion de session utilisateur ou tout accès au site sera impossible.</strong>"
language/fr-FR/fr-FR.com_templates.ini000060400000045644152453623440013534 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_TEMPLATES="Templates"
COM_TEMPLATES_ADVANCED_FIELDSET_LABEL="Paramètres avancés"
COM_TEMPLATES_ARE_YOU_SURE="Êtes-vous sûr ?"
COM_TEMPLATES_ASSIGNED_1="Affecté à un élément de menu"
COM_TEMPLATES_ASSIGNED_MORE="Affecté à %d éléments de menu"
COM_TEMPLATES_BASIC_FIELDSET_LABEL="Paramètres"
COM_TEMPLATES_BUTTON_CLOSE_FILE="Fermer le fichier"
COM_TEMPLATES_BUTTON_COPY_TEMPLATE="Copier le template"
COM_TEMPLATES_BUTTON_COPY_FILE="Copier le fichier"
COM_TEMPLATES_BUTTON_CREATE="Créer"
COM_TEMPLATES_BUTTON_CROP="Couper"
COM_TEMPLATES_BUTTON_DELETE="Supprimer"
COM_TEMPLATES_BUTTON_DELETE_FILE="Supprimer le fichier"
COM_TEMPLATES_BUTTON_EXTRACT_ARCHIVE="Décompresser ici"
COM_TEMPLATES_BUTTON_FILE="Nouveau fichier"
COM_TEMPLATES_BUTTON_FOLDERS="Gérer les dossiers"
COM_TEMPLATES_BUTTON_LESS="Compiler LESS"
COM_TEMPLATES_BUTTON_PREVIEW="Prévisualisation du template"
COM_TEMPLATES_BUTTON_RENAME="Renommer"
COM_TEMPLATES_BUTTON_RENAME_FILE="Renommer le fichier"
COM_TEMPLATES_BUTTON_RESIZE=" Redimensionner"
COM_TEMPLATES_BUTTON_UPLOAD="Transférer"
COM_TEMPLATES_CHECK_FILE_OWNERSHIP="Vérifier les droits du fichier"
COM_TEMPLATES_CLICK_TO_ENLARGE="Cliquez pour agrandir."
COM_TEMPLATES_COMPILE_ERROR="Erreur de compilation"
COM_TEMPLATES_COMPILE_LESS="Il faut compiler %s pour générer un fichier CSS."
COM_TEMPLATES_COMPILE_SUCCESS="LESS compilé."
COM_TEMPLATES_CONFIG_FIELDSET_DESC="Configuration globale des templates"
COM_TEMPLATES_CONFIG_POSITIONS_DESC="Autoriser la prévisualisation de la position des modules dans le template en ajoutant tp=1 dans l'adresse du site. Le bouton Prévisualiser apparaîtra aussi dans la liste des templates. "
COM_TEMPLATES_CONFIG_POSITIONS_LABEL="Prévisualisez la position des modules"
COM_TEMPLATES_CONFIG_FONT_DESC="Ces type de fichier seront disponibles pour la prévisualisation des polices."
COM_TEMPLATES_CONFIG_FONT_LABEL="Formats valides de polices"
COM_TEMPLATES_CONFIG_IMAGE_DESC="Ces type de fichier seront disponibles pour couper et redimensionner."
COM_TEMPLATES_CONFIG_IMAGE_LABEL="Formats valides d'images"
COM_TEMPLATES_CONFIG_SOURCE_DESC="Ces types de fichier seront disponibles pour modification."
COM_TEMPLATES_CONFIG_SOURCE_LABEL="Formats valides de sources"
COM_TEMPLATES_CONFIG_SUPPORTED_DESC="Attention avant de changer les types de fichiers. Lire les astuces avant de modifier."
COM_TEMPLATES_CONFIG_SUPPORTED_LABEL="Formats de fichiers acceptés"
COM_TEMPLATES_CONFIG_UPLOAD_DESC="Taille maximum des fichiers dans le Gestionnaire de templates"
COM_TEMPLATES_CONFIG_UPLOAD_LABEL="Taille de transfert (MB)"
COM_TEMPLATES_CONFIGURATION="Templates : Paramètres"
COM_TEMPLATES_COPY_SUCCESS="Le nouveau template nommé %s est installé."
COM_TEMPLATES_CROP_AREA_ERROR="La zone de coupe n'est pas sélectionée."
COM_TEMPLATES_DIRECTORY_NOT_WRITABLE="Le répertoire du template n'est pas ouvert en écriture. Certaines fonctionnalités peuvent ne pas fonctionner."
COM_TEMPLATES_ERR_XML="Les données XLM du template ne sont pas accessibles"
COM_TEMPLATES_ERROR_CANNOT_DELETE_LAST_STYLE="Suppression du dernier style d'un template impossible. Pour désinstaller/supprimer un template, aller à Extensions->Gérer->Gestion-> Choisir le template à supprimer et cliquer 'Désinstaller'"
COM_TEMPLATES_ERROR_CANNOT_UNSET_DEFAULT_STYLE="Désélection impossible du style choisi par défaut"
COM_TEMPLATES_ERROR_COULD_NOT_COPY="Impossible de copier les fichiers du template dans le répertoire temporaire."
COM_TEMPLATES_ERROR_COULD_NOT_INSTALL="Impossible d'installer le nouveau template à partir du répertoire temporaire."
COM_TEMPLATES_ERROR_COULD_NOT_WRITE="Impossible de supprimer le répertoire temporaire."
COM_TEMPLATES_ERROR_CREATE_NOT_PERMITTED="Impossible de créer un répertoire temporaire."
COM_TEMPLATES_ERROR_DUPLICATE_TEMPLATE_NAME="Un template du même nom est déjà installé."
COM_TEMPLATES_ERROR_EDITOR_DISABLED="L'éditeur CodeMirror ou Non WYSIWYG doit être activé pour permettre de modifier les fichiers des templates"
COM_TEMPLATES_ERROR_EXECUTABLE="Impossible de transférer des fichiers d'éxécution"
COM_TEMPLATES_ERROR_EXTENSION_RECORD_NOT_FOUND="Enregistrement relatif à l'extension non trouvé dans la base de données"
COM_TEMPLATES_ERROR_FAILED_TO_SAVE_FILENAME="Erreur. le fichier %s n'a pu être enregistré."
COM_TEMPLATES_ERROR_FILE_CREATE="Erreur. Impossible de créer le fichier."
COM_TEMPLATES_ERROR_FILE_DELETE="Erreur. Impossible de supprimer le fichier"
COM_TEMPLATES_ERROR_FILE_FORMAT="Format de fichier non accepté."
COM_TEMPLATES_ERROR_FILE_RENAME="Erreur. Impossible de renommer le fichier"
COM_TEMPLATES_ERROR_FILE_UPLOAD="Erreur. Impossible de transférer le fichier."
COM_TEMPLATES_ERROR_FOLDER_CREATE="Impossible de créer le répertoire"
COM_TEMPLATES_ERROR_FONT_FILE_NOT_FOUND="Fichier de police non trouvé"
COM_TEMPLATES_ERROR_IMAGE_FILE_NOT_FOUND="Fichier d'image non trouvé"
COM_TEMPLATES_ERROR_INDEX_DELETE="Le fichier index.php ne peut être supprimé. Le modifier dans l'éditeur si désiré."
COM_TEMPLATES_ERROR_INVALID_FROM_NAME="Le dossier source du template pour effectuer la copie ne peut pas être trouvé."
COM_TEMPLATES_ERROR_INVALID_TEMPLATE_NAME="Nom de template invalide. Veuillez utiliser uniquement des lettres, chiffres, tirets ou traits de soulignement."
COM_TEMPLATES_ERROR_RENAME_INDEX="Le fichier index.php ne peut être renommé."
COM_TEMPLATES_ERROR_ROOT_DELETE="Le dossier racine ne peut être supprimer."
COM_TEMPLATES_ERROR_SAVE_DISABLED_TEMPLATE="Impossible de sauvegarder un style associé à un template désactivé."
COM_TEMPLATES_ERROR_SOURCE_FILE_NOT_FOUND="Ficher source non trouvé"
COM_TEMPLATES_ERROR_SOURCE_FILE_NOT_UNWRITABLE="Le fichier source ne peut pas être dans l'état interdit en écriture"
COM_TEMPLATES_ERROR_SOURCE_FILE_NOT_WRITABLE="Fichier source interdit en écriture"
COM_TEMPLATES_ERROR_SOURCE_ID_FILENAME_MISMATCH="L'ID référencée ne correspond pas à celle proposée pour la mise à jour"
COM_TEMPLATES_ERROR_STYLE_NOT_FOUND="Style non trouvé"
COM_TEMPLATES_ERROR_STYLE_REQUIRES_TITLE="Il faut donner un titre au style"
COM_TEMPLATES_ERROR_TEMPLATE_FOLDER_NOT_FOUND="Dossier du template non trouvé"
COM_TEMPLATES_ERROR_UPLOAD_INPUT="Aucun fichier trouvé"
COM_TEMPLATES_ERROR_WARNFILENAME="Nom de fichier invalide. Merci de renommer le fichier et de transférer à nouveau."
COM_TEMPLATES_ERROR_WARNFILETOOLARGE="Un fichier plus lourd que 2 MB ne peut être transféré."
COM_TEMPLATES_ERROR_WARNFILETYPE="Format de fichier non accepté"
COM_TEMPLATES_ERROR_WARNIEXSS="Impossible de transférer. Contient du XSS"
COM_TEMPLATES_FIELD_CLIENT_DESC="Ce template est-il utilisé en frontal (0) ou en administration (1) du site ?"
COM_TEMPLATES_FIELD_CLIENT_LABEL="Emplacement"
COM_TEMPLATES_FIELD_HOME_ADMINISTRATOR_DESC="Ce style du template est-il défini comme style par défaut ou non ?"
COM_TEMPLATES_FIELD_HOME_LABEL="Défaut"
COM_TEMPLATES_FIELD_HOME_SITE_DESC="Si la fonction multilingue n'est pas mise en oeuvre, restreignez votre choix à <b>Non</b> ou <b>Tous</b>. Ce style du template pourra être défini comme style par défaut pour l'ensemble du template.<br />Si le plug-in <b>System - Filtre en fonction de la langue</b> est activé, et que vous utilisez des tremplates différents selon la langue choisie, attribuez une langue au style."
COM_TEMPLATES_FIELD_SOURCE_DESC="Code source"
COM_TEMPLATES_FIELD_SOURCE_LABEL="Code source"
COM_TEMPLATES_FIELD_TEMPLATE_DESC="Nom du template"
COM_TEMPLATES_FIELD_TEMPLATE_LABEL="Template"
COM_TEMPLATES_FIELD_TITLE_DESC="Nom du style"
COM_TEMPLATES_FIELD_TITLE_LABEL="Nom du style"
COM_TEMPLATES_FILE_ARCHIVE_OPEN_FAIL="Impossible d'ouvrir le fichier archive"
COM_TEMPLATES_FILE_ARCHIVE_EXISTS="Des fichiers existent déjà avec le même nom."
COM_TEMPLATES_FILE_ARCHIVE_NOT_FOUND="Archive non trouvée"
COM_TEMPLATES_FILE_ARCHIVE_EXTRACT_SUCCESS="L'archive a été décompressée."
COM_TEMPLATES_FILE_ARCHIVE_EXTRACT_FAIL="Erreur. Impossible de décompresser l'archive"
COM_TEMPLATES_FILE_CREATE_ERROR="Une erreur s'est produite lors de la création du fichier"
COM_TEMPLATES_FILE_CREATE_SUCCESS="Fichier créé."
COM_TEMPLATES_FILE_CONTENT_PREVIEW="Prévisualisation du contenu du fichier."
COM_TEMPLATES_FILE_COPY_FAIL="Impossible de copier le fichier."
COM_TEMPLATES_FILE_COPY_SUCCESS="Le fichier courant a été copié sous le nom de %s."
COM_TEMPLATES_FILE_CROP_ERROR="Impossible de couper l'image."
COM_TEMPLATES_FILE_CROP_SUCCESS="Image coupée."
COM_TEMPLATES_FILE_DELETE_ERROR="Erreur. Impossible de supprimer le fichier."
COM_TEMPLATES_FILE_DELETE_FAIL="Impossible de supprimer le fichier."
COM_TEMPLATES_FILE_DELETE_SUCCESS="Fichier supprimé."
COM_TEMPLATES_FILE_NEW_NAME_DESC="Saisir le nom du nouveau fichier copié."
COM_TEMPLATES_FILE_NEW_NAME_LABEL="Nom du fichier copié."
COM_TEMPLATES_FILE_EXISTS="Un fichier du même nom existe déjà"
COM_TEMPLATES_FILE_INFO="Informations sur le fichier"
COM_TEMPLATES_FILE_NAME="Nom du fichier"
COM_TEMPLATES_FILE_PERMISSIONS="Les permissions du fichier sont %s"
COM_TEMPLATES_FILE_RENAME_ERROR="Une erreur s'est produite en renommant le fichier."
COM_TEMPLATES_FILE_RENAME_SUCCESS="Fichier renommé."
COM_TEMPLATES_FILE_RESIZE_ERROR="Le redimensionnement de l'image n'a pas abouti"
COM_TEMPLATES_FILE_RESIZE_SUCCESS="Image redimensionnée."
COM_TEMPLATES_FILE_SAVE_SUCCESS="Fichier correctement enregistré"
COM_TEMPLATES_FILE_UNSUPPORTED_ARCHIVE="Le fichier ZIP contient des fichiers non acceptés"
COM_TEMPLATES_FILE_UPLOAD_ERROR="Erreur pendant le transfert du fichier"
COM_TEMPLATES_FILE_UPLOAD_SUCCESS="Le fichier a été transféré."
COM_TEMPLATES_FILTER_TEMPLATE="- Choisir un template -"
COM_TEMPLATES_FOLDER_CREATE_ERROR="Erreur à la création du dossier."
COM_TEMPLATES_FOLDER_CREATE_SUCCESS="Dossier créé."
COM_TEMPLATES_FOLDER_DELETE_ERROR="Erreur. Le dossier n'a pu être supprimé."
COM_TEMPLATES_FOLDER_DELETE_SUCCESS="Dossier supprimé."
COM_TEMPLATES_FOLDER_ERROR="Impossible de créer le dossier"
COM_TEMPLATES_FOLDER_EXISTS="Un dossier existe déjà avec le même nom"
COM_TEMPLATES_FOLDER_NAME="Nom du dossier"
COM_TEMPLATES_FOLDER_NOT_EXISTS="Le dossier n'existe pas."
COM_TEMPLATES_FTP_DESC="Pour mettre à jour les fichiers du template, Joomla aura besoin des informations d'accès à votre compte FTP. Veuillez les saisir dans le formulaire ci-dessous."
COM_TEMPLATES_FTP_TITLE="Paramètres FTP"
COM_TEMPLATES_GRID_UNSET_LANGUAGE="Désélectionner %s par défaut"
COM_TEMPLATES_HOME_BUTTON="Documentation"
COM_TEMPLATES_HOME_HEADING="Sélectionner un fichier"
COM_TEMPLATES_HOME_TEXT="Il est possible de sélectionner parmi de nombreuses options pour individualiser l'affichage de vos templates. Le Gestionnaire de templates fonctionne avec les fichiers source, les fichiers image, les fichiers de polices, les archives ZIP.  La plupart des opérations peuvent être accomplies sur ces fichiers. Il suffit de sélectionner un fichier et c'est prêt. Examiner la documentation pour en savoir plus."
COM_TEMPLATES_HEADING_ASSIGNED="Assigné"
COM_TEMPLATES_HEADING_DEFAULT="Défaut"
COM_TEMPLATES_HEADING_DEFAULT_ASC="Défaut ascendant"
COM_TEMPLATES_HEADING_DEFAULT_DESC="Défaut descendant"
COM_TEMPLATES_HEADING_IMAGE="Image"
COM_TEMPLATES_HEADING_LOCATION_ASC="Emplacement ascendant"
COM_TEMPLATES_HEADING_LOCATION_DESC="Emplacement descendant"
COM_TEMPLATES_HEADING_PAGES="Pages"
COM_TEMPLATES_HEADING_STYLE="Styles"
COM_TEMPLATES_HEADING_STYLE_ASC="Style ascendant"
COM_TEMPLATES_HEADING_STYLE_DESC="Style descendant"
COM_TEMPLATES_HEADING_TEMPLATE="Template"
COM_TEMPLATES_HEADING_TEMPLATE_ASC="Template ascendant"
COM_TEMPLATES_HEADING_TEMPLATE_DESC="Template descendant"
COM_TEMPLATES_IMAGE_HEIGHT="Hauteur"
COM_TEMPLATES_IMAGE_WIDTH="Largeur"
COM_TEMPLATES_INVALID_FILE_NAME="Nom de fichier invalide. Merci de choisir un nom contenant a-z, A-Z, 0-9, - et _."
COM_TEMPLATES_INVALID_FILE_TYPE="Type de fichier non sélectionné"
COM_TEMPLATES_INVALID_FOLDER_NAME="Nom de dossier invalide. Merci de choisir un nom contenant a-z, A-Z, 0-9, - et_."
COM_TEMPLATES_MANAGER="Templates :"
COM_TEMPLATES_MANAGER_ADD_STYLE="Templates : Ajouter un style"
COM_TEMPLATES_MANAGER_EDIT_FILE="Templates : Modifier le fichier"
COM_TEMPLATES_MANAGER_EDIT_STYLE="Templates : Modifier le style"
COM_TEMPLATES_MANAGE_FOLDERS="Gestion des répertoires"
COM_TEMPLATES_MANAGER_STYLES="Templates : Styles"
COM_TEMPLATES_MANAGER_STYLES_ADMIN="Templates: Styles (Administration)"
COM_TEMPLATES_MANAGER_STYLES_SITE="Templates: Styles (Site)"
COM_TEMPLATES_MANAGER_TEMPLATES="Templates"
COM_TEMPLATES_MANAGER_TEMPLATES_ADMIN="Templates: Templates (Administration)"
COM_TEMPLATES_MANAGER_TEMPLATES_SITE="Templates: Templates (Site)"
COM_TEMPLATES_MANAGER_VIEW_TEMPLATE="Templates : Personnaliser (%s)"
COM_TEMPLATES_MENU_CHANGED_1="Ce style est affecté à un lien de menu ou a été affecté"
COM_TEMPLATES_MENU_CHANGED_MORE="Ce style est affecté à %d liens de menu ou a été affecté"
COM_TEMPLATES_MENUS_ASSIGNMENT="Affecter à un menu"
COM_TEMPLATES_MODAL_FILE_DELETE="Le fichier %s sera supprimé."
COM_TEMPLATES_MSG_MANAGE_NO_STYLES="Il n'y a pas de style installé correspondant à votre requête"
COM_TEMPLATES_MSG_MANAGE_NO_TEMPLATES="Il n'y a pas de template installé correspondant à votre requête"
COM_TEMPLATES_N_ITEMS_DELETED="%d styles du template supprimés"
COM_TEMPLATES_N_ITEMS_DELETED_1=" Style du template supprimé"
COM_TEMPLATES_NEW_FILE_HEADER="Créer ou transférer un nouveau fichier."
COM_TEMPLATES_NEW_FILE_NAME="Nouveau nom de fichier"
COM_TEMPLATES_NEW_FILE_SELECT="Sélectionner un type de fichier"
COM_TEMPLATES_NEW_FILE_TYPE="Type de fichier"
COM_TEMPLATES_NO_TEMPLATE_SELECTED="Pas de template sélectionné"
COM_TEMPLATES_OPTION_NONE=":: Aucune ::"
; Deprecated 4.0
COM_TEMPLATES_OPTION_SELECT_PAGE="- Sélectionner une page -"
COM_TEMPLATES_OPTION_SELECT_MENU_ITEM="- Sélectionner un lien de menu -"
COM_TEMPLATES_OVERRIDE_CREATED="Substitution créée dans "
COM_TEMPLATES_OVERRIDE_EXISTS="La substitution existe déjà."
COM_TEMPLATES_OVERRIDE_FAILED="Impossible de créer la substitution."
COM_TEMPLATES_OVERRIDE_SUCCESS="Substitution créée."
COM_TEMPLATES_OVERRIDES_COMPONENTS="Composants"
COM_TEMPLATES_OVERRIDES_LAYOUTS="Affichages"
COM_TEMPLATES_OVERRIDES_MODULES="Modules"
COM_TEMPLATES_OVERRIDES_PLUGINS="Plug-ins"
COM_TEMPLATES_PREVIEW="Prévisualisation"
COM_TEMPLATES_RENAME_FILE="Renommer le fichier %s"
COM_TEMPLATES_RESIZE_IMAGE="Redimmensionner l'image"
COM_TEMPLATES_SOURCE_CODE="Source"
COM_TEMPLATES_SITE_PREVIEW="Prévisualisation du site"
COM_TEMPLATES_STYLE_CANNOT_DELETE_DEFAULT_STYLE="Le style par défaut ne peut être supprimé"
COM_TEMPLATES_STYLE_SAVE_SUCCESS="Style enregistré"
COM_TEMPLATES_STYLES_FILTER_SEARCH_DESC="Recherche dans la description du style."
COM_TEMPLATES_STYLES_PAGES_ALL="Défaut pour toutes les pages"
COM_TEMPLATES_STYLES_PAGES_ALL_LANGUAGE="Défaut pour %s pages"
COM_TEMPLATES_STYLES_PAGES_SELECTED="Assigné à %s pages"
COM_TEMPLATES_STYLES_PAGES_NONE="Non assigné"
COM_TEMPLATES_SUBMENU_STYLES="Styles"
COM_TEMPLATES_SUBMENU_TEMPLATES="Templates"
COM_TEMPLATES_SUCCESS_DUPLICATED="Style dupliqué."
COM_TEMPLATES_SUCCESS_HOME_SET="Style défini par défaut."
COM_TEMPLATES_SUCCESS_HOME_UNSET="Style par défaut désélectionné."
COM_TEMPLATES_TAB_DESCRIPTION="Description du template"
COM_TEMPLATES_TAB_EDITOR="Éditeur"
COM_TEMPLATES_TAB_OVERRIDES="Créer des substitutions"
COM_TEMPLATES_TEMPLATE_ADD_CSS="Ajouter une nouvelle feuille de style"
COM_TEMPLATES_TEMPLATE_ADD_ERROR="Ajouter une page d'erreur personnalisée au template (facultatif)"
COM_TEMPLATES_TEMPLATE_CLOSE="Fermer"
COM_TEMPLATES_TEMPLATE_COPY="Copier le template"
COM_TEMPLATES_TEMPLATE_CSS="Feuilles de style"
COM_TEMPLATES_TEMPLATE_DESCRIPTION="Description du template"
COM_TEMPLATES_TEMPLATE_DETAILS="%s Détails et fichiers"
COM_TEMPLATES_TEMPLATE_EDIT_CSS="Modifier %s"
COM_TEMPLATES_TEMPLATE_EDIT_ERROR="Modifier la page d'erreur associée au template"
COM_TEMPLATES_TEMPLATE_EDIT_MAIN="Modifier la page principale du template"
COM_TEMPLATES_TEMPLATE_EDIT_OFFLINEVIEW="Modifier la page en mode hors connexion"
COM_TEMPLATES_TEMPLATE_EDIT_PRINTVIEW="Modifier la mise en page pour la version imprimée du template"
COM_TEMPLATES_TEMPLATE_FILENAME="Modifier le fichier '%s' dans le template '%s'."
COM_TEMPLATES_TEMPLATE_FILES="Fichiers du template"
COM_TEMPLATES_TEMPLATE_HTML="Fichiers HTML"
COM_TEMPLATES_TEMPLATE_MASTER_FILES="Fichiers maîtres du template"
COM_TEMPLATES_TEMPLATE_NEW_NAME_DESC="Indiquez le nom du nouveau template. Veuillez utiliser uniquement des lettres, chiffres et traits de soulignement."
COM_TEMPLATES_TEMPLATE_NEW_NAME_LABEL="Nom du nouveau template"
COM_TEMPLATES_TEMPLATE_NO_PREVIEW="L'aperçu n'est pas disponible. Vous pouvez l'activer dans les paramètres."
COM_TEMPLATES_TEMPLATE_NO_PREVIEW_ADMIN="Aucun aperçu disponible pour le template d'administration"
COM_TEMPLATES_TEMPLATE_NO_PREVIEW_DESC="Pour autoriser la prévisualisation du template, vous devez autoriser l'aperçu des positions de module dans les 'Paramètres' de la gestion des templates."
COM_TEMPLATES_TEMPLATE_NOT_SPECIFIED="Template non défini."
COM_TEMPLATES_TEMPLATE_PREVIEW="Prévisualisation"
COM_TEMPLATES_TEMPLATES_FILTER_SEARCH_DESC="Recherche dans le nom du template ou le nom du dossier."
COM_TEMPLATES_TOGGLE_FULL_SCREEN="Appuyez sur Ctrl-Q pour activer l'édition plein écran."
COM_TEMPLATES_TOOLBAR_SET_HOME="Défaut"
COM_TEMPLATES_WARNING_FORMAT_WILL_NOT_BE_VISIBLE="Vous avez créé un nouveau fichier avec l'extension '%s'. Ceci est pris en charge mais comme vous n'avez pas cette extension de fichier dans la liste des formats pris en charge cela ne peut pas être affichée. Merci de vérifier les options pour les templates et ajouter le format si nécessaire."
COM_TEMPLATES_XML_DESCRIPTION="Ce composant gère les templates"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_TEMPLATES="Changes apply to this component only.<br /><em><strong>Inherited</strong></em> - a Global Configuration setting or higher level setting is applied.<br /><em><strong>Denied</strong></em> always wins - whatever is set at the Global or higher level and applies to all child elements.<br /><em><strong>Allowed</strong></em> will enable the action for this component unless overruled by a Global Configuration setting."

[New Strings]

JLIB_RULES_SETTING_NOTES="Les modification ne s'appliquent qu'à ce composant.<br /><em><strong>Hérité</strong></em> - les droits globaux ou ceux des groupes parents seront utilisés.<br /><em><strong>Refusé</strong></em> - prévaut toujours, quels que soient les droits globaux ou ceux des groupes parents, et s'applique aux éléments enfants.<br /><em><strong>Autorisé</strong></em> - le groupe concerné pourra effectuer cette action dans ce composant sauf si les droits globaux sont différents."
language/fr-FR/fr-FR.plg_search_icagenda.sys.ini000060400000001011152453623440015413 0ustar00; iCagenda
; Copyright (c)2012-2014 Cyril Rezé (Lyr!C) / JoomliC.com - All rights reserved.
; License GNU General Public License version 3 or later <http://www.gnu.org/licenses/gpl.html>
; Note : All ini files need to be saved as UTF-8
;
; ICAGENDA_PLG_SEARCH	: plg_search_icagenda.sys.ini
; Translation Platform	: https://www.transifex.com/projects/p/icagenda/


ICAGENDA_PLG_SEARCH = "Recherche - iCagenda"
ICAGENDA_PLG_SEARCH_XML_DESCRIPTION = " Intégration des évènements iCagenda dans la recherche sur le site."
language/fr-FR/fr-FR.mod_popular.sys.ini000060400000001210152453623440014013 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

MOD_POPULAR_XML_DESCRIPTION="Le module 'mod_popular' affiche les titres des articles publiés les plus consultés. Ceux dont la date de publication a expiré sont également pris en compte."
MOD_POPULAR="Articles les plus consultés"
MOD_POPULAR_LAYOUT_DEFAULT="Défaut"language/fr-FR/fr-FR.plg_system_logrotation.ini000060400000001612152453623440015472 0ustar00; @date        2018-09-15
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SYSTEM_LOGROTATION="Système - Rotation des fichiers journaux"
PLG_SYSTEM_LOGROTATION_XML_DESCRIPTION="Ce plugin renouvelle périodiquement les fichiers journaux du système."
PLG_SYSTEM_LOGROTATION_CACHETIMEOUT_LABEL="Rotation des journaux (en jours)"
PLG_SYSTEM_LOGROTATION_CACHETIMEOUT_DESC="À quelle fréquence les journaux doivent-ils être renouvelés?"
PLG_SYSTEM_LOGROTATION_LOGSTOKEEP_DESC="Le nombre maximum de journaux anciens à conserver."
PLG_SYSTEM_LOGROTATION_LOGSTOKEEP_LABEL="Nombre maximum de journaux"
language/fr-FR/fr-FR.plg_content_contact.sys.ini000060400000001063152453623440015527 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_CONTENT_CONTACT="Contenu - Contact"
PLG_CONTENT_CONTACT_XML_DESCRIPTION="Fournit un lien entre l'auteur d'un article et un contact qui peut être utilisé pour un profil d'auteur."
language/fr-FR/fr-FR.plg_fields_media.ini000060400000002351152453623440014133 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_MEDIA="Champs - Médias"
PLG_FIELDS_MEDIA_LABEL="Médias (%s)"
PLG_FIELDS_MEDIA_PARAMS_DIRECTORY_DESC="Indiquer le dossier contenant les images à lister par rapport au dossier d'images par défaut (défini dans Media > Paramètres)."
PLG_FIELDS_MEDIA_PARAMS_DIRECTORY_LABEL="Répertoire"
PLG_FIELDS_MEDIA_PARAMS_IMAGE_CLASS_DESC="La classe à ajouter à l'image (src tag)."
PLG_FIELDS_MEDIA_PARAMS_IMAGE_CLASS_LABEL="Classe de l'image"
PLG_FIELDS_MEDIA_PARAMS_PREVIEW_DESC="Affiche ou non la prévisualisation de l'image sélectionnée."
PLG_FIELDS_MEDIA_PARAMS_PREVIEW_INLINE="En ligne"
PLG_FIELDS_MEDIA_PARAMS_PREVIEW_LABEL="Prévisualisation"
PLG_FIELDS_MEDIA_PARAMS_PREVIEW_TOOLTIP="Info-bulle"
PLG_FIELDS_MEDIA_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'media' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.mod_latest.sys.ini000060400000001361152453623440013634 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8



MOD_LATEST="Derniers articles"
MOD_LATEST_XML_DESCRIPTION="Le module 'mod_latest' affiche les titres des derniers articles créés . Ceux dont la date de publication a expiré sont également pris en compte lorsque l'utilisateur y a accès.<br />Ce module doit être placé en position 'cpanel' avec le template par défaut de Joomla."
MOD_LATEST_LAYOUT_DEFAULT="Défaut"

language/fr-FR/fr-FR.com_tags.sys.ini000060400000004102152453623440013271 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_TAGS="Tags"
COM_TAGS_CONTENT_TYPE_ARTICLE="Article"
COM_TAGS_CONTENT_TYPE_ARTICLE_CATEGORY="Catégorie d'articles"
COM_TAGS_CONTENT_TYPE_BANNER="Bannière"
COM_TAGS_CONTENT_TYPE_BANNER_CLIENT="Clients des bannières"
COM_TAGS_CONTENT_TYPE_BANNERS_CATEGORY="Catégorie de bannières"
COM_TAGS_CONTENT_TYPE_CONTACT="Contact"
COM_TAGS_CONTENT_TYPE_CONTACT_CATEGORY="Catégorie de contacts"
COM_TAGS_CONTENT_TYPE_NEWSFEED="Fil d'actualité"
COM_TAGS_CONTENT_TYPE_NEWSFEEDS_CATEGORY="Catégorie de fils d'actualité"
COM_TAGS_CONTENT_TYPE_TAG="Tag"
COM_TAGS_CONTENT_TYPE_USER="Utilisateur"
COM_TAGS_CONTENT_TYPE_USER_NOTES="Notes utilisateurs"
COM_TAGS_CONTENT_TYPE_USER_NOTES_CATEGORY="Catégorie des notes utilisateurs"
COM_TAGS_CONTENT_TYPE_WEBLINK="Lien web"
COM_TAGS_CONTENT_TYPE_WEBLINKS_CATEGORY="Catégorie de liens web"
COM_TAGS_TAG="Tag"
COM_TAGS_TAG_VIEW_DEFAULT_DESC="Lien vers les éléments taggés avec le tag affiché."
COM_TAGS_TAG_VIEW_DEFAULT_OPTION="Défaut"
COM_TAGS_TAG_VIEW_DEFAULT_TITLE="Éléments taggés"
COM_TAGS_TAG_VIEW_LIST_COMPACT_OPTION="Vue compacte"
COM_TAGS_TAG_VIEW_LIST_COMPACT_TITLE="Liste compacte des éléments taggés"
COM_TAGS_TAG_VIEW_LIST_DESC="Liste des éléments taggés avec les tags sélectionnés."
COM_TAGS_TAG_VIEW_LIST_OPTION="Options d'affichage de la liste"
COM_TAGS_TAG_VIEW_LIST_TITLE="Liste des éléments taggés"
COM_TAGS_TAGS="Tags"
COM_TAGS_TAGS_VIEW_COMPACT_DESC="Liste des tags en affichage compact"
COM_TAGS_TAGS_VIEW_COMPACT_TITLE="Vue compacte des tags"
COM_TAGS_TAGS_VIEW_DEFAULT_DESC="Lien vers la liste détaillée de toutes les tags."
COM_TAGS_TAGS_VIEW_DEFAULT_TITLE="Liste de tous les tags"
COM_TAGS_XML_DESCRIPTION="Composant de gestion des tags d'éléments"
language/fr-FR/fr-FR.mod_submenu.ini000060400000001255152453623440013203 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

MOD_SUBMENU="Sous-menu des fonctions et extensions"
MOD_SUBMENU_XML_DESCRIPTION="Le module 'mod_submenu' affiche les sous-menus des extensions natives à Joomla ou installées dans l'affichage de leur interface.<br />Ce module doit être placé en position 'submenu' avec le template par défaut de Joomla."language/fr-FR/fr-FR.com_postinstall.ini000060400000002503152453623440014075 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_POSTINSTALL="Messages de post-installation"
COM_POSTINSTALL_BTN_HIDE="Cacher ce message"
COM_POSTINSTALL_BTN_RESET="Afficher les messages"
COM_POSTINSTALL_CONFIGURATION="Messages de post-installation : Paramètres"
COM_POSTINSTALL_HIDE_ALL_MESSAGES="Cacher tous les messages"
COM_POSTINSTALL_LBL_MESSAGES="Messages de post-installation et de mise à jour"
COM_POSTINSTALL_LBL_NOMESSAGES_DESC="Vous avez déjà consulté tous les messages."
COM_POSTINSTALL_LBL_NOMESSAGES_TITLE="Pas de messages"
COM_POSTINSTALL_LBL_RELEASENEWS="Informations à propos des Releases <a href=\"https://www.joomla.org/announcements/release-news.html\">du  Projet Joomla!</a>"
COM_POSTINSTALL_LBL_SINCEVERSION="Depuis la version %s"
COM_POSTINSTALL_MESSAGES_FOR="Affichage des messages pour"
COM_POSTINSTALL_MESSAGES_TITLE="Messages de post-installation pour %s"
COM_POSTINSTALL_XML_DESCRIPTION="Affiche les messages de post-installation et mise-à-jour pour Joomla et ses extensions."
language/fr-FR/fr-FR.plg_jce_filesystem-server.ini000060400000001612152453623440016036 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_JCE_FILESYSTEM_SERVER="Système de fichiers Serveur pour JCE"
PLG_JCE_FILESYSTEM_SERVER_XML_DESC="Plugin système permettant d'accéder et de gérer des fichiers en dehors du dossier racine de Joomla avec l'éditeur JCE"

PLG_JCE_FILESYSTEM_SERVER_BASE_DIR="Répertoire de base"
PLG_JCE_FILESYSTEM_SERVER_BASE_DIR_DESC="Le chemin absolu vers le répertoire de base contenant le dossier à parcourir, par exemple : /home/user1234/public_html/"
PLG_JCE_FILESYSTEM_SERVER_ROOT_URL="URL racine"
PLG_JCE_FILESYSTEM_SERVER_ROOT_URL_DESC="L'url absolue du site, par exemple : https://docs.site.com"language/fr-FR/fr-FR.com_modules.ini000060400000031075152453623440013177 0ustar00; @date        2015-01-30
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_MODULES="Modules"
COM_MODULES_ACTION_EDITFRONTEND="Saisie frontale"
COM_MODULES_ACTION_EDITFRONTEND_COMPONENT_DESC="Autorise les utilisateurs de ce groupe à éditer en frontal"
COM_MODULES_ADMIN_LANG_FILTER_FIELDSET_LABEL="Modules administration"
COM_MODULES_ADMIN_LANG_FILTER_DESC="Permet de filtrer les modules de l'administration par langue d'administration."
COM_MODULES_ADMIN_LANG_FILTER_LABEL="Filtre de langue"
COM_MODULES_ADVANCED_FIELDSET_LABEL="Paramètres avancés"
COM_MODULES_ASSIGNED_VARIES_EXCEPT="Tout sauf la sélection"
COM_MODULES_ASSIGNED_VARIES_ONLY="Sélectionnés"
COM_MODULES_BASIC_FIELDSET_LABEL="Paramètres"
COM_MODULES_BATCH_POSITION_LABEL="Définir la position"
COM_MODULES_BATCH_POSITION_NOCHANGE="Conserver la position originale"
COM_MODULES_BATCH_POSITION_NOPOSITION="Pas de position de module"
COM_MODULES_BATCH_OPTIONS="Traitement par lots des modules sélectionnés"
COM_MODULES_BATCH_TIP="Si vous choisissez de copier un module, les actions sélectionnées seront appliquées au module copié. Sinon, toutes les actions seront appliquées au module sélectionné.</br >Lors d'une copie sans changer de position, il est néanmoins nécessaire de choisir 'Conserver la position originale' dans la Sélection de position'."
COM_MODULES_CHANGE_POSITION_BUTTON="Sélectionner"
COM_MODULES_CHANGE_POSITION_TITLE="Sélectionnez la position"
COM_MODULES_CONFIGURATION="Modules : Paramètres"
COM_MODULES_CUSTOM_OUTPUT="Personnaliser le contenu"
COM_MODULES_ERR_XML="Donnée XML du module non disponible"
COM_MODULES_ERROR_CANNOT_FIND_MODULE="Module introuvable"
COM_MODULES_ERROR_CANNOT_GET_MODULE="Impossible d'afficher le module"
COM_MODULES_ERROR_INVALID_EXTENSION="Module non valide"
COM_MODULES_ERROR_NO_MODULES_SELECTED="Aucun module sélectionné"
COM_MODULES_EXTENSION_PUBLISHED_DISABLED="Module désactivé et publié"
COM_MODULES_EXTENSION_PUBLISHED_ENABLED="Module activé et publié"
COM_MODULES_EXTENSION_UNPUBLISHED_DISABLED="Module désactivé et dépublié"
COM_MODULES_EXTENSION_UNPUBLISHED_ENABLED="Module activé et dépublié"
COM_MODULES_EXTRA_STYLE_DESC="Spécifier un style du module ou des modules dans la position sélectionnée"
COM_MODULES_EXTRA_STYLE_TITLE="Style pour le(s) module(s)"
COM_MODULES_FIELD_AUTOMATIC_TITLE_LABEL="Titre automatique"
COM_MODULES_FIELD_AUTOMATIC_TITLE_DESC="Sélectionnez 'Oui' si vous souhaitez une traduction automatique du titre. Son fonctionnement dépend du template administrateur."
COM_MODULES_FIELD_CACHE_TIME_DESC="Durée de vie, en minutes, des éléments du module dans le cache avant de les réactualiser."
COM_MODULES_FIELD_CACHE_TIME_LABEL="Durée du cache"
COM_MODULES_FIELD_CACHING_DESC="Activer le paramètre global de cache du contenu de ce module ou désactiver la mise en cache de ce module."
COM_MODULES_FIELD_CACHING_LABEL="Mise en cache"
COM_MODULES_FIELD_CLIENT_ID_DESC="La position du module, frontend ou backend. Vous ne pouvez pas changer cette valeur."
COM_MODULES_FIELD_CLIENT_ID_LABEL="Position du module"
COM_MODULES_FIELD_CONTENT_DESC="Texte du copyright"
COM_MODULES_FIELD_CONTENT_LABEL="Texte du copyright"
COM_MODULES_FIELD_CONTENT_TOO_LARGE="Le contenu dépasse les limites autorisées."
COM_MODULES_FIELD_MODULE_DESC="Type de module"
COM_MODULES_FIELD_MODULE_LABEL="Type de module"
COM_MODULES_FIELD_MODULECLASS_SFX_DESC="Suffixe à appliquer à la classe CSS du module correspondant à un style personnalisé du template."
COM_MODULES_FIELD_MODULECLASS_SFX_LABEL="Suffixe de classe CSS"
COM_MODULES_FIELD_NOTE_DESC="Note optionnelle à afficher dans la liste des modules."
COM_MODULES_FIELD_NOTE_LABEL="Note"
COM_MODULES_FIELD_POSITION_DESC="Veuillez sélectionner une position de module à partir de la liste des positions prédéfinies où vous pouvez filtrer par type et par template, ou entrez votre propre position en écrivant le nom puis presser la touche Enter."
COM_MODULES_FIELD_POSITION_LABEL="Position"
COM_MODULES_FIELD_PUBLISH_DOWN_DESC="Date optionnelle de fin de publication du module."
COM_MODULES_FIELD_PUBLISH_DOWN_LABEL="Fin de publication"
COM_MODULES_FIELD_PUBLISH_UP_DESC="Date optionnelle de début de publication du module."
COM_MODULES_FIELD_PUBLISH_UP_LABEL="Début de publication"
COM_MODULES_FIELD_PUBLISHED_DESC="S'il est publié, ce module sera affiché sur le frontend ou le backend du site selon le module."
COM_MODULES_FIELD_SHOWTITLE_DESC="Afficher/Masquer le titre du module. L'aspect du titre dépend du style du template."
COM_MODULES_FIELD_SHOWTITLE_LABEL="Montrer le titre"
COM_MODULES_FIELD_TITLE_DESC="Veuillez spécifier un titre pour le module"
COM_MODULES_FIELD_VALUE_NOCACHING="Pas de cache"
COM_MODULES_FIELD_MODULE_TAG_LABEL="Tag de module"
COM_MODULES_FIELD_MODULE_TAG_DESC="Tag HTML appliqué au module."
COM_MODULES_FIELD_BOOTSTRAP_SIZE_LABEL="Taille Bootstrap"
COM_MODULES_FIELD_BOOTSTRAP_SIZE_DESC="Vous pouvez spécifier le nombre de colonnes que le module doit utiliser."
COM_MODULES_FIELD_HEADER_TAG_LABEL="Tag d'en-tête/titre"
COM_MODULES_FIELD_HEADER_TAG_DESC="Tag HTML appliqué à l'en-tête/titre du module."
COM_MODULES_FIELD_HEADER_CLASS_LABEL="Classe d'en-tête/titre"
COM_MODULES_FIELD_HEADER_CLASS_DESC="Classe CSS appliquée à l'en-tête/titre du module."
COM_MODULES_FIELD_MODULE_STYLE_LABEL="Style du module"
COM_MODULES_FIELD_MODULE_STYLE_DESC="Utilisez cette option pour remplacer le style du template pour cette position."
COM_MODULES_FIELDSET_RULES="Droits"
COM_MODULES_FILTER_SEARCH_DESC="Filtrer par nom de position."
COM_MODULES_GENERAL_FIELDSET_DESC="Configure les paramètres de l'interface de modification des modules."
COM_MODULES_HEADING_MODULE="Type"
COM_MODULES_HEADING_MODULE_ASC="Type ascendant"
COM_MODULES_HEADING_MODULE_DESC="Type descendant"
COM_MODULES_HEADING_PAGES="Pages"
COM_MODULES_HEADING_PAGES_ASC="Pages ascendant"
COM_MODULES_HEADING_PAGES_DESC="Pages descendant"
COM_MODULES_HEADING_POSITION="Position"
COM_MODULES_HEADING_POSITION_ASC="Position ascendant"
COM_MODULES_HEADING_POSITION_DESC="Position descendant"
COM_MODULES_HEADING_TEMPLATES="Templates"
COM_MODULES_HTML_PUBLISH_DISABLED="Module publié::Extension désactivée"
COM_MODULES_HTML_PUBLISH_ENABLED="Module publié::Extension activée"
COM_MODULES_HTML_UNPUBLISH_DISABLED="Module dépublié::Extension désactivée"
COM_MODULES_HTML_UNPUBLISH_ENABLED="Module dépublié::Extension activée"
COM_MODULES_MANAGER_MODULE="Modules : %s"
COM_MODULES_MANAGER_MODULE_ADD="Modules : Ajouter un module"
COM_MODULES_MANAGER_MODULE_EDIT="Modules : Modifier un module"
COM_MODULES_MANAGER_MODULES="Modules"
COM_MODULES_MANAGER_MODULES_ADMIN="Modules (Administration)"
COM_MODULES_MANAGER_MODULES_SITE="Modules (Site)"
COM_MODULES_MENU_ASSIGNMENT="Assignation des menus"
COM_MODULES_MENU_ITEM_SEPARATOR="Séparateur"
COM_MODULES_MENU_ITEM_HEADING="Titre"
COM_MODULES_MENU_ITEM_ALIAS="Alias"
COM_MODULES_MENU_ITEM_URL="URL"
COM_MODULES_MODULE_ASSIGN="Assignation à..."
COM_MODULES_MODULE="Module"
COM_MODULES_MODULE_DESCRIPTION="Description du module"
COM_MODULES_MODULE_TEMPLATE_POSITION="%1$s (%2$s)"
COM_MODULES_MODULES="Modules"
COM_MODULES_MODULES_FILTER_SEARCH_DESC="Chercher dans le titre ou la note du module. Préfixe avec ID: chercher sur l'ID de module."
COM_MODULES_MODULES_FILTER_SEARCH_LABEL="Recherche de modules"
COM_MODULES_MSG_MANAGE_NO_MODULES="Il n'y a pas de modules correspondant à votre requête."
COM_MODULES_MSG_MANAGE_EXTENSION_DISABLED="Ce module n'est pas activé. Utiliser Extensions => Gestion pour l'activer."
COM_MODULES_N_ITEMS_ARCHIVED="%d modules archivés."
COM_MODULES_N_ITEMS_ARCHIVED_1="%d module archivé."
COM_MODULES_N_ITEMS_CHECKED_IN_0="Aucun module déverrouillé."
COM_MODULES_N_ITEMS_CHECKED_IN_1="%d module vérifié."
COM_MODULES_N_ITEMS_CHECKED_IN_MORE="%d modules déverrouillé."
COM_MODULES_N_ITEMS_DELETED="%d modules supprimés."
COM_MODULES_N_ITEMS_DELETED_1="%d module supprimé."
COM_MODULES_N_ITEMS_PUBLISHED="%d modules publiés."
COM_MODULES_N_ITEMS_PUBLISHED_1="%d module publié."
COM_MODULES_N_ITEMS_TRASHED="%d modules placés dans la corbeille."
COM_MODULES_N_ITEMS_TRASHED_1="%d module placé dans la corbeille."
COM_MODULES_N_ITEMS_UNPUBLISHED="%d modules dépubliés."
COM_MODULES_N_ITEMS_UNPUBLISHED_1="%d module dépublié."
COM_MODULES_N_MODULES_DUPLICATED="%d modules copiés."
COM_MODULES_N_MODULES_DUPLICATED_1="%d module copié."
COM_MODULES_NO_ITEM_SELECTED="Aucun module sélectionné"
COM_MODULES_NODESCRIPTION="Aucune description disponible"
COM_MODULES_NONE=":: Aucune ::"
COM_MODULES_OPTION_MENU_ALL="Sur toutes les pages"
COM_MODULES_OPTION_MENU_EXCLUDE="Toutes les pages sauf les liens sélectionnés"
COM_MODULES_OPTION_MENU_INCLUDE="Uniquement les liens sélectionnés"
COM_MODULES_OPTION_MENU_NONE="Aucune page"
COM_MODULES_OPTION_ORDER_POSITION="%d. %s"
COM_MODULES_OPTION_POSITION_TEMPLATE_DEFINED="Template"
COM_MODULES_OPTION_POSITION_USER_DEFINED="Utilisateur"
COM_MODULES_OPTION_SELECT_CLIENT="- Sélectionnez l'emplacement -"
COM_MODULES_OPTION_SELECT_MENU_ITEM="- Sélectionner un lien de menu -"
COM_MODULES_OPTION_SELECT_MODULE="- Sélectionnez le type -"
; Deprecated 4.0
COM_MODULES_OPTION_SELECT_PAGE="- Sélectionner une page -"
COM_MODULES_OPTION_SELECT_POSITION="- Sélectionnez la position -"
COM_MODULES_OPTION_SELECT_TYPE="- Sélectionnez le type -"
COM_MODULES_POSITION_ANALYTICS="Analytics"
COM_MODULES_POSITION_BANNER="Banner"
COM_MODULES_POSITION_BOTTOM="Bottom"
COM_MODULES_POSITION_BREADCRUMB="Breadcrumb"
COM_MODULES_POSITION_BREADCRUMBS="Breadcrumbs"
COM_MODULES_POSITION_DEBUG="Debug"
COM_MODULES_POSITION_FOOTER="Footer"
COM_MODULES_POSITION_HEADER="Header"
COM_MODULES_POSITION_LEFT2="Left 2"
COM_MODULES_POSITION_LEFT="Left"
COM_MODULES_POSITION_MAINNAV="Main Navigation"
COM_MODULES_POSITION_NAV="Navigation"
COM_MODULES_POSITION_OFFLINE="Offline"
COM_MODULES_POSITION_POSITION-0="Position 0"
COM_MODULES_POSITION_POSITION-10="Position 10"
COM_MODULES_POSITION_POSITION-11="Position 11"
COM_MODULES_POSITION_POSITION-12="Position 12"
COM_MODULES_POSITION_POSITION-13="Position 13"
COM_MODULES_POSITION_POSITION-14="Position 14"
COM_MODULES_POSITION_POSITION-15="Position 15"
COM_MODULES_POSITION_POSITION-1="Position 1"
COM_MODULES_POSITION_POSITION-2="Position 2"
COM_MODULES_POSITION_POSITION-3="Position 3"
COM_MODULES_POSITION_POSITION-4="Position 4"
COM_MODULES_POSITION_POSITION-5="Position 5"
COM_MODULES_POSITION_POSITION-6="Position 6"
COM_MODULES_POSITION_POSITION-7="Position 7"
COM_MODULES_POSITION_POSITION-8="Position 8"
COM_MODULES_POSITION_POSITION-9="Position 9"
COM_MODULES_POSITION_RIGHT2="Droite 2"
COM_MODULES_POSITION_RIGHT="Droite"
COM_MODULES_POSITION_SUB1="Sub 1"
COM_MODULES_POSITION_SUB2="Sub 2"
COM_MODULES_POSITION_SUB3="Sub 3"
COM_MODULES_POSITION_SUB4="Sub 4"
COM_MODULES_POSITION_SUB5="Sub 5"
COM_MODULES_POSITION_SUB6="Sub 6"
COM_MODULES_POSITION_SUB="Sub"
COM_MODULES_POSITION_SUBNAV="Sub Navigation"
COM_MODULES_POSITION_SYNDICATE="Syndicate"
COM_MODULES_POSITION_TOP2="Top 2"
COM_MODULES_POSITION_TOP3="Top 3"
COM_MODULES_POSITION_TOP4="Top 4"
COM_MODULES_POSITION_TOP="Top"
COM_MODULES_POSITION_USER1="User 1"
COM_MODULES_POSITION_USER2="User 2"
COM_MODULES_POSITION_USER3="User 3"
COM_MODULES_POSITION_USER4="User 4"
COM_MODULES_POSITION_USER5="User 5"
COM_MODULES_POSITION_USER6="User 6"
COM_MODULES_POSITION_USER7="User 7"
COM_MODULES_POSITION_USER8="User 8"
COM_MODULES_SAVE_SUCCESS="Module enregistré"
COM_MODULES_TYPE_CHOOSE="Sélectionnez un type de module :"
COM_MODULES_XML_DESCRIPTION="Composant pour la gestion des modules"
COM_MODULES_ADD_CUSTOM_POSITION="Utiliser la position personnalisée "
COM_MODULES_CUSTOM_POSITION="Positions actives"
COM_MODULES_TYPE_OR_SELECT_POSITION="Indiquez ou sélectionnez une position."
COM_MODULES_DESELECT="Désélection"
COM_MODULES_EXPAND="Étendre"
COM_MODULES_COLLAPSE="Replier"
COM_MODULES_SUBITEMS="Sous-éléments :"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_MODULES="Les modification ne s'appliquent qu'à ce composant.<br /><em><strong>Hérité</strong></em> - les droits globaux ou ceux des groupes parents seront utilisés.<br /><em><strong>Refusé</strong></em> - prévaut toujours, quels que soient les droits globaux ou ceux des groupes parents, et s'applique aux éléments enfants.<br /><em><strong>Autorisé</strong></em> - le groupe concerné pourra effectuer cette action dans ce composant sauf si les droits globaux sont différents."
language/fr-FR/fr-FR.plg_fields_integer.ini000060400000002507152453623440014514 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_INTEGER="Champs - Nombre entier"
PLG_FIELDS_INTEGER_LABEL="Nombre entier (%s)"
PLG_FIELDS_INTEGER_PARAMS_FIRST_DESC="La valeur la plus basse dans la liste."
PLG_FIELDS_INTEGER_PARAMS_FIRST_LABEL="Première"
PLG_FIELDS_INTEGER_PARAMS_LAST_DESC="La valeur la plus haute dans la liste."
PLG_FIELDS_INTEGER_PARAMS_LAST_LABEL="Dernière"
PLG_FIELDS_INTEGER_PARAMS_MULTIPLE_DESC="Permet la sélection de valeurs multiples."
PLG_FIELDS_INTEGER_PARAMS_MULTIPLE_LABEL="Multiple"
PLG_FIELDS_INTEGER_PARAMS_STEP_DESC="Chaque option sera l'option précédente incrémentée par ce nombre entier, commençant par la première valeur jusqu'à ce que la dernière valeur soit atteinte. "
PLG_FIELDS_INTEGER_PARAMS_STEP_LABEL="Incrémentation"
PLG_FIELDS_INTEGER_PARAMS_USE_GLOBAL="Paramètres du plug-in"
PLG_FIELDS_INTEGER_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'integer' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_content_vote.sys.ini000060400000000762152453623440015056 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_CONTENT_VOTE="Contenu - Vote sur article"
PLG_VOTE_XML_DESCRIPTION="Système de vote/appréciation sur les articles"language/fr-FR/fr-FR.mod_logged.ini000060400000002323152453623440012763 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8 - No BOM



MOD_LOGGED="Utilisateurs identifiés"
MOD_LOGGED_ADMINISTRATOR="Administrateur"
MOD_LOGGED_EDIT_USER="Modifier l'utilisateur"
MOD_LOGGED_FIELD_COUNT_DESC="Nombre d'utilisateurs (par défaut 5)"
MOD_LOGGED_FIELD_COUNT_LABEL="Nombre"
MOD_LOGGED_FIELD_NAME_DESC="Afficher le nom ou l'identifiant"
MOD_LOGGED_LAST_ACTIVITY="Dernière activité"
MOD_LOGGED_LOGOUT="Déconnexion"
MOD_LOGGED_NAME="Nom"
MOD_LOGGED_SITE="Site"
MOD_LOGGED_TITLE="Derniers utilisateurs connectés"
MOD_LOGGED_TITLE_1="Dernier utilisateur connecté"
MOD_LOGGED_TITLE_MORE="Les %s derniers utilisateurs connectés"
MOD_LOGGED_XML_DESCRIPTION="Le module 'mod_logged' affiche les derniers utilisateurs qui se sont identifiés (connectés) dans l'espace d'administration ou du site.<br />Ce module doit être placé en position 'cpanel' avec le template par défaut de Joomla."
language/fr-FR/fr-FR.mod_privacy_dashboard.ini000060400000001135152453623440015206 0ustar00; @date        2018-09-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


MOD_PRIVACY_DASHBOARD="Tableau de bord de confidentialité"
MOD_PRIVACY_DASHBOARD_XML_DESCRIPTION="Le module Tableau de bord de confidentialité affiche des renseignements sur les demandes d'informations de confidentialité."
language/fr-FR/fr-FR.plg_actionlog_joomla.sys.ini000060400000001121152453623440015655 0ustar00; @date        2018-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_ACTIONLOG_JOOMLA="Journal des actions - Joomla"
PLG_ACTIONLOG_JOOMLA_XML_DESCRIPTION="Enregistre les actions des utilisateurs pour les extensions du noyau Joomla de façon à être vérifiées si nécessaire."
language/fr-FR/fr-FR.plg_jce_editor_chatgpt.ini000060400000013746152453623440015361 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_JCE_EDITOR_CHATGPT="ChatGPT pour JCE"
PLG_JCE_EDITOR_CHATGPT_XML_DESC="Plugin permettant d'insérer du contenu issu de l'OpenAI ChatGPT au sein de l'éditeur JCE"

PLG_JCE_EDITOR_CHATGPT_APIKEY="API Key"
PLG_JCE_EDITOR_CHATGPT_APIKEY_DESC="Votre clé API OpenAI ChatGPT vous donne un accès exclusif à l'API ChatGPT. Cette clé vous est propre et vous permet d'interagir avec le modèle ChatGPT de manière programmatique. Vous pouvez gérer et créer des clés API dans les paramètres de votre compte OpenAI en visitant la section <a href='https://platform.openai.com/account/api-keys' target='_blank'>clés API</a>."

PLG_JCE_EDITOR_CHATGPT_TOKENS="Jetons"
PLG_JCE_EDITOR_CHATGPT_TOKENS_DESC="Se réfère au nombre de jetons dans une entrée de texte ou une réponse. Les jetons sont des morceaux de texte qui peuvent représenter des caractères ou des mots individuels."

PLG_JCE_EDITOR_CHATGPT_TEMPERATURE="Température"
PLG_JCE_EDITOR_CHATGPT_TEMPERATURE_DESC="Contrôle le caractère aléatoire de la sortie du modèle. Élevé (0.8-1.0) pour des réponses diverses et créatives. Faible (0.2-0.5) pour des résultats déterministes et ciblés."

PLG_JCE_EDITOR_CHATGPT_MODEL="Modèle"
PLG_JCE_EDITOR_CHATGPT_MODEL_DESC="<ul><li><strong>GPT-4-Turbo :</strong> Version améliorée du GPT-4, ce modèle associe des fonctionnalités sophistiquées à une rapidité et une efficacité accrues. Il permet de générer des textes rentables et de haute qualité à des taux de réponse proches du temps réel. Il est idéal pour les tâches de traitement linguistique exigeantes qui requièrent à la fois rapidité et profondeur.</li><li><strong>GPT-4 :</strong> Modèle linguistique avancé et puissant, GPT-4 excelle dans la génération de textes hautement cohérents et nuancés sur le plan contextuel. Idéal pour les tâches de génération de textes complexes et créatifs, il offre des performances supérieures et une compréhension approfondie d'un large éventail de sujets. Bien qu'il offre une qualité de premier ordre, il est plus coûteux et peut avoir des temps de réponse plus lents que les modèles plus petits. Parfait pour les applications exigeant un traitement linguistique de haut niveau.</li><li><strong>gpt-3.5-turbo :</strong> Un modèle linguistique avancé qui offre un équilibre entre les capacités, le coût et la vitesse. Il offre des performances similaires à celles du modèle text-davinci-003, mais à un prix inférieur par jeton, ce qui en fait un choix rentable pour diverses tâches de génération de texte. Les temps de réponse sont généralement plus rapides que ceux de text-davinci-003.</li><li><strong>text-davinci-003 :</strong> Le modèle avancé pour une génération de texte de haute qualité, semblable à celle d'un être humain. Idéal pour un large éventail d'applications conversationnelles. Offre d'excellentes performances, mais à un coût plus élevé et avec des temps de réponse légèrement plus lents. </li><li><strong>code-davinci-002 :</strong> Modèle spécialisé pour les questions relatives à la programmation et au code. Aide aux extraits de code, au débogage et à la programmation. Il comprend et génère du code. Coût plus élevé et temps de réponse légèrement plus lent en raison des capacités de programmation spécialisées. </li><li><strong>text-curie-001 :</strong> Modèle équilibré en termes de rentabilité et de performance. Génère des réponses cohérentes et adaptées au contexte sur différents sujets. Offre un bon compromis entre la capacité et le coût. Les temps de réponse sont modérés. </li><li><strong>text-babbage-001 :</strong> Modèle économique pour l'IA conversationnelle de base. Convient aux applications les plus simples. Génération de textes décents à moindre coût. Temps de réponse plus rapide que les modèles plus complets. </li><li><strong>text-ada-001 :</strong> Modèle axé sur le respect des instructions et du contexte. Donne de bons résultats lorsque des instructions précises sont essentielles pour obtenir des réponses exactes. Offre de bonnes performances pour un coût légèrement plus élevé et des temps de réponse modérés. </li></ul>"

PLG_JCE_EDITOR_CHATGPT_TEXTPATTERN_TEXT_PREFIX="Préfixe de modèle de texte"
PLG_JCE_EDITOR_CHATGPT_TEXTPATTERN_TEXT_PREFIX_DESC="Le préfixe de modèle de texte qui déclenche une requête ChatGPT sur Entrée en utilisant le texte qui le suit. La valeur par défaut est <em>:ai</em>"

PLG_JCE_EDITOR_CHATGPT_PROMPTS="Invites personnalisées"
PLG_JCE_EDITOR_CHATGPT_PROMPTS_NAME="Nom"
PLG_JCE_EDITOR_CHATGPT_PROMPTS_PROMPT="Invite"
PLG_JCE_EDITOR_CHATGPT_PROMPTS_SELECTION="Exiger une sélection"
PLG_JCE_EDITOR_CHATGPT_PROMPTS_DESC="Créez une invite personnalisée pour la sélection dans le menu du bouton ChatGPT. Définissez un nom pour identifier l'invite et la valeur de l'invite comme requête à envoyer à ChatGPT. Si 'Exiger une sélection' est activé, une sélection de contenu sera envoyée avec la requête d'invite."

PLG_JCE_EDITOR_CHATGPT_SPELLCHECK="Vérification orthographique"
PLG_JCE_EDITOR_CHATGPT_SPELLCHECK_DESC="Activer ou désactiver la vérification de l'orthographe dans ChatGPT. Lorsque cette option est activée, ChatGPT effectue une vérification du contenu de l'éditeur lorsque l'on clique sur le bouton 'Vérification orthographique'. Cette fonction remplace la fonction de vérification orthographique par défaut."

[chatgpt]
WF_CHATGPT_TITLE="ChatGPT"
WF_CHATGPT_DESC="ChatGPT"
WF_CHATGPT_PROMPT="Rapide"
WF_CHATGPT_RESPONSE="Réponse"
WF_CHATGPT_SEND="Envoyer une requête..."
WF_CHATGPT_SHOW_DIFFERENCES="Afficher les différences"
WF_CHATGPT_ACCEPT="Accepter"
WF_CHATGPT_REJECT="Rejeter"
WF_CHATGPT_ACCEPT_ALL="Tout accepter"
WF_CHATGPT_REJECT_ALL="Tout rejeter"language/fr-FR/fr-FR.plg_fields_calendar.sys.ini000060400000001122152453623440015435 0ustar00; @date        2017-01-19
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_CALENDAR="Champs - Calendrier"
PLG_FIELDS_CALENDAR_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'calendar' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_jce_editor_aia.sys.ini000060400000000755152453623440015272 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_JCE_EDITOR_AIA="Aia de ChatGPT pour JCE"
PLG_JCE_EDITOR_AIA_XML_DESC="Plugin intégrant un assistant à l'insertion de contenu issu de l'OpenAI ChatGPT au sein de l'éditeur JCE"language/fr-FR/fr-FR.plg_quickicon_extensionupdate.ini000060400000003031152453623440017006 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_QUICKICON_EXTENSIONUPDATE="Icône raccourci - Alerte de mises à jour d'extensions"
PLG_QUICKICON_EXTENSIONUPDATE_CHECKING="Vérification des extensions..."
PLG_QUICKICON_EXTENSIONUPDATE_ERROR="Extensions inconnues..."
PLG_QUICKICON_EXTENSIONUPDATE_GROUP_DESC="Groupe de ce plug-in (comparé à celui utilisée pour le module <strong>Icônes de raccourcis</strong> affichant les icônes de raccourcis sur la page d'accueil de l'administration)."
PLG_QUICKICON_EXTENSIONUPDATE_GROUP_LABEL="Groupe"
PLG_QUICKICON_EXTENSIONUPDATE_UPDATEFOUND="Mises à jour disponibles! <span class='update-badge'>%s</span>"
PLG_QUICKICON_EXTENSIONUPDATE_UPDATEFOUND_BUTTON="Afficher les mises à jour"
PLG_QUICKICON_EXTENSIONUPDATE_UPDATEFOUND_MESSAGE="<span class='label label-important'>%s</span> Mise(s) à jour d'extension disponible(s)"
PLG_QUICKICON_EXTENSIONUPDATE_UPTODATE="Extensions à jour"
PLG_QUICKICON_EXTENSIONUPDATE_XML_DESCRIPTION="Ce plug-in permet d'afficher une icône d'alerte sur la page d'accueil de l'administration lorsque une mise à jour d'extension tierce installée est disponible. Il doit être lié par son groupe au module d'administration 'Icones de raccourcis' qui doit être publié."
language/fr-FR/fr-FR.plg_search_categories.sys.ini000060400000001014152453623440016010 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_SEARCH_CATEGORIES="Recherche - Catégories"
PLG_SEARCH_CATEGORIES_XML_DESCRIPTION="Intégration des catégories dans la recherche sur le site"language/fr-FR/fr-FR.mod_popular.ini000060400000005455152453623440013215 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


MOD_POPULAR="Articles les plus consultés"
MOD_POPULAR_CREATED="Créé"
MOD_POPULAR_FIELD_AUTHORS_DESC="Filtre pour les auteurs"
MOD_POPULAR_FIELD_AUTHORS_LABEL="Auteurs"
MOD_POPULAR_FIELD_CATEGORY_DESC="Sélectionnez les articles d'une ou plusieurs catégories."
MOD_POPULAR_FIELD_COUNT_DESC="Nombre d'éléments à afficher (défaut 5)"
MOD_POPULAR_FIELD_COUNT_LABEL="Nombre"
MOD_POPULAR_FIELD_VALUE_ADDED_OR_MODIFIED_BY_ME="Ajoutés ou modifiés par moi-même"
MOD_POPULAR_FIELD_VALUE_ANYONE="Tout le monde"
MOD_POPULAR_FIELD_VALUE_NOT_ADDED_OR_MODIFIED_BY_ME="Ni ajoutés ni modifiés par moi-même"
MOD_POPULAR_ITEMS="Éléments populaires"
MOD_POPULAR_NO_MATCHING_RESULTS="Aucun résultat"
MOD_POPULAR_TITLE="Articles populaires"
MOD_POPULAR_TITLE_1="Article le plus consulté"
MOD_POPULAR_TITLE_MORE="Les %1$s articles les plus consultés"
MOD_POPULAR_TITLE_BY_ME="Mes articles les plus consultés"
MOD_POPULAR_TITLE_BY_ME_1="Mon article le plus consulté"
MOD_POPULAR_TITLE_BY_ME_MORE="Mes %1$s articles les plus consultés"
MOD_POPULAR_TITLE_NOT_ME="Les articles d'autres auteurs que moi les plus consultés"
MOD_POPULAR_TITLE_NOT_ME_1="L'article d'un autre auteur que moi le plus consulté"
MOD_POPULAR_TITLE_NOT_ME_MORE="Les %1$s articles d'autres auteurs que moi les plus consultés"
MOD_POPULAR_TITLE_CATEGORY="Les articles les plus consultés (catégorie %2$s)"
MOD_POPULAR_TITLE_CATEGORY_1="L'article le plus consulté (catégorie %2$s)"
MOD_POPULAR_TITLE_CATEGORY_MORE="Les %1$s articles les plus consultés (catégorie %2$s)"
MOD_POPULAR_TITLE_CATEGORY_BY_ME="Mes articles les plus consultés (catégorie %2$s)"
MOD_POPULAR_TITLE_CATEGORY_BY_ME_1="Mon article le plus consulté (catégorie %2$s)"
MOD_POPULAR_TITLE_CATEGORY_BY_ME_MORE="Mes %1$s articles les plus consultés (catégorie %2$s)"
MOD_POPULAR_TITLE_CATEGORY_NOT_ME="Les articles d'autres auteurs que moi les plus consultés (catégorie %2$s)"
MOD_POPULAR_TITLE_CATEGORY_NOT_ME_1="L'article d'un autre auteur que moi le plus consulté (catégorie %2$s)"
MOD_POPULAR_TITLE_CATEGORY_NOT_ME_MORE="Les %1$s articles d'autres auteurs que moi les plus consultés (catégorie %2$s)"
MOD_POPULAR_UNEXISTING="<i>Inexistant</i>"
MOD_POPULAR_XML_DESCRIPTION="Le module 'mod_popular' affiche les titres des articles publiés les plus consultés. Ceux dont la date de publication a expiré sont également pris en compte.<br />Ce module doit être placé en position 'cpanel' avec le template par défaut de Joomla."
language/fr-FR/fr-FR.com_config.sys.ini000060400000002041152453623440013600 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_CONFIG="Configuration"
COM_CONFIG_XML_DESCRIPTION="Composant de gestion de la configuration"

COM_CONFIG_COMPONENT_VIEW_DEFAULT_DESC="Affiche les paramètres de configuration pour le composant sélectionné."
COM_CONFIG_COMPONENT_VIEW_DEFAULT_TITLE="Paramètres de configuration du composant"
COM_CONFIG_CONFIG_VIEW_DEFAULT_DESC="Afficher les options de configuration globale du site"
COM_CONFIG_CONFIG_VIEW_DEFAULT_TITLE="Paramètres de configuration du site"
COM_CONFIG_TEMPLATES_VIEW_DEFAULT_DESC="Affiche les paramètres de configuration du template si celui-ci le permet."
COM_CONFIG_TEMPLATES_VIEW_DEFAULT_TITLE="Afficher les paramètres de configuration du template"
language/fr-FR/fr-FR.com_wrapper.ini000060400000004357152453623440013212 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_WRAPPER="Fenêtre intégrée (IFrame)"
COM_WRAPPER_FIELD_ADD_DESC="Activer/Désactiver l'ajout de http:// en début d'URL.<br />Si activé et qu'une URL ne contient pas l'en-tête http:// ou https://, http:// est automatiquement ajouté."
COM_WRAPPER_FIELD_ADD_LABEL="En-tête http://"
COM_WRAPPER_FIELD_FRAME_DESC="Afficher la bordure de la fenêtre intégrée"
COM_WRAPPER_FIELD_FRAME_LABEL="Bordure de la fenêtre intégrée"
COM_WRAPPER_FIELD_HEIGHT_DESC="Hauteur de la fenêtre intégrée, en pixels"
COM_WRAPPER_FIELD_HEIGHT_LABEL="Hauteur"
COM_WRAPPER_FIELD_HEIGHTAUTO_DESC="Si la hauteur est réglée sur 'Automatique', elle sera adaptée à la taille de la page externe uniquement si celle-ci est sur le même domaine.<br />Si une erreur JavaScript est générée lors de l'affichage, désactivez ce paramètre ; cela désactivera également la compatibilité XHTML de la page."
COM_WRAPPER_FIELD_HEIGHTAUTO_LABEL="Hauteur automatique"
COM_WRAPPER_FIELD_LABEL_SCROLLBARSPARAMS="Paramètres des barres de défilement"
COM_WRAPPER_FIELD_SCROLLBARS_DESC="Afficher/Masquer les barres de défilement horizontales et verticales ou, laisser la valeur automatique pour un affichage si nécessaire.<br />Si vous choisissez 'Automatique', assurez-vous que le paramètre 'Hauteur automatique' soit activé dans les 'Paramètres avancés'."
COM_WRAPPER_FIELD_SCROLLBARS_LABEL="Barres de défilement"
COM_WRAPPER_FIELD_URL_DESC="URL du site ou du fichier que vous souhaitez afficher dans la fenêtre intégrée."
COM_WRAPPER_FIELD_URL_LABEL="Adresse URL"
COM_WRAPPER_FIELD_VALUE_AUTO="Automatique"
COM_WRAPPER_FIELD_WIDTH_DESC="Largeur de la fenêtre intégrée. Vous pouvez entrer une valeur absolue calculée en pixels ou, un chiffre relatif en ajoutant un %."
COM_WRAPPER_XML_DESCRIPTION="Affiche une fenêtre intégrée (IFrame) provenant d'un site externe ou d'une application indépendante de Joomla."
language/fr-FR/fr-FR.plg_fields_editor.ini000060400000002776152453623440014355 0ustar00; @date        2017-01-19
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_EDITOR="Champs - Editeur"
PLG_FIELDS_EDITOR_LABEL="Editeur (%s)"
PLG_FIELDS_EDITOR_PARAMS_BUTTONS_HIDE_DESC="Indiquer les boutons des plug-ins editors-xtd à cacher en les séparant par des virgules.<br />Exemple : readmore,pagebreak,module,article,contact,menu."
PLG_FIELDS_EDITOR_PARAMS_BUTTONS_HIDE_LABEL="Boutons à cacher"
PLG_FIELDS_EDITOR_PARAMS_FILTER_DESC="Permet au système de sauvegarder certaines balises html ou data brute."
PLG_FIELDS_EDITOR_PARAMS_FILTER_LABEL="Filtre"
PLG_FIELDS_EDITOR_PARAMS_HEIGHT_DESC="Définit la hauteur (en pixels) de l'éditeur WYSIWYG. La valeur par défaut est 250px."
PLG_FIELDS_EDITOR_PARAMS_HEIGHT_LABEL="Hauteur"
PLG_FIELDS_EDITOR_PARAMS_SHOW_BUTTONS_DESC="Afficher ou non les boutons des plug-ins editors-xtd "
PLG_FIELDS_EDITOR_PARAMS_SHOW_BUTTONS_LABEL="Afficher les boutons"
PLG_FIELDS_EDITOR_PARAMS_WIDTH_DESC="Définit la largeur (en pixels) de l'éditeur WYSIWYG. La valeur par défaut est 100%."
PLG_FIELDS_EDITOR_PARAMS_WIDTH_LABEL="Largeur"
PLG_FIELDS_EDITOR_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'editor' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.com_mailto.sys.ini000060400000000734152453623440013627 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

COM_MAILTO="Gestion des mails"
COM_MAILTO_XML_DESCRIPTION="Composant générique d'envoi de mails"language/fr-FR/fr-FR.plg_content_fields.ini000060400000001643152453623440014531 0ustar00; @date        2017-02-05
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_CONTENT_FIELDS="Contenu - Champs"
PLG_CONTENT_FIELDS_XML_DESCRIPTION="Ce plug-in permet l'affichage d'un champ personnalisé inséré par le 'Bouton - Champs' ou en utilisant directement la syntaxe {field #} dans la zone de texte de l'éditeur.<br><strong>Syntaxe possible :</strong><br><ul><li><code>{field 1}</code> affichera le champ avec l'ID 1</li><li><code>{field 1,foo}</code> affichera le champ avec  le type de mise en page 'foo'.</li><li><code>{fieldgroup 2}</code> affichera tous les champs dont le groupe de champs a l'ID 2.</li></ul>"
language/fr-FR/fr-FR.plg_fields_url.sys.ini000060400000001074152453623440014474 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_URL="Champs - URL"
PLG_FIELDS_URL_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'url' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_extension_jce.ini000060400000000621152453623440014361 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_EXTENSION_JCE="Extension - JCE"
PLG_EXTENSION_JCE_XML_DESCRIPTION="Plugin Extension JCE"
language/fr-FR/fr-FR.mod_submenu.sys.ini000060400000001120152453623440014007 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

MOD_SUBMENU="Sous-menu des fonctions et extensions"
MOD_SUBMENU_XML_DESCRIPTION="Le module 'mod_submenu' affiche les sous-menus des fonctions et extensions dans leur interface."
MOD_SUBMENU_LAYOUT_DEFAULT="Défaut"language/fr-FR/fr-FR.plg_editors_codemirror.ini000060400000013144152453623440015426 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_CODEMIRROR_FIELD_ACTIVELINE_COLOR_DESC="La couleur utilisée pour mettre en évidence la ligne active. L'opacité affichée est de 50%."
PLG_CODEMIRROR_FIELD_ACTIVELINE_COLOR_LABEL="Couleur de la ligne active"
PLG_CODEMIRROR_FIELD_ACTIVELINE_DESC="Mise en évidence de la ligne sur laquelle se trouve le curseur"
PLG_CODEMIRROR_FIELD_ACTIVELINE_LABEL="Mise en évidence de la ligne active"
PLG_CODEMIRROR_FIELD_AUTOCLOSEBRACKET_DESC="Fermeture d'accolade automatique"
PLG_CODEMIRROR_FIELD_AUTOCLOSEBRACKET_LABEL="Fermeture d'accolade"
PLG_CODEMIRROR_FIELD_AUTOCLOSETAGS_DESC="Fermeture de tag automatique"
PLG_CODEMIRROR_FIELD_AUTOCLOSETAGS_LABEL="Fermeture de tag"
; The following two strings are deprecated and will be removed in J4
PLG_CODEMIRROR_FIELD_AUTOFOCUS_DESC="Auto Focus"
PLG_CODEMIRROR_FIELD_AUTOFOCUS_LABEL="Auto Focus"
PLG_CODEMIRROR_FIELD_CODEFOLDING_DESC="Permet le repli des blocs de code"
PLG_CODEMIRROR_FIELD_CODEFOLDING_LABEL="Repli du code"
PLG_CODEMIRROR_FIELD_FONT_FAMILY_DESC="Police à utiliser dans l'éditeur. Si celle-ci n'est pas installée, elle sera chargée depuis https://www.google.com/fonts/."
PLG_CODEMIRROR_FIELD_FONT_FAMILY_LABEL="Police"
PLG_CODEMIRROR_FIELD_FONT_SIZE_DESC="Taille de la police dans l'éditeur"
PLG_CODEMIRROR_FIELD_FONT_SIZE_LABEL="Taille de la police (px)"
PLG_CODEMIRROR_FIELD_FULLSCREEN_DESC="Sélectionner la touche de fonction à utiliser pour passer en mode plein écran."
PLG_CODEMIRROR_FIELD_FULLSCREEN_LABEL="Mode plein écran"
PLG_CODEMIRROR_FIELD_FULLSCREEN_MOD_DESC="Sélectionnez les touches de modification à utiliser avec la touche de bascule plein écran. "
PLG_CODEMIRROR_FIELD_FULLSCREEN_MOD_LABEL="Touche de modification"
PLG_CODEMIRROR_FIELD_HIGHLIGHT_MATCH_COLOR_DESC="La couleur de fond à utiliser pour mettre en évidence les balises correspondantes . L'opacité affichée est de 50%."
PLG_CODEMIRROR_FIELD_HIGHLIGHT_MATCH_COLOR_LABEL="Couleur des balises correspondantes"
PLG_CODEMIRROR_FIELD_KEYMAP_DESC="Faire fonctionner CodeMirror comme d'autres éditeurs populaires."
PLG_CODEMIRROR_FIELD_KEYMAP_EMACS="Emacs"
PLG_CODEMIRROR_FIELD_KEYMAP_LABEL="Key Map"
PLG_CODEMIRROR_FIELD_KEYMAP_SUBLIME="Sublime Text"
PLG_CODEMIRROR_FIELD_KEYMAP_VIM="Vim"
PLG_CODEMIRROR_FIELD_LINE_HEIGHT_DESC="La hauteur d'une ligne de texte. Cette valeur est en 'em', c.a.d. que 1.0 correspond à la taille de la police et 2.0 à deux fois cette taille."
PLG_CODEMIRROR_FIELD_LINE_HEIGHT_LABEL="Hauteur de ligne (em)"
PLG_CODEMIRROR_FIELD_LINENUMBERS_DESC="Activer/Désactiver la numérotation des lignes"
PLG_CODEMIRROR_FIELD_LINENUMBERS_LABEL="Numérotation des lignes"
PLG_CODEMIRROR_FIELD_LINEWRAPPING_DESC="Activer/désactiver le retour à la ligne"
PLG_CODEMIRROR_FIELD_LINEWRAPPING_LABEL="Retour à la ligne"
PLG_CODEMIRROR_FIELD_MARKERGUTTER_DESC="Marqueur et pliage de code"
PLG_CODEMIRROR_FIELD_MARKERGUTTER_LABEL="Gouttières"
PLG_CODEMIRROR_FIELD_MATCHBRACKETS_DESC="Surligner les accolades assorties"
PLG_CODEMIRROR_FIELD_MATCHBRACKETS_LABEL="Accolades assorties"
PLG_CODEMIRROR_FIELD_MATCHTAGS_DESC="Surligner les tags assortis"
PLG_CODEMIRROR_FIELD_MATCHTAGS_LABEL="Tags assortis"
PLG_CODEMIRROR_FIELD_PREVIEW_DESC="Un exemple de ce à quoi ressembleront les champs de votre éditeur CodeMirror avec les paramètres actuels (enregistrer pour mettre à jour)."
PLG_CODEMIRROR_FIELD_PREVIEW_LABEL="Prévisualisation"
PLG_CODEMIRROR_FIELD_SELECTIONMATCHES_DESC="Mettre en évidence le terme sélectionné dans l'ensemble du document."
PLG_CODEMIRROR_FIELD_SELECTIONMATCHES_LABEL="Surbrillance de la sélection"
PLG_CODEMIRROR_FIELD_THEME_DESC="Sélectionner un thème de couleurs pour l'éditeur"
PLG_CODEMIRROR_FIELD_THEME_LABEL="Thème"
PLG_CODEMIRROR_FIELD_VALUE_FONT_FAMILY_DEFAULT="Navigateur par défaut"
PLG_CODEMIRROR_FIELD_VALUE_FULLSCREEN_MOD_ALT="Alt"
PLG_CODEMIRROR_FIELD_VALUE_FULLSCREEN_MOD_CMD="Commande"
PLG_CODEMIRROR_FIELD_VALUE_FULLSCREEN_MOD_CTRL="Contrôle"
PLG_CODEMIRROR_FIELD_VALUE_FULLSCREEN_MOD_SHIFT="Majuscule"
PLG_CODEMIRROR_FIELD_VALUE_SCROLLBARSTYLE_DEFAULT="Défaut"
PLG_CODEMIRROR_FIELD_VALUE_SCROLLBARSTYLE_DESC="Sélectionner le style de barre de défilement."
PLG_CODEMIRROR_FIELD_VALUE_SCROLLBARSTYLE_LABEL="Barre de défilement"
PLG_CODEMIRROR_FIELD_VALUE_SCROLLBARSTYLE_OVERLAY="Transparence"
PLG_CODEMIRROR_FIELD_VALUE_SCROLLBARSTYLE_SIMPLE="Simple"
PLG_CODEMIRROR_FIELD_VALUE_THEME_DARK="Foncé"
PLG_CODEMIRROR_FIELD_VALUE_THEME_LIGHT="Clair"
PLG_CODEMIRROR_FIELD_VIM_KEYBINDING_DESC="Sélectionner cette option pour que CodeMirror utilise le mode Vim."
PLG_CODEMIRROR_FIELD_VIM_KEYBINDING_LABEL="Mode Vim"
PLG_CODEMIRROR_FIELDSET_APPEARANCE_OPTIONS_LABEL="Options d'affichage"
PLG_CODEMIRROR_FIELDSET_TOOLBAR_OPTIONS_LABEL="Paramètres de la barre d'outils"
PLG_CODEMIRROR_TOGGLE_FULL_SCREEN="Appuyer sur %1$s %2$s pour activer/désactiver le mode d'édition plein écran. "
PLG_CODEMIRROR_XML_DESCRIPTION="Intégration d'un champ de saisie de texte standard (sans mode WYSIWYG), avec prise en charge de la coloration syntaxique du code et, si activé, de la numérotation des lignes et de l'indentation.<br /><br />Pour être utilisé, CodeMirror doit être déclaré comme 'Éditeur par défaut' dans la configuration globale de Joomla! ou attribué au profil utilisateur souhaité."
PLG_EDITORS_CODEMIRROR="Éditeur - CodeMirror"
language/fr-FR/fr-FR.plg_jce_filesystem-s3.ini000060400000005006152453623440015056 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8
PLG_JCE_FILESYSTEM_S3="Fichiers d'Amazon S3 pour JCE"
PLG_JCE_FILESYSTEM_S3_XML_DESC="Plugin permettant d'utiliser le système de fichiers Amazon S3 dans l'éditeur JCE. <em>Amazon S3 est une marque commerciale d'Amazon.com, Inc. ou de ses filiales</em>."

PLG_JCE_FILESYSTEM_S3_ACCESSKEY="Clé d'accès"
PLG_JCE_FILESYSTEM_S3_SECRETKEY="Clé secrète"
PLG_JCE_FILESYSTEM_S3_BUCKET="Nom Bucket"
PLG_JCE_FILESYSTEM_S3_CNAME="CName"
PLG_JCE_FILESYSTEM_S3_TIMEOUT="Délai d'attente"

PLG_JCE_FILESYSTEM_S3_ACCESSKEY_DESC="ID de Clé d'accès S3"
PLG_JCE_FILESYSTEM_S3_SECRETKEY_DESC ="Clé d'accès secrète S3"
PLG_JCE_FILESYSTEM_S3_BUCKET_DESC="Nom Bucket S3"
PLG_JCE_FILESYSTEM_S3_CNAME_DESC="Bucket CNAME (enregistrement du nom canonique)"
PLG_JCE_FILESYSTEM_S3_TIMEOUT_DESC="Délai d'authentification"
PLG_JCE_FILESYSTEM_S3_ENDPOINT="Point de terminaison"
PLG_JCE_FILESYSTEM_S3_ENDPOINT_DESC="Définir le point de terminaison, par exemple: s3-eu-west-1"
PLG_JCE_FILESYSTEM_S3_ACL="Niveau d'accès"
PLG_JCE_FILESYSTEM_S3_ACL_DESC="Sélectionnez le niveau d'accès à appliquer par défaut lors de la création de dossiers et du téléchargement de fichiers."
PLG_JCE_FILESYSTEM_S3_SSL="SSL activé"
PLG_JCE_FILESYSTEM_S3_SSL_DESC="Effectuer les opérations S3 à l'aide d'une connexion SSL."
PLG_JCE_FILESYSTEM_S3_ACL_PRIVATE="Privé"
PLG_JCE_FILESYSTEM_S3_ACL_PUBLIC_READ="Lecture publique"
PLG_JCE_FILESYSTEM_S3_ACL_PUBLIC_READ_WRITE="Lecture / écriture publique"
PLG_JCE_FILESYSTEM_S3_ACL_AUTHENTICATED_READ="Lecture authentifiée"

PLG_JCE_FILESYSTEM_S3_CREDENTIALS_PATH="Chemin du justificatif"
PLG_JCE_FILESYSTEM_S3_CREDENTIALS_PATH_DESC="Chemin d'accès au dossier contenant le fichier .aws/credentials ou .s3/credentials."

PLG_JCE_FILESYSTEM_S3_CREDENTIALS_PROFILE="Profil d'identification"
PLG_JCE_FILESYSTEM_S3_CREDENTIALS_PROFILE_DESC="Nom du profil d'informations d'identification à utiliser si les informations d'identification S3 sont stockées dans un fichier .aws ou .s3."

PLG_JCE_FILESYSTEM_S3_ENDPOINT_CUSTOM="Point de terminaison personnalisé"
PLG_JCE_FILESYSTEM_S3_ENDPOINT_CUSTOM_DESC="Définissez un point de terminaison personnalisé pour le service de stockage d'objets compatible S3, par exemple : s3-eu-west-1.amazonaws.com"language/fr-FR/fr-FR.plg_fields_integer.sys.ini000060400000001122152453623440015321 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_INTEGER="Champs - Nombre entier"
PLG_FIELDS_INTEGER_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'integer' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_jce_filesystem-s3.sys.ini000060400000001066152453623440015675 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_JCE_FILESYSTEM_S3="Fichiers d'Amazon S3 pour JCE"
PLG_JCE_FILESYSTEM_S3_XML_DESC="Plugin permettant d'utiliser le système de fichiers Amazon S3 dans l'éditeur JCE. <em>Amazon S3 est une marque commerciale d'Amazon.com, Inc. ou de ses filiales</em>."language/fr-FR/fr-FR.com_content.sys.ini000060400000005703152453623440014015 0ustar00; @date        2015-01-30
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_CONTENT="Articles"
COM_CONTENT_ARCHIVE_VIEW_DEFAULT_DESC="Affiche tous les articles archivés"
COM_CONTENT_ARCHIVE_VIEW_DEFAULT_OPTION="Défaut"
COM_CONTENT_ARCHIVE_VIEW_DEFAULT_TITLE="Articles archivés"
COM_CONTENT_ARTICLES="Articles"
COM_CONTENT_ARTICLES_VIEW_DEFAULT_DESC="Affiche une liste de tous les articles."
COM_CONTENT_ARTICLES_VIEW_DEFAULT_TITLE="Liste de tous les articles"
COM_CONTENT_ARTICLE_MANAGER="Gestion des articles"
COM_CONTENT_ARTICLE_VIEW_DEFAULT_DESC="Affiche un article unique"
COM_CONTENT_ARTICLE_VIEW_DEFAULT_OPTION="Défaut"
COM_CONTENT_ARTICLE_VIEW_DEFAULT_TITLE="Article"
COM_CONTENT_ARTICLE_VIEW_EDIT_DESC="Affiche un formulaire de création d'article"
COM_CONTENT_ARTICLE_VIEW_EDIT_TITLE="Créer un article"
COM_CONTENT_CATEGORIES="Catégories"
COM_CONTENT_CATEGORIES_VIEW_DEFAULT_DESC="Affiche une liste de toutes les catégories d'une catégorie parente"
COM_CONTENT_CATEGORIES_VIEW_DEFAULT_OPTION="Défaut"
COM_CONTENT_CATEGORIES_VIEW_DEFAULT_TITLE="Liste de toutes les catégories"
COM_CONTENT_CATEGORY_ADD_TITLE="Catégories : Ajouter une catégorie"
COM_CONTENT_CATEGORY_EDIT_TITLE="Catégories : Modifier une catégorie"
COM_CONTENT_CATEGORY_VIEW_BLOG_DESC="Affiche l'introduction ou les articles complets d'une catégorie en une ou plusieurs colonnes"
COM_CONTENT_CATEGORY_VIEW_BLOG_OPTION="Blog"
COM_CONTENT_CATEGORY_VIEW_BLOG_TITLE="Blog d'une catégorie"
COM_CONTENT_CATEGORY_VIEW_DEFAULT_DESC="Affiche la liste des articles d'une catégorie"
COM_CONTENT_CATEGORY_VIEW_DEFAULT_OPTION="Liste"
COM_CONTENT_CATEGORY_VIEW_DEFAULT_TITLE="Liste des articles d'une catégorie"
COM_CONTENT_CATEGORY_VIEW_FEATURED_DESC="Affiche une liste de tous les articles en vedette d'une ou de plusieurs catégories en une ou plusieurs colonnes."
COM_CONTENT_CATEGORY_VIEW_FEATURED_OPTION="Défaut"
COM_CONTENT_CATEGORY_VIEW_FEATURED_TITLE="Articles en vedette d'une catégorie"
COM_CONTENT_CONTENT_TYPE_ARTICLE="Article"
COM_CONTENT_CONTENT_TYPE_CATEGORY="Catégorie d'articles"
COM_CONTENT_FEATURED="En vedette"
COM_CONTENT_FEATURED_VIEW_DEFAULT_DESC="Affiche l'introduction ou les articles complets mis en vedette en une ou plusieurs colonnes"
COM_CONTENT_FEATURED_VIEW_DEFAULT_OPTION="Défaut"
COM_CONTENT_FEATURED_VIEW_DEFAULT_TITLE="Blog des articles en vedette"
COM_CONTENT_FORM_VIEW_DEFAULT_DESC="Affiche un formulaire pour soumettre un article"
COM_CONTENT_FORM_VIEW_DEFAULT_OPTION="Créer"
COM_CONTENT_FORM_VIEW_DEFAULT_TITLE="Créer un article"
COM_CONTENT_TAGS_ARTICLE="Article"
COM_CONTENT_TAGS_CATEGORY="Catégorie d'articles"
COM_CONTENT_XML_DESCRIPTION="Composant de gestion des articles"
language/fr-FR/fr-FR.plg_editors-xtd_weblink.ini000060400000001176152453623440015513 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_EDITORS-XTD_WEBLINK="Bouton - Liens web"
PLG_EDITORS-XTD_WEBLINK_BUTTON_WEBLINK="Liens web"
PLG_EDITORS-XTD_WEBLINK_XML_DESCRIPTION="Affiche un bouton avec l'éditeur permettant d'insérer des liens web dans un article provenant du composant 'Liens web'."
language/fr-FR/fr-FR.plg_finder_categories.ini000060400000001046152453623440015202 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_FINDER_CATEGORIES="Indexation - Catégories"
PLG_FINDER_CATEGORIES_XML_DESCRIPTION="Ce plug-in permet l'indexation des catégories Joomla dans la recherche avancée."

language/fr-FR/fr-FR.plg_editors-xtd_weblink.sys.ini000060400000001113152453623440016317 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_EDITORS-XTD_WEBLINK="Bouton - Liens web"
PLG_EDITORS-XTD_WEBLINK_XML_DESCRIPTION="Affiche un bouton avec l'éditeur permettant d'insérer des liens web dans un article provenant du composant 'Liens web'."
language/fr-FR/fr-FR.plg_privacy_actionlogs.sys.ini000060400000001153152453623440016241 0ustar00; @date        2018-09-02
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_PRIVACY_ACTIONLOGS="Confidentialité - Journaux des actions"
PLG_PRIVACY_ACTIONLOGS_XML_DESCRIPTION="Responsable de l'exportation des données du journal des actions pour la demande d'informations de confidentialité d'un utilisateur."
language/fr-FR/fr-FR.mod_version.sys.ini000060400000001047152453623440014026 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

MOD_VERSION="Information de version Joomla!"
MOD_VERSION_LAYOUT_DEFAULT="Défaut"
MOD_VERSION_XML_DESCRIPTION="Ce module affiche des informations sur la version de Joomla!"
language/fr-FR/fr-FR.mod_status.sys.ini000060400000001321152453623440013657 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


MOD_STATUS="Barre de statuts"
MOD_STATUS_XML_DESCRIPTION="Le module 'mod_status' affiche une barre avec, selon les paramètres choisis, les utilisateurs connectés dans l'espace d'administration et/ou du site, les messages de la boîte de messagerie interne de Joomla, un raccourci pour afficher le site."
MOD_STATUS_LAYOUT_DEFAULT="Défaut"
language/fr-FR/fr-FR.com_ajax.sys.ini000060400000000740152453623440013262 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8 - No BOM


COM_AJAX="Interface Ajax"
COM_AJAX_XML_DESCRIPTION="Interface Ajax extensible pour Joomla!"
language/fr-FR/fr-FR.plg_system_logout.sys.ini000060400000001157152453623440015263 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SYSTEM_LOGOUT_XML_DESCRIPTION="Plug-in système de déconnexion redirigeant vers la page d'accueil après déconnexion de l'espace connecté si l'utilisateur n'a pas accès à la page affichée."
PLG_SYSTEM_LOGOUT="Système - Déconnexion"
language/fr-FR/fr-FR.plg_content_sudesign_audio.ini000060400000001124152453623440016257 0ustar00PLG_CONTENT_SUDESIGN_AUDIO="SUDesign : Simple Audio Shortcode"
SD_INCLUDE_MEDIAELEMENT="Inclure MediaElement.js"
SD_INCLUDE_MEDIAELEMENT_DESC="Inclure ou non la librairie JS/CSS MediaElement, si un module ou si votre thème l'utilise déjà, sélectionnez 'non'"
SD_OUI="Oui"
SD_NON="Non"
SD_INCLUDE_JQUERY="Inclure jQuery"
SD_INCLUDE_JQUERY_DESC="jQuery est très probablement déjà inclus dans votre installation, si le plugin ne fonctionne pas correctement, essayez d'activer cette option"
SD_DEFAULT_WIDTH="Largeur par défaut"
SD_DEFAULT_WIDTH_DESC="Largeur par défaut du player, en pixel"language/fr-FR/fr-FR.plg_content_confirmconsent.ini000060400000002434152453623440016311 0ustar00; @date        2018-09-18
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_CONTENT_CONFIRMCONSENT="Contenu - Confirmation de consentement"
PLG_CONTENT_CONFIRMCONSENT_CONSENTBOX_LABEL="Note de confidentialité"
PLG_CONTENT_CONFIRMCONSENT_FIELD_ARTICLE_DESC="Sélectionner l'article dans la liste ou en créer un."
PLG_CONTENT_CONFIRMCONSENT_FIELD_ARTICLE_LABEL="Article de la politique de confidentialité"
PLG_CONTENT_CONFIRMCONSENT_FIELD_NOTE_DEFAULT="En soumettant ce formulaire, vous acceptez la politique de confidentialité de ce site Web et le stockage des informations soumises."
PLG_CONTENT_CONFIRMCONSENT_FIELD_NOTE_DESC="Un résumé de la politique de confidentialité du site. Si laissé vide, le message par défaut sera utilisé."
PLG_CONTENT_CONFIRMCONSENT_FIELD_NOTE_LABEL="Courte politique de confidentialité"
PLG_CONTENT_CONFIRMCONSENT_XML_DESCRIPTION="Ce plugin ajoute une case à cocher de consentement obligatoire à un formulaire, par exemple le composant de contact du noyau."
language/fr-FR/fr-FR.plg_jce_popups-rokbox.sys.ini000060400000001301152453623440016006 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_JCE_POPUPS_ROKBOX="Popup RokBox de RocketTheme pour JCE"
PLG_JCE_POPUPS_ROKBOX_XML_DESC="Plugin permettant la prise en charge des Popup RokBox de RocketTheme avec JCE. Nécessite l'installation et l'activation de RokBox. - <a href='http://www.rockettheme.com/extensions-joomla/rokbox' title='Obtenir RocketTheme de RokBox' target='_blank'><strong>Obtenir RocketTheme de RokBox</strong></a>"language/fr-FR/fr-FR.plg_authentication_cookie.sys.ini000060400000001356152453623440016717 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_AUTH_COOKIE_XML_DESCRIPTION="Gère l'authentification Joomla des utilisateurs par cookie<br /><strong> Attention! Vous devez activer au moins un autre plug-in d'authentification.</strong><br />Vous aurez aussi besoin d'un plug-in tel que 'Système - Se souvenir de moi' pour implémenter la connexion par cookie."
PLG_AUTHENTICATION_COOKIE="Authentification - Cookie"
language/fr-FR/fr-FR.com_cpanel.ini000060400000025446152453623440012776 0ustar00; @date        2015-01-30
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_CPANEL="Panneau d'administration"
COM_CPANEL_HEADER_SUBMENU="Sous-menu"
COM_CPANEL_HEADER_SYSTEM="Système"
COM_CPANEL_LINK_CHECKIN="Vérification globale"
COM_CPANEL_LINK_CLEAR_CACHE="Purge du cache"
COM_CPANEL_LINK_DASHBOARD="Panneau d'administration"
COM_CPANEL_LINK_EXTENSIONS="Installation d'extension"
COM_CPANEL_LINK_GLOBAL_CONFIG="Configuration globale"
COM_CPANEL_LINK_SYSINFO="Informations système"
COM_CPANEL_MESSAGES_BODY_NOCLOSE="Des messages de post-installation importants requièrent votre attention. "
COM_CPANEL_MESSAGES_BODYMORE_NOCLOSE="Cet espace d'information n'apparaît pas lorsque vous avez caché tous les messages."
COM_CPANEL_MESSAGES_REVIEW="Consulter les messages"
COM_CPANEL_MESSAGES_TITLE="Des messages de post-installation sont disponibles"
; Don't touch the code part in the following message
COM_CPANEL_MSG_ADDNOSNIFF_BODY="<p>Joomla est dorénavant livré avec des durcissement de sécurité supplémentaires par défaut dans les fichiers htaccess.txt et web.config.txt. Ces durcissements désactivent la fonctionnalité de détection de type MIME dans les navigateurs Web. Le sniffing mène à des vecteurs d’attaque spécifiques, dans lesquels des scripts dans des formats de fichier normalement inoffensifs (images, par exemple) sont exécutés, ce qui conduit à des vulnérabilités de type Cross-Site-Scripting.</p><p>L'équipe de sécurité recommande d’appliquer manuellement les modifications nécessaires aux fichiers .htaccess ou web.config existants, car ces fichiers ne peuvent pas être mis à jour automatiquement.</p><p><strong>Modifications pour .htaccess</strong><br />Ajouter les lignes suivantes avant \"## Mod_rewrite in use.\":</p><pre>&lt;IfModule mod_headers.c&gt;\nHeader always set X-Content-Type-Options \"nosniff\"\n&lt;/IfModule&gt;</pre><p><strong>Modifications pour web.config</strong><br />Ajouter les lignes suivantes après \"&lt;/rewrite&gt;\":</p><pre>&lt;httpProtocol&gt;\n  &lt;customHeaders&gt;\n    &lt;add name=\"X-Content-Type-Options\" value=\"nosniff\" /&gt;\n  &lt;/customHeaders&gt\n&lt;/httpProtocol&gt;</pre>"
COM_CPANEL_MSG_ADDNOSNIFF_TITLE="Mise à jour de sécurité pour .htaccess & web.config"
COM_CPANEL_MSG_EACCELERATOR_BODY="eAccelerator n'est pas compatible avec Joomla!. En cliquant sur le bouton 'Modifier à fichier' ci-dessous, nous allons changer le gestionnaire de cache à 'Fichier'. Si vous souhaitez utiliser un gestionnaire de cache différent, merci de changer le paramètre dans la page de configuration."
COM_CPANEL_MSG_EACCELERATOR_BUTTON="Modifier à fichier"
COM_CPANEL_MSG_EACCELERATOR_TITLE="eAccelerator n'est pas compatible avec Joomla!"
COM_CPANEL_MSG_HTACCESS_BODY="Un changement est intervenu dans les fichiers .htaccess et web.config dans joomla 3.4.0 pour empêcher  par défaut l'accès aux listes des répertoires. Il est recommandé aux utilisateurs de mettre en œuvre ce changement dans leurs fichiers. Voir <a href=\"https://docs.joomla.org/Special:MyLanguage/Preconfigured_htaccess\">cette page</a> pour plus d'informations."
COM_CPANEL_MSG_HTACCESS_TITLE="Mise à jour .htaccess & web.config"
COM_CPANEL_MSG_HTACCESSSVG_TITLE="Protection XSS supplémentaire pour l'utilisation des fichiers SVG"
COM_CPANEL_MSG_HTACCESSSVG_BODY="<p>Depuis la version 3.9.21, Joomla est livré avec une règle de sécurité supplémentaire dans le fichier htaccess.txt par défaut. Cette règle protégera les utilisateurs de fichiers svg des vulnérabilités potentielles de Cross-Site-Scripting (XSS).<br>L'équipe de sécurité recommande d'appliquer manuellement les modifications nécessaires à tout fichier .htaccess existant, car ce fichier ne peut pas être mis à jour automatiquement.</p><p><strong>Modifications de .htaccess</strong></p><pre>&lt;FilesMatch \"\.svg$\"&gt;\n  &lt;IfModule mod_headers.c&gt;\n    Header always set Content-Security-Policy \"script-src 'none'\"\n  &lt;/IfModule&gt;\n&lt;/FilesMatch&gt;</pre><p>Nous ne connaissons pas de méthode actuellement pour configurer conditionnellement cette modification sur les serveurs Web IIS. Veuillez contacter votre fournisseur d'hébergement pour obtenir de l'aide.</p>"
COM_CPANEL_MSG_JOOMLA40_PRE_CHECKS_TITLE="Se préparer à la prochaine version majeure de Joomla"
COM_CPANEL_MSG_JOOMLA40_PRE_CHECKS_BODY="<p>À partir de Joomla! 4.0 nous augmentons les exigences minimales de serveur. Si ce message s'affiche, votre configuration actuelle ne répond pas à ces nouvelles exigences.</p><p>Les exigences <a href=\"https://developer.joomla.org/news/788-joomla-4-on-the-move.html\"><strong>minimum</strong></a> sont les suivantes&nbsp;: </p><ul><li>PHP 7.2.5</li><li>MySQL 5.6</li><li>MariaDB 10.1</li><li>PostgreSQL 11.0</li><li>MS SQL ne sera <strong>pas</strong> pris en charge.</li><li> MySQL utilisant l'ancienne extension PHP `ext/mysql` ne sera <strong>pas</strong> supporté, les drivers MySQLi ou \"MySQL (PDO)\" doivent être utilisés à la place </ li><li>PostgreSQL utilisant l'extension PHP `ext/pgsql` ne sera <strong>pas</strong>supporté, le driver \"PostgreSQL (PDO)\" doit être utilisé à la place</li></ul><p>Veuillez contacter votre hébergeur pour savoir comment vous pouvez répondre à ces nouvelles exigences — il s'agit généralement d'un changement très simple. Quand celles-ci seront satisfaites, ce message ne sera plus affiché.</p>"
COM_CPANEL_MSG_LANGUAGEACCESS340_TITLE="Il se peut que vous ayez des problèmes avec vos paramètres multilingues"
COM_CPANEL_MSG_LANGUAGEACCESS340_BODY="Depuis Joomla 3.4.0, il se peut que vous ayez des problèmes sur votre site avec le plug-in Système Filtre de langue. Pour les résoudre, merci d'ouvrir le <a href=\"index.php?option=com_languages&view=languages\">Gestionnaire de langues</a> et sauvegarder chaque langue de contenu pour s'assurer qu'un niveau d'accès est sauvegardé dans la base de données."
; The following two strings are deprecated and will be removed with 4.0
COM_CPANEL_MSG_PHPVERSION_BODY="A partir de Joomla! 3.3, la version de PHP utilisée par votre site ne sera plus prise en charge. Joomla! 3.3 exigera au moins <a href=\"https://community.joomla.org/blogs/leadership/1798-raising-the-bar-on-security.html\">la version 5.3.10 de PHP pour améliorer les fonctionnalités de sécurité des utilisateurs</a>."
COM_CPANEL_MSG_PHPVERSION_TITLE="Votre version de PHP ne sera plus prise en charge par Joomla! 3.3"
COM_CPANEL_MSG_ROBOTS_TITLE="Mise à jour robots.txt"
COM_CPANEL_MSG_ROBOTS_BODY="Un changement est intervenu dans le fichier robots.txt dans Joomla 3.3 pour permettre à Google d'accéder par défaut aux templates et fichiers médias. Ce changement n'est pas appliqué automatiquement lors d'une mise à jour. Il est recommandé aux utilisateurs de vérifier les changements intervenus dans le fichier robots.txt.dist et de mettre en œuvre ceux-ci dans leurs fichiers robots.txt. "
COM_CPANEL_MSG_STATS_COLLECTION_BODY="<p>Depuis Joomla! 3.5 un plug-in de statistiques enverra des données anonymes au projet Joomla. Cela ne fera qu'indiquer la version de Joomla, de PHP, le moteur de base de données et sa version ainsi que le système d'exploitation du serveur. </p><p>Ces données sont collectées pour assurer que les futures versions de Joomla peuvent profiter des dernières versions de bases de données et de PHP disponibles sans affecter un nombre important d'utilisateurs. Sa nécessité s'est avérée quand il fallut au minimum PHP 5.3.10 lorsque Joomla! 3.3 a mis en œuvre des mots de passe plus sécurisés du type Bcrypt. </p><p>Dans l'intérêt d'une transparence totale et pour aider les développeurs <a href=\"https://developer.joomla.org/about/stats.html\"> ces données sont publiquement disponibles</a>. Une API graphique affichera la version de Joomla, les versions de PHP et des moteurs de base de données en cours d'utilisation. </p><p>Si vous ne souhaitez pas fournir ces informations au projet Joomla, vous pouvez désactiver le plug-in appelé Système - Statistiques Joomla.</p>"
COM_CPANEL_MSG_STATS_COLLECTION_TITLE="Statistiques collectées dans Joomla"
COM_CPANEL_MSG_TEXTFILTER3919_BODY="<p> Dans le cadre de l'examen de notre équipe de sécurité, nous avons apporté quelques modifications aux paramètres par défaut des filtres de texte globaux dans une nouvelle installation de Joomla. Le paramètre par défaut pour les groupes «Public», «Invité» et «Enregistré» est désormais «Aucun HTML». Étant donné que ces modifications ne s'appliquent qu'aux nouvelles installations, nous vous recommandons vivement de les examiner et de mettre à jour votre site à partir de: Système -> Configuration globale -> Filtres de texte</p"
COM_CPANEL_MSG_TEXTFILTER3919_TITLE="Mise à jour des recommandations de filtre de texte"
COM_CPANEL_MSG_UPDATEDEFAULTSETTINGS_BODY="<p>Dans le cadre d'un passage en revue de notre équipe de sécurité, nous avons apporté quelques modifications aux paramètres par défaut dans une nouvelle installation de Joomla. Comme ces modifications ne sont appliquées qu'aux nouvelles installations, nous vous recommandons fortement de revoir ces changements et de mettre à jour votre site.</p><p>Les paramètres modifiés sont &nbsp;:</p><ul><li>Configuration globale > Filtres de texte&nbsp;: le groupe d'utilisateurs \"Administrateur\" par défaut passe de \"Aucun filtre\" à \"Liste noire par défaut\"</li><li>Utilisateurs > Inclure mot de passe&nbsp;: l'option d'envoyer un mot de passe en clair à l'utilisateur lors de la création d'un compte est dorénavant désactivée par défaut</li><li>Gestionnaire de médias&nbsp;: le transfert des fichiers Flash (extension \"swf\" et \"application/x-shockwave-flash\" type MIME) n'est plus autorisé</li><li>Articles > Afficher l'e-mail&nbsp;: l'option permettant d'afficher un lien d'e-mail avec des articles est désactivée par défaut</li></ul><p>Nous avons créé une <a href=\"https://docs.joomla.org/Special:MyLanguage/J3.x:Joomla_3.8.8_notes_about_the_changed_default_settings\">page de documentation dédiée</a> expliquant ces changements.</p>"
COM_CPANEL_MSG_UPDATEDEFAULTSETTINGS_TITLE="Recommandations de sécurité lors de la mise à jour du site"
COM_CPANEL_WELCOME_BEGINNERS_MESSAGE="<p>Des resources communautaires sont accessibles pour les nouveaux utilisateurs.</p><ul><li><a href=\"https://docs.joomla.org/Special:MyLanguage/Portal:Beginners\">Joomla! Beginners Guide</a></li><li><a href=\"https://forum.joomla.org/viewforum.php?f=706\">New to Joomla! Forum</a></li></ul>"
COM_CPANEL_WELCOME_BEGINNERS_TITLE="Bienvenue sur Joomla!"
COM_CPANEL_XML_DESCRIPTION="Composant de gestion du panneau d'administration"
language/fr-FR/fr-FR.plg_system_updatenotification.sys.ini000060400000001541152453623440017640 0ustar00; @date        2015-10-28
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SYSTEM_UPDATENOTIFICATION="Système - Notification de Mise à jour de Joomla!"
PLG_SYSTEM_UPDATENOTIFICATION_XML_DESCRIPTION="Ce plug-in vérifie périodiquement la disponibilité de nouvelles versions de Joomla! Quand une mise à jour est trouvée, un e-mail est envoyé pour rappeler de mettre à jour. <br />Astuce pro : il est possible de modifier le message en substituant le contenu des constantes suivantes : PLG_SYSTEM_UPDATENOTIFICATION_EMAIL_SUBJECT et PLG_SYSTEM_UPDATENOTIFICATION_EMAIL_BODY."
language/fr-FR/fr-FR.plg_system_backuponupdate.ini000060400000002233152453623440016136 0ustar00; Akeeba Backup - Backup on update plugin
; Copyright (c)2009-2016  Nicholas K. Dionysopoulos / AkeebaBackup.com
;
; 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 3 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, see <http://www.gnu.org/licenses/>.
;
PLG_SYSTEM_BACKUPONUPDATE_TITLE="Système - Sauvegarde avant mise à jour"
PLG_SYSTEM_BACKUPONUPDATE_DESCRIPTION="Akeeba Backup réalisera une sauvegarde complète du site avant de mettre à jour Joomla par le composant natif de mise à jour de Joomla."

; PLG_SYSTEM_BACKUPONUPDATE_MSG_AUTODISABLE="The plugin %s will only work on Joomla! 2.5. Since it is incompatible with your version of Joomla! it will now disable itself."
language/fr-FR/fr-FR.plg_system_sef.ini000060400000001545152453623440013713 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SEF_XML_DESCRIPTION="Ajoute le support SEF aux liens dans les contenus.<br />Fonctionne directement sur le code HTML, sans nécessiter de balises spéciales."
PLG_SYSTEM_SEF="Système - SEF"
PLG_SEF_DOMAIN_LABEL="Domaine du site"
PLG_SEF_DOMAIN_DESCRIPTION="Si votre site peut être consulté par plusieurs noms de domaine, indiquez le domaine (quelquefois nommé canonique). <br /><strong>Note :</strong> https://example.com and https://www.example.com sont des domaines différents."
language/fr-FR/fr-FR.plg_jce_popups-widgetkit2.sys.ini000060400000001306152453623440016564 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_JCE_POPUPS_WIDGETKIT2="Popup Lightbox WidgetKit2 de Yootheme pour JCE"
PLG_JCE_POPUPS_WIDGETKIT2_XML_DESC="Plugin permettant la prise en charge des Popup WidgetKit 2 de Yootheme avec l'éditeur JCE. Nécessite l'installation de Yootheme WidgetKit 2 - <a href='https://yootheme.com/widgetkit' title='Obtenir WidgetKit de Yootheme' target='_blank'><strong>Obtenir WidgetKit de Yootheme</strong></a>"
language/fr-FR/fr-FR.mod_latestactions.sys.ini000060400000001017152453623440015213 0ustar00; @date        2018-09-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8



MOD_LATESTACTIONS="Derniers journaux des actions"
MOD_LATESTACTIONS_XML_DESCRIPTION="Ce module affiche une liste des actions les plus récentes."

language/fr-FR/fr-FR.plg_fields_media.sys.ini000060400000001106152453623440014745 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_MEDIA="Champs - Médias"
PLG_FIELDS_MEDIA_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'media' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_content_loadmodule.sys.ini000060400000001653152453623440016226 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_CONTENT_LOADMODULE="Contenu - Chargement de module"
PLG_LOADMODULE_XML_DESCRIPTION="Système d'affichage de modules dans des contenus en interprétant la syntaxe suivante :<br> par ID: {loadmoduleid 1}<br>par position : {loadposition X}<br />Remplacez la valeur X par la position souhaitée. Exemple pour la position user1 : {loadposition user1}.<br />Il est aussi possible d'utiliser le nom du module : {loadmodule mod_login}.<br />Les paramètres permettent de spécifier le style et un titre spécifique : {loadmodule mod_login,titre du module,style}."
language/fr-FR/fr-FR.plg_system_akeebaupdatecheck.sys.ini000060400000000551152453623440017360 0ustar00; Akeeba Backup
; Copyright (c)2009-2016 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later

; PLG_SYSTEM_AKEEBAUPDATECHECK_TITLE="System - Akeeba Backup Update Check"
; PLG_AKEEBAUPDATECHECK_DESCRIPTION2="Automatically notifies Super Administrators about new versions of Akeeba Backup."
language/fr-FR/fr-FR.com_menus.ini000060400000050242152453623440012653 0ustar00; @date        2015-01-30
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_MENUS="Menus"
COM_MENUS_ACTION_COLLAPSE="Refermer"
COM_MENUS_ACTION_DESELECT="Désélectionner"
COM_MENUS_ACTION_EXPAND="Étendre"
COM_MENUS_ACTION_SELECT="Sélectionner"
COM_MENUS_ADD_MENU_MODULE="Assigner un module à ce menu"
COM_MENUS_ADMIN_ACCESS_DESC="Filtrer par niveau d'accès."
COM_MENUS_ADMIN_ACCESS_LABEL="Accès"
COM_MENUS_ADMIN_AUTHOR_DESC="Filtrer par auteur"
COM_MENUS_ADMIN_AUTHOR_LABEL="Auteur"
COM_MENUS_ADMIN_CATEGORY_DESC="Filtrer par catégorie."
COM_MENUS_ADMIN_CATEGORY_LABEL="Catégorie"
COM_MENUS_ADMIN_FILTER_DESC="Appliquer les filtres au lien de menu."
COM_MENUS_ADMIN_FILTER_LABEL="Filtrer"
COM_MENUS_ADMIN_LANGUAGE_DESC="Filtrer par langue."
COM_MENUS_ADMIN_LANGUAGE_LABEL="Langue"
COM_MENUS_ADMIN_LEVEL_DESC="Nombre de niveaux de sous catégories à afficher."
COM_MENUS_ADMIN_LEVEL_LABEL="Niveaux de sous catégories"
COM_MENUS_ADMIN_TAGS_DESC="Filtrer par tags."
COM_MENUS_ADMIN_TAGS_LABEL="Tags"
COM_MENUS_ADVANCED_FIELDSET_LABEL="Paramètres avancés"
COM_MENUS_BASIC_FIELDSET_LABEL="Paramètres"
COM_MENUS_BATCH_MENU_ITEM_CANNOT_CREATE="Vous n'êtes pas autorisé à créer de nouveaux liens de menu."
COM_MENUS_BATCH_MENU_ITEM_CANNOT_EDIT="Vous n'êtes pas autorisé à modifier les liens de menu."
COM_MENUS_BATCH_MENU_LABEL="Sélectionnez le menu ou son parent pour déplacer/copier"
COM_MENUS_BATCH_OPTIONS="Traitement en lot des liens de menu sélectionnés"
COM_MENUS_BATCH_TIP="Si un menu ou parent est sélectionné pour copier/déplacer, les actions sélectionnées seront appliquées aux liens de menu copiés ou déplacés. Sinon, toutes les actions seront appliquées aux liens de menu sélectionnés."
COM_MENUS_CHANGE_MENUITEM="Sélectionner ou changer l'élément de menu"
COM_MENUS_CONFIGURATION="Menus : Paramètres"
COM_MENUS_EDIT_MENUITEM="Modifier l'élément de menu"
COM_MENUS_EDIT_MODULE_SETTINGS="Modifier les paramètres du module"
COM_MENUS_ERROR_ALL_LANGUAGE_ASSOCIATED="Un lien de menu auquel est assigné le paramètre langue 'Toutes' ne peut pas être associé. Les associations n'ont pas été enregistrées."
COM_MENUS_ERROR_ALREADY_HOME="Ce lien de menu est déjà assigné comme page d'accueil"
COM_MENUS_ERROR_MENUTYPE="Merci de changer le type de menu. Le terme 'main' est réservé pour usage interne."
COM_MENUS_ERROR_MENUTYPE_HOME="Les termes 'menu' et 'main' sont réservés pour usage interne."
COM_MENUS_ERROR_MENUTYPE_NOT_FOUND="Le type de menu n'existe pas"
COM_MENUS_ERROR_ONE_HOME="Un seul lien de menu peut être un lien de page d'accueil pour chaque langue"
COM_MENUS_EXTENSION_PUBLISHED_DISABLED="Composant désactivé et lien de menu publié"
COM_MENUS_EXTENSION_PUBLISHED_ENABLED="Composant activé et lien de menu publié"
COM_MENUS_EXTENSION_UNPUBLISHED_DISABLED="Composant désactivé et lien de menu non publié"
COM_MENUS_EXTENSION_UNPUBLISHED_ENABLED="Composant activé et lien de menu non publié"
COM_MENUS_FIELD_FEEDLINK_DESC="Afficher un lien de flux RSS/ATOM (fil d'actualité) pour ce lien de menu."
COM_MENUS_FIELD_FEEDLINK_LABEL="Lien flux RSS/ATOM"
COM_MENUS_FIELD_PRESET_LABEL="Importer un préréglage"
COM_MENUS_FIELD_PRESET_DESC="Sélectionnez un préréglage si vous souhaitez remplir ce menu avec les liens de menu de ce préréglage. Sinon laissez le champ vide."
COM_MENUS_FIELD_VALUE_IGNORE="Ignorer"
COM_MENUS_FIELD_VALUE_NEW_WITH_NAV="Nouvelle fenêtre avec barre de navigation"
COM_MENUS_FIELD_VALUE_NEW_WITHOUT_NAV="Nouvelle fenêtre sans barre de navigation"
COM_MENUS_FIELD_VALUE_PARENT="Parent"
COM_MENUS_FIELDSET_RULES="Droits"
COM_MENUS_FILTER_PARENT_MENU_ITEM_DESC="Filtrer la liste des liens de menu où le parent est ce lien de menu sélectionné."
COM_MENUS_FILTER_PARENT_MENU_ITEM_LABEL="Lien de menu parent"
COM_MENUS_FILTER_SELECT_PARENT_MENU_ITEM="- Sélectionner un lien de menu parent -"
COM_MENUS_GRID_UNSET_LANGUAGE="Annuler %s comme langue par défaut"
COM_MENUS_HEADING_ASSIGN_MODULE="Module"
COM_MENUS_HEADING_ASSOCIATION="Association"
COM_MENUS_HEADING_DISPLAY="Affichage"
COM_MENUS_HEADING_HOME="Accueil"
COM_MENUS_HEADING_HOME_ASC="Accueil ascendant"
COM_MENUS_HEADING_HOME_DESC="Accueil descendant"
COM_MENUS_HEADING_LEVELS="Niveau d'accès"
COM_MENUS_HEADING_LINKED_MODULES="Module(s) de menu assigné(s)"
COM_MENUS_HEADING_MENU="Menu"
COM_MENUS_HEADING_MENU_ASC="Menu ascendant"
COM_MENUS_HEADING_MENU_DESC="Menu descendant"
COM_MENUS_HEADING_NUMBER_MENU_ITEMS="Nombre de liens de menu"
COM_MENUS_HEADING_POSITION="Position"
COM_MENUS_HEADING_PUBLISHED_ITEMS="Publié(s)"
COM_MENUS_HEADING_TRASHED_ITEMS="Dans la corbeille"
COM_MENUS_HEADING_UNPUBLISHED_ITEMS="Dépublié(s)"
COM_MENUS_HTML_PUBLISH="Publier le lien de menu"
COM_MENUS_HTML_PUBLISH_ALIAS="Publier l'alias de lien de menu"
COM_MENUS_HTML_PUBLISH_DISABLED="Publier le lien de menu::Composant désactivé"
COM_MENUS_HTML_PUBLISH_ENABLED="Publier le lien de menu::Composant activé"
COM_MENUS_HTML_PUBLISH_HEADING="Publier le lien de menu Titre de sous-menu"
COM_MENUS_HTML_PUBLISH_SEPARATOR="Publier le lien de menu Séparateur"
COM_MENUS_HTML_PUBLISH_URL="Publier le lien de menu URL"
COM_MENUS_HTML_UNPUBLISH_ALIAS="Dépublier l'alias de lien de menu"
COM_MENUS_HTML_UNPUBLISH_DISABLED="Dépublier le lien de menu::Composant désactivé"
COM_MENUS_HTML_UNPUBLISH_ENABLED="Dépublier le lien de menu::Composant activé"
COM_MENUS_HTML_UNPUBLISH_HEADING="Dépublier le lien de menu Titre de sous-menu"
COM_MENUS_HTML_UNPUBLISH_SEPARATOR="Dépublier le lien de menu Séparateur"
COM_MENUS_HTML_UNPUBLISH_URL="Depublier le lien de menu URL"
COM_MENUS_INTEGRATION_FIELDSET_LABEL="Intégration"
; The following 2 strings are deprecated and will be removed with 4.0.
COM_MENUS_ITEM_ASSOCIATIONS_FIELDSET_LABEL="Associations de liens de menu"
COM_MENUS_ITEM_ASSOCIATIONS_FIELDSET_DESC="Choisissez l'élément à associer dans la langue cible.<br />Ce choix ne concerne que les sites multilingues, il ne s'affiche que si le paramètre 'Association' est réglé sur 'Oui' dans le plug-in 'Filtre de langue'.<br /><strong>Note :<strong> l'association d'éléments de langues différentes permet de rediriger l'utilisateur vers un élément spécifique au moment du changement de langue. Pour l'utiliser, assurez-vous que le module de changement de langue soit affiché sur les pages des éléments concernés.<br />Une catégorie au paramètre langue 'Toutes' ne peut pas être associé."
COM_MENUS_ITEM_DETAILS="Détails"
COM_MENUS_ITEM_FIELD_ALIAS_DESC="L'alias est utilisé dans les URL quand SEF est activé"
COM_MENUS_ITEM_FIELD_ALIAS_MENU_DESC="Lien de menu à lier à..."
COM_MENUS_ITEM_FIELD_ALIAS_MENU_LABEL="Lien de menu"
COM_MENUS_ITEM_FIELD_ALIAS_REDIRECT_DESC="Si oui, les visiteurs seront redirigés vers l'élément de menu lié."
COM_MENUS_ITEM_FIELD_ALIAS_REDIRECT_LABEL="Utiliser la redirection"
COM_MENUS_ITEM_FIELD_ANCHOR_CSS_DESC="Style CSS personnalisé à appliquer au lien de menu (optionnel)."
COM_MENUS_ITEM_FIELD_ANCHOR_CSS_LABEL="Style CSS du lien"
COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_DESC="Description personnalisée de l'attribut 'Titre' (title) du lien de menu."
COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_LABEL="Attribut 'Titre' du lien"
COM_MENUS_ITEM_FIELD_ANCHOR_REL_DESC="Un attribut 'rel' optionnel pour permettre aux moteurs de recherche d'obtenir plus d'informations à propos du lien de menu."
COM_MENUS_ITEM_FIELD_ANCHOR_REL_LABEL="Attribut 'rel' du lien"
COM_MENUS_ITEM_FIELD_ASSIGNED_DESC="Menu auquel le lien est assigné."
COM_MENUS_ITEM_FIELD_ASSIGNED_LABEL="Menu"
COM_MENUS_ITEM_FIELD_ASSOCIATION_NO_VALUE="- Pas d’association -"
COM_MENUS_ITEM_FIELD_BROWSERNAV_DESC="Fenêtre-cible du navigateur ouverte lorsque le visiteur clique sur le lien."
COM_MENUS_ITEM_FIELD_BROWSERNAV_LABEL="Fenêtre-cible"
COM_MENUS_ITEM_FIELD_COMPONENTS_CONTAINER_HIDE_ITEMS_DESC="Sélectionner les liens de menu à afficher ou non dans ce conteneur. Si aucun lien ne doit s'afficher, le conteneur sera lui-même caché.<br>Noter que lors de l'installation d'un nouveau composant, le conteneur sera affiché ainsi que les liens de menu de ce composant jusqu'à ce qu'il soit décidé de les cacher également si besoin."
COM_MENUS_ITEM_FIELD_COMPONENTS_CONTAINER_HIDE_ITEMS_LABEL="Afficher ou cacher des liens de menu"
COM_MENUS_ITEM_FIELD_HIDE_UNASSIGNED="Masquer les modules non assignés"
COM_MENUS_ITEM_FIELD_HIDE_UNASSIGNED_DESC="Afficher ou non les modules non assignés à cet élément de menu "
COM_MENUS_ITEM_FIELD_HIDE_UNASSIGNED_LABEL="Modules non assignés"
COM_MENUS_ITEM_FIELD_HIDE_UNPUBLISHED="Cacher les modules non publiés"
COM_MENUS_ITEM_FIELD_HIDE_UNPUBLISHED_DESC="Afficher ou non les modules non publiés."
COM_MENUS_ITEM_FIELD_HIDE_UNPUBLISHED_LABEL="Modules non publiés"
COM_MENUS_ITEM_FIELD_HOME_DESC="Assigner ce menu à la page d'accueil du site. Un seul lien peut être celui de la page d'accueil par défaut.<br />Si le site est multilingue, un lien de page d'accueil doit être assigné pour chaque langue."
COM_MENUS_ITEM_FIELD_HOME_LABEL="Page par défaut"
COM_MENUS_ITEM_FIELD_LANGUAGE_DESC="Assigner une langue à ce lien de menu"
COM_MENUS_ITEM_FIELD_LINK_DESC="URL du lien de menu. Cette URL se construit automatiquement par le choix du type de lien et par ses paramètres."
COM_MENUS_ITEM_FIELD_LINK_LABEL="URL du lien"
COM_MENUS_ITEM_FIELD_MENU_IMAGE_DESC="Image optionnelle à afficher avec le lien de menu. Note : l'affichage des images doit être activé dans les paramètres du module."
COM_MENUS_ITEM_FIELD_MENU_IMAGE_LABEL="Image du lien"
COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_DESC="Une classe optionnelle personnalisée à appliquer à l'image."
COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_LABEL="Classe de l'image"
COM_MENUS_ITEM_FIELD_MENU_SHOW_DESC="Choisir 'Non' pour ne pas afficher ce lien de menu. Note : les liens de sous-menu seront également cachés."
COM_MENUS_ITEM_FIELD_MENU_SHOW_LABEL="Afficher dans le menu"
COM_MENUS_ITEM_FIELD_MENU_TEXT_DESC="Si l'image optionnelle est définie, ajoute le titre du lien à côté de l'image. Par défaut 'Oui'."
COM_MENUS_ITEM_FIELD_MENU_TEXT_LABEL="Ajouter un titre au menu"
COM_MENUS_ITEM_FIELD_NOTE_DESC="Note optionnelle de description du lien, visible uniquement en administration dans l'affichage en liste des liens de menu."
COM_MENUS_ITEM_FIELD_ORDERING_DESC="Le lien de menu sera placé dans le menu après le lien de menu sélectionné."
COM_MENUS_ITEM_FIELD_ORDERING_LABEL="Ordre d'affichage"
COM_MENUS_ITEM_FIELD_ORDERING_TEXT="L'ordre d'affichage sera disponible après la sauvegarde."
COM_MENUS_ITEM_FIELD_ORDERING_VALUE_FIRST="- En premier -"
COM_MENUS_ITEM_FIELD_ORDERING_VALUE_LAST="- En dernier -"
COM_MENUS_ITEM_FIELD_PAGE_CLASS_DESC="Classe CSS optionnelle à appliquer à la page."
COM_MENUS_ITEM_FIELD_PAGE_CLASS_LABEL="Classe de page"
COM_MENUS_ITEM_FIELD_PAGE_HEADING_DESC="Texte alternatif optionnel pour l'en-tête de page."
COM_MENUS_ITEM_FIELD_PAGE_HEADING_LABEL="En-tête de page"
COM_MENUS_ITEM_FIELD_PAGE_TITLE_DESC="Texte optionnel pour le titre affiché dans la barre de titre du navigateur. Si laissé vide, une valeur par défaut sera utilisée, basée sur le titre du lien de menu."
COM_MENUS_ITEM_FIELD_PAGE_TITLE_LABEL="Titre dans le navigateur"
COM_MENUS_ITEM_FIELD_PARENT_DESC="Attribuez un lien de menu parent à ce lien pour en faire un lien de sous-menu."
COM_MENUS_ITEM_FIELD_PARENT_LABEL="Lien parent"
COM_MENUS_ITEM_FIELD_SECURE_DESC="Spécifier si ce lien de menu doit utiliser ou non le mode HTTPS (connexions HTTP encryptées avec le préfixe de protocole https://). Note : HTTPS doit être activé sur votre serveur pour utiliser cette option."
COM_MENUS_ITEM_FIELD_SECURE_LABEL="Lien sécurisé"
COM_MENUS_ITEM_FIELD_SHOW_PAGE_HEADING_DESC="Afficher/Masquer la page de titre du navigateur dans l'en-tête de la page (si aucun texte optionnel n'a été saisi, le titre du lien de menu sera utilisé).<br />Le titre de page est habituellement inséré dans une balise 'H1'."
COM_MENUS_ITEM_FIELD_SHOW_PAGE_HEADING_LABEL="Afficher l'en-tête de page"
COM_MENUS_ITEM_FIELD_TEMPLATE_DESC="Sélectionner un template spécifique pour ce lien de menu ou utiliser le template par défaut."
COM_MENUS_ITEM_FIELD_TEMPLATE_LABEL="Style du template"
COM_MENUS_ITEM_FIELD_TEXT_SEPARATOR_DESC="Choisir si ce séparateur doit s’afficher en tant que label. Si le titre contient uniquement des tirets (-) et des espaces, il n'apparaîtra pas en tant que label..  "
COM_MENUS_ITEM_FIELD_TEXT_SEPARATOR_LABEL="Afficher en tant que label"
COM_MENUS_ITEM_FIELD_TITLE_DESC="Titre à afficher comme lien dans le menu."
COM_MENUS_ITEM_FIELD_TITLE_LABEL="Titre de menu"
COM_MENUS_ITEM_FIELD_TYPE_DESC="Type du lien de menu : Composant, URL, Alias ou Séparateur"
COM_MENUS_ITEM_FIELD_TYPE_LABEL="Type de lien de menu"
COM_MENUS_ITEM_IS_DEFAULT="Par défaut"
COM_MENUS_ITEM_MODULE_ASSIGNMENT="Assignation de modules"
COM_MENUS_ITEM_REQUIRED="Requis"
COM_MENUS_ITEM_ROOT="Lien de menu racine"
COM_MENUS_ITEMS_REBUILD_FAILED="Impossible de reconstruire la liste des liens de menus"
COM_MENUS_ITEMS_REBUILD_SUCCESS="La liste des liens de menu a été reconstruite."
COM_MENUS_ITEMS_SEARCH_FILTER="Chercher sur le titre, l'alias et les notes. Préfixe avec ID: pour chercher sur l'ID de lien de menu."
COM_MENUS_ITEMS_SEARCH_FILTER_LABEL="Chercher les liens de menu"
COM_MENUS_ITEMS_SET_HOME_0="Aucun lien de menu assigné à la page d'accueil"
COM_MENUS_ITEMS_SET_HOME_1="1 lien de menu assigné à la page d'accueil."
COM_MENUS_ITEMS_SET_HOME_MORE="%d liens de menus assignés à des pages d'accueil"
COM_MENUS_ITEMS_UNSET_HOME="Page d'accueil désassigné du lien de menu."
COM_MENUS_LABEL_HIDDEN="Caché"
COM_MENUS_LAYOUT_FEATURED_OPTIONS="Affichage"
COM_MENUS_LAYOUT_MENUTYPE_OPTIONS_LABEL="Type de menu"
COM_MENUS_LINKTYPE_OPTIONS_LABEL="Type de liens"
COM_MENUS_MENU_CLIENT_ID_LABEL="Client"
COM_MENUS_MENU_CLIENT_ID_DESC="Choisir le client (site ou administration) pour lequel ce menu sera utilisé."
COM_MENUS_MENU_CONFIRM_DELETE="Êtes-vous certain de vouloir supprimer ces menus ? Cela supprimera également leurs liens et les modules de menus associés."
COM_MENUS_MENU_DESCRIPTION_DESC="Description des fonctions du menu."
COM_MENUS_MENU_DETAILS="Détails du menu"
COM_MENUS_MENU_EXPORT_BUTTON="Télécharger en tant que préréglage"
COM_MENUS_MENU_ITEM_SAVE_SUCCESS="Lien de menu enregistré."
COM_MENUS_MENU_MENUTYPE_DESC="Le nom 'système' du menu."
COM_MENUS_MENU_MENUTYPE_LABEL="Type de menu"
COM_MENUS_MENU_SAVE_SUCCESS="Menu enregistré."
COM_MENUS_MENU_SEARCH_FILTER="Rechercher dans le titre ou le type de menu"
COM_MENUS_MENU_SPRINTF="Menu&nbsp;: %s"
COM_MENUS_MENUS="Éléments de menu"
COM_MENUS_MENU_TYPE_PROTECTED_MAIN_LABEL="Main (Protégé)"
COM_MENUS_MENU_TITLE_DESC="Titre du menu à afficher dans la barre de menu et dans les listes en administration."
COM_MENUS_MENUS_FILTER_SEARCH_DESC="Chercher dans le titre ou le type de menu"
COM_MENUS_MENUS_FILTER_SEARCH_LABEL="Recherche des menus"
; in the following string
; %1$s is for module title, %2$s is for access-title, %3$s is for position
COM_MENUS_MODULE_ACCESS_POSITION="%1$s <small>(%2$s en %3$s)</small>"
COM_MENUS_MODULE_SHOW_VARIES="Variables"
COM_MENUS_MODULES="Modules"
COM_MENUS_N_ITEMS_CHECKED_IN_0="Aucun lien de menu déverrouillé."
COM_MENUS_N_ITEMS_CHECKED_IN_1="%d lien de menu déverrouillé."
COM_MENUS_N_ITEMS_CHECKED_IN_MORE="%d liens de menu déverrouillés."
COM_MENUS_N_ITEMS_DELETED="%d liens de menu supprimés."
COM_MENUS_N_ITEMS_DELETED_1="%d lien de menu supprimé."
COM_MENUS_N_ITEMS_FAILED_PUBLISHING="%d liens de menu n'ont pu être publiés car au moins un de leurs liens de menu parents n'est pas publié ou un de leurs liens de menu enfants est verrouillé."
COM_MENUS_N_ITEMS_FAILED_PUBLISHING_1="%d lien de menu n'a pu être publié car au moins un de ses liens de menu parents n'est pas publié ou un de ses liens de menu enfants est verrouillé."
COM_MENUS_N_ITEMS_PUBLISHED="%d liens de menu activé."
COM_MENUS_N_ITEMS_PUBLISHED_1="%d lien de menu activé."
COM_MENUS_N_ITEMS_TRASHED="%d liens de menu mis à la corbeille"
COM_MENUS_N_ITEMS_TRASHED_1="%d lien de menu mis à la corbeille"
COM_MENUS_N_ITEMS_UNPUBLISHED="%d liens de menu désactivés"
COM_MENUS_N_ITEMS_UNPUBLISHED_1="%d lien de menu désactivé"
COM_MENUS_N_MENUS_DELETED="%d types de menu supprimés"
COM_MENUS_N_MENUS_DELETED_1="Type de menu supprimé"
COM_MENUS_NEW_MENUITEM="Nouvel élément de menu"
COM_MENUS_NO_ITEM_SELECTED="Aucun lien de menu sélectionné"
COM_MENUS_NO_MENUS_SELECTED="Aucun menu sélectionné"
COM_MENUS_OPTION_SELECT_COMPONENT="- Sélectionner un composant -"
COM_MENUS_OPTION_SELECT_LEVEL="- Sélectionnez le nombre de niveaux -"
COM_MENUS_PAGE_OPTIONS_LABEL="Paramètres d'affichage de la page"
COM_MENUS_PRESET_IMPORT_SUCCESS="Le menu a été sauvegardé et les liens de menu ont été importés à partir du préréglage sélectionné."
COM_MENUS_PRESET_IMPORT_FAILED="Le menu a été sauvegardé mais n'a pas pu importer le préréglage : %s"
COM_MENUS_PRESET_LOAD_FAILED="Impossible de charger le préréglage spécifié."
COM_MENUS_REQUEST_FIELDSET_LABEL="Paramètres requis"
COM_MENUS_SAVE_SUCCESS="Lien de menu enregistré"
COM_MENUS_SELECT_A_MENUITEM="Sélectionner un élément de menu"
COM_MENUS_SELECT_MENU="- Sélectionner un menu -"
COM_MENUS_SELECT_MENU_FILTER_NOT_TRASHED="Filtrer la liste par un statut autre que Corbeille ou effacer le contenu du filtre."
COM_MENUS_SELECT_MENU_FIRST="Pour utiliser le traitement par lots, merci de sélectionner tout d'abord un menu dans le gestionnaire de menus."
COM_MENUS_SELECT_MENU_FIRST_EXPORT="Pour utiliser l'exportation, sélectionnez d'abord un menu valide dans le gestionnaire."
COM_MENUS_SUBMENU_ITEMS="Liens de menu"
COM_MENUS_SUBMENU_MENUS="Menus"
COM_MENUS_SUCCESS_REORDERED="Liens de menus réordonnés."
COM_MENUS_TIP_ALIAS_LABEL="<strong>Attention!</strong><br />Laisser le champ 'Alias' vide si le lien de menu ciblé et celui de type 'Alias' ont le même parent."
COM_MENUS_TIP_ASSOCIATION="Liens de menu associés"
COM_MENUS_TITLE_EDIT_ITEM="Gestion des menus : Création/Modification du lien"
COM_MENUS_TITLE_TRANSLATION="Titre (%s)"
COM_MENUS_TOOLBAR_SET_HOME="Accueil"
COM_MENUS_TYPE_ALIAS="Alias de lien de menu"
COM_MENUS_TYPE_ALIAS_DESC="Affiche un alias d'un lien de menu pour récupérer les paramètres liés"
COM_MENUS_TYPE_CHOOSE="Sélectionnez un type de lien de menu :"
COM_MENUS_TYPE_CONTAINER="Conteneur de menu de composants"
COM_MENUS_TYPE_CONTAINER_DESC="Ce lien de menu crée un conteneur affichant les liens de menu dans le menu protégé de type 'main'. Ils peuvent être cachés ou affichés sélectivement."
COM_MENUS_TYPE_EXTERNAL_URL="URL"
COM_MENUS_TYPE_EXTERNAL_URL_DESC="Affiche l'URL dans la même ou dans une nouvelle fenêtre"
COM_MENUS_TYPE_HEADING="Titre de sous-menu"
COM_MENUS_TYPE_HEADING_DESC="Un titre de sous-menu pour séparer des blocs de sous-menus."
COM_MENUS_TYPE_SEPARATOR="Séparateur"
COM_MENUS_TYPE_SEPARATOR_DESC="Affiche un séparateur de lien de menu avec un label ou non."
COM_MENUS_TYPE_SYSTEM="Liens divers"
COM_MENUS_TYPE_UNEXISTING="Le composant '%s' n'existe pas"
COM_MENUS_TYPE_UNKNOWN="Inconnu"
COM_MENUS_VIEW_EDIT_ITEM_TITLE="Menus : Modifier un lien de menu"
COM_MENUS_VIEW_EDIT_MENU_TITLE="Menus : Modifier le menu"
COM_MENUS_VIEW_ITEMS_ALL_TITLE="Menus: Tous les liens de menu"
COM_MENUS_VIEW_ITEMS_MENU_TITLE="Menus: Liens de menu (%s)"
COM_MENUS_VIEW_ITEMS_TITLE="Menus : Liens de menu"
COM_MENUS_VIEW_MENUS_TITLE="Menus"
COM_MENUS_VIEW_NEW_ITEM_TITLE="Menus : Ajouter un lien de menu"
COM_MENUS_VIEW_NEW_MENU_TITLE="Menus : Ajouter un menu"
COM_MENUS_XML_DESCRIPTION="Composant de création de menus"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_MENUS="Les modification ne s'appliquent qu'à ce composant.<br /><em><strong>Hérité</strong></em> - les droits globaux ou ceux des groupes parents seront utilisés.<br /><em><strong>Refusé</strong></em> - prévaut toujours, quels que soient les droits globaux ou ceux des groupes parents, et s'applique aux éléments enfants.<br /><em><strong>Autorisé</strong></em> - le groupe concerné pourra effectuer cette action dans ce composant sauf si les droits globaux sont différents."
language/fr-FR/fr-FR.plg_system_wf_responsify.sys.ini000060400000001574152453623440016652 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_WF_RESPONSIFY_XML_DESCRIPTION="Ce plugin attribue un effet responsive aux éléments objet, embed, vidéo, audio et iframe."
PLG_SYSTEM_WF_RESPONSIFY="Responsify pour JCE"
PLG_SYSTEM_WF_RESPONSIFY_FULL_WIDTH_DISPLAY="Affichage pleine largeur"
PLG_SYSTEM_WF_RESPONSIFY_FULL_WIDTH_DISPLAY_DESC="Agrandir les vidéos pour les adapter à la largeur de la page ou du conteneur parent"
PLG_SYSTEM_WF_RESPONSIFY_ELEMENTS="Éléments"
PLG_SYSTEM_WF_RESPONSIFY_ELEMENTS_DESC="Une liste d'éléments à rendre responsive."

PLG_SYSTEM_WF_RESPONSIFY_CLICK_TO_PLAY_TEXT="Cliquer pour activer"language/fr-FR/fr-FR.plg_jce_editor_fontawesome.ini000060400000002237152453623440016247 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_JCE_EDITOR_FONTAWESOME="Font Awesome pour JCE"
PLG_JCE_EDITOR_FONTAWESOME_TITLE="Font Awesome"
PLG_JCE_EDITOR_FONTAWESOME_DESC="Plugin permettant d'insérer des icones Font Awesome dans les contenus avec l'éditeur JCE."
PLG_JCE_EDITOR_FONTAWESOME_XML_DESC="Plugin permettant d'insérer des icones Font Awesome dans les contenus avec l'éditeur JCE"
PLG_JCE_EDITOR_FONTAWESOME_VERSION="Version de Font Awesome"
PLG_JCE_EDITOR_FONTAWESOME_VERSION_DESC="Version de Font Awesome à utiliser, correspondant à celle chargée en frontal du site."
PLG_JCE_EDITOR_FONTAWESOME_URL="URL du fichier CSS"
PLG_JCE_EDITOR_FONTAWESOME_URL_DESC="URL optionnelle du fichier css de Font Awesome à intégrer dans l'éditeur."
PLG_JCE_EDITOR_FONTAWESOME_LOAD_ASSETS="CSS en frontal"
PLG_JCE_EDITOR_FONTAWESOME_LOAD_ASSETS_DESC="Chargement du fichier CSS FontAwesome en frontal du site."language/fr-FR/fr-FR.com_templates.sys.ini000060400000001351152453623440014334 0ustar00; @date        2015-08-25
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_TEMPLATES="Templates"
COM_TEMPLATES_XML_DESCRIPTION="Ce composant gère les templates"

COM_TEMPLATES_STYLE_VIEW_DEFAULT_DESC="Affiche une liste des styles de templates"
COM_TEMPLATES_STYLE_VIEW_DEFAULT_TITLE="Styles de templates"
COM_TEMPLATES_TEMPLATES_VIEW_DEFAULT_DESC="Affiche une liste des templates"
COM_TEMPLATES_TEMPLATES_VIEW_DEFAULT_TITLE="Templates"
language/fr-FR/fr-FR.com_checkin.sys.ini000060400000001213152453623440013737 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_CHECKIN="Déverrouillage"
COM_CHECKIN_XML_DESCRIPTION="Composant de déverrouillage"

COM_CHECKIN_CHECKIN_VIEW_DEFAULT_DESC="Affiche une liste de tous les éléments verrouillés dans toutes les tables."
COM_CHECKIN_CHECKIN_VIEW_DEFAULT_TITLE="Déverrouillage global"
language/fr-FR/fr-FR.plg_fields_image.ini000060400000001150152453623440014132 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_IMAGE="Champs - Image"
PLG_FIELDS_IMAGE_LABEL="Image (%s)"
PLG_FIELDS_IMAGE_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'image' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.mod_stats_admin.ini000060400000002603152453623440014031 0ustar00; @date        2014-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


MOD_STATS_ADMIN="Statistiques"
MOD_STATS_ARTICLES="Articles"
MOD_STATS_ARTICLES_VIEW_HITS="Clics sur articles"
MOD_STATS_CACHING="Cache"
MOD_STATS_FIELD_COUNTER_DESC="Afficher/Masquer les clics"
MOD_STATS_FIELD_COUNTER_LABEL="Clics"
MOD_STATS_FIELD_INCREASECOUNTER_DESC="Vous pouvez indiquez une valeur qui s'ajoute au nombre total de clics."
MOD_STATS_FIELD_INCREASECOUNTER_LABEL="Ajouter des clics"
MOD_STATS_FIELD_SERVERINFO_DESC="Afficher les informations du serveur"
MOD_STATS_FIELD_SERVERINFO_LABEL="Informations du serveur"
MOD_STATS_FIELD_SITEINFO_DESC="Afficher les informations du site"
MOD_STATS_FIELD_SITEINFO_LABEL="Informations du site "
MOD_STATS_GZIP="Gzip"
MOD_STATS_MYSQL="MySQL"
MOD_STATS_OS="OS"
MOD_STATS_PHP="PHP"
MOD_STATS_TIME="Heure"
MOD_STATS_USERS="Utilisateurs"
MOD_STATS_WEBLINKS="Liens web"
MOD_STATS_XML_DESCRIPTION="Le module Statistiques permet d'afficher des informations sur le serveur ainsi que des statistiques sur les utilisateurs du site et le nombre d'articles dans votre base de données. "
language/fr-FR/fr-FR.plg_fields_imagelist.ini000060400000002267152453623440015040 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_IMAGELIST="Champs - Liste d'images"
PLG_FIELDS_IMAGELIST_LABEL="Liste d'images (%s)"
; Don't translate "images" in the string below.
PLG_FIELDS_IMAGELIST_PARAMS_DIRECTORY_DESC="Indiquer le dossier contenant les images à lister par rapport au dossier \"images\" à la racine de Joomla!"
PLG_FIELDS_IMAGELIST_PARAMS_DIRECTORY_LABEL="Répertoire"
PLG_FIELDS_IMAGELIST_PARAMS_IMAGE_CLASS_DESC="La classe à ajouter à l'image (src tag)."
PLG_FIELDS_IMAGELIST_PARAMS_IMAGE_CLASS_LABEL="Classe de l'image"
PLG_FIELDS_IMAGELIST_PARAMS_MULTIPLE_DESC="Permet la sélection de valeurs multiples."
PLG_FIELDS_IMAGELIST_PARAMS_MULTIPLE_LABEL="Multiple"
PLG_FIELDS_IMAGELIST_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'iamgelist' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.mod_feed.ini000060400000004576152453623440012441 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2020 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2020 Open Source Matters. All rights reserved.
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


MOD_FEED="Fil d'actualité"
MOD_FEED_ERR_CACHE="Veuillez rendre inscriptible le dossier du cache"
MOD_FEED_ERR_NO_URL="Aucune URL spécifiée pour le flux du fil d'actualité."
MOD_FEED_ERR_FEED_NOT_RETRIEVED="Fil d'actualité introuvable"
MOD_FEED_FIELD_DATE_DESC="Affiche la date de publication du flux."
MOD_FEED_FIELD_DATE_LABEL="Date du flux"
MOD_FEED_FIELD_DESCRIPTION_DESC="Afficher/Masquer le texte de description de l'ensemble du fil d'actualité."
MOD_FEED_FIELD_DESCRIPTION_LABEL="Texte de description du fil"
MOD_FEED_FIELD_IMAGE_DESC="Afficher/Masquer les images associées pour l'ensemble du fil d'actualité."
MOD_FEED_FIELD_IMAGE_LABEL="Images du fil d'actualité"
MOD_FEED_FIELD_ITEMDATE_DESC="Affiche la date de publication des éléments RSS individuels."
MOD_FEED_FIELD_ITEMDATE_LABEL="Date de publication"
MOD_FEED_FIELD_ITEMDESCRIPTION_DESC="Afficher/Masquer la description ou le texte d'introduction de chaque élément du fil d'actualité."
MOD_FEED_FIELD_ITEMDESCRIPTION_LABEL="Description des actualité"
MOD_FEED_FIELD_ITEMS_DESC="Indiquez par une valeur numérique le nombre d'actualité à afficher dans le fil."
MOD_FEED_FIELD_ITEMS_LABEL="Nombre d'actualité"
MOD_FEED_FIELD_RSSTITLE_DESC="Afficher/Masquer le titre des actualité du fil."
MOD_FEED_FIELD_RSSTITLE_LABEL="Titre des actualité"
MOD_FEED_FIELD_RSSURL_DESC="Saisissez l'URL du fil d'actualité RSS, RDF ou ATOM."
MOD_FEED_FIELD_RSSURL_LABEL="URL du fil d'actualité"
MOD_FEED_FIELD_RTL_DESC="Afficher les textes du fil d'actualité dans le sens RTL (de droite à gauche)."
MOD_FEED_FIELD_RTL_LABEL="Écriture de droite à gauche"
MOD_FEED_FIELD_WORDCOUNT_DESC="Vous pouvez limiter le nombre de mots affichés du texte de description en spécifiant une valeur numérique. 0 affiche tout le texte."
MOD_FEED_FIELD_WORDCOUNT_LABEL="Nombre de mots"
MOD_FEED_XML_DESCRIPTION="Le module 'mod_feed' affiche un fil d'actualité d'une URL spécifiée.<br />Ce module doit être placé en position 'cpanel' avec le template par défaut de Joomla."
language/fr-FR/fr-FR.plg_editors-xtd_article.sys.ini000060400000001174152453623440016316 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_ARTICLE_XML_DESCRIPTION="Affiche un bouton sous l'éditeur pour insérer dans un contenu des liens vers des articles<br />Ouvre une fenêtre pop-up permettant de choisir l'article vers lequel effectuer le lien."
PLG_EDITORS-XTD_ARTICLE="Bouton - Article"language/fr-FR/fr-FR.plg_fields_list.sys.ini000060400000001101152453623440014634 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_LIST="Champs - Liste"
PLG_FIELDS_LIST_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'list' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_fields_text.ini000060400000001622152453623440014040 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_TEXT="Champs - Texte"
PLG_FIELDS_TEXT_LABEL="Texte (%s)"
PLG_FIELDS_TEXT_PARAMS_FILTER_DESC="Permet au système d'enregistrer certaines balises html ou données brutes."
PLG_FIELDS_TEXT_PARAMS_FILTER_LABEL="Filtre"
PLG_FIELDS_TEXT_PARAMS_MAXLENGTH_LABEL="Longueur maximum"
PLG_FIELDS_TEXT_PARAMS_MAXLENGTH_DESC="Le nombre maximum de caractères à insérer."
PLG_FIELDS_TEXT_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'text' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_captcha_recaptcha.ini000060400000014213152453623440015143 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_CAPTCHA_RECAPTCHA="CAPTCHA - reCAPTCHA"
PLG_CAPTCHA_RECAPTCHA_XML_DESCRIPTION="Le plug-in CAPTCHA utilise le service reCAPTCHA de protection contre les spammeurs tout en aidant à la numérisation des livres, des journaux et des émissions anciennes de radio. Pour obtenir une clé de site et une clé secrète pour votre domaine, se rendre à <a href=\"https://www.google.com/recaptcha\" target=\"_blank\">https://www.google.com/recaptcha</a>.<br />Pour utiliser ce service quand un utilisateur crée un nouveau compte, se rendre dans Gestion des utilisateurs->Paramètres et sélectionner CAPTCHA - reCAPTCHA comme Captcha."
PLG_PLG_RECAPTCHA_VERSION_1_POSTINSTALL_ACTION="Mettre à jour les paramètres reCAPTCHA"
PLG_PLG_RECAPTCHA_VERSION_1_POSTINSTALL_BODY="La prise en charge de reCAPTCHA v1 sera désactivée par Google le 31 mars 2018. Veuillez mettre à jour les paramètres dans le plugin reCAPTCHA pour utiliser la version 2.0."
PLG_PLG_RECAPTCHA_VERSION_1_POSTINSTALL_TITLE="reCAPTCHA v1 - discontinué"
; Params
PLG_RECAPTCHA_VERSION_1_WARNING_LABEL="Vous avez sélectionné la Version 1.0. À partir du 31 mars 2018, cette version ne fonctionnera plus. Il vous faut maintenant utiliser la version 2.0."
PLG_RECAPTCHA_VERSION_DESC="La Version 2.0 est recommandée."
PLG_RECAPTCHA_VERSION_LABEL="Version"
PLG_RECAPTCHA_CALLBACK_DESC="(Facultatif) fonction de rappel JavaScript, exécutée après une réponse reCAPTCHA réussie."
PLG_RECAPTCHA_CALLBACK_LABEL="Fonction de rappel"
PLG_RECAPTCHA_ERROR_CALLBACK_DESC="(Facultatif) fonction de rappel JavaScript, exécutée suite à une erreur de réponse reCAPTCHA."
PLG_RECAPTCHA_ERROR_CALLBACK_LABEL="Erreur de la fonction de rappel"
PLG_RECAPTCHA_EXPIRED_CALLBACK_DESC="(Facultatif) fonction de rappel JavaScript, exécutée si le reCAPTCHA a expiré."
PLG_RECAPTCHA_EXPIRED_CALLBACK_LABEL="Expiration de la fonction de rappel"
PLG_RECAPTCHA_LANG_DESC="Sélectionnez la langue pour le reCAPTCHA. Si réglé par défaut, le fichier de langue a la traduction personnalisée sera utilisé."
PLG_RECAPTCHA_LANG_LABEL="Langue"
PLG_RECAPTCHA_PRIVATE_KEY_DESC="Utilise une communication entre votre serveur et le serveur ReCAPTCHA pour une protection accrue. Voir la description du plug-in pour obtenir des instructions sur l'utilisation et obtenir une clé secrète."
PLG_RECAPTCHA_PRIVATE_KEY_LABEL="Clé secrète"
PLG_RECAPTCHA_PUBLIC_KEY_DESC="Utilise un code JavaScript servi côté utilisateurs. Voir la description du plug-in pour obtenir des instructions sur l'utilisation, et l'obtention d'une clé de site."
PLG_RECAPTCHA_PUBLIC_KEY_LABEL="Clé de site"
PLG_RECAPTCHA_SIZE_DESC="Choisir une taille pour le champ reCAPTCHA."
PLG_RECAPTCHA_SIZE_LABEL="Taille"
PLG_RECAPTCHA_TABINDEX_DESC="Le tabindex du widget reCAPTCHA."
PLG_RECAPTCHA_TABINDEX_LABEL="Attribut Tabindex"
PLG_RECAPTCHA_THEME_BLACKGLASS="Blanc glacé"
PLG_RECAPTCHA_THEME_CLEAN="Épuré"
PLG_RECAPTCHA_THEME_COMPACT="Compact"
PLG_RECAPTCHA_THEME_DARK="Foncé"
PLG_RECAPTCHA_THEME_DESC="Définit le thème à utiliser pour reCAPTCHA."
PLG_RECAPTCHA_THEME_LABEL="Thème"
PLG_RECAPTCHA_THEME_LIGHT="Clair"
PLG_RECAPTCHA_THEME_NORMAL="Normal"
PLG_RECAPTCHA_THEME_RED="Rouge"
PLG_RECAPTCHA_THEME_WHITE="Blanc"
; The following two strings are deprecated and will be removed with 4.0. They generate wrong plural detection in Crowdin.
PLG_RECAPTCHA_VERSION_1="1.0"
PLG_RECAPTCHA_VERSION_2="2.0"
PLG_RECAPTCHA_VERSION_V1="1.0"
PLG_RECAPTCHA_VERSION_V2="2.0"
; Error messages
PLG_RECAPTCHA_ERROR_EMPTY_SOLUTION="Merci de compléter le CAPTCHA"
PLG_RECAPTCHA_ERROR_INCORRECT_CAPTCHA_SOL="Le CAPTCHA est incorrect."
PLG_RECAPTCHA_ERROR_INVALID_REFERRER="Pour des raisons de sécurité, les clés reCAPTCHA sont liées à un domaine spécifique."
PLG_RECAPTCHA_ERROR_INVALID_REQUEST_COOKIE="Le paramètre de contrôle du script de vérification est incorrect."
PLG_RECAPTCHA_ERROR_INVALID_SITE_PRIVATE_KEY="Nous ne sommes pas en mesure de vérifier la clé secrète."
PLG_RECAPTCHA_ERROR_INVALID_SITE_PUBLIC_KEY="Nous ne sommes pas en mesure de vérifier la clé de site."
PLG_RECAPTCHA_ERROR_NO_IP="Pour des raisons de sécurité, vous devez indiquer l'adresse IP au reCAPTCHA."
PLG_RECAPTCHA_ERROR_NO_PRIVATE_KEY="reCAPTCHA a besoin qu'une clé secrète soit saisie dans ses paramètres. Merci de contacter un administrateur du site."
PLG_RECAPTCHA_ERROR_NO_PUBLIC_KEY="reCAPTCHA a besoin qu'une clé de site soit saisie dans ses paramètres. Merci de contacter un administrateur du site."
PLG_RECAPTCHA_ERROR_RECAPTCHA_NOT_REACHABLE="Impossible de contacter le serveur de vérification reCAPTCHA."
PLG_RECAPTCHA_ERROR_UNKNOWN="Erreur inconnue."
PLG_RECAPTCHA_ERROR_VERIFY_PARAMS_INCORRECT="Les paramètres vérifiés étaient incorrects; vérifiez que tous les paramètres requis soient indiqués."
; Privacy notice
PLG_RECAPTCHA_PRIVACY_CAPABILITY_IP_ADDRESS="Le plug-in reCAPTCHA Invisible s'intègre au système reCAPTCHA de Google en tant que service de protection anti-spam. Dans le cadre de ce service, l'adresse IP de l'utilisateur répondant au défi captcha est transmise à Google."
; Uncomment(remove the ";" from the beginning of the line) the following lines if reCAPTCHA is not available in your language
; When uncommenting, do NOT translate PLG_RECAPTCHA_CUSTOM_LANG
; As of 01/01/2012, the following languages do not need translation: en, nl, fr, de, pt, ru, es, tr
;PLG_RECAPTCHA_AUDIO_CHALLENGE="Get an audio challenge"
;PLG_RECAPTCHA_CANT_HEAR_THIS="Download sound as MP3"
;PLG_RECAPTCHA_CUSTOM_LANG="true"
;PLG_RECAPTCHA_HELP_BTN="Help"
;PLG_RECAPTCHA_INCORRECT_TRY_AGAIN="Incorrect. Try again."
;PLG_RECAPTCHA_INSTRUCTIONS_AUDIO="Type what you hear:"
;PLG_RECAPTCHA_INSTRUCTIONS_VISUAL="Type the two words:"
;PLG_RECAPTCHA_PLAY_AGAIN="Play sound again"
;PLG_RECAPTCHA_REFRESH_BTN="Get a new challenge"
;PLG_RECAPTCHA_VISUAL_CHALLENGE="Get a visual challenge"
language/fr-FR/fr-FR.plg_finder_contacts.ini000060400000001544152453623440014676 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8 - No BOM


PLG_FINDER_CONTACTS="Indexation - Contacts"
PLG_FINDER_CONTACTS_XML_DESCRIPTION="Ce plug-in permet l'indexation des contacts du composant de Joomla dans la recherche avancée."

PLG_FINDER_QUERY_FILTER_BRANCH_S_CONTACT="Contact"
PLG_FINDER_QUERY_FILTER_BRANCH_S_REGION="Région"
PLG_FINDER_QUERY_FILTER_BRANCH_S_COUNTRY="État"

PLG_FINDER_QUERY_FILTER_BRANCH_P_CONTACT="Contacts"
PLG_FINDER_QUERY_FILTER_BRANCH_P_REGION="Régions"
PLG_FINDER_QUERY_FILTER_BRANCH_P_COUNTRY="Pays"
language/fr-FR/fr-FR.mod_toolbar.ini000060400000001315152453623440013164 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

MOD_TOOLBAR="Menu des fonctions et extensions"
MOD_TOOLBAR_XML_DESCRIPTION="Le module 'mod_toolbar' affiche une barre d'outils dans les extensions natives à Joomla ou installées, avec des icônes comme 'Nouveau', 'Publier', 'Supprimer', etc.<br />Ce module doit être placé en position 'toolbar' avec le template par défaut de Joomla."language/fr-FR/fr-FR.plg_system_jce.ini000060400000001321152453623440013667 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_JCE="Système - JCE"
PLG_SYSTEM_JCE_XML_DESCRIPTION="Plugin Système JCE"

PLG_SYSTEM_JCE_COLUMN_STYLES_LABEL="Charger les styles des colonnes"
PLG_SYSTEM_JCE_COLUMN_STYLES_DESC="Chargez la feuille de style spécifique à l'affichage des colonnes. Si aucun framework CSS n'est sélectionné, ceci est nécessaire pour un affichage correcte des colonnes créées avec l'outil 'Colonnes' de l'éditeur."
language/fr-FR/fr-FR.plg_system_remember.sys.ini000060400000001212152453623440015540 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_REMEMBER_XML_DESCRIPTION="Fonction ajoutant un cookie dans le cache du navigateur pour éviter la déconnexion lors d'une inactivité sur le site dépassant celle spécifiée dans la configuration globale de Joomla!"
PLG_SYSTEM_REMEMBER="Système - Se souvenir de moi"language/fr-FR/fr-FR.plg_content_confirmconsent.sys.ini000060400000001154152453623440017124 0ustar00; @date        2018-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_CONTENT_CONFIRMCONSENT="Contenu - Confirmation de consentement"
PLG_CONTENT_CONFIRMCONSENT_XML_DESCRIPTION="Ce plugin ajoute une case à cocher de consentement obligatoire à un formulaire, par exemple le composant de contact du noyau."
language/fr-FR/fr-FR.plg_user_profile.ini000060400000007067152453623440014235 0ustar00; @date        2015-09-15
; @author      Joomla! Project
; @copyright   (C) 2005 - 2022 Open Source Matters, Inc. (https://www.joomla.org)
; @copyright   (C) 2005 - 2022 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_CONTENT_CHANGE_ARTICLE="Sélectionner ou changer cet article."
COM_CONTENT_CHANGE_ARTICLE_BUTTON="Sélectionner/Changer"
COM_CONTENT_SELECT_AN_ARTICLE="Sélectionner un article"
PLG_USER_PROFILE="Utilisateur - Profil"
PLG_USER_PROFILE_ERROR_INVALID_DOB="La date de naissance indiquée n'est pas valide. Veuillez indiquer une date valide."
PLG_USER_PROFILE_ERROR_INVALID_DOB_FUTURE_DATE="La date de naissance soumise est dans le futur."
PLG_USER_PROFILE_FIELD_ABOUT_ME_DESC="Choisissez une option pour le champ 'À propos de moi'"
PLG_USER_PROFILE_FIELD_ABOUT_ME_LABEL="À propos de moi"
PLG_USER_PROFILE_FIELD_ADDRESS1_DESC="Choisissez une option pour le champ 'Adresse 1'"
PLG_USER_PROFILE_FIELD_ADDRESS1_LABEL="Adresse 1"
PLG_USER_PROFILE_FIELD_ADDRESS2_DESC="Choisissez une option pour le champ 'Adresse 2'"
PLG_USER_PROFILE_FIELD_ADDRESS2_LABEL="Adresse 2"
PLG_USER_PROFILE_FIELD_CITY_DESC="Choisissez une option pour le champ 'Ville'"
PLG_USER_PROFILE_FIELD_CITY_LABEL="Ville"
PLG_USER_PROFILE_FIELD_COUNTRY_DESC="Choisissez une option pour le champ 'Pays'"
PLG_USER_PROFILE_FIELD_COUNTRY_LABEL="Pays"
PLG_USER_PROFILE_FIELD_DOB_DESC="Choisissez une option pour le champ 'Date de Naissance'"
PLG_USER_PROFILE_FIELD_DOB_LABEL="Date de Naissance"
PLG_USER_PROFILE_FIELD_FAVORITE_BOOK_DESC="Choisissez une option pour le champ 'Livre préféré'"
PLG_USER_PROFILE_FIELD_FAVORITE_BOOK_LABEL="Livre préféré"
PLG_USER_PROFILE_FIELD_NAME_PROFILE_REQUIRE_USER="Champs de profil utilisateur pour le formulaire de gestion de profil"
PLG_USER_PROFILE_FIELD_NAME_REGISTER_REQUIRE_USER="Champs de profil utilisateur pour le formulaire d'inscription"
PLG_USER_PROFILE_FIELD_PHONE_DESC="Choisissez une option pour le champ 'Téléphone'"
PLG_USER_PROFILE_FIELD_PHONE_LABEL="Téléphone"
PLG_USER_PROFILE_FIELD_POSTAL_CODE_DESC="Choisissez une option pour le champ 'Code Postal'"
PLG_USER_PROFILE_FIELD_POSTAL_CODE_LABEL="Code Postal"
PLG_USER_PROFILE_FIELD_REGION_DESC="Choisissez une option pour le champ 'Région'"
PLG_USER_PROFILE_FIELD_REGION_LABEL="Région"
PLG_USER_PROFILE_FIELD_TOS_ARTICLE_DESC="Sélectionnez dans la liste l'article à utiliser pour les conditions générales d'utilisation."
PLG_USER_PROFILE_FIELD_TOS_ARTICLE_LABEL="Article des conditions d'utilisation"
PLG_USER_PROFILE_FIELD_TOS_DESC="Choisissez une option pour les 'Conditions d'utilisation'"
PLG_USER_PROFILE_FIELD_TOS_DESC_SITE="Veuillez lire les conditions d'utilisation, vous ne pouvez pas vous inscrire si vous ne les acceptez pas."
PLG_USER_PROFILE_FIELD_TOS_LABEL="Conditions d'utilisation"
PLG_USER_PROFILE_FIELD_WEB_SITE_DESC="Choisissez une option pour le champ 'Site web'"
PLG_USER_PROFILE_FIELD_WEB_SITE_LABEL="Site web"
PLG_USER_PROFILE_FILL_FIELD_DESC_SITE="Si requis, veuillez compléter ce champ."
PLG_USER_PROFILE_OPTION_AGREE="J'accepte"
PLG_USER_PROFILE_OPTION_DO_NOT_AGREE="Je n'accepte pas"
PLG_USER_PROFILE_SLIDER_LABEL="Profil utilisateur"
; Adapt the following string to the format you entered in the 'DATE_FORMAT_CALENDAR_DATE'
PLG_USER_PROFILE_SPACER_DOB="La date de naissance doit être indiquée avec le format jour-mois-année. Exemple 05-11-1992"
PLG_USER_PROFILE_XML_DESCRIPTION="Système de prise en charge des champs de profil utilisateur"
language/fr-FR/fr-FR.plg_system_ic_library.sys.ini000060400000001034152453623440016063 0ustar00; iCagenda
; Copyright (c)2014 Cyril Rezé (Lyr!C) / JoomliC.com - All rights reserved.
; License GNU General Public License version 3 or later <http://www.gnu.org/licenses/gpl.html>
; Note : All ini files need to be saved as UTF-8
;
; PLG_SYSTEM_IC_LIBRARY	: plg_system_ic_library.sys.ini
; Translation Platform	: https://www.transifex.com/projects/p/icagenda/


PLG_SYSTEM_IC_LIBRARY = "Système - iC Library"
PLG_SYSTEM_IC_LIBRARY_XML_DESCRIPTION = "Ce plug-in permet d'utiliser les classes de la bibliothèque iC Library (by Jooml!C)."
language/fr-FR/fr-FR.mod_menu.ini000060400000015117152453623440012473 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2020 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2020 Open Source Matters. All rights reserved.
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


MOD_MENU="Menu d'administration"
MOD_MENU_CLEAR_CACHE="Purger le cache"
MOD_MENU_COMPONENTS="Composants"
MOD_MENU_COM_ACTIONLOGS="Log des actions utilisateur"
MOD_MENU_COM_CONTENT="Contenu"
MOD_MENU_COM_CONTENT_ARTICLE_MANAGER="Articles"
MOD_MENU_COM_CONTENT_CATEGORY_MANAGER="Catégories"
MOD_MENU_COM_CONTENT_FEATURED="Articles en vedette"
MOD_MENU_COM_CONTENT_NEW_ARTICLE="Ajouter un article"
MOD_MENU_COM_CONTENT_NEW_CATEGORY="Ajouter une catégorie"
MOD_MENU_COM_LANGUAGES_SUBMENU_CONTENT="Langues de contenu"
MOD_MENU_COM_LANGUAGES_SUBMENU_INSTALLED="Installées"
MOD_MENU_COM_LANGUAGES_SUBMENU_OVERRIDES="Substitutions"
MOD_MENU_COM_PRIVACY="Confidentialité"
MOD_MENU_COM_TEMPLATES_SUBMENU_STYLES="Styles"
MOD_MENU_COM_TEMPLATES_SUBMENU_TEMPLATES="Templates"
MOD_MENU_COM_USERS="Utilisateurs"
MOD_MENU_COM_USERS_ADD_GROUP="Ajouter un groupe"
MOD_MENU_COM_USERS_ADD_LEVEL="Ajouter un niveau d'accès"
MOD_MENU_COM_USERS_ADD_USER="Ajouter un utilisateur"
MOD_MENU_COM_USERS_GROUPS="Groupes"
MOD_MENU_COM_USERS_LEVELS="Niveaux d'accès"
MOD_MENU_COM_USERS_USERS="Utilisateurs"
MOD_MENU_COM_USERS_USER_MANAGER="Utilisateurs"
MOD_MENU_COM_USERS_ADD_NOTE="Ajouter une note utilisateur"
MOD_MENU_COM_USERS_NOTES="Notes utilisateurs"
MOD_MENU_COM_USERS_NOTE_CATEGORIES="Catégories des notes"
MOD_MENU_CONFIGURATION="Configuration"
MOD_MENU_CONTROL_PANEL="Panneau d'administration"
MOD_MENU_EXTENSIONS_EXTENSIONS="Extensions"
MOD_MENU_EXTENSIONS_EXTENSION_MANAGER="Gérer"
MOD_MENU_EXTENSIONS_LANGUAGE_MANAGER="Langues"
MOD_MENU_EXTENSIONS_MODULE_MANAGER="Modules"
MOD_MENU_EXTENSIONS_PLUGIN_MANAGER="Plug-ins"
MOD_MENU_EXTENSIONS_TEMPLATE_MANAGER="Templates"
MOD_MENU_FIELD_CHECK_DESC="Vérifier ou non que le menu administrateur sélectionné contient bien les liens de menu indispensables."
MOD_MENU_FIELD_CHECK_LABEL="Vérifier le menu"
MOD_MENU_FIELD_FORUMURL_DESC="Il est possible de spécifier l'URL d'un autre forum que celui par défaut."
MOD_MENU_FIELD_FORUMURL_LABEL="Forum de support spécifique"
MOD_MENU_FIELD_MENUTYPE_LABEL="Menu à afficher"
MOD_MENU_FIELD_MENUTYPE_DESC="Choisir quel menu sera affiché par ce module"
MOD_MENU_FIELD_MENUTYPE_OPTION_PREDEFINED="Utiliser un préréglage"
MOD_MENU_FIELD_PRESET_LABEL="Choisir in préréglage"
MOD_MENU_FIELD_PRESET_DESC="Choisir un préréglage à utiliser comme menu de l'administration."
MOD_MENU_FIELD_SHOWHELP="Menu Aide"
MOD_MENU_FIELD_SHOWHELP_DESC="Afficher/Masquer le menu d'aide incluant un certain nombre de liens vers des sites joomla.org, utiles aux utilisateurs."
MOD_MENU_FIELD_SHOWNEW="Raccourcis 'Ajouter'"
MOD_MENU_FIELD_SHOWNEW_DESC="Afficher/Masquer les raccourcis en sous-menu nommés 'Ajouter un...' pour les groupes et utilisateurs ayant les droits d'ajout (soit catégorie, article, lien, utilisateur, etc.)."
MOD_MENU_FIELDS="Champs"
MOD_MENU_FIELDS_GROUP="Groupes de champs"
MOD_MENU_GLOBAL_CHECKIN="Déverrouiller"
MOD_MENU_HELP="Aide"
MOD_MENU_HELP_COMMUNITY="Portail de la communauté"
MOD_MENU_HELP_CURRENT="Aide pour cette page"
MOD_MENU_HELP_DEVELOPER="Ressources développeurs"
MOD_MENU_HELP_DOCUMENTATION="Documentation Wiki"
MOD_MENU_HELP_EXTENSIONS="Extensions Joomla!"
MOD_MENU_HELP_JOOMLA="Aide Joomla!"
MOD_MENU_HELP_LINKS="Liens utiles Joomla!"
MOD_MENU_HELP_RESOURCES="Ressources Joomla!"
MOD_MENU_HELP_SECURITY="Centre de sécurité"
MOD_MENU_HELP_SHOP="Boutique Joomla!"
MOD_MENU_HELP_SUPPORT_OFFICIAL_FORUM="Forum de support officiel"
; the string below will be used if the localised sample data has a URL for the desired community forum or if the 'Custom Support Forum' field parameter in the Administrator Menu module has a URL
MOD_MENU_HELP_SUPPORT_CUSTOM_FORUM="Forum personnalisé"
; Enter in the string below the # of the specific language forum in https://forum.joomla.org/ (example: 19 for French). If left empty, it will use '511' which is the section for all languages forums.
MOD_MENU_HELP_SUPPORT_OFFICIAL_LANGUAGE_FORUM_VALUE="19"
; If you have chosen to display in the string above the section for all languages, translate the string below. 
; If you have displayed the specific language forum, use something like "Official French Forum" in your language. 
MOD_MENU_HELP_SUPPORT_OFFICIAL_LANGUAGE_FORUM="Forum officiel français"
MOD_MENU_HELP_TRANSLATIONS="Traductions Joomla!"
MOD_MENU_HELP_XCHANGE="Stack Exchange"
MOD_MENU_HOME_DEFAULT="Accueil"
MOD_MENU_HOME_MULTIPLE="Attention! Pages d'accueil multiples!"
MOD_MENU_IMPORTANT_ITEM_MENU_MANAGER="Gestionnaire de menus"
MOD_MENU_IMPORTANT_ITEM_MODULE_MANAGER="Gestionnaire de modules"
MOD_MENU_IMPORTANT_ITEM_COMPONENTS_CONTAINER="Conteneur de menu de composants"
MOD_MENU_IMPORTANT_ITEMS_INACCESSIBLE_LIST_WARNING="Le menu administrateur actif <strong>%1$s</strong> ne contient pas les liens - <strong>%2$s</strong>. Cliquer pour <strong><a href='%3$s'>activer le mode de récupération de menus</a></strong>."
MOD_MENU_INSTALLER_SUBMENU_DATABASE="Base de données"
MOD_MENU_INSTALLER_SUBMENU_DISCOVER="Découvrir"
MOD_MENU_INSTALLER_SUBMENU_INSTALL="Installation"
MOD_MENU_INSTALLER_SUBMENU_LANGUAGES="Installation de langues"
MOD_MENU_INSTALLER_SUBMENU_MANAGE="Gestion"
MOD_MENU_INSTALLER_SUBMENU_UPDATE="Mises à jour"
MOD_MENU_INSTALLER_SUBMENU_UPDATESITES="Sites de mise à jour"
MOD_MENU_INSTALLER_SUBMENU_WARNINGS="Avertissements"
MOD_MENU_LOGOUT="Déconnexion"
MOD_MENU_MASS_MAIL_USERS="Envoi d'e-mails en nombre"
MOD_MENU_MEDIA_MANAGER="Médias"
MOD_MENU_MENUS="Menus"
MOD_MENU_MENUS_ALL_ITEMS="Tous les liens de menu"
MOD_MENU_MENU_MANAGER="Gérer"
MOD_MENU_MENU_MANAGER_NEW_MENU="Ajouter un menu"
MOD_MENU_MENU_MANAGER_NEW_MENU_ITEM="Ajouter un lien de menu"
MOD_MENU_NEW_PRIVATE_MESSAGE="Nouveau message privé"
MOD_MENU_PURGE_EXPIRED_CACHE="Effacer les fichiers cache expirés"
MOD_MENU_READ_PRIVATE_MESSAGES="Lire les messages privés"
MOD_MENU_RECOVERY_EXIT="Désactiver le mode de récupération"
MOD_MENU_RECOVERY_MENU_ROOT="Récupération de menu"
MOD_MENU_SETTINGS="Paramètres"
MOD_MENU_MAINTENANCE="Maintenance"
MOD_MENU_SYSTEM_INFORMATION="Informations système"
MOD_MENU_SYSTEM="Système"
MOD_MENU_TOOLS="Outils"
MOD_MENU_USER_PROFILE="Mon profil"
MOD_MENU_XML_DESCRIPTION="Le module 'mod_menu' affiche les liens d'un menu de l'administration.<br />Ce module doit être placé en position 'menu' avec le template par défaut de Joomla."
language/fr-FR/fr-FR.mod_custom.ini000060400000001465152453623440013042 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


MOD_CUSTOM="Contenu personnalisé"
MOD_CUSTOM_FIELD_PREPARE_CONTENT_DESC="Activer/Désactiver la prise en charge des plug-ins de contenu."
MOD_CUSTOM_FIELD_PREPARE_CONTENT_LABEL="Plug-ins de contenu"
MOD_CUSTOM_XML_DESCRIPTION="Le module 'mod_custom' permet de créer vos propres modules personnalisés en y intégrant les contenus souhaités à l'aide de l'éditeur, code inclus si les droits de l'éditeur et de Joomla vous le permettent."
language/fr-FR/fr-FR.com_plugins.sys.ini000060400000001157152453623440014023 0ustar00; @date        2015-05-26
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_PLUGINS="Plug-ins"
COM_PLUGINS_XML_DESCRIPTION="Ce composant gère les plug-ins de Joomla."

COM_PLUGINS_PLUGINS_VIEW_DEFAULT_DESC="Affiche une liste de plug-ins à gérer."
COM_PLUGINS_PLUGINS_VIEW_DEFAULT_TITLE="Gestionnaire de plug-ins"
language/fr-FR/fr-FR.plg_jce_popups-rokbox.ini000060400000003317152453623440015202 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_JCE_POPUPS_ROKBOX="Popup RokBox de RocketTheme pour JCE"
PLG_JCE_POPUPS_ROKBOX_XML_DESC="Plugin permettant la prise en charge des Popup RokBox de RocketTheme avec JCE. Nécessite l'installation et l'activation de RokBox. - <a href='http://www.rockettheme.com/extensions-joomla/rokbox' title='Obtenir RocketTheme de RokBox' target='_blank'><strong>Obtenir RocketTheme de RokBox</strong></a>"
WF_POPUPS_ROKBOX_TITLE="RokBox de RocketTheme"
WF_POPUPS_ROKBOX_DESC="Plugin permettant la prise en charge des Popup RokBox de RocketTheme. Nécessite l'installation et l'activation de RokBox. - <a href='http://www.rockettheme.com/extensions-joomla/rokbox' title='Obtenir RocketTheme de RokBox' target='_blank'><strong>Obtenir RocketTheme de RokBox</strong></a>."

WF_POPUPS_ROKBOX_OPTION_ALBUM="Nom de l'album"
WF_POPUPS_ROKBOX_OPTION_ALBUM_DESC="Nom de l'album::Associer cette popup à un album"
WF_POPUPS_ROKBOX_OPTION_CAPTION="Légende"
WF_POPUPS_ROKBOX_OPTION_CAPTION_DESC="Légende::Légende de popup"
WF_POPUPS_ROKBOX_OPTION_ELEMENT="Élément"
WF_POPUPS_ROKBOX_OPTION_ELEMENT_DESC="Élément::Spécifie l'élément du DOM (à l'aide de sélecteurs de style CSS) à afficher dans la fenêtre popup."
WF_POPUPS_ROKBOX_OPTION_THUMBNAIL="Générer une vignette"
WF_POPUPS_ROKBOX_OPTION_THUMBNAIL_DESC="Générer une vignette::Déclenche la génération automatique d'une vignette par RokBox2 si le lien renvoie à une image locale."
language/fr-FR/fr-FR.com_categories.sys.ini000060400000002300152453623440014456 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_CATEGORIES="Catégories"
COM_CATEGORIES_CATEGORIES_VIEW_DEFAULT_DESC="Afficher une liste de toutes les catégories dans le composant sélectionné."
COM_CATEGORIES_CATEGORIES_VIEW_DEFAULT_TITLE="Liste de toutes les catégories"
COM_CATEGORIES_CATEGORY_VIEW_EDIT_DESC="Ajouter une nouvelle catégorie dans le composant sélectionné"
COM_CATEGORIES_CATEGORY_VIEW_EDIT_TITLE="Ajouter une nouvelle catégorie"
COM_CATEGORIES_CHOOSE_COMPONENT_DESC="Sélectionner un composant auquel cette catégorie sera liée.<br />Si un composant utilisant des catégories n'est pas affiché dans la liste, s'assurer de créer au moins une catégorie pour celui-ci en utilisant le menu d'administration habituel."
COM_CATEGORIES_CHOOSE_COMPONENT_LABEL="Sélectionner un composant"
COM_CATEGORIES_XML_DESCRIPTION="Composant de gestion des catégories"
language/fr-FR/fr-FR.plg_system_weblinks.ini000060400000001112152453623440014742 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_SYSTEM_WEBLINKS="Système - Liens web"
PLG_SYSTEM_WEBLINKS_STATISTICS="Liens web"
PLG_SYSTEM_WEBLINKS_XML_DESCRIPTION="Ce plugin renvoie des informations statistiques du composant 'Liens web' de Joomla!"
language/fr-FR/fr-FR.com_weblinks.ini000060400000024767152453623440013357 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_WEBLINKS="Liens web"
COM_WEBLINKS_ACCESS_HEADING="Accès"
COM_WEBLINKS_BATCH_OPTIONS="Traiter par lot les liens sélectionnés"
COM_WEBLINKS_BATCH_TIP="Si le choix est de copier un lien, tout autre action sélectionnée sera appliquée au lien copié. Autrement, les actions seront appliquées au lien sélectionné."
COM_WEBLINKS_CATEGORIES_DESC="Ces paramètres s'appliquent à toutes les catégories. Ils peuvent toutefois être modifiés par les paramètres du lien de menu correspondant."
COM_WEBLINKS_CATEGORY_DESC="Ces paramètres s'appliquent à tous les liens de la catégorie. Ils peuvent toutefois être modifiés par les paramètres du lien de menu correspondant."
COM_WEBLINKS_CHANGE_WEBLINK="Sélectionner ou modifier un lien Web"
COM_WEBLINKS_COMPONENT_DESC="Ces paramètres s'appliquent à tous les liens. Ils peuvent toutefois être modifiés par les paramètres du lien de menu correspondant."
COM_WEBLINKS_COMPONENT_LABEL="Liens web"
COM_WEBLINKS_CONFIG_INTEGRATION_SETTINGS_DESC="Ces paramètres permettent de déterminer les extensions qui s'intègrent au composant et de quelle façon."
COM_WEBLINKS_CONFIGURATION="Paramètres du Gestionnaire de liens"
COM_WEBLINKS_EDIT_WEBLINK="Modifier le lien"
COM_WEBLINKS_ERR_TABLES_NAME="Il existe déjà dans cette catégorie un lien web avec ce nom. Veuillez l'adapter."
COM_WEBLINKS_ERR_TABLES_PROVIDE_URL="Veuillez fournir une adresse URL valide."
COM_WEBLINKS_ERR_TABLES_TITLE="Votre lien web doit contenir un titre."
COM_WEBLINKS_ERROR_UNIQUE_ALIAS="Un autre lien web de cette catégorie possède le même alias. (rappel : ce lien web peut se trouver dans la corbeille)."
COM_WEBLINKS_FIELD_ALIAS_DESC="L'alias est pour usage interne uniquement. Laissez ce champ vide et Joomla va remplir avec une valeur par défaut du titre. Il doit être unique pour chaque lien web dans la même catégorie."
COM_WEBLINKS_FIELD_CATEGORY_DESC="Choisissez une catégorie pour ce lien web."
COM_WEBLINKS_FIELD_CATEGORYCHOOSE_DESC="Veuillez choisir la catégorie de liens web à afficher"
COM_WEBLINKS_FIELD_CAPTCHA_DESC="Sélectionnez le plug-in Captcha qui doit être utilisé dans le formulaires de proposition de liens web.<br />Vérifiez que les informations requises soient indiquées dans les paramètres du plug-in, accessible depuis la gestion des plug-ins de Joomla. Si 'Paramètre par défaut' est sélectionné, assurez-vous qu'un plug-in Captcha est choisi dans la Configuration globale."
COM_WEBLINKS_FIELD_CAPTCHA_LABEL="Autoriser le Captcha sur un lien web"
COM_WEBLINKS_FIELD_CONFIG_CAT_SHOWNUMBERS_DESC="Afficher/Masquer le nombre de liens Web dans chaque catégorie."
COM_WEBLINKS_FIELD_CONFIG_CAT_SHOWNUMBERS_LABEL="# liens web"
COM_WEBLINKS_FIELD_CONFIG_COUNTCLICKS_DESC="Si oui, le nombre de clics sur le lien sera comptabilisé."
COM_WEBLINKS_FIELD_CONFIG_COUNTCLICKS_LABEL="Compter les clics"
COM_WEBLINKS_FIELD_CONFIG_DESCRIPTION_DESC="Afficher/Masquer la description ci-dessous"
COM_WEBLINKS_FIELD_CONFIG_HITS_DESC="Afficher/Masquer les clics sur le lien"
COM_WEBLINKS_FIELD_CONFIG_ICON_DESC="Si 'Icône' est choisi ci-dessus, sélectionnez une icône pour afficher les liens web. Si aucune n'est sélectionnée, l'icône par défaut sera utilisée."
COM_WEBLINKS_FIELD_CONFIG_ICON_LABEL="Sélectionner l'icône"
COM_WEBLINKS_FIELD_CONFIG_LINKDESCRIPTION_DESC="Afficher/Masquer la description des liens."
COM_WEBLINKS_FIELD_CONFIG_LINKDESCRIPTION_LABEL="Description des liens"
COM_WEBLINKS_FIELD_CONFIG_OTHERCATS_DESC="Afficher/Masquer les autres catégories"
COM_WEBLINKS_FIELD_CONFIG_OTHERCATS_LABEL="Autres catégories"
COM_WEBLINKS_FIELD_CONFIG_SHOWREPORT_DESC="Afficher/Masquer l'option permettant de signaler un lien rompu."
COM_WEBLINKS_FIELD_CONFIG_SHOWREPORT_LABEL="Rapports"
COM_WEBLINKS_FIELD_COUNTCLICKS_DESC="Si oui, le nombre de clics sur le lien sera comptabilisé."
COM_WEBLINKS_FIELD_COUNTCLICKS_LABEL="Compter les clics"
COM_WEBLINKS_FIELD_DESCRIPTION_DESC="Saisir une description pour le lien web."
COM_WEBLINKS_FIELD_DISPLAY_NUM_DESC="Nombre de liens web affichés par défaut sur une page."
COM_WEBLINKS_FIELD_DISPLAY_NUM_LABEL="# liens web de la liste."
COM_WEBLINKS_FIELD_FIRST_DESC="Première image à afficher"
COM_WEBLINKS_FIELD_FIRST_LABEL="Première image"

COM_WEBLINKS_FIELD_HEIGHT_DESC="Hauteur de la fenêtre pop-up ou modale. Par défaut 600x500 si un des champs est laissé vide."
COM_WEBLINKS_FIELD_HEIGHT_LABEL="Hauteur"
COM_WEBLINKS_FIELD_ICON_DESC="Afficher un texte, une icône ou seul le lien web. 'Icône' est choisi par défaut."
COM_WEBLINKS_FIELD_ICON_LABEL="Texte/Icône/Lien seul"
COM_WEBLINKS_FIELD_ICON_OPTION_ICON="Icône"
COM_WEBLINKS_FIELD_ICON_OPTION_TEXT="Texte"
COM_WEBLINKS_FIELD_ICON_OPTION_WEBLINK="Lien seul"
COM_WEBLINKS_FIELD_IMAGE_ALT_DESC="Texte alternatif (balise 'alt') utilisé pour les visiteurs n'ayant pas accès aux images. Ce texte est remplacé par celui de la légende si elle existe."
COM_WEBLINKS_FIELD_IMAGE_ALT_LABEL="Texte alternatif"
COM_WEBLINKS_FIELD_IMAGE_CAPTION_DESC="Légende de l'image"
COM_WEBLINKS_FIELD_IMAGE_CAPTION_LABEL="Légende"

COM_WEBLINKS_FIELD_LANGUAGE_DESC="Assigner ce lien web à une langue."
COM_WEBLINKS_FIELD_MODIFIED_DESC="La date et l'heure du lien ont été modifiés"
COM_WEBLINKS_FIELD_SECOND_DESC="Seconde image à afficher"
COM_WEBLINKS_FIELD_SECOND_LABEL="Seconde image"
COM_WEBLINKS_FIELD_SELECT_CATEGORY_DESC="Sélectionnez la catégorie de liens web à afficher"
COM_WEBLINKS_FIELD_SELECT_CATEGORY_LABEL="Catégorie de liens"
COM_WEBLINKS_FIELD_SHOW_CAT_TAGS_DESC="Afficher les tags d'une catégorie"
COM_WEBLINKS_FIELD_SHOW_CAT_TAGS_LABEL="Afficher les tags"
COM_WEBLINKS_FIELD_SHOW_TAGS_DESC="Afficher les tags d'un lien web"
COM_WEBLINKS_FIELD_SHOW_TAGS_LABEL="Afficher les tags"
COM_WEBLINKS_FIELD_STATE_DESC="Statut de publication du lien."
COM_WEBLINKS_FIELD_TARGET_DESC="Fenêtre cible du lien web."
COM_WEBLINKS_FIELD_TARGET_LABEL="Cible du lien"
COM_WEBLINKS_FIELD_TITLE_DESC="Le lien web doit avoir un titre."
COM_WEBLINKS_FIELD_URL_DESC="Adresse URL du lien web. Les liens IDN (Noms de domaines internationaux) sont convertis en punycode lors de la sauvegarde."
COM_WEBLINKS_FIELD_URL_LABEL="Adresse URL"
COM_WEBLINKS_FIELD_VALUE_REPORTED="Rapporté"
COM_WEBLINKS_FIELD_VERSION_DESC="Nombre de révision du lien web (correspond au nombre d'application de la fonction 'Enregistrer')."
COM_WEBLINKS_FIELD_VERSION_LABEL="Révision"
COM_WEBLINKS_FIELD_WIDTH_DESC="Largeur de la fenêtre pop-up ou modale. Par défaut 600x500 si un des champs est laissé vide."
COM_WEBLINKS_FIELD_WIDTH_LABEL="Largeur"
COM_WEBLINKS_FIELDSET_IMAGES="Images"
COM_WEBLINKS_FIELDSET_OPTIONS="Paramètres"
COM_WEBLINKS_FILTER_CATEGORY="Filtrer la catégorie"
COM_WEBLINKS_FILTER_SEARCH_DESC="Recherche dans le titre ou l'alias du lien web. Préfixe avec id: rechercher une ID de lien web."
COM_WEBLINKS_FILTER_SEARCH_LABEL="Recherche de liens web"
COM_WEBLINKS_FILTER_STATE="Filtrer le statut"
COM_WEBLINKS_FLOAT_FIRST_DESC="Contrôle de la position de la première image."
COM_WEBLINKS_FLOAT_FIRST_LABEL="Position de la 1ère image"
COM_WEBLINKS_FLOAT_SECOND_DESC="Contrôle de la position de la seconde image."
COM_WEBLINKS_FLOAT_SECOND_LABEL="Position de la 2ème image"
COM_WEBLINKS_HEADING_ASSOCIATION="Association"
COM_WEBLINKS_HITS_DESC="Nombre de clics sur ce lien"
COM_WEBLINKS_LEFT="Gauche"
COM_WEBLINKS_LIST_LAYOUT_DESC="Ces paramètres s'appliquent dans l'affichage en liste des liens web."
COM_WEBLINKS_MANAGER_WEBLINK="Liens web"
COM_WEBLINKS_MANAGER_WEBLINKS="Liens web"
COM_WEBLINKS_MANAGER_WEBLINK_EDIT="Liens web : Modifier un lien"
COM_WEBLINKS_MANAGER_WEBLINK_NEW="Liens web : Ajouter un lien"
COM_WEBLINKS_N_ITEMS_ARCHIVED="%d liens archivés."
COM_WEBLINKS_N_ITEMS_ARCHIVED_1="%d lien archivé."
COM_WEBLINKS_N_ITEMS_CHECKED_IN_0="Aucun lien web testé."
COM_WEBLINKS_N_ITEMS_CHECKED_IN_1="%d lien web testé."
COM_WEBLINKS_N_ITEMS_CHECKED_IN_MORE="%d liens web testé."
COM_WEBLINKS_N_ITEMS_DELETED="%d liens web supprimés."
COM_WEBLINKS_N_ITEMS_DELETED_1="%d lien web supprimé."
COM_WEBLINKS_N_ITEMS_PUBLISHED="%d liens web publiés."
COM_WEBLINKS_N_ITEMS_PUBLISHED_1="%d lien web publié."
COM_WEBLINKS_N_ITEMS_TRASHED="%d liens web mis à la corbeille."
COM_WEBLINKS_N_ITEMS_TRASHED_1="%d lien web mis à la corbeille."
COM_WEBLINKS_N_ITEMS_UNPUBLISHED="%d liens web dépubliés."
COM_WEBLINKS_N_ITEMS_UNPUBLISHED_1="%d liens web publiés."
COM_WEBLINKS_NEW_WEBLINK="Nouveau lien web"
COM_WEBLINKS_NONE="Aucune"
COM_WEBLINKS_OPTION_FILTER_ACCESS="- Filtrer l'accès -"
COM_WEBLINKS_OPTION_FILTER_CATEGORY="- Filtrer la catégorie -"
COM_WEBLINKS_OPTION_FILTER_PUBLISHED="- Filtrer le statut -"
COM_WEBLINKS_OPTIONS="Paramètres"
COM_WEBLINKS_ORDER_HEADING="Ordre"
COM_WEBLINKS_RIGHT="Droite"
COM_WEBLINKS_SAVE_SUCCESS="Lien web enregistré"
COM_WEBLINKS_SEARCH_IN_TITLE="Rechercher dans le titre"
COM_WEBLINKS_SELECT_A_WEBLINK="Sélectionner un lien Web"
COM_WEBLINKS_SHOW_EMPTY_CATEGORIES_DESC="Si visible, les catégories vides seront affichées. Une catégorie est vide uniquement si elle ne contient ni lien web ni sous-catégorie."
COM_WEBLINKS_SUBMENU_CATEGORIES="Catégories"
COM_WEBLINKS_SUBMENU_WEBLINKS="Liens Web"
COM_WEBLINKS_WEBLINKS="Liens Web"
COM_WEBLINKS_XML_DESCRIPTION="Composant de gestion des liens web."
JGLOBAL_NO_ITEM_SELECTED="Aucun lien sélectionné"
JGLOBAL_NEWITEMSLAST_DESC="Les nouveaux liens sont mis par défaut en dernière position.<br />Vous pouvez la changer après avoir validé l'enregistrement."
JLIB_APPLICATION_ERROR_BATCH_CANNOT_CREATE="Vous n'êtes pas autorisé à créer de nouveaux liens dans cette catégorie"
JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT="Vous n'êtes pas autorisé à modifier un ou plusieurs des liens sélectionnés"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_WEBLINKS="Les modification ne s'appliquent qu'à ce composant.<br /><em><strong>Hérité</strong></em> - les droits globaux ou ceux des groupes parents seront utilisés.<br /><em><strong>Refusé</strong></em> - prévaut toujours, quels que soient les droits globaux ou ceux des groupes parents, et s'applique aux éléments enfants.<br /><em><strong>Autorisé</strong></em> - le groupe concerné pourra effectuer cette action dans ce composant sauf si les droits globaux sont différents."
language/fr-FR/fr-FR.plg_fields_usergrouplist.ini000060400000002006152453623440016000 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_USERGROUPLIST="Champs - Groupes d'utilisateurs"
PLG_FIELDS_USERGROUPLIST_DEFAULT_VALUE_DESC="Une liste d'IDs de groupes d'utilisateurs séparées par des virgules."
PLG_FIELDS_USERGROUPLIST_DEFAULT_VALUE_LABEL="Groupes d'utilisateurs par défaut"
PLG_FIELDS_USERGROUPLIST_LABEL="Groupes d'utilisateurs (%s)"
PLG_FIELDS_USERGROUPLIST_PARAMS_MULTIPLE_DESC="Permet la sélection de valeurs multiples."
PLG_FIELDS_USERGROUPLIST_PARAMS_MULTIPLE_LABEL="Multiple"
PLG_FIELDS_USERGROUPLIST_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'usergrouplist' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_editors-xtd_contact.ini000060400000001271152453623440015507 0ustar00; @date        2016-10-27
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_EDITORS-XTD_CONTACT="Bouton - Contact"
PLG_EDITORS-XTD_CONTACT_BUTTON_CONTACT="Contact"
PLG_EDITORS-XTD_CONTACT_XML_DESCRIPTION="Affiche un bouton sous l'éditeur pour insérer dans un contenu un lien vers un contact.<br />Ouvre une fenêtre pop-up permettant de choisir le contact vers lequel effectuer le lien."
language/fr-FR/fr-FR.plg_twofactorauth_yubikey.sys.ini000060400000001461152453623440016777 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_TWOFACTORAUTH_YUBIKEY="Authentification en deux étapes - YubiKey"
PLG_TWOFACTORAUTH_YUBIKEY_XML_DESCRIPTION="Permet aux utilisateurs de votre site d'utiliser l'authentification en deux étapes en se servant d'une clé USB de sécurité YubiKey. Les utilisateurs doivent se procurer leur propre YubiKey sur  https://www.yubico.com/. Pour utiliser l'authentification en deux étapes, modifier le profil de l'utilisateur et l'activer."
language/fr-FR/fr-FR.plg_content_vote.ini000060400000001534152453623440014237 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_CONTENT_VOTE="Contenu - Vote sur article"
PLG_VOTE_BOTTOM="Bas"
PLG_VOTE_LABEL="Veuillez voter"
PLG_VOTE_POSITION_DESC="Choisir l'affichage des votes."
PLG_VOTE_POSITION_LABEL="Position"
PLG_VOTE_RATE="Vote"
PLG_VOTE_STAR_ACTIVE="Etoiles actives"
PLG_VOTE_STAR_INACTIVE="Etoiles inactives"
PLG_VOTE_TOP="Haut"
PLG_VOTE_USER_RATING="Vote utilisateur:&#160;%1$s&#160;/&#160;%2$s"
PLG_VOTE_VOTE="Vote %s"
PLG_VOTE_XML_DESCRIPTION="Système de vote/appréciation sur les articles"
language/fr-FR/fr-FR.plg_twofactorauth_totp.ini000060400000013355152453623440015474 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_TWOFACTORAUTH_TOTP="Authentification en deux étapes - Google Authenticator"
PLG_TWOFACTORAUTH_TOTP_ERR_VALIDATIONFAILED="Vous n'avez pas saisi un code de sécurité valide. Merci de vérifier les paramètres de votre Google Authenticator et assurez vous que l'horloge sur votre matériel est réglée de la même façon que l'horloge sur le site."
PLG_TWOFACTORAUTH_TOTP_INTRO="Cette fonctionnalité vous permet d'utiliser Google Authenticator ou une application compatible telle que FreeOTP, pour l'authentification en deux étapes. En plus de votre identifiant et de votre mot de passe vous devrez aussi saisir in code de sécurité à six chiffres pour vous connecter au site. Le code de sécurité varie toutes les 30 secondes. Ceci fournit une protection supplémentaire contre les hackers se connectant sur votre compte, même s'ils ont pu se procurer votre mot de passe."
PLG_TWOFACTORAUTH_TOTP_METHOD_TITLE="Google Authenticator"
PLG_TWOFACTORAUTH_TOTP_POSTINSTALL_TITLE="L'authentification en deux étapes est disponible."
PLG_TWOFACTORAUTH_TOTP_POSTINSTALL_BODY="<p>L'authentification en deux étapes est disponible nativement dans Joomla!. Ceci sécurise la connexion sur votre site avec un code secret secondaire qui change toutes les 30 secondes. Vous pouvez utiliser votre matériel mobile et l'application Google Authenticator pour produire ce code. Plus d'information sur <a href=\"https://en.wikipedia.org/wiki/Google_Authenticator\" target=\"_blank\">Google Authenticator</a> pour produire ce code.</p><p>En cliquant sur le bouton ci-dessous&nbsp;:</p><ul><li>Joomla! va activer le plug-in d'authentification en deux étapes</li><li>L'authentification en deux étapes sera disponible pour tous les utilisateurs.</li><li>Chaque utilisateur peut configurer l'authentification en deux étapes dans le profil de l'utilisateur.</li><li>Il est possible de désactiver le plug-in ou de ne l'activer que pour le côté administration du site.</li><li>Vous serez redirigé vers votre profil utilisateur où vous trouverez plus d'informations sur l'authentification en deux étapes et où vous pourrez l'activer pour votre compte utilisateur.</li></ul>"
PLG_TWOFACTORAUTH_TOTP_POSTINSTALL_ACTION="Activer l'authentification en deux étapes"
PLG_TWOFACTORAUTH_TOTP_SECTION_ADMIN="Administration"
PLG_TWOFACTORAUTH_TOTP_SECTION_BOTH="Les deux"
PLG_TWOFACTORAUTH_TOTP_SECTION_DESC="Choisir les sections de votre site pour lesquelles vous désirez activer l'authentification en deux étapes."
PLG_TWOFACTORAUTH_TOTP_SECTION_LABEL="Section du site"
PLG_TWOFACTORAUTH_TOTP_SECTION_SITE="Site"
PLG_TWOFACTORAUTH_TOTP_STEP1_HEAD="Étape 1 - Obtenir Google Authenticator"
PLG_TWOFACTORAUTH_TOTP_STEP1_ITEM1="Application Google Authenticator officielle pour Android, iOS et BlackBerry"
; Check the URL and change the part hl=en to your language tag if this is available (example hl=de; hl=zh-cn; hl=zh-tw)
PLG_TWOFACTORAUTH_TOTP_STEP1_ITEM1_LINK="https://support.google.com/accounts/bin/answer.py?hl=fr&answer=1066447"
PLG_TWOFACTORAUTH_TOTP_STEP1_ITEM2="Clients compatibles pour d'autres matériels et OS (listé dans Wikipedia)"
; Change and check this link if there is a translation in your language available. (current: German, Spanish, French, Japanese, Polish)
PLG_TWOFACTORAUTH_TOTP_STEP1_ITEM2_LINK="https://en.wikipedia.org/wiki/Google_Authenticator#Implementation"
PLG_TWOFACTORAUTH_TOTP_STEP1_TEXT="Télécharger et installer  <a href=\"https://en.wikipedia.org/wiki/Google_Authenticator\" target=\"_blank\">Google Authenticator</a> ou une application compatible telle que <a href=\"https://freeotp.github.io/\" target=\"_blank\">FreeOTP</a>, sur votre smartphone ou PC de bureau. Utiliser un des suivants :"
PLG_TWOFACTORAUTH_TOTP_STEP1_WARN="Merci de ne pas oublier de synchroniser l'horloge  de votre matériel avec un serveur d'heure. Une erreur d'heure peut vous empêcher de vous connecter à votre site."
PLG_TWOFACTORAUTH_TOTP_STEP2_ACCOUNT="Compte"
PLG_TWOFACTORAUTH_TOTP_STEP2_ALTTEXT="Vous pouvez également scanner le code de QR suivant dans Google Authenticator."
PLG_TWOFACTORAUTH_TOTP_STEP2_HEAD="Étape 2 - Paramétrer"
PLG_TWOFACTORAUTH_TOTP_STEP2_KEY="Clé"
PLG_TWOFACTORAUTH_TOTP_STEP2_RESET="Si vous désirez changer de clé, désactivez l'authentification en deux étapes. En le réactivant, une nouvelle clé sera générée."
PLG_TWOFACTORAUTH_TOTP_STEP2_TEXT="Il vous faudra saisir les informations suivantes à Google Authenticator ou application compatible."
PLG_TWOFACTORAUTH_TOTP_STEP3_HEAD="Étape 3 - Activer l'authentification en deux étapes"
PLG_TWOFACTORAUTH_TOTP_STEP3_SECURITYCODE="Code de sécurité"
PLG_TWOFACTORAUTH_TOTP_STEP3_TEXT="De façon à vérifier que tout est paramétré correctement, saisir le code de sécurité affiché dans Google Authenticator dans le champ ci-dessous. Puis sauvegarder votre profil utilisateur. Si le code est correct, la fonctionnalité d'authentification en deux étapes sera activée."
PLG_TWOFACTORAUTH_TOTP_XML_DESCRIPTION="Permet aux utilisateurs de votre site d'utiliser l'authentification en deux étapes en se servant de <a href=\"https://en.wikipedia.org/wiki/Google_Authenticator\" target=\"_blank\">Google Authenticator </a> ou autre générateurs compatibles de mots de passe à usage unique basé sur l'heure, tel que <a href=\"https://freeotp.github.io/\" target=\"_blank\">FreeOTP</a>. Pour utiliser l'authentification en deux étapes, modifier le profil de l'utilisateur et l'activer."
language/fr-FR/fr-FR.plg_jce_editor-ipa.sys.ini000060400000001010152453623440015210 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_JCE_EDITOR_IPA="Alphabet phonétique international pour JCE"
PLG_JCE_EDITOR_IPA_XML_DESC	="Plugin permettant d'utiliser la carte de caractères de l'alphabet phonétique international avec l'éditeur JCE"
language/fr-FR/fr-FR.plg_system_fmalertcookies.sys.ini000060400000012467152453623440016767 0ustar00PLG_SYSTEM_FMALERTCOOKIES="Folcomedia - Plugin alerte utilisation cookies"
PLG_SYSTEM_FMALERTCOOKIES_XML_DESCRIPTION="Folcomedia - Plugin alerte utilisation cookies<br/><br/>
<b style='color:red'>Note : les champs apparaissent lorsque le plugin est activé puis enregistré.</b><br/><br/>
Ce plugin a pour but d'afficher un message sur la page d'accueil de votre site pour alerter l'utilisateur que votre site utilise des cookies pour récolter diverses informations.
<br/><br/>
<a class='btn btn-default' href=\"index.php?option=com_plugins&view=plugins&filter_search=folcomedia\">Configurer</a><br/><br/>
**** V 1.3.5 ****<br/>
- Correction d'un problème avec la version de PHP 7.2<br/>
- Ajout de la langue allemande (Thomas Sommer).<br/><br/>
**** V 1.3.2 ****<br/>
- Amélioration SEO empêchant les robots des moteurs de recherche d'indexer le message d'alerte des cookies.<br/><br/>
**** V 1.3.1 ****<br/>
- Corrections de bugs.<br/>
- Améliorations visuelles des onglets des langues.<br/><br/>
**** V 1.3.0 ****<br/>
- Le plugin peut maintenant bloquer tous les cookies tant que le message n'a pas été accepté.<br/><br/>
**** V 1.2.15 ****<br/>
- Correction d'un problème SEO quand le message d'alerte était en haut de votre page.<br/>
- Possibilité d'afficher ou non le message quand votre site est en maintenance.<br/>
- Ajout de balise CSS afin de vous permettre de modifier le message comme vous le souhaitez.<br/><br/>
**** V 1.2.14 ****<br/>
- Ajout d'un bouton de donation pour soutenir le projet.<br/>
- Ajout de la langue Hongroise (Merci à Zoltan Balazs).<br/>
- Correction W3C.<br/><br/>
**** V 1.2.12 + 1.2.13 ****<br/>
- Optimisation du plugin.<br/><br/>
**** V 1.2.11 ****<br/>
- Suppression du framework Bootstrap.<br/>
- Optimisation du plugin pour la compatibilité avec les sites.<br/><br/>
**** V 1.2.10 ****<br/>
- Augmente la compatibilité avec les autres extensions.<br/><br/>
**** V 1.2.9 ****<br/>
- Correction d'une erreur W3C.<br/>
- Correction d'un bug lors de l'import sur certains sites.<br/>
- Correction d'un bug lors du calcul de la durée de vie du cookie.<br/><br/>
**** V 1.2.8 ****<br/>
- Correction d'un bug avec les sites qui utilisent plusieurs templates.<br/><br/>
**** V 1.2.7 ****<br/>
- Amélioration SEO.<br/>
- Amélioration de l'affichage du plugin sur les mobiles.<br/>
- Correction d'un problème de l'affichage du message d'alerte en mode pop-up sur mobile.<br/>
- Ajout d'un message d'avertissement quand votre langue par défaut de votre site n'est pas instanciée dans les langues de contenu.<br/><br/>
**** V 1.2.6 ****<br/>
- Ajout d'un lien FAQ et Documentation dans l'onglet support.<br/>
- Optimisations diverses.<br/><br/>
**** V 1.2.5 ****<br/>
- Le message d'alerte n'apparaît plus quand votre site est hors-ligne.<br/>
- Vous avez la possibilité maintenant de ne pas charger la librairie Bootsrap.<br/><br/>
**** V 1.2.4 ****<br/>
- Correction d'un bug en mode pop-up.<br/><br/>
**** V 1.2.3 ****<br/>
- Mise en place de la vérification de la présence du cookie du plugin en javascript pour afficher ou non le message.<br/><br/>
**** V 1.2.2 ****<br/>
- Correction d'un bug pour l'affichage en pop-up.<br/><br/>
**** V 1.2.1 ****<br/>
- Possibilité de choisir la durée de vie du cookie.<br/>
- Possibilité de choisir la couleur de fond des boutons.<br/>
- Correction du fonctionnement du plugin sur les sites multi-chemin.<br/><br/>
**** V 1.2.0 ****<br/>
- Ajout du choix de la transparence du message d'alerte.<br/>
- Vous pouvez Afficher / Masquer le message d'alerte en fonction des langues.<br/>
- Vous pouvez maintenant Exporter et Importer votre configuration.<br/><br/>
**** V 1.1.8 ****<br/>
- Vous pouvez choisir d'afficher le message d'alerte sur la page expliquant l'utilisation des cookies.<br/><br/>
**** V 1.1.7 ****<br/>
- Résolution des bugs avec les règles CSS.<br/>
- Choix de la version de bootstrap.<br/><br/>
**** V 1.1.6 ****<br/>
- Correction du paramètre z-index permettant d'afficher le message au-dessus de votre site.<br/>
- Ajout d'un fichier custom.css permettant d'ajouter vos propres règles CSS.<br/><br/>
**** V 1.1.5 ****<br/>
- Paramétrage des marges autour du message.<br/>
- Paramétrage de la position du contenu.<br/><br/>
**** V 1.1.4 ****<br/>
- Possibilité de fixer le message d'alerte sur l'écran.<br/>
- Il est possible dorénavant de définir la taille du message d'alerte en pixel ou en pourcentage.<br/>
- Choix dans l'ordre d'affichage des boutons.<br/>
- Possibilité d'afficher les boutons à la ligne ou à la suite du texte.<br/><br/>
**** V 1.1.3 ****<br/>
- Ajout du multilangue.<br/><br/>
**** V 1.1.2 ****<br/>
- Amélioration de la rapidité d'exécution.<br/>
- Correction de bugs.<br/><br/><br/><br/>"

PLG_SYSTEM_FMALERTCOOKIES_MESSAGE_ALERTE_LANGUE_DEFAUT_NON_PRESENTE = "<br/><br/>Attention !!! <br/><br/>Nous avons détecté que votre site utilise par défaut la langue \"%1$s\".<br/><br/>
Pourtant il se trouve que dans les \"langues de contenu\", cette langue n'est pas renseignée.<br/><br/>
Afin de faire fonctionner le message d'alerte pour cette langue, vous devez la rajouter en allant dans :<br/><br/>
<i>Extensions > Gestions des langues > Contenu > Nouveau </i><br/><br/>
Ou vous pouvez cliquer sur ce lien <a target=\"_blank\" href=\"%2$sadministrator/index.php?option=com_languages&view=languages\">Rajouter une langue de contenu</a> et ensuite sur \"Nouveau\"."
language/fr-FR/fr-FR.mod_multilangstatus.sys.ini000060400000001013152453623440015572 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

MOD_MULTILANGSTATUS="Statut multilangue"
MOD_MULTILANGSTATUS_XML_DESCRIPTION="Ce module affiche le statut des divers paramètres multilangues."

language/fr-FR/fr-FR.plg_jce_editor_fontawesome.sys.ini000060400000001225152453623440017060 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_JCE_EDITOR_FONTAWESOME="Font Awesome pour JCE"
PLG_JCE_EDITOR_FONTAWESOME_TITLE="Font Awesome"
PLG_JCE_EDITOR_FONTAWESOME_DESC="Plugin permettant d'insérer des icones Font Awesome dans les contenus avec l'éditeur JCE."
PLG_JCE_EDITOR_FONTAWESOME_XML_DESC="Plugin permettant d'insérer des icones Font Awesome dans les contenus avec l'éditeur JCE"language/fr-FR/fr-FR.plg_xmap_com_weblinks.ini000060400000004270152453623440015231 0ustar00; @package     Xmap
; @copyright   2007 - 2012 Joomla! Vargas. All rights reserved.
; @subpackage  fr-FR.plg_xmap_com_weblinks.ini 
; @description Traduction francophone - fr-FR
; @version     2.0.1 - 23.10.2012
; @author      Patrick Jollant alias PATSXM971 & Mihàly Marti alias Sarki
; @copyright   Joomlatutos.com - www.joomlautos.com
; @license     GNU General Public License version 2, or later
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8 - No BOM

XMAP_WL_PLUGIN="Xmap - Plug-in pour Liens web"
XMAP_WL_PLUGIN_DESCRIPTION="<p>Ce plug-in permet de prendre en charge les catégories et les liens web du composant Joomla dans les plans de site générés par Xmap.</p>"
XMAP_WL_SETTING_SHOW_LINKS_LABEL="Liens web"
XMAP_WL_SETTING_SHOW_LINKS_DESC="Choisissez si, et dans quel type de plan de site, les liens web doivent être inclus."
XMAP_WL_SETTING_MAX_LINKS_LABEL="Nombre max. de liens"
XMAP_WL_SETTING_MAX_LINKS_DESC="Nombre maximum de liens à inclure par catégorie (laisser vide pour illimité)"

XMAP_WL_CATEGORY_PRIORITY_LABEL="Priorité des catégories"
XMAP_WL_CATEGORY_PRIORITY_DESC="Définissez la priorité pour les catégories."
XMAP_WL_CATEGORY_CHANGEFREQ_LABEL="Fréquence des categories"
XMAP_WL_CATEGORY_CHANGEFREQ_DESC="Définissez la fréquence de changement des categories."
XMAP_WL_LINK_PRIORITY_LABEL="Priorité des liens"
XMAP_WL_LINK_PRIORITY_DESC="Définissez la priorité des liens."
XMAP_WL_LINK_CHANGEFREQ_LABEL="Fréquence des liens"
XMAP_WL_LINK_CHANGEFREQ_DESC="Définissez la fréquence de changement des liens."

; Generic Extension settings strings
COM_PLUGINS_BASIC_FIELDSET_LABEL="Paramètres de base"
COM_PLUGINS_XML_FIELDSET_LABEL="Paramètres du plan de site XML"
COM_PLUGINS_NEWS_FIELDSET_LABEL="Paramètres du plan de site News (google.com)"
XMAP_OPTION_USE_PARENT_MENU="Utiliser les paramètres du menu parent"
XMAP_OPTION_NEVER="Jamais"
XMAP_OPTION_ALWAYS="Toujours"
XMAP_OPTION_XML_ONLY="Dans le plan de site XML seulement"
XMAP_OPTION_HTML_ONLY="Dans le plan de site HTML seulement"
XMAP_OPTION_WEEKLY="Hebdomadaire"
XMAP_OPTION_DAILY="Quotidien"
XMAP_OPTION_MONTHLY="Mensuel"
XMAP_OPTION_YEARLY="Annuel"
XMAP_OPTION_HOURLY="Horaire"
language/fr-FR/fr-FR.plg_editors-xtd_fields.ini000060400000001551152453623440015323 0ustar00; @date        2017-02-06
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_EDITORS-XTD_FIELDS="Bouton - Champ"
PLG_EDITORS-XTD_FIELDS_BUTTON_FIELD="Champ"
PLG_EDITORS-XTD_FIELDS_XML_DESCRIPTION="Affiche un bouton qui permet d'insérer un champ personnalisé dans la zone de texte d'un éditeur. Affiche une fenêtre modale  permettant de choisir le champ.<br/><strong>Attention&nbsp;!&nbsp;: le champ personnalisé ne sera pas rendu si le plug-in <a href=\"index.php?option=com_plugins&view=plugins&filter[folder]=content\">Contenu - Champs</a> n'est pas activé."
language/fr-FR/fr-FR.com_finder.sys.ini000060400000001137152453623440013607 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

COM_FINDER="Recherche avancée"
COM_FINDER_XML_DESCRIPTION="Composant de recherche avancée"

COM_FINDER_MENU_SEARCH_VIEW_DEFAULT_TEXT="Recherche (mise en page par défaut)."
COM_FINDER_MENU_SEARCH_VIEW_DEFAULT_TITLE="Recherche"
language/fr-FR/fr-FR.plg_privacy_actionlogs.ini000060400000001153152453623440015424 0ustar00; @date        2018-09-02
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_PRIVACY_ACTIONLOGS="Confidentialité - Journaux des actions"
PLG_PRIVACY_ACTIONLOGS_XML_DESCRIPTION="Responsable de l'exportation des données du journal des actions pour la demande d'informations de confidentialité d'un utilisateur."
language/fr-FR/fr-FR.mod_quickicon.ini000060400000004043152453623440013510 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


MOD_QUICKICON="Icônes de raccourcis"
MOD_QUICKICON_ADD_NEW_ARTICLE="Ajouter un article"
MOD_QUICKICON_ARTICLE_MANAGER="Articles"
MOD_QUICKICON_CATEGORY_MANAGER="Catégories"
MOD_QUICKICON_CLEAR_CACHE="Effacer le cache"
MOD_QUICKICON_CONFIGURATION="Configuration"
MOD_QUICKICON_CONTENT="Contenu"
MOD_QUICKICON_EXTENSIONS="Extensions"
MOD_QUICKICON_EXTENSION_MANAGER="Gestion Extensions"
MOD_QUICKICON_FRONTPAGE_MANAGER="Gestion Page d'accueil"
MOD_QUICKICON_GLOBAL_CHECKIN="Déverrouillage global"
MOD_QUICKICON_GLOBAL_CONFIGURATION="Configuration"
MOD_QUICKICON_GROUP_DESC="Groupe de ce module comparé avec celui utilisée dans le plug-in <strong>Quick Icons</strong> (icônes de raccourcis de la page d'accueil de l'administration). Le groupe 'mod_quickicon' affiche toujours les icônes du noyau Joomla!"
MOD_QUICKICON_GROUP_LABEL="Groupe"
MOD_QUICKICON_INSTALL_EXTENSIONS="Installer Extensions"
MOD_QUICKICON_LANGUAGE_MANAGER="Langues"
MOD_QUICKICON_MAINTENANCE="Maintenance"
MOD_QUICKICON_MEDIA_MANAGER="Médias"
MOD_QUICKICON_MENU_MANAGER="Menus"
MOD_QUICKICON_MODULE_MANAGER="Modules"
MOD_QUICKICON_PROFILE="Modifier mon profil"
MOD_QUICKICON_STRUCTURE="Structure"
MOD_QUICKICON_SYSTEM_INFORMATION="Informations système"
MOD_QUICKICON_TEMPLATE_MANAGER="Templates"
MOD_QUICKICON_TITLE="Icônes de raccourcis"
MOD_QUICKICON_USER_MANAGER="Utilisateurs"
MOD_QUICKICON_USERS="Utilisateurs"
MOD_QUICKICON_XML_DESCRIPTION="<p>Le module 'mod_quickicon' affiche des icônes de raccourcis sur la page d'accueil de l'administration appelée également 'Panneau d'administration'.</p><ul><li>Ce module doit être placé en position 'icon' avec le template d'administration par défaut de Joomla.</li></ul>"
language/fr-FR/fr-FR.plg_system_languagefilter.ini000060400000007131152453623440016124 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2020 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2020 Open Source Matters. All rights reserved.
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SYSTEM_LANGUAGEFILTER="Système - Filtre de langue"
PLG_SYSTEM_LANGUAGEFILTER_BROWSER_SETTINGS="Paramètres du navigateur"
PLG_SYSTEM_LANGUAGEFILTER_FIELD_ALTERNATE_META_DESC="Ajouter des méta tags de remplacement pour les éléments associés à d'autres de différentes langues."
PLG_SYSTEM_LANGUAGEFILTER_FIELD_ALTERNATE_META_LABEL="Ajout de méta tags de remplacement"
PLG_SYSTEM_LANGUAGEFILTER_FIELD_AUTOMATIC_CHANGE_DESC="Cette option permet de changer automatiquement la langue de contenu du site lorsqu'un utilisateur enregistré change son paramètre de langue site."
PLG_SYSTEM_LANGUAGEFILTER_FIELD_AUTOMATIC_CHANGE_LABEL="Changement de langue automatique"
PLG_SYSTEM_LANGUAGEFILTER_FIELD_COOKIE_DESC="Les cookies de langue peuvent être configurés pour expirer à la fin de la session ou après une année. 'Session' par défaut."
PLG_SYSTEM_LANGUAGEFILTER_FIELD_COOKIE_LABEL="Durée des cookies"
PLG_SYSTEM_LANGUAGEFILTER_FIELD_DETECT_BROWSER_DESC="Choisir la langue par défaut du site ou tenter d'utiliser la langue par défaut du navigateur de l'utilisateur.<br />Si la langue du navigateur ne peut être détectée, c'est la langue par défaut du site qui sera utilisée."
PLG_SYSTEM_LANGUAGEFILTER_FIELD_DETECT_BROWSER_LABEL="Sélection de la langue pour les nouveaux visiteurs"
PLG_SYSTEM_LANGUAGEFILTER_FIELD_ITEM_ASSOCIATIONS_DESC="Cette option permet d'associer des éléments lors d'un changement de langue par le module 'Sélecteur de langue'. Les pages d'accueil par défaut sont toujours associées."
PLG_SYSTEM_LANGUAGEFILTER_FIELD_ITEM_ASSOCIATIONS_LABEL="Associations"
PLG_SYSTEM_LANGUAGEFILTER_FIELD_XDEFAULT_DESC="Cette option ajoute le méta tag x-default pour améliorer le SEO"
PLG_SYSTEM_LANGUAGEFILTER_FIELD_XDEFAULT_LABEL="Ajouter le méta tag x-default"
PLG_SYSTEM_LANGUAGEFILTER_FIELD_XDEFAULT_LANGUAGE_DESC="Choisir la langue du x-default."
PLG_SYSTEM_LANGUAGEFILTER_FIELD_XDEFAULT_LANGUAGE_LABEL="Langue du x-default"
PLG_SYSTEM_LANGUAGEFILTER_OPTION_DEFAULT_LANGUAGE="Langue par défaut du site"
PLG_SYSTEM_LANGUAGEFILTER_FIELD_REMOVE_DEFAULT_PREFIX_DESC="Enlever le préfixe défini pour la langue par défaut du site lorsque la réécriture d'URL en clair (SEF) est activée."
PLG_SYSTEM_LANGUAGEFILTER_FIELD_REMOVE_DEFAULT_PREFIX_LABEL="Enlever le code langue de l'URL."
PLG_SYSTEM_LANGUAGEFILTER_OPTION_SESSION="Session"
PLG_SYSTEM_LANGUAGEFILTER_OPTION_YEAR="Une année"
PLG_SYSTEM_LANGUAGEFILTER_PRIVACY_CAPABILITY_LANGUAGE_COOKIE="Sur un site multilangue, ce plug-in peut être configuré pour définir un cookie dans le navigateur de l'utilisateur, qui mémorise ses préférences linguistiques. Ce cookie est utilisé pour rediriger les utilisateurs vers la langue de leur choix lors de la visite du site et de la création d'une nouvelle session. Le nom du cookie est basé sur un hachage généré aléatoirement et n'a donc pas d'identifiant constant."
PLG_SYSTEM_LANGUAGEFILTER_SITE_LANGUAGE="Langue du site"
PLG_SYSTEM_LANGUAGEFILTER_XML_DESCRIPTION="Filtre d'affichage des contenus en fonction de la langue.<br />Attention, ce plug-in doit être activé avec le module 'Sélecteur de langue' !</strong><br ><br >Si ce plug-in est activé, il est conseillé d'activer le module administrateur Statut Multilangue."
language/fr-FR/fr-FR.com_contenthistory.ini000060400000007606152453623440014626 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_CONTENTHISTORY_BUTTON_COMPARE_ALL_ROWS_DESC="Cliquer pour afficher toutes les valeurs pour cet élément, y compris celles qui n&#39;ont pas changé."
COM_CONTENTHISTORY_BUTTON_COMPARE_ALL_ROWS="Toutes valeurs"
COM_CONTENTHISTORY_BUTTON_COMPARE_CHANGED_ROWS_DESC="Cliquer pour n&#39;afficher que les valeurs qui ont changé."
COM_CONTENTHISTORY_BUTTON_COMPARE_CHANGED_ROWS="Valeurs changées"
COM_CONTENTHISTORY_BUTTON_COMPARE_DESC="Sélectionner deux versions et cliquer pour les comparer."
COM_CONTENTHISTORY_BUTTON_COMPARE_HTML_DESC="Cliquer pour afficher les code source HMTL des changements."
COM_CONTENTHISTORY_BUTTON_COMPARE_HTML="Afficher le code HTML"
COM_CONTENTHISTORY_BUTTON_COMPARE_TEXT_DESC="Cliquer pour afficher les changements sous forme de texte."
COM_CONTENTHISTORY_BUTTON_COMPARE_TEXT="Afficher le texte"
COM_CONTENTHISTORY_BUTTON_COMPARE="Comparer"
COM_CONTENTHISTORY_BUTTON_DELETE_DESC="Sélectionner une ou plusieurs versions et cliquer pour les supprimer de façon permanente."
COM_CONTENTHISTORY_BUTTON_DELETE="Supprimer"
COM_CONTENTHISTORY_BUTTON_KEEP_DESC="Sélectionner une ou plusieurs versions et cliquer pour activer/désactiver &#39;Garder pour toujours&#39;."
COM_CONTENTHISTORY_BUTTON_KEEP_TOGGLE_OFF="Cliquer pour permettre à cette version d&#39;être supprimée automatiquement selon le calendrier de suppression."
COM_CONTENTHISTORY_BUTTON_KEEP_TOGGLE_ON="Cliquer pour empêcher la suppression automatique de cette version."
COM_CONTENTHISTORY_BUTTON_KEEP="Activer/désactiver &#39;Garder pour toujours&#39;"
COM_CONTENTHISTORY_BUTTON_LOAD_DESC="Ce bouton charge la version sélectionnée dans le formulaire d&#39;édition."
COM_CONTENTHISTORY_BUTTON_LOAD="Rétablir"
COM_CONTENTHISTORY_BUTTON_PREVIEW_DESC="Ce bouton permet la prévisualisation de la version sélectionné."
COM_CONTENTHISTORY_BUTTON_PREVIEW="Prévisualisation"
COM_CONTENTHISTORY_BUTTON_SELECT_ONE="Merci de sélectionner une version."
COM_CONTENTHISTORY_BUTTON_SELECT_TWO="Merci de sélectionner deux versions."
COM_CONTENTHISTORY_CHARACTER_COUNT="Nombre de caractères"
COM_CONTENTHISTORY_COMPARE_DIFF="Changements"
COM_CONTENTHISTORY_COMPARE_TITLE="Comparer les prévisualisations"
COM_CONTENTHISTORY_COMPARE_VALUE1="Sauvegardé le %s %s"
COM_CONTENTHISTORY_COMPARE_VALUE2="Sauvegardé le %s %s"
COM_CONTENTHISTORY_ERROR_FAILED_LOADING_CONTENT_TYPE="Échec du chargement du type de contenu."
COM_CONTENTHISTORY_ERROR_INVALID_ID="Invalide ID sélectionnée."
COM_CONTENTHISTORY_ERROR_KEEP_NOT_PERMITTED="Vous n&#39;êtes pas autorisé à changer le statut &#39;Garder pour toujours&#39;."
COM_CONTENTHISTORY_ERROR_VERSION_NOT_FOUND="Version introuvable."
COM_CONTENTHISTORY_KEEP_VERSION="Garder pour toujours"
COM_CONTENTHISTORY_MODAL_TITLE="Historique des versions de l&#39;élément"
COM_CONTENTHISTORY_N_ITEMS_DELETED_1="%s version effacée."
COM_CONTENTHISTORY_N_ITEMS_DELETED="%s versions effacées."
COM_CONTENTHISTORY_N_ITEMS_KEEP_TOGGLE_1="La valeur &#39;Garder pour toujours&#39; de la version %s a été changée."
COM_CONTENTHISTORY_N_ITEMS_KEEP_TOGGLE="La valeur &#39;Garder pour toujours&#39; des versions %s a été changée."
COM_CONTENTHISTORY_NO_ITEM_SELECTED="Aucune version n&#39;a été sélectionnée."
COM_CONTENTHISTORY_PREVIEW_FIELD="Champ"
COM_CONTENTHISTORY_PREVIEW_SUBTITLE_DATE="Prévisualisation de la version du %s"
COM_CONTENTHISTORY_PREVIEW_SUBTITLE="Note de version: %s"
COM_CONTENTHISTORY_PREVIEW_TITLE="Prévisualisation de l&#39;élément sélectionné"
COM_CONTENTHISTORY_PREVIEW_VALUE="Valeur"
COM_CONTENTHISTORY_VERSION_NOTE="Note de version"
language/fr-FR/fr-FR.plg_search_contacts.ini000060400000001316152453623440014671 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8 - No BOM


PLG_SEARCH_CONTACTS="Recherche - Contacts"
PLG_SEARCH_CONTACTS_CONTACTS="Contacts"
PLG_SEARCH_CONTACTS_FIELD_SEARCHLIMIT_DESC="Nombre de résultats à afficher"
PLG_SEARCH_CONTACTS_FIELD_SEARCHLIMIT_LABEL="Limite de recherche"
PLG_SEARCH_CONTACTS_XML_DESCRIPTION="Intégration des fiches de contact dans la recherche sur le site"
language/fr-FR/fr-FR.tpl_hathor.sys.ini000060400000002207152453623440013645 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8 - No BOM


HATHOR="Template d'administration Hathor"
TPL_HATHOR_POSITION_CP_SHELL="Inutilisé"
TPL_HATHOR_POSITION_CPANEL="Panneau d'administration"
TPL_HATHOR_POSITION_DEBUG="Débogage"
TPL_HATHOR_POSITION_FOOTER="Pied de page"
TPL_HATHOR_POSITION_ICON="Icônes des raccourcis"
TPL_HATHOR_POSITION_LOGIN="Connexion"
TPL_HATHOR_POSITION_MENU="Menu"
TPL_HATHOR_POSITION_POSTINSTALL="Post-installation"
TPL_HATHOR_POSITION_STATUS="État"
TPL_HATHOR_POSITION_SUBMENU="Sous-menu"
TPL_HATHOR_POSITION_TITLE="Titre"
TPL_HATHOR_POSITION_TOOLBAR="Alignement vertical"
TPL_HATHOR_XML_DESCRIPTION="Le template d'administration Hathor est construit selon les normes d'accessibilité. Le fichier CSS de couleurs peut également être utilisé pour créer vos propres couleurs personnalisées."
language/fr-FR/fr-FR.plg_fields_text.sys.ini000060400000001101152453623440014645 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_TEXT="Champs - Texte"
PLG_FIELDS_TEXT_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'text' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.mod_feed.sys.ini000060400000001032152453623440013236 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

MOD_FEED="Fil d'actualité"
MOD_FEED_XML_DESCRIPTION="Le module 'mod_feed' affiche un fil d'actualité d'une URL spécifiée."
MOD_FEED_LAYOUT_DEFAULT="Défaut"language/fr-FR/fr-FR.plg_content_pagenavigation.sys.ini000060400000001125152453623440017067 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_CONTENT_PAGENAVIGATION="Contenu - Navigation entre les pages"
PLG_PAGENAVIGATION_XML_DESCRIPTION="Ajoute les liens <em>Suivant &amp; Précédent</em> permettant de naviguer entre les articles d'une même catégorie"language/fr-FR/fr-FR.plg_editors-xtd_menu.sys.ini000060400000001147152453623440015637 0ustar00; @date        2016-10-27
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_EDITORS-XTD_MENU="Bouton - Menu"
PLG_EDITORS-XTD_MENU_XML_DESCRIPTION="Affiche un bouton sous l'éditeur pour insérer dans un contenu un élément de menu.<br />Ouvre une fenêtre pop-up permettant de choisir l'élément de menu."
language/fr-FR/fr-FR.plg_quickicon_eos310.ini000060400000006025152453623440014607 0ustar00; @date        2021-08-24
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters, Inc. (https://www.joomla.org)
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_QUICKICON_EOS310="Icônes de raccourcis - Notification de fin de support pour Joomla 3.10"
PLG_QUICKICON_EOS310_GROUPNAME_EOS="Fin du support"
PLG_QUICKICON_EOS310_GROUPNAME_INFO="Informations de mise à jour"
PLG_QUICKICON_EOS310_GROUPNAME_WARNING="Statut du support"
PLG_QUICKICON_EOS310_MESSAGE_ERROR_SUPPORT_ENDED="<p>Le support n'est plus maintenu pour la version Joomla 3.10 utilisée dans votre site. <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Migrez vers Joomla 4</a> <span class=\"icon-new-tab\"></span>dès que possible.</p>"
PLG_QUICKICON_EOS310_MESSAGE_ERROR_SUPPORT_ENDED_SHORT="Support pour Joomla 3.10 achevé <span class=\"icon-new-tab\"></span>"
PLG_QUICKICON_EOS310_MESSAGE_INFO_01="<p>Joomla 4 est arrivé ! Découvrez tout ce qu'il a à vous offrir en consultant la page d'accueil des <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">fonctionnalités de Joomla 4</a> <span class=\"icon-new-tab\"></span>et améliorations.</p>"
PLG_QUICKICON_EOS310_MESSAGE_INFO_01_SHORT="Joomla 4 est arrivé ! <span class=\"icon-new-tab\"></span>"
PLG_QUICKICON_EOS310_MESSAGE_INFO_02="<p>Quand est-il temps de migrer vers Joomla 4 ? Dès que les extensions de votre site sont devenues compatibles. Apprenez à utiliser le <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">vérificateur de pré-mise à jour</a>. <span class=\"icon-new-tab\"></span></p>"
PLG_QUICKICON_EOS310_MESSAGE_INFO_02_SHORT="Utilisez le vérificateur de pré-mise à jour pour vérifier la compatibilité des extensions installées<span class=\"icon-new-tab\"></span>"
PLG_QUICKICON_EOS310_MESSAGE_WARNING_SECURITY_ONLY="<p>Joomla 3.10 est passé en mode sécurité uniquement. Fin du support le %1$s. Commencez dès aujourd'hui à <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">planifier votre migration</a> <span class=\"icon-new-tab\"></span>vers Joomla 4.</p>"
PLG_QUICKICON_EOS310_MESSAGE_WARNING_SECURITY_ONLY_SHORT="Fin du support de Joomla 3.10 le %1$s. <span class=\"icon-new-tab\"></span>"
PLG_QUICKICON_EOS310_MESSAGE_WARNING_SUPPORT_ENDING="<p>Fin du support de Joomla 3.10 le %1$s. <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">Migrez vers Joomla 4</a> <span class=\"icon-new-tab\"></span>dès que possible.</p>"
PLG_QUICKICON_EOS310_MESSAGE_WARNING_SUPPORT_ENDING_SHORT="Fin du support de Joomla 3.10 le %1$s. <span class=\"icon-new-tab\"></span>"
PLG_QUICKICON_EOS310_SNOOZE_BUTTON="Masquer ce message de façon temporaire pour tous les utilisateurs"
PLG_QUICKICON_EOS310_XML_DESCRIPTION="Ce plug-in vérifie l'état de fin du support de Joomla 3.10 et vous en informe lorsque vous visitez la page du panneau de configuration."
language/fr-FR/fr-FR.plg_editors-xtd_pagebreak.sys.ini000060400000001255152453623440016614 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_EDITORS-XTD_PAGEBREAK="Bouton - Saut de page"
PLG_EDITORSXTD_PAGEBREAK_XML_DESCRIPTION="Affiche un bouton sous l'éditeur pour insérer un saut de page (pagebreak) permettant de diviser un article en plusieurs pages. Une fenêtre popup s'ouvre pour indiquer le titre de la page et du lien dans l'index."language/fr-FR/fr-FR.plg_quickicon_akeebabackup.sys.ini000060400000003465152453623440017015 0ustar00;; @package AkeebaBackup
;; @copyright Copyright (c)2009-2016 Nicholas K. Dionysopoulos
;; @license GNU General Public License version 3, or later
;;

PLG_QUICKICON_AKEEBABACKUP="Icône raccourci - Notification Akeeba Backup"
PLG_QUICKICON_AKEEBABACKUP_XML_DESCRIPTION="Icône de notification affichée sur la page d'accueil de l'administration pour informer d'une sauvegarde échouée ou plus ancienne que le nombre d'heures spécifié (paramètres du plug-in)."

PLG_QUICKICON_AKEEBABACKUP_GROUP_DESC="Le groupe de ce plug-in (tel celui utilisé dans le module <strong>Quick Icons</strong> affichant les raccourcis sur la page d'accueil de l'administration)."
PLG_QUICKICON_AKEEBABACKUP_GROUP_LABEL="Groupe"

PLG_QUICKICON_AKEEBABACKUP_LBL_WARNINGS="Activer l'icône d'alerte"
PLG_QUICKICON_AKEEBABACKUP_DESC_WARNINGS="Si activé, l'icône d'Akeeba Backup présente sur la page d'accueil de l'administration affiche un message d'avertissement si :<br />- la sauvegarde a échoué (si activé ci-dessous)<br />- la sauvegarde est plus ancienne que la valeur indiquée plus bas"
PLG_QUICKICON_AKEEBABACKUP_LBL_WARNFAILED="Sauvegarde échouée"
PLG_QUICKICON_AKEEBABACKUP_DESC_WARNFAILED="Quand cette option et la précédente sont activées, l'icône d'Akeeba Backup affiche un message d'avertissement si la sauvegarde a échoué."
PLG_QUICKICON_AKEEBABACKUP_LBL_PERIOD="Rappel de sauvegarde, en heures"
PLG_QUICKICON_AKEEBABACKUP_DESC_PERIOD="Si la première option est activée, l'icône d'Akeeba Backup affiche un message d'avertissement si la sauvegarde est plus ancienne que le nombre d'heures spécifié (168 pour une semaine)."

; PLG_QUICKICON_AKEEBABACKUP_PROFILE_LABEL="Backup Profile"
; PLG_QUICKICON_AKEEBABACKUP_PROFILE_DESC="Choose the backup profile which will be used to take a full site backup when the backup icon is clicked."
language/fr-FR/fr-FR.plg_content_pagenavigation.ini000060400000003010152453623440016245 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8 - No BOM


PLG_CONTENT_PAGENAVIGATION="Contenu - Navigation entre les pages"
PLG_PAGENAVIGATION_FIELD_DISPLAY_DESC="Choisir le lien de texte à afficher"
PLG_PAGENAVIGATION_FIELD_DISPLAY_LABEL="Texte de lien"
PLG_PAGENAVIGATION_FIELD_POSITION_DESC="Position de la navigation entre les pages par rapport à l'article."
PLG_PAGENAVIGATION_FIELD_POSITION_LABEL="Position"
PLG_PAGENAVIGATION_FIELD_RELATIVE_DESC="Position de la navigation entre les pages relatif à...<br />Article uniquement : au-dessus ou au-dessous du contenu de l'article.<br />Titre et pied : au-dessus ou au-dessous du titre et du lien 'Lire la suite...'"
PLG_PAGENAVIGATION_FIELD_RELATIVE_LABEL="Relatif à"
PLG_PAGENAVIGATION_FIELD_VALUE_ABOVE="Au-dessus"
PLG_PAGENAVIGATION_FIELD_VALUE_ARTICLE="Titre et pied"
PLG_PAGENAVIGATION_FIELD_VALUE_BELOW="Au-dessous"
PLG_PAGENAVIGATION_FIELD_VALUE_NEXTPREV="Suivant/Précédent (texte statique)"
PLG_PAGENAVIGATION_FIELD_VALUE_TEXT="Article uniquement"
PLG_PAGENAVIGATION_FIELD_VALUE_TITLE="Titre de l'article"
PLG_PAGENAVIGATION_XML_DESCRIPTION="Ajoute les liens <em>Suivant & Précédent</em> permettant de naviguer dans la pagination d'un article."
language/fr-FR/fr-FR.plg_fields_sql.ini000060400000002634152453623440013657 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_SQL="Champs - SQL"
PLG_FIELDS_SQL_CREATE_NOT_POSSIBLE="Seul un Super Utilisateur peut créer ou modifier un champ de type SQL!"
PLG_FIELDS_SQL_LABEL="SQL (%s)"
PLG_FIELDS_SQL_PARAMS_MULTIPLE_DESC="Permet la sélection de valeurs multiples."
PLG_FIELDS_SQL_PARAMS_MULTIPLE_LABEL="Multiple"
; In the string below the terms 'value' and 'text' should not be translated
PLG_FIELDS_SQL_PARAMS_QUERY_DESC="La requête SQL qui fournira les données de la liste déroulante. La requête doit retourner deux colonnes; une appelée 'value' qui contiendra les valeurs des éléments de la liste; l'autre appelée 'text' contenant le texte dans la liste déroulante."
PLG_FIELDS_SQL_PARAMS_QUERY_LABEL="Requête"
PLG_FIELDS_SQL_RULES_ADAPTED="Pour une sécurité accrue, l'autorisation d'édition pour ce champ SQL est refusée pour tous les utilisateurs qui ne sont pas des Super Utilisateurs."
PLG_FIELDS_SQL_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'sql' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_system_jcemediabox.sys.ini000060400000003042152453623440016217 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; Licence : GNU/GPL Version 2 - http://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - https://www.sarki.ch/jce
; Note : All ini files need to be saved as UTF-8 - No BOM

PLG_SYSTEM_JCEMEDIABOX="Système - JCE MediaBox 2"
PLG_SYSTEM_JCEMEDIABOX_XML_DESC="<h3>Plugin JCE MediaBox, complément de l'éditeur JCE pour Joomla!</h3><p>JCE MediaBox permet d'afficher des médias (image, flash, flv, quicktime, vmw, avi, mpg, divx, youtube, etc.) et des contenus en popup de styles personnalisables.</p><p>JCE MediaBox permet également d'insérer des infobulles sur du texte ou des médias.</p><p>Présentation et modes d'emploi en anglais sur le site de l'auteur de JCE, Ryan Demmer : <a href='https://www.joomlacontenteditor.net/support/tutorials/jcemediabox' target='_blank' title='Site officiel'>https://www.joomlacontenteditor.net/support/tutorials/jcemediabox</a><br />Suivi de mise à jour : <a href='https://www.joomlacontenteditor.net/support/changelog/mediabox' target='_blank' title='Mises à jour'>https://www.joomlacontenteditor.net/support/changelog/mediabox</a></p><p>Traduction FR, présentation et forum en français par Sarki : <a href='https://www.sarki.ch/jce' target='_blank'>www.sarki.ch/jce</a></p><h3>Vous devez <a href='index.php?option=com_plugins&view=plugins&filter[search]=mediabox&search=mediabox' title='Publish'><strong>publier le plugin </strong></a>pour le rendre fonctionnel !</h3>"
language/fr-FR/fr-FR.com_plugins.ini000060400000006174152453623440013212 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_PLUGINS="Plug-ins"
COM_PLUGINS_ADVANCED_FIELDSET_LABEL="Paramètres avancés"
COM_PLUGINS_BASIC_FIELDSET_LABEL="Paramètres"
COM_PLUGINS_CONFIGURATION="Plug-ins : Paramètres"
COM_PLUGINS_ELEMENT_HEADING="Élément"
COM_PLUGINS_ERROR_FILE_NOT_FOUND="Fichier %s non trouvé."
COM_PLUGINS_FIELD_ELEMENT_DESC="Nom du fichier principal du plug-in."
COM_PLUGINS_FIELD_ELEMENT_LABEL="Fichier du plug-in"
COM_PLUGINS_FIELD_ENABLED_DESC="Activer/Désactiver ce plug-in."
COM_PLUGINS_FIELD_FOLDER_DESC="Type de fonction de ce plug-in."
COM_PLUGINS_FIELD_FOLDER_LABEL="Type du plug-in"
COM_PLUGINS_FIELD_NAME_DESC="Le nom de ce plug-in défini dans le fichier xml associé"
COM_PLUGINS_FIELD_NAME_LABEL="Nom du plug-in"
COM_PLUGINS_FILTER_SEARCH_LABEL="Recherche de plug-ins"
COM_PLUGINS_FOLDER_HEADING="Type"
COM_PLUGINS_HEADING_ELEMENT_ASC="Élément ascendant"
COM_PLUGINS_HEADING_ELEMENT_DESC="Élément descendant"
COM_PLUGINS_HEADING_FOLDER_ASC="Type ascendant"
COM_PLUGINS_HEADING_FOLDER_DESC="Type descendant"
COM_PLUGINS_MANAGER_PLUGIN="Plug-ins : %s"
COM_PLUGINS_MANAGER_PLUGINS="Plug-ins :"
COM_PLUGINS_MSG_MANAGE_NO_PLUGINS="Il n'y a aucun plug-in installé correspondant à votre requête"
COM_PLUGINS_N_ITEMS_CHECKED_IN_0="Aucun plug-in validé"
COM_PLUGINS_N_ITEMS_CHECKED_IN_1="%d plug-ins validés"
COM_PLUGINS_N_ITEMS_CHECKED_IN_MORE="%d plug-ins validés"
COM_PLUGINS_N_ITEMS_PUBLISHED="%d plug-ins activé"
COM_PLUGINS_N_ITEMS_PUBLISHED_1="Plug-in activé"
COM_PLUGINS_N_ITEMS_UNPUBLISHED="%d plug-ins désactivés"
COM_PLUGINS_N_ITEMS_UNPUBLISHED_1="Plug-in désactivé"
COM_PLUGINS_NAME_HEADING="Nom du plug-in"
COM_PLUGINS_NO_ITEM_SELECTED="Aucun plug-in sélectionné"
COM_PLUGINS_OPTION_ELEMENT="- Sélectionner un élément -"
COM_PLUGINS_OPTION_FOLDER="- Choisir un type -"
COM_PLUGINS_PLUGIN="Plug-in"
COM_PLUGINS_PLUGINS="Plug-ins"
COM_PLUGINS_SAVE_SUCCESS="Plug-in enregistré"
COM_PLUGINS_SEARCH_IN_TITLE="Recherche dans le nom du plug-in. Préfixe avec ID: rechercher l'ID d'un plug-in."
COM_PLUGINS_XML_DESCRIPTION="Ce composant gère les plug-ins de Joomla."
COM_PLUGINS_XML_ERR="Les données XML ne sont pas disponibles"
JLIB_HTML_PUBLISH_ITEM="Activer le plug-in"
JLIB_HTML_UNPUBLISH_ITEM="Désactiver le plug-in"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_PLUGINS="Les modification ne s'appliquent qu'à ce composant.<br /><em><strong>Hérité</strong></em> - les droits globaux ou ceux des groupes parents seront utilisés.<br /><em><strong>Refusé</strong></em> - prévaut toujours, quels que soient les droits globaux ou ceux des groupes parents, et s'applique aux éléments enfants.<br /><em><strong>Autorisé</strong></em> - le groupe concerné pourra effectuer cette action dans ce composant sauf si les droits globaux sont différents."
language/fr-FR/fr-FR.plg_finder_content.ini000060400000001560152453623440014530 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8 - No BOM


PLG_FINDER_CONTENT="Indexation - Articles"
PLG_FINDER_CONTENT_XML_DESCRIPTION="Ce plug-in met à jour les index des articles de Joomla! pour la recherche avancée quand un article est créé, modifié ou effacé. NOTE : Le plug-in 'Contenu - Indexation de recherche' doit être activé."

PLG_FINDER_QUERY_FILTER_BRANCH_S_ARTICLE="Article"
PLG_FINDER_QUERY_FILTER_BRANCH_S_AUTHOR="Auteur"

PLG_FINDER_QUERY_FILTER_BRANCH_P_ARTICLE="Articles"
PLG_FINDER_QUERY_FILTER_BRANCH_P_AUTHOR="Auteurs"
language/fr-FR/fr-FR.plg_system_debug.ini000060400000021124152453623440014217 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_DEBUG_BYTES="Bytes"
PLG_DEBUG_CALL_STACK="Pile d'appels"
PLG_DEBUG_CALL_STACK_CALLER="Appel"
PLG_DEBUG_CALL_STACK_FILE_AND_LINE="Fichier et numéro de ligne"
PLG_DEBUG_CALL_STACK_SAME_FILE="<em>Même appel que celui de la ligne ci-dessous.</em>"
PLG_DEBUG_ERRORS="Erreurs"
PLG_DEBUG_EXPLAIN="Explication"
PLG_DEBUG_FIELD_ALLOWED_GROUPS_DESC="Sélectionnez les groupes autorisés à voir les informations de débogage.<br />Si aucun n'est sélectionné, tous les groupes auront accès à ces informations."
PLG_DEBUG_FIELD_ALLOWED_GROUPS_LABEL="Groupes autorisés"
PLG_DEBUG_FIELD_EXECUTEDSQL_DESC="Si cette option est activée, les requêtes SQL exécutées seront journalisées. N'utiliser ce paramètre que pour de courtes périodes de temps et à des fins d'analyse comparative."
PLG_DEBUG_FIELD_EXECUTEDSQL_LABEL="Journaliser les requêtes SQL exécutées"
PLG_DEBUG_FIELD_LANGUAGE_ERRORFILES_DESC="Afficher la liste des fichiers de langue qui ne sont pas en concordance avec les normes de spécification des fichiers 'ini' de Joomla!"
PLG_DEBUG_FIELD_LANGUAGE_ERRORFILES_LABEL="Afficher les erreurs"
PLG_DEBUG_FIELD_LANGUAGE_FILES_DESC="Afficher la liste des fichiers de langue que Joomla! a tenté de charger."
PLG_DEBUG_FIELD_LANGUAGE_FILES_LABEL="Afficher les fichiers"
PLG_DEBUG_FIELD_LANGUAGE_STRING_DESC="Afficher la liste des chaînes de langue non traduites."
PLG_DEBUG_FIELD_LANGUAGE_STRING_LABEL="Chaînes non traduites"
PLG_DEBUG_FIELD_LOGS_DESC="Afficher la liste des messages journalisés."
PLG_DEBUG_FIELD_LOGS_LABEL="Entrées journalisées"
PLG_DEBUG_FIELD_LOG_CATEGORIES_DESC="Liste des catégories à inclure dans le journal (log). Le journal commun inclut les catégories mais n'est pas limité à : database, databasequery, deprecated, et jerror. Si le champ est laissé vide, toutes les catégories seront affichés."
PLG_DEBUG_FIELD_LOG_CATEGORIES_LABEL="Journal des catégories"
PLG_DEBUG_FIELD_LOG_CATEGORY_MODE_DESC="Sélectionner si les catégories listées doivent être inclues ou exclues."
PLG_DEBUG_FIELD_LOG_CATEGORY_MODE_EXCLUDE="Exclure"
PLG_DEBUG_FIELD_LOG_CATEGORY_MODE_INCLUDE="Inclure"
PLG_DEBUG_FIELD_LOG_CATEGORY_MODE_LABEL="Mode Journal des catégories"
PLG_DEBUG_FIELD_LOG_DEPRECATED_DESC="Si activé, le journal (log) de l'API définit comme déprécié sera executé. N'utiliser cette fonction que pour de courtes périodes à fin de mettre à jour votre code"
PLG_DEBUG_FIELD_LOG_DEPRECATED_LABEL="Journal déprécié de l'API"
PLG_DEBUG_FIELD_LOG_EVERYTHING_DESC="Si activé, tous les messages de log produits par Joomla! seront loggés sauf les API obsolètes et les requêtes de base de donnée. N'utiliser que pour de courtes périodes de temps afin de débogger."
PLG_DEBUG_FIELD_LOG_EVERYTHING_LABEL="Logger presque tout"
PLG_DEBUG_FIELD_LOG_PRIORITIES_ALERT="Alerte"
PLG_DEBUG_FIELD_LOG_PRIORITIES_ALL="Tous"
PLG_DEBUG_FIELD_LOG_PRIORITIES_CRITICAL="Critique"
PLG_DEBUG_FIELD_LOG_PRIORITIES_DEBUG="Débogage"
PLG_DEBUG_FIELD_LOG_PRIORITIES_DESC="Sélectionnez le niveau de priorité des entrées du journal."
PLG_DEBUG_FIELD_LOG_PRIORITIES_EMERGENCY="Urgence"
PLG_DEBUG_FIELD_LOG_PRIORITIES_ERROR="Erreur"
PLG_DEBUG_FIELD_LOG_PRIORITIES_INFO="Info"
PLG_DEBUG_FIELD_LOG_PRIORITIES_LABEL="Priorités du journal"
PLG_DEBUG_FIELD_LOG_PRIORITIES_NOTICE="Remarque"
PLG_DEBUG_FIELD_LOG_PRIORITIES_WARNING="Avertissement"
PLG_DEBUG_FIELD_MEMORY_DESC="Afficher le total de la mémoire utilisée pour afficher la page."
PLG_DEBUG_FIELD_MEMORY_LABEL="Utilisation de la mémoire"
PLG_DEBUG_FIELD_PROFILING_DESC="Afficher les éléments du profil."
PLG_DEBUG_FIELD_PROFILING_LABEL="Afficher le profil"
PLG_DEBUG_FIELD_QUERIES_DESC="Afficher la liste des requêtes exécutées pour afficher la page."
PLG_DEBUG_FIELD_QUERIES_LABEL="Afficher les requêtes"
PLG_DEBUG_FIELD_QUERY_TYPES_DESC="Afficher une liste des types uniques de requêtes et leur nombre d'occurrences pour la page actuelle. Permet de déceler les requêtes redondantes ou qui pourraient être regroupées en une seule."
PLG_DEBUG_FIELD_QUERY_TYPES_LABEL="Types de requêtes"
PLG_DEBUG_FIELD_REFRESH_ASSETS_DESC="Si cette option est activée, ajoute à chaque rechargement de page un hachage différent à chaque fichier de script / feuille de style avec une version automatique afin de ne jamais utiliser le cache du navigateur."
PLG_DEBUG_FIELD_REFRESH_ASSETS_LABEL="Actualiser les attributs"
PLG_DEBUG_FIELD_SESSION_DESC="Affiche les données de session."
PLG_DEBUG_FIELD_SESSION_LABEL="Afficher les données de session"
PLG_DEBUG_FIELD_STRIP_FIRST_DESC="Toujours exclure le premier mot (suffixe) d'une chaîne."
PLG_DEBUG_FIELD_STRIP_FIRST_LABEL="Exclure le premier mot"
PLG_DEBUG_FIELD_STRIP_PREFIX_DESC="Exclure plusieurs mots (suffixes) depuis le début de la chaîne.<br />Pour exclure plusieurs mots, utilisez ce format: (mot1\|mot2)"
PLG_DEBUG_FIELD_STRIP_PREFIX_LABEL="Exclure plusieurs mots depuis le début"
PLG_DEBUG_FIELD_STRIP_SUFFIX_DESC="Exclure plusieurs mots (suffixes) depuis la fin de la chaîne.<br />Pour exclure plusieurs mots, utilisez ce format: (mot1\|mot2)"
PLG_DEBUG_FIELD_STRIP_SUFFIX_LABEL="Exclure plusieurs mots depuis la fin"
PLG_DEBUG_LANGUAGE_FIELDSET_LABEL="Paramètres de langue"
PLG_DEBUG_LANGUAGE_FILES_IN_ERROR="Erreurs d'analyse dans les fichiers de langue"
PLG_DEBUG_LANGUAGE_FILES_LOADED="Fichiers de langue chargés"
PLG_DEBUG_LANG_LOADED="Chargé"
PLG_DEBUG_LANG_NOT_LOADED="Non chargé"
PLG_DEBUG_LINK_FORMAT="Ajouter xdebug.file_link_format directive à votre php.ini file pour obtenir des liens vers les fichiers"
PLG_DEBUG_LOGGING_FIELDSET_LABEL="Journal (log)"
PLG_DEBUG_LOGS="Journal des messages"
PLG_DEBUG_LOGS_DEPRECATED_FOUND_TEXT="Le code qui est marqué comme déprécié ne fonctionnera pas dans les versions à venir de Joomla. Merci de le réviser."
PLG_DEBUG_LOGS_DEPRECATED_FOUND_TITLE="%s message(s) de code déprécié journalisé(s)!"
PLG_DEBUG_LOGS_LOGGED="%s message(s) journalisé(s)"
PLG_DEBUG_MEMORY="Mémoire"
PLG_DEBUG_MEMORY_USED_FOR_QUERY="Mémoire de requête : %s mémoire avant requête : %s"
PLG_DEBUG_MEMORY_USAGE="Occupation de la mémoire"
PLG_DEBUG_NO_PROFILE="No SHOW PROFILE (peut-être parce qu'il y a plus de 100 requêtes)"
PLG_DEBUG_OTHER_QUERIES="Autres tables :"
PLG_DEBUG_PROFILE="Profil"
PLG_DEBUG_PROFILE_INFORMATION="Profil d'information"
PLG_DEBUG_QUERIES="Requêtes de base de données"
PLG_DEBUG_QUERIES_LOGGED="%d requêtes exécutées"
PLG_DEBUG_QUERIES_TIME="Total de requêtes base de données : %s"
PLG_DEBUG_QUERY_AFTER_LAST="Après la dernière requête : %s"
PLG_DEBUG_QUERY_DUPLICATES="Requêtes dupliquées"
PLG_DEBUG_QUERY_DUPLICATES_FOUND="Double découvert!"
PLG_DEBUG_QUERY_DUPLICATES_NUMBER="%s requêtes dupliquées"
PLG_DEBUG_QUERY_DUPLICATES_TOTAL_NUMBER="%s doubles découverts!"
PLG_DEBUG_QUERY_EXPLAIN_NOT_POSSIBLE="EXPLAIN impossible sur la requête : %s"
PLG_DEBUG_QUERY_TIME="Temps de requête : %s"
PLG_DEBUG_QUERY_TYPES_LOGGED="%d types de requêtes exécutées, triées par occurrences."
PLG_DEBUG_QUERY_TYPE_AND_OCCURRENCES="%2$d × %1$s"
PLG_DEBUG_ROWS_RETURNED_BY_QUERY="Rangées retournées : %s"
PLG_DEBUG_SELECT_QUERIES="Tables sélectionnées :"
PLG_DEBUG_SESSION="Session"
PLG_DEBUG_TIME="Temps"
PLG_DEBUG_TITLE="Console de débogage Joomla!"
PLG_DEBUG_UNKNOWN_FILE="Fichier inconnu"
PLG_DEBUG_UNTRANSLATED_STRINGS="Chaînes non traduites"
PLG_DEBUG_WARNING_NO_INDEX="INDEX N'A PU ÊTRE UTILISÉ"
PLG_DEBUG_WARNING_NO_INDEX_DESC="Cette table a probablement un index manquant sur les colonnes de comparaisons d'égalité sur les WHERE et/ou les colonnes des JOIN ON, ou cette requête est écrite d'une manière où les indexes ne peuvent pas être utilisés, ce qui provoque un parcours complet de la table onéreux en temps."
PLG_DEBUG_WARNING_USING_FILESORT="Utilisation du tri complet de type filesort"
PLG_DEBUG_WARNING_USING_FILESORT_DESC="Cette table a probablement un index manquant sur les colonnes de comparaisons d'égalité des WHERE qui devrait se terminer par les colonnes des ORDER BY, ou cette requête est écrite d'une manière où les indexes ne peuvent pas être utilisés, ce qui provoque un tri complet de type filesort onéreux en temps."
PLG_DEBUG_XML_DESCRIPTION="Ce plug-in fournit des informations système diverses PHP, MySQL ainsi qu'une assistance pour la création des fichiers de traduction"
PLG_SYSTEM_DEBUG="Système - Débogage"
language/fr-FR/fr-FR.plg_twofactorauth_totp.sys.ini000060400000001716152453623440016307 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_TWOFACTORAUTH_TOTP="Authentification en deux étapes - Google Authenticator"
PLG_TWOFACTORAUTH_TOTP_XML_DESCRIPTION="Permet aux utilisateurs de votre site d'utiliser l'authentification en deux étapes en se servant de <a href=\"https://en.wikipedia.org/wiki/Google_Authenticator\" target=\"_blank\">Google Authenticator </a> ou autre générateurs compatibles de mots de passe à usage unique basé sur l'heure, tel que <a href=\"https://freeotp.github.io/\" target=\"_blank\">FreeOTP</a>. Pour utiliser l'authentification en deux étapes, modifier le profil de l'utilisateur et l'activer."
language/fr-FR/fr-FR.com_categories.ini000060400000020617152453623440013654 0ustar00; @date        2014-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


CATEGORIES_FIELDSET_OPTIONS="Paramètres"
COM_CATEGORIES="Catégories"
COM_CATEGORIES_ACCESS_CREATE_DESC="Nouveau paramètre pour <strong>la création d'éléments</strong> dans cette catégorie et paramètre calculé basé sur la catégorie parente et les droits des groupes."
COM_CATEGORIES_ACCESS_DELETE_DESC="Nouveau paramètre pour <strong>la suppression d'éléments</strong> de cette catégorie et paramètre calculé basé sur la catégorie parente et les droits des groupes."
COM_CATEGORIES_ACCESS_EDIT_DESC="Nouveau paramètre pour <strong>l'édition d'éléments</strong> de cette catégorie et paramètre calculé basé sur la catégorie parente et les droits des groupes."
COM_CATEGORIES_ACCESS_EDITOWN_DESC="Nouveau paramètre pour <strong>l'édition de ses éléments</strong> de cette catégorie et paramètre calculé basé sur la catégorie parente et les droits de groupes."
COM_CATEGORIES_ACCESS_EDITSTATE_DESC="Nouveau paramètre pour <strong>la modification du statut d'éléments</strong> de cette catégorie et paramètre calculé basée sur la catégorie parent et des autorisations de groupes."
COM_CATEGORIES_BASIC_FIELDSET_LABEL="Paramètres"
COM_CATEGORIES_BATCH_CANNOT_CREATE="Vous n'êtes pas autorisé à créer de nouvelles catégories dans cette catégorie."
COM_CATEGORIES_BATCH_CANNOT_EDIT="Vous n'êtes pas autorisé à modifier une ou plusieurs de ces catégories."
; COM_CATEGORIES_BATCH_CATEGORY_LABEL is deprecated, use JLIB_HTML_BATCH_MENU_LABEL instead.
COM_CATEGORIES_BATCH_CATEGORY_LABEL="Sélectionner une catégorie où 'Déplacer/Copier'"
COM_CATEGORIES_BATCH_OPTIONS="Traitement des catégories sélectionnées"
COM_CATEGORIES_BATCH_TIP="Si une catégorie est sélectionnée pour copier/déplacer, les actions sélectionnées seront appliquées aux catégories copiées ou déplacées. Sinon, toutes les actions seront appliquées aux catégories sélectionnées."
COM_CATEGORIES_CATEGORIES_BASE_TITLE="Catégories"
COM_CATEGORIES_CATEGORIES_TITLE="%s : catégories"
COM_CATEGORIES_CATEGORY_ADD_TITLE="%s : Nouvelle catégorie"
COM_CATEGORIES_CATEGORY_BASE_ADD_TITLE="Catégories : Ajouter une catégorie"
COM_CATEGORIES_CATEGORY_BASE_EDIT_TITLE="Catégories : Modifier la catégorie"
COM_CATEGORIES_CATEGORY_EDIT_TITLE="%s : Modifier la catégorie"
COM_CATEGORIES_CATEGORY_OPTIONS="Paramètres"
COM_CATEGORIES_CHANGE_CATEGORY="Sélectionner ou changer de catégorie"
COM_CATEGORIES_DELETE_NOT_ALLOWED="La suppression de la catégorie %s n'est pas autorisée. "
COM_CATEGORIES_DESCRIPTION_DESC="Optionnel : saisissez dans la zone de texte une description pour cette catégorie."
COM_CATEGORIES_EDIT_CATEGORY="Modifier la catégorie"
COM_CATEGORIES_ERROR_ALL_LANGUAGE_ASSOCIATED="Une catégorie assignée au paramètre langue 'Toutes' ne peut pas être associée. Les associations n'ont pas été appliquées."
COM_CATEGORIES_FIELD_BASIC_LABEL="Options"
COM_CATEGORIES_FIELD_HITS_DESC="Nombre de clics sur cette catégorie."
COM_CATEGORIES_FIELD_IMAGE_ALT_LABEL="Texte alternatif"
COM_CATEGORIES_FIELD_IMAGE_ALT_DESC="Texte alternatif à l'attention des visiteurs qui n'ont pas accès à l'image"
COM_CATEGORIES_FIELD_IMAGE_DESC="Choisissez une image pour cette catégorie."
COM_CATEGORIES_FIELD_IMAGE_LABEL="Image"
COM_CATEGORIES_FIELD_LANGUAGE_DESC="Assignez cette catégorie à une langue."
COM_CATEGORIES_FIELD_NOTE_DESC="Note optionnelle à afficher dans la liste des catégories."
COM_CATEGORIES_FIELD_NOTE_LABEL="Note"
COM_CATEGORIES_FIELD_PARENT_DESC="Sélectionner une catégorie parente."
COM_CATEGORIES_FIELD_PARENT_LABEL="Parent"
COM_CATEGORIES_FIELDSET_DETAILS="Détails de la catégorie"
COM_CATEGORIES_FIELDSET_PUBLISHING="Publication"
COM_CATEGORIES_FIELDSET_RULES="Droits"
COM_CATEGORIES_FILTER_SEARCH_DESC="Recherche sur titre ou alias. Préfixe avec ID: recherche sur l'ID de la catégorie."
COM_CATEGORIES_FILTER_SEARCH_LABEL="Recherche catégories"
COM_CATEGORIES_HAS_SUBCATEGORY_ITEMS="%d éléments sont assignés aux sous-catégories de cette catégorie."
COM_CATEGORIES_HAS_SUBCATEGORY_ITEMS_1="%d élément est assigné à une des sous-catégories de cette catégorie."
; The following 2 strings are deprecated and will be removed with 4.0.
COM_CATEGORIES_ITEM_ASSOCIATIONS_FIELDSET_LABEL="Associations de catégories"
COM_CATEGORIES_ITEM_ASSOCIATIONS_FIELDSET_DESC="Choisissez l'élément à associer dans la langue cible.<br />Ce choix ne concerne que les sites multilingues, il ne s'affiche que si le paramètre 'Association' est réglé sur 'Oui' dans le plug-in 'Filtre de langue'.<br /><strong>Note :<strong> l'association d'éléments de langues différentes permet de rediriger l'utilisateur vers un élément spécifique au moment du changement de langue. Pour l'utiliser, assurez-vous que le module de changement de langue soit affiché sur les pages des éléments concernés.<br />Une catégorie au paramètre langue 'Toutes' ne peut pas être associée."
COM_CATEGORIES_ITEMS_SEARCH_FILTER="Recherche"
COM_CATEGORIES_N_ITEMS_ARCHIVED="%d catégories archivées"
COM_CATEGORIES_N_ITEMS_ARCHIVED_1="%d catégorie archivée"
COM_CATEGORIES_N_ITEMS_ASSIGNED="%d éléments sont assignés à cette catégorie."
COM_CATEGORIES_N_ITEMS_ASSIGNED_1="%d élément est assigné à cette catégorie."
COM_CATEGORIES_N_ITEMS_CHECKED_IN_0="Aucune catégorie déverrouillée"
COM_CATEGORIES_N_ITEMS_CHECKED_IN_1="%d catégorie déverrouillée"
COM_CATEGORIES_N_ITEMS_CHECKED_IN_MORE="%d catégories déverrouillées"
COM_CATEGORIES_N_ITEMS_DELETED="%d catégories supprimées"
COM_CATEGORIES_N_ITEMS_DELETED_1="%d catégorie supprimée"
COM_CATEGORIES_N_ITEMS_FAILED_PUBLISHING="%d catégories n'ont pu être publiées car au moins une de leurs catégories parentes n'est pas publiée ou une de leurs catégories enfants est verrouillée."
COM_CATEGORIES_N_ITEMS_FAILED_PUBLISHING_1="%d catégorie n'a pu être publiée car au moins une de ses catégories parentes n'est pas publiée ou une de ses catégories enfants est verrouillée."
COM_CATEGORIES_N_ITEMS_PUBLISHED="%d catégories publiées"
COM_CATEGORIES_N_ITEMS_PUBLISHED_1="%d catégorie publiée"
COM_CATEGORIES_N_ITEMS_TRASHED="%d catégories mises à la corbeille"
COM_CATEGORIES_N_ITEMS_TRASHED_1="%d catégorie mise à la corbeille"
COM_CATEGORIES_N_ITEMS_UNPUBLISHED="%d catégories dépubliées"
COM_CATEGORIES_N_ITEMS_UNPUBLISHED_1="%d catégorie dépubliée"
COM_CATEGORIES_NEW_CATEGORY="Nouvelle catégorie"
COM_CATEGORIES_NO_ITEM_SELECTED="Veuillez d'abord effectuer une sélection dans la liste."
COM_CATEGORIES_PATH_LABEL="Chemin de la catégorie"
COM_CATEGORIES_REBUILD_FAILURE="Impossible de reconstruire l'arbre des catégories."
COM_CATEGORIES_REBUILD_SUCCESS="L'arbre des catégories a été reconstruit."
COM_CATEGORIES_SAVE_SUCCESS="Catégorie enregistrée"
COM_CATEGORIES_SELECT_A_CATEGORY="Sélectionner une catégorie"
COM_CATEGORIES_TIP_ASSOCIATION="Catégories associées"
COM_CATEGORIES_TIP_ASSOCIATED_LANGUAGE="%s %s"
COM_CATEGORIES_XML_DESCRIPTION="Ce composant gère les catégories"
COM_CATEGORY_COUNT_ARCHIVED_ITEMS="Éléments archivés"
COM_CATEGORY_COUNT_PUBLISHED_ITEMS="Éléments publiés"
COM_CATEGORY_COUNT_TRASHED_ITEMS="Éléments dans la corbeille"
COM_CATEGORY_COUNT_UNPUBLISHED_ITEMS="Éléments non publiés"
COM_CATEGORY_HEADING_ASSOCIATION="Association"
JGLOBAL_NO_ITEM_SELECTED="Aucune catégorie sélectionnée"
JLIB_HTML_ACCESS_SUMMARY_DESC="Ce qui est affiché ci-dessous est un aperçu des paramètres des droits pour cette catégorie. Cliquez sur les onglets ci-dessus pour personnaliser ces paramètres par action."
JLIB_RULES_SETTING_NOTES_ITEM="Les modification des droits s'appliquent à cette catégorie et ses catégories enfants.<br /><em><strong>Hérité</strong></em> - les droits de la catégorie parente seront utilisés si elle existe, ou ceux du composant s'il n'y a pas de catégorie parente.<br /><em><strong>Refusé</strong></em> - prévaut toujours, quels que soient les droits globaux ou ceux des groupes parents, et s'applique aux catégories enfants.<br /><em><strong>Autorisé</strong></em> - le groupe concerné pourra effectuer cette action dans ce composant sauf si les droits globaux sont différents."
language/fr-FR/fr-FR.plg_system_remember.ini000060400000001445152453623440014733 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_REMEMBER_XML_DESCRIPTION="Fonction ajoutant un cookie dans le cache du navigateur pour éviter la déconnexion lors d'une inactivité sur le site dépassant celle spécifiée dans la configuration globale de Joomla!<br />Le module de connexion doit proposer cette fonction de manière automatique ou en proposant à l'utilisateur la case à cocher 'Se souvenir de moi'."
PLG_SYSTEM_REMEMBER="Système - Se souvenir de moi"
language/fr-FR/fr-FR.plg_authentication_gmail.ini000060400000005520152453623440015717 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_AUTHENTICATION_GMAIL="Authentification - Gmail"
PLG_GMAIL_ERROR_ACCOUNT_DISABLED_OR_NOT_ACTIVATED="Votre compte local est inactif ou n'est pas activé."
PLG_GMAIL_ERROR_LOCAL_USERNAME_CONFLICT="Un identifiant local est en conflit avec votre utilisateur Google"
PLG_GMAIL_FIELD_APPLYSUFFIX_DESC="1. Ne pas appliquer le suffixe d'authentification spécifié dans le champ suivant.<br />2. Appliquer le suffixe spécifié dans le champ suivant uniquement si un utilisateur n'en saisit pas.<br />3. Appliquer systématiquement le suffixe spécifié dans le champ suivant, remplaçant également celui saisi par un utilisateur."
PLG_GMAIL_FIELD_APPLYSUFFIX_LABEL="Application du suffixe"
PLG_GMAIL_FIELD_BACKEND_LOGIN_DESC="Autoriser ou non la connexion à l'administration du site par le compte GMail"
PLG_GMAIL_FIELD_BACKEND_LOGIN_LABEL="Connexion à l'administration"
PLG_GMAIL_FIELD_SUFFIX_DESC="Suffixe à utiliser avec l'identifiant, par défaut gmail.com (ou googlemail.com).<br />Vous pouvez également utiliser un suffixe 'Google Apps' pour votre domaine en ajoutant le symbole @ ; si laissé vide, le suffixe sera ignoré."
PLG_GMAIL_FIELD_SUFFIX_LABEL="Suffixe de l'identifiant"
PLG_GMAIL_FIELD_USER_BLACKLIST_DESC="Liste d'identifiants (séparés par des virgules) interdits de connexion sur le site."
PLG_GMAIL_FIELD_USER_BLACKLIST_LABEL="Liste noire d'utilisateurs"
PLG_GMAIL_FIELD_VALUE_APPLYSUFFIXALWAYS="Toujours utiliser le suffixe"
PLG_GMAIL_FIELD_VALUE_APPLYSUFFIXMISSING="Utiliser le suffixe s'il est absent"
PLG_GMAIL_FIELD_VALUE_NOAPPLYSUFFIX="Ne pas utiliser le suffixe"
PLG_GMAIL_FIELD_VERIFYPEER_DESC="Activer/Désactiver la vérification de la connexion au moyen d'un certificat de sécurité. <strong>Attention</strong>, l'authentification peut échouer dans certaines configurations en raison d'erreur(s) liées à l'utilisation de ce certificat, il est alors conseillé de le désactiver."
PLG_GMAIL_FIELD_VERIFYPEER_LABEL="Vérifier la connexion"
PLG_GMAIL_XML_DESCRIPTION="Authentification avec un compte Gmail ou Googlemail (nécessite cURL).<br />Les utilisateurs peuvent avoir besoin d'activer <em>Accès pour les applications moins sécurisées</em> à <a href=\"https://www.google.com/settings/security/lesssecureapps\" target=\"_blank\">https://www.google.com/settings/security/lesssecureapps </a> pour pouvoir se connecter avec cette méthode. <br /><strong>Attention, vous devez laisser au moins un plug-in d'authentification activé pour vous connecter sur le site !</strong>"
language/fr-FR/fr-FR.plg_installer_folderinstaller.ini000060400000001311152453623440016767 0ustar00; @date        2016-05-10
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_INSTALLER_FOLDERINSTALLER_TEXT="Installer à partir d'un répertoire"
PLG_INSTALLER_FOLDERINSTALLER_BUTTON="Vérifier et installer"
PLG_INSTALLER_FOLDERINSTALLER_NO_INSTALL_PATH="Soumettre un répertoire"
PLG_INSTALLER_FOLDERINSTALLER_PLUGIN_XML_DESCRIPTION="Ce plug-in permet d'installer des paquets à partir d'un répertoire."
language/fr-FR/fr-FR.com_akeeba.ini000060400000431350152453623440012737 0ustar00;; @package    AkeebaBackup
;; @copyright  Copyright (c)2006-2016 Nicholas K. Dionysopoulos
;; @license    GNU General Public License version 3, or later

COM_AKEEBA="Akeeba Backup"
COM_AKEEBA_ALICE="Dépannage - ALICE"
COM_AKEEBA_ALICE_ANALIZE_FILESYSTEM_LARGE_DIRECTORIES_ERROR="Les répertoires suivants ont un très grand nombre d'éléments : %s"
COM_AKEEBA_ALICE_ANALIZE_FILESYSTEM_LARGE_DIRECTORIES_SOLUTION="Vous devriez régler le moteur de scan sur <strong>Scan pour Gros Sites</strong>"
COM_AKEEBA_ALICE_ANALIZE_FILESYSTEM_LARGE_FILES_ERROR="Les fichiers suivants sont trop gros et peuvent causer des problèmes de sauvegarde : %s"
COM_AKEEBA_ALICE_ANALIZE_FILESYSTEM_LARGE_FILES_SOLUTION="Essayez d'exclure ces fichiers en utilisant la fonctionnalité Exclusion de Répertoires et Fichiers, ou supprimmez-les si vous êtes certain de ne plus en avoir besoin sur votre site."
COM_AKEEBA_ALICE_ANALYZE="Analyser le fichier log"
COM_AKEEBA_ALICE_ANALYZE_FILESYSTEM="Vérification des erreurs de fichiers système"
COM_AKEEBA_ALICE_ANALYZE_FILESYSTEM_LARGE_DIRECTORIES="Gros répertoires"
COM_AKEEBA_ALICE_ANALYZE_FILESYSTEM_LARGE_FILES="Problèmes de fichiers"
COM_AKEEBA_ALICE_ANALYZE_FILESYSTEM_MULTIPLE_SITES="Installations multiples Joomla! "
COM_AKEEBA_ALICE_ANALYZE_FILESYSTEM_MULTIPLE_SITES_ERROR="Installations de Joomla! trouvées dans ces sous-répertoires : %s"
COM_AKEEBA_ALICE_ANALYZE_FILESYSTEM_MULTIPLE_SITES_SOLUTION="Vous devriez exclure ces sous-répertoires afin d'évitre des problèmes de délai d'attente."
COM_AKEEBA_ALICE_ANALYZE_INIT="Initialisation de ALICE"
COM_AKEEBA_ALICE_ANALYZE_LABEL_PROGRESS="Progression de l'analyse"
; COM_AKEEBA_ALICE_ANALYZE_RAW_OUTPUT="The log analyzer has detected one or more backup issues. If following this log analyzer's suggestions and our troubleshooting documentation's instructions doesn't work and you have an active subscription on our site please file a new ticket pasting the following <em>log analysis text output</em> to help us provide you with faster support."
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS="Vérification des prérequis système"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_DATABASE="Type de base de données et version"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_DATABASE_SOLUTION="Akeeba Backup supporte uniquement MySQL 5.0.47 ou supérieur, PostgreSQL 8 ou supérieur et Microsoft SQL Server 2012 ou supérieur"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_DATABASE_UNSUPPORTED="Votre serveur de base de données n'est pas supporté. Type de base de données détecté : %s"
; COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_DATABASE_UNKNOWN="We could not detect your database type. Detected type: %s"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_DATABASE_VERSION_TOO_OLD="Version de base de données trop ancienne. Version détectée: %s"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_DBPERMISSIONS="Permissions de base de données"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_DBPERMISSIONS_ERROR="Il semble que vous ne pouvez pas exécuter SHOW TABLE et/ou SHOW VIEW \ndes éléments de votre base de données.."
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_DBPERMISSIONS_SOLUTION="Veuillez contacter votre hébergeur."
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_MEMORY="Mémoire disponible"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_MEMORY_SOLUTION="Veuillez contacter votre hébergeur."
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_MEMORY_TOO_FEW="Akeeba Backup requiert au moins 16 Mo de mémoire disponible. Mémoire disponible détectée : %sMo"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_PHP_VERSION="Version PHP"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_PHP_VERSION_ERR_TOO_NEW="Version PHP trop ancienne. Version détectée: %s"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_PHP_VERSION_ERR_TOO_OLD="Version PHP trop récente. Version détectée: %s"
COM_AKEEBA_ALICE_ANALYZE_REQUIREMENTS_PHP_VERSION_SOLUTION="Akeeba Backup nécessite PHP 5.3 ou 5.4"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS="Vérification des erreurs d'exécution"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_CORRUPTED_INSTALL="Intégrité de l'installation"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_CORRUPTED_INSTALL_ERROR="Il semble que votre installation est invalide. Cela peut se produire lorsque l'hébergeur applique des règles de sécurité très strictes, que les fichiers d'Akeeba Backup considérés comme menace de sécurité ont été supprimés ou renommés."
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_CORRUPTED_INSTALL_SOLUTION="Veuillez réinstaller Akeeba Backup <strong>sans le désinstaller</strong>. Si cela ne fonctionne pas, veuillez contacter votre hébergeur."
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_DBADD_JSAME="Base de données supplémentaires - Inclusion de base de données Joomla "
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_DBADD_JSAME_ERROR="Vous avez ajouté une base de données Joomla comme base de données supplémentaire ; votre serveur pourrait refuser une deuxième connexion à la même base de données provoquant une erreur de sauvegarde"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_DBADD_JSAME_SOLUTION="Retirez la base de données Joomla des bases de données supplémentaires"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_DBADD_NO_PROFILE="Impossible de détecter le profil utilisé, le test est annulé"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_DBADD_WRONG="Base de données supplémentaires - Détails d'accès incorrects"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_DBADD_WRONG_ERROR="Une (ou plusieurs) base de données contient des détails d'accès incorrectes"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_DBADD_WRONG_SOLUTION="Veuillez examiner les détails de la connexion aux bases de données supplémentaires"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_ERRORFILES="Fichiers journaux d'erreurs"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_ERRORFILES_FOUND="Fichiers journaux d'erreur inclus dans l'archive de sauvegarde:<br/>%s"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_ERRORFILES_SOLUTION="Vous pouvez exclure ces fichiers en utilisant l'expression régulière suivante : <strong>#(/php_error_cpanel\\.|php_error_cpanel\\.|/error_)log#</strong>"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_KETTENRAD="Problèmes de sauvegarde d'état du moteur de sauvegardes"
; COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_KETTENRAD_SOLUTION_1="It seems that a single request was processed more than once by your server.<br/>"
; COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_KETTENRAD_SOLUTION_2="This leads to failures during the backup process or corrupted archives; you should contact your host and report this issue."
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_KETTENRAD_STARTING_MORE_ONCE="Essayez de démarrer l'étape %s plus d'une fois."
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_PART_SIZE="Moteur de post-traitement et taille des parties d'archive"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_PART_SIZE_ERROR="Un moteur de post-traitement est détecté mais pas le réglage de la taille des parties d'archive, cela pourrait conduire à des problèmes de délai d'attente."
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_PART_SIZE_SOLUTION="Définir la taille dans la configuration du profil de sauvegarde."
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TIMEOUT="Limite de délai lors de la sauvegarde"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TIMEOUT_KETTENRAD_BROKEN="Il y a un problème avec le moteur de sauvegarde dans son état de con. Veuillez corriger avant de continuer."
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TIMEOUT_MAX_EXECUTION="Le script de sauvegarde a atteint la limite de délai octroyé. Limite de délai détecté :"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TIMEOUT_SOLUTION="Veuillez essayer de définir un temps d'exécution minimum de 1 seconde et de  maximum 10 secondes (ou si le délai de PHP est inférieur à 10 secondes, utilisez 75% du timeout PHP), et l'exécution bias de 75%"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TOOMANYROWS="Nombre de rangées de table"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TOOMANYROWS_ERROR="Vous essayez de sauvegarder des tables contenant beaucoup de rangées (plus d'un million) : %s"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TOOMANYROWS_ROWS="lignes"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TOOMANYROWS_SOLUTION="Vous devriez exclure ces tables en utilisant la fonction <strong>Exclure des tables et/ou leurs données</strong>"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TOOMANYROWS_TABLE="Table"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TOOMUCHDBS="Nombre de tables enregistrées"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TOOMUCHDBS_ERROR="Vous essayez de sauvegarder trop de tables de base de données à la fois. Pour y remédier, évitez de sauvegarder différentes installations de Joomla en même temps."
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_TOOMUCHDBS_SOLUTION="Vous pouvez exclure des tables non-core utilisant l'expression régulière suivante : <strong>!/^#__/</strong>"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_WINCANTAPPEND="Résultats d'écriture de l'archive de sauvegarde"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_WINCANTAPPEND_ERROR="Impossible d'ouvrir le fichier d'archive pour l'ajout."
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_WINCANTAPPEND_SOLUTION="Veuillez vérifier si vous avez suffisamment d'espace disque ou, si les ressources sont épuisées ou, si vous devez empêcher la sauvegarde du système (Windows) ou l'analyse antivirus pendant que la sauvegarde a lieu."
COM_AKEEBA_ALICE_ERROR="Erreur"
COM_AKEEBA_ALICE_SUCCESSS="Effectué avec succès"
COM_AKEEBA_ALICE_WARNING="Attention"
COM_AKEEBA_BACKUP="Sauvegarder"
COM_AKEEBA_BACKUP_ANALYSELOG="Analyse du fichier log (ALICE)"
COM_AKEEBA_BACKUP_ANGIE_PASSWORD_WARNING_1="Le script de restauration de sauvegarde (ANGIE) ne sera accessible que si vous fournissez le mot de passe indiqué dans la page précédente, avant de cliquer sur le bouton 'Sauvegarder'. ATTENTION: si vous n'avez pas indiqué de mot de passe, <strong> il est possible que votre navigateur ait auto-complété le champ du mot de passe</strong> sans votre consentement et en dépit de l'indication explicite par notre code de ne pas le faire, cela arrive avec de nombreux gestionnaires de mot de passe et certains navigateurs tels que Safari et Firefox. Veillez à vérifiez l'accessibilité et l'intégralité d'une sauvegarde en la décompressant."
COM_AKEEBA_BACKUP_ANGIE_PASSWORD_WARNING_2="Si vous ne souhaitez pas appliquer de mot de passe pour protéger l'accès au script de restauration de la sauvegarde, recharger la page, vérifiez que le champ 'Mot de passe ANGIE' est vide et cliquez à nouveau sur le bouton 'Sauvegarder'."
; COM_AKEEBA_BACKUP_ANGIE_PASSWORD_WARNING_3="You should also file a bug report to the makers of your browser and/or your password manager, telling them that their software ignores the <em>autocomplete="_QQ_"off"_QQ_"</em> attribute of web forms, <strong>which is against the web standards</strong>. Please do not report this to us as a bug. It is not a bug in our software; we have already done everything in our power to prevent this from happening. The problem is caused by your browser and/or password manager software ignoring web standards and making bad decisions on form auto-fill without asking you."
COM_AKEEBA_BACKUP_ANGIE_PASSWORD_WARNING_HEADER="ATTENTION : vous avez configuré un mot de passe pour ANGIE"
COM_AKEEBA_BACKUP_DEFAULT_DESCRIPTION="Sauvegarde effectuée le"
COM_AKEEBA_BACKUP_ERROR_UNWRITABLEOUTPUT_AUTOBACKUP="La sauvegarde automatique ne peut démarrer car le répertoire de destination n'est pas inscriptible.<br />Consultez les instructions ci-dessous pour définir comme répertoire celui par défaut d'Akeeba Backup et contourner ainsi le problème."
; COM_AKEEBA_BACKUP_ERROR_UNWRITABLEOUTPUT_COMMON="In order to fix this issue, please go to the <a href="_QQ_"%s"_QQ_">Configuration Page</a> and set the Output Directory to <tt>[DEFAULT_OUTPUT]</tt> (all caps, including the brackets). If this still doesn't work, please take a look <a href="_QQ_"%s"_QQ_">at our troubleshooting instructions</a>"
COM_AKEEBA_BACKUP_ERROR_UNWRITABLEOUTPUT_NORMALBACKUP="La sauvegarde ne peut être executée car le répertoire de destination n'est pas inscriptible.<br />Consultez les instructions ci-dessous pour définir comme répertoire celui par défaut d'Akeeba Backup et contourner ainsi le problème."
COM_AKEEBA_BACKUP_ERR_KETTENRAD_TIMEOUT="La durée de traitement allouée à Akeeba Backup a expiré. Veuillez consulter la documentation."
COM_AKEEBA_BACKUP_HEADER_BACKUPFAILED="Sauvegarde échouée"
COM_AKEEBA_BACKUP_HEADER_BACKUPFINISHED="Sauvegarde effectuée avec succès"
COM_AKEEBA_BACKUP_HEADER_BACKUPRETRY="Sauvegarde interrompue, relancée automatiquement"
COM_AKEEBA_BACKUP_HEADER_BACKUPWITHRETURNURLFINISHED="Le processus a été achevé avec succès"
COM_AKEEBA_BACKUP_HEADER_STARTNEW="Créer une sauvegarde"
COM_AKEEBA_BACKUP_LABEL_COMMENT="Commentaire de&nbsp;sauvegarde"
COM_AKEEBA_BACKUP_LABEL_COMMENT_HELP="Par commodité, ceci apparaîtra tant dans la page de Gestion des Sauvegardes que dans l’archive de sauvegarde (dans le fichier installation/README.html)."
COM_AKEEBA_BACKUP_LABEL_DESCRIPTION="Description courte"
COM_AKEEBA_BACKUP_LABEL_DESCRIPTION_HELP="Par commodité, ceci apparaîtra dans la page de Gestion des Sauvegardes."
COM_AKEEBA_BACKUP_LABEL_DETECTEDQUIRKS="La configuration d'Akeeba permet la sauvegarde mais n'est pas optimale."
COM_AKEEBA_BACKUP_LABEL_DOMAIN_FINISHED="Finalisation du processus de sauvegarde"
COM_AKEEBA_BACKUP_LABEL_DOMAIN_INIT="Initialisation du processus de sauvegarde"
COM_AKEEBA_BACKUP_LABEL_DOMAIN_INSTALLER="Incorporation du dossier d´installation"
COM_AKEEBA_BACKUP_LABEL_DOMAIN_PACKDB="Sauvegarde de la base de données"
COM_AKEEBA_BACKUP_LABEL_DOMAIN_PACKING="Sauvegarde des fichiers"
COM_AKEEBA_BACKUP_LABEL_PROGRESS="Sauvegarde en progression"
COM_AKEEBA_BACKUP_LABEL_QUIRKSLIST="Veuillez consulter les informations ci-dessous..."
COM_AKEEBA_BACKUP_LABEL_RESTORE_DEFAULT="Réinitialiser"
COM_AKEEBA_BACKUP_LABEL_START="Sauvegarder"
COM_AKEEBA_BACKUP_LABEL_WARNINGS="Attention"
COM_AKEEBA_BACKUP_STATS="Information de sauvegarde"
COM_AKEEBA_BACKUP_STATUS_NONE="Aucune sauvegarde détectée"
; COM_AKEEBA_BACKUP_TEXT_AVGWARNING="You are running AVG Antivirus with Link Scanner enabled. This is known to cause backup issues. Please disable the Link Scanner feature if you run into any problems.\n\nAre you sure you want to continue despite this warning?"
COM_AKEEBA_BACKUP_TEXT_BACKINGUP="Ne quittez pas cette page avant la fin du processus, il serait interrompu."
COM_AKEEBA_BACKUP_TEXT_BACKUPFAILED="La sauvegarde a été stoppée car une erreur a été détectée.<br />Le message d'erreur est :"
COM_AKEEBA_BACKUP_TEXT_BACKUPFAILEDRETRY="L'opération de sauvegarde a été interrompue car une erreur a été détectée. Akeeba Backup va tenter de reprendre la sauvegarde. Si vous ne voulez que cette sauvegarde soit relancée, veuillez cliquer ci-dessous sur le bouton 'Annuler'."
COM_AKEEBA_BACKUP_TEXT_BACKUPFINISHED="Sauvegarde achevée le"
COM_AKEEBA_BACKUP_TEXT_BACKUPHALT="Sauvegarde arrêtée"
COM_AKEEBA_BACKUP_TEXT_BACKUPHALT_DESC="La sauvegarde reprendra dans %d secondes."
COM_AKEEBA_BACKUP_TEXT_BACKUPRESUME="Sauvegarde reprise le"
COM_AKEEBA_BACKUP_TEXT_BACKUPSTARTED="Sauvegarde débutée le"
COM_AKEEBA_BACKUP_TEXT_BACKUPWARNING="La sauvegarde génère un avertissement"
COM_AKEEBA_BACKUP_TEXT_BTNRESUME="Reprendre"
COM_AKEEBA_BACKUP_TEXT_CONGRATS="Félicitations! Le processus de sauvegarde a été effectué avec succès.<br/>Vous pouvez maintenant naviguer sur d'autres pages."
COM_AKEEBA_BACKUP_TEXT_LASTERRORMESSAGEWAS="Pour information, le dernier message d'erreur était :"
COM_AKEEBA_BACKUP_TEXT_LASTRESPONSE="Dernière réponse du serveur : il y a %ss"
COM_AKEEBA_BACKUP_TEXT_PLEASEWAITFORREDIRECTION="Veuillez patienter, vous allez être redirigé vers la page suivante.<br> Cela peut prendre entre 5 à 30 secondes en fonction de votre connexion Internet."
COM_AKEEBA_BACKUP_TEXT_READLOGFAIL="Pour plus d'informations, consultez le fichier journal de la sauvegarde en cliquant sur le bouton 'Afficher le journal'."
COM_AKEEBA_BACKUP_TEXT_READLOGFAILPRO="Veuillez cliquer sur le bouton "_QQ_"Analyse du fichier log"_QQ_" ci-dessous afin que Akeeba Backup analyse son fichier journal pour plus d'informations."
; COM_AKEEBA_BACKUP_TEXT_RTFMTOSOLVE="We strongly recommend going through the step-by-step instructions in our <a href="_QQ_"%s"_QQ_">troubleshooting wizard</a> to easily resolve this issue yourself."
COM_AKEEBA_BACKUP_TEXT_RTFMTOSOLVEPRO="Suivre les suggestions de ALICE, notre analyseur de log, peut ne pas être suffisant. L'analyseur automatique des fichiers journaux ne pouvant couvrir toutes les causes possibles de problèmes."
; COM_AKEEBA_BACKUP_TEXT_SOLVEISSUE_CORE="If this doesn't help, you may consider <a href="_QQ_"%s"_QQ_">buying a subscription</a> so that you can ask for support in our <a href="_QQ_"%s"_QQ_">support ticket system</a>."
; COM_AKEEBA_BACKUP_TEXT_SOLVEISSUE_LOG="If you do post to our ticket system, please remember to ZIP and attach your <a href="_QQ_"%s"_QQ_">backup log file</a> in your post so that we can help you faster."
; COM_AKEEBA_BACKUP_TEXT_SOLVEISSUE_PRO="If this doesn't help, please do not hesitate to ask for support in our <a href="_QQ_"%s"_QQ_">support ticket system</a>. Do note that you need an active subscription to request assistance through the ticket system. If Akeeba Backup Professional was installed on your site by a third party -e.g. your web developer- please do not contact AkeebaBackup.com for support. Instead, contact the person who installed the software on your site and request assistance to solve this issue."
COM_AKEEBA_BACKUP_TEXT_WILLRETRY="La sauvegarde reprendra dans"
COM_AKEEBA_BACKUP_TEXT_WILLRETRYSECONDS="secondes"
COM_AKEEBA_BACKUP_TROUBLESHOOTINGDOCS="Documentation de dépannage"
COM_AKEEBA_BROWSER_ERR_BASEDIR="Le répertoire indiqué est soumis à des restrictions open_basedir. Il ne peut pas être utilisé pour y placer les sauvegardes ou pour les exécuter ; son contenu ne peut pas être sauvé mais il peut être répertoriés."
COM_AKEEBA_BROWSER_ERR_NONROOT="Information: Ce répertoire est en dehors de la racine de votre site. Son contenu peut être illisible."
COM_AKEEBA_BROWSER_ERR_NOTEXISTS="Le répertoire spécifié n'existe pas"
COM_AKEEBA_BROWSER_LBL_GO="Atteindre"
COM_AKEEBA_BROWSER_LBL_GOPARENT="&lt;Remonter d'un niveau&gt;"
COM_AKEEBA_BROWSER_LBL_USE="Utiliser"
COM_AKEEBA_BUADMIN="Gestion des sauvegardes"
; COM_AKEEBA_BUADMIN_BTN_DONTSHOWTHISAGAIN="Got it!"
COM_AKEEBA_BUADMIN_BTN_REMINDME="Me le rappeler la prochaine fois"
COM_AKEEBA_BUADMIN_ERROR_INVALIDDOWNLOAD="Impossible de télécharger le fichier de la sauvegarde spécifiée"
COM_AKEEBA_BUADMIN_ERROR_INVALIDID="Identification de sauvegarde invalide"
COM_AKEEBA_BUADMIN_LABEL_COMMENT="Commentaire"
COM_AKEEBA_BUADMIN_LABEL_DELETEFILES="Supprimer les fichiers"
COM_AKEEBA_BUADMIN_LABEL_DESCRIPTION="Description"
COM_AKEEBA_BUADMIN_LABEL_DURATION="Durée"
COM_AKEEBA_BUADMIN_LABEL_HOWDOIRESTORE_LEGEND="Comment puis-je restaurer mes sauvegardes?"
; COM_AKEEBA_BUADMIN_LABEL_HOWDOIRESTORE_TEXT_CORE="<p>It's easy! You can watch our <a href="_QQ_"%s"_QQ_" target="_QQ_"_blank"_QQ_">video tutorial</a>.</p><p>If you want to restore to a new, public server you can use the <a href="_QQ_"%s"_QQ_">Site Transfer Wizard</a>. If you'd rather do it manually or restore to your own computer or Intranet please watch our <a href="_QQ_"%1$s"_QQ_" target="_QQ_"_blank"_QQ_">video tutorial</a> and <a href=href="_QQ_"%3$s"_QQ_" target="_QQ_"_blank"_QQ_">download Akeeba Kickstart Core (free of charge)</a> to extract the backup archives.</p>"
; COM_AKEEBA_BUADMIN_LABEL_HOWDOIRESTORE_TEXT_PRO="<p>It's easy! Select the check box next to a backup entry. Now click on the <em>Restore</em> button in the toolbar.</p><p>If you want to restore to a new, public server you can use the <a href="_QQ_"%2$s"_QQ_">Site Transfer Wizard</a>. If you'd rather do it manually or restore to your own computer or Intranet please watch our <a href="_QQ_"%1$s"_QQ_" target="_QQ_"_blank"_QQ_">video tutorial</a> and <a href=href="_QQ_"%3$s"_QQ_" target="_QQ_"_blank"_QQ_">download Akeeba Kickstart Core (free of charge)</a>  to extract the backup archives.</p>"
COM_AKEEBA_BUADMIN_LABEL_ID="ID"
COM_AKEEBA_BUADMIN_LABEL_MANAGEANDDL="Gérer &amp; télécharger"
COM_AKEEBA_BUADMIN_LABEL_NODESCRIPTION="(aucune description)"
COM_AKEEBA_BUADMIN_LABEL_ORIGIN="Origine"
COM_AKEEBA_BUADMIN_LABEL_ORIGIN_BACKEND="Administration"
COM_AKEEBA_BUADMIN_LABEL_ORIGIN_CLI="Ligne de commande"
COM_AKEEBA_BUADMIN_LABEL_ORIGIN_FRONTEND="Frontal"
COM_AKEEBA_BUADMIN_LABEL_ORIGIN_JSON="API JSON"
COM_AKEEBA_BUADMIN_LABEL_PART="Partie %02d"
COM_AKEEBA_BUADMIN_LABEL_PROFILEID="Profil"
COM_AKEEBA_BUADMIN_LABEL_REMOTEFILEMGMT="Gérer les fichiers stockés à distance"
COM_AKEEBA_BUADMIN_LABEL_RESTORE="Restaurer"
COM_AKEEBA_BUADMIN_LABEL_SIZE="Taille"
; COM_AKEEBA_BUADMIN_LABEL_START="Backup Start Time"
COM_AKEEBA_BUADMIN_LABEL_STATUS="Statut"
COM_AKEEBA_BUADMIN_LABEL_STATUS_FAIL="Erreur"
COM_AKEEBA_BUADMIN_LABEL_STATUS_OBSOLETE="Obsolète"
COM_AKEEBA_BUADMIN_LABEL_STATUS_OK="OK"
COM_AKEEBA_BUADMIN_LABEL_STATUS_PENDING="En attente"
COM_AKEEBA_BUADMIN_LABEL_STATUS_REMOTE="Automatisation"
COM_AKEEBA_BUADMIN_LABEL_TYPE="Type"
; COM_AKEEBA_BUADMIN_LBL_ARCHIVEEXISTS="Is my backup archive still available on my server?"
; COM_AKEEBA_BUADMIN_LBL_ARCHIVENAME="What's it called?"
; COM_AKEEBA_BUADMIN_LBL_ARCHIVENAME_PAST="What was it called?"
COM_AKEEBA_BUADMIN_LBL_ARCHIVEPATH="Où puis-je la trouver sur mon serveur ?"
; COM_AKEEBA_BUADMIN_LBL_ARCHIVEPATH_PAST="Where was it on my server?"
; COM_AKEEBA_BUADMIN_LBL_BACKUPINFO="Backup Archive Information"
; COM_AKEEBA_BUADMIN_LBL_DOWNLOAD_PARTS="Your backup consists of %d part files. You <em>must</em> download all of them and put them in the same directory for the archive extraction and backup restoration to succeed."
; COM_AKEEBA_BUADMIN_LBL_DOWNLOAD_TITLE="Downloading through your browser may corrupt the files"
; COM_AKEEBA_BUADMIN_LBL_DOWNLOAD_WARNING="We recommend closing this dialog and using FTP in <code>Binary</code> transfer mode or SFTP to download your backup archives."
; COM_AKEEBA_BUADMIN_LBL_LOGFILEID="Log file ID"
COM_AKEEBA_BUADMIN_LOG_DOWNLOAD="Télécharger"
COM_AKEEBA_BUADMIN_LOG_DOWNLOAD_CONFIRM="Le téléchargement des fichiers de sauvegarde via le navigateur peut dans certaines circonstances les corrompre ou les rendre partiels et ainsi empêcher une restauration ultérieure. Voulez vous continuer ?"
COM_AKEEBA_BUADMIN_LOG_EDITCOMMENT="Voir/éditer commentaire"
COM_AKEEBA_BUADMIN_LOG_SAVEDOK="Les modifications apportées à l'information de sauvegarde ont été enregistrées avec succès"
COM_AKEEBA_BUADMIN_LOG_SAVEERROR="Les modifications apportées à l'information de sauvegarde n'ont pas pu être enregistrées"
COM_AKEEBA_BUADMIN_MSG_DELETED="L'entrée de sauvegarde et le fichier ont été supprimés avec succès"
COM_AKEEBA_BUADMIN_MSG_DELETEDFILE="Le fichier de la sauvegarde a été supprimé avec succès"
COM_AKEEBA_COMMON_EMAIL_DEAFULT_SUBJECT="Nouveau fragment de sauvegarde"
; COM_AKEEBA_COMMON_PHPVERSIONTOOOLD_WARNING_BODY="Your site is running on PHP %s which has stopped receiving security updates since %s. Using this on a live site is <b>dangerous</b>: unpatched security issues can get your site hacked. Moreover, we can only guarantee support for obsolete versions of PHP after nine months since their end-of-life date. Therefore, support for your version of PHP may be dropped any time after %s. We strongly advise you to ask your host to upgrade your site to PHP %s or later."
COM_AKEEBA_COMMON_PHPVERSIONTOOOLD_WARNING_TITLE="Vous utiliser une version de PHP obsolète"
COM_AKEEBA_COMMON_UPDATE_INFORMATION_RELOADED="Les informations de mise à jour ont été rechargées depuis le serveur"
COM_AKEEBA_CONFIG="Configuration"
COM_AKEEBA_CONFIG_ADVANCED="Configuration avancée"
COM_AKEEBA_CONFIG_ADVANCED_SBALF_DESC="Si activé, Akeeba Backup n'effectuera pas de pause après l'archivage des fichiers volumineux. Akeeba Backup travaillera plus vite, mais cela peut entraîner des erreurs serveur de timeout."
COM_AKEEBA_CONFIG_ADVANCED_SBALF_LABEL="Ignorer les pauses suivant le traitement de gros fichiers"
COM_AKEEBA_CONFIG_ADVANCED_SBBD_DESC="Si activé, Akeeba Backup n'effectuera pas de pause entre le traitement des différents domaines. Cela améliore la verbosité du processus, mais il prolonge le temps de sauvegarde de 10 à 20 secondes. Akeeba Backup travaillera plus vite, mais cela peut entraîner des messages imprévisibles signalés sur la page de sauvegarde."
COM_AKEEBA_CONFIG_ADVANCED_SBBD_LABEL="Ignorer les pauses entre le traitement des domaines"
COM_AKEEBA_CONFIG_ADVANCED_SBBLF_DESC="Si activé, Akeeba Backup n'effectuera pas de pause avant l'archivage des fichiers volumineux. Akeeba Backup travaillera plus vite, mais cela peut entraîner des erreurs serveur de timeout."
COM_AKEEBA_CONFIG_ADVANCED_SBBLF_LABEL="Ignorer les pauses précédant le traitement de gros fichiers"
COM_AKEEBA_CONFIG_ADVANCED_SBPA_DESC="Si activé, Akeeba Backup n'effectuera pas de pause avant l'archivage des fichiers si le temps disponible est estimé insuffisant. Ce calcul est approximatif et peut entraîner un ralentissement de la sauvegarde. Akeeba Backup travaillera plus vite, mais cela peut entraîner des erreurs serveur de timeout."
COM_AKEEBA_CONFIG_ADVANCED_SBPA_LABEL="Ignorer les pauses proactives du processus"
COM_AKEEBA_CONFIG_ADVANCED_SBPP_DESC="Si activé, Akeeba Backup n'effectuera pas de pause après la mise au point de  la sauvegarde et avant le post-traitement. Cela peut ajouter environ 10 secondes au temps de sauvegarde globale. Akeeba Backup travaillera plus vite, mais cela peut entraîner des erreurs serveur de timeout."
COM_AKEEBA_CONFIG_ADVANCED_SBPP_LABEL="Ignorer les pauses lors de la finalisation"
COM_AKEEBA_CONFIG_ADVANCED_SETTIMELIMIT_DESC="Si votre serveur ne fonctionne pas en mode PHP sans échec (safe mode) et supporte 'set_time_limit ()', Akeeba Backup va tenter d'appliquer un temps d'exécution PHP maximal pour contourner les problèmes potentiels de timeout"
COM_AKEEBA_CONFIG_ADVANCED_SETTIMELIMIT_LABEL="Contourner la limite du temps de traitement autorisé"
COM_AKEEBA_CONFIG_ANGIE_KEY_DESCRIPTION="Si vous utilisez le script d'installation intégré 'ANGIE' vous pouvez facultativement le protéger par un mot de passe empêchant l'accès non autorisé à l'installateur. Lorsque vous exécutez le programme d'installation, vous serez invité à entrer ce mot de passe. Veuillez noter que le mot de passe est sensible à la casse, par exemple : ABC, abc et Abc sont trois mots de passe différents."
COM_AKEEBA_CONFIG_ANGIE_KEY_TITLE="Mot de passe 'ANGIE'"
COM_AKEEBA_CONFIG_ARBITRARYFEEMAIL_DESC="Spécifiez l'adresse e-mail à laquelle la notification de sauvegarde doit être envoyée.<br />Laisser vide pour envoyer un e-mail à tout les Super Administrateurs."
COM_AKEEBA_CONFIG_ARBITRARYFEEMAIL_LABEL="Adresse e-mail"
COM_AKEEBA_CONFIG_ARCHIVENAME_DESCRIPTION="Nom attribué aux sauvegardes de ce profil.<br />Vous pouvez utiliser les valeurs suivantes dans le nom :<ul><li><b>[HOST]</b> = Nom du serveur</li><li><b>[DATE]</b> = Date courante</li><li><b>[TIME]</b> = Heure courante</li></ul>"
COM_AKEEBA_CONFIG_ARCHIVENAME_TITLE="Nom des sauvegardes"
COM_AKEEBA_CONFIG_ARCHIVERENGINE_DESCRIPTION="Définit le format d'archive utilisé pour les sauvegardes.<br />Pour une optimisation des sauvegardes de fichiers, il est conseillé d'utiliser le format de compression JPA d'Akeeba.<br />Le DirectFTP ne produit pas d'archive mais transfère les fichiers vers un autre serveur."
COM_AKEEBA_CONFIG_ARCHIVERENGINE_TITLE="Format d'archive des sauvegardes"
; COM_AKEEBA_CONFIG_AUTORESUME_DESCRIPTION="When this option is unchecked Akeeba Backup will halt the backup when the server responds with an error. When this option is enabled, Akeeba Backup will try to resume the backup by repeating the last step. This only applies to back-end backups. It will also not let you successfully resume all backups which result in an error: only backup attempts temporarily blocked by server CPU usage restrictions or network outage issues can be resumed."
COM_AKEEBA_CONFIG_AUTORESUME_MAXRETRIES_DESCRIPTION="Nombre de tentative de reprise de sauvegarde avant abandon. 3 à 5 tentatives sont des valeurs adaptatées pour la plupart des serveurs."
COM_AKEEBA_CONFIG_AUTORESUME_MAXRETRIES_TITLE="Nombre maximal de tentatives d'une étape de sauvegarde avant message d'erreur AJAX"
COM_AKEEBA_CONFIG_AUTORESUME_TIMEOUT_DESCRIPTION="Nombre de secondes d'attente avant tentative de reprise d'une sauvegarde interrompue. Il est conseillé d'indiquer 30 secondes ou plus (120 secondes est recommandé dans la plupart des cas) pour donner au serveur le temps nécessaire à la libération du processus de sauvegarde."
COM_AKEEBA_CONFIG_AUTORESUME_TIMEOUT_TITLE="Temps d'attente avant de relancer l'étape sauvegarde"
COM_AKEEBA_CONFIG_AUTORESUME_TITLE="Reprendre la sauvegarde après une erreur AJAX"
COM_AKEEBA_CONFIG_AUTOUPDATE_NOTIFY="Notification uniquement"
COM_AKEEBA_CONFIG_AUTOUPDATE_NOTIFY_UPDATE="Notification et mise à jour"
COM_AKEEBA_CONFIG_AUTOUPDATE_SETTINGS_DESC="Que doit faire le script CLI de mise à jour automatique ?"
COM_AKEEBA_CONFIG_AUTOUPDATE_SETTINGS_LABEL="Script CLI de mise à jour automatique"
COM_AKEEBA_CONFIG_AUTOUPDATE_UPDATE="Mise à jour uniquement"
COM_AKEEBA_CONFIG_AZURE_ACCOUNTNAME_DESCRIPTION="Nom de votre compte : si l'adresse contient par exemple foobar.blob.core.windows.net votre nom de compte est 'foobar'."
COM_AKEEBA_CONFIG_AZURE_ACCOUNTNAME_TITLE="Nom du compte"
COM_AKEEBA_CONFIG_AZURE_CONTAINER_DESCRIPTION="Répertoire sur Windows Azure BLOB dans lequel les sauvegardes doivent être stockées. Attention, il doit être créé avant!"
COM_AKEEBA_CONFIG_AZURE_CONTAINER_TITLE="Répertoire"
COM_AKEEBA_CONFIG_AZURE_DIRECTORY_DESCRIPTION="Dossier du répertoire sur Windows Azure BLOB dans lequel les sauvegardes doivent être stockées. Si vous souhaitez les stocker à la racine du conteneur."
COM_AKEEBA_CONFIG_AZURE_DIRECTORY_TITLE="Dossier"
COM_AKEEBA_CONFIG_AZURE_KEY_DESCRIPTION="Vous pouvez consulter votre clé d'accès primaire sur la page de votre compte sur windows.azure.com. Copiez et collez-le dans ce champ. Cette clé se termine toujours par deux signes d'égalité."
COM_AKEEBA_CONFIG_AZURE_KEY_TITLE="Clé d'accès"
COM_AKEEBA_CONFIG_BACKEND_HEADER_DESC="Options d'instruction sur l'utilisation en administration des scripts d'Akeeba."
COM_AKEEBA_CONFIG_BACKEND_HEADER_LABEL="Administration"
COM_AKEEBA_CONFIG_BACKUPTYPE_ALLDB="Toutes les bases de données"
COM_AKEEBA_CONFIG_BACKUPTYPE_DBONLY="Base de données du site uniquement"
COM_AKEEBA_CONFIG_BACKUPTYPE_DESCRIPTION="Choisissez les éléments à inclure dans une sauvegarde.<br />La sauvegarde de la base de données du site crée un fichier .sql<br />Les autres types de sauvegarde créent un fichier archive dont vous pouvez choisir le format plus bas."
COM_AKEEBA_CONFIG_BACKUPTYPE_FILEONLY="Fichiers du site uniquement"
COM_AKEEBA_CONFIG_BACKUPTYPE_FULL="Fichiers du site et base de données"
COM_AKEEBA_CONFIG_BACKUPTYPE_INCFILE="Fichiers uniquement, incrémentés"
COM_AKEEBA_CONFIG_BACKUPTYPE_INCFULL="Site complet, les fichiers supplémentaires"
COM_AKEEBA_CONFIG_BACKUPTYPE_TITLE="Type de Sauvegarde"
COM_AKEEBA_CONFIG_BACTHSIZE_DESCRIPTION="Diminuez cette valeur pour préserver la mémoire et éviter les erreurs HTTP 500 lors de la sauvegarde des tables contenant de très grandes quantités de données"
COM_AKEEBA_CONFIG_BACTHSIZE_TITLE="Nombre de lignes par lot"
COM_AKEEBA_CONFIG_BIGFILETHRESHOLD_DESCRIPTION="Définissez la taille limite au delà de laquelle un fichier ne doit pas être compressé ou fractionné.<br />N'augmentez cette valeur que sur un serveur rapide et fiable."
COM_AKEEBA_CONFIG_BIGFILETHRESHOLD_TITLE="Taille limite à traiter"
COM_AKEEBA_CONFIG_BLANKOUTPASS_DESCRIPTION="Effacer de la sauvegarde le nom d'utilisateur et le mot de passe de connexion à la base de données."
COM_AKEEBA_CONFIG_BLANKOUTPASS_TITLE="Effacer l'identifiant et le mot de passe"
COM_AKEEBA_CONFIG_BOX_CHUNKUPLOAD_ENABLE="Activer chunk upload"
COM_AKEEBA_CONFIG_BOX_CHUNKUPLOAD_SIZE="Taille des fragments"
COM_AKEEBA_CONFIG_BOX_OPENOAUTH_DESC="Cliquez sur ce bouton pour ouvrir une nouvelle fenêtre et vous connecter à votre compte d'espace de stockage. Veuillez ensuite fermer la fenêtre et cliquez sur le bouton 'Étape 2' ci-dessous."
COM_AKEEBA_CONFIG_BOX_OPENOAUTH_TITLE="Authentification - Étape 1"
COM_AKEEBA_CONFIG_BOX_TOKEN_DESC="Cliquez sur ce bouton après avoir cliqué sur le bouton de l'étape 1 et vous être connecté à votre compte d'espace de stockage."
COM_AKEEBA_CONFIG_BOX_TOKEN_TITLE="Authentification - Étape 2"
COM_AKEEBA_CONFIG_CHUNKSIZE_DESCRIPTION="Définissez la taille de fractionnement des gros fichiers si un trop long délai d'attente stoppe la sauvegarde."
COM_AKEEBA_CONFIG_CHUNKSIZE_TITLE="Taille de fractionnement d'un gros fichier"
COM_AKEEBA_CONFIG_CLIENTSIDEWAIT_DESCRIPTION="Si décoché (par défaut), l'étape de fin de la sauvegarde, inclus dans le temps d'exécution minimum configuré dans le profil de sauvegarde, aura le délai d'attente du serveur jusqu'à son aboutissement. Cela peut causer des erreurs sur les serveurs très restrictifs et empêcher la sauvegarde. Dans ce cas, cochez cette case pour appliquer un délai d'attente basé sur le navigateur. IMPORTANT: Cette option s'applique uniquement aux sauvegardes effectuées en administration du site. Pour les sauvegardes en frontal, API JSON (à distance) et par ligne de commande (CLI), le délai d'attente sera toujours appliqué côté serveur."
COM_AKEEBA_CONFIG_CLIENTSIDEWAIT_TITLE="Mise en oeuvre côté client du temps d'exécution minimum"
COM_AKEEBA_CONFIG_CLOUDFILESAPIKEY_DESCRIPTION="Votre clé API sur CloudFiles"
COM_AKEEBA_CONFIG_CLOUDFILESAPIKEY_TITLE="Clé API"
COM_AKEEBA_CONFIG_CLOUDFILESCONTAINER_DESCRIPTION="Répertoire sur CloudFiles dans lequel les sauvegardes doivent être stockées."
COM_AKEEBA_CONFIG_CLOUDFILESCONTAINER_TITLE="Répertoire"
COM_AKEEBA_CONFIG_CLOUDFILESDIRECTORY_DESCRIPTION="Dossier du répertoire sur CloudFiles dans lequel les sauvegardes doivent être stockées."
COM_AKEEBA_CONFIG_CLOUDFILESDIRECTORY_TITLE="Dossier"
COM_AKEEBA_CONFIG_CLOUDFILESUSERNAME_DESCRIPTION="Votre identifiant sur CloudFiles"
COM_AKEEBA_CONFIG_CLOUDFILESUSERNAME_TITLE="Identifiant"
COM_AKEEBA_CONFIG_CLOUDME_DIRECTORY_DESCRIPTION="Le répertoire où seront stockées vos archives de sauvegardes sur votre compte CloudMe. Laissez vide pour stocker les fichiers dans le répertoire racine de CloudMe."
COM_AKEEBA_CONFIG_CLOUDME_DIRECTORY_TITLE="Répertoire"
COM_AKEEBA_CONFIG_CLOUDME_PASSWORD_DESCRIPTION=""
COM_AKEEBA_CONFIG_CLOUDME_PASSWORD_TITLE="Mot de passe"
COM_AKEEBA_CONFIG_CLOUDME_USERNAME_DESCRIPTION=""
COM_AKEEBA_CONFIG_CLOUDME_USERNAME_TITLE="Identifiant"
COM_AKEEBA_CONFIG_COUNTQUOTA_ENABLE_DESCRIPTION="Le contrôle du nombre de sauvegardes active la suppression automatique de la plus ancienne si celle en cours entraîne le dépassement du nombre autorisé.<br/>Adaptez le nombre en fonction de la fréquence des sauvegardes et de l'espace à votre disposition."
COM_AKEEBA_CONFIG_COUNTQUOTA_ENABLE_TITLE="Activer le contrôle du nombre de sauvegardes"
COM_AKEEBA_CONFIG_COUNTQUOTA_VALUE_DESCRIPTION="Définissez le nombre de sauvegardes à conserver. Les sauvegardes en plusieurs archives sont également considérées comme uniques."
COM_AKEEBA_CONFIG_COUNTQUOTA_VALUE_TITLE="Nombre de sauvegardes à conserver"
COM_AKEEBA_CONFIG_DATEFORMAT_DESC="Modifier la façon dont la date/heure de sauvegardes est affichée dans la page 'Gestion des sauvegardes'. Laissez vide pour utiliser le formatage par défaut. Vous pouvez utiliser les options de mise en forme de la fonction date de PHP: http://www.php.net/manual/en/function.date.php"
COM_AKEEBA_CONFIG_DATEFORMAT_LABEL="Format de date"
COM_AKEEBA_CONFIG_DELETEAFTER_DESCRIPTION="Cette fonction permet de supprimer automatiquement l'archive du serveur après le téléchargement de la sauvegarde."
COM_AKEEBA_CONFIG_DELETEAFTER_TITLE="Supprimer après le processus"
COM_AKEEBA_CONFIG_DEREFERENCESYMLINKS_DESCRIPTION="Si activé, les liens symboliques vers des contenus sont indexés comme les liens vers les répertoires et fichiers.<br /><strong>Attention</strong>, si les contenus contiennent des liens qui se renvoie les uns aux autres (boucle sans fin), des erreurs peuvent apparaitre ; vous devez alors désactiver cette option."
COM_AKEEBA_CONFIG_DEREFERENCESYMLINKS_TITLE="Référencement des liens symboliques"
; COM_AKEEBA_CONFIG_DESKTOP_NOTIFICATIONS_DESC="Should you be asked to allow desktop notifications to be displayed? Desktop notifications appear when the backups starts, finishes, throws a warning or halts. They are only displayed on compatible browsers (typically: Chrome, Safari, Firefox, Opera) if you give Akeeba Backup the permission to display desktop notifications when prompted in the Control Panel page. This option only controls whether this prompt should be displayed. Once you accept or decline the desktop notification messages permissions this setting has <b>no effect</b>. The only way to enable or disable desktop notifications will be through your browser's settings."
; COM_AKEEBA_CONFIG_DESKTOP_NOTIFICATIONS_LABEL="Ask for Desktop Notifications permissions"
; COM_AKEEBA_CONFIG_DIRECTFTP_FTPS_DESCRIPTION="If enabled, Akeeba Backup will try to connect to your FTP server using an SSL-encrypted connection. <strong>This is not the same as SFTP, SCP or "_QQ_"Secure FTP"_QQ_"!</strong> Do note that if your server doesn't support this method you will get connection errors."
COM_AKEEBA_CONFIG_DIRECTFTP_FTPS_TITLE="Utiliser le protocole FTPS (FTP avec SSL)"
COM_AKEEBA_CONFIG_DIRECTFTP_HOST_DESCRIPTION="Nom du serveur FTP, sans le protocole.<br />Exemple : mon-site.com<br /> Akeeba fonctionne avec les protocole FTP et FTPS. Les protocoles SFTP, SCP et les variantes SSH ne sont pas compatibles."
COM_AKEEBA_CONFIG_DIRECTFTP_HOST_TITLE="Nom d'hôte"
COM_AKEEBA_CONFIG_DIRECTFTP_INITDIR_DESCRIPTION="Chemin FTP absolu du répertoire de destination.<br />Utilisez votre logiciel FTP pour visualiser le chemin. Vous pouvez le copier puis le coller dans ce champ.<br />Le répertoire initial varie selon les hébergeurs (httpdocs, public_html, web, etc.)."
COM_AKEEBA_CONFIG_DIRECTFTP_INITDIR_TITLE="Répertoire initial"
COM_AKEEBA_CONFIG_DIRECTFTP_PASSIVE_DESCRIPTION="Le mode FTP passif pour le transfert des fichiers est activé par défaut car il est le seul à fonctionner avec les pares-feu habituels des serveurs web. Ne désactivez le mode passif que si vous êtes sûr que votre serveur web n'est pas derrière un pare-feu et que votre serveur FTP le nécessite absolument."
COM_AKEEBA_CONFIG_DIRECTFTP_PASSIVE_TITLE="Utiliser le mode Passif"
COM_AKEEBA_CONFIG_DIRECTFTP_PASSWORD_DESCRIPTION="Mot de passe pour l'accès FTP, définit dans la console d'administration du serveur ou attribué par votre hébergeur.<br />Veillez à respecter les majuscules et minuscules."
COM_AKEEBA_CONFIG_DIRECTFTP_PASSWORD_TITLE="Mot de passe"
COM_AKEEBA_CONFIG_DIRECTFTP_PORT_DESCRIPTION="Port du serveur FTP. En général le 21, mais votre hébergeur peut lui avoir attribué un port différent. Contactez-le si le port 21 ne fonctionne pas et que vous ne savez pas lequel spécifier."
COM_AKEEBA_CONFIG_DIRECTFTP_PORT_TITLE="Port FTP"
COM_AKEEBA_CONFIG_DIRECTFTP_TEST_DESCRIPTION="Utiliser ce bouton pour tester la connexion et être informé des éventuels erreurs."
COM_AKEEBA_CONFIG_DIRECTFTP_TEST_FAIL="Impossible de se connecter au serveur FTP !"
COM_AKEEBA_CONFIG_DIRECTFTP_TEST_OK="La connexion avec le serveur FTP a été établie avec succès."
COM_AKEEBA_CONFIG_DIRECTFTP_TEST_TITLE="Test de la connexion FTP"
COM_AKEEBA_CONFIG_DIRECTFTP_USER_DESCRIPTION="Nom d'identifiant pour l'accès FTP, définit dans la console d'administration du serveur ou attribué par votre hébergeur.<br />Veillez à respecter les majuscules et minuscules."
COM_AKEEBA_CONFIG_DIRECTFTP_USER_TITLE="Nom d'identifiant"
COM_AKEEBA_CONFIG_DIRECTSFTP_HOST_DESCRIPTION="Veuillez indiquer le nom d'hôte ou l'adresse IP de votre serveur SFTP"
COM_AKEEBA_CONFIG_DIRECTSFTP_HOST_TITLE="Nom du serveur hôte"
COM_AKEEBA_CONFIG_DIRECTSFTP_INITDIR_DESCRIPTION="Veuillez indiquer le chemin du répertoire où les fichiers doivent être envoyés. En cas de doute, utilisez votre logiciel client SFTP habituel, connectez-vous à votre serveur, accédez au répertoire de votre choix, et copiez/collez dans ce champ le chemin affiché. Le chemin doit être absolu, par exemple: /users/myusername/public_html"
COM_AKEEBA_CONFIG_DIRECTSFTP_INITDIR_TITLE="Répertoire initial"
COM_AKEEBA_CONFIG_DIRECTSFTP_PASSWORD_DESCRIPTION="Mot de passe SFTP. Veuillez noter que votre serveur SFTP doit autoriser l'authentification par nom d'utilisateur/mot de passe."
COM_AKEEBA_CONFIG_DIRECTSFTP_PASSWORD_TITLE="Mot de passe"
COM_AKEEBA_CONFIG_DIRECTSFTP_PORT_DESCRIPTION="Le port habituel pour les connexions SFTP est de 22. Si votre serveur utilise un port différent, veuillez l'indiquer dans ce champ."
COM_AKEEBA_CONFIG_DIRECTSFTP_PORT_TITLE="Port"
COM_AKEEBA_CONFIG_DIRECTSFTP_TEST_DESCRIPTION="Utilisez ce bouton pour tester la connexion SFTP et afficher en cas d'échec les erreurs de connexion."
COM_AKEEBA_CONFIG_DIRECTSFTP_TEST_FAIL="Impossible de se connecter au serveur distant SFTP. L'erreur est :"
COM_AKEEBA_CONFIG_DIRECTSFTP_TEST_OK="Connecté avec succès au serveur distant SFTP. Note: la configuration du répertoire initial n'a pas été testée."
COM_AKEEBA_CONFIG_DIRECTSFTP_TEST_TITLE="Test de connexion SFTP"
COM_AKEEBA_CONFIG_DIRECTSFTP_USER_DESCRIPTION="Nom d'utilisateur SFTP. Veuillez noter que votre serveur SFTP doit autoriser l'authentification par nom d'utilisateur/mot de passe."
COM_AKEEBA_CONFIG_DIRECTSFTP_USER_TITLE="Nom d'utilisateur"
COM_AKEEBA_CONFIG_DOWNLOADID_DESC="Le numéro d'identification est nécessaire pour mettre à jour Akeeba Pro.<br />Vous pouvez obtenir votre numéro d'identification personnel après souscription par le lien suivant : https://www.akeebabackup.com/my-subscriptions.html."
COM_AKEEBA_CONFIG_DOWNLOADID_LABEL="ID de mise à jour (compte Akeeba)"
COM_AKEEBA_CONFIG_DREAMOBJECTSACCESSKEY_DESCRIPTION="Votre clé d'accès DreamObjects mise à disposition dans votre panneau de contrôle DreamHost."
COM_AKEEBA_CONFIG_DREAMOBJECTSACCESSKEY_TITLE="Clé d'accès"
COM_AKEEBA_CONFIG_DREAMOBJECTSBUCKET_DESCRIPTION="Le nom de votre panier DreamObjects. Veuillez vérifier qu'il est bien identique à celui de votre panneau de contrôle DreamHost."
COM_AKEEBA_CONFIG_DREAMOBJECTSBUCKET_TITLE="Panier"
COM_AKEEBA_CONFIG_DREAMOBJECTSDIRECTORY_DESCRIPTION="Répertoire de votre panier dans lequel les sauvegardes seront stockées. Laissez vide pour les stocker à la racine."
COM_AKEEBA_CONFIG_DREAMOBJECTSDIRECTORY_TITLE="Répertoire"
COM_AKEEBA_CONFIG_DREAMOBJECTSLOWERCASE_DESCRIPTION="Si activé, Akeeba Backup va essayer de convertir le nom du panier en lettres minuscules. Exemple: MonPanier sera converti en monpanier. Si vous avez crée un nom de panier avec des lettres majuscules, par exemple MonNouveauPanier, décochez cette option et vérifiez qu'il est écrit comme dans votre panneau de contrôle DreamHost."
COM_AKEEBA_CONFIG_DREAMOBJECTSLOWERCASE_TITLE="Nom du panier en lettres minuscules"
COM_AKEEBA_CONFIG_DREAMOBJECTSSECRETKEY_DESCRIPTION="Votre mot secret DreamObjects mis à disposition dans votre panneau de contrôle DreamHost."
COM_AKEEBA_CONFIG_DREAMOBJECTSSECRETKEY_TITLE="Mot secret"
COM_AKEEBA_CONFIG_DREAMOBJECTSUSESSL_DESCRIPTION="Si activé, une connexion sécurisée (HTTPS) sera utilisée lors de l'envoi des fichiers. Cette fonction augmente la sécurité des données transférées, mais augmente également la possibilité d'échec de sauvegarde dû aux délais d'attente!"
COM_AKEEBA_CONFIG_DREAMOBJECTSUSESSL_TITLE="Utiliser le mode SSL"
COM_AKEEBA_CONFIG_DROPBOXDIRECTORY_DESCRIPTION="Répertoire de votre compte DropBox dans lequel les sauvegardes seront stockées.<br/>Laissez vide pour les stocker à la racine."
COM_AKEEBA_CONFIG_DROPBOXDIRECTORY_TITLE="Répertoire"
COM_AKEEBA_CONFIG_DROPBOXTOKENSECRET_DESCRIPTION="Ceci est automatiquement récupéré à partir de Dropbox lorsque vous cliquez sur le bouton Étape 2 ci-dessus. Si vous avez plusieurs sites, vous devez utiliser l'Étape 1 et l'Étape 2 sur le premier site que vous voulez autoriser, puis vous pouvez copier et coller les valeurs dans les autres sites."
COM_AKEEBA_CONFIG_DROPBOXTOKENSECRET_TITLE="Mot Secret Token"
COM_AKEEBA_CONFIG_DROPBOXTOKEN_DESCRIPTION="Ceci est automatiquement récupéré à partir de Dropbox lorsque vous cliquez sur le bouton Étape 2 ci-dessus. Si vous avez plusieurs sites, vous devez utiliser l'Étape 1 et l'Étape 2 sur le premier site que vous voulez autoriser, puis vous pouvez copier et coller les valeurs dans les autres sites."
COM_AKEEBA_CONFIG_DROPBOXTOKEN_TITLE="Token"
COM_AKEEBA_CONFIG_DROPBOXUID_DESCRIPTION="ID utilisateur numérique de Dropbox. Si vous avez plusieurs sites, vous devez utiliser les boutons de l'étape 1 et 2 seulement sur ​​le premier site que vous souhaitez autoriser. Veuillez copier le Token, la clé secrète et l'ID utilisateur du premier site que vous appliquerez à tous les autres sites que vous souhaitez connecter à Dropbox."
COM_AKEEBA_CONFIG_DROPBOXUID_TITLE="ID utilisateur"
COM_AKEEBA_CONFIG_DUMPENGINE_DESCRIPTION="Choix et configuration du processus utilisé pour la sauvegarde des bases de données."
COM_AKEEBA_CONFIG_DUMPENGINE_TITLE="Processus de sauvegarde des bases de données"
COM_AKEEBA_CONFIG_DUMP_DIVIDER_COMMON="Paramètres communs"
COM_AKEEBA_CONFIG_DUMP_DIVIDER_MYSQL="Paramètres MySQL"
COM_AKEEBA_CONFIG_DUMP_DIVIDER_REVERSE="Paramètres de sauvergarde de régénération de structure de la base de données"
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_DIRECTFTP_DESCRIPTION="Transfert des fichiers vers un serveur FTP distant, sans les archiver préalablement"
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_DIRECTFTP_TITLE="Transfert FTP"
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_DIRECTSFTP_DESCRIPTION="Transfert des fichiers du site sur un serveur distant SFTP, sans archivage en premier. ATTENTION: Votre serveur source doit avoir l'extension PHP SSL2 installée et activée."
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_DIRECTSFTP_TITLE="Transfert SFTP"
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_JPA_DESCRIPTION="Format d'archive open-source optimisé pour la création et l'extraction rapide d'archives à l'aide du code PHP"
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_JPA_TITLE="Archive JPA (recommandé)"
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_JPS_DESCRIPTION="Cryptage effectué avec la méthode de industry-standard AES-128, un format très similaire au format JPA.<br /><strong>Attention:</strong> l'extension mcrypt PHP doit être installé et activée sur le serveur."
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_JPS_TITLE="Archives cryptées (JPS)"
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_ZIPNATIVE_DESCRIPTION="L'archive ZIP sera crée en utilisant la classe PHP ZipArchive.<br />IMPORTANT : Cette méthode de compression ne traite pas le fractionnement des archives ou les liens symboliques et peut par conséquent mener à des sauvegardes erronées.<br />Si vous obtenez des erreurs de temps mort, des erreurs AJAX ou des messages d'erreur du Serveur Interne, vous devrez choisir une autre méthode de compression."
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_ZIPNATIVE_TITLE="Archive ZIP avec classe ZipArchive"
; COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_ZIP_DESCRIPTION="Standard ZIP files, a.k.a. "_QQ_"Compressed folders"_QQ_", natively supported by all leading operating systems"
COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_ZIP_TITLE="Archive ZIP"
COM_AKEEBA_CONFIG_ENGINE_DUMP_NATIVE_DESCRIPTION="Utilise les fonctions PHP pour produire un dump précis de la base de données"
COM_AKEEBA_CONFIG_ENGINE_DUMP_NATIVE_TITLE="Moteur de sauvegarde MySQL Natif"
COM_AKEEBA_CONFIG_ENGINE_DUMP_REVERSE_TITLE="Moteur de sauvergarde de régénération de structure de la base de données"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_AZURE_DESCRIPTION="Envoyer l'archive de sauvegarde sur l'espace de stockage de Microsoft Windows Azure BLOB.<br/><p style='padding:2px;' class='ui-state-highlight'>N'oubliez pas d'activer le fractionnement de l'archive à une taille entre 2 et 64 Mo correspondant à celle pouvant être traitée par le serveur sans créer de déconnexion.</p>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_AZURE_TITLE="Envoyer sur Microsoft Windows Azure BLOB"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_CLOUDFILES_DESCRIPTION="Envoyer l'archive sur l'espace de stockage de RackSpace CloudFiles.<br/><p style='padding:2px;' class='ui-state-highlight'>N'oubliez pas d'activer le fractionnement de l'archive à une taille entre 2 et 30 Mo correspondant à celle pouvant être traitée par le serveur sans créer de déconnexion.</p>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_CLOUDFILES_TITLE="Envoyer sur RackSpace CloudFiles"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_CLOUDME_DESCRIPTION="Envoie l'archive de la sauvegarde vers CloudMe.<br/><strong class=ui-state-highlight>N'oubliez pas de découper l'archive en volumes de 2 à 30Mo afin d'éviter l'échec de la sauvegarde pour cause de temporisations!</strong>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_CLOUDME_TITLE="Envoyer sur CloudMe"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_DREAMOBJECTS_DESCRIPTION="Téléverser l'archive de sauvegarde sur DreamObjects.<br/><strong class=ui-state-highlight>N'oubliez pas d'activer le fractionnement de l'archive à une taille comprise entre 2 et 30 Mo correspondante à celle pouvant être traitée par le serveur sans créer de déconnexion.</strong>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_DREAMOBJECTS_TITLE="Téléverser sur DreamObjects"
; COM_AKEEBA_CONFIG_ENGINE_POSTPROC_DROPBOX2_DESCRIPTION="Uploads the backup archive to Dropbox using the Dropbox V2 API. This API is faster and lets you easily connect your Dropbox account to multiple sites."
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_DROPBOX2_TITLE="Envoyer sur DropBox (v2 API)"
; COM_AKEEBA_CONFIG_ENGINE_POSTPROC_DROPBOX_DESCRIPTION="Uploads the backup archive to Dropbox. This uses the old API which might go away at any time in the future. We recommend you to use the v2 API method instead."
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_DROPBOX_TITLE="Envoyer sur DropBox (v1 API)"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_EMAIL_DESCRIPTION="Envoyer la sauvegarde par e-mail. <p style='padding:2px;' class='ui-state-highlight'>N'oubliez pas d'activer le fractionnement de l'archive à une taille entre 1 et 2 Mo correspondant à celle pouvant être traitée par le serveur sans créer de déconnexion.</p>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_EMAIL_TITLE="Envoyer par e-mail"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_FTP_DESCRIPTION="Envoyer l'archive sur serveur distant avec le protocole FTP or FTPS (FTP sécurisé avec SSL).<p style='padding:2px;' class='ui-state-highlight'>N'oubliez pas d'activer le fractionnement de l'archive à une taille entre 2 et 30 Mo correspondant à celle pouvant être traitée par le serveur sans créer de déconnexion.</p>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_FTP_TITLE="Envoyer sur serveur FTP distant"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_GOOGLEDRIVE_DESCRIPTION="Envoyer la sauvegarde d'archive sur Google Drive. Veuillez consulter la documentation."
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_GOOGLEDRIVE_TITLE="Envoi sur Google Drive"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_GOOGLESTORAGE_DESCRIPTION="Envoi des sauvegardes sur Google Storage.<br /><strong class=ui-state-highlight>Rappel : vous devez activer le fractionnement des archives à une taille de 2 à 30 Mo pour éviter les échecs de sauvegarde dû aux délais d'attente!</strong>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_GOOGLESTORAGE_TITLE="Envoi sur Google Storage"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_IDRIVESYNC_DESCRIPTION="Envoyer l'archive de sauvegarde sur iDriveSync EVS (iDriveSync.com).<br/><strong class=ui-state-highlight>N'oubliez pas d'activer le fractionnement des archives à une taille de 2 à 30 Mo ou vous risquez l'échec de la sauvegarde pour dépassement de la limite du temps d’exécution du serveur !</strong>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_IDRIVESYNC_TITLE="Envoyer sur iDriveSync"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_NONE_DESCRIPTION="Laisser les fichiers archives sur le serveur."
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_NONE_TITLE="Pas de post-traitement"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_ONEDRIVE_DESCRIPTION="Envoyer la sauvegarde d'archive sur Microsoft OneDrive. Veuillez consulter la documentation."
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_ONEDRIVE_TITLE="Envoyer sur Microsoft OneDrive"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_S3_DESCRIPTION="Envoi d'archive de sauvegarde sur Amazon S3. Cela vous permet d'utiliser à la fois la nouvelle authentification (AWS4) requise pour les nouveaux emplacement S3 et l'ancienne authentification (AWS2) requise pour les fournisseurs de stockage tiers utilisant une API S3-compatible.<br/><strong class=ui-state-highlight>Si vous désactivez l'envoi d'archive en multi-partie, n'oubliez pas de définir une taille de 2-30Mb pour la division de l'archive ou vous risquez un échec de la sauvegarde en raison des délais d'attente!</strong>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_S3_TITLE="Envoyer sur Amazon S3"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_SFTP_DESCRIPTION="Envoyer l'archive sur un serveur distant SFTP (SSH). Il s'agit d'un transfert de fichiers par SSH en utilisant un protocole SFTP, <em>différent</em> de FTP et FTPS.<br/><strong class=ui-state-highlight>N'oubliez pas d'activer le fractionnement de l'archive à une taille entre 2 et 30 Mo correspondant à celle pouvant être traitée par le serveur sans créer de déconnexion.</strong>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_SFTP_TITLE="Envoyer sur serveur SFTP (SSH)"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_SUGARSYNC_DESCRIPTION="Envoi des sauvegardes sur SugarSync.<br /><strong class=ui-state-highlight>Rappel : vous devez activer le fractionnement des archives à une taille de 2 à 30 Mo pour contourner la limitation du temps d'execution du serveur!</strong>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_SUGARSYNC_TITLE="Envoi sur SugarSync"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_WEBDAV_DESCRIPTION="Envoie l'archive de la sauvegarde vers tout service de stockage supportant le protocole WebDAV.<br/><strong class=ui-state-highlight>N'oubliez pas de découper l'archive en volumes de 2 à 30Mo afin d'éviter l'échec de la sauvegarde pour cause de temporisations!</strong>"
COM_AKEEBA_CONFIG_ENGINE_POSTPROC_WEBDAV_TITLE="Envoyer en utilisant WebDAV"
COM_AKEEBA_CONFIG_ENGINE_SCAN_LARGE_DESCRIPTION="Fichier de scan optimisé pour la sauvegarde des sites avec des répertoires contenant des centaines de fichiers (par exemple les blogs et les portails d'information)."
COM_AKEEBA_CONFIG_ENGINE_SCAN_LARGE_TITLE="Scan pour Gros Sites"
COM_AKEEBA_CONFIG_ENGINE_SCAN_SMART_DESCRIPTION="Scan des répertoires en variant vitesse et délais d'attente pour optimiser les performances."
COM_AKEEBA_CONFIG_ENGINE_SCAN_SMART_TITLE="Scan intelligent"
COM_AKEEBA_CONFIG_EXTENDEDINSERTS_DESCRIPTION="Si activé, le dump de base de données fera l'objet d'instructions INSERT étendues, à savoir de déclarations uniques pour insérer plusieurs lignes de données.<br />Il est fortement recommandé de conserver cette option activée car elle permettra d'accélérer le processus de restauration et de requêtes pour les limites de quota."
COM_AKEEBA_CONFIG_EXTENDEDINSERTS_TITLE="Générer des INSERT étendus"
COM_AKEEBA_CONFIG_FAILURE_EMAILADDRESS_DESC="Envoyer les e-mails à cette adresse (laisser vide pour envoyer les e-mails à tout les Super Administrateurs)"
COM_AKEEBA_CONFIG_FAILURE_EMAILADDRESS_LABEL="Adresse e-mail"
COM_AKEEBA_CONFIG_FAILURE_EMAILBODY_DESC="Laissez vide pour utiliser les paramètres par défaut. Vous pouvez utiliser toutes les variables d'Akeeba Backup pour le nommages des fichiers d'archive, par ex. [HOST] et [DATE]."
COM_AKEEBA_CONFIG_FAILURE_EMAILBODY_LABEL="Contenu de l'e-mail"
COM_AKEEBA_CONFIG_FAILURE_EMAILSUBJECT_DESC="Laissez vide pour utiliser les paramètres par défaut. Vous pouvez utiliser toutes les variables d'Akeeba Backup pour le nommages des fichiers d'archive, par ex. [HOST] et [DATE]"
COM_AKEEBA_CONFIG_FAILURE_EMAILSUBJECT_LABEL="Sujet de l'e-mail"
COM_AKEEBA_CONFIG_FAILURE_FEBENABLE_DESC="Lorsqu'activée, cette fonction permet la vérification des sauvegardes échouées à partir du frontal. Cette option peut s'avérer utile pour les vérifications plannifiées sur votre serveur ou pour des vérification effectuées à distance."
COM_AKEEBA_CONFIG_FAILURE_FEBENABLE_LABEL="Vérification des sauvegardes échouées en frontal"
COM_AKEEBA_CONFIG_FAILURE_SEPARATOR="<strong>Vérification des sauvegardes échouées</strong>"
COM_AKEEBA_CONFIG_FAILURE_TIMEOUT_DESC="Une sauvegarde sera considérée comme bloquée (échouée) après le nombre de secondes d'inactivité suivant.<br/> NE TOUCHEZ PAS À CES VALEURS À MOINS QUE VOUS SAVEZ CE QUE VOUS FAITES!"
COM_AKEEBA_CONFIG_FAILURE_TIMEOUT_LABEL="Délai d'expiration de sauvegarde bloqué"
COM_AKEEBA_CONFIG_FEBENABLE_DESC="Cette fonction permet de lancer une sauvegarde depuis l'espace frontal du site.<br />Elle est également nécessaire pour la planification des sauvegardes sur votre serveur (CRON).<br />L'URL pour effectuer la sauvegarde en frontal est : …/index2.php?option=com_akeeba&view=backup&key=mot-secret&profile=id-de-sauvegarde&format=raw"
COM_AKEEBA_CONFIG_FEBENABLE_LABEL="Autoriser les sauvegardes en frontal"
COM_AKEEBA_CONFIG_FEEMAILBODY_DESC="Vous pouvez utiliser toutes les variables d'Akeeba Backup pour nommer les fichiers.<br />Exemple: [HOST], [DATE], [PROFILENUMBER], [PROFILENAME], [PARTCOUNT] (nombre de partitions) et [FILELIST].<br />Laissez vide pour utiliser les paramètres par défaut."
COM_AKEEBA_CONFIG_FEEMAILBODY_LABEL="Contenu de l'e-mail"
COM_AKEEBA_CONFIG_FEEMAILSUBJECT_DESC="Vous pouvez utiliser toutes  les variables d'Akeeba Backup.<br />Exemple: [HOST] et [DATE]<br />Laissez vide pour utiliser les paramètres par défaut."
COM_AKEEBA_CONFIG_FEEMAILSUBJECT_LABEL="Sujet de l'e-mail"
COM_AKEEBA_CONFIG_FRONTENDEMAIL_DESC="Cette fonction active l'envoi automatique d'un e-mail lors d'une sauvegarde en frontal ou avec le système Remote."
COM_AKEEBA_CONFIG_FRONTENDEMAIL_LABEL="E-mail de notification"
COM_AKEEBA_CONFIG_FRONTEND_HEADER_DESC="Cette fonction permet d'effectuer des sauvegardes depuis le frontal du site par une interface basique.<br />L'activation des sauvegardes depuis le frontal permet d'utiliser le mode Legacy.<br />L'URL pour effectuer la sauvegarde en frontal est : url-du-site.../index2.php?option=com_akeeba&view=backup&key=mot-secret&profile=id-de-sauvegarde&format=raw"
COM_AKEEBA_CONFIG_FRONTEND_HEADER_LABEL="Sauvegarde en frontal"
COM_AKEEBA_CONFIG_FTPTEST_BADPREFIX="Vous ne devez PAS ajouter le préfixe ftp:// à votre nom d'hôte FTP. Veuillez retirer le préfixe ftp:// et réessayez.\n"
; COM_AKEEBA_CONFIG_GOOGLEDRIVE_ACCESSTOKEN_DESCRIPTION="Filled in automatically when you complete the authentication Step 1 above. If you are linking another site to the same Google Drive account DO NOT copy the access token and DO NOT run the authentication. Instead, simply copy the Refresh Token from the previous site to this one."
COM_AKEEBA_CONFIG_GOOGLEDRIVE_ACCESSTOKEN_TITLE="Jeton d'accès"
; COM_AKEEBA_CONFIG_GOOGLEDRIVE_DIRECTORY_DESCRIPTION="The directory within the Google Drive to store the backup archives. Please use forward slashes. Correct: some/thing. Wrong: some\thing. A single forward slash means that archives will be stored in the drive's root. READ THE DOCUMENTATION: Paths in Google Drive are ambiguous!"
COM_AKEEBA_CONFIG_GOOGLEDRIVE_DIRECTORY_TITLE="Répertoire"
COM_AKEEBA_CONFIG_GOOGLEDRIVE_REFRESHTOKEN_TITLE="Actualiser le jeton"
COM_AKEEBA_CONFIG_GOOGLESTORAGEACCESSKEY_DESCRIPTION="Clé d'accès à Google Storage, disponible dans le gestionnaire de clé de stockage de Google Cloud (https://code.google.com/apis/console#:storage:legacy)."
COM_AKEEBA_CONFIG_GOOGLESTORAGEACCESSKEY_TITLE="Clé d'accès"
COM_AKEEBA_CONFIG_GOOGLESTORAGEBUCKET_DESCRIPTION="Nom du stockage Google bucket. Il doit être indiqué comme dans l'application web de stockage Google Cloud (https://sandbox.google.com/storage)."
COM_AKEEBA_CONFIG_GOOGLESTORAGEBUCKET_TITLE="Bucket"
COM_AKEEBA_CONFIG_GOOGLESTORAGEDIRECTORY_DESCRIPTION="Répertoire de stockage des sauvegardes. Laissez vide pour les placer à la racine du bucket."
COM_AKEEBA_CONFIG_GOOGLESTORAGEDIRECTORY_TITLE="Répertoire"
COM_AKEEBA_CONFIG_GOOGLESTORAGELOWERCASE_DESCRIPTION="Si activé, Akeeba Backup convertit le nom bucket en minuscules. Exemple : MyBucket est converti en mybucket<br />Si le nom bucket contient des majuscules et minuscules, vous devez les respecter ; voir dans l'application web de stockage Google Cloud (https://sandbox.google.com/storage)."
COM_AKEEBA_CONFIG_GOOGLESTORAGELOWERCASE_TITLE="Nom bucket en minuscules"
COM_AKEEBA_CONFIG_GOOGLESTORAGESECRETKEY_DESCRIPTION="Clé secrète de Google Storage, disponible dans le gestionnaire de clé de stockage de Google Cloud (https://code.google.com/apis/console#:storage:legacy)."
COM_AKEEBA_CONFIG_GOOGLESTORAGESECRETKEY_TITLE="Clé secrète"
COM_AKEEBA_CONFIG_GOOGLESTORAGEUSESSL_DESCRIPTION="Si activé, une connexion sécurisée (HTTPS) sera utilisée lors de l'envoi des fichiers. Cette fonction augmente la sécurité des données transférées, mais augmente également la possibilité d'échec de sauvegarde dû aux délais d'attente!"
COM_AKEEBA_CONFIG_GOOGLESTORAGEUSESSL_TITLE="Utiliser SSL"
COM_AKEEBA_CONFIG_HEADER_BASIC="Configuration générale"
; COM_AKEEBA_CONFIG_HEADER_CONFWIZ="Let Akeeba Backup configure itself?"
COM_AKEEBA_CONFIG_HEADER_OPTIONALFILTERS="Filtres optionnels"
COM_AKEEBA_CONFIG_HEADER_QUOTA="Configuration des Quotas"
COM_AKEEBA_CONFIG_HEADER_TUNING="Configuration du processus"
COM_AKEEBA_CONFIG_INSTALLER_DESCRIPTION="Définissez le script d'installation inclus dans la sauvegarde complète. Ce script permet l'installation du site complet sur un autre serveur (distant ou local)."
COM_AKEEBA_CONFIG_INSTALLER_TITLE="Script d'installation"
COM_AKEEBA_CONFIG_JPS_KEY_DESCRIPTION="Cette clé sera utilisée pour crypter le contenu de l'archive. Elle est sensible à la casse : ABC, abc et Abc sont considérés comme des valeurs différentes"
COM_AKEEBA_CONFIG_JPS_KEY_TITLE="Clé de cryptage"
; COM_AKEEBA_CONFIG_LARGEDIRTHRESHOLD_DESCRIPTION="When a directory contains over this number of files or directories it is considered "_QQ_"large"_QQ_". Therefore, Akeeba Backup will try re-scanning it in the next step to avoid backup timeouts. A value too small will cause the backup to considerably slow down. Increase - unless you get timeout errors - to speed up the backup."
COM_AKEEBA_CONFIG_LARGEDIRTHRESHOLD_TITLE="Gestion des gros répertoires"
COM_AKEEBA_CONFIG_LARGEFILE_DESCRIPTION="Les fichiers plus volumineux que la limite indiquée seront traités dans un processus distinct pour éviter un délai d'attente trop important. Une valeur comprise entre 2 et 10Mb est indiquée pour la plupart des serveurs."
COM_AKEEBA_CONFIG_LARGEFILE_TITLE="Gros fichier à traiter"
COM_AKEEBA_CONFIG_LARGE_DIRTHRESHOLD_DESCRIPTION="Le nombre de répertoires à scanner à chaque étape. Réglage recommandé: 50. Des valeurs plus élevées rendent la sauvegarde marginalement plus rapide mais prend généralement plus de temps."
COM_AKEEBA_CONFIG_LARGE_DIRTHRESHOLD_TITLE="Taille du lot pour le scan de répertoires"
COM_AKEEBA_CONFIG_LARGE_FILESTHRESHOLD_DESCRIPTION="Le nombre de répertoires à scanner et compresser à chaque étape. Réglage recommandé: 100. Des valeurs plus élevées rendent la sauvegarde légèrement plus rapide mais peuvent mener à des problèmes de temporisation et de saturation de mémoire."
COM_AKEEBA_CONFIG_LARGE_FILESTHRESHOLD_TITLE="Taille du lot pour le scan de fichiers"
; COM_AKEEBA_CONFIG_LBL_CONFWIZ_AFTER="After Akeeba Backup has finished configuring itself you can take a backup or fine tune its configuration manually."
; COM_AKEEBA_CONFIG_LBL_CONFWIZ_INTRO="It looks like you have not configured Akeeba Backup yet. Click on the Configuration Wizard button below to let it configure itself."
COM_AKEEBA_CONFIG_LIVEUPDATE_HEADER_DESC="Cette fonction permet d'effectuer les mises à jour d'Akeeba directement depuis son interface.<br />Veillez à posséder les droits d'écriture sur les dossiers (activez la couche FTP de Joomla sinécessaire)."
COM_AKEEBA_CONFIG_LIVEUPDATE_HEADER_LABEL="Mise à jour"
COM_AKEEBA_CONFIG_LOGLEVEL_DEBUG="Toutes les informations et le débogage"
COM_AKEEBA_CONFIG_LOGLEVEL_DESCRIPTION="Définissez les éléments que vous souhaitez inclure dans le rapport de sauvegarde."
COM_AKEEBA_CONFIG_LOGLEVEL_ERROR="Uniquement les erreurs"
COM_AKEEBA_CONFIG_LOGLEVEL_INFO="Toutes les informations"
COM_AKEEBA_CONFIG_LOGLEVEL_NONE="Aucun"
COM_AKEEBA_CONFIG_LOGLEVEL_TITLE="Type de rapport"
COM_AKEEBA_CONFIG_LOGLEVEL_WARNING="Les erreurs et mises en garde"
COM_AKEEBA_CONFIG_MAXAGEQUOTA_ENABLE_DESCRIPTION="Supprimer automatiquement les sauvegardes plus anciennes que la durée définie (se base sur la date de la sauvegarde).<br /><strong>Attention</strong>, l'activation de cette fonction annule les autres fonctions de quotas."
COM_AKEEBA_CONFIG_MAXAGEQUOTA_ENABLE_TITLE="Activer les quotas maximum selon l'âge des sauvegardes"
COM_AKEEBA_CONFIG_MAXAGEQUOTA_KEEPDAY_DESCRIPTION="Les sauvegardes effectuées le jour indiqué ne seront pas supprimées.<br />Laissez le réglage par défaut à 1 pour toujours préserver les sauvegardes effectuées le 1er jour du mois."
COM_AKEEBA_CONFIG_MAXAGEQUOTA_KEEPDAY_TITLE="Ne pas supprimer les sauvegardes prises ce jour du mois"
COM_AKEEBA_CONFIG_MAXAGEQUOTA_MAXDAYS_DESCRIPTION="Les sauvegardes plus anciennes que le nombre de jours indiqué seront automatiquement supprimées.<br />Laissez le réglage par défaut à 31 pour ne garder que les sauvegardes du dernier mois."
COM_AKEEBA_CONFIG_MAXAGEQUOTA_MAXDAYS_TITLE="Âge maximum des sauvegardes, en jour"
COM_AKEEBA_CONFIG_MAXEXECTIME_DESCRIPTION="Définissez une valeur inférieure à votre temps maximal d'exécution PHP.<br />En général, un réglage à 10 secondes est suffisant, seul les serveurs très restrictifs nécessitent une valeur supérieure."
COM_AKEEBA_CONFIG_MAXEXECTIME_TITLE="Délai maximum d'une étape de sauvegarde"
COM_AKEEBA_CONFIG_MAXPACKET_DESCRIPTION="Taille maximale, en octets, de chaque instruction INSERT étendue.<br />Il est recommandé de spécifier une valeur suffisamment faible pour que MySQL ne crée pas d'erreur lors de la restauration de la base de données."
COM_AKEEBA_CONFIG_MAXPACKET_TITLE="Taille maximale d'un INSERT étendu"
COM_AKEEBA_CONFIG_MINEXECTIME_DESCRIPTION="Définissez en millisecondes la durée minimum d'une étape de sauvegarde.<br />Ce réglage peut être nécessaire pour contourner les solutions de sécurité anti-DOS.<br />Si vous obtenez des pages erreur 403 ou des erreurs AJAX, vous devez augmenter cette valeur.<br />La valeur 0 désactive cette fonction."
COM_AKEEBA_CONFIG_MINEXECTIME_TITLE="Délai minimum d'une étape de sauvegarde"
COM_AKEEBA_CONFIG_MYSQL5FEATURES_ENABLE_DESCRIPTION="Cette option force le remplacement des requêtes propres à MySQL 5.<br /><strong>Attention</strong>, n'activez cette option que pour des raisons nécessaires de compatibilité, elle peut engendrer l'échec d'une sauvegarde."
COM_AKEEBA_CONFIG_MYSQL5FEATURES_ENABLE_TITLE="Requêtes PROCEDURE, FUNCTION et TRIGGER"
COM_AKEEBA_CONFIG_MYSQLNOBTREE_TIP="Supprime USING BTREE et USING HASH des tables d'indexation de purge. Ceci est nécessaire pour la restauration sur des serveurs qui ont l'indexation désactivé (par exemple sur les versions récentes de XAMPP). ATTENTION! Cela peut causer des problèmes de RESTAURATION sur certains serveurs"
COM_AKEEBA_CONFIG_MYSQLNOBTREE_TITLE="Passer l'indexation"
COM_AKEEBA_CONFIG_NODEPENDENCIES_DESCRIPTION="Si activé, Akeeba Backup n'effectuera pas le suivi des dépendances entre les tables et les vues.<br />N'utilisez cette option que si votre base de données contient des centaines de tables et qu'elle n'utilise pas les requêtes MySQL VIEW, FUNCTION, PROCEDURE, TRIGGER et les tables les requêtes TEMPORARY, MEMORY, MERGE or FEDERATED engines."
COM_AKEEBA_CONFIG_NODEPENDENCIES_TITLE="Ne pas suivre les dépendances"
COM_AKEEBA_CONFIG_NOTIFICATION_EMAIL_DESC="L'adresse e-mail qui recevra les notifications de mises à jour"
COM_AKEEBA_CONFIG_NOTIFICATION_EMAIL_LABEL="Adresse e-mail pour les notifications de mises à jour"
COM_AKEEBA_CONFIG_NOTIFICATION_FREQ_LABEL="Fréquence de notification"
COM_AKEEBA_CONFIG_NOTIFICATION_TIME_DAY="jours"
COM_AKEEBA_CONFIG_NOTIFICATION_TIME_HOUR="heures"
COM_AKEEBA_CONFIG_NOTIFICATION_TIME_LABEL="Fréquence de notification"
COM_AKEEBA_CONFIG_NOTIFICATION_TIME_MIN="minutes"
COM_AKEEBA_CONFIG_OBSOLETEQUOTA_ENABLE_DESCRIPTION="Nombre total d'enregistrements orphelins (dont le fichier de sauvegarde a été effacé) à garder dans l'affichage de la 'Gestion des sauvegardes'.<br />Mettre 0 pour aucune limite."
COM_AKEEBA_CONFIG_OBSOLETEQUOTA_ENABLE_TITLE="Enregistrements orphelins à garder"
COM_AKEEBA_CONFIG_ONEDRIVE_ACCESSTOKEN_DESCRIPTION="Complété automatiquement lorsque vous terminez ci-dessus l'étape 1 d'authentification. Ne partage pas le même Token sur différents sites, nécessite une authentification distincte sur chaque site."
COM_AKEEBA_CONFIG_ONEDRIVE_ACCESSTOKEN_TITLE="Accès Token"
; COM_AKEEBA_CONFIG_ONEDRIVE_DIRECTORY_DESCRIPTION="The directory within the Microsoft OneDrive drive to store the backup archives. Please use forward slashes, not backslahes and always put a forward slash in front. Correct: /some/thing. Wrong: some\thing. A single forward slash means that archives will be stored in the drive's root."
COM_AKEEBA_CONFIG_ONEDRIVE_DIRECTORY_TITLE="Répertoire"
COM_AKEEBA_CONFIG_ONEDRIVE_REFRESHTOKEN_DESCRIPTION="Complété automatiquement lorsque vous terminez ci-dessus l'étape 1 d'authentification. Ne partage pas le même Token sur différents sites, nécessite une authentification distincte sur chaque site."
COM_AKEEBA_CONFIG_ONEDRIVE_REFRESHTOKEN_TITLE="Actualiser Token"
COM_AKEEBA_CONFIG_OPTIONALFILTERS_DATECONDITIONAL_ENABLED_DESCRIPTION="Si activé, seuls les fichiers modifiés après une date et une heure précises seront sauvegardés."
COM_AKEEBA_CONFIG_OPTIONALFILTERS_DATECONDITIONAL_ENABLED_TITLE="Filtre de date"
COM_AKEEBA_CONFIG_OPTIONALFILTERS_DATECONDITIONAL_START_DESCRIPTION="Seront sauvegardés uniquement les fichiers modifiés après la date donnée. Le format de date est : YYYY-MM-DD hh:mm:ss. Les dates et les heures sont affichées avec le fuseau horaire de votre serveur."
COM_AKEEBA_CONFIG_OPTIONALFILTERS_DATECONDITIONAL_START_TITLE="Modifié après..."
; COM_AKEEBA_CONFIG_OPTIONALFILTERS_ERRORLOGS_ENABLED_DESCRIPTION="Automatically exclude error log files, e.g. <code>error_log</code>, no matter where they are on the site being backed up. These files change their size while the backup is in progress which may lead to corrupt backups."
; COM_AKEEBA_CONFIG_OPTIONALFILTERS_ERRORLOGS_ENABLED_TITLE="Exclude error logs"
COM_AKEEBA_CONFIG_OPTIONALFILTERS_FINDER_ENABLED_DESCRIPTION="Si activé, le contenu des termes et des tables de taxonomie de la recherche avancée sont ignorés des sauvegardes.<br />L'activation de ce paramètre est fortement recommandé pour des raisons de performances.<br />Après une restauration du site, accédez au composant de recherche avancée et cliquez sur le bouton 'Indexer' pour reconstruire les tables."
COM_AKEEBA_CONFIG_OPTIONALFILTERS_FINDER_ENABLED_TITLE="Ignorer les termes de recherche et les tables de taxonomie"
; COM_AKEEBA_CONFIG_OPTIONALFILTERS_HOSTSTATS_ENABLED_DESCRIPTION="When enabled, Akeeba Backup will automatically exclude the most common host-specific folders for storing access statistics for your site. These folders are read-only by your web site user, causing restoration issues if they are backed up."
; COM_AKEEBA_CONFIG_OPTIONALFILTERS_HOSTSTATS_ENABLED_TITLE="Exclude host-specific stats folders"
COM_AKEEBA_CONFIG_OUTDIR_DESCRIPTION="Répertoire de stockage des sauvegardes et des fichiers de rapport.<br />Vous pouvez utiliser les valeurs suivantes dans le chemin :<ul><li><b>[DEFAULT_OUTPUT]</b><br />Répertoire par défaut de Akeeba : /administrator/components/com_akeeba/backup<br /> </li><li><b>[SITEROOT]</b><br />Racine du site<br /> </li><li><b>[SITETMP]</b><br />Répertoire temporaire de Joomla<br /> </li><li><b>[ROOTPARENT]</b><br />Niveau supérieur au site (parent)<br /></li></ul>"
COM_AKEEBA_CONFIG_OUTDIR_TITLE="Répertoire des sauvegardes"
COM_AKEEBA_CONFIG_PARTSIZE_DESCRIPTION="Akeeba peut créer des archives fractionnées afin de contourner les restrictions de taille dans diverses circonstances.<br /><strong>Important:</strong> si les fichiers de sauvegardes sont créés sur un autre serveur, utilisez un fractionnement des fichiers de 1 à 5 Mb pour des résultats optimaux.<br />En spécifiant la valeur 0, le fractionnement sera désactivé."
COM_AKEEBA_CONFIG_PARTSIZE_TITLE="Taille de fractionnement des archives"
COM_AKEEBA_CONFIG_PLATFORM="Autre site"
COM_AKEEBA_CONFIG_PLATFORM_DBDATABASE_DESCRIPTION="Nom de la base de données à sauvegarder. Ce paramètre doit être rempli uniquement si l'option 'Autre base de données' a été cochée."
COM_AKEEBA_CONFIG_PLATFORM_DBDATABASE_TITLE="Nom de la base de données"
COM_AKEEBA_CONFIG_PLATFORM_DBDRIVER_DESCRIPTION="Sélectionnez le driver de base de données à utiliser lors de la connexion à la base de données. Ce paramètre doit être rempli uniquement si l'option 'Autre base de données' a été cochée."
COM_AKEEBA_CONFIG_PLATFORM_DBDRIVER_TITLE="Driver de base de données"
COM_AKEEBA_CONFIG_PLATFORM_DBHOST_DESCRIPTION="Nom d'hôte ou adresse IP du serveur de base de données, en général localhost ou 127.0.0.1. Ce paramètre doit être rempli uniquement si l'option 'Autre base de données' a été cochée."
COM_AKEEBA_CONFIG_PLATFORM_DBHOST_TITLE="Serveur hôte"
COM_AKEEBA_CONFIG_PLATFORM_DBPASSWORD_DESCRIPTION="Mot de passe de connexion à la base de données. Ce paramètre doit être rempli uniquement si l'option 'Autre base de données' a été cochée."
COM_AKEEBA_CONFIG_PLATFORM_DBPASSWORD_TITLE="Mot de passe"
COM_AKEEBA_CONFIG_PLATFORM_DBPORT_DESCRIPTION="Port du serveur de base de données (Optionnel). Laissez vide pour utiliser le port par défaut (en général 3306). Ce paramètre doit être rempli uniquement si l'option 'Autre base de données' a été cochée."
COM_AKEEBA_CONFIG_PLATFORM_DBPORT_TITLE="Port du serveur"
COM_AKEEBA_CONFIG_PLATFORM_DBPREFIX_DESCRIPTION="Préfixe des tables à sauvegarder, en incluant le souligné. Exemple : <tt>jos_</tt>. Ce paramètre doit être rempli uniquement si l'option 'Autre base de données' a été cochée."
COM_AKEEBA_CONFIG_PLATFORM_DBPREFIX_TITLE="Préfixe"
COM_AKEEBA_CONFIG_PLATFORM_DBUSERNAME_DESCRIPTION="Identifiant de connexion à la base de données. Ce paramètre doit être rempli uniquement si l'option 'Autre base de données' a été cochée."
COM_AKEEBA_CONFIG_PLATFORM_DBUSERNAME_TITLE="Identifiant"
COM_AKEEBA_CONFIG_PLATFORM_NEWROOT_DESCRIPTION="Si l'option 'Autre racine du site' est activée, Akeeba Backup sauvegarde tous les dossiers et fichiers depuis la racine indiquée."
COM_AKEEBA_CONFIG_PLATFORM_NEWROOT_TITLE="Forcer la racine du site"
COM_AKEEBA_CONFIG_PLATFORM_OVERRIDEDB_DESCRIPTION="<b>Désactivé</b> : Akeeba Backup sauvegarde automatiquement la base de données du site avec les paramètres de connexion de Joomla.<br /><b>Activé</b> : Akeeba Backup sauvegarde la base de données utilisant les accès de connexion définis ci-dessous."
COM_AKEEBA_CONFIG_PLATFORM_OVERRIDEDB_TITLE="Autre base de données"
COM_AKEEBA_CONFIG_PLATFORM_OVERRIDEROOT_DESCRIPTION="<b>Désactivé</b> : Akeeba Backup sauvegarde tous les dossiers et fichiers depuis la racine du site.<br /><b>Activé</b> : Akeeba Backup sauvegarde tous les dossiers et fichiers depuis la racine du dossier spécifié ci-dessous."
COM_AKEEBA_CONFIG_PLATFORM_OVERRIDEROOT_TITLE="Autre racine du site"
; COM_AKEEBA_CONFIG_POSTPROCFTP_FTPS_DESCRIPTION="If enabled, Akeeba Backup will try to connect to your FTP server using an SSL-encrypted connection. <strong>This is not the same as SFTP, SCP or "_QQ_"Secure FTP"_QQ_"!</strong> Do note that if your server doesn't support this method you will get connection errors."
COM_AKEEBA_CONFIG_POSTPROCFTP_FTPS_TITLE="Utiliser le protocole FTPS (FTP-SSL)"
COM_AKEEBA_CONFIG_POSTPROCFTP_HOST_DESCRIPTION="Nom du serveur FTP, sans le protocole.<br />Exemple : mon-site.com<br /> Akeeba fonctionne avec les protocole FTP et FTPS. Les protocoles SFTP, SCP et les variantes SSH ne sont pas compatibles."
COM_AKEEBA_CONFIG_POSTPROCFTP_HOST_TITLE="Nom d'hôte"
COM_AKEEBA_CONFIG_POSTPROCFTP_INITDIR_DESCRIPTION="Chemin FTP absolu du répertoire de destination.<br />Utilisez votre logiciel FTP pour visualiser le chemin. Vous pouvez le copier puis le coller dans ce champ.<br />Le répertoire initial varie selon les hébergeurs (httpdocs, public_html, web, etc.)."
COM_AKEEBA_CONFIG_POSTPROCFTP_INITDIR_TITLE="Répertoire initial"
COM_AKEEBA_CONFIG_POSTPROCFTP_OPTSUBDIR_DESCRIPTION="Chemin relatif au répertoire initial, il sera créé s'il n'existe pas. Laisser vide pour charger directement l'archive dans le répertoire initial. Vous pouvez utiliser les macros suivantes: <ul><li><b>[HOST]</b> Le nom d'hôte. ATTENTION! Cette balise ne fonctionne pas en mode CRON.</li><li><b>[DATE]</b> Date courante</li><li><b>[TIME]</b> Heure courante</li></ul>"
COM_AKEEBA_CONFIG_POSTPROCFTP_OPTSUBDIR_TITLE="Sous-répertoire"
COM_AKEEBA_CONFIG_POSTPROCFTP_PASSIVE_DESCRIPTION="Utilisation du mode FTP passif lors du transfert de données. Ce mode est activé par défaut car il est le seul à fonctionner avec les pares-feu habituels des serveurs internet. A ne désactiver que si vous êtes certain que votre serveur internet n'est pas derrière un pare-feu et que votre serveur FTP nécessite absolument le mode actif de transfert de fichiers."
COM_AKEEBA_CONFIG_POSTPROCFTP_PASSIVE_TITLE="Utiliser le mode Passif"
COM_AKEEBA_CONFIG_POSTPROCFTP_PASSWORD_DESCRIPTION="Mot de passe pour l'accès FTP, définit dans la console d'administration du serveur ou attribué par votre hébergeur.<br />Veillez à respecter les majuscules et minuscules."
COM_AKEEBA_CONFIG_POSTPROCFTP_PASSWORD_TITLE="Mot de passe"
COM_AKEEBA_CONFIG_POSTPROCFTP_PORT_DESCRIPTION="Port du serveur FTP. En général le 21, mais votre hébergeur peut lui avoir attribué un port différent. Contactez-le si le port 21 ne fonctionne pas et que vous ne savez pas lequel spécifier."
COM_AKEEBA_CONFIG_POSTPROCFTP_PORT_TITLE="Port FTP"
COM_AKEEBA_CONFIG_POSTPROCFTP_TEST_DESCRIPTION="Utiliser ce bouton pour tester la connexion et être informé des éventuels erreurs."
COM_AKEEBA_CONFIG_POSTPROCFTP_TEST_TITLE="Test de la connexion FTP"
COM_AKEEBA_CONFIG_POSTPROCFTP_USER_DESCRIPTION="Nom d'identifiant pour l'accès FTP, définit dans la console d'administration du serveur ou attribué par votre hébergeur.<br />Veillez à respecter les majuscules et minuscules."
COM_AKEEBA_CONFIG_POSTPROCFTP_USER_TITLE="Nom d'identifiant"
COM_AKEEBA_CONFIG_POSTPROCPARTS_DESCRIPTION="Si activé, le processus de post-traitement est enclenché à la fin de chaque création de segment pour le traiter selon les paramètres définis.<br />Si désactivé, le post-traitement ne s'effectuera qu'à la fin de la sauvegarde."
COM_AKEEBA_CONFIG_POSTPROCPARTS_TITLE="Processus à chaque fragment"
COM_AKEEBA_CONFIG_POSTPROCSFTP_HOST_DESCRIPTION="Nom du serveur SFTP sans le protocole, tel <tt>exemple.com</tt>. Attention, <tt>sftp://exemple.com</tt> ou <tt>ssh://exemple.com</tt> ne sont <b>pas valide</b> et ne doivent pas être utilisés. Ce système ne prend en charge que les serveurs SFTP (SSH). Il ne fonctionne <u>pas</u> avec FTP, FTPS ou toutes autres variables FTP. L'extension PHP SSH2 est requise, elle doit être installée et activée."
COM_AKEEBA_CONFIG_POSTPROCSFTP_HOST_TITLE="Nom du serveur hôte"
COM_AKEEBA_CONFIG_POSTPROCSFTP_INITDIR_DESCRIPTION="Chemin absolu du répertoire <b>SFTP</b> où les fichiers seront téléchargés (généralement le même que le chemin d'accès du système de fichiers). En cas de doute, connectez-vous avec votre logiciel SFTP, accédez au répertoire et copiez le chemin affiché ; généralement, le chemin part de la racine du serveur tel <tt>/home/myuser/public_html</tt>."
COM_AKEEBA_CONFIG_POSTPROCSFTP_INITDIR_TITLE="Répertoire initial"
COM_AKEEBA_CONFIG_POSTPROCSFTP_PASSWORD_DESCRIPTION="Identifiant du serveur SFTP. Attention, l'identifiant est généralement sensible à la casse. En cas de doute, veuillez contactez votre hébergeur."
COM_AKEEBA_CONFIG_POSTPROCSFTP_PASSWORD_TITLE="Mot de passe"
COM_AKEEBA_CONFIG_POSTPROCSFTP_PORT_DESCRIPTION="Port du serveur SFTP. Le paramètre le plus courant est le port 22. En cas de doute, veuillez contacter votre hébergeur."
COM_AKEEBA_CONFIG_POSTPROCSFTP_PORT_TITLE="Port"
COM_AKEEBA_CONFIG_POSTPROCSFTP_PRIVKEY_DESCRIPTION="LIRE LA DOCUMENTATION AVANT UTILISATION. Le chemin absolu du système de fichiers pour un fichier de clé privée RSA / DSA utilisée pour la connexion au serveur distant. Si elle est chiffrée, entrez la phrase de chiffrement dans le champ ci-dessus. Si vous n'avez aucune idée de ce que c'est, ou si vous pensez que vous devez demander de l'aide à ce sujet, laissez le champ vide et ne nous demandez rien."
COM_AKEEBA_CONFIG_POSTPROCSFTP_PRIVKEY_TITLE="Fichier de clé privée (avancé)"
COM_AKEEBA_CONFIG_POSTPROCSFTP_PUBKEY_DESCRIPTION="LIRE LA DOCUMENTATION AVANT UTILISATION. Le chemin absolu du système de fichiers pour un fichier de clé publique RSA / DSA utilisée pour la connexion au serveur distant. Si vous n'avez aucune idée de ce que c'est, ou si vous pensez que vous devez demander de l'aide à ce sujet, laissez le champ vide et ne nous demandez rien."
COM_AKEEBA_CONFIG_POSTPROCSFTP_PUBKEY_TITLE="Fichier de clé publique (avancé)"
COM_AKEEBA_CONFIG_POSTPROCSFTP_TEST_DESCRIPTION="Utiliser ce bouton pour tester la connexion SFTP et afficher les erreurs et echecs de connexions."
COM_AKEEBA_CONFIG_POSTPROCSFTP_TEST_TITLE="Tester la connexion SFTP"
COM_AKEEBA_CONFIG_POSTPROCSFTP_USER_DESCRIPTION="Identifiant du serveur SFTP. Attention, l'identifiant est généralement sensible à la casse. En cas de doute, veuillez contactez votre hébergeur."
COM_AKEEBA_CONFIG_POSTPROCSFTP_USER_TITLE="Nom d'utilisateur"
COM_AKEEBA_CONFIG_POSTPROC_IDRIVESYNC_DIRECTORY_DESCRIPTION="Répertoire de votre compte iDriveSync dans lequel les sauvegardes seront stockées. Laissez vide ou réglez sur / pour les stocker à la racine."
COM_AKEEBA_CONFIG_POSTPROC_IDRIVESYNC_DIRECTORY_TITLE="Répertoire"
; COM_AKEEBA_CONFIG_POSTPROC_IDRIVESYNC_NEWENDPOINT_DESCRIPTION="Starting from mid-2016, new users have to use the new API endpoint"
COM_AKEEBA_CONFIG_POSTPROC_IDRIVESYNC_NEWENDPOINT_TITLE="Utilisez le nouveau point de terminaison"
COM_AKEEBA_CONFIG_POSTPROC_IDRIVESYNC_PASSWORD_DESCRIPTION="Mot de passe de votre compte iDriveSync"
COM_AKEEBA_CONFIG_POSTPROC_IDRIVESYNC_PASSWORD_TITLE="Mot de passe"
COM_AKEEBA_CONFIG_POSTPROC_IDRIVESYNC_PVTKEY_DESCRIPTION="Votre clé privée iDriveSync. Uniquement si vous utilisez déjà une clé privée avec votre compte iDriveSync."
COM_AKEEBA_CONFIG_POSTPROC_IDRIVESYNC_PVTKEY_TITLE="Clé privée (facultatif)"
COM_AKEEBA_CONFIG_POSTPROC_IDRIVESYNC_USERNAME_DESCRIPTION="L'identifiant ou l'adresse e-mail que vous avez utilisée pour vous abonner à iDriveSync"
COM_AKEEBA_CONFIG_POSTPROC_IDRIVESYNC_USERNAME_TITLE="Identifiant ou e-mail"
COM_AKEEBA_CONFIG_PROCEMAIL_ADDRESS_DESCRIPTION="Adresse à laquelle les e-mails contenant les fractions de sauvegardes doivent être envoyés."
COM_AKEEBA_CONFIG_PROCEMAIL_ADDRESS_TITLE="Adresse e-mail"
COM_AKEEBA_CONFIG_PROCEMAIL_SUBJECT_DESCRIPTION="Le sujet permet d'identifier un e-mail dans une liste. Cette fonction optionnelle s'adresse surtout à ceux qui gèrent les sauvegardes de plusieurs sites."
COM_AKEEBA_CONFIG_PROCEMAIL_SUBJECT_TITLE="Sujet de l'e-mail"
COM_AKEEBA_CONFIG_PROCENGINE_DESCRIPTION="Moteurs de post-traitement permettant à Akeeba Backup de transférer des archives de sauvegarde finalisées sur d'autres serveurs ou systèmes de stockage à distance."
COM_AKEEBA_CONFIG_PROCENGINE_TITLE="Moteur de post-traitement"
; COM_AKEEBA_CONFIG_PUSH_APIKEY_DESC="Go to https://www.pushbullet.com/account and copy the Access Token from that page into the text box here. It is used to send push messages to your account. Note: the Access Token is visible to all people who have access to this configuration page."
; COM_AKEEBA_CONFIG_PUSH_APIKEY_LABEL="Pushbullet Access Token"
; COM_AKEEBA_CONFIG_PUSH_HEADER_DESC="Here you can configure push notifications for backup events to be sent directly to your phone, tablet, notebook or desktop computer. You need to download the free-of-charge, third party application <a href='http://pushbullet.com/'>Pushbullet</a> first."
COM_AKEEBA_CONFIG_PUSH_HEADER_LABEL="Notifications Push"
; COM_AKEEBA_CONFIG_PUSH_PREFERENCE_DESC="Should Akeeba Backup send you notifications and, if so, how?"
; COM_AKEEBA_CONFIG_PUSH_PREFERENCE_LABEL="Push notifications"
COM_AKEEBA_CONFIG_PUSH_PREFERENCE_OPT_NONE="Désactivé"
; COM_AKEEBA_CONFIG_PUSH_PREFERENCE_OPT_PUSHBULLET="Pushbullet"
; COM_AKEEBA_CONFIG_QUICKICON_DESC="When checked, Akeeba Backup will display an one-click backup icon at the top of the Control Panel page. Clicking on it will activate this profile and take a backup without any further action necessary from you."
; COM_AKEEBA_CONFIG_QUICKICON_LABEL="One-click backup icon"
COM_AKEEBA_CONFIG_REMOTEQUOTA_ENABLE_DESCRIPTION="Si activé, le quota spécifié ci-dessous sera appliqué aux sauvegardes distantes (Amazon S3, FTP, etc.)."
COM_AKEEBA_CONFIG_REMOTEQUOTA_ENABLE_TITLE="Activer les quotas pour les sauvegardes distantes"
COM_AKEEBA_CONFIG_RUNTIMEBIAS_DESCRIPTION="Définissez une valeur en pourcentage du temps maximal d'exécution PHP.<br />Si vous rencontrez des erreurs de délais d'attente, diminuer cette valeur ainsi que la précédente."
COM_AKEEBA_CONFIG_RUNTIMEBIAS_TITLE="Délai en % d'une étape de sauvegarde"
COM_AKEEBA_CONFIG_S3ACCESSKEY_DESCRIPTION="Votre clé d'accès Amazon S3 mis à disposition dans votre page personnelle d'Amazon Web Services."
COM_AKEEBA_CONFIG_S3ACCESSKEY_TITLE="Clé d'accès"
COM_AKEEBA_CONFIG_S3BUCKET_DESCRIPTION="Votre nom bucket Amazon S3"
COM_AKEEBA_CONFIG_S3BUCKET_TITLE="Nom Bucket"
COM_AKEEBA_CONFIG_S3CUSTOMENDPOINT_DESCRIPTION="Pour une utilisation de services tierces de stockage de partie avec implémentation de API S3-compatible. Veuillez indiquer le point de terminaison (API URL) de l'API S3-compatible. IMPORTANT : si vous utilisez Amazon S3, <strong>vous devez laisser ce champ vide</strong>."
COM_AKEEBA_CONFIG_S3CUSTOMENDPOINT_TITLE="Critère personnalisé"
COM_AKEEBA_CONFIG_S3DIRECTORY_DESCRIPTION="Répertoire bucket de votre compte dans lequel les sauvegardes seront stockées.<br/>Laissez vide pour les stocker à la racine."
COM_AKEEBA_CONFIG_S3DIRECTORY_TITLE="Répertoire"
COM_AKEEBA_CONFIG_S3LEGACY_DESCRIPTION="Si activé, tous les transferts à Amazon S3 seront considéré comme élément unique. Utilisez cette option si vous obtenez des erreurs de temps de réponse lors du transfert des sauvegardes."
COM_AKEEBA_CONFIG_S3LEGACY_TITLE="Désactiver la mise à jour multipart"
; COM_AKEEBA_CONFIG_S3RRS_DESCRIPTION="Select the storage class for your data. Standard is the regular storage for business critical data. Please consult the Amazon S3 documentation for the description of each storage class."
; COM_AKEEBA_CONFIG_S3RRS_TITLE="Storage class"
COM_AKEEBA_CONFIG_S3SECRETKEY_DESCRIPTION="Votre mot secret Amazon S3 mis à disposition dans votre page personnelle d'Amazon Web Services."
COM_AKEEBA_CONFIG_S3SECRETKEY_TITLE="Mot secret"
COM_AKEEBA_CONFIG_S3USESSL_DESCRIPTION="Cette option permet d'utiliser une connexion sécurisée (HTTPS) lors de l'envoi des fichiers.<br />Si cette connexion augmente la sécurité des données transférées, elle accroît également les possibilités d'échec de la sauvegarde en raison des délais d'attente plus longs."
COM_AKEEBA_CONFIG_S3USESSL_TITLE="Utiliser le mode SSL"
COM_AKEEBA_CONFIG_SAVENEW_DEFAULT_PROFILE_NAME="Nouveau profil de sauvegarde"
COM_AKEEBA_CONFIG_SAVE_OK="la configuration a été sauvée avec succès."
COM_AKEEBA_CONFIG_SCANENGINE_DESCRIPTION="Définit la manière dont sont scannés les dossiers et fichiers de votre site afin de déterminer lesquels doivent être sauvegardés."
COM_AKEEBA_CONFIG_SCANENGINE_TITLE="Processus de scan des fichiers systèmes"
; COM_AKEEBA_CONFIG_SECRETWORD_DESC="Protects the front-end backup feature from DoS attacks by requiring you to pass this secret word in the front-end backup URL. Please use long, complex passwords. Consult the documentation for more information."
COM_AKEEBA_CONFIG_SECRETWORD_LABEL="Mot secret"
COM_AKEEBA_CONFIG_SECURITY_HEADER_DESC="Paramètres de sécurité"
COM_AKEEBA_CONFIG_SECURITY_HEADER_LABEL="Sécurité"
COM_AKEEBA_CONFIG_SECURITY_USEENCRYPTION_DESCRIPTION="Si activé, les paramètres de configuration sont cryptés avec la norme industry-standard AES-128."
COM_AKEEBA_CONFIG_SECURITY_USEENCRYPTION_LABEL="Encodage de sécurité"
COM_AKEEBA_CONFIG_SFTPTEST_BADPREFIX="Vous ne devez PAS ajouter le préfixe sftp:// à votre nom d'hôte SFTP. Veuillez retirer le préfixe sftp:// et réessayez."
COM_AKEEBA_CONFIG_SIZEQUOTA_ENABLE_DESCRIPTION="Le contrôle de l'espace de stockage active la suppression automatique de la plus ancienne si celle en cours entraîne le dépassement de l'espace de stockage autorisé.<br /> <strong>Attention</strong>, ce paramètre est spécifique au profil ; adaptez l'espace dans chaque profil pour que l'ensemble corresponde au total souhaité."
COM_AKEEBA_CONFIG_SIZEQUOTA_ENABLE_TITLE="Activer le contrôle de l'espace de stockage"
COM_AKEEBA_CONFIG_SIZEQUOTA_VALUE_DESCRIPTION="Définissez en MB la taille totale allouée pour les sauvegardes de ce profil."
COM_AKEEBA_CONFIG_SIZEQUOTA_VALUE_TITLE="Taille totale allouée pour le stockage des sauvegardes"
COM_AKEEBA_CONFIG_SPLITDBDUMP_DESCRIPTION="Cette option vous permet de fragmenter un fichier archive MySQL en cas de sauvegarde de grosses bases de données qui ne pourrait être traité dans une restauration.<br />Adaptez la taille selon les capacités du serveur MySQL."
COM_AKEEBA_CONFIG_SPLITDBDUMP_TITLE="Taille des fichiers de sauvegarde MySQL"
COM_AKEEBA_CONFIG_SUGARSYNC_DIRECTORY_DESCRIPTION="Répertoire de stockage des fichiers de sauvegarde. Si la première partie du répertoire ne correspond pas au nom d'un dossier de synchronisation SugarSync, le répertoire sera créé dans votre dossier Porte-documents magique.<br />Vous pouvez utiliser les mêmes variables que vous utilisez pour les noms d'archives de sauvegarde, par exemple [HOST] pour le nom de domaine de votre site ou [DATE] pour la date actuelle."
COM_AKEEBA_CONFIG_SUGARSYNC_DIRECTORY_TITLE="Répertoire"
COM_AKEEBA_CONFIG_SUGARSYNC_EMAIL_DESCRIPTION="Adresse e-mail du compte SugarSync "
COM_AKEEBA_CONFIG_SUGARSYNC_EMAIL_TITLE="E-mail"
COM_AKEEBA_CONFIG_SUGARSYNC_PASSWORD_DESCRIPTION="Mot de passe du compte SugarSync "
COM_AKEEBA_CONFIG_SUGARSYNC_PASSWORD_TITLE="Mot de passe"
COM_AKEEBA_CONFIG_UI_AJAXERRORDLG_TEXT="Une erreur s'est produite dans l'attente d'une réponse AJAX:"
COM_AKEEBA_CONFIG_UI_AJAXERRORDLG_TITLE="Erreur AJAX"
COM_AKEEBA_CONFIG_UI_BROWSE="Rechercher..."
COM_AKEEBA_CONFIG_UI_BROWSER_TITLE="Explorateur"
COM_AKEEBA_CONFIG_UI_CONFIG="Configurer..."
COM_AKEEBA_CONFIG_UI_FTPBROWSER_TITLE="Explorateur FTP"
COM_AKEEBA_CONFIG_UI_REFRESH="Actualiser"
COM_AKEEBA_CONFIG_UI_ROOTDIR="L'utilisation de la racine du site comme espace de stockage des sauvegardes ou des fichiers temporaires peut conduire à l'échec de sauvegarde."
COM_AKEEBA_CONFIG_UI_SETTINGS_NOTSECURED="Votre serveur ne supporte pas le cryptage de vos paramètres de configuration. Nous vous conseillons vivement de ne pas stocker les mots de passe dans la configuration."
COM_AKEEBA_CONFIG_UI_SETTINGS_SECURED="Vos paramètres sont sécurisés par un cryptage 128-bit. Vous pouvez stocker en toute sécurité vos mots de passe dans la configuration."
COM_AKEEBA_CONFIG_UI_SFTPBROWSER_TITLE="Navigateur de répertoires SFTP"
COM_AKEEBA_CONFIG_UPLOADKICKSTART_DESCRIPTION="Si coché, une copie d'Akeeba Kickstart professionnel sera envoyé dans le répertoire distant spécifié dans le moteur de post-traitement ci-dessus (à l'exception des moteurs 'Aucun' et 'E-mail'). Cela a du sens lorsque vous utilisez FTP ou SFTP pour transférer votre site sur un serveur différent: Kickstart  sera utilisé pour extraire l'archive envoyé sur ce serveur. Une fois la sauvegarde terminée, vous n'aurez qu'à ajouter 'kickstart.php' à la nouvelle URL pour lancer Kickstart et procéder au déploiement du site, c'est simple!"
COM_AKEEBA_CONFIG_UPLOADKICKSTART_TITLE="Téléchargez Kickstart vers le serveur de stockage distant"
COM_AKEEBA_CONFIG_USAGESTATS_DESC="Aidez-nous à améliorer notre logiciel de façon anonyme et automatiquement en autorisant l'envoi de rapports sur votre version PHP, MySQL et Joomla. Cette information nous aide à déterminer quelles versions de Joomla, PHP et MySQL doivent être soutenue dans les versions futures. Note: nous ne recueillons pas le nom de votre site, ni son adresse IP ou autres informations liées directement ou indirectement à une identification unique."
COM_AKEEBA_CONFIG_USAGESTATS_LABEL="Activer les rapports de version de PHP anonyme, MySQL et Joomla! "
; COM_AKEEBA_CONFIG_USEDBSTORAGE_DESCRIPTION="Normally, Akeeba Backup is using files inside your Temporary Directory to store temporary data between backup steps. When this option is enabled, Akeeba Backup will use database records instead. On some low quality hosts this option may cause "_QQ_"MySQL server has gone away"_QQ_" or a "_QQ_"MySQL query limit exceeded"_QQ_" errors during backup."
COM_AKEEBA_CONFIG_USEDBSTORAGE_TITLE="Utiliser la base de données pour le stockage des données temporaires"
COM_AKEEBA_CONFIG_USEIFRAMES_DESCRIPTION="Si cette fonction est activée, Akeeba effectuera le traitement dans une IFrame cachée et n'utilisera pas la méthode AJAX. A n'utiliser que si vous rencontrez des erreurs dues à des conflits de scripts"
COM_AKEEBA_CONFIG_USEIFRAMES_TITLE="Utiliser des IFrames, au lieu d'AJAX"
COM_AKEEBA_CONFIG_VIRTUALFOLDER_DESCRIPTION="Si vous avez choisi d'insérer dans la sauvegarde des fichiers externes au site, un répertoire est créé dans l'archive pour les stocker.<br />Définissez un nom pour ce répertoire."
COM_AKEEBA_CONFIG_VIRTUALFOLDER_TITLE="Répertoire des fichiers externes"
COM_AKEEBA_CONFIG_WEBDAV_DIRECTORY_TITLE="Répertoire"
COM_AKEEBA_CONFIG_WEBDAV_PASSWORD_DESCRIPTION=""
COM_AKEEBA_CONFIG_WEBDAV_PASSWORD_TITLE="Mot de passe"
COM_AKEEBA_CONFIG_WEBDAV_URL_TITLE="URL de base de WebDAV"
COM_AKEEBA_CONFIG_WEBDAV_USERNAME_DESCRIPTION=""
COM_AKEEBA_CONFIG_WEBDAV_USERNAME_TITLE="Identifiant"
COM_AKEEBA_CONFIG_WHERE_ARE_THE_FILTERS="Vous pouvez appliquer des filtres d'exclusion sur des dossiers, des fichiers ou des tables spécifiques en accédant aux interfaces d'exclusion appropriées par les boutons du panneau de contrôle."
; COM_AKEEBA_CONFIG_ZIPCDGLUECHUNKSIZE_DESCRIPTION="ZIP files are comprised of a data section and a "_QQ_"directory"_QQ_" section. Those sections are processed in parallel by Akeeba Backup and joined during the archive finalisation stage. This parameter determines how much data will be processed at once during this stage. You shouldn't need to change this setting unless you have severe memory exhaustion problems."
COM_AKEEBA_CONFIG_ZIPCDGLUECHUNKSIZE_TITLE="Taille d'un bloc de données"
; COM_AKEEBA_CONFIGURATION="Akeeba Backup <small>Component Configuration Options</small>"
COM_AKEEBA_CONFWIZ="Configuration automatique"
COM_AKEEBA_CONFWIZ_AJAX="Affectation du mode AJAX optimal"
COM_AKEEBA_CONFWIZ_CONGRATS="Félicitation, votre serveur est compatible avec le système de sauvegarde Akeeba Backup.<br />Vous pouvez maintenant tester la configuration de ce profil en exécutant une sauvegarde ou, l'affiner en l'éditant manuellement."
COM_AKEEBA_CONFWIZ_DBOPT="Optimisation des réglages du moteur de dump de la base de données"
COM_AKEEBA_CONFWIZ_DIRECTORY="Analyse d'accès aux répertoires de sauvegardes et temporaire"
COM_AKEEBA_CONFWIZ_HEADER_FAILED="Échec de la configuration automatique"
COM_AKEEBA_CONFWIZ_HEADER_FINISHED="Analyse et configuration achevée avec succès"
COM_AKEEBA_CONFWIZ_INTROTEXT="La configuration automatique exécute une série de points de repère sur votre serveur afin de déterminer les paramètres de sauvegarde optimaux pour votre site.<br />Ne quittez pas cette page durant le processus, l'analyse peut durer plusieurs minutes selon la rapidité du serveur."
COM_AKEEBA_CONFWIZ_MAXEXEC="Optimisation du temps maximum d’exécution"
COM_AKEEBA_CONFWIZ_MINEXEC="Optimisation du temps minimum d’exécution"
COM_AKEEBA_CONFWIZ_PROGRESS="Étalonnage en cours"
COM_AKEEBA_CONFWIZ_SPLITSIZE="Affectation de la taille optimale pour les fragments d'archive"
COM_AKEEBA_CONFWIZ_UI_CANTDBOPT="Akeeba Backup n'a pas pu déterminer les paramètres optimaux pour la fonction 'dump' de la base de données.<br />Vérifier que votre serveur MySQL est en version 5.0 ou plus et, que l'utilisateur spécifié possède le droit d'effectuer la requête SHOW TABLE STATUS."
COM_AKEEBA_CONFWIZ_UI_CANTDETERMINEMINEXEC="Akeeba Backup n'a pas pu déterminer le temps minimum d'exécution du  serveur. Ceci révèle un problème de communication avec votre serveur. Veuillez tenter une configuration manuelle d'Akeeba Backup."
COM_AKEEBA_CONFWIZ_UI_CANTDETERMINEPARTSIZE="Akeeba Backup n'a pas pu déterminer la taille optimale de fragmentation des archives.<br />Vérifier que votre espace de sauvegarde est suffisant, paramétrez-le si nécessaire dans la configuration du profil et relancez la procédure."
COM_AKEEBA_CONFWIZ_UI_CANTFIXDIRECTORIES="Akeeba Backup n'a pas accès en écriture sur le répertoire de sauvegarde ainsi que le répertoire temporaire. Veuillez ouvrir les permissions en écriture pour le répertoire administrator/components/com_akeeba/backup et recommencer la procédure."
COM_AKEEBA_CONFWIZ_UI_CANTSAVEMAXEXEC="Akeeba Backup n'a pas pu déterminer le temps maximum d'exécution du serveur.<br />Veuillez l'appliquer manuellement dans la configuration du profil."
COM_AKEEBA_CONFWIZ_UI_CANTSAVEMINEXEC="Akeeba Backup n'a pas pu enregistrer le temps minimum d'exécution de votre serveur.<br />Veuillez l'appliquer manuellement dans la configuration."
COM_AKEEBA_CONFWIZ_UI_CANTUSEAJAX="Akeeba Backup n'a pas pu déterminer la méthode AJAX adaptée pour une utilisation avec votre serveur. Veuillez contacter notre système de ticket de support pour obtenir des instructions supplémentaires."
COM_AKEEBA_CONFWIZ_UI_EXECTOOLOW="Akeeba Backup a détecté que le temps d'exécution maximum de votre serveur est trop court pour effectuer des sauvegardes.<br />Vous devez modifier cette valeur dans le fichier de configuration du serveur ou demander à votre hébergeur de le faire."
COM_AKEEBA_CONFWIZ_UI_MINEXECTRY="Essai dans %s secondes"
COM_AKEEBA_CONFWIZ_UI_PARTSIZE="Test d'une fragmentation à %s Mo"
COM_AKEEBA_CONFWIZ_UI_SAVEMINEXEC="Enregistrement du temps minimum d'exécution"
COM_AKEEBA_CONFWIZ_UI_SAVINGMAXEXEC="Enregistrement du temps maximum d'exécution"
COM_AKEEBA_CONFWIZ_UI_TRYAJAX="Essai de la méthode AJAX régulière"
COM_AKEEBA_CONFWIZ_UI_TRYIFRAME="Essai de la méthode IFrame, sans AJAX"
COM_AKEEBA_CONTROLPANEL="Panneau de contrôle"
COM_AKEEBA_CONTROLPANEL_WARN_PERMS_L1="Akeeba Backup ne peut pas déterminer les droits CHMOD du répertoire <tt>media/com_akeeba</tt>."
COM_AKEEBA_CONTROLPANEL_WARN_PERMS_L2="Veuillez effectuer l'opération suivante :"
COM_AKEEBA_CONTROLPANEL_WARN_PERMS_L3A="Activez la couche FTP de Joomla! dans sa configuration globale."
COM_AKEEBA_CONTROLPANEL_WARN_PERMS_L3B="A l'aide de votre logiciel FTP, modifiez les droits du répertoire <tt>media/com_akeeba</tt> et de tous ses sous-répertoires en CHMOD 775 et tous les fichiers en CHMOD 664."
COM_AKEEBA_CONTROLPANEL_WARN_PERMS_L4="Akeeba Backup <strong><u>ne fonctionnera pas</u></strong> si vous n'effectuez pas ces étapes. Ne demandez pas de l'aide si vous pouvez voir ce message, toutes les informations dont vous avez besoin y sont contenues."
COM_AKEEBA_CONTROLPANEL_WARN_WARNING="ATTENTION"
; COM_AKEEBA_CPANEL_BTN_FESECRETWORD_RESET="Apply the suggested Secret Word"
; COM_AKEEBA_CPANEL_ERR_FESECRETWORD_BANNED="The secret word is a known bad password. Please do not dictionary words, movie / series names, the names of your loved ones or pets."
; COM_AKEEBA_CPANEL_ERR_FESECRETWORD_HEADER="The front-end and remote backup features are disabled"
; COM_AKEEBA_CPANEL_ERR_FESECRETWORD_INTRO="Your <em>Secret Word</em> is insecure and can be easily guessed. In order to protect your site Akeeba Backup has disabled access to front-end and remote backup until you enter a secure Secret Word. The problem detected is:"
; COM_AKEEBA_CPANEL_ERR_FESECRETWORD_RESET="Could not change the Secret Word"
; COM_AKEEBA_CPANEL_ERR_FESECRETWORD_TOOSHORT="The secret word is too short. Use a secret word at least 8 characters long."
; COM_AKEEBA_CPANEL_ERR_FESECRETWORD_TOOSIMPLE="The secret word is too simple. Try using lower and upper case letters, numbers and punctuation."
; COM_AKEEBA_CPANEL_ERR_FESECRETWORD_WHATTODO_COMMON="Alternatively, click the button below to reset the secret word to the suggested value <code>%s</code> In either case you will need to update your remote backup services and/or CRON jobs with the new Secret Word."
; COM_AKEEBA_CPANEL_ERR_FESECRETWORD_WHATTODO_JOOMLA="Please click on Options, Front-end and enter a more complex secret word."
; COM_AKEEBA_CPANEL_ERR_FESECRETWORD_WHATTODO_SOLO="Please click on System Configuration, Public API and enter a more complex secret word."
; COM_AKEEBA_CPANEL_ERR_INVALIDDOWNLOADID="Invalid Download ID format. Please follow our instructions to get your Download ID. Do not enter your username, e-mail address or password in this box."
COM_AKEEBA_CPANEL_HEADER_ADVANCED="Opérations avancées"
COM_AKEEBA_CPANEL_HEADER_BASICOPS="Fonctions de base"
; COM_AKEEBA_CPANEL_HEADER_INCLUDEEXCLUDE="Include and Exclude Information"
; COM_AKEEBA_CPANEL_HEADER_QUICKBACKUP="One-click backup"
; COM_AKEEBA_CPANEL_HEADER_TROUBLESHOOTING="Troubleshooting"
COM_AKEEBA_CPANEL_LABEL_STATUSSUMMARY="Configuration de sauvegarde"
COM_AKEEBA_CPANEL_LBL_STATUS_ERROR="Erreur(s) détectée(s) empêchant la sauvegarde"
COM_AKEEBA_CPANEL_LBL_STATUS_OK="La configuration d'Akeeba<br />permet la sauvegarde de votre site"
COM_AKEEBA_CPANEL_LBL_STATUS_WARNING="La configuration d'Akeeba permet la sauvegarde de votre site mais des erreurs potentiels ont été détectées..."
COM_AKEEBA_CPANEL_LBL_UNWRITABLE="Verrouillé"
COM_AKEEBA_CPANEL_LBL_WRITABLE="Inscriptible"
COM_AKEEBA_CPANEL_MSG_APPLYDLID="Appliquer l'ID de téléchargement"
; COM_AKEEBA_CPANEL_MSG_FESECRETWORD_RESET="The Secret Word has been changed to <code>%s</code>"
COM_AKEEBA_CPANEL_MSG_MOREINFO="Plus d'information"
COM_AKEEBA_CPANEL_MSG_MUSTENTERDLID="Vous devez renseigner votre ID de téléchargement"
COM_AKEEBA_CPANEL_MSG_PASTEDLID="Collez votre ID de téléchargement et appuyez sur le bouton"
COM_AKEEBA_CPANEL_MSG_RELOADUPDATE="Recharger les informations de mise à jour"
COM_AKEEBA_CPANEL_MSG_UPDATEFOUND="Une version mise à jour d'Akeeba Backup (<b>%s</b>) est disponible pour l'installation."
COM_AKEEBA_CPANEL_MSG_UPDATENOW="Mettre à jour vers %s"
COM_AKEEBA_CPANEL_PROFILE_BUTTON="Changer de Profil"
COM_AKEEBA_CPANEL_PROFILE_SWITCH_ERROR="Impossible de changer de profil"
COM_AKEEBA_CPANEL_PROFILE_SWITCH_OK="Profil modifié avec succès"
COM_AKEEBA_CPANEL_PROFILE_TITLE="Profil actif"
COM_AKEEBA_CPANEL_WARNING_Q001="Impossible d'écrire dans le répertoire de sauvegarde"
COM_AKEEBA_CPANEL_WARNING_Q003="Utilisation de la racine du site comme répertoire de sauvegarde ou comme répertoire temporaire"
COM_AKEEBA_CPANEL_WARNING_Q004="PHP memory_limit trop faible"
COM_AKEEBA_CPANEL_WARNING_Q101="Le répertoire de sauvegarde est restreint par open_basedir"
COM_AKEEBA_CPANEL_WARNING_Q103="Durée d'exécution maximum trop réduite"
COM_AKEEBA_CPANEL_WARNING_Q104="Échelle système du répertoire temporaire utilisé"
COM_AKEEBA_CPANEL_WARNING_Q201="Mauvaise version PHP (PHP4)"
COM_AKEEBA_CPANEL_WARNING_Q202="Problème de calcul CRC"
COM_AKEEBA_CPANEL_WARNING_Q203="Le répertoire de sauvegarde est celui par défaut !</a><div style='margin-left: 10px;'>Pour des raisons de sécurité, il est recommandé de créer un répertoire personnalisé.</div>"
COM_AKEEBA_CPANEL_WARNING_Q204="Désactiver ces fonctions peut gêner les opérations"
COM_AKEEBA_CPANEL_WARNING_Q401="Fichier archive configuré au format ZIP</a><div style='margin-left: 10px;'>Il est recommandé d'utiliser le format JPA qui permet une meilleure compression.<br />Pour extraire l'archive, vous devrez utiliser l'outil de décompression d'Akeeba :</div><a href='http://www.akeebabackup.com/download/akeeba-extract-wizard/index.html' target='_blank'>Akeeba eXtract Wizard</a>"
COM_AKEEBA_CPANEL_WARNING_QNONE="Aucun problème détecté"
; COM_AKEEBA_CPANL_ERR_MBSTRING="<strong>Your version of PHP does not have the mbstring extension installed or activated</strong>. Having it enabled is a Joomla! requirement. Joomla! and Akeeba Backup will not work properly. Please ask your host to enable the mbstring extension on PHP %s running on your server."
COM_AKEEBA_DBFILTER="Exclure des tables et/ou leurs données"
COM_AKEEBA_DBFILTER_LABEL_EXCLUDENONCORE="Exclure les tables non liées à Joomla!"
COM_AKEEBA_DBFILTER_LABEL_NUKEFILTERS="Réinitialiser tous les filtres"
COM_AKEEBA_DBFILTER_LABEL_ROOTDIR="Base de données actuelle :"
COM_AKEEBA_DBFILTER_LABEL_SITEDB="Base de données du site"
COM_AKEEBA_DBFILTER_LABEL_TABLES="Tables de base de données, vues, procédures, fonctions et déclencheurs"
COM_AKEEBA_DBFILTER_TABLE_FUNCTION="Fonction stockée"
COM_AKEEBA_DBFILTER_TABLE_MISC="Les données des tables de type fusion, temporaire, mémoire, fédéré, liste noire ou divers ne sont jamais sauvées par Akeeba."
COM_AKEEBA_DBFILTER_TABLE_PROCEDURE="Procédure stockée"
COM_AKEEBA_DBFILTER_TABLE_TABLE="Table MyISAM ou InnoDB"
COM_AKEEBA_DBFILTER_TABLE_TRIGGER="Déclencheur"
COM_AKEEBA_DBFILTER_TABLE_VIEW="Vue MySQL"
COM_AKEEBA_DBFILTER_TYPE_REGEXTABLEDATA="Ne pas sauvegarder le contenu de la table..."
COM_AKEEBA_DBFILTER_TYPE_REGEXTABLES="Exclure la table..."
COM_AKEEBA_DBFILTER_TYPE_TABLEDATA="Ne pas sauvegarder le contenu"
COM_AKEEBA_DBFILTER_TYPE_TABLES="Exclure cette table"
COM_AKEEBA_DISCOVER="Importer des archives"
COM_AKEEBA_DISCOVER_ERROR_NODIRECTORY="Vous n'avez pas sélectionné de répertoire valide"
COM_AKEEBA_DISCOVER_ERROR_NOFILES="Il n'y a pas de sauvegarde à importer dans le répertoire sélectionné. Appuyez sur 'Retour' et sélectionnez un autre répertoire."
COM_AKEEBA_DISCOVER_ERROR_NOFILESSELECTED="Vous n'avez pas sélectionné tous les fichiers à importer."
COM_AKEEBA_DISCOVER_LABEL_DIRECTORY="Répertoire"
COM_AKEEBA_DISCOVER_LABEL_FILES="Fichiers de sauvegarde détectés"
COM_AKEEBA_DISCOVER_LABEL_GOBACK="Retour au répertoire de sélection"
COM_AKEEBA_DISCOVER_LABEL_IMPORT="Importer les fichiers"
COM_AKEEBA_DISCOVER_LABEL_IMPORTDONE="Opération d'importation achevée avec succès."
COM_AKEEBA_DISCOVER_LABEL_IMPORTEDDESCRIPTION="Sauvegarde importée."
; COM_AKEEBA_DISCOVER_LABEL_S3IMPORT="Are your archives stored on Amazon S3? Click <a href="_QQ_"%s"_QQ_">here</a> to download and import them in a single step!"
COM_AKEEBA_DISCOVER_LABEL_SCAN="Recherche de fichiers"
COM_AKEEBA_DISCOVER_LABEL_SELECTDIR="Sélectionnez un répertoire contenant des fichiers de sauvegarde :"
COM_AKEEBA_DISCOVER_LABEL_SELECTFILES="Sélectionnez les fichiers à importer. Pour effectuer une sélection multiple, maintenez la touche CTRL ou Command tout en cliquant."
; COM_AKEEBA_ENGINE_TEXTEXTRACT_DESC="When enabled Akeeba Backup will go through the archive extraction process without writing anything to the disk. This makes sure that the archive is not corrupt. IMPORTANT: this feature will NOT work when the <em>Process each part immediately</em> option is enabled in the Post-processing Engine configuration. Also note that this will increase the time required to complete the backup process and use substantially more memory and CPU resources. Finally do keep in mind that this feature only makes sure the archive can be extracted, it does NOT test whether the database data can be restored or if the restored site works correctly. It's still up to you to do a complete test restoration."
; COM_AKEEBA_ENGINE_TEXTEXTRACT_ERR_ENGINENOTFOUND="The restore.php file was not found inside the main directory of Akeeba Backup. The integrity of the backup archive cannot be tested."
; COM_AKEEBA_ENGINE_TEXTEXTRACT_ERR_INTEGRITYCHECKFAILED="The integrity check of the backup archive failed. The archive is corrupt. Message received from the extraction engine: %s"
; COM_AKEEBA_ENGINE_TEXTEXTRACT_ERR_INVALIDARCHIVERTYPE="The Archiver Engine you have selected is not producing JPA, JPS or ZIP backup archives. The archive integrity check does not apply to this engine. To disable this message please go to the Configuration page and disable the 'Archive integrity check' option."
; COM_AKEEBA_ENGINE_TEXTEXTRACT_ERR_PROCESSIMMEDIATELY="You have enabled the 'Process each part immediately' option in the Post-processing Engine. The archive integrity cannot run since some or all of the archive parts are no longer present on your server. You will need to check your backup archives manually. To disable this message please go to the Configuration page and disable the 'Archive integrity check' option."
; COM_AKEEBA_ENGINE_TEXTEXTRACT_LBL="Archive integrity check"
COM_AKEEBA_FILEFILTERS="Exclure des dossiers et/ou des fichiers"
COM_AKEEBA_FILEFILTERS_EDITOR_TITLE="Éditer"
COM_AKEEBA_FILEFILTERS_LABEL_ADDNEWFILTER="Ajouter un nouveau filtre :"
COM_AKEEBA_FILEFILTERS_LABEL_DIRS="Sous-répertoire"
COM_AKEEBA_FILEFILTERS_LABEL_FILES="Fichiers"
COM_AKEEBA_FILEFILTERS_LABEL_FILTERITEM="Élément filtré"
COM_AKEEBA_FILEFILTERS_LABEL_NORMALVIEW="Tous les éléments"
COM_AKEEBA_FILEFILTERS_LABEL_NUKEFILTERS="Réinitialiser tous les filtres"
COM_AKEEBA_FILEFILTERS_LABEL_ROOTDIR="Répertoire racine:"
COM_AKEEBA_FILEFILTERS_LABEL_TABULARVIEW="Éléments exclus"
COM_AKEEBA_FILEFILTERS_LABEL_TYPE="Type"
COM_AKEEBA_FILEFILTERS_LABEL_UIERRORFILTER="Une erreur s'est produite lors de l'application du filtre pour "_QQ_"%s"_QQ_""
COM_AKEEBA_FILEFILTERS_LABEL_UIROOT="Racine"
COM_AKEEBA_FILEFILTERS_LABEL_VIEWALL="Lister toutes les exclusions"
COM_AKEEBA_FILEFILTERS_TYPE_APPLYTOALLDIRS="Appliquer à tous les dossiers listés"
COM_AKEEBA_FILEFILTERS_TYPE_APPLYTOALLFILES="Appliquer à tous les fichiers listés"
COM_AKEEBA_FILEFILTERS_TYPE_DIRECTORIES="Exclure le répertoire"
COM_AKEEBA_FILEFILTERS_TYPE_DIRECTORIES_ALL="Exclure tous les répertoire"
COM_AKEEBA_FILEFILTERS_TYPE_FILES="Exclure le fichier"
COM_AKEEBA_FILEFILTERS_TYPE_FILES_ALL="Exclure tous les fichiers"
COM_AKEEBA_FILEFILTERS_TYPE_SKIPDIRS="Ignorer les sous-répertoires"
COM_AKEEBA_FILEFILTERS_TYPE_SKIPDIRS_ALL="Ignorer tous les répertoires"
COM_AKEEBA_FILEFILTERS_TYPE_SKIPFILES="Ignorer les fichiers"
COM_AKEEBA_FILEFILTERS_TYPE_SKIPFILES_ALL="Ignorer tous les fichiers"
COM_AKEEBA_FTPBROWSER_ERROR_HOSTNAME="Hôte ou port FTP invalide"
COM_AKEEBA_FTPBROWSER_ERROR_NOACCESS="Le répertoire n'existe pas ou vous n'avez pas les permissions d'accès."
COM_AKEEBA_FTPBROWSER_ERROR_UNSUPPORTED="Désolé, votre serveur FTP ne supporte pas cet explorateur FTP."
COM_AKEEBA_FTPBROWSER_ERROR_USERPASS="Identifiant ou mot de passe FTP invalide"
COM_AKEEBA_FTPBROWSER_LBL_ERROR="Une erreur est survenue"
COM_AKEEBA_FTPBROWSER_LBL_INSTRUCTIONS="Cliquez sur un dossier pour l'explorer. Cliquez sur Utiliser pour le sélectionner ou sur Annuler pour interrompre la procédure."
COM_AKEEBA_INCLUDEFOLDER="Répertoires parents au site"
COM_AKEEBA_INCLUDEFOLDER_LABEL_DIRECTORY="Répertoire"
COM_AKEEBA_INCLUDEFOLDER_LABEL_DIRECTORY_HELP="Le répertoire de votre serveur qui sera inclus dans la sauvegarde. Cette fonctionnalité est uniquement destinée aux répertoires situés en dehors de la racine de votre site. Les répertoires à la racine du site sont toujours automatiquement sauvegardés, sauf si vous utilisez la fonctionnalité : Exclusion de Répertoires et Fichiers."
COM_AKEEBA_INCLUDEFOLDER_LABEL_VINCLUDEDIR="Sous-répertoire virtuel"
COM_AKEEBA_INCLUDEFOLDER_LABEL_VINCLUDEDIR_HELP="Les fichiers sont stockés dans l'archive, dans un sous-répertoire du répertoire Virtuel pour les fichiers parents au site, défini dans votre configuration (par défaut : external_files). Vous pouvez personnaliser le nom de ce répertoire. Paramétrez-le avec un simple slash (c'est ce caractère : /) et vos fichiers externes seront placés à la racine de votre site. Ceci est utile si vous souhaitez surcharger certains fichiers dans la sauvegarde, par exemple votre fichier configuration.php, ou personnaliser le Template du script d'installation."
COM_AKEEBA_INFORMATION_TRANSLATION_AUTHOR="Mihàly Marti alias Sarki pour...<br /><img src='http://www.joomlatutos.com/images/extensions/akeeba_backup/joomlatutos_logo.png' alt='Joomlatutos.com - Supports et Kits Joomla!' align='left'>"
COM_AKEEBA_INFORMATION_TRANSLATION_AUTHOR_URL="http://www.joomlatutos.com/"
COM_AKEEBA_INFORMATION_TRANSLATION_CREDITS="Traduction"
COM_AKEEBA_INFORMATION_TRANSLATION_LANGUAGE="francophone (fr-FR)"
; COM_AKEEBA_LBL_BATCH_COPY="Copy"
COM_AKEEBA_LBL_CPANEL_NEEDSDLID="Veuillez indiquer votre <b>ID de téléchargement</b> pour pouvoir mettre à jour la version professionnelle. <a href='%s' target='_blank'>Si vous ne connaissez pas votre ID de téléchargement, veuillez cliquer ici</a>."
COM_AKEEBA_LBL_CPANEL_NEEDSUPGRADE="<strong>Entrer l'ID de téléchargement n'est pas suffisant pour activer les fonctions de la version professionnelle d'Akeeba Backup</strong>. Vous devrez télécharger et installer le paquetage Akeeba Backup Professionnel sur votre site <em>à deux reprises</em>, sans désinstaller le noyau. Pour plus d'informations et des instructions détaillées, veuillez visionner notre <a href='%s'>tutoriel vidéo au sujet de la mise à niveau du noyau d'Akeeba Backup vers la version professionnelle</a>."
COM_AKEEBA_LBL_PROFILES_SAVED="Ce profil a correctement été enregistré."
; COM_AKEEBA_LBL_PROFILE_COPIED="The Profile and its associated settings have been copied successfully"
; COM_AKEEBA_LBL_PROFILE_DELETED="The Profile has been successfully deleted"
; COM_AKEEBA_LBL_PROFILE_SAVED="The Profile was saved successfully"
COM_AKEEBA_LOG="Rapports de sauvegarde"
COM_AKEEBA_LOG_CHOOSE_FILE_TITLE="Veuillez choisir le type de sauvegarde duquel afficher les rapports :"
COM_AKEEBA_LOG_CHOOSE_FILE_VALUE="- Sélectionnez l'origine de la sauvegarde -"
COM_AKEEBA_LOG_ERROR_LOGFILENOTEXISTS="Le fichier de log, akeeba.log, n'existe pas dans votre répertoire de sauvegarde"
COM_AKEEBA_LOG_ERROR_UNREADABLE="Le fichier journal est illisible, veuillez vérifier ses permissions de lecture"
COM_AKEEBA_LOG_LABEL_DOWNLOAD="Télécharger le fichier journal"
COM_AKEEBA_LOG_NONE_FOUND="Aucun fichier log disponible"
COM_AKEEBA_MULTIDB="Base de données externes au site"
; COM_AKEEBA_MULTIDB_ERR_MISSINGINFO="You must specify a database driver, hostname, username, password and database name at a minimum."
COM_AKEEBA_MULTIDB_GUI_LBL_CANCEL="Annuler"
COM_AKEEBA_MULTIDB_GUI_LBL_CONNECTFAIL="Impossible de se connecter à la base de données.<br />Veuillez vérifier vos paramètres.<br />Dernière erreur:"
COM_AKEEBA_MULTIDB_GUI_LBL_CONNECTOK="Connecté à la base de données!"
COM_AKEEBA_MULTIDB_GUI_LBL_DATABASE="Nom base de données"
COM_AKEEBA_MULTIDB_GUI_LBL_DRIVER="Type base de données"
COM_AKEEBA_MULTIDB_GUI_LBL_HOST="Nom du serveur"
COM_AKEEBA_MULTIDB_GUI_LBL_LOADING="Chargement, patientez s'il vous plaît ..."
COM_AKEEBA_MULTIDB_GUI_LBL_PASSWORD="Mot de passe"
COM_AKEEBA_MULTIDB_GUI_LBL_PORT="Port du serveur"
COM_AKEEBA_MULTIDB_GUI_LBL_PREFIX="Préfixe"
COM_AKEEBA_MULTIDB_GUI_LBL_SAVE="Enregistrer"
COM_AKEEBA_MULTIDB_GUI_LBL_SAVEFAIL="Enregistrement impossible; veuillez réessayer"
COM_AKEEBA_MULTIDB_GUI_LBL_TEST="Tester la connexion"
COM_AKEEBA_MULTIDB_GUI_LBL_USERNAME="Identifiant"
COM_AKEEBA_MULTIDB_LABEL_DATABASE="Nom de la base de données"
COM_AKEEBA_MULTIDB_LABEL_HOST="Nom du serveur de base de données"
COM_AKEEBA_PROFILES="Ajout/Modification des profils"
COM_AKEEBA_PROFILES_BTN_EXPORT="Exporter"
COM_AKEEBA_PROFILES_COLLABEL_DESCRIPTION="Description"
COM_AKEEBA_PROFILES_ERR_IMPORT_FAILED="L'importation du profil a échoué"
COM_AKEEBA_PROFILES_ERR_IMPORT_INVALID="Fichier invalide, il ne correspond pas à un fichier .json de profil exporté."
COM_AKEEBA_PROFILES_HEADER_IMPORT="Importer"
COM_AKEEBA_PROFILES_LABEL_DESCRIPTION="Description du profil"
COM_AKEEBA_PROFILES_LABEL_DESCRIPTION_TOOLTIP="Entrez une description pour ce profil. Il n'a pas besoin d'être unique et ne sert qu'à vous distinguer les profils les uns des autres."
COM_AKEEBA_PROFILES_LBL_IMPORT_HELP="Sélectionnez un profil .json exporté à partir de ce site ou d'un autre afin d'importer rapidement des paramètres."
COM_AKEEBA_PROFILES_MSG_IMPORT_COMPLETE="Profil importé avec succès"
COM_AKEEBA_PROFILES_PAGETITLE_EDIT="Éditer le Profil"
COM_AKEEBA_PROFILES_PAGETITLE_NEW="Nouveau Profil"
COM_AKEEBA_PROFILE_ERR_CANNOTDELETEDEFAULT="Vous ne pouvez pas supprimer le profil par défaut (correspond à id=1)"
; COM_AKEEBA_PUSH_ENDBACKUP_FAIL_BODY="Akeeba Backup has detected that the backup of your site "_QQ_"%s"_QQ_" located in %s has failed."
; COM_AKEEBA_PUSH_ENDBACKUP_FAIL_BODY_WITH_MESSAGE="Akeeba Backup has detected that the backup of your site "_QQ_"%s"_QQ_" located in %s has failed. The backup failure message is:\n%s"
COM_AKEEBA_PUSH_ENDBACKUP_FAIL_SUBJECT="Échec de la sauvegarde pour %s"
; COM_AKEEBA_PUSH_ENDBACKUP_SUCCESS_BODY="Akeeba Backup has successfully finished backing up your site "_QQ_"%s"_QQ_" located in %s on %s."
COM_AKEEBA_PUSH_ENDBACKUP_SUCCESS_SUBJECT="Sauvegarde réussie pour %s"
; COM_AKEEBA_PUSH_ENDBACKUP_WARNINGS_BODY="Akeeba Backup has finished backing up your site "_QQ_"%s"_QQ_" located in %s on %s but warnings have been issued. This could mean that files have not been backed up or, if you are automatically uploading the backup to remote storage, the upload may have failed\nYou have to review the warnings and make sure that your backup has completed successfully. We advise you to always test a backup which resulted in warnings being issued to make sure that it is working properly. You can do so by restoring it to a local server. Remember that an untested backup is as good as no backup at all."
COM_AKEEBA_PUSH_ENDBACKUP_WARNINGS_SUBJECT="Sauvegarde terminée avec des avertissements pour %s"
COM_AKEEBA_PUSH_STARTBACKUP_BODY="Akeeba Backup a commencé la sauvegarde du site "_QQ_"%s"_QQ_" situé dans %s sur %s."
COM_AKEEBA_PUSH_STARTBACKUP_SUBJECT="Sauvegarde débutée pour %s"
COM_AKEEBA_REGEXDBFILTERS="Exclure le nom de tables et données"
COM_AKEEBA_REGEXFSFILTERS="Exclure le chemin de dossiers ou fichiers"
COM_AKEEBA_REMOTEFILES="Gestion des fichiers stockés à distance"
COM_AKEEBA_REMOTEFILES_DELETE="Supprimer"
COM_AKEEBA_REMOTEFILES_ERR_CANTDELETE="Impossible de supprimer le fichier stocké à distance. L'erreur est : "
COM_AKEEBA_REMOTEFILES_ERR_CANTDOWNLOAD="Impossible de télécharger le fichier stocké à distance. L'erreur est : "
COM_AKEEBA_REMOTEFILES_ERR_CANTOPENFILE="Impossible d'ouvrir en écriture le fichier local %s - Interruption du processus de téléchargement."
COM_AKEEBA_REMOTEFILES_ERR_INVALIDID="ID de téléchargement invalide"
COM_AKEEBA_REMOTEFILES_ERR_NOTSUPPORTED="Erreur, le serveur de stockage distant utilisé n'autorise pas le téléchargement ou la suppression des fichiers ou, les fichiers ont été supprimés."
COM_AKEEBA_REMOTEFILES_ERR_NOTSUPPORTED_HEADER="Aucune indication de fichier distant disponible"
COM_AKEEBA_REMOTEFILES_FETCH="Analyse du serveur"
COM_AKEEBA_REMOTEFILES_LBL_DOWNLOADEDSOFAR="Téléchargés : %u bytes sur un total de %u bytes (%u %%)"
COM_AKEEBA_REMOTEFILES_LBL_DOWNLOADLOCALLY="Téléchargez sur votre bureau"
COM_AKEEBA_REMOTEFILES_LBL_JUSTFINISHED="Téléchargement de la sauvegarde distante sur le serveur local achevée avec succès !"
COM_AKEEBA_REMOTEFILES_LBL_JUSTFINISHEDELETING="Le fichier stocké à distance a été supprimé avec succès !"
COM_AKEEBA_REMOTEFILES_LBL_NOTSUPPORTSLOCALDL="Erreur, le serveur de stockage distant utilisé n'autorise pas le téléchargement ou les fichiers ont été supprimés."
COM_AKEEBA_REMOTEFILES_PART="Partie #%u"
COM_AKEEBA_RESTORE="Restauration du site"
COM_AKEEBA_RESTORE_ERROR_ARCHIVE_MISSING="L'archive de sauvegarde est introuvable"
COM_AKEEBA_RESTORE_ERROR_CANT_WRITE="Impossible d'écrire le fichier restoration.php. vérifier que le répertoire administrator/components/com_akeeba est accessible en écriture."
COM_AKEEBA_RESTORE_ERROR_INVALID_RECORD="Enregistrement de sauvegarde invalide"
COM_AKEEBA_RESTORE_ERROR_INVALID_TYPE="Type de fichier non valide.<br />L'intégration du script de restauration ne peut se faire que dans les fichiers archive JPA ou ZIP."
COM_AKEEBA_RESTORE_LABEL_BYTESEXTRACTED="Octets extraits"
COM_AKEEBA_RESTORE_LABEL_BYTESREAD="Octets lus"
COM_AKEEBA_RESTORE_LABEL_DONOTCLOSE="Ne fermer pas cette fenêtre et ne naviguer pas vers d'autres pages tant que l'extraction est en cours."
COM_AKEEBA_RESTORE_LABEL_EXTRACTIONMETHOD="Méthode d'extraction des fichiers"
COM_AKEEBA_RESTORE_LABEL_EXTRACTIONMETHOD_DIRECT="Ecrire les fichiers directement"
COM_AKEEBA_RESTORE_LABEL_EXTRACTIONMETHOD_FTP="Utiliser la couche FTP"
COM_AKEEBA_RESTORE_LABEL_EXTRACTIONMETHOD_HYBRID="Hybride (écrire directement, utiliser la couche FTP seulement si nécessaire)"
COM_AKEEBA_RESTORE_LABEL_FAILED="L'extraction a échoué"
COM_AKEEBA_RESTORE_LABEL_FAILED_INFO="L'extraction de l'archive a échoué !<br/>Le dernier message d'erreur était le suivant :"
COM_AKEEBA_RESTORE_LABEL_FILESEXTRACTED="Fichiers extraits"
COM_AKEEBA_RESTORE_LABEL_FINALIZE="Finaliser la restauration"
COM_AKEEBA_RESTORE_LABEL_FTPOPTIONS="Options de la couche FTP"
COM_AKEEBA_RESTORE_LABEL_INPROGRESS="Extraction de l'archive en progression..."
COM_AKEEBA_RESTORE_LABEL_JPSOPTIONS="Options des archives sécurisées"
; COM_AKEEBA_RESTORE_LABEL_REMOTETIP="<strong>Tip</strong>: In order to restore to a remote server just select the "_QQ_"Use the FTP layer"_QQ_" option and supply your remote server's FTP connection information in the FTP Layer Options below."
COM_AKEEBA_RESTORE_LABEL_RUNINSTALLER="Exécutez le script de restauration du site"
COM_AKEEBA_RESTORE_LABEL_START="Démarrer la restauration"
COM_AKEEBA_RESTORE_LABEL_SUCCESS="L'extraction a été effectuée avec succès."
COM_AKEEBA_RESTORE_LABEL_SUCCESS_INFO2="Vous devez maintenant exécuter le programme d'installation Akeeba Backup (ABI). <strong>Ne fermez pas cette fenêtre!</strong>.<br />La restauration achevée, fermez cette fenêtre et cliquez sur le lien pour <strong>supprimer le répertoire d'installation</strong>. Vous pouvez ensuite accéder à votre site restauré."
; COM_AKEEBA_RESTORE_LABEL_SUCCESS_INFO2B="If, however, you are restoring to a remote site <em>do not</em> click either button. Instead, visit the restoration script's URL at <tt>http://<var>www.yoursite.com</var>/installation/index.php</tt>. After the restoration is over, click on "_QQ_"Remove the installation folder"_QQ_" link on the restoration script's final page or, if this fails, remove the <tt>installation</tt> directory from that site using your favourite FTP application."
COM_AKEEBA_S3IMPORT="Importation depuis S3"
COM_AKEEBA_S3IMPORT_ERR_CANTWRITE="Impossible d'écrire dans le répertoire de destination; Veuillez vérifier les autorisations."
COM_AKEEBA_S3IMPORT_ERR_NOTENOUGHINFO="Manque d'informations pour se connecter à S3"
COM_AKEEBA_S3IMPORT_ERR_NOTFOUND="Le fichier est introuvable dans votre espace S3"
COM_AKEEBA_S3IMPORT_LABEL_CHANGEBUCKET="Changer le récipient"
COM_AKEEBA_S3IMPORT_LABEL_CONNECT="Se connecter à S3"
COM_AKEEBA_S3IMPORT_LABEL_SELECTBUCKET="-Espace-"
COM_AKEEBA_S3IMPORT_MSG_IMPORTCOMPLETE="L'archive a été importée avec succès dans votre site."
COM_AKEEBA_S3_REGION_APNE1="Asie-Pacifique (Tokyo)"
COM_AKEEBA_S3_REGION_APNE2="ap-nordest-2 (réservé)"
COM_AKEEBA_S3_REGION_APSE1="Asie-Pacifique (Singapour)"
COM_AKEEBA_S3_REGION_APSE2="Asie-Pacifique (Sydney)"
COM_AKEEBA_S3_REGION_DESCRIPTION="Choisissez la région S3 où votre <em>bucket</em> est situé. Veuillez consulter http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region <strong>ATTENTION! En raison de l'API d'Amazon, vous devez sélectionner l'emplacement de votre <em>bucket</em> en utilisant la méthode de signature v4. Le procédé de signature v4 est OBLIGATOIRE pour tous les <em>bucket</em> créés dans une région en ligne après Janvier 2014, comme Francfort et Sao Paolo.</strong> Ce est une restriction d'Amazon et non pas d'Akeeba Backup. Merci de votre compréhension."
COM_AKEEBA_S3_REGION_EUCENTRAL1="EU (Francfort)"
COM_AKEEBA_S3_REGION_EUCENTRAL2="(réservé)"
COM_AKEEBA_S3_REGION_EUWEST1="EU (Irelande)"
COM_AKEEBA_S3_REGION_EUWEST2="eu-west-2 (réservé)"
COM_AKEEBA_S3_REGION_NONE="Aucun (ATTENTION! Utilisez uniquement avec les méthodes de signature v2 et v3https)"
COM_AKEEBA_S3_REGION_SAEAST1="Amérique du Sud (Sao Paolo)"
COM_AKEEBA_S3_REGION_SAEAST2="sa-est-2 (réservé)"
COM_AKEEBA_S3_REGION_SAWEST1="sa-ouest-1 (réservé)"
COM_AKEEBA_S3_REGION_SAWEST2="sa-ouest-2 (réservé)"
COM_AKEEBA_S3_REGION_TITLE="Amazon S3 Région"
COM_AKEEBA_S3_REGION_USEAST1="US Standard (N. Virginie et Pacifique Nord-Ouest)"
COM_AKEEBA_S3_REGION_USEAST2="us-est-2 (réservé)"
COM_AKEEBA_S3_REGION_USWEST1="US Ouest (N. Californie)"
COM_AKEEBA_S3_REGION_USWEST2="US Ouest (Oregon)"
; COM_AKEEBA_S3_RRS_RRS="Yes – Reduced Redundancy Storage (RRS)"
COM_AKEEBA_S3_RRS_STANDARD="Non – stockage standard (Standard)"
; COM_AKEEBA_S3_RRS_STANDARD_IA="Yes – Standard - Infrequent Access storage (Standard-IA)"
COM_AKEEBA_S3_SIGNATURE_DESCRIPTION="Spécifiez la méthode de demande de signature. Utilisez v4 en cas de doute. Vous pourriez avoir à utiliser v2 avec les fournisseurs tiers de stockage (lorsque vous spécifiez un critère personnalisé)."
COM_AKEEBA_S3_SIGNATURE_TITLE="Méthode de signature"
COM_AKEEBA_S3_SIGNATURE_V2="v2 (mode legacy, pour fournisseurs tiers de stockage)"
COM_AKEEBA_S3_SIGNATURE_V4="v4 (à préférer pour  Amazon S3)"
COM_AKEEBA_SCHEDULE="Planifier des sauvegardes automatiques"
COM_AKEEBA_SCHEDULE_LBL_ALTCLICRON="Ligne de commande CRON alternative"
COM_AKEEBA_SCHEDULE_LBL_ALTCLICRON_INFO="Cette méthode est recommandée uniquement si la tâche CRON ne se termine pas. Cette méthode utilise en interne la méthode de sauvegarde par le frontal qui est un peu plus lente que la méthode CLI native."
COM_AKEEBA_SCHEDULE_LBL_CHECK_BACKUPS="Vérifier le statut de sauvegarde"
COM_AKEEBA_SCHEDULE_LBL_CLICRON="Ligne de commande CRON  (recommandé)"
COM_AKEEBA_SCHEDULE_LBL_CLICRON_INFO="Cette méthode est recommandée pour tous les serveurs supportant l'emploi de ligne de commande CRON. Cette méthode n'utilise pas l'interface web de Joomla et permet d'atteindre la vitesse maximale de sauvegarde."
COM_AKEEBA_SCHEDULE_LBL_CLIGENERICIMPROTANTINFO="Important"
COM_AKEEBA_SCHEDULE_LBL_CLIGENERICINFO="N'oubliez pas de remplacer <em>%s</ em> par le chemin réel du serveur exécutant PHP <strong> CLI (Command Line Interface)</strong>. Rappelez-vous que vous devez utiliser l'exécutable PHP CLI, le PHP CGI (Common Gateway Interface) ne fonctionnant pas avec nos scripts CRON. En cas de doute, veuillez contacter votre hébergeur."
COM_AKEEBA_SCHEDULE_LBL_FRONTENDBACKUP="Paramètre de sauvegarde frontale"
COM_AKEEBA_SCHEDULE_LBL_FRONTENDBACKUP_INFO="Cette méthode utilise une URL publique et une clé secrète pour déclencher la sauvegarde du site. La sauvegarde progresse par le biais de redirections HTTP. Veuillez noter que la plupart des tâches et des services tiers CRON basés sur une URL ne prennent pas en charge les redirections HTTP. "
COM_AKEEBA_SCHEDULE_LBL_FRONTENDBACKUP_MANYMETHODS="La fonction de sauvegarde par le frontal peut être utilisée avec une grande variété de méthodes. Cliquez sur les onglets ci-dessous pour voir la description de chaque méthode. Rappelez-vous qu'elles sont expliqués en détail dans notre documentation."
COM_AKEEBA_SCHEDULE_LBL_FRONTENDBACKUP_TAB_CURL="cURL"
COM_AKEEBA_SCHEDULE_LBL_FRONTENDBACKUP_TAB_SCRIPT="PHP Script"
COM_AKEEBA_SCHEDULE_LBL_FRONTENDBACKUP_TAB_URL="URL"
COM_AKEEBA_SCHEDULE_LBL_FRONTENDBACKUP_TAB_WEBCRON="WebCron.org"
COM_AKEEBA_SCHEDULE_LBL_FRONTENDBACKUP_TAB_WGET="WGet"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_CURL="Planification CRON utilisant 'curl' (SiteGround et quelques autres hébergeurs):"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_CUSTOMSCRIPT="Script PHP personnalisé pour exécuter la sauvegarde frontale:"
; COM_AKEEBA_SCHEDULE_LBL_FRONTEND_DISABLED="The front-end backup feature of Akeeba Backup is not enabled. You cannot use this scheduling method unless you enable it. Please go to Akeeba Backup's Control Panel, click on the Options button in the toolbar and enable the front-end backup feature. Do not forget to also specify a secret word of your liking."
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_RAWURL="URL pour une utilisation avec vos propres scripts et services tiers:"
; COM_AKEEBA_SCHEDULE_LBL_FRONTEND_SECRET="The front-end backup feature's secret key is empty. You cannot use this scheduling method unless you create a secret key. Please go to Akeeba Backup's Control Panel, click on the Options button in the toolbar and enter a secret key of your liking."
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON="Configuration d'une tâche de sauvegarde avec WebCron.org:"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_ALERTS="Alertes"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_ALERTS_INFO="Si vous avez déjà mis en place des méthodes d'alerte dans l'interface de webcron.org, nous vous recommandons de choisir une méthode d'alerte ici et non la vérification 'Seulement en cas d'erreur' pour être notifié à chaque exécution d'une tâche CRON."
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_EXECUTIONTIME="Temps d’exécution"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_EXECUTIONTIME_INFO="Il s'agit des options ci-dessous. Sélectionnez quand et à quelle fréquence la tâche CRON doit être exécutée."
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_INFO="Connectez-vous à webcron.org.  Dans l'interface CRON, cliquez sur le bouton 'Nouveau Cron'. Vous trouverez ci-dessous ce que vous devez indiquer."
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_LOGIN="Identifiant"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_LOGINPASSWORD_INFO="Laissez ce champ vide"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_NAME="Nom de la tâche CRON"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_NAME_INFO="Tout ce que vous voulez. Par exemple <em>Sauvegarde du site votre-site</em>"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_PASSWORD="Mot de passe"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_THENCLICKSUBMIT="Puis, cliquez sur le bouton de validation pour terminer la configuration de votre tâche CRON."
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_TIMEOUT="Timeout"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_TIMEOUT_INFO="180sec; si la sauvegarde ne se termine pas, augmentez cette durée. Dans la plupart des configurations serveur, la durée peut varier entre 180 et 600. Si les sauvegardes s'effectuent en plus de 5 minutes, vous pouvez envisager d'utiliser la version professionnelle d'Akeeba Backup et sa fonction CLI native CRON, plus rapide et stable."
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WEBCRON_URL="URL à exécuter"
COM_AKEEBA_SCHEDULE_LBL_FRONTEND_WGET="Planification CRON utilisant 'wget' (la plupart des hébergeurs):"
COM_AKEEBA_SCHEDULE_LBL_GENERICREADDOC="Lire la documentation"
COM_AKEEBA_SCHEDULE_LBL_GENERICUSECLI="Utilisez la commande suivante dans l'interface de votre hébergeur CRON:"
COM_AKEEBA_SCHEDULE_LBL_HEADERINFO="Akeeba Backup offre plusieurs méthodes de planification de sauvegarde. Vous trouverez ci-dessous plus d'informations sur chaque méthode de planification. Veuillez lire la documentation de chaque méthode de planification, elle répond aux questions et vous aidera à planifier vos sauvegardes plus facilement."
COM_AKEEBA_SCHEDULE_LBL_RUN_BACKUPS="Exécuter les sauvegardes"
COM_AKEEBA_SCHEDULE_LBL_UPGRADENOW="Mettre à jour maintenant"
COM_AKEEBA_SCHEDULE_LBL_UPGRADETOPRO="Cette fonction est uniquement disponible pour la version professionnelle d'Akeeba Backup"
COM_AKEEBA_SFTPBROWSER_ERROR_HOSTNAME="Serveur SFTP ou port invalide"
COM_AKEEBA_SFTPBROWSER_ERROR_KEYFILE="Fichier de clé privée ou publique SFTP invalide, ou passphrase (mot de passe) du fichier de clé privée incorrect"
COM_AKEEBA_SFTPBROWSER_ERROR_NOACCESS="Le répertoire n'existe pas, est vide ou vous n'avez pas assez de permissions pour y accéder"
COM_AKEEBA_SFTPBROWSER_ERROR_UNSUPPORTED="Désolé, votre serveur SFTP ne supporte pas notre navigateur de répertoires SFTP."
COM_AKEEBA_SFTPBROWSER_ERROR_USERPASS="Identifiant ou mot de passe SFTP invalide"
COM_AKEEBA_SFTPBROWSER_LBL_ERROR="Une erreur s'est produite"
COM_AKEEBA_SFTPBROWSER_LBL_GOPARENT="&lt;Niveau supérieur&gt;"
COM_AKEEBA_SFTPBROWSER_LBL_INSTRUCTIONS="Cliquez sur un dossier pour l'explorer. Cliquez sur OK pour le sélectionner ou sur Annuler pour interrompre la procédure."
COM_AKEEBA_TITLE_ALICES="Dépannage - Alice (Akeeba Inspection Log et Cause d'élimination)"
COM_AKEEBA_TRANSFER="Assistant de transfert de site"
; COM_AKEEBA_TRANSFER_BTN_FTP_DETECT="Detect"
; COM_AKEEBA_TRANSFER_BTN_FTP_PROCEED="Proceed with restoration"
; COM_AKEEBA_TRANSFER_BTN_OPEN_KICKSTART="Run Kickstart"
COM_AKEEBA_TRANSFER_BTN_RESET="Réinitialiser"
COM_AKEEBA_TRANSFER_DESC="Transférer l'archive en exécutant le post-traitement "_QQ_"%s"_QQ_"."
; COM_AKEEBA_TRANSFER_ERR_CANNOTACCESSTESTFILE="Akeeba Backup cannot verify that the connection information you entered corresponds to the site URL you have entered. If you are trying to restore inside a subdirectory of an existing site this means that the main site is blocking access to the subdirectory; please contact your site administrator. In any other case you have entered the wrong connection information, most likely a wrong directory. Please contact your host and ask them for the correct connection information, <em>including the directory</em>, which corresponds to your the URL you have entered in this wizard. Then come back here, enter the correct information and continue with the restoration."
; COM_AKEEBA_TRANSFER_ERR_CANNOTREADLOCALFILE="Akeeba Backup cannot read from the local backup file <code>%s</code>. This wizard has failed. Please take a new backup and retry. Do note that files have been left behind on your new server; you may want to remove them manually."
; COM_AKEEBA_TRANSFER_ERR_CANNOTRUNKICKSTART="Akeeba Backup cannot run Akeeba Kickstart on your new site. If you are trying to restore inside a subdirectory of an existing site this means that the main site is blocking access to the subdirectory; please contact your site administrator. In any other case you need to contact your host and verify that your default PHP version matches Kickstart's minimum requirements."
; COM_AKEEBA_TRANSFER_ERR_CANNOTUPLOADARCHIVE="Akeeba Backup cannot upload the backup file <code>%s</code>. It's possible that your new site's server has ran out of disk space or a server protection is blocking the transmission of the data. Please try transferring your site by selecting the Manually transfer option. Do note that files have been left behind on your new server; you may want to remove them manually."
; COM_AKEEBA_TRANSFER_ERR_CANNOTUPLOADKICKSTART="Akeeba Backup cannot upload Akeeba Kickstart to your new site's root. Please check that you have entered the correct connection information and that it's possible for the FTP/SFTP user to write files into the directory you selected. If you already have kickstart.php and kickstart.transfer.php on the remote site please remove them before retrying transferring your site."
; COM_AKEEBA_TRANSFER_ERR_CANNOTUPLOADTESTFILE="Akeeba Backup cannot upload a test file called <code>%s</code> to your new site's root. Please check that you have entered the correct connection information and that it's possible for the FTP/SFTP user to write files into the directory you selected."
; COM_AKEEBA_TRANSFER_ERR_CANNOTWRITEREMOTEFILES="Unfortuantely, Akeeba Backup has determined it cannot write directly to files on your remote server. This wizard cannot proceed. You will have to use the "_QQ_"Manually"_QQ_" transfer method."
; COM_AKEEBA_TRANSFER_ERR_COMPLETEBACKUP="No such backup is found. Click the Backup Now button to take a new backup now."
; COM_AKEEBA_TRANSFER_ERR_ERRORFROMREMOTE="Akeeba Backup has received an error from the remote server while trying to upload the backup archive. The error was: %s"
; COM_AKEEBA_TRANSFER_ERR_EXISTINGSITE="Another site already exists in that location. Please remove the existing site before transfering a new site there. Trying to overwrite an existing site will most likely result in a broken site you won't be able to fix."
; COM_AKEEBA_TRANSFER_ERR_HTACCESS="A <code>%s</code> file was found in your new site's root. This file can interfere with the site transfer process. Please remove it before proceeding with the site transfer. Please note that the file may be <em>hidden</em>. If you don't see this file in your hosting control panel file browser or FTP client software please ask your host for more information on removing this file."
COM_AKEEBA_TRANSFER_ERR_INVALIDID="L'ID d'envoi spécifié est invalide"
COM_AKEEBA_TRANSFER_ERR_NEWURL_BTN="Vérifier"
COM_AKEEBA_TRANSFER_ERR_NEWURL_BTN_IGNOREERROR="Je souhaite ignorer cet avertissement et continuer <strong>à mes propres risques</strong>"
; COM_AKEEBA_TRANSFER_ERR_NEWURL_INVALID="The URL you entered is invalid."
; COM_AKEEBA_TRANSFER_ERR_NEWURL_NOTEXISTS="Your server cannot access the URL you have entered. Please check that you typed it correctly. Also note that newly assigned or transferred domain names may take <strong>up to 48 hours</strong> before they are visible to every server and computer connected to the Internet."
; COM_AKEEBA_TRANSFER_ERR_NEWURL_SAME="The URL you entered is the same as the one you are restoring from. This is not supported by this wizard. For backup restoration without using the wizard please consult our video tutorial below."
; COM_AKEEBA_TRANSFER_ERR_NOTENOUGHSPACE="The site transfer cannot proceed. You need approximately %s of free space but your server reports that only %s is currently available. Please make more space on your server."
; COM_AKEEBA_TRANSFER_ERR_SAMESITE="You have entered the connection information to the site you are transfering from. <strong>Your mistake would have deleted your own site</strong>. You need to enter the FTP/SFTP connection information to the site you are transferring <strong>to</strong> (new site or new server). Please fix the information above and retry."
; COM_AKEEBA_TRANSFER_ERR_SPACE="You only have <span></span> of free space. You need more free space to transfer your site. Please contact your host."
COM_AKEEBA_TRANSFER_HEAD_MANUALTRANSFER="Transfert manuel"
COM_AKEEBA_TRANSFER_HEAD_PREREQUISITES="Prérequis"
COM_AKEEBA_TRANSFER_HEAD_REMOTECONNECTION="Connexion au nouveau site"
COM_AKEEBA_TRANSFER_HEAD_UPLOAD="Charger et restaurer"
; COM_AKEEBA_TRANSFER_LBL_COMPLETEBACKUP="A complete, full site backup"
; COM_AKEEBA_TRANSFER_LBL_COMPLETEBACKUP_INFO="Backup found; taken on %s"
; COM_AKEEBA_TRANSFER_LBL_FTP_DIRECTORY="FTP/SFTP Directory"
COM_AKEEBA_TRANSFER_LBL_FTP_HOST="Nom du serveur hôte"
; COM_AKEEBA_TRANSFER_LBL_FTP_PASSIVE="Passive mode"
COM_AKEEBA_TRANSFER_LBL_FTP_PASSWORD="Mot de passe :"
COM_AKEEBA_TRANSFER_LBL_FTP_PORT="Port"
; COM_AKEEBA_TRANSFER_LBL_FTP_PRIVATEKEY="SFTP Private Key file"
; COM_AKEEBA_TRANSFER_LBL_FTP_PUBKEY="SFTP Public Key file"
COM_AKEEBA_TRANSFER_LBL_FTP_USERNAME="Nom d'utilisateur"
; COM_AKEEBA_TRANSFER_LBL_MANUALTRANSFER_INFO="Follow the instructions in the video to transfer your site manually. Information about the backup archive can be found below the video (scroll down)."
; COM_AKEEBA_TRANSFER_LBL_MANUALTRANSFER_MULTIPART="You must transfer <strong>all</strong> %u files:"
COM_AKEEBA_TRANSFER_LBL_NEWURL="L'URL de votre nouveau site"
; COM_AKEEBA_TRANSFER_LBL_NEWURL_TIP="Enter the URL to the site you are restoring to"
; COM_AKEEBA_TRANSFER_LBL_OPEN_KICKSTART_INFO="Kickstart will let you extract the backup archive and begin restoration on the remote server."
; COM_AKEEBA_TRANSFER_LBL_SPACE="Approximately %s of free space on your new site"
COM_AKEEBA_TRANSFER_LBL_TRANSFERMETHOD="Méthode de transfert de fichier"
COM_AKEEBA_TRANSFER_LBL_TRANSFERMETHOD_FTP="FTP"
; COM_AKEEBA_TRANSFER_LBL_TRANSFERMETHOD_FTPS="FTPS (FTP over Implicit SSL)"
COM_AKEEBA_TRANSFER_LBL_TRANSFERMETHOD_MANUALLY="Manuellement"
; COM_AKEEBA_TRANSFER_LBL_TRANSFERMETHOD_SFTP="SFTP (file transfer over SSH)"
; COM_AKEEBA_TRANSFER_LBL_UPLOAD_BACKUP="Uploading the backup archive"
; COM_AKEEBA_TRANSFER_LBL_UPLOAD_KICKSTART="Uploading Kickstart"
COM_AKEEBA_TRANSFER_LBL_VALIDATING="En cours de validation..."
COM_AKEEBA_TRANSFER_MSG_DONE="L'envoi est terminé!"
COM_AKEEBA_TRANSFER_MSG_FAILED="Erreur d'envoi de l'archive."
COM_AKEEBA_TRANSFER_MSG_START="Préparation de l'envoi de l'archive. Cela va prendre un certain temps, veuillez patienter."
COM_AKEEBA_TRANSFER_MSG_UPLOADINGFRAG="Poursuite de l'envoi de l'archive partie %s de %s; veuillez patienter."
COM_AKEEBA_TRANSFER_MSG_UPLOADINGPART="Envoi de l'archive partie %s de %s; veuillez patienter."
COM_AKEEBA_TRANSFER_TITLE="Transférer l'archive"
; COM_AKEEBA_TRANSFER_WARN_FIREWALLED_BODY="Some of the transfer methods listed above and marked with &#128274; are blocked by a firewall on your server. If you use them this wizard will most likely fail. Please contact your host and ask them to disable the firewall or add firewall exceptions before transferring your site. Alternatively, please select Manually above, click on Proceed with restoration and follow the instructions for a manual site transfer."
; COM_AKEEBA_TRANSFER_WARN_FIREWALLED_HEAD="Server firewall blocking file transfers - THIS WIZARD MAY FAIL"
COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_FATALERROR="Erreurs fatales"
; COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_FATALERROR_ERROR="The following fatal error happened while taking a backup. Please review and fix it before continuing: %s"
; COM_AKEEBA_ALICE_ANALYZE_RUNTIME_ERRORS_FATALERROR_SOLUTION="If you do not understand what this means and you have an active subscription to our site, please file a new support ticket making sure that 1. you have ZIPped and attached the backup log file and 2. you have pasted the text output visible at the top of this page."
language/fr-FR/fr-FR.com_contenthistory.sys.ini000060400000000754152453623440015440 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

COM_CONTENTHISTORY="Historique de contenu"
COM_CONTENTHISTORY_XML_DESCRIPTION="Composant d'historique de contenu"
language/fr-FR/fr-FR.plg_fields_sql.sys.ini000060400000001074152453623440014471 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_SQL="Champs - SQL"
PLG_FIELDS_SQL_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'sql' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_system_fields.sys.ini000060400000000775152453623440015225 0ustar00; @date        2016-12-15
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SYSTEM_FIELDS="Système - Champs"
PLG_SYSTEM_FIELDS_XML_DESCRIPTION="Ce plug-in permet d'afficher les champs personnalisés."
language/fr-FR/fr-FR.plg_content_finder.ini000060400000001655152453623440014535 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8 - No BOM


PLG_CONTENT_FINDER="Recherche avancée"
PLG_CONTENT_FINDER_XML_DESCRIPTION="Si ce plug-in n'est pas activé, l'index ne sera pas mis à jour dans la recherche avancée lors d'un changement de contenu ."

PLG_FINDER_QUERY_FILTER_BRANCH_P__="Tous"

PLG_FINDER_QUERY_FILTER_BRANCH_S_TYPE="Type"
PLG_FINDER_QUERY_FILTER_BRANCH_S_LANGUAGE="Langue"
PLG_FINDER_QUERY_FILTER_BRANCH_S_CATEGORY="Catégorie"

PLG_FINDER_QUERY_FILTER_BRANCH_P_TYPE="Types"
PLG_FINDER_QUERY_FILTER_BRANCH_P_LANGUAGE="Langues"
PLG_FINDER_QUERY_FILTER_BRANCH_P_CATEGORY="Catégories"
language/fr-FR/fr-FR.plg_system_languagecode.ini000060400000002244152453623440015551 0ustar00; @date        2015-01-28
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SYSTEM_LANGUAGECODE="Système - Code langue"
PLG_SYSTEM_LANGUAGECODE_FIELD_DESC="Modification du code langue utilisé pour la langue <em>%s</em>"
PLG_SYSTEM_LANGUAGECODE_FIELDSET_DESC="Modification du code de langue pour le document HTML généré.<br />Exemple d'utilisation : le site est en français avec le pack de langue 'fr-FR' installé, mais il s'adresse aux canadiens francophones ; pour l'indiquer aux moteurs de recherche, ajoutez le tag 'fr-CA' dans le champ correspondant en remplacement de 'fr-FR'."
PLG_SYSTEM_LANGUAGECODE_FIELDSET_LABEL="Code langue"
PLG_SYSTEM_LANGUAGECODE_XML_DESCRIPTION="Ce plug-in permet de changer le code de langue dans le document HTML généré pour cibler son référencement.<br />Note: les champs apparaissent lorsque le plug-in est activé puis enregistré."
language/fr-FR/fr-FR.plg_authentication_gmail.sys.ini000060400000001744152453623440016540 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8 - No BOM


PLG_AUTHENTICATION_GMAIL="Authentification - Gmail"
PLG_GMAIL_XML_DESCRIPTION="Authentification avec un compte Gmail ou Googlemail (nécessite cURL).<br />Les utilisateurs peuvent avoir besoin d'activer <em>Accès pour les applications moins sécurisées</em> à <a href="_QQ_"https://www.google.com/settings/security/lesssecureapps"_QQ_" target="_QQ_"_blank"_QQ_">https://www.google.com/settings/security/lesssecureapps </a> pour pouvoir se connecter avec cette méthode. <br /><strong>Attention, vous devez laisser au moins un plug-in d'authentification activé pour vous connecter sur le site !</strong>"
language/fr-FR/fr-FR.plg_captcha_recaptcha_invisible.sys.ini000060400000001333152453623440020023 0ustar00; @date        2018-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_CAPTCHA_RECAPTCHA_INVISIBLE="CAPTCHA - Invisible reCAPTCHA"
PLG_CAPTCHA_RECAPTCHA_INVISIBLE_XML_DESCRIPTION="Ce plugin CAPTCHA utilise le service \"Invisible reCAPTCHA\". Pour obtenir un site et une clé secrète pour votre domaine, se rendre à <a href=\"https://www.google.com/recaptcha\" target=\"_blank\">https://www.google.com/recaptcha</a>."
language/fr-FR/fr-FR.plg_system_jcemediabox.ini000060400000021344152453623440015407 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net/
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

; Chaînes de langue pour JCE Media Box 2

PLG_SYSTEM_JCEMEDIABOX="Système - JCE MediaBox 2"
PLG_SYSTEM_JCEMEDIABOX_XML_DESC="<h3>Plug-in JCE MediaBox, complément de l'éditeur JCE pour Joomla!</h3><p>JCE MediaBox permet d'afficher des médias (image, flash, flv, quicktime, vmw, avi, mpg, divx, youtube, etc.) et des contenus en popup de styles personnalisables.</p><p>JCE MediaBox permet également d'insérer des infobulles sur du texte ou des médias.</p><p>Présentation et modes d'emploi en anglais sur le site de l'auteur de JCE, Ryan Demmer : <a href='https://www.joomlacontenteditor.net/support/tutorials/jcemediabox' target='_blank' title='Site officiel'>https://www.joomlacontenteditor.net/support/tutorials/jcemediabox</a><br />Suivi de mise à jour : <a href='https://www.joomlacontenteditor.net/support/changelog/mediabox' target='_blank' title='Mises à jour'>https://www.joomlacontenteditor.net/support/changelog/mediabox</a></p><p>Traduction FR, présentation et forum en français par Sarki : <a href='https://www.sarki.ch/jce' target='_blank'>www.sarki.ch/jce</a></p>"

PLG_SYSTEM_JCEMEDIABOX_NOCONVERSION="Aucune conversion"
PLG_SYSTEM_JCEMEDIABOX_CONVERTOPTION="Options de conversion"
PLG_SYSTEM_JCEMEDIABOX_CONVERTOPTION_DESC="Convertir les popups JCE MediaBox en un autre format (support des scripts non inclus&nbsp;!)"

PLG_SYSTEM_JCEMEDIABOX_COMPONENTS="Exclure des composants"
PLG_SYSTEM_JCEMEDIABOX_COMPONENTS_DESC="Sélectionnez les composants qui ne doivent pas charger les bibliothèques de scripts de JCE MediaBox."

PLG_SYSTEM_JCEMEDIABOX_MENU="Restreindre à des liens de menu"
PLG_SYSTEM_JCEMEDIABOX_MENU_DESC="Restreindre le chargement des bibliothèques de scripts de JCE MediaBox aux liens de menus sélectionnés."

PLG_SYSTEM_JCEMEDIABOX_MENU_EXCLUDE="Exclure des liens de menu"
PLG_SYSTEM_JCEMEDIABOX_MENU_EXCLUDE_DESC="Exclure le chargement des bibliothèques de scripts de JCE MediaBox des liens de menus sélectionnés."

PLG_SYSTEM_JCEMEDIABOX_THEME="Thème des Popups"
PLG_SYSTEM_JCEMEDIABOX_THEME_DESC="Thème utilisé pour les fenêtres popup. Les thèmes Bootstrap et UIKit nécessitent un template utilisant l'un de ces frameworks pour être actifs."

PLG_SYSTEM_JCEMEDIABOX_THEME_STANDARD="Standard (Rond grisé)"
PLG_SYSTEM_JCEMEDIABOX_THEME_LIGHT="Flèche de côté (Lightbox)"
PLG_SYSTEM_JCEMEDIABOX_THEME_SHADOW="Simple sur fond noir"
PLG_SYSTEM_JCEMEDIABOX_THEME_SQUEEZE="Rond noir relief"
PLG_SYSTEM_JCEMEDIABOX_THEME_BOOTSTRAP="Bootstrap"
PLG_SYSTEM_JCEMEDIABOX_THEME_UIKIT="UIKit"

PLG_SYSTEM_JCEMEDIABOX_LEGACY="Rétrocompatibilité"
PLG_SYSTEM_JCEMEDIABOX_LEGACY_DESC="Conversion de rétrocompatibilité (Legacy) des popups JCE.<br />Vous devez activer cette option si vous avez créé des popups avec une des toutes premières versions de JCE."

PLG_SYSTEM_JCEMEDIABOX_LIGHTBOX="Remplacer Lightbox/Slimbox"
PLG_SYSTEM_JCEMEDIABOX_LIGHTBOX_DESC="Convertir les popups Lightbox/Slimbox en popup JCE MediaBox. Lorsque cette option est activée, les scripts Lightbox/Slimbox sont désactivés et remplacés par ceux de JCE MediaBox."

PLG_SYSTEM_JCEMEDIABOX_SHADOWBOX="Remplacer Shadowbox"
PLG_SYSTEM_JCEMEDIABOX_SHADOWBOX_DESC="Convertir les popups Shadowbox en popup JCE MediaBox. Lorsque cette option est activée, les scripts Shadowbox sont désactivés et remplacés par ceux de JCE MediaBox."

PLG_SYSTEM_JCEMEDIABOX_WIDTH="Largeur par défaut"
PLG_SYSTEM_JCEMEDIABOX_WIDTH_DESC="Largeur par défaut des fenêtres popup, en pixels (n'indiquez que le chiffre), à appliquer à toutes les fenêtres popup. Laissez vide pour que les fenêtre s'adaptent à la taille de l'image, avec une taille maximale correspondant à celle de la fenêtre du navigateur."
PLG_SYSTEM_JCEMEDIABOX_HEIGHT="Hauteur par défaut"
PLG_SYSTEM_JCEMEDIABOX_HEIGHT_DESC="Hauteur par défaut des fenêtres popup, en pixels (n'indiquez que le chiffre), à appliquer à toutes les fenêtres popup. Laissez vide pour que les fenêtre s'adaptent à la taille de l'image, avec une taille maximale correspondant à celle de la fenêtre du navigateur."

PLG_SYSTEM_JCEMEDIABOX_TRANSITIONSPEED="Vitesse de transition"
PLG_SYSTEM_JCEMEDIABOX_TRANSITIONSPEED_DESC="Vitesse de transition des fenêtres popup, en milliseconde (ms)."
PLG_SYSTEM_JCEMEDIABOX_OVERLAY="Fond derrière popup"
PLG_SYSTEM_JCEMEDIABOX_OVERLAY_DESC="Afficher ou non un fond couvrant l'ensemble de la page derrière les fenêtres popup."
PLG_SYSTEM_JCEMEDIABOX_OVERLAYOPACITY="Opacité du fond"
PLG_SYSTEM_JCEMEDIABOX_OVERLAYOPACITY_DESC="Définissez la valeur d'opacité du fond couvrant l'ensemble de la page derrière les fenêtres popup (0 = transparent, 1 = opaque)"
PLG_SYSTEM_JCEMEDIABOX_OVERLAYCOLOR="Couleur du fond"
PLG_SYSTEM_JCEMEDIABOX_OVERLAYCOLOR_DESC="Indiquez la couleur hexadécimale du fond couvrant l'ensemble de la page derrière les fenêtres popup."
PLG_SYSTEM_JCEMEDIABOX_RESIZE="Taille des popups adaptée"
PLG_SYSTEM_JCEMEDIABOX_RESIZE_DESC="Redimensionner les fenêtres popups si leur taille dépasse la taille de l'écran disponible."
PLG_SYSTEM_JCEMEDIABOX_ICONS="Icône Zoom/Popup"
PLG_SYSTEM_JCEMEDIABOX_ICONS_DESC="Afficher l'icône zoom/popup sur les éléments pouvant s'afficher en popup."
PLG_SYSTEM_JCEMEDIABOX_HIDEOBJECTS="Masquer les Objets/embed"
PLG_SYSTEM_JCEMEDIABOX_HIDEOBJECTS_DESC="Définissez si les éléments objets/embed (vidéo, flash...) doivent être masqués ou non dans les fenêtres popup."
PLG_SYSTEM_JCEMEDIABOX_SCROLLING="Popup toujours centrée"
PLG_SYSTEM_JCEMEDIABOX_SCROLLING_DESC="Définir le comportement des fenêtre popups lors de l'utilisation de l’ascenseur. <strong>Fixe :</strong> la fenêtre popup reste centrée lors de l'utilisation de l’ascenseur. <strong>Défilement :</strong> la fenêtre popup défile avec la page lors de l'utilisation de l'ascenseur."
PLG_SYSTEM_JCEMEDIABOX_SCROLLING_SCROLL="Défilement"
PLG_SYSTEM_JCEMEDIABOX_SCROLLING_FIXED="Fixe"

PLG_SYSTEM_JCEMEDIABOX_SWIPE="Swipe"
PLG_SYSTEM_JCEMEDIABOX_SWIPE_DESC="Activez le support Swipe pour naviguer dans les éléments multimédia d'un groupe JCE MediaBox."

PLG_SYSTEM_JCEMEDIABOX_TOPLEFT="Haut Gauche"
PLG_SYSTEM_JCEMEDIABOX_TOPRIGHT="Haut Droite"
PLG_SYSTEM_JCEMEDIABOX_TOPCENTRE="Haut Centre"
PLG_SYSTEM_JCEMEDIABOX_BOTTOMLEFT="Bas Gauche"
PLG_SYSTEM_JCEMEDIABOX_BOTTOMRIGHT="Bas Droite"
PLG_SYSTEM_JCEMEDIABOX_BOTTOMCENTRE="Bas Centre"

PLG_SYSTEM_JCEMEDIABOX_DYNAMICTHEMES="Thèmes dynamiques"
PLG_SYSTEM_JCEMEDIABOX_DYNAMICTHEMES_DESC="Autoriser ou non la modification du thème des popups par l'ajout de sa variable dans l'URL de la page. Exemple: ...&theme=light"

; Popup
PLG_SYSTEM_JCEMEDIABOX_LABEL_CLOSE="Fermer"
PLG_SYSTEM_JCEMEDIABOX_LABEL_NEXT="Suivant"
PLG_SYSTEM_JCEMEDIABOX_LABEL_PREVIOUS="Précédent"
PLG_SYSTEM_JCEMEDIABOX_LABEL_CANCEL="Annuler"
PLG_SYSTEM_JCEMEDIABOX_LABEL_NUMBERS="{{numbers}}"
PLG_SYSTEM_JCEMEDIABOX_LABEL_NUMBERS_COUNT="{{current}} sur {{total}}"

PLG_SYSTEM_JCEMEDIABOX_CLOSE_ACTION="Fermeture des popups"
PLG_SYSTEM_JCEMEDIABOX_CLOSE_ACTION_DESC="Sélectionnez le système à utiliser pour la fermeture des fenêtres popups."
PLG_SYSTEM_JCEMEDIABOX_CLOSE_BUTTON="Uniquement avec le bouton"
PLG_SYSTEM_JCEMEDIABOX_CLOSE_BUTTON_OVERLAY="Avec le bouton et en cliquant sur le fond"

PLG_SYSTEM_JCEMEDIABOX_LABEL_DOWNLOAD="Télécharger"

PLG_SYSTEM_JCEMEDIABOX_COOKIE_EXPIRY="Durée du cookie Popup auto"
PLG_SYSTEM_JCEMEDIABOX_COOKIE_EXPIRY_DESC="Le cookie permettant de ne pas réaficher les fenêtre popups qui s'ouvrent automatiquement expirera après le nombre de jours indiqué ici. Laissez vide pour une expiration du cookie lorsque l'utilisateur ferme son navigateur."

PLG_SYSTEM_JCEMEDIABOX_MEDIAFALLBACK="Lecteur de média alternatif"
PLG_SYSTEM_JCEMEDIABOX_MEDIAFALLBACK_DESC="Activez cette option pour fournir un lecteur multimédia alternatif basé sur flash pour les éléments utilisant une balise vidéo ou audio non prise en charge par le navigateur du visiteur. Supporte actuellement mp4, mp3, flv, f4v."
PLG_SYSTEM_JCEMEDIABOX_MEDIASELECTOR="Sélecteur CSS"
PLG_SYSTEM_JCEMEDIABOX_MEDIASELECTOR_DESC="Sélecteur CSS des éléments devant être pris en charge par le lecteur multimédia alternatif. Par défaut audio, vidéo."

COM_PLUGINS_OPTIONS_FIELDSET_LABEL="Options"

PLG_SYSTEM_JCEMEDIABOX_EXPAND_ON_CLICK="Icône d'agrandissement"
PLG_SYSTEM_JCEMEDIABOX_EXPAND_ON_CLICK_DESC="Les images redimensionnées pour s'adapter à l'écran s'agrandissent lorsqu'on clique dessus. Si cette option est activée, le curseur se transforme en icône de zoom au survol de l'image, indiquant que l'image peut être agrandie."

language/fr-FR/fr-FR.plg_user_contactcreator.ini000060400000003057152453623440015603 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_CONTACTCREATOR_ERR_FAILED_CREATING_CONTACT="La création automatique de la fiche de contact a échoué. Merci de contacter un administrateur du site."
PLG_CONTACTCREATOR_ERR_NO_CATEGORY="La création automatique de la fiche de contact a échoué car la catégorie n'a pas été définie. Merci de contacter un administrateur du site."
PLG_CONTACTCREATOR_FIELD_AUTOMATIC_WEBPAGE_DESC="Spécifiez les tags des champs à récupérer automatiquement dans la fiche de contact.<br />[name] est remplacé par le nom, [username] par l'identifiant, [userid] par l'ID de membre et [email] par son adresse e-mail."
PLG_CONTACTCREATOR_FIELD_AUTOMATIC_WEBPAGE_LABEL="Champs de la fiche"
PLG_CONTACTCREATOR_FIELD_AUTOPUBLISH_DESC="Activer/Désactiver l'auto-publication des fiches de contact crées automatiquement."
PLG_CONTACTCREATOR_FIELD_AUTOPUBLISH_LABEL="Auto-publier le contact"
PLG_CONTACTCREATOR_FIELD_CATEGORY_DESC="Catégorie à laquelle affecter les nouvelles fiches de contact crées automatiquement."
PLG_CONTACTCREATOR_XML_DESCRIPTION="Génération automatique d'une fiche de contact lors de la création d'un compte utilisateur"
PLG_USER_CONTACTCREATOR="Utilisateur - Fiches de contact automatiques"language/fr-FR/fr-FR.plg_editors_tinymce.ini000060400000035371152453623440014737 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_EDITORS_TINYMCE="Éditeur - TinyMCE"
PLG_TINY_BUTTON_TOGGLE_EDITOR="Basculer l'éditeur"
PLG_TINY_CONFIG_TEXTFILTER_ACL_DESC="Si activé, les filtres de texte de la Configuration globale de Joomla pour chaque groupe d'utilisateurs seront utilisés.<br />Sinon, les filtres définis ci-dessous seront utilisés pour tous les groupes d'utilisateurs."
PLG_TINY_CONFIG_TEXTFILTER_ACL_LABEL="Utiliser les filtres de texte de Joomla"
PLG_TINY_ERR_CUSTOMCSSFILENOTPRESENT="Impossible de trouver le fichier CSS personnalisé défini dans les paramètres de l'éditeur TinyMCE. Aucun style n'a pu être chargé."
PLG_TINY_ERR_EDITORCSSFILENOTPRESENT="Impossible de trouver le fichier 'editor.css' dans le dossier du template par défaut ou dans le dossier du template 'system'. Aucun style n'a pu être chargé dans l'éditeur."
PLG_TINY_ERR_UNSUPPORTEDBROWSER="Le glisser-déposer des images à transférer n'est pas disponible pour votre navigateur. Utiliser un navigateur pleinement compatible avec le standard HTML5."
PLG_TINY_FIELD_ADVIMAGE_DESC="Activer/Désactiver les fonctions avancées dans la fenêtre d'insertion d'image (styles, filets, etc.)."
PLG_TINY_FIELD_ADVIMAGE_LABEL="Image 'Avancé'"
PLG_TINY_FIELD_ADVLIST_DESC="Activer/Désactiver les listes à puces et les listes numérotées."
PLG_TINY_FIELD_ADVLIST_LABEL="Listes 'Avancé'"
PLG_TINY_FIELD_ALIGN_DESC="Activer/Désactiver l'alignement du texte. "
PLG_TINY_FIELD_ALIGN_LABEL="Alignement du texte"
PLG_TINY_FIELD_BLOCKQUOTE_DESC="Activer/Désactiver le bouton d'insertion des balises blockquote (applique un retrait si aucun style différent n'est spécifié dans la feuille de style CSS du template)."
PLG_TINY_FIELD_BLOCKQUOTE_LABEL="Citation - Blockquote"
PLG_TINY_FIELD_CODESAMPLE_DESC="Activer/désactiver la surbrillance des échantillons de code"
PLG_TINY_FIELD_CODESAMPLE_LABEL="Exemple de code"
PLG_TINY_FIELD_COLORS_DESC="Afficher/Masquer les boutons de choix de couleurs."
PLG_TINY_FIELD_COLORS_LABEL="Couleurs"
PLG_TINY_FIELD_CONTEXTMENU_DESC="Activer/Désactiver le menu contextuel (clic droit de la souris)."
PLG_TINY_FIELD_CONTEXTMENU_LABEL="Menu contextuel"
PLG_TINY_FIELD_CSS_DESC="Activer/Désactiver la prise en charge dans l'éditeur des styles CSS du template.<br />Par défaut, le plug-in recherche le fichier 'editor.css'. S'il n'en trouve pas dans le dossier css du template, il utilise le fichier 'editor.css' du template 'system'."
PLG_TINY_FIELD_CSS_LABEL="Classes CSS du template"
PLG_TINY_FIELD_CUSTOMBUTTON_DESC="Ajouter un ou des boutons personnalisés.<br />Pour plus d'information, veuillez consulter l'aide de TinyMCE sur le site officel."
PLG_TINY_FIELD_CUSTOMBUTTON_LABEL="Bouton personnalisé"
PLG_TINY_FIELD_CUSTOMPLUGIN_DESC="Ajouter un ou des plug-ins personnalisés.<br />Pour plus d'information, veuillez consulter l'aide de TinyMCE sur le site officel."
PLG_TINY_FIELD_CUSTOMPLUGIN_LABEL="Plug-in personnalisé"
PLG_TINY_FIELD_CUSTOM_CSS_DESC="Nom de la feuille de styles CSS personnalisée qui prendra le pas sur le fichier 'editor.css'.<br />Saisissez le nom du fichier à utiliser, présent dans le dossier 'css' de votre template par défaut (exemple : templates/beez_20/css/perso.css) ou, saisissez l'URL complète du fichier personnalisé (exemple : http://www.mon-site.com/templates/mon-template/css/perso.css)."
PLG_TINY_FIELD_CUSTOM_CSS_LABEL="Classes CSS personnalisées"
PLG_TINY_FIELD_CUSTOM_PATH_DESC="Indiquer le dossier contenant les images à lister par rapport au dossier d'images par défaut (défini dans Media > Paramètres)."
PLG_TINY_FIELD_CUSTOM_PATH_LABEL="Dossier images"
PLG_TINY_FIELD_DATE_DESC="Afficher/Masquer le bouton d'insertion de date."
PLG_TINY_FIELD_DATE_LABEL="Insérer la date"
PLG_TINY_FIELD_DIRECTION_DESC="Choisissez la direction par défaut de l'écriture."
PLG_TINY_FIELD_DIRECTION_LABEL="Direction d'écriture"
PLG_TINY_FIELD_DRAG_DROP_DESC="Activer le glisser-déposer pour le transfert d'images"
PLG_TINY_FIELD_DRAG_DROP_LABEL="Glisser-déposer des images"
PLG_TINY_FIELD_ELEMENTS_DESC="Éléments autorisés qui ne seront pas supprimés lors de l'ouverture ou de l'enregistrement du contenu."
PLG_TINY_FIELD_ELEMENTS_LABEL="Éléments autorisés"
PLG_TINY_FIELD_ENCODING_DESC="Contrôle la façon dont les entités HTML sont encodées.<br />Le paramètre recommandé est 'Brut'.<br /><strong>Nommé</strong> : utilise l'encodage d'entités nommées (par exemple : &lt;).<br /><strong>Numérique</strong> : utilise l'encodage HTML numérique (par exemple : %03c).<br /><strong>Brut</strong> : aucun encodage HTML.<br />Attention : la recherche dans les contenus peut ne pas fonctionner correctement si le paramètre utilisé n'est pas 'Brut'."
PLG_TINY_FIELD_ENCODING_LABEL="Type d'encodage"
PLG_TINY_FIELD_FONTS_DESC="Afficher/Masquer les menus déroulants permettant de choisir les 'Polices' et 'Tailles' de caractères."
PLG_TINY_FIELD_FONTS_LABEL="Polices et Tailles"
PLG_TINY_FIELD_FULLSCREEN_DESC="Afficher/Masquer le bouton pour agrandir l'éditeur en plein écran."
PLG_TINY_FIELD_FULLSCREEN_LABEL="Plein écran"
PLG_TINY_FIELD_FUNCTIONALITY_DESC="Le choix du mode de l'éditeur permet de limiter ou étendre les fonctions disponibles par la présence ou non de leur icône dans la barre d'outils."
PLG_TINY_FIELD_FUNCTIONALITY_LABEL="Mode de l'éditeur"
PLG_TINY_FIELD_HR_DESC="Afficher/Masquer le bouton pour insérer une ligne horizontale stylée."
PLG_TINY_FIELD_HR_LABEL="Ligne horizontale stylée"
PLG_TINY_FIELD_HTMLHEIGHT_DESC="Hauteur de l'éditeur.<br />Ne fonctionne qu'en mode 'Avancé' et 'Étendu'."
PLG_TINY_FIELD_HTMLHEIGHT_LABEL="Hauteur de l'éditeur"
PLG_TINY_FIELD_HTMLWIDTH_DESC="Largeur de l'éditeur. Doit normalement être laissé vide pour qu'il puisse s'adapter à la taille du navigateur.<br />Ne fonctionne qu'en mode 'Avancé' et 'Étendu'."
PLG_TINY_FIELD_HTMLWIDTH_LABEL="Largeur de l'éditeur"
PLG_TINY_FIELD_INLINEPOPUPS_DESC="Activer/Désactiver l'utilisation des balises 'div' pour les popups d'outils, permettant d'éviter leur blocage par les systèmes anti-popup."
PLG_TINY_FIELD_INLINEPOPUPS_LABEL="Popup outils en 'div'"
PLG_TINY_FIELD_LABEL_ADVANCEDPARAMS="Paramètres avancés"
PLG_TINY_FIELD_LANGCODE_DESC="Code langue de l'éditeur (fr, en, de...).<br />La valeur sera utilisée si la détection automatique n'est pas implémentée."
PLG_TINY_FIELD_LANGCODE_LABEL="Langue de l'éditeur"
PLG_TINY_FIELD_LANGSELECT_DESC="Si activé, la langue de l'éditeur correspondra à la langue de l'interface de Joomla!<br /> En cas d'absence de cette langue pour Tiny, l'anglais sera utilisé par défaut."
PLG_TINY_FIELD_LANGSELECT_LABEL="Détection automatique de la langue"
PLG_TINY_FIELD_LINK_DESC="Activer/Désactiver l'icône de liens. "
PLG_TINY_FIELD_LINK_LABEL="Liens"
PLG_TINY_FIELD_MEDIA_DESC="Afficher/Masquer le bouton d'insertion de médias."
PLG_TINY_FIELD_MEDIA_LABEL="Médias"
PLG_TINY_FIELD_MOBILE_DESC="Ce mode place tous les appareils mobiles en fonctionnalité simple avec boutons élargis pour accès facile."
PLG_TINY_FIELD_MOBILE_LABEL="Mode mobile"
PLG_TINY_FIELD_NAME_EXTENDED_LABEL="<strong>Options mode étendu </strong><br />Vous pouvez ci-dessous choisir le niveau d'accés de chacun des champs<br />Merci de garder à l'esprit que ces paramètres n'auront d'effet qu'en 'Mode étendu'"
PLG_TINY_FIELD_NEWLINES_DESC="Le changement de ligne sera géré avec l'option sélectionnée."
PLG_TINY_FIELD_NEWLINES_LABEL="Nouvelle ligne"
PLG_TINY_FIELD_NONBREAKING_DESC="Afficher/Masquer le bouton pour insérer des espaces insécables (absolu)."
PLG_TINY_FIELD_NONBREAKING_LABEL="Espaces insécables"
PLG_TINY_FIELD_NUMBER_OF_SETS_LABEL="Nombre de sets"
PLG_TINY_FIELD_NUMBER_OF_SETS_DESC="Nombre de sets qui peuvent être créé. Minimum 3."
PLG_TINY_FIELD_PASTE_DESC="Afficher/Masquer le bouton 'Coller du texte'"
PLG_TINY_FIELD_PASTE_LABEL="Collage spécial"
PLG_TINY_FIELD_PATH_DESC="Afficher/Masquer les balises de l'élément sélectionné dans la barre d'état de l'éditeur."
PLG_TINY_FIELD_PATH_LABEL="Afficher les balises"
PLG_TINY_FIELD_PRINT_DESC="Afficher/Masquer les icônes d'impression et de prévisualisation."
PLG_TINY_FIELD_PRINT_LABEL="Imprimer/Prévisualisation"
PLG_TINY_FIELD_PROHIBITED_DESC="Éléments qui seront automatiquement supprimés à l'ouverture ou la sauvegarde du contenu (selon le type de nettoyage choisi plus haut)."
PLG_TINY_FIELD_PROHIBITED_LABEL="Éléments prohibés"
PLG_TINY_FIELD_RESIZE_HORIZONTAL_DESC="Activer/Désactiver le redimensionnement horizontal"
PLG_TINY_FIELD_RESIZE_HORIZONTAL_LABEL="Redimensionnement horizontal"
PLG_TINY_FIELD_RESIZING_DESC="Activer/désactiver le redimensionnement de l'éditeur (verticalement et aussi horizontalement si 'Redimensionement horizontal' est activé)."
PLG_TINY_FIELD_RESIZING_LABEL="Redimensionnement"
PLG_TINY_FIELD_RTL_DESC="Afficher/Masquer les boutons 'Direction d'écriture'<br />(écriture de gauche à droite ou de droite à gauche)."
PLG_TINY_FIELD_RTL_LABEL="Direction d'écriture"
; The two following strings are deprecated
PLG_TINY_FIELD_SAVEWARNING_DESC="Activer/désactiver l'affichage d'un avertissement lorsque vous cliquez sur le bouton 'Annuler' sans avoir sauvegardé les changements effectués."
PLG_TINY_FIELD_SAVEWARNING_LABEL="Avertissement sauvegarde"
PLG_TINY_FIELD_SEARCH-REPLACE_DESC="Afficher/Masquer le bouton permettant de rechercher un mot et de remplacer un mot par un autre."
PLG_TINY_FIELD_SEARCH-REPLACE_LABEL="Rechercher/Remplacer"
PLG_TINY_FIELD_SETACCESS_DESC="Sélectionner les groupes d'utilisateurs autorisés à utiliser ce set.<br>Si un utilisateur appartient à plusieurs groupes, le set utilisé sera celui assigné au groupe placé le plus haut dans le hiérarchie.<br>Exemple : si un set est attribué à Auteur et un autre à Administrateurs et si l'utilisateur appartient aux deux groupes, le set attribué à Administrateurs sera utilisé."
PLG_TINY_FIELD_SETACCESS_LABEL="Assigner ce set à"
PLG_TINY_FIELD_SKIN_ADMIN_DESC="Choisir un habillage pour l'interface administration"
PLG_TINY_FIELD_SKIN_ADMIN_LABEL="Habillage administration"
PLG_TINY_FIELD_SKIN_DESC="Le choix de l'habillage permet d'attribuer un aspect différent à l'éditeur et sa barre d'outils."
PLG_TINY_FIELD_SKIN_INFO_DESC="Copier les habillages à : /media/editors/tinymce/skins"
PLG_TINY_FIELD_SKIN_INFO_LABEL="Pour obtenir des habillages particuliers : <a href=\"http://skin.tiny.cloud\" target=\"_blank\">Skin Creator</a>"
PLG_TINY_FIELD_SKIN_LABEL="Habillage de l'éditeur"
PLG_TINY_FIELD_SMILIES_DESC="Afficher/Masquer le bouton des émoticônes. "
PLG_TINY_FIELD_SMILIES_LABEL="Émoticônes"
PLG_TINY_FIELD_TABLE_DESC="Afficher/Masquer les boutons de gestion des tableaux."
PLG_TINY_FIELD_TABLE_LABEL="Tableaux"
PLG_TINY_FIELD_TEMPLATE_DESC="Afficher/Masquer le bouton permettant d'insérer des gabarits (modèles) de mise en page dans vos documents.<br /><b>Attention</b>, ces modèles doivent être créés auparavant et être présents dans le dossier 'media/editors/tinymce/templates/'.<br />Pour plus d'information, veuillez consulter l'aide de TinyMCE sur le site officiel."
PLG_TINY_FIELD_TEMPLATE_LABEL="Gabarits de mise en page"
PLG_TINY_FIELD_URLS_DESC="Manière dont le code des liens URL est écrit.<br />L'URL relative part de la racine du site : images/stories/key.jpg<br />L'URL absolue est complète : http://www.joomla.fr/images/stories/key.jpg"
PLG_TINY_FIELD_URLS_LABEL="Encodage des URL"
PLG_TINY_FIELD_VALIDELEMENTS_DESC="Définir quels éléments resteront dans le texte édité lors de la sauvegarde (la règle par défaut pour cette option est un mélange de toutes les spécifications HTML5 et HTML4)."
PLG_TINY_FIELD_VALIDELEMENTS_LABEL="Éléments autorisés"
PLG_TINY_FIELD_VALUE_ABSOLUTE="Absolu"
PLG_TINY_FIELD_VALUE_ADVANCED="Avancé"
PLG_TINY_FIELD_VALUE_ALWAYS="Toujours"
PLG_TINY_FIELD_VALUE_BOTTOM="Bas"
PLG_TINY_FIELD_VALUE_BR="Saut de ligne"
PLG_TINY_FIELD_VALUE_CENTER="Centre"
PLG_TINY_FIELD_VALUE_DEFAULT="Défaut"
PLG_TINY_FIELD_VALUE_EXTENDED="Étendu"
PLG_TINY_FIELD_VALUE_FRONT="Frontal"
PLG_TINY_FIELD_VALUE_LEFT="Gauche"
PLG_TINY_FIELD_VALUE_LTR="Gauche à droite"
PLG_TINY_FIELD_VALUE_NAMED="Nommé"
PLG_TINY_FIELD_VALUE_NEVER="Jamais"
PLG_TINY_FIELD_VALUE_NUMERIC="Numérique"
PLG_TINY_FIELD_VALUE_P="Paragraphe"
PLG_TINY_FIELD_VALUE_RAW="Brut"
PLG_TINY_FIELD_VALUE_RELATIVE="Relatif"
PLG_TINY_FIELD_VALUE_RIGHT="Droite"
PLG_TINY_FIELD_VALUE_RTL="Droite à Gauche"
PLG_TINY_FIELD_VALUE_SIMPLE="Simple"
PLG_TINY_FIELD_VALUE_TOP="Haut"
PLG_TINY_FIELD_VISUALBLOCKS_DESC="Afficher/Masquer les blocs (div, paragraphe, liste, etc.) et l'indication de leur balise."
PLG_TINY_FIELD_VISUALBLOCKS_LABEL="Blocs visuels"
PLG_TINY_FIELD_VISUALCHARS_DESC="Afficher/Masquer les espaces insécables par un point."
PLG_TINY_FIELD_VISUALCHARS_LABEL="Afficher les espaces"
PLG_TINY_FIELD_WORDCOUNT_DESC="Activer/Désactiver le compteur de mots"
PLG_TINY_FIELD_WORDCOUNT_LABEL="Compteur de mots"
PLG_TINY_LEGACY_WARNING="Le <a href=\"%s\">plug-in éditeur TinyMCE</a> a été mis à jour. Il utilise actuellement la configuration existante. En modifiant le plug-in, vous pouvez dorénavant assigner et personnaliser différentes mises en page à des groupes d'utilisateurs spécifiques.<br>Attention! Une grande partie des paramètres existants ne seront plus tenus en compte!"
PLG_TINY_SET_TARGET_PANEL_DESCRIPTION="<strong>Sets du panneau de TinyMCE et les options pour chaque set.</strong><br />Dans chaque set, vous pouvez ajouter ou enlever des menus ou boutons parmi <strong>les menus et boutons disponibles</strong>."
PLG_TINY_SET_TITLE="Set %s"
PLG_TINY_SET_PRESET_BUTTON_ADVANCED="Set avancé"
PLG_TINY_SET_PRESET_BUTTON_MEDIUM="Set medium"
PLG_TINY_SET_PRESET_BUTTON_SIMPLE="Set simple"
PLG_TINY_SET_SOURCE_PANEL_DESCRIPTION="<strong>Menus et boutons disponibles.</strong><br />Utilisez-les par glisser-déposer pour éditer ou créer votre barre d'outils TinyMCE personnalisée."
PLG_TINY_TEMPLATE_LAYOUT1_DESC="Gabarit HTML"
PLG_TINY_TEMPLATE_LAYOUT1_TITLE="Gabarit"
PLG_TINY_TEMPLATE_SNIPPET1_DESC="Fragment de code HTML simple"
PLG_TINY_TEMPLATE_SNIPPET1_TITLE="Simple fragment de code"
; TinyMCE toolbar buttons
PLG_TINY_TOOLBAR_BUTTON_FONTSELECT="Police"
PLG_TINY_TOOLBAR_BUTTON_FONTSIZESELECT="Taille de police"
PLG_TINY_TOOLBAR_BUTTON_FORMATSELECT="Format"
PLG_TINY_TOOLBAR_BUTTON_STYLESELECT="Style"
PLG_TINY_TOOLBAR_BUTTON_SEPARATOR="Séparateur"
PLG_TINY_XML_DESCRIPTION="Intégration de l'éditeur WYSIWYG TinyMCE, fonctionnant avec Javascript.<br /><br />Pour être utilisé, TinyMCE doit être déclaré comme 'Éditeur par défaut' dans la configuration globale de Joomla! ou attribué au profil utilisateur souhaité."
language/fr-FR/fr-FR.com_slideshowck.sys.ini000060400000000661152453623440014660 0ustar00; license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
; Note : All ini files need to be saved as UTF-8


COM_SLIDESHOWCK="Slideshow CK"
COM_SLIDESHOWCK_DESC="Slideshow CK affiche vos images et contenus dans un slider. Tactile - mobile - responsive - rtl"
SLIDESHOWCK_DESC="Slideshow CK affiche vos images et contenus dans un slider. Tactile - mobile - responsive - rtl"
COM_SLIDESHOWCK_CONFIGURATION="Slideshow CK Configuration"language/fr-FR/fr-FR.plg_search_icagenda.ini000060400000002256152453623440014612 0ustar00; iCagenda
; Copyright (c)2012-2014 Cyril Rezé (Lyr!C) / JoomliC.com - All rights reserved.
; License GNU General Public License version 3 or later <http://www.gnu.org/licenses/gpl.html>
; Note : All ini files need to be saved as UTF-8
;
; ICAGENDA_PLG_SEARCH	: plg_search_icagenda.ini
; Translation Platform	: https://www.transifex.com/projects/p/icagenda/


ICAGENDA_PLG_SEARCH = "Recherche - iCagenda"
ICAGENDA_PLG_SEARCH_XML_DESCRIPTION = " Intégration des évènements iCagenda dans la recherche sur le site."

ICAGENDA_PLG_SEARCH_NAME_LABEL = "Section"
ICAGENDA_PLG_SEARCH_NAME_DESC = "Par défaut, la recherche sur le site va utiliser 'Évènements' comme le nom de la section dans le formulaire de recherche. Si vous souhaitez utiliser un autre terme, vous pouvez le changer en remplissant ce champs."

ICAGENDA_PLG_SEARCH_TARGET_LABEL = "Cible du lien"
ICAGENDA_PLG_SEARCH_TARGET_DESC = "Fenêtre cible du navigateur lorsque le lien de l'évènement est cliqué."

ICAGENDA_PLG_SEARCH_SECTION_EVENTS = "Évènements"

ICAGENDA_PLG_SEARCH_ALERT_NO_ICAGENDA_MENUITEM = "La recherche dans les évènements est désactivée: aucun lien de menu vers la liste des évènements n'est publié."
language/fr-FR/fr-FR.plg_editors-xtd_readmore.ini000060400000001445152453623440015655 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_EDITORS-XTD_READMORE="Bouton - Lire la suite..."
PLG_READMORE_ALREADY_EXISTS="Un lien 'Lire la suite...' a déjà été inséré dans ce contenu, un seul est possible. Utiliser le 'Saut de page' pour générer une pagination."
PLG_READMORE_BUTTON_READMORE="Lire la suite..."

[New Strings]

PLG_READMORE_XML_DESCRIPTION="Affiche un bouton sous l'éditeur permettant d'insérer un lien 'Lire la suite...' dans un article."
language/fr-FR/fr-FR.plg_editors-xtd_contact.sys.ini000060400000001210152453623440016315 0ustar00; @date        2016-10-27
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_EDITORS-XTD_CONTACT="Bouton - Contact"
PLG_EDITORS-XTD_CONTACT_XML_DESCRIPTION="Affiche un bouton sous l'éditeur pour insérer dans un contenu un lien vers un contact.<br />Ouvre une fenêtre pop-up permettant de choisir le contact vers lequel effectuer le lien."
language/fr-FR/fr-FR.plg_system_googlic_analytics.ini000060400000007037152453623440016632 0ustar00; GoogliC Analytics fr-FR
; @version	$version 1.2.3 JoomliC 2012-05-20$
; @author	JoomliC <info@joomlic.com>
; @link		http://www.joomlic.com

PLG_SYSTEM_GOOGLIC_ANALYTICS="Système - GoogliC Analytics"
PLG_SYSTEM_GOOGLIC_ANALYTICS_XML_DESCRIPTION="<iframe src="_QQ_"http://www.joomlic.com/infosic/googlic/fr_plugin_googlic_124.html"_QQ_" frameborder="_QQ_"0"_QQ_" height="_QQ_"250"_QQ_" width="_QQ_"550"_QQ_"></iframe><br/><br/><i><small>Plugin Sytème GoogliC Analytics by Jooml!C - <a href='http://www.joomlic.com' target='_blanck'>www.joomlic.com</a></small></i>"
COM_PLUGINS_GOOGLIC_FIELDSET_LABEL="&nbsp;&nbsp;&nbsp;<img src="_QQ_"../media/googlic_analytics/images/googlic16.png"_QQ_"/> Paramètres GoogliC Analytics"
PLG_SYSTEM_GOOGLIC_ANALYTICS_GOOGLE_TITRE="ID GOOGLE ANALYTICS"
PLG_SYSTEM_GOOGLIC_ANALYTICS_GOOGLE_NOTE="Insérez votre ID de site/suivi fourni par Google Analytics. <a href="_QQ_"http://www.google.com/analytics/"_QQ_" target="_QQ_"_blanck"_QQ_">Créer un compte google analytics</a>."
PLG_SYSTEM_GOOGLIC_ANALYTICS_ID_SUIVI_LABEL="ID de suivi &nbsp;<img src="_QQ_"../media/googlic_analytics/images/info.png"_QQ_"/>"
PLG_SYSTEM_GOOGLIC_ANALYTICS_ID_SUIVI_DESC="Votre ID de suivi Google Analytics. Se présente sous la forme : <b>UA-12345678-9</b>."
PLG_SYSTEM_GOOGLIC_ANALYTICS_FILTRES_TITRE="FILTRES DE SUIVI"
PLG_SYSTEM_GOOGLIC_ANALYTICS_FILTRES_NOTE="Sélectionnez les groupes d'utilisateurs qui ne doivent pas être suivis par les statistiques de Google Analytics."
PLG_SYSTEM_GOOGLIC_ANALYTICS_GROUPES_EXCLUS_LABEL="Groupes d'utilisateurs exclus &nbsp;<img src="_QQ_"../media/googlic_analytics/images/info.png"_QQ_"/>"
PLG_SYSTEM_GOOGLIC_ANALYTICS_GROUPES_EXCLUS_DESC="Maintenez la touche Ctrl (Windows) ou Commande (Mac) de votre clavier enfoncée tout en cliquant sur les groupes d'utilisateurs pour en sélectionner plusieurs."
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_TITRE="OPTIONS DE SUIVI (Standard)"
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_NOTE="<dl><big>OPTIONS</big><dt><br/><b>Un seul domaine (par défaut)</b> : </dt><dd>www.nomdedomaine.com</i></dd><dt><b>Un seul domaine associé à plusieurs sous-domaines</b> : </dt><dd>www.nomdedomaine.com</i></dd><dd>store.nomdedomaine.com</i></dd><dd>forum.nomdedomaine.com</i></dd><dt><b>Plusieurs extensions de domaine</b> :</dt><dd>www.nomdedomaine.com</i></dd><dd>www.nomdedomaine.fr</i></dd><dd>www.nomdedomaine.eu</i></dd></dl><br/>"
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_ATTENTION=" Attention ! N'effectuez ces réglages qu'en connaissance de cause.<br/>Si vous ne savez pas de quoi il s'agit, laissez les réglages par défaut. "
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_LABEL="Sur quoi votre suivi porte-t-il ? &nbsp;<img src="_QQ_"../media/googlic_analytics/images/info.png"_QQ_"/>"
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_DESC="<b>+</b> d'infos sur : google.com/analytics."
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_DOMAINE="Un seul domaine (par défaut)"
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_SOUSDOMAINES="Un seul domaine associé à plusieurs sous-domaines"
PLG_SYSTEM_GOOGLIC_ANALYTICS_OPTION_EXT_DOMAINES="Plusieurs extensions de domaine"
PLG_SYSTEM_GOOGLIC_ANALYTICS_DOMAINE_NOTE="Depuis la version 1.2.3, votre nom de domaine s'insère automatiquement dans le code de suivi google analytics."
;---> STYLES POUR BLOC TITRE
STYLE_BOX="color:#EEE;background-color:#333;margin:10px 0;padding:10px 8px;border-bottom:5px solid #ce0000;border-radius: 3px;"
STYLE_RED="color:#cc0000;background-color:#FFFFFF; font-weight: bold; padding:10px 8px; margin:0 45px;border:1px red dotted; text-align: center;"
STYLE_NOTE="color:#666; margin:0; padding:5px;"
language/fr-FR/fr-FR.plg_privacy_consents.sys.ini000060400000001124152453623440015731 0ustar00; @date        2018-10-24
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_PRIVACY_CONSENTS="Confidentialité - Consentement"
PLG_PRIVACY_CONSENTS_XML_DESCRIPTION="Responsable du traitement des demandes relatives à la confidentialité pour les données de consentement du noyau Joomla."
language/fr-FR/fr-FR.plg_finder_tags.ini000060400000001120152453623440014004 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8 - No BOM



PLG_FINDER_QUERY_FILTER_BRANCH_P_TAG="Tags"
PLG_FINDER_QUERY_FILTER_BRANCH_S_TAG="Tag"
PLG_FINDER_TAGS="Recherche avancée - Tags"
PLG_FINDER_TAGS_XML_DESCRIPTION="Plug-in d'indexation des tags Joomla!"
language/fr-FR/plg_system_jcepro.ini000060400000000627152453623440013505 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_SYSTEM_JCEPRO="Système - JCE Pro"
PLG_SYSTEM_JCEPRO_XML_DESCRIPTION="Plugin Système JCE Pro"
language/fr-FR/fr-FR.plg_extension_joomla.ini000060400000001061152453623440015100 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_EXTENSION_JOOMLA="Extensions - Joomla"
PLG_EXTENSION_JOOMLA_UNKNOWN_SITE="Site inconnu"
PLG_EXTENSION_JOOMLA_XML_DESCRIPTION="Système de gestion des mises à jour des extensions"language/fr-FR/fr-FR.com_ajax.ini000060400000001677152453623440012457 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8



COM_AJAX="Interface Ajax"
COM_AJAX_XML_DESCRIPTION="Interface Ajax extensible pour Joomla!"
COM_AJAX_SPECIFY_FORMAT="Merci de spécifier un format de réponse valide autre que celui du HTML, par exemple json, raw, debug, etc."
COM_AJAX_METHOD_NOT_EXISTS="La méthode %s n'existe pas"
COM_AJAX_FILE_NOT_EXISTS="Le fichier %s n'existe pas"
COM_AJAX_MODULE_NOT_ACCESSIBLE="Le module %s n'est pas publié, vous n'y avez pas accès ou il n'est pas assigné à l'élément de menu courant."
COM_AJAX_TEMPLATE_NOT_ACCESSIBLE="Le template %s n'est pas assigné au lien de menu courant."
language/fr-FR/fr-FR.plg_editors_codemirror.sys.ini000060400000001503152453623440016237 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_CODEMIRROR_XML_DESCRIPTION="Intégration d'un champ de saisie de texte standard (sans mode WYSIWYG), avec prise en charge de la coloration syntaxique du code et, si activé, de la numérotation des lignes et de l'indentation.<br /><br />Pour être utilisé, CodeMirror doit être déclaré comme 'Éditeur par défaut' dans la configuration globale de Joomla! ou attribué au profil utilisateur souhaité."
PLG_EDITORS_CODEMIRROR="Éditeur - CodeMirror"language/fr-FR/fr-FR.tpl_hathor.ini000060400000006003152453623440013026 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


HATHOR="Template d'administration Hathor"
TPL_HATHOR_ALTERNATE_MENU_DESC="Utiliser le menu alternatif qui intègre souris et clavier. JavaScript requis. (Le menu standard Hathor est accessible avec ou sans Javascript, mais conserve l'indépendance entre souris et clavier.)"
TPL_HATHOR_ALTERNATE_MENU_LABEL="Menu Alternatif"
TPL_HATHOR_BOLD_TEXT_DESC="Mettre le texte en gras"
TPL_HATHOR_BOLD_TEXT_LABEL="Texte en gras"
TPL_HATHOR_CHANGED_DEFAULT_TEMPLATE_TO_ISIS="Le style de template administrateur vient d'être changé en '%s'"
TPL_HATHOR_CHECKMARK_ALL="Tout cocher"
TPL_HATHOR_COLOUR_CHOICE_BLUE="Bleu"
TPL_HATHOR_COLOUR_CHOICE_DESC="Sélectionnez la palette de couleurs à utiliser avec le template. Vous pouvez utiliser cette option pour sélectionner un contraste élevé ou pour créer un affichage personnalisé."
TPL_HATHOR_COLOUR_CHOICE_LABEL="Sélectionner une Couleur"
TPL_HATHOR_COLOUR_CHOICE_STANDARD="Standard"
TPL_HATHOR_COLOUR_CHOICE_HIGH_CONTRAST="Contraste élevé"
TPL_HATHOR_COLOUR_CHOICE_BROWN="Brun"
TPL_HATHOR_COM_MENUS_MENU="Menu"
TPL_HATHOR_COM_MODULES_CUSTOM_POSITION_LABEL="Sélection"
TPL_HATHOR_CPANEL_LINK_TEXT="Retour au panneau d'administration"
TPL_HATHOR_GO="Appliquer"
TPL_HATHOR_LOGO_DESC="Logo personnalisé pour l'interface d'administration."
TPL_HATHOR_LOGO_LABEL="Logo"
TPL_HATHOR_MAIN_MENU="Menu principal"
TPL_HATHOR_MESSAGE_POSTINSTALL_TITLE="Information à propos du template administrateur Hathor"
TPL_HATHOR_MESSAGE_POSTINSTALL_BODY="Hathor est actuellement défini comme style de template administrateur par défaut globalement ou dans vos paramètres personnels.<br>Noter que toute nouvelle fonctionnalité pour Joomla ne sera disponible qu'avec le template Isis.<br>Nous vous recommandons d'utiliser Isis comme style de template administrateur par défaut. Vous pouvez le faire en sélectionnant le bouton ci-dessous. Cela ne changera que le paramètre par défaut du style de template administrateur, si vous y avez accès, ainsi que votre style de template par défaut personnel, si nécessaire. Cela ne change pas le template du site ou quelque autre paramètre d'utilisateur."
TPL_HATHOR_MESSAGE_POSTINSTALL_ACTION="Définir Isis comme style de template administrateur par défaut"
TPL_HATHOR_SHOW_SITE_NAME_DESC="Afficher le nom du site dans l'en-tête du template"
TPL_HATHOR_SHOW_SITE_NAME_LABEL="Afficher le nom du site"
TPL_HATHOR_SKIP_TO_MAIN_CONTENT="Aller au contenu principal"
TPL_HATHOR_SUB_MENU="Sous-Menu"
TPL_HATHOR_XML_DESCRIPTION="Le template d'administration Hathor est construit selon les normes d'accessibilité. Le fichier CSS de couleurs peut également être utilisé pour créer vos propres couleurs personnalisées."
language/fr-FR/fr-FR.plg_system_logrotation.sys.ini000060400000001057152453623440016312 0ustar00; @date        2018-09-15
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SYSTEM_LOGROTATION="Système - Rotation des fichiers journaux"
PLG_SYSTEM_LOGROTATION_XML_DESCRIPTION="Ce plugin renouvelle périodiquement les fichiers journaux du système."
language/fr-FR/fr-FR.plg_fields_radio.ini000060400000001514152453623440014152 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_RADIO="Champs - Radio"
PLG_FIELDS_RADIO_LABEL="Radio (%s)"
PLG_FIELDS_RADIO_PARAMS_OPTIONS_DESC="Les valeurs de la liste radio."
PLG_FIELDS_RADIO_PARAMS_OPTIONS_NAME_LABEL="Texte"
PLG_FIELDS_RADIO_PARAMS_OPTIONS_LABEL="Valeurs radio"
PLG_FIELDS_RADIO_PARAMS_OPTIONS_VALUE_LABEL="Valeur"
PLG_FIELDS_RADIO_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'radio' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_system_p3p.ini000060400000001602152453623440013632 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_P3P_HEADER_DESCRIPTION="Saisissez les tags P3P policy séparés par un espace.<br />Pour plus d'information, consultez les spécifications de 'Platform for Privacy Preferences', https://www.w3.org/TR/P3P/"
PLG_P3P_HEADER_LABEL="Tags P3P"
PLG_P3P_XML_DESCRIPTION="Le système P3P policy permet à Joomla! de placer une chaîne de tags dans l'en-tête HTTP.<br />Ceci est nécessaire pour que les sessions fonctionnent avec certains navigateurs comme Internet Explorer 6 et 7."
PLG_SYSTEM_P3P="Système - P3P Policy"
language/fr-FR/fr-FR.plg_finder_weblinks.sys.ini000060400000001360152453623440015507 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_FINDER_STATISTICS_WEB_LINK="Lien web"
PLG_FINDER_WEBLINKS="Indexation - Liens web"
PLG_FINDER_WEBLINKS_ERROR_ACTIVATING_PLUGIN="Impossible d'activer automatiquement le plug-in 'Indexation - Liens web'. Veuillez l'activer manuellement."
PLG_FINDER_WEBLINKS_XML_DESCRIPTION="Ce plug-in permet l'indexation des liens web du composant de Joomla dans la recherche avancée."
language/fr-FR/fr-FR.plg_finder_contacts.sys.ini000060400000001365152453623440015514 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8 - No BOM


PLG_FINDER_CONTACTS="Indexation - Contacts"
PLG_FINDER_CONTACTS_ERROR_ACTIVATING_PLUGIN="Impossible d'activer automatiquement le plug-in 'Indexation - Contacts'. Veuillez l'activer manuellement."
PLG_FINDER_CONTACTS_XML_DESCRIPTION="Ce plug-in permet l'indexation des contacts du composant de Joomla dans la recherche avancée."
PLG_FINDER_STATISTICS_CONTACT="Contact"
language/fr-FR/index.html000060400000000036152453623440011243 0ustar00<!DOCTYPE html><title></title>language/fr-FR/fr-FR.plg_fields_mediajce.ini000060400000007503152453623440014621 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_MEDIAJCE="Champs - Média JCE"
PLG_FIELDS_MEDIAJCE_XML_DESCRIPTION="JCE Plugin Champ Média"
PLG_FIELDS_MEDIAJCE_LABEL="JCE Gestionnaire de fichiers (média)"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIATYPE_LABEL="Type de média"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIATYPE_DESC="Type de média à afficher dans le gestionnaire de fichiers de JCE. Sélectionnez le type (images, médias, documents, fichiers) ou indiquez une liste d'extensions séparées par des virgules, exemple : pdf,doc,xls"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_CLASS_LABEL="Classe des médias"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_CLASS_DESC="Liste des classes à ajouter aux médias, séparées par des espaces, exemple : classe1 classe2 classe3"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_DESCRIPTION_LABEL="Description"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_DESCRIPTION_DESC="Description du média. Pour les images la description sera définie comme attribut 'alt', et pour les fichiers comme 'texte de lien'."
PLG_FIELDS_MEDIAJCE_PARAMS_EXTENDEDMEDIA_LABEL="Médias étendus"
PLG_FIELDS_MEDIAJCE_PARAMS_EXTENDEDMEDIA_DESC="Afficher des champs supplémentaires pour définir des paramètres pour chaque champ de média."
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_CAPTION_CLASS_LABEL="Classe de légende"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_CAPTION_CLASS_DESC="Liste de classes, séparées par des espaces, à ajouter à la légende du média, exemple : classe1 classe2 classe3"

PLG_FIELDS_MEDIAJCE_PARAMS_LEGACYMEDIA_LABEL="Rétrocompatibilité"
PLG_FIELDS_MEDIAJCE_PARAMS_LEGACYMEDIA_DESC="Prise en charge des anciens champs Média qui requièrent des valeurs de saisie uniques."

PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_LABEL="Cible"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_DESC="Indique où le document de destination du lien sera chargé, si le type de média n'est pas une image."
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_BLANK="Afficher dans une nouvelle fenêtre"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_SELF="Afficher dans la même fenêtre"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_PARENT="Afficher dans le cadre parent"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_TOP="Afficher dans le cadre racine"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_TARGET_DOWNLOAD="Télécharger"

PLG_FIELDS_MEDIAJCE_PARAMS_DISPLAYTYPE_LABEL="Type d'affichage"
PLG_FIELDS_MEDIAJCE_PARAMS_DISPLAYTYPE_DESC="Le type d'affichage de l'élément multimédia. Exemple : ´Incorporer´ ou ´Lien´"
PLG_FIELDS_MEDIAJCE_PARAMS_DISPLAYTYPE_EMBED="Incorporer"
PLG_FIELDS_MEDIAJCE_PARAMS_DISPLAYTYPE_LINK="Lien"

PLG_FIELDS_MEDIAJCE_BUTTON_UPLOAD="Envoyer"

PLG_FIELDS_MEDIAJCE_MEDIA_FILE_LABEL="Fichier"
PLG_FIELDS_MEDIAJCE_MEDIA_TEXT_LABEL="Description"
PLG_FIELDS_MEDIAJCE_MEDIA_TYPE_LABEL="Type"
PLG_FIELDS_MEDIAJCE_MEDIA_WIDTH_LABEL="Largeur"
PLG_FIELDS_MEDIAJCE_MEDIA_HEIGHT_LABEL="Hauteur"
PLG_FIELDS_MEDIAJCE_MEDIA_CAPTION_LABEL="Légende"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_FOLDER_LABEL="Chemin des médias"
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_FOLDER_DESC="Chemin d'accès aux fichiers multimédias à partir du répertoire de fichiers principal de JCE défini dans les paramètres du profil."
PLG_FIELDS_MEDIAJCE_PARAMS_MEDIA_FOLDER_DESC="Chemin où se trouvent les fichiers média, relatif au 1er chemin du répertoire de fichiers défini dans le profil de l'éditeur. Ajoutez le préfixe <strong>:<strong> au chemin pour établir une correspondance directe avec une entrée configurée du répertoire de fichiers, permettant ainsi l'accès à n'importe quel espace de stockage désigné. Si aucune entrée correspondante n'est trouvée, le chemin revient à un comportement relatif par défaut."
language/fr-FR/fr-FR.plg_quickicon_phpversioncheck.ini000060400000005374152453623440016776 0ustar00; @date        2016-10-27
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_QUICKICON_PHPVERSIONCHECK="Icône raccourci - Vérification de la version de PHP"
; Key 1 is the server's current PHP version, key 2 is the date at which support will end for the current PHP version
PLG_QUICKICON_PHPVERSIONCHECK_SECURITY_ONLY="Votre version de PHP, %1$s, ne reçoit en ce moment que des correctifs de sécurité du projet PHP. Cela signifie que votre version de PHP ne sera bientôt plus prise en charge. Nous vous recommandons de planifier la mise à niveau vers une nouvelle version de PHP avant d'atteindre la fin du support le %2$s. Joomla sera plus rapide et plus sûr si vous passez à une version plus récente de PHP. Merci de contacter votre hôte pour obtenir des instructions de mise à niveau."
; Key 1 is the server's current PHP version, key 2 is the recommended PHP version, and key 3 is the date at which support will end for the recommended PHP version
PLG_QUICKICON_PHPVERSIONCHECK_UNSUPPORTED="Nous avons détecté que le serveur utilise la version de PHP %1$s qui est obsolète et ne reçoit plus les mises à jour de sécurité officielles par ses développeurs. Le projet Joomla recommande la mise à niveau de votre site en PHP %2$s ou ultérieur qui recevront les mises à jour de sécurité au moins jusqu'au %3$s. Merci de demander à votre hôte d'utiliser par défaut pour votre site la version de PHP %2$s ou une version ultérieure. Si votre hôte est déjà prêt pour la version de PHP %2$s merci d'activer PHP %2$s sur la racine de votre site et les répertoires 'administrator' – vous pouvez normalement le faire vous-même à travers un outil dans votre panneau de contrôle d'hébergement, mais il est préférable de demander à votre hôte si vous n'êtes pas sûr de vous."
; Key 1 is the server's current PHP version
PLG_QUICKICON_PHPVERSIONCHECK_UNSUPPORTED_JOOMLA_OUTDATED="Nous avons détecté que votre serveur utilise PHP %1$s qui est obsolète et ne reçoit plus de mises à jour de sécurité officielles de ses développeurs. De plus, nous ne pouvons pas recommander une version PHP plus récente car vous utilisez une version obsolète de Joomla !  Nous vous recommandons de mettre à jour Joomla! puis de suivre les autres instructions de mise à niveau de PHP."
PLG_QUICKICON_PHPVERSIONCHECK_XML_DESCRIPTION="Vérifie l'état de prise en charge de la version de PHP de votre installation et génère un avertissement si la prise en charge est incomplète.  "
language/fr-FR/fr-FR.plg_jce_editor_chatgpt.sys.ini000060400000000735152453623440016170 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_JCE_EDITOR_CHATGPT="ChatGPT pour JCE"
PLG_JCE_EDITOR_CHATGPT_XML_DESC="Plugin permettant d'insérer du contenu issu de l'OpenAI ChatGPT au sein de l'éditeur JCE"language/fr-FR/fr-FR.plg_editors-xtd_module.ini000060400000001141152453623440015335 0ustar00; @date        2015-10-28
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_EDITORS-XTD_MODULE="Bouton - Module"
PLG_MODULE_BUTTON_MODULE="Module"
PLG_MODULE_XML_DESCRIPTION="Affiche un bouton permettant d'insérer un module dans un article. Une fenêtre popup s'ouvre pour pouvoir choisir le module."
language/fr-FR/fr-FR.mod_login.ini000060400000002241152453623440012631 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


MOD_LOGIN="Formulaire de connexion"
MOD_LOGIN_FIELD_USESECURE_DESC="Soumettre les données de connexion de façon cryptée en utilisant HTTPS (connexions encryptées avec le préfixe de protocole https://). Note : HTTPS doit être activé sur votre serveur pour utiliser cette option."
MOD_LOGIN_FIELD_USESECURE_LABEL="Formulaire de connexion crypté"
MOD_LOGIN_LANGUAGE="Langue"
MOD_LOGIN_LOGIN="Connexion"
MOD_LOGIN_XML_DESCRIPTION="Le module 'mod_login' affiche un formulaire de connexion permettant la saisie de l'identifiant et du mot de passe pour accéder à l'administration.<br />Le module par défaut ne devrait pas, dans les conditons normales, être dépublié. Il doit être placé en position 'login'."
MOD_LOGIN_REMIND="Identifiant perdu&nbsp;?"
MOD_LOGIN_RESET="Mot de passe perdu&nbsp;?"
language/fr-FR/fr-FR.com_login.sys.ini000060400000000746152453623440013455 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

COM_LOGIN="Connexion"
COM_LOGIN_XML_DESCRIPTION="Ce composant gère la connexion des visiteurs sur le site."language/fr-FR/fr-FR.plg_privacy_content.sys.ini000060400000001130152453623440015544 0ustar00; @date        2018-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_PRIVACY_CONTENT="Confidentialité - Contenu"
PLG_PRIVACY_CONTENT_XML_DESCRIPTION="Responsable du traitement des demandes d'informations liées à la confidentialité pour les données de base des contenus de Joomla."
language/fr-FR/fr-FR.plg_jce_filesystem-server.sys.ini000060400000001027152453623440016653 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_JCE_FILESYSTEM_SERVER="Système de fichiers Serveur pour JCE"
PLG_JCE_FILESYSTEM_SERVER_XML_DESC="Plugin système permettant d'accéder et de gérer des fichiers en dehors du dossier racine de Joomla avec l'éditeur JCE"language/fr-FR/fr-FR.plg_user_joomla.sys.ini000060400000001271152453623440014662 0ustar00; @date        2015-10-15
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_USER_JOOMLA="Utilisateur - Joomla!"
PLG_USER_JOOMLA_XML_DESCRIPTION="Prise en charge de la synchronisation par défaut des utilisateurs de Joomla! <br /><strong>Attention! Il faut impérativement avoir activé au moins un plug-in de gestion de session utilisateur ou tout accés au site sera impossible.</strong>"
language/fr-FR/fr-FR.com_associations.sys.ini000060400000000767152453623440015047 0ustar00; @date        2017-01-18
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_ASSOCIATIONS="Associations multilingues"
COM_ASSOCIATIONS_XML_DESCRIPTION="Composant de gestion de contenu multilingue"
language/fr-FR/fr-FR.plg_content_finder.sys.ini000060400000001124152453623440015341 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_CONTENT_FINDER="Contenu - Indexation de recherche"
PLG_CONTENT_FINDER_XML_DESCRIPTION="Si ce plug-in n'est pas activé, l'index ne sera pas mis à jour dans la recherche avancée lors d'un changement de contenu ."
language/fr-FR/fr-FR.plg_search_tags.ini000060400000001656152453623440014020 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8 - No BOM


PLG_SEARCH_TAGS="Recherche - Tags"
PLG_SEARCH_TAGS_FIELD_SEARCHLIMIT_DESC="Nombre de résultats à afficher"
PLG_SEARCH_TAGS_FIELD_SEARCHLIMIT_LABEL="Limite de recherche"
PLG_SEARCH_TAGS_FIELD_SHOW_TAGGED_ITEMS_DESC="Afficher ou non le contenu des éléments taggés obtenus lors de la recherche des tags"
PLG_SEARCH_TAGS_FIELD_SHOW_TAGGED_ITEMS_LABEL="Afficher les éléments taggés"
PLG_SEARCH_TAGS_ITEM_TAGGED_WITH="%s taggé avec: %s"
PLG_SEARCH_TAGS_TAGS="Tags"
PLG_SEARCH_TAGS_XML_DESCRIPTION="Intégration des tags dans la recherche sur le site"
language/fr-FR/fr-FR.plg_system_privacyconsent.ini000060400000011671152453623440016206 0ustar00; @date        2018-09-15
; @author      Joomla! Project
; @copyright   (C) 2005 - 2022 Open Source Matters, Inc. (https://www.joomla.org)
; @copyright   (C) 2005 - 2022 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SYSTEM_PRIVACYCONSENT="Système - Consentement à la politique de confidentialité"
PLG_SYSTEM_PRIVACYCONSENT_BODY="<p>L'utilisateur a consenti à stocker ses informations d'utilisateur en utilisant l'adresse IP <strong>%s</strong></p><p>La chaîne de l'agent utilisateur du navigateur de l'utilisateur était la suivante :<br/>%s</p><p>Cette information a été automatiquement enregistrée lorsque l'utilisateur a soumis ses coordonnées sur le site Web et a coché la case de confirmation.</p>"
PLG_SYSTEM_PRIVACYCONSENT_CACHETIMEOUT_DESC="Nombre de fois où la vérification est effectuée"
PLG_SYSTEM_PRIVACYCONSENT_CACHETIMEOUT_LABEL="Vérification périodique (jours)"
PLG_SYSTEM_PRIVACYCONSENT_CONSENT="L'utilisateur <a href='{accountlink}'>{username}</a> a consenti à la politique de confidentialité."
PLG_SYSTEM_PRIVACYCONSENT_CONSENTEXPIRATION_DESC="Nombre de jours après lesquels le consentement à la politique de confidentialité doit expirer."
PLG_SYSTEM_PRIVACYCONSENT_CONSENTEXPIRATION_LABEL="Expiration"
; You can use the following merge codes for the EMAIL strings:
; [SITENAME]  Site name, as set in Global Configuration.
; [URL]       URL of the site's frontend page.
; [TOKENURL]  URL of the remind page with the token prefilled.
; [FORMURL]   URL of the remind page where the user can paste their token.
; [TOKEN]     The remind token.
; \n          Newline character. Use it to start a new line in the email.
PLG_SYSTEM_PRIVACYCONSENT_EMAIL_REMIND_BODY="Votre consentement à la politique de confidentialité pour le site [URL] va expirer dans quelques jours. Vous pouvez renouveler votre consentement.\n\nPour accomplir ceci, vous pouvez effectuer l'une des tâches suivantes :\n\n1. Visiter l'URL suivante : [TOKENURL]\n\n2. Copier votre identifiant de sécurité ci-dessous, visiter l'URL référencée et coller cet identifiant dans le formulaire.\nURL: [FORMURL]\nIdentifiant de sécurité : [TOKEN]\n\nVeuillez noter que cet identifiant n'est valide que pour ce compte."
PLG_SYSTEM_PRIVACYCONSENT_EMAIL_REMIND_SUBJECT="Consentement à la politique de confidentialité pour [SITENAME]"
PLG_SYSTEM_PRIVACYCONSENT_EXPIRATION_FIELDSET_LABEL="Expiration"
PLG_SYSTEM_PRIVACYCONSENT_FIELD_ARTICLE_DESC="Sélectionner l’article dans la liste ou créer-en un nouveau."
PLG_SYSTEM_PRIVACYCONSENT_FIELD_ARTICLE_LABEL="Article confidentialité"
PLG_SYSTEM_PRIVACYCONSENT_FIELD_DESC="Lire la politique entière de confidentialité"
PLG_SYSTEM_PRIVACYCONSENT_FIELD_ENABLED_DESC="Si activé, vérifie l'expiration du consentement"
PLG_SYSTEM_PRIVACYCONSENT_FIELD_ENABLED_LABEL="Activer"
PLG_SYSTEM_PRIVACYCONSENT_FIELD_ERROR="Un accord sur la politique de confidentialité du site est requis."
PLG_SYSTEM_PRIVACYCONSENT_FIELD_LABEL="Politique de confidentialité"
PLG_SYSTEM_PRIVACYCONSENT_LABEL="Politique de confidentialité du site Web"
PLG_SYSTEM_PRIVACYCONSENT_NOTE_FIELD_DEFAULT="En vous inscrivant sur ce site Web et en acceptant la politique de confidentialité, vous acceptez que ce site Web stocke vos informations."
PLG_SYSTEM_PRIVACYCONSENT_NOTE_FIELD_DESC="Un résumé de la politique de confidentialité du site. Si laissé vide, le message par défaut sera utilisé."
PLG_SYSTEM_PRIVACYCONSENT_NOTE_FIELD_LABEL="Courte politique de confidentialité du site"
PLG_SYSTEM_PRIVACYCONSENT_NOTIFICATION_USER_PRIVACY_EXPIRED_SUBJECT="Consentement expiré à la politique de confidentialité"
PLG_SYSTEM_PRIVACYCONSENT_NOTIFICATION_USER_PRIVACY_EXPIRED_MESSAGE="Le consentement à la politique de confidentialité a expiré pour %1$s."
PLG_SYSTEM_PRIVACYCONSENT_OPTION_AGREE="J'accepte"
PLG_SYSTEM_PRIVACYCONSENT_OPTION_DO_NOT_AGREE="Je n'accepte pas"
PLG_SYSTEM_PRIVACYCONSENT_REDIRECT_MESSAGE_DEFAULT="Veuillez confirmer que vous consentez à ce que ce site Web stocke vos informations en acceptant la politique de confidentialité."
PLG_SYSTEM_PRIVACYCONSENT_REDIRECT_MESSAGE_DESC="Message personnalisé à afficher lors de la redirection. Si laissé vide, le message par défaut sera utilisé."
PLG_SYSTEM_PRIVACYCONSENT_REDIRECT_MESSAGE_LABEL="Message de redirection"
PLG_SYSTEM_PRIVACYCONSENT_REMINDBEFORE_DESC="Nombre de jours pour envoyer un rappel avant l'expiration du consentement à la politique de confidentialité."
PLG_SYSTEM_PRIVACYCONSENT_REMINDBEFORE_LABEL="Rappel"
PLG_SYSTEM_PRIVACYCONSENT_SUBJECT="Politique de confidentialité"
PLG_SYSTEM_PRIVACYCONSENT_XML_DESCRIPTION="Plugin de base pour demander le consentement de l'utilisateur à la politique de confidentialité du site. Les utilisateurs existants qui n'ont pas encore consenti seront redirigés lors de la connexion pour mettre à jour leur profil."
language/fr-FR/fr-FR.com_jce.sys.ini000060400000003035152453623440013100 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

COM_JCE="Editeur JCE"
COM_JCE_XML_DESCRIPTION="<p>L'extension JCE est un éditeur WYSIWYG pour Joomla.</p><p>JCE n'existerait pas sans ces grands projets :</p><ul><li><a href='https://www.joomla.org' target='_blank'>Joomla!</a></li><li><a href='https://tinymce.moxiecode.com' target='_blank'>TinyMCE</a></li><li><a href='https://jquery.com' target='_blank'>JQuery</a></li><li><a href='https://getuikit.com/' target='_blank'>UIKit</a></li><li>Font Icons de <a href='https://icomoon.io/' target='_blank'>IcoMoon.</a></li><li>Fugue Icons Copyright © <a href='https://p.yusukekamiyamane.com/' target='_blank'>Yusuke Kamiyamane.</a> Tous droits réservés.</li></ul><p>Vous pouvez connaître les modifications apportées à cette version en consultant ce lien&#160;: <a href='https://www.joomlacontenteditor.net/support/changelog/editor' target='_blank'>www.joomlacontenteditor.net/support/changelog/editor</a></p><p>Une réalisation de Ryan Demmer</p><p>Traductions et supports francophones&#160;: <a href='https://www.sarki.ch/jce' target='_blank'>www.sarki.ch/jce</a></p>"

COM_JCE_MENU_PROFILES="Gestion des profils"
COM_JCE_MENU_CONFIG="Configuration globale"
COM_JCE_MENU_CPANEL="Panneau de contrôle"
COM_JCE_MENU_FILEBROWSER="Gestionnaire de fichiers"

language/fr-FR/fr-FR.plg_fields_checkboxes.sys.ini000060400000001135152453623440016006 0ustar00; @date        2017-01-19
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_CHECKBOXES="Champs - Cases à cocher"
PLG_FIELDS_CHECKBOXES_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'checkboxes' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.mod_stats_admin.sys.ini000060400000001221152453623440014641 0ustar00; @date        2014-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


MOD_STATS_ADMIN="Statistiques"
MOD_STATS_LAYOUT_DEFAULT="Défaut"
MOD_STATS_XML_DESCRIPTION="Le module Statistiques permet d'afficher des informations sur le serveur ainsi que des statistiques sur les utilisateurs du site et le nombre d'articles dans votre base de données. "

language/fr-FR/fr-FR.plg_fields_user.ini000060400000001356152453623440014036 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_USER="Champs - Utilisateur"
PLG_FIELDS_USER_DEFAULT_VALUE_DESC="L'utilisateur par défaut."
PLG_FIELDS_USER_DEFAULT_VALUE_LABEL="Utilisateur par défaut"
PLG_FIELDS_USER_LABEL="Utilisateur (%s)"
PLG_FIELDS_USER_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'user' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_user_terms.sys.ini000060400000001143152453623440014531 0ustar00; @date        2018-09-02
; @author      Joomla! Project
; @copyright   (C) 2005 - 2020 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2020 Open Source Matters. All rights reserved.
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_USER_TERMS="Utilisateur - Conditions générales d'utilisation"
PLG_USER_TERMS_XML_DESCRIPTION="Plugin de base pour demander le consentement de l'utilisateur aux conditions générales d'utilisation du site."
language/fr-FR/fr-FR.com_wrapper.sys.ini000060400000001472152453623440014022 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

COM_WRAPPER="Fenêtre intégrée (IFrame)"
COM_WRAPPER_XML_DESCRIPTION="La balise iframe utilisée par ce composant permet d'intégrer une fenêtre contenant la page d'un site externe ou d'une application indépendante de Joomla (Forum, boutique, etc.)"
COM_WRAPPER_WRAPPER_VIEW_DEFAULT_DESC="Affiche une URL en fenêtre intégrée (IFrame)"
COM_WRAPPER_WRAPPER_VIEW_DEFAULT_OPTION="Défaut"
COM_WRAPPER_WRAPPER_VIEW_DEFAULT_TITLE="Contenu externe"language/fr-FR/fr-FR.plg_search_newsfeeds.ini000060400000001333152453623440015035 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_SEARCH_NEWSFEEDS="Recherche - Fils d'actualité"
PLG_SEARCH_NEWSFEEDS_FIELD_SEARCHLIMIT_DESC="Nombre de résultats à afficher"
PLG_SEARCH_NEWSFEEDS_FIELD_SEARCHLIMIT_LABEL="Limite de recherche"
PLG_SEARCH_NEWSFEEDS_NEWSFEEDS="Fils d'actualité"
PLG_SEARCH_NEWSFEEDS_XML_DESCRIPTION="Intégration des fils d'actualité dans la recherche sur le site"language/fr-FR/fr-FR.plg_system_actionlogs.ini000060400000005330152453623440015274 0ustar00; @date        2018-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SYSTEM_ACTIONLOGS="Système - Journal des actions utilisateur"
PLG_SYSTEM_ACTIONLOGS_EXTENSIONS_NOTIFICATIONS="Sélectionner les événements à notifier"
PLG_SYSTEM_ACTIONLOGS_EXTENSIONS_NOTIFICATIONS_DESC="Sélectionner les événements à vous envoyer par e-mail en tant que notifications"
PLG_SYSTEM_ACTIONLOGS_INFO_DESC="Le plugin Journal des actions - Joomla est désactivé "
PLG_SYSTEM_ACTIONLOGS_INFO_LABEL="Information"
PLG_SYSTEM_ACTIONLOGS_JOOMLA_ACTIONLOG_DISABLED="Journal des actions - Joomla "
PLG_SYSTEM_ACTIONLOGS_JOOMLA_ACTIONLOG_DISABLED_REDIRECT="le plugin %s est désactivé."
PLG_SYSTEM_ACTIONLOGS_LOG_DELETE_PERIOD="Nombre de jours après lequel supprimer les journaux"
PLG_SYSTEM_ACTIONLOGS_LOG_DELETE_PERIOD_DESC="Entrez le nombre de jours après lequel supprimer les journaux. Entrez 0 si vous ne souhaitez pas supprimer les journaux."
PLG_SYSTEM_ACTIONLOGS_NOTIFICATIONS="Envoyer des notifications pour le journal des actions utilisateur"
PLG_SYSTEM_ACTIONLOGS_NOTIFICATIONS_DESC="Envoyer une notification du journal des actions des utilisateurs à votre e-mail"
PLG_SYSTEM_ACTIONLOGS_OPTIONS="Paramètres du journal des actions utilisateur"
PLG_SYSTEM_ACTIONLOGS_XML_DESCRIPTION="Enregistre les actions des utilisateurs sur le site afin de pouvoir les vérifier si nécessaire."
; Common content type log messages
PLG_SYSTEM_ACTIONLOGS_CONTENT_ADDED="L'utilisateur <a href=\"{accountlink}\">{username}</a> a ajouté : {type}, <a href=\"{itemlink}\">{title}</a>"
PLG_SYSTEM_ACTIONLOGS_CONTENT_ARCHIVED="L'utilisateur <a href=\"{accountlink}\">{username}</a> a archivé : {type}, <a href=\"{itemlink}\">{title}</a>"
PLG_SYSTEM_ACTIONLOGS_CONTENT_UPDATED="L'utilisateur <a href=\"{accountlink}\">{username}</a> a mis à jour : {type}, <a href=\"{itemlink}\">{title}</a>"
PLG_SYSTEM_ACTIONLOGS_CONTENT_PUBLISHED="L'utilisateur <a href=\"{accountlink}\">{username}</a> a publié : {type}, <a href=\"{itemlink}\">{title}</a>"
PLG_SYSTEM_ACTIONLOGS_CONTENT_UNPUBLISHED="L'utilisateur <a href=\"{accountlink}\">{username}</a> a dépublié : {type}, <a href=\"{itemlink}\">{title}</a>"
PLG_SYSTEM_ACTIONLOGS_CONTENT_TRASHED="L'utilisateur <a href=\"{accountlink}\">{username}</a> a mis à la corbeille : {type}, <a href=\"{itemlink}\">{title}</a>"
PLG_SYSTEM_ACTIONLOGS_CONTENT_DELETED="L'utilisateur <a href=\"{accountlink}\">{username}</a> a supprimé : {type}, {title}"
language/fr-FR/fr-FR.plg_authentication_joomla.sys.ini000060400000001170152453623440016721 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_AUTH_JOOMLA_XML_DESCRIPTION="Système d'authentification par défaut de Joomla!<br />Attention, vous devez laisser activé au moins un plug-in d'authentification pour vous connecter sur le site !"
PLG_AUTHENTICATION_JOOMLA="Authentification - Joomla"language/fr-FR/fr-FR.plg_extension_jce.sys.ini000060400000000621152453623440015176 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_EXTENSION_JCE="Extension - JCE"
PLG_EXTENSION_JCE_XML_DESCRIPTION="Plugin Extension JCE"
language/fr-FR/fr-FR.mod_latest.ini000060400000011732152453623440013022 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


MOD_LATEST="Derniers articles"
MOD_LATEST_CREATED="Créé"
MOD_LATEST_CREATED_BY="Créé par"
MOD_LATEST_FIELD_AUTHORS_DESC="Filtrer l'affichage des titres par auteur."
MOD_LATEST_FIELD_AUTHORS_LABEL="Auteurs"
MOD_LATEST_FIELD_CATEGORY_DESC="Sélectionner la ou les catégories desquelles afficher les titres des articles."
MOD_LATEST_FIELD_COUNT_DESC="Nombre de titres d'articles à afficher (5 par défaut)"
MOD_LATEST_FIELD_COUNT_LABEL="Nombre"
MOD_LATEST_FIELD_ORDERING_DESC="Options de tri"
MOD_LATEST_FIELD_ORDERING_LABEL="Ordre"
MOD_LATEST_FIELD_VALUE_AUTHORS_ANYONE="Tout le monde"
MOD_LATEST_FIELD_VALUE_AUTHORS_BY_ME="Ajoutés ou modifiés par moi-même"
MOD_LATEST_FIELD_VALUE_AUTHORS_NOT_BY_ME="Ni ajoutés ni modifiés par moi-même"
MOD_LATEST_FIELD_VALUE_ORDERING_ADDED="Placer les nouveaux articles en début de liste"
MOD_LATEST_FIELD_VALUE_ORDERING_MODIFIED="Placer les articles mis à jour en début de liste"
MOD_LATEST_LATEST_ITEMS="Derniers articles"
MOD_LATEST_NO_MATCHING_RESULTS="Aucun résultat"
MOD_LATEST_TITLE="Articles récemment créés"
MOD_LATEST_TITLE_CREATED="Derniers articles ajoutés"
MOD_LATEST_TITLE_CREATED_1="Dernier article ajouté"
MOD_LATEST_TITLE_CREATED_MORE="Les %1$s derniers articles ajoutés"
MOD_LATEST_TITLE_CREATED_NOT_ME="Les derniers articles ajoutés par un autre auteur que moi"
MOD_LATEST_TITLE_CREATED_NOT_ME_1="Le dernier article ajouté par un autre auteur que moi"
MOD_LATEST_TITLE_CREATED_NOT_ME_MORE="Les %1$s derniers articles ajoutés par un autre auteur que moi"
MOD_LATEST_TITLE_CREATED_BY_ME="Les derniers articles ajoutés par moi"
MOD_LATEST_TITLE_CREATED_BY_ME_1="Le dernier article ajouté par moi"
MOD_LATEST_TITLE_CREATED_BY_ME_MORE="Les %1$s derniers articles ajoutés par moi"
MOD_LATEST_TITLE_CREATED_CATEGORY="Les derniers articles ajoutés (catégorie %2$s)"
MOD_LATEST_TITLE_CREATED_CATEGORY_1="Le dernier article ajouté (catégorie %2$s)"
MOD_LATEST_TITLE_CREATED_CATEGORY_MORE="Les %1$s derniers articles ajoutés (catégorie %2$s)"
MOD_LATEST_TITLE_CREATED_CATEGORY_BY_ME="Les derniers articles ajoutés par moi (catégorie %2$s)"
MOD_LATEST_TITLE_CREATED_CATEGORY_BY_ME_1="Le dernier article ajouté par moi (catégorie %2$s)"
MOD_LATEST_TITLE_CREATED_CATEGORY_BY_ME_MORE="Les %1$s derniers articles ajoutés par moi (catégorie %2$s)"
MOD_LATEST_TITLE_CREATED_CATEGORY_NOT_ME="Les derniers articles ajoutés par un autre auteur que moi (catégorie %2$s)"
MOD_LATEST_TITLE_CREATED_CATEGORY_NOT_ME_1="Le dernier article ajouté par un autre auteur que moi (catégorie %2$s)"
MOD_LATEST_TITLE_CREATED_CATEGORY_NOT_ME_MORE="Les %1$s derniers articles ajoutés par un autre auteur que moi (catégorie %2$s)"
MOD_LATEST_TITLE_MODIFIED="Les derniers articles modifiés"
MOD_LATEST_TITLE_MODIFIED_1="Le dernier article modifié"
MOD_LATEST_TITLE_MODIFIED_MORE="Les %1$s derniers articles modifiés"
MOD_LATEST_TITLE_MODIFIED_BY_ME="Les derniers articles modifiés par moi"
MOD_LATEST_TITLE_MODIFIED_BY_ME_1="Le dernier article modifié par moi"
MOD_LATEST_TITLE_MODIFIED_BY_ME_MORE="Les %1$s derniers articles modifiés par moi"
MOD_LATEST_TITLE_MODIFIED_NOT_ME="Les derniers articles modifiés par un autre auteur que moi"
MOD_LATEST_TITLE_MODIFIED_NOT_ME_1="Le dernier article modifié par un autre auteur que moi"
MOD_LATEST_TITLE_MODIFIED_NOT_ME_MORE="Les %1$s derniers articles modifiés par un autre auteur que moi"
MOD_LATEST_TITLE_MODIFIED_CATEGORY="Les derniers articles modifiés (catégorie %2$s)"
MOD_LATEST_TITLE_MODIFIED_CATEGORY_1="Le dernier article modifié (catégorie %2$s)"
MOD_LATEST_TITLE_MODIFIED_CATEGORY_MORE="Les %1$s derniers articles modifiés (catégorie %2$s)"
MOD_LATEST_TITLE_MODIFIED_CATEGORY_BY_ME="Les derniers articles modifiés par moi (catégorie %2$s)"
MOD_LATEST_TITLE_MODIFIED_CATEGORY_BY_ME_1="Le dernier article modifié par moi (catégorie %2$s)"
MOD_LATEST_TITLE_MODIFIED_CATEGORY_BY_ME_MORE="Les %1$s derniers articles modifiés par moi (catégorie %2$s)"
MOD_LATEST_TITLE_MODIFIED_CATEGORY_NOT_ME="Les derniers articles modifiés par un autre auteur que moi (catégorie %2$s)"
MOD_LATEST_TITLE_MODIFIED_CATEGORY_NOT_ME_1="Le dernier article modifié par un autre auteur que moi (catégorie %2$s)"
MOD_LATEST_TITLE_MODIFIED_CATEGORY_NOT_ME_MORE="Les %1$s derniers articles modifiés par un autre auteur que moi (catégorie %2$s)"
MOD_LATEST_UNEXISTING="<i>Inexistant</i>"
MOD_LATEST_XML_DESCRIPTION="Le module 'mod_latest' affiche les titres des derniers articles créés . Ceux dont la date de publication a expiré sont également pris en compte lorsque l'utilisateur y a accès.<br />Ce module doit être placé en position 'cpanel' avec le template par défaut de Joomla."
language/fr-FR/fr-FR.plg_quickicon_jce.sys.ini000060400000000723152453623440015152 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_QUICKICON_JCE="Icône Raccourci - JCE Gestionnaire de fichiers"
PLG_QUICKICON_JCE_XML_DESCRIPTION="Icône de raccourci du gestionnaire de fichiers de JCE"
language/fr-FR/fr-FR.plg_system_languagecode.sys.ini000060400000001372152453623440016367 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_SYSTEM_LANGUAGECODE="Système - Code langue"
PLG_SYSTEM_LANGUAGECODE_XML_DESCRIPTION="Ce plug-in permet de changer le code de langue dans le document HTML généré pour cibler son référencement.<br />Note: les champs apparaissent lorsque le plug-in est activé puis enregistré.<br />Plus d'information sur <a href=$quot;http://www.w3.org/TR/xhtml1/#docconf$quot;>W3.org</a>"

language/fr-FR/fr-FR.plg_editors_tinymce.sys.ini000060400000001270152453623440015543 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_EDITORS_TINYMCE="Éditeur - TinyMCE"
PLG_TINY_XML_DESCRIPTION="Intégration de l'éditeur WYSIWYG TinyMCE, fonctionnant avec Javascript.<br /><br />Pour être utilisé, TinyMCE doit être déclaré comme 'Éditeur par défaut' dans la configuration globale de Joomla! ou attribué au profil utilisateur souhaité."language/fr-FR/fr-FR.plg_content_jce.sys.ini000060400000000614152453623440014636 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_CONTENT_JCE="Contenu - JCE"
PLG_CONTENT_JCE_XML_DESCRIPTION="Plugin de contenu JCE"
language/fr-FR/fr-FR.plg_installer_jce.ini000060400000004013152453623440014341 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_INSTALLER_JCE="Installateur - JCE"
PLG_INSTALLER_JCE_XML_DESCRIPTION="Plugin Installateur JCE"
PLG_INSTALLER_JCE_KEY_WARNING="<strong>Mise à jour de JCE :</strong> vous devez indiquer votre clé d´abonnement pour mettre à jour JCE Pro ou les plugins JCE. Pour en savoir plus, veuillez consulter : <a href='https://www.joomlacontenteditor.net/support/faq/subscription/using-the-subscription-key' target='_blank'>'<strong>Utiliser une clé d´abonnement</strong>'<a>"
PLG_INSTALLER_JCE_KEY_INVALID="<strong>Mise à jour de JCE :</strong> la clé d'abonnement indiquée dans les paramètres de JCE est arrivée à expiration ou n´est pas valide. Veuillez renouveler l´abonnement ou indiquer une clé valide pour mettre à jour JCE Pro. Cliquez sur <a href='https://www.joomlacontenteditor.net/component/subscriptions/purchase' target='_blank'><strong>ce lien pour renouveler ou souscrire à un abonnement.</strong></a><br />Pour en savoir plus sur les clés d'abonnement, veuillez consulter : <a href='https://www.joomlacontenteditor.net/support/faq/subscription/using-the-subscription-key' target='_blank'>'<strong>Utiliser une clé d´abonnement</strong>'</a>"
PLG_INSTALLER_JCE_KEY_LIMIT="<strong>Mise à jour de JCE : </strong>Vous avez atteint la limite de mise à jour pour cette clé d'abonnement. Veuillez passer au niveau d'abonnement suivant - <a href='https://www.joomlacontenteditor.net/component/subscriptions/purchase' target='_blank'><strong>Acheter ou renouveler un abonnement JCE</strong></a><br />Pour plus d'informations sur la clé d'abonnement, voir - <a href='https://www.joomlacontenteditor.net/support/faq/subscription/using-the-subscription-key' target='_blank'><strong>Utilisation de la clé d'abonnement</strong></a>"
language/fr-FR/fr-FR.com_joomlaupdate.ini000060400000052310152453623440014206 0ustar00; @date        2021-08-24
; @author      Joomla! Project
; @copyright   (C) 2005 - 2022 Open Source Matters, Inc. (https://www.joomla.org)
; @copyright   (C) 2005 - 2022 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_JOOMLAUPDATE_CHECKED_UPDATES="Recherche de mises à jour terminée."
COM_JOOMLAUPDATE_CONFIGURATION="Mises à jour Joomla! : Paramètres"
COM_JOOMLAUPDATE_CONFIG_CUSTOMURL_DESC="URL du fichier XML spécifique de la source de mise à jour. Cette URL ne sera utilisée que si l'option 'Source de la mise à jour' est paramétrée sur 'URL spécifique'."
COM_JOOMLAUPDATE_CONFIG_CUSTOMURL_LABEL="URL spécifique"
COM_JOOMLAUPDATE_CONFIG_SOURCES_DESC="Configurer la source des informations de mise à jour"
COM_JOOMLAUPDATE_CONFIG_SOURCES_LABEL="Source de la mise à jour"
COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_CUSTOM="URL spécifique"
COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_CUSTOM_ERROR="Le champ URL spécifique est vide."
COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_DEFAULT="Défaut"
COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_DESC="Le canal de mise à jour que Joomla! va utiliser pour vérifier la disponibilité d'une éventuelle mise à jour"
COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_LABEL="Canal de mise à jour"
COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_NEXT="Le prochain Joomla!"
COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_TESTING="Test"
COM_JOOMLAUPDATE_FAILED_TO_CHECK_UPDATES="Échec de la recherche de mises à jour."
COM_JOOMLAUPDATE_MINIMUM_STABILITY_ALPHA="Alpha"
COM_JOOMLAUPDATE_MINIMUM_STABILITY_BETA="Beta"
COM_JOOMLAUPDATE_MINIMUM_STABILITY_DESC="La stabilité minimale des mises à jour d'extensions que vous souhaitez voir. Le développement est le moins stable, Stable est la qualité de la production. Si une extension ne spécifie pas un niveau, elle est supposée être stable."
COM_JOOMLAUPDATE_MINIMUM_STABILITY_DEV="Développement"
COM_JOOMLAUPDATE_MINIMUM_STABILITY_LABEL="Stabilité minimale"
COM_JOOMLAUPDATE_MINIMUM_STABILITY_RC="Candidat à la version finale"
COM_JOOMLAUPDATE_MINIMUM_STABILITY_STABLE="Stable"
COM_JOOMLAUPDATE_OVERVIEW="Mise à jour de Joomla!"
COM_JOOMLAUPDATE_TOOLBAR_CHECK="Rechercher des mises à jour."
COM_JOOMLAUPDATE_PREUPDATE_HEADING_CHECKED="Vérifié"
COM_JOOMLAUPDATE_PREUPDATE_HEADING_REQUIREMENT="Pré-requis"
COM_JOOMLAUPDATE_PREUPDATE_UNKNOWN_EXTENSION_MANIFESTCACHE_VERSION="Version inconnue"
COM_JOOMLAUPDATE_PREUPDATE_CHECK_EXTENSION_AUTHOR_URL="URL de l'auteur de l'extension"
COM_JOOMLAUPDATE_PREUPDATE_CHECK_NOT_COMPLETE="Les vérifications préalables à la mise à jour n'ont pas encore été effectuées - veuillez patienter."
COM_JOOMLAUPDATE_PREUPDATE_CHECK_COMPLETED_YOU_HAVE_DANGEROUS_PLUGINS="Il existe des plugins installés et activés qui peuvent empêcher la mise à jour de Joomla et même rendre le site inaccessible.<br><br>Avant d'appliquer la mise à jour de Joomla il vous est fortement conseillé de mettre à jour ces plugins, ou de les désactiver, ou encore de les désinstaller."
COM_JOOMLAUPDATE_UPDATE_LOG_CLEANUP="Mise en ordre après installation."
COM_JOOMLAUPDATE_UPDATE_LOG_COMPLETE="La mise à jour vers la version %s est achevée."
; The following two strings are deprecated and will be removed with 4.0
COM_JOOMLAUPDATE_UPDATE_LOG_CONFIRM_FINALISE="Succès de la confirmation de l'étape de finalisation."
COM_JOOMLAUPDATE_UPDATE_LOG_CONFIRM_FINALISE_FAIL="La confirmation de l'étape de finalisation a échoué"
COM_JOOMLAUPDATE_UPDATE_LOG_DELETE_FILES="Effacement des fichiers et dossiers à supprimer."
COM_JOOMLAUPDATE_UPDATE_LOG_FILE="Fichier %s téléchargé."
COM_JOOMLAUPDATE_UPDATE_LOG_FINALISE="Conclusion de l'installation."
COM_JOOMLAUPDATE_UPDATE_LOG_INSTALL="Lancement de l'installation de la nouvelle version."
COM_JOOMLAUPDATE_UPDATE_LOG_START="Mise à jour lancée par l'utilisateur %2$s (%1$s). L'ancienne version est %3$s."
COM_JOOMLAUPDATE_UPDATE_LOG_URL="Téléchargement du fichier de mise à jour depuis %s."
COM_JOOMLAUPDATE_VIEW_COMPLETE_HEADING="Statut de mise à jour de version Joomla"
COM_JOOMLAUPDATE_VIEW_COMPLETE_MESSAGE="Votre site a été mis à jour. La version de Joomla est actuellement %s."
COM_JOOMLAUPDATE_VIEW_DEFAULT_ACTUAL="Actuel"
COM_JOOMLAUPDATE_VIEW_DEFAULT_COMPATIBILITY_CHECK="Vérification de compatibilité avec Joomla! %s"
COM_JOOMLAUPDATE_VIEW_DEFAULT_COMPATIBLE_UPDATE_WARNING="Les extensions notées <span class='label label-warning'>X.X.X</span> sont indiquées comme compatibles avec la version actuelle de Joomla mais indiquées comme incompatibles avec la mise à jour disponible pour Joomla. Vous devez contacter le développeur de l'extension pour plus d'informations."
COM_JOOMLAUPDATE_VIEW_DEFAULT_DATABASE_STRUCTURE_NOTICE="Allez dans 'Système - Maintenance - Base de données' et utilisez le bouton 'Mise à jour de la structure'."
COM_JOOMLAUPDATE_VIEW_DEFAULT_DATABASE_STRUCTURE_TITLE="Structure des tables de la base de données à jour"
COM_JOOMLAUPDATE_VIEW_DEFAULT_DESCRIPTION_BREAK="Les extensions indiquées d'un <span class='label label-important'>'Non'</span> ou de la mention <span class='label'>'Compatibilité manquante'</span> peuvent créer des dommages à la stabilité du site et même le rendre inaccessible. Avant d'effectuer la mise à jour, veuillez consulter les développeurs concernés pour vérifier les conséquences possibles."
COM_JOOMLAUPDATE_VIEW_DEFAULT_DESCRIPTION_MISSING_TAG="Les extensions indiquées de la mention <span class='label'>'Compatibilité manquante'</span> ne possède pas <a href='https://docs.joomla.org/Special:MyLanguage/Deploying_an_Update_Server' target='_blank' rel='noopener noreferrer'>d'indication de compatibilité.</a>"
COM_JOOMLAUPDATE_VIEW_DEFAULT_DESCRIPTION_UPDATE_REQUIRED="Les extensions indiquées d'un <span class='label label-warning'>'Oui' (X.X.X)</span> peuvent nécessiter une mise à jour."
COM_JOOMLAUPDATE_VIEW_DEFAULT_DIRECTIVE="Directive"
COM_JOOMLAUPDATE_VIEW_DEFAULT_DOWNLOAD_IN_PROGRESS="Téléchargement des fichiers de mise à jour, veuillez patienter..."
COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_DIRECTORY="Racine FTP"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXPLANATION_AND_LINK_TO_DOCS="La vérification des prérequis de mise à jour vous fournit des informations sur l'état de compatibilité de votre serveur et des extensions installées avec la mise à jour disponible pour Joomla.<br>Vous pouvez trouver plus d'informations sur cette page et comment préparer la mise à jour de Joomla dans la <a class='pre-update-docs' href='https://docs.joomla.org/Pre-Update_Check' target='_blank' rel='noopener noreferrer'>documentation sur la vérification des prérequis de mise à jour</a>."
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_RUNNING_PRE_UPDATE_CHECKS="Vérification des prérequis de mise à jour en cours..."
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_RUNNING_PRE_UPDATE_CHECKS_NOTES="Veuillez patienter durant la vérification de compatibilité des extensions."
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_PRE_UPDATE_CHECKS_FAILED="Les vérifications préalables à la mise à jour ont échoué"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_PRE_UPDATE_CHECKS_FAILED_NOTES="Il n'a pas été possible de vérifier la compatibilité de ces plug-ins. La requête au serveur de mise à jour a expiré ou a renvoyé une erreur."
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_PROBABLY_COMPATIBLE="Aucune mise à jour requise"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_PROBABLY_COMPATIBLE_NOTES="<p>Le développeur de l'extension indique que la version actuellement installée est compatible.</p><p id=\"updateyellowwarning\" class=\"hidden\">Veuillez noter qu'une version soulignée ainsi <span class='label label-warning'>X.X.X</span> indique que le développeur propose une version plus récente de l'extension pour la version utilisée de Joomla mais pas forcément pour celle proposée en mise à jour. Veuillez vérifier auprès du développeur que son extension est bien compatible avant de mettre à jour Joomla.</p>"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_REQUIRING_UPDATES_TO_BE_COMPATIBLE="Mise à jour requise"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_REQUIRING_UPDATES_TO_BE_COMPATIBLE_NOTES="<p>Veuillez mettre à jour ces extensions avant de mettre à jour Joomla.</p><p id=\"updateorangewarning\" class=\"hidden\">Soyez particulièrement vigilant si l'extension est répertoriée comme incompatible avec cette dernière version de Joomla!</p>"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_UPDATE_SERVER_OFFERS_NO_COMPATIBLE_VERSION="Information de mise à jour indisponible"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_UPDATE_SERVER_OFFERS_NO_COMPATIBLE_VERSION_NOTES="L'extension ne propose pas de version compatible pour la version sélectionnée de Joomla. Cela peut signifier que l'extension n'utilise pas le système de mise à jour de Joomla ou que le développeur n'a pas encore fourni d'informations de compatibilité pour cette version de Joomla."
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_SHOW_LESS_COMPATIBILITY_INFORMATION="[ Moins de détail %s ]"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_SHOW_MORE_COMPATIBILITY_INFORMATION="[ Plus de détails %s ]"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_COMPATIBLE="Compatible"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_COMPATIBLE_WITH_JOOMLA_VERSION="Version compatible Joomla %s"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_INSTALLED_VERSION="Version installée"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_NAME="Nom de l'extension"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_TYPE="Type d'extension"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_NO_COMPATIBILITY_INFORMATION="Aucune information de compatibilité"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_WARNING_UNKNOWN="Erreur inconnue"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_SERVER_ERROR="Erreur du serveur de mise à jour"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS="Vérification de pré-mise à jour des extensions tierces"
COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_NONE="Aucune extension n'est installée."
COM_JOOMLAUPDATE_VIEW_DEFAULT_NON_CORE_BACKEND_TEMPLATE_USED_NOTICE="Nous avons détecté que vous n'utilisez pas un template d'administration par défaut. Vous pourriez trouver le processus de mise à niveau plus fluide si vous <a href='index.php?option=com_templates&view=styles&client_id=1'>utilisez</a> le template Isis."
COM_JOOMLAUPDATE_VIEW_DEFAULT_NON_CORE_PLUGIN_BEING_CHECKED="Le système analyse actuellement ces plug-ins pour vérifier leur compatibilité avec la mise à jour de Joomla.<br><br>Veuillez patienter jusqu'au terme de ces vérifications."
COM_JOOMLAUPDATE_VIEW_DEFAULT_NON_CORE_PLUGIN_CONFIRMATION="J'accepte les avertissements concernant les extensions potentiellement incompatibles et je souhaite procéder à la mise à jour."
COM_JOOMLAUPDATE_VIEW_DEFAULT_POTENTIALLY_DANGEROUS_PLUGIN="Problème potentiel de mise à jour"
COM_JOOMLAUPDATE_VIEW_DEFAULT_POTENTIALLY_DANGEROUS_PLUGIN_CONFIRM_MESSAGE="Êtes-vous sûr de vouloir ignorer les avertissements concernant les plug-ins potentiellement incompatibles et procéder à la mise à jour ?"
COM_JOOMLAUPDATE_VIEW_DEFAULT_POTENTIALLY_DANGEROUS_PLUGIN_DESC="Cette extension comprend au moins un plug-in qui pourrait faire échouer la mise à jour de Joomla.<br><br>Pour effectuer la mise à jour de Joomla en toute sécurité vous devez soit mettre à niveau cette extension avec une version compatible, soit désactiver le ou les plug-ins concernés et effectuer une nouvelle vérification.<br><br>Veuillez consulter l'onglet 'Mise à jour en ligne' pour plus d'informations sur les plug-ins concernés."
COM_JOOMLAUPDATE_VIEW_DEFAULT_POTENTIALLY_DANGEROUS_PLUGIN_LIST="Les plug-ins suivants peuvent causer des problèmes durant la mise à jour"
COM_JOOMLAUPDATE_VIEW_DEFAULT_HELP="Plus d'informations"
COM_JOOMLAUPDATE_VIEW_DEFAULT_DB_NOT_SUPPORTED="Votre type de base de données n'est pas pris en charge"
COM_JOOMLAUPDATE_VIEW_DEFAULT_DB_NOT_SUPPORTED_DESC="Une mise à jour pour Joomla %1$s a été détectée, mais votre type de base de données actuel n'est pas pris en charge par la nouvelle version.<br>Pour plus de détails, veuillez vérifier les <a href=\"https://downloads.joomla.org/technical-requirements\">exigences minimales requises pour Joomla %1$s</a>."
COM_JOOMLAUPDATE_VIEW_DEFAULT_PHP_VERSION_NOT_SUPPORTED="Votre version de PHP n'est pas prise en charge"
COM_JOOMLAUPDATE_VIEW_DEFAULT_PHP_VERSION_NOT_SUPPORTED_DESC="Une mise à jour de Joomla %1$s a été détectée mais la version PHP du serveur ne répond pas aux <a href=\"https://downloads.joomla.org/technical-requirements\">exigences minimales pour cette version de Joomla %1$s</a>."
COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_NOTICE="Attention"
COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_NOTICE_MESSAGE="La méthode FTP n'est pas prise en charge lorsque vous effectuez une mise à niveau vers Joomla 4.0.0 ou une version ultérieure."
COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_HOSTNAME="Hôte FTP"
COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_PASSWORD="Mot de passe FTP"
COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_PORT="Port FTP"
COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_USERNAME="Identifiant FTP"
COM_JOOMLAUPDATE_VIEW_DEFAULT_INFOURL="Information supplémentaire"
COM_JOOMLAUPDATE_VIEW_DEFAULT_INSTALLAGAIN="Réinstaller les fichiers du noyau de Joomla"
COM_JOOMLAUPDATE_VIEW_DEFAULT_INSTALLED="Version de Joomla installée"
COM_JOOMLAUPDATE_VIEW_DEFAULT_INSTALLUPDATE="Mettre à jour"
COM_JOOMLAUPDATE_VIEW_DEFAULT_INSTALL_SELF_UPDATE_FIRST="Il faut d'abord mettre à jour le composant de Mise à jour de Joomla avant de pouvoir mettre à jour Joomla!"
COM_JOOMLAUPDATE_VIEW_DEFAULT_LATEST="Dernière version de Joomla"
COM_JOOMLAUPDATE_VIEW_DEFAULT_METHOD="Méthode d'installation"
COM_JOOMLAUPDATE_VIEW_DEFAULT_METHOD_DIRECT="Transfert direct"
COM_JOOMLAUPDATE_VIEW_DEFAULT_METHOD_FTP="Transfert par FTP"
COM_JOOMLAUPDATE_VIEW_DEFAULT_METHOD_HYBRID="Hybride (n'utilise FTP que si nécessaire)"
COM_JOOMLAUPDATE_VIEW_DEFAULT_NOUPDATES="Aucune mise à jour disponible"
COM_JOOMLAUPDATE_VIEW_DEFAULT_NOUPDATESNOTICE="Vous utilisez déjà la dernière version de Joomla, %s."
COM_JOOMLAUPDATE_VIEW_DEFAULT_NO_DOWNLOAD_URL="Mise à jour non disponible."
COM_JOOMLAUPDATE_VIEW_DEFAULT_NO_DOWNLOAD_URL_DESC="Une mise à jour vers Joomla %1$s a été trouvée mais il n'a pas été possible de télécharger cette mise à jour. Trois possibilités&nbsp;:<br >- Votre hôte ne supporte pas <a href=\"https://downloads.joomla.org/technical-requirements\">les exigences minimales pour Joomla %1$s</a> et il n'y a pas de téléchargement alternatif disponible pour votre configuration.<br >-La mise à jour de Joomla %1$s n'est pas disponible pour votre niveau de stabilité.<br>- Il y a un problème avec le serveur de mise à jour de Joomla.<br ><br > Merci de tenter de télécharger le paquet de mise à jour depuis <a href=\"https://downloads.joomla.org/latest\">la page officielle de téléchargement de Joomla</a> et utiliser l'onglet 'Transférer et mettre à jour'."
COM_JOOMLAUPDATE_VIEW_DEFAULT_NO_LIVE_UPDATE="Une nouvelle version du composant de mise à jour Joomla est disponible."
COM_JOOMLAUPDATE_VIEW_DEFAULT_NO_LIVE_UPDATE_DESC="Il vous faut le mettre à jour avant de mettre à jour Joomla! <a class=\"alert-link\" href=\"index.php?option=com_installer&view=update\">Cliquer ici pour mettre à jour le composant</a>."
COM_JOOMLAUPDATE_VIEW_DEFAULT_PACKAGE="URL du paquet de mise à jour"
COM_JOOMLAUPDATE_VIEW_DEFAULT_PACKAGE_REINSTALL="Réinstaller l'URL du paquet"
COM_JOOMLAUPDATE_VIEW_DEFAULT_PREUPDATE_CHECK="Vérification avant mise à jour de Joomla %s"
COM_JOOMLAUPDATE_VIEW_DEFAULT_RECOMMENDED="Recommandé"
COM_JOOMLAUPDATE_VIEW_DEFAULT_RECOMMENDED_SETTINGS_PASSED="Paramètres PHP recommandés : Valide"
COM_JOOMLAUPDATE_VIEW_DEFAULT_RECOMMENDED_SETTINGS_WARNING="Paramètres PHP recommandés : Avertissement"
COM_JOOMLAUPDATE_VIEW_DEFAULT_RECOMMENDED_SETTINGS_DESC="Ces paramètres PHP sont recommandés pour une compatibilité optimale avec Joomla. S'ils ne sont pas tous en vert, Joomla pourra tout de même fonctionner mais des extensions risquent de ne pas être utilisables."
COM_JOOMLAUPDATE_VIEW_DEFAULT_REQUIRED_SETTINGS_PASSED="Configuration PHP & Base de données requis : Valide"
COM_JOOMLAUPDATE_VIEW_DEFAULT_REQUIRED_SETTINGS_WARNING="Configuration PHP & Base de données requis : Avertissement"
COM_JOOMLAUPDATE_VIEW_DEFAULT_TAB_ONLINE="Mise à jour en direct"
COM_JOOMLAUPDATE_VIEW_DEFAULT_TAB_PRE_UPDATE_CHECK="Vérification avant mise à jour"
COM_JOOMLAUPDATE_VIEW_DEFAULT_TAB_UPLOAD="Transférer et mettre à jour"
COM_JOOMLAUPDATE_VIEW_DEFAULT_UPDATEFOUND="Une mise à jour de Joomla a été trouvée"
COM_JOOMLAUPDATE_VIEW_DEFAULT_UPDATES_INFO_CUSTOM="Le canal de mise à jour est &quot;%s&quot;  - Ce n'est pas un canal officiel de mise à jour de Joomla"
COM_JOOMLAUPDATE_VIEW_DEFAULT_UPDATES_INFO_DEFAULT="Le canal de mise à jour est &quot;%s&quot; - Au travers de ce canal vous recevrez les notifications à propos de toutes les mises à jour de la version de Joomla courante (3.x)."
COM_JOOMLAUPDATE_VIEW_DEFAULT_UPDATES_INFO_NEXT="Le canal de mise à jour est &quot;%s&quot; - Au travers de ce canal vous recevrez les notifications à propos de toutes les mises à jour de la version de Joomla courante (3.x) ainsi que celles concernant la future version majeure (4.x). Avant de mettre à jour en 4.x, il vous faudra vérifier sa compatibilité avec votre environnement."
COM_JOOMLAUPDATE_VIEW_DEFAULT_UPDATES_INFO_TESTING="Le canal de mise à jour est &quot;%s&quot; - Ce canal est consacré aux tests de nouvelles versions et corrections de Joomla<br/>Il est destiné aux membres du JBS (Joomla Bug Squad&trade;) et autres testeurs de la communauté. Ne PAS utiliser ce canal sur un site en production."
COM_JOOMLAUPDATE_VIEW_DEFAULT_UPDATE_NOTICE="Avant de mettre à jour Joomla, assurez-vous que les extensions installées sont disponibles pour cette nouvelle version.<br>Nous vous conseillons vivement de faire une <strong> sauvegarde </strong> des fichiers et de la base de données de votre site avant de commencer la mise à jour."
COM_JOOMLAUPDATE_VIEW_DEFAULT_UPLOAD_INTRO="Cette fonctionnalité peut être utilisée pour mettre à jour Joomla si votre serveur est derrière un pare-feu ou n'est pas en mesure de contacter les serveurs de mise à jour. Télécharger le <em>Paquet de mise à jour</em> Joomla en format ZIP depuis <a class=\"alert-link\" href=\"%s\">la page officielle de téléchargement Joomla</a>. Puis utiliser les champs ci-dessous pour le transférer et l'installer."
COM_JOOMLAUPDATE_VIEW_PROGRESS="Progression de la mise à jour"
COM_JOOMLAUPDATE_VIEW_UPDATE_BYTESEXTRACTED="Octets extraits"
COM_JOOMLAUPDATE_VIEW_UPDATE_BYTESREAD="Octets lus"
COM_JOOMLAUPDATE_VIEW_UPDATE_CHECKSUM_WRONG="La vérification de la somme de contrôle a échoué."
COM_JOOMLAUPDATE_VIEW_UPDATE_DOWNLOADFAILED="Le téléchargement du paquet de mise à jour a échoué."
COM_JOOMLAUPDATE_VIEW_UPDATE_FILESEXTRACTED="Fichiers décompressés"
COM_JOOMLAUPDATE_VIEW_UPDATE_FINALISE_CONFIRM_AND_CONTINUE="Confirmer & continuer"
COM_JOOMLAUPDATE_VIEW_UPDATE_FINALISE_HEAD="La mise à jour de Joomla se termine et nettoie"
COM_JOOMLAUPDATE_VIEW_UPDATE_FINALISE_HEAD_DESC="Pour compléter le processus de mise à jour, merci de confirmer votre identité en soumettant ci-dessous vos identifiants de connexion pour le site &quot;%s&quot; ."
COM_JOOMLAUPDATE_VIEW_UPDATE_INPROGRESS="Progression de la mise à jour de Joomla, veuillez patienter..."
COM_JOOMLAUPDATE_VIEW_UPDATE_PERCENT="Pourcentages achevés"
COM_JOOMLAUPDATE_VIEW_UPLOAD_CAPTIVE_INTRO_BODY="S'assurer que le fichier de mise à jour que vous avez transféré provient bien de la page de mise à jour officielle de Joomla. Puis merci de confirmer que vous voulez l'installer en saisissant les informations de connexion à votre site &quot;%s&quot; ci-dessous."
COM_JOOMLAUPDATE_VIEW_UPLOAD_CAPTIVE_INTRO_HEAD="Êtes-vous sûr de vouloir installer le fichier que vous avez transféré&nbsp;?"
COM_JOOMLAUPDATE_VIEW_UPLOAD_PACKAGE_FILE="Fichier du paquet Joomla"
COM_JOOMLAUPDATE_XML_DESCRIPTION="Mise à jour en un clic vers la dernière version de Joomla"

;Copy of INSTL constants (Pre-Update check)
INSTL_DATABASE_SUPPORT="Support de la base de données :"
INSTL_DATABASE_SUPPORTED="Base de données supportée (%s)"
INSTL_DISPLAY_ERRORS="<strong>Display Errors</strong> (afficher les erreurs) "
INSTL_FILE_UPLOADS="<strong>File Uploads</strong> (transfert de fichiers) "
INSTL_JSON_SUPPORT_AVAILABLE="Support JSON"
INSTL_MAGIC_QUOTES_GPC="Magic Quotes GPC Off"
INSTL_MAGIC_QUOTES_RUNTIME="Magic Quotes Runtime"
INSTL_MB_LANGUAGE_IS_DEFAULT="Directive Mbstring language par défaut"
INSTL_MB_STRING_OVERLOAD_OFF="Directive Mbstring overload Off"
INSTL_NOTICEMBLANGNOTDEFAULT="La directive PHP mbstring language n'est pas paramétrée à 'neutral'. Cela peut être fait en rajoutant <strong>php_value mbstring.language neutral</strong> dans le fichier <code>.htaccess</code>."
INSTL_NOTICEMBSTRINGOVERLOAD="La directive PHP mbstring overload est activée. Vous pouvez la désactiver en ajoutant <strong>php_value mbstring.func_overload 0</strong> dans le fichier .<code>.htaccess</code>."
INSTL_OUTPUT_BUFFERING="Output Buffering"
INSTL_PARSE_INI_FILE_AVAILABLE="Support INI Parser"
INSTL_PHP_VERSION_NEWER="Version PHP >= %s"
INSTL_REGISTER_GLOBALS="Register Globals Off"
INSTL_SAFE_MODE="Safe Mode"
INSTL_SESSION_AUTO_START="Session Auto Start"
INSTL_XML_SUPPORT="Support XML"
INSTL_ZIP_SUPPORT_AVAILABLE="Support ZIP natif"
INSTL_ZLIB_COMPRESSION_SUPPORT="Support de compression zlib"
language/fr-FR/fr-FR.plg_privacy_user.ini000060400000001312152453623440014235 0ustar00; @date        2018-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_PRIVACY_USER="Confidentialité - Comptes utilisateurs"
PLG_PRIVACY_USER_ERROR_CANNOT_REMOVE_SUPER_USER="Impossible de supprimer un compte super utilisateur."
PLG_PRIVACY_USER_XML_DESCRIPTION="Responsable du traitement des demandes d'informations liées à la confidentialité pour les données de base des utilisateurs de Joomla."
language/fr-FR/fr-FR.com_modules.sys.ini000060400000001726152453623440014014 0ustar00; @date        2015-05-26
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_MODULES="Modules"
COM_MODULES_ACTION_EDITFRONTEND="Saisie frontale"
COM_MODULES_ACTION_EDITFRONTEND_COMPONENT_DESC="Autorise les utilisateurs de ce groupe à éditer en frontal."
COM_MODULES_GENERAL="Général"
COM_MODULES_MODULES_VIEW_DEFAULT_DESC="Affiche une liste de modules à gérer"
COM_MODULES_MODULES_VIEW_DEFAULT_TITLE="Gestionnaire de modules"
COM_MODULES_REDIRECT_EDIT_DESC="Choisir entre modifier le module dans l'interface site ou administration "
COM_MODULES_REDIRECT_EDIT_LABEL="Modifier le module"
COM_MODULES_XML_DESCRIPTION="Composant de gestion de module dans l'administration."
language/fr-FR/fr-FR.com_installer.ini000060400000067221152453623440013526 0ustar00; @date        2015-01-30
; @author      Joomla! Project
; @copyright   (C) 2005 - 2022 Open Source Matters, Inc. (https://www.joomla.org)
; @copyright   (C) 2005 - 2022 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_INSTALLER="Extensions"
COM_INSTALLER_AUTHOR_INFORMATION="Auteur"
COM_INSTALLER_CACHETIMEOUT_DESC="Nombre d'heures durant lequel les informations de mise à jour d'extensions sont conservées dans le cache. Cette valeur est aussi utilisée pour le plug-in Système - Notification de Mise à jour de Joomla!"
COM_INSTALLER_CACHETIMEOUT_LABEL="Cache de mises à jour (en heures)"
COM_INSTALLER_CONFIGURATION="Paramètres d'installation"
COM_INSTALLER_CONFIRM_UNINSTALL="Êtes-vous certain de vouloir désinstaller ces extensions ? Confirmer supprimera les extensions sélectionnées de façon permanente!"
COM_INSTALLER_CURRENT_VERSION="Installé"
COM_INSTALLER_DISCOVER_FILTER_SEARCH_DESC="Recherche sur le nom de l'extension découverte. Préfixe avec ID: recherche sur l'ID d'une extension."
COM_INSTALLER_DISCOVER_FILTER_SEARCH_LABEL="Recherche d'extensions découvertes"
COM_INSTALLER_ENABLED_UPDATES_1=", 1 site désactivé a été activé"
COM_INSTALLER_ENABLED_UPDATES_MORE=", %s sites désactivés ont été activés"
COM_INSTALLER_ERROR_DISABLE_DEFAULT_TEMPLATE_NOT_PERMITTED="La désactivation du template par défaut n'est pas autorisée."
COM_INSTALLER_ERROR_METHOD="Méthode non implémentée."
COM_INSTALLER_ERROR_NO_EXTENSIONS_SELECTED="Aucune extension n'a été sélectionnée"
COM_INSTALLER_ERROR_NO_UPDATESITES_SELECTED="Aucun site de mise à jour n'a été sélectionné"
COM_INSTALLER_EXTENSION_DISABLE="Désactiver l'extension"
COM_INSTALLER_EXTENSION_DISABLED="Extension désactivée"
COM_INSTALLER_EXTENSION_ENABLE="Activer l'extension"
COM_INSTALLER_EXTENSION_ENABLED="Extension activée"
COM_INSTALLER_EXTENSION_PACKAGE_FILE="Archive d'extension"
COM_INSTALLER_EXTENSION_PROTECTED="Extension protégée"
COM_INSTALLER_EXTENSION_PUBLISHED="Extension activée."
COM_INSTALLER_EXTENSION_UNPUBLISHED="Extension désactivée."
COM_INSTALLER_FAILED_TO_ENABLE_UPDATES=", impossible d'activer les mises à jour"
COM_INSTALLER_FILTER_LABEL="Rechercher par le nom de l'extension"
COM_INSTALLER_HEADER_DATABASE="Extensions : Vérification de la base de données"
COM_INSTALLER_HEADER_DISCOVER="Extensions : Découvrir"
COM_INSTALLER_HEADER_INSTALL="Extensions : Installation"
COM_INSTALLER_HEADER_LANGUAGES="Extensions : Installation de langues"
COM_INSTALLER_HEADER_MANAGE="Extensions : Gestion"
COM_INSTALLER_HEADER_UPDATE="Extensions : Mises à jour"
COM_INSTALLER_HEADER_UPDATESITES="Extensions : Sites de mise à jour"
COM_INSTALLER_HEADER_WARNINGS="Extensions : Avertissements"
COM_INSTALLER_HEADING_CLIENT="Client"
COM_INSTALLER_HEADING_DETAILS_URL="URL des détails"
COM_INSTALLER_HEADING_DETAILSURL="Détails de l'URL"
COM_INSTALLER_HEADING_FOLDER="Dossier"
COM_INSTALLER_HEADING_FOLDER_ASC="Répertoire ascendant"
COM_INSTALLER_HEADING_FOLDER_DESC="Répertoire descendant"
COM_INSTALLER_HEADING_ID="ID"
COM_INSTALLER_HEADING_INSTALLTYPE="Type d'Installation"
COM_INSTALLER_HEADING_LANGUAGE_TAG="Tag de langue"
COM_INSTALLER_HEADING_LANGUAGE_TAG_ASC="Tag de langue ascendant"
COM_INSTALLER_HEADING_LANGUAGE_TAG_DESC="Tag de langue descendant"
COM_INSTALLER_HEADING_LOCATION="Emplacement"
COM_INSTALLER_HEADING_LOCATION_ASC="Emplacement ascendant"
COM_INSTALLER_HEADING_LOCATION_DESC="Emplacement descendant"
COM_INSTALLER_HEADING_NAME="Nom"
COM_INSTALLER_HEADING_NAME_ASC="Nom ascendant"
COM_INSTALLER_HEADING_NAME_DESC="Nom descendant"
COM_INSTALLER_HEADING_PACKAGE_ID="ID du paquet"
COM_INSTALLER_HEADING_PACKAGE_ID_ASC="ID du paquet ascendant"
COM_INSTALLER_HEADING_PACKAGE_ID_DESC="ID du paquet descendant"
COM_INSTALLER_HEADING_TYPE="Type"
COM_INSTALLER_HEADING_TYPE_ASC="Type ascendant"
COM_INSTALLER_HEADING_TYPE_DESC="Type descendant"
COM_INSTALLER_HEADING_UPDATESITE_NAME="Site de mise à jour"
COM_INSTALLER_HEADING_UPDATESITE_NAME_ASC="Sites de mise à jour ascendant"
COM_INSTALLER_HEADING_UPDATESITE_NAME_DESC="Sites de mise à jour descendant"
COM_INSTALLER_HEADING_UPDATESITEID="ID"
COM_INSTALLER_INSTALL_BUTTON="Installer"
COM_INSTALLER_INSTALL_CHECKSUM_WRONG="La vérification de la somme de contrôle a échoué. Veuillez vous assurer que vous utilisez le bon serveur de mise à jour!"
COM_INSTALLER_INSTALL_DIRECTORY="Dossier d'installation"
COM_INSTALLER_INSTALL_ERROR="%s : erreur à l'installation"
COM_INSTALLER_INSTALL_FROM_DIRECTORY="Installer depuis un dossier"
COM_INSTALLER_INSTALL_FROM_URL="Installer depuis une adresse URL"
COM_INSTALLER_INSTALL_FROM_WEB="Installer à partir du Web"
COM_INSTALLER_INSTALL_FROM_WEB_ADD_TAB="Ajouter l'onglet &quot;Installer à partir du Web&quot;"
COM_INSTALLER_INSTALL_FROM_WEB_INFO="<a class=\"alert-link\" href=\"https://extensions.joomla.org\" target=\"_blank\">Joomla! Extensions Directory&trade; (JED)</a> est maintenant disponible avec <a class=\"alert-link\" href=\"https://docs.joomla.org/Special:MyLanguage/Install_from_Web\" target=\"_blank\">Installer à partir du Web</a> sur cette page."
COM_INSTALLER_INSTALL_FROM_WEB_TOS="En cliquant sur le bouton <strong>Ajouter l'onglet &quot;Installer à partir du Web&quot;</strong> ci-dessous, vous signifiez votre accord avec les <a class=\"alert-link\" href=\"https://extensions.joomla.org/tos\" target=\"_blank\">Conditions générales d'utilisation</a> du JED ainsi qu'avec toutes les conditions de license applicables aux extensions tierces."
COM_INSTALLER_INSTALL_LANGUAGE_SUCCESS="La langue <strong>%s</strong> a été installée."
COM_INSTALLER_INSTALL_SUCCESS="%s : installation effectuée."
COM_INSTALLER_INSTALL_URL="URL"
COM_INSTALLER_INVALID_EXTENSION_UPDATE="Mise à jour d'extension non valide"
COM_INSTALLER_LABEL_HIDEPROTECTED_DESC="Masquer les extensions protégées. Les extensions protégées ne peuvent être désinstallées."
COM_INSTALLER_LABEL_HIDEPROTECTED_LABEL="Masquer les extensions protégées"
COM_INSTALLER_LANGUAGES_AVAILABLE_LANGUAGES="Langues disponibles"
COM_INSTALLER_LANGUAGES_FILTER_SEARCH_DESC="Rechercher dans le nom ou le tag de langue."
COM_INSTALLER_LANGUAGES_FILTER_SEARCH_LABEL="Recherche de langues"
COM_INSTALLER_MANAGE_FILTER_SEARCH_DESC="Recherche sur le nom de l'extension. Préfixe avec ID: recherche sur l'ID d'une extension."
COM_INSTALLER_MANAGE_FILTER_SEARCH_LABEL="Recherche d'extensions"
COM_INSTALLER_MINIMUM_STABILITY_ALPHA="Alpha"
COM_INSTALLER_MINIMUM_STABILITY_BETA="Beta"
COM_INSTALLER_MINIMUM_STABILITY_DESC="Le niveau de stabilité des mises à jour d'extensions que vous désirez voir s'afficher. 'Développement' est le moins stable, 'Stable' est convenable pour un site en ligne. Si une extension ne spécifie pas de niveau, elle est présumée stable."
COM_INSTALLER_MINIMUM_STABILITY_DEV="Developpement"
COM_INSTALLER_MINIMUM_STABILITY_LABEL="Stabilité minimum"
COM_INSTALLER_MINIMUM_STABILITY_STABLE="Stable"
COM_INSTALLER_MINIMUM_STABILITY_RC="Release Candidate"
COM_INSTALLER_MSG_DATABASE="Cette interface permet de vérifier que la structure des tables de la base de données est à jour et contient les changements inclus dans les versions précédentes."
COM_INSTALLER_MSG_DATABASE_ADD_COLUMN="La table %2$s ne contient pas la colonne %3$s (du fichier %1$s)."
COM_INSTALLER_MSG_DATABASE_ADD_INDEX="La table %2$s ne contient pas l'index %3$s (du fichier %1$s)."
COM_INSTALLER_MSG_DATABASE_CHANGE_COLUMN_TYPE="La table %2$s a un type ou attributs incorrects pour la colonne %3$s avec le type %4$s (du fichier %1$s)."
COM_INSTALLER_MSG_DATABASE_CHECKED_OK="%s modifications de base de données vérifiés."
COM_INSTALLER_MSG_DATABASE_CREATE_TABLE="La table %2$s n'existe pas (du fichier %1$s)."
COM_INSTALLER_MSG_DATABASE_DRIVER="Pilote de la base de données: %s"
COM_INSTALLER_MSG_DATABASE_DROP_COLUMN="La table %2$s ne doit pas contenir la colonne %3$s (du fichier %1$s)."
COM_INSTALLER_MSG_DATABASE_DROP_INDEX="La table %2$s ne doit pas contenir l'index %3$s (du fichier %1$s)."
COM_INSTALLER_MSG_DATABASE_ERRORS="Attention: la base de données n'est pas à jour!"
COM_INSTALLER_MSG_DATABASE_FILTER_ERROR="Aucun filtre de texte par défaut trouvé."
COM_INSTALLER_MSG_DATABASE_INFO="Autres informations"
COM_INSTALLER_MSG_DATABASE_OK="La structure des tables de la base de données est à jour."
COM_INSTALLER_MSG_DATABASE_SCHEMA_ERROR="La version (%s) du schéma de la base de données ne correspond pas à la version (%s) du CMS."
COM_INSTALLER_MSG_DATABASE_SCHEMA_VERSION="Version du schéma de la base de données (dans #__schemas): %s"
COM_INSTALLER_MSG_DATABASE_SKIPPED="%s valeurs de modifications de la base de données ne changent pas la structure des tables et ont été ignorées."
COM_INSTALLER_MSG_DATABASE_UPDATE_VERSION="Version de la mise à jour (dans #__extensions): %s."
COM_INSTALLER_MSG_DATABASE_UPDATEVERSION_ERROR="La version (%s) de mise à jour de la base de données ne correspond pas à la version (%s) du CMS."
COM_INSTALLER_MSG_DATABASE_UTF8_CONVERSION_UTF8="Les tables de la base de données du core de Joomla! n'ont pas encore été converties en UTF-8."
COM_INSTALLER_MSG_DATABASE_UTF8_CONVERSION_UTF8MB4="Les tables de la base de données du core de Joomla! n'ont pas encore été converties en UTF-8 Multi-octets (utf8mb4)."
COM_INSTALLER_MSG_DESCFTP="Pour l'installation ou la désinstallation des extensions, Joomla aura besoin des informations d'accès à votre compte FTP. Veuillez les saisir dans le formulaire ci-dessous."
COM_INSTALLER_MSG_DESCFTPTITLE="Détails de connexion FTP"
COM_INSTALLER_MSG_DISCOVER_DESCRIPTION="Cet écran vous permet de découvrir des extensions qui ne sont pas passées par le processus normal d'installation.<br />Par exemple, certaines extensions sont trop volumineuses et impossibles à envoyer sur le serveur en utilisant l'interface web en raison des limitations de l'environnement d'hébergement Web. Grâce à cette fonctionnalité, vous pouvez envoyer les fichiers d'extension directement sur votre serveur Web dans le(s) répertoire(s) approprié(s) en utilisant d'autres moyens tels les logiciels FTP ou SFTP puis, lancer la fonction 'Découvrir' pour trouver l'extension et l'activer dans Joomla!. <br /> L'utilisation de cette fonction installe toutes les extensions découvertes et sélectionnées en une seule opération."
COM_INSTALLER_MSG_DISCOVER_FAILEDTOPURGEEXTENSIONS="Une erreur est survenue pendant la purge des extensions"
COM_INSTALLER_MSG_DISCOVER_INSTALLFAILED="Erreur d'installation en mode 'découverte'"
COM_INSTALLER_MSG_DISCOVER_INSTALLSUCCESSFUL="Installation en mode 'découverte' effectuée."
COM_INSTALLER_MSG_DISCOVER_NOEXTENSION="<strong>Aucune extension n'a été découverte.</strong> Cliquez sur 'Découvrir' pour chercher de nouvelles extensions pouvant être installées ainsi."
COM_INSTALLER_MSG_DISCOVER_NOEXTENSIONSELECTED="Aucune extension n'a été sélectionnée"
COM_INSTALLER_MSG_DISCOVER_PURGEDDISCOVEREDEXTENSIONS="Extensions découvertes purgées"
COM_INSTALLER_MSG_ERROR_CANT_CONNECT_TO_UPDATESERVER="Impossible de se connecter à %s"
COM_INSTALLER_MSG_INSTALL_ENTER_A_URL="Veuillez saisir une URL"
COM_INSTALLER_MSG_INSTALL_INVALID_URL="URL non valide"
COM_INSTALLER_MSG_INSTALL_INVALID_URL_SCHEME="Veuillez saisir une URL valide commençant par http ou https."
COM_INSTALLER_MSG_INSTALL_NO_FILE_SELECTED="Aucun fichier sélectionné"
COM_INSTALLER_MSG_INSTALL_PATH_DOES_NOT_HAVE_A_VALID_PACKAGE="Le chemin ne contient pas de paquet valide"
COM_INSTALLER_MSG_INSTALL_PLEASE_ENTER_A_PACKAGE_DIRECTORY="Veuillez saisir un répertoire de paquets"
COM_INSTALLER_MSG_INSTALL_PLEASE_SELECT_A_DIRECTORY="Veuillez sélectionner un répertoire"
COM_INSTALLER_MSG_INSTALL_PLEASE_SELECT_A_PACKAGE="Veuillez saisir le chemin du paquet"
COM_INSTALLER_MSG_INSTALL_WARNINSTALLFILE="L'installation ne peut continuer tant que l'envoi de fichier n'est pas activé."
COM_INSTALLER_MSG_INSTALL_WARNINSTALLUPLOADERROR="Une erreur est survenue lors de l'envoi de ce fichier sur le serveur."
COM_INSTALLER_MSG_INSTALL_WARNINSTALLZLIB="L'installation ne peut continuer tant que la librairie Zlib n'est pas installée."
COM_INSTALLER_MSG_LANGUAGES_CANT_FIND_REMOTE_MANIFEST="L'installateur ne peut accéder à l'URL du manifeste XML de la langue %s."
COM_INSTALLER_MSG_LANGUAGES_CANT_FIND_REMOTE_PACKAGE="L'installateur ne peut accéder à l'URL du paquet de langue %s distant."
COM_INSTALLER_MSG_LANGUAGES_NOLANGUAGES="Il n'y a aucune langue disponible à installer pour le moment. Veuillez cliquer sur le bouton 'Rechercher des langues' pour obtenir une mise à jour depuis le serveur de langues Joomla. Une connexion internet est nécessaire à cet effet."
COM_INSTALLER_MSG_LANGUAGES_TRY_LATER="Essayer plus tard ou <a href=\"https://community.joomla.org/translations/joomla-3-translations.html\">contacter le coordinateur de l'équipe de traduction</a>."
COM_INSTALLER_MSG_MANAGE_NOEXTENSION="Aucune extension installée ne correspond à votre demande"
COM_INSTALLER_MSG_MANAGE_NOUPDATESITE="Il n'y a pas de sites de mise à jour correspondant à votre requête."
COM_INSTALLER_MSG_N_DATABASE_ERROR_PANEL="%d problèmes de base de données trouvés"
COM_INSTALLER_MSG_N_DATABASE_ERROR_PANEL_1="1 problème de base de données trouvé"
COM_INSTALLER_MSG_UPDATE_ERROR="%s : erreur de mise à jour."
COM_INSTALLER_MSG_UPDATE_NODESC="Aucune description disponible pour cet élément."
COM_INSTALLER_MSG_UPDATE_NOUPDATES="Il n'y a actuellement aucune mise à jour disponible. Veuillez réessayer plus tard."
COM_INSTALLER_MSG_UPDATE_SITES_COUNT_CHECK="Certains sites de mise à jour sont désactivés. Vérifier le  <a href=\"%s\">Gestionnaire de sites de mise à jour</a>."
COM_INSTALLER_MSG_UPDATE_SUCCESS="%s : la mise à jour a été appliquée."
COM_INSTALLER_MSG_UPDATE_UPDATE="Mise à jour"
COM_INSTALLER_MSG_UPDATESITES_DELETE_ERROR="Erreur de suppression du site de mise à jour \"%s\": %s."
COM_INSTALLER_MSG_UPDATESITES_DELETE_CANNOT_DELETE="Le site de mise à jour  %s n'a pu être supprimé."
COM_INSTALLER_MSG_UPDATESITES_N_DELETE_UPDATESITES_DELETED="%s sites de mise à jour ont été supprimés."
COM_INSTALLER_MSG_UPDATESITES_N_DELETE_UPDATESITES_DELETED_1="1 site de mise à jour a été supprimé."
COM_INSTALLER_MSG_UPDATESITES_REBUILD_EXTENSION_PLUGIN_NOT_ENABLED="Le plug-in <a href=\"%s\">Extensions - Joomla</a> est désactivé. Ce plug-in doit être activé pour reconstruire les sites de mise à jour."
COM_INSTALLER_MSG_UPDATESITES_REBUILD_MESSAGE="Les sites de mise à jour ont été reconstruits. Aucune extension dotée d'un site de mise à jour n'a été découverte."
COM_INSTALLER_MSG_UPDATESITES_REBUILD_NOT_PERMITTED="La reconstruction des sites de mise à jour n'est pas autorisée."
COM_INSTALLER_MSG_UPDATESITES_REBUILD_WARNING="Les sites de mise à jour ont été reconstruits. Aucune extension avec un site de mise à jour n'a été découverte."
COM_INSTALLER_MSG_UPDATESITES_REBUILD_SUCCESS="Les sites de mise à jour ont été reconstruits à partir des fichiers de manifeste."
COM_INSTALLER_MSG_WARNING_NO_LANGUAGES_UPDATESERVER="La table des sites de mise à jour n'est pas à jour. <a href=\"index.php?option=com_installer&view=updatesites\" target=\"_blank\">Reconstruire la table</a>"
COM_INSTALLER_MSG_WARNINGFURTHERINFO="Informations complémentaires sur les avertissements"
COM_INSTALLER_MSG_WARNINGFURTHERINFODESC="Pour plus d'informations complémentaires sur les avertissements, voir <a href='https://docs.joomla.org'>Joomla! Documentation Site</a>"
COM_INSTALLER_MSG_WARNINGS_FILEUPLOADISDISABLEDDESC="L'envoi de fichier est requis pour envoyer une extension sur le serveur par l'installateur."
COM_INSTALLER_MSG_WARNINGS_FILEUPLOADSDISABLED="Envoi de fichier désactivé"
COM_INSTALLER_MSG_WARNINGS_JOOMLATMPNOTSET="Le répertoire temporaire de Joomla n'est pas défini"
COM_INSTALLER_MSG_WARNINGS_JOOMLATMPNOTSETDESC="Le répertoire temporaire de Joomla est celui où Joomla copie une extension, extrait cette extension puis copie ses fichiers dans les répertoires adéquats. Si cela n'est pas correctement défini dans le fichier configuration.php (variable $tmp_path), vous ne pourrez pas installer d'extensions. Créez un répertoire temporaire Joomla inscriptible pour corriger ce problème."
COM_INSTALLER_MSG_WARNINGS_JOOMLATMPNOTWRITEABLE="Le répertoire temporaire Joomla est verrouillé à l'écriture ou absent"
COM_INSTALLER_MSG_WARNINGS_JOOMLATMPNOTWRITEABLEDESC="Joomla ne peut pas écrire dans le répertoire temporaire car il est verrouillé à l'écriture ou absent, ce qui cause une erreur lors de la tentative d'envoi du fichier archive de l'extension. Vérifiez que le répertoire (variable $tmp_path) défini dans le fichier configuration.php existe bien, et que le droit d'écriture est appliqué à '%s'."
COM_INSTALLER_MSG_WARNINGS_LOWMEMORYDESC="Limite de Mémoire PHP faible"
COM_INSTALLER_MSG_WARNINGS_LOWMEMORYWARN="Votre limite de mémoire PHP memory est défini en dessous de 8Mo ce qui peut causer des problèmes d'installation d'extensions volumineuses. Veuillez augmenter cette limite à 16Mo minimum."
COM_INSTALLER_MSG_WARNINGS_MEDMEMORYDESC="Limite de mémoire PHP potentiellement basse"
COM_INSTALLER_MSG_WARNINGS_MEDMEMORYWARN="La limite de mémoire allouée par PHP est inférieure à 16 Mo ce qui peut entraîner des problèmes lors de l'installation de grosses extensions. Il vous est conseillé d'augmenter cette valeur si vous avez accès à la configuration du serveur, ou de demander à votre hébergeur de le faire."
COM_INSTALLER_MSG_WARNINGS_NONE="Aucun avertissement"
COM_INSTALLER_MSG_WARNINGS_NOTCOMPLETE="<h1>Attention : La mise à jour n'est pas complète !</h1><p>La mise à jour n'est que partielle. Veuillez faire la mise à jour suivante pour compléter le processus.</p>"
COM_INSTALLER_MSG_WARNINGS_NOTICE="Avertissements détectés."
COM_INSTALLER_MSG_WARNINGS_PHPUPLOADNOTSET="Le répertoire temporaire PHP n'est pas défini"
COM_INSTALLER_MSG_WARNINGS_PHPUPLOADNOTSETDESC="Le répertoire temporaire PHP est celui que PHP utilise pour stocker un fichier enregistré avant que Joomla puisse y accéder. Bien que l'absence de définition ne soit pas toujours un problème, si vous avez des erreurs concernant la non-détection des fichiers ou manifestes envoyés, définir ce répertoire dans votre fichier php.ini pourrait régler ce problème."
COM_INSTALLER_MSG_WARNINGS_PHPUPLOADNOTWRITEABLE="Le répertoire temporaire PHP n'est pas inscriptible"
COM_INSTALLER_MSG_WARNINGS_PHPUPLOADNOTWRITEABLEDESC="Joomla ne peut pas écrire dans le répertoire temporaire PHP, ce qui provoque une erreur lors de la tentative d'envoi des fichiers d'extension. que le droit d'écriture est appliqué à '%s'."
COM_INSTALLER_MSG_WARNINGS_SMALLPOSTSIZE="Taille maximum d'envoi par POST trop faible"
COM_INSTALLER_MSG_WARNINGS_SMALLPOSTSIZEDESC="La taille maximale de données pouvant être envoyées sur le serveur avec la fonction POST qui comprend la soumission de formulaire pour les articles, les médias (images, vidéos) et les paquets est inférieure à 8MB. Certains paquets risquent de ne pas pouvoir être installés. Cette valeur se modifie dans le fichier 'php.ini' du serveur par la variable 'post_max_size'."
COM_INSTALLER_MSG_WARNINGS_SMALLUPLOADSIZE="Taille maximum PHP d'envoi de fichier trop basse"
COM_INSTALLER_MSG_WARNINGS_SMALLUPLOADSIZEDESC="La taille maximale des fichiers pouvant être envoyés sur le serveur est inférieure à 8Mo. Certains paquets risquent de ne pas pouvoir être installées. Cette valeur se modifie dans le fichier 'php.ini' du serveur par la variable 'upload_max_filesize' et 'post_max_size' et/ou dans le fichier .htaccess."
COM_INSTALLER_MSG_WARNINGS_UPDATE_NOTICE="Avant d'appliquer la mise à jour, assurez-vous que celle-ci soit compatible avec votre version de Joomla!<br>Nous vous conseillons vivement de faire une <strong> sauvegarde </strong> des fichiers et de la base de données de votre site avant de commencer la mise à jour."
COM_INSTALLER_MSG_WARNINGS_UPLOADBIGGERTHANPOST="Taille maximum d'envoi de fichier supérieure à la valeur d'envoi de POST"
COM_INSTALLER_MSG_WARNINGS_UPLOADBIGGERTHANPOSTDESC="La valeur de la variable 'upload_max_filesize' dans le fichier 'php.ini' du serveur est supérieure à celle de la variable 'post_max_size' qui a priorité ; cela correspond à une mauvaise configuration du serveur. Veuillez adapter ces valeurs pour quelles correspondent."
COM_INSTALLER_MSG_WARNINGS_UPLOADFILETOOBIG="Le fichier sélectionné ne peut pas être téléchargé car il est plus grand que la taille de téléchargement maximale."
COM_INSTALLER_N_EXTENSIONS_PUBLISHED="%d extensions activées."
COM_INSTALLER_N_EXTENSIONS_PUBLISHED_1="%d extension activée."
COM_INSTALLER_N_EXTENSIONS_UNPUBLISHED="%d extensions désactivées."
COM_INSTALLER_N_EXTENSIONS_UNPUBLISHED_1="%d extension désactivée."
COM_INSTALLER_N_UPDATESITES_PUBLISHED="%d sites de mise à jour activés."
COM_INSTALLER_N_UPDATESITES_PUBLISHED_1="%d site de mise à jour activé."
COM_INSTALLER_N_UPDATESITES_UNPUBLISHED="%d sites de mise à jour désactivés."
COM_INSTALLER_N_UPDATESITES_UNPUBLISHED_1="%d site de mise à jour désactivé."
COM_INSTALLER_NEW_INSTALL="Nouvelle installation"
COM_INSTALLER_NEW_VERSION="Disponible"
COM_INSTALLER_NO_INSTALL_TYPE_FOUND="Aucun type d'installation trouvé"
COM_INSTALLER_NO_INSTALLATION_PLUGINS_FOUND="Aucun plug-in d'installation n'a été activé. Au moins l'un d'entre eux doit l'être pour utiliser l'installateur. Se rendre à <a href='index.php?option=com_plugins&view=plugins&filter[folder]=installer' title='Plugin Manager'>Plug-ins</a> pour activer les plug-ins."
COM_INSTALLER_PACKAGE_DOWNLOAD_FAILED="Échec de téléchargement du pack. Le télécharger depuis <a href='%1$s'>%1$s</a> et installer manuellement."
COM_INSTALLER_PACKAGE_FILE="Archive"
COM_INSTALLER_PREFERENCES_DESCRIPTION="Réglage fin de la procédure d'installation et de mise à jour des extensions."
COM_INSTALLER_PREFERENCES_LABEL="Préférences"
COM_INSTALLER_REINSTALL_BUTTON="Réinstaller"
COM_INSTALLER_SHOW_JED_INFORMATION_DESC="Afficher/Cacher au sommet de la page d'installation l'information concernant le Joomla! Extensions Directory&trade;."
COM_INSTALLER_SHOW_JED_INFORMATION_HIDE_MESSAGE="Cacher le message"
COM_INSTALLER_SHOW_JED_INFORMATION_LABEL="Joomla! Extensions Directory"
COM_INSTALLER_SHOW_JED_INFORMATION_SHOW_MESSAGE="Afficher le message"
COM_INSTALLER_SHOW_JED_INFORMATION_TOOLTIP="Afficher les paramètres du Gestionnaire d'extensions pour cacher ce message."
COM_INSTALLER_SUBMENU_DATABASE="Base de données"
COM_INSTALLER_SUBMENU_DISCOVER="Découvrir"
COM_INSTALLER_SUBMENU_INSTALL="Installation"
COM_INSTALLER_SUBMENU_LANGUAGES="Installation de langues"
COM_INSTALLER_SUBMENU_MANAGE="Gestion"
COM_INSTALLER_SUBMENU_UPDATE="Mises à jour"
COM_INSTALLER_SUBMENU_UPDATESITES="Sites de mise à jour"
COM_INSTALLER_SUBMENU_WARNINGS="Avertissements"
COM_INSTALLER_TITLE_DATABASE="Extensions - Base de données"
COM_INSTALLER_TITLE_DISCOVER="Extensions - Découvrir"
COM_INSTALLER_TITLE_INSTALL="Extensions - Installation"
COM_INSTALLER_TITLE_LANGUAGES="Extensions - Installer des langues"
COM_INSTALLER_TITLE_MANAGE="Extensions - Gestion"
COM_INSTALLER_TITLE_UPDATE="Extensions - Mise à jour"
COM_INSTALLER_TITLE_UPDATESITES="Extensions : Sites de mise à jour"
COM_INSTALLER_TITLE_WARNINGS="Extensions - Avertissements"
COM_INSTALLER_TOOLBAR_DATABASE_FIX="Correction"
COM_INSTALLER_TOOLBAR_DISCOVER="Découvrir"
COM_INSTALLER_TOOLBAR_FIND_LANGUAGES="Rechercher des langues"
COM_INSTALLER_TOOLBAR_FIND_UPDATES="Rechercher des mises à jour"
COM_INSTALLER_TOOLBAR_INSTALL="Installer"
COM_INSTALLER_TOOLBAR_PURGE="Purger le cache"
COM_INSTALLER_TOOLBAR_UPDATE="Mise à jour"
COM_INSTALLER_TYPE_CLIENT="Emplacement"
COM_INSTALLER_TYPE_COMPONENT="Composant"
COM_INSTALLER_TYPE_FILE="Fichier"
COM_INSTALLER_TYPE_LANGUAGE="Langue"
COM_INSTALLER_TYPE_LIBRARY="Bibliothèque"
COM_INSTALLER_TYPE_MODULE="Module"
COM_INSTALLER_TYPE_NONAPPLICABLE="N/A"
COM_INSTALLER_TYPE_PACKAGE="Paquet"
COM_INSTALLER_TYPE_PLUGIN="Plug-in"
COM_INSTALLER_TYPE_TEMPLATE="Template"
COM_INSTALLER_TYPE_TYPE_COMPONENT="Composant"
COM_INSTALLER_TYPE_TYPE_FILE="Fichier"
COM_INSTALLER_TYPE_TYPE_LANGUAGE="Langue"
COM_INSTALLER_TYPE_TYPE_LIBRARY="Bibliothèque"
COM_INSTALLER_TYPE_TYPE_MODULE="Module"
COM_INSTALLER_TYPE_TYPE_PACKAGE="Paquet"
COM_INSTALLER_TYPE_TYPE_PLUGIN="Plug-in"
COM_INSTALLER_TYPE_TYPE_TEMPLATE="Template"
COM_INSTALLER_UNABLE_TO_FIND_INSTALL_PACKAGE="Impossible de trouver un pack d'installation"
COM_INSTALLER_UNABLE_TO_INSTALL_JOOMLA_PACKAGE="Le paquet de mise à jour Joomla ne peut être installé par le gestionnaire d'extensions. Utiliser le composant <a href='%s'>Mise à jour de Joomla!</a> pour mettre Joomla à jour."
COM_INSTALLER_UNINSTALL_ERROR="Erreur : %s n'a pas pu être désinstallé."
; This string is deprecated and will be removed with 4.0.
COM_INSTALLER_UNINSTALL_LANGUAGE="Une langue doit toujours être installée en tant que paquet.<br />Pour désinstaller une langue, filtrer l'affichage en choisissant comme type 'Paquet'."
COM_INSTALLER_UNINSTALL_SUCCESS="%s désinstallé."
COM_INSTALLER_UNPACK_ERROR="Échec de l'extraction du fichier&nbsp;: %s"
COM_INSTALLER_UPDATE_FILTER_SEARCH_DESC="Recherche sur le nom de l'extension. Préfixe avec ID:, UID: ou EID: recherche sur l'ID de la mise à jour, sur l'ID d'un site de mise à jour ou l'ID d'une extension."
COM_INSTALLER_UPDATE_FILTER_SEARCH_LABEL="Recherche d'extensions avec mise à jour"
COM_INSTALLER_UPDATESITE_DISABLE="Désactiver le site de mise à jour"
COM_INSTALLER_UPDATESITE_DISABLED="Site de mise à jour désactivé"
COM_INSTALLER_UPDATESITE_ENABLE="Activer le site de mise à jour"
COM_INSTALLER_UPDATESITE_ENABLED="Site de mise à jour activé"
COM_INSTALLER_UPDATESITES_FILTER_SEARCH_DESC="Recherche sur le nom de l'extension. Préfixe avec ID: recherche sur l'ID d'un site de mise à jour."
COM_INSTALLER_UPDATESITES_FILTER_SEARCH_LABEL="Recherche de sites de mise à jour"
COM_INSTALLER_UPLOAD_AND_INSTALL="Envoyer & installer"
COM_INSTALLER_UPLOAD_INSTALL_JOOMLA_EXTENSION="Envoyer & installer une extension Joomla!"
COM_INSTALLER_UPLOAD_PACKAGE_FILE="Archive à envoyer"
COM_INSTALLER_VALUE_CLIENT_SELECT="- Sélectionner un emplacement -"
COM_INSTALLER_VALUE_FOLDER_NONAPPLICABLE="N/A"
COM_INSTALLER_VALUE_FOLDER_SELECT="- Sélectionner un répertoire -"
COM_INSTALLER_VALUE_STATE_SELECT="- Sélectionner un statut -"
COM_INSTALLER_VALUE_TYPE_SELECT="- Sélectionner un type -"
COM_INSTALLER_WEBINSTALLER_INSTALL_OBSOLETE="Le plug-in ‛Installation depuis le Web' doit être mis à jour."
COM_INSTALLER_WEBINSTALLER_INSTALL_UPDATE_AVAILABLE="Une mise à jour du plug-in ‛Installation depuis le Web' est disponible. Il est conseillé de mettre à jour dès que possible."
COM_INSTALLER_WEBINSTALLER_INSTALL_WEB_CONFIRM="Merci de confirmer l'installation en cliquant sur le bouton 'Installer'."
COM_INSTALLER_WEBINSTALLER_INSTALL_WEB_CONFIRM_NAME="Nom de l'extension"
COM_INSTALLER_WEBINSTALLER_INSTALL_WEB_CONFIRM_URL="Installer depuis "
COM_INSTALLER_WEBINSTALLER_INSTALL_WEB_LOADING="Chargement..."
COM_INSTALLER_WEBINSTALLER_INSTALL_WEB_LOADING_ERROR="Impossible de se connecter au serveur Joomla! Merci d'essayer plus tard."
COM_INSTALLER_WEBINSTALLER_LOAD_APPS="Cliquer pour charger le navigateur d'extensions."
COM_INSTALLER_XML_DESCRIPTION="Composant de gestion des extensions : ajouts, suppressions et mises à jour"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_INSTALLER="Les modification ne s'appliquent qu'à ce composant.<br /><em><strong>Hérité</strong></em> - les droits globaux ou ceux des groupes parents seront utilisés.<br /><em><strong>Refusé</strong></em> - prévaut toujours, quels que soient les droits globaux ou ceux des groupes parents, et s'applique aux éléments enfants.<br /><em><strong>Autorisé</strong></em> - le groupe concerné pourra effectuer cette action dans ce composant sauf si les droits globaux sont différents."
language/fr-FR/fr-FR.com_acymailing.sys.ini000060400000001413152453623440014452 0ustar00COM_ACYMAILING="AcyMailing"
ACYMAILING="AcyMailing"
COM_ACYMAILING_CONFIGURATION="AcyMailing"
USERS="Utilisateurs"
LISTS="Listes"
TEMPLATES="Templates"
NEWSLETTERS="Newsletters"
AUTONEWSLETTERS="Smart-Newsletters"
CAMPAIGN="Campagne"
QUEUE="File d'attente"
STATISTICS="Statistiques"
CONFIGURATION="Configuration"
UPDATE_ABOUT="Mise à jour / A propos"
COM_ACYMAILING_ARCHIVE_VIEW_DEFAULT_TITLE="Zone d'archive des Newsletters (une seule liste)"
COM_ACYMAILING_FRONTSUBSCRIBER_VIEW_DEFAULT_TITLE="Gestion des utilisateurs via le front-end"
COM_ACYMAILING_LISTS_VIEW_DEFAULT_TITLE="Zone d'archive des Newsletters (toutes les listes)"
COM_ACYMAILING_FRONTNEWSLETTER_VIEW_DEFAULT_TITLE="Créer une Newsletter"
COM_ACYMAILING_USER_VIEW_DEFAULT_TITLE="Créer/modifier une inscription"
language/fr-FR/fr-FR.com_icagenda.ini000060400000310046152453623440013260 0ustar00; iCagenda
; Copyright (c)2012-2015 Cyril Rezé (Lyr!C) / JoomliC.com - All rights reserved.
; License GNU General Public License version 3 or later <http://www.gnu.org/licenses/gpl.html>
; Note : All ini files need to be saved as UTF-8 - No BOM
;
; ADMIN					: com_icagenda.ini
; Translation Platform	: https://www.transifex.com/projects/p/icagenda/


; iC global strings
ICTITLE="Titre"
ICDESC="Description"
ICLIST="Liste"
ICCATEGORY="Catégorie"
ICCATEGORIES="Catégories"
ICDATE="Date"
ICDATES="Dates"
ICINFORMATION="Informations"

IC_EVENT="Évènement"
IC_EVENTS="Évènements"
IC_TIME_START="Heure de début"
IC_TIME_END="Heure de fin"
IC_NAME="Nom"
IC_USERNAME="Identifiant"
IC_READMORE="Lire la suite"
IC_DEFAULT="Par défaut"
IC_ARTICLE="Article"
IC_CUSTOM_TEXT="Texte personnalisé"
IC_USER_GROUPS="Groupes utilisateurs"
IC_MANAGERS="Managers"
IC_FRONTEND="Frontal du site"
IC_MORE_INFORMATION="Plus d'information"
IC_ONLY_EVENTS_LIST="Uniquement Liste des évènements"
IC_ONLY_EVENT_DETAILS="Uniquement Vue de l'évènement"
IC_META="Méta"
IC_FULLDESC="Description complète"
IC_SHORTDESC="Description courte"
IC_AUTO_INTROTEXT="Auto-Introduction"
IC_SHORTDESCRIPTION="Description courte"
IC_SHORT_AND_FULL_DESCRIPTION="Description courte et complète"
IC_AUTO="Auto"
IC_USERS="Utilisateurs"
IC_NOT_SPECIFIED="Non renseigné"
IC_HIDE_THIS_MESSAGE="Masquer ce message"
IC_SELECT_AN_OPTION="Sélectionnez une option"
IC_LOADING="Chargement..."

; Libraries Error Messages
ICAGENDA_CLASS_NOT_FOUND="Classe %s non trouvée."
ICAGENDA_CAN_NOT_LOAD="iCagenda ne peut pas être chargé pour les raisons suivantes:"
IC_LIBRARY_NOT_LOADED="La librarie iC Library n'est pas correctement installée ou n'est pas chargée."
ICAGENDA_A_FOLDER_IS_MISSING="Un dossier est manquant."
ICAGENDA_IS_NOT_CORRECTLY_INSTALLED="Il semble que l'extension n'est pas installée correctement."
ICAGENDA_INSTALL_AGAIN="Merci d'installer à nouveau le composant iCagenda."
IC_ALTERNATIVELY="Sinon"
IC_PLEASE="Veuillez"
IC_LIBRARY_CHECK_PLUGIN_AND_LIBRARY="vérifier si la librairie <strong>iC Library</strong> et le plug-in système <strong>iC Library</strong> sont installés et activés."
ICAGENDA_UTILITIES_FIX_MANUAL="extraire l'archive d'installation et copier le dossier %s dans le dossier %s."
ICAGENDA_INSTALLATION_IS_BROKEN="Votre installation d'iCagenda est corrompue, veuillez ré-installer le composant."

; PHP config error message
COM_ICAGENDA_YOUR_PHP_VERSION_IS="Votre version php est %s."
COM_ICAGENDA_PHP_VERSION_JOOMLA_RECOMMENDED="La version PHP recommandée par Joomla est %s"
COM_ICAGENDA_PHP_VERSION_ICAGENDA_RECOMMENDATION="Nous vous recommandons fortement de mettre à jour votre version PHP dans la mesure du possible, afin de prévenir d'éventuels bogues, erreurs, ou incompatibilités qui pourraient survenir dans les versions futures d'iCagenda."
COM_ICAGENDA_PHP_ERROR_FOPEN="Le paramètre PHP allow_url_fopen est désactivé. Ce paramètre doit être activé sur votre serveur pour permettre la copie d'images distantes (URL). Dans le cas contraire, les miniatures ne pourront pas être créées à partir de l'url d'une image."
COM_ICAGENDA_PHP_ERROR_FOPEN_COPY_BMP="Le paramètre PHP allow_url_fopen n'est pas activé sur votre serveur!"
COM_ICAGENDA_PHP_ERROR_FOPEN_COPY_BMP_INFO="Ce paramètre doit être activé pour permettre la création de miniatures à partir de url d'une image bmp."
COM_ICAGENDA_PHP_ERROR_GD="Il semblerait que la librairie GD n'est pas installée sur votre serveur! Ce paramètre doit être activé pour que le générateur de miniatures puisse fonctionner."

; Alert messages
COM_ICAGENDA_ICTHUMB_ERROR="Erreur"
COM_ICAGENDA_ICTHUMB_ERROR_INFO="Impossible de créer les miniatures"
COM_ICAGENDA_TRASH_FRONTEND_SUBMITTED_1="Évènements proposés en frontal du site, et jamais édités.\nAvant de pouvoir supprimer définitivement ces évènements, pour chacun d'eux, cliquez sur %s, puis sur %s."
COM_ICAGENDA_TRASH_FRONTEND_SUBMITTED="Évènement proposé en frontal du site, et jamais édité.\nAvant de pouvoir supprimer définitivement cet évènement, cliquez sur %s, puis sur %s."
COM_ICAGENDA_TRASH_FRONTEND_REGISTRATION_1="Inscriptions enregistrées en frontal du site, et jamais éditées.<br />Avant de pouvoir supprimer définitivement cette inscription, cliquez sur %s, puis sur %s."
COM_ICAGENDA_TRASH_FRONTEND_REGISTRATION="Inscriptions enregistrées en frontal du site, et jamais éditées.<br />Avant de pouvoir supprimer définitivement ces inscriptions, pour chacune d'elles, cliquez sur %s, puis sur %s."
COM_ICAGENDA_THEME_PACKS_COMPATIBILITY="Compatibilité des Thème Packs"
COM_ICAGENDA_ALERT_EVENTS_FILE_MISSING_DESC="Pour utiliser l'option d'affichage de 'Toutes les Dates' avec les Thème Packs listés ci-dessous, il est nécessaire de les mettre à jour."
COM_ICAGENDA_THEME_PACKS_INCOMPATIBLE_ALERT="Pour utiliser l'option %s avec le(s) Thème(s) Pack(s) listé(s) ci-dessous, il est nécessaire de le(s) mettre à jour."
COM_ICAGENDA_EVENTS_PHPFILE_MISSING_PACKS_LIST="Liste des Thème Packs non-compatibles:"
COM_ICAGENDA_ALERT_NO_CATEGORY_PUBLISHED="Vous devez publier au moins une catégorie pour pouvoir ajouter ou modifier un évènement."
COM_ICAGENDA_ALERT_S_TEXT_S_EXCEEDS_CHARACTER_LIMIT="Le champ texte '%s' enregistré dans la base de données dépasse la limite de caractères actuellement définie."
COM_ICAGENDA_ALERT_EDIT_TEXT_TO_FIT_CHAR_LIMIT="Veuillez éditer le champ de sorte que le texte ne soit pas tronqué, et qu'il s'adapte à la limitation du nombre de caractères."
COM_ICAGENDA_ALERT_S_TEXT_S_CURRENTLY_STORED_IN_DATABASE="%s actuellement enregistré dans la base de données"
COM_ICAGENDA_ALERT_EVENT_SAVE_WARNING="L'alias étant déjà utilisé, un nombre a été ajouté à la fin. Vous pouvez rééditer l'évènement pour personnaliser l'alias."

; General
COM_ICAGENDA="iCagenda"
COM_ICAGENDA_COMPONENT_LABEL="iCagenda"
COM_ICAGENDA_COMPONENT_DESC="Extension de gestion d'évènements pour Joomla!"
COM_ICAGENDA_INFORMATION="Extension de gestion d'évènements<br/>Joomla!<sup>&#174;</sup> 2.5 & 3.x"
COM_ICAGENDA_DESC="<table><tr><td><img src='../media/com_icagenda/images/iconicagenda48.png' alt='' /></td><td width='10px'></td><td><big><big><b>iCagenda</b></big></big><br/>Composant de gestion d'un calendrier d'évènements.</td></tr></table><br/><br/><i><small>Jooml!C &#8226; iCagenda &#8226; <a href='http://www.joomlic.com' target='_blank'>www.joomlic.com</a></small></i>"
COM_ICAGENDA_FILTER_SEARCH_CATEGORIES_DESC="Rechercher dans les catégories"
COM_ICAGENDA_FILTER_SEARCH_EVENTS_DESC="Rechercher dans les évènements"
COM_ICAGENDA_FILTER_SEARCH_FEATURES_DESC="Rechercher dans les caractéristiques"

; ToS
COM_ICAGENDA_TERMS_OF_SERVICE="Conditions d'utilisation :"
COM_ICAGENDA_TERMS_OF_SERVICE_AGREE="J'ai lu et accepte les Conditions d'utilisation"
COM_ICAGENDA_TERMS_OF_SERVICE_NOT_CHECKED_SUBMIT_EVENT="Pour proposer un évènement que vous devez accepter nos conditions d'utilisation!"

COM_ICAGENDA_TERMS_IMPORTANT_INFOS="Ces Termes et Conditions (CG) sont donnés à titre d'information uniquement, et ne sont en aucun cas considérés comme exhaustifs, ni en parfaite adéquation avec les lois en vigueur dans votre pays. <br />Vous pouvez modifier ce texte en utilisant le système de substitution intégré dans Joomla (voir dans : Extensions > Gestion des langues >      Substitutions > Nouveau, et Rechercher la Chaîne %s). <br />Vous pouvez sinon utiliser un article déjà existant ou un contenu personnalisé. <br />Pensez aussi à tenir compte des lois applicables concernant les cookies, la protection de la vie privée et des données personnelles collectées."

COM_ICAGENDA_TOS="<li>%s se réserve le droit d'approuver, modifier, refuser ou de supprimer un évènement sur ce site pour quelque raison que ce soit.</li> <li>Il est interdit d'inclure des discriminations fondées sur le sexe, l'âge, la race, les convictions politiques ou religieuses, et de respecter la législation en vigueur dans votre pays. %s n'acceptera pas les évènements qui semblent être contraires à la loi.</li><li>Vous avez lu les conditions d'utilisation dans son intégralité et vous comprenez ce que vous avez lu.</li><li>Vous vous engagez à respecter les conditions d'utilisation établies pour ce site.</li>"

COM_ICAGENDA_REGISTRATION_TERMS="<p>Bienvenue sur [SITENAME].<br />En utilisant ou en accédant à chacune des parties de nos services, vous acceptez tous les termes et conditions de nos Conditions Générales et toutes les autres règles de fonctionnement, de politique et de procédure qui seront publiées de temps à autre sur le site [SITENAME]. Si vous n'acceptez pas un seul de ces termes, conditions, règles, politiques ou procédures, vous ne devez pas utiliser ou accéder à nos services. [SITENAME] se réserve le droit, à sa seule discrétion, de modifier ou de remplacer l'un des termes ou conditions des présentes conditions générales à tout moment.</p><ol><li><strong>VOS OBLIGATIONS</strong><br /><p>Pour être un utilisateur enregistré à nos services, vous acceptez de: (a) fournir des informations réelles, exactes et complètes, à propos de vous-même comme demandées par le formulaire d'inscription du site (les «Données d'Inscription»). Si vous fournissez des informations fausses, inexactes, périmées ou incomplètes, ou que [SITENAME] a des raisons de soupçonner que ces informations sont fausses, inexactes, périmées ou incomplètes, [SITENAME] a le droit de suspendre ou de résilier l'ensemble de vos inscriptions et refuser l'accès à nos services (à toute ou partie). [SITENAME] est sensible à la sécurité et la vie privée de tous ses utilisateurs, en particulier les enfants. Pour cette raison, vous devez avoir au moins 18 ans ou l'âge légal de la majorité en vigueur dans le pays où vous résidez, pour vous inscrire à un évènement. </p></li><li><strong>VIE PRIVÉE</strong><br /><p>Tous les renseignements donnés ou fournis par vous à nos services peuvent être accessibles au public. Vous devez prendre soin de protéger ces renseignements ou informations qui sont importantes pour votre vie privé. [SITENAME] n'est en aucun cas responsable de la protection de telles informations et n'est pas responsable de la protection des courriers électroniques ou autres informations transmises par Internet ou tout autre réseau que vous pouvez utiliser. Merci de prendre en considération que si vous décidez de divulguer des informations personnelles sur nos services, ces informations peuvent devenir publiques. [SITENAME] ne contrôle pas et ne sera pas responsable des actions commises par vous ou d'autres utilisateurs (qu'ils soient organisateurs, membres, visiteurs ou autres) de nos services.</p></li><li><strong>ACCEPTATION DES CONDITIONS</strong><br /><p>Vous avez lu la totalité des termes et conditions et vous comprenez ce que vous avez lu.<br />Vous vous engagez à respecter les conditions générales établies pour ce site</p></li></ol>"

; Form
COM_ICAGENDA_FORM_REQUIRED_INFO="Tous les champs avec un * sont obligatoires."
COM_ICAGENDA_FORM_NC="Merci de vérifier que le formulaire est complet et correctement rempli."
COM_ICAGENDA_FORM_VALIDATE_FIELD_REQUIRED="Champ requis:"
COM_ICAGENDA_FORM_VALIDATE_FIELD_REQUIRED_NAME="Champ requis: %s"
COM_ICAGENDA_FORM_VALIDATE_LBL="Validation Formulaire"
COM_ICAGENDA_FORM_VALIDATE_DESC="La validation côté serveur est le minimum puisque tout ce qui est effectué avant celui-ci peut être modifié du côté de l'utilisateur. La validation côté client est plus conviviale; ainsi utiliser les deux est une bonne idée pour un contrôle efficace du formulaire (d'autant plus que celle-ci reste discrète et ne posera aucun problème sur des navigateurs avec Javascript désactivé ou problématiques)."
COM_ICAGENDA_FORM_SERVER_VALIDATION="Côté-Serveur"
COM_ICAGENDA_FORM_SERVER_CLIENT_VALIDATION="Côté-Serveur & Côté-Client"

; Thumbnails
COM_ICAGENDA_THUMB_LARGE_LBL="Grande taille"
COM_ICAGENDA_THUMB_LARGE_DESC=""
COM_ICAGENDA_THUMB_MEDIUM_LBL="Taille moyenne"
COM_ICAGENDA_THUMB_MEDIUM_DESC=""
COM_ICAGENDA_THUMB_SMALL_LBL="Petite taille"
COM_ICAGENDA_THUMB_SMALL_DESC=""
COM_ICAGENDA_THUMB_XSMALL_LBL="Très petite taille"
COM_ICAGENDA_THUMB_XSMALL_DESC=""
IC_WIDTH="Largeur"
IC_HEIGHT="Hauteur"
IC_QUALITY="Qualité"
IC_CROPPED="Recadrée"
IC100="100"
IC95="95"
IC90="90"
IC85="85"
IC80="80"
IC75="75"
IC70="70"
IC60="60"
IC50="50"

; Titles Bar Admin
COM_ICAGENDA_ADMIN_TITLE_ICAGENDA="<div style="_QQ_"float:right"_QQ_"> <img src="_QQ_"../media/com_icagenda/images/iconicagenda36.png"_QQ_" alt="_QQ_"logo"_QQ_" /></div> iCagenda <span style="_QQ_"font-size:14px;"_QQ_">- iCagenda</span>"

; Global Options Component
COM_ICAGENDA_FORM_LABEL="Formulaire"

COM_ICAGENDA_ACCESS_HEADING="Accès"
COM_ICAGENDA_CONFIGURATION="Paramètres et Droits d'accès <b>iCagenda</b>"
COM_ICAGENDA_DISPLAY_LABEL="Paramètres"
COM_ICAGENDA_DISPLAY_DESC="Options pour l'affichage en frontal du site de la 'liste des évènements' et de la vue 'Détails de l'évènement'"
COM_ICAGENDA_ADDTHIS="AddThis - Partage sur les Réseaux sociaux"
COM_ICAGENDA_ADDTHIS_LABEL="AddThis"
COM_ICAGENDA_ADDTHIS_DESC="Augmenter le trafic de votre site en aidant les visiteurs à partager sur Facebook, Twitter, Google+ ...<br>iCagenda intégre le code de suivi AddThis pour vous fournir le meilleur moyen de partager sur tous les Réseaux Sociaux.<br><a href="_QQ_"http://www.addthis.com"_QQ_" target="_QQ_"_blank"_QQ_">AddThis.com</a> | <a href="_QQ_"http://www.addthis.com/register"_QQ_" target="_QQ_"_blank"_QQ_">Create an account</a>"
COM_ICAGENDA_ADDTHIS_NOTE="Les Profils AddThis permettent de connaître les statistiques de partage sur les réseaux sociaux et des clics engendrés."
COM_ICAGENDA_ADDTHIS_ID_LABEL="AddThis Profile ID"
COM_ICAGENDA_ADDTHIS_ID_DESC="Your AddThis Profile ID (eg: ra-123a456bc789d0ef)"
COM_ICAGENDA_ADDTHIS_LIST_LABEL	= "Liste évènements"
COM_ICAGENDA_ADDTHIS_LIST_DESC="Afficher le partage sur les réseaux sociaux sur la page liste des évènements"
COM_ICAGENDA_ADDTHIS_EVENT_LABEL="Détails évènement"
COM_ICAGENDA_ADDTHIS_EVENT_DESC="Afficher le partage sur les réseaux sociaux sur la page détails d'un évènement"
COM_ICAGENDA_ADDTHIS_FLOAT_LABEL="Position Flottante"
COM_ICAGENDA_ADDTHIS_FLOAT_DESC="Mettre AddThis en position flottante gauche ou droite, ou la désactiver"
COM_ICAGENDA_ADDTHIS_ICON_LABEL="Taille des icones"
COM_ICAGENDA_ADDTHIS_ICON_DESC="Taille des icones, 16x16 ou 32x32 pixels"
COM_ICAGENDA_ADDTHIS_16="<img src="_QQ_"../media/com_icagenda/images/addthis_16x16.png"_QQ_" alt="_QQ_"addthis_16x16"_QQ_" />"
COM_ICAGENDA_ADDTHIS_32="<img src="_QQ_"../media/com_icagenda/images/addthis_32x32.png"_QQ_" alt="_QQ_"addthis_32x32"_QQ_" />"

;Events List
COM_ICAGENDA_LIST_PARAMS_DESC="Options pour l'affichage en frontal du site de la 'liste des évènements'"
COM_ICAGENDA_LIST_PARAMS_LABEL="Paramètres Liste des Évènements"

COM_ICAGENDA_LIST_FILTERS="Filtres - Liste des évènements"
COM_ICAGENDA_ALL_DATES="Toutes les dates"
COM_ICAGENDA_ONLY_NEXT="Date à venir/dernière date"
;
COM_ICAGENDA_LIST_TYPE_LBL="Afficher toutes les dates"
COM_ICAGENDA_LIST_TYPE_DESC="Si l'option est activée (par défaut), toutes les dates de chaque évènement seront affichées dans la liste principale.<br />Si l'option est désactivée, chaque évènement sera affiché une seule fois dans la liste principale, et la date utilisée pour afficher l'évènement sera la prochaine date (ou période en cours de à) si l'évènement est en cours ou à venir, la dernière date de l'évènement (ou dernière période de à) si l'évènement est passé."

COM_ICAGENDA_LIST_HEADER="Affichage Entête"
COM_ICAGENDA_LIST_HEADER_LABEL="Option d'affichage"
COM_ICAGENDA_LIST_HEADER_DESC="Option d'affichage pour l'entête de la liste des évènements"
COM_ICAGENDA_LIST_HEADER_ONLY_TITLE="Uniquement le titre"
COM_ICAGENDA_LIST_HEADER_ONLY_SUBTITLE="Uniquement le sous-titre"
COM_ICAGENDA_LIST_ARROWS_TEXT_LABEL="Afficher le texte <i>Suivant/Précédent</i>"
COM_ICAGENDA_LIST_ARROWS_TEXT_DESC="Insère le texte <i>Suivant/Précédent</i> avec les flèches de pages suivante/précédente dans la liste des évènements"

COM_ICAGENDA_LIST_PAGINATION_LABEL="Pagination"
COM_ICAGENDA_LIST_PAGINATION_TEXT_DESC="Afficher la pagination"

COM_ICAGENDA_LIST_NAVIGATOR="Flèches de navigation - Liste des évènements"
COM_ICAGENDA_LIST_NAVIGATOR_POSITION_LABEL="Position"
COM_ICAGENDA_LIST_NAVIGATOR_POSITION_DESC="Afficher les flèches de navigation en haut ou en bas de la liste des évènements"
COM_ICAGENDA_TOP="Haut"
COM_ICAGENDA_BOTTOM="Bas"
COM_ICAGENDA_TOP_AND_BOTTOM="Haut & Bas"

; Date Box
COM_ICAGENDA_LIST_DATEBOX="Box date"
COM_ICAGENDA_LIST_DATEBOX_DAY_DISPLAY_LABEL="Jour"
COM_ICAGENDA_LIST_DATEBOX_DAY_DISPLAY_DESC="Afficher/Masquer le jour dans la 'Box date' de la liste des évènements."
COM_ICAGENDA_LIST_DATEBOX_MONTH_DISPLAY_LABEL="Mois"
COM_ICAGENDA_LIST_DATEBOX_MONTH_DISPLAY_DESC="Afficher/Masquer le mois dans la 'Box date' de la liste des évènements."
COM_ICAGENDA_LIST_DATEBOX_YEAR_DISPLAY_LABEL="Année"
COM_ICAGENDA_LIST_DATEBOX_YEAR_DISPLAY_DESC="Afficher/Masquer l'année dans la 'Box date' de la liste des évènements."
COM_ICAGENDA_LIST_DATEBOX_TIME_DISPLAY_LABEL="Heure"
COM_ICAGENDA_LIST_DATEBOX_TIME_DISPLAY_DESC="Afficher/Masquer l'heure dans la 'Box date' de la liste des évènements."

; List Information
COM_ICAGENDA_LIST_TITLE_LENGTH_LABEL="Longueur Titre"
COM_ICAGENDA_LIST_TITLE_LENGTH_DESC="Limite de caractères pour le titre dans la liste des évènements. Si laissé vide, le titre en entier sera affiché."
COM_ICAGENDA_LIST_INFORMATION="Informations contenues dans la liste des évènements"
COM_ICAGENDA_LIST_VENUE_DISPLAY_LABEL="Nom du lieu"
COM_ICAGENDA_LIST_VENUE_DISPLAY_DESC="Afficher/Masquer le nom du lieu dans la liste des évènements."
COM_ICAGENDA_LIST_CITY_DISPLAY_LABEL="Ville"
COM_ICAGENDA_LIST_CITY_DISPLAY_DESC="Afficher/Masquer la ville dans la liste des évènements."
COM_ICAGENDA_LIST_COUNTRY_DISPLAY_LABEL="Pays"
COM_ICAGENDA_LIST_COUNTRY_DISPLAY_DESC="Afficher/Masquer le pays dans la liste des évènements."
COM_ICAGENDA_LIST_INTROTEXT_DISPLAY_LABEL="Texte d'introduction"
COM_ICAGENDA_LIST_INTROTEXT_DISPLAY_DESC="Afficher/Masquer le texte d'introduction de l'évènement dans la liste des évènements.<br />Si l'option 'Auto' est sélectionnée, la description courte sera affichée. Si celle-ci n'est pas renseignée, iCagenda va générer un texte d'introduction (Auto-Introduction) à partir de la description complète si celle-ci existe, dans le cas contraire, la méta-description sera affichée si renseignée.<br />Si 'Description courte' est sélectionnée, la description courte de l'évènement sera affichée.<br />Si 'Auto-Introduction' est sélectionnée, l'introduction automatique de l'évènement sera affichée.<br />Si 'Masquer' est sélectionnée, le texte d'introduction ne sera pas affiché."

; Event Details
COM_ICAGENDA_EVENT_PARAMS_DESC="Options pour l'affichage en frontal du site de la vue 'Détails de l'évènement'"
COM_ICAGENDA_EVENT_PARAMS_LABEL="Détails de l'évènement"

COM_ICAGENDA_EVENT_DESCRIPTION_DISPLAY_LABEL="Texte description"
COM_ICAGENDA_EVENT_DESCRIPTION_DISPLAY_DESC="Contenu de la description dans la vue détaillée d'un évènement.<br />Si l'option 'Auto' est sélectionnée, la description complète sera affichée si celle-ci existe, dans le cas contraire, la description courte sera affichée si renseignée.<br />Si 'Description complète' est sélectionnée, la description complète sera affichée.<br />Si 'Description courte' est sélectionnée, la description courte de l'évènement sera affichée.<br />Si 'Description courte et complète' est sélectionnée, la description courte ainsi que la description complète de l'évènement seront affichées.<br />Si 'Masquer' est sélectionnée, aucune description ne sera pas affichée."
COM_ICAGENDA_LIST_OF_PARTICIPANTS_LABEL="Liste des participants"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_DESC="Afficher/Masquer la liste des participants dans la vue détails de l'évènement."
COM_ICAGENDA_LIST_OF_PARTICIPANTS_SLIDE_LABEL="Effet Slide"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_SLIDE_DESC="Effet de slide (glissement) utilisé pour la liste des participants"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_DISPLAY_LABEL="Options d'affichage"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_DISPLAY_DESC="Changement de l'affichage de la liste des participants (l'avatar utilise Gravatar.com)<br><b>Complet</b>: gravatar + nb de places + date<br><b>Avatar & Nom d'utilisateur</b>: gravatar et le nom de l'utilisateur inscrit<br><b>Nom de l'utilisateur</b>: liste des noms des utilisateurs inscrits"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_DISPLAY_FULL="Complet"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_DISPLAY_AVATAR="Avatar & Nom d'utilisateur"
COM_ICAGENDA_LIST_OF_PARTICIPANTS_DISPLAY_NAMES="Nom d'utilisateur"
COM_ICAGENDA_LIST_DISPLAY_FULL_COLUMN_LABEL="Nb de colonnes (Complet)"
COM_ICAGENDA_LIST_DISPLAY_FULL_COLUMN_DESC="Sélectionnez le nombre de colonnes pour l'affichage complet de la liste des participants"
COM_ICAGENDA_INFORMATION_LABEL="Informations détaillées"
COM_ICAGENDA_INFORMATION_DESC="Afficher/Masquer les informations détaillées dans la vue détails de l'évènement."
COM_ICAGENDA_TARGET_LINK_LABEL="Cible du lien Site Web"
COM_ICAGENDA_TARGET_LINK_DESC="Sélectionnez la façon dont le lien ouvre le site Web de l'évènement"
COM_ICAGENDA_GOOGLE_MAPS_DESC="Afficher/Masquer Google Maps dans la vue détails de l'évènement."
COM_ICAGENDA_EVENT_DATES="Liste des Dates (vue évènement)"
COM_ICAGENDA_EVENT_ALL_DATES="Toutes les dates"
COM_ICAGENDA_EVENT_ALL_DATES_DESC="Il s'agit de la liste des dates pour un évènement, qui est affichée sur la page détails de l'évènement."
COM_ICAGENDA_EVENT_SINGLE_DATES_LABEL="Dates uniques"
COM_ICAGENDA_EVENT_SINGLE_DATES_DESC="Afficher/Masquer les dates uniques dans la liste 'Toutes les dates' (page détails de l'évènement)"
COM_ICAGENDA_EVENT_SINGLE_DATES_LIST_LABEL="Modèle de liste"
COM_ICAGENDA_EVENT_SINGLE_DATES_LIST_DESC="Sélectionnez le modèle de la liste des dates uniques (page détails de l'évènement)"
COM_ICAGENDA_EVENT_SINGLE_DATES_VERTICAL="Liste verticale"
COM_ICAGENDA_EVENT_SINGLE_DATES_HORIZONTAL="Liste horizontale"
COM_ICAGENDA_EVENT_PERIOD_LABEL="Dates sur une période"
COM_ICAGENDA_EVENT_PERIOD_DESC="Afficher/Masquer les dates d'une période dans la liste de toutes les dates (page détails de l'évènement)"
COM_ICAGENDA_OVERRIDE_BUTTON_TEXT_DESC="Vous pouvez entrer un texte personnalisé pour le bouton d'inscription. Ceci remplace le texte par défaut utilisé pour ce bouton. Si laissé vide, "_QQ_"S'inscrire"_QQ_" sera utilisé."
;
; Register to an event
COM_ICAGENDA_REGISTRATIONS_LABEL="Inscriptions"
COM_ICAGENDA_REGISTRATIONS_DESC="Configuration globale de l'inscription aux évènements"
COM_ICAGENDA_REGISTRATION_ACCESS_LEVEL_DESC="Le groupe de niveau d'accès qui est autorisé à accéder au formulaire d'inscription."
COM_ICAGENDA_REGISTRATION_TO_EVENT_DESC="Options du formulaire d'inscription à un évènement en frontal du site"
COM_ICAGENDA_REGISTRATION_LIMIT_EMAIL_LABEL="1 inscription / email"
COM_ICAGENDA_REGISTRATION_LIMIT_EMAIL_DESC="L'inscription est limitée à un enregitrement par adresse email."
COM_ICAGENDA_REGISTRATION_LIMIT_DATE_LABEL="1 inscription / date"
COM_ICAGENDA_REGISTRATION_LIMIT_DATE_DESC="L'inscription est limitée à un enregistrement par adresse email et par date. Si réglé sur «Oui», l'utilisateur peut s'enregistrer 1 fois, pour chacun des jours de l'évènement, avec la même adresse email."
COM_ICAGENDA_REGISTRATION_JOOMLA_USER_NAME_LABEL="Utilisateurs connectés"
COM_ICAGENDA_REGISTRATION_JOOMLA_USER_NAME_DESC="Si Auto-remplissage est activé, afficher le nom ou l'identifiant de l'utilisateur connecté."
COM_ICAGENDA_REGISTRATION_JOOMLA_USER_AUTOFILL_LABEL="Auto-remplissage nom et email"
COM_ICAGENDA_REGISTRATION_JOOMLA_USER_AUTOFILL_DESC="Compléter ou non les champs Nom et Email avec les informations de profil d'un utilisateur Joomla connecté."
COM_ICAGENDA_REGISTRATION_EMAIL_FIELD="Champ de formulaire Email"
COM_ICAGENDA_REGISTRATION_EMAIL_DISPLAY_LABEL="Email"
COM_ICAGENDA_REGISTRATION_EMAIL_DISPLAY_DESC="Afficher/Masquer le champ de formulaire Email"
COM_ICAGENDA_REGISTRATION_EMAIL_CONFIRM_FIELD="Champ de formulaire Confirmation Email"
COM_ICAGENDA_REGISTRATION_EMAIL_CONFIRM_DISPLAY_LABEL="Confirmation email"
COM_ICAGENDA_REGISTRATION_EMAIL_CONFIRM_DISPLAY_DESC="Afficher/Masquer le champ de formulaire Confirmation email"
COM_ICAGENDA_REGISTRATION_EMAIL_REQUIRED_LABEL="Email requis"
COM_ICAGENDA_REGISTRATION_EMAIL_REQUIRED_DESC="Définir si une adresse email est requise lors de l'inscription."
COM_ICAGENDA_REGISTRATION_EMAIL_CHECKDNSRR_LABEL="Validation d'email avancée"
COM_ICAGENDA_REGISTRATION_EMAIL_CHECKDNSRR_DESC="La validation d'email avancée n'est pas indispensable, mais utile. Elle utilise la function php 'checkdnsrr' pour vérifier le domaine d'une adresse email et, si présente sur votre serveur, iCagenda réalise ce contrôle supplémentaire après validation du formulaire.<br /><br />Cela protège :<br/> - envois de spammeurs utilisant des domaines non existants dans leur adresse e-mail<br /> - erreurs commises par de véritables utilisateurs (mauvaise orthographe, ou faute de frappe)<br /><br />Les capacités de votre serveur sont vérifiés par iCagenda. Si 'checkdnsrr' n'est pas présent, cette option n'aura aucun effet."
COM_ICAGENDA_REGISTRATION_EMAIL_CHECKDNSRR_NOT_PRESENT_1="Validation d'email avancée non disponible sur votre serveur!"
COM_ICAGENDA_REGISTRATION_EMAIL_CHECKDNSRR_NOT_PRESENT_2="L'activation de cette fonction n'aura aucun effet. Elle exige que "_QQ_"checkdnsrr"_QQ_" soit implémenté sur le système."
COM_ICAGENDA_REGISTRATION_PHONE_FIELD="Champ de formulaire Téléphone"
COM_ICAGENDA_REGISTRATION_PHONE_DISPLAY_LABEL="Téléphone"
COM_ICAGENDA_REGISTRATION_PHONE_DISPLAY_DESC="Afficher/Masquer le champ de formulaire Téléphone"
COM_ICAGENDA_REGISTRATION_PHONE_REQUIRED_LABEL="Téléphone requis"
COM_ICAGENDA_REGISTRATION_PHONE_REQUIRED_DESC="Définir si le numéro de téléphone est requis lors de l'inscription."
COM_ICAGENDA_REGISTRATION_NOTES_FIELD="Champ de formulaire Commentaires"
COM_ICAGENDA_REGISTRATION_NOTES_DISPLAY_LABEL="Commentaires"
COM_ICAGENDA_REGISTRATION_NOTES_DISPLAY_DESC="Afficher/Masquer le champ de formulaire Commentaires"

COM_ICAGENDA_TITLE_REGISTRATION_NOTIFICATIONS="Notifications d'inscription"

COM_ICAGENDA_NOTIFICATION_BY_EMAIL_ADMIN="Notification par e-mail Administrateur"
COM_ICAGENDA_NOTIFICATION_BY_EMAIL_ADMIN_LBL="Envoyer un e-mail de notification"
COM_ICAGENDA_NOTIFICATION_BY_EMAIL_ADMIN_DESC="Activer/désactiver l'envoi d'un e-mail de notification"
COM_ICAGENDA_NOTIFICATION_BY_EMAIL_ADMIN_SELECTION_INFO="Sélectionnez qui recevra la notification par courriel lorsqu'un nouvel utilisateur s'inscrit à un évènement.<ul><li><b>E-mail du site:</b> adresse email utilisée dans la configuration globale de Joomla comme expéditeur par défaut des emails du site.</li><li><b>E-mail auteur:</b> adresse email de l'utilisateur qui a créé l'évènement.</li><li><b>E-mail de contact:</b> adresse e-mail saisie comme email de contact pour l'évènement.</li><li><b>Liste personnalisée:</b> les adresses e-mail indiquées dans la liste personnalisée des e-mails.</li></ul>"
COM_ICAGENDA_EMAIL_SITE="E-mail du site"
COM_ICAGENDA_EMAIL_CREATOR="E-mail auteur"
COM_ICAGENDA_EMAIL_EVENT_CONTACT="E-mail de contact"
COM_ICAGENDA_EMAIL_CUSTOM_LIST="Liste personnalisée"
COM_ICAGENDA_REGISTRATION_EMAIL_ADMIN_CUSTOM_LIST_DESC="Entrer chaque adresse mail séparée par une virgule"
COM_ICAGENDA_EMAILADMINSEND_PLACEHOLDER="name@mail.com, example@me.com, test@test.com"

COM_ICAGENDA_REGISTRATION_EMAIL_USER="E-mail de confirmation à l'utilisateur inscrit"
COM_ICAGENDA_CONFIRMATION_BY_EMAIL_USER_LBL="Envoi d'un e-mail de confirmation"
COM_ICAGENDA_CONFIRMATION_BY_EMAIL_USER_DESC="Activer/désactiver l'envoi d'un e-mail de confirmation à l'utilisateur qui s'inscrit à un évènement."
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_DEFAULT_LABEL="Par défaut (multi-langues)"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_DEFAULT_DESC="Utiliser les e-mails par défaut (traduit dans les packs de langues) ou utiliser des emails personnalisés (non traductible)"
COM_ICAGENDA_CUSTOM_EMAILS="Emails personnalisés"

; Custom User Confirmation Email
COM_ICAGENDA_REGISTRATION_EMAIL_USER_NOTICE="Vous pouvez utiliser les balises suivantes:<br /><br /><table><tr><td><b>Utilisateur:</b></td><td width="_QQ_"30"_QQ_"></td><td><b>Site internet:</b></td><td width="_QQ_"30"_QQ_"></td><td><b>Infos de l'évènement:</b></td></tr><tr><td valign="_QQ_"top"_QQ_"><ul><li>[NAME] = Nom</li><li>[EMAIL] = email</li><li>[PHONE] = Téléphone</li><li>[PLACES] = Nombre de places</li><li>[CUSTOMFIELDS]=Liste des champs personnalisés</li><li>[NOTES] = Commentaires</li></ul></td><td width="_QQ_"30"_QQ_"></td><td valign="_QQ_"top"_QQ_"><ul><li>[SITENAME] = Nom du site internet</li><li>[SITEURL] = Url du site</li></ul></td><td width="_QQ_"30"_QQ_"></td><td valign="_QQ_"top"_QQ_"><ul><li>[TITLE] = Titre</li><li>[EVENTURL] = Lien de l'évènement</li><li>[AUTHOR] = Auteur</li><li>[AUTHOREMAIL] = Email de l'auteur</li><li>[CONTACTEMAIL] = Email de contact de l'évènement</li><li>[DATETIME] = Date unique avec l'heure</li><li>[DATE]=Date</li><li>[TIME]=Horaire</li><li>[STARTDATE] = Date de début</li><li>[ENDDATE] = Date de fin</li><li>[STARTDATETIME] = Date et heure de début</li><li>[ENDDATETIME] = Date et heure de fin</li></ul></td></tr></table><br />"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD="Email personnalisé si utilisateur enregistré à un évènement sur ​​une période (de ... à ...)"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_CUSTOM_SUBJECT_LBL="Sujet personnalisée"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_CUSTOM_SUBJECT_DESC="Entrez votre objet personnalisé"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_CUSTOM_BODY_LBL	= "Contenu personalisé"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_CUSTOM_BODY_DESC="Entrez votre contenu personnalisé"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE="Email personnalisé si utilisateur enregistré à une date unique"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_CUSTOM_SUBJECT_LBL="Sujet personnalisée"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_CUSTOM_SUBJECT_DESC="Entrez votre objet personnalisé"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_CUSTOM_BODY_LBL="Contenu personalisé"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_CUSTOM_BODY_DESC="Entrez votre contenu personnalisé"

; Registration - Notification Emails to User
COM_ICAGENDA_EMAILUSERSUBJECTDATE_PLACEHOLDER="Votre inscription à l'évènement '[TITLE]' sur le site [SITENAME]"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_DEFAULT_BODY="Bonjour [NAME],<br/><br/>Vous vous êtes enregistré à l'évènement '[TITLE]'.<br/><br/>Si vous voulez revoir les détails de l'événement, vous pouvez cliquer sur le lien ci-dessous ou, si il n'est pas cliquable, copier/coller celui-ci dans votre navigateur internet.<br/>[EVENTURL]<br/><br/>Cet email contient vos informations personnelles saisies lors de votre inscription à cet événement sur ​​le site [SITEURL].<br/><br/>Nom: [NAME]<br/>Email: [EMAIL]<br/>Téléphone: [PHONE]<br/>Nb de places: [PLACES]<br/>Période: du [STARTDATETIME] au [ENDDATETIME]<br/>[CUSTOMFIELDS]<br/>Commentaires: [NOTES]<br/><br/>Vous pouvez demander des informations, modifier vos informations personnelles ou annuler votre inscription en envoyant un courriel à: [AUTHOREMAIL]<br/><br/>Cordialement,<br/>[SITENAME]"

COM_ICAGENDA_EMAILUSERSUBJECTPERIOD_PLACEHOLDER="Votre inscription à l'évènement '[TITLE]' sur le site [SITENAME]"
COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_DEFAULT_BODY="Bonjour [NAME],<br/><br/>Vous vous êtes enregistré à l'évènement '[TITLE]'.<br/><br/>Si vous voulez revoir les détails de l'événement, vous pouvez cliquer sur le lien ci-dessous ou, si il n'est pas cliquable, copier/coller celui-ci dans votre navigateur internet.<br/>[EVENTURL]<br/><br/>Cet email contient vos informations personnelles saisies lors de votre inscription à cet événement sur ​​le site [SITEURL].<br/><br/>Nom: [NAME]<br/>Email: [EMAIL]<br/>Téléphone: [PHONE]<br/>Nb de places: [PLACES]<br/>Date : [DATETIME]<br/>[CUSTOMFIELDS]<br/>Commentaires: [NOTES]<br/><br/>Vous pouvez demander des informations, modifier vos informations personnelles ou annuler votre inscription en envoyant un courriel à: [AUTHOREMAIL]<br/><br/>Cordialement,<br/>[SITENAME]"

; Registration - Terms and Conditions
COM_ICAGENDA_REGISTRATION_TERMS_LABEL="Conditions Générales"
COM_ICAGENDA_REGISTRATION_TERMS_DESC="Si activé, les Conditions Générales seront affichées et devront être acceptées par l'utilisateur avant de pouvoir soumettre le formulaire."
COM_ICAGENDA_REGISTRATION_TERMS_TEXTTYPE_LABEL="Texte"
COM_ICAGENDA_REGISTRATION_TERMS_TEXTTYPE_DESC="Sélectionnez le texte à utiliser pour les Conditions Générales."
;
; Submit an event
COM_ICAGENDA_SUBMIT_AN_EVENT_LABEL="Proposer un évènement"
COM_ICAGENDA_SUBMIT_AN_EVENT_DESC="Options du formulaire pour proposer un évènement en frontal du site"

COM_ICAGENDA_SUBMIT_EVENT_IMAGE_DISPLAY_LABEL="Image évènement"
COM_ICAGENDA_SUBMIT_EVENT_IMAGE_DISPLAY_DESC="Afficher/Masquer le champ de formulaire 'Image évènement'"
COM_ICAGENDA_SUBMIT_EVENT_IMAGE_MAX_SIZE_LABEL="Taille maximum de l'image (en Ko)"
COM_ICAGENDA_SUBMIT_EVENT_IMAGE_MAX_SIZE_DESC="La taille maximum de l'image envoyée (en Kilo-octets)."
COM_ICAGENDA_SUBMIT_EVENT_IMAGE_MAX_SIZE_MENU_DESC="La taille maximum de l'image envoyée (en Kilo-octets). Si laissé vide, l'option générale sera utilisée."
COM_ICAGENDA_SUBMIT_PERIOD_DISPLAY_LABEL="Période"
COM_ICAGENDA_SUBMIT_PERIOD_DISPLAY_DESC="Afficher/Masquer les champs de formulaire 'Évènement sur une période'"
COM_ICAGENDA_SUBMIT_WEEKDAYS_DISPLAY_LABEL="Jours de la semaine"
COM_ICAGENDA_SUBMIT_WEEKDAYS_DISPLAY_DESC="Afficher/Masquer le champ de formulaire 'Jours de la semaine'"
COM_ICAGENDA_SUBMIT_DATES_DISPLAY_LABEL="Dates uniques"
COM_ICAGENDA_SUBMIT_DATES_DISPLAY_DESC="Afficher/Masquer le champ de formulaire 'Dates uniques'"
COM_ICAGENDA_SUBMIT_DISPLAYTIME_DISPLAY_LABEL="Affichage de l'heure"
COM_ICAGENDA_SUBMIT_DISPLAYTIME_DISPLAY_DESC="Afficher/Masquer le champ de formulaire 'Affichage de l'heure'"
COM_ICAGENDA_SUBMIT_SHORTDESC_DISPLAY_LABEL="Description courte"
COM_ICAGENDA_SUBMIT_SHORTDESC_DISPLAY_DESC="Afficher/Masquer le champ de formulaire 'Description courte'"
COM_ICAGENDA_SUBMIT_DESCRIPTION_DISPLAY_LABEL="Texte de description"
COM_ICAGENDA_SUBMIT_DESCRIPTION_DISPLAY_DESC="Afficher/Masquer le champ de formulaire 'Texte de description'"
COM_ICAGENDA_SUBMIT_METADESCRIPTION_DISPLAY_LABEL="Méta-description"
COM_ICAGENDA_SUBMIT_METADESCRIPTION_DISPLAY_DESC="Afficher/Masquer le champ de formulaire 'Méta-description'"
COM_ICAGENDA_SUBMIT_VENUE_DISPLAY_LABEL="Lieu de l'évènement"
COM_ICAGENDA_SUBMIT_VENUE_DISPLAY_DESC="Afficher/Masquer le champ de formulaire 'Lieu de l'évènement'"
COM_ICAGENDA_SUBMIT_EMAIL_DISPLAY_LABEL="Email de contact"
COM_ICAGENDA_SUBMIT_EMAIL_DISPLAY_DESC="Afficher/Masquer le champ de formulaire 'Email de contact'"
COM_ICAGENDA_SUBMIT_PHONE_DISPLAY_LABEL="Téléphone de contact"
COM_ICAGENDA_SUBMIT_PHONE_DISPLAY_DESC="Afficher/Masquer le champ de formulaire 'Téléphone de contact'"
COM_ICAGENDA_SUBMIT_WEBSITE_DISPLAY_LABEL="Site internet de l'évènement"
COM_ICAGENDA_SUBMIT_WEBSITE_DISPLAY_DESC="Afficher/Masquer le champ de formulaire 'Site internet de l'évènement'"
COM_ICAGENDA_SUBMIT_CUSTOMFIELDS_DISPLAY_DESC="Afficher/Masquer le(s) champ(s) personnalisé(s)"
COM_ICAGENDA_SUBMIT_ATTACHMENT_DISPLAY_LABEL="Pièce-jointe"
COM_ICAGENDA_SUBMIT_ATTACHMENT_DISPLAY_DESC="Afficher/Masquer le champ de formulaire 'Pièce-jointe'"
COM_ICAGENDA_SUBMIT_GMAP_DISPLAY_LABEL="Google Maps"
COM_ICAGENDA_SUBMIT_GMAP_DISPLAY_DESC="Afficher/Masquer le champ de formulaire 'Google Maps'"
COM_ICAGENDA_SUBMIT_REGISTRATION_OPTIONS_DISPLAY_LABEL="Options Inscriptions"
COM_ICAGENDA_SUBMIT_REGISTRATION_OPTIONS_DISPLAY_DESC="Afficher/Masquer le champ de formulaire 'Options Inscriptions' (Vous pouvez afficher les 'Options Inscriptions' uniquement si l'inscription est activée dans les paramètres globaux d'iCagenda)."


COM_ICAGENDA_SUBMIT_PERMISSIONS_LABEL="Droits"
COM_ICAGENDA_SUBMIT_FRONTEND_ACCESS_LABEL="Droits d'accès au formulaire (frontal du site)"
COM_ICAGENDA_SUBMIT_FRONTEND_ACCESS_DESC="Sélectionnez les niveaux d'accès autorisés à proposer des évènements en frontal du site. Sous Joomla 2.5, vous pouvez utiliser Ctrl+clic (Windows) ou Cmd+clic (Mac) pour sélectionner plusieurs éléments."
COM_ICAGENDA_SUBMIT_NOT_LOGIN_LBL="Page non-connecté"
COM_ICAGENDA_SUBMIT_NOT_LOGIN_DESC="Saisisez votre texte personnalisé pour le contenu de la page à afficher lorsqu'un visiteur n'est pas connecté. Par défaut, le texte 'Vous devez être connecté pour pouvoir proposer un évènement!' sera affiché."
COM_ICAGENDA_SUBMIT_NO_RIGHTS_LBL="Page non-autorisé"
COM_ICAGENDA_SUBMIT_NO_RIGHTS_DESC="Saisisez votre texte personnalisé pour le contenu de la page à afficher lorsqu'un utilisateur connecté n'est pas autorisé à proposer un évènement. Par défaut, le texte 'Vous n'êtes pas autorisé à proposer un évènement.' sera affiché."
COM_ICAGENDA_SUBMIT_APPROVAL_LABEL="Droits de Validation"
COM_ICAGENDA_SUBMIT_APPROVAL_GROUPS_DESC="Sélectionnez les groupes d'utilisateurs autorisés à valider les évènements proposés en frontal du site. Tous les utilisateurs autorisés recevront un email de notification lorsqu'un nouvel évènement est proposé. Sous Joomla 2.5, vous pouvez utiliser Ctrl+clic (Windows) ou Cmd+clic (Mac) pour sélectionner plusieurs éléments."
COM_ICAGENDA_SUBMIT_MANAGERS_NOTE="Les évènements proposés en frontal du site par un utilisateur (manager) appartenant à un groupe autorisé, seront automatiquement approuvés."

COM_ICAGENDA_SUBMIT_RETURN_LBL="Redirection après validation"
COM_ICAGENDA_SUBMIT_RETURN_DESC="Si vous ne souhaitez pas rediriger l'utilisateur vers la page de confirmation d'iCagenda, vous pouvez renseigner une url externe/interne, ou sélectionner un article."

COM_ICAGENDA_SUBMIT_TOS_LABEL="Conditions d'utilisation"
COM_ICAGENDA_SUBMIT_TOS_DESC="Si activé, les conditions d'utilisation seront affichées et devront être acceptées par l'utilisateur avant de pouvoir soumettre le formulaire."
COM_ICAGENDA_SUBMIT_TOS_TEXTTYPE_LABEL="Texte"
COM_ICAGENDA_SUBMIT_TOS_TEXTTYPE_DESC="Sélectionnez le texte utilisé pour les conditions d'utilisation."
COM_ICAGENDA_SUBMIT_TOS_TYPE_DEFAULT_LBL="Chaîne de traduction utilisée par défaut :"

; General Settings
COM_ICAGENDA_GLOBAL_PARAMS_LABEL="Paramètres généraux"
COM_ICAGENDA_GLOBAL_PARAMS_DESC="Paramètres généraux d'iCagenda"
COM_ICAGENDA_GLOBAL_PARAMS_INFO="Les paramètres généraux de l'extension iCagenda sont les paramètres couramment utilisés dans le composant, modules et plugins."

; Responsive Media queries settings
COM_ICAGENDA_SCREEN_WIDTH_THRESHOLDS_LABEL="Seuils largeurs d'écran, design responsive"
COM_ICAGENDA_LARGE_WIDTH_THRESHOLD_LABEL="Seuil grand écran"
COM_ICAGENDA_LARGE_WIDTH_THRESHOLD_DESC="Entrez une valeur de seuil pour les écrans de grande taille (généralement un ordinateur de bureau). Ceci définit la largeur de l'écran (en pixels), au-dessus de laquelle les styles CSS inclus dans les fichiers [nom du thème] _component_large et [nom du thème] _module_large seront appliqués. Cette fonctionnalité est ignorée si la valeur est mise à zéro ou si les fichiers CSS requis n'existent pas."
COM_ICAGENDA_MEDIUM_WIDTH_THRESHOLD_LABEL="Seuil écran classique"
COM_ICAGENDA_MEDIUM_WIDTH_THRESHOLD_DESC="Entrez une valeur de seuil pour les écrans de taille classique (généralement un ordinateur portable). Ceci définit la largeur de l'écran (en pixels), au-dessus de laquelle les styles CSS inclus dans les fichiers [nom du thème] _component_medium et [nom du thème] _module_medium seront appliqués. Cette fonctionnalité est ignorée si la valeur est mise à zéro ou si les fichiers CSS requis n'existent pas."
COM_ICAGENDA_SMALL_WIDTH_THRESHOLD_LABEL="Seuil petit écran"
COM_ICAGENDA_SMALL_WIDTH_THRESHOLD_DESC="Entrez une valeur de seuil pour les écrans de petite taille (généralement une tablette). Les écrans d'une largeur inférieure à ce seuil seront considérés comme des téléphones portables. Cette valeur définit la largeur de l'écran (en pixels), au-dessus de laquelle les styles CSS inclus dans les fichiers [nom du thème] _component_small et [nom du thème] _module_small seront appliqués. Pour les écrans avec une largeur d'écran en dessous de cette valeur, les styles CSS des fichiers [nom du thème]_component_xsmall and [nom du thème]_module_xsmall seront appliqués. De plus, pour les écrans de très petite taille, l'info-bulle du module calendrier est affichée en plein écran. Cette fonctionnalité est ignorée si la valeur est mise à zéro ou si les fichiers CSS requis n'existent pas."

; Date Time Options
COM_ICAGENDA_DATETIME_LABEL="Date et heure"
COM_ICAGENDA_TIME_FORMAT_LABEL="Format de l'heure"
COM_ICAGENDA_TIME_FORMAT_DESC="Affichage de l'heure au format 24 ou 12h am/pm"
COM_ICAGENDA_24="24h"
COM_ICAGENDA_12="12h am/pm"
COM_ICAGENDA_TIMEDISPLAY_DEFAULT_LABEL="Affichage de l'heure par défaut"
COM_ICAGENDA_TIMEDISPLAY_DEFAULT_DESC="Choisir si l'option 'Affichage de l'heure' est par défaut définie sur 'Afficher' ou 'Masquer' lors de la création d'un nouvel évènement."
COM_ICAGENDA_FIRSTDAY_WEEK_LABEL="Premier jour de la semaine"
COM_ICAGENDA_FIRSTDAY_WEEK_DESC="Sélectionnez le premier jour de la semaine (utilisé lorsque la liste des jours de la semaine est affichée)."

; Icons Bar
COM_ICAGENDA_ICONS="Icônes"

; Print Icon
COM_ICAGENDA_ICON_PRINT_LABEL="Imprimer"
COM_ICAGENDA_ICON_PRINT_DESC="Afficher/Masquer l'icône 'Imprimer'"

; Add 2 Cal Icon - List of Events
COM_ICAGENDA_ICON_ADDTOCAL_LABEL="Ajouter au calendrier"
COM_ICAGENDA_ICON_ADDTOCAL_DESC="Afficher/Masquer l'icône 'Ajouter au calendrier'"
COM_ICAGENDA_ICON_ADDTOCAL_SIZE_LABEL="Taille des icônes de calendrier"
COM_ICAGENDA_ICON_ADDTOCAL_SIZE_DESC="Sélectionnez la taille en pixels des icônes de calendrier"
COM_ICAGENDA_ICON_ADDTOCAL_OPTIONS_LABEL="Calendriers"
COM_ICAGENDA_ICON_ADDTOCAL_OPTIONS_DESC="Si l'icône 'Ajouter au calendrier' est activée, la sélection des calendriers sera affichée dans la liste 'Ajouter au calendrier'"
COM_ICAGENDA_VCAL_ICAL_LABEL="iCal Calendar"
COM_ICAGENDA_GCALENDAR_LABEL="Google Calendar"
COM_ICAGENDA_OUTLOOK_LABEL="Outlook Calendar"
COM_ICAGENDA_LIVE_CALENDAR_LABEL="Windows Live Calendar"
COM_ICAGENDA_YAHOO_CALENDAR_LABEL="Yahoo Calendar"

; Thumbnail Generator
COM_ICAGENDA_THUMBNAILS_LABEL="Miniatures"
COM_ICAGENDA_ICTHUMB_LABEL="Génération des miniatures"
COM_ICAGENDA_ICTHUMB_DESC="Activer ou non la génération des miniatures<br />Nous vous recommandons de désactiver cette option uniquement si vous rencontrez des bugs ou un affichage décalé de la page (frontal du site et/ou administration)."

; Categories admin
COM_ICAGENDA_CATEGORY_SELECT_LIST="Liste de sélection des catégories"
COM_ICAGENDA_CATEGORY_ORDER_LABEL="Ordre des catégories"
COM_ICAGENDA_CATEGORY_SELECT_LIST_ORDER_DESC="L'ordre dans lequel les catégories apparaîtront dans la liste de sélection."
COM_ICAGENDA_CATEGORY_SELECT_LIST_DEFAULT_LABEL="Catégorie par défaut"
COM_ICAGENDA_CATEGORY_SELECT_LIST_DEFAULT_DESC="La catégorie sélectionnée par défaut."
COM_ICAGENDA_CATEGORY_SELECT_LIST_STATUS_ADMIN_LABEL="Status Catégorie - Admin"
COM_ICAGENDA_CATEGORY_SELECT_LIST_STATUS_ADMIN_DESC="Le statut des catégories à afficher dans la liste déroulante des catégories, côté admin."
COM_ICAGENDA_CATEGORY_SELECT_LIST_STATUS_SITE_LABEL="Status Catégorie - Site"
COM_ICAGENDA_CATEGORY_SELECT_LIST_STATUS_SITE_DESC="Le statut des catégories à afficher dans la liste déroulante des catégories, côté site."

; Autofill Username and email
COM_ICAGENDA_JOOMLA_USER_LABEL="Auto-remplissage Utilisateur Joomla"

; Plugin Autologin
COM_ICAGENDA_SENDING_EMAIL_LABEL="Envoi d'emails"
COM_ICAGENDA_AUTOLOGIN_LABEL="Connexion automatique"
COM_ICAGENDA_AUTOLOGIN_DESC="Le plug-in iCagenda Autologin permet de connecter automatiquement un utilisateur enregistré, lors d'un clic sur une URL non publique insérée dans un email de notification. Vous pouvez désactiver cette fonction en utilisant cette option."

; Miscellaneous Global Options
COM_ICAGENDA_MISCELLANEOUS_LABEL="Divers"

COM_ICAGENDA_EVENT_TITLE_LBL="Titre évènement"
COM_ICAGENDA_TEXT_TRANSFORM_LBL="Capitalisation texte"
COM_ICAGENDA_TEXT_TRANSFORM_DESC="Contrôler la capitalisation du texte"
IC_FIRST_UPPERCASE="Premier caractère en majuscule"
IC_CAPITALIZE="Première lettre de chaque mot en majuscule"
IC_UPPERCASE="Texte en majuscule"
IC_LOWERCASE="Texte en minuscule"
COM_ICAGENDA_SHORT_DESCRIPTION_LBL="Description courte"
COM_ICAGENDA_SHORT_DESCRIPTION_LIMIT_DESC="Nombre maximum de caractères de la 'Description courte'."
COM_ICAGENDA_META_DESCRIPTION_LBL="Méta-description"
COM_ICAGENDA_META_DESCRIPTION_LIMIT_DESC="Nombre maximum de caractères de la 'Méta-description'. Les méta-descriptions peuvent avoir n'importe quelle longueur, mais les moteurs de recherche vont généralement tronquer le texte après 160 caractères. Il est préférable de limiter les méta-descriptions entre 150 et 160 caractères."
COM_ICAGENDA_AUTO_SHORT_DESCRIPTION_LBL="Auto-Introduction"
COM_ICAGENDA_AUTO_INTROTEXT_LIMIT_DESC="Nombre maximum de caractères pour générer le texte d'introduction automatique de l'évènement."
COM_ICAGENDA_HTML_FILTERING_LABEL="Filtrage HTML"
COM_ICAGENDA_FILTERING_SHORTDESC_DESC="Détermine la façon dont le code HTML sera filtré dans l'Auto-Introduction."
COM_ICAGENDA_ALL_ITALIC="Tout en italique"
COM_ICAGENDA_NO_HTML="Aucun code HTML"
COM_ICAGENDA_AUTHORIZED_HTML_TAGS="Balises HTML autorisées"
COM_ICAGENDA_FILTERING_SHORTDESC_AUTHORIZED_HTML_TAGS_DESC="Sélectionnez les balises HTML autorisées dans l'Auto-Introduction. Sélectionnez un ou plusieurs éléments de la liste. L'utilisation des balises sélectionnés dépendra de votre éditeur, et du code source html de votre description (basculer votre éditeur pour afficher les balises HTML de la description de l'évènement). Les styles en ligne ne seront pas pris en considération. Sous Joomla 2.5, vous pouvez utiliser la touche Ctrl (Windows) ou Cmd-clic (Mac) pour sélectionner plusieurs éléments."
COM_ICAGENDA_CUSTOMIZATION="Personnalisation"
COM_ICAGENDA_CUSTOM_CSS_ACTIVATION_LBL="Chargement CSS personnalisés"
COM_ICAGENDA_CUSTOM_CSS_ACTIVATION_DESC="Faut-il charger le code CSS personnalisé entré ci-dessous?"
COM_ICAGENDA_CUSTOM_CSS_LBL="Code CSS personnalisé"
COM_ICAGENDA_CUSTOM_CSS_DESC="Créer des feuilles de styles CSS personnalisés à ajouter aux styles d'iCagenda ou remplacer les styles et les classes CSS existants."
COM_ICAGENDA_CUSTOM_CSS_HINT="Entrez votre code CSS personnalisé ici..."

; PRO Options
COM_ICAGENDA_COPY_LABEL="Montrer/Masquer "_QQ_"Powered by iCagenda"_QQ_" &#3664; Masquer &#3663; Montrer &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b>Version PRO : <a href="_QQ_"http://www.joomlic.com/extensions/icagenda"_QQ_" target="_QQ_"_blank"_QQ_">Commander</b></a>"
COM_ICAGENDA_COPY_DESC="Afficher/Masquer "_QQ_"Powered by iCagenda"_QQ_""
COM_ICAGENDA_PRO_LABEL="PARAMÈTRES PRO"
COM_ICAGENDA_PRO_ACCOUNT_INFO="<h2>Compte Pro <small>(Mises à jour et support par ticket)</small></h2>Après votre commande de la version Pro, un accès personnel sera créé dans les 2 jours ouvrés sur le site : <a href='http://pro.joomlic.com' target='_blank'><strong>pro.joomlic.com</strong></a><br /><br /><h3>Vous pouvez activer les mises à jour Pro de 2 façons:</h3><ul><li>Entrez votre <strong>Identifiant et Mot de passe</strong> pour le site pro.joomlic.com</li><li><strong>OU</strong> entrez la clé de téléchargement <strong>Pro ID</strong></li></ul><i>Avant la première mise à jour, veuillez cliquer sur le bouton 'Actualiser les informations de mise à jour' pour nettoyer le cache de l'URL de téléchargement.</i>"
COM_ICAGENDA_PRO_COPY_LABEL="Afficher/Masquer "_QQ_"Powered by iCagenda"_QQ_""
COM_ICAGENDA_PRO_COPY_DESC="Afficher la signature "_QQ_"Powered by iCagenda"_QQ_""
PRO_JOOMLIC_UPDATES_INFORMATION="Informations Mises à jour Pro"
PRO_JOOMLIC_USERNAME_LBL="Identifiant"
PRO_JOOMLIC_USERNAME_DESC="Entrez votre identifiant sur le site pro.joomlic.com afin d'activer les mises à jour de la version Professionnelle."
PRO_JOOMLIC_PASSWORD="Mot de passe"
PRO_JOOMLIC_PASSWORD_DESC="Entrez votre mot de passe sur le site pro.joomlic.com afin d'activer les mises à jour de la version Professionnelle."
COM_ICAGENDA_PRO_ID_LABEL="Pro ID"
COM_ICAGENDA_PRO_ID_DESC="Entrez votre clé de téléchargement Pro ID afin d'activer les mises à jour."
COM_ICAGENDA_PRO_CONFIG_LIVEUPDATE_MINSTABILITY_LABEL="Niveau de stabilité minimum pour la notification de mise à jour"
COM_ICAGENDA_PRO_UPDATE_SERVER="Serveur de mises à jour"
COM_ICAGENDA_PRO_CONFIG_LIVEUPDATE_MINSTABILITY_DESC="Choisissez le niveau minimum requis des mises à jour pour être notifié de la disponibilité d'une nouvelle version. N'utilisez que des versions 'Release Candidate' ou 'Stable' sur des sites en production. Vous pouvez cependant nous aider à tester les versions Alpha et/ou Bêta sur des sites de tests et nous faire part de vos retours (Test)."
ICAGENDA_STABILITY_TESTING="Test (Alpha et bêta)"
ICAGENDA_STABILITY_ALPHA="Alpha"
ICAGENDA_STABILITY_BETA="Bêta"
ICAGENDA_STABILITY_RC="Release Candidate"
ICAGENDA_STABILITY_STABLE="Stable"

; PRO Messages
COM_ICAGENDA_PRO_WELCOME="Bienvenue sur %s!"
COM_ICAGENDA_PRO_WELCOME_PRO_ACCOUNT_INFO="Après avoir acheté un abonnement %s sur Share-it, un compte personnel sera créé manuellement par JoomliC dans les 2 jours ouvrables sur le site : %s "
COM_ICAGENDA_PRO_WELCOME_PRO_NOTIFICATION_EMAILS="Vous recevrez 2 emails de notification de %s"
COM_ICAGENDA_PRO_WELCOME_PRO_NOTIFICATION_EMAILS_FIRST="Le premier email contenant votre nom d'utilisateur et mot de passe pour vous connecter sur le site %s. "
COM_ICAGENDA_PRO_WELCOME_PRO_NOTIFICATION_EMAILS_SECOND="Le deuxième email contenant les détails de votre abonnement."
COM_ICAGENDA_PRO_WELCOME_PRO_CHECK_YOUR_EMAIL="Merci de consulter votre courrier électronique (mais aussi de vérifier vos spams si vous n'avez rien reçu). "
COM_ICAGENDA_PRO_WELCOME_PRO_FIRST_LOGIN_1="Lors de votre première connexion à %s, vous pourrez modifier votre profil avec l'identifiant et le mot de passe de votre choix."
COM_ICAGENDA_PRO_WELCOME_PRO_FIRST_LOGIN_2="Ensuite, vous aurez accès à votre clé de téléchargement Pro ID."
COM_ICAGENDA_PRO_WELCOME_PRO_OPTIONS="Copiez/collez votre clé Pro ID dans l'onglet 'Options Pro' des paramètres globaux du composant%s"
COM_ICAGENDA_PRO_WELCOME_PRO_ID_1="La clé de licence Pro ID est indispensable pour pouvoir mettre à jour %s à partir de votre site Joomla."
;COM_ICAGENDA_PRO_WELCOME_PRO_ID_2="Merci de prêter attention au fait que chaque édition de votre profil, modifiera votre clé de téléchargement Pro ID. "
COM_ICAGENDA_PRO_WELCOME_CONTACT="N'hésitez pas à nous contacter pour obtenir de l'aide au cours de votre abonnement."
COM_ICAGENDA_PRO_WELCOME_SUPPORT="Merci de ne pas utiliser l'email de contact pour les questions techniques ou demandes de support. Utilisez notre %s à la place."
COM_ICAGENDA_PRO_WELCOME_NOTE="Remarque: Lorsque vous nous contactez par email, n'oubliez pas d'utiliser l'adresse mail que vous avez renseigné lors de votre achat sur ​​Share-it, ou dans le cas d'une adresse email différente, indiquez-nous votre numéro de commande. Cela permettra d'éviter que votre mail soit rejeté."
COM_ICAGENDA_WELCOME_RELOAD="Recharger message de bienvenue"
COM_ICAGENDA_WELCOME_RELOAD_DESC="Recharger le message de bienvenue contenant des informations à propos de vos premiers pas avec iCagenda Pro."
COM_ICAGENDA_WELCOME_HIDE_SUCCESS="Message de bienvenue masqué avec succès"

; Captcha
COM_ICAGENDA_CAPTCHA="Captcha"
COM_ICAGENDA_CAPTCHA_LABEL="Plug-in Captcha"
COM_ICAGENDA_CAPTCHA_DESC="Choisissez le plug-in captcha qui sera utilisé pour les formulaires du composant iCagenda. Vous devrez peut-être saisir les informations requises par votre plug-in captcha dans le gestionnaire des plug-ins.<br />Si 'Paramètres par défaut' est sélectionné, assurez-vous qu'un plug-in captcha est sélectionné dans la configuration globale de Joomla."
;
COM_ICAGENDA_REGISTRATION_CAPTCHA_DESC="Afficher/Masquer le captcha dans le formulaire 'Inscription'. Vous pouvez sélectionner le plug-in captcha qui sera utilisé dans l'onglet 'Paramètres généraux' des paramètres d'iCagenda."
COM_ICAGENDA_SUBMIT_CAPTCHA_DESC="Afficher/Masquer le captcha dans le formulaire 'Proposer un évènement'. Vous pouvez sélectionner le plug-in captcha qui sera utilisé dans l'onglet 'Paramètres généraux' des paramètres d'iCagenda."
COM_ICAGENDA_MENU_SUBMIT_CAPTCHA_DESC="Choisissez le plug-in captcha qui sera utilisé pour le formulaire 'Proposer un évènement'. Vous devrez peut-être saisir les informations requises par votre plug-in captcha dans le gestionnaire des plug-ins.<br />Si 'Paramètres globaux' est sélectionné, assurez-vous qu'un plug-in captcha est sélectionné dans la configuration globale de Joomla."
COM_ICAGENDA_NONE_SELECTED="- Aucun élément sélectionné -"

; Items and messages
COM_ICAGENDA_N_ITEMS_ARCHIVED="%d éléments archivés avec succès"
COM_ICAGENDA_N_ITEMS_ARCHIVED_1="%d élément archivé avec succès"
COM_ICAGENDA_N_ITEMS_CHECKED_IN_0="Aucune élément déverrouillé"
COM_ICAGENDA_N_ITEMS_CHECKED_IN_1="%d élément déverrouillé avec succès"
COM_ICAGENDA_N_ITEMS_CHECKED_IN_MORE="%d éléments déverrouillés avec succès"
COM_ICAGENDA_N_ITEMS_DELETED="%d éléments supprimés avec succès"
COM_ICAGENDA_N_ITEMS_DELETED_1="%d élément supprimé avec succès"
COM_ICAGENDA_N_ITEMS_PUBLISHED="%d éléments publiés avec succès"
COM_ICAGENDA_N_ITEMS_PUBLISHED_1="%d élément publié avec succès"
COM_ICAGENDA_N_ITEMS_TRASHED="%d éléments mis à la corbeille"
COM_ICAGENDA_N_ITEMS_TRASHED_1="%d élément mis à la corbeille"
COM_ICAGENDA_N_ITEMS_UNPUBLISHED="%d éléments dépubliés avec succès"
COM_ICAGENDA_N_ITEMS_UNPUBLISHED_1="%d élément dépublié avec succès"
COM_ICAGENDA_NO_ITEM_SELECTED="Aucun élément sélectionné"
COM_ICAGENDA_SAVE_SUCCESS="Enregistré avec succès"

; Filters Select
COM_ICAGENDA_SELECT_STATE="- Status -"
COM_ICAGENDA_SELECT_CATEGORY="- Catégorie -"
COM_ICAGENDA_SELECT_DATES="- Dates -"
COM_ICAGENDA_SELECT_SITE_ITEMID="- ID élément de menu -"

COM_ICAGENDA_SELECT_EVENT="- Sélectionner un évènement -"
COM_ICAGENDA_SELECT_DATE="- Sélectionner une date -"
COM_ICAGENDA_SELECT_NO_EVENT_SELECTED="Aucun évènement sélectionné"

; Categories list
COM_ICAGENDA_TITLE_CATEGORIES="Catégories"
COM_ICAGENDA_CATEGORIES_TITLE="Titre"
COM_ICAGENDA_CATEGORIES_COLOR="Couleur"

; Events list
COM_ICAGENDA_TITLE_EVENTS="Évènements"
COM_ICAGENDA_EVENTS_TITLE="Titre"
COM_ICAGENDA_EVENTS_USERNAME="Utilisateur"
COM_ICAGENDA_EVENTS_CATID="Catégorie"
COM_ICAGENDA_EVENTS_IMAGE="Image"
COM_ICAGENDA_EVENTS_NEXT="Date"
COM_ICAGENDA_EVENTS_COMPLETED="Évènement Terminé"
COM_ICAGENDA_EVENTS_NEXT_PAST="Dernière Date : "
COM_ICAGENDA_EVENTS_NEXT_FUTUR="Date à venir : "
COM_ICAGENDA_EVENTS_NEXT_TODAY="AUJOURD'HUI : "
COM_ICAGENDA_EVENTS_PLACE="Lieu"
COM_ICAGENDA_EVENTS_APPROVAL="Validation"
COM_ICAGENDA_EVENTS_APPROVAL_DESC="Valider ou non l'évènement"
COM_ICAGENDA_TOOLBAR_APPROVE="Valider"
COM_ICAGENDA_APPROVED="Validé"
COM_ICAGENDA_UNAPPROVED="Non-validé"
COM_ICAGENDA_N_EVENTS_APPROVED="%s Évènements validés avec succès"
COM_ICAGENDA_N_EVENTS_APPROVED_0="Évènement non-validé"
COM_ICAGENDA_N_EVENTS_APPROVED_1="Évènement validé avec succès"

; Warning events list
COM_ICAGENDA_EVENTS_NEXT_ALERT="Attention : aucune date valide!"
COM_ICAGENDA_INVALID_PICTURE_LINK="Lien de l'image non-valide!"
COM_ICAGENDA_NO_VALID_DATE="Aucune date valide!"
COM_ICAGENDA_ERROR_MIME_TYPE="Erreur de type MIME !!!"
COM_ICAGENDA_ERROR_MIME_TYPE_NO_THUMBNAIL="Les miniatures ne peuvent pas être créées."
COM_ICAGENDA_ERROR_MIME_TYPE_INFO="L'extension <i>%s</i> n'est pas correcte, car le type MIME de votre fichier est <i>%s</i>."
COM_ICAGENDA_NOT_AUTHORIZED_IMAGE_TYPE="Format d'image non permis!"
COM_ICAGENDA_NOT_AUTHORIZED_IMAGE_TYPE_INFO="La création des miniatures est compatible avec les formats suivants: jpg, jpeg, png, gif et bmp."
COM_ICAGENDA_FORM_NO_DATES_ALERT="Veuillez sélectionner les dates de l'évènement."

; Registrations
COM_ICAGENDA_REGISTRATIONS_SELECT_STATUS="- Status inscription -"
COM_ICAGENDA_REGISTRATIONS_SELECT_CATEGORY="- Sélectionner une catégorie -"
COM_ICAGENDA_REGISTRATIONS_SELECT_EVENT="- Sélectionner un évènement -"
COM_ICAGENDA_REGISTRATIONS_SELECT_DATE="- Sélectionner une date -"
COM_ICAGENDA_TITLE_REGISTRATION="Inscriptions"
COM_ICAGENDA_REGISTRATION_INFORMATION="Renseignements sur l'inscription"
COM_ICAGENDA_REGISTRATION_USER="Nom d'utilisateur"
COM_ICAGENDA_REGISTRATION_USER_ID="ID Utilisateur"
COM_ICAGENDA_REGISTRATION_NO_USER_ID="Enregistré en tant que visiteur"
COM_ICAGENDA_REGISTRATION_USERID="Utilisateur"
COM_ICAGENDA_REGISTRATION_EVENTID="Évènement"
COM_ICAGENDA_REGISTRATION_DATE="Date"
COM_ICAGENDA_REGISTRATION_ALL_DATES="Toutes les dates"
COM_ICAGENDA_REGISTRATION_ALL_PERIOD="Toute la période"
COM_ICAGENDA_REGISTRATION_NUMBER_PLACES="Nombre de personnes"
COM_ICAGENDA_REGISTRATION_PEOPLE="N.P."
COM_ICAGENDA_REGISTRATION_EMAIL="Email"
COM_ICAGENDA_REGISTRATION_PHONE="Téléphone"
COM_ICAGENDA_REGISTRATION_EVENT_NOT_PUBLISHED=" Évènement non publié"
COM_ICAGENDA_REGISTRATION_TICKETS="Places"

; Registrations Export
COM_ICAGENDA_REGISTRATIONS_DOWNLOAD="Télécharger liste d'inscriptions"
COM_ICAGENDA_REGISTRATIONS_EXPORT="Exporter"
COM_ICAGENDA_CANCEL="Annuler"
COM_ICAGENDA_EXPORT_SEPARATOR_LABEL="Séparateur"
COM_ICAGENDA_EXPORT_SEPARATOR_DESC="Sélectionner la virgule (par défaut) ou le point-virgule comme séparateur des valeurs."
IC_COMMA="Virgule [ , ]"
IC_SEMICOLON="Point-virgule [ ; ]"
COM_ICAGENDA_EXPORT_COMPRESSED_LABEL="Compressé"
COM_ICAGENDA_EXPORT_COMPRESSED_DESC="Option pour compresser le fichier pour l'exportation."
COM_ICAGENDA_EXPORT_BASENAME_LABEL="Nom de fichier"
COM_ICAGENDA_EXPORT_BASENAME_DESC="Modèle de nom de fichier pouvant contenir<br />__SITE__ pour le nom du site<br />__EVENTID__ pour l'ID de l'évènement<br />__EVENT__ pour le titre de l'évènement<br />__DATE__ pour la date enregistrée dans la base de données."
COM_ICAGENDA_NO_EVENT_TITLE="Aucun Titre"
COM_ICAGENDA_EXPORT_ERR_ZIP_ADAPTER_FAILURE="Erreur d'adaptateur Zip"
COM_ICAGENDA_EXPORT_ERR_ZIP_CREATE_FAILURE="Erreur de création du Zip"
COM_ICAGENDA_EXPORT_ERR_ZIP_DELETE_FAILURE="Erreur de suppression du Zip"

; Registration Edit
COM_ICAGENDA_LEGEND_NEW_REGISTRATION="Nouvelle inscription"
COM_ICAGENDA_LEGEND_EDIT_REGISTRATION="Modifier l'inscription"
COM_ICAGENDA_REGISTRATION_TYPE_FOR_THIS_EVENT="L'option 'Mode d'inscription' pour cet évènement est : %s"
COM_ICAGENDA_REGISTRATION_NO_DATE_SELECTED="Aucune date sélectionnée"
COM_ICAGENDA_REGISTRATION_ERROR_DATE_CONTROL="iCagenda n'a pas été en mesure de contrôler la date d'inscription et de la convertir dans le nouveau format de date standard maintenant utilisé lors de l'enregistrement dans la base de donnée (introduit depuis la version 3.3.3). Merci de bien vouloir sélectionner la date %s ci-dessous, si vous souhaitez mettre à jour la valeur date dans la base de données."
COM_ICAGENDA_REGISTRATION_DATE_NO_LONGER_EXISTS="La date %s n'existe plus!"
COM_ICAGENDA_REGISTRATION_PERIOD_NO_LONGER_EXISTS="L'inscription à une période complète (non divisée en dates uniques) n'est plus disponible car des jours de la semaine sont maintenant sélectionnés pour cet évènement."
COM_ICAGENDA_REGISTRATION_BY_DATE_NO_LONGER_POSSIBLE="La date enregistrée pour cette inscription n'est plus disponible, car le type d'inscription pour cet évènement est maintenant '%s'. Veuillez sélectionner '%s' si vous souhaitez mettre à jour cette inscription."
COM_ICAGENDA_REGISTRATION_FOR_ALL_DATES_NO_LONGER_POSSIBLE="L'inscription pour toutes les dates de l'évènement n'est plus disponible, car le type d'inscription pour cet évènement est maintenant '%s'. Veuillez sélectionner une date si vous souhaitez mettre à jour cette inscription."
COM_ICAGENDA_REGISTRATION_NO_EVENT_SELECTED_ALERT="Veuillez sélectionner un évènement pour cette nouvelle inscription."


; Category Edit
COM_ICAGENDA_LEGEND_NEW_CATEGORY="Nouvelle catégorie"
COM_ICAGENDA_LEGEND_EDIT_CATEGORY="Modifier une catégorie"
COM_ICAGENDA_TITLE_CATEGORY="Catégorie"
COM_ICAGENDA_LEGEND_CATEGORY="Catégorie"
COM_ICAGENDA_FORM_LBL_CATEGORY_TITLE="Titre"
COM_ICAGENDA_FORM_DESC_CATEGORY_TITLE="Choisir le titre de la catégorie"
COM_ICAGENDA_FORM_LBL_CATEGORY_COLOR="Couleur"
COM_ICAGENDA_FORM_DESC_CATEGORY_COLOR="Attribuez une couleur à cette catégorie"
COM_ICAGENDA_FORM_LBL_CATEGORY_DESC="Description"
COM_ICAGENDA_FORM_DESC_CATEGORY_DESC="Description de la catégorie"

; Event Edit
COM_ICAGENDA_TITLE_EVENT="Évènement"
;
; Right Sidebar
COM_ICAGENDA_TITLE_SIDEBAR_DETAILS="Détails"
;
; Panel Publishing Options
COM_ICAGENDA_ACCESS_DESC="Le groupe de niveau d'accès qui est autorisé à voir cet évènement."
;
; Panel Event
COM_ICAGENDA_LEGEND_NEW_EVENT="Nouvel Évènement"
COM_ICAGENDA_LEGEND_EDIT_EVENT="Modifier un évènement"
COM_ICAGENDA_FORM_LBL_EVENT_TITLE="Titre"
COM_ICAGENDA_FORM_DESC_EVENT_TITLE="Choisir le titre de l'évènement"
COM_ICAGENDA_FORM_LBL_EVENT_USERNAME="Utilisateur"
COM_ICAGENDA_FORM_DESC_EVENT_USERNAME="Nom de l'utilisateur, créateur de l'évènement"
COM_ICAGENDA_FORM_LBL_EVENT_CATID="Catégorie"
COM_ICAGENDA_FORM_DESC_EVENT_CATID="Catégorie à laquelle cet évènement est assigné"
COM_ICAGENDA_FORM_DESC_LANGUAGE="Attribuez une langue à cet évènement."
;
; Panel Attachments
COM_ICAGENDA_LEGEND_ALLEG="Pièces Jointes"
COM_ICAGENDA_FORM_LBL_EVENT_IMAGE="Image"
COM_ICAGENDA_FORM_DESC_EVENT_IMAGE="Ajouter une image à l'évènement"
COM_ICAGENDA_FORM_LBL_EVENT_FILE="Fichier"
COM_ICAGENDA_FORM_DESC_EVENT_FILE="Joindre un fichier à l'évènement"
;
; Panel Dates
COM_ICAGENDA_LEGEND_DATES="Dates"
COM_ICAGENDA_DATES_HELP="Notice: vous pouvez choisir plusieurs possibilités et combinaisons pour les dates de l'évènement. <small style="_QQ_"text-decoration:underline; float:right;"_QQ_">Lire la suite</small>"
COM_ICAGENDA_DATES_HELP_INTRO="Vous pouvez choisir un évènement avec date de début et date de fin et / ou des dates uniques :"
COM_ICAGENDA_DATES_HELP_LINE1="Évènement avec une seule date, et une heure de début."
COM_ICAGENDA_DATES_HELP_EXAMPLE1="ex: un concert qui commence à 20:00 et se déroule uniquement le jour sélectionné."
COM_ICAGENDA_DATES_HELP_LINE2="Évènement avec plusieurs dates, consécutives ou non, avec une heure de début, qui peut être différente pour chaque date."
COM_ICAGENDA_DATES_HELP_EXAMPLE2="ex: un concert qui aurait lieu une semaine, le vendredi et le samedi, et la semaine d'après, le vendredi. Ce concert peut ainsi débuté à différentes heures, et on peut rajouter des nouvelles dates à tout moment."
COM_ICAGENDA_DATES_HELP_LINE3="Évènement sur une période (de ... à ...)."
COM_ICAGENDA_DATES_HELP_EXAMPLE3="ex: un festival de musique qui commence jeudi à 14h00 et se termine le dimanche à 23h00. Dans ce cas, vous entrez la date de début et la date de fin."
COM_ICAGENDA_DATES_HELP_LINE4="Évènement se déroulant sur une période et vous souhaitez ajouter des moment clés à des heures précises."
COM_ICAGENDA_DATES_HELP_EXAMPLE4="ex: Un groupe de musique participe à un festival du jeudi 14:00 au dimanche 23:00. Le jeudi, le groupe joue à 16:30, le samedi à 18:00 et le dimanche à 13:15. Vous pouvez alors entrer la période de l'évènement (du jeudi 14:00 au dimanche 23:00) et ajouter des dates uniques avec l'heure, pour quand le groupe est sur ​​scène."
COM_ICAGENDA_DATES_HELP_LINE5="Évènement se déroulant sur une période, et avec d'autres dates qui ne sont pas sur cette période."
COM_ICAGENDA_DATES_HELP_EXAMPLE5="ex: un évènement qui se déroule du lundi au dimanche (dates sur une période) et une autre semaine, le mardi et le vendredi (dates simples)."
;
COM_ICAGENDA_LEGEND_PERIOD_DATES="Évènement sur une période"
COM_ICAGENDA_FORM_LBL_EVENTPERIOD_START="Date de Début"
COM_ICAGENDA_FORM_DESC_EVENTPERIOD_START="Date et heure du début de l'évènement"
COM_ICAGENDA_FORM_LBL_EVENTPERIOD_END="Date de Fin"
COM_ICAGENDA_FORM_DESC_EVENTPERIOD_END="Date et heure de fin de l'évènement"
COM_ICAGENDA_FORM_LBL_WEEK_DAYS="Jours de la semaine"
COM_ICAGENDA_FORM_WEEK_DAYS_INFO_TITLE="Sélection des jours de la semaine"
COM_ICAGENDA_FORM_WEEK_DAYS_INFO_DESC="Vous pouvez diviser la période en dates individuelles en sélectionnant les jours de la semaine.<br />Si laissé vide, la période ne sera pas divisée, et sera considérée comme une période complète (du ... au ... ).<br /><small>Vous pouvez utiliser la touche Ctrl-clic (Windows) ou Cmd-clic (Mac) pour sélectionner plusieurs éléments.</small>"
COM_ICAGENDA_FORM_ALL_WEEK_DAYS="Tous les jours de la semaine"
;
COM_ICAGENDA_LEGEND_SINGLE_DATES="Dates uniques"
COM_ICAGENDA_FORM_LBL_EVENT_DATES="Date"
COM_ICAGENDA_FORM_DESC_EVENT_DATES="Choisir la ou les date(s) de l'évènement"
COM_ICAGENDA_ADD_DATE="Ajouter"
COM_ICAGENDA_DELETE_DATE="Supprimer"
COM_ICAGENDA_TB_DATE="Date"
COM_ICAGENDA_TB_ACT="Actions"
COM_ICAGENDA_FORM_LBL_EVENT_NEXT="Prochaine Date"
COM_ICAGENDA_FORM_DESC_EVENT_NEXT="Prochaine date de l'évènement dans le calendrier"
;
COM_ICAGENDA_DISPLAY_TIME_LABEL="Affichage de l'heure"
COM_ICAGENDA_DISPLAY_TIME_DESC="Afficher/Masquer l'heure de l'évènement"
;
; Panel Information
COM_ICAGENDA_LEGEND_INFORMATION="Information"
;
; Panel Venue
COM_ICAGENDA_LEGEND_VENUE="Lieu de l'évènement"
COM_ICAGENDA_FORM_LBL_EVENT_VENUE="Lieu"
COM_ICAGENDA_FORM_DESC_EVENT_VENUE="L'endroit où l'évènement se déroule (MoMA, Tour Eiffel, Stade de France, Londres Concert Hall, chez-vous, école, université, bâtiment...)"
;
COM_ICAGENDA_LEGEND_PLACE="Lieu de l'évènement"
COM_ICAGENDA_FORM_LBL_EVENT_PLACE="Lieu"
COM_ICAGENDA_FORM_DESC_EVENT_PLACE="Renseigner le lieu (Salle de concert, Festival, nom exact du lieu, etc.)"
COM_ICAGENDA_FORM_LBL_EVENT_CITY="Ville"
COM_ICAGENDA_FORM_DESC_EVENT_CITY="Ville du lieu de l'évènement"
COM_ICAGENDA_FORM_LBL_EVENT_COUNTRY="Pays"
COM_ICAGENDA_FORM_DESC_EVENT_COUNTRY="Le pays du lieu de l'évènement"
;
COM_ICAGENDA_LEGEND_CONTACT="Informations de Contact"
COM_ICAGENDA_FORM_LBL_EVENT_EMAIL="Email"
COM_ICAGENDA_FORM_DESC_EVENT_EMAIL="Renseigner l'Email de contact"
COM_ICAGENDA_FORM_LBL_EVENT_PHONE="Téléphone"
COM_ICAGENDA_FORM_DESC_EVENT_PHONE="Renseigner les coordonnées téléphoniques de contact"
COM_ICAGENDA_FORM_LBL_EVENT_WEBSITE="Site Internet"
COM_ICAGENDA_FORM_DESC_EVENT_WEBSITE="Site internet de l'évènement"
;
; Panel Features
COM_ICAGENDA_LEGEND_FEATURES="Caractéristiques de l'évènement"
COM_ICAGENDA_FORM_LBL_EVENT_FEATURES="Caractéristiques"
COM_ICAGENDA_FORM_DESC_EVENT_FEATURES="Sélectionnez les caractéristiques qui s'appliquent à cet évènement"
COM_ICAGENDA_FORM_DESC_EVENT_FEATURES_FILTER="Sélectionnez les caractéristiques que vous souhaitez utiliser pour filtrer les évènements pour ce lien de menu. Veuillez noter que si une seule caractéristique est sélectionnée, seuls les évènements où cette caractéristique est présente seront sélectionnés. Toutefois, si plus d'une caractéristique est sélectionnée, utilisez l'option 'Toutes les caractéristiques ou au moins une?' pour définir comment la sélection est effectuée."
;
; Panel Description
COM_ICAGENDA_LEGEND_DESC="Description"
COM_ICAGENDA_FORM_EVENT_SHORT_DESCRIPTION_LBL="Description courte"
COM_ICAGENDA_FORM_EVENT_SHORT_DESCRIPTION_DESC="Un texte optionnel pouvant être utilisé comme texte d'introduction de l'évènement, dans la liste des évènements."
COM_ICAGENDA_FORM_LBL_EVENT_DESC="Texte de description"
COM_ICAGENDA_FORM_DESC_EVENT_DESC="Description de l'évènement"
COM_ICAGENDA_FORM_EVENT_METADESC_LBL="Méta-description"
COM_ICAGENDA_FORM_EVENT_METADESC_DESC="Un paragraphe optionnel pouvant être utilisé comme la description de la page de l'évènement dans la sortie HTML. Généralement Cela permet d'afficher dans les résultats des moteurs de recherche."
; OLD: COM_ICAGENDA_FORM_EVENT_METADESC_DESC="La méta-description permet d'indexer une description de l'évènement afin d'améliorer son référencement. Lorsque l'évènement est indexé par un moteur dans les résultats d'une recherche, le texte de cette métadonnée est affiché sous le titre. Il est recommandé d'utiliser 150 à 160 caractères. Si laissé vide, iCagenda va générer automatiquement pour vous une méta-description brève sur la base de la description complète."
COM_ICAGENDA_MAXIMUM_N_CHARACTERS="Maximum de %s caractères"
COM_ICAGENDA_N_REMAINING="(%s restants)"
;
; Panel Options
COM_ICAGENDA_REGISTRATION_OPTIONS="Options Inscriptions"
COM_ICAGENDA_REGISTRATION_LABEL="Inscriptions"
COM_ICAGENDA_REGISTRATION_DESC="Activer l'inscription à cet évènement"
COM_ICAGENDA_REGISTRATION_LINK_LBL="Lien vers la page d'inscription"
COM_ICAGENDA_REGISTRATION_LINK_DESC="Si vous ne souhaitez pas utiliser le formulaire d'inscription d'iCagenda, vous pouvez définir un lien externe ou interne, vers une page d'inscription personnalisée ou sélectionner un article. Remarque: 'iCagenda n'enregistrera pas de données si utilisation d'une URL ou d'un article."
COM_ICAGENDA_REGISTRATION_LINK_ARTICLE="Article"
COM_ICAGENDA_REGISTRATION_LINK_URL="URL"

COM_ICAGENDA_REGISTRATION_FORM_OPTIONS_LABEL="Options formulaire inscription"
COM_ICAGENDA_TYPE_REG_LABEL="Mode d'inscription"
COM_ICAGENDA_TYPE_REG_DESC="Sélectionner le mode d'inscription: par date (affiche une liste de toutes les dates) ou pour toute la période/dates de l'évènement."
COM_ICAGENDA_REG_BY_DATE_OR_PERIOD="toutes options"
COM_ICAGENDA_REG_BY_INDIVIDUAL_DATE="par date"
COM_ICAGENDA_REG_FOR_ALL_DATES="toutes les dates"
COM_ICAGENDA_REG_FOR_ALL_PERIOD="pour toute la période"
COM_ICAGENDA_ADMIN_REGISTRATION_BY_INDIVIDUAL_DATE="liste déroulante des dates"
COM_ICAGENDA_ADMIN_REGISTRATION_FOR_ALL_DATES="pour toutes les dates de l'évènement"
COM_ICAGENDA_ADMIN_REGISTRATION_FOR_ALL_PERIOD="pour toute la période"
COM_ICAGENDA_MAX_REGISTRATIONS_LABEL="Nb de places"
COM_ICAGENDA_MAX_REGISTRATIONS_DESC="Nombre de places disponibles par jour (et/ou par période si aucun jour de semaine sélectionné).<br />Si l'option <strong>Type d'inscription</ strong> est réglée sur 'Pour toutes les dates de l'évènement', le nombre de places sera appliqué à l'évènement dans sa globalité, sans tenir compte des dates."
COM_ICAGENDA_MAX_PER_REGISTRATION_LABEL="MAX. Places/inscription"
COM_ICAGENDA_MAX_PER_REGISTRATION_DESC="Nombre maximum de places disponibles lors d'une inscription"
COM_ICAGENDA_CUSTOM_TEXT="Texte personnalisé"
COM_ICAGENDA_REGISTRATION_BUTTON="Bouton inscription"
COM_ICAGENDA_REGISTRATION_REGISTER="S'inscrire"
COM_ICAGENDA_REGISTRATION_BUTTON_TEXT="Texte du bouton pour s'inscrire"
COM_ICAGENDA_REGISTRATION_BUTTON_TEXT_DESC="Vous pouvez entrer un texte personnalisé pour le bouton d'enregistrement. Ceci remplace le texte par défaut utilisé pour ce bouton et, si définie, la valeur réglée dans les options globales de iCagenda."
COM_ICAGENDA_BROWSER_TARGET="Fenêtre-cible"
COM_ICAGENDA_REGISTRATION_LINK_BROWSER_TARGET_DESC="Fenêtre-cible du navigateur ouverte lorsque le visiteur clique sur le bouton inscription."
;
COM_ICAGENDA_ADDTHIS_DISPLAY_SHARING="Afficher partage"
;
; Google Maps
COM_ICAGENDA_LEGEND_GOOGLE_MAPS="Google Maps"
COM_ICAGENDA_GOOGLE_MAPS_SUBTITLE_LBL="Sélecteur d'adresse, avec affichage instantané sur la carte."
COM_ICAGENDA_GOOGLE_MAPS_NOTE1="La carte affiche l'adresse sélectionnée, même pendant que vous naviguez dans les suggestions automatiques."
COM_ICAGENDA_GOOGLE_MAPS_NOTE2="Vous pouvez même ajuster la position du marqueur sur la carte."
COM_ICAGENDA_GOOGLE_MAPS_ADDRESS_LBL="Adresse"
COM_ICAGENDA_GOOGLE_MAPS_LATITUDE_LBL="Latitude"
COM_ICAGENDA_GOOGLE_MAPS_LONGITUDE_LBL="Longitude"
COM_ICAGENDA_GOOGLE_MAPS_REVERSE="Récupérer l'adresse après déplacement du marqueur ?"
COM_ICAGENDA_GOOGLE_MAPS_LEGEND="Vous pouvez glisser et déposer le marqueur à l'emplacement correct"
COM_ICAGENDA_FORM_LBL_EVENT_LOCATION="Entrer une adresse pour visualiser la carte"
COM_ICAGENDA_FORM_DESC_EVENT_LOCATION="Entrer une adresse pour visualiser la carte: adresse complète, rue, ville, pays, ..."
COM_ICAGENDA_FORM_LBL_EVENT_MAP="<i>Situation Géographique</i>"
COM_ICAGENDA_FORM_DESC_EVENT_MAP="Situation sur Google Maps du lieu où se déroule l'évènement (déplacer le curseur sur la carte pour ajuster automatiquement)"
COM_ICAGENDA_FORM_LBL_EVENT_GPS="<i>Coordonnées GPS</i>"
;
; Event Panel Publishing
COM_ICAGENDA_FORM_FRONTEND_OPTIONS="Informations liées au formulaire en frontal du site"
COM_ICAGENDA_FORM_FRONTEND_SUBMIT_ITEMID_LBL="ID lien de menu"
COM_ICAGENDA_FORM_FRONTEND_SUBMIT_ITEMID_DESC="ID du lien de menu utilisé afin de proposer cet évènement en frontal du site."
;
; Locations
COM_ICAGENDA_LOCATION_NAME_LBL="Nom du lieu"
;
; Warning Messages Box
COM_ICAGENDA_FORM_WARNING="Attention !"
COM_ICAGENDA_FORM_ALERT_UNPUBLISHED="Votre évènement ne sera pas publié : aucune date valide pour cet évènement"
COM_ICAGENDA_FORM_ERROR_NO_STARTDATE="Erreur : Vous avez renseigné une date de fin, mais aucune date de début pour votre évènement"
COM_ICAGENDA_FORM_ERROR_NO_ENDDATE="Erreur : Vous avez renseigné une date de début, mais aucune date de fin pour votre évènement"
COM_ICAGENDA_FORM_ERROR_INVALID_PERIOD="Période non valide: le début est postérieure à la fin"
;
; Not in use currently, but you can keep this lines of translation
COM_ICAGENDA_FORM_LBL_EVENT_ADDRESS="Adresse"
COM_ICAGENDA_FORM_DESC_EVENT_ADDRESS="Renseigner l'adresse du lieu où se déroule l'évènement"

; Custom Fields List
COM_ICAGENDA_TITLE_CUSTOMFIELDS="Champs personnalisés"
COM_ICAGENDA_CUSTOMFIELDS="Champs personnalisés"
COM_ICAGENDA_CUSTOMFIELDS_NONE="Aucun champ personnalisé n'est publié"
COM_ICAGENDA_CUSTOMFIELDS_FILTER_OPTION_SELECT_PARENT_FORM="- Sélectionner le formulaire parent -"
COM_ICAGENDA_CUSTOMFIELDS_FILTER_OPTION_SELECT_TYPE="- Sélectionner le type -"
COM_ICAGENDA_CUSTOMFIELDS_FILTER_SEARCH_DESC="Rechercher dans les champs personnalisés"

; Custom Field Edit
COM_ICAGENDA_CUSTOMFIELD_LEGEND_NEW="Nouveau Champ Personnalisé"
COM_ICAGENDA_CUSTOMFIELD_LEGEND_EDIT="Modifier un champ personnalisé"
COM_ICAGENDA_CUSTOMFIELD_PANEL_TITLE="Champ personnalisé"
COM_ICAGENDA_CUSTOMFIELD_TITLE_LBL="Titre"
COM_ICAGENDA_CUSTOMFIELD_TITLE_DESC="Titre du champ"
COM_ICAGENDA_CUSTOMFIELD_SLUG_LBL="Slug (Nom interne)"
COM_ICAGENDA_CUSTOMFIELD_SLUG_DESC="Si laissé vide, le 'Slug' sera généré automatiquement.<br />Le 'Slug' est le nom interne sous lequel ce champ est enregistré dans la base de données. Celui-ci doit être unique.<br />Veuillez à n'utiliser que des lettres minuscules a-z, des nombres 0-9 et des tirets bas _. Ne pas utiliser de caractères accentués (par ex. à) ou des caractères spéciaux (par ex. δ)."
COM_ICAGENDA_CUSTOMFIELD_PARENT_FORM_LBL="Formulaire parent"
COM_ICAGENDA_CUSTOMFIELD_PARENT_FORM_DESC="Le formulaire dans lequel le champ personnalisé doit être affiché."
COM_ICAGENDA_CUSTOMFIELD_PARENT_SELECT="- Sélectionner le formulaire parent -"
COM_ICAGENDA_CUSTOMFIELD_PARENT_REGISTRATION_FORM="Formulaire inscription"
COM_ICAGENDA_CUSTOMFIELD_PARENT_EVENT_EDIT="Formulaire évènement"
COM_ICAGENDA_CUSTOMFIELD_TYPE_LBL="Type de champ"
COM_ICAGENDA_CUSTOMFIELD_TYPE_DESC="Type pour ce champ"
COM_ICAGENDA_CUSTOMFIELD_TYPE_SELECT="- Sélectionner le type de champ -"
COM_ICAGENDA_CUSTOMFIELD_TYPE_TEXT="Texte"
COM_ICAGENDA_CUSTOMFIELD_TYPE_LIST="Liste déroulante"
COM_ICAGENDA_CUSTOMFIELD_TYPE_RADIO="Boutons radio"
COM_ICAGENDA_CUSTOMFIELD_OPTIONS_LBL="Options"
COM_ICAGENDA_CUSTOMFIELD_OPTIONS_DESC="<h4>Texte</h4><p>Saisissez le texte à afficher dans le champ.<br /><em>Exemple pour un champ personnalisé avec pour Titre 'Quel est votre gâteau préféré?' :</em></p><pre>Votre gâteau préféré...</pre><hr><h4>Liste déroulante & Boutons radio</h4>Entrez chaque option sur une nouvelle ligne en utilisant la norme VALEUR=LABEL avec une paire valeur/label par ligne.<br /><em>Exemple pour un champ personnalisé avec pour Titre 'Quel est votre genre?' :</em></p><pre>F=Femme<br />H=Homme</pre><em>Dans cet exemple, 'Femme' et 'Homme' seront les éléments à sélectionner dans la liste déroulante.<br />'F' ou 'H' sera la valeur enregistrée par l'élément sélectionné.</em><br /><br />Si vous voulez définir une option comme sélectionnée par défaut, ajouter '=X' après la paire valeur/label (par exemple, valeur=label=X)."
COM_ICAGENDA_CUSTOMFIELD_REQUIRED_LBL="Requis"
COM_ICAGENDA_CUSTOMFIELD_REQUIRED_DESC="Si ce champ doit être renseigné"
COM_ICAGENDA_CUSTOMFIELD_DESCRIPTION_DESC="Cette description sera affichée dans une info-bulle au survol de l'icône <i class="_QQ_"iCicon-info-cercle"_QQ_"></i> (facultatif)."
;
; DATABASE error message
COM_ICAGENDA_CUSTOMFIELD_DATABASE_ERROR_AUTO_SLUG="iCagenda a essayé de générer un slug (nom interne) ) partir du titre %s, mais le slug auto-généré %s est déjà utilisé."
COM_ICAGENDA_CUSTOMFIELD_DATABASE_ERROR_UNIQUE_SLUG="Un autre champ personnalisé à le même slug (Nom interne)"

; Features list
COM_ICAGENDA_TITLE_FEATURES="Caractéristiques"
COM_ICAGENDA_LEGEND_NEW_FEATURE="Nouvelle caractéristique"
COM_ICAGENDA_LEGEND_EDIT_FEATURE="Modifier une caractéristique"
COM_ICAGENDA_FEATURES_TITLE="Titre"
COM_ICAGENDA_FEATURES_SHOW_ICON="Afficher l'icône"
COM_ICAGENDA_FEATURES_ICON="Icône"
COM_ICAGENDA_FEATURES_SHOW_FILTER="Filtre Menu"

; Feature Edit
COM_ICAGENDA_TITLE_FEATURE="Caractéristique"
COM_ICAGENDA_FORM_FEATURE_TITLE_LABEL="Titre"
COM_ICAGENDA_FORM_FEATURE_TITLE_DESC="Choisir le titre de la caractéristique"
COM_ICAGENDA_FORM_FEATURE_ICON_LABEL="Sélectionnez une icône"
COM_ICAGENDA_FORM_FEATURE_ICON_DESC="Le nom du fichier de l'icône à utiliser pour cette caractéristique. Les icônes de caractéristiques se trouvent dans [DOSSIER IMAGES]/icagenda/feature_icons/nn_bit/ où nn est la taille de l'icône)."
COM_ICAGENDA_FORM_FEATURE_NEW_ICON_LABEL="<strong>OU</strong> créez une nouvelle icône<br /><small>(jpg, jpeg, gif, png)</small>"
COM_ICAGENDA_FORM_FEATURE_NEW_ICON_DESC="Vous pouvez sélectionner une image pour générer une nouvelle icône caractéristique dans toutes les tailles (16, 24, 32, 48 et 64 bits). Le nom du fichier de l'icône sera filtré pour obtenir un nom de fichier type url. Les icônes de caractéristiques prennent en charge les formats JPG, JPEG, GIF et PNG."
COM_ICAGENDA_FORM_FEATURE_ICON_ALT_LABEL="Valeur ALT de l'icône"
COM_ICAGENDA_FORM_FEATURE_ICON_ALT_DESC="Renseignez le texte à utiliser comme attribut ALT de la balise image. Ce texte est utilisé pour faciliter l'accessibilité et est également utilisé comme contenu de l'info-bulle au survol de l'icône avec la souris, si cette option est activée dans les paramètres globaux d'iCagenda (ce champ est facultatif)."
COM_ICAGENDA_FORM_FEATURE_SHOW_FILTER_LABEL="Afficher en tant que filtre de menu?"
COM_ICAGENDA_FORM_FEATURE_SHOW_FILTER_DESC="Permet d'inclure la caractéristique dans les options de filtrage des évènements par caractéristiques, dans les paramètres du lien de menu."
COM_ICAGENDA_FORM_FEATURE_DESCRIPTION_LABEL="Description"
COM_ICAGENDA_FORM_FEATURE_DESCRIPTION_DESC="Description de la caractéristique"
;
; Feature error message
COM_ICAGENDA_FORM_FEATURE_MIMETYPE_ERROR="Une icône de caractéristique prend en charge les formats JPG, JPEG, GIF et PNG. Merci de sélectionner une autre image."

; Menus Options
COM_ICAGENDA_LOGO="<img src='../media/com_icagenda/images/iconicagenda48.png' alt='' />"
COM_ICAGENDA_SLOGAN="Extension de gestion d'un calendrier d'évènements"
COM_ICAGENDA_TITLE="<table><tr><td><img src='../media/com_icagenda/images/iconicagenda48.png' alt='' /></td><td width='10px'></td><td>Extension de gestion d'un calendrier d'évènements</td></tr></table>"
COM_ICAGENDA_FOOTER="<hr><i><small>Jooml!C &#8226; iCagenda &#8226; <a href='http://www.joomlic.com' target='_blank'>www.joomlic.com</a></small></i>"
COM_ICAGENDA_MENU_OPTIONS="<b>Options !Cagenda</b>"
COM_MENUS_ICAGENDA_FIELDSET_LABEL="<b>!Cagenda Options</b>"
COM_MENUS_BASIC_FIELDSET_LABEL="iCagenda - Paramètres, <i>liste des évènements</i>"
COM_MENUS_FILTER_FIELDSET_LABEL="Filtres"

COM_ICAGENDA_LBL_TIME="Sélection des évènements"
COM_ICAGENDA_DESC_TIME="Choisir les évènements à afficher (tous, passés, à venir et/ou d'aujourd'hui)"
COM_ICAGENDA_OPTION_TODAY_AND_UPCOMING="Aujourd'hui et à venir"
COM_ICAGENDA_OPTION_TODAY="Aujourd'hui"

COM_ICAGENDA_TIME_LBL="Filtrer par dates"
COM_ICAGENDA_TIME_DESC="Choisir les évènements à afficher, tous, passés, en cours et/ou à venir"
COM_ICAGENDA_OPTION_PAST_EVENTS="Évènements passés"
COM_ICAGENDA_OPTION_CURRENT_EVENTS_TODAY_EVENTS="En cours et commençant aujourd'hui"
COM_ICAGENDA_OPTION_CURRENT_EVENTS_TODAY_AND_UPCOMING_EVENTS="En cours et tous les évènements à venir"
COM_ICAGENDA_OPTION_UPCOMING_EVENTS="Évènements à venir"
COM_ICAGENDA_OPTION_ALL_EVENTS="Tous les évènements"

COM_ICAGENDA_LBL_CATEGORY="Filtrer par catégorie"
COM_ICAGENDA_DESC_CATEGORY="Filtre par catégorie.<br />Sous Joomla 2.5, vous pouvez utiliser Ctrl+clic (Windows) ou Cmd+clic (Mac) pour sélectionner plusieurs éléments.<br />Sous Joomla 3, si ce champ est laissé vide, toutes les catégories seront affichées."
COM_ICAGENDA_ALL="Tous"
COM_ICAGENDA_ALL_F="Toutes"
COM_ICAGENDA_ALL_CATEGORIES="Toutes les catégories"
COM_ICAGENDA_LBL_DATE="Classement par date"
COM_ICAGENDA_DESC_DATE="Ordre des évènements par dates.<br />Si 'Date décroissant' sélectionné, ordre chronologique inverse (la date la plus ancienne sera afficher à la fin).<br />Si 'Date ascendant' sélectionné, ordre chronologique (la plus ancienne date sera en première position)."
COM_ICAGENDA_DATE_ASC="Date ascendant"
COM_ICAGENDA_DATE_DESC="Date descendant"

; Features Menu Options
COM_ICAGENDA_MENU_EVENT_FEATURES_INCLUDE_EXCLUDE_LBL="Inclure ou exclure les caractéristiques?"
COM_ICAGENDA_MENU_EVENT_FEATURES_INCLUDE_EXCLUDE_DESC="Indiquez si les caractéristiques de l'évènement sélectionné (si au moins une sélectionnée) doivent être utilisées pour inclure ou exclure des évènements de la liste. Cela permet la création de menus avec des options complémentaires, qui divisent un ensemble d'évènements en deux groupes (par exemple, gratuit et non gratuit)."
COM_ICAGENDA_MENU_EVENT_FEATURES_INCLUDE="Inclure caractéristiques"
COM_ICAGENDA_MENU_EVENT_FEATURES_EXCLUDE="Exclure caractéristiques"
COM_ICAGENDA_MENU_EVENT_FEATURES_ALL_OR_ANY_LBL="Toutes les caractéristiques ou au moins une?"
COM_ICAGENDA_MENU_EVENT_FEATURES_ALL_OR_ANY_DESC="Indiquez, lorsque plus d'une caractéristique a été sélectionnée, si toutes les caractéristiques doivent être présents pour chaque évènement ou seulement une seule caractéristique suffit."
COM_ICAGENDA_MENU_EVENT_FEATURES_ANY_ONE_FEATURE="Une caractéristique"
COM_ICAGENDA_MENU_EVENT_FEATURES_ALL_FEATURES_REQUIRED="Toutes les caractéristiques"

COM_MENUS_VIEW_FIELDSET_LABEL="Affichage"
COM_ICAGENDA_SHORT_DESCRIPTION_LBL="Description courte"
COM_ICAGENDA_LBL_LIMIT="Limite de caractères"
COM_ICAGENDA_DESC_LIMIT="Nombre maximum de caractères pour générer le texte d'introduction automatique de l'évènement."
COM_ICAGENDA_LBL_CUSTOM_VALUE="Valeur personnalisée"
COM_ICAGENDA_DESC_CUSTOM_VALUE="Entrez une valeur personnalisée, lorsque vous n'utilisez pas les paramètres globaux"

COM_ICAGENDA_DISPLAY_CATINFOS_LABEL="Informations Catégorie"
COM_ICAGENDA_DISPLAY_CATINFOS_DESC="Afficher les informations sélectionnées pour chaque catégorie de la liste des évènements (Vue liste principale)"

COM_ICAGENDA_LBL_NUMERO="Nombre/page"
COM_ICAGENDA_DESC_NUMERO="Choisir le nombre d'évènement à afficher par page"
COM_ICAGENDA_LBL_FORMAT="Format de la Date"
COM_ICAGENDA_DESC_FORMAT="Choisir le format d'affichage de la date (ex: j m d)"
COM_ICAGENDA_SELECT_FORMAT="Sélectionner un format de date"
COM_ICAGENDA_DATE_FORMAT_NOTE1="La fonction Format de date détecte votre langue actuelle, afin de vous fournir des formats de date standards dans votre culture. Si votre langue n'est pas disponible dans iCagenda, les formats de date anglais seront affichés par défaut."
COM_ICAGENDA_DATE_FORMAT_NOTE2="Dans tous les cas, vous avez également la possibilité de choisir un format standard internationnal, personnalisable avec un séparateur."
COM_ICAGENDA_DATE_FORMAT_DEFAULT="Langue par défaut"
COM_ICAGENDA_DATE_FORMAT_CURRENT="Dans votre language actuel"
COM_ICAGENDA_DATE_FORMAT_ISO="Format de date international (ISO)"
COM_ICAGENDA_DATE_FORMAT_SEPARATOR="Formats de date mondiales avec séparateur"
COM_ICAGENDA_DATE_FORMAT_DMY="DMY (jour, mois, année)"
COM_ICAGENDA_DATE_FORMAT_MDY="MDY (mois, jour, année)"
COM_ICAGENDA_DATE_FORMAT_YMD="YMD (année, mois, jour)"

; Selection of the Theme Pack layout for calendar module
COM_ICAGENDA_THEME_PACK_LBL="Thème graphique"
COM_ICAGENDA_THEME_PACK_DESC="Sélectionnez le Theme Pack iCagenda à utiliser pour la mise en page du contenu (liste des évènements et vue détaillée)."

COM_ICAGENDA_LBL_TEMPLATE="Thème graphique"
COM_ICAGENDA_DESC_TEMPLATE="Choisir le thème graphique à appliquer à la page"
COM_ICAGENDA_LBL_DATE_SEPARATOR="Séparateur dates"
COM_ICAGENDA_DESC_DATE_SEPARATOR="Séparateur pour les dates (uniquement pour les formats de date contenant | )"
COM_ICAGENDA_DESC_DATE_COMPONENTS_SEPARATOR="Séparateur des éléments de la date (remplace l'espace insécable '␣')"
COM_ICAGENDA_LBL_MWIDTH="Largeur de la carte"
COM_ICAGENDA_DESC_MWIDTH="Choisir la largeur de la carte (en px ou %)"
COM_ICAGENDA_LBL_MHEIGHT="Hauteur de la carte"
COM_ICAGENDA_DESC_MHEIGHT="Choisir la hauteur de la carte (en px ou %)"

; Newsletter
COM_ICAGENDA_TITLE_NEWSLETTER="Newsletter"
COM_ICAGENDA_TITLE_MAIL="Envoyer la newsletter"
COM_ICAGENDA_FORM_LBL_NEWSLETTER_LIST="Liste de diffusion"
COM_ICAGENDA_FORM_DESC_NEWSLETTER_LIST="liste de diffusion à utiliser pour l'envoie d'informations concernant tous les évènements"
COM_ICAGENDA_FORM_LBL_NEWSLETTER_OBJ="Sujet"
COM_ICAGENDA_FORM_DESC_NEWSLETTER_OBJ="Renseigner le sujet du mail"
COM_ICAGENDA_NEWSLETTER_NO_OBJ_ALERT="Veuillez compléter l'objet du mail !"
COM_ICAGENDA_FORM_LBL_NEWSLETTER_BODY="Contenu"
COM_ICAGENDA_FORM_DESC_NEWSLETTER_BODY="Le contenu de la Newsletter"
COM_ICAGENDA_NEWSLETTER_NO_BODY_ALERT="Veuillez compléter le corps du message !"
COM_ICAGENDA_NEWSLETTER_ERROR_ALERT="Erreur: Échec lors de l'envoi de l'email !"
COM_ICAGENDA_NEWSLETTER_SUCCESS="Newsletter envoyée avec succès !"
COM_ICAGENDA_NEWSLETTER_NB_EMAIL_SEND="Nb d'emails envoyés"
COM_ICAGENDA_NEWSLETTER_NB_EMAIL_NOT_SEND="%s emails dupliqués non envoyés."
COM_ICAGENDA_NEWSLETTER_NO_EVENT_SELECTED="Veuillez sélectionner l'évènement et la date"
COM_ICAGENDA_NEWSLETTER_NO_DATE_SELECTED="Veuillez sélectionner la date"
ICAGENDA_JTOOLBAR_SEND="Envoyer"

; Themes
COM_ICAGENDA_THEMES="Thèmes"
COM_ICAGENDA_THEME_MANAGER="Gestion des Thème Packs"
COM_ICAGENDA_TITLE_THEMES="Thèmes"
COM_ICAGENDA_UPLOAD_THEME_PACKAGE_FILE="Pack de Thème à envoyer"
COM_ICAGENDA_UPLOAD_FILE="Archive"
COM_ICAGENDA_UPLOAD_FILE="Archive"
COM_ICAGENDA_INSTALL="Installer"
COM_ICAGENDA_UPLOAD_AND_INSTALL="Envoyer & Installer"
COM_ICAGENDA_THEMES_LIST_TITLE="Packs de thème installés"
COM_ICAGENDA_THEME_INSTALLED_VERSION="Version installée"
COM_ICAGENDA_THEME_LATEST_VERSION="Dernière version"
COM_ICAGENDA_THEME_NO_PREVIEW="Aperçu non disponible"
COM_ICAGENDA_THEME_AUTHOR="Auteur"
COM_ICAGENDA_THEME_AUTHOR_WEBSITE="Site internet"
COM_ICAGENDA_THEME_UPDATE="Mise à Jour vers la version"
COM_ICAGENDA_THEME_AUTHOR_CONTACT="Merci de contacter l'auteur du thème pour connaître la dernière version"
COM_ICAGENDA_THEME_LATEST="Vous avez la dernière version"
COM_ICAGENDA_THEME_NB_THEMES_1="Il y a"
COM_ICAGENDA_THEME_NB_THEMES_2="thème(s) installé(s)"
COM_ICAGENDA_THEME_UNKNOWN="inconnue"
COM_ICAGENDA_CLICK_TO_ENLARGE="Cliquer pour agrandir"

; Theme Packs Installation messages
COM_ICAGENDA_ERROR="Erreur"
COM_ICAGENDA_SUCCESS_THEME_INSTALLED="Thème installé avec succès !"
COM_ICAGENDA_ERROR_THEME_APPLICATION_AREA="Erreur lors de l'installation du Thème !"
COM_ICAGENDA_ERROR_FIND_INSTALL_PACKAGE="Impossible de trouver le pack d'installation"
COM_ICAGENDA_ERROR_INSTALL_PATH_NOT_EXISTS="Le chemin de l'installation n'existe pas"
COM_ICAGENDA_ERROR_FIND_INFO_INSTALL_PACKAGE="Impossible de trouver les informations demandées dans le pack d'installation"
COM_ICAGENDA_ERROR_INSTALL_FILE_UPLOAD="Installation impossible. Vérifier vos droits d'Upload"
COM_ICAGENDA_ERROR_INSTALL_ZLIB="L'installeur ne peut pas continuer tant que Zlib n'est pas installé."
COM_ICAGENDA_ERROR_NO_FILE_SELECTED="Aucun fichier sélectionné"
COM_ICAGENDA_ERROR_UPLOAD_FILE="Il y a eu une erreur pendant l'upload du fichier sur le serveur."
COM_ICAGENDA_ERROR_NO_THEME_FILE="Aucun fichier thème pour iCagenda"
COM_ICAGENDA_ERROR_XML_INSTALL_ICAGENDA="Erreur: Impossible de trouver un fichier d'installation XML valide pour iCagenda."
COM_ICAGENDA_ERROR_XML_INSTALL="Erreur: Impossible de trouver un fichier d'installation XML dans ce pack."
COM_ICAGENDA_FOLDER_NOT_EXISTS="Le répertoire n'existe pas"
COM_ICAGENDA_ERROR_COPY_FOLDER_TO="Echec lors de la copie dans le répertoire"
COM_ICAGENDA_FILE_NOT_EXISTS="Le fichier n'existe pas"
COM_ICAGENDA_ERROR_COPY_FILE_TO="Echec lors de la copie du fichier vers"
COM_ICAGENDA_ERROR_INSTALL_FILE="Erreur: Problème pendant l'installation du pack"

; Locations (futur release ?)
COM_ICAGENDA_TITLE_LOCATIONS="Lieux"
COM_ICAGENDA_LOCATIONS_NAME="Nom"
COM_ICAGENDA_LOCATIONS_CITY="Ville"
COM_ICAGENDA_LOCATIONS_ADDRESS="Adresse"

; Location (futur release ?)
COM_ICAGENDA_TITLE_LOCATION="Lieu"
COM_ICAGENDA_FORM_LBL_LOCATION_NAME="Nom"
COM_ICAGENDA_FORM_DESC_LOCATION_NAME="Nom qui identifie le lieu où se déroulera l'évènement"
COM_ICAGENDA_FORM_LBL_LOCATION_CITY="Ville"
COM_ICAGENDA_FORM_DESC_LOCATION_CITY="Ville, ou commune (de préférence sous la forme: 'ile de france (Paris)')"
COM_ICAGENDA_FORM_LBL_LOCATION_ADDRESS="Adresse"
COM_ICAGENDA_FORM_DESC_LOCATION_ADDRESS="Adresse complète, rue, numéro, ville, région, pays etc..."
COM_ICAGENDA_FORM_LBL_LOCATION_DESC="Description"
COM_ICAGENDA_FORM_DESC_LOCATION_DESC="Courte description du lieu"

; Panel
COM_ICAGENDA_PANEL_ICAGENDA="iCagenda"
COM_ICAGENDA_FORM_LBL_EVENT_PARAMS="Paramètres"
COM_ICAGENDA_TITLE_ICAGENDA="Accueil de l'agenda"
COM_ICAGENDA_TITLE_ICAGENDA_IMAGE="<img src='../media/com_icagenda/images/blanck.png'/ alt='' >"
COM_ICAGENDA_PANEL_EVENT_MANAGER="Gestion des évènements"
COM_ICAGENDA_PANEL_REGIST_MANAGER="Gestion des inscriptions"
COM_ICAGENDA_PANEL_UPDATE_LOGS="Journal des MàJ"
COM_ICAGENDA_FEATURES_BACKEND="<b>Back-End :</b> Gestion par catégories, créations d'évènements, gestion des inscriptions, newsletter..."
COM_ICAGENDA_FEATURES_FRONTEND="<b>Front-End :</b> Inscription aux évènements, partage sur les réseaux sociaux, carte GoogleMaps, choix du thème graphique..."
COM_ICAGENDA_PANEL_TEXT="<p><i>Basé sur xCal 2 (bêta) créé par JonxDuo.</i><br/>Cette extension est maintenant développé sous le nom <b>iCagenda</b>.<br/>Le but de ce nouveau projet, avec l'aimable autorisation de son créateur original, est de permettre à une nouvelle équipe de poursuivre le développement de cette extension vers une version stable et évolutive. iCagenda sera suivi pour être compatible avec la prochaine version STS 3.0 de joomla!® et ses versions futures.<br/>Un Merci très spécial à <i>JonxDuo</i> pour tout son travail effectué.</p>"
COM_ICAGENDA_PANEL_CATEGORY="Liste des<br/>catégories"
COM_ICAGENDA_PANEL_NEW_CATEGORY="Ajouter<br/>une catégorie"
COM_ICAGENDA_PANEL_EVENTS="Liste des<br/>évènements"
COM_ICAGENDA_PANEL_NEW_EVENT="Ajouter<br/>un évènement"
COM_ICAGENDA_PANEL_LOCATIONS="Lieux"
COM_ICAGENDA_PANEL_NEW_LOCATION="Ajouter un Lieu"
COM_ICAGENDA_PANEL_REGISTRATION="Inscriptions"
COM_ICAGENDA_PANEL_NEWSLETTER="Newsletter"
COM_ICAGENDA_ADDITIONALS_LABEL="Suppléments"
COM_ICAGENDA_PANEL_CUSTOMFIELDS="Champs personnalisés"
COM_ICAGENDA_PANEL_FEATURES="Caractéristiques"
COM_ICAGENDA_PANEL_THEMES="Installer un Pack de Thème"
COM_ICAGENDA_PANEL_ALERT="En construction... Bientôt disponible!"
COM_ICAGENDA_PANEL_UPDATE_AND_INFOS=" Infos & Mises à Jour"
COM_ICAGENDA_INFO="Info"
COM_ICAGENDA_VERSION="Version"
COM_ICAGENDA_COPYRIGHT="Copyright"
COM_ICAGENDA_LICENSE="Licence"
COM_ICAGENDA_LIBRARIES="Librairies"
COM_ICAGENDA_NEWS="Config. Minimum<br>& Actualités"
COM_ICAGENDA_DONATE="Faire un Don via PayPal"
COM_ICAGENDA_TRANSLATOR="Traducteur"
COM_ICAGENDA_PANEL_TRANSLATION="Crédits Traductions"
COM_ICAGENDA_PANEL_TRANSLATION_PACKS="Packs de langue"
COM_ICAGENDA_PANEL_TRANSLATION_PACKS_DONWLOAD="Télécharger un Pack de langue"
COM_ICAGENDA_PANEL_SITE_VISIT="Rendez-nous visite sur le site "
COM_ICAGENDA_PANEL_HELP_FORUM="Forum d'Aide"
COM_ICAGENDA_PANEL_LEAD_DEVELOPER="Développeur principal"
COM_ICAGENDA_PANEL_DEVELOPMENT_AID="Aide au développement"
COM_ICAGENDA_PANEL_BETATESTER="Beta-testeurs"
COM_ICAGENDA_PANEL_TEAM="iCagenda Team et les membres du forum"
COM_ICAGENDA_PANEL_THANKS="Merci à toutes et tous de votre participation au projet!"
COM_ICAGENDA_PANEL_VERSION="Votre version"
COM_ICAGENDA_PANEL_DATE="Date"
COM_ICAGENDA_PANEL_COPYRIGHT="Tous Droits Réservés.<br />iCagenda&trade; est un logiciel libre, distribué sous les termes de la licence GNU General Public 3 ou supérieures; lire LICENSE.txt<br />Si vous utilisez iCagenda&trade;, merci de voter et d'ajouter un commentaire sur le JED : "
COM_ICAGENDA_PANEL_FREE_VERSION="Vous avez la version gratuite d'iCagenda&trade;. Désactivez le copyright 'Powered by iCagenda', en achetant la version Pro. Il n'y a pas d'autres limitations dans les fonctionnalités, mais en achetant une version pro vous nous aider à poursuivre le développement de cette extension."
COM_ICAGENDA_PANEL_PRO_VERSION="Avec un compte Pro, vous aurez accès à"
COM_ICAGENDA_PANEL_PRO_MODULE_IC_EVENT_LIST="iC Event List Module"
COM_ICAGENDA_PURCHASE="ACHETER LA VERSION PRO"
COM_ICAGENDA_PURCHASE_1_YEAR="PRO 12 MOIS"
COM_ICAGENDA_PURCHASE_UNLIMITED="PRO ILLIMITÉ"
COM_ICAGENDA_VERSIONS_COMPARISON="Comparaison des versions"
COM_ICAGENDA_VIDEO_GETTING_STARTED="Premiers pas avec iCagenda "
COM_ICAGENDA_VIDEO_TUTORIALS="Tutoriels vidéo"
COM_ICAGENDA_PANEL_CONTRIBUTORS="Contributeurs iCagenda"
COM_ICAGENDA_PANEL_SPECIAL_THANKS="Merci pour leur aide au développement sur des points importants!"
COM_ICAGENDA_PANEL_THANKS_TEXT="Nous tenons à remercier nos contributeurs, dont les efforts font de ce logiciel ce qu'il est. Ces personnes ont aidé par le temps qu'ils ont offert à ce projet. Ils ont participé à la création d'une communauté des utilisateurs d'iCagenda. iCagenda est disponible dans le monde entier; un grand merci aux traducteurs!"
COM_ICAGENDA_PANEL_TEAM_1="Didacticiels vidéo, coordinateur italien, modérateur général"
COM_ICAGENDA_PANEL_TEAM_2="Bêta-Testeur principal, modérateur général"
COM_ICAGENDA_PANEL_TEAM_3="Modérateurs du forum"
COM_ICAGENDA_PANEL_TEAM_CODE_CONTRIBUTORS="Contributeurs code"


; Traductions dates.js
SA="Sa"
SU="Di"
MO="Lu"
TU="Ma"
WE="Me"
TH="Je"
FR="Ve"

; Traductions textes timepiker.js
COM_ICAGENDA_TP_CURRENT="Maintenant"
COM_ICAGENDA_TP_CLOSE="Valider"
COM_ICAGENDA_TP_TITLE="Choisir l'horaire"
COM_ICAGENDA_TP_TIME="Horaire"
COM_ICAGENDA_TP_HOUR="Heure"
COM_ICAGENDA_TP_MINUTE="Minute"

; iCagenda Live Update
LIVEUPDATE_INSTALL_ERROR="Erreur lors de l'installation %s"
LIVEUPDATE_INSTALL_SUCCESS="Installation %s effectuée avec succès."
LIVEUPDATE_INSTALL_TYPE_COMPONENT="du composant"
LIVEUPDATE_INSTALL_TYPE_FILE="du fichier"
LIVEUPDATE_INSTALL_TYPE_LANGUAGE="de la langue"
LIVEUPDATE_INSTALL_TYPE_LIBRARY="de la bibliothèque"
LIVEUPDATE_INSTALL_TYPE_MODULE="du module"
LIVEUPDATE_INSTALL_TYPE_PACKAGE="du paquet"
LIVEUPDATE_INSTALL_TYPE_PLUGIN="du plug-in"
LIVEUPDATE_INSTALL_TYPE_TEMPLATE="du template"

; iCagenda Live Update
LIVEUPDATE_ERROR_NEEDS_PRO_ID="Pour activer le bouton de mise à jour, vous devez indiquer dans les paramètres d'iCagenda votre licence Pro ID de mise à jour."
LIVEUPDATE_NAGSCREEN_HEAD_ICAGENDA="ATTENTION! Vous êtes sur le point d'installer une version beta-test d'iCagenda."
LIVEUPDATE_NAGSCREEN_VERSION_ICAGENDA="Version de test et de développement(iCagenda %s - %s)."
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ALERT_TOP="Le cycle de vie d'une version d'un logiciel comprend différentes phases de développement, de tests et de maturité."
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ICAGENDA_ALPHA="Alpha"
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ALERT_ALPHA="risque d'instabilité pouvant causer des problèmes de fonctionnement ou des pertes de données."
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ICAGENDA_BETA="Bêta"
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ALERT_BETA="a généralement plus de bugs que la version finale, et est susceptible de générer des problèmes de rapidité/performance."
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ICAGENDA_RC="RC (Version admissible ou pre-release)"
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ALERT_RC="est mise à disposition à des fins de « tests de dernière minute » visant à déceler les toutes dernières erreurs subsistant au sein du programme."
LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ALERT_BOTTOM="Si vous n'êtes pas sûr de ce que vous êtes sur le point de faire, merci de cliquer sur le bouton 'Retour'.<br />Si vous êtes absolument certain de comprendre les risques liés à l'installation d'une version dite de test, vous pouvez cliquer sur le bouton ci-dessous et poursuivre l'installation de cette mise à jour."
LIVEUPDATE_NAGSCREEN_FOOTER_ICAGENDA="infos:"

; Admin Permissions
COM_ICAGENDA_ACCESS_VIEW_CATEGORIES=" Accès à l'administration des catégories"
COM_ICAGENDA_ACCESS_VIEW_CATEGORIES_DESC="Droit d'accès à l'administration des catégories du composant iCagenda"
COM_ICAGENDA_ACCESS_VIEW_EVENTS=" Accès à l'administration des évènements"
COM_ICAGENDA_ACCESS_VIEW_EVENTS_DESC="Droit d'accès à l'administration des évènements du composant iCagenda"
COM_ICAGENDA_ACCESS_VIEW_REGISTRATIONS=" Accès à l'administration des inscriptions"
COM_ICAGENDA_ACCESS_VIEW_REGISTRATIONS_DESC="Droit d'accès à l'administration des inscriptions du composant iCagenda"
COM_ICAGENDA_ACCESS_VIEW_NEWSLETTER=" Accès à l'administration de la newsletter"
COM_ICAGENDA_ACCESS_VIEW_NEWSLETTER_DESC="Droit d'accès à l'administration de la newsletter du composant iCagenda"
COM_ICAGENDA_ACCESS_VIEW_THEMES=" Accès à l'administration des Thème Packs"
COM_ICAGENDA_ACCESS_VIEW_THEMES_DESC="Droit d'accès à l'administration des Thème Packs du composant iCagenda"
COM_ICAGENDA_ACCESS_VIEW_CUSTOMFIELDS=" Accès à l'administration des champs personnalisés"
COM_ICAGENDA_ACCESS_VIEW_CUSTOMFIELDS_DESC="Droit d'accès à l'administration des champs personnalisés du composant iCagenda"
COM_ICAGENDA_ACCESS_VIEW_FEATURES=" Accès à l'administration des caractéristiques"
COM_ICAGENDA_ACCESS_VIEW_FEATURES_DESC="Droit d'accès à l'administration des caractéristiques du composant iCagenda"

COM_ICAGENDA_FEATURES_ICONSIZE_LIST_LABEL="Liste - Taille Icônes Caractéristiques"
COM_ICAGENDA_FEATURES_ICONSIZE_LIST_DESC="Sélectionner la taille des icônes caractéristique dans la liste principale des évènements."
COM_ICAGENDA_FEATURES_ICONSIZE_EVENT_LABEL="Détails - Taille Icônes Caractéristiques"
COM_ICAGENDA_FEATURES_ICONSIZE_EVENT_DESC="Sélectionner la taille des icônes caractéristique dans la vue détaillée d'un évènement."
COM_ICAGENDA_FEATURES_ICONSIZE_NONE="Ne pas afficher les icônes"
COM_ICAGENDA_FEATURES_ICONSIZE_16="Icône 16 px"
COM_ICAGENDA_FEATURES_ICONSIZE_24="Icône 24 px"
COM_ICAGENDA_FEATURES_ICONSIZE_32="Icône 32 px"
COM_ICAGENDA_FEATURES_ICONSIZE_48="Icône 48 px"
COM_ICAGENDA_FEATURES_ICONSIZE_64="Icône 64 px"
COM_ICAGENDA_SHOW_FEATURE_ICON_TITLE_LABEL="Afficher le titre des icônes?"
COM_ICAGENDA_SHOW_FEATURE_ICON_TITLE_DESC="Sélectionner si la valeur saisie pour l'attribut ALT de l'image de l'icône sera également utilisé comme attribut TITLE (pour fournir une valeur à l'info-bulle au passage de la souris)."

; Override the 'do not use' value for the icon file selector drop-down list
JOPTION_DO_NOT_USE="- Icône facultative -"

; Common Strings for Modules
ICAGENDA_FILTERING_SHORTDESC_LABEL="Filtrage HTML Auto-Introduction"
ICAGENDA_FILTERING_SHORTDESC_DESC="Détermine la façon dont le code HTML sera filtré dans l'Auto-Introduction."
ICAGENDA_GLOBAL_OPTION="Utiliser les paramètres généraux d'iCagenda"
ICAGENDA_FILTERING_NO_HTML="Aucun code HTML"
ICAGENDA_FILTERING_ALL_ITALIC="Tout en italique"

ICAGENDA_AUTO_INTROTEXT_LIMIT_LABEL="Nb Max. de caractères Auto-Introduction"
ICAGENDA_AUTO_INTROTEXT_LIMIT_DESC="Nombre maximum de caractères pour générer le texte d'introduction automatique de l'évènement (si utilisé)."


;
; DEPRECATED
;
ICEVENT="Évènement"
ICEVENTS="Évènements"
language/fr-FR/fr-FR.com_privacy.ini000060400000045525152453623440013211 0ustar00; @date        2018-09-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_PRIVACY="Confidentialité"
COM_PRIVACY_ACTION_DELETE_DATA="Effacer les données"
COM_PRIVACY_ACTION_EMAIL_EXPORT_DATA="Exportation de données par e-mail"
COM_PRIVACY_ACTION_EXPORT_DATA="Exportation des données"
COM_PRIVACY_ACTION_LOG_ADMIN_COMPLETED_REQUEST="L'utilisateur <a href='{accountlink}'>{username}</a> a complété <a href='{itemlink}'>une demande d'informations #{id}</a> concernant {subjectemail}"
COM_PRIVACY_ACTION_LOG_ADMIN_CREATED_REQUEST="L'utilisateur <a href='{accountlink}'>{username}</a> a créé <a href='{itemlink}'>une demande d'informations #{id}</a> concernant {subjectemail}"
COM_PRIVACY_ACTION_LOG_ADMIN_INVALIDATED_REQUEST="L'utilisateur <a href='{accountlink}'>{username}</a> a invalidé <a href='{itemlink}'>la demande d'informations #{id}</a> concernant {subjectemail}"
COM_PRIVACY_ACTION_LOG_CONFIRMED_REQUEST="{subjectemail} a confirmé <a href='{itemlink}'>la demande d'informations  #{id}</a>"
COM_PRIVACY_ACTION_LOG_CREATED_REQUEST="{subjectemail} a soumis <a href='{itemlink}'>une demande d'informations  #{id}</a>"
COM_PRIVACY_ACTION_LOG_EXPORT="L'utilisateur <a href='{accountlink}'>{username}</a> a exporté les données concernant <a href='{itemlink}'>la demande d'informations #{id}</a>"
COM_PRIVACY_ACTION_LOG_EXPORT_EMAILED="L'utilisateur <a href='{accountlink}'>{username}</a> a envoyé par mail les données exportées concernant <a href='{itemlink}'>la demande d'informations #{id}</a> au destinataire"
COM_PRIVACY_ACTION_LOG_REMOVE="L'utilisateur <a href='{accountlink}'>{username}</a> a supprimé les données concernant <a href='{itemlink}'>la demande d'informations #{id}</a>"
COM_PRIVACY_ACTION_LOG_REMOVE_BLOCKED="L'utilisateur <a href='{accountlink}'>{username}</a> a tenter de supprimer les données concernant <a href='{itemlink}'>sa demande d'informations #{id}</a> mais l'action a été bloquée"
COM_PRIVACY_ACTION_VIEW="Afficher le consentement"
COM_PRIVACY_BADGE_URGENT_REQUEST="Urgent"
COM_PRIVACY_CONFIGURATION="Confidentialité : Paramètres"
COM_PRIVACY_CONSENTS_FILTER_STATE="État des consentements"
COM_PRIVACY_CONSENTS_FILTER_SUBJECT="Sujet"
COM_PRIVACY_CONSENTS_INVALIDATED_ALL="Tous les consentements de ce sujet ont été invalidés."
COM_PRIVACY_CONSENTS_STATE_INVALIDATED="Consentement invalidé"
COM_PRIVACY_CONSENTS_STATE_OBSOLETE="Consentement obsolète"
COM_PRIVACY_CONSENTS_STATE_VALID="Consentement valide"
COM_PRIVACY_CONSENTS_SUBJECT_DEFAULT="Tous les sujets"
COM_PRIVACY_CONSENTS_TOOLBAR_INVALIDATE_ALL="Invalider tous les consentements"
COM_PRIVACY_CONSENTS_TOOLBAR_INVALIDATE_ALL_CONFIRM_MSG="Voulez-vous vraiment invalider tous les consentements du sujet sélectionné? Cela obligera les utilisateurs à donner à nouveau leur consentement."
COM_PRIVACY_CONSENTS_TOOLBAR_INVALIDATE="Invalider le consentement"
COM_PRIVACY_CONSENTS_TOOLBAR_INVALIDATE_CONFIRM_MSG="Voulez-vous vraiment invalider les consentements sélectionnés? Cela obligera les utilisateurs à donner à nouveau leur consentement."
COM_PRIVACY_CORE_CAPABILITY_COMMUNICATION_WITH_JOOMLA_ORG="Lorsqu'une connexion réseau est disponible, une installation Joomla tentera de communiquer avec les serveurs joomla.org pour diverses fonctionnalités, notamment&nbsp;:<ul><li>Recherche de mises à jour pour l'application Joomla</li><li>Écrans d'aide pour les extensions du noyau de Joomla</li><li>Le service d'installation à partir du Web (option)</li><li>Le serveur de collecte de statistiques (option)</li></ul>Comme pour toutes les requêtes HTTP, l'adresse IP de votre serveur sera transmise dans le cadre de la requête. Pour plus d'informations sur la façon dont Joomla traite les données sur ses serveurs, veuillez consulter notre <a href=\"https://www.joomla.org/privacy-policy.html\" target=\"_blank\" rel=\"noopener noreferrer\">politique de confidentialité</a>."
; The placeholder for this key is the configured log path for the site.
COM_PRIVACY_CORE_CAPABILITY_LOGGING_IP_ADDRESS="Le système de journalisation de Joomla enregistre l'adresse IP du visiteur qui a conduit à l'écriture d'un message dans ses fichiers journaux. Ces fichiers journaux sont utilisés pour enregistrer diverses activités sur un site Joomla, y compris les informations relatives aux mises à jour de base, les tentatives de connexion non valides, les erreurs non gérées, et des informations de développement telles que l'utilisation d'API obsolètes. Le format de ces fichiers journaux peuvent être personnalisés par toute extension qui configure une journalisation, nous vous encourageons donc à télécharger et consulter les fichiers journaux pour votre site web qui peut être trouvé à '%s'."
COM_PRIVACY_CORE_CAPABILITY_SESSION_IP_ADDRESS_AND_COOKIE="Toutes les demandes adressées à un site Web Joomla lancent une session qui stocke l'adresse IP dans les données de session et crée un cookie de session dans le navigateur de l'utilisateur. L'adresse IP est utilisée comme mesure de sécurité pour protéger contre les potentielles attaques de détournement de session. Ces informations sont supprimées une fois la session expirée et ses données purgées. Le nom du cookie de session est basé sur un code de hachage généré aléatoirement et n'a donc pas d'identifiant constant. Le cookie de session est détruit une fois la session expirée ou lorsque l'utilisateur quitte son navigateur."
COM_PRIVACY_DASHBOARD_BADGE_ACTIVE_REQUESTS_0="<span class=\"badge badge-info\">%d</span> demande active"
COM_PRIVACY_DASHBOARD_BADGE_ACTIVE_REQUESTS_1="<span class=\"badge badge-warning\">%d</span> demande active"
COM_PRIVACY_DASHBOARD_BADGE_ACTIVE_REQUESTS_MORE="<span class=\"badge badge-warning\">%d</span> demandes actives"
COM_PRIVACY_DASHBOARD_BADGE_TOTAL_REQUESTS_0="<span class=\"badge badge-info\">%d</span> demande au total"
COM_PRIVACY_DASHBOARD_BADGE_TOTAL_REQUESTS_1="<span class=\"badge badge-info\">%d</span> demande au total"
COM_PRIVACY_DASHBOARD_BADGE_TOTAL_REQUESTS_MORE="<span class=\"badge badge-info\">%d</span> demandes au total"
COM_PRIVACY_DASHBOARD_HEADING_CHECK="Items"
COM_PRIVACY_DASHBOARD_HEADING_REQUEST_COUNT="# de demandes"
COM_PRIVACY_DASHBOARD_HEADING_REQUEST_STATUS="Statut"
COM_PRIVACY_DASHBOARD_HEADING_REQUEST_TYPE="Type de demande"
COM_PRIVACY_DASHBOARD_HEADING_STATUS="Statut"
COM_PRIVACY_DASHBOARD_HEADING_STATUS_CHECK="Vérification du statut"
COM_PRIVACY_DASHBOARD_HEADING_TOTAL_REQUEST_COUNT="Nombre total de demandes"
COM_PRIVACY_DASHBOARD_NO_REQUESTS="Il n'y a aucune demande."
COM_PRIVACY_DASHBOARD_VIEW_REQUESTS="Afficher les demandes"
COM_PRIVACY_DATA_REMOVED="Données supprimées"
COM_PRIVACY_EDIT_PRIVACY_CONSENT_PLUGIN="Modifier le plugin Consentement à la politique de confidentialité"
COM_PRIVACY_EDIT_PRIVACY_POLICY="Modifier la politique de confidentialité"
COM_PRIVACY_EXTENSION_CAPABILITY_PERSONAL_INFO="Afin de traiter les demandes d'informations, des renseignements sur l'utilisateur doivent être collectées et consignées dans le but de conserver un journal d'audit. Le système de demande est basé sur l'adresse e-mail d'un individu qui sera utilisée pour lier si possible la demande à un utilisateur existant du site"
; You can use the following merge codes for all COM_PRIVACY_EMAIL strings:
; [SITENAME]  Site name, as set in Global Configuration.
; [URL]       URL of the site's frontend page.
; [TOKENURL]  URL of the confirm page with the token prefilled.
; [FORMURL]   URL of the confirm page where the user can paste their token.
; [TOKEN]     The confirmation token.
; \n          Newline character. Use it to start a new line in the email.
COM_PRIVACY_EMAIL_ADMIN_REQUEST_BODY_EXPORT_REQUEST="Un administrateur du site [URL] a créé une demande pour exporter toutes les informations personnelles liées à cette adresse e-mail. Par mesure de sécurité, vous devez confirmer qu'il s'agit d'une demande valide d'obtention de vos informations personnelles sur ce site Web.n\n\S'il s'agit d'une erreur, ignorer le mail et cela n'aura aucune conséquence.\n\nPour confirmer cette demande, vous pouvez effectuer l'une des tâches suivantes:\n\n1. Visiter l'URL suivante : [TOKENURL]\n\n2. Copier votre identifiant de sécurité ci-dessous, visiter l'URL référencée et coller cet identifiant dans le formulaire.\nURL: [FORMURL]\nIdentifiant de sécurité : [TOKEN]\n\nVeuillez noter que cet identifiant n'est valide que pendant 24 heures à compter de la date d'envoi de cet e-mail."
COM_PRIVACY_EMAIL_ADMIN_REQUEST_BODY_REMOVE_REQUEST="Un administrateur du site [URL] a créé une demande pour supprimer toutes les informations personnelles liées à cette adresse e-mail. Par mesure de sécurité, vous devez confirmer qu'il s'agit d'une demande valide d'obtention de vos informations personnelles sur ce site Web.n\n\S'il s'agit d'une erreur, ignorer le mail et cela n'aura aucune conséquence.\n\nPour confirmer cette demande, vous pouvez effectuer l'une des tâches suivantes:\n\n1. Visiter l'URL suivante : [TOKENURL]\n\n2. Copier votre identifiant de sécurité ci-dessous, visiter l'URL référencée et coller cet identifiant dans le formulaire.\nURL: [FORMURL]\nIdentifiant de sécurité : [TOKEN]\n\nVeuillez noter que cet identifiant n'est valide que pendant 24 heures à compter de la date d'envoi de cet e-mail."
COM_PRIVACY_EMAIL_ADMIN_REQUEST_SUBJECT_EXPORT_REQUEST="Demande d'informations créée sur [SITENAME]"
COM_PRIVACY_EMAIL_ADMIN_REQUEST_SUBJECT_REMOVE_REQUEST="Demande de suppression d'informations sur [SITENAME]"
COM_PRIVACY_EMAIL_DATA_EXPORT_COMPLETED_BODY="Un administrateur du site [URL] a terminé l'exportation des données que vous avez demandée et une copie des informations peut être trouvée dans le fichier joint à ce message."
COM_PRIVACY_EMAIL_DATA_EXPORT_COMPLETED_SUBJECT="Exportations des donnés [SITENAME]"
COM_PRIVACY_ERROR_ACTIVE_REQUEST_FOR_EMAIL="Il y a déjà une demande d'informations active pour cette adresse e-mail, la demande active doit être terminée avant de commencer une nouvelle."
COM_PRIVACY_ERROR_CANNOT_CREATE_REQUEST_FOR_SELF="Vous ne pouvez pas créer de demande d'informations pour vous-même."
COM_PRIVACY_ERROR_CANNOT_CREATE_REQUEST_WHEN_SENDMAIL_DISABLED="Les demandes d'informations ne peuvent pas être créées lorsque l'envoi d'e-mail est désactivé."
COM_PRIVACY_ERROR_CANNOT_EXPORT_UNCONFIRMED_REQUEST="Les données pour une demande non confirmée ne peuvent être exportées."
COM_PRIVACY_ERROR_CANNOT_REMOVE_DATA="Les données pour cette demande ne peuvent pas être supprimées."
COM_PRIVACY_ERROR_CANNOT_REMOVE_UNCONFIRMED_REQUEST="Les données pour une demande non confirmée ne peuvent être effacées."
COM_PRIVACY_ERROR_COMPLETE_TRANSITION_NOT_PERMITTED="Cet enregistrement ne peut pas être mis à jour avec le statut 'Terminé'."
COM_PRIVACY_ERROR_EXPORT_EMAIL_FAILED="L'exportation a échoué avec l'erreur suivante : %s"
COM_PRIVACY_ERROR_INVALID_TRANSITION_NOT_PERMITTED="Cet enregistrement ne peut pas être mis à jour avec le statut 'Invalide'."
COM_PRIVACY_ERROR_REMOVE_DATA_FAILED="La suppression a échoué avec l'erreur suivante : %s"
COM_PRIVACY_ERROR_REQUEST_ID_REQUIRED_FOR_EXPORT="L'ID de demande d'informations est requis pour exporter des données."
COM_PRIVACY_ERROR_REQUEST_ID_REQUIRED_FOR_REMOVE="L'ID de demande d'informations est requis pour effacer des données."
COM_PRIVACY_ERROR_REQUEST_TYPE_NOT_EXPORT="Seules les demandes d'exportation de données peuvent être exportées."
COM_PRIVACY_ERROR_REQUEST_TYPE_NOT_REMOVE="Seules les demandes de suppression peuvent avoir leurs données supprimées."
COM_PRIVACY_ERROR_UNKNOWN_REQUEST_TYPE="Type  inconnu de demande d'informations."
COM_PRIVACY_EXPORT_EMAILED="L'exportation de données a été envoyée par e-mail."
COM_PRIVACY_FIELD_REQUESTED_AT_LABEL="Date requise"
COM_PRIVACY_FIELD_REQUEST_TYPE_DESC="Le type de demande d'informations."
COM_PRIVACY_FIELD_REQUEST_TYPE_LABEL="Le type de demande"
COM_PRIVACY_FIELD_STATUS_DESC="Le statut de la demande d'informations."
COM_PRIVACY_FILTER_SEARCH_LABEL="Demandes de recherche"
COM_PRIVACY_HEADING_ACTION_LOG="Journal d'actions"
COM_PRIVACY_HEADING_ACTIONS="Actions"
COM_PRIVACY_HEADING_CONSENTS_BODY="Contenu"
COM_PRIVACY_HEADING_CONSENTS_CREATED="Date de création"
COM_PRIVACY_HEADING_CONSENTS_SUBJECT="Sujet"
COM_PRIVACY_HEADING_CORE_CAPABILITIES="Support du noyau Joomla"
COM_PRIVACY_HEADING_CREATED_ASC="Date de création ascendant"
COM_PRIVACY_HEADING_CREATED_DESC="Date de création descendant"
COM_PRIVACY_HEADING_EMAIL_ASC="E-mail ascendant"
COM_PRIVACY_HEADING_EMAIL_DESC="E-mail descendant"
COM_PRIVACY_HEADING_REQUEST_INFORMATION="Demande d'informations"
COM_PRIVACY_HEADING_REQUEST_TYPE="Type de demande"
COM_PRIVACY_HEADING_REQUEST_TYPE_ASC="Type de demande ascendant"
COM_PRIVACY_HEADING_REQUEST_TYPE_DESC="Type de demande descendant"
COM_PRIVACY_HEADING_REQUEST_TYPE_TYPE_EXPORT="Exporter"
COM_PRIVACY_HEADING_REQUEST_TYPE_TYPE_REMOVE="Effacer"
COM_PRIVACY_HEADING_REQUESTED_AT="Demandé"
COM_PRIVACY_HEADING_REQUESTED_AT_ASC="Demandé ascendant"
COM_PRIVACY_HEADING_REQUESTED_AT_DESC="Demandé descendant"
COM_PRIVACY_HEADING_STATUS_ASC="Statut ascendant"
COM_PRIVACY_HEADING_STATUS_DESC="Statut descendant"
COM_PRIVACY_HEADING_SUBJECT_ASC="Sujet ascendant"
COM_PRIVACY_HEADING_SUBJECT_DESC="Sujet descendant"
COM_PRIVACY_HEADING_USERID="ID de l'utilisateur"
COM_PRIVACY_HEADING_USERID_ASC="ID de l'utilisateur ascendant"
COM_PRIVACY_HEADING_USERID_DESC="ID de l'utilisateur descendant"
COM_PRIVACY_HEADING_USERNAME_ASC="Identifiant ascendant"
COM_PRIVACY_HEADING_USERNAME_DESC="Identifiant descendant"
COM_PRIVACY_MSG_CAPABILITIES_ABOUT_THIS_INFORMATION="À propos de cette information"
COM_PRIVACY_MSG_CAPABILITIES_INTRODUCTION="Les informations sur cet écran sont collectées à partir des extensions qui signalent leurs support à la confidentialité sur ce système. Il est destiné à aider les propriétaires de sites à connaître les fonctionnalités des extensions installées et à fournir des informations pour aider les propriétaires à créer des stratégies locales de site telles qu'une politique de confidentialité. Comme cet écran nécessite que les extensions supportent son système de reporting et n'affiche les informations que pour des extensions activées, cela ne doit pas être considéré comme une liste complète et vous êtes invité à consulter la documentation de chaque extension pour plus d'informations."
COM_PRIVACY_MSG_CAPABILITIES_NO_CAPABILITIES="Il n'y a aucun support d'extension signalé."
COM_PRIVACY_MSG_CONFIRM_EMAIL_SENT_TO_USER="Un e-mail de confirmation pour cette demande d'informations a été envoyé à l'utilisateur."
COM_PRIVACY_MSG_CONSENTS_NO_CONSENTS="Il n'y a pas de consentements enregistrés."
COM_PRIVACY_MSG_EXTENSION_NO_CAPABILITIES="Cette extension ne signale aucun support."
COM_PRIVACY_MSG_REQUESTS_NO_REQUESTS="Il n'y a aucune demande d'informations correspondant à votre requête."
COM_PRIVACY_N_CONSENTS_INVALIDATED="%s consentements ont été invalidés."
COM_PRIVACY_N_CONSENTS_INVALIDATED_1="%s consentement a été invalidé."
COM_PRIVACY_NOTIFY_DESC="Afficher une notification lorsqu'il y a des demandes antérieures au nombre de jours spécifié."
COM_PRIVACY_NOTIFY_LABEL="Nombre de jours pour considérer une demande comme urgente"
COM_PRIVACY_OPTION_LABEL="Paramètres"
COM_PRIVACY_POSTINSTALL_TITLE="Gestion accrue de la confidentialité des utilisateurs"
COM_PRIVACY_POSTINSTALL_BODY="<p>Avec l’introduction du GDPR pour les citoyens de l’UE et des réglementations similaires ailleurs dans le monde, il peut être nécessaire de demander un consentement avant de stocker les <strong>informations personnelles</strong> d'un utilisateur. </p><p>Joomla 3.9 introduit de nouvelles fonctionnalités pour vous aider à créer des politiques de confidentialité du site et à recueillir le consentement de l'utilisateur. En outre, une méthode de travail est disponible pour vous aider à gérer les demandes d'informations des utilisateur telles que les demandes de suppression de données personnelles de votre site. </p><p>Pour plus d'informations sur cette nouvelle fonctionnalité, consultez la <a href='https://docs.joomla.org/J3.x:Privacy' target='_new'>Documentation de confidentialité</a>.</p>"
COM_PRIVACY_REQUEST_COMPLETED="La demande est terminée."
COM_PRIVACY_REQUEST_INVALIDATED="La demande a été invalidée."
COM_PRIVACY_SELECT_REQUEST_TYPE="- Sélectionner un type de demande -"
COM_PRIVACY_SHOW_URGENT_REQUESTS="Afficher les demandes urgentes"
COM_PRIVACY_STATUS_CHECK_NOT_AVAILABLE="Inexistant"
COM_PRIVACY_STATUS_CHECK_OUTSTANDING_URGENT_REQUESTS="Demandes urgentes en suspens"
COM_PRIVACY_STATUS_CHECK_OUTSTANDING_URGENT_REQUESTS_DESCRIPTION="Demandes de plus de %d jours, tel que défini dans les paramètres du composant."
COM_PRIVACY_STATUS_CHECK_PRIVACY_POLICY_PUBLISHED="Politique de confidentialité"
COM_PRIVACY_STATUS_CHECK_REQUEST_FORM_MENU_ITEM_PUBLISHED="Élément de menu de formulaire de demande d'informations"
COM_PRIVACY_STATUS_CHECK_SENDMAIL_DISABLED="Envoi d'e-mail désactivé"
COM_PRIVACY_STATUS_CHECK_SENDMAIL_DISABLED_DESCRIPTION="Envoi d'e-mail doit être activé, il est nécessaire à l'utilisation du système de demande d'informations"
COM_PRIVACY_STATUS_CHECK_SENDMAIL_ENABLED="Envoi d'e-mail activé"
COM_PRIVACY_STATUS_COMPLETED="Terminé"
COM_PRIVACY_STATUS_CONFIRMED="Confirmé"
COM_PRIVACY_STATUS_INVALID="Invalide"
COM_PRIVACY_STATUS_PENDING="En suspens"
COM_PRIVACY_SEARCH_IN_EMAIL="Rechercher dans l'e-mail du demandeur. Préfixe avec ID: pour rechercher un identifiant de requête."
COM_PRIVACY_SEARCH_IN_USERNAME="Rechercher dans le nom d'utilisateur. Préfixe avec ID: pour rechercher un identifiant de consentement. Préfixe avec UID: pour rechercher l'ID d'un utilisateur."
COM_PRIVACY_SUBMENU_CAPABILITIES="Support"
COM_PRIVACY_SUBMENU_CONSENTS="Consentements"
COM_PRIVACY_SUBMENU_DASHBOARD="Tableau de bord"
COM_PRIVACY_SUBMENU_REQUESTS="Demandes"
COM_PRIVACY_TOOLBAR_COMPLETE="Completer"
COM_PRIVACY_TOOLBAR_INVALIDATE="Invalider"
COM_PRIVACY_USER_FIELD_EMAIL_DESC="L'adresse e-mail de la personne à laquelle appartiennent les informations demandées."
COM_PRIVACY_VIEW_CAPABILITIES="Confidentialité : Support des extensions"
COM_PRIVACY_VIEW_CONSENTS="Confidentialité : Consentements"
COM_PRIVACY_VIEW_DASHBOARD="Confidentialité : Tableau de bord"
COM_PRIVACY_VIEW_REQUEST_ADD_REQUEST="Confidentialité : Nouvelle demande d'informations"
COM_PRIVACY_VIEW_REQUEST_SHOW_REQUEST="Confidentialité : Vérification des demandes d'informations"
COM_PRIVACY_VIEW_REQUESTS="Confidentialité : demandes d'informations"
COM_PRIVACY_WARNING_CANNOT_CREATE_REQUEST_WHEN_SENDMAIL_DISABLED="Les demandes d'informations ne peuvent pas être créées lorsque l'envoi d'e-mail est désactivé."
COM_PRIVACY_XML_DESCRIPTION="Composant de gestion des actions liées à la confidentialité."
language/fr-FR/fr-FR.plg_quickicon_jcefilebrowser.sys.ini000060400000001130152453623440017407 0ustar00; fr-FR.plg_quickicon_jcefilebrowser.sys.ini 
; JCE Project - http://www.joomlacontenteditor.net
; Copyright (C) 2006 - 2015 Ryan Demmer - All rights reserved
; Traduction Mihàly Marti alias Sarki - http://www.sarki.ch/jce
; GNU/GPL Version 2 - http://www.gnu.org/licenses/gpl-2.0.html
; Note : All ini files need to be saved as UTF-8 - No BOM

PLG_QUICKICON_JCEFILEBROWSER="Icône Raccourci - Gestionnaire JCE"
PLG_QUICKICON_JCEFILEBROWSER_XML_DESCRIPTION="<div style='font-weight: normal;'>Icône de raccourci en page d´accueil de l´administration vers le gestionnaire de fichier de JCE.</div>"
language/fr-FR/fr-FR.plg_privacy_message.ini000060400000001156152453623440014711 0ustar00; @date        2018-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_PRIVACY_MESSAGE="Confidentialité - Messages Utilisateurs"
PLG_PRIVACY_MESSAGE_XML_DESCRIPTION="Responsable du traitement des demandes d'informations liées à la confidentialité pour les donnés des messages des utilisateurs de Joomla."
language/fr-FR/fr-FR.plg_editors-xtd_fields.sys.ini000060400000001475152453623440016145 0ustar00; @date        2017-02-06
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_EDITORS-XTD_FIELDS="Bouton - Champ"
PLG_EDITORS-XTD_FIELDS_XML_DESCRIPTION="Affiche un bouton qui permet d'insérer un champ personnalisé dans la zone de texte d'un éditeur. Affiche une fenêtre modale  permettant de choisir le champ.<br/><strong>Attention&nbsp;!&nbsp;: le champ personnalisé ne sera pas rendu si le plug-in <a href=\"index.php?option=com_plugins&view=plugins&filter[folder]=content\">Contenu - Champs</a> n'est pas activé."
language/fr-FR/fr-FR.mod_latestactions.ini000060400000001624152453623440014402 0ustar00; @date        2018-09-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


MOD_LATESTACTIONS="Derniers journaux des actions"
MOD_LATESTACTIONS_FIELD_COUNT_LABEL="Nombre"
MOD_LATESTACTIONS_FIELD_COUNT_DESC="Le nombre d'éléments à afficher (5 par défaut)."
MOD_LATESTACTIONS_LAYOUT_DEFAULT="Défaut"
MOD_LATEST_ACTIONS_NO_MATCHING_RESULTS="Aucun résultat correspondant"
MOD_LATESTACTIONS_TITLE="Dernières actions"
MOD_LATESTACTIONS_TITLE_1="Dernière action"
MOD_LATESTACTIONS_TITLE_MORE="%s dernières actions"
MOD_LATESTACTIONS_XML_DESCRIPTION="Ce module affiche une liste des actions les plus récentes."
language/fr-FR/fr-FR.com_weblinks.sys.ini000060400000003472152453623440014162 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_WEBLINKS="Liens web"
COM_WEBLINKS_CATEGORIES="Catégories"
COM_WEBLINKS_CATEGORIES_VIEW_DEFAULT_DESC="Affiche une liste des liens de toutes les catégories"
COM_WEBLINKS_CATEGORIES_VIEW_DEFAULT_OPTION="Défaut"
COM_WEBLINKS_CATEGORIES_VIEW_DEFAULT_TITLE="Liste des liens de toutes les catégories"
COM_WEBLINKS_CATEGORY_ADD_TITLE="Gestion des catégories - Ajouter une nouvelle catégorie"
COM_WEBLINKS_CATEGORY_EDIT_TITLE="Gestion des catégories: - Modifier une catégorie"
COM_WEBLINKS_CATEGORY_VIEW_DEFAULT_DESC="Affiche une liste des liens d'une catégorie"
COM_WEBLINKS_CATEGORY_VIEW_DEFAULT_OPTION="Défaut"
COM_WEBLINKS_CATEGORY_VIEW_DEFAULT_TITLE="Liste des liens d'une catégorie"
COM_WEBLINKS_CONTENT_TYPE_WEBLINK="Lien web"
COM_WEBLINKS_CONTENT_TYPE_CATEGORY="Catégorie de liens web"
COM_WEBLINKS_FIELD_SELECT_WEBLINK_DESC="Sélectionnez le lien web souhaité dans la liste."
COM_WEBLINKS_FIELD_SELECT_WEBLINK_LABEL="Sélectionnez un lien web"
COM_WEBLINKS_FORM_VIEW_DEFAULT_DESC="Affiche un formulaire pour soumettre un lien web"
COM_WEBLINKS_FORM_VIEW_DEFAULT_OPTION="Défaut"
COM_WEBLINKS_FORM_VIEW_DEFAULT_TITLE="Proposer un lien web"
COM_WEBLINKS_LINKS="Liens"
COM_WEBLINKS_TAGS_WEBLINK="Lien web"
COM_WEBLINKS_TAGS_CATEGORY="Catégorie de liens web"
COM_WEBLINKS_WEBLINK_VIEW_DEFAULT_DESC="N'afficher qu'un seul lien web."
COM_WEBLINKS_WEBLINK_VIEW_DEFAULT_TITLE="Lien web unique"
COM_WEBLINKS_XML_DESCRIPTION="Composant de gestion des liens web"

language/fr-FR/fr-FR.com_admin.sys.ini000060400000001530152453623440013425 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_ADMIN="Informations système"
COM_ADMIN_XML_DESCRIPTION="Composant d'administration - Informations système"

COM_ADMIN_HELP_VIEW_DEFAULT_DESC="Obtenir de l'aide concernant diverses pages dans votre interface administrateur."
COM_ADMIN_HELP_VIEW_DEFAULT_TITLE="Aide Joomla!"
COM_ADMIN_SYSINFO_VIEW_DEFAULT_DESC="Afficher des informations détaillées sur votre site Joomla et la configuration de votre serveur."
COM_ADMIN_SYSINFO_VIEW_DEFAULT_TITLE="Informations système"
language/fr-FR/fr-FR.plg_quickicon_jcefilebrowser.ini000060400000001140152453623440016573 0ustar00; fr-FR.plg_quickicon_jcefilebrowser.ini 
; JCE Project - http://www.joomlacontenteditor.net
; Copyright (C) 2006 - 2015 Ryan Demmer - All rights reserved
; Traduction Mihàly Marti alias Sarki - http://www.sarki.ch/jce
; GNU/GPL Version 2 - http://www.gnu.org/licenses/gpl-2.0.html
; Note : All ini files need to be saved as UTF-8 - No BOM

PLG_QUICKICON_JCEFILEBROWSER="Icône raccourci - Gestionnaire JCE"
PLG_QUICKICON_JCEFILEBROWSER_XML_DESCRIPTION="Icône de raccourci en page d'accueil de l'administration vers le gestionnaire de fichier de JCE."
WF_QUICKICON_BROWSER="JCE - Gestionnaire de fichiers"
language/fr-FR/fr-FR.plg_user_contactcreator.sys.ini000060400000001070152453623440016411 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_CONTACTCREATOR_XML_DESCRIPTION="Plug-in permettant de créer automatiquement un contact pour chaque nouveau membre"
PLG_USER_CONTACTCREATOR="Utilisateur - Fiches de contact automatiques"language/fr-FR/fr-FR.plg_editors_none.sys.ini000060400000001445152453623440015036 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_EDITORS_NONE="Éditeur - Non WYSIWYG"
PLG_NONE_XML_DESCRIPTION="Intégration d'un champ de saisie de texte standard, sans mode WYSIWYG (formatage).<br />Définition litérale de WYSIWYG : Ce que vous voyez est ce que vous obtenez.<br /><br />Pour être utilisé, l'éditeur non WYSIWYG doit être déclaré comme 'Éditeur par défaut' dans la configuration globale de Joomla! ou attribué au profil utilisateur souhaité."language/fr-FR/fr-FR.plg_content_pagebreak.ini000060400000005351152453623440015204 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8



PLG_CONTENT_PAGEBREAK="Contenu - Saut de page"
PLG_CONTENT_PAGEBREAK_ALL_PAGES="Toutes les pages"
PLG_CONTENT_PAGEBREAK_ARTICLE_INDEX="Index de l'article"
PLG_CONTENT_PAGEBREAK_NO_TITLE="Pas de titre"
PLG_CONTENT_PAGEBREAK_PAGES="Pages"
PLG_CONTENT_PAGEBREAK_PAGE_NUM="Page %s"
PLG_CONTENT_PAGEBREAK_SHOW_ALL_DESC="Afficher/Masquer le lien 'Tout afficher' permettant d'afficher l'article en une page."
PLG_CONTENT_PAGEBREAK_SHOW_ALL_LABEL="Tout afficher"
PLG_CONTENT_PAGEBREAK_SITE_ARTICLEINDEXTEXT="En-tête personnalisée"
PLG_CONTENT_PAGEBREAK_SITE_ARTICLEINDEXTEXT_DESC="Saisissez un texte personnalisé pour l'en-tête de l'index de l'article.<br />Si laissé vide, le texte par défaut sera utilisé."
PLG_CONTENT_PAGEBREAK_SITE_ARTICLEINDEX_DESC="Afficher/Masquer l'en-tête de l'index de l'article au-dessus de la 'Table des matières'."
PLG_CONTENT_PAGEBREAK_SITE_ARTICLEINDEX_LABEL="En-tête de l'index"
PLG_CONTENT_PAGEBREAK_SITE_TITLE_DESC="Afficher/Masquer le titre et les attributs d'en-tête du plug-in dans la balise titre du site."
PLG_CONTENT_PAGEBREAK_SITE_TITLE_LABEL="Titre du site"
PLG_CONTENT_PAGEBREAK_SLIDERS="Calques"
PLG_CONTENT_PAGEBREAK_STYLE_DESC="Déterminer l'affichage de l'article en pages séparées, onglets ou calques."
PLG_CONTENT_PAGEBREAK_STYLE_LABEL="Type d'affichage"
PLG_CONTENT_PAGEBREAK_TABS="Onglets"
PLG_CONTENT_PAGEBREAK_TOC_DESC="Afficher/Masquer la 'Table des matières' dans les articles multi-pages."
PLG_CONTENT_PAGEBREAK_TOC_LABEL="Table des matières"
PLG_CONTENT_PAGEBREAK_XML_DESCRIPTION="Permet la création d'un article paginé avec une table des matières optionnelle.<br /><br />Insérer les sauts de pages à l'aide du bouton accessible sous l'éditeur ou dans sa barre d'outils. Le saut de page s'affiche comme une simple ligne horizontale.<br /><br />L'affichage du texte dépend des paramètres choisis et présentera le titre, un texte alternatif (si celui-ci est utilisé) ou des pages numérotées.<br /><br />Le code ci-dessous présente les différentes syntaxes utilisables.<br /> &lt;hr class='system-pagebreak' /&gt;<br />&lt;hr class='system-pagebreak' title='Titre de la page' /&gt; ou <br />&lt;hr class='system-pagebreak' alt='Première page' /&gt; ou <br />&lt;hr class='system-pagebreak' title='Titre de la page' alt='Première page' /&gt; ou <br />&lt;hr class='system-pagebreak' alt='Première page' title='Titre de la page' /&gt;"
language/fr-FR/fr-FR.plg_finder_weblinks.ini000060400000001230152453623440014666 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_FINDER_WEBLINKS="Indexation- Liens web"
PLG_FINDER_WEBLINKS_XML_DESCRIPTION="Ce plug-in permet l'indexation des liens web du composant de Joomla dans la recherche avancée."
PLG_FINDER_QUERY_FILTER_BRANCH_S_WEB_LINK="Lien web"
PLG_FINDER_QUERY_FILTER_BRANCH_P_WEB_LINK="Liens web"

language/fr-FR/fr-FR.plg_jce_editor_aia.ini000060400000012333152453623440014450 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_JCE_EDITOR_AIA="Aia de ChatGPT pour JCE"
PLG_JCE_EDITOR_AIA_XML_DESC="Plugin intégrant un assistant à l'insertion de contenu issu de l'OpenAI ChatGPT au sein de l'éditeur JCE"

PLG_JCE_EDITOR_AIA_APIKEY="API Key"
PLG_JCE_EDITOR_AIA_APIKEY_DESC="Votre clé API OpenAI vous accorde un accès exclusif à l'API OpenAI ChatGPT. Cette clé est unique et vous permet d'interagir avec le modèle ChatGPT par programmation. Vous pouvez gérer et créer des clés API dans les paramètres de votre compte OpenAI en visitant la <a href='https://platform.openai.com/account/api-keys' target='_blank'>section Clés API</a>.."

PLG_JCE_EDITOR_AIA_GPT_TOKENS="Tokens"
PLG_JCE_EDITOR_AIA_GPT_TOKENS_DESC="Fait référence au nombre de jetons dans une saisie de texte ou une réponse. Les jetons sont des morceaux de texte qui peuvent représenter des caractères ou des mots individuels."

PLG_JCE_EDITOR_AIA_GPT_TEMPERATURE="Température"
PLG_JCE_EDITOR_AIA_GPT_TEMPERATURE_DESC="Contrôle le caractère aléatoire de la sortie du modèle. Élevé (0.8-1.0) pour des réponses diverses et créatives. Faible (0.2-0.5) pour une sortie ciblée et déterministe."

PLG_JCE_EDITOR_AIA_GPT_MODEL="Modèle "
PLG_JCE_EDITOR_AIA_GPT_MODEL_DESC="<ul><li><strong>GPT4o :</strong>Version avancée du GPT-4, ce modèle offre des performances supérieures avec une vitesse et une précision accrues. Idéal pour les tâches linguistiques exigeantes, il garantit une génération de texte de haute qualité et rentable.</li><li><strong>GPT-4-Turbo :</strong> Version améliorée du GPT-4, ce modèle associe des fonctionnalités sophistiquées à une rapidité et une efficacité accrues. Il permet de générer des textes rentables et de haute qualité à des taux de réponse proches du temps réel. Il est idéal pour les tâches de traitement linguistique exigeantes qui requièrent à la fois rapidité et profondeur.</li><li><strong>GPT-4 :</strong> Modèle linguistique avancé et puissant, GPT-4 excelle dans la génération de textes hautement cohérents et nuancés sur le plan contextuel. Idéal pour les tâches de génération de textes complexes et créatifs, il offre des performances supérieures et une compréhension approfondie d'un large éventail de sujets. Bien qu'il offre une qualité de premier ordre, il est plus coûteux et peut avoir des temps de réponse plus lents que les modèles plus petits. Parfait pour les applications exigeant un traitement linguistique de haut niveau.</li><li><strong>gpt-3.5-turbo :</strong> Un modèle linguistique avancé qui offre un équilibre entre les capacités, le coût et la vitesse. Il offre des performances similaires à celles du modèle text-davinci-003, mais à un prix inférieur par jeton, ce qui en fait un choix rentable pour diverses tâches de génération de texte. Les temps de réponse sont généralement plus rapides que ceux de text-davinci-003.</li><li><strong>davinci-002 :</strong> Un modèle très avancé pour générer un texte cohérent de premier ordre. Idéal pour la résolution de problèmes complexes et la création de contenus nuancés, il offre d'excellentes performances pour un coût et un temps de réponse plus élevés.</li><li><strong>babbage-002 :</strong> Un modèle économique qui permet de générer des textes de manière fiable et efficace. Adapté aux tâches linguistiques générales, il permet d'équilibrer les capacités et les performances tout en réduisant les coûts d'exploitation.</li></ul>"

PLG_JCE_EDITOR_AIA_TEXTPATTERN_TEXT_PREFIX="Préfixe de modèle de texte"
PLG_JCE_EDITOR_AIA_TEXTPATTERN_TEXT_PREFIX_DESC="Le préfixe de modèle de texte qui déclenche une requête ChatGPT sur Entrée en utilisant le texte qui le suit. La valeur par défaut est <em>:ai</em>"

PLG_JCE_EDITOR_AIA_PROMPTS="Invites personnalisées"
PLG_JCE_EDITOR_AIA_PROMPTS_NAME="Nom"
PLG_JCE_EDITOR_AIA_PROMPTS_PROMPT="Invite"
PLG_JCE_EDITOR_AIA_PROMPTS_SELECTION="Exiger une sélection"
PLG_JCE_EDITOR_AIA_PROMPTS_DESC="Créez une invite personnalisée pour la sélection dans le menu du bouton ChatGPT. Définissez un nom pour identifier l'invite et la valeur de l'invite comme requête à envoyer à ChatGPT. Si 'Exiger une sélection' est activé, une sélection de contenu sera envoyée avec la requête d'invite."

PLG_JCE_EDITOR_AIA_SPELLCHECK="Vérification orthographique"
PLG_JCE_EDITOR_AIA_SPELLCHECK_DESC="Activer ou désactiver la vérification de l'orthographe dans ChatGPT. Lorsque cette option est activée, ChatGPT effectue une vérification du contenu de l'éditeur lorsque l'on clique sur le bouton 'Vérification orthographique'. Cette fonction remplace la fonction de vérification orthographique par défaut."

[aia]
WF_AIA_TITLE="Aia"
WF_AIA_DESC="Aia - Assistant Ai"
WF_AIA_PROMPT="Invite"
WF_AIA_RESPONSE="Réponse"
WF_AIA_SEND="Envoyer une requête..."
WF_AIA_SHOW_DIFFERENCES="Afficher les différences"
WF_AIA_ACCEPT="Accepter"
WF_AIA_REJECT="Rejeter"
WF_AIA_ACCEPT_ALL="Tout accepter"
WF_AIA_REJECT_ALL="Tout rejeter"language/fr-FR/fr-FR.com_messages.sys.ini000060400000001130152453623440014140 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

COM_MESSAGES="Messagerie privée"
COM_MESSAGES_ADD="Nouveau message privé"
COM_MESSAGES_READ="Lire ses messages privés"
COM_MESSAGES_XML_DESCRIPTION="Composant gérant la messagerie privée côté administration du site"language/fr-FR/fr-FR.plg_quickicon_extensionupdate.sys.ini000060400000001421152453623440017624 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_QUICKICON_EXTENSIONUPDATE="Icône raccourci - Alerte de mises à jour d'extensions"
PLG_QUICKICON_EXTENSIONUPDATE_XML_DESCRIPTION="Ce plug-in permet d'afficher une icône d'alerte sur la page d'accueil de l'administration lorsque une mise à jour d'extension tierce installée est disponible. Il doit être lié par son groupe au module d'administration 'Icones de raccourcis' qui doit être publié."

language/fr-FR/fr-FR.localise.php000060400000006726152453623440012501 0ustar00<?php
/**
 * @package    Joomla.Language
 *
 * @copyright  Copyright (C) 2005 - 2017 Open Source Matters, Inc. All rights reserved.
 * @license    GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * fr-FR localise class
 *
 * @package             Joomla.Language
 * @since               1.6
 */
abstract class Fr_FRLocalise
	{
		/**
		 * Returns the potential suffixes for a specific number of items
		 *
		 * @param 	int $count  The number of items.
		 * @return 	array  An array of potential suffixes.
		 * @since 	1.6
		 */
		public static function getPluralSuffixes($count)
		{
			if ($count == 0)
			{
				$return = array('0');
			}
			elseif($count == 1)
			{
				$return = array('1');
			}
			else
			{
				$return = array('MORE');
			}

			return $return;
		}
		/**
		 * Returns the ignored search words
		 *
		 * @return 	array  An array of ignored search words.
		 * @since 	1.6
		 */
		public static function getIgnoredSearchWords()
		{
			$search_ignore = array();
			$search_ignore[] = "et";
			$search_ignore[] = "si";
			$search_ignore[] = "ou";
			return $search_ignore;
		}
		/**
		 * Returns the lower length limit of search words
		 *
		 * @return	integer  The lower length limit of search words.
		 * @since	1.6
		 */
		public static function getLowerLimitSearchWord()
		{
			return 3;
		}
		/**
		 * Returns the upper length limit of search words
		 *
		 * @return	integer  The upper length limit of search words.
		 * @since	1.6
		 */
		public static function getUpperLimitSearchWord()
		{
			return 20;
		}
		/**
		 * Returns the number of chars to display when searching
		 *
		 * @return      integer  The number of chars to display when searching.
		 * @since      1.6
		 */
		public static function getSearchDisplayedCharactersNumber()
		{
			return 200;
		}

		/**
		 * This method processes a string and replaces all accented UTF-8 characters by unaccented
		 * ASCII-7 "equivalents"
		 *
		 * @param	string	$string	The string to transliterate
		 * @return	string	The transliteration of the string
		 * @since	1.6
		 */
		public static function transliterate($string)
		{
		$str = \Joomla\String\StringHelper::strtolower($string);
		// Specific language transliteration.
		// This one is for latin 1, latin supplement , extended A, Cyrillic, Greek

		$glyph_array = array(
		'a'		=>	'a,à,á,â,ã,ä,å,ā,ă,ą,ḁ,α,ά',
		'ae'	=>	'æ',
		'b'		=>	'β,б',
		'c'		=>	'c,ç,ć,ĉ,ċ,č,ћ,ц',
		'ch'	=>	'ч',
		'd'		=>	'ď,đ,Ð,д,ђ,δ,ð',
		'dz'	=>	'џ',
		'e'		=>	'e,è,é,ê,ë,ē,ĕ,ė,ę,ě,э,ε,έ',
		'f'		=>	'ƒ,ф',
		'g'		=>	'ğ,ĝ,ğ,ġ,ģ,г,γ',
		'h'		=>	'ĥ,ħ,Ħ,х',
		'i'		=>	'i,ì,í,î,ï,ı,ĩ,ī,ĭ,į,и,й,ъ,ы,ь,η,ή',
		'ij'	=>	'ij',
		'j'		=>	'ĵ,j',
		'ja'	=>	'я',
		'ju'	=>	'яю',
		'k'		=>	'ķ,ĸ,κ',
		'l'		=>	'ĺ,ļ,ľ,ŀ,ł,л,λ',
		'lj'	=>	'љ',
		'm'		=>	'μ,м',
		'n'		=>	'ñ,ņ,ň,ʼn,ŋ,н,ν',
		'nj'	=>	'њ',
		'o'		=>	'ò,ó,ô,õ,ø,ō,ŏ,ő,ο,ό,ω,ώ',
		'oe'	=>	'œ,ö',
		'p'		=>	'п,π',
		'ph'	=>	'φ',
		'ps'	=>	'ψ',
		'r'		=>	'ŕ,ŗ,ř,р,ρ,σ,ς',
		's'		=>	'ş,ś,ŝ,ş,š,с',
		'ss'	=>	'ß,ſ',
		'sh'	=>	'ш',
		'shch'	=>	'щ',
		't'		=>	'ţ,ť,ŧ,τ,т',
		'th'	=>	'θ',
		'u'		=>	'u,ù,ú,û,ü,ũ,ū,ŭ,ů,ű,ų,у',
		'v'		=>	'в',
		'w'		=>	'ŵ',
		'x'		=>	'χ,ξ',
		'y'		=>	'ý,þ,ÿ,ŷ',
		'z'		=>	'ź,ż,ž,з,ж,ζ'
		);

		foreach($glyph_array as $letter => $glyphs)
		{
			$glyphs = explode(',', $glyphs);
			$str = str_replace($glyphs, $letter, $str);
		}

		return $str;
		}
}
language/fr-FR/fr-FR.mod_toolbar.sys.ini000060400000001224152453623440014000 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

MOD_TOOLBAR="Menu des fonctions et extensions"
MOD_TOOLBAR_XML_DESCRIPTION="Le module 'mod_toolbar' affiche une barre d'outils dans les extensions natives à Joomla ou installées, avec des icônes comme 'Nouveau', 'Publier', 'Supprimer', etc."
MOD_TOOLBAR_LAYOUT_DEFAULT="Défaut"
language/fr-FR/fr-FR.mod_sampledata.ini000060400000001537152453623440013643 0ustar00; @date        2017-09-02
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


MOD_SAMPLEDATA="Données exemples"
MOD_SAMPLEDATA_CONFIRM_START="Continuer installera un ensemble de données exemple dans votre site Joomla. Ce processus ne peut être inversé une fois terminé!"
MOD_SAMPLEDATA_INVALID_RESPONSE="Réponse invalide. Il y une erreur dans un plug-in de données exemple."
MOD_SAMPLEDATA_ITEM_ALREADY_PROCESSED="Cet ensemble de données exemple est déjà installé."
MOD_SAMPLEDATA_XML_DESCRIPTION="Ce module permet d'installer des données exemples."
language/fr-FR/fr-FR.plg_jce_editor_codesample.ini000060400000002412152453623440016027 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_JCE_EDITOR_CODESAMPLE="Exemple de code pour JCE"
PLG_JCE_EDITOR_CODESAMPLE_TITLE="Exemple de code"
PLG_JCE_EDITOR_CODESAMPLE_DESC="Plugin permettant d'afficher des exemples de code dans les contenus avec l'éditeur JCE."
PLG_JCE_EDITOR_CODESAMPLE_XML_DESC="Plugin permettant d'afficher des exemples de code dans les contenus avec l'éditeur JCE"

PLG_JCE_EDITOR_CODESAMPLE_LOAD_ASSETS="Charger Prism"
PLG_JCE_EDITOR_CODESAMPLE_LOAD_ASSETS_DESC="Charger le script et la feuille de style Prism en frontal du site."

PLG_JCE_EDITOR_CODESAMPLE_PRISM_URL="Script Prism personnalisé"
PLG_JCE_EDITOR_CODESAMPLE_PRISM_URL_DESC="Saisir l'URL du fichier script personnalisé de Prism."
PLG_JCE_EDITOR_CODESAMPLE_PRISM_CSS="CSS Prism personnalisé"
PLG_JCE_EDITOR_CODESAMPLE_PRISM_CSS_DESC="Saisir l'URL du fichier CSS personnalisé de Prism."
PLG_JCE_EDITOR_CODESAMPLE_LANGUAGES="Langages"
PLG_JCE_EDITOR_CODESAMPLE_LANGUAGES_DESC="Options de langages personnalisés pour CodeSample."language/fr-FR/fr-FR.plg_jce_editor-svg.ini000060400000001261152453623440014431 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_JCE_EDITOR_SVG="Graphiques SVG pour JCE"
PLG_JCE_EDITOR_SVG_TITLE="Graphiques SVG"
PLG_JCE_EDITOR_SVG_XML_DESC="Plugin activant la prise en charge des graphiques SVG dans l'éditeur JCE"
PLG_JCE_EDITOR_SVG_DESC="Activer la prise en charge des graphiques SVG dans l'éditeur JCE"
PLG_JCE_EDITOR_AMP_XML_DESC="Activer la prise en charge des éléments AMP dans l'éditeur JCE"language/fr-FR/fr-FR.plg_fields_calendar.ini000060400000002200152453623440014616 0ustar00; @date        2017-01-19
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_CALENDAR="Champs - Calendrier"
PLG_FIELDS_CALENDAR_DEFAULT_VALUE_LABEL="Date par défaut"
PLG_FIELDS_CALENDAR_DEFAULT_VALUE_DESC="Date par défaut. La valeur peut être au format ISO 8601 (YYYY-MM-DD HH:MM:SS) ou NOW, qui affiche la date actuelle."
PLG_FIELDS_CALENDAR_LABEL="Calendrier (%s)"
PLG_FIELDS_CALENDAR_PARAMS_SHOWTIME_DESC="Si cette option est activée, le champ du calendrier attend une date et une heure et affiche également l'heure. Les formats sont localisés à l'aide des chaînes de langue régulières."
PLG_FIELDS_CALENDAR_PARAMS_SHOWTIME_LABEL="Affichage de l'heure"
PLG_FIELDS_CALENDAR_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'calendar' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.com_finder.ini000060400000047604152453623440013003 0ustar00; @date        2015-01-30
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_FINDER="Recherche avancée"
COM_FINDER_ALLOW_EMPTY_QUERY_DESC="Uniquement si un filtre est sélectionné, autoriser une recherche vide pour réinitialiser les filtres contraints."
COM_FINDER_ALLOW_EMPTY_QUERY_LABEL="Autoriser la recherche vide"
COM_FINDER_AN_ERROR_HAS_OCCURRED="Une erreur s'est produite"
COM_FINDER_CONFIG_ALLOW_EMPTY_QUERY_DESCRIPTION="Seulement si un filtre est sélectionné, ce paramètre permet une recherche vide pour initialiser une recherche sans la restriction du filtre."
COM_FINDER_CONFIG_ALLOW_EMPTY_QUERY_LABEL="Autoriser la recherche vide"
COM_FINDER_CONFIG_BATCH_SIZE_DESCRIPTION="La taille du lot permet de contrôler le nombre d'éléments traités par lot. Les lots de grande taille nécessitent beaucoup de mémoire alors que de petits lots nécessitent moins de mémoire ce qui exécute plus de demandes et prend plus de temps."
COM_FINDER_CONFIG_BATCH_SIZE_LABEL="Taille des lots d'indexation"
COM_FINDER_CONFIG_DESCRIPTION_LENGTH_DESC="La description des résultats de recherche sera limitée à la longueur des caractères spécifiés ici."
COM_FINDER_CONFIG_DESCRIPTION_LENGTH_DESCRIPTION="Le texte de description des résultats de recherche sera tronqué au nombre de caractères spécifié."
COM_FINDER_CONFIG_DESCRIPTION_LENGTH_LABEL="Longueur de description"
COM_FINDER_CONFIG_ENABLE_LOGGING_DESCRIPTION="Activer cette option permet de créer un fichier journal dans le dossier logs durant le processus d'indexation des contenus du site. Ce fichier est utile pour lister les erreurs en cas de problème d'indexation. Il est recommandé de n'activer cette fonction que dans ce cas."
COM_FINDER_CONFIG_ENABLE_LOGGING_LABEL="Activer la journalisation"
COM_FINDER_CONFIG_EXPAND_ADVANCED_DESC="Développer ou non par défaut les options de la recherche avancée."
COM_FINDER_CONFIG_EXPAND_ADVANCED_DESCRIPTION="Développer par défaut ou non la recherche avancée."
COM_FINDER_CONFIG_EXPAND_ADVANCED_LABEL="Développer la recherche avancée"
COM_FINDER_CONFIG_FIELD_OPENSEARCH_DESCRIPTON_DESCRIPTION="Description affichée pour ce site en tant que moteur de recherche."
COM_FINDER_CONFIG_FIELD_OPENSEARCH_DESCRIPTON_LABEL="Description OpenSearch"
COM_FINDER_CONFIG_FIELD_OPENSEARCH_NAME_DESCRIPTION="Nom affiché pour ce site en tant que fournisseur de recherche."
COM_FINDER_CONFIG_FIELD_OPENSEARCH_NAME_LABEL="Nom OpenSearch"
COM_FINDER_CONFIG_GATHER_SEARCH_STATISTICS_DESCRIPTION="Enregistrer les expressions de recherche effectuées par les visiteurs."
COM_FINDER_CONFIG_GATHER_SEARCH_STATISTICS_LABEL="Recueillir les statistiques de recherche"
COM_FINDER_CONFIG_HILIGHT_CONTENT_SEARCH_TERMS_DESCRIPTION="Mettre en évidence ou non les termes recherchés dans les résultats de recherche."
COM_FINDER_CONFIG_HILIGHT_CONTENT_SEARCH_TERMS_LABEL="Termes en surbrillance"
COM_FINDER_CONFIG_IMPORT_EXPORT="Importer/Exporter"
COM_FINDER_CONFIG_IMPORT_EXPORT_HELP="Aide"
COM_FINDER_CONFIG_IMPORT_EXPORT_INSTRUCTIONS="Pour exporter vos paramètres de configuration, cliquez sur le bouton Exporter dans la barre d'outils ci-dessus.<br />Pour importer une configuration existante, cliquez sur le bouton Parcourir pour sélectionner un fichier sur votre disque dur ou copiez/collez les données dans le champ texte ci-dessous puis cliquez sur le bouton Importer dans la barre d'outils."
COM_FINDER_CONFIG_IMPORT_FROM_FILE="Importer depuis le fichier:"
COM_FINDER_CONFIG_IMPORT_FROM_STRING="Importer depuis le texte:"
COM_FINDER_CONFIG_IMPORT_TOOLBAR_TITLE="Recherche avancée: Configuration Import/Export"
COM_FINDER_CONFIG_MEMORY_TABLE_LIMIT_DESCRIPTION="La mémoire limite attribuée à la table ne doit pas être changée à moins que vous ayez rencontré une erreur qui indique que les tables finder_tokens ou finder_tokens_aggregate sont pleines. La valeur par défaut est de 30000."
COM_FINDER_CONFIG_MEMORY_TABLE_LIMIT_LABEL="Mémoire limite de table"
COM_FINDER_CONFIG_META_MULTIPLIER_DESCRIPTION="Multiplicateur d'influence du texte provenant des diverses méta-données telles les méta-clés, les méta-descriptions, les noms d'auteurs, etc.<br />Le multiplicateur est utilisé pour contrôler la quantité de texte ayant une influence sur ​​la pertinence globale d'un résultat de recherche.<br />Un multiplicateur est additionné aux autres multiplicateurs."
COM_FINDER_CONFIG_META_MULTIPLIER_LABEL="Influence des métas"
COM_FINDER_CONFIG_MISC_MULTIPLIER_DESCRIPTION="Multiplicateur d'influence du texte provenant des données diverses associées aux contenus, y compris les commentaires.<br />Le multiplicateur est utilisé pour contrôler la quantité de texte ayant une influence sur ​​la pertinence globale d'un résultat de recherche.<br />Un multiplicateur est additionné aux autres multiplicateurs. "
COM_FINDER_CONFIG_MISC_MULTIPLIER_LABEL="Multiplicateur d'influence de texte"
COM_FINDER_CONFIG_PATH_MULTIPLIER_DESCRIPTION="Multiplicateur d'influence du texte provenant de l'URL SEF des contenus.<br />Le multiplicateur est utilisé pour contrôler la quantité de texte ayant une influence sur ​​la pertinence globale d'un résultat de recherche.<br />Un multiplicateur est additionné aux autres multiplicateurs."
COM_FINDER_CONFIG_PATH_MULTIPLIER_LABEL="Influence des URL"
COM_FINDER_CONFIG_SHOW_ADVANCED_DESC="Autoriser ou non les utilisateurs à accéder aux options de recherche avancée."
COM_FINDER_CONFIG_SHOW_ADVANCED_DESCRIPTION="Autoriser ou non les utilisateurs à voir les options de la recherche avancée"
COM_FINDER_CONFIG_SHOW_ADVANCED_LABEL="Paramètres de recherche"
COM_FINDER_CONFIG_SHOW_ADVANCED_TIPS_DESCRIPTION="Afficher les astuces de recherche avancée."
COM_FINDER_CONFIG_SHOW_ADVANCED_TIPS_LABEL="Astuces avancées"
COM_FINDER_CONFIG_SHOW_AUTOSUGGEST_DESCRIPTION="Afficher automatiquement ou non des suggestions de recherche"
COM_FINDER_CONFIG_SHOW_AUTOSUGGEST_LABEL="Suggestions de recherche"
COM_FINDER_CONFIG_SHOW_DATE_FILTERS_DESC="Afficher ou non les filtres de date de début et de fin dans la recherche avancée."
COM_FINDER_CONFIG_SHOW_DATE_FILTERS_DESCRIPTION="Afficher ou non les filtres de date de début et de fin."
COM_FINDER_CONFIG_SHOW_DATE_FILTERS_LABEL="Filtres de date"
COM_FINDER_CONFIG_SHOW_DESCRIPTION_DESC="Afficher ou non par défaut la description des résultats de recherche."
COM_FINDER_CONFIG_SHOW_DESCRIPTION_DESCRIPTION="Afficher ou non la description dans les résultats de recherche."
COM_FINDER_CONFIG_SHOW_DESCRIPTION_LABEL="Description en résultat"
COM_FINDER_CONFIG_SHOW_EXPLAINED_QUERY_DESC="Afficher ou non une explication détaillée de la recherche."
COM_FINDER_CONFIG_SHOW_EXPLAINED_QUERY_LABEL="Explication de la recherche"
COM_FINDER_CONFIG_SHOW_FEED_DESC="Afficher le lien permettant d'afficher le contenu comme fil d'actualité"
COM_FINDER_CONFIG_SHOW_FEED_LABEL="Afficher le fil d'actualité"
COM_FINDER_CONFIG_SHOW_FEED_TEXT_DESC="Affiché le texte associé au fil d'information, ou afficher uniquement son titre."
COM_FINDER_CONFIG_SHOW_FEED_TEXT_LABEL="Afficher le texte fil d'actualité"
COM_FINDER_CONFIG_SHOW_SUGGESTED_QUERY_DESC="Afficher ou non des termes alternatifs lorsque la recherche ne donne aucun résultat."
COM_FINDER_CONFIG_SHOW_SUGGESTED_QUERY_LABEL="Voulez-vous dire"
COM_FINDER_CONFIG_SHOW_URL_DESC="Afficher l'URL associée de cet élément."
COM_FINDER_CONFIG_SHOW_URL_DESCRIPTION="Afficher ou non l'URL du contenu dans les résultats de recherche."
COM_FINDER_CONFIG_SHOW_URL_LABEL="URL en résultat"
COM_FINDER_CONFIG_SORT_DIRECTION_DESC="Sens du tri des résultats de recherche"
COM_FINDER_CONFIG_SORT_DIRECTION_LABEL="Sens du tri"
COM_FINDER_CONFIG_SORT_OPTION_ASCENDING="Ascendant"
COM_FINDER_CONFIG_SORT_OPTION_DESCENDING="Descendant"
COM_FINDER_CONFIG_SORT_OPTION_LIST_PRICE="Liste de prix"
COM_FINDER_CONFIG_SORT_OPTION_RELEVANCE="Pertinence"
COM_FINDER_CONFIG_SORT_OPTION_START_DATE="Date"
COM_FINDER_CONFIG_SORT_ORDER_DESC="Champ servant de tri pour l'affichage des résultats"
COM_FINDER_CONFIG_SORT_ORDER_LABEL="Champ de tri"
COM_FINDER_CONFIG_STEMMER_DESCRIPTION="Langue source à utiliser. Choisissez 'En cascade' si votre langue source n'est pas disponible ou si le contenu est disponible en plusieurs langues."
COM_FINDER_CONFIG_STEMMER_ENABLE_DESCRIPTION="Activer la langue source (si spécifiée) dans l'indexation."
COM_FINDER_CONFIG_STEMMER_ENABLE_LABEL="Activer la langue source"
COM_FINDER_CONFIG_STEMMER_FR="Français uniquement"
COM_FINDER_CONFIG_STEMMER_LABEL="Langue source"
COM_FINDER_CONFIG_STEMMER_PORTER_EN="Anglais uniquement"
COM_FINDER_CONFIG_STEMMER_SNOWBALL="En cascade"
COM_FINDER_CONFIG_TEXT_MULTIPLIER_DESCRIPTION="Multiplicateur d'influence du texte provenant des contenus d'introduction et complets.<br />Le multiplicateur est utilisé pour contrôler la quantité de texte ayant une influence sur ​​la pertinence globale d'un résultat de recherche.<br />Un multiplicateur est additionné aux autres multiplicateurs."
COM_FINDER_CONFIG_TEXT_MULTIPLIER_LABEL="Influence des contenus"
COM_FINDER_CONFIG_TITLE_MULTIPLIER_DESCRIPTION="Multiplicateur d'influence du texte provenant des titres des contenus.<br />Le multiplicateur est utilisé pour contrôler la quantité de texte ayant une influence sur ​​la pertinence globale d'un résultat de recherche.<br />Un multiplicateur est additionné aux autres multiplicateurs."
COM_FINDER_CONFIG_TITLE_MULTIPLIER_LABEL="Influence des titres"
COM_FINDER_CONFIGURATION="Recherche avancée : Paramètres"
COM_FINDER_CREATE_FILTER="Créer un filtre"
COM_FINDER_EDIT_FILTER="Modifier un filtre"
COM_FINDER_EXPORT="Exporter"
COM_FINDER_FIELD_CREATED_BY_ALIAS_DESC="Alias du nom de l'auteur du filtre."
COM_FINDER_FIELD_CREATED_BY_ALIAS_LABEL="Alias"
COM_FINDER_FIELD_CREATED_BY_DESC="Auteur du filtre."
COM_FINDER_FIELD_CREATED_BY_LABEL="Créé par"
COM_FINDER_FIELD_MODIFIED_DESCRIPTION="La date et l'heure de la dernière modification du filtre."
COM_FINDER_FIELDSET_INDEX_OPTIONS_DESCRIPTION="Paramètres d'indexation"
COM_FINDER_FIELDSET_INDEX_OPTIONS_LABEL="Indexation"
COM_FINDER_FIELDSET_SEARCH_OPTIONS_DESCRIPTION="Paramètres de recherche"
COM_FINDER_FIELDSET_SEARCH_OPTIONS_LABEL="Recherche"
COM_FINDER_FILTER_BRANCH_LABEL="Recherche par %s"
COM_FINDER_FILTER_BY="Afficher %s:"
COM_FINDER_FILTER_CONTENT_MAP_DESC="Filtrer les contenus indexés par plan de contenu"
COM_FINDER_FILTER_CONTENT_MAP_LABEL="Sélectionner le plan de contenu"
COM_FINDER_FILTER_EDIT_TOOLBAR_TITLE="Recherche avancée : Modifier le filtre"
COM_FINDER_FILTER_END_DATE_DESCRIPTION="Format YYYY-MM-DD"
COM_FINDER_FILTER_END_DATE_LABEL="Date de fin"
COM_FINDER_FILTER_FIELDSET_DETAILS="Détails du filtre"
COM_FINDER_FILTER_FIELDSET_PARAMS="Durée du filtre"
COM_FINDER_FILTER_HIDE_ALL="Tout réduire"
COM_FINDER_FILTER_MAP_COUNT="Nombre de plans"
COM_FINDER_FILTER_MAP_COUNT_DESCRIPTION="Nombre de plans d'indexation inclus dans ce filtre."
COM_FINDER_FILTER_NEW_TOOLBAR_TITLE="Recherche avancée : Nouveau filtre"
COM_FINDER_FILTER_SEARCH_DESCRIPTION="Filtrer la liste par titre."
COM_FINDER_FILTER_SELECT_CONTENT_MAP="- Sélectionner un plan de contenu -"
COM_FINDER_FILTER_SELECT_ALL_LABEL="Rechercher tout"
COM_FINDER_FILTER_START_DATE_DESCRIPTION="Format YYYY-MM-DD"
COM_FINDER_FILTER_START_DATE_LABEL="Date de début"
COM_FINDER_FILTER_TIMESTAMP="Créé le"
COM_FINDER_FILTER_SHOW_ALL="Tout afficher"
COM_FINDER_FILTER_TITLE_DESCRIPTION="Titre attribué aux filtres."
COM_FINDER_FILTER_WHEN_AFTER="Après"
COM_FINDER_FILTER_WHEN_BEFORE="Avant"
COM_FINDER_FILTER_WHEN_END_DATE_DESCRIPTION="Résultats de recherche selon la date de fin (avant, après ou exactement)."
COM_FINDER_FILTER_WHEN_END_DATE_LABEL="Selon date de fin"
COM_FINDER_FILTER_WHEN_EXACTLY="Exactement"
COM_FINDER_FILTER_WHEN_START_DATE_DESCRIPTION="Résultats de recherche selon la date de début (avant, après ou exactement)."
COM_FINDER_FILTER_WHEN_START_DATE_LABEL="Selon date de début"
COM_FINDER_FILTERS="Filtres"
COM_FINDER_FILTERS_DELETE_CONFIRMATION="Êtes-vous sûr de vouloir supprimer le filtre sélectionné?"
COM_FINDER_FILTERS_TOOLBAR_TITLE="Recherche avancée: Filtres de recherche"
COM_FINDER_GO="Rechercher"
COM_FINDER_HEADING_CHILDREN="Enfants"
COM_FINDER_HEADING_CREATED_BY="Créé par"
COM_FINDER_HEADING_CREATED_BY_ASC="Créé par ascendant"
COM_FINDER_HEADING_CREATED_BY_DESC="Créé par descendant"
COM_FINDER_HEADING_CREATED_ON="Créé le"
COM_FINDER_HEADING_CREATED_ON_ASC="Créé le ascendant"
COM_FINDER_HEADING_CREATED_ON_DESC="Créé le descendant"
COM_FINDER_HEADING_INDEXER="Indexation de recherche avancée"
COM_FINDER_HEADING_MAP_COUNT="Plans de contenu"
COM_FINDER_HEADING_MAP_COUNT_ASC="Plans de contenu ascendant"
COM_FINDER_HEADING_MAP_COUNT_DESC="Plans de contenu descendant"
COM_FINDER_HEADING_NODES="Noeuds"
COM_FINDER_IMPORT="Importer"
COM_FINDER_INDEX="Indexer"
COM_FINDER_INDEX_CONFIRM_DELETE_PROMPT="Êtes-vous sûr de vouloir supprimer l'élément sélectionné?"
COM_FINDER_INDEX_CONFIRM_PURGE_PROMPT="Êtes-vous sûr de vouloir supprimer tous les éléments de l'index? Cela peut prendre un certain temps sur un grand site."
COM_FINDER_INDEX_DATE_INFO="<strong>Début de publication:</strong>  %s<br /><strong>Fin de publication:</strong>  %s<br /><strong>Création du contenu:</strong>  %s<br /><strong>Suppression du contenu:</strong>  %s"
COM_FINDER_INDEX_DATE_INFO_TITLE="Informations de date du lien"
COM_FINDER_INDEX_FILTER_BY_STATE="Tous les statuts de publication"
COM_FINDER_INDEX_HEADING_DETAILS="Détails"
COM_FINDER_INDEX_HEADING_INDEX_DATE="Dernière modification"
COM_FINDER_INDEX_HEADING_INDEX_DATE_ASC="Dernière mise à jour ascendant"
COM_FINDER_INDEX_HEADING_INDEX_DATE_DESC="Dernière mise à jour descendant"
COM_FINDER_INDEX_HEADING_INDEX_TYPE="Type"
COM_FINDER_INDEX_HEADING_INDEX_TYPE_ASC="Type ascendant"
COM_FINDER_INDEX_HEADING_INDEX_TYPE_DESC="Type descendant"
COM_FINDER_INDEX_HEADING_LINK_URL="URL brute"
COM_FINDER_INDEX_HEADING_LINK_URL_ASC="URL brute ascendant"
COM_FINDER_INDEX_HEADING_LINK_URL_DESC="URL brute descendant"
COM_FINDER_INDEX_NO_CONTENT="Aucun contenu ne correspond à vos critères de recherche."
COM_FINDER_INDEX_NO_DATA="Aucun contenu n'a été indexé."
COM_FINDER_INDEX_PLUGIN_CONTENT_NOT_ENABLED="Le <a href=\"%s\">plug-in de recherche avancée</a> n'est pas activé. Les modifications apportées aux contenus ne seront pas actualisées dans l'indexation si vous n'activez pas ce plug-in."
COM_FINDER_INDEX_PURGE_FAILED="Échec de la suppression des éléments sélectionnés."
COM_FINDER_INDEX_PURGE_SUCCESS="Tous les éléments ont été effacés."
COM_FINDER_INDEX_SEARCH_DESC="Rechercher titre, URL ou dernière mise à jour"
COM_FINDER_INDEX_SEARCH_LABEL="Rechercher :"
COM_FINDER_INDEX_TIP="Démarrer l'indexation en cliquant sur le bouton 'Indexer' de la barre d'outils."
COM_FINDER_INDEX_TOOLBAR_PURGE="Purger l'index"
COM_FINDER_INDEX_TOOLBAR_TITLE="Recherche avancée: Contenus indexés"
COM_FINDER_INDEX_TYPE_FILTER="Tous les types de contenu"
COM_FINDER_INDEXER_HEADER_COMPLETE="Indexation complète"
COM_FINDER_INDEXER_HEADER_ERROR="Une erreur s'est produite"
COM_FINDER_INDEXER_HEADER_INIT="Démarrer l'indexation"
COM_FINDER_INDEXER_HEADER_OPTIMIZE="Optimiser l'indexation"
COM_FINDER_INDEXER_HEADER_RUNNING="Indexation en cours..."
COM_FINDER_INDEXER_INVALID_DRIVER="L'indexation n'est pas supportée par le driver de base de données %s."
COM_FINDER_INDEXER_INVALID_PARSER="%s type de syntaxe invalide"
COM_FINDER_INDEXER_INVALID_STEMMER="%s type de source invalide"
COM_FINDER_INDEXER_MESSAGE_COMPLETE="Le processus d'indexation est terminé. Vous pouvez fermer cette fenêtre."
COM_FINDER_INDEXER_MESSAGE_INIT="L'indexation est en cours d'initialisation. Ne fermez pas cette fenêtre."
COM_FINDER_INDEXER_MESSAGE_OPTIMIZE="L'optimisation de l'indexation des tables est en cours d'initialisation. Ne fermez pas cette fenêtre."
COM_FINDER_INDEXER_MESSAGE_RUNNING="Le contenu est en cours d'indexation. Ne fermez pas cette fenêtre."
COM_FINDER_ITEM_X_ONLY="%s uniquement"
COM_FINDER_ITEMS="Contenus"
COM_FINDER_MAP_PUBLISH_FAILED="Le ou les plans sélectionnés ne peuvent pas être publiés. Le message d'erreur retourné est:"
COM_FINDER_MAP_PUBLISH_SUCCESS="Le ou les plans sélectionnés ont été publiés."
COM_FINDER_MAP_UNPUBLISH_FAILED="Le ou les plans sélectionnés n'ont pas pu être dépubliés. Le message d'erreur retourné est:"
COM_FINDER_MAP_UNPUBLISH_SUCCESS="Le ou les plans sélectionnés ont été dépubliés."
COM_FINDER_MAPS="Plans"
COM_FINDER_MAPS_BRANCH_LINK="Cliquez pour voir les sous-branches de cette branche."
COM_FINDER_MAPS_BRANCHES="Branches uniquement"
COM_FINDER_MAPS_CONFIRM_DELETE_PROMPT="Êtes-vous sûr de vouloir supprimer le plan ou les plans sélectionnés?"
COM_FINDER_MAPS_COUNT_PUBLISHED_ITEMS="Contenu indexé publié"
COM_FINDER_MAPS_COUNT_UNPUBLISHED_ITEMS="Contenu indexé non publié"
COM_FINDER_MAPS_MULTILANG="Note: le plug-in système de filtre de langue a été activé, cette branche ne sera donc pas utilisée."
COM_FINDER_MAPS_NO_CONTENT="Aucun résultat à afficher. Soit aucun contenu n'a été indexé, soit aucun contenu ne répond à vos critères de filtrage."
COM_FINDER_MAPS_RETURN_TO_BRANCHES="Retour aux groupes de plans"
COM_FINDER_MAPS_SELECT_BRANCH="- Sélectionner un groupe de plans -"
COM_FINDER_MAPS_SELECT_TYPE="- Sélectionner un type de contenu -"
COM_FINDER_MAPS_TOOLBAR_TITLE="Recherche avancée: Plans de contenus"
COM_FINDER_MESSAGE_RETURNED="Le message suivant a été renvoyé par le serveur:"
COM_FINDER_N_ITEMS_CHECKED_IN_0="Aucun élément n'a pu être déverrouillé"
COM_FINDER_N_ITEMS_CHECKED_IN_1="%d élément déverrouillé"
COM_FINDER_N_ITEMS_CHECKED_IN_MORE="%d éléments déverrouillés"
COM_FINDER_N_ITEMS_DELETED="%d éléments supprimés."
COM_FINDER_N_ITEMS_DELETED_1="%d élément supprimé."
COM_FINDER_N_ITEMS_PUBLISHED="%d éléments publiés."
COM_FINDER_N_ITEMS_PUBLISHED_1="%d élément publié."
COM_FINDER_N_ITEMS_TRASHED="%d éléments mis à la corbeille."
COM_FINDER_N_ITEMS_TRASHED_1="%d élément mis à la corbeille."
COM_FINDER_N_ITEMS_UNPUBLISHED="%d éléments dépubliés."
COM_FINDER_N_ITEMS_UNPUBLISHED_1="%d élément dépublié."
COM_FINDER_NO_ERROR_RETURNED="Aucune erreur n'a été retournée.<br />Assurez-vous que le rapport d'erreur est activé."
COM_FINDER_NO_FILTERS="Aucun filtre n'a encore été créé."
COM_FINDER_NO_RESULTS="Aucun résultat ne correspond aux critères de recherche."
COM_FINDER_NO_RESULTS_OR_FILTERS="Aucun résultat correspondant à votre recherche ou aucun filtre n'a été encore créé."
COM_FINDER_QUERY_FILTER_TODAY="Aujourd'hui"
COM_FINDER_QUERY_OPERATOR_AND="Et"
COM_FINDER_QUERY_OPERATOR_NOT="Sans"
COM_FINDER_QUERY_OPERATOR_OR="Ou"
COM_FINDER_SEARCH_FILTER_SEARCH_DESC="Recherche dans le titre du filtre."
COM_FINDER_SEARCH_FILTER_SEARCH_LABEL="Recherche dans les filtres"
COM_FINDER_SEARCH_LABEL="Recherche %s:"
COM_FINDER_SEARCH_SEARCH_QUERY_DESC="Recherche dans le titre du plan de contenu."
COM_FINDER_SEARCH_SEARCH_QUERY_LABEL="Recherche dans les plans de contenus"
COM_FINDER_SELECT_SEARCH_FILTER="Sélectionner le filtre"
COM_FINDER_STATISTICS="Statistiques "
COM_FINDER_STATISTICS_LINK_TYPE_COUNT="Clics"
COM_FINDER_STATISTICS_LINK_TYPE_HEADING="Type de lien"
COM_FINDER_STATISTICS_LINK_TYPE_TOTAL="Total"
COM_FINDER_STATISTICS_STATS_DESCRIPTION="%s termes sont indexés par %s liens de contenu avec %s attribut dans %s branches."
COM_FINDER_STATISTICS_TITLE="Statistiques d'indexation de la recherche avancée"
COM_FINDER_SUBMENU_FILTERS="Filtres de recherche"
COM_FINDER_SUBMENU_INDEX="Contenus indexés"
COM_FINDER_SUBMENU_MAPS="Plans des contenus"
COM_FINDER_UPDATER_MESSAGE_COMPLETE="L'indexation de la recherche avancée est à jour."
COM_FINDER_UPDATER_MESSAGE_OPTIMIZE="L'indexation de la recherche avancée est optimisée."
COM_FINDER_UPDATER_MESSAGE_PROCESS="L'indexation de la recherche avancée est actualisée."
COM_FINDER_XML_DESCRIPTION="Recherche avancée"
language/fr-FR/fr-FR.plg_jce_popups-widgetkit2.ini000060400000002420152453623440015745 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_JCE_POPUPS_WIDGETKIT2="Popup Lightbox WidgetKit2 de Yootheme pour JCE"
PLG_JCE_POPUPS_WIDGETKIT2_XML_DESC="Plugin permettant la prise en charge des Popup WidgetKit 2 de Yootheme avec JCE. Nécessite l'installation de Yootheme WidgetKit 2 - <a href='https://yootheme.com/widgetkit' title='Obtenir WidgetKit de Yootheme' target='_blank'><strong>Obtenir WidgetKit de Yootheme</strong></a>"

WF_POPUPS_WIDGETKIT2_TITLE="Lightbox WidgetKit2"
WF_POPUPS_WIDGETKIT_BOXTITLE="Titre"
WF_POPUPS_WIDGETKIT_BOXTITLE_DESC="Titre::Titre Lightbox"

WF_POPUPS_WIDGETKIT_GROUP="Groupe"
WF_POPUPS_WIDGETKIT_GROUP_DESC="Groupe::Lightbox groupe"

WF_POPUPS_WIDGETKIT_TYPE="Type de Popup"
WF_POPUPS_WIDGETKIT_TYPE_DESC="Type de Popup::Définir la fenêtre contextuelle"
WF_POPUPS_WIDGETKIT_DETECT="Détection à partir de l'URL"
WF_POPUPS_WIDGETKIT_IMAGE="Image"
WF_POPUPS_WIDGETKIT_VIDEO="Vidéo"
WF_POPUPS_WIDGETKIT_YOUTUBE="Youtube"
WF_POPUPS_WIDGETKIT_VIMEO="Vimeo"
WF_POPUPS_WIDGETKIT_IFRAME="IFrame"
language/fr-FR/fr-FR.plg_system_akeebaupdatecheck.ini000060400000001156152453623440016545 0ustar00; Akeeba Backup
; Copyright (c)2009-2016 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later

; PLG_SYSTEM_AKEEBAUPDATECHECK_TITLE="System - Akeeba Backup Update Check"

;; Added after 3.6.10
; PLG_SYSTEM_AKEEBAUPDATECHECK_EMAIL_LBL="Super User Email"
; PLG_SYSTEM_AKEEBAUPDATECHECK_EMAIL_DESC="Email address of the recipient of the notification email. The email must belong to an existing Super User of the site. If it doesn't belong to a Super User, or if it's left blank (default option), then all Super users of the site will receive the email."
language/fr-FR/fr-FR.com_actionlogs.ini000060400000011220152453623440013657 0ustar00; @date        2018-09-23
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters, Inc. https://www.joomla.org
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_ACTIONLOGS="Journal des actions des utilisateurs"
COM_ACTIONLOGS_ACTION="Action"
COM_ACTIONLOGS_ACTION_ASC="Action ascendant"
COM_ACTIONLOGS_ACTION_DESC="Action descendant"
COM_ACTIONLOGS_ACTION_VIEWLOGS="Affiche les journaux"
COM_ACTIONLOGS_ACTION_VIEWLOGS_DESC="Permet aux utilisateurs du groupe d'afficher les journaux."
COM_ACTIONLOGS_COMMA="Virgule"
COM_ACTIONLOGS_CONFIGURATION="Journal des actions des utilisateurs : Paramètres"
COM_ACTIONLOGS_CSV_DELIMITER_DESC="Définit le séparateur pour les valeurs dans l'export CSV."
COM_ACTIONLOGS_CSV_DELIMITER_LABEL="Séparateur CSV"
COM_ACTIONLOGS_DATE="Date"
COM_ACTIONLOGS_DISABLED="Désactivé"
COM_ACTIONLOGS_EMAIL_DESC="Ceci est la dernière action effectuée par un utilisateur sur votre site Web."
COM_ACTIONLOGS_EMAIL_SUBJECT="Dernières actions de l'utilisateur"
COM_ACTIONLOGS_EXPORT_ALL_CSV="Tout exporter en CSV"
COM_ACTIONLOGS_EXPORT_CSV="Exporter les éléments sélectionnés en CSV"
COM_ACTIONLOGS_EXTENSION="Extension"
COM_ACTIONLOGS_EXTENSION_ASC="Extension ascendant"
COM_ACTIONLOGS_EXTENSION_DESC="Extension descendant"
COM_ACTIONLOGS_EXTENSION_FILTER_DESC="Rechercher dans les journaux d'actions d'utilisateurs par extension"
COM_ACTIONLOGS_ERROR_COULD_NOT_EXPORT_DATA="Impossible d'exporter les données."
COM_ACTIONLOGS_FILTER_SEARCH_DESC="Rechercher dans le nom d'utilisateur. Préfixe avec ID : pour rechercher un ID de journal des actions. Préfixer avec ITEM_ID: pour rechercher un ID d'élément de journal des actions."
COM_ACTIONLOGS_IP_ADDRESS="Adresse IP"
COM_ACTIONLOGS_IP_ADDRESS_ASC="Adresse IP ascendant"
COM_ACTIONLOGS_IP_ADDRESS_DESC="Adresse IP descendant"
COM_ACTIONLOGS_IP_INVALID="IP invalide"
COM_ACTIONLOGS_IP_LOGGING_DESC="Activer la journalisation de l'adresse IP des utilisateurs."
COM_ACTIONLOGS_IP_LOGGING_LABEL="Journalisation de l'IP"
COM_ACTIONLOGS_LOG_EXTENSIONS_DESC="Sélectionnez les événements à journaliser"
COM_ACTIONLOGS_LOG_EXTENSIONS_LABEL="Évènements à journaliser"
COM_ACTIONLOGS_MANAGER_USERLOGS="Journal des actions des utilisateurs"
COM_ACTIONLOGS_N_ITEMS_DELETED="%s journaux supprimés."
COM_ACTIONLOGS_N_ITEMS_DELETED_1="%s journal supprimé"
COM_ACTIONLOGS_NAME="Nom"
COM_ACTIONLOGS_NAME_ASC="Nom ascendant"
COM_ACTIONLOGS_NAME_DESC="Nom descendant"
COM_ACTIONLOGS_NO_ITEM_SELECTED="Veuillez d'abord effectuer une sélection dans la liste."
COM_ACTIONLOGS_NO_LOGS_TO_EXPORT="Il n'y a aucun journal d'actions d'utilisateur à exporter."
COM_ACTIONLOGS_OPTION_FILTER_DATE="- Sélectionner une date -"
COM_ACTIONLOGS_OPTION_RANGE_NEVER="Jamais"
COM_ACTIONLOGS_OPTION_RANGE_PAST_1MONTH="Le mois dernier"
COM_ACTIONLOGS_OPTION_RANGE_PAST_3MONTH="Les 3 mois derniers"
COM_ACTIONLOGS_OPTION_RANGE_PAST_6MONTH="Les 5 mois derniers"
COM_ACTIONLOGS_OPTION_RANGE_PAST_WEEK="La dernière semaine"
COM_ACTIONLOGS_OPTION_RANGE_PAST_YEAR="L'année dernière"
COM_ACTIONLOGS_OPTION_RANGE_POST_YEAR="Il y a plus d'un an"
COM_ACTIONLOGS_OPTION_RANGE_TODAY="Aujourd'hui"
COM_ACTIONLOGS_OPTIONS="Paramètres"
COM_ACTIONLOGS_POSTINSTALL_BODY="<p>Avec la sortie de Joomla 3.9.0, il est désormais possible d'enregistrer toutes les actions administratives effectuées par les utilisateurs dans les extensions prises en charge. Il est maintenant facile de voir qui a fait quoi et quand cela a été fait.</p><p> Les journaux peuvent être consultés dans Joomla ou exportés pour un usage externe.</p><p> Pour plus d'informations sur cette nouvelle fonctionnalité, lire la <a href=\"https://docs.joomla.org/J3.x:User_Action_Logs\" target=\"_new\">documentation sur les journaux des actions des utilisateurs.</a></p>"
COM_ACTIONLOGS_POSTINSTALL_TITLE="Les actions des utilisateurs peuvent maintenant être journalisées"
COM_ACTIONLOGS_PURGE_CONFIRM="Êtes-vous sûr de vouloir supprimer tous les journaux d'actions des utilisateurs?"
COM_ACTIONLOGS_PURGE_FAIL="Échec de la suppression de tous les journaux d'actions des utilisateurs."
COM_ACTIONLOGS_PURGE_SUCCESS="Tous les journaux d'actions des utilisateurs ont été supprimés."
COM_ACTIONLOGS_SELECT_EXTENSION="- Sélectionner l'extension -"
COM_ACTIONLOGS_SELECT_USER="- Sélectionner l'utilisateur -"
COM_ACTIONLOGS_SEMICOLON="Point-virgule"
COM_ACTIONLOGS_TOOLBAR_PURGE="Purger"
COM_ACTIONLOGS_XML_DESCRIPTION="Affiche un journal des actions effectuées par les utilisateurs sur votre site Web."
language/fr-FR/fr-FR.xml000060400000001665152453623440010715 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metafile version="3.10" client="administrator">
	<tag>fr-FR</tag>
	<name>French (France)</name>
	<version>3.10.12</version>
	<creationDate>2023-07-11</creationDate>
	<author>French translation team : joomla.fr</author>
	<authorEmail>traduction@joomla.fr</authorEmail>
	<authorUrl>http://www.joomla.fr</authorUrl>
	<copyright>Copyright (C) 2005 - 2022 Open Source Matters, Inc. </copyright>
	<copyright>joomla.fr</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<description>French administrator language for Joomla 3</description>
	<metadata>
		<name>French (France)</name>
		<nativeName>Français (France)</nativeName>
		<tag>fr-FR</tag>
		<rtl>0</rtl>
		<locale>fr_FR.utf8, fr_FR.UTF-8, fr_FR.UTF-8@euro, fr_FR, fre_FR, fr, france</locale>
		<firstDay>1</firstDay>
		<weekEnd>0,6</weekEnd>
		<calendar>gregorian</calendar>
	</metadata>
	<params />
</metafile>
language/fr-FR/fr-FR.plg_editors-xtd_article.ini000060400000001251152453623440015475 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8 - No BOM


PLG_ARTICLE_BUTTON_ARTICLE="Article"
PLG_ARTICLE_XML_DESCRIPTION="Affiche un bouton sous l'éditeur pour insérer dans un contenu un lien vers un article.<br />Ouvre une fenêtre pop-up permettant de choisir l'article vers lequel effectuer le lien."
PLG_EDITORS-XTD_ARTICLE="Bouton - Article"
language/fr-FR/fr-FR.plg_quickicon_akeebabackup.ini000060400000001020152453623440016161 0ustar00;; @package AkeebaBackup
;; @copyright Copyright (c)2009-2016 Nicholas K. Dionysopoulos
;; @license GNU General Public License version 3, or later
;;

PLG_QUICKICON_AKEEBABACKUP_OK="Sauvegarde à jour"
PLG_QUICKICON_AKEEBABACKUP_BACKUPREQUIRED="<strong>Sauvegarde requise!</strong>"

PLG_QUICKICON_AKEEBABACKUP_LBL_NOTSUPPORTEDINJOOMLA3="Ce module n'est plus pris en charge dans les versions Joomla! 2,5 et ultérieures. Veuillez à l'avenir utiliser l'icône du plug-in <em>Icône raccourci - Notification Akeeba Backup</em>."
language/fr-FR/fr-FR.mod_status.ini000060400000004527152453623440013055 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


MOD_STATUS="Barre de statuts"
MOD_STATUS_BACKEND_USERS_0="Administrateur"
MOD_STATUS_BACKEND_USERS_1="Administrateur"
MOD_STATUS_BACKEND_USERS_MORE="Administrateurs"
MOD_STATUS_FIELD_SHOW_VIEWSITE_LABEL="Voir le site"
MOD_STATUS_FIELD_SHOW_VIEWSITE_DESC="Affiche un lien vers la page d'accueil par défaut du site."
MOD_STATUS_FIELD_LINK_VIEWADMIN_LABEL="Voir l'administration"
MOD_STATUS_FIELD_SHOW_VIEWADMIN_LABEL="Voir l'administration"
MOD_STATUS_FIELD_SHOW_VIEWADMIN_DESC="Afficher un lien pour ouvrir une nouvelle fenêtre d'administration"
MOD_STATUS_FIELD_SHOW_LOGGEDIN_USERS_ADMIN_DESC="Afficher/Masquer le nombre d'utilisateurs identifiés dans l'espace d'administration."
MOD_STATUS_FIELD_SHOW_LOGGEDIN_USERS_ADMIN_LABEL="Utilisateurs connectés sur l'administration."
MOD_STATUS_FIELD_SHOW_LOGGEDIN_USERS_DESC="Afficher/Masquer le nombre d'utilisateurs connectés sur le site."
MOD_STATUS_FIELD_SHOW_LOGGEDIN_USERS_LABEL="Utilisateurs connectés"
MOD_STATUS_FIELD_SHOW_MESSAGES_DESC="Afficher/Masquer le nombre de ses messages de la messagerie interne de Joomla."
MOD_STATUS_FIELD_SHOW_MESSAGES_LABEL="Messages internes"
MOD_STATUS_LOG_OUT="Déconnexion"
MOD_STATUS_MESSAGES_0="%d Messages"
MOD_STATUS_MESSAGES_1="%d Message"
MOD_STATUS_MESSAGES_LABEL_0="Messages"
MOD_STATUS_MESSAGES_LABEL_1="Message"
MOD_STATUS_MESSAGES_LABEL_MORE="Messages"
MOD_STATUS_MESSAGES_MORE="%d Messages"
MOD_STATUS_TOTAL_USERS_0="Utilisateurs"
MOD_STATUS_TOTAL_USERS_1="Utilisateur"
MOD_STATUS_TOTAL_USERS_MORE="Utilisateurs"
MOD_STATUS_USERS_0="Utilisateur"
MOD_STATUS_USERS_1="Utilisateur connecté"
MOD_STATUS_USERS_MORE="Utilisateurs connectés"
MOD_STATUS_XML_DESCRIPTION="Le module 'mod_status' affiche une barre avec, selon les paramètres choisis, les utilisateurs connectés dans l'espace d'administration et/ou du site, les messages de la boîte de messagerie interne de Joomla, un raccourci pour afficher le site.<br />Ce module doit être placé en position 'status' avec le template par défaut de Joomla."
language/fr-FR/fr-FR.plg_search_content.sys.ini000060400000001000152453623440015330 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_SEARCH_CONTENT="Recherche - Articles"
PLG_SEARCH_CONTENT_XML_DESCRIPTION="Intégration des articles dans la recherche sur le site"language/fr-FR/fr-FR.mod_sampledata.sys.ini000060400000000763152453623440014460 0ustar00; @date        2017-09-02
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


MOD_SAMPLEDATA="Données exemples"
MOD_SAMPLEDATA_XML_DESCRIPTION="Ce module permet d'installer des données exemples."
language/fr-FR/fr-FR.com_xmap.sys.ini000060400000004351152453623440013306 0ustar00; @package     Xmap
; @copyright   2007 - 2013 Joomla! Vargas. All rights reserved.
; @subpackage  fr-FR.com_xmap.sys.ini 
; @description Traduction francophone - fr-FR
; @version     2.3.2 - 05.02.2013
; @author      Mihàly Marti alias Sarki
; @copyright   Joomlatutos.com - www.joomlautos.com
; @license     GNU General Public License version 2, or later
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8 - No BOM

COM_XMAP="Xmap - Plans du site"
COM_XMAP_XML_DESC="<h3>Xmap - Générateur de plan de site pour Joomla!</h3><p>Xmap vous permet de créer des plans du site à consulter (HTML), et pour les moteurs de recherche (XML) afin d'améliorer le référencement.</p><p>Auteurs : Guillermo Vargas and Jesus Vargas - <a href='http://joomla.vargas.co.cr' target='_blank'>http://joomla.vargas.co.cr</a></p><p>Traduction FR : Mihàly Marti alias Sarki pour <a href='http://www.joomlatutos.com' target='_blank'>www.joomlatutos.com</a></p>"
COM_XMAP_TITLE="Xmap"
DEFAULT="Défaut"
XMAP_FILTER_SEARCH_DESC="Filtre de recherche de plan du site"
COM_XMAP_SITEMAP_HTML_VIEW_DEFAULT_TITLE="Plan du site HTML"
COM_XMAP_SITEMAP_HTML_VIEW_DEFAULT_DESC="Afficher un plan du site au format HTML"
COM_XMAP_SITEMAP_XML_VIEW_DEFAULT_TITLE="Plan du site XML"
COM_XMAP_SITEMAP_XML_VIEW_DEFAULT_DESC="Affichez un plan du site au format XML"
COM_XMAP_SELECT_AN_SITEMAP="Choisissez un plan du site"
COM_XMAP_SELECT_A_SITEMAP="Plan du site"
COM_XMAP_CHANGE_SITEMAP_BUTTON="Changement"
COM_XMAP_CHANGE_SITEMAP="Sélectionnez un plan du site dans la liste"
XMAP_INSTALLING_XMAP="Installation du composant Xmap, générateur de plans de site pour Joomla!"
XMAP_UPGRADING_XMAP="Mise à jour du composant Xmap, générateur de plans de site pour Joomla!"
XMAP_UNISTALLING_XMAP_EXTENSIONS="Désinstallation de Xmap et ses extensions"
XMAP_INSTALLED_EXTENSION_X="Installation de l'extension %s"
XMAP_NOT_INSTALLED_EXTENSION_X="Impossible d'installer l'extension pour %s"
COM_INSTALLER_TYPE_XMAP_EXT="Extension Xmap"
COM_XMAP_ATTRIBS_SITEMAP_SETTINGS_LABEL="Paramètres Plan du site"
COM_XMAP_INCLUDE_CSS_LABEL="Inclure les styles Xmap"
COM_XMAP_INCLUDE_CSS_DESC="Sélectionner 'Oui' pour inclure la feuille de style CSS de Xmap pour l'affichage des plans du site."language/fr-FR/fr-FR.plg_privacy_consents.ini000060400000001124152453623440015114 0ustar00; @date        2018-10-24
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_PRIVACY_CONSENTS="Confidentialité - Consentement"
PLG_PRIVACY_CONSENTS_XML_DESCRIPTION="Responsable du traitement des demandes relatives à la confidentialité pour les données de consentement du noyau Joomla."
language/fr-FR/fr-FR.com_contact.ini000060400000063705152453623440013167 0ustar00; @date        2015-01-30
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_CONTACT="Fiches de contact"
COM_CONTACT_BASIC_OPTIONS_FIELDSET_LABEL="Affichage des fiches de contact"
; COM_CONTACT_BATCH_MENU_LABEL is deprecated, use JLIB_HTML_BATCH_MENU_LABEL instead.
COM_CONTACT_BATCH_MENU_LABEL="Sélectionnez la catégorie à déplacer/copier"
COM_CONTACT_BATCH_OPTIONS="Traitement par lot des contacts sélectionnés"
COM_CONTACT_BATCH_TIP="Si une catégorie est sélectionnée pour copier/déplacer, les actions sélectionnées seront appliquées aux contacts copiés ou déplacés. Sinon, toutes les actions seront appliquées aux contacts sélectionnés."
COM_CONTACT_CATEGORIES_VIEW_DEFAULT_DESC="Affiche une liste des catégories de fiches de contact d'une catégorie parente."
COM_CONTACT_CATEGORY_VIEW_DEFAULT_DESC="Affiche la liste des fiches de contact d'une catégorie."
COM_CONTACT_CHANGE_CONTACT="Sélectionner ou changer le contact"
; COM_CONTACT_CHANGE_CONTACT_BUTTON deprecated, use COM_CONTACT_CHANGE_CONTACT instead.
COM_CONTACT_CHANGE_CONTACT_BUTTON="Changer le contact"
COM_CONTACT_CONFIG_INTEGRATION_SETTINGS_DESC="Ces paramètres déterminent la manière dont le 'Composant' interagit avec les autres extensions."
COM_CONTACT_CONFIGURATION="Fiches de contact : paramètres"
COM_CONTACT_CONTACT_DETAILS="Détails"
COM_CONTACT_CONTACT_DISPLAY_DETAILS="Affiche les paramètres des fiches de contact."
COM_CONTACT_CONTACT_SETTINGS_LABEL="Paramètres des fiches de contacts"
COM_CONTACT_CONTACT_VIEW_DEFAULT_DESC="Ceci crée un lien vers les informations correspondant au contact."
COM_CONTACT_CONTACTS="Fiches de contact"
COM_CONTACT_DETAILS="Informations sur le contact"
COM_CONTACT_EDIT_CONTACT="Contact"
COM_CONTACT_EDIT_DETAILS="Modifier les informations de la fiche de contact."
COM_CONTACT_ERROR_UNIQUE_ALIAS="Un autre contact de cette catégorie utilise déjà cet alias (rappel : ce contact peut se trouver dans la corbeille)"
COM_CONTACT_ERROR_ALL_LANGUAGE_ASSOCIATED="Une fiche de contact attribuée au paramètre langue 'Toutes' ne peut pas être associée. Les associations n'ont pas été appliquées."
COM_CONTACT_FIELD_ARTICLES_DISPLAY_NUM_DESC="Nombre d'articles à lister."
COM_CONTACT_FIELD_ARTICLES_DISPLAY_NUM_LABEL="# Articles à lister"
COM_CONTACT_FIELD_ARTICLES_SHOW_DESC="Afficher/Masquer dans la fiche les articles créés par l'utilisateur lié au contact."
COM_CONTACT_FIELD_ARTICLES_SHOW_LABEL="Articles du contact"
COM_CONTACT_FIELD_BREADCRUMBS_DESC="Afficher/Masquer la catégorie dans le fil de navigation"
COM_CONTACT_FIELD_BREADCRUMBS_LABEL="Catégorie dans la navigation"
COM_CONTACT_FIELD_CAPTCHA_DESC="Sélectionnez le plug-in Captcha qui doit être utilisé dans les formulaires de contact.<br />Vérifiez que les informations requises soient indiquées dans les paramètres du plug-in, accessible depuis la gestion des plug-ins de Joomla. <br />Si 'Paramètres globaux' est sélectionné, assurez-vous qu'un plug-in Captcha est choisi dans la Configuration globale."
COM_CONTACT_FIELD_CAPTCHA_LABEL="Captcha à utiliser"
COM_CONTACT_FIELD_CATEGORIES_DESC="Afficher/Masquer la catégorie parente et la liste de ses catégories."
COM_CONTACT_FIELD_CATEGORIES_LABEL="Sélectionnez une catégorie parente"
COM_CONTACT_FIELD_CATEGORY_DESC="Sélectionnez la catégorie de fiches de contact à afficher"
COM_CONTACT_FIELD_CATEGORY_LABEL="Sélectionner une catégorie"
COM_CONTACT_FIELD_CONFIG_ALLOW_VCARD_DESC="Autoriser l'affichage du lien vCard"
COM_CONTACT_FIELD_CONFIG_ALLOW_VCARD_LABEL="Autoriser vCard"
COM_CONTACT_FIELD_CONFIG_BANNED_EMAIL_DESC="Liste des adresses e-mail non autorisées à utiliser les formulaires de contact. Séparez les adresses d'e-mail multiples avec un point-virgule."
COM_CONTACT_FIELD_CONFIG_BANNED_EMAIL_LABEL="E-mail bannis"
COM_CONTACT_FIELD_CONFIG_BANNED_SUBJECT_DESC="Liste des sujets non autorisés dans les formulaires de contact. Séparez les sujets multiples avec un point-virgule."
COM_CONTACT_FIELD_CONFIG_BANNED_SUBJECT_LABEL="Sujets bannis"
COM_CONTACT_FIELD_CONFIG_BANNED_TEXT_DESC="Liste des mots non autorisés dans les formulaires de contact. Séparez les mots multiples avec un point-virgule."
COM_CONTACT_FIELD_CONFIG_BANNED_TEXT_LABEL="Mots bannis"
COM_CONTACT_FIELD_CONFIG_CATEGORIES_DESC="Ces paramètres s'appliquent aux catégories des fiches de contact, à moins qu'ils soient modifiés par un lien de menu spécifique."
COM_CONTACT_FIELD_CONFIG_CATEGORY_DESC="Ces paramètres s'appliquent à la catégorie d'une fiche de contact, à moins qu'ils soient modifiés par un lien de menu spécifique."
COM_CONTACT_FIELD_CONFIG_CONTACT_FORM="Formulaire"
COM_CONTACT_FIELD_CONFIG_COUNTRY_DESC="Afficher/Masquer la colonne Pays dans l'affichage en liste des fiches de contact."
COM_CONTACT_FIELD_CONFIG_COUNTRY_LABEL="Pays"
COM_CONTACT_FIELD_CONFIG_CUSTOM_REPLY_DESC="Activer/Désactiver la réponse automatisée, permettant aux plug-ins d'interagir avec d'autres systèmes."
COM_CONTACT_FIELD_CONFIG_CUSTOM_REPLY_LABEL="Réponse personnalisée"
COM_CONTACT_FIELD_CONFIG_EMAIL_DESC="Afficher/Masquer la colonne 'E-mail' dans l'affichage en liste des fiches de contact."
COM_CONTACT_FIELD_CONFIG_FAX_DESC="Afficher/Masquer la colonne 'Fax' dans l'affichage en liste des fiches de contact."
COM_CONTACT_FIELD_CONFIG_FAX_LABEL="Fax"
COM_CONTACT_FIELD_CONFIG_INDIVIDUAL_CONTACT_DESC="Ces paramètres s'appliquent aux fiches de contact, à moins qu'ils soient modifiés par un lien de menu ou une fiche de contact spécifique."
COM_CONTACT_FIELD_CONFIG_INDIVIDUAL_CONTACT_DISPLAY="Contact"
COM_CONTACT_FIELD_CONFIG_SHOW_IMAGE_LABEL="Image"
COM_CONTACT_FIELD_CONFIG_SHOW_IMAGE_DESC="Afficher ou non une colonne 'Image' dans la liste des contacts."
COM_CONTACT_FIELD_CONFIG_MOBILE_DESC="Afficher/Masquer la colonne 'Téléphone Mobile' dans l'affichage en liste des fiches de contact."
COM_CONTACT_FIELD_CONFIG_MOBILE_LABEL="Mobile"
COM_CONTACT_FIELD_CONFIG_PHONE_DESC="Afficher/Masquer la colonne 'Téléphone' dans l'affichage en liste des fiches de contact."
COM_CONTACT_FIELD_CONFIG_PHONE_LABEL="Téléphone"
COM_CONTACT_FIELD_CONFIG_POSITION_DESC="Afficher/Masquer la colonne Fonction dans l'affichage en liste des fiches de contact."
COM_CONTACT_FIELD_CONFIG_POSITION_LABEL="Fonction"
COM_CONTACT_FIELD_CONFIG_REDIRECT_DESC="Saisissez une adresse URL vers laquelle l'utilisateur doit être redirigé après l'envoi du formulaire."
COM_CONTACT_FIELD_CONFIG_REDIRECT_LABEL="Redirection après envoi"
COM_CONTACT_FIELD_CONFIG_SESSION_CHECK_DESC="Vérifier la présence d'un cookie de session empêchant les visiteurs n'ayant pas activé les cookies d'utiliser les formulaires de contact."
COM_CONTACT_FIELD_CONFIG_SESSION_CHECK_LABEL="Vérification de session"
COM_CONTACT_FIELD_CONFIG_STATE_LABEL="État/Région"
COM_CONTACT_FIELD_CONFIG_STATE_DESC="Afficher/Masquer la colonne 'État/Région' dans l'affichage en liste des contacts."
COM_CONTACT_FIELD_CONFIG_SUBURB_DESC="Afficher/Masquer la colonne 'Ville' dans l'affichage en liste des contacts."
COM_CONTACT_FIELD_CONFIG_SUBURB_LABEL="Ville"
COM_CONTACT_FIELD_CONFIG_TABLE_OF_CONTACTS_DESC="Ces paramètres s'appliquent à l'affichage en liste des fiches de contact, à moins qu'ils soient modifiés par un lien de menu."
COM_CONTACT_FIELD_CONFIG_VCARD_DESC="Afficher/Masquer la colonne vCard dans l'affichage en liste des contacts."
COM_CONTACT_FIELD_CONFIG_VCARD_LABEL="vCard"
COM_CONTACT_FIELD_CONTACT_SHOW_CATEGORY_DESC="<strong>Masquer</strong> : la catégorie du contact ne sera pas affichée.<br /><strong>Afficher sans lien</strong> : le nom de la catégorie sera affichée en texte simple.<br /><strong>Afficher avec lien</strong> : le nom de la catégorie sera affiché en tant que lien vers son contenu."
COM_CONTACT_FIELD_CONTACT_SHOW_CATEGORY_LABEL="Catégorie"
COM_CONTACT_FIELD_CONTACT_SHOW_LIST_DESC="Afficher/Masquer la liste déroulante permettant de passer d'une fiche de contact à une autre d'une même catégorie."
COM_CONTACT_FIELD_CONTACT_SHOW_LIST_LABEL="Liste déroulante"
COM_CONTACT_FIELD_CREATED_BY_ALIAS_DESC="Vous pouvez saisir un alias à afficher à la place du nom de l'utilisateur qui a créé la fiche de contact."
COM_CONTACT_FIELD_CREATED_BY_ALIAS_LABEL="Créé par 'Alias'"
COM_CONTACT_FIELD_CREATED_BY_DESC="Vous pouvez remplacer le nom de l'utilisateur qui a créé la fiche de contact."
COM_CONTACT_FIELD_CREATED_DESC="Date de création de la fiche de contact."
COM_CONTACT_FIELD_CREATED_LABEL="Date de création"
; The following six strings are deprecated and will be removed in 4.0
COM_CONTACT_FIELD_EMAIL_BANNED_EMAIL_DESC="Adresses e-mail non autorisées à utiliser les formulaires de contact. Séparer plusieurs adresses par un point-virgule."
COM_CONTACT_FIELD_EMAIL_BANNED_EMAIL_LABEL="E-mail bannis"
COM_CONTACT_FIELD_EMAIL_BANNED_SUBJECT_DESC="Sujets interdits dans les formulaires de contact. Séparer plusieurs sujets par un point-virgule."
COM_CONTACT_FIELD_EMAIL_BANNED_SUBJECT_LABEL="Sujets bannis"
COM_CONTACT_FIELD_EMAIL_BANNED_TEXT_DESC="Mots interdits dans les formulaires de contact. Séparer plusieurs mots par un point-virgule."
COM_CONTACT_FIELD_EMAIL_BANNED_TEXT_LABEL="Mots bannis"
COM_CONTACT_FIELD_EMAIL_EMAIL_COPY_DESC="Afficher/Masquer une case à cocher permettant à l'expéditeur de recevoir une copie de l'e-mail envoyé."
COM_CONTACT_FIELD_EMAIL_EMAIL_COPY_LABEL="Copie à l'expéditeur"
COM_CONTACT_FIELD_EMAIL_SHOW_FORM_DESC="Afficher/Masquer le formulaire de contact."
COM_CONTACT_FIELD_EMAIL_SHOW_FORM_LABEL="Formulaire de contact"
COM_CONTACT_FIELD_FEATURED_DESC="Activer/Désactiver la fiche de contact dans la page des contacts mis en vedette."
COM_CONTACT_FIELD_FEEDLINK_DESC="Afficher/Masquer le lien du fil d'actualité RSS ou ATOM de cette catégorie."
COM_CONTACT_FIELD_FEEDLINK_LABEL="Lien du fil d'actualité"
COM_CONTACT_FIELD_ICONS_ADDRESS_DESC="Sélectionnez l'icône de l'adresse. Si aucune icône n'est sélectionnée, celle par défaut sera utilisée."
COM_CONTACT_FIELD_ICONS_ADDRESS_LABEL="Icône 'Adresse'"
COM_CONTACT_FIELD_ICONS_EMAIL_DESC="Sélectionnez l'icône de l'e-mail. Si aucune icône n'est sélectionnée, celle par défaut sera utilisée."
COM_CONTACT_FIELD_ICONS_EMAIL_LABEL="Icône 'E-mail'"
COM_CONTACT_FIELD_ICONS_FAX_DESC="Sélectionnez l'icône du fax. Si aucune icône n'est sélectionnée, celle par défaut sera utilisée."
COM_CONTACT_FIELD_ICONS_FAX_LABEL="Icône 'Fax'"
COM_CONTACT_FIELD_ICONS_MISC_DESC="Sélectionnez l'icône de l'élément 'Divers'. Si aucune icône n'est sélectionnée, celle par défaut sera utilisée."
COM_CONTACT_FIELD_ICONS_MISC_LABEL="Icône 'Divers'"
COM_CONTACT_FIELD_ICONS_MOBILE_DESC="Sélectionnez l'icône du téléphone mobile. Si aucune icône n'est sélectionnée, celle par défaut sera utilisée."
COM_CONTACT_FIELD_ICONS_MOBILE_LABEL="Icône 'Mobile'"
COM_CONTACT_FIELD_ICONS_SETTINGS_DESC="Choisissez d'afficher les icônes, du texte, ou rien."
COM_CONTACT_FIELD_ICONS_SETTINGS_LABEL="Paramètres"
COM_CONTACT_FIELD_ICONS_TELEPHONE_DESC="Sélectionnez l'icône du téléphone. Si aucune icône n'est sélectionnée, celle par défaut sera utilisée."
COM_CONTACT_FIELD_ICONS_TELEPHONE_LABEL="Icône 'Téléphone'"
COM_CONTACT_FIELD_IMAGE_ALIGN_DESC="Alignement de l'image dans la fiche de contact."
COM_CONTACT_FIELD_IMAGE_ALIGN_LABEL="Alignement de l'image"
COM_CONTACT_FIELD_INFORMATION_ADDRESS_DESC="Adresse du contact"
COM_CONTACT_FIELD_INFORMATION_ADDRESS_LABEL="Adresse"
COM_CONTACT_FIELD_INFORMATION_COUNTRY_DESC="Pays du contact"
COM_CONTACT_FIELD_INFORMATION_COUNTRY_LABEL="Pays"
COM_CONTACT_FIELD_INFORMATION_EMAIL_DESC="E-mail du contact"
COM_CONTACT_FIELD_INFORMATION_FAX_DESC="Fax du contact"
COM_CONTACT_FIELD_INFORMATION_FAX_LABEL="Fax"
COM_CONTACT_FIELD_INFORMATION_MISC_DESC="Informations diverses sur le contact"
COM_CONTACT_FIELD_INFORMATION_MISC_LABEL="Autres informations"
COM_CONTACT_FIELD_INFORMATION_MOBILE_DESC="Téléphone mobile du contact"
COM_CONTACT_FIELD_INFORMATION_MOBILE_LABEL="Mobile"
COM_CONTACT_FIELD_INFORMATION_POSITION_DESC="Fonction du contact"
COM_CONTACT_FIELD_INFORMATION_POSITION_LABEL="Fonction"
COM_CONTACT_FIELD_INFORMATION_POSTCODE_DESC="Code postal du contact"
COM_CONTACT_FIELD_INFORMATION_POSTCODE_LABEL="Code postal"
COM_CONTACT_FIELD_INFORMATION_STATE_DESC="État/Région du contact"
COM_CONTACT_FIELD_INFORMATION_STATE_LABEL="État/Région"
COM_CONTACT_FIELD_INFORMATION_SUBURB_DESC="Ville du contact"
COM_CONTACT_FIELD_INFORMATION_SUBURB_LABEL="Ville"
COM_CONTACT_FIELD_INFORMATION_TELEPHONE_DESC="Téléphone du contact"
COM_CONTACT_FIELD_INFORMATION_TELEPHONE_LABEL="Téléphone"
COM_CONTACT_FIELD_INFORMATION_WEBPAGE_DESC="Site web du contact. Les liens IDN (Noms de domaines internationaux) sont convertis en punycode lors de la sauvegarde."
COM_CONTACT_FIELD_INFORMATION_WEBPAGE_LABEL="Site Web"
COM_CONTACT_FIELD_INITIAL_SORT_DESC="Choisissez le ou les champs par lesquels les contacts doivent être triés."
COM_CONTACT_FIELD_INITIAL_SORT_LABEL="Trier par"
COM_CONTACT_FIELD_LANGUAGE_DESC="Assigner ce contact à une langue."
COM_CONTACT_FIELD_LIMIT_BOX_DESC="Afficher/Masquer la liste déroulante permettant de choisir le nombre de fiches de contact à afficher dans l'affichage en liste."
COM_CONTACT_FIELD_LIMIT_BOX_LABEL="Choix du nombre"
COM_CONTACT_FIELD_LINK_NAME_DESC="Liens supplémentaires pour ce contact"
COM_CONTACT_FIELD_LINKA_DESC="Saisir une URL pour le lien A"
COM_CONTACT_FIELD_LINKA_LABEL="URL du Lien A"
COM_CONTACT_FIELD_LINKA_NAME_LABEL="Nom du lien A"
COM_CONTACT_FIELD_LINKB_DESC="Saisir une URL pour le lien B"
COM_CONTACT_FIELD_LINKB_LABEL="URL du Lien B"
COM_CONTACT_FIELD_LINKB_NAME_LABEL="Nom du Lien B"
COM_CONTACT_FIELD_LINKC_DESC="Saisir une URL pour le lien C"
COM_CONTACT_FIELD_LINKC_LABEL="URL du Lien C"
COM_CONTACT_FIELD_LINKC_NAME_LABEL="Nom du lien C"
COM_CONTACT_FIELD_LINKD_DESC="Saisir une URL pour le lien D"
COM_CONTACT_FIELD_LINKD_LABEL="URL du Lien D"
COM_CONTACT_FIELD_LINKD_NAME_LABEL="Nom du lien D"
COM_CONTACT_FIELD_LINKE_DESC="Saisir une URL pour le lien E"
COM_CONTACT_FIELD_LINKE_LABEL="URL du Lien E"
COM_CONTACT_FIELD_LINKE_NAME_LABEL="Nom du lien E"
COM_CONTACT_FIELD_LINKED_USER_DESC="Lier le contact à un utilisateur enregistré sur le site."
COM_CONTACT_FIELD_LINKED_USER_LABEL="Utilisateur lié"
COM_CONTACT_FIELD_LINKED_USER_LABEL_ASC="Utilisateur lié ascendant"
COM_CONTACT_FIELD_LINKED_USER_LABEL_DESC="Utilisateur lié descendant"
COM_CONTACT_FIELD_MODIFIED_BY_DESC="Nom de l'utilisateur qui a modifié ce contact."
COM_CONTACT_FIELD_MODIFIED_DESC="Date et heure de la dernière modification de la fiche de contact."
COM_CONTACT_FIELD_NAME_DESC="Nom du contact"
COM_CONTACT_FIELD_NAME_LABEL="Nom"
COM_CONTACT_FIELD_NUM_CONTACTS_DESC="Nombre de fiches de contacts à afficher en affichage en liste."
COM_CONTACT_FIELD_NUM_CONTACTS_LABEL="Nombre de contacts"
COM_CONTACT_FIELD_PARAMS_ADD_MAILTO_LINK_DESC="Ajouter un lien mailto : à afficher dans l'adresse e-mail."
COM_CONTACT_FIELD_PARAMS_ADD_MAILTO_LINK_LABEL="Ajouter un lien mailto:"
COM_CONTACT_FIELD_PARAMS_CONTACT_E_MAIL_DESC="Afficher/Masquer l'adresse e-mail dans la fiche de contact."
COM_CONTACT_FIELD_PARAMS_CONTACT_POSITION_DESC="Afficher/Masquer la fonction dans la fiche de contact."
COM_CONTACT_FIELD_PARAMS_CONTACT_POSITION_LABEL="Fonction du contact"
COM_CONTACT_FIELD_PARAMS_COUNTRY_DESC="Afficher/Masquer le pays dans la fiche de contact."
COM_CONTACT_FIELD_PARAMS_COUNTRY_LABEL="Pays"
COM_CONTACT_FIELD_PARAMS_FAX_DESC="Afficher/Masquer le numéro de fax dans la fiche de contact."
COM_CONTACT_FIELD_PARAMS_FAX_LABEL="Fax"
COM_CONTACT_FIELD_PARAMS_IMAGE_DESC="Sélectionnez l'image à afficher dans la fiche de contact."
COM_CONTACT_FIELD_PARAMS_IMAGE_LABEL="Image"
COM_CONTACT_FIELD_PARAMS_MISC_INFO_DESC="Afficher/Masquer les informations diverses dans la fiche de contact."
COM_CONTACT_FIELD_PARAMS_MISC_INFO_LABEL="Informations diverses"
COM_CONTACT_FIELD_PARAMS_MOBILE_DESC="Afficher/Masquer le numéro du téléphone mobile dans la fiche de contact."
COM_CONTACT_FIELD_PARAMS_MOBILE_LABEL="Téléphone mobile"
COM_CONTACT_FIELD_PARAMS_NAME_DESC="Afficher/masquer le nom dans la fiche de contact."
COM_CONTACT_FIELD_PARAMS_NAME_LABEL="Nom"
COM_CONTACT_FIELD_PARAMS_POST-ZIP_CODE_DESC="Afficher/Masquer le code ou numéro postal dans la fiche de contact."
COM_CONTACT_FIELD_PARAMS_POST-ZIP_CODE_LABEL="Code postal"
COM_CONTACT_FIELD_PARAMS_SHOW_IMAGE_DESC="Afficher/Masquer l'image dans la fiche de contact."
COM_CONTACT_FIELD_PARAMS_SHOW_IMAGE_LABEL="Image"
COM_CONTACT_FIELD_PARAMS_STATE-COUNTY_DESC="Afficher/Masquer l'état / région dans la fiche de contact."
COM_CONTACT_FIELD_PARAMS_STATE-COUNTY_LABEL="État / Région"
COM_CONTACT_FIELD_PARAMS_STREET_ADDRESS_DESC="Afficher/Masquer l'adresse dans la fiche de contact."
COM_CONTACT_FIELD_PARAMS_STREET_ADDRESS_LABEL="Adresse"
COM_CONTACT_FIELD_PARAMS_TELEPHONE_DESC="Afficher/Masquer le numéro de téléphone dans la fiche de contact."
COM_CONTACT_FIELD_PARAMS_TELEPHONE_LABEL="Téléphone"
COM_CONTACT_FIELD_PARAMS_TOWN-SUBURB_DESC="Afficher/Masquer la ville/localité dans la fiche de contact."
COM_CONTACT_FIELD_PARAMS_TOWN-SUBURB_LABEL="Ville / Localité"
COM_CONTACT_FIELD_PARAMS_VCARD_DESC="Afficher/Masquer le lien d'export au format vCard dans la fiche de contact."
COM_CONTACT_FIELD_PARAMS_VCARD_LABEL="Lien vCard"
COM_CONTACT_FIELD_PARAMS_WEBPAGE_DESC="Afficher/Masquer la page web dans la fiche de contact."
COM_CONTACT_FIELD_PARAMS_WEBPAGE_LABEL="Page web"
COM_CONTACT_FIELD_PRESENTATION_DESC="Style utilisé pour afficher les différentes sections du formulaire de contact"
COM_CONTACT_FIELD_PRESENTATION_LABEL="Format d'affichage"
COM_CONTACT_FIELD_PROFILE_SHOW_DESC="Afficher/masquer le profil du contact si lié à un utilisateur enregistré sur le site."
COM_CONTACT_FIELD_PROFILE_SHOW_LABEL="Profil de l'utilisateur"
COM_CONTACT_FIELD_PUBLISH_DOWN_DESC="Date optionnelle de fin de publication de la fiche de contact."
COM_CONTACT_FIELD_PUBLISH_DOWN_LABEL="Fin de publication"
COM_CONTACT_FIELD_PUBLISH_UP_DESC="Date optionnelle de début de publication de la fiche de contact."
COM_CONTACT_FIELD_PUBLISH_UP_LABEL="Début de publication"
COM_CONTACT_FIELD_SHOW_CAT_ITEMS_DESC="Afficher ou masquer le nombre de fiches de contact de la catégorie"
COM_CONTACT_FIELD_SHOW_CAT_ITEMS_LABEL="Fiches par catégorie"
COM_CONTACT_FIELD_SHOW_CATEGORY_DESC="Afficher/Masquer la catégorie de la fiche de contact."
COM_CONTACT_FIELD_SHOW_LINKS_DESC="Afficher/masquer les liens du contact."
COM_CONTACT_FIELD_SHOW_LINKS_LABEL="Liens"
COM_CONTACT_FIELD_SHOW_CAT_TAGS_DESC="Afficher/masquer les tags d'une catégorie de contacts."
COM_CONTACT_FIELD_SHOW_CAT_TAGS_LABEL="Tags de catégorie"
COM_CONTACT_FIELD_SHOW_TAGS_DESC="Afficher/masquer les tags d'un contact."
COM_CONTACT_FIELD_SHOW_TAGS_LABEL="Tags"
COM_CONTACT_FIELD_SHOW_INFO_LABEL="Informations du contact"
COM_CONTACT_FIELD_SHOW_INFO_DESC="Afficher/masquer les informations du contact."
COM_CONTACT_FIELD_SORTNAME1_DESC="La partie du nom à utiliser comme premier champ de tri"
COM_CONTACT_FIELD_SORTNAME1_LABEL="Premier champ de tri"
COM_CONTACT_FIELD_SORTNAME2_DESC="La partie du nom à utiliser comme second champ de tri"
COM_CONTACT_FIELD_SORTNAME2_LABEL="Second champ de tri"
COM_CONTACT_FIELD_SORTNAME3_DESC="La partie du nom à utiliser comme troisième champ de tri"
COM_CONTACT_FIELD_SORTNAME3_LABEL="Troisième champ de tri"
COM_CONTACT_FIELD_USER_CUSTOM_FIELDS_SHOW_LABEL="Afficher les champs personnalisés de l'utilisateur "
COM_CONTACT_FIELD_USER_CUSTOM_FIELDS_SHOW_DESC="Afficher les champs personnalisés de l'utilisateur qui appartiennent à tous les groupes de champs ou seulement à des groupes de champs sélectionnés."
COM_CONTACT_FIELD_VALUE_ICONS="Icônes"
COM_CONTACT_FIELD_VALUE_NAME="Nom"
COM_CONTACT_FIELD_VALUE_NO_LINK="Afficher sans lien"
COM_CONTACT_FIELD_VALUE_NONE="Aucun"
COM_CONTACT_FIELD_VALUE_ORDERING="Tri"
COM_CONTACT_FIELD_VALUE_PLAIN="Complet"
COM_CONTACT_FIELD_VALUE_SLIDERS="Calques"
COM_CONTACT_FIELD_VALUE_SORT_NAME="Tri par nom"
COM_CONTACT_FIELD_VALUE_TABS="Onglets"
COM_CONTACT_FIELD_VALUE_TEXT="Texte du copyright"
COM_CONTACT_FIELD_VALUE_USE_CONTACT_SETTINGS="Utiliser les paramètres du Contact"
COM_CONTACT_FIELD_VALUE_WITH_LINK="Afficher avec lien"
COM_CONTACT_FIELD_VERSION_LABEL="Révision"
COM_CONTACT_FIELD_VERSION_DESC="Nombre de révision de la fiche de contact (correspond au nombre d'application de la fonction 'Enregistrer')."
COM_CONTACT_FIELDS_CONTACT_FIELDS_TITLE="Fiches de Contact : Champs"
COM_CONTACT_FIELDS_CONTACT_FIELD_ADD_TITLE="Fiches de Contact : Nouveau champ"
COM_CONTACT_FIELDS_CONTACT_FIELD_EDIT_TITLE="Fiches de Contact : Modifier le champ"
COM_CONTACT_FIELDS_CONTEXT_CONTACT="Fiche de contact"
COM_CONTACT_FIELDS_CONTEXT_MAIL="E-mail"
COM_CONTACT_FIELDSET_CONTACT_FORM="Formulaire de contact"
COM_CONTACT_FIELDSET_CONTACT_LABEL="Formulaire"
COM_CONTACT_FIELDSET_CONTACTFORM_LABEL="Paramètres de l'e-mail"
COM_CONTACT_FIELDSET_OPTIONS="Affichage"
COM_CONTACT_FILTER_DESC="Choisissez le type de filtre à afficher par défaut."
COM_CONTACT_FILTER_LABEL="Champ filtre"
COM_CONTACT_FILTER_SEARCH_DESC="Recherche sur titre ou alias. Préfixe avec ID: recherche sur l'ID de la fiche de contact."
COM_CONTACT_FILTER_SEARCH_LABEL="Rechercher Contacts"
COM_CONTACT_ICONS_SETTINGS="Icônes"
COM_CONTACT_HEADING_ASSOCIATION="Association"
COM_CONTACT_HITS_DESC="Nombre de clics pour ce contact"
COM_CONTACT_ID_LABEL="Id"
; The following 2 strings are deprecated and will be removed with 4.0.
COM_CONTACT_ITEM_ASSOCIATIONS_FIELDSET_LABEL="Associations de fiches de contact"
COM_CONTACT_ITEM_ASSOCIATIONS_FIELDSET_DESC="Choisissez l'élément à associer dans la langue cible.<br />Ce choix ne concerne que les sites multilingues, il ne s'affiche que si le paramètre 'Association' est réglé sur 'Oui' dans le plug-in 'Filtre de langue'.<br /><strong>Note :<strong> l'association d'éléments de langues différentes permet de rediriger l'utilisateur vers un élément spécifique au moment du changement de langue. Pour l'utiliser, assurez-vous que le module de changement de langue soit affiché sur les pages des éléments concernés.<br />Une catégorie au paramètre langue 'Toutes' ne peut pas être associé."
COM_CONTACT_MAIL_FIELDSET_LABEL="Paramètres de l'e-mail"
COM_CONTACT_MANAGER_CONTACT="Fiches de contact : Nouvelle/Modifier"
COM_CONTACT_MANAGER_CONTACT_EDIT="Fiches de contact: Modifier"
COM_CONTACT_MANAGER_CONTACT_NEW="Fiches de contact: Nouvelle fiche"
COM_CONTACT_MANAGER_CONTACTS="Fiches de contact"
COM_CONTACT_N_ITEMS_ARCHIVED="%d fiches de contact archivées"
COM_CONTACT_N_ITEMS_ARCHIVED_1="%d fiche de contact archivée"
COM_CONTACT_N_ITEMS_CHECKED_IN_0="Aucune fiche de contact déverrouillée"
COM_CONTACT_N_ITEMS_CHECKED_IN_1="%d fiche de contact déverrouillée"
COM_CONTACT_N_ITEMS_CHECKED_IN_MORE="%d fiches de contact déverrouillées"
COM_CONTACT_N_ITEMS_DELETED="%d fiches de contact supprimées"
COM_CONTACT_N_ITEMS_DELETED_1="%d fiche de contact supprimée"
COM_CONTACT_N_ITEMS_FEATURED="%d fiches de contact mise en vedette."
COM_CONTACT_N_ITEMS_FEATURED_1="%d fiche de contact mise en vedette."
COM_CONTACT_N_ITEMS_PUBLISHED="%d fiches de contact publiées"
COM_CONTACT_N_ITEMS_PUBLISHED_1="%d fiche de contact publiée"
COM_CONTACT_N_ITEMS_TRASHED="%d fiches de contact mises à la corbeille"
COM_CONTACT_N_ITEMS_TRASHED_1="%d fiche de contact mise à la corbeille"
COM_CONTACT_N_ITEMS_UNFEATURED="%d contacts non mis en exergue."
COM_CONTACT_N_ITEMS_UNFEATURED_1="%d contact non mis en exergue.."
COM_CONTACT_N_ITEMS_UNPUBLISHED="%d fiches de contact dépubliées"
COM_CONTACT_N_ITEMS_UNPUBLISHED_1="%d fiche de contact dépubliée"
COM_CONTACT_NAME_DESC="Nom du contact"
COM_CONTACT_NEW_CONTACT="Nouvelle fiche de contact"
COM_CONTACT_NO_ITEM_SELECTED="Aucune fiche de contact sélectionnée"
COM_CONTACT_OPTIONS="Paramètres"
COM_CONTACT_SAVE_SUCCESS="Fiche de contact enregistrée."
COM_CONTACT_SEARCH_IN_NAME="Rechercher un contact par son nom"
COM_CONTACT_SELECT_A_CONTACT="Sélectionner un contact"
COM_CONTACT_SELECT_CONTACT_DESC="Sélectionner ou créer une fiche de contact à afficher."
COM_CONTACT_SELECT_CONTACT_LABEL="Sélection du contact"
COM_CONTACT_SELECT_USER="Sélectionner un utilisateur"
COM_CONTACT_SHOW_EMAIL_ADDRESS_DESC="Afficher/Masquer l'adresse e-mail du contact."
COM_CONTACT_SHOW_EMAIL_ADDRESS_LABEL="Adresse e-mail"
COM_CONTACT_SHOW_EMPTY_CATEGORIES_DESC="Afficher/Masquer les catégories vides. Une catégorie est vide si elle ne contient ni sous-catégories ni fiche de contact."
COM_CONTACT_SUBMENU_CATEGORIES="Catégories"
COM_CONTACT_SUBMENU_CONTACTS="Contacts"
COM_CONTACT_TIP_ASSOCIATION="Fiches de contact associées"
COM_CONTACT_TOGGLE_TO_FEATURE="Cliquez pour passer le statut du contact à 'Favori'"
COM_CONTACT_TOGGLE_TO_UNFEATURE="Cliquez pour passer le statut du contact à 'Non favori'"
COM_CONTACT_UNFEATURED="Contact non-favori"
COM_CONTACT_WARNING_CATEGORY="Cette catégorie n'est pas valide"
COM_CONTACT_WARNING_PROVIDE_VALID_NAME="Veuillez saisir un nom valide"
COM_CONTACT_WARNING_PROVIDE_VALID_URL="Veuillez saisir une URL valide"
COM_CONTACT_WARNING_SELECT_CONTACT_TOPUBLISH="Veuillez sélectionner un contact à publier !"
COM_CONTACT_XML_DESCRIPTION="Composant de gestion des fiches de contact"
JGLOBAL_FIELDSET_MISCELLANEOUS="Informations diverses"
JGLOBAL_NEWITEMSLAST_DESC="Les nouvelles fiches de contact sont placées par défaut en dernière position. Leur position peut être modifiée après enregistrement."
JLIB_HTML_BATCH_USER_LABEL="Réglez l'utilisateur lié"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_CONTACT="Les modification ne s'appliquent qu'à ce composant.<br /><em><strong>Hérité</strong></em> - les droits globaux ou ceux des groupes parents seront utilisés.<br /><em><strong>Refusé</strong></em> - prévaut toujours, quels que soient les droits globaux ou ceux des groupes parents, et s'applique aux éléments enfants.<br /><em><strong>Autorisé</strong></em> - le groupe concerné pourra effectuer cette action dans ce composant sauf si les droits globaux sont différents."
language/fr-FR/fr-FR.plg_editors_none.ini000060400000001445152453623440014221 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_EDITORS_NONE="Éditeur - Non WYSIWYG"
PLG_NONE_XML_DESCRIPTION="Intégration d'un champ de saisie de texte standard, sans mode WYSIWYG (formatage).<br />Définition litérale de WYSIWYG : Ce que vous voyez est ce que vous obtenez.<br /><br />Pour être utilisé, l'éditeur non WYSIWYG doit être déclaré comme 'Éditeur par défaut' dans la configuration globale de Joomla! ou attribué au profil utilisateur souhaité."language/fr-FR/fr-FR.plg_content_fields.sys.ini000060400000001165152453623440015345 0ustar00; @date        2017-02-05
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_CONTENT_FIELDS="Contenu - Champs"
PLG_CONTENT_FIELDS_XML_DESCRIPTION="Ce plug-in permet l'affichage d'un champ personnalisé inséré par le 'Bouton - Champs' ou en utilisant directement la syntaxe {field #} dans la zone de texte de l'éditeur."
language/fr-FR/fr-FR.plg_system_weblinks.sys.ini000060400000001037152453623440015565 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_SYSTEM_WEBLINKS="Système - Liens web"
PLG_SYSTEM_WEBLINKS_XML_DESCRIPTION="Ce plugin renvoie des informations statistiques du composant 'Liens web' de Joomla!"
language/fr-FR/fr-FR.plg_content_joomla.ini000060400000002176152453623440014546 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_CONTENT_JOOMLA="Contenu - Joomla!"
PLG_CONTENT_JOOMLA_FIELD_CHECK_CATEGORIES_DESC="Vérifie qu'une catégorie soit entièrement vide avant de valider sa suppression."
PLG_CONTENT_JOOMLA_FIELD_CHECK_CATEGORIES_LABEL="Vérifier si vide"
PLG_CONTENT_JOOMLA_FIELD_EMAIL_NEW_FE_DESC="Envoi d'un e-mail de notification lorsqu'un article est soumis par l'interface frontale du site aux utilisateurs dont la notification système est cochée dans leur profil accessible depuis l'administration."
PLG_CONTENT_JOOMLA_FIELD_EMAIL_NEW_FE_LABEL="Notification de nouvel article"
PLG_CONTENT_JOOMLA_XML_DESCRIPTION="Processus de traitement des éléments de catégorie par les extensions du noyau ; envoie un e-mail lorsque un nouvel article est soumis par l'espace frontal du site."language/fr-FR/fr-FR.com_contact.sys.ini000060400000003356152453623440014000 0ustar00; @date        2015-01-30
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_CONTACT="Fiches de contact"
COM_CONTACT_CATEGORIES="Catégories"
COM_CONTACT_CATEGORIES_VIEW_DEFAULT_DESC="Affiche une liste des catégories de fiches de contact d'une catégorie parente."
COM_CONTACT_CATEGORIES_VIEW_DEFAULT_OPTION="Défaut"
COM_CONTACT_CATEGORIES_VIEW_DEFAULT_TITLE="Liste des catégories de fiches de contacts"
COM_CONTACT_CATEGORY_ADD_TITLE="Fiches de contact : Ajouter une catégorie"
COM_CONTACT_CATEGORY_EDIT_TITLE="Fiches de contact : Modifier une catégorie"
COM_CONTACT_CATEGORY_VIEW_DEFAULT_DESC="Affiche une liste des fiches de contacts d'une catégorie"
COM_CONTACT_CATEGORY_VIEW_DEFAULT_OPTION="Défaut"
COM_CONTACT_CATEGORY_VIEW_DEFAULT_TITLE="Liste des fiches de contacts d'une catégorie"
COM_CONTACT_CONTACT_VIEW_DEFAULT_DESC="Affiche la fiche d'un contact"
COM_CONTACT_CONTACT_VIEW_DEFAULT_OPTION="Défaut"
COM_CONTACT_CONTACT_VIEW_DEFAULT_TITLE="Contact"
COM_CONTACT_CONTENT_TYPE_CONTACT="Contact"
COM_CONTACT_CONTENT_TYPE_CATEGORY="Catégorie de contacts"
COM_CONTACT_FEATURED_VIEW_DEFAULT_DESC="Affiche une liste des fiches de contacts en vedette"
COM_CONTACT_FEATURED_VIEW_DEFAULT_OPTION="Défaut"
COM_CONTACT_FEATURED_VIEW_DEFAULT_TITLE="Contacts en vedette"
COM_CONTACT_CONTACTS="Contacts"
COM_CONTACT_TAGS_CONTACT="Contact"
COM_CONTACT_TAGS_CATEGORY="Catégorie de contacts"
COM_CONTACT_XML_DESCRIPTION="Composant de gestion des fiches de contacts"
language/fr-FR/fr-FR.plg_fields_list.ini000060400000001707152453623440014033 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_LIST="Champs - Liste"
PLG_FIELDS_LIST_LABEL="Liste (%s)"
PLG_FIELDS_LIST_PARAMS_MULTIPLE_DESC="Permet la sélection de valeurs multiples."
PLG_FIELDS_LIST_PARAMS_MULTIPLE_LABEL="Multiple"
PLG_FIELDS_LIST_PARAMS_OPTIONS_DESC="Les valeurs de la liste."
PLG_FIELDS_LIST_PARAMS_OPTIONS_LABEL="Valeurs de la liste"
PLG_FIELDS_LIST_PARAMS_OPTIONS_VALUE_LABEL="Valeur"
PLG_FIELDS_LIST_PARAMS_OPTIONS_NAME_LABEL="Texte"
PLG_FIELDS_LIST_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'list' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_editors_jce.sys.ini000060400000000651152453623440014636 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS_JCE="Éditeur - JCE"
WF_EDITOR_PLUGIN_TITLE="Éditeur - JCE"
WF_EDITOR_PLUGIN_DESC="Plugin Éditeur JCE"
language/fr-FR/fr-FR.plg_content_contact.ini000060400000002417152453623440014716 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2020 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2020 Open Source Matters. All rights reserved.
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_CONTENT_CONTACT="Contenu - Contact"
PLG_CONTENT_CONTACT_XML_DESCRIPTION="Fournit un lien entre l'auteur d'un article et un contact qui peut être utilisé pour un profil d'auteur."
PLG_CONTENT_CONTACT_PARAM_URL_LABEL="Redirection"
PLG_CONTENT_CONTACT_PARAM_URL_DESCRIPTION="Le nom de l'auteur peut être liè à :<ul><li>Page associée du contact.<li>La page Web spécifiée dans le profil du contact associé.<li>L'e-mail spécifiée dans le profil du contact associé.</ul>"
PLG_CONTENT_CONTACT_PARAM_URL_URL="Page interne du contact"
PLG_CONTENT_CONTACT_PARAM_URL_WEBPAGE="Page Web du contact"
PLG_CONTENT_CONTACT_PARAM_URL_EMAIL="E-mail du contact"
PLG_CONTENT_CONTACT_PARAM_ALIAS_LABEL="Appliquer aussi le lien à l'alias"
PLG_CONTENT_CONTACT_PARAM_ALIAS_DESCRIPTION="Lien vers les données réelles de l'utilisateur même si un alias d'auteur est défini dans les options de l'article."
language/fr-FR/fr-FR.plg_search_content.ini000060400000001667152453623440014536 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SEARCH_CONTENT="Recherche - Articles"
PLG_SEARCH_CONTENT_FIELD_ARCHIVED_DESC="Intégrer les articles archivés dans la recherche."
PLG_SEARCH_CONTENT_FIELD_ARCHIVED_LABEL="Articles archivés"
PLG_SEARCH_CONTENT_FIELD_CONTENT_DESC="Intégrer les articles publiés dans la recherche."
PLG_SEARCH_CONTENT_FIELD_CONTENT_LABEL="Articles"
PLG_SEARCH_CONTENT_FIELD_SEARCHLIMIT_DESC="Nombre de résultats à afficher"
PLG_SEARCH_CONTENT_FIELD_SEARCHLIMIT_LABEL="Limite de recherche"
PLG_SEARCH_CONTENT_XML_DESCRIPTION="Intégration des articles dans la recherche sur le site"
language/fr-FR/fr-FR.plg_jce_editor-toc.ini000060400000002362152453623440014422 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_JCE_EDITOR_TOC="Table des matières pour JCE"
PLG_JCE_EDITOR_TOC_XML_DESC	="Plugin JCE permettant de créer une table des matières simple dans les contenus en utilisant les titres existants"
PLG_JCE_EDITOR_TOC_CLASSNAME="Classe du conteneur"
PLG_JCE_EDITOR_TOC_CLASSNAME_DESC="Nom(s) de classe alternatif(s) pour le conteneur de la table des matières. Séparez les noms de classe multiples par un espace."
PLG_JCE_EDITOR_TOC_HEADING_CLASSNAME="Classe de l'intitulé"
PLG_JCE_EDITOR_TOC_HEADING_CLASSNAME_DESC="Nom(s) de classe alternatif(s) pour l'intitulé de la table des matières. Séparez les noms de classe multiples par un espace."
PLG_JCE_EDITOR_TOC_DEPTH="Depth"
PLG_JCE_EDITOR_TOC_DEPTH_DESC="Définir la profondeur maximale jusqu'à laquelle les balises d'en-tête du contenu seront analysées pour créer la table des matières, par exemple : H1 - H3"

[toc]
WF_TOC_TITLE="Table des matières"
WF_TOC_HEADING_TITLE="Table des matières"
language/fr-FR/fr-FR.plg_editors-xtd_readmore.sys.ini000060400000001103152453623440016461 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_EDITORS-XTD_READMORE="Bouton - Lire la suite..."

[New Strings]

PLG_READMORE_XML_DESCRIPTION="Affiche un bouton sous l'éditeur permettant d'insérer un lien 'Lire la suite...' dans un article."
language/fr-FR/fr-FR.plg_fields_color.sys.ini000060400000001106152453623440015004 0ustar00; @date        2017-01-19
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_COLOR="Champs - Couleur"
PLG_FIELDS_COLOR_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'color' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_installer_urlinstaller.ini000060400000001405152453623440016322 0ustar00; @date        2016-05-10
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_INSTALLER_URLINSTALLER_BUTTON="Vérifier et installer"
PLG_INSTALLER_URLINSTALLER_INSTALLER_URLFOLDERINSTALLER="Installation - Installer à partir d'une URL"
PLG_INSTALLER_URLINSTALLER_NO_URL="Soumettre une URL"
PLG_INSTALLER_URLINSTALLER_PLUGIN_XML_DESCRIPTION="Ce plug-in permet d'installer des paquets à partir d'une URL"
PLG_INSTALLER_URLINSTALLER_TEXT="Installer à partir d'une URL"
language/fr-FR/fr-FR.plg_system_fields.ini000060400000000775152453623440014410 0ustar00; @date        2016-12-15
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SYSTEM_FIELDS="Système - Champs"
PLG_SYSTEM_FIELDS_XML_DESCRIPTION="Ce plug-in permet d'afficher les champs personnalisés."
language/fr-FR/fr-FR.plg_content_loadmodule.ini000060400000002577152453623440015417 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_CONTENT_LOADMODULE="Contenu - Chargement de module"
PLG_LOADMODULE_FIELD_STYLE_DESC="Mode d'intégration des modules"
PLG_LOADMODULE_FIELD_STYLE_LABEL="Styles"
PLG_LOADMODULE_FIELD_VALUE_DIVS="Intégré par une balise div"
PLG_LOADMODULE_FIELD_VALUE_HORIZONTAL="Intégré par un tableau - Horizontal"
PLG_LOADMODULE_FIELD_VALUE_MULTIPLEDIVS="Intégré par des balises div multiples"
PLG_LOADMODULE_FIELD_VALUE_RAW="Pas d'intégration - sortie brute"
PLG_LOADMODULE_FIELD_VALUE_TABLE="Intégré par un tableau - Colonne"
PLG_LOADMODULE_XML_DESCRIPTION="Système d'affichage de modules dans des contenus en interprétant la syntaxe suivante :<br> par ID: {loadmoduleid 1}<br>par position : {loadposition X}<br />Remplacez la valeur X par la position souhaitée. Exemple pour la position user1 : {loadposition user1}.<br />Il est aussi possible d'utiliser le nom du module : {loadmodule mod_login}.<br />Les paramètres permettent de spécifier le style et un titre spécifique : {loadmodule mod_login,titre du module,style}."
language/fr-FR/fr-FR.plg_system_actionlogs.sys.ini000060400000001110152453623440016101 0ustar00; @date        2018-09-16
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SYSTEM_ACTIONLOGS="Système - Journal des actions utilisateur"
PLG_SYSTEM_ACTIONLOGS_XML_DESCRIPTION="Enregistre les actions des utilisateurs sur le site afin de pouvoir les vérifier si nécessaire."
language/fr-FR/fr-FR.plg_privacy_content.ini000060400000001130152453623440014727 0ustar00; @date        2018-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_PRIVACY_CONTENT="Confidentialité - Contenu"
PLG_PRIVACY_CONTENT_XML_DESCRIPTION="Responsable du traitement des demandes d'informations liées à la confidentialité pour les données de base des contenus de Joomla."
language/fr-FR/fr-FR.com_postinstall.sys.ini000060400000001403152453623440014710 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_POSTINSTALL="Messages de post-installation"
COM_POSTINSTALL_XML_DESCRIPTION="Affiche les messages de post-installation et mise-à-jour pour Joomla! et ses extensions."

COM_POSTINSTALL_MESSAGES_VIEW_DEFAULT_DESC="Affiche les messages de post-installation et de post-mise à jour pour Joomla! et ses extensions."
COM_POSTINSTALL_MESSAGES_VIEW_DEFAULT_TITLE="Messages de post-installation"
language/fr-FR/fr-FR.plg_search_newsfeeds.sys.ini000060400000001032152453623440015646 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_SEARCH_NEWSFEEDS="Recherche - Fils d'actualité"
PLG_SEARCH_NEWSFEEDS_XML_DESCRIPTION="Intégration des fils d'actualité RSS dans la recherche sur le site"language/fr-FR/fr-FR.com_media.ini000060400000022464152453623440012610 0ustar00; @date        2014-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_MEDIA="Médias"
COM_MEDIA_ALIGN="Alignement"
COM_MEDIA_ALIGN_DESC="L'alignement sera défini par les classes 'pull-left', 'pull-center' ou 'pull-right' appliquées aux éléments '<figure>' ou '<img>'."
COM_MEDIA_BROWSE_FILES="Rechercher les fichiers"
COM_MEDIA_CAPTION="Légende"
COM_MEDIA_CAPTION_CLASS_LABEL="Classe de la légende"
COM_MEDIA_CAPTION_CLASS_DESC="La classe saisie sera appliquée à l'élément '<figcaption>'. Par exemple :'text-left', 'text-right', 'text-center'"
COM_MEDIA_CLEAR_LIST="Vider la liste"
COM_MEDIA_CONFIGURATION="Médias : Paramètres"
COM_MEDIA_CREATE_COMPLETE="Création terminée&#160;: %s"
COM_MEDIA_CREATE_FOLDER="Créer un dossier"
COM_MEDIA_CREATE_NEW_FOLDER="Créer un nouveau dossier"
COM_MEDIA_CURRENT_PROGRESS="Progression"
COM_MEDIA_DELETE_COMPLETE="Suppression terminée: %s"
COM_MEDIA_DESCFTPTITLE="Détails de connexion FTP"
COM_MEDIA_DESCFTP="Pour transférer, changer ou supprimer des fichiers, Joomla aura besoin des informations d'accès à votre compte FTP. Veuillez les saisir dans le formulaire ci-dessous."
COM_MEDIA_DETAIL_VIEW="Détails"
COM_MEDIA_DIRECTORY="Répertoire"
COM_MEDIA_DIRECTORY_UP="Répertoire parent"
COM_MEDIA_ERROR_BAD_REQUEST="Requête incorrecte"
COM_MEDIA_ERROR_BEFORE_DELETE_0="Aucune erreur n'est survenue avant la suppression du média"
COM_MEDIA_ERROR_BEFORE_DELETE_1="Une erreur est survenue avant la suppression du média&#160;: %2$s"
COM_MEDIA_ERROR_BEFORE_DELETE_MORE="Des erreurs sont survenues avant la suppression du média&#160;: %2$s"
COM_MEDIA_ERROR_BEFORE_SAVE_0="Aucune erreur n'est survenue avant l'enregistrement du média"
COM_MEDIA_ERROR_BEFORE_SAVE_1="Une erreur est survenue avant l'enregistrement du média&#160;: %2$s"
COM_MEDIA_ERROR_BEFORE_SAVE_MORE="Des erreurs sont survenues avant l'enregistrement du média&#160;: %2$s"
COM_MEDIA_ERROR_CREATE_NOT_PERMITTED="Création non autorisée"
COM_MEDIA_ERROR_FILE_EXISTS="Le fichier existe déjà"
COM_MEDIA_ERROR_UNABLE_TO_CREATE_FOLDER_WARNDIRNAME="Impossible de créer le dossier. Le nom du dossier doit contenir uniquement des caractères alphanumériques sans espace"
COM_MEDIA_ERROR_UNABLE_TO_BROWSE_FOLDER_WARNDIRNAME="Impossible de naviguer vers :&#160;%s. Le nom du dossier doit contenir uniquement des caractères alphanumériques sans espaces."
COM_MEDIA_ERROR_UNABLE_TO_DELETE_FILE_WARNFILENAME="Impossible de supprimer %s. Le nom du fichier doit contenir uniquement des caractères alphanumériques sans espace"
COM_MEDIA_ERROR_UNABLE_TO_DELETE_FOLDER_NOT_EMPTY="Impossible de supprimer %s. Le dossier n'est pas vide !"
COM_MEDIA_ERROR_UNABLE_TO_DELETE_FOLDER_WARNDIRNAME="Impossible de supprimer&#160;: %s. "
COM_MEDIA_ERROR_UNABLE_TO_DELETE=" Impossible de supprimer&#160;: "
COM_MEDIA_ERROR_UNABLE_TO_UPLOAD_FILE="Impossible de transférer le fichier sur le serveur."
COM_MEDIA_ERROR_UPLOAD_INPUT="Veuillez spécifier un fichier à transférer sur le serveur."
COM_MEDIA_ERROR_WARNFILENAME="Le nom du fichier doit contenir uniquement des caractères alphanumériques sans espace."
COM_MEDIA_ERROR_WARNFILENOTSAFE="Vous avez tenté de transférer un ou plusieurs fichiers qui ne sont pas sûrs."
COM_MEDIA_ERROR_WARNFILETOOLARGE="Ce fichier est trop volumineux pour être envoyé sur le serveur."
COM_MEDIA_ERROR_WARNFILETYPE="Ce type de fichier n'est pas pris en charge."
COM_MEDIA_ERROR_WARNIEXSS="Éventuelle attaque IE XSS trouvée."
COM_MEDIA_ERROR_WARNINVALID_IMG="Image non valide."
COM_MEDIA_ERROR_WARNINVALID_FOLDER="Le dossier fourni est invalide."
COM_MEDIA_ERROR_WARNINVALID_MIME="Type MIME détecté invalide ou non autorisé."
COM_MEDIA_ERROR_WARNNOTADMIN="Le fichier envoyé n'est pas un fichier image et/ou vous ne faites pas partie d'un groupe d'utilisateurs autorisé à effectuer ce type d'envoi."
COM_MEDIA_ERROR_WARNNOTEMPTY="N'est pas vide !"
COM_MEDIA_ERROR_WARNUPLOADTOOLARGE="La taille totale du téléchargement excède la limite."
COM_MEDIA_FIELD_CHECK_MIME_DESC="Utilise MIME Magic ou Fileinfo pour essayer de vérifier les fichiers.<br />Désactivez-le si vous obtenez des erreurs de type MIME invalide."
COM_MEDIA_FIELD_CHECK_MIME_LABEL="Vérifier les types MIME"
COM_MEDIA_FIELD_IGNORED_EXTENSIONS_DESC="Extensions de fichier ignorées pour la vérification du type MIME et les envois restreints."
COM_MEDIA_FIELD_IGNORED_EXTENSIONS_LABEL="Extensions ignorées"
COM_MEDIA_FIELD_ILLEGAL_MIME_TYPES_DESC="Liste des types MIME interdits d'envoi sur le serveur (séparés par des virgules)."
COM_MEDIA_FIELD_ILLEGAL_MIME_TYPES_LABEL="Types MIME interdits"
COM_MEDIA_FIELD_LEGAL_EXTENSIONS_DESC="Extensions de fichiers autorisées d'envoi sur le serveur (séparées par des virgules)."
COM_MEDIA_FIELD_LEGAL_EXTENSIONS_LABEL="Extensions autorisées"
COM_MEDIA_FIELD_LEGAL_IMAGE_EXTENSIONS_DESC="Types de fichier image autorisés d'envoi sur le serveur (séparés par des virgules). Utilisé pour valider les en-têtes d'images."
COM_MEDIA_FIELD_LEGAL_IMAGE_EXTENSIONS_LABEL="Images autorisées"
COM_MEDIA_FIELD_LEGAL_MIME_TYPES_DESC="Liste des types MIME autorisés d'envoi (séparés par des virgules)."
COM_MEDIA_FIELD_LEGAL_MIME_TYPES_LABEL="Types MIME autorisés"
COM_MEDIA_FIELD_MAXIMUM_SIZE_DESC="Taille maximale de fichier autorisé d'envoi (en mégaoctets).<br />Note : votre serveur possède sa propre limite."
COM_MEDIA_FIELD_MAXIMUM_SIZE_LABEL="Taille maximale"
COM_MEDIA_FIELD_PATH_FILE_FOLDER_DESC="Saisissez le chemin du dossier des fichiers depuis la racine du site. Attention, changer le dossier 'images' par défaut peut créer des problèmes de fonctionnement avec certaines extensions. Note: ne pas commencer le chemin avec un slash!"
COM_MEDIA_FIELD_PATH_FILE_FOLDER_LABEL="Chemin du dossier des fichiers "
COM_MEDIA_FIELD_PATH_IMAGE_FOLDER_DESC="Saisissez le chemin du dossier des médias depuis la racine du site. Ce chemin doit être le même que celui des fichiers ou être celui d'un de ses sous-dossiers. Note: ne pas commencer le chemin avec un slash!"
COM_MEDIA_FIELD_PATH_IMAGE_FOLDER_LABEL="Chemin du dossier des images "
COM_MEDIA_FIELD_RESTRICT_UPLOADS_DESC="Restreindre l'envoi de fichier images aux utilisateurs des groupes de niveaux inférieurs à celui du groupe 'Gestionnaire' (disponible par défaut dans Joomla) uniquement si Fileinfo et/ou MIME Magic ne sont pas installés."
COM_MEDIA_FIELD_RESTRICT_UPLOADS_LABEL="Restreindre les envois"
COM_MEDIA_FIELDSET_OPTIONS_LABEL="Média"
COM_MEDIA_FILES="Fichiers"
COM_MEDIA_FILESIZE="Taille du fichier"
COM_MEDIA_FOLDER="Dossiers Media"
COM_MEDIA_FOLDERS="Dossiers"
COM_MEDIA_FOLDERS_PATH_LABEL="<strong>Attention ! Chemin du dossier</strong><br />Changer le 'chemin du dossier des fichiers' vers un autre dossier que celui par défaut 'images' peut rompre des liens existants.<br />Le chemin du dossier des images doit être le même que celui des fichiers ou être celui d'un de ses sous-dossiers."
COM_MEDIA_IMAGE_DESCRIPTION="Description de l'image"
COM_MEDIA_IMAGE_DIMENSIONS="%1$s x %2$s"
COM_MEDIA_IMAGE_TITLE="%1$s - %2$s"
COM_MEDIA_IMAGE_URL="URL"
COM_MEDIA_INSERT_IMAGE="Insérer une image"
COM_MEDIA_INSERT="Insérer"
COM_MEDIA_INVALID_REQUEST="Requête non valide"
COM_MEDIA_MEDIA="Média"
COM_MEDIA_NAME="Nom de l'image"
COM_MEDIA_NO_IMAGES_FOUND="Aucune image n'a été trouvée"
COM_MEDIA_NOT_SET="Non défini"
COM_MEDIA_OVERALL_PROGRESS="Progression"
COM_MEDIA_PIXEL_DIMENSIONS="Dimensions en pixels (L x H)"
COM_MEDIA_PREVIEW="Aperçu"
COM_MEDIA_START_UPLOAD="Démarrer l'envoi"
COM_MEDIA_THUMBNAIL_VIEW="Miniatures"
COM_MEDIA_TITLE="Titre"
COM_MEDIA_UPLOAD_COMPLETE="Envoi terminé&#160;: %s"
COM_MEDIA_UPLOAD_FILE="Transférer le fichier"
; The following two strings are deprecated with 3.7.0 and will be removed in 4.0
COM_MEDIA_UPLOAD_FILES="Transfert de fichiers (taille maximale: %s Mo)"
COM_MEDIA_UPLOAD_FILES_NOLIMIT="Transfert de fichier (pas de taille maximale)"
COM_MEDIA_UPLOAD_SUCCESSFUL="Transfert effectué."
COM_MEDIA_UPLOAD="Envoyer"
COM_MEDIA_UP="Répertoire parent"
COM_MEDIA_XML_DESCRIPTION="Composant de gestion des médias du site"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_MEDIA="Les modification ne s'appliquent qu'à ce composant.<br /><em><strong>Hérité</strong></em> - les droits globaux ou ceux des groupes parents seront utilisés.<br /><em><strong>Refusé</strong></em> - prévaut toujours, quels que soient les droits globaux ou ceux des groupes parents, et s'applique aux éléments enfants.<br /><em><strong>Autorisé</strong></em> - le groupe concerné pourra effectuer cette action dans ce composant sauf si les droits globaux sont différents."

[New Strings]

JLIB_RULES_SETTING_NOTES="Les modification ne s'appliquent qu'à ce composant.<br /><em><strong>Hérité</strong></em> - les droits globaux ou ceux des groupes parents seront utilisés.<br /><em><strong>Refusé</strong></em> - prévaut toujours, quels que soient les droits globaux ou ceux des groupes parents, et s'applique aux éléments enfants.<br /><em><strong>Autorisé</strong></em> - le groupe concerné pourra effectuer cette action dans ce composant sauf si les droits globaux sont différents."
language/fr-FR/fr-FR.com_config.ini000060400000073425152453623440013001 0ustar00; @date        2014-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2022 Open Source Matters, Inc. (https://www.joomla.org)
; @copyright   (C) 2005 - 2022 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_CONFIG="Configuration"
COM_CONFIG_ACTION_ADMIN_DESC="Droit à toutes actions dans n'importe quelle extension.<br />Indépendant des droits spécifiques appliqués."
COM_CONFIG_ACTION_CREATE_DESC="Droit de création d'éléments de n'importe quelle extension."
COM_CONFIG_ACTION_DELETE_DESC="Droit de suppression d'éléments de n'importe quelle extension."
COM_CONFIG_ACTION_EDIT_DESC="Droit de modification d'éléments de n'importe quelle extension."
COM_CONFIG_ACTION_EDITOWN_DESC="Droit de modification d'éléments de n'importe quelle extension par leur auteur."
COM_CONFIG_ACTION_EDITVALUE_DESC="Droit de modification de toute valeur des champs personnalisés dans toute extension."
COM_CONFIG_ACTION_EDITSTATE_DESC="Droit de modification du statut d'éléments de n'importe quelle extension"
COM_CONFIG_ACTION_LOGIN_ADMIN_DESC="Droit d'accès à l'espace d'administration du site."
COM_CONFIG_ACTION_LOGIN_OFFLINE_DESC="Autoriser les utilisateurs membres de ce groupe à accéder au site lorsque celui-ci est hors-ligne."
COM_CONFIG_ACTION_LOGIN_SITE_DESC="Droit d'accès à l'espace frontal du site."
COM_CONFIG_ACTION_MANAGE_DESC="Droit d'accès à toutes les fonctionnalités de l'administration, exceptée la configuration globale."
COM_CONFIG_ACTION_OPTIONS_DESC="Permet aux utilisateurs du groupe de modifier les paramètres sauf les autorisations de toute extension."
COM_CONFIG_CACHE_SETTINGS="Paramètres du cache"
COM_CONFIG_CACHE_WARNING="Impossible de purger automatiquement le cache. Il faudra le faire manuellement."
COM_CONFIG_COMPONENT_FIELDSET_LABEL="Composant"
COM_CONFIG_COMPONENT_NO_CONFIG_FIELDS_MESSAGE="Ce composant n'a pas de paramètres de configuration."
COM_CONFIG_COOKIE_SETTINGS="Paramètres des cookies"
COM_CONFIG_DATABASE_SETTINGS="Paramètres de la base de données"
COM_CONFIG_DEBUG_SETTINGS="Paramètres de débogage"
COM_CONFIG_ERROR_CACHE_PATH_NOTWRITABLE="Le dossier de cache n'est pas ouvert en écriture&nbsp;: %s"
COM_CONFIG_ERROR_CACHE_CONNECTION_FAILED="Impossible de se connecter au gestionnaire de cache pour purger le cache."
COM_CONFIG_ERROR_CACHE_DRIVER_UNSUPPORTED="Impossible de purger le cache, le gestionnaire de cache configuré n'est pas supporté par cet environnement."
COM_CONFIG_ERROR_COMPONENT_ASSET_NOT_FOUND="La ligne correspondant au composant n'a pas été trouvée dans la table 'assets' de la base. Les droits n'ont pas été enregistrées."
COM_CONFIG_ERROR_CONFIG_EXTENSION_NOT_FOUND="La configuration globale de l'extension n'a pu être trouvée. Les paramètres des filtres de texte n'ont pas été enregistrés."
COM_CONFIG_ERROR_CONFIGURATION_PHP_NOTUNWRITABLE="Impossible d'appliquer le droit de lecture seule au fichier 'configuration.php'"
COM_CONFIG_ERROR_CONFIGURATION_PHP_NOTWRITABLE="Impossible d'appliquer le droit d'écriture au fichier 'configuration.php'"
COM_CONFIG_ERROR_CUSTOM_CACHE_PATH_NOTWRITABLE_USING_DEFAULT="Le répertoire %1$s n'est pas accessible en écriture et ne peut être utilisé pour le cache. %2$s est utilisé par défaut."
; The following 2 strings are deprecated and will be removed with 4.0.
COM_CONFIG_ERROR_HELPREFRESH_ERROR_STORE="La nouvelle liste des sites d'aide ne peut être enregistrée"
COM_CONFIG_ERROR_HELPREFRESH_FETCH="La liste actuelle des sites d'aide n'a pas pu être extraite du serveur distant"
COM_CONFIG_ERROR_ROOT_ASSET_NOT_FOUND="La ligne correspondant à la configuration globale n'a pas été trouvée dans la table 'assets' de la base. Les droits n'ont pas été enregistrées."
COM_CONFIG_ERROR_SSL_NOT_AVAILABLE="HTTPS n'a pas été activé car il n'est pas disponible sur ce serveur. Le test de la connexion HTTPS a échoué avec l'erreur suivante : <em>%s</em>"
COM_CONFIG_ERROR_SSL_NOT_AVAILABLE_HTTP_CODE="La version HTTPS du site a retourné un code de statut HTTP invalide."
COM_CONFIG_ERROR_REMOVING_SUPER_ADMIN="Vous ne pouvez pas supprimer vos propres droits de Super Utilisateur."
COM_CONFIG_ERROR_UNKNOWN_BEFORE_SAVING="Un plugin a signalé une erreur inconnue avant de sauvegarder la configuration."
COM_CONFIG_ERROR_WRITE_FAILED="Impossible d'enregistrer le fichier de configuration"
COM_CONFIG_FIELD_CACHE_HANDLER_DESC="Choisissez le gestionnaire de cache. Le mécanisme de mise en cache natif est basé sur les fichiers. Veuillez vous assurer que les dossiers de cache soient accessibles en écriture."
COM_CONFIG_FIELD_CACHE_HANDLER_LABEL="Gestion du cache"
COM_CONFIG_FIELD_CACHE_PLATFORMPREFIX_LABEL="Mise en cache spécifique selon la plate-forme"
COM_CONFIG_FIELD_CACHE_PLATFORMPREFIX_DESC="Activer/désactiver la mise en cache spécifique selon la plate-forme (smart phone, ordinateur, tablette, etc.). Activer lorsque la sortie HTML sur mobile diffère des autres appareils. (Désactivé par défaut) "
COM_CONFIG_FIELD_CACHE_LABEL="Cache système"
COM_CONFIG_FIELD_CACHE_DESC="Activer le système de cache et déterminer son niveau.<br />Niveau 'Conservateur' : le plus bas système de cache<br />Niveau 'Progressif' (défaut): le plus haut niveau de cache incluant celui des modules (inapproprié pour de très grands sites)."
COM_CONFIG_FIELD_CACHE_PATH_DESC="Spécifier un répertoire ouvert en écriture pour stocker les fichiers de cache si vous décidez de ne pas utiliser le dossier par défaut ."
COM_CONFIG_FIELD_CACHE_PATH_LABEL="Chemin du répertoire de cache"
COM_CONFIG_FIELD_CACHE_TIME_DESC="La durée maximale, en minutes, de validité d'un fichier cache avant qu'il soit rafraîchi."
COM_CONFIG_FIELD_CACHE_TIME_LABEL="Durée du cache"
COM_CONFIG_FIELD_COOKIE_DOMAIN_DESC="Domaine utilisé pour les cookies de session. Insérez un point (.) devant le nom de domaine si le cookie doit s'appliquer à tous les sous-domaines."
COM_CONFIG_FIELD_COOKIE_DOMAIN_LABEL="Domaine du cookie"
COM_CONFIG_FIELD_COOKIE_PATH_DESC="Chemin valide de l'espace utilisé pour stocker les cookies."
COM_CONFIG_FIELD_COOKIE_PATH_LABEL="Chemin des cookies"
COM_CONFIG_FIELD_DATABASE_HOST_DESC="Nom du serveur hôte de la base de données, saisi lors de l'installation.<br />Ne modifiez ce champ qu'en absolue nécessité, comme par exemple lors d'un transfert du site d'un serveur/hébergeur à un autre."
COM_CONFIG_FIELD_DATABASE_HOST_LABEL="Serveur hôte"
COM_CONFIG_FIELD_DATABASE_NAME_DESC="Nom de la base de données, saisi lors de l'installation.<br />Ne modifiez ce champ qu'en absolue nécessité, comme par exemple lors d'un transfert du site d'un serveur/hébergeur à un autre."
COM_CONFIG_FIELD_DATABASE_NAME_LABEL="Nom de la base"
COM_CONFIG_FIELD_DATABASE_PASSWORD_DESC="Le mot de passe pour accéder à votre base de données. Ne modifiez ce champ que si c'est absolument nécessaire (par exemple après le transfert de la base de données vers un nouvel hébergeur)."
COM_CONFIG_FIELD_DATABASE_PASSWORD_LABEL="Mot de passe de la base de données"
COM_CONFIG_FIELD_DATABASE_PREFIX_DESC="Préfixe des tables de la base de données, saisi lors de l'installation.<br />Ne modifiez ce champ qu'en absolue nécessité, comme par exemple lors d'un transfert du site d'un serveur/hébergeur à un autre."
COM_CONFIG_FIELD_DATABASE_PREFIX_LABEL="Préfixe des tables"
COM_CONFIG_FIELD_DATABASE_TYPE_DESC="Type de la base de données utilisée, saisi lors de l'installation.<br />Ne modifiez ce champ qu'en absolue nécessité, comme par exemple lors d'un transfert du site d'un serveur/hébergeur à un autre."
COM_CONFIG_FIELD_DATABASE_TYPE_LABEL="Type"
COM_CONFIG_FIELD_DATABASE_USERNAME_DESC="Nom d'utilisateur d'accès à la base de données, saisi lors de l'installation.<br />Ne modifiez ce champ qu'en absolue nécessité, comme par exemple lors d'un transfert du site d'un serveur/hébergeur à un autre."
COM_CONFIG_FIELD_DATABASE_USERNAME_LABEL="Utilisateur"
COM_CONFIG_FIELD_DEBUG_CONST="Chaine de traduction"
COM_CONFIG_FIELD_DEBUG_CONST_LANG_DESC="Afficher la chaine de traduction ou la valeur de langue lors du débogage des chaînes de langue."
COM_CONFIG_FIELD_DEBUG_CONST_LANG_LABEL="Affichage de langue"
COM_CONFIG_FIELD_DEBUG_LANG_DESC="Afficher les indicateurs de débogage <strong>**...**</strong> ou <strong>??...??</strong pour repérer les chaînes non-traduites des fichiers de langue.<br />Le débogage de langue peut être utilisé indépendamment du débogage système, mais vous ne disposerez pas alors de toutes les références utiles aux corrections des erreurs."
COM_CONFIG_FIELD_DEBUG_LANG_LABEL="Débogage de langue"
COM_CONFIG_FIELD_DEBUG_SYSTEM_DESC="Activer l'affichage des informations système de la page, des requêtes SQL et des fichiers langue.<br />Attention, les informations sont affichées en bas de chaque page, dans l'interface d'administration comme dans celle du site ! Il est recommandé de désactiver ce mode sur un site en production."
COM_CONFIG_FIELD_DEBUG_SYSTEM_LABEL="Débogage système"
COM_CONFIG_FIELD_DEBUG_VALUE="Valeur"
COM_CONFIG_FIELD_DEFAULT_ACCESS_LEVEL_DESC="Sélectionnez le niveau d'accès par défaut pour les nouveaux éléments créés sur le site (articles, lien de menu, lien web, etc.)."
COM_CONFIG_FIELD_DEFAULT_ACCESS_LEVEL_LABEL="Accès par défaut"
COM_CONFIG_FIELD_DEFAULT_EDITOR_DESC="Sélectionnez l'éditeur de contenu par défaut pour le site.<br />Les utilisateurs inscrits pourront modifier leurs préférences dans la gestion de leur profil, si vous activez cette option."
COM_CONFIG_FIELD_DEFAULT_EDITOR_LABEL="Éditeur par défaut"
COM_CONFIG_FIELD_DEFAULT_CAPTCHA_DESC="Sélectionnez le Captcha à utiliser par défaut sur le site."
COM_CONFIG_FIELD_DEFAULT_CAPTCHA_LABEL="Captcha par défaut"
COM_CONFIG_FIELD_DEFAULT_FEED_LIMIT_DESC="Choisissez le nombre d'articles à afficher dans les listes provenant des fils d'actualité (flux RSS/ATOM) de votre site."
COM_CONFIG_FIELD_DEFAULT_FEED_LIMIT_LABEL="Fils RSS/ATOM"
COM_CONFIG_FIELD_DEFAULT_LIST_LIMIT_DESC="Fixer (pour tous les utilisateurs) le nombre d'éléments listés par page dans les affichages en liste de l'administration."
COM_CONFIG_FIELD_DEFAULT_LIST_LIMIT_LABEL="Longueur des listes"
COM_CONFIG_FIELD_ERROR_REPORTING_DESC="Choisissez le niveau du rapport d'erreurs.<br />Consultez la page d'aide pour plus de détails."
COM_CONFIG_FIELD_ERROR_REPORTING_LABEL="Rapport d'erreurs"
COM_CONFIG_FIELD_FEED_EMAIL_DESC="Les fils d'actualité (flux RSS/ATOM) incluent l'adresse e-mail de l'auteur.<br />Sélectionnez 'E-mail de l'auteur' pour utiliser l'adresse de chaque auteur dans les fils d'actualité provenant de ce site.<br />Sélectionner 'E-mail du site' pour utiliser l'adresse e-mail du site pour tous les articles des fils d'actualité provenant de ce site."
COM_CONFIG_FIELD_FEED_EMAIL_LABEL="E-mail des fils"
COM_CONFIG_FIELD_FILTERS_DEFAULT_BLACK_LIST="Liste noire par défaut"
COM_CONFIG_FIELD_FILTERS_CUSTOM_BLACK_LIST="Liste noire personnalisée"
COM_CONFIG_FIELD_FILTERS_NO_HTML="Pas de HTML"
COM_CONFIG_FIELD_FILTERS_NO_FILTER="Aucun filtre"
COM_CONFIG_FIELD_FILTERS_WHITE_LIST="Liste blanche"
COM_CONFIG_FRONTEDITING_DESC="Sélectionner si vous désirez des icônes d'édition en ligne pour les modules et les liens de menus (fonctionnalité peut dépendre du template)"
COM_CONFIG_FRONTEDITING_LABEL="Icônes d'édition en ligne"
COM_CONFIG_FRONTEDITING_MENUSANDMODULES="Modules & liens de menus"
COM_CONFIG_FRONTEDITING_MENUSANDMODULES_ADMIN_TOO="Modules & liens de menus (aussi administration)"
COM_CONFIG_FRONTEDITING_MODULES="Modules"
COM_CONFIG_FIELD_FORCE_SSL_DESC="Forcer l'utilisation du protocole HTTPS (connexions HTTP encryptées avec le préfixe de protocole https://) pour l'accès aux zones spécifiées et forcer aussi les cookies de sécurité.<br />Notez que pour utiliser cette option, le protocole HTTPS doit être activé sur votre serveur ou votre répartiteur de charge. Activez \"Derrière un répartiteur de charge\" si votre SSL se termine sur votre répartiteur de charge mais que votre site est servi sur http sur son serveur Web."
COM_CONFIG_FIELD_FORCE_SSL_LABEL="Forcer HTTPS"
COM_CONFIG_FIELD_FTP_ENABLE_DESC="Activer le protocole de transfert de fichiers FTP indispensable sur certains serveurs qui font la différence entre l'utilisateur HTTP et FTP, empêchant l'un d'écrire dans les dossiers de l'autre, de modifier ou d'écraser les fichiers. Dans ce type de configuration serveur, si le site a été développé sur un autre espace (serveur local, autre hébergeur), vous devez activer la couche FTP pour mettre à jour les extensions ou en installer de nouvelles."
COM_CONFIG_FIELD_FTP_ENABLE_LABEL="Activer le FTP"
COM_CONFIG_FIELD_FTP_HOST_DESC="Entrez le nom du serveur FTP"
COM_CONFIG_FIELD_FTP_HOST_LABEL="Serveur FTP"
COM_CONFIG_FIELD_FTP_PASSWORD_DESC="Entrez le mot de passe FTP"
COM_CONFIG_FIELD_FTP_PASSWORD_LABEL="Mot de passe FTP"
COM_CONFIG_FIELD_FTP_PORT_DESC="Saisissez le port qu'utilise le compte FTP. Le port par défaut est le port 21."
COM_CONFIG_FIELD_FTP_PORT_LABEL="Port FTP"
COM_CONFIG_FIELD_FTP_ROOT_DESC="Chemin de la racine du site. Le dossier racine est le répertoire le plus élevé auquel vous avez accès avec ce compte."
COM_CONFIG_FIELD_FTP_ROOT_LABEL="Racine FTP"
COM_CONFIG_FIELD_FTP_USERNAME_DESC="Identifiant utilisé pour la connexion FTP."
COM_CONFIG_FIELD_FTP_USERNAME_LABEL="Identifiant FTP"
COM_CONFIG_FIELD_GZIP_COMPRESSION_DESC="Activer la compression GZIP des pages (tampon d'affichage), si prise en charge par le serveur."
COM_CONFIG_FIELD_GZIP_COMPRESSION_LABEL="Compression GZIP"
; The following two strings are deprecated and will be removed with 4.0.
COM_CONFIG_FIELD_HELP_SERVER_DESC="Sélectionnez le serveur approprié pour obtenir l'aide intégrée de Joomla! dans la langue souhaitée."
COM_CONFIG_FIELD_HELP_SERVER_LABEL="Serveur d'aide"
COM_CONFIG_FIELD_LOG_PATH_DESC="Chemin absolu du dossier 'logs' utilisé pour la journalisation de Joomla!"
COM_CONFIG_FIELD_LOG_PATH_LABEL="Dossier 'logs'"
COM_CONFIG_FIELD_MAIL_FROM_EMAIL_DESC="Saisissez l'adresse e-mail à utiliser comme expéditeur des e-mails du site."
COM_CONFIG_FIELD_MAIL_FROM_EMAIL_LABEL="E-mail du site"
COM_CONFIG_FIELD_MAIL_FROM_NAME_DESC="Saisissez le texte qui sera affiché dans le champ 'De:' des e-mails expédiés par le site. En général, le nom du site."
COM_CONFIG_FIELD_MAIL_FROM_NAME_LABEL="Nom de l'expéditeur"
COM_CONFIG_FIELD_MAIL_REPLY_TO_EMAIL_LABEL="E-mail pour l'en-tête 'Répondre à'"
COM_CONFIG_FIELD_MAIL_REPLY_TO_EMAIL_DESC="L'adresse e-mail qui sera utilisée pour recevoir les réponses des utilisateurs."
COM_CONFIG_FIELD_MAIL_REPLY_TO_NAME_LABEL="Texte pour l'en-tête 'À'"
COM_CONFIG_FIELD_MAIL_REPLY_TO_NAME_DESC="Texte affiché dans l'en-tête &quot;À:&quot; quand les utilisateurs répondent à l'e-mail reçu."
COM_CONFIG_FIELD_MAIL_MAILONLINE_DESC="Activer l'envoi de mail ou non. Attention : Il est conseillé de mettre le site hors-ligne si l'envoi de mail est désactivé !"
COM_CONFIG_FIELD_MAIL_MAILONLINE_LABEL="Envoi de mail"
COM_CONFIG_FIELD_MAIL_MASSMAILOFF_DESC="Activer ou désactiver l'envoi d'e-mails en nombre."
COM_CONFIG_FIELD_MAIL_MASSMAILOFF_LABEL="Désactiver l'envoi d'e-mails en nombre"
COM_CONFIG_FIELD_MAIL_MAILER_DESC="Choisissez la méthode à utiliser pour l'envoi d'e-mails depuis le site."
COM_CONFIG_FIELD_MAIL_MAILER_LABEL="Serveur de mail"
COM_CONFIG_FIELD_MAIL_SENDMAIL_PATH_DESC="Spécifiez le chemin absolu sur le serveur du répertoire de l'exécutable Sendmail."
COM_CONFIG_FIELD_MAIL_SENDMAIL_PATH_LABEL="Accès à Sendmail"
COM_CONFIG_FIELD_MAIL_SMTP_AUTH_DESC="Spécifiez si le serveur SMTP requiert une authentification."
COM_CONFIG_FIELD_MAIL_SMTP_AUTH_LABEL="Identification SMTP"
COM_CONFIG_FIELD_MAIL_SMTP_HOST_DESC="Saisissez le nom du serveur SMTP."
COM_CONFIG_FIELD_MAIL_SMTP_HOST_LABEL="Serveur SMTP"
COM_CONFIG_FIELD_MAIL_SMTP_PASSWORD_DESC="Saisissez le mot de passe d'accès au serveur SMTP"
COM_CONFIG_FIELD_MAIL_SMTP_PASSWORD_LABEL="Mot de passe SMTP"
COM_CONFIG_FIELD_MAIL_SMTP_PORT_DESC="Saisissez le numéro de port du serveur SMTP que Joomla utilisera pour envoyer des e-mails. Habituellement:<br />- 25 pour un serveur de mail non sécurisé<br />- 465 pour un serveur sécurisé avec SMTPS<br />- 25 ou 587 pour un serveur sécurisé en SMTP avec l'extension STARTTLS."
COM_CONFIG_FIELD_MAIL_SMTP_PORT_LABEL="Port SMTP"
COM_CONFIG_FIELD_MAIL_SMTP_SECURE_DESC="Sélectionnez le modèle de sécurité du serveur SMTP que Joomla utilisera pour envoyer des e-mails. <br />- Aucun pour aucun cryptage<br />- SSL/TLS pour SMTPS (habituellement sur le port 465)<br />- STARTTLS pour SMTP avec l'extension STARTTLS (habituellement sur le port 25 ou le port 587)"
COM_CONFIG_FIELD_MAIL_SMTP_SECURE_LABEL="Sécurité SMTP"
COM_CONFIG_FIELD_MAIL_SMTP_USERNAME_DESC="Saisissez l'identifiant d'accès au serveur SMTP."
COM_CONFIG_FIELD_MAIL_SMTP_USERNAME_LABEL="Utilisateur SMTP"
COM_CONFIG_FIELD_MEMCACHE_COMPRESSION_DESC="Compression de mémoire cache"
COM_CONFIG_FIELD_MEMCACHE_COMPRESSION_LABEL="Compression de mémoire cache"
COM_CONFIG_FIELD_MEMCACHE_HOST_DESC="Serveur de mémoire cache"
COM_CONFIG_FIELD_MEMCACHE_HOST_LABEL="Serveur de mémoire cache"
COM_CONFIG_FIELD_MEMCACHE_PERSISTENT_DESC="Cache de mémoire persistant"
COM_CONFIG_FIELD_MEMCACHE_PERSISTENT_LABEL="Cache de mémoire persistant"
COM_CONFIG_FIELD_MEMCACHE_PORT_DESC="Port du serveur de mémoire cache"
COM_CONFIG_FIELD_MEMCACHE_PORT_LABEL="Port du serveur de mémoire cache"
COM_CONFIG_FIELD_REDIS_AUTH_DESC="Authentification au Serveur Redis"
COM_CONFIG_FIELD_REDIS_AUTH_LABEL="Authentification au Serveur Redis"
COM_CONFIG_FIELD_REDIS_DB_DESC="Base de données Redis"
COM_CONFIG_FIELD_REDIS_DB_LABEL="Base de données Redis"
COM_CONFIG_FIELD_REDIS_HOST_DESC="Hôte du serveur Redis"
COM_CONFIG_FIELD_REDIS_HOST_LABEL="Hôte du serveur Redis"
COM_CONFIG_FIELD_REDIS_PERSISTENT_DESC="Redis persistant"
COM_CONFIG_FIELD_REDIS_PERSISTENT_LABEL="Redis persistant"
COM_CONFIG_FIELD_REDIS_PORT_DESC="Port du serveur Redis"
COM_CONFIG_FIELD_REDIS_PORT_LABEL="Port du serveur Redis"
COM_CONFIG_FIELD_LOADBALANCER_ENABLE_DESC="Si votre site se trouve derrière un répartiteur de charge ou un proxy inverse, activez ce paramètre afin que les adresses IP et autres configurations dans Joomla en tiennent automatiquement compte."
COM_CONFIG_FIELD_LOADBALANCER_ENABLE_LABEL="Derrière un répartiteur de charge"
COM_CONFIG_FIELD_METAAUTHOR_DESC="Ajouter la métadonnée 'author' permettant d'indexer l'auteur du site."
COM_CONFIG_FIELD_METAAUTHOR_LABEL="Auteur du site"
COM_CONFIG_FIELD_METADESC_DESC="La métadonnée 'description' permet d'indexer une description du site afin d'améliorer son référencement (~250 caractères).<br />Lorsque l'article est indexé par un moteur dans les résultats d'une recherche, le texte de cette métadonnée est affiché sous le titre."
COM_CONFIG_FIELD_METADESC_LABEL="Description du site"
COM_CONFIG_FIELD_METAKEYS_DESC="La métadonnée 'keywords' permet d'indexer une série de mots-clés ou d'expressions (séparés par une virgule) liés au thème de l'article."
COM_CONFIG_FIELD_METAKEYS_LABEL="Mots-clés du site"
COM_CONFIG_FIELD_METALANGUAGE_DESC="Place la langue sélectionnée dans les meta du site."
COM_CONFIG_FIELD_METALANGUAGE_LABEL="Langue du site"
COM_CONFIG_FIELD_METAVERSION_LABEL="Afficher la version de Joomla!"
COM_CONFIG_FIELD_METAVERSION_DESC="Afficher le numéro de version de Joomla! dans la métadonnée 'generator'."
COM_CONFIG_FIELD_OFFLINE_IMAGE_DESC="Image optionnelle affichée sur la page par défaut du site lorsqu'il est hors ligne.<br /><strong>Note :</strong>si vous utilisez les templates par défaut de Joomla, veillez à ce que l'image n'excède pas 400px de large."
COM_CONFIG_FIELD_OFFLINE_IMAGE_LABEL="Image hors ligne"
COM_CONFIG_FIELD_OFFLINE_MESSAGE_DESC="Un message spécifique sera affiché si le paramètre 'Utiliser message spécifique' est implémenté pour le champ 'Message hors-ligne'."
COM_CONFIG_FIELD_OFFLINE_MESSAGE_LABEL="Message spécifique"
COM_CONFIG_FIELD_PROXY_ENABLE_DESC="Permettre à Joomla d'utiliser un proxy. Ceci est nécessaire dans certains environnements de serveurs pour obtenir des URLs telles que celles utilisées par le composant de mise à jour Joomla!"
COM_CONFIG_FIELD_PROXY_ENABLE_LABEL="Activer un proxy sortant"
COM_CONFIG_FIELD_PROXY_HOST_DESC="Saisir le nom d'hôte du serveur proxy"
COM_CONFIG_FIELD_PROXY_HOST_LABEL="Hôte du proxy sortant"
COM_CONFIG_FIELD_PROXY_PASSWORD_DESC="Saisir le mot de passe du serveur proxy"
COM_CONFIG_FIELD_PROXY_PASSWORD_LABEL="Mot de passe du proxy sortant"
COM_CONFIG_FIELD_PROXY_PORT_DESC="Saisir le numéro du port d'accès au serveur proxy."
COM_CONFIG_FIELD_PROXY_PORT_LABEL="Port du proxy sortant"
COM_CONFIG_FIELD_PROXY_USERNAME_DESC="L'identifiant utilisé pour accéder au serveur proxy."
COM_CONFIG_FIELD_PROXY_USERNAME_LABEL="Identifiant du proxy sortant"
COM_CONFIG_FIELD_SECRET_DESC="Code alphanumérique unique, auto-généré durant l'installation de Joomla!, utilisé pour des fonctions de sécurité."
COM_CONFIG_FIELD_SECRET_LABEL="Mot secret"
COM_CONFIG_FIELD_SEF_REWRITE_DESC="Activer la réécriture en clair des URL sans l'utilisation de la chaine 'index.php/'. Pour les serveurs Apache et IIs 7.<br /><strong>Pour les serveurs Apache uniquement :</strong><br/>Avant toute activation, vous devez avoir renommé le fichier 'htaccess.txt' présent à la racine du site en '.htaccess'<br/><strong>Pour les serveurs IIS 7 uniquement :</strong><br/> Renommer le fichier 'web.config.txt' présent à la racine du site en 'web.config' et installer le module IIS URL Rewrite Module avant toute activation."
COM_CONFIG_FIELD_SEF_REWRITE_LABEL="Réécriture au 'vol' des URL"
COM_CONFIG_FIELD_SEF_SUFFIX_DESC="Ajouter à la fin de l'URL, le suffixe du type de document (html, pdf, xml, etc.)."
COM_CONFIG_FIELD_SEF_SUFFIX_LABEL="Ajouter un suffixe aux URL"
COM_CONFIG_FIELD_SEF_URL_DESC="Activer la réécriture des URL en clair en remplaçant l'URL contenant la requête de construction de la page par une URL construite d'après les alias de titre.<br />L'élément 'index.php/' est ajouté entre le nom de domaine et le reste de l'URL.<br />Exemple : www.mon-site.com/index.php/ma-page"
COM_CONFIG_FIELD_SEF_URL_LABEL="Réécriture d'URL en clair (SEF)"
COM_CONFIG_FIELD_SERVER_TIMEZONE_DESC="Choisissez une ville dans la liste pour configurer la date et l'heure à afficher."
COM_CONFIG_FIELD_SERVER_TIMEZONE_LABEL="Fuseau horaire du site"
COM_CONFIG_FIELD_SESSION_HANDLER_DESC="Méthode utilisée par Joomla! pour l'identification des utilisateurs connectés, sans cookies persistants.<br />En choisissant 'PHP', c'est la valeur <em>session.save_handler</em> de la configuration php qui sera utilisée."
COM_CONFIG_FIELD_SESSION_HANDLER_LABEL="Méthode"
COM_CONFIG_FIELD_SESSION_TIME_DESC="Durée (en minutes) avant la déconnexion automatique déclenchée par une inactivité de l'utilisateur sur le site.<br />Pour des raisons de sécurité, il peut s'avérer pertinent de limiter cette durée au maximum, en tenant compte qu'une durée trop courte peut entraîner une déconnexion lors d'une longue rédaction dans l'éditeur sans l'utilisation d'outils en fenêtre popup ou enregistrement."
COM_CONFIG_FIELD_SESSION_TIME_LABEL="Durée"
COM_CONFIG_FIELD_SHARED_SESSION_DESC="Quand activé, la session d'un utilisateur est partagée entre l'interface frontale et l'administration du site. Notez que le changement de cette valeur invalidera toutes les sessions existantes sur le site. Cette option n'est pas disponible lorsque le paramètre \"Forcer HTTPS\" n'est implémenté que pour l'administration."
COM_CONFIG_FIELD_SHARED_SESSION_LABEL="Sessions partagées"
COM_CONFIG_FIELD_SITE_DISPLAY_MESSAGE_DESC="Affiche ou non un message lorsque le site est hors-ligne. Le message spécifique utilise la valeur définie dans le champ 'Message spécifique'. Le message de la langue par défaut du site est défini dans le pack de langue."
COM_CONFIG_FIELD_SITE_DISPLAY_MESSAGE_LABEL="Message hors-ligne"
COM_CONFIG_FIELD_SITE_NAME_DESC="Saisissez un nom pour le site, affiché par exemple dans la barre de titre du navigateur ou sur la page du site lorsqu'il est mis hors-ligne."
COM_CONFIG_FIELD_SITE_NAME_LABEL="Nom du site"
COM_CONFIG_FIELD_SITE_OFFLINE_DESC="Choisissez si l'accès du site doit être verrouillé au public.<br />Si oui, un message sera affiché ou non selon les paramètres définis ci-dessous."
COM_CONFIG_FIELD_SITE_OFFLINE_LABEL="Site hors-ligne"
COM_CONFIG_FIELD_SITENAME_PAGETITLES_DESC="Ajouter le nom du site devant le titre des pages affiché dans la barre de titre du navigateur. Exemple : Mon Site - Nom de l'article."
COM_CONFIG_FIELD_SITENAME_PAGETITLES_LABEL="Nom du site dans les titres de pages"
COM_CONFIG_FIELD_TEMP_PATH_DESC="Veuillez sélectionner un dossier ouvert en écriture pour y entreposer les fichiers temporaires."
COM_CONFIG_FIELD_TEMP_PATH_LABEL="Dossier temporaire"
COM_CONFIG_FIELD_UNICODESLUGS_DESC="Lors de l'utilisation du paramètre 'Translittération' (par défaut), l'alias est généré en minuscules avec des tirets remplaçant les espaces.<br />Le paramètre 'Unicode' conserve les caractères originaux (accentués, cyrilliques, grec, idéogrammes, etc.)"
COM_CONFIG_FIELD_UNICODESLUGS_LABEL="Alias Unicode"
COM_CONFIG_FIELD_VALUE_ADMINISTRATOR_ONLY="Administration uniquement"
COM_CONFIG_FIELD_VALUE_AFTER="Après"
COM_CONFIG_FIELD_VALUE_AUTHOR_EMAIL="E-mail de l'auteur"
COM_CONFIG_FIELD_VALUE_BEFORE="Avant"
COM_CONFIG_FIELD_VALUE_CACHE_OFF="Cache désactivé"
COM_CONFIG_FIELD_VALUE_CACHE_CONSERVATIVE="Cache conservateur"
COM_CONFIG_FIELD_VALUE_CACHE_PROGRESSIVE="Cache progressif"
COM_CONFIG_FIELD_VALUE_DEVELOPMENT="Développement"
COM_CONFIG_FIELD_VALUE_DISPLAY_OFFLINE_MESSAGE_CUSTOM="Message spécifique"
COM_CONFIG_FIELD_VALUE_DISPLAY_OFFLINE_MESSAGE_LANGUAGE="Message défini par la langue du site"
COM_CONFIG_FIELD_VALUE_ENTIRE_SITE="Administration et site"
COM_CONFIG_FIELD_VALUE_MAXIMUM="Maximum"
COM_CONFIG_FIELD_VALUE_NO_EMAIL="Sans e-mail"
COM_CONFIG_FIELD_VALUE_NONE="Aucun"
COM_CONFIG_FIELD_VALUE_PHP_MAIL="PHP Mail"
COM_CONFIG_FIELD_VALUE_SENDMAIL="Sendmail"
COM_CONFIG_FIELD_VALUE_SIMPLE="Simple"
COM_CONFIG_FIELD_VALUE_SITE_EMAIL="E-mail du site"
COM_CONFIG_FIELD_VALUE_SMTP="SMTP"
COM_CONFIG_FIELD_VALUE_SSL="SSL/TLS"
COM_CONFIG_FIELD_VALUE_SYSTEM_DEFAULT="Défaut"
COM_CONFIG_FIELD_VALUE_TLS="STARTTLS"
COM_CONFIG_FTP_DETAILS="Détails de connexion FTP"
COM_CONFIG_FTP_DETAILS_TIP="Pour mettre à jour votre fichier configuration.php, Joomla! aura besoin des informations d'accès à votre compte FTP. Veuillez les saisir dans le formulaire ci-dessous."
COM_CONFIG_FTP_SETTINGS="Paramètres FTP"
COM_CONFIG_GLOBAL_CONFIGURATION="Configuration"
COM_CONFIG_HELPREFRESH_SUCCESS="La liste des sites d'aide a été rafraîchie"
COM_CONFIG_LOCATION_SETTINGS="Localisation"
COM_CONFIG_MAIL_SETTINGS="Réglages e-mail"
COM_CONFIG_METADATA_SETTINGS="Paramètres des métadonnées"
COM_CONFIG_PERMISSION_SETTINGS="Paramètres des Droits"
COM_CONFIG_PERMISSIONS="Droits"
COM_CONFIG_PROXY_SETTINGS="Paramètres du proxy"
COM_CONFIG_SAVE_SUCCESS="Configuration enregistrée."
COM_CONFIG_SENDMAIL_ACTION_BUTTON="Envoyer un e-mail de test"
COM_CONFIG_SENDMAIL_BODY="Ceci est un test d'e-mail envoyé par \"%s\". Vos paramètres e-mail sont corrects!"
COM_CONFIG_SENDMAIL_ERROR="Le test d'e-mail n'a pu être envoyé."
COM_CONFIG_SENDMAIL_METHOD_MAIL="PHP Mail"
COM_CONFIG_SENDMAIL_METHOD_SENDMAIL="Sendmail"
COM_CONFIG_SENDMAIL_METHOD_SMTP="SMTP"
COM_CONFIG_SENDMAIL_SUBJECT="Mail de test provenant de %s"
COM_CONFIG_SENDMAIL_SUCCESS="L'e-mail a bien été envoyé à <strong>%s</strong> utilisant <strong>%s</strong>. Vérifier que vous avez reçu l'e-mail de test."
COM_CONFIG_SENDMAIL_SUCCESS_FALLBACK="L'e-mail a été envoyé à <strong>%s</strong>, mais en utilisant <strong>%s</strong> comme adresse de repli. Vérifier que le test d'e-mail a bien été reçu."
COM_CONFIG_SEO_SETTINGS="Paramètres SEO"
COM_CONFIG_SERVER="Serveur"
COM_CONFIG_SERVER_SETTINGS="Paramètres du serveur"
COM_CONFIG_SESSION_SETTINGS="Configuration des sessions"
COM_CONFIG_SITE_SETTINGS="Paramètres du site"
COM_CONFIG_SYSTEM="Système"
COM_CONFIG_SYSTEM_SETTINGS="Paramètres système"
COM_CONFIG_TEXT_FILTER_SETTINGS="Paramètres des filtres de texte"
COM_CONFIG_TEXT_FILTERS="Filtres de texte"
COM_CONFIG_TEXT_FILTERS_DESC="Ces filtres permettent de contrôler les éléments HTML autorisés à être insérés dans les zones de contenu des éditeurs.<br />Les paramètres indiqués ici seront appliqués à tous les contenus insérés par des utilisateurs du groupe sélectionné.<br />Vous pouvez filtrer de manière stricte ou libérale selon les besoins du site.<br />Les filtres sont par défaut paramétrés pour offrir une bonne protection contre les éléments communément associées à des attaques de site web."
COM_CONFIG_TEXT_FILTERS_NOTE="ATTENTION : Vous avez configuré un groupe parent avec le paramètre 'Aucun filtre'. Ce paramètre ne peut pas être substitué dans les groupes enfants et aucun autre filtre configuré ne sera appliqué."
COM_CONFIG_XML_DESCRIPTION="Composant de gestion de la configuration"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_CONFIG="Les modification des droits ne s'appliquent qu'à ce groupe et aux groupes enfants.<br /><em>Hérité</em> signifie que les droits du groupe parent seront utilisés.<br /><em>Refusé</em> signifie que quels que soient les droits du groupe parent, le groupe concerné ne pourra pas effectuer cette action. <br /><em>Autorisé</em> signifie que le groupe concerné pourra effectuer cette action ; s'il y a conflit avec le groupe parent, la modification ne sera pas appliquée, le label <em>Non autorisé (verrouillé)</em> sera affiché dans la colonne 'Droits appliqués'.<br /><em>Non défini</em> n'est utilisé que pour le groupe 'Public' dans la 'Configuration de Joomla'. Le groupe 'Public' est le parent de tous les groupes. Si un droit n'est pas défini, il sera traité comme 'Refusé' mais peut être changé pour les groupes enfants, composants, catégories et éléments."
language/fr-FR/fr-FR.plg_content_joomla.sys.ini000060400000001105152453623440015352 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_CONTENT_JOOMLA="Contenu - Joomla!"
PLG_CONTENT_JOOMLA_XML_DESCRIPTION="Traite les catégories pour les extensions du noyau. Envoie un mail quand un nouvel article est proposé en interface frontale."language/fr-FR/fr-FR.plg_editors_jce.ini000060400000001656152453623440014027 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_EDITORS_JCE="Éditeur - JCE"
WF_EDITOR_PLUGIN_TITLE="Plugin Éditeur JCE"
WF_EDITOR_PLUGIN_DESC="Plugin Éditeur JCE"

WF_EDITOR_PLUGIN_PARAMS_DESC="Les différents paramètres du plugin sont accessibles dans la <a href='index.php?option=com_jce&view=config'>Configuration de JCE</a> et dans la <a href='index.php?option=com_jce&view=groups'>Gestion des Profils</a>"

PLUGIN_REMOVED_LANG_FILE_MISSING="Le plugin est désactivé car le fichier langue <em>'%s'</em> n'est pas installé."
COMPONENT_NOT_INSTALLED="Le composant d'administration JCE n'est pas installé ! Vous devez l'installer pour faire fonctionner l'éditeur JCE."
language/fr-FR/fr-FR.plg_fields_radio.sys.ini000060400000001104152453623440014762 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_RADIO="Champs - Radio"
PLG_FIELDS_RADIO_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'radio' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_quickicon_joomlaupdate.sys.ini000060400000001363152453623440017076 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_QUICKICON_JOOMLAUPDATE="Icône raccourci - Alerte de mises à jour Joomla!"
PLG_QUICKICON_JOOMLAUPDATE_XML_DESCRIPTION="Ce plug-in permet d'afficher une icône d'alerte sur la page d'accueil de l'administration lorsque une mise à jour de Joomla! est disponible. Il doit être lié par son groupe au module d'administration 'Icones de raccourcis' qui doit être publié."

language/fr-FR/fr-FR.com_fields.sys.ini000060400000000734152453623440013610 0ustar00; @date        2016-12-15
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_FIELDS="Champs"
COM_FIELDS_XML_DESCRIPTION="Composant de gestion des champs personnalisés."
language/fr-FR/fr-FR.plg_finder_newsfeeds.sys.ini000060400000001424152453623440015655 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_FINDER_NEWSFEEDS="Indexation - Fils d'actualité"
PLG_FINDER_NEWSFEEDS_ERROR_ACTIVATING_PLUGIN="Impossible d'activer automatiquement le plug-in 'Indexation - Fils d'actualité'. Veuillez l'activer manuellement."
PLG_FINDER_NEWSFEEDS_XML_DESCRIPTION="Ce plug-in permet l'indexation des fils d'actualité du composant de Joomla dans la recherche avancée."
PLG_FINDER_STATISTICS_NEWS_FEED="Fil d'actualité"
language/fr-FR/fr-FR.plg_privacy_message.sys.ini000060400000001156152453623440015526 0ustar00; @date        2018-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_PRIVACY_MESSAGE="Confidentialité - Messages Utilisateurs"
PLG_PRIVACY_MESSAGE_XML_DESCRIPTION="Responsable du traitement des demandes d'informations liées à la confidentialité pour les donnés des messages des utilisateurs de Joomla."
language/fr-FR/fr-FR.plg_fields_url.ini000060400000001516152453623440013660 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_URL="Champs - URL"
PLG_FIELDS_URL_LABEL="URL (%s)"
PLG_FIELDS_URL_PARAMS_RELATIVE_DESC="Autoriser ou non les URLs relatives."
PLG_FIELDS_URL_PARAMS_RELATIVE_LABEL="URLs relatives"
PLG_FIELDS_URL_PARAMS_SCHEMES_DESC="Les protocoles autorisés."
PLG_FIELDS_URL_PARAMS_SCHEMES_LABEL="Protocoles"
PLG_FIELDS_URL_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'url' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_authentication_ldap.sys.ini000060400000001167152453623440016366 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_AUTHENTICATION_LDAP="Authentification - LDAP"
PLG_LDAP_XML_DESCRIPTION="Authentification des utilisateurs auprès d'un serveur LDAP.<br />Attention, vous devez laisser au moins un plug-in d'authentification activé pour vous connecter sur le site !"language/fr-FR/fr-FR.mod_custom.sys.ini000060400000001235152453623440013652 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


MOD_CUSTOM="Contenu personnalisé"
MOD_CUSTOM_XML_DESCRIPTION="Le module 'mod_custom' permet de créer vos propres modules personnalisés en y intégrant les contenus souhaités à l'aide de l'éditeur, code inclus si les droits de l'éditeur et de Joomla vous le permettent."
MOD_CUSTOM_LAYOUT_DEFAULT="Défaut"

language/fr-FR/fr-FR.plg_editors-xtd_image.sys.ini000060400000001233152453623440015751 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_EDITORS-XTD_IMAGE="Bouton - Image"
PLG_IMAGE_XML_DESCRIPTION="Affiche un bouton sous l'éditeur permettant d'insérer une image dans un article.<br />Affiche une fenêtre popup permettant de spécifier les propriétés de l'image et, de transférer de nouvelles images sur le serveur."language/fr-FR/fr-FR.plg_user_profile.sys.ini000060400000001001152453623440015030 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_USER_PROFILE="Utilisateur - Profil"
PLG_USER_PROFILE_XML_DESCRIPTION="Système de prise en charge des champs de profil utilisateur"language/fr-FR/fr-FR.plg_system_googlic_analytics.sys.ini000060400000001422152453623440017437 0ustar00; GoogliC Analytics fr-FR
; @version	$version 1.2.3 JoomliC 2012-05-20$
; @author	JoomliC <info@joomlic.com>
; @link		http://www.joomlic.com

PLG_SYSTEM_GOOGLIC_ANALYTICS="Système - GoogliC Analytics"
PLG_SYSTEM_GOOGLIC_ANALYTICS_XML_DESCRIPTION="<iframe src="_QQ_"http://www.joomlic.com/infosic/googlic/fr_googlic_analytics_124.html"_QQ_" frameborder="_QQ_"0"_QQ_" height="_QQ_"250"_QQ_" width="_QQ_"100%"_QQ_"></iframe><br/><br/><a href="_QQ_"index.php?option=com_plugins&view=plugins&filter_search=GoogliC"_QQ_">Activer le plug-in</a> et insérer votre ID de suivi Google Analytics pour mettre en place les statistiques de votre site.<br/><br/><i><small>Plugin Sytème GoogliC Analytics by Jooml!C - <a href='http://www.joomlic.com' target='_blanck'>www.joomlic.com</a></small></i>"language/fr-FR/fr-FR.com_privacy.sys.ini000060400000003267152453623440014023 0ustar00; @date        2018-09-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_PRIVACY="Confidentialité"
COM_PRIVACY_CONFIRM_VIEW_DEFAULT_DESC="Affiche un formulaire pour confirmer une demande d'informations."
COM_PRIVACY_CONFIRM_VIEW_DEFAULT_OPTION="Défaut"
COM_PRIVACY_CONFIRM_VIEW_DEFAULT_TITLE="Confirmation de demande"
COM_PRIVACY_CONSENTS_VIEW_DEFAULT_DESC="Affiche une liste des consentements d'utilisateurs"
COM_PRIVACY_CONSENTS_VIEW_DEFAULT_TITLE="Confidentialité : Consentements"
COM_PRIVACY_DASHBOARD_VIEW_DEFAULT_DESC="Un tableau de bord lié aux paramètres de confidentialité et aux demandes d'informations du site."
COM_PRIVACY_DASHBOARD_VIEW_DEFAULT_TITLE="Confidentialité : Tableau de bord"
COM_PRIVACY_REMIND_VIEW_DEFAULT_DESC="Affiche un formulaire pour étendre le consentement à la politique de confidentialité."
COM_PRIVACY_REMIND_VIEW_DEFAULT_TITLE="Étendre le consentement"
COM_PRIVACY_REQUEST_VIEW_DEFAULT_DESC="Affiche un formulaire pour soumettre une demande d'informations."
COM_PRIVACY_REQUEST_VIEW_DEFAULT_OPTION="Défaut"
COM_PRIVACY_REQUEST_VIEW_DEFAULT_TITLE="Créer une demande"
COM_PRIVACY_REQUESTS_VIEW_DEFAULT_DESC="Affiche une liste des demandes d'informations de la part des utilisateurs"
COM_PRIVACY_REQUESTS_VIEW_DEFAULT_TITLE="Confidentialité : Demandes d'informations"
COM_PRIVACY_XML_DESCRIPTION="Composant de gestion des actions liées à la confidentialité."
language/fr-FR/fr-FR.mod_logged.sys.ini000060400000001151152453623440013576 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

MOD_LOGGED="Utilisateurs identifiés"
MOD_LOGGED_XML_DESCRIPTION="Le module 'mod_logged' affiche les derniers utilisateurs qui se sont identifiés (connectés) dans l'espace d'administration ou du site."
MOD_LOGGED_LAYOUT_DEFAULT="Défaut"language/fr-FR/fr-FR.plg_system_logout.ini000060400000001341152453623440014441 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SYSTEM_LOGOUT_XML_DESCRIPTION="Plug-in système de déconnexion redirigeant vers la page d'accueil après déconnexion de l'espace connecté si l'utilisateur n'a pas accès à la page affichée."
PLG_SYSTEM_LOGOUT="Système - Déconnexion"
PLG_SYSTEM_LOGOUT_REDIRECT="À la suite de votre déconnexion, vous avez été redirigé vers la page d'accueil"

language/fr-FR/fr-FR.plg_fields_mediajce.sys.ini000060400000000736152453623440015437 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_FIELDS_MEDIAJCE="Champs - Média JCE"
PLG_FIELDS_MEDIAJCE_XML_DESCRIPTION="Plugin champ Média JCE"
PLG_FIELDS_MEDIAJCE_LABEL="JCE Gestionnaire de fichiers (média)"
language/fr-FR/fr-FR.plg_quickicon_eos310.sys.ini000060400000001210152453623440015413 0ustar00; @date        2021-08-24
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_QUICKICON_EOS310="Icônes de raccourcis - Notification de fin de support de Joomla 3.10"
PLG_QUICKICON_EOS310_XML_DESCRIPTION="Ce plug-in vérifie l'état de fin du support de Joomla 3.10 et vous en informe lorsque vous visitez la page du panneau de configuration."
language/fr-FR/fr-FR.plg_installer_webinstaller.sys.ini000060400000001120152453623440017104 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_INSTALLER_WEBINSTALLER="Installation - Installation depuis le Web"
PLG_INSTALLER_WEBINSTALLER_XML_DESCRIPTION="Ce plug-in permet d'activer l'onglet ‛Installation à partir du Web' et de choisir sa position."
language/fr-FR/fr-FR.com_banners.sys.ini000060400000001704152453623440013770 0ustar00; @date        2015-01-30
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_BANNERS="Bannières"
COM_BANNERS_BANNERS="Bannières"
COM_BANNERS_CATEGORY_ADD_TITLE="Bannières : Ajouter une catégorie"
COM_BANNERS_CATEGORY_EDIT_TITLE="Bannières : Modifier une catégorie"
COM_BANNERS_CATEGORIES="Catégories"
COM_BANNERS_CONTENT_TYPE_BANNER="Bannière"
COM_BANNERS_CONTENT_TYPE_CLIENT="Client de bannière"
COM_BANNERS_CONTENT_TYPE_CATEGORY="Catégorie de bannières"
COM_BANNERS_CLIENTS="Clients"
COM_BANNERS_TAGS_CATEGORY="Catégorie de bannières"
COM_BANNERS_TRACKS="Suivi"
COM_BANNERS_XML_DESCRIPTION="Composant de gestion des bannières et des clients"
language/fr-FR/fr-FR.plg_fields_image.sys.ini000060400000001104152453623440014746 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_IMAGE="Champs - Image"
PLG_FIELDS_IMAGE_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'image' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_system_privacyconsent.sys.ini000060400000001353152453623440017017 0ustar00; @date        2018-09-15
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SYSTEM_PRIVACYCONSENT="Système - Consentement à la politique de confidentialité"
PLG_SYSTEM_PRIVACYCONSENT_XML_DESCRIPTION="Plugin de base pour demander le consentement de l'utilisateur à la politique de confidentialité du site. Les utilisateurs existants qui n'ont pas encore consenti seront redirigés lors de la connexion pour mettre à jour leur profil."
language/fr-FR/fr-FR.com_xmap.ini000060400000016357152453623440012502 0ustar00; @package     Xmap
; @copyright   2007 - 2014 Joomla! Vargas. All rights reserved.
; @subpackage  fr-FR.com_xmap.ini 
; @description Traduction francophone - fr-FR
; @version     2.3.4 - 05.02.2014
; @author      Mihàly Marti alias Sarki
; @copyright   Joomlatutos.com - www.joomlautos.com
; @license     GNU General Public License version 2, or later
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8 - No BOM

; Component Instalation strings
XMAP_INSTALLING_XMAP="Installation du composant Xmap, générateur de plans de site Joomla!"
XMAP_UPGRADING_XMAP="Mise à jour du composant Xmap, générateur de plans de site Joomla!"
XMAP_UNISTALLING_XMAP_EXTENSIONS="Désinstallation de Xmap et ses extensions"
XMAP_INSTALLED_EXTENSION_X="Installation de l'extension %s"
XMAP_NOT_INSTALLED_EXTENSION_X="Il n'est pas possible d'installer l'extension pour %s"
XMAP_INSTALL_ERROR_EXTENSION="Erreur d'installation de l'extension"
XMAP_INSTALL_SUCCESS_EXTENSION="Succès de l'installation de l'extension"

XMAP_HEADING_XML_STATS="Stat's du plan XML"
XMAP_HEADING_HTML_STATS="Stat's du plan HTML"
XMAP_HEADING_NUM_LINKS="ID Article"
XMAP_HEADING_NUM_HITS="Clics"
XMAP_HEADING_LAST_VISIT="Der. visite"
XMAP_HEADING_SITEMAP="Plan du site"
XMAP_HEADING_DEFAULT="Défaut"
XMAP_HEADING_ID="ID"
XMAP_HEADING_PUBLISHED="Publié"
XMAP_HEADING_ACCESS="Accès"
XMAP_SUBMENU_SITEMAPS="Plans du site"
XMAP_SUBMENU_EXTENSIONS="Extensions"
XMAP_SUBMENU_SETTINGS="Paramètres"
XMAP_TOOLBAR_SET_DEFAULT="Définir par défaut"
XMAP_SITEMAPS_TITLE="Gestion des plans du site"
DATE_MINUTES_AGO="Il y a %d minutes"
DATE_HOURS_MINUTES_AGO="Il y a %d heures et %d minutes"
DATE_DAYS_HOURS_AGO="Il y a %d jours et %d heures"
DATE_NEVER="Jamais"
XMAP_INTROTEXT_LABEL="Texte d'intro"
XMAP_INTROTEXT_DESC="Spécifiez le texte qui sera affiché au-dessus du plan du site"
XMAP_PRIORITY="Priorité"
XMAP_CHANGE_FREQUENCY="Fréquence"
XMAP_PAGE_ADD_SITEMAP="Nouveau plan du site"
XMAP_PAGE_EDIT_SITEMAP="Modifier le plan du site"
XMAP_SITEMAP_DETAILS_FIELDSET="Détails du plan du site"
XMAP_XML_LINK="Plan du site XML"
XMAP_XML_LINK_TOOLTIP="Consulter le plan du site XML. Utilisez cette adresse URL pour soumettre votre site aux moteurs de recherche."
XMAP_IMAGES_LINK="Plan du site XML Images"
XMAP_IMAGES_LINK_TOOLTIP="Consulter le plan du site XML Images. Utilisez cette adresse URL pour soumettre votre site aux moteurs de recherche."
XMAP_NEWS_LINK="Nouveau plan"
XMAP_NEWS_LINK_TOOLTIP="Allez à la 'Nouvelle' version du plan du site, utilisez cette adresse URL pour soumettre votre sitemap à Google News."

XMAP_MESSAGE_EXTENSIONS_DISABLED="Xmap a détecté que l'extension '%s' peut vous aider à obtenir plus de contenu dans votre plan du site, mais il est désactivé. Vous devez l'activer manuellement dans le <u><a href='index.php?option=com_plugins&view=plugins&filter_type=xmap'>gestionnaire d'extensions</a></u>."
COM_XMAP_SITEMAPS_N_ITEMS_UNPUBLISHED="%d plans du site dépubliés avec succès"
COM_XMAP_SITEMAPS_N_ITEMS_UNPUBLISHED_1="%d plan du site dépublié avec succès"
COM_XMAP_SITEMAPS_N_ITEMS_PUBLISHED="%d plans du site publiés avec succès"
COM_XMAP_SITEMAPS_N_ITEMS_PUBLISHED_1="%d plan du site publié avec succès"
COM_XMAP_SITEMAPS_N_ITEMS_TRASHED="%d plans du site mises à la corbeille avec succès"
COM_XMAP_SITEMAPS_N_ITEMS_TRASHED_1="%d plan du site mis à la corbeille avec succès"
COM_XMAP_SITEMAPS_N_ITEMS_DELETED="%d plans du site supprimés avec succès"
COM_XMAP_SITEMAPS_N_ITEMS_DELETED_1="%d plan du site supprimé avec succès"

XMAP_FIELDSET_MENUS="Menus"
XMAP_FIELDSET_OPTIONS="Paramètres"
XMAP_FIELDSET_METADATA="Métadonnées"
XMAP_ATTRIBS_SHOW_INTRO_LABEL="Texte d'introduction"
XMAP_ATTRIBS_SHOW_INTRO_DESC="Spécifiez si le texte d'introduction doit être affiché dans le plan du site HTML."
XMAP_ATTRIBS_SHOW_MENU_TITLE_LABEL="Titre de menu"
XMAP_ATTRIBS_SHOW_MENU_TITLE_DESC="Spécifiez si le titre des menus doit être affiché au dessus du contenu."
XMAP_ATTRIBS_CLASSNAME_LABEL="Nom de classe CSS"
XMAP_ATTRIBS_CLASSNAME_DESC="Nom de la classe CSS à utiliser pour ce plan du site."
XMAP_ATTRIBS_COLUMNS_LABEL="Colonnes"
XMAP_ATTRIBS_COLUMNS_DESC="Spécifiez le nombre de colonnes à afficher dans le plan du site HTML. (Ce paramètre n'a pas d'effet si un seul menu est intégré au plan du site)."
XMAP_ATTRIBS_EXTERNAL_LINKS_IMAGE_LABEL="Image des liens externes"
XMAP_ATTRIBS_EXTERNAL_LINKS_IMAGE_DESC="Sélectionnez l'image à utiliser pour les liens externes."
XMAP_ATTRIBS_COMPRESS_XML_LABEL="Compresser le XML"
XMAP_ATTRIBS_COMPRESS_XML_DESC="Spécifiez si le fichier XML du plan du site doit être compressé ou non."
XMAP_ATTRIBS_BEAUTIFY_XML_LABEL="XML embelli"
XMAP_ATTRIBS_BEAUTIFY_XML_DESC="Sélectionnez 'Oui' pour ajouter du style au plan du site XML. Cet affichage n'affecte pas le comportement des moteurs de recherche.<br />Si le plan du site ne s'affiche pas ou que des erreurs sont visibles, veuillez désactiver cette fonction."
XMAP_FIELDSET_NEWS_OPTIONS="Plan des actualités (news)"
XMAP_ATTRIBS_NEWS_PUBLICATION_NAME_LABEL="Nom de publication"
XMAP_ATTRIBS_NEWS_PUBLICATION_NAME_DESC="Nom de publication des nouvelles. Il doit correspondre exactement au nom tel qu'il apparaît sur vos articles dans news.google.com, sans omettre les caractères d'échappement.<br />Par exemple, si le nom apparaît dans Google news avec des guillemets et contient des parenthèses, vous devez les ajouter dans le nom: &ldquo;Exemple de nom (description)&rdquo;"
XMAP_ATTRIBS_NEWS_POSTS_KEYWORDS_LABEL="Mots-clés de messages"
XMAP_ATTRIBS_NEWS_POSTS_KEYWORDS_DESC="Liste des mots clés, séparés par une virgule, pour décrire vos messages. Par défaut, le titre de la catégorie est utilisé."
XMAP_ATTRIBS_INCLUDE_LINK_LABEL="Lien vers l'auteur"
XMAP_ATTRIBS_INCLUDE_LINK_DESC="Inclure le lien vers le site de l'auteur de Xmap au bas de la carte du site HTML."

; Extension edit page
XMAP_PAGE_EDIT_EXTENSION="Modifier Extension"
XMAP_N_EXTENSIONS_UNPUBLISHED="%s extensions désactivées"
XMAP_N_EXTENSIONS_PUBLISHED="%s extensions activées"
XMAP_EXTENSION_DETAILS="Détails"
XMAP_EXTENSION_AUTHOR="Auteur"
XMAP_EXTENSION_AUTHOR_EMAIL="E-mail de l'auteur"
XMAP_EXTENSION_AUTHOR_WEBSITE="Site de l'auteur"
XMAP_EXTENSION_DESCRIPTION="Descriptif"

XMAP_DESC_EXTENSIONS="Liste des extensions Xmap installées"
XMAP_HEADING_AUTHOR="Auteur"
XMAP_HEADING_DATE="Date"
XMAP_HEADING_FOLDER="Dossier"
XMAP_HEADING_NUM="Num."
XMAP_HEADING_PLUGIN="Plug-in"
XMAP_HEADING_VERSION="Version"
XMAP_INSTALL="Installer"
XMAP_INSTALL_DIRECTORY="Répertoire d'installation"
XMAP_INSTALL_FROM_DIRECTORY="Installer à partir du répertoire"
XMAP_INSTALL_FROM_URL="Installer à partir de l'URL"
XMAP_INSTALL_NEW_EXTENSION="Installer une nouvelle extension"
XMAP_INSTALL_URL="URL d'installation"
XMAP_PACKAGE_FILE="Fichier d'installation"
XMAP_PLEASE_ENTER_A_URL="Veuillez spécifier l'URL"
XMAP_PLEASE_SELECT_A_DIRECTORY="Veuillez spécifier le répertoire"
XMAP_PLEASE_SELECT_A_FILE_TO_UPLOAD="Veuillez spécifier le fichier à envoyer"
XMAP_UPLOAD_FILE="Envoyer le fichier"
XMAP_UPLOAD_PACKAGE_FILE="Envoyer le fichier d'installation"
XMAP_EXTENSION_MANAGER_TITLE="Gestionnaire d'extensions"
XMAP_EXTENSIONS_TITLE="Extensions"
XMAP_FILTER_SEARCH_DESC="Recherche dans le titre"
XMAP_FILTER_SEARCH_DESC="Rechercher un plan de site par son titre"
language/fr-FR/fr-FR.plg_finder_tags.sys.ini000060400000001221152453623440014623 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8 - No BOM


PLG_FINDER_STATISTICS_TAG="Tag"
PLG_FINDER_TAGS="Recherche avancée - Tags"
PLG_FINDER_TAGS_ERROR_ACTIVATING_PLUGIN="Impossible d'activer le plug-in \"Recherche avancée - Tags\" automatiquement."
PLG_FINDER_TAGS_XML_DESCRIPTION="Plug-in d'indexation des tags Joomla!"
language/fr-FR/fr-FR.tpl_isis.ini000060400000007010152453623440012507 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


ISIS="Template d'administration Isis"
TPL_ISIS_CLEAR_CACHE="Effacer le cache"
TPL_ISIS_COLOR_DESC="Couleur de fond de la barre de navigation. Cliquez dans le champ pour afficher le sélecteur de couleur. Si le champ n'est pas rempli, la couleur utilisée sera celle par défaut."
TPL_ISIS_COLOR_HEADER_DESC="Couleur de fond de la barre de titre. Cliquez dans le champ pour afficher le sélecteur de couleur. Si le champ n'est pas rempli, la couleur utilisée sera celle par défaut."
TPL_ISIS_COLOR_HEADER_LABEL="Couleur de fond de la barre de titre"
TPL_ISIS_COLOR_LABEL="Couleur de fond de la barre de navigation"
TPL_ISIS_COLOR_LOGIN_BACKGROUND_DESC="Couleur pour le fond de l'écran de connexion. Si le champ n'est pas rempli, la couleur utilisée sera celle par défaut."
TPL_ISIS_COLOR_LOGIN_BACKGROUND_LABEL="Couleur de fond de l'écran de connexion"
TPL_ISIS_COLOR_SIDEBAR_DESC="Couleur de fond de la barre latérale. Si le champ n'est pas rempli, la couleur utilisée sera celle par défaut."
TPL_ISIS_COLOR_SIDEBAR_LABEL="Couleur de la barre latérale "
TPL_ISIS_COLOR_LINK_DESC="Choisir une couleur pour les liens. Si le champ n'est pas rempli, la couleur utilisée sera celle par défaut."
TPL_ISIS_COLOR_LINK_LABEL="Couleur des liens"
TPL_ISIS_CONTROL_PANEL="Panneau d'administration"
TPL_ISIS_EDIT_ACCOUNT="Modifier le compte"
TPL_ISIS_FIELD_ADMIN_MENUS_DESC="Si vous souhaitez utiliser l'administration de Joomla uniquement sur un écran d'ordinateur, réglez ce paramètre sur 'Non', cela évitera la modification de l'aspect des menus lors de la réduction d'une fenêtre navigateur, prévue pour les petits écrans (tablette, téléphone portable)."
TPL_ISIS_FIELD_ADMIN_MENUS_LABEL="Menus d'administration adaptables"
TPL_ISIS_HEADER_DESC="Afficher/Masquer la barre de titre contenant le logo et le titre des interfaces."
TPL_ISIS_HEADER_LABEL="Barre de titre"
TPL_ISIS_INSTALLER="Installer"
TPL_ISIS_ISFREESOFTWARE="Joomla!® est un logiciel libre distribué sous licence GNU/GPL."
TPL_ISIS_LOGIN_LOGO_DESC="Télécharger un logo personnalisé pour la connexion à l'administration"
TPL_ISIS_LOGIN_LOGO_LABEL="Logo de connexion"
TPL_ISIS_LOGO_DESC="Vous pouvez utiliser un logo personnalisé pour le template d'administration."
TPL_ISIS_LOGO_LABEL="Logo dans la barre de titre"
TPL_ISIS_LOGOUT="Déconnexion"
TPL_ISIS_PREVIEW="Prévisualisation %s"
TPL_ISIS_SKIP_TO_MAIN_CONTENT="Aller au contenu principal"
TPL_ISIS_SKIP_TO_MAIN_CONTENT_HERE="Le contenu principal commence ici"
TPL_ISIS_STATUS_BOTTOM="Bas"
TPL_ISIS_STATUS_DESC="Choisissez la position du module de statut."
TPL_ISIS_STATUS_LABEL="Position du module de statut"
TPL_ISIS_STATUS_TOP="Haut"
TPL_ISIS_STICKY_DESC="Paramètre optionnel permettant de fixer la barre d'outils à un emplacement spécifique."
TPL_ISIS_STICKY_LABEL="Barre d'outils fixe"
TPL_ISIS_TOGGLE_MENU="Basculer la navigation"
TPL_ISIS_TOOLBAR="Barre d'outils"
TPL_ISIS_USERMENU="Menu Utilisateur"
TPL_ISIS_XML_DESCRIPTION="Poursuivant le thème des déesses/dieux égyptiens (Khepri de Joomla 1.5 et Hathor de Joomla 1.6), Isis est le template d'administration de Joomla 3 basé sur Bootstrap et le lancement de la bibliothèque 'Joomla User Interface' (JUI)."
language/fr-FR/fr-FR.plg_captcha_recaptcha_invisible.ini000060400000005722152453623440017214 0ustar00; @date        2018-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_CAPTCHA_RECAPTCHA_INVISIBLE="CAPTCHA - Invisible reCAPTCHA"
PLG_CAPTCHA_RECAPTCHA_INVISIBLE_XML_DESCRIPTION="Ce plugin CAPTCHA utilise le service \"Invisible reCAPTCHA\". Pour obtenir un site et une clé secrète pour votre domaine, se rendre à <a href=\"https://www.google.com/recaptcha\" target=\"_blank\">https://www.google.com/recaptcha</a>."
; Params
PLG_RECAPTCHA_INVISIBLE_BADGE_BOTTOMLEFT="En bas à gauche"
PLG_RECAPTCHA_INVISIBLE_BADGE_BOTTOMRIGHT="En bas à droite"
PLG_RECAPTCHA_INVISIBLE_BADGE_DESC="Positionnement du badge reCAPTCHA."
PLG_RECAPTCHA_INVISIBLE_BADGE_INLINE="Inline"
PLG_RECAPTCHA_INVISIBLE_BADGE_LABEL="Badge"
PLG_RECAPTCHA_INVISIBLE_CALLBACK_DESC="(Facultatif) fonction de rappel JavaScript, exécutée après une réponse reCAPTCHA réussie."
PLG_RECAPTCHA_INVISIBLE_CALLBACK_LABEL="Fonction de rappel"
PLG_RECAPTCHA_INVISIBLE_ERROR_CALLBACK_DESC="(Facultatif) fonction de rappel JavaScript, exécutée suite à une erreur de réponse reCAPTCHA."
PLG_RECAPTCHA_INVISIBLE_ERROR_CALLBACK_LABEL="Erreur de la fonction de rappel"
PLG_RECAPTCHA_INVISIBLE_EXPIRED_CALLBACK_DESC="(Facultatif) fonction de rappel JavaScript, exécutée si le reCAPTCHA a expiré."
PLG_RECAPTCHA_INVISIBLE_EXPIRED_CALLBACK_LABEL="Expiration de la fonction de rappel"
PLG_RECAPTCHA_INVISIBLE_PRIVATE_KEY_DESC="Utilisé dans la communication entre votre serveur et le serveur reCAPTCHA. Assurez-vous de la garder secrète."
PLG_RECAPTCHA_INVISIBLE_PRIVATE_KEY_LABEL="Clé secrète"
PLG_RECAPTCHA_INVISIBLE_PUBLIC_KEY_DESC="Utilisé dans le code JavaScript servi à vos utilisateurs."
PLG_RECAPTCHA_INVISIBLE_PUBLIC_KEY_LABEL="Clé de site"
PLG_RECAPTCHA_INVISIBLE_TABINDEX_DESC="Le tabindex du défi."
PLG_RECAPTCHA_INVISIBLE_TABINDEX_LABEL="Attribut Tabindex"
; Privacy notice
PLG_RECAPTCHA_INVISIBLE_PRIVACY_CAPABILITY_IP_ADDRESS="Le plug-in reCAPTCHA Invisible s'intègre au système reCAPTCHA de Google en tant que service de protection anti-spam. Dans le cadre de ce service, l'adresse IP de l'utilisateur répondant au défi captcha est transmise à Google."
; Error messages
PLG_RECAPTCHA_INVISIBLE_ERROR_EMPTY_SOLUTION="Solution vide non autorisée."
PLG_RECAPTCHA_INVISIBLE_ERROR_NO_IP="Pour des raisons de sécurité, vous devez passer l’adresse IP distante à reCAPTCHA."
PLG_RECAPTCHA_INVISIBLE_ERROR_NO_PRIVATE_KEY="Le plugin reCAPTCHA a besoin d’une clé secrète à définir dans ses paramètres. Veuillez contacter un administrateur du site."
PLG_RECAPTCHA_INVISIBLE_ERROR_NO_PUBLIC_KEY="Le plugin reCAPTCHA a besoin d’une clé de site à définir dans ses paramètres. Veuillez contacter un administrateur du site."
language/fr-FR/fr-FR.plg_fields_repeatable.ini000060400000002457152453623440015167 0ustar00; @date        2018-09-17
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_REPEATABLE="Champs - Répétabilité"
PLG_FIELDS_REPEATABLE_LABEL="Répétable (%s)"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_NAME_DESC="Le nom du champ à afficher dans le formulaire"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_NAME_LABEL="Nom"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_TYPE_DESC="Définir le type de champ"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_TYPE_EDITOR="Éditeur"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_TYPE_LABEL="Type"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_TYPE_MEDIA="Media"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_TYPE_NUMBER="Nombre"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_TYPE_TEXT="Texte"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDNAME_TYPE_TEXTAREA="Zone de texte"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDS_DESC="Ajouter un ou plusieurs champs"
PLG_FIELDS_REPEATABLE_PARAMS_FIELDS_LABEL="Formulaire de champs"
PLG_FIELDS_REPEATABLE_XML_DESCRIPTION="Plugin pour créer un formulaire répétable avec des champs personnalisables."
language/fr-FR/fr-FR.plg_system_wf_responsify.ini000060400000002646152453623440016036 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_WF_RESPONSIFY_XML_DESCRIPTION="Ce plugin attribue un effet responsive aux éléments objet, embed, vidéo, audio et iframe."
PLG_SYSTEM_WF_RESPONSIFY="Responsify pour JCE"
PLG_SYSTEM_WF_RESPONSIFY_FULL_WIDTH_DISPLAY="Affichage pleine largeur"
PLG_SYSTEM_WF_RESPONSIFY_FULL_WIDTH_DISPLAY_DESC="Agrandir les vidéos pour les adapter à la largeur de la page ou du conteneur parent."
PLG_SYSTEM_WF_RESPONSIFY_ELEMENTS="Éléments"
PLG_SYSTEM_WF_RESPONSIFY_ELEMENTS_DESC="Une liste d'éléments à rendre responsive."
PLG_SYSTEM_WF_RESPONSIFY_MENU_ASSIGN="Affecter au menu"
PLG_SYSTEM_WF_RESPONSIFY_MENU_ASSIGN_DESC="Attribuer le chargement des Widgets responsive à ces éléments de menu."
PLG_SYSTEM_WF_RESPONSIFY_MENU_EXCLUDE="Exclure du menu"
PLG_SYSTEM_WF_RESPONSIFY_MENU_EXCLUDE_DESC="Exclure le chargement des Widgets responsive à ces éléments de menu"

PLG_SYSTEM_WF_RESPONSIFY_CLICK_TO_PLAY="Cliquer pour lire"
PLG_SYSTEM_WF_RESPONSIFY_CLICK_TO_PLAY_DESC="Activer la fonction "Cliquer pour lire" aux médias basés sur des iframes, tels Youtube, Vimeo, etc."
PLG_SYSTEM_WF_RESPONSIFY_CLICK_TO_PLAY_TEXT="Cliquer pour activer"language/fr-FR/fr-FR.com_icagenda.sys.ini000060400000010571152453623440014075 0ustar00; iCagenda
; Copyright (c)2012-2015 Cyril Rezé (Lyr!C) / JoomliC.com - All rights reserved.
; License GNU General Public License version 3 or later <http://www.gnu.org/licenses/gpl.html>
; Note : All ini files need to be saved as UTF-8 - No BOM
;
; ADMIN					: com_icagenda.sys.ini
; Translation Platform	: https://www.transifex.com/projects/p/icagenda/


; Install
ICAGENDA = " iCagenda"
COM_ICAGENDA_INSTALL_THIS_RELEASE = "Installation de la version de iCagenda : "
COM_ICAGENDA_INSTALL_CACHE_VERSION = "Version en cache, précédemment installée : "
COM_ICAGENDA_INSTALL_MINIMUM_JOOMLA_VERSION = "Version minimale de Joomla! pour permettre l'installation de iCagenda : "
COM_ICAGENDA_INSTALL_CURRENT_JOOMLA_VERSION = "Votre version de Joomla! : "
COM_ICAGENDA_INSTALL_ERROR_JOOMLA_VERSION = "<b>ERREUR</b> : impossible d'installer iCagenda sur une version de joomla! antérieure à "
COM_ICAGENDA_INSTALL_INCORRECT_VERSION = "Séquence de version incorrecte. Mise à jour impossible "
COM_ICAGENDA_PREFLIGHT_ = "pré-installation "
COM_ICAGENDA_WELCOME_1 = "Première installation sur votre site de l'extension <b>iCagenda</b> <small>v</small> "
COM_ICAGENDA_WELCOME_2 = " réalisée avec succès!<br/>"
COM_ICAGENDA_WELCOME_3 = "Bienvenue !!!<br/>"
COM_ICAGENDA_INSTALL = "Première installation sur votre site de l'extension iCagenda - v "
COM_ICAGENDA_UPDATE = "mis à jour vers la version"
COM_ICAGENDA_POSTFLIGHT= "post-installation "
COM_ICAGENDA_UNINSTALL = "Désinstallation complète réussie.<br/>Merci d'avoir utilisé <b>iCagenda</b>. En espérant vous revoir très bientôt!<br/><br/><i><b><span style='font-size: 11px'>Jooml!C &#8226; iCagenda &#8226; <a href='http://www.joomlic.com' target='_blank'>www.joomlic.com</a></span></b></i>"
COM_ICAGENDA_TO = " vers "
COM_ICAGENDA_VIDEO_GETTING_STARTED = "Premiers pas avec iCagenda "
COM_ICAGENDA_VIDEO_TUTORIALS = "Tutoriels vidéo"
COM_ICAGENDA_FOLDER_CREATION = "Création des dossiers"
COM_ICAGENDA_FOLDER = "Dossier"
COM_ICAGENDA_CREATED = "créé !"
COM_ICAGENDA_CREATION_FAILED = "échec de la création !"
COM_ICAGENDA_PLEASE_CREATE_MANUALLY = "Merci de le créer manuellement."
COM_ICAGENDA_EXISTS = "présent!"

; Install details of iCagenda features
COM_ICAGENDA_FEATURES_LANGUAGES = "Langues incluses :"
COM_ICAGENDA_FEATURES_TRANSLATION_PACKS = "Packs de langue :"
COM_ICAGENDA_FEATURES_BACKEND = "<b>Back-End :</b> Gestion par catégories, créations d'évènements, gestion des inscriptions, newsletter, gestion des thèmes..."
COM_ICAGENDA_FEATURES_FRONTEND = "<b>Front-End :</b> Liste des évènements, vues détaillées, proposer un évènement, inscription aux évènements, partage sur les réseaux sociaux, carte GoogleMaps, choix du thème graphique..."

; iCagenda
COM_ICAGENDA = "iCagenda"
COM_ICAGENDA_MENU = " <i class='icon-calendar-3'></i> <b>!Cagenda</b>"
COM_ICAGENDA_XML_DESCRIPTION = "Extension de gestion d'un calendrier d'évènements"
COM_ICAGENDA_DESC = "<i><b><span style='font-size: 11px'>Jooml!C &#8226; iCagenda &#8226; <a href='http://www.joomlic.com' target='_blank'>www.joomlic.com</a></span></b></i>"
COM_ICAGENDA_TITLE_ICAGENDA = "<i class='icon-home-2'></i> Panneau d'administration"
COM_ICAGENDA_CATEGORIES = "Catégories"
COM_ICAGENDA_MENU_CATEGORIES = "<i class='icon-folder-3'></i> Catégories"
COM_ICAGENDA_CATEGORY_ADD = "Ajouter une catégorie"
COM_ICAGENDA_EVENTS = "<i class='icon-calendar-3'></i> Évènements"
COM_ICAGENDA_EVENT_ADD = "Ajouter un évènement"
COM_ICAGENDA_REGISTRATION = "<i class='icon-signup'></i> Inscriptions"
COM_ICAGENDA_MENU_CUSTOMFIELDS = "<i class='icon-list-2'></i> Champs personnalisés"
COM_ICAGENDA_MENU_FEATURES = "<i class='icon-checkbox'></i> Caractéristiques"
COM_ICAGENDA_MAIL = "<i class='icon-envelope-opened'></i> Newsletter"
COM_ICAGENDA_LOCATIONS = "Lieux"
COM_ICAGENDA_INFO = "<i class='icon-info-2'></i> Info"
COM_ICAGENDA_THEMES = "<i class='icon-palette'></i> Thèmes"

; view
COM_ICAGENDA_SUBMIT_VIEW_DEFAULT_TITLE = "Proposer un évènement"
COM_ICAGENDA_SUBMIT_VIEW_DEFAULT_DESC = "Affiche un formulaire pour proposer un évènement en frontal du site"
COM_ICAGENDA_LIST_VIEW_DEFAULT_TITLE = "Liste des évènements"
COM_ICAGENDA_LIST_VIEW_DEFAULT_DESC = "Affiche une liste des évènements, futurs et/ou passés, filtrée (en option) par catégorie, etc..."
COM_ICAGENDA_LIST_VIEW_SEARCH_TITLE = "Recherche"
COM_ICAGENDA_LIST_VIEW_SEARCH_DESC = "Afficher une page de Recherche dans les évènements"
language/fr-FR/fr-FR.mod_title.ini000060400000001231152453623440012640 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

MOD_TITLE="Titre des fonctions et extensions"
MOD_TITLE_XML_DESCRIPTION="Le module 'mod_title' affiche le titre des extensions natives à Joomla ou installées lors de l'affichage de leur interface. Ce module doit être placé en position 'title' avec le template par défaut de Joomla."language/fr-FR/fr-FR.com_admin.ini000060400000042740152453623440012620 0ustar00; @date        2015-03-03
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_ADMIN="Informations système"
COM_ADMIN_ALPHABETICAL_INDEX="Index alphabétique"
COM_ADMIN_CACHE_DIRECTORY="(Répertoire cache)"
COM_ADMIN_CLEAR_RESULTS="Effacer les résultats"
COM_ADMIN_CONFIGURATION_FILE="Fichier de configuration"
COM_ADMIN_DATABASE_COLLATION="Interclassement de la base de données "
COM_ADMIN_DATABASE_CONNECTION_COLLATION="Collation de la connexion à la base de données"
COM_ADMIN_DATABASE_TYPE="Type de la base de données"
COM_ADMIN_DATABASE_VERSION="Version de la base de données "
COM_ADMIN_DIRECTORY="Répertoire"
COM_ADMIN_DIRECTORY_PERMISSIONS="Permissions des dossiers"
COM_ADMIN_DISABLED_FUNCTIONS="<strong>Disabled Functions</strong> (fonctions désactivées) "
COM_ADMIN_DISPLAY_ERRORS="<strong>Display Errors</strong> (afficher les erreurs) "
COM_ADMIN_DOWNLOAD_SYSTEM_INFORMATION_TEXT="Télécharger en format Texte"
COM_ADMIN_DOWNLOAD_SYSTEM_INFORMATION_JSON="Télécharger en format JSON"
COM_ADMIN_EXTENSIONS="Extensions"
COM_ADMIN_FILE_UPLOADS="<strong>File Uploads</strong> (transfert HTTP de fichiers) "
COM_ADMIN_GLOSSARY="Glossaire"
COM_ADMIN_GO="Appliquer"
COM_ADMIN_HELP="Aide Joomla!"
COM_ADMIN_HELP_COMPONENTS_ACTIONLOGS="Journaux des actions"
COM_ADMIN_HELP_COMPONENTS_ASSOCIATIONS="Associations multilingues"
COM_ADMIN_HELP_COMPONENTS_ASSOCIATIONS_EDIT="Associations multilingues : Sélectionner"
COM_ADMIN_HELP_COMPONENTS_BANNERS_BANNERS="Bannières"
COM_ADMIN_HELP_COMPONENTS_BANNERS_BANNERS_EDIT="Bannières : Nouvelle/Modifier"
COM_ADMIN_HELP_COMPONENTS_BANNERS_CATEGORIES="Bannières : Catégories"
COM_ADMIN_HELP_COMPONENTS_BANNERS_CATEGORIES_EDIT="Bannières : Catégories - Nouvelle/Modifier"
COM_ADMIN_HELP_COMPONENTS_BANNERS_CLIENTS="Gestion des bannières : Clients"
COM_ADMIN_HELP_COMPONENTS_BANNERS_CLIENTS_EDIT="Bannières : Clients - Nouveau/Modifier"
COM_ADMIN_HELP_COMPONENTS_BANNERS_TRACKS="Bannières : Suivi"
COM_ADMIN_HELP_COMPONENTS_CONTACTS_CONTACTS="Contacts"
COM_ADMIN_HELP_COMPONENTS_CONTACTS_CONTACTS_EDIT="Contacts : Nouveau/Modifier"
COM_ADMIN_HELP_COMPONENTS_CONTACT_CATEGORIES="Contacts : Catégories"
COM_ADMIN_HELP_COMPONENTS_CONTACT_CATEGORIES_EDIT="Contacts : Catégories - Nouvelle/Modifier"
COM_ADMIN_HELP_COMPONENTS_CONTENT_CATEGORIES="Articles : Catégories"
COM_ADMIN_HELP_COMPONENTS_CONTENT_CATEGORIES_EDIT="Articles : Catégories - Nouvelle/Modifier"
COM_ADMIN_HELP_COMPONENTS_FIELDS_FIELDS="Champs"
COM_ADMIN_HELP_COMPONENTS_FIELDS_FIELDS_EDIT="Champs : Nouveau/Modifier"
COM_ADMIN_HELP_COMPONENTS_FIELDS_FIELD_GROUPS="Groupes de champs"
COM_ADMIN_HELP_COMPONENTS_FIELDS_FIELD_GROUPS_EDIT="Groupes de champs : Nouveau/Modifier"
COM_ADMIN_HELP_COMPONENTS_FINDER_MANAGE_CONTENT_MAPS="Recherche avancée : Plans de contenus"
COM_ADMIN_HELP_COMPONENTS_FINDER_MANAGE_INDEXED_CONTENT="Recherche avancée : Contenus indexés"
COM_ADMIN_HELP_COMPONENTS_FINDER_MANAGE_SEARCH_FILTERS_EDIT="Recherche avancée: Filtres - Nouveau/Modifier"
COM_ADMIN_HELP_COMPONENTS_FINDER_MANAGE_SEARCH_FILTERS="Recherche avancée : Filtres"
COM_ADMIN_HELP_COMPONENTS_JOOMLA_UPDATE="Mise à jour de Joomla!"
COM_ADMIN_HELP_COMPONENTS_MESSAGING_INBOX="Messagerie privée : Boîte de réception"
COM_ADMIN_HELP_COMPONENTS_MESSAGING_READ="Messagerie privée : Lire les messages"
COM_ADMIN_HELP_COMPONENTS_MESSAGING_WRITE="Messagerie privée : Écrire un message"
COM_ADMIN_HELP_COMPONENTS_NEWSFEEDS_CATEGORIES="Fils d'actualité : Catégories"
COM_ADMIN_HELP_COMPONENTS_NEWSFEEDS_CATEGORIES_EDIT="Fils d'actualité : Catégories - Nouvelle/Modifier"
COM_ADMIN_HELP_COMPONENTS_NEWSFEEDS_FEEDS="Fils d'actualité"
COM_ADMIN_HELP_COMPONENTS_NEWSFEEDS_FEEDS_EDIT="Fils d'actualité : Nouveau/Modifier"
COM_ADMIN_HELP_COMPONENTS_POST_INSTALLATION_MESSAGES="Messages de post-installation"
COM_ADMIN_HELP_COMPONENTS_PRIVACY_CAPABILITIES="Confidentialité : Support des extensions"
COM_ADMIN_HELP_COMPONENTS_PRIVACY_CONSENTS="Confidentialité : Consentements"
COM_ADMIN_HELP_COMPONENTS_PRIVACY_DASHBOARD="Confidentialité : Consentements"
COM_ADMIN_HELP_COMPONENTS_PRIVACY_REQUEST="Confidentialité : Examen de la demande d'informations"
COM_ADMIN_HELP_COMPONENTS_PRIVACY_REQUEST_EDIT="Confidentialité : Nouvelle demande d'informations"
COM_ADMIN_HELP_COMPONENTS_PRIVACY_REQUESTS="Confidentialité : Demande d'informations"
COM_ADMIN_HELP_COMPONENTS_REDIRECT_MANAGER="Redirections : Liens"
COM_ADMIN_HELP_COMPONENTS_REDIRECT_MANAGER_EDIT="Redirections : Liens - Nouveau/Modifier"
COM_ADMIN_HELP_COMPONENTS_SEARCH="Recherche"
COM_ADMIN_HELP_COMPONENTS_TAGS_MANAGER="Tags"
COM_ADMIN_HELP_COMPONENTS_TAGS_MANAGER_EDIT="Tags : Ajouter/Modifier"
COM_ADMIN_HELP_COMPONENTS_WEBLINKS_CATEGORIES="Liens web : Catégories"
COM_ADMIN_HELP_COMPONENTS_WEBLINKS_CATEGORIES_EDIT="Liens web : Catégories - Nouvelle/Modifier"
COM_ADMIN_HELP_COMPONENTS_WEBLINKS_LINKS="Liens web"
COM_ADMIN_HELP_COMPONENTS_WEBLINKS_LINKS_EDIT="Liens web : Nouveau/Modifier"
COM_ADMIN_HELP_CONTENT_ARTICLE_MANAGER="Articles"
COM_ADMIN_HELP_CONTENT_ARTICLE_MANAGER_EDIT="Articles : Nouveau/Modifier"
COM_ADMIN_HELP_CONTENT_FEATURED_ARTICLES="Articles : Articles en vedette"
COM_ADMIN_HELP_CONTENT_MEDIA_MANAGER="Médias"
COM_ADMIN_HELP_EXTENSIONS_EXTENSION_MANAGER_DATABASE="Extensions : Vérification de la base de données"
COM_ADMIN_HELP_EXTENSIONS_EXTENSION_MANAGER_DISCOVER="Extensions : Rechercher"
COM_ADMIN_HELP_EXTENSIONS_EXTENSION_MANAGER_INSTALL="Extensions : Installer"
COM_ADMIN_HELP_EXTENSIONS_EXTENSION_MANAGER_LANGUAGES="Extensions : Installer les langues accréditées"
COM_ADMIN_HELP_EXTENSIONS_EXTENSION_MANAGER_MANAGE="Extensions : Gérer"
COM_ADMIN_HELP_EXTENSIONS_EXTENSION_MANAGER_UPDATE="Extensions : Mettre à jour"
COM_ADMIN_HELP_EXTENSIONS_EXTENSION_MANAGER_WARNINGS="Extensions : Mises en garde"
COM_ADMIN_HELP_EXTENSIONS_LANGUAGE_MANAGER_CONTENT="Langues : Langues de contenu"
COM_ADMIN_HELP_EXTENSIONS_LANGUAGE_MANAGER_EDIT="Langues - Nouveau/Modifier"
COM_ADMIN_HELP_EXTENSIONS_LANGUAGE_MANAGER_INSTALLED="Langues : Langues installées"
COM_ADMIN_HELP_EXTENSIONS_LANGUAGE_MANAGER_OVERRIDES="Langues: Substitutions de traduction"
COM_ADMIN_HELP_EXTENSIONS_LANGUAGE_MANAGER_OVERRIDES_EDIT="Langues : Substitutions de traduction - Nouveau/Modifier"
COM_ADMIN_HELP_EXTENSIONS_MODULE_MANAGER="Modules"
COM_ADMIN_HELP_EXTENSIONS_MODULE_MANAGER_EDIT="Modules : Modifier"
COM_ADMIN_HELP_EXTENSIONS_PLUGIN_MANAGER="Plug-ins"
COM_ADMIN_HELP_EXTENSIONS_PLUGIN_MANAGER_EDIT="Plug-ins : Plug-ins - Nouveau/Modifier"
COM_ADMIN_HELP_EXTENSIONS_TEMPLATE_MANAGER_STYLES="Templates : Styles"
COM_ADMIN_HELP_EXTENSIONS_TEMPLATE_MANAGER_STYLES_EDIT="Templates : Styles - Modifier"
COM_ADMIN_HELP_EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES="Templates"
COM_ADMIN_HELP_EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES_EDIT="Templates : Modifier"
COM_ADMIN_HELP_EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES_EDIT_SOURCE="Templates : Source - Modifier"
COM_ADMIN_HELP_GLOSSARY="Glossaire"
COM_ADMIN_HELP_MENUS_MENU_ITEM_MANAGER="Éléments de menu"
COM_ADMIN_HELP_MENUS_MENU_ITEM_MANAGER_EDIT="Éléments de Menus - Nouveau/Modifier"
COM_ADMIN_HELP_MENUS_MENU_MANAGER="Menus"
COM_ADMIN_HELP_MENUS_MENU_MANAGER_EDIT="Menus - Nouveau/Modifier"
COM_ADMIN_HELP_SITE_GLOBAL_CONFIGURATION="Configuration"
COM_ADMIN_HELP_SITE_MAINTENANCE_CLEAR_CACHE="Cache : Vider le cache"
COM_ADMIN_HELP_SITE_MAINTENANCE_GLOBAL_CHECK-IN="Déverrouillage global"
COM_ADMIN_HELP_SITE_MAINTENANCE_PURGE_EXPIRED_CACHE="Cache : Purger les fichiers expirés"
COM_ADMIN_HELP_SITE_SYSTEM_INFORMATION="Informations système"
COM_ADMIN_HELP_START_HERE="Début"
COM_ADMIN_HELP_USERS_ACCESS_LEVELS="Utilisateurs : Niveaux d'accès"
COM_ADMIN_HELP_USERS_ACCESS_LEVELS_EDIT="Utilisateurs : Niveaux d'accès - Nouveau/Modifier"
COM_ADMIN_HELP_USERS_DEBUG_USER="Utilisateurs : débogage des permissions"
COM_ADMIN_HELP_USERS_GROUPS="Utilisateurs : Groupes"
COM_ADMIN_HELP_USERS_GROUPS_EDIT="Utilisateurs : Groupes - Nouveau/Modifier"
COM_ADMIN_HELP_USERS_MASS_MAIL_USERS="Envoi d'e-mail en nombre"
COM_ADMIN_HELP_USERS_USER_NOTES="Utilisateurs : Notes utilisateurs"
COM_ADMIN_HELP_USERS_USER_NOTES_EDIT="Utilisateurs : Notes utilisateurs - Nouveau/Modifier"
COM_ADMIN_HELP_USERS_USER_MANAGER="Utilisateurs : Utilisateurs"
COM_ADMIN_HELP_USERS_USER_MANAGER_EDIT="Utilisateurs : Utilisateurs - Nouveau/Modifier"
COM_ADMIN_ICONV_AVAILABLE="<strong>Iconv activé</strong> (conversion des chaînes) "
COM_ADMIN_INFORMATION="Informations système"
COM_ADMIN_JOOMLA_VERSION="Version de Joomla "
COM_ADMIN_LATEST_VERSION_CHECK="Vérification de la dernière version"
COM_ADMIN_LICENSE="Licence"
COM_ADMIN_LOG_DIRECTORY="(Répertoire journal)"
COM_ADMIN_MAGIC_QUOTES="<strong>Magic quotes</strong> (ajout antislash aux guillemets) "
COM_ADMIN_MAX_INPUT_VARS="<strong>Nombre maximum de champs de saisie</stong> (Maximum Input Variables)"
COM_ADMIN_MBSTRING_ENABLED="<strong>Mbstring actif</strong> (interprétation des chaînes) "
COM_ADMIN_MCRYPT_ENABLED="Mcrypt activé"
COM_ADMIN_NA="N/A"
COM_ADMIN_OPEN_BASEDIR="<strong>Open basedir</strong> (dossier limite d'arborescence) "
COM_ADMIN_OUTPUT_BUFFERING="<strong>Output Buffering</strong> (limitation du buffer de sortie) "
COM_ADMIN_PHP_BUILT_ON="PHP exécuté sur "
COM_ADMIN_PHP_INFORMATION="Informations PHP"
COM_ADMIN_PHP_SETTINGS="Paramètres PHP"
COM_ADMIN_PHP_VERSION="Version de PHP "
COM_ADMIN_PHPINFO_DISABLED="La fonction phpinfo() a été désactivée par votre hôte."
COM_ADMIN_PLATFORM_VERSION="Version de la plateforme Joomla!"
COM_ADMIN_POSTINSTALL_MSG_BEHIND_LOAD_BALANCER_ACTION="Activer le paramètre \"Derrière un répartiteur de charge\""
COM_ADMIN_POSTINSTALL_MSG_BEHIND_LOAD_BALANCER_DESCRIPTION="<p>Pour les sites Joomla hébergés derrière des répartiteurs de charge et des proxy inversés (reverse proxy), un nouveau paramètre de configuration a été introduit avec Joomla 3.9.26</p><p>Ce paramètre, lorsqu'il est activé, permettra à votre répartiteur de charge/proxy inverse de fournir l'adresse IP réelle de vos visiteurs. Cette IP sera ensuite utilisée dans vos journaux d'activité et utilisée pour le suivi des votes sur les articles (si ces fonctionnalités sont activées).</p><p><strong>Seuls les sites situés derrière un répartiteur de charge/proxy inverse souhaiteront activer cette fonction.</strong></p>"
COM_ADMIN_POSTINSTALL_MSG_BEHIND_LOAD_BALANCER_TITLE="Nouveau paramètre de serveur \"Derrière un répartiteur de charge\""
COM_ADMIN_POSTINSTALL_MSG_FLOC_BLOCKER_DESCRIPTION="<p>Une nouvelle technologie est actuellement déployée sur les navigateurs pour remplacer les cookies de suivi tiers. Cette technologie est nommée Federated Learning of Cohorts (FLoC), vous pouvez en savoir plus par la <a href=\\"https://wicg.github.io/floc/\\">Web Platform Incubator Community Group</a> et la <a href=\\"https://www.eff.org/deeplinks/2021/03/googles-floc-terrible-idea\\">Electronic Frontier Foundation</a>. À partir de Joomla! 3.9.27, votre site web bloque cette technologie mais vous pouvez la réactiver depuis la configuration globale. A noter que pour désactiver cette technologie pour toutes les requêtes adressées à votre serveur, vous devez mettre à jour votre .htaccess.</p>"
COM_ADMIN_POSTINSTALL_MSG_FLOC_BLOCKER_TITLE="Block Federated Learning of Cohorts (FLoC)"
COM_ADMIN_POSTINSTALL_MSG_HTACCESS_AUTOINDEX_DESCRIPTION="<p> Avant la version 3.9.22, le fichier htaccess.txt par défaut contenait un code erroné destiné à désactiver les listes de répertoires. L'équipe de sécurité recommande d'appliquer manuellement les modifications nécessaires à tout fichier .htaccess existant, car ce fichier ne peut pas être mis à jour automatiquement.</p><p>L'ancien code :</p><pre>&lt;IfModule autoindex&gt;\n  IndexIgnore *\n&lt;/IfModule&gt;</pre><p>Le nouveau code :</p><pre>&lt;IfModule mod_autoindex.c&gt;\n  IndexIgnore *\n&lt;/IfModule&gt;</pre>"
COM_ADMIN_POSTINSTALL_MSG_HTACCESS_AUTOINDEX_TITLE="Mise à jour de .htaccess concernant les listes de répertoires"
COM_ADMIN_REGISTER_GLOBALS="<strong>Register Globals</strong> (EGPCS variables globales) "
COM_ADMIN_RELEVANT_PHP_SETTINGS="Réglages utiles de PHP"
COM_ADMIN_SAFE_MODE="<strong>Safe Mode</strong> (mode de sécurité PHP) "
COM_ADMIN_SAVE_SUCCESS="Profil sauvegardé."
COM_ADMIN_SEARCH="Recherche"
COM_ADMIN_SESSION_AUTO_START="<strong>Session auto start</strong> (démarrer à chaque script) "
COM_ADMIN_SESSION_SAVE_PATH="<strong>Session Save Path</strong> (répertoire de sessions) "
COM_ADMIN_SETTING="Paramètres"
COM_ADMIN_SHORT_OPEN_TAGS="<strong>Short open tags</strong> (balises courtes d'ouverture) "
COM_ADMIN_START_HERE="Début"
COM_ADMIN_STATUS="Statut"
COM_ADMIN_SYSTEM_INFO="Infos système"
COM_ADMIN_SYSTEM_INFORMATION="Informations système"
COM_ADMIN_TEMP_DIRECTORY="(Répertoire temporaire)"
COM_ADMIN_UNWRITABLE="Lecture seule"
COM_ADMIN_USER_ACCOUNT_DETAILS="Détails de mon profil"
COM_ADMIN_USER_AGENT="Navigateur "
COM_ADMIN_USER_FIELD_BACKEND_LANGUAGE_DESC="Sélectionnez la langue d'administration pour cet utilisateur."
COM_ADMIN_USER_FIELD_BACKEND_LANGUAGE_LABEL="Langue 'Administration'"
COM_ADMIN_USER_FIELD_BACKEND_TEMPLATE_DESC="Sélectionnez le style du template d'administration pour cet utilisateur."
COM_ADMIN_USER_FIELD_BACKEND_TEMPLATE_LABEL="Style du template"
COM_ADMIN_USER_FIELD_EDITOR_DESC="Éditeur de contenu (texte, liens, médias, etc.) pour cet utilisateur."
COM_ADMIN_USER_FIELD_EDITOR_LABEL="Éditeur"
COM_ADMIN_USER_FIELD_EMAIL_DESC="Saisissez une adresse e-mail pour cet utilisateur."
COM_ADMIN_USER_FIELD_FRONTEND_LANGUAGE_DESC="Sélectionnez la langue du site pour cet utilisateur."
COM_ADMIN_USER_FIELD_FRONTEND_LANGUAGE_LABEL="Langue 'Site'"
; The following two strings are deprecated and will be removed with 4.0.
COM_ADMIN_USER_FIELD_HELPSITE_DESC="Site de l'aide intégrée pour cet utilisateur."
COM_ADMIN_USER_FIELD_HELPSITE_LABEL="Site d'aide"
COM_ADMIN_USER_FIELD_LASTVISIT_DESC="Date de la dernière visite de l'utilisateur."
COM_ADMIN_USER_FIELD_LASTVISIT_LABEL="Dernière visite"
COM_ADMIN_USER_FIELD_NAME_DESC="Saisissez le nom de description de l'utilisateur (en général le nom et prénom)."
COM_ADMIN_USER_FIELD_NOCHANGE_USERNAME_DESC="Si vous souhaitez changer votre identifiant (nom d'utilisateur), veuillez svp contacter un administrateur du site."
COM_ADMIN_USER_FIELD_PASSWORD1_MESSAGE="Les mots de passe que vous avez saisis ne correspondent pas. Veuillez saisir votre nouveau mot de passe dans le champ 'mot de passe' et le confirmer dans le champ de confirmation."
COM_ADMIN_USER_FIELD_PASSWORD2_DESC="Saisissez à nouveau pour vérification le mot de passe de connexion de l'utilisateur."
COM_ADMIN_USER_FIELD_PASSWORD2_LABEL="Confirmation"
COM_ADMIN_USER_FIELD_PASSWORD_DESC="Saisissez le mot de passe de connexion de l'utilisateur.<br />Attention : les majuscules et minuscules sont prises en compte."
COM_ADMIN_USER_FIELD_REGISTERDATE_DESC="Date d'inscription de l'utilisateur."
COM_ADMIN_USER_FIELD_REGISTERDATE_LABEL="Date d'inscription"
COM_ADMIN_USER_FIELD_TIMEZONE_DESC="Fuseau horaire de cet utilisateur."
COM_ADMIN_USER_FIELD_TIMEZONE_LABEL="Fuseau horaire"
COM_ADMIN_USER_FIELD_USERNAME_DESC="Saisissez l'identifiant de connexion de l'utilisateur.<br />Attention : les majuscules et minuscules sont prises en compte.<br />Information : l'identifiant est également utilisé pour signer les articles."
COM_ADMIN_USER_FIELD_USERNAME_LABEL="Identifiant"
COM_ADMIN_USER_HEADING_NAME="Nom"
COM_ADMIN_USER_SETTINGS_FIELDSET_LABEL="Paramètres de base"
COM_ADMIN_VALUE="Valeur"
COM_ADMIN_VIEW="Voir"
COM_ADMIN_VIEW_PROFILE_TITLE="Mon profil"
COM_ADMIN_WEBSERVER_TO_PHP_INTERFACE="Serveur web pour interface PHP "
COM_ADMIN_WEB_SERVER="Serveur web "
COM_ADMIN_WRITABLE="Modifiable"
COM_ADMIN_XML_DESCRIPTION="Composant d'administration - Informations système"
COM_ADMIN_XML_ENABLED="<strong>XML activé</strong> (lire et écrire les fichiers XML) "
COM_ADMIN_ZIP_ENABLED="Zip natif activé"
COM_ADMIN_ZLIB_ENABLED="<strong>Zlib activé</strong> (lire et écrire les fichiers gzip) "

; Messages
COM_USERS_MSG_NOT_ENOUGH_INTEGERS_N="Le mot de passe ne contient pas assez de chiffres. Il doit contenir au moins %s chiffres."
COM_USERS_MSG_NOT_ENOUGH_INTEGERS_N_1="Le mot de passe ne contient pas assez de chiffres. Il doit contenir au moins 1 chiffre."
COM_USERS_MSG_NOT_ENOUGH_LOWERCASE_LETTERS_N="Le mot de passe ne contient pas assez de minuscules. Il doit contenir au moins %s minuscules."
COM_USERS_MSG_NOT_ENOUGH_LOWERCASE_LETTERS_N_1="Le mot de passe ne contient pas assez de minuscules. Il doit contenir au moins 1 minuscule."
COM_USERS_MSG_NOT_ENOUGH_SYMBOLS_N="Le mot de passe ne contient pas assez de symboles (tels que !@#$) . Il doit contenir au moins %s symboles."
COM_USERS_MSG_NOT_ENOUGH_SYMBOLS_N_1="Le mot de passe ne contient pas assez de symboles (tels que !@#$). Il doit contenir au moins 1 symbole."
COM_USERS_MSG_NOT_ENOUGH_UPPERCASE_LETTERS_N="Le mot de passe ne contient pas assez de majuscules. Il doit contenir au moins %s majuscules."
COM_USERS_MSG_NOT_ENOUGH_UPPERCASE_LETTERS_N_1="Le mot de passe ne contient pas assez de majuscules. Il doit contenir au moins 1 majuscule."
COM_USERS_MSG_PASSWORD_TOO_LONG="Le mot de passe est trop long. Les mots de passe doivent contenir moins de 100 caractères."
COM_USERS_MSG_PASSWORD_TOO_SHORT_N="Le mot de passe est trop court. Les mots de passe doivent contenir au moins %s caractères."
COM_USERS_MSG_SPACES_IN_PASSWORD="Le mot de passe ne doit pas contenir d'espaces au début et à la fin."
language/fr-FR/fr-FR.plg_quickicon_joomlaupdate.ini000060400000003064152453623440016261 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_QUICKICON_JOOMLAUPDATE="Icône raccourci - Alerte de mises à jour Joomla"
PLG_QUICKICON_JOOMLAUPDATE_CHECKING="Vérification de version Joomla..."
PLG_QUICKICON_JOOMLAUPDATE_ERROR="Version inconnue de Joomla..."
PLG_QUICKICON_JOOMLAUPDATE_GROUP_DESC="Groupe de ce plug-in (comparé avec celui utilisée pour le module <strong>Icônes de raccourcis</strong> affichant les icônes de raccourcis sur la page d'accueil de l'aministration). Le groupe 'mod_quickicon' affiche toujours les icônes du noyau Joomla!"
PLG_QUICKICON_JOOMLAUPDATE_GROUP_LABEL="Groupe"
PLG_QUICKICON_JOOMLAUPDATE_UPDATEFOUND="Joomla <span class='label label-important'>%s</span>, Mettre à jour !"
PLG_QUICKICON_JOOMLAUPDATE_UPDATEFOUND_BUTTON="Mettre à jour"
PLG_QUICKICON_JOOMLAUPDATE_UPDATEFOUND_MESSAGE="Joomla <span class='label label-important'>%s</span> est disponible :"
PLG_QUICKICON_JOOMLAUPDATE_UPTODATE="Joomla! est à jour"
PLG_QUICKICON_JOOMLAUPDATE_XML_DESCRIPTION="Ce plug-in permet d'afficher une icône d'alerte sur la page d'accueil de l'administration lorsque une mise à jour de Joomla est disponible. Il doit être lié par son groupe au module d'administration 'Icones de raccourcis' qui doit être publié."
language/fr-FR/fr-FR.plg_fields_user.sys.ini000060400000001107152453623440014645 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_USER="Champs - Utilisateur"
PLG_FIELDS_USER_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'user' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_system_backuponupdate.sys.ini000060400000002366152453623440016762 0ustar00; Akeeba Backup - Backup on update plugin
; Copyright (c)2009-2016  Nicholas K. Dionysopoulos / AkeebaBackup.com
;
; 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 3 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, see <http://www.gnu.org/licenses/>.
;
PLG_SYSTEM_BACKUPONUPDATE_TITLE="Système - Sauvegarde avant mise à jour"
PLG_SYSTEM_BACKUPONUPDATE_DESCRIPTION="Akeeba Backup réalisera une sauvegarde complète du site avant de mettre à jour Joomla par le composant natif de mise à jour."

PLG_SYSTEM_BACKUPONUPDATE_PROFILE_LABEL="Profil de sauvegarde"
PLG_SYSTEM_BACKUPONUPDATE_PROFILE_DESC="Choisissez le profil de sauvegarde qui sera utilisé pour créer une sauvegarde complète du site avant de mettre à jour Joomla! par le composant natif de mise à jour."
language/fr-FR/fr-FR.plg_editors-xtd_menu.ini000060400000001217152453623440015020 0ustar00; @date        2016-10-27
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_EDITORS-XTD_MENU="Bouton - Menu"
PLG_EDITORS-XTD_MENU_BUTTON_MENU="Menu"
PLG_EDITORS-XTD_MENU_XML_DESCRIPTION="Affiche un bouton sous l'éditeur pour insérer dans un contenu un élément de menu.<br />Ouvre une fenêtre pop-up permettant de choisir l'élément de menu."
language/fr-FR/fr-FR.com_search.ini000060400000005764152453623440013002 0ustar00; @date        2015-07-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_SEARCH="Recherche"
COM_SEARCH_ALL_WORDS="Tous les mots"
COM_SEARCH_ALPHABETICAL="Alphabétique"
COM_SEARCH_ANY_WORDS="N'importe quel mot"
COM_SEARCH_CONFIG_FIELD_CREATED_DATE_DESC="Afficher la date de création des éléments listés."
COM_SEARCH_CONFIG_FIELD_CREATED_DATE_LABEL="Date de création"
COM_SEARCH_CONFIG_GATHER_SEARCH_STATISTICS_DESC="Enregistrer les phrases saisies par les visiteurs."
COM_SEARCH_CONFIG_GATHER_SEARCH_STATISTICS_LABEL="Recueillir les statistiques des recherches"
COM_SEARCH_CONFIG_FIELD_OPENSEARCH_NAME_LABEL="Nom OpenSearch"
COM_SEARCH_CONFIG_FIELD_OPENSEARCH_NAME_DESC="Le nom affiché pour ce site comme moteur de recherche."
COM_SEARCH_CONFIG_FIELD_OPENSEARCH_DESCRIPTON_LABEL="Description OpenSearch"
COM_SEARCH_CONFIG_FIELD_OPENSEARCH_DESCRIPTON_DESC="La description affichée pour ce site comme moteur de recherche."
COM_SEARCH_CONFIGURATION="Recherche : Paramètres"
COM_SEARCH_EXACT_PHRASE="Phrase exacte"
COM_SEARCH_FIELD_DESC="Mot, mots ou phrases à rechercher"
COM_SEARCH_FIELD_LABEL="Terme recherché (optionnel)"
COM_SEARCH_FIELD_SEARCH_PHRASES_DESC="Afficher les options de recherche"
COM_SEARCH_FIELD_SEARCH_PHRASES_LABEL="Utiliser les options de recherche"
COM_SEARCH_FIELD_SEARCH_AREAS_DESC="Afficher les champs pour affiner la recherche."
COM_SEARCH_FIELD_SEARCH_AREAS_LABEL="Champs de recherche"
COM_SEARCH_FIELDSET_OPTIONAL_LABEL="Terme optionnel de recherche "
COM_SEARCH_FIELDSET_SEARCH_OPTIONS_LABEL="Recherche"
COM_SEARCH_FOR_DESC="Le type de recherche"
COM_SEARCH_FOR_LABEL="Rechercher"
COM_SEARCH_HEADING_PHRASE="Rechercher la phrase"
COM_SEARCH_HEADING_SEARCH_TERM_ASC="Terme de recherche ascendant"
COM_SEARCH_HEADING_SEARCH_TERM_DESC="Terme de recherche descendant"
COM_SEARCH_HEADING_RESULTS="Résultats"
COM_SEARCH_HIDE_SEARCH_RESULTS="Cacher les résultats de recherche"
COM_SEARCH_LOGGING_DISABLED="Collecte des statistiques désactivée. Activer la dans les paramètres"
COM_SEARCH_LOGGING_ENABLED="Collecte des statistiques activée"
COM_SEARCH_MANAGER_SEARCHES="Recherche : Analyse des critères"
COM_SEARCH_MOST_POPULAR="Les plus populaires"
COM_SEARCH_NEWEST_FIRST="Le plus récent en premier"
COM_SEARCH_NO_RESULTS="Désactivé"
COM_SEARCH_OLDEST_FIRST="Le plus ancien en premier"
COM_SEARCH_ORDERING_DESC="Définit de quelle façon les résultats de recherche sont classés."
COM_SEARCH_ORDERING_LABEL="Classement des résultats"
COM_SEARCH_SAVED_SEARCH_OPTIONS="Paramètres de sauvegarde des recherches"
COM_SEARCH_SEARCH_IN_PHRASE="Recherche selon les critères."
COM_SEARCH_SHOW_SEARCH_RESULTS="Afficher les résultats de recherche"
COM_SEARCH_XML_DESCRIPTION="Composant utilisé pour les recherches"
language/fr-FR/fr-FR.plg_fields_textarea.ini000060400000002762152453623440014677 0ustar00; @date        2017-01-20
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_TEXTAREA="Champs - Zone de texte"
PLG_FIELDS_TEXTAREA_LABEL="Zone de texte (%s)"
PLG_FIELDS_TEXTAREA_PARAMS_COLS_DESC="La largeur de la zone de texte visible en caractères. En cas d’omission, la largeur est déterminée par le navigateur. La valeur ne limite pas le nombre de caractères qui peuvent être saisis.  "
PLG_FIELDS_TEXTAREA_PARAMS_COLS_LABEL="Colonnes"
PLG_FIELDS_TEXTAREA_PARAMS_FILTER_DESC="Permet au système de sauvegarder certaines balises html ou data brute."
PLG_FIELDS_TEXTAREA_PARAMS_FILTER_LABEL="Filtre"
PLG_FIELDS_TEXTAREA_PARAMS_MAXLENGTH_LABEL="Longueur maximum"
PLG_FIELDS_TEXTAREA_PARAMS_MAXLENGTH_DESC="Le nombre maximum de caractères à insérer."
PLG_FIELDS_TEXTAREA_PARAMS_ROWS_DESC="La haiteur de la zone de texte visible en lignes. En cas d’omission, la hauteur est déterminée par le navigateur. La valeur ne limite pas le nombre de lignes qui peuvent être saisies. "
PLG_FIELDS_TEXTAREA_PARAMS_ROWS_LABEL="Lignes"
PLG_FIELDS_TEXTAREA_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'textarea' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_fields_checkboxes.ini000060400000001631152453623440015172 0ustar00; @date        2017-01-19
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_FIELDS_CHECKBOXES="Champs - Cases à cocher"
PLG_FIELDS_CHECKBOXES_LABEL="Cases à cocher (%s)"
PLG_FIELDS_CHECKBOXES_PARAMS_OPTIONS_DESC="Les valeurs des cases à cocher."
PLG_FIELDS_CHECKBOXES_PARAMS_OPTIONS_LABEL="Valeurs de la case à cocher"
PLG_FIELDS_CHECKBOXES_PARAMS_OPTIONS_VALUE_LABEL="Valeur"
PLG_FIELDS_CHECKBOXES_PARAMS_OPTIONS_NAME_LABEL="Texte"
PLG_FIELDS_CHECKBOXES_XML_DESCRIPTION="Ce plugin permet de créer de nouveaux champs de type 'checkboxes' dans les extensions où les champs personnalisés sont implémentés."
language/fr-FR/fr-FR.plg_finder_content.sys.ini000060400000001543152453623440015346 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8 - No BOM


PLG_FINDER_CONTENT="Indexation - Articles"
PLG_FINDER_CONTENT_ERROR_ACTIVATING_PLUGIN="Impossible d'activer automatiquement le plug-in 'Indexation - Articles'. Veuillez l'activer manuellement."
PLG_FINDER_CONTENT_XML_DESCRIPTION="Ce plug-in met à jour les index des articles de Joomla! pour la recherche avancée quand un article est créé, modifié ou effacé. NOTE : Le plug-in 'Contenu - Indexation de recherche' doit être activé."
PLG_FINDER_STATISTICS_ARTICLE="Article"
language/fr-FR/fr-FR.plg_captcha_recaptcha.sys.ini000060400000001757152453623440015771 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_CAPTCHA_RECAPTCHA_XML_DESCRIPTION="Le plug-in CAPTCHA utilise le service reCAPTCHA de protection contre les spammeurs tout en aidant à la numérisation des livres, des journaux et des émissions anciennes de radio. Pour obtenir une clé de site et une clé secrète pour votre domaine, se rendre à <a href='https://www.google.com/recaptcha' target='_blank'>https://www.google.com/recaptcha</a>. <br />Pour utiliser ce service quand un utilisateur crée un nouveau compte, se rendre dans Gestion des utilisateurs->Paramètres et sélectionner CAPTCHA - reCAPTCHA comme CAPTCHA."
PLG_CAPTCHA_RECAPTCHA="CAPTCHA - ReCAPTCHA"
language/fr-FR/fr-FR.com_newsfeeds.sys.ini000060400000003175152453623440014327 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_NEWSFEEDS="Fils d'actualité"
COM_NEWSFEEDS_CATEGORIES="Catégories"
COM_NEWSFEEDS_CATEGORIES_VIEW_DEFAULT_DESC="Afficher tous les fils d'actualité d'une catégorie"
COM_NEWSFEEDS_CATEGORIES_VIEW_DEFAULT_OPTION="Défaut"
COM_NEWSFEEDS_CATEGORIES_VIEW_DEFAULT_TITLE="Liste des catégories de fils d'actualité"
COM_NEWSFEEDS_CATEGORY_ADD_TITLE="Fils d'actualité : Ajouter une catégorie"
COM_NEWSFEEDS_CATEGORY_EDIT_TITLE="Fils d'actualité : Modifier une catégorie"
COM_NEWSFEEDS_CATEGORY_VIEW_DEFAULT_DESC="Afficher tous les fils d'actualité d'une catégorie"
COM_NEWSFEEDS_CATEGORY_VIEW_DEFAULT_OPTION="Défaut"
COM_NEWSFEEDS_CATEGORY_VIEW_DEFAULT_TITLE="Liste des fils d'actualité d'une catégorie"
COM_NEWSFEEDS_CONTENT_TYPE_NEWSFEED="Fil d'actualité"
COM_NEWSFEEDS_CONTENT_TYPE_CATEGORY="Catégorie de fils d'actualité"
COM_NEWSFEEDS_FEEDS="Fils d'actualité"
COM_NEWSFEEDS_NEWSFEED_VIEW_DEFAULT_DESC="Afficher un fil d'actualité"
COM_NEWSFEEDS_NEWSFEED_VIEW_DEFAULT_OPTION="Défaut"
COM_NEWSFEEDS_NEWSFEED_VIEW_DEFAULT_TITLE="Fil d'actualité"
COM_NEWSFEEDS_TAGS_NEWSFEED="Fil d'actualité"
COM_NEWSFEEDS_TAGS_CATEGORY="Catégorie de fils d'actualité"
COM_NEWSFEEDS_XML_DESCRIPTION="Composant de gestion des fils d'actualité provenant de flux RSS, RDF ou ATOM."
language/fr-FR/fr-FR.plg_authentication_ldap.ini000060400000007623152453623440015554 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_AUTHENTICATION_LDAP="Authentification - LDAP"
PLG_LDAP_FIELD_AUTHMETHOD_DESC="Méthode d'autorisation pour valider les identifiants."
PLG_LDAP_FIELD_AUTHMETHOD_LABEL="Méthode d'autorisation"
PLG_LDAP_FIELD_BASEDN_DESC="DN de base de votre serveur LDAP (exemple : o=mon-domaine.com)."
PLG_LDAP_FIELD_BASEDN_LABEL="DN de base"
PLG_LDAP_FIELD_EMAIL_DESC="Attribut LDAP qui contient l'adresse e-mail des utilisateurs."
PLG_LDAP_FIELD_EMAIL_LABEL="Map: E-mail"
PLG_LDAP_FIELD_FULLNAME_DESC="Attribut LDAP qui contient le nom complet des utilisateurs"
PLG_LDAP_FIELD_FULLNAME_LABEL="Map: Nom complet"
PLG_LDAP_FIELD_IGNORE_REQCERT_TLS_DESC="Ignore le certificat du serveur lorsqu'activé. Cela est utile pour exécuter par exemple Samba 4 avec un certificat auto-signé."
PLG_LDAP_FIELD_IGNORE_REQCERT_TLS_LABEL="Ignorer le certificat"
PLG_LDAP_FIELD_HOST_DESC="Par exemple : openldap.mon-entreprise.org"
PLG_LDAP_FIELD_HOST_LABEL="Hôte"
PLG_LDAP_FIELD_LDAPDEBUG_DESC="Active le débogage codé en dur au niveau 7"
PLG_LDAP_FIELD_LDAPDEBUG_LABEL="Déboguer"
PLG_LDAP_FIELD_NEGOCIATE_DESC="Négocier le cryptage TLS avec le serveur LDAP.<br />Tous les flux de données avec le serveur doivent être cryptés."
PLG_LDAP_FIELD_NEGOCIATE_LABEL="Négocier TLS"
PLG_LDAP_FIELD_PASSWORD_DESC="Mot de passe de connexion définis pour la recherche dans l'annuaire.<br />Selon la méthode d'autorisation définie plus haut."
PLG_LDAP_FIELD_PASSWORD_LABEL="Mot de passe"
PLG_LDAP_FIELD_PORT_DESC="Le port à utiliser par défaut est 389."
PLG_LDAP_FIELD_PORT_LABEL="Port"
PLG_LDAP_FIELD_REFERRALS_DESC="Activé/Désactivé l'option définissant la valeur du LDAP_OPT_REFERRALS flag.<br />Cette option doit être désactivée sur serveur Windows 2003."
PLG_LDAP_FIELD_REFERRALS_LABEL="Suivre le renvoi"
PLG_LDAP_FIELD_SEARCHSTRING_DESC="Chaîne de caractères utilisée pour rechercher un utilisateur.<br />Le mot-clé [search] est dynamiquement remplacé par l'identifiant utilisateur.<br />Exemple : uid=[search].<br />Plusieurs chaînes peuvent être utilisées, séparées par des points-virgules."
PLG_LDAP_FIELD_SEARCHSTRING_LABEL="Requête de recherche"
PLG_LDAP_FIELD_UID_DESC="Attribut LDAP qui contient les identifiants de connexion des utilisateurs.<br />Pour 'Active Directory', il s'agit de 'sAMAccountName'"
PLG_LDAP_FIELD_UID_LABEL="Map : ID utilisateur"
PLG_LDAP_FIELD_USERNAME_DESC="Identifiant de connexion définis pour la recherche dans l'annuaire.<br />Deux options sont disponibles :<br />- la recherche DN anonyme, laissez alors les champs vides ;<br />- la connexion administrative, identifiant et mot de passe."
PLG_LDAP_FIELD_USERNAME_LABEL="Identifiant"
PLG_LDAP_FIELD_USERSDN_DESC="Nom d'utilisateur d'un compte d'administration, exemple : Administrateur.<br />Le mot-clé [username] est dynamiquement remplacé par l'identifiant utilisateur.<br />Exemple : uid=[username], dc=my-domain, dc=com.<br />Plusieurs chaînes peuvent être utilisées en les séparant par des points-virgules. Uniquement utilisé pour un lien direct."
PLG_LDAP_FIELD_USERSDN_LABEL="Nom d'utilisateur"
PLG_LDAP_FIELD_V3_DESC="Par défaut la version 2 de LDAP, mais les dernières versions de OpenLdap imposent aux clients d'utiliser la version 3 de LDAP"
PLG_LDAP_FIELD_V3_LABEL="LDAP V3"
PLG_LDAP_FIELD_VALUE_BINDSEARCH="Attache et cherche"
PLG_LDAP_FIELD_VALUE_BINDUSER="Attache directement comme utilisateur"
PLG_LDAP_XML_DESCRIPTION="Authentification des utilisateurs auprès d'un serveur LDAP.<br />Attention, vous devez laisser au moins un plug-in d'authentification activé pour vous connecter sur le site !"
language/fr-FR/fr-FR.com_users.ini000060400000077054152453623440012677 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2022 Open Source Matters, Inc. (https://www.joomla.org)
; @copyright   (C) 2005 - 2022 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


COM_USERS="Utilisateurs"
COM_USERS_ACTIONS_AVAILABLE="Actions autorisées"
COM_USERS_ACTIVATED="Activé"
COM_USERS_ADD_NOTE="Ajouter une note"
COM_USERS_ASSIGNED_GROUPS="Attribuer cet utilisateur à un ou plusieurs groupes"
COM_USERS_BATCH_ADD="Ajouter à un groupe"
COM_USERS_BATCH_DELETE="Supprimer du groupe"
COM_USERS_BATCH_GROUP="Sélectionnez le groupe"
COM_USERS_BATCH_OPTIONS="Traitement par lots des utilisateurs sélectionnés"
COM_USERS_BATCH_SET="Définir pour le groupe"
COM_USERS_CATEGORIES_TITLE="Notes d'utilisateur : Catégories"
COM_USERS_CATEGORY_HEADING="Catégorie"
COM_USERS_CONFIG_DOMAIN_OPTIONS="Paramètres de domaine d'e-mail"
COM_USERS_CONFIG_FIELD_ALLOWREGISTRATION_DESC="Activer/Désactiver la possibilité pour un visiteur de créer un compte depuis l'interface frontale du site."
COM_USERS_CONFIG_FIELD_ALLOWREGISTRATION_LABEL="Autoriser l'inscription des utilisateurs "
COM_USERS_CONFIG_FIELD_CAPTCHA_DESC="Sélectionnez le plug-in captcha à utiliser dans le formulaire d'inscription, de récupération de mot de passe et d'identifiant.<br />Il est possible que vous deviez spécifier les informations requises pour votre plug-in captcha dans le gestionnaire des plug-ins de Joomla.<br />Si 'Paramètres Globaux' est sélectionné, assurez-vous qu'un plug-in captcha est sélectionné dans la configuration globale de Joomla."
COM_USERS_CONFIG_FIELD_CAPTCHA_LABEL="Captcha"
COM_USERS_CONFIG_FIELD_CHANGEUSERNAME_DESC="Autoriser les utilisateurs à changer leur identifiant dans l'édition de leur profil."
COM_USERS_CONFIG_FIELD_CHANGEUSERNAME_LABEL="Changement d'identifiant"
COM_USERS_CONFIG_FIELD_DOMAIN_NAME_DESC="Saisir le nom d'un domaine. Les jokers (*) sont pris en charge. Par exemple&nbsp;:<br /><strong>*</strong> autorise ou non tous les domaines;<br /><strong>*.com</strong> autorise ou non tous les ' .com' domains;<br /><strong>*.joomla.org</strong> autorise ou non tous les sous-domaines de 'joomla.org'."
COM_USERS_CONFIG_FIELD_DOMAIN_NAME_LABEL="Nom de domaine"
COM_USERS_CONFIG_FIELD_DOMAIN_RULE_DESC="Autoriser ou non le domaine."
COM_USERS_CONFIG_FIELD_DOMAIN_RULE_LABEL="Règle"
COM_USERS_CONFIG_FIELD_DOMAIN_RULE_OPTION_ALLOW="Autoriser"
COM_USERS_CONFIG_FIELD_DOMAIN_RULE_OPTION_DISALLOW="Ne pas autoriser"
COM_USERS_CONFIG_FIELD_DOMAINS_DESC="Entrez une liste des domaines d'e-mail autorisés et non autorisés. Par défaut, tous les domaines sont autorisés."
COM_USERS_CONFIG_FIELD_DOMAINS_LABEL="Domaine d'e-mail"
COM_USERS_CONFIG_FIELD_FRONTEND_LANG_DESC="Afficher/Masquer le choix de la langue du site au moment de l'inscription et, dans les paramètres du profil si 'Paramètres dans le profil' est activé.<br />Ce choix est pertinent dans le cas d'un site multilingue."
COM_USERS_CONFIG_FIELD_FRONTEND_LANG_LABEL="Langue du site"
COM_USERS_CONFIG_FIELD_FRONTEND_RESET_COUNT_DESC="Nombre maximum autorisé de réinitialisations de mot de passe durant le délai indiqué. 0 signifie aucune limite."
COM_USERS_CONFIG_FIELD_FRONTEND_RESET_COUNT_LABEL="Nombre de réinitialisations"
COM_USERS_CONFIG_FIELD_FRONTEND_RESET_TIME_DESC="Durée en heures pour la remise à zéro du compteur."
COM_USERS_CONFIG_FIELD_FRONTEND_RESET_TIME_LABEL="Durée du compteur"
COM_USERS_CONFIG_FIELD_FRONTEND_USERPARAMS_DESC="Afficher/Masquer les paramètres système (langue, éditeur, site d'aide) dans le profil utilisateur en interface frontale du site."
COM_USERS_CONFIG_FIELD_FRONTEND_USERPARAMS_LABEL="Paramètres dans le profil"
COM_USERS_CONFIG_FIELD_GUEST_USER_GROUP_DESC="Groupe par défaut auquel les visiteurs non authentifiés sont attribués."
COM_USERS_CONFIG_FIELD_GUEST_USER_GROUP_LABEL="Groupe des visiteurs "
COM_USERS_CONFIG_FIELD_MAILBODY_SUFFIX_DESC="Ce contenu est ajouté après le texte de chaque message.<br />Exemple : signature, adresse, etc."
COM_USERS_CONFIG_FIELD_MAILBODY_SUFFIX_LABEL="Suffixe du message"
COM_USERS_CONFIG_FIELD_MAILTOADMIN_DESC="Envoyer un e-mail de notification aux administrateurs lors de la création d'un nouveau compte même si l'activation des comptes est définie sur 'Aucun' ou 'Auto'."
COM_USERS_CONFIG_FIELD_MAILTOADMIN_LABEL="Envoyer un e-mail aux administrateurs"
COM_USERS_CONFIG_FIELD_MINIMUM_INTEGERS="Nombre minimum de chiffres"
COM_USERS_CONFIG_FIELD_MINIMUM_INTEGERS_DESC="Définir le nombre minimum de chiffres à inclure dans le mot de passe."
COM_USERS_CONFIG_FIELD_MINIMUM_LOWERCASE="Nombre minimum de minuscules"
COM_USERS_CONFIG_FIELD_MINIMUM_LOWERCASE_DESC="Définissez le nombre minimal de minuscules alphabétiques requis à inclure dans le mot de passe."
COM_USERS_CONFIG_FIELD_MINIMUM_PASSWORD_LENGTH="Longueur minimum"
COM_USERS_CONFIG_FIELD_MINIMUM_PASSWORD_LENGTH_DESC="Définir la longueur minimum du mot de passe."
COM_USERS_CONFIG_FIELD_MINIMUM_SYMBOLS="Nombre minimum de symboles"
COM_USERS_CONFIG_FIELD_MINIMUM_SYMBOLS_DESC="Définir le nombre minimum de symboles (tels que !@#$) à inclure dans le mot de passe."
COM_USERS_CONFIG_FIELD_MINIMUM_UPPERCASE="Nombre minimum de majuscules"
COM_USERS_CONFIG_FIELD_MINIMUM_UPPERCASE_DESC="Définir le nombre minimum de majuscules alphabétiques à inclure dans le mot de passe."
COM_USERS_CONFIG_FIELD_NEW_USER_TYPE_DESC="Groupe auquel sont attribués les nouveaux inscrits."
COM_USERS_CONFIG_FIELD_NEW_USER_TYPE_LABEL="Groupe des inscrits"
COM_USERS_CONFIG_FIELD_NOTES_HISTORY="Paramètres des versions"
COM_USERS_CONFIG_FIELD_SENDPASSWORD_LABEL="Inclure mot de passe"
COM_USERS_CONFIG_FIELD_SENDPASSWORD_DESC="Si 'Oui' est coché, le mot de passe initial de l'utilisateur sera inclus dans le mail envoyé lors de l'inscription."
COM_USERS_CONFIG_FIELD_SUBJECT_PREFIX_DESC="Ce préfixe est ajouté devant le sujet de chaque message."
COM_USERS_CONFIG_FIELD_SUBJECT_PREFIX_LABEL="Préfixe de l'objet"
COM_USERS_CONFIG_FIELD_USERACTIVATION_DESC="<strong>Aucun :</strong> le nouvel inscrit est enregistré sans confirmation de la demande.<br /><strong>Auto activation :</strong> l'utilisateur reçoit un e-mail de confirmation de la demande d'inscription avec un lien sur lequel il doit cliquer pour activer son compte avant de se connecter.<br /><strong>Administrateur :</strong> l'utilisateur reçoit un e-mail de confirmation de la demande d'inscription avec un lien sur lequel il doit cliquer pour la valider. Puis, un message est envoyé aux utilisateurs des groupes ayant droit de création de compte en administration du site pour qu'ils activent ce compte."
COM_USERS_CONFIG_FIELD_USERACTIVATION_LABEL="Activation des comptes "
COM_USERS_CONFIG_FIELD_USERACTIVATION_OPTION_ADMINACTIVATION="Administrateur"
COM_USERS_CONFIG_FIELD_USERACTIVATION_OPTION_SELFACTIVATION="Auto activation"
COM_USERS_CONFIG_IMPORT_FAILED="Erreur lors de l'importation des paramètres : %s."
COM_USERS_CONFIG_INTEGRATION_SETTINGS_DESC="Ces paramètres déterminent la façon dont le composant utilisateurs s'intégrera aux autres extensions."
COM_USERS_CONFIG_PASSWORD_OPTIONS="Paramètres de mot de passe"
COM_USERS_CONFIG_SAVE_FAILED="Erreur lors de l'enregistrement des paramètres : %s."
COM_USERS_CONFIG_USER_OPTIONS="Paramètres d'utilisateur"
COM_USERS_CONFIGURATION="Utilisateurs : Paramètres"
COM_USERS_COUNT_ENABLED_USERS="Utilisateurs activés"
COM_USERS_COUNT_DISABLED_USERS="Utilisateurs désactivés"
COM_USERS_DEBUG_DESC="Afficher les rapports des droits avancés."
COM_USERS_DEBUG_EXPLICIT_ALLOW="Autorisé"
COM_USERS_DEBUG_EXPLICIT_DENY="Interdit"
COM_USERS_DEBUG_GROUP="Rapport des droits avancés"
COM_USERS_DEBUG_GROUPS_LABEL="Droits avancés des groupes"
COM_USERS_DEBUG_GROUPS_DESC="Afficher les rapports des droits avancés des groupes."
COM_USERS_DEBUG_IMPLICIT_DENY="Non autorisé"
COM_USERS_DEBUG_LABEL="Avancé"
COM_USERS_DEBUG_LEGEND="Légende:"
COM_USERS_DEBUG_USER="Rapport des droits avancés"
COM_USERS_DEBUG_USERS_LABEL="Droits avancés des utilisateurs"
COM_USERS_DEBUG_USERS_DESC="Afficher les rapports des droits avancés des utilisateurs."
COM_USERS_DELETE_ERROR_INVALID_GROUP="Vous ne pouvez supprimer le groupe utilisateurs auquel vous appartenez."
COM_USERS_DESIRED_PASSWORD="Saisir le mot de passe désiré."
COM_USERS_EDIT_NOTE="Modifier la note"
COM_USERS_EDIT_NOTE_N="Modifier la note ID #%d"
COM_USERS_EDIT_USER="Modifier l'utilisateur %s"
COM_USERS_EMPTY_REVIEW="-"
COM_USERS_EMPTY_SUBJECT="- Aucun sujet -"
COM_USERS_ERROR_CANNOT_BATCH_SUPERUSER="Opération non autorisée quand l'utilisateur n'est pas de type Super Utilisateur."
COM_USERS_ERROR_INVALID_GROUP="Groupe invalide"
COM_USERS_ERROR_LEVELS_NOLEVELS_SELECTED="Aucun niveau d'accès sélectionné."
COM_USERS_ERROR_NO_ADDITIONS="L'utilisateur ou les utilisateurs sélectionnés sont déjà affectés au groupe sélectionné."
COM_USERS_ERROR_VIEW_LEVEL_IN_USE="Vous ne pouvez supprimer ce niveau d'accès '%d:%s' parce qu'il est utilisé pour l'affichage de la page."
COM_USERS_ERROR_SECRET_CODE_WITHOUT_TFA="Vous avez saisi un code secret mais l'authentification en deux étapes n'est pas activée dans votre compte utilisateur. Si vous désirez utiliser un code secret pour sécuriser votre connexion, merci de modifier votre profil utilisateur et activer l'authentification en deux étapes."
COM_USERS_FIELD_CATEGORY_ID_LABEL="Catégorie"
COM_USERS_FIELD_ID_LABEL="Id"
COM_USERS_FIELD_LOGIN_MENUITEM="Lien de menu"
COM_USERS_FIELD_LOGIN_REDIRECT_PLACEHOLDER="index.php?Itemid=999&lang=fr-FR"
COM_USERS_FIELD_LOGIN_REDIRECT_CHOICE_DESC="'URL interne' permet de soumettre n'importe quelle URL interne dans le champ de redirection. 'Lien de menu' permet de sélectionner directement un lien de menu existant.<br />Il est recommandé d'utiliser 'Lien de menu' pour un site multilingue."
COM_USERS_FIELD_LOGIN_REDIRECT_CHOICE_LABEL="Choix du type de redirection après connexion"
COM_USERS_FIELD_LOGIN_REDIRECT_ERROR="Seul un des champs de redirection après connexion doit avoir une valeur."
COM_USERS_FIELD_LOGIN_REDIRECTMENU_DESC="Sélectionnez ou créez le lien de menu correspondant à la page vers laquelle vous souhaitez rediriger l'utilisateur après sa connexion sur le site. La valeur par défaut redirigera vers la même page."
COM_USERS_FIELD_LOGIN_REDIRECTMENU_LABEL="Redirection de connexion par lien de menu"
COM_USERS_FIELD_LOGIN_URL="URL interne"
COM_USERS_FIELD_LOGOUT_REDIRECT_CHOICE_DESC="'URL interne' permet de soumettre n'importe quelle URL interne dans le champ de redirection. 'Lien de menu' permet de sélectionner directement un lien de menu existant.<br />Il est recommandé d'utiliser 'Lien de menu' pour un site multilingue."
COM_USERS_FIELD_LOGOUT_REDIRECT_CHOICE_LABEL="Choix du type de redirection après déconnexion"
COM_USERS_FIELD_LOGOUT_REDIRECT_ERROR="Seul un des champs de redirection après déconnexion doit avoir une valeur."
COM_USERS_FIELD_LOGOUT_REDIRECTMENU_DESC="Sélectionnez ou créez le lien de menu correspondant à la page vers laquelle vous souhaitez rediriger l'utilisateur après sa déconnexion du site. La valeur par défaut redirigera vers la même page."
COM_USERS_FIELD_LOGOUT_REDIRECTMENU_LABEL="Redirection de déconnexion par lien de menu"
COM_USERS_FIELD_NOTEBODY_DESC="Contenu de la note."
COM_USERS_FIELD_NOTEBODY_LABEL="Note"
COM_USERS_FIELD_REVIEW_TIME_DESC="Cette date, spécifiée manuellement, est une indication qui peut être utilisée pour votre gestion des utilisateurs.<br />Vous pouvez par exemple spécifier la date de la dernière modification du statut de l'utilisateur ou de la prochaine modification à effectuer."
COM_USERS_FIELD_REVIEW_TIME_LABEL="Date de révision"
COM_USERS_FIELD_STATE_DESC="Définir le statut de publication."
COM_USERS_FIELD_SUBJECT_DESC="Sujet de la  note."
COM_USERS_FIELD_SUBJECT_LABEL="Sujet"
COM_USERS_FIELD_USER_ID_LABEL="Id de l'utilisateur"
COM_USERS_FIELDS_USER_FIELDS_TITLE="Utilisateurs : Champs"
COM_USERS_FIELDS_USER_FIELD_ADD_TITLE="Utilisateurs : Nouveau champ"
COM_USERS_FIELDS_USER_FIELD_EDIT_TITLE="Utilisateurs : Modifier le champ"
COM_USERS_FILTER_ACTIVE="- Sélectionner l'état d'activation -"
COM_USERS_FILTER_COMPONENT_LABEL="Composant"
COM_USERS_FILTER_COMPONENT_DESC="Composant à déboguer."
COM_USERS_FILTER_LABEL="Filtrer des utilisateurs par: "
COM_USERS_FILTER_LEVEL_END_LABEL="Niveau final"
COM_USERS_FILTER_LEVEL_END_DESC="Niveau final de l'attribut."
COM_USERS_FILTER_LEVEL_START_LABEL="Niveau initial"
COM_USERS_FILTER_LEVEL_START_DESC="Niveau initial de l'attribut."
COM_USERS_FILTER_NOTES="Voir la liste des notes sur cet utilisateur"
COM_USERS_FILTER_STATE="Sélectionner l'état d'actif -"
COM_USERS_FILTER_USER_GROUP="Filtre d'un groupe utilisateur"
COM_USERS_FILTER_USERGROUP="- Sélectionner un groupe -"
COM_USERS_GROUP_FIELD_PARENT_DESC="Choisissez un groupe parent pour ce groupe."
COM_USERS_GROUP_FIELD_PARENT_LABEL="Groupe parent"
COM_USERS_GROUP_FIELD_TITLE_DESC="Saisissez un titre pour ce groupe."
COM_USERS_GROUP_FIELD_TITLE_LABEL="Titre du groupe"
COM_USERS_GROUP_SAVE_SUCCESS="Groupe enregistré correctement"
COM_USERS_GROUPS_CONFIRM_DELETE="Êtes-vous certain de vouloir supprimer des groupes comprenant des utilisateurs ?"
COM_USERS_GROUPS_N_ITEMS_DELETED="%d groupes utilisateurs supprimés"
COM_USERS_GROUPS_N_ITEMS_DELETED_1="Un groupe d'utilisateur supprimé."
COM_USERS_GROUPS_NO_ITEM_SELECTED="Pas de groupe utilisateur sélectionné"
COM_USERS_HEADING_ACTIVATED="Activé"
COM_USERS_HEADING_ACTIVATED_ASC="Activé ascendant"
COM_USERS_HEADING_ACTIVATED_DESC="Activé descendant"
COM_USERS_HEADING_ASSET_NAME="Nom de l'attribut"
COM_USERS_HEADING_ASSET_NAME_ASC="Nom d'attribut ascendant"
COM_USERS_HEADING_ASSET_NAME_DESC="Nom d'attribut descendant"
COM_USERS_HEADING_ASSET_TITLE="Titre de l'attribut"
COM_USERS_HEADING_ASSET_TITLE_ASC="Titre d'attribut ascendant"
COM_USERS_HEADING_ASSET_TITLE_DESC="Titre d'attribut descendant"
COM_USERS_HEADING_CATEGORY="Catégorie"
COM_USERS_HEADING_CATEGORY_ASC="Catégorie ascendant"
COM_USERS_HEADING_CATEGORY_DESC="Catégorie descendant"
COM_USERS_HEADING_EMAIL_ASC="E-mail ascendant"
COM_USERS_HEADING_EMAIL_DESC="E-mail descendant"
COM_USERS_HEADING_ENABLED="Actif"
COM_USERS_HEADING_ENABLED_ASC="Actif ascendant"
COM_USERS_HEADING_ENABLED_DESC="Actif descendant"
COM_USERS_HEADING_GROUP_TITLE="Titre du groupe"
COM_USERS_HEADING_GROUP_TITLE_ASC="Titre du groupe ascendant"
COM_USERS_HEADING_GROUP_TITLE_DESC="Titre du groupe descendant"
COM_USERS_HEADING_GROUPS="Groupes utilisateurs"
COM_USERS_HEADING_LAST_VISIT_DATE="Dernière visite"
COM_USERS_HEADING_LAST_VISIT_DATE_ASC="Dernière visite ascendant"
COM_USERS_HEADING_LAST_VISIT_DATE_DESC="Dernière visite descendant"
COM_USERS_HEADING_LEVEL_NAME="Nom du niveau"
COM_USERS_HEADING_LEVEL_NAME_ASC="Nom du niveau ascendant"
COM_USERS_HEADING_LEVEL_NAME_DESC="Nom du niveau descendant"
COM_USERS_HEADING_LFT="LFT"
COM_USERS_HEADING_LFT_ASC="LFT ascendant"
COM_USERS_HEADING_LFT_DESC="LFT descendant"
COM_USERS_HEADING_NAME="Nom"
COM_USERS_HEADING_NAME_ASC="Nom ascendant"
COM_USERS_HEADING_NAME_DESC="Nom descendant"
COM_USERS_HEADING_REGISTRATION_DATE="Date d'inscription"
COM_USERS_HEADING_REGISTRATION_DATE_ASC="Date d'inscription ascendant"
COM_USERS_HEADING_REGISTRATION_DATE_DESC="Date d'inscription descendant"
COM_USERS_HEADING_REVIEW="Date de révision"
COM_USERS_HEADING_REVIEW_ASC="Date de révision ascendant"
COM_USERS_HEADING_REVIEW_DESC="Date de révision descendant"
COM_USERS_HEADING_SUBJECT="Sujet"
COM_USERS_HEADING_SUBJECT_ASC="Sujet ascendant"
COM_USERS_HEADING_SUBJECT_DESC="Sujet descendant"
COM_USERS_HEADING_USER="Utilisateur"
COM_USERS_HEADING_USER_ASC="Utilisateur ascendant"
COM_USERS_HEADING_USER_DESC="Utilisateur descendant"
COM_USERS_HEADING_USERNAME_ASC="Identifiant ascendant"
COM_USERS_HEADING_USERNAME_DESC="Identifiant descendant"
COM_USERS_HEADING_USERS_IN_GROUP="Utilisateurs dans le groupe"
COM_USERS_LEVEL_DETAILS="Détails sur le niveau d'accès"
COM_USERS_LEVEL_FIELD_TITLE_DESC="Saisissez un titre pour le niveau d'accès."
COM_USERS_LEVEL_FIELD_TITLE_LABEL="Titre du niveau d'accès"
COM_USERS_LEVEL_HEADER_ERROR="Erreur dans l'en-tête du niveau d'accès"
COM_USERS_LEVEL_SAVE_SUCCESS="Niveau d'accès enregistré"
COM_USERS_LEVELS_N_ITEMS_DELETED="%d Niveau d'autorisation supprimé"
COM_USERS_LEVELS_N_ITEMS_DELETED_1="Un niveau d'autorisation supprimé"
COM_USERS_MAIL_DETAILS="Détails"
COM_USERS_MAIL_EMAIL_SENT_TO_N_USERS="E-mail envoyé à %s utilisateurs"
COM_USERS_MAIL_EMAIL_SENT_TO_N_USERS_1="E-mail envoyé à un utilisateur"
COM_USERS_MAIL_FIELD_EMAIL_DISABLED_USERS_DESC="Si la case est cochée, les utilisateurs désactivés seront inclus lors de l'envoi de mails."
COM_USERS_MAIL_FIELD_EMAIL_DISABLED_USERS_LABEL="Envoyer aux utilisateurs désactivés"
COM_USERS_MAIL_FIELD_GROUP_DESC="Choisissez le groupe auquel l'e-mail est adressé."
COM_USERS_MAIL_FIELD_GROUP_LABEL="Groupe :"
COM_USERS_MAIL_FIELD_MESSAGE_DESC="Saisir un message par défaut."
COM_USERS_MAIL_FIELD_MESSAGE_LABEL="Message"
COM_USERS_MAIL_FIELD_RECURSE_DESC="Si la case est cochée, l'e-mail va être envoyé aux utilisateurs membres de tous les groupes enfants des groupes sélectionnés."
COM_USERS_MAIL_FIELD_RECURSE_LABEL="Envoyer aux groupes utilisateurs enfants"
COM_USERS_MAIL_FIELD_SEND_AS_BLIND_CARBON_COPY_DESC="Cache la liste des destinataires et utilise l'adresse e-mail du site dans le champ To:"
COM_USERS_MAIL_FIELD_SEND_AS_BLIND_CARBON_COPY_LABEL="Destinataires en copie cachée (BCC)"
COM_USERS_MAIL_FIELD_SEND_IN_HTML_MODE_DESC="Si la case est cochée, l'e-mail sera envoyé avec les balises HTML. Sinon l'e-mail sera envoyé en mode texte."
COM_USERS_MAIL_FIELD_SEND_IN_HTML_MODE_LABEL="Envoyer en HTML"
COM_USERS_MAIL_FIELD_SUBJECT_DESC="Saisissez l'objet de l'e-mail."
COM_USERS_MAIL_FIELD_SUBJECT_LABEL="Objet"
COM_USERS_MAIL_FIELD_VALUE_ALL_USERS_GROUPS="Tous les groupes utilisateurs"
COM_USERS_MAIL_MESSAGE="Message"
COM_USERS_MAIL_NO_USERS_COULD_BE_FOUND_IN_THIS_GROUP="Aucun utilisateur trouvé dans ce groupe."
COM_USERS_MAIL_ONLY_YOU_COULD_BE_FOUND_IN_THIS_GROUP="Vous êtes le seul utilisateur dans ce groupe."
COM_USERS_MAIL_PLEASE_FILL_IN_THE_FORM_CORRECTLY="Remplir le formulaire correctement."
COM_USERS_MAIL_PLEASE_FILL_IN_THE_MESSAGE="Veuillez compléter le message !"
COM_USERS_MAIL_PLEASE_FILL_IN_THE_SUBJECT="Veuillez compléter l'objet !"
COM_USERS_MAIL_PLEASE_SELECT_A_GROUP="Veuillez choisir un groupe !"
COM_USERS_MAIL_THE_MAIL_COULD_NOT_BE_SENT="Cet e-mail ne peut être envoyé."
COM_USERS_MASS_MAIL="Envoi d'e-mails en nombre"
COM_USERS_MASS_MAIL_DESC="Paramètres de l'envoi d'e-mail en nombre"
COM_USERS_MSG_NOT_ENOUGH_INTEGERS_N="Le mot de passe ne contient pas assez de chiffres. Il doit contenir au moins %s chiffres."
COM_USERS_MSG_NOT_ENOUGH_INTEGERS_N_1="Le mot de passe ne contient pas assez de chiffres. Il doit contenir au moins 1 chiffre."
COM_USERS_MSG_NOT_ENOUGH_LOWERCASE_LETTERS_N="Le mot de passe ne contient pas assez de minuscules. Il doit contenir au moins %s minuscules."
COM_USERS_MSG_NOT_ENOUGH_LOWERCASE_LETTERS_N_1="Le mot de passe ne contient pas assez de minuscules. Il doit contenir au moins 1 minuscule."
COM_USERS_MSG_NOT_ENOUGH_SYMBOLS_N="Le mot de passe ne contient pas assez de symboles (tels que !@#$). Il doit contenir au moins %s symboles."
COM_USERS_MSG_NOT_ENOUGH_SYMBOLS_N_1="Le mot de passe ne contient pas assez de symboles (tels que !@#$). Il doit contenir au moins 1 symbole."
COM_USERS_MSG_NOT_ENOUGH_UPPERCASE_LETTERS_N="Le mot de passe ne contient pas assez de majuscules. Il doit contenir au moins %s majuscules."
COM_USERS_MSG_NOT_ENOUGH_UPPERCASE_LETTERS_N_1="Le mot de passe ne contient pas assez de majuscules. Il doit contenir au moins 1 majuscule."
COM_USERS_MSG_PASSWORD_TOO_LONG="Le mot de passe est trop long. Les mots de passe doivent contenir moins de 100 caractères."
COM_USERS_MSG_PASSWORD_TOO_SHORT_N="Le mot de passe est trop court. Les mots de passe doivent contenir au moins %s caractères."
COM_USERS_MSG_SPACES_IN_PASSWORD="Le mot de passe ne doit pas contenir d'espaces au début et à la fin."
COM_USERS_N_LEVELS_DELETED="%d Niveaux d'accès à supprimer."
COM_USERS_N_LEVELS_DELETED_0="Aucun niveau d'accès supprimé."
COM_USERS_N_LEVELS_DELETED_1="%d niveaux d'accès supprimés."
COM_USERS_N_USER_NOTES="%d notes"
COM_USERS_N_USER_NOTES_1="%d note"
COM_USERS_N_USER_NOTES_0="Aucune note"
COM_USERS_N_USERS_ACTIVATED="%s utilisateurs activés"
COM_USERS_N_USERS_ACTIVATED_0="aucun utilisateur activé"
COM_USERS_N_USERS_ACTIVATED_1="Utilisateur activé"
COM_USERS_N_USERS_BLOCKED="%s utilisateurs bloqués"
COM_USERS_N_USERS_BLOCKED_0="Aucun utilisateur bloqué"
COM_USERS_N_USERS_BLOCKED_1="Utilisateur bloqué"
COM_USERS_N_USERS_UNBLOCKED="%s Utilisateurs actifs"
COM_USERS_N_USERS_UNBLOCKED_0="Aucun utilisateur actif"
COM_USERS_N_USERS_UNBLOCKED_1="Utilisateur actif"
COM_USERS_NEW_NOTE="Nouvelle note"
COM_USERS_NO_ACTION="Aucune action"
COM_USERS_NO_NOTES="Aucune note n'est disponible pour cet utilisateur."
COM_USERS_NO_LEVELS_SELECTED="Aucun niveau d'accès sélectionné"
COM_USERS_NOTE_N_SUBJECT="#%d %s"
COM_USERS_NOTES="Notes d'utilisateur: Nouveau/Modifier"
COM_USERS_NOTES_FOR_USER="Notes sur l'utilisateur %s (ID #%d)"
COM_USERS_NOTES_N_ITEMS_ARCHIVED="%d notes archivées."
COM_USERS_NOTES_N_ITEMS_ARCHIVED_1="%d note archivée."
COM_USERS_NOTES_N_ITEMS_CHECKED_IN="%d notes sélectionnées."
COM_USERS_NOTES_N_ITEMS_CHECKED_IN_1="%d note sélectionnée."
COM_USERS_NOTES_N_ITEMS_DELETED="%d notes supprimées."
COM_USERS_NOTES_N_ITEMS_DELETED_1="%d note supprimée."
COM_USERS_NOTES_N_ITEMS_PUBLISHED="%d notes publiées."
COM_USERS_NOTES_N_ITEMS_PUBLISHED_1="%d note publiée."
COM_USERS_NOTES_N_ITEMS_TRASHED="%d notes mises dans la corbeille."
COM_USERS_NOTES_N_ITEMS_TRASHED_1="%d note mise dans la corbeille."
COM_USERS_NOTES_N_ITEMS_UNPUBLISHED="%d notes dépubliées."
COM_USERS_NOTES_N_ITEMS_UNPUBLISHED_1="%d note dépubliée."
COM_USERS_OPTION_FILTER_DATE="- Sélectionner une date d'inscription -"
COM_USERS_OPTION_FILTER_LAST_VISIT_DATE="- Sélectionner la dernière visite -"
COM_USERS_OPTION_RANGE_NEVER="Jamais"
COM_USERS_OPTION_RANGE_PAST_1MONTH="Le dernier mois"
COM_USERS_OPTION_RANGE_PAST_3MONTH="Les trois derniers mois"
COM_USERS_OPTION_RANGE_PAST_6MONTH="Les six derniers mois"
COM_USERS_OPTION_RANGE_PAST_WEEK="La dernière semaine"
COM_USERS_OPTION_RANGE_PAST_YEAR="La dernière année"
COM_USERS_OPTION_RANGE_POST_YEAR="Plus d'une année"
COM_USERS_OPTION_RANGE_TODAY="Aujourd'hui"
COM_USERS_OPTION_LEVEL_CATEGORY="%d (Catégorie principale)"
COM_USERS_OPTION_LEVEL_COMPONENT="%d (composant)"
COM_USERS_OPTION_LEVEL_DEEPER="%d (plus détaillé)"
COM_USERS_OPTION_SELECT_COMPONENT="- Choisir un composant -"
COM_USERS_OPTION_SELECT_LEVEL_END="- Choisir le niveau final -"
COM_USERS_OPTION_SELECT_LEVEL_START="- Choisir le niveau initial -"
COM_USERS_PASSWORD_RESET_REQUIRED="Réinitialisation du mot de passe requise"
COM_USERS_REQUIRE_PASSWORD_RESET="Forcer la réinitialisation du mot de passe"
COM_USERS_REVIEW_HEADING="Date de révision"
COM_USERS_SEARCH_ACCESS_LEVELS="Recherche dans les niveaux d'accès"
COM_USERS_SEARCH_ASSETS="Recherche dans les attributs"
COM_USERS_SEARCH_GROUPS_LABEL="Recherche dans les groupes utilisateurs"
COM_USERS_SEARCH_IN_GROUPS="Recherche dans le titre d'un groupe. Préfixe avec ID: recherche l'ID d'un groupe"
COM_USERS_SEARCH_IN_NAME="Recherche dans le nom, l'identifiant ou l'e-mail. Préfixe avec ID: recherche l'ID d'un utilisateur"
COM_USERS_SEARCH_IN_NOTE_TITLE="Recherche dans le sujet, le nom ou l'identifiant. Préfixe avec ID: recherche l'ID d'une note ou d'un utilisateur."
COM_USERS_SEARCH_IN_LEVEL_NAME="Recherche sur nom de niveau. Préfixe avec ID: recherche l'ID d'un niveau d'accès"
COM_USERS_SEARCH_IN_ASSETS="Recherche dans l'attribut ou le titre"
COM_USERS_SEARCH_TITLE_LEVELS="Recherche de niveaux d'accès"
COM_USERS_SEARCH_USER_NOTES="Recherche dans les notes d'utilisateurs"
COM_USERS_SEARCH_USERS="Recherche dans les utilisateurs"
COM_USERS_SETTINGS_FIELDSET_LABEL="Paramètres de base"
COM_USERS_SUBMENU_GROUPS="Groupes utilisateurs"
COM_USERS_SUBMENU_LEVELS="Niveaux d'accès"
COM_USERS_SUBMENU_NOTES="Notes utilisateurs"
COM_USERS_SUBMENU_NOTE_CATEGORIES="Catégories des notes"
COM_USERS_SUBMENU_USERS="Utilisateurs"
COM_USERS_SUBJECT_HEADING="Sujet"
COM_USERS_TOOLBAR_ACTIVATE="Activer"
COM_USERS_TOOLBAR_BLOCK="Bloquer"
COM_USERS_TOOLBAR_MAIL_SEND_MAIL="Envoyer l'e-mail"
COM_USERS_TOOLBAR_UNBLOCK="Débloquer"
COM_USERS_UNACTIVATED="Désactivé"
COM_USERS_USER_ACCOUNT_DETAILS="Détails du compte utilisateur"
COM_USERS_USER_BATCH_FAILED="Erreur pendant l'exécution du batch : %s."
COM_USERS_USER_BATCH_SUCCESS="Exécution du batch terminée."
COM_USERS_USER_FIELD_BACKEND_LANGUAGE_DESC="Choisissez la langue de l'interface d'administration à appliquer à cet utilisateur."
COM_USERS_USER_FIELD_BACKEND_LANGUAGE_LABEL="Langue Administration"
COM_USERS_USER_FIELD_BACKEND_TEMPLATE_DESC="Choisissez le template de l'interface d'administration à appliquer pour cet utilisateur."
COM_USERS_USER_FIELD_BACKEND_TEMPLATE_LABEL="Template Administration"
COM_USERS_USER_FIELD_BLOCK="Bloqué"
COM_USERS_USER_FIELD_BLOCK_DESC="Activer/Désactiver le blocage de cet utilisateur."
COM_USERS_USER_FIELD_BLOCK_LABEL="Statut de l'utilisateur"
COM_USERS_USER_FIELD_EDITOR_DESC="Éditeur de contenus défini pour cet utilisateur."
COM_USERS_USER_FIELD_EDITOR_LABEL="Éditeur de contenu"
COM_USERS_USER_FIELD_EMAIL_DESC="Saisissez une adresse e-mail pour cet utilisateur."
COM_USERS_USER_FIELD_ENABLE="Activé"
COM_USERS_USER_FIELD_FRONTEND_LANGUAGE_DESC="Choisissez la langue de l'interface frontale du site à appliquer à cet utilisateur."
COM_USERS_USER_FIELD_FRONTEND_LANGUAGE_LABEL="Langue du site"
; The following two strings are deprecated and will be removed with 4.0.
COM_USERS_USER_FIELD_HELPSITE_DESC="Choisissez le site d'aide accessible pour cet utilisateur."
COM_USERS_USER_FIELD_HELPSITE_LABEL="Site d'aide"
COM_USERS_USER_FIELD_LASTRESET_DESC="Date et heure de la dernière réinitialisation."
COM_USERS_USER_FIELD_LASTRESET_LABEL="Dernière réinitialisation"
COM_USERS_USER_FIELD_LASTVISIT_DESC="Date de la dernière visite de l'utilisateur."
COM_USERS_USER_FIELD_LASTVISIT_LABEL="Dernière visite"
COM_USERS_USER_FIELD_NAME_DESC="Saisissez le nom de l'utilisateur."
COM_USERS_USER_FIELD_NAME_LABEL="Nom"
COM_USERS_USER_FIELD_PASSWORD1_MESSAGE="Les mots de passes que vous avez saisis ne correspondent pas. Veuillez saisir votre mot de passe dans le champ de mot de passe et confirmez votre saisie dans le champ de confirmation du mot de passe."
COM_USERS_USER_FIELD_PASSWORD2_DESC="Confirmer le mot de passe de l'utilisateur"
COM_USERS_USER_FIELD_PASSWORD2_LABEL="Confirmation"
COM_USERS_USER_FIELD_PASSWORD_DESC="Saisissez le mot de passe de l'utilisateur."
COM_USERS_USER_FIELD_REGISTERDATE_DESC="Date d'inscription de l'utilisateur."
COM_USERS_USER_FIELD_REGISTERDATE_LABEL="Date d'inscription"
COM_USERS_USER_FIELD_REQUIRERESET_DESC="Si cette option est activée, l'utilisateur devra réinitialiser son mot de passe à sa prochaine connexion."
COM_USERS_USER_FIELD_REQUIRERESET_LABEL="Forcer la réinitialisation du mot de passe"
COM_USERS_USER_FIELD_RESETCOUNT_DESC="Nombre de réinitialisations de mot de passe depuis la date de dernière remise à zéro du compteur."
COM_USERS_USER_FIELD_RESETCOUNT_LABEL="Réinitialisations de mot de passe"
COM_USERS_USER_FIELD_SENDEMAIL_DESC="Activer/Désactiver la notification par e-mail des messages système de Joomla! ou d'extensions."
COM_USERS_USER_FIELD_SENDEMAIL_LABEL="Notification système"
COM_USERS_USER_FIELD_TIMEZONE_DESC="Choisissez le fuseau horaire à appliquer à cet utilisateur."
COM_USERS_USER_FIELD_TIMEZONE_LABEL="Fuseau horaire"
COM_USERS_USER_FIELD_TWOFACTOR_LABEL="Méthode d'authentification"
COM_USERS_USER_FIELD_TWOFACTOR_DESC="Choisir la méthode d'authentification en deux étapes désirée à activer sur le compte utilisateur."
COM_USERS_USER_FIELD_USERNAME_DESC="Saisissez l'identifiant de l'utilisateur."
COM_USERS_USER_FIELD_USERNAME_LABEL="Identifiant"
COM_USERS_USER_GROUPS_HAVING_ACCESS="Groupes utilisateurs avec niveau d'accès"
COM_USERS_USER_HEADING="Utilisateur"
COM_USERS_USER_OTEPS="Mots de passe d'urgence à utilisation unique"
COM_USERS_USER_OTEPS_DESC="Si vous n'avez pas accès à votre matériel d'authentification en deux étapes, il vous est possible d'utiliser un quelconque des mots de passe suivants au lieu d'un code de sécurité régulier. Chacun de ces mots de passe d'urgence sera immédiatement détruit après utilisation. Il est recommandé d'imprimer ces mots de passe et de garder ces copies dans un endroit sécurisé et accessible, portefeuille ou coffre."
COM_USERS_USER_OTEPS_WAIT_DESC="Il n'y a pas de mots de passe d'urgence à utilisation unique généré dans votre compte. Les mots de passe seront automatiquement générés et affichés ici dès que l'authentification en deux étapes sera activée."
COM_USERS_USER_SAVE_FAILED="Erreur lors de l'enregistrement des données utilisateur : %s."
COM_USERS_USER_SAVE_SUCCESS="Données utilisateur enregistrées."
COM_USERS_USER_TWO_FACTOR_AUTH="Authentification en deux étapes"
COM_USERS_USERGROUP_DETAILS="Détails du groupe utilisateur"
COM_USERS_USERS_ERROR_CANNOT_BLOCK_SELF="Vous ne pouvez pas vous bloquer vous-même !"
COM_USERS_USERS_ERROR_CANNOT_EDIT_OWN_GROUP="Il n'est pas possible de modifier vos propres groupes d'utilisateurs. La sauvegarde des groupes d'utilisateurs a été ignorée."
COM_USERS_USERS_ERROR_CANNOT_DELETE_SELF="Vous ne pouvez pas vous supprimer vous-même !"
COM_USERS_USERS_ERROR_CANNOT_DEMOTE_SELF="Vous ne pouvez pas supprimer vos propres droits de Super Utilisateur."
COM_USERS_USERS_ERROR_CANNOT_REQUIRERESET_SELF="Il n'est pas possible de demander une réinitialisation de mot de passe pour soi même."
COM_USERS_USERS_ERROR_CANNOT_SAVE_ACCOUNT_WITHOUT_GROUPS="Vous ne pouvez pas enregistrer un compte d'utilisateur sans sélectionner au moins un groupe d'utilisateurs."
COM_USERS_USERS_MULTIPLE_GROUPS="Groupes Multiples"
COM_USERS_USERS_N_ITEMS_DELETED="%d utilisateurs supprimés"
COM_USERS_USERS_N_ITEMS_DELETED_1="Utilisateur supprimé"
COM_USERS_USERS_NO_ITEM_SELECTED="Aucun utilisateur sélectionné"
COM_USERS_VIEW_DEBUG_GROUP_TITLE="Rapport des droits avancés pour le groupe #%d, %s"
COM_USERS_VIEW_DEBUG_USER_TITLE="Rapport des droits avancés pour l'utilisateur #%d, %s"
COM_USERS_VIEW_EDIT_GROUP_TITLE="Utilisateurs : Modifier le groupe"
COM_USERS_VIEW_EDIT_LEVEL_TITLE="Utilisateurs : Modifier le niveau d'accès"
COM_USERS_VIEW_EDIT_PROFILE_TITLE="Utilisateurs : Modifier le profil"
COM_USERS_VIEW_EDIT_USER_TITLE="Utilisateurs : Modifier"
COM_USERS_VIEW_GROUPS_TITLE="Utilisateurs : Groupes"
COM_USERS_VIEW_LEVELS_TITLE="Utilisateurs : Niveaux d'accès"
COM_USERS_VIEW_NEW_GROUP_TITLE="Utilisateurs : Ajouter un nouveau groupe"
COM_USERS_VIEW_NEW_LEVEL_TITLE="Utilisateurs : Ajouter un niveau d'accès"
COM_USERS_VIEW_NEW_USER_TITLE="Utilisateurs : Ajouter un utilisateur"
COM_USERS_VIEW_NOTES_TITLE="Notes utilisateurs"
COM_USERS_VIEW_USERS_TITLE="Utilisateurs"
COM_USERS_XML_DESCRIPTION="Composant pour gérer les utilisateurs"

; Alternate language strings for the rules form field
JLIB_RULES_SETTING_NOTES_COM_USERS="Les modification ne s'appliquent qu'à ce composant.<br /><em><strong>Hérité</strong></em> - les droits globaux ou ceux des groupes parents seront utilisés.<br/><em><strong>Refusé</strong></em> - prévaut toujours, quels que soient les droits globaux ou ceux des groupes parents, et s'applique aux éléments enfants.<br /><em><strong>Autorisé</strong></em> - le groupe concerné pourra effectuer cette action dans ce composant sauf si les droits globaux sont différents."

; Categories overrides
COM_CATEGORIES_CATEGORY_ADD_TITLE="Notes d'utilisateur : Ajouter une catégorie"
COM_CATEGORIES_CATEGORY_EDIT_TITLE="Notes d'utilisateur : Modifier une catégorie"
language/fr-FR/fr-FR.plg_content_jce.ini000060400000000614152453623440014021 0ustar00; JCE Project
; Copyright (C) 2006 - 2025 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; GNU/GPL Version 2 or later - https://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - www.sarki.ch
; Note : All ini files need to be saved as UTF-8

PLG_CONTENT_JCE="Contenu - JCE"
PLG_CONTENT_JCE_XML_DESCRIPTION="Plugin de contenu JCE"
language/fr-FR/fr-FR.plg_editors-xtd_pagebreak.ini000060400000001346152453623440016000 0ustar00; @date        2015-10-22
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8

PLG_EDITORS-XTD_PAGEBREAK="Bouton - Saut de page"
PLG_EDITORSXTD_PAGEBREAK_BUTTON_PAGEBREAK="Saut de page"
PLG_EDITORSXTD_PAGEBREAK_XML_DESCRIPTION="Affiche un bouton sous l'éditeur pour insérer un saut de page (pagebreak) permettant de diviser un article en plusieurs pages. Une fenêtre popup s'ouvre pour indiquer le titre de la page et du lien dans l'index."language/fr-FR/fr-FR.plg_system_cache.ini000060400000002765152453623440014206 0ustar00; @date        2015-01-31
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_CACHE_FIELD_BROWSERCACHE_DESC="Activer/Désactiver le stockage des pages dans le cache du navigateur."
PLG_CACHE_FIELD_BROWSERCACHE_LABEL="Cache du navigateur"
PLG_CACHE_FIELD_EXCLUDE_DESC="Spécifier quelles URLs vous souhaitez exclure de la mise en cache, chacune sur une ligne distincte. Les expressions régulières sont prises en charge, cad <br /><strong>about\-[a-z]+</strong>  - exclura toutes les URLs contenant 'about-', par exemple 'about-us', 'about-me', 'about-joomla', etc.<br /><strong>/component/users/</strong> - exclura toutes les URLs contenant '/component/users/'.<br /><strong>com_users</strong> - exclura toutes les pages du composant 'Users'."
PLG_CACHE_FIELD_EXCLUDE_LABEL="URLs à exclure"
PLG_CACHE_FIELD_EXCLUDE_MENU_ITEMS_DESC="Sélectionnez les liens de menu que vous souhaitez exclure de la mise en cache."
PLG_CACHE_FIELD_EXCLUDE_MENU_ITEMS_LABEL="Liens de menu à exclure"
PLG_CACHE_FIELD_LIFETIME_DESC="Durée de vie du cache en minutes"
PLG_CACHE_FIELD_LIFETIME_LABEL="Durée de vie du cache"
PLG_CACHE_XML_DESCRIPTION="Fonctionnalité de mise en cache des pages"
PLG_SYSTEM_CACHE="Système - Cache de page"
language/fr-FR/plg_system_jcemediabox.sys.ini000060400000003042152453623440015304 0ustar00; JCE Project
; Copyright (C) 2006 - 2026 Ryan Demmer. All rights reserved - https://www.joomlacontenteditor.net
; Licence : GNU/GPL Version 2 - http://www.gnu.org/licenses/gpl-2.0.html
; Coordination traduction FR : Mihàly Marti alias Sarki - https://www.sarki.ch/jce
; Note : All ini files need to be saved as UTF-8 - No BOM

PLG_SYSTEM_JCEMEDIABOX="Système - JCE MediaBox 2"
PLG_SYSTEM_JCEMEDIABOX_XML_DESC="<h3>Plugin JCE MediaBox, complément de l'éditeur JCE pour Joomla!</h3><p>JCE MediaBox permet d'afficher des médias (image, flash, flv, quicktime, vmw, avi, mpg, divx, youtube, etc.) et des contenus en popup de styles personnalisables.</p><p>JCE MediaBox permet également d'insérer des infobulles sur du texte ou des médias.</p><p>Présentation et modes d'emploi en anglais sur le site de l'auteur de JCE, Ryan Demmer : <a href='https://www.joomlacontenteditor.net/support/tutorials/jcemediabox' target='_blank' title='Site officiel'>https://www.joomlacontenteditor.net/support/tutorials/jcemediabox</a><br />Suivi de mise à jour : <a href='https://www.joomlacontenteditor.net/support/changelog/mediabox' target='_blank' title='Mises à jour'>https://www.joomlacontenteditor.net/support/changelog/mediabox</a></p><p>Traduction FR, présentation et forum en français par Sarki : <a href='https://www.sarki.ch/jce' target='_blank'>www.sarki.ch/jce</a></p><h3>Vous devez <a href='index.php?option=com_plugins&view=plugins&filter[search]=mediabox&search=mediabox' title='Publish'><strong>publier le plugin </strong></a>pour le rendre fonctionnel !</h3>"
language/fr-FR/fr-FR.plg_system_sessiongc.sys.ini000060400000001142152453623440015741 0ustar00; @date        2018-02-27
; @author      Joomla! Project
; @copyright   (C) 2005 - 2021 Open Source Matters. All rights reserved.
; @copyright   (C) 2005 - 2021 Joomla.fr [Traduction]
; @license     GNU General Public License version 2 or later; see LICENSE.txt
; @note        Complete
; @note        Client Administrator
; @note        All ini files need to be saved as UTF-8


PLG_SYSTEM_SESSIONGC="Système - Purge des données de session"
PLG_SYSTEM_SESSIONGC_XML_DESCRIPTION="Purge les données et les métadonnées expirées en fonction du gestionnaire de session défini dans la configuration globale."
language/pt-BR/pt-BR.com_acymailing.sys.ini000060400000001347152453623440014500 0ustar00COM_ACYMAILING="AcyMailing"
ACYMAILING="AcyMailing"
COM_ACYMAILING_CONFIGURATION="AcyMailing"
USERS="Usuários"
LISTS="Gestão de Listas"
TEMPLATES="Temas"
NEWSLETTERS="Newsletters"
AUTONEWSLETTERS="Smart-Newsletters"
CAMPAIGN="Campanha"
QUEUE="Fila de Emails"
STATISTICS="Estatísticas"
CONFIGURATION="Configuração"
UPDATE_ABOUT="Atualizações / Sobre"
COM_ACYMAILING_ARCHIVE_VIEW_DEFAULT_TITLE="Lista de arquivos de Mailing(único)"
COM_ACYMAILING_FRONTSUBSCRIBER_VIEW_DEFAULT_TITLE="Gerenciamento de usuários Front-end"
COM_ACYMAILING_LISTS_VIEW_DEFAULT_TITLE="Lista de arquivos de Mailing(Todos)"
COM_ACYMAILING_FRONTNEWSLETTER_VIEW_DEFAULT_TITLE="Criar Boletim"
COM_ACYMAILING_USER_VIEW_DEFAULT_TITLE="Criar/modificar uma assinatura"
language/hr-HR/hr-HR.com_acymailing.sys.ini000060400000001262152453623440014464 0ustar00COM_ACYMAILING="AcyMailing"
ACYMAILING="AcyMailing"
COM_ACYMAILING_CONFIGURATION="AcyMailing"
USERS="Korisnici"
LISTS="Liste"
TEMPLATES="Predlošci"
NEWSLETTERS="Newsletteri"
AUTONEWSLETTERS="Smart-Newsletters"
CAMPAIGN="Kampanja"
QUEUE="Red"
STATISTICS="Statistika"
CONFIGURATION="Konfiguracija"
UPDATE_ABOUT="Ažuriranje / O"
COM_ACYMAILING_ARCHIVE_VIEW_DEFAULT_TITLE="Mailing List Archive (single)"
COM_ACYMAILING_FRONTSUBSCRIBER_VIEW_DEFAULT_TITLE="Front-end user management"
COM_ACYMAILING_LISTS_VIEW_DEFAULT_TITLE="Mailing Lists Archive (All)"
COM_ACYMAILING_FRONTNEWSLETTER_VIEW_DEFAULT_TITLE="Create Newsletter"
COM_ACYMAILING_USER_VIEW_DEFAULT_TITLE="Create/modify a subscription"
language/el-GR/el-GR.com_acymailing.sys.ini000060400000001660152453623440014442 0ustar00COM_ACYMAILING="AcyMailing"
ACYMAILING="AcyMailing"
COM_ACYMAILING_CONFIGURATION="AcyMailing"
USERS="Χρήστες"
LISTS="Κατάλογοι"
TEMPLATES="Πρότυπα"
NEWSLETTERS="Επιστολές Ειδήσεων"
AUTONEWSLETTERS="Smart-Newsletters"
CAMPAIGN="Εκστρατεία"
QUEUE="Σειρά προτεραιότητας"
STATISTICS="Στατιστικά"
CONFIGURATION="Ρυθμίσεις"
UPDATE_ABOUT="Ενημέρωση / Σχετικά"
COM_ACYMAILING_ARCHIVE_VIEW_DEFAULT_TITLE="Αρχείο της Mailing List (μοναδικό)"
COM_ACYMAILING_FRONTSUBSCRIBER_VIEW_DEFAULT_TITLE="Διαχείριση του Front-end χρήστη"
COM_ACYMAILING_LISTS_VIEW_DEFAULT_TITLE="Αρχείο Mailing List (ΟΛΑ)"
COM_ACYMAILING_FRONTNEWSLETTER_VIEW_DEFAULT_TITLE="Δημιουργία Newsletter"
COM_ACYMAILING_USER_VIEW_DEFAULT_TITLE="Δημιουργία/Τροποποίηση λογαριασμού συνδρομής"
language/pl-PL/pl-PL.com_acymailing.sys.ini000060400000001364152453623440014477 0ustar00COM_ACYMAILING="AcyMailing"
ACYMAILING="AcyMailing"
COM_ACYMAILING_CONFIGURATION="AcyMailing"
USERS="Użytkownicy"
LISTS="Listy"
TEMPLATES="Szablony"
NEWSLETTERS="Biuletyny"
AUTONEWSLETTERS="Smart-Biuletyn"
CAMPAIGN="Kampania"
QUEUE="Kolejka"
STATISTICS="Statystyka"
CONFIGURATION="Konfiguracja"
UPDATE_ABOUT="Aktualizacja / Info..."
COM_ACYMAILING_ARCHIVE_VIEW_DEFAULT_TITLE="Archiwum listy dyskusyjnej (pojedynczej)"
COM_ACYMAILING_FRONTSUBSCRIBER_VIEW_DEFAULT_TITLE="Zarządzanie użytkownikami ze strony witryny"
COM_ACYMAILING_LISTS_VIEW_DEFAULT_TITLE="Archiwum list dyskusyjnych (wszystkie)"
COM_ACYMAILING_FRONTNEWSLETTER_VIEW_DEFAULT_TITLE="Utwórz biuletyn"
COM_ACYMAILING_USER_VIEW_DEFAULT_TITLE="Użytkownik: zapisz/modyfikuj swoje subskrypcje"
language/de-DE/de-DE.plg_system_fmalertcookies.ini000060400000041037152453623440016051 0ustar00PLG_SYSTEM_FMALERTCOOKIES="Folcomedia - Plugin Cookie Warnung verwenden"
PLG_SYSTEM_FMALERTCOOKIES_XML_DESCRIPTION="<b style='color:red'>Die Felder werden angezeigt, wenn das Plug-in aktiviert und gespeichert wird !!</b><br/><br/>
Eigene CSS Regeln können durch das bearbeiten der Datei <b style='color:black'>custom.css</b> mit einem FTP Programm im Verzeichnis <b style='color:black'>plugins/system/fmalertcookies/assets/css/custom.css</b> hinzugefügt werden.<br/><br/>
Mit diesem Plugin kann auf der Webseite eine Nachricht angezeigt werden, das die Seite Cookies verwendet und Informationen sammelt.<br/><br/>
**** V 1.3.5 ****<br/>
- Fixed a problem with the version of PHP 7.2<br/>
- Added German language (Thomas Sommer).<br/><br/>
**** V 1.3.2 ****<br/>
- Improved SEO preventing spam search engines to index the cookie alert.<br/><br/>
**** V 1.3.1 ****<br/>
- Corrections de bugs.<br/>
- Visual enhancements language tabs.<br/><br/>
**** V 1.3.0 ****<br/>
- The plugin can now block all cookies until the message was not accepted.<br/><br/>
**** V 1.2.15 ****<br/>
- Fixed a problem when SEO the alert was at the top of your page.<br/>
- Possibility to show or not the message when your site is down for maintenance.<br/>
- Added CSS tag to allow you to change the message as you wish.<br/><br/>
**** V 1.2.14 ****<br/>
- Adding a donation button to support the project.<br/>
- Added Hungarian language (Thanks to Zoltan Balazs).<br/>
- Correction W3C.<br/><br/>
**** V 1.2.12 + 1.2.13 ****<br/>
- Plugin Optimization.<br/><br/>
**** V 1.2.11 ****<br/>
- Removing the Bootstrap framework<br/>
- Optimization plugin for compatibility with sites.<br/><br/>
**** V 1.2.10 ****<br/>
- Improves compatibility with other extensions.<br/><br/>
**** V 1.2.9 ****<br/>
- Fixed a erro with W3C.<br/>
- Fixed a bug when importing the file on certain sites.<br/>
- Fixed a bug with lifetime of cookies.<br/><br/>
**** V 1.2.8 ****<br/>
- Fixed a bug with sites which use multiple templates.<br/><br/>
**** V 1.2.7 ****<br/>
- Improved SEO.<br/>
- Improved display of the plugin on mobile.<br/>
- Fixed a problem of alert display pop-up mode on mobile.<br/>
- Added a warning message when your default language of your site is not instantiated in content languages.<br/><br/>
**** V 1.2.6 ****<br/>
- Added a FAQ and Documentation link in the support tab.<br/>
- Various optimizations.<br/><br/>
**** V 1.2.5 ****<br/>
- The warning message does not appear when your site is offline.<br/>
- You can now not charge the Bootsrap library.<br/><br/>
**** V 1.2.4 ****<br/>
- Fixed a bug in pop-up mode.<br/><br/>
**** V 1.2.3 ****<br/>
- Implementation of verifying the presence of a cookie plugin javascript to display or not the message.<br/><br/>
**** V 1.2.2 ****<br/>
- Fixed bug for displaying pop-up.<br/><br/>
**** V 1.2.1 ****<br/>
- Ability to choose the life of the cookie.<br/>
- Ability to choose the background color of the buttons.<br/>
- Fixed the plugin on multi-path sites.<br/><br/>
**** V 1.2.0 ****<br/>
- Added option to transparency of the alert message.<br/>
- You can Show / Hide the alert based languages.<br/>
- You can now Export and Import your setup.<br/><br/>
**** V 1.1.8 ****<br/>
- You can choose to display the alert message on the page explaining the use of cookies.<br/><br/>
**** V 1.1.7 ****<br/>
- Resolution bugs with CSS rules.<br/>
- Choosing the bootstrap version.<br/><br/>
**** V 1.1.6 ****<br/>
- Fixed z-index parameter to display the message above your site.<br/>
- Added a custjoomlaom.css file to add your own CSS rules.<br/><br/>
**** V 1.1.5 ****<br/>
- Set margins around the message.<br/>
- Setting the position of the content.<br/><br/>
**** V 1.1.4 ****<br/>
- Ability to set the warning message on the screen.<br/>
- It is now possible to set the size of the alert message in pixels or percentage.<br/>
- Selection in the order of the buttons.<br/>
- Ability to display buttons line or following text.<br/><br/>
**** V 1.1.3 ****<br/>
- Added multilanguage. <br/><br/>
**** V 1.1.2 ****<br/>
- Improving the timeliness.<br/>
- Fixed bugs."

PLG_SYSTEM_FMALERTCOOKIES_TITLE_PARAMS = "Anzeige"
PLG_SYSTEM_FMALERTCOOKIES_TITLE_BOUTONS = "Schaltflächen"
PLG_SYSTEM_FMALERTCOOKIES_TITLE_SUPPORT = "Support"
PLG_SYSTEM_FMALERTCOOKIES_SAISIE_LANGUE = "&lt;img src=/media/mod_languages/images/%s.gif /&gt;"

PLG_SYSTEM_FMALERTCOOKIES_HEADER_BTN_MORE_LABEL = "<hr><b>Schaltfläche 'Mehr'</b><hr>"
PLG_SYSTEM_FMALERTCOOKIES_HEADER_BTN_CLOSE_LABEL = "<hr><b>Schaltfläche schließen / Cookies akzeptieren</b><hr>"
PLG_SYSTEM_FMALERTCOOKIES_HEADER_GENERAL_LABEL = "<hr><b>Allgemein</b><hr>"
PLG_SYSTEM_FMALERTCOOKIES_HEADER_BORDURE_LABEL = "<hr><b>Ränder</b><hr>"
PLG_SYSTEM_FMALERTCOOKIES_HEADER_ALERTE_LABEL = "<hr><b>Warnhinweis</b><hr>"

PLG_SYSTEM_FMALERTCOOKIES_AJOUTER_JQUERY_LABEL = "benutze jQuery (V. 1.11.1)" 
PLG_SYSTEM_FMALERTCOOKIES_AJOUTER_JQUERY_DESC = "Dieses Plugin benötigt für funktionalität die Bibliothek jQuery" 
PLG_SYSTEM_FMALERTCOOKIES_NO_USE_JQUERY_SITE = "Nein - Ich bevorzuge eine auf meiner Webseite vorhandene jQuery Bibliothek." 
PLG_SYSTEM_FMALERTCOOKIES_YES_USE_JQUERY_PLUGIN = "Ja - möchte das dieses Plugin jQuery hinzufügt."

PLG_SYSTEM_FMALERTCOOKIES_TYPE_AFFICHAGE_LABEL = "Anzeigemodus"
PLG_SYSTEM_FMALERTCOOKIES_TYPE_AFFICHAGE_DESC = "Wählen Sie den Anzeigemodus"
PLG_SYSTEM_FMALERTCOOKIES_POPUP = "Popup"
PLG_SYSTEM_FMALERTCOOKIES_ENCADRE = "Box"

PLG_SYSTEM_FMALERTCOOKIES_TYPE_BORDURE_LABEL = "Typ"
PLG_SYSTEM_FMALERTCOOKIES_TYPE_BORDURE_DESC = "Wählen Sie den Typ des Rahmens aus, den Sie um Ihre Nachricht anzeigen möchten."
PLG_SYSTEM_FMALERTCOOKIES_ARRONDI = "rund"
PLG_SYSTEM_FMALERTCOOKIES_RECTANGULAIRE = "rechteckig"
PLG_SYSTEM_FMALERTCOOKIES_SANS_BORDURE = "keiner"

PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BORDURE_LABEL = "Größe (px)"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BORDURE_DESC = "Geben Sie die größe der Ränder in Pixel ein."

PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BORDURE_LABEL = "Farbe"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BORDURE_DESC = "Einstellen der Randfarbe für die Anzeige"

PLG_SYSTEM_FMALERTCOOKIES_COULEUR_TEXTE_LABEL = "Textfarbe"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_TEXTE_DESC = "Einstellen der Textfarbe für die Anzeige"

PLG_SYSTEM_FMALERTCOOKIES_COULEUR_FOND_LABEL = "Hintergrundfarbe"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_FOND_DESC = "Einstellen der Hintergrundfarbe für die Anzeige"

PLG_SYSTEM_FMALERTCOOKIES_POSITION_LABEL = "Position"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_DESC = "Wenn der Anzeigemodus "Pop-up" ausgewählt wird, erscheint die Nachricht zentriert auf der Seite."
PLG_SYSTEM_FMALERTCOOKIES_HAUT = "Kopfzeile"
PLG_SYSTEM_FMALERTCOOKIES_BAS = "Fusszeile"

PLG_SYSTEM_FMALERTCOOKIES_TEXTE_READMORE_LABEL = "Text Schaltfläche \"<i><b>mehr</b></i>\""
PLG_SYSTEM_FMALERTCOOKIES_TEXTE_READMORE_DESC = "Geben Sie den Anzeigetext für die Schaltfläche 'mehr' ein. Bsp: 'Datenschutz' oder 'Nutzungsbestimmungen'"

PLG_SYSTEM_FMALERTCOOKIES_LINK_READMORE_MENU_LABEL = "Menü-Link Schaltfläche \"<i><b>mehr</b></i>\""
PLG_SYSTEM_FMALERTCOOKIES_LINK_READMORE_MENU_DESC = "Wählen Sie das Menü, in dem die Erklärungen zur Verwendung Ihrer Cookies angezeigt werden."

PLG_SYSTEM_FMALERTCOOKIES_TEXTE_CLOSE_LABEL = "text Schaltfläche \"<i><b>schließen</b></i>\""
PLG_SYSTEM_FMALERTCOOKIES_TEXTE_CLOSE_DESC = "Geben Sie den Anzeigetext für die Schaltfläche 'schließen' ein, um die Anzeige zu schließen<br> Bsp: 'akzeptieren und zustimmen'"

PLG_SYSTEM_FMALERTCOOKIES_TEXTE_LABEL = "Text"
PLG_SYSTEM_FMALERTCOOKIES_TEXTE_DESC = "Hinweistext der angezeigt wird, um Ihre Besucher darüber zu informieren, dass auf Ihrer Website Cookies verwendet werden."

PLG_SYSTEM_FMALERTCOOKIES_TAILLE_CADRE_LABEL = "Größe der Anzeige (px / %)"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_CADRE_DESC = "Einstellen der größe der Warnungsanzeige.<br/>Denken Sie daran, entweder px oder % nach Ihrem Wert zu setzen.<br/>Standardmäßig wird die Größe in Pixel (px) benutzt."

PLG_SYSTEM_FMALERTCOOKIES_BTN_MORE_LABEL = "Anzeige"
PLG_SYSTEM_FMALERTCOOKIES_BTN_MORE_DESC = "zeigt die Schaltfläche 'mehr'"

PLG_SYSTEM_FMALERTCOOKIES_BTN_CLOSE_LABEL = "Anzeige"
PLG_SYSTEM_FMALERTCOOKIES_BTN_CLOSE_DESC = "zeigt die Schaltfläche 'schließen'"

;BTN
PLG_SYSTEM_FMALERTCOOKIES_FIRST_BTN_LABEL = "Reihenfolge der Schaltflächen"
PLG_SYSTEM_FMALERTCOOKIES_FIRST_BTN_DESC = "Wählen Sie die Reihenfolge, in der die Schaltflächen angezeigt werden sollen."
PLG_SYSTEM_FMALERTCOOKIES_FIRST_BTN_CLOSE = " \"schließen\" zuerst"
PLG_SYSTEM_FMALERTCOOKIES_FIRST_BTN_MORE = " \"mehr\" zuerst"

PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_LABEL = "Position der Schaltflächen"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_DESC = "Wählen Sie das Layout der Schaltflächen relativ zum Text."
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_A_LA_LIGNE = "Unterhalb der Textzeile"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_MEME_LIGNE = "In derselben Zeile wie der Text"


PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_LARGE = "groß"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_DEFAULT = "normal"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_SMALL = "klein"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_MINI = "sehr klein"

PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_CENTRER = "zentriert"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_GAUCHE = "links"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_DROITE = "rechts"

PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_DEFAULT = "grau"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_BLEU_FONCE = "dunkles Blau"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_BLEU_CLAIR = "helles Blau"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_VERT = "grün"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_ORANGE = "orange"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_ROUGE = "rot"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_NOIR = " schwarz"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_RIEN = "keine / Link"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_CUSTOM = "benutzerdefinert"

;MORE BTN
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_MORE_LABEL = "Position"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_MORE_DESC = "Position der 'schließen' Schaltfläche"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_MORE_LABEL = "Größe"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_MORE_DESC = "Größe der Schaltflächen"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_MORE_LABEL = "Hintergrund"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_MORE_DESC = "Hintergrundfarbe der Schaltflächen"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_TEXTE_MORE_LABEL = "Textfarbe"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_TEXTE_MORE_DESC = "Textfarbe der Schaltflächen"
PLG_SYSTEM_FMALERTCOOKIES_ANCRE_LINK_READMORE_MENU_LABEL = "Anker"
PLG_SYSTEM_FMALERTCOOKIES_ANCRE_LINK_READMORE_MENU_DESC = "Wenn Sie einen Anker auf der Seite haben, können Sie ihn hier eingeben."

;BTN CLOSE
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_CLOSE_LABEL = "Position"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_BTN_CLOSE_DESC = "Position der Schaltfläche 'schließen' button"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_CLOSE_LABEL = "Größe"
PLG_SYSTEM_FMALERTCOOKIES_TAILLE_BTN_CLOSE_DESC = "Größe der Schaltflächen"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_CLOSE_LABEL = "Hintergrund"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_CLOSE_DESC = "Hintergrundfarbe der Schaltflächen"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_TEXTE_CLOSE_LABEL = "Textfarbe"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_TEXTE_CLOSE_DESC = "Textfarbe der Schaltflächen"

;SUPPORT
PLG_SYSTEM_FMALERTCOOKIES_SUPPORT_LABEL = "<b>Folcomedia</b><br/><br/>
<u>Mail :</u><br/><a href='mailto:contact@folcomedia.fr'>contact@folcomedia.fr</a><br/><br/>
<u>Telefon :</u><br/>+33(0)4 48 06 00 96<br/><br/>
<u>Webseite:</u><br/><a target='_blank' href='http://www.folcomedia.fr'>http://www.folcomedia.fr</a><br/><br/>
<u>Kommentare :</u><br/><a target='_blank' href='http://extensions.joomla.org/extensions/site-management/cookie-control/27308?qh=YToxOntpOjA7czoxMDoiZm9sY29tZWRpYSI7fQ%3D%3D'>http://extensions.joomla.org</a><br/><br/>
<u>Notiz :</u><br/>Wenn Sie von neuen Funktionen in diesem Plugin profitieren möchten, kontaktieren Sie uns bitte.<br/><br/>
<u>Übersetzung :</u><br/>Wenn Sie uns helfen möchten, diese Erweiterung in Ihre Sprache zu übersetzen, danken wir Ihnen für Ihre Kontaktaufnahme.<br/><br/>
<u>Spenden :</u><br/>Sie können uns gerne eine Spende für die Unterstützung des Projekts zukommen lassen. <br/>Sie dürfen dieses Plug-in verwenden, ohne dafür Geld auszugeben.<br/>"

PLG_SYSTEM_FMALERTCOOKIES_MYLANGUAGE_LABEL = "Standard Sprache"
PLG_SYSTEM_FMALERTCOOKIES_MYLANGUAGE_DESC = "Zeigt den Standardsprachentext der Nachricht an, falls Sie den Text der anderen Sprachen nicht ausgefüllt haben."

PLG_SYSTEM_FMALERTCOOKIES_POSITION_FIXE_LABEL = "feste Position"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_FIXE_DESC = "Der Warnhinweis bleibt auf dem Bildschirm stehen, selbst wenn das Anzeigebild im Browser gescrollt wird."

PLG_SYSTEM_FMALERTCOOKIES_MARGE_EXT_LABEL = "äußere Ränder (px)"
PLG_SYSTEM_FMALERTCOOKIES_MARGE_EXT_DESC = "Geben Sie die gewünschte Größe der äußeren Ränder ein."

PLG_SYSTEM_FMALERTCOOKIES_POSITION_CONTENU_LABEL = "Ausrichtung des Inhalts"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_CONTENU_DESC = "Ausrichtung des Inhalts (Nachricht und Schaltflächen)"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_CONTENU_CENTRER = "zentriert"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_CONTENU_GAUCHE = "links"
PLG_SYSTEM_FMALERTCOOKIES_POSITION_CONTENU_DROITE = "rechts"

PLG_SYSTEM_FMALERTCOOKIES_MARGE_INT_LABEL = "Innerer Rand (px)"
PLG_SYSTEM_FMALERTCOOKIES_MARGE_INT_DESC = "Geben Sie die gewünschte Größe des inneren Randes ein."

PLG_SYSTEM_FMALERTCOOKIES_UTILISER_BOOTSTRAP_LABEL = "Version von Bootstrap"
PLG_SYSTEM_FMALERTCOOKIES_UTILISER_BOOTSTRAP_DESC = "Auf einigen Websites ist die Version von jQuery zu alt. Bootstrap Version 3 wird nicht kompatibel sein, deshalb wählen Sie die Version 2 aus."
PLG_SYSTEM_FMALERTCOOKIES_UTILISER_BOOTSTRAP_VERSION_NONE = "keine"
PLG_SYSTEM_FMALERTCOOKIES_UTILISER_BOOTSTRAP_VERSION2 = "Bootstrap 2"
PLG_SYSTEM_FMALERTCOOKIES_UTILISER_BOOTSTRAP_VERSION3 = "Bootstrap 3"

PLG_SYSTEM_FMALERTCOOKIES_AFFICHAGE_MSG_PAGE_COOKIE_DESC = "Möchten Sie die Warnmeldung auch auf der Seite anzeigen, die die Verwendung von Cookies erklärt, nachdem Sie auf den Button \ " mehr \" geklickt haben?"
PLG_SYSTEM_FMALERTCOOKIES_AFFICHAGE_MSG_PAGE_COOKIE_LABEL = "Nachricht anzeigen"
PLG_SYSTEM_FMALERTCOOKIES_AFFICHAGE_MSG_PAGE_COOKIE_ALL_PAGES = "auf allen Seiten der Webseite"
PLG_SYSTEM_FMALERTCOOKIES_AFFICHAGE_MSG_PAGE_COOKIE_NOT_ALL_PAGES = "Auf allen Seiten der Website, außer der Erklärungsseite für die Verwendung von Cookies"

PLG_SYSTEM_FMALERTCOOKIES_NUM_OPACITY_LABEL = "Transparenz"
PLG_SYSTEM_FMALERTCOOKIES_NUM_OPACITY_DESC = "Einstellen der Transparenz der Warnanzeige.<br/>0 = Transparent<br/>100 = keine Transparenz"

PLG_SYSTEM_FMALERTCOOKIES_UPLOAD = "Exportieren der Einstellungen"
PLG_SYSTEM_FMALERTCOOKIES_IMPORT = "Importieren der Einstellungen"
PLG_SYSTEM_FMALERTCOOKIES_CONF_UPLOAD_OK = "Einstellungen erfolgreich importiert."
PLG_SYSTEM_FMALERTCOOKIES_CONF_UPLOAD_KO = "Es ist ein Fehler beim importieren der Einstellungen aufgetreten."
PLG_SYSTEM_FMALERTCOOKIES_LANGUE_ACTIVATE_DESC = "Zeigt die Warnmeldung an oder blendet sie aus, wenn sich der Besucher mit dieser Sprache auf der Website befindet."
PLG_SYSTEM_FMALERTCOOKIES_LANGUE_ACTIVATE_LABEL = "Warnhinweis"

;V1.2.1
PLG_SYSTEM_FMALERTCOOKIES_DUREE_COOKIE_LABEL = "Lebenszeit des Cookies (in Tagen)"
PLG_SYSTEM_FMALERTCOOKIES_DUREE_COOKIE_DESC = "Legen Sie die Lebenszeit des Cookies in Tagen fest. Nach diesem Zeitpunkt wird die Warmeldung erneut angezeigt."

PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_CLOSE_CUSTOM_LABEL = "Benutzerdefinierte Schaltflächenfarbe"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_CLOSE_CUSTOM_DESC = "Wenn Sie bei Hintergrund \"Benutzerdefiniert\" auswählen, wird bei der Wahl des Designs der Schaltfläche die von Ihnen gewählte Farbe berücksichtigt."

PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_MORE_CUSTOM_LABEL = "Benutzerdefinierte Schaltflächenfarbe"
PLG_SYSTEM_FMALERTCOOKIES_COULEUR_BTN_MORE_CUSTOM_DESC = "Wenn Sie bei Hintergrund \"Benutzerdefiniert\" auswählen, wird bei der Wahl des Designs der Schaltfläche die von Ihnen gewählte Farbe berücksichtigt."

;V1.2.15
PLG_SYSTEM_FMALERTCOOKIES_DISPLAY_OFFLINE = "Nachricht auch im Wartungsmodus anzeigen?"
PLG_SYSTEM_FMALERTCOOKIES_DISPLAY_OFFLINE_DESC = "Sie können festlegen, dass die Warnmeldung auch dann angezeigt wird, wenn sich Ihre Webseite im Wartungsmodus befindet."

;V1.3.0
PLG_SYSTEM_FMALERTCOOKIES_DELETE_COOKIE = "Cookies blockieren"
PLG_SYSTEM_FMALERTCOOKIES_DELETE_COOKIE_DESC = "Möchten Sie, dass das Plug-in alle Cookies auf der Website blockiert, bis die Warnmeldung akzeptiert wurde?"

;1.3.2
PLG_SYSTEM_FMALERTCOOKIES_TITLE_SEO = "SEO"
PLG_SYSTEM_FMALERTCOOKIES_USER_AGENT_LABEL = "SEO - BOT Schutz"
PLG_SYSTEM_FMALERTCOOKIES_USER_AGENT_DESC = "Das Plugin verhindert, dass die Suchmaschinen-Roboter das Banner von Cookies sehen, wenn sie Ihre Website besuchen."
language/de-DE/de-DE.plg_system_fmalertcookies.sys.ini000060400000011352152453623440016663 0ustar00PLG_SYSTEM_FMALERTCOOKIES="Folcomedia - Plugin use cookies alert" 
PLG_SYSTEM_FMALERTCOOKIES_XML_DESCRIPTION = "Folcomedia - Plugin use cookies alert<br/><br/>
<b style='color:red'>Die Felder werden angezeigt, wenn das Plusgin aktiviert und gespeichert wird.</b><br/><br/>
Eigene CSS Regeln können durch das bearbeiten der Datei <b style='color:black'>custom.css</b> mit einem FTP Programm im Verzeichnis <b style='color:black'>plugins/system/fmalertcookies/assets/css/custom.css</b><br/><br/>
Mit diesem Plugin kann auf deiner Webseite eine Nachricht angezeigt werden, das die Seite Cookies verwendet und Informationen sammelt.
<br/><br/>
<a class='btn btn-default' href=\"index.php?option=com_plugins&view=plugins&filter_search=folcomedia\">Konfiguration</a><br/><br/>
**** V 1.3.5 ****<br/>
- Fixed a problem with the version of PHP 7.2<br/>
- Added German language (Thomas Sommer).<br/><br/>
**** V 1.3.2 ****<br/>
- Improved SEO preventing spam search engines to index the cookie alert.<br/><br/>
**** V 1.3.1 ****<br/>
- Corrections de bugs.<br/>
- Visual enhancements language tabs.<br/><br/>
**** V 1.3.0 ****<br/>
- The plugin can now block all cookies until the message was not accepted.<br/><br/>
**** V 1.2.15 ****<br/>
- Fixed a problem when SEO the alert was at the top of your page.<br/>
- Possibility to show or not the message when your site is down for maintenance.<br/>
- Added CSS tag to allow you to change the message as you wish.<br/><br/>
**** V 1.2.14 ****<br/>
- Adding a donation button to support the project.<br/>
- Added Hungarian language (Thanks to Zoltan Balazs).<br/>
- Correction W3C.<br/><br/>
**** V 1.2.12 + 1.2.13 ****<br/>
- Plugin Optimization.<br/><br/>
**** V 1.2.11 ****<br/>
- Removing the Bootstrap framework<br/>
- Optimization plugin for compatibility with sites.<br/><br/>
**** V 1.2.10 ****<br/>
- Improves compatibility with other extensions.<br/><br/>
**** V 1.2.9 ****<br/>
- Fixed a erro with W3C.<br/>
- Fixed a bug when importing the file on certain sites.<br/>
- Fixed a bug with lifetime of cookies.<br/><br/>
**** V 1.2.8 ****<br/>
- Fixed a bug with sites which use multiple templates.<br/><br/>
**** V 1.2.7 ****<br/>
- Improved SEO.<br/>
- Improved display of the plugin on mobile.<br/>
- Fixed a problem of alert display pop-up mode on mobile.<br/>
- Added a warning message when your default language of your site is not instantiated in content languages.<br/><br/>
**** V 1.2.6 ****<br/>
- Added a FAQ and Documentation link in the support tab.<br/>
- Various optimizations.<br/><br/>
**** V 1.2.5 ****<br/>
- The warning message does not appear when your site is offline.<br/>
- You can now not charge the Bootsrap library.<br/><br/>
**** V 1.2.4 ****<br/>
- Fixed a bug in pop-up mode.<br/><br/>
**** V 1.2.3 ****<br/>
- Implementation of verifying the presence of a cookie plugin javascript to display or not the message.<br/><br/>
**** V 1.2.2 ****<br/>
- Fixed bug for displaying pop-up.<br/><br/>
**** V 1.2.1 ****<br/>
- Ability to choose the life of the cookie.<br/>
- Ability to choose the background color of the buttons.<br/>
- Fixed the plugin on multi-path sites.<br/><br/> 
**** V 1.2.0 ****<br/>
- Added option to transparency of the alert message.<br/>
- You can Show / Hide the alert based languages.<br/>
- You can now Export and Import your setup.<br/><br/>
**** V 1.1.8 ****<br/>
- You can choose to display the alert message on the page explaining the use of cookies.<br/><br/>
**** V 1.1.7 ****<br/>
- Resolution bugs with CSS rules.<br/>
- Choosing the bootstrap version.<br/><br/>
**** V 1.1.6 ****<br/>
- Fixed z-index parameter to display the message above your site.<br/>
- Added a custom.css file to add your own CSS rules.<br/><br/>
**** V 1.1.5 ****<br/>
- Set margins around the message.<br/>
- Setting the position of the content.<br/><br/>
**** V 1.1.4 ****<br/>
- Ability to set the warning message on the screen.<br/>
- It is now possible to set the size of the alert message in pixels or percentage.<br/>
- Selection in the order of the buttons.<br/>
- Ability to display buttons line or following text.<br/><br/>
**** V 1.1.3 ****<br/>
- Added multilanguage. <br/><br/>
**** V 1.1.2 ****<br/>
- Improving the timeliness.<br/>
- Fixed bugs.
<br/><br/><br/><br/>"

PLG_SYSTEM_FMALERTCOOKIES_MESSAGE_ALERTE_LANGUE_DEFAUT_NON_PRESENTE = "<br/><br/>Attention  !!! <br/><br/>We have detected that your site uses the default language \"%1$s\".<br/><br/>
However, this language is not listed in the content languages.<br/><br/>
To show the alert message in this language, please add it by navigating to:<br/><br/>
<i>Extensions > Language Manager > Content > New </i><br/><br/>
 Or click on the link <a target=\"_blank\" href=\"%2$sadministrator/index.php?option=com_languages&view=languages\">Install a content language</a> and then on \"New\"."
language/de-DE/de-DE.com_acymailing.sys.ini000060400000001312152453623440014354 0ustar00COM_ACYMAILING="AcyMailing"
ACYMAILING="AcyMailing"
COM_ACYMAILING_CONFIGURATION="AcyMailing"
USERS="Benutzer"
LISTS="Listen"
TEMPLATES="Vorlagen"
NEWSLETTERS="Newsletter"
AUTONEWSLETTERS="Smart-Newsletters"
CAMPAIGN="Kampagne"
QUEUE="Warteschlange"
STATISTICS="Statistiken"
CONFIGURATION="Einstellungen"
UPDATE_ABOUT="Aktualisierung / Über"
COM_ACYMAILING_ARCHIVE_VIEW_DEFAULT_TITLE="Mailinglisten Archiv (Einzeln)"
COM_ACYMAILING_FRONTSUBSCRIBER_VIEW_DEFAULT_TITLE="Frontend Benutzerverwaltung"
COM_ACYMAILING_LISTS_VIEW_DEFAULT_TITLE="Mailinglisten Archiv (Alle)"
COM_ACYMAILING_FRONTNEWSLETTER_VIEW_DEFAULT_TITLE="Newsletter erstellen"
COM_ACYMAILING_USER_VIEW_DEFAULT_TITLE="Abonnement erstellen/bearbeiten"
language/da-DK/da-DK.com_acymailing.sys.ini000060400000001261152453623440014363 0ustar00COM_ACYMAILING="AcyMailing"
ACYMAILING="AcyMailing"
COM_ACYMAILING_CONFIGURATION="AcyMailing"
USERS="Brugere"
LISTS="Lister"
TEMPLATES="Skabeloner"
NEWSLETTERS="Nyhedsbreve"
AUTONEWSLETTERS="Smart-Newsletters"
CAMPAIGN="Kampagne"
QUEUE="Kø"
STATISTICS="Statistik"
CONFIGURATION="Konfiguration"
UPDATE_ABOUT="Opdater / Om"
COM_ACYMAILING_ARCHIVE_VIEW_DEFAULT_TITLE="Arkiveret liste (Enkel)"
COM_ACYMAILING_FRONTSUBSCRIBER_VIEW_DEFAULT_TITLE="Brugeradministrering (Brugersiden)"
COM_ACYMAILING_LISTS_VIEW_DEFAULT_TITLE="Arkiverede lister (Alle)"
COM_ACYMAILING_FRONTNEWSLETTER_VIEW_DEFAULT_TITLE="Opret nyhedsbrev"
COM_ACYMAILING_USER_VIEW_DEFAULT_TITLE="Bruger: Tilmeld/Ændre abonnement"
components/com_menus/controllers/items.php000060400000015571152453623440015133 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * The Menu Item Controller
 *
 * @since  1.6
 */
class MenusControllerItems extends JControllerAdmin
{
	/**
	 * Constructor
	 *
	 * @param   array  $config  Optional configuration array
	 *
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		parent::__construct($config);
		$this->registerTask('unsetDefault',	'setDefault');
	}

	/**
	 * Proxy for getModel.
	 *
	 * @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.6
	 */
	public function getModel($name = 'Item', $prefix = 'MenusModel', $config = array())
	{
		return parent::getModel($name, $prefix, array('ignore_request' => true));
	}

	/**
	 * Rebuild the nested set tree.
	 *
	 * @return  boolean  False on failure or error, true on success.
	 *
	 * @since   1.6
	 */
	public function rebuild()
	{
		$this->checkToken();

		$this->setRedirect('index.php?option=com_menus&view=items');

		$model = $this->getModel();

		if ($model->rebuild())
		{
			// Reorder succeeded.
			$this->setMessage(JText::_('COM_MENUS_ITEMS_REBUILD_SUCCESS'));

			return true;
		}
		else
		{
			// Rebuild failed.
			$this->setMessage(JText::sprintf('COM_MENUS_ITEMS_REBUILD_FAILED'), 'error');

			return false;
		}
	}

	/**
	 * Save the manual order inputs from the menu items list view
	 *
	 * @return      void
	 *
	 * @see         JControllerAdmin::saveorder()
	 * @deprecated  4.0
	 */
	public function saveorder()
	{
		$this->checkToken();

		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;
		}
	}

	/**
	 * Method to set the home property for a list of items
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function setDefault()
	{
		// Check for request forgeries
		$this->checkToken('request');

		$app = JFactory::getApplication();

		// Get items to publish from the request.
		$cid   = (array) $this->input->get('cid', array(), 'int');
		$data  = array('setDefault' => 1, 'unsetDefault' => 0);
		$task  = $this->getTask();
		$value = ArrayHelper::getValue($data, $task, 0, 'int');

		// Remove zero values resulting from input filter
		$cid = array_filter($cid);

		if (empty($cid))
		{
			JError::raiseWarning(500, JText::_($this->text_prefix . '_NO_ITEM_SELECTED'));
		}
		else
		{
			// Get the model.
			$model = $this->getModel();

			// Publish the items.
			if (!$model->setHome($cid, $value))
			{
				JError::raiseWarning(500, $model->getError());
			}
			else
			{
				if ($value == 1)
				{
					$ntext = 'COM_MENUS_ITEMS_SET_HOME';
				}
				else
				{
					$ntext = 'COM_MENUS_ITEMS_UNSET_HOME';
				}

				$this->setMessage(JText::plural($ntext, count($cid)));
			}
		}

		$this->setRedirect(
			JRoute::_(
				'index.php?option=' . $this->option . '&view=' . $this->view_list
				. '&menutype=' . $app->getUserState('com_menus.items.menutype'), false
			)
		);
	}

	/**
	 * Method to publish a list of items
	 *
	 * @return  void
	 *
	 * @since   3.6.0
	 */
	public function publish()
	{
		// Check for request forgeries
		$this->checkToken();

		// Get items to publish from the request.
		$cid = (array) JFactory::getApplication()->input->get('cid', array(), 'int');
		$data = array('publish' => 1, 'unpublish' => 0, 'trash' => -2, 'report' => -3);
		$task = $this->getTask();
		$value = ArrayHelper::getValue($data, $task, 0, 'int');

		// Remove zero values resulting from input filter
		$cid = array_filter($cid);

		if (empty($cid))
		{
			try
			{
				JLog::add(JText::_($this->text_prefix . '_NO_ITEM_SELECTED'), JLog::WARNING, 'jerror');
			}
			catch (RuntimeException $exception)
			{
				JFactory::getApplication()->enqueueMessage(JText::_($this->text_prefix . '_NO_ITEM_SELECTED'), 'warning');
			}
		}
		else
		{
			// Get the model.
			$model = $this->getModel();

			// Publish the items.
			try
			{
				$model->publish($cid, $value);
				$errors      = $model->getErrors();
				$messageType = 'message';

				if ($value == 1)
				{
					if ($errors)
					{
						$messageType = 'error';
						$ntext       = $this->text_prefix . '_N_ITEMS_FAILED_PUBLISHING';
					}
					else
					{
						$ntext = $this->text_prefix . '_N_ITEMS_PUBLISHED';
					}
				}
				elseif ($value == 0)
				{
					$ntext = $this->text_prefix . '_N_ITEMS_UNPUBLISHED';
				}
				else
				{
					$ntext = $this->text_prefix . '_N_ITEMS_TRASHED';
				}

				$this->setMessage(JText::plural($ntext, count($cid)), $messageType);
			}
			catch (Exception $e)
			{
				$this->setMessage($e->getMessage(), 'error');
			}
		}

		$this->setRedirect(
			JRoute::_(
				'index.php?option=' . $this->option . '&view=' . $this->view_list . '&menutype=' .
				JFactory::getApplication()->getUserState('com_menus.items.menutype'),
				false
			)
		);
	}

	/**
	 * Check in of one or more records.
	 *
	 * @return  boolean  True on success
	 *
	 * @since   3.6.0
	 */
	public function checkin()
	{
		// Check for request forgeries.
		$this->checkToken();

		// Read the Ids from the post data
		$cid = (array) JFactory::getApplication()->input->post->get('cid', array(), 'int');

		// Remove zero values resulting from input filter
		$cid = array_filter($cid);

		// Run the model
		$model  = $this->getModel();
		$return = $model->checkin($cid);

		if ($return === false)
		{
			// Checkin failed.
			$message = JText::sprintf('JLIB_APPLICATION_ERROR_CHECKIN_FAILED', $model->getError());
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . '&view=' . $this->view_list
					. '&menutype=' . JFactory::getApplication()->getUserState('com_menus.items.menutype'),
					false
				),
				$message,
				'error'
			);

			return false;
		}
		else
		{
			// Checkin succeeded.
			$message = JText::plural($this->text_prefix . '_N_ITEMS_CHECKED_IN', count($cid));
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . '&view=' . $this->view_list
					. '&menutype=' . JFactory::getApplication()->getUserState('com_menus.items.menutype'),
					false
				),
				$message
			);

			return true;
		}
	}
}
components/com_menus/controllers/ajax.json.php000060400000004544152453623440015703 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Language\LanguageHelper;

/**
 * The menu controller for ajax requests
 *
 * @since  3.9.0
 */
class MenusControllerAjax extends JControllerLegacy
{
	/**
	 * Method to fetch associations of a menu item
	 *
	 * The method assumes that the following http parameters are passed in an Ajax Get request:
	 * token: the form token
	 * assocId: the id of the menu item whose associations are to be returned
	 * excludeLang: the association for this language is to be excluded
	 *
	 * @return  null
	 *
	 * @since  3.9.0
	 */
	public function fetchAssociations()
	{
		if (!JSession::checkToken('get'))
		{
			echo new JResponseJson(null, JText::_('JINVALID_TOKEN'), true);
		}
		else
		{
			$input     = JFactory::getApplication()->input;
			$extension = $input->get('extension');

			$assocId   = $input->getInt('assocId', 0);

			if ($assocId == 0)
			{
				echo new JResponseJson(null, JText::sprintf('JLIB_FORM_VALIDATE_FIELD_INVALID', 'assocId'), true);

				return;
			}

			$excludeLang = $input->get('excludeLang', '', 'STRING');

			$associations = JLanguageAssociations::getAssociations('com_menus', '#__menu', 'com_menus.item', (int) $assocId, 'id', '', '');

			unset($associations[$excludeLang]);

			// Add the title to each of the associated records
			JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_menus/tables');
			$menuTable = JTable::getInstance('Menu', 'JTable', array());

			foreach ($associations as $lang => $association)
			{
				$menuTable->load($association->id);
				$associations[$lang]->title = $menuTable->title;
			}

			$countContentLanguages = count(LanguageHelper::getContentLanguages(array(0, 1)));

			if (count($associations) == 0)
			{
				$message = JText::_('JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_NONE');
			}
			elseif ($countContentLanguages > count($associations) + 2)
			{
				$tags    = implode(', ', array_keys($associations));
				$message = JText::sprintf('JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_SOME', $tags);
			}
			else
			{
				$message = JText::_('JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_ALL');
			}

			echo new JResponseJson($associations, $message);
		}
	}
}
components/com_menus/controllers/menu.php000060400000014413152453623440014750 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * The Menu Type Controller
 *
 * @since  1.6
 */
class MenusControllerMenu extends JControllerForm
{
	/**
	 * Dummy method to redirect back to standard controller
	 *
	 * @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  JController		This object to support chaining.
	 *
	 * @since   1.5
	 */
	public function display($cachable = false, $urlparams = false)
	{
		$this->setRedirect(JRoute::_('index.php?option=com_menus&view=menus', false));
	}

	/**
	 * Method to save a menu item.
	 *
	 * @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 = null)
	{
		// Check for request forgeries.
		$this->checkToken();

		$app      = JFactory::getApplication();
		$data     = $this->input->post->get('jform', array(), 'array');
		$context  = 'com_menus.edit.menu';
		$task     = $this->getTask();
		$recordId = $this->input->getInt('id');

		// Prevent using 'main' as menutype as this is reserved for backend menus
		if (strtolower($data['menutype']) == 'main')
		{
			$msg = JText::_('COM_MENUS_ERROR_MENUTYPE');
			JFactory::getApplication()->enqueueMessage($msg, 'error');

			// Redirect back to the edit screen.
			$this->setRedirect(JRoute::_('index.php?option=com_menus&view=menu&layout=edit' . $this->getRedirectToItemAppend($recordId), false));

			return false;
		}

		// Populate the row id from the session.
		$data['id'] = $recordId;

		// Get the model and attempt to validate the posted data.
		$model = $this->getModel('Menu');
		$form  = $model->getForm();

		if (!$form)
		{
			JError::raiseError(500, $model->getError());

			return false;
		}

		$validData = $model->validate($form, $data);

		// Check for validation errors.
		if ($validData === 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');
				}
			}

			// Save the data in the session.
			$app->setUserState($context . '.data', $data);

			// Redirect back to the edit screen.
			$this->setRedirect(JRoute::_('index.php?option=com_menus&view=menu&layout=edit' . $this->getRedirectToItemAppend($recordId), false));

			return false;
		}

		if (isset($validData['preset']))
		{
			$preset = trim($validData['preset']) ?: null;

			unset($validData['preset']);
		}

		// Attempt to save the data.
		if (!$model->save($validData))
		{
			// Save the data in the session.
			$app->setUserState($context . '.data', $validData);

			// Redirect back to the edit screen.
			$this->setMessage(JText::sprintf('JLIB_APPLICATION_ERROR_SAVE_FAILED', $model->getError()), 'error');
			$this->setRedirect(JRoute::_('index.php?option=com_menus&view=menu&layout=edit' . $this->getRedirectToItemAppend($recordId), false));

			return false;
		}

		// Import the preset selected
		if (isset($preset) && $data['client_id'] == 1)
		{
			try
			{
				MenusHelper::installPreset($preset, $data['menutype']);

				$this->setMessage(JText::_('COM_MENUS_PRESET_IMPORT_SUCCESS'));
			}
			catch (Exception $e)
			{
				// Save was successful but the preset could not be loaded. Let it through with just a warning
				$this->setMessage(JText::sprintf('COM_MENUS_PRESET_IMPORT_FAILED', $e->getMessage()));
			}
		}
		else
		{
			$this->setMessage(JText::_('COM_MENUS_MENU_SAVE_SUCCESS'));
		}

		// Redirect the user and adjust session state based on the chosen task.
		switch ($task)
		{
			case 'apply':
				// Set the record data in the session.
				$recordId = $model->getState($this->context . '.id');
				$this->holdEditId($context, $recordId);
				$app->setUserState($context . '.data', null);

				// Redirect back to the edit screen.
				$this->setRedirect(JRoute::_('index.php?option=com_menus&view=menu&layout=edit' . $this->getRedirectToItemAppend($recordId), false));
				break;

			case 'save2new':
				// Clear the record id and data from the session.
				$this->releaseEditId($context, $recordId);
				$app->setUserState($context . '.data', null);

				// Redirect back to the edit screen.
				$this->setRedirect(JRoute::_('index.php?option=com_menus&view=menu&layout=edit', false));
				break;

			default:
				// Clear the record id and data from the session.
				$this->releaseEditId($context, $recordId);
				$app->setUserState($context . '.data', null);

				// Redirect to the list screen.
				$this->setRedirect(JRoute::_('index.php?option=com_menus&view=menus', false));
				break;
		}
	}

	/**
	 * Method to display a menu as preset xml.
	 *
	 * @return  boolean  True if successful, false otherwise.
	 *
	 * @since   3.8.0
	 */
	public function exportXml()
	{
		// Check for request forgeries.
		$this->checkToken();

		$cid = (array) $this->input->get('cid', array(), 'int');

		// We know the first element is the one we need because we don't allow multi selection of rows
		$id = empty($cid) ? 0 : reset($cid);

		if ($id === 0)
		{
			$this->setMessage(JText::_('COM_MENUS_SELECT_MENU_FIRST_EXPORT'), 'warning');

			$this->setRedirect(JRoute::_('index.php?option=com_menus&view=menus', false));

			return false;
		}

		$model = $this->getModel('Menu');
		$item  = $model->getItem($id);

		if (!$item->menutype)
		{
			$this->setMessage(JText::_('COM_MENUS_SELECT_MENU_FIRST_EXPORT'), 'warning');

			$this->setRedirect(JRoute::_('index.php?option=com_menus&view=menus', false));

			return false;
		}

		$this->setRedirect(JRoute::_('index.php?option=com_menus&view=menu&menutype=' . $item->menutype . '&format=xml', false));

		return true;
	}
}
components/com_menus/controllers/menus.php000060400000011710152453623440015130 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * The Menu List Controller
 *
 * @since  1.6
 */
class MenusControllerMenus extends JControllerLegacy
{
	/**
	 * Display the 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  JController        This object to support chaining.
	 *
	 * @since   1.6
	 */
	public function display($cachable = false, $urlparams = false)
	{
	}

	/**
	 * 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.6
	 */
	public function getModel($name = 'Menu', $prefix = 'MenusModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	/**
	 * Remove an item.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function delete()
	{
		// Check for request forgeries
		$this->checkToken();

		$user = JFactory::getUser();
		$app  = JFactory::getApplication();
		$cids = (array) $this->input->get('cid', array(), 'int');

		// Remove zero values resulting from input filter
		$cids = array_filter($cids);

		if (empty($cids))
		{
			$app->enqueueMessage(JText::_('COM_MENUS_NO_MENUS_SELECTED'), 'notice');
		}
		else
		{
			// Access checks.
			foreach ($cids as $i => $id)
			{
				if (!$user->authorise('core.delete', 'com_menus.menu.' . (int) $id))
				{
					// Prune items that you can't change.
					unset($cids[$i]);
					$app->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_DELETE_NOT_PERMITTED'), 'error');
				}
			}

			if (count($cids) > 0)
			{
				// Get the model.
				$model = $this->getModel();

				// Remove the items.
				if (!$model->delete($cids))
				{
					$this->setMessage($model->getError(), 'error');
				}
				else
				{
					$this->setMessage(JText::plural('COM_MENUS_N_MENUS_DELETED', count($cids)));
				}
			}
		}

		$this->setRedirect('index.php?option=com_menus&view=menus');
	}

	/**
	 * Rebuild the menu tree.
	 *
	 * @return  boolean  False on failure or error, true on success.
	 *
	 * @since   1.6
	 */
	public function rebuild()
	{
		$this->checkToken();

		$this->setRedirect('index.php?option=com_menus&view=menus');

		$model = $this->getModel('Item');

		if ($model->rebuild())
		{
			// Reorder succeeded.
			$this->setMessage(JText::_('JTOOLBAR_REBUILD_SUCCESS'));

			return true;
		}
		else
		{
			// Rebuild failed.
			$this->setMessage(JText::sprintf('JTOOLBAR_REBUILD_FAILED', $model->getError()), 'error');

			return false;
		}
	}

	/**
	 * Temporary method. This should go into the 1.5 to 1.6 upgrade routines.
	 *
	 * @return  JException|void  JException instance on error
	 *
	 * @since   1.6
	 */
	public function resync()
	{
		$db = JFactory::getDbo();
		$query = $db->getQuery(true);
		$parts = null;

		try
		{
			$query->select('element, extension_id')
				->from('#__extensions')
				->where('type = ' . $db->quote('component'));
			$db->setQuery($query);

			$components = $db->loadAssocList('element', 'extension_id');
		}
		catch (RuntimeException $e)
		{
			return JError::raiseWarning(500, $e->getMessage());
		}

		// Load all the component menu links
		$query->select($db->quoteName('id'))
			->select($db->quoteName('link'))
			->select($db->quoteName('component_id'))
			->from('#__menu')
			->where($db->quoteName('type') . ' = ' . $db->quote('component.item'));
			$db->setQuery($query);

		try
		{
			$items = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			return JError::raiseWarning(500, $e->getMessage());
		}

		foreach ($items as $item)
		{
			// Parse the link.
			parse_str(parse_url($item->link, PHP_URL_QUERY), $parts);

			// Tease out the option.
			if (isset($parts['option']))
			{
				$option = $parts['option'];

				// Lookup the component ID
				if (isset($components[$option]))
				{
					$componentId = $components[$option];
				}
				else
				{
					// Mismatch. Needs human intervention.
					$componentId = -1;
				}

				// Check for mis-matched component id's in the menu link.
				if ($item->component_id != $componentId)
				{
					// Update the menu table.
					$log = "Link $item->id refers to $item->component_id, converting to $componentId ($item->link)";
					echo "<br />$log";

					$query->clear();
					$query->update('#__menu')
						->set('component_id = ' . $componentId)
						->where('id = ' . $item->id);

					try
					{
						$db->setQuery($query)->execute();
					}
					catch (RuntimeException $e)
					{
						return JError::raiseWarning(500, $e->getMessage());
					}
				}
			}
		}
	}
}
components/com_menus/controllers/item.php000060400000037657152453623440014761 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * The Menu Item Controller
 *
 * @since  1.6
 */
class MenusControllerItem extends JControllerForm
{
	/**
	 * Method to check if you can add a new record.
	 *
	 * Extended classes can override this if necessary.
	 *
	 * @param   array  $data  An array of input data.
	 *
	 * @return  boolean
	 *
	 * @since   3.6
	 */
	protected function allowAdd($data = array())
	{
		$user = JFactory::getUser();

		$menuType = JFactory::getApplication()->input->getCmd('menutype', isset($data['menutype']) ? $data['menutype'] : '');

		$menutypeID = 0;

		// Load menutype ID
		if ($menuType)
		{
			$menutypeID = (int) $this->getMenuTypeId($menuType);
		}

		return $user->authorise('core.create', 'com_menus.menu.' . $menutypeID);
	}

	/**
	 * Method to check if you edit a record.
	 *
	 * Extended classes can override this if necessary.
	 *
	 * @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   3.6
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		$user = JFactory::getUser();

		$menutypeID = 0;

		if (isset($data[$key]))
		{
			$model = $this->getModel();
			$item = $model->getItem($data[$key]);

			if (!empty($item->menutype))
			{
				// Protected menutype, do not allow edit
				if ($item->menutype == 'main')
				{
					return false;
				}

				$menutypeID = (int) $this->getMenuTypeId($item->menutype);
			}
		}

		return $user->authorise('core.edit', 'com_menus.menu.' . (int) $menutypeID);
	}

	/**
	 * Loads the menutype ID by a given menutype string
	 *
	 * @param   string  $menutype  The given menutype
	 *
	 * @return integer
	 *
	 * @since  3.6
	 */
	protected function getMenuTypeId($menutype)
	{
		$model = $this->getModel();
		$table = $model->getTable('MenuType', 'JTable');

		$table->load(array('menutype' => $menutype));

		return (int) $table->id;
	}

	/**
	 * Method to add a new menu item.
	 *
	 * @return  mixed  True if the record can be added, a JError object if not.
	 *
	 * @since   1.6
	 */
	public function add()
	{
		$app = JFactory::getApplication();
		$context = 'com_menus.edit.item';

		$result = parent::add();

		if ($result)
		{
			$app->setUserState($context . '.type', null);
			$app->setUserState($context . '.link', null);
		}

		return $result;
	}

	/**
	 * 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)
	{
		$this->checkToken();

		$model = $this->getModel('Item', '', array());

		// Preset the redirect
		$this->setRedirect(JRoute::_('index.php?option=com_menus&view=items' . $this->getRedirectToListAppend(), false));

		return parent::batch($model);
	}

	/**
	 * 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)
	{
		$this->checkToken();

		$app = JFactory::getApplication();
		$context = 'com_menus.edit.item';
		$result = parent::cancel();

		if ($result)
		{
			// Clear the ancillary data from the session.
			$app->setUserState($context . '.type', null);
			$app->setUserState($context . '.link', null);

			// Redirect to the list screen.
			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . '&view=' . $this->view_list . $this->getRedirectToListAppend()
					. '&menutype=' . $app->getUserState('com_menus.items.menutype'), false
				)
			);
		}

		return $result;
	}

	/**
	 * 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 = null)
	{
		$app = JFactory::getApplication();
		$result = parent::edit();

		if ($result)
		{
			// Push the new ancillary data into the session.
			$app->setUserState('com_menus.edit.item.type', null);
			$app->setUserState('com_menus.edit.item.link', null);
		}

		return $result;
	}

	/**
	 * 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   3.0.1
	 */
	protected function getRedirectToItemAppend($recordId = null, $urlVar = 'id')
	{
		$append = parent::getRedirectToItemAppend($recordId, $urlVar);

		if ($recordId)
		{
			$model    = $this->getModel();
			$item     = $model->getItem($recordId);
			$clientId = $item->client_id;
			$append   = '&client_id=' . $clientId . $append;
		}
		else
		{
			$app      = JFactory::getApplication();
			$clientId = $app->input->get('client_id', '0', 'int');
			$menuType = $app->input->get('menutype', 'mainmenu', 'cmd');
			$append   = '&client_id=' . $clientId . ($menuType ? '&menutype=' . $menuType : '') . $append;
		}

		return $append;
	}

	/**
	 * 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 = null)
	{
		// Check for request forgeries.
		$this->checkToken();

		$app      = JFactory::getApplication();
		$model    = $this->getModel('Item', '', array());
		$table    = $model->getTable();
		$data     = $this->input->post->get('jform', array(), 'array');
		$task     = $this->getTask();
		$context  = 'com_menus.edit.item';

		// Set the menutype should we need it.
		if ($data['menutype'] !== '')
		{
			$app->input->set('menutype', $data['menutype']);
		}

		// Determine the name of the primary key for the data.
		if (empty($key))
		{
			$key = $table->getKeyName();
		}

		// To avoid data collisions the urlVar may be different from the primary key.
		if (empty($urlVar))
		{
			$urlVar = $key;
		}

		$recordId = $this->input->getInt($urlVar);

		// Populate the row id from the session.
		$data[$key] = $recordId;

		// The save2copy task needs to be handled slightly differently.
		if ($task == 'save2copy')
		{
			// Check-in the original row.
			if ($model->checkin($data['id']) === false)
			{
				// Check-in failed, go back to the item and display a notice.
				$this->setMessage(JText::sprintf('JLIB_APPLICATION_ERROR_CHECKIN_FAILED', $model->getError()), 'warning');

				return false;
			}

			// Reset the ID and then treat the request as for Apply.
			$data['id'] = 0;
			$data['associations'] = array();
			$task = 'apply';
		}

		// Access check.
		if (!$this->allowSave($data, $key))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'));
			$this->setMessage($this->getError(), 'error');

			$this->setRedirect(
				JRoute::_(
					'index.php?option=' . $this->option . '&view=' . $this->view_list
					. $this->getRedirectToListAppend(), false
				)
			);

			return false;
		}

		// Validate the posted data.
		// This post is made up of two forms, one for the item and one for params.
		$form = $model->getForm($data);

		if (!$form)
		{
			JError::raiseError(500, $model->getError());

			return false;
		}

		if ($data['type'] == 'url')
		{
			$data['link'] = str_replace(array('"', '>', '<'), '', $data['link']);

			if (strstr($data['link'], ':'))
			{
				$segments = explode(':', $data['link']);
				$protocol = strtolower($segments[0]);
				$scheme   = array(
					'http', 'https', 'ftp', 'ftps', 'gopher', 'mailto',
					'news', 'prospero', 'telnet', 'rlogin', 'tn3270', 'wais',
					'mid', 'cid', 'nntp', 'tel', 'urn', 'ldap', 'file', 'fax',
					'modem', 'git', 'sms',
				);

				if (!in_array($protocol, $scheme))
				{
					$app->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'), 'warning');
					$this->setRedirect(
						JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend($recordId), false)
					);

					return false;
				}
			}
		}

		$data = $model->validate($form, $data);

		// Preprocess request fields to ensure that we remove not set or empty request params
		$request = $form->getGroup('request', true);

		// Check for the special 'request' entry.
		if ($data['type'] == 'component' && !empty($request))
		{
			$removeArgs = array();

			if (!isset($data['request']) || !is_array($data['request']))
			{
				$data['request'] = array();
			}

			foreach ($request as $field)
			{
				$fieldName = $field->getAttribute('name');

				if (!isset($data['request'][$fieldName]) || $data['request'][$fieldName] == '')
				{
					$removeArgs[$fieldName] = '';
				}
			}

			// Parse the submitted link arguments.
			$args = array();
			parse_str(parse_url($data['link'], PHP_URL_QUERY), $args);

			// Merge in the user supplied request arguments.
			$args = array_merge($args, $data['request']);

			// Remove the unused request params
			if (!empty($args) && !empty($removeArgs))
			{
				$args = array_diff_key($args, $removeArgs);
			}

			$data['link'] = 'index.php?' . urldecode(http_build_query($args, '', '&'));
			unset($data['request']);
		}

		// 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(), 'warning');
				}
				else
				{
					$app->enqueueMessage($errors[$i], 'warning');
				}
			}

			// Save the data in the session.
			$app->setUserState('com_menus.edit.item.data', $data);

			// Redirect back to the edit screen.
			$editUrl = 'index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend($recordId);
			$this->setRedirect(JRoute::_($editUrl, false));

			return false;
		}

		// Attempt to save the data.
		if (!$model->save($data))
		{
			// Save the data in the session.
			$app->setUserState('com_menus.edit.item.data', $data);

			// Redirect back to the edit screen.
			$editUrl = 'index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend($recordId);
			$this->setMessage(JText::sprintf('JLIB_APPLICATION_ERROR_SAVE_FAILED', $model->getError()), 'error');
			$this->setRedirect(JRoute::_($editUrl, false));

			return false;
		}

		// Save succeeded, check-in the row.
		if ($model->checkin($data['id']) === false)
		{
			// Check-in failed, go back to the row and display a notice.
			$this->setMessage(JText::sprintf('JLIB_APPLICATION_ERROR_CHECKIN_FAILED', $model->getError()), 'warning');
			$redirectUrl = 'index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend($recordId);
			$this->setRedirect(JRoute::_($redirectUrl, false));

			return false;
		}

		$this->setMessage(JText::_('COM_MENUS_SAVE_SUCCESS'));

		// Redirect the user and adjust session state based on the chosen task.
		switch ($task)
		{
			case 'apply':
				// Set the row data in the session.
				$recordId = $model->getState($this->context . '.id');
				$this->holdEditId($context, $recordId);
				$app->setUserState('com_menus.edit.item.data', null);
				$app->setUserState('com_menus.edit.item.type', null);
				$app->setUserState('com_menus.edit.item.link', null);

				// Redirect back to the edit screen.
				$editUrl = 'index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend($recordId);
				$this->setRedirect(JRoute::_($editUrl, false));
				break;

			case 'save2new':
				// Clear the row id and data in the session.
				$this->releaseEditId($context, $recordId);
				$app->setUserState('com_menus.edit.item.data', null);
				$app->setUserState('com_menus.edit.item.type', null);
				$app->setUserState('com_menus.edit.item.link', null);

				// Redirect back to the edit screen.
				$this->setRedirect(JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend(), false));
				break;

			default:
				// Clear the row id and data in the session.
				$this->releaseEditId($context, $recordId);
				$app->setUserState('com_menus.edit.item.data', null);
				$app->setUserState('com_menus.edit.item.type', null);
				$app->setUserState('com_menus.edit.item.link', null);

				// Redirect to the list screen.
				$this->setRedirect(
					JRoute::_(
						'index.php?option=' . $this->option . '&view=' . $this->view_list . $this->getRedirectToListAppend()
						. '&menutype=' . $app->getUserState('com_menus.items.menutype'), false
					)
				);
				break;
		}

		return true;
	}

	/**
	 * Sets the type of the menu item currently being edited.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function setType()
	{
		$this->checkToken();

		$app = JFactory::getApplication();

		// Get the posted values from the request.
		$data = $this->input->post->get('jform', array(), 'array');

		// Get the type.
		$type = $data['type'];

		$type = json_decode(base64_decode($type));
		$title = isset($type->title) ? $type->title : null;
		$recordId = isset($type->id) ? $type->id : 0;

		$specialTypes = array('alias', 'separator', 'url', 'heading', 'container');

		if (!in_array($title, $specialTypes))
		{
			$title = 'component';
		}
		else
		{
			// Set correct component id to ensure proper 404 messages with system links
			$data['component_id'] = 0;
		}

		$app->setUserState('com_menus.edit.item.type', $title);

		if ($title == 'component')
		{
			if (isset($type->request))
			{
				// Clean component name
				$type->request->option = JFilterInput::getInstance()->clean($type->request->option, 'CMD');

				$component = JComponentHelper::getComponent($type->request->option);
				$data['component_id'] = $component->id;

				$app->setUserState('com_menus.edit.item.link', 'index.php?' . JUri::buildQuery((array) $type->request));
			}
		}
		// If the type is alias you just need the item id from the menu item referenced.
		elseif ($title == 'alias')
		{
			$app->setUserState('com_menus.edit.item.link', 'index.php?Itemid=');
		}

		unset($data['request']);

		$data['type'] = $title;

		if ($this->input->get('fieldtype') == 'type')
		{
			$data['link'] = $app->getUserState('com_menus.edit.item.link');
		}

		// Save the data in the session.
		$app->setUserState('com_menus.edit.item.data', $data);

		$this->type = $type;
		$this->setRedirect(JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend($recordId), false));
	}

	/**
	 * Gets the parent items of the menu location currently.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function getParentItem()
	{
		$app = JFactory::getApplication();

		$results  = array();
		$menutype = $this->input->get->get('menutype');

		if ($menutype)
		{
			$model = $this->getModel('Items', '', array());
			$model->getState();
			$model->setState('filter.menutype', $menutype);
			$model->setState('list.select', 'a.id, a.title, a.level');
			$model->setState('list.start', '0');
			$model->setState('list.limit', '0');

			/** @var  MenusModelItems  $model */
			$results = $model->getItems();

			// Pad the option text with spaces using depth level as a multiplier.
			for ($i = 0, $n = count($results); $i < $n; $i++)
			{
				$results[$i]->title = str_repeat(' - ', $results[$i]->level) . $results[$i]->title;
			}
		}

		// Output a JSON object
		echo json_encode($results);

		$app->close();
	}
}
components/com_menus/controller.php000060400000004374152453623440013626 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Base controller class for Menu Manager.
 *
 * @since  1.6
 */
class MenusController extends JControllerLegacy
{
	/**
	 * Method to display a view.
	 *
	 * @param   boolean        $cachable   If true, the view output will be cached
	 * @param   array|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)
	{
		JLoader::register('MenusHelper', JPATH_ADMINISTRATOR . '/components/com_menus/helpers/menus.php');

		// Check custom administrator menu modules
		if (JModuleHelper::isAdminMultilang())
		{
			$languages = JLanguageHelper::getInstalledLanguages(1, true);
			$langCodes = array();

			foreach ($languages as $language)
			{
				if (isset($language->metadata['nativeName']))
				{
					$languageName = $language->metadata['nativeName'];
				}
				else
				{
					$languageName = $language->metadata['name'];
				}

				$langCodes[$language->metadata['tag']] = $languageName;
			}

			$db    = JFactory::getDbo();
			$query = $db->getQuery(true);

			$query->select($db->qn('m.language'))
				->from($db->qn('#__modules', 'm'))
				->where($db->qn('m.module') . ' = ' . $db->quote('mod_menu'))
				->where($db->qn('m.published') . ' = 1')
				->where($db->qn('m.client_id') . ' = 1')
				->group($db->qn('m.language'));

			$mLanguages = $db->setQuery($query)->loadColumn();

			// Check if we have a mod_menu module set to All languages or a mod_menu module for each admin language.
			if (!in_array('*', $mLanguages) && count($langMissing = array_diff(array_keys($langCodes), $mLanguages)))
			{
				$app         = JFactory::getApplication();
				$langMissing = array_intersect_key($langCodes, array_flip($langMissing));

				$app->enqueueMessage(JText::sprintf('JMENU_MULTILANG_WARNING_MISSING_MODULES', implode(', ', $langMissing)), 'warning');
			}
		}

		return parent::display();
	}
}
components/com_menus/config.xml000060400000002447152453623440012720 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset
		name="page-options"
		label="COM_MENUS_PAGE_OPTIONS_LABEL"
		>

		<field
			name="page_title"
			type="text"
			label="COM_MENUS_ITEM_FIELD_PAGE_TITLE_LABEL"
			description="COM_MENUS_ITEM_FIELD_PAGE_TITLE_DESC"
			default=""
		/>

		<field
			name="show_page_heading"
			type="radio"
			label="COM_MENUS_ITEM_FIELD_SHOW_PAGE_HEADING_LABEL"
			description="COM_MENUS_ITEM_FIELD_SHOW_PAGE_HEADING_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="page_heading"
			type="text"
			label="COM_MENUS_ITEM_FIELD_PAGE_HEADING_LABEL"
			description="COM_MENUS_ITEM_FIELD_PAGE_HEADING_DESC"
			default=""
			showon="show_page_heading:1"
		/>

		<field
			name="pageclass_sfx"
			type="text"
			label="COM_MENUS_ITEM_FIELD_PAGE_CLASS_LABEL"
			description="COM_MENUS_ITEM_FIELD_PAGE_CLASS_DESC"
			default=""
		/>

	</fieldset>

	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
		>

		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			filter="rules"
			validate="rules"
			component="com_menus"
			section="component"
		/>

	</fieldset>
</config>
components/com_menus/menus.xml000060400000001771152453623440012601 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_menus</name>
	<author>Joomla! Project</author>
	<creationDate>April 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_MENUS_XML_DESCRIPTION</description>
	<administration>
		<files folder="admin">
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<filename>menus.php</filename>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>views</folder>
			<folder>presets</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_menus.ini</language>
			<language tag="en-GB">language/en-GB.com_menus.sys.ini</language>
		</languages>
	</administration>
</extension>
components/com_menus/menus.php000060400000001061152453623440012560 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

if (!JFactory::getUser()->authorise('core.manage', 'com_menus'))
{
	throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
}

$controller = JControllerLegacy::getInstance('Menus');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
components/com_menus/access.xml000060400000002510152453623440012703 0ustar00<?xml version="1.0" encoding="utf-8" ?>
<access component="com_menus">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.options" title="JACTION_OPTIONS" description="JACTION_OPTIONS_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
	</section>
	<section name="menu">
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
	</section>
</access>
components/com_menus/helpers/associations.php000060400000005671152453623440015605 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Association\AssociationExtensionHelper;

/**
 * Menu associations helper.
 *
 * @since  3.7.0
 */
class MenusAssociationsHelper extends AssociationExtensionHelper
{
	/**
	 * The extension name
	 *
	 * @var     array   $extension
	 *
	 * @since   3.7.0
	 */
	protected $extension = 'com_menus';

	/**
	 * Array of item types
	 *
	 * @var     array   $itemTypes
	 *
	 * @since   3.7.0
	 */
	protected $itemTypes = array('item');

	/**
	 * Has the extension association support
	 *
	 * @var     boolean   $associationsSupport
	 *
	 * @since   3.7.0
	 */
	protected $associationsSupport = true;

	/**
	 * Get the associated items for an item
	 *
	 * @param   string  $typeName  The item type
	 * @param   int     $id        The id of item for which we need the associated items
	 *
	 * @return  array
	 *
	 * @since   3.7.0
	 */
	public function getAssociations($typeName, $id)
	{
		$type = $this->getType($typeName);

		$context = $this->extension . '.item';

		// Get the associations.
		$associations = JLanguageAssociations::getAssociations(
			$this->extension,
			$type['tables']['a'],
			$context,
			$id,
			'id',
			'alias',
			''
		);

		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 'item':
				$table = JTable::getInstance('menu');
				break;
		}

		if (is_null($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 'item':
					$fields['ordering'] = 'a.lft';
					$fields['level'] = 'a.level';
					$fields['catid'] = '';
					$fields['state'] = 'a.published';
					$fields['created_user_id'] = '';
					$fields['menutype'] = 'a.menutype';

					$support['state'] = true;
					$support['acl'] = true;
					$support['checkout'] = true;
					$support['level'] = true;

					$tables = array(
						'a' => '#__menu'
					);

					$title = 'menu';
					break;
			}
		}

		return array(
			'fields'  => $fields,
			'support' => $support,
			'tables'  => $tables,
			'joins'   => $joins,
			'title'   => $title
		);
	}
}
components/com_menus/helpers/menus.php000060400000033303152453623440014226 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

use Joomla\CMS\Menu\MenuHelper;
use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;

defined('_JEXEC') or die;

/**
 * Menus component helper.
 *
 * @since  1.6
 */
class MenusHelper
{
	/**
	 * Defines the valid request variables for the reverse lookup.
	 *
	 * @since   1.6
	 */
	protected static $_filter = array('option', 'view', 'layout');

	/**
	 * Configure the Linkbar.
	 *
	 * @param   string  $vName  The name of the active view.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public static function addSubmenu($vName)
	{
		JHtmlSidebar::addEntry(
			JText::_('COM_MENUS_SUBMENU_MENUS'),
			'index.php?option=com_menus&view=menus',
			$vName == 'menus'
		);
		JHtmlSidebar::addEntry(
			JText::_('COM_MENUS_SUBMENU_ITEMS'),
			'index.php?option=com_menus&view=items',
			$vName == 'items'
		);
	}

	/**
	 * Gets a list of the actions that can be performed.
	 *
	 * @param   integer  $parentId  The menu ID.
	 *
	 * @return  JObject
	 *
	 * @since   1.6
	 * @deprecated  3.2  Use JHelperContent::getActions() instead
	 */
	public static function getActions($parentId = 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('com_menus');
	}

	/**
	 * Gets a standard form of a link for lookups.
	 *
	 * @param   mixed  $request  A link string or array of request variables.
	 *
	 * @return  mixed  A link in standard option-view-layout form, or false if the supplied response is invalid.
	 *
	 * @since   1.6
	 */
	public static function getLinkKey($request)
	{
		if (empty($request))
		{
			return false;
		}

		// Check if the link is in the form of index.php?...
		if (is_string($request))
		{
			$args = array();

			if (strpos($request, 'index.php') === 0)
			{
				parse_str(parse_url(htmlspecialchars_decode($request), PHP_URL_QUERY), $args);
			}
			else
			{
				parse_str($request, $args);
			}

			$request = $args;
		}

		// Only take the option, view and layout parts.
		foreach ($request as $name => $value)
		{
			if ((!in_array($name, self::$_filter)) && (!($name == 'task' && !array_key_exists('view', $request))))
			{
				// Remove the variables we want to ignore.
				unset($request[$name]);
			}
		}

		ksort($request);

		return 'index.php?' . http_build_query($request, '', '&');
	}

	/**
	 * Get the menu list for create a menu module
	 *
	 * @param   int  $clientId  Optional client id - viz 0 = site, 1 = administrator, can be NULL for all
	 *
	 * @return  array  The menu array list
	 *
	 * @since    1.6
	 */
	public static function getMenuTypes($clientId = 0)
	{
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('a.menutype')
			->from('#__menu_types AS a');

		if (isset($clientId))
		{
			$query->where('a.client_id = ' . (int) $clientId);
		}

		$db->setQuery($query);

		return $db->loadColumn();
	}

	/**
	 * Get a list of menu links for one or all menus.
	 *
	 * @param   string   $menuType   An option menu to filter the list on, otherwise all menu with given client id links
	 *                               are returned as a grouped array.
	 * @param   integer  $parentId   An optional parent ID to pivot results around.
	 * @param   integer  $mode       An optional mode. If parent ID is set and mode=2, the parent and children are excluded from the list.
	 * @param   array    $published  An optional array of states
	 * @param   array    $languages  Optional array of specify which languages we want to filter
	 * @param   int      $clientId   Optional client id - viz 0 = site, 1 = administrator, can be NULL for all (used only if menutype not givein)
	 *
	 * @return  array
	 *
	 * @since   1.6
	 */
	public static function getMenuLinks($menuType = null, $parentId = 0, $mode = 0, $published = array(), $languages = array(), $clientId = 0)
	{
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('DISTINCT(a.id) AS value,
					  a.title AS text,
					  a.alias,
					  a.level,
					  a.menutype,
					  a.client_id,
					  a.type,
					  a.published,
					  a.template_style_id,
					  a.checked_out,
					  a.language,
					  a.lft'
			)
			->from('#__menu AS a');

		$query->select('e.name as componentname, e.element')
			->join('left', '#__extensions e ON e.extension_id = a.component_id');

		if (JLanguageMultilang::isEnabled())
		{
			$query->select('l.title AS language_title, l.image AS language_image, l.sef AS language_sef')
				->join('LEFT', $db->quoteName('#__languages') . ' AS l ON l.lang_code = a.language');
		}

		// Filter by the type if given, this is more specific than client id
		if ($menuType)
		{
			$query->where('(a.menutype = ' . $db->quote($menuType) . ' OR a.parent_id = 0)');
		}
		elseif (isset($clientId))
		{
			$query->where('a.client_id = ' . (int) $clientId);
		}

		// Prevent the parent and children from showing if requested.
		if ($parentId && $mode == 2)
		{
			$query->join('LEFT', '#__menu AS p ON p.id = ' . (int) $parentId)
				->where('(a.lft <= p.lft OR a.rgt >= p.rgt)');
		}

		if (!empty($languages))
		{
			if (is_array($languages))
			{
				$languages = '(' . implode(',', array_map(array($db, 'quote'), $languages)) . ')';
			}

			$query->where('a.language IN ' . $languages);
		}

		if (!empty($published))
		{
			if (is_array($published))
			{
				$published = '(' . implode(',', $published) . ')';
			}

			$query->where('a.published IN ' . $published);
		}

		$query->where('a.published != -2');
		$query->order('a.lft ASC');

		// Get the options.
		$db->setQuery($query);

		try
		{
			$links = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $e->getMessage());

			return false;
		}

		if (empty($menuType))
		{
			// If the menutype is empty, group the items by menutype.
			$query->clear()
				->select('*')
				->from('#__menu_types')
				->where('menutype <> ' . $db->quote(''))
				->order('title, menutype');

			if (isset($clientId))
			{
				$query->where('client_id = ' . (int) $clientId);
			}

			$db->setQuery($query);

			try
			{
				$menuTypes = $db->loadObjectList();
			}
			catch (RuntimeException $e)
			{
				JError::raiseWarning(500, $e->getMessage());

				return false;
			}

			// Create a reverse lookup and aggregate the links.
			$rlu = array();

			foreach ($menuTypes as &$type)
			{
				$rlu[$type->menutype] = & $type;
				$type->links = array();
			}

			// Loop through the list of menu links.
			foreach ($links as &$link)
			{
				if (isset($rlu[$link->menutype]))
				{
					$rlu[$link->menutype]->links[] = & $link;

					// Cleanup garbage.
					unset($link->menutype);
				}
			}

			return $menuTypes;
		}
		else
		{
			return $links;
		}
	}

	/**
	 * Get the associations
	 *
	 * @param   integer  $pk  Menu item id
	 *
	 * @return  array
	 *
	 * @since   3.0
	 */
	public static function getAssociations($pk)
	{
		$langAssociations = JLanguageAssociations::getAssociations('com_menus', '#__menu', 'com_menus.item', $pk, 'id', '', '');
		$associations     = array();

		foreach ($langAssociations as $langAssociation)
		{
			$associations[$langAssociation->language] = $langAssociation->id;
		}

		return $associations;
	}

	/**
	 * Load the menu items from database for the given menutype
	 *
	 * @param   string   $menutype     The selected menu type
	 * @param   boolean  $enabledOnly  Whether to load only enabled/published menu items.
	 * @param   int[]    $exclude      The menu items to exclude from the list
	 *
	 * @return  array
	 *
	 * @since   3.8.0
	 *
	 * @deprecated  4.0  This method will return a node object to iterate over in 4.0. 
	 */
	public static function getMenuItems($menutype, $enabledOnly = false, $exclude = array())
	{
		$db    = JFactory::getDbo();
		$query = $db->getQuery(true);

		// Prepare the query.
		$query->select('m.*')
			->from('#__menu AS m')
			->where('m.menutype = ' . $db->q($menutype))
			->where('m.client_id = 1')
			->where('m.id > 1');

		if ($enabledOnly)
		{
			$query->where('m.published = 1');
		}

		// Filter on the enabled states.
		$query->select('e.element')
			->join('LEFT', '#__extensions AS e ON m.component_id = e.extension_id')
			->where('(e.enabled = 1 OR e.enabled IS NULL)');

		if (count($exclude))
		{
			$exId = array_filter($exclude, 'is_numeric');
			$exEl = array_filter($exclude, 'is_string');

			if ($exId)
			{
				$query->where('m.id NOT IN (' . implode(', ', array_map('intval', $exId)) . ')');
				$query->where('m.parent_id NOT IN (' . implode(', ', array_map('intval', $exId)) . ')');
			}

			if ($exEl)
			{
				$query->where('e.element NOT IN (' . implode(', ', $db->quote($exEl)) . ')');
			}
		}

		// Order by lft.
		$query->order('m.lft');

		$db->setQuery($query);

		try
		{
			$menuItems = $db->loadObjectList();

			foreach ($menuItems as &$menuitem)
			{
				$menuitem->params = new Registry($menuitem->params);
			}
		}
		catch (RuntimeException $e)
		{
			$menuItems = array();

			JFactory::getApplication()->enqueueMessage(JText::_('JERROR_AN_ERROR_HAS_OCCURRED'), 'error');
		}

		return $menuItems;
	}

	/**
	 * Method to install a preset menu into database and link them to the given menutype
	 *
	 * @param   string  $preset    The preset name
	 * @param   string  $menutype  The target menutype
	 *
	 * @return  void
	 *
	 * @throws  Exception
	 *
	 * @since   3.8.0
	 */
	public static function installPreset($preset, $menutype)
	{
		$items = MenuHelper::loadPreset($preset, false);

		if (count($items) == 0)
		{
			throw new Exception(JText::_('COM_MENUS_PRESET_LOAD_FAILED'));
		}

		static::installPresetItems($items, $menutype, 1);
	}

	/**
	 * Method to install a preset menu item into database and link it to the given menutype
	 *
	 * @param   stdClass[]  $items     The single menuitem instance with a list of its descendants
	 * @param   string      $menutype  The target menutype
	 * @param   int         $parent    The parent id or object
	 *
	 * @return  void
	 *
	 * @throws  Exception
	 *
	 * @since   3.8.0
	 */
	protected static function installPresetItems(&$items, $menutype, $parent = 1)
	{
		$db    = JFactory::getDbo();
		$query = $db->getQuery(true);

		static $components = array();

		if (!$components)
		{
			$query->select('extension_id, element')->from('#__extensions')->where('type = ' . $db->q('component'));
			$components = $db->setQuery($query)->loadObjectList();
			$components = ArrayHelper::getColumn((array) $components, 'element', 'extension_id');
		}

		$dispatcher = JEventDispatcher::getInstance();
		$dispatcher->trigger('onPreprocessMenuItems', array('com_menus.administrator.import', &$items, null, true));

		foreach ($items as &$item)
		{
			/** @var  JTableMenu  $table */
			$table = JTable::getInstance('Menu');

			$item->alias = $menutype . '-' . $item->title;

			if ($item->type == 'separator')
			{
				// Do not reuse a separator
				$item->title = $item->title ?: '-';
				$item->alias = microtime(true);
			}
			elseif ($item->type == 'heading' || $item->type == 'container')
			{
				// Try to match an existing record to have minimum collision for a heading
				$keys  = array(
					'menutype'  => $menutype,
					'type'      => $item->type,
					'title'     => $item->title,
					'parent_id' => $parent,
					'client_id' => 1,
				);
				$table->load($keys);
			}
			elseif ($item->type == 'url' || $item->type == 'component')
			{
				if (substr($item->link, 0, 8) === 'special:')
				{
					$special = substr($item->link, 8);

					if ($special === 'language-forum')
					{
						$item->link = 'index.php?option=com_admin&amp;view=help&amp;layout=langforum';
					}
					elseif ($special === 'custom-forum')
					{
						$item->link = '';
					}
				}

				// Try to match an existing record to have minimum collision for a link
				$keys  = array(
					'menutype'  => $menutype,
					'type'      => $item->type,
					'link'      => $item->link,
					'parent_id' => $parent,
					'client_id' => 1,
				);
				$table->load($keys);
			}

			// Translate "hideitems" param value from "element" into "menu-item-id"
			if ($item->type == 'container' && count($hideitems = (array) $item->params->get('hideitems')))
			{
				foreach ($hideitems as &$hel)
				{
					if (!is_numeric($hel))
					{
						$hel = array_search($hel, $components);
					}
				}

				$query->clear()->select('id')->from('#__menu')->where('component_id IN (' . implode(', ', $hideitems) . ')');
				$hideitems = $db->setQuery($query)->loadColumn();

				$item->params->set('hideitems', $hideitems);
			}

			$record = array(
				'menutype'     => $menutype,
				'title'        => $item->title,
				'alias'        => $item->alias,
				'type'         => $item->type,
				'link'         => $item->link,
				'browserNav'   => $item->browserNav ? 1 : 0,
				'img'          => $item->class,
				'access'       => $item->access,
				'component_id' => array_search($item->element, $components),
				'parent_id'    => $parent,
				'client_id'    => 1,
				'published'    => 1,
				'language'     => '*',
				'home'         => 0,
				'params'       => (string) $item->params,
			);

			if (!$table->bind($record))
			{
				throw new Exception('Bind failed: ' . $table->getError());
			}

			$table->setLocation($parent, 'last-child');

			if (!$table->check())
			{
				throw new Exception('Check failed: ' . $table->getError());
			}

			if (!$table->store())
			{
				throw new Exception('Saved failed: ' . $table->getError());
			}

			$item->id = $table->get('id');

			if (!empty($item->submenu))
			{
				static::installPresetItems($item->submenu, $menutype, $item->id);
			}
		}
	}
}
components/com_menus/helpers/html/menus.php000060400000012676152453623440015204 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

JLoader::register('MenusHelper', JPATH_ADMINISTRATOR . '/components/com_menus/helpers/menus.php');

/**
 * Menus HTML helper class.
 *
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 * @since       1.7
 */
abstract class MenusHtmlMenus
{
	/**
	 * Generate the markup to display the item associations
	 *
	 * @param   int  $itemid  The menu item id
	 *
	 * @return  string
	 *
	 * @since   3.0
	 *
	 * @throws Exception If there is an error on the query
	 */
	public static function association($itemid)
	{
		// Defaults
		$html = '';

		// Get the associations
		if ($associations = MenusHelper::getAssociations($itemid))
		{
			// Get the associated menu items
			$db = JFactory::getDbo();
			$query = $db->getQuery(true)
				->select('m.id, m.title')
				->select('l.sef as lang_sef, l.lang_code')
				->select('mt.title as menu_title')
				->from('#__menu as m')
				->join('LEFT', '#__menu_types as mt ON mt.menutype=m.menutype')
				->where('m.id IN (' . implode(',', array_values($associations)) . ')')
				->where('m.id != ' . $itemid)
				->join('LEFT', '#__languages as l ON m.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);
			}

			// Construct html
			if ($items)
			{
				foreach ($items as &$item)
				{
					$text = strtoupper($item->lang_sef);
					$url = JRoute::_('index.php?option=com_menus&task=item.edit&id=' . (int) $item->id);

					$tooltip = htmlspecialchars($item->title, ENT_QUOTES, 'UTF-8') . '<br />' . JText::sprintf('COM_MENUS_MENU_SPRINTF', $item->menu_title);
					$classes = 'hasPopover label label-association label-' . $item->lang_sef;

					$item->link = '<a href="' . $url . '" title="' . $item->language_title . '" class="' . $classes
						. '" data-content="' . $tooltip . '" data-placement="top">'
						. $text . '</a>';
				}
			}

			JHtml::_('bootstrap.popover');

			$html = JLayoutHelper::render('joomla.content.associations', $items);
		}

		return $html;
	}

	/**
	 * Returns a published 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   1.7.1
	 */
	public static function state($value, $i, $enabled = true, $checkbox = 'cb')
	{
		$states = array(
			9  => array(
				'unpublish',
				'',
				'COM_MENUS_HTML_UNPUBLISH_HEADING',
				'',
				true,
				'publish',
				'publish',
			),
			8  => array(
				'publish',
				'',
				'COM_MENUS_HTML_PUBLISH_HEADING',
				'',
				true,
				'unpublish',
				'unpublish',
			),
			7  => array(
				'unpublish',
				'',
				'COM_MENUS_HTML_UNPUBLISH_SEPARATOR',
				'',
				true,
				'publish',
				'publish',
			),
			6  => array(
				'publish',
				'',
				'COM_MENUS_HTML_PUBLISH_SEPARATOR',
				'',
				true,
				'unpublish',
				'unpublish',
			),
			5  => array(
				'unpublish',
				'',
				'COM_MENUS_HTML_UNPUBLISH_ALIAS',
				'',
				true,
				'publish',
				'publish',
			),
			4  => array(
				'publish',
				'',
				'COM_MENUS_HTML_PUBLISH_ALIAS',
				'',
				true,
				'unpublish',
				'unpublish',
			),
			3  => array(
				'unpublish',
				'',
				'COM_MENUS_HTML_UNPUBLISH_URL',
				'',
				true,
				'publish',
				'publish',
			),
			2  => array(
				'publish',
				'',
				'COM_MENUS_HTML_PUBLISH_URL',
				'',
				true,
				'unpublish',
				'unpublish',
			),
			1  => array(
				'unpublish',
				'COM_MENUS_EXTENSION_PUBLISHED_ENABLED',
				'COM_MENUS_HTML_UNPUBLISH_ENABLED',
				'COM_MENUS_EXTENSION_PUBLISHED_ENABLED',
				true,
				'publish',
				'publish',
			),
			0  => array(
				'publish',
				'COM_MENUS_EXTENSION_UNPUBLISHED_ENABLED',
				'COM_MENUS_HTML_PUBLISH_ENABLED',
				'COM_MENUS_EXTENSION_UNPUBLISHED_ENABLED',
				true,
				'unpublish',
				'unpublish',
			),
			-1 => array(
				'unpublish',
				'COM_MENUS_EXTENSION_PUBLISHED_DISABLED',
				'COM_MENUS_HTML_UNPUBLISH_DISABLED',
				'COM_MENUS_EXTENSION_PUBLISHED_DISABLED',
				true,
				'warning',
				'warning',
			),
			-2 => array(
				'publish',
				'COM_MENUS_EXTENSION_UNPUBLISHED_DISABLED',
				'COM_MENUS_HTML_PUBLISH_DISABLED',
				'COM_MENUS_EXTENSION_UNPUBLISHED_DISABLED',
				true,
				'trash',
				'trash',
			),
			-3 => array(
				'publish',
				'',
				'COM_MENUS_HTML_PUBLISH',
				'',
				true,
				'trash',
				'trash',
			),
		);

		return JHtml::_('jgrid.state', $states, $value, $i, 'items.', $enabled, true, $checkbox);
	}

	/**
	 * Returns a visibility state on a grid
	 *
	 * @param   integer  $params  Params of item.
	 *
	 * @return  string  The Html code
	 *
	 * @since   3.7.0
	 */
	public static function visibility($params)
	{
		$registry = new Registry;

		try
		{
			$registry->loadString($params);
		}
		catch (Exception $e)
		{
			// Invalid JSON
		}

		$show_menu = $registry->get('menu_show');

		return ($show_menu === 0) ? '<span class="label">' . JText::_('COM_MENUS_LABEL_HIDDEN') . '</span>' : '';
	}
}
components/com_menus/views/menu/tmpl/edit.xml000060400000000300152453623440015437 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_MENUS_MENU_VIEW_EDIT_TITLE">
		<message>
			<![CDATA[COM_MENUS_MENU_VIEW_EDIT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_menus/views/menu/tmpl/edit.php000060400000003562152453623440015443 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.core');
JHtml::_('behavior.formvalidator');
JHtml::_('formbehavior.chosen', 'select');

JText::script('ERROR');

JFactory::getDocument()->addScriptDeclaration("
		Joomla.submitbutton = function(task)
		{
			var form = document.getElementById('item-form');
			if (task == 'menu.cancel' || document.formvalidator.isValid(form))
			{
				Joomla.submitform(task, form);
			}
		};
");
?>
<form action="<?php echo JRoute::_('index.php?option=com_menus&layout=edit&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="item-form">

	<?php echo JLayoutHelper::render('joomla.edit.title_alias', $this); ?>

	<div class="form-horizontal">
		<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'details')); ?>

			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'details', JText::_('COM_MENUS_MENU_DETAILS')); ?>

			<?php
			echo $this->form->renderField('menutype');

			echo $this->form->renderField('description');

			echo $this->form->renderField('client_id');

			echo $this->form->renderField('preset');
			?>

			<?php echo JHtml::_('bootstrap.endTab'); ?>

			<?php if ($this->canDo->get('core.admin')) : ?>
				<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'permissions', JText::_('COM_MENUS_FIELDSET_RULES')); ?>
					<?php echo $this->form->getInput('rules'); ?>
				<?php echo JHtml::_('bootstrap.endTab'); ?>
			<?php endif; ?>

		<?php echo JHtml::_('bootstrap.endTabSet'); ?>
		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>

	</div>
</form>
components/com_menus/views/menu/view.html.php000060400000004567152453623440015465 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * The HTML Menus Menu Item View.
 *
 * @since  1.6
 */
class MenusViewMenu extends JViewLegacy
{
	/**
	 * @var  JForm
	 */
	protected $form;

	/**
	 * @var  mixed
	 */
	protected $item;

	/**
	 * @var  JObject
	 */
	protected $state;

	/**
	 *
	 * @var  JObject
	 */
	protected $canDo;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		$this->form	 = $this->get('Form');
		$this->item	 = $this->get('Item');
		$this->state = $this->get('State');

		$this->canDo = JHelperContent::getActions('com_menus', 'menu', $this->item->id);

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		parent::display($tpl);
		$this->addToolbar();
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		$input = JFactory::getApplication()->input;
		$input->set('hidemainmenu', true);

		$isNew = ($this->item->id == 0);

		JToolbarHelper::title(JText::_($isNew ? 'COM_MENUS_VIEW_NEW_MENU_TITLE' : 'COM_MENUS_VIEW_EDIT_MENU_TITLE'), 'list menu');

		// If a new item, can save the item.  Allow users with edit permissions to apply changes to prevent returning to grid.
		if ($isNew && $this->canDo->get('core.create'))
		{
			if ($this->canDo->get('core.edit'))
			{
				JToolbarHelper::apply('menu.apply');
			}

			JToolbarHelper::save('menu.save');
		}

		// If user can edit, can save the item.
		if (!$isNew && $this->canDo->get('core.edit'))
		{
			JToolbarHelper::apply('menu.apply');
			JToolbarHelper::save('menu.save');
		}

		// If the user can create new items, allow them to see Save & New
		if ($this->canDo->get('core.create'))
		{
			JToolbarHelper::save2new('menu.save2new');
		}

		if ($isNew)
		{
			JToolbarHelper::cancel('menu.cancel');
		}
		else
		{
			JToolbarHelper::cancel('menu.cancel', 'JTOOLBAR_CLOSE');
		}

		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_MENUS_MENU_MANAGER_EDIT');
	}
}
components/com_menus/views/menu/view.xml.php000060400000006624152453623440015315 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

use Joomla\CMS\Menu\MenuHelper;

/**
 * The HTML Menus Menu Item View.
 *
 * @since  3.8.0
 */
class MenusViewMenu extends JViewLegacy
{
	/**
	 * @var  stdClass[]
	 *
	 * @since  3.8.0
	 */
	protected $items;

	/**
	 * @var  JObject
	 *
	 * @since  3.8.0
	 */
	protected $state;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 *
	 * @since   3.8.0
	 */
	public function display($tpl = null)
	{
		$app      = JFactory::getApplication();
		$menutype = $app->input->getCmd('menutype');

		if ($menutype)
		{
			$items = MenusHelper::getMenuItems($menutype, true);
		}

		if (empty($items))
		{
			JLog::add(JText::_('COM_MENUS_SELECT_MENU_FIRST_EXPORT'), JLog::WARNING, 'jerror');

			$app->redirect(JRoute::_('index.php?option=com_menus&view=menus', false));

			return;
		}

		$this->items = MenuHelper::createLevels($items);

		$xml = new SimpleXMLElement('<menu ' .
			'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' .
			'xmlns="urn:joomla.org"	xsi:schemaLocation="urn:joomla.org menu.xsd"' .
			'></menu>'
		);

		foreach ($this->items as $item)
		{
			$this->addXmlChild($xml, $item);
		}

		if (headers_sent($file, $line))
		{
			JLog::add("Headers already sent at $file:$line.", JLog::ERROR, 'jerror');

			return;
		}

		header('content-type: application/xml');
		header('content-disposition: attachment; filename="' . $menutype . '.xml"');
		header("Cache-Control: no-cache, must-revalidate");
		header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
		header('Pragma: private');

		$dom = new DOMDocument;
		$dom->preserveWhiteSpace = true;
		$dom->formatOutput = true;
		$dom->loadXML($xml->asXML());

		echo $dom->saveXML();

		$app->close();
	}

	/**
	 * Add a child node to the xml
	 *
	 * @param   SimpleXMLElement  $xml   The current XML node which would become the parent to the new node
	 * @param   stdClass          $item  The menuitem object to create the child XML node from
	 *
	 * @return  void
	 *
	 * @since   3.8.0
	 */
	protected function addXmlChild($xml, $item)
	{
		$node = $xml->addChild('menuitem');

		$node['type'] = $item->type;

		if ($item->title)
		{
			$node['title'] = $item->title;
		}

		if ($item->link)
		{
			$node['link'] = $item->link;
		}

		if ($item->element)
		{
			$node['element'] = $item->element;
		}

		if ($item->class)
		{
			$node['class'] = $item->class;
		}

		if ($item->access)
		{
			$node['access'] = $item->access;
		}

		if ($item->browserNav)
		{
			$node['target'] = '_blank';
		}

		if (count($item->params))
		{
			$hideitems = $item->params->get('hideitems');

			if (count($hideitems))
			{
				$db    = JFactory::getDbo();
				$query = $db->getQuery(true);

				$query->select('e.element')->from('#__extensions e')
					->join('inner', '#__menu m ON m.component_id = e.extension_id')
					->where('m.id IN (' . implode(', ', $db->quote($hideitems)) . ')');

				$hideitems = $db->setQuery($query)->loadColumn();

				$item->params->set('hideitems', $hideitems);
			}

			$node->addChild('params', (string) $item->params);
		}

		foreach ($item->submenu as $sub)
		{
			$this->addXmlChild($node, $sub);
		}
	}
}
components/com_menus/views/items/tmpl/default_batch_body.php000060400000005460152453623440020474 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

$options = array(
	JHtml::_('select.option', 'c', JText::_('JLIB_HTML_BATCH_COPY')),
	JHtml::_('select.option', 'm', JText::_('JLIB_HTML_BATCH_MOVE'))
);
$published = (int) $this->state->get('filter.published');
$clientId  = (int) $this->state->get('filter.client_id');
$menuType  = JFactory::getApplication()->getUserState('com_menus.items.menutype');
if ($clientId == 1) :
	JFactory::getDocument()->addScriptDeclaration(
		'
			jQuery(document).ready(function($){
				if ($("#batch-menu-id").length){var batchSelector = $("#batch-menu-id");}
				if ($("#batch-copy-move").length) {
					$("#batch-copy-move").hide();
					batchSelector.on("change", function(){
						if (batchSelector.val() != 0 || batchSelector.val() != "") {
							$("#batch-copy-move").show();
						} else {
							$("#batch-copy-move").hide();
						}
					});
				}
			});
		'
	);
endif;

?>
<div class="container-fluid">
	<?php if (strlen($menuType) && $menuType != '*') : ?>
	<?php if ($clientId != 1) : ?>
	<div class="row-fluid">
		<div class="control-group span6">
			<div class="controls">
				<?php echo JHtml::_('batch.language'); ?>
			</div>
		</div>
		<div class="control-group span6">
			<div class="controls">
				<?php echo JHtml::_('batch.access'); ?>
			</div>
		</div>
	</div>
	<?php endif; ?>
	<div class="row-fluid">
		<?php if ($published >= 0) : ?>
			<div id="batch-choose-action" class="combo control-group">
				<label id="batch-choose-action-lbl" class="control-label" for="batch-menu-id">
					<?php echo JText::_('COM_MENUS_BATCH_MENU_LABEL'); ?>
				</label>
				<div class="controls">
					<select name="batch[menu_id]" id="batch-menu-id">
						<option value=""><?php echo JText::_('JLIB_HTML_BATCH_NO_CATEGORY'); ?></option>
						<?php
						$opts     = array(
							'published' => $this->state->get('filter.published'),
							'checkacl'  => (int) $this->state->get('menutypeid'),
							'clientid'  => (int) $clientId,
						);
						echo JHtml::_('select.options', JHtml::_('menu.menuitems', $opts));
						?>
					</select>
				</div>
			</div>
			<div id="batch-copy-move" class="control-group radio">
				<?php echo JText::_('JLIB_HTML_BATCH_MOVE_QUESTION'); ?>
				<?php echo JHtml::_('select.radiolist', $options, 'batch[move_copy]', '', 'value', 'text', 'm'); ?>
			</div>
		<?php endif; ?>

		<?php if ($published < 0 && $clientId == 1): ?>
			<p><?php echo JText::_('COM_MENUS_SELECT_MENU_FILTER_NOT_TRASHED'); ?></p>
		<?php endif; ?>
	</div>
	<?php else : ?>
	<div class="row-fluid">
		<p><?php echo JText::_('COM_MENUS_SELECT_MENU_FIRST'); ?></p>
	</div>
	<?php endif; ?>
</div>
components/com_menus/views/items/tmpl/default_batch_footer.php000060400000001763152453623440021037 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;
$published = $this->state->get('filter.published');
$clientId  = $this->state->get('filter.client_id');
$menuType = JFactory::getApplication()->getUserState('com_menus.items.menutype');
?>
<button type="button" class="btn" onclick="document.getElementById('batch-menu-id').value='';document.getElementById('batch-access').value='';document.getElementById('batch-language-id').value=''" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<?php if ((strlen($menuType) && $menuType != '*' && $clientId == 0) || ($published >= 0 && $clientId == 1)): ?>
	<button type="submit" class="btn btn-success" onclick="Joomla.submitbutton('item.batch');return false;">
		<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
	</button>
<?php endif; ?>
components/com_menus/views/items/tmpl/default.xml000060400000000773152453623440016331 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_MENUS_ITEMS_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_MENUS_ITEMS_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
	<fieldset name="request">
		<fields name="request">
			<field
				name="menutype"
				type="menu"
				label="COM_MENUS_ITEMS_CHOOSE_MENU_LABEL"
				description="COM_MENUS_ITEMS_CHOOSE_MENU_DESC"
				clientid=""
				>
				<option value="">COM_MENUS_SELECT_MENU</option>
			</field>
		</fields>
	</fieldset>
</metadata>
components/com_menus/views/items/tmpl/default.php000060400000027003152453623440016313 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$user       = JFactory::getUser();
$app        = JFactory::getApplication();
$userId     = $user->get('id');
$listOrder  = $this->escape($this->state->get('list.ordering'));
$listDirn   = $this->escape($this->state->get('list.direction'));
$ordering   = ($listOrder == 'a.lft');
$saveOrder  = ($listOrder == 'a.lft' && strtolower($listDirn) == 'asc');
$menuType   = (string) $app->getUserState('com_menus.items.menutype', '', 'string');

if ($saveOrder && $menuType)
{
	$saveOrderingUrl = 'index.php?option=com_menus&task=items.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'itemList', 'adminForm', strtolower($listDirn), $saveOrderingUrl, false, true);
}

$assoc   = JLanguageAssociations::isEnabled() && $this->state->get('filter.client_id') == 0;
$colSpan = $assoc ? 10 : 9;

if ($menuType == '')
{
	$colSpan--;
}
?>
<?php // Set up the filter bar. ?>
<form action="<?php echo JRoute::_('index.php?option=com_menus&view=items'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this, 'options' => array('selectorFieldName' => 'menutype'))); ?>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped" id="itemList">
				<thead>
					<tr>
						<?php if ($menuType) : ?>
							<th width="1%" class="nowrap center hidden-phone">
								<?php echo JHtml::_('searchtools.sort', '', 'a.lft', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING', 'icon-menu-2'); ?>
							</th>
						<?php endif; ?>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.published', $listDirn, $listOrder); ?>
						</th>
						<th class="title">
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
						</th>
						<th class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_MENUS_HEADING_MENU', 'menutype_title', $listDirn, $listOrder); ?>
						</th>
						<?php if ($this->state->get('filter.client_id') == 0) : ?>
						<th width="5%" class="center nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_MENUS_HEADING_HOME', 'a.home', $listDirn, $listOrder); ?>
						</th>
						<?php endif; ?>
						<?php if ($this->state->get('filter.client_id') == 0) : ?>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort',  'JGRID_HEADING_ACCESS', 'a.access', $listDirn, $listOrder); ?>
						</th>
						<?php endif; ?>
						<?php if ($assoc) : ?>
							<th width="5%" class="nowrap hidden-phone">
								<?php echo JHtml::_('searchtools.sort', 'COM_MENUS_HEADING_ASSOCIATION', 'association', $listDirn, $listOrder); ?>
							</th>
						<?php endif; ?>
						<?php if ($this->state->get('filter.client_id') == 0) : ?>
						<th width="15%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'language', $listDirn, $listOrder); ?>
						</th>
						<?php endif; ?>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="<?php echo $colSpan; ?>">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>

				<tbody>
				<?php

				foreach ($this->items as $i => $item) :
					$orderkey   = array_search($item->id, $this->ordering[$item->parent_id]);
					$canCreate  = $user->authorise('core.create',     'com_menus.menu.' . $item->menutype_id);
					$canEdit    = $user->authorise('core.edit',       'com_menus.menu.' . $item->menutype_id);
					$canCheckin = $user->authorise('core.manage',     'com_checkin') || $item->checked_out == $user->get('id')|| $item->checked_out == 0;
					$canChange  = $user->authorise('core.edit.state', 'com_menus.menu.' . $item->menutype_id) && $canCheckin;

					// Get the parents of item for sorting
					if ($item->level > 1)
					{
						$parentsStr = '';
						$_currentParentId = $item->parent_id;
						$parentsStr = ' ' . $_currentParentId;

						for ($j = 0; $j < $item->level; $j++)
						{
							foreach ($this->ordering as $k => $v)
							{
								$v = implode('-', $v);
								$v = '-' . $v . '-';

								if (strpos($v, '-' . $_currentParentId . '-') !== false)
								{
									$parentsStr .= ' ' . $k;
									$_currentParentId = $k;
									break;
								}
							}
						}
					}
					else
					{
						$parentsStr = '';
					}
					?>
					<tr class="row<?php echo $i % 2; ?>" sortable-group-id="<?php echo $item->parent_id; ?>" item-id="<?php echo $item->id; ?>" parents="<?php echo $parentsStr; ?>" level="<?php echo $item->level; ?>">
						<?php if ($menuType) : ?>
							<td class="order nowrap center hidden-phone">
								<?php
								$iconClass = '';

								if (!$canChange)
								{
									$iconClass = ' inactive';
								}
								elseif (!$saveOrder)
								{
									$iconClass = ' inactive tip-top hasTooltip" title="' . JHtml::_('tooltipText', 'JORDERINGDISABLED');
								}
								?>
								<span class="sortable-handler<?php echo $iconClass ?>">
									<span class="icon-menu" aria-hidden="true"></span>
								</span>
								<?php if ($canChange && $saveOrder) : ?>
									<input type="text" style="display:none" name="order[]" size="5" value="<?php echo $orderkey + 1; ?>" />
								<?php endif; ?>
							</td>
						<?php endif; ?>
						<td class="center">
							<?php echo JHtml::_('grid.id', $i, $item->id); ?>
						</td>
						<td class="center">
							<?php
							// Show protected items as published always. We don't allow state change for them. Show/Hide is the module's job.
							$published = $item->protected ? 3 : $item->published;
							echo JHtml::_('MenusHtml.Menus.state', $published, $i, $canChange && !$item->protected, 'cb'); ?>
						</td>
						<td>
							<?php $prefix = JLayoutHelper::render('joomla.html.treeprefix', array('level' => $item->level)); ?>
							<?php echo $prefix; ?>
							<?php if ($item->checked_out) : ?>
								<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'items.', $canCheckin); ?>
							<?php endif; ?>
							<?php if ($canEdit && !$item->protected) : ?>
								<a class="hasTooltip" href="<?php echo JRoute::_('index.php?option=com_menus&task=item.edit&id=' . (int) $item->id); ?>" title="<?php echo JText::_('JACTION_EDIT'); ?>">
									<?php echo $this->escape($item->title); ?></a>
							<?php else : ?>
								<?php echo $this->escape($item->title); ?>
							<?php endif; ?>
							<span class="small">
							<?php if ($item->type != 'url') : ?>
								<?php if (empty($item->note)) : ?>
									<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias)); ?>
								<?php else : ?>
									<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS_NOTE', $this->escape($item->alias), $this->escape($item->note)); ?>
								<?php endif; ?>
							<?php elseif ($item->type == 'url' && $item->note) : ?>
								<?php echo JText::sprintf('JGLOBAL_LIST_NOTE', $this->escape($item->note)); ?>
							<?php endif; ?>
							</span>
							<?php echo JHtml::_('MenusHtml.Menus.visibility', $item->params); ?>
							<div title="<?php echo $this->escape($item->path); ?>">
								<?php echo $prefix; ?>
								<span class="small"  title="<?php echo isset($item->item_type_desc) ? htmlspecialchars($this->escape($item->item_type_desc), ENT_COMPAT, 'UTF-8') : ''; ?>">
									<?php echo $this->escape($item->item_type); ?></span>
							</div>
						</td>
						<td class="small hidden-phone">
							<?php echo $this->escape($item->menutype_title ?: ucwords($item->menutype)); ?>
						</td>
						<?php if ($this->state->get('filter.client_id') == 0) : ?>
						<td class="center hidden-phone">
							<?php if ($item->type == 'component') : ?>
								<?php if ($item->language == '*' || $item->home == '0') : ?>
									<?php echo JHtml::_('jgrid.isdefault', $item->home, $i, 'items.', ($item->language != '*' || !$item->home) && $canChange && !$item->protected); ?>
								<?php elseif ($canChange) : ?>
									<a href="<?php echo JRoute::_('index.php?option=com_menus&task=items.unsetDefault&cid[]=' . $item->id . '&' . JSession::getFormToken() . '=1'); ?>">
										<?php if ($item->language_image) : ?>
											<?php echo JHtml::_('image', 'mod_languages/' . $item->language_image . '.gif', $item->language_title, array('title' => JText::sprintf('COM_MENUS_GRID_UNSET_LANGUAGE', $item->language_title)), true); ?>
										<?php else : ?>
											<span class="label" title="<?php echo JText::sprintf('COM_MENUS_GRID_UNSET_LANGUAGE', $item->language_title); ?>"><?php echo $item->language_sef; ?></span>
										<?php endif; ?>
									</a>
								<?php else : ?>
									<?php if ($item->language_image) : ?>
										<?php echo JHtml::_('image', 'mod_languages/' . $item->language_image . '.gif', $item->language_title, array('title' => $item->language_title), true); ?>
									<?php else : ?>
										<span class="label" title="<?php echo $item->language_title; ?>"><?php echo $item->language_sef; ?></span>
									<?php endif; ?>
								<?php endif; ?>
							<?php endif; ?>
						</td>
						<?php endif; ?>
						<?php if ($this->state->get('filter.client_id') == 0) : ?>
						<td class="small hidden-phone">
							<?php echo $this->escape($item->access_level); ?>
						</td>
						<?php endif; ?>
						<?php if ($assoc) : ?>
							<td class="small hidden-phone">
								<?php if ($item->association) : ?>
									<?php echo JHtml::_('MenusHtml.Menus.association', $item->id); ?>
								<?php endif; ?>
							</td>
						<?php endif; ?>
						<?php if ($this->state->get('filter.client_id') == 0) : ?>
						<td class="small hidden-phone">
							<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
						</td>
						<?php endif; ?>
						<td class="hidden-phone">
							<span title="<?php echo sprintf('%d-%d', $item->lft, $item->rgt); ?>">
								<?php echo (int) $item->id; ?>
							</span>
						</td>
					</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
			<?php // Load the batch processing form if user is allowed ?>
			<?php if ($user->authorise('core.create', 'com_menus') || $user->authorise('core.edit', 'com_menus')) : ?>
				<?php echo JHtml::_(
					'bootstrap.renderModal',
					'collapseModal',
					array(
						'title' => JText::_('COM_MENUS_BATCH_OPTIONS'),
						'footer' => $this->loadTemplate('batch_footer')
					),
					$this->loadTemplate('batch_body')
				); ?>
			<?php endif; ?>
		<?php endif; ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_menus/views/items/tmpl/modal.php000060400000016777152453623440016003 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$app = JFactory::getApplication();

if ($app->isClient('site'))
{
	JSession::checkToken('get') or die(JText::_('JINVALID_TOKEN'));
}

JHtml::addIncludePath(JPATH_COMPONENT_ADMINISTRATOR . '/helpers/html');

JHtml::_('behavior.core');
JHtml::_('behavior.polyfill', array('event'), 'lt IE 9');
JHtml::_('script', 'com_menus/admin-items-modal.min.js', array('version' => 'auto', 'relative' => true));
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'));

$function     = $app->input->get('function', 'jSelectMenuItem', 'cmd');
$editor    = $app->input->getCmd('editor', '');
$listOrder    = $this->escape($this->state->get('list.ordering'));
$listDirn     = $this->escape($this->state->get('list.direction'));
$link         = 'index.php?option=com_menus&view=items&layout=modal&tmpl=component&' . JSession::getFormToken() . '=1';

if (!empty($editor))
{
	// This view is used also in com_menus. Load the xtd script only if the editor is set!
	JFactory::getDocument()->addScriptOptions('xtd-menus', array('editor' => $editor));
	$onclick = "jSelectMenuItem";
	$link    = 'index.php?option=com_menus&view=items&layout=modal&tmpl=component&editor=' . $editor . '&' . JSession::getFormToken() . '=1';
}
?>
<div class="container-popup">

	<form action="<?php echo JRoute::_($link); ?>" method="post" name="adminForm" id="adminForm" class="form-inline">

		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this, 'options' => array('selectorFieldName' => 'menutype'))); ?>

		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped table-condensed">
				<thead>
					<tr>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.published', $listDirn, $listOrder); ?>
						</th>
						<th class="title">
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
						</th>
						<th class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_MENUS_HEADING_MENU', 'menutype_title', $listDirn, $listOrder); ?>
						</th>
						<th width="5%" class="center nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_MENUS_HEADING_HOME', 'a.home', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort',  'JGRID_HEADING_ACCESS', 'a.access', $listDirn, $listOrder); ?>
						</th>
						<th width="15%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'language', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="7">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
				<?php foreach ($this->items as $i => $item) : ?>
				<?php $uselessMenuItem = in_array($item->type, array('separator', 'heading', 'alias', 'url', 'container')); ?>
					<?php if ($item->language && JLanguageMultilang::isEnabled())
					{
						if ($item->language !== '*')
						{
							$language = $item->language;
						}
						else
						{
							$language = '';
						}
					}
					elseif (!JLanguageMultilang::isEnabled())
					{
						$language = '';
					}
					?>
					<tr class="row<?php echo $i % 2; ?>">
						<td class="center">
							<?php echo JHtml::_('MenusHtml.Menus.state', $item->published, $i, 0); ?>
						</td>
						<td>
							<?php $prefix = JLayoutHelper::render('joomla.html.treeprefix', array('level' => $item->level)); ?>
							<?php echo $prefix; ?>
							<?php if (!$uselessMenuItem) : ?>
								<a class="select-link" href="javascript:void(0)" data-function="<?php echo $this->escape($function); ?>" data-id="<?php echo $item->id; ?>" data-title="<?php echo $this->escape($item->title); ?>" data-uri="<?php echo 'index.php?Itemid=' . $item->id; ?>" data-language="<?php echo $this->escape($language); ?>">
									<?php echo $this->escape($item->title); ?>
								</a>
							<?php else : ?>
								<?php echo $this->escape($item->title); ?>
							<?php endif; ?>
							<span class="small">
								<?php if (empty($item->note)) : ?>
									<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias)); ?>
								<?php else : ?>
									<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS_NOTE', $this->escape($item->alias), $this->escape($item->note)); ?>
								<?php endif; ?>
							</span>
							<div title="<?php echo $this->escape($item->path); ?>">
								<?php echo $prefix; ?>
								<span class="small" title="<?php echo isset($item->item_type_desc) ? htmlspecialchars($this->escape($item->item_type_desc), ENT_COMPAT, 'UTF-8') : ''; ?>">
									<?php echo $this->escape($item->item_type); ?></span>
							</div>
						</td>
						<td class="small hidden-phone">
							<?php echo $this->escape($item->menutype_title); ?>
						</td>
						<td class="center hidden-phone">
							<?php if ($item->type == 'component') : ?>
								<?php if ($item->language == '*' || $item->home == '0') : ?>
									<?php echo JHtml::_('jgrid.isdefault', $item->home, $i, 'items.', ($item->language != '*' || !$item->home) && 0); ?>
								<?php else : ?>
									<?php if ($item->language_image) : ?>
										<?php echo JHtml::_('image', 'mod_languages/' . $item->language_image . '.gif', $item->language_title, array('title' => $item->language_title), true); ?>
									<?php else : ?>
										<span class="label" title="<?php echo $item->language_title; ?>"><?php echo $item->language_sef; ?></span>
									<?php endif; ?>
								<?php endif; ?>
							<?php endif; ?>
						</td>
						<td class="small hidden-phone">
							<?php echo $this->escape($item->access_level); ?>
						</td>
						<td class="small hidden-phone">
							<?php if ($item->language == '') : ?>
								<?php echo JText::_('JDEFAULT'); ?>
							<?php elseif ($item->language == '*') : ?>
								<?php echo JText::alt('JALL', 'language'); ?>
							<?php else : ?>
								<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
							<?php endif; ?>
						</td>
						<td class="hidden-phone">
							<span title="<?php echo sprintf('%d-%d', $item->lft, $item->rgt); ?>">
								<?php echo (int) $item->id; ?>
							</span>
						</td>
					</tr>
				<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif; ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<input type="hidden" name="function" value="<?php echo $function; ?>" />
		<input type="hidden" name="forcedLanguage" value="<?php echo $app->input->get('forcedLanguage', '', 'cmd'); ?>" />
		<?php echo JHtml::_('form.token'); ?>

	</form>
</div>
components/com_menus/views/items/view.html.php000060400000025773152453623440015644 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * The HTML Menus Menu Items View.
 *
 * @since  1.6
 */
class MenusViewItems extends JViewLegacy
{
	/**
	 * @var  array
	 */
	protected $f_levels;

	/**
	 * @var  mixed
	 */
	protected $items;

	/**
	 * @var  JPagination
	 */
	protected $pagination;

	/**
	 * @var  JObject
	 */
	protected $state;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		$lang = JFactory::getLanguage();
		$this->items         = $this->get('Items');
		$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');

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			MenusHelper::addSubmenu('items');
		}

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		$this->ordering = array();

		// Preprocess the list of items to find ordering divisions.
		foreach ($this->items as $item)
		{
			$this->ordering[$item->parent_id][] = $item->id;

			// Item type text
			switch ($item->type)
			{
				case 'url':
					$value = JText::_('COM_MENUS_TYPE_EXTERNAL_URL');
					break;

				case 'alias':
					$value = JText::_('COM_MENUS_TYPE_ALIAS');
					break;

				case 'separator':
					$value = JText::_('COM_MENUS_TYPE_SEPARATOR');
					break;

				case 'heading':
					$value = JText::_('COM_MENUS_TYPE_HEADING');
					break;

				case 'container':
					$value = JText::_('COM_MENUS_TYPE_CONTAINER');
					break;

				case 'component':
				default:
					// Load language
						$lang->load($item->componentname . '.sys', JPATH_ADMINISTRATOR, null, false, true)
					|| $lang->load($item->componentname . '.sys', JPATH_ADMINISTRATOR . '/components/' . $item->componentname, null, false, true);

					if (!empty($item->componentname))
					{
						$titleParts   = array();
						$titleParts[] = JText::_($item->componentname);
						$vars         = null;

						parse_str($item->link, $vars);

						if (isset($vars['view']))
						{
							// Attempt to load the view xml file.
							$file = JPATH_SITE . '/components/' . $item->componentname . '/views/' . $vars['view'] . '/metadata.xml';

							if (!is_file($file))
							{
								$file = JPATH_SITE . '/components/' . $item->componentname . '/view/' . $vars['view'] . '/metadata.xml';
							}

							if (is_file($file) && $xml = simplexml_load_file($file))
							{
								// Look for the first view node off of the root node.
								if ($view = $xml->xpath('view[1]'))
								{
									// Add view title if present.
									if (!empty($view[0]['title']))
									{
										$viewTitle = trim((string) $view[0]['title']);

										// Check if the key is valid. Needed due to B/C so we don't show untranslated keys. This check should be removed with Joomla 4.
										if ($lang->hasKey($viewTitle))
										{
											$titleParts[] = JText::_($viewTitle);
										}
									}
								}
							}

							$vars['layout'] = isset($vars['layout']) ? $vars['layout'] : 'default';

							// Attempt to load the layout xml file.
							// If Alternative Menu Item, get template folder for layout file
							if (strpos($vars['layout'], ':') > 0)
							{
								// Use template folder for layout file
								$temp = explode(':', $vars['layout']);
								$file = JPATH_SITE . '/templates/' . $temp[0] . '/html/' . $item->componentname . '/' . $vars['view'] . '/' . $temp[1] . '.xml';

								// Load template language file
								$lang->load('tpl_' . $temp[0] . '.sys', JPATH_SITE, null, false, true)
								||	$lang->load('tpl_' . $temp[0] . '.sys', JPATH_SITE . '/templates/' . $temp[0], null, false, true);
							}
							else
							{
								$base = $this->state->get('filter.client_id') == 0 ? JPATH_SITE : JPATH_ADMINISTRATOR;

								// Get XML file from component folder for standard layouts
								$file = $base . '/components/' . $item->componentname . '/views/' . $vars['view'] . '/tmpl/' . $vars['layout'] . '.xml';

								if (!file_exists($file))
								{
									$file = $base . '/components/' . $item->componentname . '/view/' . $vars['view'] . '/tmpl/' . $vars['layout'] . '.xml';
								}
							}

							if (is_file($file) && $xml = simplexml_load_file($file))
							{
								// Look for the first view node off of the root node.
								if ($layout = $xml->xpath('layout[1]'))
								{
									if (!empty($layout[0]['title']))
									{
										$titleParts[] = JText::_(trim((string) $layout[0]['title']));
									}
								}

								if (!empty($layout[0]->message[0]))
								{
									$item->item_type_desc = JText::_(trim((string) $layout[0]->message[0]));
								}
							}

							unset($xml);

							// Special case if neither a view nor layout title is found
							if (count($titleParts) == 1)
							{
								$titleParts[] = $vars['view'];
							}
						}

						$value = implode(' » ', $titleParts);
					}
					else
					{
						if (preg_match("/^index.php\?option=([a-zA-Z\-0-9_]*)/", $item->link, $result))
						{
							$value = JText::sprintf('COM_MENUS_TYPE_UNEXISTING', $result[1]);
						}
						else
						{
							$value = JText::_('COM_MENUS_TYPE_UNKNOWN');
						}
					}
					break;
			}

			$item->item_type = $value;
			$item->protected = $item->menutype == 'main';
		}

		// Levels filter.
		$options   = array();
		$options[] = JHtml::_('select.option', '1', JText::_('J1'));
		$options[] = JHtml::_('select.option', '2', JText::_('J2'));
		$options[] = JHtml::_('select.option', '3', JText::_('J3'));
		$options[] = JHtml::_('select.option', '4', JText::_('J4'));
		$options[] = JHtml::_('select.option', '5', JText::_('J5'));
		$options[] = JHtml::_('select.option', '6', JText::_('J6'));
		$options[] = JHtml::_('select.option', '7', JText::_('J7'));
		$options[] = JHtml::_('select.option', '8', JText::_('J8'));
		$options[] = JHtml::_('select.option', '9', JText::_('J9'));
		$options[] = JHtml::_('select.option', '10', JText::_('J10'));

		$this->f_levels = $options;

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();
			$this->sidebar = JHtmlSidebar::render();
		}
		else
		{
			// In menu 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('<field name="language" type="hidden" default="' . $forcedLanguage . '" />');
				$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']);
			}
		}

		// Allow a system plugin to insert dynamic menu types to the list shown in menus:
		JEventDispatcher::getInstance()->trigger('onBeforeRenderMenuItems', array($this));

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		$menutypeId = (int) $this->state->get('menutypeid');

		$canDo = JHelperContent::getActions('com_menus', 'menu', (int) $menutypeId);
		$user  = JFactory::getUser();

		// Get the menu title
		$menuTypeTitle = $this->get('State')->get('menutypetitle');

		// Get the toolbar object instance
		$bar = JToolbar::getInstance('toolbar');

		if ($menuTypeTitle)
		{
			JToolbarHelper::title(JText::sprintf('COM_MENUS_VIEW_ITEMS_MENU_TITLE', $menuTypeTitle), 'list menumgr');
		}
		else
		{
			JToolbarHelper::title(JText::_('COM_MENUS_VIEW_ITEMS_ALL_TITLE'), 'list menumgr');
		}

		if ($canDo->get('core.create'))
		{
			JToolbarHelper::addNew('item.add');
		}

		$protected = $this->state->get('filter.menutype') == 'main';

		if ($canDo->get('core.edit') && !$protected)
		{
			JToolbarHelper::editList('item.edit');
		}

		if ($canDo->get('core.edit.state') && !$protected)
		{
			JToolbarHelper::publish('items.publish', 'JTOOLBAR_PUBLISH', true);
			JToolbarHelper::unpublish('items.unpublish', 'JTOOLBAR_UNPUBLISH', true);
		}

		if (JFactory::getUser()->authorise('core.admin') && !$protected)
		{
			JToolbarHelper::checkin('items.checkin', 'JTOOLBAR_CHECKIN', true);
		}

		if ($canDo->get('core.edit.state') && $this->state->get('filter.client_id') == 0)
		{
			JToolbarHelper::makeDefault('items.setDefault', 'COM_MENUS_TOOLBAR_SET_HOME');
		}

		if (JFactory::getUser()->authorise('core.admin'))
		{
			JToolbarHelper::custom('items.rebuild', 'refresh.png', 'refresh_f2.png', 'JToolbar_Rebuild', false);
		}

		// Add a batch button
		if (!$protected && $user->authorise('core.create', 'com_menus')
			&& $user->authorise('core.edit', 'com_menus')
			&& $user->authorise('core.edit.state', 'com_menus'))
		{
			$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 (!$protected && $this->state->get('filter.published') == -2 && $canDo->get('core.delete'))
		{
			JToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'items.delete', 'JTOOLBAR_EMPTY_TRASH');
		}
		elseif (!$protected && $canDo->get('core.edit.state'))
		{
			JToolbarHelper::trash('items.trash');
		}

		if ($canDo->get('core.admin') || $canDo->get('core.options'))
		{
			JToolbarHelper::divider();
			JToolbarHelper::preferences('com_menus');
		}

		JToolbarHelper::help('JHELP_MENUS_MENU_ITEM_MANAGER');
	}

	/**
	 * 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()
	{
		$this->state = $this->get('State');

		if ($this->state->get('filter.client_id') == 0)
		{
			return array(
				'a.lft'       => JText::_('JGRID_HEADING_ORDERING'),
				'a.published' => JText::_('JSTATUS'),
				'a.title'     => JText::_('JGLOBAL_TITLE'),
				'a.home'      => JText::_('COM_MENUS_HEADING_HOME'),
				'a.access'    => JText::_('JGRID_HEADING_ACCESS'),
				'association' => JText::_('COM_MENUS_HEADING_ASSOCIATION'),
				'language'    => JText::_('JGRID_HEADING_LANGUAGE'),
				'a.id'        => JText::_('JGRID_HEADING_ID')
			);
		}
		else
		{
			return array(
				'a.lft'       => JText::_('JGRID_HEADING_ORDERING'),
				'a.published' => JText::_('JSTATUS'),
				'a.title'     => JText::_('JGLOBAL_TITLE'),
				'a.id'        => JText::_('JGRID_HEADING_ID')
			);
		}
	}
}
components/com_menus/views/menutypes/tmpl/default.php000060400000003564152453623440017231 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$input = JFactory::getApplication()->input;

// Checking if loaded via index.php or component.php
$tmpl = ($input->getCmd('tmpl') != '') ? '1' : '';

JHtml::_('behavior.core');
JFactory::getDocument()->addScriptDeclaration('
		setmenutype = function(type) {
			var tmpl = ' . json_encode($tmpl) . ';
			if (tmpl)
			{
				window.parent.Joomla.submitbutton("item.setType", type);
				window.parent.jQuery("#menuTypeModal").modal("hide");
			}
			else
			{
				window.location="index.php?option=com_menus&view=item&task=item.setType&layout=edit&type=" + type;
			}
		};
');

?>
<?php echo JHtml::_('bootstrap.startAccordion', 'collapseTypes', array('active' => 'slide1')); ?>
	<?php $i = 0; ?>
	<?php foreach ($this->types as $name => $list) : ?>
		<?php echo JHtml::_('bootstrap.addSlide', 'collapseTypes', $name, 'collapse' . ($i++)); ?>
			<ul class="nav nav-tabs nav-stacked">
				<?php foreach ($list as $title => $item) : ?>
					<li>
						<?php $menutype = array('id' => $this->recordId, 'title' => isset($item->type) ? $item->type : $item->title, 'request' => $item->request); ?>
						<?php $menutype = base64_encode(json_encode($menutype)); ?>
						<a class="choose_type" href="#" title="<?php echo JText::_($item->description); ?>"
							onclick="setmenutype('<?php echo $menutype; ?>')">
							<?php echo $title;?>
							<small class="muted">
								<?php echo JText::_($item->description); ?>
							</small>
						</a>
					</li>
				<?php endforeach; ?>
			</ul>
		<?php echo JHtml::_('bootstrap.endSlide'); ?>
	<?php endforeach; ?>
<?php echo JHtml::_('bootstrap.endSlide'); ?>
<?php echo JHtml::_('bootstrap.endAccordion');
components/com_menus/views/menutypes/view.html.php000060400000006332152453623440016542 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * The HTML Menus Menu Item Types View.
 *
 * @since  1.6
 */
class MenusViewMenutypes extends JViewLegacy
{
	/**
	 * @var  JObject[]
	 */
	protected $types;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		$app            = JFactory::getApplication();
		$this->recordId = $app->input->getInt('recordId');

		$types = $this->get('TypeOptions');

		$this->addCustomTypes($types);

		$sortedTypes = array();

		foreach ($types as $name => $list)
		{
			$tmp = array();

			foreach ($list as $item)
			{
				$tmp[JText::_($item->title)] = $item;
			}

			uksort($tmp, 'strcasecmp');
			$sortedTypes[JText::_($name)] = $tmp;
		}

		uksort($sortedTypes, 'strcasecmp');

		$this->types = $sortedTypes;

		$this->addToolbar();

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   3.0
	 */
	protected function addToolbar()
	{
		// Add page title
		JToolbarHelper::title(JText::_('COM_MENUS'), 'list menumgr');

		// Get the toolbar object instance
		$bar = JToolbar::getInstance('toolbar');

		// Cancel
		$title = JText::_('JTOOLBAR_CANCEL');
		$dhtml = "<button onClick=\"location.href='index.php?option=com_menus&view=items'\" class=\"btn\">
					<span class=\"icon-remove\" title=\"$title\"></span>
					$title</button>";
		$bar->appendButton('Custom', $dhtml, 'new');
	}

	/**
	 * Method to add system link types to the link types array
	 *
	 * @param   array  $types  The list of link types
	 *
	 * @return  void
	 *
	 * @since   3.7.0
	 */
	protected function addCustomTypes(&$types)
	{
		if (empty($types))
		{
			$types = array();
		}

		// Adding System Links
		$list           = array();
		$o              = new JObject;
		$o->title       = 'COM_MENUS_TYPE_EXTERNAL_URL';
		$o->type        = 'url';
		$o->description = 'COM_MENUS_TYPE_EXTERNAL_URL_DESC';
		$o->request     = null;
		$list[]         = $o;

		$o              = new JObject;
		$o->title       = 'COM_MENUS_TYPE_ALIAS';
		$o->type        = 'alias';
		$o->description = 'COM_MENUS_TYPE_ALIAS_DESC';
		$o->request     = null;
		$list[]         = $o;

		$o              = new JObject;
		$o->title       = 'COM_MENUS_TYPE_SEPARATOR';
		$o->type        = 'separator';
		$o->description = 'COM_MENUS_TYPE_SEPARATOR_DESC';
		$o->request     = null;
		$list[]         = $o;

		$o              = new JObject;
		$o->title       = 'COM_MENUS_TYPE_HEADING';
		$o->type        = 'heading';
		$o->description = 'COM_MENUS_TYPE_HEADING_DESC';
		$o->request     = null;
		$list[]         = $o;

		if ($this->get('state')->get('client_id') == 1)
		{
			$o              = new JObject;
			$o->title       = 'COM_MENUS_TYPE_CONTAINER';
			$o->type        = 'container';
			$o->description = 'COM_MENUS_TYPE_CONTAINER_DESC';
			$o->request     = null;
			$list[]         = $o;
		}

		$types['COM_MENUS_TYPE_SYSTEM'] = $list;
	}
}
components/com_menus/views/menus/view.html.php000060400000004733152453623440015643 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * The HTML Menus Menu Menus View.
 *
 * @since  1.6
 */
class MenusViewMenus extends JViewLegacy
{
	/**
	 * @var  mixed
	 */
	protected $items;

	/**
	 * @var  array
	 */
	protected $modules;

	/**
	 * @var  JPagination
	 */
	protected $pagination;

	/**
	 * @var  JObject
	 */
	protected $state;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		$this->items      = $this->get('Items');
		$this->modules    = $this->get('Modules');
		$this->pagination = $this->get('Pagination');
		$this->state      = $this->get('State');

		if ($this->getLayout() == 'default')
		{
			$this->filterForm    = $this->get('FilterForm');
			$this->activeFilters = $this->get('ActiveFilters');
		}

		MenusHelper::addSubmenu('menus');

		// 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()
	{
		$canDo = JHelperContent::getActions('com_menus');

		JToolbarHelper::title(JText::_('COM_MENUS_VIEW_MENUS_TITLE'), 'list menumgr');

		if ($canDo->get('core.create'))
		{
			JToolbarHelper::addNew('menu.add');
		}

		if ($canDo->get('core.edit'))
		{
			JToolbarHelper::editList('menu.edit');
		}

		if ($canDo->get('core.delete'))
		{
			JToolbarHelper::divider();
			JToolbarHelper::deleteList('COM_MENUS_MENU_CONFIRM_DELETE', 'menus.delete', 'JTOOLBAR_DELETE');
		}

		JToolbarHelper::custom('menus.rebuild', 'refresh.png', 'refresh_f2.png', 'JTOOLBAR_REBUILD', false);

		if ($canDo->get('core.admin') && $this->state->get('client_id') == 1)
		{
			JToolbarHelper::custom('menu.exportXml', 'download', 'download', 'COM_MENUS_MENU_EXPORT_BUTTON', true);
		}

		if ($canDo->get('core.admin') || $canDo->get('core.options'))
		{
			JToolbarHelper::divider();
			JToolbarHelper::preferences('com_menus');
		}

		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_MENUS_MENU_MANAGER');
	}
}
components/com_menus/views/menus/tmpl/default.xml000060400000000310152453623440016322 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_MENUS_MENUS_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_MENUS_MENUS_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_menus/views/menus/tmpl/default.php000060400000026731152453623440016330 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$uri       = JUri::getInstance();
$return    = base64_encode($uri);
$user      = JFactory::getUser();
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$modMenuId = (int) $this->get('ModMenuId');

$script = array();
$script[] = 'jQuery(document).ready(function() {';

foreach ($this->items as $item) :
	if ($user->authorise('core.edit', 'com_menus')) :
		$script[] = '	function jSelectPosition_' . $item->id . '(name) {';
		$script[] = '		document.getElementById("' . $item->id . '").value = name;';
		$script[] = '		jQuery(".modal").modal("hide");';
		$script[] = '	};';
	endif;
endforeach;

$script[] = '	jQuery(".modal").on("hidden", function () {';
$script[] = '		setTimeout(function(){';
$script[] = '			window.parent.location.reload();';
$script[] = '		},1000);';
$script[] = '	});';
$script[] = '});';
$script[] = '
	(function (originalFn) {
		Joomla.submitform = function(task, form) {
		 	originalFn(task, form);
		 	if (task == "menu.exportXml") {
		 		document.adminForm.task.value = "";
		 	}
		};
	})(Joomla.submitform);
';

JFactory::getDocument()->addScriptDeclaration(implode("\n", $script));
?>
<form action="<?php echo JRoute::_('index.php?option=com_menus&view=menus'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this, 'options' => array('filterButton' => false))); ?>
		<div class="clearfix"> </div>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped" id="menuList">
				<thead>
					<tr>
						<th width="1%">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th>
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap center">
							<span class="icon-publish" aria-hidden="true"></span>
							<span class="hidden-phone"><?php echo JText::_('COM_MENUS_HEADING_PUBLISHED_ITEMS'); ?></span>
						</th>
						<th width="10%" class="nowrap center">
							<span class="icon-unpublish" aria-hidden="true"></span>
							<span class="hidden-phone"><?php echo JText::_('COM_MENUS_HEADING_UNPUBLISHED_ITEMS'); ?></span>
						</th>
						<th width="10%" class="nowrap center">
							<span class="icon-trash" aria-hidden="true"></span>
							<span class="hidden-phone"><?php echo JText::_('COM_MENUS_HEADING_TRASHED_ITEMS'); ?></span>
						</th>
						<th width="20%" class="nowrap center">
							<span class="icon-cube" aria-hidden="true"></span>
							<span class="hidden-phone"><?php echo JText::_('COM_MENUS_HEADING_LINKED_MODULES'); ?></span>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="15">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
				<?php foreach ($this->items as $i => $item) :
					$canEdit        = $user->authorise('core.edit',   'com_menus.menu.' . (int) $item->id);
					$canManageItems = $user->authorise('core.manage', 'com_menus.menu.' . (int) $item->id);
				?>
					<tr class="row<?php echo $i % 2; ?>">
						<td class="center">
							<?php echo JHtml::_('grid.id', $i, $item->id); ?>
						</td>
						<td>
							<?php if ($canManageItems) : ?>
							<a href="<?php echo JRoute::_('index.php?option=com_menus&view=items&menutype=' . $item->menutype); ?>">
								<?php echo $this->escape($item->title); ?></a>
							<?php else : ?>
								<?php echo $this->escape($item->title); ?>
							<?php endif; ?>
							<div class="small">
								<?php echo JText::_('COM_MENUS_MENU_MENUTYPE_LABEL'); ?>:
								<?php if ($canEdit) : ?>
									<a href="<?php echo JRoute::_('index.php?option=com_menus&task=menu.edit&id=' . $item->id); ?>" title="<?php echo $this->escape($item->description); ?>">
									<?php echo $this->escape($item->menutype); ?></a>
								<?php else : ?>
									<?php echo $this->escape($item->menutype); ?>
								<?php endif; ?>
							</div>
						</td>
						<td class="center btns">
							<?php if ($canManageItems) : ?>
								<a class="badge<?php if ($item->count_published > 0) echo ' badge-success'; ?>" href="<?php echo JRoute::_('index.php?option=com_menus&view=items&menutype=' . $item->menutype . '&filter[published]=1'); ?>">
									<?php echo $item->count_published; ?></a>
							<?php else : ?>
								<span class="badge<?php if ($item->count_published > 0) echo ' badge-success'; ?>">
									<?php echo $item->count_published; ?></span>
							<?php endif; ?>
						</td>
						<td class="center btns">
							<?php if ($canManageItems) : ?>
								<a class="badge<?php if ($item->count_unpublished > 0) echo ' badge-important'; ?>" href="<?php echo JRoute::_('index.php?option=com_menus&view=items&menutype=' . $item->menutype . '&filter[published]=0'); ?>">
									<?php echo $item->count_unpublished; ?></a>
							<?php else : ?>
								<span class="badge<?php if ($item->count_unpublished > 0) echo ' badge-important'; ?>">
									<?php echo $item->count_unpublished; ?></span>
							<?php endif; ?>
						</td>
						<td class="center btns">
							<?php if ($canManageItems) : ?>
								<a class="badge<?php if ($item->count_trashed > 0) echo ' badge-inverse'; ?>" href="<?php echo JRoute::_('index.php?option=com_menus&view=items&menutype=' . $item->menutype . '&filter[published]=-2'); ?>">
									<?php echo $item->count_trashed; ?></a>
							<?php else : ?>
								<span class="badge<?php if ($item->count_trashed > 0) echo ' badge-inverse'; ?>">
									<?php echo $item->count_trashed; ?></span>
							<?php endif; ?>
						</td>
						<td class="center">
							<?php if (isset($this->modules[$item->menutype])) : ?>
								<div class="btn-group">
									<button type="button" class="btn btn-small dropdown-toggle" data-toggle="dropdown">
										<?php echo JText::_('COM_MENUS_MODULES'); ?>
										<span class="caret"></span>
									</button>
									<ul class="dropdown-menu dropdown-reverse">
										<?php foreach ($this->modules[$item->menutype] as &$module) : ?>
											<li>
												<?php if ($user->authorise('core.edit', 'com_modules.module.' . (int) $module->id)) : ?>
													<?php $link = JRoute::_('index.php?option=com_modules&task=module.edit&id=' . $module->id . '&return=' . $return . '&tmpl=component&layout=modal'); ?>
													<a role="button" href="#moduleEdit<?php echo $module->id; ?>Modal" class="button" data-toggle="modal" title="<?php echo JText::_('COM_MENUS_EDIT_MODULE_SETTINGS'); ?>">
														<?php echo JText::sprintf('COM_MENUS_MODULE_ACCESS_POSITION', $this->escape($module->title), $this->escape($module->access_title), $this->escape($module->position)); ?></a>
												<?php else : ?>
													<a href="#" class="disabled" disabled="disabled">
														<?php echo JText::sprintf('COM_MENUS_MODULE_ACCESS_POSITION', $this->escape($module->title), $this->escape($module->access_title), $this->escape($module->position)); ?></a>
												<?php endif; ?>
											</li>
										<?php endforeach; ?>
									</ul>
								 </div>
								<?php foreach ($this->modules[$item->menutype] as &$module) : ?>
									<?php if ($user->authorise('core.edit', 'com_modules.module.' . (int) $module->id)) : ?>
										<?php $link = JRoute::_('index.php?option=com_modules&task=module.edit&id=' . $module->id . '&return=' . $return . '&tmpl=component&layout=modal'); ?>
										<?php echo JHtml::_(
												'bootstrap.renderModal',
												'moduleEdit' . $module->id . 'Modal',
												array(
													'title'       => JText::_('COM_MENUS_EDIT_MODULE_SETTINGS'),
													'backdrop'    => 'static',
													'keyboard'    => false,
													'closeButton' => false,
													'url'         => $link,
													'height'      => '400px',
													'width'       => '800px',
													'bodyHeight'  => '70',
													'modalWidth'  => '80',
													'footer'      => '<button type="button" class="btn" data-dismiss="modal"'
															. ' onclick="jQuery(\'#moduleEdit' . $module->id . 'Modal iframe\').contents().find(\'#closeBtn\').click();">'
															. JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>'
															. '<button type="button" class="btn btn-primary"'
															. ' onclick="jQuery(\'#moduleEdit' . $module->id . 'Modal iframe\').contents().find(\'#saveBtn\').click();">'
															. JText::_('JSAVE') . '</button>'
															. '<button type="button" class="btn btn-success"'
															. ' onclick="jQuery(\'#moduleEdit' . $module->id . 'Modal iframe\').contents().find(\'#applyBtn\').click();">'
															. JText::_('JAPPLY') . '</button>',
												)
											); ?>
									<?php endif; ?>
								<?php endforeach; ?>
							<?php elseif ($modMenuId) : ?>
								<?php $link = JRoute::_('index.php?option=com_modules&task=module.add&eid=' . $modMenuId . '&params[menutype]=' . $item->menutype . '&tmpl=component&layout=modal'); ?>
								<button type="button" class="btn btn-small btn-primary" data-toggle="modal" data-target="#moduleAddModal"><?php echo JText::_('COM_MENUS_ADD_MENU_MODULE'); ?></button>
								<?php echo JHtml::_(
										'bootstrap.renderModal',
										'moduleAddModal',
										array(
											'title'       => JText::_('COM_MENUS_ADD_MENU_MODULE'),
											'backdrop'    => 'static',
											'keyboard'    => false,
											'closeButton' => false,
											'url'         => $link,
											'height'      => '400px',
											'width'       => '800px',
											'bodyHeight'  => '70',
											'modalWidth'  => '80',
											'footer'      => '<button type="button" class="btn" data-dismiss="modal"'
													. ' onclick="jQuery(\'#moduleAddModal iframe\').contents().find(\'#closeBtn\').click();">'
													. JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>'
													. '<button type="button" class="btn btn-primary"'
													. ' onclick="jQuery(\'#moduleAddModal iframe\').contents().find(\'#saveBtn\').click();">'
													. JText::_('JSAVE') . '</button>'
													. '<button type="button" class="btn btn-success"'
													. ' onclick="jQuery(\'#moduleAddModal iframe\').contents().find(\'#applyBtn\').click();">'
													. JText::_('JAPPLY') . '</button>',
										)
									); ?>
							<?php endif; ?>
						</td>
						<td class="hidden-phone">
							<?php echo $item->id; ?>
						</td>
					</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif; ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_menus/views/item/tmpl/edit_modules.php000060400000013123152453623440017157 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.core');

foreach ($this->levels as $key => $value) {
	$allLevels[$value->id] = $value->title;
}

JFactory::getDocument()->addScriptDeclaration('
	var viewLevels = ' . json_encode($allLevels) . ',
		menuId = parseInt(' . (int) $this->item->id . ');

	jQuery(function($) {
		var baseLink = "index.php?option=com_modules&amp;client_id=0&amp;task=module.edit&amp;tmpl=component&amp;view=module&amp;layout=modal&amp;id=",
			iFrameAttr = "class=\"iframe jviewport-height70\"";

		$(document)
			.on("click", "input:radio[id^=\'jform_toggle_modules_assigned1\']", function (event) {
				$(".table tr.no").hide();
			})
			.on("click", "input:radio[id^=\'jform_toggle_modules_assigned0\']", function (event) {
				$(".table tr.no").show();
			})
			.on("click", "input:radio[id^=\'jform_toggle_modules_published1\']", function (event) {
				$(".table tr.unpublished").hide();
			})
			.on("click", "input:radio[id^=\'jform_toggle_modules_published0\']", function (event) {
				$(".table tr.unpublished").show();
			})
			.on("click", ".module-edit-link", function () {
				var link = baseLink + $(this).data("moduleId"),
					iFrame = $("<iframe src=\"" + link + "\" " + iFrameAttr + "></iframe>");

				$("#moduleEditModal").modal()
					.find(".modal-body").empty().prepend(iFrame);
			})
			.on("click", "#moduleEditModal .modal-footer .btn", function () {
				var target = $(this).data("target");

				if (target) {
					$("#moduleEditModal iframe").contents().find(target).click();
				}
			});
	});
');

JFactory::getDocument()->addStyleDeclaration('
ul.horizontal-buttons li {
  display: inline-block;
  padding-right: 10%;
}
');

// Set up the bootstrap modal that will be used for all module editors
echo JHtml::_(
	'bootstrap.renderModal',
	'moduleEditModal',
	array(
		'title'       => JText::_('COM_MENUS_EDIT_MODULE_SETTINGS'),
		'backdrop'    => 'static',
		'keyboard'    => false,
		'closeButton' => false,
		'bodyHeight'  => '70',
		'modalWidth'  => '80',
		'footer'      => '<button type="button" class="btn" data-dismiss="modal" data-target="#closeBtn">'
				. JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>'
				. '<button type="button" class="btn btn-primary" data-dismiss="modal" data-target="#saveBtn">'
				. JText::_('JSAVE') . '</button>'
				. '<button type="button" class="btn btn-success" data-target="#applyBtn">'
				. JText::_('JAPPLY') . '</button>',
	)
);

?>
<?php
// Set main fields.
$this->fields = array('toggle_modules_assigned','toggle_modules_published');

echo JLayoutHelper::render('joomla.menu.edit_modules', $this); ?>

	<table class="table table-striped">
		<thead>
		<tr>
			<th class="left">
				<?php echo JText::_('COM_MENUS_HEADING_ASSIGN_MODULE'); ?>
			</th>
			<th>
				<?php echo JText::_('COM_MENUS_HEADING_LEVELS'); ?>
			</th>
			<th>
				<?php echo JText::_('COM_MENUS_HEADING_POSITION'); ?>
			</th>
			<th>
				<?php echo JText::_('COM_MENUS_HEADING_DISPLAY'); ?>
			</th>
			<th>
				<?php echo JText::_('COM_MENUS_HEADING_PUBLISHED_ITEMS'); ?>
			</th>
		</tr>
		</thead>
		<tbody>
		<?php foreach ($this->modules as $i => &$module) : ?>
			<?php if (is_null($module->menuid)) : ?>
				<?php if (!$module->except || $module->menuid < 0) : ?>
					<?php $no = 'no '; ?>
				<?php else : ?>
					<?php $no = ''; ?>
				<?php endif; ?>
			<?php else : ?>
				<?php $no = ''; ?>
			<?php endif; ?>
			<?php if ($module->published) : ?>
				<?php $status = ''; ?>
			<?php else : ?>
				<?php $status = 'unpublished '; ?>
			<?php endif; ?>
			<tr class="<?php echo $no; ?><?php echo $status; ?>row<?php echo $i % 2; ?>" id="tr-<?php echo $module->id; ?>" style="display:table-row">
				<td id="<?php echo $module->id; ?>">
					<button type="button"
						data-target="#moduleEditModal"
						class="btn btn-link module-edit-link"
						title="<?php echo JText::_('COM_MENUS_EDIT_MODULE_SETTINGS'); ?>"
						id="title-<?php echo $module->id; ?>"
						data-module-id="<?php echo $module->id; ?>">
						<?php echo $this->escape($module->title); ?></button>
				</td>
				<td id="access-<?php echo $module->id; ?>">
					<?php echo $this->escape($module->access_title); ?>
				</td>
				<td id="position-<?php echo $module->id; ?>">
					<?php echo $this->escape($module->position); ?>
				</td>
				<td id="menus-<?php echo $module->id; ?>">
					<?php if (is_null($module->menuid)) : ?>
						<?php if ($module->except) : ?>
							<span class="label label-success">
								<?php echo JText::_('JYES'); ?>
							</span>
						<?php else : ?>
							<span class="label label-important">
								<?php echo JText::_('JNO'); ?>
							</span>
						<?php endif; ?>
					<?php elseif ($module->menuid > 0) : ?>
						<span class="label label-success">
							<?php echo JText::_('JYES'); ?>
						</span>
					<?php elseif ($module->menuid < 0) : ?>
						<span class="label label-important">
							<?php echo JText::_('JNO'); ?>
						</span>
					<?php else : ?>
						<span class="label label-info">
							<?php echo JText::_('JALL'); ?>
						</span>
					<?php endif; ?>
				</td>
				<td id="status-<?php echo $module->id; ?>">
						<?php if ($module->published) : ?>
							<span class="label label-success">
								<?php echo JText::_('JYES'); ?>
							</span>
						<?php else : ?>
							<span class="label label-important">
								<?php echo JText::_('JNO'); ?>
							</span>
						<?php endif; ?>
				</td>
			</tr>
		<?php endforeach; ?>
		</tbody>
	</table>
components/com_menus/views/item/tmpl/edit.php000060400000017722152453623440015440 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.core');
JHtml::_('behavior.tabstate');
JHtml::_('behavior.formvalidator');
JHtml::_('formbehavior.chosen', '#jform_request_filter_tag', null, array('placeholder_text_multiple' => JText::_('JGLOBAL_TYPE_OR_SELECT_SOME_TAGS')));
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('behavior.keepalive');

JText::script('ERROR');
JText::script('JGLOBAL_VALIDATION_FORM_FAILED');

$assoc = JLanguageAssociations::isEnabled();

// Ajax for parent items
$script = "
jQuery(document).ready(function ($){
	$('#jform_menutype').change(function(){
		var menutype = $(this).val();
		$.ajax({
			url: 'index.php?option=com_menus&task=item.getParentItem&menutype=' + menutype,
			dataType: 'json'
		}).done(function(data) {
			$('#jform_parent_id option').each(function() {
				if ($(this).val() != '1') {
					$(this).remove();
				}
			});

			$.each(data, function (i, val) {
				var option = $('<option>');
				option.text(val.title).val(val.id);
				$('#jform_parent_id').append(option);
			});
			$('#jform_parent_id').trigger('liszt:updated');
		});
	});

	// Menu type Login Form specific
	$('#item-form').on('submit', function() {
		if ($('#jform_params_login_redirect_url') && $('#jform_params_logout_redirect_url')) {
			// Login
			if ($('#jform_params_login_redirect_url').closest('.control-group').css('display') === 'block') {
				$('#jform_params_login_redirect_menuitem_id').val('');
			}
			if ($('#jform_params_login_redirect_menuitem_name').closest('.control-group').css('display') === 'block') {
				$('#jform_params_login_redirect_url').val('');

			}

			// Logout
			if ($('#jform_params_logout_redirect_url').closest('.control-group').css('display') === 'block') {
				$('#jform_params_logout_redirect_menuitem_id').val('');
			}
			if ($('#jform_params_logout_redirect_menuitem_id').closest('.control-group').css('display') === 'block') {
				$('#jform_params_logout_redirect_url').val('');
			}
		}
	});
});

Joomla.submitbutton = function(task, type){
	if (task == 'item.setType' || task == 'item.setMenuType')
	{
		if (task == 'item.setType')
		{
			jQuery('#item-form input[name=\"jform[type]\"]').val(type);
			jQuery('#fieldtype').val('type');
		} else {
			jQuery('#item-form input[name=\"jform[menutype]\"]').val(type);
		}
		Joomla.submitform('item.setType', document.getElementById('item-form'));
	} else if (task == 'item.cancel' || document.formvalidator.isValid(document.getElementById('item-form')))
	{
		Joomla.submitform(task, document.getElementById('item-form'));

		// @deprecated 4.0  The following js is not needed since 3.7.0.
		if (task !== 'item.apply')
		{
			window.parent.jQuery('#menuEdit" . (int) $this->item->id . "Modal').modal('hide');
		}
	}
	else
	{
		// special case for modal popups validation response
		jQuery('#item-form .modal-value.invalid').each(function(){
			var field = jQuery(this),
				idReversed = field.attr('id').split('').reverse().join(''),
				separatorLocation = idReversed.indexOf('_'),
				nameId = '#' + idReversed.substr(separatorLocation).split('').reverse().join('') + 'name';
			jQuery(nameId).addClass('invalid');
		});
	}
};
";

$input = JFactory::getApplication()->input;

// Add the script to the document head.
JFactory::getDocument()->addScriptDeclaration($script);
// In case of modal
$isModal  = $input->get('layout') == 'modal' ? true : false;
$layout   = $isModal ? 'modal' : 'edit';
$tmpl     = $isModal || $input->get('tmpl', '', 'cmd') === 'component' ? '&tmpl=component' : '';
$clientId = $this->state->get('item.client_id', 0);
$lang     = JFactory::getLanguage()->getTag();

// Load mod_menu.ini file when client is administrator
if ($clientId === 1)
{
	JFactory::getLanguage()->load('mod_menu', JPATH_ADMINISTRATOR, null, false, true);
}
?>
<form action="<?php echo JRoute::_('index.php?option=com_menus&view=item&client_id=' . $clientId . '&layout=' . $layout . $tmpl . '&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="item-form" class="form-validate">

	<?php echo JLayoutHelper::render('joomla.edit.title_alias', $this); ?>

	<?php // Add the translation of the menu item title when client is administrator ?>
	<?php if ($clientId === 1 && $this->item->id != 0) : ?>
		<div class="form-inline form-inline-header">
			<div class="control-group">
				<div class="control-label">
					<label><?php echo JText::sprintf('COM_MENUS_TITLE_TRANSLATION', $lang); ?></label>
				</div>
				<div class="controls">
					<input class="input-xlarge" value="<?php echo JText::_($this->item->title); ?>" readonly="readonly" type="text">
				</div>
			</div>
		</div>
	<?php endif; ?>

	<div class="form-horizontal">
		<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'details')); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'details', JText::_('COM_MENUS_ITEM_DETAILS')); ?>
		<div class="row-fluid">
			<div class="span9">
				<?php
				echo $this->form->renderField('type');

				if ($this->item->type == 'alias')
				{
					echo $this->form->renderField('aliasoptions', 'params');
				}

				if ($this->item->type == 'separator')
				{
					echo $this->form->renderField('text_separator', 'params');
				}

				echo $this->form->renderFieldset('request');

				if ($this->item->type == 'url')
				{
					$this->form->setFieldAttribute('link', 'readonly', 'false');
					$this->form->setFieldAttribute('link', 'required', 'true');
				}

				echo $this->form->renderField('link');

				if ($this->item->type == 'alias')
				{
					echo $this->form->renderField('alias_redirect', 'params');
				}

				echo $this->form->renderField('browserNav');
				echo $this->form->renderField('template_style_id');

				if (!$isModal && $this->item->type == 'container')
				{
					echo $this->loadTemplate('container');
				}
				?>
			</div>
			<div class="span3">
				<?php
				// Set main fields.
				$this->fields = array(
					'id',
					'client_id',
					'menutype',
					'parent_id',
					'menuordering',
					'published',
					'home',
					'access',
					'language',
					'note',
				);

				if ($this->item->type != 'component')
				{
					$this->fields = array_diff($this->fields, array('home'));
				}

				echo JLayoutHelper::render('joomla.edit.global', $this); ?>
			</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php
		$this->fieldsets = array();
		$this->ignore_fieldsets = array('aliasoptions', 'request', 'item_associations');
		echo JLayoutHelper::render('joomla.edit.params', $this);
		?>

		<?php if (!$isModal && $assoc && $this->state->get('item.client_id') != 1) : ?>
			<?php if ($this->item->type !== 'alias' && $this->item->type !== 'url'
				&& $this->item->type !== 'separator' && $this->item->type !== 'heading') : ?>
				<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'associations', JText::_('JGLOBAL_FIELDSET_ASSOCIATIONS')); ?>
				<?php echo $this->loadTemplate('associations'); ?>
				<?php echo JHtml::_('bootstrap.endTab'); ?>
			<?php endif; ?>
		<?php elseif ($isModal && $assoc && $this->state->get('item.client_id') != 1) : ?>
			<div class="hidden"><?php echo $this->loadTemplate('associations'); ?></div>
		<?php endif; ?>

		<?php if (!empty($this->modules)) : ?>
			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'modules', JText::_('COM_MENUS_ITEM_MODULE_ASSIGNMENT')); ?>
			<?php echo $this->loadTemplate('modules'); ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php endif; ?>

		<?php echo JHtml::_('bootstrap.endTabSet'); ?>
	</div>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="forcedLanguage" value="<?php echo $input->get('forcedLanguage', '', 'cmd'); ?>" />
	<?php echo $this->form->getInput('component_id'); ?>
	<?php echo JHtml::_('form.token'); ?>
	<input type="hidden" id="fieldtype" name="fieldtype" value="" />
</form>
components/com_menus/views/item/tmpl/edit.xml000060400000000763152453623440015446 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_MENUS_ITEM_VIEW_EDIT_TITLE">
		<message>
			<![CDATA[COM_MENUS_ITEM_VIEW_EDIT_DESC]]>
		</message>
	</layout>
	<fieldset name="request">
		<fields name="request">
			<field
				name="menutype"
				type="menu"
				label="COM_MENUS_ITEMS_CHOOSE_MENU_LABEL"
				description="COM_MENUS_ITEMS_CHOOSE_MENU_DESC"
				clientid=""
				>
				<option value="">COM_MENUS_SELECT_MENU</option>
			</field>
		</fields>
	</fieldset>
</metadata>
components/com_menus/views/item/tmpl/edit_container.php000060400000011604152453623440017473 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

use Joomla\Registry\Registry;

// Initialise related data.
$menuLinks = MenusHelper::getMenuLinks('main');

JHtml::_('script', 'jui/treeselectmenu.jquery.min.js', array('version' => 'auto', 'relative' => true));

$script = <<<'JS'
	jQuery(document).ready(function ($) {
		var propagate = function () {
			var $this = $(this);
			var sub = $this.closest('li').find('.treeselect-sub [type="checkbox"]');
			sub.prop('checked', this.checked);
			if ($this.val() == 1)
				sub.each(propagate);
			else
				sub.attr('disabled', this.checked ? 'disabled' : null);
		};
		$('.treeselect')
			.on('click', '[type="checkbox"]', propagate)
			.find('[type="checkbox"]:checked').each(propagate);
	});
JS;

$style = <<<'CSS'
	.checkbox-toggle {
		display: none !important;
	}
	.checkbox-toggle[disabled] ~ .btn-hide {
		opacity: 0.5;
	}
	.checkbox-toggle ~ .btn-show {
		display: inline;
	}
	.checkbox-toggle ~ .btn-hide {
		display: none;
	}
	.checkbox-toggle:checked ~ .btn-show {
		display: none;
	}
	.checkbox-toggle:checked ~ .btn-hide {
		display: inline;
	}
CSS;

JFactory::getDocument()->addScriptDeclaration($script);
JFactory::getDocument()->addStyleDeclaration($style);
?>
<div id="menuselect-group" class="control-group">
	<div class="control-label"><?php echo $this->form->getLabel('hideitems', 'params'); ?></div>

	<div id="jform_params_hideitems" class="controls">
		<?php if (!empty($menuLinks)) : ?>
		<?php $id = 'jform_params_hideitems'; ?>

		<div class="well well-small">
			<div class="form-inline">
				<span class="small"><?php echo JText::_('COM_MENUS_ACTION_EXPAND'); ?>:
					<a id="treeExpandAll" href="javascript://"><?php echo JText::_('JALL'); ?></a>,
					<a id="treeCollapseAll" href="javascript://"><?php echo JText::_('JNONE'); ?></a>|
					<?php echo JText::_('JSHOW'); ?>:
					<a id="treeUncheckAll" href="javascript://"><?php echo JText::_('JALL'); ?></a>,
					<a id="treeCheckAll" href="javascript://"><?php echo JText::_('JNONE'); ?></a>
				</span>
				<input type="text" id="treeselectfilter" name="treeselectfilter" class="input-medium search-query pull-right" size="16"
					autocomplete="off" placeholder="<?php echo JText::_('JSEARCH_FILTER'); ?>" aria-invalid="false" tabindex="-1">
			</div>

			<div class="clearfix"></div>

			<hr class="hr-condensed" />

			<ul class="treeselect">

				<?php if (count($menuLinks)) : ?>
					<?php $prevlevel = 0; ?>
					<div class="alert alert-info"><?php echo JText::_('COM_MENUS_ITEM_FIELD_COMPONENTS_CONTAINER_HIDE_ITEMS_DESC')?></div>
					<li>
					<?php
					$params      = new Registry($this->item->params);
					$hiddenLinks = (array) $params->get('hideitems');

					foreach ($menuLinks as $i => $link) : ?>
						<?php
						if ($extension = $link->element):
							$lang->load("$extension.sys", JPATH_ADMINISTRATOR, null, false, true)
							|| $lang->load("$extension.sys", JPATH_ADMINISTRATOR . '/components/' . $extension, null, false, true);
						endif;

						if ($prevlevel < $link->level)
						{
							echo '<ul class="treeselect-sub">';
						}
						elseif ($prevlevel > $link->level)
						{
							echo str_repeat('</li></ul>', $prevlevel - $link->level);
						}
						else
						{
							echo '</li>';
						}

						$selected = in_array($link->value, $hiddenLinks) ? 1 : 0;
						?>
							<li>
								<div class="treeselect-item pull-left">
									<input type="checkbox" <?php echo $link->value > 1 ? ' name="jform[params][hideitems][]" ' : ''; ?>
										   id="<?php echo $id . $link->value; ?>" value="<?php echo (int) $link->value; ?>" class="novalidate checkbox-toggle"
										<?php echo $selected ? ' checked="checked"' : ''; ?> />

									<?php if ($link->value == 1): ?>
										<label for="<?php echo $id . $link->value; ?>" class="btn btn-mini btn-info pull-left"><?php echo JText::_('JALL') ?></label>
									<?php else: ?>
										<label for="<?php echo $id . $link->value; ?>" class="btn btn-mini btn-danger btn-hide pull-left"><?php echo JText::_('JHIDE') ?></label>
										<label for="<?php echo $id . $link->value; ?>" class="btn btn-mini btn-success btn-show pull-left"><?php echo JText::_('JSHOW') ?></label>
										<label for="<?php echo $id . $link->value; ?>" class="pull-left"><?php echo JText::_($link->text); ?></label>
									<?php endif; ?>
								</div>
						<?php

						if (!isset($menuLinks[$i + 1]))
						{
							echo str_repeat('</li></ul>', $link->level);
						}
						$prevlevel = $link->level;
						?>
						<?php endforeach; ?>
					</li>
					<?php endif; ?>

			</ul>
			<div id="noresultsfound" style="display:none;" class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		</div>
		<?php endif; ?>
	</div>
</div>
components/com_menus/views/item/tmpl/modal_options.php000060400000002666152453623440017363 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<?php
	echo JHtml::_('bootstrap.startAccordion', 'menuOptions', array('active' => 'collapse0'));
	$fieldSets = $this->form->getFieldsets('params');
	$i = 0;

	foreach ($fieldSets as $name => $fieldSet) :
		if (!(($this->item->link == 'index.php?option=com_wrapper&view=wrapper') && $fieldSet->name == 'request')
				&& !($this->item->link == 'index.php?Itemid=' && $fieldSet->name == 'aliasoptions')) :
			$label = !empty($fieldSet->label) ? $fieldSet->label : 'COM_MENUS_' . $name . '_FIELDSET_LABEL';
			echo JHtml::_('bootstrap.addSlide', 'menuOptions', JText::_($label), 'collapse' . ($i++));
				if (isset($fieldSet->description) && trim($fieldSet->description)) :
					echo '<p class="tip">' . $this->escape(JText::_($fieldSet->description)) . '</p>';
				endif;
				?>
					<?php foreach ($this->form->getFieldset($name) as $field) : ?>

						<div class="control-group">

							<div class="control-label">
								<?php echo $field->label; ?>
							</div>
							<div class="controls">
								<?php echo $field->input; ?>
							</div>

						</div>
					<?php endforeach;
			echo JHtml::_('bootstrap.endSlide');
		endif;
	endforeach; ?>
<?php

echo JHtml::_('bootstrap.endAccordion');
components/com_menus/views/item/tmpl/edit_associations.php000060400000000506152453623440020207 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

echo JLayoutHelper::render('joomla.edit.associations', $this);
components/com_menus/views/item/tmpl/modal_associations.php000060400000000506152453623440020356 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

echo JLayoutHelper::render('joomla.edit.associations', $this);
components/com_menus/views/item/tmpl/modal.php000060400000002510152453623440015574 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip', '.hasTooltip', array('placement' => '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', 'jEditMenu_' . (int) $this->item->id);

// Function to update input title when changed
JFactory::getDocument()->addScriptDeclaration('
	function jEditMenuModal() {
		if (window.parent && document.formvalidator.isValid(document.getElementById("item-form"))) {
			return window.parent.' . $this->escape($function) . '(document.getElementById("jform_title").value);
		}
	}
');
?>
<button id="applyBtn" type="button" class="hidden" onclick="Joomla.submitbutton('item.apply'); jEditMenuModal();"></button>
<button id="saveBtn" type="button" class="hidden" onclick="Joomla.submitbutton('item.save'); jEditMenuModal();"></button>
<button id="closeBtn" type="button" class="hidden" onclick="Joomla.submitbutton('item.cancel');"></button>

<div class="container-popup">
	<?php $this->setLayout('edit'); ?>
	<?php echo $this->loadTemplate(); ?>
</div>
components/com_menus/views/item/tmpl/edit_options.php000060400000002666152453623440017214 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<?php
	echo JHtml::_('bootstrap.startAccordion', 'menuOptions', array('active' => 'collapse0'));
	$fieldSets = $this->form->getFieldsets('params');
	$i = 0;

	foreach ($fieldSets as $name => $fieldSet) :
		if (!(($this->item->link == 'index.php?option=com_wrapper&view=wrapper') && $fieldSet->name == 'request')
				&& !($this->item->link == 'index.php?Itemid=' && $fieldSet->name == 'aliasoptions')) :
			$label = !empty($fieldSet->label) ? $fieldSet->label : 'COM_MENUS_' . $name . '_FIELDSET_LABEL';
			echo JHtml::_('bootstrap.addSlide', 'menuOptions', JText::_($label), 'collapse' . ($i++));
				if (isset($fieldSet->description) && trim($fieldSet->description)) :
					echo '<p class="tip">' . $this->escape(JText::_($fieldSet->description)) . '</p>';
				endif;
				?>
					<?php foreach ($this->form->getFieldset($name) as $field) : ?>

						<div class="control-group">

							<div class="control-label">
								<?php echo $field->label; ?>
							</div>
							<div class="controls">
								<?php echo $field->input; ?>
							</div>

						</div>
					<?php endforeach;
			echo JHtml::_('bootstrap.endSlide');
		endif;
	endforeach; ?>
<?php

echo JHtml::_('bootstrap.endAccordion');
components/com_menus/views/item/view.html.php000060400000010475152453623440015452 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * The HTML Menus Menu Item View.
 *
 * @since  1.6
 */
class MenusViewItem extends JViewLegacy
{
	/**
	 * @var  JForm
	 */
	protected $form;

	/**
	 * @var  object
	 */
	protected $item;

	/**
	 * @var  mixed
	 */
	protected $modules;

	/**
	 * @var  JObject
	 */
	protected $state;

	/**
	 * @var  JObject
	 */
	protected $canDo;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		$user = JFactory::getUser();

		$this->state   = $this->get('State');
		$this->form    = $this->get('Form');
		$this->item    = $this->get('Item');
		$this->modules = $this->get('Modules');
		$this->levels  = $this->get('ViewLevels');
		$this->canDo   = JHelperContent::getActions('com_menus', 'menu', (int) $this->state->get('item.menutypeid'));

		// Check if we're allowed to edit this item
		// No need to check for create, because then the moduletype select is empty
		if (!empty($this->item->id) && !$this->canDo->get('core.edit'))
		{
			throw new Exception(JText::_('JERROR_ALERTNOAUTHOR'), 403);
		}

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			JError::raiseError(500, implode("\n", $errors));

			return;
		}

		// 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);
		}

		parent::display($tpl);
		$this->addToolbar();
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		$input = JFactory::getApplication()->input;
		$input->set('hidemainmenu', true);

		$user       = JFactory::getUser();
		$isNew      = ($this->item->id == 0);
		$checkedOut = !($this->item->checked_out == 0 || $this->item->checked_out == $user->get('id'));
		$canDo      = $this->canDo;
		$clientId   = $this->state->get('item.client_id', 0);

		JToolbarHelper::title(JText::_($isNew ? 'COM_MENUS_VIEW_NEW_ITEM_TITLE' : 'COM_MENUS_VIEW_EDIT_ITEM_TITLE'), 'list menu-add');

		// If a new item, can save the item.  Allow users with edit permissions to apply changes to prevent returning to grid.
		if ($isNew && $canDo->get('core.create'))
		{
			if ($canDo->get('core.edit'))
			{
				JToolbarHelper::apply('item.apply');
			}

			JToolbarHelper::save('item.save');
		}

		// If not checked out, can save the item.
		if (!$isNew && !$checkedOut && $canDo->get('core.edit'))
		{
			JToolbarHelper::apply('item.apply');
			JToolbarHelper::save('item.save');
		}

		// If the user can create new items, allow them to see Save & New
		if ($canDo->get('core.create'))
		{
			JToolbarHelper::save2new('item.save2new');
		}

		// If an existing item, can save to a copy only if we have create rights.
		if (!$isNew && $canDo->get('core.create'))
		{
			JToolbarHelper::save2copy('item.save2copy');
		}

		if (!$isNew && JLanguageAssociations::isEnabled() && JComponentHelper::isEnabled('com_associations') && $clientId != 1)
		{
			JToolbarHelper::custom('item.editAssociations', 'contract', 'contract', 'JTOOLBAR_ASSOCIATIONS', false, false);
		}

		if ($isNew)
		{
			JToolbarHelper::cancel('item.cancel');
		}
		else
		{
			JToolbarHelper::cancel('item.cancel', 'JTOOLBAR_CLOSE');
		}

		JToolbarHelper::divider();

		// Get the help information for the menu item.
		$lang = JFactory::getLanguage();

		$help = $this->get('Help');

		if ($lang->hasKey($help->url))
		{
			$debug = $lang->setDebug(false);
			$url   = JText::_($help->url);
			$lang->setDebug($debug);
		}
		else
		{
			$url = $help->url;
		}

		JToolbarHelper::help($help->key, $help->local, $url);
	}
}
components/com_menus/models/menu.php000060400000020602152453623440013662 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;

/**
 * Menu Item Model for Menus.
 *
 * @since  1.6
 */
class MenusModelMenu extends JModelForm
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_MENUS_MENU';

	/**
	 * Model context string.
	 *
	 * @var  string
	 */
	protected $_context = 'com_menus.menu';

	/**
	 * 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)
	{
		return JFactory::getUser()->authorise('core.delete', 'com_menus.menu.' . (int) $record->id);
	}

	/**
	 * Method to test whether the state of a record can be 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)
	{
		$user = JFactory::getUser();

		return $user->authorise('core.edit.state', 'com_menus.menu.' . (int) $record->id);
	}

	/**
	 * 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 = 'MenuType', $prefix = 'JTable', $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');

		// Load the User state.
		$id = $app->input->getInt('id');
		$this->setState('menu.id', $id);

		// Load the parameters.
		$params = JComponentHelper::getParams('com_menus');
		$this->setState('params', $params);
	}

	/**
	 * Method to get a menu item.
	 *
	 * @param   integer  $itemId  The id of the menu item to get.
	 *
	 * @return  mixed  Menu item data object on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function &getItem($itemId = null)
	{
		$itemId = (!empty($itemId)) ? $itemId : (int) $this->getState('menu.id');

		// Get a menu item 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');

		return $value;
	}

	/**
	 * Method to get the menu item 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 getForm($data = array(), $loadData = true)
	{
		// Get the form.
		$form = $this->loadForm('com_menus.menu', 'menu', 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_menus.edit.menu.data', array());

		if (empty($data))
		{
			$data = $this->getItem();
		}
		else
		{
			unset($data['preset']);
		}

		$this->preprocessData('com_menus.menu', $data);

		return $data;
	}

	/**
	 * Method to validate the form data.
	 *
	 * @param   JForm   $form   The form to validate against.
	 * @param   array   $data   The data to validate.
	 * @param   string  $group  The name of the field group to validate.
	 *
	 * @return  array|boolean  Array of filtered data if valid, false otherwise.
	 *
	 * @see     JFormRule
	 * @see     JFilterInput
	 * @since   3.9.23
	 */
	public function validate($form, $data, $group = null)
	{
		if (!JFactory::getUser()->authorise('core.admin', 'com_menus'))
		{
			if (isset($data['rules']))
			{
				unset($data['rules']);
			}
		}

		return parent::validate($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();
		$id         = (!empty($data['id'])) ? $data['id'] : (int) $this->getState('menu.id');
		$isNew      = true;

		// Get a row instance.
		$table = $this->getTable();

		// Include the plugins for the save events.
		JPluginHelper::importPlugin('content');

		// Load the row if saving an existing item.
		if ($id > 0)
		{
			$isNew = false;
			$table->load($id);
		}

		// Bind the data.
		if (!$table->bind($data))
		{
			$this->setError($table->getError());

			return false;
		}

		// Check the data.
		if (!$table->check())
		{
			$this->setError($table->getError());

			return false;
		}

		// Trigger the before event.
		$result = $dispatcher->trigger('onContentBeforeSave', array($this->_context, &$table, $isNew));

		// Store the data.
		if (in_array(false, $result, true) || !$table->store())
		{
			$this->setError($table->getError());

			return false;
		}

		// Trigger the after save event.
		$dispatcher->trigger('onContentAfterSave', array($this->_context, &$table, $isNew));

		$this->setState('menu.id', $table->id);

		// Clean the cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Method to delete groups.
	 *
	 * @param   array  $itemIds  An array of item ids.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function delete($itemIds)
	{
		$dispatcher = JEventDispatcher::getInstance();

		// Sanitize the ids.
		$itemIds = ArrayHelper::toInteger((array) $itemIds);

		// Get a group row instance.
		$table = $this->getTable();

		// Include the plugins for the delete events.
		JPluginHelper::importPlugin('content');

		// Iterate the items to delete each one.
		foreach ($itemIds as $itemId)
		{
			if ($table->load($itemId))
			{
				// Trigger the before delete event.
				$result = $dispatcher->trigger('onContentBeforeDelete', array($this->_context, $table));

				if (in_array(false, $result, true) || !$table->delete($itemId))
				{
					$this->setError($table->getError());

					return false;
				}

				// Trigger the after delete event.
				$dispatcher->trigger('onContentAfterDelete', array($this->_context, $table));

				// TODO: Delete the menu associations - Menu items and Modules
			}
		}

		// Clean the cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Gets a list of all mod_mainmenu modules and collates them by menutype
	 *
	 * @return  array
	 *
	 * @since   1.6
	 */
	public function &getModules()
	{
		$db = $this->getDbo();

		$query = $db->getQuery(true)
			->from('#__modules as a')
			->select('a.id, a.title, a.params, a.position')
			->where('module = ' . $db->quote('mod_menu'))
			->select('ag.title AS access_title')
			->join('LEFT', '#__viewlevels AS ag ON ag.id = a.access');
		$db->setQuery($query);

		$modules = $db->loadObjectList();

		$result = array();

		foreach ($modules as &$module)
		{
			$params = new Registry($module->params);

			$menuType = $params->get('menutype');

			if (!isset($result[$menuType]))
			{
				$result[$menuType] = array();
			}

			$result[$menuType][] = & $module;
		}

		return $result;
	}

	/**
	 * Custom clean the cache
	 *
	 * @param   string   $group     Cache group name.
	 * @param   integer  $clientId  Application client id.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function cleanCache($group = null, $clientId = 0)
	{
		parent::cleanCache('com_menus', 0);
		parent::cleanCache('com_modules');
		parent::cleanCache('mod_menu', 0);
		parent::cleanCache('mod_menu', 1);
	}
}
components/com_menus/models/items.php000060400000041473152453623440014050 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Menu Item List Model for Menus.
 *
 * @since  1.6
 */
class MenusModelItems extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'menutype', 'a.menutype', 'menutype_title',
				'title', 'a.title',
				'alias', 'a.alias',
				'published', 'a.published',
				'access', 'a.access', 'access_level',
				'language', 'a.language',
				'checked_out', 'a.checked_out',
				'checked_out_time', 'a.checked_out_time',
				'lft', 'a.lft',
				'rgt', 'a.rgt',
				'level', 'a.level',
				'path', 'a.path',
				'client_id', 'a.client_id',
				'home', 'a.home',
				'parent_id', 'a.parent_id',
				'a.ordering'
			);

			$app = JFactory::getApplication();
			$assoc = JLanguageAssociations::isEnabled();

			if ($assoc)
			{
				$config['filter_fields'][] = 'association';
			}
		}

		parent::__construct($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.lft', $direction = 'asc')
	{
		$app = JFactory::getApplication('administrator');
		$user = JFactory::getUser();

		$forcedLanguage = $app->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;
		}

		$search = $this->getUserStateFromRequest($this->context . '.search', 'filter_search');
		$this->setState('filter.search', $search);

		$published = $this->getUserStateFromRequest($this->context . '.published', 'filter_published', '');
		$this->setState('filter.published', $published);

		$access = $this->getUserStateFromRequest($this->context . '.filter.access', 'filter_access');
		$this->setState('filter.access', $access);

		$parentId = $this->getUserStateFromRequest($this->context . '.filter.parent_id', 'filter_parent_id');
		$this->setState('filter.parent_id', $parentId);

		$level = $this->getUserStateFromRequest($this->context . '.filter.level', 'filter_level');
		$this->setState('filter.level', $level);

		// Watch changes in client_id and menutype and keep sync whenever needed.
		$currentClientId = $app->getUserState($this->context . '.client_id', 0);
		$clientId        = $app->input->getInt('client_id', $currentClientId);

		// Load mod_menu.ini file when client is administrator
		if ($clientId == 1)
		{
			JFactory::getLanguage()->load('mod_menu', JPATH_ADMINISTRATOR, null, false, true);
		}

		$currentMenuType = $app->getUserState($this->context . '.menutype', '');
		$menuType        = $app->input->getString('menutype', $currentMenuType);

		// If client_id changed clear menutype and reset pagination
		if ($clientId != $currentClientId)
		{
			$menuType = '';

			$app->input->set('limitstart', 0);
			$app->input->set('menutype', '');
		}

		// If menutype changed reset pagination.
		if ($menuType != $currentMenuType)
		{
			$app->input->set('limitstart', 0);
		}

		if (!$menuType)
		{
			$app->setUserState($this->context . '.menutype', '');
			$this->setState('menutypetitle', '');
			$this->setState('menutypeid', '');
		}
		// Special menu types, if selected explicitly, will be allowed as a filter
		elseif ($menuType == 'main')
		{
			// Adjust client_id to match the menutype. This is safe as client_id was not changed in this request.
			$app->input->set('client_id', 1);

			$app->setUserState($this->context . '.menutype', $menuType);
			$this->setState('menutypetitle', ucfirst($menuType));
			$this->setState('menutypeid', -1);
		}
		// Get the menutype object with appropriate checks.
		elseif ($cMenu = $this->getMenu($menuType, true))
		{
			// Adjust client_id to match the menutype. This is safe as client_id was not changed in this request.
			$app->input->set('client_id', $cMenu->client_id);

			$app->setUserState($this->context . '.menutype', $menuType);
			$this->setState('menutypetitle', $cMenu->title);
			$this->setState('menutypeid', $cMenu->id);
		}
		// This menutype does not exist, leave client id unchanged but reset menutype and pagination
		else
		{
			$menuType = '';

			$app->input->set('limitstart', 0);
			$app->input->set('menutype', $menuType);

			$app->setUserState($this->context . '.menutype', $menuType);
			$this->setState('menutypetitle', '');
			$this->setState('menutypeid', '');
		}

		// Client id filter
		$clientId = (int) $this->getUserStateFromRequest($this->context . '.client_id', 'client_id', 0, 'int');
		$this->setState('filter.client_id', $clientId);

		// Use a different filter file when client is administrator
		if ($clientId == 1)
		{
			$this->filterFormName = 'filter_itemsadmin';
		}

		$this->setState('filter.menutype', $menuType);

		$language = $this->getUserStateFromRequest($this->context . '.filter.language', 'filter_language', '');
		$this->setState('filter.language', $language);

		// Component parameters.
		$params = JComponentHelper::getParams('com_menus');
		$this->setState('params', $params);

		// 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.access');
		$id .= ':' . $this->getState('filter.published');
		$id .= ':' . $this->getState('filter.language');
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.parent_id');
		$id .= ':' . $this->getState('filter.menutype');
		$id .= ':' . $this->getState('filter.client_id');

		return parent::getStoreId($id);
	}

	/**
	 * Builds an SQL query to load the list data.
	 *
	 * @return  JDatabaseQuery    A query object.
	 *
	 * @since   1.6
	 */
	protected function getListQuery()
	{
		// Create a new query object.
		$db = $this->getDbo();
		$query = $db->getQuery(true);
		$user = JFactory::getUser();
		$app = JFactory::getApplication();

		// Select all fields from the table.
		$query->select(
			$this->getState(
				'list.select',
				$db->quoteName(
					array(
						'a.id', 'a.menutype', 'a.title', 'a.alias', 'a.note', 'a.path', 'a.link', 'a.type', 'a.parent_id',
						'a.level', 'a.published', 'a.component_id', 'a.checked_out', 'a.checked_out_time', 'a.browserNav',
						'a.access', 'a.img', 'a.template_style_id', 'a.params', 'a.lft', 'a.rgt', 'a.home', 'a.language', 'a.client_id'
					),
					array(
						null, null, null, null, null, null, null, null, null,
						null, 'a.published', null, null, null, null,
						null, null, null, null, null, null, null, null, null
					)
				)
			)
		);
		$query->select(
			'CASE ' .
				' WHEN a.type = ' . $db->quote('component') . ' THEN a.published+2*(e.enabled-1) ' .
				' WHEN a.type = ' . $db->quote('url') . ' AND a.published != -2 THEN a.published+2 ' .
				' WHEN a.type = ' . $db->quote('url') . ' AND a.published = -2 THEN a.published-1 ' .
				' WHEN a.type = ' . $db->quote('alias') . ' AND a.published != -2 THEN a.published+4 ' .
				' WHEN a.type = ' . $db->quote('alias') . ' AND a.published = -2 THEN a.published-1 ' .
				' WHEN a.type = ' . $db->quote('separator') . ' AND a.published != -2 THEN a.published+6 ' .
				' WHEN a.type = ' . $db->quote('separator') . ' AND a.published = -2 THEN a.published-1 ' .
				' WHEN a.type = ' . $db->quote('heading') . ' AND a.published != -2 THEN a.published+8 ' .
				' WHEN a.type = ' . $db->quote('heading') . ' AND a.published = -2 THEN a.published-1 ' .
				' WHEN a.type = ' . $db->quote('container') . ' AND a.published != -2 THEN a.published+8 ' .
				' WHEN a.type = ' . $db->quote('container') . ' AND a.published = -2 THEN a.published-1 ' .
			' END AS published '
		);
		$query->from($db->quoteName('#__menu') . ' AS a');

		// Join over the language
		$query->select('l.title AS language_title, l.image AS language_image, l.sef AS language_sef')
			->join('LEFT', $db->quoteName('#__languages') . ' AS l ON l.lang_code = a.language');

		// Join over the users.
		$query->select('u.name AS editor')
			->join('LEFT', $db->quoteName('#__users') . ' AS u ON u.id = a.checked_out');

		// Join over components
		$query->select('c.element AS componentname')
			->join('LEFT', $db->quoteName('#__extensions') . ' AS c ON c.extension_id = a.component_id');

		// 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 menu types.
		$query->select($db->quoteName(array('mt.id', 'mt.title'), array('menutype_id', 'menutype_title')))
			->join('LEFT', $db->quoteName('#__menu_types', 'mt') . ' ON ' . $db->qn('mt.menutype') . ' = ' . $db->qn('a.menutype'));

		// Join over the associations.
		$assoc = JLanguageAssociations::isEnabled();

		if ($assoc)
		{
			$subQuery = $db->getQuery(true)
				->select('COUNT(' . $db->quoteName('asso1.id') . ') > 1')
				->from($db->quoteName('#__associations', 'asso1'))
				->join('INNER', $db->quoteName('#__associations', 'asso2') . ' ON ' . $db->quoteName('asso1.key') . ' = ' . $db->quoteName('asso2.key'))
				->where(
					array(
						$db->quoteName('asso1.id') . ' = ' . $db->quoteName('a.id'),
						$db->quoteName('asso1.context') . ' = ' . $db->quote('com_menus.item'),
					)
				);

			$query->select('(' . $subQuery . ') AS ' . $db->quoteName('association'));
		}

		// Join over the extensions
		$query->select('e.name AS name')
			->join('LEFT', '#__extensions AS e ON e.extension_id = a.component_id');

		// Exclude the root category.
		$query->where('a.id > 1')
			->where('a.client_id = ' . (int) $this->getState('filter.client_id'));

		// Filter on the 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, alias or id
		if ($search = trim($this->getState('filter.search')))
		{
			if (stripos($search, 'id:') === 0)
			{
				$query->where('a.id = ' . (int) substr($search, 3));
			}
			elseif (stripos($search, 'link:') === 0)
			{
				if ($search = substr($search, 5))
				{
					$search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%'));
					$query->where('a.link LIKE ' . $search);
				}
			}
			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 the items over the parent id if set.
		$parentId = $this->getState('filter.parent_id');

		if (!empty($parentId))
		{
			$level = $this->getState('filter.level');

			// Create a subquery for the sub-items list
			$subQuery = $db->getQuery(true)
				->select('sub.id')
				->from('#__menu as sub')
				->join('INNER', '#__menu as this ON sub.lft > this.lft AND sub.rgt < this.rgt')
				->where('this.id = ' . (int) $parentId);

			if ($level)
			{
				$subQuery->where('sub.level <= this.level + ' . (int) ($level - 1));
			}

			// Add the subquery to the main query
			$query->where('(a.parent_id = ' . (int) $parentId . ' OR a.parent_id IN (' . (string) $subQuery . '))');
		}

		// Filter on the level.
		elseif ($level = $this->getState('filter.level'))
		{
			$query->where('a.level <= ' . (int) $level);
		}

		// Filter the items over the menu id if set.
		$menuType = $this->getState('filter.menutype');

		// A value "" means all
		if ($menuType == '')
		{
			// Load all menu types we have manage access
			$query2 = $this->getDbo()->getQuery(true)
				->select($this->getDbo()->qn(array('id', 'menutype')))
				->from('#__menu_types')
				->where('client_id = ' . (int) $this->getState('filter.client_id'))
				->order('title');

			// Show protected items on explicit filter only
			$query->where('a.menutype != ' . $db->q('main'));

			$menuTypes = $this->getDbo()->setQuery($query2)->loadObjectList();

			if ($menuTypes)
			{
				$types = array();

				foreach ($menuTypes as $type)
				{
					if ($user->authorise('core.manage', 'com_menus.menu.' . (int) $type->id))
					{
						$types[] = $query->q($type->menutype);
					}
				}

				$query->where($types ? 'a.menutype IN(' . implode(',', $types) . ')' : 0);
			}
		}
		// Default behavior => load all items from a specific menu
		elseif (strlen($menuType))
		{
			$query->where('a.menutype = ' . $db->quote($menuType));
		}
		// Empty menu type => error
		else
		{
			$query->where('1 != 1');
		}

		// Filter on the access level.
		if ($access = $this->getState('filter.access'))
		{
			$query->where('a.access = ' . (int) $access);
		}

		// Implement View Level Access
		if (!$user->authorise('core.admin'))
		{
			$groups = $user->getAuthorisedViewLevels();

			if (!empty($groups))
			{
				$query->where('a.access IN (' . implode(',', $groups) . ')');
			}
		}

		// Filter on the language.
		if ($language = $this->getState('filter.language'))
		{
			$query->where('a.language = ' . $db->quote($language));
		}

		// Add the list ordering clause.
		$query->order($db->escape($this->getState('list.ordering', 'a.lft')) . ' ' . $db->escape($this->getState('list.direction', 'ASC')));

		return $query;
	}

	/**
	 * Method to allow derived classes 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 (defaults to "content").
	 *
	 * @return  void
	 *
	 * @since   3.2
	 * @throws  Exception if there is an error in the form event.
	 */
	protected function preprocessForm(JForm $form, $data, $group = 'content')
	{
		$name = $form->getName();

		if ($name == 'com_menus.items.filter')
		{
			$clientId = $this->getState('filter.client_id');
			$form->setFieldAttribute('menutype', 'clientid', $clientId);
		}
		elseif (false !== strpos($name, 'com_menus.items.modal.'))
		{
			$form->removeField('client_id');

			$clientId = $this->getState('filter.client_id');
			$form->setFieldAttribute('menutype', 'clientid', $clientId);
		}
	}

	/**
	 * Get the client id for a menu
	 *
	 * @param   string   $menuType  The menutype identifier for the menu
	 * @param   boolean  $check     Flag whether to perform check against ACL as well as existence
	 *
	 * @return  integer
	 *
	 * @since   3.7.0
	 */
	protected function getMenu($menuType, $check = false)
	{
		$query = $this->_db->getQuery(true);

		$query->select('a.*')
			->from($this->_db->qn('#__menu_types', 'a'))
			->where('menutype = ' . $this->_db->q($menuType));

		$cMenu = $this->_db->setQuery($query)->loadObject();

		if ($check)
		{
			// Check if menu type exists.
			if (!$cMenu)
			{
				JLog::add(JText::_('COM_MENUS_ERROR_MENUTYPE_NOT_FOUND'), JLog::ERROR, 'jerror');

				return false;
			}
			// Check if menu type is valid against ACL.
			elseif (!JFactory::getUser()->authorise('core.manage', 'com_menus.menu.' . $cMenu->id))
			{
				JLog::add(JText::_('JERROR_ALERTNOAUTHOR'), JLog::ERROR, 'jerror');

				return false;
			}
		}

		return $cMenu;
	}

	/**
	 * Method to get an array of data items.
	 *
	 * @return  mixed  An array of data items on success, false on failure.
	 *
	 * @since   3.0.1
	 */
	public function getItems()
	{
		$store = $this->getStoreId();

		if (!isset($this->cache[$store]))
		{
			$items = parent::getItems();
			$lang  = JFactory::getLanguage();
			$client = $this->state->get('filter.client_id');

			if ($items)
			{
				foreach ($items as $item)
				{
					if ($extension = $item->componentname)
					{
						$lang->load("$extension.sys", JPATH_ADMINISTRATOR, null, false, true)
						|| $lang->load("$extension.sys", JPATH_ADMINISTRATOR . '/components/' . $extension, null, false, true);
					}

					// Translate component name
					if ($client === 1)
					{
						$item->title = JText::_($item->title);
					}
				}
			}

			$this->cache[$store] = $items;
		}

		return $this->cache[$store];
	}
}
components/com_menus/models/menus.php000060400000013636152453623440014056 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Menu List Model for Menus.
 *
 * @since  1.6
 */
class MenusModelMenus extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'title', 'a.title',
				'menutype', 'a.menutype',
				'client_id', 'a.client_id',
			);
		}

		parent::__construct($config);
	}

	/**
	 * Overrides the getItems method to attach additional metrics to the list.
	 *
	 * @return  mixed  An array of data items on success, false on failure.
	 *
	 * @since   1.6.1
	 */
	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 empty 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 menu trees.

		// Get the menu types of menus in the list.
		$db = $this->getDbo();
		$menuTypes = ArrayHelper::getColumn((array) $items, 'menutype');

		// Quote the strings.
		$menuTypes = implode(
			',',
			array_map(array($db, 'quote'), $menuTypes)
		);

		// Get the published menu counts.
		$query = $db->getQuery(true)
			->select('m.menutype, COUNT(DISTINCT m.id) AS count_published')
			->from('#__menu AS m')
			->where('m.published = 1')
			->where('m.menutype IN (' . $menuTypes . ')')
			->group('m.menutype');

		$db->setQuery($query);

		try
		{
			$countPublished = $db->loadAssocList('menutype', 'count_published');
		}
		catch (RuntimeException $e)
		{
			$this->setError($e->getMessage());

			return false;
		}

		// Get the unpublished menu counts.
		$query->clear('where')
			->where('m.published = 0')
			->where('m.menutype IN (' . $menuTypes . ')');
		$db->setQuery($query);

		try
		{
			$countUnpublished = $db->loadAssocList('menutype', 'count_published');
		}
		catch (RuntimeException $e)
		{
			$this->setError($e->getMessage());

			return false;
		}

		// Get the trashed menu counts.
		$query->clear('where')
			->where('m.published = -2')
			->where('m.menutype IN (' . $menuTypes . ')');
		$db->setQuery($query);

		try
		{
			$countTrashed = $db->loadAssocList('menutype', '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->menutype]) ? $countPublished[$item->menutype] : 0;
			$item->count_unpublished = isset($countUnpublished[$item->menutype]) ? $countUnpublished[$item->menutype] : 0;
			$item->count_trashed     = isset($countTrashed[$item->menutype]) ? $countTrashed[$item->menutype] : 0;
		}

		// Add the items to the internal cache.
		$this->cache[$store] = $items;

		return $this->cache[$store];
	}

	/**
	 * Method to build an SQL query to load the list data.
	 *
	 * @return  string  An SQL query
	 *
	 * @since   1.6
	 */
	protected function getListQuery()
	{
		// Create a new query object.
		$db = $this->getDbo();
		$query = $db->getQuery(true);

		// Select all fields from the table.
		$query->select($this->getState('list.select', 'a.id, a.menutype, a.title, a.description, a.client_id'))
			->from($db->quoteName('#__menu_types') . ' AS a')
			->where('a.id > 0');

		$query->where('a.client_id = ' . (int) $this->getState('client_id'));

		// Filter by search in title or menutype
		if ($search = trim($this->getState('filter.search')))
		{
			$search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%'));
			$query->where('(' . 'a.title LIKE ' . $search . ' OR a.menutype LIKE ' . $search . ')');
		}

		// Add the list ordering clause.
		$query->order($db->escape($this->getState('list.ordering', 'a.id')) . ' ' . $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
	 */
	protected function populateState($ordering = 'a.title', $direction = 'asc')
	{
		$search   = $this->getUserStateFromRequest($this->context . '.search', 'filter_search');
		$this->setState('filter.search', $search);

		$clientId = (int) $this->getUserStateFromRequest($this->context . '.client_id', 'client_id', 0, 'int');
		$this->setState('client_id', $clientId);

		// List state information.
		parent::populateState($ordering, $direction);
	}

	/**
	 * Gets the extension id of the core mod_menu module.
	 *
	 * @return  integer
	 *
	 * @since   2.5
	 */
	public function getModMenuId()
	{
		$db    = $this->getDbo();
		$query = $db->getQuery(true)
			->select('e.extension_id')
			->from('#__extensions AS e')
			->where('e.type = ' . $db->quote('module'))
			->where('e.element = ' . $db->quote('mod_menu'))
			->where('e.client_id = ' . (int) $this->getState('client_id'));
		$db->setQuery($query);

		return $db->loadResult();
	}

	/**
	 * Gets a list of all mod_mainmenu modules and collates them by menutype
	 *
	 * @return  array
	 *
	 * @since   1.6
	 */
	public function &getModules()
	{
		$model = JModelLegacy::getInstance('Menu', 'MenusModel', array('ignore_request' => true));
		$result = $model->getModules();

		return $result;
	}
}
components/com_menus/models/fields/menupreset.php000060400000001715152453623440016357 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Menu\MenuHelper;

JFormHelper::loadFieldClass('list');

/**
 * Administrator Menu Presets list field.
 *
 * @since  3.8.0
 */
class JFormFieldMenuPreset extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var     string
	 *
	 * @since   3.8.0
	 */
	protected $type = 'MenuPreset';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since  3.8.0
	 */
	protected function getOptions()
	{
		$options = array();
		$presets = MenuHelper::getPresets();

		foreach ($presets as $preset)
		{
			$options[] = JHtml::_('select.option', $preset->name, JText::_($preset->title));
		}

		return array_merge(parent::getOptions(), $options);
	}
}
components/com_menus/models/fields/menuitembytype.php000060400000014365152453623440017255 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('JPATH_PLATFORM') or die;

JFormHelper::loadFieldClass('groupedlist');

// Import the com_menus helper.
JLoader::register('MenusHelper', JPATH_ADMINISTRATOR . '/components/com_menus/helpers/menus.php');

/**
 * Supports an HTML grouped select list of menu item grouped by menu
 *
 * @since  3.8.0
 */
class JFormFieldMenuitemByType extends JFormFieldGroupedList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.8.0
	 */
	public $type = 'MenuItemByType';

	/**
	 * The menu type.
	 *
	 * @var    string
	 * @since  3.8.0
	 */
	protected $menuType;

	/**
	 * The client id.
	 *
	 * @var    string
	 * @since  3.8.0
	 */
	protected $clientId;

	/**
	 * The language.
	 *
	 * @var    array
	 * @since  3.8.0
	 */
	protected $language;

	/**
	 * The published status.
	 *
	 * @var    array
	 * @since  3.8.0
	 */
	protected $published;

	/**
	 * The disabled status.
	 *
	 * @var    array
	 * @since  3.8.0
	 */
	protected $disable;

	/**
	 * 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.8.0
	 */
	public function __get($name)
	{
		switch ($name)
		{
			case 'menuType':
			case 'clientId':
			case 'language':
			case 'published':
			case 'disable':
				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.8.0
	 */
	public function __set($name, $value)
	{
		switch ($name)
		{
			case 'menuType':
				$this->menuType = (string) $value;
				break;

			case 'clientId':
				$this->clientId = (int) $value;
				break;

			case 'language':
			case 'published':
			case 'disable':
				$value = (string) $value;
				$this->$name = $value ? explode(',', $value) : array();
				break;

			default:
				parent::__set($name, $value);
		}
	}

	/**
	 * Method to attach a JForm object to the field.
	 *
	 * @param   SimpleXMLElement  $element  The SimpleXMLElement object representing the `<field>` 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.8.0
	 */
	public function setup(SimpleXMLElement $element, $value, $group = null)
	{
		$result = parent::setup($element, $value, $group);

		if ($result == true)
		{
			$menuType = (string) $this->element['menu_type'];

			if (!$menuType)
			{
				$app = JFactory::getApplication('administrator');
				$currentMenuType = $app->getUserState('com_menus.items.menutype', '');
				$menuType        = $app->input->getString('menutype', $currentMenuType);
			}

			$this->menuType  = $menuType;
			$this->clientId  = (int) $this->element['client_id'];
			$this->published = $this->element['published'] ? explode(',', (string) $this->element['published']) : array();
			$this->disable   = $this->element['disable'] ? explode(',', (string) $this->element['disable']) : array();
			$this->language  = $this->element['language'] ? explode(',', (string) $this->element['language']) : array();
		}

		return $result;
	}

	/**
	 * Method to get the field option groups.
	 *
	 * @return  array  The field option objects as a nested array in groups.
	 *
	 * @since   3.8.0
	 */
	protected function getGroups()
	{
		$groups = array();

		$menuType = $this->menuType;

		// Get the menu items.
		$items = MenusHelper::getMenuLinks($menuType, 0, 0, $this->published, $this->language, $this->clientId);

		// Build group for a specific menu type.
		if ($menuType)
		{
			// If the menutype is empty, group the items by menutype.
			$db    = JFactory::getDbo();
			$query = $db->getQuery(true)
				->select($db->quoteName('title'))
				->from($db->quoteName('#__menu_types'))
				->where($db->quoteName('menutype') . ' = ' . $db->quote($menuType));
			$db->setQuery($query);

			try
			{
				$menuTitle = $db->loadResult();
			}
			catch (RuntimeException $e)
			{
				$menuTitle = $menuType;
			}

			// Initialize the group.
			$groups[$menuTitle] = array();

			// Build the options array.
			foreach ($items as $key => $link)
			{
				// Unset if item is menu_item_root
				if ($link->text === 'Menu_Item_Root')
				{
					unset($items[$key]);
					continue;
				}

				$levelPrefix = str_repeat('- ', max(0, $link->level - 1));

				// Displays language code if not set to All
				if ($link->language !== '*')
				{
					$lang = ' (' . $link->language . ')';
				}
				else
				{
					$lang = '';
				}

				$groups[$menuTitle][] = JHtml::_('select.option',
					$link->value, $levelPrefix . $link->text . $lang,
					'value',
					'text',
					in_array($link->type, $this->disable)
				);
			}
		}
		// Build groups for all menu types.
		else
		{
			// Build the groups arrays.
			foreach ($items as $menu)
			{
				// Initialize the group.
				$groups[$menu->title] = array();

				// Build the options array.
				foreach ($menu->links as $link)
				{
					$levelPrefix = str_repeat('- ', max(0, $link->level - 1));

					// Displays language code if not set to All
					if ($link->language !== '*')
					{
						$lang = ' (' . $link->language . ')';
					}
					else
					{
						$lang = '';
					}

					$groups[$menu->title][] = JHtml::_('select.option',
						$link->value,
						$levelPrefix . $link->text . $lang,
						'value',
						'text',
						in_array($link->type, $this->disable)
					);
				}
			}
		}

		// Merge any additional groups in the XML definition.
		$groups = array_merge(parent::getGroups(), $groups);

		return $groups;
	}
}
components/com_menus/models/fields/menutype.php000060400000006642152453623440016042 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

JFormHelper::loadFieldClass('list');

/**
 * Menu Type field.
 *
 * @since  1.6
 */
class JFormFieldMenutype extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var     string
	 * @since   1.6
	 */
	protected $type = 'menutype';

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string  The field input markup.
	 *
	 * @since   1.6
	 */
	protected function getInput()
	{
		$html     = array();
		$recordId = (int) $this->form->getValue('id');
		$size     = (string) ($v = $this->element['size']) ? ' size="' . $v . '"' : '';
		$class    = (string) ($v = $this->element['class']) ? ' class="' . $v . '"' : 'class="text_area"';
		$required = (string) $this->element['required'] ? ' required="required"' : '';
		$clientId = (int) $this->element['clientid'] ?: 0;

		// Get a reverse lookup of the base link URL to Title
		switch ($this->value)
		{
			case 'url':
				$value = JText::_('COM_MENUS_TYPE_EXTERNAL_URL');
				break;

			case 'alias':
				$value = JText::_('COM_MENUS_TYPE_ALIAS');
				break;

			case 'separator':
				$value = JText::_('COM_MENUS_TYPE_SEPARATOR');
				break;

			case 'heading':
				$value = JText::_('COM_MENUS_TYPE_HEADING');
				break;

			case 'container':
				$value = JText::_('COM_MENUS_TYPE_CONTAINER');
				break;

			default:
				$link = $this->form->getValue('link');

				/** @var  MenusModelMenutypes $model */
				$model = JModelLegacy::getInstance('Menutypes', 'MenusModel', array('ignore_request' => true));
				$model->setState('client_id', $clientId);

				$rlu   = $model->getReverseLookup();

				// Clean the link back to the option, view and layout
				$value = JText::_(ArrayHelper::getValue($rlu, MenusHelper::getLinkKey($link)));
				break;
		}

		// Include jQuery
		JHtml::_('jquery.framework');

		// Add the script to the document head.
		JFactory::getDocument()->addScriptDeclaration('
			function jSelectPosition_' . $this->id . '(name) {
				document.getElementById("' . $this->id . '").value = name;
			}
		'
		);

		$link = JRoute::_('index.php?option=com_menus&view=menutypes&tmpl=component&client_id=' . $clientId . '&recordId=' . $recordId);
		$html[] = '<span class="input-append"><input type="text" ' . $required . ' readonly="readonly" id="' . $this->id
			. '" value="' . $value . '" ' . $size . $class . ' />';
		$html[] = '<button type="button" data-target="#menuTypeModal" class="btn btn-primary" data-toggle="modal" title="' . JText::_('JSELECT') . '">'
			. '<span class="icon-list icon-white" aria-hidden="true"></span> '
			. JText::_('JSELECT') . '</button></span>';
		$html[] = JHtml::_(
			'bootstrap.renderModal',
			'menuTypeModal',
			array(
				'url'        => $link,
				'title'      => JText::_('COM_MENUS_ITEM_FIELD_TYPE_LABEL'),
				'width'      => '800px',
				'height'     => '300px',
				'modalWidth' => '80',
				'bodyHeight' => '70',
				'footer'     => '<button type="button" class="btn" data-dismiss="modal">'
						. JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>'
			)
		);
		$html[] = '<input class="input-small" type="hidden" name="' . $this->name . '" value="'
			. htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8') . '" />';

		return implode("\n", $html);
	}
}
components/com_menus/models/fields/menuparent.php000060400000004507152453623440016350 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JFormHelper::loadFieldClass('list');

/**
 * Menu Parent field.
 *
 * @since  1.6
 */
class JFormFieldMenuParent extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var        string
	 * @since   1.6
	 */
	protected $type = 'MenuParent';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   1.6
	 */
	protected function getOptions()
	{
		$options = array();

		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('DISTINCT(a.id) AS value, a.title AS text, a.level, a.lft')
			->from('#__menu AS a');

		// Filter by menu type.
		if ($menuType = $this->form->getValue('menutype'))
		{
			$query->where('a.menutype = ' . $db->quote($menuType));
		}
		else
		{
			// Skip special menu types
			$query->where('a.menutype != ' . $db->quote(''));
			$query->where('a.menutype != ' . $db->quote('main'));
		}

		// Filter by client id.
		$clientId = $this->getAttribute('clientid');

		if (!is_null($clientId))
		{
			$query->where($db->quoteName('a.client_id') . ' = ' . (int) $clientId);
		}

		// Prevent parenting to children of this item.
		if ($id = $this->form->getValue('id'))
		{
			$query->join('LEFT', $db->quoteName('#__menu') . ' AS p ON p.id = ' . (int) $id)
				->where('NOT(a.lft >= p.lft AND a.rgt <= p.rgt)');
		}

		$query->where('a.published != -2')
			->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++)
		{
			if ($clientId != 0)
			{
				// Allow translation of custom admin menus
				$options[$i]->text = str_repeat('- ', $options[$i]->level) . JText::_($options[$i]->text);
			}
			else
			{
				$options[$i]->text = str_repeat('- ', $options[$i]->level) . $options[$i]->text;
			}
		}

		// Merge any additional options in the XML definition.
		$options = array_merge(parent::getOptions(), $options);

		return $options;
	}
}
components/com_menus/models/fields/componentscategory.php000060400000003404152453623440020110 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

JFormHelper::loadFieldClass('list');

/**
 * Components Category field.
 *
 * @since  1.6
 */
class JFormFieldComponentsCategory extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var     string
	 * @since   3.7.0
	 */
	protected $type = 'ComponentsCategory';

	/**
	 * Method to get a list of options for a list input.
	 *
	 * @return	array  An array of JHtml options.
	 *
	 * @since   3.7.0
	 */
	protected function getOptions()
	{
		// Initialise variable.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('DISTINCT a.name AS text, a.element AS value')
			->from('#__extensions as a')
			->where('a.enabled >= 1')
			->where('a.type =' . $db->quote('component'))
			->join('INNER', '#__categories as b ON a.element=b.extension');

		$items = $db->setQuery($query)->loadObjectList();

		if (count($items))
		{
			$lang = JFactory::getLanguage();

			foreach ($items as &$item)
			{
				// Load language
				$extension = $item->value;
				$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);
			}

			// Sort by component name
			$items = ArrayHelper::sortObjects($items, 'text', 1, true, true);
		}

		// Merge any additional options in the XML definition.
		$options = array_merge(parent::getOptions(), $items);

		return $options;
	}
}
components/com_menus/models/fields/modal/menu.php000060400000031650152453623440016231 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Language\LanguageHelper;

JHtml::_('bootstrap.tooltip', '.hasTooltip');

/**
 * Supports a modal menu item picker.
 *
 * @since  3.7.0
 */
class JFormFieldModal_Menu extends JFormField
{
	/**
	 * The form field type.
	 *
	 * @var     string
	 * @since   3.7.0
	 */
	protected $type = 'Modal_Menu';

	/**
	 * Determinate, if the select button is shown
	 *
	 * @var     boolean
	 * @since   3.7.0
	 */
	protected $allowSelect = true;

	/**
	 * Determinate, if the clear button is shown
	 *
	 * @var     boolean
	 * @since   3.7.0
	 */
	protected $allowClear = true;

	/**
	 * Determinate, if the create button is shown
	 *
	 * @var     boolean
	 * @since   3.7.0
	 */
	protected $allowNew = false;

	/**
	 * Determinate, if the edit button is shown
	 *
	 * @var     boolean
	 * @since   3.7.0
	 */
	protected $allowEdit = false;

	/**
	 * Determinate, if the propagate button is shown
	 *
	 * @var     boolean
	 * @since   3.9.0
	 */
	protected $allowPropagate = false;

	/**
	 * 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.7.0
	 */
	public function __get($name)
	{
		switch ($name)
		{
			case 'allowSelect':
			case 'allowClear':
			case 'allowNew':
			case 'allowEdit':
			case 'allowPropagate':
				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.7.0
	 */
	public function __set($name, $value)
	{
		switch ($name)
		{
			case 'allowSelect':
			case 'allowClear':
			case 'allowNew':
			case 'allowEdit':
			case 'allowPropagate':
				$value = (string) $value;
				$this->$name = !($value === 'false' || $value === 'off' || $value === '0');
				break;

			default:
				parent::__set($name, $value);
		}
	}

	/**
	 * Method to attach a JForm object to the field.
	 *
	 * @param   SimpleXMLElement  $element  The SimpleXMLElement object representing the `<field>` 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.7.0
	 */
	public function setup(SimpleXMLElement $element, $value, $group = null)
	{
		$return = parent::setup($element, $value, $group);

		if ($return)
		{
			$this->allowSelect = ((string) $this->element['select']) !== 'false';
			$this->allowClear = ((string) $this->element['clear']) !== 'false';
			$this->allowPropagate = ((string) $this->element['propagate']) === 'true';

			// Creating/editing menu items is not supported in frontend.
			$isAdministrator = JFactory::getApplication()->isClient('administrator');
			$this->allowNew = $isAdministrator ? ((string) $this->element['new']) === 'true' : false;
			$this->allowEdit = $isAdministrator ? ((string) $this->element['edit']) === 'true' : false;
		}

		return $return;
	}

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string  The field input markup.
	 *
	 * @since   3.7.0
	 */
	protected function getInput()
	{
		$clientId    = (int) $this->element['clientid'];
		$languages   = LanguageHelper::getContentLanguages(array(0, 1));

		// Load language
		JFactory::getLanguage()->load('com_menus', JPATH_ADMINISTRATOR);

		// The active article id field.
		$value = (int) $this->value > 0 ? (int) $this->value : '';

		// Create the modal id.
		$modalId = 'Item_' . $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 ($this->allowSelect)
		{
			static $scriptSelect = null;

			if (is_null($scriptSelect))
			{
				$scriptSelect = array();
			}

			if (!isset($scriptSelect[$this->id]))
			{
				JFactory::getDocument()->addScriptDeclaration("
				function jSelectMenu_" . $this->id . "(id, title, object) {
					window.processModalSelect('Item', '" . $this->id . "', id, title, '', object);
				}
				"
				);

				JText::script('JGLOBAL_ASSOCIATIONS_PROPAGATE_FAILED');

				$scriptSelect[$this->id] = true;
			}
		}

		// Setup variables for display.
		$linkSuffix = '&amp;layout=modal&amp;client_id=' . $clientId . '&amp;tmpl=component&amp;' . JSession::getFormToken() . '=1';
		$linkItems  = 'index.php?option=com_menus&amp;view=items' . $linkSuffix;
		$linkItem   = 'index.php?option=com_menus&amp;view=item' . $linkSuffix;
		$modalTitle = JText::_('COM_MENUS_CHANGE_MENUITEM');

		if (isset($this->element['language']))
		{
			$linkItems  .= '&amp;forcedLanguage=' . $this->element['language'];
			$linkItem   .= '&amp;forcedLanguage=' . $this->element['language'];
			$modalTitle .= ' &#8212; ' . $this->element['label'];
		}

		$urlSelect = $linkItems . '&amp;function=jSelectMenu_' . $this->id;
		$urlEdit   = $linkItem . '&amp;task=item.edit&amp;id=\' + document.getElementById("' . $this->id . '_id").value + \'';
		$urlNew    = $linkItem . '&amp;task=item.add';

		if ($value)
		{
			$db    = JFactory::getDbo();
			$query = $db->getQuery(true)
				->select($db->quoteName('title'))
				->from($db->quoteName('#__menu'))
				->where($db->quoteName('id') . ' = ' . (int) $value);

			$db->setQuery($query);

			try
			{
				$title = $db->loadResult();
			}
			catch (RuntimeException $e)
			{
				JError::raiseWarning(500, $e->getMessage());
			}
		}

		// Placeholder if option is present or not
		if (empty($title))
		{
			if ($this->element->option && (string) $this->element->option['value'] == '')
			{
				$title_holder = JText::_($this->element->option);
			}
			else
			{
				$title_holder = JText::_('COM_MENUS_SELECT_A_MENUITEM');
			}
		}

		$title = empty($title) ? $title_holder : htmlspecialchars($title, ENT_QUOTES, 'UTF-8');

		// The current menu item display field.
		$html  = '<span class="input-append">';
		$html .= '<input class="input-medium" id="' . $this->id . '_name" type="text" value="' . $title . '" disabled="disabled" size="35" />';

		// Select menu item button
		if ($this->allowSelect)
		{
			$html .= '<button'
				. ' type="button"'
				. ' class="btn hasTooltip' . ($value ? ' hidden' : '') . '"'
				. ' id="' . $this->id . '_select"'
				. ' data-toggle="modal"'
				. ' data-target="#ModalSelect' . $modalId . '"'
				. ' title="' . JHtml::tooltipText('COM_MENUS_CHANGE_MENUITEM') . '">'
				. '<span class="icon-file" aria-hidden="true"></span> ' . JText::_('JSELECT')
				. '</button>';
		}

		// New menu item button
		if ($this->allowNew)
		{
			$html .= '<button'
				. ' type="button"'
				. ' class="btn hasTooltip' . ($value ? ' hidden' : '') . '"'
				. ' id="' . $this->id . '_new"'
				. ' data-toggle="modal"'
				. ' data-target="#ModalNew' . $modalId . '"'
				. ' title="' . JHtml::tooltipText('COM_MENUS_NEW_MENUITEM') . '">'
				. '<span class="icon-new" aria-hidden="true"></span> ' . JText::_('JACTION_CREATE')
				. '</button>';
		}

		// Edit menu item button
		if ($this->allowEdit)
		{
			$html .= '<button'
				. ' type="button"'
				. ' class="btn hasTooltip' . ($value ? '' : ' hidden') . '"'
				. ' id="' . $this->id . '_edit"'
				. ' data-toggle="modal"'
				. ' data-target="#ModalEdit' . $modalId . '"'
				. ' title="' . JHtml::tooltipText('COM_MENUS_EDIT_MENUITEM') . '">'
				. '<span class="icon-edit" aria-hidden="true"></span> ' . JText::_('JACTION_EDIT')
				. '</button>';
		}

		// Clear menu item button
		if ($this->allowClear)
		{
			$html .= '<button'
				. ' type="button"'
				. ' class="btn' . ($value ? '' : ' hidden') . '"'
				. ' id="' . $this->id . '_clear"'
				. ' onclick="window.processModalParent(\'' . $this->id . '\'); return false;">'
				. '<span class="icon-remove" aria-hidden="true"></span>' . JText::_('JCLEAR')
				. '</button>';
		}

		// Propagate menu item button
		if ($this->allowPropagate && count($languages) > 2)
		{
			// Strip off language tag at the end
			$tagLength = (int) strlen($this->element['language']);
			$callbackFunctionStem = substr("jSelectMenu_" . $this->id, 0, -$tagLength);

			$html .= '<a'
			. ' class="btn hasTooltip' . ($value ? '' : ' hidden') . '"'
			. ' id="' . $this->id . '_propagate"'
			. ' href="#"'
			. ' title="' . JHtml::tooltipText('JGLOBAL_ASSOCIATIONS_PROPAGATE_TIP') . '"'
			. ' onclick="Joomla.propagateAssociation(\'' . $this->id . '\', \'' . $callbackFunctionStem . '\');">'
			. '<span class="icon-refresh" aria-hidden="true"></span>' . JText::_('JGLOBAL_ASSOCIATIONS_PROPAGATE_BUTTON')
			. '</a>';
		}

		$html .= '</span>';


		// Select menu item modal
		if ($this->allowSelect)
		{
			$html .= JHtml::_(
				'bootstrap.renderModal',
				'ModalSelect' . $modalId,
				array(
					'title'       => $modalTitle,
					'url'         => $urlSelect,
					'height'      => '400px',
					'width'       => '800px',
					'bodyHeight'  => '70',
					'modalWidth'  => '80',
					'footer'      => '<button type="button" class="btn" data-dismiss="modal">' . JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>',
				)
			);
		}

		// New menu item modal
		if ($this->allowNew)
		{
			$html .= JHtml::_(
				'bootstrap.renderModal',
				'ModalNew' . $modalId,
				array(
					'title'       => JText::_('COM_MENUS_NEW_MENUITEM'),
					'backdrop'    => 'static',
					'keyboard'    => false,
					'closeButton' => false,
					'url'         => $urlNew,
					'height'      => '400px',
					'width'       => '800px',
					'bodyHeight'  => '70',
					'modalWidth'  => '80',
					'footer'      => '<button type="button" class="btn"'
							. ' onclick="window.processModalEdit(this, \'' . $this->id . '\', \'add\', \'item\', \'cancel\', \'item-form\'); return false;">'
							. JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>'
							. '<button type="button" class="btn btn-primary"'
							. ' onclick="window.processModalEdit(this, \'' . $this->id . '\', \'add\', \'item\', \'save\', \'item-form\'); return false;">'
							. JText::_('JSAVE') . '</button>'
							. '<button type="button" class="btn btn-success"'
							. ' onclick="window.processModalEdit(this, \'' . $this->id . '\', \'add\', \'item\', \'apply\', \'item-form\'); return false;">'
							. JText::_('JAPPLY') . '</button>',
				)
			);
		}

		// Edit menu item modal
		if ($this->allowEdit)
		{
			$html .= JHtml::_(
				'bootstrap.renderModal',
				'ModalEdit' . $modalId,
				array(
					'title'       => JText::_('COM_MENUS_EDIT_MENUITEM'),
					'backdrop'    => 'static',
					'keyboard'    => false,
					'closeButton' => false,
					'url'         => $urlEdit,
					'height'      => '400px',
					'width'       => '800px',
					'bodyHeight'  => '70',
					'modalWidth'  => '80',
					'footer'      => '<button type="button" class="btn"'
							. ' onclick="window.processModalEdit(this, \'' . $this->id . '\', \'edit\', \'item\', \'cancel\', \'item-form\'); return false;">'
							. JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>'
							. '<button type="button" class="btn btn-primary"'
							. ' onclick="window.processModalEdit(this, \'' . $this->id . '\', \'edit\', \'item\', \'save\', \'item-form\'); return false;">'
							. JText::_('JSAVE') . '</button>'
							. '<button type="button" class="btn btn-success"'
							. ' onclick="window.processModalEdit(this, \'' . $this->id . '\', \'edit\', \'item\', \'apply\', \'item-form\'); return false;">'
							. JText::_('JAPPLY') . '</button>',
				)
			);
		}

		// Note: class='required' for client side validation.
		$class = $this->required ? ' class="required modal-value"' : '';

		// Placeholder if option is present or not when clearing field
		if ($this->element->option && (string) $this->element->option['value'] == '')
		{
			$title_holder = JText::_($this->element->option);
		}
		else
		{
			$title_holder = JText::_('COM_MENUS_SELECT_A_MENUITEM');
		}

		$html .= '<input type="hidden" id="' . $this->id . '_id" ' . $class . ' data-required="' . (int) $this->required . '" name="' . $this->name
			. '" data-text="' . htmlspecialchars($title_holder, ENT_COMPAT, 'UTF-8') . '" value="' . $value . '" />';

		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());
	}
}
components/com_menus/models/fields/menuordering.php000060400000004701152453623440016664 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JFormHelper::loadFieldClass('list');

/**
 * Menu Ordering field.
 *
 * @since  1.6
 */
class JFormFieldMenuOrdering extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var        string
	 * @since   1.7
	 */
	protected $type = 'MenuOrdering';

	/**
	 * Method to get the list of siblings in a menu.
	 * The method requires that parent be set.
	 *
	 * @return  array  The field option objects or false if the parent field has not been set
	 *
	 * @since   1.7
	 */
	protected function getOptions()
	{
		$options = array();

		// Get the parent
		$parent_id = $this->form->getValue('parent_id', 0);

		if (empty($parent_id))
		{
			return false;
		}

		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('a.id AS value, a.title AS text, a.client_id AS ' . $db->quoteName('clientId'))
			->from('#__menu AS a')

			->where('a.published >= 0')
			->where('a.parent_id =' . (int) $parent_id);

		if ($menuType = $this->form->getValue('menutype'))
		{
			$query->where('a.menutype = ' . $db->quote($menuType));
		}
		else
		{
			$query->where('a.menutype != ' . $db->quote(''));
		}

		$query->order('a.lft ASC');

		// Get the options.
		$db->setQuery($query);

		try
		{
			$options = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $e->getMessage());
		}

		// Allow translation of custom admin menus
		foreach ($options as &$option)
		{
			if ($option->clientId != 0)
			{
				$option->text = JText::_($option->text);
			}
		}

		$options = array_merge(
			array(array('value' => '-1', 'text' => JText::_('COM_MENUS_ITEM_FIELD_ORDERING_VALUE_FIRST'))),
			$options,
			array(array('value' => '-2', 'text' => JText::_('COM_MENUS_ITEM_FIELD_ORDERING_VALUE_LAST')))
		);

		// Merge any additional options in the XML definition.
		$options = array_merge(parent::getOptions(), $options);

		return $options;
	}

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string  The field input markup.
	 *
	 * @since   1.7
	 */
	protected function getInput()
	{
		if ($this->form->getValue('id', 0) == 0)
		{
			return '<span class="readonly">' . JText::_('COM_MENUS_ITEM_FIELD_ORDERING_TEXT') . '</span>';
		}
		else
		{
			return parent::getInput();
		}
	}
}
components/com_menus/models/item.php000060400000125446152453623440013670 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

jimport('joomla.filesystem.path');
JLoader::register('MenusHelper', JPATH_ADMINISTRATOR . '/components/com_menus/helpers/menus.php');

/**
 * Menu Item Model for Menus.
 *
 * @since  1.6
 */
class MenusModelItem extends JModelAdmin
{
	/**
	 * The type alias for this content type.
	 *
	 * @var    string
	 * @since  3.4
	 */
	public $typeAlias = 'com_menus.item';

	/**
	 * The context used for the associations table
	 *
	 * @var    string
	 * @since  3.4.4
	 */
	protected $associationsContext = 'com_menus.item';

	/**
	 * @var    string  The prefix to use with controller messages.
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_MENUS_ITEM';

	/**
	 * @var    string  The help screen key for the menu item.
	 * @since  1.6
	 */
	protected $helpKey = 'JHELP_MENUS_MENU_ITEM_MANAGER_EDIT';

	/**
	 * @var    string  The help screen base URL for the menu item.
	 * @since  1.6
	 */
	protected $helpURL;

	/**
	 * @var    boolean  True to use local lookup for the help screen.
	 * @since  1.6
	 */
	protected $helpLocal = false;

	/**
	 * Batch copy/move command. If set to false,
	 * the batch copy/move command is not supported
	 *
	 * @var   string
	 */
	protected $batch_copymove = 'menu_id';

	/**
	 * Allowed batch commands
	 *
	 * @var   array
	 */
	protected $batch_commands = array(
		'assetgroup_id' => 'batchAccess',
		'language_id'   => 'batchLanguage'
	);

	/**
	 * 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;
		}

		$menuTypeId = 0;

		if (!empty($record->menutype))
		{
			$menuTypeId = $this->getMenuTypeId($record->menutype);
		}

		return JFactory::getUser()->authorise('core.delete', 'com_menus.menu.' . (int) $menuTypeId);
	}

	/**
	 * Method to test whether the state of a record can be edited.
	 *
	 * @param   object  $record  A record object.
	 *
	 * @return  boolean  True if allowed to change the state of the record. Defaults to the permission for the component.
	 *
	 * @since   3.6
	 */
	protected function canEditState($record)
	{
		$menuTypeId = !empty($record->menutype) ? $this->getMenuTypeId($record->menutype) : 0;
		$assetKey   = $menuTypeId ? 'com_menus.menu.' . (int) $menuTypeId : 'com_menus';

		return JFactory::getUser()->authorise('core.edit.state', $assetKey);
	}

	/**
	 * Batch copy menu items to a new menu or parent.
	 *
	 * @param   integer  $value     The new menu or sub-item.
	 * @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)
	{
		// $value comes as {menutype}.{parent_id}
		$parts    = explode('.', $value);
		$menuType = $parts[0];
		$parentId = ArrayHelper::getValue($parts, 1, 0, 'int');

		$table  = $this->getTable();
		$db     = $this->getDbo();
		$query  = $db->getQuery(true);
		$newIds = array();

		// Check that the parent exists
		if ($parentId)
		{
			if (!$table->load($parentId))
			{
				if ($error = $table->getError())
				{
					// Fatal error
					$this->setError($error);

					return false;
				}
				else
				{
					// Non-fatal error
					$this->setError(JText::_('JGLOBAL_BATCH_MOVE_PARENT_NOT_FOUND'));
					$parentId = 0;
				}
			}
		}

		// If the parent is 0, set it to the ID of the root item in the tree
		if (empty($parentId))
		{
			if (!$parentId = $table->getRootId())
			{
				$this->setError($db->getErrorMsg());

				return false;
			}
		}

		// Check that user has create permission for menus
		$user = JFactory::getUser();

		$menuTypeId = (int) $this->getMenuTypeId($menuType);

		if (!$user->authorise('core.create', 'com_menus.menu.' . $menuTypeId))
		{
			$this->setError(JText::_('COM_MENUS_BATCH_MENU_ITEM_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->select('COUNT(id)')
			->from($db->quoteName('#__menu'));
		$db->setQuery($query);

		try
		{
			$count = $db->loadResult();
		}
		catch (RuntimeException $e)
		{
			$this->setError($e->getMessage());

			return false;
		}

		// Parent exists so we let's proceed
		while (!empty($pks) && $count > 0)
		{
			// 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;
				}
				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('#__menu'))
				->where('lft > ' . (int) $table->lft)
				->where('rgt < ' . (int) $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 = $table->id;
			$oldParentId = $table->parent_id;

			// Reset the id because we are making a copy.
			$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
			$table->parent_id = isset($parents[$oldParentId]) ? $parents[$oldParentId] : $parentId;
			$table->menutype = $menuType;

			// Set the new location in the tree for the node.
			$table->setLocation($table->parent_id, 'last-child');

			// TODO: Deal with ordering?
			// $table->ordering = 1;
			$table->level = null;
			$table->lft   = null;
			$table->rgt   = null;
			$table->home  = 0;

			// Alter the title & alias
			list($title, $alias) = $this->generateNewTitle($table->parent_id, $table->alias, $table->title);
			$table->title = $title;
			$table->alias = $alias;

			// 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;

			// Now we log the old 'parent' to the new 'parent'
			$parents[$oldId] = $table->id;
			$count--;
		}

		// Rebuild the hierarchy.
		if (!$table->rebuild())
		{
			$this->setError($table->getError());

			return false;
		}

		// Rebuild the tree path.
		if (!$table->rebuildPath($table->id))
		{
			$this->setError($table->getError());

			return false;
		}

		// Clean the cache
		$this->cleanCache();

		return $newIds;
	}

	/**
	 * Batch move menu items to a new menu or parent.
	 *
	 * @param   integer  $value     The new menu or sub-item.
	 * @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)
	{
		// $value comes as {menutype}.{parent_id}
		$parts    = explode('.', $value);
		$menuType = $parts[0];
		$parentId = ArrayHelper::getValue($parts, 1, 0, 'int');

		$table = $this->getTable();
		$db    = $this->getDbo();
		$query = $db->getQuery(true);

		// Check that the parent exists.
		if ($parentId)
		{
			if (!$table->load($parentId))
			{
				if ($error = $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 and edit permission for menus
		$user = JFactory::getUser();

		$menuTypeId = (int) $this->getMenuTypeId($menuType);

		if (!$user->authorise('core.create', 'com_menus.menu.' . $menuTypeId))
		{
			$this->setError(JText::_('COM_MENUS_BATCH_MENU_ITEM_CANNOT_CREATE'));

			return false;
		}

		if (!$user->authorise('core.edit', 'com_menus.menu.' . $menuTypeId))
		{
			$this->setError(JText::_('COM_MENUS_BATCH_MENU_ITEM_CANNOT_EDIT'));

			return false;
		}

		// We are going to store all the children and just moved the menutype
		$children = array();

		// Parent exists so we let's proceed
		foreach ($pks as $pk)
		{
			// Check that the row actually exists
			if (!$table->load($pk))
			{
				if ($error = $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.
			$table->setLocation($parentId, 'last-child');

			// Set the new Parent Id
			$table->parent_id = $parentId;

			// Check if we are moving to a different menu
			if ($menuType != $table->menutype)
			{
				// Add the child node ids to the children array.
				$query->clear()
					->select($db->quoteName('id'))
					->from($db->quoteName('#__menu'))
					->where($db->quoteName('lft') . ' BETWEEN ' . (int) $table->lft . ' AND ' . (int) $table->rgt);
				$db->setQuery($query);
				$children = array_merge($children, (array) $db->loadColumn());
			}

			// Check the row.
			if (!$table->check())
			{
				$this->setError($table->getError());

				return false;
			}

			// Store the row.
			if (!$table->store())
			{
				$this->setError($table->getError());

				return false;
			}

			// Rebuild the tree path.
			if (!$table->rebuildPath())
			{
				$this->setError($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);

			// Update the menutype field in all nodes where necessary.
			$query->clear()
				->update($db->quoteName('#__menu'))
				->set($db->quoteName('menutype') . ' = ' . $db->quote($menuType))
				->where($db->quoteName('id') . ' IN (' . implode(',', $children) . ')');
			$db->setQuery($query);

			try
			{
				$db->execute();
			}
			catch (RuntimeException $e)
			{
				$this->setError($e->getMessage());

				return false;
			}
		}

		// Clean the cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Method to check if you can save 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 canSave($data = array(), $key = 'id')
	{
		return JFactory::getUser()->authorise('core.edit', $this->option);
	}

	/**
	 * 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  mixed  A JForm object on success, false on failure
	 *
	 * @since   1.6
	 */
	public function getForm($data = array(), $loadData = true)
	{
		// The folder and element vars are passed when saving the form.
		if (empty($data))
		{
			$item = $this->getItem();

			// The type should already be set.
			$this->setState('item.link', $item->link);
		}
		else
		{
			$this->setState('item.link', ArrayHelper::getValue($data, 'link'));
			$this->setState('item.type', ArrayHelper::getValue($data, 'type'));
		}

		$clientId = $this->getState('item.client_id');

		// Get the form.
		if ($clientId == 1)
		{
			$form = $this->loadForm('com_menus.item.admin', 'itemadmin', array('control' => 'jform', 'load_data' => $loadData), true);
		}
		else
		{
			$form = $this->loadForm('com_menus.item', 'item', array('control' => 'jform', 'load_data' => $loadData), true);
		}

		if (empty($form))
		{
			return false;
		}

		if ($loadData)
		{
			$data = $this->loadFormData();
		}

		// Modify the form based on access controls.
		if (!$this->canEditState((object) $data))
		{
			// Disable fields for display.
			$form->setFieldAttribute('menuordering', 'disabled', 'true');
			$form->setFieldAttribute('published', 'disabled', 'true');

			// Disable fields while saving.
			// The controller has already verified this is an article you can edit.
			$form->setFieldAttribute('menuordering', 'filter', 'unset');
			$form->setFieldAttribute('published', 'filter', 'unset');
		}

		// Filter available menus
		$action = $this->getState('item.id') > 0 ? 'edit' : 'create';

		$form->setFieldAttribute('menutype', 'accesstype', $action);
		$form->setFieldAttribute('type', 'clientid', $clientId);

		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, providing it has an ID and it is the same.
		$itemData = (array) $this->getItem();
		$sessionData = (array) JFactory::getApplication()->getUserState('com_menus.edit.item.data', array());

		// Only merge if there is a session and itemId or itemid is null.
		if (isset($sessionData['id']) && isset($itemData['id']) && $sessionData['id'] === $itemData['id']
			|| is_null($itemData['id']))
		{
			$data = array_merge($itemData, $sessionData);
		}
		else
		{
			$data = $itemData;
		}

		// For a new menu item, pre-select some filters (Status, Language, Access) in edit form if those have been selected in Menu Manager
		if ($this->getItem()->id == 0)
		{
			// Get selected fields
			$filters = JFactory::getApplication()->getUserState('com_menus.items.filter');
			$data['parent_id'] = (isset($filters['parent_id']) ? $filters['parent_id'] : null);
			$data['published'] = (isset($filters['published']) ? $filters['published'] : null);
			$data['language'] = (isset($filters['language']) ? $filters['language'] : null);
			$data['access'] = (!empty($filters['access']) ? $filters['access'] : JFactory::getConfig()->get('access'));
		}

		if (isset($data['menutype']) && !$this->getState('item.menutypeid'))
		{
			$menuTypeId = (int) $this->getMenuTypeId($data['menutype']);

			$this->setState('item.menutypeid', $menuTypeId);
		}

		$data = (object) $data;

		$this->preprocessData('com_menus.item', $data);

		return $data;
	}

	/**
	 * Get the necessary data to load an item help screen.
	 *
	 * @return  object  An object with key, url, and local properties for loading the item help screen.
	 *
	 * @since   1.6
	 */
	public function getHelp()
	{
		return (object) array('key' => $this->helpKey, 'url' => $this->helpURL, 'local' => $this->helpLocal);
	}

	/**
	 * Method to get a menu item.
	 *
	 * @param   integer  $pk  An optional id of the object to get, otherwise the id from the model state is used.
	 *
	 * @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('item.id');

		// Get a level row instance.
		$table = $this->getTable();

		// Attempt to load the row.
		$table->load($pk);

		// Check for a table object error.
		if ($error = $table->getError())
		{
			$this->setError($error);

			return false;
		}

		// Prime required properties.

		if ($type = $this->getState('item.type'))
		{
			$table->type = $type;
		}

		if (empty($table->id))
		{
			$table->parent_id = $this->getState('item.parent_id');
			$table->menutype  = $this->getState('item.menutype');
			$table->client_id = $this->getState('item.client_id');
			$table->params = '{}';
		}

		// If the link has been set in the state, possibly changing link type.
		if ($link = $this->getState('item.link'))
		{
			// Check if we are changing away from the actual link type.
			if (MenusHelper::getLinkKey($table->link) !== MenusHelper::getLinkKey($link) && (int) $table->id === (int) $this->getState('item.id'))
			{
				$table->link = $link;
			}
		}

		switch ($table->type)
		{
			case 'alias':
				$table->component_id = 0;
				$args = array();

				parse_str(parse_url($table->link, PHP_URL_QUERY), $args);
				break;

			case 'separator':
			case 'heading':
			case 'container':
				$table->link = '';
				$table->component_id = 0;
				break;

			case 'url':
				$table->component_id = 0;

				$args = array();
				parse_str(parse_url($table->link, PHP_URL_QUERY), $args);
				break;

			case 'component':
			default:
				// Enforce a valid type.
				$table->type = 'component';

				// Ensure the integrity of the component_id field is maintained, particularly when changing the menu item type.
				$args = array();
				parse_str(parse_url($table->link, PHP_URL_QUERY), $args);

				if (isset($args['option']))
				{
					// Load the language file for the component.
					$lang = JFactory::getLanguage();
					$lang->load($args['option'], JPATH_ADMINISTRATOR, null, false, true)
					|| $lang->load($args['option'], JPATH_ADMINISTRATOR . '/components/' . $args['option'], null, false, true);

					// Determine the component id.
					$component = JComponentHelper::getComponent($args['option']);

					if (isset($component->id))
					{
						$table->component_id = $component->id;
					}
				}
				break;
		}

		// We have a valid type, inject it into the state for forms to use.
		$this->setState('item.type', $table->type);

		// Convert to the JObject before adding the params.
		$properties = $table->getProperties(1);
		$result = ArrayHelper::toObject($properties);

		// Convert the params field to an array.
		$registry = new Registry($table->params);
		$result->params = $registry->toArray();

		// Merge the request arguments in to the params for a component.
		if ($table->type == 'component')
		{
			// Note that all request arguments become reserved parameter names.
			$result->request = $args;
			$result->params = array_merge($result->params, $args);

			// Special case for the Login menu item.
			// Display the login or logout redirect URL fields if not empty
			if ($table->link == 'index.php?option=com_users&view=login')
			{
				if (!empty($result->params['login_redirect_url']))
				{
					$result->params['loginredirectchoice'] = '0';
				}

				if (!empty($result->params['logout_redirect_url']))
				{
					$result->params['logoutredirectchoice'] = '0';
				}
			}
		}

		if ($table->type == 'alias')
		{
			// Note that all request arguments become reserved parameter names.
			$result->params = array_merge($result->params, $args);
		}

		if ($table->type == 'url')
		{
			// Note that all request arguments become reserved parameter names.
			$result->params = array_merge($result->params, $args);
		}

		// Load associated menu items, only supported for frontend for now
		if ($this->getState('item.client_id') == 0 && JLanguageAssociations::isEnabled())
		{
			if ($pk != null)
			{
				$result->associations = MenusHelper::getAssociations($pk);
			}
			else
			{
				$result->associations = array();
			}
		}

		$result->menuordering = $pk;

		return $result;
	}

	/**
	 * Get the list of modules not in trash.
	 *
	 * @return  mixed  An array of module records (id, title, position), or false on error.
	 *
	 * @since   1.6
	 */
	public function getModules()
	{
		$db = $this->getDbo();
		$query = $db->getQuery(true);

		// Currently any setting that affects target page for a backend menu is not supported, hence load no modules.
		if ($this->getState('item.client_id') == 1)
		{
			return false;
		}

		/**
		 * Join on the module-to-menu mapping table.
		 * We are only interested if the module is displayed on ALL or THIS menu item (or the inverse ID number).
		 * sqlsrv changes for modulelink to menu manager
		 */
		$query->select('a.id, a.title, a.position, a.published, map.menuid')
			->from('#__modules AS a')
			->join('LEFT', sprintf('#__modules_menu AS map ON map.moduleid = a.id AND map.menuid IN (0, %1$d, -%1$d)', $this->getState('item.id')))
			->select('(SELECT COUNT(*) FROM #__modules_menu WHERE moduleid = a.id AND menuid < 0) AS ' . $db->quoteName('except'));

		// Join on the asset groups table.
		$query->select('ag.title AS access_title')
			->join('LEFT', '#__viewlevels AS ag ON ag.id = a.access')
			->where('a.published >= 0')
			->where('a.client_id = ' . (int) $this->getState('item.client_id'))
			->order('a.position, a.ordering');

		$db->setQuery($query);

		try
		{
			$result = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			$this->setError($e->getMessage());

			return false;
		}

		return $result;
	}

	/**
	 * Get the list of all view levels
	 *
	 * @return  array|boolean  An array of all view levels (id, title).
	 *
	 * @since   3.4
	 */
	public function getViewLevels()
	{
		$db    = $this->getDbo();
		$query = $db->getQuery(true);

		// Get all the available view levels
		$query->select($db->quoteName('id'))
			->select($db->quoteName('title'))
			->from($db->quoteName('#__viewlevels'))
			->order($db->quoteName('id'));

		$db->setQuery($query);

		try
		{
			$result = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			$this->setError($e->getMessage());

			return false;
		}

		return $result;
	}

	/**
	 * 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 menutype.
	 *
	 * @param   JTableMenu  $table  instance.
	 *
	 * @return  array  An array of conditions to add to add to ordering queries.
	 *
	 * @since   1.6
	 */
	protected function getReorderConditions($table)
	{
		return array('menutype = ' . $this->_db->quote($table->get('menutype')));
	}

	/**
	 * 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|JTableNested  A database object.
	 *
	 * @since   1.6
	 */
	public function getTable($type = 'Menu', $prefix = 'MenusTable', $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');

		// Load the User state.
		$pk = $app->input->getInt('id');
		$this->setState('item.id', $pk);

		if (!($parentId = $app->getUserState('com_menus.edit.item.parent_id')))
		{
			$parentId = $app->input->getInt('parent_id');
		}

		$this->setState('item.parent_id', $parentId);

		$menuType = $app->getUserStateFromRequest('com_menus.items.menutype', 'menutype', '', 'string');

		// If we have a menutype we take client_id from there, unless forced otherwise
		if ($menuType)
		{
			$menuTypeObj = $this->getMenuType($menuType);

			// An invalid menutype will be handled as clientId = 0 and menuType = ''
			$menuType   = (string) $menuTypeObj->menutype;
			$menuTypeId = (int) $menuTypeObj->client_id;
			$clientId   = (int) $menuTypeObj->client_id;
		}
		else
		{
			$menuTypeId = 0;
			$clientId   = $app->getUserState('com_menus.items.client_id', 0);
		}

		// Forced client id will override/clear menuType if conflicted
		$forcedClientId = $app->input->get('client_id', null, 'string');

		// Current item if not new, we don't allow changing client id at all
		if ($pk)
		{
			$table = $this->getTable();
			$table->load($pk);
			$forcedClientId = $table->get('client_id', $forcedClientId);
		}

		if (isset($forcedClientId) && $forcedClientId != $clientId)
		{
			$clientId   = $forcedClientId;
			$menuType   = '';
			$menuTypeId = 0;
		}

		// Set the menu type and client id on the list view state, so we return to this menu after saving.
		$app->setUserState('com_menus.items.menutype', $menuType);
		$app->setUserState('com_menus.items.client_id', $clientId);

		$this->setState('item.menutype', $menuType);
		$this->setState('item.client_id', $clientId);
		$this->setState('item.menutypeid', $menuTypeId);

		if (!($type = $app->getUserState('com_menus.edit.item.type')))
		{
			$type = $app->input->get('type');

			/**
			 * Note: a new menu item will have no field type.
			 * The field is required so the user has to change it.
			 */
		}

		$this->setState('item.type', $type);

		if ($link = $app->getUserState('com_menus.edit.item.link'))
		{
			$this->setState('item.link', $link);
		}

		// Load the parameters.
		$params = JComponentHelper::getParams('com_menus');
		$this->setState('params', $params);
	}

	/**
	 * Loads the menutype object by a given menutype string
	 *
	 * @param   string  $menutype  The given menutype
	 *
	 * @return  stdClass
	 *
	 * @since   3.7.0
	 */
	protected function getMenuType($menutype)
	{
		$table = $this->getTable('MenuType', 'JTable');

		$table->load(array('menutype' => $menutype));

		return (object) $table->getProperties();
	}

	/**
	 * Loads the menutype ID by a given menutype string
	 *
	 * @param   string  $menutype  The given menutype
	 *
	 * @return  integer
	 *
	 * @since   3.6
	 */
	protected function getMenuTypeId($menutype)
	{
		$menu = $this->getMenuType($menutype);

		return (int) $menu->id;
	}

	/**
	 * 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  void
	 *
	 * @since   1.6
	 * @throws  Exception if there is an error in the form event.
	 */
	protected function preprocessForm(JForm $form, $data, $group = 'content')
	{
		$link     = $this->getState('item.link');
		$type     = $this->getState('item.type');
		$clientId = $this->getState('item.client_id');
		$formFile = false;

		// Load the specific type file
		$typeFile   = $clientId == 1 ? 'itemadmin_' . $type : 'item_' . $type;
		$clientInfo = JApplicationHelper::getClientInfo($clientId);

		// Initialise form with component view params if available.
		if ($type == 'component')
		{
			$link = htmlspecialchars_decode($link);

			// Parse the link arguments.
			$args = array();
			parse_str(parse_url(htmlspecialchars_decode($link), PHP_URL_QUERY), $args);

			// Confirm that the option is defined.
			$option = '';
			$base = '';

			if (isset($args['option']))
			{
				// The option determines the base path to work with.
				$option = $args['option'];
				$base = $clientInfo->path . '/components/' . $option;
			}

			if (isset($args['view']))
			{
				$view = $args['view'];

				// Determine the layout to search for.
				if (isset($args['layout']))
				{
					$layout = $args['layout'];
				}
				else
				{
					$layout = 'default';
				}

				// Check for the layout XML file. Use standard xml file if it exists.
				$tplFolders = array(
					$base . '/views/' . $view . '/tmpl',
					$base . '/view/' . $view . '/tmpl'
				);
				$path = JPath::find($tplFolders, $layout . '.xml');

				if (is_file($path))
				{
					$formFile = $path;
				}

				// If custom layout, get the xml file from the template folder
				// template folder is first part of file name -- template:folder
				if (!$formFile && (strpos($layout, ':') > 0))
				{
					list($altTmpl, $altLayout) = explode(':', $layout);

					$templatePath = JPath::clean($clientInfo->path . '/templates/' . $altTmpl . '/html/' . $option . '/' . $view . '/' . $altLayout . '.xml');

					if (is_file($templatePath))
					{
						$formFile = $templatePath;
					}
				}
			}

			// Now check for a view manifest file
			if (!$formFile)
			{
				if (isset($view))
				{
					$metadataFolders = array(
						$base . '/view/' . $view,
						$base . '/views/' . $view
					);
					$metaPath = JPath::find($metadataFolders, 'metadata.xml');

					if (is_file($path = JPath::clean($metaPath)))
					{
						$formFile = $path;
					}
				}
				elseif ($base)
				{
					// Now check for a component manifest file
					$path = JPath::clean($base . '/metadata.xml');

					if (is_file($path))
					{
						$formFile = $path;
					}
				}
			}
		}

		if ($formFile)
		{
			// If an XML file was found in the component, load it first.
			// We need to qualify the full path to avoid collisions with component file names.

			if ($form->loadFile($formFile, true, '/metadata') == false)
			{
				throw new Exception(JText::_('JERROR_LOADFILE_FAILED'));
			}

			// Attempt to load the xml file.
			if (!$xml = simplexml_load_file($formFile))
			{
				throw new Exception(JText::_('JERROR_LOADFILE_FAILED'));
			}

			// Get the help data from the XML file if present.
			$help = $xml->xpath('/metadata/layout/help');
		}
		else
		{
			// We don't have a component. Load the form XML to get the help path
			$xmlFile = JPath::find(JPATH_ADMINISTRATOR . '/components/com_menus/models/forms', $typeFile . '.xml');

			if ($xmlFile)
			{
				if (!$xml = simplexml_load_file($xmlFile))
				{
					throw new Exception(JText::_('JERROR_LOADFILE_FAILED'));
				}

				// Get the help data from the XML file if present.
				$help = $xml->xpath('/form/help');
			}
		}

		if (!empty($help))
		{
			$helpKey = trim((string) $help[0]['key']);
			$helpURL = trim((string) $help[0]['url']);
			$helpLoc = trim((string) $help[0]['local']);

			$this->helpKey = $helpKey ?: $this->helpKey;
			$this->helpURL = $helpURL ?: $this->helpURL;
			$this->helpLocal = (($helpLoc == 'true') || ($helpLoc == '1') || ($helpLoc == 'local')) ? true : false;
		}

		if (!$form->loadFile($typeFile, true, false))
		{
			throw new Exception(JText::_('JERROR_LOADFILE_FAILED'));
		}

		// Association menu items, we currently do not support this for admin menu… may be later
		if ($clientId == 0 && JLanguageAssociations::isEnabled())
		{
			$languages = JLanguageHelper::getContentLanguages(false, true, null, 'ordering', 'asc');

			if (count($languages) > 1)
			{
				$addform = new SimpleXMLElement('<form />');
				$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_menu');
					$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');
					$field->addAttribute('propagate', 'true');
					$option = $field->addChild('option', 'COM_MENUS_ITEM_FIELD_ASSOCIATION_NO_VALUE');
					$option->addAttribute('value', '');
				}

				$form->load($addform, false);
			}
		}

		// Trigger the default form events.
		parent::preprocessForm($form, $data, $group);
	}

	/**
	 * Method rebuild the entire nested set tree.
	 *
	 * @return  boolean|JException  Boolean true on success, boolean false or JException instance on error
	 *
	 * @since   1.6
	 */
	public function rebuild()
	{
		// Initialise variables.
		$db = $this->getDbo();
		$query = $db->getQuery(true);
		$table = $this->getTable();

		try
		{
			$rebuildResult = $table->rebuild();
		}
		catch (Exception $e)
		{
			$this->setError($e->getMessage());

			return false;
		}

		if (!$rebuildResult)
		{
			$this->setError($table->getError());

			return false;
		}

		$query->select('id, params')
			->from('#__menu')
			->where('params NOT LIKE ' . $db->quote('{%'))
			->where('params <> ' . $db->quote(''));
		$db->setQuery($query);

		try
		{
			$items = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			return JError::raiseWarning(500, $e->getMessage());
		}

		foreach ($items as &$item)
		{
			$registry = new Registry($item->params);
			$params = (string) $registry;

			$query->clear();
			$query->update('#__menu')
				->set('params = ' . $db->quote($params))
				->where('id = ' . $item->id);

			try
			{
				$db->setQuery($query)->execute();
			}
			catch (RuntimeException $e)
			{
				return JError::raiseWarning(500, $e->getMessage());
			}

			unset($registry);
		}

		// Clean the cache
		$this->cleanCache();

		return true;
	}

	/**
	 * 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();
		$pk         = (!empty($data['id'])) ? $data['id'] : (int) $this->getState('item.id');
		$isNew      = true;
		$table   = $this->getTable();
		$context = $this->option . '.' . $this->name;

		// Include the plugins for the on save events.
		JPluginHelper::importPlugin($this->events_map['save']);

		// Load the row if saving an existing item.
		if ($pk > 0)
		{
			$table->load($pk);
			$isNew = false;
		}

		if (!$isNew)
		{
			if ($table->parent_id == $data['parent_id'])
			{
				// If first is chosen make the item the first child of the selected parent.
				if ($data['menuordering'] == -1)
				{
					$table->setLocation($data['parent_id'], 'first-child');
				}
				// If last is chosen make it the last child of the selected parent.
				elseif ($data['menuordering'] == -2)
				{
					$table->setLocation($data['parent_id'], 'last-child');
				}
				// Don't try to put an item after itself. All other ones put after the selected item.
				// $data['id'] is empty means it's a save as copy
				elseif ($data['menuordering'] && $table->id != $data['menuordering'] || empty($data['id']))
				{
					$table->setLocation($data['menuordering'], 'after');
				}
				// Just leave it where it is if no change is made.
				elseif ($data['menuordering'] && $table->id == $data['menuordering'])
				{
					unset($data['menuordering']);
				}
			}
			// Set the new parent id if parent id not matched and put in last position
			else
			{
				$table->setLocation($data['parent_id'], 'last-child');
			}
		}
		// We have a new item, so it is not a change.
		else
		{
			$menuType = $this->getMenuType($data['menutype']);

			$data['client_id'] = $menuType->client_id;

			$table->setLocation($data['parent_id'], 'last-child');
		}

		// Bind the data.
		if (!$table->bind($data))
		{
			$this->setError($table->getError());

			return false;
		}

		// Alter the title & alias for save as copy.  Also, unset the home record.
		if (!$isNew && $data['id'] == 0)
		{
			list($title, $alias) = $this->generateNewTitle($table->parent_id, $table->alias, $table->title);

			$table->title     = $title;
			$table->alias     = $alias;
			$table->published = 0;
			$table->home      = 0;
		}

		// 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));

		// Store the data.
		if (in_array(false, $result, true)|| !$table->store())
		{
			$this->setError($table->getError());

			return false;
		}

		// Trigger the after save event.
		$dispatcher->trigger($this->event_after_save, array($context, &$table, $isNew));

		// Rebuild the tree path.
		if (!$table->rebuildPath($table->id))
		{
			$this->setError($table->getError());

			return false;
		}

		$this->setState('item.id', $table->id);
		$this->setState('item.menutype', $table->menutype);

		// Load associated menu items, for now not supported for admin menu… may be later
		if ($table->get('client_id') == 0 && JLanguageAssociations::isEnabled())
		{
			// 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
			$all_language = $table->language == '*';

			if ($all_language && !empty($associations))
			{
				JError::raiseNotice(403, JText::_('COM_MENUS_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);
			$old_key = $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($old_key) . ')'
				);
			}
			else
			{
				$query->where($db->quoteName('key') . ' = ' . $db->quote($old_key));
			}

			$db->setQuery($query);

			try
			{
				$db->execute();
			}
			catch (RuntimeException $e)
			{
				$this->setError($e->getMessage());

				return false;
			}

			// Adding self to the association
			if (!$all_language)
			{
				$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;
				}
			}
		}

		// Clean the cache
		$this->cleanCache();

		if (isset($data['link']))
		{
			$base = JUri::base();
			$juri = JUri::getInstance($base . $data['link']);
			$option = $juri->getVar('option');

			// Clean the cache
			parent::cleanCache($option);
		}

		if (Factory::getApplication()->input->get('task') == 'editAssociations')
		{
			return $this->redirectToAssociations($data);
		}

		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   Rows identifiers to be reordered
	 * @param   array  $lftArray  lft values of rows to be reordered
	 *
	 * @return  boolean false on failure or error, true otherwise.
	 *
	 * @since   1.6
	 */
	public function saveorder($idArray = null, $lftArray = null)
	{
		// Get an instance of the table object.
		$table = $this->getTable();

		if (!$table->saveorder($idArray, $lftArray))
		{
			$this->setError($table->getError());

			return false;
		}

		// Clean the cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Method to change the home state of one or more items.
	 *
	 * @param   array    $pks    A list of the primary keys to change.
	 * @param   integer  $value  The value of the home state.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function setHome(&$pks, $value = 1)
	{
		$table = $this->getTable();
		$pks = (array) $pks;

		$languages = array();
		$onehome = false;

		// Remember that we can set a home page for different languages,
		// so we need to loop through the primary key array.
		foreach ($pks as $i => $pk)
		{
			if ($table->load($pk))
			{
				if (!array_key_exists($table->language, $languages))
				{
					$languages[$table->language] = true;

					if ($table->home == $value)
					{
						unset($pks[$i]);
						JError::raiseNotice(403, JText::_('COM_MENUS_ERROR_ALREADY_HOME'));
					}
					elseif ($table->menutype == 'main')
					{
						// Prune items that you can't change.
						unset($pks[$i]);
						JError::raiseWarning(403, JText::_('COM_MENUS_ERROR_MENUTYPE_HOME'));
					}
					else
					{
						$table->home = $value;

						if ($table->language == '*')
						{
							$table->published = 1;
						}

						if (!$this->canSave($table))
						{
							// Prune items that you can't change.
							unset($pks[$i]);
							JError::raiseWarning(403, JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'));
						}
						elseif (!$table->check())
						{
							// Prune the items that failed pre-save checks.
							unset($pks[$i]);
							JError::raiseWarning(403, $table->getError());
						}
						elseif (!$table->store())
						{
							// Prune the items that could not be stored.
							unset($pks[$i]);
							JError::raiseWarning(403, $table->getError());
						}
					}
				}
				else
				{
					unset($pks[$i]);

					if (!$onehome)
					{
						$onehome = true;
						JError::raiseNotice(403, JText::sprintf('COM_MENUS_ERROR_ONE_HOME'));
					}
				}
			}
		}

		// Clean 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   1.6
	 */
	public function publish(&$pks, $value = 1)
	{
		$table = $this->getTable();
		$pks   = (array) $pks;

		// Default menu item existence checks.
		if ($value != 1)
		{
			foreach ($pks as $i => $pk)
			{
				if ($table->load($pk) && $table->home && $table->language == '*')
				{
					// Prune items that you can't change.
					JError::raiseWarning(403, JText::_('JLIB_DATABASE_ERROR_MENU_UNPUBLISH_DEFAULT_HOME'));
					unset($pks[$i]);
					break;
				}
			}
		}

		// Clean the cache
		$this->cleanCache();

		// Ensure that previous checks doesn't empty the array
		if (empty($pks))
		{
			return true;
		}

		return parent::publish($pks, $value);
	}

	/**
	 * Method to change the title & alias.
	 *
	 * @param   integer  $parentId  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.6
	 */
	protected function generateNewTitle($parentId, $alias, $title)
	{
		// Alter the title & alias
		$table = $this->getTable();

		while ($table->load(array('alias' => $alias, 'parent_id' => $parentId)))
		{
			if ($title == $table->title)
			{
				$title = StringHelper::increment($title);
			}

			$alias = StringHelper::increment($alias, 'dash');
		}

		return array($title, $alias);
	}

	/**
	 * Custom clean the cache
	 *
	 * @param   string   $group     Cache group name.
	 * @param   integer  $clientId  Application client id.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function cleanCache($group = null, $clientId = 0)
	{
		parent::cleanCache('com_menus', 0);
		parent::cleanCache('com_modules');
		parent::cleanCache('mod_menu', 0);
		parent::cleanCache('mod_menu', 1);
	}
}
components/com_menus/models/menutypes.php000060400000036050152453623440014753 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

jimport('joomla.filesystem.folder');
jimport('joomla.filesystem.path');
/**
 * Menu Item Types Model for Menus.
 *
 * @since  1.6
 */
class MenusModelMenutypes extends JModelLegacy
{
	/**
	 * A reverse lookup of the base link URL to Title
	 *
	 * @var  array
	 */
	protected $rlu = array();

	/**
	 * Method to auto-populate the model state.
	 *
	 * This method should only be called once per instantiation and is designed
	 * to be called on the first call to the getState() method unless the model
	 * configuration flag to ignore the request is set.
	 *
	 * @return  void
	 *
	 * @note    Calling getState in this method will result in recursion.
	 * @since   3.0.1
	 */
	protected function populateState()
	{
		parent::populateState();

		$app      = JFactory::getApplication();
		$clientId = $app->input->get('client_id', 0);

		$this->state->set('client_id', $clientId);
	}

	/**
	 * Method to get the reverse lookup of the base link URL to Title
	 *
	 * @return  array  Array of reverse lookup of the base link URL to Title
	 *
	 * @since   1.6
	 */
	public function getReverseLookup()
	{
		if (empty($this->rlu))
		{
			$this->getTypeOptions();
		}

		return $this->rlu;
	}

	/**
	 * Method to get the available menu item type options.
	 *
	 * @return  array  Array of groups with menu item types.
	 *
	 * @since   1.6
	 */
	public function getTypeOptions()
	{
		jimport('joomla.filesystem.file');

		$lang = JFactory::getLanguage();
		$list = array();

		// Get the list of components.
		$db    = $this->getDbo();
		$query = $db->getQuery(true)
			->select('name, element AS ' . $db->quoteName('option'))
			->from('#__extensions')
			->where('type = ' . $db->quote('component'))
			->where('enabled = 1')
			->order('name ASC');
		$db->setQuery($query);
		$components = $db->loadObjectList();

		foreach ($components as $component)
		{
			$options = $this->getTypeOptionsByComponent($component->option);

			if ($options)
			{
				$list[$component->name] = $options;

				// Create the reverse lookup for link-to-name.
				foreach ($options as $option)
				{
					if (isset($option->request))
					{
						$this->addReverseLookupUrl($option);

						if (isset($option->request['option']))
						{
							$componentLanguageFolder = JPATH_ADMINISTRATOR . '/components/' . $option->request['option'];
							$lang->load($option->request['option'] . '.sys', JPATH_ADMINISTRATOR, null, false, true)
								||	$lang->load($option->request['option'] . '.sys', $componentLanguageFolder, null, false, true);
						}
					}
				}
			}
		}

		// Allow a system plugin to insert dynamic menu types to the list shown in menus:
		JEventDispatcher::getInstance()->trigger('onAfterGetMenuTypeOptions', array(&$list, $this));

		return $list;
	}

	/**
	 * Method to create the reverse lookup for link-to-name.
	 * (can be used from onAfterGetMenuTypeOptions handlers)
	 *
	 * @param   JObject  $option  with request array or string and title public variables
	 *
	 * @return  void
	 *
	 * @since   3.1
	 */
	public function addReverseLookupUrl($option)
	{
		$this->rlu[MenusHelper::getLinkKey($option->request)] = $option->get('title');
	}

	/**
	 * Get menu types by component.
	 *
	 * @param   string  $component  Component URL option.
	 *
	 * @return  array
	 *
	 * @since   1.6
	 */
	protected function getTypeOptionsByComponent($component)
	{
		$options = array();
		$client  = JApplicationHelper::getClientInfo($this->getState('client_id'));
		$mainXML = $client->path . '/components/' . $component . '/metadata.xml';

		if (is_file($mainXML))
		{
			$options = $this->getTypeOptionsFromXml($mainXML, $component);
		}

		if (empty($options))
		{
			$options = $this->getTypeOptionsFromMvc($component);
		}

		if ($client->id == 1 && empty($options))
		{
			$options = $this->getTypeOptionsFromManifest($component);
		}

		return $options;
	}

	/**
	 * Get the menu types from an XML file
	 *
	 * @param   string  $file       File path
	 * @param   string  $component  Component option as in URL
	 *
	 * @return  array|boolean
	 *
	 * @since   1.6
	 */
	protected function getTypeOptionsFromXml($file, $component)
	{
		$options = array();

		// Attempt to load the xml file.
		if (!$xml = simplexml_load_file($file))
		{
			return false;
		}

		// Look for the first menu node off of the root node.
		if (!$menu = $xml->xpath('menu[1]'))
		{
			return false;
		}
		else
		{
			$menu = $menu[0];
		}

		// If we have no options to parse, just add the base component to the list of options.
		if (!empty($menu['options']) && $menu['options'] == 'none')
		{
			// Create the menu option for the component.
			$o = new JObject;
			$o->title       = (string) $menu['name'];
			$o->description = (string) $menu['msg'];
			$o->request     = array('option' => $component);

			$options[] = $o;

			return $options;
		}

		// Look for the first options node off of the menu node.
		if (!$optionsNode = $menu->xpath('options[1]'))
		{
			return false;
		}
		else
		{
			$optionsNode = $optionsNode[0];
		}

		// Make sure the options node has children.
		if (!$children = $optionsNode->children())
		{
			return false;
		}

		// Process each child as an option.
		foreach ($children as $child)
		{
			if ($child->getName() == 'option')
			{
				// Create the menu option for the component.
				$o = new JObject;
				$o->title       = (string) $child['name'];
				$o->description = (string) $child['msg'];
				$o->request     = array('option' => $component, (string) $optionsNode['var'] => (string) $child['value']);

				$options[] = $o;
			}
			elseif ($child->getName() == 'default')
			{
				// Create the menu option for the component.
				$o = new JObject;
				$o->title       = (string) $child['name'];
				$o->description = (string) $child['msg'];
				$o->request     = array('option' => $component);

				$options[] = $o;
			}
		}

		return $options;
	}

	/**
	 * Get menu types from MVC
	 *
	 * @param   string  $component  Component option like in URLs
	 *
	 * @return  array|boolean
	 *
	 * @since   1.6
	 */
	protected function getTypeOptionsFromMvc($component)
	{
		$options = array();
		$client  = JApplicationHelper::getClientInfo($this->getState('client_id'));

		// Get the views for this component.
		if (is_dir($client->path . '/components/' . $component))
		{
			$folders = JFolder::folders($client->path . '/components/' . $component, '^view[s]?$', false, true);
		}

		$path = '';

		if (!empty($folders[0]))
		{
			$path = $folders[0];
		}

		if (is_dir($path))
		{
			$views = JFolder::folders($path);
		}
		else
		{
			return false;
		}

		foreach ($views as $view)
		{
			// Ignore private views.
			if (strpos($view, '_') !== 0)
			{
				// Determine if a metadata file exists for the view.
				$file = $path . '/' . $view . '/metadata.xml';

				if (is_file($file))
				{
					// Attempt to load the xml file.
					if ($xml = simplexml_load_file($file))
					{
						// Look for the first view node off of the root node.
						if ($menu = $xml->xpath('view[1]'))
						{
							$menu = $menu[0];

							// If the view is hidden from the menu, discard it and move on to the next view.
							if (!empty($menu['hidden']) && $menu['hidden'] == 'true')
							{
								unset($xml);
								continue;
							}

							// Do we have an options node or should we process layouts?
							// Look for the first options node off of the menu node.
							if ($optionsNode = $menu->xpath('options[1]'))
							{
								$optionsNode = $optionsNode[0];

								// Make sure the options node has children.
								if ($children = $optionsNode->children())
								{
									// Process each child as an option.
									foreach ($children as $child)
									{
										if ($child->getName() == 'option')
										{
											// Create the menu option for the component.
											$o = new JObject;
											$o->title       = (string) $child['name'];
											$o->description = (string) $child['msg'];
											$o->request     = array('option' => $component, 'view' => $view, (string) $optionsNode['var'] => (string) $child['value']);

											$options[] = $o;
										}
										elseif ($child->getName() == 'default')
										{
											// Create the menu option for the component.
											$o = new JObject;
											$o->title       = (string) $child['name'];
											$o->description = (string) $child['msg'];
											$o->request     = array('option' => $component, 'view' => $view);

											$options[] = $o;
										}
									}
								}
							}
							else
							{
								$options = array_merge($options, (array) $this->getTypeOptionsFromLayouts($component, $view));
							}
						}

						unset($xml);
					}
				}
				else
				{
					$options = array_merge($options, (array) $this->getTypeOptionsFromLayouts($component, $view));
				}
			}
		}

		return $options;
	}

	/**
	 * Get menu types from Component manifest
	 *
	 * @param   string  $component  Component option like in URLs
	 *
	 * @return  array|boolean
	 *
	 * @since   3.7.0
	 */
	protected function getTypeOptionsFromManifest($component)
	{
		// Load the component manifest
		$fileName = JPATH_ADMINISTRATOR . '/components/' . $component . '/' . str_replace('com_', '', $component) . '.xml';

		if (!is_file($fileName))
		{
			return false;
		}

		if (!($manifest = simplexml_load_file($fileName)))
		{
			return false;
		}

		// Check for a valid XML root tag.
		if ($manifest->getName() != 'extension')
		{
			return false;
		}

		$options = array();

		// Start with the component root menu.
		$rootMenu = $manifest->administration->menu;

		// If the menu item doesn't exist or is hidden do nothing.
		if (!$rootMenu || in_array((string) $rootMenu['hidden'], array('true', 'hidden')))
		{
			return $options;
		}

		// Create the root menu option.
		$ro = new stdClass;
		$ro->title       = (string) trim($rootMenu);
		$ro->description = '';
		$ro->request     = array('option' => $component);

		// Process submenu options.
		$submenu = $manifest->administration->submenu;

		if (!$submenu)
		{
			return $options;
		}

		foreach ($submenu->menu as $child)
		{
			$attributes = $child->attributes();

			$o = new stdClass;
			$o->title       = (string) trim($child);
			$o->description = '';

			if ((string) $attributes->link)
			{
				parse_str((string) $attributes->link, $request);
			}
			else
			{
				$request = array();

				$request['option']     = $component;
				$request['act']        = (string) $attributes->act;
				$request['task']       = (string) $attributes->task;
				$request['controller'] = (string) $attributes->controller;
				$request['view']       = (string) $attributes->view;
				$request['layout']     = (string) $attributes->layout;
				$request['sub']        = (string) $attributes->sub;
			}

			$o->request = array_filter($request, 'strlen');
			$options[]  = new JObject($o);

			// Do not repeat the default view link (index.php?option=com_abc).
			if (count($o->request) == 1)
			{
				$ro = null;
			}
		}

		if ($ro)
		{
			$options[] = new JObject($ro);
		}

		return $options;
	}

	/**
	 * Get the menu types from component layouts
	 *
	 * @param   string  $component  Component option as in URLs
	 * @param   string  $view       Name of the view
	 *
	 * @return  array
	 *
	 * @since   1.6
	 */
	protected function getTypeOptionsFromLayouts($component, $view)
	{
		$options     = array();
		$layouts     = array();
		$layoutNames = array();
		$lang        = JFactory::getLanguage();
		$path        = '';
		$client      = JApplicationHelper::getClientInfo($this->getState('client_id'));

		// Get the views for this component.
		if (is_dir($client->path . '/components/' . $component))
		{
			$folders = JFolder::folders($client->path . '/components/' . $component, '^view[s]?$', false, true);
		}

		if (!empty($folders[0]))
		{
			$path = $folders[0] . '/' . $view . '/tmpl';
		}

		if (is_dir($path))
		{
			$layouts = array_merge($layouts, JFolder::files($path, '.xml$', false, true));
		}
		else
		{
			return $options;
		}

		// Build list of standard layout names
		foreach ($layouts as $layout)
		{
			// Ignore private layouts.
			if (strpos(basename($layout), '_') === false)
			{
				// Get the layout name.
				$layoutNames[] = basename($layout, '.xml');
			}
		}

		// Get the template layouts
		// TODO: This should only search one template -- the current template for this item (default of specified)
		$folders = JFolder::folders($client->path . '/templates', '', false, true);

		// Array to hold association between template file names and templates
		$templateName = array();

		foreach ($folders as $folder)
		{
			if (is_dir($folder . '/html/' . $component . '/' . $view))
			{
				$template = basename($folder);
				$lang->load('tpl_' . $template . '.sys', $client->path, null, false, true)
				|| $lang->load('tpl_' . $template . '.sys', $client->path . '/templates/' . $template, null, false, true);

				$templateLayouts = JFolder::files($folder . '/html/' . $component . '/' . $view, '.xml$', false, true);

				foreach ($templateLayouts as $layout)
				{
					// Get the layout name.
					$templateLayoutName = basename($layout, '.xml');

					// Add to the list only if it is not a standard layout
					if (array_search($templateLayoutName, $layoutNames) === false)
					{
						$layouts[] = $layout;

						// Set template name array so we can get the right template for the layout
						$templateName[$layout] = basename($folder);
					}
				}
			}
		}

		// Process the found layouts.
		foreach ($layouts as $layout)
		{
			// Ignore private layouts.
			if (strpos(basename($layout), '_') === false)
			{
				$file = $layout;

				// Get the layout name.
				$layout = basename($layout, '.xml');

				// Create the menu option for the layout.
				$o = new JObject;
				$o->title       = ucfirst($layout);
				$o->description = '';
				$o->request     = array('option' => $component, 'view' => $view);

				// Only add the layout request argument if not the default layout.
				if ($layout != 'default')
				{
					// If the template is set, add in format template:layout so we save the template name
					$o->request['layout'] = isset($templateName[$file]) ? $templateName[$file] . ':' . $layout : $layout;
				}

				// Load layout metadata if it exists.
				if (is_file($file))
				{
					// Attempt to load the xml file.
					if ($xml = simplexml_load_file($file))
					{
						// Look for the first view node off of the root node.
						if ($menu = $xml->xpath('layout[1]'))
						{
							$menu = $menu[0];

							// If the view is hidden from the menu, discard it and move on to the next view.
							if (!empty($menu['hidden']) && $menu['hidden'] == 'true')
							{
								unset($xml);
								unset($o);
								continue;
							}

							// Populate the title and description if they exist.
							if (!empty($menu['title']))
							{
								$o->title = trim((string) $menu['title']);
							}

							if (!empty($menu->message[0]))
							{
								$o->description = trim((string) $menu->message[0]);
							}
						}
					}
				}

				// Add the layout to the options array.
				$options[] = $o;
			}
		}

		return $options;
	}
}
components/com_menus/models/forms/item_url.xml000060400000004253152453623440015701 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="params">
		<fieldset name="menu-options" label="COM_MENUS_LINKTYPE_OPTIONS_LABEL"
		>

			<field 
				name="menu-anchor_title"
				type="text" 
				label="COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_LABEL"
				description="COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_DESC" 
			/>

			<field 
				name="menu-anchor_css"
				type="text" 
				label="COM_MENUS_ITEM_FIELD_ANCHOR_CSS_LABEL"
				description="COM_MENUS_ITEM_FIELD_ANCHOR_CSS_DESC" 
			/>

			<field 
				name="menu-anchor_rel" 
				type="list"
				label="COM_MENUS_ITEM_FIELD_ANCHOR_REL_LABEL"
				description="COM_MENUS_ITEM_FIELD_ANCHOR_REL_DESC"
				default=""
				>
				<option value="">JNONE</option>
				<option value="alternate"/>
				<option value="author"/>
				<option value="bookmark"/>
				<option value="help"/>
				<option value="license"/>
				<option value="next"/>
				<option value="nofollow"/>
				<option value="noopener"/>
				<option value="noreferrer"/>
				<option value="prefetch"/>
				<option value="prev"/>
				<option value="search"/>
				<option value="sponsored"/>
				<option value="tag"/>
				<option value="ugc"/>
			</field>

			<field 
				name="menu_image" 
				type="media"
				label="COM_MENUS_ITEM_FIELD_MENU_IMAGE_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_IMAGE_DESC" 
			/>

			<field 
				name="menu_image_css"
				type="text" 
				label="COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_DESC" 
			/>

			<field 
				name="menu_text" 
				type="radio"
				label="COM_MENUS_ITEM_FIELD_MENU_TEXT_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_TEXT_DESC"
				class="btn-group btn-group-yesno"
				default="1" 
				filter="integer"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>

			<field
				name="menu_show"
				type="radio"
				label="COM_MENUS_ITEM_FIELD_MENU_SHOW_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_SHOW_DESC"
				class="btn-group btn-group-yesno"
				default="1"
				filter="integer"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>
		</fieldset>
	</fields>
	<help key="JHELP_MENUS_MENU_ITEM_EXTERNAL_URL" />
</form>
components/com_menus/models/forms/filter_items.xml000060400000007406152453623440016552 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<field
		name="client_id"
		type="list"
		label=""
		filtermode="selector"
		onchange="this.form.submit();"
		>
		<option value="0">JSITE</option>
		<option value="1">JADMINISTRATOR</option>
	</field>
	<field
		name="menutype"
		type="menu"
		label="COM_MENUS_FILTER_CATEGORY"
		description="JOPTION_FILTER_CATEGORY_DESC"
		accesstype="manage"
		clientid=""
		showAll="false"
		filtermode="selector"
		onchange="this.form.submit();"
		>
		<option value="">COM_MENUS_SELECT_MENU</option>
	</field>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_MENUS_ITEMS_SEARCH_FILTER_LABEL"
			description="COM_MENUS_ITEMS_SEARCH_FILTER"
			hint="JSEARCH_FILTER"
			noresults="JGLOBAL_NO_MATCHING_RESULTS"
		/>
		<field
			name="published"
			type="status"
			label="COM_MENUS_FILTER_PUBLISHED"
			description="COM_MENUS_FILTER_PUBLISHED_DESC"
			filter="*,0,1,-2"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>
		<field
			name="access"
			type="accesslevel"
			label="JOPTION_FILTER_ACCESS"
			description="JOPTION_FILTER_ACCESS_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_ACCESS</option>
		</field>
		<field
			name="language"
			type="contentlanguage"
			label="JOPTION_FILTER_LANGUAGE"
			description="JOPTION_FILTER_LANGUAGE_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_LANGUAGE</option>
			<option value="*">JALL</option>
		</field>
		<field
			name="level"
			type="integer"
			label="JOPTION_FILTER_LEVEL"
			description="JOPTION_FILTER_LEVEL_DESC"
			first="1"
			last="10"
			step="1"
			languages="*"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_MAX_LEVELS</option>
		</field>
		<field
			name="parent_id"
			type="menuitembytype"
			label="COM_MENUS_FILTER_PARENT_MENU_ITEM_LABEL"
			description="COM_MENUS_FILTER_PARENT_MENU_ITEM_DESC"
			onchange="this.form.submit();"
			>
			<option value="">COM_MENUS_FILTER_SELECT_PARENT_MENU_ITEM</option>
		</field>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			statuses="*,0,1,2,-2"
			onchange="this.form.submit();"
			default="a.lft ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.lft ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.lft DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.published ASC">JSTATUS_ASC</option>
			<option value="a.published DESC">JSTATUS_DESC</option>
			<option value="a.title ASC">JGLOBAL_TITLE_ASC</option>
			<option value="a.title DESC">JGLOBAL_TITLE_DESC</option>
			<option value="menutype_title ASC">COM_MENUS_HEADING_MENU_ASC</option>
			<option value="menutype_title DESC">COM_MENUS_HEADING_MENU_DESC</option>
			<option value="a.home ASC">COM_MENUS_HEADING_HOME_ASC</option>
			<option value="a.home DESC">COM_MENUS_HEADING_HOME_DESC</option>
			<option value="a.access ASC">JGRID_HEADING_ACCESS_ASC</option>
			<option value="a.access DESC">JGRID_HEADING_ACCESS_DESC</option>
			<option value="association ASC" requires="associations">JASSOCIATIONS_ASC</option>
			<option value="association DESC" requires="associations">JASSOCIATIONS_DESC</option>
			<option value="language ASC">JGRID_HEADING_LANGUAGE_ASC</option>
			<option value="language DESC">JGRID_HEADING_LANGUAGE_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			label="COM_MENUS_LIST_LIMIT"
			description="COM_MENUS_LIST_LIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_menus/models/forms/itemadmin_separator.xml000060400000001253152453623440020105 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<!-- Text separator type menu item does not have a navigation -->
		<field
			name="link"
			type="hidden"
		/>

		<field
			name="browserNav"
			type="hidden"
			default="0"
		/>

		<fields name="params">
			<field
				name="text_separator"
				type="radio"
				label="COM_MENUS_ITEM_FIELD_TEXT_SEPARATOR_LABEL"
				description="COM_MENUS_ITEM_FIELD_TEXT_SEPARATOR_DESC"
				class="btn-group btn-group-yesno"
				default="0"
				filter="integer"
				>
				<option value="0">JNO</option>
				<option value="1">JYES</option>
			</field>
		</fields>
	</fieldset>

	<help key="JHELP_MENUS_MENU_ITEM_TEXT_SEPARATOR" />
</form>
components/com_menus/models/forms/itemadmin_component.xml000060400000003003152453623440020102 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="params" label="COM_MENUS_LINKTYPE_OPTIONS_LABEL">
		<fieldset name="menu-options"
			label="COM_MENUS_LINKTYPE_OPTIONS_LABEL"
		>

			<field 
				name="menu-anchor_title" 
				type="text"
				label="COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_LABEL"
				description="COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_DESC" 
			/>

			<field
				name="menu-anchor_css" 
				type="text"
				label="COM_MENUS_ITEM_FIELD_ANCHOR_CSS_LABEL"
				description="COM_MENUS_ITEM_FIELD_ANCHOR_CSS_DESC" 
			/>

			<field 
				name="menu_image" 
				type="media"
				label="COM_MENUS_ITEM_FIELD_MENU_IMAGE_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_IMAGE_DESC" 
			/>

			<field 
				name="menu_image_css"
				type="text" 
				label="COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_DESC" 
			/>

			<field 
				name="menu_text" 
				type="radio"
				label="COM_MENUS_ITEM_FIELD_MENU_TEXT_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_TEXT_DESC"
				class="btn-group btn-group-yesno"
				default="1" 
				filter="integer"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>

			<field
				name="menu_show"
				type="radio"
				label="COM_MENUS_ITEM_FIELD_MENU_SHOW_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_SHOW_DESC"
				class="btn-group btn-group-yesno"
				default="1"
				filter="integer"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>
		</fieldset>
	</fields>
</form>
components/com_menus/models/forms/item_heading.xml000060400000003022152453623440016467 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="params">
		<fieldset name="menu-options"
			label="COM_MENUS_LINKTYPE_OPTIONS_LABEL"
		>
			<field 
				name="menu-anchor_title" 
				type="text"
				label="COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_LABEL"
				description="COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_DESC" 
			/>

			<field 
				name="menu-anchor_css" 
				type="text"
				label="COM_MENUS_ITEM_FIELD_ANCHOR_CSS_LABEL"
				description="COM_MENUS_ITEM_FIELD_ANCHOR_CSS_DESC" 
			/>

			<field 
				name="menu_image" 
				type="media"
				label="COM_MENUS_ITEM_FIELD_MENU_IMAGE_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_IMAGE_DESC" 
			/>

			<field 
				name="menu_image_css"
				type="text" 
				label="COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_DESC" 
			/>

			<field 
				name="menu_text" 
				type="radio"
				label="COM_MENUS_ITEM_FIELD_MENU_TEXT_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_TEXT_DESC"
				class="btn-group btn-group-yesno"
				default="1" 
				filter="integer"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>

			<field
				name="menu_show"
				type="radio"
				label="COM_MENUS_ITEM_FIELD_MENU_SHOW_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_SHOW_DESC"
				class="btn-group btn-group-yesno"
				default="1"
				filter="integer"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>
		</fieldset>
	</fields>
	<help key="JHELP_MENUS_MENU_ITEM_MENU_ITEM_HEADING" />
</form>
components/com_menus/models/forms/item_alias.xml000060400000004315152453623440016167 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<!-- Add fields to the request variables for the layout. -->

	<fields name="params">

		<fieldset name="aliasoptions">
			<field
				name="aliasoptions"
				type="modal_menu"
				label="COM_MENUS_ITEM_FIELD_ALIAS_MENU_LABEL"
				description="COM_MENUS_ITEM_FIELD_ALIAS_MENU_DESC"
				clientid="0"
				required="true"
				select="true"
				new="true"
				edit="true"
				clear="true"
			/>

			<field
				name="alias_redirect"
				type="radio"
				label="COM_MENUS_ITEM_FIELD_ALIAS_REDIRECT_LABEL"
				description="COM_MENUS_ITEM_FIELD_ALIAS_REDIRECT_DESC"
				class="btn-group btn-group-yesno"
				default="0"
				filter="integer"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>
		</fieldset>

		<fieldset name="menu-options"
				label="COM_MENUS_LINKTYPE_OPTIONS_LABEL"
			>

			<field
				name="menu-anchor_title"
				type="text"
				label="COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_LABEL"
				description="COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_DESC"
			/>

			<field
				name="menu-anchor_css"
				type="text"
				label="COM_MENUS_ITEM_FIELD_ANCHOR_CSS_LABEL"
				description="COM_MENUS_ITEM_FIELD_ANCHOR_CSS_DESC"
			/>

			<field
				name="menu_image"
				type="media"
				label="COM_MENUS_ITEM_FIELD_MENU_IMAGE_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_IMAGE_DESC"
			/>

			<field
				name="menu_image_css"
				type="text"
				label="COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_DESC"
			/>

			<field
				name="menu_text"
				type="radio"
				label="COM_MENUS_ITEM_FIELD_MENU_TEXT_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_TEXT_DESC"
				class="btn-group btn-group-yesno"
				default="1"
				filter="integer"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>

			<field
				name="menu_show"
				type="radio"
				label="COM_MENUS_ITEM_FIELD_MENU_SHOW_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_SHOW_DESC"
				default="1"
				filter="integer"
				class="btn-group btn-group-yesno"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>
		</fieldset>
	</fields>
	<help key="JHELP_MENUS_MENU_ITEM_MENU_ITEM_ALIAS" />
</form>
components/com_menus/models/forms/item.xml000060400000011253152453623440015015 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<field
			name="id"
			type="hidden"
			label="JGLOBAL_FIELD_ID_LABEL"
			description="JGLOBAL_FIELD_ID_DESC"
			class="readonly"
			default="0"
			filter="int"
			readonly="true"
		/>

		<field
			name="title"
			type="text"
			label="COM_MENUS_ITEM_FIELD_TITLE_LABEL"
			description="COM_MENUS_ITEM_FIELD_TITLE_DESC"
			class="input-xxlarge input-large-text"
			size="40"
			required="true"
		/>

		<field
			name="alias"
			type="alias"
			label="JFIELD_ALIAS_LABEL"
			description="JFIELD_ALIAS_DESC"
			hint="JFIELD_ALIAS_PLACEHOLDER"
			size="40"
		/>

		<field
			name="note"
			type="text"
			label="JFIELD_NOTE_LABEL"
			description="COM_MENUS_ITEM_FIELD_NOTE_DESC"
			maxlength="255"
			class="span12"
			size="40"
		/>

		<field
			name="link"
			type="link"
			label="COM_MENUS_ITEM_FIELD_LINK_LABEL"
			description="COM_MENUS_ITEM_FIELD_LINK_DESC"
			readonly="true"
			class="input-xxlarge"
			size="50"
		/>

		<field
			name="menutype"
			type="menu"
			label="COM_MENUS_ITEM_FIELD_ASSIGNED_LABEL"
			description="COM_MENUS_ITEM_FIELD_ASSIGNED_DESC"
			required="true"
			clientid="0"
			size="1"
			>
			<option value="">COM_MENUS_SELECT_MENU</option>
		</field>

		<field
			name="type"
			type="menutype"
			label="COM_MENUS_ITEM_FIELD_TYPE_LABEL"
			description="COM_MENUS_ITEM_FIELD_TYPE_DESC"
			class="input-medium"
			required="true"
			size="40"
		/>

		<field
			name="published"
			type="list"
			label="JSTATUS"
			description="JFIELD_PUBLISHED_DESC"
			id="published"
			class="chzn-color-state"
			size="1"
			default="1"
			filter="integer"
			>
			<option value="1">JPUBLISHED</option>
			<option value="0">JUNPUBLISHED</option>
			<option value="-2">JTRASHED</option>
		</field>

		<field
			name="parent_id"
			type="menuparent"
			label="COM_MENUS_ITEM_FIELD_PARENT_LABEL"
			description="COM_MENUS_ITEM_FIELD_PARENT_DESC"
			default="1"
			filter="int"
			clientid="0"
			size="1"
			>
			<option value="1">COM_MENUS_ITEM_ROOT</option>
		</field>

		<field
			name="menuordering"
			type="menuordering"
			label="COM_MENUS_ITEM_FIELD_ORDERING_LABEL"
			description="COM_MENUS_ITEM_FIELD_ORDERING_DESC"
			filter="int"
			size="1">
		</field>

		<field
			name="component_id"
			type="hidden"
			filter="int"
		/>

		<field
			name="browserNav"
			type="list"
			label="COM_MENUS_ITEM_FIELD_BROWSERNAV_LABEL"
			description="COM_MENUS_ITEM_FIELD_BROWSERNAV_DESC"
			default="0"
			filter="int"
			>
			<option value="0">COM_MENUS_FIELD_VALUE_PARENT</option>
			<option value="1">COM_MENUS_FIELD_VALUE_NEW_WITH_NAV</option>
			<option value="2">COM_MENUS_FIELD_VALUE_NEW_WITHOUT_NAV</option>
		</field>

		<field
			name="access"
			type="accesslevel"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			id="access"
			filter="integer"
			/>

		<field
			name="template_style_id"
			type="templatestyle"
			label="COM_MENUS_ITEM_FIELD_TEMPLATE_LABEL"
			description="COM_MENUS_ITEM_FIELD_TEMPLATE_DESC"
			client="site"
			filter="int"
			showon="type!:alias[OR]params.alias_redirect:0"
			>
			<option value="0">JOPTION_USE_DEFAULT</option>
		</field>

		<field
			name="home"
			type="radio"
			label="COM_MENUS_ITEM_FIELD_HOME_LABEL"
			description="COM_MENUS_ITEM_FIELD_HOME_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="language"
			type="contentlanguage"
			label="JFIELD_LANGUAGE_LABEL"
			description="COM_MENUS_ITEM_FIELD_LANGUAGE_DESC"
			>
			<option value="*">JALL</option>
		</field>

		<field
			name="path"
			type="hidden"
			filter="unset"
		/>

		<field
			name="level"
			type="hidden"
			filter="unset"
		/>

		<field
			name="checked_out"
			type="hidden"
			filter="unset"
		/>

		<field
			name="checked_out_time"
			type="hidden"
			filter="unset"
		/>

		<field
			name="lft"
			type="hidden"
			filter="unset"
		/>

		<field
			name="rgt"
			type="hidden"
			filter="unset"
		/>

		<field
			name="toggle_modules_assigned"
			type="radio"
			label="COM_MENUS_ITEM_FIELD_HIDE_UNASSIGNED_LABEL"
			description="COM_MENUS_ITEM_FIELD_HIDE_UNASSIGNED_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			filter="integer"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="toggle_modules_published"
			type="radio"
			label="COM_MENUS_ITEM_FIELD_HIDE_UNPUBLISHED_LABEL"
			description="COM_MENUS_ITEM_FIELD_HIDE_UNPUBLISHED_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			filter="integer"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>
	</fieldset>

	<fields name="params">
	</fields>
</form>
components/com_menus/models/forms/itemadmin_alias.xml000060400000003604152453623440017200 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<!-- Add fields to the request variables for the layout. -->
	<fields name="params">
		<fieldset name="aliasoptions">
			<field
				name="aliasoptions"
				type="modal_menu"
				label="COM_MENUS_ITEM_FIELD_ALIAS_MENU_LABEL"
				description="COM_MENUS_ITEM_FIELD_ALIAS_MENU_DESC"
				clientid="1"
				required="true"
				select="true"
				new="true"
				edit="true"
				clear="true"
			/>
		</fieldset>

		<fieldset
			name="menu-options"
			label="COM_MENUS_LINKTYPE_OPTIONS_LABEL"
		>

			<field
				name="menu-anchor_title"
				type="text"
				label="COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_LABEL"
				description="COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_DESC"
			/>

			<field
				name="menu-anchor_css"
				type="text"
				label="COM_MENUS_ITEM_FIELD_ANCHOR_CSS_LABEL"
				description="COM_MENUS_ITEM_FIELD_ANCHOR_CSS_DESC"
			/>

			<field
				name="menu_image"
				type="media"
				label="COM_MENUS_ITEM_FIELD_MENU_IMAGE_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_IMAGE_DESC"
			/>

			<field 
				name="menu_image_css"
				type="text" 
				label="COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_DESC" 
			/>

			<field
				name="menu_text"
				type="radio"
				label="COM_MENUS_ITEM_FIELD_MENU_TEXT_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_TEXT_DESC"
				class="btn-group btn-group-yesno"
				default="1" 
				filter="integer"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>

			<field
				name="menu_show"
				type="radio"
				label="COM_MENUS_ITEM_FIELD_MENU_SHOW_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_SHOW_DESC"
				class="btn-group btn-group-yesno"
				default="1"
				filter="integer"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>
		</fieldset>
	</fields>
	<help key="JHELP_MENUS_MENU_ITEM_MENU_ITEM_ALIAS"/>
</form>
components/com_menus/models/forms/itemadmin_heading.xml000060400000003310152453623440017500 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<!-- Heading type menu item does not have a navigation -->
		<field
			name="link"
			type="hidden"
		/>

		<field
			name="browserNav"
			type="hidden"
			default="0"
		/>
	</fieldset>

	<fields name="params">
		<fieldset name="menu-options" label="COM_MENUS_LINKTYPE_OPTIONS_LABEL">
			<field
				name="menu-anchor_title"
				type="text"
				label="COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_LABEL"
				description="COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_DESC"
			/>

			<field
				name="menu-anchor_css"
				type="text"
				label="COM_MENUS_ITEM_FIELD_ANCHOR_CSS_LABEL"
				description="COM_MENUS_ITEM_FIELD_ANCHOR_CSS_DESC"
			/>

			<field
				name="menu_image"
				type="media"
				label="COM_MENUS_ITEM_FIELD_MENU_IMAGE_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_IMAGE_DESC"
			/>

			<field 
				name="menu_image_css"
				type="text" 
				label="COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_DESC" 
			/>

			<field
				name="menu_text"
				type="radio"
				label="COM_MENUS_ITEM_FIELD_MENU_TEXT_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_TEXT_DESC"
				class="btn-group btn-group-yesno"
				default="1"
				filter="integer"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>

			<field
				name="menu_show"
				type="radio"
				label="COM_MENUS_ITEM_FIELD_MENU_SHOW_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_SHOW_DESC"
				class="btn-group btn-group-yesno"
				default="1"
				filter="integer"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>
		</fieldset>
	</fields>
	<help key="JHELP_MENUS_MENU_ITEM_MENU_ITEM_HEADING"/>
</form>
components/com_menus/models/forms/item_separator.xml000060400000002542152453623440017076 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="params">
		<fieldset name="menu-options"
			label="COM_MENUS_LINKTYPE_OPTIONS_LABEL"
		>

			<field 
				name="menu-anchor_css" 
				type="text"
				label="COM_MENUS_ITEM_FIELD_ANCHOR_CSS_LABEL"
				description="COM_MENUS_ITEM_FIELD_ANCHOR_CSS_DESC" 
			/>

			<field 
				name="menu_image" 
				type="media"
				label="COM_MENUS_ITEM_FIELD_MENU_IMAGE_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_IMAGE_DESC" 
			/>

			<field 
				name="menu_image_css"
				type="text" 
				label="COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_DESC" 
			/>

			<field 
				name="menu_text" 
				type="radio"
				label="COM_MENUS_ITEM_FIELD_MENU_TEXT_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_TEXT_DESC"
				class="btn-group btn-group-yesno"
				default="1" 
				filter="integer"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>

			<field
				name="menu_show"
				type="radio"
				label="COM_MENUS_ITEM_FIELD_MENU_SHOW_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_SHOW_DESC"
				class="btn-group btn-group-yesno"
				default="1"
				filter="integer"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>
		</fieldset>
	</fields>
	<help key="JHELP_MENUS_MENU_ITEM_TEXT_SEPARATOR" />
</form>
components/com_menus/models/forms/item_component.xml000060400000007016152453623440017101 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="params" label="COM_MENUS_LINKTYPE_OPTIONS_LABEL"
	>
		<fieldset name="menu-options" label="COM_MENUS_LINKTYPE_OPTIONS_LABEL">

			<field
				name="menu-anchor_title"
				type="text"
				label="COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_LABEL"
				description="COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_DESC"
			/>

			<field
				name="menu-anchor_css"
				type="text"
				label="COM_MENUS_ITEM_FIELD_ANCHOR_CSS_LABEL"
				description="COM_MENUS_ITEM_FIELD_ANCHOR_CSS_DESC"
			/>

			<field
				name="menu_image"
				type="media"
				label="COM_MENUS_ITEM_FIELD_MENU_IMAGE_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_IMAGE_DESC"
			/>

			<field
				name="menu_image_css"
				type="text"
				label="COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_DESC"
			/>

			<field
				name="menu_text"
				type="radio"
				label="COM_MENUS_ITEM_FIELD_MENU_TEXT_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_TEXT_DESC"
				class="btn-group btn-group-yesno"
				default="1" filter="integer"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>

			<field
				name="menu_show"
				type="radio"
				label="COM_MENUS_ITEM_FIELD_MENU_SHOW_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_SHOW_DESC"
				class="btn-group btn-group-yesno"
				default="1"
				filter="integer"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>
		</fieldset>

		<fieldset name="page-options" label="COM_MENUS_PAGE_OPTIONS_LABEL">

			<field
				name="page_title"
				type="text"
				label="COM_MENUS_ITEM_FIELD_PAGE_TITLE_LABEL"
				description="COM_MENUS_ITEM_FIELD_PAGE_TITLE_DESC"
				useglobal="true"
			/>

			<field
				name="show_page_heading"
				type="list"
				label="COM_MENUS_ITEM_FIELD_SHOW_PAGE_HEADING_LABEL"
				description="COM_MENUS_ITEM_FIELD_SHOW_PAGE_HEADING_DESC"
				class="chzn-color"
				default=""
				useglobal="true"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>

			<field
				name="page_heading"
				type="text"
				label="COM_MENUS_ITEM_FIELD_PAGE_HEADING_LABEL"
				description="COM_MENUS_ITEM_FIELD_PAGE_HEADING_DESC"
			/>

			<field
				name="pageclass_sfx"
				type="text"
				label="COM_MENUS_ITEM_FIELD_PAGE_CLASS_LABEL"
				description="COM_MENUS_ITEM_FIELD_PAGE_CLASS_DESC"
			/>

		</fieldset>

		<fieldset name="metadata" label="JGLOBAL_FIELDSET_METADATA_OPTIONS">
			<field
				name="menu-meta_description"
				type="textarea"
				label="JFIELD_META_DESCRIPTION_LABEL"
				description="JFIELD_META_DESCRIPTION_DESC"
				rows="3"
				cols="40"
			/>

			<field
				name="menu-meta_keywords"
				type="textarea"
				label="JFIELD_META_KEYWORDS_LABEL"
				description="JFIELD_META_KEYWORDS_DESC"
				rows="3"
				cols="40"
			/>

			<field
				name="robots"
				type="list"
				label="JFIELD_METADATA_ROBOTS_LABEL"
				description="JFIELD_METADATA_ROBOTS_DESC"
				>
				<option value="">JGLOBAL_USE_GLOBAL</option>
				<option value="index, follow"></option>
				<option value="noindex, follow"></option>
				<option value="index, nofollow"></option>
				<option value="noindex, nofollow"></option>
			</field>

			<field
				name="secure"
				type="list"
				label="COM_MENUS_ITEM_FIELD_SECURE_LABEL"
				description="COM_MENUS_ITEM_FIELD_SECURE_DESC"
				default="0"
				filter="integer"
				>
				<option value="-1">JOFF</option>
				<option value="1">JON</option>
				<option value="0">COM_MENUS_FIELD_VALUE_IGNORE</option>
			</field>
		</fieldset>

	</fields>

</form>
components/com_menus/models/forms/itemadmin.xml000060400000006451152453623440016032 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<field
			name="id"
			type="hidden"
			label="JGLOBAL_FIELD_ID_LABEL"
			description="JGLOBAL_FIELD_ID_DESC"
			class="readonly"
			default="0"
			filter="int"
			readonly="true"
		/>

		<field
			name="title"
			type="text"
			label="COM_MENUS_ITEM_FIELD_TITLE_LABEL"
			description="COM_MENUS_ITEM_FIELD_TITLE_DESC"
			class="input-xxlarge input-large-text"
			size="40"
			required="true"
		/>

		<field
			name="alias"
			type="alias"
			label="JFIELD_ALIAS_LABEL"
			description="JFIELD_ALIAS_DESC"
			hint="JFIELD_ALIAS_PLACEHOLDER"
			size="40"
		/>

		<field
			name="note"
			type="text"
			label="JFIELD_NOTE_LABEL"
			description="COM_MENUS_ITEM_FIELD_NOTE_DESC"
			maxlength="255"
			class="span12"
			size="40"
		/>

		<field
			name="link"
			type="link"
			label="COM_MENUS_ITEM_FIELD_LINK_LABEL"
			description="COM_MENUS_ITEM_FIELD_LINK_DESC"
			readonly="true"
			class="input-xxlarge"
			size="50"
		/>

		<field
			name="menutype"
			type="menu"
			label="COM_MENUS_ITEM_FIELD_ASSIGNED_LABEL"
			description="COM_MENUS_ITEM_FIELD_ASSIGNED_DESC"
			required="true"
			clientid="1"
			size="1"
			>
			<option value="">COM_MENUS_SELECT_MENU</option>
		</field>

		<field
			name="type"
			type="menutype"
			label="COM_MENUS_ITEM_FIELD_TYPE_LABEL"
			description="COM_MENUS_ITEM_FIELD_TYPE_DESC"
			class="input-medium"
			required="true"
			size="40"
		/>

		<field
			name="published"
			type="list"
			label="JSTATUS"
			description="JFIELD_PUBLISHED_DESC"
			class="chzn-color-state"
			id="published"
			size="1"
			default="1"
			filter="integer"
			>
			<option value="1">JPUBLISHED</option>
			<option value="0">JUNPUBLISHED</option>
			<option value="-2">JTRASHED</option>
		</field>

		<field
			name="parent_id"
			type="menuparent"
			label="COM_MENUS_ITEM_FIELD_PARENT_LABEL"
			description="COM_MENUS_ITEM_FIELD_PARENT_DESC"
			default="1"
			filter="int"
			clientid="1"
			size="1"
			>
			<option value="1">COM_MENUS_ITEM_ROOT</option>
		</field>

		<field
			name="menuordering"
			type="menuordering"
			label="COM_MENUS_ITEM_FIELD_ORDERING_LABEL"
			description="COM_MENUS_ITEM_FIELD_ORDERING_DESC"
			filter="int"
			size="1"
		/>

		<field
			name="component_id"
			type="hidden"
			filter="int"
		/>

		<field
			name="browserNav"
			type="list"
			label="COM_MENUS_ITEM_FIELD_BROWSERNAV_LABEL"
			description="COM_MENUS_ITEM_FIELD_BROWSERNAV_DESC"
			default="0"
			filter="int"
			>
			<option value="0">COM_MENUS_FIELD_VALUE_PARENT</option>
			<option value="1">COM_MENUS_FIELD_VALUE_NEW_WITH_NAV</option>
		</field>

		<field
			name="home"
			type="hidden"
			default="0"
		/>

		<field
			name="access"
			type="hidden"
			id="access"
			default="0"
		/>

		<field
			name="template_style_id"
			type="hidden"
			default="0"
		/>

		<field
			name="language"
			type="hidden"
			default="*"
		/>

		<field
			name="path"
			type="hidden"
			filter="unset"
		/>

		<field
			name="level"
			type="hidden"
			filter="unset"
		/>

		<field
			name="checked_out"
			type="hidden"
			filter="unset"
		/>

		<field
			name="checked_out_time"
			type="hidden"
			filter="unset"
		/>

		<field
			name="lft"
			type="hidden"
			filter="unset"
		/>

		<field
			name="rgt"
			type="hidden"
			filter="unset"
		/>
	</fieldset>

	<fields name="params">
	</fields>
</form>
components/com_menus/models/forms/itemadmin_container.xml000060400000003646152453623440020077 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<!-- Container type menu item does not have a navigation -->
		<field
			name="link"
			type="hidden"
		/>

		<field
			name="browserNav"
			type="hidden"
			default="0"
		/>
	</fieldset>

	<fields name="params">
		<fieldset name="menu-options" label="COM_MENUS_LINKTYPE_OPTIONS_LABEL">
			<field
				name="menu-anchor_title"
				type="text"
				label="COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_LABEL"
				description="COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_DESC"
			/>

			<field
				name="menu-anchor_css"
				type="text"
				label="COM_MENUS_ITEM_FIELD_ANCHOR_CSS_LABEL"
				description="COM_MENUS_ITEM_FIELD_ANCHOR_CSS_DESC"
			/>

			<field
				name="menu_image"
				type="media"
				label="COM_MENUS_ITEM_FIELD_MENU_IMAGE_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_IMAGE_DESC"
			/>

			<field 
				name="menu_image_css"
				type="text" 
				label="COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_DESC" 
			/>

			<field
				name="menu_text"
				type="radio"
				label="COM_MENUS_ITEM_FIELD_MENU_TEXT_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_TEXT_DESC"
				class="btn-group btn-group-yesno"
				default="1"
				filter="integer"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>

			<field
				name="menu_show"
				type="radio"
				label="COM_MENUS_ITEM_FIELD_MENU_SHOW_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_SHOW_DESC"
				class="btn-group btn-group-yesno"
				default="1"
				filter="integer"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>
		</fieldset>
		<field
			name="hideitems"
			type="checkboxes"
			label="COM_MENUS_ITEM_FIELD_COMPONENTS_CONTAINER_HIDE_ITEMS_LABEL"
			description="COM_MENUS_ITEM_FIELD_COMPONENTS_CONTAINER_HIDE_ITEMS_DESC"
			filter="array"
		/>
	</fields>
	<help key="JHELP_MENUS_MENU_ITEM_MENU_ITEM_CONTAINER"/>
</form>
components/com_menus/models/forms/menu.xml000060400000002771152453623440015030 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<field
			name="id"
			type="hidden"
			id="id"
			default="0"
			filter="int"
			readonly="true"
		/>
		<field
			name="asset_id"
			type="hidden"
			filter="unset"
		/>
		<field
			name="menutype"
			type="text"
			label="COM_MENUS_MENU_MENUTYPE_LABEL"
			description="COM_MENUS_MENU_MENUTYPE_DESC"
			id="menutype"
			size="30"
			maxlength="24"
			required="true"
		/>
		<field
			name="title"
			type="text"
			label="JGLOBAL_TITLE"
			description="COM_MENUS_MENU_TITLE_DESC"
			id="title"
			size="30"
			maxlength="48"
			required="true"
		/>
		<field
			name="description"
			type="text"
			label="JGLOBAL_DESCRIPTION"
			description="COM_MENUS_MENU_DESCRIPTION_DESC"
			id="menudescription"
			size="30"
			maxlength="255"
		/>
		<field
			name="client_id"
			type="radio"
			label="COM_MENUS_MENU_CLIENT_ID_LABEL"
			description="COM_MENUS_MENU_CLIENT_ID_DESC"
			id="client_id"
			default="0"
			class="btn-group btn-group-yesno btn-group-reversed"
			>
			<option value="0">JSITE</option>
			<option value="1">JADMINISTRATOR</option>
		</field>
		<field
			name="preset"
			type="menuPreset"
			label="COM_MENUS_FIELD_PRESET_LABEL"
			description="COM_MENUS_FIELD_PRESET_DESC"
			showon="client_id:1"
		>
			<option value="">JNONE</option>
		</field>
		<field
			name="rules"
			type="rules"
			label="JFIELD_RULES_LABEL"
			translate_label="false"
			filter="rules"
			component="com_menus"
			section="menu"
			validate="rules" 
		/>
	</fieldset>
</form>
components/com_menus/models/forms/itemadmin_url.xml000060400000004111152453623440016703 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="params">
		<fieldset name="menu-options" label="COM_MENUS_LINKTYPE_OPTIONS_LABEL">
			<field 
				name="menu-anchor_title"
				type="text" 
				label="COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_LABEL"
				description="COM_MENUS_ITEM_FIELD_ANCHOR_TITLE_DESC" 
			/>

			<field 
				name="menu-anchor_css"
				type="text" 
				label="COM_MENUS_ITEM_FIELD_ANCHOR_CSS_LABEL"
				description="COM_MENUS_ITEM_FIELD_ANCHOR_CSS_DESC" 
			/>

			<field 
				name="menu-anchor_rel" 
				type="list"
				label="COM_MENUS_ITEM_FIELD_ANCHOR_REL_LABEL"
				description="COM_MENUS_ITEM_FIELD_ANCHOR_REL_DESC"
				default=""
				>
				<option value="">JNONE</option>
				<option value="alternate"/>
				<option value="author"/>
				<option value="bookmark"/>
				<option value="help"/>
				<option value="license"/>
				<option value="next"/>
				<option value="nofollow"/>
				<option value="noreferrer"/>
				<option value="prefetch"/>
				<option value="prev"/>
				<option value="search"/>
				<option value="tag"/>
			</field>

			<field 
				name="menu_image" 
				type="media"
				label="COM_MENUS_ITEM_FIELD_MENU_IMAGE_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_IMAGE_DESC" 
			/>

			<field 
				name="menu_image_css"
				type="text" 
				label="COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_IMAGE_CSS_DESC" 
			/>

			<field 
				name="menu_text" 
				type="radio"
				label="COM_MENUS_ITEM_FIELD_MENU_TEXT_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_TEXT_DESC"
				class="btn-group btn-group-yesno"
				default="1" filter="integer"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>

			<field
				name="menu_show"
				type="radio"
				label="COM_MENUS_ITEM_FIELD_MENU_SHOW_LABEL"
				description="COM_MENUS_ITEM_FIELD_MENU_SHOW_DESC"
				class="btn-group btn-group-yesno"
				default="1"
				filter="integer"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>
		</fieldset>
	</fields>
	<help key="JHELP_MENUS_MENU_ITEM_EXTERNAL_URL" />
</form>
components/com_menus/models/forms/filter_menus.xml000060400000002231152453623440016547 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<field
		name="client_id"
		type="list"
		label=""
		filtermode="selector"
		onchange="this.form.submit();"
		>
		<option value="0">JSITE</option>
		<option value="1">JADMINISTRATOR</option>
	</field>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_MENUS_MENUS_FILTER_SEARCH_LABEL"
			description="COM_MENUS_MENUS_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
		/>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="a.title ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.title ASC">JGLOBAL_TITLE_ASC</option>
			<option value="a.title DESC">JGLOBAL_TITLE_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			label="JGLOBAL_LIMIT"
			description="JGLOBAL_LIMIT"
			class="input-mini"
			default="5"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_menus/models/forms/filter_itemsadmin.xml000060400000004667152453623440017571 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<field
		name="client_id"
		type="list"
		label=""
		filtermode="selector"
		onchange="this.form.submit();"
		>
		<option value="0">JSITE</option>
		<option value="1">JADMINISTRATOR</option>
	</field>

	<field
		name="menutype"
		type="menu"
		label="COM_MENUS_FILTER_CATEGORY"
		description="JOPTION_FILTER_CATEGORY_DESC"
		accesstype="manage"
		clientid=""
		showAll="false"
		filtermode="selector"
		onchange="this.form.submit();"
		>
		<option value="">COM_MENUS_SELECT_MENU</option>
	</field>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_MENUS_ITEMS_SEARCH_FILTER_LABEL"
			description="COM_MENUS_ITEMS_SEARCH_FILTER"
			hint="JSEARCH_FILTER"
			noresults="JGLOBAL_NO_MATCHING_RESULTS"
		/>
		<field
			name="published"
			type="status"
			label="COM_MENUS_FILTER_PUBLISHED"
			description="COM_MENUS_FILTER_PUBLISHED_DESC"
			filter="*,0,1,-2"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>
		<field
			name="level"
			type="integer"
			label="JOPTION_FILTER_LEVEL"
			description="JOPTION_FILTER_LEVEL_DESC"
			first="1"
			last="10"
			step="1"
			languages="*"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_MAX_LEVELS</option>
		</field>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			statuses="*,0,1,2,-2"
			onchange="this.form.submit();"
			default="a.lft ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.lft ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.lft DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.published ASC">JSTATUS_ASC</option>
			<option value="a.published DESC">JSTATUS_DESC</option>
			<option value="a.title ASC">JGLOBAL_TITLE_ASC</option>
			<option value="a.title DESC">JGLOBAL_TITLE_DESC</option>
			<option value="menutype_title ASC">COM_MENUS_HEADING_MENU_ASC</option>
			<option value="menutype_title DESC">COM_MENUS_HEADING_MENU_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			label="COM_MENUS_LIST_LIMIT"
			description="COM_MENUS_LIST_LIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_menus/layouts/joomla/searchtools/default/bar.php000060400000002442152453623440021134 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Layout
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var  array  $displayData */
$data = $displayData;

if ($data['view'] instanceof MenusViewItems)
{
	// We will get the menutype filter & remove it from the form filters
	$menuTypeField = $data['view']->filterForm->getField('menutype');

	// Add the client selector before the form filters.
	$clientIdField = $data['view']->filterForm->getField('client_id');

	if ($clientIdField): ?>
	<div class="js-stools-field-filter js-stools-client_id">
		<?php echo $clientIdField->input; ?>
	</div>
	<?php endif; ?>

	<div class="js-stools-field-filter js-stools-menutype">
		<?php echo $menuTypeField->input; ?>
	</div>
	<?php
}
elseif ($data['view'] instanceof MenusViewMenus)
{
	// Add the client selector before the form filters.
	$clientIdField = $data['view']->filterForm->getField('client_id');
	?>
	<div class="js-stools-field-filter js-stools-client_id">
		<?php echo $clientIdField->input; ?>
	</div>
	<?php
}

// Display the main joomla layout
echo JLayoutHelper::render('joomla.searchtools.default.bar', $data, null, array('component' => 'none'));
components/com_menus/layouts/joomla/searchtools/default.php000060400000005761152453623440020377 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Layout
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var  array  $displayData */
$data = $displayData;

// Receive overridable options
$data['options'] = !empty($data['options']) ? $data['options'] : array();

if ($data['view'] instanceof MenusViewItems || $data['view'] instanceof MenusViewMenus)
{
	$doc = JFactory::getDocument();

	$doc->addStyleDeclaration("
		/* Fixed filter field in search bar */
		.js-stools .js-stools-menutype,
		.js-stools .js-stools-client_id {
			float: left;
			margin-right: 10px;
			min-width: 220px;
		}
		html[dir=rtl] .js-stools .js-stools-menutype,
		html[dir=rtl] .js-stools .js-stools-client_id {
			float: right;
			margin-left: 10px
			margin-right: 0;
		}
		.js-stools .js-stools-container-bar .js-stools-field-filter .chzn-container {
			padding: 3px 0;
		}
	");

	// Client selector doesn't have to activate the filter bar.
	unset($data['view']->activeFilters['client_id']);

	// Menutype filter doesn't have to activate the filter bar
	unset($data['view']->activeFilters['menutype']);
}

// Set some basic options
$customOptions = array(
	'filtersHidden'       => isset($data['options']['filtersHidden']) ? $data['options']['filtersHidden'] : empty($data['view']->activeFilters),
	'defaultLimit'        => isset($data['options']['defaultLimit']) ? $data['options']['defaultLimit'] : JFactory::getApplication()->get('list_limit', 20),
	'searchFieldSelector' => '#filter_search',
	'orderFieldSelector'  => '#list_fullordering',
	'totalResults'        => isset($data['options']['totalResults']) ? $data['options']['totalResults'] : -1,
	'noResultsText'       => isset($data['options']['noResultsText']) ? $data['options']['noResultsText'] : JText::_('JGLOBAL_NO_MATCHING_RESULTS'),
);

$data['options'] = array_merge($customOptions, $data['options']);

$formSelector = !empty($data['options']['formSelector']) ? $data['options']['formSelector'] : '#adminForm';

// Load search tools
JHtml::_('searchtools.form', $formSelector, $data['options']);

$filtersClass = isset($data['view']->activeFilters) && $data['view']->activeFilters ? ' js-stools-container-filters-visible' : '';
?>
<div class="js-stools clearfix">
	<div class="clearfix">
		<div class="js-stools-container-bar">
			<?php echo JLayoutHelper::render('joomla.searchtools.default.bar', $data); ?>
		</div>
		<div class="js-stools-container-list hidden-phone hidden-tablet">
			<?php echo JLayoutHelper::render('joomla.searchtools.default.list', $data); ?>
		</div>
	</div>
	<!-- Filters div -->
	<div class="js-stools-container-filters hidden-phone clearfix<?php echo $filtersClass; ?>">
		<?php echo JLayoutHelper::render('joomla.searchtools.default.filters', $data); ?>
	</div>
</div>
<?php if ($data['options']['totalResults'] === 0) : ?>
	<?php echo JLayoutHelper::render('joomla.searchtools.default.noitems', $data); ?>
<?php endif; ?>
components/com_menus/layouts/joomla/menu/edit_modules.php000060400000002741152453623440020041 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Layout
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$app       = JFactory::getApplication();
$form      = $displayData->getForm();
$input     = $app->input;
$component = $input->getCmd('option', 'com_content');

if ($component == 'com_categories')
{
	$extension = $input->getCmd('extension', 'com_content');
	$parts     = explode('.', $extension);
	$component = $parts[0];
}

$saveHistory = JComponentHelper::getParams($component)->get('save_history', 0);

$fields = $displayData->get('fields') ?: array(
	array('parent', 'parent_id'),
	array('published', 'state', 'enabled'),
	array('category', 'catid'),
	'featured',
	'sticky',
	'access',
	'language',
	'tags',
	'note',
	'version_note',
);

$hiddenFields = $displayData->get('hidden_fields') ?: array();

if (!$saveHistory)
{
	$hiddenFields[] = 'version_note';
}

$html   = array();
$html[] = '<fieldset class="form-horizontal"><ul class="horizontal-buttons unstyled">';

foreach ($fields as $field)
{
	$field = is_array($field) ? $field : array($field);

	foreach ($field as $f)
	{
		if ($form->getField($f))
		{
			if (in_array($f, $hiddenFields))
			{
				$form->setFieldAttribute($f, 'type', 'hidden');
			}

			$html[] = '<li>' . $form->renderField($f) . '</li>';
			break;
		}
	}
}

$html[] = '</ul></fieldset>';

echo implode('', $html);
components/com_menus/presets/menu.xsd000060400000005421152453623440014075 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
	attributeFormDefault="unqualified" elementFormDefault="qualified"
	xmlns:xs="http://www.w3.org/2001/XMLSchema"
	targetNamespace="urn:joomla.org"
	xmlns="urn:joomla.org">
	<xs:element name="menu" type="menuType"/>
	<xs:simpleType name="typeType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="component" />
			<xs:enumeration value="container" />
			<xs:enumeration value="heading" />
			<xs:enumeration value="separator" />
			<xs:enumeration value="url" />
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="elementType">
		<xs:restriction base="xs:string">
			<xs:pattern value="com_(.+)" />
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="scopeType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="default" />
			<xs:enumeration value="edit" />
			<xs:enumeration value="help" />
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="trueFalse">
		<xs:restriction base="xs:string">
			<xs:enumeration value="true" />
			<xs:enumeration value="false"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="browserNavType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="_blank" />
			<xs:enumeration value=""/>
		</xs:restriction>
	</xs:simpleType>
	<xs:complexType name="menuType">
		<xs:sequence>
			<xs:element type="menuitemType" name="menuitem" maxOccurs="unbounded" minOccurs="0"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="menuitemType" mixed="true">
		<xs:sequence>
			<xs:element type="xs:string" name="params" minOccurs="0" maxOccurs="1"/>
			<xs:element type="menuitemType" name="menuitem" minOccurs="0" maxOccurs="unbounded"/>
		</xs:sequence>
		<xs:attribute type="typeType" name="type" use="required"/>
		<xs:attribute type="xs:string" name="title" use="optional"/>
		<xs:attribute type="xs:string" name="link" use="optional"/>
		<xs:attribute type="xs:string" name="class" use="optional"/>
		<xs:attribute type="xs:string" name="icon" use="optional"/>
		<xs:attribute type="elementType" name="element" use="optional"/>
		<xs:attribute type="trueFalse" name="hidden" use="optional" default="false"/>
		<xs:attribute type="xs:string" name="sql_select" use="optional"/>
		<xs:attribute type="xs:string" name="sql_from" use="optional"/>
		<xs:attribute type="xs:string" name="sql_where" use="optional"/>
		<xs:attribute type="xs:string" name="sql_leftjoin" use="optional"/>
		<xs:attribute type="xs:string" name="sql_innerjoin" use="optional"/>
		<xs:attribute type="xs:string" name="sql_group" use="optional"/>
		<xs:attribute type="xs:string" name="sql_order" use="optional"/>
		<xs:attribute type="browserNavType" name="target" use="optional" default=""/>
		<xs:attribute type="scopeType" name="scope" use="optional" default="default"/>
	</xs:complexType>
</xs:schema>
components/com_menus/presets/joomla.xml000060400000035627152453623440014427 0ustar00<?xml version="1.0"?>
<menu
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="urn:joomla.org"
	xsi:schemaLocation="urn:joomla.org menu.xsd">
	<menuitem
		title="MOD_MENU_SYSTEM"
		type="heading"
		>
		<menuitem
			type="component"
			title="MOD_MENU_CONTROL_PANEL"
			link="index.php"
			element="com_cpanel"
			class="class:cpanel"
		/>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_CONFIGURATION"
			type="component"
			element="com_config"
			link="index.php?option=com_config"
			class="class:config"
		/>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_GLOBAL_CHECKIN"
			type="component"
			element="com_checkin"
			link="index.php?option=com_checkin"
			class="class:checkin"
		/>
		<menuitem
			title="MOD_MENU_CLEAR_CACHE"
			type="component"
			element="com_cache"
			link="index.php?option=com_cache"
			class="class:clear"
		/>
		<menuitem
			title="MOD_MENU_PURGE_EXPIRED_CACHE"
			type="component"
			element="com_cache"
			link="index.php?option=com_cache&amp;view=purge"
			class="class:purge"
		/>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_SYSTEM_INFORMATION"
			type="component"
			element="com_admin"
			link="index.php?option=com_admin&amp;view=sysinfo"
			class="class:info"
		/>
	</menuitem>
	<menuitem
		title="MOD_MENU_COM_USERS_USERS"
		type="heading"
		>
		<menuitem
			title="MOD_MENU_COM_USERS_USER_MANAGER"
			type="component"
			element="com_users"
			link="index.php?option=com_users&amp;view=users"
			class="class:user">
			<menuitem
				title="MOD_MENU_COM_USERS_ADD_USER"
				type="component"
				element="com_users"
				link="index.php?option=com_users&amp;task=user.add"
				class="class:newarticle"
				scope="edit"
			/>
		</menuitem>
		<menuitem
			title="MOD_MENU_COM_USERS_GROUPS"
			type="component"
			element="com_users"
			link="index.php?option=com_users&amp;view=groups"
			class="class:groups">
			<menuitem
				title="MOD_MENU_COM_USERS_ADD_GROUP"
				type="component"
				element="com_users"
				link="index.php?option=com_users&amp;task=group.add"
				class="class:newarticle"
				scope="edit"
			/>
		</menuitem>
		<menuitem
			title="MOD_MENU_COM_USERS_LEVELS"
			type="component"
			element="com_users"
			link="index.php?option=com_users&amp;view=levels"
			class="class:levels">
			<menuitem
				title="MOD_MENU_COM_USERS_ADD_LEVEL"
				type="component"
				element="com_users"
				link="index.php?option=com_users&amp;task=level.add"
				class="class:newarticle"
				scope="edit"
			/>
		</menuitem>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_FIELDS"
			type="component"
			element="com_fields"
			link="index.php?option=com_fields&amp;context=com_users.user"
			class="class:fields"
		/>
		<menuitem
			title="MOD_MENU_FIELDS_GROUP"
			type="component"
			element="com_fields"
			link="index.php?option=com_fields&amp;view=groups&amp;context=com_users.user"
			class="class:category"
		/>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_COM_USERS_NOTES"
			type="component"
			element="com_users"
			link="index.php?option=com_users&amp;view=notes"
			class="class:user-note">
			<menuitem
				title="MOD_MENU_COM_USERS_ADD_NOTE"
				type="component"
				element="com_users"
				link="index.php?option=com_users&amp;task=note.add"
				class="class:newarticle"
				scope="edit"
			/>
		</menuitem>
		<menuitem
			title="MOD_MENU_COM_USERS_NOTE_CATEGORIES"
			type="component"
			element="com_categories"
			link="index.php?option=com_categories&amp;view=categories&amp;extension=com_users"
			class="class:category">
			<menuitem
				title="MOD_MENU_COM_CONTENT_NEW_CATEGORY"
				type="component"
				element="com_categories"
				link="index.php?option=com_categories&amp;task=category.add&amp;extension=com_users"
				class="class:newarticle"
				scope="edit"
			/>
		</menuitem>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_COM_PRIVACY"
			type="component"
			element="com_privacy"
			link="index.php?option=com_privacy"
			class="class:privacy"
		/>
		<menuitem
			title="MOD_MENU_COM_ACTIONLOGS"
			type="component"
			element="com_actionlogs"
			link="index.php?option=com_actionlogs"
			class="class:userlogs"
		/>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_MASS_MAIL_USERS"
			type="component"
			element="com_users"
			link="index.php?option=com_users&amp;view=mail"
			class="class:massmail"
			scope="massmail"
		/>
	</menuitem>
	<menuitem
		title="MOD_MENU_MENUS"
		type="heading"
		>
		<menuitem
			title="MOD_MENU_MENU_MANAGER"
			type="component"
			element="com_menus"
			link="index.php?option=com_menus&amp;view=menus"
			class="class:menumgr">
			<menuitem
				title="MOD_MENU_MENU_MANAGER_NEW_MENU"
				type="component"
				element="com_menus"
				link="index.php?option=com_menus&amp;view=menu&amp;layout=edit"
				class="class:newarticle"
				scope="edit"
			/>
		</menuitem>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_MENUS_ALL_ITEMS"
			type="component"
			element="com_menus"
			link="index.php?option=com_menus&amp;view=items&amp;menutype="
			class="class:allmenu"
		/>
		<!--
		Following is an example of repeatable group based on simple database query.
		This requires sql_* attributes (sql_select and sql_from are required)
		The values can be used like - "{sql:columnName}" in any attribute of repeated elements.
		The repeated elements are place inside this xml node but they will be populated in the same level in the rendered menu
		-->
		<menuitem
			type="separator"
			title="JSITE"
			hidden="false"
			sql_select="a.title, a.menutype, CASE COALESCE(SUM(m.home), 0) WHEN 0 THEN '' WHEN 1 THEN CASE m.language WHEN '*' THEN 'class:icon-home' ELSE CONCAT('image:mod_languages/', l.image, '.gif') END ELSE 'image:mod_languages/icon-16-language.png' END AS icon"
			sql_from="#__menu_types AS a"
			sql_where="a.client_id = 0"
			sql_leftjoin="#__menu AS m ON m.menutype = a.menutype AND m.home = 1 LEFT JOIN #__languages AS l ON l.lang_code = m.language"
			sql_group="a.id, m.language, l.image"
			sql_order="a.title ASC">
			<menuitem
				title="{sql:title} "
				type="component"
				element="com_menus"
				link="index.php?option=com_menus&amp;view=items&amp;menutype={sql:menutype}"
				icon="{sql:icon}"
				class="class:menu">
				<menuitem
					title="MOD_MENU_MENU_MANAGER_NEW_MENU_ITEM"
					type="component"
					element="com_menus"
					link="index.php?option=com_menus&amp;view=item&amp;layout=edit&amp;menutype={sql:menutype}"
					class="class:menu"
					scope="edit"
				/>
			</menuitem>
		</menuitem>
		<menuitem
			type="separator"
			title="JADMINISTRATOR"
			hidden="false"
			sql_select="title, menutype"
			sql_from="#__menu_types"
			sql_where="client_id = 1"
			sql_order="title ASC">
			<menuitem
				title="{sql:title}"
				type="component"
				element="com_menus"
				link="index.php?option=com_menus&amp;view=items&amp;menutype={sql:menutype}"
				class="class:menu">
				<menuitem
					title="MOD_MENU_MENU_MANAGER_NEW_MENU_ITEM"
					type="component"
					element="com_menus"
					link="index.php?option=com_menus&amp;view=item&amp;layout=edit&amp;menutype={sql:menutype}"
					class="class:menu"
					scope="edit"
				/>
			</menuitem>
		</menuitem>
	</menuitem>
	<menuitem
		title="MOD_MENU_COM_CONTENT"
		type="heading"
		>
		<menuitem
			title="MOD_MENU_COM_CONTENT_ARTICLE_MANAGER"
			type="component"
			element="com_content"
			link="index.php?option=com_content"
			class="class:article">
			<menuitem
				title="MOD_MENU_COM_CONTENT_NEW_ARTICLE"
				type="component"
				element="com_content"
				link="index.php?option=com_content&amp;task=article.add"
				class="class:newarticle"
				scope="edit"
			/>
		</menuitem>
		<menuitem
			title="MOD_MENU_COM_CONTENT_CATEGORY_MANAGER"
			type="component"
			element="com_categories"
			link="index.php?option=com_categories&amp;extension=com_content"
			class="class:category">
			<menuitem
				title="MOD_MENU_COM_CONTENT_NEW_CATEGORY"
				type="component"
				element="com_categories"
				link="index.php?option=com_categories&amp;task=category.add&amp;extension=com_content"
				class="class:newarticle"
				scope="edit"
			/>
		</menuitem>
		<menuitem
			title="MOD_MENU_COM_CONTENT_FEATURED"
			type="component"
			element="com_content"
			link="index.php?option=com_content&amp;view=featured"
			class="class:featured"
		/>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_FIELDS"
			type="component"
			element="com_fields"
			link="index.php?option=com_fields&amp;context=com_content.article"
			class="class:fields"
		/>
		<menuitem
			title="MOD_MENU_FIELDS_GROUP"
			type="component"
			element="com_fields"
			link="index.php?option=com_fields&amp;view=groups&amp;context=com_content.article"
			class="class:category"
		/>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_MEDIA_MANAGER"
			type="component"
			element="com_media"
			link="index.php?option=com_media"
			class="class:media"
		/>
	</menuitem>
	<menuitem
		title="MOD_MENU_COMPONENTS"
		type="container"
	/>
	<menuitem
		title="MOD_MENU_EXTENSIONS_EXTENSIONS"
		type="heading"
		>
		<menuitem
			title="MOD_MENU_EXTENSIONS_EXTENSION_MANAGER"
			type="component"
			element="com_installer"
			link="index.php?option=com_installer&amp;view=manage"
			class="class:install">
			<menuitem
				title="MOD_MENU_INSTALLER_SUBMENU_INSTALL"
				type="component"
				element="com_installer"
				link="index.php?option=com_installer&amp;view=install"
				class="class:install"
			/>
			<menuitem
				title="MOD_MENU_INSTALLER_SUBMENU_UPDATE"
				type="component"
				element="com_installer"
				link="index.php?option=com_installer&amp;view=update"
				class="class:install"
			/>
			<menuitem
				title="MOD_MENU_INSTALLER_SUBMENU_MANAGE"
				type="component"
				element="com_installer"
				link="index.php?option=com_installer&amp;view=manage"
				class="class:install"
			/>
			<menuitem
				title="MOD_MENU_INSTALLER_SUBMENU_DISCOVER"
				type="component"
				element="com_installer"
				link="index.php?option=com_installer&amp;view=discover"
				class="class:install"
			/>
			<menuitem
				title="MOD_MENU_INSTALLER_SUBMENU_DATABASE"
				type="component"
				element="com_installer"
				link="index.php?option=com_installer&amp;view=database"
				class="class:install"
			/>
			<menuitem
				title="MOD_MENU_INSTALLER_SUBMENU_WARNINGS"
				type="component"
				element="com_installer"
				link="index.php?option=com_installer&amp;view=warnings"
				class="class:install"
			/>
			<menuitem
				title="MOD_MENU_INSTALLER_SUBMENU_LANGUAGES"
				type="component"
				element="com_installer"
				link="index.php?option=com_installer&amp;view=languages"
				class="class:install"
			/>
			<menuitem
				title="MOD_MENU_INSTALLER_SUBMENU_UPDATESITES"
				type="component"
				element="com_installer"
				link="index.php?option=com_installer&amp;view=updatesites"
				class="class:install"
			/>
		</menuitem>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_EXTENSIONS_MODULE_MANAGER"
			type="component"
			element="com_modules"
			link="index.php?option=com_modules"
			class="class:module"
		/>
		<menuitem
			title="MOD_MENU_EXTENSIONS_PLUGIN_MANAGER"
			type="component"
			element="com_plugins"
			link="index.php?option=com_plugins"
			class="class:plugin"
		/>
		<menuitem
			title="MOD_MENU_EXTENSIONS_TEMPLATE_MANAGER"
			type="component"
			element="com_templates"
			link="index.php?option=com_templates"
			class="class:themes">
			<menuitem
				title="MOD_MENU_COM_TEMPLATES_SUBMENU_STYLES"
				type="component"
				element="com_templates"
				link="index.php?option=com_templates&amp;view=styles"
				class="class:themes"
			/>
			<menuitem
				title="MOD_MENU_COM_TEMPLATES_SUBMENU_TEMPLATES"
				type="component"
				element="com_templates"
				link="index.php?option=com_templates&amp;view=templates"
				class="class:themes"
			/>
		</menuitem>
		<menuitem
			title="MOD_MENU_EXTENSIONS_LANGUAGE_MANAGER"
			type="component"
			element="com_languages"
			link="index.php?option=com_languages"
			class="class:language">
			<menuitem
				title="MOD_MENU_COM_LANGUAGES_SUBMENU_INSTALLED"
				type="component"
				element="com_languages"
				link="index.php?option=com_languages&amp;view=installed"
				class="class:language"
			/>
			<menuitem
				title="MOD_MENU_COM_LANGUAGES_SUBMENU_CONTENT"
				type="component"
				element="com_languages"
				link="index.php?option=com_languages&amp;view=languages"
				class="class:language"
			/>
			<menuitem
				title="MOD_MENU_COM_LANGUAGES_SUBMENU_OVERRIDES"
				type="component"
				element="com_languages"
				link="index.php?option=com_languages&amp;view=overrides"
				class="class:language"
			/>
		</menuitem>
	</menuitem>
	<menuitem
		title="MOD_MENU_HELP"
		type="heading"
		>
		<menuitem
			type="component"
			title="MOD_MENU_HELP_JOOMLA"
			element="com_admin"
			link="index.php?option=com_admin&amp;view=help"
			class="class:help"
			scope="help"
		/>
		<menuitem
			type="separator"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_SUPPORT_OFFICIAL_FORUM"
			link="https://forum.joomla.org"
			class="class:help-forum"
			scope="help"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_SUPPORT_CUSTOM_FORUM"
			link="special:custom-forum"
			class="class:help-forum"
			scope="help"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_SUPPORT_OFFICIAL_LANGUAGE_FORUM"
			link="special:language-forum"
			class="class:help-forum"
			scope="help"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_DOCUMENTATION"
			link="https://docs.joomla.org"
			class="class:help-docs"
			scope="help"
		/>
		<menuitem
			type="separator"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_EXTENSIONS"
			link="https://extensions.joomla.org"
			class="class:help-jed"
			scope="help"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_TRANSLATIONS"
			link="https://community.joomla.org/translations.html"
			class="class:help-trans"
			scope="help"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_RESOURCES"
			link="https://community.joomla.org/service-providers-directory/"
			class="class:help-jrd"
			scope="help"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_COMMUNITY"
			link="https://community.joomla.org"
			class="class:help-community"
			scope="help"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_SECURITY"
			link="https://developer.joomla.org/security-centre.html"
			class="class:help-security"
			scope="help"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_DEVELOPER"
			link="https://developer.joomla.org"
			class="class:help-dev"
			scope="help"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_XCHANGE"
			link="https://joomla.stackexchange.com"
			class="class:help-dev"
			scope="help"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_SHOP"
			link="https://community.joomla.org/the-joomla-shop.html"
			class="class:help-shop"
			scope="help"
		/>
	</menuitem>
</menu>
components/com_menus/presets/modern.xml000060400000037106152453623440014424 0ustar00<?xml version="1.0"?>
<menu
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="urn:joomla.org"
	xsi:schemaLocation="urn:joomla.org menu.xsd">
	<menuitem
		title="MOD_MENU_SYSTEM"
		type="heading"
		>
		<menuitem
			type="component"
			title="MOD_MENU_CONTROL_PANEL"
			link="index.php"
			element="com_cpanel"
			class="class:cpanel"
		/>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_CONFIGURATION"
			type="component"
			element="com_config"
			link="index.php?option=com_config"
			class="class:config"
		/>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_GLOBAL_CHECKIN"
			type="component"
			element="com_checkin"
			link="index.php?option=com_checkin"
			class="class:checkin"
		/>
		<menuitem
			title="MOD_MENU_CLEAR_CACHE"
			type="component"
			element="com_cache"
			link="index.php?option=com_cache"
			class="class:clear"
		/>
		<menuitem
			title="MOD_MENU_PURGE_EXPIRED_CACHE"
			type="component"
			element="com_cache"
			link="index.php?option=com_cache&amp;view=purge"
			class="class:purge"
		/>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_SYSTEM_INFORMATION"
			type="component"
			element="com_admin"
			link="index.php?option=com_admin&amp;view=sysinfo"
			class="class:info"
		/>
	</menuitem>
	<menuitem
		title="MOD_MENU_COM_USERS_USERS"
		type="heading"
		>
		<menuitem
			title="MOD_MENU_COM_USERS_USER_MANAGER"
			type="component"
			element="com_users"
			link="index.php?option=com_users&amp;view=users"
			class="class:user">
			<menuitem
				title="MOD_MENU_COM_USERS_ADD_USER"
				type="component"
				element="com_users"
				link="index.php?option=com_users&amp;task=user.add"
				class="class:newarticle"
				scope="edit"
			/>
		</menuitem>
		<menuitem
			title="MOD_MENU_COM_USERS_GROUPS"
			type="component"
			element="com_users"
			link="index.php?option=com_users&amp;view=groups"
			class="class:groups">
			<menuitem
				title="MOD_MENU_COM_USERS_ADD_GROUP"
				type="component"
				element="com_users"
				link="index.php?option=com_users&amp;task=group.add"
				class="class:newarticle"
				scope="edit"
			/>
		</menuitem>
		<menuitem
			title="MOD_MENU_COM_USERS_LEVELS"
			type="component"
			element="com_users"
			link="index.php?option=com_users&amp;view=levels"
			class="class:levels">
			<menuitem
				title="MOD_MENU_COM_USERS_ADD_LEVEL"
				type="component"
				element="com_users"
				link="index.php?option=com_users&amp;task=level.add"
				class="class:newarticle"
				scope="edit"
			/>
		</menuitem>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_FIELDS"
			type="component"
			element="com_fields"
			link="index.php?option=com_fields&amp;context=com_users.user"
			class="class:fields"
		/>
		<menuitem
			title="MOD_MENU_FIELDS_GROUP"
			type="component"
			element="com_fields"
			link="index.php?option=com_fields&amp;view=groups&amp;context=com_users.user"
			class="class:category"
		/>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_COM_USERS_NOTES"
			type="component"
			element="com_users"
			link="index.php?option=com_users&amp;view=notes"
			class="class:user-note">
			<menuitem
				title="MOD_MENU_COM_USERS_ADD_NOTE"
				type="component"
				element="com_users"
				link="index.php?option=com_users&amp;task=note.add"
				class="class:newarticle"
				scope="edit"
			/>
		</menuitem>
		<menuitem
			title="MOD_MENU_COM_USERS_NOTE_CATEGORIES"
			type="component"
			element="com_categories"
			link="index.php?option=com_categories&amp;view=categories&amp;extension=com_users"
			class="class:category">
			<menuitem
				title="MOD_MENU_COM_CONTENT_NEW_CATEGORY"
				type="component"
				element="com_categories"
				link="index.php?option=com_categories&amp;task=category.add&amp;extension=com_users"
				class="class:newarticle"
				scope="edit"
			/>
		</menuitem>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_COM_PRIVACY"
			type="component"
			element="com_privacy"
			link="index.php?option=com_privacy"
			class="class:privacy"
		/>
		<menuitem
			title="MOD_MENU_COM_ACTIONLOGS"
			type="component"
			element="com_actionlogs"
			link="index.php?option=com_actionlogs"
			class="class:userlogs"
		/>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_MASS_MAIL_USERS"
			type="component"
			element="com_users"
			link="index.php?option=com_users&amp;view=mail"
			class="class:massmail"
			scope="massmail"
		/>
	</menuitem>
	<menuitem
		title="MOD_MENU_MENUS"
		type="heading"
		>
		<menuitem
			title="MOD_MENU_MENU_MANAGER"
			type="component"
			element="com_menus"
			link="index.php?option=com_menus&amp;view=menus"
			class="class:menumgr">
			<menuitem
				title="MOD_MENU_MENU_MANAGER_NEW_MENU"
				type="component"
				element="com_menus"
				link="index.php?option=com_menus&amp;view=menu&amp;layout=edit"
				class="class:newarticle"
				scope="edit"
			/>
		</menuitem>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_MENUS_ALL_ITEMS"
			type="component"
			element="com_menus"
			link="index.php?option=com_menus&amp;view=items&amp;menutype="
			class="class:allmenu"
		/>
		<!--
		Following is an example of repeatable group based on simple database query.
		This requires sql_* attributes (sql_select and sql_from are required)
		The values can be used like - "{sql:columnName}" in any attribute of repeated elements.
		The repeated elements are place inside this xml node but they will be populated in the same level in the rendered menu
		-->
		<menuitem
			type="separator"
			title="JSITE"
			hidden="false"
			sql_select="a.title, a.menutype, CASE COALESCE(SUM(m.home), 0) WHEN 0 THEN '' WHEN 1 THEN CASE m.language WHEN '*' THEN 'class:icon-home' ELSE CONCAT('image:mod_languages/', l.image, '.gif') END ELSE 'image:mod_languages/icon-16-language.png' END AS icon"
			sql_from="#__menu_types AS a"
			sql_where="a.client_id = 0"
			sql_leftjoin="#__menu AS m ON m.menutype = a.menutype AND m.home = 1 LEFT JOIN #__languages AS l ON l.lang_code = m.language"
			sql_group="a.id, m.language, l.image"
			sql_order="a.title ASC">
			<menuitem
				title="{sql:title} "
				type="component"
				element="com_menus"
				link="index.php?option=com_menus&amp;view=items&amp;menutype={sql:menutype}"
				icon="{sql:icon}"
				class="class:menu">
				<menuitem
					title="MOD_MENU_MENU_MANAGER_NEW_MENU_ITEM"
					type="component"
					element="com_menus"
					link="index.php?option=com_menus&amp;view=item&amp;layout=edit&amp;menutype={sql:menutype}"
					class="class:menu"
					scope="edit"
				/>
			</menuitem>
		</menuitem>
		<menuitem
			type="separator"
			title="JADMINISTRATOR"
			hidden="false"
			sql_select="title, menutype"
			sql_from="#__menu_types"
			sql_where="client_id = 1"
			sql_order="title ASC">
			<menuitem
				title="{sql:title}"
				type="component"
				element="com_menus"
				link="index.php?option=com_menus&amp;view=items&amp;menutype={sql:menutype}"
				class="class:menu">
				<menuitem
					title="MOD_MENU_MENU_MANAGER_NEW_MENU_ITEM"
					type="component"
					element="com_menus"
					link="index.php?option=com_menus&amp;view=item&amp;layout=edit&amp;menutype={sql:menutype}"
					class="class:menu"
					scope="edit"
				/>
			</menuitem>
		</menuitem>
	</menuitem>
	<menuitem
		title="MOD_MENU_COM_CONTENT"
		type="heading"
		>
		<menuitem
			title="MOD_MENU_COM_CONTENT_ARTICLE_MANAGER"
			type="component"
			element="com_content"
			link="index.php?option=com_content"
			class="class:article">
			<menuitem
				title="MOD_MENU_COM_CONTENT_NEW_ARTICLE"
				type="component"
				element="com_content"
				link="index.php?option=com_content&amp;task=article.add"
				class="class:newarticle"
				scope="edit"
			/>
		</menuitem>
		<menuitem
			title="MOD_MENU_COM_CONTENT_CATEGORY_MANAGER"
			type="component"
			element="com_categories"
			link="index.php?option=com_categories&amp;extension=com_content"
			class="class:category">
			<menuitem
				title="MOD_MENU_COM_CONTENT_NEW_CATEGORY"
				type="component"
				element="com_categories"
				link="index.php?option=com_categories&amp;task=category.add&amp;extension=com_content"
				class="class:newarticle"
				scope="edit"
			/>
		</menuitem>
		<menuitem
			title="MOD_MENU_COM_CONTENT_FEATURED"
			type="component"
			element="com_content"
			link="index.php?option=com_content&amp;view=featured"
			class="class:featured"
		/>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_FIELDS"
			type="component"
			element="com_fields"
			link="index.php?option=com_fields&amp;context=com_content.article"
			class="class:fields"
		/>
		<menuitem
			title="MOD_MENU_FIELDS_GROUP"
			type="component"
			element="com_fields"
			link="index.php?option=com_fields&amp;view=groups&amp;context=com_content.article"
			class="class:category"
		/>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_MEDIA_MANAGER"
			type="component"
			element="com_media"
			link="index.php?option=com_media"
			class="class:media"
		/>
	</menuitem>
	<menuitem
		title="MOD_MENU_COMPONENTS"
		type="container"
	>
		<params><![CDATA[{"hideitems":["com_joomlaupdate","com_postinstall"]}]]></params>
	</menuitem>
	<menuitem
		title="MOD_MENU_EXTENSIONS_EXTENSION_MANAGER"
		type="heading"
	>
		<menuitem
			title="COM_JOOMLAUPDATE"
			type="component"
			element="com_joomlaupdate"
			link="index.php?option=com_joomlaupdate"
			class="class:component"
		/>
		<menuitem
			title="COM_POSTINSTALL"
			type="component"
			element="com_postinstall"
			link="index.php?option=com_postinstall"
			class="class:component"
		/>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_SYSTEM"
			type="component"
			element="com_installer"
			link="index.php?option=com_installer&amp;view=database"
			class="class:install">

			<menuitem
				title="MOD_MENU_INSTALLER_SUBMENU_DATABASE"
				type="component"
				element="com_installer"
				link="index.php?option=com_installer&amp;view=database"
				class="class:install"
			/>
			<menuitem
				title="MOD_MENU_INSTALLER_SUBMENU_WARNINGS"
				type="component"
				element="com_installer"
				link="index.php?option=com_installer&amp;view=warnings"
				class="class:install"
			/>
			<menuitem
				title="MOD_MENU_INSTALLER_SUBMENU_UPDATESITES"
				type="component"
				element="com_installer"
				link="index.php?option=com_installer&amp;view=updatesites"
				class="class:install"
			/>
		</menuitem>
		<menuitem
			title="MOD_MENU_EXTENSIONS_EXTENSIONS"
			type="component"
			element="com_installer"
			link="index.php?option=com_installer&amp;view=manage"
			class="class:install">
			<menuitem
				title="MOD_MENU_INSTALLER_SUBMENU_INSTALL"
				type="component"
				element="com_installer"
				link="index.php?option=com_installer&amp;view=install"
				class="class:install"
			/>
			<menuitem
				title="MOD_MENU_INSTALLER_SUBMENU_UPDATE"
				type="component"
				element="com_installer"
				link="index.php?option=com_installer&amp;view=update"
				class="class:install"
			/>
			<menuitem
				title="MOD_MENU_INSTALLER_SUBMENU_MANAGE"
				type="component"
				element="com_installer"
				link="index.php?option=com_installer&amp;view=manage"
				class="class:install"
			/>
			<menuitem
				title="MOD_MENU_INSTALLER_SUBMENU_DISCOVER"
				type="component"
				element="com_installer"
				link="index.php?option=com_installer&amp;view=discover"
				class="class:install"
			/>
			<menuitem
				type="separator"
			/>
			<menuitem
				title="MOD_MENU_INSTALLER_SUBMENU_LANGUAGES"
				type="component"
				element="com_installer"
				link="index.php?option=com_installer&amp;view=languages"
				class="class:install"
			/>
		</menuitem>
		<menuitem
			type="separator"
		/>
		<menuitem
			title="MOD_MENU_EXTENSIONS_MODULE_MANAGER"
			type="component"
			element="com_modules"
			link="index.php?option=com_modules"
			class="class:module"
		/>
		<menuitem
			title="MOD_MENU_EXTENSIONS_PLUGIN_MANAGER"
			type="component"
			element="com_plugins"
			link="index.php?option=com_plugins"
			class="class:plugin"
		/>
		<menuitem
			title="MOD_MENU_EXTENSIONS_TEMPLATE_MANAGER"
			type="component"
			element="com_templates"
			link="index.php?option=com_templates"
			class="class:themes">
			<menuitem
				title="MOD_MENU_COM_TEMPLATES_SUBMENU_STYLES"
				type="component"
				element="com_templates"
				link="index.php?option=com_templates&amp;view=styles"
				class="class:themes"
			/>
			<menuitem
				title="MOD_MENU_COM_TEMPLATES_SUBMENU_TEMPLATES"
				type="component"
				element="com_templates"
				link="index.php?option=com_templates&amp;view=templates"
				class="class:themes"
			/>
		</menuitem>
		<menuitem
			title="MOD_MENU_EXTENSIONS_LANGUAGE_MANAGER"
			type="component"
			element="com_languages"
			link="index.php?option=com_languages"
			class="class:language">
			<menuitem
				title="MOD_MENU_COM_LANGUAGES_SUBMENU_INSTALLED"
				type="component"
				element="com_languages"
				link="index.php?option=com_languages&amp;view=installed"
				class="class:language"
			/>
			<menuitem
				title="MOD_MENU_COM_LANGUAGES_SUBMENU_CONTENT"
				type="component"
				element="com_languages"
				link="index.php?option=com_languages&amp;view=languages"
				class="class:language"
			/>
			<menuitem
				title="MOD_MENU_COM_LANGUAGES_SUBMENU_OVERRIDES"
				type="component"
				element="com_languages"
				link="index.php?option=com_languages&amp;view=overrides"
				class="class:language"
			/>
		</menuitem>
	</menuitem>
	<menuitem
		title="MOD_MENU_HELP"
		type="heading"
		>
		<menuitem
			type="component"
			title="MOD_MENU_HELP_JOOMLA"
			element="com_admin"
			link="index.php?option=com_admin&amp;view=help"
			class="class:help"
			scope="help"
		/>
		<menuitem
			type="separator"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_SUPPORT_OFFICIAL_FORUM"
			link="https://forum.joomla.org"
			class="class:help-forum"
			scope="help"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_SUPPORT_CUSTOM_FORUM"
			link="special:custom-forum"
			class="class:help-forum"
			scope="help"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_SUPPORT_OFFICIAL_LANGUAGE_FORUM"
			link="special:language-forum"
			class="class:help-forum"
			scope="help"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_DOCUMENTATION"
			link="https://docs.joomla.org"
			class="class:help-docs"
			scope="help"
		/>
		<menuitem
			type="separator"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_EXTENSIONS"
			link="https://extensions.joomla.org"
			class="class:help-jed"
			scope="help"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_TRANSLATIONS"
			link="https://community.joomla.org/translations.html"
			class="class:help-trans"
			scope="help"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_RESOURCES"
			link="https://community.joomla.org/service-providers-directory/"
			class="class:help-jrd"
			scope="help"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_COMMUNITY"
			link="https://community.joomla.org"
			class="class:help-community"
			scope="help"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_SECURITY"
			link="https://developer.joomla.org/security-centre.html"
			class="class:help-security"
			scope="help"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_DEVELOPER"
			link="https://developer.joomla.org"
			class="class:help-dev"
			scope="help"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_XCHANGE"
			link="https://joomla.stackexchange.com"
			class="class:help-dev"
			scope="help"
		/>
		<menuitem
			type="url"
			target="_blank"
			title="MOD_MENU_HELP_SHOP"
			link="https://community.joomla.org/the-joomla-shop.html"
			class="class:help-shop"
			scope="help"
		/>
	</menuitem>
</menu>
components/com_menus/tables/menu.php000060400000002055152453623440013653 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_menus
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Menu table
 *
 * @since  1.6
 */
class MenusTableMenu extends JTableMenu
{
	/**
	 * Method to delete a node and, optionally, its child nodes from the table.
	 *
	 * @param   integer  $pk        The primary key of the node to delete.
	 * @param   boolean  $children  True to delete child nodes, false to move them up a level.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 */
	public function delete($pk = null, $children = false)
	{
		$return = parent::delete($pk, $children);

		if ($return)
		{
			// Delete key from the #__modules_menu table
			$db = JFactory::getDbo();
			$query = $db->getQuery(true)
				->delete($db->quoteName('#__modules_menu'))
				->where($db->quoteName('menuid') . ' = ' . $pk);
			$db->setQuery($query);
			$db->execute();
		}

		return $return;
	}
}
components/com_ajax/ajax.php000060400000000501152453623440012146 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_ajax
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

require_once JPATH_SITE . '/components/com_ajax/ajax.php';
components/com_ajax/ajax.xml000060400000001711152453623440012163 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.2" method="upgrade">
	<name>com_ajax</name>
	<author>Joomla! Project</author>
	<creationDate>August 2013</creationDate>
	<copyright>(C) 2013 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.2.0</version>
	<description>COM_AJAX_XML_DESCRIPTION</description>

	<files folder="site">
		<filename>ajax.php</filename>
	</files>
	<languages folder="site">
		<language tag="en-GB">language/en-GB.com_ajax.ini</language>
	</languages>

	<administration>
		<files folder="admin">
			<filename>ajax.php</filename>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_ajax.ini</language>
			<language tag="en-GB">language/en-GB.com_ajax.sys.ini</language>
		</languages>
	</administration>
</extension>
components/com_contenthistory/models/history.php000060400000024204152453623440016366 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contenthistory
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Methods supporting a list of contenthistory records.
 *
 * @since  3.2
 */
class ContenthistoryModelHistory extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JControllerLegacy
	 * @since   3.2
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'version_id',
				'h.version_id',
				'version_note',
				'h.version_note',
				'save_date',
				'h.save_date',
				'editor_user_id',
				'h.editor_user_id',
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to test whether a record is editable
	 *
	 * @param   JTableContenthistory  $record  A JTable object.
	 *
	 * @return  boolean  True if allowed to edit the record. Defaults to the permission set in the component.
	 *
	 * @since   3.2
	 */
	protected function canEdit($record)
	{
		$result = false;

		if (!empty($record->ucm_type_id))
		{
			// Check that the type id matches the type alias
			$typeAlias = JFactory::getApplication()->input->get('type_alias');

			/** @var JTableContenttype $contentTypeTable */
			$contentTypeTable = JTable::getInstance('Contenttype', 'JTable');

			if ($contentTypeTable->getTypeId($typeAlias) == $record->ucm_type_id)
			{
				/**
				 * Make sure user has edit privileges for this content item. Note that we use edit permissions
				 * for the content item, not delete permissions for the content history row.
				 */
				$user   = JFactory::getUser();
				$result = $user->authorise('core.edit', $typeAlias . '.' . (int) $record->ucm_item_id);
			}

			// Finally try session (this catches edit.own case too)
			if (!$result)
			{
				$contentTypeTable->load($record->ucm_type_id);
				$typeEditables = (array) JFactory::getApplication()->getUserState(str_replace('.', '.edit.', $contentTypeTable->type_alias) . '.id');
				$result = in_array((int) $record->ucm_item_id, $typeEditables);
			}
		}

		return $result;
	}

	/**
	 * Method to test whether a history record can be deleted. Note that we check whether we have edit permissions
	 * for the content item row.
	 *
	 * @param   JTableContenthistory  $record  A JTable object.
	 *
	 * @return  boolean  True if allowed to delete the record. Defaults to the permission set in the component.
	 *
	 * @since   3.6
	 */
	protected function canDelete($record)
	{
		return $this->canEdit($record);
	}

	/**
	 * Method to delete one or more records from content history table.
	 *
	 * @param   array  $pks  An array of record primary keys.
	 *
	 * @return  boolean  True if successful, false if an error occurs.
	 *
	 * @since   3.2
	 */
	public function delete(&$pks)
	{
		$pks = (array) $pks;
		$table = $this->getTable();

		// Iterate the items to delete each one.
		foreach ($pks as $i => $pk)
		{
			if ($table->load($pk))
			{
				if ((int) $table->keep_forever === 1)
				{
					unset($pks[$i]);
					continue;
				}

				if ($this->canEdit($table))
				{
					if (!$table->delete($pk))
					{
						$this->setError($table->getError());

						return false;
					}
				}
				else
				{
					// Prune items that you can't change.
					unset($pks[$i]);
					$error = $this->getError();

					if ($error)
					{
						try
						{
							JLog::add($error, JLog::WARNING, 'jerror');
						}
						catch (RuntimeException $exception)
						{
							JFactory::getApplication()->enqueueMessage($error, 'warning');
						}

						return false;
					}
					else
					{
						try
						{
							JLog::add(JText::_('JLIB_APPLICATION_ERROR_DELETE_NOT_PERMITTED'), JLog::WARNING, 'jerror');
						}
						catch (RuntimeException $exception)
						{
							JFactory::getApplication()->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_DELETE_NOT_PERMITTED'), 'warning');
						}

						return false;
					}
				}
			}
			else
			{
				$this->setError($table->getError());

				return false;
			}
		}

		// Clear the component's cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Method to get an array of data items.
	 *
	 * @return  mixed  An array of data items on success, false on failure.
	 *
	 * @since   3.4.5
	 */
	public function getItems()
	{
		$items = parent::getItems();
		$user = JFactory::getUser();

		if ($items === false)
		{
			return false;
		}

		// This should be an array with at least one element
		if (!is_array($items) || !isset($items[0]))
		{
			return $items;
		}

		// Get the content type's record so we can check ACL
		/** @var JTableContenttype $contentTypeTable */
		$contentTypeTable = JTable::getInstance('Contenttype');
		$ucmTypeId        = $items[0]->ucm_type_id;

		if (!$contentTypeTable->load($ucmTypeId))
		{
			// Assume a failure to load the content type means broken data, abort mission
			return false;
		}

		// Access check
		if ($user->authorise('core.edit', $contentTypeTable->type_alias . '.' . (int) $items[0]->ucm_item_id) || $this->canEdit($items[0]))
		{
			return $items;
		}
		else
		{
			$this->setError(JText::_('JERROR_ALERTNOAUTHOR'));

			return false;
		}
	}

	/**
	 * 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   3.2
	 */
	public function getTable($type = 'Contenthistory', $prefix = 'JTable', $config = array())
	{
		return JTable::getInstance($type, $prefix, $config);
	}

	/**
	 * Method to toggle on and off the keep forever value for one or more records from content history table.
	 *
	 * @param   array  $pks  An array of record primary keys.
	 *
	 * @return  boolean  True if successful, false if an error occurs.
	 *
	 * @since   3.2
	 */
	public function keep(&$pks)
	{
		$pks = (array) $pks;
		$table = $this->getTable();

		// Iterate the items to delete each one.
		foreach ($pks as $i => $pk)
		{
			if ($table->load($pk))
			{
				if ($this->canEdit($table))
				{
					$table->keep_forever = $table->keep_forever ? 0 : 1;

					if (!$table->store())
					{
						$this->setError($table->getError());

						return false;
					}
				}
				else
				{
					// Prune items that you can't change.
					unset($pks[$i]);
					$error = $this->getError();

					if ($error)
					{
						try
						{
							JLog::add($error, JLog::WARNING, 'jerror');
						}
						catch (RuntimeException $exception)
						{
							JFactory::getApplication()->enqueueMessage($error, 'warning');
						}

						return false;
					}
					else
					{
						try
						{
							JLog::add(JText::_('COM_CONTENTHISTORY_ERROR_KEEP_NOT_PERMITTED'), JLog::WARNING, 'jerror');
						}
						catch (RuntimeException $exception)
						{
							JFactory::getApplication()->enqueueMessage(JText::_('COM_CONTENTHISTORY_ERROR_KEEP_NOT_PERMITTED'), 'warning');
						}

						return false;
					}
				}
			}
			else
			{
				$this->setError($table->getError());

				return false;
			}
		}

		// Clear the component's cache
		$this->cleanCache();

		return true;
	}

	/**
	 * 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.2
	 */
	protected function populateState($ordering = 'h.save_date', $direction = 'DESC')
	{
		$input = JFactory::getApplication()->input;
		$itemId = $input->get('item_id', 0, 'integer');
		$typeId = $input->get('type_id', 0, 'integer');
		$typeAlias = $input->get('type_alias', '', 'string');

		$this->setState('item_id', $itemId);
		$this->setState('type_id', $typeId);
		$this->setState('type_alias', $typeAlias);
		$this->setState('sha1_hash', $this->getSha1Hash());

		// Load the parameters.
		$params = JComponentHelper::getParams('com_contenthistory');
		$this->setState('params', $params);

		// List state information.
		parent::populateState($ordering, $direction);
	}

	/**
	 * Build an SQL query to load the list data.
	 *
	 * @return  JDatabaseQuery
	 *
	 * @since   3.2
	 */
	protected function getListQuery()
	{
		// 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',
				'h.version_id, h.ucm_item_id, h.ucm_type_id, h.version_note, h.save_date, h.editor_user_id,' .
				'h.character_count, h.sha1_hash, h.version_data, h.keep_forever'
			)
		)
			->from($db->quoteName('#__ucm_history') . ' AS h')
			->where($db->quoteName('h.ucm_item_id') . ' = ' . (int) $this->getState('item_id'))
			->where($db->quoteName('h.ucm_type_id') . ' = ' . (int) $this->getState('type_id'))

		// Join over the users for the editor
			->select('uc.name AS editor')
			->join('LEFT', '#__users AS uc ON uc.id = h.editor_user_id');

		// Add the list ordering clause.
		$orderCol = $this->state->get('list.ordering');
		$orderDirn = $this->state->get('list.direction');
		$query->order($db->quoteName($orderCol) . $orderDirn);

		return $query;
	}

	/**
	 * Get the sha1 hash value for the current item being edited.
	 *
	 * @return  string  sha1 hash of row data
	 *
	 * @since   3.2
	 */
	protected function getSha1Hash()
	{
		$result = false;
		$typeTable = JTable::getInstance('Contenttype', 'JTable');
		$typeId = JFactory::getApplication()->input->getInteger('type_id', 0);
		$typeTable->load($typeId);
		$typeAliasArray = explode('.', $typeTable->type_alias);
		JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/' . $typeAliasArray[0] . '/tables');
		$contentTable = $typeTable->getContentTable();
		$keyValue = JFactory::getApplication()->input->getInteger('item_id', 0);

		if ($contentTable && $contentTable->load($keyValue))
		{
			$helper = new JHelper;

			$dataObject = $helper->getDataObject($contentTable);
			$result = $this->getTable('Contenthistory', 'JTable')->getSha1(json_encode($dataObject), $typeTable);
		}

		return $result;
	}
}
components/com_contenthistory/models/compare.php000060400000010635152453623440016316 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contenthistory
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('ContenthistoryHelper', JPATH_ADMINISTRATOR . '/components/com_contenthistory/helpers/contenthistory.php');

/**
 * Methods supporting a list of contenthistory records.
 *
 * @since  3.2
 */
class ContenthistoryModelCompare extends JModelItem
{
	/**
	 * Method to get a version history row.
	 *
	 * @return  array|boolean    On success, array of populated tables. False on failure.
	 *
	 * @since   3.2
	 */
	public function getItems()
	{
		$input = JFactory::getApplication()->input;

		/** @var JTableContenthistory $table1 */
		$table1 = JTable::getInstance('Contenthistory');

		/** @var JTableContenthistory $table2 */
		$table2 = JTable::getInstance('Contenthistory');

		$id1 = $input->getInt('id1');
		$id2 = $input->getInt('id2');

		if (!$id1 || \is_array($id1) || !$id2 || \is_array($id2))
		{
			$this->setError(\JText::_('COM_CONTENTHISTORY_ERROR_INVALID_ID'));

			return false;
		}

		$result = array();

		if ($table1->load($id1) && $table2->load($id2))
		{
			// Get the first history record's content type record so we can check ACL
			/** @var JTableContenttype $contentTypeTable */
			$contentTypeTable = JTable::getInstance('Contenttype');
			$ucmTypeId        = $table1->ucm_type_id;

			if (!$contentTypeTable->load($ucmTypeId))
			{
				$this->setError(\JText::_('COM_CONTENTHISTORY_ERROR_FAILED_LOADING_CONTENT_TYPE'));

				// Assume a failure to load the content type means broken data, abort mission
				return false;
			}

			$user = JFactory::getUser();

			// Access check
			if ($user->authorise('core.edit', $contentTypeTable->type_alias . '.' . (int) $table1->ucm_item_id) || $this->canEdit($table1))
			{
				$return = true;
			}
			else
			{
				$this->setError(JText::_('JERROR_ALERTNOAUTHOR'));

				return false;
			}

			// All's well, process the records
			if ($return == true)
			{
				foreach (array($table1, $table2) as $table)
				{
					$object = new stdClass;
					$object->data = ContenthistoryHelper::prepareData($table);
					$object->version_note = $table->version_note;

					// Let's use custom calendars when present
					$object->save_date = JHtml::_('date', $table->save_date, JText::_('DATE_FORMAT_LC6'));

					$dateProperties = array (
						'modified_time',
						'created_time',
						'modified',
						'created',
						'checked_out_time',
						'publish_up',
						'publish_down',
					);

					foreach ($dateProperties as $dateProperty)
					{
						if (property_exists($object->data, $dateProperty) && $object->data->$dateProperty->value != '0000-00-00 00:00:00')
						{
							$object->data->$dateProperty->value = JHtml::_('date', $object->data->$dateProperty->value, JText::_('DATE_FORMAT_LC6'));
						}
					}

					$result[] = $object;
				}

				return $result;
			}
		}

		$this->setError(\JText::_('COM_CONTENTHISTORY_ERROR_VERSION_NOT_FOUND'));

		return false;
	}

	/**
	 * Method to test whether a record is editable
	 *
	 * @param   JTableContenthistory  $record  A JTable object.
	 *
	 * @return  boolean  True if allowed to edit the record. Defaults to the permission set in the component.
	 *
	 * @since   3.6
	 */
	protected function canEdit($record)
	{
		$result = false;

		if (!empty($record->ucm_type_id))
		{
			// Check that the type id matches the type alias
			$typeAlias = JFactory::getApplication()->input->get('type_alias');

			/** @var JTableContenttype $contentTypeTable */
			$contentTypeTable = JTable::getInstance('Contenttype', 'JTable');

			if ($contentTypeTable->getTypeId($typeAlias) == $record->ucm_type_id)
			{
				/**
				 * Make sure user has edit privileges for this content item. Note that we use edit permissions
				 * for the content item, not delete permissions for the content history row.
				 */
				$user   = JFactory::getUser();
				$result = $user->authorise('core.edit', $typeAlias . '.' . (int) $record->ucm_item_id);
			}

			// Finally try session (this catches edit.own case too)
			if (!$result)
			{
				$contentTypeTable->load($record->ucm_type_id);
				$typeEditables = (array) JFactory::getApplication()->getUserState(str_replace('.', '.edit.', $contentTypeTable->type_alias) . '.id');
				$result = in_array((int) $record->ucm_item_id, $typeEditables);
			}
		}

		return $result;
	}
}
components/com_contenthistory/models/preview.php000060400000007344152453623440016354 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contenthistory
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('ContenthistoryHelper', JPATH_ADMINISTRATOR . '/components/com_contenthistory/helpers/contenthistory.php');

/**
 * Methods supporting a list of contenthistory records.
 *
 * @since  3.2
 */
class ContenthistoryModelPreview extends JModelItem
{
	/**
	 * Method to get a version history row.
	 *
	 * @return  stdClass|boolean    On success, standard object with row data. False on failure.
	 *
	 * @since   3.2
	 */
	public function getItem()
	{
		/** @var JTableContenthistory $table */
		$table = JTable::getInstance('Contenthistory');
		$versionId = JFactory::getApplication()->input->getInt('version_id');

		if (!$table->load($versionId))
		{
			return false;
		}

		// Get the content type's record so we can check ACL
		/** @var JTableContenttype $contentTypeTable */
		$contentTypeTable = JTable::getInstance('Contenttype');

		if (!$contentTypeTable->load($table->ucm_type_id))
		{
			// Assume a failure to load the content type means broken data, abort mission
			return false;
		}

		$user = JFactory::getUser();

		// Access check
		if ($user->authorise('core.edit', $contentTypeTable->type_alias . '.' . (int) $table->ucm_item_id) || $this->canEdit($table))
		{
			$return = true;
		}
		else
		{
			$this->setError(JText::_('JERROR_ALERTNOAUTHOR'));

			return false;
		}

		// Good to go, finish processing the data
		if ($return == true)
		{
			$result = new stdClass;
			$result->version_note = $table->version_note;
			$result->data = ContenthistoryHelper::prepareData($table);

			// Let's use custom calendars when present
			$result->save_date = JHtml::_('date', $table->save_date, JText::_('DATE_FORMAT_LC6'));

			$dateProperties = array (
				'modified_time',
				'created_time',
				'modified',
				'created',
				'checked_out_time',
				'publish_up',
				'publish_down',
			);

			foreach ($dateProperties as $dateProperty)
			{
				if (property_exists($result->data, $dateProperty) && $result->data->$dateProperty->value != '0000-00-00 00:00:00')
				{
					$result->data->$dateProperty->value = JHtml::_('date', $result->data->$dateProperty->value, JText::_('DATE_FORMAT_LC6'));
				}
			}

			return $result;
		}
	}

	/**
	 * Method to test whether a record is editable
	 *
	 * @param   JTableContenthistory  $record  A JTable object.
	 *
	 * @return  boolean  True if allowed to edit the record. Defaults to the permission set in the component.
	 *
	 * @since   3.6
	 */
	protected function canEdit($record)
	{
		$result = false;

		if (!empty($record->ucm_type_id))
		{
			// Check that the type id matches the type alias
			$typeAlias = JFactory::getApplication()->input->get('type_alias');

			/** @var JTableContenttype $contentTypeTable */
			$contentTypeTable = JTable::getInstance('Contenttype', 'JTable');

			if ($contentTypeTable->getTypeId($typeAlias) == $record->ucm_type_id)
			{
				/**
				 * Make sure user has edit privileges for this content item. Note that we use edit permissions
				 * for the content item, not delete permissions for the content history row.
				 */
				$user   = JFactory::getUser();
				$result = $user->authorise('core.edit', $typeAlias . '.' . (int) $record->ucm_item_id);
			}

			// Finally try session (this catches edit.own case too)
			if (!$result)
			{
				$contentTypeTable->load($record->ucm_type_id);
				$typeEditables = (array) JFactory::getApplication()->getUserState(str_replace('.', '.edit.', $contentTypeTable->type_alias) . '.id');
				$result = in_array((int) $record->ucm_item_id, $typeEditables);
			}
		}

		return $result;
	}
}
components/com_contenthistory/views/history/view.html.php000060400000001733152453623440020157 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contenthistory
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of contenthistory.
 *
 * @since  3.2
 */
class ContenthistoryViewHistory extends JViewLegacy
{
	protected $items;

	protected $pagination;

	protected $state;

	/**
	 * Method to display the view.
	 *
	 * @param   string  $tpl  A template file to load. [optional]
	 *
	 * @return  mixed  Exception on failure, void on success.
	 *
	 * @since   3.2
	 */
	public function display($tpl = null)
	{
		$this->state = $this->get('State');
		$this->items = $this->get('Items');
		$this->pagination = $this->get('Pagination');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		return parent::display($tpl);
	}
}
components/com_contenthistory/views/history/tmpl/modal.php000060400000022240152453623440020306 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contenthistory
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
JSession::checkToken('get') or die(JText::_('JINVALID_TOKEN'));

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');
JHtml::_('bootstrap.tooltip', '.hasTooltip', array('placement' => 'bottom'));
JHtml::_('behavior.multiselect');
JHtml::_('jquery.framework');

$input = JFactory::getApplication()->input;
$field = $input->getCmd('field');
$function = 'jSelectContenthistory_' . $field;
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn = $this->escape($this->state->get('list.direction'));
$message = JText::_('COM_CONTENTHISTORY_BUTTON_SELECT_ONE', true);
$compareMessage = JText::_('COM_CONTENTHISTORY_BUTTON_SELECT_TWO', true);
JText::script('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST');
$deleteMessage = "alert(Joomla.JText._('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST'));";
$aliasArray = explode('.', $this->state->type_alias);
$option = (end($aliasArray) == 'category') ? 'com_categories&amp;extension=' . implode('.', array_slice($aliasArray, 0, count($aliasArray) - 1)) : $aliasArray[0];
$filter = JFilterInput::getInstance();
$task = $filter->clean(end($aliasArray)) . '.loadhistory';
$loadUrl = JRoute::_('index.php?option=' . $filter->clean($option) . '&amp;task=' . $task);
$deleteUrl = JRoute::_('index.php?option=com_contenthistory&task=history.delete');
$hash = $this->state->get('sha1_hash');
$formUrl = 'index.php?option=com_contenthistory&view=history&layout=modal&tmpl=component&item_id=' . $this->state->get('item_id') . '&type_id='
	. $this->state->get('type_id') . '&type_alias=' . $this->state->get('type_alias') . '&' . JSession::getFormToken() . '=1';

JFactory::getDocument()->addScriptDeclaration("
	(function ($){
		$(document).ready(function (){
			$('#toolbar-load').click(function() {
				var ids = $('input[id*=\'cb\']:checked');
				if (ids.length == 1) {
					// Add version item id to URL
					var url = $('#toolbar-load').attr('data-url') + '&version_id=' + ids[0].value;
					$('#content-url').attr('data-url', url);
					if (window.parent) {
						window.parent.location = url;
					}
				} else {
					alert('" . $message . "');
				}
			});

		$('#toolbar-preview').click(function() {
				var windowSizeArray = ['width=800, height=600, resizable=yes, scrollbars=yes'];
				var ids = $('input[id*=\'cb\']:checked');
				if (ids.length == 1) {
					// Add version item id to URL
					var url = $('#toolbar-preview').attr('data-url') + '&version_id=' + ids[0].value;
					$('#content-url').attr('data-url', url);
					if (window.parent) {
						window.open(url, '', windowSizeArray);
						return false;
					}
				} else {
					alert('" . $message . "');
				}
			});

			$('#toolbar-compare').click(function() {
				var windowSizeArray = ['width=1000, height=600, resizable=yes, scrollbars=yes'];
				var ids = $('input[id*=\'cb\']:checked');
				if (ids.length == 2) {
					// Add version item ids to URL
					var url = $('#toolbar-compare').attr('data-url') + '&id1=' + ids[0].value + '&id2=' + ids[1].value;
					$('#content-url').attr('data-url', url);
					if (window.parent) {
						window.open(url, '', windowSizeArray);
						return false;
					}
				} else {
					alert('" . $compareMessage . "');
				}
			});
		});
	})(jQuery);
	"
);

?>
<div class="container-popup">

	<div class="btn-group pull-right">
		<button id="toolbar-load" type="submit" class="btn hasTooltip" aria-label="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_LOAD_DESC'); ?>" title="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_LOAD_DESC'); ?>" data-url="<?php echo JRoute::_($loadUrl); ?>">
			<span class="icon-upload" aria-hidden="true"></span><span class="hidden-phone"><?php echo JText::_('COM_CONTENTHISTORY_BUTTON_LOAD'); ?></span></button>
		<button id="toolbar-preview" type="button" class="btn hasTooltip" aria-label="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_PREVIEW_DESC'); ?>" title="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_PREVIEW_DESC'); ?>" data-url="<?php echo JRoute::_('index.php?option=com_contenthistory&view=preview&layout=preview&tmpl=component&' . JSession::getFormToken() . '=1'); ?>">
			<span class="icon-search" aria-hidden="true"></span><span class="hidden-phone"><?php echo JText::_('COM_CONTENTHISTORY_BUTTON_PREVIEW'); ?></span></button>
		<button id="toolbar-compare" type="button" class="btn hasTooltip" aria-label="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_COMPARE_DESC'); ?>" title="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_COMPARE_DESC'); ?>" data-url="<?php echo JRoute::_('index.php?option=com_contenthistory&view=compare&layout=compare&tmpl=component&' . JSession::getFormToken() . '=1'); ?>">
			<span class="icon-zoom-in" aria-hidden="true"></span><span class="hidden-phone"><?php echo JText::_('COM_CONTENTHISTORY_BUTTON_COMPARE'); ?></span></button>
		<button onclick="if (document.adminForm.boxchecked.value==0){<?php echo $deleteMessage; ?>}else{ Joomla.submitbutton('history.keep')}" class="btn pointer hasTooltip" aria-label="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_KEEP_DESC'); ?>" title="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_KEEP_DESC'); ?>">
			<span class="icon-lock" aria-hidden="true"></span><span class="hidden-phone"><?php echo JText::_('COM_CONTENTHISTORY_BUTTON_KEEP'); ?></span></button>
		<button onclick="if (document.adminForm.boxchecked.value==0){<?php echo $deleteMessage; ?>}else{ Joomla.submitbutton('history.delete')}" class="btn pointer hasTooltip" aria-label="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_DELETE_DESC'); ?>" title="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_DELETE_DESC'); ?>">
			<span class="icon-delete" aria-hidden="true"></span><span class="hidden-phone"><?php echo JText::_('COM_CONTENTHISTORY_BUTTON_DELETE'); ?></span></button>
	</div>

	<div class="clearfix"></div>
	<hr class="hr-condensed" />

	<form action="<?php echo JRoute::_($formUrl); ?>" method="post" name="adminForm" id="adminForm">
		<table class="table table-striped table-condensed">
			<thead>
				<tr>
					<th width="1%" class="center">
						<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
					</th>
					<th width="15%">
						<?php echo JText::_('JDATE'); ?>
					</th>
					<th width="15%" class="nowrap hidden-phone">
						<?php echo JText::_('COM_CONTENTHISTORY_VERSION_NOTE'); ?>
					</th>
					<th width="10%" class="nowrap">
						<?php echo JText::_('COM_CONTENTHISTORY_KEEP_VERSION'); ?>
					</th>
					<th width="15%" class="nowrap hidden-phone">
						<?php echo JText::_('JAUTHOR'); ?>
					</th>
					<th width="10%" class="nowrap center">
						<?php echo JText::_('COM_CONTENTHISTORY_CHARACTER_COUNT'); ?>
					</th>
				</tr>
			</thead>
			<tfoot>
				<tr>
					<td colspan="15">
						<?php echo $this->pagination->getListFooter(); ?>
					</td>
				</tr>
			</tfoot>
			<tbody>
			<?php $i = 0; ?>
			<?php foreach ($this->items as $item) : ?>
				<tr class="row<?php echo $i % 2; ?>">
					<td class="center">
						<?php echo JHtml::_('grid.id', $i, $item->version_id); ?>
					</td>
					<td>
						<a class="save-date" onclick="window.open(this.href,'win2','width=800,height=600,resizable=yes,scrollbars=yes'); return false;"
							href="<?php echo JRoute::_('index.php?option=com_contenthistory&view=preview&layout=preview&tmpl=component&' . JSession::getFormToken() . '=1&version_id=' . $item->version_id); ?>">
							<?php echo JHtml::_('date', $item->save_date, JText::_('DATE_FORMAT_LC6')); ?>
						</a>
						<?php if ($item->sha1_hash == $hash) : ?>
							<span class="icon-featured" aria-hidden="true"><span class="element-invisible"><?php echo JText::_('JFEATURED'); ?></span></span>&nbsp;
						<?php endif; ?>
					</td>
					<td class="hidden-phone">
						<?php echo htmlspecialchars($item->version_note); ?>
					</td>
					<td>
						<?php if ($item->keep_forever) : ?>
							<a class="btn btn-mini active" rel="tooltip" href="javascript:void(0);"
								onclick="return listItemTask('cb<?php echo $i; ?>','history.keep')"
								data-original-title="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_KEEP_TOGGLE_OFF'); ?>">
								<?php echo JText::_('JYES'); ?>&nbsp;<span class="icon-lock" aria-hidden="true"></span>
							</a>
						<?php else : ?>
							<a class="btn btn-mini active" rel="tooltip" href="javascript:void(0);"
								onclick="return listItemTask('cb<?php echo $i; ?>','history.keep')"
								data-original-title="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_KEEP_TOGGLE_ON'); ?>">
								<?php echo JText::_('JNO'); ?>
							</a>
						<?php endif; ?>
					</td>
					<td class="hidden-phone">
						<?php echo htmlspecialchars($item->editor); ?>
					</td>
					<td class="center">
						<?php echo number_format((int) $item->character_count, 0, JText::_('DECIMALS_SEPARATOR'), JText::_('THOUSANDS_SEPARATOR')); ?>
					</td>
				</tr>
				<?php $i++; ?>
			<?php endforeach; ?>
			</tbody>
		</table>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>

	</form>
</div>
components/com_contenthistory/views/preview/tmpl/preview.php000060400000002657152453623440020665 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contenthistory
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
JSession::checkToken('get') or die(JText::_('JINVALID_TOKEN'));

?>
<h3>
<?php echo JText::sprintf('COM_CONTENTHISTORY_PREVIEW_SUBTITLE_DATE', $this->item->save_date); ?>
<?php if ($this->item->version_note) : ?>
	&nbsp;&nbsp;<?php echo JText::sprintf('COM_CONTENTHISTORY_PREVIEW_SUBTITLE', $this->item->version_note); ?>
<?php endif; ?>
</h3>
<table class="table table-striped" >
<thead><tr>
	<th width="25%"><?php echo JText::_('COM_CONTENTHISTORY_PREVIEW_FIELD'); ?></th>
	<th><?php echo JText::_('COM_CONTENTHISTORY_PREVIEW_VALUE'); ?></th>
</tr></thead>
<tbody>
<?php foreach ($this->item->data as $name => $value) : ?>
	<tr>
	<?php if (is_object($value->value)) : ?>
		<td><strong><?php echo $value->label; ?></strong></td>
		<td></td><tr>
		<?php foreach ($value->value as $subName => $subValue) : ?>
			<?php if ($subValue) : ?>
				<tr>
				<td><i>&nbsp;&nbsp;<?php echo $subValue->label; ?></i></td>
				<td><?php echo $subValue->value; ?></td>
				</tr>
			<?php endif; ?>
		<?php endforeach; ?>
	<?php else : ?>
		<td><strong><?php echo $value->label; ?></strong></td>
		<td><?php echo $value->value; ?></td>
	<?php endif; ?>
	</tr>
<?php endforeach; ?>
</tbody>
</table>
components/com_contenthistory/views/preview/view.html.php000060400000002140152453623440020130 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contenthistory
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of contenthistory.
 *
 * @since  1.5
 */
class ContenthistoryViewPreview extends JViewLegacy
{
	protected $items;

	protected $state;

	/**
	 * Method to display the view.
	 *
	 * @param   string  $tpl  A template file to load. [optional]
	 *
	 * @return  mixed  Exception on failure, void on success.
	 *
	 * @since   3.2
	 */
	public function display($tpl = null)
	{
		$this->state = $this->get('State');
		$this->item  = $this->get('Item');

		if (false === $this->item)
		{
			JFactory::getLanguage()->load('com_content', JPATH_SITE, null, true);

			JError::raiseError(404, JText::_('COM_CONTENT_ERROR_ARTICLE_NOT_FOUND'));

			return false;
		}

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		return parent::display($tpl);
	}
}
components/com_contenthistory/views/compare/view.html.php000060400000001622152453623440020101 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contenthistory
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of contenthistory.
 *
 * @since  3.2
 */
class ContenthistoryViewCompare extends JViewLegacy
{
	protected $items;

	protected $state;

	/**
	 * Method to display the view.
	 *
	 * @param   string  $tpl  A template file to load. [optional]
	 *
	 * @return  mixed  Exception on failure, void on success.
	 *
	 * @since   3.2
	 */
	public function display($tpl = null)
	{
		$this->state = $this->get('State');
		$this->items = $this->get('Items');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		return parent::display($tpl);
	}
}
components/com_contenthistory/views/compare/tmpl/compare.php000060400000011402152453623440020563 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contenthistory
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
JSession::checkToken('get') or die(JText::_('JINVALID_TOKEN'));
$version2 = $this->items[0];
$version1 = $this->items[1];
$object1 = $version1->data;
$object2 = $version2->data;
JHtml::addIncludePath(JPATH_COMPONENT_ADMINISTRATOR . '/helpers/html');
JHtml::_('textdiff.textdiff', 'diff');

JFactory::getDocument()->addScriptDeclaration("
	(function ($){
		$(document).ready(function (){
            jQuery('.diffhtml, .diffhtml-header').hide();
        });
	})(jQuery);
"
);

?>
<fieldset>
<legend>
<?php echo JText::sprintf('COM_CONTENTHISTORY_COMPARE_TITLE'); ?>
<div class="btn-group pull-right">
&nbsp;<button id="toolbar-all-rows" class="btn hasTooltip" title="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_COMPARE_ALL_ROWS_DESC'); ?>"
	onclick="jQuery('.items-equal').show(); jQuery('#toolbar-all-rows').hide(); jQuery('#toolbar-changed-rows').show()"
	style="display:none" >
	<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_COMPARE_ALL_ROWS'); ?></button>

<button id="toolbar-changed-rows" class="btn hasTooltip" title="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_COMPARE_CHANGED_ROWS_DESC'); ?>"
	onclick="jQuery('.items-equal').hide(); jQuery('#toolbar-all-rows').show(); jQuery('#toolbar-changed-rows').hide()">
	<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_COMPARE_CHANGED_ROWS'); ?></button>

<button class="diff-header btn hasTooltip" title="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_COMPARE_HTML_DESC'); ?>"
	onclick="jQuery('.diffhtml, .diffhtml-header').show(); jQuery('.diff, .diff-header').hide()">
	<span class="icon-wrench" aria-hidden="true"></span> <?php echo JText::_('COM_CONTENTHISTORY_BUTTON_COMPARE_HTML'); ?></button>

<button class="diffhtml-header btn hasTooltip" title="<?php echo JText::_('COM_CONTENTHISTORY_BUTTON_COMPARE_TEXT_DESC'); ?>"
	onclick="jQuery('.diffhtml, .diffhtml-header').hide(); jQuery('.diff, .diff-header').show()">
	<span class="icon-pencil" aria-hidden="true"></span> <?php echo JText::_('COM_CONTENTHISTORY_BUTTON_COMPARE_TEXT'); ?></button>
</div>
</legend>
<table id="diff" class="table table-striped table-condensed">
<thead><tr>
	<th width="25%"><?php echo JText::_('COM_CONTENTHISTORY_PREVIEW_FIELD'); ?></th>
	<th style="display:none" />
	<th style="display:none" />
	<th><?php echo JText::sprintf('COM_CONTENTHISTORY_COMPARE_VALUE1', $version1->save_date, $version1->version_note); ?></th>
	<th><?php echo JText::sprintf('COM_CONTENTHISTORY_COMPARE_VALUE2', $version2->save_date, $version2->version_note); ?></th>
	<th class="diff-header"><?php echo JText::_('COM_CONTENTHISTORY_COMPARE_DIFF'); ?></th>
	<th class="diffhtml-header"><?php echo JText::_('COM_CONTENTHISTORY_COMPARE_DIFF'); ?></th>
</tr></thead>
<tbody>
<?php foreach ($object1 as $name => $value) : ?>
	<?php $rowClass = ($value->value == $object2->$name->value) ? 'items-equal' : 'items-not-equal'; ?>
	<tr class="<?php echo $rowClass; ?>">
	<?php if (is_object($value->value)) : ?>
		<td><strong><?php echo $value->label; ?></strong></td>
		<td /><td /><td />
		<?php foreach ($value->value as $subName => $subValue) : ?>
			<?php $newSubValue = isset($object2->$name->value->$subName->value) ? $object2->$name->value->$subName->value : ''; ?>
			<?php if ($subValue->value || $newSubValue) : ?>
				<?php $rowClass = ($subValue->value == $newSubValue) ? 'items-equal' : 'items-not-equal'; ?>
				<tr class="<?php echo $rowClass; ?>">
				<td><i>&nbsp;&nbsp;<?php echo $subValue->label; ?></i></td>
				<td class="originalhtml" style="display:none" ><?php echo htmlspecialchars($subValue->value, ENT_COMPAT, 'UTF-8'); ?></td>
				<td class="changedhtml" style="display:none" ><?php echo htmlspecialchars($newSubValue, ENT_COMPAT, 'UTF-8'); ?></td>
				<td class="original"><?php echo $subValue->value; ?></td>
				<td class="changed"><?php echo $newSubValue; ?></td>
				<td class="diff" />
				<td class="diffhtml" />
				</tr>
			<?php endif; ?>
		<?php endforeach; ?>
	<?php else : ?>
		<td><strong><?php echo $value->label; ?></strong></td>
		<td class="originalhtml" style="display:none" ><?php echo htmlspecialchars($value->value); ?></td>
		<?php $object2->$name->value = is_object($object2->$name->value) ? json_encode($object2->$name->value) : $object2->$name->value; ?>
		<td class="changedhtml" style="display:none" ><?php echo htmlspecialchars($object2->$name->value, ENT_COMPAT, 'UTF-8'); ?></td>
		<td class="original"><?php echo $value->value; ?></td>
		<td class="changed"><?php echo $object2->$name->value; ?></td>
		<td class="diff" />
		<td class="diffhtml" />
	<?php endif; ?>
	</tr>
<?php endforeach; ?>
</tbody>
</table>
</fieldset>
components/com_contenthistory/controllers/history.php000060400000005723152453623440017456 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contenthistory
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Contenthistory list controller class.
 *
 * @since  3.2
 */
class ContenthistoryControllerHistory extends JControllerAdmin
{
	/**
	 * Deletes and returns correctly.
	 *
	 * @return	void
	 *
	 * @since	3.2
	 */
	public function delete()
	{
		$this->checkToken();

		// Get items to remove from the request.
		$cid = (array) $this->input->get('cid', array(), 'int');

		// Remove zero values resulting from input filter
		$cid = array_filter($cid);

		if (empty($cid))
		{
			JError::raiseWarning(500, JText::_('COM_CONTENTHISTORY_NO_ITEM_SELECTED'));
		}
		else
		{
			// Get the model.
			$model = $this->getModel();

			// Remove the items.
			if ($model->delete($cid))
			{
				$this->setMessage(JText::plural('COM_CONTENTHISTORY_N_ITEMS_DELETED', count($cid)));
			}
			else
			{
				$this->setMessage($model->getError());
			}
		}

		$this->setRedirect(
			JRoute::_(
				'index.php?option=com_contenthistory&view=history&layout=modal&tmpl=component&item_id='
				. $this->input->getInt('item_id') . '&type_id=' . $this->input->getInt('type_id')
				. '&type_alias=' . $this->input->getCmd('type_alias') . '&' . JSession::getFormToken() . '=1', false
			)
		);
	}

	/**
	 * Proxy for getModel.
	 *
	 * @param   string  $name    The name of the model
	 * @param   string  $prefix  The prefix for the model
	 * @param   array   $config  An additional array of parameters
	 *
	 * @return  JModelLegacy  The model
	 *
	 * @since   3.2
	 */
	public function getModel($name = 'History', $prefix = 'ContenthistoryModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	/**
	 * Toggles the keep forever value for one or more history rows. If it was Yes, changes to No. If No, changes to Yes.
	 *
	 * @return	void
	 *
	 * @since	3.2
	 */
	public function keep()
	{
		$this->checkToken();

		// Get items to remove from the request.
		$cid = (array) $this->input->get('cid', array(), 'int');

		// Remove zero values resulting from input filter
		$cid = array_filter($cid);

		if (empty($cid))
		{
			JError::raiseWarning(500, JText::_('COM_CONTENTHISTORY_NO_ITEM_SELECTED'));
		}
		else
		{
			// Get the model.
			$model = $this->getModel();

			// Remove the items.
			if ($model->keep($cid))
			{
				$this->setMessage(JText::plural('COM_CONTENTHISTORY_N_ITEMS_KEEP_TOGGLE', count($cid)));
			}
			else
			{
				$this->setMessage($model->getError());
			}
		}

		$this->setRedirect(
			JRoute::_(
				'index.php?option=com_contenthistory&view=history&layout=modal&tmpl=component&item_id='
				. $this->input->getInt('item_id') . '&type_id=' . $this->input->getInt('type_id')
				. '&type_alias=' . $this->input->getCmd('type_alias') . '&' . JSession::getFormToken() . '=1', false
			)
		);
	}
}
components/com_contenthistory/controllers/preview.php000060400000001531152453623440017427 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contenthistory
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Contenthistory list controller class.
 *
 * @since  3.2
 */
class ContenthistoryControllerPreview extends JControllerLegacy
{
	/**
	 * Proxy for getModel.
	 *
	 * @param   string  $name    The name of the model
	 * @param   string  $prefix  The prefix for the model
	 * @param   array   $config  An additional array of parameters
	 *
	 * @return  JModelLegacy  The model
	 *
	 * @since   3.2
	 */
	public function getModel($name = 'Preview', $prefix = 'ContenthistoryModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}
}
components/com_contenthistory/helpers/contenthistory.php000060400000026020152453623440020136 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contenthistory
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Categories helper.
 *
 * @since  3.2
 */
class ContenthistoryHelper
{
	/**
	 * Method to put all field names, including nested ones, in a single array for easy lookup.
	 *
	 * @param   stdClass  $object  Standard class object that may contain one level of nested objects.
	 *
	 * @return  array  Associative array of all field names, including ones in a nested object.
	 *
	 * @since   3.2
	 */
	public static function createObjectArray($object)
	{
		$result = array();

		if ($object === null)
		{
			return $result;
		}

		foreach ($object as $name => $value)
		{
			$result[$name] = $value;

			if (is_object($value))
			{
				foreach ($value as $subName => $subValue)
				{
					$result[$subName] = $subValue;
				}
			}
		}

		return $result;
	}

	/**
	 * Method to decode JSON-encoded fields in a standard object. Used to unpack JSON strings in the content history data column.
	 *
	 * @param   stdClass  $jsonString  Standard class object that may contain one or more JSON-encoded fields.
	 *
	 * @return  stdClass  Object with any JSON-encoded fields unpacked.
	 *
	 * @since   3.2
	 */
	public static function decodeFields($jsonString)
	{
		$object = json_decode($jsonString);

		if (is_object($object))
		{
			foreach ($object as $name => $value)
			{
				if ($subObject = json_decode($value))
				{
					$object->$name = $subObject;
				}
			}
		}

		return $object;
	}

	/**
	 * Method to get field labels for the fields in the JSON-encoded object.
	 * First we see if we can find translatable labels for the fields in the object.
	 * We translate any we can find and return an array in the format object->name => label.
	 *
	 * @param   stdClass           $object      Standard class object in the format name->value.
	 * @param   JTableContenttype  $typesTable  Table object with content history options.
	 *
	 * @return  stdClass  Contains two associative arrays.
	 *                    $formValues->labels in the format name => label (for example, 'id' => 'Article ID').
	 *                    $formValues->values in the format name => value (for example, 'state' => 'Published'.
	 *                    This translates the text from the selected option in the form.
	 *
	 * @since   3.2
	 */
	public static function getFormValues($object, JTableContenttype $typesTable)
	{
		$labels = array();
		$values = array();
		$expandedObjectArray = static::createObjectArray($object);
		static::loadLanguageFiles($typesTable->type_alias);

		if ($formFile = static::getFormFile($typesTable))
		{
			if ($xml = simplexml_load_file($formFile))
			{
				// Now we need to get all of the labels from the form
				$fieldArray = $xml->xpath('//field');
				$fieldArray = array_merge($fieldArray, $xml->xpath('//fields'));

				foreach ($fieldArray as $field)
				{
					if ($label = (string) $field->attributes()->label)
					{
						$labels[(string) $field->attributes()->name] = JText::_($label);
					}
				}

				// Get values for any list type fields
				$listFieldArray = $xml->xpath('//field[@type="list" or @type="radio"]');

				foreach ($listFieldArray as $field)
				{
					$name = (string) $field->attributes()->name;

					if (isset($expandedObjectArray[$name]))
					{
						$optionFieldArray = $field->xpath('option[@value="' . $expandedObjectArray[$name] . '"]');

						$valueText = null;

						if (is_array($optionFieldArray) && count($optionFieldArray))
						{
							$valueText = trim((string) $optionFieldArray[0]);
						}

						$values[(string) $field->attributes()->name] = JText::_($valueText);
					}
				}
			}
		}

		$result = new stdClass;
		$result->labels = $labels;
		$result->values = $values;

		return $result;
	}

	/**
	 * Method to get the XML form file for this component. Used to get translated field names for history preview.
	 *
	 * @param   JTableContenttype  $typesTable  Table object with content history options.
	 *
	 * @return  mixed  JModel object if successful, false if no model found.
	 *
	 * @since   3.2
	 */
	public static function getFormFile(JTableContenttype $typesTable)
	{
		$result = false;
		jimport('joomla.filesystem.file');
		jimport('joomla.filesystem.folder');

		// First, see if we have a file name in the $typesTable
		$options = json_decode($typesTable->content_history_options);

		if (is_object($options) && isset($options->formFile) && JFile::exists(JPATH_ROOT . '/' . $options->formFile))
		{
			$result = JPATH_ROOT . '/' . $options->formFile;
		}
		else
		{
			$aliasArray = explode('.', $typesTable->type_alias);

			if (count($aliasArray) == 2)
			{
				$component = ($aliasArray[1] == 'category') ? 'com_categories' : $aliasArray[0];
				$path  = JFolder::makeSafe(JPATH_ADMINISTRATOR . '/components/' . $component . '/models/forms/');
				$file = JFile::makeSafe($aliasArray[1] . '.xml');
				$result = JFile::exists($path . $file) ? $path . $file : false;
			}
		}

		return $result;
	}

	/**
	 * Method to query the database using values from lookup objects.
	 *
	 * @param   stdClass  $lookup  The std object with the values needed to do the query.
	 * @param   mixed     $value   The value used to find the matching title or name. Typically the id.
	 *
	 * @return  mixed  Value from database (for example, name or title) on success, false on failure.
	 *
	 * @since   3.2
	 */
	public static function getLookupValue($lookup, $value)
	{
		$result = false;

		if (isset($lookup->sourceColumn) && isset($lookup->targetTable) && isset($lookup->targetColumn)&& isset($lookup->displayColumn))
		{
			$db = JFactory::getDbo();
			$query = $db->getQuery(true);
			$query->select($db->quoteName($lookup->displayColumn))
				->from($db->quoteName($lookup->targetTable))
				->where($db->quoteName($lookup->targetColumn) . ' = ' . $db->quote($value));
			$db->setQuery($query);

			try
			{
				$result = $db->loadResult();
			}
			catch (Exception $e)
			{
				// Ignore any errors and just return false
				return false;
			}
		}

		return $result;
	}

	/**
	 * Method to remove fields from the object based on values entered in the #__content_types table.
	 *
	 * @param   stdClass           $object     Object to be passed to view layout file.
	 * @param   JTableContenttype  $typeTable  Table object with content history options.
	 *
	 * @return  stdClass  object with hidden fields removed.
	 *
	 * @since   3.2
	 */
	public static function hideFields($object, JTableContenttype $typeTable)
	{
		if ($options = json_decode($typeTable->content_history_options))
		{
			if (isset($options->hideFields) && is_array($options->hideFields))
			{
				foreach ($options->hideFields as $field)
				{
					unset($object->$field);
				}
			}
		}

		return $object;
	}

	/**
	 * Method to load the language files for the component whose history is being viewed.
	 *
	 * @param   string  $typeAlias  The type alias, for example 'com_content.article'.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public static function loadLanguageFiles($typeAlias)
	{
		$aliasArray = explode('.', $typeAlias);

		if (is_array($aliasArray) && count($aliasArray) == 2)
		{
			$component = ($aliasArray[1] == 'category') ? 'com_categories' : $aliasArray[0];
			$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_ADMINISTRATOR, null, false, true)
			|| $lang->load($component, JPath::clean(JPATH_ADMINISTRATOR . '/components/' . $component), null, false, true);

			// Force loading of backend global language file
			$lang->load('joomla', JPath::clean(JPATH_ADMINISTRATOR), null, false, true);
		}
	}

	/**
	 * Method to create object to pass to the layout. Format is as follows:
	 * field is std object with name, value.
	 *
	 * Value can be a std object with name, value pairs.
	 *
	 * @param   stdClass  $object      The std object from the JSON string. Can be nested 1 level deep.
	 * @param   stdClass  $formValues  Standard class of label and value in an associative array.
	 *
	 * @return  stdClass  Object with translated labels where available
	 *
	 * @since   3.2
	 */
	public static function mergeLabels($object, $formValues)
	{
		$result = new stdClass;

		if ($object === null)
		{
			return $result;
		}

		$labelsArray = $formValues->labels;
		$valuesArray = $formValues->values;

		foreach ($object as $name => $value)
		{
			$result->$name = new stdClass;
			$result->$name->name = $name;
			$result->$name->value = isset($valuesArray[$name]) ? $valuesArray[$name] : $value;
			$result->$name->label = isset($labelsArray[$name]) ? $labelsArray[$name] : $name;

			if (is_object($value))
			{
				$subObject = new stdClass;

				foreach ($value as $subName => $subValue)
				{
					$subObject->$subName = new stdClass;
					$subObject->$subName->name = $subName;
					$subObject->$subName->value = isset($valuesArray[$subName]) ? $valuesArray[$subName] : $subValue;
					$subObject->$subName->label = isset($labelsArray[$subName]) ? $labelsArray[$subName] : $subName;
					$result->$name->value = $subObject;
				}
			}
		}

		return $result;
	}

	/**
	 * Method to prepare the object for the preview and compare views.
	 *
	 * @param   JTableContenthistory  $table  Table object loaded with data.
	 *
	 * @return  stdClass  Object ready for the views.
	 *
	 * @since   3.2
	 */
	public static function prepareData(JTableContenthistory $table)
	{
		$object = static::decodeFields($table->version_data);
		$typesTable = JTable::getInstance('Contenttype');
		$typesTable->load(array('type_id' => $table->ucm_type_id));
		$formValues = static::getFormValues($object, $typesTable);
		$object = static::mergeLabels($object, $formValues);
		$object = static::hideFields($object, $typesTable);
		$object = static::processLookupFields($object, $typesTable);

		return $object;
	}

	/**
	 * Method to process any lookup values found in the content_history_options column for this table.
	 * This allows category title and user name to be displayed instead of the id column.
	 *
	 * @param   stdClass           $object      The std object from the JSON string. Can be nested 1 level deep.
	 * @param   JTableContenttype  $typesTable  Table object loaded with data.
	 *
	 * @return  stdClass  Object with lookup values inserted.
	 *
	 * @since   3.2
	 */
	public static function processLookupFields($object, JTableContenttype $typesTable)
	{
		if ($options = json_decode($typesTable->content_history_options))
		{
			if (isset($options->displayLookup) && is_array($options->displayLookup))
			{
				foreach ($options->displayLookup as $lookup)
				{
					$sourceColumn = isset($lookup->sourceColumn) ? $lookup->sourceColumn : false;
					$sourceValue = isset($object->$sourceColumn->value) ? $object->$sourceColumn->value : false;

					if ($sourceColumn && $sourceValue && ($lookupValue = static::getLookupValue($lookup, $sourceValue)))
					{
						$object->$sourceColumn->value = $lookupValue;
					}
				}
			}
		}

		return $object;
	}
}
components/com_contenthistory/helpers/html/textdiff.php000060400000003216152453623440017625 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contenthistory
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('JPATH_PLATFORM') or die;

/**
 * HTML utility class for creating text diffs using jQuery, diff_patch_match.js and jquery.pretty-text-diff.js JavaScript libraries.
 *
 * @since       3.2
 *
 * @deprecated  4.0 No replacement
 */
abstract class JHtmlTextdiff
{
	/**
	 * @var    array  Array containing information for loaded files
	 * @since  3.2
	 */
	protected static $loaded = array();

	/**
	 * Method to load Javascript text diff
	 *
	 * @param   string  $containerId  DOM id of the element where the diff will be rendered
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public static function textdiff($containerId)
	{
		// Only load once
		if (isset(static::$loaded[__METHOD__]))
		{
			return;
		}

		// Depends on jQuery UI
		JHtml::_('bootstrap.framework');
		JHtml::_('script', 'com_contenthistory/diff_match_patch.js', array('version' => 'auto', 'relative' => true));
		JHtml::_('script', 'com_contenthistory/jquery.pretty-text-diff.min.js', array('version' => 'auto', 'relative' => true));
		JHtml::_('stylesheet', 'com_contenthistory/jquery.pretty-text-diff.css', array('version' => 'auto', 'relative' => true));

		// Attach diff to document
		JFactory::getDocument()->addScriptDeclaration("
			(function ($){
				$(document).ready(function (){
 					$('#" . $containerId . " tr').prettyTextDiff();
 				});
			})(jQuery);
			"
		);

		// Set static array
		static::$loaded[__METHOD__] = true;

		return;
	}
}
components/com_contenthistory/contenthistory.xml000060400000002155152453623440016510 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.2" method="upgrade">
	<name>com_contenthistory</name>
	<author>Joomla! Project</author>
	<creationDate>May 2013</creationDate>
	<copyright>(C) 2013 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.2.0</version>
	<description>COM_CONTENTHISTORY_XML_DESCRIPTION</description>
	<files folder="site">
		<filename>contenthistory.php</filename>
		<filename>index.html</filename>
	</files>
	<administration>
		<files folder="admin">
			<filename>controller.php</filename>
			<filename>contenthistory.php</filename>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>media</folder>
			<folder>models</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_contenthistory.ini</language>
			<language tag="en-GB">language/en-GB.com_contenthistory.sys.ini</language>
		</languages>
	</administration>
</extension>

components/com_contenthistory/controller.php000060400000000604152453623440015563 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contenthistory
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Contenthistory Controller
 *
 * @since  3.2
 */
class ContenthistoryController extends JControllerLegacy
{
}
components/com_contenthistory/contenthistory.php000060400000001171152453623440016474 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contenthistory
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Disallow unauthenticated users
if (JFactory::getUser()->guest)
{
	throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
}

$controller = JControllerLegacy::getInstance('Contenthistory', array('base_path' => JPATH_COMPONENT_ADMINISTRATOR));
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
components/com_associations/helpers/associations.php000060400000041424152453623440017151 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_associations
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\CMS\Language\LanguageHelper;

/**
 * Associations component helper.
 *
 * @since  3.7.0
 */
class AssociationsHelper extends JHelperContent
{
	/**
	 * Array of Registry objects of extensions
	 *
	 * var      array   $extensionsSupport
	 *
	 * @since   3.7.0
	 */
	public static $extensionsSupport = null;

	/**
	 * List of extensions name with support
	 *
	 * var      array   $supportedExtensionsList
	 *
	 * @since   3.7.0
	 */
	public static $supportedExtensionsList = array();

	/**
	 * 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  array
	 *
	 * @since   3.7.0
	 */
	public static function getAssociationList($extensionName, $typeName, $itemId)
	{
		if (!self::hasSupport($extensionName))
		{
			return array();
		}

		// Get the extension specific helper method
		$helper = self::getExtensionHelper($extensionName);

		return $helper->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 = '<strong>' . JText::sprintf('JCATEGORY_SPRINTF', $category_title) . '</strong> <br />';
				}
				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 = '<strong>' . JText::sprintf('COM_MENUS_MENU_SPRINTF', $menutype_title) . '</strong><br />';
				}

				$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') . '<br /><br />' . $additional;
			$classes = 'hasPopover label ' . $labelClass . ' label-' . $language->sef;

			$items[$langCode]['link'] = '<a href="' . $url . '" title="' . $language->title . '" class="' . $classes
						. '" data-content="' . $tooltip . '" data-placement="top">'
						. $text . '</a>';
		}

		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;
	}
}
components/com_associations/associations.xml000060400000002172152453623440015515 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.7" method="upgrade">
	<name>com_associations</name>
	<author>Joomla! Project</author>
	<creationDate>January 2017</creationDate>
	<copyright>(C) 2017 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>COM_ASSOCIATIONS_XML_DESCRIPTION</description>
	<administration>
		<menu img="class:associations">COM_ASSOCIATIONS</menu>
		<files folder="admin">
			<filename>access.xml</filename>
			<filename>config.xml</filename>
			<filename>associations.php</filename>
			<filename>controller.php</filename>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>layouts</folder>
			<folder>models</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_associations.ini</language>
			<language tag="en-GB">language/en-GB.com_associations.sys.ini</language>
		</languages>
	</administration>
</extension>
components/com_associations/associations.php000060400000002352152453623440015504 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_associations
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.tabstate');

if (!JFactory::getUser()->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();
components/com_associations/models/association.php000060400000001674152453623440016612 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_associations
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Methods supporting a list of article records.
 *
 * @since  3.7.0
 */
class AssociationsModelAssociation extends JModelList
{
	/**
	 * 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  mixed  A JForm object on success, false on failure
	 *
	 * @since   3.7.0
	 */
	public function getForm($data = array(), $loadData = true)
	{
		// Get the form.
		$form = $this->loadForm('com_associations.association', 'association', array('control' => 'jform', 'load_data' => $loadData));

		return !empty($form) ? $form : false;
	}
}
components/com_associations/models/fields/itemlanguage.php000060400000006252152453623440020203 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_associations
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;
use Joomla\CMS\Language\LanguageHelper;

JLoader::register('AssociationsHelper', JPATH_ADMINISTRATOR . '/components/com_associations/helpers/associations.php');
JFormHelper::loadFieldClass('list');

/**
 * Field listing item languages
 *
 * @since  3.7.0
 */
class JFormFieldItemLanguage extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.7.0
	 */
	protected $type = 'ItemLanguage';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   3.7.0
	 */
	protected function getOptions()
	{
		$input = JFactory::getApplication()->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 "<lang>|<id>", 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);
	}
}
components/com_associations/models/fields/itemtype.php000060400000002771152453623440017403 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_associations
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

JLoader::register('AssociationsHelper', JPATH_ADMINISTRATOR . '/components/com_associations/helpers/associations.php');
JFormHelper::loadFieldClass('groupedlist');

/**
 * A drop down containing all component item types that implement associations.
 *
 * @since  3.7.0
 */
class JFormFieldItemType extends JFormFieldGroupedList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 *
	 * @since  3.7.0
	 */
	protected $type = 'ItemType';

	/**
	 * Method to get the field input markup.
	 *
	 * @return  array  The field option objects as a nested array in groups.
	 *
	 * @since   3.7.0
	 *
	 * @throws  UnexpectedValueException
	 */
	protected function getGroups()
	{
		$options    = array();
		$extensions = AssociationsHelper::getSupportedExtensions();

		foreach ($extensions as $extension)
		{
			if ($extension->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);
	}
}
components/com_associations/models/fields/modalassociation.php000060400000006557152453623440021102 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_associations
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Supports a modal item picker.
 *
 * @since  3.7.0
 */
class JFormFieldModalAssociation extends JFormField
{
	/**
	 * The form field type.
	 *
	 * @var     string
	 * @since   3.7.0
	 */
	protected $type = 'Modal_Association';

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string  The field input markup.
	 *
	 * @since   3.7.0
	 */
	protected function getInput()
	{
		// The active item id field.
		$value = (int) $this->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&amp;view=associations&amp;layout=modal&amp;tmpl=component'
			. '&amp;forcedItemType=' . JFactory::getApplication()->input->get('itemtype', '', 'string') . '&amp;function=jSelectAssociation_' . $this->id;

		$linkAssociations .= "&amp;forcedLanguage=' + document.getElementById('target-association').getAttribute('data-language') + '";

		$urlSelect = $linkAssociations . '&amp;' . JSession::getFormToken() . '=1';

		// Select custom association button
		$html[] = '<button'
			. ' type="button"'
			. ' id="select-change"'
			. ' class="btn' . ($value ? '' : ' hidden') . '"'
			. ' data-toggle="modal"'
			. ' data-select="' . JText::_('COM_ASSOCIATIONS_SELECT_TARGET') . '"'
			. ' data-change="' . JText::_('COM_ASSOCIATIONS_CHANGE_TARGET') . '"'
			. ' data-target="#associationSelect' . $this->id . 'Modal">'
			. '<span class="icon-file" aria-hidden="true"></span>'
			. '<span id="select-change-text"></span>'
			. '</button>';

		// Clear association button
		$html[] = '<button'
			. ' type="button"'
			. ' class="btn' . ($value ? '' : ' hidden') . '"'
			. ' onclick="return Joomla.submitbutton(\'undo-association\');"'
			. ' id="remove-assoc">'
			. '<span class="icon-remove" aria-hidden="true"></span>' . JText::_('JCLEAR')
			. '</button>';

		$html[] = '<input type="hidden" id="' . $this->id . '_id" name="' . $this->name . '" value="' . $value . '" />';

		// 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'      => '<button type="button" class="btn" data-dismiss="modal">'
						. JText::_("JLIB_HTML_BEHAVIOR_CLOSE") . '</button>',
			)
		);

		return implode("\n", $html);
	}
}
components/com_associations/models/associations.php000060400000034156152453623440016776 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_associations
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Methods supporting a list of article records.
 *
 * @since  3.7.0
 */
class AssociationsModelAssociations extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @since   3.7.0
	 *
	 * @see     JController
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id',
				'title',
				'ordering',
				'itemtype',
				'language',
				'association',
				'menutype',
				'menutype_title',
				'level',
				'state',
				'category_id',
				'category_title',
				'access',
				'access_level',
			);
		}

		parent::__construct($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   3.7.0
	 */
	protected function populateState($ordering = 'ordering', $direction = 'asc')
	{
		$app = JFactory::getApplication();

		$forcedLanguage = $app->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;
	}
}
components/com_associations/models/forms/association.xml000060400000000665152453623440017750 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<field
			name="itemlanguage"
			type="itemlanguage"
			label="COM_ASSOCIATIONS_ITEM_FIELD_LANGUAGE_LABEL"
			description="COM_ASSOCIATIONS_ITEM_FIELD_LANGUAGE_DESC"
			>
			<option value="">COM_ASSOCIATIONS_SELECT_TARGET_LANGUAGE</option>
		</field>

		<field
			name="modalassociation"
			type="modalassociation"
		/>
	</fieldset>

	<fields name="params">
	</fields>
</form>
components/com_associations/models/forms/filter_associations.xml000060400000005664152453623440021504 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<field
		name="itemtype"
		type="itemtype"
		label="COM_ASSOCIATIONS_COMPONENT_SELECTOR_LABEL"
		description="COM_ASSOCIATIONS_COMPONENT_SELECTOR_DESC"
		filtermode="selector"
		onchange="jQuery('select[id^=\'filter_\']').val('');jQuery('select[id^=\'list_\']').val('');this.form.submit();"
		>
		<option value="">COM_ASSOCIATIONS_FILTER_SELECT_ITEM_TYPE</option>
	</field>

	<field
		name="language"
		type="contentlanguage"
		label="JOPTION_FILTER_LANGUAGE"
		description="JOPTION_FILTER_LANGUAGE_DESC"
		filtermode="selector"
		onchange="this.form.submit();"
		>
		<option value="">JOPTION_SELECT_LANGUAGE</option>
	</field>

	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_ASSOCIATIONS_FILTER_SEARCH_LABEL"
			description="COM_ASSOCIATIONS_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
		/>

		<field
			name="state"
			type="status"
			label="JOPTION_FILTER_PUBLISHED"
			description="JOPTION_FILTER_PUBLISHED_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>

		<field
			name="category_id"
			type="category"
			label="JOPTION_FILTER_CATEGORY"
			description="JOPTION_FILTER_CATEGORY_DESC"
			published="0,1,2"
			extension="dynamic"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_CATEGORY</option>
		</field>

		<field
			name="menutype"
			type="menu"
			label="COM_ASSOCIATIONS_FILTER_MENUTYPE_LABEL"
			description="COM_ASSOCIATIONS_FILTER_MENUTYPE_DESC"
			clientid="0"
			onchange="this.form.submit();"
			>
			<option value="">COM_ASSOCIATIONS_SELECT_MENU</option>
		</field>

		<field
			name="access"
			type="accesslevel"
			label="JOPTION_FILTER_ACCESS"
			description="JOPTION_FILTER_ACCESS_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_ACCESS</option>
		</field>

		<field
			name="level"
			type="integer"
			label="JOPTION_FILTER_LEVEL"
			description="JOPTION_FILTER_LEVEL_DESC"
			first="1"
			last="10"
			step="1"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_MAX_LEVELS</option>
		</field>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			default="id ASC"
			onchange="this.form.submit();"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="state ASC">JSTATUS_ASC</option>
			<option value="state DESC">JSTATUS_DESC</option>
			<option value="title ASC">JGLOBAL_TITLE_ASC</option>
			<option value="title DESC">JGLOBAL_TITLE_DESC</option>
			<option value="access_level ASC">JGRID_HEADING_ACCESS_ASC</option>
			<option value="access_level DESC">JGRID_HEADING_ACCESS_DESC</option>
			<option value="id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="id DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			default="25"
			class="input-mini"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_associations/views/association/tmpl/edit.php000060400000005763152453623440020370 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_associations
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');
JHtml::_('formbehavior.chosen', 'select');

JHtml::_('script', 'com_associations/sidebyside.js', false, true);
JHtml::_('stylesheet', 'com_associations/sidebyside.css', array(), true);

$options = array(
			'layout'   => $this->app->input->get('layout', '', 'string'),
			'itemtype' => $this->itemtype,
			'id'       => $this->referenceId,
		);
?>
<button id="toogle-left-panel" class="btn btn-small"
		data-show-reference="<?php echo JText::_('COM_ASSOCIATIONS_EDIT_SHOW_REFERENCE'); ?>"
		data-hide-reference="<?php echo JText::_('COM_ASSOCIATIONS_EDIT_HIDE_REFERENCE'); ?>"><?php echo JText::_('COM_ASSOCIATIONS_EDIT_HIDE_REFERENCE'); ?>
</button>

<form action="<?php echo JRoute::_('index.php?option=com_associations&view=association&' . http_build_query($options)); ?>" method="post" name="adminForm" id="adminForm" data-associatedview="<?php echo $this->typeName; ?>">
	<div class="sidebyside">
		<div class="outer-panel" id="left-panel">
			<div class="inner-panel">
				<h3><?php echo JText::_('COM_ASSOCIATIONS_REFERENCE_ITEM'); ?></h3>
				<iframe id="reference-association" name="reference-association" title="reference-association"
					src="<?php echo JRoute::_($this->editUri . '&task=' . $this->typeName . '.edit&id=' . (int) $this->referenceId); ?>"
					height="400" width="400"
					data-action="edit"
					data-item="<?php echo $this->typeName; ?>"
					data-id="<?php echo $this->referenceId; ?>"
					data-title="<?php echo $this->referenceTitle; ?>"
					data-title-value="<?php echo $this->referenceTitleValue; ?>"
					data-language="<?php echo $this->referenceLanguage; ?>"
					data-editurl="<?php echo JRoute::_($this->editUri); ?>">
				</iframe>
			</div>
		</div>
		<div class="outer-panel" id="right-panel">
			<div class="inner-panel">
				<div class="language-selector">
					<h3 class="target-text"><?php echo JText::_('COM_ASSOCIATIONS_ASSOCIATED_ITEM'); ?></h3>
					<?php echo $this->form->getInput('modalassociation'); ?>
					<?php echo $this->form->getInput('itemlanguage'); ?>
				</div>
				<iframe id="target-association" name="target-association" title="target-association"
					src="<?php echo $this->defaultTargetSrc; ?>"
					height="400" width="400"
					data-action="<?php echo $this->targetAction; ?>"
					data-item="<?php echo $this->typeName; ?>"
					data-id="<?php echo $this->targetId; ?>"
					data-title="<?php echo $this->targetTitle; ?>"
					data-language="<?php echo $this->targetLanguage; ?>"
					data-editurl="<?php echo JRoute::_($this->editUri); ?>">
				</iframe>
			</div>
		</div>

	</div>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="target-id" id="target-id" value="" />
	<?php echo JHtml::_('form.token'); ?>
</form>
components/com_associations/views/association/view.html.php000060400000013137152453623440020376 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_associations
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * View class for a list of articles.
 *
 * @since  3.7.0
 */
class AssociationsViewAssociation extends JViewLegacy
{
	/**
	 * An array of items
	 *
	 * @var    array
	 *
	 * @since  3.7.0
	 */
	protected $items;

	/**
	 * The pagination object
	 *
	 * @var    JPagination
	 *
	 * @since  3.7.0
	 */
	protected $pagination;

	/**
	 * The model state
	 *
	 * @var    object
	 *
	 * @since  3.7.0
	 */
	protected $state;

	/**
	 * Selected item type properties.
	 *
	 * @var    Registry
	 *
	 * @since  3.7.0
	 */
	public $itemType = null;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 *
	 * @since   3.7.0
	 * @throws  Exception
	 */
	public function display($tpl = null)
	{
		// Check for errors.
		if (count($errors = $this->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');
		$this->referenceTitleValue = $reference[$this->referenceTitle];

		$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;

			/* Let's put the target src into a variable to use in the javascript code
			*  to avoid race conditions when the reference iframe loads.
			*/
			$document = JFactory::getDocument();
			$document->addScriptOptions('targetSrc', JRoute::_($this->editUri . '&task=' . $task . '&id=' . (int) $this->targetId));
			$this->form->setValue('itemlanguage', '', $this->targetLanguage . ':' . $this->targetId . ':' . $this->targetAction);
		}

		$this->addToolbar();

		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', '<button onclick="Joomla.submitbutton(\'reference\')" '
			. 'class="btn btn-small btn-success"><span class="icon-apply icon-white" aria-hidden="true"></span>'
			. JText::_('COM_ASSOCIATIONS_SAVE_REFERENCE') . '</button>', 'reference'
		);

		$bar->appendButton(
			'Custom', '<button onclick="Joomla.submitbutton(\'target\')" '
			. 'class="btn btn-small btn-success"><span class="icon-apply icon-white" aria-hidden="true"></span>'
			. JText::_('COM_ASSOCIATIONS_SAVE_TARGET') . '</button>', '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');
	}
}
components/com_associations/views/associations/view.html.php000060400000014071152453623440020557 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_associations
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of articles.
 *
 * @since  3.7.0
 */
class AssociationsViewAssociations extends JViewLegacy
{
	/**
	 * An array of items
	 *
	 * @var   array
	 *
	 * @since  3.7.0
	 */
	protected $items;

	/**
	 * The pagination object
	 *
	 * @var    JPagination
	 *
	 * @since  3.7.0
	 */
	protected $pagination;

	/**
	 * The model state
	 *
	 * @var    object
	 *
	 * @since  3.7.0
	 */
	protected $state;

	/**
	 * Selected item type properties.
	 *
	 * @var    Registry
	 *
	 * @since  3.7.0
	 */
	public $itemType = null;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 *
	 * @since   3.7.0
	 */
	public function display($tpl = null)
	{
		$this->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');

					if ($this->getLayout() == 'modal')
					{
						// We need to change the category filter to only show categories tagged to All or to the forced language.
						if ($forcedLanguage = JFactory::getApplication()->input->get('forcedLanguage', '', 'CMD'))
						{
							$this->filterForm->setFieldAttribute('category_id', 'language', '*,' . $forcedLanguage, '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');
	}
}
components/com_associations/views/associations/tmpl/modal.php000060400000015353152453623440020716 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_associations
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$app = JFactory::getApplication();

if ($app->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'));
			}
		});
	});"
);
?>
<form action="<?php echo JRoute::_('index.php?option=com_associations&view=associations&layout=modal&tmpl=component&function='
. $function . '&' . JSession::getFormToken() . '=1'); ?>" method="post" name="adminForm" id="adminForm">

<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
	<?php if (empty($this->items)) : ?>
		<div class="alert alert-no-items">
			<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
		</div>
	<?php else : ?>
		<table class="table table-striped" id="associationsList">
			<thead>
				<tr>
					<?php if (!empty($this->typeSupports['state'])) : ?>
						<th width="1%" class="center nowrap">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'state', $listDirn, $listOrder); $colSpan++; ?>
						</th>
					<?php endif; ?>
					<th class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'title', $listDirn, $listOrder); ?>
					</th>
					<th width="15%" class="nowrap">
						<?php echo JText::_('JGRID_HEADING_LANGUAGE'); ?>
					</th>
					<th width="5%" class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'COM_ASSOCIATIONS_HEADING_ASSOCIATION', 'association', $listDirn, $listOrder); ?>
					</th>
					<?php if (!empty($this->typeFields['menutype'])) : ?>
						<th width="10%" class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_ASSOCIATIONS_HEADING_MENUTYPE', 'menutype_title', $listDirn, $listOrder); $colSpan++; ?>
						</th>
					<?php endif; ?>
					<?php if (!empty($this->typeSupports['acl'])) : ?>
						<th width="5%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ACCESS', 'access_level', $listDirn, $listOrder); $colSpan++; ?>
						</th>
					<?php endif; ?>
					<th width="1%" class="nowrap hidden-phone">
						<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'id', $listDirn, $listOrder); ?>
					</th>
				</tr>
			</thead>
			<tfoot>
				<tr>
					<td colspan="<?php echo $colSpan; ?>">
						<?php echo $this->pagination->getListFooter(); ?>
					</td>
				</tr>
			</tfoot>
			<tbody>
			<?php foreach ($this->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);
				?>
				<tr class="row<?php echo $i % 2; ?>">
					<?php if (!empty($this->typeSupports['state'])) : ?>
						<td class="center">
							<span class="<?php echo $iconStates[$this->escape($item->state)]; ?>" aria-hidden="true"></span>
						</td>
					<?php endif; ?>
					<td class="nowrap has-context">
						<?php if (isset($item->level)) : ?>
							<?php echo JLayoutHelper::render('joomla.html.treeprefix', array('level' => $item->level)); ?>
						<?php endif; ?>
						<?php if (($canEdit && !$isCheckout) || ($canEdit && $canCheckin && $isCheckout)) : ?>
							<a class="select-link" href="javascript:void(0);" data-id="<?php echo $item->id; ?>">
							<?php echo $this->escape($item->title); ?></a>
						<?php elseif ($canEdit && $isCheckout) : ?>
							<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'associations.'); ?>
							<span title="<?php echo JText::sprintf('JFIELD_ALIAS_LABEL', $this->escape($item->alias)); ?>">
							<?php echo $this->escape($item->title); ?></span>
						<?php else : ?>
							<span title="<?php echo JText::sprintf('JFIELD_ALIAS_LABEL', $this->escape($item->alias)); ?>">
							<?php echo $this->escape($item->title); ?></span>
						<?php endif; ?>
						<?php if (!empty($this->typeFields['alias'])) : ?>
							<span class="small">
								<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias)); ?>
							</span>
						<?php endif; ?>
						<?php if (!empty($this->typeFields['catid'])) : ?>
							<div class="small">
								<?php echo JText::_('JCATEGORY') . ": " . $this->escape($item->category_title); ?>
							</div>
						<?php endif; ?>
					</td>
					<td class="small">
						<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
					</td>
					<td>
						<?php if (true || $item->association) : ?>
							<?php echo AssociationsHelper::getAssociationHtmlList($this->extensionName, $this->typeName, (int) $item->id, $item->language, false, false); ?>
						<?php endif; ?>
					</td>
					<?php if (!empty($this->typeFields['menutype'])) : ?>
						<td class="small">
							<?php echo $this->escape($item->menutype_title); ?>
						</td>
					<?php endif; ?>
					<?php if (!empty($this->typeSupports['acl'])) : ?>
						<td class="small hidden-phone">
							<?php echo $this->escape($item->access_level); ?>
						</td>
					<?php endif; ?>
					<td class="hidden-phone">
						<?php echo $item->id; ?>
					</td>
				</tr>
				<?php endforeach; ?>
			</tbody>
		</table>

	<?php endif; ?>

		<input type="hidden" name="task" value=""/>
		<input type="hidden" name="forcedItemType" value="<?php echo $app->input->get('forcedItemType', '', 'string'); ?>" />
		<input type="hidden" name="forcedLanguage" value="<?php echo $app->input->get('forcedLanguage', '', 'cmd'); ?>" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_associations/views/associations/tmpl/default.xml000060400000000264152453623440021252 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_ASSOCIATIONS">
		<message>
			<![CDATA[COM_ASSOCIATIONS_XML_DESCRIPTION]]>
		</message>
	</layout>
</metadata>components/com_associations/views/associations/tmpl/default.php000060400000015433152453623440021245 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_associations
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('AssociationsHelper', JPATH_ADMINISTRATOR . '/components/com_associations/helpers/associations.php');

JHtml::_('jquery.framework');
JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$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          = 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);
		}
	};
');
?>
<form action="<?php echo JRoute::_('index.php?option=com_associations&view=associations'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
	<?php if (empty($this->items)) : ?>
		<div class="alert alert-no-items">
			<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
		</div>
	<?php else : ?>
		<table class="table table-striped" id="associationsList">
			<thead>
				<tr>
					<?php if (!empty($this->typeSupports['state'])) : ?>
						<th width="1%" class="center nowrap">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'state', $listDirn, $listOrder); $colSpan++; ?>
						</th>
					<?php endif; ?>
					<th class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'title', $listDirn, $listOrder); ?>
					</th>
					<th width="15%" class="nowrap">
						<?php echo JText::_('JGRID_HEADING_LANGUAGE'); ?>
					</th>
					<th width="5%" class="nowrap">
						<?php echo JText::_('COM_ASSOCIATIONS_HEADING_ASSOCIATION'); ?>
					</th>
					<th width="15%" class="nowrap">
						<?php echo JText::_('COM_ASSOCIATIONS_HEADING_NO_ASSOCIATION'); ?>
					</th>
					<?php if (!empty($this->typeFields['menutype'])) : ?>
						<th width="10%" class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_ASSOCIATIONS_HEADING_MENUTYPE', 'menutype_title', $listDirn, $listOrder); $colSpan++; ?>
						</th>
					<?php endif; ?>
					<?php if (!empty($this->typeFields['access'])) : ?>
						<th width="5%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ACCESS', 'access_level', $listDirn, $listOrder); $colSpan++; ?>
						</th>
					<?php endif; ?>
					<th width="1%" class="nowrap hidden-phone">
						<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'id', $listDirn, $listOrder); ?>
					</th>
				</tr>
			</thead>
			<tfoot>
				<tr>
					<td colspan="<?php echo $colSpan; ?>">
						<?php echo $this->pagination->getListFooter(); ?>
					</td>
				</tr>
			</tfoot>
			<tbody>
			<?php foreach ($this->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);
				?>
				<tr class="row<?php echo $i % 2; ?>">
					<?php if (!empty($this->typeSupports['state'])) : ?>
						<td class="center">
							<span class="<?php echo $iconStates[$this->escape($item->state)]; ?>"></span>
						</td>
					<?php endif; ?>
					<td class="has-context">
						<div class="pull-left break-word">
							<span style="display: none"><?php echo JHtml::_('grid.id', $i, $item->id); ?></span>
							<?php if (isset($item->level)) : ?>
								<?php echo JLayoutHelper::render('joomla.html.treeprefix', array('level' => $item->level)); ?>
							<?php endif; ?>
							<?php if (!$canCheckin && $isCheckout) : ?>
								<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'associations.'); ?>
							<?php endif; ?>
							<?php if ($canCheckin && $isCheckout) : ?>
								<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'associations.', $canCheckin); ?>
							<?php endif; ?>
							<?php if ($canEdit && !$isCheckout) : ?>
								<a href="<?php echo JRoute::_($this->editUri . '&id=' . (int) $item->id); ?>">
								<?php echo $this->escape($item->title); ?></a>
							<?php else : ?>
								<span title="<?php echo JText::sprintf('JFIELD_ALIAS_LABEL', $this->escape($item->alias)); ?>"><?php echo $this->escape($item->title); ?></span>
							<?php endif; ?>
							<?php if (!empty($this->typeFields['alias'])) : ?>
								<span class="small">
									<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias)); ?>
								</span>
							<?php endif; ?>
							<?php if (!empty($this->typeFields['catid'])) : ?>
								<div class="small">
									<?php echo JText::_('JCATEGORY') . ": " . $this->escape($item->category_title); ?>
								</div>
							<?php endif; ?>
						</div>
					</td>
					<td class="small">
						<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
					</td>
					<td>
						<?php echo AssociationsHelper::getAssociationHtmlList($this->extensionName, $this->typeName, (int) $item->id, $item->language, !$isCheckout, false); ?>
					</td>
					<td>
						<?php echo AssociationsHelper::getAssociationHtmlList($this->extensionName, $this->typeName, (int) $item->id, $item->language, !$isCheckout, true); ?>
					</td>
					<?php if (!empty($this->typeFields['menutype'])) : ?>
						<td class="small">
							<?php echo $this->escape($item->menutype_title); ?>
						</td>
					<?php endif; ?>
					<?php if (!empty($this->typeFields['access'])) : ?>
						<td class="small hidden-phone">
							<?php echo $this->escape($item->access_level); ?>
						</td>
					<?php endif; ?>
					<td class="hidden-phone">
						<?php echo $item->id; ?>
					</td>
				</tr>
				<?php endforeach; ?>
			</tbody>
		</table>
	<?php endif; ?>
	<input type="hidden" name="task" value=""/>
	<input type="hidden" name="boxchecked" value="0" />
	<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_associations/access.xml000060400000000651152453623440014257 0ustar00<?xml version="1.0" encoding="utf-8" ?>
<access component="com_associations">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.options" title="JACTION_OPTIONS" description="JACTION_OPTIONS_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
	</section>
</access>
components/com_associations/controllers/association.php000060400000004606152453623440017673 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_associations
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('AssociationsHelper', JPATH_ADMINISTRATOR . '/components/com_associations/helpers/associations.php');

/**
 * Association edit controller class.
 *
 * @since  3.7.0
 */
class AssociationsControllerAssociation extends JControllerForm
{
	/**
	 * 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   3.7.0
	 */
	public function edit($key = null, $urlVar = null)
	{
		list($extensionName, $typeName) = explode('.', $this->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)
	{
		$this->checkToken();

		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));
	}
}
components/com_associations/controllers/associations.php000060400000006421152453623440020053 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_associations
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('AssociationsHelper', JPATH_ADMINISTRATOR . '/components/com_associations/helpers/associations.php');

/**
 * Associations controller class.
 *
 * @since  3.7.0
 */
class AssociationsControllerAssociations extends JControllerAdmin
{
	/**
	 * The URL view list variable.
	 *
	 * @var    string
	 *
	 * @since  3.7.0
	 */
	protected $view_list = 'associations';

	/**
	 * Proxy for getModel.
	 *
	 * @param   string  $name    The model name. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  The array of possible config values. Optional.
	 *
	 * @return  JModel|boolean
	 *
	 * @since   3.7.0
	 */
	public function getModel($name = 'Associations', $prefix = 'AssociationsModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	/**
	 * Method to purge the associations table.
	 *
	 * @return  void
	 *
	 * @since   3.7.0
	 */
	public function purge()
	{
		$this->checkToken();

		$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->checkToken();

		$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 = (array) $this->input->get('cid', array(), 'int');

		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 ($id === 0)
		{
			// Seems we don't have an id to work with.
			return;
		}

		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;
	}
}
components/com_associations/config.xml000060400000000546152453623440014266 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC" >
		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			filter="rules"
			validate="rules"
			component="com_associations"
			section="component"
		/>
	</fieldset>
</config>
components/com_associations/controller.php000060400000000767152453623440015200 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_associations
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Component Controller
 *
 * @since  3.7.0
 */
class AssociationsController extends JControllerLegacy
{
	/**
	 * The default view.
	 *
	 * @var     string
	 *
	 * @since   3.7.0
	 */
	protected $default_view = 'associations';
}
components/com_associations/layouts/joomla/searchtools/default/bar.php000060400000002320152453623440022477 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_associations
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$data = $displayData;

?>
<?php if ($data['view'] instanceof AssociationsViewAssociations) : ?>
	<?php $app = JFactory::getApplication(); ?>
	<?php // We will get the component item type and language filters & remove it from the form filters. ?>
	<?php if ($app->input->get('forcedItemType', '', 'string') == '') : ?>
		<?php $itemTypeField = $data['view']->filterForm->getField('itemtype'); ?>
		<div class="js-stools-field-filter js-stools-selector">
			<?php echo $itemTypeField->input; ?>
		</div>
	<?php endif; ?>
	<?php if ($app->input->get('forcedLanguage', '', 'cmd') == '') : ?>
		<?php $languageField = $data['view']->filterForm->getField('language'); ?>
		<div class="js-stools-field-filter js-stools-selector">
			<?php echo $languageField->input; ?>
		</div>
	<?php endif; ?>
<?php endif; ?>
<?php // Display the main joomla layout ?>
<?php echo JLayoutHelper::render('joomla.searchtools.default.bar', $data, null, array('component' => 'none')); ?>
components/com_messages/messages.xml000060400000002163152453623440013735 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_messages</name>
	<author>Joomla! Project</author>
	<creationDate>April 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_MESSAGES_XML_DESCRIPTION</description>
	<languages folder="site">
		<language tag="en-GB">language/en-GB.com_messages.ini</language>
	</languages>
	<administration>
		<files folder="admin">
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<filename>messages.php</filename>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>tables</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_messages.ini</language>
			<language tag="en-GB">language/en-GB.com_messages.sys.ini</language>
		</languages>
	</administration>
</extension>
components/com_messages/messages.php000060400000001170152453623440013721 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

if (!JFactory::getUser()->authorise('core.manage', 'com_messages'))
{
	throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
}

$task       = JFactory::getApplication()->input->get('task');
$controller = JControllerLegacy::getInstance('Messages');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
components/com_messages/controller.php000060400000003115152453623440014276 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Messages master display controller.
 *
 * @since  1.6
 */
class MessagesController extends JControllerLegacy
{
	/**
	 * 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  JController		This object to support chaining.
	 *
	 * @since   1.5
	 */
	public function display($cachable = false, $urlparams = false)
	{
		JLoader::register('MessagesHelper', JPATH_ADMINISTRATOR . '/components/com_messages/helpers/messages.php');

		$view   = $this->input->get('view', 'messages');
		$layout = $this->input->get('layout', 'default');
		$id     = $this->input->getInt('id');

		// Check for edit form.
		if ($view == 'message' && $layout == 'edit' && !$this->checkEditId('com_messages.edit.message', $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_messages&view=messages', false));

			return false;
		}

		// Load the submenu.
		MessagesHelper::addSubmenu($this->input->get('view', 'messages'));
		parent::display();
	}
}
components/com_messages/controllers/message.php000060400000002434152453623440016110 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Messages Component Message Model
 *
 * @since  1.6
 */
class MessagesControllerMessage extends JControllerForm
{
	/**
	 * Method (override) to check if you can save a new or existing record.
	 *
	 * Adjusts for the primary key name and hands off to the parent class.
	 *
	 * @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 allowSave($data, $key = 'message_id')
	{
		return parent::allowSave($data, $key);
	}

	/**
	 * Reply to an existing message.
	 *
	 * This is a simple redirect to the compose form.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function reply()
	{
		if ($replyId = $this->input->getInt('reply_id'))
		{
			$this->setRedirect('index.php?option=com_messages&view=message&layout=edit&reply_id=' . $replyId);
		}
		else
		{
			$this->setMessage(JText::_('COM_MESSAGES_INVALID_REPLY_ID'));
			$this->setRedirect('index.php?option=com_messages&view=messages');
		}
	}
}
components/com_messages/controllers/messages.php000060400000001554152453623440016275 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Messages list controller class.
 *
 * @since  1.6
 */
class MessagesControllerMessages extends JControllerAdmin
{
	/**
	 * 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.6
	 */
	public function getModel($name = 'Message', $prefix = 'MessagesModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}
}
components/com_messages/controllers/config.php000060400000003741152453623440015733 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Messages Component Message Model
 *
 * @since  1.6
 */
class MessagesControllerConfig extends JControllerLegacy
{
	/**
	 * Method to save a record.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	public function save()
	{
		// Check for request forgeries.
		$this->checkToken();

		$app   = JFactory::getApplication();
		$model = $this->getModel('Config', 'MessagesModel');
		$data  = $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, $data);

		// 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(), 'warning');
				}
				else
				{
					$app->enqueueMessage($errors[$i], 'warning');
				}
			}

			// Redirect back to the main list.
			$this->setRedirect(JRoute::_('index.php?option=com_messages&view=messages', false));

			return false;
		}

		// Attempt to save the data.
		if (!$model->save($data))
		{
			// Redirect back to the main list.
			$this->setMessage(JText::sprintf('JERROR_SAVE_FAILED', $model->getError()), 'warning');
			$this->setRedirect(JRoute::_('index.php?option=com_messages&view=messages', false));

			return false;
		}

		// Redirect to the list screen.
		$this->setMessage(JText::_('COM_MESSAGES_CONFIG_SAVED'));
		$this->setRedirect(JRoute::_('index.php?option=com_messages&view=messages', false));

		return true;
	}
}
components/com_messages/helpers/html/messages.php000060400000005222152453623440016331 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * JHtml administrator messages class.
 *
 * @since  1.6
 */
class JHtmlMessages
{
	/**
	 * Get the HTML code of the state switcher
	 *
	 * @param   int      $value      The state value
	 * @param   int      $i          Row number
	 * @param   boolean  $canChange  Can the user change the state?
	 *
	 * @return  string
	 *
	 * @since   1.6
	 *
	 * @deprecated  4.0  Use JHtmlMessages::status() instead
	 */
	public static function state($value = 0, $i = 0, $canChange = false)
	{
		// Log deprecated message
		try
		{
			JLog::add(
				sprintf('%s() is deprecated. Use JHtmlMessages::status() instead.', __METHOD__),
				JLog::WARNING,
				'deprecated'
			);
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		// Note: $i is required but has to be an optional argument in the function call due to argument order
		if (null === $i)
		{
			throw new InvalidArgumentException('$i is a required argument in JHtmlMessages::state');
		}

		// Note: $canChange is required but has to be an optional argument in the function call due to argument order
		if (null === $canChange)
		{
			throw new InvalidArgumentException('$canChange is a required argument in JHtmlMessages::state');
		}

		return static::status($i, $value, $canChange);
	}

	/**
	 * Get the HTML code of the state switcher
	 *
	 * @param   int      $i          Row number
	 * @param   int      $value      The state value
	 * @param   boolean  $canChange  Can the user change the state?
	 *
	 * @return  string
	 *
	 * @since   3.4
	 */
	public static function status($i, $value = 0, $canChange = false)
	{
		// Array of image, task, title, action.
		$states = array(
			-2 => array('trash', 'messages.unpublish', 'JTRASHED', 'COM_MESSAGES_MARK_AS_UNREAD'),
			1  => array('publish', 'messages.unpublish', 'COM_MESSAGES_OPTION_READ', 'COM_MESSAGES_MARK_AS_UNREAD'),
			0  => array('unpublish', 'messages.publish', 'COM_MESSAGES_OPTION_UNREAD', 'COM_MESSAGES_MARK_AS_READ'),
		);

		$state = ArrayHelper::getValue($states, (int) $value, $states[0]);
		$icon  = $state[0];

		if ($canChange)
		{
			$html = '<a href="#" onclick="return listItemTask(\'cb' . $i . '\',\'' . $state[1] . '\')" class="btn btn-micro hasTooltip'
				. ($value == 1 ? ' active' : '') . '" title="' . JHtml::_('tooltipText', $state[3])
				. '"><span class="icon-' . $icon . '" aria-hidden="true"></span></a>';
		}

		return $html;
	}
}
components/com_messages/helpers/messages.php000060400000003554152453623440015373 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Messages helper class.
 *
 * @since  1.6
 */
class MessagesHelper
{
	/**
	 * Configure the Linkbar.
	 *
	 * @param   string  $vName  The name of the active view.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public static function addSubmenu($vName)
	{
		JHtmlSidebar::addEntry(
			JText::_('COM_MESSAGES_ADD'),
			'index.php?option=com_messages&view=message&layout=edit',
			$vName == 'message'
		);

		JHtmlSidebar::addEntry(
			JText::_('COM_MESSAGES_READ'),
			'index.php?option=com_messages',
			$vName == 'messages'
		);
	}

	/**
	 * Gets a list of the actions that can be performed.
	 *
	 * @return  JObject
	 *
	 * @deprecated  3.2  Use JHelperContent::getActions() instead
	 */
	public static function getActions()
	{
		// 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('com_messages');
	}

	/**
	 * Get a list of filter options for the state of a module.
	 *
	 * @return  array  An array of JHtmlOption elements.
	 *
	 * @since   1.6
	 */
	public static function getStateOptions()
	{
		// Build the filter options.
		$options   = array();
		$options[] = JHtml::_('select.option', '1', JText::_('COM_MESSAGES_OPTION_READ'));
		$options[] = JHtml::_('select.option', '0', JText::_('COM_MESSAGES_OPTION_UNREAD'));
		$options[] = JHtml::_('select.option', '-2', JText::_('JTRASHED'));

		return $options;
	}
}
components/com_messages/views/messages/tmpl/default.php000060400000006723152453623440017467 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$user      = JFactory::getUser();
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));

JFactory::getDocument()->addStyleDeclaration(
	'
	@media (min-width: 768px) {
		div.modal {
			left: none;
			width: 500px;
			margin-left: -250px;
		}
	}
	'
);
?>
<form action="<?php echo JRoute::_('index.php?option=com_messages&view=messages'); ?>" method="post" name="adminForm" id="adminForm">
	<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
		<?php else : ?>
		<div id="j-main-container">
	<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<div class="clearfix"></div>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped">
				<thead>
					<tr>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th class="title nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_MESSAGES_HEADING_SUBJECT', 'a.subject', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'COM_MESSAGES_HEADING_READ', 'a.state', $listDirn, $listOrder); ?>
						</th>
						<th width="15%" class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_MESSAGES_HEADING_FROM', 'a.user_id_from', $listDirn, $listOrder); ?>
						</th>
						<th width="20%" class="nowrap hidden-tablet hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JDATE', 'a.date_time', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="5">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
				<?php foreach ($this->items as $i => $item) :
					$canChange = $user->authorise('core.edit.state', 'com_messages');
					?>
					<tr class="row<?php echo $i % 2; ?>">
						<td class="center">
							<?php echo JHtml::_('grid.id', $i, $item->message_id); ?>
						</td>
						<td>
							<a href="<?php echo JRoute::_('index.php?option=com_messages&view=message&message_id=' . (int) $item->message_id); ?>">
								<?php echo $this->escape($item->subject); ?></a>
						</td>
						<td class="center">
							<?php echo JHtml::_('messages.status', $i, $item->state, $canChange); ?>
						</td>
						<td>
							<?php echo $item->user_from; ?>
						</td>
						<td class="hidden-phone hidden-tablet">
							<?php echo JHtml::_('date', $item->date_time, JText::_('DATE_FORMAT_LC2')); ?>
						</td>
					</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif; ?>
		<div>
			<input type="hidden" name="task" value="" />
			<input type="hidden" name="boxchecked" value="0" />
			<?php echo JHtml::_('form.token'); ?>
		</div>
	</div>
</form>
components/com_messages/views/messages/view.html.php000060400000005607152453623440017004 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of messages.
 *
 * @since  1.6
 */
class MessagesViewMessages extends JViewLegacy
{
	protected $items;

	protected $pagination;

	protected $state;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		$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')))
		{
			JError::raiseError(500, implode("\n", $errors));

			return false;
		}

		$this->addToolbar();

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		$state = $this->get('State');
		$canDo = JHelperContent::getActions('com_messages');
		JToolbarHelper::title(JText::_('COM_MESSAGES_MANAGER_MESSAGES'), 'envelope inbox');

		if ($canDo->get('core.create'))
		{
			JToolbarHelper::addNew('message.add');
		}

		if ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::divider();
			JToolbarHelper::publish('messages.publish', 'COM_MESSAGES_TOOLBAR_MARK_AS_READ', true);
			JToolbarHelper::unpublish('messages.unpublish', 'COM_MESSAGES_TOOLBAR_MARK_AS_UNREAD', true);
		}

		JToolbarHelper::divider();
		$bar = JToolBar::getInstance('toolbar');
		$bar->appendButton(
			'Popup',
			'cog',
			'COM_MESSAGES_TOOLBAR_MY_SETTINGS',
			'index.php?option=com_messages&amp;view=config&amp;tmpl=component',
			500,
			250,
			0,
			0,
			'',
			'',
			'<button type="button" class="btn" data-dismiss="modal">'
			. JText::_('JCANCEL')
			. '</button>'
			. '<button type="button" class="btn btn-success" data-dismiss="modal"'
			. ' onclick="jQuery(\'#modal-cog iframe\').contents().find(\'#saveBtn\').click();">'
			. JText::_('JSAVE')
			. '</button>'
		);

		if ($state->get('filter.state') == -2 && $canDo->get('core.delete'))
		{
			JToolbarHelper::divider();
			JToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'messages.delete', 'JTOOLBAR_EMPTY_TRASH');
		}
		elseif ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::divider();
			JToolbarHelper::trash('messages.trash');
		}

		if ($canDo->get('core.admin'))
		{
			JToolbarHelper::preferences('com_messages');
		}

		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_COMPONENTS_MESSAGING_INBOX');
	}
}
components/com_messages/views/message/view.html.php000060400000004055152453623440016615 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * HTML View class for the Messages component
 *
 * @since  1.6
 */
class MessagesViewMessage extends JViewLegacy
{
	protected $form;

	protected $item;

	protected $state;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		$this->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);
		}

		parent::display($tpl);
		$this->addToolbar();
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		if ($this->getLayout() == 'edit')
		{
			JFactory::getApplication()->input->set('hidemainmenu', true);
			JToolbarHelper::title(JText::_('COM_MESSAGES_WRITE_PRIVATE_MESSAGE'), 'envelope-opened new-privatemessage');
			JToolbarHelper::save('message.save', 'COM_MESSAGES_TOOLBAR_SEND');
			JToolbarHelper::cancel('message.cancel');
			JToolbarHelper::help('JHELP_COMPONENTS_MESSAGING_WRITE');
		}
		else
		{
			JToolbarHelper::title(JText::_('COM_MESSAGES_VIEW_PRIVATE_MESSAGE'), 'envelope inbox');
			$sender = JUser::getInstance($this->item->user_id_from);

			if ($sender->authorise('core.admin') || $sender->authorise('core.manage', 'com_messages') && $sender->authorise('core.login.admin'))
			{
				JToolbarHelper::custom('message.reply', 'redo', null, 'COM_MESSAGES_TOOLBAR_REPLY', false);
			}

			JToolbarHelper::cancel('message.cancel');
			JToolbarHelper::help('JHELP_COMPONENTS_MESSAGING_READ');
		}
	}
}
components/com_messages/views/message/tmpl/default.php000060400000003152152453623440017275 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.core');
JHtml::_('formbehavior.chosen', 'select');
?>
<form action="<?php echo JRoute::_('index.php?option=com_messages'); ?>" method="post" name="adminForm" id="adminForm" class="form-horizontal">
	<fieldset>
		<div class="control-group">
			<div class="control-label">
				<?php echo JText::_('COM_MESSAGES_FIELD_USER_ID_FROM_LABEL'); ?>
			</div>
			<div class="controls">
				<?php echo $this->item->get('from_user_name'); ?>
			</div>
		</div>
		<div class="control-group">
			<div class="control-label">
				<?php echo JText::_('COM_MESSAGES_FIELD_DATE_TIME_LABEL'); ?>
			</div>
			<div class="controls">
				<?php echo JHtml::_('date', $this->item->date_time, JText::_('DATE_FORMAT_LC2')); ?>
			</div>
		</div>
		<div class="control-group">
			<div class="control-label">
				<?php echo JText::_('COM_MESSAGES_FIELD_SUBJECT_LABEL'); ?>
			</div>
			<div class="controls">
				<?php echo $this->item->subject; ?>
			</div>
		</div>
		<div class="control-group">
			<div class="control-label">
				<?php echo JText::_('COM_MESSAGES_FIELD_MESSAGE_LABEL'); ?>
			</div>
			<div class="controls">
				<?php echo $this->item->message; ?>
			</div>
		</div>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="reply_id" value="<?php echo $this->item->message_id; ?>" />
		<?php echo JHtml::_('form.token'); ?>
	</fieldset>
</form>
components/com_messages/views/message/tmpl/edit.php000060400000003215152453623440016576 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');

JFactory::getDocument()->addScriptDeclaration("
		Joomla.submitbutton = function(task)
		{
			if (task == 'message.cancel' || document.formvalidator.isValid(document.getElementById('message-form')))
			{
				Joomla.submitform(task, document.getElementById('message-form'));
			}
		};
");
?>
<form action="<?php echo JRoute::_('index.php?option=com_messages'); ?>" method="post" name="adminForm" id="message-form" class="form-validate form-horizontal">
	<fieldset class="adminform">
		<div class="control-group">
			<div class="control-label">
				<?php echo $this->form->getLabel('user_id_to'); ?>
			</div>
			<div class="controls">
				<?php echo $this->form->getInput('user_id_to'); ?>
			</div>
		</div>
		<div class="control-group">
			<div class="control-label">
				<?php echo $this->form->getLabel('subject'); ?>
			</div>
			<div class="controls">
				<?php echo $this->form->getInput('subject'); ?>
			</div>
		</div>
		<div class="control-group">
			<div class="control-label">
				<?php echo $this->form->getLabel('message'); ?>
			</div>
			<div class="controls">
				<?php echo $this->form->getInput('message'); ?>
			</div>
		</div>
	</fieldset>
	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>
</form>
components/com_messages/views/config/tmpl/default.php000060400000002603152453623440017116 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');
JHtml::_('bootstrap.tooltip', '.hasTooltip', array('placement' => 'bottom'));

JFactory::getDocument()->addScriptDeclaration(
	"
		Joomla.submitbutton = function(task)
		{
			if (task == 'config.cancel' || document.formvalidator.isValid(document.getElementById('config-form')))
			{
				Joomla.submitform(task, document.getElementById('config-form'));
			}
		};
	"
);
?>
<div class="container-popup">
	<form action="<?php echo JRoute::_('index.php?option=com_messages&view=config'); ?>" method="post" name="adminForm" id="message-form" class="form-validate form-horizontal">
		<fieldset>
			<?php echo $this->form->renderField('lock'); ?>
			<?php echo $this->form->renderField('mail_on_new'); ?>
			<?php echo $this->form->renderField('auto_purge'); ?>
		</fieldset>
		<button id="saveBtn" type="button" class="hidden" onclick="Joomla.submitform('config.save', this.form);"></button>

		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</form>
</div>
components/com_messages/views/config/view.html.php000060400000002110152453623440016424 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View to edit messages user configuration.
 *
 * @since  1.6
 */
class MessagesViewConfig extends JViewLegacy
{
	protected $form;

	protected $item;

	protected $state;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		$this->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);
		}

		// Bind the record to the form.
		$this->form->bind($this->item);

		parent::display($tpl);
	}
}
components/com_messages/access.xml000060400000001162152453623440013365 0ustar00<?xml version="1.0" encoding="utf-8" ?>
<access component="com_messages">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
	</section>
</access>
components/com_messages/config.xml000060400000000546152453623440013376 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
		>

		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			filter="rules"
			validate="rules"
			component="com_messages"
			section="component" 
		/>
	</fieldset>
</config>
components/com_messages/models/fields/usermessages.php000060400000003240152453623440017351 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JFormHelper::loadFieldClass('user');

/**
 * Supports a modal select of users that have access to com_messages
 *
 * @since  1.6
 */
class JFormFieldUserMessages extends JFormFieldUser
{
	/**
	 * The form field type.
	 *
	 * @var		string
	 * @since   1.6
	 */
	public $type = 'UserMessages';

	/**
	 * Method to get the filtering groups (null means no filtering)
	 *
	 * @return  array|null	array of filtering groups or null.
	 *
	 * @since   1.6
	 */
	protected function getGroups()
	{
		// Compute usergroups
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('id')
			->from('#__usergroups');
		$db->setQuery($query);

		try
		{
			$groups = $db->loadColumn();
		}
		catch (RuntimeException $e)
		{
			JError::raiseNotice(500, $e->getMessage());

			return null;
		}

		foreach ($groups as $i => $group)
		{
			if (JAccess::checkGroup($group, 'core.admin'))
			{
				continue;
			}

			if (!JAccess::checkGroup($group, 'core.manage', 'com_messages'))
			{
				unset($groups[$i]);
				continue;
			}

			if (!JAccess::checkGroup($group, 'core.login.admin'))
			{
				unset($groups[$i]);
				continue;
			}
		}

		return array_values($groups);
	}

	/**
	 * Method to get the users to exclude from the list of users
	 *
	 * @return  array|null array of users to exclude or null to to not exclude them
	 *
	 * @since   1.6
	 */
	protected function getExcluded()
	{
		return array(JFactory::getUser()->id);
	}
}
components/com_messages/models/fields/messagestates.php000060400000001670152453623440017520 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('MessagesHelper', JPATH_ADMINISTRATOR . '/components/com_messages/helpers/messages.php');

JFormHelper::loadFieldClass('list');

/**
 * Message States field.
 *
 * @since  3.6.0
 */
class JFormFieldMessageStates extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var     string
	 * @since   3.6.0
	 */
	protected $type = 'MessageStates';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   3.6.0
	 */
	protected function getOptions()
	{
		// Merge state options with any additional options in the XML definition.
		return array_merge(parent::getOptions(), MessagesHelper::getStateOptions());
	}
}
components/com_messages/models/config.php000060400000006555152453623440014656 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Message configuration model.
 *
 * @since  1.6
 */
class MessagesModelConfig extends JModelForm
{
	/**
	 * Method to auto-populate the model state.
	 *
	 * This method should only be called once per instantiation and is designed
	 * to be called on the first call to the getState() method unless the model
	 * configuration flag to ignore the request is set.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function populateState()
	{
		$user = JFactory::getUser();

		$this->setState('user.id', $user->get('id'));

		// Load the parameters.
		$params = JComponentHelper::getParams('com_messages');
		$this->setState('params', $params);
	}

	/**
	 * Method to get a single record.
	 *
	 * @return  mixed  Object on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function &getItem()
	{
		$item = new JObject;

		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->select('cfg_name, cfg_value')
			->from('#__messages_cfg')
			->where($db->quoteName('user_id') . ' = ' . (int) $this->getState('user.id'));

		$db->setQuery($query);

		try
		{
			$rows = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			$this->setError($e->getMessage());

			return false;
		}

		foreach ($rows as $row)
		{
			$item->set($row->cfg_name, $row->cfg_value);
		}

		$this->preprocessData('com_messages.config', $item);

		return $item;
	}

	/**
	 * 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	 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_messages.config', 'config', array('control' => 'jform', 'load_data' => $loadData));

		if (empty($form))
		{
			return false;
		}

		return $form;
	}

	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function save($data)
	{
		$db = $this->getDbo();

		if ($userId = (int) $this->getState('user.id'))
		{
			$query = $db->getQuery(true)
				->delete($db->quoteName('#__messages_cfg'))
				->where($db->quoteName('user_id') . '=' . (int) $userId);
			$db->setQuery($query);

			try
			{
				$db->execute();
			}
			catch (RuntimeException $e)
			{
				$this->setError($e->getMessage());

				return false;
			}

			if (count($data))
			{
				$query = $db->getQuery(true)
					->insert($db->quoteName('#__messages_cfg'))
					->columns($db->quoteName(array('user_id', 'cfg_name', 'cfg_value')));

				foreach ($data as $k => $v)
				{
					$query->values($userId . ', ' . $db->quote($k) . ', ' . $db->quote($v));
				}

				$db->setQuery($query);

				try
				{
					$db->execute();
				}
				catch (RuntimeException $e)
				{
					$this->setError($e->getMessage());

					return false;
				}
			}

			return true;
		}
		else
		{
			$this->setError('COM_MESSAGES_ERR_INVALID_USER');

			return false;
		}
	}
}
components/com_messages/models/messages.php000060400000007403152453623440015211 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Messages Component Messages Model
 *
 * @since  1.6
 */
class MessagesModelMessages extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'message_id', 'a.id',
				'subject', 'a.subject',
				'state', 'a.state',
				'user_id_from', 'a.user_id_from',
				'user_id_to', 'a.user_id_to',
				'date_time', 'a.date_time',
				'priority', 'a.priority',
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * This method should only be called once per instantiation and is designed
	 * to be called on the first call to the getState() method unless the model
	 * configuration flag to ignore the request is set.
	 *
	 * 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.date_time', $direction = 'desc')
	{
		// Load the filter state.
		$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'));

		// 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.
	 *
	 * @since   1.6
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.state');

		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(
			$this->getState(
				'list.select',
				'a.*, ' .
					'u.name AS user_from'
			)
		);
		$query->from('#__messages AS a');

		// Join over the users for message owner.
		$query->join('INNER', '#__users AS u ON u.id = a.user_id_from')
			->where('a.user_id_to = ' . (int) $user->get('id'));

		// Filter by published state.
		$state = $this->getState('filter.state');

		if (is_numeric($state))
		{
			$query->where('a.state = ' . (int) $state);
		}
		elseif ($state !== '*')
		{
			$query->where('(a.state IN (0, 1))');
		}

		// Filter by search in subject or message.
		$search = $this->getState('filter.search');

		if (!empty($search))
		{
			$search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%'));
			$query->where('(a.subject LIKE ' . $search . ' OR a.message LIKE ' . $search . ')');
		}

		// Add the list ordering clause.
		$query->order($db->escape($this->getState('list.ordering', 'a.date_time')) . ' ' . $db->escape($this->getState('list.direction', 'DESC')));

		return $query;
	}
}
components/com_messages/models/forms/message.xml000060400000001217152453623440016162 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<field
			name="user_id_to"
			type="usermessages"
			label="COM_MESSAGES_FIELD_USER_ID_TO_LABEL"
			description="COM_MESSAGES_FIELD_USER_ID_TO_DESC"
			default="0"
			required="true" 
		/>

		<field
			name="subject"
			type="text"
			label="COM_MESSAGES_FIELD_SUBJECT_LABEL"
			description="COM_MESSAGES_FIELD_SUBJECT_DESC"
			required="true" 
		/>

		<field
			name="message"
			type="editor"
			label="COM_MESSAGES_FIELD_MESSAGE_LABEL"
			description="COM_MESSAGES_FIELD_MESSAGE_DESC"
			required="true"
			filter="JComponentHelper::filterText"
			buttons="false" 
		/>
	</fieldset>
</form>
components/com_messages/models/forms/filter_messages.xml000060400000003052152453623440017711 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_MESSAGES_FILTER_SEARCH_LABEL"
			description="COM_MESSAGES_SEARCH_IN_SUBJECT"
			hint="JSEARCH_FILTER"
		/>
		<field
			name="state"
			type="messagestates"
			label="COM_MESSAGES_FILTER_STATES_LABEL"
			description="COM_MESSAGES_FILTER_STATES_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
			<option value="*">JALL</option>
		</field>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="a.date_time DESC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.subject ASC">COM_MESSAGES_HEADING_SUBJECT_ASC</option>
			<option value="a.subject DESC">COM_MESSAGES_HEADING_SUBJECT_DESC</option>
			<option value="a.state ASC">COM_MESSAGES_HEADING_READ_ASC</option>
			<option value="a.state DESC">COM_MESSAGES_HEADING_READ_DESC</option>
			<option value="a.user_id_from ASC">COM_MESSAGES_HEADING_FROM_ASC</option>
			<option value="a.user_id_from DESC">COM_MESSAGES_HEADING_FROM_DESC</option>
			<option value="a.date_time ASC">JDATE_ASC</option>
			<option value="a.date_time DESC">JDATE_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			label="JGLOBAL_LIMIT"
			description="JGLOBAL_LIMIT"
			class="input-mini"
			default="5"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_messages/models/forms/config.xml000060400000001451152453623440016003 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<field
			name="lock"
			type="radio"
			label="COM_MESSAGES_FIELD_LOCK_LABEL"
			description="COM_MESSAGES_FIELD_LOCK_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="mail_on_new"
			type="radio"
			label="COM_MESSAGES_FIELD_MAIL_ON_NEW_LABEL"
			description="COM_MESSAGES_FIELD_MAIL_ON_NEW_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="auto_purge"
			type="number"
			label="COM_MESSAGES_FIELD_AUTO_PURGE_LABEL"
			description="COM_MESSAGES_FIELD_AUTO_PURGE_DESC" 
			size="6"
			default="7"
		/>
	</fieldset>
</form>
components/com_messages/models/message.php000060400000032103152453623440015021 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Router\Route;

/**
 * Private Message model.
 *
 * @since  1.6
 */
class MessagesModelMessage extends JModelAdmin
{
	/**
	 * Message
	 */
	protected $item;

	/**
	 * Method to auto-populate the model state.
	 *
	 * This method should only be called once per instantiation and is designed
	 * to be called on the first call to the getState() method unless the model
	 * configuration flag to ignore the request is set.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function populateState()
	{
		parent::populateState();

		$input = JFactory::getApplication()->input;

		$user  = JFactory::getUser();
		$this->setState('user.id', $user->get('id'));

		$messageId = (int) $input->getInt('message_id');
		$this->setState('message.id', $messageId);

		$replyId = (int) $input->getInt('reply_id');
		$this->setState('reply.id', $replyId);
	}

	/**
	 * Check that recipient user is the one trying to delete and then call parent delete method
	 *
	 * @param   array  &$pks  An array of record primary keys.
	 *
	 * @return  boolean  True if successful, false if an error occurs.
	 *
	 * @since  3.1
	 */
	public function delete(&$pks)
	{
		$pks   = (array) $pks;
		$table = $this->getTable();
		$user  = JFactory::getUser();

		// Iterate the items to delete each one.
		foreach ($pks as $i => $pk)
		{
			if ($table->load($pk))
			{
				if ($table->user_id_to != $user->id)
				{
					// Prune items that you can't change.
					unset($pks[$i]);

					try
					{
						JLog::add(JText::_('JLIB_APPLICATION_ERROR_DELETE_NOT_PERMITTED'), JLog::WARNING, 'jerror');
					}
					catch (RuntimeException $exception)
					{
						JFactory::getApplication()->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_DELETE_NOT_PERMITTED'), 'warning');
					}

					return false;
				}
			}
			else
			{
				$this->setError($table->getError());

				return false;
			}
		}

		return parent::delete($pks);
	}

	/**
	 * Returns a Table object, always creating it.
	 *
	 * @param   type    $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 = 'Message', $prefix = 'MessagesTable', $config = array())
	{
		return JTable::getInstance($type, $prefix, $config);
	}

	/**
	 * 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 (!isset($this->item))
		{
			if ($this->item = parent::getItem($pk))
			{
				// Invalid message_id returns 0
				if ($this->item->user_id_to === '0')
				{
					$this->setError(JText::_('JERROR_ALERTNOAUTHOR'));

					return false;
				}

				// Prime required properties.
				if (empty($this->item->message_id))
				{
					// Prepare data for a new record.
					if ($replyId = $this->getState('reply.id'))
					{
						// If replying to a message, preload some data.
						$db    = $this->getDbo();
						$query = $db->getQuery(true)
							->select($db->quoteName(array('subject', 'user_id_from', 'user_id_to')))
							->from($db->quoteName('#__messages'))
							->where($db->quoteName('message_id') . ' = ' . (int) $replyId);

						try
						{
							$message = $db->setQuery($query)->loadObject();
						}
						catch (RuntimeException $e)
						{
							$this->setError($e->getMessage());

							return false;
						}

						if (!$message || $message->user_id_to != JFactory::getUser()->id)
						{
							$this->setError(JText::_('JERROR_ALERTNOAUTHOR'));

							return false;
						}

						$this->item->set('user_id_to', $message->user_id_from);
						$re = JText::_('COM_MESSAGES_RE');

						if (stripos($message->subject, $re) !== 0)
						{
							$this->item->set('subject', $re . ' ' . $message->subject);
						}
					}
				}
				elseif ($this->item->user_id_to != JFactory::getUser()->id)
				{
					$this->setError(JText::_('JERROR_ALERTNOAUTHOR'));

					return false;
				}
				else
				{
					// Mark message read
					$db    = $this->getDbo();
					$query = $db->getQuery(true)
						->update($db->quoteName('#__messages'))
						->set($db->quoteName('state') . ' = 1')
						->where($db->quoteName('message_id') . ' = ' . $this->item->message_id);
					$db->setQuery($query)->execute();
				}
			}

			// Get the user name for an existing message.
			if ($this->item->user_id_from && $fromUser = new JUser($this->item->user_id_from))
			{
				$this->item->set('from_user_name', $fromUser->name);
			}
		}

		return $this->item;
	}

	/**
	 * 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   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_messages.message', 'message', 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_messages.edit.message.data', array());

		if (empty($data))
		{
			$data = $this->getItem();
		}

		$this->preprocessData('com_messages.message', $data);

		return $data;
	}

	/**
	 * Checks that the current user matches the message recipient and calls the parent publish method
	 *
	 * @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   3.1
	 */
	public function publish(&$pks, $value = 1)
	{
		$user  = JFactory::getUser();
		$table = $this->getTable();
		$pks   = (array) $pks;

		// Check that the recipient matches the current user
		foreach ($pks as $i => $pk)
		{
			$table->reset();

			if ($table->load($pk))
			{
				if ($table->user_id_to != $user->id)
				{
					// Prune items that you can't change.
					unset($pks[$i]);

					try
					{
						JLog::add(JText::_('JLIB_APPLICATION_ERROR_EDITSTATE_NOT_PERMITTED'), JLog::WARNING, 'jerror');
					}
					catch (RuntimeException $exception)
					{
						JFactory::getApplication()->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_EDITSTATE_NOT_PERMITTED'), 'warning');
					}

					return false;
				}
			}
		}

		return parent::publish($pks, $value);
	}

	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function save($data)
	{
		$table = $this->getTable();

		// Bind the data.
		if (!$table->bind($data))
		{
			$this->setError($table->getError());

			return false;
		}

		// Assign empty values.
		if (empty($table->user_id_from))
		{
			$table->user_id_from = JFactory::getUser()->get('id');
		}

		if ((int) $table->date_time == 0)
		{
			$table->date_time = JFactory::getDate()->toSql();
		}

		// Check the data.
		if (!$table->check())
		{
			$this->setError($table->getError());

			return false;
		}

		// Load the user details (already valid from table check).
		$toUser = \JUser::getInstance($table->user_id_to);

		// Check if recipient can access com_messages.
		if (!$toUser->authorise('core.login.admin') || !$toUser->authorise('core.manage', 'com_messages'))
		{
			$this->setError(\JText::_('COM_MESSAGES_ERROR_RECIPIENT_NOT_AUTHORISED'));

			return false;
		}

		// Load the recipient user configuration.
		$model  = JModelLegacy::getInstance('Config', 'MessagesModel', array('ignore_request' => true));
		$model->setState('user.id', $table->user_id_to);
		$config = $model->getItem();

		if (empty($config))
		{
			$this->setError($model->getError());

			return false;
		}

		if ($config->get('lock', false))
		{
			$this->setError(JText::_('COM_MESSAGES_ERR_SEND_FAILED'));

			return false;
		}

		// Store the data.
		if (!$table->store())
		{
			$this->setError($table->getError());

			return false;
		}

		if ($config->get('mail_on_new', true))
		{
			$fromUser         = JUser::getInstance($table->user_id_from);
			$debug            = JFactory::getConfig()->get('debug_lang');
			$default_language = JComponentHelper::getParams('com_languages')->get('administrator');
			$lang             = JLanguage::getInstance($toUser->getParam('admin_language', $default_language), $debug);
			$lang->load('com_messages', JPATH_ADMINISTRATOR);

			// Build the email subject and message
			$app      = JFactory::getApplication();
			$linkMode = $app->get('force_ssl', 0) >= 1 ? Route::TLS_FORCE : Route::TLS_IGNORE;
			$sitename = $app->get('sitename');
			$fromName = $fromUser->get('name');
			$siteURL  = JRoute::link('administrator', 'index.php?option=com_messages&view=message&message_id=' . $table->message_id, false, $linkMode, true);
			$subject  = html_entity_decode($table->subject, ENT_COMPAT, 'UTF-8');
			$message  = strip_tags(html_entity_decode($table->message, ENT_COMPAT, 'UTF-8'));

			$subj	  = sprintf($lang->_('COM_MESSAGES_NEW_MESSAGE'), $fromName, $sitename);
			$msg 	  = $subject . "\n\n" . $message . "\n\n" . sprintf($lang->_('COM_MESSAGES_PLEASE_LOGIN'), $siteURL);

			// Send the email
			$mailer = JFactory::getMailer();

			if (!$mailer->addReplyTo($fromUser->email, $fromUser->name))
			{
				try
				{
					JLog::add(JText::_('COM_MESSAGES_ERROR_COULD_NOT_SEND_INVALID_REPLYTO'), JLog::WARNING, 'jerror');
				}
				catch (RuntimeException $exception)
				{
					JFactory::getApplication()->enqueueMessage(JText::_('COM_MESSAGES_ERROR_COULD_NOT_SEND_INVALID_REPLYTO'), 'warning');
				}

				// The message is still saved in the database, we do not allow this failure to cause the entire save routine to fail
				return true;
			}

			if (!$mailer->addRecipient($toUser->email, $toUser->name))
			{
				try
				{
					JLog::add(JText::_('COM_MESSAGES_ERROR_COULD_NOT_SEND_INVALID_RECIPIENT'), JLog::WARNING, 'jerror');
				}
				catch (RuntimeException $exception)
				{
					JFactory::getApplication()->enqueueMessage(JText::_('COM_MESSAGES_ERROR_COULD_NOT_SEND_INVALID_RECIPIENT'), 'warning');
				}

				// The message is still saved in the database, we do not allow this failure to cause the entire save routine to fail
				return true;
			}

			$mailer->setSubject($subj);
			$mailer->setBody($msg);

			// The Send method will raise an error via JError on a failure, we do not need to check it ourselves here
			$mailer->Send();
		}

		return true;
	}

	/**
	 * Sends a message to the site's super users
	 *
	 * @param   string  $subject  The message subject
	 * @param   string  $message  The message
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function notifySuperUsers($subject, $message, $fromUser = null)
	{
		$db = $this->getDbo();

		try
		{
			/** @var JTableAsset $table */
			$table  = $this->getTable('Asset', 'JTable');
			$rootId = $table->getRootId();

			/** @var JAccessRule[] $rules */
			$rules     = JAccess::getAssetRules($rootId)->getData();
			$rawGroups = $rules['core.admin']->getData();

			if (empty($rawGroups))
			{
				$this->setError(JText::_('COM_MESSAGES_ERROR_MISSING_ROOT_ASSET_GROUPS'));

				return false;
			}

			$groups = array();

			foreach ($rawGroups as $g => $enabled)
			{
				if ($enabled)
				{
					$groups[] = $db->quote($g);
				}
			}

			if (empty($groups))
			{
				$this->setError(JText::_('COM_MESSAGES_ERROR_NO_GROUPS_SET_AS_SUPER_USER'));

				return false;
			}

			$query = $db->getQuery(true)
				->select($db->quoteName('map.user_id'))
				->from($db->quoteName('#__user_usergroup_map', 'map'))
				->join('LEFT', $db->quoteName('#__users', 'u') . ' ON ' . $db->quoteName('u.id') . ' = ' . $db->quoteName('map.user_id'))
				->where($db->quoteName('map.group_id') . ' IN(' . implode(',', $groups) . ')')
				->where($db->quoteName('u.block') . ' = 0')
				->where($db->quoteName('u.sendEmail') . ' = 1');

			$userIDs = $db->setQuery($query)->loadColumn(0);

			if (empty($userIDs))
			{
				$this->setError(JText::_('COM_MESSAGES_ERROR_NO_USERS_SET_AS_SUPER_USER'));

				return false;
			}

			foreach ($userIDs as $id)
			{
				/*
				 * All messages must have a valid from user, we have use cases where an unauthenticated user may trigger this
				 * so we will set the from user as the to user
				 */
				$data = array(
					'user_id_from' => $id,
					'user_id_to'   => $id,
					'subject'      => $subject,
					'message'      => $message,
				);

				if (!$this->save($data))
				{
					return false;
				}
			}

			return true;
		}
		catch (Exception $exception)
		{
			$this->setError($exception->getMessage());

			return false;
		}
	}
}
components/com_messages/tables/message.php000060400000006237152453623440015021 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Message Table class
 *
 * @since  1.5
 */
class MessagesTableMessage extends JTable
{
	/**
	 * Constructor
	 *
	 * @param   JDatabaseDriver  &$db  Database connector object
	 *
	 * @since   1.5
	 */
	public function __construct(&$db)
	{
		parent::__construct('#__messages', 'message_id', $db);

		$this->setColumnAlias('published', 'state');
	}

	/**
	 * Validation and filtering.
	 *
	 * @return  boolean
	 *
	 * @since   1.5
	 */
	public function check()
	{
		// Check the to and from users.
		$user = new JUser($this->user_id_from);

		if (empty($user->id))
		{
			$this->setError(JText::_('COM_MESSAGES_ERROR_INVALID_FROM_USER'));

			return false;
		}

		$user = new JUser($this->user_id_to);

		if (empty($user->id))
		{
			$this->setError(JText::_('COM_MESSAGES_ERROR_INVALID_TO_USER'));

			return false;
		}

		if (empty($this->subject))
		{
			$this->setError(JText::_('COM_MESSAGES_ERROR_INVALID_SUBJECT'));

			return false;
		}

		if (empty($this->message))
		{
			$this->setError(JText::_('COM_MESSAGES_ERROR_INVALID_MESSAGE'));

			return false;
		}

		return true;
	}

	/**
	 * 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]
	 * @param   integer  $userId  The user id of the user performing the operation.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function publish($pks = null, $state = 1, $userId = 0)
	{
		$k = $this->_tbl_key;

		// Sanitize input.
		$pks = ArrayHelper::toInteger($pks);
		$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 . ' IN (' . implode(',', $pks) . ')';

		// 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 . ')'
		);

		try
		{
			$this->_db->execute();
		}
		catch (RuntimeException $e)
		{
			$this->setError($e->getMessage());

			return false;
		}

		// 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;
	}
}
components/com_slideshowck/views/about/index.html000060400000000054152453623440016355 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_slideshowck/views/about/view.html.php000060400000001622152453623440017010 0ustar00<?php
/**
 * @name		Slideshow CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */
 
 
// No direct access
defined('_JEXEC') or die;

use \Slideshowck\CKView;
use \Slideshowck\CKFof;

class SlideshowckViewAbout extends CKView {

	function display($tpl = 'default') {

		$user = \Joomla\CMS\Factory::getUser();
		$authorised = ($user->authorise('core.edit', 'com_slideshowck') || (count($user->getAuthorisedCategories('com_slideshowck', 'core.edit'))));

		if ($authorised !== true)
		{
			throw new Exception(\Joomla\CMS\Language\Text::_('JERROR_ALERTNOAUTHOR'), 403);
			return false;
		}

		\Joomla\CMS\Toolbar\ToolbarHelper::title(\Joomla\CMS\Language\Text::_('Slideshow CK'));

		parent::display($tpl);
	}
}
components/com_slideshowck/views/about/tmpl/default.php000060400000003524152453623440017476 0ustar00<?php
/**
 * @name		Slideshow CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2015. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */

use \Slideshowck\CKFof;

defined('_JEXEC') or die;

// get the version installed
$installed_version = 'UNKOWN';
if ($xml_installed = simplexml_load_file(JPATH_SITE .'/administrator/components/com_slideshowck/slideshowck.xml')) {
	$installed_version = (string)$xml_installed->version;
}

// loads the language files from the frontend
$lang	= \Joomla\CMS\Factory::getLanguage();
$lang->load('mod_slideshowck', JPATH_SITE . '/modules/mod_slideshowck', $lang->getTag(), false);
$lang->load('mod_slideshowck', JPATH_SITE, $lang->getTag(), false);
?>
<style>
	.ckaboutversion {
		margin: 10px;
		padding: 10px;
		font-size: 20px;
		font-color: #000;
		text-align: center;
	}
	.ckcenter {
		margin: 10px 0;
		text-align: center;
	}
</style>
<div class="ckaboutversion">SLIDESHOW CK <?php echo $installed_version; ?> LIGHT</div>
<div class="ckcenter"><a href="https://www.joomlack.fr/en/joomla-extensions/slideshow-ck" target="_blank" class="btn btn-small btn-inverse"><?php echo \Joomla\CMS\Language\Text::_('Get the Pro version'); ?></a></div>
<p class="ckcenter"><a href="https://www.joomlack.fr" target="_blank">https://www.joomlack.fr</a></p>
<div class="alert ckcenter"><a href="https://extensions.joomla.org/extensions/extension/photos-a-images/slideshow/slideshow-ck" target="_blank" class="btn btn-small btn-warning"><?php echo \Joomla\CMS\Language\Text::_('SLIDESHOWCK_VOTE_JED'); ?></a></div>
<div class="ckcenter"><a href="https://www.joomlack.fr/en/documentation/48-slideshow-ck" target="_blank"><?php echo \Joomla\CMS\Language\Text::_('SLIDESHOWCK_DOCUMENTATION')  ?></a></div>
<hr />components/com_slideshowck/views/about/tmpl/index.html000060400000000054152453623440017331 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_slideshowck/views/browse/tmpl/index.html000060400000000054152453623440017520 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_slideshowck/views/browse/tmpl/default.php000060400000017442152453623440017671 0ustar00<?php
/**
 * @name		Slideshow CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2015. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */

use Slideshowck\CKFof;

defined('_JEXEC') or die;

require_once(JPATH_ROOT . '/administrator/components/com_slideshowck/helpers/defines.js.php');

$imagespath = SLIDESHOWCK_MEDIA_URI .'/images/';
\Joomla\CMS\HTML\HTMLHelper::_('jquery.framework');
$doc = \Joomla\CMS\Factory::getDocument();
$doc->addStylesheet(SLIDESHOWCK_MEDIA_URI . '/assets/ckbrowse.css?ver=' . SLIDESHOWCK_VERSION);
$doc->addScript(SLIDESHOWCK_MEDIA_URI . '/assets/ckbrowse.js?ver=' . SLIDESHOWCK_VERSION);
$input = \Joomla\CMS\Factory::getApplication()->input;

$returnFunc = $input->get('func', 'ckSelectFile', 'cmd');
$returnField = $input->get('field', '', 'string');
$type = $input->get('type', 'image', 'string');
Slideshowck\CKFramework::loadCss();

switch ($type) {
	case 'video' :
		$fileicon = 'file_video.png';
		break;
	case 'audio' :
		$fileicon = 'file_audio.png';
		break;
	case 'folder' :
	case 'image' :
	default :
		$fileicon = 'file_image.png';
		break;
}
?>
<script type="text/javascript">
	var URIROOT = "<?php echo \Joomla\CMS\Uri\Uri::root(true); ?>";
	var URIBASE = "<?php echo \Joomla\CMS\Uri\Uri::base(true); ?>";
	var SLIDESHOWCK_MEDIA_URI = '<?php echo SLIDESHOWCK_MEDIA_URI ?>';
	var SLIDESHOWCK_ADMIN_URL = '<?php echo SLIDESHOWCK_ADMIN_URL ?>';
	var SLIDESHOWCK_URL = '<?php echo SLIDESHOWCK_URL ?>';
	var CKTOKEN = '<?php echo \Joomla\CMS\Factory::getSession()->getFormToken() ?>=1';
</script>
<div id="ckbrowse" class="clearfix">
<div id="ckfolderupload">
	<div class="inner">
		<div class="upload">
			<h2 class="uploadinstructions"><?php echo \Joomla\CMS\Language\Text::_( 'CK_DROP_FILES_TO_UPLOAD' ); ?></h2>
			<p><?php echo \Joomla\CMS\Language\Text::_( 'CK_OR_SELECT_FILES' ); ?></p><input id="ckfileupload" type="file" class="" />
		</div>
	</div>
</div>
<div id="ckfoldertreelist">
<p><?php echo \Joomla\CMS\Language\Text::_('CK_BROWSE_INFOS') ?></p>
<h3><?php echo \Joomla\CMS\Language\Text::_('CK_FOLDERS') ?></h3>
<?php
$lastitem = 0;
foreach ($this->items as $i => $folder) {
	$submenustyle = '';
	$folderclass = '';
	if ($folder->level == 1) {
		$submenustyle = 'display: block;';
		$folderclass = 'ckcurrent';
	}
	$pathway = str_replace('/', '</span><span class="ckfoldertreepath">', ($folder->basepath));
	?>
	<div class="ckfoldertree <?php echo $folderclass ?> <?php echo ($folder->deeper ? 'parent' : '') ?> <?php //echo (count($folder->files) ? 'hasfiles' : '') ?>" data-level="<?php echo $folder->level ?>" data-path="<?php echo ($folder->basepath) ?>">
		<?php if ($folder->level > 1) { ?><div class="ckfoldertreetoggler" onclick="ckToggleTreeSub(this)"></div><?php } ?>
		<div class="ckfoldertreename" onclick="ckLoadFiles(this, '<?php echo $type ?>', '<?php echo ($folder->basepath) ?>')"><span class="icon-folder"></span><?php echo ($folder->name); ?>
		<?php /*<div class="ckfoldertreecount"><?php echo count($folder->files); ?></div> */ ?>
		</div>
		<div class="ckfoldertreefiles">
			<?php if ($type == 'folder') { ?>
			<div id="ckfoldertreelistfolderselection">
				<div class="ckbutton ckbutton-primary" style="font-size:20px;padding: 10px 20px;" onclick="ckSelectFolder('<?php echo ($folder->basepath) ?>')"><i class="fas fa-check-square"></i> <?php echo \Joomla\CMS\Language\Text::_('CK_SELECT_FOLDER') ?><br /><small><?php echo $pathway ?></small></div>
			</div>
			<?php } ?>
			<div class="ckfoldertreepathway ckinterface">
				<span><?php echo $pathway; ?></span>
				<?php
				if (CKFof::userCan('create', 'com_media')) {
				?>
				<span class="ckfoldertreepathwayactions">
					<span class="ckfoldertreepathwayaddfolder ckbutton" onclick="ckAddFolder()"><?php echo \Joomla\CMS\Language\Text::_('CK_ADD_SUB_FOLDER') ?></span>
					<span class="ckfoldertreepathwayfoldername"><input type="text" class="ckfoldertreepathwayaddfoldername" /></span>
					<span class="ckfoldertreepathwaycreatefolder ckbutton" onclick="ckCreateFolder(this, '<?php echo ($folder->basepath) ?>')"><?php echo \Joomla\CMS\Language\Text::_('CK_CREATE_FOLDER') ?></span>
				</span>
				<?php } ?>
			</div>
		<?php if (isset($folder->files) && ! empty($folder->files)) {
				foreach ($folder->files as $j => $file) { 
		?>
				<div class="ckfoldertreefile ckwait" data-type="<?php echo $type ?>" onclick="ckSelectFile(this)" data-path="<?php echo ($folder->basepath) ?>" data-filename="<?php echo ($file) ?>">
					<div class="ckfakeimage" data-src="<?php echo \Joomla\CMS\Uri\Uri::root(true) . '/' . ($folder->basepath) . '/' . ($file) ?>" title="<?php echo ($file); ?>" ></div>
					<div class="ckimagetitle"><?php echo ($file); ?></div>
				</div>
			<?php } ?>
		<?php } ?>
		</div>

	<?php
		if ($folder->deeper)
		{
			echo '<div class="cksubfolder" style="' . $submenustyle . '">';
		}
		elseif ($folder->shallower)
		{
			// The next item is shallower.
			echo '</div>'; // close ckfoldertree
			echo str_repeat('</div></div>', $folder->level_diff); // close cksubfolder + ckfoldertree
		} 
		else
		{
			// The next item is on the same level.
			echo '</div>'; // close ckfoldertree
		}
}

?>
</div>
<div id="ckfoldertreepreview">
	<div class="inner">
		<?php if ($type == 'image') { ?>
		<div id="ckfoldertreepreviewimage">
		</div>
		<?php } ?>
	</div>
</div>

</div>
<script>
var $ck = window.$ck || jQuery.noConflict();
var URIROOT = window.URIROOT || '<?php echo \Joomla\CMS\Uri\Uri::root(true) ?>';
var cktoken = '<?php echo \Joomla\CMS\Session\Session::getFormToken() ?>';

function ckToggleTreeSub(btn) {
	var item = $ck(btn).parent();
	if (item.hasClass('ckopened')) {
		item.removeClass('ckopened');
	} else {
		item.addClass('ckopened')
		// item.find('> .cksubfolder, > .ckfoldertreefiles').css('opacity','0').animate({'opacity': '1'}, 300);
	}
}

function ckShowFiles(btn) {
	// show the image in place of divs
	var fakeImages = $ck(btn).find('~ .ckfoldertreefiles .ckfakeimage');
	if (fakeImages.length) {
		fakeImages.each(function() {
			$fakeImage = $ck(this);
			var source = $fakeImage.parent().attr('data-type') == 'image' || $fakeImage.parent().attr('data-type') == 'folder' ? $fakeImage.attr('data-src') : '<?php echo $imagespath . $fileicon ?>';
			$fakeImage.after('<img src="' + source + '" title="' + $fakeImage.attr('title') + '" loading="lazy"/>');
			$fakeImage.parent().removeClass('ckwait');
			$fakeImage.remove();
		});
	}
	// set the current state on the folder
	var item = $ck(btn).parent();
	$ck('.ckcurrent').not(btn).removeClass('ckcurrent');
	if (item.hasClass('ckcurrent')) {
		item.removeClass('ckcurrent');
	} else {
		item.addClass('ckcurrent')
	}
}

function ckSelectFile(btn) {
	try {
		if (typeof(window.parent.<?php echo $returnFunc ?>) != 'undefined') {
			window.parent.<?php echo $returnFunc ?>($ck(btn).attr('data-path') + '/' + $ck(btn).attr('data-filename'), '<?php echo $returnField ?>');
			if (typeof(window.parent.CKBox) != 'undefined') window.parent.CKBox.close();
		} else {
			alert('ERROR : The function <?php echo $returnFunc ?> is missing in the parent window. Please contact the developer');
		}
	}
	catch(err) {
		alert('ERROR : ' + err.message + '. Please contact the developper.');
	}
}

function ckSelectFolder(path) {
	try {
		if (typeof(window.parent.<?php echo $returnFunc ?>) != 'undefined') {
			window.parent.<?php echo $returnFunc ?>(path, '<?php echo $returnField ?>');
			if (typeof(window.parent.CKBox) != 'undefined') window.parent.CKBox.close();
		} else {
			alert('ERROR : The function <?php echo $returnFunc ?> is missing in the parent window. Please contact the developer');
		}
	}
	catch(err) {
		alert('ERROR : ' + err.message + '. Please contact the developper.');
	}
}

// display the images in the root folder
ckShowFiles($ck('.ckfoldertreename').first()[0]);
</script>
components/com_slideshowck/views/browse/view.html.php000060400000002012152453623440017171 0ustar00<?php
/**
 * @name		Slideshow CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */
 
 
// No direct access
defined('_JEXEC') or die;

use \Slideshowck\CKView;
use \Slideshowck\CKFof;

class SlideshowckViewBrowse extends CKView {

	function display($tpl = 'default') {
		$input = \Joomla\CMS\Factory::getApplication()->input;

		$user = \Joomla\CMS\Factory::getUser();
		$authorised = ($user->authorise('core.edit', 'com_slideshowck') || (count($user->getAuthorisedCategories('com_slideshowck', 'core.edit'))));

		if ($authorised !== true)
		{
			throw new Exception(\Joomla\CMS\Language\Text::_('JERROR_ALERTNOAUTHOR'), 403);
			return false;
		}

		// load the items
		require_once JPATH_ADMINISTRATOR . '/components/com_slideshowck/helpers/ckbrowse.php';
		$this->items = CKBrowse::getItemsList();

		parent::display($tpl);
	}
}
components/com_slideshowck/views/browse/index.html000060400000000054152453623440016544 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_slideshowck/views/styles/tmpl/default.php000060400000016005152453623440017705 0ustar00<?php
/**
 * @name		Slider CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2016. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - http://www.template-creator.com - http://www.joomlack.fr
 */

// no direct access
defined('_JEXEC') or die;

use Slideshowck\CKFof;

// load the lightbox
SlideshowckHelper::loadCkbox();
Slideshowck\CKFramework::load();
Slideshowck\CKFramework::loadFaIconsInline();

// vars
$modal = $this->input->get('layout', '') == 'modal' ? true : false;
$user = \Joomla\CMS\Factory::getUser();
$userId = $user->get('id');

// for ordering
$listOrder = $this->state->get('filter_order', 'a.id');
$listDirn = $this->state->get('filter_order_Dir', 'ASC');
$filter_search = $this->state->get('filter_search', '');
$limitstart = $this->state->get('limitstart', 0);
$limit = $this->state->get('limit', 20);

$isModal = $this->input->get('layout', '', 'string') == 'modal';
$function = $this->input->get('returnFunc', 'ckSelectStyle', 'string');
$appendUrl = $isModal ? '&layout=modal&tmpl=component' : '';

?>
<style>
	body.contentpane {
		padding: 125px 10px;
	}
	.ordering-select {
		margin-left: auto;
	}
	joomla-toolbar-button {
		margin: 5px;
	}
<?php
// load styles for joomla 3 for frontend edition
if (version_compare(JVERSION, '4', '<')) {
?>
	#toolbar .btn {
		display: inline-block;
		*display: inline;
		*zoom: 1;
		padding: 4px 12px;
		margin-bottom: 0;
		font-size: 12px;
		line-height: 18px;
		text-align: center;
		vertical-align: middle;
		cursor: pointer;
		background: #f3f3f3;
		color: #333;
		border: 1px solid #b3b3b3;
		-webkit-border-radius: 3px;
		-moz-border-radius: 3px;
		border-radius: 3px;
		box-shadow: 0 1px 2px rgba(0,0,0,0.05);
	}
	#toolbar .btn:hover, #toolbar .btn:focus {
		background: #e6e6e6;
		text-decoration: none;
		text-shadow: none;
	}
	#toolbar .btn-wrapper {
		display: inline-block;
		margin: 0 0 8px 5px;
	}
	#toolbar .btn-small {
		padding: 2px 10px;
		font-size: 12px;
		-webkit-border-radius: 3px;
		-moz-border-radius: 3px;
		border-radius: 3px;
	}
	#toolbar .btn {
		line-height: 24px;
		margin-right: 4px;
		padding: 0 10px;
	}
	#toolbar .btn-success {
		min-width: 148px;
	}
	#toolbar .btn-success {
		border: 1px solid #378137;
		border: 1px solid rgba(0,0,0,0.2);
		color: #fff;
		background: #46a546;
	}
	#toolbar [class^="icon-"], #toolbar [class*=" icon-"] {
		display: inline-block;
		width: 14px;
		height: 14px;
		margin-right: .25em;
		line-height: 14px;
	}
	#toolbar [class^="icon-"], #toolbar [class*=" icon-"] {
		background-color: #e6e6e6;
		border-radius: 3px 0 0 3px;
		border-right: 1px solid #b3b3b3;
		height: auto;
		line-height: inherit;
		margin: 0 6px 0 -10px;
		opacity: 1;
		text-shadow: none;
		width: 28px;
		z-index: -1;
	}
	#toolbar .btn-success [class^="icon-"] {
		background-color: transparent;
		border-right: 0;
		border-left: 0;
		width: 16px;
		margin-left: 0;
		margin-right: 0;
	}
<?php
}
?>
</style>
<form action="<?php echo \Joomla\CMS\Router\Route::_('index.php?option=com_slideshowck&view=styles'.$appendUrl); ?>" method="post" name="adminForm" id="adminForm">
	<?php if ($isModal) { ?>
	<div id="ckheader">
		<div class="ckheaderlogo"><a href="https://www.joomlack.fr" target="_blank"><img title="JoomlaCK" src="https://media.joomlack.fr/images/logo_ck_white.png" width="35" height="35"></a></div>
		<div class="ckheadermenu">
			<div class="ckheadertitle">SLIDESHOW CK - <?php echo \Joomla\CMS\Language\Text::_('CK_STYLES'); ?></div>
		</div>
	</div>
	<div id="cktoolbar-fixed">
		<?php echo $this->toolbar->render(); ?>
	</div>
	<?php } ?>
	<div id="filter-bar" class="btn-toolbar input-group">
			<div class="filter-search btn-group pull-left">
			<label for="filter_search" class="element-invisible"><?php echo \Joomla\CMS\Language\Text::_('JSEARCH_FILTER_LABEL'); ?></label>
				<input type="text" name="filter_search" id="filter_search" placeholder="<?php echo \Joomla\CMS\Language\Text::_('JSEARCH_FILTER'); ?>" value="<?php echo $this->state->get('filter_search'); ?>" class="form-control" />
			</div>
			<div class="input-group-append btn-group pull-left hidden-phone">
				<button type="submit" class="btn btn btn-primary hasTooltip" title="<?php echo \Joomla\CMS\Language\Text::_('JSEARCH_FILTER_SUBMIT'); ?>"><i class="icon-search"></i></button>
				<button type="button" class="btn btn-secondary hasTooltip" title="<?php echo \Joomla\CMS\Language\Text::_('JSEARCH_FILTER_CLEAR'); ?>" onclick="this.form.filter_search.value = '';
					this.form.submit();"><i class="icon-remove"></i></button>
		</div>
			<div class="btn-group pull-right hidden-phone ordering-select">
				<label for="limit" class="element-invisible"><?php echo \Joomla\CMS\Language\Text::_('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC'); ?></label>
			&nbsp;<?php echo $this->pagination->getLimitBox(); ?>
			</div>
	</div>
	<table class="table table-striped" id="itemsList">
		<thead>
			<tr>
				<?php if (CKFof::userCan('create') || CKFof::userCan('edit')) { ?>
				<th width="1%">
					<input type="checkbox" name="checkall-toggle" title="<?php echo \Joomla\CMS\Language\Text::_('JGLOBAL_CHECK_ALL'); ?>" value="" onclick="Joomla.checkAll(this)" />
				</th>
				<?php } ?>
				<th class='left'>
					<?php echo \Joomla\CMS\HTML\HTMLHelper::_('grid.sort', 'JGLOBAL_TITLE', 'a.name', $listDirn, $listOrder); ?>
				</th>
				<th width="1%" class="nowrap">
					<?php echo \Joomla\CMS\HTML\HTMLHelper::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>
		<tbody>
			<?php
			foreach ($this->items as $i => $item) :
				$link = 'index.php?option=com_slideshowck&view=style&layout=modal&tmpl=component&id=' . $item->id;
				$name = $item->name ? $item->name : 'style' . $item->id;
				?>
				<tr class="row<?php echo $i % 2; ?>">
					<?php if (CKFof::userCan('create') || CKFof::userCan('edit')) { ?>
					<td class="center">
						<?php echo \Joomla\CMS\HTML\HTMLHelper::_('grid.id', $i, $item->id); ?>
					</td>
					<?php } ?>
					<td>
						<?php if ($modal) { ?>
						<a href="javascript:void(0)" onclick="window.parent.<?php echo $function ?>('<?php echo $item->id; ?>', '<?php echo $name; ?>')"><?php echo $name; ?></a>
						<?php /*<a href="<?php echo \Joomla\CMS\Uri\Uri::root(true) . '/administrator/' . $link ?>" class="ckbutton"><?php echo \Joomla\CMS\Language\Text::_('CK_EDIT'); ?></a>*/ ?>
						<?php } else { ?>
						<a onclick="CKBox.open({handler:'iframe', fullscreen: true, url:'<?php echo \Joomla\CMS\Uri\Uri::root(true) . '/administrator/' . $link ?>'})" href="#"><?php echo $name; ?></a>
						<?php } ?>
					</td>
					<td class="center">
					<?php echo (int) $item->id; ?>
					</td>
				</tr>
			<?php endforeach; ?>
		</tbody>
	</table>
	<?php echo $this->pagination->getListFooter() ?>
	<div>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
		<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
		<?php \Slideshowck\CKFof::renderToken() ?>
	</div>
</form>components/com_slideshowck/views/styles/tmpl/index.html000060400000000032152453623440017536 0ustar00<html><body></body></html>components/com_slideshowck/views/styles/view.html.php000060400000004074152453623440017225 0ustar00<?php
/**
 * @name		Slideshow CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */
 
// No direct access
defined('_JEXEC') or die;

use \Slideshowck\CKView;
use \Slideshowck\CKFof;

class SlideshowckViewStyles extends CKView {

	protected $items;

	protected $pagination;

	protected $state;

	protected $toolbar;

	/**
	 * Display the view
	 */
	public function display($tpl = null) {

		$user = \Joomla\CMS\Factory::getUser();
		$authorised = ($user->authorise('core.edit', 'com_slideshowck') || (count($user->getAuthorisedCategories('com_slideshowck', 'core.edit'))));

		if ($authorised !== true)
		{
			throw new Exception(\Joomla\CMS\Language\Text::_('JERROR_ALERTNOAUTHOR'), 403);
			return false;
		}

		$this->items = $this->get('Items');

		$this->toolbar = $this->getToolbar();

//		$this->input->set('tmpl', 'component');
//		$this->input->set('layout', 'modal');

		parent::display();
	}

	private function getToolbar() {
		// Get the toolbar object instance
		$bar = \Joomla\CMS\Toolbar\Toolbar::getInstance('toolbar');
		if (CKFof::userCan('create')) {
			\Joomla\CMS\Toolbar\ToolbarHelper::addNew('style.add', 'JTOOLBAR_NEW');
			\Joomla\CMS\Toolbar\ToolbarHelper::custom('style.copy', 'copy', 'copy', 'CK_COPY');
			// Render the popup button
//				$html = '<button class="btn btn-small btn-success" onclick="CKBox.open({handler:\'iframe\', fullscreen: true, url:\'' . \Joomla\CMS\Uri\Uri::root(true) . '/administrator/index.php?option=com_slideshowck&view=style&layout=modal&tmpl=component&id=0\'})">
//						<span class="icon-new icon-white"></span>
//						' . \Joomla\CMS\Language\Text::_('JTOOLBAR_NEW') . '
//						</button>';
//				$bar->appendButton('Custom', $html);
			
		}
		if (CKFof::userCan('edit')) {
			\Joomla\CMS\Toolbar\ToolbarHelper::custom('style.edit', 'edit', 'edit', 'CK_EDIT');
			\Joomla\CMS\Toolbar\ToolbarHelper::trash('style.delete');
		}

		return $bar;
	}
}
components/com_slideshowck/views/styles/index.html000060400000000032152453623440016562 0ustar00<html><body></body></html>components/com_slideshowck/views/menus/tmpl/index.html000060400000000032152453623440017342 0ustar00<html><body></body></html>components/com_slideshowck/views/menus/tmpl/default.php000060400000005341152453623440017512 0ustar00<?php
/**
 * @name		Slideshow CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */

// no direct access
defined('_JEXEC') or die;

$imagespath = SLIDESHOWCK_MEDIA_URI .'/images/';
$fieldid = $this->input->get('fieldid', '', 'string');

\Joomla\CMS\HTML\HTMLHelper::_('jquery.framework');
$doc = \Joomla\CMS\Factory::getDocument();
$doc->addStylesheet(SLIDESHOWCK_MEDIA_URI . '/assets/ckbrowse.css');
$doc->addScript(SLIDESHOWCK_MEDIA_URI . '/assets/ckbrowse.js');

?>
<h3><?php echo \Joomla\CMS\Language\Text::_('CK_MENU_ITEMS') ?></h3>
<p><?php echo \Joomla\CMS\Language\Text::_('CK_MENU_ITEMS_DESC') ?></p>
<div id="ckfoldertreelist">
<?php
foreach ($this->menus as $menu) {
	?>
	<div class="ckfoldertree parent">
		<div class="ckfoldertreetoggler" onclick="ckToggleTreeSub(this, 0)" data-menutype="<?php echo $menu->menutype; ?>"></div>
		<div class="ckfoldertreename"><img src="<?php echo $imagespath ?>folder.png" /><?php echo iconv('ISO-8859-1', 'UTF-8', $menu->title); ?></div>
	</div>
	<?php
}
?>
</div>
<script>
var $ck = window.$ck || jQuery.noConflict();
var URIROOT = window.URIROOT || '<?php echo \Joomla\CMS\Uri\Uri::root(true) ?>';
var cktoken = '<?php echo \Joomla\CMS\Session\Session::getFormToken() ?>';
//ckMakeTooltip();

function ckToggleTreeSub(btn, parentid) {
	var item = $ck(btn).parent();
	if (item.hasClass('ckopened')) {
		item.removeClass('ckopened');
	} else {
		item.addClass('ckopened');
		// load only the items if not already there
		if (! item.find('.cksubfolder').length) {
			var menutype = $ck(btn).attr('data-menutype');
			ckShowItems(btn, menutype, parentid);
		}
	}
}

function ckShowItems(btn, menutype, parentid) {
	if ($ck(btn).hasClass('empty')) return;
	ckAddWaitIcon(btn);
	var item = $ck(btn).parent();
	// ajax call to code and return items layout
	var myurl = "<?php echo \Joomla\CMS\Uri\Uri::base(true) ?>/index.php?option=com_slideshowck&task=menus.ajaxShowMenuItems&" + cktoken + "=1";
	$ck.ajax({
		type: "POST",
		url: myurl,
		data: {
			menutype: menutype,
			parentid: parentid
		}
	}).done(function(code) {
		if (code.trim().length == 0) {
			$ck(btn).css('opacity', 0).addClass('empty');
		} else {
			item.append(code);
			ckInitTooltips();
		}
		ckRemoveWaitIcon(btn);
	}).fail(function() {
		alert(CKApi.Text._('CK_FAILED', 'Failed'));
	});
}

function ckSetMenuItemUrl(url) {
	window.parent.document.getElementById('<?php echo $fieldid ?>').value = url;
	$ck(window.parent.document.getElementById('<?php echo $fieldid ?>')).trigger('change');
	window.parent.CKBox.close('#ckmenusmodal .ckboxmodal-button');
}
</script>components/com_slideshowck/views/menus/view.html.php000060400000001625152453623440017030 0ustar00<?php
/**
 * @name		Slideshow CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */
 
// No direct access
defined('_JEXEC') or die;

use \Slideshowck\CKView;
use \Slideshowck\CKFof;

class SlideshowckViewMenus extends CKView {

	protected $menus;

	/**
	 * Display the view
	 */
	public function display($tpl = 'default') {
		$user = \Joomla\CMS\Factory::getUser();
		$authorised = ($user->authorise('core.edit', 'com_slideshowck') || (count($user->getAuthorisedCategories('com_slideshowck', 'core.edit'))));

		if ($authorised !== true)
		{
			throw new Exception(\Joomla\CMS\Language\Text::_('JERROR_ALERTNOAUTHOR'), 403);
			return false;
		}

		$this->menus = $this->get('Menus');

		parent::display($tpl);
	}
}
components/com_slideshowck/views/menus/index.html000060400000000032152453623440016366 0ustar00<html><body></body></html>components/com_slideshowck/views/style/view.html.php000060400000006353152453623440017044 0ustar00<?php
/**
 * @name		Slideshow CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */
 
// No direct access
defined('_JEXEC') or die;

use \Slideshowck\CKView;
use \Slideshowck\CKFof;

class SlideshowckViewStyle extends CKView {

	function display($tpl = null) {
		$user = \Joomla\CMS\Factory::getUser();
		$authorised = ($user->authorise('core.edit', 'com_slideshowck') || (count($user->getAuthorisedCategories('com_slideshowck', 'core.edit'))));

		if ($authorised !== true)
		{
			throw new Exception(\Joomla\CMS\Language\Text::_('JERROR_ALERTNOAUTHOR'), 403);
			return false;
		}

		// dislay the page title
		\Joomla\CMS\Toolbar\ToolbarHelper::title(\Joomla\CMS\Language\Text::_('COM_SLIDESHOWCK') . ' - ' . \Joomla\CMS\Language\Text::_('CK_EDITION'), 'logo_slideshowck_large.png');

		// load the styles helper and the interface
		require_once JPATH_SITE . '/administrator/components/com_slideshowck/helpers/ckstyles.php';
		require_once(JPATH_SITE . '/administrator/components/com_slideshowck/helpers/ckinterface.php');

		$this->interface = new \Slideshowck\CKInterface();
		$this->item = $this->get('Item');

		$this->input->set('tmpl', 'component');
		$this->input->set('layout', 'modal');

		parent::display();
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @since	1.6
	 */
	protected function addToolbar() {
		SlideshowckHelper::loadCkbox();

		\Joomla\CMS\Factory::getApplication()->input->set('hidemainmenu', true);
		$user		= \Joomla\CMS\Factory::getUser();
		$userId		= $user->get('id');
		$isNew		= ($this->item->id == 0);
		$checkedOut	= !($this->item->checked_out == 0 || $this->item->checked_out == $userId);
		$state = $this->get('State');
		$canDo = SlideshowckHelper::getActions();

		// For new records, check the create permission.
		if ($isNew && $user->authorise('core.create', 'com_slideshowck'))
		{
			\Joomla\CMS\Toolbar\ToolbarHelper::apply('style.apply');
			\Joomla\CMS\Toolbar\ToolbarHelper::save('style.save');
			// \Joomla\CMS\Toolbar\ToolbarHelper::save2new('page.save2new');
			\Joomla\CMS\Toolbar\ToolbarHelper::cancel('style.cancel');
		} else
		{
			// Can't save the record if it's checked out.
			if (!$checkedOut)
			{
				// Since it's an existing record, check the edit permission, or fall back to edit own if the owner.
				if ($canDo->get('core.edit') || ($canDo->get('core.edit.own') && $this->item->created_by == $userId))
				{
					\Joomla\CMS\Toolbar\ToolbarHelper::apply('style.apply');
					\Joomla\CMS\Toolbar\ToolbarHelper::save('style.save');
//					\Joomla\CMS\Toolbar\ToolbarHelper::custom('style.restore', 'archive', 'archive', 'CK_RESTORE', false);
					// 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'))
					{
						// \Joomla\CMS\Toolbar\ToolbarHelper::save2new('page.save2new');
					}
				}
			}

			// If checked out, we can still save
			if ($canDo->get('core.create'))
			{
				// \Joomla\CMS\Toolbar\ToolbarHelper::save2copy('page.save2copy');
			}

			\Joomla\CMS\Toolbar\ToolbarHelper::cancel('style.cancel', 'JTOOLBAR_CLOSE');
		}
	}
}
components/com_slideshowck/views/style/tmpl/default_importexport.php000060400000002221152453623440022351 0ustar00<?php
/**
 * @name		Slideshow CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */
 
defined('_JEXEC') or die;
?>
<div class="" id="ckimportpopup" style="padding:10px;display:none;">
	<div class=""><h1><?php echo \Joomla\CMS\Language\Text::_('CK_IMPORT'); ?></h1></div>
		<br />
		<?php echo SlideshowckHelper::getProMessage() ?>
</div>
<div id="ckexportpopup" class="" style="position:relative;display:none;">
	<div style="padding: 10px;">
		<div class="ckexportmodalcontent">
			<div class="" id="">
				<div class=""><h1><?php echo \Joomla\CMS\Language\Text::_('CK_EXPORT'); ?></h1></div>
					<?php echo SlideshowckHelper::getProMessage() ?>
			</div>
		</div>
	</div>
</div>
<script>
	jQuery(document).ready(function() {
		jQuery("form#importpage").on('submit', function(e) { 
			e.preventDefault();
			var form = document.forms.namedItem('importpage');
			var formData = new FormData(form);
			ckUploadParamsFile(formData);
			return false;
		});
	});
</script>components/com_slideshowck/views/style/tmpl/index.html000060400000000054152453623440017357 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_slideshowck/views/style/tmpl/default.php000060400000036726152453623440017536 0ustar00<?php
/**
 * @name		Slideshow CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */

defined('_JEXEC') or die;

require_once(JPATH_ROOT . '/administrator/components/com_slideshowck/helpers/defines.js.php');

Slideshowck\CKFramework::load();
Slideshowck\CKFramework::loadFaIconsInline();
SlideshowckHelper::loadCkbox();

$imagespath = SLIDESHOWCK_MEDIA_URI .'/images/';
//\Joomla\CMS\HTML\HTMLHelper::_('jquery.framework');
$doc = \Joomla\CMS\Factory::getDocument();
$doc->addStylesheet(SLIDESHOWCK_MEDIA_URI . '/assets/admin.css');
$doc->addStylesheet(\Joomla\CMS\Uri\Uri::root(true) . '/modules/mod_slideshowck/themes/default/css/camera.css');
$doc->addScript(SLIDESHOWCK_MEDIA_URI . '/assets/jscolor/jscolor.js');
$doc->addScript(SLIDESHOWCK_MEDIA_URI . '/assets/admin.js');

$popupclass = ($this->input->get('layout', '', 'string') === 'modal') ? 'ckpopupwizard' : '';

// Load the JS strings
\Joomla\CMS\Language\Text::script('CK_DOWNLOAD');
?>
<style>
#stylescontainerleft, #stylescontainerright {
	float :left;
	width: auto;
	padding: 10px;
	box-sizing: border-box;
}

#stylescontainerleft {
	width: 810px;
}
body.contentpane {
	padding-top: 65px;
}
</style>

<?php // Rules for the styles rendering ?>
<div class="menustylescustom" data-prefix="container" data-rule="[container]"></div>
<div class="menustylescustom" data-prefix="slide" data-rule="[slide]"></div>
<div class="menustylescustom" data-prefix="navigation" data-rule="[navigation]"></div>
<div class="menustylescustom" data-prefix="pagination" data-rule="[pagination]"></div>
<div class="menustylescustom" data-prefix="paginationdotthumbs" data-rule="[paginationdotthumbs]"></div>
<div class="menustylescustom" data-prefix="caption" data-rule="[caption]"></div>
<div class="menustylescustom" data-prefix="title" data-rule="[title]"></div>
<div class="menustylescustom" data-prefix="text" data-rule="[text]"></div>
<div class="menustylescustom" data-prefix="button" data-rule="[button]"></div>
<div class="menustylescustom" data-prefix="buttonhover" data-rule="[buttonhover]"></div>


<div id="ckheader">
	<div class="ckheaderlogo"><a href="https://www.joomlack.fr" target="_blank"><img title="JoomlaCK" src="https://media.joomlack.fr/images/logo_ck_white.png" width="35" height="35"></a></div>
	<div class="ckheadermenu">
		<div class="ckheadertitle">SLIDESHOW CK</div>
		<a href="javascript:void(0);"  class="ckheadermenuitem" onclick="ckImportParams('<?php echo $this->input->get('id',0,'int'); ?>')">
			<span class="fa fas fa-file-import cktip" data-placement="bottom" title="<?php echo \Joomla\CMS\Language\Text::_('CK_IMPORT') ?>"></span>
			<span class="ckheadermenuitemtext"><?php echo \Joomla\CMS\Language\Text::_('CK_IMPORT') ?></span>
		</a>
		<a href="javascript:void(0);"  class="ckheadermenuitem" onclick="ckExportParams('<?php echo $this->input->get('id',0,'int'); ?>')">
			<span class="fa fas fa-file-export cktip" data-placement="bottom" title="<?php echo \Joomla\CMS\Language\Text::_('CK_EXPORT') ?>"></span>
			<span class="ckheadermenuitemtext"><?php echo \Joomla\CMS\Language\Text::_('CK_EXPORT') ?></span>
		</a>
		<a href="javascript:void(0);"  class="ckheadermenuitem" onclick="ckClearFields()">
			<span class="fa fas fa-broom cktip" data-placement="bottom" title="<?php echo \Joomla\CMS\Language\Text::_('CK_CLEAR_FIELDS') ?>"></span>
			<span class="ckheadermenuitemtext"><?php echo \Joomla\CMS\Language\Text::_('CK_CLEAR_FIELDS') ?></span>
		</a>
		<a href="javascript:void(0);" class="ckheadermenuitem" onclick="ckPreviewStylesparams()">
			<span class="fa fas fa-eye cktip" data-placement="bottom" title="<?php echo \Joomla\CMS\Language\Text::_('CK_PREVIEW') ?>"></span>
			<span class="ckheadermenuitemtext"><?php echo \Joomla\CMS\Language\Text::_('CK_PREVIEW') ?></span>
		</a>
		<a href="javascript:void(0)" onclick="window.parent.CKBox.close()" class="ckheadermenuitem ckcancel">
			<span class="fa fa-times cktip" data-placement="bottom" title="<?php echo \Joomla\CMS\Language\Text::_('CK_EXIT') ?>"></span>
			<span class="ckheadermenuitemtext"><?php echo \Joomla\CMS\Language\Text::_('CK_EXIT') ?></span>
		</a>
		<a href="javascript:void(0);" id="ckpopupstyleswizard_save" class="ckheadermenuitem cksave" onclick="ckSaveStylesparams(this, '<?php echo $this->input->get('id',0,'int'); ?>', '<?php echo $this->input->get('layout','','string'); ?>')">
			<span class="fa fa-check cktip" data-placement="bottom" title="<?php echo \Joomla\CMS\Language\Text::_('CK_SAVE') ?>"></span>
			<span class="ckheadermenuitemtext"><?php echo \Joomla\CMS\Language\Text::_('CK_SAVE') ?></span>
		</a>
	</div>
</div>

<div id="ckpopupstyleswizard" class="<?php echo $popupclass; ?>">
	<input type="hidden" id="id" name="id" value="<?php echo $this->item->id; ?>" />
	<input type="hidden" id="layoutcss" name="layoutcss" value="<?php echo $this->item->layoutcss; ?>" />
	<input type="hidden" id="params" name="params" value="<?php echo htmlspecialchars($this->item->params); ?>" />
	<input type="hidden" id="returnFunc" name="returnFunc" value="<?php echo htmlspecialchars($this->input->get('returnFunc', '', 'cmd')); ?>" />
	<div id="stylescontainer" style="min-width: 1300px;" class="animateck">
	<div id="stylescontainerleft" class="ckinterface">
		<label for="name" style="display: inline-block;"><?php echo \Joomla\CMS\Language\Text::_('CK_NAME'); ?></label>
		<input type="text" id="name" name="name" value="<?php echo $this->item->name; ?>" />
		<div id="styleswizard_options" class="styleswizard">
			<div class="ckinterfacetablink current" data-tab="tab_container" data-group="main"><?php echo \Joomla\CMS\Language\Text::_('CK_SLIDESHOW'); ?></div>
			<div class="ckinterfacetablink" data-tab="tab_caption" data-group="main"><?php echo \Joomla\CMS\Language\Text::_('CK_CAPTION'); ?></div>
			<div class="ckinterfacetablink" data-tab="tab_title" data-group="main"><?php echo \Joomla\CMS\Language\Text::_('CK_TITLE'); ?></div>
			<div class="ckinterfacetablink" data-tab="tab_description" data-group="main"><?php echo \Joomla\CMS\Language\Text::_('CK_DESCRIPTION'); ?></div>
			<div class="ckinterfacetablink" data-tab="tab_button" data-group="main"><?php echo \Joomla\CMS\Language\Text::_('CK_BUTTON'); ?></div>
			<div class="ckinterfacetablink" data-tab="tab_custom" data-group="main"><?php echo \Joomla\CMS\Language\Text::_('CK_CUSTOM_CSS'); ?></div>
			<div class="ckinterfacetablink" data-tab="tab_presets" data-group="main"><?php echo \Joomla\CMS\Language\Text::_('CK_PRESETS'); ?></div>
			<div class="ckclr"></div>
			<div class="ckinterfacetab current hascol" id="tab_container" data-group="main">
				<div class="ckcol_left">
					<div class="ckinterfacetablink current" data-tab="tab_mainslider" data-group="container"><?php echo \Joomla\CMS\Language\Text::_('CK_CONTAINER'); ?></div>
					<div class="ckinterfacetablink" data-tab="tab_mainnavigation" data-group="container"><?php echo \Joomla\CMS\Language\Text::_('CK_NAVIGATION'); ?></div>
					<div class="ckinterfacetablink" data-tab="tab_mainpagination" data-group="container"><?php echo \Joomla\CMS\Language\Text::_('CK_PAGINATION'); ?></div>
				</div>
				<div class="ckcol_right">
					<div class="ckinterfacetab current" id="tab_mainslider" data-group="container">
						<?php
						echo $this->interface->createMargins('container');
						echo $this->interface->createBorders('container');
						echo $this->interface->createShadow('container');
						?>
					</div>
					<div class="ckinterfacetab" id="tab_mainnavigation" data-group="container">
						<?php echo SlideshowckHelper::getProMessage() ?>
					</div>
					<div class="ckinterfacetab" id="tab_mainpagination" data-group="container">
						<?php echo SlideshowckHelper::getProMessage() ?>
					</div>
				</div>
				<div style="clear:both;"></div>
			</div>
			<div class="ckinterfacetab" id="tab_caption" data-group="main">
				<div class="ckrow">
					<label for="layoutposition"><?php echo \Joomla\CMS\Language\Text::_('CK_LAYOUT'); ?></label>
					<img class="ckicon" src="<?php echo $this->interface->imagespath ?>/layout.png" />
					<?php 
					$html = '<span class="ckinfo" style="display: inline-block;"><i class="fas fa-info"></i><a href="https://www.joomlack.fr/en/joomla-extensions/slideshow-ck" target="_blank">' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_ONLY_PRO') . '</a></span>';
					echo $html
					?>
				</div>
				<?php echo $this->interface->createAll('caption'); ?>
			</div>
			<div class="ckinterfacetab" id="tab_title" data-group="main">
				<?php echo SlideshowckHelper::getProMessage() ?>
			</div>
			<div class="ckinterfacetab" id="tab_description" data-group="main">
				<?php echo SlideshowckHelper::getProMessage() ?>
			</div>
			<div class="ckinterfacetab hascol" id="tab_button" data-group="main">
				<div class="ckcol_left">
					<div class="ckinterfacetablink current" data-tab="tab_buttonnormal" data-group="button"><?php echo \Joomla\CMS\Language\Text::_('CK_BUTTON'); ?></div>
					<div class="ckinterfacetablink" data-tab="tab_buttonhover" data-group="button"><?php echo \Joomla\CMS\Language\Text::_('CK_BUTTON_HOVER'); ?></div>
				</div>
				<div class="ckcol_right">
					<div class="ckinterfacetab current" id="tab_buttonnormal" data-group="button">
						<?php echo SlideshowckHelper::getProMessage() ?>
					</div>
					<div class="ckinterfacetab" id="tab_buttonhover" data-group="button">
						<?php echo SlideshowckHelper::getProMessage() ?>
					</div>
					<div style="clear:both;"></div>
				</div>
			</div>
			
			<div class="ckinterfacetab" id="tab_custom" data-group="main">
				<div id="customcssbuttons">
					<div class="customcssbutton ckbutton" data-prefix="container" data-rule="[container] { }"><?php echo \Joomla\CMS\Language\Text::_('CK_CONTAINER'); ?></div>
					<div class="customcssbutton ckbutton" data-prefix="caption" data-rule="[caption] { }"><?php echo \Joomla\CMS\Language\Text::_('CK_CAPTION'); ?></div>
					<div class="customcssbutton ckbutton" data-prefix="title" data-rule="[title] { }"><?php echo \Joomla\CMS\Language\Text::_('CK_TITLE'); ?></div>
					<div class="customcssbutton ckbutton" data-prefix="text" data-rule="[text] { }"><?php echo \Joomla\CMS\Language\Text::_('CK_TEXT'); ?></div>
					<div class="customcssbutton ckbutton" data-prefix="button" data-rule="[button] { }"><?php echo \Joomla\CMS\Language\Text::_('CK_BUTTON'); ?></div>
					<div class="customcssbutton ckbutton" data-prefix="buttonhover" data-rule="[buttonhover] { }"><?php echo \Joomla\CMS\Language\Text::_('CK_BUTTON_HOVER'); ?></div>
					<div class="customcssbutton ckbutton" data-prefix="paginationdotthumbs" data-rule="[paginationdotthumbs] { }"><?php echo \Joomla\CMS\Language\Text::_('CK_PAGINATION_WITH_DOTS'); ?></div>
				</div>
				<textarea id="customcss" name="customcss" style="width:450px;height:300px;"></textarea>
			</div>
			<div class="ckinterfacetab" id="tab_presets" data-group="main">
				<?php echo SlideshowckHelper::getProMessage() ?>
			</div>
		</div>
	</div>
	<div id="stylescontainerright">
		<div id="previewarea">
			<div class="ckstyle"></div>
			<div class="slideshowck camera_wrap camera_amber_skin" id="slideshowckdemo1" style="display: block; height: 250px; width:403px;margin-bottom: 61px;">
				<div class="camera_fakehover">
					<div class="camera_target">
						<div class="cameraCont">
							<div class="cameraSlide cameraSlide_0 cameracurrent" style="visibility: visible; z-index: 999;">
								<img src="<?php echo \Joomla\CMS\Uri\Uri::root(true) ?>/media/com_slideshowck/images/slides/road.jpg" class="imgLoaded" style="visibility: visible; height: auto; margin-left: 0px; margin-right: 0px; margin-top: 0px; position: absolute; width: 403px;" data-alignment="" data-portrait="" alt="On the road again" width="1280" height="800">
								<div class="camerarelative" style="width: 403px; height: 250px;"></div>
							</div>
						</div>
					</div>
					<div class="camera_overlayer"></div>
					<div class="camera_target_content">
						<div class="cameraContents">
							<div class="cameraContent cameracurrent" style="display: block;"></div>
							<div class="cameraContent" style="display: block;">
								<div class="camera_caption moveFromLeft" style="visibility: visible;">
									<div>
										<div class="camera_caption_title">On the road again</div>
										<div class="camera_caption_desc">Lorem ipsum dolor sit amet</div>
										<a class="camera-button" href="#">Read more ...</a>
									</div>
								</div>
							</div>
							<div class="cameraContent"></div>
						</div>
					</div>
					<div class="camera_pie">
						<canvas id="pie_camera_wrap_128" width="38" height="38" style="position: absolute; z-index: 1002; right: 0px; top: 0px; display: none; opacity: 0.8;"></canvas>
					</div>
					<div class="camera_commands" style="opacity: 1;">
						<div class="camera_play" tabindex="0" aria-label="Start the slideshow" style="display: block;"></div>
						<div class="camera_stop" tabindex="0" aria-label="Pause the slideshow" style="display: none;"></div>
					</div>
					<div class="camera_prev" tabindex="0" style="opacity: 1;">
						<span></span>
					</div>
					<div class="camera_next" tabindex="0" style="opacity: 1;">
						<span></span>
					</div>
				</div>
				<div class="camera_thumbs_cont" style="visibility: visible;"></div>
				<div class="camera_pag">
					<ul class="camera_pag_ul">
						<li class="pag_nav_0 cameracurrent" style="position:relative; z-index:1002" tabindex="0" aria-label="Show slide 1"><span><span>0</span></span><img src="<?php echo \Joomla\CMS\Uri\Uri::root(true) ?>/media/com_slideshowck/images/slides/road.jpg" class="camera_thumb" style="position: absolute; width:100px;height:62px;opacity: 1;display: block; top: -65px;left:-46px;"><div class="thumb_arrow" style="opacity: 1;display: block;margin-top: -3px;"></div></li>
						<li class="pag_nav_1" style="position:relative; z-index:1002" tabindex="0" aria-label="Show slide 2"><span><span>1</span></span><img src="<?php echo \Joomla\CMS\Uri\Uri::root(true) ?>/media/com_slideshowck/images/slides/th/road_th.jpg" class="camera_thumb" style="position: absolute; opacity: 0;"><div class="thumb_arrow" style="opacity: 0;"></div></li>
						<li class="pag_nav_2" style="position:relative; z-index:1002" tabindex="0" aria-label="Show slide 3"><span><span>2</span></span><img src="<?php echo \Joomla\CMS\Uri\Uri::root(true) ?>/media/com_slideshowck/images/slides2/th/sea_th.jpg" class="camera_thumb" style="position: absolute; opacity: 0;"><div class="thumb_arrow" style="opacity: 0;"></div></li>
					</ul>
				</div>
				<div class="camera_loader" style="display: none;"></div>
			</div>
		</div>
	</div>
	<div style="clear:both;"></div>
</div>
<?php require_once ('default_importexport.php'); ?>
</div>
<script type="text/javascript">
	SLIDESHOWCK.CKCSSREPLACEMENT = new Object();
	<?php foreach (SlideshowckHelper::getCssReplacement() as $tag => $rep) { ?>
	SLIDESHOWCK.CKCSSREPLACEMENT['<?php echo $tag ?>'] = '<?php echo $rep ?>';
	<?php } ?>

	jQuery(document).ready(function($){
		CKBox.initialize({});
		CKBox.assign($('a.modal'), {
			parse: 'rel'
		});
		CKApi.Tooltip('.cktip');

		// manage the tabs
		ckInitTabs();
		// launch the preview when the user do a change
		$('#styleswizard_options input,#styleswizard_options select,#styleswizard_options textarea').change(function() {
			ckPreviewStylesparams();
		});

		ckApplyStylesparams();
		ckSetFloatingOnPreview();
		ckPlayAnimationPreview();
		
		$ck('.customcssbutton').click(function() {
			$ck('#customcss').val($ck('#customcss').val() + $ck(this).attr('data-rule'));
		});
	});
</script>
components/com_slideshowck/views/style/tmpl/default_themes.php000060400000002343152453623440021067 0ustar00<?php
/**
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - http://www.template-creator.com - http://www.joomlack.fr
 */
defined('_JEXEC') or die;

use \Slideshowck\CKFolder;

//$path = '/administrator/components/com_slideshowck/presets/';
$folder_path = SLIDESHOWCK_MEDIA_PATH . '/presets/';
$presets = CKFolder::files($folder_path, '.mmck');
natsort($presets);
$i = 1;
echo '<div class="clearfix" style="min-height:35px;margin: 0 5px;">';
foreach ($presets as $preset) {
	$presetName = \Joomla\CMS\Filesystem\File::stripExt($preset);
	$theme_title = "";
	if ( file_exists($folder_path .$presetName . '.png') ) {
		$theme = SLIDESHOWCK_MEDIA_URL . '/presets/' . $presetName . '.png';
	} else {
		$theme = SLIDESHOWCK_MEDIA_URL . '/images/unknown.png" width="110" height="110';
	}

	echo '<div class="themethumb" data-name="' . $presetName . '" onclick="ckLoadPreset(\'' . $presetName . '\')">'
		. '<div class="themethumbimg">'
		. '<img src="' . $theme . '" style="margin:0;padding:0;" title="' . $theme_title . '" class="hasTip" />'
		. '</div>'
		. '<div class="themename">' . $presetName . '</div>'
		. '</div>';
	$i++;
}
echo '</div>';components/com_slideshowck/views/style/index.html000060400000000054152453623440016403 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_slideshowck/slideshowck.php000060400000003540152453623440015144 0ustar00<?php
/**
 * @name		Slideshow CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */


// no direct access
defined('_JEXEC') or die;
if (! defined('CK_LOADED')) define('CK_LOADED', 1);

// use Slideshowck\CKFof;

include_once JPATH_ADMINISTRATOR . '/components/com_slideshowck/helpers/defines.php';

// Access check.
if (!\Joomla\CMS\Factory::getUser()->authorise('core.edit', 'com_slideshowck')) {
	return JError::raiseWarning(404, \Joomla\CMS\Language\Text::_('JERROR_ALERTNOAUTHOR'));
}

// loads the language files from the frontend
$lang	= \Joomla\CMS\Factory::getLanguage();
$lang->load('com_slideshowck', JPATH_SITE . '/components/com_slideshowck', $lang->getTag(), false);
$lang->load('com_slideshowck', JPATH_SITE, $lang->getTag(), false);

// loads the helper in any case
require_once SLIDESHOWCK_PATH . '/helpers/cktext.php';
require_once SLIDESHOWCK_PATH . '/helpers/ckpath.php';
require_once SLIDESHOWCK_PATH . '/helpers/ckfile.php';
require_once SLIDESHOWCK_PATH . '/helpers/ckfolder.php';
require_once SLIDESHOWCK_PATH . '/helpers/ckuri.php';
require_once SLIDESHOWCK_PATH . '/helpers/ckfof.php';
require_once SLIDESHOWCK_PATH . '/helpers/helper.php';
require_once SLIDESHOWCK_PATH . '/helpers/ckframework.php';
require_once SLIDESHOWCK_PATH . '/helpers/ckcontroller.php';
require_once SLIDESHOWCK_PATH . '/helpers/ckmodel.php';
require_once SLIDESHOWCK_PATH . '/helpers/ckview.php';

\Slideshowck\CKFramework::load();

// Include dependancies
require_once SLIDESHOWCK_PATH . '/controller.php';

$controller	= \Slideshowck\CKController::getInstance('Slideshowck');
$controller->execute(\Joomla\CMS\Factory::getApplication()->input->get('task'));
//$controller->redirect();
components/com_slideshowck/slideshowck.xml000060400000005114152453623440015154 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.0" method="upgrade">
	<name>com_slideshowck</name>
	<ckpro>0</ckpro>
	<variant>free</variant>
	<creationDate>April 2019</creationDate>
	<copyright>Copyright (C) 2019. All rights reserved.</copyright>
	<license>GNU General Public License version 2 or later</license>
	<author>Cedric Keiflin</author>
	<authorEmail>ced1870@gmail.com</authorEmail>
	<authorUrl>https://www.joomlack.fr</authorUrl>
	<version>2.5.2</version>
	<description>SLIDESHOWCK_DESC</description>
	<install>
		<sql>
			<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
		</sql>
	</install>
	<uninstall>
		<sql>
			<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
		</sql>
	</uninstall>
	<update> 
		<schemas> 
			<schemapath type="mysql">sql/updates</schemapath> 
		</schemas> 
	</update>
	<scriptfile>install.php</scriptfile>
	<files folder="site">
		<folder>controllers</folder>
		<folder>language</folder>
		<folder>models</folder>
		<folder>views</folder>
		<filename>controller.php</filename>
		<filename>index.html</filename>
		<filename>slideshowck.php</filename>
	</files>
	<languages folder="site">
		<language tag="en-GB">language/en-GB/en-GB.com_slideshowck.ini</language>
		<language tag="en-GB">language/en-GB/en-GB.com_slideshowck.sys.ini</language>
		<language tag="fr-FR">language/fr-FR/fr-FR.com_slideshowck.ini</language>
		<language tag="fr-FR">language/fr-FR/fr-FR.com_slideshowck.sys.ini</language>
	</languages>
	<media folder="media" destination="com_slideshowck">
		<folder>assets</folder>
		<folder>images</folder>
		<folder>presets</folder>
	</media>
	<administration>
		<files folder="administrator">
			<folder>backup</folder>
			<folder>controllers</folder>
			<folder>elements</folder>
			<folder>extensions</folder>
			<folder>export</folder>
			<folder>helpers</folder>
			<folder>language</folder>
			<folder>models</folder>
			<folder>sql</folder>
			<folder>tables</folder>
			<folder>views</folder>
			<filename>access.xml</filename>
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<filename>index.html</filename>
			<filename>slideshowck.php</filename>
		</files>
		<languages folder="administrator">
			<language tag="en-GB">language/en-GB/en-GB.com_slideshowck.sys.ini</language>
			<language tag="fr-FR">language/fr-FR/fr-FR.com_slideshowck.sys.ini</language>
		</languages>
	</administration>
	<updateservers>
		<server type="extension" priority="1" name="Slideshow CK Light Update">https://update.joomlack.fr/slideshowck_light_update.xml</server>
	</updateservers>
</extension>components/com_slideshowck/access.xml000060400000000332152453623440014073 0ustar00<?xml version="1.0" encoding="utf-8"?>
<access component="com_slideshowck">
	<section name="component">
		<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
	</section>
</access>components/com_slideshowck/tables/index.html000060400000000032152453623440015354 0ustar00<html><body></body></html>components/com_slideshowck/tables/styles.php000060400000001202152453623440015413 0ustar00<?php
/**
 * @name		Slideshow CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */

// No direct access
defined('_JEXEC') or die;

class SlideshowckTableStyles extends \Joomla\CMS\Table\Table {

	/**
	 * Constructor
	 *
	 * @param \Joomla\Data\DataObjectbase A database connector object
	 */
	public function __construct(&$db) {
		$this->setColumnAlias('published', 'state');
		parent::__construct('#__slideshowck_styles', 'id', $db);
	}
}
components/com_slideshowck/config.xml000060400000000534152453623440014103 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset name="permissions"
		description="JCONFIG_PERMISSIONS_DESC"
		label="JCONFIG_PERMISSIONS_LABEL"
	>
		<field name="rules" type="rules"
			component="com_slideshowck"
			filter="rules"
			validate="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			section="component" />
	</fieldset>

</config>components/com_slideshowck/controller.php000060400000004363152453623440015014 0ustar00<?php
/**
 * @name		Slideshow CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */
 
// No direct access
defined('CK_LOADED') or die;

use \Slideshowck\CKController;
use \Slideshowck\CKFof;
use \Slideshowck\CKText;

class SlideshowckController extends CKController {

	static function getInstance($prefix = '') {
		return parent::getInstance('Slideshowck');
	}

	public function display($cachable = false, $urlparams = false) {
		$view = $this->input->get('view', 'about');
		$this->input->set('view', $view);

		parent::display();

		return $this;
	}

	public static function ajaxCreateFolder() {
		// security check
		if (! CKFof::checkAjaxToken()) {
			exit();
		}

		if (CKFof::userCan('create', 'com_media')) {
			$input = CKFof::getInput();
			$path = $input->get('path', '', 'string');
			$name = $input->get('name', '', 'string');

			require_once SLIDESHOWCK_PATH . '/helpers/ckbrowse.php';
			if ($result = CKBrowse::createFolder($path, $name)) {
				$msg = CKText::_('CK_FOLDER_CREATED_SUCCESS');
			} else {
				$msg = CKText::_('CK_FOLDER_CREATED_ERROR');
			}

			echo '{"status" : "' . ($result == false ? '0' : '1') . '", "message" : "' . $msg . '"}';
		} else {
			echo '{"status" : "2", "message" : "' . CKText::_('CK_ERROR_USER_NO_AUTH') . '"}';
		}
		exit;
	}

	/**
	 * Get the file and store it on the server
	 * 
	 * @return mixed, the method return
	 */
	public function ajaxAddPicture() {
		require_once SLIDESHOWCK_PATH . '/helpers/ckbrowse.php';
		CKBrowse::ajaxAddPicture();
	}

	/**
	 * Ajax method to clean the name of the google font
	 */
	public function cleanGfontName() {
		$input = new \Joomla\CMS\Input\Input();
		$gfont = $input->get('gfont', '', 'string');

		// <link href='http://fonts.googleapis.com/css?family=Open+Sans+Condensed:300' rel='stylesheet' type='text/css'>
		// Open+Sans+Condensed:300
		// Open Sans
		if ( preg_match( '/family=(.*?) /', $gfont . ' ', $matches) ) {
			if ( isset($matches[1]) ) {
				$gfont = $matches[1];
			}
		}

		$gfont = str_replace(' ', '+', ucwords (trim($gfont)));
		echo trim(trim($gfont, "'"));
		die;
	}
}
components/com_slideshowck/sql/install.mysql.utf8.sql000060400000000505152453623440017131 0ustar00CREATE TABLE IF NOT EXISTS `#__slideshowck_styles` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` text NOT NULL,
  `state` int(10) NOT NULL DEFAULT '1',
  `params` longtext NOT NULL,
  `layoutcss` text NOT NULL,
  `checked_out` varchar(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

components/com_slideshowck/sql/updates/2.0.2.sql000060400000000505152453623440015536 0ustar00CREATE TABLE IF NOT EXISTS `#__slideshowck_styles` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` text NOT NULL,
  `state` int(10) NOT NULL DEFAULT '1',
  `params` longtext NOT NULL,
  `layoutcss` text NOT NULL,
  `checked_out` varchar(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

components/com_slideshowck/sql/index.html000060400000000032152453623440014701 0ustar00<html><body></body></html>components/com_slideshowck/sql/uninstall.mysql.utf8.sql000060400000000001152453623440017463 0ustar00
components/com_slideshowck/helpers/index.html000060400000000054152453623440015550 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_slideshowck/helpers/helper.php000060400000045476152453623440015564 0ustar00<?php
/**
 * @name		Slideshow CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */

// No direct access
defined('_JEXEC') or die;

require_once JPATH_ADMINISTRATOR . '/components/com_slideshowck/helpers/defines.php';

use Slideshowck\CKInput;
use Slideshowck\CKFof;
use Slideshowck\CKText;

/**
 * Helper Class.
 */
class SlideshowckHelper {

	static $cssreplacements;

	/*
	 * Load the JS and CSS files needed to use CKBox
	 *
	 * Return void
	 */
	public static function loadCkbox() {
		$doc = \Joomla\CMS\Factory::getDocument();
		\Joomla\CMS\HTML\HTMLHelper::_('jquery.framework', true);
//		$doc->addScript(\Joomla\CMS\Uri\Uri::root(true) . '/media/jui/js/jquery.min.js');
		$doc->addStyleSheet(SLIDESHOWCK_MEDIA_URI . '/assets/ckbox.css');
		$doc->addScript(SLIDESHOWCK_MEDIA_URI . '/assets/ckbox.js');
	}

	/*
	 * Load the JS and CSS files needed to use CKBox
	 *
	 * Return void
	 */
//	public static function loadCKFramework() {
//		$doc = \Joomla\CMS\Factory::getDocument();
//		$doc->addScript(\Joomla\CMS\Uri\Uri::root(true) . '/media/jui/js/jquery.min.js');
//		$doc->addStyleSheet(SLIDESHOWCK_MEDIA_URI . '/assets/ckframework.css');
//	}

	/*
	 * Load the JS and CSS files needed to use CKBox
	 *
	 * Return void
	 */
	/*public static function loadInlineCKFramework() {
	?>
		<script src="<?php echo \Joomla\CMS\Uri\Uri::root(true) ?>/media/jui/js/jquery.min.js" type="text/javascript"></script>
		<link rel="stylesheet" href="<?php echo \Joomla\CMS\Uri\Uri::root(true) ?>/components/com_slideshowck/assets/font-awesome.min.css" type="text/css" />
		<link rel="stylesheet" href="<?php echo SLIDESHOWCK_MEDIA_URI ?>/assets/ckframework.css" type="text/css" />
	<?php
	}*/
	
	/**
	 * Convert a hexa decimal color code to its RGB equivalent
	 *
	 * @param string $hexStr (hexadecimal color value)
	 * @param boolean $returnAsString (if set true, returns the value separated by the separator character. Otherwise returns associative array)
	 * @param string $seperator (to separate RGB values. Applicable only if second parameter is true.)
	 * @return array or string (depending on second parameter. Returns False if invalid hex color value)
	 */
	static function hex2RGB($hexStr, $opacity) {
		$hexStr = preg_replace("/[^0-9A-Fa-f]/", '', $hexStr); // Gets a proper hex string
		$rgbArray = array();
		if (strlen($hexStr) == 6) { //If a proper hex code, convert using bitwise operation. No overhead... faster
			$colorVal = hexdec($hexStr);
			$rgbArray['red'] = 0xFF & ($colorVal >> 0x10);
			$rgbArray['green'] = 0xFF & ($colorVal >> 0x8);
			$rgbArray['blue'] = 0xFF & $colorVal;
		} elseif (strlen($hexStr) == 3) { //if shorthand notation, need some string manipulations
			$rgbArray['red'] = hexdec(str_repeat(substr($hexStr, 0, 1), 2));
			$rgbArray['green'] = hexdec(str_repeat(substr($hexStr, 1, 1), 2));
			$rgbArray['blue'] = hexdec(str_repeat(substr($hexStr, 2, 1), 2));
		} else {
			return false; //Invalid hex color code
		}
		$rgbacolor = "rgba(" . $rgbArray['red'] . "," . $rgbArray['green'] . "," . $rgbArray['blue'] . "," . ($opacity / 100) . ")";

		return $rgbacolor;
	}

	/**
	 * Test if there is already a unit, else add the px
	 *
	 * @param string $value
	 * @return string
	 */
	public static function testUnit($value) {
		if ((stristr($value, 'px')) OR (stristr($value, 'em')) OR (stristr($value, '%'))) {
			return $value;
		}

		if ($value == '') {
			$value = 0;
		}

		return $value . 'px';
	}

	/**
	 * Remove special character
	 */
	public static function cleanName($path) {
		return preg_replace('/[^a-z0-9]/i', '_', $path);
	}

	public static function formatPath($p) {
		return trim(str_replace("\\", "/", $p), "/");
	}

	/**
	 * Get a subtring with the max length setting.
	 *
	 * @param string $text;
	 * @param int $length limit characters showing;
	 * @param string $replacer;
	 * @return tring;
	 */
	public static function substring($text, $length = 100, $replacer = '...', $isStrips = true, $stringtags = '') {
	
		if($isStrips){
			$text = preg_replace('/\<p.*\>/Us','',$text);
			$text = str_replace('</p>','<br/>',$text);
			$text = strip_tags($text, $stringtags);
		}
		
		if(function_exists('mb_strlen')){
			if (mb_strlen($text) < $length)	return $text;
			$text = mb_substr($text, 0, $length);
		}else{
			if (strlen($text) < $length)	return $text;
			$text = substr($text, 0, $length);
		}
		
		return $text . $replacer;
	}

	/*
	* update the table
	*/
	/*public static function createTableOptions() {
		$sqlsrc = SLIDESHOWCK_PATH . '/sql/updates/2.4.0.sql';
		$query = file_get_contents($sqlsrc);
		$db = \Joomla\CMS\Factory::getDbo();
		$db->setQuery($query);
		if (!$db->execute()) {
			echo '<p class="alert alert-danger">Error during table options creation</p>';
		} else {
			echo '<p class="alert alert-success">Table options successfully created</p>';
		}
	}*/

	/**
	 * Get the name of the style
	 */
	public static function getStyleNameById($id) {
		if (! $id) return '';
		// Create a new query object.
		$db = \Joomla\CMS\Factory::getDbo();
		$query = $db->getQuery(true);

		// Select the required fields from the table.
		$query->select('a.name');
		$query->from($db->quoteName('#__slideshowck_styles') . ' AS a');
		$query->where('(a.state IN (0, 1))');
		$query->where('a.id = ' . (int)$id);

		// Reset the query using our newly populated query object.
		$db->setQuery($query);

		// Load the results as a list of stdClass objects (see later for more options on retrieving data).
		$results = $db->loadResult();

		return $results;
	}

	/**
	 * Create the list of all modules published as Object
	 *
	 * $file string the image path
	 * $x integer the new image width
	 * $y integer the new image height
	 *
	 * @return Boolean True on Success
	 */
	static function resizeImage($file, $x, $y = '', $thumbpath = 'th', $thumbsuffix = '_th') {

		if (!$file)
			return;

		$thumbext = explode(".", $file);
		$thumbext = end($thumbext);
		$thumbfile = str_replace(basename($file), $thumbpath . "/" . basename($file), $file);
		$thumbfile = str_replace("." . $thumbext, $thumbsuffix . "." . $thumbext, $thumbfile);
		
		$filetmp = JPATH_ROOT . '/' . $file;
		$filetmp = str_replace("%20", " ", $filetmp);
		if (! file_exists($filetmp))
			return $file;
		$size = getimagesize($filetmp);

		if ($size[0] > $size[1] || !$y) // paysage
		{
			$y = $x * $size[1] / $size[0];
		} else 
		{
			$x = $y * $size[0] / $size[1];
		}

		
		if ($size) {
			if (\Joomla\CMS\Filesystem\File::exists($thumbfile)) {
				return $thumbfile;
			}
			
			$thumbfolder = str_replace(basename($file), $thumbpath . "/", $filetmp);
			if (!\Joomla\CMS\Filesystem\Folder::exists($thumbfolder)) { 
				\Joomla\CMS\Filesystem\Folder::create($thumbfolder);
				\Joomla\CMS\Filesystem\File::copy(JPATH_ROOT . '/modules/mod_slideshowck/index.html', $thumbfolder . 'index.html' );
			}

			if ($size['mime'] == 'image/jpeg') {
				$img_big = imagecreatefromjpeg($filetmp); # On ouvre l'image d'origine
				$img_new = imagecreate($x, $y);
				# création de la miniature
				$img_mini = imagecreatetruecolor($x, $y) or $img_mini = imagecreate($x, $y);
				// copie de l'image, avec le redimensionnement.
				imagecopyresized($img_mini, $img_big, 0, 0, 0, 0, $x, $y, $size[0], $size[1]);

				imagejpeg($img_mini, JPATH_ROOT . '/' . $thumbfile);
			} elseif ($size['mime'] == 'image/png') {
				$img_big = imagecreatefrompng($filetmp); # On ouvre l'image d'origine
				$img_new = imagecreate($x, $y);
				# création de la miniature
				$img_mini = imagecreatetruecolor($x, $y) or $img_mini = imagecreate($x, $y);
				// copie de l'image, avec le redimensionnement.
				imagecopyresized($img_mini, $img_big, 0, 0, 0, 0, $x, $y, $size[0], $size[1]);

				imagepng($img_mini, JPATH_ROOT . '/' . $thumbfile);
			} elseif ($size['mime'] == 'image/gif') {
				$img_big = imagecreatefromgif($filetmp); # On ouvre l'image d'origine
				$img_new = imagecreate($x, $y);
				# création de la miniature
				$img_mini = imagecreatetruecolor($x, $y) or $img_mini = imagecreate($x, $y);
				// copie de l'image, avec le redimensionnement.
				imagecopyresized($img_mini, $img_big, 0, 0, 0, 0, $x, $y, $size[0], $size[1]);

				imagegif($img_mini, JPATH_ROOT . '/' . $thumbfile);
			}
			//echo 'Image redimensionnée !';
		}

		return $thumbfile;
	}

	/*
	 * Make empty slide object
	 */
	public static function initItem() {
		$item = new stdClass();
		$item->image = null;
		$item->link = null;
		$item->title = null;
		$item->text = null;
		$item->more = array();
		$item->alignment = null;
		$item->time = null;
		$item->target = 'default';
		$item->video = null;
		$item->texttype = null;
		$item->articleid = null;

		return $item;
	}

	/*
	 * Convert an old item to the new convention
	 */
	public static function legacyUpdateItem(&$item) {
		$newItem = self::initItem();
		foreach ($newItem as $key => $value) {
			if (!isset($item->$key)) $item->$key = $value;
		}
		$item->image = $item->imgname;
		$item->link = $item->imglink;
		$item->time = $item->imgtime;
		$item->thumb = $item->imgthumb;
		$item->title = $item->imgtitle;
		$item->text = strip_tags($item->imgcaption);
	}

	/*
	 * Convert an item to the old convention to render in a V1 layout
	 * To call manually in the layout file
	 */
	public static function legacyItemForV1Layout(&$item) {
		$newItem = self::initItem();
		foreach ($newItem as $key => $value) {
			if (!isset($item->$key)) $item->$key = $value;
		}
		$item->imgname = $item->image;
		$item->imglink = $item->link;
		$item->imgtime = $item->time;
		$item->imgthumb = $item->imgname;
//		$item->imgthumb = $item->thumb;
		$item->imgtitle = $item->title;
		$item->imgcaption = $item->text;

		$item->imgalignment = $item->alignment;
		$item->imgtime = $item->time;
		$item->imgtarget = $item->target;
		$item->imgvideo = $item->video;
		$item->article = null;
	}

	/**
	 * Set the correct video link
	 *
	 * $videolink string the video path
	 *
	 * @return string the new video path
	 */
	static function setVideolink($videolink) {
		// youtube
		if (stristr($videolink, 'youtu.be')) {
			$videolink = str_replace('youtu.be', 'www.youtube.com/embed', $videolink);
		} else if (stristr($videolink, 'www.youtube.com') AND !stristr($videolink, 'embed')) {
			$videolink = str_replace('youtube.com', 'youtube.com/embed', $videolink);
		}

		if (strpos($videolink, 'http') !== false) $videolink .= ( stristr($videolink, '?')) ? '&wmode=transparent' : '?wmode=transparent';

		return $videolink;
	}

	/**
	 * Set the correct video link
	 *
	 * $videolink string the video path
	 *
	 * @return string the new video path
	 */
	static function setImageUrl($url) {
		if (strpos($url, 'http') !== 0) {
			$url = \Joomla\CMS\Uri\Uri::root(true) . '/' . trim($url, '/');
		}

		return $url;
	}

	/**
	 * Truncates text blocks over the specified character limit and closes
	 * all open HTML tags. The method will optionally not truncate an individual
	 * word, it will find the first space that is within the limit and
	 * truncate at that point. This method is UTF-8 safe.
	 *
	 * @param   string   $text       The text to truncate.
	 * @param   integer  $length     The maximum length of the text.
	 * @param   boolean  $noSplit    Don't split a word if that is where the cutoff occurs (default: true).
	 * @param   boolean  $allowHtml  Allow HTML tags in the output, and close any open tags (default: true).
	 *
	 * @return  string   The truncated text.
	 *
	 * @since   11.1
	 */
	public static function truncate($text, $length = 0, $noSplit = true, $allowHtml = true) {
		if ($length == 0) return '';
		// Check if HTML tags are allowed.
		if (!$allowHtml) {
			// Deal with spacing issues in the input.
			$text = str_replace('>', '> ', $text);
			$text = str_replace(array('&nbsp;', '&#160;'), ' ', $text);
			$text = JString::trim(preg_replace('#\s+#mui', ' ', $text));

			// Strip the tags from the input and decode entities.
			$text = strip_tags($text);
			$text = html_entity_decode($text, ENT_QUOTES, 'UTF-8');

			// Remove remaining extra spaces.
			$text = str_replace('&nbsp;', ' ', $text);
			$text = JString::trim(preg_replace('#\s+#mui', ' ', $text));
		}

		// Truncate the item text if it is too long.
		if ($length > 0 && JString::strlen($text) > $length) {
			// Find the first space within the allowed length.
			$tmp = JString::substr($text, 0, $length);

			if ($noSplit) {
				$offset = JString::strrpos($tmp, ' ');
				if (JString::strrpos($tmp, '<') > JString::strrpos($tmp, '>')) {
					$offset = JString::strrpos($tmp, '<');
				}
				$tmp = JString::substr($tmp, 0, $offset);

				// If we don't have 3 characters of room, go to the second space within the limit.
				if (JString::strlen($tmp) > $length - 3) {
					$tmp = JString::substr($tmp, 0, JString::strrpos($tmp, ' '));
				}
			}

			if ($allowHtml) {
				// Put all opened tags into an array
				preg_match_all("#<([a-z][a-z0-9]*)\b.*?(?!/)>#i", $tmp, $result);
				$openedTags = $result[1];
				$openedTags = array_diff($openedTags, array("img", "hr", "br"));
				$openedTags = array_values($openedTags);

				// Put all closed tags into an array
				preg_match_all("#</([a-z]+)>#iU", $tmp, $result);
				$closedTags = $result[1];

				$numOpened = count($openedTags);

				// All tags are closed
				if (count($closedTags) == $numOpened) {
					return $tmp . '...';
				}
				$tmp .= '...';
				$openedTags = array_reverse($openedTags);

				// Close tags
				for ($i = 0; $i < $numOpened; $i++) {
					if (!in_array($openedTags[$i], $closedTags)) {
						$tmp .= "</" . $openedTags[$i] . ">";
					} else {
						unset($closedTags[array_search($openedTags[$i], $closedTags)]);
					}
				}
			}

			$text = $tmp;
		}

		return $text;
	}

	static function getArticle($item) {
		$app = \Joomla\CMS\Factory::getApplication();
		if (version_compare(JVERSION, '4') >= 0) {
			$factory = $app->bootComponent('com_content')->getMVCFactory();

			// Get an instance of the generic articles model
			$articles = $factory->createModel('Articles', 'Site', ['ignore_request' => true]);
		} else {
			// load the content articles file
			$com_path = JPATH_SITE . '/components/com_content/';
			include_once $com_path . 'router.php';
			include_once $com_path . 'helpers/route.php';
			\Joomla\CMS\MVC\Model\BaseDatabaseModel::addIncludePath($com_path . '/models', 'ContentModel');

			// Get an instance of the generic articles model
			$articles = \Joomla\CMS\MVC\Model\BaseDatabaseModel::getInstance('Articles', 'ContentModel', array('ignore_request' => true));
		}
		// Access filter
		$access = !\Joomla\CMS\Component\ComponentHelper::getParams('com_content')->get('show_noauth');
		$authorised = \Joomla\CMS\Access\Access::getAuthorisedViewLevels(\Joomla\CMS\Factory::getUser()->get('id'));
		// Get an instance of the generic articles model
		$articles = \Joomla\CMS\MVC\Model\BaseDatabaseModel::getInstance('Articles', 'ContentModel', array('ignore_request' => true));
		// Set application parameters in model
		$app = \Joomla\CMS\Factory::getApplication();
//		$appParams = $app->getParams();
		$articles->setState('params', \Joomla\CMS\Component\ComponentHelper::getParams('com_content'));
//		$articles->setState('params', $appParams);
		$articles->setState('filter.published', 1);
//		$item->slidearticleid = isset($item->slidearticleid) ? $item->slidearticleid : $item->articleid;
		$articles->setState('filter.article_id', $item->slidearticleid);
		$items2 = $articles->getItems();
		$item->article = $items2[0];
		$item->text = $item->article->introtext;
		// $item->text = \Joomla\CMS\HTML\HTMLHelper::_('content.prepare', $item->text);
		$item->title = $item->article->title;
		// set the item link to the article depending on the user rights
		if ($access || in_array($item->article->access, $authorised)) {
			// We know that user has the privilege to view the article
			$item->slug = $item->article->id . ':' . $item->article->alias;
			$item->catslug = $item->article->catid ? $item->article->catid . ':' . $item->article->category_alias : $item->article->catid;
			if (version_compare(JVERSION, '4') >= 0) {
				$item->link = \Joomla\CMS\Router\Route::_(\Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($item->slug, $item->catslug));
			} else {
				$item->link = \Joomla\CMS\Router\Route::_(ContentHelperRoute::getArticleRoute($item->slug, $item->catslug));
			}
		} else {
			$app = \Joomla\CMS\Factory::getApplication();
			$menu = $app->getMenu();
			$menuitems = $menu->getItems('link', 'index.php?option=com_users&view=login');
			if (isset($menuitems[0])) {
				$Itemid = $menuitems[0]->id;
			} elseif ($app->input->get('Itemid', 0, 'int') > 0) {
				$Itemid = $app->input->get('Itemid', 0, 'int');
			}
			$item->link = \Joomla\CMS\Router\Route::_('index.php?option=com_users&view=login&Itemid=' . $Itemid);
		}
		return $item;
	}

	/**
	 * List the replacement between the tags and the real final CSS rules
	 */
	public static function getCssReplacement() {
		if (! empty(self::$cssreplacements)) return self::$cssreplacements;

		self::$cssreplacements = Array(
			'[container]' => ''
			,'[slide]' => '.cameraSlide img'
			,'[caption]' => '.camera_caption > div'
			,'[title]' => '.camera_caption_title'
			,'[text]' => '.camera_caption_desc'
			,'[button]' => 'a.camera-button'
			,'[buttonhover]' => 'a.camera-button:hover'
//			,'[thumbs]' => '.camera_pag_ul li img'
			,'[paginationdotthumbs]' => '.camera_pag_ul li img'
		);

		return self::$cssreplacements;
	}

	/**
	 * Get the CSS of the style
	 * @id - the style ID
	 */
	public static function getStyleLayoutcss($id) {
		if (! $id) return '';

		// Create a new query object.
		$db = \Joomla\CMS\Factory::getDbo();
		$query = $db->getQuery(true);

		// Select the required fields from the table.
		$query->select('a.layoutcss');
		$query->from($db->quoteName('#__slideshowck_styles') . ' AS a');
		$query->where('(a.state IN (0, 1))');
		$query->where('a.id = ' . (int)$id);

		// Reset the query using our newly populated query object.
		$db->setQuery($query);

		// Load the results as a list of stdClass objects (see later for more options on retrieving data).
		$result = $db->loadResult();

		self::makeCssReplacement($result);

		return $result;
	}

	public static function makeCssReplacement(&$css) {
		$cssreplacements = self::getCssReplacement();
		foreach ($cssreplacements as $tag => $rep) {
			$css = str_replace($tag, $rep, $css);
		}
//		return $css;
	}

	public static function getProMessage() {
		$html = '<div class="ckinfo"><i class="fas fa-info"></i><a href="https://www.joomlack.fr/en/joomla-extensions/slideshow-ck" target="_blank">' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_ONLY_PRO') . '</a></div>';
	
		return $html;
	}

	public static function getProPreview($imgName) {
		$html = '<div class="ckpropreview">'
					. '<img src="' . SLIDESHOWCK_MEDIA_URL . '/images/proonly/' . $imgName . '" />'
					. '<a href="https://www.joomlack.fr/en/joomla-extensions/slideshow-ck" target="_blank">' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_ONLY_PRO') . '</a>'
				. '</div>';
	
		return $html;
	}
}
components/com_slideshowck/helpers/source/slidesmanager.php000060400000010053152453623440020402 0ustar00<?php
/**
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */

use Joomla\CMS\Factory;
use Joomla\CMS\Date\Date;

// No direct access
defined('_JEXEC') or die;

require_once JPATH_ADMINISTRATOR . '/components/com_slideshowck/helpers/helper.php';

/**
 * Helper Class.
 */
class SlideshowckHelpersourceSlidesmanager {

	private static $params;

	/*
	 * Get the items from the source
	 */
	public static function getItems($params, $folder = null) {
		if (empty(self::$params)) {
			self:$params = $params;
		}

		// load the items from the module settings
		$items = json_decode(str_replace("|qq|", "\"", $params->get('slides')));
		foreach ($items as $i => $item) {
			if (!$item->imgname) {
				unset($items[$i]);
				continue;
			}

			// check if the slide is published
			if (isset($item->state) && $item->state == '0') {
				unset($items[$i]);
				continue;
			}

			// get current date with Timezone
			$config = \Joomla\CMS\Factory::getConfig();
			$offset = $config->get('offset'); // timezone
			$now = new \Joomla\CMS\Date\Date('now', $offset);

			// check the slide start date
			if (isset($item->startdate) && $item->startdate) {
				// if (date("d M Y") < $item->startdate) {
				if (strtotime($now) < strtotime($item->startdate)) {
					unset($items[$i]);
					continue;
				}
			}

			// check the slide end date
			if (isset($item->enddate) && $item->enddate) {
				// if (date("d M Y") > $item->enddate) {
				if (strtotime($now) > strtotime($item->enddate)) {
					unset($items[$i]);
					continue;
				}
			}

			if (stristr($item->imgname, "http")) {
				$item->imgthumb = $item->imgname;
			} else {
				// renomme le fichier
				$thumbext = explode(".", $item->imgname);
				$thumbext = end($thumbext);
				// crée la miniature
				if ($params->get('thumbnails', '1') == '1' && $params->get('autocreatethumbs','1')) {
					if ($params->get('autocreatethumbs','1'))
						$item->imgthumb = \Joomla\CMS\Uri\Uri::base(true) . '/' . SlideshowckHelper::resizeImage($item->imgname, $params->get('thumbnailwidth', '182'), $params->get('thumbnailheight', '187'));
				} else {
					$thumbfile = str_replace(basename($item->imgname), "th/" . basename($item->imgname), $item->imgname);
					$thumbfile = str_replace("." . $thumbext, "_th." . $thumbext, $thumbfile);
					$item->imgthumb = \Joomla\CMS\Uri\Uri::base(true) . '/' . $thumbfile;
				}
				$item->imgname = \Joomla\CMS\Uri\Uri::base(true) . '/' . $item->imgname;
			}

			// set the videolink
			if ($item->imgvideo)
				$item->imgvideo = SlideshowckHelper::setVideolink($item->imgvideo);

			// for B/C
			if (! isset($item->texttype)) {
				$item->texttype = (isset($item->slidearticleid) && $item->slidearticleid) ? 'article' : 'custom';
			}
			if ($item->texttype == 'article') {
				if (isset($item->slidearticleid) && $item->slidearticleid) {
					$item = SlideshowckHelper::getArticle($item);
				} else {
					$item->link = '';
					$item->title = '';
					$item->text = '';
				}
			} else {
				// manage the title and description - LEGACY
				if (stristr($item->imgcaption, "||")) {
					$splitcaption = explode("||", $item->imgcaption);
					$item->imgtitle = $splitcaption[0];
					$item->imgcaption = $splitcaption[1];
				}

				// route the url
				if (strcasecmp(substr($item->imglink, 0, 4), 'http') && (strpos($item->imglink, 'index.php?') !== false)) {
					$item->imglink = \Joomla\CMS\Router\Route::_($item->imglink, true, false);
				} else {
					$item->imglink = \Joomla\CMS\Router\Route::_($item->imglink);
				}

				if (! isset($item->imgtitle)) $item->imgtitle = '';

				// convert legacy to new standard
				$item->link = $item->imglink;
				$item->title = $item->imgtitle;
				$item->text = $item->imgcaption;
			}
			// convert legacy to new standard
			$item->image = $item->imgname;
			$item->time = $item->imgtime;
			$item->target = $item->imgtarget;
			$item->alignment = $item->imgalignment;
			$item->video = $item->imgvideo;
		}

		return $items;
	}
}
components/com_slideshowck/helpers/ckfile.php000060400000000224152453623440015520 0ustar00<?php
namespace Slideshowck;

defined('_JEXEC') or die;

jimport('joomla.filesystem.file');

class CKFile extends \Joomla\CMS\Filesystem\File {
	
}
components/com_slideshowck/helpers/defines.php000060400000004456152453623440015713 0ustar00<?php
/**
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */

// No direct access
defined('_JEXEC') or die;

// set variables
define('SLIDESHOWCK_PLATFORM', 'joomla');
define('SLIDESHOWCK_PATH', JPATH_SITE . '/administrator/components/com_slideshowck');
define('SLIDESHOWCK_ADMIN_PATH', SLIDESHOWCK_PATH);
define('SLIDESHOWCK_FRONT_PATH', JPATH_SITE . '/components/com_slideshowck');
define('SLIDESHOWCK_PROJECTS_PATH', JPATH_SITE . '/administrator/components/com_slideshowck/projects');
define('SLIDESHOWCK_ADMIN_URL', \Joomla\CMS\Uri\Uri::root(true) . '/administrator/index.php?option=com_slideshowck');
define('SLIDESHOWCK_URL', \Joomla\CMS\Uri\Uri::base(true) . '/index.php?option=com_slideshowck');
define('SLIDESHOWCK_ADMIN_GENERAL_URL', \Joomla\CMS\Uri\Uri::root(true) . '/administrator/index.php?option=com_slideshowck&view=templates');
define('SLIDESHOWCK_MEDIA_URI', \Joomla\CMS\Uri\Uri::root(true) . '/media/com_slideshowck');
define('SLIDESHOWCK_MEDIA_URL', SLIDESHOWCK_MEDIA_URI);
define('SLIDESHOWCK_MEDIA_PATH', JPATH_ROOT . '/media/com_slideshowck');
define('SLIDESHOWCK_PLUGIN_URL', SLIDESHOWCK_MEDIA_URI);
define('SLIDESHOWCK_TEMPLATES_PATH', JPATH_SITE . '/templates');
define('SLIDESHOWCK_SITE_ROOT', JPATH_ROOT);
define('SLIDESHOWCK_URI', \Joomla\CMS\Uri\Uri::root(true) . '/administrator/components/com_slideshowck');
define('SLIDESHOWCK_URI_ROOT', \Joomla\CMS\Uri\Uri::root(true));
define('SLIDESHOWCK_URI_BASE', \Joomla\CMS\Uri\Uri::base(true));
define('SLIDESHOWCK_PLUGINS_PATH', JPATH_SITE . '/plugins/slideshowck');
define('SLIDESHOWCK_VERSION', simplexml_load_file(SLIDESHOWCK_PATH . '/slideshowck.xml')->version);

// include the classes
require_once SLIDESHOWCK_PATH . '/helpers/ckinput.php';
require_once SLIDESHOWCK_PATH . '/helpers/cktext.php';
require_once SLIDESHOWCK_PATH . '/helpers/ckfile.php';
require_once SLIDESHOWCK_PATH . '/helpers/ckfolder.php';
require_once SLIDESHOWCK_PATH . '/helpers/ckfof.php';
//require_once SLIDESHOWCK_PATH . '/helpers/helper.php';
//require_once SLIDESHOWCK_PATH . '/helpers/ckcontroller.php';
//require_once SLIDESHOWCK_PATH . '/helpers/ckmodel.php';
//require_once SLIDESHOWCK_PATH . '/helpers/ckview.php';components/com_slideshowck/helpers/cktext.php000060400000000156152453623440015571 0ustar00<?php
namespace Slideshowck;

defined('_JEXEC') or die;

class CKText extends \Joomla\CMS\Language\Text {
	
}
components/com_slideshowck/helpers/ckuri.php000060400000000147152453623440015404 0ustar00<?php
namespace Slideshowck;

defined('_JEXEC') or die;

class CKUri extends \Joomla\CMS\Uri\Uri {
	
}
components/com_slideshowck/helpers/ckbrowse.php000060400000017747152453623440016124 0ustar00<?php
/**
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */

use Slideshowck\CKPath;
use Slideshowck\CKFolder;
use Slideshowck\CKFile;

defined('_JEXEC') or die;

jimport('joomla.filesystem.folder');
jimport('joomla.filesystem.file');

class CKBrowse {

	static $isRestrictedUser = false;

	public static function getFileTypes($type) {
		$input = \Joomla\CMS\Factory::getApplication()->input;
		$type = $input->get('type', $type, 'string');

		switch ($type) {
			case 'video' :
				$filetypes = array('.mp4', '.ogv', '.webm', '.MP4', '.OGV', '.WEBM');
				break;
			case 'audio' :
				$filetypes = array('.mp3', '.ogg', '.MP3', '.OGG');
				break;
			case 'image' :
			default :
				$filetypes = array('.jpg', '.jpeg', '.png', '.gif', '.tiff', '.JPG', '.JPEG', '.PNG', '.GIF', '.TIFF', '.ico', '.webp', '.WEBP');
				break;
		}

		return $filetypes;
	}

	/*
	 * Get a list of folders and files 
	 */
	public static function getItemsList($type = 'image') {
		$input = \Joomla\CMS\Factory::getApplication()->input;

		$type = $input->get('type', $type, 'string');

		switch ($type) {
			case 'video' :
				$filetypes = array('.mp4', '.ogv', '.webm', '.MP4', '.OGV', '.WEBM');
				break;
			case 'audio' :
				$filetypes = array('.mp3', '.ogg', '.MP3', '.OGG');
				break;
			case 'image' :
			default :
				$filetypes = array('.jpg', '.jpeg', '.png', '.gif', '.tiff', '.JPG', '.JPEG', '.PNG', '.GIF', '.TIFF', '.ico', '.webp', '.WEBP');
				break;
		}

		$folder = $input->get('folder', '', 'string') ? '/' . trim($input->get('folder', '', 'string'), '/') : '/' . trim(\Joomla\CMS\Component\ComponentHelper::getParams('com_slideshowck')->get('imagespath', 'images/slideshowck'), '/');

		// makes replacement if specific user management is set
		if (stristr($folder, '$userid')) {
			self::$isRestrictedUser = true;
			$user = \Joomla\CMS\Factory::getUser();
			$folder = str_replace('$userid', 'user_' . $user->id, $folder);
			if (! file_exists(JPATH_SITE . '/' . $folder)) {
				\Joomla\CMS\Filesystem\Folder::create(JPATH_SITE . '/' . $folder);
			}
		}

		// no folder filtering 
		if (\Joomla\CMS\Component\ComponentHelper::getParams('com_slideshowck')->get('imagespathexclusive', '0') == '0') {
		$folder = $input->get('folder', 'images', 'string');
		}

		$tree = new stdClass();

		// list the files in the root folder
		$fName = self::createFolderObj(JPATH_SITE . '/' . $folder, $tree, 1);
		$tree->$fName->files = self::getImagesInFolder(JPATH_SITE . '/' . $folder, implode('|', $filetypes));

		// look for all folder and files
		self::getSubfolder(JPATH_SITE . '/' . $folder, $tree, implode('|', $filetypes), 2);
		$tree = self::prepareList($tree);

		return $tree;
	}

	/* 
	 * List the subfolders and files according to the filter
	 */
	private static function getSubfolder($folder, &$tree, $filter, $level) {
		$folders = \Joomla\CMS\Filesystem\Folder::folders($folder, '.', $recurse = false, $fullpath = true);
		natcasesort($folders);

		if (! count($folders)) return;

		foreach ($folders as $f) {
			$fName = self::createFolderObj($f, $tree, $level);

			// list all authorized files from the folder
			// self::getImagesInFolder($f, $tree, $fName, $filter, $level);

			// recursive loop
			self::getSubfolder($f, $tree, $filter, $level+1);
		}
		return;
	}

	private static function createFolderObj($f, &$tree, $level) {
		$fName = \Joomla\CMS\Filesystem\File::makeSafe(str_replace(JPATH_SITE, '', $f));
		$tree->$fName = new stdClass();
		$name = explode('/', $f);
		$name = end($name);
		$tree->$fName->name = ($level == 1 && self::$isRestrictedUser == true) ? 'images' : $name;
		$tree->$fName->path = $f;
		$tree->$fName->level = $level;
		$tree->$fName->files = false;

		return $fName;
	}

	/* 
	 * List the subfolders and files according to the filter
	 */
	public static function getImagesInFolder($f, $filter = '.') {

			// list all authorized files from the folder
			$files = \Joomla\CMS\Filesystem\Folder::files($f, $filter, $recurse = false, $fullpath = false);
			if (is_array($files)) natcasesort($files);

			return $files;
		}

	/* 
	 * Set level diff and check for depth
	 */
	private static function prepareList($items) {
		if (! $items) return $items;

		$lastitem = 0;
		foreach ($items as $i => $item)
		{
			self::prepareItem($item);

			if ($item->level != 0) {
				if (isset($items->$lastitem))
				{
					$items->$lastitem->deeper     = ($item->level > $items->$lastitem->level);
					$items->$lastitem->shallower  = ($item->level < $items->$lastitem->level);
					$items->$lastitem->level_diff = ($items->$lastitem->level - $item->level);
				}
			}
			$lastitem = $i;

			
		}

		// for the last item
		if (isset($items->$lastitem))
		{
			$items->$lastitem->deeper     = (1 > $items->$lastitem->level);
			$items->$lastitem->shallower  = (1 < $items->$lastitem->level);
			$items->$lastitem->level_diff = ($item->level - 1);
		}

		return $items;
	}

	/* 
	 * Set the default values
	 */
	private static function prepareItem(&$item) {
		$item->deeper     = false;
		$item->shallower  = false;
		$item->level_diff = 0;
		$item->basepath = str_replace(JPATH_SITE, '', $item->path);
		$item->basepath = str_replace('\\', '/', $item->basepath);
		$item->basepath = trim($item->basepath, '/');
	}

	/**
	 * Get the file and store it on the server
	 * 
	 * @return mixed, the method return
	 */
	public static function ajaxAddPicture() {
		// check the token for security
		if (! \Joomla\CMS\Session\Session::checkToken('get')) {
			$msg = \Joomla\CMS\Language\Text::_('JINVALID_TOKEN');
			echo '{"error" : "' . $msg . '"}';
			exit;
		}

		$app = \Joomla\CMS\Factory::getApplication();
		$input = $app->input;
		$file = $input->files->get('file', '', 'array');
		// $imgpath = '/' . trim($input->get('path', '', 'string'), '/') . '/';
		$imgpath = $input->get('path', '', 'string') ? '/' . trim($input->get('path', '', 'string'), '/') . '/' : '/' . trim(\Joomla\CMS\Component\ComponentHelper::getParams('com_slideshowck')->get('imagespath', 'images/slideshowck'), '/') . '/';

		// makes replacement if specific user management is set
		$user = \Joomla\CMS\Factory::getUser();
		$imgpath = str_replace('$userid', 'user_' . $user->id, $imgpath);

		if (!is_array($file)) {
			$msg = \Joomla\CMS\Language\Text::_('CK_NO_FILE_RECEIVED');
			echo '{"error" : "' . $msg . '"}';
			exit;
		}

		$filename = \Joomla\CMS\Filesystem\File::makeSafe($file['name']);

		// check the file extension // TODO recup preg_match de local dev
		// if (\Joomla\CMS\Filesystem\File::getExt($filename) != 'jpg') {
			// $msg = \Joomla\CMS\Language\Text::_('CK_NOT_JPG_FILE');
			// echo '{"error" : "'  $msg  '"}';
			// exit;
		// }

		//Set up the source and destination of the file
		$src = $file['tmp_name'];

		// check if the file exists
		if (!$src || !\Joomla\CMS\Filesystem\File::exists($src)) {
			$msg = \Joomla\CMS\Language\Text::_('CK_FILE_NOT_EXISTS');
			echo '{"error" : "' . $msg . '"}';
			exit;
		}

		// check if folder exists, if not then create it
		if (!\Joomla\CMS\Filesystem\Folder::exists(JPATH_SITE . $imgpath)) {
			if (!\Joomla\CMS\Filesystem\Folder::create(JPATH_SITE . $imgpath)) {
				$msg = \Joomla\CMS\Language\Text::_('CK_UNABLE_TO_CREATE_FOLDER') . ' : ' . $imgpath;
				echo '{"error" : "' . $msg . '"}';
				exit;
			}
		}

		// write the file
		if (! \Joomla\CMS\Filesystem\File::copy($src, JPATH_SITE . $imgpath . $filename)) {
			$msg = \Joomla\CMS\Language\Text::_('CK_UNABLE_WRITE_FILE');
			echo '{"error" : "' . $msg . '"}';
			exit;
		}
		echo '{"img" : "' . $imgpath . $filename . '", "filename" : "' . $filename . '"}';
		exit;
	}

	public static function createFolder($path, $folder) {
		$path = CKPath::clean(JPATH_SITE . '/' . $path . '/' . $folder);

		if (!is_dir($path) && !is_file($path))
			{
				if (CKFolder::create($path))
				{
					$data = "<html>\n<body bgcolor=\"#FFFFFF\">\n</body>\n</html>";
					CKFile::write($path . '/index.html', $data);
				} else {
					return false;
				}
		}
		return true;
	}
}
components/com_slideshowck/helpers/ckstyles.php000060400000141154152453623440016134 0ustar00<?php
/**
 * @copyright	Copyright (C) 2016. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - http://www.template-creator.com - http://www.joomlack.fr
 */
Namespace Slideshowck;

// No direct access
defined('_JEXEC') or die('Restricted access');

/**
 * CKStyles is a class to manage the styles
 *
 * @author Cedric KEIFLIN http://www.joomlack.fr
 */
class CKStyles extends \stdClass {

	public function create($fields, $customstyles, $direction = 'ltr') {

		$styles = "";
		$customprefixes = array();
		if (! empty($customstyles)) {
		// look for the custom styles to manage from plugins for example
		foreach ($customstyles as $prefix => $selector) {
			$customprefixes[] = $prefix;
		}
		// merge the existing prefix and the new one
		// $prefixes = array_merge($prefixes, $customprefixes);
		}
		$prefixes = $customprefixes;

		$cssstyles = new \stdClass();
		foreach ($prefixes as $prefix) {
			$cssstyles->$prefix = new \stdClass();
			$cssstyles->$prefix->css = self::genCss($fields, $prefix, $direction);
		}


		if (! empty($customstyles)) {
			$id = '|ID|';
			// loop through all custom styles from plugins or other elements
			foreach ($customstyles as $prefix => $selector) {
				$selectors = explode('|', str_replace('|qq|', '"', $selector));
				$fullselector = $id . ' ' . implode(',' . $id . ' ', $selectors);
				// $fullselector = implode(',', $selectors);
				
				$properties = $cssstyles->$prefix->css['background']
						. $cssstyles->$prefix->css['gradient']
						. $cssstyles->$prefix->css['borders']
						. $cssstyles->$prefix->css['borderradius']
						. $cssstyles->$prefix->css['height']
						. $cssstyles->$prefix->css['width']
						. $cssstyles->$prefix->css['color']
						. $cssstyles->$prefix->css['margins']
						. $cssstyles->$prefix->css['paddings']
						. $cssstyles->$prefix->css['alignement']
						. $cssstyles->$prefix->css['shadow']
						. $cssstyles->$prefix->css['fontbold']
						. $cssstyles->$prefix->css['fontitalic']
						. $cssstyles->$prefix->css['fontunderline']
						. $cssstyles->$prefix->css['fontuppercase']
						. $cssstyles->$prefix->css['letterspacing']
						. $cssstyles->$prefix->css['wordspacing']
						. $cssstyles->$prefix->css['textindent']
						. $cssstyles->$prefix->css['lineheight']
						. $cssstyles->$prefix->css['fontsize']
						. $cssstyles->$prefix->css['fontfamily']
						. $cssstyles->$prefix->css['custom']
						;
				if ( !(empty(trim($properties)))) {
							$styles .= "
	" . $fullselector . " {
	"
						. $properties
						. "}
	";
				}

				// add the animations to the element
				$styles .= $this->genAnimations($fields, $prefix, $fullselector);
				$styles .= $this->genEffects($fields, $prefix, $fullselector);
			}
		}

		// Arrows
		// normal state arrows
//		$arrowcolor = (isset($fields->navigationarrowcolor) AND $fields->navigationarrowcolor != '') ? str_replace('#', '', $fields->navigationarrowcolor) : "";
//		$arrowopacity = (isset($fields->navigationarrowopacity) AND $fields->navigationarrowopacity != '') ? $fields->navigationarrowopacity : "";
//		if ($arrowcolor || $arrowopacity) {
//			$styles .= "|ID| .camera_prev > span {"
//	. ($arrowcolor ? "background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23" . $arrowcolor . "'%2F%3E%3C%2Fsvg%3E\");" : "")
//	. ($arrowopacity ? "opacity: " . $arrowopacity . ";" : "")
//						. "}
//	";
//			$styles .= "|ID| .camera_next > span {"
//	. ($arrowcolor ? "background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23" . $arrowcolor . "'%2F%3E%3C%2Fsvg%3E\");" : "")
//	. ($arrowopacity ? "opacity: " . $arrowopacity . ";" : "")
//						. "}
//	";
//		}

		// navigation
		$arrowcolor = (isset($fields->navigationarrowcolor) AND $fields->navigationarrowcolor != '') ? str_replace('#', '', $fields->navigationarrowcolor) : "";
		$arrowopacity = (isset($fields->navigationarrowopacity) AND $fields->navigationarrowopacity != '') ? $fields->navigationarrowopacity : "1";
		if ($arrowcolor) {
			$styles .= "|ID| .camera_prev, |ID| .camera_next, |ID| .camera_commands {"
	. ($arrowcolor ? "background: " . $this->hex2RGB($arrowcolor, $arrowopacity) . ";" : "")
						. "}
	";
		}
		// navigation hover
		$arrowhovercolor = (isset($fields->navigationarrowhovercolor) AND $fields->navigationarrowhovercolor != '') ? str_replace('#', '', $fields->navigationarrowhovercolor) : "";
		$arrowhoveropacity = (isset($fields->navigationarrowhoveropacity) AND $fields->navigationarrowhoveropacity != '') ? $fields->navigationarrowhoveropacity : "1";
		if ($arrowcolor) {
			$styles .= "|ID| .camera_prev:hover, |ID| .camera_next:hover, |ID| .camera_commands:hover {"
	. ($arrowcolor ? "background: " . $this->hex2RGB($arrowhovercolor, $arrowhoveropacity) . ";" : "")
						. "}
	";
		}
		
		//paginationdotimage
		$paginationcolor = (isset($fields->paginationdotimagecolor) AND $fields->paginationdotimagecolor != '') ? $fields->paginationdotimagecolor : "";
		$paginationopacity = (isset($fields->paginationdotimageopacity) AND $fields->paginationdotimageopacity != '') ? $fields->paginationdotimageopacity : "1";
		$paginationdotimageborderwidth = (isset($fields->paginationdotimageborderwidth) AND $fields->paginationdotimageborderwidth != '') ? $fields->paginationdotimageborderwidth : "";

		if ($paginationcolor || $paginationopacity) {
			$styles .= "|ID| .camera_pag_ul li img {"
	. ($paginationcolor ? "border-color: " . $this->hex2RGB($paginationcolor, $paginationopacity) . ";" : "")
	. ($paginationdotimageborderwidth ? "border-width: " . $this->testUnit($paginationdotimageborderwidth) . ";" : "")
						. "}
	";
			$styles .= "|ID| .camera_pag_ul .thumb_arrow {"
	. ($paginationcolor ? "border-top-color: " . $this->hex2RGB($paginationcolor, $paginationopacity) . ";" : "")
						. "}
	";
		}

		//paginationdot
		$paginationdotcolor1 = (isset($fields->paginationdotcolor1) AND $fields->paginationdotcolor1 != '') ? $fields->paginationdotcolor1 : "";
		$paginationdotborderradius1 = (isset($fields->paginationdotborderradius1) AND $fields->paginationdotborderradius1 !== '') ? $fields->paginationdotborderradius1 : "";
		$paginationdotcolor2 = (isset($fields->paginationdotcolor2) AND $fields->paginationdotcolor2 != '') ? $fields->paginationdotcolor2 : "";
		$paginationdotborderradius2 = (isset($fields->paginationdotborderradius2) AND $fields->paginationdotborderradius2 !== '') ? $fields->paginationdotborderradius2 : "";

		if ($paginationdotcolor1 || $paginationdotborderradius1 !== '') {
			$styles .= "|ID|.camera_wrap .camera_pag .camera_pag_ul li {"
	. ($paginationdotcolor1 ? "background: " . $paginationdotcolor1 . ";" : "")
	. ($paginationdotborderradius1 !== '' ? "border-radius: " . $this->testUnit($paginationdotborderradius1) . ";" : "")
						. "}
	";
		}

		if ($paginationdotcolor2 || $paginationdotborderradius2 !== '') {
			$styles .= "|ID|.camera_wrap .camera_pag .camera_pag_ul li.cameracurrent > span, |ID| .camera_wrap .camera_pag .camera_pag_ul li:hover > span {"
	. ($paginationdotcolor2 ? "background: " . $paginationdotcolor2 . ";" : "")
	. ($paginationdotborderradius2 !== '' ? "border-radius: " . $this->testUnit($paginationdotborderradius2) . ";" : "")
						. "}
	";
		}

		// paginationdot position
		$paginationposition = (isset($fields->paginationdotposition) AND $fields->paginationdotposition != '') ? $fields->paginationdotposition : "";
		if ($paginationposition === 'inside') {
			$styles .= "|ID| .camera_pag {"
	. ($paginationposition ? "margin-top: -50px;" : "")
						. "}
	";
			$styles .= "|ID| {"
	. ($paginationposition ? "margin-bottom: 0px !important;" : "")
						. "}
	";
		}

		// paginationdot alignment
		$paginationalign = (isset($fields->paginationdotalign) AND $fields->paginationdotalign != '') ? $fields->paginationdotalign : "";
		if ($paginationalign) {
			$styles .= "|ID| .camera_pag .camera_pag_ul {"
	. ($paginationalign ? "text-align: " . $paginationalign . ";" : "")
						. "}
	";
		}

		// caption
		$layoutposition = (isset($fields->layoutposition) AND $fields->layoutposition != '') ? $fields->layoutposition : "";
		if ($layoutposition) {
			$styles .= "|ID| .camera_caption {"
	. ($layoutposition == 'bottom' ? "bottom: 0; top: auto;" : "")
	. ($layoutposition == 'top' ? "bottom: auto; top: 0;" : "")
	. ($layoutposition == 'middle' ? "bottom: auto; top: 50%; transform: translateY(-50%);" : "")
	. ($layoutposition == 'fullscreen' ? "bottom: 0; top: 0;" : "")
						. "}
	";
		}

		/* ---- fin des css ------ */
		return $styles;
	}

	function genCss($fields, $prefix, $direction) {
		$input = CKFof::getInput();
		$action = 'preview';

		// construct variable names
		$backgroundimageurl = $prefix . 'backgroundimageurl';
		$backgroundimageleft = $prefix . 'backgroundimageleft';
		$backgroundimagetop = $prefix . 'backgroundimagetop';
		$backgroundimagerepeat = $prefix . 'backgroundimagerepeat';
		$backgroundimageattachment = $prefix . 'backgroundimageattachment';
		$backgroundcolor = $prefix . 'backgroundcolorstart';
		$backgroundopacity = $prefix . 'backgroundopacity';
		$gradientcolor = $prefix . 'backgroundcolorend';
		$gradient1position = $prefix . 'backgroundpositionend';
		$gradient1opacity = $prefix . 'backgroundopacityend';
		$gradient2color = $prefix . 'backgroundcolorstop1';
		$gradient2position = $prefix . 'backgroundpositionstop1';
		$gradient2opacity = $prefix . 'backgroundopacitystop1';
		$gradient3color = $prefix . 'backgroundcolorstop2';
		$gradient3position = $prefix . 'backgroundpositionstop2';
		$gradient3opacity = $prefix . 'backgroundopacitystop2';
		$gradientdirection = $prefix . 'backgrounddirection';
		$hasopacity = false;
		$backgroundimagesize = $prefix . 'backgroundimagesize';
		$opacity = $prefix . 'opacity';

		// set the background color
		$css['background'] = (isset($fields->$backgroundcolor) AND $fields->$backgroundcolor != '') ? "\tbackground: " . $fields->$backgroundcolor . ";\r\n" : "";
		$backgroundcolorvalue = (isset($fields->$backgroundcolor) AND $fields->$backgroundcolor) ? $fields->$backgroundcolor : "";

		// manage rgba color for opacity
		if (isset($fields->$backgroundopacity) AND $fields->$backgroundopacity != '' AND isset($fields->$backgroundcolor)) {
			$hasopacity = true;
			$rgbavalue = $this->hex2RGB($fields->$backgroundcolor, $fields->$backgroundopacity);
			$css['background'] .= (isset($fields->$backgroundcolor) AND $fields->$backgroundcolor) ? "\tbackground: " . $rgbavalue . ";\r\n\t-pie-background: " . $rgbavalue . ";\r\n" : "";
		}
		if (isset($fields->$backgroundopacity) AND $fields->$backgroundopacity == '0') {
			$css['background'] .= "\tbackground: none;\r\n";
		}

		$imageurl = "";
		if (isset($fields->$backgroundimageurl) AND $fields->$backgroundimageurl) {
			if ($action == 'preview') {
				$imageurl = substr($fields->$backgroundimageurl, 0, 4)  == 'http' ? $fields->$backgroundimageurl : \Joomla\CMS\Uri\Uri::root(true) . '/' . $fields->$backgroundimageurl;
			} else {
				$imageurl = explode("/", $fields->$backgroundimageurl);
				$imageurl = end($imageurl);
				$imageurl = "../images/" . $imageurl;
			}
		}

		// set the background image
		$backgroundimageleftvalue = (isset($fields->$backgroundimageleft) AND $fields->$backgroundimageleft != null) ? $fields->$backgroundimageleft : "center";
		$backgroundimagetopvalue = (isset($fields->$backgroundimagetop) AND $fields->$backgroundimagetop != null) ? $fields->$backgroundimagetop : "center";
		$backgroundimagerepeatvalue = (isset($fields->$backgroundimagerepeat) AND $fields->$backgroundimagerepeat) ? $fields->$backgroundimagerepeat : "no-repeat";
		$backgroundimageurlvalue = (isset($fields->$backgroundimageurl) AND $fields->$backgroundimageurl) ? $fields->$backgroundimageurl : "";
		$backgroundimageattachmentvalue = (isset($fields->$backgroundimageattachment) AND $fields->$backgroundimageattachment) ? $fields->$backgroundimageattachment : "";

		if ($backgroundimageleftvalue != 'top' AND $backgroundimageleftvalue != 'right' AND $backgroundimageleftvalue != 'bottom' AND $backgroundimageleftvalue != 'left' AND $backgroundimageleftvalue != 'center' AND !stristr($backgroundimageleftvalue, "px")
		)
			$backgroundimageleftvalue = $this->testUnit($backgroundimageleftvalue);

		if ($backgroundimagetopvalue != 'top' AND $backgroundimagetopvalue != 'right' AND $backgroundimagetopvalue != 'bottom' AND $backgroundimagetopvalue != 'left' AND $backgroundimagetopvalue != 'center' AND !stristr($backgroundimagetopvalue, "px")
		)
			$backgroundimagetopvalue = $this->testUnit($backgroundimagetopvalue);

		// set the background color
		if ((isset($fields->class) AND !stristr($fields->class, 'bannerlogo')) OR !isset($fields->class)) {
			$css['background'] = (isset($fields->$backgroundimageurl) AND $fields->$backgroundimageurl) ? "\tbackground: " . $backgroundcolorvalue . " url(" . $imageurl . ") " . $backgroundimageleftvalue . " " . $backgroundimagetopvalue . " " . $backgroundimagerepeatvalue . " " . $backgroundimageattachmentvalue . ";\r\n" : $css['background'];
			if ($hasopacity) 
				$css['background'] .= (isset($fields->$backgroundimageurl) AND $fields->$backgroundimageurl) ? "\tbackground: " . $rgbavalue . " url(" . $imageurl . ") " . $backgroundimageleftvalue . " " . $backgroundimagetopvalue . " " . $backgroundimagerepeatvalue . " " . $backgroundimageattachmentvalue . ";\r\n" : "";
		}

		//set the background size
		if (isset($fields->$backgroundimageurl) AND $fields->$backgroundimageurl AND isset($fields->$backgroundimagesize) AND $fields->$backgroundimagesize != 'none') {
			$css['background'] .= "\tbackground-size: " . $fields->$backgroundimagesize . ";\r\n";
		}

		$css['background'] .= (isset($fields->$opacity) AND $fields->$opacity) ? "\topacity: " . ($fields->$opacity / 100) . ";" : "";

		$gradient0colorvalue = (isset($fields->$backgroundcolor) AND $fields->$backgroundcolor) ? $fields->$backgroundcolor : "";
		$gradient1colorvalue = (isset($fields->$gradientcolor) AND $fields->$gradientcolor) ? $fields->$gradientcolor : "";
		$gradient1positionvalue = (isset($fields->$gradient1position) AND $fields->$gradient1position) ? $fields->$gradient1position . "%" : "100%";
		$gradient2colorvalue = (isset($fields->$gradient2color) AND $fields->$gradient2color) ? $fields->$gradient2color : "";
		$gradient2positionvalue = (isset($fields->$gradient2position) AND $fields->$gradient2position) ? $fields->$gradient2position . "%" : "";
		$gradient3colorvalue = (isset($fields->$gradient3color) AND $fields->$gradient3color) ? $fields->$gradient3color : "";
		$gradient3positionvalue = (isset($fields->$gradient3position) AND $fields->$gradient3position) ? $fields->$gradient3position . "%" : "";

		if (isset($fields->$gradientdirection)) {
			switch ($fields->$gradientdirection) {
				case 'bottomtop':
					$gradientdirectionvalue = 'center bottom';
					$gradientdirectionvaluebis = 'left bottom, left top';
					$gradientdirectionvaluebis2 = 'x1="0%" y1="100%"
				x2="0%" y2="0%"';
					$gradientdirectionvalue3 = 'to top';
					break;
				case 'leftright':
					$gradientdirectionvalue = 'center left';
					$gradientdirectionvaluebis = 'left top, right top';
					$gradientdirectionvaluebis2 = 'x1="0%" y1="0%"
				x2="100%" y2="0%"';
					$gradientdirectionvalue3 = 'to right';
					break;
				case 'rightleft':
					$gradientdirectionvalue = 'center right';
					$gradientdirectionvaluebis = 'right top, left top';
					$gradientdirectionvaluebis2 = 'x1="100%" y1="0%"
				x2="0%" y2="0%"';
					$gradientdirectionvalue3 = 'to left';
					break;
				case 'topbottom':
				default :
					$gradientdirectionvalue = 'center top';
					$gradientdirectionvaluebis = 'left top, left bottom';
					$gradientdirectionvaluebis2 = 'x1="0%" y1="0%"
				x2="0%" y2="100%"';
					$gradientdirectionvalue3 = 'to bottom';
					break;
			}
		} else {
			$gradientdirectionvalue = 'center top';
			$gradientdirectionvaluebis = 'left top, left bottom';
			$gradientdirectionvaluebis2 = 'x1="0%" y1="0%"
				x2="0%" y2="100%"';
			$gradientdirectionvalue3 = 'to bottom';
		}


		$gradientstop2 = '';
		$gradientstop2webkit = '';
		$gradientstop2bis = '';
		$gradientstop3 = '';
		$gradientstop3webkit = '';
		$gradientstop3bis = '';
		if ($gradient2colorvalue AND $gradient2positionvalue) {
			$gradientstop2 = ',' . $gradient2colorvalue . ' ' . $gradient2positionvalue;
			$gradientstop2webkit = ',color-stop(' . $gradient2positionvalue . ',' . $gradient2colorvalue . ')';
			$gradientstop2bis = '<stop offset="' . $gradient2positionvalue . '"   stop-color="' . $gradient2colorvalue . '" stop-opacity="1"/>';
		}
		if ($gradient3colorvalue AND $gradient3positionvalue) {
			$gradientstop3 = ',' . $gradient3colorvalue . ' ' . $gradient3positionvalue;
			$gradientstop3webkit = ',color-stop(' . $gradient3positionvalue . ',' . $gradient3colorvalue . ')';
			$gradientstop3bis = '<stop offset="' . $gradient3positionvalue . '"   stop-color="' . $gradient3colorvalue . '" stop-opacity="1"/>';
		}



		if ($gradient0colorvalue && $gradient1colorvalue) {
			// $css['gradient'] = "\tbackground-image: url(\"" . $prefix . $id . "-gradient.svg\");\r\n"
			$css['gradient'] = ""
					. "\tbackground-image: -o-linear-gradient(" . $gradientdirectionvalue . "," . $gradient0colorvalue . $gradientstop2 . $gradientstop3 . ", " . $gradient1colorvalue . ' ' . $gradient1positionvalue . ");\r\n"
					. "\tbackground-image: -webkit-gradient(linear, " . $gradientdirectionvaluebis . ",from(" . $gradient0colorvalue . ")" . $gradientstop2webkit . $gradientstop3webkit . ", color-stop(" . $gradient1positionvalue . ', ' . $gradient1colorvalue . "));\r\n"
					. "\tbackground-image: -moz-linear-gradient(" . $gradientdirectionvalue . "," . $gradient0colorvalue . $gradientstop2 . $gradientstop3 . ", " . $gradient1colorvalue . ' ' . $gradient1positionvalue . ");\r\n"
					. "\tbackground-image: linear-gradient(" . $gradientdirectionvalue3 . "," . $gradient0colorvalue . $gradientstop2 . $gradientstop3 . ", " . $gradient1colorvalue . ' ' . $gradient1positionvalue . ");\r\n";
					// . "\t-pie-background: linear-gradient(" . $gradientdirectionvalue . "," . $gradient0colorvalue . $gradientstop2 . $gradientstop3 . ", " . $gradient1colorvalue . ' ' . $gradient1positionvalue . ");\r\n";

			/*
			// create the file svg for IE9 and Opera gradient compatibility
			$svgie9cssdest = $path . '/css/' . $prefix . $id . '-gradient.svg';
			$svgie9csstext = '<?xml version="1.0" ?>
              <svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="none" version="1.0" width="100%"
              height="100%"
              xmlns:xlink="http://www.w3.org/1999/xlink">

              <defs>
              <linearGradient id="' . $prefix . $id . '"
              ' . $gradientdirectionvaluebis2 . '
              spreadMethod="pad">
              <stop offset="0%"   stop-color="' . $gradient0colorvalue . '" stop-opacity="1"/>
              ' . $gradientstop2bis . '
              ' . $gradientstop3bis . '
              <stop offset="' . $gradient1positionvalue . '" stop-color="' . $gradient1colorvalue . '" stop-opacity="1"/>
              </linearGradient>
              </defs>

              <rect width="100%" height="100%"
              style="fill:url(#' . $prefix . $id . ');" />
              </svg>
              ';
			if (!\Joomla\CMS\Filesystem\File::write($svgie9cssdest, $svgie9csstext)) {
				echo '<p class="error">' . \Joomla\CMS\Language\Text::_('CK_ERROR_CREATING_SVGIE9CSS') . '</p>';
			}*/
		} else {
			$css['gradient'] = "";
		}


		// construct variable names
		$borderscolor = $prefix . 'borderscolor';
		$borderssize = $prefix . 'borderssize';
		$bordersstyle = $prefix . 'bordersstyle';
		$bordertopcolor = $prefix . 'bordertopcolor';
		$bordertopsize = $prefix . 'bordertopsize';
		$bordertopstyle = $prefix . 'bordertopstyle';
		$borderbottomcolor = $prefix . 'borderbottomcolor';
		$borderbottomsize = $prefix . 'borderbottomsize';
		$borderbottomstyle = $prefix . 'borderbottomstyle';
		$borderleftcolor = $prefix . 'borderleftcolor';
		$borderleftsize = $prefix . 'borderleftsize';
		$borderleftstyle = $prefix . 'borderleftstyle';
		$borderrightcolor = $prefix . 'borderrightcolor';
		$borderrightsize = $prefix . 'borderrightsize';
		$borderrightstyle = $prefix . 'borderrightstyle';
		// for border radius
		$borderradius = $prefix . 'borderradius';
		$borderradiustopleft = $prefix . 'borderradiustopleft';
		$borderradiustopright = $prefix . 'borderradiustopright';
		$borderradiusbottomleft = $prefix . 'borderradiusbottomleft';
		$borderradiusbottomright = $prefix . 'borderradiusbottomright';

		$fields->$bordersstyle = isset($fields->$bordersstyle) ? $fields->$bordersstyle : 'solid';
		$fields->$bordertopstyle = isset($fields->$bordertopstyle) ? $fields->$bordertopstyle : 'solid';
		$fields->$borderbottomstyle = isset($fields->$borderbottomstyle) ? $fields->$borderbottomstyle : 'solid';
		$fields->$borderleftstyle = isset($fields->$borderleftstyle) ? $fields->$borderleftstyle : 'solid';
		$fields->$borderrightstyle = isset($fields->$borderrightstyle) ? $fields->$borderrightstyle : 'solid';

		$css['borders'] = (isset($fields->$borderssize) AND $fields->$borderssize == '0') ? "\tborder: none;\r\n" : "";
		$css['bordertop'] = (isset($fields->$bordertopsize) AND $fields->$bordertopsize == '0') ? "\tborder-top: none;\r\n" : "";
		$css['borderbottom'] = (isset($fields->$borderbottomsize) AND $fields->$borderbottomsize == '0') ? "\tborder-bottom: none;\r\n" : "";
		$css['borderleft'] = (isset($fields->$borderleftsize) AND $fields->$borderleftsize == '0') ? "\tborder-left: none;\r\n" : "";
		$css['borderright'] = (isset($fields->$borderrightsize) AND $fields->$borderrightsize == '0') ? "\tborder-right: none;\r\n" : "";

		$css['borders'] = (isset($fields->$borderscolor) AND $fields->$borderscolor AND isset($fields->$borderssize) AND $fields->$borderssize) ? "\tborder: " . $fields->$borderscolor . " " . $this->testUnit($fields->$borderssize) . " " . $fields->$bordersstyle . ";\r\n" : $css['borders'];
		$css['bordertop'] = (isset($fields->$bordertopcolor) AND $fields->$bordertopcolor AND isset($fields->$bordertopsize) AND $fields->$bordertopsize) ? "\tborder-top: " . $fields->$bordertopcolor . " " . $this->testUnit($fields->$bordertopsize) . " " . $fields->$bordertopstyle . ";\r\n" : $css['bordertop'];
		$css['borderbottom'] = (isset($fields->$borderbottomcolor) AND $fields->$borderbottomcolor AND isset($fields->$borderbottomsize) AND $fields->$borderbottomsize) ? "\tborder-bottom: " . $fields->$borderbottomcolor . " " . $this->testUnit($fields->$borderbottomsize) . " " . $fields->$borderbottomstyle . ";\r\n" : $css['borderbottom'];
		$css['borderleft'] = (isset($fields->$borderleftcolor) AND $fields->$borderleftcolor AND isset($fields->$borderleftsize) AND $fields->$borderleftsize) ? "\tborder-left: " . $fields->$borderleftcolor . " " . $this->testUnit($fields->$borderleftsize) . " " . $fields->$borderleftstyle . ";\r\n" : $css['borderleft'];
		$css['borderright'] = (isset($fields->$borderrightcolor) AND $fields->$borderrightcolor AND isset($fields->$borderrightsize) AND $fields->$borderrightsize) ? "\tborder-right: " . $fields->$borderrightcolor . " " . $this->testUnit($fields->$borderrightsize) . " " . $fields->$borderrightstyle . ";\r\n" : $css['borderright'];

		// compile all borders
		$css['borders'] .= $css['bordertop'] . $css['borderbottom'] . $css['borderleft'] . $css['borderright'];

		// $borderradiusvalue = (isset($fields->$borderradius) AND ($fields->$borderradius || $fields->$borderradius == "0")) ? $fields->$borderradius : "0";
		$borderradiusvalue = "0";
		$borderradiustopleftvalue = (isset($fields->$borderradiustopleft) AND ($fields->$borderradiustopleft || $fields->$borderradiustopleft == "0")) ? $fields->$borderradiustopleft : $borderradiusvalue;
		$borderradiustoprightvalue = (isset($fields->$borderradiustopright) AND ($fields->$borderradiustopright || $fields->$borderradiustopleft == "0")) ? $fields->$borderradiustopright : $borderradiusvalue;
		$borderradiusbottomleftvalue = (isset($fields->$borderradiusbottomleft) AND ($fields->$borderradiusbottomleft || $fields->$borderradiustopleft == "0")) ? $fields->$borderradiusbottomleft : $borderradiusvalue;
		$borderradiusbottomrightvalue = (isset($fields->$borderradiusbottomright) AND ($fields->$borderradiusbottomright || $fields->$borderradiustopleft == "0")) ? $fields->$borderradiusbottomright : $borderradiusvalue;

		if ( (isset($fields->$borderradiustopleft) AND $fields->$borderradiustopleft != "")
			|| (isset($fields->$borderradiustopright) AND $fields->$borderradiustopright != "")
			|| (isset($fields->$borderradiusbottomleft) AND $fields->$borderradiusbottomleft != "")
			|| (isset($fields->$borderradiusbottomright) AND $fields->$borderradiusbottomright != "")
		) {
			// $css['borderradius'] = "\t-moz-border-radius: " . $this->testUnit($borderradiusvalue) . ";\r\n"
					// . "\t-o-border-radius: " . $this->testUnit($borderradiusvalue) . ";\r\n"
					// . "\t-webkit-border-radius: " . $this->testUnit($borderradiusvalue) . ";\r\n"
					// . "\tborder-radius: " . $this->testUnit($borderradiusvalue) . ";\r\n"
			$css['borderradius'] =  "\t-moz-border-radius: " . $this->testUnit($borderradiustopleftvalue) . " " . $this->testUnit($borderradiustoprightvalue) . " " . $this->testUnit($borderradiusbottomrightvalue) . " " . $this->testUnit($borderradiusbottomleftvalue) . ";\r\n"
					. "\t-o-border-radius: " . $this->testUnit($borderradiustopleftvalue) . " " . $this->testUnit($borderradiustoprightvalue) . " " . $this->testUnit($borderradiusbottomrightvalue) . " " . $this->testUnit($borderradiusbottomleftvalue) . ";\r\n"
					. "\t-webkit-border-radius: " . $this->testUnit($borderradiustopleftvalue) . " " . $this->testUnit($borderradiustoprightvalue) . " " . $this->testUnit($borderradiusbottomrightvalue) . " " . $this->testUnit($borderradiusbottomleftvalue) . ";\r\n"
					. "\tborder-radius: " . $this->testUnit($borderradiustopleftvalue) . " " . $this->testUnit($borderradiustoprightvalue) . " " . $this->testUnit($borderradiusbottomrightvalue) . " " . $this->testUnit($borderradiusbottomleftvalue) . ";\r\n";
		} else {
			$css['borderradius'] = "";
		}

		// construct variable names
		$height = $prefix . 'height';
		$width = $prefix . 'width';
		$color = $prefix . 'color';
		$lineheight = $prefix . 'lineheight';
		$margintop = $prefix . 'margintop';
		$marginbottom = $prefix . 'marginbottom';
		$marginleft = $prefix . 'marginleft';
		$marginright = $prefix . 'marginright';
		$margins = $prefix . 'margins';
		$paddingtop = $prefix . 'paddingtop';
		$paddingbottom = $prefix . 'paddingbottom';
		$paddingleft = $prefix . 'paddingleft';
		$paddingright = $prefix . 'paddingright';
		$paddings = $prefix . 'paddings';

		$css['height'] = (isset($fields->$height) AND $fields->$height) ? "\theight: " . $this->testUnit($fields->$height) . ";\r\n" : "";
		$css['width'] = (isset($fields->$width) AND $fields->$width) ? "\twidth: " . $this->testUnit($fields->$width) . ";\r\n" : "";
		$css['color'] = (isset($fields->$color) AND $fields->$color) ? "\tcolor: " . $fields->$color . ";\r\n" : "";
		$css['lineheight'] = (isset($fields->$lineheight) AND $fields->$lineheight) ? "\tline-height: " . $this->testUnit($fields->$lineheight) . ";\r\n" : "";
		$css['margintop'] = (isset($fields->$margintop) AND ($fields->$margintop OR $fields->$margintop == '0')) ? "\tmargin-top: " . $this->testUnit($fields->$margintop) . ";\r\n" : "";
		$css['marginbottom'] = (isset($fields->$marginbottom) AND ($fields->$marginbottom OR $fields->$marginbottom == '0')) ? "\tmargin-bottom: " . $this->testUnit($fields->$marginbottom) . ";\r\n" : "";
		$css['marginleft'] = (isset($fields->$marginleft) AND ($fields->$marginleft OR $fields->$marginleft == '0')) ? "\tmargin-left: " . $this->testUnit($fields->$marginleft) . ";\r\n" : "";
		$css['margins'] = (isset($fields->$margins) AND ($fields->$margins OR $fields->$margins == '0')) ? "\tmargin: " . $this->testUnit($fields->$margins) . ";\r\n" : "";
		$css['marginright'] = (isset($fields->$marginright) AND ($fields->$marginright OR $fields->$marginright == '0')) ? "\tmargin-right: " . $this->testUnit($fields->$marginright) . ";\r\n" : "";
		$css['paddingtop'] = (isset($fields->$paddingtop) AND ($fields->$paddingtop OR $fields->$paddingtop == '0')) ? "\tpadding-top: " . $this->testUnit($fields->$paddingtop) . ";\r\n" : "";
		$css['paddingbottom'] = (isset($fields->$paddingbottom) AND ($fields->$paddingbottom OR $fields->$paddingbottom == '0')) ? "\tpadding-bottom: " . $this->testUnit($fields->$paddingbottom) . ";\r\n" : "";
		$css['paddingleft'] = (isset($fields->$paddingleft) AND ($fields->$paddingleft OR $fields->$paddingleft == '0')) ? "\tpadding-left: " . $this->testUnit($fields->$paddingleft) . ";\r\n" : "";
		$css['paddingright'] = (isset($fields->$paddingright) AND ($fields->$paddingright OR $fields->$paddingright == '0')) ? "\tpadding-right: " . $this->testUnit($fields->$paddingright) . ";\r\n" : "";
		$css['paddings'] = (isset($fields->$paddings) AND ($fields->$paddings OR $fields->$paddings == '0')) ? "\tpadding: " . $this->testUnit($fields->$paddings) . ";\r\n" : "";

		$css['margins'] .= $css['margintop'] . $css['marginright'] . $css['marginbottom'] . $css['marginleft'];
		$css['paddings'] .= $css['paddingtop'] . $css['paddingright'] . $css['paddingbottom'] . $css['paddingleft'];

		// construct variable names
		$shadowcolor = $prefix . 'shadowcolor';
		$shadowhoffset = $prefix . 'shadowoffseth';
		$shadowvoffset = $prefix . 'shadowoffsetv';
		$shadowblur = $prefix . 'shadowblur';
		$shadowspread = $prefix . 'shadowspread';
		$shadowinset = $prefix . 'shadowinset';
		$shadowopacity = $prefix . 'shadowopacity';

		// manage shadow box
		$shadowcolorvalue = (isset($fields->$shadowcolor) AND $fields->$shadowcolor) ? $fields->$shadowcolor : "";
		$shadowhoffsetvalue = (isset($fields->$shadowhoffset) AND $fields->$shadowhoffset) ? $fields->$shadowhoffset : "0";
		$shadowvoffsetvalue = (isset($fields->$shadowvoffset) AND $fields->$shadowvoffset) ? $fields->$shadowvoffset : "0";
		$shadowblurvalue = (isset($fields->$shadowblur) AND $fields->$shadowblur) ? $fields->$shadowblur : "";
		$shadowspreadvalue = (isset($fields->$shadowspread) AND $fields->$shadowspread) ? $fields->$shadowspread : "0";
		$shadowinsetvalue = (isset($fields->$shadowinset) AND $fields->$shadowinset === '1') ? ' inset' : '';

		// manage rgba color for opacity
		if (isset($fields->$shadowopacity) AND $fields->$shadowopacity !== '' AND $shadowcolorvalue !== '') {
			$shadowcolorvalue = $this->hex2RGB($shadowcolorvalue, $fields->$shadowopacity);
		}
		
		if ($shadowcolorvalue && $shadowblurvalue) {
			$css['shadow'] = "\tbox-shadow: " . $shadowcolorvalue . " " . $this->testUnit($shadowhoffsetvalue) . " " . $this->testUnit($shadowvoffsetvalue) . " " . $this->testUnit($shadowblurvalue) . " " . $this->testUnit($shadowspreadvalue) . $shadowinsetvalue . ";\r\n"
					. "\t-moz-box-shadow: " . $shadowcolorvalue . " " . $this->testUnit($shadowhoffsetvalue) . " " . $this->testUnit($shadowvoffsetvalue) . " " . $this->testUnit($shadowblurvalue) . " " . $this->testUnit($shadowspreadvalue) . $shadowinsetvalue . ";\r\n"
					. "\t-webkit-box-shadow: " . $shadowcolorvalue . " " . $this->testUnit($shadowhoffsetvalue) . " " . $this->testUnit($shadowvoffsetvalue) . " " . $this->testUnit($shadowblurvalue) . " " . $this->testUnit($shadowspreadvalue) . $shadowinsetvalue . ";\r\n";
		} else {
			$css['shadow'] = "";
		}

		// construct variable names
		$fontactivation = $prefix . 'fontactivation';
		// $fontbold = $prefix . 'fontbold';
		$fontitalic = $prefix . 'fontitalic';
		$fontunderline = $prefix . 'fontunderline';
		// $fontuppercase = $prefix . 'fontuppercase';
		$fontfamily = $prefix . 'fontfamily';
		$googlefont = $prefix . 'googlefont';
		$fontweight = $prefix . 'fontweight';
		$fontsize = $prefix . 'fontsize';
		// $alignementactivation = $prefix . 'alignementactivation';
		// $alignement = $prefix . 'alignement';
		// $alignementleft = $prefix . 'alignementleft';
		// $alignementcenter = $prefix . 'alignementcenter';
		// $alignementjustify = $prefix . 'alignementjustify';
		// $alignementright = $prefix . 'alignementright';
		$wordspacing = $prefix . 'wordspacing';
		$letterspacing = $prefix . 'letterspacing';
		$textindent = $prefix . 'textindent';
		$textalign = $prefix . 'textalign';
		$fontweight = $prefix . 'fontweight';
		$texttransform = $prefix . 'texttransform';

		// $css['alignement'] = "";
		// if (isset($fields->$alignementright) AND $fields->$alignementright == 'checked') {
			// $css['alignement'] = $direction == "rtl" ? "\ttext-align: left;\r\n" : "\ttext-align: right;\r\n";
		// } else if (isset($fields->$alignementcenter) AND $fields->$alignementcenter == 'checked') {
			// $css['alignement'] = "\ttext-align: center;\r\n";
		// } else if (isset($fields->$alignementjustify) AND $fields->$alignementjustify == 'checked') {
			// $css['alignement'] = "\ttext-align: justify;\r\n";
		// } else if (isset($fields->$alignementleft) AND $fields->$alignementleft == 'checked') {
			// $css['alignement'] = $direction == "rtl" ? "\ttext-align: right;\r\n" : "\ttext-align: left;\r\n";
			// ;
		// }

		// $css['fontbold'] = "";
		$css['fontitalic'] = "";
		$css['fontunderline'] = "";
		$css['fontuppercase'] = "";
		
		$css['alignement'] = (isset($fields->$textalign) AND $fields->$textalign) ? "\ttext-align: " . $fields->$textalign . ";\r\n" : "";
		$css['fontbold'] = (isset($fields->$fontweight) AND $fields->$fontweight) ? "\tfont-weight: " . $fields->$fontweight . ";\r\n" : "";
		$css['fontuppercase'] = (isset($fields->$texttransform) AND $fields->$texttransform) ? "\ttext-transform: " . $fields->$texttransform . ";\r\n" : "";
		
		

		// if (isset($fields->$fontbold) AND $fields->$fontbold) {
			// if ($fields->$fontbold != 'default')
				// $css['fontbold'] = $fields->$fontbold == 'bold' ? "\tfont-weight: bold;\r\n" : "\tfont-weight: normal;\r\n";
		// }

		if (isset($fields->$fontitalic) AND $fields->$fontitalic) {
			if ($fields->$fontitalic != 'default')
				$css['fontitalic'] = $fields->$fontitalic == 'italic' ? "\tfont-style: italic;\r\n" : "\tfont-style: normal;\r\n";
		}

		if (isset($fields->$fontunderline) AND $fields->$fontunderline) {
			if ($fields->$fontunderline != 'default')
				$css['fontunderline'] = $fields->$fontunderline == 'underline' ? "\ttext-decoration: underline;\r\n" : "\ttext-decoration: none;\r\n";
		}

		// if (isset($fields->$fontuppercase) AND $fields->$fontuppercase) {
			// if ($fields->$fontuppercase != 'default')
				// $css['fontuppercase'] = $fields->$fontuppercase == 'uppercase' ? "\ttext-transform: uppercase;\r\n" : "\ttext-transform: none;\r\n";
		// }

		$css['textindent'] = (isset($fields->$textindent) AND $fields->$textindent) ? "\ttext-indent: " . $this->testUnit($fields->$textindent) . ";\r\n" : "";
		$css['letterspacing'] = (isset($fields->$letterspacing) AND $fields->$letterspacing) ? "\tletter-spacing: " . $this->testUnit($fields->$letterspacing) . ";\r\n" : "";
		$css['wordspacing'] = (isset($fields->$wordspacing) AND $fields->$wordspacing) ? "\tword-spacing: " . $this->testUnit($fields->$wordspacing) . ";\r\n" : "";
		$css['fontsize'] = (isset($fields->$fontsize) AND $fields->$fontsize) ? "\tfont-size: " . $this->testUnit($fields->$fontsize) . ";\r\n" : "";
		$css['fontstylessquirrel'] = '';
		if (isset($fields->$fontfamily) AND $fields->$fontfamily == 'googlefont') {
			$css['fontfamily'] = (isset($fields->$googlefont) AND $fields->$googlefont != "default") ? "\tfont-family: '" . $fields->$googlefont . "';\r\n" : "";
			$css['fontbold'] = (isset($fields->$fontweight) AND $fields->$fontweight != "") ? "\tfont-weight: " . $fields->$fontweight . ";\r\n" : "";
		} else {
			$css['fontfamily'] = (isset($fields->$fontfamily) AND $fields->$fontfamily != "default") ? "\tfont-family: " . $fields->$fontfamily . ";\r\n" : "";
		}
		// compatibility with multiple intefaces
		$gfontfamily = $prefix . 'textgfont';
		if (isset($fields->$gfontfamily) AND $fields->$gfontfamily) {
			$fields->$gfontfamily = str_replace('+', ' ', $fields->$gfontfamily);
			$css['fontfamily'] .= (isset($fields->$gfontfamily) AND $fields->$gfontfamily) ? "\tfont-family: '" . $fields->$gfontfamily . "';\r\n" : "";
		}


		// construct variable names
		$normallinkfontbold = $prefix . 'normallinkfontbold';
		$normallinkfontitalic = $prefix . 'normallinkfontitalic';
		$normallinkfontunderline = $prefix . 'normallinkfontunderline';
		$normallinkfontuppercase = $prefix . 'normallinkfontuppercase';
		$normallinkcolor = $prefix . 'normallinkcolor';

		$css['normallinkfontbold'] = "";
		$css['normallinkfontitalic'] = "";
		$css['normallinkfontunderline'] = "";
		$css['normallinkfontuppercase'] = "";

		if (isset($fields->$normallinkfontbold) AND $fields->$normallinkfontbold) {
			if ($fields->$normallinkfontbold != 'default')
				$css['normallinkfontbold'] = $fields->$normallinkfontbold == 'bold' ? "\tfont-weight: bold;\r\n" : "\tfont-weight: normal;\r\n";
		}

		if (isset($fields->$normallinkfontitalic) AND $fields->$normallinkfontitalic) {
			if ($fields->$normallinkfontitalic != 'default')
				$css['normallinkfontitalic'] = $fields->$normallinkfontitalic == 'italic' ? "\tfont-style: italic;\r\n" : "\tfont-style: normal;\r\n";
		}

		if (isset($fields->$normallinkfontunderline) AND $fields->$normallinkfontunderline) {
			if ($fields->$normallinkfontunderline != 'default')
				$css['normallinkfontunderline'] = $fields->$normallinkfontunderline == 'underline' ? "\ttext-decoration: underline;\r\n" : "\ttext-decoration: none;\r\n";
		}

		if (isset($fields->$normallinkfontuppercase) AND $fields->$normallinkfontuppercase) {
			if ($fields->$normallinkfontuppercase != 'default')
				$css['normallinkfontuppercase'] = $fields->$normallinkfontuppercase == 'uppercase' ? "\ttext-transform: uppercase;\r\n" : "\ttext-transform: none;\r\n";
		}

		$css['normallinkcolor'] = (isset($fields->$normallinkcolor) AND $fields->$normallinkcolor) ? "\tcolor: " . $fields->$normallinkcolor . ";\r\n" : "";


		// construct variable names
		$hoverlinkactivation = $prefix . 'hoverlinkactivation';
		$hoverlinkfontbold = $prefix . 'hoverlinkfontbold';
		$hoverlinkfontitalic = $prefix . 'hoverlinkfontitalic';
		$hoverlinkfontunderline = $prefix . 'hoverlinkfontunderline';
		$hoverlinkfontuppercase = $prefix . 'hoverlinkfontuppercase';
		$hoverlinkcolor = $prefix . 'hoverlinkcolor';

		$css['hoverlinkfontbold'] = "";
		$css['hoverlinkfontitalic'] = "";
		$css['hoverlinkfontunderline'] = "";
		$css['hoverlinkfontuppercase'] = "";

		if (isset($fields->$hoverlinkfontbold) AND $fields->$hoverlinkfontbold) {
			if ($fields->$hoverlinkfontbold != 'default')
				$css['hoverlinkfontbold'] = $fields->$hoverlinkfontbold == 'bold' ? "\tfont-weight: bold;\r\n" : "\tfont-weight: normal;\r\n";
		}

		if (isset($fields->$hoverlinkfontitalic) AND $fields->$hoverlinkfontitalic) {
			if ($fields->$hoverlinkfontitalic != 'default')
				$css['hoverlinkfontitalic'] = $fields->$hoverlinkfontitalic == 'italic' ? "\tfont-style: italic;\r\n" : "\tfont-style: normal;\r\n";
		}

		if (isset($fields->$hoverlinkfontunderline) AND $fields->$hoverlinkfontunderline) {
			if ($fields->$hoverlinkfontunderline != 'default')
				$css['hoverlinkfontunderline'] = $fields->$hoverlinkfontunderline == 'underline' ? "\ttext-decoration: underline;\r\n" : "\ttext-decoration: none;\r\n";
		}

		if (isset($fields->$hoverlinkfontuppercase) AND $fields->$hoverlinkfontuppercase) {
			if ($fields->$hoverlinkfontuppercase != 'default')
				$css['hoverlinkfontuppercase'] = $fields->$hoverlinkfontuppercase == 'uppercase' ? "\ttext-transform: uppercase;\r\n" : "\ttext-transform: none;\r\n";
		}

		$css['hoverlinkcolor'] = (isset($fields->$hoverlinkcolor) AND $fields->$hoverlinkcolor) ? "\tcolor: " . $fields->$hoverlinkcolor . ";\r\n" : "";


		$custom = $prefix . 'custom';
		$css['custom'] = (isset($fields->$custom) AND $fields->$custom) ? "\t" . $fields->$custom . "\r\n" : "";

		return $css;
	}

	/**
	* Set the CSS3 animations for the blocks
	*/
	private function genAnimations($fields, $prefix, $id) { 
		if (! isset($fields->{$prefix . 'animfade'})) return; // if no animation field is found, nothing to do here

		// fade, move, rotate, scale, flip?rotateY, replay
		$css = '';
		$transition = Array(); // transition: opacity 0.4s;transition: opacity 0.2s, transform 0.35s;
		$transform0 = Array(); // transform: rotate(45deg);transform: translate3d(0,40px,0);
		$transform100 = Array(); // transform: rotate(45deg);transform: translate3d(0,40px,0);
		$style0 = Array();
		$style100 = Array();
		$duration = isset($fields->{$prefix . 'animdur'}) && $fields->{$prefix . 'animdur'} ? $fields->{$prefix . 'animdur'} . 's' : '1s';
		$delay = isset($fields->{$prefix . 'animdelay'}) && $fields->{$prefix . 'animdelay'} ? $fields->{$prefix . 'animdelay'} . 's' : '0s';
		// fade effect
		if ($fields->{$prefix . 'animfade'} == '1') {
			$transition['fade'] = 'opacity ' . $duration;
			$style0[] = 'opacity: 0';
			$style100[] = 'opacity: 1';
		}
		// move effect
		if ($fields->{$prefix . 'animmove'} == '1') {
			$transition['transform'] = 'transform ' . $duration;
			switch($fields->{$prefix . 'animmovedir'}) {
				case 'ltrck':
				default:
					$transform0[] = 'translate3d(-' . (int)$fields->{$prefix . 'animmovedist'} . 'px,0,0)';
				break;
				case 'rtlck':
					$transform0[] = 'translate3d(' . (int)$fields->{$prefix . 'animmovedist'} . 'px,0,0)';
				break;
				case 'ttbck':
					$transform0[] = 'translate3d(0,-' . (int)$fields->{$prefix . 'animmovedist'} . 'px,0)';
				break;
				case 'bttck':
					$transform0[] = 'translate3d(0,' . (int)$fields->{$prefix . 'animmovedist'} . 'px,0)';
				break;
			}

//			$transform100[] = 'translate3d(0,0,0)';
		}
		// rotate effect
		if ($fields->{$prefix . 'animrot'} == '1') {
			$transition['transform'] = (isset($transition['transform']) && $transition['transform']) ? $transition['transform'] : 'transform ' . $duration;
			$transform0[] = 'rotate(' . $fields->{$prefix . 'animrotrad'} . 'deg)';
			$transform100[] = 'rotate(0deg)';
		}
		// scale effect
		if ($fields->{$prefix . 'animscale'} == '1') {
			$transition['transform'] = (isset($transition['transform']) && $transition['transform']) ? $transition['transform'] : 'transform ' . $duration;
			$transform0[] = 'scale(0)';
			$transform100[] = 'scale(1)';
		}

		if (count($transition)) {
			// start
			$css .= $id . ' {
				-webkit-transition: ' . implode(', ', $transition) . ';
				transition: ' . implode(', ', $transition) . ';

				' . (count($transform0) ? '-webkit-transform: ' . implode(' ', $transform0) . ';
				transform: ' . implode(' ', $transform0) . ';' : '') . '
				' . implode(';', $style0) . ';
				 -webkit-transition-delay: ' . $delay . ';
				transition-delay: ' . $delay . ';
			}
			';
			// end
			$id = str_replace('|ID|', '|ID| .cameravisible', $id);
			$css .= $id . ' {
				' . (count($transform0) ? '-webkit-transform: ' . implode(' ', $transform100) . ';
				transform: ' . implode(' ', $transform100) . ';' : '') . '
				' . implode(';', $style100) . ';
			}';
		}

		return $css;
	}

	/**
	* Set the CSS3 animations for the blocks
	*/
	private function genEffects($fields, $prefix, $id) {
		if (! isset($fields->{$prefix . 'fxopacity'})) return; // if no animation field is found, nothing to do here

		$css = '';
		$style = Array();
		$transition = Array();
		$transform = Array();
		$filter = Array();
		$fxdur = isset($fields->{$prefix . 'fxdur'}) ? $fields->{$prefix . 'fxdur'} : 0;
		$duration = isset($fields->{$prefix . 'fxdur'}) && $fields->{$prefix . 'fxdur'} ? $fields->{$prefix . 'fxdur'} . 's' : '0s';
		$delay = isset($fields->{$prefix . 'fxdelay'}) && $fields->{$prefix . 'fxdelay'} ? $fields->{$prefix . 'fxdelay'} . 's' : '0s';

		// fade effect
		if (isset($fields->{$prefix . 'fxopacity'}) && $fields->{$prefix . 'fxopacity'} != '') {
			if ($fxdur) {
				$transition['fade'] = 'opacity ' . $duration;
			}
			$style[] = 'opacity: ' . $fields->{$prefix . 'fxopacity'};
		}

		// move effect
		if (isset($fields->{$prefix . 'fxmovedist'}) && $fields->{$prefix . 'fxmovedist'} != '') {
			if ($fxdur) {
				$transition['transform'] = 'transform ' . $duration;
			}
			switch($fields->{$prefix . 'fxmovedir'}) {
				case 'ltrck':
				default:
					$transform[] = 'translate3d(-' . (int)$fields->{$prefix . 'fxmovedist'} . 'px,0,0)';
				break;
				case 'rtlck':
					$transform[] = 'translate3d(' . (int)$fields->{$prefix . 'fxmovedist'} . 'px,0,0)';
				break;
				case 'ttbck':
					$transform[] = 'translate3d(0,-' . (int)$fields->{$prefix . 'fxmovedist'} . 'px,0)';
				break;
				case 'bttck':
					$transform[] = 'translate3d(0,' . (int)$fields->{$prefix . 'fxmovedist'} . 'px,0)';
				break;
			}
		}
		// rotate effect
		if (isset($fields->{$prefix . 'fxrotrad'}) && $fields->{$prefix . 'fxrotrad'} != '' && $fields->{$prefix . 'fxrot'} == '1') {
			if ($fxdur) $transition['transform'] = (isset($transition['transform']) && $transition['transform']) ? $transition['transform'] : 'transform ' . $duration;
			$transform[] = 'rotate(' . $fields->{$prefix . 'fxrotrad'} . 'deg)';
		}
		// scale effect
		if (isset($fields->{$prefix . 'fxscale'}) && $fields->{$prefix . 'fxscale'} != '') {
			if ($fxdur) $transition['transform'] = (isset($transition['transform']) && $transition['transform']) ? $transition['transform'] : 'transform ' . $duration;
			$transform[] = 'scale(' . $fields->{$prefix . 'fxscale'} . ')';
		}
		// blur effect
		if (isset($fields->{$prefix . 'fxblur'}) && $fields->{$prefix . 'fxblur'} != '') {
			if ($fxdur) $transition['filter'] = (isset($transition['filter']) && $transition['filter']) ? $transition['filter'] : 'filter ' . $duration;
			$filter[] = 'blur(' . $fields->{$prefix . 'fxblur'} . 'px)';
		}
		// brightness effect
		if (isset($fields->{$prefix . 'fxbrightness'}) && $fields->{$prefix . 'fxbrightness'} != '') {
			if ($fxdur) $transition['filter'] = (isset($transition['filter']) && $transition['filter']) ? $transition['filter'] : 'filter ' . $duration;
			$filter[] = 'brightness(' . $fields->{$prefix . 'fxbrightness'} . ')';
		}
		// grayscale effect
		if (isset($fields->{$prefix . 'fxgrayscale'}) && $fields->{$prefix . 'fxgrayscale'} != '') {
			if ($fxdur) $transition['filter'] = (isset($transition['filter']) && $transition['filter']) ? $transition['filter'] : 'filter ' . $duration;
			$filter[] = 'grayscale(' . $fields->{$prefix . 'fxgrayscale'} . ')';
		}

		if (count($transition)) {
			// start
			$css .= $id . ' {
				' . ($prefix == 'slidehover' || $prefix == 'slideactive' ? 'z-index: 1;' : '') . '
				-webkit-transition: ' . implode(', ', $transition) . ';
				transition: ' . implode(', ', $transition) . ';
				filter: ' . implode(' ', $filter) . ';

				' . (count($transform) ? '-webkit-transform: ' . implode(' ', $transform) . ';
				transform: ' . implode(' ', $transform) . ';' : '') . '
				' . implode(';', $style) . ';
				 -webkit-transition-delay: ' . $delay . ';
				transition-delay: ' . $delay . ';
			}
			';
		} else {
			$css .= $id . ' {
				' . ($prefix == 'slidehover' || $prefix == 'slideactive' ? 'z-index: 1;' : '') . '
				' . (count($transform) ? '-webkit-transform: ' . implode(' ', $transform) . ';
				transform: ' . implode(' ', $transform) . ';' : '') . '
				filter: ' . implode(' ', $filter) . ';
				' . implode(';', $style) . ';
			}
			';
		}

		return $css;
	}
		/**
	 * Test if there is already a unit, else add the px
	 *
	 * @param string $value
	 * @return string
	 */
	function testUnit($value, $defaultunit = "px") {

		if ((stristr($value, 'px')) OR (stristr($value, 'em')) OR (stristr($value, '%')) OR $value == 'auto')
			return $value;

		return $value . $defaultunit;
	}

	/**
	 * Convert a hexa decimal color code to its RGB equivalent
	 *
	 * @param string $hexStr (hexadecimal color value)
	 * @param boolean $returnAsString (if set true, returns the value separated by the separator character. Otherwise returns associative array)
	 * @param string $seperator (to separate RGB values. Applicable only if second parameter is true.)
	 * @return array or string (depending on second parameter. Returns False if invalid hex color value)
	 */
	function hex2RGB($hexStr, $opacity) {
		$opacity = $opacity <= 1 ? $opacity : $opacity / 100;
		$hexStr = preg_replace("/[^0-9A-Fa-f]/", '', $hexStr); // Gets a proper hex string
		$rgbArray = array();
		if (strlen($hexStr) == 6) { //If a proper hex code, convert using bitwise operation. No overhead... faster
			$colorVal = hexdec($hexStr);
			$rgbArray['red'] = 0xFF & ($colorVal >> 0x10);
			$rgbArray['green'] = 0xFF & ($colorVal >> 0x8);
			$rgbArray['blue'] = 0xFF & $colorVal;
		} elseif (strlen($hexStr) == 3) { //if shorthand notation, need some string manipulations
			$rgbArray['red'] = hexdec(str_repeat(substr($hexStr, 0, 1), 2));
			$rgbArray['green'] = hexdec(str_repeat(substr($hexStr, 1, 1), 2));
			$rgbArray['blue'] = hexdec(str_repeat(substr($hexStr, 2, 1), 2));
		} else {
			return false; //Invalid hex color code
		}
		$rgbacolor = "rgba(" . $rgbArray['red'] . "," . $rgbArray['green'] . "," . $rgbArray['blue'] . "," . $opacity . ")";

		return $rgbacolor;
	}
}


components/com_slideshowck/helpers/ckframework.php000060400000006145152453623440016606 0ustar00<?php
/**
 * @name		CK Framework
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */
namespace Slideshowck;

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

require_once 'ckuri.php';

//use Joomla\CMS\Language\Text as CKText;
// use Joomla\CMS\Uri\Uri as CKUri;
use \Slideshowck\CKUri;

/**
 * Framework Helper
 */
class CKFramework {

	private static $assetsPath = '/media/com_slideshowck/assets';

	private static $version = '1.0.0';

	private static $doload;

	public static function init() {
		global $ckframeworkloaded;
		global $ckframeworkloadedversion;

		// if the framework is already loaded with a same or better version, do nothing
		if ($ckframeworkloaded && version_compare($ckframeworkloadedversion, self::$version, '>=')) {
			self::$doload = false;
		}

		self::$doload = true;
	}

	public static function getInline() {
		if (self::$doload === false) return '';

		$assets = self::getInlineCss() . self::getInlineJs();

		return $assets;
	}

	public static function getInlineCss() {
		if (self::$doload === false) return '';

		$assets = '<link rel="stylesheet" href="' . CKUri::root(true) . self::$assetsPath . '/ckframework.css" type="text/css" />';

		return $assets;
	}

	public static function getInlineJs() {
		if (self::$doload === false) return '';

		$assets = '<script src="' . CKUri::root(true) . self::$assetsPath . '/ckframework.js" type="text/javascript"></script>';

		return $assets;
	}

	public static function loadInline() {
		echo self::getInline();
	}

	public static function load() {
		if (self::$doload === false) return;

		\Joomla\CMS\HTML\HTMLHelper::_('jquery.framework');
		$doc = \Joomla\CMS\Factory::getDocument();
		$doc->addStylesheet(CKUri::root(true) . self::$assetsPath . '/ckframework.css');
		$doc->addScript(CKUri::root(true) . self::$assetsPath . '/ckframework.js');
	}

	public static function loadCss() {
		if (self::$doload === false) return;

		$doc = \Joomla\CMS\Factory::getDocument();
		$doc->addStylesheet(CKUri::root(true) . self::$assetsPath . '/ckframework.css');
	}

	public static function loadJs() {
		if (self::$doload === false) return;

		$doc = \Joomla\CMS\Factory::getDocument();
		$doc->addScript(CKUri::root(true) . self::$assetsPath . '/ckframework.js');
	}

	public static function getFaIconsInline() {
		return '<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous" />';
	}

	public static function loadFaIconsInline() {
		echo self::getFaIconsInline();
	}

	/*
	 * Load the JS and CSS files needed to use CKBox
	 *
	 * Return void
	 */
	public static function loadCkbox() {
		$doc = \Joomla\CMS\Factory::getDocument();
		\Joomla\CMS\HTML\HTMLHelper::_('jquery.framework');
		$doc->addStyleSheet(CKUri::root(true) . self::$assetsPath . '/ckbox.css');
		$doc->addScript(CKUri::root(true) . self::$assetsPath . '/ckbox.js');
	}
}

CKFramework::init();components/com_slideshowck/helpers/ckinterface.php000060400000120236152453623440016547 0ustar00<?php
/**
 * @name		Slider CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2016. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - http://www.template-creator.com - http://www.joomlack.fr
 */
namespace Slideshowck;

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Slideshowck\CKUri;

class CKInterface extends \stdClass {

	public $imagespath;
	
	public $colorpicker_class = 'color {required:false,pickerPosition:\'top\',pickerBorder:2,pickerInset:3,hash:true}';

	public function __construct($properties = null) {
		$this->imagespath = SLIDESHOWCK_MEDIA_URI . '/images';
	}

	public function createAll($prefix) {
		?>
		<div class="ckheading"><?php echo CKText::_('CK_TEXT_LABEL'); ?></div>
		<?php
		$this->createText($prefix);
		?>
		<div class="ckheading"><?php echo CKText::_('CK_APPEARANCE_LABEL'); ?></div>
		<?php
		$this->createBackgroundColor($prefix);
		$this->createBackgroundImage($prefix);
		$this->createBorders($prefix);
		$this->createRoundedCorners($prefix);
		$this->createShadow($prefix);
		// $this->createTextShadow($prefix);
		?>
		<div class="ckheading"><?php echo CKText::_('CK_DIMENSIONS_LABEL'); ?></div>
		<?php
		$this->createMargins($prefix);
		$this->createDimensions($prefix);
		/*
		?>
		<!--<div class="ckheading"><?php echo CKText::_('CK_ANIMATIONS_LABEL'); ?></div>-->
		<?php 
		$this->createAnimations($prefix);*/
	}

	public function createBackgroundColor($prefix) {
	?>
	<div class="ckrow">
		<label for="<?php echo $prefix; ?>backgroundcolorstart"><?php echo CKText::_('CK_BGCOLOR_LABEL'); ?></label>
		<img class="ckicon" src="<?php echo $this->imagespath ?>/color.png" />
		<input type="text" id="<?php echo $prefix; ?>backgroundcolorstart" name="<?php echo $prefix; ?>backgroundcolorstart" class="cktip <?php echo $prefix; ?> <?php echo $this->colorpicker_class; ?>" title="<?php echo CKText::_('CK_BGCOLOR_DESC'); ?>"/>
		<img class="ckicon" src="<?php echo $this->imagespath ?>/color.png" />
		<input type="text" id="<?php echo $prefix; ?>backgroundcolorend" name="<?php echo $prefix; ?>backgroundcolorend" class="cktip <?php echo $prefix; ?> <?php echo $this->colorpicker_class; ?>" title="<?php echo CKText::_('CK_BGCOLOR2_DESC'); ?>" onchange="ckCheckGradientImageConflict(this, '<?php echo $prefix; ?>backgroundimageurl')"/>
		<img class="ckicon" src="<?php echo $this->imagespath ?>/layers.png" />
		<input type="text" id="<?php echo $prefix; ?>backgroundopacity" name="<?php echo $prefix; ?>backgroundopacity" class="cktip <?php echo $prefix; ?>" style="width:45px;" title="<?php echo CKText::_('CK_BGOPACITY_DESC'); ?>"/>
	</div>
	<?php
	}
	
	public function createBackgroundImage($prefix) {
	?>
	<div class="ckrow">
		<label for="<?php echo $prefix; ?>backgroundimageurl"><?php echo CKText::_('CK_BACKGROUNDIMAGE_LABEL'); ?></label>
		<img class="ckicon" src="<?php echo $this->imagespath ?>/image.png" />
		<div class="ckbutton-group">
			<input type="text" id="<?php echo $prefix; ?>backgroundimageurl" name="<?php echo $prefix; ?>backgroundimageurl" class="cktip <?php echo $prefix; ?>" title="<?php echo CKText::_('CK_BACKGROUNDIMAGE_DESC'); ?>" onchange="ckCheckGradientImageConflict(this, '<?php echo $prefix; ?>backgroundcolorend')" style="max-width: none; width: 150px;"/>
			<a class="ckbutton" onclick="ckCallImageManagerPopup('<?php echo $prefix; ?>backgroundimageurl')" href="javascript:void(0)" ><?php echo CKText::_('CK_SELECT'); ?></a>
			<a class="ckbutton" href="javascript:void(0)" onclick="$ck(this).parent().find('input').val('');"><?php echo CKText::_('CK_CLEAR'); ?></a>
		</div>
	</div>
	<div class="ckrow">
		<label></label>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/offsetx.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>backgroundimageleft" name="<?php echo $prefix; ?>backgroundimageleft" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_BACKGROUNDPOSITIONX_DESC'); ?>" /></span>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/offsety.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>backgroundimagetop" name="<?php echo $prefix; ?>backgroundimagetop" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_BACKGROUNDPOSITIONY_DESC'); ?>" /></span>
		<div class="ckbutton-group">
			<input class="" type="radio" value="repeat" id="<?php echo $prefix; ?>backgroundimagerepeat" name="<?php echo $prefix; ?>backgroundimagerepeat" class="<?php echo $prefix; ?>" />
			<label class="ckbutton first" for="<?php echo $prefix; ?>backgroundimagerepeat"><img class="ckicon" src="<?php echo $this->imagespath ?>/bg_repeat.png" />
			</label><input class="<?php echo $prefix; ?>" type="radio" value="repeat-x" id="<?php echo $prefix; ?>backgroundimagerepeat-x" name="<?php echo $prefix; ?>backgroundimagerepeat" />
			<label class="ckbutton"  for="<?php echo $prefix; ?>backgroundimagerepeat-x"><img class="ckicon" src="<?php echo $this->imagespath ?>/bg_repeat-x.png" />
			</label><input class="<?php echo $prefix; ?>" type="radio" value="repeat-y" id="<?php echo $prefix; ?>backgroundimagerepeat-y" name="<?php echo $prefix; ?>backgroundimagerepeat" />
			<label class="ckbutton last"  for="<?php echo $prefix; ?>backgroundimagerepeat-y"><img class="ckicon" src="<?php echo $this->imagespath ?>/bg_repeat-y.png" />
			</label><input class="<?php echo $prefix; ?>" type="radio" value="no-repeat" id="<?php echo $prefix; ?>backgroundimagerepeatno-repeat" name="<?php echo $prefix; ?>backgroundimagerepeat" />
			<label class="ckbutton last"  for="<?php echo $prefix; ?>backgroundimagerepeatno-repeat"><img class="ckicon" src="<?php echo $this->imagespath ?>/bg_no-repeat.png" /></label>
		</div>
	</div>
	<?php
	}
	public function createRoundedCorners($prefix) {
	?>
	<div class="ckrow">
		<label for="<?php echo $prefix; ?>borderradiustopleft"><?php echo CKText::_('CK_ROUNDEDCORNERS_LABEL'); ?></label>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/border_radius_tl.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>borderradiustopleft" name="<?php echo $prefix; ?>borderradiustopleft" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_ROUNDEDCORNERSTL_DESC'); ?>" /></span>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/border_radius_tr.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>borderradiustopright" name="<?php echo $prefix; ?>borderradiustopright" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_ROUNDEDCORNERSTR_DESC'); ?>" /></span>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/border_radius_br.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>borderradiusbottomright" name="<?php echo $prefix; ?>borderradiusbottomright" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_ROUNDEDCORNERSBR_DESC'); ?>" /></span>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/border_radius_bl.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>borderradiusbottomleft" name="<?php echo $prefix; ?>borderradiusbottomleft" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_ROUNDEDCORNERSBL_DESC'); ?>" /></span>
	</div>
	<?php
	}
	public function createShadow($prefix) {
	?>
	<div class="ckrow">
		<label for="<?php echo $prefix; ?>shadowcolor"><?php echo CKText::_('CK_SHADOW_LABEL'); ?></label>
		<img class="ckicon" src="<?php echo $this->imagespath ?>/color.png" />
		<span><input type="text" id="<?php echo $prefix; ?>shadowcolor" name="<?php echo $prefix; ?>shadowcolor" class="<?php echo $prefix; ?> <?php echo $this->colorpicker_class; ?>" /></span>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/shadow_blur.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>shadowblur" name="<?php echo $prefix; ?>shadowblur" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_SHADOWBLUR_DESC'); ?>" /></span>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/shadow_spread.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>shadowspread" name="<?php echo $prefix; ?>shadowspread" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_SHADOWSPREAD_DESC'); ?>" /></span>
	</div>
	<div class="ckrow">
		<label></label>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/offsetx.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>shadowoffseth" name="<?php echo $prefix; ?>shadowoffseth" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_OFFSETX_DESC'); ?>" /></span>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/offsety.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>shadowoffsetv" name="<?php echo $prefix; ?>shadowoffsetv" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_OFFSETY_DESC'); ?>" /></span>
		<div class="ckbutton-group">
			<input class="<?php echo $prefix; ?>" type="radio" value="0" id="<?php echo $prefix; ?>shadowinsetno" name="<?php echo $prefix; ?>shadowinset" />
			<label class="ckbutton last"  for="<?php echo $prefix; ?>shadowinsetno" style="width:auto;"><?php echo CKText::_('CK_OUT'); ?>
			</label><input class="<?php echo $prefix; ?>" type="radio" value="1" id="<?php echo $prefix; ?>shadowinsetyes" name="<?php echo $prefix; ?>shadowinset" />
			<label class="ckbutton last"  for="<?php echo $prefix; ?>shadowinsetyes" style="width:auto;"><?php echo CKText::_('CK_IN'); ?></label>
		</div>
	</div>
	<?php
	}
	public function createTextShadow($prefix) {
	?>
	<div class="ckrow">
		<label for="<?php echo $prefix; ?>textshadowcolor"><?php echo CKText::_('CK_TEXTSHADOW_LABEL'); ?></label>
		<img class="ckicon" src="<?php echo $this->imagespath ?>/color.png" />
		<span><input type="text" id="<?php echo $prefix; ?>textshadowcolor" name="<?php echo $prefix; ?>textshadowcolor" class="<?php echo $prefix; ?> <?php echo $this->colorpicker_class; ?>" /></span>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/shadow_blur.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>textshadowblur" name="<?php echo $prefix; ?>textshadowblur" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_SHADOWBLUR_DESC'); ?>" /></span>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/offsetx.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>textshadowoffsetx" name="<?php echo $prefix; ?>textshadowoffsetx" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_OFFSETX_DESC'); ?>" /></span>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/offsety.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>textshadowoffsety" name="<?php echo $prefix; ?>textshadowoffsety" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_OFFSETY_DESC'); ?>" /></span>
	</div>
	<?php
	}

	public function createDimensions($prefix) {
	?>
	<div class="ckrow">
		<label for="<?php echo $prefix; ?>width"><?php echo CKText::_('CK_WIDTH_LABEL'); ?></label>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/width.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>width" name="<?php echo $prefix; ?>width" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_WIDTH_DESC'); ?>" /></span>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/height.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>height" name="<?php echo $prefix; ?>height" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_HEIGHT_DESC'); ?>" /></span>
	</div>
	<?php
	}

	public function createMargins($prefix, $margin = true, $padding = true) {
	?>
	<?php if ($margin) { ?>
	<div class="ckrow">
		<label for="<?php echo $prefix; ?>margintop"><?php echo CKText::_('CK_MARGIN_LABEL'); ?></label>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/margin_top.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>margintop" name="<?php echo $prefix; ?>margintop" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_MARGINTOP_DESC'); ?>" /></span>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/margin_right.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>marginright" name="<?php echo $prefix; ?>marginright" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_MARGINRIGHT_DESC'); ?>" /></span>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/margin_bottom.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>marginbottom" name="<?php echo $prefix; ?>marginbottom" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_MARGINBOTTOM_DESC'); ?>" /></span>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/margin_left.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>marginleft" name="<?php echo $prefix; ?>marginleft" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_MARGINLEFT_DESC'); ?>" /></span>
	</div>
	<?php } ?>
	<?php if ($padding) { ?>
	<div class="ckrow">
		<label for="<?php echo $prefix; ?>paddingtop"><?php echo CKText::_('CK_PADDING_LABEL'); ?></label>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/padding_top.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>paddingtop" name="<?php echo $prefix; ?>paddingtop" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_PADDINGTOP_DESC'); ?>" /></span>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/padding_right.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>paddingright" name="<?php echo $prefix; ?>paddingright" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_PADDINGRIGHT_DESC'); ?>" /></span>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/padding_bottom.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>paddingbottom" name="<?php echo $prefix; ?>paddingbottom" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_PADDINGBOTTOM_DESC'); ?>" /></span>
		<span><img class="ckicon" src="<?php echo $this->imagespath ?>/padding_left.png" /></span><span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>paddingleft" name="<?php echo $prefix; ?>paddingleft" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_PADDINGLEFT_DESC'); ?>" /></span>
	</div>
	<?php } ?>
	<?php
	}

	public function createBorders($prefix) {
	?>
	<div class="ckrow">
		<label for="<?php echo $prefix; ?>bordertopcolor"><?php echo CKText::_('CK_BORDERCOLOR_LABEL'); ?></label>
		<img class="ckicon" src="<?php echo $this->imagespath ?>/color.png" />
		<span><input type="text" id="<?php echo $prefix; ?>bordertopcolor" name="<?php echo $prefix; ?>bordertopcolor" class="<?php echo $prefix; ?> <?php echo $this->colorpicker_class; ?>" title="<?php echo CKText::_('CK_BORDERCOLOR_DESC'); ?>"/></span>
		<span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>bordertopsize" name="<?php echo $prefix; ?>bordertopsize" class="<?php echo $prefix; ?> cktip" style="width:45px;border-top-color:#237CA4;" title="<?php echo CKText::_('CK_BORDERTOPWIDTH_DESC'); ?>" /></span>
		<span>
			<select id="<?php echo $prefix; ?>bordertopstyle" name="<?php echo $prefix; ?>bordertopstyle" class="<?php echo $prefix; ?> cktip" style="width: 70px; border-radius: 0px;">
				<option value="solid">solid</option>
				<option value="dotted">dotted</option>
				<option value="dashed">dashed</option>
			</select>
		</span>
	</div>
	<div class="ckrow">
		<label></label>
		<img class="ckicon" src="<?php echo $this->imagespath ?>/color.png" />
		<span><input type="text" id="<?php echo $prefix; ?>borderrightcolor" name="<?php echo $prefix; ?>borderrightcolor" class="<?php echo $prefix; ?> <?php echo $this->colorpicker_class; ?>" title="<?php echo CKText::_('CK_BORDERCOLOR_DESC'); ?>"/></span>
		<span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>borderrightsize" name="<?php echo $prefix; ?>borderrightsize" class="<?php echo $prefix; ?> cktip" style="width:45px;border-right-color:#237CA4;" title="<?php echo CKText::_('CK_BORDERRIGHTWIDTH_DESC'); ?>" /></span>
		<span>
			<select id="<?php echo $prefix; ?>borderrightstyle" name="<?php echo $prefix; ?>borderrightstyle" class="<?php echo $prefix; ?> cktip" style="width: 70px; border-radius: 0px;">
				<option value="solid">solid</option>
				<option value="dotted">dotted</option>
				<option value="dashed">dashed</option>
			</select>
		</span>
	</div>
	<div class="ckrow">
		<label></label>
		<img class="ckicon" src="<?php echo $this->imagespath ?>/color.png" />
		<span><input type="text" id="<?php echo $prefix; ?>borderbottomcolor" name="<?php echo $prefix; ?>borderbottomcolor" class="<?php echo $prefix; ?> <?php echo $this->colorpicker_class; ?>" title="<?php echo CKText::_('CK_BORDERCOLOR_DESC'); ?>"/></span>
		<span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>borderbottomsize" name="<?php echo $prefix; ?>borderbottomsize" class="<?php echo $prefix; ?> cktip" style="width:45px;border-bottom-color:#237CA4;" title="<?php echo CKText::_('CK_BORDERBOTTOMWIDTH_DESC'); ?>" /></span>
		<span>
			<select id="<?php echo $prefix; ?>borderbottomstyle" name="<?php echo $prefix; ?>borderbottomstyle" class="<?php echo $prefix; ?> cktip" style="width: 70px; border-radius: 0px;">
				<option value="solid">solid</option>
				<option value="dotted">dotted</option>
				<option value="dashed">dashed</option>
			</select>
		</span>
	</div>
	<div class="ckrow">
		<label></label>
		<img class="ckicon" src="<?php echo $this->imagespath ?>/color.png" />
		<span><input type="text" id="<?php echo $prefix; ?>borderleftcolor" name="<?php echo $prefix; ?>borderleftcolor" class="<?php echo $prefix; ?> <?php echo $this->colorpicker_class; ?>" title="<?php echo CKText::_('CK_BORDERCOLOR_DESC'); ?>"/></span>
		<span style="width:45px;"><input type="text" id="<?php echo $prefix; ?>borderleftsize" name="<?php echo $prefix; ?>borderleftsize" class="<?php echo $prefix; ?> cktip" style="width:45px;border-left-color:#237CA4;" title="<?php echo CKText::_('CK_BORDERLEFTWIDTH_DESC'); ?>" /></span>
		<span>
			<select id="<?php echo $prefix; ?>borderleftstyle" name="<?php echo $prefix; ?>borderleftstyle" class="<?php echo $prefix; ?> cktip" style="width: 70px; border-radius: 0px;">
				<option value="solid">solid</option>
				<option value="dotted">dotted</option>
				<option value="dashed">dashed</option>
			</select>
		</span>
	</div>
	<?php
	}

	public function createText($prefix) { 
	?>
	<div class="ckrow">
		<label for="<?php echo $prefix; ?>textgfont"><?php echo CKText::_('CK_FONTSTYLE_LABEL'); ?></label>
		<img class="ckicon" src="<?php echo $this->imagespath ?>/font_add.png" />
		<input type="text" id="<?php echo $prefix; ?>textgfont" name="<?php echo $prefix; ?>textgfont" class="<?php echo $prefix; ?> cktip gfonturl" title="<?php echo CKText::_('CK_GFONT_DESC'); ?>" style="max-width:none;width:250px;" />
		<input type="hidden" id="<?php echo $prefix; ?>textisgfont" name="<?php echo $prefix; ?>textisgfont" class="isgfont <?php echo $prefix; ?>" />
	</div>
	<div class="ckrow">
		<label></label>
		<img class="ckicon" src="<?php echo $this->imagespath ?>/style.png" />
		<input type="text" id="<?php echo $prefix; ?>fontsize" name="<?php echo $prefix; ?>fontsize" class="<?php echo $prefix; ?> cktip" style="width:45px;" title="<?php echo CKText::_('CK_FONTSIZE_DESC'); ?>" />
		<img class="ckicon" src="<?php echo $this->imagespath ?>/color.png" />
		<span><?php echo CKText::_('CK_NORMAL'); ?></span>
		<input type="text" id="<?php echo $prefix; ?>color" name="<?php echo $prefix; ?>color" class="<?php echo $prefix; ?> cktip <?php echo $this->colorpicker_class; ?>" title="<?php echo CKText::_('CK_FONTCOLOR_DESC'); ?>" />
	</div>
	<div class="ckrow">
		<label for="">&nbsp;</label><img class="ckicon" src="<?php echo $this->imagespath ?>/font.png" />
		<div class="ckbutton-group">
			<input class="<?php echo $prefix; ?>" type="radio" value="left" id="<?php echo $prefix; ?>textalignleft" name="<?php echo $prefix; ?>textalign" />
			<label class="ckbutton first" for="<?php echo $prefix; ?>textalignleft"><img class="ckicon" src="<?php echo $this->imagespath ?>/text_align_left.png" />
			</label><input class="<?php echo $prefix; ?>" type="radio" value="center" id="<?php echo $prefix; ?>textaligncenter" name="<?php echo $prefix; ?>textalign" />
			<label class="ckbutton"  for="<?php echo $prefix; ?>textaligncenter"><img class="ckicon" src="<?php echo $this->imagespath ?>/text_align_center.png" />
			</label><input class="<?php echo $prefix; ?>" type="radio" value="right" id="<?php echo $prefix; ?>textalignright" name="<?php echo $prefix; ?>textalign" />
			<label class="ckbutton last"  for="<?php echo $prefix; ?>textalignright"><img class="ckicon" src="<?php echo $this->imagespath ?>/text_align_right.png" /></label>
		</div>
		<div class="ckbutton-group">
			<input class="<?php echo $prefix; ?>" type="radio" value="lowercase" id="<?php echo $prefix; ?>texttransformlowercase" name="<?php echo $prefix; ?>texttransform" />
			<label class="ckbutton first cktip" title="<?php echo CKText::_('CK_LOWERCASE'); ?>" for="<?php echo $prefix; ?>texttransformlowercase"><img class="ckicon" src="<?php echo $this->imagespath ?>/text_lowercase.png" />
			</label><input class="<?php echo $prefix; ?>" type="radio" value="uppercase" id="<?php echo $prefix; ?>texttransformuppercase" name="<?php echo $prefix; ?>texttransform" />
			<label class="ckbutton cktip" title="<?php echo CKText::_('CK_UPPERCASE'); ?>" for="<?php echo $prefix; ?>texttransformuppercase"><img class="ckicon" src="<?php echo $this->imagespath ?>/text_uppercase.png" />
			</label><input class="<?php echo $prefix; ?>" type="radio" value="capitalize" id="<?php echo $prefix; ?>texttransformcapitalize" name="<?php echo $prefix; ?>texttransform" />
			<label class="ckbutton cktip" title="<?php echo CKText::_('CK_CAPITALIZE'); ?>" for="<?php echo $prefix; ?>texttransformcapitalize"><img class="ckicon" src="<?php echo $this->imagespath ?>/text_capitalize.png" />
			</label><input class="<?php echo $prefix; ?>" type="radio" value="default" id="<?php echo $prefix; ?>texttransformdefault" name="<?php echo $prefix; ?>texttransform" />
			<label class="ckbutton cktip" title="<?php echo CKText::_('CK_DEFAULT'); ?>" for="<?php echo $prefix; ?>texttransformdefault"><img class="ckicon" src="<?php echo $this->imagespath ?>/text_default.png" />
			</label>
		</div>
	</div>
	<div class="ckrow">
		<label for="<?php echo $prefix; ?>fontweightbold"></label>
		<img class="ckicon" src="<?php echo $this->imagespath ?>/text_bold.png" />
		<div class="ckbutton-group">
			<input class="<?php echo $prefix; ?>" type="radio" value="bold" id="<?php echo $prefix; ?>fontweightbold" name="<?php echo $prefix; ?>fontweight" />
			<label class="ckbutton first cktip" title="" for="<?php echo $prefix; ?>fontweightbold" style="width:auto;"><?php echo CKText::_('CK_BOLD'); ?>
			</label><input class="<?php echo $prefix; ?>" type="radio" value="normal" id="<?php echo $prefix; ?>fontweightnormal" name="<?php echo $prefix; ?>fontweight" />
			<label class="ckbutton cktip" title="" for="<?php echo $prefix; ?>fontweightnormal" style="width:auto;"><?php echo CKText::_('CK_NORMAL'); ?>
			</label>
		</div>
		<img class="ckicon" src="<?php echo $this->imagespath ?>/text_underline.png" />
		<div class="ckbutton-group">
			<input class="<?php echo $prefix; ?>" type="radio" value="underline" id="<?php echo $prefix; ?>fontunderlineunderline" name="<?php echo $prefix; ?>fontunderline" />
			<label class="ckbutton first cktip" title="" for="<?php echo $prefix; ?>fontunderlineunderline" style="width:auto;"><?php echo ucfirst(CKText::_('CK_UNDERLINE')); ?>
			</label><input class="<?php echo $prefix; ?>" type="radio" value="none" id="<?php echo $prefix; ?>fontunderlinenone" name="<?php echo $prefix; ?>fontunderline" />
			<label class="ckbutton cktip" title="" for="<?php echo $prefix; ?>fontunderlinenone" style="width:auto;"><?php echo CKText::_('CK_NORMAL'); ?>
			</label>
		</div>
	</div>
	<?php
	}

	public function createAnimations($prefix) {
	?>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>animdur"><?php echo CKText::_('CK_DURATION'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/hourglass.png" />
			<input class="<?php echo $prefix; ?>" type="text" name="<?php echo $prefix; ?>animdur" id="<?php echo $prefix; ?>animdur" value="1" /> [s]
		</div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>animdelay"><?php echo CKText::_('CK_DELAY'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/hourglass.png" />
			<input class="<?php echo $prefix; ?>" type="text" name="<?php echo $prefix; ?>animdelay" id="<?php echo $prefix; ?>animdelay" value="0" /> [s]
		</div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>animfade"><?php echo CKText::_('CK_FADE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/shading.png" />
			<select class="<?php echo $prefix; ?>" type="list" name="<?php echo $prefix; ?>animfade" id="<?php echo $prefix; ?>animfade" value="" style="width: 100px;" >
				<option value="0"><?php echo CKText::_('JNO'); ?></option>
				<option value="1"><?php echo CKText::_('JYES'); ?></option>
			</select>
		</div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>animmove"><?php echo CKText::_('CK_MOVE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/shape_square_go.png" />
			<select class="<?php echo $prefix; ?>" type="list" name="<?php echo $prefix; ?>animmove" id="<?php echo $prefix; ?>animmove" value="" style="width: 100px;" >
				<option value="0"><?php echo CKText::_('JNO'); ?></option>
				<option value="1"><?php echo CKText::_('JYES'); ?></option>
			</select>
			<select class="<?php echo $prefix; ?> cktip" title="<?php echo CKText::_('CK_DIRECTION'); ?>" type="list" name="<?php echo $prefix; ?>animmovedir" id="<?php echo $prefix; ?>animmovedir" value="" style="width: 100px;" >
				<option value="ltrck"><?php echo CKText::_('CK_LEFT_TO_RIGHT'); ?></option>
				<option value="rtlck"><?php echo CKText::_('CK_RIGHT_TO_LEFT'); ?></option>
				<option value="ttbck"><?php echo CKText::_('CK_TOP_TO_BOTTOM'); ?></option>
				<option value="bttck"><?php echo CKText::_('CK_BOTTOM_TO_TOP'); ?></option>
			</select>
			<input class="<?php echo $prefix; ?> cktip" title="<?php echo CKText::_('CK_DISTANCE'); ?>" type="text" name="<?php echo $prefix; ?>animmovedist" id="<?php echo $prefix; ?>animmovedist" value="40" /> [px]
		</div>
		
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>animrot"><?php echo CKText::_('CK_ROTATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/shape_rotate_clockwise.png" />
			<select class="<?php echo $prefix; ?>" type="list" name="<?php echo $prefix; ?>animrot" id="<?php echo $prefix; ?>animrot" value="" style="width: 100px;" >
				<option value="0"><?php echo CKText::_('JNO'); ?></option>
				<option value="1"><?php echo CKText::_('JYES'); ?></option>
			</select>
			<select class="<?php echo $prefix; ?>" type="list" name="<?php echo $prefix; ?>animrotrad" id="<?php echo $prefix; ?>animrotrad" value="" style="width: 100px;" >
				<option value="45">45°</option>
				<option value="90">90°</option>
				<option value="180">180°</option>
				<option value="270">270°</option>
				<option value="360">360°</option>
			</select>
		</div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>animscale"><?php echo CKText::_('CK_SCALE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/shape_handles.png" />
			<select class="<?php echo $prefix; ?>" type="list" name="<?php echo $prefix; ?>animscale" id="<?php echo $prefix; ?>animscale" value="" style="width:100px;" >
				<option value="0"><?php echo CKText::_('JNO'); ?></option>
				<option value="1"><?php echo CKText::_('JYES'); ?></option>
			</select>
		</div>
		<div class="ckrow">
			<a class="ckbutton" href="javascript:void(0)" onclick="ckPlayAnimationPreview('<?php echo $prefix; ?>')"><i class="icon icon-play"></i><?php echo CKText::_('CK_PLAY_ANIMATION'); ?></a>
		</div>
	<?php
	}

	public function createEffects($prefix) {
	?>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>fxdur"><?php echo CKText::_('CK_DURATION'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/hourglass.png" />
			<input class="<?php echo $prefix; ?>" type="text" name="<?php echo $prefix; ?>fxdur" id="<?php echo $prefix; ?>fxdur" value="1" /> [s]
		</div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>fxdelay"><?php echo CKText::_('CK_DELAY'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/hourglass.png" />
			<input class="<?php echo $prefix; ?>" type="text" name="<?php echo $prefix; ?>fxdelay" id="<?php echo $prefix; ?>fxdelay" value="0" /> [s]
		</div>
		<div class="ckheading"><?php echo CKText::_('CK_OPACITY'); ?></div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>fxopacity"><?php echo CKText::_('CK_NORMAL_STATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/shading.png" />
			<input class="<?php echo $prefix; ?>" type="text" name="<?php echo $prefix; ?>fxopacity" id="<?php echo $prefix; ?>fxopacity" value="" >
		</div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>fxopacity"><?php echo CKText::_('CK_HOVER_STATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/shading.png" />
			<input class="<?php echo $prefix; ?>" type="text" name="<?php echo $prefix; ?>hoverfxopacity" id="<?php echo $prefix; ?>hoverfxopacity" value="" >
		</div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>fxopacity"><?php echo CKText::_('CK_ACTIVE_STATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/shading.png" />
			<input class="<?php echo $prefix; ?>" type="text" name="<?php echo $prefix; ?>activefxopacity" id="<?php echo $prefix; ?>activefxopacity" value="" >
		</div>
		<div class="ckheading"><?php echo CKText::_('CK_MOVE'); ?></div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>fxmove"><?php echo CKText::_('CK_NORMAL_STATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/shape_square_go.png" />
			<select class="<?php echo $prefix; ?> cktip" title="<?php echo CKText::_('CK_DIRECTION'); ?>" type="list" name="<?php echo $prefix; ?>fxmovedir" id="<?php echo $prefix; ?>fxmovedir" value="" style="width: 100px;" >
				<option value="ltrck"><?php echo CKText::_('CK_LEFT_TO_RIGHT'); ?></option>
				<option value="rtlck"><?php echo CKText::_('CK_RIGHT_TO_LEFT'); ?></option>
				<option value="ttbck"><?php echo CKText::_('CK_TOP_TO_BOTTOM'); ?></option>
				<option value="bttck"><?php echo CKText::_('CK_BOTTOM_TO_TOP'); ?></option>
			</select>
			<input class="<?php echo $prefix; ?> cktip" title="<?php echo CKText::_('CK_DISTANCE'); ?>" type="text" name="<?php echo $prefix; ?>fxmovedist" id="<?php echo $prefix; ?>fxmovedist" value="" /> [px]
		</div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>hoverfxmove"><?php echo CKText::_('CK_HOVER_STATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/shape_square_go.png" />
			<select class="<?php echo $prefix; ?>hover cktip" title="<?php echo CKText::_('CK_DIRECTION'); ?>" type="list" name="<?php echo $prefix; ?>hoverfxmovedir" id="<?php echo $prefix; ?>hoverfxmovedir" value="" style="width: 100px;" >
				<option value="ltrck"><?php echo CKText::_('CK_LEFT_TO_RIGHT'); ?></option>
				<option value="rtlck"><?php echo CKText::_('CK_RIGHT_TO_LEFT'); ?></option>
				<option value="ttbck"><?php echo CKText::_('CK_TOP_TO_BOTTOM'); ?></option>
				<option value="bttck"><?php echo CKText::_('CK_BOTTOM_TO_TOP'); ?></option>
			</select>
			<input class="<?php echo $prefix; ?>hover cktip" title="<?php echo CKText::_('CK_DISTANCE'); ?>" type="text" name="<?php echo $prefix; ?>hoverfxmovedist" id="<?php echo $prefix; ?>hoverfxmovedist" value="" /> [px]
		</div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>activefxmove"><?php echo CKText::_('CK_ACTIVE_STATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/shape_square_go.png" />
			<select class="<?php echo $prefix; ?>active cktip" title="<?php echo CKText::_('CK_DIRECTION'); ?>" type="list" name="<?php echo $prefix; ?>activefxmovedir" id="<?php echo $prefix; ?>activefxmovedir" value="" style="width: 100px;" >
				<option value="ltrck"><?php echo CKText::_('CK_LEFT_TO_RIGHT'); ?></option>
				<option value="rtlck"><?php echo CKText::_('CK_RIGHT_TO_LEFT'); ?></option>
				<option value="ttbck"><?php echo CKText::_('CK_TOP_TO_BOTTOM'); ?></option>
				<option value="bttck"><?php echo CKText::_('CK_BOTTOM_TO_TOP'); ?></option>
			</select>
			<input class="<?php echo $prefix; ?>active cktip" title="<?php echo CKText::_('CK_DISTANCE'); ?>" type="text" name="<?php echo $prefix; ?>activefxmovedist" id="<?php echo $prefix; ?>activefxmovedist" value="" /> [px]
		</div>
		<div class="ckheading"><?php echo CKText::_('CK_ROTATE'); ?></div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>fxrot"><?php echo CKText::_('CK_NORMAL_STATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/shape_rotate_clockwise.png" />
			<select class="<?php echo $prefix; ?>" type="list" name="<?php echo $prefix; ?>fxrot" id="<?php echo $prefix; ?>fxrot" value="" style="width: 100px;" >
				<option value="0"><?php echo CKText::_('JNO'); ?></option>
				<option value="1"><?php echo CKText::_('JYES'); ?></option>
			</select>
			<input class="<?php echo $prefix; ?>" type="text" name="<?php echo $prefix; ?>fxrotrad" id="<?php echo $prefix; ?>fxrotrad" value="" /> °
		</div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>hoverfxrot"><?php echo CKText::_('CK_HOVER_STATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/shape_rotate_clockwise.png" />
			<select class="<?php echo $prefix; ?>hover" type="list" name="<?php echo $prefix; ?>hoverfxrot" id="<?php echo $prefix; ?>hoverfxrot" value="" style="width: 100px;" >
				<option value="0"><?php echo CKText::_('JNO'); ?></option>
				<option value="1"><?php echo CKText::_('JYES'); ?></option>
			</select>
			<input class="<?php echo $prefix; ?>hover" type="text" name="<?php echo $prefix; ?>hoverfxrotrad" id="<?php echo $prefix; ?>hoverfxrotrad" value="" /> °
		</div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>activefxrot"><?php echo CKText::_('CK_ACTIVE_STATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/shape_rotate_clockwise.png" />
			<select class="<?php echo $prefix; ?>active" type="list" name="<?php echo $prefix; ?>activefxrot" id="<?php echo $prefix; ?>activefxrot" value="" style="width: 100px;" >
				<option value="0"><?php echo CKText::_('JNO'); ?></option>
				<option value="1"><?php echo CKText::_('JYES'); ?></option>
			</select>
			<input class="<?php echo $prefix; ?>active" type="text" name="<?php echo $prefix; ?>activefxrotrad" id="<?php echo $prefix; ?>activefxrotrad" value="" /> °
		</div>
		<div class="ckheading"><?php echo CKText::_('CK_SCALE'); ?></div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>fxscale"><?php echo CKText::_('CK_NORMAL_STATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/shape_handles.png" />
			<input class="<?php echo $prefix; ?>" type="text" name="<?php echo $prefix; ?>fxscale" id="<?php echo $prefix; ?>fxscale" value="" />
		</div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>hoverfxscale"><?php echo CKText::_('CK_HOVER_STATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/shape_handles.png" />
			<input class="<?php echo $prefix; ?>hover" type="text" name="<?php echo $prefix; ?>hoverfxscale" id="<?php echo $prefix; ?>hoverfxscale" value="" />
		</div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>activefxscale"><?php echo CKText::_('CK_ACTIVE_STATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/shape_handles.png" />
			<input class="<?php echo $prefix; ?>active" type="text" name="<?php echo $prefix; ?>activefxscale" id="<?php echo $prefix; ?>activefxscale" value="" />
		</div>
		<div class="ckheading"><?php echo CKText::_('CK_BLUR'); ?></div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>fxblur"><?php echo CKText::_('CK_NORMAL_STATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/wrap-behind.png" />
			<input class="<?php echo $prefix; ?>" type="text" name="<?php echo $prefix; ?>fxblur" id="<?php echo $prefix; ?>fxblur" value="" />
		</div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>hoverfxblur"><?php echo CKText::_('CK_HOVER_STATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/wrap-behind.png" />
			<input class="<?php echo $prefix; ?>hover" type="text" name="<?php echo $prefix; ?>hoverfxblur" id="<?php echo $prefix; ?>hoverfxblur" value="" />
		</div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>activefxblur"><?php echo CKText::_('CK_ACTIVE_STATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/wrap-behind.png" />
			<input class="<?php echo $prefix; ?>active" type="text" name="<?php echo $prefix; ?>activefxblur" id="<?php echo $prefix; ?>activefxblur" value="" />
		</div>
		<div class="ckheading"><?php echo CKText::_('CK_BRIGHTNESS'); ?></div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>fxbrightness"><?php echo CKText::_('CK_NORMAL_STATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/lightbulb.png" />
			<input class="<?php echo $prefix; ?>" type="text" name="<?php echo $prefix; ?>fxbrightness" id="<?php echo $prefix; ?>fxbrightness" value="" />
		</div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>hoverfxbrightness"><?php echo CKText::_('CK_HOVER_STATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/lightbulb.png" />
			<input class="<?php echo $prefix; ?>hover" type="text" name="<?php echo $prefix; ?>hoverfxbrightness" id="<?php echo $prefix; ?>hoverfxbrightness" value="" />
		</div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>activefxbrightness"><?php echo CKText::_('CK_ACTIVE_STATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/lightbulb.png" />
			<input class="<?php echo $prefix; ?>active" type="text" name="<?php echo $prefix; ?>activefxbrightness" id="<?php echo $prefix; ?>activefxbrightness" value="" />
		</div>
		<div class="ckheading"><?php echo CKText::_('CK_GRAYSCALE'); ?></div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>fxgrayscale"><?php echo CKText::_('CK_NORMAL_STATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/lightbulb_off.png" />
			<input class="<?php echo $prefix; ?>" type="text" name="<?php echo $prefix; ?>fxgrayscale" id="<?php echo $prefix; ?>fxgrayscale" value="" />
		</div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>hoverfxgrayscale"><?php echo CKText::_('CK_HOVER_STATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/lightbulb_off.png" />
			<input class="<?php echo $prefix; ?>hover" type="text" name="<?php echo $prefix; ?>hoverfxgrayscale" id="<?php echo $prefix; ?>hoverfxgrayscale" value="" />
		</div>
		<div class="ckrow">
			<label for="<?php echo $prefix; ?>activefxgrayscale"><?php echo CKText::_('CK_ACTIVE_STATE'); ?></label>
			<img class="ckicon" src="<?php echo $this->imagespath ?>/lightbulb_off.png" />
			<input class="<?php echo $prefix; ?>active" type="text" name="<?php echo $prefix; ?>activefxgrayscale" id="<?php echo $prefix; ?>activefxgrayscale" value="" />
		</div>
	<?php
	}
}
components/com_slideshowck/helpers/ckpath.php000060400000000224152453623440015535 0ustar00<?php
namespace Slideshowck;

defined('_JEXEC') or die;

jimport('joomla.filesystem.file');

class CKPath extends \Joomla\CMS\Filesystem\Path {
	
}
components/com_slideshowck/helpers/ckinput.php000060400000000156152453623440015744 0ustar00<?php
namespace Slideshowck;

defined('_JEXEC') or die;

class CKInput extends  \Joomla\CMS\Input\Input {
	
}
components/com_slideshowck/helpers/ckview.php000060400000002317152453623440015560 0ustar00<?php
Namespace Slideshowck;

defined('CK_LOADED') or die;

class CKView {

	protected $name;

	protected $model;

	protected $input;

	protected $items;

	protected $item;

	protected $state;

	protected $pagination;

	public function __construct() {
		// check if the user has the rights to access this page
		if (!CKFof::userCan('edit')) {
			CKFof::_die();
		}
		$this->input = CKFof::getInput();
	}

	public function display($tpl = 'default') {
		if ($this->model) {
			$this->state = $this->model->getState();
			$this->pagination = $this->model->getPagination();
		}

		require_once SLIDESHOWCK_PATH . '/views/' . strtolower($this->name) . '/tmpl/' . $tpl . '.php';
	}

	public function setName($name) {
		$this->name = $name;
	}

	public function setModel($model) {
		$this->model = $model;
	}

	public function get($func, $params = array()) {
		$model = $this->getModel();
		$funcName = 'get' . ucfirst($func);
		return $model->$funcName($params);
	}

	public function getModel() {
		if (empty($this->model)) {
			require_once(SLIDESHOWCK_PATH . '/models/' . strtolower($this->name) . '.php');
			$className = '\Slideshowck\CKModel' . ucfirst($this->name);
			$this->model = new $className;
		}
		return $this->model;
	}
}components/com_slideshowck/helpers/ckcontroller.php000060400000016555152453623440017002 0ustar00<?php
Namespace Slideshowck;

defined('CK_LOADED') or die;

// class CKController extends \Joomla\CMS\MVC\Controller\BaseController {
class CKController {

	protected $input;

	protected $model;

	protected $name;

	protected $prefix;

	protected $view;

	protected static $instance;

	protected static $views;

	function __construct() {
		$this->input = CKFof::getInput();
	}

	static function getInstance($prefix) {

		if (is_object(self::$instance))
		{
			return self::$instance;
		}
		$basePath = SLIDESHOWCK_PATH;
		// Check for a controller.task command.
		$input = CKFof::getInput();

		$cmd = $input->get('task', '', 'cmd');
		if (strpos($cmd, '.') !== false)
		{
			// Explode the controller.task command.
			list ($name, $task) = explode('.', $cmd);

			// Define the controller filename and path.
			$file = self::createFileName('controller', array('name' => $name));
			$path = $basePath . '/controllers/' . $file;
			$backuppath = $basePath . '/controller/' . $file;
			// Reset the task without the controller context.
			$input->set('task', $task);
		}
		else
		{
			// Base controller.
			$name = null;

			// Define the controller filename and path.
			$file       = self::createFileName('controller', array('name' => 'controller'));
			$path       = $basePath . '/' . $file;
		}

		// Get the controller class name.
		$class = ucfirst((string) $prefix) . 'Controller' . ucfirst((string) $name);

		// Include the class if not present.
		if (!class_exists($class))
		{
			// If the controller file path exists, include it.
			if (file_exists($path))
			{
				require_once $path;
			}
			else
			{
				throw new \InvalidArgumentException(\Joomla\CMS\Language\Text::sprintf('ERROR_INVALID_CONTROLLER', $type, $format));
			}
		}

		// Instantiate the class.
		if (!class_exists($class))
		{
			throw new \InvalidArgumentException(\Joomla\CMS\Language\Text::sprintf('ERROR_INVALID_CONTROLLER_CLASS', $class));
		}

		// Instantiate the class, store it to the static container, and return it
		return self::$instance = new $class();
	}

	protected static function createFileName($type, $parts = array())
	{
		$filename = '';

		switch ($type)
		{
			case 'controller':

				$filename = strtolower($parts['name'] . '.php');
				break;

			case 'view':

				$filename = strtolower($parts['name'] . '/view.html.php');
				break;
		}

		return $filename;
	}

	// public function getModel($base = '\Slideshowck\CKModel') {
		// if (empty($this->model)) {
			// $name = $this->getName();
			// require_once(SLIDESHOWCK_PATH . '/helpers/ckmodel.php');
			// require_once(SLIDESHOWCK_PATH . '/models/' . strtolower($name) . '.php');
			// $className = ucfirst($base) . ucfirst($name);
			// $this->model = new $className;
		// }
		// return $this->model;
	// }

	public function getView($name = '', $type = 'html', $prefix = '')
	{
		// @note We use self so we only access stuff in this class rather than in all classes.
		if (!isset(self::$views))
		{
			self::$views = array();
		}

		if (empty($name))
		{
			$name = $this->getName();
		}

		if (empty($prefix))
		{
			$prefix = $this->getPrefix() . 'View';
		}

		if (empty(self::$views[$name][$type][$prefix]))
		{
			if ($view = $this->createView($name, $prefix))
			{
				self::$views[$name][$type][$prefix] = & $view;
			}
			else
			{
				throw new \Exception(\Joomla\CMS\Language\Text::sprintf('ERROR_VIEW_NOT_FOUND', $name, $type, $prefix), 404);
			}
		}

		return self::$views[$name][$type][$prefix];
	}

	protected function createView($name, $prefix = '')
	{
		// Clean the view name
		$viewName = preg_replace('/[^A-Z0-9_]/i', '', $name);
		$classPrefix = preg_replace('/[^A-Z0-9_]/i', '', $prefix);

		// Build the view class name
		$viewClass = $classPrefix . ucfirst($viewName);

		if (!class_exists($viewClass))
		{
			$path = SLIDESHOWCK_PATH . '/views/' . $this->createFileName('view', array('name' => $viewName));

			if (!$path)
			{
				return null;
			}

			require_once $path;

			if (!class_exists($viewClass))
			{
				throw new \Exception(\Joomla\CMS\Language\Text::_('ERROR_VIEW_CLASS_NOT_FOUND : ' . $viewClass . ' - ' . $path), 500);
			}
		}

		return new $viewClass();
	}

	public function display() {
		$viewName = $this->input->get('view', $this->getName());
		$viewLayout = $this->input->get('layout', 'default', 'string');

		$view = $this->getView($viewName, 'html', '');
		$view->setName($viewName);

		// Get/Create the model
		if ($model = $this->getModel($viewName))
		{
			// Push the model into the view (as default)
			$view->setModel($model);
		}


		$view->display();

		return $this;
	}

	public function getModel($name = '', $prefix = '', $config = array())
	{
		if (empty($name))
		{
			$name = ucfirst($this->getName());
		}

		if (empty($prefix))
		{
			$prefix = ucfirst($this->getPrefix());
		}

		$model = $this->createModel($name, $prefix, $config);

		return $model;
	}

	protected function createModel($name, $prefix = '', $config = array())
	{
		// Clean the model name
		$modelName = preg_replace('/[^A-Z0-9_]/i', '', $name);
		$classPrefix = preg_replace('/[^A-Z0-9_]/i', '', $prefix);

		return CKModel::getInstance($modelName, $classPrefix, $config);
	}


	public function execute($task) {
		if (! $task) $task = 'display';
		if (is_callable(array($this, $task))) {
			return $this->$task();
		}
		else
		{
			throw new \Exception(\Joomla\CMS\Language\Text::sprintf('ERROR_TASK_NOT_FOUND', $task), 404);
		}

		return;
	}

	public function setName($name) {
		$this->name = $name;
	}

	public function getName()
	{
		if (empty($this->name))
		{
			$r = null;

			if (!preg_match('/Controller(.*)/i', get_class($this), $r))
			{
				throw new \Exception(\CKText::_('Error : Can not get controller name'), 500);
			}

			$this->name = strtolower($r[1]);
		}

		return $this->name;
	}

	public function getPrefix()
	{
		if (empty($this->prefix))
		{
			$r = null;

			if (!preg_match('/(.*)Controller/i', get_class($this), $r))
			{
				throw new \Exception(\CKText::_('Error : Can not get controller name'), 500);
			}

			$this->prefix = strtolower($r[1]);
		}

		return $this->prefix;
	}

	public function add() {
		return $this->edit(0);
	}

	public function edit($id = null, $appendUrl = '') {
		$editIds = $this->input->get('cid', $id, 'array');
		if (! empty($editIds)) {
			$editId = (int) $editIds[0];
		} else {
			$editId = (int) $this->input->get('id', $id, 'int');
		}

		// Redirect to the edit screen.
		CKFof::redirect(SLIDESHOWCK_ADMIN_URL . '&view=' . $this->getName() . '&layout=edit&id=' . $editId . $appendUrl);
	}

	public function copy() {
		$editIds = $this->input->get('cid', null, 'array');
		if (count($editIds)) {
			$id = (int) $editIds[0];
		} else {
			$id = (int) $this->input->get('id', null, 'int');
		}
		$model = $this->getModel($this->getName());

		if ($model->copy($id)) {
			CKFof::enqueueMessage('Item copied with success');
		} else {
			CKFof::enqueueMessage('Error : Item not copied', 'error');
		}

		// Redirect to the edit screen.
		CKFof::redirect(SLIDESHOWCK_ADMIN_URL);
	}

	public function delete() {
		$editIds = $this->input->get('cid', null, 'array');
		if (count($editIds)) {
			$id = (int) $editIds[0];
		} else {
			$id = (int) $this->input->get('id', null, 'int');
		}
		$model = $this->getModel($this->getName());
		if ($model->delete($id)) {
			CKFof::enqueueMessage('Item deleted with success');
		} else {
			CKFof::enqueueMessage('Error : Item not deleted', 'error');
		}

		// Redirect to the edit screen.
		CKFof::redirect(SLIDESHOWCK_ADMIN_URL);
	}
}
components/com_slideshowck/helpers/ckfof.php000060400000032050152453623440015355 0ustar00<?php
namespace Slideshowck;

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\PluginHelper;
use Slideshowck\CKInput;
use Slideshowck\CKText;

/**
 * CK Development Framework layer
 */
class CKFof {

	static $keepMessages = false;

	static protected $environment = 'com_slideshowck'; // for joomla only

	static protected $input;

	public static function loadHelper($name) {
		require_once(SLIDESHOWCK_PATH . '/helpers/ck' . $name . '.php');
	}

	public static function getInput() {
		if (empty(self::$input)) {
			self::$input = Factory::getApplication()->input;
		}
		return self::$input;
	}

	public static function userCan($task, $environment = false) {
		$environment = $environment ? $environment : self::$environment;
		$user = CKFof::getUser();
		switch ($task) {
			case 'edit' :
			default :
				return $user->authorise('core.edit', $environment);
			break;
			case 'create' :
				return $user->authorise('core.create', $environment);
			break;
			case 'manage' :
				return $user->authorise('core.manage', $environment);
			break;
			case 'admin' :
				return $user->authorise('core.admin', $environment);
			case 'delete' :
				return $user->authorise('core.delete', $environment);
			break;
		}
	}

	public static function getUser($id = 0) {
		if ($id) {
			return $user = Factory::getUser($id);
		}
		return $user = Factory::getUser();
	}

	public static function isAdmin() {
		return Factory::getApplication()->isClient('administrator') ;
	}

	public static function isSite() {
		return Factory::getApplication()->isClient('site') ;
	}

	public static function _die($msg = '') {
		$msg = $msg ? $msg : CKText::_('JERROR_ALERTNOAUTHOR');
		jexit($msg);
	}

	public static function getCurrentUri() {
//		$uri = \Joomla\CMS\Factory::getURI();
		$uri = \Joomla\CMS\Uri\Uri::getInstance();
		return $uri->toString();
	}

	public static function redirect($url = '', $msg = '', $type = '') {
		if (! $url) {
			$url = self::getCurrentUri();
		}
		if ($msg) {
			self::enqueueMessage($msg, $type);
		}
		Factory::getApplication()->redirect($url);
		// If the headers have been sent, then we cannot send an additional location header
		// so we will output a javascript redirect statement.
		/*if (headers_sent())
		{
			self::$keepMessages = true;
			echo "<script>document.location.href='" . str_replace("'", '&apos;', $url) . "';</script>\n";
		}
		else
		{
			self::$keepMessages = true;
			// All other browsers, use the more efficient HTTP header method
			header('HTTP/1.1 303 See other');
			header('Location: ' . $url);
			header('Content-Type: text/html; charset=UTF-8');
		}*/
	}

	/**
	 * 
	 * @param type $msg
	 * @param type $type
    'message' (ou vide) - vert
    'notice' - bleu
    'warning' - jaune
    'error' - rouge
	 */
	public static function enqueueMessage($msg, $type = 'message') {
		// add the information message
		Factory::getApplication()->enqueueMessage($msg, $type);
	}

	public static function displayMessages() {
		// manage the information messages
		// not needed in joomla
	}

	public static function getToken($name = '') {
		return \Joomla\CMS\Factory::getSession()->getFormToken() . '=1';
	}

	public static function renderToken($name = '') {
		echo \Joomla\CMS\HTML\HTMLHelper::_('form.token');
	}

	public static function checkToken($token = '') {
		if (! \Joomla\CMS\Session\Session::checkToken()) {
			$msg = CKText::_('Invalid token');
			jexit($msg);
		}
	}

	public static function checkAjaxToken($json = true) {
		// check the token for security
		if (! \Joomla\CMS\Session\Session::checkToken('get')) {
			$msg = CKText::_('JINVALID_TOKEN');
			if ($json === false) {
				jexit($msg);
			}
			echo '{"result": "0", "message": "' . $msg . '"}';
			exit;
		}
		return true;
	}

	public static function getDbo() {
		return Factory::getDbo();
	}

	public static function dbQuote($name) {
		$db = self::getDbo();
		return $db->quoteName($name);
	}

	public static function dbLoadObjectList($query, $key = '') {
		$db = self::getDbo();
		// $query = $db->getQuery(true);
		$db->setQuery($query);
		$results = $db->loadObjectList($key);

		return $results;
	}

	public static function dbLoadObject($query) {
		$db = self::getDbo();
		// $query = $db->getQuery(true);
		$db->setQuery($query);
		$results = $db->loadObject();

		return $results;
	}

	public static function dbLoadResult($query) {
		$db = self::getDbo();
		// $query = $db->getQuery(true);
		$db->setQuery($query);
		$result = $db->loadResult();

		return $result;
	}

	public static function dbExecute($query) {
		$db = self::getDbo();
		$db->setQuery($query);
		$result = $db->execute();

		return $result;
	}

	public static function dbLoadColumn($tableName, $column) {
		$db = self::getDbo();
		$query = $db->getQuery(true);
		$query->select($column);
		$query->from($tableName);

		$db->setQuery($query);
		$result = $db->loadColumn();

		return $result;
	}

	public static function dbCheckTableExists($tableName) {
		$db = self::getDbo();
		$tablesList = $db->getTableList();

		$tableName = str_replace('#__', $db->getPrefix(), $tableName);
		$tableExists = in_array($tableName, $tablesList);
		return $tableExists;
	}

	public static function dbLoadTable($tableName) {
		$db = self::getDbo();
		$tableName = self::getTableName($tableName);
		$query = "DESCRIBE  " . $tableName;
		$db->setQuery($query);
		$columns = $db->loadObjectList();

		$table = new \stdClass();
		foreach ($columns as $col) {
			$table->{$col->Field} = '';
		}

		return $table;
	}

	public static function dbLoad($tableName, $id) {
		// if no existing row, then load empty table
		if ($id == 0) return self::dbLoadTable($tableName);

		$db = self::getDbo();
		$query = "SELECT * FROM " . $tableName . " WHERE id = " . (int)$id;
		$db->setQuery($query);
		$result = $db->loadAssoc();

		if (! $result) return self::dbLoadTable($tableName);

		$result = self::convertArrayToObject($result);

		return $result;
	}

	public static function dbBindData($table, $data) {
		if (is_object($table)) $table = self::convertObjectToArray($table);
		if (is_object($data)) $data = self::convertObjectToArray($data);

		foreach ($table as $col => $val) {
			if (isset($data[$col])) $table[$col] = $data[$col];
		}

		return $table;
	}

	public static function getTableName($tableName) {
		return $tableName;
	}

	public static function getTableStructure($tableName) {
		$db = self::getDbo();
		$query = "SHOW COLUMNS FROM " . $tableName;
		$db->setQuery($query);

		return $db->loadObjectList('Field');
	}

	public static function dbStore($tableName, $data, $format = array()) {
		$db = self::getDbo();
		if (is_object($data)) $data = self::convertObjectToArray($data);

		// Create a new query object.
		$query = $db->getQuery(true);
		$columsData = self::getTableStructure($tableName);

		if ((int)$data['id'] === 0) {
			$columns = array();
			$values = array();
			$fields = self::dbLoadTable($tableName);

																			   

			foreach($fields as $key => $val) {
				$columns[] = $key;
				if (isset($data[$key]) && !empty($data[$key])) {
					$values[] = is_numeric($data[$key]) ? $data[$key] : $db->quote($data[$key]);
				} else {
					if (strpos($columsData[$key]->Type, 'int') === 0 || strpos($columsData[$key]->Type, 'tinyint') === 0) {
						$values[] = '0';
					} else if (strpos($columsData[$key]->Type, 'date') === 0) {
						$values[] = $db->quote('0000-00-00 00:00:00');
					} else {
						$values[] = $db->quote('');
					}
				}
			}

			// Prepare the insert query.
			$query
				->insert($db->quoteName($tableName))
				->columns($db->quoteName($columns))
				->values(implode(',', $values));

			// Set the query using our newly populated query object and execute it.
			$db->setQuery($query);
			if ($db->execute()) {
				$id = $db->insertid();
			} else {
				return false;
			}
		} else {
			// Fields to update.
			$fields = self::dbLoadTable($tableName);
			$fieldsToInsert = array();
			foreach($fields as $key => $val) {
				if (strpos($columsData[$key]->Type, 'date') === 0 && empty($data[$key])) {
					continue;
				}
				if (isset($data[$key])) {
					$value = is_numeric($data[$key]) ? (int)$data[$key] : $db->quote($data[$key]);
				} else {
					continue;
				}
				$fieldsToInsert[] = $db->quoteName($key) . ' = ' . $value;
			}

			// Conditions for which records should be updated.
			$conditions = array(
				$db->quoteName('id') . ' = ' . $data['id']
			);

			$query->update($db->quoteName($tableName))->set($fieldsToInsert)->where($conditions);

			// Set the query using our newly populated query object and execute it.
			$db->setQuery($query);
			if ($db->execute()) {
				$id = $data['id'];
			} else {
				return false;
			}
		}

		return $id;
	}

	public static function dbUpdate($tableName, $id, $fields) {
		// Create a new query object.
		$db = self::getDbo();
		$query = $db->getQuery(true);

		// Conditions for which records should be updated.
		$conditions = array(
			$db->quoteName('id') . ' = ' . $id
		);

		$fieldsToInsert = array();
		foreach ($fields as $key => $value) {
			$fieldsToInsert[] = $db->quoteName($key) . ' = ' . $value;
		}

		$query->update($db->quoteName($tableName))->set($fieldsToInsert)->where($conditions);

		// Set the query using our newly populated query object and execute it.
		$db->setQuery($query);
		if ($db->execute()) {
			$id = $data['id'];
		} else {
			return false;
		}
	}

	public static function dbDelete($tableName, $id) {
		$db = CKFof::getDbo();

		$query = $db->getQuery(true);

		$conditions = array(
			$db->quoteName('id') . ' = ' . (int) $id
//			, $db->quoteName('profile_key') . ' = ' . $db->quote('custom.%')
		);

		$query->delete($db->quoteName($tableName));
		$query->where($conditions);

		$db->setQuery($query);

		$result = $db->execute();

		return $result;
	}

	public static function convertObjectToArray($data) {
		return (array) $data;
	}

	public static function convertArrayToObject(array $array, $class = 'stdClass', $recursive = true)
	{
		$obj = new $class;

		foreach ($array as $k => $v)
		{
			if ($recursive && is_array($v))
			{
				$obj->$k = static::convertArrayToObject($v, $class);
			}
			else
			{
				$obj->$k = $v;
			}
		}

		return $obj;
	}

	public static function dump($anything){
			echo "<pre>";
				var_dump($anything);
			echo "</pre>";
	}

	public static function print_r($anything){
		echo "<pre>";
				print_r($anything);
			echo "</pre>";
	}

	public static function addToolbarTitle($title, $image = '') {
		\Joomla\CMS\Toolbar\ToolbarHelper::title($title, $image);
	}

	private static function getToolbar() {
		// Get the toolbar object instance
		$bar = \Joomla\CMS\Toolbar\Toolbar::getInstance('toolbar');
		return $bar;
	}

	public static function addToolbarButton($name, $html, $id) {
		$bar = self::getToolbar();
		$bar->appendButton($name, $html, $id);
	}

	public static function addToolbarPreferences() {
		$bar = self::getToolbar();
		// add the options of the component
		if (self::userCan('admin')) {
			\Joomla\CMS\Toolbar\ToolbarHelper::preferences(self::$environment);
		}
	}

	private static function getFileName($file) {
		$f = explode('/', $file);
		$fileName = end($f);
		$f = explode('.', $fileName);
		$ext = end($f);
		$fileName = str_replace('.' . $ext, '', $fileName);

		return $fileName;
	}

	public static function addScriptDeclaration($js) {
		$doc = Factory::getDocument();
		$doc->addScriptDeclaration($js);
	}

	public static function addScriptDeclarationInline($js) {
		echo '<script>' . $js . '</script>';
	}

	public static function addScript($file) {
		$doc = Factory::getDocument();
		$doc->addScript($file);
	}

	public static function addScriptInline($file) {
		echo '<script src="' . $file . '"></script>';
	}

	public static function addStyleDeclaration($css) {
		$doc = Factory::getDocument();
		$doc->addStyleDeclaration($css);
	}

	public static function addStyleDeclarationInline($css) {
		echo '<style>' . $css . '</style>';
	}

	public static function addStylesheet($file) {
		$doc = Factory::getDocument();
		$doc->addStylesheet($file);
	}

	public static function addStylesheetInline($file) {
		echo '<link href="' . $file . '"" rel="stylesheet" />';
	}

	public static function error($msg) {
		throw new \Exception($msg);
	}

	public static function triggerEvent($name, $e = array()) {
		if (version_compare(JVERSION,'4') < 1) {
			$dispatcher = \JEventDispatcher::getInstance();
			return $dispatcher->trigger($name, $e);
		} else {
			return Factory::getApplication()->triggerEvent($name, $e);
		}
	}

	public static function importPlugin($group) {
		if (version_compare(JVERSION,'4') < 1) {
			\Joomla\CMS\Plugin\PluginHelper::importPlugin($group);
		} else {
			PluginHelper::importPlugin($group);
		}
	}

	public static function cleanCache($group = '') {
		$conf = \Joomla\CMS\Factory::getConfig();

		$options = [
			'defaultgroup' => '',
			'storage'      => $conf->get('cache_handler', ''),
			'caching'      => true,
			'cachebase'    => $conf->get('cache_path', JPATH_SITE . '/cache'),
		];

		$cache = \Joomla\CMS\Cache\Cache::getInstance('callback', $options);

		foreach ($cache->getAll() as $group)
		{
			if ($group && $group->group == $group);
				$cache->clean($group->group);
		}
	}

	public static function getModel($modelName, $classPrefix = 'Slideshowck') {
			return CKModel::getInstance($modelName, $classPrefix);
	}
}
components/com_slideshowck/helpers/defines.js.php000060400000002250152453623440016314 0ustar00<?php
/**
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */

// No direct access
defined('_JEXEC') or die;
?>
<script>
	var SLIDESHOWCK = {
		TOKEN : '<?php echo \Joomla\CMS\Factory::getSession()->getFormToken() ?>=1'
		, URIBASE : '<?php echo \Joomla\CMS\Uri\Uri::base(true) ?>'
		, URIBASEABS : '<?php echo \Joomla\CMS\Uri\Uri::base() ?>'
		, URIROOT : '<?php echo \Joomla\CMS\Uri\Uri::root(true) ?>'
		, URIROOTABS : '<?php echo \Joomla\CMS\Uri\Uri::root() ?>'
		, HASPAGEBUILDERCK : '<?php echo (int)file_exists(JPATH_ROOT . '/administrator/components/com_pagebuilderck') ?>'
		, ADMIN_URL : '<?php echo \Joomla\CMS\Uri\Uri::root(true) ?>/administrator/index.php?option=com_slideshowck'
		, FRONT_URL : '<?php echo \Joomla\CMS\Uri\Uri::root(true) ?>/index.php?option=com_slideshowck'
		, BASE_URL : '<?php echo \Joomla\CMS\Uri\Uri::base(true) ?>/index.php?option=com_slideshowck'
		, USERID : '<?php echo \Joomla\CMS\Factory::getUser()->id ?>'
		, ISJ4 : '<?php echo version_compare(JVERSION, "4") ?>'
	};
</script>components/com_slideshowck/helpers/ckfolder.php000060400000000232152453623440016053 0ustar00<?php
namespace Slideshowck;

defined('_JEXEC') or die;

jimport('joomla.filesystem.folder');

class CKFolder extends \Joomla\CMS\Filesystem\Folder {
	
}
components/com_slideshowck/helpers/htmlfixer.php000060400000033773152453623440016304 0ustar00<?php
// -------------------------------------------------
// HTML FIXER v.2.05 15/07/2010
// clean dirty html and make it better, fix open tags
// bad nesting, bad quotes, bad autoclosing tags.
//
// by Giulio Pons, http://www.barattalo.it
// -------------------------------------------------
// usage:
// -------------------------------------------------
// $a = new HtmlFixer();
// $clean_html = $a->getFixedHtml($dirty_html);
// -------------------------------------------------

Class SlideshowCKHtmlFixer {
	public $dirtyhtml;
	public $fixedhtml;
	public $allowed_styles;		// inline styles array of allowed css (if empty means ALL allowed)
	private $matrix;			// array used to store nodes
	public $debug;
	private $fixedhtmlDisplayCode;

	public function __construct() {
		$this->dirtyhtml = "";
		$this->fixedhtml = "";
		$this->debug = false;
		$this->fixedhtmlDisplayCode = "";
		$this->allowed_styles = array();
	}

	public function getFixedHtml($dirtyhtml) {
		$c = 0;
		$this->dirtyhtml = $dirtyhtml;
		$this->fixedhtml = "";
		$this->fixedhtmlDisplayCode = "";
		if (is_array($this->matrix)) unset($this->matrix);
		$errorsFound=0;
		while ($c<10) {
			/*
				iterations, every time it's getting better...
			*/
			if ($c>0) $this->dirtyhtml = $this->fixedxhtml;
			$errorsFound = $this->charByCharJob();
			if (!$errorsFound) $c=10;	// if no corrections made, stops iteration
			$this->fixedxhtml=str_replace('<root>','',$this->fixedxhtml);
			$this->fixedxhtml=str_replace('</root>','',$this->fixedxhtml);
			$this->fixedxhtml = $this->removeSpacesAndBadTags($this->fixedxhtml);
			$c++;
		}
		return $this->fixedxhtml;
	}

	private function fixStrToLower($m){
		/*
			$m is a part of the tag: make the first part of attr=value lowercase
		*/
		$right = strstr($m, '=');
		$left = str_replace($right,'',$m);
		return strtolower($left).$right;
	}

	private function fixQuotes($s){
		$q = "\"";// thanks to emmanuel@evobilis.com
		if (!stristr($s,"=")) return $s;
		$out = $s;
		preg_match_all("|=(.*)|",$s,$o,PREG_PATTERN_ORDER);
		for ($i = 0; $i< count ($o[1]); $i++) {
			$t = trim ( $o[1][$i] ) ;
			$lc="";
			if ($t!="") {
				if ($t[strlen($t)-1]==">") {
					$lc= ($t[strlen($t)-2].$t[strlen($t)-1])=="/>"  ?  "/>"  :  ">" ;
					$t=substr($t,0,-1);
				}
				//missing " or ' at the beginning
				if (($t[0]!="\"")&&($t[0]!="'")) $out = str_replace( $t, "\"".$t,$out); else $q=$t[0];
				//missing " or ' at the end
				if (($t[strlen($t)-1]!="\"")&&($t[strlen($t)-1]!="'")) $out = str_replace( $t.$lc, $t.$q.$lc,$out);
			}
		}
		return $out;
	}

	private function fixTag($t){
		/* remove non standard attributes and call the fix for quoted attributes */
		$t = preg_replace (
			array(
				'/borderColor=([^ >])*/i',
				'/border=([^ >])*/i'
			), 
			array(
				'',
				''
			)
			, $t);
		$ar = explode(" ",$t);
		$nt = "";
		for ($i=0;$i<count($ar);$i++) {
			$ar[$i]=$this->fixStrToLower($ar[$i]);
			if (stristr($ar[$i],"=")) $ar[$i] = $this->fixQuotes($ar[$i]);	// thanks to emmanuel@evobilis.com
			//if (stristr($ar[$i],"=") && !stristr($ar[$i],"=\"")) $ar[$i] = $this->fixQuotes($ar[$i]);
			$nt.=$ar[$i]." ";
		}
		$nt=preg_replace("/<( )*/i","<",$nt);
		$nt=preg_replace("/( )*>/i",">",$nt);
		return trim($nt);
	}

	private function extractChars($tag1,$tag2,$tutto) { /*extract a block between $tag1 and $tag2*/
		if (!stristr($tutto, $tag1)) return '';
		$s=stristr($tutto,$tag1);
		$s=substr( $s,strlen($tag1));
		if (!stristr($s,$tag2)) return '';
		$s1=stristr($s,$tag2);
		return substr($s,0,strlen($s)-strlen($s1));
	}

	private function mergeStyleAttributes($s) {
		//
		// merge many style definitions in the same tag in just one attribute style
		//

		$x = "";
		$temp = "";
		$c = 0;
		while(stristr($s,"style=\"")) {
			$temp = $this->extractChars("style=\"","\"",$s);
			if ($temp=="") {
				// missing closing quote! add missing quote.
				return preg_replace("/(\/)?>/i","\"\\1>",$s);
			}
			if ($c==0) $s = str_replace("style=\"".$temp."\"","##PUTITHERE##",$s);
				$s = str_replace("style=\"".$temp."\"","",$s);
			if (!preg_match("/;$/i",$temp)) $temp.=";";
			$x.=$temp;
			$c++;
		}

		if (count($this->allowed_styles)>0) {
			// keep only allowed styles by Martin Vool 2010-04-19
			$check=explode(';', $x);
			$x="";
			foreach($check as $chk){
				foreach($this->allowed_styles as $as)
					if(stripos($chk, $as) !== False) { $x.=$chk.';'; break; } 
			}
		}

		if ($c>0) $s = str_replace("##PUTITHERE##","style=\"".$x."\"",$s);
		return $s;


	}

	private function fixAutoclosingTags($tag,$tipo=""){
		/*
			metodo richiamato da fix() per aggiustare i tag auto chiudenti (<br/> <img ... />)
		*/
		if (in_array( $tipo, array ("img","input","br","hr")) ) {
			if (!stristr($tag,'/>')) $tag = str_replace('>','/>',$tag );
		}
		return $tag;
	}

	private function getTypeOfTag($tag) {
		$tag = trim(preg_replace("/[\>\<\/]/i","",$tag));
		$a = explode(" ",$tag);
		return $a[0];
	}


	private function checkTree() {
		// return the number of errors found
		$errorsCounter = 0;
		for ($i=1;$i<count($this->matrix);$i++) {
			$flag=false;
			if ($this->matrix[$i]["tagType"]=="div") { //div cannot stay inside a p, b, etc.
				$parentType = $this->matrix[$this->matrix[$i]["parentTag"]]["tagType"];
				if (in_array($parentType, array("p","b","i","font","u","small","strong","em"))) $flag=true;
			}

			if (in_array( $this->matrix[$i]["tagType"], array( "b", "strong" )) ) { //b cannot stay inside b o strong.
				$parentType = $this->matrix[$this->matrix[$i]["parentTag"]]["tagType"];
				if (in_array($parentType, array("b","strong"))) $flag=true;
			}

			if (in_array( $this->matrix[$i]["tagType"], array ( "i", "em") )) { //i cannot stay inside i or em
				$parentType = $this->matrix[$this->matrix[$i]["parentTag"]]["tagType"];
				if (in_array($parentType, array("i","em"))) $flag=true;
			}

			if ($this->matrix[$i]["tagType"]=="p") {
				$parentType = $this->matrix[$this->matrix[$i]["parentTag"]]["tagType"];
				if (in_array($parentType, array("p","b","i","font","u","small","strong","em"))) $flag=true;
			}

			if ($this->matrix[$i]["tagType"]=="table") {
				$parentType = $this->matrix[$this->matrix[$i]["parentTag"]]["tagType"];
				if (in_array($parentType, array("p","b","i","font","u","small","strong","em","tr","table"))) $flag=true;
			}
			if ($flag) {
				$errorsCounter++;
				if ($this->debug) echo "<div style='color:#ff0000'>Found a <b>".$this->matrix[$i]["tagType"]."</b> tag inside a <b>".htmlspecialchars($parentType)."</b> tag at node $i: MOVED</div>";
				
				$swap = $this->matrix[$this->matrix[$i]["parentTag"]]["parentTag"];
				if ($this->debug) echo "<div style='color:#ff0000'>Every node that has parent ".$this->matrix[$i]["parentTag"]." will have parent ".$swap."</div>";
				$this->matrix[$this->matrix[$i]["parentTag"]]["tag"]="<!-- T A G \"".$this->matrix[$this->matrix[$i]["parentTag"]]["tagType"]."\" R E M O V E D -->";
				$this->matrix[$this->matrix[$i]["parentTag"]]["tagType"]="";
				$hoSpostato=0;
				for ($j=count($this->matrix)-1;$j>=$i;$j--) {
					if ($this->matrix[$j]["parentTag"]==$this->matrix[$i]["parentTag"]) {
						$this->matrix[$j]["parentTag"] = $swap;
						$hoSpostato=1;
					}
				}
			}

		}
		return $errorsCounter;

	}

	private function findSonsOf($parentTag) {
		// build correct html recursively
		$out= "";
		for ($i=1;$i<count($this->matrix);$i++) {
			if ($this->matrix[$i]["parentTag"]==$parentTag) {
				if ($this->matrix[$i]["tag"]!="") {
					$out.=$this->matrix[$i]["pre"];
					$out.=$this->matrix[$i]["tag"];
					$out.=$this->matrix[$i]["post"];
				} else {
					$out.=$this->matrix[$i]["pre"];
					$out.=$this->matrix[$i]["post"];
				}
				if ($this->matrix[$i]["tag"]!="") {
					$out.=$this->findSonsOf($i);
					if ($this->matrix[$i]["tagType"]!="") {
						//write the closing tag
						if (!in_array($this->matrix[$i]["tagType"], array ( "br","img","hr","input"))) 
							$out.="</". $this->matrix[$i]["tagType"].">";
					}
				}
			}
		}
		return $out;
	}

	private function findSonsOfDisplayCode($parentTag) {
		//used for debug
		$out= "";
		for ($i=1;$i<count($this->matrix);$i++) {
			if ($this->matrix[$i]["parentTag"]==$parentTag) {
				$out.= "<div style=\"padding-left:15\"><span style='float:left;background-color:#FFFF99;color:#000;'>{$i}:</span>";
				if ($this->matrix[$i]["tag"]!="") {
					if ($this->matrix[$i]["pre"]!="") $out.=htmlspecialchars($this->matrix[$i]["pre"])."<br>";
					$out.="".htmlspecialchars($this->matrix[$i]["tag"])."<span style='background-color:red; color:white'>{$i} <em>".$this->matrix[$i]["tagType"]."</em></span>";
					$out.=htmlspecialchars($this->matrix[$i]["post"]);
				} else {
					if ($this->matrix[$i]["pre"]!="") $out.=htmlspecialchars($this->matrix[$i]["pre"])."<br>";
					$out.=htmlspecialchars($this->matrix[$i]["post"]);
				}
				if ($this->matrix[$i]["tag"]!="") {
					$out.="<div>".$this->findSonsOfDisplayCode($i)."</div>\n";
					if ($this->matrix[$i]["tagType"]!="") {
						if (($this->matrix[$i]["tagType"]!="br") && ($this->matrix[$i]["tagType"]!="img") && ($this->matrix[$i]["tagType"]!="hr")&& ($this->matrix[$i]["tagType"]!="input"))
							$out.="<div style='color:red'>".htmlspecialchars("</". $this->matrix[$i]["tagType"].">")."{$i} <em>".$this->matrix[$i]["tagType"]."</em></div>";
					}
				}
				$out.="</div>\n";
			}
		}
		return $out;
	}

	private function removeSpacesAndBadTags($s) {
		$i=0;
		while ($i<10) {
			$i++;
			$s = preg_replace (
				array(
					'/[\r\n]/i',
					'/  /i',
					'/<p([^>])*>(&nbsp;)*\s*<\/p>/i',
					'/<span([^>])*>(&nbsp;)*\s*<\/span>/i',
					'/<strong([^>])*>(&nbsp;)*\s*<\/strong>/i',
					'/<em([^>])*>(&nbsp;)*\s*<\/em>/i',
					'/<font([^>])*>(&nbsp;)*\s*<\/font>/i',
					'/<small([^>])*>(&nbsp;)*\s*<\/small>/i',
					'/<\?xml:namespace([^>])*><\/\?xml:namespace>/i',
					'/<\?xml:namespace([^>])*\/>/i',
					'/class=\"MsoNormal\"/i',
					'/<o:p><\/o:p>/i',
					'/<!DOCTYPE([^>])*>/i',
					'/<!--(.|\s)*?-->/',
					'/<\?(.|\s)*?\?>/'
				), 
				array(
					' ',
					' ',
					'',
					'',
					'',
					'',
					'',
					'',
					'',
					'',
					'',
					' ',
					'',
					''
				)
				, trim($s));
		}
		return $s;
	}

	private function charByCharJob() {
		$s = $this->removeSpacesAndBadTags($this->dirtyhtml);
 		if ($s=="") {
			$this->fixedxhtml="";
			return;
		}
		$s = "<root>".$s."</root>";
		$contenuto = "";
		$ns = "";
		$i=0;
		$j=0;
		$indexparentTag=0;
		$padri=array();
		array_push($padri,"0");
		$this->matrix[$j]["tagType"]="";
		$this->matrix[$j]["tag"]="";
		$this->matrix[$j]["parentTag"]="0";
		$this->matrix[$j]["pre"]="";
		$this->matrix[$j]["post"]="";
		$tags=array();
		
		while($i<strlen($s)) {
			if ( $s[$i] =="<") {
				/*
					found a tag
				*/
				$contenuto = $ns;
				$ns = "";
				
				$tag="";
				while( $i<strlen($s) && $s[$i]!=">" ){
					// get chars till the end of a tag
					$tag.=$s[$i];
					$i++;
				}
				$tag.=$s[$i];
				
				if($s[$i]==">") {
					/*
						$tag contains a tag <...chars...>
						let's clean it!
					*/
					$tag = $this->fixTag($tag);
					$tagType = $this->getTypeOfTag($tag);
					$tag = $this->fixAutoclosingTags($tag,$tagType);
					$tag = $this->mergeStyleAttributes($tag);

					if (!isset($tags[$tagType])) $tags[$tagType]=0;
					$tagok=true;
					if (($tags[$tagType]==0)&&(stristr($tag,'/'.$tagType.'>'))) {
						$tagok=false;
						/* there is a close tag without any open tag, I delete it */
						if ($this->debug) echo "<div style='color:#ff0000'>Found a closing tag <b>".htmlspecialchars($tag)."</b> at char $i without open tag: REMOVED</div>";
					}
				}
				if ($tagok) {
					$j++;
					$this->matrix[$j]["pre"]="";
					$this->matrix[$j]["post"]="";
					$this->matrix[$j]["parentTag"]="";
					$this->matrix[$j]["tag"]="";
					$this->matrix[$j]["tagType"]="";
					if (stristr($tag,'/'.$tagType.'>')) {
						/*
							it's the closing tag
						*/
						$ind = array_pop($padri);
						$this->matrix[$j]["post"]=$contenuto;
						$this->matrix[$j]["parentTag"]=$ind;
						$tags[$tagType]--;
					} else {
						if (@preg_match("/".$tagType."\/>$/i",$tag)||preg_match("/\/>/i",$tag)) {
							/*
								it's a autoclosing tag
							*/
							$this->matrix[$j]["tagType"]=$tagType;
							$this->matrix[$j]["tag"]=$tag;
							$indexparentTag = array_pop($padri);
							array_push($padri,$indexparentTag);
							$this->matrix[$j]["parentTag"]=$indexparentTag;
							$this->matrix[$j]["pre"]=$contenuto;
							$this->matrix[$j]["post"]="";
						} else {
							/*
								it's a open tag
							*/
							$tags[$tagType]++;
							$this->matrix[$j]["tagType"]=$tagType;
							$this->matrix[$j]["tag"]=$tag;
							$indexparentTag = array_pop($padri);
							array_push($padri,$indexparentTag);
							array_push($padri,$j);
							$this->matrix[$j]["parentTag"]=$indexparentTag;
							$this->matrix[$j]["pre"]=$contenuto;
							$this->matrix[$j]["post"]="";
						}
					}
				}
			} else {
				/*
					content of the tag
				*/
				$ns.=$s[$i];
			}
			$i++;
		}
		/*
			remove not valid tags
		*/
		for ($eli=$j+1;$eli<count($this->matrix);$eli++) {
			$this->matrix[$eli]["pre"]="";
			$this->matrix[$eli]["post"]="";
			$this->matrix[$eli]["parentTag"]="";
			$this->matrix[$eli]["tag"]="";
			$this->matrix[$eli]["tagType"]="";
		}
		$errorsCounter = $this->checkTree();		// errorsCounter contains the number of removed tags
		$this->fixedxhtml=$this->findSonsOf(0);	// build html fixed
		if ($this->debug) {
			$this->fixedxhtmlDisplayCode=$this->findSonsOfDisplayCode(0);
			echo "<table border=1 cellspacing=0 cellpadding=0>";
			echo "<tr><th>node id</th>";
			echo "<th>pre</th>";
			echo "<th>tag</th>";
			echo "<th>post</th>";
			echo "<th>parentTag</th>";
			echo "<th>tipo</th></tr>";
			for ($k=0;$k<=$j;$k++) {
				echo "<tr><td>$k</td>";
				echo "<td>&nbsp;".htmlspecialchars($this->matrix[$k]["pre"])."</td>";
				echo "<td>&nbsp;".htmlspecialchars($this->matrix[$k]["tag"])."</td>";
				echo "<td>&nbsp;".htmlspecialchars($this->matrix[$k]["post"])."</td>";
				echo "<td>&nbsp;".$this->matrix[$k]["parentTag"]."</td>";
				echo "<td>&nbsp;<i>".$this->matrix[$k]["tagType"]."</i></td></tr>";
			}
			echo "</table>";
			echo "<hr/>{$j}<hr/>\n\n\n\n".$this->fixedxhtmlDisplayCode;
		}
		return $errorsCounter;
	}
}components/com_slideshowck/helpers/ckmodel.php000060400000006557152453623440015720 0ustar00<?php
Namespace Slideshowck;

defined('CK_LOADED') or die;

use \Slideshowck\CKFof;

class CKModel {

	var $_item = null;

	private static $instance;

	protected $input;

	protected $table;

	protected $__state_set = null;

	protected $state;

	protected $pagination;

	function __construct() {
		$this->input = CKFof::getInput();
		$this->state = new \Joomla\CMS\Object\CMSObject;
	}

	static function getInstance($name, $prefix, $config) {

		if (is_object(self::$instance))
		{
			return self::$instance;
		}

		$basePath = SLIDESHOWCK_PATH;
		// Check for a controller.task command.
		$input = CKFof::getInput();

		// Define the controller filename and path.
		$file       = strtolower($name . '.php');
		$path       = $basePath . '/models/' . $file;

		// Get the controller class name.
		$class = ucfirst($prefix) . 'Model' . ucfirst($name);

		// Include the class if not present.
		if (!class_exists($class))
		{
			// If the controller file path exists, include it.
			if (file_exists($path))
			{
				require_once $path;
			}
			else
			{
//				throw new \InvalidArgumentException(\Joomla\CMS\Language\Text::sprintf('ERROR_INVALID_MODEL', $type, $format));
			
				return false;
			}
		}

		// Instantiate the class.
		if (!class_exists($class))
		{
			throw new \InvalidArgumentException(\Joomla\CMS\Language\Text::sprintf('ERROR_INVALID_MODEL_CLASS', $class));
		}

		// Instantiate the class, store it to the static container, and return it
		return self::$instance = new $class();
	}

	public function save($data) {

	}

	public function delete($id) {
		return CKFof::dbDelete( $this->table, (int)$id );
	}

	public function setState($property, $value = null)
	{
		return $this->state->set($property, $value);
	}

	public function getState($property = null, $default = null)
	{
		if (!$this->__state_set)
		{
			// Protected method to auto-populate the model state.
			$this->populateState();

			// Set the model state set flag to true.
			$this->__state_set = true;
		}

		return $property === null ? $this->state : $this->state->get($property, $default);
	}

	protected function populateState()
	{
		$this->state->set('filter_order', $this->input->get('filter_order', 'a.id'));
		$this->state->set('filter_order_Dir', $this->input->get('filter_order_Dir', 'asc'));
		$this->state->set('filter_search', $this->input->get('filter_search', ''));
		$this->state->set('limitstart', $this->input->get('limitstart', 0));
		$this->state->set('limit_total', $this->input->get('limittotal', 0));
		$this->state->set('limit', $this->input->get('limit', 20));
	}

	public function getPagination($total = null, $start = null, $limit = null)
	{
		if (!$this->pagination)
		{
			$total = $this->state->get('limit_total', $total);
//			$total = $this->getTotal();
			$start = $this->state->get('limitstart', $start);
			$limit = $this->state->get('limit', $limit);

			$this->pagination = new \Joomla\CMS\Pagination\Pagination($total, $start, $limit);
		}

		return $this->pagination;
	}

	public function getTotal($query) {
		$db = CKFof::getDbo();
		$query = clone $query;
		$query->clear('select')->clear('order')->clear('limit')->clear('offset')->select('COUNT(*)');
		$db->setQuery($query);

		return (int) $db->loadResult();
	}

	public function copy($id) {
		$row = CKFof::dbLoad($this->table, (int)$id);
		$row->id = 0;
		$row->name = $row->name . ' - copy';

		$newid = CKFof::dbStore($this->table, $row);

		return $newid;
	}
}components/com_slideshowck/index.html000060400000000054152453623440014106 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_slideshowck/models/menus.php000060400000002415152453623440015237 0ustar00<?php
/**
 * @name		Slideshow CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */

defined('_JEXEC') or die;

use \Slideshowck\CKModel;
use \Slideshowck\CKFof;

class SlideshowckModelMenus extends CKModel {

	public function getChildrenItems($menutype, $parentId) {
		\Joomla\CMS\MVC\Model\BaseDatabaseModel::addIncludePath(JPATH_SITE . '/administrator/components/com_menus/models', 'MenusModel');
		// Get an instance of the generic menus model
		$items = \Joomla\CMS\MVC\Model\BaseDatabaseModel::getInstance('Items', 'MenusModel', array('ignore_request' => true));
		if (! $parentId) $items->setState('filter.level', '1');
		$items->setState('filter.menutype', $menutype);
		$items->setState('filter.parent_id', $parentId);

		return $items->getItems();
	}

	public function getMenus() {
		$db = \Joomla\CMS\Factory::getDbo();
		$query = $db->getQuery(true)
					->select($db->qn(array('menutype', 'title')))
					->from($db->qn('#__menu_types'));
//					->where($db->qn('menutype') . ' = ' . $db->q($menuType));

		$menus = $db->setQuery($query)->loadObjectList();
		return $menus;
	}
}
components/com_slideshowck/models/styles.php000060400000003345152453623440015436 0ustar00<?php
/**
 * @name		Slideshow CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */

defined('_JEXEC') or die;

use Slideshowck\CKModel;
use Slideshowck\CKFof;

class SlideshowckModelStyles extends CKModel {

	protected $context = 'slideshowck.styles';

	public function __construct($config = array()) {

		parent::__construct($config);
	}

	public function getItems() {
		// Create a new query object.
		$db = CKFof::getDbo();
		$query = $db->getQuery(true);

		// Select the required fields from the table.
		$query->select('a.*');
		$query->from('`#__slideshowck_styles` AS a');

		// 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('%' .$search . '%');
				$query->where('(' . 'a.name LIKE ' . $search . ' )');
			}
		}

		// Do not list the trashed items
		$query->where('a.state > -1');

		// Add the list ordering clause.
		$orderCol = $this->state->get('list.ordering');
		$orderDirn = $this->state->get('list.direction');
		if ($orderCol && $orderDirn) {
			$query->order($orderCol . ' ' . $orderDirn);
		}

		$limitstart = $this->state->get('limitstart');
		$limit = $this->state->get('limit');
		$db->setQuery($query, $limitstart, $limit);

		$items = $db->loadObjectList();

		// automatically get the total number of items from the query
		$total = $this->getTotal($query);
		$this->state->set('limit_total', (empty($total) ? 0 : (int)$total));

		return $items;
	}
}
components/com_slideshowck/models/browse.php000060400000005402152453623440015410 0ustar00<?php
/**
 * @name		Slideshow CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */

defined('_JEXEC') or die;

use Slideshowck\CKModel;

class SlideshowckModelBrowse extends CKModel {

	/*
	 * Get a list of folders and files 
	 */
	public function getItemsList($type = 'image') {
		$input = \Joomla\CMS\Factory::getApplication()->input;

		$type = $input->get('type', $type, 'string');

		switch ($type) {
			case 'video' :
				$filetypes = array('.mp4', '.ogv', '.webm');
				break;
			case 'audio' :
				$filetypes = array('.mp3', '.ogg');
				break;
			case 'image' :
			default :
				$filetypes = array('.jpg', '.jpeg', '.png', '.gif', '.tiff', '.webp');
				break;
		}

		$folder = $input->get('folder', 'images', 'string');
		$tree = new stdClass();

		// look for all folder and files
		$this->getSubfolder(JPATH_SITE . '/' . $folder, $tree, implode('|', $filetypes), 1);

		$tree = $this->prepareList($tree);

		return $tree;
	}

	/* 
	 * List the subfolders and files according to the filter
	 */
	private function getSubfolder($folder, &$tree, $filter, $level) {
		$folders = \Joomla\CMS\Filesystem\Folder::folders($folder, '.', $recurse = false, $fullpath = true);

		if (! count($folders)) return;

		foreach ($folders as $f) {
			// list all authorized files from the folder
			$files = \Joomla\CMS\Filesystem\Folder::files($f, $filter, $recurse = false, $fullpath = false);
			$fName = \Joomla\CMS\Filesystem\File::makeSafe($f);
			$tree->$fName = new stdClass();
			$name = explode('/', $f);
			$name = end($name);
			$tree->$fName->name = $name;
			$tree->$fName->path = $f;
			$tree->$fName->files = $files;
			$tree->$fName->level = $level;

			// recursive loop
			$this->getSubfolder($f, $tree, $filter, $level+1);
		}
		return;
	}

	/* 
	 * Set level diff and check for depth
	 */
	private function prepareList($items) {
		if (! $items) return $items;

		$lastitem = 0;
		foreach ($items as $i => $item)
		{
			$item->deeper     = false;
			$item->shallower  = false;
			$item->level_diff = 0;

			if (isset($items->$lastitem))
			{
				$items->$lastitem->deeper     = ($item->level > $items->$lastitem->level);
				$items->$lastitem->shallower  = ($item->level < $items->$lastitem->level);
				$items->$lastitem->level_diff = ($items->$lastitem->level - $item->level);
			}
			$lastitem = $i;

			$item->basepath = str_replace(JPATH_SITE, '', $item->path);
			$item->basepath = str_replace('\\', '/', $item->basepath);
			$item->basepath = trim($item->basepath, '/');
		}

		return $items;
	}

	public function getPagination($total = null, $start = null, $limit = null)
	{
		return false;
	}
}
components/com_slideshowck/models/style.php000060400000001526152453623440015252 0ustar00<?php
/**
 * @name		Slider CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2016. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - http://www.template-creator.com - http://www.joomlack.fr
 */

// No direct access.
defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Slideshowck\CKModel;
use Slideshowck\CKFof;


class SlideshowckModelStyle extends CKModel {

	protected $table = '#__slideshowck_styles';

	var $item = null;

	function __construct() {
		parent::__construct();
	}

	public function save($row) {
		$id = CKFof::dbStore($this->table, $row);

		return $id;
	}

	public function getItem() {
		if (empty($this->item)) {
			$id = $this->input->get('id', 0, 'int');
			$this->item = CKFof::dbLoad($this->table, $id);
		}

		return $this->item;
	}

}components/com_slideshowck/models/index.html000060400000000032152453623440015365 0ustar00<html><body></body></html>components/com_slideshowck/backup/backup_137_01-02-2021-13-27-15.ssck000060400000025001152453623440020074 0ustar00{"slidesssource":"slidesmanager","slides":"[{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/01-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/01-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|_parent|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/02-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/02-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|_parent|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/05-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/05-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|_parent|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/06-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/06-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/07-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/07-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/09-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/09-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/12-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/12-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/15-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/15-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/17-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/17-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/18-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/18-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/19-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/19-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/20-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/20-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/21-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/21-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/22-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/22-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/23-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/23-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|}]","theme":"default","skin":"camera_amber_skin","alignment":"center","loader":"pie","width":"100%","height":"62%","minheight":"150","navigation":"0","thumbnails":"0","thumbnailwidth":"100","thumbnailheight":"75","pagination":"0","effect":["random"],"time":"5000","transperiod":"1000","captioneffect":"moveFromLeft","portrait":"1","autoAdvance":"1","hover":"0","displayorder":"normal","limitslides":"","fullpage":"0","imagetarget":"_parent","container":"","usemobileimage":"0","mobileimageresolution":"640","loadjquery":"1","loadjqueryeasing":"1","autocreatethumbs":"0","layout":"_:default","moduleclass_sfx":"","cache":"1","cache_time":"900","cachemode":"itemid","articlelength":"150","articlelink":"readmore","articletitle":"h3","showarticletitle":"1","usecaptionresponsive":"1","captionresponsiveresolution":"480","captionresponsivefontsize":"0.6em","captionresponsivehidecaption":"0","captionstylesusefont":"1","captionstylestextgfont":"Droid Sans","captionstylesfontsize":"1.1em","captionstylesfontcolor":"","captionstylesfontweight":"normal","captionstylesdescfontsize":"0.8em","captionstylesdescfontcolor":"","captionstylesusemargin":"1","captionstylesmargintop":"0","captionstylesmarginright":"0","captionstylesmarginbottom":"0","captionstylesmarginleft":"0","captionstylespaddingtop":"0","captionstylespaddingright":"0","captionstylespaddingbottom":"0","captionstylespaddingleft":"0","captionstylesusebackground":"1","captionstylesbgcolor1":"","captionstylesbgopacity":"0.6","captionstylesbgimage":"","captionstylesbgpositionx":"left","captionstylesbgpositiony":"top","captionstylesbgimagerepeat":"repeat","captionstylesusegradient":"1","captionstylesbgcolor2":"","captionstylesuseroundedcorners":"1","captionstylesroundedcornerstl":"5","captionstylesroundedcornerstr":"5","captionstylesroundedcornersbr":"5","captionstylesroundedcornersbl":"5","captionstylesuseshadow":"1","captionstylesshadowcolor":"","captionstylesshadowblur":"3","captionstylesshadowspread":"0","captionstylesshadowoffsetx":"0","captionstylesshadowoffsety":"0","captionstylesshadowinset":"0","captionstylesuseborders":"1","captionstylesbordercolor":"","captionstylesborderwidth":"1","module_tag":"div","bootstrap_size":"0","header_tag":"h3","header_class":"","style":"0"}components/com_slideshowck/backup/backup_151_24-08-2021-16-50-23.ssck000060400000015200152453623440020101 0ustar00{"slidesssource":"slidesmanager","slides":"[{|qq|imgname|qq|:|qq|images\/sampledata\/lord_balloonning\/01-Lord_Ballooning_2018.JPG|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/lord_balloonning\/01-Lord_Ballooning_2018.JPG|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/lord_balloonning\/02-Lord_Ballooning_2018.JPG|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/lord_balloonning\/02-Lord_Ballooning_2018.JPG|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/lord_balloonning\/03-Lord_Ballooning_2018.JPG|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/lord_balloonning\/03-Lord_Ballooning_2018.JPG|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/lord_balloonning\/04-Lord_Ballooning_2018.JPG|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/lord_balloonning\/04-Lord_Ballooning_2018.JPG|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/lord_balloonning\/ballons.JPG|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/lord_balloonning\/ballons.JPG|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|_parent|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/lord_balloonning\/lord_Ballooning-1.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/lord_balloonning\/lord_Ballooning-1.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|_parent|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/lord_balloonning\/lord_Ballooning-3.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/lord_balloonning\/lord_Ballooning-3.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|_parent|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/lord_balloonning\/Mr _Swing.JPG|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/lord_balloonning\/Mr _Swing.JPG|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|}]","theme":"default","skin":"camera_amber_skin","alignment":"center","loader":"pie","width":"100%","height":"62%","minheight":"150","navigation":"0","thumbnails":"0","thumbnailwidth":"100","thumbnailheight":"75","pagination":"0","effect":["random"],"time":"5000","transperiod":"1000","captioneffect":"moveFromLeft","portrait":"1","autoAdvance":"1","hover":"0","displayorder":"normal","limitslides":"","fullpage":"0","imagetarget":"_parent","linkposition":"fullslide","container":"","usemobileimage":"0","mobileimageresolution":"640","loadjquery":"1","loadjqueryeasing":"1","autocreatethumbs":"0","fixhtml":"0","layout":"_:default","moduleclass_sfx":"","cache":"1","cache_time":"900","cachemode":"itemid","articlelength":"150","articlelink":"readmore","articletitle":"h3","showarticletitle":"1","usecaption":"1","usecaptiondesc":"1","usecaptionresponsive":"1","captionresponsiveresolution":"480","captionresponsivefontsize":"0.6em","captionresponsivehidecaption":"0","captionstylesusefont":"1","captionstylestextgfont":"Droid Sans","captionstylesfontsize":"1.1em","captionstylesfontcolor":"","captionstylesfontweight":"normal","captionstylesdescfontsize":"0.8em","captionstylesdescfontcolor":"","captionstylesusemargin":"1","captionstylesmargintop":"0","captionstylesmarginright":"0","captionstylesmarginbottom":"0","captionstylesmarginleft":"0","captionstylespaddingtop":"0","captionstylespaddingright":"0","captionstylespaddingbottom":"0","captionstylespaddingleft":"0","captionstylesusebackground":"1","captionstylesbgcolor1":"","captionstylesbgopacity":"0.6","captionstylesbgimage":"","captionstylesbgpositionx":"left","captionstylesbgpositiony":"top","captionstylesbgimagerepeat":"repeat","captionstylesusegradient":"1","captionstylesbgcolor2":"","captionstylesuseroundedcorners":"1","captionstylesroundedcornerstl":"5","captionstylesroundedcornerstr":"5","captionstylesroundedcornersbr":"5","captionstylesroundedcornersbl":"5","captionstylesuseshadow":"1","captionstylesshadowcolor":"","captionstylesshadowblur":"3","captionstylesshadowspread":"0","captionstylesshadowoffsetx":"0","captionstylesshadowoffsety":"0","captionstylesshadowinset":"0","captionstylesuseborders":"1","captionstylesbordercolor":"","captionstylesborderwidth":"1","module_tag":"div","bootstrap_size":"0","header_tag":"h3","header_class":"","style":"0"}components/com_slideshowck/backup/backup_137_01-02-2021-14-05-05.ssck000060400000025001152453623440020070 0ustar00{"slidesssource":"slidesmanager","slides":"[{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/01-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/01-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|_parent|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/02-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/02-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|_parent|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/05-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/05-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|_parent|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/06-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/06-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/07-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/07-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/09-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/09-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/12-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/12-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/15-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/15-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/17-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/17-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/18-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/18-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/19-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/19-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/20-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/20-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/21-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/21-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/22-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/22-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/cirque_brousse\/23-20160518-cirque_brousse.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/cirque_brousse\/23-20160518-cirque_brousse.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|}]","theme":"default","skin":"camera_amber_skin","alignment":"center","loader":"pie","width":"100%","height":"62%","minheight":"150","navigation":"0","thumbnails":"0","thumbnailwidth":"100","thumbnailheight":"75","pagination":"0","effect":["random"],"time":"5000","transperiod":"1000","captioneffect":"moveFromLeft","portrait":"1","autoAdvance":"1","hover":"0","displayorder":"normal","limitslides":"","fullpage":"0","imagetarget":"_parent","container":"","usemobileimage":"0","mobileimageresolution":"640","loadjquery":"1","loadjqueryeasing":"1","autocreatethumbs":"0","layout":"_:default","moduleclass_sfx":"","cache":"1","cache_time":"900","cachemode":"itemid","articlelength":"150","articlelink":"readmore","articletitle":"h3","showarticletitle":"1","usecaptionresponsive":"1","captionresponsiveresolution":"480","captionresponsivefontsize":"0.6em","captionresponsivehidecaption":"0","captionstylesusefont":"1","captionstylestextgfont":"Droid Sans","captionstylesfontsize":"1.1em","captionstylesfontcolor":"","captionstylesfontweight":"normal","captionstylesdescfontsize":"0.8em","captionstylesdescfontcolor":"","captionstylesusemargin":"1","captionstylesmargintop":"0","captionstylesmarginright":"0","captionstylesmarginbottom":"0","captionstylesmarginleft":"0","captionstylespaddingtop":"0","captionstylespaddingright":"0","captionstylespaddingbottom":"0","captionstylespaddingleft":"0","captionstylesusebackground":"1","captionstylesbgcolor1":"","captionstylesbgopacity":"0.6","captionstylesbgimage":"","captionstylesbgpositionx":"left","captionstylesbgpositiony":"top","captionstylesbgimagerepeat":"repeat","captionstylesusegradient":"1","captionstylesbgcolor2":"","captionstylesuseroundedcorners":"1","captionstylesroundedcornerstl":"5","captionstylesroundedcornerstr":"5","captionstylesroundedcornersbr":"5","captionstylesroundedcornersbl":"5","captionstylesuseshadow":"1","captionstylesshadowcolor":"","captionstylesshadowblur":"3","captionstylesshadowspread":"0","captionstylesshadowoffsetx":"0","captionstylesshadowoffsety":"0","captionstylesshadowinset":"0","captionstylesuseborders":"1","captionstylesbordercolor":"","captionstylesborderwidth":"1","module_tag":"div","bootstrap_size":"0","header_tag":"h3","header_class":"","style":"0"}components/com_slideshowck/backup/index.html000060400000000054152453623440015353 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_slideshowck/backup/backup_151_25-10-2021-13-47-16.ssck000060400000015200152453623440020100 0ustar00{"slidesssource":"slidesmanager","slides":"[{|qq|imgname|qq|:|qq|images\/sampledata\/lord_balloonning\/01-Lord_Ballooning_2018.JPG|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/lord_balloonning\/01-Lord_Ballooning_2018.JPG|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/lord_balloonning\/02-Lord_Ballooning_2018.JPG|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/lord_balloonning\/02-Lord_Ballooning_2018.JPG|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/lord_balloonning\/03-Lord_Ballooning_2018.JPG|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/lord_balloonning\/03-Lord_Ballooning_2018.JPG|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/lord_balloonning\/04-Lord_Ballooning_2018.JPG|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/lord_balloonning\/04-Lord_Ballooning_2018.JPG|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/lord_balloonning\/ballons.JPG|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/lord_balloonning\/ballons.JPG|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|_parent|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/lord_balloonning\/lord_Ballooning-1.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/lord_balloonning\/lord_Ballooning-1.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|_parent|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/lord_balloonning\/lord_Ballooning-3.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/lord_balloonning\/lord_Ballooning-3.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|_parent|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|images\/sampledata\/lord_balloonning\/Mr _Swing.JPG|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|http:\/\/www.association3sur12.net\/images\/sampledata\/lord_balloonning\/Mr _Swing.JPG|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|,|qq|state|qq|:|qq|1|qq|,|qq|startdate|qq|:|qq||qq|,|qq|enddate|qq|:|qq||qq|}]","theme":"default","skin":"camera_amber_skin","alignment":"center","loader":"pie","width":"100%","height":"62%","minheight":"150","navigation":"0","thumbnails":"0","thumbnailwidth":"100","thumbnailheight":"75","pagination":"0","effect":["random"],"time":"5000","transperiod":"1000","captioneffect":"moveFromLeft","portrait":"1","autoAdvance":"1","hover":"0","displayorder":"normal","limitslides":"","fullpage":"0","imagetarget":"_parent","linkposition":"fullslide","container":"","usemobileimage":"0","mobileimageresolution":"640","loadjquery":"1","loadjqueryeasing":"1","autocreatethumbs":"0","fixhtml":"0","layout":"_:default","moduleclass_sfx":"","cache":"1","cache_time":"900","cachemode":"itemid","articlelength":"150","articlelink":"readmore","articletitle":"h3","showarticletitle":"1","usecaption":"1","usecaptiondesc":"1","usecaptionresponsive":"1","captionresponsiveresolution":"480","captionresponsivefontsize":"0.6em","captionresponsivehidecaption":"0","captionstylesusefont":"1","captionstylestextgfont":"Droid Sans","captionstylesfontsize":"1.1em","captionstylesfontcolor":"","captionstylesfontweight":"normal","captionstylesdescfontsize":"0.8em","captionstylesdescfontcolor":"","captionstylesusemargin":"1","captionstylesmargintop":"0","captionstylesmarginright":"0","captionstylesmarginbottom":"0","captionstylesmarginleft":"0","captionstylespaddingtop":"0","captionstylespaddingright":"0","captionstylespaddingbottom":"0","captionstylespaddingleft":"0","captionstylesusebackground":"1","captionstylesbgcolor1":"","captionstylesbgopacity":"0.6","captionstylesbgimage":"","captionstylesbgpositionx":"left","captionstylesbgpositiony":"top","captionstylesbgimagerepeat":"repeat","captionstylesusegradient":"1","captionstylesbgcolor2":"","captionstylesuseroundedcorners":"1","captionstylesroundedcornerstl":"5","captionstylesroundedcornerstr":"5","captionstylesroundedcornersbr":"5","captionstylesroundedcornersbl":"5","captionstylesuseshadow":"1","captionstylesshadowcolor":"","captionstylesshadowblur":"3","captionstylesshadowspread":"0","captionstylesshadowoffsetx":"0","captionstylesshadowoffsety":"0","captionstylesshadowinset":"0","captionstylesuseborders":"1","captionstylesbordercolor":"","captionstylesborderwidth":"1","module_tag":"div","bootstrap_size":"0","header_tag":"h3","header_class":"","style":"0"}components/com_slideshowck/language/en-GB/en-GB.com_slideshowck.sys.ini000060400000000651152453623440022151 0ustar00; license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
; Note : All ini files need to be saved as UTF-8


COM_SLIDESHOWCK="Slideshow CK"
COM_SLIDESHOWCK_DESC="Slideshow CK shows your images and content into a slider. Touch - mobile - responsive - rtl"
SLIDESHOWCK_DESC="Slideshow CK shows your images and content into a slider. Touch - mobile - responsive - rtl"
COM_SLIDESHOWCK_CONFIGURATION="Slideshow CK Configuration"components/com_slideshowck/language/en-GB/index.html000060400000000055152453623440016562 0ustar00<html><body bgcolor="#FFFFFF"></body></html>
components/com_slideshowck/language/fr-FR/fr-FR.com_slideshowck.sys.ini000060400000000661152453623440022222 0ustar00; license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
; Note : All ini files need to be saved as UTF-8


COM_SLIDESHOWCK="Slideshow CK"
COM_SLIDESHOWCK_DESC="Slideshow CK affiche vos images et contenus dans un slider. Tactile - mobile - responsive - rtl"
SLIDESHOWCK_DESC="Slideshow CK affiche vos images et contenus dans un slider. Tactile - mobile - responsive - rtl"
COM_SLIDESHOWCK_CONFIGURATION="Slideshow CK Configuration"components/com_slideshowck/language/index.html000060400000000055152453623440015672 0ustar00<html><body bgcolor="#FFFFFF"></body></html>
components/com_slideshowck/install.php000060400000007641152453623440014301 0ustar00<?php

defined('_JEXEC') or die('Restricted access');
/*
	preflight which is executed before install and update
	install
	update
	uninstall
	postflight which is executed after install and update
	*/

class com_slideshowckInstallerScript {

	function install($parent) {
		
	}
	
	function update($parent) {
		
	}

	function uninstall($parent) {
		// disable all plugins and modules
		$db = \Joomla\CMS\Factory::getDbo();
		$db->setQuery("UPDATE `#__modules` SET `published` = 0 WHERE `module` LIKE '%slideshowck%'");
		$db->execute();

		// $db->setQuery("UPDATE `#__extensions` SET `enabled` = 0 WHERE `type` = 'plugin' AND `element` LIKE '%slideshowck%' AND `folder` NOT LIKE '%slideshowck%'");
		// $db->execute();
		return true;
	}

	function preflight($type, $parent) {
		// check if a pro version already installed
		$xmlPath = JPATH_ROOT . '/administrator/components/com_slideshowck/slideshowck.xml';

		// if no file already exists
		if (! file_exists($xmlPath)) return true;

		$xmlData = $this->getXmlData($xmlPath);
		$isProInstalled = ((int)$xmlData->ckpro);

		if ($isProInstalled) {
			throw new RuntimeException('Slideshow CK Light cannot be installed over Slideshow CK Pro. Please install Slideshow CK Pro. To downgrade, please first uninstall Slideshow CK Pro. <a href="https://www.joomlack.fr/en/documentation/48-slideshow-ck/246-migration-from-slideshow-ck-version-1-to-version-2" target="_blank">Read more</a>');
			// return false;
		}

		// check if a V1 version is installed with the params (needs the pro)
		$xmlPath = JPATH_ROOT . '/modules/mod_slideshowck/mod_slideshowck.xml';

		// if no file already exists
		if (! file_exists($xmlPath)) return true;

		$xmlData = $this->getXmlData($xmlPath);
		$installedVersion = ((int)$xmlData->version );
		// if the installed version is the V1
		if(version_compare($installedVersion, '2.0.0', '<')) {
			// if the params is also installed
			if (file_exists(JPATH_ROOT . '/plugins/system/slideshowckparams/slideshowckparams.xml')) {
				throw new RuntimeException('Slideshow CK Light cannot be installed over Slideshow CK V1 + Params. Please install Slideshow CK Pro to get the same features as previously, else you may loose your existing settings. To downgrade, please first uninstall Slideshow CK Params. <a href="https://www.joomlack.fr/en/documentation/48-slideshow-ck/246-migration-from-slideshow-ck-version-1-to-version-2" target="_blank">Read more</a>');
				// return false;
			}

			
		}

		return true;
	}

	public function getXmlData($file) {
		if ( ! is_file($file))
		{
			return '';
		}

		$xml = simplexml_load_file($file);

		if ( ! $xml || ! isset($xml['version']))
		{
			return '';
		}

		return $xml;
	}

	// run on install and update
	function postflight($type, $parent) {
		// install modules and plugins
		jimport('joomla.installer.installer');
		$db = \Joomla\CMS\Factory::getDbo();
		$status = array();
		$src_ext = dirname(__FILE__).'/administrator/extensions';
		$installer = new \Joomla\CMS\Installer\Installer;

		// module
		$result = $installer->install($src_ext.'/mod_slideshowck');
		$status[] = array('name'=>'Slideshow CK - Module','type'=>'module', 'result'=>$result);

		// system plugin
		/*$result = $installer->install($src_ext.'/slideshowck');
		$status[] = array('name'=>'System - Slideshow CK','type'=>'plugin', 'result'=>$result);
		// system plugin must be enabled for user group limits and private areas
		$db->setQuery("UPDATE #__extensions SET enabled = '1' WHERE `element` = 'slideshowck' AND `type` = 'plugin'");
		$db->execute();*/

		foreach ($status as $statu) {
			if ($statu['result'] == true) {
				$alert = 'success';
				$icon = 'icon-ok';
				$text = 'Successful';
			} else {
				$alert = 'warning';
				$icon = 'icon-cancel';
				$text = 'Failed';
			}
			echo '<div class="alert alert-' . $alert . '"><i class="icon ' . $icon . '"></i>Installation and activation of the <b>' . $statu['type'] . ' ' . $statu['name'] . '</b> : ' . $text . '</div>';
		}

		return true;
	}
}
components/com_slideshowck/export/index.html000060400000000054152453623440015427 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_slideshowck/extensions/mod_slideshowck/tmpl/index.html000060400000000037152453623440022440 0ustar00<!DOCTYPE html><title></title>
components/com_slideshowck/extensions/mod_slideshowck/tmpl/default.php000060400000017200152453623440022600 0ustar00<?php
/**
 * @copyright	Copyright (C) 2012-2019 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * Module Slideshow CK
 * @license		GNU/GPL
 * */
// no direct access
defined('_JEXEC') or die('Restricted access');

// get the slideshow width
$width = ($params->get('width') AND $params->get('width') != 'auto') ? ' style="width:' . SlideshowckHelper::testUnit($params->get('width')) . ';"' : '';
?>
<div class="slideshowck <?php echo $params->get('moduleclass_sfx'); ?> camera_wrap <?php echo $params->get('skin'); ?>" id="camera_wrap_<?php echo $module->id; ?>"<?php echo $width; ?>>
	<?php
	$i = 0;
	foreach ($items as $item) {
		if ($params->get('limitslides', '') && $i >= $params->get('limitslides', ''))
			break;

		// B/C for V1
		if (isset($item->imgname) && ! isset($item->image)) SlideshowckHelper::legacyUpdateItem($item);

		// automatically create the minified thumb and use it
		$item->thumb = $item->image;
		if ($params->get('thumbnails', '1') == '1' && $params->get('autocreatethumbs','1') && $params->get('usethumbstype', 'mini') == 'mini') {
			$item->thumb = SlideshowckHelper::resizeImage($item->image, $params->get('thumbnailwidth', '182'), $params->get('thumbnailheight', '187'));
		}
		// use the minified thumb but don't create it
		else if ($params->get('thumbnails', '1') == '1' && $params->get('usethumbstype','mini') == 'mini'){
			$thumbext = explode(".", $item->image);
			$thumbext = end($thumbext);
			$thumbfile = str_replace(basename($item->image), "th/" . basename($item->image), $item->image);
			$thumbfile = str_replace("." . $thumbext, "_th." . $thumbext, $thumbfile);
			if (\Joomla\CMS\Uri\Uri::root(true) && substr($thumbfile, 0, (int)strlen(\Joomla\CMS\Uri\Uri::root(true) . '/')) == (\Joomla\CMS\Uri\Uri::root(true) . '/')) {
				$thumbfile = str_replace(\Joomla\CMS\Uri\Uri::root(true) . '/', '', $thumbfile);
			}
			if (file_exists(JPATH_ROOT . '/' . trim($thumbfile, '/'))) {
				$item->thumb = \Joomla\CMS\Uri\Uri::root(true) . '/' . trim($thumbfile, '/');
			}
		}

		// create new images for mobile
		if ($params->get('usemobileimage', '0') && $params->get('autocreatethumbs','1')) { 
			$resolutions = explode(',', $params->get('mobileimageresolution', '640'));
			foreach ($resolutions as $resolution) {
				SlideshowckHelper::resizeImage($item->image, (int)$resolution, '', (int)$resolution, '');
			}
		}

		if ($item->alignment != 'default') {
			$alignment = ' data-alignment="' . $item->alignment . '"';
		} else {
			$alignment = '';
		}
		$datacaptiontitle = str_replace("|dq|", "\"", (string)$item->title);
		$datacaptiontext = str_replace("|dq|", "\"", (string)$item->text);
		$datacaptionforlightbox = $datacaptiontitle . ( $datacaptiontext ? '::' . $datacaptiontext : '');
		$dataalt = htmlspecialchars(str_replace("\"", "&quot;", str_replace(">", "&gt;", str_replace("<", "&lt;", $datacaptiontitle))));
		$datatitle = ($params->get('lightboxcaption', 'caption') != 'caption') ? 'data-title="' . htmlspecialchars(str_replace("\"", "&quot;", str_replace(">", "&gt;", str_replace("<", "&lt;", $datacaptionforlightbox)))) . '" ' : '';
		$album = ($params->get('lightboxgroupalbum', '0')) ? '[albumslideshowck' .$module->id .']' : '';
		$target = ($item->target == 'default') ? $params->get('linktarget') : $item->target;
		$datarel = ($target == 'lightbox') ? 'data-rel="lightbox' . $album . '" ' : '';
		$datarel .= ($target == '_blank') ? 'data-rel="noopener noreferrer" ' : '';
		$datatime = ($item->time) ? ' data-time="' . $item->time . '"' : '';
		$link = $params->get('linkautoimage', '0') == '1' && $item->image && !$item->link ? $item->image : $item->link;

		if ($params->get('lightboxautolinkimages', '0') == '1') {
			$item->link = $item->link ? $item->link : $item->image;
		}

		$linkposition = $params->get('linkposition', 'fullslide');
		$linkClass = ( $linkposition == 'button' ? $params->get('linkbuttonclass', '') . ' camera-button' : ' camera-link' );
		$linkTarget = ( $target == '_blank' ? ' target="_blank" rel="noopener noreferrer"' : '' );
		$startLink = '<a class="' . $linkClass .'" href="' . $link . '"' . $linkTarget . '>';
		?>
		<div <?php echo $datarel . $datatitle; ?>data-alt="<?php echo $dataalt; ?>" data-thumb="<?php echo $item->thumb; ?>" data-src="<?php echo $item->image; ?>" <?php if ($link && $linkposition == 'fullslide') echo 'data-link="' . $link . '" data-target="' . $target . '"'; echo $alignment . $datatime; ?>>
			<?php if ($params->get('imageforseo', '0')) { ?>
				<img src="<?php echo $item->image; ?>" style="display:none" alt="<?php echo htmlspecialchars($item->title) ?>" />
			<?php } ?>
			<?php if ($item->video) { ?>
				<?php if (strpos($item->video, 'http') !== 0) {
				$autoplay = $item->videoautoplay == '1' ? 'data-autoplay="1" muted="muted"' : '';
				$videoloop = $item->videoloop == '1' ? ' loop' : '';
				$videocontrols = $item->videocontrols == '0' ? ($autoplay ? '' : ' onclick="this.play()"') : ' controls';
				?>
				<video src="<?php echo $item->video; ?>" width="100%" height="100%" playsinline <?php echo $autoplay ?><?php echo $videoloop ?><?php echo $videocontrols ?>>
					<source src="<?php echo $item->video ?>" >
				</video>
				<?php } else { ?>
				<iframe src="<?php echo $item->video; ?>" width="100%" height="100%" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>
				<?php } ?>
			<?php
			}
			if (($params->get('usecaption', '1') == '1') && ($item->title || $item->text) && (($params->get('lightboxcaption', 'caption') != 'title' || $target != 'lightbox') || !$link)) {
			?>
				<?php if ($params->get('usecaption', '1')) { ?>
				<div class="camera_caption <?php echo $params->get('captioneffect', 'moveFromBottom')?>">
					<?php 
//					$showcaption = $params->get('usecaption', '1') == '1' && ($item->title || $item->desc);
					$showtitle = $params->get('usetitle', '1') == '1' && $item->title;
					$showdescription = $params->get('usecaptiondesc', '1') == '1' && $item->text;
					if ($showtitle) { ?>
					<div class="camera_caption_title">
						<?php 
						$item->title = str_replace("|dq|", "\"", $item->title);
						if ($link && $linkposition == 'title') {
							echo $startLink . $item->title . '</a>';
						} else {
							echo $item->title;
						} ?>
					</div>
					<?php } ?>
					<?php if ($showdescription) { ?>
					<div class="camera_caption_desc">
						<?php 
						$caption = str_replace("|dq|", "\"", $item->text);
						if ($params->get('content_prepare', 0)) $caption = \Joomla\CMS\HTML\HTMLHelper::_('content.prepare', $caption);
						$textlength = (int)$params->get('textlength', '0');
						if ($params->get('fixhtml', '0') == '1' && trim($caption)) {
							// Parse the html code of the text into a fixer to avoid bad rendering issues
							$htmlfixer = new SlideshowCKHtmlFixer();
							$captionFixed = $htmlfixer->getFixedHtml(trim($caption));
							$caption = $captionFixed;
						}
						if ($params->get('striptags', '0') == '1' && $item->texttype != 'pagebuilderck') {
							$caption = strip_tags($caption);
						}
						if ($textlength > 0) {
							$caption = SlideshowckHelper::substring($caption, $textlength, '...', false);
						}
						echo $caption;
						?>
					<?php
					if (isset($item->more) && count($item->more)) {
						foreach ($item->more as $m) {
							echo $m;
						}
					}
					?>
					</div>
					<?php } ?>
					<?php if ($link && $linkposition == 'caption') {
						echo $startLink . '</a>';
					} ?>
					<?php if ($link && $linkposition == 'button') { ?>
						<?php echo $startLink . \Joomla\CMS\Language\Text::_($params->get('linkbuttontext', 'MOD_SLIDESHOWCK_LINK_BUTTON_TEXT')) . '</a>'; ?>
					<?php } ?>
					</div>
				<?php } ?>
			<?php
			}
			?>
		</div>
<?php 
		$i++;
	}
?>
</div>
<div style="clear:both;"></div>
components/com_slideshowck/extensions/mod_slideshowck/language/index.html000060400000000037152453623440023247 0ustar00<!DOCTYPE html><title></title>
components/com_slideshowck/extensions/mod_slideshowck/language/fr-FR/index.html000060400000000037152453623440024163 0ustar00<!DOCTYPE html><title></title>
components/com_slideshowck/extensions/mod_slideshowck/language/fr-FR/fr-FR.mod_slideshowck.ini000060400000067137152453623440026776 0ustar00; @copyright	Copyright (C) 2010 Cédric KEIFLIN alias ced1870
; https://www.joomlack.fr
; @license		GNU/GPL
; Double quotes in the values have to be formatted as "_QQ_"

SLIDESHOWCK_XML_DESCRIPTION = "Slideshow CK affiche un slideshow avec de superbes effets. Il est compatible mobiles et responsive design. Sa largeur s'adapte à la largeur de l'écran et vous pouvez faire défiler les images en glissant le doigt sur l'écran."
SLIDESHOWCK_OPTIONS_SLIDES = "Gestion des slides"
SLIDESHOWCK_OPTIONS_STYLES = "Options de styles"
SLIDESHOWCK_OPTIONS_EFFECTS = "Options des effets"
SLIDESHOWCK_SKIN_LABEL = "Apparence"
SLIDESHOWCK_SKIN_DESC = "Choisir une couleur"
SLIDESHOWCK_ALIGNEMENT_LABEL = "Alignement de l'image"
SLIDESHOWCK_ALIGNEMENT_DESC = "Permet de positionner l'image dans la zone du slideshow"
SLIDESHOWCK_TOP = "haut"
SLIDESHOWCK_BOTTOM = "bas"
SLIDESHOWCK_TOPLEFT = "haut gauche"
SLIDESHOWCK_TOPCENTER = "haut milieu"
SLIDESHOWCK_TOPRIGHT = "haut droite"
SLIDESHOWCK_MIDDLELEFT = "milieu gauche"
SLIDESHOWCK_CENTER = "centre"
SLIDESHOWCK_MIDDLERIGHT = "milieu droite"
SLIDESHOWCK_BOTTOMLEFT = "bas gauche"
SLIDESHOWCK_BOTTOMCENTER = "bas milieu"
SLIDESHOWCK_BOTTOMRIGHT = "bas droite"
SLIDESHOWCK_LOADER_LABEL = "Icône de chargement"
SLIDESHOWCK_LOADER_DESC = "Choisir quel type d'icône afficher"
SLIDESHOWCK_LOADER_PIE = "cercle"
SLIDESHOWCK_LOADER_BAR = "barre"
SLIDESHOWCK_LOADER_NONE = "aucun"
SLIDESHOWCK_WIDTH_LABEL = "Largeur"
SLIDESHOWCK_WIDTH_DESC = "Largeur du slideshow en px, peut aussi prendre la valeur 'auto'"
SLIDESHOWCK_HEIGHT_LABEL = "Hauteur"
SLIDESHOWCK_HEIGHT_DESC = "Hauteur du slideshow, peut aussi prendre une valeur en px ou en %"
SLIDESHOWCK_THUMBNAILS_LABEL = "Miniatures"
SLIDESHOWCK_THUMBNAILS_DESC = "Afficher les miniatures sous le slideshow"
SLIDESHOWCK_PAGINATION_LABEL = "Pagination"
SLIDESHOWCK_PAGINATION_DESC = "Afficher les boutons de navigation"
SLIDESHOWCK_EFFECT_LABEL = "Effet d'animation"
SLIDESHOWCK_EFFECT_DESC = "Choisir un effet à appliquer. On peut sélectionner plusieurs effets en maintenant la touche CTRL"
SLIDESHOWCK_TRANSITION_LABEL = "Transition"
SLIDESHOWCK_TRANSITION_DESC = "Transition de l'effet"
SLIDESHOWCK_TIME_LABEL = "Durée d'affichage"
SLIDESHOWCK_TIME_DESC = "Durée d'affichage de chaque image"
SLIDESHOWCK_TRANSPERIOD_LABEL = "Durée de la transition"
SLIDESHOWCK_TRANSPERIOD_DESC = "Temps nécessaire pour passer d'une image à l'autre"
SLIDESHOWCK_AUTOADVANCE_LABEL = "Lecture automatique"
SLIDESHOWCK_AUTOADVANCE_DESC = "Le slideshow démarre automatiquement au chargement de la page"
SLIDESHOWCK_PORTRAIT_LABEL = "Ajuster les images"
SLIDESHOWCK_PORTRAIT_DESC = "Si non les images conservent leur taille d'origine"
SLIDESHOWCK_ADDSLIDE = "Ajouter un slide"
SLIDESHOWCK_SELECTIMAGE = "Sélectionner l'image"
SLIDESHOWCK_CAPTION = "Légende"
SLIDESHOWCK_USETOSHOW = "Afficher"
SLIDESHOWCK_IMAGE = "Image"
SLIDESHOWCK_VIDEO = "Vidéo"
SLIDESHOWCK_IMAGEOPTIONS = "Options de l'image"
SLIDESHOWCK_LINKOPTIONS = "Options du lien"
SLIDESHOWCK_VIDEOOPTIONS = "Options de la vidéo"
SLIDESHOWCK_ALIGNEMENT_LABEL = "Alignement"
SLIDESHOWCK_LINK = "Url du lien"
SLIDESHOWCK_TARGET = "Cible"
SLIDESHOWCK_SAMEWINDOW = "s'ouvre dans la même fenêtre"
SLIDESHOWCK_NEWWINDOW = "s'ouvre dans une nouvelle fenêtre"
SLIDESHOWCK_VIDEOURL = "Url de la vidéo"
SLIDESHOWCK_REMOVE = "Supprimer ce slide"
SLIDESHOWCK_IMPORTFROMFOLDER = "Importer d'un dossier"
SLIDESHOWCK_LOADJQUERY_LABEL = "Charger JQuery"
SLIDESHOWCK_LOADJQUERY_DESC = "Si vous avez une extension qui charge déjà JQuery vous pouvez choisir de ne pas charger le script de Slideshow CK"
SLIDESHOWCK_LOADJQUERYEASING_LABEL = "Charger JQuery Easing"
SLIDESHOWCK_LOADJQUERYEASING_DESC = "Choisissez si vous voulez charger le script pour les transitions"
SLIDESHOWCK_LOADJQUERYMOBILE_LABEL = "Charger JQuery mobile"
SLIDESHOWCK_LOADJQUERYMOBILE_DESC = "Choisissez de charger le script pour mobiles"
SLIDESHOWCK_THUMBNAILWIDTH_LABEL = "Largeur de la miniature"
SLIDESHOWCK_THUMBNAILWIDTH_DESC = "Donnez la largeur de la miniature en px"
SLIDESHOWCK_THUMBNAILHEIGHT_LABEL = "Hauteur de la miniature"
SLIDESHOWCK_THUMBNAILHEIGHT_DESC = "Donnez la hauteur de la miniature en px"
SLIDESHOWCK_NAVIGATION_HOVER = "au survol"
SLIDESHOWCK_NAVIGATION_ALWAYS = "toujours"
SLIDESHOWCK_NAVIGATION_NONE = "aucune"
SLIDESHOWCK_NAVIGATION_LABEL = "Navigation"
SLIDESHOWCK_NAVIGATION_DESC = "Choisissez si vous voulez afficher les boutons de navigation"
SLIDESHOWCK_DISPLAYORDER_LABEL = "Ordre d'affichage"
SLIDESHOWCK_DISPLAYORDER_DESC = "Choisissez la manière d'afficher les images"
SLIDESHOWCK_DISPLAYORDER_NORMAL = "dans l'ordre"
SLIDESHOWCK_DISPLAYORDER_SHUFFLE = "aléatoire"
SLIDESHOWCK_THEME_LABEL="Thème"
SLIDESHOWCK_THEME_DESC="Choisir un thème pour le slideshow"
SLIDESHOWCK_CAPTIONEFFECT_LABEL="Animation de la légende"
SLIDESHOWCK_CAPTIONEFFECT_DESC="Choisir comment la légende s'anime"
SLIDESHOWCK_HOVER_LABEL="Pause au survol"
SLIDESHOWCK_HOVER_DESC="Met le slideshow en pause lorsque la souris le survol"
SLIDESHOWCK_CAPTIONSTYLES="Styles de la légende"
SLIDESHOWCK_FULLPAGE_LABEL="Utiliser comme fond de page"
SLIDESHOWCK_FULLPAGE_DESC="Charger le slideshow en fond de page en plein écran"
SLIDESHOWCK_SHOWARTICLETITLE_LABEL="Montrer le titre de l'article"
SLIDESHOWCK_SHOWARTICLETITLE_DESC="Choisissez si vous voulez afficher le titre de l'article"
SLIDESHOWCK_OPTIONS_FROMFOLDER="Charger les slides depuis un dossier"
SLIDESHOWCK_CHECKPARAMSPLUGIN="Vous devez télécharger et installer le <a href="_QQ_"https://www.joomlack.fr/slideshowck/plugin-slideshow-params"_QQ_" target="_QQ_"_blank"_QQ_">plugin Slideshow Params</a>"
SLIDESHOWCK_SPACER_SLIDESHOWCKPARAMS_PATCH_INSTALLED="Plugin Slideshow CK installé"
SLIDESHOWCK_FROMFOLDERNAME_LABEL="Charger à partir du dossier"
SLIDESHOWCK_FROMFOLDERNAME_DESC="Choisir le dossier à partir duquel charger les images (entrez le chemin à partir de la base du site puis enregistrez le module, ensuite vous pouvez importer les images)"
SLIDESHOWCK_SLIDESSOURCE_LABEL="Sources des images"
SLIDESHOWCK_SLIDESSOURCE_DESC="Choisir si vous voulez charger les images à partir du gestionnaire de slides ou d'un dossier"
SLIDESHOWCK_SLIDEMANAGER="Gestionnaire de slides"
SLIDESHOWCK_FOLDER="Importer depuis un dossier"
SLIDESHOWCK_IMPORT="Importer"
SLIDESHOWCK_OPTIONS_LIGHTBOX="Options pour la Lightbox"
SLIDESHOWCK_LIGHTBOXTYPE_LABEL="Type de Lightbox"
SLIDESHOWCK_LIGHTBOXTYPE_DESC="Sélectionner la lightbox à utiliser pour afficher les liens dans une popup. Squeezebox est le script natif de Joomla!. Mediabox CK est la lightbox avancée que vous pouvez télécharger sur https://www.joomlack.fr"
SLIDESHOWCK_SQUEEZEBOX="Squeezebox"
SLIDESHOWCK_MEDIABOXCK="Mediabox CK"
SLIDESHOWCK_LIGHTBOXCAPTION_LABEL="Où afficher la légende"
SLIDESHOWCK_LIGHTBOXCAPTION_DESC="La légende qui est définie dans les options du slide peut être affichée soit sur le slideshow, ou dans la lightbox (uniquement si vous utilisez Mediabox CK), ou les deux"
SLIDESHOWCK_LIGHTBOXCAPTION="Dans le slideshow"
SLIDESHOWCK_LIGHTBOXTITLE="Dans la lightbox (Mediabox CK)"
SLIDESHOWCK_LIGHTBOXCAPTIONANDTITLE="Dans les deux"
SLIDESHOWCK_SPACERFOLDERAUTOLOAD_LABEL="Charger automatiquement depuis un dossier"
SLIDESHOWCK_SPACERFOLDERIMPORT_LABEL="Importer les images depuis un dossier"
SLIDESHOWCK_AUTOLOADFOLDERNAME_LABEL="Charger les images automatiquement depuis un dossier"
SLIDESHOWCK_AUTOLOADFOLDERNAME_DESC="Choisir le dossier à partir duquel charger les images automatiquement"
SLIDESHOWCK_AUTOLOADFOLDER="Charger automatiquement depuis un dossier"
SLIDESHOWCK_MOBILEIMAGE_SPACER_LABEL="Options pour images pour Mobile"
SLIDESHOWCK_USEMOBILEIMAGE_LABEL="Utiliser des images pour Mobile"
SLIDESHOWCK_USEMOBILEIMAGE_DESC="Si vous activez cette option le slideshow va détecter la largeur de l'écran et charger une image alternative en dessous de cette valeur. Par exemple pour une résolution de 640px il chargera l'image 'dossier/640/image.jpg' à la place de l'image 'dossier/image.jpg'. ATTENTION à ce que les deux images existent !"
SLIDESHOWCK_MOBILEIMAGERESOLUTION_LABEL="Resolution maxi pour les images pour Mobile"
SLIDESHOWCK_MOBILEIMAGERESOLUTION_DESC="Sous cette largeur d'écran ce seront les images alternatives qui seront chargées"
SLIDESHOWCK_LIMITSLIDES_LABEL="Nombre de slides"
SLIDESHOWCK_LIMITSLIDES_DESC="Cette option n'est active que si vous avez choisi un ordre d'affichage Aléatoire. Alors vous pouvez limiter le nombre de slides à afficher."
SLIDESHOWCK_IMAGETARGET_LABEL="Cible par défaut des liens"
SLIDESHOWCK_IMAGETARGET_DESC="Choisir la cible par défaut des liens pour tous les slides"
SLIDESHOWCK_DEFAULT="defaut"
SLIDESHOWCK_LIGHTBOX="dans une Lightbox"
SLIDESHOWCK_HIKASHOP_FIELDSET_LABEL="Options pour Hikashop"
SLIDESHOWCKHIKASHOP_CHECKPLUGIN="Vous devez télécharger et installer le <a href="_QQ_"https://www.joomlack.fr/slideshowck/plugin-slideshow-hikashop"_QQ_" target="_QQ_"_blank"_QQ_">plugin Slideshow CK Hikashop</a>"

;styles
SLIDESHOWCK_BOLD = "gras"
SLIDESHOWCK_NORMAL = "normal"
SLIDESHOWCK_SPACER_STYLESBACKGROUND="Arrière plan"
SLIDESHOWCK_SPACER_STYLESROUNDEDCORNERS="Coins arrondis"
SLIDESHOWCK_SPACER_STYLESSHADOW="Ombre"
SLIDESHOWCK_SPACER_STYLESBORDERS="Bordures"
SLIDESHOWCK_MARGIN_LABEL="Marges externes"
SLIDESHOWCK_MARGIN_DESC="Valeur en px"
SLIDESHOWCK_PADDING_LABEL="Marges internes"
SLIDESHOWCK_PADDING_DESC="Valeur en px"
SLIDESHOWCK_BGCOLOR1_LABEL="Couleur de fond"
SLIDESHOWCK_BGCOLOR1_DESC="Choisir une couleur"
SLIDESHOWCK_BGCOLOR2_LABEL="Couleur de dégradé"
SLIDESHOWCK_BGCOLOR2_DESC="Choisir une couleur qui sera utilisé pour créer un dégradé à partir de la couleur de fond"
SLIDESHOWCK_ROUNDEDCORNERSTL_LABEL="Haut gauche"
SLIDESHOWCK_ROUNDEDCORNERSTL_DESC="Valeur du rayon en px"
SLIDESHOWCK_ROUNDEDCORNERSTR_LABEL="Haut droite"
SLIDESHOWCK_ROUNDEDCORNERSTR_DESC="Valeur du rayon en px"
SLIDESHOWCK_ROUNDEDCORNERSBR_LABEL="Bas droite"
SLIDESHOWCK_ROUNDEDCORNERSBR_DESC="Valeur du rayon en px"
SLIDESHOWCK_ROUNDEDCORNERSBL_LABEL="Bas gauche"
SLIDESHOWCK_ROUNDEDCORNERSBL_DESC="Valeur du rayon en px"
SLIDESHOWCK_SHADOWCOLOR_LABEL="Couleur de l'ombre"
SLIDESHOWCK_SHADOWCOLOR_DESC="Choisir une couleur"
SLIDESHOWCK_SHADOWBLUR_LABEL="Largeur de l'ombre"
SLIDESHOWCK_SHADOWBLUR_DESC="Valeur en px"
SLIDESHOWCK_SHADOWSPREAD_LABEL="Propagation"
SLIDESHOWCK_SHADOWSPREAD_DESC="Valeur en px"
SLIDESHOWCK_OFFSETX_LABEL="Décalage horizontal"
SLIDESHOWCK_OFFSETX_DESC="Décalage sur l'axe X, peut aussi prendre une valeur négative"
SLIDESHOWCK_OFFSETY_LABEL="Décalage vertical"
SLIDESHOWCK_OFFSETY_DESC="Décalage sur l'axe Y, peut aussi prendre une valeur négative"
SLIDESHOWCK_SHADOWINSET_LABEL="Interne"
SLIDESHOWCK_SHADOWINSET_DESC="Ajoute l'attribut 'inset' pour créer l'ombre vers l'intérieur"
SLIDESHOWCK_BORDERCOLOR_LABEL="Couleur de bordure"
SLIDESHOWCK_BORDERCOLOR_DESC="Choisir une couleur"
SLIDESHOWCK_BORDERWIDTH_LABEL="Largeur de bordure"
SLIDESHOWCK_BORDERWIDTH_DESC="Valeur en px"
SLIDESHOWCK_SPACER_STYLESMARGIN = "Marges"
SLIDESHOWCK_USEMARGIN_LABEL = "Utiliser les marges"
SLIDESHOWCK_USEMARGIN_DESC = ""
SLIDESHOWCK_USEBACKGROUND_LABEL = "Utiliser la couleur de fond"
SLIDESHOWCK_USEBACKGROUND_DESC = ""
SLIDESHOWCK_USEGRADIENT_LABEL = "Utiliser la couleur de dégradé"
SLIDESHOWCK_USEGRADIENT_DESC = ""
SLIDESHOWCK_USEROUNDEDCORNERS_LABEL = "Utiliser les coins arrondis"
SLIDESHOWCK_USEROUNDEDCORNERS_DESC = ""
SLIDESHOWCK_USESHADOW_LABEL = "Utiliser l'ombre"
SLIDESHOWCK_USESHADOW_DESC = ""
SLIDESHOWCK_USEBORDERS_LABEL = "Utiliser les bordures"
SLIDESHOWCK_USEBORDERS_DESC = ""
SLIDESHOWCK_SPACER_STYLESFONT = "Style de police"
SLIDESHOWCK_USEFONT_LABEL = "Utiliser la police"
SLIDESHOWCK_USEFONT_DESC = ""
SLIDESHOWCK_GFONT_LABEL = "Police"
SLIDESHOWCK_GFONT_DESC = "Choisissez la police google à utiliser"
SLIDESHOWCK_FONTSIZE_LABEL = "Taille de police"
SLIDESHOWCK_FONTSIZE_DESC = "Donner la taille que vous voulez en précisant l'unité (px, em, %)"
SLIDESHOWCK_FONTWEIGHT_LABEL = "Style de police"
SLIDESHOWCK_FONTWEIGHT_DESC = "Choisissez si vous voulez la police en normal ou gras"
SLIDESHOWCK_FONTCOLOR_LABEL = "Couleur de police"
SLIDESHOWCK_FONTCOLOR_DESC = "Choisissez la couleur"
SLIDESHOWCK_DESCFONTSIZE_LABEL = "Taille de la description"
SLIDESHOWCK_DESCFONTSIZE_DESC = "Taille de police de la description"
SLIDESHOWCK_DESCFONTCOLOR_LABEL = "Couleur de la description"
SLIDESHOWCK_DESCFONTCOLOR_DESC = "Choisissez la couleur pour la description"
SLIDESHOWCK_MARGINTOP_LABEL="Marge haute"
SLIDESHOWCK_MARGINTOP_DESC="marge en px"
SLIDESHOWCK_MARGINRIGHT_LABEL="Marge droite"
SLIDESHOWCK_MARGINRIGHT_DESC="marge en px"
SLIDESHOWCK_MARGINBOTTOM_LABEL="Marge bas"
SLIDESHOWCK_MARGINBOTTOM_DESC="marge en px"
SLIDESHOWCK_MARGINLEFT_LABEL="Marge gauche"
SLIDESHOWCK_MARGINLEFT_DESC="marge en px"
SLIDESHOWCK_PADDINGTOP_LABEL="Marge interne haut"
SLIDESHOWCK_PADDINGTOP_DESC="marge en px"
SLIDESHOWCK_PADDINGRIGHT_LABEL="Marge interne droite"
SLIDESHOWCK_PADDINGRIGHT_DESC="marge en px"
SLIDESHOWCK_PADDINGBOTTOM_LABEL="Marge interne bas"
SLIDESHOWCK_PADDINGBOTTOM_DESC="marge en px"
SLIDESHOWCK_PADDINGLEFT_LABEL="Marge interne gauche"
SLIDESHOWCK_PADDINGLEFT_DESC="marge en px"
SLIDESHOWCK_BACKGROUNDIMAGE_LABEL="Background image"
SLIDESHOWCK_BACKGROUNDIMAGE_DESC="Select an image to apply as background"
SLIDESHOWCK_BACKGROUNDPOSITIONX_LABEL="Poxition X"
SLIDESHOWCK_BACKGROUNDPOSITIONX_DESC="Choose a value with px (ex: 25px) or left, right, center, etc..."
SLIDESHOWCK_BACKGROUNDPOSITIONY_LABEL="Poxition Y"
SLIDESHOWCK_BACKGROUNDPOSITIONY_DESC="Choose a value with px (ex: 25px) or left, right, center, etc..."
SLIDESHOWCK_ARTICLEOPTIONS="Options de l'article"
SLIDESHOWCK_ARTICLELENGTH_LABEL="Nombre de caractères"
SLIDESHOWCK_ARTICLELENGTH_DESC="L'article sera coupé après le nombre de caractèrese"
SLIDESHOWCK_ARTICLELINK_LABEL="Lien de l'article sur"
SLIDESHOWCK_ARTICLELINK_DESC="Choisir si vous voulez que le lien de l'article soit sur le titre ou sur un lien 'Lire la suite'"
SLIDESHOWCK_READMORE_OPTION="lien lire la suite"
SLIDESHOWCK_TITLE_OPTION="titre de l'article"
SLIDESHOWCK_ARTICLETITLE_LABEL="Tag du titre de l'article"
SLIDESHOWCK_ARTICLETITLE_DESC="Choisir quel tag html utiliser pour écrire le titre de l'article"
SLIDESHOWCK_SLIDETIME="entrez une valeur de durée d'affichage spécifique pour ce slide, sinon la durée par défaut sera utlisée"

; added 1.3.11
SLIDESHOWCK_LIGHTBOXGROUPALBUM_LABEL="Grouper les liens dans un album"
SLIDESHOWCK_LIGHTBOXGROUPALBUM_DESC="SEULEMENT POUR MEDIABOX CK : Groupe les liens dans un album et active la navigation"
SLIDESHOWCK_CLEAR="Effacer"
SLIDESHOWCK_SELECT="Sélectionner"

;added 1.4.0
SLIDESHOWCK_ARTICLEOPTIONS="Options d'article"
SLIDESHOWCK_ARTICLE_ID="Article ID"
SLIDESHOWCK_TITLE_ONLY="titre seulement"
SLIDESHOWCK_DESC_ONLY="description seulement"
SLIDESHOWCK_OPTIONS_SLIDESSOURCE="<img src=../modules/mod_slideshowck/elements/images/pictures.png style=display:inline-block;margin:2px 5px 0 2px; />Source des slides"
SLIDESHOWCK_OPTIONS_FROMARTICLECATEGORY="<img src=../modules/mod_slideshowck/elements/images/picture_add.png style=display:inline-block;margin:2px 5px 0 2px; />Charger automatiquement depuis une catégorie d'articles"
SLIDESHOWCK_OPTIONS_FROMFOLDER="<img src=../modules/mod_slideshowck/elements/images/picture_add.png style=display:inline-block;margin:2px 5px 0 2px; />Charger automatiquement depuis un dossier"
SLIDESHOWCK_OPTIONS_STYLES = "<img src=../modules/mod_slideshowck/elements/images/css.png style=display:inline-block;margin:2px 5px 0 2px; />Options de styles"
SLIDESHOWCK_OPTIONS_EFFECTS = "<img src=../modules/mod_slideshowck/elements/images/chart_curve.png style=display:inline-block;margin:2px 5px 0 2px; />Options des effets"
SLIDESHOWCK_OPTIONS_LIGHTBOX="<img src=../modules/mod_slideshowck/elements/images/magnifier_zoom_in.png style=display:inline-block;margin:2px 5px 0 2px; />Options pour la Lightbox"
SLIDESHOWCK_OPTIONS_ADVANCED="<img src=../modules/mod_slideshowck/elements/images/wrench.png style=display:inline-block;margin:2px 5px 0 2px; />Options avancées"
SLIDESHOWCK_ARTICLEOPTIONS="<img src=../modules/mod_slideshowck/elements/images/text_signature.png style=display:inline-block;margin:2px 5px 0 2px; />Options de l'article"
SLIDESHOWCK_CAPTIONSTYLES="<img src=../modules/mod_slideshowck/elements/images/style.png style=display:inline-block;margin:2px 5px 0 2px; />Styles de la légende"
SLIDESHOWCK_HIKASHOP_FIELDSET_LABEL="<img src=../modules/mod_slideshowck/elements/images/basket.png style=display:inline-block;margin:2px 5px 0 2px; />Options pour Hikashop"
SLIDESHOWCK_SLIDEMANAGER="Gestionnaire de slides"
SLIDESHOWCK_SLIDESSOURCE_LABEL="Sources des images"
SLIDESHOWCK_SLIDESSOURCE_DESC="Choisir si vous voulez charger les images à partir du gestionnaire de slides ou d'un dossier"
SLIDESHOWCK_SPACERFOLDERIMPORT_LABEL="Importer les images depuis un dossier"
SLIDESHOWCK_TITLE="Titre"
SLIDESHOWCK_OPTIONS_SLIDES = "<img src=../modules/mod_slideshowck/elements/images/picture_add.png style=display:inline-block;margin-top:2px;margin-right:5px;margin-left:2px; />Gestionnaire de slides"
SLIDESHOWCK_CAPTION="Description"
SLIDESHOWCK_AUTOCREATETHUMBS_LABEL="Créer les miniatures automatiquement"
SLIDESHOWCK_AUTOCREATETHUMBS_DESC="Le serveur va créer automatiquement les miniatures. Attention cela peut générer une surcharge de votre serveur"
SLIDESHOWCK_BGOPACITY_LABEL="Opacité"
SLIDESHOWCK_BGOPACITY_LABEL="Définir l'opacité de l'arrière plan"

;added 1.4.6
SLIDESHOWCK_IMAGE_OPTION="Image"

;added 1.4.7
SLIDESHOWCK_CONTAINER_LABEL="Charger en fond de conteneur"
SLIDESHOWCK_CONTAINER_DESC="<strong>Pour les utilisateurs avancés :</strong>Renseignez le sélecteur CSS du bloc dans lequel vous voulez charger le slideshow en arrière plan. Par exemple pour charger dans un bloc ayant pour ID 'top', écrivez '#top'. Pour un élément ayant la classe 'top', écrivez '.top'."

;added 1.4.15
SLIDESHOWCK_SPACER_RESPONSIVE="Légende responsive"
SLIDESHOWCK_USERESPONSIVECAPTION_LABEL="Activer la légende responsive"
SLIDESHOWCK_USERESPONSIVECAPTION_DESC="Activez cette option si vous voulez utiliser les paramètres suivants pour la légende responsive"
SLIDESHOWCK_RESPONSIVERESOLUTION_LABEL="Résolution responsive"
SLIDESHOWCK_RESPONSIVERESOLUTION_DESC="Choisir une résolution en dessous de laquelle les paramètres suivants s'appliquent"
SLIDESHOWCK_RESPONSIVEFONTSIZE_LABEL="Taille de police"
SLIDESHOWCK_RESPONSIVEFONTSIZE_DESC="Définir une taille de police à appliquer à la légende en dessous de la résolution définie ci-dessus"
SLIDESHOWCK_RESPONSIVEHIDECAPTION_LABEL="Cacher la légende"
SLIDESHOWCK_RESPONSIVEHIDECAPTION_DESC="Si vous ne voulez pas montrer du tout la légende en dessous de la résolution définie ci-dessus, alors activez cette option"

;added 1.4.21
SLIDESHOWCK_OPTIONS_FROMFLICKR="<img src=../modules/mod_slideshowck/elements/images/picture_add.png style=display:inline-block;margin:2px 5px 0 2px; />Charger automatiquement depuis Flickr"
SLIDESHOWCK_VOTE_JED="Si vous utilisez Slideshow CK, merci de voter dans la JED."
SLIDESHOWCK_CURRENT_VERSION="Vous utilisez la version"
SLIDESHOWCK_NEW_VERSION_AVAILABLE="Mise à jour disponible"
SLIDESHOWCK_DOWNLOAD="Télécharger"
SLIDESHOWCK_DOWNLOAD_DOCUMENTATTION="Télécharger la documentation du module"
SLIDESHOWCK_DOWNLOAD_THEMES="Télécharger un thème graphique pour le module"
SLIDESHOWCK_NEED_UPDATE="Cette extension doit être mise à jour"
SLIDESHOWCK_REQUIRED_VERSION="Vous devez installer au minimum la version"

;added 1.4.22
SLIDESHOWCK_MINHEIGHT_LABEL="Hauteur mini"
SLIDESHOWCK_MINHEIGHT_DESC="Définir une hauteur minimale pour le slideshow afin de limiter sa taille sur petites résolutions. La valeur doit être en px"
SLIDESHOWCK_RESOLUTION_ADAPTATIVE="Adaptatif"
SLIDESHOWCK_RESOLUTION_STEP="Palier de résolution"
SLIDESHOWCK_STARTDATE="Date début"
SLIDESHOWCK_ENDDATE="Date fin"

;added 1.4.37
SLIDESHOWCK_USECAPTION_LABEL="Afficher la légende"
SLIDESHOWCK_USECAPTION_DESC="Selectionner si vous voulez afficher la légende, ou totalement la désactiver"
SLIDESHOWCK_USECAPTIONDESC_LABEL="Afficher la description"
SLIDESHOWCK_USECAPTIONDESC_DESC="Selectionner si vous voulez afficher la description dans la légende, ou uniquement le titre"

;added 1.4.41
SLIDESHOWCK_K2_NOTFOUND="K2 non trouvé"

;added 1.4.42
SLIDESHOWCK_LINK_POSITION_LABEL="Emplacement du lien"
SLIDESHOWCK_LINK_POSITION_DESC="Choisir où ajouter le lien"
SLIDESHOWCK_LINK_FULLSLIDE="Slide complet"
SLIDESHOWCK_LINK_CAPTION="Légende"
SLIDESHOWCK_LINK_TITLE="Titre"
SLIDESHOWCK_LINK_BUTTON="Bouton"

;added 1.4.43
SLIDESHOWCK_FIXHTML_LABEL="Corriger html"
SLIDESHOWCK_FIXHTML_DESC="Corriger le code html dans la légende. Utile lorsque le texte est trunqué."

;added 1.4.52
SLIDESHOWCK_KEYBOARD_CONTROL_LABEL="Activer le contrôle clavier"
SLIDESHOWCK_KEYBOARD_CONTROL_DESC="Vous pouvez utiliser le clavier pour contrôler le slideshow (gauche = précédent, droite = suivant, P = lecture/pause)"

;added 1.4.63
PLG_SLIDESHOWCK_READMORE="Lire la suite"
SLIDESHOWCK_STRIPTAGS_LABEL="Enlever les tags HTML"
SLIDESHOWCK_STRIPTAGS_DESC="Supprime toutes les balises HTML du texte"

;added 2.0.0
SLIDESHOWCK_SOURCE_FIELDSET_LABEL="Source"
SLIDESHOWCK_USE_FREE_VERSION="Vous utilisez la version GRATUITE"
SLIDESHOWCK_USE_PRO_VERSION="Vous utilisez la version PRO"
SLIDESHOWCK_DOCUMENTATION="Consulter la documentation"
SLIDESHOWCK_TEXT="Texte"
SLIDESHOWCK_IMAGE="Image"
SLIDESHOWCK_LINK="Lien"
SLIDESHOWCK_VIDEO="Vidéo"
SLIDESHOWCK_ARTICLE="Article"
SLIDESHOWCK_DATES="Dates"
SLIDESHOWCK_REMOVE2="Supprimer"
SLIDESHOWCK_SELECT_LINK="Sélectionner un lien"
SLIDESHOWCK_SOURCE_SLIDESMANAGER="Gestionnaire de slides"
SLIDESHOWCK_SOURCE_FOLDER="Dossier"
SLIDESHOWCK_SELECT="Sélectionner"
SLIDESHOWCK_USETITLE_LABEL="Afficher le titre"
SLIDESHOWCK_USETITLE_DESC="Selectionner si vous voulez afficher le titre dans la légende"
SLIDESHOWCK_DISPLAY_OPTIONS_LABEL="Affichage"
SLIDESHOWCK_TEXT_OPTIONS_LABEL="Texte"
SLIDESHOWCK_LINK_OPTIONS_LABEL="Lien"
SLIDESHOWCK_NUMBER_SLIDES_LABEL="Nombre de slides"
SLIDESHOWCK_NUMBER_SLIDES_DESC="Déterminer le nombre de slides à afficher. Laissez vide pour afficher tous les slides"
SLIDESHOWCK_NONE="Aucun"
SLIDESHOWCK_LINK_BUTTON_TEXT_LABEL="Texte du bouton"
SLIDESHOWCK_LINK_BUTTON_TEXT_DESC="Texte à afficher dans le bouton du lien. Vous pouvez utiliser une CHAINE à traduire dans vos fichiers de langue"
SLIDESHOWCK_LIGHTBOX_SPACER_LABEL="Lightbox"
SLIDESHOWCK_LIGHTBOX_LABEL="Lightbox à utiliser"
SLIDESHOWCK_LIGHTBOX_DESC="Choisir si vous voulez utiliser Mediabox CK disponible sur JoomlaCK.fr, ou une autre lightbox"
SLIDESHOWCK_LIGHTBOX_MEDIABOX="Mediabox CK"
SLIDESHOWCK_LIGHTBOX_OTHER="Autre"
SLIDESHOWCK_LINK_BUTTON_TEXT="Lire la suite"
SLIDESHOWCK_LIGHTBOX_ATTRIB_LABEL="Attribut Lightbox"
SLIDESHOWCK_LIGHTBOX_ATTRIB_DESC="Définir l'attribut à ajouter en fonction de votre lightbox"
SLIDESHOWCK_LIGHTBOX_ATTRIB_VALUE_LABEL="Valeur de l'attribut Lightbox"
SLIDESHOWCK_LIGHTBOX_ATTRIB_VALUE_DESC="Définir la valeur de l'attribut à ajouter en fonction de votre lightbox"
SLIDESHOWCK_LINK_BUTTON_CLASS_LABEL="Classe CSS du bouton"
SLIDESHOWCK_LINK_BUTTON_CLASS_DESC="Ecrire une classe CSS à appliquer au bouton"
SLIDESHOWCK_LINK_AUTOIMAGE_LABEL="Lien auto sur image"
SLIDESHOWCK_LINK_AUTOIMAGE_DESC="Si activé, cette option génère automatiquement un lien vers l'image du slide"
SLIDESHOWCK_LINK_TARGET_LABEL="Cible du lien"
SLIDESHOWCK_LINK_TARGET_DESC="Choisir si vous voulez ouvrir le lien dans une nouvelle fenêtre ou dans la même"
SLIDESHOWCK_LINK_SAME_WINDOW="Même fenêtre"
SLIDESHOWCK_LINK_NEW_WINDOW="Nouvelle fenêtre"
SLIDESHOWCK_TITLE_TAG_LABEL="Title tag"
SLIDESHOWCK_TITLE_TAG_DESC="Choisir quel tag HTML utiliser pour afficher le titre"
SLIDESHOWCK_OPTIONS_FIELDSET_LABEL="Options"
SLIDESHOWCK_RESPONSIVE="Responsive"
SLIDESHOWCK_EFFECTS_OPTIONS="Effets"
SLIDESHOWCK_VISIT_OTHER_PRODUCTS="Jetez un oeil aux autres produits disponibles sur JoomlaCK"
SLIDESHOWCK_GET_LICENCE_INFOS="Voir comment gérer la clé de licence"
SLIDESHOWCK_GET_PRO_INFOS="Obtenir des infos sur la version Pro"
SLIDESHOWCK_STYLES="Styles"
SLIDESHOWCK_EDIT="Editer"
SLIDESHOWCK_SELECT_STYLE_LABEL="Style"
SLIDESHOWCK_SELECT_STYLE_DESC="Selectionner le style à applliquer à votre slideshow"
SLIDESHOWCK_OTHER="Autre"
SLIDESHOWCK_LIGHTBOX_LABEL="Lightbox"
SLIDESHOWCK_LIGHTBOX_DESC="Selectionner quelle lightbox utiliser pour ouvrir les liens"
SLIDESHOWCK_PORTRAIT_LABEL="Contenir les images"
SLIDESHOWCK_PORTRAIT_DESC="Les images vont être réduites à la zone du slideshow, sans déformation"
SLIDESHOWCK_ONLY_PRO="Seulement disponible dans la version Pro. Cliquez ici pour en savoir plus."
SLIDESHOWCK_SOURCE_ARTICLES="Articles"
SLIDESHOWCK_THUMBSTYPE_LABEL="Miniatures à utiliser"
SLIDESHOWCK_THUMBSTYPE_DESC="Choisir entre l'image de taille normale et l'image de taille réduite"
SLIDESHOWCK_THUMBSTYPE_MINI="Mini"
SLIDESHOWCK_THUMBSTYPE_NORMAL="Normal"
SLIDESHOWCK_MIGRATION_NEEDED="Une migration est nécessaire ! Nous avons détecté que vous éditez un module qui a été créé avec Slideshow CK V1."
SLIDESHOWCK_MIGRATION_ACTION="Veuillez cliquer ici pour mettre à jour automatiquement les options du slideshow. Si vous ne le faites pas vous risquez de perdre certains paramétrages."
SLIDESHOWCK_MIGRATION_SUCCESS="Migration réalisée avec succès !"
SLIDESHOWCK_MIGRATION_ERROR="Erreur lors de la tentative de mivration à la V2. Merci de contacter le développeur."
SLIDESHOWCK_HEIGHT_FIELD_HELP_TITLE="Comment calculer la hauteur"
SLIDESHOWCK_HEIGHT_FIELD_HELP_1="Vous pouvez définir la hauteur en <b>px</b> ou <b>%</b>. Si vous utilisez des %, la hauteur sera responsive et l'image conservera son ratio. Si vous utilisez des px, alors la hauteur restera toujours la même et l'image sera coupée."
SLIDESHOWCK_HEIGHT_FIELD_HELP_2="Comment calculer la hauteur en %"
SLIDESHOWCK_HEIGHT_FIELD_HELP_3="Le pourcentage est le ratio entre la hauteur et la largeur de votre image. Notez que cette valeur sera utilsée pour toutes les images, il est donc conseillé d'utiliser des images qui ont toutes les mêmes dimensions."
SLIDESHOWCK_HEIGHT_FIELD_HELP_4="Prenons comme exemple une image qui a les dimensions suivantes :"
SLIDESHOWCK_HEIGHT_FIELD_HELP_5="Pour calculer le ratio : 800 / 1280 = <b>62%</b>. Donc dans le champ de hauteur, saisissez 62% comme valeur."
SLIDESHOWCK_RATIO_LABEL="Ratio de l'image"
SLIDESHOWCK_CALCULATOR="Calculateur"
SLIDESHOWCK_SAVE="Enregistrer"
SLIDESHOWCK_PARAMS_UNPUBLISHED_INFO="Etes vous en train de migrer de la V1 à la V2 de Slideshow CK ? Le plugin Slideshow CK Params a été détecté et a été automatiquement désactivé car il n'est pas compatible avec la V2."
SLIDESHOWCK_PARAMS_MIGRATION_LINK="Cliquez ici pour suivre les instructions sur la migration de la V1 à la V2"
SLIDESHOWCK_TEXT_CUSTOM="Texte perso"
SLIDESHOWCK_TEXT="Texte"
SLIDESHOWCK_WARNING_PLUGIN_OBSOLETE="Vous avez un plugin obsolète qui fonctionnait avec la version 1 de Slideshow CK. Ce plugin ,n'est plus compatible avec la version 2, veuillez le désactiver."
SLIDESHOWCK_DISABLE_PLUGIN="Cliquez ici pour désactiver le plugin"
;added 2.0.5
SLIDESHOWCK_DEBUG_LABEL="Voir les messages de débogage"
SLIDESHOWCK_DEBUG_DESC="Désactivez cette option si vous ne voulez voir aucun message dans le slideshow"
;added 2.0.16
SLIDESHOWCK_LOAD_INLINE_LABEL="Charger les scripts en direct"
SLIDESHOWCK_LOAD_INLINE_DESC="Si vous rencontrez des soucis de chargement lors de l'appel depuis un article, vous pouvez activer cette option"
;added 2.1.1
SLIDESHOWCK_CONTENT_PREPARE_LABEL="Préparer le contenu"
SLIDESHOWCK_CONTENT_PREPARE_DESC="Charge les plugins de contenu pour qu'ils s'appliquent lors du rendu"
;added 2.2.1
SLIDESHOWCK_VIDEO_AUTOPLAY="Lecture auto"
SLIDESHOWCK_VIDEO_LOOP="Boucler"
SLIDESHOWCK_VIDEO_CONTROLS="Contrôles"
;added 2.3.11
SLIDESHOWCK_TITLE_IN_THUMBNAILS_LABEL="Afficher le titre sur les miniatures"
;added 2.4.1
SLIDESHOWCK_RESPONSIVEHIDEDESCRIPTION_LABEL="Cacher la description"
SLIDESHOWCK_RESPONSIVEHIDEDESCRIPTION_DESC="Cacher la description sur mobile"components/com_slideshowck/extensions/mod_slideshowck/language/fr-FR/fr-FR.mod_slideshowck.sys.ini000060400000000742152453623440027600 0ustar00; @copyright	Copyright (C) 2010 Cédric KEIFLIN alias ced1870
; https://www.ck-web-creation-alsace.com
; https://www.joomlack.fr
; @license		GNU/GPL
; Double quotes in the values have to be formatted as "_QQ_"_QQ_"_QQ_"

SLIDESHOWCK_XML_DESCRIPTION = "Slideshow CK affiche un slideshow avec de superbes effets. Il est compatible mobiles et responsive design. Sa largeur s'adapte à la largeur de l'écran et vous pouvez faire défiler les images en glissant le doigt sur l'écran."
components/com_slideshowck/extensions/mod_slideshowck/language/en-GB/en-GB.mod_slideshowck.sys.ini000060400000000563152453623440027531 0ustar00; @copyright	Copyright (C) 2010 Cédric KEIFLIN alias ced1870
; https://www.joomlack.fr
; @license		GNU/GPL
; Double quotes in the values have to be formatted as "_QQ_"

SLIDESHOWCK_XML_DESCRIPTION = "Slideshow CK displays a slideshow with some nice effects. It is mobile compatible and responsive design. Its width adapts itself and you can slide it with your fingers."
components/com_slideshowck/extensions/mod_slideshowck/language/en-GB/index.html000060400000000037152453623440024137 0ustar00<!DOCTYPE html><title></title>
components/com_slideshowck/extensions/mod_slideshowck/language/en-GB/en-GB.mod_slideshowck.ini000060400000063447152453623440026726 0ustar00; @copyright	Copyright (C) 2010 Cédric KEIFLIN alias ced1870
; https://www.joomlack.fr
; @license		GNU/GPL
; Double quotes in the values have to be formatted as "_QQ_"

SLIDESHOWCK_XML_DESCRIPTION = "Slideshow CK displays a slideshow with some nice effects. It is mobile compatible and responsive design. Its width adapts itself and you can slide it with your fingers."
SLIDESHOWCK_OPTIONS_SLIDES = "Slides manager"
SLIDESHOWCK_OPTIONS_STYLES = "Styles options"
SLIDESHOWCK_OPTIONS_EFFECTS = "Effects options"
SLIDESHOWCK_SKIN_LABEL = "Skin"
SLIDESHOWCK_SKIN_DESC = "Choose a color"
SLIDESHOWCK_ALIGNEMENT_LABEL = "Image alignment"
SLIDESHOWCK_ALIGNEMENT_DESC = "Choose where you want to place the image"
SLIDESHOWCK_TOP = "top"
SLIDESHOWCK_BOTTOM = "bottom"
SLIDESHOWCK_TOPLEFT = "top left"
SLIDESHOWCK_TOPCENTER = "top center"
SLIDESHOWCK_TOPRIGHT = "top right"
SLIDESHOWCK_MIDDLELEFT = "center left"
SLIDESHOWCK_CENTER = "center"
SLIDESHOWCK_MIDDLERIGHT = "center right"
SLIDESHOWCK_BOTTOMLEFT = "bottom left"
SLIDESHOWCK_BOTTOMCENTER = "bottom center"
SLIDESHOWCK_BOTTOMRIGHT = "bottom right"
SLIDESHOWCK_LOADER_LABEL = "Loader icon"
SLIDESHOWCK_LOADER_DESC = "Choose what sort of icon you want to display"
SLIDESHOWCK_LOADER_PIE = "pie"
SLIDESHOWCK_LOADER_BAR = "bar"
SLIDESHOWCK_LOADER_NONE = "none"
SLIDESHOWCK_WIDTH_LABEL = "Width"
SLIDESHOWCK_WIDTH_DESC = "Width of the slideshow in px, you can also use the value'auto' to let it as responsive design for mobiles"
SLIDESHOWCK_HEIGHT_LABEL = "Height"
SLIDESHOWCK_HEIGHT_DESC = "Height of the slideshow, you can set it in px or %"
SLIDESHOWCK_THUMBNAILS_LABEL = "Thumbnails"
SLIDESHOWCK_THUMBNAILS_DESC = "Show the thumbnails under the slideshow"
SLIDESHOWCK_PAGINATION_LABEL = "Pagination"
SLIDESHOWCK_PAGINATION_DESC = "Show the buttons for pagination"
SLIDESHOWCK_EFFECT_LABEL = "Animation effect"
SLIDESHOWCK_EFFECT_DESC = "Choose which effect to apply. You can make a multiselection with the CTRL keyboard key"
SLIDESHOWCK_TRANSITION_LABEL = "Transition"
SLIDESHOWCK_TRANSITION_DESC = "Effect transition"
SLIDESHOWCK_TIME_LABEL = "Display time"
SLIDESHOWCK_TIME_DESC = "Time to show each image"
SLIDESHOWCK_TRANSPERIOD_LABEL = "Transition duration"
SLIDESHOWCK_TRANSPERIOD_DESC = "Time between two images"
SLIDESHOWCK_AUTOADVANCE_LABEL = "Autoplay"
SLIDESHOWCK_AUTOADVANCE_DESC = "The slideshow starts automatically"
SLIDESHOWCK_PORTRAIT_LABEL = "Adjust the images"
SLIDESHOWCK_PORTRAIT_DESC = "if no, the images will keep their original size"
SLIDESHOWCK_ADDSLIDE = "Add a slide"
SLIDESHOWCK_SELECTIMAGE = "Select an image"
SLIDESHOWCK_CAPTION = "Caption"
SLIDESHOWCK_USETOSHOW = "Display"
SLIDESHOWCK_IMAGE = "Image"
SLIDESHOWCK_VIDEO = "Video"
SLIDESHOWCK_IMAGEOPTIONS = "Image options"
SLIDESHOWCK_LINKOPTIONS = "Link options"
SLIDESHOWCK_VIDEOOPTIONS = "Video options"
SLIDESHOWCK_ALIGNEMENT_LABEL = "Alignment"
SLIDESHOWCK_LINK = "Link url"
SLIDESHOWCK_TARGET = "Target"
SLIDESHOWCK_SAMEWINDOW = "open in the same window"
SLIDESHOWCK_NEWWINDOW = "open in a new window"
SLIDESHOWCK_VIDEOURL = "Video url"
SLIDESHOWCK_REMOVE = "Remove this slide"
SLIDESHOWCK_IMPORTFROMFOLDER = "Import from a folder"
SLIDESHOWCK_LOADJQUERY_LABEL = "Load JQuery"
SLIDESHOWCK_LOADJQUERY_DESC = "If you already have an extension that load Jquery you can choose to not load it in Slideshow CK"
SLIDESHOWCK_LOADJQUERYEASING_LABEL = "Load JQuery Easing"
SLIDESHOWCK_LOADJQUERYEASING_DESC = "Choose to load the script for the transitions"
SLIDESHOWCK_LOADJQUERYMOBILE_LABEL = "Load JQuery mobile"
SLIDESHOWCK_LOADJQUERYMOBILE_DESC = "Choose to load the script for mobiles"
SLIDESHOWCK_THUMBNAILWIDTH_LABEL = "Thumbnail width"
SLIDESHOWCK_THUMBNAILWIDTH_DESC = "Give the thumbnail width in px"
SLIDESHOWCK_THUMBNAILHEIGHT_LABEL = "Thumbnail height"
SLIDESHOWCK_THUMBNAILHEIGHT_DESC = "Give the thumbnail height in px"
SLIDESHOWCK_NAVIGATION_HOVER = "mouseover"
SLIDESHOWCK_NAVIGATION_ALWAYS = "always"
SLIDESHOWCK_NAVIGATION_NONE = "none"
SLIDESHOWCK_NAVIGATION_LABEL = "Navigation"
SLIDESHOWCK_NAVIGATION_DESC = "Choose if you want to show the navigation buttons"
SLIDESHOWCK_DISPLAYORDER_LABEL = "Display order"
SLIDESHOWCK_DISPLAYORDER_DESC = "Choose the way to display the images"
SLIDESHOWCK_DISPLAYORDER_NORMAL = "in order"
SLIDESHOWCK_DISPLAYORDER_SHUFFLE = "shuffle"
SLIDESHOWCK_THEME_LABEL="Theme"
SLIDESHOWCK_THEME_DESC="Choose a theme for the slideshow"
SLIDESHOWCK_CAPTIONEFFECT_LABEL="Caption effect"
SLIDESHOWCK_CAPTIONEFFECT_DESC="Choose how the caption will appear"
SLIDESHOWCK_HOVER_LABEL="Pause on mouseover"
SLIDESHOWCK_HOVER_DESC="Pause the slideshow on mouseover"
SLIDESHOWCK_CAPTIONSTYLES="Caption styles"
SLIDESHOWCK_FULLPAGE_LABEL="Use it as full page background"
SLIDESHOWCK_FULLPAGE_DESC="Load the slideshow as background of the page"
SLIDESHOWCK_SHOWARTICLETITLE_LABEL="Show the article title"
SLIDESHOWCK_SHOWARTICLETITLE_DESC="Choose if you want to show the article title"
SLIDESHOWCK_OPTIONS_FROMFOLDER="Load the slides from a folder"
SLIDESHOWCK_CHECKPARAMSPLUGIN="You must download and install the <a href="_QQ_"https://www.joomlack.fr/en/slideshowck/slideshow-params-plugin"_QQ_" target="_QQ_"_blank"_QQ_">plugin Slideshow Params</a>"
SLIDESHOWCK_SPACER_SLIDESHOWCKPARAMS_PATCH_INSTALLED="Plugin Slideshow CK installed"
SLIDESHOWCK_FROMFOLDERNAME_LABEL="Load from the folder"
SLIDESHOWCK_FROMFOLDERNAME_DESC="Choose the folder from which to load the images (type the folder path, then save the module, then click on the import button)"
SLIDESHOWCK_SLIDESSOURCE_LABEL="Images source"
SLIDESHOWCK_SLIDESSOURCE_DESC="Choose if you want to load the images from the slides manager or a folder"
SLIDESHOWCK_SLIDEMANAGER="Slides manager"
SLIDESHOWCK_FOLDER="Import from a folder"
SLIDESHOWCK_IMPORT="Import"
SLIDESHOWCK_OPTIONS_LIGHTBOX="Lightbox Options"
SLIDESHOWCK_LIGHTBOXTYPE_LABEL="Lightbox type"
SLIDESHOWCK_LIGHTBOXTYPE_DESC="Choose the lightbox to use to open the links in a popup. Squeezebox is the natve script in Joomla!. Mediabox CK is the advanced Lightbox that you can download on https://www.joomlack.fr"
SLIDESHOWCK_SQUEEZEBOX="Squeezebox"
SLIDESHOWCK_MEDIABOXCK="Mediabox CK"
SLIDESHOWCK_LIGHTBOXCAPTION_LABEL="Show the caption"
SLIDESHOWCK_LIGHTBOXCAPTION_DESC="The caption is defined in the slide options, it can be shown in the slideshow, or in the lightbox (only if you use Mediabox CK), or both"
SLIDESHOWCK_LIGHTBOXCAPTION="In the slideshow"
SLIDESHOWCK_LIGHTBOXTITLE="In the lightbox (Mediabox CK)"
SLIDESHOWCK_LIGHTBOXCAPTIONANDTITLE="In both"
SLIDESHOWCK_SPACERFOLDERAUTOLOAD_LABEL="Autoload images from a folder"
SLIDESHOWCK_SPACERFOLDERIMPORT_LABEL="Import images from a folder"
SLIDESHOWCK_AUTOLOADFOLDERNAME_LABEL="Autoload from the folder"
SLIDESHOWCK_AUTOLOADFOLDERNAME_DESC="Choose the folder from which to load the images automatically"
SLIDESHOWCK_AUTOLOADFOLDER="Autoload from a folder"
SLIDESHOWCK_MOBILEIMAGE_SPACER_LABEL="Specific images for Mobile Options"
SLIDESHOWCK_USEMOBILEIMAGE_LABEL="Use specific images for Mobile"
SLIDESHOWCK_USEMOBILEIMAGE_DESC="If you use this option the slideshow will detect the resolution and load an image with a prefix. For example if you set the resolution of 640px under this resolution the image 'folder/640/image.jpg' will be loaded instead of 'folder/image.jpg'. BE CAREFUL that both images exists !"
SLIDESHOWCK_MOBILEIMAGERESOLUTION_LABEL="Max resolution for images for Mobile"
SLIDESHOWCK_MOBILEIMAGERESOLUTION_DESC="Under this value the alternative image will be used"
SLIDESHOWCK_LIMITSLIDES_LABEL="Number of slides"
SLIDESHOWCK_LIMITSLIDES_DESC="This option will only be used if you set the display order on Shuffle. Then you can limit the number of slides to show."
SLIDESHOWCK_IMAGETARGET_LABEL="Default image target"
SLIDESHOWCK_IMAGETARGET_DESC="Choose how you want to set the link target by default for all slides"
SLIDESHOWCK_DEFAULT="default"
SLIDESHOWCK_LIGHTBOX="in a Lightbox"
SLIDESHOWCK_HIKASHOP_FIELDSET_LABEL="Hikashop Options"
SLIDESHOWCKHIKASHOP_CHECKPLUGIN="You must download and install the <a href="_QQ_"https://www.joomlack.fr/en/slideshowck/slideshow-hikashop-plugin"_QQ_" target="_QQ_"_blank"_QQ_">plugin Slideshow CK Hikashop</a>"

;styles
SLIDESHOWCK_BOLD = "bold"
SLIDESHOWCK_NORMAL = "normal"
SLIDESHOWCK_SPACER_STYLESBACKGROUND="Background"
SLIDESHOWCK_SPACER_STYLESROUNDEDCORNERS="Rounded corners"
SLIDESHOWCK_SPACER_STYLESSHADOW="Shadow"
SLIDESHOWCK_SPACER_STYLESBORDERS="Borders"
SLIDESHOWCK_MARGIN_LABEL="External margins"
SLIDESHOWCK_MARGIN_DESC="Margin value in px"
SLIDESHOWCK_PADDING_LABEL="Internal margins"
SLIDESHOWCK_PADDING_DESC="Padding value in px"
SLIDESHOWCK_BGCOLOR1_LABEL="Background color"
SLIDESHOWCK_BGCOLOR1_DESC="Choose the background color"
SLIDESHOWCK_BGCOLOR2_LABEL="Gradient color"
SLIDESHOWCK_BGCOLOR2_DESC="Choose the gradient color that will be used starting from the background color"
SLIDESHOWCK_ROUNDEDCORNERSTL_LABEL="Top left corner"
SLIDESHOWCK_ROUNDEDCORNERSTL_DESC="Radius value for the corner in px"
SLIDESHOWCK_ROUNDEDCORNERSTR_LABEL="Top right corner"
SLIDESHOWCK_ROUNDEDCORNERSTR_DESC="Radius value for the corner in px"
SLIDESHOWCK_ROUNDEDCORNERSBR_LABEL="Bottom right corner"
SLIDESHOWCK_ROUNDEDCORNERSBR_DESC="Radius value for the corner in px"
SLIDESHOWCK_ROUNDEDCORNERSBL_LABEL="bottom left corner"
SLIDESHOWCK_ROUNDEDCORNERSBL_DESC="Radius value for the corner in px"
SLIDESHOWCK_SHADOWCOLOR_LABEL="Shadow color"
SLIDESHOWCK_SHADOWCOLOR_DESC="Choose the color for the shadow"
SLIDESHOWCK_SHADOWBLUR_LABEL="Shadow width"
SLIDESHOWCK_SHADOWBLUR_DESC="Shadow width in px"
SLIDESHOWCK_SHADOWSPREAD_LABEL="Blur"
SLIDESHOWCK_SHADOWSPREAD_DESC="Blur value for the shadow"
SLIDESHOWCK_OFFSETX_LABEL="Horizontal offset"
SLIDESHOWCK_OFFSETX_DESC="Offset on the X axis, can take a negative value"
SLIDESHOWCK_OFFSETY_LABEL="Vertical offset"
SLIDESHOWCK_OFFSETY_DESC="Offset on the Y axis, can take a negative value"
SLIDESHOWCK_SHADOWINSET_LABEL="Inset"
SLIDESHOWCK_SHADOWINSET_DESC="Use the inset attribtue to create the shadow inside"
SLIDESHOWCK_BORDERCOLOR_LABEL="Border color"
SLIDESHOWCK_BORDERCOLOR_DESC="Choose the color for the border"
SLIDESHOWCK_BORDERWIDTH_LABEL="Border width"
SLIDESHOWCK_BORDERWIDTH_DESC="Width in px for the border"
SLIDESHOWCK_SPACER_STYLESMARGIN = "Margins"
SLIDESHOWCK_USEMARGIN_LABEL = "Use margins"
SLIDESHOWCK_USEMARGIN_DESC = ""
SLIDESHOWCK_USEBACKGROUND_LABEL = "Use background color"
SLIDESHOWCK_USEBACKGROUND_DESC = ""
SLIDESHOWCK_USEGRADIENT_LABEL = "Use gradient color"
SLIDESHOWCK_USEGRADIENT_DESC = ""
SLIDESHOWCK_USEROUNDEDCORNERS_LABEL = "Use rounded corners"
SLIDESHOWCK_USEROUNDEDCORNERS_DESC = ""
SLIDESHOWCK_USESHADOW_LABEL = "Use shadow"
SLIDESHOWCK_USESHADOW_DESC = ""
SLIDESHOWCK_USEBORDERS_LABEL = "Use borders"
SLIDESHOWCK_USEBORDERS_DESC = ""
SLIDESHOWCK_SPACER_STYLESFONT = "Font style"
SLIDESHOWCK_USEFONT_LABEL = "Use font"
SLIDESHOWCK_USEFONT_DESC = ""
SLIDESHOWCK_GFONT_LABEL = "Font"
SLIDESHOWCK_GFONT_DESC = "Choose the google font to use"
SLIDESHOWCK_FONTWEIGHT_LABEL = "Font weight"
SLIDESHOWCK_FONTWEIGHT_DESC = "Choose if you want the text to be bold or normal"
SLIDESHOWCK_FONTSIZE_LABEL = "Font size"
SLIDESHOWCK_FONTSIZE_DESC = "Give the size you want with unit (px, em, %)"
SLIDESHOWCK_FONTCOLOR_LABEL = "Font color"
SLIDESHOWCK_FONTCOLOR_DESC = "Choose the color for the font"
SLIDESHOWCK_DESCFONTSIZE_LABEL = "Description font size"
SLIDESHOWCK_DESCFONTSIZE_DESC = "Size of the description added to the link"
SLIDESHOWCK_DESCFONTCOLOR_LABEL = "Description color"
SLIDESHOWCK_DESCFONTCOLOR_DESC = "Color of the description added to the link"
SLIDESHOWCK_MARGINTOP_LABEL="Margin top"
SLIDESHOWCK_MARGINTOP_DESC="margin in px"
SLIDESHOWCK_MARGINRIGHT_LABEL="Margin right"
SLIDESHOWCK_MARGINRIGHT_DESC="margin in px"
SLIDESHOWCK_MARGINBOTTOM_LABEL="Margin bottom"
SLIDESHOWCK_MARGINBOTTOM_DESC="margin in px"
SLIDESHOWCK_MARGINLEFT_LABEL="Margin left"
SLIDESHOWCK_MARGINLEFT_DESC="margin in px"
SLIDESHOWCK_PADDINGTOP_LABEL="Padding top"
SLIDESHOWCK_PADDINGTOP_DESC="margin in px"
SLIDESHOWCK_PADDINGRIGHT_LABEL="Padding right"
SLIDESHOWCK_PADDINGRIGHT_DESC="margin in px"
SLIDESHOWCK_PADDINGBOTTOM_LABEL="Padding bottom"
SLIDESHOWCK_PADDINGBOTTOM_DESC="margin in px"
SLIDESHOWCK_PADDINGLEFT_LABEL="Padding left"
SLIDESHOWCK_PADDINGLEFT_DESC="margin in px"
SLIDESHOWCK_BACKGROUNDIMAGE_LABEL="Background image"
SLIDESHOWCK_BACKGROUNDIMAGE_DESC="Select an image to apply as background"
SLIDESHOWCK_BACKGROUNDPOSITIONX_LABEL="Poxition X"
SLIDESHOWCK_BACKGROUNDPOSITIONX_DESC="Choose a value with px (ex: 25px) or left, right, center, etc..."
SLIDESHOWCK_BACKGROUNDPOSITIONY_LABEL="Poxition Y"
SLIDESHOWCK_BACKGROUNDPOSITIONY_DESC="Choose a value with px (ex: 25px) or left, right, center, etc..."
SLIDESHOWCK_ARTICLEOPTIONS="Article options"
SLIDESHOWCK_ARTICLELENGTH_LABEL="Character length"
SLIDESHOWCK_ARTICLELENGTH_DESC="The article text will be truncated after the number of characters"
SLIDESHOWCK_ARTICLELINK_LABEL="Article link on"
SLIDESHOWCK_ARTICLELINK_DESC="Choose if you want the link of the article to be added to the title or with a readmore link"
SLIDESHOWCK_READMORE_OPTION="readmore link"
SLIDESHOWCK_TITLE_OPTION="article title"
SLIDESHOWCK_ARTICLETITLE_LABEL="Article title tag"
SLIDESHOWCK_ARTICLETITLE_DESC="Choose which tag to use to render the title"
SLIDESHOWCK_SLIDETIME="enter a specific time value for this slide, else it will be the default time"

; added 1.3.11
SLIDESHOWCK_LIGHTBOXGROUPALBUM_LABEL="Group links into an album"
SLIDESHOWCK_LIGHTBOXGROUPALBUM_DESC="ONLY FOR MEDIABOX CK : This will group all links into an album and enable the navigation"
SLIDESHOWCK_CLEAR="Clear"
SLIDESHOWCK_SELECT="Select"

;added 1.4.0
SLIDESHOWCK_ARTICLEOPTIONS="Article Options"
SLIDESHOWCK_ARTICLE_ID="Article ID"
SLIDESHOWCK_TITLE_ONLY="title only"
SLIDESHOWCK_DESC_ONLY="description only"
SLIDESHOWCK_OPTIONS_SLIDESSOURCE="<img src=../modules/mod_slideshowck/elements/images/pictures.png />Slides source"
SLIDESHOWCK_OPTIONS_FROMARTICLECATEGORY="<img src=../modules/mod_slideshowck/elements/images/picture_add.png style=display:inline-block;margin:2px 5px 0 2px; />Autoload from a category of articles"
SLIDESHOWCK_OPTIONS_FROMFOLDER="<img src=../modules/mod_slideshowck/elements/images/picture_add.png style=display:inline-block;margin:2px 5px 0 2px; />Autoload from a folder"
SLIDESHOWCK_OPTIONS_STYLES = "<img src=../modules/mod_slideshowck/elements/images/css.png style=display:inline-block;margin:2px 5px 0 2px; />Styles options"
SLIDESHOWCK_OPTIONS_EFFECTS = "<img src=../modules/mod_slideshowck/elements/images/chart_curve.png style=display:inline-block;margin:2px 5px 0 2px; />Effects options"
SLIDESHOWCK_OPTIONS_LIGHTBOX="<img src=../modules/mod_slideshowck/elements/images/magnifier_zoom_in.png style=display:inline-block;margin:2px 5px 0 2px; />Lightbox Options"
SLIDESHOWCK_OPTIONS_ADVANCED="<img src=../modules/mod_slideshowck/elements/images/wrench.png style=display:inline-block;margin:2px 5px 0 2px; />Avanced Options"
SLIDESHOWCK_ARTICLEOPTIONS="<img src=../modules/mod_slideshowck/elements/images/text_signature.png style=display:inline-block;margin:2px 5px 0 2px; />Article options"
SLIDESHOWCK_CAPTIONSTYLES="<img src=../modules/mod_slideshowck/elements/images/style.png style=display:inline-block;margin:2px 5px 0 2px; />Caption styles"
SLIDESHOWCK_HIKASHOP_FIELDSET_LABEL="<img src=../modules/mod_slideshowck/elements/images/basket.png style=display:inline-block;margin:2px 5px 0 2px; />Hikashop Options"
SLIDESHOWCK_SLIDEMANAGER="Slides manager"
SLIDESHOWCK_SLIDESSOURCE_LABEL="Images source"
SLIDESHOWCK_SLIDESSOURCE_DESC="Choose if you want to load the images from the slides manager or a folder"
SLIDESHOWCK_SPACERFOLDERIMPORT_LABEL="Import images from a folder"
SLIDESHOWCK_TITLE="Title"
SLIDESHOWCK_OPTIONS_SLIDES = "<img src=../modules/mod_slideshowck/elements/images/picture_add.png style=display:inline-block;margin-top:2px;margin-right:5px;margin-left:2px; />Slides manager"
SLIDESHOWCK_CAPTION="Description"
SLIDESHOWCK_AUTOCREATETHUMBS_LABEL="Create the thumbnails automatically"
SLIDESHOWCK_AUTOCREATETHUMBS_DESC="The server will automatically create the thumbnail images if needed. This can cause some server overload"
SLIDESHOWCK_BGOPACITY_LABEL="Opacity"
SLIDESHOWCK_BGOPACITY_LABEL="Set the opacity for the background"

;added 1.4.6
SLIDESHOWCK_IMAGE_OPTION="Image"

;added 1.4.7
SLIDESHOWCK_CONTAINER_LABEL="Load as block background"
SLIDESHOWCK_CONTAINER_DESC="<strong>For advanced users :</strong>Give the CSS selector for the block where you want to load the slideshow as background. For example if you want to load into a block that has an ID 'top', write '#top'. If you want to load into a block that has as css class 'top', write '.top'."

;added 1.4.15
SLIDESHOWCK_SPACER_RESPONSIVE="Responsive caption"
SLIDESHOWCK_USERESPONSIVECAPTION_LABEL="Activate the responsive caption"
SLIDESHOWCK_USERESPONSIVECAPTION_DESC="Activate this option if you want to use the following settings for the responsive caption"
SLIDESHOWCK_RESPONSIVERESOLUTION_LABEL="Responsive resolution"
SLIDESHOWCK_RESPONSIVERESOLUTION_DESC="Choose a resolution value under which the following settings will apply."
SLIDESHOWCK_RESPONSIVEFONTSIZE_LABEL="Font size"
SLIDESHOWCK_RESPONSIVEFONTSIZE_DESC="Set the font-size to apply to the caption under the resolution that you have defined above"
SLIDESHOWCK_RESPONSIVEHIDECAPTION_LABEL="Hide caption"
SLIDESHOWCK_RESPONSIVEHIDECAPTION_DESC="If you don't want to show the caption at all under the resolution you have set above, then activate this option"

;added 1.4.21
SLIDESHOWCK_OPTIONS_FROMFLICKR="<img src=../modules/mod_slideshowck/elements/images/picture_add.png style=display:inline-block;margin:2px 5px 0 2px; />Autoload from Flickr"
SLIDESHOWCK_VOTE_JED="If you are using Slideshow CK, please vote on the JED."
SLIDESHOWCK_CURRENT_VERSION="You are using the version"
SLIDESHOWCK_NEW_VERSION_AVAILABLE="Update available"
SLIDESHOWCK_DOWNLOAD="Download"
SLIDESHOWCK_DOWNLOAD_DOCUMENTATTION="Download the documentation of the module"
SLIDESHOWCK_DOWNLOAD_THEMES="Download a graphic theme for the module"
SLIDESHOWCK_NEED_UPDATE="This extension must be updated"
SLIDESHOWCK_REQUIRED_VERSION="You must at least install the version"

;added 1.4.22
SLIDESHOWCK_MINHEIGHT_LABEL="Min-height"
SLIDESHOWCK_MINHEIGHT_DESC="Set a min-height value to limit the size of the slideshow on small devices. This must be in px"
SLIDESHOWCK_RESOLUTION_ADAPTATIVE="Adaptative"
SLIDESHOWCK_RESOLUTION_STEP="Resolution step"
SLIDESHOWCK_STARTDATE="Start date"
SLIDESHOWCK_ENDDATE="End date"

;added 1.4.37
SLIDESHOWCK_USECAPTION_LABEL="Show the caption"
SLIDESHOWCK_USECAPTION_DESC="Select if you want to show the caption, or totally disable it"
SLIDESHOWCK_USECAPTIONDESC_LABEL="Show description"
SLIDESHOWCK_USECAPTIONDESC_DESC="Select if you want to show the caption description, or only the title"

;added 1.4.41
SLIDESHOWCK_K2_NOTFOUND="K2 not found"

;added 1.4.42
SLIDESHOWCK_LINK_POSITION_LABEL="Link position"
SLIDESHOWCK_LINK_POSITION_DESC="Set where you want the slide link to take place"
SLIDESHOWCK_LINK_FULLSLIDE="Full slide"
SLIDESHOWCK_LINK_CAPTION="Caption"
SLIDESHOWCK_LINK_TITLE="Title"
SLIDESHOWCK_LINK_BUTTON="Button"

;added 1.4.43
SLIDESHOWCK_FIXHTML_LABEL="Fix html"
SLIDESHOWCK_FIXHTML_DESC="Fix the html code in the caption. Usefull when the text is truncated."

;added 1.4.52
SLIDESHOWCK_KEYBOARD_CONTROL_LABEL="Enable keyboard control"
SLIDESHOWCK_KEYBOARD_CONTROL_DESC="You can use the keyboard to control the slideshow (left = previous, right = next, P = play/pause)"

;added 1.4.63
PLG_SLIDESHOWCK_READMORE="Read more"
SLIDESHOWCK_STRIPTAGS_LABEL="Strip HTML tags"
SLIDESHOWCK_STRIPTAGS_DESC="Remove all HTML formatting in the text"

;added 2.0.0
SLIDESHOWCK_SOURCE_FIELDSET_LABEL="Source"
SLIDESHOWCK_USE_FREE_VERSION="You are using the FREE version"
SLIDESHOWCK_USE_PRO_VERSION="You are using the PRO version"
SLIDESHOWCK_DOCUMENTATION="Read the documentation"
SLIDESHOWCK_TEXT="Text"
SLIDESHOWCK_IMAGE="Image"
SLIDESHOWCK_LINK="Link"
SLIDESHOWCK_VIDEO="Video"
SLIDESHOWCK_ARTICLE="Article"
SLIDESHOWCK_DATES="Dates"
SLIDESHOWCK_REMOVE2="Remove"
SLIDESHOWCK_SELECT_LINK="Select a link"
SLIDESHOWCK_SOURCE_SLIDESMANAGER="Slides manager"
SLIDESHOWCK_SOURCE_FOLDER="Folder"
SLIDESHOWCK_SELECT="Select"
SLIDESHOWCK_USETITLE_LABEL="Show the title"
SLIDESHOWCK_USETITLE_DESC="Select if you want to show the title in the caption"
SLIDESHOWCK_DISPLAY_OPTIONS_LABEL="Display"
SLIDESHOWCK_TEXT_OPTIONS_LABEL="Text"
SLIDESHOWCK_LINK_OPTIONS_LABEL="Link"
SLIDESHOWCK_NUMBER_SLIDES_LABEL="Number of slides"
SLIDESHOWCK_NUMBER_SLIDES_DESC="Give the number of slides to be shown. Leave the field empty to show all slides"
SLIDESHOWCK_NONE="None"
SLIDESHOWCK_LINK_BUTTON_TEXT_LABEL="Button text"
SLIDESHOWCK_LINK_BUTTON_TEXT_DESC="Write the text to be shown in the button. You can write a STRING that will be translated using the language files with your own values"
SLIDESHOWCK_LIGHTBOX_SPACER_LABEL="Lightbox"
SLIDESHOWCK_LIGHTBOX_LABEL="Lightbox to use"
SLIDESHOWCK_LIGHTBOX_DESC="Choose if you want to use the Mediabox CK lightbox available on JoomlaCK.fr, or if you want to use another one"
SLIDESHOWCK_LIGHTBOX_MEDIABOX="Mediabox CK"
SLIDESHOWCK_LIGHTBOX_OTHER="Other"
SLIDESHOWCK_LINK_BUTTON_TEXT="Read more"
SLIDESHOWCK_LIGHTBOX_ATTRIB_LABEL="Lightbox attribute"
SLIDESHOWCK_LIGHTBOX_ATTRIB_DESC="Set the attibute to use according to your lightbox setttings"
SLIDESHOWCK_LIGHTBOX_ATTRIB_VALUE_LABEL="Lightbox attribute value"
SLIDESHOWCK_LIGHTBOX_ATTRIB_VALUE_DESC="Set the attibute value to use according to your lightbox setttings"
SLIDESHOWCK_LINK_BUTTON_CLASS_LABEL="Button CSS class"
SLIDESHOWCK_LINK_BUTTON_CLASS_DESC="Write a CSS class to add to the button"
SLIDESHOWCK_LINK_AUTOIMAGE_LABEL="Link auto to image"
SLIDESHOWCK_LINK_AUTOIMAGE_DESC="If set to yes, it will automatically create a link to the slide image itself"
SLIDESHOWCK_LINK_TARGET_LABEL="Link target"
SLIDESHOWCK_LINK_TARGET_DESC="Choose if you want to open the link in the same window or in a new window"
SLIDESHOWCK_LINK_SAME_WINDOW="Same window"
SLIDESHOWCK_LINK_NEW_WINDOW="New window"
SLIDESHOWCK_TITLE_TAG_LABEL="Title tag"
SLIDESHOWCK_TITLE_TAG_DESC="Choose which tag to use to render the title"
SLIDESHOWCK_OPTIONS_FIELDSET_LABEL="Options"
SLIDESHOWCK_RESPONSIVE="Responsive"
SLIDESHOWCK_EFFECTS_OPTIONS="Effects"
SLIDESHOWCK_VISIT_OTHER_PRODUCTS="Visit the other products available on JoomlaCK"
SLIDESHOWCK_GET_LICENCE_INFOS="See how to manage your licence key"
SLIDESHOWCK_GET_PRO_INFOS="Get infos on the Pro version"
SLIDESHOWCK_STYLES="Styles"
SLIDESHOWCK_EDIT="Edit"
SLIDESHOWCK_SELECT_STYLE_LABEL="Style"
SLIDESHOWCK_SELECT_STYLE_DESC="Select the style to apply to your slideshow and edit it directly here"
SLIDESHOWCK_OTHER="Other"
SLIDESHOWCK_LIGHTBOX_LABEL="Lightbox"
SLIDESHOWCK_LIGHTBOX_DESC="Select which lightbox to use to open your links"
SLIDESHOWCK_PORTRAIT_LABEL="Contain the images"
SLIDESHOWCK_PORTRAIT_DESC="The images will be contained into the slideshow area without resizing"
SLIDESHOWCK_ONLY_PRO="Only available in the Pro version. Click here to read more infos"
SLIDESHOWCK_SOURCE_ARTICLES="Articles"
SLIDESHOWCK_THUMBSTYPE_LABEL="Thumbnails to use"
SLIDESHOWCK_THUMBSTYPE_DESC="Choose between reduced size image or normal size image"
SLIDESHOWCK_THUMBSTYPE_MINI="Mini"
SLIDESHOWCK_THUMBSTYPE_NORMAL="Normal"
SLIDESHOWCK_MIGRATION_NEEDED="A migration is needed ! We have detected that you are editing a module that has been created with Slideshow CK V1."
SLIDESHOWCK_MIGRATION_ACTION="Please click here to automatically update the module. If you don't do it, you may loose some configuration."
SLIDESHOWCK_MIGRATION_SUCCESS="Migration done with success !"
SLIDESHOWCK_MIGRATION_ERROR="Error when trying to migrate the module to the V2. Please contact the developper."
SLIDESHOWCK_HEIGHT_FIELD_HELP_TITLE="How to calculate the height"
SLIDESHOWCK_HEIGHT_FIELD_HELP_1="You can set up the height in <b>px</b> or <b>%</b>. If you use %, the height will be responsive and it will keep the image ratio. If you use px, then the height will always stay the same and it will crop the image."
SLIDESHOWCK_HEIGHT_FIELD_HELP_2="How to calculate the height in %"
SLIDESHOWCK_HEIGHT_FIELD_HELP_3="The percentage is the ratio between the height and width of your image. Note that this value is used for all images in the slideshow, so it is recommended to have all images with the same dimensions."
SLIDESHOWCK_HEIGHT_FIELD_HELP_4="Take an example with an image that has the following dimensions :"
SLIDESHOWCK_HEIGHT_FIELD_HELP_5="To calculate the ratio : 800 / 1280 = <b>62%</b>. Then in the height option, set the value to 62%."
SLIDESHOWCK_RATIO_LABEL="Image ratio"
SLIDESHOWCK_CALCULATOR="Calculator"
SLIDESHOWCK_SAVE="Save"
SLIDESHOWCK_PARAMS_UNPUBLISHED_INFO="Are you updating this module from the V1 to V2 of Slideshow CK ? The plugin Slideshow CK Params has been detected and it has automatically been deactivated because not compatible with the V2."
SLIDESHOWCK_PARAMS_MIGRATION_LINK="Click here to read the instructions on how to migrate"
SLIDESHOWCK_TEXT_CUSTOM="Custom text"
SLIDESHOWCK_TEXT="Text"
SLIDESHOWCK_WARNING_PLUGIN_OBSOLETE="You have a plugin that is obsolete that was working the Version 1 of Slideshow CK. This plugin is no more compatible with the Version 2 of Slideshow CK, please unpublish it."
SLIDESHOWCK_DISABLE_PLUGIN="Click here to unpublish the plugin"
;added 2.0.5
SLIDESHOWCK_DEBUG_LABEL="Show debug messages"
SLIDESHOWCK_DEBUG_DESC="Disable it if you don't want any message from the slideshow"
;added 2.0.16
SLIDESHOWCK_LOAD_INLINE_LABEL="Load script inline"
SLIDESHOWCK_LOAD_INLINE_DESC="If you have some problems to render the slidehow when loaded into an article, you can use this option"
;added 2.1.1
SLIDESHOWCK_CONTENT_PREPARE_LABEL="Prepare content"
SLIDESHOWCK_CONTENT_PREPARE_DESC="Call the content plugins to be triggered on the rendered content"
;added 2.2.1
SLIDESHOWCK_VIDEO_AUTOPLAY="Autoplay"
SLIDESHOWCK_VIDEO_LOOP="Loop"
SLIDESHOWCK_VIDEO_CONTROLS="Controls"
;added 2.3.11
SLIDESHOWCK_TITLE_IN_THUMBNAILS_LABEL="Show title in thumbs"
;added 2.4.1
SLIDESHOWCK_RESPONSIVEHIDEDESCRIPTION_LABEL="Hide description"
SLIDESHOWCK_RESPONSIVEHIDEDESCRIPTION_DESC="Hide description on mobile"components/com_slideshowck/extensions/mod_slideshowck/themes/index.html000060400000000037152453623440022751 0ustar00<!DOCTYPE html><title></title>
components/com_slideshowck/extensions/mod_slideshowck/themes/default/images/blank.gif000060400000002105152453623440025421 0ustar00GIF89a����!�XMP DataXMP<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Windows" xmpMM:InstanceID="xmp.iid:0D980D8206C011E0985695BBDE1B5A90" xmpMM:DocumentID="xmp.did:0D980D8306C011E0985695BBDE1B5A90"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:0D980D8006C011E0985695BBDE1B5A90" stRef:documentID="xmp.did:0D980D8106C011E0985695BBDE1B5A90"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�������������������������������������������������������������������������������������������������������������������������������~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"! 

	!�,D;components/com_slideshowck/extensions/mod_slideshowck/themes/default/images/index.html000060400000000037152453623440025642 0ustar00<!DOCTYPE html><title></title>
components/com_slideshowck/extensions/mod_slideshowck/themes/default/images/camera_skins.png000060400000057206152453623440027024 0ustar00�PNG


IHDR�,�<rtEXtSoftwareAdobe ImageReadyq�e<fiTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmpMM:OriginalDocumentID="xmp.did:0A80117407206811BBABD7A72E8A3CEB" xmpMM:DocumentID="xmp.did:9CE331D8475D11E1BFD3D381F831A47D" xmpMM:InstanceID="xmp.iid:9CE331D7475D11E1BFD3D381F831A47D" xmp:CreatorTool="Adobe Photoshop CS5 Macintosh"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:21A56ECB01236811BBABD7A72E8A3CEB" stRef:documentID="xmp.did:0A80117407206811BBABD7A72E8A3CEB"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>���Z�IDATx��Ak,O���#������	��l<J����w0Z&��B�Z$dF�,5z���<���'��7�ƨ�
� ��N��Q�y�����S�|���{�w�t�֩s��j��l2�^�@p�� 8�� 8ߺ�G����כ�\�����b>��e��g�l����"�s�K�5q�Ql�	j�HlR��CpM��kC�Y�2W�"��4�,\dYYyH�e�����
�k���؞̔���g�����`�\�m7j+�/�\Ѣ�f����5�=����\�v���3�>�u�m��v���G�K���}�]�=���u/m�3p�z��P�����<j�Kf��"��:0����{s}�G�\gK��g�P��Բ�0#N>ԩ8��ȣܗ�W͐�/}���d���Il\d�
(�/}Y��7m{雞$�
%)P�ׅ���>�C#��BIJ������JBPܹ~/���3XE����؆1
%�����?���(�*:�OD&{Q��g��J5ҙɽ�<v.8�e��/��2B������4��z���u�,�}���1�߬jn����,�`�%�O��2B��">�s�oni{*��Cm�Jb���e�a�мE'�k9�I�+߾�:yY��ڈ��{�����4h՗R]^��ˆ����n��������4�AR(y�B��=
��uZw��:��^5%�%��=��J��=�u���\n�[(�,©s?�ske�Rwj��t��B,�8��Y@��V��~O8B]\W��R�Pv�`��啀� �)% 8��� 8@p��@p�� 8�� 	�
�g�yr��G,�
j�3�
G'8������f�
+�a$6�m�@�#4���/ܿ�2񐃁�
�[���VĦQNlYd���ӵ��
��f��g�i%z�Y�"}ž��W�ɋ-Ϫ��}�����޵�njp�-N��&SH�ΛY(,}a���kGo�}$�F*��>Om��fXm�_p�Bɋ3��%j[y�������l�n=cȻ{�'��\gr�����ҹ���8y}24��ȣܗ�1����/}���d�$�
��K_�1�M�^��'	N�)�ۿ��`�y8‹^(fv.�ֹm�t�$��W�Cj�
%�����U@9Tp��%˝g��r+�
cJ>]q�!8�Q�Ut6j����u��.�ZɣF:3�wÖ��g���%Y^�@h���ڝ��&6��Nm�<�e��2{��dq��ͪ�l��Β\���-c 4?�+��>�P�f��b�O�0�^�T�)Z����
���-�F�Z5�i�`��g-��#��O);].|G� ��?�C���?Y��3�6�iݗ�����m��í�E|w����H-��'-��3Hקs��6[i��df�]�{8���{�_��\n�[(�Lp�(I���9�s6%mi�{EԠS��PN
&Ď������o]�:�����C��=���DOoBG8�)��� 8��@p���$&89!��%�j@T���/g�d�Y"1��L�.(su�[#�]��<*�(7ɪ�9�����
wj�4�C�˔�-��a���n�+��rǃ��O:���T�ܫF2���3����h=k��6�-�7��J?���B�?�����.8�[L~n*F�/���?�����[>�4��򝿏a�T�>����=��oCM)�����h]+��7h�j�P[����R^"�_��:����Z(I����曆y?��-�	�j�$�
�kW(��ڏf>�CW7&��2�N[��u�e/���€-�eޗ��pz�`�]�3%�$�gtVR���n�U��NXSܧx��)t`��֊Qc:g)Ei�֩�Q"�i��xt��vfd�d�\�̓!�Ԧ��IC)�S������
�#��K�����J��>�z�]dv�1Z{�H��X�`�4��p�	.�}���1�w����1+�3�������Z�5����e����v'�d>#z�3�{��҂��흒�ܼ,F�fv��a�Yf{��U�1����!�Sd�(����(�xJ��puY��/L=j&:*����,3�V�է���}Ӧ.�4�@~����Y�]k�=Kk�:�7�ʛ�*��Q�"��p,�@p�� 8��� 8@p��@p������w���\�Ϲ��[�&�b��α��ѝ�����E���3��b�D��l�����jC����2�L2��o�?P�H��*�f��=����MmI�h����'�=�ͩ��W�"X���3���_� 9v��.���?J߮t�0ihy����C���f
ۤ�s�l^(�H1G.��3\�ٽ�y�bk�}��MՎ�
�li-6�~[ĘR6%�U��m�
(�@�*�D.h7��u�z��G/Z����I���Z(I�����m��`�y�3Y(I�����Jf����G3��Ɂ�����̹�j��"��K��0�0�G��y/�K�P�Y�{JIx���Bɵ!�ĖIۥ�CW'�)�S��y�H�y�F�1r+鷥��mǶN��)M{Xƨ�vfa�d(��<2Kl)ڮE����Sܧhu���'~��6L|�Uʤ�)]�@h�y)RH�ksV�X\�M�.�}���1����_���Ya��
^� [������P?��O��2���4�n..�v�c����}��E��ُFZ�NIBn^#^3�?��a��-hкO_�`c��Hf&��m���$P@Ib�'�.��S(�Dp�(	�v��Js�>��+ͻ�j��3Mdxr�+�Φ��n�Sڂ�G�3M���j�D�b���p�c��� 8��@p���t��N���@N5�S����&��]����[��:[.�r8��ԧ���M�l�6U���h�=���s��]�pn��d�"���SV�,Զ�~D�k����ޤl3��Vq��ݮ
v͵�v��B�b�u-zl�(۬ڎ��;�nM�n���nwl��03�S��`��[Go�}�Dh?���mѣe���I���%/� �'W��dv
(�ᆰ�[���7קy?�u�4�_pv%�M-����m��'�����y{�Ui�g�"��,�|<:�2��痾,��[��7=9Lp�%�E9���u�dh�ߪ�!=
(�F8ۅ��
(_	�J>��"�,�*�s�N���3XE����Ȫ-zv�ʖ��ֹ�G�v��&EV�E=s�Z+y�Hg'�~��{��+��}I��1��&�v���Ѐ��;����e��S�����fU����Β\z��-c 4?�+��^�P���=ɪk��}
���v��O����2��0Fhޢ������
�}��*y���0*�g�ݮMoA�6})��u��|��q��-��*C���;C��:H
%OZ(�G!��N��z[�j���xϒB��f%���Ў�X�g.7�iۋ��r�un�,PV;5ntT��O!]���}j���YU(9Kj 8�|��M(;N�G��J@p��� 8� 8@p�@p�� 8����?��=��r�ep�_^�Q�4p��r����rA��QE8�����bԆ�ؤ���4�X<�n{|��pn{n��,++��,�t�?�����}&=�'3�ut�9#ę-_?���@m��Ŗ� Z�ج�5Ҷ�F���r�r9SH�N�Y��:�6�O^;z��#�%B+�v}[��G�Vy��>�I���^p�2{I��V^ i��"��:0����{s}�G�\gK��g�P��Բ�0#N^ߢ��<�(�%f�c��K�1D�3Y(�dt��
��K_�1�M�^��'	.�BI���u�d�ٹPs�S@94™.��T@�JxH-^�$d�P���w��d,w��*28ȭD�6�Q(�Dtu�ч�G�V�٨}"2ًz�>�V��L�ݰ�s�,��}I��1��&�v���Ѐ��;����e��S4����fUs��}gI.�}�֖1�����i�{(3pK�S�ŧ`jkW�
.c�
c��-:y_��QN�^��]�P5y���0*�g�ݮ-oA�V})��u��l���m�\pj��yߝ!Kc$��'-��q٣�\�ug}�k
�US�YR��Ù,�$���Q+���&����"�:���:�V(u�ƍ�JW�)Ģ�S��Kk%��#$x�k�K�oB�q�=��W��Ħ������� 8��@p����$7ȳK�1sI��"6���C���9v}��|�n��-��Ď�Yu��Yl{�����ւs�
�jӜ.����&��:"�Ȫ[N�p�6M�F8�)Z�T�6CG��a���nj�����ؤN�侧=�9�6��Q��ۻ��_����F�h�����oW:K�4�<bf}��!�~X���?Z>�Xl��΍�ya��#��#��p1�f��+[����n�vĸ'BfKk����"Ɣ�Y()��Mm�T@��W�$:pA�~��K?�ob����I���Z(I����1�g��`�y�3Y(I�����Jf����G3��Ɂ/~��t2������3d/���€-2ϛX�p)J>+�xO	"	���R(�t��2i�4q���5�}��;�`�5��Hʍ�#�������֩�Q"�iO����,L�����Cf�-E۵ȓ_�<|���.c �v���¯?Ԇ�Ϡ�J��>E���� /E
)z�cΪk�K���%�O��2ƛځ���1+�3����dk�����%�Ϭ�S����l8M����˫��X�p}y��o�+z�����S����ň���=w~{fy���W-X�ؼ<������9	P���	�(�J:��J��=�� ����)�J�����L����ʂ��i���������L��>���b�� �m�� �?��p�c��� 8��@p����"�� �t�s+)��Mt7D���g�~9����o��&v�վ��}�w�·���8�ڐ��ྌ&���qt��
��~�KJm��p�����-)�-ss��侧=�9�6��Q�;�|P��_]���i�����?J߮t�0ihy��������q��ˏ6?K��(Ŀ��GlS�֡{~�'y��7�O��7�>�]Sm�<B�����
5�lJ
����f��R��*�D+��u������K?zѺ�ܷ�N<��BIJ��G}]�mDnwl�hb�P�h�+��b�[Ïf>������M:��+�]�!Cx�P��h�~4�Ep�pz�`�]�3%�$�gt�-�O2�k~;Fl��]�8Tpuš�>�˝g���Wn$#���~[J]�vl�Tp�(�ҴGm��k��Y�:Jr}7��[��k�'�y��)Z]�@h����_�
�A;D�2�}�F�1Z�A^�R�ǜU5��jS?�Kp���e�7���*��cV�gj�W�[�Qg���P?��O��2���4�n..�v�c�����}��͑��S����ň���=w~{fy���W-X�ؼ<������9	P���	�(�J:�p�(�Ϊ5��d��Bɳ'��pTQN҄E_}�>>�7m��L����ʂ��i���������-�?�(���h`�!�lo�
���#|� 8��@p��� 8 �u��p ��/��������og���[��:[.�r8���>�h[l��0��6���F���Ɔ�s{2��pn��d�"���C�-�mF�n]�Ϥ�d���.8g�8��n���Zm�Q[!}��:�=6+m��������B�A.w�ckl��Y��:�6�O^;z��#�%B��>��o��Hڒ{
~�3p�z��P�����<j��xj��"��:0����{s}�G�\gK��g�P��Բ�0#N^�Ɗ�<򨬺2:����o�"™,�|2:����^�/˘��m/}ӓ��@�$�
��P24�o�Ő>�C#��BIJ������J>�#����r���;�K2�;�`
�V"b�(�|"�:��Cp֣D��l�>��E=s�Z+y�Hg&�n��ع���۾$���c_���{h���i����y�˲�)^�@h~�*�Z�}gI.�}�֖1�����i�{(3pK�S�ŧ`jkW�
.c�
c��-:y_��QN�^��]�P5y���0*�g�ݮ-oA�V})��u��l���m�\pj��zg��XI��I%c\�(D7�i�Y_�ZxՔ�{���p&(	�v�Ŋ>s��N�^�p��:��ZY�ԝ7:*]��.N�jP,����������/�	e�	��Z^	�R�@p��� 8��@pB��vp&��ɑW7�ר��8[�9ge�l����"�s��Ql�	j�HlR��CpM,G�=�Om8��=��E����T[Y:�@�A~�>�ۓ��:���̖���ߧ�B�b�u-zlV�i�Q#��C�����$]�ͬOq�}��'�����������-z�#i��fx���$��o/8t��$Cm+/�4R@�|�U���ݽ�>�#�Q���y�3\(�ljYv�'�O�Fxy���3���o�"™,�|2:����^�/˘��m/}ӓ��@�$�
��P2��\�9�)��LJR*�|%<��P��
^�Cw��)^���y���P ��0F�����G��%ZEg����d/�,�ZɣF:3�wÖ��g���%Y^�@h���ڝ��C~TO��Զ�#\�%�O��2B�U�
�2��%,��)Z[�@h~�VWħ}��-mO���a��]I�S4��!6�����}�"G9i{��w�n@��6�¨�5w���
Z��T��1����㶹[p��!��E|w�,�u�J��P2�e�Bts�֝���5�WMI�gI�g����~Ohٵ��g.7�iۋ�N��AG�[+��S�FG�+�bх��+ߧF��U��������ɗ
߄��{d-��A���@p������ 8����
���K�1sI��"6����v��˙&�׿X�E�/g�Ķ�p����n-8��p�6��r8��h2ɪ#򊬺��
wj�Tm�#!F�pH��#��UKS7��z�FH_lR'xr��ۜj�{�(��p΀���/�v�ng#w�{gy�ҷ+�%LZ�?����vOP_L'X>ٸ��Fm���?š-��	7�O-�����xw�z�м�9�'���R6%�U�Q�,P��5�Y��u�ݹ>}��G�M�s�>;	��V%)P��Ͳ�������[�3Y(I�����Jf����G3��Ɂ/~��t2��+�]�!Cx�P��h�y��zh�K�P�eŰ����Y�B�GxP\����O�r�,"��I���b�ߖR���:��2��Hi}�ڙ����T �w�`�,��h�yr���Oq���e��n��X����0��CT)�ڧht���H!E�y�YUc-p�6�#��)ZZ�xS;��B>f�y�6xp��4I��^�J��1�
�	��m|�|��}�7��k�`��FZ��MIBn^#^3�?��a��-hкO_�`c��Hf&��m���$P@Ib�'�.��S(�Dp�(	�����T�V�w��fg����>/Vl�Mk�ݾ��
���g�4
(��ߜ
5���&x��# 8��� 8@p�@p�� 8�� ����o_�Ϲ��[�&�b��α��ѝ��˿}�,6��g��Ŷ�p��Gg��Ն�?�e4�d6���ߧ6‘#U8���n{n����ڒ��27w_O�{�c�Sms�E��0Sg^9�0�ArD�D�m�����oW:K�4�<bf}��!�2���َm7jslg�)m��O�i|j�Mv�>ƻ�f�.��'���R6%�U�Q�,P��5�Y��u�ݹ>}��G/Z����I���Z(I����n�E�*���-�E8���D(�]�d��~4�)������ɜۯ���v}��%C]�[�Ѽ�%R(���b��Zx��,z��#�
(�
�NXSܧx���\�ʍ�c�V2�oK��ێm�
�T��c����Q�����P*��y0d��R�]�<9��ç�O��2Bk7�O,��Cm���!��I�S4������R����<欪��T��\��--c��ͿP!��<S�
8!�R�ߧ��~O�﬙���K�vI~�wZ�ږɫ�$y,��F�����c�,oA��}�����G23�o��<'�J�=�ve�BI'��\@Ip�'��W�C�zlv�i�^mvq���O��be��ٴΪ-h�Sڂ�G�3M�#�9jd[!6�M�=F8@p��@p�� 8��� 8@p��H�o]�����?�c�䘼���F=.��"G,��CggQ�qE8��1b��bԆ�ؤ���4�l�7�ۣ��F���p3�&YVVRmY�m3��xp��}&=�'3�ut�9#ęo4w�6�7�jۍ�
�-�A��Yik�mG�p�%y�r�r��[c;���ٷi|��ћ�.���w}[��G�ֽ���}���Bɋ3��Q�j�\1l��"��:0����{s}�G�\gK��g�P��Բ�0#N^_��<򨬺�=�u���o�"™,�|2:����^�/˘��m/}ӓ��@�$�
��P24�o�M�>�C#��BIJ������JBPܹ~�x+�r��"�C��JDl���ODWG�}�z�h���'"���g�@k%�����
[;��2{ۗdy�}�o�kw�{
�Q=�S�:�pY��>E���oVe����,�`�%�O��2B��">�s�oni{*��Cm�Jb���e�a�мE'�k9�I�+߾v�&��F���۵�-hЪ/����ї
_��݂N
� /�3di���P򤅒1.{���u`��jJ�=K
�{8���{B;�bE���ķP�Y�S�~�Q�����Ը�Q�
?�XtqjW��bi�$���p��p�|��M(;N�G��J@p�ؔ�@p�� 8��� 8@p�@p���Y��>O�ꒃ��
j�3�
G'�Au3��}F�����
#�Im�B��m�~��NǍ��� �p�����p!؞�oEl�ĖE���~0]z<�rP͔��#ܠrf9�V�Ǚ�(��W��}��q�W�����7U��"��C�S6������f
K_ظi|��ћɮ����S�*�V�\�P�.�3��V^ i��"ǯ����[�����2�(יܼw����tn���#N^���<�0c[/m_��!"��BI��痾,c�����MO��aS<�{��>�p��P2��\�9xLk�p�%)P�R�W(	Y@9Tp��%˝g��r+�
7���{�ч�G�V�٨}"��M�f�@k%�����
[;��2{ۗdy�}�o�kw�{����;����e���m^��e��7���e�;K:Xp	�S���������O���;pK�S�ŧ`d/e*������r�wg�T�s���4D0�`׳PƑދ짔�.~#�\���3��s�3�Gl�?̬�ȧu_���ˆ������'��2�����-�<i�d�A��j��l�1����w
 ���LP��	~�>s��o��3�.�$���P����Ԧ��y�oD
:��M��@aB��a,����Ũ3�~�PX9DhP�l#��ӛ�z��� 8��@p������ 8w8���}��/��9���?@�z�B���+�G,D��p����nM8�f{5U��.�#�`{�s�ٺ$�Nm���p4s���m��p�g?Z��m~���(w<b�:�������T�ܫF.��g?�3���_� 9�~�����?I߮t�0ihy��z��C�
r�z���O�����b[��~�6ǷG��M���?�w�/Ǯ����m���������BIav��l�T@���]F������Dݺ��\��D�bȹo��xx����
(Ϗ�����E����[��f�$�
�kW(�E��w?��PN|xy�sM���tZe몴}`��V���/��0�G��y?�{�W	v��>S�H�{FgY]��d���.mj�4q���5�}��;�`��6\ ����R��c[��{�)M{��a5:�B;31u��
�nY�P��r-�� ��>E���� ?1��ʆ�Ϡ�J��>E���� /E�e��X��yi˦���'^@j�--c��ͿP!��<S�
8an@�2��T��,�[ݧhmc��&�������w��V��������`PHn�IIBn^#^3�?��g���A�>}ՂE��ˣrf�I����/����|迀�G����E�Y�&q�L�P(y��Ęc�*�I���O+��6uq���O�,([Y�����nߓڂGǷ��{�
l"T�� 6�=��p�!�� 8� 8@p�@p�� 8�?��2�t�s3O)��M�	�����ѝf�y�,6��gV�� ��8:�]ِ��ྌ&�����T6±#U8�����~KS�ʖ��?���������6���^5�p9�_����o6F;H���p�Ƕzgy�Oҷ+�%LZ�?���v���B�&
��3ʚ��/�H1羜�Z-�e�t��R\�o�D�K"�\�8v��ܶD79\�ʵ��1�lJl��r�"�U@�ob}-�����?ׁ�%��h]`��g'�j�$�
���fq�q�cKo�f�$�
�k7��E��w?��PN|���f�ι������2��uana���G�~�N�츫}�����ζ��I�y�o�\�6�\�8Tpuš�>�˝g�H�U��1j+鷥��mǶN�%R��T�Z�ε��LL�����CV=�6�\�<9��ç�O��2Bk7�OL����a�3h��R��O��2Bk?�K�b���,i^�R�ԓ��ۧhi�M�@h��
q�����U�	s尔�2Xi���ݧhm�o6�	8wsqy����/�v��=-���쓒�ܼ,F�٧��)�����ӧ�Z���yyT�L<	����4�{��P�(�t�ޣ�:��$.|��
%�Z�s��QE9I��i���}Ӧ.�4��)�e+��5w���48:Ÿi�O�0�^�Pd���$|��# 8��� 8@p�@p�� 8��� �]���}��'�b���
4p|�s�]#6�d�O�RFb��/�<�D#��<��+��zL����p!���VĦQNlY�m3���"F6X����-mF�p�q��Q�֢�F��Q�ξwM^l��������6G:��wm�1#\}Iޭ�)��t�ckl��Y(,}a���kGo�}$�F*��>OmK.��6�/�F���tg�y�6�b�JE�;xUN�YȻ{�'��\gr�����~�}�w�q�c��Ge��1����/}���d�$�
��K_�1�M�^��'	N�7Y}�g:\��7���^�B�Ј��7�ֹm�t�$��W�Cj�
%�����U@9Tp��4˝g��r+�
cJ>]q�!8�Q�Ut6j����u��.�ZɣF:3�wÖ��g���%Y^�@h���ڝ��&6��Nm�<�e��2{��dq��ͪ,�#?��%,��)Z[�@h~�VWħ}��-mO���a�����S���S��ޝ�[R�εjz�� �]�Z@Gz/��Rv�\��Np!>���ͻ�{�o���mj�̪�|Z��y��l������p�z)�w����H-��'-��3Hקs��6[i��df�]�{8���{�_��\n�[(�Lp�(I���9�s6%mi�{EԠS��PN
&Ď������o]�:�����C��=���DOoBG8�)��� 8��@p���tķ.����[93P~]}uss�W��9bA�:[.�r8���>�[l��0��6���F���m��S�"�m��s�ee�!ՖE���~�_�Ϥ�d���.8g�8��뇷������rD����Fڶ7�N��B��4�.���NyW
(j��B�����\��l���n3�A�Dhi�ŦB�OǮm/��2`{��U��cl/�4R@�J�[�����Q��%�;�N�-�s��P�[4�G�d���h��}�?��p&%	P^{d]u�ߴ�e�y��A�K�P�b�}�?
����0�)���t2���;ϐYR��?�PR�#��^lj;p*�s�^&�˝g��r+�
cJ>]q�!8�Q�Ut6j��L�������<j�3�{7ly�\p��m_��e�������i�=4�G���Nm�<�eYb�
/c 4�Y�܀-s�Y��Kp���e���ouE|������4�vV��&�F�0�O��2��0Fhޢ������-�^}r/��}��h~�'��K�.�c�e���ms��SC�ȋ��Y� )�<i�d�����:�;�kXk���xϒB��d%���вk���\n�ӶA#�:���:�V(?'�Q�
?�XtqjW��bi�$���p��p�|��M(;N�G��J@p�ؔ�@p�� 8��� 8@p������9K~a}��6�}�K>�-�o9�a�l����"�s��Ql�	j�HlR��CpM,���=MLm8��=F�E����T[Y:DZC�A~�>�ۓ��:���̖O�ڞ&��B�b�u-zlV�i�Q#��5�������\�ͬOq�}��'������������-z�#i���t���$��o�[s�=�_m+�3R@�|�U���ݽ�>�#�Q���y�3\(�ljYv�'������Q�K̘�hKۗ��c�g�P���$6.2{�痾,c�����MO\��(��B�0�s��Ч�rh�3](I����Z�BI�ʡ�;����_�<�Udp(�[��m�P�����Y����Q�Dd���}h��Q#��ܻa�c�3Xfo��,/c ���M|�Ns�?���wj[�.�ۧhx��ͪ�l��Β\���-c 4?�+��>�P�f��b�O�0�֮$�)\���[t�V�������`2j�XqaTpϚ�][ނ��R���}��q��-���y�"�;C��:H
%OZ(�G!��N��Z����$޳�п�3Y@Ip�'��.V��M|%�E8u�un�,P�N����S�E�v5(��JR��	GH��ȗ
߄��{d-��M)� 8��@p���� 8����?����?����H���������8[�9ge�l����"�s��Ql�	j�HlR��CpM,G�=�Om8��=��E����T[Y:�@�A~�>�ۓ��:���̖���ߧ�B�b�u-zlV�i�Q#��C�����$]�ͬOq�}��'�����������-z�#i��fx���$��o/8t��$Cm+/�4R@�|�U���ݽ�>�#�Q���y�3\(�ljYv�'�O�Fxy���3���o�"™,�|2:����^�/˘��m/}ӓ��@�$�
��P2��\�9�)��LJR*�|%<��P��r���;�K2�;�`
�V"b�(�|"�:��Cp֣D��l�>��E=s�Z+y�Hg&�n��ع���۾$���c_���{h���i����y�˲�)^�@h~���[澳����>Ek�������=�������S0��+�}��1Ć1B����U�('m�|�.�
��<�F\ܳ�nז��A�����:F_6|}�6w.85D^����ΐ���BɓJƸ�Q�n�Ӻ��ց��)��,)���LP��	�}�r�BIgN��AG�[+��S�FG�+�b�ũ]������{�<�5��7��8�Y�+�@bSJ@p��@p������ 8@p�@h�u�?�@���#
���l�Vg�� ��-t9U�s^��?�-6Am�Mj�qN��������G��Ȳ��j�"K�h?ȯ�g�c{2SZG�3B���qt���VH_l��E��J[#m;j��^ph!w� �3u��봙�)��o�䵣7�>�]"��a׷E�~$m���3p�z���� ��d�m��F
(�ᆰ�[���7קy?�u�4�]p�%�M-�3�����#�r_2`�<�^ھ��CD8���OF'�q��+� <��e�ߴ�ozr��(��X@Ax_J���5�>�C#��BIJ������J>�#����r���;�K2�;�`
�V"b�(�|"�:��Cp֣D��l�>��E=s�Z+y�Hg&�n��ع���۾$���c_���{h���i����y�˲�)^�@h~���[澳����>Ek�������=�������S0��+�}��1Ć1B����U�('m�|�.�
��<�F\ܳ�nז��A�����:F_6|}�6w.85D^����ΐ���BɓJƸ�Q�n�Ӻ��ց��)��,)���LP��	�}�r�����ԹtԹ��@�;5ntT��O!]���}j���YU(9Ki 8�|��M(;N�G��J@p�!�� 8� 8@p�@p�� 8����?���;9�N�2�����1��9bA�Y:[.�r8���>�[l��0��6���F���m��S�"�m��w�ee�!ՖE���~�_�Ϥ�d���.8g�8��뇷������rD����F�v�����B�A.g�I�i3�S\gߦ��kGo�}$�Dh�îo��H�*��g�>	����Af/�P��$�P$�}U&��wo�O�~��li޻�J>�Z�f���[4�G�d��yl��}�?��p&%��Nb�"�W@Ax~��2��i�K��� �%P(I����.�3;j}
(�F8Ӆ��
(_	��+��,�*�s�N���3XE����؆1
%�����?���(�*:�OD&{Q��g��J5ҙɽ�<v.8�e��/��2B������4��z���u�,�}���1�߬jn����,�`�%�O��2B��">�s�oni{*��Cm�Jb���e�a�мE'�k9�I�+߾v�&��F���۵�-hЪ/����ї
_��݂N
� /�3di���P򤅒1.{���u`��jJ�=K
�{8���{B;�bE���ķP�Y�S�~�Q�����Ը�Q�
?�XtqjW��bi�$���p��p�|��M(;N�G��J@p�ؔ�@p�� 8��� 8@p�@p���n�K�1sI��"6����v�]#&ߧ7��[d��?��L���.4sۭ�Vnզ9]G#8M&YuD^�U��X�Nm���p$�Hi3t���jiꦶ\���M�O�{�c�Sms�E����[�9�����-�l�n�v�,o�Q�v���Ic@�#�gַ������响�6)��8�
:Ȓ;��snv��R�5�>���jG�{"d��\�-bL)���ª��6K�z�z�H����:P�D�&ֹo��xx����
(o���~��f�G8���D(�]�d��~4�)�������L'sn��*�ȹ>C��.�-��"���B����� ����/�K� �-��K�
�NXSܧx���\�ʍ���Z1�oK��ێm�
n%R��$��Q�����P*��y0d��R�]�<9��ç�O��2Bk7�O,��Cm���!��I�S4������R����<欪��T��\��--c��ͿP!��<S�
8A�vI��)~��~fu���eg�i
)o��v�c����}��E��ُFZ�NIBn^#^3�?��a��-hкO_�`c��Hf&��m���$P@Ib�'�.��S(�Dp�(	�v��Js�>��+ͻ�j��3Mdxr�+�Φ��n�Sڂ�G�3M���j�D�b���p�c��� 8��@p���$#�|p�>�f�Rl��t7�&�/��_��;�����U��վ��}��"\`��љp�ʆ�?�e4�d6���ߧ6±#U8���n{n���[���67�#�v�!js�m�U������u��/�v�Q=��a۽���'�ە�&�-�؟Y�v@��`��ìa�kik>X(�H1羜��-��^ɼR�5�>���jG�Æe��.m�n=
5�lJ
������굌$y:��F����%��h]`��g'�j��#,P�~Q�6�
��:�p6%iP^�B�,�����̧�rr��o/8t�sn����\�!Cx�P��h�~4�GpiJ>+�xO	"	���R(�6d�uiS˥�CW'�)�S��y��۸��#�������֩�ޣDJ������LL�����CV=�6�\�<0�3��gy��e��n�����G��p�*eZ�m.c ����)��k`̒�-y����%�O��2ƛځ���1+�3����hk�Ʃ|��P?3�O��2F�9M����˫��X���L���}�^ѳ����ܼ,F�fV��c�LoA��}�����G��ēp?ϱ_@Ic�'��e�BI7���Y@Io�'��W�C�9�]i޽W�]�i"#�S&�Vl�Zs��ImA��#��&���
E��~O8J�G8�1��@p���� 8��@p���O�S��Ԯ�����w����o9�z�l����"ܟ�\�j4�.6��aT�T�p$������vx?���("�L���E�����lY�m3����ӟ��3鱽I�ft������7Y}^�=�ն��[��h�c�E�f�v�W��uk"w�}.w�ckl������ϛ�'�:z����%B��>��o���(۔���O=|](yq�=ٸ��%�S@�|�U���ݽ�>�#�Q���y���[(�ljYu�
'�ocEx>yTuet��k�J<���f����i��,� <��e�ߪ�����a��_(I����.���[u1�G��g�P�R�+�A�B��~Td��Cw��)^���y���P���Y�E��T�2T�:��(�.:ۤȪ��g�@k%������<v/8{e��/��2B������4��z���u�,�}�v�1�߬�µ�s�Y��Ko���e���ouE|��ʿ�'Yu���O�0�֮4�)�[���[t�V��ܼ�����݀Z%��F���۵�-hЦ/����җ�>n���\e����,�u�J��P2�c�Bts�֝��\�^5%�%��=��Jz�=�u���\n�Ӷa#\��:�ܚY��vj��t��B,�\r���!B?��Pr��4@p�R�Pv�`��啀��;8� 8@p�@p�� 8��� 8@p\�
����>�*[��n8>�
����l��~He��
 ��*���/���l<�@�pE&�wZ���s�����r�,����`�����[ڌ�qf9�:��Z��o}|��W�ɋ-Ϫ�ǽ�g��"�{�f3½_phq�V�d��`f����'�:z����5���<���k�+"�P���{IFe[u���ʼ���ۿ[��r6�G�	�G�����r���������׷h"<�<*�d��yl�Ui�g�"��,��W@Ax~��2��Um/}ӓ�W�a-]p��$���#�腒af�B��6��!��.��T@�Jx�P��g�P���w��d,w��*28���G9�(�|,�:��Cp֣D��l��L�7Y3\���G�tvr�w[���2{ۗdy�}�o�kw�{��_M��Զ�#\��+��yI�1�߬jn����,�p���O��2B��">�u�_ܓ��Z�ڧ`f/e*������_�nݖE��jz�� �]�Z@Gz/���r�9`l�|\���?�e�������qf�F>m��<Z_�������p�z)�w����H-��'-��3H��`�Ӻ�f+�9��x�B��f%����W@�3���J���JZ�=�}e�9�u6%mUm�Q�N)���rj�0!v�̬�0�P|�d����C��qf�P#�c���#���@p���� 8��@p��[��?�?���(����G���W��9bA�:[.�r8���>�[l��0��6���F���m��S�"�m��s�ee�!ՖE���~�_�Ϥ�d���.8g�8��뇷������rD����F�v�����B�A.g�I�i3�S\gߦ��kGo�}$�Dh�îo��H�*��g�>	����AwV�Gm+/�4R@�|�U���ݽ�>�#�Q���y�3\(�ljYv�'�o�Dxy����*���o�"™,�|2:����^�/˘��m/}ӓ��@�$�
��P24�ob�Ч�rh�3](I����Z�BI�ʡ�;��e����y���P ��0F�����G��%ZEg����d/�,�ZɣF:3�wÖ��g���%Y^�@h���ڝ��C~TO��Զ�#\�%�O��2B�U�
�2��%,��)Z[�@h~�VWħ}��-mO���a��]I�S4��!6�����}�"G9i{��w�n@��6�¨�5w���
Z��T��1����㶹[p��!��E|w�,�u�J��P2�e�Bts�֝���5�WMI�gI�g����~OhG]��3���J:�p��:��ZY�ԝ7:*]��.N�jP,����������/�	e�	��Z^	�R�@p��� 8��@p������}�\�!��Mt7�&�/��c�Lj�����-��Ď�Yu��Yl{�����ւs�
�jӜ.����&��:"�Ȫ[N�p�6M�F8b�
��:�m[�4uS[�wl���&u�'�=�ͩ��W�"X���-���hm�p6r�@�w�7�(}��Y¤1���3���i�$��a��响k�n����Sڂ-�M�Zd��������yis�Od
5�lJ
��S�f��RT�	�Rԭ����K?�ob����I���Z(I����n�Ž��vǖ�"��BI��׮P2��o
?��PN|xy�sM��9�_m]���K��0�0�G���&�C#\
��/(�m����΢J>«�r���5�}��;�`�5��Hʍ�#�������֩�L��=FJ�����,L�����Cf�-E۵ȓ_�<|���.c �v���¯?Ԇ�Ϡ�J��>E���� /E
)z�cΪk�K���%�O��2ƛځ���1+�3����d�Ie�zT2���l8M`O�m�S�䫝��Ɍ�^k�~4���oJr������c�,oA��}�����G23�o��<'�J�=�ve�BI'��\@Ip�'�/�\7��}�Ҽ{�6�8�DF�'�y��`�lZk�=�-hp|?ӤQ@)���l��m�� 6�#��� 8��@p������ 8�����sn�!������ŷs��qt�����<��g��Ŷ�p��Gg��Ն�?�e4�d6���ߧ6‘#U8���n{n����ڒ��27w_O�{�c�Sms�E��0Sg^9�0�ArD�D�m�����oW:K�4�<bf}��!�~X�H�a�M
:7�慁��s�R�;�Ŝ�+�W*������T�qذ̖�b��E�)e�PRXU��f��RT�It�v�\��~�u��o��xx����
(o��{ц�f�G8���D(�]�d��~4�)������ɜۯ�J.r�ϐ!�d�s~�P?��"�D
%�P�������~)�\2Kl��]�8Tpuš�>�˝g���Wn$#���~[J]�vl�Tp�(�Ҵ'�e�Zhg�N�R�\�̓!�Ė��Z�Ɂ/@>�}�V�1Z�A~b��j��g�Q�Lj���e��~��"���1gU�����ԏ�ܧhi�M�@h��
q�����U�	��K��N�+
�3���-c8Np����j�;�{+\_�g�[�h�5�$��e1�53�CϝƞYނ���U16/�df���yN�$�{���>��Ng����~Oh7ȯ4��s��Ҽ{�6�8�DF�'�y��`�lZk�=�-hp|?Ӥ�O����6Hd[!6�M�=F8@p��@p�� 8��� 8@p�@|��������j$�v]=��0��]��ŷG=t�\��pT�9x}��(���a$6�m�!8�&ۓ�
=�dh��("�L���E����T[jیn?��v�I���Li]p�q��ݮ
�͵�v��B�b�u-zlV�i�Q#\}g׭���\�v���3�>�u�m��v���G�K���}�]�=���%���g�>	��u���d�dc�Mn<�R@�|�U���ݽ�>�#�Q���y�3\(�ljYv�'�ocExyTV]�Zi��7�LJ>���Ef����җeLӶ����A�K�P�b�}](��bH�ʡ�t�$��W�Cj�
%!(�
�\�S�$c��V���@n%"�a�B�'��#�>g=J���F���^�3�Y���G�tfr�-���`���K�����>�7�;ͽ�����ߩm�G�,Kl���e��7��p���w�t��ܧhm���[]�����7��=[|
���v%�O��2��0Fhޢ������o��U��ڈ��{�����4h՗R]^��ˆ����n���l/�w�,�u�J��P2�e�Bts�֝���5�WMI�gI�g����~OhG]��3���J:�p��:��ZY�ԝ7:*]��.W�\�>5r��Ϭ*����
�O�T�&�'�#ky% 8��@p��� 8� 8@p@
|����G'G\�,��9bA�Y:[.�r8���>�[l�=�
#�Im8�i4�x��>��("��~YVVRmYd������LzlOfJ��sF�3[�~x{���
�-�A��٢L����F���r�r9SH�N�Y��:�6�O^;z��#�%B+�v}[��G�Vy��>�I���^p�2{I��V^ i��"��:0����{s}�G�\gK��g�P��Բ�0#N^ߢ��<�(�%f�c��K�1D�3Y(�dt��
��K_�1�M�^��'	.�BI���u�d�ٹPs�S@94™.��T@�JxH-^�$d�P���w��d,w��*28ȭ�GVm�33�-C��s�Y����Q�Dd���}h��Q#��ܻa�c�9��2{ۗdy�}�o�kw�{
�Q=�S�:�pY��>E���oV57`��w�t�:\z��-c 4?�+��>�P�f��b�O�0�֮$�)\���[t�V�������`7�j�XqaTpϚ�][ނ��R���}��q��-���y�"�;C��:H
%OZ(�G!��N��Z����$޳�п�3Y@Ip�'��.V��M|%�E8u�un�,P�N����S�E��C�|�9D�gVJ�Rڂ�'_*|ʎ쑵�t� 8��@p��� 8�,����<�����ĆҖg��Pp���Q�m�R�0�l\��u�{�B������WFS�p���m@�;��v�VF�U���~0]����-mF�pqf9�<��^4���
�5y��Yu⸿�,�\w���cF����l��f6
K��ɍO���Ϳ�b�H�v���Y�u_�]�Cp�Bɋ3��%���F
(�*�l�n=c̫ٔ�	�G����7H���3��-��+�*�yl�Ue�_�"�-�|8:�2��痾,�[��7=9Pp����>Q���J���5��m��x�����`�+�A�Bɇ~Td��Cw��)^���y���P ���@�P�����Y�-��I�*1�Ț���<j�3�{omy�Ap���m_��e�������i�mdc|9�S�:�pYf����%Y\�@h~���[澳��Kn���e���ouE|��ʿ�'�
bK��a�����S�2S�=���v����[�U�����4D0�`�s�o�q�����hs�7^8���d3����������3�6�iٗ��r���m��É���I��RAY(y�B�8�#`0�i]����lNf&�5�п�3Z@In�'�P���&���g����~Oh_@ٜ�;����6������U@95P�;~ff$�u3����C���̡F��:�G8�)��� 8�.����3���2�IEND�B`�components/com_slideshowck/extensions/mod_slideshowck/themes/default/images/camera-loader.gif000060400000022111152453623440027025 0ustar00GIF89a�dfd�����܌��|z|�����trt�����쬮�������lnl�����䔖����ljl�����䔒���������tvt�����촲�������!�NETSCAPE2.0!�,��'�#�%��lX�X4H�H�վi2��k�t(<��H��TX��`�'�S��"*�+*h%Cҳ<P�Gp@�G��ή�w*zjEp�)Tl?d�~�Z�/Z	��������������	���	E��N��k�@�O��O�a
��	z��ځ	N)T]�z.�Z��O
�0 �7o�0'�y`�JS��d�@��#�X(�M���DPx�1E!�,�dfd�����܌�����|z|������trt��������Ԅ��lnl�����䔖���Ԭ��ljl�����䔒���̄��������tvt��������܌������@�p8�d��H�sD:��� �&�K�I|&�3(>�0Ch�gq-O8[(���<�fyB�	j l
fT]n�D`�kv��C�g� ��N�e�e��E��o�Ne��O�����������el�u���`Go�̨e�`
i�
tfUд�_(ۮ�!BfuP昡�$�3<@|`����)S@	v&t[T���P(�a�%��AB�b�<�����B�!�,�dfd��������ܤ��|z|�����trt��Ĝ����쬮�������lnl��������䬪����ljl��������䤦���������tvt��Ĝ����촲����������pH,���cl9��qT��(,Ƅ�Za�#��Q��J�h�q�qBEt!wC�	�FjsU	ElghC��id��B�U"Bt��E�Ui^��x
R {��U��[U
�h��x����M!�D���iU`�cg	���Lt�Ʀm��˕U�F`�S@���*TpP��/�@a�EQ�=.8�8�
�`P���"�*X�J�*´c�I
>7F0x��
&!�,�dfd���������|z|��̤�����trt��Ĝ����섆���ܬ�����lnl������������ljl��������䄂���̤����tvt��Ĝ����쌊�����������@�pH,hTlG�����8x�j��l����iD
����>#V�����"|By	�ErT	\TfgD��$#T��M�!Q$���`
Q#T��#| y�����ET
���"Š

	 ���$��MU�R��D#T�Cc�ݜ�L�y����H`�R��]�UiP$�~���@�'"�\h Q!2Z#�B�@�M�U� Q`�9��d�kQ�o�֜`AA�ł!�,�dfd���������|z|��̤�����trt��Ĝ����섆���ܬ�����lnl��������䄂����ljl���������|~|��̤����tvt��Ĝ����쌊�������������pH�0� �Т`PEg���<�jX�ٖH�H�j��-�"UB�]Y�{Bb!fgia	EVe�Ba�g��D���E!D$V���b�f���QV
�[�#�P~��B""	�BV��BV"�DU��g��%��GU����V�%^�q�2<@`ߤ�(�����HhŜ�b`hQ	KD$� #A6\�…�BP�C�Ó'=(P��n&\P ���[�!�,�dfd���������|z|��̤�����trt��Ĝ����섆���Ԭ�����lnl��������䄂����ljl���������|~|��̤����tvt��Ĝ����쌊���ܴ���������@�pHv0�������$X-�h�z���uM��B��$H
�8��K	��-U�X|`b#_B�kDV�Cv%W���EW��^%V��E!��_���CV
�}�$�D"U��C�X��V	�BV"��BX��B%V�Bb�䝭����wg�r�Ɓa�@�J�e9D$�������NFFD4Q�°\x4a��C>���#�S��,##b#�.(A�����!�,�dfd���������|z|��̤����trt��Ĝ����섆���ܬ��lnl��������䄂������ljl���������|~|��̤�����tvt��Ĝ����쌊��������@�pH$�8C�I�*ŨT�!,V��N���u<��2�J'�	$#�l�x�H�>�PDe|B`CsEW
�D
kDWh���	��W��E!Y�`W��$��E �#�Db"���B�Y�х��BW"�����W��C��񝫹��W���6)�`@�+X,4����dx�B�X�DRA��\`@��
r`c�	d���l���V�� �
�P`L!�,�dfd���������|z|���������trt��Ĝ����섆���������lnl��������䄂�������ljl���������|~|��������tvt��Ĝ����쌊�����������@�pH<�8�C��JĨ�8��׬��z�$�x,��&_��@J$H
��FK��de!S"z{yR
v��{b��e	�z%b��Q"X�^" b��$b
�R��$�Qb#~��CWV��&���&�#V�&W
	��%b��c��%W��BX��rPx0��O%B\q0�@�d5D�aʂ�28�E����!P B�*4���1X{`���+hfN��`k
0,�!�,�dfd�����܌��|z|������trt�����윚���������lnl�����䔖������Դ��ljl�����䔒�|~|�����tvt�����윞�������������p8$�>���1�|$�t:�XW,@;�D�`RfK&_-"l�,*�De�([�<�Da+`_zBx`��%bX�zd	�k$["��{FY�D
[��$~[�D���C����%[WĿ����	�W�ź��[
" �Z$��cބŖ��DW�#k0x��'L�+F��Pψ,[��a��2	`P��
��ՑLS"\X ��ح	!�,�dfd�����܌��|z|������trt�����윚���������lnl�����䔖������Դ��ljl�����䔒�|~|�����tvt�����윞���������������p8$�>���1�$@$�t*d,lvkm�T�(��eQ$LX�J"QY��[&:(" {�S${k��%$��i��R #�e}�%� X�C e
e��$ee�De!��Ci"e	�BeX��X���iX�˾	e����
�
�#[$"
�$�Q#z����C�0����0�C�
��4I��2��a�lj���3Z�kD��ɓf&�;����Xp� !�,�dfd���������|z|��̤�������Ą��trt�����ܴ�������������Ԭ��ljl������|~|��̤�������Č��tvt��윞������'�c�i��%�t)�_	��]1��(��	B8�4t�G�h<EI�I�P"�f����0T�����u�(�BMPt�GE&9"FE
unEE�#�|s�"xEK��	9��9�
��9���E�j�<�;�ƙ��a�Z�N�e�ݴ����L^E�tiDH<E;�fV�3A�74*Px���
(T8(#!�,�dfd�����܌��|z|������trt�����윚���������lnl�����䔖������Դ��ljl�����䔒�|~|�����tvt�����윞���������������p8$�>���1�|@$�tZ"Q2@V˵�FTjd(��eD$<���E%��,��j`�
S$
{a����l
��"���R$eU�D$d"FY��%#fiQ�Uoe�C���Be""e	�%eY�����ĸ��Y	Z��$�
[�[$�^�#Q���
zU"<�H&�#��H�[d`a����6l�p�Mk��ef@)�
�		�)ta��\� SJ!�,�dfd�����܌��|z|������trt�����윚���������lnl�����䔖������Դ��ljl�����䔒�|~|�����tvt�����윞���������������p8$�>���1�|$�tZ"Q@V��`ŀ�-�E�t�0#�D�����S�%+*��C#	�U#��%	��YQ�`e_V��B$Xh �C
e]��$]]�C�c�B]""Z	�%�]ž�"Y������Y	Z��$�
e� �|�~�]�C�
�C���ҠP +���…xj8�8a�bm闈�3[�LH��������pa��\p�&!�,�dfd���������|z|���������trt��Ĝ����섆���������lnl��������䄂����ljl���������|~|��������tvt��Ĝ����쌊�������������@�p8,�>��!�$ĨTXr`,lv��zM`L.W�Ғ��"�DbT蠣Ydx܅%^!
	~&_%P�&%Y]�hz��_c��c"�R$Z#v�Tcc�C� b#�B�"Y	�&�c��cX��Y"�
�c
	c��m�&!%�"��m��&�!�$/��tHH$���xA0J	KwJ05��HD�!†[[,\`�%-[�
��L
�H���@
"\�RH!�,�dfd���������|z|��̤����trt��Ĝ����섆���ܬ��lnl��������䄂������ljl���������|~|��̤�����tvt��Ĝ����쌊��������@�p8��>��!�,��h�"��W��#�
%�,`L�x���@(F�Ĉ=T�	��B�V@wPc	}gV	h
gP W���$c��gd���"��R
d!��Ec��Pc
a�Dc""c��Bc����#�$yV
�
���Y�Eȩ��V�B��$�WJ-�!�1
2U���B�Q*� +�TcF�qP�
 �2t�A/H����U
dbN�5k��Pp!C�!A!�,�dfd���������|z|������trt�����섆������������lnl�����䄂�ljl���������|~|�����tvt�����쌊����������������@�p8y:�g!0�P��!��׉(�J��k8��rE�`�	
���BE����0�vDX	}f$ceO	l�^V�O"!��Ba��]c��"`��\!c�]"a��Ca��$aa�C����
a�#�B	�W�C	a��
X
�E�����B"�������-O
pMh�h�U
B��{EX�͞��8h�!�\b(T��G,�b�&�D�|���A�Ş!�,�dfd���������|z|��̤�����trt��Ĝ����섆���ܬ�����lnl��������䄂����ljl���������|~|��̤����tvt��Ĝ����쌊�������������p8$�>�H� :�NRE`T�ֹX`k⹘lK�$@(F���a������"*4�$V#wN{	[acDkmgDV�C��N��C!�Oa��$`"��ZWf�[$`�g`
��N�
�ȭ`��B	T#�O�
�O	V��a�D$�"��`u��"`�`-�A��X�p�̂_V8A��3RHeDu��
3�	,�!��_
-\�Gd�&"������+`(|0	��\�@SH!�,�dfd���������|z|��̤�����trt��Ĝ����섆���Ԭ�����lnl���������ljl��������䄂���̤����tvt��Ĝ����쌊���Դ���������@�p8}:���l:G
0]2#gs"x��f4�
G�t�P�>M
��m�T/��0c�uD_	}f$`Lj�D��g���C�^u	
a�L�^L#���z��N!S��#^��^V�Nz�Z��N]�q��L	S���
�E� ⠱Lk�
҉ ^e���H\X�a����A�uE� V�/ ��鋈uw�4��@�5:��@!C^0,�@�9�0 ꦀ��
 �!�,�dfd��������ܤ��|z|�����trt��Ĝ����쬮�������lnl��������䬪����ljl��������䤦���������tvt��Ĝ����촲����������p8�<��l:9AP!4%���)P`H3I�B��1#�f\�h�r[D9l3m!wC`T	~hm	\lqhDT�#t��C`
Z���M�`B

��i�e�i�N���`¢`
Ȗ���M��Ls��Dz����ERe�	�t�m�#"`g���a�):d��Lȸ1Ю����	p@�-�2�]�6߈,�Pa�`� ��:`4@d�h@�	�4$JB���!�,�dfd�����܌�����|z|������trt��������Ԅ��lnl�����䔖���Ԭ��ljl�����䔒���̄��������tvt��������܌������@�p8�t8�0�Q:���e�8	�K�|`�I�%�A�".NMx��BT3�N�|y|By	i �`�]
`�D��K��J`[�	�WaI_���	�Oy
���b���������\�D	���
a�{�T�³� �ͥ`� 
h�
��B*�٠ϓbva�`��(���� �d0�n��Tq�S�	��@E�1(�d��eD*�Bd�@"(TP;components/com_slideshowck/extensions/mod_slideshowck/themes/default/images/patterns/index.html000060400000000037152453623440027502 0ustar00<!DOCTYPE html><title></title>
components/com_slideshowck/extensions/mod_slideshowck/themes/default/images/patterns/overlay8.png000060400000001664152453623440027773 0ustar00�PNG


IHDR�o&�tEXtSoftwareAdobe ImageReadyq�e< iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Windows" xmpMM:InstanceID="xmp.iid:7C4BE2E162AF11E090CDA44F81491F78" xmpMM:DocumentID="xmp.did:7C4BE2E262AF11E090CDA44F81491F78"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:7C4BE2DF62AF11E090CDA44F81491F78" stRef:documentID="xmp.did:7C4BE2E062AF11E090CDA44F81491F78"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>a��*IDATx�b���?2`dd�τ.�L�`T�d��`D�`�O����-IEND�B`�components/com_slideshowck/extensions/mod_slideshowck/themes/default/images/patterns/overlay1.png000060400000001651152453623440027760 0ustar00�PNG


IHDRV(��tEXtSoftwareAdobe ImageReadyq�e< iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Windows" xmpMM:InstanceID="xmp.iid:6781A6AC62A711E09891BFF925EF25D9" xmpMM:DocumentID="xmp.did:6781A6AD62A711E09891BFF925EF25D9"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:6781A6AA62A711E09891BFF925EF25D9" stRef:documentID="xmp.did:6781A6AB62A711E09891BFF925EF25D9"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>F�{�IDATx�bb``� ��	H0���ĀE�Ǝ�IEND�B`�components/com_slideshowck/extensions/mod_slideshowck/themes/default/images/patterns/overlay6.png000060400000001677152453623440027775 0ustar00�PNG


IHDR���HtEXtSoftwareAdobe ImageReadyq�e< iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Windows" xmpMM:InstanceID="xmp.iid:CFC55F8662AB11E0BAB9B38802E1DA96" xmpMM:DocumentID="xmp.did:CFC55F8762AB11E0BAB9B38802E1DA96"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:CFC55F8462AB11E0BAB9B38802E1DA96" stRef:documentID="xmp.did:CFC55F8562AB11E0BAB9B38802E1DA96"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�)5IDATx�bd``��h�	$���|�Cu�iF(�f,� �Xd�����0�(��IEND�B`�components/com_slideshowck/extensions/mod_slideshowck/themes/default/images/patterns/overlay10.png000060400000001633152453623440030040 0ustar00�PNG


IHDR��~tEXtSoftwareAdobe ImageReadyq�e< iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Windows" xmpMM:InstanceID="xmp.iid:A3D9965462AF11E0B0B1CD11AC9ABB59" xmpMM:DocumentID="xmp.did:A3D9965562AF11E0B0B1CD11AC9ABB59"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:A3D9965262AF11E0B0B1CD11AC9ABB59" stRef:documentID="xmp.did:A3D9965362AF11E0B0B1CD11AC9ABB59"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>FୢIDATx�b`@������@΀�IEND�B`�components/com_slideshowck/extensions/mod_slideshowck/themes/default/images/patterns/overlay7.png000060400000000141152453623440027757 0ustar00�PNG


IHDR
��(IDAT�cd``���?0���������#� ��$#�~FFF���N�ZIEND�B`�components/com_slideshowck/extensions/mod_slideshowck/themes/default/images/patterns/overlay9.png000060400000001636152453623440027773 0ustar00�PNG


IHDR��~tEXtSoftwareAdobe ImageReadyq�e< iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Windows" xmpMM:InstanceID="xmp.iid:9C7C8FAA62AF11E0A442A91720A37A42" xmpMM:DocumentID="xmp.did:9C7C8FAB62AF11E0A442A91720A37A42"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:9C7C8FA862AF11E0A442A91720A37A42" stRef:documentID="xmp.did:9C7C8FA962AF11E0A442A91720A37A42"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�uIDATx�b```�π� `����D�IEND�B`�components/com_slideshowck/extensions/mod_slideshowck/themes/default/images/patterns/overlay3.png000060400000001652152453623440027763 0ustar00�PNG


IHDR��~tEXtSoftwareAdobe ImageReadyq�e< iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Windows" xmpMM:InstanceID="xmp.iid:06045F6762A811E0AC81AFB0068E41D1" xmpMM:DocumentID="xmp.did:06045F6862A811E0AC81AFB0068E41D1"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:06045F6562A811E0AC81AFB0068E41D1" stRef:documentID="xmp.did:06045F6662A811E0AC81AFB0068E41D1"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�F IDATx�bd``�πX@���a�>�g}�M���IEND�B`�components/com_slideshowck/extensions/mod_slideshowck/themes/default/images/patterns/overlay4.png000060400000001634152453623440027764 0ustar00�PNG


IHDR�"�tEXtSoftwareAdobe ImageReadyq�e< iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Windows" xmpMM:InstanceID="xmp.iid:2D63D63C62A811E0B19D94A0A3B33548" xmpMM:DocumentID="xmp.did:2D63D63D62A811E0B19D94A0A3B33548"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:2D63D63A62A811E0B19D94A0A3B33548" stRef:documentID="xmp.did:2D63D63B62A811E0B19D94A0A3B33548"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>`�l�IDATx�b```�
��B��TIEND�B`�components/com_slideshowck/extensions/mod_slideshowck/themes/default/images/patterns/overlay5.png000060400000001634152453623440027765 0ustar00�PNG


IHDR���'tEXtSoftwareAdobe ImageReadyq�e< iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Windows" xmpMM:InstanceID="xmp.iid:449474A662A811E0A6F2A19E4202FC36" xmpMM:DocumentID="xmp.did:449474A762A811E0A6F2A19E4202FC36"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:449474A462A811E0A6F2A19E4202FC36" stRef:documentID="xmp.did:449474A562A811E0A6F2A19E4202FC36"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>Z�2IDATx�b���?�0���bd�IEND�B`�components/com_slideshowck/extensions/mod_slideshowck/themes/default/images/patterns/overlay2.png000060400000001647152453623440027766 0ustar00�PNG


IHDRV(��tEXtSoftwareAdobe ImageReadyq�e< iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Windows" xmpMM:InstanceID="xmp.iid:9168200662A711E0B655C8AD65EBB9E8" xmpMM:DocumentID="xmp.did:9168200762A711E0B655C8AD65EBB9E8"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:9168200462A711E0B655C8AD65EBB9E8" stRef:documentID="xmp.did:9168200562A711E0B655C8AD65EBB9E8"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�Y��IDATx�bb``� ��	H02@0$�	��;��IEND�B`�components/com_slideshowck/extensions/mod_slideshowck/themes/default/css/camera.css000060400000063302152453623440025136 0ustar00/*** compatibilite beez en position-12 ***/
#top {overflow: visible !important; }


/**************************
*
*	GENERAL
*
**************************/
.camera_wrap a.camera-link,.camera_wrap a.camera-link:hover {
	background: url(../images/blank.gif) !important;
}

.camera_wrap a.camera-button {
	display: inline-block;
}

.camera_wrap a,.camera_wrap a:hover, .camera_wrap img,
.camera_wrap ol, .camera_wrap ul, .camera_wrap li,
.camera_wrap table, .camera_wrap tbody, .camera_wrap tfoot, .camera_wrap thead, .camera_wrap tr, .camera_wrap th, .camera_wrap td
.camera_thumbs_wrap a, .camera_thumbs_wrap img,
.camera_thumbs_wrap ol, .camera_thumbs_wrap ul, .camera_thumbs_wrap li,
.camera_thumbs_wrap table, .camera_thumbs_wrap tbody, .camera_thumbs_wrap tfoot, .camera_thumbs_wrap thead, .camera_thumbs_wrap tr, .camera_thumbs_wrap th, .camera_thumbs_wrap td {
	background: none;
	border: 0;
	font: inherit;
	font-size: 100%;
	margin: 0;
	padding: 0;
	vertical-align: baseline;
	list-style: none
}
.camera_wrap {
	display: none;
	/*float: left;*/
	position: relative;
	z-index: 0;
	max-width: 100%;
	box-sizing: content-box;
}
.camera_wrap img {
	max-width: none!important;
}
.camera_fakehover {
	height: 100%;
	min-height: 60px;
	position: relative;
	width: 100%;
	z-index: 1;
}
.camera_wrap {
	/*width: 100%;*/
}
.camera_src {
	display: none;
}
.cameraCont, .cameraContents {
	height: 100%;
	position: relative;
	width: 100%;
	z-index: 1;
}
.cameraSlide {
	bottom: 0;
	left: 0;
	position: absolute;
	right: 0;
	top: 0;
	width: 100%;
}
.cameraContent {
	bottom: 0;
	display: none;
	left: 0;
	position: absolute;
	right: 0;
	top: 0;
	width: 100%;
}
.cameraContent video {
	background: #000;
	height:100%;
}
.camera_target {
	bottom: 0;
	height: 100%;
	left: 0;
	overflow: hidden;
	position: absolute;
	right: 0;
	text-align: left;
	top: 0;
	width: 100%;
	z-index: 0;
}
.camera_overlayer {
	bottom: 0;
	height: 100%;
	left: 0;
	overflow: hidden;
	position: absolute;
	right: 0;
	top: 0;
	width: 100%;
	z-index: 0;
}
.camera_target_content {
	bottom: 0;
	left: 0;
	overflow: hidden;
	position: absolute;
	right: 0;
	top: 0;
	z-index: 2;
}
.camera_target_content .camera_link {
	display: block;
	height: 100%;
	text-decoration: none;
        background: url(../images/blank.gif) !important;
}
.camera_loader {
    background: #fff url(../images/camera-loader.gif) no-repeat center;
	background: rgba(255, 255, 255, 0.9) url(../images/camera-loader.gif) no-repeat center;
	border: 1px solid #ffffff;
	-webkit-border-radius: 18px;
	-moz-border-radius: 18px;
	border-radius: 18px;
	height: 36px;
	left: 50%;
	overflow: hidden;
	position: absolute;
	margin: -18px 0 0 -18px;
	top: 50%;
	width: 36px;
	z-index: 3;
}
.camera_bar {
	bottom: 0;
	left: 0;
	overflow: hidden;
	position: absolute;
	right: 0;
	top: 0;
	z-index: 3;
}
.camera_thumbs_wrap.camera_left .camera_bar, .camera_thumbs_wrap.camera_right .camera_bar {
	height: 100%;
	position: absolute;
	width: auto;
}
.camera_thumbs_wrap.camera_bottom .camera_bar, .camera_thumbs_wrap.camera_top .camera_bar {
	height: auto;
	position: absolute;
	width: 100%;
}
.camera_nav_cont {
	height: 65px;
	overflow: hidden;
	position: absolute;
	right: 9px;
	top: 15px;
	width: 120px;
	z-index: 4;
}
.camera_caption {
	bottom: 0;
	display: block;
	position: absolute;
	width: 100%;
	z-index: 1000;
}
.camera_caption > div {
	padding: 10px 20px;
	height:100%;
}
.camera_caption_title {
	font-size: 1.3em;
	font-weight: bold;
	line-height: 1em;
}
.camerarelative {
	overflow: hidden;
	position: relative;
}
.imgFake {
	cursor: pointer;
}
.camera_prevThumbs {
	bottom: 4px;
	cursor: pointer;
	left: 0;
	position: absolute;
	top: 4px;
	/*visibility: hidden;*/
	width: 30px;
	z-index: 10;
}
.camera_prevThumbs div {
	background: url(../images/camera_skins.png) no-repeat -160px 0;
	display: block;
	height: 40px;
	margin-top: -20px;
	position: absolute;
	top: 50%;
	width: 30px;
}
.camera_nextThumbs {
	bottom: 4px;
	cursor: pointer;
	position: absolute;
	right: 0;
	top: 4px;
	visibility: hidden;
	width: 30px;
	z-index: 10;
}
.camera_nextThumbs div {
	background: url(../images/camera_skins.png) no-repeat -190px 0;
	display: block;
	height: 40px;
	margin-top: -20px;
	position: absolute;
	top: 50%;
	width: 30px;
}
.camera_command_wrap .hideNav {
	display: none;
}
.camera_command_wrap {
	left: 0;
	position: relative;
	right:0;
	z-index: 4;
}
.camera_wrap .camera_pag .camera_pag_ul {
	list-style: none;
	margin: 0;
	padding: 0;
	text-align: right;
	height: auto !important;
	height: 28px;
}
.camera_wrap .camera_pag .camera_pag_ul li {
	-webkit-border-radius: 8px;
	-moz-border-radius: 8px;
	border-radius: 8px;
	cursor: pointer;
	display: inline-block;
        float: none !important;
        float:left;/*overflow:hidden;*/
	height: 16px;
	margin: 20px 5px;
	position: relative;
	/*text-align: left;*/
	text-indent: 9999px;
	width: 16px;
	overflow: visible !important;
	padding: 0;
}

.camera_commands_emboss .camera_pag .camera_pag_ul li {
	-moz-box-shadow:
		0px 1px 0px rgba(255,255,255,1),
		inset 0px 1px 1px rgba(0,0,0,0.2);
	-webkit-box-shadow:
		0px 1px 0px rgba(255,255,255,1),
		inset 0px 1px 1px rgba(0,0,0,0.2);
	box-shadow:
		0px 1px 0px rgba(255,255,255,1),
		inset 0px 1px 1px rgba(0,0,0,0.2);
}
.camera_wrap .camera_pag .camera_pag_ul li > span {
	-webkit-border-radius: 5px;
	-moz-border-radius: 5px;
	border-radius: 5px;
	height: 8px;
	left: 4px;
	overflow: hidden;
	position: absolute;
	top: 4px;
	width: 8px;
}
.camera_commands_emboss .camera_pag .camera_pag_ul li:hover > span {
	-moz-box-shadow:
		0px 1px 0px rgba(255,255,255,1),
		inset 0px 1px 1px rgba(0,0,0,0.2);
	-webkit-box-shadow:
		0px 1px 0px rgba(255,255,255,1),
		inset 0px 1px 1px rgba(0,0,0,0.2);
	box-shadow:
		0px 1px 0px rgba(255,255,255,1),
		inset 0px 1px 1px rgba(0,0,0,0.2);
}
.camera_wrap .camera_pag .camera_pag_ul li.cameracurrent > span {
	-moz-box-shadow: none;
	-webkit-box-shadow: none;
	box-shadow: none;
}
.camera_pag_ul li img {
	display: none;
	position: absolute;
	box-sizing: border-box;
}
.camera_pag_ul .thumb_arrow {
	border-left: 4px solid transparent;
	border-right: 4px solid transparent;
	border-top: 4px solid;
	top: 0;
	left: 50%;
	margin-left: -4px;
	position: absolute;
}
.camera_prev, .camera_next, .camera_commands {
	cursor: pointer;
	height: 40px;
	margin-top: -20px;
	position: absolute;
	top: 50%;
	width: 40px;
	z-index: 2;
}
.camera_prev {
	left: 0;
}
.camera_prev > span {
	background: url(../images/camera_skins.png) no-repeat 0 0;
	display: block;
	height: 40px;
	width: 40px;
}
.camera_next {
	right: 0;
}
.camera_next > span {
	background: url(../images/camera_skins.png) no-repeat -40px 0;
	display: block;
	height: 40px;
	width: 40px;
}
.camera_commands {
	right: 41px;
}
.camera_commands > .camera_play {
	background: url(../images/camera_skins.png) no-repeat -80px 0;
	height: 40px;
	width: 40px;
}
.camera_commands > .camera_stop {
	background: url(../images/camera_skins.png) no-repeat -120px 0;
	display: block;
	height: 40px;
	width: 40px;
}

.camera_thumbs_cont {
	-webkit-border-bottom-right-radius: 4px;
	-webkit-border-bottom-left-radius: 4px;
	-moz-border-radius-bottomright: 4px;
	-moz-border-radius-bottomleft: 4px;
	border-bottom-right-radius: 4px;
	border-bottom-left-radius: 4px;
	overflow: hidden;
	position: relative;
	width: 100%;
}
.camera_commands_emboss .camera_thumbs_cont {
	-moz-box-shadow:
		0px 1px 0px rgba(255,255,255,1),
		inset 0px 1px 1px rgba(0,0,0,0.2);
	-webkit-box-shadow:
		0px 1px 0px rgba(255,255,255,1),
		inset 0px 1px 1px rgba(0,0,0,0.2);
	box-shadow:
		0px 1px 0px rgba(255,255,255,1),
		inset 0px 1px 1px rgba(0,0,0,0.2);
}
.camera_thumbs_cont > div {
	float: left;
	width: 100%;
}
.camera_thumbs_cont ul {
	overflow: hidden;
	padding: 3px 4px 8px;
	position: relative;
	text-align: center;
}
.camera_thumbs_cont ul li {
	display: inline-block;
	margin: 0 4px;
}
.camera_thumbs_cont ul li > img {
	border: 1px solid #000;
	cursor: pointer;
	margin-top: 5px;
	vertical-align:bottom;
}
.camera_clear {
	display: block;
	clear: both;
}
.showIt {
	display: none;
}
.camera_clear {
	clear: both;
	display: block;
	height: 1px;
	margin: -1px 0 25px;
	position: relative;
}

.camera_caption {
	color: #fff;
}
.camera_caption > div {
	background: #000;
	background: rgba(0, 0, 0, 0.8);
}
.camera_wrap .camera_pag .camera_pag_ul li {
	background: #b7b7b7;
}
.camera_wrap .camera_pag .camera_pag_ul li:hover > span {
	background: #b7b7b7;
}
.camera_wrap .camera_pag .camera_pag_ul li.cameracurrent > span {
	background: #434648;
}
.camera_pag_ul li img {
	border: 4px solid #e6e6e6;
	-moz-box-shadow: 0px 3px 6px rgba(0,0,0,.5);
	-webkit-box-shadow: 0px 3px 6px rgba(0,0,0,.5);
	box-shadow: 0px 3px 6px rgba(0,0,0,.5);
}
.camera_pag_ul .thumb_arrow {
    border-top-color: #e6e6e6;
}
.camera_prevThumbs, .camera_nextThumbs, .camera_prev, .camera_next, .camera_commands, .camera_thumbs_cont {
	background: #d8d8d8;
	background: rgba(216, 216, 216, 0.85);
}
.camera_wrap .camera_pag .camera_pag_ul li {
	background: #b7b7b7;
}
.camera_thumbs_cont ul li > img {
	border-color: 1px solid #000;
}
/*AMBER SKIN*/
.camera_amber_skin .camera_prevThumbs div {
	background-position: -160px -160px;
}
.camera_amber_skin .camera_nextThumbs div {
	background-position: -190px -160px;
}
.camera_amber_skin .camera_prev > span {
	background-position: 0 -160px;
}
.camera_amber_skin .camera_next > span {
	background-position: -40px -160px;
}
.camera_amber_skin .camera_commands > .camera_play {
	background-position: -80px -160px;
}
.camera_amber_skin .camera_commands > .camera_stop {
	background-position: -120px -160px;
}
/*ASH SKIN*/
.camera_ash_skin .camera_prevThumbs div {
	background-position: -160px -200px;
}
.camera_ash_skin .camera_nextThumbs div {
	background-position: -190px -200px;
}
.camera_ash_skin .camera_prev > span {
	background-position: 0 -200px;
}
.camera_ash_skin .camera_next > span {
	background-position: -40px -200px;
}
.camera_ash_skin .camera_commands > .camera_play {
	background-position: -80px -200px;
}
.camera_ash_skin .camera_commands > .camera_stop {
	background-position: -120px -200px;
}
/*AZURE SKIN*/
.camera_azure_skin .camera_prevThumbs div {
	background-position: -160px -240px;
}
.camera_azure_skin .camera_nextThumbs div {
	background-position: -190px -240px;
}
.camera_azure_skin .camera_prev > span {
	background-position: 0 -240px;
}
.camera_azure_skin .camera_next > span {
	background-position: -40px -240px;
}
.camera_azure_skin .camera_commands > .camera_play {
	background-position: -80px -240px;
}
.camera_azure_skin .camera_commands > .camera_stop {
	background-position: -120px -240px;
}
/*BEIGE SKIN*/
.camera_beige_skin .camera_prevThumbs div {
	background-position: -160px -120px;
}
.camera_beige_skin .camera_nextThumbs div {
	background-position: -190px -120px;
}
.camera_beige_skin .camera_prev > span {
	background-position: 0 -120px;
}
.camera_beige_skin .camera_next > span {
	background-position: -40px -120px;
}
.camera_beige_skin .camera_commands > .camera_play {
	background-position: -80px -120px;
}
.camera_beige_skin .camera_commands > .camera_stop {
	background-position: -120px -120px;
}
/*BLACK SKIN*/
.camera_black_skin .camera_prevThumbs div {
	background-position: -160px -40px;
}
.camera_black_skin .camera_nextThumbs div {
	background-position: -190px -40px;
}
.camera_black_skin .camera_prev > span {
	background-position: 0 -40px;
}
.camera_black_skin .camera_next > span {
	background-position: -40px -40px;
}
.camera_black_skin .camera_commands > .camera_play {
	background-position: -80px -40px;
}
.camera_black_skin .camera_commands > .camera_stop {
	background-position: -120px -40px;
}
/*BLUE SKIN*/
.camera_blue_skin .camera_prevThumbs div {
	background-position: -160px -280px;
}
.camera_blue_skin .camera_nextThumbs div {
	background-position: -190px -280px;
}
.camera_blue_skin .camera_prev > span {
	background-position: 0 -280px;
}
.camera_blue_skin .camera_next > span {
	background-position: -40px -280px;
}
.camera_blue_skin .camera_commands > .camera_play {
	background-position: -80px -280px;
}
.camera_blue_skin .camera_commands > .camera_stop {
	background-position: -120px -280px;
}
/*BROWN SKIN*/
.camera_brown_skin .camera_prevThumbs div {
	background-position: -160px -320px;
}
.camera_brown_skin .camera_nextThumbs div {
	background-position: -190px -320px;
}
.camera_brown_skin .camera_prev > span {
	background-position: 0 -320px;
}
.camera_brown_skin .camera_next > span {
	background-position: -40px -320px;
}
.camera_brown_skin .camera_commands > .camera_play {
	background-position: -80px -320px;
}
.camera_brown_skin .camera_commands > .camera_stop {
	background-position: -120px -320px;
}
/*BURGUNDY SKIN*/
.camera_burgundy_skin .camera_prevThumbs div {
	background-position: -160px -360px;
}
.camera_burgundy_skin .camera_nextThumbs div {
	background-position: -190px -360px;
}
.camera_burgundy_skin .camera_prev > span {
	background-position: 0 -360px;
}
.camera_burgundy_skin .camera_next > span {
	background-position: -40px -360px;
}
.camera_burgundy_skin .camera_commands > .camera_play {
	background-position: -80px -360px;
}
.camera_burgundy_skin .camera_commands > .camera_stop {
	background-position: -120px -360px;
}
/*CHARCOAL SKIN*/
.camera_charcoal_skin .camera_prevThumbs div {
	background-position: -160px -400px;
}
.camera_charcoal_skin .camera_nextThumbs div {
	background-position: -190px -400px;
}
.camera_charcoal_skin .camera_prev > span {
	background-position: 0 -400px;
}
.camera_charcoal_skin .camera_next > span {
	background-position: -40px -400px;
}
.camera_charcoal_skin .camera_commands > .camera_play {
	background-position: -80px -400px;
}
.camera_charcoal_skin .camera_commands > .camera_stop {
	background-position: -120px -400px;
}
/*CHOCOLATE SKIN*/
.camera_chocolate_skin .camera_prevThumbs div {
	background-position: -160px -440px;
}
.camera_chocolate_skin .camera_nextThumbs div {
	background-position: -190px -440px;
}
.camera_chocolate_skin .camera_prev > span {
	background-position: 0 -440px;
}
.camera_chocolate_skin .camera_next > span {
	background-position: -40px -440px;
}
.camera_chocolate_skin .camera_commands > .camera_play {
	background-position: -80px -440px;
}
.camera_chocolate_skin .camera_commands > .camera_stop {
	background-position: -120px -440px	;
}
/*COFFEE SKIN*/
.camera_coffee_skin .camera_prevThumbs div {
	background-position: -160px -480px;
}
.camera_coffee_skin .camera_nextThumbs div {
	background-position: -190px -480px;
}
.camera_coffee_skin .camera_prev > span {
	background-position: 0 -480px;
}
.camera_coffee_skin .camera_next > span {
	background-position: -40px -480px;
}
.camera_coffee_skin .camera_commands > .camera_play {
	background-position: -80px -480px;
}
.camera_coffee_skin .camera_commands > .camera_stop {
	background-position: -120px -480px	;
}
/*CYAN SKIN*/
.camera_cyan_skin .camera_prevThumbs div {
	background-position: -160px -520px;
}
.camera_cyan_skin .camera_nextThumbs div {
	background-position: -190px -520px;
}
.camera_cyan_skin .camera_prev > span {
	background-position: 0 -520px;
}
.camera_cyan_skin .camera_next > span {
	background-position: -40px -520px;
}
.camera_cyan_skin .camera_commands > .camera_play {
	background-position: -80px -520px;
}
.camera_cyan_skin .camera_commands > .camera_stop {
	background-position: -120px -520px	;
}
/*FUCHSIA SKIN*/
.camera_fuchsia_skin .camera_prevThumbs div {
	background-position: -160px -560px;
}
.camera_fuchsia_skin .camera_nextThumbs div {
	background-position: -190px -560px;
}
.camera_fuchsia_skin .camera_prev > span {
	background-position: 0 -560px;
}
.camera_fuchsia_skin .camera_next > span {
	background-position: -40px -560px;
}
.camera_fuchsia_skin .camera_commands > .camera_play {
	background-position: -80px -560px;
}
.camera_fuchsia_skin .camera_commands > .camera_stop {
	background-position: -120px -560px	;
}
/*GOLD SKIN*/
.camera_gold_skin .camera_prevThumbs div {
	background-position: -160px -600px;
}
.camera_gold_skin .camera_nextThumbs div {
	background-position: -190px -600px;
}
.camera_gold_skin .camera_prev > span {
	background-position: 0 -600px;
}
.camera_gold_skin .camera_next > span {
	background-position: -40px -600px;
}
.camera_gold_skin .camera_commands > .camera_play {
	background-position: -80px -600px;
}
.camera_gold_skin .camera_commands > .camera_stop {
	background-position: -120px -600px	;
}
/*GREEN SKIN*/
.camera_green_skin .camera_prevThumbs div {
	background-position: -160px -640px;
}
.camera_green_skin .camera_nextThumbs div {
	background-position: -190px -640px;
}
.camera_green_skin .camera_prev > span {
	background-position: 0 -640px;
}
.camera_green_skin .camera_next > span {
	background-position: -40px -640px;
}
.camera_green_skin .camera_commands > .camera_play {
	background-position: -80px -640px;
}
.camera_green_skin .camera_commands > .camera_stop {
	background-position: -120px -640px	;
}
/*GREY SKIN*/
.camera_grey_skin .camera_prevThumbs div {
	background-position: -160px -680px;
}
.camera_grey_skin .camera_nextThumbs div {
	background-position: -190px -680px;
}
.camera_grey_skin .camera_prev > span {
	background-position: 0 -680px;
}
.camera_grey_skin .camera_next > span {
	background-position: -40px -680px;
}
.camera_grey_skin .camera_commands > .camera_play {
	background-position: -80px -680px;
}
.camera_grey_skin .camera_commands > .camera_stop {
	background-position: -120px -680px	;
}
/*INDIGO SKIN*/
.camera_indigo_skin .camera_prevThumbs div {
	background-position: -160px -720px;
}
.camera_indigo_skin .camera_nextThumbs div {
	background-position: -190px -720px;
}
.camera_indigo_skin .camera_prev > span {
	background-position: 0 -720px;
}
.camera_indigo_skin .camera_next > span {
	background-position: -40px -720px;
}
.camera_indigo_skin .camera_commands > .camera_play {
	background-position: -80px -720px;
}
.camera_indigo_skin .camera_commands > .camera_stop {
	background-position: -120px -720px	;
}
/*KHAKI SKIN*/
.camera_khaki_skin .camera_prevThumbs div {
	background-position: -160px -760px;
}
.camera_khaki_skin .camera_nextThumbs div {
	background-position: -190px -760px;
}
.camera_khaki_skin .camera_prev > span {
	background-position: 0 -760px;
}
.camera_khaki_skin .camera_next > span {
	background-position: -40px -760px;
}
.camera_khaki_skin .camera_commands > .camera_play {
	background-position: -80px -760px;
}
.camera_khaki_skin .camera_commands > .camera_stop {
	background-position: -120px -760px	;
}
/*LIME SKIN*/
.camera_lime_skin .camera_prevThumbs div {
	background-position: -160px -800px;
}
.camera_lime_skin .camera_nextThumbs div {
	background-position: -190px -800px;
}
.camera_lime_skin .camera_prev > span {
	background-position: 0 -800px;
}
.camera_lime_skin .camera_next > span {
	background-position: -40px -800px;
}
.camera_lime_skin .camera_commands > .camera_play {
	background-position: -80px -800px;
}
.camera_lime_skin .camera_commands > .camera_stop {
	background-position: -120px -800px	;
}
/*MAGENTA SKIN*/
.camera_magenta_skin .camera_prevThumbs div {
	background-position: -160px -840px;
}
.camera_magenta_skin .camera_nextThumbs div {
	background-position: -190px -840px;
}
.camera_magenta_skin .camera_prev > span {
	background-position: 0 -840px;
}
.camera_magenta_skin .camera_next > span {
	background-position: -40px -840px;
}
.camera_magenta_skin .camera_commands > .camera_play {
	background-position: -80px -840px;
}
.camera_magenta_skin .camera_commands > .camera_stop {
	background-position: -120px -840px	;
}
/*MAROON SKIN*/
.camera_maroon_skin .camera_prevThumbs div {
	background-position: -160px -880px;
}
.camera_maroon_skin .camera_nextThumbs div {
	background-position: -190px -880px;
}
.camera_maroon_skin .camera_prev > span {
	background-position: 0 -880px;
}
.camera_maroon_skin .camera_next > span {
	background-position: -40px -880px;
}
.camera_maroon_skin .camera_commands > .camera_play {
	background-position: -80px -880px;
}
.camera_maroon_skin .camera_commands > .camera_stop {
	background-position: -120px -880px	;
}
/*ORANGE SKIN*/
.camera_orange_skin .camera_prevThumbs div {
	background-position: -160px -920px;
}
.camera_orange_skin .camera_nextThumbs div {
	background-position: -190px -920px;
}
.camera_orange_skin .camera_prev > span {
	background-position: 0 -920px;
}
.camera_orange_skin .camera_next > span {
	background-position: -40px -920px;
}
.camera_orange_skin .camera_commands > .camera_play {
	background-position: -80px -920px;
}
.camera_orange_skin .camera_commands > .camera_stop {
	background-position: -120px -920px	;
}
/*OLIVE SKIN*/
.camera_olive_skin .camera_prevThumbs div {
	background-position: -160px -1080px;
}
.camera_olive_skin .camera_nextThumbs div {
	background-position: -190px -1080px;
}
.camera_olive_skin .camera_prev > span {
	background-position: 0 -1080px;
}
.camera_olive_skin .camera_next > span {
	background-position: -40px -1080px;
}
.camera_olive_skin .camera_commands > .camera_play {
	background-position: -80px -1080px;
}
.camera_olive_skin .camera_commands > .camera_stop {
	background-position: -120px -1080px	;
}
/*PINK SKIN*/
.camera_pink_skin .camera_prevThumbs div {
	background-position: -160px -960px;
}
.camera_pink_skin .camera_nextThumbs div {
	background-position: -190px -960px;
}
.camera_pink_skin .camera_prev > span {
	background-position: 0 -960px;
}
.camera_pink_skin .camera_next > span {
	background-position: -40px -960px;
}
.camera_pink_skin .camera_commands > .camera_play {
	background-position: -80px -960px;
}
.camera_pink_skin .camera_commands > .camera_stop {
	background-position: -120px -960px	;
}
/*PISTACHIO SKIN*/
.camera_pistachio_skin .camera_prevThumbs div {
	background-position: -160px -1040px;
}
.camera_pistachio_skin .camera_nextThumbs div {
	background-position: -190px -1040px;
}
.camera_pistachio_skin .camera_prev > span {
	background-position: 0 -1040px;
}
.camera_pistachio_skin .camera_next > span {
	background-position: -40px -1040px;
}
.camera_pistachio_skin .camera_commands > .camera_play {
	background-position: -80px -1040px;
}
.camera_pistachio_skin .camera_commands > .camera_stop {
	background-position: -120px -1040px	;
}
/*PINK SKIN*/
.camera_pink_skin .camera_prevThumbs div {
	background-position: -160px -80px;
}
.camera_pink_skin .camera_nextThumbs div {
	background-position: -190px -80px;
}
.camera_pink_skin .camera_prev > span {
	background-position: 0 -80px;
}
.camera_pink_skin .camera_next > span {
	background-position: -40px -80px;
}
.camera_pink_skin .camera_commands > .camera_play {
	background-position: -80px -80px;
}
.camera_pink_skin .camera_commands > .camera_stop {
	background-position: -120px -80px;
}
/*RED SKIN*/
.camera_red_skin .camera_prevThumbs div {
	background-position: -160px -1000px;
}
.camera_red_skin .camera_nextThumbs div {
	background-position: -190px -1000px;
}
.camera_red_skin .camera_prev > span {
	background-position: 0 -1000px;
}
.camera_red_skin .camera_next > span {
	background-position: -40px -1000px;
}
.camera_red_skin .camera_commands > .camera_play {
	background-position: -80px -1000px;
}
.camera_red_skin .camera_commands > .camera_stop {
	background-position: -120px -1000px	;
}
/*TANGERINE SKIN*/
.camera_tangerine_skin .camera_prevThumbs div {
	background-position: -160px -1120px;
}
.camera_tangerine_skin .camera_nextThumbs div {
	background-position: -190px -1120px;
}
.camera_tangerine_skin .camera_prev > span {
	background-position: 0 -1120px;
}
.camera_tangerine_skin .camera_next > span {
	background-position: -40px -1120px;
}
.camera_tangerine_skin .camera_commands > .camera_play {
	background-position: -80px -1120px;
}
.camera_tangerine_skin .camera_commands > .camera_stop {
	background-position: -120px -1120px	;
}
/*TURQUOISE SKIN*/
.camera_turquoise_skin .camera_prevThumbs div {
	background-position: -160px -1160px;
}
.camera_turquoise_skin .camera_nextThumbs div {
	background-position: -190px -1160px;
}
.camera_turquoise_skin .camera_prev > span {
	background-position: 0 -1160px;
}
.camera_turquoise_skin .camera_next > span {
	background-position: -40px -1160px;
}
.camera_turquoise_skin .camera_commands > .camera_play {
	background-position: -80px -1160px;
}
.camera_turquoise_skin .camera_commands > .camera_stop {
	background-position: -120px -1160px	;
}
/*VIOLET SKIN*/
.camera_violet_skin .camera_prevThumbs div {
	background-position: -160px -1200px;
}
.camera_violet_skin .camera_nextThumbs div {
	background-position: -190px -1200px;
}
.camera_violet_skin .camera_prev > span {
	background-position: 0 -1200px;
}
.camera_violet_skin .camera_next > span {
	background-position: -40px -1200px;
}
.camera_violet_skin .camera_commands > .camera_play {
	background-position: -80px -1200px;
}
.camera_violet_skin .camera_commands > .camera_stop {
	background-position: -120px -1200px	;
}
/*WHITE SKIN*/
.camera_white_skin .camera_prevThumbs div {
	background-position: -160px -80px;
}
.camera_white_skin .camera_nextThumbs div {
	background-position: -190px -80px;
}
.camera_white_skin .camera_prev > span {
	background-position: 0 -80px;
}
.camera_white_skin .camera_next > span {
	background-position: -40px -80px;
}
.camera_white_skin .camera_commands > .camera_play {
	background-position: -80px -80px;
}
.camera_white_skin .camera_commands > .camera_stop {
	background-position: -120px -80px;
}
/*YELLOW SKIN*/
.camera_yellow_skin .camera_prevThumbs div {
	background-position: -160px -1240px;
}
.camera_yellow_skin .camera_nextThumbs div {
	background-position: -190px -1240px;
}
.camera_yellow_skin .camera_prev > span {
	background-position: 0 -1240px;
}
.camera_yellow_skin .camera_next > span {
	background-position: -40px -1240px;
}
.camera_yellow_skin .camera_commands > .camera_play {
	background-position: -80px -1240px;
}
.camera_yellow_skin .camera_commands > .camera_stop {
	background-position: -120px -1240px	;
}


.camera_thumbs_cont .cameraContent {
	display: block;
	pointer-events: none;
	opacity: 1;
	transition: 0.2s;
}

.camera_thumbs_cont .camera_caption_title {
	font-weight: normal;
	font-size: 0.8em;
}

.camera_thumbs_cont ul li {
	position: relative;
}

.camera_thumbs_cont ul li:hover .cameraContent {
	opacity: 0;
}

.camera_thumbs_cont .camera_caption > div {
	background: rgba(0, 0, 0, 0.5);
}

ul.camera_pag_ul {
	overflow: visible;
}components/com_slideshowck/extensions/mod_slideshowck/themes/default/css/camera_ie.css000060400000001054152453623440025607 0ustar00/* IE specific css for Slideshow CK */
.camera_wrap:after {
	background: none;
}

.camera_wrap .camera_pag .camera_pag_ul li {
    float:left !important;
}

div.camera_thumbs_cont {
	background: transparent;
}


.camera_caption {
	bottom: 10px;
	display: block;
	position: relative !important;
	/*width: 100%;*/
}
.camera_caption > div {
	padding: 10px 20px;
}

.camera_caption {
	color: #fff;
	margin-bottom: 35px;
}
.camera_caption > div {
	background: #000;
	background: rgba(0,0,0, 0.7);
	border-radius: 0 5px 5px 0;
	-moz-border-radius: 0 5px 5px 0;
}components/com_slideshowck/extensions/mod_slideshowck/themes/default/css/camera_rtl.css000060400000062372152453623440026025 0ustar00/*** compatibilite beez en position-12 ***/
#top {overflow: visible !important; }


/**************************
*
*	GENERAL
*
**************************/
.camera_wrap a.camera-link,.camera_wrap a.camera-link:hover {
	background: url(../images/blank.gif) !important;
}

.camera_wrap a.camera-button {
	display: inline-block;
}

.camera_wrap a,.camera_wrap a:hover, .camera_wrap img,
.camera_wrap ol, .camera_wrap ul, .camera_wrap li,
.camera_wrap table, .camera_wrap tbody, .camera_wrap tfoot, .camera_wrap thead, .camera_wrap tr, .camera_wrap th, .camera_wrap td
.camera_thumbs_wrap a, .camera_thumbs_wrap img,
.camera_thumbs_wrap ol, .camera_thumbs_wrap ul, .camera_thumbs_wrap li,
.camera_thumbs_wrap table, .camera_thumbs_wrap tbody, .camera_thumbs_wrap tfoot, .camera_thumbs_wrap thead, .camera_thumbs_wrap tr, .camera_thumbs_wrap th, .camera_thumbs_wrap td {
	background: none;
	border: 0;
	font: inherit;
	font-size: 100%;
	margin: 0;
	padding: 0;
	vertical-align: baseline;
	list-style: none
}
.camera_wrap {
	display: none;
	/*float: left;*/
	position: relative;
	z-index: 0;
	max-width: 100%;
}
.camera_wrap img {
	max-width: none!important;
}
.camera_fakehover {
	height: 100%;
	min-height: 60px;
	position: relative;
	width: 100%;
	z-index: 1;
}
.camera_wrap {
	/*width: 100%;*/
}
.camera_src {
	display: none;
}
.cameraCont, .cameraContents {
	height: 100%;
	position: relative;
	width: 100%;
	z-index: 1;
}
.cameraSlide {
	bottom: 0;
	left: 0;
	position: absolute;
	right: 0;
	top: 0;
	width: 100%;
}
.cameraContent {
	bottom: 0;
	display: none;
	left: 0;
	position: absolute;
	right: 0;
	top: 0;
	width: 100%;
}
.camera_target {
	bottom: 0;
	height: 100%;
	left: 0;
	overflow: hidden;
	position: absolute;
	right: 0;
	text-align: right;
	top: 0;
	width: 100%;
	z-index: 0;
}
.camera_overlayer {
	bottom: 0;
	height: 100%;
	left: 0;
	overflow: hidden;
	position: absolute;
	right: 0;
	top: 0;
	width: 100%;
	z-index: 0;
}
.camera_target_content {
	bottom: 0;
	left: 0;
	overflow: hidden;
	position: absolute;
	right: 0;
	top: 0;
	z-index: 2;
}
.camera_target_content .camera_link {
	display: block;
	height: 100%;
	text-decoration: none;
        background: url(../images/blank.gif) !important;
}
.camera_loader {
    background: #fff url(../images/camera-loader.gif) no-repeat center;
	background: rgba(255, 255, 255, 0.9) url(../images/camera-loader.gif) no-repeat center;
	border: 1px solid #ffffff;
	-webkit-border-radius: 18px;
	-moz-border-radius: 18px;
	border-radius: 18px;
	height: 36px;
	left: 50%;
	overflow: hidden;
	position: absolute;
	margin: -18px 0 0 -18px;
	top: 50%;
	width: 36px;
	z-index: 3;
}
.camera_bar {
	bottom: 0;
	left: 0;
	overflow: hidden;
	position: absolute;
	right: 0;
	top: 0;
	z-index: 3;
}
.camera_thumbs_wrap.camera_left .camera_bar, .camera_thumbs_wrap.camera_right .camera_bar {
	height: 100%;
	position: absolute;
	width: auto;
}
.camera_thumbs_wrap.camera_bottom .camera_bar, .camera_thumbs_wrap.camera_top .camera_bar {
	height: auto;
	position: absolute;
	width: 100%;
}
.camera_nav_cont {
	height: 65px;
	overflow: hidden;
	position: absolute;
	right: 9px;
	top: 15px;
	width: 120px;
	z-index: 4;
}
.camera_caption {
	bottom: 0;
	display: block;
	position: absolute;
	width: 100%;
        z-index: 1000;
}
.camera_caption > div {
	padding: 10px 20px;
	height:100%;
}
.camera_caption_title {
	font-size: 1.3em;
	font-weight: bold;
	line-height: 1em;
}
.camerarelative {
	overflow: hidden;
	position: relative;
}
.imgFake {
	cursor: pointer;
}
.camera_prevThumbs {
	bottom: 4px;
	cursor: pointer;
	left: 0;
	position: absolute;
	top: 4px;
	/*visibility: hidden;*/
	width: 30px;
	z-index: 10;
}
.camera_prevThumbs div {
	background: url(../images/camera_skins.png) no-repeat -160px 0;
	display: block;
	height: 40px;
	margin-top: -20px;
	position: absolute;
	top: 50%;
	width: 30px;
}
.camera_nextThumbs {
	bottom: 4px;
	cursor: pointer;
	position: absolute;
	right: 0;
	top: 4px;
	visibility: hidden;
	width: 30px;
	z-index: 10;
}
.camera_nextThumbs div {
	background: url(../images/camera_skins.png) no-repeat -190px 0;
	display: block;
	height: 40px;
	margin-top: -20px;
	position: absolute;
	top: 50%;
	width: 30px;
}
.camera_command_wrap .hideNav {
	display: none;
}
.camera_command_wrap {
	left: 0;
	position: relative;
	right:0;
	z-index: 4;
}
.camera_wrap .camera_pag .camera_pag_ul {
	list-style: none;
	margin: 0;
	padding: 0;
	text-align: right;
        height: auto !important;
        height: 28px;
}
.camera_wrap .camera_pag .camera_pag_ul li {
	-webkit-border-radius: 8px;
	-moz-border-radius: 8px;
	border-radius: 8px;
	cursor: pointer;
	display: inline-block;
        float: none !important;
        float:left;/*overflow:hidden;*/
	height: 16px;
	margin: 20px 5px;
	position: relative;
	/*text-align: left;*/
	text-indent: 9999px;
	width: 16px;
	overflow: visible !important;
	padding: 0;
}

.camera_commands_emboss .camera_pag .camera_pag_ul li {
	-moz-box-shadow:
		0px 1px 0px rgba(255,255,255,1),
		inset 0px 1px 1px rgba(0,0,0,0.2);
	-webkit-box-shadow:
		0px 1px 0px rgba(255,255,255,1),
		inset 0px 1px 1px rgba(0,0,0,0.2);
	box-shadow:
		0px 1px 0px rgba(255,255,255,1),
		inset 0px 1px 1px rgba(0,0,0,0.2);
}
.camera_wrap .camera_pag .camera_pag_ul li > span {
	-webkit-border-radius: 5px;
	-moz-border-radius: 5px;
	border-radius: 5px;
	height: 8px;
	left: 4px;
	overflow: hidden;
	position: absolute;
	top: 4px;
	width: 8px;
}
.camera_commands_emboss .camera_pag .camera_pag_ul li:hover > span {
	-moz-box-shadow:
		0px 1px 0px rgba(255,255,255,1),
		inset 0px 1px 1px rgba(0,0,0,0.2);
	-webkit-box-shadow:
		0px 1px 0px rgba(255,255,255,1),
		inset 0px 1px 1px rgba(0,0,0,0.2);
	box-shadow:
		0px 1px 0px rgba(255,255,255,1),
		inset 0px 1px 1px rgba(0,0,0,0.2);
}
.camera_wrap .camera_pag .camera_pag_ul li.cameracurrent > span {
	-moz-box-shadow: none;
	-webkit-box-shadow: none;
	box-shadow: none;
}
.camera_pag_ul li img {
	display: none;
	position: absolute;
	box-sizing: border-box;
}
.camera_pag_ul .thumb_arrow {
    border-left: 4px solid transparent;
    border-right: 4px solid transparent;
    border-top: 4px solid;
	top: 0;
	left: 50%;
	margin-left: -4px;
	position: absolute;
}
.camera_prev, .camera_next, .camera_commands {
	cursor: pointer;
	height: 40px;
	margin-top: -20px;
	position: absolute;
	top: 50%;
	width: 40px;
	z-index: 2;
}
.camera_prev {
	left: 0;
}
.camera_prev > span {
	background: url(../images/camera_skins.png) no-repeat 0 0;
	display: block;
	height: 40px;
	width: 40px;
}
.camera_next {
	right: 0;
}
.camera_next > span {
	background: url(../images/camera_skins.png) no-repeat -40px 0;
	display: block;
	height: 40px;
	width: 40px;
}
.camera_commands {
	right: 41px;
}
.camera_commands > .camera_play {
	background: url(../images/camera_skins.png) no-repeat -80px 0;
	height: 40px;
	width: 40px;
}
.camera_commands > .camera_stop {
	background: url(../images/camera_skins.png) no-repeat -120px 0;
	display: block;
	height: 40px;
	width: 40px;
}

.camera_thumbs_cont {
	-webkit-border-bottom-right-radius: 4px;
	-webkit-border-bottom-left-radius: 4px;
	-moz-border-radius-bottomright: 4px;
	-moz-border-radius-bottomleft: 4px;
	border-bottom-right-radius: 4px;
	border-bottom-left-radius: 4px;
	overflow: hidden;
	position: relative;
	width: 100%;
}
.camera_commands_emboss .camera_thumbs_cont {
	-moz-box-shadow:
		0px 1px 0px rgba(255,255,255,1),
		inset 0px 1px 1px rgba(0,0,0,0.2);
	-webkit-box-shadow:
		0px 1px 0px rgba(255,255,255,1),
		inset 0px 1px 1px rgba(0,0,0,0.2);
	box-shadow:
		0px 1px 0px rgba(255,255,255,1),
		inset 0px 1px 1px rgba(0,0,0,0.2);
}
.camera_thumbs_cont > div {
	float: left;
	width: 100%;
}
.camera_thumbs_cont ul {
	overflow: hidden;
	padding: 3px 4px 8px;
	position: relative;
	text-align: center;
}
.camera_thumbs_cont ul li {
	display: inline;
	padding: 0 4px;
}
.camera_thumbs_cont ul li > img {
	border: 1px solid #000;
	cursor: pointer;
	margin-top: 5px;
	vertical-align:bottom;
}
.camera_clear {
	display: block;
	clear: both;
}
.showIt {
	display: none;
}
.camera_clear {
	clear: both;
	display: block;
	height: 1px;
	margin: -1px 0 25px;
	position: relative;
}

.camera_caption {
	color: #fff;
}
.camera_caption > div {
	background: #000;
	background: rgba(0, 0, 0, 0.8);
}
.camera_wrap .camera_pag .camera_pag_ul li {
	background: #b7b7b7;
}
.camera_wrap .camera_pag .camera_pag_ul li:hover > span {
	background: #b7b7b7;
}
.camera_wrap .camera_pag .camera_pag_ul li.cameracurrent > span {
	background: #434648;
}
.camera_pag_ul li img {
	border: 4px solid #e6e6e6;
	-moz-box-shadow: 0px 3px 6px rgba(0,0,0,.5);
	-webkit-box-shadow: 0px 3px 6px rgba(0,0,0,.5);
	box-shadow: 0px 3px 6px rgba(0,0,0,.5);
}
.camera_pag_ul .thumb_arrow {
    border-top-color: #e6e6e6;
}
.camera_prevThumbs, .camera_nextThumbs, .camera_prev, .camera_next, .camera_commands, .camera_thumbs_cont {
	background: #d8d8d8;
	background: rgba(216, 216, 216, 0.85);
}
.camera_wrap .camera_pag .camera_pag_ul li {
	background: #b7b7b7;
}
.camera_thumbs_cont ul li > img {
	border-color: 1px solid #000;
}
/*AMBER SKIN*/
.camera_amber_skin .camera_prevThumbs div {
	background-position: -160px -160px;
}
.camera_amber_skin .camera_nextThumbs div {
	background-position: -190px -160px;
}
.camera_amber_skin .camera_prev > span {
	background-position: 0 -160px;
}
.camera_amber_skin .camera_next > span {
	background-position: -40px -160px;
}
.camera_amber_skin .camera_commands > .camera_play {
	background-position: -80px -160px;
}
.camera_amber_skin .camera_commands > .camera_stop {
	background-position: -120px -160px;
}
/*ASH SKIN*/
.camera_ash_skin .camera_prevThumbs div {
	background-position: -160px -200px;
}
.camera_ash_skin .camera_nextThumbs div {
	background-position: -190px -200px;
}
.camera_ash_skin .camera_prev > span {
	background-position: 0 -200px;
}
.camera_ash_skin .camera_next > span {
	background-position: -40px -200px;
}
.camera_ash_skin .camera_commands > .camera_play {
	background-position: -80px -200px;
}
.camera_ash_skin .camera_commands > .camera_stop {
	background-position: -120px -200px;
}
/*AZURE SKIN*/
.camera_azure_skin .camera_prevThumbs div {
	background-position: -160px -240px;
}
.camera_azure_skin .camera_nextThumbs div {
	background-position: -190px -240px;
}
.camera_azure_skin .camera_prev > span {
	background-position: 0 -240px;
}
.camera_azure_skin .camera_next > span {
	background-position: -40px -240px;
}
.camera_azure_skin .camera_commands > .camera_play {
	background-position: -80px -240px;
}
.camera_azure_skin .camera_commands > .camera_stop {
	background-position: -120px -240px;
}
/*BEIGE SKIN*/
.camera_beige_skin .camera_prevThumbs div {
	background-position: -160px -120px;
}
.camera_beige_skin .camera_nextThumbs div {
	background-position: -190px -120px;
}
.camera_beige_skin .camera_prev > span {
	background-position: 0 -120px;
}
.camera_beige_skin .camera_next > span {
	background-position: -40px -120px;
}
.camera_beige_skin .camera_commands > .camera_play {
	background-position: -80px -120px;
}
.camera_beige_skin .camera_commands > .camera_stop {
	background-position: -120px -120px;
}
/*BLACK SKIN*/
.camera_black_skin .camera_prevThumbs div {
	background-position: -160px -40px;
}
.camera_black_skin .camera_nextThumbs div {
	background-position: -190px -40px;
}
.camera_black_skin .camera_prev > span {
	background-position: 0 -40px;
}
.camera_black_skin .camera_next > span {
	background-position: -40px -40px;
}
.camera_black_skin .camera_commands > .camera_play {
	background-position: -80px -40px;
}
.camera_black_skin .camera_commands > .camera_stop {
	background-position: -120px -40px;
}
/*BLUE SKIN*/
.camera_blue_skin .camera_prevThumbs div {
	background-position: -160px -280px;
}
.camera_blue_skin .camera_nextThumbs div {
	background-position: -190px -280px;
}
.camera_blue_skin .camera_prev > span {
	background-position: 0 -280px;
}
.camera_blue_skin .camera_next > span {
	background-position: -40px -280px;
}
.camera_blue_skin .camera_commands > .camera_play {
	background-position: -80px -280px;
}
.camera_blue_skin .camera_commands > .camera_stop {
	background-position: -120px -280px;
}
/*BROWN SKIN*/
.camera_brown_skin .camera_prevThumbs div {
	background-position: -160px -320px;
}
.camera_brown_skin .camera_nextThumbs div {
	background-position: -190px -320px;
}
.camera_brown_skin .camera_prev > span {
	background-position: 0 -320px;
}
.camera_brown_skin .camera_next > span {
	background-position: -40px -320px;
}
.camera_brown_skin .camera_commands > .camera_play {
	background-position: -80px -320px;
}
.camera_brown_skin .camera_commands > .camera_stop {
	background-position: -120px -320px;
}
/*BURGUNDY SKIN*/
.camera_burgundy_skin .camera_prevThumbs div {
	background-position: -160px -360px;
}
.camera_burgundy_skin .camera_nextThumbs div {
	background-position: -190px -360px;
}
.camera_burgundy_skin .camera_prev > span {
	background-position: 0 -360px;
}
.camera_burgundy_skin .camera_next > span {
	background-position: -40px -360px;
}
.camera_burgundy_skin .camera_commands > .camera_play {
	background-position: -80px -360px;
}
.camera_burgundy_skin .camera_commands > .camera_stop {
	background-position: -120px -360px;
}
/*CHARCOAL SKIN*/
.camera_charcoal_skin .camera_prevThumbs div {
	background-position: -160px -400px;
}
.camera_charcoal_skin .camera_nextThumbs div {
	background-position: -190px -400px;
}
.camera_charcoal_skin .camera_prev > span {
	background-position: 0 -400px;
}
.camera_charcoal_skin .camera_next > span {
	background-position: -40px -400px;
}
.camera_charcoal_skin .camera_commands > .camera_play {
	background-position: -80px -400px;
}
.camera_charcoal_skin .camera_commands > .camera_stop {
	background-position: -120px -400px;
}
/*CHOCOLATE SKIN*/
.camera_chocolate_skin .camera_prevThumbs div {
	background-position: -160px -440px;
}
.camera_chocolate_skin .camera_nextThumbs div {
	background-position: -190px -440px;
}
.camera_chocolate_skin .camera_prev > span {
	background-position: 0 -440px;
}
.camera_chocolate_skin .camera_next > span {
	background-position: -40px -440px;
}
.camera_chocolate_skin .camera_commands > .camera_play {
	background-position: -80px -440px;
}
.camera_chocolate_skin .camera_commands > .camera_stop {
	background-position: -120px -440px	;
}
/*COFFEE SKIN*/
.camera_coffee_skin .camera_prevThumbs div {
	background-position: -160px -480px;
}
.camera_coffee_skin .camera_nextThumbs div {
	background-position: -190px -480px;
}
.camera_coffee_skin .camera_prev > span {
	background-position: 0 -480px;
}
.camera_coffee_skin .camera_next > span {
	background-position: -40px -480px;
}
.camera_coffee_skin .camera_commands > .camera_play {
	background-position: -80px -480px;
}
.camera_coffee_skin .camera_commands > .camera_stop {
	background-position: -120px -480px	;
}
/*CYAN SKIN*/
.camera_cyan_skin .camera_prevThumbs div {
	background-position: -160px -520px;
}
.camera_cyan_skin .camera_nextThumbs div {
	background-position: -190px -520px;
}
.camera_cyan_skin .camera_prev > span {
	background-position: 0 -520px;
}
.camera_cyan_skin .camera_next > span {
	background-position: -40px -520px;
}
.camera_cyan_skin .camera_commands > .camera_play {
	background-position: -80px -520px;
}
.camera_cyan_skin .camera_commands > .camera_stop {
	background-position: -120px -520px	;
}
/*FUCHSIA SKIN*/
.camera_fuchsia_skin .camera_prevThumbs div {
	background-position: -160px -560px;
}
.camera_fuchsia_skin .camera_nextThumbs div {
	background-position: -190px -560px;
}
.camera_fuchsia_skin .camera_prev > span {
	background-position: 0 -560px;
}
.camera_fuchsia_skin .camera_next > span {
	background-position: -40px -560px;
}
.camera_fuchsia_skin .camera_commands > .camera_play {
	background-position: -80px -560px;
}
.camera_fuchsia_skin .camera_commands > .camera_stop {
	background-position: -120px -560px	;
}
/*GOLD SKIN*/
.camera_gold_skin .camera_prevThumbs div {
	background-position: -160px -600px;
}
.camera_gold_skin .camera_nextThumbs div {
	background-position: -190px -600px;
}
.camera_gold_skin .camera_prev > span {
	background-position: 0 -600px;
}
.camera_gold_skin .camera_next > span {
	background-position: -40px -600px;
}
.camera_gold_skin .camera_commands > .camera_play {
	background-position: -80px -600px;
}
.camera_gold_skin .camera_commands > .camera_stop {
	background-position: -120px -600px	;
}
/*GREEN SKIN*/
.camera_green_skin .camera_prevThumbs div {
	background-position: -160px -640px;
}
.camera_green_skin .camera_nextThumbs div {
	background-position: -190px -640px;
}
.camera_green_skin .camera_prev > span {
	background-position: 0 -640px;
}
.camera_green_skin .camera_next > span {
	background-position: -40px -640px;
}
.camera_green_skin .camera_commands > .camera_play {
	background-position: -80px -640px;
}
.camera_green_skin .camera_commands > .camera_stop {
	background-position: -120px -640px	;
}
/*GREY SKIN*/
.camera_grey_skin .camera_prevThumbs div {
	background-position: -160px -680px;
}
.camera_grey_skin .camera_nextThumbs div {
	background-position: -190px -680px;
}
.camera_grey_skin .camera_prev > span {
	background-position: 0 -680px;
}
.camera_grey_skin .camera_next > span {
	background-position: -40px -680px;
}
.camera_grey_skin .camera_commands > .camera_play {
	background-position: -80px -680px;
}
.camera_grey_skin .camera_commands > .camera_stop {
	background-position: -120px -680px	;
}
/*INDIGO SKIN*/
.camera_indigo_skin .camera_prevThumbs div {
	background-position: -160px -720px;
}
.camera_indigo_skin .camera_nextThumbs div {
	background-position: -190px -720px;
}
.camera_indigo_skin .camera_prev > span {
	background-position: 0 -720px;
}
.camera_indigo_skin .camera_next > span {
	background-position: -40px -720px;
}
.camera_indigo_skin .camera_commands > .camera_play {
	background-position: -80px -720px;
}
.camera_indigo_skin .camera_commands > .camera_stop {
	background-position: -120px -720px	;
}
/*KHAKI SKIN*/
.camera_khaki_skin .camera_prevThumbs div {
	background-position: -160px -760px;
}
.camera_khaki_skin .camera_nextThumbs div {
	background-position: -190px -760px;
}
.camera_khaki_skin .camera_prev > span {
	background-position: 0 -760px;
}
.camera_khaki_skin .camera_next > span {
	background-position: -40px -760px;
}
.camera_khaki_skin .camera_commands > .camera_play {
	background-position: -80px -760px;
}
.camera_khaki_skin .camera_commands > .camera_stop {
	background-position: -120px -760px	;
}
/*LIME SKIN*/
.camera_lime_skin .camera_prevThumbs div {
	background-position: -160px -800px;
}
.camera_lime_skin .camera_nextThumbs div {
	background-position: -190px -800px;
}
.camera_lime_skin .camera_prev > span {
	background-position: 0 -800px;
}
.camera_lime_skin .camera_next > span {
	background-position: -40px -800px;
}
.camera_lime_skin .camera_commands > .camera_play {
	background-position: -80px -800px;
}
.camera_lime_skin .camera_commands > .camera_stop {
	background-position: -120px -800px	;
}
/*MAGENTA SKIN*/
.camera_magenta_skin .camera_prevThumbs div {
	background-position: -160px -840px;
}
.camera_magenta_skin .camera_nextThumbs div {
	background-position: -190px -840px;
}
.camera_magenta_skin .camera_prev > span {
	background-position: 0 -840px;
}
.camera_magenta_skin .camera_next > span {
	background-position: -40px -840px;
}
.camera_magenta_skin .camera_commands > .camera_play {
	background-position: -80px -840px;
}
.camera_magenta_skin .camera_commands > .camera_stop {
	background-position: -120px -840px	;
}
/*MAROON SKIN*/
.camera_maroon_skin .camera_prevThumbs div {
	background-position: -160px -880px;
}
.camera_maroon_skin .camera_nextThumbs div {
	background-position: -190px -880px;
}
.camera_maroon_skin .camera_prev > span {
	background-position: 0 -880px;
}
.camera_maroon_skin .camera_next > span {
	background-position: -40px -880px;
}
.camera_maroon_skin .camera_commands > .camera_play {
	background-position: -80px -880px;
}
.camera_maroon_skin .camera_commands > .camera_stop {
	background-position: -120px -880px	;
}
/*ORANGE SKIN*/
.camera_orange_skin .camera_prevThumbs div {
	background-position: -160px -920px;
}
.camera_orange_skin .camera_nextThumbs div {
	background-position: -190px -920px;
}
.camera_orange_skin .camera_prev > span {
	background-position: 0 -920px;
}
.camera_orange_skin .camera_next > span {
	background-position: -40px -920px;
}
.camera_orange_skin .camera_commands > .camera_play {
	background-position: -80px -920px;
}
.camera_orange_skin .camera_commands > .camera_stop {
	background-position: -120px -920px	;
}
/*OLIVE SKIN*/
.camera_olive_skin .camera_prevThumbs div {
	background-position: -160px -1080px;
}
.camera_olive_skin .camera_nextThumbs div {
	background-position: -190px -1080px;
}
.camera_olive_skin .camera_prev > span {
	background-position: 0 -1080px;
}
.camera_olive_skin .camera_next > span {
	background-position: -40px -1080px;
}
.camera_olive_skin .camera_commands > .camera_play {
	background-position: -80px -1080px;
}
.camera_olive_skin .camera_commands > .camera_stop {
	background-position: -120px -1080px	;
}
/*PINK SKIN*/
.camera_pink_skin .camera_prevThumbs div {
	background-position: -160px -960px;
}
.camera_pink_skin .camera_nextThumbs div {
	background-position: -190px -960px;
}
.camera_pink_skin .camera_prev > span {
	background-position: 0 -960px;
}
.camera_pink_skin .camera_next > span {
	background-position: -40px -960px;
}
.camera_pink_skin .camera_commands > .camera_play {
	background-position: -80px -960px;
}
.camera_pink_skin .camera_commands > .camera_stop {
	background-position: -120px -960px	;
}
/*PISTACHIO SKIN*/
.camera_pistachio_skin .camera_prevThumbs div {
	background-position: -160px -1040px;
}
.camera_pistachio_skin .camera_nextThumbs div {
	background-position: -190px -1040px;
}
.camera_pistachio_skin .camera_prev > span {
	background-position: 0 -1040px;
}
.camera_pistachio_skin .camera_next > span {
	background-position: -40px -1040px;
}
.camera_pistachio_skin .camera_commands > .camera_play {
	background-position: -80px -1040px;
}
.camera_pistachio_skin .camera_commands > .camera_stop {
	background-position: -120px -1040px	;
}
/*PINK SKIN*/
.camera_pink_skin .camera_prevThumbs div {
	background-position: -160px -80px;
}
.camera_pink_skin .camera_nextThumbs div {
	background-position: -190px -80px;
}
.camera_pink_skin .camera_prev > span {
	background-position: 0 -80px;
}
.camera_pink_skin .camera_next > span {
	background-position: -40px -80px;
}
.camera_pink_skin .camera_commands > .camera_play {
	background-position: -80px -80px;
}
.camera_pink_skin .camera_commands > .camera_stop {
	background-position: -120px -80px;
}
/*RED SKIN*/
.camera_red_skin .camera_prevThumbs div {
	background-position: -160px -1000px;
}
.camera_red_skin .camera_nextThumbs div {
	background-position: -190px -1000px;
}
.camera_red_skin .camera_prev > span {
	background-position: 0 -1000px;
}
.camera_red_skin .camera_next > span {
	background-position: -40px -1000px;
}
.camera_red_skin .camera_commands > .camera_play {
	background-position: -80px -1000px;
}
.camera_red_skin .camera_commands > .camera_stop {
	background-position: -120px -1000px	;
}
/*TANGERINE SKIN*/
.camera_tangerine_skin .camera_prevThumbs div {
	background-position: -160px -1120px;
}
.camera_tangerine_skin .camera_nextThumbs div {
	background-position: -190px -1120px;
}
.camera_tangerine_skin .camera_prev > span {
	background-position: 0 -1120px;
}
.camera_tangerine_skin .camera_next > span {
	background-position: -40px -1120px;
}
.camera_tangerine_skin .camera_commands > .camera_play {
	background-position: -80px -1120px;
}
.camera_tangerine_skin .camera_commands > .camera_stop {
	background-position: -120px -1120px	;
}
/*TURQUOISE SKIN*/
.camera_turquoise_skin .camera_prevThumbs div {
	background-position: -160px -1160px;
}
.camera_turquoise_skin .camera_nextThumbs div {
	background-position: -190px -1160px;
}
.camera_turquoise_skin .camera_prev > span {
	background-position: 0 -1160px;
}
.camera_turquoise_skin .camera_next > span {
	background-position: -40px -1160px;
}
.camera_turquoise_skin .camera_commands > .camera_play {
	background-position: -80px -1160px;
}
.camera_turquoise_skin .camera_commands > .camera_stop {
	background-position: -120px -1160px	;
}
/*VIOLET SKIN*/
.camera_violet_skin .camera_prevThumbs div {
	background-position: -160px -1200px;
}
.camera_violet_skin .camera_nextThumbs div {
	background-position: -190px -1200px;
}
.camera_violet_skin .camera_prev > span {
	background-position: 0 -1200px;
}
.camera_violet_skin .camera_next > span {
	background-position: -40px -1200px;
}
.camera_violet_skin .camera_commands > .camera_play {
	background-position: -80px -1200px;
}
.camera_violet_skin .camera_commands > .camera_stop {
	background-position: -120px -1200px	;
}
/*WHITE SKIN*/
.camera_white_skin .camera_prevThumbs div {
	background-position: -160px -80px;
}
.camera_white_skin .camera_nextThumbs div {
	background-position: -190px -80px;
}
.camera_white_skin .camera_prev > span {
	background-position: 0 -80px;
}
.camera_white_skin .camera_next > span {
	background-position: -40px -80px;
}
.camera_white_skin .camera_commands > .camera_play {
	background-position: -80px -80px;
}
.camera_white_skin .camera_commands > .camera_stop {
	background-position: -120px -80px;
}
/*YELLOW SKIN*/
.camera_yellow_skin .camera_prevThumbs div {
	background-position: -160px -1240px;
}
.camera_yellow_skin .camera_nextThumbs div {
	background-position: -190px -1240px;
}
.camera_yellow_skin .camera_prev > span {
	background-position: 0 -1240px;
}
.camera_yellow_skin .camera_next > span {
	background-position: -40px -1240px;
}
.camera_yellow_skin .camera_commands > .camera_play {
	background-position: -80px -1240px;
}
.camera_yellow_skin .camera_commands > .camera_stop {
	background-position: -120px -1240px	;
}

ul.camera_pag_ul {
	overflow: visible;
}components/com_slideshowck/extensions/mod_slideshowck/themes/default/css/camera_ie8.css000060400000000122152453623440025672 0ustar00/* IE8 specific css for Slideshow CK */
.camera_wrap:after {
	background: none;
}
components/com_slideshowck/extensions/mod_slideshowck/themes/default/css/index.html000060400000000037152453623440025165 0ustar00<!DOCTYPE html><title></title>
components/com_slideshowck/extensions/mod_slideshowck/themes/default/index.html000060400000000037152453623440024375 0ustar00<!DOCTYPE html><title></title>
components/com_slideshowck/extensions/mod_slideshowck/index.html000060400000000037152453623440021464 0ustar00<!DOCTYPE html><title></title>
components/com_slideshowck/extensions/mod_slideshowck/helper.php000060400000143714152453623440021471 0ustar00<?php

/**
 * @copyright	Copyright (C) 2011 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * Module Slideshow CK
 * @license		GNU/GPL
 * */
// no direct access
defined('_JEXEC') or die;

/** 
 * NOTE : THIS FILE IS USED FOR B/C OF THE V1 FEATURES ONLY !! 
 */
 
 
//$com_path = JPATH_SITE . '/components/com_content/';
//require_once $com_path . 'router.php';
//require_once $com_path . 'helpers/route.php';
//\Joomla\CMS\MVC\Model\BaseDatabaseModel::addIncludePath($com_path . '/models', 'ContentModel');
jimport('joomla.filesystem.folder');
jimport('joomla.filesystem.file');

class modSlideshowckHelper {

	private static $_params;

	private static $folderLabels = array();

	private static $imagesOrderByLabels = array();

	/**
	 * Get a list of the items.
	 *
	 * @param	\Joomla\Registry\Registry	$params	The module options.
	 *
	 * @return	array
	 */
	static function getItems(&$params) {
		// Initialise variables.
		self::$_params = $params;
		$db = \Joomla\CMS\Factory::getDbo();
		$document = \Joomla\CMS\Factory::getDocument();

		// load the libraries
		//jimport('joomla.application.module.helper');
		$items = json_decode(str_replace("|qq|", "\"", $params->get('slides')));
		foreach ($items as $i => $item) {
			if (!$item->imgname) {
				unset($items[$i]);
				continue;
			}

			// check if the slide is published
			if (isset($item->state) && $item->state == '0') {
				unset($items[$i]);
				continue;
			}

			// check the slide start date
			if (isset($item->startdate) && $item->startdate) {
				// if (date("d M Y") < $item->startdate) {
				if (time() < strtotime($item->startdate)) {
					unset($items[$i]);
					continue;
				}
			}

			// check the slide end date
			if (isset($item->enddate) && $item->enddate) {
				// if (date("d M Y") > $item->enddate) {
				if (time() > strtotime($item->enddate)) {
					unset($items[$i]);
					continue;
				}
			}

			if (isset($item->slidearticleid) && $item->slidearticleid) {
				$item = self::getArticle($item, $params);
			} else {
				$item->article = null;
			}
			// create new images for mobile
			if ($params->get('usemobileimage', '0')) { 
				$resolutions = explode(',', $params->get('mobileimageresolution', '640'));
				foreach ($resolutions as $resolution) {
					self::resizeImage($item->imgname, (int)$resolution, '', (int)$resolution, '');
				}
			}

			if (stristr($item->imgname, "http")) {
				$item->imgthumb = $item->imgname;
			} else {
				// renomme le fichier
				$thumbext = explode(".", $item->imgname);
				$thumbext = end($thumbext);
				// crée la miniature
				if ($params->get('thumbnails', '1') == '1' && $params->get('autocreatethumbs','1')) {
					$item->imgthumb = \Joomla\CMS\Uri\Uri::base(true) . '/' . self::resizeImage($item->imgname, $params->get('thumbnailwidth', '182'), $params->get('thumbnailheight', '187'));
				} else {
					$thumbfile = str_replace(\Joomla\CMS\Filesystem\File::getName($item->imgname), "th/" . \Joomla\CMS\Filesystem\File::getName($item->imgname), $item->imgname);
					$thumbfile = str_replace("." . $thumbext, "_th." . $thumbext, $thumbfile);
					$item->imgthumb = \Joomla\CMS\Uri\Uri::base(true) . '/' . $thumbfile;
				}
				$item->imgname = \Joomla\CMS\Uri\Uri::base(true) . '/' . $item->imgname;
			}

			// set the videolink
			if ($item->imgvideo)
				$item->imgvideo = self::setVideolink($item->imgvideo);

			// manage the title and description
			if (stristr($item->imgcaption, "||")) {
				$splitcaption = explode("||", $item->imgcaption);
				$item->imgcaption = '<div class="slideshowck_title">' . $splitcaption[0] . '</div><div class="slideshowck_description">' . $splitcaption[1] . '</div>';
			}
			
			// route the url
			if (strcasecmp(substr($item->imglink, 0, 4), 'http') && (strpos($item->imglink, 'index.php?') !== false)) {
				$item->imglink = \Joomla\CMS\Router\Route::_($item->imglink, true, false);
			} else {
				$item->imglink = \Joomla\CMS\Router\Route::_($item->imglink);
			}
			
			if (!isset($item->imgtitle)) $item->imgtitle = '';
		}

		return $items;
	}

	static function getArticle(&$item, $params) {
		$com_path = JPATH_SITE . '/components/com_content/';
		require_once $com_path . 'router.php';
		require_once $com_path . 'helpers/route.php';
		\Joomla\CMS\MVC\Model\BaseDatabaseModel::addIncludePath($com_path . '/models', 'ContentModel');
		self::$_params = $params;
		// Access filter
		$access = !\Joomla\CMS\Component\ComponentHelper::getParams('com_content')->get('show_noauth');
		$authorised = \Joomla\CMS\Access\Access::getAuthorisedViewLevels(\Joomla\CMS\Factory::getUser()->get('id'));
		// Get an instance of the generic articles model
		$articles = \Joomla\CMS\MVC\Model\BaseDatabaseModel::getInstance('Articles', 'ContentModel', array('ignore_request' => true));
		// Set application parameters in model
		$app = \Joomla\CMS\Factory::getApplication();
		$appParams = $app->getParams();
		$articles->setState('params', $appParams);
		$articles->setState('filter.published', 1);
		$articles->setState('filter.article_id', $item->slidearticleid);
		$items2 = $articles->getItems();
		$item->article = $items2[0];
		$item->article->text = \Joomla\CMS\HTML\HTMLHelper::_('content.prepare', $item->article->introtext);
		$item->article->text = self::truncate($item->article->text, $params->get('articlelength', '150'));
		// $item->article->text = \Joomla\CMS\HTML\HTMLHelper::_('string.truncate',$item->article->introtext,'150');
		// set the item link to the article depending on the user rights
		if ($access || in_array($item->article->access, $authorised)) {
			// We know that user has the privilege to view the article
			$item->slug = $item->article->id . ':' . $item->article->alias;
			$item->catslug = $item->article->catid ? $item->article->catid . ':' . $item->article->category_alias : $item->article->catid;
			$item->article->link = \Joomla\CMS\Router\Route::_(\Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($item->slug, $item->catslug));
		} else {
			$app = \Joomla\CMS\Factory::getApplication();
			$menu = $app->getMenu();
			$menuitems = $menu->getItems('link', 'index.php?option=com_users&view=login');
			if (isset($menuitems[0])) {
				$Itemid = $menuitems[0]->id;
			} elseif (JRequest::getInt('Itemid') > 0) {
				$Itemid = JRequest::getInt('Itemid');
			}
			$item->article->link = \Joomla\CMS\Router\Route::_('index.php?option=com_users&view=login&Itemid=' . $Itemid);
		}
		return $item;
	}

	/**
	 * Get a list of the items.
	 *
	 * @param	\Joomla\Registry\Registry	$params	The module options.
	 *
	 * @return	array
	 */
	static function getItemsFromfolder(&$params) {
		self::$_params = $params;
		$authorisedExt = array('png', 'jpg', 'JPG', 'JPEG', 'jpeg', 'bmp', 'tiff', 'gif');
		$items = json_decode(str_replace("|qq|", "\"", $params->get('slidesfromfolder')));
		foreach ($items as & $item) {
//			$item->imgname = str_replace(\Joomla\CMS\Uri\Uri::base(), '', $item->imgname);
			$item->imgthumb = '';
			$item->imgname = trim($item->imgname, '/');
			$item->imgname = trim($item->imgname, '\\');
			// create new images for mobile
			if ($params->get('usemobileimage', '0')) { 
				self::resizeImage($item->imgname, $params->get('mobileimageresolution', '640'), '', $params->get('mobileimageresolution', '640'), '');
			}
			if ($params->get('thumbnails', '1') == '1')
				$item->imgthumb = \Joomla\CMS\Uri\Uri::base(true) . '/' . self::resizeImage($item->imgname, $params->get('thumbnailwidth', '100'), $params->get('thumbnailheight', '75'));
			$thumbext = explode(".", $item->imgname);
			$thumbext = end($thumbext);
			// set the variables
			$item->imgvideo = null;
			$item->slideselect = null;
			$item->slideselect = null;
			$item->imgcaption = null;
			$item->article = null;
			$item->slidearticleid = null;
			$item->imgalignment = null;
			$item->imgtarget = 'default';
			$item->imgtime = null;
			$item->imglink = null;
			$item->imgtitle = null;

			if (!in_array(strToLower(\Joomla\CMS\Filesystem\File::getExt($item->imgname)), $authorisedExt))
				continue;

			// load the image data from txt
			$item = self::getImageDataFromfolder($item, $params);
			$item->imgname = \Joomla\CMS\Uri\Uri::base(true) . '/' . $item->imgname;
			
			// route the url
			if (strcasecmp(substr($item->imglink, 0, 4), 'http') && (strpos($item->imglink, 'index.php?') !== false)) {
				$item->imglink = \Joomla\CMS\Router\Route::_($item->imglink, true, false);
			} else {
				$item->imglink = \Joomla\CMS\Router\Route::_($item->imglink);
			}
		}

		return $items;
	}
	
	static function getItemsAutoloadfolder(&$params) {
		self::$_params = $params;
		$authorisedExt = array('png', 'jpg', 'JPG', 'JPEG', 'jpeg', 'bmp', 'tiff', 'gif');
		$folder = trim($params->get('autoloadfoldername'), '/');
		if (file_exists($folder . '/labels.txt')) {
			$items = self::loadImagesFromFolder($folder);
		} else {
			$items = \Joomla\CMS\Filesystem\Folder::files($folder, '.jpg|.png|.jpeg|.gif|.JPG|.JPEG|.jpeg', false, true);
			foreach ($items as $i => $name) {
				$item = new stdClass();
				// $item->imgname = str_replace(\Joomla\CMS\Uri\Uri::base(),'', $item->imgname);
				$item->imgthumb = '';
				$item->imgname = trim(str_replace('\\','/',$name), '/');
				$item->imgname = trim($item->imgname, '\\');
				// create new images for mobile
				if ($params->get('usemobileimage', '0')) { 
					self::resizeImage($item->imgname, $params->get('mobileimageresolution', '640'), '', $params->get('mobileimageresolution', '640'), '');
				}
				if ($params->get('thumbnails', '1') == '1')
					$item->imgthumb = \Joomla\CMS\Uri\Uri::base(true) . '/' . self::resizeImage($item->imgname, $params->get('thumbnailwidth', '100'), $params->get('thumbnailheight', '75'));
				$thumbext = explode(".", $item->imgname);
				$thumbext = end($thumbext);
				// set the variables
				$item->imgvideo = null;
				$item->slideselect = null;
				$item->slideselect = null;
				$item->imgcaption = null;
				$item->article = null;
				$item->slidearticleid = null;
				$item->imgalignment = null;
				$item->imgtarget = 'default';
				$item->imgtime = null;
				$item->imglink = null;
				$item->imgtitle = null;

				if (!in_array(strToLower(\Joomla\CMS\Filesystem\File::getExt($item->imgname)), $authorisedExt))
					continue;

				// load the image data from txt
				$item = self::getImageDataFromfolder($item, $params);
				$item->imgname = \Joomla\CMS\Uri\Uri::base(true) . '/' . $item->imgname;
				$items[$i] = $item;

				// route the url
				if (strcasecmp(substr($item->imglink, 0, 4), 'http') && (strpos($item->imglink, 'index.php?') !== false)) {
					$item->imglink = \Joomla\CMS\Router\Route::_($item->imglink, true, false);
				} else {
					$item->imglink = \Joomla\CMS\Router\Route::_($item->imglink);
				}
			}
		}
		return $items;
	}

	/*
	 * Load the image from the specified folder 
	 */
	public static function loadImagesFromFolder($directory) {

		// encode the folder path, needed if contains an accent
		try {
			$translatedDirectory = iconv("UTF-8", "ISO-8859-1//TRANSLIT", urldecode($directory));
			if ($translatedDirectory) $directory = $translatedDirectory;
		} catch (Exception $e) {
			echo 'CK Message : ',  $e->getMessage(), "\n";
		}

		// load the files from the folder
		$files = \Joomla\CMS\Filesystem\Folder::files(trim(trim($directory), '/'), '.', false, true);

		if (! $files) return 'CK message : No files found in the directory : ' . $directory;

		self::$imagesOrderByLabels = array();
		// load the labels from the folder
		self::getImageLabelsFromFolder($directory);

		$order = self::$_params->get('displayorder');
		// set the images order
		if ($order == 'shuffle') {
			shuffle($files);
		} else 
//			if(isset($params->order) && $params->order == 'labels') 
				{
			natsort($files);
			$files = array_map(array(__CLASS__, 'formatPath'), $files);
			$baseDir = self::formatPath($directory);
			$labelsOrder = array_reverse(self::$imagesOrderByLabels);
			foreach ($labelsOrder as $name) {
				$imgFile = $baseDir . '/' . $name;
				array_unshift($files, $imgFile);
			}
			// now make it unique
			$files = array_unique($files);
		} 
//		else {
//			natsort($files);
//		}

		$authorisedExt = array('png','jpg','jpeg','bmp','tiff','gif');
		$items = array();
		$i = 0;
		foreach ($files as $file) {
			$fileExt = \Joomla\CMS\Filesystem\File::getExt($file);
			if (!in_array(strToLower($fileExt),$authorisedExt)) continue;

			$item = new stdClass();
			// set the variables
			$item->imgvideo = null;
			$item->slideselect = null;
			$item->slideselect = null;
			$item->imgcaption = null;
			$item->article = null;
			$item->slidearticleid = null;
			$item->imgalignment = null;
			$item->imgtarget = 'default';
			$item->imgtime = null;
			$item->imglink = null;
			$item->imgtitle = null;

			// limit the number of images
//			if (isset($params->number) && $params->number > 0 && $i > (int)$params->number) $show = false;

			// get the data for the image
			$filedata = self::getImageDataFromfolder2($file, $directory);

			$file = str_replace("\\", "/", iconv('ISO-8859-1', 'UTF-8', $file));
			if (isset($filedata->link) && $filedata->link) {
				$item->imglink = $filedata->link;
			} else {
				$videoFile = str_replace($fileExt, 'mp4', $file);
				$hasVideo = file_exists($videoFile);
				$item->imglink = $hasVideo ? $videoFile : $file;
			}

			$item->imgname = \Joomla\CMS\Uri\Uri::base(true) . '/' . $file;
			$item->imgthumb = $item->imgname;
			$item->imgtitle = $filedata->title;
			$item->imgcaption = $filedata->desc;
			$item->imgvideo = $filedata->video;
//			$linktitle = $filedata->title || $filedata->desc ? ($filedata->desc ? $filedata->title . '::' . $filedata->desc : $filedata->title) : $title;

			$items[$i] = $item;
			$i++;
		}

		return $items;
	}

	/*
	 * Remove special character
	 */
	private static function cleanName($path) {
		return preg_replace('/[^a-z0-9]/i', '_', $path);
	}

	public static function formatPath($p) {
		return trim(str_replace("\\", "/", $p), "/");
	}

	private static function getImageLabelsFromFolder($directory) {
		$dirindex = self::cleanName($directory);
		if (! empty(self::$folderLabels[$dirindex])) return;

		$items = array();
		$item = new stdClass();

		// get the language
		$lang = \Joomla\CMS\Factory::getLanguage();
		$langtag = $lang->getTag(); // returns fr-FR or en-GB

		// load the image data from txt
		if (file_exists(JPATH_ROOT . '/' . $directory . '/labels.' . $langtag . '.txt')) {
			$data = file_get_contents(JPATH_ROOT . '/' . $directory . '/labels.' . $langtag . '.txt');
		} else if (file_exists(JPATH_ROOT . '/' . $directory . '/labels.txt')) {
			$data = file_get_contents(JPATH_ROOT . '/' . $directory . '/labels.txt');
		} else {
			return null;
		}

		$doUTF8encode = true;
		// remove UTF-8 BOM and normalize line endings
		if (!strcmp("\xEF\xBB\xBF", substr($data,0,3))) {  // file starts with UTF-8 BOM
			$data = substr($data, 3);  // remove UTF-8 BOM
			$doUTF8encode = false;
		}
		$data = str_replace("\r", "\n", $data);  // normalize line endings

		// if no data found, exit
		if(! $data) return null;

		// explode the file into rows
		// $imgdatatmp = explode("\n", $data);
		$imgdatatmp = preg_split("/\r\n|\n|\r/", $data, -1, PREG_SPLIT_NO_EMPTY);

		$parmsnumb = count($imgdatatmp);
		for ($i = 0; $i < $parmsnumb; $i++) {
			$imgdatatmp[$i] = trim($imgdatatmp[$i]);
			$line = explode('|', $imgdatatmp[$i]);

			// store the order or files from the TXT file
			self::$imagesOrderByLabels[] = $line[0];

			$item = new stdClass();
			$item->index = self::cleanName($line[0]);
			$item->title = (isset($line[1])) ? ( $doUTF8encode ? (iconv('ISO-8859-1', 'UTF-8', $line[1])) : ($line[1]) ) : '';
			$item->desc = (isset($line[2])) ? ( $doUTF8encode ? (iconv('ISO-8859-1', 'UTF-8', $line[2])) : ($line[2]) ) : '';
			$item->link = (isset($line[3])) ? ( $doUTF8encode ? (iconv('ISO-8859-1', 'UTF-8', $line[3])) : ($line[3]) ) : '';
			$item->video = (isset($line[4])) ? ( $doUTF8encode ? (iconv('ISO-8859-1', 'UTF-8', $line[4])) : ($line[4]) ) : '';

			$items[$item->index] = $item;
		}

		self::$folderLabels[$dirindex] = $items;
	}

	/*
	 * Load the data for the image (title and description)
	 */
	private static function getImageDataFromfolder2($file, $directory) {
		$filename = explode('/', $file);
		$filename = end($filename);
		$dirindex = self::cleanName($directory);
		$fileindex = self::cleanName($filename);

		if (! empty(self::$folderLabels[$dirindex]) && ! empty(self::$folderLabels[$dirindex][$fileindex])) {
				$item = self::$folderLabels[$dirindex][$fileindex];
		} else {
			$item = new stdClass();
			$item->title = null;
			$item->desc = null;
			$item->video = null;
			// old method, get image data from txt file with image name // TODO : remove
			// $item = self::getImageDataFromImageTxt($file)
		}

		return $item;
	}

	/**
	 * Get a list of the items.
	 *
	 * @param	\Joomla\Registry\Registry	$params	The module options.
	 *
	 * @return	array
	 */
	static function getItemsAutoloadflickr(&$params) {
		self::$_params = $params;

		$url = 'https://api.flickr.com/services/rest/?format=json&method=flickr.photosets.getPhotos&extras=description,original_format,url_sq,url_t,url_s,url_m,url_o&nojsoncallback=1';
		$url .= '&api_key=' . $params->get('flickr_apikey');
		$url .= '&photoset_id=' . $params->get('flickr_photoset');

		if (ini_get('allow_url_fopen') && function_exists('file_get_contents')) {  
			$result = file_get_contents($url);  
		}
		// look for curl
		if ($result == '' && extension_loaded('curl')) {
			$ch = curl_init();  
			$timeout = 30;  
			curl_setopt($ch, CURLOPT_URL, $url);  
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
			curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
			curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
			curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);  
			$result = curl_exec($ch);  
			curl_close($ch);  
		}

		$images = json_decode($result)->photoset->photo;
		$items = Array();
		$i = 0;
		$flickrSuffixes = array('o', 'k', 'h', 'b', 'z', 'sq', 't', 'sm', 'm');
		foreach ($images as & $image) {
			$items[$i] = new stdClass();
			$item = $items[$i];
			$suffix = 'o';
			foreach ($flickrSuffixes as $flickrSuffixe) {
				if (isset($image->{'url_' . $flickrSuffixe})) {
					$suffix = $flickrSuffixe;
					break;
				}
			}
			$item->imgname = $image->{'url_' . $suffix};
			$item->imgthumb = $item->imgname;
			// create new images for mobile
			// if ($params->get('usemobileimage', '0')) { 
				// self::resizeImage($item->imgname, $params->get('mobileimageresolution', '640'), '', $params->get('mobileimageresolution', '640'), '');
			// }
			// if ($params->get('thumbnails', '1') == '1')
				// $item->imgthumb = \Joomla\CMS\Uri\Uri::base(true) . '/' . self::resizeImage($item->imgname, $params->get('thumbnailwidth', '100'), $params->get('thumbnailheight', '75'));
			// $thumbext = explode(".", $item->imgname);
			// $thumbext = end($thumbext);
			// set the variables
			$item->imgvideo = null;
			$item->slideselect = null;
			$item->slideselect = null;
			$item->imgcaption = null;
			$item->article = null;
			$item->slidearticleid = null;
			$item->imgalignment = null;
			$item->imgtarget = 'default';
			$item->imgtime = null;
			$item->imglink = null;
			$item->imgtitle = null;

			// show the title and description of the image
			if ($params->get('flickr_showcaption', '1')) {
				$item->imgtitle = $image->title;
				$item->imgcaption = $image->description->_content;
			}

			// set the link to the image
			if ($params->get('flickr_autolink', '0')) {
				$item->imglink = $image->{'url_' . $suffix};
			}

			$i++;
		}

		return $items;
	}

	static function getItemsAutoloadarticlecategory(&$params) {
		$com_path = JPATH_SITE . '/components/com_content/';
		require_once $com_path . 'router.php';
		require_once $com_path . 'helpers/route.php';
		\Joomla\CMS\MVC\Model\BaseDatabaseModel::addIncludePath($com_path . '/models', 'ContentModel');
		// Get an instance of the generic articles model
		$articles = \Joomla\CMS\MVC\Model\BaseDatabaseModel::getInstance('Articles', 'ContentModel', array('ignore_request' => true));

		// Set application parameters in model
		$app = \Joomla\CMS\Factory::getApplication();
		$appParams = $app->getParams();
		$articles->setState('params', $appParams);

		// Set the filters based on the module params
		$articles->setState('list.start', 0);
//		$articles->setState('list.limit', (int) $params->get('count', 0)); // must check if the image exists
		$articles->setState('list.limit', 0);
		$articles->setState('filter.published', 1);

		// Access filter
		$access = !\Joomla\CMS\Component\ComponentHelper::getParams('com_content')->get('show_noauth');
		$authorised = \Joomla\CMS\Access\Access::getAuthorisedViewLevels(\Joomla\CMS\Factory::getUser()->get('id'));
		$articles->setState('filter.access', $access);

		// Prep for Normal or Dynamic Modes
		$mode = $params->get('mode', 'normal');
		switch ($mode)
		{
			case 'dynamic':
				$option = JRequest::getCmd('option');
				$view = JRequest::getCmd('view');
				if ($option === 'com_content') {
					switch($view)
					{
						case 'category':
							$catids = array(JRequest::getInt('id'));
							break;
						case 'categories':
							$catids = array(JRequest::getInt('id'));
							break;
						case 'article':
							if ($params->get('show_on_article_page', 1)) {
								$article_id = JRequest::getInt('id');
								$catid = JRequest::getInt('catid');

								if (!$catid) {
									// Get an instance of the generic article model
									$article = \Joomla\CMS\MVC\Model\BaseDatabaseModel::getInstance('Article', 'ContentModel', array('ignore_request' => true));

									$article->setState('params', $appParams);
									$article->setState('filter.published', 1);
									$article->setState('article.id', (int) $article_id);
									$item = $article->getItem();

									$catids = array($item->catid);
								}
								else {
									$catids = array($catid);
								}
							}
							else {
								// Return right away if show_on_article_page option is off
								return;
							}
							break;

						case 'featured':
						default:
							// Return right away if not on the category or article views
							return;
					}
				}
				else {
					// Return right away if not on a com_content page
					return;
				}

				break;

			case 'normal':
			default:
				$catids = $params->get('catid');
				$articles->setState('filter.category_id.include', (bool) $params->get('category_filtering_type', 1));
				break;
		}

		// Category filter
		if ($catids) {
			if ($params->get('show_child_category_articles', 0) && (int) $params->get('levels', 0) > 0) {
				// Get an instance of the generic categories model
				$categories = \Joomla\CMS\MVC\Model\BaseDatabaseModel::getInstance('Categories', 'ContentModel', array('ignore_request' => true));
				$categories->setState('params', $appParams);
				$levels = $params->get('levels', 1) ? $params->get('levels', 1) : 9999;
				$categories->setState('filter.get_children', $levels);
				$categories->setState('filter.published', 1);
				$categories->setState('filter.access', $access);
				$additional_catids = array();

				foreach($catids as $catid)
				{
					$categories->setState('filter.parentId', $catid);
					$recursive = true;
					$items = $categories->getItems($recursive);

					if ($items)
					{
						foreach($items as $category)
						{
							$condition = (($category->level - $categories->getParent()->level) <= $levels);
							if ($condition) {
								$additional_catids[] = $category->id;
							}

						}
					}
				}

				$catids = array_unique(array_merge($catids, $additional_catids));
			}

			$articles->setState('filter.category_id', $catids);
		}

		// Ordering
		$articles->setState('list.ordering', $params->get('article_ordering', 'a.ordering'));
		$articles->setState('list.direction', $params->get('article_ordering_direction', 'ASC'));

		// New Parameters
		$articles->setState('filter.featured', $params->get('show_front', 'show'));
//		$articles->setState('filter.author_id', $params->get('created_by', ""));
//		$articles->setState('filter.author_id.include', $params->get('author_filtering_type', 1));
//		$articles->setState('filter.author_alias', $params->get('created_by_alias', ""));
//		$articles->setState('filter.author_alias.include', $params->get('author_alias_filtering_type', 1));
		$excluded_articles = $params->get('excluded_articles', '');

		if ($excluded_articles) {
			$excluded_articles = explode("\r\n", $excluded_articles);
			$articles->setState('filter.article_id', $excluded_articles);
			$articles->setState('filter.article_id.include', false); // Exclude
		}

		$date_filtering = $params->get('date_filtering', 'off');
		if ($date_filtering !== 'off') {
			$articles->setState('filter.date_filtering', $date_filtering);
			$articles->setState('filter.date_field', $params->get('date_field', 'a.created'));
			$articles->setState('filter.start_date_range', $params->get('start_date_range', '1000-01-01 00:00:00'));
			$articles->setState('filter.end_date_range', $params->get('end_date_range', '9999-12-31 23:59:59'));
			$articles->setState('filter.relative_date', $params->get('relative_date', 30));
		}

		// Filter by language
		$articles->setState('filter.language', $app->getLanguageFilter());

		$items = $articles->getItems();

		// Display options
		$show_date = $params->get('show_date', 0);
		$show_date_field = $params->get('show_date_field', 'created');
		$show_date_format = $params->get('show_date_format', 'Y-m-d H:i:s');
		$show_category = $params->get('show_category', 0);
		$show_hits = $params->get('show_hits', 0);
		$show_author = $params->get('show_author', 0);
		$show_introtext = $params->get('show_introtext', 0);
		$introtext_limit = $params->get('introtext_limit', 100);

		// Find current Article ID if on an article page
		$option = JRequest::getCmd('option');
		$view = JRequest::getCmd('view');

		if ($option === 'com_content' && $view === 'article') {
			$active_article_id = JRequest::getInt('id');
		}
		else {
			$active_article_id = 0;
		}

		// Prepare data for display using display options
		$slideItems = Array();
		foreach ($items as &$item)
		{
			$item->slug = $item->id.':'.$item->alias;
			$item->catslug = $item->catid ? $item->catid .':'.$item->category_alias : $item->catid;

			if ($access || in_array($item->access, $authorised)) {
				// We know that user has the privilege to view the article
				$item->link = \Joomla\CMS\Router\Route::_(\Joomla\Component\Content\Site\Helper\RouteHelper::getArticleRoute($item->slug, $item->catslug));
			}
			 else {
				// Angie Fixed Routing
				$app	= \Joomla\CMS\Factory::getApplication();
				$menu	= $app->getMenu();
				$menuitems	= $menu->getItems('link', 'index.php?option=com_users&view=login');
				if(isset($menuitems[0])) {
						$Itemid = $menuitems[0]->id;
					} elseif (JRequest::getInt('Itemid') > 0) { //use Itemid from requesting page only if there is no existing menu
						$Itemid = JRequest::getInt('Itemid');
					}

				$item->link = \Joomla\CMS\Router\Route::_('index.php?option=com_users&view=login&Itemid='.$Itemid);
			}

			// Used for styling the active article
			$item->active = $item->id == $active_article_id ? 'active' : '';

			$item->displayDate = '';
			if ($show_date) {
				$item->displayDate = \Joomla\CMS\HTML\HTMLHelper::_('date', $item->$show_date_field, $show_date_format);
			}

			if ($item->catid) {
				$item->displayCategoryLink = \Joomla\CMS\Router\Route::_(\Joomla\Component\Content\Site\Helper\RouteHelper::getCategoryRoute($item->catid));
				$item->displayCategoryTitle = $show_category ? '<a href="'.$item->displayCategoryLink.'">'.$item->category_title.'</a>' : '';
			}
			else {
				$item->displayCategoryTitle = $show_category ? $item->category_title : '';
			}

			$item->displayHits = $show_hits ? $item->hits : '';
			$item->displayAuthorName = $show_author ? $item->author : '';
//			if ($show_introtext) {
//				$item->introtext = \Joomla\CMS\HTML\HTMLHelper::_('content.prepare', $item->introtext, '', 'mod_articles_category.content');
//				$item->introtext = self::_cleanIntrotext($item->introtext);
//			}
			$item->displayIntrotext = $show_introtext ? self::truncate($item->introtext, $introtext_limit) : '';
			$item->displayReadmore = $item->alternative_readmore;
			
			// add the article to the slide
			$registry = new \Joomla\Registry\Registry;
			$registry->loadString($item->images);
			$item->images = $registry->toArray();
			$article_image  =false;
			$slideItem_article_text = '';
			switch ($params->get('articleimgsource', 'introimage')) {
				case 'firstimage':
					$search_images = preg_match('/<img(.*?)src="(.*?)"(.*?)\/>/is', $item->introtext, $imgresult);
					$article_image = (isset($imgresult[2]) && $imgresult[2] != '') ? $imgresult[2] : false;
					$slideItem_article_text = (isset($imgresult[2])) ? str_replace($imgresult[0], '', $item->introtext) : $item->introtext;
					break;
				case 'fullimage':
					$article_image = (isset($item->images['image_fulltext']) && $item->images['image_fulltext']) ? $item->images['image_fulltext'] : false;
					$slideItem_article_text = $item->introtext;
					break;
				case 'introimage':
				default:
					$article_image = (isset($item->images['image_intro']) && $item->images['image_intro']) ? $item->images['image_intro'] : false;
					$slideItem_article_text = $item->introtext;
					break;
			}
			
			if ( $article_image
					 && (count($slideItems) < (int) $params->get('count', 0) || (int) $params->get('count', 0) == 0)) {
				$slideItem = new stdClass();
				$slideItem->imgname = $article_image;
//				$slideItem->imgname = trim(str_replace('\\', '/', $item->images['image_intro']), '/');
				$slideItem->imgname = trim($slideItem->imgname, '\\');
				$slideItem->imgthumb = \Joomla\CMS\Uri\Uri::base(true) . '/' . $slideItem->imgname;
				$slideItem->imgname = \Joomla\CMS\Uri\Uri::base(true) . '/' . $slideItem->imgname;
				$slideItem->imgvideo = null;
				$slideItem->slideselect = null;
				$slideItem->imgcaption = null;
				$slideItem->article = new stdClass();
				$slideItem->slidearticleid = null;
				$slideItem->imgalignment = null;
				$slideItem->imgtarget = 'default';
				$slideItem->imgtime = null;
				$slideItem->imglink = null;
				$slideItem->imgtitle = null;
				$slideItem->article->title = $item->title;
				$slideItem->article->text = \Joomla\CMS\HTML\HTMLHelper::_('content.prepare', $slideItem_article_text);
				if ($params->get('striptags', '0') == '1') {
					$slideItem->article->text = strip_tags($slideItem->article->text);
				}
				$slideItem->article->text = self::truncate($slideItem->article->text, $params->get('articlelength', '150'));
				$slideItem->article->link = $item->link;
				
				$slideItems[] = $slideItem;
			}
		}

		return $slideItems;
	}

	static function getImageDataFromfolder(&$item, $params) {
		$item->imgvideo = null;
		$item->slideselect = null;
		$item->imgcaption = null;
		$item->article = null;
		$item->imgalignment = null;
		$item->imgtarget = 'default';
		$item->imgtime = null;
		$item->imglink = null;
		// load the image data from txt
		$datafile = JPATH_ROOT . '/' . str_replace(\Joomla\CMS\Filesystem\File::getExt($item->imgname), 'txt', $item->imgname);
		$data = \Joomla\CMS\Filesystem\File::exists($datafile) ? file_get_contents($datafile) : '';
		$imgdatatmp = explode("\n", $data);

		$parmsnumb = count($imgdatatmp);
		for ($i = 0; $i < $parmsnumb; $i++) {
			$imgdatatmp[$i] = trim($imgdatatmp[$i]);
			$item->imgcaption = stristr($imgdatatmp[$i], "caption=") ? str_replace('caption=', '', $imgdatatmp[$i]) : $item->imgcaption;
			$item->slidearticleid = stristr($imgdatatmp[$i], "articleid=") ? str_replace('articleid=', '', $imgdatatmp[$i]) : $item->slidearticleid;
			$item->imgvideo = stristr($imgdatatmp[$i], "video=") ? str_replace('video=', '', $imgdatatmp[$i]) : $item->imgvideo;
			$item->imglink = stristr($imgdatatmp[$i], "link=") ? str_replace('link=', '', $imgdatatmp[$i]) : $item->imglink;
			$item->imgtime = stristr($imgdatatmp[$i], "time=") ? str_replace('time=', '', $imgdatatmp[$i]) : $item->imgtime;
			$item->imgtarget = stristr($imgdatatmp[$i], "target=") ? str_replace('target=', '', $imgdatatmp[$i]) : $item->imgtarget;
		}

		if ($item->imgvideo)
			$item->slideselect = 'video';
		
		// manage the title and description
		if (stristr($item->imgcaption, "||")) {
			$splitcaption = explode("||", $item->imgcaption);
			$item->imgcaption = '<div class="slideshowck_title">' . $splitcaption[0] . '</div><div class="slideshowck_description">' . $splitcaption[1] . '</div>';
		}

		if (isset($item->slidearticleid) && $item->slidearticleid) {
			$item = self::getArticle($item, $params);
		}

		return $item;
	}

	/**
	 * Set the correct video link
	 *
	 * $videolink string the video path
	 *
	 * @return string the new video path
	 */
	static function setVideolink($videolink) {
		// youtube
		if (stristr($videolink, 'youtu.be')) {
			$videolink = str_replace('youtu.be', 'www.youtube.com/embed', $videolink);
		} else if (stristr($videolink, 'www.youtube.com') AND !stristr($videolink, 'embed')) {
			$videolink = str_replace('youtube.com', 'youtube.com/embed', $videolink);
		}

		$videolink .= ( stristr($videolink, '?')) ? '&wmode=transparent' : '?wmode=transparent';

		return $videolink;
	}

	/**
	 * Create the list of all modules published as Object
	 *
	 * $file string the image path
	 * $x integer the new image width
	 * $y integer the new image height
	 *
	 * @return Boolean True on Success
	 */
	static function resizeImage($file, $x, $y = '', $thumbpath = 'th', $thumbsuffix = '_th') {

		if (!$file)
			return;

		$params = self::$_params;
		if (!$params->get('autocreatethumbs','1'))
			return;
			
		$thumbext = explode(".", $file);
		$thumbext = end($thumbext);
		$thumbfile = str_replace(\Joomla\CMS\Filesystem\File::getName($file), $thumbpath . "/" . \Joomla\CMS\Filesystem\File::getName($file), $file);
		$thumbfile = str_replace("." . $thumbext, $thumbsuffix . "." . $thumbext, $thumbfile);
		
		$filetmp = JPATH_ROOT . '/' . $file;
		$filetmp = str_replace("%20", " ", $filetmp);
		if (!Jfile::exists($filetmp))
			return;
		$size = getimagesize($filetmp);

		if ($size[0] > $size[1]) // paysage
		{
			$y = $x * $size[1] / $size[0];
		} else 
		{
//			$tmpx = $x;
//			$x = $y;
//			$y = $tmpx * $size[0] / $size[1];
			$x = $y * $size[0] / $size[1];
		}

		
		if ($size) {
			if (\Joomla\CMS\Filesystem\File::exists($thumbfile)) {
				return $thumbfile;
				// $thumbsize = getimagesize(JPATH_ROOT . '/' . $thumbfile);
				// if ($thumbsize[0] == $x || $thumbsuffix == '') {
					// return $thumbfile;
				// }
			}
			
			$thumbfolder = str_replace(\Joomla\CMS\Filesystem\File::getName($file), $thumbpath . "/", $filetmp);
			if (!\Joomla\CMS\Filesystem\Folder::exists($thumbfolder)) { 
				\Joomla\CMS\Filesystem\Folder::create($thumbfolder);
				\Joomla\CMS\Filesystem\File::copy(JPATH_ROOT . '/modules/mod_slideshowck/index.html', $thumbfolder . 'index.html' );
			}

			if ($size['mime'] == 'image/jpeg') {
				$img_big = imagecreatefromjpeg($filetmp); # On ouvre l'image d'origine
				$img_new = imagecreate($x, $y);
				# création de la miniature
				$img_mini = imagecreatetruecolor($x, $y) or $img_mini = imagecreate($x, $y);
				// copie de l'image, avec le redimensionnement.
				imagecopyresized($img_mini, $img_big, 0, 0, 0, 0, $x, $y, $size[0], $size[1]);

				imagejpeg($img_mini, JPATH_ROOT . '/' . $thumbfile);
			} elseif ($size['mime'] == 'image/png') {
				$img_big = imagecreatefrompng($filetmp); # On ouvre l'image d'origine
				$img_new = imagecreate($x, $y);
				# création de la miniature
				$img_mini = imagecreatetruecolor($x, $y) or $img_mini = imagecreate($x, $y);
				// copie de l'image, avec le redimensionnement.
				imagecopyresized($img_mini, $img_big, 0, 0, 0, 0, $x, $y, $size[0], $size[1]);

				imagepng($img_mini, JPATH_ROOT . '/' . $thumbfile);
			} elseif ($size['mime'] == 'image/gif') {
				$img_big = imagecreatefromgif($filetmp); # On ouvre l'image d'origine
				$img_new = imagecreate($x, $y);
				# création de la miniature
				$img_mini = imagecreatetruecolor($x, $y) or $img_mini = imagecreate($x, $y);
				// copie de l'image, avec le redimensionnement.
				imagecopyresized($img_mini, $img_big, 0, 0, 0, 0, $x, $y, $size[0], $size[1]);

				imagegif($img_mini, JPATH_ROOT . '/' . $thumbfile);
			}
			//echo 'Image redimensionnée !';
		}

		return $thumbfile;
	}

	/**
	 * Create the css
	 *
	 * $params \Joomla\Registry\Registry the module params
	 * $prefix integer the prefix of the params
	 *
	 * @return Array of css
	 */
	static function createCss($params, $prefix = 'menu') {
		$css = Array();
		$csspaddingtop = ($params->get($prefix . 'paddingtop') AND $params->get($prefix . 'usemargin')) ? 'padding-top: ' . self::testUnit($params->get($prefix . 'paddingtop', '0')) . ';' : '';
		$csspaddingright = ($params->get($prefix . 'paddingright') AND $params->get($prefix . 'usemargin')) ? 'padding-right: ' . self::testUnit($params->get($prefix . 'paddingright', '0')) . ';' : '';
		$csspaddingbottom = ($params->get($prefix . 'paddingbottom') AND $params->get($prefix . 'usemargin') ) ? 'padding-bottom: ' . self::testUnit($params->get($prefix . 'paddingbottom', '0')) . ';' : '';
		$csspaddingleft = ($params->get($prefix . 'paddingleft') AND $params->get($prefix . 'usemargin')) ? 'padding-left: ' . self::testUnit($params->get($prefix . 'paddingleft', '0')) . ';' : '';
		$css['padding'] = $csspaddingtop . $csspaddingright . $csspaddingbottom . $csspaddingleft;
		$cssmargintop = ($params->get($prefix . 'margintop') AND $params->get($prefix . 'usemargin')) ? 'margin-top: ' . self::testUnit($params->get($prefix . 'margintop', '0')) . ';' : '';
		$cssmarginright = ($params->get($prefix . 'marginright') AND $params->get($prefix . 'usemargin')) ? 'margin-right: ' . self::testUnit($params->get($prefix . 'marginright', '0')) . ';' : '';
		$cssmarginbottom = ($params->get($prefix . 'marginbottom') AND $params->get($prefix . 'usemargin')) ? 'margin-bottom: ' . self::testUnit($params->get($prefix . 'marginbottom', '0')) . ';' : '';
		$cssmarginleft = ($params->get($prefix . 'marginleft') AND $params->get($prefix . 'usemargin')) ? 'margin-left: ' . self::testUnit($params->get($prefix . 'marginleft', '0')) . ';' : '';
		$css['margin'] = $cssmargintop . $cssmarginright . $cssmarginbottom . $cssmarginleft;
		$bgcolor1 = ($params->get($prefix . 'bgcolor1') && $params->get($prefix . 'bgopacity')) ? self::hex2RGB($params->get($prefix . 'bgcolor1'), $params->get($prefix . 'bgopacity')) : $params->get($prefix . 'bgcolor1');
		$css['background'] = '';
		if ($params->get($prefix . 'bgopacity') == '0' AND $params->get($prefix . 'usebackground')) {
			$css['background'] = 'background: transparent;';
		} else if ($params->get($prefix . 'bgcolor1') AND $params->get($prefix . 'usebackground')) {
			$css['background'] = 'background: ' . $bgcolor1 . ';';
		}
//		$css['background'] = ($params->get($prefix . 'bgcolor1') AND $params->get($prefix . 'usebackground')) ? 'background: ' . $bgcolor1 . ';' : '';
		$css['background'] .= ( $params->get($prefix . 'bgimage') AND $params->get($prefix . 'usebackground')) ? 'background-image: url("' . \Joomla\CMS\Uri\Uri::ROOT() . $params->get($prefix . 'bgimage') . '");' : '';
		$css['background'] .= ( $params->get($prefix . 'bgimage') AND $params->get($prefix . 'usebackground')) ? 'background-repeat: ' . $params->get($prefix . 'bgimagerepeat') . ';' : '';
		$css['background'] .= ( $params->get($prefix . 'bgimage') AND $params->get($prefix . 'usebackground')) ? 'background-position: ' . $params->get($prefix . 'bgpositionx') . ' ' . $params->get($prefix . 'bgpositiony') . ';' : '';
		$css['gradient'] = ($css['background'] AND $params->get($prefix . 'bgcolor2') AND $params->get($prefix . 'usegradient')) ?
				"background: -moz-linear-gradient(top,  " . $params->get($prefix . 'bgcolor1', '#f0f0f0') . " 0%, " . $params->get($prefix . 'bgcolor2', '#e3e3e3') . " 100%);"
				. "background: -webkit-gradient(linear, left top, left bottom, color-stop(0%," . $params->get($prefix . 'bgcolor1', '#f0f0f0') . "), color-stop(100%," . $params->get($prefix . 'bgcolor2', '#e3e3e3') . ")); "
				. "background: -webkit-linear-gradient(top,  " . $params->get($prefix . 'bgcolor1', '#f0f0f0') . " 0%," . $params->get($prefix . 'bgcolor2', '#e3e3e3') . " 100%);"
				. "background: -o-linear-gradient(top,  " . $params->get($prefix . 'bgcolor1', '#f0f0f0') . " 0%," . $params->get($prefix . 'bgcolor2', '#e3e3e3') . " 100%);"
				. "background: -ms-linear-gradient(top,  " . $params->get($prefix . 'bgcolor1', '#f0f0f0') . " 0%," . $params->get($prefix . 'bgcolor2', '#e3e3e3') . " 100%);"
				. "background: linear-gradient(top,  " . $params->get($prefix . 'bgcolor1', '#f0f0f0') . " 0%," . $params->get($prefix . 'bgcolor2', '#e3e3e3') . " 100%); "
				. "filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='" . $params->get($prefix . 'bgcolor1', '#f0f0f0') . "', endColorstr='" . $params->get($prefix . 'bgcolor2', '#e3e3e3') . "',GradientType=0 );" : '';
		$css['borderradius'] = ($params->get($prefix . 'useroundedcorners')) ?
				'-moz-border-radius: ' . $params->get($prefix . 'roundedcornerstl', '0') . 'px ' . $params->get($prefix . 'roundedcornerstr', '0') . 'px ' . $params->get($prefix . 'roundedcornersbr', '0') . 'px ' . $params->get($prefix . 'roundedcornersbl', '0') . 'px;'
				. '-webkit-border-radius: ' . $params->get($prefix . 'roundedcornerstl', '0') . 'px ' . $params->get($prefix . 'roundedcornerstr', '0') . 'px ' . $params->get($prefix . 'roundedcornersbr', '0') . 'px ' . $params->get($prefix . 'roundedcornersbl', '0') . 'px;'
				. 'border-radius: ' . $params->get($prefix . 'roundedcornerstl', '0') . 'px ' . $params->get($prefix . 'roundedcornerstr', '0') . 'px ' . $params->get($prefix . 'roundedcornersbr', '0') . 'px ' . $params->get($prefix . 'roundedcornersbl', '0') . 'px;' : '';
		$shadowinset = $params->get($prefix . 'shadowinset', 0) ? 'inset ' : '';
		$css['shadow'] = ($params->get($prefix . 'shadowcolor') AND $params->get($prefix . 'shadowblur') AND $params->get($prefix . 'useshadow')) ?
				'-moz-box-shadow: ' . $shadowinset . $params->get($prefix . 'shadowoffsetx', '0') . 'px ' . $params->get($prefix . 'shadowoffsety', '0') . 'px ' . $params->get($prefix . 'shadowblur', '') . 'px ' . $params->get($prefix . 'shadowspread', '0') . 'px ' . $params->get($prefix . 'shadowcolor', '') . ';'
				. '-webkit-box-shadow: ' . $shadowinset . $params->get($prefix . 'shadowoffsetx', '0') . 'px ' . $params->get($prefix . 'shadowoffsety', '0') . 'px ' . $params->get($prefix . 'shadowblur', '') . 'px ' . $params->get($prefix . 'shadowspread', '0') . 'px ' . $params->get($prefix . 'shadowcolor', '') . ';'
				. 'box-shadow: ' . $shadowinset . $params->get($prefix . 'shadowoffsetx', '0') . 'px ' . $params->get($prefix . 'shadowoffsety', '0') . 'px ' . $params->get($prefix . 'shadowblur', '') . 'px ' . $params->get($prefix . 'shadowspread', '0') . 'px ' . $params->get($prefix . 'shadowcolor', '') . ';' : '';
		$css['border'] = ($params->get($prefix . 'bordercolor') AND $params->get($prefix . 'borderwidth') AND $params->get($prefix . 'useborders')) ?
				'border: ' . $params->get($prefix . 'bordercolor', '#efefef') . ' ' . $params->get($prefix . 'borderwidth', '1') . 'px solid;' : '';
		$css['fontsize'] = ($params->get($prefix . 'usefont') AND $params->get($prefix . 'fontsize')) ?
				'font-size: ' . $params->get($prefix . 'fontsize') . ';' : '';
		$css['fontcolor'] = ($params->get($prefix . 'usefont') AND $params->get($prefix . 'fontcolor')) ?
				'color: ' . $params->get($prefix . 'fontcolor') . ';' : '';
		$css['fontweight'] = ($params->get($prefix . 'usefont') AND $params->get($prefix . 'fontweight')) ?
				'font-weight: ' . $params->get($prefix . 'fontweight') . ';' : '';
		/* $css['fontcolorhover'] = ($params->get($prefix . 'usefont') AND $params->get($prefix . 'fontcolorhover')) ?
		  'color: ' . $params->get($prefix . 'fontcolorhover') . ';' : ''; */
		$css['descfontsize'] = ($params->get($prefix . 'usefont') AND $params->get($prefix . 'descfontsize')) ?
				'font-size: ' . $params->get($prefix . 'descfontsize') . ';' : '';
		$css['descfontcolor'] = ($params->get($prefix . 'usefont') AND $params->get($prefix . 'descfontcolor')) ?
				'color: ' . $params->get($prefix . 'descfontcolor') . ';' : '';
		return $css;
	}

	/**
	 * Truncates text blocks over the specified character limit and closes
	 * all open HTML tags. The method will optionally not truncate an individual
	 * word, it will find the first space that is within the limit and
	 * truncate at that point. This method is UTF-8 safe.
	 *
	 * @param   string   $text       The text to truncate.
	 * @param   integer  $length     The maximum length of the text.
	 * @param   boolean  $noSplit    Don't split a word if that is where the cutoff occurs (default: true).
	 * @param   boolean  $allowHtml  Allow HTML tags in the output, and close any open tags (default: true).
	 *
	 * @return  string   The truncated text.
	 *
	 * @since   11.1
	 */
	public static function truncate($text, $length = 0, $noSplit = true, $allowHtml = true) {
		if ($length == 0) return '';
		// Check if HTML tags are allowed.
		if (!$allowHtml) {
			// Deal with spacing issues in the input.
			$text = str_replace('>', '> ', $text);
			$text = str_replace(array('&nbsp;', '&#160;'), ' ', $text);
			$text = JString::trim(preg_replace('#\s+#mui', ' ', $text));

			// Strip the tags from the input and decode entities.
			$text = strip_tags($text);
			$text = html_entity_decode($text, ENT_QUOTES, 'UTF-8');

			// Remove remaining extra spaces.
			$text = str_replace('&nbsp;', ' ', $text);
			$text = JString::trim(preg_replace('#\s+#mui', ' ', $text));
		}

		// Truncate the item text if it is too long.
		if ($length > 0 && JString::strlen($text) > $length) {
			// Find the first space within the allowed length.
			$tmp = JString::substr($text, 0, $length);

			if ($noSplit) {
				$offset = JString::strrpos($tmp, ' ');
				if (JString::strrpos($tmp, '<') > JString::strrpos($tmp, '>')) {
					$offset = JString::strrpos($tmp, '<');
				}
				$tmp = JString::substr($tmp, 0, $offset);

				// If we don't have 3 characters of room, go to the second space within the limit.
				if (JString::strlen($tmp) > $length - 3) {
					$tmp = JString::substr($tmp, 0, JString::strrpos($tmp, ' '));
				}
			}

			if ($allowHtml) {
				// Put all opened tags into an array
				preg_match_all("#<([a-z][a-z0-9]*)\b.*?(?!/)>#i", $tmp, $result);
				$openedTags = $result[1];
				$openedTags = array_diff($openedTags, array("img", "hr", "br"));
				$openedTags = array_values($openedTags);

				// Put all closed tags into an array
				preg_match_all("#</([a-z]+)>#iU", $tmp, $result);
				$closedTags = $result[1];

				$numOpened = count($openedTags);

				// All tags are closed
				if (count($closedTags) == $numOpened) {
					return $tmp . '...';
				}
				$tmp .= '...';
				$openedTags = array_reverse($openedTags);

				// Close tags
				for ($i = 0; $i < $numOpened; $i++) {
					if (!in_array($openedTags[$i], $closedTags)) {
						$tmp .= "</" . $openedTags[$i] . ">";
					} else {
						unset($closedTags[array_search($openedTags[$i], $closedTags)]);
					}
				}
			}

			$text = $tmp;
		}

		return $text;
	}
	
	/**
	 * Convert a hexa decimal color code to its RGB equivalent
	 *
	 * @param string $hexStr (hexadecimal color value)
	 * @param boolean $returnAsString (if set true, returns the value separated by the separator character. Otherwise returns associative array)
	 * @param string $seperator (to separate RGB values. Applicable only if second parameter is true.)
	 * @return array or string (depending on second parameter. Returns False if invalid hex color value)
	 */
	static function hex2RGB($hexStr, $opacity) {
		if (!stristr($opacity, '.'))
			$opacity = $opacity / 100;
		$hexStr = preg_replace("/[^0-9A-Fa-f]/", '', $hexStr); // Gets a proper hex string
		$rgbArray = array();
		if (strlen($hexStr) == 6) { //If a proper hex code, convert using bitwise operation. No overhead... faster
			$colorVal = hexdec($hexStr);
			$rgbArray['red'] = 0xFF & ($colorVal >> 0x10);
			$rgbArray['green'] = 0xFF & ($colorVal >> 0x8);
			$rgbArray['blue'] = 0xFF & $colorVal;
		} elseif (strlen($hexStr) == 3) { //if shorthand notation, need some string manipulations
			$rgbArray['red'] = hexdec(str_repeat(substr($hexStr, 0, 1), 2));
			$rgbArray['green'] = hexdec(str_repeat(substr($hexStr, 1, 1), 2));
			$rgbArray['blue'] = hexdec(str_repeat(substr($hexStr, 2, 1), 2));
		} else {
			return false; //Invalid hex color code
		}
		$rgbacolor = "rgba(" . $rgbArray['red'] . "," . $rgbArray['green'] . "," . $rgbArray['blue'] . "," . $opacity . ")";

		return $rgbacolor;
	}

	/**
	 * Test if there is already a unit, else add the px
	 *
	 * @param string $value
	 * @return string
	 */
	static function testUnit($value) {
		if ((stristr($value, 'px')) OR (stristr($value, 'em')) OR (stristr($value, '%'))) {
			return $value;
		}

		if ($value == '') {
			$value = 0;
		}

		return $value . 'px';
	}

	/*
	 * Make empty slide object
	 */
	public static function initItem() {
		$item = new stdClass();
		$item->imgname = null;
		$item->imgthumb = null;
		$item->imgvideo = null;
		$item->slideselect = null;
		$item->imgcaption = null;
		$item->article = new stdClass();
		$item->slidearticleid = null;
		$item->imgalignment = null;
		$item->imgtarget = 'default';
		$item->imgtime = null;
		$item->imglink = null;
		$item->imgtitle = null;
		$item->article->title = null;
		$item->article->text = null;

		return $item;
	}

	/**
	 * Get a subtring with the max word setting
	 *
	 * @param string $text;
	 * @param int $length limit characters showing;
	 * @param string $replacer;
	 * @return tring;
	 */

	public static function substrword($text, $length = 100, $replacer = '...', $isStrips = true, $stringtags = '') {
		if($isStrips){
			$text = preg_replace('/\<p.*\>/Us','',$text);
			$text = str_replace('</p>','<br/>',$text);
			$text = strip_tags($text, $stringtags);
		}
		$tmp = explode(" ", $text);

		if (count($tmp) < $length)
			return $text;

		$text = implode(" ", array_slice($tmp, 0, $length)) . $replacer;

		return $text;
	}

	/**
	 * Get a subtring with the max length setting.
	 *
	 * @param string $text;
	 * @param int $length limit characters showing;
	 * @param string $replacer;
	 * @return tring;
	 */
	public static function substring($text, $length = 100, $replacer = '...', $isStrips = true, $stringtags = '') {
	
		if($isStrips){
			$text = preg_replace('/\<p.*\>/Us','',$text);
			$text = str_replace('</p>','<br/>',$text);
			$text = strip_tags($text, $stringtags);
		}
		
		if(function_exists('mb_strlen')){
			if (mb_strlen($text) < $length)	return $text;
			$text = mb_substr($text, 0, $length);
		}else{
			if (strlen($text) < $length)	return $text;
			$text = substr($text, 0, $length);
		}
		
		return $text . $replacer;
	}
}
components/com_slideshowck/extensions/mod_slideshowck/legacy.php000060400000007121152453623440021445 0ustar00<?php

/**
 * @copyright	Copyright (C) 2012-2019 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * Module Slideshow CK
 * @license		GNU/GPL
 * */
// no direct access
defined('_JEXEC') or die;

if ($params->get('slideshowckhikashop_enable', '0') == '1') {
	if (\Joomla\CMS\Filesystem\File::exists(JPATH_ROOT . '/plugins/system/slideshowckhikashop/helper/helper_slideshowckhikashop.php')) {
		require_once JPATH_ROOT . '/plugins/system/slideshowckhikashop/helper/helper_slideshowckhikashop.php';
		$items = modSlideshowckhikashopHelper::getItems($params);
	} else {
		echo '<p style="color:red;font-weight:bold;">File /plugins/system/slideshowckhikashop/helper/helper_slideshowckhikashop.php not found ! Please download the patch for Slideshow CK - Hikashop on <a href="https://www.joomlack.fr">https://www.joomlack.fr</a></p>';
		return false;
	}
} else if ($params->get('slideshowckjoomgallery_enable', '0') == '1') {
	if (\Joomla\CMS\Filesystem\File::exists(JPATH_ROOT . '/plugins/system/slideshowckjoomgallery/helper/helper_slideshowckjoomgallery.php')) {
		require_once JPATH_ROOT . '/plugins/system/slideshowckjoomgallery/helper/helper_slideshowckjoomgallery.php';
		$items = modSlideshowckjoomgalleryHelper::getItems($params);
	} else {
		echo '<p style="color:red;font-weight:bold;">File /plugins/system/slideshowckjoomgallery/helper/helper_slideshowckjoomgallery.php not found ! Please download the patch for Slideshow CK - Joomgallery on <a href="https://www.joomlack.fr">https://www.joomlack.fr</a></p>';
		return false;
	}
} else if ($params->get('slideshowckvirtuemart_enable', '0') == '1') {
	if (\Joomla\CMS\Filesystem\File::exists(JPATH_ROOT . '/plugins/system/slideshowckvirtuemart/helper/helper_slideshowckvirtuemart.php')) {
		require_once JPATH_ROOT . '/plugins/system/slideshowckvirtuemart/helper/helper_slideshowckvirtuemart.php';
		$items = modSlideshowckvirtuemartHelper::getItems($params);
	} else {
		echo '<p style="color:red;font-weight:bold;">File /plugins/system/slideshowckvirtuemart/helper/helper_slideshowckvirtuemart.php not found ! Please download the patch for Slideshow CK - Virtuemart on <a href="https://www.joomlack.fr">https://www.joomlack.fr</a></p>';
		return false;
	}
} else if ($params->get('slideshowckk2_enable', '0') == '1') {
	if (\Joomla\CMS\Filesystem\File::exists(JPATH_ROOT . '/plugins/system/slideshowckk2/helper/helper_slideshowckk2.php')) {
		require_once JPATH_ROOT . '/plugins/system/slideshowckk2/helper/helper_slideshowckk2.php';
		$items = modSlideshowckk2Helper::getItems($params);
	} else {
		echo '<p style="color:red;font-weight:bold;">File /plugins/system/slideshowckk2/helper/helper_slideshowckk2.php not found ! Please download the patch for Slideshow CK - K2 on <a href="https://www.joomlack.fr">https://www.joomlack.fr</a></p>';
		return false;
	}
} 

else {
	switch ($params->get('slidesssource', 'slidesmanager')) {
		case 'folder':
			$items = modSlideshowckHelper::getItemsFromfolder($params);

			break;
		case 'autoloadfolder':
			$items = modSlideshowckHelper::getItemsAutoloadfolder($params);

			break;
		case 'autoloadarticlecategory':
			$items = modSlideshowckHelper::getItemsAutoloadarticlecategory($params);
			break;
		case 'flickr':
			$items = modSlideshowckHelper::getItemsAutoloadflickr($params);
			break;
		case 'googlephotos':
			include_once(JPATH_SITE. '/plugins/system/slideshowckparams/helper/class-helpersource-google.php');
			$items = SlideshowckHelpersourceGoogle::getItems($params);
			break;
		default:
//			$items = modSlideshowckHelper::getItems($params);
			break;
	}

//	if ($params->get('displayorder', 'normal') == 'shuffle')
//		shuffle($items);
}
components/com_slideshowck/extensions/mod_slideshowck/mod_slideshowck.php000060400000020231152453623440023354 0ustar00<?php
/**
 * @copyright	Copyright (C) 2012-2019 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * Module Slideshow CK
 * @license		GNU/GPL
 * */

// no direct access
defined('_JEXEC') or die;

include_once JPATH_ROOT . '/administrator/components/com_slideshowck/helpers/defines.php';
include_once JPATH_ROOT . '/administrator/components/com_slideshowck/helpers/helper.php';

if (version_compare(JVERSION, '4', '<')) include_once dirname(__FILE__) . '/helper.php';
if (! defined('SLIDESHOWCK_PATH')) define('SLIDESHOWCK_PATH', JPATH_ROOT . '/administrator/components/com_slideshowck');

// load the items
$source = $params->get('source', 'slidesmanager');
if ($source != 'slidesmanager') {
	$sourceFile = JPATH_ROOT . '/plugins/slideshowck/' . strtolower($source) . '/helper/helper_' . strtolower($source) . '.php';
	if (! file_exists($sourceFile)) {
		echo '<p syle="color:red;">Error : File plugins/slideshowck/' . strtolower($source) . '/helper/helper_' . strtolower($source) . '.php not found !</p>';
		return;
	}
	include_once $sourceFile;
} else {
	include_once SLIDESHOWCK_PATH . '/helpers/source/' . $source . '.php';
}
// store the module ID in the params
$params->set('moduleid', $module->id);
$loaderClass = 'SlideshowckHelpersource' . ucfirst($source);
$items = $loaderClass::getItems($params);

// load items for B/C if the save action has not yet been triggered
if (version_compare(JVERSION, '4', '<')) require dirname(__FILE__) . '/legacy.php';

if (empty($items) || $items === false) {
	if ($params->get('debug', true) === true) echo '<p>SLIDESHOW CK : No items found.</p>';
	return;
}

if ($params->get('displayorder', 'normal') == 'shuffle')
	shuffle($items);

$doc = \Joomla\CMS\Factory::getDocument();
\Joomla\CMS\HTML\HTMLHelper::_("jquery.framework", true);
if ($params->get('loadjqueryeasing', '1')) {
	$doc->addScript(SLIDESHOWCK_MEDIA_URI . '/assets/jquery.easing.1.3.js');
}

$debug = false;
if ($debug) {
	$doc->addScript(SLIDESHOWCK_MEDIA_URI . '/assets/camera.js');
} else {
	$doc->addScript(SLIDESHOWCK_MEDIA_URI . '/assets/camera.min.js?ver=' . SLIDESHOWCK_VERSION);
}

$theme = $params->get('theme', 'default');
$langdirection = $doc->getDirection();

if ($theme == 'default' && file_exists(JPATH_ROOT . '/templates/' . $doc->template . '/css/camera.css')) {
	if ($langdirection == 'rtl' && file_exists(JPATH_ROOT . '/templates/' . $doc->template . '/css/camera_rtl.css')) {
		$cssfilesrc = 'templates/' . $doc->template . '/css/camera_rtl.css';
	} else {
		$cssfilesrc = 'templates/' . $doc->template . '/css/camera.css';
	}
} else {
	if ($langdirection == 'rtl' && file_exists(JPATH_ROOT . '/modules/mod_slideshowck/themes/' . $theme . '/css/camera_rtl.css')) {
		$cssfilesrc = 'modules/mod_slideshowck/themes/' . $theme . '/css/camera_rtl.css';
	} else {
		$cssfilesrc = 'modules/mod_slideshowck/themes/' . $theme . '/css/camera.css';
	}
}
$doc->addStylesheet(\Joomla\CMS\Uri\Uri::root(true) . '/' . $cssfilesrc);

// set the navigation variables
if (count($items) == 1) { // for only one slide, no navigation, no button
	$navigation = "navigationHover: false,
			mobileNavHover: false,
			navigation: false,
			playPause: false,";
} else {
	switch ($params->get('navigation', '2')) {
		case 0:
			// aucune
			$navigation = "navigationHover: false,
				mobileNavHover: false,
				navigation: false,
				playPause: false,";
			break;
		case 1:
			// toujours
			$navigation = "navigationHover: false,
				mobileNavHover: false,
				navigation: true,
				playPause: true,";
			break;
		case 2:
		default:
			// on mouseover
			$navigation = "navigationHover: true,
				mobileNavHover: true,
				navigation: true,
				playPause: true,";
			break;
	}
}

$autoAdvance = (count($items) > 1) ? $params->get('autoAdvance', '1') : '0';
// load the slideshow script
$js = "
		jQuery(document).ready(function(){
			new Slideshowck('#camera_wrap_" . $module->id . "', {
				height: '" . $params->get('height', '400') . "',
				minHeight: '" . $params->get('minheight', '150') . "',
				pauseOnClick: false,
				hover: " . $params->get('hover', '1') . ",
				fx: '" . implode(",", $params->get('effect', array('linear'))) . "',
				loader: '" . $params->get('loader', 'pie') . "',
				pagination: " . $params->get('pagination', '1') . ",
				thumbnails: " . $params->get('thumbnails', '1') . ",
				thumbheight: " . $params->get('thumbnailheight', '100') . ",
				thumbwidth: " . $params->get('thumbnailwidth', '75') . ",
				time: " . $params->get('time', '7000') . ",
				transPeriod: " . $params->get('transperiod', '1500') . ",
				alignment: '" . $params->get('alignment', 'center') . "',
				autoAdvance: " . $autoAdvance . ",
				mobileAutoAdvance: " . $params->get('autoAdvance', '1') . ",
				portrait: " . $params->get('portrait', '0') . ",
				barDirection: '" . $params->get('barDirection', 'leftToRight') . "',
				imagePath: '" . \Joomla\CMS\Uri\Uri::base(true) . "/media/com_slideshowck/images/',
				lightbox: '" . $params->get('lightboxtype', 'mediaboxck') . "',
				fullpage: " . $params->get('fullpage', '0') . ",
				mobileimageresolution: '" . ($params->get('usemobileimage', '0') ? $params->get('mobileimageresolution', '640') : '0') . "',
				" . $navigation . "
				barPosition: '" . $params->get('barPosition', 'bottom') . "',
				responsiveCaption: " . ($params->get('usecaptionresponsive') == '2' ? '1' : '0') . ",
				keyboardNavigation: " . $params->get('keyboardnavigation', '0') . ",
				titleInThumbs: " . $params->get('titleInThumbs', '0') . ",
				container: '" . $params->get('container', '') . "'
		});
}); 
";

if ($params->get('loadinline', '0') == '1') {
	echo '<script>' . $js . '</script>';
} else {
	$doc->addScriptDeclaration($js);
}

$css = '';
// load some css
$css = "#camera_wrap_" . $module->id . " .camera_pag_ul li img, #camera_wrap_" . $module->id . " .camera_thumbs_cont ul li > img {height:" . SlideshowckHelper::testUnit($params->get('thumbnailheight', '75')) . ";}";

// load the caption styles
if (version_compare(JVERSION, '4', '<')) {
$captioncss = modSlideshowckHelper::createCss($params, 'captionstyles');
$fontfamily = ($params->get('captionstylesusefont','0') && $params->get('captionstylestextgfont', '0')) ? "font-family:'" . $params->get('captionstylestextgfont', 'Droid Sans') . "';" : '';
if ($fontfamily) {
	$gfonturl = str_replace(" ", "+", $params->get('captionstylestextgfont', 'Droid Sans'));
	$doc->addStylesheet('https://fonts.googleapis.com/css?family=' . $gfonturl);
}

$css .= "
#camera_wrap_" . $module->id . " .camera_caption {
	display: block;
	position: absolute;
}
#camera_wrap_" . $module->id . " .camera_caption > div {
	" . $captioncss['padding'] . $captioncss['margin'] . $captioncss['background'] . $captioncss['gradient'] . $captioncss['borderradius'] . $captioncss['shadow'] . $captioncss['border'] . $fontfamily . "
}
#camera_wrap_" . $module->id . " .camera_caption > div div.camera_caption_title {
	" . $captioncss['fontcolor'] . $captioncss['fontsize'] . "
}
#camera_wrap_" . $module->id . " .camera_caption > div div.camera_caption_desc {
	" . $captioncss['descfontcolor'] . $captioncss['descfontsize'] . "
}
";
}

if ($params->get('usecaptionresponsive') == '1' || $params->get('usecaptionresponsive') == '2') {
	$css .= "
@media screen and (max-width: " . str_replace("px", "", $params->get('captionresponsiveresolution', '480')) . "px) {
		#camera_wrap_" . $module->id . " .camera_caption {
			" . ( $params->get('captionresponsivehidecaption', '0') == '1' ? "display: none !important;" : ($params->get('usecaptionresponsive') == '1' ? "font-size: " . $params->get('captionresponsivefontsize', '0.6em') ." !important;" : "") ) . "
		}
		" . ( $params->get('captionresponsivehidedescription', '0') == '1' ? "#camera_wrap_" . $module->id . " .camera_caption_desc {display: none !important;}" : "") . "
}";
}

// load the style 
if ($styleId = $params->get('styles', '')) {
	$layoutcss = str_replace('|ID|', '#camera_wrap_' . $module->id, SlideshowckHelper::getStyleLayoutcss($styleId) );
	$css .= $layoutcss;
}

$doc->addStyleDeclaration($css);

// load the php Class for the html fixer
if ($params->get('fixhtml', '0') == '1') include_once SLIDESHOWCK_PATH . '/helpers/htmlfixer.php';

// display the module
require \Joomla\CMS\Helper\ModuleHelper::getLayoutPath('mod_slideshowck', $params->get('layout', 'default'));
components/com_slideshowck/extensions/mod_slideshowck/mod_slideshowck.xml000060400000062271152453623440023377 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension
	type="module"
	version="3.0"
	client="site"
	method="upgrade">
	<name>Slideshow CK</name>
	<author>Cédric KEIFLIN</author>
	<creationDate>Avril 2012</creationDate>
	<copyright>Cédric KEIFLIN</copyright>
	<license>GNU/GPL 3 http://www.gnu.org/licenses/gpl.html</license>
	<authorEmail>ced1870@gmail.com</authorEmail>
	<authorUrl>https://www.joomlack.fr</authorUrl>
	<version>2.5.0</version>
	<description>SLIDESHOWCK_XML_DESCRIPTION</description>
	<files>
		<folder>language</folder>
		<folder>themes</folder>
		<folder>tmpl</folder>
		<filename>helper.php</filename>
		<filename>index.html</filename>
		<filename>legacy.php</filename>
		<filename>logo_slideshowck.png</filename>
		<filename module="mod_slideshowck">mod_slideshowck.php</filename>
		<filename>mod_slideshowck.xml</filename>
	</files>
	<languages>
		<language tag="en-GB">language/en-GB/en-GB.mod_slideshowck.ini</language>
		<language tag="en-GB">language/en-GB/en-GB.mod_slideshowck.sys.ini</language>
		<language tag="fr-FR">language/fr-FR/fr-FR.mod_slideshowck.ini</language>
		<language tag="fr-FR">language/fr-FR/fr-FR.mod_slideshowck.sys.ini</language>
	</languages>
	<config>
		<fields name="params">
			<fieldset name="basic" addfieldpath="/administrator/components/com_slideshowck/elements">
				<field 
					name="slideshowckinterface"
					type="slideshowckinterface"
					/>
				<field 
					name="infos" 
					type="ckinfo"
					/>
				<field
					name="infospro"
					type="cklight"
					/>
				<field
					name="joomlackproducts"
					type="ckproducts"
					/>
				<field
					name="v1tov2migration"
					type="ckmigrate"
					/>
			</fieldset>
			<fieldset name="editionfieldset" label="SLIDESHOWCK_SOURCE_FIELDSET_LABEL">
				<field
					name="source"
					type="cksource"
					default="slidesmanager"
					label="SLIDESHOWCK_SLIDESSOURCE_LABEL"
					description="SLIDESHOWCK_SLIDESSOURCE_DESC"
					icon="image_link.png"
				>
					<option value="slidesmanager">SLIDESHOWCK_SOURCE_SLIDESMANAGER</option>
				</field>
				<field
					name="sourceproonly"
					type="ckproonly"
					label="SLIDESHOWCK_SLIDESSOURCE_PRO_ONLY"
				/>
				<field
					name="slides"
					type="ckslidesmanager"
					label="SLIDESHOWCK_SLIDES_LABEL"
					default="[{|qq|imgname|qq|:|qq|media/com_slideshowck/images/slides/bridge.jpg|qq|,|qq|imgcaption|qq|:|qq|This bridge is very long|qq|,|qq|imgtitle|qq|:|qq|This is a bridge|qq|,|qq|imgthumb|qq|:|qq|../media/com_slideshowck/images/slides/bridge.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|media/com_slideshowck/images/slides/road.jpg|qq|,|qq|imgcaption|qq|:|qq|This slideshow uses a JQuery script adapted from Pixedelic|qq|,|qq|imgtitle|qq|:|qq|On the road again|qq|,|qq|imgthumb|qq|:|qq|../media/com_slideshowck/images/slides/road.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|},{|qq|imgname|qq|:|qq|media/com_slideshowck/images/slides2/sea.jpg|qq|,|qq|imgcaption|qq|:|qq||qq|,|qq|imgtitle|qq|:|qq||qq|,|qq|imgthumb|qq|:|qq|../media/com_slideshowck/images/slides2/sea.jpg|qq|,|qq|imglink|qq|:|qq||qq|,|qq|imgtarget|qq|:|qq|default|qq|,|qq|imgalignment|qq|:|qq|default|qq|,|qq|imgvideo|qq|:|qq||qq|,|qq|slidearticleid|qq|:|qq||qq|,|qq|slidearticlename|qq|:|qq||qq|,|qq|imgtime|qq|:|qq||qq|}]"
					filter="raw"
					showon="source:slidesmanager"
				/>
				<field
					name="spacerfolderimport"
					type="slideshowckspacer"
					style="title"
					label="SLIDESHOWCK_SPACERFOLDERIMPORT_LABEL"
					showon="source:slidesmanager"
				/>
				<field
					type="ckproonly"
				/>
			</fieldset>
			<fieldset name="optionsfieldset" label="SLIDESHOWCK_OPTIONS_FIELDSET_LABEL" >
				<field
					name="spacerdisplay"
					type="slideshowckspacer"
					label="SLIDESHOWCK_DISPLAY_OPTIONS_LABEL"
					style="title"
					/>
				<field
					name="theme"
					type="ckfolderlist"
					directory="modules/mod_slideshowck/themes"
					hide_none="true"
					hide_default="true"
					label="SLIDESHOWCK_THEME_LABEL"
					description="SLIDESHOWCK_THEME_DESC"
					icon="photo.png" />
				<field
					name="styles"
					type="ckstyle"
					label="SLIDESHOWCK_SELECT_STYLE_LABEL"
					description="SLIDESHOWCK_SELECT_STYLE_DESC"
					icon="palette.png"
					default=""
					/>

				<field
					name="alignment"
					type="slideshowcklist"
					default="center"
					label="SLIDESHOWCK_ALIGNEMENT_LABEL"
					description="SLIDESHOWCK_ALIGNEMENT_DESC"
					icon="image_alignment.png"
				>
					<option value="topLeft">SLIDESHOWCK_TOPLEFT</option>
					<option value="topCenter">SLIDESHOWCK_TOPCENTER</option>
					<option value="topRight">SLIDESHOWCK_TOPRIGHT</option>
					<option value="centerLeft">SLIDESHOWCK_MIDDLELEFT</option>
					<option value="center">SLIDESHOWCK_CENTER</option>
					<option value="centerRight">SLIDESHOWCK_MIDDLERIGHT</option>
					<option value="bottomLeft">SLIDESHOWCK_BOTTOMLEFT</option>
					<option value="bottomCenter">SLIDESHOWCK_BOTTOMCENTER</option>
					<option value="bottomRight">SLIDESHOWCK_BOTTOMRIGHT</option>
				</field>
				<field
					name="slideshowstylesillustration"
					type="ckbackground"
					background="slideshowck_styles.png"
					styles="height:264px;width:356px;"
				/>
				<field
					name="loader"
					type="slideshowcklist"
					default="pie"
					label="SLIDESHOWCK_LOADER_LABEL"
					description="SLIDESHOWCK_LOADER_DESC"
					icon="arrow_rotate_clockwise.png"
				>
					<option value="pie">SLIDESHOWCK_LOADER_PIE</option>
					<option value="bar">SLIDESHOWCK_LOADER_BAR</option>
					<option value="none">SLIDESHOWCK_LOADER_NONE</option>
				</field>

				<field
					name="width"
					type="slideshowcktext"
					default="auto"
					label="SLIDESHOWCK_WIDTH_LABEL"
					description="SLIDESHOWCK_WIDTH_DESC"
					icon="width.png"
					suffix=""
				/>
				<field
					name="height"
					type="ckheight"
					default="62%"
					label="SLIDESHOWCK_HEIGHT_LABEL"
					description="SLIDESHOWCK_HEIGHT_DESC"
					icon="height.png"
					suffix=""
				/>
				<field
					name="minheight"
					type="slideshowcktext"
					default="150"
					label="SLIDESHOWCK_MINHEIGHT_LABEL"
					description="SLIDESHOWCK_MINHEIGHT_DESC"
					suffix="px"
				/>
				<field
					name="navigation"
					type="slideshowckradio"
					default="2"
					label="SLIDESHOWCK_NAVIGATION_LABEL"
					description="SLIDESHOWCK_NAVIGATION_DESC"
					class="btn-group"
					icon="resultset_next.png"
				>
					<option value="2">SLIDESHOWCK_NAVIGATION_HOVER</option>
					<option value="1">SLIDESHOWCK_NAVIGATION_ALWAYS</option>
					<option value="0">SLIDESHOWCK_NAVIGATION_NONE</option>
				</field>
				<field
					name="skin"
					type="slideshowcklist"
					default="camera_amber_skin"
					label="SLIDESHOWCK_SKIN_LABEL"
					description="SLIDESHOWCK_SKIN_DESC"
					icon="palette.png" >
					<option value="camera_amber_skin">amber</option>
					<option value="camera_ash_skin">ash</option>
					<option value="camera_azure_skin">azure</option>
					<option value="camera_beige_skin">beige</option>
					<option value="camera_black_skin">black</option>
					<option value="camera_blue_skin">blue</option>
					<option value="camera_brown_skin">brown</option>
					<option value="camera_burgundy_skin">burgundy</option>
					<option value="camera_charcoal_skin">charcoal</option>
					<option value="camera_chocolate_skin">chocolate</option>
					<option value="camera_coffee_skin">coffee</option>
					<option value="camera_cyan_skin">cyan</option>
					<option value="camera_fuchsia_skin">fuchsia</option>
					<option value="camera_gold_skin">gold</option>
					<option value="camera_green_skin">green</option>
					<option value="camera_grey_skin">grey</option>
					<option value="camera_indigo_skin">indigo</option>
					<option value="camera_khaki_skin">khaki</option>
					<option value="camera_lime_skin">lime</option>
					<option value="camera_magenta_skin">magenta</option>
					<option value="camera_maroon_skin">maroon</option>
					<option value="camera_orange_skin">orange</option>
					<option value="camera_olive_skin">olive</option>
					<option value="camera_pink_skin">pink</option>
					<option value="camera_pistachio_skin">pistachio</option>
					<option value="camera_pink_skin">pink</option>
					<option value="camera_red_skin">red</option>
					<option value="camera_tangerine_skin">tangerine</option>
					<option value="camera_turquoise_skin">turquoise</option>
					<option value="camera_violet_skin">violet</option>
					<option value="camera_white_skin">white</option>
					<option value="camera_yellow_skin">yellow</option>
				</field>
				<field
					name="thumbnails"
					type="slideshowckradio"
					default="1"
					label="SLIDESHOWCK_THUMBNAILS_LABEL"
					description="SLIDESHOWCK_THUMBNAILS_DESC"
					class="btn-group"
					icon="pictures.png"
				>
					<option value="0">JNO</option>
					<option value="1">JYES</option>
				</field>
				<field
					name="titleInThumbs"
					type="slideshowckradio"
					default="0"
					label="SLIDESHOWCK_TITLE_IN_THUMBNAILS_LABEL"
					class="btn-group"
					showon="thumbnails:1"
				>
					<option value="0">JNO</option>
					<option value="1">JYES</option>
				</field>

				<field
					name="thumbnailwidth"
					type="slideshowcktext"
					default="100"
					label="SLIDESHOWCK_THUMBNAILWIDTH_LABEL"
					description="SLIDESHOWCK_THUMBNAILWIDTH_DESC"
					suffix="px"
				/>

				<field
					name="thumbnailheight"
					type="slideshowcktext"
					default="75"
					label="SLIDESHOWCK_THUMBNAILHEIGHT_LABEL"
					description="SLIDESHOWCK_THUMBNAILHEIGHT_DESC"
					suffix="px"
				/>

				<field
					name="pagination"
					type="slideshowckradio"
					default="1"
					label="SLIDESHOWCK_PAGINATION_LABEL"
					description="SLIDESHOWCK_PAGINATION_DESC"
					class="btn-group"
					icon="edit-list-order.png"
				>
					<option value="0">JNO</option>
					<option value="1">JYES</option>
				</field>
				<field
					name="displayorder"
					type="slideshowcklist"
					default="normal"
					label="SLIDESHOWCK_DISPLAYORDER_LABEL"
					description="SLIDESHOWCK_DISPLAYORDER_DESC"
					icon="control_repeat.png"
				>
					<option value="normal">SLIDESHOWCK_DISPLAYORDER_NORMAL</option>
					<option value="shuffle">SLIDESHOWCK_DISPLAYORDER_SHUFFLE</option>
				</field>
				<field
					name="limitslides"
					type="slideshowcktext"
					default=""
					label="SLIDESHOWCK_NUMBER_SLIDES_LABEL"
					description="SLIDESHOWCK_NUMBER_SLIDES_DESC"
					icon="application_cascade.png"
					
					/>
				<field
					name="spacertext"
					type="slideshowckspacer"
					label="SLIDESHOWCK_TEXT_OPTIONS_LABEL"
					style="title"
					/>
				<field
					name="usecaption"
					type="slideshowckradio"
					label="SLIDESHOWCK_USECAPTION_LABEL"
					description="SLIDESHOWCK_USECAPTION_DESC"
					icon="switch.png"
					class="btn-group"
					default="1"
					>
						<option value="0">JNO</option>
						<option value="1">JYES</option>
				</field>
				<field
					name="usetitle"
					type="slideshowckradio"
					label="SLIDESHOWCK_USETITLE_LABEL"
					description="SLIDESHOWCK_USETITLE_DESC"
					icon="switch.png"
					class="btn-group"
					default="1"
					showon="usecaption:1"
				>
					<option value="0">JNO</option>
					<option value="1">JYES</option>
				</field>
				<field
					name="usecaptiondesc"
					type="slideshowckradio"
					label="SLIDESHOWCK_USECAPTIONDESC_LABEL"
					description="SLIDESHOWCK_USECAPTIONDESC_DESC"
					icon="switch.png"
					class="btn-group"
					default="1"
					showon="usecaption:1"
					>
						<option value="0">JNO</option>
						<option value="1">JYES</option>
				</field>
				<field
					name="textlength"
					type="slideshowcktext"
					default=""
					label="SLIDESHOWCK_ARTICLELENGTH_LABEL"
					description="SLIDESHOWCK_ARTICLELENGTH_DESC"
					icon="text_signature.png"
					showon="usecaption:1"
				/>
				<field
					name="striptags"
					type="slideshowckradio"
					default="1"
					label="SLIDESHOWCK_STRIPTAGS_LABEL"
					description="SLIDESHOWCK_STRIPTAGS_DESC"
					icon="html.png"
					class="btn-group"
					showon="usecaption:1"
				>
					<option value="0">JNO</option>
					<option value="1">JYES</option>
				</field>
				<field
					name="spacerlink"
					type="slideshowckspacer"
					label="SLIDESHOWCK_LINK_OPTIONS_LABEL"
					style="title"
					/>
				<field
					name="linkposition"
					type="slideshowcklist"
					label="SLIDESHOWCK_LINK_POSITION_LABEL"
					description="SLIDESHOWCK_LINK_POSITION_DESC"
					icon="link.png"
					default="fullslide"
					>
					<option value="fullslide">SLIDESHOWCK_LINK_FULLSLIDE</option>
					<option value="title">SLIDESHOWCK_LINK_TITLE</option>
					<option value="button">SLIDESHOWCK_LINK_BUTTON</option>
					<option value="none">SLIDESHOWCK_NONE</option>
				</field>
				<field
					name="linkbuttontext"
					type="slideshowcktext"
					label="SLIDESHOWCK_LINK_BUTTON_TEXT_LABEL"
					description="SLIDESHOWCK_LINK_BUTTON_TEXT_DESC"
					icon="text_signature.png"
					default="SLIDESHOWCK_LINK_BUTTON_TEXT"
					showon="linkposition:button"
					/>
				<field
					name="linkbuttonclass"
					type="slideshowcktext"
					label="SLIDESHOWCK_LINK_BUTTON_CLASS_LABEL"
					description="SLIDESHOWCK_LINK_BUTTON_CLASS_DESC"
					icon="css.png"
					default="btn"
					showon="linkposition:button"
					/>
				<field
					name="linkautoimage"
					type="slideshowckradio"
					label="SLIDESHOWCK_LINK_AUTOIMAGE_LABEL"
					description="SLIDESHOWCK_LINK_AUTOIMAGE_DESC"
					icon="link_add.png"
					default="0"
					class="btn-group"
					showon="linkposition!:none"
					>
					<option value="0">JNO</option>
					<option value="1">JYES</option>
				</field>
				<field
					name="linktarget"
					type="slideshowcklist"
					label="SLIDESHOWCK_LINK_TARGET_LABEL"
					description="SLIDESHOWCK_LINK_TARGET_DESC"
					icon="link_go.png"
					default="_parent"
					showon="linkposition!:none"
					>
					<option value="_parent">SLIDESHOWCK_LINK_SAME_WINDOW</option>
					<option value="_blank">SLIDESHOWCK_LINK_NEW_WINDOW</option>
				</field>
				<field
					name="spacerlightbox"
					type="slideshowckspacer"
					label="SLIDESHOWCK_LIGHTBOX_SPACER_LABEL"
					style="title"
					/>
				<field
					type="ckproonly"
				/>
			</fieldset>

			<fieldset name="effects" label="SLIDESHOWCK_EFFECTS_OPTIONS">

				<field
					name="effect"
					type="slideshowcklist"
					default="random"
					multiple="true"
					label="SLIDESHOWCK_EFFECT_LABEL"
					description="SLIDESHOWCK_EFFECT_DESC"
					icon="application_view_gallery.png"
					styles="width:200px;"
				>
					<option value="random">random</option>
					<option value="kenburns">kenburns</option>
					<option value="simpleFade">simpleFade</option>
					<option value="curtainTopLeft">curtainTopLeft</option>
					<option value="curtainTopRight">curtainTopRight</option>
					<option value="curtainBottomLeft">curtainBottomLeft</option>
					<option value="curtainBottomRight">curtainBottomRight</option>
					<option value="curtainSliceLeft">curtainSliceLeft</option>
					<option value="curtainSliceRight">curtainSliceRight</option>
					<option value="blindCurtainTopLeft">blindCurtainTopLeft</option>
					<option value="blindCurtainTopRight">blindCurtainTopRight</option>
					<option value="blindCurtainBottomLeft">blindCurtainBottomLeft</option>
					<option value="blindCurtainBottomRight">blindCurtainBottomRight</option>
					<option value="blindCurtainSliceBottom">blindCurtainSliceBottom</option>
					<option value="blindCurtainSliceTop">blindCurtainSliceTop</option>
					<option value="stampede">stampede</option>
					<option value="mosaic">mosaic</option>
					<option value="mosaicReverse">mosaicReverse</option>
					<option value="mosaicRandom">mosaicRandom</option>
					<option value="mosaicSpiral">mosaicSpiral</option>
					<option value="mosaicSpiralReverse">mosaicSpiralReverse</option>
					<option value="topLeftBottomRight">topLeftBottomRight</option>
					<option value="bottomRightTopLeft">bottomRightTopLeft</option>
					<option value="bottomLeftTopRight">bottomLeftTopRight</option>
					<option value="bottomLeftTopRight">bottomLeftTopRight</option>
					<option value="scrollLeft">scrollLeft</option>
					<option value="scrollRight">scrollRight</option>
					<option value="scrollHorz">scrollHorz</option>
					<option value="scrollBottom">scrollBottom</option>
					<option value="scrollTop">scrollTop</option>
				</field>

				<field
					name="time"
					type="slideshowcktext"
					default="7000"
					label="SLIDESHOWCK_TIME_LABEL"
					description="SLIDESHOWCK_TIME_DESC"
					icon="hourglass.png"
					suffix="ms" />

				<field
					name="transperiod"
					type="slideshowcktext"
					default="1500"
					label="SLIDESHOWCK_TRANSPERIOD_LABEL"
					description="SLIDESHOWCK_TRANSPERIOD_DESC"
					icon="hourglass.png"
					suffix="ms" />
				<field
					name="captioneffect"
					type="slideshowcklist"
					default="random"
					label="SLIDESHOWCK_CAPTIONEFFECT_LABEL"
					description="SLIDESHOWCK_CAPTIONEFFECT_DESC"
					icon="application_view_gallery.png"
					styles=""
				>
					<option value="moveFromLeft">moveFromLeft</option>
					<option value="moveFromRight">moveFromRight</option>
					<option value="moveFromTop">moveFromTop</option>
					<option value="moveFromBottom">moveFromBottom</option>
					<option value="fadeIn">fadeIn</option>
					<option value="fadeFromLeft">fadeFromLeft</option>
					<option value="fadeFromRight">fadeFromRight</option>
					<option value="fadeFromTop">fadeFromTop</option>
					<option value="fadeFromBottom">fadeFromBottom</option>
					<option value="none">none</option>
				</field>
				<field
					name="portrait"
					type="slideshowckradio"
					default="0"
					label="SLIDESHOWCK_PORTRAIT_LABEL"
					description="SLIDESHOWCK_PORTRAIT_DESC"
					icon="shape_handles.png"
					class="btn-group"
				>
					<option value="0">JNO</option>
					<option value="1">JYES</option>
				</field>

				<field
					name="autoAdvance"
					type="slideshowckradio"
					default="1"
					label="SLIDESHOWCK_AUTOADVANCE_LABEL"
					description="SLIDESHOWCK_AUTOADVANCE_DESC"
					icon="control_play.png"
					class="btn-group"
				>
					<option value="0">JNO</option>
					<option value="1">JYES</option>
				</field>

				<field
					name="hover"
					type="slideshowckradio"
					default="1"
					label="SLIDESHOWCK_HOVER_LABEL"
					description="SLIDESHOWCK_HOVER_DESC"
					icon="control_pause.png"
					class="btn-group"
				>
					<option value="0">JNO</option>
					<option value="1">JYES</option>
				</field>
				<field
					name="keyboardnavigation"
					type="slideshowckradio"
					default="0"
					label="SLIDESHOWCK_KEYBOARD_CONTROL_LABEL"
					description="SLIDESHOWCK_KEYBOARD_CONTROL_DESC"
					class="btn-group"
					icon="keyboard.png"
				>
					<option value="0">JNO</option>
					<option value="1">JYES</option>
				</field>
				<field
					name="fullpage"
					type="slideshowckradio"
					default="0"
					label="SLIDESHOWCK_FULLPAGE_LABEL"
					description="SLIDESHOWCK_FULLPAGE_DESC"
					class="btn-group"
				>
					<option value="0">JNO</option>
					<option value="1">JYES</option>
				</field>
				
				<field
					name="container"
					type="slideshowcktext"
					default=""
					label="SLIDESHOWCK_CONTAINER_LABEL"
					description="SLIDESHOWCK_CONTAINER_DESC"
					class="btn-group"
				/>
				
				
			</fieldset>
			<fieldset name="responsiveoptions" label="SLIDESHOWCK_RESPONSIVE">
				<field 
					name="mobileimagespacer"
					label="SLIDESHOWCK_MOBILEIMAGE_SPACER_LABEL"
					type="slideshowckspacer"
					style="title"
				/>
				<field
					name="usemobileimage"
					type="slideshowckradio"
					default="0"
					label="SLIDESHOWCK_USEMOBILEIMAGE_LABEL"
					description="SLIDESHOWCK_USEMOBILEIMAGE_DESC"
					class="btn-group"
				>
					<option value="0">JNO</option>
					<option value="1">JYES</option>
				</field>
				<field
					name="mobileimageresolution"
					type="slideshowcktext"
					default="640"
					label="SLIDESHOWCK_MOBILEIMAGERESOLUTION_LABEL"
					description="SLIDESHOWCK_MOBILEIMAGERESOLUTION_DESC"
					icon="width.png"
					suffix="px" 
				/>
				<field
					name="captionresponsiveckspacer"
					type="slideshowckspacer"
					label="SLIDESHOWCK_SPACER_RESPONSIVE"
					style="title"
				/>
				<field
					name="usecaptionresponsive"
					type="slideshowcklist"
					label="SLIDESHOWCK_USERESPONSIVECAPTION_LABEL"
					description="SLIDESHOWCK_USERESPONSIVECAPTION_DESC"
					icon="ipod.png"
					class="btn-group"
					default="1"
					>
						<option value="2">SLIDESHOWCK_RESOLUTION_ADAPTATIVE</option>
						<option value="1">SLIDESHOWCK_RESOLUTION_STEP</option>
						<option value="0">JNO</option>
				</field>
				<field
					name="captionresponsiveresolution"
					type="slideshowcktext"
					label="SLIDESHOWCK_RESPONSIVERESOLUTION_LABEL"
					description="SLIDESHOWCK_RESPONSIVERESOLUTION_DESC"
					icon="width.png"
					default="480"
					showon="usecaptionresponsive!:0"
				/>
				<field
					name="captionresponsivefontsize"
					type="slideshowcktext"
					label="SLIDESHOWCK_RESPONSIVEFONTSIZE_LABEL"
					description="SLIDESHOWCK_RESPONSIVEFONTSIZE_DESC"
					icon="style.png"
					default="0.6em"
					showon="usecaptionresponsive:1"
				/>
				<field
					name="captionresponsivehidecaption"
					type="slideshowckradio"
					label="SLIDESHOWCK_RESPONSIVEHIDECAPTION_LABEL"
					description="SLIDESHOWCK_RESPONSIVEHIDECAPTION_DESC"
					icon="style_delete.png"
					class="btn-group"
					default="0"
					showon="usecaptionresponsive!:0"
					>
						<option value="0">JNO</option>
						<option value="1">JYES</option>
				</field>
				<field
					name="captionresponsivehidedescription"
					type="slideshowckradio"
					label="SLIDESHOWCK_RESPONSIVEHIDEDESCRIPTION_LABEL"
					description="SLIDESHOWCK_RESPONSIVEHIDEDESCRIPTION_DESC"
					icon="style_delete.png"
					class="btn-group"
					default="0"
					showon="usecaptionresponsive!:0[AND]captionresponsivehidecaption:0"
					>
						<option value="0">JNO</option>
						<option value="1">JYES</option>
				</field>
			</fieldset>
			<fieldset name="advanced">
				<field
					name="loadjqueryeasing"
					type="slideshowckradio"
					default="1"
					label="SLIDESHOWCK_LOADJQUERYEASING_LABEL"
					description="SLIDESHOWCK_LOADJQUERYEASING_DESC"
					icon="page_white_wrench.png"
					class="btn-group"
				>
					<option value="0">JNO</option>
					<option value="1">JYES</option>
				</field>
				
				<field
					name="autocreatethumbs"
					type="slideshowckradio"
					default="1"
					label="SLIDESHOWCK_AUTOCREATETHUMBS_LABEL"
					description="SLIDESHOWCK_AUTOCREATETHUMBS_DESC"
					icon="application_cascade.png"
					class="btn-group"
				>
					<option value="0">JNO</option>
					<option value="1">JYES</option>
				</field>
				<field
					name="usethumbstype"
					type="slideshowckradio"
					default="mini"
					label="SLIDESHOWCK_THUMBSTYPE_LABEL"
					description="SLIDESHOWCK_THUMBSTYPE_DESC"
					class="btn-group"
				>
					<option value="mini">SLIDESHOWCK_THUMBSTYPE_MINI</option>
					<option value="normal">SLIDESHOWCK_THUMBSTYPE_NORMAL</option>
				</field>
				<field
					name="fixhtml"
					type="slideshowckradio"
					default="0"
					label="SLIDESHOWCK_FIXHTML_LABEL"
					description="SLIDESHOWCK_FIXHTML_DESC"
					icon="bug_delete.png"
					class="btn-group"
				>
					<option value="0">JNO</option>
					<option value="1">JYES</option>
				</field>
				<field
					name="content_prepare"
					type="slideshowckradio"
					default="1"
					label="SLIDESHOWCK_CONTENT_PREPARE_LABEL"
					description="SLIDESHOWCK_CONTENT_PREPARE_DESC"
					class="btn-group"
				>
					<option value="0">JNO</option>
					<option value="1">JYES</option>
				</field>
				<field
					name="debug"
					type="slideshowckradio"
					default="1"
					label="SLIDESHOWCK_DEBUG_LABEL"
					description="SLIDESHOWCK_DEBUG_DESC"
					class="btn-group"
				>
					<option value="0">JNO</option>
					<option value="1">JYES</option>
				</field>
				<field
					name="loadinline"
					type="slideshowckradio"
					default="0"
					label="SLIDESHOWCK_LOAD_INLINE_LABEL"
					description="SLIDESHOWCK_LOAD_INLINE_DESC"
					class="btn-group"
				>
					<option value="0">JNO</option>
					<option value="1">JYES</option>
				</field>
				<field
					name="layout"
					type="modulelayout"
					label="JFIELD_ALT_LAYOUT_LABEL"
					description="JFIELD_ALT_MODULE_LAYOUT_DESC"
					icon="layout.png" />

				<field
					name="moduleclass_sfx"
					type="slideshowcktext"
					label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
					description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC"
					icon="text_signature.png" />

				<field
					name="cache"
					type="slideshowcklist"
					default="1"
					label="COM_MODULES_FIELD_CACHING_LABEL"
					description="COM_MODULES_FIELD_CACHING_DESC" >
					<option	value="1">JGLOBAL_USE_GLOBAL</option>
					<option	value="0">COM_MODULES_FIELD_VALUE_NOCACHING</option>
				</field>

				<field
					name="cache_time"
					type="slideshowcktext"
					default="900"
					label="COM_MODULES_FIELD_CACHE_TIME_LABEL"
					description="COM_MODULES_FIELD_CACHE_TIME_DESC"
					icon="hourglass.png"
					suffix="min" />

				<field
					name="cachemode"
					type="hidden"
					default="itemid" >
					<option	value="itemid"></option>
				</field>

			</fieldset>
		</fields>
	</config>
</extension>
components/com_slideshowck/extensions/mod_slideshowck/logo_slideshowck.png000060400000007125152453623440023541 0ustar00�PNG


IHDR@@�iq�sBIT|d�	pHYs��:���tEXtSoftwarewww.inkscape.org��<
�IDATx�ݚ{��]�?�������a�v];�ڍ�68�4.uJ�T})�ABQ@@�^AUB�
h����@ʓ�4�ݒƯƎ���^������sܝ�sggf�>�?8��93s�|����1sW

M���y���X�~#���o����E��y�^*�$�q�RI0��]$���@�� ��X����Q$_�
��xd�ul)�@�m,�A�q��`��n����$����I
j$)!z�*���]m�k��,�wKK!�nX_J�<XM$��Z��֐�_*�_
�'m�,|#*��	a�մ���u|h�� ��RA���{�� ,W
Q��?���`���^���KI�q�#!�X���O�+	��(�q�����Y=HBl\���/֢|?H�r^�y�I�J��M#!..5�%Y=���q?�����~D)�w�c�@S3��(�-D�PXw?��#u5��b��R����~�����~�1����L^D�>�w�q��M����:�K�7�vf~�I�_=�dc(�ۉp��ξ�5j�F�O@�:쎵X/�.r�j��mK,K��r{��<�6*�; ݊��!eY��n�ػ
պ����8�c�r���b�v���.|�k[���|
�A(9s{�T�;�۳�>�A �\E�x�1��G\8X#�c1q��ҽ�D������`	S�GJۑU`z�#PΣs]����\@��yj%�-1��?�� %Vq
����B
���7����C���)ĕ�*U�-��Z������V��d~��G���Ď!0���b翞��>�;����,������ǫj�w�"��1�A<9!`���g��k��q��ĭ�ؖD�j@�B¦=dN��s����
�=���Jڝ�����'C��Z���S���eЪ*q)�dI�K�i:���
�6�ܣ��^sN���+�)�T�/$�翌�u⌞�l؅�ɋ�>��,��=�N��҃;�}�kuA��0�/?G�ßE�:Mi��-�>�z��HK��K��֋�v�>��[�J�@J�M{k�'��Na����O�	��y0k���#ؖ-�`M]#%2ׁ37��́7��8�<:�	W!�>J靗H
�=�m��߇۱��^��E��h]\��A�ܹAy����^z�S8�<�`���%ƒHǩL�R���t@[^�@����Xo�=j�>L[Xz�nt�ے�ޖ�-��0��	Ws��"��aR��2jݽ4��B�
��!�ev�VJ~TL�5���r;5n%%��(!��Ag�1A��II��eJ�מETj�қ���=�P�>��ۂ��XrA�pl�F!r-�R"�t(N&�B�˳�[�h��o�Fޅ��Ar��l;��~eAj�H��ȓ`YB�̶��N��A���8�)W��y��A�
�� �?�g�7����M�}q�%�ˁ{���Jam�i���`��	)��$���Z��{5z��;���P�3�u��d��So=���t>��2�zfb������g�4ה���/�j�i�&�ڍ*�3����֠n��JgQ7Nan�����o���j�`�E�OD������5�ձs�R�UW�ubm�ڋ�փ�kG^9�#Si���o�)�j��}�G���ح����q�`n���5q�0��@�
���hF��0w�M�<�bJ<��C&X��`�:�����q]�	�`�,l…Nx?�{�q��>1�,�*��bF��l�/�5�+��W��9��:KG\�ǀ$�HY*Q$D=l�I��ۑ��oT!Q��a5[TM2�7
:��$ �!���ŕ8��v#�d��I4rM#d��(�>��&�kk��F>D�X�=Q���TuOҜ�}V����5��l�7�Gۖ�4ub5e�����#��6�7��G�>�Ϩ�Qd���=O!s�{���&#�vkv��7?ɕW����DR�s&f��h��YO�g~����>03�y�k6�ӎ��!*G^$�����a���8��w0���(
ۡ��}t�_N�:i��#��>p�ٍ�KcvK����-�*�h��h�~WYM����P����TS��tc��Mt�}��������o$���Y�)2����*;��i��)L/��{A���;�g`��U
���1�/�C��/���)���=�<�?�&�ۗ�9��H���Aו�B��mk
��u�$fvJo�U�^_Q��<��ja`k6���/!Z{�V�=%��o2s�P�|�b�b	\ tP�m����?0�gޠr�u��2r���a��0�@��u�Ë1�A�bx/!`�|�;7(�G��}’,E�1�J@�`��Eɗ�@�N-��kZ�X��S�ո9�����Q<	�k hu]�����ת��a,FFbޠ������F�բ�U(��%*۟�ݸ��V�1ry�yȏb��!j)dDf�0�j@2��ZJ�j��q֯��@yׯc�Z����c���z8�^vԉ��Z�A�*���ՃsEY_��t������Ѥ/�I���P)$K���.:8Vs��眏�^ԏg}o�U���&�t�:�ۧb�D��K!�] t��=���q�~p��[��j�[�~���/���V�@!%H��z��]]w�R��J�0>�4�-?O��~��W��[+�d��z.�m�y�ڂ�F��������7����n�����\x�nox���K!dQx�s��V�R��+ �Z���
����'1���62����wr�VE
�h�6�T�T�ze�_#�~^�
F�t_��[�pi��1�2�dž��A~�Ӵ�:B���*M�(6X===�FY&<f������AiC���5z�+u֏ۏ��-��
���#���۠]��k��P�c�y=�����>�va�2���V���(�Ӝ]���NPnj��D�>��'ɖưT�*D�P�_��q:��`��:����������}L�n�����
Ops�N�ξ@&�!�q��8jD�/�K����e���=.������Y;v�Zaj����<�^��eۉ��z�..~��(�ɟk"3���f���h�XZlX��"�1���Y��aWҦ3k�@�[7n�J�����w�/h�s��>!���D�Q�d�L��5����_�6yzE�䯠�����S
���Nq21ucH��z�o�x�[X���)U����)����~mt(g���;PNe�AZ�ןڇ�@�??�)�њ�����QLw�:}�T%L�A�ۯ�9fs�(+M��Y?�6���͛�R��}݉JyQ}�-
x����R.��I���\�~9d�Iotq���NplR&$�+UA!��x.�A#���X?��(�,��m�8�p7TP��E��V�^$�aV����TA�a$J�Q�������H�SA����+M��}L2IEND�B`�components/com_slideshowck/elements/ckproonly.php000060400000002314152453623440016457 0ustar00<?php
/**
 * @copyright	Copyright (C) 2017 Cedric KEIFLIN alias ced1870
 * http://www.joomlack.fr
 * @license		GNU/GPL
 * */

defined('JPATH_PLATFORM') or die;

require_once 'ckformfield.php';

class JFormFieldCkproonly extends CKFormField
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 *
	 */
	protected $type = 'ckproonly';

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string  The field input markup.
	 *
	 */
	protected function getLabel()
	{
		return '';
	}

	/**
	 * Method to get the field label markup.
	 *
	 * @return  string  The field label markup.
	 *
	 */
	protected function getInput()
	{
		$html = '<div class="ckinfo"><i class="fas fa-info"></i><a href="https://www.joomlack.fr/en/joomla-extensions/slideshow-ck" target="_blank">' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_ONLY_PRO') . '</a></div>';

		return $html;
	}

	/*
	 * Get a variable from the manifest file
	 * 
	 * @return the current version
	 */
	public static function getCurrentVersion($file_url) {
		// get the version installed
		$installed_version = 'UNKOWN';
		if ($xml_installed = simplexml_load_file($file_url)) {
			$installed_version = (string)$xml_installed->version;
		}

		return $installed_version;
	}
}
components/com_slideshowck/elements/slideshowckcolor.php000060400000002266152453623440020023 0ustar00<?php

/**
 * @copyright	Copyright (C) 2011 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * Module Maximenu CK
 * @license		GNU/GPL
 * */
// no direct access
defined('_JEXEC') or die('Restricted access');

\Joomla\CMS\Form\FormHelper::loadFieldClass('color');

// custom class extension for J3 compatibility
if (class_exists('\Joomla\CMS\Form\Field\ColorField')) {
	class JFormFieldSlideshowckcolorBase extends \Joomla\CMS\Form\Field\ColorField {}
} else {
	class JFormFieldSlideshowckcolorBase extends JFormFieldColor {}	
}

class JFormFieldSlideshowckcolor extends JFormFieldSlideshowckcolorBase {

	protected $type = 'slideshowckcolor';

	protected function getInput() {
		// Initialize some field attributes.
		$icon = $this->element['icon'];
		$suffix = $this->element['suffix'];

		$html = '';
		if (version_compare(JVERSION, '4') < 0) {
		$html .= '<div style="display:inline-block;vertical-align:top;margin-top:4px;width:20px;"><img src="' . SLIDESHOWCK_MEDIA_URI . '/images/color.png" style="margin-right:5px;" /></div>';
		}

		$html .= parent::getInput();
		if ($suffix)
			$html .= '<span style="display:inline-block;line-height:25px;">' . $suffix . '</span>';
		return $html;
	}
}

components/com_slideshowck/elements/ckinfo.php000060400000005234152453623440015714 0ustar00<?php
/**
 * @copyright	Copyright (C) 2017 Cedric KEIFLIN alias ced1870
 * http://www.joomlack.fr
 * @license		GNU/GPL
 * */

defined('JPATH_PLATFORM') or die;

require_once 'ckformfield.php';

class JFormFieldCkinfo extends CKFormField
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 *
	 */
	protected $type = 'ckinfo';

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string  The field input markup.
	 *
	 */
	protected function getLabel()
	{
		return '';
	}

	/**
	 * Method to get the field label markup.
	 *
	 * @return  string  The field label markup.
	 *
	 */
	protected function getInput()
	{
		$doc = \Joomla\CMS\Factory::getDocument();
		$styles = '.ckinfo {position:relative;background:#efefef;border: none;border-radius: px;color: #333;font-weight: normal;line-height: 24px;padding: 5px 5px 5px 35px;margin: 3px 0;text-align: left;text-decoration: none;}
.ckinfo > .fas {
	font-size: 15px;
	padding: 3px 5px;
	background: rgba(0, 0, 0, 0.1);
	position: absolute;
	top: 0;
	bottom: 0;
	left: 0;
	line-height: 25px;
	width: 30px;
	text-align: center;
	box-sizing: border-box;
}
.ckinfo img {margin: 0 10px 0 0;}
.control-label:empty {display: none;}
.control-label:empty + .controls {margin: 0;}
';
		$doc->addStyleDeclaration($styles);

		// get the extension version
		$current_version = $this->getCurrentVersion(JPATH_SITE .'/administrator/components/com_slideshowck/slideshowck.xml');
		$html = '';
		$html .= '<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">';
		$html .= '<div class="ckinfo"><i class="fas fa-thumbs-up"></i><a href="https://extensions.joomla.org/extensions/extension/photos-a-images/slideshow/slideshow-ck" target="_blank">' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_VOTE_JED') . '</a></div>';
		$html .= '<div class="ckinfo"><i class="fas fa-info"></i><b>SLIDESHOW CK</b> - ' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_CURRENT_VERSION') . ' : <span class="label">' . $current_version . '</span></div>';
		$html .= '<div class="ckinfo"><i class="fas fa-file-alt"></i><a href="https://www.joomlack.fr/en/documentation/48-slideshow-ck" target="_blank">' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_DOCUMENTATION') . '</a></div>';

		return $html;
	}

	/*
	 * Get a variable from the manifest file
	 * 
	 * @return the current version
	 */
	public static function getCurrentVersion($file_url) {
		// get the version installed
		$installed_version = 'UNKOWN';
		if ($xml_installed = simplexml_load_file($file_url)) {
			$installed_version = (string)$xml_installed->version;
		}

		return $installed_version;
	}
}
components/com_slideshowck/elements/ckradio.php000060400000004502152453623440016054 0ustar00<?php

/**
 * @copyright	Copyright (C) 2011 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * @license		GNU/GPL
 * */
defined('JPATH_PLATFORM') or die;

require_once 'ckformfield.php';

class JFormFieldCkradio extends CKFormField {

	protected $type = 'ckradio';

	protected function getInput() {
		$html = array();

		// Initialize some field attributes.
		$class = $this->element['class'] ? ' class="radio ' . (string) $this->element['class'] . '"' : ' class="radio"';
		$icon = $this->element['icon'];

		// Start the radio field output.
		$html[] = $icon ? '<div style="display:inline-block;vertical-align:top;margin-top:5px;width:20px;"><img src="' . $this->mediaPath . $icon . '" style="margin-right:5px;" /></div>' : '<div style="display:inline-block;width:20px;"></div>';
		$html[] = '<fieldset id="' . $this->id . '-fieldset"' . $class . ' style="display:inline-block;">';
		$html[] = '<input type="hidden" isradio="1" id="' . $this->id . '" class="' . $this->element['class'] . '" value="' . $this->value . '" />';

		// Get the field options.
		$options = $this->getOptions();

		// Build the radio field output.
		foreach ($options as $i => $option) {

			if (stristr($option->text, "img:"))
				$option->text = '<img src="' . $this->mediaPath . str_replace("img:", "", $option->text) . '" style="margin:0; float:none;" />';

			// Initialize some option attributes.
			$checked = ((string) $option->value == (string) $this->value) ? ' checked="checked"' : '';
			$class = !empty($option->class) ? ' class="' . $option->class . '"' : '';
			$disabled = !empty($option->disable) ? ' disabled="disabled"' : '';

			// Initialize some JavaScript option attributes.
			$onclick = !empty($option->onclick) ? ' onclick="' . $option->onclick . '"' : '';
			$onclick = ' onclick="$(\'' . $this->id . '\').setProperty(\'value\',this.value);"';

			$html[] = '<input type="radio" id="' . $this->id . $i . '" name="' . $this->name . '"' . ' value="'
					. htmlspecialchars($option->value, ENT_COMPAT, 'UTF-8') . '"' . $checked . $class . $onclick . $disabled . '/>';

			$html[] = '<label for="' . $this->id . $i . '"' . $class . '>'
					. \Joomla\CMS\Language\Text::alt($option->text, preg_replace('/[^a-zA-Z0-9_\-]/', '_', $this->fieldname)) . '</label>';
		}

		// End the radio field output.
		$html[] = '</fieldset>';

		return implode($html);
	}

	

}
components/com_slideshowck/elements/ckdocumentation.php000060400000001464152453623440017633 0ustar00<?php

/**
 * @copyright	Copyright (C) 2011 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * @license		GNU/GPL
 * */
// no direct access
defined('_JEXEC') or die('Restricted access');

require_once 'ckformfield.php';

class JFormFieldCkdocumentation extends CKFormField {

	protected $type = 'ckdocumentation';

	protected function getLabel() {
		return '';
	}

	protected function getInput() {
		$html = array();

		$icon = $this->element['icon'] ? $this->element['icon'] : 'file-alt';
		$url = $this->element['url'] ? $this->element['url'] : 'https://www.joomlack.fr/en/documentation';
		$html[] = '<div class="ckinfo"><i class="fas fa-' . $icon . '"></i><a href="' . $url . '" target="_blank">' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_DOCUMENTATION') . '</a></div>';

		return implode('', $html);
	}
}

components/com_slideshowck/elements/ckheight.php000060400000014317152453623440016233 0ustar00<?php

/**
 * @copyright	Copyright (C) 2011-2019 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * @license		GNU/GPL
 * */
defined('JPATH_PLATFORM') or die;

// custom class extension for J3 compatibility
if (class_exists('\Joomla\CMS\Form\Field\HiddenField')) {
	class JFormFieldCkheightBase extends \Joomla\CMS\Form\Field\TextField {}
} else {
	class JFormFieldCkheightBase extends JFormFieldText {}
}

class JFormFieldCkheight extends JFormFieldCkheightBase {

	/**
	 * The form field type.
	 *
	 * @var    string
	 *
	 * @since  11.1
	 */
	protected $type = 'ckheight';

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string  The field input markup.
	 *
	 * @since   11.1
	 */
	protected function getInput() {
		// Initialize some field attributes.
		$icon = $this->element['icon'];
		$suffix = $this->element['suffix'];

		$html = $icon ? '<div class="slideshowck-field-icon" ' . ($suffix ? 'data-has-suffix="1"' : '') . '><img src="' . SLIDESHOWCK_MEDIA_URI . '/images/' . $icon . '" style="margin-right:5px;" /></div>' : '<div style="display:inline-block;width:20px;"></div>';

		$html .= parent::getInput();
		if ($suffix)
			$html .= '<span class="slideshowck-field-suffix">' . $suffix . '</span>';
			
		$html .= '<span class="ckbutton" onclick="CKBox.open({handler: \'inline\', content: \'ckheightfieldhelp\', style: {padding: \'10px\'}, size: {x:  \'800px\', y: \'550px\'}})"><i class="fas fa-info"></i></span>';
		$html .= '<div id="ckheightfieldhelp" style="display: none;"><h3>' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_HEIGHT_FIELD_HELP_TITLE') . '</h3>
		<p>' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_HEIGHT_FIELD_HELP_1') . '</p>
		<p><b>' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_HEIGHT_FIELD_HELP_2') . '</b></p>
		<p>' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_HEIGHT_FIELD_HELP_3') . '</p>
		<p>' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_HEIGHT_FIELD_HELP_4') . '</p>
		<p style="text-align:center;padding:10px;font-size: 18px;">1280 x 800 px</p>
		<p>' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_HEIGHT_FIELD_HELP_5') . '</p>
		<p><b>' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_CALCULATOR') . '</b></p>
		<p><label for="ckheightfieldhelpheight">' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_HEIGHT_LABEL') . '</label><input type="text" id="ckheightfieldhelpheight" onchange="ckHeightFieldHelpCalculator()"/></p>
		<p><label for="ckheightfieldhelpwidth">' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_WIDTH_LABEL') . '</label><input type="text" id="ckheightfieldhelpwidth" onchange="ckHeightFieldHelpCalculator()" /></p>
		<p><label for="ckheightfieldhelpratio">' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_RATIO_LABEL') . '</label><input type="text" id="ckheightfieldhelpratio" style="font-size: 18px;" /></p>
		<script>function ckHeightFieldHelpCalculator() {
			document.getElementById("ckheightfieldhelpratio").value = parseFloat(document.getElementById("ckheightfieldhelpheight").value) / parseFloat(document.getElementById("ckheightfieldhelpwidth").value) * 100;
		}</script>
		</div>';
		return $html;
		
		// Initialize some field attributes.
		$icon = $this->element['icon'];
		$suffix = $this->element['suffix'];
		$size = $this->element['size'] ? ' size="' . (int) $this->element['size'] . '"' : '';
		$maxLength = $this->element['maxlength'] ? ' maxlength="' . (int) $this->element['maxlength'] . '"' : '';
		$class = $this->element['class'] ? ' class="' . (string) $this->element['class'] . '"' : '';
		$readonly = ((string) $this->element['readonly'] == 'true') ? ' readonly="readonly"' : '';
		$disabled = ((string) $this->element['disabled'] == 'true') ? ' disabled="disabled"' : '';
		$defautlwidth = $suffix ? '128px' : '150px';
		$styles = ' style="width:' . $defautlwidth . ';' . $this->element['styles'] . '"';

		// Initialize JavaScript field attributes.
		$onchange = $this->element['onchange'] ? ' onchange="' . (string) $this->element['onchange'] . '"' : '';
		$html = $icon ? '<div style="display:inline-block;vertical-align:top;margin-top:4px;width:20px;"><img src="' . $this->mediaPath . $icon . '" style="margin-right:5px;" /></div>' : '<div style="display:inline-block;width:20px;"></div>';
		$html .= '<div class="ckbutton-group"><input type="text" name="' . $this->name . '" id="' . $this->id . '"' . ' value="'
				. htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8') . '"' . $class . $size . $disabled . $readonly . $onchange . $maxLength . $styles . '/>';
				
				
				// $html = parent::getInput();
		$html .= '<span class="ckbutton" onclick="CKBox.open({handler: \'inline\', content: \'ckheightfieldhelp\', style: {padding: \'10px\'}, size: {x:  \'800px\', y: \'550px\'}})"><i class="fas fa-info"></i></span></div>';
		$html .= '<div id="ckheightfieldhelp" style="display: none;"><h3>' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_HEIGHT_FIELD_HELP_TITLE') . '</h3>
		<p>' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_HEIGHT_FIELD_HELP_1') . '</p>
		<p><b>' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_HEIGHT_FIELD_HELP_2') . '</b></p>
		<p>' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_HEIGHT_FIELD_HELP_3') . '</p>
		<p>' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_HEIGHT_FIELD_HELP_4') . '</p>
		<p style="text-align:center;padding:10px;font-size: 18px;">1280 x 800 px</p>
		<p>' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_HEIGHT_FIELD_HELP_5') . '</p>
		<p><b>' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_CALCULATOR') . '</b></p>
		<p><label for="ckheightfieldhelpheight">' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_HEIGHT_LABEL') . '</label><input type="text" id="ckheightfieldhelpheight" onchange="ckHeightFieldHelpCalculator()"/></p>
		<p><label for="ckheightfieldhelpwidth">' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_WIDTH_LABEL') . '</label><input type="text" id="ckheightfieldhelpwidth" onchange="ckHeightFieldHelpCalculator()" /></p>
		<p><label for="ckheightfieldhelpratio">' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_RATIO_LABEL') . '</label><input type="text" id="ckheightfieldhelpratio" style="font-size: 18px;" /></p>
		<script>function ckHeightFieldHelpCalculator() {
			document.getElementById("ckheightfieldhelpratio").value = parseFloat(document.getElementById("ckheightfieldhelpheight").value) / parseFloat(document.getElementById("ckheightfieldhelpwidth").value) * 100;
		}</script>
		</div>';
		return $html;
	}

}
components/com_slideshowck/elements/ckformfield.php000060400000003674152453623440016736 0ustar00<?php

/**
 * @copyright	Copyright (C) 2011 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * @license		GNU/GPL
 * */
// no direct access
defined('_JEXEC') or die('Restricted access');

// custom class extension for J3 compatibility
if (class_exists('\Joomla\CMS\Form\FormField')) {
	class CKFormFieldBase extends \Joomla\CMS\Form\FormField {}
} else {
	class CKFormFieldBase extends JFormField {}	
}


class CKFormField extends CKFormFieldBase {

	public $mediaPath;

	public function __construct() {
		$this->mediaPath = \Joomla\CMS\Uri\Uri::root(true) . '/media/com_slideshowck/images/';
		// loads the language files from the frontend
		$lang	= \Joomla\CMS\Factory::getLanguage();
		$lang->load('com_slideshowck', JPATH_SITE . '/components/com_slideshowck', $lang->getTag(), false);
		$lang->load('com_slideshowck', JPATH_SITE, $lang->getTag(), false);
		parent::__construct();
	}
	protected function getInput() {
		return '';
	}

	protected function getLabel() {
		return parent::getLabel();
	}

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   11.1
	 */
	protected function getOptions() {
		$options = array();

		foreach ($this->element->children() as $option) {

			// Only add <option /> elements.
			if ($option->getName() != 'option') {
				continue;
			}

			// Create a new option object based on the <option /> element.
			$tmp = \Joomla\CMS\HTML\HTMLHelper::_(
							'select.option', (string) $option['value'],
							\Joomla\CMS\Language\Text::alt(trim((string) $option), preg_replace('/[^a-zA-Z0-9_\-]/', '_', $this->fieldname)), 'value', 'text',
							((string) $option['disabled'] == 'true')
			);

			// Set some option attributes.
			$tmp->class = (string) $option['class'];

			// Set some JavaScript option attributes.
			$tmp->onclick = (string) $option['onclick'];

			// Add the option object to the result set.
			$options[] = $tmp;
		}

		reset($options);

		return $options;
	}
}
components/com_slideshowck/elements/slideshowckspacer.php000060400000003172152453623440020157 0ustar00<?php

/**
 * @copyright	Copyright (C) 2011 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * @license		GNU/GPL
 * */
// no direct access
defined('_JEXEC') or die('Restricted access');

require_once 'ckformfield.php';

class JFormFieldSlideshowckspacer extends CKFormField {

	protected $type = 'slideshowckspacer';

	protected function getLabel() {
		return '';
	}

	protected function getInput() {
		$html = array();
		$class = $this->element['class'] ? (string) $this->element['class'] : '';

		$style = $this->element['style'] ? $this->element['style'] : '';

		if ($style == 'title') {
			$doc = \Joomla\CMS\Factory::getDocument();
			$styles = '.ckinfo.cktitle {
				background:#666;
				color: #eee;
				text-transform: uppercase;
				font-weight: normal;
				line-height: 24px;
				padding: 8px 5px 8px 35px;
				margin: 3px 0;
				text-align: left;
				text-decoration: none;
				border-radius: 3px;
				}
	';
			$doc->addStyleDeclaration($styles);
		}
		
		if ((string) $this->element['hr'] == 'true') {
			$html[] = '<hr class="' . $class . '" />';
		} else {
			$label = '';
			// Get the label text from the XML element, defaulting to the element name.
			$text = $this->element['label'] ? (string) $this->element['label'] : (string) $this->element['name'];
			$text = $this->translateLabel ? \Joomla\CMS\Language\Text::_($text) : $text;

			// set the icon
			$icon = $this->element['icon'] ? $this->element['icon'] : 'info';
			$html[] = '<div class="ckinfo' . ($style == 'title' ? ' cktitle' : '') . '">' . ($style == 'title' ? '' : '<i class="fas fa-' . $icon . '"></i>') . $text . '</div>';
		}

		return implode('', $html);
	}
}

components/com_slideshowck/elements/cksource.php000060400000004460152453623440016261 0ustar00<?php
/**
 * @copyright	Copyright (C) 2019 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * @license		GNU/GPL
 * */

defined('JPATH_PLATFORM') or die;

include_once 'slideshowcklist.php';

class JFormFieldCksource extends JFormFieldSlideshowcklistBase
{

	protected $type = 'cksource';

	private $options;

	function __construct($form = null) {
		parent::__construct($form);
	}

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   11.1
	 */
	protected function getOptions() {
		$options = array();

		foreach ($this->element->children() as $option) {

			// Only add <option /> elements.
			if ($option->getName() != 'option') {
				continue;
			}

			// Create a new option object based on the <option /> element.
			$tmp = \Joomla\CMS\HTML\HTMLHelper::_(
				'select.option', (string) $option['value'], \Joomla\CMS\Language\Text::alt(trim((string) $option), preg_replace('/[^a-zA-Z0-9_\-]/', '_', $this->fieldname)), 'value', 'text', ((string) $option['disabled'] == 'true')
			);

			// Set some option attributes.
			$tmp->class = (string) $option['class'];

			// Set some JavaScript option attributes.
			$tmp->onclick = (string) $option['onclick'];

			// Add the option object to the result set.
			$options[] = $tmp;
		}

		$this->options = $options;

		// load the custom plugins
		if (\Joomla\CMS\Plugin\PluginHelper::isEnabled('system', 'slideshowck')) {
			// load the custom plugins
			require_once(JPATH_ADMINISTRATOR . '/components/com_slideshowck/helpers/ckfof.php');
			Slideshowck\CKFof::importPlugin('slideshowck');
			$sources = Slideshowck\CKFof::triggerEvent('onSlideshowckGetSourceName');

			if (count($sources)) {
				foreach ($sources as $source) {

					if (! $this->findOption($source)) {
						$tmp = \Joomla\CMS\HTML\HTMLHelper::_(
							'select.option', (string) $source, \Joomla\CMS\Language\Text::alt(trim((string) 'SLIDESHOWCK_SOURCE_' . strtoupper($source)), preg_replace('/[^a-zA-Z0-9_\-]/', '_', $this->fieldname)), 'value', 'text', '0'
						);
						// Add the option object to the result set.
						$this->options[] = $tmp;
					}
				}
			}
		}

		reset($this->options);

		return $this->options;
	}

	public function findOption($source) {
		foreach ($this->options as $o) {
			if ($o->value == $source) return true;
		}
		return false;
	}
}
components/com_slideshowck/elements/cklist.php000060400000004461152453623440015735 0ustar00<?php

/**
 * @copyright	Copyright (C) 2011-2019 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * @license		GNU/GPL
 * */
defined('JPATH_PLATFORM') or die;

jimport('joomla.html.html');
jimport('joomla.form.formfield');

require_once 'ckformfield.php';

class JFormFieldCklist extends CKFormField {

	protected $type = 'cklist';

	protected function getInput() {
		// Initialize variables.
		$html = array();
		$attr = '';
		$icon = $this->element['icon'];
		$suffix = $this->element['suffix'];

		// Initialize some field attributes.
		$attr .= $this->element['class'] ? ' class="' . (string) $this->element['class'] . '"' : '';

		// To avoid user's confusion, readonly="true" should imply disabled="true".
		if ((string) $this->element['readonly'] == 'true' || (string) $this->element['disabled'] == 'true') {
			$attr .= ' disabled="disabled"';
		}

		$attr .= $this->element['size'] ? ' size="' . (int) $this->element['size'] . '"' : '';
		$attr .= $this->multiple ? ' multiple="multiple"' : '';
		$attr .= ' style="width:150px;' . $this->element['styles'] . '"';

		// Initialize JavaScript field attributes.
		$attr .= $this->element['onchange'] ? ' onchange="' . (string) $this->element['onchange'] . '"' : '';

		// Get the field options.
		$options = (array) $this->getOptions();

		// Create a read-only list (no name) with a hidden input to store the value.
		if ((string) $this->element['readonly'] == 'true') {
			$html[] = $icon ? '<div style="display:inline-block;vertical-align:top;margin-top:5px;width:20px;"><img src="' . $this->mediaPath . $icon . '" style="margin-right:5px;" /></div>' : '<div style="display:inline-block;width:20px;"></div>';
			$html[] = \Joomla\CMS\HTML\HTMLHelper::_('select.genericlist', $options, '', trim($attr), 'value', 'text', $this->value, $this->id);
			$html[] = '<input type="hidden" name="' . $this->name . '" value="' . $this->value . '"/>';
		}
		// Create a regular list.
		else {
			$html[] = $icon ? '<div style="display:inline-block;vertical-align:top;width:20px;"><img src="' . $this->mediaPath . $icon . '" style="margin-right:5px;" /></div>' : '<div style="display:inline-block;width:20px;"></div>';
			$html[] = \Joomla\CMS\HTML\HTMLHelper::_('select.genericlist', $options, $this->name, trim($attr), 'value', 'text', $this->value, $this->id);
		}

		return implode($html);
	}

}
components/com_slideshowck/elements/ckstyle.php000060400000006714152453623440016125 0ustar00<?php
/**
 * @copyright	Copyright (C) 2016 Cedric KEIFLIN alias ced1870
 * http://www.joomlack.fr
 * @license		GNU/GPL
 * */

defined('JPATH_PLATFORM') or die;

require_once 'ckformfield.php';
require_once JPATH_ROOT . '/administrator/components/com_slideshowck/helpers/helper.php';

\Joomla\CMS\Language\Text::script('SLIDESHOWCK_SAVE_CLOSE');

class JFormFieldCkstyle extends CKFormField {

	protected $type = 'ckstyle';

	protected function getInput() {
		$doc = \Joomla\CMS\Factory::getDocument();
		// Initialize some field attributes.
		$js = 'function ckSelectStyle(id, name, close) {
			if (!close && close != false) close = true;
			jQuery("#' . $this->id . '").val(id);
			jQuery("#' . $this->id . 'name").val(name);
			if (close) CKBox.close(\'#ckstylesmodal .ckboxmodal-button\');
		}';
		$doc->addScriptDeclaration($js);
		
		$icon = $this->element['icon'];
		$suffix = $this->element['suffix'];
		$size = $this->element['size'] ? ' size="' . (int) $this->element['size'] . '"' : '';
		$maxLength = $this->element['maxlength'] ? ' maxlength="' . (int) $this->element['maxlength'] . '"' : '';
		$class = $this->element['class'] ? ' class="' . (string) $this->element['class'] . '"' : '';
		$readonly = ((string) $this->element['readonly'] == 'true') ? ' readonly="readonly"' : '';
		$disabled = ((string) $this->element['disabled'] == 'true') ? ' disabled="disabled"' : '';
		$defautlwidth = $suffix ? '128px' : '150px';
		$styles = ' style="width:'.$defautlwidth.';'.$this->element['styles'].'"';
		$styleName = SlideshowckHelper::getStyleNameById($this->value);

		// Initialize JavaScript field attributes.
		$onchange = $this->element['onchange'] ? ' onchange="' . (string) $this->element['onchange'] . '"' : '';
		$html = $icon ? '<div style="display:inline-block;vertical-align:top;margin-top:4px;width:20px;"><img src="' . SLIDESHOWCK_MEDIA_URI . '/images/' . $icon . '" style="margin-right:5px;" /></div>' : '<div style="display:inline-block;width:20px;"></div>';		

		$html .= '<div class="ckbutton-group">';
		$html .= '<input type="hidden" name="' . $this->name . '" id="' . $this->id . '"' . ' value="'
			. htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8') . '"' . $class . $size . $disabled . $readonly . $onchange . $maxLength . $styles . '/>';
		$html .= '<input type="text" disabled name="' . $this->name . 'name" id="' . $this->id . 'name"' . ' value="'
			. htmlspecialchars($styleName) . '"' . $class . $size . $disabled . $readonly . $onchange . $maxLength . $styles . '/>';
		$footerHtml = '<a class="ckboxmodal-button" href="javascript:void(0)" onclick="ckSaveIframe(\'test\')">' . \Joomla\CMS\Language\Text::_('CK_CREATE_NEW') . '</a>';
		$html .= '<div class="ckbutton" onclick="CKBox.open({id: \'ckstylesmodal\', url: \'index.php?option=com_slideshowck&view=styles&tmpl=component&layout=modal\', style: {padding: \'0px\'}})"><i class="fas fa-mouse-pointer "></i> ' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_SELECT') . '</div>';
		$html .= '<div class="ckbutton" onclick="CKBox.open({url: \'index.php?option=com_slideshowck&view=style&tmpl=component&layout=modal&id=\'+jQuery(\'#' . $this->id . '\').val()+\'\'})"><i class="fas fa-edit"></i> ' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_EDIT') . '</div>';
		$html .= '<div class="ckbutton cktip" onclick="jQuery(\'#' . $this->id . '\').val(\'\');jQuery(\'#' . $this->id . 'name\').val(\'\');" title="' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_REMOVE') . '"><i class="fas fa-times"></i></div>';
		$html .= '</div>';

		return $html;
	}
}
components/com_slideshowck/elements/slideshowcktext.php000060400000002160152453623440017662 0ustar00<?php

/**
 * @copyright	Copyright (C) 2011-2019 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * @license		GNU/GPL
 * */
defined('JPATH_PLATFORM') or die;

// custom class extension for J3 compatibility
if (class_exists('\Joomla\CMS\Form\Field\TextField')) {
	class JFormFieldSlideshowcktextBase extends \Joomla\CMS\Form\Field\TextField {}
} else {
	class JFormFieldSlideshowcktextBase extends JFormFieldText {}	
}

class JFormFieldSlideshowcktext extends JFormFieldSlideshowcktextBase {

	/**
	 * The form field type.
	 *
	 * @var    string
	 */
	protected $type = 'slideshowcktext';

	protected function getInput() {
		// Initialize some field attributes.
		$icon = $this->element['icon'];
		$suffix = $this->element['suffix'];

		$html = $icon ? '<div class="slideshowck-field-icon" ' . ($suffix ? 'data-has-suffix="1"' : '') . '><img src="' . SLIDESHOWCK_MEDIA_URI . '/images/' . $icon . '" style="margin-right:5px;" /></div>' : '<div class="slideshowck-field-icon"></div>';

		$html .= parent::getInput();
		if ($suffix)
			$html .= '<span class="slideshowck-field-suffix">' . $suffix . '</span>';
		return $html;
	}

}
components/com_slideshowck/elements/cklight.php000060400000002525152453623440016070 0ustar00<?php

/**
 * @copyright	Copyright (C) 2017 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * @license		GNU/GPL
 * */
// no direct access
defined('JPATH_PLATFORM') or die;

require_once 'ckformfield.php';

class JFormFieldCklight extends CKFormField {

	protected $type = 'cklight';

	protected function getLabel() {
		return '';
	}

	protected function getInput() {
		$html = array();

		// Add the label text and closing tag.
		$html[] = '<div id="' . $this->id . '-lbl" class="ckinfo">';
		$html[] = '<i class="fas fa-info" style="color:orange"></i>';
		$html[] = \Joomla\CMS\Language\Text::_('SLIDESHOWCK_USE_FREE_VERSION');
		$html[] = ' <a href="https://www.joomlack.fr/en/joomla-extensions/slideshow-ck" target="_blank">';
		$html[] = '<span class="cklabel cklabel-info"><i class="fas fa-link"></i> ' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_GET_PRO_INFOS') . '</label>';
		$html[] = '</a>';
		$html[] = '</div>';

//		if (! $testparams) {
			$html[] = 'Mettre ici description de la version pro avec les fonctionnalités et le lien';
//		}

		return implode('', $html);
	}

	protected function testParams() {
		if (\Joomla\CMS\Filesystem\File::exists(JPATH_ROOT.'/plugins/system/slideshowckparams/slideshowckparams.php')) {
			$this->state = 'green';
			return \Joomla\CMS\Language\Text::_('SLIDESHOWCK_USE_PRO_VERSION');
		}
		return false;
	}
}components/com_slideshowck/elements/slideshowckradio.php000060400000002673152453623440020005 0ustar00<?php

/**
 * @copyright	Copyright (C) 2011 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * @license		GNU/GPL
 * */
defined('JPATH_PLATFORM') or die;

\Joomla\CMS\Form\FormHelper::loadFieldClass('radio');

// custom class extension for J3 compatibility
if (class_exists('\Joomla\CMS\Form\Field\RadioField')) {
	class JFormFieldSlideshowckradioBase extends \Joomla\CMS\Form\Field\RadioField {}
} else {
	class JFormFieldSlideshowckradioBase extends JFormFieldRadio {}	
}

class JFormFieldSlideshowckradio extends JFormFieldSlideshowckradioBase {

	protected $type = 'slideshowckradio';

	protected function getInput() {
		// Initialize some field attributes.
		$icon = $this->element['icon'];
		$suffix = $this->element['suffix'];

		$html = $icon ? '<div class="slideshowck-field-icon" ' . ($suffix ? 'data-has-suffix="1"' : '') . '><img src="' . SLIDESHOWCK_MEDIA_URI . '/images/' . $icon . '" style="margin-right:5px;" /></div>' : '<div style="display:inline-block;width:20px;"></div>';

		$html .= parent::getInput();
		if ($suffix)
			$html .= '<span class="slideshowck-field-suffix">' . $suffix . '</span>';
		return $html;
	}

	protected function getOptions()
	{
		$options = parent::getOptions();
		foreach ($options as $option) {
			if (stristr($option->text, "img:"))
				$option->text = '<img src="' . SLIDESHOWCK_MEDIA_URI . '/images/' . str_replace("img:", "", $option->text) . '" style="margin:0; float:none;" />';
		}
		return $options;
	}
}
components/com_slideshowck/elements/ckpro.php000060400000001745152453623440015564 0ustar00<?php

/**
 * @copyright	Copyright (C) 2017 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * @license		GNU/GPL
 * */
// no direct access
defined('JPATH_PLATFORM') or die;

require_once 'ckformfield.php';

class JFormFieldCkpro extends CKFormField {

	protected $type = 'ckpro';

	private $state;

	protected function getLabel() {
		return '';
	}

	protected function getInput() {
		$html = array();

		// Add the label text and closing tag.
		$html[] = '<div id="' . $this->id . '-lbl" class="ckinfo">';
		$html[] = '<i class="fas fa-info" style="color:green"></i>';
		$html[] = \Joomla\CMS\Language\Text::_('SLIDESHOWCK_USE_PRO_VERSION');
		$html[] = ' <a href="https://www.joomlack.fr/en/documentation/miscellaneous/202-license-code" target="_blank">';
		$html[] = '<span class="cklabel cklabel-info"><i class="fas fa-link"></i> ' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_GET_LICENCE_INFOS') . '</label>';
		$html[] = '</a>';
		$html[] = '</div>';

		return implode('', $html);
	}
}components/com_slideshowck/elements/ckfolderlist.php000060400000004462152453623440017132 0ustar00<?php
/**
 * @copyright	Copyright (C) 2011 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * Module Maximenu CK
 * @license		GNU/GPL
 * */

defined('JPATH_PLATFORM') or die;

jimport('joomla.html.html');
jimport('joomla.filesystem.folder');
jimport('joomla.form.formfield');
jimport('joomla.form.helper');
\Joomla\CMS\Form\FormHelper::loadFieldClass('list');

// custom class extension for J3 compatibility
if (class_exists('\Joomla\CMS\Form\Field\ListField')) {
	class JFormFieldCkfolderListBase extends \Joomla\CMS\Form\Field\ListField {}
} else {
	class JFormFieldCkfolderListBase extends JFormFieldList {}	
}

class JFormFieldCkfolderList extends JFormFieldCkfolderListBase
{

	public $type = 'ckfolderlist';

	protected function getOptions()
	{
		// Initialize variables.
		$options = array();

		// Initialize some field attributes.
		$filter			= (string) $this->element['filter'];
		$exclude		= (string) $this->element['exclude'];
		$hideNone		= (string) $this->element['hide_none'];
		$hideDefault	= (string) $this->element['hide_default'];

		// Get the path in which to search for file options.
		$path = (string) $this->element['directory'];
		if (!is_dir($path)) {
			$path = JPATH_ROOT.'/'.$path;
		}

		// Prepend some default options based on field attributes.
		if (!$hideNone) {
			$options[] = \Joomla\CMS\HTML\HTMLHelper::_('select.option', '-1', \Joomla\CMS\Language\Text::alt('JOPTION_DO_NOT_USE', preg_replace('/[^a-zA-Z0-9_\-]/', '_', $this->fieldname)));
		}
		if (!$hideDefault) {
			$options[] = \Joomla\CMS\HTML\HTMLHelper::_('select.option', '', \Joomla\CMS\Language\Text::alt('JOPTION_USE_DEFAULT', preg_replace('/[^a-zA-Z0-9_\-]/', '_', $this->fieldname)));
		}

		// Get a list of folders in the search path with the given filter.
		$folders = \Joomla\CMS\Filesystem\Folder::folders($path, $filter);

		// Build the options list from the list of folders.
		if (is_array($folders)) {
			foreach($folders as $folder) {

				// Check to see if the file is in the exclude mask.
				if ($exclude) {
					if (preg_match(chr(1).$exclude.chr(1), $folder)) {
						continue;
					}
				}

				$options[] = \Joomla\CMS\HTML\HTMLHelper::_('select.option', $folder, $folder);
			}
		}

		// Merge any additional options in the XML definition.
		$options = array_merge(parent::getOptions(), $options);

		return $options;
	}
}
components/com_slideshowck/elements/slideshowckinterface.php000060400000004403152453623440020640 0ustar00<?php
/**
 * @copyright	Copyright (C) 2017 Cedric KEIFLIN alias ced1870
 * http://www.joomlack.fr
 * @license		GNU/GPL
 * */

defined('JPATH_PLATFORM') or die;

use Slideshowck\CKFramework;

include_once JPATH_ROOT . '/administrator/components/com_slideshowck/helpers/ckframework.php';
include_once JPATH_ROOT . '/administrator/components/com_slideshowck/helpers/defines.php';

\Joomla\CMS\Form\FormHelper::loadFieldClass('hidden');
CKFramework::load();
// custom class extension for J3 compatibility
if (class_exists('\Joomla\CMS\Form\Field\HiddenField')) {
	class JFormFieldSlideshowckinterfaceBase extends \Joomla\CMS\Form\Field\HiddenField {}
} else {
	class JFormFieldSlideshowckinterfaceBase extends JFormFieldHidden {}	
}

class JFormFieldSlideshowckinterface extends JFormFieldSlideshowckinterfaceBase
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 *
	 */
	protected $type = 'slideshowckinterface';

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string  The field input markup.
	 *
	 */
	protected function getLabel()
	{
		return '';
	}

	/**
	 * Method to get the field label markup.
	 *
	 * @return  string  The field label markup.
	 *
	 */
	protected function getInput()
	{
		// loads the language files from the frontend
		$lang	= \Joomla\CMS\Factory::getLanguage();
		$lang->load('com_slideshowck', JPATH_SITE . '/components/com_slideshowck', $lang->getTag(), false);
		$lang->load('com_slideshowck', JPATH_SITE, $lang->getTag(), false);

		if (version_compare(JVERSION, '4') >= 0) {
		$css = '.slideshowck-field-suffix {
	display: inline-block;
	line-height: 25px;
	transform: translate(0, -50%);
	position: absolute;
	top: 20px;
	height: 25px;
	right: 20px;
}

.slideshowck-field-icon {
	display: inline-block;
	vertical-align: top;
	margin-top: 10px;
	width: 20px;
}

.slideshowck-field-icon + input,
.slideshowck-field-icon + fieldset,
.slideshowck-field-icon + select {
	display: inline-block;
	width: calc(100% - 30px);
}

.ckbutton-group input[type="text"] {
	min-height: 28px;
	box-sizing: border-box;
	font-size: 13px;
}';
		} else {
			$css = '.slideshowck-field-icon {
	display: inline-block;
	vertical-align: top;
	margin-top: 4px;
	width: 20px;
}';
		}

		$doc = \Joomla\CMS\Factory::getDocument();
		$doc->addStyleDeclaration($css);

		return '';
	}
}
components/com_slideshowck/elements/ckcolor.php000060400000004450152453623440016076 0ustar00<?php

/**
 * @copyright	Copyright (C) 2011 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * Module Maximenu CK
 * @license		GNU/GPL
 * */
// no direct access
defined('_JEXEC') or die('Restricted access');

require_once 'ckformfield.php';

class JFormFieldCkcolor extends CKFormField {

    protected $type = 'ckcolor';

    protected function getInput() {
        $path = 'modules/mod_slideshowck/elements/jscolor/';
        \Joomla\CMS\HTML\HTMLHelper::_('script', $path.'jscolor.js');

        $html = '<img src="' . $this->getPathToImages() . '/images/color.png" /><input class="color {';
        $html.= 'required:false,';  // empty possible
        $html.= 'pickerPosition:\'top\',';    // or left / right / top
        $html.= 'pickerBorder:2,pickerInset:3,';    // or right / top
        $html.= 'hash:true';        // # behind value
        $html.= '}" type="text" value="' . $this->value . '" name="' . $this->name . '" style="width:100px;border-radius:3px;-moz-border-radius:3px;" />';
        return $html;
    }

    protected function getPathToImages() {
        $localpath = dirname(__FILE__);
        $rootpath = JPATH_ROOT;
        $httppath = trim(\Joomla\CMS\Uri\Uri::root(), "/");
        $pathtoimages = str_replace("\\", "/", str_replace($rootpath, $httppath, $localpath));
        return $pathtoimages;
    }

    protected function getLabel() {
        $label = '';
        // Get the label text from the XML element, defaulting to the element name.
        $text = $this->element['label'] ? (string) $this->element['label'] : (string) $this->element['name'];
        $text = \Joomla\CMS\Language\Text::_($text);

        // Build the class for the label.
        $class = !empty($this->description) ? 'hasTip hasTooltip' : '';

        $label .= '<label id="' . $this->id . '-lbl" for="' . $this->id . '" class="' . $class . '"';

        // If a description is specified, use it to build a tooltip.
        if (!empty($this->description)) {
            $label .= ' title="' . htmlspecialchars(trim($text, ':') . '<br />' .
                            \Joomla\CMS\Language\Text::_($this->description), ENT_COMPAT, 'UTF-8') . '"';
        }

        $label .= ' style="min-width:150px;max-width:150px;width:150px;display:block;float:left;padding:1px;">' . $text . '</label>';

        return $label;
    }

}

components/com_slideshowck/elements/ckproducts.php000060400000005326152453623440016626 0ustar00<?php

/**
 * @copyright	Copyright (C) 2017 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * @license		GNU/GPL
 * */
// no direct access
defined('JPATH_PLATFORM') or die;

require_once 'ckformfield.php';

class JFormFieldCkproducts extends CKFormField {

	protected $type = 'ckproducts';

	protected function getLabel() {
		return '';
	}

	protected function getInput() {
		$html = '<style>
.ckproduct {
	padding: 10px 20px;
	display: inline-block;
	color: #1f496e;
	border: 1px solid #1f496e;
	margin: 3px;
	border-radius: 2px;
	transition: 0.3s all;
}
.ckproduct:hover {
	background: #1f496e;
	color: #fff;
	text-decoration: none;
}
</style>
			<h3>' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_VISIT_OTHER_PRODUCTS') . '</h3>
			<div>
					<a class="ckproduct" target="_blank" href="https://www.joomlack.fr/en/joomla-extensions/accordeonmenu-ck">Accordeon Menu CK</a>
					<a class="ckproduct" target="_blank" href="https://www.joomlack.fr/en/joomla-extensions/beautiful-ck">Beautiful CK</a>
					<a class="ckproduct" target="_blank" href="https://www.joomlack.fr/en/joomla-extensions/carousel-ck">Carousel CK</a>
					<a class="ckproduct" target="_blank" href="https://www.joomlack.fr/en/download-joomla-extensions/view_category/37-cookies-ck">Cookies CK</a>
					<a class="ckproduct" target="_blank" href="https://www.joomlack.fr/en/joomla-extensions/floating-module-ck">Floating Module CK</a>
					<a class="ckproduct" target="_blank" href="https://www.joomlack.fr/en/joomla-extensions/image-effect-ck">Image Effect CK</a>
					<a class="ckproduct" target="_blank" href="https://www.joomlack.fr/en/joomla-extensions/maximenu-ck">Maximenu CK</a>
					<a class="ckproduct" target="_blank" href="https://www.joomlack.fr/en/joomla-extensions/mediabox-ck">Mediabox CK</a>
					<a class="ckproduct" target="_blank" href="https://www.joomlack.fr/en/joomla-extensions/menu-manager-ck">Menu Manager CK</a>
					<a class="ckproduct" target="_blank" href="https://www.joomlack.fr/extensions-joomla/mobile-menu-ck">Mobile Menu CK</a>
					<a class="ckproduct" target="_blank" href="https://www.joomlack.fr/en/joomla-extensions/modules-manager-ck">Modules Manager CK</a>
					<a class="ckproduct" target="_blank" href="https://www.joomlack.fr/en/joomla-extensions/page-builder-ck">Page Builder CK</a>
					<a class="ckproduct" target="_blank" href="https://www.joomlack.fr/en/joomla-extensions/scroll-to-ck">Scroll To CK</a>
					<a class="ckproduct" target="_blank" href="https://www.joomlack.fr/extensions-joomla/tooltip-gc">Tooltip CK</a>
					<a class="ckproduct" target="_blank" href="https://www.template-creator.com">Template Creator CK</a>
					<a class="ckproduct" target="_blank" href="https://www.joomlack.fr">And more...</a>
				</div>';

		return $html;
	}
}components/com_slideshowck/elements/ckslidesmanager.php000060400000011742152453623440017600 0ustar00<?php

/**
 * @copyright	Copyright (C) 2011 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * @license		GNU/GPL
 * */
// no direct access
defined('_JEXEC') or die('Restricted access');

require_once 'ckformfield.php';
require_once JPATH_ADMINISTRATOR . '/components/com_slideshowck/helpers/ckframework.php';
require_once JPATH_ADMINISTRATOR . '/components/com_slideshowck/helpers/helper.php';

Slideshowck\CKFramework::load();
SlideshowckHelper::loadCkbox();

\Joomla\CMS\Language\Text::script('SLIDESHOWCK_ADDSLIDE');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_SELECTIMAGE');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_SELECT_LINK');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_REMOVE2');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_SELECT');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_CAPTION');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_USETOSHOW');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_IMAGE');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_VIDEO');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_TEXTOPTIONS');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_IMAGEOPTIONS');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_LINKOPTIONS');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_VIDEOOPTIONS');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_ALIGNEMENT_LABEL');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_TOPLEFT');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_TOPCENTER');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_TOPRIGHT');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_MIDDLELEFT');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_CENTER');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_MIDDLERIGHT');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_BOTTOMLEFT');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_BOTTOMCENTER');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_BOTTOMRIGHT');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_LINK');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_TARGET');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_SAMEWINDOW');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_NEWWINDOW');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_VIDEOURL');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_REMOVE');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_IMPORTFROMFOLDER');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_ARTICLEOPTIONS');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_SLIDETIME');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_CLEAR');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_SELECT');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_TITLE');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_STARTDATE');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_ENDDATE');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_SAVE');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_TEXT_CUSTOM');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_ARTICLE');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_TEXT');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_VIDEO_AUTOPLAY');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_VIDEO_LOOP');
\Joomla\CMS\Language\Text::script('SLIDESHOWCK_VIDEO_CONTROLS');
\Joomla\CMS\Language\Text::script('CK_SAVE_CLOSE');

class JFormFieldCkslidesmanager extends CKFormField {

	protected $type = 'ckslidesmanager';

	protected function getInput() {

		// loads the language files from the frontend
		$lang	= \Joomla\CMS\Factory::getLanguage();
		$lang->load('com_slideshowck', JPATH_SITE . '/components/com_slideshowck', $lang->getTag(), false);
		$lang->load('com_slideshowck', JPATH_SITE, $lang->getTag(), false);

		require_once(JPATH_ROOT . '/administrator/components/com_slideshowck/helpers/defines.js.php');
		$path = 'media/com_slideshowck/assets/elements/ckslidesmanager/';
		\Joomla\CMS\HTML\HTMLHelper::_('jquery.framework');
		// \Joomla\CMS\HTML\HTMLHelper::_('jquery.ui', array('core', 'sortable'));
		\Joomla\CMS\HTML\HTMLHelper::_('script', 'media/com_slideshowck/assets/jquery-uick-custom.js');
		\Joomla\CMS\HTML\HTMLHelper::_('script', 'media/com_slideshowck/assets/admin.js');
		\Joomla\CMS\HTML\HTMLHelper::_('script', $path . 'ckslidesmanager.js');
		if (\Slideshowck\CKFof::isSite()) {
			\Joomla\CMS\HTML\HTMLHelper::_('stylesheet', 'media/com_slideshowck/assets/front-edition.css');
		}
		
		\Joomla\CMS\HTML\HTMLHelper::_('stylesheet', 'media/com_slideshowck/assets/jquery-ui.min.css');
		\Joomla\CMS\HTML\HTMLHelper::_('stylesheet', $path . 'ckslidesmanager.css');

		$html = '<input name="' . $this->name . '" id="ckslides" type="hidden" value="' . $this->value . '" />'
				. '<div class="ckaddslide ckbutton ckbutton-success" onclick="javascript:ckAddSlide(false, \'top\');"><i class="far fa-plus-square"></i> ' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_ADDSLIDE') . '</div>'
				. '<ul id="ckslideslist" class="ckinterface" style="clear:both;"></ul>'
				. '<div class="ckaddslide ckbutton ckbutton-success" onclick="javascript:ckAddSlide();"><i class="far fa-plus-square"></i> ' . \Joomla\CMS\Language\Text::_('SLIDESHOWCK_ADDSLIDE') . '</div>';

		return $html;
	}

	protected function getLabel() {

		return '';
	}
}

components/com_slideshowck/elements/slideshowcklist.php000060400000002334152453623440017654 0ustar00<?php

/**
 * @copyright	Copyright (C) 2011-2019 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * @license		GNU/GPL
 * */
defined('JPATH_PLATFORM') or die;

jimport('joomla.html.html');
jimport('joomla.form.formfield');

include_once JPATH_ROOT . '/administrator/components/com_slideshowck/helpers/defines.php';

// custom class extension for J3 compatibility
if (class_exists('\Joomla\CMS\Form\Field\ListField')) {
	class JFormFieldSlideshowcklistBase extends \Joomla\CMS\Form\Field\ListField {}
} else {
	class JFormFieldSlideshowcklistBase extends JFormFieldList {}	
}

class JFormFieldSlideshowcklist extends JFormFieldSlideshowcklistBase {

	protected $type = 'slideshowcklist';

	protected function getInput() {
		// Initialize some field attributes.
		$icon = $this->element['icon'];
		$suffix = $this->element['suffix'];

		$html = $icon ? '<div class="slideshowck-field-icon" ' . ($suffix ? 'data-has-suffix="1"' : '') . '><img src="' . SLIDESHOWCK_MEDIA_URI . '/images/' . $icon . '" style="margin-right:5px;" /></div>' : '<div style="display:inline-block;width:20px;"></div>';

		$html .= parent::getInput();
		if ($suffix)
			$html .= '<span class="slideshowck-field-suffix">' . $suffix . '</span>';
		return $html;
	}

}
components/com_slideshowck/elements/ckspacer.php000060400000003174152453623440016237 0ustar00<?php

/**
 * @copyright	Copyright (C) 2011 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * @license		GNU/GPL
 * */
// no direct access
defined('_JEXEC') or die('Restricted access');

require_once 'ckformfield.php';

class JFormFieldCkspacer extends CKFormField {

	protected $type = 'ckspacer';

	protected function getLabel() {
		return '';
	}

	protected function getInput() {
		$html = array();
		$class = $this->element['class'] ? (string) $this->element['class'] : '';

		$style = $this->element['style'] ? $this->element['style'] : '';

		if ($style == 'title') {
			$doc = \Joomla\CMS\Factory::getDocument();
			$styles = '.ckinfo.cktitle {
				background:#666;
				color: #eee;
				text-transform: uppercase;
				}
	';
			$doc->addStyleDeclaration($styles);
		}
		
		if ((string) $this->element['hr'] == 'true') {
			$html[] = '<hr class="' . $class . '" />';
		} else {
			$label = '';
			// Get the label text from the XML element, defaulting to the element name.
			$text = $this->element['label'] ? (string) $this->element['label'] : (string) $this->element['name'];
			$text = $this->translateLabel ? \Joomla\CMS\Language\Text::_($text) : $text;

			// Test to see if the patch is installed
			$testpatch = $this->element['testpatch'] ? $this->testPatch($this->element['testpatch']) : null;
			$text = $testpatch ? $testpatch : $text;

			// set the icon
			$icon = $this->element['icon'] ? $this->element['icon'] : 'info';
			$html[] = '<div class="ckinfo' . ($style == 'title' ? ' cktitle' : '') . '">' . ($style == 'title' ? '' : '<i class="fas fa-' . $icon . '"></i>') . $text . '</div>';
		}
		
		return implode('', $html);
	}
}

components/com_slideshowck/elements/ckmigrate.php000060400000011437152453623440016413 0ustar00<?php
/**
 * @copyright	Copyright (C) 2019 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * @license		GNU/GPL
 * */

defined('JPATH_PLATFORM') or die;

use \Slideshowck\CKFof;
use \Slideshowck\CKFolder;
use \Slideshowck\CKFile;
use \Slideshowck\CKText;

require_once 'ckformfield.php';
require_once JPATH_ROOT . '/administrator/components/com_slideshowck/helpers/ckfof.php';
require_once JPATH_ROOT . '/administrator/components/com_slideshowck/helpers/ckfolder.php';
require_once JPATH_ROOT . '/administrator/components/com_slideshowck/helpers/ckfile.php';
require_once JPATH_ROOT . '/administrator/components/com_slideshowck/helpers/cktext.php';

class JFormFieldCkmigrate extends CKFormField
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 *
	 */
	protected $type = 'ckmigrate';

	private $options;

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string  The field input markup.
	 *
	 */
	protected function getLabel()
	{
		return '';
	}

	/**
	 * Method to get the field label markup.
	 *
	 * @return  string  The field label markup.
	 *
	 */
	protected function getInput()
	{
		$input = \Joomla\CMS\Factory::getApplication()->input;
		$id = $input->get('id', 0, 'int');
		$doMigration = $input->get('domigration', 0, 'int');
		if (! $id) return '';

		$options = $this->getModuleOptions($id);
//var_dump($options);die;
		$params = json_decode($options->params);
		if (isset($params->slidesssource)) {
			$this->makeBackup($id, $options->params);
			if ($doMigration) {
				$this->doMigration($id, $options->params);
			} else {
				CKfof::enqueueMessage(CKText::_('SLIDESHOWCK_MIGRATION_NEEDED'), 'warning');
				CKfof::enqueueMessage('<a href="' . CKFof::getCurrentUri() . '&domigration=1">' . CKText::_('SLIDESHOWCK_MIGRATION_ACTION') . '</a>', 'warning');
			}
		}

		if ($this->isPluginEnabled()) {
			CKFof::dbExecute("UPDATE #__extensions SET enabled = 0 WHERE element = 'slideshowckparams'");
			CKfof::enqueueMessage(CKText::_('SLIDESHOWCK_PARAMS_UNPUBLISHED_INFO'), 'warning');
			CKfof::enqueueMessage('<a href="https://www.joomlack.fr/en/documentation/48-slideshow-ck/246-migration-from-slideshow-ck-version-1-to-version-2" target="_blank">' . CKText::_('SLIDESHOWCK_PARAMS_MIGRATION_LINK') . '</a>', 'warning');
			CKfof::redirect();
		}

		$this->alertObsoletePlugin($params, 'hikashop');
		$this->alertObsoletePlugin($params, 'k2');
		$this->alertObsoletePlugin($params, 'joomgallery');
	}

	protected function alertObsoletePlugin($params, $plugin) {
		if (isset($params->source) && $params->source == $plugin && $this->isPluginEnabled('slideshowck' . $plugin)) {
			CKfof::enqueueMessage(CKText::_('SLIDESHOWCK_WARNING_PLUGIN_OBSOLETE') . ' : ' . '<b>slideshowck' . $plugin . '</b>', 'warning');
			CKfof::enqueueMessage('<a href="index.php?option=com_plugins&view=plugins&filter_element=slideshowck' . $plugin . '" target="_blank">' . CKText::_('SLIDESHOWCK_DISABLE_PLUGIN') . '</a>', 'warning');
		}
	}

	protected function isPluginEnabled($plugin = 'slideshowckparams') {
		if (file_exists(JPATH_ROOT . '/plugins/system/' . $plugin)) {
			$isEnabled = CKFof::dbLoadResult("SELECT enabled FROM #__extensions WHERE element = '" . $plugin . "'");
			return (bool)$isEnabled;
		}
		return false;
	}

	protected function getModuleOptions($id) {
		if (empty($this->options)) {
			$this->options = CKFof::dbLoadObject("SELECT * FROM #__modules WHERE id = " . (int)$id);
		}
		return $this->options;
	}

	protected function doMigration($id, $params) {
		$find = array('slidesssource', 'imagetarget', 'articlelength', 'showarticletitle', 'lightboxtype', 'lightboxautolinkimages');
		$replace = array('source', 'linktarget', 'textlength', 'usetitle', 'lightbox', 'linkautoimage');
		$newparams = str_replace($find, $replace, $params);

		$paramsObj = new \Joomla\Registry\Registry($newparams);
		if ($paramsObj->get('slideshowckhikashop_enable', '0') == '1') $paramsObj->set('source', 'hikashop');
		if ($paramsObj->get('slideshowckjoomgallery_enable', '0') == '1') $paramsObj->set('source', 'joomgallery');
		if ($paramsObj->get('slideshowckk2_enable', '0') == '1') $paramsObj->set('source', 'k2');
		$newparams = json_encode($paramsObj);

		$data = CKFof::dbLoad('#__modules', $id);
		$data->id = $id;
		$data->params = $newparams;

		$return = CKFof::dbStore('#__modules', $data);

		if ($return) {
			CKfof::enqueueMessage(CKText::_('SLIDESHOWCK_MIGRATION_SUCCESS'), 'success');
		} else {
			CKfof::enqueueMessage(CKText::_('SLIDESHOWCK_MIGRATION_ERROR'), 'error');
		}
		CKfof::redirect();
	}

	protected function makeBackup($id, $params) {
		$path = JPATH_ROOT . '/administrator/components/com_slideshowck/backup/';

		// create the folder
		if (! CKFolder::exists($path)) {
			CKFolder::create($path);
		}

		$exportfiledest = $path . '/backup_' . $id . '_' . date("d-m-Y-G-i-s") . '.ssck';
		CKFile::write($exportfiledest, $params);
	}
}
components/com_slideshowck/elements/cktext.php000060400000003710152453623440015742 0ustar00<?php

/**
 * @copyright	Copyright (C) 2011-2019 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * @license		GNU/GPL
 * */
defined('JPATH_PLATFORM') or die;

require_once 'ckformfield.php';

class JFormFieldCktext extends CKFormField {

	/**
	 * The form field type.
	 *
	 * @var    string
	 *
	 * @since  11.1
	 */
	protected $type = 'cktext';

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string  The field input markup.
	 *
	 * @since   11.1
	 */
	protected function getInput() {
		// Initialize some field attributes.
		$icon = $this->element['icon'];
		$suffix = $this->element['suffix'];
		$size = $this->element['size'] ? ' size="' . (int) $this->element['size'] . '"' : '';
		$maxLength = $this->element['maxlength'] ? ' maxlength="' . (int) $this->element['maxlength'] . '"' : '';
		$class = $this->element['class'] ? ' class="' . (string) $this->element['class'] . '"' : '';
		$readonly = ((string) $this->element['readonly'] == 'true') ? ' readonly="readonly"' : '';
		$disabled = ((string) $this->element['disabled'] == 'true') ? ' disabled="disabled"' : '';
		$defautlwidth = $suffix ? '128px' : '150px';
		$styles = ' style="width:' . $defautlwidth . ';' . $this->element['styles'] . '"';

		// Initialize JavaScript field attributes.
		$onchange = $this->element['onchange'] ? ' onchange="' . (string) $this->element['onchange'] . '"' : '';
		$html = $icon ? '<div style="display:inline-block;vertical-align:top;margin-top:4px;width:20px;"><img src="' . $this->mediaPath . $icon . '" style="margin-right:5px;" /></div>' : '<div style="display:inline-block;width:20px;"></div>';
		$html .= '<input type="text" name="' . $this->name . '" id="' . $this->id . '"' . ' value="'
				. htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8') . '"' . $class . $size . $disabled . $readonly . $onchange . $maxLength . $styles . '/>';
		if ($suffix)
			$html .= '<span style="display:inline-block;line-height:25px;">' . $suffix . '</span>';
		return $html;
	}

}
components/com_slideshowck/elements/ckbackground.php000060400000001233152453623440017073 0ustar00<?php

/**
 * @copyright	Copyright (C) 2011 Cedric KEIFLIN alias ced1870
 * https://www.joomlack.fr
 * @license		GNU/GPL
 * */
// no direct access
defined('_JEXEC') or die('Restricted access');

require_once 'ckformfield.php';

class JFormFieldCkbackground extends CKFormField {

	protected $type = 'ckbackground';

	protected function getInput() {
		$styles = $this->element['styles'];
		$background = $this->element['background'] ? 'background: url(' . $this->mediaPath . $this->element['background'] . ') left top no-repeat;' : '';

		$html = '<p style="' . $background . $styles . '" ></p>';
		return $html;
	}

	protected function getLabel() {
		return '';
	}
}
components/com_slideshowck/controllers/ajax.php000060400000002166152453623440016121 0ustar00<?php
/**
 * @name		Slideshow CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */
 
// No direct access
defined('CK_LOADED') or die;

use \Slideshowck\CKController;
use \Slideshowck\CKFof;
use \Slideshowck\CKText;

class SlideshowckControllerAjax extends CKController {

	function __construct() {
		// security check
		if (! CKFof::checkAjaxToken()) exit;
		
		parent::__construct();
		
		$plugin = $this->input->get('plugin', '', 'cmd');
		$task = $this->input->get('task', '', 'cmd');

		if ($plugin) {
			if (file_exists(SLIDESHOWCK_PLUGINS_PATH . '/' . $plugin . '/helper/helper_' . $plugin . '.php')) {
				require_once(SLIDESHOWCK_PLUGINS_PATH . '/' . $plugin . '/helper/helper_' . $plugin . '.php');
				$className = 'SlideshowckHelpersource' . ucfirst($plugin);
				//SlideshowckHelpersourceArticles
				$class = new $className();
				if (method_exists($class, $task)) {
					$class::$task();
					exit;
				}
			}
		}
		die;
	}
}
components/com_slideshowck/controllers/browse.php000060400000003771152453623440016502 0ustar00<?php
/**
 * @name		Slideshow CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */
 
// No direct access
defined('CK_LOADED') or die;

use Slideshowck\CKController;
use Slideshowck\CKFof;

require_once SLIDESHOWCK_PATH . '/helpers/ckbrowse.php';

class SlideshowckControllerBrowse extends CKController {

	public function getFiles() {
		// security check
		if (! CKFof::checkAjaxToken()) {
			exit();
		}

		$folder = $this->input->get('folder', '', 'string');
		$type = $this->input->get('type', '', 'string');
		$filetypes = CKBrowse::getFileTypes($type);
		$files = CKBrowse::getImagesInFolder(JPATH_SITE . '/' . $folder, implode('|', $filetypes));

		if ($type == 'folder') {
			$pathway = str_replace('/', '</span><span class="ckfoldertreepath">', $folder);
			?>
			<div id="ckfoldertreelistfolderselection">
				<div class="ckbutton ckbutton-primary" style="font-size:20px;padding: 10px 20px;" onclick="ckSelectFolder('<?php echo ($folder) ?>')"><i class="fas fa-check-square"></i> <?php echo \Joomla\CMS\Language\Text::_('CK_SELECT_FOLDER') ?><br /><small><?php echo $pathway ?></small></div>
			</div>
		<?php }
		if (empty($files)) {
			echo \Joomla\CMS\Language\Text::_('CK_NO_IMAGE_FOUND');
		} else {
			foreach($files as $file) {
				?>
					<div class="ckfoldertreefile" data-type="<?php echo $type ?>" onclick="ckSelectFile(this)" data-path="<?php echo iconv('ISO-8859-1', 'UTF-8', $folder) ?>" data-filename="<?php echo iconv('ISO-8859-1', 'UTF-8', $file) ?>">
						<img src="<?php echo \Joomla\CMS\Uri\Uri::root(true) . '/' . iconv('ISO-8859-1', 'UTF-8', $folder) . '/' . iconv('ISO-8859-1', 'UTF-8', $file) ?>" title="<?php echo iconv('ISO-8859-1', 'UTF-8', $file); ?>" loading="lazy">
						<div class="ckimagetitle"><?php echo iconv('ISO-8859-1', 'UTF-8', $file); ?></div>
					</div>
				<?php
			}
		}
		exit;
	}
}
components/com_slideshowck/controllers/styles.php000060400000001366152453623440016522 0ustar00<?php
/**
 * @name		Slider CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2016. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - http://www.template-creator.com - http://www.joomlack.fr
 */

// No direct access.
defined('_JEXEC') or die;

jimport('joomla.application.component.controlleradmin');

/**
 * Pages list controller class.
 */
class SlideshowckControllerStyles extends \Joomla\CMS\MVC\Controller\AdminController {

	/**
	 * Proxy for getModel.
	 * @since	1.6
	 */
	public function getModel($name = 'style', $prefix = 'SlideshowckModel', $config = array()) {
		$model = parent::getModel($name, $prefix, array('ignore_request' => true));
		return $model;
	}

}components/com_slideshowck/controllers/menus.php000060400000003344152453623440016324 0ustar00<?php
/**
 * @name		Slideshow CK
 * @package		com_slideshowck
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */
 
// No direct access
defined('CK_LOADED') or die;

use \Slideshowck\CKController;
use \Slideshowck\CKFof;

class SlideshowckControllerMenus extends CKController {

	function ajaxShowMenuItems() {
		// security check
		if (! CKFof::checkAjaxToken()) {
			exit();
		}

		$parentId = $this->input->get('parentid', 0, 'int');
		$menutype = $this->input->get('menutype', '', 'string');

		$model = $this->getModel('Menus', 'Slideshowck', array());
		$items = $model->getChildrenItems($menutype, $parentId);

		$links = array();
		$imagespath = SLIDESHOWCK_MEDIA_URI .'/images/';
		?>
		<div class="cksubfolder">
		<?php
		foreach ($items as $item) {
//			CKFof::dump($item);
			$aliasId = $item->id;
			if ($item->type == 'alias') {
				$itemParams = new \Joomla\Registry\Registry($item->params);
				$aliasId = $itemParams->get('aliasoptions', 0);
			}
			$Itemid = substr($item->link,-7,7) == 'Itemid=' ? $aliasId : '&Itemid=' . $aliasId;
		?>
			<div class="ckfoldertree parent">
				<div class="ckfoldertreetoggler <?php if ($item->rgt - $item->lft <= 1) { echo 'empty'; } ?>" onclick="ckToggleTreeSub(this, <?php echo $item->id ?>)" data-menutype="<?php echo $item->menutype; ?>"></div>
				<div class="ckfoldertreename hasTip" title="<?php echo $item->link . $Itemid ?>" onclick="ckSetMenuItemUrl('<?php echo $item->link . $Itemid ?>')"><img src="<?php echo $imagespath ?>folder.png" /><?php echo $item->title; ?></div>
			</div>
		<?php
		}
		?>
		</div>
		<?php
		exit;
	}
}
components/com_slideshowck/controllers/index.html000060400000000032152453623440016450 0ustar00<html><body></body></html>components/com_slideshowck/controllers/style.php000060400000013155152453623440016336 0ustar00<?php
/**
 * @copyright	Copyright (C) 2019. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - http://www.template-creator.com - http://www.joomlack.fr
 */

// No direct access
defined('_JEXEC') or die;

use \Slideshowck\CKController;
use \Slideshowck\CKFof;

class SlideshowckControllerStyle extends CKController {

//	public function add() {
//		$this->edit(0);
		// Redirect to the edit screen.
//		CKFof::redirect(SLIDESHOWCK_ADMIN_URL . '&view=style&layout=edit&id=0&tmpl=component&layout=modal');
//	}

//	public function edit($id = null, $appendUrl = '') {
//		parent::edit($id, '&layout=modal&tmpl=component');
//	}
//
//	public function copy() {
//		parent::edit('&layout=modal&tmpl=component');
//	}

	/*
	 * Generate the CSS styles from the settings
	 */
	public function save() {
		// security check
		if (! CKFof::checkAjaxToken()) {
			exit();
		}

		$id = $this->input->get('id', 0, 'int');

		$model = $this->getModel();
		$row = $model->getItem($id);

		// get data
		$fields = $this->input->get('fields', '', 'raw');
		$name = $this->input->get('name', '', 'string');
		if (! $name) $name = 'style' . $id;
		$layoutcss = trim($this->input->get('layoutcss', '', 'html'));
		// set data
		$row->params = $fields;
		$row->name = $name;
		$row->layoutcss = $layoutcss;

		if (! $id = $model->save($row)) {
			echo "{'result': '0', 'id': '" . $row->id . "', 'message': 'Error : Can not save the Styles !'}";
			echo($this->_db->getErrorMsg());
			exit;
		}
		echo '{"result": "1", "id": "' . $id . '", "message": "Styles saved successfully"}';
		exit;
	}

	/**
	 * copy an existing page
	 * @return void
	 */
//	function copy() {
//		$model = $this->getModel();
//		$cid = $this->input->get('cid', '', 'array');
//		$this->input->set('id', (int) $cid[0]);
//		if (!$model->copy()) {
//			$msg = \Joomla\CMS\Language\Text::_('CK_COPY_ERROR');
//			$type = 'error';
//		} else {
//			$msg = \Joomla\CMS\Language\Text::_('CK_COPY_SUCCESS');
//			$type = 'message';
//		}
//
//		$this->setRedirect('index.php?option=com_slideshowck&view=styles', $msg, $type);
//	}

	/*
	 * Generate the CSS styles from the settings
	 */
	public function ajaxRenderCss() {
		$fields = $this->input->get('fields', '', 'raw');
		$fields = json_decode($fields);
		$customstyles = stripslashes( $this->input->get('customstyles', '', 'string'));
		$customstyles = json_decode($customstyles);
		$customcss = $this->input->get('customcss', '', 'html');

		$css = $this->renderCss($fields, $customstyles);
		echo $css . $customcss;
		exit();
	}

	/*
	 * Render the CSS from the settings
	 */
	public function renderCss($fields, $customstyles) {
		include_once SLIDESHOWCK_PATH . '/helpers/ckstyles.php';
		$ckstyles = new \Slideshowck\CKStyles();
		$css = $ckstyles->create($fields, $customstyles);

		return $css;
	}

	/**
	 * Ajax method to save the json data into the .mmck file
	 *
	 * @return  boolean - true on success for the file creation
	 *
	 */
	public function exportParams() {
		// security check
		if (! CKFof::checkAjaxToken()) {
			exit();
		}
		// create a backup file with all fields stored in it
		$fields = $this->input->get('jsonfields', '', 'string');
		$backupfile_path = SLIDESHOWCK_PATH . '/export/exportParamsSlideshowckStyle'. $this->input->get('styleid',0,'int') .'.mmck';
		if (file_put_contents($backupfile_path, $fields)) {
			echo '1';
		} else {
			echo '0';
		}

		exit();
	}

	/**
	 * Ajax method to import the .mmck file into the interface
	 *
	 * @return  boolean - true on success for the file creation
	 *
	 */
	public function uploadParamsFile() {
		// security check
		if (! CKFof::checkAjaxToken()) {
			exit();
		}

		$file = $this->input->files->get('file', '', 'array');
		if (!is_array($file))
			exit();

		$filename = \Joomla\CMS\Filesystem\File::makeSafe($file['name']);

		// check if the file exists
		if (\Joomla\CMS\Filesystem\File::getExt($filename) != 'mmck') {
			$msg = \Joomla\CMS\Language\Text::_('CK_NOT_MMCK_FILE', true);
			echo json_encode(array('error'=> $msg));
			exit();
		}

		//Set up the source and destination of the file
		$src = $file['tmp_name'];

		// check if the file exists
		if (!$src || !\Joomla\CMS\Filesystem\File::exists($src)) {
			$msg = \Joomla\CMS\Language\Text::_('CK_FILE_NOT_EXISTS', true);
			echo json_encode(array('error'=> $msg));
			exit();
		}

		// read the file
		if (!$filecontent = \Joomla\CMS\Filesystem\File::read($src)) {
			$msg = \Joomla\CMS\Language\Text::_('CK_UNABLE_READ_FILE', true);
			echo json_encode(array('error'=> $msg));
			exit();
		}

		// replace vars to allow data to be moved from another server
		$filecontent = str_replace("|URIROOT|", \Joomla\CMS\Uri\Uri::root(true), $filecontent);
//		$filecontent = str_replace("|qq|", '"', $filecontent);

//		echo $filecontent;
		echo json_encode(array('data'=> $filecontent));
		exit();
	}

	/**
	 * Ajax method to read the fields values from the selected preset
	 *
	 * @return  json - 
	 *
	 */
	function loadPresetFields() {
		// security check
		if (! CKFof::checkAjaxToken()) {
			exit();
		}

		$preset = $this->input->get('preset', '', 'string');
		$folder_path = SLIDESHOWCK_MEDIA_PATH . '/presets/';
		// load the fields
		$fields = '{}';
		if ( file_exists($folder_path . $preset. '.mmck') ) {
			$fields = @file_get_contents($folder_path . $preset. '.mmck');
			$fields = str_replace('\n','', $fields);
//			$fields = str_replace("{", "|ob|", $fields);
//			$fields = str_replace("}", "|cb|", $fields);
		} else {
			echo '{"result" : 0, "message" : "File Not found : '.$folder_path . $preset. '.mmck'.'"}';
			exit();
		}

		echo '{"result" : 1, "fields" : "'.$fields.'", "customcss" : ""}';
		exit();
	}
}components/com_actionlogs/layouts/logstable.php000060400000002741152453623440016126 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_actionlogs
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;

Factory::getLanguage()->load("com_actionlogs", JPATH_ADMINISTRATOR, null, false, true);

$messages = $displayData['messages'];
$showIpColumn = $displayData['showIpColumn'];
?>
<h1>
	<?php echo Text::_('COM_ACTIONLOGS_EMAIL_SUBJECT'); ?>
</h1>
<h2>
	<?php echo Text::_('COM_ACTIONLOGS_EMAIL_DESC'); ?>
</h2>
<table>
	<thead>
		<th><?php echo Text::_('COM_ACTIONLOGS_ACTION'); ?></th>
		<th><?php echo Text::_('COM_ACTIONLOGS_DATE'); ?></th>
		<th><?php echo Text::_('COM_ACTIONLOGS_EXTENSION'); ?></th>
		<th><?php echo Text::_('COM_ACTIONLOGS_NAME'); ?></th>
		<?php if ($showIpColumn) : ?>
			<th><?php echo Text::_('COM_ACTIONLOGS_IP_ADDRESS'); ?></th>
		<?php endif; ?>
	</thead>
	<tbody>
		<?php foreach ($messages as $message) : ?>
			<tr>
				<td><?php echo $message->message; ?></td>
				<td><?php echo HTMLHelper::_('date', $message->log_date, 'Y-m-d H:i:s T', 'UTC'); ?></td>
				<td><?php echo $message->extension; ?></td>
				<td><?php echo $displayData['username']; ?></td>
				<?php if ($showIpColumn) : ?>
					<td><?php echo Text::_($message->ip_address); ?></td>
				<?php endif; ?>
			</tr>
		<?php endforeach; ?>
	</tbody>
</table>
components/com_actionlogs/controllers/actionlogs.php000060400000007263152453623440017166 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_actionlogs
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Date\Date;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Router\Route;
use Joomla\Utilities\ArrayHelper;

JLoader::register('ActionlogsHelper', JPATH_ADMINISTRATOR . '/components/com_actionlogs/helpers/actionlogs.php');

/**
 * Actionlogs list controller class.
 *
 * @since  3.9.0
 */
class ActionlogsControllerActionlogs extends JControllerAdmin
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @since   3.9.0
	 */
	public function __construct(array $config = array())
	{
		parent::__construct($config);

		$this->registerTask('exportSelectedLogs', 'exportLogs');
	}

	/**
	 * 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   3.9.0
	 */
	public function getModel($name = 'Actionlogs', $prefix = 'ActionlogsModel', $config = array('ignore_request' => true))
	{
		// Return the model
		return parent::getModel($name, $prefix, $config);
	}

	/**
	 * Method to export logs
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function exportLogs()
	{
		// Check for request forgeries.
		$this->checkToken();

		$task = $this->getTask();

		$pks = array();

		if ($task == 'exportSelectedLogs')
		{
			// Get selected logs
			$pks = ArrayHelper::toInteger(explode(',', $this->input->post->getString('cids')));
		}

		/** @var ActionlogsModelActionlogs $model */
		$model = $this->getModel();

		// Get the logs data
		$data = $model->getLogDataAsIterator($pks);

		if (count($data))
		{

			try
			{
				$rows = ActionlogsHelper::getCsvData($data);
			}
			catch (InvalidArgumentException $exception)
			{
				$this->setMessage(Text::_('COM_ACTIONLOGS_ERROR_COULD_NOT_EXPORT_DATA'), 'error');
				$this->setRedirect(Route::_('index.php?option=com_actionlogs&view=actionlogs', false));

				return;
			}

			// Destroy the iterator now
			unset($data);

			$date     = new Date('now', new DateTimeZone('UTC'));
			$filename = 'logs_' . $date->format('Y-m-d_His_T');

			$csvDelimiter = ComponentHelper::getComponent('com_actionlogs')->getParams()->get('csv_delimiter', ',');

			$app = Factory::getApplication();
			$app->setHeader('Content-Type', 'application/csv', true)
				->setHeader('Content-Disposition', 'attachment; filename="' . $filename . '.csv"', true)
				->setHeader('Cache-Control', 'must-revalidate', true)
				->sendHeaders();

			$output = fopen("php://output", "w");

			foreach ($rows as $row)
			{
				fputcsv($output, $row, $csvDelimiter);
			}

			fclose($output);
			$app->triggerEvent('onAfterLogExport', array());
			$app->close();
		}
		else
		{
			$this->setMessage(Text::_('COM_ACTIONLOGS_NO_LOGS_TO_EXPORT'));
			$this->setRedirect(Route::_('index.php?option=com_actionlogs&view=actionlogs', false));
		}
	}

	/**
	 * Clean out the logs
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function purge()
	{
		// Check for request forgeries.
		$this->checkToken();

		$model = $this->getModel();

		if ($model->purge())
		{
			$message = Text::_('COM_ACTIONLOGS_PURGE_SUCCESS');
		}
		else
		{
			$message = Text::_('COM_ACTIONLOGS_PURGE_FAIL');
		}

		$this->setRedirect(Route::_('index.php?option=com_actionlogs&view=actionlogs', false), $message);
	}
}
components/com_actionlogs/libraries/actionlogplugin.php000060400000004666152453623440017634 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_actionlogs
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\MVC\Model\BaseDatabaseModel;

BaseDatabaseModel::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_actionlogs/models', 'ActionlogsModel');

/**
 * Abstract Action Log Plugin
 *
 * @since  3.9.0
 */
abstract class ActionLogPlugin extends JPlugin
{
	/**
	 * Application object.
	 *
	 * @var    JApplicationCms
	 * @since  3.9.0
	 */
	protected $app;

	/**
	 * Database object.
	 *
	 * @var    JDatabaseDriver
	 * @since  3.9.0
	 */
	protected $db;

	/**
	 * Load plugin language file automatically so that it can be used inside component
	 *
	 * @var    boolean
	 * @since  3.9.0
	 */
	protected $autoloadLanguage = true;

	/**
	 * Proxy for ActionlogsModelUserlog addLog method
	 *
	 * This method adds a record to #__action_logs contains (message_language_key, message, date, context, user)
	 *
	 * @param   array   $messages            The contents of the messages to be logged
	 * @param   string  $messageLanguageKey  The language key of the message
	 * @param   string  $context             The context of the content passed to the plugin
	 * @param   int     $userId              ID of user perform the action, usually ID of current logged in user
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	protected function addLog($messages, $messageLanguageKey, $context, $userId = null)
	{
		$user = Factory::getUser();

		foreach ($messages as $index => $message)
		{
			if (!array_key_exists('userid', $message))
			{
				$message['userid'] = $user->id;
			}

			if (!array_key_exists('username', $message))
			{
				$message['username'] = $user->username;
			}

			if (!array_key_exists('accountlink', $message))
			{
				$message['accountlink'] = 'index.php?option=com_users&task=user.edit&id=' . $user->id;
			}

			if (array_key_exists('type', $message))
			{
				$message['type'] = strtoupper($message['type']);
			}

			if (array_key_exists('app', $message))
			{
				$message['app'] = strtoupper($message['app']);
			}

			$messages[$index] = $message;
		}

		/** @var ActionlogsModelActionlog $model **/
		$model = BaseDatabaseModel::getInstance('Actionlog', 'ActionlogsModel');
		$model->addLog($messages, strtoupper($messageLanguageKey), $context, $userId);
	}
}
components/com_actionlogs/actionlogs.php000060400000001250152453623440014606 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_actionlogs
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Access\Exception\NotAllowed;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Controller\BaseController;

if (!Factory::getUser()->authorise('core.admin'))
{
	throw new NotAllowed(Text::_('JERROR_ALERTNOAUTHOR'), 403);
}

$controller = BaseController::getInstance('Actionlogs');
$controller->execute(Factory::getApplication()->input->get('task'));
$controller->redirect();
components/com_actionlogs/actionlogs.xml000060400000002025152453623440014620 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<extension version="3.9" type="component" method="upgrade">
	<name>com_actionlogs</name>
	<author>Joomla! Project</author>
	<creationDate>May 2018</creationDate>
	<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.9.0</version>
	<description>COM_ACTIONLOGS_XML_DESCRIPTION</description>
	<administration>
		<menu>COM_ACTIONLOGS</menu>
		<files folder="admin">
			<file>actionlogs.php</file>
			<file>config.xml</file>
			<file>access.xml</file>
			<file>controller.php</file>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_actionlogs.ini</language>
			<language tag="en-GB">language/en-GB.com_actionlogs.sys.ini</language>
		</languages>
	</administration>
</extension>
components/com_actionlogs/views/actionlogs/view.html.php000060400000005237152453623440017671 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_actionlogs
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Toolbar\Toolbar;
use Joomla\CMS\Toolbar\ToolbarHelper;

JLoader::register('ActionlogsHelper', JPATH_ADMINISTRATOR . '/components/com_actionlogs/helpers/actionlogs.php');

/**
 * View class for a list of logs.
 *
 * @since  3.9.0
 */
class ActionlogsViewActionlogs extends JViewLegacy
{
	/**
	 * An array of items.
	 *
	 * @var    array
	 * @since  3.9.0
	 */
	protected $items;

	/**
	 * The model state
	 *
	 * @var    array
	 * @since  3.9.0
	 */
	protected $state;

	/**
	 * The pagination object
	 *
	 * @var    JPagination
	 * @since  3.9.0
	 */
	protected $pagination;

	/**
	 * The active search filters
	 *
	 * @var    array
	 * @since  3.9.0
	 */
	public $activeFilters;

	/**
	 * Method to display the view.
	 *
	 * @param   string  $tpl  A template file to load. [optional]
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @since   3.9.0
	 */
	public function display($tpl = null)
	{
		$params = ComponentHelper::getParams('com_actionlogs');

		$this->items         = $this->get('Items');
		$this->state         = $this->get('State');
		$this->filterForm    = $this->get('FilterForm');
		$this->activeFilters = $this->get('ActiveFilters');
		$this->pagination    = $this->get('Pagination');
		$this->showIpColumn  = (bool) $params->get('ip_logging', 0);

		if (count($errors = $this->get('Errors')))
		{
			JError::raiseError(500, implode("\n", $errors));

			return false;
		}

		$this->addToolBar();

		// Load all actionlog plugins language files
		ActionlogsHelper::loadActionLogPluginsLanguage();

		return parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	protected function addToolbar()
	{
		ToolbarHelper::title(Text::_('COM_ACTIONLOGS_MANAGER_USERLOGS'), 'list-2');

		ToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'actionlogs.delete');
		$bar = Toolbar::getInstance('toolbar');
		$bar->appendButton('Confirm', 'COM_ACTIONLOGS_PURGE_CONFIRM', 'delete', 'COM_ACTIONLOGS_TOOLBAR_PURGE', 'actionlogs.purge', false);
		ToolbarHelper::preferences('com_actionlogs');
		ToolbarHelper::help('JHELP_COMPONENTS_ACTIONLOGS');
		ToolBarHelper::custom('actionlogs.exportSelectedLogs', 'download', '', 'COM_ACTIONLOGS_EXPORT_CSV', true);
		ToolBarHelper::custom('actionlogs.exportLogs', 'download', '', 'COM_ACTIONLOGS_EXPORT_ALL_CSV', false);
	}
}
components/com_actionlogs/views/actionlogs/tmpl/default.xml000060400000000307152453623440020356 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_ACTIONLOGS_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_ACTIONLOGS_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>

components/com_actionlogs/views/actionlogs/tmpl/default.php000060400000011360152453623440020346 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_actionlogs
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\LayoutHelper;
use Joomla\CMS\Router\Route;

/** @var ActionlogsViewActionlogs $this */

JLoader::register('ActionlogsHelper', JPATH_ADMINISTRATOR . '/components/com_actionlogs/helpers/actionlogs.php');

HTMLHelper::_('bootstrap.tooltip');
HTMLHelper::_('behavior.multiselect');
HTMLHelper::_('formbehavior.chosen', 'select');

$listOrder  = $this->escape($this->state->get('list.ordering'));
$listDirn   = $this->escape($this->state->get('list.direction'));

Factory::getDocument()->addScriptDeclaration('
	Joomla.submitbutton = function(task)
	{
		if (task == "actionlogs.exportLogs")
		{
			Joomla.submitform(task, document.getElementById("exportForm"));
			
			return;
		}

		if (task == "actionlogs.exportSelectedLogs")
		{
			// Get id of selected action logs item and pass it to export form hidden input
			var cids = [];

			jQuery("input[name=\'cid[]\']:checked").each(function() {
					cids.push(jQuery(this).val());
			});

			document.exportForm.cids.value = cids.join(",");
			Joomla.submitform(task, document.getElementById("exportForm"));

			return;
		}

		Joomla.submitform(task);
	};
');
?>
<form action="<?php echo Route::_('index.php?option=com_actionlogs&view=actionlogs'); ?>" method="post" name="adminForm" id="adminForm">
	<div id="j-main-container">
		<?php echo LayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo Text::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped table-hover" id="logsList">
				<thead>
					<th width="1%" class="center">
						<?php echo HTMLHelper::_('grid.checkall'); ?>
					</th>
					<th>
						<?php echo HTMLHelper::_('searchtools.sort', 'COM_ACTIONLOGS_ACTION', 'a.message', $listDirn, $listOrder); ?>
					</th>
					<th width="15%" class="nowrap">
						<?php echo HTMLHelper::_('searchtools.sort', 'COM_ACTIONLOGS_EXTENSION', 'a.extension', $listDirn, $listOrder); ?>
					</th>
					<th width="15%" class="nowrap">
						<?php echo HTMLHelper::_('searchtools.sort', 'COM_ACTIONLOGS_DATE', 'a.log_date', $listDirn, $listOrder); ?>
					</th>
					<th width="10%" class="nowrap">
						<?php echo HTMLHelper::_('searchtools.sort', 'COM_ACTIONLOGS_NAME', 'a.user_id', $listDirn, $listOrder); ?>
					</th>
					<?php if ($this->showIpColumn) : ?>
						<th width="10%" class="nowrap">
							<?php echo HTMLHelper::_('searchtools.sort', 'COM_ACTIONLOGS_IP_ADDRESS', 'a.ip_address', $listDirn, $listOrder); ?>
						</th>
					<?php endif; ?>
					<th width="1%" class="nowrap hidden-phone">
						<?php echo HTMLHelper::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
					</th>
				</thead>
				<tfoot>
					<tr>
						<td colspan="7">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
					<?php foreach ($this->items as $i => $item) :
						$extension = strtok($item->extension, '.');
						ActionlogsHelper::loadTranslationFiles($extension); ?>
						<tr class="row<?php echo $i % 2; ?>">
							<td class="center">
								<?php echo HTMLHelper::_('grid.id', $i, $item->id); ?>
							</td>
							<td>
								<?php echo ActionlogsHelper::getHumanReadableLogMessage($item); ?>
							</td>
							<td>
								<?php echo $this->escape(Text::_($extension)); ?>
							</td>
							<td>
								<span class="hasTooltip" title="<?php echo HTMLHelper::_('date', $item->log_date, Text::_('DATE_FORMAT_LC6')); ?>">
									<?php echo HTMLHelper::_('date.relative', $item->log_date); ?>
								</span>
							</td>
							<td>
								<?php echo $this->escape($item->name); ?>
							</td>
							<?php if ($this->showIpColumn) : ?>
								<td>
									<?php echo Text::_($this->escape($item->ip_address)); ?>
								</td>
							<?php endif;?>
							<td class="hidden-phone">
								<?php echo (int) $item->id; ?>
							</td>
						</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif;?>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo HTMLHelper::_('form.token'); ?>
	</div>
</form>
<form action="<?php echo Route::_('index.php?option=com_actionlogs&view=actionlogs'); ?>" method="post" name="exportForm" id="exportForm">
	<input type="hidden" name="task" value="" />
	<input type="hidden" name="cids" value="" />
	<?php echo HTMLHelper::_('form.token'); ?>
</form>
components/com_actionlogs/helpers/actionlogs.php000060400000022142152453623440016253 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_actionlogs
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Date\Date;
use Joomla\CMS\Factory;
use Joomla\CMS\Filesystem\Path;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Router\Route;
use Joomla\String\StringHelper;

/**
 * Actionlogs component helper.
 *
 * @since  3.9.0
 */
class ActionlogsHelper
{
	/**
	 * Array of characters starting a formula
	 *
	 * @var    array
	 * @since  3.9.7
	 */
	private static $characters = array('=', '+', '-', '@');

	/**
	 * Method to convert logs objects array to an iterable type for use with a CSV export
	 *
	 * @param   array|Traversable  $data  The logs data objects to be exported
	 *
	 * @return  array|Generator  For PHP 5.5 and newer, a Generator is returned; PHP 5.4 and earlier use an array
	 *
	 * @since   3.9.0
	 * @throws  InvalidArgumentException
	 */
	public static function getCsvData($data)
	{
		if (!is_iterable($data))
		{
			throw new InvalidArgumentException(
				sprintf(
					'%s() requires an array or object implementing the Traversable interface, a %s was given.',
					__METHOD__,
					gettype($data) === 'object' ? get_class($data) : gettype($data)
				)
			);
		}

		if (version_compare(PHP_VERSION, '5.5', '>='))
		{
			// Only include the PHP 5.5 helper in this conditional to prevent the potential of parse errors for PHP 5.4 or earlier
			JLoader::register('ActionlogsHelperPhp55', __DIR__ . '/actionlogsphp55.php');

			return ActionlogsHelperPhp55::getCsvAsGenerator($data);
		}

		$disabledText = Text::_('COM_ACTIONLOGS_DISABLED');

		$rows = array();

		// Header row
		$rows[] = array('Id', 'Message', 'Date', 'Extension', 'User', 'Ip');

		foreach ($data as $log)
		{
			$date      = new Date($log->log_date, new DateTimeZone('UTC'));
			$extension = strtok($log->extension, '.');

			static::loadTranslationFiles($extension);

			$rows[] = array(
				'id'         => $log->id,
				'message'    => self::escapeCsvFormula(strip_tags(static::getHumanReadableLogMessage($log, false))),
				'date'       => $date->format('Y-m-d H:i:s T'),
				'extension'  => self::escapeCsvFormula(Text::_($extension)),
				'name'       => self::escapeCsvFormula($log->name),
				'ip_address' => self::escapeCsvFormula($log->ip_address === 'COM_ACTIONLOGS_DISABLED' ? $disabledText : $log->ip_address)
			);
		}

		return $rows;
	}

	/**
	 * Load the translation files for an extension
	 *
	 * @param   string  $extension  Extension name
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public static function loadTranslationFiles($extension)
	{
		static $cache = array();
		$extension = strtolower($extension);

		if (isset($cache[$extension]))
		{
			return;
		}

		$lang   = Factory::getLanguage();
		$source = '';

		switch (substr($extension, 0, 3))
		{
			case 'com':
			default:
				$source = JPATH_ADMINISTRATOR . '/components/' . $extension;
				break;

			case 'lib':
				$source = JPATH_LIBRARIES . '/' . substr($extension, 4);
				break;

			case 'mod':
				$source = JPATH_SITE . '/modules/' . $extension;
				break;

			case 'plg':
				$parts = explode('_', $extension, 3);

				if (count($parts) > 2)
				{
					$source = JPATH_PLUGINS . '/' . $parts[1] . '/' . $parts[2];
				}
				break;

			case 'pkg':
				$source = JPATH_SITE;
				break;

			case 'tpl':
				$source = JPATH_BASE . '/templates/' . substr($extension, 4);
				break;

		}

		$lang->load($extension, JPATH_ADMINISTRATOR, null, false, true)
			|| $lang->load($extension, $source, null, false, true);

		if (!$lang->hasKey(strtoupper($extension)))
		{
			$lang->load($extension . '.sys', JPATH_ADMINISTRATOR, null, false, true)
				|| $lang->load($extension . '.sys', $source, null, false, true);
		}

		$cache[$extension] = true;
	}

	/**
	 * Get parameters to be
	 *
	 * @param   string  $context  The context of the content
	 *
	 * @return  mixed  An object contains content type parameters, or null if not found
	 *
	 * @since   3.9.0
	 */
	public static function getLogContentTypeParams($context)
	{
		$db = Factory::getDbo();
		$query = $db->getQuery(true)
			->select('a.*')
			->from($db->quoteName('#__action_log_config', 'a'))
			->where($db->quoteName('a.type_alias') . ' = ' . $db->quote($context));

		$db->setQuery($query);

		return $db->loadObject();
	}

	/**
	 * Get human readable log message for a User Action Log
	 *
	 * @param   stdClass  $log            A User Action log message record
	 * @param   boolean   $generateLinks  Flag to disable link generation when creating a message
	 *
	 * @return  string
	 *
	 * @since   3.9.0
	 */
	public static function getHumanReadableLogMessage($log, $generateLinks = true)
	{
		static $links = array();

		$message     = Text::_($log->message_language_key);
		$messageData = json_decode($log->message, true);

		// Special handling for translation extension name
		if (isset($messageData['extension_name']))
		{
			static::loadTranslationFiles($messageData['extension_name']);
			$messageData['extension_name'] = Text::_($messageData['extension_name']);
		}

		// Translating application
		if (isset($messageData['app']))
		{
			$messageData['app'] = Text::_($messageData['app']);
		}

		// Translating type
		if (isset($messageData['type']))
		{
			$messageData['type'] = Text::_($messageData['type']);
		}

		$linkMode = Factory::getApplication()->get('force_ssl', 0) >= 1 ? Route::TLS_FORCE : Route::TLS_IGNORE;

		foreach ($messageData as $key => $value)
		{
			// Escape any markup in the values to prevent XSS attacks
			$value = htmlspecialchars($value, ENT_QUOTES, 'UTF-8');

			// Convert relative url to absolute url so that it is clickable in action logs notification email
			if ($generateLinks && StringHelper::strpos($value, 'index.php?') === 0)
			{
				if (!isset($links[$value]))
				{
					$links[$value] = Route::link('administrator', $value, false, $linkMode, true);
				}

				$value = $links[$value];
			}

			$message = str_replace('{' . $key . '}', $value, $message);
		}

		return $message;
	}

	/**
	 * Get link to an item of given content type
	 *
	 * @param   string   $component
	 * @param   string   $contentType
	 * @param   integer  $id
	 * @param   string   $urlVar
	 * @param   JObject  $object
	 *
	 * @return  string  Link to the content item
	 *
	 * @since   3.9.0
	 */
	public static function getContentTypeLink($component, $contentType, $id, $urlVar = 'id', $object = null)
	{
		// Try to find the component helper.
		$eName = str_replace('com_', '', $component);
		$file  = Path::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) && is_callable(array($cName, 'getContentTypeLink')))
			{
				return $cName::getContentTypeLink($contentType, $id, $object);
			}
		}

		if (empty($urlVar))
		{
			$urlVar = 'id';
		}

		// Return default link to avoid having to implement getContentTypeLink in most of our components
		return 'index.php?option=' . $component . '&task=' . $contentType . '.edit&' . $urlVar . '=' . $id;
	}

	/**
	 * Load both enabled and disabled actionlog plugins language file.
	 *
	 * It is used to make sure actions log is displayed properly instead of only language items displayed when a plugin is disabled.
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public static function loadActionLogPluginsLanguage()
	{
		$lang = Factory::getLanguage();
		$db   = Factory::getDbo();

		// Get all (both enabled and disabled) actionlog plugins
		$query = $db->getQuery(true)
			->select(
				$db->quoteName(
					array(
						'folder',
						'element',
						'params',
						'extension_id'
					),
					array(
						'type',
						'name',
						'params',
						'id'
					)
				)
			)
			->from('#__extensions')
			->where('type = ' . $db->quote('plugin'))
			->where('folder = ' . $db->quote('actionlog'))
			->where('state IN (0,1)')
			->order('ordering');
		$db->setQuery($query);

		try
		{
			$rows = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			$rows = array();
		}

		if (empty($rows))
		{
			return;
		}

		foreach ($rows as $row)
		{
			$name      = $row->name;
			$type      = $row->type;
			$extension = 'Plg_' . $type . '_' . $name;
			$extension = strtolower($extension);

			// If language already loaded, don't load it again.
			if ($lang->getPaths($extension))
			{
				continue;
			}

			$lang->load($extension, JPATH_ADMINISTRATOR, null, false, true)
			|| $lang->load($extension, JPATH_PLUGINS . '/' . $type . '/' . $name, null, false, true);
		}

		// Load com_privacy too.
		$lang->load('com_privacy', JPATH_ADMINISTRATOR, null, false, true);
	}

	/**
	 * Escapes potential characters that start a formula in a CSV value to prevent injection attacks
	 *
	 * @param   mixed  $value  csv field value
	 *
	 * @return  mixed
	 *
	 * @since   3.9.7
	 */
	protected static function escapeCsvFormula($value)
	{
		if ($value == '')
		{
			return $value;
		}

		if (in_array($value[0], self::$characters, true))
		{
			$value = ' ' . $value;
		}

		return $value;
	}
}
components/com_actionlogs/helpers/actionlogsphp55.php000060400000005151152453623440017136 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_actionlogs
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Date\Date;
use Joomla\CMS\Language\Text;

/**
 * Actionlogs component helper for newer PHP versions.
 *
 * This file should only be included in environments running PHP 5.5 or newer and may potentially cause a parse error on older versions.
 *
 * @since       3.9.0
 * @deprecated  Will be inlined back into ActionlogsHelper when PHP 5.5 or newer is the minimum supported PHP version
 * @internal
 */
class ActionlogsHelperPhp55
{
	/**
	 * Array of characters starting a formula
	 *
	 * @var    array
	 * @since  3.9.7
	 */
	private static $characters = array('=', '+', '-', '@');

	/**
	 * Method to convert logs objects array to a Generator for use with a CSV export
	 *
	 * @param   array|Traversable  $data  The logs data objects to be exported
	 *
	 * @return  Generator
	 *
	 * @since   3.9.0
	 * @throws  InvalidArgumentException
	 */
	public static function getCsvAsGenerator($data)
	{
		if (!is_iterable($data))
		{
			throw new InvalidArgumentException(
				sprintf(
					'%s() requires an array or object implementing the Traversable interface, a %s was given.',
					__METHOD__,
					gettype($data) === 'object' ? get_class($data) : gettype($data)
				)
			);
		}

		$disabledText = Text::_('COM_ACTIONLOGS_DISABLED');

		// Header row
		yield array('Id', 'Message', 'Date', 'Extension', 'User', 'Ip');

		foreach ($data as $log)
		{
			$extension = strtok($log->extension, '.');

			ActionlogsHelper::loadTranslationFiles($extension);

			yield array(
				'id'         => $log->id,
				'message'    => self::escapeCsvFormula(strip_tags(ActionlogsHelper::getHumanReadableLogMessage($log, false))),
				'date'       => (new Date($log->log_date, new DateTimeZone('UTC')))->format('Y-m-d H:i:s T'),
				'extension'  => self::escapeCsvFormula(Text::_($extension)),
				'name'       => self::escapeCsvFormula($log->name),
				'ip_address' => self::escapeCsvFormula($log->ip_address === 'COM_ACTIONLOGS_DISABLED' ? $disabledText : $log->ip_address)
			);
		}
	}

	/**
	 * Escapes potential characters that start a formula in a CSV value to prevent injection attacks
	 *
	 * @param   mixed  $value  csv field value
	 *
	 * @return  mixed
	 *
	 * @since   3.9.7
	 */
	protected static function escapeCsvFormula($value)
	{
		if ($value == '')
		{
			return $value;
		}

		if (in_array($value[0], self::$characters, true))
		{
			$value = ' ' . $value;
		}

		return $value;
	}
}
components/com_actionlogs/controller.php000060400000000572152453623440014635 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_actionlogs
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Actionlogs Controller
 *
 * @since  3.9.0
 */
class ActionlogsController extends JControllerLegacy
{
}
components/com_actionlogs/config.xml000060400000002242152453623440013724 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset name="actionlogs" label="COM_ACTIONLOGS_OPTIONS" addfieldpath="/administrator/components/com_actionlogs/models/fields">
		<field
			name="ip_logging"
			type="radio"
			label="COM_ACTIONLOGS_IP_LOGGING_LABEL"
			description="COM_ACTIONLOGS_IP_LOGGING_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>
		<field
			name="csv_delimiter"
			type="list"
			label="COM_ACTIONLOGS_CSV_DELIMITER_LABEL"
			description="COM_ACTIONLOGS_CSV_DELIMITER_DESC"
			default=","
			>
			<option value=",">COM_ACTIONLOGS_COMMA</option>
			<option value=";">COM_ACTIONLOGS_SEMICOLON</option>
		</field>
		<field
			name="loggable_extensions"
			type="logtype"
			label="COM_ACTIONLOGS_LOG_EXTENSIONS_LABEL"
			description="COM_ACTIONLOGS_LOG_EXTENSIONS_DESC"
			multiple="true"
			default="com_banners,com_cache,com_categories,com_checkin,com_config,com_contact,com_content,com_installer,com_media,com_menus,com_messages,com_modules,com_newsfeeds,com_plugins,com_redirect,com_tags,com_templates,com_users"
		/>
	</fieldset>
</config>
components/com_actionlogs/models/actionlog.php000060400000011270152453623440015711 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_actionlogs
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\FileLayout;
use Joomla\Utilities\IpHelper;

JLoader::register('ActionlogsHelper', JPATH_ADMINISTRATOR . '/components/com_actionlogs/helpers/actionlogs.php');

/**
 * Methods supporting a list of Actionlog records.
 *
 * @since  3.9.0
 */
class ActionlogsModelActionlog extends JModelLegacy
{
	/**
	 * Function to add logs to the database
	 * This method adds a record to #__action_logs contains (message_language_key, message, date, context, user)
	 *
	 * @param   array    $messages            The contents of the messages to be logged
	 * @param   string   $messageLanguageKey  The language key of the message
	 * @param   string   $context             The context of the content passed to the plugin
	 * @param   integer  $userId              ID of user perform the action, usually ID of current logged in user
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function addLog($messages, $messageLanguageKey, $context, $userId = null)
	{
		$user   = Factory::getUser($userId);
		$db     = $this->getDbo();
		$date   = Factory::getDate();
		$params = ComponentHelper::getComponent('com_actionlogs')->getParams();

		if ($params->get('ip_logging', 0))
		{
			$ip = IpHelper::getIp();

			if (!filter_var($ip, FILTER_VALIDATE_IP))
			{
				$ip = 'COM_ACTIONLOGS_IP_INVALID';
			}
		}
		else
		{
			$ip = 'COM_ACTIONLOGS_DISABLED';
		}

		$loggedMessages = array();

		foreach ($messages as $message)
		{
			$logMessage                       = new stdClass;
			$logMessage->message_language_key = $messageLanguageKey;
			$logMessage->message              = json_encode($message);
			$logMessage->log_date             = (string) $date;
			$logMessage->extension            = $context;
			$logMessage->user_id              = $user->id;
			$logMessage->ip_address           = $ip;
			$logMessage->item_id              = isset($message['id']) ? (int) $message['id'] : 0;

			try
			{
				$db->insertObject('#__action_logs', $logMessage);
				$loggedMessages[] = $logMessage;
			}
			catch (RuntimeException $e)
			{
				// Ignore it
			}
		}

		// Send notification email to users who choose to be notified about the action logs
		$this->sendNotificationEmails($loggedMessages, $user->name, $context);
	}

	/**
	 * Send notification emails about the action log
	 *
	 * @param   array   $messages  The logged messages
	 * @param   string  $username  The username
	 * @param   string  $context   The Context
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	protected function sendNotificationEmails($messages, $username, $context)
	{
		$db           = $this->getDbo();
		$query        = $db->getQuery(true);
		$params       = ComponentHelper::getParams('com_actionlogs');
		$showIpColumn = (bool) $params->get('ip_logging', 0);

		$query
			->select($db->quoteName(array('u.email', 'l.extensions')))
			->from($db->quoteName('#__users', 'u'))
			->where($db->quoteName('u.block') . ' = 0')
			->join(
				'INNER',
				$db->quoteName('#__action_logs_users', 'l') . ' ON ( ' . $db->quoteName('l.notify') . ' = 1 AND '
				. $db->quoteName('l.user_id') . ' = ' . $db->quoteName('u.id') . ')'
			);

		$db->setQuery($query);

		try
		{
			$users = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $e->getMessage());

			return;
		}

		$recipients = array();

		foreach ($users as $user)
		{
			$extensions = json_decode($user->extensions, true);

			if ($extensions && in_array(strtok($context, '.'), $extensions))
			{
				$recipients[] = $user->email;
			}
		}

		if (empty($recipients))
		{
			return;
		}

		$layout    = new FileLayout('components.com_actionlogs.layouts.logstable', JPATH_ADMINISTRATOR);
		$extension = strtok($context, '.');
		ActionlogsHelper::loadTranslationFiles($extension);

		foreach ($messages as $message)
		{
			$message->extension = Text::_($extension);
			$message->message   = ActionlogsHelper::getHumanReadableLogMessage($message);
		}

		$displayData = array(
			'messages'     => $messages,
			'username'     => $username,
			'showIpColumn' => $showIpColumn,
		);

		$body   = $layout->render($displayData);
		$mailer = Factory::getMailer();
		$mailer->addRecipient($recipients);
		$mailer->setSubject(Text::_('COM_ACTIONLOGS_EMAIL_SUBJECT'));
		$mailer->isHTML(true);
		$mailer->Encoding = 'base64';
		$mailer->setBody($body);

		if (!$mailer->Send())
		{
			JError::raiseWarning(500, Text::_('JERROR_SENDING_EMAIL'));
		}
	}
}
components/com_actionlogs/models/fields/logtype.php000060400000003213152453623440016661 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  System.actionlogs
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Application\ApplicationHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Form\FormHelper;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;

FormHelper::loadFieldClass('checkboxes');
JLoader::register('ActionlogsHelper', JPATH_ADMINISTRATOR . '/components/com_actionlogs/helpers/actionlogs.php');

/**
 * Field to load a list of all users that have logged actions
 *
 * @since 3.9.0
 */
class JFormFieldLogType extends JFormFieldCheckboxes
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.9.0
	 */
	protected $type = 'LogType';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   3.9.0
	 */
	public function getOptions()
	{
		$db = Factory::getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('extension'))
			->from($db->quoteName('#__action_logs_extensions'));

		$extensions = $db->setQuery($query)->loadColumn();

		$options = array();
		$tmp     = array('checked' => true);

		foreach ($extensions as $extension)
		{
			ActionlogsHelper::loadTranslationFiles($extension);
			$option = HTMLHelper::_('select.option', $extension, Text::_($extension));
			$options[ApplicationHelper::stringURLSafe(Text::_($extension)) . '_' . $extension] = (object) array_merge($tmp, (array) $option);
		}

		ksort($options);

		return array_merge(parent::getOptions(), array_values($options));
	}
}
components/com_actionlogs/models/fields/plugininfo.php000060400000002702152453623440017352 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_actionlogs
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Information field.
 *
 * @since  3.9.2
 */
class JFormFieldPluginInfo extends JFormField
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.9.2
	 */
	protected $type = 'PluginInfo';

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string	The field input markup.
	 *
	 * @since   3.9.2
	 */
	protected function getInput()
	{
		$db = JFactory::getDbo();
		$result = null;
		$query = $db->getQuery(true)
			->select($db->quoteName('extension_id'))
			->from($db->quoteName('#__extensions'))
			->where($db->quoteName('folder') . ' = ' . $db->quote('actionlog'))
			->where($db->quoteName('element') . ' = ' . $db->quote('joomla'));
		$db->setQuery($query);

		try
		{
			$result = (int) $db->loadResult();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $e->getMessage());
		}

		$link = JHtml::_(
			'link',
			JRoute::_('index.php?option=com_plugins&task=plugin.edit&extension_id=' . $result),
			JText::_('PLG_SYSTEM_ACTIONLOGS_JOOMLA_ACTIONLOG_DISABLED'),
			array('class' => 'alert-link')
		);

		return '<div class="alert alert-info">'
			. JText::sprintf('PLG_SYSTEM_ACTIONLOGS_JOOMLA_ACTIONLOG_DISABLED_REDIRECT', $link)
			. '</div>';
	}
}
components/com_actionlogs/models/fields/logcreator.php000060400000003423152453623440017342 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_actionlogs
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Form\FormHelper;

FormHelper::loadFieldClass('list');

/**
 * Field to load a list of all users that have logged actions
 *
 * @since  3.9.0
 */
class JFormFieldLogCreator extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.9.0
	 */
	protected $type = 'LogCreator';

	/**
	 * Cached array of the category items.
	 *
	 * @var    array
	 * @since  3.9.0
	 */
	protected static $options = array();

	/**
	 * Method to get the options to populate list
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   3.9.0
	 */
	protected function getOptions()
	{
		// Accepted modifiers
		$hash = md5($this->element);

		if (!isset(static::$options[$hash]))
		{
			static::$options[$hash] = parent::getOptions();

			$options = array();

			$db = Factory::getDbo();

			// Construct the query
			$query = $db->getQuery(true)
				->select($db->quoteName('u.id', 'value'))
				->select($db->quoteName('u.username', 'text'))
				->from($db->quoteName('#__users', 'u'))
				->join('INNER', $db->quoteName('#__action_logs', 'c') . ' ON ' . $db->quoteName('c.user_id') . ' = ' . $db->quoteName('u.id'))
				->group($db->quoteName('u.id'))
				->group($db->quoteName('u.username'))
				->order($db->quoteName('u.username'));

			// Setup the query
			$db->setQuery($query);

			// Return the result
			if ($options = $db->loadObjectList())
			{
				static::$options[$hash] = array_merge(static::$options[$hash], $options);
			}
		}

		return static::$options[$hash];
	}
}
components/com_actionlogs/models/fields/extension.php000060400000003155152453623440017217 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_actionlogs
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Form\FormHelper;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;

FormHelper::loadFieldClass('list');
JLoader::register('ActionlogsHelper', JPATH_ADMINISTRATOR . '/components/com_actionlogs/helpers/actionlogs.php');

/**
 * Field to load a list of all extensions that have logged actions
 *
 * @since  3.9.0
 */
class JFormFieldExtension extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.9.0
	 */
	protected $type = 'extension';

	/**
	 * Method to get the options to populate list
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   3.9.0
	 */
	public function getOptions()
	{
		$db = Factory::getDbo();
		$query = $db->getQuery(true)
			->select('DISTINCT ' . $db->quoteName('extension'))
			->from($db->quoteName('#__action_logs'))
			->order($db->quoteName('extension'));

		$db->setQuery($query);
		$context = $db->loadColumn();

		$options = array();

		if (count($context) > 0)
		{
			foreach ($context as $item)
			{
				$extensions[] = strtok($item, '.');
			}

			$extensions = array_unique($extensions);

			foreach ($extensions as $extension)
			{
				ActionlogsHelper::loadTranslationFiles($extension);
				$options[] = HTMLHelper::_('select.option', $extension, Text::_($extension));
			}
		}

		return array_merge(parent::getOptions(), $options);
	}
}
components/com_actionlogs/models/fields/logsdaterange.php000060400000002675152453623440020030 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_actionlogs
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Form\FormHelper;

FormHelper::loadFieldClass('predefinedlist');

/**
 * Field to show a list of range dates to sort with
 *
 * @since  3.9.0
 */
class JFormFieldLogsDateRange extends JFormFieldPredefinedList
{
	/**
	 * The form field type.
	 *
	 * @var     string
	 * @since   3.9.0
	 */
	protected $type = 'logsdaterange';

	/**
	 * Available options
	 *
	 * @var    array
	 * @since  3.9.0
	 */
	protected $predefinedOptions = array(
		'today'       => 'COM_ACTIONLOGS_OPTION_RANGE_TODAY',
		'past_week'   => 'COM_ACTIONLOGS_OPTION_RANGE_PAST_WEEK',
		'past_1month' => 'COM_ACTIONLOGS_OPTION_RANGE_PAST_1MONTH',
		'past_3month' => 'COM_ACTIONLOGS_OPTION_RANGE_PAST_3MONTH',
		'past_6month' => 'COM_ACTIONLOGS_OPTION_RANGE_PAST_6MONTH',
		'past_year'   => 'COM_ACTIONLOGS_OPTION_RANGE_PAST_YEAR',
	);

	/**
	 * Method to instantiate the form field object.
	 *
	 * @param   JForm  $form  The form to attach to the form field object.
	 *
	 * @since  3.9.0
	 */
	public function __construct($form = null)
	{
		parent::__construct($form);

		// Load the required language
		$lang = Factory::getLanguage();
		$lang->load('com_actionlogs', JPATH_ADMINISTRATOR);
	}
}
components/com_actionlogs/models/actionlogs.php000060400000022125152453623440016075 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_actionlogs
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Date\Date;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\Utilities\ArrayHelper;

/**
 * Methods supporting a list of article records.
 *
 * @since  3.9.0
 */
class ActionlogsModelActionlogs extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @since   3.9.0
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'a.id', 'id',
				'a.extension', 'extension',
				'a.user_id', 'user',
				'a.message', 'message',
				'a.log_date', 'log_date',
				'a.ip_address', 'ip_address',
				'dateRange',
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	protected function populateState($ordering = 'a.id', $direction = 'desc')
	{
		$app = Factory::getApplication();

		$search = $app->getUserStateFromRequest($this->context . 'filter.search', 'filter_search', '', 'string');
		$this->setState('filter.search', $search);

		$user = $app->getUserStateFromRequest($this->context . 'filter.user', 'filter_user', '', 'string');
		$this->setState('filter.user', $user);

		$extension = $app->getUserStateFromRequest($this->context . 'filter.extension', 'filter_extension', '', 'string');
		$this->setState('filter.extension', $extension);

		$ip_address = $app->getUserStateFromRequest($this->context . 'filter.ip_address', 'filter_ip_address', '', 'string');
		$this->setState('filter.ip_address', $ip_address);

		$dateRange = $app->getUserStateFromRequest($this->context . 'filter.dateRange', 'filter_dateRange', '', 'string');
		$this->setState('filter.dateRange', $dateRange);

		parent::populateState($ordering, $direction);
	}

	/**
	 * Build an SQL query to load the list data.
	 *
	 * @return  JDatabaseQuery
	 *
	 * @since   3.9.0
	 */
	protected function getListQuery()
	{
		$db    = $this->getDbo();
		$query = $db->getQuery(true)
			->select('a.*, u.name')
			->from('#__action_logs AS a')
			->leftJoin('#__users AS u ON a.user_id = u.id');

		// Get ordering
		$fullorderCol = $this->state->get('list.fullordering', 'a.id DESC');

		// Apply ordering
		if (!empty($fullorderCol))
		{
			$query->order($db->escape($fullorderCol));
		}

		// Get filter by user
		$user = $this->getState('filter.user');

		// Apply filter by user
		if (!empty($user))
		{
			$query->where($db->quoteName('a.user_id') . ' = ' . (int) $user);
		}

		// Get filter by extension
		$extension = $this->getState('filter.extension');

		// Apply filter by extension
		if (!empty($extension))
		{
			$query->where($db->quoteName('a.extension') . ' LIKE ' . $db->quote($extension . '%'));
		}

		// Get filter by date range
		$dateRange = $this->getState('filter.dateRange');

		// Apply filter by date range
		if (!empty($dateRange))
		{
			$date = $this->buildDateRange($dateRange);

			// If the chosen range is not more than a year ago
			if ($date['dNow'] != false)
			{
				$query->where(
					$db->qn('a.log_date') . ' >= ' . $db->quote($date['dStart']->format('Y-m-d H:i:s')) .
					' AND ' . $db->qn('a.log_date') . ' <= ' . $db->quote($date['dNow']->format('Y-m-d H:i:s'))
				);
			}
		}

		// Filter the items over the search string if set.
		$search = $this->getState('filter.search');

		if (!empty($search))
		{
			if (stripos($search, 'id:') === 0)
			{
				$query->where($db->quoteName('a.id') . ' = ' . (int) substr($search, 3));
			}
			elseif (stripos($search, 'item_id:') === 0)
			{
				$query->where($db->quoteName('a.item_id') . ' = ' . (int) substr($search, 8));
			}
			else
			{
				$search = $db->quote('%' . $db->escape($search, true) . '%');
				$query->where('(' . $db->quoteName('u.username') . ' LIKE ' . $search . ')');
			}
		}

		return $query;
	}

	/**
	 * Construct the date range to filter on.
	 *
	 * @param   string  $range  The textual range to construct the filter for.
	 *
	 * @return  array  The date range to filter on.
	 *
	 * @since   3.9.0
	 */
	private function buildDateRange($range)
	{
		// Get UTC for now.
		$dNow   = new Date;
		$dStart = clone $dNow;

		switch ($range)
		{
			case 'past_week':
				$dStart->modify('-7 day');
				break;

			case 'past_1month':
				$dStart->modify('-1 month');
				break;

			case 'past_3month':
				$dStart->modify('-3 month');
				break;

			case 'past_6month':
				$dStart->modify('-6 month');
				break;

			case 'past_year':
				$dStart->modify('-1 year');
				break;

			case 'today':
				// Ranges that need to align with local 'days' need special treatment.
				$offset = Factory::getApplication()->get('offset');

				// Reset the start time to be the beginning of today, local time.
				$dStart = new Date('now', $offset);
				$dStart->setTime(0, 0, 0);

				// Now change the timezone back to UTC.
				$tz = new DateTimeZone('GMT');
				$dStart->setTimezone($tz);
				break;
		}

		return array('dNow' => $dNow, 'dStart' => $dStart);
	}

	/**
	 * Get all log entries for an item
	 *
	 * @param   string   $extension  The extension the item belongs to
	 * @param   integer  $itemId     The item ID
	 *
	 * @return  array
	 *
	 * @since   3.9.0
	 */
	public function getLogsForItem($extension, $itemId)
	{
		$db    = $this->getDbo();
		$query = $db->getQuery(true)
			->select('a.*, u.name')
			->from('#__action_logs AS a')
			->innerJoin('#__users AS u ON a.user_id = u.id')
			->where($db->quoteName('a.extension') . ' = ' . $db->quote($extension))
			->where($db->quoteName('a.item_id') . ' = ' . (int) $itemId);

		// Get ordering
		$fullorderCol = $this->getState('list.fullordering', 'a.id DESC');

		// Apply ordering
		if (!empty($fullorderCol))
		{
			$query->order($db->escape($fullorderCol));
		}

		$db->setQuery($query);

		return $db->loadObjectList();
	}

	/**
	 * Get logs data into JTable object
	 *
	 * @param   integer[]|null  $pks  An optional array of log record IDs to load
	 *
	 * @return  array  All logs in the table
	 *
	 * @since   3.9.0
	 */
	public function getLogsData($pks = null)
	{
		$db    = $this->getDbo();
		$query = $this->getLogDataQuery($pks);

		$db->setQuery($query);

		return $db->loadObjectList();
	}

	/**
	 * Get logs data as a database iterator
	 *
	 * @param   integer[]|null  $pks  An optional array of log record IDs to load
	 *
	 * @return  JDatabaseIterator
	 *
	 * @since   3.9.0
	 */
	public function getLogDataAsIterator($pks = null)
	{
		$db    = $this->getDbo();
		$query = $this->getLogDataQuery($pks);

		$db->setQuery($query);

		return $db->getIterator();
	}

	/**
	 * Get the query for loading logs data
	 *
	 * @param   integer[]|null  $pks  An optional array of log record IDs to load
	 *
	 * @return  JDatabaseQuery
	 *
	 * @since   3.9.0
	 */
	private function getLogDataQuery($pks = null)
	{
		$db    = $this->getDbo();
		$query = $db->getQuery(true)
			->select('a.*, u.name')
			->from('#__action_logs AS a')
			->innerJoin('#__users AS u ON a.user_id = u.id');

		if (is_array($pks) && count($pks) > 0)
		{
			$query->where($db->quoteName('a.id') . ' IN (' . implode(',', ArrayHelper::toInteger($pks)) . ')');
		}

		return $query;
	}

	/**
	 * Delete logs
	 *
	 * @param   array  $pks  Primary keys of logs
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function delete(&$pks)
	{
		$db    = $this->getDbo();
		$query = $db->getQuery(true)
			->delete($db->quoteName('#__action_logs'))
			->where($db->quoteName('id') . ' IN (' . implode(',', ArrayHelper::toInteger($pks)) . ')');
		$db->setQuery($query);

		try
		{
			$db->execute();
		}
		catch (RuntimeException $e)
		{
			$this->setError($e->getMessage());

			return false;
		}

		Factory::getApplication()->triggerEvent('onAfterLogPurge', array());

		return true;
	}

	/**
	 * Removes all of logs from the table.
	 *
	 * @return  boolean result of operation
	 *
	 * @since   3.9.0
	 */
	public function purge()
	{
		try
		{
			$this->getDbo()->truncateTable('#__action_logs');
		}
		catch (Exception $e)
		{
			return false;
		}

		Factory::getApplication()->triggerEvent('onAfterLogPurge', array());

		return true;
	}

	/**
	 * Get the filter form
	 *
	 * @param   array    $data      data
	 * @param   boolean  $loadData  load current data
	 *
	 * @return  \JForm|boolean  The \JForm object or false on error
	 *
	 * @since  3.9.0
	 */
	public function getFilterForm($data = array(), $loadData = true)
	{
		$form      = parent::getFilterForm($data, $loadData);
		$params    = ComponentHelper::getParams('com_actionlogs');
		$ipLogging = (bool) $params->get('ip_logging', 0);

		// Add ip sort options to sort dropdown
		if ($form && $ipLogging)
		{
			/* @var JFormFieldList $field */
			$field = $form->getField('fullordering', 'list');
			$field->addOption(Text::_('COM_ACTIONLOGS_IP_ADDRESS_ASC'), array('value' => 'a.ip_address ASC'));
			$field->addOption(Text::_('COM_ACTIONLOGS_IP_ADDRESS_DESC'), array('value' => 'a.ip_address DESC'));
		}

		return $form;
	}
}
components/com_actionlogs/models/forms/filter_actionlogs.xml000060400000004065152453623440020604 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<form>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			description="COM_ACTIONLOGS_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
		/>
		<field
			name="extension"
			type="extension"
			label="COM_ACTIONLOGS_EXTENSION"
			description="COM_ACTIONLOGS_EXTENSION_FILTER_DESC"
			onchange="this.form.submit()"
			>
			<option value="">COM_ACTIONLOGS_SELECT_EXTENSION</option>
		</field>
		<field
			name="dateRange"
			type="logsdaterange"
			label="COM_ACTIONLOGS_OPTION_FILTER_DATE"
			description="COM_ACTIONLOGS_OPTION_FILTER_DATE"
			onchange="this.form.submit();"
			>
			<option value="">COM_ACTIONLOGS_OPTION_FILTER_DATE</option>
		</field>
		<field
			name="user"
			type="logcreator"
			onchange="this.form.submit();"
			>
			<option value="">COM_ACTIONLOGS_SELECT_USER</option>
		</field>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="COM_ACTIONLOGS_LIST_FULL_ORDERING"
			description="COM_ACTIONLOGS_LIST_FULL_ORDERING_DESC"
			onchange="this.form.submit();"
			default="a.id DESC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.message ASC">COM_ACTIONLOGS_ACTION_ASC</option>
			<option value="a.message DESC">COM_ACTIONLOGS_ACTION_DESC</option>
			<option value="a.extension ASC">COM_ACTIONLOGS_EXTENSION_ASC</option>
			<option value="a.extension DESC">COM_ACTIONLOGS_EXTENSION_DESC</option>
			<option value="a.log_date ASC">JDATE_ASC</option>
			<option value="a.log_date DESC">JDATE_DESC</option>
			<option value="a.user_id ASC">COM_ACTIONLOGS_NAME_ASC</option>
			<option value="a.user_id DESC">COM_ACTIONLOGS_NAME_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>
	</fields>
	<fields name="list">
		<field
			name="limit"
			type="limitbox"
			label="COM_ACTIONLOGS_LIST_LIMIT"
			description="COM_ACTIONLOGS_LIST_LIMIT_DESC"
			class="input-mini"
			onchange="this.form.submit();"
			default="25"
		/>
	</fields>
</form>
components/com_redirect/layouts/toolbar/batch.php000060400000001051152453623440016325 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Layout
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.core');

$title = $displayData['title'];

?>
<button type="button" data-toggle="modal" onclick="{jQuery( '#collapseModal' ).modal('show'); return true;}" class="btn btn-small">
	<span class="icon-checkbox-partial" aria-hidden="true"></span>
	<?php echo $title; ?>
</button>
components/com_redirect/tables/link.php000060400000005407152453623440014322 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_redirect
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Link Table for Redirect.
 *
 * @since  1.6
 */
class RedirectTableLink extends JTable
{
	/**
	 * Constructor
	 *
	 * @param   JDatabaseDriver  $db  Database object.
	 *
	 * @since   1.6
	 */
	public function __construct($db)
	{
		parent::__construct('#__redirect_links', 'id', $db);
	}

	/**
	 * Overloaded check function
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	public function check()
	{
		$this->old_url = trim(rawurldecode($this->old_url));
		$this->new_url = trim(rawurldecode($this->new_url));

		// Check for valid name.
		if (empty($this->old_url))
		{
			$this->setError(JText::_('COM_REDIRECT_ERROR_SOURCE_URL_REQUIRED'));

			return false;
		}

		// Check for NOT NULL.
		if (empty($this->referer))
		{
			$this->referer = '';
		}

		// Check for valid name if not in advanced mode.
		if (empty($this->new_url) && JComponentHelper::getParams('com_redirect')->get('mode', 0) == false)
		{
			$this->setError(JText::_('COM_REDIRECT_ERROR_DESTINATION_URL_REQUIRED'));

			return false;
		}
		elseif (empty($this->new_url) && JComponentHelper::getParams('com_redirect')->get('mode', 0) == true)
		{
			// Else if an empty URL and in redirect mode only throw the same error if the code is a 3xx status code
			if ($this->header < 400 && $this->header >= 300)
			{
				$this->setError(JText::_('COM_REDIRECT_ERROR_DESTINATION_URL_REQUIRED'));

				return false;
			}
		}

		// Check for duplicates
		if ($this->old_url == $this->new_url)
		{
			$this->setError(JText::_('COM_REDIRECT_ERROR_DUPLICATE_URLS'));

			return false;
		}

		$db = $this->getDbo();

		// Check for existing name
		$query = $db->getQuery(true)
			->select($db->quoteName('id'))
			->select($db->quoteName('old_url'))
			->from('#__redirect_links')
			->where($db->quoteName('old_url') . ' = ' . $db->quote($this->old_url));
		$db->setQuery($query);
		$urls = $db->loadAssocList();

		foreach ($urls as $url)
		{
			if ($url['old_url'] === $this->old_url && (int) $url['id'] != (int) $this->id)
			{
				$this->setError(JText::_('COM_REDIRECT_ERROR_DUPLICATE_OLD_URL'));

				return false;
			}
		}

		return true;
	}

	/**
	 * Overriden store method to set dates.
	 *
	 * @param   boolean  $updateNulls  True to update fields even if they are null.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function store($updateNulls = false)
	{
		$date = JFactory::getDate()->toSql();

		$this->modified_date = $date;

		if (!$this->id)
		{
			// New record.
			$this->created_date = $date;
		}

		return parent::store($updateNulls);
	}
}
components/com_redirect/helpers/html/redirect.php000060400000003477152453623440016327 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_redirect
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Utility class for creating HTML Grids.
 *
 * @since  1.6
 */
class JHtmlRedirect
{
	/**
	 * Display the published or unpublished state of an item.
	 *
	 * @param   int      $value      The state value.
	 * @param   int      $i          The ID of the item.
	 * @param   boolean  $canChange  An optional prefix for the task.
	 *
	 * @return  string
	 *
	 * @since   1.6
	 *
	 * @throws  InvalidArgumentException
	 */
	public static function published($value = 0, $i = null, $canChange = true)
	{
		// Note: $i is required but has to be an optional argument in the function call due to argument order
		if (null === $i)
		{
			throw new InvalidArgumentException('$i is a required argument in JHtmlRedirect::published');
		}

		// Array of image, task, title, action
		$states = array(
			1  => array('publish', 'links.unpublish', 'JENABLED', 'COM_REDIRECT_DISABLE_LINK'),
			0  => array('unpublish', 'links.publish', 'JDISABLED', 'COM_REDIRECT_ENABLE_LINK'),
			2  => array('archive', 'links.unpublish', 'JARCHIVED', 'JUNARCHIVE'),
			-2 => array('trash', 'links.publish', 'JTRASHED', 'COM_REDIRECT_ENABLE_LINK'),
		);

		$state = ArrayHelper::getValue($states, (int) $value, $states[0]);
		$icon  = $state[0];

		if ($canChange)
		{
			$html = '<a href="#" onclick="return listItemTask(\'cb' . $i . '\',\'' . $state[1] . '\')" class="btn btn-micro hasTooltip'
				. ($value == 1 ? ' active' : '') . '" title="' . JHtml::_('tooltipText', $state[3])
				. '"><span class="icon-' . $icon . '" aria-hidden="true"></span></a>';
		}

		return $html;
	}
}
components/com_redirect/helpers/redirect.php000060400000005566152453623440015364 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_redirect
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

/**
 * Redirect component helper.
 *
 * @since  1.6
 */
class RedirectHelper
{
	public static $extension = 'com_redirect';

	/**
	 * Configure the Linkbar.
	 *
	 * @param   string  $vName  The name of the active view.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public static function addSubmenu($vName)
	{
		// No submenu for this component.
	}

	/**
	 * Gets a list of the actions that can be performed.
	 *
	 * @return  JObject
	 *
	 * @deprecated  3.2  Use JHelperContent::getActions() instead
	 */
	public static function getActions()
	{
		// 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('com_redirect');
	}

	/**
	 * Returns an array of standard published state filter options.
	 *
	 * @return  array  An array containing the options
	 *
	 * @since   1.6
	 */
	public static function publishedOptions()
	{
		// Build the active state filter options.
		$options   = array();
		$options[] = JHtml::_('select.option', '*', 'JALL');
		$options[] = JHtml::_('select.option', '1', 'JENABLED');
		$options[] = JHtml::_('select.option', '0', 'JDISABLED');
		$options[] = JHtml::_('select.option', '2', 'JARCHIVED');
		$options[] = JHtml::_('select.option', '-2', 'JTRASHED');

		return $options;
	}

	/**
	 * Gets the redirect system plugin extension id.
	 *
	 * @return  integer  The redirect system plugin extension id.
	 *
	 * @since   3.6.0
	 */
	public static function getRedirectPluginId()
	{
		$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('redirect'));
		$db->setQuery($query);

		try
		{
			$result = (int) $db->loadResult();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $e->getMessage());
		}

		return $result;
	}

	/**
	 * Checks whether the option "Collect URLs" is enabled for the output message
	 *
	 * @return  boolean
	 *
	 * @since   3.4
	 */
	public static function collectUrlsEnabled()
	{
		$collect_urls = false;

		if (JPluginHelper::isEnabled('system', 'redirect'))
		{
			$params       = new Registry(JPluginHelper::getPlugin('system', 'redirect')->params);
			$collect_urls = (bool) $params->get('collect_urls', 1);
		}

		return $collect_urls;
	}
}
components/com_redirect/models/link.php000060400000014042152453623440014326 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_redirect
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Redirect link model.
 *
 * @since  1.6
 */
class RedirectModelLink extends JModelAdmin
{
	/**
	 * @var        string    The prefix to use with controller messages.
	 * @since   1.6
	 */
	protected $text_prefix = 'COM_REDIRECT';

	/**
	 * 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 ($record->published != -2)
		{
			return false;
		}

		return parent::canDelete($record);
	}

	/**
	 * 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 database object
	 *
	 * @since   1.6
	 */
	public function getTable($type = 'Link', $prefix = 'RedirectTable', $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  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_redirect.link', 'link', array('control' => 'jform', 'load_data' => $loadData));

		if (empty($form))
		{
			return false;
		}

		// Modify the form based on access controls.
		if ($this->canEditState((object) $data) != true)
		{
			// Disable fields for display.
			$form->setFieldAttribute('published', 'disabled', 'true');

			// Disable fields while saving.
			// The controller has already verified this is a record you can edit.
			$form->setFieldAttribute('published', 'filter', 'unset');
		}

		// If in advanced mode then we make sure the new URL field is not compulsory and the header
		// field compulsory in case people select non-3xx redirects
		if (JComponentHelper::getParams('com_redirect')->get('mode', 0) == true)
		{
			$form->setFieldAttribute('new_url', 'required', 'false');
			$form->setFieldAttribute('header', '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_redirect.edit.link.data', array());

		if (empty($data))
		{
			$data = $this->getItem();
		}

		$this->preprocessData('com_redirect.link', $data);

		return $data;
	}

	/**
	 * Method to activate links.
	 *
	 * @param   array   &$pks     An array of link ids.
	 * @param   string  $url      The new URL to set for the redirect.
	 * @param   string  $comment  A comment for the redirect links.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function activate(&$pks, $url, $comment = null)
	{
		$user = JFactory::getUser();
		$db = $this->getDbo();

		// Sanitize the ids.
		$pks = (array) $pks;
		$pks = ArrayHelper::toInteger($pks);

		// Populate default comment if necessary.
		$comment = (!empty($comment)) ? $comment : JText::sprintf('COM_REDIRECT_REDIRECTED_ON', JHtml::_('date', time()));

		// Access checks.
		if (!$user->authorise('core.edit', 'com_redirect'))
		{
			$pks = array();
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_EDIT_NOT_PERMITTED'));

			return false;
		}

		if (!empty($pks))
		{
			// Update the link rows.
			$query = $db->getQuery(true)
				->update($db->quoteName('#__redirect_links'))
				->set($db->quoteName('new_url') . ' = ' . $db->quote($url))
				->set($db->quoteName('published') . ' = ' . (int) 1)
				->set($db->quoteName('comment') . ' = ' . $db->quote($comment))
				->where($db->quoteName('id') . ' IN (' . implode(',', $pks) . ')');
			$db->setQuery($query);

			try
			{
				$db->execute();
			}
			catch (RuntimeException $e)
			{
				$this->setError($e->getMessage());

				return false;
			}
		}

		return true;
	}

	/**
	 * Method to batch update URLs to have new redirect urls and comments. Note will publish any unpublished URLs.
	 *
	 * @param   array   &$pks     An array of link ids.
	 * @param   string  $url      The new URL to set for the redirect.
	 * @param   string  $comment  A comment for the redirect links.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   3.6.0
	 */
	public function duplicateUrls(&$pks, $url, $comment = null)
	{
		$user = JFactory::getUser();
		$db = $this->getDbo();

		// Sanitize the ids.
		$pks = (array) $pks;
		$pks = ArrayHelper::toInteger($pks);

		// Access checks.
		if (!$user->authorise('core.edit', 'com_redirect'))
		{
			$pks = array();
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_EDIT_NOT_PERMITTED'));

			return false;
		}

		if (!empty($pks))
		{
			$date = JFactory::getDate()->toSql();

			// Update the link rows.
			$query = $db->getQuery(true)
				->update($db->quoteName('#__redirect_links'))
				->set($db->quoteName('new_url') . ' = ' . $db->quote($url))
				->set($db->quoteName('modified_date') . ' = ' . $db->quote($date))
				->set($db->quoteName('published') . ' = ' . 1)
				->where($db->quoteName('id') . ' IN (' . implode(',', $pks) . ')');

			if (!empty($comment))
			{
				$query->set($db->quoteName('comment') . ' = ' . $db->quote($comment));
			}

			$db->setQuery($query);

			try
			{
				$db->execute();
			}
			catch (RuntimeException $e)
			{
				$this->setError($e->getMessage());

				return false;
			}
		}

		return true;
	}
}
components/com_redirect/models/forms/link.xml000060400000004021152453623440015461 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<field
			name="id"
			type="number"
			label="JGLOBAL_FIELD_ID_LABEL"
			description="JGLOBAL_FIELD_ID_DESC"
			id="id"
			default="0"
			readonly="true"
			class="readonly"
		 />

		<field
			name="old_url"
			type="text"
			label="COM_REDIRECT_FIELD_OLD_URL_LABEL"
			description="COM_REDIRECT_FIELD_OLD_URL_DESC"
			class="input-xxlarge"
			size="50"
			required="true"
		/>

		<field
			name="new_url"
			type="text"
			label="COM_REDIRECT_FIELD_NEW_URL_LABEL"
			description="COM_REDIRECT_FIELD_NEW_URL_DESC"
			class="input-xxlarge"
			size="50"
			required="true"
		/>

		<field
			name="comment"
			type="text"
			label="COM_REDIRECT_FIELD_COMMENT_LABEL"
			description="COM_REDIRECT_FIELD_COMMENT_DESC"
			size="40"
		/>

		<field
			name="published"
			type="list"
			label="JSTATUS"
			description="JFIELD_PUBLISHED_DESC"
			class="chzn-color-state"
			size="1"
			default="1"
			>
			<option value="1">JENABLED</option>
			<option value="0">JDISABLED</option>
			<option value="2">JARCHIVED</option>
			<option value="-2">JTRASHED</option>
		</field>

		<field
			name="referer"
			type="text"
			label="COM_REDIRECT_FIELD_REFERRER_LABEL"
			id="referer"
			size="50"
			readonly="true"
		/>

		<field
			name="created_date"
			type="text"
			label="COM_REDIRECT_FIELD_CREATED_DATE_LABEL"
			id="created_date"
			class="readonly"
			size="20"
			readonly="true"
		/>

		<field
			name="modified_date"
			type="text"
			label="COM_REDIRECT_FIELD_UPDATED_DATE_LABEL"
			id="modified_date"
			class="readonly"
			size="20"
			readonly="true"
		/>

		<field
			name="hits"
			type="number"
			label="JGLOBAL_HITS"
			id="hits"
			class="readonly"
			size="20"
			readonly="true"
			filter="unset"
		/>
	</fieldset>
	<fieldset name="advanced">
		<field
			name="header"
			type="redirect"
			label="COM_REDIRECT_FIELD_REDIRECT_STATUS_CODE_LABEL"
			description="COM_REDIRECT_FIELD_REDIRECT_STATUS_CODE_DESC"
			default="301"
			validate="options"
			class="input-xlarge"
		/>
	</fieldset>
</form>
components/com_redirect/models/forms/filter_links.xml000060400000004565152453623440017226 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_REDIRECT_FILTER_SEARCH_LABEL"
			description="COM_REDIRECT_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
		/>
		<field
			name="state"
			type="redirect_status"
			label="COM_REDIRECT_FILTER_PUBLISHED"
			description="COM_REDIRECT_FILTER_PUBLISHED_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>
		<field
			name="http_status"
			type="Redirect"
			label="COM_REDIRECT_FILTER_HTTP_HEADER_LABEL"
			description="COM_REDIRECT_FILTER_HTTP_HEADER_DESC"
			onchange="this.form.submit();"
			>
			<option value="">COM_REDIRECT_FILTER_SELECT_OPTION_HTTP_HEADER</option>
		</field>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="a.old_url ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.published ASC">JSTATUS_ASC</option>
			<option value="a.published DESC">JSTATUS_DESC</option>
			<option value="a.old_url ASC">COM_REDIRECT_HEADING_OLD_URL_ASC</option>
			<option value="a.old_url DESC">COM_REDIRECT_HEADING_OLD_URL_DESC</option>
			<option value="a.new_url ASC">COM_REDIRECT_HEADING_NEW_URL_ASC</option>
			<option value="a.new_url DESC">COM_REDIRECT_HEADING_NEW_URL_DESC</option>
			<option value="a.referer ASC">COM_REDIRECT_HEADING_REFERRER_ASC</option>
			<option value="a.referer DESC">COM_REDIRECT_HEADING_REFERRER_DESC</option>
			<option value="a.created_date ASC">COM_REDIRECT_HEADING_CREATED_DATE_ASC</option>
			<option value="a.created_date DESC">COM_REDIRECT_HEADING_CREATED_DATE_DESC</option>
			<option value="a.hits ASC">COM_REDIRECT_HEADING_HITS_ASC</option>
			<option value="a.hits DESC">COM_REDIRECT_HEADING_HITS_DESC</option>
			<option value="a.header ASC">COM_REDIRECT_HEADING_STATUS_CODE_ASC</option>
			<option value="a.header DESC">COM_REDIRECT_HEADING_STATUS_CODE_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			label="JGLOBAL_LIMIT"
			description="JGLOBAL_LIMIT"
			class="input-mini"
			default="5"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_redirect/models/links.php000060400000013556152453623440014522 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_redirect
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Methods supporting a list of redirect links.
 *
 * @since  1.6
 */
class RedirectModelLinks extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'state', 'a.state',
				'old_url', 'a.old_url',
				'new_url', 'a.new_url',
				'referer', 'a.referer',
				'hits', 'a.hits',
				'created_date', 'a.created_date',
				'published', 'a.published',
				'header', 'a.header', 'http_status',
			);
		}

		parent::__construct($config);
	}
	/**
	 * Removes all of the unpublished redirects from the table.
	 *
	 * @return  boolean result of operation
	 *
	 * @since   3.5
	 */
	public function purge()
	{
		$db = $this->getDbo();

		$query = $db->getQuery(true);

		$query->delete('#__redirect_links')->where($db->qn('published') . '= 0');

		$db->setQuery($query);

		try
		{
			$db->execute();
		}
		catch (Exception $e)
		{
			return false;
		}

		return true;
	}

	/**
	 * 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.old_url', $direction = 'asc')
	{
		// Load the filter state.
		$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', '', 'string'));
		$this->setState('filter.http_status', $this->getUserStateFromRequest($this->context . '.filter.http_status', 'filter_http_status', '', 'cmd'));

		// Load the parameters.
		$params = JComponentHelper::getParams('com_redirect');
		$this->setState('params', $params);

		// 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.
	 *
	 * @since   1.6
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.state');
		$id .= ':' . $this->getState('filter.http_status');

		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);

		// Select the required fields from the table.
		$query->select(
			$this->getState(
				'list.select',
				'a.*'
			)
		);
		$query->from($db->quoteName('#__redirect_links', 'a'));

		// Filter by published state
		$state = $this->getState('filter.state');

		if (is_numeric($state))
		{
			$query->where($db->quoteName('a.published') . ' = ' . (int) $state);
		}
		elseif ($state === '')
		{
			$query->where($db->quoteName('a.published') . ' IN (0,1)');
		}

		// Filter the items over the HTTP status code header.
		if ($httpStatusCode = $this->getState('filter.http_status'))
		{
			$query->where($db->quoteName('a.header') . ' = ' . (int) $httpStatusCode);
		}

		// Filter the items over the search string if set.
		$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(
					'(' . $db->quoteName('old_url') . ' LIKE ' . $search .
					' OR ' . $db->quoteName('new_url') . ' LIKE ' . $search .
					' OR ' . $db->quoteName('comment') . ' LIKE ' . $search .
					' OR ' . $db->quoteName('referer') . ' LIKE ' . $search . ')'
				);
			}
		}

		// Add the list ordering clause.
		$query->order($db->escape($this->getState('list.ordering', 'a.old_url')) . ' ' . $db->escape($this->getState('list.direction', 'ASC')));

		return $query;
	}

	/**
	 * Add the entered URLs into the database
	 *
	 * @param   array  $batchUrls  Array of URLs to enter into the database
	 *
	 * @return boolean
	 */
	public function batchProcess($batchUrls)
	{
		$db    = JFactory::getDbo();
		$query = $db->getQuery(true);

		$params = JComponentHelper::getParams('com_redirect');
		$state  = (int) $params->get('defaultImportState', 0);

		$columns = array(
			$db->quoteName('old_url'),
			$db->quoteName('new_url'),
			$db->quoteName('referer'),
			$db->quoteName('comment'),
			$db->quoteName('hits'),
			$db->quoteName('published'),
			$db->quoteName('created_date')
		);

		$query->columns($columns);

		foreach ($batchUrls as $batch_url)
		{
			$old_url = $batch_url[0];

			// Destination URL can also be an external URL
			if (!empty($batch_url[1]))
			{
				$new_url = $batch_url[1];
			}
			else
			{
				$new_url = '';
			}

			$query->insert($db->quoteName('#__redirect_links'), false)
				->values(
					$db->quote($old_url) . ', ' . $db->quote($new_url) . ' ,' . $db->quote('') . ', ' . $db->quote('') . ', 0, ' . $state . ', ' .
					$db->quote(JFactory::getDate()->toSql())
				);
		}

		$db->setQuery($query);
		$db->execute();

		return true;
	}
}
components/com_redirect/models/fields/redirect.php000060400000007435152453623440016450 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_redirect
 *
 * @copyright   (C) 2014 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JFormHelper::loadFieldClass('list');

/**
 * A dropdown containing all valid HTTP 1.1 response codes.
 *
 * @package     Joomla.Administrator
 * @subpackage  com_redirect
 * @since       3.4
 */
class JFormFieldRedirect extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.4
	 */
	protected $type = 'Redirect';

	/**
	 * A map of integer HTTP 1.1 response codes to the full HTTP Status for the headers.
	 *
	 * @var    object
	 * @since  3.4
	 * @link   http://www.iana.org/assignments/http-status-codes/
	 */
	protected $responseMap = array(
		100 => 'HTTP/1.1 100 Continue',
		101 => 'HTTP/1.1 101 Switching Protocols',
		102 => 'HTTP/1.1 102 Processing',
		200 => 'HTTP/1.1 200 OK',
		201 => 'HTTP/1.1 201 Created',
		202 => 'HTTP/1.1 202 Accepted',
		203 => 'HTTP/1.1 203 Non-Authoritative Information',
		204 => 'HTTP/1.1 204 No Content',
		205 => 'HTTP/1.1 205 Reset Content',
		206 => 'HTTP/1.1 206 Partial Content',
		207 => 'HTTP/1.1 207 Multi-Status',
		208 => 'HTTP/1.1 208 Already Reported',
		226 => 'HTTP/1.1 226 IM Used',
		300 => 'HTTP/1.1 300 Multiple Choices',
		301 => 'HTTP/1.1 301 Moved Permanently',
		302 => 'HTTP/1.1 302 Found',
		303 => 'HTTP/1.1 303 See other',
		304 => 'HTTP/1.1 304 Not Modified',
		305 => 'HTTP/1.1 305 Use Proxy',
		306 => 'HTTP/1.1 306 (Unused)',
		307 => 'HTTP/1.1 307 Temporary Redirect',
		308 => 'HTTP/1.1 308 Permanent Redirect',
		400 => 'HTTP/1.1 400 Bad Request',
		401 => 'HTTP/1.1 401 Unauthorized',
		402 => 'HTTP/1.1 402 Payment Required',
		403 => 'HTTP/1.1 403 Forbidden',
		404 => 'HTTP/1.1 404 Not Found',
		405 => 'HTTP/1.1 405 Method Not Allowed',
		406 => 'HTTP/1.1 406 Not Acceptable',
		407 => 'HTTP/1.1 407 Proxy Authentication Required',
		408 => 'HTTP/1.1 408 Request Timeout',
		409 => 'HTTP/1.1 409 Conflict',
		410 => 'HTTP/1.1 410 Gone',
		411 => 'HTTP/1.1 411 Length Required',
		412 => 'HTTP/1.1 412 Precondition Failed',
		413 => 'HTTP/1.1 413 Payload Too Large',
		414 => 'HTTP/1.1 414 URI Too Long',
		415 => 'HTTP/1.1 415 Unsupported Media Type',
		416 => 'HTTP/1.1 416 Requested Range Not Satisfiable',
		417 => 'HTTP/1.1 417 Expectation Failed',
		418 => 'HTTP/1.1 418 I\'m a teapot',
		422 => 'HTTP/1.1 422 Unprocessable Entity',
		423 => 'HTTP/1.1 423 Locked',
		424 => 'HTTP/1.1 424 Failed Dependency',
		425 => 'HTTP/1.1 425 Reserved for WebDAV advanced collections expired proposal',
		426 => 'HTTP/1.1 426 Upgrade Required',
		428 => 'HTTP/1.1 428 Precondition Required',
		429 => 'HTTP/1.1 429 Too Many Requests',
		431 => 'HTTP/1.1 431 Request Header Fields Too Large',
		451 => 'HTTP/1.1 451 Unavailable For Legal Reasons',
		500 => 'HTTP/1.1 500 Internal Server Error',
		501 => 'HTTP/1.1 501 Not Implemented',
		502 => 'HTTP/1.1 502 Bad Gateway',
		503 => 'HTTP/1.1 503 Service Unavailable',
		504 => 'HTTP/1.1 504 Gateway Timeout',
		505 => 'HTTP/1.1 505 HTTP Version Not Supported',
		506 => 'HTTP/1.1 506 Variant Also Negotiates (Experimental)',
		507 => 'HTTP/1.1 507 Insufficient Storage',
		508 => 'HTTP/1.1 508 Loop Detected',
		510 => 'HTTP/1.1 510 Not Extended',
		511 => 'HTTP/1.1 511 Network Authentication Required',
	);

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string	The field input markup.
	 *
	 * @since   3.4
	 */
	protected function getOptions()
	{
		$options = array();

		foreach ($this->responseMap as $key => $value)
		{
			$options[] = JHtml::_('select.option', $key, $value);
		}

		// Merge any additional options in the XML definition.
		$options = array_merge(parent::getOptions(), $options);

		return $options;
	}
}
components/com_redirect/controller.php000060400000003242152453623440014271 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_redirect
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Redirect master display controller.
 *
 * @since  1.6
 */
class RedirectController extends JControllerLegacy
{
	/**
	 * @var		string	The default view.
	 * @since   1.6
	 */
	protected $default_view = 'links';

	/**
	 * Method to display a view.
	 *
	 * @param   boolean  $cachable   If true, the view output will be cached.
	 * @param   mixed    $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)
	{
		JLoader::register('RedirectHelper', JPATH_ADMINISTRATOR . '/components/com_redirect/helpers/redirect.php');

		// Load the submenu.
		RedirectHelper::addSubmenu($this->input->get('view', 'links'));

		$view   = $this->input->get('view', 'links');
		$layout = $this->input->get('layout', 'default');
		$id     = $this->input->getInt('id');

		// Check for edit form.
		if ($view == 'link' && $layout == 'edit' && !$this->checkEditId('com_redirect.edit.link', $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_redirect&view=links', false));

			return false;
		}

		parent::display();
	}
}
components/com_redirect/redirect.xml000060400000002120152453623440013712 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_redirect</name>
	<author>Joomla! Project</author>
	<creationDate>April 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_REDIRECT_XML_DESCRIPTION</description>
	<administration>
		<menu link="option=com_redirect" img="class:redirect">Redirect</menu>

		<files folder="admin">
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<filename>redirect.php</filename>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>tables</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_redirect.ini</language>
			<language tag="en-GB">language/en-GB.com_redirect.sys.ini</language>
		</languages>
	</administration>
</extension>
components/com_redirect/redirect.php000060400000001072152453623440013706 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_redirect
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

if (!JFactory::getUser()->authorise('core.manage', 'com_redirect'))
{
	throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
}

$controller = JControllerLegacy::getInstance('Redirect');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
components/com_redirect/config.xml000060400000002214152453623440013362 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset 
		name="redirect"
		label="COM_REDIRECT_ADVANCED_OPTIONS"
		>
		<field
			name="mode"
			type="radio"
			label="COM_REDIRECT_MODE_LABEL"
			description="COM_REDIRECT_MODE_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>
		<field
			name="separator"
			type="text"
			label="COM_REDIRECT_BULK_SEPARATOR_LABEL"
			description="COM_REDIRECT_BULK_SEPARATOR_DESC"
			default="|"
		/>
		<field
			name="defaultImportState"
			type="radio"
			label="COM_REDIRECT_DEFAULT_IMPORT_STATE_LABEL"
			description="COM_REDIRECT_DEFAULT_IMPORT_STATE_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JENABLED</option>
			<option value="0">JDISABLED</option>
		</field>
	</fieldset>

	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
		>
		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			filter="rules"
			validate="rules"
			component="com_redirect"
			section="component" 
		/>
	</fieldset>
</config>
components/com_redirect/access.xml000060400000001465152453623440013365 0ustar00<?xml version="1.0" encoding="utf-8" ?>
<access component="com_redirect">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.options" title="JACTION_OPTIONS" description="JACTION_OPTIONS_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
	</section>
</access>
components/com_redirect/views/link/tmpl/edit.php000060400000003661152453623440016106 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_redirect
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');
JHtml::_('formbehavior.chosen', 'select');

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(task)
	{
		if (task == 'link.cancel' || document.formvalidator.isValid(document.getElementById('link-form')))
		{
			Joomla.submitform(task, document.getElementById('link-form'));
		}
	};
");
?>

<form action="<?php echo JRoute::_('index.php?option=com_redirect&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="link-form" class="form-validate form-horizontal">
	<fieldset>
		<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'basic')); ?>

			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'basic', empty($this->item->id) ? JText::_('COM_REDIRECT_NEW_LINK') : JText::sprintf('COM_REDIRECT_EDIT_LINK', $this->item->id)); ?>
				<?php echo $this->form->renderField('old_url'); ?>
				<?php echo $this->form->renderField('new_url'); ?>
				<?php echo $this->form->renderField('published'); ?>
				<?php echo $this->form->renderField('comment'); ?>
				<?php echo $this->form->renderField('id'); ?>
				<?php echo $this->form->renderField('created_date'); ?>
				<?php echo $this->form->renderField('modified_date'); ?>
				<?php if (JComponentHelper::getParams('com_redirect')->get('mode')) : ?>
					<?php echo $this->form->renderFieldset('advanced'); ?>
				<?php endif; ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php echo JHtml::_('bootstrap.endTabSet'); ?>

		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</fieldset>
</form>
components/com_redirect/views/link/view.html.php000060400000004113152453623440016113 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_redirect
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View to edit a redirect link.
 *
 * @since  1.6
 */
class RedirectViewLink extends JViewLegacy
{
	protected $item;

	protected $form;

	protected $state;

	/**
	 * Display the view.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  False if unsuccessful, otherwise void.
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		$this->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();
		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		JFactory::getApplication()->input->set('hidemainmenu', true);

		$isNew = ($this->item->id == 0);
		$canDo = JHelperContent::getActions('com_redirect');

		JToolbarHelper::title($isNew ? JText::_('COM_REDIRECT_MANAGER_LINK_NEW') : JText::_('COM_REDIRECT_MANAGER_LINK_EDIT'), 'refresh redirect');

		// If not checked out, can save the item.
		if ($canDo->get('core.edit'))
		{
			JToolbarHelper::apply('link.apply');
			JToolbarHelper::save('link.save');
		}

		/**
		 * This component does not support Save as Copy due to uniqueness checks.
		 * While it can be done, it causes too much confusion if the user does
		 * not change the Old URL.
		 */
		if ($canDo->get('core.edit') && $canDo->get('core.create'))
		{
			JToolbarHelper::save2new('link.save2new');
		}

		if (empty($this->item->id))
		{
			JToolbarHelper::cancel('link.cancel');
		}
		else
		{
			JToolbarHelper::cancel('link.cancel', 'JTOOLBAR_CLOSE');
		}

		JToolbarHelper::help('JHELP_COMPONENTS_REDIRECT_MANAGER_EDIT');
	}
}
components/com_redirect/views/links/tmpl/default.xml000060400000000254152453623440016774 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_REDIRECT">
		<message>
			<![CDATA[COM_REDIRECT_XML_DESCRIPTION]]>
		</message>
	</layout>
</metadata>components/com_redirect/views/links/tmpl/default.php000060400000015707152453623440016774 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_redirect
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$user      = JFactory::getUser();
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>
<form action="<?php echo JRoute::_('index.php?option=com_redirect&view=links'); ?>" method="post" name="adminForm" id="adminForm">
	<div id="j-main-container">
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<?php if ($this->redirectPluginId) : ?>
			<?php $link = JRoute::_('index.php?option=com_plugins&client_id=0&task=plugin.edit&extension_id=' . $this->redirectPluginId . '&tmpl=component&layout=modal'); ?>
			<?php echo JHtml::_(
				'bootstrap.renderModal',
				'plugin' . $this->redirectPluginId . 'Modal',
				array(
					'url'         => $link,
					'title'       => JText::_('COM_REDIRECT_EDIT_PLUGIN_SETTINGS'),
					'height'      => '400px',
					'width'       => '800px',
					'bodyHeight'  => '70',
					'modalWidth'  => '80',
					'closeButton' => false,
					'backdrop'    => 'static',
					'keyboard'    => false,
					'footer'      => '<button type="button" class="btn" data-dismiss="modal"'
						. ' onclick="jQuery(\'#plugin' . $this->redirectPluginId . 'Modal iframe\').contents().find(\'#closeBtn\').click();">'
						. JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>'
						. '<button type="button" class="btn btn-primary" data-dismiss="modal" onclick="jQuery(\'#plugin' . $this->redirectPluginId . 'Modal iframe\').contents().find(\'#saveBtn\').click();">'
						. JText::_("JSAVE") . '</button>'
						. '<button type="button" class="btn btn-success" onclick="jQuery(\'#plugin' . $this->redirectPluginId . 'Modal iframe\').contents().find(\'#applyBtn\').click(); return false;">'
						. JText::_("JAPPLY") . '</button>'
				)
			); ?>
		<?php endif; ?>

		<?php if (empty($this->items)) : ?>
		<div class="alert alert-no-items">
			<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
		</div>
		<?php else : ?>
			<table class="table table-striped">
				<thead>
					<tr>
						<th width="1%" class="center nowrap">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th width="1%" class="center nowrap">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.published', $listDirn, $listOrder); ?>
						</th>
						<th class="nowrap title">
							<?php echo JHtml::_('searchtools.sort', 'COM_REDIRECT_HEADING_OLD_URL', 'a.old_url', $listDirn, $listOrder); ?>
						</th>
						<th width="30%" class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_REDIRECT_HEADING_NEW_URL', 'a.new_url', $listDirn, $listOrder); ?>
						</th>
						<th width="30%" class="nowrap hidden-phone hidden-tablet">
							<?php echo JHtml::_('searchtools.sort', 'COM_REDIRECT_HEADING_REFERRER', 'a.referer', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone hidden-tablet">
							<?php echo JHtml::_('searchtools.sort', 'COM_REDIRECT_HEADING_CREATED_DATE', 'a.created_date', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_REDIRECT_HEADING_HITS', 'a.hits', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_REDIRECT_HEADING_STATUS_CODE', 'a.header', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="9">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
				<?php foreach ($this->items as $i => $item) :
					$canEdit   = $user->authorise('core.edit',       'com_redirect');
					$canChange = $user->authorise('core.edit.state', 'com_redirect');
					?>
					<tr class="row<?php echo $i % 2; ?>">
						<td class="center">
							<?php echo JHtml::_('grid.id', $i, $item->id); ?>
						</td>
						<td class="center">
							<div class="btn-group">
								<?php echo JHtml::_('redirect.published', $item->published, $i); ?>
								<?php // Create dropdown items and render the dropdown list.
								if ($canChange)
								{
									JHtml::_('actionsdropdown.' . ((int) $item->published === 2 ? 'un' : '') . 'archive', 'cb' . $i, 'links');
									JHtml::_('actionsdropdown.' . ((int) $item->published === -2 ? 'un' : '') . 'trash', 'cb' . $i, 'links');
									echo JHtml::_('actionsdropdown.render', $this->escape($item->old_url));
								}
								?>
							</div>
						</td>
						<td class="break-word">
							<?php if ($canEdit) : ?>
								<a href="<?php echo JRoute::_('index.php?option=com_redirect&task=link.edit&id=' . $item->id); ?>" title="<?php echo $this->escape($item->old_url); ?>">
									<?php echo $this->escape(str_replace(JUri::root(), '', rawurldecode($item->old_url))); ?></a>
							<?php else : ?>
									<?php echo $this->escape(str_replace(JUri::root(), '', rawurldecode($item->old_url))); ?>
							<?php endif; ?>
						</td>
						<td class="small break-word">
							<?php echo $this->escape(rawurldecode($item->new_url)); ?>
						</td>
						<td class="small break-word hidden-phone hidden-tablet">
							<?php echo $this->escape($item->referer); ?>
						</td>
						<td class="small hidden-phone hidden-tablet">
							<?php echo JHtml::_('date', $item->created_date, JText::_('DATE_FORMAT_LC4')); ?>
						</td>
						<td class="hidden-phone">
							<?php echo (int) $item->hits; ?>
						</td>
						<td class="hidden-phone">
							<?php echo (int) $item->header; ?>
						</td>
						<td class="hidden-phone">
							<?php echo (int) $item->id; ?>
						</td>
					</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif; ?>

		<?php if (!empty($this->items)) : ?>
			<?php echo $this->loadTemplate('addform'); ?>
		<?php endif; ?>
		<?php // Load the batch processing form if user is allowed ?>
			<?php if ($user->authorise('core.create', 'com_redirect')
				&& $user->authorise('core.edit', 'com_redirect')
				&& $user->authorise('core.edit.state', 'com_redirect')) : ?>
				<?php echo JHtml::_(
					'bootstrap.renderModal',
					'collapseModal',
					array(
						'title'  => JText::_('COM_REDIRECT_BATCH_OPTIONS'),
						'footer' => $this->loadTemplate('batch_footer'),
					),
					$this->loadTemplate('batch_body')
				); ?>
			<?php endif; ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_redirect/views/links/tmpl/default_batch_body.php000060400000001342152453623440021140 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_redirect
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;
$published = $this->state->get('filter.published');
$params    = $this->params;
$separator = $params->get('separator', '|');
?>

<div class="container-fluid">
	<div class="row-fluid">
		<div class="control-group span12">
			<p><?php echo JText::sprintf('COM_REDIRECT_BATCH_TIP', $separator); ?></p>
			<div class="controls">
				<textarea class="span12" rows="10" aria-required="true" value="" id="batch_urls" name="batch_urls"></textarea>
			</div>
		</div>
	</div>
</div>
components/com_redirect/views/links/tmpl/default_batch_footer.php000060400000001122152453623440021475 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_redirect
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

?>
<button type="button" class="btn" data-dismiss="modal" onclick="document.getElementById('batch_urls').value='';">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<button type="submit" class="btn btn-success" onclick="Joomla.submitbutton('links.batch');return false;">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>
components/com_redirect/views/links/tmpl/default_addform.php000060400000003137152453623440020462 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_redirect
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

?>
<div class="accordion hidden-phone" id="accordion1">
	<div class="accordion-group">
		<div class="accordion-heading">
			<a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion2" href="#batch">
				<?php echo JText::_('COM_REDIRECT_BATCH_UPDATE_WITH_NEW_URL'); ?>
			</a>
		</div>
		<div id="batch" class="accordion-body collapse">
			<div class="accordion-inner">
				<fieldset class="batch form-inline">
					<div class="control-group">
						<label for="new_url" class="control-label"><?php echo JText::_('COM_REDIRECT_FIELD_NEW_URL_LABEL'); ?></label>
						<div class="controls">
							<input type="text" name="new_url" id="new_url" value="" size="50" title="<?php echo JText::_('COM_REDIRECT_FIELD_NEW_URL_DESC'); ?>" />
						</div>
					</div>
					<div class="control-group">
						<label for="comment" class="control-label"><?php echo JText::_('COM_REDIRECT_FIELD_COMMENT_LABEL'); ?></label>
						<div class="controls">
							<input type="text" name="comment" id="comment" value="" size="50" title="<?php echo JText::_('COM_REDIRECT_FIELD_COMMENT_DESC'); ?>" />
						</div>
					</div>
					<button class="btn btn-primary" type="button" onclick="this.form.task.value='links.duplicateUrls';this.form.submit();"><?php echo JText::_('COM_REDIRECT_BUTTON_UPDATE_LINKS'); ?></button>
				</fieldset>
			</div>
		</div>
	</div>
</div>
components/com_redirect/views/links/view.html.php000060400000011665152453623440016310 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_redirect
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of redirection links.
 *
 * @since  1.6
 */
class RedirectViewLinks extends JViewLegacy
{
	protected $enabled;

	protected $collect_urls_enabled;

	protected $redirectPluginId = 0;

	protected $items;

	protected $pagination;

	protected $state;

	public $filterForm;

	public $activeFilters;

	/**
	 * Display the view.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  False if unsuccessful, otherwise void.
	 *
	 * @since   1.6
	 *
	 * @throws  Exception
	 */
	public function display($tpl = null)
	{
		// Set variables
		$app                        = JFactory::getApplication();
		$this->enabled              = JPluginHelper::isEnabled('system', 'redirect');
		$this->collect_urls_enabled = RedirectHelper::collectUrlsEnabled();
		$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');
		$this->params               = JComponentHelper::getParams('com_redirect');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Show messages about the enabled plugin and if the plugin should collect URLs
		if ($this->enabled && $this->collect_urls_enabled)
		{
			$app->enqueueMessage(JText::sprintf('COM_REDIRECT_COLLECT_URLS_ENABLED', JText::_('COM_REDIRECT_PLUGIN_ENABLED')), 'notice');
		}
		else
		{
			$this->redirectPluginId = RedirectHelper::getRedirectPluginId();

			$link = JHtml::_(
				'link',
				'#plugin' . $this->redirectPluginId . 'Modal',
				JText::_('COM_REDIRECT_SYSTEM_PLUGIN'),
				'class="alert-link" data-toggle="modal" id="title-' . $this->redirectPluginId . '"'
			);

			// To be removed in Joomla 4
			if (JFactory::getApplication()->getTemplate() === 'hathor')
			{
				$link = JHtml::_(
					'link',
					JRoute::_('index.php?option=com_plugins&task=plugin.edit&extension_id=' . RedirectHelper::getRedirectPluginId()),
					JText::_('COM_REDIRECT_SYSTEM_PLUGIN')
				);
			}

			if ($this->enabled && !$this->collect_urls_enabled)
			{
				$app->enqueueMessage(JText::sprintf('COM_REDIRECT_COLLECT_MODAL_URLS_DISABLED', JText::_('COM_REDIRECT_PLUGIN_ENABLED'), $link), 'notice');
			}
			else
			{
				$app->enqueueMessage(JText::sprintf('COM_REDIRECT_PLUGIN_MODAL_DISABLED', $link), 'error');
			}
		}

		$this->addToolbar();

		return parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		$state = $this->get('State');
		$canDo = JHelperContent::getActions('com_redirect');

		JToolbarHelper::title(JText::_('COM_REDIRECT_MANAGER_LINKS'), 'refresh redirect');

		if ($canDo->get('core.create'))
		{
			JToolbarHelper::addNew('link.add');
		}

		if ($canDo->get('core.edit'))
		{
			JToolbarHelper::editList('link.edit');
		}

		if ($canDo->get('core.edit.state'))
		{
			if ($state->get('filter.state') != 2)
			{
				JToolbarHelper::divider();
				JToolbarHelper::publish('links.publish', 'JTOOLBAR_ENABLE', true);
				JToolbarHelper::unpublish('links.unpublish', 'JTOOLBAR_DISABLE', true);
			}

			if ($state->get('filter.state') != -1)
			{
				JToolbarHelper::divider();

				if ($state->get('filter.state') != 2)
				{
					JToolbarHelper::archiveList('links.archive');
				}
				elseif ($state->get('filter.state') == 2)
				{
					JToolbarHelper::unarchiveList('links.publish', 'JTOOLBAR_UNARCHIVE');
				}
			}
		}

		if ($canDo->get('core.create'))
		{
			// Get the toolbar object instance
			$bar = JToolbar::getInstance('toolbar');

			$title = JText::_('JTOOLBAR_BULK_IMPORT');

			JHtml::_('bootstrap.modal', 'collapseModal');

			// Instantiate a new JLayoutFile instance and render the batch button
			$layout = new JLayoutFile('toolbar.batch');

			$dhtml = $layout->render(array('title' => $title));
			$bar->appendButton('Custom', $dhtml, 'batch');
		}

		if ($state->get('filter.state') == -2 && $canDo->get('core.delete'))
		{
			JToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'links.delete', 'JTOOLBAR_EMPTY_TRASH');
			JToolbarHelper::divider();
		}
		elseif ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::custom('links.purge', 'delete', 'delete', 'COM_REDIRECT_TOOLBAR_PURGE', false);
			JToolbarHelper::trash('links.trash');
			JToolbarHelper::divider();
		}

		if ($canDo->get('core.admin') || $canDo->get('core.options'))
		{
			JToolbarHelper::preferences('com_redirect');
			JToolbarHelper::divider();
		}

		JToolbarHelper::help('JHELP_COMPONENTS_REDIRECT_MANAGER');
	}
}
components/com_redirect/controllers/links.php000060400000010637152453623440015602 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_redirect
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Redirect link list controller class.
 *
 * @since  1.6
 */
class RedirectControllerLinks extends JControllerAdmin
{
	/**
	 * Method to update a record.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function activate()
	{
		// Check for request forgeries.
		$this->checkToken();

		$ids = (array) $this->input->get('cid', array(), 'int');

		// Remove zero values resulting from input filter
		$ids = array_filter($ids);

		if (empty($ids))
		{
			JError::raiseWarning(500, JText::_('COM_REDIRECT_NO_ITEM_SELECTED'));
		}
		else
		{
			$newUrl  = $this->input->getString('new_url');
			$comment = $this->input->getString('comment');

			// Get the model.
			$model = $this->getModel();

			// Remove the items.
			if (!$model->activate($ids, $newUrl, $comment))
			{
				JError::raiseWarning(500, $model->getError());
			}
			else
			{
				$this->setMessage(JText::plural('COM_REDIRECT_N_LINKS_UPDATED', count($ids)));
			}
		}

		$this->setRedirect('index.php?option=com_redirect&view=links');
	}

	/**
	 * Method to duplicate URLs in records.
	 *
	 * @return  void
	 *
	 * @since   3.6.0
	 */
	public function duplicateUrls()
	{
		// Check for request forgeries.
		$this->checkToken();

		$ids = (array) $this->input->get('cid', array(), 'int');

		// Remove zero values resulting from input filter
		$ids = array_filter($ids);

		if (empty($ids))
		{
			JError::raiseWarning(500, JText::_('COM_REDIRECT_NO_ITEM_SELECTED'));
		}
		else
		{
			$newUrl  = $this->input->getString('new_url');
			$comment = $this->input->getString('comment');

			// Get the model.
			$model = $this->getModel();

			// Remove the items.
			if (!$model->duplicateUrls($ids, $newUrl, $comment))
			{
				JError::raiseWarning(500, $model->getError());
			}
			else
			{
				$this->setMessage(JText::plural('COM_REDIRECT_N_LINKS_UPDATED', count($ids)));
			}
		}

		$this->setRedirect('index.php?option=com_redirect&view=links');
	}

	/**
	 * Proxy for getModel.
	 *
	 * @param   string  $name    The name of the model.
	 * @param   string  $prefix  The prefix of the model.
	 * @param   array   $config  An array of settings.
	 *
	 * @return  JModel instance
	 *
	 * @since   1.6
	 */
	public function getModel($name = 'Link', $prefix = 'RedirectModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	/**
	 * Executes the batch process to add URLs to the database
	 *
	 * @return  void
	 */
	public function batch()
	{
		// Check for request forgeries.
		$this->checkToken();

		$batch_urls_request = $this->input->post->get('batch_urls', array(), 'array');
		$batch_urls_lines   = array_map('trim', explode("\n", $batch_urls_request[0]));

		$batch_urls = array();

		foreach ($batch_urls_lines as $batch_urls_line)
		{
			if (!empty($batch_urls_line))
			{
				$params = JComponentHelper::getParams('com_redirect');
				$separator = $params->get('separator', '|');

				// Basic check to make sure the correct separator is being used
				if (!\Joomla\String\StringHelper::strpos($batch_urls_line, $separator))
				{
					$this->setMessage(JText::sprintf('COM_REDIRECT_NO_SEPARATOR_FOUND', $separator), 'error');
					$this->setRedirect('index.php?option=com_redirect&view=links');

					return false;
				}

				$batch_urls[] = array_map('trim', explode($separator, $batch_urls_line));
			}
		}

		// Set default message on error - overwrite if successful
		$this->setMessage(JText::_('COM_REDIRECT_NO_ITEM_ADDED'), 'error');

		if (!empty($batch_urls))
		{
			$model = $this->getModel('Links');

			// Execute the batch process
			if ($model->batchProcess($batch_urls))
			{
				$this->setMessage(JText::plural('COM_REDIRECT_N_LINKS_ADDED', count($batch_urls)));
			}
		}

		$this->setRedirect('index.php?option=com_redirect&view=links');
	}

	/**
	 * Clean out the unpublished links.
	 *
	 * @return  void
	 *
	 * @since   3.5
	 */
	public function purge()
	{
		// Check for request forgeries.
		$this->checkToken();

		$model = $this->getModel('Links');

		if ($model->purge())
		{
			$message = JText::_('COM_REDIRECT_CLEAR_SUCCESS');
		}
		else
		{
			$message = JText::_('COM_REDIRECT_CLEAR_FAIL');
		}

		$this->setRedirect('index.php?option=com_redirect&view=links', $message);
	}
}
components/com_redirect/controllers/link.php000060400000000703152453623440015410 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_redirect
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Redirect link controller class.
 *
 * @since  1.6
 */
class RedirectControllerLink extends JControllerForm
{
	// Parent class access checks are sufficient for this controller.
}
components/com_akeeba/script.com_akeeba.php000060400000156732152453623440015103 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use FOF40\Container\Container as FOFContainer;
use Joomla\CMS\Installer\Adapter\ComponentAdapter;

defined('_JEXEC') or die();

// Load FOF if not already loaded
if (!defined('FOF40_INCLUDED') && !@include_once(JPATH_LIBRARIES . '/fof40/include.php'))
{
	throw new RuntimeException('This extension requires FOF 4.');
}

class Com_AkeebaInstallerScript extends \FOF40\InstallScript\Component
{
	/**
	 * The component's name
	 *
	 * @var   string
	 */
	public $componentName = 'com_akeeba';

	/**
	 * The title of the component (printed on installation and uninstallation messages)
	 *
	 * @var string
	 */
	protected $componentTitle = 'Akeeba Backup';

	/**
	 * The minimum PHP version required to install this extension
	 *
	 * @var   string
	 */
	protected $minimumPHPVersion = '7.2.0';

	/**
	 * The minimum Joomla! version required to install this extension
	 *
	 * @var   string
	 */
	protected $minimumJoomlaVersion = '3.9.0';

	/**
	 * The list of obsolete extra modules and plugins to uninstall on component upgrade / installation.
	 *
	 * @var array
	 */
	protected $uninstallation_queue = [
		// modules => { (folder) => { (module) }* }*
		'modules' => [
			'admin' => [
				'mod_akadmin',
			],
			'site'  => [],
		],
		// plugins => { (folder) => { (element) }* }*
		'plugins' => [
			'system' => [
				'aklazy',
				'srp',
			],
		],
	];

	protected $containerBroken = false;

	/**
	 * Obsolete files and folders to remove from the free version only. This is used when you move a feature from the
	 * free version of your extension to its paid version. If you don't have such a distinction you can ignore this.
	 *
	 * @var   array
	 */
	protected $removeFilesFree = [
		'files'   => [
			// Pro component features
			'administrator/components/com_akeeba/BackupEngine/Archiver/Directftp.php',
			'administrator/components/com_akeeba/BackupEngine/Archiver/directftp.ini',
			'administrator/components/com_akeeba/BackupEngine/Archiver/directftp.json',
			'administrator/components/com_akeeba/BackupEngine/Archiver/Directftpcurl.php',
			'administrator/components/com_akeeba/BackupEngine/Archiver/directftpcurl.ini',
			'administrator/components/com_akeeba/BackupEngine/Archiver/directftpcurl.json',
			'administrator/components/com_akeeba/BackupEngine/Archiver/Directsftp.php',
			'administrator/components/com_akeeba/BackupEngine/Archiver/directsftp.ini',
			'administrator/components/com_akeeba/BackupEngine/Archiver/directsftp.json',
			'administrator/components/com_akeeba/BackupEngine/Archiver/Directsftpcurl.php',
			'administrator/components/com_akeeba/BackupEngine/Archiver/directsftpcurl.ini',
			'administrator/components/com_akeeba/BackupEngine/Archiver/directsftpcurl.json',
			'administrator/components/com_akeeba/BackupEngine/Archiver/Jps.php',
			'administrator/components/com_akeeba/BackupEngine/Archiver/jps.ini',
			'administrator/components/com_akeeba/BackupEngine/Archiver/jps.json',
			'administrator/components/com_akeeba/BackupEngine/Archiver/Zipnative.php',
			'administrator/components/com_akeeba/BackupEngine/Archiver/zipnative.ini',
			'administrator/components/com_akeeba/BackupEngine/Archiver/zipnative.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/amazons3.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/amazons3.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Amazons3.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/azure.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/azure.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Azure.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/backblaze.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/backblaze.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Backblaze.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/box.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/box.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Box.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/cloudfiles.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/cloudfiles.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Cloudfiles.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/cloudme.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/cloudme.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Cloudme.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/dreamobjects.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/dreamobjects.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Dreamobjects.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/dropbox.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/dropbox.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Dropbox.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/dropbox2.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/dropbox2.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Dropbox2.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/ftp.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/ftp.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Ftp.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/ftpcurl.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/ftpcurl.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Ftpcurl.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/googledrive.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/googledrive.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Googledrive.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/googlestorage.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/googlestorage.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Googlestorage.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/googlestoragejson.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/googlestoragejson.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Googlestoragejson.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/idrivesync.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/idrivesync.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Idrivesync.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/onedrive.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/onedrive.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Onedrive.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/onedrivebusiness.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/onedrivebusiness.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Onedrivebusiness.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/ovh.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/ovh.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Ovh.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/pcloud.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/pcloud.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Pcloud.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/s3.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/s3.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/S3.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/sftp.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/sftp.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Sftp.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/sftpcurl.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/sftpcurl.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Sftpcurl.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/sugarsync.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/sugarsync.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Sugarsync.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/swift.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/swift.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Swift.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/webdav.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/webdav.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Webdav.php',
			'administrator/components/com_akeeba/BackupEngine/Scan/large.ini',
			'administrator/components/com_akeeba/BackupEngine/Scan/large.json',
			'administrator/components/com_akeeba/BackupEngine/Scan/Large.php',

			'administrator/components/com_akeeba/Controller/Alice.php',
			'administrator/components/com_akeeba/Controller/Discover.php',
			'administrator/components/com_akeeba/Controller/IncludeFolders.php',
			'administrator/components/com_akeeba/Controller/MultipleDatabases.php',
			'administrator/components/com_akeeba/Controller/RegExDatabaseFilters.php',
			'administrator/components/com_akeeba/Controller/RegExFileFilters.php',
			'administrator/components/com_akeeba/Controller/RemoteFiles.php',
			'administrator/components/com_akeeba/Controller/Schedule.php',
			'administrator/components/com_akeeba/Controller/S3Import.php',
			'administrator/components/com_akeeba/Controller/Upload.php',

			'administrator/components/com_akeeba/Model/Alice.php',
			'administrator/components/com_akeeba/Model/Discover.php',
			'administrator/components/com_akeeba/Model/IncludeFolders.php',
			'administrator/components/com_akeeba/Model/MultipleDatabases.php',
			'administrator/components/com_akeeba/Model/RegExDatabaseFilters.php',
			'administrator/components/com_akeeba/Model/RegExFileFilters.php',
			'administrator/components/com_akeeba/Model/RemoteFiles.php',
			'administrator/components/com_akeeba/Model/Schedule.php',
			'administrator/components/com_akeeba/Model/S3Import.php',
			'administrator/components/com_akeeba/Model/Upload.php',

			'administrator/components/com_akeeba/BackupPlatform/Joomla3x/Filter/Components.php',
			'administrator/components/com_akeeba/BackupPlatform/Joomla3x/Filter/Extensiondirs.php',
			'administrator/components/com_akeeba/BackupPlatform/Joomla3x/Filter/Extensionfiles.php',
			'administrator/components/com_akeeba/BackupPlatform/Joomla3x/Filter/Languages.php',
			'administrator/components/com_akeeba/BackupPlatform/Joomla3x/Filter/Modules.php',
			'administrator/components/com_akeeba/BackupPlatform/Joomla3x/Filter/Plugins.php',
			'administrator/components/com_akeeba/BackupPlatform/Joomla3x/Filter/Templates.php',

			// Additional ANGIE installers which are not used in Core
			'administrator/components/com_akeeba/Master/Installers/abi.ini',
			'administrator/components/com_akeeba/Master/Installers/abi.jpa',
			'administrator/components/com_akeeba/Master/Installers/angie-generic.ini',
			'administrator/components/com_akeeba/Master/Installers/angie-generic.jpa',

			// PostgreSQL and MS SQL Server support
			'administrator/components/com_akeeba/BackupEngine/Driver/Pgsql.php',
			'administrator/components/com_akeeba/BackupEngine/Driver/Postgresql.php',
			'administrator/components/com_akeeba/BackupEngine/Driver/Sqlazure.php',
			'administrator/components/com_akeeba/BackupEngine/Driver/Sqlsrv.php',

			'administrator/components/com_akeeba/BackupEngine/Driver/Query/Pgsql.php',
			'administrator/components/com_akeeba/BackupEngine/Driver/Query/Postgresql.php',
			'administrator/components/com_akeeba/BackupEngine/Driver/Query/Sqlazure.php',
			'administrator/components/com_akeeba/BackupEngine/Driver/Query/Sqlsrv.php',

			'administrator/components/com_akeeba/BackupEngine/Dump/reverse.json',
			'administrator/components/com_akeeba/BackupEngine/Dump/Reverse.php',
			'administrator/components/com_akeeba/BackupEngine/Dump/Native/Postgresql.php',
			'administrator/components/com_akeeba/BackupEngine/Dump/Native/Sqlsrv.php',

			'administrator/components/com_akeeba/sql/xml/postgresql.xml',
			'administrator/components/com_akeeba/sql/xml/sqlsrv.xml',

			// Version 7
			// -- Integrated restoration
			'administrator/components/com_akeeba/Controller/Restore.php',
			'administrator/components/com_akeeba/Model/Restore.php',
			'administrator/components/com_akeeba/restore.php',
			'media/com_akeeba/js/Restore.min.js',
			'media/com_akeeba/js/Restore.js',

			// -- Site Transfer Wizard
			'administrator/components/com_akeeba/Controller/Transfer.php',
			'administrator/components/com_akeeba/Model/Transfer.php',
			'media/com_akeeba/js/Transfer.min.js',
			'media/com_akeeba/js/Transfer.js',

			// -- other non-Core JS
			'media/com_akeeba/js/IncludeFolders.min.js',
			'media/com_akeeba/js/IncludeFolders.js',
			'media/com_akeeba/js/MultipleDatabases.min.js',
			'media/com_akeeba/js/MultipleDatabases.js',
			'media/com_akeeba/js/RegExDatabaseFilters.min.js',
			'media/com_akeeba/js/RegExDatabaseFilters.js',
			'media/com_akeeba/js/RegExFileFilters.min.js',
			'media/com_akeeba/js/RegExFileFilters.js',
			'media/com_akeeba/js/RegExFileFilters.min.js',
			'media/com_akeeba/js/RegExFileFilters.js',

			// Pro features of the Console plugin
			'administrator/components/com_akeeba/CliCommands/BackupFetch.php',
			'administrator/components/com_akeeba/CliCommands/BackupTake.php',
			'administrator/components/com_akeeba/CliCommands/BackupUpload.php',
			'administrator/components/com_akeeba/CliCommands/FilterIncludeDatabase.php',
			'administrator/components/com_akeeba/CliCommands/FilterIncludeDirectory.php',

			// Version 8
			// -- Older CSS and JS files
			'media/com_akeeba/css/akeebaui.min.css',
			'media/com_akeeba/css/akeebaui.min.css.map',
			'media/com_akeeba/css/dark.min.css',
			'media/com_akeeba/css/dark.min.css.map',
		],
		'folders' => [
			// Pro component features
			'administrator/components/com_akeeba/Alice',

			'administrator/components/com_akeeba/BackupPlatform/Joomla3x/Config/Pro',

			'administrator/components/com_akeeba/View/Alice',
			'administrator/components/com_akeeba/View/Discover',
			'administrator/components/com_akeeba/View/IncludeFolders',
			'administrator/components/com_akeeba/View/MultipleDatabases',
			'administrator/components/com_akeeba/View/RegExDatabaseFilters',
			'administrator/components/com_akeeba/View/RegExFileFilter',
			'administrator/components/com_akeeba/View/RemoteFiles',
			'administrator/components/com_akeeba/View/Schedule',
			'administrator/components/com_akeeba/View/S3Import',
			'administrator/components/com_akeeba/View/Upload',

			'administrator/components/com_akeeba/BackupEngine/Postproc/Connector',

			// PostgreSQL and MS SQL Server support
			'administrator/components/com_akeeba/BackupEngine/Dump/Reverse',

			// Version 7
			// -- Integrated restoration
			'administrator/components/com_akeeba/View/Restore',

			// -- Site Transfer Wizard
			'administrator/components/com_akeeba/View/Transfer',

			// -- JSON API, legacy backup feature, failed backup checks
			'components/com_akeeba/Controller',
			'components/com_akeeba/Model',

			// -- Archive integrity check
			'administrator/components/com_akeeba/BackupPlatform/Joomla3x/Finalization',

		],
	];

	/**
	 * Obsolete files and folders to remove from both paid and free releases. This is used when you refactor code and
	 * some files inevitably become obsolete and need to be removed.
	 *
	 * @var   array
	 */
	protected $removeFilesAllVersions = [
		'files'   => [
			// Outdated CLI scripts
			'cli/akeeba-update.php',

			// Outdated media files
			'media/com_akeeba/icons/akeeba-48.png',
			'media/com_akeeba/icons/akeeba-warning-48.png',
			'media/com_akeeba/icons/arrow_small.png',
			'media/com_akeeba/icons/error_small.png',
			'media/com_akeeba/icons/ok_small.png',
			'media/com_akeeba/icons/reload.png',
			'media/com_akeeba/icons/scheduling-32.png',
			'media/com_akeeba/icons/update.png',

			'media/com_akeeba/js/akeebajq.js',
			'media/com_akeeba/js/akeebajqui.js',
			'media/com_akeeba/js/akeebaui.js',
			'media/com_akeeba/js/akeebauipro.js',
			'media/com_akeeba/js/alice.js',
			'media/com_akeeba/js/backup.js',
			'media/com_akeeba/js/configuration.js',
			'media/com_akeeba/js/confwiz.js',
			'media/com_akeeba/js/dbef.js',
			'media/com_akeeba/js/eff.js',
			'media/com_akeeba/js/encryption.js',
			'media/com_akeeba/js/fsfilter.js',
			'media/com_akeeba/js/gui-helpers.js',
			'media/com_akeeba/js/jquery.js',
			'media/com_akeeba/js/jquery-ui.js',
			'media/com_akeeba/js/multidb.js',
			'media/com_akeeba/js/regexdbfilter.js',
			'media/com_akeeba/js/regexfsfilter.js',
			'media/com_akeeba/js/restore.js',
			'media/com_akeeba/js/stepper.js',
			'media/com_akeeba/js/system.js',
			'media/com_akeeba/js/transfer.js',

			// Old CLI backup scripts, obsolete since 3.5.0, removed in 4.0.0
			'administrator/components/com_akeeba/backup.php',
			'administrator/components/com_akeeba/altbackup.php',

			// Files used in version 4.2, but before 5.0
			// -- Back-end
			'administrator/components/com_akeeba/dispatcher.php',
			'administrator/components/com_akeeba/toolbar.php',

			// -- Front-end
			'components/com_akeeba/dispatcher.php',

			// Integrity check (obsolete)
			'administrator/components/com_akeeba/fileslist.php',

			// Dropbox v1 integration
			'administrator/components/com_akeeba/BackupEngine/Postproc/dropbox.ini',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Dropbox.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Connector/Dropbox.php',

			// Obsolete Azure files
			'administrator/components/com_akeeba/BackupEngine/Postproc/Connector/Azure/Credentials/Sharedsignature.php',

			// Obsolete AES-128 CTR implementation in Javascript
			'media/com_akeeba/js/Encryption.min.js',
			'media/com_akeeba/js/Encryption.min.map',

			// PHP 7.2 compatibility
			'administrator/components/com_akeeba/BackupEngine/Base/Object.php',

			// Obsolete media files
			'media/com_akeeba/icons/akeeba-ui-32.png',
			'media/com_akeeba/changelog.png',

			// Old FOF 3 XML manifest files
			'libraries/fof30/lib_fof30.xml',
			'administrator/manifests/libraries/lib_fof30.xml',

			// Migration of Akeeba Engine to JSON format
			"administrator/components/com_akeeba/BackupEngine/Dump/native.ini",
			"administrator/components/com_akeeba/BackupEngine/Dump/reverse.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/none.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/webdav.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/sugarsync.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/email.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/box.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/dropbox2.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/ovh.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/cloudme.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/idrivesync.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/ftpcurl.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/dreamobjects.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/azure.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/sftp.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/amazons3.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/cloudfiles.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/googlestorage.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/googlestoragejson.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/swift.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/sftpcurl.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/onedrive.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/googledrive.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/backblaze.ini",
			"administrator/components/com_akeeba/BackupEngine/Postproc/ftp.ini",
			"administrator/components/com_akeeba/BackupEngine/Archiver/zipnative.ini",
			"administrator/components/com_akeeba/BackupEngine/Archiver/directftp.ini",
			"administrator/components/com_akeeba/BackupEngine/Archiver/directsftpcurl.ini",
			"administrator/components/com_akeeba/BackupEngine/Archiver/zip.ini",
			"administrator/components/com_akeeba/BackupEngine/Archiver/directftpcurl.ini",
			"administrator/components/com_akeeba/BackupEngine/Archiver/directsftp.ini",
			"administrator/components/com_akeeba/BackupEngine/Archiver/jps.ini",
			"administrator/components/com_akeeba/BackupEngine/Archiver/jpa.ini",
			"administrator/components/com_akeeba/BackupEngine/Scan/smart.ini",
			"administrator/components/com_akeeba/BackupEngine/Scan/large.ini",
			"administrator/components/com_akeeba/BackupEngine/Filter/Stack/dateconditional.ini",
			"administrator/components/com_akeeba/BackupEngine/Filter/Stack/errorlogs.ini",
			"administrator/components/com_akeeba/BackupEngine/Filter/Stack/hoststats.ini",
			"administrator/components/com_akeeba/BackupEngine/Core/04.quota.ini",
			"administrator/components/com_akeeba/BackupEngine/Core/02.advanced.ini",
			"administrator/components/com_akeeba/BackupEngine/Core/01.basic.ini",
			"administrator/components/com_akeeba/BackupEngine/Core/scripting.ini",
			"administrator/components/com_akeeba/BackupEngine/Core/05.tuning.ini",

			"administrator/components/com_akeeba/BackupPlatform/Joomla3x/Config/02.advanced.ini",
			"administrator/components/com_akeeba/BackupPlatform/Joomla3x/Config/Pro/04.quota.ini",
			"administrator/components/com_akeeba/BackupPlatform/Joomla3x/Config/Pro/02.advanced.ini",
			"administrator/components/com_akeeba/BackupPlatform/Joomla3x/Config/Pro/01.basic.ini",
			"administrator/components/com_akeeba/BackupPlatform/Joomla3x/Config/Pro/02.platform.ini",
			"administrator/components/com_akeeba/BackupPlatform/Joomla3x/Config/Pro/03.filters.ini",
			"administrator/components/com_akeeba/BackupPlatform/Joomla3x/Config/Pro/05.tuning.ini",
			"administrator/components/com_akeeba/BackupPlatform/Joomla3x/Filter/Stack/finder.ini",
			"administrator/components/com_akeeba/BackupPlatform/Joomla3x/Filter/Stack/myjoomla.ini",
			"administrator/components/com_akeeba/BackupPlatform/Joomla3x/Filter/Stack/actionlogs.ini",

			// Obsolete eAccelerator warning
			"administrator/components/com_akeeba/View/eaccelerator.php",

			// Engine 7
			'administrator/components/com_akeeba/BackupEngine/Base/BaseObject.php',

			// ALICE refactoring
			'media/com_akeeba/js/Alice.js',
			'media/com_akeeba/js/Alice.min.js',
			'media/com_akeeba/js/Stepper.js',
			'media/com_akeeba/js/Stepper.min.js',

			// Version 7 -- Remove non-RAW encapsulation
			"components/com_akeeba/Model/Json/Encapsulation/AesCbc128.php",
			"components/com_akeeba/Model/Json/Encapsulation/AesCbc256.php",
			"components/com_akeeba/Model/Json/Encapsulation/AesCtr128.php",
			"components/com_akeeba/Model/Json/Encapsulation/AesCtr256.php",

			// Optimize JavaScript support
			"administrator/components/com_akeeba/Helper/JsBundler.php",

			// Obsolete cacert.pem in the Engine
			"administrator/components/com_akeeba/BackupEngine/cacert.pem",

			// Workaround for CloudFlare RocketLoader. No longer needed, our JS is being loaded deferred anyway.
			"administrator/components/com_akeeba/Dispatcher/after_render.php",

			// Moving to FEF 2
			"media/com_akeeba/js/Ajax.min.js",
			"media/com_akeeba/js/Ajax.min.map",
			"media/com_akeeba/js/Modal.min.js",
			"media/com_akeeba/js/Modal.min.map",
			"media/com_akeeba/js/System.min.js",
			"media/com_akeeba/js/System.min.map",
			"media/com_akeeba/js/Tooltip.min.js",
			"media/com_akeeba/js/Tooltip.min.map",

			// Obsolete plugin file
			'plugins/console/akeebabackup.xml',

			// Remove “Archive integrity check” feature
			'administrator/components/com_akeeba/BackupPlatform/Joomla3x/Finalization',

			// Remove PieCon.js
			'media/com_akeeba/js/piecon.min.js',
			'media/com_akeeba/js/piecon.min.map',

			// Remove obsolete common PHP version warnings
			'administrator/components/com_akeeba/tmpl/CommonTemplates/phpversion_warning.php',
			'administrator/components/com_akeeba/tmpl/CommonTemplates/wrongphp.php',

			// Remove pCloud
			'administrator/components/com_akeeba/BackupEngine/Postproc/pcloud.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Pcloud.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Connector/Pcloud.php',

			// Remove iDriveSync — the service has been discontinued
			'administrator/components/com_akeeba/BackupEngine/Postproc/idrivesync.json',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Idrivesync.php',
			'administrator/components/com_akeeba/BackupEngine/Postproc/Connector/Idrivesync.php',

			// Legacy filters
			'administrator/components/com_akeeba/BackupPlatform/Joomla3x/Filter/Stack/myjoomla.json',
			'administrator/components/com_akeeba/BackupPlatform/Joomla3x/Filter/Stack/StackMyjoomla.php',

		],
		'folders' => [
			// Directories used up to version 4.1 (inclusive)
			// -- Back-end
			'administrator/components/com_akeeba/akeeba',
			'administrator/components/com_akeeba/plugins',
			// -- Front-end
			'components/com_akeeba/views',

			// Directories used in version 4.2, but before 5.0
			// -- Back-end
			'administrator/components/com_akeeba/alice',
			'administrator/components/com_akeeba/assets',
			'administrator/components/com_akeeba/controllers',
			'administrator/components/com_akeeba/engine',
			'administrator/components/com_akeeba/helpers',
			'administrator/components/com_akeeba/models',
			'administrator/components/com_akeeba/platform',
			'administrator/components/com_akeeba/tables',
			'administrator/components/com_akeeba/views',
			// -- Front-end
			'components/com_akeeba/controllers',
			'components/com_akeeba/models',

			// Outdated media directories
			'media/com_akeeba/theme',

			// Dropbox v1 integration
			'administrator/components/com_akeeba/BackupEngine/Postproc/Connector/Dropbox',

			// Common tables (they're installed by FOF)
			'administrator/components/com_akeeba/sql/common',

			// ALICE refactoring
			"administrator/components/com_akeeba/AliceEngine",

			// Convert views to Blade
			"administrator/components/com_akeeba/View/Alice/tmpl",
			"administrator/components/com_akeeba/View/Backup/tmpl",
			"administrator/components/com_akeeba/View/Browser/tmpl",
			"administrator/components/com_akeeba/View/CommonTemplates",
			"administrator/components/com_akeeba/View/Configuration/tmpl",
			"administrator/components/com_akeeba/View/ConfigurationWizard/tmpl",
			"administrator/components/com_akeeba/View/ControlPanel/tmpl",
			"administrator/components/com_akeeba/View/DatabaseFilters/tmpl",
			"administrator/components/com_akeeba/View/Discover/tmpl",
			"administrator/components/com_akeeba/View/FileFilters/tmpl",
			"administrator/components/com_akeeba/View/IncludeFolders/tmpl",
			"administrator/components/com_akeeba/View/Log/tmpl",
			"administrator/components/com_akeeba/View/Manage/tmpl",
			"administrator/components/com_akeeba/View/MultipleDatabases/tmpl",
			"administrator/components/com_akeeba/View/Profiles/tmpl",
			"administrator/components/com_akeeba/View/RegExDatabaseFilters/tmpl",
			"administrator/components/com_akeeba/View/RegExFileFilter/tmpl",
			"administrator/components/com_akeeba/View/RemoteFiles/tmpl",
			"administrator/components/com_akeeba/View/Restore/tmpl",
			"administrator/components/com_akeeba/View/S3Import/tmpl",
			"administrator/components/com_akeeba/View/Schedule/tmpl",
			"administrator/components/com_akeeba/View/Transfer/tmpl",
			"administrator/components/com_akeeba/View/Upload/tmpl",

			// Base CLI script -- replaced with FOF
			'administrator/components/com_akeeba/Master/Cli',

			// 7.0.0 alpha base plugin
			'administrator/components/com_akeeba/Master/AkeebaPlugin',

			// Backup on Update view templates
			'plugins/system/backuponupdate/tmpl',

			// Changelog PNG images
			'media/com_akeeba/icons/changelog.png',

			// Rename ViewTemplates to tmpl
			'administrator/components/com_akeeba/ViewTemplates',
		],
	];

	/**
	 * @var string
	 */
	private $currentlyBeingInstalledCustomContainerFile;

	/**
	 * Runs on installation
	 *
	 * @param   JInstallerAdapterComponent  $parent  The parent object
	 *
	 * @return  void
	 */
	public function install($parent)
	{
		if (!defined('AKEEBA_THIS_IS_INSTALLATION_FROM_SCRATCH'))
		{
			define('AKEEBA_THIS_IS_INSTALLATION_FROM_SCRATCH', 1);
		}
	}

	/**
	 * Joomla! pre-flight event. This runs before Joomla! installs or updates the component. This is our last chance to
	 * tell Joomla! if it should abort the installation.
	 *
	 * @param   string                      $type    Installation type (install, update, discover_install)
	 * @param   JInstallerAdapterComponent  $parent  Parent object
	 *
	 * @return  boolean  True to let the installation proceed, false to halt the installation
	 */
	public function preflight(string $type, ComponentAdapter $parent): bool
	{
		if ($type === 'uninstall')
		{
			return true;
		}

		$this->isPaid                                     = is_dir($parent->getParent()->getPath('source') . '/backend/AliceEngine');
		$this->currentlyBeingInstalledCustomContainerFile = $parent->getParent()->getPath('source') . '/backend/Container.php';

		$result = parent::preflight($type, $parent);

		if (!$result)
		{
			return $result;
		}

		// Kill the old custom container file. If the update fails, install a second time and be bloody done with it.
		$customContainerFile = JPATH_ADMINISTRATOR . '/components/com_akeeba/Container.php';
		if (!@unlink($customContainerFile) && @file_exists($customContainerFile))
		{
			\Joomla\CMS\Filesystem\File::delete($customContainerFile);
		}

		// Move the server key file from /akeeba or /engine to /BackupEngine
		$componentPath = JPATH_ADMINISTRATOR . '/components/com_akeeba';
		$fromFile      = $componentPath . '/akeeba/serverkey.php';
		$toFile        = $componentPath . '/BackupEngine/serverkey.php';

		if (!file_exists($fromFile))
		{
			$fromFile = $componentPath . '/engine/serverkey.php';
		}

		if (@file_exists($fromFile) && !@file_exists($toFile))
		{
			$toPath = $componentPath . '/BackupEngine';

			if (@is_dir($componentPath) && !@is_dir($toPath))
			{
				JFolder::create($toPath);
			}

			if (@is_dir($toPath))
			{
				JFile::copy($fromFile, $toFile);
			}
		}

		return $result;
	}

	/**
	 * Runs after install, update or discover_update. In other words, it executes after Joomla! has finished installing
	 * or updating your component. This is the last chance you've got to perform any additional installations, clean-up,
	 * database updates and similar housekeeping functions.
	 *
	 * @param   string                      $type    install, update or discover_update
	 * @param   JInstallerAdapterComponent  $parent  Parent object
	 */
	public function postflight(string $type, ComponentAdapter $parent): void
	{
		if ($type === 'uninstall')
		{
			return;
		}

		// Let's make sure the custom container file is up to date.
		$this->containerBroken = $this->figureOutIfContainerIsBroken();

		// Parent method
		parent::postflight($type, $parent);

		if (!$this->containerBroken)
		{
			// Let's install common tables
			$this->installCommonTables();
		}

		// Add ourselves to the list of extensions depending on Akeeba FEF
		$this->addDependency('file_fef', $this->componentName);

		// Uninstall post-installation messages we are no longer using
		$this->uninstallObsoletePostinstallMessages();

		// Remove the update sites for this component on installation. The update sites are now handled at the package
		// level.
		$this->removeObsoleteUpdateSites($parent);

		// Remove the FOF 2.x update sites (annoying leftovers)
		$this->removeFOFUpdateSites();

		// If this is a new installation tell it to NOT mark the backup profiles as configured.
		if (defined('AKEEBA_THIS_IS_INSTALLATION_FROM_SCRATCH'))
		{
			$this->markProfilesAsNotConfiguredYet();
		}

		// This is an update of an existing installation
		if (!defined('AKEEBA_THIS_IS_INSTALLATION_FROM_SCRATCH') && !$this->containerBroken)
		{
			// Migrate profiles if necessary
			$this->migrateProfiles();
			// Migrate remote quota options
			$this->migrateRemoteQuotaOptions();
		}

		// Replace the system plugin with the actionlog plugin for logging user actions
		$this->switchActionLogPlugins();

		// Upgrade the old, single switch for front-end backups to the new two, separate switches
		if (!$this->containerBroken)
		{
			$this->upgradeFrontendEnableOption();
		}
	}

	/**
	 * Override this method to display a custom component installation message if you so wish
	 *
	 * @param   \JInstallerAdapterComponent  $parent  Parent class calling us
	 */
	protected function renderPostInstallation(ComponentAdapter $parent): void
	{
		try
		{
			$this->warnAboutJSNPowerAdmin();
		}
		catch (Exception $e)
		{
			// Don't sweat if the site's db croaks while I'm checking for 3PD software that causes trouble
		}

		// Load the version file
		if (!defined('AKEEBA_PRO'))
		{
			@include_once JPATH_ADMINISTRATOR . '/components/com_akeeba/version.php';
		}

		if (!defined('AKEEBA_PRO'))
		{
			define('AKEEBA_PRO', '0');
		}

		?>
		<img src="../media/com_akeeba/icons/logo-48.png" width="48" height="48" alt="Akeeba Backup" align="right" />

		<h2>Welcome to Akeeba Backup!</h2>

		<fieldset>
			<p>
				We strongly recommend watching our <a href="http://akee.ba/abfirstvideo">video tutorials</a> before
				using this component.
			</p>

			<p>
				If this is the first time you install Akeeba Backup on your site please run the <a
						href="index.php?option=com_akeeba&view=ConfigurationWizard">Configuration Wizard</a>. Akeeba
				Backup will configure itself optimally for your site.
			</p>

			<p>
				By installing this component you are implicitly accepting <a href="https://www.akeeba.com/license.html">
					its license (GNU GPLv3)</a> and our <a href="https://www.akeeba.com/privacy-policy.html">Terms of
																											 Service</a>,
				including our Support Policy.
			</p>
		</fieldset>
		<?php
		if (!$this->figureOutIfContainerIsBroken())
		{
			$container = null;
			$model     = null;

			if (class_exists('FOF40\\Container\\Container'))
			{
				try
				{
					$container = FOFContainer::getInstance('com_akeeba');
				}
				catch (\Exception $e)
				{
					$container = null;
				}
			}

			if (is_object($container) && class_exists('FOF40\\Container\\Container') && ($container instanceof FOFContainer))
			{
				/** @var \Akeeba\Backup\Admin\Model\UsageStatistics $model */
				try
				{
					$model = $container->factory->model('UsageStatistics')->tmpInstance();
				}
				catch (\Exception $e)
				{
					$model = null;
				}
			}

			/** @var \Akeeba\Backup\Admin\Model\UsageStatistics $model */
			try
			{
				if (is_object($model) && class_exists('Akeeba\\Backup\\Admin\\Model\\UsageStatistics')
					&& ($model instanceof Akeeba\Backup\Admin\Model\UsageStatistics)
					&& method_exists($model, 'collectStatistics'))
				{
					$iframe = $model->collectStatistics(true);

					if ($iframe)
					{
						echo $iframe;
					}
				}
			}
			catch (\Exception $e)
			{
			}
		}
	}

	/**
	 * Override this method to display a custom component uninstallation message if you so wish
	 *
	 * @param   \JInstallerAdapterComponent  $parent  Parent class calling us
	 */
	protected function renderPostUninstallation(ComponentAdapter $parent): void
	{
		?>
		<h2>Akeeba Backup Uninstallation Status</h2>
		<p>We are sorry that you decided to uninstall Akeeba Backup. Please let us know why by using the <a
					href="https://www.akeeba.com/contact-us.html" target="_blank">Contact Us form on our site</a>. We
		   appreciate your feedback; it helps us develop better software!</p>
		<?php
	}

	/**
	 * Removes obsolete update sites created for the component (we are now using an update site for the package, not the
	 * component).
	 *
	 * @param   JInstallerAdapterComponent  $parent  The parent installer
	 */
	protected function removeObsoleteUpdateSites($parent)
	{
		$db = $parent->getParent()->getDbo();

		$query = $db->getQuery(true)
			->select($db->qn('extension_id'))
			->from($db->qn('#__extensions'))
			->where($db->qn('type') . ' = ' . $db->q('component'))
			->where($db->qn('name') . ' = ' . $db->q($this->componentName));

		try
		{
			$extensionId = $db->setQuery($query)->loadResult();
		}
		catch (Exception $e)
		{
			// Your database is broken.
			return;
		}

		if (!$extensionId)
		{
			return;
		}

		$query = $db->getQuery(true)
			->select($db->qn('update_site_id'))
			->from($db->qn('#__update_sites_extensions'))
			->where($db->qn('extension_id') . ' = ' . $db->q($extensionId));

		try
		{
			$ids = $db->setQuery($query)->loadColumn(0);
		}
		catch (Exception $e)
		{
			// Your database is broken.
			return;
		}

		if (!is_array($ids) && empty($ids))
		{
			return;
		}

		foreach ($ids as $id)
		{
			$query = $db->getQuery(true)
				->delete($db->qn('#__update_sites'))
				->where($db->qn('update_site_id') . ' = ' . $db->q($id));
			$db->setQuery($query);

			try
			{
				$db->execute();
			}
			catch (\Exception $e)
			{
				// Do not fail in this case
			}
		}
	}

	protected function installCommonTables(): void
	{
		$container = null;
		$model     = null;

		if (class_exists('FOF40\\Container\\Container'))
		{
			try
			{
				$container = FOFContainer::getInstance('com_akeeba');
			}
			catch (\Exception $e)
			{
				$container = null;
			}
		}

		if (is_object($container) && class_exists('FOF40\\Container\\Container') && ($container instanceof FOFContainer))
		{
			/** @var \Akeeba\Backup\Admin\Model\UsageStatistics $model */
			try
			{
				$model = $container->factory->model('UsageStatistics')->tmpInstance();
			}
			catch (\Exception $e)
			{
				$model = null;
			}
		}
	}

	private function uninstallObsoletePostinstallMessages()
	{
		$db = JFactory::getDbo();

		$obsoleteTitleKeys = [
			// Remove "Upgrade profiles to ANGIE"
			'AKEEBA_POSTSETUP_LBL_ANGIEUPGRADE',
			// Remove "Enable System Restore Points"
			'AKEEBA_POSTSETUP_LBL_SRP',
			'AKEEBA_POSTSETUP_LBL_BACKUPONUPDATE',
			'AKEEBA_POSTSETUP_LBL_CONFWIZ',
			'AKEEBA_POSTSETUP_LBL_ACCEPTLICENSE',
			'AKEEBA_POSTSETUP_LBL_ACCEPTSUPPORT',
			'AKEEBA_POSTSETUP_LBL_ACCEPTBACKUPTEST',
		];

		foreach ($obsoleteTitleKeys as $obsoleteKey)
		{

			// Remove the "Upgrade profiles to ANGIE" post-installation message
			$query = $db->getQuery(true)
				->delete($db->qn('#__postinstall_messages'))
				->where($db->qn('title_key') . ' = ' . $db->q($obsoleteKey));
			try
			{
				$db->setQuery($query)->execute();
			}
			catch (Exception $e)
			{
				// Do nothing
			}
		}
	}

	/**
	 * The PowerAdmin extension makes menu items disappear. People assume it's our fault. JSN PowerAdmin authors don't
	 * own up to their software's issue. I have no choice but to warn our users about the faulty third party software.
	 */
	private function warnAboutJSNPowerAdmin()
	{
		$db = JFactory::getDbo();

		$query         = $db->getQuery(true)
			->select('COUNT(*)')
			->from($db->qn('#__extensions'))
			->where($db->qn('type') . ' = ' . $db->q('component'))
			->where($db->qn('element') . ' = ' . $db->q('com_poweradmin'))
			->where($db->qn('enabled') . ' = ' . $db->q('1'));
		$hasPowerAdmin = $db->setQuery($query)->loadResult();

		if (!$hasPowerAdmin)
		{
			return;
		}

		$query      = $db->getQuery(true)
			->select('manifest_cache')
			->from($db->qn('#__extensions'))
			->where($db->qn('type') . ' = ' . $db->q('component'))
			->where($db->qn('element') . ' = ' . $db->q('com_poweradmin'))
			->where($db->qn('enabled') . ' = ' . $db->q('1'));
		$paramsJson = $db->setQuery($query)->loadResult();

		$className = class_exists('JRegistry') ? 'JRegistry' : '\Joomla\Registry\Registry';

		/** @var \Joomla\Registry\Registry $jsnPAManifest */
		$jsnPAManifest = new $className();
		$jsnPAManifest->loadString($paramsJson, 'JSON');
		$version = $jsnPAManifest->get('version', '0.0.0');

		if (version_compare($version, '2.1.2', 'ge'))
		{
			return;
		}

		echo <<< HTML
<div class="well" style="margin: 2em 0;">
<h1 style="font-size: 32pt; line-height: 120%; color: red; margin-bottom: 1em">WARNING: Menu items for {$this->componentName} might not be displayed on your site.</h1>
<p style="font-size: 18pt; line-height: 150%; margin-bottom: 1.5em">
	We have detected that you are using JSN PowerAdmin on your site. This software ignores Joomla! standards and
	<b>hides</b> the Component menu items to {$this->componentName} in the administrator backend of your site. Unfortunately we
	can't provide support for third party software. Please contact the developers of JSN PowerAdmin for support
	regarding this issue.
</p>
<p style="font-size: 18pt; line-height: 120%; color: green;">
	Tip: You can disable JSN PowerAdmin to see the menu items to Akeeba Backup.
</p>
</div>

HTML;

	}

	/**
	 * Loads the Akeeba Engine if it's not already loaded
	 */
	private function loadAkeebaEngine()
	{
		if (class_exists('\\Akeeba\\Engine\\Platform'))
		{
			return;
		}

		// Load the language files
		$paths = [JPATH_ADMINISTRATOR, JPATH_ROOT];
		$jlang = JFactory::getLanguage();
		$jlang->load('com_akeeba', $paths[0], 'en-GB', true);
		$jlang->load('com_akeeba', $paths[1], 'en-GB', true);
		$jlang->load('com_akeeba' . '.override', $paths[0], 'en-GB', true);
		$jlang->load('com_akeeba' . '.override', $paths[1], 'en-GB', true);

		// Load the version file
		@include_once JPATH_ADMINISTRATOR . '/components/com_akeeba/version.php';

		if (!defined('AKEEBA_PRO'))
		{
			define('AKEEBA_PRO', '0');
		}

		// Enable Akeeba Engine
		if (!defined('AKEEBAENGINE'))
		{
			define('AKEEBAENGINE', 1);
		}

		// Load the engine
		$factoryPath = JPATH_ADMINISTRATOR . '/components/com_akeeba/BackupEngine/Factory.php';
		define('AKEEBAROOT', JPATH_ADMINISTRATOR . '/components/com_akeeba/BackupEngine');

		require_once $factoryPath;

		// Assign the correct platform
		Platform::addPlatform('joomla3x', JPATH_ADMINISTRATOR . '/components/com_akeeba/BackupPlatform/Joomla3x');
	}

	/**
	 * Migrates existing backup profiles. The changes currently made are:
	 * – Change post-processing from "s3" (legacy) to "amazons3" (current version)
	 * – Fix profiles with invalid embedded installer settings
	 *
	 * @return  void
	 */
	private function migrateProfiles()
	{
		$this->loadAkeebaEngine();

		// Get a list of backup profiles
		$db = JFactory::getDbo();

		try
		{
			$query    = $db->getQuery(true)
				->select($db->qn('id'))
				->from($db->qn('#__ak_profiles'));
			$profiles = $db->setQuery($query)->loadColumn();
		}
		catch (Exception $e)
		{
			// Eh, we couldn't load the profiles. Something's broken in the database. It will be fixed when the
			// installation continues but for now we have to just return without doing anything.
			return;
		}

		// Normally this should never happen as we're supposed to have at least profile #1
		if (empty($profiles))
		{
			return;
		}

		// Migrate each profile
		foreach ($profiles as $profile)
		{
			// Initialization
			$dirty = false;

			// Load the profile configuration
			try
			{
				Platform::getInstance()->load_configuration($profile);
				$config = \Akeeba\Engine\Factory::getConfiguration();
			}
			catch (Exception $e)
			{
				// Your database is broken :(
				continue;
			}

			// -- Migrate obsolete "s3" engine to "amazons3"
			$postProcType = $config->get('akeeba.advanced.postproc_engine', '');

			if ($postProcType == 's3')
			{
				$config->setKeyProtection('akeeba.advanced.postproc_engine', false);
				$config->setKeyProtection('engine.postproc.amazons3.signature', false);
				$config->setKeyProtection('engine.postproc.amazons3.accesskey', false);
				$config->setKeyProtection('engine.postproc.amazons3.secretkey', false);
				$config->setKeyProtection('engine.postproc.amazons3.usessl', false);
				$config->setKeyProtection('engine.postproc.amazons3.bucket', false);
				$config->setKeyProtection('engine.postproc.amazons3.directory', false);
				$config->setKeyProtection('engine.postproc.amazons3.rrs', false);
				$config->setKeyProtection('engine.postproc.amazons3.customendpoint', false);
				$config->setKeyProtection('engine.postproc.amazons3.legacy', false);

				$config->set('akeeba.advanced.postproc_engine', 'amazons3');
				$config->set('engine.postproc.amazons3.signature', 's3');
				$config->set('engine.postproc.amazons3.accesskey', $config->get('engine.postproc.s3.accesskey'));
				$config->set('engine.postproc.amazons3.secretkey', $config->get('engine.postproc.s3.secretkey'));
				$config->set('engine.postproc.amazons3.usessl', $config->get('engine.postproc.s3.usessl'));
				$config->set('engine.postproc.amazons3.bucket', $config->get('engine.postproc.s3.bucket'));
				$config->set('engine.postproc.amazons3.directory', $config->get('engine.postproc.s3.directory'));
				$config->set('engine.postproc.amazons3.rrs', $config->get('engine.postproc.s3.rrs'));
				$config->set('engine.postproc.amazons3.customendpoint', $config->get('engine.postproc.s3.customendpoint'));
				$config->set('engine.postproc.amazons3.legacy', $config->get('engine.postproc.s3.legacy'));

				$dirty = true;
			}

			// Fix profiles with invalid embedded installer settings
			$embeddedInstaller = $config->get('akeeba.advanced.embedded_installer');

			if (empty($embeddedInstaller) || ($embeddedInstaller == 'angie-joomla') || (
					(substr($embeddedInstaller, 0, 5) != 'angie') && ($embeddedInstaller != 'none')
				))
			{
				$config->setKeyProtection('akeeba.advanced.embedded_installer', false);
				$config->set('akeeba.advanced.embedded_installer', 'angie');
				$dirty = true;
			}

			// Save dirty records
			if ($dirty)
			{
				try
				{
					Platform::getInstance()->save_configuration($profile);
				}
				catch (Exception $e)
				{
					// Your database is broken!
					continue;
				}
			}
		}
	}

	/**
	 * Remove FOF 2.x update sites
	 */
	private function removeFOFUpdateSites()
	{
		$db    = JFactory::getDbo();
		$query = $db->getQuery(true)
			->delete($db->qn('#__update_sites'))
			->where($db->qn('location') . ' = ' . $db->q('http://cdn.akeeba.com/updates/fof.xml'));
		try
		{
			$db->setQuery($query)->execute();
		}
		catch (\Exception $e)
		{
			// Do nothing on failure
		}

	}

	private function markProfilesAsNotConfiguredYet()
	{
		try
		{
			$db    = JFactory::getDbo();
			$query = $db->getQuery(true)
				->select($db->qn('params'))
				->from($db->qn('#__extensions'))
				->where($db->qn('type') . ' = ' . $db->q('component'))
				->where($db->qn('element') . ' = ' . $db->q('com_akeeba'));

			$jsonData = $db->setQuery($query)->loadResult();

			if (class_exists('JRegistry'))
			{
				$reg = new JRegistry($jsonData);
			}
			else
			{
				$reg = new \Joomla\Registry\Registry($jsonData);
			}

			$reg->set('confwiz_upgrade', 1);
			$jsonData = $reg->toString('JSON');

			$query = $db->getQuery()
				->update($db->qn('#__extensions'))
				->set($db->qn('params') . ' = ' . $db->q($jsonData))
				->where($db->qn('type') . ' = ' . $db->q('component'))
				->where($db->qn('element') . ' = ' . $db->q('com_akeeba'));
			$db->setQuery($query)->execute();
		}
		catch (Exception $e)
		{
			// If that fails it's not the end of the world. The component is still usable, so just swallow any
			// exception.
		}
	}

	private function switchActionLogPlugins()
	{
		$db = \Joomla\CMS\Factory::getDbo();

		// Does the plg_system_akeebaactionlog plugin exist? If not, there's nothing to do here.
		$query = $db->getQuery(true)
			->select('*')
			->from('#__extensions')
			->where($db->qn('type') . ' = ' . $db->q('plugin'))
			->where($db->qn('folder') . ' = ' . $db->q('system'))
			->where($db->qn('element') . ' = ' . $db->q('akeebaactionlog'));
		try
		{
			$result = $db->setQuery($query)->loadAssoc();

			if (empty($result))
			{
				return;
			}

			$eid = $result['extension_id'];
		}
		catch (Exception $e)
		{
			return;
		}

		// If plg_system_akeebaactionlog is enabled: enable plg_actionlog_akeebabackup
		if (\Joomla\CMS\Plugin\PluginHelper::isEnabled('system', 'akeebaactionlog'))
		{
			$query = $db->getQuery(true)
				->update($db->qn('#__extensions'))
				->set($db->qn('enabled') . ' = ' . $db->q(1))
				->where($db->qn('type') . ' = ' . $db->q('plugin'))
				->where($db->qn('folder') . ' = ' . $db->q('actionlog'))
				->where($db->qn('element') . ' = ' . $db->q('akeebabackup'));
			try
			{
				$db->setQuery($query)->execute();
			}
			catch (Exception $e)
			{
			}
		}

		// Deactivate plg_system_akeebaactionlog
		$query = $db->getQuery(true)
			->update($db->qn('#__extensions'))
			->set($db->qn('enabled') . ' = ' . $db->q(0))
			->where($db->qn('type') . ' = ' . $db->q('plugin'))
			->where($db->qn('folder') . ' = ' . $db->q('system'))
			->where($db->qn('element') . ' = ' . $db->q('akeebaactionlog'));
		try
		{
			$db->setQuery($query)->execute();
		}
		catch (Exception $e)
		{
		}

		/**
		 * Here's a bummer. If you try to uninstall the plg_system_akeebaactionlog plugin Joomla throws a nonsensical
		 * error message about the plugin's XML manifest missing -- after it has already uninstalled the plugin! This
		 * error causes the package installation to fail which results in the extension being installed BUT the database
		 * record of the package NOT being present which makes it impossible to uninstall.
		 *
		 * So I have to hack my way around it which is ugly but the only viable alternative :(
		 */
		try
		{
			// Safely delete the row in the extensions table
			$row = JTable::getInstance('extension');
			$row->load((int) $eid);
			$row->delete($eid);

			// Delete the plugin's files
			$pluginPath = JPATH_PLUGINS . '/system/akeebaactionlog';

			if (is_dir($pluginPath))
			{
				JFolder::delete($pluginPath);
			}

			// Delete the plugin's language files
			$langFiles = [
				JPATH_ADMINISTRATOR . '/language/en-GB/en-GB.plg_system_akeebaactionlog.ini',
				JPATH_ADMINISTRATOR . '/language/en-GB/en-GB.plg_system_akeebaactionlog.sys.ini',
			];

			foreach ($langFiles as $file)
			{
				if (@is_file($file))
				{
					JFile::delete($file);
				}
			}
		}
		catch (Exception $e)
		{
			// I tried, I failed. Dear user, do NOT try to enable that old plugin. Bye!
		}
	}

	/**
	 * Upgrades the frontend_enable option to the two separate legacyapi_enabled and jsonapi_enabled options.
	 *
	 * Akeeba Backup 5 and 6 had a single component option, 'frontend_enable', to control both the Legacy Front-end
	 * Backup Feature. Since Akeeba Backup 7.0.0.b1 we have two separate options, legacyapi_enabled and jsonapi_enabled.
	 * This method detects the old-style component option and upgrades it to the two separate ones.
	 *
	 * @return  void
	 * @since   7.0.0.b1
	 */
	private function upgradeFrontendEnableOption()
	{
		$container = FOFContainer::getInstance('com_akeeba');
		$container->params->reload();
		$oldValue = $container->params->get('frontend_enable', -1);

		if (!in_array($oldValue, [0, 1]))
		{
			return;
		}

		$container->params->set('legacyapi_enabled', $oldValue);
		$container->params->set('jsonapi_enabled', $oldValue);
		$container->params->set('frontend_enable', -1);

		$container->params->save();
	}

	/**
	 * Figure out if there is a custom container class which is not the correct FOF version.
	 *
	 * @return  bool
	 */
	private function figureOutIfContainerIsBroken()
	{
		// FOF 4 is not loaded. Everything is broken. HOW THE HECK AM I EVEN RUNNING?!
		if (!class_exists('FOF40\\Container\\Container'))
		{
			return true;
		}

		// This is the custom container file that gives us grief on update
		$originalContainerFile = JPATH_ADMINISTRATOR . '/components/com_akeeba/Container.php';
		$customContainerFile = JPATH_ADMINISTRATOR . '/components/com_akeeba/Container.php';

		// Do I have this in the installation package's temporary extracted directory?
		if (
			!empty($this->currentlyBeingInstalledCustomContainerFile) &&
			@file_exists($this->currentlyBeingInstalledCustomContainerFile) &&
			!@is_file($this->currentlyBeingInstalledCustomContainerFile)
		)
		{
			$customContainerFile = $this->currentlyBeingInstalledCustomContainerFile;
		}

		/**
		 * Let's invalidate the opcache for the custom container file. We need to do that before checking if the file
		 * exists since opcache may also be caching whether the file exists and we can't rely on ini_get to find that
		 * out since some servers disable it.
		 */
		if (function_exists('opcache_invalidate'))
		{
			/** @noinspection PhpComposerExtensionStubsInspection */
			opcache_invalidate($originalContainerFile, true);
			/** @noinspection PhpComposerExtensionStubsInspection */
			opcache_invalidate($customContainerFile, true);
		}

		// Clear the stat cache just in case
		@clearstatcache(true);

		// Does the file exist?
		if (!@file_exists($customContainerFile))
		{
			// The file is not there so it can't be broken (duh!)
			return false;
		}

		// Now let's try to load it if the same class doesn't already exist.
		if (!class_exists('Akeeba\Backup\Admin\Container', false))
		{
			@include_once $customContainerFile;
		}

		// Did it really load?
		if (!class_exists('Akeeba\Backup\Admin\Container'))
		{
			// No? OK, what doesn't exist can't be broken.
			return false;
		}

		return !is_subclass_of('Akeeba\Backup\Admin\Container', FOFContainer::class);
	}

	/**
	 * Migrate profiles' quota options after local and remote quotas were split to separate options.
	 *
	 * @return  void
	 * @since   8.4.0
	 */
	private function migrateRemoteQuotaOptions()
	{
		// Get a list of backup profiles
		$db = JFactory::getDbo();

		try
		{
			$query    = $db->getQuery(true)
				->select($db->qn('id'))
				->from($db->qn('#__ak_profiles'));
			$profileIds = $db->setQuery($query)->loadColumn();
		}
		catch (Exception $e)
		{
			// Eh, we couldn't load the profiles. Something's broken in the database. It will be fixed when the
			// installation continues but for now we have to just return without doing anything.
			return;
		}

		// Normally this should never happen as we're supposed to have at least profile #1
		if (empty($profileIds))
		{
			return;
		}

		$this->loadAkeebaEngine();

		$platform       = Platform::getInstance();
		$currentProfile = $platform->get_active_profile();

		foreach ($profileIds as $profile)
		{
			// Load the profile configuration
			try
			{
				$platform->load_configuration($profile);
				$config = Factory::getConfiguration();
			}
			catch (\Throwable $e)
			{
				// Your database is broken :(
				continue;
			}

			if ($config->get('akeeba.quota.remote', 0) != 1)
			{
				continue;
			}

			// Transcribe the local quota to remote quota settings if the legacy "Enable remote quotas" option is on.
			$protected = $config->getProtectedKeys();
			$config->setProtectedKeys([]);

			$config->set('akeeba.quota.remote', null);
			$config->set('akeeba.quota.remotely.maxage.enable', $config->get('akeeba.quota.maxage.enable', 0));
			$config->set('akeeba.quota.remotely.maxage.maxdays', $config->get('akeeba.quota.maxage.maxdays', 31));
			$config->set('akeeba.quota.remotely.maxage.keepday', $config->get('akeeba.quota.maxage.keepday', 1));
			$config->set('akeeba.quota.remotely.enable_size_quota', $config->get('akeeba.quota.enable_size_quota', 0));
			$config->set('akeeba.quota.remotely.size_quota', $config->get('akeeba.quota.size_quota', 15728640));
			$config->set('akeeba.quota.remotely.enable_count_quota', $config->get('akeeba.quota.enable_count_quota', 1));
			$config->set('akeeba.quota.remotely.count_quota', $config->get('akeeba.quota.count_quota', 3));

			$config->setProtectedKeys($protected);

			// Save the changes
			try
			{
				$platform->save_configuration($profile);
			}
			catch (\Throwable $e)
			{
				// Your database is broken!
				continue;
			}
		}

		$platform->load_configuration($currentProfile);
	}

}
components/com_akeeba/fields/web.config000060400000001025152453623440014213 0ustar00<?xml version="1.0"?>
<!--
    This only works on IIS 7 or later. See https://www.iis.net/configreference/system.webserver/security/requestfiltering/fileextensions
-->
<configuration>
    <system.webServer>
        <security>
            <requestFiltering>
                <fileExtensions allowUnlisted="false" >
                    <clear />
                    <add fileExtension=".html" allowed="true"/>
                </fileExtensions>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>components/com_akeeba/fields/urlencoded.php000060400000000761152453623440015112 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') || die();

use Joomla\CMS\Form\FormHelper;

if (class_exists('JFormFieldUrlencoded'))
{
	return;
}

FormHelper::loadFieldClass('text');

class JFormFieldUrlencoded extends JFormFieldText
{
	protected function getInput()
	{
		$this->value = urlencode($this->value);

		return parent::getInput();
	}
}
components/com_akeeba/fields/.htaccess000060400000000246152453623440014051 0ustar00<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
  <RequireAll>
    Require all denied
  </RequireAll>
</IfModule>
components/com_akeeba/fields/fancyradio.php000060400000000423152453623440015100 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') || die();

require_once JPATH_LIBRARIES . '/fof40/Html/Fields/fancyradio.php';components/com_akeeba/fields/oauth2url.php000060400000002655152453623440014717 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') || die();

use Joomla\CMS\Form\FormHelper;

if (class_exists('JFormFieldNote'))
{
	return;
}

FormHelper::loadFieldClass('note');

class JFormFieldOauth2url extends JFormFieldNote
{
	protected function getLabel()
	{
		return '';
	}

	protected function getInput()
	{
		$engine = $this->element['engine'] ?? 'example';
		$uri = rtrim(\JUri::base() ,'/');

		if (substr($uri, -14) === '/administrator')
		{
			$uri = substr($uri, 0, -14);
		}

		$text1 = JText::_('COM_AKEEBA_CONFIG_OAUTH2URLFIELD_YOU_WILL_NEED');
		$text2 = JText::_('COM_AKEEBA_CONFIG_OAUTH2URLFIELD_CALLBACK_URL');
		$text3 = JText::_('COM_AKEEBA_CONFIG_OAUTH2URLFIELD_HELPER_URL');
		$text4 = JText::_('COM_AKEEBA_CONFIG_OAUTH2URLFIELD_REFRESH_URL');

		return <<< HTML
<div class="alert alert-info mx-2 my-2">
	<p>
		$text1
	</p>
	<p>
		<strong>$text2</strong>:
		<br/>
		<code>$uri/index.php?option=com_akeeba&view=oauth2&task=step2&format=raw&engine={$engine}</code>
	</p>
	<p>
		<strong>$text3</strong>:
		<br/>
		<code>$uri/index.php?option=com_akeeba&view=oauth2&task=step1&format=raw&engine={$engine}</code>
	</p>
	<p>
		<strong>$text4</strong>:
		<br/>
		<code>$uri/index.php?option=com_akeeba&view=oauth2&task=refresh&format=raw&engine={$engine}</code>
	</p>
</div>
HTML;

	}
}
components/com_akeeba/fields/backupprofiles.php000060400000003075152453623440016000 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') || die();

use Joomla\CMS\Form\FormField;
use Joomla\CMS\HTML\HTMLHelper;

if (class_exists('JFormFieldBackupprofiles'))
{
	return;
}

/**
 * Our main element class, creating a multi-select list out of an SQL statement
 */
class JFormFieldBackupprofiles extends FormField
{
	/**
	 * Element name
	 *
	 * @var        string
	 */
	protected $name = 'Backupprofiles';

	function getInput()
	{
		$db = \Joomla\CMS\Factory::getDBO();

		$query = $db->getQuery(true)
			->select([
				$db->qn('id'),
				$db->qn('description'),
			])->from($db->qn('#__ak_profiles'));
		$db->setQuery($query);
		$key = 'id';
		$val = 'description';

		$objectList = $db->loadObjectList();

		if (!is_array($objectList))
		{
			$objectList = [];
		}

		foreach ($objectList as $o)
		{
			$o->description = "#{$o->id}: {$o->description}";
		}

		$showNone = $this->element['show_none'] ? (string) $this->element['show_none'] : '';
		$showNone = in_array(strtolower($showNone), ['yes', '1', 'true', 'on']);

		if ($showNone)
		{
			$defaultItem = (object) [
				'id'          => '0',
				'description' => \Joomla\CMS\Language\Text::_('COM_AKEEBA_FORMFIELD_BACKUPPROFILES_NONE'),
			];

			array_unshift($objectList, $defaultItem);
		}

		HTMLHelper::_('formbehavior.chosen');

		return HTMLHelper::_('select.genericlist', $objectList, $this->name, 'class="inputbox advancedSelect"', $key, $val, $this->value, $this->id);
	}
}
components/com_akeeba/fields/akencrypted.php000060400000002403152453623440015272 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') || die();

use Joomla\CMS\Form\FormHelper;

if (class_exists('JFormFieldUrlencoded'))
{
	return;
}

FormHelper::loadFieldClass('text');

class JFormFieldAkencrypted extends JFormFieldText
{
	protected function getInput()
	{
		$this->value = $this->conditionalDecrypt($this->value);

		return parent::getInput();
	}

	private function conditionalDecrypt($value)
	{
		// If the Factory is not already loaded we have to load the
		if (!class_exists('Akeeba\Engine\Factory'))
		{
			if (!defined('FOF40_INCLUDED') && !@include_once(JPATH_LIBRARIES . '/fof40/include.php'))
			{
				return $value;
			}

			$container = \FOF40\Container\Container::getInstance('com_akeeba', [], 'admin');

			/** @var \Akeeba\Backup\Admin\Dispatcher\Dispatcher $dispatcher */
			$dispatcher = $container->dispatcher;

			try
			{
				$dispatcher->loadAkeebaEngine();
				$dispatcher->loadAkeebaEngineConfiguration();
			}
			catch (Exception $e)
			{
				return $value;
			}
		}

		$secureSettings = \Akeeba\Engine\Factory::getSecureSettings();

		return $secureSettings->decryptSettings($this->value);
	}
}
components/com_akeeba/Container.php000060400000000641152453623440013437 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin;

defined('_JEXEC') || die;

use FOF40\Container\Container as TheFOF4BaseContainer;

/**
 * Akeeba Backup backend component Container
 *
 * @since  7.1.0
 */
class Container extends TheFOF4BaseContainer
{

}
components/com_akeeba/views/Configuration/tmpl/default.xml000064400000000575152453623440020104 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->
<metadata>
	<layout title="COM_AKEEBA_VIEW_CONFIGURATION_TITLE">
		<message>
			<![CDATA[COM_AKEEBA_VIEW_CONFIGURATION_DESC]]>
		</message>
	</layout>
</metadata>
components/com_akeeba/views/ControlPanel/tmpl/default.xml000064400000000557152453623440017675 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->
<metadata>
	<layout title="COM_AKEEBA_VIEW_CPANEL_TITLE">
		<message>
			<![CDATA[COM_AKEEBA_VIEW_CPANEL_DESC]]>
		</message>
	</layout>
</metadata>
components/com_akeeba/views/Manage/tmpl/default.xml000064400000000557152453623440016465 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->
<metadata>
	<layout title="COM_AKEEBA_VIEW_MANAGE_TITLE">
		<message>
			<![CDATA[COM_AKEEBA_VIEW_MANAGE_DESC]]>
		</message>
	</layout>
</metadata>
components/com_akeeba/views/Backup/tmpl/default.xml000064400000002724152453623440016500 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->
<metadata>
	<layout title="COM_AKEEBA_VIEW_BACKUP_TITLE">
		<message>
			<![CDATA[COM_AKEEBA_VIEW_BACKUP_DESC]]>
		</message>
	</layout>
	<fields name="request" addfieldpath="administrator/components/com_akeeba/fields">
		<fieldset name="request">
			<field name="profileid" type="backupprofiles"
				   show_none="yes"
				   default="0"
				   label="COM_AKEEBA_VIEW_BACKUP_PROFILE_LABEL"
				   description="COM_AKEEBA_VIEW_BACKUP_PROFILE_DESC"
			/>

			<field name="autostart" type="fancyradio"
				   default="0"
				   class="btn-group"
				   label="COM_AKEEBA_VIEW_BACKUP_AUTOSTART_LABEL"
				   description="COM_AKEEBA_VIEW_BACKUP_AUTOSTART_DESC"
			>
				<option value="0">JNo</option>
				<option value="1">JYes</option>
			</field>

			<field name="akeeba_hide_toolbar" type="fancyradio"
				   default="0"
				   class="btn-group"
				   label="COM_AKEEBA_VIEW_BACKUP_HIDETOOLBAR_LABEL"
				   description="COM_AKEEBA_VIEW_BACKUP_HIDETOOLBAR_DESC"
			>
				<option value="0">JNo</option>
				<option value="1">JYes</option>
			</field>

			<field name="returnurl" type="urlencoded"
				   default=""
				   label="COM_AKEEBA_VIEW_BACKUP_RETURNURL_LABEL"
				   description="COM_AKEEBA_VIEW_BACKUP_RETURNURL_DESC"
				   />
		</fieldset>
	</fields>
</metadata>
components/com_akeeba/CliCommands/ProfileCopy.php000060400000010001152453623440016130 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Backup\Admin\Model\Profiles;
use Exception;
use FOF40\Container\Container;
use FOF40\Model\DataModel\Exception\RecordNotLoaded;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Akeeba\Backup\Admin\CliCommands\MixIt\PrintFormattedArray;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:profile:copy
 *
 * Creates a copy of an Akeeba Backup profile
 *
 * @since   7.5.0
 */
class ProfileCopy extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities, PrintFormattedArray;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:profile:copy';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$format      = (string) $this->cliInput->getOption('format') ?? 'text';
		$format      = in_array($format, ['text', 'json']) ? $format : 'text';
		$id          = (int) $this->cliInput->getArgument('id') ?? 0;
		$withFilters = (bool) $this->cliInput->getArgument('filters') ?? false;

		$container = Container::getInstance('com_akeeba');

		/** @var Profiles $model */
		$model = $container->factory->model('Profiles')->tmpInstance();

		try
		{
			$source = $model->findOrFail($id);
		}
		catch (RecordNotLoaded $e)
		{
			$this->ioStyle->error(sprintf("Cannot copy profile %s; profile not found.", $id));

			return 1;
		}

		$profileData = $source->getData();
		unset($profileData['id']);

		if (!$withFilters)
		{
			$profileData['filters'] = '';
		}

		$description = (string) $this->cliInput->getArgument('description') ?? 0;

		if (!is_null($description))
		{
			$profileData['description'] = trim($description);
		}

		$profileData['quickicon'] = (bool) $this->cliInput->getArgument('quickicon') ?? $profileData['quickicon'];

		try
		{
			$newProfile = $model->create($profileData);
		}
		catch (Exception $e)
		{
			$this->ioStyle->error(sprintf("Cannot copy profile #%s: %s", $id, $e->getMessage()));

			return 2;
		}

		if ($format == 'json')
		{
			echo json_encode($newProfile->getId());

			return 0;
		}

		$this->ioStyle->success(sprintf("Copy successful. Created new profile with ID %s.", $newProfile->getId()));

		return 0;
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will create a copy of an Akeeba Backup profile.
		\nUsage: <info>php %command.full_name%</info>";

		$this->addArgument('id', InputOption::VALUE_REQUIRED, 'The numeric ID of the profile to copy');
		$this->addOption('filters', null, InputOption::VALUE_NONE, 'Include filters in the copy.', false);
		$this->addOption('description', null, InputOption::VALUE_OPTIONAL, 'Description for the new backup profile. Uses the old profile\'s description if not specified.', null);
		$this->addOption('quickicon', null, InputOption::VALUE_OPTIONAL, 'Should the new backup profile have a one-click backup icon? Copies the old profile\'s setting if not specified.', null);
		$this->addOption('format', null, InputOption::VALUE_OPTIONAL, 'The format for the response. Use JSON to get a JSON-parseable numeric ID of the new backup profile. Values: text, json', 'text');

		$this->setDescription('Creates a copy of an Akeeba Backup profile');
		$this->setHelp($help);
	}
}
components/com_akeeba/CliCommands/FilterList.php000060400000015154152453623440015774 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Backup\Admin\Model\DatabaseFilters;
use Akeeba\Backup\Admin\Model\FileFilters;
use Akeeba\Backup\Admin\Model\IncludeFolders;
use Akeeba\Backup\Admin\Model\MultipleDatabases;
use Akeeba\Backup\Admin\Model\RegExDatabaseFilters;
use Akeeba\Backup\Admin\Model\RegExFileFilters;
use FOF40\Container\Container;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Akeeba\Backup\Admin\CliCommands\MixIt\FilterRoots;
use Akeeba\Backup\Admin\CliCommands\MixIt\IsPro;
use Akeeba\Backup\Admin\CliCommands\MixIt\PrintFormattedArray;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:filter:list
 *
 * Get the filter values known to Akeeba Backup.
 *
 * @since   7.5.0
 */
class FilterList extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities, PrintFormattedArray, IsPro, FilterRoots;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:filter:list';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$profileId = (int) ($this->cliInput->getOption('profile') ?? 1);

		define('AKEEBA_PROFILE', $profileId);

		$root   = (string) ($this->cliInput->getOption('root') ?? '');
		$target = (string) ($this->cliInput->getOption('target') ?? 'fs');
		$type   = (string) ($this->cliInput->getOption('type') ?? 'exclude');
		$format = (string) ($this->cliInput->getOption('format') ?? 'table');

		if (!in_array($target, ['fs', 'db']))
		{
			$target = 'fs';
		}

		if (!in_array($type, ['include', 'exclude', 'regex']))
		{
			$type = 'exclude';
		}

		if (!$this->isPro())
		{
			$type = 'exclude';
		}

		$roots = $this->getRoots($target);

		if (empty($root))
		{
			$root = ($target == 'fs') ? '[SITEROOT]' : '[SITEDB]';
		}

		$output = [];

		if (!in_array($root, $roots))
		{
			$this->ioStyle->error(sprintf("Unknown %s root '%s'.", $target, $root));

			return 1;
		}


		if ($format === 'table')
		{
			$this->ioStyle->title('List of Akeeba Backup filters matching your criteria');
		}

		$container = Container::getInstance('com_akeeba', [], 'admin');

		switch ("$target.$type")
		{
			case "fs.exclude":
				/** @var FileFilters $model */
				$model      = $container->factory->model('FileFilters')->tmpInstance();
				$allFilters = $model->get_filters($root);

				foreach ($allFilters as $item)
				{
					$output[] = [
						'filter' => $item['node'],
						'type'   => $item['type'],
					];
				}

				break;

			case "fs.regex":
				/** @var RegExFileFilters $model */
				$model      = $container->factory->model('RegExFileFilters')->tmpInstance();
				$allFilters = $model->get_regex_filters($root);

				foreach ($allFilters as $item)
				{
					$output[] = [
						'filter' => $item['item'],
						'type'   => $item['type'],
					];
				}

				break;

			case "fs.include":
				/** @var IncludeFolders $model */
				$model      = $container->factory->model('IncludeFolders')->tmpInstance();
				$allFilters = $model->get_directories();

				foreach ($allFilters as $uuid => $item)
				{
					$output[] = [
						'filter'               => $uuid,
						'type'                 => 'extradirs',
						'filesystem_directory' => $item[0],
						'virtual_directory'    => $item[1],
					];
				}

				break;

			case "db.exclude":
				/** @var DatabaseFilters $model */
				$model      = $container->factory->model('DatabaseFilters')->tmpInstance();
				$allFilters = $model->get_filters($root);

				foreach ($allFilters as $item)
				{
					$output[] = [
						'filter' => $item['node'],
						'type'   => $item['type'],
					];
				}

				break;

			case "db.regex":
				/** @var RegExDatabaseFilters $model */
				$model      = $container->factory->model('RegExDatabaseFilters')->tmpInstance();
				$allFilters = $model->get_regex_filters($root);

				foreach ($allFilters as $item)
				{
					$output[] = [
						'filter' => $item['item'],
						'type'   => $item['type'],
					];
				}

				break;

			case "db.include":
				/** @var MultipleDatabases $model */
				$model      = $container->factory->model('MultipleDatabases')->tmpInstance();
				$allFilters = $model->get_databases();

				foreach ($allFilters as $uuid => $item)
				{
					$output[] = [
						'filter'   => $uuid,
						'type'     => 'multidb',
						'host'     => $item['host'],
						'driver'   => $item['driver'],
						'port'     => $item['port'],
						'username' => $item['username'],
						'password' => $item['password'],
						'database' => $item['database'],
						'prefix'   => $item['prefix'],
						'dumpFile' => $item['dumpFile'],
					];
				}

				break;
		}

		return $this->printFormattedAndReturn($output, $format);
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will list filter values for an Akeeba Backup profile.
		\nUsage: <info>php %command.full_name%</info>";


		$this->addOption('root', null, InputOption::VALUE_OPTIONAL, 'Which filter root to use. Defaults to [SITEROOT] or [SITEDB] depending on the --target option. Ignored for --type=include. Tip: the filesystem and database roots are the "filter" column for --type=include. There are two special roots, [SITEROOT] (the filesystem root of the Joomla site) and [SITEDB] (the main database of the Joomla site).', '');
		$this->addOption('profile', null, InputOption::VALUE_OPTIONAL, 'The backup profile to use. Default: 1.', 1);
		$this->addOption('target', null, InputOption::VALUE_OPTIONAL, 'The target of filters you want to list: fs (files and folders) or db (database)', 'fs');
		$this->addOption('type', null, InputOption::VALUE_OPTIONAL, 'The type of filters you want to list: exclude, include or regex', 'exclude');
		$this->addOption('format', null, InputOption::VALUE_OPTIONAL, 'Output format: table, json, yaml, csv, count.', 'table');

		$this->setDescription('Get the filter values known to Akeeba Backup.');
		$this->setHelp($help);
	}
}
components/com_akeeba/CliCommands/BackupDownload.php000060400000012564152453623440016612 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Backup\Admin\Model\Statistics;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use FOF40\Container\Container;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:backup:download
 *
 * Returns a backup archive part for a backup record known to Akeeba Backup
 *
 * @since   7.5.0
 */
class BackupDownload extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:backup:download';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$container = Container::getInstance('com_akeeba', [], 'admin');

		$id      = (int) $this->cliInput->getArgument('id') ?? 0;
		$part    = (int) $this->cliInput->getArgument('part') ?? 0;
		$outFile = $this->cliInput->getOption('file');

		if (!empty($outFile))
		{
			$this->ioStyle->title(sprintf('Retrieving part #%d of Akeeba Backup record #%d', $part, $id));
		}

		if ($id <= 0)
		{
			$this->ioStyle->error('Invalid backup record');

			return 1;
		}


		/** @var Statistics $model */
		$model = $container->factory->model('Statistics')->tmpInstance();
		$model->setState('id', $id);

		$stat         = Platform::getInstance()->get_statistics($id);
		$allFileNames = Factory::getStatistics()->get_all_filenames($stat);

		if (empty($allFileNames))
		{
			$this->ioStyle->error(sprintf("Backup record '%s' does not have any files available for download. Have you already deleted them?", $id));

			return 1;
		}

		if (is_null($allFileNames))
		{
			$this->ioStyle->error(sprintf("Backup record '%s' does not have any files available for download on the server. If they are stored remotely you may need to use the fetch command first.", $id));

			return 2;
		}

		if (($part >= (is_array($allFileNames) || $allFileNames instanceof \Countable ? count($allFileNames) : 0)) || !isset($allFileNames[$part]))
		{
			$this->ioStyle->error(sprintf("There is no part '%s' of backup record '%s'.", $part, $id));

			return 3;
		}

		$fileName = $allFileNames[$part];

		if (!@file_exists($fileName))
		{
			$this->ioStyle->error(sprintf("Can not find part '%s' of backup record '%s' on the server.", $part, $id));

			return 4;
		}

		$basename  = @basename($fileName);
		$fileSize  = @filesize($fileName);
		$extension = strtolower(str_replace(".", "", strrchr($fileName, ".")));

		if (empty($outFile))
		{
			readfile($fileName);

			return 0;
		}

		if (is_dir($outFile))
		{
			$outFile = rtrim($outFile, '//\\') . DIRECTORY_SEPARATOR . $basename;
		}
		else
		{
			$dotPos  = strrpos($outFile, '.');
			$outFile = ($dotPos === false) ? $outFile : (substr($outFile, 0, $dotPos) . '.' . $extension);
		}

		// Read in 1M chunks
		$blocksize = 1048576;
		$handle    = @fopen($fileName, "r");

		if ($handle === false)
		{
			$this->ioStyle->error(sprintf("Cannot open '%s' for reading. Check the permissions / ACLs of the file.", $fileName));

			return 5;
		}

		$fp = @fopen($outFile, 'w');

		if ($fp === false)
		{
			fclose($handle);

			$this->ioStyle->error(sprintf("Cannot open '%s' for writing. Check whether the folder exists and the permissions / ACLs of both the enclosing folder and the file.", $outFile));

			return 6;
		}

		$progress    = $this->ioStyle->createProgressBar($fileSize);
		$runningSize = 0;
		$progress->display();

		while (!@feof($handle))
		{
			$data        = @fread($handle, $blocksize);
			$readLength  = strlen($data);
			$runningSize += $readLength;

			fwrite($fp, $data);

			$progress->setProgress($readLength);
		}

		$progress->finish();

		$this->ioStyle->newLine(2);

		@fclose($handle);
		@fclose($fp);

		$this->ioStyle->success(sprintf('Downloaded part %d of backup record #%d into file %s', $part, $id, $outFile));

		return 0;
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will output or write a file with a backup archive part of a backup record known to Akeeba Backup
		\nUsage: <info>php %command.full_name%</info>";

		$this->addArgument('id', InputArgument::REQUIRED, 'The id of the backup record to retrieve archives for');
		$this->addArgument('part', InputArgument::OPTIONAL, 'The part number of the backup archive to retrieve');
		$this->addOption('file', null, InputOption::VALUE_OPTIONAL, 'File path to write to. Will output to STDOUT if not defined.');
		$this->setDescription('Returns a backup archive part for a backup record known to Akeeba Backup');
		$this->setHelp($help);
	}
}
components/com_akeeba/CliCommands/ProfileImport.php000060400000007760152453623440016512 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Backup\Admin\Model\Profiles;
use Exception;
use FOF40\Container\Container;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Akeeba\Backup\Admin\CliCommands\MixIt\PrintFormattedArray;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:profile:import
 *
 * Imports an Akeeba Backup profile from a JSON string.
 *
 * @since   7.5.0
 */
class ProfileImport extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities, PrintFormattedArray;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:profile:import';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$filename = (string) $this->cliInput->getArgument('fileOrJSON') ?? '';
		$json     = $this->getJSON($filename);

		try
		{
			$decoded = @json_decode($json, true);
		}
		catch (Exception $e)
		{
			$decoded = '';
		}

		if (empty($decoded))
		{
			$this->ioStyle->error("Cannot process input; invalid JSON string or file not found.");

			return 1;
		}

		// We must never pass an ID, forcing the model to create a new record
		if (isset($decoded['id']))
		{
			unset($decoded['id']);
		}

		$container = Container::getInstance('com_akeeba');

		/** @var Profiles $model */
		$model = $container->factory->model('Profiles')->tmpInstance();

		try
		{
			$newProfile = $model->create($decoded);
		}
		catch (Exception $e)
		{
			$this->ioStyle->error(sprintf("Cannot import profile: %s", $e->getMessage()));

			return 2;
		}

		$id     = $newProfile->getId();
		$format = (string) $this->cliInput->getOption('format') ?? 'text';

		if ($format == 'json')
		{
			echo json_encode($id);

			return 0;
		}

		$this->ioStyle->success(sprintf("Successfully imported JSON as profile #%s", $id));

		return 0;
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will import an Akeeba Backup profile from a JSON string.
		\nUsage: <info>php %command.full_name%</info>";

		$this->addArgument('fileOrJSON', InputOption::VALUE_OPTIONAL, 'A path to an Akeeba Backup profile export JSON file or a literal JSON string. Uses STDIN if omitted.');
		$this->addOption('format', null, InputOption::VALUE_OPTIONAL, 'The format for the response. Use json to get a JSON-parseable numeric ID of the new backup profile. Values: json, text', 'text');

		$this->setDescription('Imports an Akeeba Backup profile from a JSON string');
		$this->setHelp($help);
	}

	/**
	 * Get the JSON input
	 *
	 * @param   string|null  $filename  The filename to read from, raw JSON data or an empty string
	 *
	 * @return  string  The JSON data
	 *
	 * @since   7.5.0
	 */
	private function getJSON(?string $filename): string
	{
		// No filename or JSON string passed to script; use STDIN
		if (empty($filename))
		{
			$json = '';

			while (!feof(STDIN))
			{
				$json .= fgets(STDIN) . "\n";
			}

			return rtrim($json);
		}

		// An existing file path was passed. Return the contents of the file.
		if (@file_exists($filename))
		{
			$ret = @file_get_contents($filename);

			if ($ret === false)
			{
				return '';
			}
		}

		// Otherwise assume raw JSON was passed back to us.
		return $filename;
	}

}
components/com_akeeba/CliCommands/SysconfigGet.php000060400000005331152453623440016313 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ComponentOptions;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Akeeba\Backup\Admin\CliCommands\MixIt\PrintFormattedArray;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:sysconfig:get
 *
 * Gets the value of an Akeeba Backup component-wide option
 *
 * @since   7.5.0
 */
class SysconfigGet extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities, PrintFormattedArray, ComponentOptions;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:sysconfig:get';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$key     = (string) $this->cliInput->getArgument('key') ?? '';
		$format  = (string) $this->cliInput->getOption('format') ?? 'table';
		$options = $this->getComponentOptions();

		if (!array_key_exists($key, $options))
		{
			$this->ioStyle->error(sprintf('Cannot find option “%s”.', $key));

			return 1;
		}

		$value = $options[$key] ?? '';

		switch ($format)
		{
			case 'text':
			default:
				echo $value;
				break;

			case 'json':
				echo json_encode($value);
				break;

			case 'print_r':
				print_r($value);
				break;

			case 'var_dump':
				var_dump($value);
				break;

			case 'var_export':
				var_export($value);
				break;
		}

		return 0;
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will get the value of an Akeeba Backup component-wide option.
		\nUsage: <info>php %command.full_name%</info>";


		$this->addArgument('key', null, InputOption::VALUE_REQUIRED, 'The option key to retrieve');
		$this->addOption('format', null, InputOption::VALUE_OPTIONAL, 'Output format: text, json, print_r, var_dunp, var_export.', 'text');

		$this->setDescription('Gets the value of an Akeeba Backup component-wide option');
		$this->setHelp($help);
	}
}
components/com_akeeba/CliCommands/BackupInfo.php000060400000004565152453623440015740 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Engine\Platform;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Akeeba\Backup\Admin\CliCommands\MixIt\PrintFormattedArray;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:backup:info
 *
 * Lists a backup record known to Akeeba Backup
 *
 * @since   7.5.0
 */
class BackupInfo extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities, PrintFormattedArray;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:backup:info';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$id     = (int) $this->cliInput->getArgument('id') ?? 0;
		$format = (string) ($this->cliInput->getOption('format') ?? 'table');

		if ($format === 'table')
		{
			$this->ioStyle->title(sprintf('Information for Akeeba Backup record #%d', $id));
		}

		$record = Platform::getInstance()->get_statistics($id);

		return $this->printFormattedAndReturn($record, $format);
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will list a backup record known to Akeeba Backup
		\nUsage: <info>php %command.full_name%</info>";

		$this->addArgument('id', InputArgument::REQUIRED, 'The id of the backup record to list');
		$this->addOption('format', null, InputOption::VALUE_OPTIONAL, 'Output format: table, json, yaml, csv, count.', 'table');
		$this->setDescription('Lists a backup record known to Akeeba Backup');
		$this->setHelp($help);
	}
}
components/com_akeeba/CliCommands/ProfileDelete.php000060400000005342152453623440016434 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Backup\Admin\Model\Profiles;
use Exception;
use FOF40\Container\Container;
use FOF40\Model\DataModel\Exception\RecordNotLoaded;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Akeeba\Backup\Admin\CliCommands\MixIt\PrintFormattedArray;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:profile:delete
 *
 * Delete an Akeeba Backup profile
 *
 * @since   7.5.0
 */
class ProfileDelete extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities, PrintFormattedArray;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:profile:delete';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$id = (int) $this->cliInput->getArgument('id') ?? 0;

		if ($id === 1)
		{
			$this->ioStyle->error('You cannot delete the default backup profile (#1)');
		}

		$container = Container::getInstance('com_akeeba');

		/** @var Profiles $model */
		$model = $container->factory->model('Profiles')->tmpInstance();

		try
		{
			$profile = $model->findOrFail($id);
		}
		catch (RecordNotLoaded $e)
		{
			$this->ioStyle->error(sprintf("Cannot delete profile %s; profile not found.", $id));

			return 2;
		}

		try
		{
			$newProfile = $model->forceDelete($profile->getId());
		}
		catch (Exception $e)
		{
			$this->ioStyle->error(sprintf("Cannot delete profile #%s: %s", $id, $e->getMessage()));

			return 3;
		}

		$this->ioStyle->success(sprintf("Profile #%d has been deleted.", $newProfile->getId()));

		return 0;
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will delete an Akeeba Backup profile.
		\nUsage: <info>php %command.full_name%</info>";

		$this->addArgument('id', InputOption::VALUE_REQUIRED, 'The numeric ID of the profile to delete');

		$this->setDescription('Delete an Akeeba Backup profile');
		$this->setHelp($help);
	}
}
components/com_akeeba/CliCommands/SysconfigSet.php000060400000006056152453623440016334 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Backup\Admin\Helper\SecretWord;
use FOF40\Container\Container;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ComponentOptions;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Akeeba\Backup\Admin\CliCommands\MixIt\PrintFormattedArray;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:sysconfig:set
 *
 * Sets the value of an Akeeba Backup component-wide option
 *
 * @since   7.5.0
 */
class SysconfigSet extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities, PrintFormattedArray, ComponentOptions;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:sysconfig:set';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$key     = (string) $this->cliInput->getArgument('key') ?? '';
		$value   = (string) $this->cliInput->getArgument('value') ?? '';
		$format  = (string) $this->cliInput->getOption('format') ?? 'table';
		$options = $this->getComponentOptions();

		if (!array_key_exists($key, $options))
		{
			$this->ioStyle->error(sprintf('Cannot find option “%s”.', $key));

			return 1;
		}

		if ((string) $options[$key] === $value)
		{
			return 0;
		}

		$container = Container::getInstance('com_akeeba');
		$container->params->set($key, $value);
		$container->params->save();

		// Make sure the front-end backup Secret Word is stored encrypted
		$params = $container->params;
		SecretWord::enforceEncryption($params, 'frontend_secret_word');

		$this->ioStyle->success(sprintf('Set component option “%s” to “%s”', $key, $value));

		return 0;
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will set the value of an Akeeba Backup component-wide option.
		\nUsage: <info>php %command.full_name%</info>";


		$this->addArgument('key', null, InputOption::VALUE_REQUIRED, 'The option key to set');
		$this->addArgument('value', null, InputOption::VALUE_REQUIRED, 'The option value to set');
		$this->addOption('format', null, InputOption::VALUE_OPTIONAL, 'Output format: text, json, print_r, var_dunp, var_export.', 'text');

		$this->setDescription('Sets the value of an Akeeba Backup component-wide option');
		$this->setHelp($help);
	}
}
components/com_akeeba/CliCommands/ProfileReset.php000060400000006527152453623440016322 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Backup\Admin\Model\Profiles;
use Akeeba\Engine\Platform;
use Exception;
use FOF40\Container\Container;
use FOF40\Model\DataModel\Exception\RecordNotLoaded;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Akeeba\Backup\Admin\CliCommands\MixIt\PrintFormattedArray;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:profile:reset
 *
 * Resets an Akeeba Backup profile
 *
 * @since   7.5.0
 */
class ProfileReset extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities, PrintFormattedArray;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:profile:reset';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$id            = (int) $this->cliInput->getArgument('id') ?? 0;
		$filters       = (bool) $this->cliInput->getOption('filters') ?? false;
		$configuration = (bool) $this->cliInput->getOption('configuration') ?? false;

		$container = Container::getInstance('com_akeeba');

		/** @var Profiles $model */
		$model = $container->factory->model('Profiles')->tmpInstance();

		try
		{
			$profile = $model->findOrFail($id);
		}
		catch (RecordNotLoaded $e)
		{
			$this->ioStyle->error(sprintf("Cannot modify profile %s; profile not found.", $id));

			return 1;
		}

		if ($filters)
		{
			$profile->filters = '';
		}

		if ($configuration)
		{
			$profile->configuration = '';
		}

		try
		{
			$newProfile = $profile->save();
		}
		catch (Exception $e)
		{
			$this->ioStyle->error(sprintf("Cannot reset profile #%s: %s", $id, $e->getMessage()));

			return 2;
		}

		/**
		 * Loading the new profile's empty configuration causes the Platform code to revert to the default options and
		 * save them automatically to the database.
		 */
		if ($configuration)
		{
			Platform::getInstance()->load_configuration($id);
		}

		$this->ioStyle->success(sprintf("Profile #%s reset successfully.", $newProfile->getId()));

		return 0;
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will resets an Akeeba Backup profile.
		\nUsage: <info>php %command.full_name%</info>";

		$this->addArgument('id', InputOption::VALUE_REQUIRED, 'The numeric ID of the profile to modify');
		$this->addOption('filters', null, InputOption::VALUE_NONE, 'Reset the filters?', false);
		$this->addOption('configuration', null, InputOption::VALUE_NONE, 'Reset the configuration?', false);

		$this->setDescription('Resets an Akeeba Backup profile');
		$this->setHelp($help);
	}
}
components/com_akeeba/CliCommands/FilterDelete.php000060400000010531152453623440016255 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Engine\Factory;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Akeeba\Backup\Admin\CliCommands\MixIt\FilterRoots;
use Akeeba\Backup\Admin\CliCommands\MixIt\IsPro;
use Akeeba\Backup\Admin\CliCommands\MixIt\PrintFormattedArray;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:filter:delete
 *
 * Delete a filter value known to Akeeba Backup.
 *
 * @since   7.5.0
 */
class FilterDelete extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities, PrintFormattedArray, IsPro, FilterRoots;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:filter:delete';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$profileId = (int) ($this->cliInput->getOption('profile') ?? 1);

		define('AKEEBA_PROFILE', $profileId);

		$filterType = (string) ($this->cliInput->getOption('filterType') ?? 'files');
		$target     = (in_array($filterType, [
			'tables', 'tabledata', 'regextables', 'regextabledata', 'multidb',
		])) ? 'db' : 'fs';
		$root       = (string) ($this->cliInput->getOption('root') ?? (($target == 'fs') ? '[SITEROOT]' : '[SITEDB]'));

		if (!in_array($root, $this->getRoots($target)))
		{
			$this->ioStyle->error(sprintf("Unknown %s root '%s'.", $target, $root));

			return 1;
		}

		$filter = (string) $this->cliInput->getArgument('filter') ?? '';

		$this->ioStyle->title(sprintf(
			'Deleting %s filter “%s” of type %s from profile #%d',
			$target === 'db' ? 'database' : 'filesystem',
			$filter,
			$filterType,
			$profileId
		));

		// Delete the filter
		$filterObject = Factory::getFilterObject($filterType);

		if ((stripos($filterType, 'regex') !== false) && !$this->isPro())
		{
			$this->ioStyle->error(sprintf("Filters of the '%s' type are only available with Akeeba Backup Professional.", $filterType));

			return 2;
		}

		switch ($filterType)
		{
			case 'extradirs':
			case 'multidb':
				if (!$this->isPro())
				{
					$this->ioStyle->error(sprintf("Filters of the '%s' type are only available with Akeeba Backup Professional.", $filterType));

					return 2;
				}

				$success = $filterObject->remove($filter);
				break;

			default:
				$success = $filterObject->remove($root, $filter);
				break;
		}

		if (!$success)
		{
			$this->ioStyle->error(sprintf("Could not delete filter '%s' of type '%s'.", $filter, $filterType));

			return 3;
		}

		Factory::getFilters()->save();

		$this->ioStyle->success(sprintf("Deleted filter '%s' of type '%s'.", $filter, $filterType));

		return 0;
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will delete a filter value known to Akeeba Backup.
		\nUsage: <info>php %command.full_name%</info>";

		$this->addArgument('filter', InputArgument::REQUIRED, 'The filter name to delete');
		$this->addOption('root', null, InputOption::VALUE_OPTIONAL, 'Which filter root to use. Defaults to [SITEROOT] or [SITEDB] depending on the fitler type.', '');
		$this->addOption('filterType', null, InputOption::VALUE_REQUIRED, 'The type of filter you want to delete: files, directories, skipdirs, skipfiles, regexfiles, regexdirectories, regexskipdirs, regexskipfiles, tables, tabledata, regextables, regextabledata, extradirs, multidb', 'files');
		$this->addOption('profile', null, InputOption::VALUE_OPTIONAL, 'The backup profile to use. Default: 1.', 1);


		$this->setDescription('Delete a filter value known to Akeeba Backup.');
		$this->setHelp($help);
	}
}
components/com_akeeba/CliCommands/MixIt/IsPro.php000060400000001477152453623440016004 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands\MixIt;

defined('_JEXEC') || die;

/**
 * Is this Akeeba Backup Pro?
 *
 * @since   7.5.0
 */
trait IsPro
{
	/**
	 * Caches whether this is the Pro version of the software.
	 *
	 * @var   null|bool
	 * @since 7.5.0
	 */
	private $isPro = null;

	/**
	 * is this the Professional version of the software?
	 *
	 * @return  bool
	 * @since   7.5.0
	 */
	private function isPro(): bool
	{
		if (!is_null($this->isPro))
		{
			return $this->isPro;
		}

		$componentFolder = JPATH_ADMINISTRATOR . '/components/com_akeeba';
		$this->isPro     = is_dir($componentFolder . '/AliceEngine');

		return $this->isPro;
	}
}
components/com_akeeba/CliCommands/MixIt/FilterRoots.php000060400000002115152453623440017212 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands\MixIt;

defined('_JEXEC') || die;

use Akeeba\Backup\Admin\Model\DatabaseFilters;
use Akeeba\Engine\Factory;
use FOF40\Container\Container;

trait FilterRoots
{
	/**
	 * @param   string  $target
	 *
	 * @return  array
	 *
	 * @since   7.5.0
	 */
	private function getRoots(string $target): array
	{
		$container = Container::getInstance('com_akeeba', [], 'admin');
		$filters   = Factory::getFilters();
		$output    = [];

		switch ($target)
		{
			case 'fs':
				$rootInfo = $filters->getInclusions('dir');

				foreach ($rootInfo as $item)
				{
					$output[] = $item[0];
				}

				break;

			case 'db':
				/** @var DatabaseFilters $model */
				$model    = $container->factory->model('DatabaseFilters')->tmpInstance();
				$rootInfo = $model->get_roots();

				foreach ($rootInfo as $item)
				{
					$output[] = $item->value;
				}

				break;
		}

		return $output;
	}

}
components/com_akeeba/CliCommands/MixIt/JsonGuiDataParser.php000060400000010626152453623440020271 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands\MixIt;

defined('_JEXEC') || die;

use Akeeba\Engine\Factory;

trait JsonGuiDataParser
{
	/**
	 * Parse the JSON GUI definition returned by Akeeba Engine into something I can use to provide information about
	 * the options.
	 *
	 * @return  array
	 *
	 * @since   7.5.0
	 */
	private function parseJsonGuiData(): array
	{
		$jsonGUIData = Factory::getEngineParamsProvider()->getJsonGuiDefinition();
		$guiData     = json_decode($jsonGUIData, true);

		$ret = [
			'engines'    => [],
			'installers' => [],
			'options'    => [],
		];

		// Parse engines
		foreach ($guiData['engines'] as $engineType => $engineRecords)
		{
			if (!isset($ret['engines'][$engineType]))
			{
				$ret['engines'][$engineType] = [];
			}

			foreach ($engineRecords as $engineName => $record)
			{
				$ret['engines'][$engineType][$engineName] = [
					'title'       => $record['information']['title'],
					'description' => $record['information']['description'],
				];

				foreach ($record['parameters'] as $key => $optionRecord)
				{
					$ret['options'][$key] = array_merge($optionRecord, [
						'section' => $record['information']['title'],
					]);
				}
			}
		}

		// Parse installers
		foreach ($guiData['installers'] as $installerName => $installerInfo)
		{
			$ret['installers'][$installerName] = $installerInfo['name'];
		}

		// Parse GUI sections
		foreach ($guiData['gui'] as $section => $options)
		{
			foreach ($options as $key => $optionRecord)
			{
				$ret['options'][$key] = array_merge($optionRecord, [
					'section' => $section,
				]);
			}
		}

		return $ret;
	}

	/**
	 * Flattens the option tree returned by exportToJson into an array with dotted notation for each option.
	 *
	 * @param   array   $rawOptions  The option tree
	 * @param   string  $prefix      Current prefix, used for recursion
	 *
	 * @return  array
	 * @since   7.5.0
	 */
	private function flattenOptions(array $rawOptions, string $prefix = ''): array
	{
		$ret = [];

		foreach ($rawOptions as $k => $v)
		{
			if (is_array($v))
			{
				$ret = array_merge($ret, $this->flattenOptions($v, $prefix . $k . '.'));

				continue;
			}

			$ret[$prefix . $k] = $v;
		}

		return $ret;
	}

	/**
	 * Get the information for an option record.
	 *
	 * @param   string  $key   The option key
	 * @param   array   $info  The array returned by parseJsonGuiData
	 *
	 * @return  array
	 *
	 * @since   7.5.0
	 */
	private function getOptionInfo(string $key, array &$info): array
	{
		$ret = [];

		if (!isset($info['options'][$key]))
		{
			return $ret;
		}

		$keyInfo = $info['options'][$key];

		$ret = [
			'title'        => $keyInfo['title'],
			'description'  => $keyInfo['description'],
			'section'      => $keyInfo['section'],
			'type'         => $keyInfo['type'],
			'default'      => $keyInfo['default'],
			'options'      => [],
			'optionTitles' => [],
			'limits'       => [],
		];

		switch ($keyInfo['type'])
		{
			case 'integer':
				if (isset($keyInfo['shortcuts']))
				{
					$ret['options'] = explode('|', $keyInfo['shortcuts']);
				}

				$ret['limits'] = [
					'min' => $keyInfo['min'],
					'max' => $keyInfo['max'],
				];
				break;

			case 'bool':
				$ret['type']    = 'integer';
				$ret['options'] = [0, 1];
				$ret['limits']  = [
					'min' => 0,
					'max' => 1,
				];
				break;

			case 'engine':
				$ret['type']         = 'enum';
				$ret['type']         = 'string';
				$ret['options']      = array_keys($info['engines'][$keyInfo['subtype']]);
				$ret['optionTitles'] = [];

				foreach ($info['engines'][$keyInfo['subtype']] as $k => $details)
				{
					$ret['optionTitles'][$k] = $details['title'];
				}

				break;

			case 'installer':
				$ret['type']         = 'enum';
				$ret['type']         = 'string';
				$ret['options']      = array_keys($info['installers']);
				$ret['optionTitles'] = $info['installers'];

				break;

			case 'enum':
				$ret['type']         = 'string';
				$ret['options']      = explode('|', $keyInfo['enumvalues']);
				$ret['optionTitles'] = explode('|', $keyInfo['enumkeys']);

				break;

			case 'hidden':
			case 'button':
			case 'separator':
				$ret['type'] = 'hidden';
				break;

			case 'string':
			case 'browsedir':
			case 'password':
			default:
				$ret['type'] = 'string';
				break;
		}

		return $ret;
	}

}
components/com_akeeba/CliCommands/MixIt/PrintFormattedArray.php000060400000005441152453623440020704 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands\MixIt;


trait PrintFormattedArray
{
	/**
	 * Prints the array formatted with the specific format and returns an integer result
	 *
	 * @param   array   $data    The data to format and print
	 * @param   string  $format  One of table, json, yaml, csv, count
	 *
	 * @return  int
	 * @since   7.5.0
	 */
	private function printFormattedAndReturn(?array $data, string $format): int
	{
		if (empty($data) && ($format != 'count'))
		{
			return 0;
		}
		elseif (empty($data))
		{
			$data = [];
		}

		if (!empty($data))
		{
			$keys     = array_keys($data);
			$firstKey = array_shift($keys);
			$row      = $data[$firstKey];

			if (is_array($row))
			{
				$headers = array_keys($row);
			}
			else
			{
				$headers = array_keys($data);

				if (!in_array($format, ['json', 'yaml']))
				{
					$data = [$data];
				}
			}
		}

		switch ($format)
		{
			default:
			case 'table':
				$this->ioStyle->table($headers, $data);
				break;

			case 'json':
				$this->ioStyle->writeln(json_encode($data, JSON_PRETTY_PRINT));
				break;

			case 'yaml':
				if (!function_exists('yaml_emit'))
				{
					$this->ioStyle->error(<<< ERROR
Cannot generate YAML

Your PHP installation does not have the PHP YAML extension installed or enabled.

ERROR

					);

					return 1;
				}

				$this->ioStyle->writeln(yaml_emit($data));
				break;

			case 'csv':
				$this->ioStyle->writeln($this->toCsv($data));
				break;

			case 'count':
				$this->ioStyle->writeln(count($data));
				break;
		}

		return 0;
	}

	/**
	 * Converts an array to its CSV representation
	 *
	 * @param   array  $data       The array data to convert to CSV
	 * @param   bool   $csvHeader  Should I print a CSV header row?
	 *
	 * @return  string
	 * @since   7.5.0
	 */
	private function toCsv(array $data, bool $csvHeader = true): string
	{
		$output = '';
		$item   = array_pop($data);
		$data[] = $item;
		$keys   = array_keys($item);

		if ($csvHeader)
		{
			$csv = [];

			foreach ($keys as $k)
			{
				$k = str_replace('"', '""', $k);
				$k = str_replace("\r", '\\r', $k);
				$k = str_replace("\n", '\\n', $k);
				$k = '"' . $k . '"';

				$csv[] = $k;
			}

			$output .= implode(",", $csv) . "\r\n";
		}

		foreach ($data as $item)
		{
			$csv = [];

			foreach ($keys as $k)
			{
				$v = $item[$k];

				if (is_array($v))
				{
					$v = 'Array';
				}
				elseif (is_object($v))
				{
					$v = 'Object';
				}

				$v = str_replace('"', '""', $v);
				$v = str_replace("\r", '\\r', $v);
				$v = str_replace("\n", '\\n', $v);
				$v = '"' . $v . '"';

				$csv[] = $v;
			}

			$output .= implode(",", $csv) . "\r\n";
		}

		return $output;
	}
}
components/com_akeeba/CliCommands/MixIt/ComponentOptions.php000060400000002505152453623440020257 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands\MixIt;

defined('_JEXEC') || die;

use Akeeba\Engine\Platform;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Form\FormField;

trait ComponentOptions
{
	private function getComponentOptions(bool $defaultValuesOnly = false): array
	{
		$output     = [];
		$fieldNames = [];

		$form = new Form('config');
		$form->loadFile(JPATH_ADMINISTRATOR . '/components/com_akeeba/config.xml', true, '//config');

		foreach ($form->getFieldsets() as $group => $fieldSetInfo)
		{
			$fields = $form->getFieldset($group);

			if (empty($fields))
			{
				continue;
			}

			foreach ($fields as $fieldName => $v)
			{
				if (!is_object($v) || !($v instanceof FormField))
				{
					continue;
				}

				if (substr((string) $v->type, -5) === 'Rules')
				{
					continue;
				}

				if (in_array(strtolower((string) $v->type), ['hidden', 'rules', 'spacer']))
				{
					continue;
				}

				$fieldNames[$fieldName] = $v->value ?? null;
			}
		}

		if (!$defaultValuesOnly)
		{
			foreach ($fieldNames as $k => $default)
			{
				$output[$k] = Platform::getInstance()->get_platform_configuration_option($k, $default);
			}
		}

		return $output;
	}
}
components/com_akeeba/CliCommands/MixIt/ConfigureIO.php000060400000002036152453623440017111 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands\MixIt;

defined('_JEXEC') || die;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;

/**
 * Set up the Symfony I/O objects
 *
 * @since   7.5.0
 */
trait ConfigureIO
{
	/**
	 * @var   SymfonyStyle
	 * @since 7.5.0
	 */
	private $ioStyle;

	/**
	 * @var   InputInterface
	 * @since 7.5.0
	 */
	private $cliInput;

	/**
	 * Configure the IO.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	private function configureSymfonyIO(InputInterface $input, OutputInterface $output)
	{
		$this->cliInput = $input;
		$this->ioStyle  = new SymfonyStyle($input, $output);
	}

}
components/com_akeeba/CliCommands/MixIt/TimeInfo.php000060400000004257152453623440016461 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands\MixIt;

defined('_JEXEC') || die;

/**
 * Utility methods to get time information
 *
 * @since   7.5.0
 */
trait TimeInfo
{
	/**
	 * Returns a fancy formatted time lapse code
	 *
	 * @param   integer   $referenceDateTime  Timestamp of the reference date/time
	 * @param   int|null  $currentDateTime    Timestamp of the current date/time
	 * @param   string    $measureBy          One of s, m, h, d, or y (time unit)
	 * @param   boolean   $autoText           Append text automatically?
	 *
	 * @return  string
	 *
	 * @since   7.5.0
	 */
	private function timeAgo(int $referenceDateTime = 0, ?int $currentDateTime = null, string $measureBy = '', bool $autoText = true): string
	{
		if (is_null($currentDateTime))
		{
			$currentDateTime = time();
		}

		// Raw time difference
		$raw   = $currentDateTime - $referenceDateTime;
		$clean = abs($raw);

		$calcNum = [
			['s', 60],
			['m', 60 * 60],
			['h', 60 * 60 * 60],
			['d', 60 * 60 * 60 * 24],
			['y', 60 * 60 * 60 * 24 * 365],
		];

		$calc = [
			's' => [1, 'second'],
			'm' => [60, 'minute'],
			'h' => [60 * 60, 'hour'],
			'd' => [60 * 60 * 24, 'day'],
			'y' => [60 * 60 * 24 * 365, 'year'],
		];

		if ($measureBy == '')
		{
			$usemeasure = 's';

			for ($i = 0; $i < count($calcNum); $i++)
			{
				if ($clean <= $calcNum[$i][1])
				{
					$usemeasure = $calcNum[$i][0];
					$i          = count($calcNum);
				}
			}
		}
		else
		{
			$usemeasure = $measureBy;
		}

		$datedifference = floor($clean / $calc[$usemeasure][0]);

		if ($autoText == true && ($currentDateTime == time()))
		{
			if ($raw < 0)
			{
				$prospect = ' from now';
			}
			else
			{
				$prospect = ' ago';
			}
		}
		else
		{
			$prospect = '';
		}

		if ($referenceDateTime != 0)
		{
			if ($datedifference == 1)
			{
				return $datedifference . ' ' . $calc[$usemeasure][1] . ' ' . $prospect;
			}
			else
			{
				return $datedifference . ' ' . $calc[$usemeasure][1] . 's ' . $prospect;
			}
		}
		else
		{
			return 'No input time referenced.';
		}
	}
}
components/com_akeeba/CliCommands/MixIt/ArgumentUtilities.php000060400000002173152453623440020420 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands\MixIt;

defined('_JEXEC') || die;

/**
 * Utility methods to manage command arguments
 *
 * @since   7.5.0
 */
trait ArgumentUtilities
{
	/**
	 * Parse the overrides provided in the command line.
	 *
	 * Input: "key1=value1, key2= value2, key3 = value3"
	 * Output: ['key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3']
	 *
	 * @param   string  $rawString  The raw string
	 *
	 * @return  array  The parsed overrides
	 *
	 * @since   7.5.0
	 */
	private function commaListToMap(string $rawString): array
	{
		if (empty($rawString) || (trim($rawString) == ''))
		{
			return [];
		}

		$rawString = trim($rawString);
		$ret       = [];
		$lines     = explode($rawString, ",");

		foreach ($lines as $line)
		{
			if (strpos($line, '=') === false)
			{
				continue;
			}

			[$key, $value] = explode('=', $line);
			$key       = trim($key);
			$value     = trim($value);
			$ret[$key] = $value;
		}

		return $ret;
	}
}
components/com_akeeba/CliCommands/MixIt/MemoryInfo.php000060400000002175152453623440017030 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands\MixIt;

defined('_JEXEC') || die;

/**
 * Utility methods to get memory information
 *
 * @since   7.5.0
 */
trait MemoryInfo
{
	/**
	 * Returns the current memory usage
	 *
	 * @return  string
	 *
	 * @since   7.5.0
	 */
	private function memUsage(): string
	{
		if (function_exists('memory_get_usage'))
		{
			$size = memory_get_usage();
			$unit = ['b', 'KB', 'MB', 'GB', 'TB', 'PB'];

			return @round($size / 1024 ** ($i = floor(log($size, 1024))), 2) . ' ' . $unit[$i];
		}
		else
		{
			return "(unknown)";
		}
	}

	/**
	 * Returns the peak memory usage
	 *
	 * @return  string
	 *
	 * @since   7.5.0
	 */
	private function peakMemUsage(): string
	{
		if (function_exists('memory_get_peak_usage'))
		{
			$size = memory_get_peak_usage();
			$unit = ['b', 'KB', 'MB', 'GB', 'TB', 'PB'];

			return @round($size / 1024 ** ($i = floor(log($size, 1024))), 2) . ' ' . $unit[$i];
		}
		else
		{
			return "(unknown)";
		}
	}
}
components/com_akeeba/CliCommands/SysconfigList.php000060400000004447152453623440016516 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ComponentOptions;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Akeeba\Backup\Admin\CliCommands\MixIt\PrintFormattedArray;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:sysconfig:list
 *
 * Lists the Akeeba Backup component-wide options
 *
 * @since   7.5.0
 */
class SysconfigList extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities, PrintFormattedArray, ComponentOptions;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:sysconfig:list';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$format = (string) $this->cliInput->getOption('format') ?? 'table';
		$output = $this->getComponentOptions();

		if (in_array($format, ['table', 'csv']))
		{
			$temp = [];

			foreach ($output as $k => $v)
			{
				$temp[] = [
					'key'   => $k,
					'value' => $v,
				];
			}

			$output = $temp;
		}

		return $this->printFormattedAndReturn($output, $format);
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will list the Akeeba Backup component-wide options.
		\nUsage: <info>php %command.full_name%</info>";


		$this->addOption('format', null, InputOption::VALUE_OPTIONAL, 'Output format: table, json, yaml, csv, count.', 'table');

		$this->setDescription('Lists the Akeeba Backup component-wide options');
		$this->setHelp($help);
	}
}
components/com_akeeba/CliCommands/BackupModify.php000060400000006237152453623440016272 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Engine\Platform;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:backup:modify
 *
 * Modifies a backup record known to Akeeba Backup
 *
 * @since   7.5.0
 */
class BackupModify extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:backup:modify';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$id          = (int) $this->cliInput->getArgument('id') ?? 0;
		$description = $this->cliInput->getOption('description');
		$comment     = $this->cliInput->getOption('comment');

		$this->ioStyle->title(sprintf('Modifying Akeeba Backup record #%d', $id));

		if ($id <= 0)
		{
			$this->ioStyle->error('Invalid backup record');

			return 1;
		}

		if (is_null($description) && is_null($comment))
		{
			$this->ioStyle->error('You must specify one or both of --description and --comment');

			return 2;
		}

		$record = Platform::getInstance()->get_statistics($id);

		if (empty($record))
		{
			$this->ioStyle->error('Invalid backup record');

			return 1;
		}

		if (!is_null($description))
		{
			$record['description'] = (string) $description;
		}

		if (!is_null($comment))
		{
			$record['comment'] = (string) $comment;
		}

		$result = Platform::getInstance()->set_or_update_statistics($id, $record);

		if ($result === false)
		{
			$this->ioStyle->error(sprintf('Cannot modify backup record #%d', $id));

			return 3;
		}

		$this->ioStyle->success(sprintf('Backup record #%d has been modified.', $id));

		return 0;
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will modify a backup record known to Akeeba Backup
		\nUsage: <info>php %command.full_name%</info>";

		$this->addArgument('id', InputArgument::REQUIRED, 'The id of the backup record to modify');
		$this->addOption('description', null, InputOption::VALUE_OPTIONAL, 'Change the short description to this value.');
		$this->addOption('comment', null, InputOption::VALUE_OPTIONAL, 'Change the backup comment to this value (accepts HTML).');
		$this->setDescription('Modifies a backup record known to Akeeba Backup');
		$this->setHelp($help);
	}
}
components/com_akeeba/CliCommands/ProfileCreate.php000060400000007327152453623440016442 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Backup\Admin\Model\Profiles;
use Akeeba\Engine\Platform;
use Exception;
use FOF40\Container\Container;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Akeeba\Backup\Admin\CliCommands\MixIt\PrintFormattedArray;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:profile:create
 *
 * Creates a new Akeeba Backup profile
 *
 * @since   7.5.0
 */
class ProfileCreate extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities, PrintFormattedArray;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:profile:create';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$format = (string) $this->cliInput->getOption('format') ?? 'text';
		$format = in_array($format, ['text', 'json']) ? $format : 'text';

		$container = Container::getInstance('com_akeeba');

		/** @var Profiles $model */
		$model = $container->factory->model('Profiles')->tmpInstance();

		// Set up the new profile data
		$profileData = [
			'description'   => 'New backup profile',
			'quickicon'     => '1',
			'configuration' => '',
			'filters'       => '',
		];

		$description = (string) $this->cliInput->getArgument('description') ?? 0;

		if (!is_null($description))
		{
			$profileData['description'] = trim($description);
		}

		$profileData['quickicon'] = ((bool) $this->cliInput->getArgument('quickicon') ?? true) ? 1 : 0;

		try
		{
			$newProfile = $model->create($profileData);
		}
		catch (Exception $e)
		{
			$this->ioStyle->error(sprintf("Cannot create profile: %s", $e->getMessage()));

			return 2;
		}

		/**
		 * Create a new profile configuration.
		 *
		 * Loading the new profile's empty configuration causes the Platform code to revert to the default options and
		 * save them automatically to the database.
		 */
		$profileId = $newProfile->getId();
		Platform::getInstance()->load_configuration($profileId);

		if ($format == 'json')
		{
			echo json_encode($newProfile->getId());

			return 0;
		}

		$this->ioStyle->success(sprintf("Created new profile with ID %s.", $newProfile->getId()));

		return 0;
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will create a new Akeeba Backup profile.
		\nUsage: <info>php %command.full_name%</info>";

		$this->addOption('description', null, InputOption::VALUE_OPTIONAL, 'Description for the new backup profile. Default: "New backup profile".', 'New backup profile');
		$this->addOption('quickicon', null, InputOption::VALUE_OPTIONAL, 'Should the new backup profile have a one-click backup icon? Default: 1', 1);
		$this->addOption('format', null, InputOption::VALUE_OPTIONAL, 'The format for the response. Use JSON to get a JSON-parseable numeric ID of the new backup profile. Values: text, json', 'text');

		$this->setDescription('Creates a new Akeeba Backup profile');
		$this->setHelp($help);
	}
}
components/com_akeeba/CliCommands/OptionsList.php000060400000012350152453623440016175 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Backup\Admin\Model\Profiles;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use FOF40\Container\Container;
use FOF40\Model\DataModel\Exception\RecordNotLoaded;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Akeeba\Backup\Admin\CliCommands\MixIt\JsonGuiDataParser;
use Akeeba\Backup\Admin\CliCommands\MixIt\PrintFormattedArray;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:option:list
 *
 * Lists the configuration options for an Akeeba Backup profile, including their titles
 *
 * @since   7.5.0
 */
class OptionsList extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities, PrintFormattedArray, JsonGuiDataParser;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:option:list';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$container = Container::getInstance('com_akeeba');
		$profileId = (int) ($this->cliInput->getOption('profile') ?? 1);

		define('AKEEBA_PROFILE', $profileId);

		$format = (string) $this->cliInput->getOption('format') ?? 'table';

		/** @var Profiles $model */
		$model = $container->factory->model('Profiles')->tmpInstance();

		try
		{
			$model->findOrFail($profileId);
		}
		catch (RecordNotLoaded $e)
		{
			$this->ioStyle->error(sprintf("Could not find profile #%s.", $profileId));

			return 1;
		}

		unset($model);

		// Get the profile's configuration
		Platform::getInstance()->load_configuration($profileId);
		$config  = Factory::getConfiguration();
		$rawJson = $config->exportAsJSON();

		unset($config);

		// Get the key information from the GUI data
		$info = $this->parseJsonGuiData();

		// Convert the INI data we got into an array we can print
		$rawValues = json_decode($rawJson, true);

		unset($rawJson);

		$output = [];

		$rawValues = $this->flattenOptions($rawValues);

		foreach ($rawValues as $key => $v)
		{
			$output[$key] = array_merge([
				'key'          => $key,
				'value'        => $v,
				'title'        => '',
				'description'  => '',
				'type'         => '',
				'default'      => '',
				'section'      => '',
				'options'      => [],
				'optionTitles' => [],
				'limits'       => [],
			], $this->getOptionInfo($key, $info));
		}

		// Filter the returned options
		$filter = (string) $this->cliInput->getOption('filter') ?? '';

		$output = array_filter($output, function ($item) use ($filter) {
			if (!empty($filter) && strpos($item['key'], $filter) === false)
			{
				return false;
			}

			return $item['type'] != 'hidden';
		});

		// Sort the results
		$sort  = (string) $this->cliInput->getOption('sort-by') ?? 'none';
		$order = (string) $this->cliInput->getOption('sort-order') ?? 'asc';

		if ($sort != 'none')
		{
			usort($output, function ($a, $b) use ($sort, $order) {
				if ($a[$sort] == $b[$sort])
				{
					return 0;
				}

				$signChange = ($order == 'asc') ? 1 : -1;
				$isGreater  = $a[$sort] > $b[$sort] ? 1 : -1;

				return $signChange * $isGreater;
			});
		}

		// Output the list
		if (empty($output))
		{
			$this->ioStyle->error("No options found matching your criteria.");

			return 2;
		}

		if ($format === 'table')
		{
			$output = array_map(function (array $optionDef) {
				return array_map(function ($value) {
					return is_array($value) ? implode(', ', $value) : $value;
				}, $optionDef);
			}, $output);
		}

		return $this->printFormattedAndReturn($output, $format);
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will list the configuration options for an Akeeba Backup profile, including their titles.
		\nUsage: <info>php %command.full_name%</info>";


		$this->addOption('profile', null, InputOption::VALUE_OPTIONAL, 'The backup profile to use. Default: 1.', 1);
		$this->addOption('filter', null, InputOption::VALUE_OPTIONAL, 'Only return records whose keys begin with the given filter.', '');
		$this->addOption('sort-by', null, InputOption::VALUE_OPTIONAL, 'Sort the output by the given column: none, key, value, type, default, title, description, section', 'none');
		$this->addOption('sort-order', null, InputOption::VALUE_OPTIONAL, 'Sort order: asc, desc.', 'desc');
		$this->addOption('format', null, InputOption::VALUE_OPTIONAL, 'Output format: table, json, yaml, csv, count.', 'table');

		$this->setDescription('Lists the configuration options for an Akeeba Backup profile, including their titles');
		$this->setHelp($help);
	}
}
components/com_akeeba/CliCommands/BackupList.php000060400000012426152453623440015753 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Backup\Admin\Model\Statistics;
use FOF40\Container\Container;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Akeeba\Backup\Admin\CliCommands\MixIt\PrintFormattedArray;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:backup:list
 *
 * Lists backup records known to Akeeba Backup
 *
 * @since   7.5.0
 */
class BackupList extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities, PrintFormattedArray;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:backup:list';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$from    = (int) ($this->cliInput->getOption('from') ?? 0);
		$limit   = (int) ($this->cliInput->getOption('limit') ?? 0);
		$format  = (string) ($this->cliInput->getOption('format') ?? 'table');
		$filters = $this->getFilters();
		$order   = $this->getOrdering();

		if ($format === 'table')
		{
			$this->ioStyle->title('List of Akeeba Backup records matching your criteria');
		}

		$container = Container::getInstance('com_akeeba', [], 'admin');

		/** @var Statistics $model */
		$model = $container->factory->model('Statistics')->tmpInstance();

		$model->setState('limitstart', $from);
		$model->setState('limit', $limit);

		$output = $model->getStatisticsListWithMeta(false, $filters, $order);

		return $this->printFormattedAndReturn($output, $format);
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will list backup records known to Akeeba Backup
		\nUsage: <info>php %command.full_name%</info>";

		$this->addOption('from', null, InputOption::VALUE_OPTIONAL, 'How many backup records to skip before starting the output.', 0);
		$this->addOption('limit', null, InputOption::VALUE_OPTIONAL, 'Maximum number of backup records to display.', 50);
		$this->addOption('format', null, InputOption::VALUE_OPTIONAL, 'Output format: table, json, yaml, csv, count.', 'table');
		$this->addOption('description', null, InputOption::VALUE_OPTIONAL, 'Listed backup records must match this (partial) description.');
		$this->addOption('after', null, InputOption::VALUE_OPTIONAL, 'List backup records taken after this date.');
		$this->addOption('before', null, InputOption::VALUE_OPTIONAL, 'List backup records taken before this date.');
		$this->addOption('origin', null, InputOption::VALUE_OPTIONAL, 'List backups from this origin only: backend, frontend, json, cli.');
		$this->addOption('profile', null, InputOption::VALUE_OPTIONAL, 'List backups taken with this profile. Give the numeric profile ID.');
		$this->addOption('sort-by', null, InputOption::VALUE_OPTIONAL, 'Sort the output by the given column: id, description, profile_id, backupstart', 'id');
		$this->addOption('sort-order', null, InputOption::VALUE_OPTIONAL, 'Sort order: asc, desc.', 'desc');
		$this->setDescription('Lists backup records known to Akeeba Backup');
		$this->setHelp($help);
	}

	private function getFilters(): ?array
	{
		$filters = [];

		$description = $this->cliInput->getOption('description') ?? '';

		if ($description)
		{
			$filters[] = [
				'field'   => 'description',
				'operand' => 'LIKE',
				'value'   => $description,
			];
		}

		$after  = $this->cliInput->getOption('after') ?? '';
		$before = $this->cliInput->getOption('before') ?? '';

		if (!empty($after) && !empty($before))
		{
			$filters[] = [
				'field'   => 'backupstart',
				'operand' => 'BETWEEN',
				'value'   => $after,
				'value2'  => $before,
			];
		}
		elseif (!empty($after))
		{
			$filters[] = [
				'field'   => 'backupstart',
				'operand' => '>=',
				'value'   => $after,
			];
		}
		elseif (!empty($before))
		{
			$filters[] = [
				'field'   => 'backupstart',
				'operand' => '<=',
				'value'   => $before,
			];
		}

		$origin = $this->cliInput->getOption('origin') ?? '';

		if (!empty($origin))
		{
			$filters[] = [
				'field'   => 'origin',
				'operand' => '=',
				'value'   => $origin,
			];
		}

		$profile = (int) ($this->cliInput->getOption('profile') ?? 0);

		if ($profile > 0)
		{
			$filters[] = [
				'field'   => 'profile_id',
				'operand' => '=',
				'value'   => $profile,
			];
		}

		return !empty($filters) ? $filters : null;
	}

	private function getOrdering(): array
	{
		$order = strtolower($this->cliInput->getOption('sort-order') ?? 'desc');
		$order = in_array($order, ['asc', 'desc']) ?: 'desc';

		return [
			'by'    => $this->cliInput->getOption('sort-by') ?? 'id',
			'order' => $order,
		];
	}
}
components/com_akeeba/CliCommands/FilterExclude.php000060400000010135152453623440016444 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Engine\Factory;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Akeeba\Backup\Admin\CliCommands\MixIt\FilterRoots;
use Akeeba\Backup\Admin\CliCommands\MixIt\IsPro;
use Akeeba\Backup\Admin\CliCommands\MixIt\PrintFormattedArray;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:filter:exclude
 *
 * Set an exclusion filter to Akeeba Backup.
 *
 * @since   7.5.0
 */
class FilterExclude extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities, PrintFormattedArray, IsPro, FilterRoots;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:filter:exclude';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$profileId = (int) ($this->cliInput->getOption('profile') ?? 1);

		define('AKEEBA_PROFILE', $profileId);

		$filterType = (string) ($this->cliInput->getOption('filterType') ?? 'files');
		$target     = (in_array($filterType, [
			'tables', 'tabledata', 'regextables', 'regextabledata', 'multidb',
		])) ? 'db' : 'fs';
		$root       = (string) ($this->cliInput->getOption('root') ?? (($target == 'fs') ? '[SITEROOT]' : '[SITEDB]'));

		if (!in_array($root, $this->getRoots($target)))
		{
			$this->ioStyle->error(sprintf("Unknown %s root '%s'.", $target, $root));

			return 1;
		}

		$filter = (string) $this->cliInput->getArgument('filter') ?? '';

		$this->ioStyle->title(sprintf(
			'Adding %s filter “%s” of type %s to profile #%d',
			$target === 'db' ? 'database' : 'filesystem',
			$filter,
			$filterType,
			$profileId
		));

		// Delete the filter
		$filterObject = Factory::getFilterObject($filterType);

		if ((stripos($filterType, 'regex') !== false) && !$this->isPro())
		{
			$this->ioStyle->error(sprintf("Filters of the '%s' type are only available with Akeeba Backup Professional.", $filterType));

			return 1;
		}

		$success = $filterObject->set($root, $filter);

		if (!$success)
		{
			$this->ioStyle->error(sprintf("Could not add filter '%s' of type '%s'.", $filter, $filterType));

			return 2;
		}

		Factory::getFilters()->save();

		$this->ioStyle->success(sprintf("Added filter '%s' of type '%s'.", $filter, $filterType));

		return 0;
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will set a file, folder or table exclusion filter to Akeeba Backup.
		\nUsage: <info>php %command.full_name%</info>";

		$this->addArgument('filter', InputArgument::REQUIRED, 'The filter target to add. This is the full path to a file/directory, a table name or a regular expression, depending on the filter type.');
		$this->addOption('root', null, InputOption::VALUE_OPTIONAL, 'Which filter root to use. Defaults to [SITEROOT] or [SITEDB] depending on the filter type.', '');
		$this->addOption('filterType', null, InputOption::VALUE_REQUIRED, 'The type of filter you want to add: files, directories, skipdirs, skipfiles, regexfiles, regexdirectories, regexskipdirs, regexskipfiles, tables, tabledata, regextables, regextabledata', 'files');
		$this->addOption('profile', null, InputOption::VALUE_OPTIONAL, 'The backup profile to use. Default: 1.', 1);

		$this->setDescription('Set an exclusion filter to Akeeba Backup.');
		$this->setHelp($help);
	}
}
components/com_akeeba/CliCommands/ProfileModify.php000060400000006325152453623440016463 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Backup\Admin\Model\Profiles;
use Exception;
use FOF40\Container\Container;
use FOF40\Model\DataModel\Exception\RecordNotLoaded;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Akeeba\Backup\Admin\CliCommands\MixIt\PrintFormattedArray;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:profile:modify
 *
 * Modifies an Akeeba Backup profile
 *
 * @since   7.5.0
 */
class ProfileModify extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities, PrintFormattedArray;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:profile:modify';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$id = (int) $this->cliInput->getArgument('id') ?? 0;

		$container = Container::getInstance('com_akeeba');

		/** @var Profiles $model */
		$model = $container->factory->model('Profiles')->tmpInstance();

		try
		{
			$profile = $model->findOrFail($id);
		}
		catch (RecordNotLoaded $e)
		{
			$this->ioStyle->error(sprintf("Cannot modify profile %s; profile not found.", $id));

			return 1;
		}

		$description = (string) $this->cliInput->getArgument('description') ?? 0;

		if (!is_null($description))
		{
			$profile->description = $description;
		}

		$profile->quickicon = (bool) $this->cliInput->getArgument('quickicon') ?? $profile->quickicon;

		try
		{
			$newProfile = $profile->save();
		}
		catch (Exception $e)
		{
			$this->ioStyle->error(sprintf("Cannot modify profile #%s: %s", $id, $e->getMessage()));

			return 2;
		}

		$this->ioStyle->success(sprintf("Profile #%s modified successfully.", $newProfile->getId()));

		return 0;
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will modify an Akeeba Backup profile.
		\nUsage: <info>php %command.full_name%</info>";

		$this->addArgument('id', InputOption::VALUE_REQUIRED, 'The numeric ID of the profile to modify');
		$this->addOption('description', null, InputOption::VALUE_OPTIONAL, 'Description for the new backup profile. Uses the old profile\'s description if not specified.', null);
		$this->addOption('quickicon', null, InputOption::VALUE_OPTIONAL, 'Should the new backup profile have a one-click backup icon? Copies the old profile\'s setting if not specified.', null);

		$this->setDescription('Modifies an Akeeba Backup profile');
		$this->setHelp($help);
	}
}
components/com_akeeba/CliCommands/ProfileExport.php000060400000006004152453623440016507 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Backup\Admin\Model\Profiles;
use Akeeba\Engine\Factory;
use FOF40\Container\Container;
use FOF40\Model\DataModel\Exception\RecordNotLoaded;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Akeeba\Backup\Admin\CliCommands\MixIt\PrintFormattedArray;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:profile:export
 *
 * Exports an Akeeba Backup profile as a JSON string.
 *
 * @since   7.5.0
 */
class ProfileExport extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities, PrintFormattedArray;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:profile:export';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$id      = (int) $this->cliInput->getArgument('id') ?? 0;
		$filters = (bool) $this->cliInput->getOption('filters') ?? false;

		$container = Container::getInstance('com_akeeba');

		/** @var Profiles $model */
		$model = $container->factory->model('Profiles')->tmpInstance();

		try
		{
			$profile = $model->findOrFail($id);
		}
		catch (RecordNotLoaded $e)
		{
			$this->ioStyle->error(sprintf("Cannot export profile %s; profile not found.", $id));

			return 1;
		}

		$data = $profile->toArray();

		if (!$filters)
		{
			unset($data['filters']);
		}

		unset($data['id']);

		// Decrypt configuration data if necessary
		if (substr($data['configuration'], 0, 12) == '###AES128###')
		{
			// Load the server key file if necessary
			$key = Factory::getSecureSettings()->getKey();

			$data['configuration'] = Factory::getSecureSettings()->decryptSettings($data['configuration'], $key);
		}

		echo json_encode($data);

		return 0;
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will exports an Akeeba Backup profile as a JSON string.
		\nUsage: <info>php %command.full_name%</info>";

		$this->addArgument('id', InputOption::VALUE_REQUIRED, 'The numeric ID of the profile to modify');
		$this->addOption('filters', null, InputOption::VALUE_NONE, 'Include the filter settings?', false);

		$this->setDescription('Exports an Akeeba Backup profile as a JSON string');
		$this->setHelp($help);
	}
}
components/com_akeeba/CliCommands/LogList.php000060400000007204152453623440015265 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Backup\Admin\Model\Log;
use Akeeba\Engine\Factory;
use FOF40\Container\Container;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Akeeba\Backup\Admin\CliCommands\MixIt\PrintFormattedArray;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:log:list
 *
 * Lists log files known to Akeeba Backup
 *
 * @since   7.5.0
 */
class LogList extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities, PrintFormattedArray;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:log:list';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$profile_id = max(1, (int) $this->cliInput->getArgument('profile_id') ?? 1);
		$format     = (string) ($this->cliInput->getOption('format') ?? 'table');

		define('AKEEBA_PROFILE', $profile_id);

		$configuration   = Factory::getConfiguration();
		$outputDirectory = $configuration->get('akeeba.basic.output_directory');

		if ($format === 'table')
		{
			$this->ioStyle->title(sprintf('List of Akeeba Backup log files for output directory %s', $outputDirectory));
		}

		$container = Container::getInstance('com_akeeba', [], 'admin');

		/** @var Log $model */
		$model = $container->factory->model('Log')->tmpInstance();

		$output = array_map(function ($tag) use ($outputDirectory) {
			$possibilities = [
				$outputDirectory . '/akeeba.' . $tag . '.log',
				$outputDirectory . '/akeeba.' . $tag . '.log.php',
				$outputDirectory . '/akeeba' . $tag . '.log',
				$outputDirectory . '/akeeba' . $tag . '.log.php',
			];

			$path = null;

			foreach ($possibilities as $possiblePath)
			{
				if (@is_file($possiblePath))
				{
					$path = $possiblePath;

					break;
				}
			}

			if (empty($path))
			{
				return null;
			}

			return [
				'tag'           => $tag,
				'absolute_path' => $path,
			];

		}, $model->getLogFiles());

		$output = array_filter($output, function ($x) {
			return !is_null($x);
		});

		return $this->printFormattedAndReturn(array_values($output), $format);
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will list all log files in the output directory of the Akeeba Backup profile specified. Note: log files from other backup profiles or Akeeba Backup installations sharing the same output directory will also be listed.
		\nUsage: <info>php %command.full_name%</info>";

		$this->addArgument('profile_id', InputArgument::OPTIONAL, 'Log files in the output directory of this Akeeba Backup profile will be listed', 1);
		$this->addOption('format', null, InputOption::VALUE_OPTIONAL, 'Output format: table, json, yaml, csv, count.', 'table');
		$this->setDescription('Lists log files known to Akeeba Backup');
		$this->setHelp($help);
	}
}
components/com_akeeba/CliCommands/ProfileList.php000060400000004665152453623440016154 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Backup\Admin\Model\Profiles;
use FOF40\Container\Container;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Akeeba\Backup\Admin\CliCommands\MixIt\PrintFormattedArray;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:profile:list
 *
 * Lists the Akeeba Backup backup profiles
 *
 * @since   7.5.0
 */
class ProfileList extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities, PrintFormattedArray;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:profile:list';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$format    = (string) $this->cliInput->getOption('format') ?? 'table';
		$container = Container::getInstance('com_akeeba');

		/** @var Profiles $model */
		$model    = $container->factory->model('Profiles')->tmpInstance();
		$profiles = $model->get(true);

		$output = array_map(function (array $profile) {
			return [
				'id'          => $profile['id'],
				'description' => $profile['description'],
				'quickicon'   => $profile['quickicon'],
			];
		}, $profiles->toArray());

		return $this->printFormattedAndReturn($output, $format);
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will list the Akeeba Backup backup profiles.
		\nUsage: <info>php %command.full_name%</info>";


		$this->addOption('format', null, InputOption::VALUE_OPTIONAL, 'Output format: table, json, yaml, csv, count.', 'table');

		$this->setDescription('Lists the Akeeba Backup backup profiles');
		$this->setHelp($help);
	}
}
components/com_akeeba/CliCommands/OptionsGet.php000060400000007665152453623440016016 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Backup\Admin\Model\Profiles;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use FOF40\Container\Container;
use FOF40\Model\DataModel\Exception\RecordNotLoaded;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Akeeba\Backup\Admin\CliCommands\MixIt\JsonGuiDataParser;
use Akeeba\Backup\Admin\CliCommands\MixIt\PrintFormattedArray;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:option:get
 *
 * Gets the value of a configuration option for an Akeeba Backup profile
 *
 * @since   7.5.0
 */
class OptionsGet extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities, PrintFormattedArray, JsonGuiDataParser;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:option:get';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$container = Container::getInstance('com_akeeba');
		$profileId = (int) ($this->cliInput->getOption('profile') ?? 1);

		define('AKEEBA_PROFILE', $profileId);

		$format = (string) $this->cliInput->getOption('format') ?? 'text';

		/** @var Profiles $model */
		$model = $container->factory->model('Profiles')->tmpInstance();

		try
		{
			$model->findOrFail($profileId);
		}
		catch (RecordNotLoaded $e)
		{
			$this->ioStyle->error(sprintf("Could not find profile #%s.", $profileId));

			return 1;
		}

		unset($model);

		// Get the profile's configuration
		Platform::getInstance()->load_configuration($profileId);
		$config = Factory::getConfiguration();

		$key   = (string) $this->cliInput->getArgument('key') ?? '';
		$value = $config->get($key, null, false);

		if (!is_null($value) && !is_scalar($value))
		{
			$this->ioStyle->error(sprintf("This command cannot return multiple values given the partial key prefix “%s”. Please supply they exact key name you want to retrieve. Use the akeeba:option:list command to see the available keys with the prefix %s.", $key, $key));

			return 2;
		}

		if (is_null($value))
		{
			$this->ioStyle->error(sprintf("Invalid key “%s”.", $key));

			return 3;
		}

		switch ($format)
		{
			case 'text':
			default:
				echo $value . PHP_EOL;
				break;

			case 'json':
				echo json_encode($value) . PHP_EOL;
				break;

			case 'print_r':
				print_r($value);
				echo PHP_EOL;
				break;

			case 'var_dump':
				var_dump($value);
				echo PHP_EOL;
				break;

			case 'var_export':
				var_export($value);
				break;

		}

		return 0;
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will get the value of a configuration option for an Akeeba Backup profile.
		\nUsage: <info>php %command.full_name%</info>";

		$this->addArgument('key', InputOption::VALUE_REQUIRED, 'The option key to retrieve');
		$this->addOption('profile', null, InputOption::VALUE_OPTIONAL, 'The backup profile to use. Default: 1.', 1);
		$this->addOption('format', null, InputOption::VALUE_OPTIONAL, 'Output format: text, json, print_r, var_dump, var_export.', 'text');

		$this->setDescription('Gets the value of a configuration option for an Akeeba Backup profile');
		$this->setHelp($help);
	}
}
components/com_akeeba/CliCommands/BackupDelete.php000060400000006207152453623440016242 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Backup\Admin\Model\Statistics;
use FOF40\Container\Container;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:backup:delete
 *
 * Deletes a backup record known to Akeeba Backup, or just its files
 *
 * @since   7.5.0
 */
class BackupDelete extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:backup:delete';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$id        = (int) $this->cliInput->getArgument('id') ?? 0;
		$onlyFiles = $this->cliInput->getOption('only-files');

		$this->ioStyle->title(sprintf('Deleting Akeeba Backup record #%d', $id));

		if ($id <= 0)
		{
			$this->ioStyle->error('Invalid backup record');

			return 1;
		}

		$container = Container::getInstance('com_akeeba', [], 'admin');
		/** @var Statistics $model */
		$model = $container->factory->model('Statistics')->tmpInstance();
		$model->setState('id', $id);

		try
		{
			if ($onlyFiles)
			{
				$model->deleteFile();

				$this->ioStyle->success(sprintf('The files of backup record #%d have been deleted.', $id));

				return 0;
			}

			$model->delete();

			$this->ioStyle->success(sprintf('The backup record #%d has been deleted.', $id));

		}
		catch (\RuntimeException $e)
		{
			if ($onlyFiles)
			{
				$this->ioStyle->error(sprintf('Cannot delete the files of backup record #%d: %s', $id, $e->getMessage()));
			}
			else
			{
				$this->ioStyle->error(sprintf('Cannot delete backup record #%d: %s', $id, $e->getMessage()));
			}

			return 1;
		}

		return 0;
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will delete a backup record known to Akeeba Backup, or just its files
		\nUsage: <info>php %command.full_name%</info>";

		$this->addArgument('id', InputArgument::REQUIRED, 'The id of the backup record to delete');
		$this->addOption('only-files', null, InputOption::VALUE_NONE, 'Only delete the backup files stored on the site\'s server, not the record itself.');
		$this->setDescription('Deletes a backup record known to Akeeba Backup, or just its files');
		$this->setHelp($help);
	}
}
components/com_akeeba/CliCommands/LogGet.php000060400000005131152453623440015066 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Backup\Admin\Model\Log;
use FOF40\Container\Container;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Akeeba\Backup\Admin\CliCommands\MixIt\PrintFormattedArray;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:log:get
 *
 * Retrieves log files known to Akeeba Backup
 *
 * @since   7.5.0
 */
class LogGet extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities, PrintFormattedArray;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:log:get';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$profile_id = max(1, (int) $this->cliInput->getArgument('profile_id') ?? 1);
		$log_tag    = (string) $this->cliInput->getArgument('log_tag') ?? 1;

		define('AKEEBA_PROFILE', $profile_id);

		$container = Container::getInstance('com_akeeba', [], 'admin');

		/** @var Log $model */
		$model = $container->factory->model('Log')->tmpInstance();
		$model->setState('tag', $log_tag);
		$model->echoRawLog(true);

		return 0;
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will retrieve a log file from the output directory of the Akeeba Backup profile specified. Note: log files from other backup profiles or Akeeba Backup installations sharing the same output directory can also be retrieved.
		\nUsage: <info>php %command.full_name%</info>";

		$this->addArgument('profile_id', InputArgument::REQUIRED, 'Log files in the output directory of this Akeeba Backup profile will be retrieved');
		$this->addArgument('log_tag', InputArgument::REQUIRED, 'The tag of the log file to retrieve');
		$this->setDescription('Retrieve a log file known to Akeeba Backup');
		$this->setHelp($help);
	}
}
components/com_akeeba/CliCommands/OptionsSet.php000060400000013423152453623440016017 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\CliCommands;

defined('_JEXEC') || die;

use Akeeba\Backup\Admin\Model\Profiles;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use FOF40\Container\Container;
use FOF40\Model\DataModel\Exception\RecordNotLoaded;
use Joomla\Console\Command\AbstractCommand;
use Akeeba\Backup\Admin\CliCommands\MixIt\ArgumentUtilities;
use Akeeba\Backup\Admin\CliCommands\MixIt\ConfigureIO;
use Akeeba\Backup\Admin\CliCommands\MixIt\JsonGuiDataParser;
use Akeeba\Backup\Admin\CliCommands\MixIt\PrintFormattedArray;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * akeeba:option:set
 *
 * Sets the value of a configuration option for an Akeeba Backup profile
 *
 * @since   7.5.0
 */
class OptionsSet extends AbstractCommand
{
	use ConfigureIO, ArgumentUtilities, PrintFormattedArray, JsonGuiDataParser;

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  7.5.0
	 */
	protected static $defaultName = 'akeeba:option:set';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   7.5.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$this->configureSymfonyIO($input, $output);

		$container = Container::getInstance('com_akeeba');
		$profileId = (int) ($this->cliInput->getOption('profile') ?? 1);

		define('AKEEBA_PROFILE', $profileId);

		$format = (string) $this->cliInput->getOption('format') ?? 'text';

		/** @var Profiles $model */
		$model = $container->factory->model('Profiles')->tmpInstance();

		try
		{
			$model->findOrFail($profileId);
		}
		catch (RecordNotLoaded $e)
		{
			$this->ioStyle->error(sprintf("Could not find profile #%s.", $profileId));

			return 1;
		}

		unset($model);

		// Get the profile's configuration
		Platform::getInstance()->load_configuration($profileId);
		$config = Factory::getConfiguration();

		$key   = (string) $this->cliInput->getArgument('key') ?? '';
		$value = (string) $this->cliInput->getArgument('value') ?? '';

		// Get the key information from the GUI data
		$info = $this->parseJsonGuiData();

		// Does the key exist?
		if (!array_key_exists($key, $info['options']))
		{
			$this->ioStyle->error(sprintf("Invalid option key '%s'.", $key));

			return 2;
		}

		// Validate / sanitize the value
		$optionInfo = $this->getOptionInfo($key, $info);

		switch ($optionInfo['type'])
		{
			case 'integer':
				$value = (int) $value;

				if (($value < $optionInfo['limits']['min']) || ($value > $optionInfo['limits']['max']))
				{
					$this->ioStyle->error(sprintf("Invalid value '%s': out of bounds.", $value));

					return 3;
				}
				break;

			case 'bool':
				if (is_numeric($value))
				{
					$value = (int) $value;
				}
				elseif (is_string($value))
				{
					$value = strtolower($value);
				}

				if (in_array($value, [false, 0, '0', 'false', 'no', 'off'], true))
				{
					$value = 0;
				}
				elseif (in_array($value, [true, 1, '1', 'true', 'yes', 'on'], true))
				{
					$value = 1;
				}
				else
				{
					$this->ioStyle->error(sprintf("Invalid boolean value '%s': use one of 0, false, no, off, 1, true, yes or on.'", $value));

					return 3;
				}

				break;

			case 'enum':
				if (!in_array($value, $optionInfo['options']))
				{
					$options = array_map(function ($v) {
						return "'$v'";
					}, $optionInfo['options']);
					$options = implode(', ', $options);

					$this->ioStyle->error(sprintf("Invalid enumerated value '%s'. Must be one of %s.", $value, $options));

					return 3;
				}

				break;

			case 'hidden':
				$this->ioStyle->error(sprintf("Setting hidden option '%s' is not allowed.", $key));

				return 3;
				break;

			case 'string':
				break;

			default:
				$this->ioStyle->error(sprintf("Unknown type %s for option '%s'. Have you manually tampered with the option JSON files?", $optionInfo['type'], $key));

				return 3;
				break;
		}

		$protected = $config->getProtectedKeys();
		$force     = isset($assoc_args['force']) && $assoc_args['force'];

		if (in_array($key, $protected) && !$force)
		{
			$this->ioStyle->error(sprintf("Cannot set protected option '%s'. Please use the --force option to override the protection.", $key));

			return 4;
		}

		if (in_array($key, $protected) && $force)
		{
			$config->setKeyProtection($key, false);
		}

		$result = $config->set($key, $value, false);

		if ($result === false)
		{
			$this->ioStyle->error(sprintf("Could not set option '%s'.", $key));

			return 5;
		}

		Platform::getInstance()->save_configuration($profileId);

		$this->ioStyle->success(sprintf("Successfully set option '%s' to '%s'", $key, $value));

		return 0;
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   7.5.0
	 */
	protected function configure(): void
	{
		$help = "<info>%command.name%</info> will set the value of a configuration option for an Akeeba Backup profile.
		\nUsage: <info>php %command.full_name%</info>";

		$this->addArgument('key', InputOption::VALUE_REQUIRED, 'The option key to set');
		$this->addArgument('value', InputOption::VALUE_REQUIRED, 'The value to set');
		$this->addOption('profile', null, InputOption::VALUE_OPTIONAL, 'The backup profile to use. Default: 1.', 1);
		$this->addOption('force', null, InputOption::VALUE_NONE, 'Allow setting the value of protected options.', false);

		$this->setDescription('Sets the value of a configuration option for an Akeeba Backup profile');
		$this->setHelp($help);
	}
}
components/com_akeeba/Master/.htaccess000060400000000246152453623440014036 0ustar00<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
  <RequireAll>
    Require all denied
  </RequireAll>
</IfModule>
components/com_akeeba/Master/web.config000060400000001025152453623440014200 0ustar00<?xml version="1.0"?>
<!--
    This only works on IIS 7 or later. See https://www.iis.net/configreference/system.webserver/security/requestfiltering/fileextensions
-->
<configuration>
    <system.webServer>
        <security>
            <requestFiltering>
                <fileExtensions allowUnlisted="false" >
                    <clear />
                    <add fileExtension=".html" allowed="true"/>
                </fileExtensions>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>components/com_akeeba/Master/Installers/kickstart.transfer.php000060400000014253152453623440020716 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('KICKSTART') or die;

/**
 * Akeeba Kickstart Site Transfer Helper add-on feature
 *
 * This file allows to remotely transfer files and perform other tasks required during site transfer using Akeeba
 * Backup's Site Transfer Wizard. The features inside this file can only be accessed through Kickstart. Trying to access
 * this file directly will of course fail.
 */
class AKFeatureTransfer
{
	/**
	 * Returns information about the server we're running on.
	 *
	 * @param   array  $params
	 *
	 * @return  array
	 */
	public function serverInfo($params)
	{
		$maxExecTime    = 5;
		$memLimit       = '8M';
		$baseDir        = '';
		$disabled       = '';
		$maxPostSize    = '2M';
		$uploadMaxSize  = '2M';

		if (function_exists('ini_get'))
		{
			$maxExecTime    = ini_get("max_execution_time");
			$memLimit       = ini_get("memory_limit");
			$baseDir        = ini_get('open_basedir');
			$disabled       = ini_get("disable_functions");
			$maxPostSize    = ini_get("post_max_size");
			$uploadMaxSize  = ini_get("upload_max_filesize");

			if (empty($maxExecTime))
			{
				$maxExecTime = 5;
			}
		}

		$server = 'n/a';

		if (isset($_SERVER['SERVER_SOFTWARE']))
		{
			$server = $_SERVER['SERVER_SOFTWARE'];
		}
		elseif (($sf = getenv('SERVER_SOFTWARE')))
		{
			$server = $sf;
		}

		$infoArray = array(
			'freeSpace'     => disk_free_space(dirname(__FILE__)),
			'phpVersion'    => PHP_VERSION,
			'phpSAPI'       => PHP_SAPI,
			'phpOS'         => PHP_OS,
			'osVersion'     => php_uname('s'),
			'server'        => $server,
			'canWrite'      => $this->canWriteToFiles(),
			'canWriteTemp'  => $this->canWriteToFiles('kicktemp'),
			'maxExecTime'   => $maxExecTime,
			'memLimit'      => $this->memoryToBytes($memLimit),
			'maxPost'       => $this->memoryToBytes($maxPostSize),
			'maxUpload'     => $this->memoryToBytes($uploadMaxSize),
			'baseDir'       => $baseDir,
			'disabledFuncs' => $disabled,
		);

		return $infoArray;
	}

	public function uploadFile($params)
	{
		// Get the parameters describing the upload
		$file      = isset($_GET['file']) ? $_GET['file'] : '';
		$directory = isset($_GET['directory']) ? $_GET['directory'] : '';
		$frag      = isset($_GET['frag']) ? $_GET['frag'] : 0;
		$fragSize  = isset($_GET['fragSize']) ? $_GET['fragSize'] : 1048576;
		$data      = isset($_POST['data']) ? $_POST['data'] : '';
		$dataFile  = isset($_GET['dataFile']) ? $_GET['dataFile'] : '';

		// We need a file
		if (empty($file))
		{
			return array(
				'status'    => false,
				'message'   => 'You have not specified a file'
			);
		}

		// Let's make sure the remote end is not trying to do something nasty
		$file = basename($file);
		$pos = strrpos($file, '.');

		if ($pos === false)
		{
			return array(
				'status'    => false,
				'message'   => 'Invalid file name specified'
			);
		}

		$extension = substr($file, $pos + 1);

		if (empty($extension))
		{
			return array(
				'status'    => false,
				'message'   => 'Invalid file name specified'
			);
		}

		if (!preg_match('(jpa|zip|jps|j[\d]{2,}|z[\d]{2,})', $extension))
		{
			return array(
				'status'    => false,
				'message'   => 'Invalid file name specified'
			);
		}

		// We only allow very specific directories
		$directory = trim($directory, '/');

		if (!in_array($directory, array('', 'kicktemp')))
		{
			return array(
				'status'    => false,
				// Yes, the message is intentionally vague
				'message'   => 'Invalid directory name specified'
			);
		}

		// If a data file was given, read it to memory
		if (empty($data) && !empty($dataFile))
		{
			$slashedDir = ($directory === '') ? '/' : sprintf('/%s/', $directory);

			// Do not remove the basename(). It makes sure we won't try to read a file outside our directory.
			$data = @file_get_contents(__DIR__ . $slashedDir . basename($dataFile));

			if (empty($data))
			{
				return array(
					'status'    => false,
					'message'   => 'The partial data file ' . basename($dataFile) . ' does not seem to have been uploaded.'
				);
			}
		}

		// We need some data to write, yes?
		if (empty($data))
		{
			return array(
				'status'    => false,
				'message'   => 'No data specified'
			);
		}

		if (!empty($directory))
		{
			$directory = '/' . $directory;
		}

		$filename = __DIR__ . $directory . '/' . $file;

		// Open the file for writing or append
		$mode = ($frag == 0) ? 'w' : 'a';
		$fp = @fopen($filename, $mode);

		if ($fp === false)
		{
			$modeHuman = ($mode == 'w') ? 'write' : 'append';

			return array(
				'status'    => false,
				'message'   => "Cannot open $file for $modeHuman"
			);
		}

		// Seek to the correct offset
		$offset = $frag * $fragSize;
		@fseek($fp, $offset);

		// Write to the file
		$written = @fwrite($fp, $data);

		@fclose($fp);

		if (!$written || ($written != strlen($data)))
		{
			return array(
				'status'    => false,
				'message'   => "Cannot write to $file"
			);
		}

		return array(
			'status'    => true,
			'message'   => ''
		);
	}

	/**
	 * Can I write to arbitrary files in the Kickstart directory?
	 *
	 * @return   bool
	 */
	private function canWriteToFiles($directory = '')
	{
		// Try to create a temporary file
		$directory = dirname(__FILE__) . '/' . $directory;
		$directory = rtrim($directory, '/');

		$testFilename = tempnam($directory, 'kst');

		// Failed completely?
		if ($testFilename === false)
		{
			return false;
		}

		// File created in another directory?
		if (dirname($testFilename) != $directory)
		{
			@unlink($testFilename);

			return false;
		}

		@unlink($testFilename);

		return true;
	}

	/**
	 * Converts a human formatted size to integer representation of bytes,
	 * e.g. 1M to 1024768
	 *
	 * @param   string  $setting  The value in human readable format, e.g. "1M"
	 *
	 * @return  integer  The value in bytes
	 */
	private function memoryToBytes($setting)
	{
		$val = trim($setting);
		$last = strtolower(substr($val, -1));

		if (is_numeric($last))
		{
			return $setting;
		}

		switch ($last)
		{
			case 't':
				$val *= 1024;
			case 'g':
				$val *= 1024;
			case 'm':
				$val *= 1024;
			case 'k':
				$val *= 1024;
		}

		return (int) $val;
	}
}
components/com_akeeba/Master/Installers/angie.jpa000060400002164422152453623440016150 0ustar00JPA�hz��JPF.installation/offline.html����T�N�0��>�Y~Q)�
!�.T�Cc
�Nr�x��n!���w�P�&��vs��|��7�=�����0�����7�{a4�Š�Ce,伸Y7�mQ�
:(,r�%�-�� ����J��4!ILtܐ���LV;aa�֊U���㿽b4�N�|:߇Q�Fr_��0��4f-���6͹/�`R�]�pz�NQ��.�9)�WnкP�~
T��",y3���+I"�:JP'K /��A慗��F�5V�LU1)4Frڣ�l�ْ�B�As�GIALX�&P�`��-��I���m��l�7�zz*�aW�{�7�D�Z�Q���|��U��L�)$W�2?Β���x�����)�X�e
�k�ZQ��IJ�@P�2?E����V�F&��zF��A���/\�l|�*^�B�!�F-�Q�[�}��ZP�)J����M��g��4�@��E}�Lc��8<��Qp+J_���]
�HNtV����yQ��?�P�PD��Ҍ&D�]9A���\w��\	���鴡��P��j���x�Y�A��5k].�q3��73T�����?�=�K�v1�S�H���Rp�k,V4Hl����G]����Ӈ�N}
�t�ۢ���Ey�óӃt�&�l���ذf�~$�Iwda2i+�
��\���(:�A:��Y�׵p�-K��m2Γ�;kb�K�����(�L�'�
o�Zn��u>�8����z�p�-�JPF-installation/defines.php�e��}R�n�0��wQ�4J�(]U�ь���*��+d�6X%ز�j�5����ze����,�3	�ԃHJ�
�Bm�b��t��4�&d,�I`*/�j�2�d{ ��YǨ��I,*a3���Ңl����؞�B�ߔ��� ��N&�7������b�oaa�k!ŮƇ��W�s�u�^`�5*V�z�Y��@��^w#��*[@Y��q
|�5�6��0�{�4�☆A�콺#p��3�$O�Ğ��+M4JSK��� N����5�Ϲ�L
?��J8��7O����ID�v�8�aJ�}*�|��sEa���ŷ�xw&}��&�N޽��0x�˗���*Y�h@�M���-�cVly͵�?P(����,"��n����Su_�<y���<����+�1�a���u���V6�OJPF+installation/index.php�	d���Xms�6�,��m�IKrҤ�Ų/���Jeǵ���u:��,�I�!@˺&���$E���L�
`_�����ʖ�3x�ġ'4:y7v�G�� iA�PZ澎dJ*ȣL�B�4���"#?�ѥP���"���FB�}zS�H�je*c	,�u�]�\�y$�Z �u�/5�_���lg矽g;Ͼ��(X��W�S���Z�L�T4�dLthx�Q R�ߝ|�w"��i1�M��K�+��ۄ+Ÿ@���1
d��T��)2��*J�)�RAZ�H�y,�P̋s:��Q(��G?�w����MO����2��%�*�5�C�5-aJD"�Ͷ̋TG�Qi�loJOGo&�w4~w�M���ٴ���7��)�-�6��x]^)$X$�XZJ��LY�r)b��ʉ��
oܹK��?.����ٿݳ_�G�٩w�a:k�f�;w�����k���g�b�t~7�6���t������v��u~wZ_�����+j��2�r�ɜ]�q��dB��N>����<tO�܃��=d#���HO\EJ�N;J#�`�-�m����He����$Uj���]�,�c�(��P�m@4��G�«%�)�-�d�-<S f��c��̪�|]o��mo߁5k�������k?�mw�� N����x��c}dP�r�JĜn�|��Ѹ�b�Tn��fͨS6-1�ˀ�#�2c@NY&�q^{/e��7߻�q���xR$tztZ'�`)�����D)/W��N{��ʅ
�P�|[/�ϱa�^��p�/�	(��?�lS���uiݭ��-���(O�Dt<����ԧ��q[jmgwL�}Dա�e$VjZ�&��WȔV��|�H��,�{'�\|*y|��"��J��#V%r��"X��&�뒛�S��d�����
�M�m��Ssτ��M3����[
�ŸIe8�D��-��~;�
͆�=3IRY�z�ydQ.E��~
��u��9Z���f?���kZ�E_PP�|H,��Z�$����-��Y�!�fl��
�+�f��G��{��9n�;��?�*�&BMR�q(XYpCYSՈ؟�8�<�TH��.�v"���ݼb6>s
�-�r�b�CZ;�<?Ӝ�"�`�"��[�c�QSOc,��ћ�%׊���O2է�����[�����R`c�[�n�^�E'0m�-L�L������،�*��s�~���J�%����R����S�M�&��e��r�v�/y:�y����퇳�����6���d��lt6v�%mk|�CQ�i�c)3�/VU��`�c���r��s�AS���n:�N�M�T��j�F���O�342�w2:vk�u�t�!D�i���]���qe�}�R���A���ڍ�{��۴�Om������K݁�L05H �i�=�����0*���HG~�����d���m����C�ay�&<㒞�<����2c�+�!�,4�ru�w�I�h����]!���L�c�lo�X�TH�\����^"3��W�u��ns��{�_i�+%�p��=�U�$>|�ʹm�Z�-|�-�
��{|Z�͠�(�N��!lA�}�
�CrOk�Q�N�^9�L �E8{��8�p2�H�`�լ�G��~Y�m��nl|���8O�'7ˊ�tt��5
u�����i5Y�i��_ⲱ�V]�"]��w!4a�
`k6�څm��~za>qk�D(�i����������VD�p���“��)�A"�zE��ꄓ��d��:!#55m��Ìl[��8z�26���}�k�0�PN�EW�YNٍ���������Q#l���U5�c��$ֿܳ��V;\��{�NM��a��窐�׮�X��4*[�<6G�fX]굜{�u�;�	y�N	)�/�i�i ßd`���U�<�}��$,��m3&X��S���x��O�oe����3���Xs��7�D3i(�}3��f��\� ���[6m�('�̀^��vF���y��G �����Wt�S	rң}����D������~���w!�|*P4k+c��m1k���C��"�4�L�"@nj���R�0�$cʽG�y���c\�z,r�Z
�/�o:�q�j�Kw%X��Av3�zuG���:��1f���Q���w����۲�F�K���h�F�r3�U���-�肗>'�F��C�0Z,�y�('7c`�
���#5�U�}�6w��F�i����ɯ_v�޻�r�i�ÍKnѹ��/������5<��}���Q�T�����)�ᵦ%���ZТ�r���"��9�fC$u�ަkH>�T�SwA]�����cpeg���B�.̓�I�W�m���n<n���mܲ#/�Qx$L�Q0�m��qc�������˧����"�S��
���������N��|�|m��A�c@`���f���.��y>����f�JPF@+installation/framework/database/factory.php�]���Wmo�6�l��+�Ar��i�}h��M�,�ڤ��b��.����E&U���
��#)Y��t���_��{��9�����>��C8�:�8�}x7G��!�N�V`3#KSm`"���a��\��̠p��d
'7���	��+ou���yVҮ�!�I�k�.�F��^4��lxxp�d����1\�l�a��Nɡ�ե�
ma\�x�r�U��e��p�
�(�M5�
x7�h,�x(��0ty���8�
�4�>yyv��$�\b:��_S�n.-Le��kȴrB*���F/��?i�(�xC�D�bo;4�ؾ�}F;<xt�KTDSe2�K���*������wP
�@Oo�2b��Gs4rI�["������
�X���RF|�*��g���F/%Sc�	���Q`-��i��S��D�?��J���Z����D<���c����Z�VV��u.pBe�W��gKa(�]h�i%�xt8z��~��,Q�;�*��u�Ǡ����7.]������p�Q 6fN	�8ln�ZTb���{�rJ� uҦA�.􄨍�>StKy�|�;��%frJn�����޺G��^M""��ӂ���jN���Guⴷ3A��cnqϸV
3�Q-���n]#;����^0���� M`�Ԗ���5Y��4Zv��
렷��d)\���I��Vd��%�1�k�P�J뭕T�tR�ha��<��{T�e�v��q�U�h5��ts¦��ZA�P�!���;�n$4bAuj��j0Pb��p�_b�$ֺJr(�g#���6h��@�p�
�p�8������3Vz����\H��n� �Jf���4�z�bm?2��y\O��~���7�[���ᶟ�:���N�0��Q�88&M�ٵ�����'���?��}��q��v��"��B��#���s�m��!<�[�E
i��F
�uP�����8S!��s�"�	��m�P��� l�;�L`U6�ƺ�j�Ѥ^q�:T��ыiˠu�(�'���,�o�� ��vs.���+-�ʫ��^Q���� 1�+y+I0+za�ܱ�r
�o����4D��᫣�����xV#���]�i��WbR�v)��73)���Vn���}�!��b�ck�Ͱ��-ٯ��+G�x��9C�!���h��˄#�Nw��G��u�ב�D�ԩ��f3z�h�J�8N_Z��Y}�fF	��I�R�;��5�7��r[F��F��@�"ӣ���]:�N_�؍d��As��_�b���=�E�ߒ�F�aE��i\�ڐ^�@m#v�x�O���9=$�z���}�O��Î��gG�c�w`|)���JCh�<�'��N8nx�m��Bo�.�c���KA����Ɖ�S�
�'~}7��bAR��(?fD]<������+*�4����3�[�<��x[����_t�����#�>V��U��o�V#��5���Fw���پS]�Z�+�m)Jw��s V\GX�wt�K�JPFC.installation/framework/database/driver/pdo.php�^���<�SG�?�_1��H�8����	�pgA�R�B�펤=�v�����~�13;�˜佼�rٰ;�����ӳ���l2[��u�88���Xl��D�4ȔHT�ʼn̂8���L��D��n>2�&��J��(�)_���RC)^��o���0�5p�og�V��0`(z�ųe�'�8�?���ݝ��m���>��7�C��t� �L�Y<�Tl�5�d>�
OE)���R|�"��P�χ�B��/oT�⾞wl)�
$0y{�c0	R1
B%�r)�8�d����$����8���3qӁ0�Nyؿ[mw�ٮ8��1O<%��VL;�$��b���@�d��xT�J�d8�WIp��Qb'��^�d.��0(�ν	�?S	�%�M��O���T�]Ώ�đ��P�`yz|I
wS���,����A���ʶg~�o�v/�uw��Y"���@f��~,ԇLE~����k3F3̀�����,��[__C�׈�JDr�E}��O��8�~{#D�
�1?r0^C�Ͳ�f5)EK��@�"�:�j� t
�$�Q�6�Q.�C���6�͓DE�x?W�H��9+)�b�V�#�D.�v�/�p�}1�a��$�&y��v�)�)�b@�ohq5E��2���C�������k�@�4@/�>�Ο�~� � R�m�w��Qi*�%�9		�*�r�y$�>E6�o
�N�,�&0�WFx7�]G(�=I�90A�!���p`�k3QP�i���� ��t_�˹�8�@��'�'y����/*�A�f p���1�-����,be�l�4�~��@cX`�hޱ���$�72�+���=dװ�#I�n�-�+vvz��o��0�Jgum��w�n��*32�
�u��w��!�mQ� �PF���5*�
s\��#�'�F��؈gYn��)��($,2
��E77&9H�êI�#�N�מA�mV�\_����
n"iZ����i��x�Ú��S�E�����E;���C67�7�ffO�b����(������4Y7��̅W�����y0�=ү%D�v�u��!el�U����(�P=�
p

����Pgn0����B`���B�'~�U��u�0�B�(��1�,�k��Q���J5`��k3�&�a�O@?NQŋ�nd�S#5g�RN�����U ��Δ�@Q(t����'*�'�gC�?�������[
�J%� u�g�&��*t���Y��ujkE��j{�n]]~��`pq}tq����Ӄ�ǭ2��T��ZŤ�z�A`]���Q�ԅJ�!�@q�G$�27_e4��~v'����kI@BP%���VG8
��Yl-l�|�J��7���Q�“H-���
�(8�lYE:ˡ���Du�Q��]Ȭ��r���6AS⭶;	���m�>p����fv��Md�"����r�%�V{S�k&>�\|f��3#��@A�ذI��MD�1Y#�\���]Kގ(A#1X#Q0"\;�$.?�wJ`J:�QO�E�YY���b'�ǜ9���%�G
�H^b4��Sr��[ʿ��dz��63#���l��3�.����<53�r^_F�Ì ��Ұ�I�1�#q�辑]���?��-�55�N�T��=��M6	ab>����z#�h���Z�z+i��j�.Ѣ���]瀊�;�VG<�t�/����9���x
��$�~���E��B��dq/ �*��19�-�(cx!��d�a�M2|�!�[�|���#,���\s�{��S{�s���,�ol߬���h��g���=�����~����O�^��y�2 ����O-�Tm�$��L�y�'�&��TF�ôN���y�Fgv�����A���H�g_>^�%��g#%��j$�*�;/j$�,�[�p� �
���G�������d��t�-���S$ƾ�%��d�Z�����4En'	.��F�b�喕QИ+5���[��e��w��7|�]�Y����_�կ��Y��ᭂf�ԯ���=Jc/�f�K�&�%zfy��B�xx�Q�h�J����/ �aմ�g��ó7#�����#,��m�
�?^�;
y��0�H�w��4M߇���U�N�1�;�|����%3~_Րyy2�a���z���E�x��ǟ��.�?�~�蝘��r���^p�sx�oxV����Cj���c8x�|�r��;�H���n�Y|{����"���$1���n���D��{M�+��{euǧ��޻<9�=��3<���������)�F�!ih
���X%�FfV������zu�.g��5�/�|�[5����7处-�ҴD�������am��-V w��/��sH��~��G��%
����b _��<̘�NU����n�	r�e�g�]xͿ��_j*��V��wHMR�3Y}�9m}n`�Ƿך�mCr���cr�?K��X���#��63��T�V�ɬ�Gk6�ߗ�p���;�5Kj��V��R/Zo+�	���1����6��jov�n��gY��/R�)�;d�wNr����N�;��R^]/��+�+W��;�F^�=p+�
L7ΌB9�(H\�U�v]��ie�`O{w��Bysn�Q��s���/vv
��{��ۙ�S���2�h� <�#�0�Y�
=�������'���ؗnO��G�Z�ȧ�!�+H��Hg�1��[i:�N-��������� �v~�ɇb��.�q��%��{��j`Y�͓�X24�1Q	x7��i��9F�Z�c��
.9�/��TղڲW���>����w^�HA��Q�8��Z۽�BҾˇ�A��<�4���,��9P��ILK���)VvDx�6G[�M_ �f�|'g��@�i6NK�D�ѣ׺!t�Xt�D��O���`^�>��������H]3��=!�k�}�^/&*�^$6R]�\�@���-2�;�-2 �*� ��3�F�&�4|��ٗ���0����I}q���<�ov�uq��ڹ��bO\�V?��x�/�������$��BLm�دT��I�:�*�5
a�9]}@Y��m��r2��8�g��LK���������
�J�XC��5� za��^Ύ��iO��V7��ue<lS���@���:�tb�4��HC�^†���7oZv���=i=�'-��a��@����2����������Ut�\]]�<�}Rֿc�%�7h�%�4��f�9��jjZ�C�㺏�y��N�����V�'�d����3����Qc�V

�4�$q�6ۼ��Χ��c�mRP����"�����e&���X��$cw��c겗sl�HSl}��:`����s���C��ʰ�D2�����A�.�2xX8��q{-������ɠ���L��;�c�+
-N"/���1{`�2��YO���a������L�n�@�U����b��S��n����c��gs�E�����	0t�FLם��&�,�ܝ��c�̇[f��>�-�	5���ldQj~��v��ʴ�Xg@�y�@�W!(<��p��Y�A���8
_��{n瘙�mc��R쿄�i��b������C��=F�th��K�����`9����Q�o�Tqө�pͥJ�

���zD�+�A�Qk�/&��x�&��?%�._�+�R4��%��O9���C�����%؍�&`�[�p��
^˚���i<�}�=�eҚ���q1���:��N�QL���ѡIȜ�v��CI��q�O��ӏ����ս/$C:˲2��ex����i݂����^�]�yN�W�t��)%�_Pш�A����3R/��KXʢ�
�%<��}���Y�O#)�!�[5w�
~�G��U̷)�X�_��	��@tD9t�%�X����j�XPoC�&�my82`�w����F5œ��J���(|�"�)�I���*2��U�XXc���~/�>���^�rѥi��=�шSn�C�-"�~��TX�P���Y.�&ģ$J8�����#NN����yy~t08�'��N�1 �oV�"w�4��|s���Wԓ��xq��\^���ک)�"kd��&���(9oMN�"����bM%l�d��?zu_ʖd���>���@<k�){<�cd��qۤLl�4MDy�ݘ�e1��#��HQ8Y�ۤ�$��}ܗ���$�uv�wʫ����&����
m�
&�t���Z��`���\i2���2��p[Ex#��3p���%z��i�����v~A����EM(|ho<�3�=C	����pOѸᒷIE�n�����4hf�ֳNA�$y���5J���p�xM��W����o]�б����ͷb�����^���z3��G���������8֕Ĺ�=Ư�kl��#�)}�@, Z�ąo�C&]JS�-�ҭ
t&�T�}�Ymk�悾�I����$�ͽP��|���0,��H\w��"���2|j�n?�?`��."��g}꫃Z-�����
O�뷦�X넜g�V`*8�7׭�e\X4��έE�%3m9���E�`�U�à{�����?X���O�7�,T�c���L��\�`�����Ȃ�$H�m���mӷ5�	7xBh�P��vDX'F�	ؤ��R�f�o�,&E	�+g͕�A�~��4����>a��b�G�<��˺x�x
{=H�ػ�}�JE��d�8��6C/���εE]���7�U�^~4��'N�f�hY���7�h��)��T �y6��̛h��)�̭^�N]WL�)��
	S��qʑ��\��6]��+��*s1��=U�3�Qذc�?�Bw�	t^c�D‚?Uc/#jx��\�ٶ;�Mt��k��~N	�̺C�H�5�6x�bn(Zx\��+��ĊiC�����<??��m����jd%����@��u ��D!���$*�N
~)��LJ�v��IU�V\�mb�ƹ�ŏ�w�r�k��	Q�8�=������?5*�3�-��3��%
��)@�AvN��ǺA�s�['A�\ͭ����l�Rj�@(S�!��-/�j��O���r��M��pV��U
qQGW�Ŕ�o"����y�c)�yv���Z�
~`Vq�����.�">C����'�߀�b��ҹ�I�$��.Y��7�
m��r�ml����zr���	��D��3�6��~��4�OP�K���Ns
�땳�|����m���i#�>�I�c���h���6�8i'#GU�T�95}��^^o}�|���^��O��W3`�R��.�ɣp/���H��2J��`�R@�!��A�����P6;�&:�8�vg�փ#�CB�]@���7�S&���#�k�=��r��+�9[m���Ȗ$�ϥI�݃9���ϛ���$6�>�?�I��{0H�UQvRA]sa��������L�%=�	�ߕ�tϮ]����s'�>k �m��q
�	w��oh@����Eo|��^֒�S�FS��K����r��lB�*0Zg1	`a��>�h.~sDzgj��W.�Ԉ��Ο%,�����
#��K{�A�C\����_�^�-�F��䶵>���?N�Yz���I�A�v��ɏ�ڧ��Ƴ��~*���x�9�i��@.�o�����`Ɍ�2�/��*,��'�).o�?Z:�t�mA<;"?Ĺ�J3��8Z�)�:�yD��[�IVu
91U@�e�c�9w~o�v�U�n���N�e��+~�X�/�����Ø\�n�r�t<_����JPFE0installation/framework/database/driver/mysql.php��*���Z�w�F���'�d0rH�sZ�!	4[X���Kc{I#f$;>��{�������`G���߽s_��?+����]r�]�:;%�՜�KF$S����"'*��(�TH2�� T�s�`�Ēђ%d�"G��P�®���R�x ����3F,�q��ŢXI>���������!<���*�SDN@����R����x]&�V�c�+����=y�r&iJ�VxA^ۗ&�͐�J)( a�hw7aS��$�G?���8
� �,<�uP]͹"S�2���E^R��g��T����?��Rz���[6l�F@���C�v��耼)X0U2f䜖 ���<������)�,���r���Y�K&���`d)�'m�8eT�+[~�����Y0�	R,8B�,$��Ƞfq9_]��5IhI'@N@����bh�3/���h��E����4�E6JD<��b0�"G'�Ή&s���.Y�����AIv�݂J�J���^�+Y<�%g+2�@TUB�	�f�R
I���vw
��*Ә�%�BI����92�iƜ�:�D��G�6�=M�E��ed��w�.gq����b-��RD�)�u�6pj���<���5D���dN�D��r%+�$GW����̈�r�U�w
�i��:|pu��;`��&tk�욫R�Fݱ3������	(&+T���g8'v�� �\�!��C�p�>u(�|��+D��e Ԓ�ؼUx��4g,aI��B��ߔ��w��r��j��Vi�j�*�R,P��g��:f
�K�	ɺ~#���� .}��PI�p'} u(���Ƿ�V<HS�0tX��h�wn���@k.���c��	�E�B�HQ0h
}�4+���JT@1i�k
8W�IK8�Fh)ԯ�\�2�8$���{^@d�h��;pO6����d%Ay3�E�&�1��|��s��*�{yzE�?�<��<{s��t�'w��-�7|Φ�V�x�X�Ҁͭ��}�� ��ޛ���yH̆�#�w��AS�֖8��.���޶�O<��Ƙ`��МO�ƣ��E(��Q��z�G" �A���m�N��t��1�g�R}��A������	����=+�s�!$��ѯ��6��*��!�� �E��Sr���10w�vo۵A[G<���Q�s��g*�#���&���
>0:&;���l�5��%����!�!��0�$�z�w�=�&)��Ņ�K�@���Z�kiR@��fd9�gۼɬ��C'�-6�=ڈ�f�t��ټ�d��ׯ�L{�UZmcDh)ұ�>6bz!�+���A��YG	O�&I����3ڧC�m���}���kW��MVwhg��%G�L^I��a��r��e~�)dٯ�����d�;��[R��Ť�\ͼ��*k��+, (IE��=Q�hI�%D�,ŧ+���f����de�ZaU�TA�tm�6���dEJc�VB#w��{�-,�5Q�3^��d�������)}|X{r� 3��g�gW�uVG$6k�M�����e�zF�X��
��'42m�&�l�緑g�DNRV���;iV�J`=�$
�6Èɿ1ióJ�i'P��#b�75y�Paܩ�L4�4�p懽�O:��ML�a�5O�Q��j�ؔ�{*�A@����`&�"��2d��#hI�q�N2�C�;a��kM�ͩ<t9�TE{���^��Vq
�r�{b�^�z�ţ[�4�	y^l܃ǹؐu{0���wٳ\�����]�NmK�
�sr�-V��V�xM��V�.2t�f��R�ب�����H�Sʕ�4:u�t�"�vK_�e���|��#-D`>˅�j�u�m:�ȇ����k#KL�xN�nX�\9���u`�*���"����������a�D�r8�@��t�bbI�?�5l��Ky�C]�?0�Ė����F��3ʭ`�&h���瓭��'.;=��u7�U�\a�v�P�O˭}����[�w���qH4c_��r�Y�D����;���L"ق�J�j&��삃�f@����o+w��<�k�ҭ��i���0F��s;���#��__�=���QN��6����`�lw�]��q�6�;P��jp&�����o�90�p�ϼΏ��	~w��	�
}�G��6�n�_�gl�Ș��
	����Ye����,�K���:���]\�����34,~md�Y�t�s�Ҟ�m�u<�=Bf��܈ͥP��~��g[�=�v�l_�5�uzg=-
Ks���^kz�����97v�͕���
zL��k
��8��\��篟s�Y�Z�n
Ȏuת �]������H��k�NK6]}l�Y7$��2������I�/��g�o��~F��@��M�TO2�;�˱%:��c[Cbm�ꄸz����o��fc��/��_��LXN�n���ҝ[9Y	�	����dch����T�T?��L�D��vCiV�K���o�@Ƴ�RU��
�|`/�d3���ڋ�}m�0��R�:	��/B&o��
ȲH&�Cs:�i�7���q��u�5���>+�3��c�6��$t��F��CI��Y:v�62�}�3�w��G�E��j����'LO��/��ԌE�}��Χ��[��r�"���ŽDCh8�yzԲ\@8�>$� �e�+�6�p�D�C�oD�y�3��h�aP72��xo�u�U#0Խ+���BȺ���-4��nL�y��l`F>���[]��?�%�CLZ��.�?�J9T�uu��xu�f;��	���[�mt��	�Y^��'����_����<O��sX�� b�k�Ğ���0F��p� ��C}|0����{�0��7�ְ������$�=�U�k
���:G<'	G'�k�/�o�~Ĭ�p}�e�mv��)ǻ�V����޽u���Pӻ~'����}��S�Trz��}7Iu;e�խ�/*mr”jK�r8R�UO9g��7�Z�7G��4��c/�m�6�O9�]�����g��H_�M�3�];�p��?IQ�&���9BM�[�V}�c�������@)s�G�G�@�om�Z�����o6ßf����I��l��ʖ�n�����1�_l�7Z��i�N3��L��{��ޢMc���-�����ЪfY��I��_}�7�=p���4���b�Uc�^v�	�}��JPFF1installation/framework/database/driver/mysqli.php��V���<is�F���_��h�dLQ�c�yd[��Dc�H'�R��&�$1�df�>�>�8E)��T��eQ��w�����������_o�����C����/,I�<�€%N�E)��1�r�*����w-�Ă��e�;�b��k5#p��Q臀Ѽ�`��c0a�	z��*�拔�O]��xw���ǻ���3�Y�>O��{��0
3?L؎�q���$�����{����]6�v��E� _����1,���t�����L���:=��z��{��E5^x	�y�`K�bN���+�,�,�=�>���� �e��ޞ�m��x��cv�ĔŎ`�<z�>;���~���Y�㔅�Z,x��TW��5h�Z��0�"u8�౿��+P�3ɜ��DL�8��P4�B��9�RSr9]�~<��S>� e( ��b�J�?�4��vv���Hw�<ȸ�#��i^
����
�8��O��
A=�9L|JE�VF7��������7��
���HL��^0gd���T8��v�b3��@hIEa��gb00��g�~!��͍H
'IA��r�����܆|��2[�rr��4�8�8#�u�V�����:�ІS�������A��x΂����I���]���c�20"U,E�%��%�P�`��<���>�)m��h�`�|DD;��`�pD��x5`�x�8��`�[�i��m#�y�G
QN�.L��z3Hf$q`>�	<�yq�Z0n<�gS	�É!�r�-e�;�&\H>��f&ݦc��	.(���π&��Cp�xwЄ��!�)�@�)_F����0鋔��a2t����eKy�F��g��τ�! w��x�%���M�����#�#r|�my��L"E���N�ْ9G�ƙ�΢<,_b��c��l+�R��r����q@2��Y,�A�
2�B�,�6�8wW#�mn�����o��$���*�Y�5H��k/;�0I;ȽJ�!��^��d�%{��������a�T����%4�2��‘j��%��2�[���f>Z�i-��L�*$�k`�Q�؅��X��=�%�co��`� ����{��KĆΕh&V���7�� f���r�A֩]��5oVi΋d&>��B >/GS����
 &�9ׇ`��!�{	l�\�#�@�>�S8����/>�K�/Z���t@a�D1V'�|"o�t%Vf��\K�	h�ډ୽�j>M
��Q9���[i����
�_w`�������|0�}����"�_�i��K�N�f̲Xc$�E�@�u�
��u
{6@I�3�B+�XЮ
(%N�B�#��5����U7P�^'�֞4
����f
je����kQXR���өɼ��ļ	)_a������
H�u�7��ڌ���b����U���4��Sa��v�5�6��L�%��E��1�:�9\�A�)1�\,���3W&��~a�D5r�������x����J�կ��~MD�7o�^Nj�}�7$y�J�1#��2������ٮ ��ksO�8T��6���_s�G�9i�a�#8|C�g�*���TXaPB���K�:���^2ҕoW��
��2� %]U�N��2_oD%���]5O���M &~�J�yFa�3�陰X��q
v��i;���<*�X�9��F�ס�2vA%�/�T�+���򟁅�,X�"o��������F4
�-�
�F�N��<O�Ե� R}!��P�
��w?��{����5��s����V��?�M��ngl̚�<�
]�A�A�����q��-x#��\�rg8;�w��y�w�VfG������*
Y�h�.��_��C��WV;n�}��iwn�U�*�~g���d�'�'�ó�(%‘��y2�<:Oo�9XZ���_�C׈}:�v��ۇ6��]�dog���f�[}���I8�~��" B�����3Z��Y�-R|�'�ǃ4�45�)d)��L/�"��OË�_&��|�/�Ҕ5+�U]
`�>�
�v��Ñt��,�9��6���1W��ݺ2�:r%��M���h-�?��v��M��1��!%�XG%���!��{(O[��[
�V�6�^�y;�$~=�V��>�^��j�}J<B���� M�2JU����iW}�D2�j�� �cfv��F�c�9�0�e�������	@��
J ̖��ϾB:V5�z�W5���p-
�,�׎�^b���,�%�TY![h0��ov���c�b�e�4��vL6�Kr���옠X`)�t
�1�n�G��H�@„
tX��`��\>f"�Q^�=
��ի�p4:>?`��}`8��,
�e����1���{�"0�icr���`7E���ܖ�m��mEY>�t�lº2צDTf�O������[--�"L��p+�+�J'O`o���Ǜ]V.
Jg$��z^6��A!N�a��ڮ��=o�h�)����N���8tПx�O0�z6x�ի�'a�/����0FI�&(�p�.� �fg��*���,�5T?��aH�N���
8�-"�$V�gq�o�6��hx2<�G��~&�x�~1ߜ���V�S��qR��a�֊6�%�)4-Sj�-[,�5�����!��%�׆p��YtT1�k��Sݤ�q%x�IE�90��>����q�7�K��C]@4(B2[z˛
�^���;��Q�p��J\zJ	l�%)���M�Q0O^�Qm?��*�i�Q���Ȟ
z@S��7���Ҭ�U��֔���(�+
}�v��\�?Ҟ���-E'z�����>�@$1�^������h<�1<���d��#����I8Y*qJ�4V2�S�.B��"��P�i7A�/4A�	�/\th77�)e���,@ap���<7,F30(�z���[N"PE�k��(��Y[��3�D{_����6�+� �9pq%u�ޟ�t��.�d�t�<R��H:��
���ds���<�0���:�ϓ�H��)8���Xɕ6	9Z2�����Mj��^z�@��������/�u���Z����X��K�EI�%
-Y��YX��&sSӃ�lYH���&�.0�ȒP���aСV�L�C�ͱ�ͤ�m���z��Ƈ������"�#��b�}�v����(L%�����_�]���r��!��܎�dvr|z<&�T�=`���	��q���B��[�\9!HT�F���C+w�4��Uf�3p0JD8�!�pZk�P}���=U�g�����e��*]�Ʌ@��B��ŠńV�l����BC���d�
+�������O\�$u��u���=$m��a��(/�=mQ��nI��ˢ@q:$F�>�/��埍�\�X�7?�<�R��}��ø�\��R�����F��n!�+]ܨR�$�炪U�*/A��S��W��L�v\e�] �\�Ҏ��AC�.���]��U��l��y���L����z?�X�?2Ò���]��PJ��{)���C�������2���.��
�����\um��gqX���!]����x����׵�Z~�[�u`�*nl�T�6�s�.�E�h�ײ,�U��R��r�A��x�s6���!�]Lt�^�%:Ypo�j�^�@������IH����ښ�(�ʸ5�	���%���\	�:9�jU?�F���Np䣍@!�Y���,���Ӯ[�j��ѵ��Υ;�vꇧ�`n�B��@ʒ�r��_��fG�����g#vtq~�2�`w6���+kv�r� IB�̖�+�z�y�-pCS�íV+���ju)eRn�;@� Pg.��3t����P}N�є�Q��mw��G��[�8�y��N

�#Ԗj7��/
{E�P��O��<�н�%�&˧x���nZ���D!o��Ci,o�U$���KvFA�t
�;^D �Ij$�.l�6�'�L��2'w�N�	�͖A�:}��5�!�UTU����k�Z�ۺ�ްV%bwFd��u=b��V�
{��
kS���FH-�pU̠�ݎ����6���dB.��R�(Jt&56v5)x)�>ډ����~q���F�0���`粻��]����ɠ.��ǀ��G���E�eO��#N�S��|�b�ړ-Њs�9���֫7D�|g/��khvR��U���`#]�'�i���l�|:FF���ޠB�1	�����ې�:�^e�_�}
VT�Hxx�^�Ӛ�M�V�т��"#sSP¤;ִ�z�PV�]��\��*��u��X ��>"%2��]e�q��P�PJ���]+Kņ�d�i<�$Kt��>��yӹ�+R,֌M]��t���H�U9J�׵��T@��Z�x7J_o��uOS~\u��4ڱzmȖ��.�zs�x;��=RH��@�nZ�8�5�H��+�F�]�Zo�H�{�B�׮��
�V�ӎ�ʬղ��e�Q>���
[E��\N��E�[��
�6��'9��,���p�S��-O�W����y��a����\	C	��A%E���*�ۄ$�y�D$�L`ͭ�9	��d��Ne�>��:�Dr��ɢ8�-vr~�Vm�VWG���/���N�g�B��|���;�E�S�8�6�č
C�H8՘T�V}������OW��QÒ��U���g���2-�~.���]�}�X�஘�����th�N�*D��ˇ�]�h$oT���ʣ�V2s[��P_֪�k��T�p#�7¼e��ϥq�zLi�l��Ds�ϔ8&�<����<�ë��bOQ��c)t� ���g��	��	�S���o����V�������I�*e�r�y
�披�.p�!2�'����"����J�^460�~�귺���m��v5zێ���B�|�������a
��5/�	��fߩ3�����,�%VW���7�_��)m�:aj���t�t�
�җa�TQ�o�H�����$p����-u�,)?�$�+r�c��v�M�N���EݞZTo�M�]���K]��I�~��K+�7��p�soIh�Uu�Bh�X�p��
 Y�y�p}���ޝ�����������x����[=_q�߁1�Oc�0"»1wq~r�����ӯ]�&�4�F)�塀�
������p||~���)�O�/���:Y�PfU>;�e�����+�9;��߼62xY�A�W����N+&mQXsx��U�}�Y�rw��ѻ�:���L��N�S�U�:�i���|����|��k�����
ꀬ�`t����X�F��(4��><Ƌl��3*'h曂�����e!���l<F��)�}���������G
A��W/L�w�D��f=|1E�Tp������LU�*
to!W�-i�OV�>Z�m_s��:I���N���"�F�k�-���`P�#�K����ɖ�go��5��/
��J�{%���-iV]XNm����WX0��H0�A�{"H'�F1�y��hB�5
re�ݝ6%a�M���>~�"�J巙�FP����.�O�W���8I�E���74�->�k�2,�wv���7�����{��w���G�j���K�*4Qi��^�W��u�+���7?o�JPFF1installation/framework/database/driver/sqlite.php�*���Zms��,��MƓ#����L+Gnh����EY��f�ށ"���r������]ǻ�ʼn3i=�,v�Ͼ�wM�����_��л|uч#�%�KȤ�u&r�0a��f:���)�,��;i ̤�e�%��I9��Q$��X��}���V ���<�t���yg�_������=}��[�T�\���.��BK�S]����1�#��P&������W2���᪘��������b�@����1�se`�b	��P'�P	~Ff�^@�F��֋X|W�
��ԕ�OpDܞ>~���L�EJx#r�h:p��݊0���!Yz�QJ�^�D�Lݡ�$���<����%���C���L��3�3L3}�h�Ɖ ��Mխ�e�v@ЈD.�����i��\%�pu>���j�	>��H���<=9>F�u�/DR��X&Ǚ�u�H�_b�%t�2����I�1+"�Ν�È��|��$Z����ᯇ������D,��rcC]"b���DF*�<��١�:��Aj-��9�B`���S&G?!E4�%��NSU*��L���iCAf�5�Rh�ڞ�ȅLr�~�\�>�n=S2�����9���P���s��4S�DC ��zM#�e�b�ArWts�`�wC�^�"֜����>�mv3V���H�����*�ajٗ̈Pc�lk�<��h[��J�}��ᚐTd�e9��|u��1+BL����:2fE�I��ڇ�<"�=�eR^KS�8�����&W�Ds�j(�&M
��2�Yp�U���Q�3�����Zf�
c���M�x�%�lk�Z�+���L�Ƭ��#5�WM�ɘT1fJ��P͖�N��ӲZ�GI�C�&g�t�*�
f\�Wc�IO��� �\�$�+�^�!�cR���E���S@Lɺ�J�l�R�l��n�V�oi��-��1~&8�^���bЇ��Z�+/�����x�s'm��B��sؑ�u�5!��\:�y���72�kN�҄"���,,(�C�Vf�+Me�\��9����-�f��.0u`jP��!'�X��:H(�2�;1��l�䒣�EN�h"qQ&�&��(��$�Ad�:�ʆ�̯�?�
��ĺ���f��xC��)��j�05��2�䖬
>��&�X?��L�r.�R� �zI�[�˛� (�Q��oON��#ޞ�9��z�u۾�����kX��0C�+m	ճ2c!�'2�B�G��2�ABM.�lY@�$:�i��`>�3�ᙗ�u5�0`e��n�h4����ή��q��epR�����(�Ԧa�Z�$�A`��ݹ���g>�ݷE�r6Y`�Vig�PbJÔ�Wm���,�f����	V��'�4�o���~�.�\-d�}(98�۟��sY������0���Yi�5�`�@m
*#��k�iW���1_����(h�R�l�kS�$��,�UBG
T�y}W��'k25S�K��G;&X~�Xh8�rD����X(���T�܎�q�H��A������.FRހ�R�y�g�Y��v3����ur���'g�Q�Y�7Su��ߓ�����_�>%��C�$v��PTۅ4��-'��u
�O�v��ϰ���#��aA��\��~g@*��˺A=���P�3�����H,Mi�������ޛ�?I��>��O�`��tB�KF�9�{#"RY�y?�q���fI�c
���[���S�&L{�$�A|��:n~�����<���_b��pL�N��$���r�}ݏ�Q�K��L`�TY���'?�7���r�k�^Wx_]_�����+b��P�zΒ����72*6e}x'�6i�O�;��f�k�ڑ�r��v�ġB�ZU�=r��'��i�����`sN ���*�Z�Iyp	:P�{;��gw�Z�&�bQQ�1�nv͓̇j#7�T���|�H"1;;jQ7�]W�l��e¹\���(��	s*{�M�g�]�1Ǥ
�KEv��qtAB"v�&V�
y�A���$6�� M�%-wg8Y��a��~.3�
���xXӄ�Wj�:�0�Jѻ�^Fb�)j��7��>!�k�f��P�\�t�]_�Y�{|��.�	��A����18��y_��jXUn�j�0v;�r;�ncW=*I���؄X��ܼ-};n�p��po_�2xV�U��u6�?��
=��R�ӕ!�&�h[�q�J���$��f���ϕ�g��:�]��={PE������C\��C�*�v���|�1^��E:�`�&
�x�*��>�9��u�^�G����'2�zä�3�٣�b�$12�z����W��(�S�}�p��vζO1�G��x�}��2K3�f���p����z���ҽ�]��G��l�۲��I��+�Gh��\�-�Y��S��J�S��~�Ȫ��
���
��{�Z�u��3�����c�|���Ml��7h6�@666�ƪ$˲C���g�ZNϑwxb�r�ږ;.Skd�ݫ]m�q�ܐ2#��?�N�iȴ�������W螉=<��]�����aߣ�F��C�X(���@�>R��.M�ĝL�Jrz�����L������T������g�H��e�9ac�c��E>�^��՘�w��G$��L��:��m������o�W���ot�a6�Ӯ�*��6j��q��d0����-r�P쳊�W�z8�蝽.��%�<h��܃�����jV�� �o7�J�����f
X��Pc��5��2Z��!��
i��;���y�\d��}<v�E�/��~���?o[�mFڨ�C�jxq9�}q��7
���,�����N�a��-j���Zȷ�Ѯ_�wi���KZF��3�*,,�-6������w�E�Ev�D���wL��—��gK�ʺ�DK�Iע��.���
P�v��-�픏Q�~�6_��Q�r��;m����_S9Y��5Qۃ�R�熻
w}CB�P"�_�B����v9������ꛮ���J�lB��B�[ı��X��A�Yh��[����JPFH3installation/framework/database/driver/pdomysql.php\�<���iw����+ֱ�1E��ʡl��m5�J�i���$*�`�l��ޙ�')��������׮�}��/����b�}���N�l���� �,�2��"bҋ�e¦"f׻N�̍�yp�%�b�&�g��^s>q��"���P��c�/a֝q�`�,�4��*f�짆�<������cvxs��}�f'��J��HC!ٞ9�,�	Vx<������G<vCv�N`����K��q�I!���m�O���
g����u���x��t۰j4$�!gw�<%n�O��i,,�M�E�>`WضhIc@�Wl����%��Mi�qv�&��l���k����#�tㄉi�)mx��R��
H[_�8���q���k�S��.yL���	�5R��3�����r�����n�N\`��X��9�:����Q��^vB��|�XɟB��'<�+��8l����gm��o���dь��ڣ��#P�يM�E$�t�1(j����[H�����4��<��O
�0��: {8�n�P����j�,�C�Ro�P�4a=E�#+��n�z�L�DA� �淃�8�ތ^>)��+MP]
<�p�qePْ��0,����GI��}^K0k ��xծ�FKG�q��$��2!}D�t��+�_�E���Z��s��7x7;���eY�ٻi�0/XΑ�):@<pt6̑%��%T�\-VV���T�p{k���Ov_��w����_}��0|6Ï�|i�qu�E�n���O�C{��8�@.�u�P!�(J{��j2�h����$�9�c��q��D�#�a�`:�KpX�[&f|�loŸ�i��$�Cc���� �x`�0H��;
�'����E���4a--��Hi�nm�
��� �xڂ[���x�5�)��&�w�k�tl�SdG
�������r,&�^6v�޻Ǚe��)?�z#�_@�f#���7�ë�)�cYr�4��X0�U, $�hk'���B�o�@}8=�ߊ�&��ۃ�`�0@�Wˎ�I��G��9��cH�AC��.��F~*�ue	ǟ�CP�d�&�N�gK	��=$�l4YG;�����Ϲ���%�<DH�Bd��?^�rިen�����Q����[R��לa�5U�@m�d�C��@�V+�0s��m���1Li��C�A�-H.�Φ#A�>�k|ˍ|ʆߤ��B�F
���;S�P�,L8n%@I�$X�{�/
cj8`�/3�٢k*�m�[��N�V\=G����alO�����>
���D���y�+�/
Xt"T}n��P�#	��%[eWU�04Cy)�j%y�V9���c	;�>�����N��xv�?�Z���Ml>w42�<|}9=|��;�.�ٟ�iv���P��&��;�G)���=V
���ʇ������w�{V�r&�z��z��I�i����(Iqk h:�1�I�M�5��٢��ݹ
�9fG*٩�
Y�k�[u��:c��U5�ޙգ:Uť̹�$�q�F�*����X��ax8 u�Cɖ,��NY��4�W�g#�K�Æó�b�x��+"��Ne�}�@���v���#L�x`%�s��,�ߝ@%v*/��2��0C�N��e"��A9�~!on1�U+��9}SLN~�Wټ�K1�Mg�����$;K@��dd���^���'W���9f;7n���q{-ߪ���X�&������FI�������)�q��F�Hxf74*�:V�@1�^86�U1Iy Тh+��P�O8C�G�`��&���`���|"⻷�͡��E始�k��@K]4��@:�B��mӭ*�9����f-{�W��dY�X���:I���訦�2yV�c��<{`r%����q���}��o|��x�M����&v��骠��m���G.��F�h�zUs䱊�c��F�ВmMT���N_�0�X%�����(�V���Z��I-�[��I�b�J�U9�(t �
���l�ɲh�\ǂj�Uȭ���|�%8a�-�.:��&Yl��+�4�)��r����:��/��T��C��x��b���q��֐k�u�-FS\Y~���c��{�� <��χ�����
�Ș�Aj�<���L�1����F�7$�IQ��ZTU63nձ����ں	Hs�&��U������u�m�g�5�UĽ?��7g�Q|5�_u�aKy��IǪԡ�/�ɪ��ڬ��$�ݛv2o�n�JH�u��h�M����I����KgCfn�<�P�����S��4�4�h����s~H��,g��6��
�;{H)����"�fpܦ.L�N˵��Յ�me�+���\6�{#v�ژboc�]r�f@����
B�n�<b���k�@ג����`;���D�ك\K@�_EAX�����ؗW��;s��5�-��V+E�����G_�JV�e.xΓ� nq	��hZ��S��.�FiZ�9��n�.rW`S��0uW����TC"�g�t��.c*H�!�h	���L���E
 ��!U�O�c��[�l�-�����WŞ3�Q��6�/��M���p�P�h��`�f�z����Y�D��i`�N��������DS���vr������ƒ"Ó�+�\6�(���5[R�>��T���ňi���n��n3�}I��m�D��#2�4�ߐ�
��]½��ې��]<�E|.g�����tqG\P�k�}-������\&���|����3#�E�7���MR����2����b��)̲N]F_Ő�o4��4�,,�D�0X	;f���&O�$a0W��1m����t�R���6�"2&��Hq
��˼�'��t
�IF=2L�
��t6CqRU�>��X�8!f�R�O{�
����T��������-��@|}�I
���9"�^����a��Jj`y��~}��=I0$�n���K�'�7��[7��3rbp��\t�
�����j͚$X٭գ��;Jy
���V	l]�Gxt�����ͷpux�XѾ�h*Sݱ�dݬ)�j9�g`����Q�ȭ9|�J�^�CzLR�]iD�Ck>�%�s��dv:��Fg9E��Y�EI�m`�^��h�j6�2iY�V�x�`2�j�m�B#�.��Nk��n���*��TDjgK �Vʝ"w"l��ٴBF�P��jU�4*CR�[����R
G����o���gg��i��#��
4&��
lC�Ӎβɚp�՟���a"^�?}�yov~27+�uyK/%��;����@�;�SUPB�y�zt�o�J��;SH�@��(��7�x��`i�ݗr���N�7�~8���Q���d�Z��,2ɻM����"݋�X��a��I��Cu��MoY6��$�w���İc�n6[�|�86�ϓ�ytW~3e��Q2U7�w��{��û�$���>�7�~�:Q��
������A"�į�B¹p�'N�?�ֳ��9N��8b�]G�ԭ�B�Gv9_��ϮC�̶@�9I��,����W?�����xTk+=��'�
|��o&�}R��;i�ތ^�>ɽi�'��¹�-�4�5ZRj�e�Rhn� ��V��/+I^)��bV��J
[�5����D]�/EQ�u���і%�+�f�V��E*`Q5�+o���[�T���1�1u�c^E5�1��q��Ug�`H�q�߆?��܃������n�L�#7M�n`�7p�T,�^�ю����'�i�C�|/�u�ޤ�j]�ol
`�U���z�
+�O��T^YY�o����f�_ �&��D?��zH�)�y�W��Cj�����k"��;v���@W���{ܪW�!��Wx��
s`��$�{��8o��|�:hxǘ;�>5�V������qGy��ѬZ�3�J���G����|�І��G0�Rx���@*I�K�iN��_sfnc������E'aH/#��m�	�|AK�bDA�_|�6h
����&R�Q���V��R�h%��0_M��5�O9�K��)�J�>�N�����W�[ݶBB?kK�*0:G�UYt�����(%�*�_�!�𩇮<t���"�؊�TQ����9�ӥߵ��j�~�A�:�ӝ:�x�gY���Z��W��/�����śs떱]�ᕗ9�Xym8h;�W)߁|��H)�@�&��!�z�/{�&�=tI����7Ӡ�lR�ޙ��>G��V��Q�yֶ��[R�?X'/uâ��-CY�92��3�?PS-Rx�痢u��WCcN�+�2Yp�J�:e"7r��=[�aF�ܳ�OnZ�U�elaB�� ����<���JPFA,installation/framework/database/fixmysql.php_�!���YmW�F��bJ��N��K�m�J�4�����	$g,��6�F�H8n���Ͻ3�c'�~*9�F���}{�O���G��8>{~�L�˩&)�(�)u!�Dg�DE��b�1���*���ɝ2"*�,U,�q�V��߻Y�\�T���.�]y�����D�H�"����i����ww�����?gI4թ4�P��F�J�C�㴌�V�D*3D��ٕx�2U�T�Wc����*�u0P)�nn�j�d*�o�z���O�D���ln��LJq��,�X�c�n�0���ln�7���H`�R�\`$�T���\%E,�ڔ��)�l2�a;e���4�]��H20z��i���,��ϋ��&"�Y�"8�9��*����TA8�,U�hQ�hB����
J�u[�".��bD���#q����4:z�J���ť+��.��y��+L�.Ĥ�3&�5
���@+�� �	={��w�oo����,^�����nU!d��NU��E_l�:�)��%���(��gJf�](NJ�n�VEF�3�ȓ\Q�X��V(�����Jq
'��|z><9�D�������b.d=�7Y�(^��jF�s�{[�_u%.^��:�A���$�B����!���yRN�k�C�#��o
B�C�J��N�&))B�z�b�θ�5�YkA1�����8����F$��� ��>��2aؖ�4y��	�^@���g�.d�-s 1�DWMJ����:k���?�4�pXg�g��-I҉I@3T�6�t��u7�<H!q�|�&m7�5c�����H9���u�B�6GHB�qD�iR?�(C�Ɯ��P�.�H�&ƑY^.��p�@�2�l�l��l'��;�V�����Ks���B�h*��I/�p�"�ig�œ��R�V�F�*SZ�̽k��J)R�B� ��wТQn*���]����<=:
f�NPNH��6���zK!�&0�S���KB��<����J;���yk.M��w���r�c��*\� ���V)��j��cZ+�,��E�X�r�G���̞Tѱ-�Y��H�<Σ����ي*EF�O�q̕��#g�䶲U�6���FF��]
4��l�l�t�D�I��ِ`�5��$T��'��
0�M"	��v1z�x ��<U�2Z�7G.�&:��[�:�C�&&b�v�lp�����#��eQ�7�Y
���]�	,�O�HG;9&PH81�oU�-�O/ς������L�;��R��\碜KclD#Km��77��HܝT�M$����8\����쏁xȆ�O+�@lC�Sq(&HT���@3�1�c��\��G�DN2�0��C8[�h��}
s��`��vbZdE�Tc��������8<d�BC�|��ϡ�8����Ȇ&�I�eWT#��X\�����`�T�-�E��9�znr�4u��'�D���of���a����ͣa��>˾;��7|pz�6�R��
]��p���H�V�sӮt�����k]\ˌ�P���O]qE���
�Vh-����``#-��u�������}���ʢR�|J� m��W���7.�zІ/$�Q�r�&�Z�25�����iU=�FYf\�(sߡ	�J;tZj�	!��٘ۡ������G���#qp��emF�(�o��������+
B���/'�Bt�A�%�FCB�a������!}x�:�����zG����O^��|������U����kDk�ѝ~�K��7�2�:'��O��S�C)6�c���5��$ѓ^o��W�;_ܼ��������ݽ�#�ʿ���a����l�Ƕ!�O����Ն��X�mv�
{�]��>@��&ai�~_>�v��X��
)�3Fh��Hy��ˏ���ʫ��jw���?�аw3������_���o��6�#
s�AWd���V#�,-|���j�]�?]��|�˝�'��L�,6��2���4�x,�����VD�AbY�?���(-X-�s���Q\����*�=�w�|��&x�-l)�����-R�������sZ��Ig�s�ڶE+ʴ�3�0�/c�ߋć�҅.�{w�1W�Ƅ�y��I���Z.#�(���f7U�_p
��<�DS��j�I��I���y�6 ��=|XW9�D�#��J�\��
��M	3t=�JnK������%�jP����z�R��_'{S��k�i[���:������nN�c���[˄���)-�����>8Ҋ[���<���Y��|
:\�z�n�k�y��C�}�k�a�H��wR�N��6�Z�z����Qп,s3cur�Ie�h�혩J��W��Pe�K;
��vlZ�����y�O�0S��.kRI�[�Dom�c[�����'����V��.XӒL����EO�@���Do�^������/�;��t�A
d%;���9���u��KD�( ��92���Ѵ��E�,���=��G6?�b�����������:�����#���,�*R�sm�:7�{�V��O�)Ę���o�9�P�`��(��/>#M�h�Z����n�]2�s��	|�}�0�c��>y _!�l�P2�dd7�]�`�h �l"�ם�)0�)GpD#�V>ڶ�
Ꙝe�or���8�x�e;����!���l*W�q�����h_s��)5�珜�K����Z���v���]c�S��؞JC=�ݽ �TAoZ�@���}��2��M��[u�Ӹ��iMAћ���$��JpX�c�������헚��S��^ڦ��Γջ��S�67D��E��w�t�6&���d�G�;$�X��ͺ��cMY���'k,���l-YZ߷l�̖��ud�
k}�#R�zlzE�\���J��ev[��Ľ喺�8��jm�r��H���lDA�)���\uRB-c��u�݂߱�U���ƛ6"��v����*l�҄�^���8X�!a�D�f��*Ki&�.+�w�^Qp�$K+�v�u/��I�w�+-�݀��^�*(T
-�e#e��U�:��!_ȷ�4~l ����6Մ�H+�Z�l�U��"�4ۄM1
<�ވ�/*�e��Qu�UK˯�O�^��Q�A�=����P�e�mi��?JPF?*installation/framework/database/driver.phpy$����={�Ƒ۟b�%�P��&i*GvII|�+��ܝ�S!r)�%+M���k_���%�q���F���������~�`~:�y������v�|�p_m��S���֪�U]�I����e:�մ(�q2>[�UR�O�s]�q��ZO���9�8Q_���<9(���n�>��ɉV
>8I5=��2=9�ծ�m0~t���6>���_ԓt|ZdI���T{��eŰEVT���Q=!XY:�y��z�B}�s]&�z�8�ꑼ<�e���H��2@	��ܼ9��4דA�h��/v�C�`����MC��ӴR�4�j�\�q��I��ωVӲ��H�E1˒[���F�������>���G��\�@�E9��qR>�H=�Ǜ^g����C5O�Z�h/��a��Nt����kuQ�g4�L'ev	h�g0e@�j1>şs]�yY��H�J�@�݄�d�	]���K��8r?�a@�d�����v��ݼ��n ��U]�J��y�@�\��-q��y�f�qX����葉e��qQ�X��r�r�b<�u�d�Q�ʋ��wnޘ�H6V�E>&�O���|^����?������Z�y^I�MӐ�W�c��d��t}ZL�)`W���RoC����m=R=]���V۪��«�,�9��fQ�Rf��r�����L<h���E�
��'�y��^~��e���%4O�����Nu��fr}$�8���[���晞鼮:X�x�`������<z���g;�������û�}��ǰ4-��<)���<��ɩ��4atr	|0Ka)TfzGJo�l��e�&�Y?��ћ#��_��,���b�:q����Wa����1��u��%H�6=�ZI>F��BI�������W~/�:r��2�	u�-�`�!���ց�
�E�wd��H�=�\ژp��A��|mS�羊AFyu��,f��;����GDKa`�V������u��@���N
���/�
���8��jX�����E�:r���4(����	�3�4���A�X��W��Q�%�?���
�^?�N:��Ҁ����	,��0�锛�Ņ��Y�)�EY´�L!���LV1v"	y�2Q����)��\�1�4>MP.�rP
բ���hYY]ӊufB��V�!�:��#�O�`�H�i6a5��N�ziH�
�y�������z8U	ء�I�!k��vI��
ŋ�����l��&�6<Z�d?�t������4��q�;���7&"Z[��Ұb�Gc0Y�G��Cd��w���3��,@V�A\�l��^ ��&�Nfs�w�y��2C{X�}� �X�<�dC��)�:O20�L�L�<:P��Wt��k��N+M6!t	�]W��_���iċ9Z��&�i��Z%�z�>�O��Y�����$k?�t�@���������ᗟ=���-��2�G$y6�����}+�G1�5�]Er�p����^?���U�i��`2��p��y+T��yf�~�T�b��]4*����nU2s\`fS��S��ei	{��,J�{&�EhYO��hl��Û7�Ƚq�xH)�X��kr��B�d��=����Q
R`S�e߼��{���h5�����	m4���:�"5��֙}cUo�
*-e۰�B�h�8H�)�ll�H�s���ci�h���fD\ʋ�ؘ�Z�)P��A�,.]4����m���yq�iW���BO�[�0�O#i *9
O>�CO�I�nq���'C#���||���u�5��㧛�?�N���{�����2F��%Oߒ�,r�� ��"���E

ص�&5ieꋕ#N�~@*�@�[�1 �+���k��N(��X�YZ_��Y
��-�:�Vr0H�

�IJ��l��\�	鹋S���6/j��>$b��c�2y��UuY�`��%���o+	�<<q��]�-��1%ϝEKϣ���hn�GA�&H$wVs j�89e	�>��֞�:�j/-	��Cy>8:�{���Hm��n�R���u�
�n[�m�/�.l�0�/�����ܕ	V��9�E|��V��-�����9��E�}�L��V�l�e�S��K�`�V��`�~���4�*�r^T���f�>Pխm��8H%5@̠N�q�!���:�-�wW_�5���o���#�<K�z���N�c�#,Ї�X�ɰ��9D�CGS�}&Fޯy1��u���)�S�X&�����L%�0�+�֌��8(�U��V�%*uq��|���$���-��.�@P�@��|�ds��B�~�y�� V<9bb���X���!KJ3�1 ��~`�x_�(�s�h~P/D��:���+�q$SZ�Re	F��ː�$�-%q0Vb�=�m4B
6k�NxU����e��K&P�	����,��B<Ӯ���g$p��,r��@��3f���Yq�d�~͒[��,��z�NQ���V}�kFϳ�T��Har�(3���8�^(gc�����P��Y}ۧ��\��q3�c�,r`A����р]�@Y�Qwa4�f���C�ĩ��|�Hx�
8"�y�f�
��9�)B�¦0O��l6v��6#�*��7Nz�E/��6X�aiO
w��bΦ�"�ሥ��j��@�Vb0v�ֶ�l�v\#��jK����d8� A'���&�7s�����m�Dޒn�ɑw^�����������F|�ۢ�!��^طsl�����C�5�1"��6�wӇh��(D�~@�V[օ5��x��$Oj�C[�;w4g��m��N���:�ښM>T������1��V�%��ɥ��#�a���Q9Q޲z^P�-��7�g�r�67h3�%��!kܚ��$��<Ci�=j��|��(�ƭ��F�l$�D`��ŭߎ�\D�U-$��98��L���jfH=�_��=!;��=���X��04�vI���_K���4��v��4���t��y7�G�8�7�I�>Cs����LAو^3 C�9��`ؤǁ6v�7x����pk�(���˸]��^�vZ֮aL�34w�?�|�y�i�(E{Uc�y�i>I���� �Dt�	bTR�N�/L,����d���
�h)�{|x갴K;����J#>�Q�f+� �s��k@�x��QY{1)�s$J��P��r��7}�Z
���!�+��u�Q��K���6�_?����&.�m=Lڈ�#p#��0p�.������}Q���G,�n�����Ն���YŎ�}��?�S@5
��^���|�ܒ\�Q}�M�]$g�?a��!M�o�G2�,�S�
3ν1?p#'��1zهb�hxJvxm��#���a�S2��#�0�K͉�F��Ex�K*��*�KIMG*9��Yw�rz&�E�R��ج����n��1.[�&��6���h��%�zIyR�hOdž�ʓop���*����ۯ���;P��e����ln<b�D"8����5�X�\�������Q���h2�\qH�IMp_�}��2��_�(���',qz��=g�W��3��5;��a��FPx#��{��x�8Ƽ����:Ɍ�w;33����lrL��po�l=v�x[�z֓�˜p����dO��
�ئI�Ow�x����c�ʆw�e�%&L/��b\E��'�-C����8���
������
9G�"1�̾�����
����-���\�\���Ws�OL)�N�<�)�rs��yf�y�;��.��b�l�bb��(W��SoM�૰�\C��l�'� �2	��ys��u�9,е"	�rB��~H��=��J�'�b��
�ƺ-�q�V�A��ld_��Z�'�G�6u�aϷQ5���)��!�v��V3>mn7�k��WU��2���J#�;&h�3���i�N��a3�ӓ�p�L�5�� ;�!b��)�{�X��t�T�
&E�3�N�u/��V��$}��J�L,���+�9z����"'�ޚJY9���9��q�'�O�:��}��UO�^H���,��"X4Ce9ָ��{:�{R��Q�ӊ�*�jO���*v0,p�������#<�u���^#o��ƨ��{H�u��6_`���l���y�m8�$�2Gag�i��i�fe��D�M��#�#�)��R�T����l���	ȶϫ����0!I��b�<k�l�
C��_Ҍc7�5G���Y�Aj���Vٰ���i��:�D#���\��f��FR=�6�>��xv]��m��t��l�ٜR\@!�r)'-�zO�U��O����@������
:��ƮK�]�S|�(�d��͈�d�E>�ev�c��$E�g��G�����S�rHa�{�%�RFh(l3�
�O�oe�\.j�J��2�*�a�ua�� ����	�v��Lm��$��b#�3Wv��'�=	�=Lz���o���_����z+ݪ�to��9�Y������8���Ё�,y{�`���a��n��/]�S��B$Lv$�x�3E]h�VvS��@�LMv2p�?>��a��'o���O&��
��A��_?�N�c�Ý/��G��W�6
��)�҃����<hY�t��MP�b6�ZIJ?���W���${ֳ��f�K}x���>�맶�K�201w��m)���^�}��1Z�!��@��i��h��ae��ꬺW�`�BE��|�+��"(e�vE�R���dm�+�D��r���w�hnvuKǘ��\JJ�(Dz0vl��Gy���)��m=�`F�h�E�0��q�kQ<Y�Ț2(o�l�b�p���_QY�L��sN��x���t#�YJ��i�������D;_[�/ɤs9c]�8��'���kˡ��B��x�oJ������~g�ӟ�ء�\[�|��	��Ϝ0+�3�������Jm�!�Cd����kg<p����J��\�m"a>h$�bU�����p��)ȃ��d[P���]�Q���J5z�M�TS�L5f��3�u��bQ{9r�)
�~��3�	��cͫf ��C\?��'�bl��%��~�;5�r�F�U=jXk�l1�+r�c��\N�/a�}��s��c���5h/)w^a��UJ�L0e^����q�r�U��-D�M>�C�W�z/��	��ԙ��B���{$�7?J�0��'Ҁ�+�X#�+	��v�����،7����n
���ʈ�6-����?�ع��\�b0�{,E��ڧ	�}I�AܖZ�ӆ
�0�tI�\��8�IV��1����W��38�R���)!@=7��:�O=�����ۈ�k��Y0� E5#/։c��]XÂ�*�y��0[�o�� �8�#��K��1��?p����c�n�1y��j)C��*,�e�yd�7/�2..m�%��Y<Jq�E*��l�	\�4e����K�ʤ?����w�[��c���̋|���j�dIYY/��H�
����{��wN��Z��'9�%�%�c%zx�g�=����.��eNv$w{I�-J�}.s�/J�j'��(���`�-.���
^�l�M��l��q�[�X���AT1�x ��Q=�D�#̒�.Eܤ�2FH/�m�p�^�n3�u囹�k�6S6�������/v'�pq���褓��f<�g����
���j�e7��b�ϛ)��d�k2�#Ty��`��T�94!8��ᓃ���o���f�1�B�L�X���}��F7>�㳠n��)7���r���xW��D���ᬡ�b�v�� �]��(�b
�ݕ�����
+��H��#oVUE6fU��u#�J=��}�eʛ裘��#���{h��IC^QI�����wsC�p�IJ{{%�a������:�b��Q�Ch���Skɔ�P	��^���$;%^��a0�1o��j�q���Џ�㸹��ɗX���K9�+9#"0��T����	A�E�}?�2��4���Ƽ�zK��:��6���q�"�|��_�wш
m$Tak ���\h�R���ak�'O����)�̓��ҧ�Cݡ�#U��g�P��]�"�E����y*����`O��Z�13׌�����!�a;�XŇ�qy�]lR��N&��b�(*>�������r=m��(�Q��K�$r�=�{d���Q�e����-��A�r���ľ���Ku=��s��5DL7U��<�dr��ڢ������U�r��Kn
�^�qL��J0S�4�|��N#����W0�98R������6���f����GSnXcМr��(85k�{%�!\sA��+��郞���#��V,D��[�czZ+L�W?�Ű��g�v��9��i�ផ��q����=�_^��`��M3y�ߙl6?��$�f-ay�
!8Rޞ_`s�߉Q,����*6']\��}7;�7i�W;��b#���k�
�,��1�Q���S�f
��H��\%F����3
uc���׹6u��j��Z��4bZ������ݟѰ[������+%9�����4�
QO\�Sx���-��^V��.\����i"�S�=��9�[�����L�d�߉g�:f;o��!���pW��~m����G6���5�v�V{{>��M�R���Y�F�Y�é�;��O<�Y2�<�����TD�/H}brvۢ��^�f]�_�_��JK�*��)p�MLƍc��"q�j�f�]�-We�"Y����Ox ���䴆�"�'�������T�2�$�#z7SX�}3��VxE�=�_6�E���+�y�8X��̇��<��	��$96�+.���,펶WeZ��I�dL�	��t����v�4�s�q$��-8�,lQ��l.ۂ�GN~�Mߛ�F^H��űN��E;"��6���g_�d�&
{l���c!����؞�����E�t�I���+Q�K��&�v��L�\	K\�
T����U�vE��
B�l�\�H8	�u�Xp����	����4��7��r��J��&�Nrwҍi�S�c��×���o��՘O��~}sP���	��⸞c� �v�?�Me���z�4wGx�G��+֣��i{@��7֑�����~
tx��G��T�UK�`!�߈�o(������t���q5�=o���^���	���DK0X�\�2(��!'�vǨ(�ͤF�/|�B�s����`��ȉ"ʫ��Xj��ߗ>l�a��aD�V6HMZ��F�$��2s~9+��;���ȑvd)e�����V�ߺ�@ӡ��y��2����]:���6{����S�bN�q����.c9:{StR�"�9��v���
���
W�B���Y��B=��#-�8:��lsXHx�&��������w�� {�+�)sH'52��w��9s�>��s�lg �r�o�97���!����;��>�v%yF��c�X&�^7����nAĴ���~�_���O�~I@�#�k:�r����Hz[Nׄ��?���[�7�-E��͠S����䰓��7����[զ��ٚ@���=]�$���}���f����6=��o'tL"��tg�&��*+0�A�L�@y�D�T�L\K�3K��,Yq0��0k$8������t�	����,�dž�3J_�Th��e/{e�
q��qO~u��2��]b�<��q0��6����E�a2@��Տ���N��E�@���K�:=d�.�:󹊎mm3��O&Z�!VL��:�6nf�
����j�Ӥ���풊�B�{��[/O������<
�w��u�3��HX���5�7u��B�v�!�8S��\���R�@�~iz'`�T(� {����5�Ҟ���e#���d��"0̃8��b!�Whax�����R���p�����DMS�
0Z���:Q/��*��������9��*��$o�P��4.�
�0n����-�7>�~��ȿ�r�].��8��{� ���#Wp�g�}g{	����#
�|Cl���W.Č�-5t��ػ�xs[�� g�L�S��C0[���h��x|�:�� �Ş�(��
�@�)�q	k ���9h���&�A�Ҍ)����C�*&!������Y�ד�^��oWRY`B:8z�<bϡk��T.��A����Ѕأ���n���ai���5��F���{��id��'�x��!�����rGo%v���vr����[��|��q2#WG���Q4�.U�\a�Q0��W����,��j4���ǣb�/�x��^���Z���y�0:K�Gf�!A�
sNvpa�F>,��r��N��0�ݱ��!!�og7K���aɳ��-}�lW����{f�`�P��R�}��|��y��w8#a���{,���ye��휮��%��Ro�6��Z�o�n�,Yp!�)3)�B�r��3`i".�,���nN�)��y+��Q��C�n�y7;oϜL؍�$��y�ft�7{ə\�.�H�f�[���>Vt:)�=����(��{
{Cο:�.?	Y
�o��v(�{�2�&���7�<��T��ۙL�\�����Vps�	2ߙ{�$��}p�w�|�L�17��O;p��F����I��2�*�ݦ�S	���v��)�Ҫ�Ӂ���1b)B����um�)�a�H�����H�R���>�S�J�a�p9�$��慚!�w�hﺰ곝���*)#����W��G�v֍�p�"fwi�{-I���',��ۅ&�&�z��L���A��/��߹��,��>w�[��ҾS�뺘���Z���7Z��������M��p<�+��({_-^׋���9�����p���}狝�.�]:&�}���;��
�R�
��g?P�&��>>:ir�"fZ�^=�5���B(�Ǘ�>�{��y(�Z���
%��qQ��S4��}�>�Y�V���5�����?���X��sFW���eJ뮆H��u�n�6Ɩ�Wf�(
"�=�g��@Z/9�}�<�[���'��H�=w�x�쵄v�t�ed���ܡ1�J혔���0���W@�߉�o�ɱI���z�(a�!�i����1��f����VRe��@A5��;�7�#��I�yC	����;vo�!)a3!;3M���u]`�)J%�*�t�JPF@+installation/framework/database/restore.php7�q���=kw�Ʊ��_�vՂ����&��#یD':�%E�ۛ+���RDE(ZV���;3;�@IvNnrNd؝�ݝ��.�}����?�y]�Y�?�Mq>��L*)
YVYWI��r\$y%�Y!F�z���ϒ���Bƕ��ѭ�_K9��w�"��'g�<��uo�+)4�J$=g�m�\�*�g>u��g;;�|���+q��g�<.��-�ݖY�-�Y)�5��jB���X�%���^�����d9��_~�E��'`Hs@����'r��r҉�����w���
&��t_��'S�yd���ý����?�!�v����4��o����o�/�����!��8��I�`J�&?��\��dnA�����ӟ��G�3���N;�9t*�#�b��e2�� �Y*ſ����i,a}+��R��뿬�ǣ�*�q%�0�����U<�KyJ�!q��<k�=Э�D6�(`���0w��bS�73XAQ�`�&"�*1�g�k1����L���Y<���F�+�i����[7q�&�Uɰ'�%�-/��\.�}R��p��[؈����E���5�Z�1r�F<�g7r2@�{4�]qq	��0�q�X�T͠��y�<E�l��PVqQņ :L0�!.��u��7�%�t��DkB�I��ȁ1M�@?���E.n$�%�E��ÍP�wq^C����*،e�o�(an�DM�'I�:t�pv�N��L��E1�
�S	Ʋ�
p�eh��eA�vE���C<�tZ�
	�	�[㈦�a<��!���L�y)nƄ��>kq,>ؐ����؊eڶV4�<�n��<�g?6/��Nx�-��lj���4^�)}(�6�1p��!@BB�G$��� 5LQT�ay%�:f݂��,���X,K���q1�U�� *h�-�p���
[� 6�3�C3z-o
ʉ��^��Yl+IZ<�M�LOF�N�^<��{4*��.��*��,i��?K�3�E0��)���œ�Bs�lM�從+��).m��4���zy��7�Є�v;��ں�������^�w��x�n	ٌw
C��<2��a����Y��}��<�RA���`�p�D�}�i~UN�	�	�	���<�R���w+a���ČV��������պ���q�l�2��I
�f&S l�t�?��Ԕ�B��,������>N���ȅ�	���iH�����\t�F̠Mv`��(�~)i�-�P
I366�
�n�\�HB�)S�������F�I��2�����-D	6/B�E*o�N��lj��߶�kW<��>v�P�v�-�S�m���2��d
l��¹�fq���&N+��Z�X������u���a:�!ʿ��) 5kx���S��NZ��kSc�)�5h�18�����u�Izn�B��\�쇢/5��n���2�Yrԁ�����uZ�،fK+ߏU����-���5�:-�]��
��aM`a<��jɴ¤%��E����eE�pd"��C�V�"��t@�+4��zU�LO��Z���LzG�S�Xϥ�!C����kH�!>��6���5�_ߡ���+Y�4�b�Nw�%|5�0���7@]����	��[�]^��{�����ɳ|����(С� �'��e'Zğ�'`s��"��:g�//���@��f�5T����(���B�GT]�K��!��!���BX�X�vP5�P������1�����[f�n��b�O�,2\��,�[@]}w_R��

�n��L^���F���!7��������|�������v����l6�FmЌ���v��9�~�<:��W�F�D����Hд�At��ʖ�&���f��	Q�����w�jU�M|<�24�.$m+�"͕�2�*A��c{ˀO�8����8N��(���8
@U�غ��	���zC	#����c�ɩ�=,8&�.����f���2
Y-�T��ӡ�`��DPo-WQ7Z
l��``��Rj3TI4�ϡ#�F��
3�A�rg�&�T�5*1�m�.?Uϟ��������t0�����=:����OQO�:H	Fm���Q;�p�:4�nh}�`��)
�*F��6�/���[P�/�Ӥ(��]D�Qu�K%e�Y�5Q�,��6����7̹u��8c�a"�Ӱ7��_�r�g c�hh5}uώo�����+��'a���d�<Y��j��Rr��,����D��&�����roo�#p�1�&�!�?��N��b�oDť\�1L{ֺ�?�Z�LncE��u�X��+vH�����1&��2w�LV�V.(��tz@���1G�9ŜɆPs v�^m˒�3n:�j/6�`���h��\��z��<;Ci%;Q��c��0;������,��%�]G��0i�x�@A4�ۣx!yd��-Mҳ�q�F�x2�-q�ͭTk>��뙩�k?3�c�Ɂmg���Ze��h`�$hkD��J$�f�tH��nŴ�E�1��n�R�	"n�1��O�"��b2c]OR��J'O�lA/�(3��fA�,�7�_�fFC}�C�(��q�?�Ah����G=(��s�#V�lG�ц��[�$e��9�p�gi_��d�b�E\
�f���j:��倘�Q�yn�z���)�8-�oS�\�)��j���?e8���܀��EeBk�1��䧖���v�@_��t�u���u�
�6t�:�S'�1�놸J<5�t�V�X�mq�&d$��K�a����r��k�,e���R�W9W�@Lv�ȶxkubrʀ�S�&�/BXm� ��v���d-	��}�f�#�p�:���VJ4�iM��:��:}�����)`/a�&�\p�h�R�1QQy\˺	�ޙ��<�>�Pz�%�S���0�@g��g;D�n�F1AU`�$H�־O�����TMwW'��%;َ��)b-��Be�5C����b5!:B�@��Ph��m�����t��}�d��L-��)���&x���c��ݘ��1����N���ܽl�H*��̫�V;wX�0֠Ö^r2�R	��
~1���J����z��ֻL��í�@y.Zm�#�9o��7lt���G秃������4
"��9�DTM:y�+:�F�lC0]H���l
��#�m�HH��WbG<��'���D��hp����%��F�]eV(��̀
jo&�ה���g�x.�oZ�K$+�MЁ���s5;'>=v������HC��Vg��U��MvW�
�=�Aд��6Z�ĭ=<S�[�g�&ugp��R{sI�R*t�r�5*�$M�zh@UJ*8R؉^xϫ�5Q��ي�Į��`��ݦ�sE�j��5���h1���1�?ɂB���͎8�řD���!���J�y�	W�B�VcK)Y��02 :�h=>}���Tի���o��E����n!
��;���o�9���-q��I�hM���s6,��_?��ɩ��q�ӥ�Գ.�r�r	xa38a��<'Owv��D��nZ�u�(WΔ�MD.4���b�PJ��ϡcu_;�֛�R`{�[B�v�@
�}���L]�����I\�:L�V�������~[�F��,���*Ȓ@ߙ�*�f�O�ٿ�0�����I�⼬�Gд��t-�'����c�����U,�����
,�Nb���2M@�ҟxYe(����#�eE���-�^�_�8��h��8��F�j����#��2=�����u����U5��q-��
�;�.�Xm�А�Ua�X:�%~ʖ`rQ!9�(���Nw�!&�1K&+;�k�0�'9��<��5
=�
i�z�–��7EG:*c�E�Pv��:�5j�0�������3uv
$�X���5�6�LI��ܪfm���'*&��4^�+���EE�*@r�@�w�s�p�DQ���j��9r���g)�g&�vW��l)m��{F�,�0�|FId�.M�<pA2�Q�k������<"��I��W>d������iH�0�a�:�n�f*B�&�d�ۦ�*�eu��of>������w���b��2l��s`U���'��~n�Ŕ����$GV���1�Yh�7�c9�0+��4���� Wu�$�cx��t���j4�	�V-x�`�'��"�S�Ѥv���	N�ٚ�����;�O��qq7�"{�	��!8��K/DZ�{�09�
m�X� ��,�>t ���P��j�@��)¾�/Ꮵ)��2��*-��̃��O�	�#�d�5�i���*�%�"�	V��_sv4+��u��V��i�GU�����寭*������U����V[��_
['x�s��a��M���2{`�'�D~���?��>�~��I���No29�
T�|^L/D��hk�U��݀�zb�/]R�%jhS��ǝg˨Ǵu5|�G��S+bJ5�f�<��ƫ
e��	�/]��������r?����R;��Vs���l�����Ɔ�g����V'��8�6܉희l�yE��Q����(���A�{����%��N�c�N����#F �	]ϒ��8/�x$6��m+m6�G���S�N>�-�XL&��pU_�hkJ��?=����Pnl+�\�p*I���x&4ƴ�Cn��C�շ��b���Ei"\���{�O�c��'G/��
R@�R�
��|�ߚC�&3QP�1�W��V�Q�s;dc}��A���u�QM����*p����7\B�G����q���%氿�08���4���)��z=�I��z�q��)����]L����߿;ysp8p�*��I]�'s��D%j4�E��k�\2.���C@Եv���7��9I��B>8e͵�8Գ��D]ڤq(�j7��7x����O~���R���E��Z"���88�{��`���78��������gY�S�(��v��6�b��2Ǻ�f�v�m^�`i?��70��w����U�M�z+3#��<�gA�
Ώ߼��.}~�d[X����:��SgC��d�{��@�I�in8��	�Su���
�*P�߹��	5=j*��2#\�,s-R�����j���qF��R�tP3�~���Y�P
+���@mt�<.Kp�'���6�C!�ɧU3�-�ʹM���\�@bc��w�_�*���P��L��-�����|&��@w����.P���P\r-okPV�uRdQ�`V��`�a���V>
�;���~���� �8@�Կ��]	�������n�ˆC+�A�}�h��
x�U��S.<����Ts�]pf�{��4�����4^��ǫ�sDpخcL�����{�H��\��LI�;,�Ă�P߇��@R>��m�Lt,�x;VO��X�[Ŵu^��k�K�Z���\%<8���f�N�dY�x��1�{��'��\6i�cץ?�@q"�Xo�h�3n513U�*��Vw]�����3ch�����mnHP�4$�����Jf+�i�p�u��-��]c
	F���n���\ISz�pE,.��N���
�U�@�yO
��"����xb�t3�I ԮjJ1+�R�h�t^]�__|�|����n�ﺩ�ns�Б{T�\�w@��\vl�7u~��T�ZQ����W��_�fEϢ�|�����X�k	��pӏ\�W�bL�i)D�t�=WU9�~AG�O���zVx@Q�_��լ;��
��@"Iu���4Z)�Z��떊�*|�ί�_P�[/��m��w�@��	^\)��|\L��2�{\�O���(��|\��›&�l5`(�1m�?��D�5�(�`�>W�APA~�eb��k�@"ЉG.�Q��8fA�z�D�_���o�n�Ӆ�D�)��2'qK��
������Չ޽������YiD��Xꕒ�#
�(����΋��-�6�oO9�����?����g$��`H�
A@<d��y����>��=ᜦhk]o��/J��S�k:���5_ݪ��u��!�T�T�� ��q�f78�潤Si�y�kF���0+��Z�^�`~�^hȡT�0r��xGsM�06�.y�6���C����Vx
�Q�+/��/r��������H�o-@�J'�
]�I�:���fلB��&[U�U�5Xg@fF#�/Z��D9��h�x�W,c��1�����@j��v|
Q�mj(�Њ���^�-q@5�v�G �<O�^I��W[==6�tvF�����н�7�����f�`��ʜ���V���yhZ�����UV��l�G�J^�H��bKq<��d�r�G��8��N�3��8)E�`�P>q�$_#".P!B
�
=�&����>���lAj*�j�ND�9��o{�����ȿl-Ω�t�zN���q�|��]1��W1:�4�h��ț��y�\]��#~Ì��c&�;w��D�	uo��w�>�{��+oD��6/���q@��g��D�l�ڥ>��Ȭ�������U�!~��[�KƧ�舄/an���o���y��"��ޜ����;��
X��y��h��O<�B���%i6�Ȅ�`�PW֌�h�Й��#9����E��o0t�hfy�'�s���/��m�K���7__�� M������O�
:�ās �^|�\�ӽ�Y���x=V��x/���[���@��nè�q��=N��?���wT�y���P|+�~����O�E�j�Z��]l$�O/�B:��rGUOB�ĭ�qS�_�w��ᛑ[w	kP&	X��n��M++�M�̩p
��9'�6["T4X��z�s���2r
�j{�vj��E��o�<3�`�E�@�|4Bs��w��������ߓ���D8��yv�P��ӝgQIu\<!�*☈��k'L�x�����|�T�:�즃0{ؿ��k�	iF�
�Z�͍�k�K�-C�
ua-P�&�V�㉾*a���<I���
��L��ʍ�MO�Q��[���߱�[�}Ư��po$@�G���)�re�;�v�C����7�'�����>/�O�q��QŌ|�X�P� �=��3�qC�%��҈U�>p?<O�U�O&X�m���]�ݚS\���&�a����*tA)5d���ߌr�!w(�`M������ӼV��}`���jزv�GN�8�D)#���v{��C������	f�yO���)q��a�!�&c�ju�?/CS����O��t��on�'�t���<���jX8.ti_��r��ҮL�Ո���Sh
�����}�����?�w�|sCc�����W":H����̰�p�����%�~c���R��#-;�9
�����w�l�Y��T���fm;M?�����&�2��5\Fl��G��,�ӝ���&˶(M��U�?�7t�j�Q<&˱vwˮ�/Q�7�&t�hg�oR��\`�����Q0�Ug��� ��Q��~MB̖�X�s)��e�u¥����8�8��ٳ����QDJ��r�~�F��`�v���K�
�-D������ۀ>F1_��K�jG����U�9�R�iF�RI�V�Y����l�	�X��w��O���_�Ϡ��C�l"h�9��*]���JPF>)installation/framework/database/query.php9����=�s�6�?���9REN��yI�{��&�9rj˽׹�x(��P�BRv|w���~$�J��6�\g�D$��],��,�˽����_����H<��Y�K��,OR/�Xd~.s1KR1������R^�L���r����r��E�'�I��8�.�w%��W��g~��Mëy.��~��G�����߈q�ϓ���_��͒e���L�1N�`E�/��_��2���7�)�'��L3�뛾�"  ��{{����\�r�������a� �n��f�dfbFR,�[�'q�1�H1K��ȁ�?$�"�o8�mѯ�&��o�C����׏��R��U�K�����/�c`�O'b饹Hf���q�M���0{�R�$�[�?�^���[�2�g���R�p�&�!�&SC @;#�5ŗW2��H.dS	�
�iO#�}���,O�J���[�l�(z�KQ'Ҡ����}��eBc�觖���W�J
�������1<�ro�e��S��k��a_{�	�J��0ɥ�+�)&�U�p5*ۉj+�`�14	m�!~4a�H����@�0Ȣ���dV:.�2�N�9ÂeGd,#��#�/TO
���V�O����ה��m��_P�������9����
�V���j	��X�"��J��[�b�bX��`�k���8OPŀ�ʉ��h�����S<1�%��*�5����浫h
g��VS�������=���+���ͫ7���1mq�tu��p��@I���US랃l���(��!M�C/��
���!MJV0�l��E��1(��_fy��+)^#�չ�N�23
)�'�.Y�ʗŔXD�r!ӫ�!����Qa��5�ja�K�-U��b¬��\"�6]�\��LK��VC���d>O�[��`��\
4B@���$�u����L͘�I�d�f�%q���]�@�Mj�AiI6a�)��oų�b���X5�/Ŀ�-JI�&�z������
��4���-��=p~h�i�>���0
P�����9'������~.��(U��-Q��j�@��w+�dð��޻�PΞ��zԮn�k
HI��y�Й�ޫ�T��<�j���6k��(Z��VmO�z&zز��
6nu���\�l�@�G��
Zt,�A�e��]��h6�]��
�7K�
J��d՚��b���"M��y�;Dt�Ao��.S
�@߼��S
��Z� uW
����b�j�p���V�M�����[JI��l��7Ү�[��Jp���й�V���5j;l�`+�~�1�W�bq<>�M@�@[F�^]Oǐ����]�T��1I�'�` �����Ay+0P��O�Z��PFA���Xw��o7[^uC��,�K�0��Nq�hyu�Mz�ͮآa0�'�f,��7�Z,���2k�Es��G5Ϸ�wx�U���"2WlT/�N��v]Pm����t�:�P�H�щA�txԀ����3~��"��TzZs�I�?��0'���|���w��m��=����/}0�A)��_�����	�d�>������q
>�ç��p2V,c��!���>۫�>�����4,T4>;�ԎJXi�V(�^n��$��wp�%.h�hG���灴)Kb��S��(�4�_��Z�a�{��τ��j>�E��2]��=]�
�.ncЋ��ʟ|pp Η��Q��QƯ��+�''��!����	�F?+(�IT��N�}jD�φ���
�:B��6P��o��V5�6���A�,"��Z�l3���Xs�[?���eP��ɛhd&�U����La���Lpj��bG�����k<��c�����P�x�\�
�Ҿ�����z��>-��΂��C�žˑ�9�����\8u$�H3.ݓ�6�ک�F6�
|���)4j�K�n��>���~F�>^	
8���2j���"����W2����k;���5�`FE骀�"Zl����ճp�{�!EI��t%U��iW+����h5~+øF�0ШT#��l	"�}{��ON0��
RJ� �1��Ͻ\�&+�X�['9R���
��u�}4�S>�[ơ����{�@��[t��ɍ��/�����lQ���RFgȎ��w%��?YX�]�|���� �z3NP�P͸]{�J�U��p��;�p���!��y�Y�@s=���Ͻ�H�����F4�Y&-Q��av���ڡ���y�p%`V1pG�����j���?P��C/Ü��Ƀv��(�V��\���n�+�[ T���W��eq�[ĈE�-�%ˇ�! ��.$��`d�0�e�m�:!��B)�;�h�L={jI$ƫ�|NT��l[�]D�
w�H�W��A�f!��*��m.-06�1`qB������Dy�g���πq�ө�o$&#��)_}��䡞ፃ9n�x/�q�7��8�4Gw�&���w�0	�n��Nk�*
%��;}�v�)�MD+a��s�jxvy2������g**�?]�ai�=�?�M���[W���c�'�q��XaEq�����reh�π�έ�ev��8]��C05��֮��|!���8WZ�RÛy5�܍��A]�~[\���,)ܥD��?�XG�xc�7�uM�v;xU����W��Lwg#x����o�:f%=��=�j�J歵,��T��=�i�����Z{Q(�ګ�k��a�j�Z���i�ݪ��vw�m�j�z~��';[Վ�,�Z��Sә��aw�E�S��?A�GXԲ|�3_��9�n҉�Z�c�vM`_Ӎ�g[]�%d]%օ`u�4w��] 7SNkD�&f�y�F�֛��ƒElu`ٓb3�&YEhϣ�r����i-�ց3F�����qm�j���J��;mnoS�M���ڒ؇)�=�L��2��2��;�%��i'�܄6?����C~���z�	3
��Ad�1�D�3ڑ��‡�(r�؍{c��F����+j�&J��"sŻz��9<'�1�_�(v�"�)K�Un�D�;��k��/4^3�R�����h@�B��C�u���\����Π�'�8��R�-�nE�6*o���Rgg���rr�zt>�~��&�ZuxX�MԹ=s�a����*�I�d�
��:��"T�Hэ����Xe�f�Wb��I�nf�Er<�8!lsR�Pz>�su��@���EHC@�d:	B�ra��As��F�=���,s1)���

�f��Z���X6g�K���SP�h�V1
��/ɩt:vy4�_�G����ӳ���OÓ�ˣ��/~N�vM�P�����^�JS��#X-�7��+����2h�J�Ifѵҟ'ŊAH���
�w�Tr��/N�(_>G=/SI��u������x�&����S�IA|wP���)�����h2��#�6���z��J]�h�}�t���Ff��
W�|wm�(*Jm�	�V���{-v��j�Y�P�AzѪ�(�/��!$\���h)�3��u�T
[b<3����Է�J�E[.G:͹��?7H�G<0��7;Br�N�*<�(�j���{�$�$ࠏ�<A-@�R������'U6�#6k�Hۃ�X�"�U�5��OH"'P�P�"��_l+HW����d��6���]3�������,��e�(2���-CIo>�%Н��0�-C�/���T,þm�(m��"��|]��P"�����ME�f�G��y!P
���E��|�穀io�!��R�vIR��Μf3���!Mb��]**���)	s)���$�{�f1��(�i�VS�ray���E	��
�y�b�]m�t��0��o�"5�pˬQ���fX>"� ���v.�W�(J�N؀�*p*�*\wޏ�''��/~���|	[����U*�4vx��BF����EO��
.J��K�t-tl�3(R��x]ja�j�Ҿ[�\(���<�N�-d����)�X��%�vK	F��䎃�f�`+�
,������Sv�,�Sh��"�#Rmk��5�����3ڄ�9݅��k~/n���1��6h�f�"���OǺ�`k���܇���������nV1-�>�|O6ϓ���!�	�����nV3=-�~uzqo5�+��Z��]*��h��5�DQզK��*��=�3��Gٽ8�0v�y�p^�ڀ�Ο�O�Gk8��%�E�r�^��^��Z�N�0"��X�]�P��Dh�.�>����mQK`�8��/~�л%�[���(�+B4��?�_�g&u]���^�'n��s�m�j �>���v�te�u5�E�'c��Ar�ʪ�∫Y���hע��bkܦ�;viR��JqR݀9p~)a'�G��4�S�����E��՗
�/�$�����l\����L�pz<6�37�0�e�L��L��X`�/a��}|��k#
g&�η�>�x�k!)�6�m+a�_�$�[e�8y�a8�L�����=0k�g�L�a%r5��ڴWT�`���<�؟K\��������M���¸�/X��+�|��\��>U�F5�a�'��IX-k@�0
c�v��5q�	���|f�Bj�cU�k$�B@�V3*Ɗ�yakE]
�mW������p��j�YS�YS;ZS���7[T�`�xUmeT�ņI�]p��1$�~�"Lu��jK���,��}+oo��Y�X��a�c�!F���n}���+�ʫ��^?Tm����)O��J��P0YY�F74kNF�O���H�r�Y������nyv7�䣘�^�T,���(,ϭ��;�hL\������L�����1�o�A�����i��ae5��k9��g�x�����)�8���i��=���\���*�?h}(2�"f֊%{0c'�K�_}��(�`�Vˡ���ab���I�eVN��.�	���p�:�k� -y�gٶ�z4���O��h(��@���q
��O?�Ֆ�U�:CnF�y�Pj�<=;��9�E�\g�$�3�_S/���F��غϭ>�('S�>��W3�M��ݘ�	�8�I�Q��Ӌɶq�d�wř�ן��Pb�m#��f$�ն|�5z�I�T�%�XϬ�:���Î	�j��g�ۙW}w�Ź-b�Jՙ�r�"Ϻ{�x�.�E�o͘"�
_1I���;/@�@�A�9�4���T�D�D!^��!�T�����Od���F�/�b�x�Sޫ��
��F
���؂m�r�DNG�s@&I��G�X�WT�-��_仾�#
�������k�σ���&$�*¸����w�'8�mԓ���u��M[uqΠ�]Nw�^�\�5�tV���&�s�%ę��!�f6��k��Cxx�䂾,��!��\��~RJU���>"���fB����q��s�4/=m�vj)TF�F�$�7!���Ʒ�+a��_7%�_Q4�X�'&��4ᢣb��~S��5��o^|���t���㗯��^����Ʃ�32NK���S��6I��Ϭ��N`��D��Y�]�[ѧ������z�9�^ѕ_��WԕJ�,����ןؽ`�
}`x��,��륭M���cc	���V1B�t�����?n�P)@Ԛ27e�V� ��Ւ*�rH�Z@���lL�)r=��d.ШS�tx%�խ6u����Bn�M�wT&᭭w+KR��t��I� ��?�
j���Iȥ���(.�,���!O9���<%nO�/=L�E�'�������U�&+2��ų�y�A�^�WT�	68�N�u��x�ޑ�.AٽL1����C��v���*-.ހy�	_���;R!c\b��`���òR���z�+l����-����H���uٗ3O�Y1�v�q�eT�����ހ��g�;�Zf˨`�c�����m���V�<��֥ڮO=�����]O�"B��c���}��)o,[w)�����]�K�!����ۛ8
ۦY�W��5ZĞw,L�����w3�~vǭvb�X
�?cGUlQ͟m���S\(h_$z[_�M��?�J����ϻ�Ia�]��O�|�ܼ����_k��T��8���7��r∵O=UTw�6)b
N��Ct�]h�N��N�q
���Q)��8�mWjj�B�_P/���{K.IQf��8��h+�R���q�
d��j�r�:ei
�vRc>�RxM�"�3_�/�0�Im&MS�]��Ru����X���gZ�k��$���(��w��b�����A ��[0�~�8� ���|;xt �f�<_D:�Q�_��..՗�L�jɗ}�O�� k�Ȼ2.��u�7���(C�S�eW|C#W�h֔c��;Lp���+5<_�^~O�Ѿ�v�5�]5FZ�uYX�'1�� �E�����f�dz�W��J��$��M	P<��M��9�Cg��D����(	�r/���`��4u15�-���[�{�{�H�(��u��b�B��)f�����=ta��Jk�:�`X����
D�Pf�7�T�p�sG!�5���5sj���T�rN���JPFB-installation/framework/database/query/pdo.php|��uQ]oA|�_1�A�/��R%H[J�������*�ݕw����&�V�d���㫏�	�l4*0�b�\}�ۆM"0��Y%��fv�Q)}h��t��T�U�Ł�R�>!\}�|�֋F�����`oh�iz6�&��O�V�+���I9//�6��VE|��V���>bvָK��e�&3�r�Kr��b�V�ݩ��|��r��X�g�ٌmc"v�����.)�$ք�#�����Uo��q1�8~�<d��d�r���} 'F��	�T�8����_b�[�	~�O�i&\���M'������ڒb���|���c��M��x �;���'�L���/|yh�{\�����q#/���S,nUR��47�=%r��N�U�JPFI4installation/framework/database/query/preparable.php�����V]o�F|�~�0ېe�A�֨�0��C��ʼn\��w��Q���w�HJ���
_(������ҿ�^fe���GG4���A�4͘�L�}�Nm
���2��:���*I�$�K��8V�S��i��<S�9a�v���9$�E�]�`"Xh�k�-�N/�@��_���p������-��$����瀮h�mi��z:is܄4��u��K��'�f�N�4�fؠ�fs����}�.��Z1���4�9S�֔X�6x�Lsg
齵E�~�	�C������g:�h��7�t_���K�nU@Fߧ�I�dx��O�T.��3�@��M��%�dZY�OrV._�{FQ����L�%��tv���oRH��K5���J5S�C�nM��f�>6`4WI�����fڤ'��2�5`Yq��[т�;[��Ӄ��\�N3�	hq�x�>JK�d
a^:�R�}��'�ط�tᵁ��f0lW���v�%��,��n�Ш�o	����({�rqh�B�
��b(3PV97�LZi(0�Q<�?܀0<Y�	8���W�h�{�;.�4b7��� �a�V��s7�ڝ�*��h�=V�ʫhKS�@�Ŕ"B��Y|������yM�G��,�p���k4C$[s�5��c�������+���vs��GBH���3@xݧY(A=�Mi|�˪П�p��گu貪W��堳�)1;�,��,�4y�*����e~lz�CO��{-�_鐵-�vO8�0�_��Ԭy�S}�.[���A���u�]Z��ԵU�hr<����,��]��L�ֵ�J;�Xi/ߛ����i�a�"a�]��Tdw_�8����d��`[/v|��S9C����f��Y�'#c����2I�f��;�
qۧ��Q��V�s�kruv6=�n�~�>�7Ӱ���y������v=4�GY���1K��T���Q��ÎS4������i�9��߄[��;j��z8L[l�9^ψ��FEb���U��ҩ��JPFD/installation/framework/database/query/mysql.php����uQ]o1|�_1<5���U< ���FQh��jxF>�^Ίc�8U�w���T�v����~����F�#��z�	�
!�H���"*k�W.������Ax٨#HO"R��C�'*'���/OV[�H2�OŎ��oҺΫ]q���a>�����%�E��׼P�������m�z.�$���W��X�!/4ڒ�=
��C�u9[�l���Y�UT+C���[q�\.��aT���9�m�j�	�AZ�2\+B���#�b�A�7x`r��0����;L[>��ޑ�Z/	w"�>a���ӿĸn�p�G�U�i"\��ȫ#_�H�a��?��$��xm��q���M��|O�=�M8I$�9}I��cK�âU�Rf�+>XxA�Ԣ�Q�"P���w
��T��T����~JPFE0installation/framework/database/query/mysqli.phpBS
���V[O#7~���S	)	
!��-��E�].ےU�c�!.��`{B�.�}�/�LҀ��4�}����c~���W���������`:G��!�N�.�r#+�60c����>���
2�fK�<"��&�R�v���û���S��d� 1�q]-�|�;8kV=��Fƣ�{��|���e�(��Օ���p��q�D�R�ci=���7��
S��\����z?JIQ�.v:sY��u�'_��O'ݾ7{���U��si!�
�`K�tL����8*�g��~��Ne+���vm<z7��
K*Sm8�5s��eɇ-g�BŌ���2�Λ
4rA�-��ytp�̨%�m�2�����+4�2z!}ilr�_/�0V-���Nk��,��т�%L>1�f�b0�^�'%�vX��C�E����m�\�B�O��:�w�y��� K���d���bT�ύ]+�5�;e�{��E[�x'f�����Lۀ���Z��Ph!�%0x
�2E=$(gj4g|�<���t��D(
B�@�b�"Pp��:��V�EY3�@�!Fm���j"W��!�X
:c�"��Ƣ�v�7�*ƺ���|�nb�mv�at�Y���,E�u��x#�8Z�Ջ�
R����1����D��z)�����I�	FY*���puy}9�ﰱBw7�N�셴����e�}i	�L��FUI���f���C}ʵ��JV��c�T�v�2Zxyä��I?|�k�[{���A���E�+�h���=#�5d4d��_�4p�ҖS����Z潔Ѡ�1	_�6i�ٚ�r�� ��no�&�?�z�G�������o�,#��V�(�K� z�v�������}C���Q Y���*�d�"�I�P�; )��B[PwH�խ{ɿ���d|sD�� 聡��uUiC@�51�Yz��(�ˆ
�n4P�|�%`$�E[`�3��ϚfR.�u�F�wc��&��.��M��g8m?|�G���+�g�s�R����ՠ��j��8)\��XRv�z�I�5��ys/���F��0����JPFE0installation/framework/database/query/sqlite.phpw����Xmo7�,��) DR ˊ8���q��W�vc��\�KY<�.�$׊p��̐��ޚ8'��D���?��}��e^���˟�&s	V9	FZ��pJ`�J3m`*�Ǫa��z�#��)L�p�(�T��@Q��ʝ�4� 1?��+$<(�k�.�F=�\4�zI�h4�����5\�d�3a��!�E��V��ʴ��ZƕK�W�YX����B��m5�
�
���X��Ф
0x��];c2Wf*���%$�pB�?�03:�N���y&~�[<�����j��h��nJY�#*�Hx/J��,�a$�_�L�Ɓ��2$���HSi�3��Y�B�Gvx�Ia�%�m1(�1[%s�_J�K��o�b��U�5��vE���f	o*���x������@��p�Gڄ�‰�����=e�F~r�H77A�e&sY�͝+�+����ƭ��3�i���"][D	aܒ��*s`�S��,�T�� �aC��h�לL�fy�^��g3��yƒ~���Q.��"�0�B��TW}=����2s�I�_��\��)���^?�^��N�i)"0�\�+�e
�E/�e0�A;�C�Q�PB	��̣H#�N�@~�IEug��,��\S��咈9B{*1�jݛ�l�w�b�9s" .q�ڻ3���,ra*G�Yg�C�:��C��5���|�)��z��	FΤ�R����V"���3���bAu�cT�;�i� �x��B��׭bLD�^t�b���v,��.�-�[@d���S��JY���}�]���*�T0���R[�(���@-
%#��V�vF61�N�uc�,k3/�:�L��ӥ.��1T)hD�kl3Y<�:���R��5jW�6�R�<�����$�zC��.Dv`��t\�A��u�a�����t�)`wQ��K������2��d��=q%�(��̪"��a����Is�)6h�V�^��~�}{3ߞ8��n�a�8�F�MÛJ�o����
�Wc�9/�~E�=�,��Z!�-5��$2֎x0�V�l?8�Y[��>&:��/�H�јE�R�ų60dJ�*HrW��
)����VJ�=d�[W�_������X�n*��+�ی��"�u)w��z�଎Z��I�ů��j�	`etn#���=�=�zw4,��PN����kP���5��7#�@bP83�p—��a%��4��u
h�<���A8y�%q�3,+��!�/��~9n�~G<��v�p�.4��n:#7#j4ނ��ߚ�/�{��ĩ�n_"��m���j�����N��,����H�������y	�	{�-~�k��T7��!�%��T�n0�.������=g�_;�ά̰��꟤���uE�Oٹ{��hϔ�B�>C�J�������-�me1���T�
L+�M;��M�$�	)�{�4�����4�)a�2�@�zkv��C?�cu�L��D���~�FN�ND.i�J�5 �B�{]֞B�O?k��,������i~�.��F�^Y�C���(;t��c5��y �J��ڋ�*�g/�b��J���͠�-�X�j&��"HJ�ݸИh~"�E&\�e|[�_=V�>�ڲ�0Z���fS�j$D7�Z������H��t�`�p����"��M!�6�,ν�ʎΪ�`�[�.������b���b�@w��cW��G߰���Fa���Ἧ�X�fsi9ǹ�����L`���"zU��'}$4��Ʒ�{�`� �t�O��6�M:����?�T��x�41_��\&�A�������֑8�;v�S5�Q'����Mp]��Z�U�Y�4��q>R���G~���e\��*ôn:Z�>��r����P����W�W��M��P9�����:�%����w�~���ќ�Jz��~�G)��D<�G j;f������(���
��w��.��i�����OC�2�{j _|�e��1�5����s#�cMs�4��5<E�_]����N�)��a^/a���(�w�xЈ�ϧ�-����w��@s�W*��x5��B@?	.��D6ÚP���)c��h��w�:FV�뼎w�:a>F����W���g�Ho��b(�5M��G�
�ͱ��zݾ�}i�JPFG2installation/framework/database/query/pdomysql.php����uQ]o1|�_1<5��E*Hpi�(�M���gorV�ؾ�S�g�&<��3�ٝ}��׾�(���#lkBԉ(&D��"ʠ}��TBd�[���D"��Cy ��g�U��O�8��6�=�bO��No�.�}�p���l:}=�Mg�XkY;#"�Ƹ偺�k���\<�:i-�Ƭ�\ƒ,a�i*p[
1�u=�dx���'E�h�-��՗�n���W�LP�z�7�%�m�#v����t6	m�*�.�#G����/�aq��8�s5�n�0�j���=Y��	�� ��XY9�͌�q/B���e�W)S��Z�7�sHC"���>�Y��)�}p���ijE�����ι|l(t�7�(m����g��-�[�D%"���]�j@�Y�7��1]<?��JPFH3installation/framework/database/query/limitable.phph����U�n7}�~�ɐ%E�z���sq��y6(rVˊKny�*��̐�J�}���̙3g�?��5]5;?��V��7Wp�
B��c�΋��� ��"���Z�m�@x���ED����k�}�U�Ν3�rp��::���Ƽ']w�z�D���5���|���b�x	�Z6Έo����\2.�l��6��e�D���#\�E/|Hk:����}�^N�J2T��˳�RXk�j�a����r�|�J�h�c5Hu���6�8�t6
miU�w-D��s��'���ii@�-���xߡ%����D$>a7VN�JF��{脏��G�L�&r�B�wԽ��mn�4(�9m�����!Ɇ�}��i�&�)�i!�E�^�W"�� y�H��j� �7�
����R*�Z[5K�h16������U��KVQ3�}_����F��	�G�}%v�kNI�-I�r՝������33�ebc�z����\������k<#�w�
�h����Pah��
��
�K+"�ul2W�H3�PJ�,3�m)�N�9����2�vMmruF��L&�l����$��u��;�(��Ha�#~Z
C���e
��e�G�Aנ#�QF"�P"v��QO�v[���IA����9�a�%xV !?D=�7���d�
�ϲp����3*b����"V��?~�����aV�ue>�de~9i�$��E��&=��1��0����;�����O4���O��SM!u�����?z{ȟ���/�Qؽ��'LF�	�-�nO.��P�k�C$
�y5~kIP�S��cP�9��WH��֞��ϼ�}�!r�h�� �PM���Q����T}JPFF1installation/framework/database/restore/mysql.phpr��uP�N�0<㯘[ӈ��=!� �Q�Z"��{�X�bc;��q�����������ֲ,MR�U�X`����U 8�8���S6`gj.��w�U��x �z@�'�9V'E'�ȫ�&z�6�6��! 
EGL;8մS"����z��/���h���+�c��kzm<���6��-�u~�_V�(�#�5��:؞�9?�Z^"Vұ���c�v�#�L>�MQ���tHE��1#x�kx�=�?DO��Ԡ�@���U�]��JPFG2installation/framework/database/restore/mysqli.php�!z����=�zǒ���h+:g�$9vbǫ8XB6kI������
3df&�~�s������u���/�r9���0�]U]]]U]U�ǣ�d}��uq[ԏ�4�*:�H�����Q�~����T�X���t"ܸ�_z��Ǟ�zћ����\�X��I;
"��h~��[w�	
F�G��d���T��O�~������;߈c�n"���>4O�I4
�Dl)��`~����L<�B/vq2�q(_^zq��"`H ��[��o�ޠ�t����u��
�W*?\_�	��ﻩ�s�8�͓__xoS/,�^���<^�Z�8����IO�Ф"� �f��&"�D����1��G`2�:�^?�*�yHL5|BO���;��l?��A�›�����Ļ<�Wٞn��z�+���n0V��Z_�0w�ӰO����ѕ��J^y}
��(�0�������ֶ�D�yC�&Z<���鹟T�/�n�ط˃*A���;�ީ�0X'�Ix�h&f�^(��$�S��^��(%� e��MD��4.K�H��*8q|vxH��ա/�ZMv�+������"�A��Q�~Lǡl{O�����37�:��[5�xz%��\͛��;@��0��s��)��I�1�y��o����}3
���4��N��D�ɄcchT;w��]3�F��p������_?�A��1(�ؚF�Ξ<�+�B��r�U!?W�U�i�-�����5�Y/��K�L���	pV:̋�B�K��/�<(J��-�/�;�QNP��ן��?�^<�	�'����T��v�#Z�����Ƌ����޳6�{���֮�d�SK,�_�8ZEVa{j��t��c��n7[�5�q�1�&��s����:����Y��:�q�z�(z���7��9�s� �2��Q��� ���N
z�OҲ��b/�ơ0�v?K+]G)L9`��Ȟ��������I}�<�n����Hq���&Q�7zz�x�9;�T��l�C7H<�2Bu�������!<d�~U"�"_�X���R�mߛ�6=M`z��,�ffH7��M/.9NE��ޮ`o=�
��,�?�ݭ���{�N�W,]Sh9��ɢqm��^��41��p�����m��^�=��t�o�F��c=6Z ��6�}Xm?�BE�"�/V#5q��{��y�ܽ��gߡ'iMz���I��!Xی/�ZY��7k0�.
Z� V2�b:�d��@�e��-�"Jͺ�dUx=X
o<I4KˤS2�F�0-�\�3k9�j��s�9Ռ6{�[ ���m��D��,e��
b�����흃�k7��)bA6����p��lB�̀���pO�fB���;$đ_P�/u�&�'��??'iQ���(�\�.�d�϶��N��r�,��	:�ĔH���0y}�y4o����=�Mro��pc��l+ t	Ў���gG��v�&NA<�����Y8��n	����GW�{��v��w�W�8���)ߴ���T��@�M��&�ox���H9*�m�\ �����"d���m4�l��dX��l��G�B�_���{A�l	^����pzni
����w��8ޑg�w&��!�is�[��}��q����F{0@��k�V�:j�
�A��-kd	8p��H���p��j� 6�w
�����e��j��\���u��Z�����i��3�iG�MI��F7Z9�vG�d��hV#�[r��i4�DZ�������1�
�=�t���.�(ѽ��[����ڕ��� & e��~
�,���F�����Æ ����7��*ڎ�
��Ҳ~؁}\�+���m͒�ԴG��Tn;L�L[��Xja%�+�ܛ�@ZॠT���
Erp�a?V�Mc��>�=}0�1���R��qJSo<�����xw�M���e	�z�uԻ�����3>�q.cP$���}��~��x����ʓS?��
�_--:9
���H[�&����P�ŵ(���$p���יO����+�p���[�
F[)��H��f�e��!�
�������G5�_�^�U�']��}�Kz�`��sh�@W��PHQP��=������%<+Q'�����i����g*�E8�o>��s,�9z���q{P�)�R-
���ʼn��(��6��J�,�>H�r�%���X�Ύ�:����;
��(vfp_��#��s�|�q���N�+ʜ�����)yZ�oY�����i'��9d����"����R�5�ċ�?��6�*y8��Sv曜<��L�홓޸}[�F~�L8B.N�'�_�aΟ�I���h0o�&����W3��(�+�O['"Q�0�Ƽ�0��P�x�c���ik*��v��1��5ѵ?�f��H�x���i5uW��&)��3�h(�8�1��<Em$wQ�=T�n<�(Cj�@�*
�c� q�Oo�=�6����}�r\�
��7�p�T�p���v�6�����v��4���ݫݡv�-F!M��BÈ>�p�`�9uG^��/�ȌF4S�7F���*|�0T�bO�ꗣ�٠m��soNHq;%�e�&��x�̟"r�&'�`ECM<6
L\E�D!�~(�I�7r��Y�Xc9�CԐT�cw� ��"�N3q���C�w�u��mh�F��ǕA30
�pB�K�@�H5�����$�~kk��0�,A$@u�k�h�z����$U?�R���vu{˂$cU��<2�V �Wn�U�	�?_��0|
zjRpP����� ��:������w�x�oa�:���GHД.#cF�'��0P�-���8�maв�B�
Dp.�&��x��vd�3��Ԓ}�R�G����������a��I4#NJ��?���a��(���ܽ���ݑ�:��B�|6Xj`*�����FCU�l$:��6��ұoSMob�5n#[�I�`=��V"�H̓�K8�k��0��UR�}��VJ��p �q�K7�]�����~���C`����,��q��=)bl�/QΥN5-�H��Rv(1�d[ʬx�e@G��屁L{o'���a�S<�(��'	����Q�u@ R~���r�BV��lԕ.9[���K���v���w;��n��[>�����K�vK���s�[���j��D(Wi-���b�Z�e|ť0FWw����^f�>��.`	��5 �`v�8J��Ws�I�s>�ʡes֋�RoU��ӓ� �~���4��m�4�rL�W
$�@�GH�_`����_D0/C�-d�H?��m�fgg����y4��QUVHI��y4@]�hm�
��s>r)/���7m�>FS��p���G#���>�ʽe������H�g�q�<jv`��64�FQ����q���(E�X�ܴ�sŚ3Ѩ�=�����Ɠ�1���[~�~q������{M�x,�$��)!d9�B�����%�.��/i4G��G�R�CM�#�-7��Z�~��D�y$�vsX�l��-F��L�lK3p�p��KT��5D�$����g��߄�H<��؝�Ln-�_š�%�E�O�� "�u��r��Ž�=�)��?�Q㢙�CB��
B�f�o�`�Q�ʊ��$-7&7@3��M�&�;�
�d�8*I>���@��0簉�Y>��,��zt���(���~�V4�#,���#�d+���-p�,L��Nm.h{�N�R���U	CBE<:v���\._>���,E7T�ż�z~k��4ަh�\-��(�f3�R][�C�*�ŊK�	�ba�XYJ�$���:�y�Š'-cZ��s��&�wZ�HC��X��T�q�
��bb^�p3��.e�S���R���p^��koL\
k�d�D�VO�h�+��0�2�vf��d��ER0���U1�R��h.��
I�j7Y�]�_bQ�<�|��&'ɋ�E���[8�=��_���O��������<���MA��%!�Y���a����$��zAd��h=����/���e=PVD��'�D��J���9���Ҟr��L^<d,��w�B1C��b��&
��e������5�X�t~�ьM��Z?~/��Q�5V����hre����D-��"�,���C>�K�q�}��:����kb���S9��PK}Ͷ�Z`,��3�{�3%]5	��=�#�'�Wͅ&Y���Ij~�'�h���^�!^�Ҩ�"iD)gڂ���$.��r7(�ƺ}*Б��*\;������ѹ�l1��;�p/�L[A�y�y9s�����f�U��"?��qݨ\[[���^�
%�� �+��b��{x3�e�}-��%�YE+��w�j��A@gG�$��r�2g��h�p��"��M���|雱?�
͜�F�_I�C9[��h��lw��#j�)���<t*5���%.����>FJ�oW��R�~U�k�"�����jY�a�d��D��9�t3ud�,(��>�b�#iK������L�W�Ć��l�?J�ݠ�DJ�|J+hA�-���� �Mh��Z��9p�4���H��ɛi�l��g֕�Q�,o�.?��(Ln�ʼ�^�X��a/��J[
�������oT>�IZ��rn䠙�j��)�mmO]�2֔�Ȅ.XmR%�+N'���F�������F����:��I�ej�s����g�URr���!�%X��-�6�������(�0;��*�4�+G�ǩͩ���FD�;z��꧙u�̮
%��T�|���(��]=WVE�5��*i��Tm*K�ܯ�k����ʕ��OL�.���x?A�����*�V&>�&o��E��M�k}M����/ m�tbDZUG����<.^ۂ�qy�|���\���^mfV�h]_mP\g�����6����o�G߿z{�������Wo������ww���׃�z�M��7W���]��~�_�oo����j�dS7.獐��%t@�2�/R��Hz�:�@.�8
�w7�mƘ��l�-=bo�K�Q��	J�|v!���\E~���-�������8���®)��bN6�B������n�7^�����ѱ
�'�)a���0!0<y��Vin���x�?͆z��0Y���q���Yv<���-����TumƱ(�j_� ��H�U�
ϫ?쩾e��u�����i��Ǣ��B���;��/mG<���ჼ2�y(�c���,�Ч�	�>?��v��o��;��@�ܐ����l{p�
}3X��A�3ʈ��~	&U9����2��5��Ȋ���7���$�sH�������*��/�Z����[�T�4
.{�C��s���7bC���`�E�@έ%CUAr�qh��vDR��[��K	�h6j��cE8-��`2�[(1��M7� =+�&SlF�(��{Z?��!��� ��=��B���|k�^.�-�&��F*@`�r�
z��E�pg�E!�	
C_("�G:����˒VdZ.	" ��bŵM��5����|5{MÏa2r���d�9�X���]�7kGSXl]0X[��]$Ҭ�(B
��n��~���a"-䒟x1�u�5PUz��&�	h*��S���Y֋�z���z��&�l��~4
�_��=WzK�*s#��2���,�A°�i悫�����T��-���ٳ��HU�
�aRp�����d����q����ПAIЍ̜x��$Q���3�RVEd��H����r�d#yWQgrh�cwRr��iD��
,Gv��6�|9�PvOIT"�RX��EsX�,JX���B>N�g6,�5-'�i4��
+�v@�v�wE�T?���ԟhD�F�v6Yb���Tt��#��`��!���
��O]L����UT�M�tb;�
�p��w����������ò��K�Fl&Y���P��t�C�PpX'�Ko����� i-���mmK�<�(9V�.e�r�1Jx�wh06��[v8�qs�pJ�,ɷ�vD�
Iά�?=КhaLy�'���W��Ԕ����d�X��m�kN�I�+csرb�K���}
^u^�a��E8��0��3��̈y�l��
к��D��E��r���eMj�)��}Da�Aʠ��u&�x�X�n�֭<9]l���'�s����")RxB�X������=�2ɞr/�0�UɄ:5$UG2�U�9"�L����x����:^n��K,�w��ӾY�]X$,pVUX�ܛgž�D�e|��x��B�1��2x�;�]���,*
?���R_׏p�c[�$��ÜեW�I8��nx}Tr��7:&I�K�vf��
����������Y���:jp�W]!�h��s���8�%SVs��$�I�|�d�qB�e��:�?i�w����G���鋫���d<�}�G�#����P~����.6G��_(m�q*����5��� pG�=!��Ԁ��Q�RM�<`�T��n�}�M�ry�7��!�k�l�#�*��%�	eG&QG�逘�2��^9j��6�����e��+�"!֘���3AO�R��U�bMu�W���7��?_���ic�";��dڕ�z�Ur{����n;@�C[�?����O݃��Q������*�����'����n|r�����Q�H4���^�'E�?��:3U�bN��
��U��s���ct��{�2�L4D���ʖ�Z���i�y�y���"3
o�I`7��x��o7�[s�O7F7��uz�r�0�!O{��>j�.Z��=g�����Yg]�^���=�����ń/R�'���ѡ:%5��[�6pO��վ���-�5����@v�JS�SF�C�U'E�L�W��ⲑ�R���ô7ߴԏbw=
��~0_4.��z^n�h3x�&�<'�]}Pn��Qǿ#�i���&N�x ���k6��v�=y���qz�>��#�qg�i�N���]�����K9����Gӭ�B�Lʉ~�:�h�)h@���A�/M�2?����]�Cܦq�+f�����'ƒ�˟pi��}?e����W���ۢ
��ޥ7ݎ��2VՃ$����j�>�}?���ęG��Y���9�D���UJdn\�D���F]_H�%$�7:ä���t<aR0�G\v�Í&�t�H�z�U�l���i���6X�m�z�8��W�	<ZH}<~�&���Ёq�x d�������;l���K���t�C���k�UB|�w2�,��Ƌ�F���CA��2��hQ��ߛ4���Mf/�`�@�-ۏ�멖��l�5�V��}���)z�	�j�7�l���B0�&������i�{��ⰾ�%s9Δwm�<ʶ��}�K���
0c���U>�r��NNn���RZ^��$_�l^=��nvx���L.rI/YM�	�J)\��[
�[���8&�b90���{Ϟ���W�T?�{�|Nى��ܮJ����#"�5mg!4�����z����h~��y�z�D�Ct��W���|���oz9.�L#C0�A3���[��J��Ȝ�v-�=����r���"N�Q�<(�gLK�(I��mE'�����}�)_C���h#4�t
�D�7d��c���4�b�9�TD1�eR�� ����(R�"zQ�Fc�Zq�Z�ȹ�BlZ|������]#y�R=��מE�C�z�3�)��/��j&
AS�~49(�X������N[��~��&Ԑ?�>� �e~��x|���I��UȺ�u���Rt�6��/]�mPc��Il���B�:�\
������A���U�lQ&��4A�W��B{x���c��囱��(�W��V������B�s�nSv�O�:�|49�&��į$�a���#Cέe�<�ݞ��X���-��
r��oA�r��"/�z h���.�(,2V	�9�dQ0��L��J�`�:k�g�0^E�a:F}u����M#���Uڞ�J�V��<4��yȷ�^��W2<)�u���*
�j�T�����%,94Q��1e�3ߦ�Q�&�y�զ�U,��$�H��*�A-��哲)����9�1`	<JB�|��P g��)[�!y�qb3��׾���f���ǹ�)
/��r��z�+�JRS�wxn�:���X�0�3��c�gp���bgt�M��S<��qI����4��Eq|n�A���,ſ��`ܨ5���!7�E�����u~�)����y��7�6*�mPQ�?��x{h�['�uY
P1��g�++�cF��
�1���D�dGA�1���Lc�E��gp�$�/ZP+y�W��~�4J�v�*T�� �G��Ef��n���ɑҫ])�r��nr+V�
�_U;*E�t�i_T�^����N���Hj/SE
�G���PeA�L��+���eYf}�.3��Qf?����ש3}Ge�>Ӑ��
ͺ����N4m_Tڿ�Jӗ$��:�Z��R��fN����j̀��赫��JPFQ<installation/framework/database/restore/exception/dbname.php����}R]k1|>��!��}�ے^bcJ�)�x6���O�"	IgbJ�{��?RZ���������VLF#�������Q3�
�>'�2����PJzl-��Z�؃��=�G�R��ձ��4&�Hc>ۈ�-��U��ؽS�:��T
h8���|z����4��
���k��xL�3B�i5�X���\�Ē5;��k[Fp��'_�cDKM4���o��j�_���m�&B�x0� �Q�I�M���A%�,����D�߉S4�Q��o]��x&�)�y������<v�8�Kd��զ��=�zw����@
�..�葩R�.��8i�g�i}�t�4C�E����Sy3C�o�!~����'tv���d�K����s��_�Tk��cp��:xՏ�g���u��e��q|��,{�E�JPFQ<installation/framework/database/restore/exception/dbuser.php����}��j1��WO�>���C/궤NlLI0��k���^��FH�mLȻW������
s����7�tb<	�0_�>-q�o%!�H�"{
[卋زG!�c� �*MCʓ��Q0$*$n�V�<_��4��ѥ���v�:�bw�fWFܝ��N'������k�J�d��i�C`�u��ӌ���^�QdC����Y���H<�
��r]�HHU�x,�������~�����m�64�'���ZR��e��4K�hԁ��{jK��{ݵW	!`�8f���"�ʼ(�J�S$���G޳�"s����Uݡ6��U��Vq��S��pq���X����$ǹz�Sc�)d��,��~+>�73�f��a^��v��/x�G%��V����3�79���(eCp���[�c{��]��
��IO6�f�b=b�X�nً/�'JPFR=installation/framework/database/restore/exception/dberror.php���MP]O�0}�8o"����D�[����l���5̶i;1�w��Է�{��=w���,�L&ȶ��S������񠌆Nـ�q(�8�܉Z�C8�$�3�Qɱ�0�6/�11��y���P)�w�سSU�;%b<��n���|���i��y<��5mc<�!cd��(A�w���V����ml.��Z\!���\��I�+M2�g�Xf�qG����-��y�%�6�hM�o��눭S��_]o+��٠�0'A���叚N���ص:��?�}2��
JPFI4installation/framework/database/restore/pdomysql.phpu��eP�N�0<㯘[����=!� �U�Z���9�6�jbc;��q�����������ڲt2a� +��5�x�	^�#��A�^8e�ơ���Zp'ju$��(;d��cyR4�m�Goso#�+��R4`��Ω�x���"��f��l�@�Dm4��\au�X�j㑞=�A����~^�!���صe$�=�Gr�ﵸD��c�S�$�UCr<z�6�2%�@*'7���#[�K��y���}j��S�*��.��JPF7"installation/framework/ftp/ftp.php�X���<kw�6���_��>��Ȋ}�]�Qd9ѭ-�H����:4I�P�J�v�M�����D�J����i{NL��`0O`�����-��=y�-��f�U�-��p&�rB)�B?�B���g����~-��3�V*a�
�X�܋�[)o,�RCxc�f�>��üX@�5�B�ԑ����3���?U������#�u��ZJ���@н�~�J<3c��c��:����}#^IO�+.�h��V
�uT0%&@�g��c9q<9�VF͟���J
Ǝ�a�0j8s��8�s�^ؾZ��RL.B`���ܵ����6�g'&`f߈=�v�p(z�������
�U�n�����P,� �$w�"�:��skw+ŝ��Ű]i�=���n�Ȟ�߅�"�od��C �b66�gϞ�v���xۙT���x6����^�jva�^��n
+���[VU�:گ� `�7�u\}�'�g�
�0�v�5l�"���C�[����V��٥����+����sd)�@��l������E0m1���XD�˳沠�es0���?�n_'��R����C�~{p��x�o��C����9o�`�r�K聲3'��@�r;�6��a�����Ȭ��Z",OM@�$�F^��^�y~6�q�����
b���U(�Ž��!w}�]/eK׵<�GJ 聊��*2���mO���V��lI�U]�����~�>�.;HC�Ͱ��:��Lߥ���;(@��m���ꢨg�z�}�Z�a6�w!h+�;׷�r�����@��E_'�b�CW+�p�9�*B?Z�ɨ��~U/__�z�.�j5qrr"*�t�����z!�n��f�c׭�[����d���[yg>�D���2��8m���H�sT�����q7���A$k����ۮ#=�{�F���D�,\�r�ƭ��@��v�V���z��� �*��-�8^�0b	"R��������@mx�XISX����`nK��J:�T��T}�T
�
���r�PNA��Й�6��u� _˘B�z"�)Gcl��~�JP/טX��ao���?��&�!���G0��GǺ�V�[Q�7��	c����Xj�SLJ+�[�Y�[���L�	���O*yt<�<hD�?�P���H?�^��1*��w�"|��z��je\"����l9B�A#f�����5��nl���O����l����Wz|��yB���)�M�|���F�kL+9�X*9��Dk�h�T����iӆ6v��Ċ�0�x$�������Wŀ�f,�	���.�*�tUA�k��ZnRg���n��ޏ����1Bb�Ǜo=6�e
�&3 Z�^4[EH�)�4�M����C�|@�,-�@�,O��@c��̺�	�I1�@D|O��A\�k��v����!Qז��{�(�+��e(�}O]��rZL��<-HS<��)�B�٘"� Vc_*�
˅��=ϲO�W?�L�E�r�ZHۙ�+D)A0q"(/��V���= ��u�{�񢔃�q�jMXS̅�p9�dr���_�r���#r��������;Mv���T(���Î!�w3H��PZ�|����M)�]��"vHX}@�[5$�g�b���M�ƇL�QЃ=�w�%=��J[+zCܳ�{�����ɏW� �}��O,�5̘��ɏUp��bq���7F�`d2�J�h�J�d���gI��{�~�|�㴔D$j��D��Sv�˨��u88����@ȫ/�Wb�����_4���{W9S�B1�`膨W�_��_/���;�;�Ò��Т��'�bwH�
�P|
Y��i�DV(��t'�lj��JȻ�������q就Y*�BNŸ>i��j�ːy�-�~Ğ$�'s@it��Y2́�=���'3�|LG�Lz_M�`-r'����V�(-CD2
m�|���/NXd�
	�y�#����&��b��}0|�c�a�!�P24)���¤���+An!:�,X�"hS��-p�y"�v��@��p�Hh.*�����$���S��r��2���m)���z���:qu�屈m�u��Yv5���2�Ǯ`FE����A*<�t��Z���h�o�vex~�q�T�Ck�Ļvu�į�e���*
	c����Q��ß���v�1�`��@p#�A�Y�ߑm��%�U�9���XAJ腓j��G��N�;�;ZƎ��Q��)2�H�q/45'ӈ(�k�݊i�B���N�c�Ҟ�I�r�a��{3
ڭ|��
��s�P���qx�P#	�/OW
%4�}�+��R�q�J��:�>3}�W�̒PW���Y��Jc�t@U��ʜ�>�ʖ�{�s?R�$$�X ./,:ai����פ6GF�2���cT��W�����:��	�>�)ː����3�3���Ǿ�D�d���	� ޑ����	
��l���Q]k�8�Vf�$<B	;����&B}I��J�*�R����8�)S�dl-�e������S<�'!�������+d�>�М�����ڀ�:��NP4n*
���k���g����Gp���
���خ�ɖ��W�M"���!
��3��^�*�F�V%ؖw���S�K<��V5t_���5EƞY��ڗ����7Aq�o�<�֏�f@a�\���)k�	pSB�z}���?`
�$
M皎l�2�ci�*�b�7l��9�ŭ)��r\:~Y�2>�	��V�Y�K����$�b=b�?�yw��G�M|wLa��O�vY�����/t�}yK��k�s��1��+Y���A�շd�ͭ<V(l|�5����vɈ=����
ɹ��	]�U���r!�t#��3��B6�
Q�?8<�P�����ߐs����=�6�5�`h��u&1+!>	%)
���V��F�h�u#��p�� ���4�H�1<kI��;Qid|�I�|N5c0��щI��U&8�G�'��پmZӘ#�yv����w*h�����z#6������<K��}�s:
���cte,�'Ҩ�U�D]?Ba�&�1e��G.���^0���z!�c��}��ÕEֻ�kZEs(�8�4�c��*���~��3�~?��O�X09�T�Yñ�7�i�~Dž'���x	`i|)T�� m��[/���.��f�q��{O�"��r�O4mn\#H�9(B)�G�m"z���E�@��˅uVK�EeiK����}�*�A��Rߖ$�7T)�{�/�W����g����JP���i2�E��=�ᮼgL��y3��],f�66�oΰ����!a=�a�uޒ��S��&��'��Jd8�s?���D�0�LC�J�*���R
.~��WbD�5C�fL�5���c*�8�7�yV�ib�F#I�_�+��f�|��r���~�j�����eŚ��غ�yˑu�N�#ju��틁x�t�!#ͺ��MhKN�ҏ�JE����'�$�q��:#����֖u٠_G���%zL
��t�^ʽ��2	]���Lx�J��)(�H�gqi$uD|,i�1���=\[[c�r�0˞E�d*7]qd��vTe�؈�ڡU�H#�Q�isI
Ѵ,���-NM��kq��J����M}�*5y]�w]���Ihc"��s�������̣12�%��J7���;Ʉ�հ2V7��U;�sӊw8��'_k�^��0�B�a"��	�R]>�� �I�����7�M4�8��d��4ъ9�h>o<�l���`�uT�1��i��`5�Z�c]`α�ss����C+��� 
�ڿ�t�D�@,�5�0���y�[#�s5�#�.m<Ȼ帪Z��^��.]��́�X�3�Zn���nn��dg��b���B�D$����cyfN�]kQE�e+��l�>��x�5�Q���SvT\e��ܝ�<�`��@X`~is�_G�T�����l=DZ���J����ݫ��~�^�k���(<]'�|Yr:
�µlY�|����H�~�|�=T	7D���o��O_�=�R2ĒN����=��\SY�gl२�Y������--{f�ZJ�C�_�Gu��
���˫	�a�������S�&����v�:.U�W�u��{mxޓ<���SS�w͕5�zlp��:_��Cݏ��50[:h�n�q�H{r	C�uW,� ���q�������|�R��&�N{���s�@��'<�>��
$C��:{�[w ]W�o%W�����ĸ��w�6;�y�8>��Ƃ�m"�GY�G����h �t?~B(E�l.��Y��
f����IˍA@1Z�wvl	�9f�5�u&ɩFl��!�0�I,hhM�|��R�K�
I�r4-^4����zU��v���EW���v]�Ȏ#�aS4@�t.�G���4mt��[ZfQ	}��H��Z͜I�tJ�̘[���u�d�\��ɦ��i�Z�j߁R���u�)�l�&�9lhk��{�����ɏ�W{c��*�{��p�i��DT����_?���������Oݲ�A+4,T0 �O��X\?!�ڕ�~Ze�?�����C�=?}�l<��%*���ȟ�����\�H,�0Dн�G�4y>N�͋��q��;����4
��g�G�����%|�J�
�
~�&�g�z����a�3���H
�8���leC���{��@��1v�r)�F�on��
�6SU@���n�¾�ۭޫng�>����e�^ˀ���=����z������}�K=���5�65�9\�r��F��	��dyrX�̬sJ�����m�N�НX�K�w@�v4����t��Y2�U�u<�yϐ��*
���r �#P*���:w4��)�ü��E
�(f
��"�u�r����7y0��>Uw�{c���T�߂��q R|�7��)���j�7Lq؝��G7 G�Wƭ1�R�KH��9��ۚ9v"2���x�|���i�ãU
����iЅy�$�e���_P�_Yc��U�v�h�N)�e2�i��|��/���T￴�/��ܐ���j���L!a%B�<Z�+��Q�=��{F�b596�`${��0p)D�I�/�q�|+���?s�DK�V�V7�b.�*?wy}�<�e�|��-�׵۹9y�f�$���~�'
L�l�2���m��#�m�Q}����4e��sq{�x���*o��~2�lY�_'K>���]rR5���R�w���$�c?dEAI��7��Sq@|߅��FL��9�e��`@��~���LީOb�Y��1�9�ɗ�V㽼	g'�7�ʵ���ҷr���JPF;&installation/framework/input/input.phpz-���Y�o��l�s�Q��yl[��z���r��&�<�>��AK��FU�r.-���%Q��x��_ �,g��y3�k����޵���/.�a�$S���OAF�e
�\��DOyDDK��"A��1�^`�D���Hc��'eh1�2\%
�Fͻ�g/�-�
N��^�?:8�����{�fђ'D�/C8C�^$�x�p	�^ƕ�
��E4����\Д
���|�p��TH}���#%x������YJ�^w:��d��k���^���_2	s�PX��x�K�3�0|
!���UB~�/�a[
�G<�aOs;:8<����S."
��B}�.�h���{ȈP��R���Ҥ1l��[Sx��ɘ#J(��-��d��̣��̨03��LC#��p;�C����2�rK���t�҈���+��<�K]P�ZPu��^'%+:��N�D�_�Տ;�?����Nh��Ӯ�g��S�8G�S@�|܉����uz��W��E�3�8I���ԧ��9�I��������?���_�Z�L� �ФM���{al}�����h�$�a\�������1���v�>����,��{�3��?h�@q�1n����w���%A�'	f����eE�;ͻ�%3I�y�/뻙^���-����y�U@7�0}�����9|�2��n2]6H2���H�����������y�F��L����-"��mu&ý�X!�>�4!I#��[-6��S�3�#+��3s�������/M$m�u����d�r���F�0�L�	������K��>�NP�^�ƴ[0�W�H�;�)߂�3��!�rT����b&�[{h�"C�X��7Y`��L���kU���h΄�r��TC<��1�d�ܺa��,� �J���U�9־��ϰ���S����y���S�耹��9_�M�͏;�i1��a7�+w��]��Lg�9`�3��d���
iݤa���T�8���ÇH?�|(�n�[#�%���$9�6`A7=�ا�rz�wA�i$j��@P�$z,V$��fT�D��
��e9�6�cQ��C�ɩ�J� �^��n��e.�Ey�,Î
���t�V�,�=}}�d�ILJ���-1_D|Y�\������1##XF{#��l�+d��X��R�>���c��.Kwpi��|�BkIp?c)y�l�\�|�/�t���,+5;�����
� Uۂ�u4��F�{�[8w����UߜnPQ�Z<q�CTkž�c%8�,:8t�`���ue���z��T+l)ْ8�B����B��z��u���Fb�o�)�EY�.�b�*dg�x���#�#RuŃ@���ZDU4��^�Mz�G��S�λ C���S�ܞ�-
|��X��"�Y�^�|X�9��Ďr�a^�0�<��2�����	^��3�?�)f�Ղt�@5��
�������.Y�`�rֈ��������A��rQ6b;#��doK�o�U ���@05r�L-��B��ƪ"�ar�h{��y\�09��q�Ol������$�\��E�3���}F#{<k�]@���-�Z�p\	c�B08,��
ͱ�3�=Ģ����X���f���Y��Q������&��\qT��w�_�o']7VN?��tsֵ�ǟ�n�;x���]6�WC��\�q@�b���ڭ	����߇+Nb :��+|�&H0N3�H�O�[���t���_M7���UqQ�x4Hyj�ɍ@]��z��}M�Y�
�U`3�V��+�z�2
��H�>����j�f�������NU�����(�h�Z�����v���Q�.aRՀ
��I���q�2���ۥ���f���މN�]��ՅL��Y̢�ӵ���^x�
dh:7V�y|�;2����`�x���)�5�����F�8�d������j�gB�R�AG/R���;����P�-޳��P�RWc�`�rW<f�r��Vpp����N�4zrM�?7j%@�{�12B��bF���q�s���J��Tf	-���a��6�	Bns��6t#�W���?�Bf_�� �q����#�_K���*��܆ʈa���J���jC>CkwH�]�al�r�o��Qɫ��JPF;&installation/framework/timer/timer.php�I���Xmo�6�l����R淶(�5K�t	ҠiZ4)�Q�%��B�)����ݑ�-���C�$��{y��_���;><��!�^_\��n��8n3mX&��f0��,��S`&^�{n!6�e<��N�8�2x]P��<��R�Rs��-�s$���b����/2�c�W�O'�߆O'O����Z2oGp���Nu.��q��*K�,)b�,ɿ��\q�$|ȧxW��=7��z6tI����n�gB�$�G�o��_��C"H£n7F,�ފ%���P�:��Pb�/�?�8wːą�f<%Gwr���ø�I��G�p�*"�ȱ�u�p���C�t&�^1sH�Vl�jb5M*����|�[��g�xd���T�[�;�"�V63y��5(��B�uGl��Og�~b&�\n�7�8iN�K���6�)3l	޸F`�䩍��=h�3���h*�V>�G��2P>�\�NPm���`7c�
5�����r�^�Q�z9�z����t1@-��o߼?�"A?���`<�;�	�㰏����x�Jd�I�7�%Q�s�-���e�8[��h'q&5˂RZy��a�aà1<�L�*썐�c��_+�����!B�&��&��e��@�Kp��
V�x�#`�s�7�+���A��G>m�$_y3~<lU_.x�B��)u�,�ZJ,H>�0�?��X��Q����`�
w���A5�t��Yn�Ӹ�W	a��(�-�Z:,���A	5'���8..Yjq�XA�V�C
4a�͈{�͐Ǒ\;a���H��F�O����5�[]n�j�6�
�?:	��87�+_ |����b�Yd�[f��{�&o��&G��#�;Ċ���	z�l���uj�,��б�/P>���g�
�F�-�"n=a�����P��Y�O��b�`\���h��+8�3�ˌR���G��Rp�߈��H�u��h�#D���rK�+����I�Z��h�R#Q��E�X1A�K�֥2;4>EI��/��'
�#-�}8��.T�����H�nyQٕx�ĭR�fM��1�L�b�d��o>�-,��kZ|y}	.М6�NG� 8)-Fb,2�1���h��dǔ��$�+���r*��1�z!|����J�L��r��qB�w��O�5<�L\z�GP
X��0
)v�M(�+�e�BISL`M8�V\J�dJ�!�NK�F�6XY��&�����47��܎�TZ����2�
���ߊS�εR�A��0�QK���F�i�N��c�sS��n��SF�6�����#a#B�qP�d�*խ�ER��w�0�?0J��5_��-�Q��&�e=k�Tֈ��q�l�����B����p�R��j#n��kRA������F4�窟y���(�s�A?�vhD�jp�c�j>�����"r�x�UX8lt���7��z��w�ީ���Q�0PTm�_��[�Y!u4���pM��@P�=�B�tG��X���mv �t��ai���N�8v}vXe��t7����q����Jg[,Ą9�ٯMP����I�5�l��P�n��¢�:
c�����(zz��?'��;Eq��w~�­j7�ՀT�6�|O,v���c�9�mK�,Z��e������w�S:�n%�!�^��b�_�0<���X�[\a
�b&�8w|&4�ʦ�mj	��Q���U�����l���+�#���#�DU����rl�/
p�y���ͿU�l���f�㯤_��JPFE0installation/framework/dispatcher/dispatcher.phpd�����R�H����Z*�SƤ�}YX�(��x��yɦ\m�m�"�5�-�5ſ�鋤�Ŭ���
��>��i���l���޼����>M�p�5�A��(�S��`��%0'�}��=P	��D�̷�S:'��A����'yh62�%+
�+F�Y̳�`�����S޽}���wo߽�+�yB$�4�h+y��K8*x\�������R�t�>є
��M>��t�TH��!�J	* ���_�%K�"f�O���(h�����ۗ�FI�/�)ٰ�F�
Ũ�ڏQ:	��Q����i��h-A��\�d�����'hBd��W4ֆ<�
�Z,����DHH�S@�e��%��HPc�i�;$V�M�,W`��k_���T��+4h
|	
?�I� MF��P6�VOyJ�I��ْ!m�ɺ��(�,ؠ�����g?Q��1�w�6���$��il��z$��s0D>X��'��y��F|{��*
�$ܧ�Q��\U4�%٠��1�g�!�,1�d�w���v h;i�ic�6��	��hDӂ(RG���?t����BAU.P��n��W�	�<�
��+��t�,��B�'�ЩW~k��Փ�"�=̤�c鹫���5�k<s�G���aK_��=����J�~�� #��[�Lδa%�0u�ky�>>F3�F���Rq��O�Y�ޫ�b��$%M���t�5M�l]y�I�z=C��E��	���b"��D�ʮf`{��'��+�b��(Lor:����fH��ߔ���c߀����~������p���)�K�[�vg��{O�����)�40m'(
��g�~qP_���д]M�[�^��X:#0��M$�L�@KZ4��$h�%�)Xe��,�.,k�
+���?��w�aK�I]�c�j���O�:�7-b�pxf��"Q�c���"ń�椫…�l�8�W�g/���K�.p#���
�i�j��U����ӬC}liۖ� hCs1��u!���l�dj��T��lǴ��3�����	��D�qT�+��f�����g�9Nq7D�>�D�g���ityM'�W'�cI�W
U�h��(8
Fm� 8�p�%c�AUG�jR�@~��:��+c���Km�vճ�C�u��zc1�T����Y�+���d�y�K��:>�}g��3'A%�W�	_aMΓM�_s&���\z�3Ϊ0��װ�N�ƅM�O`/ܻ��d�;�}�AT˕*�� d�o�R�[c�꘹���O	G�<�Ż=T�t�PչZ��k�yf6+�,��Z��!j���V[U�����M���]�L��3�9AW�	*��]ұ�:�O�^K5���D��Ͽ��d��x6�,��&�g���
�й��=y��$9nSVp:��7��-�k"��J�m�\K���B�]���|	��޾���G2&T�ֈ��چ�^��+�{�}�_?P!�B�Z�M=ƺ{Ae���4�)E�)�_7��`]�+�qc�'��u����ͽ��.�,�Oۡ|��p͇�9�a?
:�-߷; ��e\�b�peW�V��L��Ծ3��o�Wk�L&,S�w���&L�Z��	��T��~���SL��;�v��C��b<���G��^�0�C0r���?�_h]e��G&���߾�����~��`@S��6Z�-Džf҅����������@���8�$
��C�57\f��
�0П8=�E�1ٸ0'�/2�3ԭ���T��GƔ�K���)}R�dz0������rrn�����v�����f?\�~�\\���(àYtu=�O4�U�`��۵�U�_����ʷW��{K+������.Y3\��"�_4�S�oS<p��K�_H�R;Y,K�6U�T]���w/^�N�çv̰߾ᱮ9��=)��h��3N���I4�q��$8+���k�^I�������e�5�2�)%���X�W&�B�*�����+����"�p��W~Q*_JC'Q���{$�h�M���W����,��]+��kXC�b����
	pk��5E2�B���o��#��}sEihC���ʘ�U/n�����!o���;JPF:%installation/framework/utils/hash.php�
���U�O�0���7��-+�0�~0eT����r�kc�ڑ�D�����R&��/�Ǿ{w�s�� MҰ���:t�'g=؀��I�`�yc��F���L=�����n���9C�E�1�Q�[đ��2B��ΕQ�jp�ÔN�(`"�؋L�[9I<|{X5��v��yc���}%F	�pL
�Τ&S�A��q��K��c���
��F+��Ey8C�ׇ%E,%��0Ʊ�7���y�wԭ79 ��VB
N�is�=̍��dē�q�e4���nA�괻��LG���,5( ��bD�xV�`�6�-~�R!�]"��ɸ�.~C'�$!Y!}銣H9u\s����w.��P.c��	H�<����"���J�V�.�\w���
2��T�l��m���2O�
S�="�P�E3D�0��*rW�56��2Ӕ�o$��t(c�
�j�	���4��yC�:5����E/���~�� M�ɽŒ�Ŏ?�B����:��b@"B�/�;���g�\+��=(]��q�0H�H�{zT��ל��zj#���a�B9l��
ʔ�Kh�c*�MP�Δ�
9����� 
��Iv���Q����gmmu�P��q�'I=֊�Q'��<�4��=ʺ�-���e~��e���e�t�ʠ͟�
����+*SWY�R�{T�D��"-�k����g�^{�U��R�zN����?ۛ���7��n+�����JPFB-installation/framework/utils/phptokenizer.php�	�"���Z�S�6�i���&����q��2���<$#�e��Z��d���#i���6�������;_2o��i�����<����#x	�SZ�k�*fD*A�Jd&�����0O��+��h	�����w�q��*MR�Al�e���8n�ܾ��l����a�WG�������ޫ��L��4a�؁_Q��N�t��vs�fli%"�R��p�%W,�����/>p�I����*%���û[�1.�Ҩ�p�h����
��F�؀�������4����D�3���4�,&����O���/�W��h8���h��l���� g�	�c�왁�Hq��%�/��ҮL���i�`+�f?Q�C�7N%ҝ��b������A�������"8sO�2����-�����<I"��)L϶�
������džW�,�n�(�Q�����+�e]�����:���j���M�� D�RX2�����:MU�jD��Zn��Yf�U,bV�4`��s�37�����:�2FQ7U�fD��>҉��2�L	6J8Ю&��������t3&�����)�1��]�aH�G�NH��;\ȔbKzu"�3�{��&�%��+C_v��'1����13,?��Ԣ0q*�mֲ��u������*V�$�����X(��c�

#�.�҈?�󌘆�E�1'$A�35#��A?��U6�1�X	�AA�����.�r �7@ak�p1�D���D(m�ej�K���S:B�w��N�D���2��4��}/�bB�s�^����bC�3ر���)����9�$Y�e!R���p�ۄ��$Vt��֮|&b���ۈ?k��~��:�����,�C0�+Wdٶ����}��߇�~�0j&&)a�rAq2���
�~}�'�o+�H��M��k�!�J��ؐ�he�)X���Y�bN��9�YO4�S�"=���H�wɎ�|c�l��ی�/�6U�X,���Ij$W�۞=���_
2� �'A�� �{�\ɐ���Xb�%QZZ]	�7�5�%4�h�
E�k<D��ڷo�ވ�W"�}�J	��8^J��ŤD_=%����]d���Vm�z�|�(���h����!���,K���;�)��w����3�3��Ebf8�s4]ȩ�	r�l�/PJ�䨺!`�H���0K%i������5,�2��I�3�|�'b^��3���0&+K��b�"�0a�Fw�zd��wz��+�����[�$a5cW�O�8�p0�&�Ls@�ƉzrՖ�@�܉COі噜fu�����˓���WG���//�ή#Ra;�L���u���|	?�k���<UQ� 7�S����j�Aq�j
V�`ڛ�+�c��u��&��ڎ�~gY9I?vspS�L�Р�M�(�o|�}㈎�+�A̋�q����|��fU��W�"_w)	��e1R���z?�E�|����.��(�n�b�&�kpN�Vݵ�����l�3�a��|��A0ߓ�mH��f��4�yo�L;z�	k�W7��Xh��񦁇nf����۲��!wɄ���.?�M��I��m�Z�d\9��l�U��n{�\�*�/8P���{,���)������s�ٶ2}Vlݲ����?�~�#-n�V�Q%��|�žH�U�#̶s����Q�8�U�U�М���1Fv��0��G��g�}P�q�ӂ���4��[ǹ��Νԭ>�f��fm��fD=lICՇ���]��σ��b��Z3�;��c�!uH�k=jF{t��s��F|6�;O��������++��2$����[�r�mV̨d���2^��a�����B��ݭ^K��l��l[���֧T�߮`�wZa��YB��}���Ҩ�v�7m6����	]�E�3�/�@[���h廉�"!1n'�ta�L�s[АWo�"X�20n.���PD:�q�	���
���Vˉm�p%,z�h��
޸R���^�(�o�'�rn�7�n�4r*�`�*x)���"n'��)�mf��ʥm���
�K�	UXͺ+a7�u�q�#���Y�y���o���J��4���[�Go��Ns�-����V�B��ig���f�(��ZI��p�r�M�&�.�+�B#n��]O��@}k�9Ĝ,W�;��H=����h�]޵���߻��(���k�yu‽�:�Ĺ+��7�݂�:����CcV��ϿR{�:G����o�je����L9�:��
fҼ<������tsj�r���z[�
�RWl��NG�����ra�0��R�t�
�o�ҹ��
�k�R^_,��%�'�5QV�
x�]F�}�-�����q�5�G[\Y1$*���xc�k�F���8��ɉ\�~j���Hvn�?	 E���/7���My�.�rY�J���d�a���ƞƒh�"����b�)��G�h+������쏳���ǭǭ�JPF:%installation/framework/utils/utf8.phpt�	���T]o�6}��E �RK����H�ei�+R�����D�ZH*���;��X�"P��{/���Y���`�	�p~su}	m��RPLS�Ti!c�D�H�k�		IL�bIR�HIcM��,��$�_��lZ[n�ah~���)��6"�d�T����/
�^;
�#�a$<V�o����(�P����bqFh�����hFe�aT$�w��Je�::l�c��f=�4�1���MkJ�g�	͈�Rۛ��R�?+2b�AG����G6�B�u�RH��U?>�����@�H �B<���&k��D�cPp>֌�1��5yٝ�x[dU�zŮ��fCln���EK�bœ?.?�^��9�V��^��GN[��Ć���[�t=5+�zB�0���Z$H�!�.SX6�F���H?�8lwM׷����^���$��X��/J*�I�}���q��J���l��L�����5�>+�f���0��(
��K���b���+8�b���wF�/g�s��&��Y�sc��L�E��M�L�*���:
.���G�~��ɬ��
��(�O�xS��i�p���Sy�h6e�C�
x�:��=��@�����a��{����4I�ղ���Abԧ��t�'Lܻ��
���p��0X�|v�3.62�!�����)���/�6��H*�;!�n���{y����T_q��HpZv�B3��5ɖ�%���#%�k��d�h^�|�dw�4�gɞ��k���}�t��l����L��ކz+	n�ֆ�CLuk**A:C99�c���k�+����1 Xh���Ji:ă>��ZU`%ˍB��Bx��Rě���Uל��8��S�vpՏ��r�g�۟��JPFF1installation/framework/utils/servertechnology.phpr	���T�O�0���7	)-*m(ڤ�U%@���4�Ľ$��[4���S�Nh���w��=ߛi��hsӆM���"C�� (�F��p)@3��TG�, R,�w��)��!���E�#��"�|��\R�:�^A�Q��rl��,*����Ͽ�]�����@�Y&�H���P�e!�\j-r��y��s�B�G�%�@�p^�tg��*]��I�I���#۞c��{΍w��ӯ�wm�
ޥ�Q�A�	ҖV�w۪i�CIe1TFV*�€n�A�E!��af"Ɛ����֗��{
M��K�N9���G�O�EU�u�ȶ�V�6�I)X�%��;�MEB��EԬшJaV6Fq���F�6k���M��>��ON��	߿���f���@�@W�)�Z�_j~�SB�'��/��zK��fcuBǻ���@=rF�S �Q4�����2��2����a2�;��}���3)�Sb����^Gp��}r.��ѡ ���L�\�J@OT&���9��C{�zu�_�N���I���^��[�N��9��s�z�[m����V�+[�����>>}�0>h��cCd�7�����d�"k���JPF:%installation/framework/utils/path.phpAN���V�o�6~���+:�v�X^�=�]ЪI�e͒ N�u0h���H�@Rn������$K�u[��u?���?�)�r���3:��L�S^���+�2�\bU�im,�Dr_�$l���t�X)�Li���^ʕ�w��Nۓ��
|���%���$��F�p��rg�&�t�'�����ã��K�RIfr��N�Ι�T�q�>.}l�*�ڱ��t.��"��j�t�|�J�8��SBJ9�P���T����x��ߟ���GH�O^[��2�h�rI��Qb�J�7���� 1���3��q�VL�F��{:dkG��躔0U6����M�B'��3�^]�Q)�'�~�ˌ
^xM�U[To+铱��I.��w�ޣd��UIƿ���`i�V14�q��rV�&V�[�x8�Q������
����T�$����C�T�	�F�G�	���(`zA���@MYQo��	B���	699={B<uxu�L@�9�"x��)�&=wV���N���@���h8(k4��	����8�8
������������&���8ϠN�નu�j��Z�X��5��{��&��yy{}}��_�'s'[�(�[Y�?5�M��dhX&7q�FKxy�� ~$�~@�����e.9=�=��|�|@�R�����)����I&�8���)���N��ꇖp;�eA��u��t��aW�m�=iځ��Ê���˚���~�T�%�Q�Ƶ������1�h2�������v<
��g�|"-?���D�TǴ\�\Ƌ�rI3�z�.��ʼ6�͑6�gJ�0�R�h�ս����V�^	"���6"�������'u��,�E�~���Tؿ���P�����&w��9U�T��:��:�3���Čuͣ�ml�Z,$D�;��k��'x�sᑧ/����sh�p��&�T��'��'��za7҇aᮌ��L$�khUSg�(�m�w��q_�,�&������J��6
P�&�)�e�
g\D�f�y��M�/�&�z� M)�kc�iM��Α�ﭩ6�08���q3���(0�E�`�3��^�(��z��_E����uPl�
 ��KK�x�Y{<	pl�J;���h$�fX�|O��r
Ǘ���!;:m��7��т2E:a�W|���:6�>�v{���:�+\\[u���H���Ѣ̙�������[�H&�A���NS��3A���F�>��W'1�E�H�o߭�|�Y[Kq����%�`��pJ�)2���w<lj�ΥV�������>��͇&�ud][�,�s�Ya�}�JPFD/installation/framework/utils/parser/include.php	���U[o�6~��YaTJ��n2�h�lq�438F.ݰn0(���"�I�1���R�%Yۡ؃e����;��~ѥ��ww;�������D��!�N愒`��A�d����᥸C� s�C���-b��M�����JU�lx3ǚn�0θ�K#f����[�w��W{���^��Yx��[rhi�Vu�,�W6�]tU���^���P�aL�.༽�Cc}\=��*
��p��"㝨��U`��&mC�.���R�Lho�se���E��jss��B;+��G^-s�3 	�t�)D��qe�BVKX(sk��'�N�e 6���xVUj�=�9s�H.�`��Gc��A� pH��zO*�1�|ᱥ^�/�A�qlx�De':jc�{�2|7̬3���?������u�<��Y8W
G��L--1d�K�h?�c�R*�k>�����6�!���]�9����ug�Ʊ�%��[�WrMe��ԅ���V�4%;��B����U�\��oL����˫�Ÿ��t�bz�aLrQ�yKʛP����K�	K���0��$;�;��7���t}��r3��i�ufIO���pړ��P��|��< W��Q�A��ē��R��N
�qL>��8��q�Ճ�A>��?�����3�͘����*Ǥ12͖mr����)��_��I�o��D�M�]�6�3t�v)�3!��=1�"%�]S魷�8��w$�3t��YCk��6p��<%�郎zОo��ެ5}��g�g��:����|N�y�����6,~q΅�դ��y���������~��\��{��ku~��(L`[��A"�%���d
���\���c�{$�}��6��J�dn��tb����o�$�P�
��Z�<�=/���i<Aa�	�'���)�0e%�mzi4$�@��+ʬW��aҲ�J�Rn,MibR0*��@?�1p,��Vc3K&�>�pN��X���*ɓ��D���m��T��5�\{N�t��YO�w�i���a��-���e�Ƽ�_����	��9�2��y�JPFB-installation/framework/utils/parser/token.php�����V�n�6�m?�iaTR��n�m(�tq���\иݏ40h���Ȥ@Rv�6��ao�'��!%ˮ�V�������ߊ�h�x��
ϡ��va�q0�r��X��J�I�(,L��1K���N31�R͙�/��������j�Z�
m83G�;��;�i-U�R����q���^��jw���"�T����	:�4�Pe���l�t�"��8�o/>�[.�f9\�c܀A؜sm\\�;�!��F��O��8�ߝ���G�L?hWD]�qCuϥ�����g��?9��i�u7�:̄���Q6E:A��
pd�L9����|�!��"7W���\N�w�cc5Km�s��<k�E�A��]�aY�B�
j�5�r6������v�(�͙Fބ����^��*��<u�ݩ��O���*<��R��4�\�E�4���B?[��RK��DB[�mr���8�:Q������	�;���Qlƃ�*��9�������J"y��j�ѱ�:�9��j6s˱Ì���$�6
H�H�"g)��~ҟ��xJ�k�������h�C����چwB:8B�,7���9K3�ڰ�:9�!kD[��P�j1��	���'A�C{8-�H����@�O���!�x�6!�W�>i�Z�s!)�y$Ӎh|�Ԗ�e��7�vR��q^�*�$~N*;�#Sߗ�o�<�ܬ�v_�� :�\y}�M�=������+7����Ƒ����:â�1������g�H�/�R#|�m�4<Ʌ�q�/1y�,/y�H��0r��;��G�xT�R	i
��*+�K��>��j��0>7M���3I���O����b�Au"�����#��A����0��sR7
�3�\��ASH�z���UV���lY� |�����	�����}M��N[��i�]�[�ד�%���>��Ft�弭olOJ�t������ ��[5z�*�L�9�<�4�`�j5�1�f�ˋ�H���Si�0�8^CSќ\�1���j��ρJq5Q,��j��7
t}��~����pt|y~~z1�%�\��7������u�9~Cˍcz
Zs���|��V�ZW��ں*����p3�^k�ξ0#�K6f��k�7�[*��K�s���=xxgSJ�����uCH`��i^-8��U�J[���n.�K/�!�B`�el�k�x�ٵ
Q��\\dx������q��M�����Kw���?���b}��VJ}�[�>�~:`p��]E]����x�1���Hz�24�t��oU�@%��JPFE0installation/framework/utils/parser/abstract.phph?���T[O�J~�ŠF��K�SՆ
�Q!�N[�B�f=�W8���HO��gvm���؞�7�\�(�2!`�������FX��*ͬPע��)
+�o��湸C\#���j�[����B���*�piNJҲ5��Z��qUn�X�>�b�?�L��&Go`!x�
f����֨RU�20ns\���*Gi\���w�@����V���Fy�ڸ���TP���a�b&$�q�̾���΢�3H�C�2V3n���VfɴA=kUbS�Ai��sI2�1�7�AuL�Z(-��Sksa��#�T��AV��t%
dB;r���i�RH[�!9������	�aPje����vy����L�o����Cs�� ���a���ĺjf����h+-�B5��RY%���F[��0 J�>�J	�{�p�lG��6jt��;��g*"u���%����T@���i�41��vN}�Ir6�'I����������/�_/d�9�a��dB�+R)?�R�!!gj�����
��9S6�ï_p�}�w-kD����A%�Hq0��5ry��u�
Y�++xtH�fp�6H�uqNI(IG#�W�_�[�󊰻�;{g4�RYPAe�J�HS�N��GȄiͶ�.�!�z�;�糧
�΋	I|n=��(s<gn"�h_p*�+?�SZ#\'~h���5�����y
�k�4������zrC�O;��i7ǟW�G�~DOW$�T�/s�^Kz�V�����w�)z� �a���t/�?h.��zʯ-�W͆t�����ݯUY*M��_U�mV��ǰ��/��^����{ʉ}��"5$~|r�N�̑�)�����.W}�ڈ�4��+�#?�JPFF1installation/framework/utils/parser/interface.php�d���R�n1}�~�y�D�IH�*�h�EDQ���:��V7���V�g�$
PU�O��̜���b2a�^,�q�o
�M$�肊�Y��GT.�T���PA7fOHEڢ�1"*>+�<��	G����j��6�1�|L�D|z�
��l:���Mg7XݸV1���Y���Zǘ�8Vq�g�F��4�~Ă,�bӕ���qO����+��Vi���r��&��iy�SX���g1Hy
�iAQ���
�ら�+�]ƒ�v�!t�	ǩ17��]��6V'շ��i�&�TW��j��#���]qֲ�?��;�]H�"=�1A��K�ҹ���
?�&�M�S��v�2uw\�ʴt������lMP=\�O�^��Y��P;�1�F\�Q8�yɮ�d?�=Gډ�� ��A.�{��qZV��j'3�x�)���
�2�,��P2�!^��KF�~JPFC.installation/framework/utils/parser/legacy.phpU����WkS7�l����ct:�!41��4��%�| �ޕm���F�B<M�{ϕ��5���,����b^���=k�3���=�-z?d����J�V��L�eai�4M�dQ�d.o��D�؊�&+/���t$�:�T��v�m<D�I��U����-�������h�bkw��G�2��,6�nHGheT��Lڮ|�����d"r�O�?Щȅ�3�('���py+����2$����n�b*s�F������q�����Pgb'+��LPk#�0�v�P�\Y�SzAw��Q&��6�Ja���4�*�V�qn	9��X8�ɜ�q�q�+����A/�;Ñ1����+3s�܇��W+�t�j<1Vljm��nq�-X�Z*-��u�rT!:SwBS^.'���� Qm�U����X��2��c3��*��"���~hg�?(c�𽘖y�K�˲(��F�o�jK[Ꜭ.Q��G�\�'�A��N��
s/E�х���z�OY���Q+kp:�M�9�
"b�!�D��&���}��2�WN�%�E�z��?P��Yzrp@�>=}J�EP���x/���U��������_�WQ��������?��3��~���7����6o�������ަ�E�R�w��_7�����Z�;_J캑���Vbe����b
e�ѯ'F��Ja�7�w,s��O�^$}��̸�f�ب�+L����c�\�Q�7���nH�e����)���so��ڭ��ɋ���rsX(��<Fj�&"��V0����M�*D0��E���Ϛs�ꌢ�0s@�L�}��"�^�)Ҝ�*�.���n#��#FQ�{�N�8סR�@N�7-k�W=�T��|���U!F���y�����2��(�C3p���n�T�J�z����M��T)=��`܏�%��|8���>ǐ�k����,��^EP�&��P�r�ɲ�q�������r�U:|�ɏ��57���]�e��]�Id�2���ֽ&�Ve�z���̗
�$�K	"0�$��֯�
%^.���A�=Neb��-��H�W�\?0󬞖	���|%�I��9���T��-�V"9��'�ό�yG���J��0��[r�Y߇���[%t���&&q޳����'��#G�H�Ib?Z�b���
�0]
L���^bS��0���ܛ�z6�p�,6�����A��<��Bx����o�����aY]��z��F����s�̽Nm���t*4w���
��#?Y����"Vw�<�A���a�"F���;DqϙA%�ֈ��ɫ'P64_���X�0	<�ժ�^\#����sX�7���YռZ�c��~�jo���\@
�+j	-���x��Y:�&����#"'��8GmV����޽�Z�hl}��֔QwËVO�
c�����7m��O@���͢;�-���Ĭ��S�	ָ~�ܻz&���>�uOx��U�(_�(5l������jUع����Ь�5����շ�K0�6��.먭�Ѣ�p]u�z$�	?��58�>w���O�&�*����c�\����O
�����h�I�i*����JPF8#installation/framework/utils/ip.php��6���[{s�6�[��L��z�ò�&r]G��4�=�s�L���HH�"X���k��ow��C���]�2	�.���]��4X�����lxu9>gmv��L�g!����>�v����M-�!����Kf�܊�æk6|�|j�z��$O�'��y�[k��s��3[�Н/"6J?5�V��{���ʵ³$����@����=!Y7��1r����ܗH�����>-���Sx�>ꗏ<����=K�`!L�����>w�������F8.?�'��0�q@;�-��L|����q�Y��"��l�#���`��ѯ���lX�d�O���qP��^C5 �V0�v�܏أ!�����,���[��������f�݀�0?�<XK��nztؘY�'V$$('tXK�E<_���"\Y����y.���P��JO����F���8�N��(�yN<�Ƚ�`�p�=��-u�%y�I�7��8����cT�+��5��s�k�^��Dt�z�+�C�4~1���G��>�-���`` i���F�sf���<������,KXT����m�}\��Y�p#%�t�1�&I"�JS��] �\\_0��HWT���^�8���>[- j�b`�H��0]
��2�m��dqQە6S^_1x�Y�՚���+���;c�-/�*v��ط&Uؾ�&j�Z��TM��Rt5��^�b���/D[C�	��%{��I�p|�Ԓ�3�t�c����nЂ��b��W�-T�"�/�h�Ĺ��~`�NX�ס�
z��1�O`w�l�E� ���~$�I�D��^�A'�}:��*aH5��ɉ�g��'����X�����~O�F��~�*<�W�~��퀟��)+2�ʒ�٣p�g]RK�=/���$�Xb��<�n��`�
i�!"1M��N�-��C<00��?m
�t1��a�jд �Ç{�1hd��`&aA�R�����~�(��QT[������"lB��o�Z&�j������R�Q���k�	��F	�4�0�֟
�Ǭ��m�gM�B�_Zm�q:*"CtS�VʕYsX����B$�\m3��;��?�(e�t�
m�n�]	B�osNYc�F4a	
�x��S|!b%�'&Vv��Y��0�/��IC{hl��?h%y���L��+j'�L_�'����FcU�z��'ބ��V4�È�di�D���O-�wZ����/E2_��&n��,4��@�3��3m�5H�c����9�~%�,�<K���]�"eʬ�г/ST�`��$Ȉ��NmJ}{rʹ�K��!���w%Yʷ��b��f>;1�k����&I���@�[P���f����'�ܟ=5��r.�K?	vå��XAP��a�}����~�~���#����(
�u�v.�{*Xӂ�G�eU[�9��+	H+X���+ɵ��Ϭ��r���L(	o�����uC�~�G�d�0���JJ:D)F�!3�6��LGU2n�Ia59�U'a�����ie�CO���N��k��Qnm�B"��PcӅ�.�Ӻ�-��O�P�ʡ�	3���iL�a0��c�B�Ӊ��]z��	���(�%i��sţ�%����b6|�N�I�|Klt�E���pm��d�HL�. ]R�q�a��G䂩[L�X*�P�?��&4L�km�DyY)j���!�y�F2p
�h���e��4�z٫�Ifř�:~#b�L�ݴ��r���O�Q���;��t�E:���s\�n�<UhƂ>~�j_���l@���M�j���0�����sT��/FdZ�l?��O9Aĕ0�!�P��	���B�G�{�Ԭʖt�%����B�WJ�*P"�P�:u\W�r�����8e�SH�oـ��+G�$��f�����D@��vr3<�܎/�74Dݗ�t�2>udB��H��d( )Y'�0mmO���c=ՎS�UO�f�8g�%����8F&��]��G��q�.-�^2F
�3�-n]�� ��n��'yL��(K��ǚ!��w����2����<F��.�B'���E)f_�#Wm�����̾����r����Ľ�ٳ�ߢv��(,�D�s'�$
�!o��i!oCM��"[�J�=;��v5��<�vx���ަĹ���/���:wX`��Ih��@�%9hg{�1.�TM�q�>	���4FLA;)wŠ���f��glg@L����@J�I�/3Y�RϻT��bv,'��ǵ�3�/��f�tV9WBbuj�m�Φ��eh{�L]�)Y�v��%�]�֬]���]���]{Q�Ι��^L�3�R؈����c/���{l���#3�]&Q�@99�"㹍��Xb�V��������
�Gz�
��
���M^��":�Ks��)�GFƁ���68�:݅3$��srw~���[�X��ȍ��W�L7�vb��x��.�/&�l�(�g�'�6A	�l䷐�üH�~~�(���[�WqT8�W7�"�@�cvu��?����}�qQq���p��LI���|�pS��ʑ\��Ӱaᄿ�2˟�V���:�0���/�~I�V��v�0���k�l�8n��=����4	S4Iҩ��Ј�K�(��]�P{���h9ljy�o�;Wg�r@�Q�A��Z�:]P��b��mF�r��ߎ@������A��D�v��E�sن��q�͟l�Vې��`n�YDK/����l�$�4�<������tW�uە�ӫ68�r�6*����ې=@�^G�‹ɮQ݀�Y*�Y*���|�pH���ч"[��5c��w�0ܼ�*{�+.����sਏeը:�8��J�c�{�r�����<��MI�h[I!EŠ���Q����$�h����#��V7e�ا�"b:��.�NSWb�3�-\<⫭.tø,�?>K���Ej���2ɲf���EU߮wങҥU'��8`�'��M��Mh���$[c��5�Wơ\s����h5�ز�ֈ�j�>���v �Ե$�[Yk��ؿy(Z��0FdZę�;����U�2���$/��`�]�����5�A鱱����E�";p�y`L029�Fd�"
�D�>�}�"��5"I����Ѣ���\u��Q���a��4Ԏ��@�~D���� �#M��t�5e}#�ePG�������	nu�p�	�]p��M$��,�ej+?��=�gi�1�_gcMޙw���o���P��r���&�O.�oޞ���b��A$QqZkU�SWfz-C�EXD8�RI�΅g���]LF�WW���%��NҖ&o7,�]���Y�O11�1!�u�XB�c�[��i��v<}�_�︤��šLw�5.�y�։B˗�������R��l�tVa
����ԕ$ݜ���y7y*��H�V�+�!,�\����b%mիVU�<)����]�}�ʓ.5���直��$]�)����!4����#�ier�s���n�Z��Q�/�=�1.����#��.��dI/����^��|�S�c�hS�-p��D%�.Ryx�L_�9�)�ϩ�4~��K���J��F��8S�oޭU�#YFxrц�K��8B�@�QUpV@�V���j_Z�t�
{� ��v������k�H}e�Q/�+�Ko���D�o��o�����c:��J����O���l��Kv���s��œz�H@wr���#M�Qv�,����nO�<��co[��/���iB�h�]��,�I�Hw���SO���:�ϣ��/_�-���cT�φ�^����z����A�?��P�_���ލ�7�тl21�0t��/S?�d��$tWK�k@�
��T�I$�jv{(�x?1��܈&|8)ݔ0�(*��*�M��ҙAo/b�0vR>-�ϵH�I�qT@N���JPF>)installation/framework/utils/password.php�"����{�g�W-�B$@�q�+&6�6�ܘ�m��]�f������93��_�T`�̙�~�ӟ�i����ނm���8�r�Bq��Ta̔�^,"�0�y�I,���K�b�����%�.�"�+oC?�;�5�#�e��i��E,&S�ٷ���u��wz��}8�4�_�p�-d��J�w�������\�!x�|8M\܀c�y�c����d�Gb<��ʄ���"���P��xs��p���:�4�|1�~Ĥ����LNE0���Q;�%j����3���"�f���稈v�ճS��'��|>o���I��vO:BvfB������<�"�^w�G�5�0�����ڪ�14�X|�pNo߾sv0<x�����i6	�f 
/��~==wZ���[��"hA��#��z���B�B3q&RS/Ɉ{F�̟�1jbF��I����@�X�׳��Ed*$��N�@��@]#�_�Dv�>��*F(��3���X�d����~�3���H�3���H����L�U��/c�#	���`ld�f��*�ۄ������#�M���t��&�[�ڌؾYh��k5c)�!�$��
Nj�rR�:��xH44���]�%R����֌�hь��������˳�����!R�f%$�O�IB�|r�֑S�@�	����Ȭ���4��r��B[V�Z8�iY���I�B&\�E�-b\��_'�:��W�<�`��C��$�1o
)jC��Њ*��vj����Ԕ)�OH���3�o��(B�9%'O�0�œ�(&*�P0�1o�u/D
�aאf�*��(Rk�
�|̤����X��<������n���%���
k9
��/���P�����~�ڡ��k��BQ�����u�(-�d���P2S�J.f��"��ࣽU�c�W"bT�(�0J��3����,"�,Һ�]xƴ�3a�{����ި�q^�˜:^���SA�D%*#�d��R�p�и4�ђ�X��T��e΃�T�EbԠ�k��Z
�v4�����Gu߄�4\T-[+Xvꙙ�4��\;O�+n���EG	�G!�D��f�`�f�Bf�	UzR.��b
�?Q�&�;��4�����p�BKA��7��DF�M�Jie^QOTP��e��X��dM'a�c�
����B>r�ƀ�`h�BJ3��?w�O���:ӡ5HMj�Κ	lSw8��+��2��]�!H��d�q5{�6�����Mݨv
=Eˠ�>D1�1�xӆ������oݝ����{��P��Ҍ�.���l.���n2���8{ŕ���E&-UB3�bC�
ŕӄ~�B�jp���˳�Q�VO7Ja��)c�nxq689x�YH�O!1V��Y�6�[ڝ2,Ҽ�u���˅�a$y2
��Bq�����|�s<<�ze9b�Ngį:�!�H�X�US[� ;)qu�o1}K�=4�
�sV�i��*��F24d�>n�a�'Y�&jl{�*c6��N��o��Ԁ��fT�P���U�]4ꂊ\��
j�v�^�I��\��k�u�Q���_�7�3E��趠��a3�N)��|�ey���b��o�mYG�6e�2Z�i�L3
]������\1,
�)N�iw)@��HÑ��^��xg�b���WG���ɛ���=�x������\��d*���gA�K�\�?->ww{�<|���dq�nZ����1��[��`q��WR�����ĬQ>�����W���]�Y�o0��EԆ�tW&S�	���D�5y��C��L}]�	���D���K`wt�(��q٤���k��.�z��4�9DRE`���
�b;Pi��pFX�������#��s&�	�XS3�0�񏣻��`�U^<�B�6�l��oKSڮ �}�S	i7?մ_�[kZ���*��9�I��32�l��bV�F^4�J%�Z�LV���1�
cIF�u{K?��61jr�%�s���H(�f�:��6�r�M]>:�1utEp�=>���L����Ae.��F�i��&�����D4u8��)��w�ιY����c:�о��層�Q���T��Ѹe�l�p>�v�s;Ud��4n
�L:�l�P0�#��r�YN7��Z�ƺ�*��tp[��f�t�c1^�, T������T[7�r˓\
�J��,.�n����fO�6���U�p<ێ�9�gI��p����@�F���N���֏3'#���u�/�-S��k����n͐~Z���x�`��j��%/�g%W>*(�S�����,X�:6a"@"��Fc������w�_��G�E�C̛�7��Knt��W\YZ
�7��Q����2K7��c���',_�?��
J��_m�h6D����o���h[*��X���r_���҇�#�4���ߚ	Zh�(�Rz��"�;\WR�/'_C+����"A2s1�`�B=�N_i�Ȩ�=̨�ၞb�Vg�kڗ6�U��=���=����hQsL
�mls�3׺�T<�/�m��(0�:��r�s�� xۛ2]��XnS�1��s�V�E=�N۲6�
��>��ߌИOX����Wi|$ko�!�����'��Ӿ�Ȉ���yJ�V1\�z���-�ؐw��ˌ]����H��Fv\?�B��v�t��{d{�Y�&e��
ΔB"�1l+�Br�1�v�V��X��0o#�(�pQ�Dzl5\������t�Z�*�l�|��6#�(�JPF<'installation/framework/utils/buffer.php�����Yms9�l~E'�����ݻ�%�d��ľ8��ʇ��3T�)Ic���_��fx3޽:>���ӏZ�-���t��Z�_��5�]}��!܎9ha8(��T����H
��'Y
L�c�5��3�#��l���/�D�JO�}��?R|�FF�۵P�s%Fc�O������Ó��_�J�c3
_��	͵LeK
��ǥ���X�<�d���|�	W,��l���?|�JS\�4C�1�ʭZ-�C���Ͼv:΂�[ˉ�
Cs��9�21L$�q*9��K�i�^�
�FҦ�j`��������	\�<A�2r����
�H�f��_]�Bʔ9\�I/�F\�ܻ3�&v3˜3����!�:��re
�J>"F{dp3�MǙ������p����Ę�=ǖ݂�7R;_&����5�@��,��L#`#�2��7J�ޚ�D�mG=���
3a�6*mSܜ�X.�\>���5L��H�H��;#b����G��yט�1}�k<0��J�9��j{���|���{L��܅a �Z�n/��H ����biJ������\a⾯zH�'��x�{$���~w�	�����6�+�9V��Ir����A	*+�Db�Y�����Q���xbh7�l�n��8Zx���T��[����4(k䙕���Z��YZl�<�j{�{h�.t���;�v{
�(n�!Ck�6(�a~csI��RJ>,F�a�DtJ��a��#�m�.�<�>D=]�R�+�s{����y>=*\��C�8���^��D�;Z��
�Z�%�xTq��1y��(�tς��pIJ���[ p,	VA�C�@M���/NO�`�l�S����u��sv����{�m���)*Y_K�HD�ʳ�%����M��EtɓV�S�UM�5Q�D�����$��EY6A4X@�`	®n�� x��
s�̹ŒӉ*�fc��y*Q	��}FM���g��u�TaHv��c�Vz8�`Ŷ�	��N��9��Z$���<ЃD"�&b:�O���O�P�z�'��mhO(:�5Έ���y�L�X�K�\�������H�8�x��[����ض�8��V�B�=�t��#�ͭZ*5o'�OS3�/T�
��*d���8�ՃFЀ������y��,-�&��xU����].-��I������'#)���%������v�h���Rg��ljjp̷U�㈈�����V���r윕��)���+�֢�.,iN�9�u�����ˡ��"����q�3��P�[�G�O���b�xwJ�X���Oe?�(�3�[X�4�[j��Lŋxp �ƛ�I�a?�ŋ�Sw�K���Ѱ�C��6�)O�Q��ѷ|���R��9���)?c�)�;ʻ�瘍���W52svsѰw�0z���ٷ�]�C-����/����\wo��n���[۫}ˣ���3L`?�L���5�P�}��ic^�f9m���$�v+nS��j(>��1+�Ĝ�UM�>.;;�r���K�ޏ�����4Jj��n�Ԃ{�6��q������"kh{ƯΤ�ĊI�Zo|
*�.g�ʉ_��Pf��\�0�L�9V!J����E��R�<����ر� 𨹚
S���O^ՠ����>ZHy(��l:@l����cu�b��$�#�׮(����aY�;��
��؛pEٿ��B��殹����Pҩ;hy:#��t����'Tc��6|�k�MQ�ɛ�y	��ܺ�%�k�h�+�d)n�#+H*���}9���|`�HŶ���֋���vnRqFnr$����0�l�~��^�2���N�k�׹m�O�
��ֹ��CCvtD�f>�<7[H��k�<���X��1�����L/�k�R��uh��s��G��J5�ŧZ���I~�|b,�`�gk
n�j4OB{���	����o�C�3M��C��9�b�^{?�����6}��뾯c&35:vo'Չ���6�C���+��C�*�;8j�%���%�0�|響��V�X$��"��hYw���r��%-�,<�qN
%��
a���.
�s�K���':������.�kǀ
7��$�~eܥ�4~n$�헎���۞�i2�G�};p,$�5�|\q���퐭���l��b>#�|X*�]'�����
�%�J�-&�������l��w�l�@S}���<�,=X[Y2{���|��p��?ʗ/�m`�e`��%T�7�e�Z�-�.�s������n���������K�e^�-�D�?k�JPFD/installation/framework/utils/handlerextract.php�w
���WmO#7����!��&
�>�])
p*M��A�f�d-v��=�{g�}�^�}+J��3�<���L����v�Ѕ���!��8b��a��6R�K:T<50�
&A��H!Pağ��P���)L�p���$�_21�Wnd,1��9��`��`Ι]e�T|8-�ya�`o�݃���0�a$�@�o>��	-�L�"��y�K3��b2����Ι`*��j1�
��6��҄�}R��7��A��B��-p�Ũ 4\����
"�3\�f�h�)��� ��1���L�:�5<��x�O�A�z�`!��B)f|�P�PA-�O��q�5$�Dr
z��R�<�fa!�kG%�a&_��2|ԥ��
dRE�a'�V�(fJ�&_�"�F����1B�jbJ�f#uu�Q�0[�Т�h��8�f�i�0"�c�7���e"���Y<;<��E�Sqx�t�.�|�e�්-9�Ψ�v�~�=0aD�0�(:�`.z��֤݃vi۾�Nq�X@��El��3NsC�<ӃZ�
>o��"��<uȵ���j����K�~� ���s�`]ī�f�*6H����4���3���l'�]���,˙R�~�~�C�jf�y�(�4�"��FK���d�2��<s��V�A�(���l��o��Zo�	���r�]jd�|)iXHCwC�%����j	FbVX�+�2AJ�&���>[�>�| q����)H�)&mf����������$J����U]���*�W���?��n��ӓ����ՖsY�T��B��̍T��@�V�耦=�G�a�if�V���%�^L�|ޚ���=�H卙�V=v:�L�W#��jl$�o�����fJ�*�f�va���8�D[[��9�1’�,+��[�F��Y�}Ic9%l	�:��jQ�W��2qp~����_U*XbyR�M`%�(^�N��-�ஞ��b���j��
n�U\+C�Ô�b��r�o�q���Ķt��H�s�O�վ���\G|frw�f���k`Ó`e� 	�6��;��`�{t�篪�U'�x��i.�j�sh�w��KdZ�͟����~��R�ld_�xg�{v
� �v��O�Ԁ2zP,���t����z:z���.�k�[�x��n(��2OX��Ơ\���~�:C�^��{>܆{�dLoUD؁w��b��~�ho�-�{�����2�cP�m��@mϾ4_�JPF<'installation/framework/utils/pwhash.phpM	7���X�w��9�+��m�8��I˫$�r�����we��j+im��~��v���4��s�43�<4�IO~ȓ|s���M�OO߼:{I;�>�d��d�u��tF62*w�׆z"9	%j,-EF
'c�M��Pʞ�g�,���ө�
6�c�U1�D�0P��t>5j�8z>��5;�;�v�ި(ѩ��s�^���\���[�x�b�+U��,������4"��z].�����6���nn�ݼK��8�K%���S.��hS"l����I|���_KM��!c�A|���a��Q�Ɍ�� C/�U`�'��t.��H�V�G'�2���}�c��"B|Uu�Ƀ+�	���.�XY��lѳ�Bf��R�M֩4�"�!�F�-�pN�S�4M�1"s��J�H术�}�]��<��#޻�8�?�ݝL&�EvQa��nl*��C�F��T�1b�ݪ��L���T$c�J�
���"�$�3��4�P�KK���q����r���2'"�M��Y�"�6ʍ�]F�2xG
�GYx=��4}6D��z�� �[e�ȟ�֢��FTE	j=@��5��;��5�.���(O�9��Ι�fa#QF#1��K����aE��8�	���(�
s����<�i���0��
7<��y�N�Sd5�b���!s�ŷ��҅M��2 �!Q��%��_)V�*N#=��@�A�*�=��8V"�q�d:�͐�>�F�t#ΖQDH���P�|��ksc�sUSN���dz_2��n���uS=�Tkyy޻!��g��Z�l=����Y�a:2�L��Z��+:����Q��htL��n{��px���O�=��W�g����/oޞ�����~��o��(��A�~��L�������:�@���'t@_��w�Nh�k��1=|��y�k;��Y��|�ḇu�"���F�q�g���������@��4Wq�|Y��uL�.���b6e�%{t�fy��R�TӅ�W�U�GC��6�����78i�`q�K�jjk��C�)���*��Q��~���
yD�f�\1p٤'OB����(�ON訹����/Y�a��!���[���|+�[i}���+MKn�j3�&�R�Պ�"��u�N]��Zh��&��6RY��a��F���ˋwgo�pl�&�@�������V���6�Gf�/�]M(�	+��X
�v�:��>�iT{���M����qe���I�
��b�\'��Ox��–c	�,ɟ=��/�NkwJf�I͓ۏ�Y_���2[t��?����՘0��&T������c�i�r֝jK������}�IX��T��M�"��@��c)��9���^>�Μ�g-�DL��!d�ɬ���š'�lW\���t��}��y���)�<�
�����P�����BK"f�82�������s�C�J�d'�IKk�R^�������T�4�%��(����4��1~����C�P�s��t���L�X��/�
�j �E�=�����'���dy"r\�S�x�h��P���/�K��:Y�}�����,v��A[w�Ђ��u�Il�U먚f�+�,wM�K���Q&el�*sR��E]��"�HIȃ���}�Q%(�E�,M_j3��@5[U�G�9{2l�@���r���O=[��*��R�Qm�C=�,*�����hf\��2���^��KثCi幂6E���H�WA�H*�8[�G.<�*���{l��P%W���m����1�=�ל��e��Sl��W���:>+|�Q�7�������)����E�O��֯Tk��+�5JL�9G��	�E7��]�k_��o���z�T+�/ڻ��X���t�	�
���Q��C0غFaе���`����`�S��9�������
�V	⊡uk���n�6m��y�1焦�1�P��r�>���}���:{w������_h���U�7>6��{缫�<�>�D����T5��z��{�#�Q��(�R�N%R�+9j�8�]�[�����\v`�k�z��K�$������X�_'����/>�/�7~<��6�/KX�
�t���o�j�IQU�o�ݞvI�3ǁ%�ш�4��mR6Kށ;��Î�w,��0B�U���Pk^��~�"�'2��$�I���}]UZ���I²茋�O�Khi.ҋ�"\V1��矰��cb���zgY9�16�R�~8������i9�!Ok$�My�D�1���'���=�@��@��b�a��*�m;LB�8�OG�d���w&��}�L~��N���ٛ�,/36γ7��ݢ<��0���+��W����\~�?JPFC.installation/framework/utils/tokens/tokens.php�����T�O�0���
A�(���l+�C�(ڇi�\��XM��vZ�����ㄟ�Ф}��;��{��|��H�����.o�/GЃI���AP��T����J�`��,�)��%j�
���k��N��<�#�2�TÖ�ZP�������Z�Yj�y�`0��;�̘��}�F��Z�̤�~]���+sm��o��sT,�q9�\�������$e$@��~Ę��p'^�F�Ý�=<
N4���D�	���V�ĒP`˸�nUɤ̹�0��̵Q%7��1v��l���$`|1��D�PP�3�����;��T�h�&bYv�mK��P�8�
���,
�Rj��`uS;�T����)��Q"2r%�t�P,��BS*
�����&����9���D?..'����l�=��.���0e*^:%�'z�,B{��kc��;3<
�V)3�ت:	���R"��W��K��
oUP��!	5|�v�:9O�"7�P7�Zk>�4��e7��c��\����w]���p�o������
�7�m�J�L��
r\��cak��2��}=*�{P�����;g����D�`�n��+�
�߈�M\5K�{�����=ۍ����5&�^5ֽ+�e��k`�^���mw����E�i�6���^�:/����#�g���S��OG��/JPFC.installation/framework/utils/tokens/parser.php�
���UmO�H�l����T���OW�D�*
��V'�"Ǚ�U6^kwM�N���ݵ�8GI�~�6�y�yfv�Ͽ��𻇇>B<��҇6�2�4�D��L49�T�B�LH�$�, �iƞQA*1�8��
�9�$���#�֖��0��}M���Z[*��dO����)L�㣣?��Gǟ`��L�D��\���(�PЭ1�����,�\��W�{��e�ᶜ���>>�T��O-��8 )��S����q���?�?D�a���S"� �׌���S��D*���
ɞ)(M��ppq3��h��� /9>��9��I��ɜ�i�pE62��	x��@[Xkr��<��S�+J��p����##�#�ށΘj�91\�^�H]�*c)�UX��DIݥȣS�F��ڔj�6��hlR���4G��.�':}�+��&Zf�#�F����A�:���(���s��]�$�h>5�5i1����c}ޡ���M(���@'�5��RiPH(���"��ùX���bϘ���q���ǡUq��Y�M>9�c��`׮�G�y�k��� � �A�}�\ķ��x8��2��!A�I�;xw����+�}U^�ܟ_�M�7?Nd�l�0��懮ҳI��v�.DQc�e���� h��+�(8n�۔�}�J�z#����M�Ǐn��Z$�R�Pex�>W��}��[��+ߊl�l��m\*�&�P�W3T�*'�?t����Z��EѺ�=<�`5)�m�W���F�:qk�Z�v�s�a��<(��gm�[���ai�pL8���
]\�����lއ�{R�����b7SgR,�b/���ba�e�/��7��:��h�$y�62�|�����������%d(�6��y-z�{{��F�<�+�	���]�Zw�v�W�=��v޿k sAB�J��;�5�CY�#p�$�c�I�Af*�*���qY����?͂X�_��JPFA,installation/framework/document/document.php�����Y[o�~�~����Yq����i��H�&NP��k�.%��%$eE(��;Cr/�����!88zъ�����~����ϟw�9/ޟ��\M9a9hn���
%�$Z�JÈ%w��N��H4g��0Z�����@!�r�Re
u���
�e���Z��������S���sptx�
.D2U3��ޡA�
5˔���6u�2�piH�����=�\�>�F���=׆�z�t)C42��vS>��qt;����t�� <���
c�q��%-�Sc�r��_��3�>�p[�_v
з�I;:|y�
.1L3�p��,�c�p.�AC~_|���ij�Qˀ�["M����{s��\:��3�-�l}�)�x�Y2��k'���^PhLPA�9�Q����,S�w�r�|�
�Y��M����,����w*��\����*�<�����c4������gp�i�.��8�ź��.2��v� ,(���O�Lß÷>�h�(0"��$�*��8�=����'�"c�B�L֭�dk�\�r�`~~�v���_�W�+�$-�����f9��r�o��1��xj��_Fɞs���D����ʵ7�Q

X�����d�$L�=��N�2+��?9˲^��U�����_��/�X����l||\���<����
���N[ei�%c���2\&H	��K���z�mb&o^�W'nծk���s��ĵ�=bw�!�-2��/��*η�(b��x{\��o_��sK;Msz�~MI�%q�F�7�;x�?++��K	�|'�"<�i�l�uyX.9�	��9q ���Gri������D]�Yʃ$�	��{�邺d�A�-G�kڹ��|nOkD��NW�v_7r�H|�W`�\,Q�L�>��7���5����1LS����qJ-����I؟���p��>���	��eΑR��$%�c�D��UAƳ��S�!R8��@6C "���
�	�͏mFy�\M�}<�x�1t���Vh��)�ʡ�� ��ȸg1�/�b����[����5I���r��pű�n���<�~���L��aܐg�씳�YvkG�<�.��ED�sa1���f٤���휭�Y��l5扸��U����jY�M�A���ќN��#�����u��F���3�2�B:��(Q�H�:~���}rY�n�R�֦�?jA�;>l����T�uq~�2���E��1ɸ$!�����˂�K�XYIΨ�h���y:��J�t��XxO�Z�2`��j�Ǭ�W�VȢ$�c���NP�ӎH���GU�e˽T%su�1��w�탔�f�$��dIٶ�?Ҙf��դ��`U%�o�]no�p��h�������%���_��1<w0"J�_8$���@��b��F��i57H;3�%��ЪЂn�6�Uw5�Nz�˗5�_L����~��7�o�̜�	�P�4Y�r�K� P��*��	�3#�3��>k>_|�������V��[��R��0�iFESGV��R�bZ�|r�S������>�d�$gz��E�@���Բi��A
X/֕��d|l����ZO��"�S|�����C��|�)�YL�z�F�03��0V����� M#%Q�'�L\RN`���ʼnK��@��j�
h1]��/E�RG?�Lg��>��k��M���Mu?G:����9y�+�����*l��#B���(�;n-�K����dp?����\w?�zZ-����8���Kx|�r��<�?����N�9�j��v¤��gr��S�xv��{��T8{��#�w��O{��c����!%���mo��؞I3�jǵ_�o�z���@�Iry�j��P�o#_�l�����Ħ��eY��
�փ׊)���n���JPF=(installation/framework/document/json.php)���MP]K�@|���
M���}����R���\.��h�;�.�"��^b+�-3�3;{{o*�ƃ��n���o�IO�伶�K��ƣ��ƀ[Q�9K�S��tO�q,�
�_�W]���<��� (%u���heYy<�M�H����p:�ΰ���5w،��6�������y�UKAʵ���;֤��/Ml�䁬k{ͮ*ա�
�c�r*��<����j���V�K��9c"��.�h>I�g,�˓���E�7�h��g��l��(��2�z�>F��tû���)�V������N�JPF<'installation/framework/document/raw.php ���M�_O�0ş�OqL؈�'�Q�b ���t���0ۦ�Pb��vƷ�N�����ڲa���G�Y>.0�kM�*�`�hx�
(�C�Ŷ��N�jG�$Q�o�
��ɡ�Yy1��]̽��WDC��	c�NUu���+�x4��G�	6JԦ��+��B{o�i�1<g��<�j� �������Om�'�#�^�K�JM,���!c�J�I���|�X��^���4�2&�
�܈��tx柠�@Z��7K�oZ�jq<��riƒ�]pj���Y[�����JPF=(installation/framework/document/html.php`��UR�n�0=7_�R���i��VF!��(MMQ�(Ih���2@�Y~�=[yy3�a�v�A�3�V������r/�'�46�B�Ŷ2��(���c��-b�axa���Y�R�Gm�n�9!�x�	m�V慇�[��~���{�G�KQ�;�v`D��N]��A��1��yV)*W�Ͽa�
-/aQ����Ѻz����JZ����X��0k��x�$�8lՄLb��̘������]	x𨲻.�a����TJ��g����b�A���Ԧ�

_H
�V�����Ҟ�
r��Np�]p_�>^ī�z5I��%t ���H�9�e�!���\I��!�>��JPFE0installation/framework/controller/controller.php�Uf���=ksǑ��_1Ω����|�;���M�*�r�N桖����b�J,�=��G��.Y�+wu���ؙ��~wO��ۮ�G�_~y��T��'��}u�֪Jk�J]�E��i��jQ��Z��R]'�w�V%�b���J-J��z������׉zlF�K���"+`
\��[���h�`�M��E��+ӛu�����<���|�Gu�.�E�T�z
�UŶh��R�v��zI��t��
�8{�^�\�I�^5��A������p_�(�R(a����R��\/G��g�φc�L�h����?�8˲�ӻ<٤�We��e����h�Uj�����2����I;����	��M�*V��~(��q�MJ@\Uu��7����`[�^ ��!�WP	`o����I�@'�z�Ԁ_��Y\	�B/�����*`��̄]�T}��x��0IB��er�Delt�.�Uj�ú���_}�z�����`an����H�n��D��5B�4��b
%%�+hqє�kt��ոM�M��tysqj@�"�@�3�N��4e��5lST5�;/�$҇/RG��-�.�"�2�L�n���=���L�r�o�l	M�N�m[��ot\A'U�a�0��F��4
VI��LW�N{i�(>ɫ:�,�	��ؓ@��0���N,^�$�R�G�h���*����vSÆ���қ��F�G���j8�[yQl�E�V���Xd	�Z�*,�7Y�.,�X����ˀK)�&��_U�
.8�u�diՁM�X3`@����s����V��4��?�xΤ�j�l�m���!���^�<\���P7`A��#i	i��m�.0��^!<�R��E�<����m�A�"iIac���u�0Oo!0a��y~����^"I^��\��һ�]W`4���Jg�.�qI��d���С"YC	T�3}������4�jU�P^�c�����P��!YI�?�U=1�(���dC�6"�%I��$Er�E�{Ŗ�1��(���7SDm�*���Mf
�siD�LN��`Ơo��#M����	�t*E�)g
i�b��w���B���;]�І�&�@��F׳�z���K�ęw�Wlb&=x�����A좪�D
j
�ٵ���#�r2������9	I5�	p+�RJ�']��j�X�<^0N�	g(�'�����Ç@'G��o�O�s܇���j��{K_�Jg+u���47�vT�l�Hk�~i�y�A����W�Y��`�:�㪼�a�3���֠�ն@}@�+�c����4�C5y�6��&�{)!�aH���,��kh��|F=TgB}�t]!�>>Fa%S�1���A��b��߸��=E�m��6d�B5&a�(cp�D�l7���h�D6�хW1���v��Wސ���)��iSL��rd?/=�c,��Ձ�X��^<���0���b����P�礵��:8�14�[�X�eU�Z������G]+R Y5+ȣu5��{Q.A!5��&�f���mf8�٢D%��������鳋�����0Sl<� #�64\�c+�'6�gY��$#L�L⟪�+Dݖ�P�^�.����.O��yN��E�5d�a��&�k�5$#j#��=��� aX�n�ygf��H"i�s��&C\�k�E�3Q�:J(�e4�6{`��rƦ�7���@;��Z��[
��h����c�"o,@��/n�w�n1�A�;��T]��I\���,���‰<�H89^�C�Z��l��FQ9��N:@<���L�o��z�H˛"a�J��6�(�a?	���Vp7��ΝI�M^��ʢ����D�G,Bl	s��K1�!Vm�⽩ӬB���.�(��I]d�{ppV;����z;iwi��Պ&�9EAT(}B��$��Εl-�-'��2������ R�����k^�M��F��j� ����5�B�:�J�B���u��O^��BU@t6�K��ı�����̡<�����xg�#�\(�!Dr~ʨ;�������$���n[a)-��M���s�	I�W��5aso��c_��������C�r�	2,8�qJϰun�%�o|�b+;�<]AI3ňm�v$P[�oC5��(aaY�en;ޅ���w�?,�f)JH(q
W����80ge6�G�z�05f�u5���Բԫ���F!/��Op�6��+=>�J�
���O�_><y=�����F�Ged��m��3_���8[.�y�,3
�b�
�p!��Og��\ҹ�M'�9��sc�<V?��,
 V�0�yL
�
�[�|I
��~�/�
�d]"Ad?	��6H�c蟏�/�՝��1glA�ҥ��f�v�ؒ����+(���h��Ʌ&��b�J(�꡺�p�Ө�jC0�}�3̤B�`�����]>��|+�8���1���y���j�I�����2Z�f����V��_!�hw����D���.��vf��
Lۀ�����1:J��(�g\ق�YN��-&�ZK-`���o1 �Ca�_`�v�ւ41%�S��?�q�*2AY��1���b�����lAo����R�?�q�ީ۝@��o*�\�YƯ�
��!y��
�������eJ��kزׯc{�
mrH�����W2�C�S	��X������������QG�ȽN���(�Iӯ�fZb'��Ͽ����	��ûQ��
zҒ%�kƱs��Ծ��~�`e�K���Ȱ�Gs��{��;�޿�K;t�Q���w�mөg��Pnqg6��BIu�?�I�����"��9�b������<��@Ե�����D`���fZ+�3g0�AC�s�)��,�W�w1{0r]��f��	�l`�JҬ)u<�^#L��M��|�H
2#B�B�ؑ�մ
�_d0IӬ�K+t�Q�IC�˹���A80ֲN���V��,�w�$��/�b�٥�P?|Xm���
��'�٫W��P0vqq~1����~~v~9~���)�1��D���f�޻�	J�V��R��L����DI0bۥ���m�al]8w1��	�
%��V��j�f�k�%+�t���0�+�e!�m�o	u�E�U�dQ7I��֨��\Cvnu߁����/�Ŀ%:d��}%�����R�S�Nլ�қm6�x�.Hm3��z�%� ���iOA���Ț3�ŞAG.G�wt��y�p]o2���kyk�	MƊ߅�t�$>Ʋ&x�y��j��a"�&�V'9
b�WM���+A�Q�Ljw-P���LT]6�3��\�H�<��|�Pfzc�7����C~t%-kG��^�sFrb�b^0
�T4%�.H� ddB%UU,R����LB���ֹ�k���m:����d�u�
%�U��u���s�ed����!�=��.� �7��}��ϳ�.�pV��g��A�c�O�M�v̦�ZN�w(�oS��-���&Ԃ�S��fa&������?����"V萙�	�:��,��ɔo�l��r�nD{,z.I��Id$�v�V�� B�C��X��$�
-�S�ٞJ�?4�F���������k
��w�)�p���v}�Nڸ[��e.U�z�;����wA�̓3��˜r?�0!��o����#5<~�_�����_�W�)RW���:�o��82�l`l�8�({:������dc|a�QT�ĵ�kgD0�*��J�͆D�Zw��ђrՓZo���V����z���P�E���h��p0��[P���H��w�XQ�'�힆��VӅ���Af)6t��"N>H�[��nu�G"��S�ks�	���=G�,�Ʋ/C�'���cC��Z]��QF qu�V����x4�r�4�w<�l�V9�����CO�2�4#�]�Ɲ�v�����*�����S#��Ai�=N2�\Ofx�b3%IN�UCZE�0�ꡐ-߲8�4}_J���DA���+�>��m�mg�;�jq�с �j�4�(8�u���z�֦C���G��C�uN�6&0Ko�S�����@lW�';�|����\6M�m�7��w�>8�K�
�y�j�������7,T;:H�S��4[�l1�W�>
��e,��DGg���
3��ΰ-��aj@��?�ն��j�heN�pĶG�F��?%�3	eՎ�@
�OC��7��`��O�#��q<}]��Z$|��nE���h�1I�G��+
�~�з�#g�>��E��f�xh��:�_ݠ�vkx��ph���q�1����dZÁ�����`�+����BY�:���P��џJR���1}נ�5�Y�,�g�A�Yt�F��I��lj�9&�[��w�F(�~{�QWa��G{
���j�%cQ�q#؏;��U��֎�=�-��q_G
6%k�~Lg�����4�}<c�uD��#�v8'��D7�iO6?ԕR����S4��"͹&�}���z���-��b�i+3��F�68�ȵ2q��};aP�Ok���9ذn�Q�з ��	,������;��#�u���<Ȍ���zn_d�=iJ�$��W$�;�$ �L�D���:w�B��Z��IL�����E�
����??:`����+����={���v�H�g˥{uE�q�	*S4O��Www��Q��r��C�GZ���g�Z�8tOX��^��9	��8whwt9�;�穾Iw��0��(!�\�낅�F�i�\R�W{
��(�Gm�֓yKd6�phD�߇�
Xю�I%-r�j|��6�<-��³��f��`����t�>b�	d�y��)K���ԯ�	�-@�z��J`�f$���Z/ލ��Í1�7�AW����5��?�D���m�6&�w�)C[ֹ�*�&��R��C�
-��]�==y~η`;d�Hn��Xr镴�Fܤ|���Pc��r��S?Dl�p �`RđXCL+Ү@�u�@;h���%4�#7�T�^٩��ͤ��]�C�$�ә��9B�T�靹���",v��������b�CO�D4��	��ۍ�bf\��Kw�➒���n�K�PN��.oM@ť*�M���d��{�Ÿ�E��S{��/V��L�;�����:_Zr��y��Û�9`�����O|be���k��Ww��/�u�3�%3�\tp���}Z�!�����
fng�JY���
9��|r~vyqNo�xvI�����]R�_����P��O�j�$��z�d,8����'��T����>�o�S�>�z��Zo�4�Q蚗�@n�۱c �q���	!n��k��Fѽ"��;0&��X��>Y6͈+�t�Nc)0)�uT{���m���X���~�ZB��;����`v��x~˓�~gFWZ�Z�E��E��&*�G
aٚ���}$p��P� �h߼�b^+��_�ê#T�m�����oX���8!�Ņ����輳�C�б�NR`��?]��U�	��?�<�G��n��e{Ph�#.q�,�}#��_�(����*�\̷r�K���w�:�(�]�D4ͽa���_�����W=��N��8��%%������&��ҥ��K{
!�l��C�+��@��I!�zQ��{>!�w6v2�ȷ���un�,�[�D�&�[��]�~�Կ�֎��{�\dSv �I��\;����qaT�#s�ID.{m�����J�r�O���N����߀�\���띻w���I���,]��)#�K�4됢Û�ݣ5�d�DZ1`��/4y����M�qQ�M�����F��?t�m��s-�'z��>q�ti�%)!
��]7��O�9d{)�Z�	�k;"�W��M���{�?�1+�y��E�=�Z�_G���8�qϕ���El^�w��лx�a^^��(
G�V
�}��,J��Gs;�kO��M�����l9�W�c��^}`��&TzA��'ċ�yv���"]�W��]��J06[��.�_�K�AesO1����j(Yr�O�����U��EI7*��u�U&��zGu?]�bBSf�'N�E�T�����d�����#B��V�q}'R3z�8��>��+�j	M5šD9����Y�_��:��ʰ…����&�{���7"�0�=9��\�Dӿ��Mq�:��8C=5L�����QX)���a5B�kx��}�ֵ�!gP��6H��[E"��z$'x�	��k���ẋ�I=1��&A���~9�'JPFC.installation/framework/container/container.php�����T[k�0~��8�@��4�}Z��{Y)-�Ў=��$��HB������#�I��]
���t��w���u���A��]]_�3+�A�aN(	��L��	�O�fx&h�dS�,!yB�08�<d��yP����MV6Cr�	w\�����+�㣣�����<S9�ps���*��\Y�kܺ4��Gi}���op�
�ᾘ�n+����N�@�r`(xE)N��4��˳������w���@�2Eɗ �/�"��ck�K��]���Q�[Xg���KO�iM��ǒͱ��c	'5G�5���H
�$[��KԮ�i	�uLrlM~!�f�ghv�O[-�ɷ^�鯥.\+=�����r5�Q7!xg5�Cj���>�'Ա����e�$	�'qZH��"��H#tu/�:��o��u)�i!Kь�$D�]̌aK�,X^�Z}�p�{�X��̠t�Q=�
�]�
i1jDX4�GY=b
�;a-R�˄�ѭ��YUmV��8S�@q���5b���c�F6�:��=�u%����vW��&���E�}_�Q`�=����J8�9�������Tno&C��J��k�]��жK�_��߶�l���>��͘_9]1�AX��~x��h/���"��.߫�JPF=(installation/framework/pimple/pimple.php�	L#���Y�s�H�l��>��)b����r���e[�ͥ��k����tɘ������v�>.�
����3�習e�:~�/��{.��钃���,NY&����$�y�Œ�7y,���K�S�2�l�
�3'�"
�I�(�ļKp�-8,W�8٤b�̠W|k��ׯ^����W�����q�$�?�STh#�$��X±����+>�$�?\�9�x�B�3\��Y��$�����)n>n�3���1{��"䀟	K3��0�$�G��f:��p�f�G0�3�B�H�#���T �%O9:���Ѕy�9q��,]�.d1zz	���Y�D$�0 �?$�H?ϳ5K�
�2��
m���G��Y!��!N�'f�~G�	8������*�E���LA*>��"��ib�C�FmWΐ�Y�M!����1�O��K(�rم@�Y��C��M��5�e�C�2h�2��Q������wIz�^ƫ�=�<�P*�~A��Sr�~FOh�<�xM6�q2M���:z�r(��j�U��$e�͒\�0�7��蠳Yݲ�Ԑ�A �8Ur�-���^�0�M?8c�	����S���	����oz1��R����#ϰ\|�����Gcw2�ᘸy�����co��_�z�s8�����ޥ7E�ӡ�i�y�]����tN��7��%^g�t@�φcp`䌧^��at5
'.*q����l���Kw0=B����L.�~���
w�f�IQ�
G���.��S����s�w�4���w��.�:�ι�v
��2�(����¥�$����Ȟ�p0��.�;��?x��؛�g���Ke)y7
�:p5#�|=@HB��&n�N]���0Z��R����a��\D<h^;�]��9���۝7-�SzqDՆ����K�w,ǬOwո㖢GHP�S���IS�q|�K�ok/I�-�(8�ea����ڜ���05��%�X�j�i�*��K�ֻn��&��G��Q2D&��RϷ�8�eE2T�B��Ǿ�V{vUQ�'�N��/T
��Ya��ɰ��;�AkR���L�3�<�2վc4D��y�����v�Uad�����;�"��m�_$��>O�P�5�	b�0QP���q���_B�JG/���F���o<�K�Mx�&���!ɿ��� ��)��4C��eF�0�'=z8z���Jb�z굣�F0��r�>�]k.�<�t���@_ �J*L�1�P3l��Т��u��c[�\��;��*6������F�Pڼ�	�6�t�8OKpv��j����H�'Ǵ�b�9�ì��fU>+q��ӁQ��7Ә��j�|��E�/c�yf�4^cI�Ɗ�w>O�+F)��T�ޚ��%	@O�ܖ<��Fj���O��<�^>�$�����R���x��@��1�6�iZ3�d}B�/�R�����m��$������ϗ��u������.�c�]��%3K�WI;�Rvs���9q�u9�L�мR�y��G�5v��{n�c
d	��T�‰��k��8����/������t-��R��Tn�䓐�
ت����π
^k���`�D5E����P���,��ZU��u��Et��C�db�ޤ�YUO(�bv��_ͥ�1�,-�boˇ�K;m= n�R�j��ܿ��r����mSp���5�/2°�''�����Yx�`�Rq+�NxM�@���<�Z�w���!^�]��&��g�ŃZ��K��P���7s��fc[W#�Ş��S�9U턾�i���l�6\p����o���K&��LBB�*�Z�6������z�(pR,Î�jk%����Loav��Tٶ��Y6-P_�eY�#zE�Za�O�r~�!\C�qe��}��	�!o@H]���b���^∄#,��>ѽ%��e��|��t'�5�j�)��v�	�Ǝ?�=�'�(�O�߮QW�����(������m�`c��
��ޝ��]-�?4�V���e<
de+�����=e��ݵ�w�KWq���{-��pa���x�dٯ�a�(�
��ء��b!">\��)K��U���I��kFS�{���7��݅��Ç�]��s�s��\kn.�vg���}De�z7����[�z�q�@I�[�B3:4�@��k�Y��A9v�Z�7�|ͮ��q,�Z�ov�ٮi
��,��Q֒mG}�����N����Q�F�d�~�6W!�'y)����}�j��>Z���FW�e����kKs4��Ȭ{4����{���DB���K�ݗ�
��.�~���J��~��5|'齨_s6�������[B욖�����;�O�T��l����r��-x����B������]������W#��Xŀ��\.}:ĥ�/���9���ɞ���bYP���:�k�2���^������7^�O���(���w�_����޺�o�^����JPFO:installation/framework/pimple/ServiceProviderInterface.php����]R�j�@>[O1�Bl���9�%q�I0&I/����h5X�YvWS��ɒ9I��7�?�|�t����z��kx�"%��1qP��Aԁ|��J�*芎AT	
'�����~™���5�F+s參,Ȁ%�j��)��<^��z�\,n����
lIW\��3xC�Ȟ��#���d:��4��򯷿a���a�Ҁ��y��\7�A"� x�eKrh�W��j��_M�C8��ȆU���k����|$��	O�4Ά��I������:M�֥��r��?l��l�Ť,jc��]���,��7C#���Z�#ayEKQ�q0A'9���9�쒒�a֎w���"P|��,��>A��D�q�U�m~����*(�Z��48N`1]�?��;�:���7w�
zk�Ҙ��`�v#>c�8ݽ��g!�c��JPF=(installation/framework/object/object.phpM6���V]o�H}ƿ�V��P�>t��K�(J?�h�>u+4��0���fƤ�6�}��������"���y�=w�ۛt�����av{}s�B�� (�F*f��C�S�T�`�:K��pŷ�!T�F��a�F\0x[X����L$�i~O�-���o�Lsŗ+�o��?�_]LƓp�ÕL���CxO�Z�2K��Q�㓉\���(��}��Q�b	�g:�O����}���P��GAa�F���������Y�D{�ˠ��a�5�<AذB)ゞB��A�A�Mž�='�6�fk@���m2~>������33T�����d�{��)2n�2�o�5�P�-��Ex�j��d*ɩl�&�O��+�LQ����[n��E
�8�C��/��%�||���ὒ�p�߃�X�0�[���	�:�}�<mTҤD��QDP�j�1a�A=��Ι�H�
q��?��UJ�+Nu+�0�ɐ{�RĖ���@'��+����7�P��+��U����z��L�NC�y�l�^�D�$��C�tx��g��؝w�����5�C��Ac��<�
��Y�ز$�Vb �%���ŗ4��S�\,w��V�e��ɰ�薉�g���
M�D�vC����
���)X-Ѵ99���;T�.������s��V�4f�������]��*��O[����
c_p[��<�������cϵ��3Qy��oRU�^�&�vB\R��Q+)i
K��n#��T^
ڮ6o���%o���
�㩫b7��.2������y�c�k.]��*�yw��k�a���5r��l~��t��Q�Y���ܱUv2���Y��.���}X�*��k�e�c��im�_?�X����H�ޭ�(����2/���)��㢻W��2�'t�2	��jo�e�)�9���bX���E���,�\�9��X��LS��sPG^�ӫ{���������OH�[_asWE�~�$�-6N��s�F�N�^�5�F�^d-��*�qE�ʄ�}�\`�j����ڎ���Sm��]r�'Θ%�O�?JPFA,installation/framework/download/download.phpC�,����oG�g�"���q�>�W��5$U'@�dw�l����G�������}8@�'���3�=�?>N�ҭ����}1;}q|$v�ŕyT(���Й,"��<Ȣ���K\���Ypݨ\���
��Z̮����ّ���kk��d���*�Jذ�=t�΢�U!��o�`�t����ӯ��Qp�c���'�Z�:�e�s�ki�!ኣ@%9�q�F�P��d,��KX'f�Fe9��X�H1����V�Q���`>�����l0�
a������X���P�&�������V����2�+�r��fP�"�+Q�V_�9�W*�*�Y%K^{��A	�ɍ�@3Y&�{w��f�
�'�)b���?�*-4��Z�5qű�T���H�UFCAD�X�	@/d��X�")�ا?�4m�,�d�hM��������
�QxR|�F��IoЌ1|����-^X�I@.>��=��VL����#�b���A,���fÖ����Br/>\��9������W󹘈����-���@^Y�FX��~��`��XgQ�
S��G+�<j��T�>�q�c�u�,4�G��X��dfx���:Cy+�궆�퀼*��'^z�B��=;���u���C���f����
e�}t�����p���[ڰ���쩯����=�y��@�d{�B�<UA��q`���rh
D�I��A��ZA��������a�p�\�8�
��Ԏ�$Ҿ���E�A���97hZ�m�g��T���A�i��e�����Y��TZ9���q�|�/S�v�H|�U�I"��I�@��t��y�C5��*�,�[��,SI�v����l����e����	dD�<�����ņ@  0��ͭ����[p9�:�2�Ơ��Cڂ��������J{��ܸ�+ڤ񅉌
1FIS���j5Сz���Csq�L 
~2�L��Qڐ�饪1v�f7����\}�Ba�-a�o�
�ߘ�*$Kl�f��V#���Z�3\j�O׺���+Y�n�K��c\E�	ч�K�q�
��N cޟ�D���<�–-���<5���O��(۸�����9lrٕX߬�*����շ��ϰ�݆xGұ�'BYH�"%���t�8�Slj�H4�+/uY�p�?���}����BL'�C��J��tsh>���锠r.���d���)Q���cqzv����N���C��b�m0�Id�*J=@
�̠�i��(�F!u�ZQ@�Y�
ƾ�!7�F'	j��Q��,6���Ġ��F!�@�?}�O<ujD8V�������\I�uG䡼��O6���MG�>���=��Q���i۠G�c�{�v@]j�i����xpOj���]��9P�Q�c�9��1�W�3迏����&yt�%ȁa�Z�0�8��^��.���?Ž��ζ���b�dv����ݱ�M��Yr��u@���Ȧ�@��ώ>��\�;��%�s���N���%(7������"i
ìJ��J�q�ȱ�!��fԬ7K��&�lȢ��^Áxpv>d�l�^�)٬R?���B���^s����]����G�X2�i{����
hu�.����o/t!����j�v��P

H'�]�@V���\DФv�x��ee��F`�. o��7P��eq�Y�{�o������E��b=����_k�ʗ2��L�jꄠMu�M��H�;8��GH��s���f�l����*Zӱ��=�%�}�F8]���������������Ǝ�/�$���}�n��4�`x�3U}�7��D��Ln�������&�<��qL�U��l[��0�S�p~�O) x���6-���j�v���O^LL�I��8���dÔ��C����ad���8E��r��A���uR2-o�K��.��p9:N�T��QӲЩJ�#q��4����sh��2�8��Ќ�̫y���A&k�SB�V�=2��vmTt�v��~)���3�����8��K%f��=A(��*�X�Ѿ˾�ٵ-g�CQ�W$��L�k�\�:��J=g`��<�����J\�RM�A��r��c�I�U��!�@¥���<�Àx�wO9��U6�|���&�vR���I%��]�I̩K�b�3l��"J�@Z$�ai�3OؙZY��e#y�Ȫ_� ֹ�=�`�I{����W�8huV��2`X���#j0��޴��W�D7C����2�I�B	t�%pˈNm0��0��M����k�J���_d�V�ϣ��2���?�c0½�Uu���
��]���y
�{�Z.D��l;�Ҥ�_�7�Ty.�te�x�ם�
��P�~�wq�M�1@0���E�}b��a��x��I�:�AoC=`٭�wfc�f{�P�u�s&��S���O�P��((+�/ #�W�A#�Ξc�*6˹U�����qZE�,���z%z�V�(QN��o«������$�c�}`sW��`���UF�A�MBW>'��v6=ؐM)�`�BL�		���,*�D���م�P<|��0������ӓ����ի���7'��g��:�8:9{6;y~|r��͢�)w��J����kUë��V��fH�̼�Gn�0��C�3=�4��"4��ҶMAS06��gU�W,�%E�4�B�%�s�[>�B�chw7T���e�n�옣<��UJu|�fatM�m���X���+�$����2�ʶa����;z7��[�2N��ش\*��:�x�]Š��M��j���qD��M�<ý)B"�A=1��c�R5��4>��m�2'<J}�t��S�g��7�6[H;���E{:u����r�kkZ�
�j!��{M�mR�����o�z��L����x��t��M��Ѝs�At�$��Q��Y�9�Zi�������n~���.���A&oc.��FJa�oI�)����x���)���x���!��7L�7)�_x�z�-e꣓����"��:��;�Ql���T�c%�<�qH/���J�qh�X�ks��<�}>�f����"�i�N(TR�o�tq�YS±���뢌c��W�9×!ddnI\���DŽ�����ս�с��
����>�W������}l���so�4�IKn՞�����ᶫz&drh�����ȸS���8K]8���D��C;�[G$?��_�a&�U��ߙC��pno�
St�M��k[���?x���w��6��I�x@X���C��{�V���t8��30鍝W��q(��Eu�J������u$�������K��ɝUI�*ԍ��R�2���A�P�""/�&��A������vQ�<��z���	���B�9���	ʉ��&�L|gw��.���
c�˞��f���=��u5�<��uP4��q�
@g��T�?�� ��~�oc�o��;AG$U���/�߾I�
†zG<�$�~&(��xS�ŏ��
5�~:��Dk�?�l��X�M=���:5�� :R�ǭ�JPFB-installation/framework/download/interface.phpn
���VMo�8=׿bl����-Z�A� [4�aOZ[DdR ���b���!%�Nl��I�f�̼y3ԟ���&�7��tL�%S0��s�Ϋh��PxSG�9OSU<75)_���UdM�M����.Z���W9Đ0�j�Us&���p:+\��f^F��F�������to��U*З�BB��j�T.�i�.�U��m���'�a�^U��ݵ/_�����
x8��gƲ
��|�����b�
��:�n-�g�`�rK[9������i�t�Ro��yN�����u�w�N������4�tkFJ����v>�/����T�7������`$�O�c�-�Թ�}�df�r��H-0k�<��3e��Y�}��.�D˯�
���c��&7#�Ӆ�䤎�I~�<�hF���Y��P�g@<a����U���P-��l#�h5�}1���~���k�ۮ��c�C��v%7S��7Λ��lۗ��Ѣ��������u鈦҂8J��2-M,ӟ������4UE���'{i�S؜��l��o�=��V-�/���+�~8D!�{���V���A�/��x���owi��ĪK,k����v�p��AF������숶�8�9UU,�@^�REZ���\H��g�"
�Rӂ)���/�J`�Z*؃���
}����ڥR~�7h�J%d}kl;�j���.n�6&�w/���@3Ua�K�P�:@cBh�WY�3�� �C_��[q�I�yS�Ɉ:������1u��>���v�/Ĵ��X�u�뎥�!���v'�Rl����F]���
��M�
h���C���1�]���/�o	o�Uޫ�D;H'�h���i���%�;^���]�����=��}c�2��97Ѽt�|fJ4�[�lt/��-%���ג`/�`��E�Q��T�\��6��=K�Kzbu^?#��Q����ԕ�9s��!��w�蝷�l�)���3ks�0���#�������˗R��gt�x�����a���/VI��7�JPFI4installation/framework/download/adapter/abstract.php�R
���WMo�8=ǿbl�lO�n�u�40d�&9�iA�c��LjIʎw��3�$K�T49��pޛ7_���4���w�[8���)�`�yc�WF�K��=,���H^��MR�F�E�Q�|�Ĺ���B��ͣ�a0̧���%��Rax��|k�2��~'�w����x�T��L8�z7Dh�Ln��88�0��2��v����P�|+���ˏk���zRFX:|>H\(�r<�{����z:���T8�|��y+	qq0�1�!�R��bZ}V�<�j߰�i�X��
�X�#b{O@���*c������ZX�=�:�1�aeWpyqA�job�`�)�"R����C%��7�Pj���o��{@lH �Qc�Ƚr�W乱\Jर�_1)B�^+k4��qwnL����c��
"s�Ŀ1�����/tH���_+Ϻ�|����`�)�nI��ŕ��a�G���_|�/tꑎ��
�H���0�	�4����#��d���;�T���wQ�$�.��TZT�G%ΐ9���i�ap��m!Ҩ���,.�h��+�6̣���R:��7^%��1WV{����3���Z�Z=��l�8<Z��š'�Fcv�0؋�}��]f�j�3�-`Ud^��<H?�Y~v���Ipl4�F�4�Hi��ڡmT��<�(ʳ^�zB_��V:���ڋ�{0r����sW�S���!���ܤ�#���tX�
��v�jcjڭ8i5���K�lUq�mRxq���3C��IRL^Z=G#{�R•��֕�2d.T��Txؒ[|�1�\ӏњ�,��%�����:��T�=)����������H&�4�
!�ޑ4��ȷ��n��*jVf8tҨ{F�Z�8��K�:C�q�Xa	.b�֬B2�$.%���,kPKml���T�C��f�OK�2�>D7daJ`����u��k��u^�o�;�g
ED�o�ѨJSy�.�7�7\�׺uX���r��#_Ҿd҆֊-�
�0�Rq#�ݨ|D�tR�)]ty3�%��f���Ri��ܸ�9�T�k��6���F�|j͆�ݾ&�3��p`JMO7Z�X}���S�5�g^T��Z��4�8)}$>	Y���f�`W�x�8|A���+�Gݜ���5Vko����������q�~z�94��)�����gzmN/�?�JPFE0installation/framework/download/adapter/curl.php�0���X�OI�l���ʌs��8������U��a�m�ό�{x�-��UU�ۄ�Vg>`w����d�4�߾m�[荾\`�KZJh+��8�+���
n<�6M�S�R�	
���<B�V�>gQ��\�a�:Hͧo��@��|��ɣ����~��ۇ������;I���_��
z�q�a�a?�14�
�/"M򿌮ወ��B�Lo����P��z�t)D2�7����H�3�:|�9m"�p���"T�Q{x�� 3�ZF0;�z2���K��?��z�k�r�S�x0"
�/{7�(�7 WI(V"2����/��m6�SZK���`���Ȇ7�<�|N�l��
O}㶛
��h��Ի%c%�#�t���&I��>����$@~����L����u��[���N�\�++@Sn�L<Hm���3I�9y�f˽x�K�>֌p0$�'�
峁	-l� ���ry�E'��x��
C�]�l%L�"�ʋA,,�_�㏭D.i����/��,��b黕���b�fQz兡 [���<�X��T��x(9,!�9�b@���ˆu�!�QR�^@5�x�`|V���ZlUʢ�����y�#�@�{�s_�D�=�\�����͵bc�a�إ�W/��11Z�+�)G�Ȃ�\�+NF���ú2T��2�F�\D�Ai�'&Bh��'�Z�~�r&8�@f���
�.g���pqLPz����]'�D���J��I��(O�6(
6)�����h�-0�b�P!�u\k/�>H���a����D�@R� pfG�<�^��G@� �U�e̳N)bΑ��mT�u,�;�Ɇ�2��J��R�d��	Xb�1N��1�D�?�R�"9��h�݋�	[�R]t�D�p�;�����Y�js(��xV������hB�L���0�>=#5q��-����ki����K>�9�*d:>Iq*������	^���1����u�u�v+Y�z:�����/�N���h:鍮�J�O[������ߛ^�G?u5��6�\�}��š��||5��Oɑ��
�L��]����������q�+�����2�w:��]���i[u<>;�(��L�<��89hUs�e�R+?��+�g{�pEt`��w�i�]��_2i�)J�8� �A0��-�|��Y�
�n�v���)��½4
M�_4��z��.���~d��n���X�.�q+��Ҙd�XmR�3,���<.cB���O�����tP��������/s-�)�|GG����]�t��h8���Ɍdӗ��A��	���"�h�K�ܚ�O�]�˩�_|����Bj��se��7'�}^U�L��r;U�T���(�*#XF�N�k�d7�x��q>�c�%P�;~}�)�E�+"��"/�e὜w�B��
�˵f噮��<�VAFQ]`�S�+��.�{>����Av
ں�y��=+ ��$�{r^�[�D���*�e&c��O<���Z�|�����Y��̤����h�y|���\�Q�*�磹dy�x~���OF�6/���BWG��؋��f�ha�rv�#�^ܱQ`��s\�q���i�@�*%��g��;��!���}�[�����k��L!���X����R��
��I�����fm}���9"u�����(�%���Q��۟+���EM.a8��n��3Xb?��pjU�Z�_m�+��ᙏ���f]lEju��xcI2�gs�_U6$�$�!(��8kx_�s|�
�f��R���O�"���B��=ʋS�|DM��˪�tɒ�M�T�=%��6���ne����P�%�8C��*0{bE[U�\(�l�a��a4y��;��
��
lp3�6�pm����W��J��ʽہ��TJ��*F%��8GN{þ��?�1ӆ�6c/L�ӻ�0���CP+W��v�o���8���ŵP˰��j<5���JPFF1installation/framework/download/adapter/fopen.php����Wmo�6�l��k`Tr缶�Ц��6N4H�4�0��@K�ED����
��{��l%q�b�:A$����_ʴ�n�xѥ4<;>�&]������4��ª"'kUZ���"��J:NՍ4k)�Lh��ᵔcA�D�4+_���
6�Į�J"L�tkqQ.����>.�¸����zsog�%��8-2a��¡�)ʢ�
Cۍ�S�8�L�27�|vE�2�Zd�c�N��Ԇ�z9 ��!
��n7���$�����0�@�d���.SEI1ϳB$$QB�*��)]]�"G���>͵(K�q�1|74<�j�Z�EI�Z�'�w�cc��-�Y�ə�mK�$��DIJ�W�S�M�<vՊ��ȡ\�6�w;���l���R�B+������_m��,m͑������DdF���V�u��`�-��k.���lo�Ʉ�����D�sp�H�$��h*�S��®�IʠF�3�OM(|�D�[e�	������H�/��2i�u�?���J{�0p.G�΢:����C�L�x�L��RhPԱh�9�+A�	6��h.�DK[��I5���+��rYs�7u��T��N�p���5$jE$\�8(3���}9�Af�����9J�7 ���Ș0a	CrVڅc�T@�j%9�0�Ka,�ΏV*���'�:(��hF/MX�$C� �2%f���	G:��
h=)�\���ήI1.�.o.���.f�=$���\��*�hzN�B�d��{'�	��؉z ���U•��4���Z��
�a���Pry�e�4�3>�m�B�+��S�j����:E��oAcw9�87:JסPX������Z�[�C4L�-���\қ��$�sC"I��?�p�Ͱʹ�e�]�ż��9�U%o����R����Tsvot˒\�}�'��l69b��^�օf���s�qz�'�ېy1�>p)��4�uΚ���a�m�s���Է�ܩ��}Q[�'`�H����>��I����~۠�s+�Q�w?
�g�|��ϩ���bᒻ
�;Ajmt޵;2-��.��_O1|�v�L�7��Xi��MX����N�_+�d=4��&���@��ͧZc&����E�'QD[l�8���*�l闇K@�4p
?�[~���G�f3l�
-q��w����E~!�o`K�~]1\ߪ��߳�|��
�FxZ��3���c�O��_{J����_��DٯӬcz�8�pJ�ʨ�}��e�)�r�d�	�Dj���q�wx	g޼�������a4�����?����u�x�\���԰�Ы�Wk����l�XcG0�y���z�CQ�v:k�x�}'�_�	_n��s����k�yU���5k8���؞�ڤ�}��;��x��l;�A�)����%�0����7~����*�:rާ�;\����X��€�S�A�K����ng�_��w�,��e���^�nG��Z$��< �P�k@+4��q��ݽ�i��5�$�׻�/��~��k��i�Qq�JPFG2installation/framework/download/adapter/cacert.pemd�}���G��Ⱥ.
�1�0�����&4�cV
hAB�<�ւ5�B
�&P�k5�W����T��[�,#c��A���������D�ڸN>u�'��dt��N��H�(�������]ӧ8��O��5��n/�:�����z%��W���	D���D?� �~���Xy1~:�>��n�����n�n�_a]D?ܘ|My7S�1�O��&��ߘ�ɧ%�O�k�`::��)Y�!��$�a������c��?��1���n}O�_�:�y�EA�)L>��1�OE�iʓO͗��k��OӐ$����|���?��<�ח.���<$u��x��_�C���&�8I�W=��$z����8��"<GU���WQOE;����*3��)8>��O��U����8�����}헩�ŐD���^��̖b�?��?�?#��[������S7|ty_\N�A�'�����q�����0'���LS��E�N�7���Ut��WK��c�i���w8}{��W��w��;>���Uٵ�M��>�]�|tS�G��������/����)�0���'��$�8N�8� �FX_����PpGP�B
���	��y����,����!����~��x�P,/��hְDN�I��hQdb�����E��L�)����)X0}atO�u��ϑJ�,G���쬬�OB6K�
�W�
���2ա��b�xa)9��a4[o�`veR��g�(H�CD�t�]���?�+[�#��vC�1M1�E&�bCb
îJI.
CG�v��ξ�)\��;)���H�"+�S�j��qt�Ʈ��Dṫ��K�1X~��b��}��%6C�EV�c\x�c����ҏsߦ�d[($���7�at�"u�$Q�b��g�3�����O�t��U��ԋ™}�r㰺I\���6q��{���x;�j��5����憏`	��Y�MQ@���(��M��b^+}A�Zm^{�@y�Q-Z{T�~��r�r�*�)+4\�k��!p���L4[�9W�� ��6�S�<n�`��ockk�+�əB�A��-�(�iڼI�z"ȴX��˒��+Sކ��k��kV�dø��#�b`la����:TlC+�#8�Y��O ۭ�LTHՌ�%F�W���i��8Ws'3�X�|��NJ"�B����΋ξ:U����!G���Rɐ�pV(�s�Lw)���~l]����ٝ�;a�Je�3�
�X������c��P{oS��A>_�g1�wcnPz_ǖ^�Yo�B�gg�rX�7m�J(�b��C��L	x�^�a�6�/ڝ��(���tgnyz�=�����X䪦�j;�aP�bı�;LJ8���@y���m�<0����|Kȹ$�Ґ�)�\��N��3�KܧX/�U�P�ޯ��.�MJF�o˜@ޠϕ��:��³���5;��ۓƤ�@4C�%�uv��Q��±��>���4'4�@�n�a*���i/R3g2�m"�#�_?�3[J7��Q�+��*�{4�vL�W�L��C���`���j�����?��+�do����+|�ON�����İ�B��I�l��������3��<�*#��akl�C��c�`lNM�5���F���<�K�DA���n���[��F���rQ��E�_qW���f��fU��:�X���_a�H���k}W_��\���bݪ�;�u���ԥ�0��i��Ol��D:�FGo_1�b7��W@��E��Ϡm�ȻQeXH��@yP1�;`�2q?L��H�A??�UG��	!J�02Tu�~�]��[D���VY�8�\�]���1�]<��犯��րB+_�Y�n�ҋ{�ʾK�Kʬ��>�����>ϟ�f����u�j~�=�E�����*�1�2Y,#J,^2,�N��{�Qtv������q��׳����ygc^���]�Lj���B�w�:Y7J^B੾&|]ٽ��Ǔ(==�/0��L�Y�Q���Ɋ���1M7{A�P�$�!Ղ\Ac@n�|�JM����l/�2��v�#�����3�^֕wiTN�q�)�o_6�$P�q����@+��~�d�������o ��P���Q�#L�FsN�[dzLb�7<��g����9��en�CEdE�LbR ���Z��Ћ��|m��≮���B)��x��@qѿ�A�~��8��0o�`��[RP�}H�C��d��3�r�n;�I�O�S!��T�&���}=�.�D���P$�
K(-��NJ'A��D���B�盂����\��p�s�:4Q{�댮M�ku��k@f�杆`�k��F؋�m�E�R��a���f$�2%���\��g��[���z��)��:�e�S ��A�+�h��S%�n���K|%�gX��LF������g���,@�Fv��Z�a��'��g�3�e��5��x��Pt(�o�t9��.��t*����=E��$�U9��B��.���Q&��'af"���)��+Źf�m����
��9��O�&��d��%�_�M�O�$�����D8h�>.���v<�H�a��AH>08D��7�x`�t`F����_�i�$�TG�gxTLqɏώ�P�3����t�.@����D}pZ�B��&�A�YTe�EảM�>���jU��-���i�+[��W�O�[)��o��B�_����37�ɯ��g|��!R0�q6�3�����,�����P_�͝|�w���),��nC�@���fp0�n4)�L�zi��	|��?�x��o�kon�7�`�v&����#�n�`�/1&���&��+� k���-5v�/J�����ꭳ��gw�����^�t��q�Mv;�O8Kt��%ߨ��q{l���r|�\g���2�<�ףaN���βSPEC\�5���{V�+<B�Of��_�M�X�3Xz^S���8"�B��'Ǘ�ԛ�Z��Z54QX�ϑ�_�����ԈQ*��aID��[R��3�j�.-_V�t$��UA�@A��<����=4H*��މ��|�?!�E�/\'f?3oQ!�7�oL��c�3������j@}ћH���0�0V�:�X[T�F�E�q����s�9��
�X���W�x�tz��^5r �A�s;��S�nf�+�Ƀy�=��M=i����yB�l-�����b���y��\�0 3�8�|�/�+IO��T����jM�����-ҁ���ׄ��d��$�/b/ay3�0�����@���}f�v�/�%�l1߫Q.�5P�R��(�!I��	vR��>��R���p��g�,�7`���x�d� DT��S/[��Хܝ��P��+?������6��i|��m�K�%���V����;�˯i��G���\I�_�jg1�7J8��A7t}sͯX��Z+Y�8��Xy ��;��S}��<�LJƥ_4�7ƹ��x���]\2��+���#|���W�ŸR�/H
+�V��&�J���UK��%�ov��G�X��-��RC�Qj���Fyʁ���E���A����#�u��:�����7���`<�c��^��W�'z?l��P7>N�ߩ�^�l��Wӏ������>��8D��{0w�M�D��b��M
&�ߗ)�T��i�[C�f(�q�Q�X��2���*q��w�e�F����Cc�\qTڳ�;@/$CƓ(�%���-EQ�&#+�60�����x�#4��U�4X��R_zƑg�{���,]�ޡ��CY1�!�n"��!�A�!�'�r"G�za+M΁^����V�By����!į@��f]����T��8��-�Gxpf����Ǔ��#0�ԆzAU���	���2������}&P*0�/���O	�_A;�9��Z�]�����E>h�ޤ����>e����/$+1d��׏��jW�'�|�%:#	ʮonI��
�3��QFWiF��|+S�Z+��Dh����*n66ʼMAuMcY?����"��z�	
dI�:�{>�N���<$���,���"�,��hQ���`ީ0�Ξ����i�&s�	�=AF���Bߓmݮ}���4��h*�w����Q�C�w��^JK��ы��ƾ���Fv2n� �+8�uF��c�T�x�#]6�
���~�t鯉���h��<\`FoU����~kGt���9�۠����sL�E�x.-p��q^[��J���U\=_��4��Ι�X��t�`��\_��ZM=aԉ��I[�[��0y�BO����^�&<�̀p���y���sg��9vv��g��.�>�$�a�)������_J&���*�(��T����
곔:��	�}#fTP�w��?Еw��,�C��AݛC�T��-��f(�	ah����Ȝ�!>r�̨��;C�$Pj�{��
��E��
�.��'��G������ҜnI~2�����>S�*>p����Y.wȅ�"�b��_̮,�,�
s����
�}~&�b�01��1�
�ߛ�D��~+�
�V���oR��o8p���OJ���mj���uU
���*�%�s8��I�H��Sl���诀�.�e�4!ۻnp��<@C��.�"���V.���ԙ��c�f��T)�=A��AQJƽ�˭�(>�S!����#P@���.������	X�變�fJ&��T�*v{��nų&Qb�Z��g����h��ӱAw� b/Վk�}*�#a|cК�2���wؖ����jd|�[���&����X�G}���J��]�&���$�#��f�(�wX��jF�s��k�M,��Bێbo����UOG�y�/�N	r�e�t������%�,CR��%*I�c�L�-0b�Y��-���]��3߿��{g�h�s�-! ڰ2j�E}�`�t��X qy#��o��P�0��ף���������ͅWr�C�~�N�Y+�ܫ3���*[3
�m������HfDuЁ+��ʄ�2��1gP���C)X�.ɥ0�P���@�W���а��8�/�\��V���`����C�{
}��p�ء�4�Ajt��uzNu�Y�1�+�u��_|��ԢBs5	�#nr�E�.!�! ^<�L�m�YJ!���X�0�VB�[`_���Y�\h���[N�|�:
�a��۞��C�x�2��'26I9hX6O����0-���>�������s���zK?��)7���fޡ)����԰~����.R��8(�������_h�]�ߜ����f�E-�nP}4�E�}��n<�veW���	*I��j�.�z��G���o������N��o�'��?ry�g����y��U���AƯ��ġZ���.->����e���׍�T�3v�Қq[�Ǣ�+�;� _�9æ[����Bg�tN��e�qezD�x���
�&���('��9:��q�Z&�=?����ƓÅ���X��U��O�h�W3�����:�.�f���P3���R|-_O��������]P�H����p8h�'�د���
�xhsp1N{lDd1)Z�o@�ۓޥ(�t���YH�4dObu�5�"(1#�#IIu�2�߉V&B�i8%�mp��p��=`����Ž�^V�pb
���54.j�E���Z���]|��i�]� )^[`ѱ���>��v��1FS�Ѐ��`�����
	��[�b4a�#�4�ỹ���k9�\��3�r7��=]����]p�ʳ,o����m�Ȟ��%�����B�E�%���rf�m�ގ�� N�l���1�l����,�S�U��M�)u^��\.;/DŮ" �o�^�$���@Ӌ�	�Icw��@�E������,���$�W2�ٗ�9���K�e_&&��oL������T��I_ �9�g������.��K���vP����UpJկnh�X^��O�exwV=��B{
:��!�$Ȓ��������"�ս�΅z&�	Un�-�#�q_��&�-�ѧ�>�0�Ĕ�y�rA�R�:�-�c٦ܹ��;��g�:9�*8���4g���
�җ1�@���г�]�`f^�n�{����BA4Ϝ��{K��x{R����]���+؜3�n�IbL};��
<����K��Q��w�xJ%��r
���w��^��/�;�����;"��b�G�<!����a�n�wE�q�C����3����vO3q�b��LU]�����a٢��sp��<�������	�@���+� _v��/���>��?=D�iB��s��+�:Y��` �c�N|��|���͌�u_"4l�g˩�L�y��|��U��]�<|?i�t�`QО����1�s���w�o�>�
�%D�M�;IS
Z`�����%·>v��,���\��Iҡz��㋘N�\m�'���'�=()oY;'9?viVh%_�� �j��MS��5���?P��gj�A���E�*c���?��•�H{Өw�J.�K���^���q]��W�^
��@��aa#P�`�B�b�q�vO�U��L��*�}~B���睈ī��ɉ$G���j�|��Ķ�pG+J�f9]Orw�_���'�����	�2�Miw��F������4\��#���FY�\��R�v�7�a��|vH�I^�C.��U\�9�����;���p�g7g�:�ne�W)��� �F]3�\e�|�9Fl�2��5\X�6���e��1���_�K3�ES��\���q�>	��q�h�erQ��C'���r�R�ŋV�'���
ܴjJ�հC��GN��R�^��UKt���EwL���K�@k]o���,���˞ԁ�Xs�q/��׃�I�v�K٣�\N�
��a��_�3.��%��H����,��~��l���~r�M)��"]ܬ��@d8;w�G���'
y�1~�Oc&�
�V'm
�����2��}�w��݅:;���✋�`@�:�k�DY�d���O����+���(�w��\/����L��7j R���#@S�g�YF�����{���CE��e��H��.��d����ȿUFj�s�|�3��a���I�~A��8�f�>l=�!~[t��]��PJ���g�,��,��Z�=�φ�;K��k�!U&o���s���
5Z�T�=��u^1�.����	%rE��Z��d��7\<�s<�gU���h'�/V�od�#���x��A�r�D���P_�v�W�?����*���A_�ݹ����)�'mY��P��p-�>F�|�V�>蛕 W��ӷ��C�?p�[���(����Ù��r�f��)�����@3p���\a�� (���hΞ(C;�Ԇ�K��Z	]��Q�IC
]N#����iWj��&ҏ����Kc[��
���ٔ3U�O�/�e�NA*�����k/R"f��t��z��g�q$q=v˵8�k�m6c��v���hnh�y�k�¨q�dXH�}��0�E���n�A�x��!��#��	C�U�M�J�Tbx^�^F��&fso�n�������ת��9�a�a�,&|e<�]��%�q�B��
_�������چ?ۗpΆ�<oa�U�R4��Q�Ku�ͭ�{D
V!M���YQ��;���̡�`�H�
��x�M�	��H�������+�{ȥ���z���
�3�g���K	�h`f��IDw�w4Kw�@]�}o�Ԉ�z`�%a�(�v��4�(�� ����qJ���	�^���ɣQ���HuVsK�C][C�|������
��c��6kv?n�S�T�q�q�/�e*M�����+��O���ǔ�=;ujmyA����5��V�����
�k�V�d��|B��B~:��)~i�����૳X(��{���F���"A�=�����[)�x���<|��
;%?>G��o�������^����m�g����l��2*�.,p�HU}U�O�hUt�m��|�1���,�?N�������wL����~|<�INp��#�D���ȩ�^|�I//@4��P��ざ�K��Mx0	�%��h��cxx���<O4��S�����(���2Q�xfiG��,t4򉑻΃��*�4��Eg�cbqj�\pլ�[έ`���rl�
SM=cӮ0�;��gc�,`x&��>YA�K��&��w���M�g�n%�	�Ny���|�������s<�J�w#�̛���F4Y�6�U�
���e;8BOTk���\�|j��c2<%?+���Nq��
XM�:�F�5>>��Xv9��CRS$O��N�@B�C��Ov
��e���C\��߻�=T�Z+0�Kg��6T���E��XN8����=���}W�>��_L�.{�B�Ş%��M��p(Z`�8֚�:��P<�^�|��
��WkX�$Ni!T���|-`ް!η���*��1�������386�v+S>�&���:j�v�PO}j=<S��y�b�����@[�J�k�g����j5�p���J��Z-��Y�[.��3}(Z�XD�P�G�ѵڕ1SG���2ͦK73|��5L'��à#�b��0 ���
�Y1��I~�z�E�Z�\e��J�U��U��2|
�Z���:����v����%d��ָf��C����O��}b�8�>�u0���?�Ki���{��c%D�?�9���h�Λ��,��A�
�}g�s�ʋ�5*f˅p;ޢkT�I1!���Fn_�7��;��CG�v�*?�-�w+�=�u���<gt�~$B�P�[�Ѫ�ׯaI�_3���?�\��<B�L)�NH
�Kw�ۅ�~��f�c.U<�N��g��=͏X�p��'k����bw>{����O��ɻ�yޒ�<�
�g���b���E�	9�U9%�1 /vl��v�����_�8�$��T�ɷ��<������^5�ϰ��sWf4��1t�d���Q�Oђ�B��yH���qsj�4��M������Co�����Ҷ�vC�x���$^�)�0���o�+�A���`�I� ��D�x�,����Ù��l�t'���W�
6T�����=_��Ol�=<�����,:b~�V�[U�	���j��p~��.���Pկ���;�I�F�Q�}A�&�o��v�������G��XR�B.; f�-�$_/���Wvr
ݴ'w*7��B=b)�w��KH��zL��
V��i�E!(�z�3���
��Zq2�w͛^��Р|H��p��6"R�eX�Vt�[J���,*nϸ�7V�5�n�At�O��e��O��$E����=�%��;�ͽ����D^��+�^�I��\1|c��	fv?~��~�R<�ʹ�W�a�����y$��H22��\�,�va�b���Г�x}��hA���`�+5Om�"����ɤ.�Yx�C`�����i���_��_�9���_�y��ZK�ɕ�#���ݵ9�������um��]�!��a��{��Ȉ��;_I���"v��q�3I����:ெ�OF���j�Ƕɾ�o�w\� ���(cy�|C���P\�\1�r�^��]0_� �*ZO���dU�����J��q�k	����;'�%�͌8@�܎G�JR�^�*��� Ѣ�kB�S���$ð�-��Շ,j)��b�yH�'�33����"��11�'��_ǰ�����7f���i��}�AΑ�^K�B��S�ΈP�P���%�{u_���x��j� �]B��k���{Xc���JB���1���Z��&6����HH�%~IH0қx����~.�ۑ�@f,ӡw���1��<?.��O`��F�{��<�i��*SR";�^Ⱦ����{�[�_L���Y‡�N:��3�4e|�†C8���[��;���fys~��O1��m�'��1U��#��ݍ�!�E�%}����4#�ELv%N��`r�\�
���;y1���"��~�v���ZۧVV�������1�3��*ֳ
r��gm<���2�sK�\<,�3>������ˇ��#6�k�l�T����j���8I��Y��Sw�[�X��ǣLj���D���E�;�L���˯wL�#�]%�9�@����}M=�Zzj��k�́%�iV��n��laPt;�~������ܦ��&����79�1���`��ה��?�x�Ȋw�'r_C�?)4������E�茖f��zƌ�1���gr�~eY��,u��*_���^��g{�o�,�]�Ķ���}>�͊�/��}�fMl����!o��90�f���,���G��g	���������l�t�?0�LL��0V#2/\/qvz�f\"�7��lia�؍�3�^��rjK�ﲻ�D�VL[Jg�!�{u�nR[�go�wo��=A���^��	`7B�n�C8�V8E=_M:c.�A3���br�G&;D�̔�݇�w.���'4�/C�r�\�\7Q��t�s��2mp�e���j䣎e]t�C}�Dz6̡E�d��:+˅I3����
�����v:��虴<+rl����*�3��!���o�	~�gY��\�~�y_��[y� ��*O�)O��	8�o3!�rV����~��+�����x�O�~l5�W��]�_��<]5u�����35���:vo��4oP�&Π����7�Rk���Z=LU��9W���xvƩw׶�)o3�Jӥ��Z�JŒ����y���'�p���fȕk3Tc�"J���\�)���5����æ�JI�
�;X/��Wy
ѐ?5F���Tk=���0Ap
1ݿ���W5��t��Og���5��f�-b�j��˅�c��-��W�1��JRo%�ԁ��Bc�����+�T�Π�6@���2��#�%�����=e='��r��X�o�ŀ�����;|`�7���̜9=E��� �� ��rO1�
�߃����+�������9��K�ю�;��K�³�H���6�/)P�7{k��E_�+�oX���}t�0;�"C&_�/8�`8p�aI���-���>��UR��9�h9��CN�7���i�nwI�-�՗\��z�h�QH_k���3+_���)�ⓤ�J������ִ/�Lj��:��渓&8b���C�Z0�`�g�әJ����1�"=z�f.�c�J�^H��'���J�Ϥ��{�S��!^=�����=	��Ol%z�l?.:�˧�Y�Jj�2D�q�g��X�h�Ԃq>�b�T*�[�(�y.�`Ѡl?/1�L�ig4��K�d�ɘ;�,�H�VJE�17��5
/'����q*+E��/�y����UV���r�I�U'4,yj���^�����{�/����#�sߟ9.��*�H�{�]��i�ؖ%��n�Cv0�G%v���q8����y�(*�GIk�
�>��F绽���)Ճ)��5�{�?�w#�ĵs��5v5��es��xN|�zM�.F��8S�#f:���Q�x��(q����"�� >�t��>�Qa2h����hP*�m���6T�}��M���*Y�G�d=H7��YF�����9��a��^V>�=73Q�Q��ʻ�%�=��)�+�>�҅�	�Bp3Dc��>4$kQ!�}>P�vW��]'�ѿ��B�埉n�F�'�;T����>������IM'������6T^���Ё��&��5~k��D��C�C�흨���a�o	��W��%�HY�o|��_%�Z��U�d���P3w��E]������G�����rP��k��G��>R3��&����*��ޜ��(�0�<��E`m��z�N�mw�ɑ#����UN�����VS�5X�d�wu��q�Y����;�	h�e?(�Z=�rz���U��{~�j�tR#�&��5-��J甓β�UN�
�j�U�\v��M�/u�F��?ہI�����Y8�ޚC�+������I�MB��������S���U �u�x ��ƭ �_�xJ|�E�r)�6&��l3�i^Q�9w����1z�ۓ)�����ڳ�δ ���>Tgv\��ʶU��kΨZ�)@�/S���9e���s�	��MO�;�|�O���u,.��P�s_�οH��IF|<5��}���ME;EoM��l�+R�+�"�Ϻ�����̺P;Պb��*�Y�D��(�bQ֢�Sp�
MaTD�7��G��T��f��m�7�bP���/P��&�)� S�ܴ��
o�.׀�I��I��G��/���!�{��:�j��{{A7���@��#Б��d��t<�r�ɷ�Lw��,D�+|6�㊧`f�m��mŘ@��*��{�úc���ʧ�,RQ���<%3n;&�IQ"5�OZ�bq�)��Ǐ�|�63�������������ʼn+�%��D
�zT��Wo������&��w,Ҋ�z���E
u;�.� ���u��
����fZJ�������a?`�W�]a�৶�w�i��(l$��>#d9A1��r�0R&>v�IN"m��.?|���U�?�jƒ��z��X1��z:��U���h�8�$�ݞW�Ih�����f?�	>_/��$��e�Uwג=y�Kҥq������E��tv�M^�(e�f�p�~���)�� `4P�$۪�ߟ,��uA�x��ye�-Ry�NX�!n�o��/*��l�)�C�z��;ihgw<S��g��P���F�#|.�61J�*X�䩂|q�c�T�O6i�k0���iO��=�R�b(O����l�S�'qHo��]�~vZ_9{��u�b�y>�Cj��6L,��[�mun�ɴ����L8��Ys6���q��X'yP�O
�跗�p��p����vS�f>��SN?��/�B#�\��㕴1P�%ҁ𦌻��:]���-�1��zG�8�O=,y�f��-�pQm�;D�Ut�!y1������0m�IEN_�H�
R��Cd=+f'u4i�Y5�d{��Y�,bQ6�b�܋C� ��zE��V�l&9<{�����@�:y��U�E%~ Ja$��a[�*�H 	L�t��U�0C�9<�_�SBl��z�<ks�7�G�[b����������͹�O��8��w2�g�����S�����Ⱦ3��n�*����S�ξ5��Ց#�e��`��#�4��k�+ #R��<�c�W������ߛ���dL?��Np3���B"y�X\:�c.�ټ��%�)��`�k����0�S�/4v��l�v��f�j�'�&z7�_dE5+nB�"�%��^�%��
u,#E\��p� �4H9/�i9��W��[�%����
�(��P��,	���Mi~Z��4.�;��E��@�S��4�R3���߮��"�<��<�x�/�%�����u�f�n?��r)qB
�mfc�¤��I�9}L"���Ws:nK�F~��6�I�!��sp�ܖ�tBJ���%H
1+���z/�;�\)pnǩ�	�8}?���yZ5�t̶I0�0*Ŏ�
�?a���l������^4�y֚izN�`�AV̋!�g�7��)�G�[5�)p���Tط��X��?��Ѝ\jP;�x[Q�ؾ�c�NԈ��gb���%f�>�E���6(���#�B�k9B�;ј[�{�_a����:��1�����l�e��XT5Bp�;�r..?K`.�y���<���S�)�&=�RcҠ������UU��f��z���~*�=�`���F�U���-�G��ٖ!�"�㯳y~.�f�M��~���]hš�x�����ڇ��.�>�-��En�E��.��G ��?���[���.?X�~��RBE�4B��d[���䪞b-
{�ĝ]p�WsCGQ@���tS��U8t�+�2�,4�*�@��kf���bgҔ��/,�P�/|:�{	Ϻ�*4���'�'	�8ongꐕ8Gg�	�*�ND���$�Ji�qŭ"�ڐ<�:9�tH�\�zIpQ
l���=!B��&�~��*�xf��m�FNZ�ܭ9a�����cj}��+���~
�)�ϼ�$�vOျ]�f�.O�)�V�7:��~e�J@��P�{tsw=�ܢ�&�r�I�����^�<^�������h`�̲k�\J��<��z1㎟z��I�)�B��Q6F38-����W,�HJGe#v'o���t*�vc�|�^^�;���.%�7̰
��v�->}O�!5��*�\��<%{�!f�S��A��]��|��Fxh�u�r��䭴T��H!9�^E�o" Jj�=c�X��;ܗ�X�����?t��8`C+�����J��&T�a���!��pA3o���w��#QP��<������GfCg�%1���C�:�
�����:�]���U�?�̟�� ��.w>K�,�;�J���=�B���>h*�	�a�8��	op(W�~6�ޕ��2X�iu�L=kO�xBp@�~:Lh4�<�
Z�:��۲]��Y�9#i�0+=��Jl�3:S��K{����#S �2�<��)BX%.!�1
R
�F�����
A��A����3�<i�3��^����Hi*�n��<S+p~�m���d���1a_�K=h�b>�v/�˲Lƺ����8��,�A�0B���-.��F},@�T/�yM��v.6dO�%�J��?�S$Q�]�y��؅�P��zBc~$
�?��H�������(1;,Ӄs}`=�=/��_R�R^�p�v׊u#&��9��Mu�=����k�m��*���'��b0lj�0^�ʝ(|�=�=kJ�`I�P��'>թ��%Aw3��PHFl�a��ݔ�S�~�tN��!�jy�:�щ�o"��$���sV5��\�K���+��-��钪{R�C
�m�̼��n]�QA~1�y�U�@�$��}��/�]�������l�i�}�M�O��ȅ;�=����N�� ���:~M��7;D�W%��%�Z�T����;�f�v�j]`�ϩ�cl����Ov�� �D�>�v�>�vb1�!!���fٷ�i�����zPs�|V�h�Z���|�1�ae�~��ס˹Ξ>`N���u�Ѷp\i�P�uZ���9��6{�&��R�0��k���3���eң<�W%߮01wx�[8Zk`�O�!��<��Q�?D�H��6�^m��KCp��C�fφ1g��.�����w1�����jޛR���\^�s)���(Ԍx����a��U������½��&��GzYh��D%�u��5/�J�C���A��mF(��N<dPlڠ_e^�Y��U���@�����U���	����Q�юsx
���k-�j�7��s�G���GY�UH�)���bN/o07w�9�b�s+::~]T�s�&�籓}G'��y%�S��/9�ך�y6d�i���iImf��!w�ތ��?՚�ۚ�G� FD(��ɂ�ܓ���ͦ��Q��zdF�qbh%?���¤�2Ԑ�x��3���G�D�$RnM?ug��d�^�k����,�@�W���+��C���Z5V�h���n{o�N*�m�YRK�"�*jI��'�F��.���Sh��ɹ���I(����؅`��9�6���!�PCd��*���/��S��\K��m�`� ���A��wO���y�X�I�{���T13��!�f
�/埗�r�·Ŀ�)b���ʚ�P�����~��*A���|������Q��H�.�/hR�-���/Q�
TJ��ݖժ�o'X)%�����"�+�#�: �:CϪy�~u�_1C�v��%7��
xL!����>1jEB�r_%b���\m�n)!%;$�N�җ��'syM��*�+1gN�%ԁ�i\%��c�ڼ�B�t�V��`
lj��H+Uj��+s�H*[��96D��'JZ((�*����@<T��s�3=�(�v=~�OsWV+
�������Q�gD�y���/Ez 0<y�;/�J����dP�A�L�n]Fn��۽xPH��%���v|�b�<Ht��l_K2��g�*�qoK�g~˪���7d���R$*�
Q�|�c.�>6�Կfս�
/��l��vy�1�.��޾��p�±�^"���?�SY9���zF$��2�䳜L#����KX@�6<���M��.,��������O��u��ЅR�E���0��U�>*�qj���?�W�̆_�Ka�����>o�{j���h��Cy�<�vG�'�F�����Ƨq����7�`U���N�{C�	��3���Ig@hO�q_���+T�Y4�O"��b�T��O��Z�~�T=����H�p�ط���*8���5ҫ�4�:Xy@�H���[��s>h��3���n�5|W����z�ے��Hn����Z���1��.�_�eo3����[{�@�Qr<d
�UX�(��)�ʡ֯*���p��p(�4
$T4�?W�v��
�B��-�`�_��`9�-��[x�Q���`���5�����V�>���U�W�[�WJ1�N�Wv�u�Wv�����~���]��V����G�IU�_�/�}(��r��eë��C��7�%	n�ວ�K�3���+_�tqsh��K�$K�q�@teC�ي0��cм�n�9��u1�s�bX����3�[���*Hx)IȖ��������{I^�$� ^lx6:���^c��2��KЄ��A�k�W�k�	�'=i�Zn�+�א��.���8��VH�̿8�)4��?���OI���|���
�`�B���i�c�:�ہ��ש�Y�.7��V
Q��|vY+´�� �
�[9�XC򏡼��j��V������^1A�{� ��,J�7|e?�>c��~#�̻X0���o��0��D������5G�n�|�������gL�"i�^��6!�Kx��k�j}8K���pR�3��u��	W*D3�Lf�,^�+}4��N�#9�4A���{�Fa�j�A�f�|�KCއr����/\�I�׼����3 @sW�3`��ҍ"_g����)*'�^�+U��׸�x�Q.)�f\P�9����.9fu���D�ȧ�end����;j�N�vX�;�����02�����cqL���F��C5L�n�j)V*p�F\��{f�\U*)ׂ���߸��y�U�ڡc�����,M�7�i�+�@o�����!��lD2�(�"���5�V�7*ˎ�Qj�7u�i*�����_��Cy��9���7y���w+qd����)G�ŢՇ4������3�]S|��wM�=C���S|�/oK���2]'�L-ȃ��8�QCs��'��M��-t�E�1�Nջ�N���؁R��Y�X�	In��f<v���+�'(E�q#�\��(��9��3��a����tr��r�-��|>��Ǽ(
�Cj����v�֊!�Xk%�?;��Dž���;ň,Y�a�ܐ��	-������n�'Ӥz��]B�|����[��M�C�]��O�$mBR�f�IO��E-bZC<�LB���	5eh��a�_��Xf:�!S��?���]���w7/�|��=�[��{����(F�)�7���ע�d�9I\��Z��V�E�鯤��/vI�K�H��Eu>��S�d�4j�dt�a!b���_�w�{�k�n6��V1����`7Y~'���\N��H)�i��$,�{�ʼ[�W/t�5�� �B-Nu��}��I��n���ݾ	��[�GwM"}pN�`m�B��k��[�|�[�-\7�:l����c���k��T::��t�ӣ�K���a�2����_Eti6�oH��s��[
�-J�!��!��\�W���`�Ȟ,ئ����36$y���n%�ykT�w���Ƭ2�6iq)�5�����>|VRFsKq(ץ�z���.��4�pY���[���9�V�m�s&l��pD�a�.>��mƁ����:��/�k7�����W�?]�YV��i?V�Y���E��G�4o�<b�k�#���~�%�
�u%�Z֟缃�?�I�|�!��`Sp
�H4��a�k:xm7w���6�3��m�����	�9�L�	"�XL.T+�{�:Vc�S��k�4
0�����
�p߳��%Oq�,����*��~wʄ�
	5�/�X����Kps���iO�yb�m*{$b��p�<�=�˜$��R�W�PV�5|�_&Po:$�^�rvԢ�	�.���ÂN	kjS!�g�wr
:'��ng}�M��>Ε0'���ӣ�hץ��>^'˗�"�*�����VK2�1��t�o��p)$w���vmm�L~6e��Ζǚ�zzF��96q�l����o"O1ᆎA}]6�}IlRD��M�]��K$������3�[��ìY�)W߷�F�CJ�2��,������	���9���~���N%�X2K0*�d��B!<˒�%���<#�İ��}�tHX0*�_�I@@�j�ܮ�V�ma�L�9G
�懴����c�M�¥��P5ė�b�)�<"S�
��dP��9��'c�zp�Ė̋R�jĔhCl�r��[���nr�oT�>=���>[0'��۴+���N٬ ��,��̼�ơ8FG�ۉ��Rk���������=(��Ma-��Km*�#�DȢ��O�a��RE4(���:=U�vyBK��q�|<���,o��`�*ĖXJ��yz��Y�q��Ze�)��RN~�}VH�3"�c�������4%���Z'����Ѣiv�v�|�hn7wp�%�#��Lʉ�#�;w�Q�����v�����s\�T��K��[b$r��=��#F�_��^�I�5���bw�“��I_6[���Iޕ6�Z�Z6\��BY���Oxd6;����j�k��
�j���B�<`m<ݽ<��vc0���m;�L���eB-�ӣZ<�h}
R��W�׭�M�Mv�T����C�#��4[�)��y��A%S8*d4�VH��b��ê>>��$L�
q���7�w�G���6:�ճ~UfA�=��:�`��bQ���\��̟����GF<�FOr!�w���@��RO(#=0��S}�{�srl3:���{�H���^s
��I0��UI���[3��`��s}�ZBɝA��*�Gۄ��=}ܫ��;�)_<m
� :����i�o�p�]��։�㲃U��>f�J�+�ܥ��ق���NG�^�Y���(F��K��0����T�^�@��F��F�9�S/��Z��Y��`;��M�J�`=�*qٰw@}�¡�{�2�&�?_�:�l��S�x���W�w�/��ip�����OG�)�ҝ=�4���ث��5}c`�^��'�R3���q�¯~&B�q�\!q��&]�7��@��˦:XAD{e�U���`�[��_��'�N"�簵�*�Ev�T^��K��j�KOò��+����D+�)^�V9(V\��r���{5�!���Z���w�8�;�C��4ޛ	�T��#1Z!�?��Vn�x�M!�n����s�NcsBc�%�L��KD�P��A��X�����}A���&iH�Z��͊>�lY���^w���~�b����'��*�	(�y��	�ȫ�M��K�M�M�o*/�ǵ$�k�k�I�Jw�\_����$��`-X�w��WE�H[�T��̮���C�[�׏�#>gQ��gw���|��u'G��q�~jS�o����L����:�� �����v��נ�i*=�
�=����܄�|�f<I��6S/�Pz��0@ϒԚӫ
_.�^d*�3+�K��F��H��u%w��$Hq�؈=t�\GAoE�|��,q	��C)�^��)f�+7��z�)vg&Pᕮ��S	�a�O=uZ��}j�G���\�����tț֣ۂ�r�ĥ8��|��N�їZ�d�.�y83�j��j{�D�@b�����^ބ�&H�y~ �e��э*����c�l(�������_Zi��6����;V7�&��S��܄#O`�Ir����G��D]܍�R��%�J�~b'DYN��H覩[�����*�8�� �nI�)�~L���l�ŪP�r���j�q�3.J
�3#b����	F`.\��.>�f뉫��x�5�
3�{]� Agc��x�C�fi��q j�I�M�����P.mJ4Y�@1�4�	�j��̔U2h��i�Ii��"�0��%���R����~��-n6PlU�~YzVS�&�!���<y\�����	<�s�e�	|�!�Z%^��V�dp��o̟ᖚLrU��!h�O��s��wR���?���_��������?ۿw����r�
?�y�M���t��<��:�or����ٸ|9DP�[��T!���
�bu̮���	��HPf�#^Ͻ�K�/8��a[��U�ED:�EI��s��MS����4Z�Z<QE����$���5?g�U�1�F��]?��=�}��X��1�9l${�Q�Ƚ/�%M�?��q":A	�yn�ߧ�Wނ!W
�����ة�5P�I�(�F�]lB�s1,���W�=�޳��f��w�-nժZ��D"���fv�Z�����{�
����w�'�ɕ6��ɡa1]j�5F���H(��O�J=o�[��^��P�`��5H�i�w��)ܮ�4+�O�9;g�����,�Y����K��h,�x�I�,�,�<�\����կ�\J
|?q=s>����C������3�  6#�PǕsPMj�.#�!���sA�秗ҼY��z���+���yM���E9^�t�S}��%���c��B�p�Ӆ7\��7�7�3�o�>�_C�#a�)iN6��%�}
m�$ޫ'�n�mH�o�䭐;�^�4��;D�K%�����T���n��mu��J�u��3��ĉ��ߝ�#ԻM�K����_��NgŊT��Xs�
�X73��7�6�8�Ӛ-�'(���	�ա�ʄ+����UY��5�7i�Y9��֑,���m�qRdEc+E
��p'nq�'/LGn�|�3�g�:�"2����i <�:������@�}���HF�f�\�v��2�:��Sv���g>y��t�a�%��<��-m@=��u&g�v�uG\Y��o,����JFlYm��X��ڽ�Gɣ�yJ�VH
:HV�S�P����-X�'o]���G��-�7.'R�#w�m�I��Tdf�7��n�'�z?!��f~��@�J�
�x.�+��w�f�P��h�kݗ�&x��t�6���>�0g��ذ��_�;~lS��'�G�_*��n��Ay��"�߉�o5��e�9R?����|ɮz�e3j|��@�J�S�,�t����j+*4(5E���3����'+L��\2�
��@[*.��µ1��"^s��^�Ym���R�)��o�S�M&�H�΄�U�
3�6޷�Vl9gi�$�_^���~:#��2<�_��NWL�;�.��?�:��6�g��`$V��
�(�,�_�fv��#���7��v!צt^�8��B�^}{[U�#��-�Jĸ�1�W�*ýiX�_#�e�YI�8�Zk�Qy/&{��]a	w[��#�_�S����Eg~J�=�u�����̕������l�����������G��ŗ�*V+k`�_n�9�1^x!F�-=�^qgf�y4�6�0S�1M[,���a�4t��(7�q0�qf�������:��p)�\`v4��A�zD]��N�88��:��0�����H�e�f' �,��&9�0i;��;�d��R�	����z-!�zq��%���� l����u��<G��|�'-�{���!Ⴧ��ו����Rp��q͝P�T1!a*��:K���%ը�K�vI�Be�x��)�ɳ��0��ЍI�)�s?����|X$��at���]�	E:鋡��*L��
_����%i��6�{�4�C<�z���S����Gޞl�{��Ζ=��M�N��F'���.ք U�CX�a����}GE+�b�߅ϑ��hz_g�;��uv��cz���,Z��g��'��L��{�4~���H[�$���>Y��.9���^߂��r1�uL[S^ ��~��(l��ҥݹ�Wx{
��I�Y�{E�O#:g��	�����,�[5?P;�C�2��&h'R�s�G+?g��
x���)=-��������iuM�,�x�ڋ�v�ʵ�MQe�|��@�|b��k�y��A���C�8VXH��
	k<L!�V{M�q4U�|DIԜ��yں��DسO�%�_�(�`�y�6�yyA������,C��]�>zĒ�k�zuW��2i-��gsF0`~������
?Se�8�43���Ɵ�c�E_֝��Я6��iFu,���2"�i;/�y;��v���hPc�^����5o�݆8�'^}a�w��~�����3����{���~�$�f� �5�����U�2���1�[�{D~û\�ѝ�6�9O'����v;���b:�C���E��r��ic��x�NK��$&�nR���Qa�H{��P��j]�����lbP�AM"�/|o`�za`��M�b�KBޑ�M�RC��Z�p/�)����b��r�&AQ!�BT��/u�l�X򣷟ä�Tg-��aӟ3S�����_������]Z��VZS�ȏJtr������{��.+eU�΀�p�W���M��RYٝ4����՗z��GA��>S�}|��͡Z��E������c[I)_Jr���0Y-�7��Ce�2���w���~{O����>;���π��'�ז:�)�j���dv	ح(���l�N@!�W#���r����J�2O\�Uan?G%��%T�
LfH�)����?��g�9����ʄD�5N��/�HN��!h��V�RStڢ�quhGF�MO���^2��V5����9�7�00�yN���ۈ`e���
�N}��6Aj"�
��cV_vn���6҇�.�cu��R�p'�_�i|Y�gqxK�����Kd��`�����4�c(B&���H�>7�|a�=s��}� |5L�p0�6
��я���`�7�x^L��ɕ]
��-(�K���C%��Lڷᴑ�L`�m���r��۱,�FF���M,78Iï�,"V}�#8�eטM�2`l�/K3"M��ކ+���h_�	�����X����{���n�˵���%Xj�K�H���6y�ލ�f!��$S�	b�0�����p�
��Q�A1E�
�G�=��G�i�]JY/&:_��
��ޫ
�W�a��\.�+�3�;�%b�F��P�|�$Ѩ�W\�f^1��m|�Թ���e���8��̖��`A�@X�
�>a��٧�\�H���=i��_Q����o�+eqs_|\�vvehm��w:�x�$�sgשּׂP�� �tzΪ)N�c��f
]ո�b���ܯ/X��;�f��%�n��x�򛺋�[�x翺1�Ww��c�:��d�1+>�h�q��#14,i���r�2��:�{�o��Y	$9Ř�GO}4�"���֞B+I�
��@[㬩5�75v�O�-��1A�B�^R�H�
q�e��G��
&mN�zq.ȍgx�j�}������P�_
�0��H4*9>�`e��\�?$=p�W���>j���6ק��4�yao8�U��W�[�������!
Y�ϣ�l�s]L��uIv�ּ-3��},�:$�fE�EU�SBJ������a�x�~�۹��5��r�ʼn5�\��ÉԳUh"��"�l:�ܥ��.ve���f;��APe�"���b_�g�N�0��5K}?�^}�Ԩ\4�6��
��������3��M�J5�G]1n�Ջk�L������'�؅&ƀ9͉h\�x�Qi�&�ɗ}��<��>Q�Y/`ܳ/&��=�8A�H�h�<��m(���|�5l���DZH��SM“���P'�d�݉�{t�:{�$uә���p{*,�3������IPr��撼(;��A�^ؤ��>��"
���-_�mdK��/�!����a{�H﬑��*�>tNPX���:?m�7_`L���񕻂(��Ȏ����k���a\.;0�Γ꓂�b�&�j)f����NQ��g�h�<���3�,T�|
_�.W[�Ž��k��w�e��ȏ�3��܏B(��v��#�G�����k��xF��w�¹L�p�d~�ȉ����w|	����=��@n^\�/;Oy�z��F=��!z�Za�_-ݰ�V�c�lWQ�.���9t�lC"
���m���p�Ej��ޘ>���ea���<ע}l�*�\K�՜�t5��.Ґ���I�+��y�>��:��M��t��}�$�r��x.�wrv
;�<]^BIM4"`��(�s6X�WzA'ƅ���y��^Ṋ��T�H_�a�A+�'�ZslNj�X������}K�*����ls��w�Tn�I��<
�"<�<�dߓ9ǰ\�ӈ���_ݭpbpI�Wr��*�5	����ƨb@��t<w	�G<�S�y,T�?g�n��L�0
�Rh���ӫt-�RS!�/6�/�������P�Y�nD
�t�m1���z�[��ٻS��FZ��o���H\J,x�|4�ja
��:Xl�i�%-1RȬ��<��r���U3���U����T۾��t�VS�i]�F
ܳ���;h��ף�y�ꪙ�l�}x�j��t�'�,
9�Dc9qo��Lǚ��p�o�;�R��P�����SU�_�6~�F�_�e>��wf@��v��6�w, ��Z-C�#��C�^���*a��_�V��A��s���U(k�C��w��Ā��VM�]�
�\�E�U��4�[2O��y�MEv����q |�b���_3P{�:ju�y�OY�B~>��s��GL_T��3&�1���b���(��4@�σ�����TW ���#[{�ycX<�DV�4�Z�Α�-}D��֓a���]�F�>Q��E��U��J���#��]qc����\�,�Y�/=��d��58=o�"w�)�����9�q��e�%�b��Ƥ
��X���v��˩5�k61%Nv�O��b U���B6n��t2$��ʤJz�u�+|�3��n�=�:� iK�E����	!���8�Rj@%%WZxcb��V�1)��䈖�0R'O�ϲ{�K������v0-.
�`G��4@���J~H@��z��[_�P6�ކ�s��* ���Ai�p݈�R�-��p.�������ղ�	&t_�{,����4�9�)A�;\�q�"�4a��`�fL��4D����L�ٽ�Zh�U�4�J�#j?Z�%��*��>k�Dmh2q��Ы�T����֤	��;��Ζ���{�=P�|�1��b��[�,�����9Sp������^Ɯ}u���oI	]���BWK���3w
�1j�dLR��K�{��s�"s�s�>�9%Ĥ�c�H��=�f_o�SD_;�;��;��m�w��_�4����K�.�]8�Wg۽����l;������������
���ۦ��_�2�Պyn;FY������!O��t~�L[⢐_�T��E��_���82-��Jt�+9p3�b���>o	s.���4���e�
��tn"]�
%keC�w�wf��{,���q^�.��Y����0�(�f'�O���J�A���;��C�柱we�s�DuD�i���v�L�`��8��j���"��h+�h�y訊�<��2�����+FJy+�&���z�� ��&:4�����\D�����)�[�_b5��$�Qp�
���x�ν#��8���8���F�[F�RKw����Ԟ@�m@�t��Z�!Q
�.�崤՝�GA�_q��������*@]ߺ.�
�?�q�pӮ�E�k��4��έ֎3�~�خ��⡷tw+�Q�ѫe<��L��k���ț����^�.rq�q�&z���Hƴv�1�A�,�-�Ş���,�Ԇ5�:�GeW��T�p�OXg/�u�J1uO�k{���p�s��V�s�)

��I9�n�x ��튦k��p����R|H��
��^/�m�:�F���1P��V��!���V����|]�Y�]�����ҘHj��+[�y�)�`S[#��3����4�Ci{i�ۂ��d��(�}������}Lvx�gho~Qn�wЮ�$�ڕ�����+�5��������)��C�������#̿ì���:ʯs�w���0_�mԟ'�R!���I+8m���c׌��^�{j�H�x�GT�w+�G���,������u4lc2��ɣ���:���P4����;/8��a?�
�>q��^A9y�X�|�;I]l�����$����nݬ�`*kn��##e2/�D��Ό�iH{�����)h'�:��; K|ӿ�$7r)�}���>^*�㌮�
A��J��7W�m�Wz�	�f���C�.S�7Jk;�I��Q1��B�H��\t���QlS�ڴc5r��
�����Қ���I��r������y�w�D�Q��m��M�o�.X��0�pgO��&J���� 80.�¼��w�`��~�q1cak���'����7�]�=O�����t�,��kR��?�s?kc�|dkV�/���Oh.�0�����mﰣ���\J\����u�Cv:��ޯe$^�/a�QU,sOm/>��.g���S9ֳ�102���C�r3����
��wds�Yѯ�}�:����{x����Q�u9!�m��̿��&�=|�g��Z��SfM��Y��d�C�vm�4�A�_<���ܬ�VeQ���?�L?>�_���_�Ő�׊�

r�-[��b�g�0�O���G
�BlC����P�!��;fTo�R�~�R��k��������A &�HL"��
��B����PD�ʐdy�$�r�QC��z_��fs)�>�`^����<$�Ʉ��ߖ�S�&�c��6:��
j�{}�m\)��)���ϫ7��]���S���ދ����Ez��(�v�듒-����>]j$�
v|'e%�y����<�*�T#�r��D�Ϊ�YRψ`�.�����j܄6��`�v�w":�hc�j�Y�lȽ-���67���zԔ��}M�E����%��Y��FBR�8!7��f�R"$�)���Fb�����)ٞ�s��w�o����Z��3��\1����������}l
���ﲭ9Q b=���þ�@^���"6�}��a��� ��=Ƹ�/���AR��{^����ⵋ�Q���s���G�*��-S��K��Rl��HR��Ɍ���>���c�"=d|1O���6[������ͫv�9H3.����v�^�"�~Y�
�WTK��T��:�����+�f�Tm�#{o�[�U�v-v^�d�Zm�՟�n�^�C��9���{
�d�E8�%�偏��z=R����MM�����]���WV3v�1�_��o�7�������_�[������oǷG�O�m-EY�W�csf���ilKs�Lje�5X�#Z��
Z3��5Y@(�͓��76O�q_��\��D��fP�w���qf*瞁7�gyć���r��T�:4C"�)B}�����2 ��{�`3�"<�RP��`��Fg_�����hӐu�\y"͗�A"9y�'0
�a�{4��#$ZLx5
aR�Sǡ�H\�~"&#{|_�+e�N��4��'s<ћ�8x�	�N�*ɡ|���Gu�!Vm}���M@`B�Qꌄ���YQ��?�7j=��K��l.IM�`������Hs�~���?���&lv�ne}�X����8?�Ӊ����j#�����`a��"V�,r�2�M��$B?�g�{ς�]\��󝾨���{�
�"���9�`��V�x��#cޒ��y��R}b�k��E?�B�r֝C�4�Ė&~=(�q6,�.��������8-{R��0Kń����&���/bXK��5�ZT��yM2j�	�\㐪pp��ss6�'Z����]�
��z|2���B�~��Rv���Aə�@yp����L31�m|�IS���J�
g�U�
��l����7����+odӭ�l�e�0��3��Q�L�Ù���ԀT��3k�C��m8�_
�G��E��K�?HD���9�����醞��V�v�*x�(OD3G��X��/AS���4����K<�D����3�ʚ^����4�W���D�I��L�>�]����]
_݂g�`�_�k�qd����}#�Zk�;�Њ !�~��2���8���m�/�����d���"ܗO1�4��?}�^�ڡwVB��C�!������j�@��
�uB�;8��}L����J�C��/�����^JCE��E��'�$=�����-T�kZ9~@Hp�.j֮�~��5���t}�p�f=W��3@0�q,{��aerv;?�Xt-*�d��+H#fw��y@|�*ևh%T�Y��I���7wI�ީ�`p�<߆[���8��Y��n�R���CR�z>r�|+!-��ִjT�1��8�*�"��X8�3�V�YO6h�e��s!��w�Ϻ�%/{�F�^�	PY�|O�@8��|�h��%�m��C)�ؙ>����P5������P��w�ڥ�(0)a�\���L���RKȏ3��4�x�R�$8:��LCJ

�s�"|:����x�kՒ2�5'��y%n �~�P?�y蕥�}����;z}��&-mOz�4^��]l'{�s�&����e��*��C��~W�J@�Mi��ċwD����a�QJ���*]RK
�D��_U��\'757:�ej�^Z	���"�[+>���4�i1iD�	j.8�g���,|�<n�X��k�s��©��#8���+�p�H8Ѣĭ�y����ׇ�~�+�2;��҈�����\���]��w d<��]�Ƥ�xFr;�e%�}�aN�󡗃�Qb�	5���E�[	�!�^E�RjL�^S]���6X
�0�ї�X�
/
^���֊�B��a=�}c������Џ[W���a���h���z	�c��n]��+���ڙ;���M�^X�C�u�����]��Γh�u�6����ۋ/i��t'�B��=5Í&����ww��k���X
�4U�sE�7��\?yJ�yJd��u��7��֜_�����0�H�U^�q��.'�e7��kb؋��$��w���U/����^�;]M	kp0oJ7��%
�7|�B`s�s%g���^��E�?$��	��w���G����gW��[�YSF��
t�]m���?���R�/�%�g��[�W��/;�v�Yi�����识@?��K��o���ƕ?l�_���n?�,P�ZA�'���h[�r��:߬g��Y�n-�k<��1�B
��'n�2~T���s`�'}��o�x��cy!XB2Զ�'�bs��a������5nVZU��\����ry�H�^�VӅ������K���,д�LG�o4�Nlk�&�;'D`��X/�(��]��
�VO7���Zv�X��*d
C�y:��4�bx��䕖;�Aw�r�Ϳ	���5xe���y܉JxH�
܅r\A��e m�̸TtOr�I&�y���[9�� ���{4�b�K$��h@�O^��\k��
ɳR����}5�~�����9��S�#�N�_e)�&}�K���Ӿ�/M���p!՚"�'F��3Wm�Us��l��c�;���_�ʁv��8��F�?���A��|�e�	~+}�]�����?��)��u�׉�~j���|�����-���K�(����>���?β�e��q����W�����?5��d�����㗥kw�O{���M1:��=춐/T��+�R'o`����q�a�F��2Ó��4�JE9���5t�&L���.Kz���|<���4�*]�9���?W574�~7w8��w��t��Ɠ�8���cN�Y�@A��3��D/�8�<�}��?�u���4<V�	Rc۩�d�#U��ۙ����a-�-�Cp�[�t�ZOF]&�[�� 7V1,���ڸ�ދ�;����0T]�9�"YB��@�6�Ӝъ[x*V��ê���Q<9�����Rl��pw~�G�k�~}~�E@�fT�o���C�HW�c(��0�gA,j��=yM�jP.ҿnd
quV�c+#��
�5�Ǚ����f�q����2��e����<1����`=H,T����{�~��Xh��U�1�^���B�b�	��4uV9�%}Hl���Ȥ-6�K��=w�վ՞�S-V7��$n��r��>�/��4@�������~>
Gi����SCn0�w����n���/Z㮴�yfw�z+5� u��] 4�����T&�y�kї�@5�8{��
��$�x���Ō��������{̹C�/�Ҳ�W,���(����g���@��e�����]1�m���_5�)�c����?�c�g{�?��h���Y�އ�^����-�g������h��q�{��l��֌[�N�S�=���r³9?dH�pZWN�d��E&r���
$j�XU,V�Vg���ۭ�}ڬ���˕�������B,�Y��(�
���K&dҙ5#�3��F�^�-\1���~�*��S��S�]?��d���C��b����ER�[�75
�"�&F]�]�wo�L#)�l\����9���r�d�����e�������B�0�w�H7x�3�ԉrz�J0��
v'.z�L����"޶�����o��/,����������p5��f�9�`7
������3�6u5���ӷ�R��Դ�N�f��]���o/KcB��/7��|��*���%��i���@ʐ�����o�x�IQQ�q�`�3��:Ot��a�Z������qI�&��k�_�]����ٜ�;)V�}�$�
=��Y���*��<ψ�]1��RZ�8�G�2�<�}󴘷.� ߃B�NY��I�gH�K<>uԍkꀘ$���Y�����'���;B�n0�3��pQ��y�{��Q�ϱ���y
�?��.�Ӷ݆���,Ad���q�M����+���\|~D�_l��)��f�0;�����O�:��~0�'�A>�B?�ץ���W.qe��]����}K��rIC�9`:ߍ�~JJ򾌍�K�������m��8���*����E�i���/��^\Ԃ�ū=�w��+~oJ|��/k���O��[��W���FJ�|�Wvo2������8���}F:2�c�x��a�E�O�	$̷j��L;0A]��؊h��ޞpXj὎�,oX
+��-K�50���q���T��͗���Y�d9������S�j�����;|}6S2���P��0_�V����
��w��'��H�����K�_+�+�~��V�"��	�
_iq�x5Cѩ�&孾�T��)ioa즓��I�y�{�7�I�b�U�O�S�n�;Ζl��9Ѓ_`Ng�IV���H��w�ut\=K1���
�S�4�B�:�=?�i�[�&���g�s�2�Z���It�̨o9D&��<=�=��K��frN�k����co��?g�A�~�ut�C�1H�r�WHn��W[�-���XO�hhZ��5l��A:<k�'��8B)q2oW�5�	ΞQ_=���/��T�^�M�M�k���Lz����7�����M4�O�o�9`���Y�IߦB�?n�4�{���y��Zw��tz��8P^"$��P�(Q��7�l�kՑ��2�Fy��{JF��LM/��ͯ�t���O���s��[��oJ����e�����R9���9E�=.��J~�\�<������_��U`�d.i\?6���Kd��C�� 
Pۖ[�E�>^��g��;�����r�u)���f��H��#��t�/����w�������,�磰�r�ӷ�q�-�<E�x�Z0�$[[b�,=_tuk�@\=���K�j��e��X'f�L;R�?�TB,9��오�u��'@z�([�vu��oV��b{�!'�3�P�5����T��T���P��q׼b��묒aw{��1p�,h��*�6�*mW֢��Ԙ.~H��y����u�g��t�Y�lȟڶ6�&Ҍ�K�"��}��ث٘G�N�+����N��K��2�Dqs���;��qs�z��37�^{y}j�u�-�͎�́��vS��n���a�pu�v�͕���!��y�y�N��\>��J(�rEB��֝�
<�����<ϛ`~���V�\b&qu �\���r��p�����T�����d�V��qo�M�f�Z���014��x�1��k���3�
x
l��3����W�^�X�L��n��y�	�A�.��bs:�{���y����\��S�ƃT��?֋�rw��q�9Vv5o��BP.o��T��G��Z4�������"X�C,^������z�R�Ym��2T�Zid�}o&D���<o�%c��\H�.t��$F_��!�
�)5Gq���	�(�ͧsu��¶W����݈R���pB��-�PM@ͬ7j�����)�R�ٕ�r��ނC�9���6��A�H�`�����3�����	p�6�	
�Y����M���D9ʏwO���%�KÙH��0�� �OJ���l�uATR��y�I��Rd:ZC�@ ���+	-Ԓ͸uc�J��BKu�)��	�qjf]�(i����I�R��]݋t~c����C�T����A�(Y9�080+X�Ķ�>&�Θ�	��B
���Cn����#v�����؟*��'`�nad�R�����y[=m���n�X��巂�*a+XH�H#�%7͗�����X�dz{P�F�2���*�&��X�攄6q;�J/fNY&|��ݍ�,팏��#XV���a���j��xg~K��ĉ��ɲ��-�s��L�y�Uƛ�ۡ��V��Af��=i$�ل�%��瞠.^o�'�:�︮�ӆ�Θ�c�8xi����ȑ�JXu��/�^���9��p�8�?���,~SU��[�T��Ue�'�i�c_����?��BG����W�8��K,��0u�!�C��U��n��|�gq�C�������Hg�ݵ�m~��n��E�O���<��a��w��p�Ss�S;%��zLv�/��ߝ�Y��"�o����~QK�Z�>C��OAӤ���V��'��j������󭾮��z鋽⽚�Bi|C�$�g�l_	����/ӛ��˼P'
�s�ćWVT����U�@��2Ƨ��G�8�4����ƎKa���7-_hxh�u���(0$+��<W�-�
��)p�^�JV��3�-��_�l������D��CC৸ke��
�Fs�t�p�-�x�>�'/�=�y���mV��t��7A���Y��[}V�CQ��p^�n�I� wq� ����0|�'U΋H�)e!�u�uy���Z:���zM��5c���L��f�U�b�,�f5�AW|����*Iy�RN���n�f��_��R���j9[��h��oΉ}���wz٦B�����'1){���=t;����T;1A�”{�q�;���=�|�f
��_hD�t��6k�Pَys�Ӕ����������PN���c��"Oc-
���\裿���t�J�u|�X'����ѣ �X�
$�4�WMh�C��Y��DI��K�`n���߲�k�1�W��z*�}��=��ɴ�ı�B��Kd~�)��GE���褻*+[J�2�JbK�n$�Q�oy�^�/@��KM|�7Q�8�߉i71�
�֧�v�X^�qIݠ���]���JUj�Xs��"'5��s���e�&���.F�n�~�0����,�b��.�6Iy�c��'2�N�0��D�q��������s��:r>a�C8�t��,�p��}���JY���}�ٗ�V��eR�u�ڸ �gL�r?�Y�*�:�_���j���w�F��v{NoY���=�|�I�a%�Q%z����k��`�ͫ������\�����As��X@-d�CNd��f��H~G٥O�90Ti�%��7A��'
��#-kTz��(���s�B��P-	\�`G�o��	�YHb�X@�����C��Q����LuX:�HI���t��/�#�؂��Nq}ro+�M\ޜ=�}��䰹�SO���m��vod��|��!A�:)�J�/`�={>0/&�Bʌ�}���HI_n߇�&Br���<#N����;ھ��b&��9����Lr�o�?�i�#8}�N7%l���_��o���i%L��<���e�%&�w��id��d�K��"0ˏ(V���L~��V�n�Jb�����h���`\�	�Ϲ8��/�xH

:���F>QNG�/׮m�>�|��jH��K�׫�)��ƺ��̟��{S��|憴/��>�:��9�lɋ�9.��`�WQ�٧�E���^Y2����}/��r�|��B�˧B�b�7�3k
g�urr�aQ�c�fl1�"�ჯ�֛�Q�O�lإ�ˌT�H�R.e�;��C�>H����j/�ۼ��O7�Շk��?�0��r�7mݼG�Ts֦~����'Á0i�z^)���7�x� ɈI<D[|)�ܒ���k>H�R���#��ݏ�s��u,�T�OCơ���&�J�s|3"�K�+5
�c��؛�Lj
����Cf;���
����Bv*ݽР-��QXxȞ�$eQl�5>�ԛ3����
#����T�� t�<Ѻ��R�V~�O{���JS!��N5I�	����.Z��7��ƒN��5?�lR�X�5�W�K�o
73����9Ns9v�.	l^��[w9eS���1NS���\�k5��z��5���5��*�'���mK�q����Y*Y�tI�ڛ���O�:ȹT�ec�˂	���j�=��)�˜��0�룉^��wM>�Q�CG���H����JT�~n��?��P�NɈ�A������/�F��q�����ݭE��o�k��>	P"$fɉlgq���`T}g'�ѱ<S0�µ8'��Aŀ�����qu�Vۄ������b�V�;�RIY��!�v�֍��h��i�����Oߞp"�$���ϱ7H8
�;�艃(N
#K�=�:Q|�z]�[�k�_�V���ƍ���(��~�f��ە�0��W�SA�:�t��rm*�:́�B���`�;��`��o6����R��L=}�-�&�D�ˆ��O�җ�Q���t-/vբJ'���
%W���^�	*̚�I��2�T��/���d�느�l�o�5�ȍSz��&,8�
,�B����H��K��rHZ�ح$Vr�a�=�����%�]q�����z
0�M\��ߧz�_n��N���_���_@�o7��r��l��M��wc�?`��y�rR�l��Z~:����}$����D�%�������W�)����{��@p��P��Q�D�Z��0��.:���? ���p|�~A��z�/!ڷ�W�Ѿg����x:���~<��x� ��i=Cf��E����̇d.R4��[n����Gk����̵ �|���d�K�P
<�ԟM�w�"ci��a�G�n7[=\3&w��χ*e�4l�	�����#k9��Ȋ9IPc5|d���Ȑ�9��!R�yk�����P���O�v�f�=Q,�ڄ�
DqwaO�_�qN;V��&(j>���%��@Y���=A�Y���/�_P�Na�h�@i)g��]�Hz@�qwt���Y�
h�x�_�}�C���D�`�[P�3���>L�2�@&�����@�����g�{�ߠ�K���`�����D��Tؼ����J�KO�̮a߾�|��@� ?���-혽�1,8�s�?�e凗��3s�l�D&���p�G�t��9��<�/�W�>t�n
�e�!L�oA>V��b�b���&�f�^�|(�G�bq�9"[�
0!Q�7
���%a,�q�w2����)%EIj�����`h��ls��'�jO,oㅧ��w@N�'�iJ���vDa�6��
Z������]���"L��R\���s��dG��� a�/���~���z���t�Ѿ"�kDf��<����������B�~�
��~��4��{�o6^�7�E��	��(T�Ҵ�����5m�ݵ�נ���Q�'�Vt�pf�A�7�[�q���ӥ�? �ѯ�A�gC�GՅ덯�
N������{a3+
z:\e��T�]���r����"RQ��,���gG4O��|4{��M��
�p��$ƥG^0�j�x,9�vw���HE�}8��j�Ů��*|%���5�4 a�E�"�O���i�QGϻ0k��;}���x���W6�mc�F���� -�K�n�1�]�¹:�x���G�|�X�S��Ȃ�kJ�;�hrS�+�=��P��t��o�	�9��c�Ǿ3FqLѡ�f
�>��@����%Q�$Q�$�z�xYH1�
v�d_��g�7_��@��[5�e������u�kU8��{�+m��1�оc��5�w�۟�sv�����uI}��F��av��l�D~�u�I���>>Qk�p�~��0�
�D
W���30�-��qh}"T�U�Z�_����(y�����^7O��Z	��ܛg��i�$h�`�����γpx�Y��屦?�,zR�Q����@D\�T��K{?���%�[0�D��W�BnB�i*b.�^7C\t��:z-���`<9B��y(�D�{�$�<ˎ}��p����7��X��)�������M�� ��)'�u��"��̅�ۡ³�qLvi%m]F֛��n9	��<�>$���l��0��O�W����Z�Q�ac�w��GI��T����>�
�wAY�TM���H~U�������Xi7	���KO������8���T�;ha}���;���-x�?G��^?��s\����eF����:x���@�_��?=����R�����QMa�O�q'q�?�@�c�y9]S�dE�#�}tE5�b����6cI}؍�~�.{���y����&�i�p��p��HT���UD��,%�jV�D�
\������f�C���o��|/6]qE�t"��;���nU�'l�{��uCC��Hg�Ľ_/\�PQ�Ċ7Ш��	�{�!`���se?�"�s��Bf��C,-PT؈},N��⵸]̌>��#+�@��۸N9z`XD��'م���必����^s�+V��<_#�/y"��W��Z�����s������r�j�lԏ�:���]��^kM{R!�0�g�������k�7� ��j�||C?���!�]���(���o�y�.T�]����^(wYO~ˇ�r㞓�
O.)m�f��~eo�vv�ǿ�я�!ž��=����OT/4����8B�G�S�JW[� �o�;!"\Sq��x$\�*a��i�r�I�������L>�'���g5�t'�|b-!���z�ޅ�M��Fբ��s���g���4"W=�q�������;^���c~k)a��L����sG�$��>�G��
Yx!҅�/+�ć�.֥D"Q�$Yfּ�����0��#i�Ѝ�]bH�1 Ie�&��9̐׌t&�iAo&���|��&q]G����P�����kt��.���uշ����W�l�Q���tWy�o=�/�`�.��_���H&�
x��[SIY�B���3�9PH����/�I�'�I����5!/���C�\���c|Е:|��m7����N��C�=�8�������ծ�JJw���L��6��44��L@[��Z3�k�g�3�j��u��ſ>l\*�Q��}w��o/�^��5��·�_�b��x�͔6�����!N��"xK\����=`��nρ�Cj(��8��O���R�ĺ3��.����A����&���Q5���h���v�+%f5�돩�R�7{!̨�#G?e�>���=��@6?[k*1>z$Tҷ�-S��x�2	]hB�&)��[B�����n�B|���8`�a�z悾���/�Q���V�"��c�
�8B�j�V�"-琜��^��t�Q�p�~{o����������Gֶ�ɰܟ���)��a�Q`^�(�	�VG��s+�I-�bL��C��N��AˆHRq��3�����Q��Uu�;gI�CLV��`?��֦�Y#H�u���O2��"�������b�qnFN��
sl}\.���WS��-���Rz[��!���}�@�dg��ӆY��K:~Z[��*�j�������wV�
ÞU3L;���r�?�\O@��e�x
�խ��ςM�����%�0K��H)}5]xz���n�D8[���O
G��l�w-��x�&���\+���=/-X�X�}�%W8b��K�C�R��@?q����]ư��oqW4#Rz^�r�^�8�j�ܧ#���&<��N|FF����W�"�7���U>��]����@\�f[�ߖ�d|�d��&+٩��'���n���Aj#;�i�ɪ��p���R�j�KB���
�]R��2U�� �3�<b®}�%�������y稯��ޟ����a]�x�b<�������_���4�}�ɍ�Ӥs�e?�r��%F�u%��Z�%��
��r��ъ)E|ng��(r�0���9��E,��l&��:c���n�]����5�v���	�0������g�lD��9��l@����ˆG�ҵ���>�-B9�I���5`��@��N½4���פm����oY����S�B�hy��SwH�f@ɑ	EDo"j̧ftx�P�q鶎��(oW5?ʪ&�WϪVM"3�e6�E�i�'T�cW�c�&�c1�C	�b�t3�]�ۇQ�[ �x�����3��~��S�?տ��`ߦ��m|�K���N
g[�6ԟzZ�o��Զɖ��~'Ӏ�?ԪZ����m̯;p��klz��ĥ`�@�r�>�/�v~�����I;�͵�{<���U�X^�\`j}��m"�q�/�l8]�~���_������-�����{����8B!���5/�����O�����X|7��}�m��>J
h�W$.���Ƀ�J$4�f��I�X(����u�Zp���lE�襆> �&��a_�cG�K@ꗙ7`�z�*E�YiT������TN/���;vƂxpnֆ]w�>R�hNgyMʠ�R^~�I��i�[�|YyF_m�E^x�S-�A�{%���j��Ǧ�_��z�c?d<�X=ݡd�����oXNh��Y��
-�hޏ�f��
R$��5�i�7�6�{�H"5=�)y=�{G�Y��tr��+�S��s���~���P��C��F>K*�$�V��{�NV�6�g��EǛi&�ǡ!�
#0��h�����n[m����$�]MT$�5m�!vǵb����7��=q�Ԍ
lஎ�Zu T�zP
��LV^ν�Т�/�b��{]�(�o֚\�KÎ�3�d�PB�t�q�2��Vj�V��8�hQ�V�5�� Fj������rL���Vo-
ܗi����Tc6���J�XK5>���`�5���ݛ��V$)[�ek"^�{��G�6�a��by<}R��>�7��7�q�}⾛�oӠ[U�?"�/�x�?oJ��y�Gtx�M�p+p�>H�?�]U���2E���ܫ����?4�v*�m��9�p�����nz�c�q��v���H���q1�B?r�/���> 6 �e�e׷��?'_ՠAt��K��H�~���)6�����8C�X
S�E�}PBK��SR�EI�R�������,i���/�F	Yӹ����b(�+�
���K���Al}�ܮ^?9����F|tݐz}�=��0*ھn�����O ����R��P“"�kd�;��n�]op��yb��H��W_#K,����u#�k������_$߆�Q*�ˍ��=¥�)6�4��)��t�B(Σ�����X�Q�u��;��n�Q�F�/Jݨ%>�l�Q���F���
�>��;N9��b=�/ j�D��o����͎�擊�]�tg*�M�k�h��E㿕�e�f�J؜7-��D��
~�9�6��{w��>	���K`�ˤ[��>�On�p�
T��p�6@��6��Ju�.��P���Z¯��_���R\��S�m�y��\�wgz��W�0���z�fJ!0rgK��}�ǘ�,q�M� Bx#2~����p�=4ل��zݨD�MW�G���{]�%
2E�8PJ<JO>�1�ܛ����u ����^DN�����#����ɋ�,��撻4�)^m,�SڍSB�� �xFT�"��FD	�D�YIƫ�`S����OX�,�lȤ�G�ヲ��|�@��(f�d�ܝ~�M�|u�������<d%*VU]?/���I�I���>-ƌQ�Z�71�JW[>���f�`�T
̌�)x�"u y��"]����̧ᷭ7Z�l�귒��7���УH��2��;���$�G�Ѹ��R���l�i� �sΑI�b~Xm�d����D^J���'�IU�N!��pX�3�*��'����wd]�P��[���(��8���w>C�H���Й�� �^�>]Me�5�L�Xq�D�{�<_����Y.�Z��G��=�U�i�ɂV�C����Zv��"t�"�Yh�u.z�XD����/IH�-���R�R`�_E3��/����~�?���ϟ���.�M;~F�5�Z?3�]˷����c���k+�{n��`��9pC!Z���F´S�����u���<���2�Z.��j?�u�ŇC���~jb3�4��'�.�T��6l�׵�F�O���(��B�?؊���#��ɥ�WE`w}9E��䂇�ݰ�A�8�{�24�|QYJH|%!t�3H���9>~�Q�xvWe��vqN�Rό}`B"�i1b�ִ�׼^�"�9�VA
�#��s-�D��5Q�P
�����O�f���Pl��n��D�uA��#�1����DHQsԡ`���xJ,N�L�49����3<1QQ'�d��+a�x�鎒\J\ӣ`����:}b��j�W��<_�g׫�>�^|�;�=�-�K�#�m��(,�b�0�'7Ͻ]�C�k$�̱�����;V�+^g��6}mHlxni�)��qߺ��$	�2�1Sw�j�䛹oOH��qe��⽡�⽪xh��a�LP��b��G{#kT���id�������M��i�!���|7�VzrL�P�4&��uסk_~�	c�S�^,�=��v\�&��m�lS��U�S�7�i�t��a����@�����M��;r�
�D?�5���Z��r&祬��&�����U1����A6^Z�sy�p�'�}�Ň�I�_ٔ�����gH����` fa�d-aV�%x	<ya �]ԟ�
%Y�b�nt��4e.�vF�"���Z�Z&��3�I��5��1h��z;�{��29X���+����4�=֧�3� }7>QI�4.�I���
K���/�S7��bb��s��;��OQ|���=,�
)�e��<�yz���u��l	qI��^,�)T�!�E�\��Mq��V#�gf�lj�hL��Zb~�����8�]N>x;�o9R���������|W��c��x���X2%�����b<����VR��.
V=�������Z����-��S�H��<&@���4�=A�h
���J]!,x{�|%�ފ�}0��A-i(�E?o�-^�%�{x+˽��17fu*��H�9��|j�|1�3Ի{���D#d页D8����� >e�|�ʽ���(�pb-���yвWN��쪆S�r�7Q��9�︕e~a�Jypęg"��]'��ˣ���.(p�#|���ES���jn�2��L���:#�n�P�Ԣ5����N�אO�������{�_��`~��M�ȿYTm�=?{�y�g���6��<��~��`�M�JZM�M�����O���wv�
]�!�ŗ��W���.�=W��_�}3���%WW�v��k
���z֋�}�|�����\�]�~��F�[	�C#�2��
GS@?�MJ�3qb�Q޷;4я��n)�h��7�q�
��Yia���8�5`j�.-�P��	f�Ç ��)��O\���Ə�
矢c<�i"���Pa�޷��O"‚0~�c�6/�h���A�
�:ib�ދo��,��[��(��0ۢ�nx�%;xkŠ�i��2��ir�W��G�W�zt����,���j�@"Ҳ�1՞�i���X[�	�v7B���ʹ8����uwx�3\�J�H+xOɃXT|�!�(�HP�>[���S���7~x.DR$�_")  a������x��\St�]�ނ��<�b�(���6�vnr�_g���Mj���-�^�fy%X���A^AS{���WH�I91�6EDƳڻ�Z�5]d��5�c}�ٻÖ��-+G����\I�WqˌJ/Bh)�r7;g#fE��?E�~�-�+����*��0/�@��׻B��qNkc��W�O����O�X���l�>ѣk������7A��			�J&�KE��X�S�+g}�+=��O6O����L5�<5����(�R��w�z8�����%5�x?���BeK^��vc]Vh�jk���X�Wpl4�8�L�lwl������n�H�ۊp�fI_�����B$!"wo
*r)�_�W	~�@�2�*�®������"x$���pX����}b��tw��Ų�"q�<{v��g��U��ޤ>�,;=�o�k�h��:�򖽨�:�cS��i۳M��,B�<O֍�;�O�E�������1;u�Ɗ�)t��Q<�K�p�*J�c4�cO���K�Ec�����űךIem鐘	�>s�'���%������U�–��,�yK�ѱv��
��Κ�D�l���	�^:-�)�K|��s3�z���ň5����)ё�pA;�{�u�
�e�
ML�Pk���6�r=Y�	obm�g�!��΃�����jJ9���z�{��]�Q�t���j�elا��XbۭQ�ͪ���=Q�q~g�@���c���OUW��l�w��ڨ�ޥ��'^�����e\��(�/U\�ٓ��;�?fQ�Ҷt��b}�Ҏt��Q�ԏ��8����8ҿT�|�C�_�����
�wH����6��t�{[t��#�˨�s��p���GW��Tc���5�n�dnջ|�DJ?'!Cb
qy��'X��ڪ��_.O��wVS殾z�l�U�ʗA�x�f��	�;u�{m{��٪�n'�\Õ��s�Z��d�&�}�1����&>/�G`>;I@�\��1�tt���R�y7�R���k��S����VJ��ώ��7Ş�k�]��k���>"Ţi�]a�,��)�?��m ��'����p�:h��alA�,�\��T�-p(�����S��e
�j+�M�fud�EfT�>��!9X+/,����Z�ŀ	��������bh�3�`Yu	R��&Ŭ������OOθ�q��0;�s5U�i�}
�:�>�����l�7�������Ľ�X���=��|��,���Ģe^����Gϋy���t�{H�����%�Mk�3��i`e���%�N��ª���ֻ�4j[��]���- ���?�u�y�)ϝ�@ьwl�5�qL�m�z�4��@t���sO��VW��Τ���p~��_�Z^��"1����S�V)dM5��b>�E|ۑ4Y.�������X�G��������<x����5�_��/���%�N��]��ﻎ춋
��UYy<���o��ߕ��|��_�ہ_ܿ�z�K���ܨ�2�tA�/Bm>��F��)����e�܄�6��x|�l�W>��,a0���MR���Q��x���;6i>�[�R����`��+��~��>����8���������P�'��N�WW����$�*QJ�Y��ٔ��1�2��q)ʏg��K���l�DT�Z���O8Tz+"My��" �]��똊��mG�2�������>���R�#rE�H��Nj��|�.<8��XkS*6p�)��w?�wLJ�M-8ux�~W�Ń����
�&����JvU��� l��m�6B�T�wOY���'nˮ$!��+ܰs��\it�ˋ)˾B�׬W��FS¦Zw�?	�¿X���J���W_O�TZ��eS}�,�����Ђ͝�� �G�3���q+��9�z�I��T
c�>D�E �Q�k$�Q<�a�t����W�ޔ�i%g$ϙ����^LS��/���&��LN�i�a�[w�i���g��<��}�|�yVs�m�<���ۆ�K��#!~>����Z�UDf��
F��Y�
��4�-��yh��f�>_�8�d��t����m-tӖՏ2=#�k!g7����#=nek�&#�x��]X�֗�d�����_�_ԇ���P��?¢��U���Y�>��=a��^K�zq��i�t�w&~��~ʸ}���)W�7+��i�A�~�n.��+�?6�����篇5_�S����:�����i\��"Y~�NV���������NՒ���fc������_Mf$�+���ĥ?Д����u8R��h��WWTPm����^�풔Wh�T���H���[p��l&�E޼�_��\���Bl�K4���O���z�ԝ�*�D�5�M�„[O�V����d�[ln���g�ݟƵ��:�b0��uß���VbUP�9�FOڮ��n�s�@7�tO2�dh(��H�ZZΫ����̤/�(;��C<������%�h�}���N!4&�f��^wo�$�n�p��Yb�,59��+$��@�V�=Zh䱵�ZR�u@�SC�c�V�ǥ��_I�a=����H?PT���öu㥽?���z���6�����\�m�}�����=�9���������0]$*x�T����+s�����-G�Yb�6cX�|i�5
2~��}4��ة��l�BE�Ϣ��x/^����G�nۀQj2r���*�xO�=Kk��
7���0?f��ʄ>{)
"Ay��8WD��AH]8�O\1�jA�hi�~x4�^����T[
z�w�Y{�kNJ���l�S�~��&�L����?o2�v�7W�u/��ל!Lv�x� J~��_)~��<@Ç9Lb�����9;Gg0��Wa
a���l�<����]�X�����Hg>;��4�;�'<��x}���� J/S���E(�C�u���j��y��{[ys�u�W�5?Ӽ�2O��N��`�]�c<kis#fs1�N%���w83�2X�P/����[}�����z9�AZ0?K�1���h}w�#�lf;��)�iJ��e��d��+�9أ���j:5Ї��m�Dw|�l���}R$�#':K�����=�:�Ǧ{����,�6�Ic��
@�*�d�Ⱥ�Lh)yG�wj��Dվ^�A��8�-k�3��dAσ%X�[�'T$���Zݡ�G�^�J`�R�e���+-�`X^3���(ޅ���D�NN���e?Y*o��K��XP�$(�w�@�R�%���&(����n�MS(��'��
4��$��7�ᄸ_��IT��i�wc�p��G7�q]N�` ���S���d���e���l�"�f�K�CItx�J��ۮ7.j���io�,=������9���'$�+]�3��qL9�t<�-s�_`u��Xm��];��a��k��X-��X]MupPv���f�������u���|�~?/�WaO=5�����OX�!��}T�'^�r�~A�X��r8Z}҂��#[#��H۟/�sG�:���L(�`��>$E“	!�r�-^�̠z_A��w�������cyS+����6�s����%\ZGc��
+�$|��3@1'�A�xc0F� Na�aO�����`Y#��z���6�����/�A�F���"oz)_ٜ��)ܜ���hߝ�Y|u_�'�
��W�|�4���pp��%�2�����ɋ�/��͆�W
��KU]��U�T4l�
O�z�y���*�/@��|֕���{�61�=��BR�c�	���t%���"�Ǹ���=s�F�*XI���-��`�c�����C�\�aI��K��i����ו��†���TMͫ���z���)-���~=�b�H�L(
^M��5�{�@�9Ri�ʴ�H�@;"��.�_ŭ�I����ۙ~$�^��Z8��Ӊq�wOa�A�f�[J�FO���SXM��'�޷����t�� �;�
V�bQ�$˄�}�ӌ�&�LJ�aЩ�C=�]��z}�ք��$<h!�T2�&ZݒBU.��ݎ뫈>�J˪,����bmPw��P�W%�oST����U7\݋7����o�>G�=��j�H۷F��-5J0h* }��fAB��X��܏JԳ,�^�RI`�#�`���Z_6>u�K����|���^�MB�6t��٥����w�Hw�L�c�M�B`!9��	d��i����Go�x�j%���9����ھS"���%׍5����x5W1>�6�J��}<��tPe����VD�9'{!t�v���Wiw�:�ϧ�4��z#hI$�:�է�%�O�'�7�ח,K%=�r�w�;����pۈ3դ�}5t����ȋ%]��q�����"1j3��QУ�ü#��N�
O��aw	��p%�=�M���#�yZ�l�Q���q\<���FT��EE��G��Ŋ\�{<(I,�>^2�>��2.w���=�`�3!�	�5���\�	ɓ���u����m�xv�<�Yt����9�V?AJ����
N��� ��=����¹�m�>����O�?`�����Z����<6̊1�����/�o�[�<p@���w��IG�p�}��SL�rq]�Ə�x7�Q��g!gw�����XVmR�i���*����"�X[tș�4���'��y��=���Ci�6���c'�M"	�'�e���_�LxF{�R}��s�4ݸ�S�I��������3�����v��t���$D]��u2M�P@��#���W��@�?Ӄ�l۰y��,@)g��lX���;�J�.5u��[P��~��ډ�Ԩ�B��"�?�����ȸq)U�w�}TJ��"��hH��3,���PA����۹�Ǻ_��At����d[cr͔o��ɛe��
��J���=J��G1��f�]Zv�i��2��ѯz��ȕ�V�
�eʬ�3m�e�K���C��`w-���?˜�W��}����K?М𸕧<�YP2f���4�C3#dM�,
�Gj��s�K�@��+t��h&��ӛ�gM~��"򛼋��h!R�M�Ȍ'L(�/����X�W��Q�7՚��%q謖�_��o���+�O`�n�4��+n��i/�@}�Ŭ�Z&Wb�F}��HjwA�P��|����i�nA��*F{�}�w�@^� *�{��)�4�50Oz������ੜ�ܨ�]�ƇF|���Q�@H�W-�d���6Tp*z��{>�����ֈ�B�%�p2�ܰ�q|"I	�Ł����]�Jۯ>j�a�_�7:�"䓹��y���t�1�YY��J�+�>�#��F��qo&�y��М_�	Q�m#/]�N�)W}wM�ΰw�]��o�
;��m�_B�R����h��7**P�uW?�{�����6
�bh��Q�V+#�n5��l+���4s͇Cz�̴{h��͔*�V��N�2��{���
>�[yYp���'��RS#A'EEܚ䓁l�� �H������D4z�ʺ"�N���~���P��~�i E��^���d��{��q��9"�݉{����5[��X�#]��F��`�E��_n�5Y���!�ϵI�e�$��Ё���r�
������t�.�~��E��:��I�/�-�m��?v_�g��-�=�%���E{�;�'��Td���o�N���_�=j��
ɷ&�V���'U/��"��5��׬B.�cm�T��ЅK�l��w���'����y�H����)���22�r*��y��|��z������Q7�t��@���E�y��Ԟ�	
�\�뻃=+�E�'/X)5m�
�:�Iٜ�ܦ���i��鑢>֮s&&.��ֲ�A�ɴ������g4��n�c3ˣG*���:CJ��B�T�0�G�l(J�����3�Bz�0�x��3��~�^H]|H�S�Bj�g�����tG��hV��;r{vc�t�l�6�^n�H�(�0�H-��-|Ց�����Qc\�QFm~J�!k���F���%���v3��jNحG7c8�f@�
����D�O(4�
z�{?<V})?x~.���d��&��x�~c���G�`.<�&�Ј
9[fI��m߮�p���zu\3<WG��ȩ����W#r��.�88��,�%;(r�TB*�o.h��K�|H����8���0�b�Pw�f�Bd���˓���e�=�ꔏ3PP�~���d��	�i\?�N������;O�)f��=٧�|�(ě�L(2Ͷ�v��5�1�=Cм����d������b��5�ߨ{�C���m�]|��@|�82@�B�P�M39�9-sX���� �L�GOF��Of�O��y���)c��'�[<�������tY�g���,�	q}�W���
J��T,�
J�������_�����_��gb��e
et����^4��Ҳ(��k���;q̶.�s�g?m�B�0���� urXq϶��V=��eFD-���CNu�9/�q+�n�E�Ae��� u��PfF|1���G���O�
�Ȉ�%x	����O\����8�6}���%����qPre��쑅j^H�v���{��r�O=���`]$71	�T5-���ݨ�ȍ1��ֈ�tqqyY��mhb����x~~�1n����ѣ��\�?�_�5��GF�|c4ɯ+�:���~��!��Ek����JW�K�������<��X�)j�]��¾eZ5Ե�~I��eEz;��&��V�w����7��^�iOev91�V�qo�^��7)�܋��!{������lN�J����ː�G�U�_:�Z�:���:�^x�����;�<�#���›=�*��u�X%�f���-���,�ǜ��mk�c�D��+�mX���S�g��������;�_�4+���:N�"��34A����wZ/��ģux�L��"�4%��H$��'��X��c�H���*�&&�в/?No�V]N3�n����[��܃sa�`�a&�<z�bšm��=�BR�34h��U{h���X� ������dt�l��?y�"�!e�ݑ%�֧��Y%�_���`�X}W�_��R��Զ[˞D�}�W�^�ppjŠ��l�ډW�E�?l[5�)fx���`J�Z�:�m�,��$����*��?X/�y�������,p��8��W�`z�#H���m��3�d~JR
�
�G;dKu��
��Uby�D�I���.����o���嗼���^��k0���av�'�"`�|(x��˞��T�"�c�>�?������29�����yXڦ�����n�A)���
��l'n>�]ӡ���:���v�S?�ь}Fh�C�G��2�D���w\��?u��m���?���`����_I�����I�~�1�|d=x�-N��{�����/���+n��7�9�O�ͯ�	���S���z�kA�
��W0����J�C�"^�7���K��C��M;C��Ѝ)���!��N�!�*�y��eq��-$�l#� ��̅���
 bʌ��[$�!�1�C�}�҈���FLn�mӞ/P��Lfr�F����^�VԸ@����#ژ2��?;��]%�Ŗ�S
�x�ۍk'[u�)��ys$�uH2��k	��$k�;�O\�&j�՛hpL`��^��A�n����ݺ"��$겓�턏�J�z�Ɨ��[~��ڔ�b�o(��_����U�=U����R8���I�uz�ֿ��xN�;nH�ZVN�h��9��Y�%��]��W���������[��j���T��'#�q���/��H���%�<��,UkB{�2\�a2z�Ko+7�	Go4I��N����h��5�t��$Lmd���8*ѹ�vw���b1qp����:��&_@���<�p��6�6�]�2�-��E��X�֖5��EG��랻s�_]<}��qN�s|��|>�Y��bǞ
�Q�އ���k�eV�ş��1,�����?��|��r
�&�(D�%�
m�e�%xE�YM�x:n�t�Hd$���oo8`,W
��>���p�\�yL��f>��K���$��=K��e�フI����r��2$�i�Ȗ|�c-&Q�q��H��a���`j�Zz�\m�ݛiM=�8ƈ�(Ŷ�Wӷq�g7ف��_�ӌ��Ti��
��7�J�rpiN�M�����yρٲ�d��/f��Ӯ����Eo�V�*1J��Q[%����e.5<��x�T��Ԙβ;>�n>�q6�}:�g'�*�*���|��w���
V��gNV��n����e�&�W��y��~zZȬ�
�H��9��	�h�E�����>�`��
�d�������o�/�R!!2�*�2�n�Pk
.��?��4��[<*}:�lk,k�5��8>�E �rq57������Š�-�YE����a��A7�axu+�G:��I���3�h���ڃ�	8x�=V�����7u�z%�ט:Ä7h�ς+�[�B�ꛭC���6�"���o�u�I��(��܅w��e+�=���D^^����2�!�
X�9	�%�3�J++�Apc�N*���Х����tI���M�2S5mt8�*�n��͸O�hm�J�u��%ۣ���;Y��aZ��]��`����Ҋ���6�s�
�A���`}�{r�CRX���U�;�3*UݑR���R[
ܼLa3r�� �2@2n�

���(/ae�\;}����4&������ir�{΄^u��/����Z�c�	�כ�B$�j��1�,،���t����>�_��꼘�#�1ܲ�i�x���Թ�5Rp��Z���X0}���8v#����x��w�JGX��M����4��kXnhk���P����uQ?��~
�E�K������L�/�ո�r��~,K��TAB��w
a�����[m����
�v��_�h�rmv���T�af�}�V=��ܥ�/w)���<b�K�Jh��l[���m~�a�)�r��[�t=�k��A\i�dQ��1Hk��B�����w�@}q��=�o�~����`��O=�/f�C�����Ϗ��y�8�8P9s�鲎�'d@&���뤄R�3�]���J�����	)���F�Mv�G8�h3SvE|v�(�����?���uq�^��j�/IƳ7��z1�,�G	�!iS�k�,��m)���$K�A�/���Ks/�����=�כ^���"�>ES���R�4����G��/*�aiNЊuw>2����#�Q�H��?��K�8�K��n�p�P�V��u^k�B2�Y��P�5ᨕ���E���(��d/6R���d�N��/.?�co��|�>�8������.0���!�@%��y�V�ۊ����gxY���Y���#駪k�*�h+�ix��] �'��Ba֑��h��r1j�[Q`.���E�W���#�X5�!j}��/1+Y�0�������k�l��V�m?��@�|6� 09'8t�l��l��
O҂�%b�Z|,�U�^���ݖ[�@G,z�D(������G��;dQ)�oG2��紇�"�C:[7�֬<\D�y�*xz�{����C�į���+N�T���{T�Mz{h������;��fhگiԴ�^�-��^��p=Σd]�O��b���H:�0�Ik0�I=�1���N�\�cN���JO�d�#'���=���^�fBS�e=�Gi����U���፛
�"����[�=��ʤ�#M�>��}�Lm�[��Q�	[J�O���R��m�g�����&}�-"
�9$�^�w�����rf18�y��q�&}�g��l�=��Ԗk�����m0��Y+W���Ym�Y{�?�D<����m�� f�	�&�X�bl�'�����B������D�*�K�0�@*^�q9{�(Ԅ]4[Iz�_o$�h�n���+LJMq��͏��6oږ\AO^s�tb��_2���k���&�>w�H�+�(�K�?��H��Ձ��VR�%��F���V:_pc)�o �ws$�}�2��u�3}��,	R˨.9�g�4P�!�7�8��Ј�(�U�B^5jN���->ȼ�������A��)���S��}f�R����p����j�����/`_�p>		P��.��}���1p�`�o�<<���H5���~�<~:()�E3��脗@�-�x��l�f��6|_��)I�2��Z�C���v�ٯ���L��R�z�;4������I�v�K��}���_�I�u31�<�yWj�Ųﻶ/��8~��2����`�/~��uP\�zI��V���!������V�����uƁ[&;�:�if2��|�QSt�,&��H�g�0�
�,b�"HA��2�j�����-�j�c��+��h�E/�ݴ�5��Q2R��� wcD^� w4`ö������<��p�vS���#}|�Гd���ɹ�'��ђ��*�k熪G���#X��d��tTUS��Q�K��ܵzʞ���*�!AӀ�Ѷ��6v�S/ɻzgn=!��f�%�
��H�������J{Z{.v.�C
b���4HhMa���O��i[�׍��Ļx�ƂU8 �y�P���M��B!t���78�����*J�T]�n���x~t��p���F�5K��]ր.<�dưJ�S�l-�ṧ�k3�7���D}N�ϨNF�.����nK����8��f�$��l������ܣ��WJ�ڍJ�Vl
}�I����bR�
8M�.|��1�� ���#����sN,�^�z]��w�w�E�kfvFZ
>��|��C�>�B ��u?�XxhޯəI�4Ĩ0�c��x��-��z(�W��?��BMr�I+�:V4yo������H�V�;v�<x�wL&;�Y��E브�x��$'��X_[u�y����>��p��
���N��� 	��3m�c������֯�������[{��_09�2��2;��$�;���[��!��ƶ�G��p%y*�c�m�f~�6��?@Z:>�B�C�W6(f�m�D<t�yߛ<�ӝ�ǁ����JTҀG�k�xr�~�:��C�xb���ܰ�a���r���n�ޥJ�u����љ;��P��{�FVؑ)���g�ʘ�Ε�������y��>.��V�e��1�c)wM?^���j��y��^S� �~����L�}�F��0�����j]++Γ�
�
ɷ
z���5͇|2�f�v� F��W�ű��MrEH�6퇇X��J�M��T)A��Y�����Z$c�@ф
��O9p'+��Cz؆Z��M�-�\S<�x/
��O�^�j0-��nZm�0K߹w
/b�X .�Y!4��&2��4�t�>��*
���a�wY�|1V�1�����3y�B�#V����P�M��OA��M(�-H��8�C���̾���eV2�v�.��f8���'bM� ���3!�A���@ӗԲ+�y_DݰZ8�O���P�0T�Š���g[��T�_�w�;��4nj�����+���m��{�ﲪ,�z��6�H�ujP���M�b����7f��z}eHS
��80��vM���X��繾��o_2��d�N��خ9X�q�gIލ��=��,vTz^lxYq�K��i`��
����~M�z8���Y(��m������0�ʿ�"�%y������Q
���}�?ʅ�F����1Ѻ��r�Yt
"l<	�<�k5F��w�?l�=��Y�m:��xK-�;������M�l��w,�/��ѧ����O��-��p�Ss�M�_�O��L�!��>���ȸ
���8J8����!H���q�Ē>�e>�;z�9����c�RDt��s;_� s�c�V<ڼ2>��P��e߼�'��g�����_\�f�����y4:��M?^�ͽz�'r�eZ�u����ܭ�#ځ��h,.0�$�9G?b�Ti'P��/��=s˕�QJ�k������Ϸ�ה^Y,����c<�Q^�!��7�v<F�œ��I����wJ���<e^}�O�����W���n�C��Ŕ<SR���������s�V�,Y�׾kL��N`wi�K]�yn���D�.ǂ��b�f]h@.i��}�j~r
�x��!�[�Z#����5�я�#�1 �kD��<z��{K¬.<Ҏ"�x{�c]Tz��B�b��o�J�~VHm��]Z����2�I��'N&zA���u���z2�yz]�<S��Q���R/�xJ[��a���Pj�u$���a�-6���LY/kF}��94�`f�(�	��q��fu�������^�Br�ՄX8�_��AG�>3FKC��Z:����t��V�^N.Ɯ��Ev��6��W�m
�v�=a���
)^��< {����Ġa)�;����0�.�wob�OTܛcn�ZG���Ğ-�@�����;�`{�W�ȸ�H�4<usrڂv����c5�?�$�=�"���67���
Vl?QM��۹sJ��@`��<�UӍ(V2�� *´�W!�Ȝ�#�_�\+QL�bc/�X��vo���T�&�էˍ�'~>ovѶ��T	�B6?��ͻ�*����$6DE.���z� f�ux>i�E�OGn���Hc���,;�Hp&�W\[��I9��3x������	����3^�]��]��-��c�g��o��ѯ�:�+h����jC��)����eUdl��-Fqdc����o<���I�َ0~���Q|�Q�;��t������)u�b,Ɲ�kA��hr/W�bP��I�&k�A�6Ħ��c��h��Nf|,����ap��+]�?��q5
.ɰ ��=<��x� �!^>�U$:P�kK�Q�+>�29�/�{X��� �#��gp#��s]Q�L��k�z�=�"�8�t���H_�c�&>���$V6}�@Ԝ�Q[��&��'�I�-�#[	��S[g�+����NN-����UP��ގt�����"_�
�C���/a����$����O@��K����*��k�p#��.���yF���<��M/�u�w���`�8�=���$.X�x4��T�A��cX:��~M�[�oH6�VVDZ-z9���� ���*Җ�����}�od�ӌ*΋���sz9)`�x�^g�J@!�g��^�s{12?8����vb4%�P<ޟ�U��M�-;�-]�=O��+�%�#�͝0����*����;Ω��Z���13�H3�WJ�!w����o>�	�9)X�b�}���*�G\2�>H�\����{?�*�Xi<��?v�ć�h]�ЇPH����oW� ���c:�[DBU~d��\������O~<��C��ǿ+���%���U}�t�/|9"u6�q�r咁Y�&��x`�-}��f�Z1�z�C/&H�<�A��(�-n�R���=��&H�;&�&A׉�bA�1��JP*�(�w�f�ԤV^����VF}8c�4ƓVYQ2�{�ޅa	�"�O_�xv%��>	�����҈�=�`�x&`������Y�3B`�D��Iz���Y/���!C�%	�']�N>.��	���Vk1j��U��(�����8.JWE�~��p9��p���o-���0lpx	�i]V�і3����R!��K�c��`@+��DsXd�܊�}h��ZV��
�uձ����)�F��x������Rfa���r0:�[�1�$�}`L�GF��'�u�m�u�E~���ܭ��"T,�y���:bo��iO�G8{4���G��yk;D^�Oc���(X���LzE�w�%���	ƶu`7Ð��Gܩ���y&�ɋ.�=�'
�Qɧ���Lw�J�|�mh��)/i�vw�w���H(c��+=������ė��Z�ڗc��5S�S�!?T�cX��W���������ʅ68pB�'Ä�0{�+�}(7��\%*v�.�7	6J`B�D�_��4Oj2��jTYF�ž
�)���*�8���:�]x���&;��*��Y�I��E-���O�څ�L�:T�z��|��TA��VPO9#�'��o���[��K��	&���&�#Ϳ��ܻ�)���]��d�	�ZkN	�\|u����$��q�j>a�w~�륹�$�r�`���^�a��W��+�����ɪ��׃�8���׹����%ы���mt��REͮ6��0���1�����B�f8�"&�V���*xV�+-]��#S�-�V�-op0�p����s�!��N�:7��Ꜭ��]��q/��R�P�oR���+3�J��,٨����'k�&��g
�p�mPs�6�el~#�߯�����4��R���|�8��B�N'�I�t���O2��2sG,&q���c��Z2�þ�Iᗿ��}k�ȔM������׳�^E>_�:��i"Z�J���|9�L_��_|����FD��v�����:gUwM�]����O�!>�^���/�Ǐ��s��3�W��m����("�W�����á�[|}c��ܮ��D��	e��Qc�R�>r�.q���L��:B��D��S ���U!C�1�d�;���3c���';�ǧ���h��.B��q2��
��y�U?(�D�n;��i|Fi|99V����27�u�>��_ݯ���W��#�CY�k��;�c�T«M���P��9�H��=Q}��ɤyF�t�I��m:XO�][��.h�5Ƴe(�s�Q{5�@X'��[$[�6%��x�k�D��’�nj���W���Qi���;
w��R6I�v[���p��~�ș��z����Ɗ���3��m���=#f�|���+]�=�S���D0ͅƒ>��v`0~,����n�����Fh�ku�6�%���7mW�(&�=\�nj���Oo	ޛ���~���)C��s~��*F�`�����Ex �����tE'��כ����?��OC"��'��DQ/;_5.��.�(|���I��Ki�����6�h�u�y�P]���3Ў�<�����y�L�0��W���Mf��m���q�$�zRwC��b�u���A������(�ԏ
T���-�{r`��~��	oo�@��v=�IQh�5#����|��C�$	�]��~�el90���w�9qa"�1��z��"ܟ��3�ֈ勸qU&�C@��v����FL{��wL(�持v*)	:��?���0�݁��x�ot�Cw�1��#�c�€��~폲p�R�jj��pDGgL�}�t9~o(�_[��P���l(���J�ז�4��� �
e�o
%��R:�Kf���Z�z�%��~?v:�ϱ5��?h	
V���?]��l�/�U��:kV����4�='K�;��?.{�j�:
��7����>�����j���u�IA��C>W�)V�N��'b��k��|&D	���O�j���U�?>�G.�ӄ��>��x�3�^�~�J-j�o��l�0vz?�����ښ���"Q�d�{�\#��a�a\a�f�S~�Q�U"v+��K�j�^�#��`� |8=ѻѴO��8���;��6�vC@�y��M�����z�sM�/�{d��R��q�$Eg�Ӿ���a���;M��I�oCR�o��<��ӽ���ȲF��|���>�S�`0�����eL�����pE4�Mp �.%��OKIN�y�B-�mJ.��}�\���Vi�����X��Q��cS@���ð�����)&�E�ל�p�C���l�hI�1�/�Sx���Ǽ�m�ߘ����G5'p���zE,��a�[5�1*�1���j.3�s�{��?���6�ڮY��X���p�'��Æ�7�J��RLc�Jܾ������8V��
��K�_����_��ǣX��c��6'�w t4nc��w�D�oh��8^��\�Qv�r�=䵬k��L��6hD1�$�2�jK��4܊[:�\��U�HO�w}�Jy����v^�E<nʹ4�=Pi�����߮Dk�dZ���(��̃���`�os���� ����ӿ'�7��N��*k�B�	𵐠L��R-�u�G����(�kر	�5��s܄����u�%ֺY��w���nĒT�/� �p�kZ�R��܀���2���P��lʷUQ+8=�AP�%܄���Q�ߥgT=ᲄ�i�
������C��t'6����$Q�}Ỷn������f�������=*|g��f���'h���o����
�y�5քhp����^uf^��)��y֛R�E_�"�)s-L�z��R[r����n��dv�Oj+ OT14����4F�k9�t��A���$,sۊ��Ǘ�PSEh��h1���A'
�0�z����g?Y@�YCB�cɧ��f���l�9�t����:�|C�Wx����'���W|}��['����vy)PR�)u�z��ݷ'4����EH�?��.�]�s�S�r���`���wU�?bW��\/CN,iV���Es2s�Hkz�}Y�b?�t���L:-�_�#;-/��=� { �GJ��Z,O7��ڄ�}N!��S�^��{Φ�����195�wT���=���^�'�1N_O�h������{O�~50;�}����rV�R��� �9-��!q1���P�4����B@��P/��P�Щs�/�����Ƞ�8���o.��;��
�Ѐaslܛ���Lz���VI0[EX��XXu�$�}�kx�`m���
�׻~{�3���j�0}dՀ9�'�t�O�L��vk���xe:�]$ ���Ea]5�a�d6�h����e�t���rU��=Q�|,C�W\�zB�,��~�G�D��/�3ˌ+�]�GhK�%�ڥ���OQ:�k*x������ϔ]�C�įj@�#"���z�����?���Ie'���Z�3��B��2�A^��[/�Td����+�oWU�V߼\�uV1@�%ěh����~��t%F�V�7�[��0��8��W�K��Ǔ�TI��*��a��c+�5}|��T]����k$�x�Ja����V��s���_Z,�\]��Cg�N0_h��b*���.������1ɟ?/��E d�Vc����~�����QЬ�mܠ��,�r�n�^��{w�����S���uI3���/`?�-W�,��5KZ%�͉���cZ���
����gr���+Vp~$���?N��~��0��֯���NH�ST�ڷ2=}`��B\&�~2��Ú�擔��J*�
{�n=?撵,t}y��y��åT* o�.�����~ɡV����?B�&�76�rzS��Ż@�������<l\n]�0�P$�F�.<��7ͳV��	�/�� ���K��7�|�=������!�̧��%;LZ�,��!j,9�����ė�Ң�m�6�?H�Q�!÷��
�MO��/��$���!�3,���<V6.R��ez_2@p�y��AC��}��#�v¥�	�[�R�%`��^�?ν?'_t�"鵞b�c��c�t�Y�Ч�O�6���7���ԡ����`��@,��@0^ʏ*UA~SE��,���=1�W��O�A�8,BZ�X ������5;�3��)����^�U�3��	�H6*2E����.�(�q��mr�m&й��=���rA�U�����<i8�P�n!{�<dRB��!��}Y�;��5qs�a���<��z>�ʎ���$�YW�*��H�fv`]����y"lEd�ɵ� �,k��@�zkO�u��	�yL}�C7b�?�k�.��nU5<�h7µ����X!�K�Ru���e�־Ɵ<@���h��7*Uw���ox6�p$�c�4���_�hZM��=�%A���"�N{�v��ӯ��w���͆�m��-��i,�?
'����l�t��oƒ_L�'<q�i�?���Y�/�Z���SX�T�↓���'����'����|�L�\����Y3���.��R��y�r��y��SGk�~(�_ļх�
���P�{���>X9�����
�[�E�|\k'5�G�hpU����}BO��͓�>,�u`e�X/�j1�]���
�s�2��,N�+��J��#A�9~D�ͨ�gMqƇᒍ�b?9ɠl�t�~}{��[�(j*����� (��pE_L��
d�~L�~�j��Nd��5|9f�Em���J]�����$�ik�+�^j?&n��P�`Y�T[P �75�.Q�ZE��~B3��{��oQ�����+�b�7J���6f��A���ពC+�K���c�m���x��`���#ק֧8Վo�� ���4�Fs���gh&���HXG�+�0i.]/&]���ɦ���U=���<��Q��H.PTh�_JO�x}��.�e=cņ�^/�A�a�^o@�X��%rA���#~,�bN4�q�IXj�Ѿwl�/����C6��?���:�kp�d�,1�\����$�u+GL�%;Hž@8��+���>!_�Ǵ��^�m��S<(��Z7�5�%�ޭ�
�]��9�+S�c����#�/�˯b
2q֏�o��?a��u�����/���������hHId���b���_�������c�K�4��/�cO�}�n�id��J"s�|
�r�����w�(���~	�@d�M����ї�ѝ$�k���kJr���.�����=��K�K!����A�<;�~
�?�46Xst�����2���ε�=-�iK�h����ۨ&�I��ײ���j�5����+�N������/���2����o�*�
��S�E�~��G�����B|��6M�n�)�C>�m�C�����9B��6�U��3e�)g0c��USG�1���� �v/�����-�d���}�$k��L��j;��F�7+<}�<�K	�/,�.,�y��t೭9e�!�5C�s�EMw�x������{*e��Ҹ(�f{߬w�T�_��������C�ݍ��"0�f� g-��e���d�brVޔpH��G�}�o�;'7!��0�s�-#{+7c�� e��F!@�_�=�|ӪC�q-�:y�j~�۽���B��[j�Jp��p��CH1n7������B�|��P'�x�Ki�K�X�����`H0�dK���e�;~���=to�D?�M߷)!���J9��Kf��.��Mո��.���ǏBt�y�n������&��^^O5!7׷ȣR��elN���_���^�'V��L���S�3��������<
��%�{��P�F�9{����9�h�ՠ���	��k��:�s/=�-����C�8z���ܹ�7GZ���=���<������~���(K*v���q�O�F�	^�������AF��lU�ņ�)B���szUax�H=��;S�3Ӝ�V8-��c�����q�CcUkU�"�yc�G�F���fed�)@�q-�L�a�ox�hq�8Q���b}���G��Ipa̻�3������Fw��W�u�:��Z �j�'-,�8��:)=UQ��}�o��Hr����b�Nl�['´�s�Z��ډ�����6i@��/^y�g�iͻr��|�" ����WK��ͼ���'���r=.�R���RFT+7��D�����RЪ�Bȣ�3B��4��ک����~��ZΫ�z�y���2���Z#2��Xе�|����l��ߗ�稸����|��d{00H�4�bJݞ�H�ل@��I��j��R�є���k�=v��4�����J�A��)}JUT=_���4Dߔ8�p����;O
�c:7��ͭ�ͫ�kbA]��p�8#d;�/V:d��_q%��aޞ�ۦ���{�X֤~܀�
�n�
v���(Ĵ�Ҧ��C��$���M�3����q*���U�:��5 �/{��@��|Z�/��H����X����Ȅ���R����'`�9>xN��f	�	ڣ��A�C��>?��$�b���Zo?)���v�����hD�m��v!�{�W��*�*:��T��Sg�?�|���/��>���I(7:t�x�Kح�֫�u~�N�o�6�[-����l��ii-��s�r�����On�O��?��?���v���/r{��/�v�|1�ᴁ͛�a"�M[fMy�-ݞ����+J�!Ga{9O��y�!�[��ի�79�+l�A�c�Ls��m�0*DgǬO���!����R>tӤh��n��;|'8�6udsbF
���j��e�)aؼ��ձ{�3r���'�r��*�
���`j4gj-����S������ЕiK?����d⥯qRf^�6�5>�`�&%�9:jwahWA�)a\"q�_%)*]�9ħ--��^������S#2^�5��4��z��:����ˤ+G��;��+�w\B�D(щ�`l�M'/��9�xu_}ZD#��G�f��fl����k���b����ň�K��'�+�f�4˨��PA��|		�7_T�B)3>���s�K+��ZT�m��8�߯����by��S~_�h�&
(��z
ݿ�w]�w��$��=vuѭ������J��d�>�$ZD0�9Ä�Y#������}]��=��?��f�~��'r6&&x�W��j
L�u��֌!�5N76�f�Jy��$��_��@��K��7&z��5�>����`�=��$r�]Jɉ���׽c�P��d�YZɐ�΃1�
�r�;�.[Sk��I&�n~�yTlh��Jc��a=��ٽ�k$Y�-�H.
�~��v�����H�"��ef(e���;��՘O��՞�t��J�1�rz��TVH���	��!�z��7,H[^u��F���-l�� 44(��B��nZ�P
��H�LϒFat�@Z�#���������MT��%^�f��̹���u�׷zL��'���ߐ���o�VF@�\�W���s6���K��>;)
������2*E�*LV��O��
H)���x��䴼R��	��lXdJ��D���'��h�E��˜����,�M"�,��/�zڧkI3�;2�1%1���(�t�$Wúx�!b�j��@��I����[KBEj�H���JwRޕ�Cx�t�FT�[! ��m,�V��қ�_؎������R��c�����O�㇞-5����ڇ(ț�J��`�w����xìx��
o~[.x���r�m>��3_n�4����+�ȗ���~�{7�a>�_+a��O���ƛ��"�`>e���ᗃk�lJ&�f|)@��FDn
�D8W�h�Zu��U��|U��) ���c�1I������t���Ѓ??�Q���s����>��yb(��O���m1�e.rIm��U��Jf����.[��k!�0Y��İe(�����x�PzK�@��\μ�����ʐ�e�����YT._l��I>H"Y}���5E;�Zp��x�ľߑx��[���=�!��^�|�x�(L	e��7��f��q���OU�/U�;_KX�o��L�ʲ)@(�X+�{�>}a4��y�[RrMH�cX��7�.�J�<L%x{��׉&e�BG�
���l�$�Зr�øj�aueN51�{�x�b�e��e
_�|��U�=?�AxLJ����Z�]M��ȝ)V��R�����M5���N�R\���N�k��o�A�G������[7فe��G��GJ
�ln�Y
���ӱ�~�Q_l�1�w[���ir>%̙��e�19��2&*/�Om�M����r��������(����
�<��BG�2_`������x�u�86���O$���m~�C�K4��Ⲹ}����ZB�Y�4���4��xAs��;B�F��P�y����-\^��h���tuX�W����,:p��3�VX��ա�m�	Q;Y�6�	�0m���/%��v��BOW}��	&J�[pF��<!�gʝs&�X��rsQu��2��*Vdt���s���~����p���,(�`�D�]�q
PqTgy��Ƃ*��jLf�d��w]��P��1�;��(y-�
t/zV�8(�U!Ix������LP�J���F
R���>W:��%�G�%΢��u%�S�;ApQ�
���ҧ_��)oFH+6>&�&-[�ɳ�6J��yyͽ�g /���+
����B��g.��eB-t$�)�����rי68tcߨu�ݔ9A3:����!�x�$~�&L��JHR_�{�jOf����Oѣ_\��ڋ�p�����*>��@���C
�e�����m{��",w�Q
F��t8�H�s��`�n�8��6�A������ނO|S����)���-��]�sE65�(�$�>��g
V�~g���}��AI����%�P�(?8���0qh��j
�����;��/�`�f8f:�F�̧�� �=��5�NOl7��t�ٖuno������,_�nԊ���`��}_.����X�f|//���S�<Vzw-|>p�fG���;��W�]���.覾D����%�я�$2�b�w�:$L�2(������Z��x�o��O(�a��d������q�9���=k�����{��]�SD�;*�<X�pT(i^��6���8�Ak���N�k”����í#��d�q�l�o�7��W��xE-
�I܄�(��1N�)@>ܸ���Ц����_ �ĩ�	pd�#ί�.V'p
�WK�%�?�w��e��z���@�.�H��ҏv5-�$!|
YI�2�v�]Ƚ���'6�	��6��qD:n<n�dڨ�����Fe��|L�o��ߣ�*��V�qǺQ����c��`k.��aE�8z+�5�%�e�߾A�_�2�v����iR���2�J�`����/�&�����>��{��uM�����%N.�ş�T��P;������}�R�J
*�7쨮��6j�7����h���e����/e"�R.�'|t��,?u"�g��}�P��Y����Á����~B�m��iy�_vZ�V-$E���}դ�h�o��T,E���
o�{�+�nw�#��������^4�=�E��|�v��_�ݤB�|v�K"�^cy�q�G]���6�J�A������h2hG��W�)-Ԙ�̋Fu��5�r[P�7�4~���	ٿ�!��O4�?��r�Gc?�(7z�әfx	q�8��m8�*?��n89���>~�`�ްRw���pzQm�Oъ�h`�ig"��&�fn=e��J���� ���.���5��ZzeҜ�|8t�'D�3�&�K%�����z�ѯ[�C'�3��]YG���}X�PC�p���(�[�i
t뉛X^�gXO.6�	�AQ���jl`��U��U�#I땊t�2�J;Ww�o��*���l�@���ݣ�R����b]ji� �ms{��Y b�r
v7T��ƽ�ݎ��J���p�MupEp�v&��!���.F�$�:0�1@U!%
5��4��7p?и1Nml�]�B�3�A�{��NN/ɸ
&־�{���
�-G��	P��Y��Y��<_;�	��P�*�Q�X
i"١�b w��~��I��j��jk�����>|И�ɇF�2�>�
��-���z/��ks�יka�O	�W�N�cA?�?kX==:��
z�J{aY���ע=�L��ś�K&���TDp��Kj�BR��z���D�T�V����a��*�Q�:�K�zty�$v�E^��U�;�^�M����i�:M���Muu�E���D¸[����2P�<ڿz�r����|�Z�\1\�޺��}'���&U�Q�ά�۫�y�C�ծ�ꪫ�
�媵m?� 5{WozQ`j� �ܩ��8��!ܥQ43�`�W)5��L�J����S`�` �0�d-E'0^֯ob�T�t(�ܕ���K�",�4�p����P��y��<M��6��=��H[�]ۛi;O����s��~G�KRV��v�.�X=����R+�^�#��jOۮ]� 
�LʵD�=w��y����*X�j�-$zд����Ԁ�b��D��8�%~8~=r���(��_�R��7�/�`�3��G4�NH�ﻙ�O���o�礁���Y{0�%f�Ƣ&�%���ZС3�1���q��y�X)�,�L�	h:�Pp�[P}~W�{X��:
]J�ϣm�B�o�C�/�����?ӿ^^_J�ű�Ɗ����0���¿�]�W‰���vÃ�&�_
Od���#��~J~~%S��SNk����EP�_�Q׻����_b��'V8~�Q��G??�����K�s�?���W�n|�觝Se,E%�2~�b���˻0�#�\�$���r�[J���'{�Ї�^Z4��L�#��U���/x2���R<)�$��K+!]�*�l�ث!':�&zׇ���~�xJ��2U���e4��ᰙ�*�xwKl��t�F����4��҉�5����=��}.W\�-��@i��>4����a,{�����-�b�(eAQs�{��7[�*��_7�k�0�Q(CEa��TO��8N�Σ��X|%2�}9=.�V�u�Ys$R�A��X(��6��N�[��KFpHtSW������x�I���ү�)��~�w)�	�2y!��i��,��>�A;_�Rp�c�pYߥ3C�"��mi�J���)˚�����B�_�#���� ���!gnyI0]�ӥhz&�:�f�uE��I1����y�͝Q��;����ս8=�Ka�ɫ���Ur(�CB��^�!���ڄ1=D3'�!y?,�y��bq���a�Q��k&�rMuǮ�|{������(��f`�*�\��*��y+WѰ�I�.�F��:� a��Mk$��
��}�}��Fӆ����g?�+a�"�†����oY���ֆA]����'���|�fE�4X��6l��	���؆����(���Hl�7%�+�NweG��1��A�E��2�BND9[aD�I:1�*D��`=rR�Z�o1
=�rR�L�ߨv�N����='�`F2�<��mQ�B��jN�����d�gp���y��6ʫ��ʁ�����B�C]�-�}7F��FR��Cw�e;XH�hfP7��+�@L((V���<��<A�9
�p7�=�"9��λo�xܔ+���8�=_�WB���R^қ(�W�>�ђ/���ڍ@�����׳M�Hr�����r�-���̘��;�I�a"Z�	ܞح��
x/��^��8T���,�����[7	u�"
�a�v���8�q�5ٹ�o��ӂ���u2����aY;{·E�̫ēc(9�~���4�JŔ��H��d�]�<��;���B���i��GBe�c�E�ͥ�� i�Kc9��@WY�*{����OI��QK�8�������ݡ6�*�/���Iv�����$- 5��K��%2&�Z}��ȵsNj%h��WM\��=��w��+�K�h:���_
���
��`��=ޣd�b?*�'�����P��<�}A��kA��5�&�z[
�n��vw��KD��=���E$���o��^L��c�?�@���j�� ��D�9��ŏ�xv�����O-	\$�+EkT��r��	�6׆u��8N��&�IQU�޸>t`�����Քl
�̗���4��'�G(ż(�u�DndG����sؾV�yӴ&��m�,ʶd E)���hau�뷻��[��Ga6csIi�hk��d߳:��j��0����^��l]�J0��z��N�R�#Ճ3W�MU�!E&ܻ�"V�`�J��{%<����חvls��-���6��{l���E�4"�!��RO�����Y/Q�Ӫ�w{乫E�6t�5F��~zClC@�
��T|A�+I�.�W��a�h�Kx�,����X��1�m�FE|
���KK�]�N�u��p���ݹ�U�|iC噴�0φ���}�		V���غj!��%	8�oY���]L�ҭ:]S���9ޮY�NmOA�d�*t��y��%�����Ӷ74�o��(�o���/=}<�;���¾��up���I�4���� �����4����$ԝ�_9ݏ����t�����<�WE
�(����i�E���h��R��@vn.-uz]���z���p�ף����)��MH�ϒ�xU�Z@8]�[C8L�����4ί~pB�c����.S,-Pwbe�j�-_��=��O����z�1�
Lm�
?k#LL͗����Z�a+l*��Q?�Z�����+q�ߴ��b���%>�_���%�ǭ���E��N4���?�������Sg�+CQ&���t�2
J
�m
�jp���"d�7)���p'��u#�j�Ӗ���{=���(�������I3�@�veU�!׹-r��aP� ���ƣ�^ť�}���,����c܎���#G���]���=���Jh��hl�J/�|���ɠ*.����
��~��R��;�lr1ա��E�����H�>a'v����:Q��g"���aE\̦fM�+��D&���cH^����!����;�vhɦ��(�z����Dz�(�?�W
��s,��c��\�}��w����_�~���<�Y��~��~)Og��
���(�YY�;>m���K�+����Т���u��WC#�;�7��-Ϻ>�M{����)�h5�e8򝏼��:��r��YЪ|�9;�@��$�[��p�>�٠��}>ս>?#s�)��ȁ��S��
CuM�xW����)�h�>�:�����og�>����]Ӿ�Ch�i���Y	�m�����O!د�i�h��L�������[����U#D���^i������9o���J����#�(�a%�f�D�t$�Oo�_�?�qq
����q㞗����7զ��݊�y��/���L��<�%
=<?5����>}��Y�}�\�e,פ�������Ͽ��|.g�퉑��2�/��'X�72��u*�Y�k{��P�%4��"�)!��OFe_��
x�����Ң�>��&l'��T��n
j��u�<��@��c�DJ�oU�MwD1��q!&l|C
���Xh��J,郎�1�.W�7�vh����H�4:�Zv���X��;Yڥn���qxQH*�2��ؘy�x��$9��Dޘ�A�+e���Y��"
LT���7�hO�d��e^
K:T��3R���#V�mw�,m�g�M��zK{�ଶ�fNJWC!��%���:0������c�}�6:D��
��09�&�D����>
�ZK��g�����5���Hb��P�tܘ�.
nmQ���8U㜆����������$�p5w����|r��G�K�$E�[A���
d���I�a��k�/��1P������mB����b
�;,��{�Z�$�!�ah�~0�߆~ƪce��c�����4�J�R�FI��� �3��:�ÕzG/�fK�a6؝[L�����L{�1��h��E�7�y�����@��5��7v�g��/������yU-���j�֩�1>�vD�ңM�:� �'��҉M9�����߿����CWTz�Yh�ڴX���`�4��wA
�I\�E�3�;>a�k�\%X�N4|�u,��N�J��P�Ms9�n�d�H�ѡh~zp�uT�%��t�X�7�)���5X��Mw�8[:���w�]�?[�e��-�oW,I���a1�/�>���q��<BˡDL�ۡ�5����̼ܰ~�s���*j#@U��n
����a���|��.���g�M�Y��DN�\)̢�O�vӜ�f&�
و7�(W��cL�a<�dyIA�@P��C��7�W�<�zP�/�#��6���<c�����2n��^Sh���
���7�j�C�͙Q^��>�O���ƛ�z�^��<�1��o�
_u!��m2@2;��A?�i��8�8]�9��qYxz&����f���ݰ�H`�$��&nj�7|�c�<$DΞ��
0΂� ��
�Ҭb�ڑ���M\�";�D�[���&
��~k��W\1q��Ǒ�`^_�c(�W�F��Ϋ���)x�*���S�&�<5B_��'�U_Ϫ��[E!+S[��Ԃ�`�����.is�!%$���BY=�U(Kk
ڰ� �L)����7����9!sj��Ā�D���([R��!�Y]ז!t�U�rI�qm)Ѡ�j���x��Jơ�[���ʴ��p�+�d��٭t����	Z�Y�M��7��ʆL��\<[�x�%YmV-=�����ڦO��i��舭�Ԗf�1<d
o�R�t�Q��٤�ڗ��Lr#���j{�"�5k&$O;|_H@���n�ڪ���m�/������9��<���ߝxuG��.8s��DBa�T�;�R!��
��P�h�FZރ�^��z�B�2�H,�#�u��]E�
��S�{p���x|,t��V���ˇ*&�X��H\��5��sNx�O�D�xɞ��{h����ԕ��O�e>f�\�AT��+1����.��S�Do�p�?p\��^�>RI�H���
�f�S��v�گP3g[
���G
�<y�wh�	�Eb�*�E
H�y�ԑ���\�̬L�&6"�A�1��ך��t�;{�kE�K�v!rRoc��.)l����D1�d���A��|0�Pӌ��;�m޻ئQ�����q��z�}^��QK°.�'r�{��� �(j�%WR@��'�r*�ؖ�nCo�!5���R�5�O9W���g�
<�T';}��KRԁ�7��\t{�b�����\a�x�E\^����U
��V� "�����\��k�q�[���O"��!,��AۓҺ�"�����Ҿ!�L�]�J�����x��s��G"�?D��V�_H���{,��7M�O�1�|c���e�@�PԚ��{A�U����������c%M��,ʻF�_�1���b�g0�m2�I�5ʗ��,���~D�>t��Py=�~U:,O��_y�i�X��֗��C x�6���]���@���CY�M�y5�c�ܼr��-��Zbn|">�}��~	�_2.�w���Wɘ�a�ݝ/;B�`q
Ƶ��L�F�d6��|�f/���|r��FD�pI9A��/�"��i�`��B��~���rD�_��#��d�I��RH��Һt���>I(j�b�d)Ц�
���DŽ~����5��ھ������׵�Mi���Mw�J�"�����1�m5�g��7q3�䗊������2մ���
|��$�7+C�+c�:4‹=I�`�l��E��EC�E���7'[�ظP����n�Q�}s=9%�89��Z��u<����y�F�d}�������;+��4��"�V�@�dj�T˝IT�e�G������O�;+(񌋲�T�L���ep�OO8�_��{��	?`yL^-f)�鉪���gܙ�E�r�+�.���
��	yڛ��\��ˢ���>�E#�Fz#cl��rנ�m5
ڗ�lr�^/��R�#V��k�I@�pҪ��lI6=捍@�]�K�L����Ӎ�q��D�턦�b��ח+�\�����d�=�kG��0��ɁF?)^�N��ߑN�Y�Ο�U��0�����/Z$�tnLs�;(s|
^�w�&+p�����шR�y/ �<���=��jƷ�,�y�6�CG�W��O"�:�I���^���z�F���1g�ńr`輀����*�6�/w�x>�[�g�#k󝁎A��Y�������U�/+y^�0��r���0�w���)G��ۼ����&�2��|
}��o�z���W�� \�tq�mys��|K̲���*e4�����¥z�8Xb~eõ�2Y�~�H�՟��y%�����
D���C��xl������?�2�')2T��IB1WW�F����"z���J��n���,�#��	:�4\ݜ)2?�X�(�!*�`UE��4~�B�`�>d��<~�V�l���S�_XX��GD��"s���'T �mW/��/�_l�ܨ���̘�?^9�j
/�|�뒸�7᪸�La�uV�.����^�&B�����A1�N��;�@r�/fJ:�!l�@�hy�����&��sQ�H�w7X�o�)��)FV��o�A�o��h������ϰ�eA�cJ����k'�ֻf?���w|���������w| �w����[���ؿ����p�v�w|:���N`4�ν�r]�!ME���Q�B~?��Z��|�Zֵ|�8MObU���-�$=Κ+v�y��v�σ���1:�ԧ.$D��m����ܛ6]z�1iM��.BW���;�ےD�r_[��� c��Ru��Ii���̐������KK9�$��6�a�@�)zo(6��	_����Ks��f'�� b< !����ڌ���ŒA����`��x��Ɣ���3io���U~LD�.ӽ������x�ߺ�S�=vb%2B>A��E��{]�O�g�����bl�?#"�O���љ,�C��E�����i~?��V�����X�uB?���}�ӯ��@~�?;�G^����gg��a����_����U��c�՘���M���1ѿ���Z� s�O�P:��������4�8t�K�r�r��q�O/�����~u�����:�?���,��2�gǬ?�+��^�^����Wt%U]�́���9����=k0���{N��sߠ���7T9���>�s�5To�|ɶi�^�J�n+��nG\%���E@^v�:5��oO,:�����ĸ��6*���4��վ�����8޾�
��x��p�C“��Z��h,�2ܯ�G��4���v`�����|�5���>!Ȅ��GX� @_������<�U6�;����Ÿ�,�8
>��o�~jkA�@�F�Ѻ\7b*"�`h����Fz�;~�	'+��=G�h���K��� &��X|F�~����*�L
�0�^�)��T�\�\��#��!ݥ���O��1ӆ��8/3��+ī��L-`��=���j���q�p�D��Ƌ�j����]�VԶV�ciĈb��ǐ~
��ɨhU5 �k戯����2;L Ҵ?Y�þ��Ա���wE��3[9Ȯh���\���Š.�u��~��w�
��s��z�Av�p�.�4y��u~q4R)�JD~�����`��C	�-Uu�#2�m~RR=����xb���gr P�����(��Me:X.���-�c�	sA���}J���'��cM% �O�I�'v��yq������;o��+�l	�O���zݚ
.y���o})��؏��R-��Ie�Jq[�B�JBj�+��eɳ���C�Y{���Ib��fV���t���=9ڍ�o��-]�w	�;�T�KF>���ɠNg9u��]}��"���/�ȱp��%�B	sĸ�&JM�����{	*�M�00�AY:�����xg��ڟ��������)��s|�q2ev��zÞ���h���P���Cn�٧ݚI�Zy�L������|.ƽ�*�p�7�U�}x�z�-#�y'��2֢���d�8�(��5��u���_/�5�pc����=�&0��-��,RE=�U�M/�c�"�h2p�z�yad�5�N�w]�y�U@C�D��8(��t�y�i�Ό�"
.�ٹ-��;��쫦�D�RT~�D)@t�:�V9��NS�����85�����Q��V+����x�A:Sm_��VPVY�{��*�I�0��ԡ�Sl�o��?�(�'���PP�T���-���=E�����s�r����BQL7�?��%���Ӕϱ����"<
i�����n��S�G���Z&��eYV����'m��$:E^*"y�Bi�x}k�+E�ż�(5���c:�4CX;x��$�<�ȗ����w�x�%T3X���5��P�u�(Yy���|�)�ş�j��xfS��+Q��JU<�K<�Y�s�{~;Q�����?K��LU2�K]��(���\:�|��d��>�D��ar��5��l���B4�g��`4E�=�m-�r\���&��0x�q��v��^�	4/��"���_K��n���\�ױHV��R����c^�l��[����>o�+�V�=��.�3Ѿ�"�ܹ���j�>`"��� U����_���`��^Gʼ���@ ^��s����5�W/~۲Ʀ�߅���$�O���Lj(M�No��^��Tբ-��l�澗*���_�Fm��|}�_�!ɎxJ�4#�u��#֙���8�`J�<E����Dn�;B/�2�(��=e(~�;;��߸!�A���lۭK��;�f+�:@��c/����G*h�N�F�ȵ
!xj库���2�p��h)�`j���O=&��u��Ռ��Y���Y�K�_�}9� �պqn��H.om�k/��I^�fi�~��Ga���Q1vA�{�� v�5��P����i-A�RU�<���<�ZaF��0t�{5j�&�cz?�pSl��C�����{+@�y<�{j�2�D�;����oQ:.e�G��ܿ��!��H�X�ݭ���\�xnu���]x5��/�Db
ˏ�E�P����×{��%��ImV��D��ؾM�w���f��0�5����^�(�w�Q�<̪~4�kx�Y|���"AO.HN�ַu�$M�����z��k<gC��҃O/G$�@��K�E<���z�6�3U���U�k��3���㏗w�Z�Ƙ~5�m������R�Ḱo�nٌ
ɼ�9�SdTK:�S���rĩ��^��ۗ��#�(E��䐬9���=�v~�vxۅ��Bb���8�_��O{��ݟ��HV���Hq��wxu�~�����r	�^лs���j��U^����ط�5F.&i�H4�wS~B@�ި��)���U9�7E9z��P8Yަ/�8\�0����n��wM��Rʖ�k���t��P���O}�����=!�c9�&&�\��j��7)���$�c曎�w�ژ��S����ߛ{	[��.y�,��e��sF����`��q1�'�{��V�WBivzP{��MѰ7����hŤ�Nx��TI\�@س��ɯQ�N���ԥp�K�DOec��1��<
Pv�=��:9�u��Y+[|-^��	����{�EѾ����#Z��)�H����Ǝ"5�u��٦J��

�T��`�ut�~U)�kV*D\���D�Dn�"��I�3v�4�t��4)@Ґ�L��{�T�InD���r�^h��wnn�scp٫��ě=TUG��P�Uw�	����m���K5���r����Zǎ�S
�+y<ϻ-Ꙗ�ִ��T��S�v������1��Ad���C
�2��:i�r{��D�1�t���)�?������C�_@�5�`�}�w�8q���Ը��:�A��4�"�����~5��2�L>���o|�#j�+�Q�����k�#�y��k���K�O�e��y]z�z��u,b�eL��D��C|'�<�����bԽ�J>�u�݀�����ca*t;~<�(FL]狼��O�;����)�d�����K���`�����K)қ=;���N�5�>��IQkhH�<&݉�]��6;�k��H�`�җ�μ����g�S-Ǵ�հ�x4Ɓ2hݧ7@��F�e�~���-S^!�H���l/����)�T�ܛо�JqK��(��"U�ɿڽ�	ǿ�Y��m�`�-&7?�r��أ~nH՗7���B�n�H}�ϿTj����K}"��g����F�&T��Us�I#���C���د���<���;���>�G�_��n��@s��r��9�?�E���~-�����M�}cTN��;����C���9M�qo���ԫ���"�`މ�}ң�9{�|��R��(��
�MA��9kW�x��=^#�d}7y�}r$�-u�71�[�(�{R(�:;��<��]��v��Y����G���w�ޥ�Dχ9��|V�.;J���A��5C�)E�$]m�e��o3å�x^����7�C&���f�PQ
�%����^}�:�������}��.�͉���\�Rf>|�D���Un�$"9�n��91����,�r�AԒit�{�W�22�/.D����W뮑ݴ���x���0ݷ��5`�IA��
���q���#���	������-���[ʺy������E"�/%~��d&[���t^�a�¼/�(��v�G�z^��z#L�42���啭�'���������N9V���t���@���u7�����f٥%����Ur-�b�5�&k��k�7�n����z<B�K��}XJ'�*�=�%X
dgʩ֣yܯTD	����iW!
�5I3%�
 ���S3wk�Z4��_�I�J�q��t�z���
w���I�iԜ�CK��b�N�^nU�㝲X�K/m��äO��L���*.��m�WS�aۉ�z�2�X�L���2�3�w�S�E� וh�ɾ��P|����L��J,��A��A�6��j/܋B�c~�^�7:��H-A��Pfw�l�-⋳�N;vi7^���<ҏ|�2)�w�u"��ȉ�!�s|b.V̳�H;-���9k���v��y��L�]���`�m�0�}L�)���g�Q��,L��
�)�ܢ2�F�| �n�~՜�\�8�hwN-��|�U�ф���Y64��ը]3�ў�Sk[���|q��[����*���BE0'�P�����#��[�5=�	�"yVэG���~��w�.>�-�o ���)�TK��M(ӥ|�<<]2��lU�si`�L>N�2�e��1r���ť��|H���L܀=SdZڧ�3�g28T�u/]/�y��+[�@&�[�ZJDNC�3��i��]�m�'���
`�����voNjN��z�]z�`�)JJ��-�>}�4��k�y�Bӻ�q��6�M�&�q�U�|����;���8fH��mR�����=�3�tt8A\�W�Y�p�o�Y�8f>��͟q�^�m�w$
|�k��?���@Y��Pi�U�L��_�߮�b>���8 �c���V��^�y�p�o�c�,��-8k%#Pxm�b?��{a�
�~�.B��>���G&7�ֺ�-:y�$H͑GI��X�Cx ����!�@	���>O��=���
��ha���ur��p!ܣl'�mwG�+(��g0z�
(c�@�xM|�_��b6LR_����E��y�/�$��=���)�ߖ���c�2����a��j&����28r��m𾠚��R��:w1t~�Z�P$�:�$��e��Ru���A_�k�D���������U.u��y�43��¢��4ãf!���9���Νב���)V;�[m1���6�z(sX �y�d�N�g�$Ґ&���;�T�N����PZ���D%Q=���u�Ş��!A�����v��^Wֲb��cPX��Mo$��~s�nl�y��+�Է�`�0n�����^V��r�ġ9Q֡2�'��aPh�E8y����CZ+f�SF���:|MM���Z=������C�B�4�o-���q�c�^	���/�Q߸�'g_��"��C"���L�˛���~Lb�zEl������G�!w;U�’���-�|ӟ~G��7m.�+���Ƞ�
�b�1�gGT��u�Q�w���#�����&�P�;QjK療h���;�]��HEʸY�K�!��H��t$�K���n㛷�液�`�q8`���G(��Շ��ױ��FJe��|��v��&$�t�.v�w��B�[��}`nđ�L�+�2��t�컅�z�
��
+Rl���|Q�$QNbު���a��}��*��`�	w'���'��^х�Q�`�jHז�;�B���.�b��\V8}��G�N�-a�Y"��)G;wgkb�i�¬�aX1l*��vw�F�A�@�hL����u1Xk�w_���;��=�u8�����}�.�V@�`V�I��ĈWH�pG��w֣f3I�I�1 h�^c�h��螦����Ƽ�n����t��N{p�g���Roq=uǮp"=�R�UIy8j8L��Mt-:,Ź/E2�k[)�:��^8��i�Ry'O�+�6�+yW��dh1�s��9����F.Y���z+�w0�j‡6t�l���-�Ql���T֗�:��i‡YIWR��-��Ӄ��#Ypp�F��U��/N���;�A�����r������ׂ�&�:��@�/*
�GG��j�V&_��:h���yBK3�O�����PM�GB��Y�M@A�șJ��~�p����,�6���Q���f��/�˹��O�u��*���kmxl��1��|�w+��;��#�^
��3�{�x�vt2O+
�S}�d�;��"~o�a.u�˝�LX���5�ҹ)����]q�S�S���I����HT}?E�l�ݩw����÷��0�tv(�c�+�d�D��Q���d��Ȓ��Uxh�ݤ�	@�9�Wu�a�.�&�w��8��t�j[���Q�^m�^rym�"eqo�z��LA�B�6����4�`W^�Fz��ʤ��ɥcA�qŁ"�*n�н����Л坠���;X��c�G�0=P�7�JL�[�a%BC�ĉeJ���۽NB���%}�"��-������S48�6-��S�h�֓��9�D�ؓ���@�^n�t}8���kX�u�Q����x�l�����!U�����@��{�~��Ƶ���z���<{O�X�p|aSW���-�������:zN0d{�����^��N$�<"\M|�}�48BW3�[����s��d6��*,�-�}n�����ps��
Ғ�\lzB�#�"�w�D�o�it�#��o
��BtgzN@���=��<�E�c��zs���7s�w�rRc�n�P-�R���Bo?����.*��-���8�7�3����}�_�C=��k��’~k��Ojȋ���~��U���A�:�U��ǎ	z~�i��U�����M(fϕ �q��,})�������i�Q��}a���
��[��n��]��{[%O6[KR�U�є<�)~D\{�M�5�6�"*�_�;����Y��Ovd�`�v���O�f��`� ����MjLBԋ׺H�����l�n��RW�ɞS�$v:���*���T��S=���Wӂ�|�z�\�`�đڻЋ:���lj��� ��U*K�	ש+��H	�&�+
��&X;��l�XdE`�5.B���)��~�K'�](�-������Eb]������y��a�)���=��	@�fẑ��[�s���„8�沿�챽
ܮ�m[��+�=T�
�_�v=�N���%���dY��Yf��93OW������qA�b`�j��Oڭ�M��^�X��k��^V\�P)�d�M��3�jF��닔�:�-��Y[�H�<˷_�w��.Q��O��/�Q/L��=|�R,����}�b7��ӶU}�,S}�Tx����tO�]FT��j�1W�M�<kuɫz�I
p�N�[�hK6�
�Z���k�>�y�J`W�P�J�B�H��x�?T�[e�/�z��(���6zw�C�8�����b�MSB�V4C���U�}O�šá���,��jr���}-�ϭ���
�_��g��/'�M��]���R_��N��Kz�z�~�$�?a�ꮙ���j~֮��/uC��M�f9��-��m[e��x�r�Q�
����W�TU���	�>���*�H�鿜�Y�I��/�P�_	C�Z�
ͷ��Tn��eC�`�΂q�{���
��mo�[԰=�'*����Ñ������}m�AJy��މV�6<���u��i�5dQ��[��w�a���q����U~��Ȗ �On��AqctGBUZB���qIFD� z�^X���w�<���o����2tl�M����}�ګ+|�D�
��;���t���A�F�bnW���<�p�y�
�ֹ���$�Nt�<bE��Ő��R���a'0n����6s�:$	K��ƟSq$��t�;M^4�l���\���.�\���s��K�YJ�FX¹�%�
z��:I�S��_�#�G�Gwl��wr�B�<텟rgi_x��̽�
C
@���G����*�7�F�s���X��N4���n5������|��~Q���V{���%zԆ�bרyk��Dp�rm�@�������#Sr��㦕z@ӥwp::�*�����䍕i��Ҵ^�1`�݇*&��uwK
����>�I�yM�.��.,��s��G��6�Я׃�׻�'��X�o��ʲ��,����T�@�|e�^��(=�����|�+�y���^`y�O��	5��{}�y|�l�>E����=��L�y�q�������d��t��g�����Mgΐurւ���3vL5UXyܷqB*W���^���vˁ<��5����,f�iW�����3x5�S�I|U��)��x�6o��Z�U@���a�}���@�z&!�M~���?�?�
G�Z���DZZ�ӆ����(Q3���kջ�Gןb�e��c�ѳ\��Q[��C�ƞ��}�t�!�h�y-���[\G�d�/�s�&�܋R)�;:�M@�"������rJqB�aA9��k�y�&�	r9���^�+��PL�)D�~"��r{P������~�ܸ?+���b��ģ���� ٰ��Ƴ���q��3۸�>�R�?r����}x��҉V�����O�~���c�+��h�X�k`r�s�/!��#P^!P
r��^f鉶]Z�.^�q�p�1_���/����-{W*�3>�J�CK��:�S�1pծ��yF���z�ͽ�=2��#>���P���o'�xn3�;����{�d,����N���hA3��b�S�PM/,��ø]����(<4
�#O�fN��z��?�wD?s	��Dž�t:J���Ҝ���/r���{��fi=y�y��N��A=tZ%P�zZO��Cm�*m�z*mn����A3��?�j5�tǀ�E��ҋYLc=uT��V@��>͋ގ��X�30�::H�wi]��vn*�`jl���}�{<n��+
y��f@
������\����u�Au�S
���7�-Y��.L�2zyG�Fz[싪[tػ�\�!��i[c����F����6��$,���c�8�rW{�1ggî,�!–H�B�s}u����ÆY�2T�:XI`e�U,�Ʊ�"�7�[�r���M��B�8��|����\�qb�_8wk�)�JT�R�Vwl��е�i�ZJ�z���R`Ywe/]�ò����>\Y֑�=0a��D���H�LRT@��q���&�?�Y�K`�h��ꯀ���v>���a�x�������o���B�Y����c�f�tt�'��j#�@?�*x�79��Ņ�`)	���'�	V��z��.��e(�m�����,��;��Nn����2�$�TC����
�����mbX�D�^��$�b��.��{�G����i�%q����@#�0���b?~����?U%7a�x!�-(W��\T�a�btz�(�|x�T,��ݻ{��1��^^]0;�A��M�j5�QYӫy��HZY�}��E^�$^!-A_�+M���0�C�1����]�!�M�>���ю�_̓����gs����a��U���F��b_���O/{��#��| 7�*st�('_�:��u��Y�'�l	�#?�7����<����9�D����P��3~>�{���"~F#���K�Ά�o��ȯ�i�SD%W�U�����a7-�y)�������4�nK�/��L_^w�S�F��
̯h��¿J9�T@r������í�3}�U
�V���y�b�SKZO^〛ec�q�����ߓ��;�R]m/ĵ5ơ���v�n�F��lcv9�_9TO���)�(8��f��ܖ�Aw^s���j�F,"9�[�5�W�L:ܶ�N-������7�x��	�I�6�zN��C��+�x�>�Ӓ<Ե��\����be��Μ��y��dySju,;��KU�ܨ��g$�_t�ŷі��̜?�B��䘹ZPm�[	���.�\�
�"h�`�좨�4x&o�n���>�W���u

ㄆhO��^9��6:�!�cG�T��<&B&4�ܛr�����~��%.�Mo�hCɡ����,���a6g�%�4\me�7Q�0:�w3[����D����
i�J�	s�|_!��!�ښ�`t~!w5�Zr�
�R*U��+�����(6w��qE��sQ|€tn�.fa����P��Q67�	A���H����P�MK:�T�s�x	1���o<H�K�E��Ku3 ����
}һ���CD[�ό��/�S�4N~C)P������V6��J=�<�o`'����.�ݚV>�V�^#�����8�K��4�|�ȭ�2�2�1���z�]�ن��5�&�
7Z&ݕ����1;̉8�\��i\��ɣ�Hn�,3@�lVk5x����P�0�[�|���-tAQm��a����xS[T��^�;Q���8�[�9gC�P�=20��ץ��i��t8��h/c�@�w��<."J��?3�`/����g������^�[�|�M.�(��Vur���F�MG��+�	�Ȯ����4��_O��t6Ҟ��j�fV_\o\0�Fp��`�7B������H����.��{߀��4��*��� ��d�p�'gM]�x_�g�����o�\�^�"��P���I�NX��m5f�V�:�O>fkQj�T|��7�Yu�6�Wʐ�T��u�����Ǯ�,ZJ����˅��/�x�X
�>�r��x��X�v��cn�+o��ojܓS5��X�N_�4����2��!}G��*{\��y��l�[PЛ��#DE:���8O*'�i{F���E�I�;��9�ݞ�~p��!JךX�
����B��H�7N���+�5�GQ��%���ߏ���?[�b}�S�_է�5l�������û��f��a?\4�C�W��|�|�b��R�[ocM�(��ST�c� @Mx�=z�'�y�K*SJI�4U�}�QG>~��"bF��9e�t_��I���C�)~S�v߆���sy�s���	!v�}�I�۩��~�09�>8��
v�"��&��]���7�w��G��E���1_G?�ؒ����������Y�2F�G���?���[�rM�R����>�y}>.���<!�y}����?��|?23e�d,h	��d7y����Z~��w:v�-��+BH�0�Mn����,�m�_�Z�2�=�B�i�
A�'sQ�M�z���y��})xx#��F�r��d��s����^rY�V��n��=?���Z��)���W:#7w��Y��-g�Oʿu1�>����|5}���?���CGnD��)��P���	�s��?L�d��z����#�Т�!ˌr�W��Mײ{k��mz��}�]��y7}s�0b�el_[��s�"��i��.<1V�pM�ZW�-VVܻlx^�65���8ܲ��%��ģ�B|`W��੍�b�)l��G��;�N�_�o�D�#N���n�0U�/b�}
�ʂ7rG��ut�U�.m��ݰ�jJ�y�y4#ڴ�U!�R��Y��<?xQy�G��_�) ��U�X�"�c@��#�(�J5Ҿ(�|j4h�˔�k@��Ӥ`D�UL�6��!�G
��ĭQ����_���+ؔÙ@�3M9��t��?�`A>3'�Kת�+sCR/���Z����|3�ozu~H�E�٠�ή�yvz���h�c���O�����X�#�<�fr�8,!SD�1/oX�a!�V}Q�׵1�`�b3
���d�0N���Y�:^��lcl��(>Ba��;%_ٖ=A�o�Ӑ�����T��'�)l0�M����㦹�1�.#6rꍗhi}A��9�(����C}���jg�#�*����r�x
�;���ٔ�%�#\��г
��s�=�D�b3���sY��>�^V���f��8}FR4R���[��z%�C���7����Y Ě�;��&�oׄ�I%��E���k�|S�3u��x�!3��*������Xy��
Q@-.8$��X��Vb�틐<���:��+�X�/5�S9=r<s�Y��di/7�$�d�h��9u1&ZT���[��FE�V$0�5��6��σ̏j�w4��UoM��o��;2��s�>��G`�{!��R#�.v���9�0��F����&�r�/�&�(��a��'��\j�e�%论P='�-�	u����]w5Z&���q��_&����2�����*�ߐQ�.������Fy�����p�γe�w��+O�.u6?�:�d2�ܾ� \�k����
�?�@�J�^P9nj�G|Wװ3��
�_A:?R/��a�����X��M���og��F&0���h�y՟������e�'���}�j;+
RF�̡�a��#�FCI�ܜz,u&�Zmh��v!��g�W���=΢`=�UK�k��&|u�e}gۄ�,�'ca�kA��H���sf`��;$�)T�Ҥ��,����G޸i���E��0}�u�IϪ��b�#Y0w�`�ܘ�y�mjO�dCTd���֛�����ͫ��F��OWƤ��ő'Q�b�QQ}•,91Ha�k�0#�^_��Z�BF&���SqY.�N�>��c!��Q,���c㜥
�@�}�{��?��[�M+f�O�M\��gͧ�k0�*���a�pv�����Fk~�x��b�o4��]Kn���%S���B�Y2�w�OW
��Z)-y��Q��Մ�G�<܄d�̵P�q�V�@�����Eވ����r��1D��~�� ڌ|\�s�k9���ÔVb�S��AGfpF�T��Y��5 �6�d�4�A��d�D���n��5d��<đ�v��Ɩ�����77=V�*��Y�
���$���s[pv�
�rq+"�o���G�cx��`V"ok�pҚOW|:>���z�,VL���:���f5�v�ʾ�s���E�O�ћ��˄�
������%�St���W�
՟k)�`��>���&F?��{�Yf9?��)h�+]Ue��m�� 2-@�����+}>��T�X��k����'sǭ/�8+�w1}^V��B!��yQ�!��XT"7��F1_«�=_\N3\ZT���>����h섯c�%���e�t�6ܙ񝛾s��I��܉8�i����Մ5�nH`�NH�n�R�>�ԬHk�-��3MR8l�`=�dڑ0Ӧ�0�*<$��a�z�|�D�*�ő�C
d'
n��+]���k��_q��Wd$ߗ?�ds8:�ސ����:��\$��d$� ���,*���)&��jлz�|6.�~)��U�pC��!�';*}w@�tB����x�����iw��ں;�c7�*Uצta�	%�G�S��'��@*A�{ 7<˟�e�#�s4[����$'@V7Zshrc�_!I4D�-
&���Zb�R�h�^����6lj"��2
��ٻ�tO�s����'ĕ
9�ɗ��{/�—�TD�X��(Ԫl�P=�!g�)��g
��_80�S���+h���8�޽�)Ż0>W�_Nz�{��ڣ:��e�-����O=�\|�\�f�X{��u��c�m�3��Y�<�!�+b�ӓ�L��_͵�:+�0L�����"l�W]\'��y��G%��5t�=ϓ5���2�%�zq�
��~Id�݉�Ћ'c�B^��x�X�ڲ�=I�%�挾dʢ�o��&�3q��C�c�QX�;㠋:��
$���Y��-����e�KkFU_�O���ҴRY�%ƻ��%�SB	�.o�y�=(*I�(G��D��yc6��,w�(
I��pu�{u���m���β�o�
��0�}��R�ЃǛ[��!�����ϧ��7��8���'�z�3���q�Xl��0zJa�f-W���Η�Ʀ�5�X�3P�M�
P���������9�s}�Q�R?e�?S?��S��+t��eꇋ����������R������v�<
)Ɖ�����^fS�v`����"FO�[�<���+�Ci�����1�^T�x��g��;vt�,���i#���� Ϙ�F#��>b(w��
�'�d>
����оP�7�䈒!�����r�3~>k�qS����D��N�5�^'*�j,�`��+6�˒�
~����j7/l�w
���9�dy��CKC����߬�����?sF}Z�oI��8�(�� �J���UQWLc�o�h3m���
o��m��
��o��*� \85��_Z�H��۾�(t�i�pWN�k���Zů�g��{�V��V�fS�5s�S!�����Ղ|�+K��]5m{���Dž���{�����APAa[z��˫T�E��'�3w�A�:u<�cBc��+!��#7���Mhra��6��(&��>�}qv�/˕A��k�&[�dk��q8���l�R��ԟ��b%�پ�ql�e��f��~>�IP&]�s�"H
4�pA40#�\�p�4%��*���ޟ���'-]��yi�\}���M>�
v��
�Σ���.* �LJ���4Dhsn�E"��|�%ǟaVQ
�~}#k�Ʉ~3�'�r4�Q}�ą�{���#u�r��=ґP·7�Z[|e�hʔ�!O�ҋ��0��#�C�P%a8�%KO����nw<��Z�p�k�cM�����Vz�\r�{������۲�1@/{�w�^sG��tzAY
Jo�z�
�u��P�
��W��<��:�!���U8��!'�C�tP@��a3pb�����ր6���+oG� a<gg~Z�W��|�N��2�,$S��כ����v�P�+3����锁�����-�_+��[�ߝ+%X�v��&��71�̢k̅���ﳘ�
G��� �ĩ���Ef��#��ڿr�
�9C�4P!�-����3�'S�W��Dz��ߑ	��:Vx�;?P�V�W1i�Cɤ!mslc��ºV��/��+��o
�I���x�s�1�J�����/$	\����5�;�C@!���dn$LP\�D��u �B@�]��GnQ�3)b1�"r���z��=��ӔFM���P\��Rq}͇[]���9����*;4W����xǭ��TU!YJ�s8ʕ�dDK-tdQ�V0��fN���w����OARi�㘥/�ks��qʧ�����^�D��L�r _8����������ʠ�!�q���)�_���՗7$��M�t) y�Rt���֞W��co����4��ͪ7�S�闶@���� ��;ևb4"%��k}�#��@U:�G�Sb��u,��jh5M��*�e�ؙ�fw�z�A�cnrc���6���\WY�����a���u7�<@��`*pq5�2��3�f7T�
�Lŷ��(�߆�/�[�f_���/�O��D(���B��_"7y�_m�~U���G�}7�ۧ�C��w�?�	�SD
!l��pӇ݂�]�=�X-R���~ߠK��K�����o�P�=���;��?L?0���he�lTl1�F�q�ӏ�P��M�XOY�3dm5!xg��a���)�7>Q�m�9V\�����~���M۲R!z�U��A����z.e	��D�i�N��Oy^T���ҫ{�d�.�g��/�����T���ŋ )KU׵����7Ɔ��f�뉗Mă� ,�'v�&�)��M����́&vɎ�%2�*�/����I�|16z+�W��xx*���a�v�"L�6I�:Xk�W�.�9�2�Q�<�5�L�f�����^�����g]��MB�+��JK-�A;�hl�9��U�&�z�qkj:�T�L�(�Bc�s>���J;���u�:���=�v��od�A�A88�~0�>�ʶ��v��@7�'��G�q�kQZ���M`a�`�޷L�R]�.%�tȊ��S�o`�nׯ^}7�b��aگ�k]Z��n�d�N\�*}��j���{�CBz~.�gBZ���<ea�/�L,f��w���k�"�-��Ug��2�E�>��w��>\�P�z�5�;���ŚwLrn{�"�L����+^���ػ��5�gh�{|a��Ȗb<�_����϶���#m�v7��ı����#�s-[\{o�ݹ�^vq어K���R؛f$w��� f�(���aW?ϖ����o�iuث��L,�;G=	J�oRD�<�t˯��G�{�ܑ~+d�8w����^���<�s�ũ@�1�5�eF�C��E���ϯ&�bFj5����q���(�Q��a�L�ý7B+�Ew�M����� ������
z�+������k3��:�LFz���v�.�S�&�8п��,k�C�q�	�����C/��b�Q�R�<H��>=��i0��6��2��m8���@ t���qh���4!#�XOk�\�sɲ��`�ÿ�Z�y���ز���u9A��u˿+f��YM�F�?�2��=����{
{$]w�*�jd'�ô�<T����	\���%7��1<�磢��T@F?�+FHDY���0bb�7����Xc�����C4�-�M$<i0p��.$VţM�|[PK+�)�X��m@Lj�ES�pj5���;E] �}�-uZ�%>��4����������_��ĤoS
�r��z�F�&��?���ї	|Ϥ�W����l�?��Ex~(t�u~`����~M���Z���_JB������|���#�?��������G�U@Ec-�����*�FK��R9��kV"�vEXϻ9(��NSz��d�*�!��~Z���$Bk���8e-�?��8I�/3��Lա�-ሟ�&{��F����4r%Fl�)�dkM~�%�͍�LB(�K�@ţ�Fia����5J�f]�bު0x�oœ�J���x��&ޜp�\k��<�'ѱ��D�t$�o���U�1���Uw_��7�i��!���P|XD�$�ϓ`�_�jV��ܪ!�V��/��`�
���mg��H#�F���(��2B����C.�Z��Uy��QZD�t�煘�D��q+��n��#�?C������|�#p��7�`�k,��"��gY�@�5cx��t)x�Ϧ�TZa�R>T�M
�둮����̵��%�s�f%��"LU����s�N4Yq'B�7M����e4�G2�AGThfD��ɗp$�y��I��p��#~��?N�='J��FF��+@�		���Q�xY��<֝�pԔU��ſ��᧊�f+����w*�2�:/�c񏥇�Sz���;:Dhl� ��g�c�
��/jh��K��y��&�bE�_sm�AH�v-�y��h���WA*�kr�MTk�!�6����pC�)�����;���M�����_J���t�n"��:��-�
��wM�u�몢]�6��a3�cָe[�I8��H��Z-x�5뙮P|��+i�'!�d�����.Q�H�d8��Ԣ	��{���+�u�
-V��_�?�^�6Þ���< �O:��X:<�0���<��f<��F�S2��E�ϒ��M�e��ŏ��N�Y��O�/���{���.�r�!�nIıH<�Kq�P�WGx|m�g��'�wi���%�ٴ�0:kwL�/��i3G_���O|Ygl����O	N	ܫ=���u9t�T�#Ha�}:��-U<�`Nm���a�C��X��q���GZk���C���V
S�;�N{p�9E�V3��%"X�u_W۫�D5ք[rvF
��8�b���'���=�z�$JXU�A���۴DX��~B�/��}V��^�݉ �t��$�0a���]�;	��h�W>Ĵt2����8��re�s�S���T&��q�`6]:}O�^Y$l�a��jC�aTI�n��Ugp?�g���t1�ǔz�A�F����r֜��.ڳЕ��h/�0��Nή�XV@��[g=���j�z�$����l�q�;D��:;�ʯT0�q�/ȹ��x|]���We�>�D�r��<��90�_�`�ѢC�R!k���=�-y�j�b���8@�C�ա�.|��n���;Ψ;Mo5G^c��;|z$b/�|+n6;�Ӈ	"��*Y�ɺ��{	6���N���!��z����z8������v��d�s�����I\{��Y��7v뻼����0�F��8a��3��>�-�a���>2V�0����#�b,�Yg�j��������je2�E���-Y^v0w���F�\*����'AL��)���vw4�Ыf�AsO�V�Ŝ#�;���bn�"ey����4v��+F��m��^�'Ϲ�]�|�#����G�sC�]µzA�?�e��u�j3�P�{�U#���B{�������b_i1�u%��zj���i�¦5ә$�2i_i�y$//��..+���;ka���S.��e���8��Z�ߦ��e�!�')������>�*{�B��g��s�p}r}��ޮq�.��D��ՙ�f�HZ���*1�ʎ�.�ޫ�t_dq6���0Y���ש�Bd��v��,
�Y���߁���wN��*��1)�,�sh�d��?9�Ԭ�1w�"p��V4�58b�g`�p��v�#m�?u��?��E�b�Q]�f �M$��OM:j��������
X縙JU�Me�]���kӋ���w�r�⻛�Zn�0o��i�N�:5n%)>���(gr*��YJ~��e��R懤�Y�/��L�ٮ1N���o��q4�~ K��L������������;	6�6%��6�wf�RI�C�f8M$�~���Ve�&M��7�<ﺢ��	@��ý��1��Z�,!�|�W�n%'%�'���.��!�&�� P�Xxp�����5�Lc`�M��2I���9{�0�N�Ǘ���T*�[/9�̓�|�8����zF�����AX`��0�ǘ��l�k�AgR
|:�kQFCQA&����{
+��/��"�D�tU�ؒ�fbڤщ���NO'�"�oB?�v/J^?ѱ���$L�!�Z'�%�+�	vE����"�/����g�?K9��/e��SU�I%tI���߆TN�\�r�g�I�6����Zd���o��_��"�ɾ���-��׼�/��Ne@�[�|x�W������f���f��vz�kr�0?Gq�	�|�u����k~�!,��#U�i��!�
��q髯U3�_�,ռ�� �L�f����K�t��uR��-�3؄^��S�6e�Z䥝����i�g0.�rK<�+0>��@#�F�%Vd�E(�u�fȨ�"���Ɣ�W�7V1����Ƶ���ۃ��h6��K�Pe4q�m@�7��l}Ц��"Nqo`<GWm�s�r�������o+|(�d#�Z=��th��@�Ed�g w{>N�.u��3�P�os����
g��T�0�pвn�H��� u������_+@¨�b�we��ܲ౧_��2SQ!�������.rD͹���vX���Y�(�摀��g4ܠFgπ�$�ȓ��%P ����Qƾ�#��iS��86
�f�o;�ET<�D���()U���$]��,�3w�6���\�����\�����#��������z��9��WŨ���d�	�"��ZX{��2Po��c�Bs��P;��0&aJ�]=D�Ep�w�{�K� ų�	�/����������J����?8���&
��q�ע2ۧ���������^��U�Y9ƶ�X�3�C���aT(Y��%�o��s���p�y���5�:Ն�A{�E�ĢË��k8Z�n�K/Z}[���Uo&��6�7<������{�Q�;7W�d�}i�/s	��ݺ�ܜyP�c��a![��<���8�@9��&�3fr�,49�aP�,ԯ�{�ӣD06dC,��%�_8P�m���;���Pܬ3�Sғ�M�}�2sw�e�g)��u�w�tR]c6BWO�uﯰ4'�eQ�VDW���鍢4��<��ӽ��x��4�m{px�0���ߚ�u����}1��ۃ���FɅU������RY]��(�0��4h��c�9�W��V�jq� �A���nG�,� ���@�/����]/r|��BD��	�jjsp��Ŷ�ݦ�����?�n�*���$�����6ےsqM�s옇��e�.k��>�@��r�C�g	�C5}����4#�Η4��7��S1cg�@�4(�*�cc��t�}���F�n.�l�t,��䱛�Uw�`�=�^��$>3���LQ��ܐ�1>W�r��V�*���՞�*�����x,��b�'4����G����~b�W`���VB��>_���қ��9d�򬏙�^"68�vZԓ桾ݚmߘ�~g�s5���2��x�[O�˴J���x)rv VG����4*
���L�A�7\��@�U�5=�w�Q��z�}��`m�@!{%��L��J����2��Ѡẖ�A��M�Ə�+O�B8�{g��X�wLE!��[�f����Ѯ�����b�NŠ����;!��CyM �ؑ9��5�l���T�7��w��������%˘���l�K�jя����:ի�;����S�Q�96�$�r
0���"�O��
+�����겟�rxF~f-�+�Чx[}G��+�� ��:V|F~�Q|����v詷�u
�s��=�Y�GW�y�M�	P�?֦��i6��у��*�|����h���N���l�ϩ�;���:�����O�?"�|�Y������4�w32�ͤ]_�H��}e���Į�_nʪMpw����͠��ӷ�(�_�é�k��[��*������<���q�� hS�����yj.�ž���y���?
�>��eL��jk8=����Ww+`ߊ�"� fO�{*���[�1^!/�֙���9v!�@�Dvd�;^{���p���b�*�JV��\�������	���-����>�5��j���X.[a��\��8[��L��L���8w���$�	���(����L����9߰e��:�����f]���k$�婑�E;���Tw�ܴ���dh{έM/ݮ�!\�(�wg�-1���{�
M2=�ө4N-o=h�#��u�T�^�E�z��Þ�a-�;%��)H��h��"���*5w12�%>9ʛ�����P2���h))3�
!�ɡ%!^݂��;Y����4�P)F2	�3�D��ύy���H���ߩ�����kY��V���!�C`�t��5D��!>����׍g�i��F�ގ��芫|u��T�!�G�3��g;A��DV�.����ˈ���N➃�^��b/-�$Hy>��W��O#N���S�P��(�J��=I��	�=������9��@�)*Z_6�#�fg8e�v�5�w]���+�s68�}7Ҏ��:y{��4�?D�[�ȇ. �wƲ���˚t�;P=^3�S2���
��$��Uㆸ4B����^$CΕ'��X7��3�J@�f_L���<=)}��ᜤ�G,��y`Kκ�j�=��^�c)��~�X?���ӡ:ĕ��,�K�
I�W��U�QS/�JW��2/�T5��z��ECCm�b��\e��{j`��΅�
����Ŋ��<�A�]��º�
�X�k�&�뼨u��a���("�@�s�`$�g�ױ1� :FW�r8������G����T������8"��Uf���Oz�l
ܖbii�}��'|nf�/B�؎��y-���:8r��at�,�
��U�9
�b�J�&�8�[
X۫�ɽ�'e���M�.���";�T�J���f~�ͥͨ��]�¼�1�����3׼g�P}��6L�;0"�A�ޠ`F]�-��Y�eonD�DG]DB�T���R�k��}[T����sN����P��Kc�.I����䀑	X���TC��|�_'�g��Xk6�|��O�
_=�a�r��yoΔs�� m�f�J޿��l��S��7��O�:,�^��]��[$k�ѿI5~9��or��~Sy_�v���ݓ��ݓ��Q�^�f$�1ro��-R��^��1jk��q�u�?�6�C��!n&����Bݡv�X4�@ʃ�JW���(I%�nsCAP�2�ͯo�����w�t6���6?0�o��x�R�oel��Ψ�j<�<�n�ϭư��<����R�v-�E��kW��n����9	�YR¯���`�'nД�9�����+ͪ��0z+�>֮[�9��.����_Q4�
r�A(zm��I��0X��Ys�J3�߷��n�_���ҁ��J|�Pˌx�ȕXЩB���:�j������gj������i��վ����6��t��
���U�?���[�d,�6�ݵ��G��������G�U_��4�<������|دͯ%Ci��A�#�@�;3�Z&:����U���Ȉ��v$�"��2%f��S4�p� �S׈���0��!����$͹�N�n�@�a��`ȝ����.W:��1��"�ʰ�JE���b���*�B_��ql�p�P;��\l�9u�]���d1��D�N��Zp]Q�VEa�2�������^M�e�wq��hV:x�f���S�w�pO����DO�E5�6�_N��NϼZ�����]$t*�>-`Hy�7��ڡ|g�q�h��p%����;�}�ˮ�7�D�0�Pk�a��|���km9�����"rm��m�@�U%:wp7ʚ&�H3��$� q�f�'tIW���=f�0R�$�}��N]�BG��2Я"�<_��Nd~��x/`�i��54P�<+�9��s��/��2Y3�/k��V��@L۰����Q?^��5 ��~�΂�h��à��,�	X�СO�'ްU���Z�7���<�fݞ8��mW�ll��K��
X	��@x��	Xk�eU����������Δ�� d@���J���"߼F\{�:����N�:�Ry����p_��T���%1H�lWWg�bNl�S�F@,d���p��p��`a���EP��ڟ��E�w���	�3xh���KUr���'d���<�U�L93�3 �JgX5�V��r-4A����q��|��4p0����/������?hq>��ygK$�.�I���\��۫����왃B�,_���"���E�a�d:I�mɊbꉮ�����Q���;�ɫ�Bn�|@ĭC�����,�J;�N��]��g�"v]E��D���rQjh˼�Բ���^	l����,Χ���|���b띶��1=O/ӭ�]�ٸ"��D�m�{��#d��#G���
�_�E��A�P�j��阛�})h�.ڞ���4�ظ�E;��Z<�n	�yNl��A�r{zs�-��y�
;~��{>.+:&���4ž&5�v(,�)U"��psb���Y��Y�!o/���!�;%j�>LW�A���]��/�t�w��9�g�O���f�]�&���8�M�Y^Щ�.WR�e�0����e�OG��k��\�]�!Uh�Z�B�1�L�{�dcέ���ö�S�Qe�}�����c��j�JPzqSO�
�����a�cW�]����6��Mܪ�� ���e���T��?7Ժ�2�I�/���B�	�W�wywq"�6~�u�UuO�U�z�$����݂b!������4�G\�'�78X>�̟�Җ�����v��w.�N�T9�I�4�[��I�
��6y�!տ�b
�@\��{�n���h�j�".vM.e����s'u/R�`��%8��a��.݊�uR>p��P@͊\D�!%�P��Sw�{��KtƷ@	��71��Am��_i��awb���܇0���)PT<&%��{;OklS^e#�dF�iʲDut(m��^Z
G&;RӺ�ޛ(��#���G�����g�9#a��]H|.���"��}y�xZ��5�{`�6<�g.&"��Xد:�zL���p��5$����1|��|���7�J�z�m�v�¢BhC&�J�L�*��5L���j����vS�'x}/�<��fG��R~"\[�c!�q}���H��3vˮ���B����	���A�P	����\D��:Uȝn�h���
xv�WKb�	Ʋ9AC��Pg��*�L��Sn�D�'+��.�[��N>t��\�,�n�Q��ս�r��5����- \z_
g=}y~*Q���T��z<�[8h<�"%����P��<��_ν�!�ζ�Ki�+��� ��յD����?�W
�֕o�NJ�#������,S��e�Nm��Ƹs��<��뙜�>�7��[�w� Z�a<|�l�?�iv����xeP���|	�+���;I?fi��x�txA������u���yMG;�N�	����>W�����f�߈��v3��1�V�����-we8��c��N�K�[T�?��-����_�&Moc�S=\�3᜶��@v`'�.e���<
��
�,��^�[�"ȸR��p�����$��o�v)�B�&1�3��	xp��E�o������t}�:��	�YqIp�E�;
�;����;r�V �D�=G�©
�pqZ�t��j��4	�#g��S˔ō]��A��V�&]֣?�+\��ŷ��4IP�O t���]ֆ��<�0��C���E	��
�0���X]�h�xĽm�����a~Z��� �i+�;t#NEY�*���̵*��UvM#��;A�����/O�18�_�l}�e�ᤃ~)/�������ob醖6��4�EZ��`(�p�+C����Z��H���kq���o������I��߁�|r�&��gҪ��4Kr7�9����;3�S�V(�kȍ-��,�s�h*�AZΗC�o�{�GS��Oi@�5��T�9��ۗ��]To��|
z~�8�&�7hh*�a��3 ����%�H+��&��*��Yt*�����|�E�(�B|�N�|ȸ�U�P�?���–!��vs�f�U@�;�nm�\���&��汽���P������1�ߦ��Va���u}���u��lf�Aj�����39�aWHV�J�	��Z���°�z��x���g��R��lY�hnY�چ"(��@ۈF�_���� �h0*�a�k�8��C�Ux���E����FE^5���[+�r\%a�p���*���8�]7�yѨ�����*^&Zx�eF��h�z�4��5z��;��x`?;fҶ�j��jb��ƵK��,ID�	D�Q�]���U����~z#f�������zLbqL�5h%�sR�N��t{#�^�:��/�^)$�"�]�:}j�1k�@��,��ݍ5���J/�6��r��O��U�U�-0:���Ӛ��y��6�-��Zp����
���(��C���/�z�xcc�1�0.L��AU%�w%��&N�!�Q@�Iˤ<�̥4j}����:��Ԍ���9G�!J՛YD�����~��\7�B롚�S�
Z�̖�K���_����(H�e�=��������	��[O��/�i %k�m��n%,b��]�k��C��+�Z2��^}l�7�!Dh5D�����2���R�{�b�8T\uՍp��=GB�Q\��u�A՞�u�0g�ll�j!���u�ad5v]Om�!<e���m�VW�w���z��Cx�)ǭ
����;
/+t�<cy�Y�r�O��,�]<eq�p����/=Uջ$�xP��m�����]���91�
Â=S�k�dx��3gA~�4�������⓮p�?�!��]�G�4�X�n1{#	�К+�F!*�O�9t�N
��4��$r��P��4��[WQ�C^��.=�x���W���t�٣Ӳ�μ��I#��ߜ�X����f��t*�+�Y�}�$'�]��}j�%$��&oQ��g��:�~U��������خg�����^����L�hl��~C��y����+��\�ͭ���ޞ;�.o�k[�&z,���
�H�	rFe����:��=i{�L1�!�U]�����}���������ڜ����A����SP@��8��qޭ���@����\�L��?Ȝ?�����؟Dx>g����|.n���<�o��j����F��B��\���c�pQ�iVT��=io
@0��ԏHl��B_I���7�1E&@�2w�RoP�Mg���]X6��R0Az�S3�`(g�b^_$鉄��s��y�_�Q��՚�T�k�˽�0��_L8rܟ�yB�J!�l\����mȉ�44�H��Rm2��fE�����ܠm���O��K[�f���ֳ�Q,�0q56�
7�(�n� ��J�_y���$,�oQ9�a�5�m�2�c�F�����g��-�6z�}�M�~���������ϙ/��Us�Ǫ�ߠ�����^���u�c��K����[Xs��N`��{'>^\��=?�>���p�@�R���f5������G���Y���zE|��]S؟y�][q�
0~�������"_��<b(|���j�����G@�H9�M���`*���v�k�b�p�߱Zhp����@4��8FƆ��x�$�`�|�<7[g��aґ�_�f�W�D8�W:�CI�	w|XH�H�|���nVKm�91M��2�����J?�X����qa��ۃ�^�
�PE��VPu��u�^o03#���4^�����&qސR%��cG
���vJZv�v���.B
��`9'�#�a1�+���8�LP�O���@B�=nPr�[� ���^
��y����jh<j��[}Z���Z7��8}°��k��&�±��(��^j�X�Ya;��d�%��C���j�Ky\�<��S��C���9��H�HR��>ZaR	����R�w�XEL<���)s���%$^���E��<��\D���ݎ��˯��/�Ֆl���>��YY�W��#��E���r�S��v��	8�[�p֒m+�Pk��먁��H��˥�r�S8�z6�MDȹ�x��y5޺dW���j!J�}j��s�U���\Da[�������%�ٜ�2�&L��
�̼���W-����-�Q���~�)R��7*r�)Bx�pڊ��H�I�ӡ�m�_T&���'@O0則|��,a���nI�����)�T@�kp'O���bz��Ò�@),����{q�ldCp��5�9��������z\�O��	 �H� A'���}���>��ya`A�����	�!~�E��S�8��C:��x��t��ҳ��n,��@�����j��'�h^�%-�Q��V���ܦ�:�O��(�l��"\�4'�/����C|o轘�0���wʮI�Q�מ����WA���I�G���#\՟D�	FB�ܙ�"��������SJ��>	�[?ٿ������`Dws�.�2c��0L1�:�;vZ?��3W{�!RJH^�"m�
}����2���\�IU�w���2�cRUu�HD�a��=�T��z�}i�#=���\H�so�3	ԥk�j1�s_��x?&NA
�v�cG<��Q�Y����C�
h�Z�jh��U�,�x�i�$�	3x�R:&)_/�,\yΉDz�f�{}`�@TZ�&�Ǽ{-�K���!:(�m�w�CC��z(�!�,�5��\ k�{��\����4f�r�f��m7�U�(Б�4j�u��?]��Q���#�\��ʹ��8��U��`���5<C[����w�����;#�I��d����V
3ZKc��s)�B	hU���#�WFLW�t�lK"�_���;��~�)��=�_�1٠��}��p�v���e��	�=i��6�?��)�y�Q�/S8 �݀Mo3P�ǀ���e� [dfC
޹��u���	�K���hT�_�:9����
�����x��|����o��
`����3�tE��6$J���`B���~G�������zm��s\|�Բ�UJ�ϩ�ovI�����|��;�z7N:ں�s9��]��n���(:���1��C����ʒn�1k��3�`2�`�l�1�g6���[�S׹<*=;�7�����Wy���䧯��ގ84��E�<|ia�%���rҹ��.�؀!�x��A��8%3�zܲ3�q�wh">sE�T�&���xB�U��ĭx��X�-!8������	��^-��D[�gC����c��̳��ob\ԝ���3�t�������q~�����H؊p�nK��.M��^���['-q�ک�õ����v��z�{���_��k���,u����/��a�]Q�/�ʟ��?��3����9�^H�	
����&��'�ך��\���'���DG��EA��KZm}�6%�\.�^)�mxtE�d-���\H�E˫��<j�8UG�
�-�����[��I�}���]uR�.�:��K��ó��օu+N�5m#7:���3�C��*������Io�a��tI��it2��g�KxQ���v$�dt6ķZ��_�]Yi�&��Ozi����zC�XI�����:��VnT"6�J�p��0aG��z=�H�Z�]��P_\1
tT�"�9�!,�5�����j���{I�Vwo���އ���{j\�i_�Ȧl��\
�cn�t8&��•h�j"r���.�k�rJϚ�े�޴:��R�/n]�+nj��p��R9�B�Ü�||؍��c /�a�}G��ւ��OI3�a8��[\�]y�p3�³���2R�4~t5�j�ۋ�#�{�V�M�y���o-6�Q�Uj-�;۫r��n�<�Ҵ�[b
J�\�F�2k7�J`R��?T�dt���0�c�[��fP�;S��*���?8M>�s),+�fLg��b��xy��;v����^5^�Fg�썯lu��eKԛ\���|,�Ą0O/����|S�5���{�bm3u��H�e�^�-"@�}�iLʝ�vP�ˤ�2^����)��7�T����ܚ���Ńބ��j���)�T�!d@Dc'�*R4"���nKS�l�}���,J�(��c������ �IXS���i�2P��
�@;�T�RF��ȳ�t��R�pӊ�?��;`�y
:�F4�B���l�;�<ed��ܐ"2~�|:�d��$��{�T�ۜ���07מ�A`�ʄa����'.�]>
X)�Մk~�4W~�
~<�6�m��� .��<�I��B�D�Ϯ/�s�������N�ނ��{��5l�T�;��h�
��R@�����ï(}nx+!����./��<�;�wƢ����nB�۔�}�[�kL�N���c*g;�`aG-��n� �2��-�]F�2	`��$��\8��
]��3J)A�)�w��O��5�&r�݉=T�0xZq���٦�^<�4��o+�er��c�G}�����Fߦ�
#�RЗtȈ�ڧ�u�?��_	8�*�ڦ��BC_\B���~��?M��瞡�T�]\S��Y���Ee���N���wũߨ�h㷉u�w"��5;��/��0�O�S�
(�B�:S|J�f��H��ӻ
�Y?���w�~Kh��)���U-���_���׿��g��L�Բ�֪xV�$�=���F� ���]n�̪k�x4�Ԟ���(�?z��,dO�&��@V�L)jі�s�hX\�)~�b ůۥ�'-�oG[�4y��*��	�I�rF���-z}�k�U
>���P�/�kvo4�����x�9�@��A���5�-7

ٷ=U��F愕z�w��L��Z�}�kyu�ja4�q.�v��F���ҷki(�Lu�x�0i�b(��1����4��$|;_�?���|��l���o�L��B��J~#��C�մ}e��^��^�=�J���GK����6�S�)\�K���!��9�I��zN���af�&�#��;��eJ%l���w�T�����?�@4��X�&_�S_tĻK=�o@���>_�r�*l+d��\˲�ư���;�z�B�܏�0�~��_�5
��Y7N"W�S����TA�ǍmP���K�~w�p51��}m�*Fo�ҹ��<�K�q���~�M{��<o��w}��&'§I�ė��G=]
h�:��7l�X�An8n����>��f]MX���jވ�.ƫ�A��|�cO$̌�:>/#���R�Ŧ$zb�����NcBî8Ή�P<	\Rq���sE��C�X�n���P�+�M7Ź�Z7FJ�l�PA�>eASX-$/Ѹ�^���h����)�JLa�Ƥ�|cN�BIl�y`��Fσ�:�r�Tv�ưm��j2�_����J|۾k�rg��*�Vi�}��,:����wfS��1ЕK�z����y#ǃ���K�_Wtث{�Po�]�A��E�<zXӚ?��z�d����������7$d����o�c��y{5��-�W��^'1�P3��p����5SW8�a��F/�cӋ���m��`�|�Z�P�k�1m�b� � 2��Zv
+���$��y�H��{���Օ9�:��.�#��k������S��ܭ��с��8P�Gb&�K�K��k�'��/S��t�(�E��?�H}�p�|�n�v�	�^�45�~Z��Q��~�o��=7���i'�@OUz����x�����9x!�����(�#�Tk�gl�w=:X�Dn��ܱ�� >��;�k�YLNO��,��ڲ�Ff��4Ymz�fn8��˜xVu�U1=�3
'|�����k��oI9kX`��71�~�]*�Jhs�t�����o$n'��a��M���T1Z����&}��!�i@�D�$&��Q��4X�A��$��Ϣ|�एB"ӮX�3�]��[XHo���_��Y/LKv=)�
 [Ğ�=���g/#�>.�ċ�G��	9�`�#��r��xبYr{��Yn��(�Sp�^'P�#�f��{�q}?Jy��Y��Lr�<���E�3�{{�Tj��Z?��ƺv�t���*����	��"ѥ@ax.MM,V�_��/o
����dd�!�]��)�i�/�>;���1p43��YG5�gf������~��Z���;�p����t�žM�|Y���C���_�C��ؕz���A�Y���b�C;p�?h�~G��}{��/������O1%�F�����s��PCY���V����Fe��p0�H�~�s
��Jܙ�0�������~�|���/J	�b3�WҦ�hd�M����s�|������ܿ�9)$��AX��uvm
��ͬ�a-�� �V{��j��p�䤋!ԥӞ8�R�%	Y\�
���p����uP-���W���3~�L���pM^/�k���y�G�TC����F���yz��$�#]2�n0�,��0��p`�ͳ��І�R�S�{����r 
J����QU��1��m©��}o[�3��S���I�������}"U�䖒�������R�o�@��.4�Ik�~�q��
�$>5�]1�?h�މ�l�>���ɩ�Y�8����Oת?������|��7��!��=SdB������}���u���_#ȯk�� �2��w�b�Д�77	�������������+,����$�W��эj�1�b؛O;��\Tm2�� ��u91*�?n�%Z
�Ƕ�[H+W�
2�t��Nd*�KiAG�3;o�/@�T���%t.���6�ϋ�|��	mYd9��7Q]���"Ѵ�^y���6E{���ȝ���tnk�7ޏ�o��o�NlĜ�y�O�;����a��������F�1[�)Z���N^5�_"��}�HR��p؏Xp�ɋ_��m�_���,g>Ҹ�Z�z+x����l�x#�8�v��I��R�������9���Cw?�!Q����;$�Ky�W��tͺP7H�43��M��t��4Ju7{R�`(	��d�?Z��8�-�BF��2�p��r槁����h}��x"᾽����8�Y�A�ym��9���T��Ǥ#3fh�vGխN��<��Ys�d���k��(���#�ţ����ڳ$DP�n���
��lc�;�Џ���_"�wL$�E��p+,�j;��_2�_�&��`�qL!��?���/}�Jѫ|ӌo�E��k��'R{B!��m��p��6���!3`��I�	~���&�M�*=B}ˠ��<�<WV��b7R�BB;���.��3���x>r��k�%@5�K(�]�e�g_���I����ϢvDY�癛�+������1���iUYE{���h޸X��n[����\���}s��C�t������'��3��xY*܍F�t���6�$%�.���Ғ	|/�Ь�$�K⍯�"O��I�c>az1S�Y
��{@:�3'8��7D�i3@V�ёly�8��1s݃�C��o�����[��&D�1{H��;)U��I�)xׄ�t���y�ڏ'��!���5��ݯW-�!E����M.�5;��:[FZ�/y2�ae�.��;��.����"9}�jǗ�hzo(ߴx5�m����K&�ʙ�g��Vp?Ȱ�fA��嬦�I����`���ڷ�k���#�w�g��w�����U#��q�?�U7�8�֬ow5�VwՎ[��r�����X��c�8y*I9Ѱ3��:��X,��)�I,���
���9��۟ma�ݝ��ǸԍF������+@�������q�<������v�Ӷp��2��Q��ty!�ˊ��~o!������4@v��H�"O���༌=:
��zy��$8!��l��b�_I'%�zPW}�f2�,�Z̋�l�hИ:���lB=Ml�v�a֦�U��Z:fhm�����C��$�s�)���D�6eG���l���ika�K����,�/��_��+r�|�7V��-얪I<�����rs�����F�����f��[+��宓.ħޘǃ��Dq��H���
w$;OG��\��1BgfJ�3�E7	�>��	�2�iKѓƘ�R;'k�e�T�|��|��{i-+{Bl'��xy?T;bzˆ�u�I!*e��mmΞ;��A��r����~�iǝ55
/P6����l)�л�4Ks$S�����8�X.9���8.�w���V�+����\^:g��M�y7��'Z���������-ݢ�&���J��#��ĵz������U�J-��N�.b�Wܓ2�.�W��:p9d�
�o~K�C��8ұ^2JW?���"��}�X�k�e�1����`+>7Þυf�����߽����'��%� }��0� �g�ִ���Zd.ʝ>(�w4����sх[
��_�L���"�p��r��M�h�`���)�=��Em-��zN� i3G�5��ue�J^�ŏ"%�>��Q���m�G
�8Y�F4|��a'���x��>\b��}�nT�qd�6�`�!��?څED��V���:�pI]fy�9^�(q�3,vG��`�f6��2�p=�ĸ,�W?�[��e���0��̇�׽�C	
�̦n�XH���V��P���GO�#�i1@մ�&�K����{I�v"���_����λ��!�d0���@�¨��R�f�!�*D�����6e$a�[Ew����8n�Pm��Q��W�t����c��S��h4.�����g.�6kh���	]M��D�b�z���5���/)��`QBM��ֵ�e>	�yx�G�+�]σg¼��dG�N�(��A,��X|�Ob1E}�k���x�QЋF�@<��q�/#���J�J�?�ß����|��������S㕣����,yz'>�(���ݟ7ED��ذG|��۠K�s�~���*����z|.��%֍�u�Z|e��a-�4���)A?�����!�ʾ4��}�n�Ĭ��S��x�2����9��Yp�b��T_��1Mԕ4�}rקR
14����)*�pE���d�]�iq��z�8%���M��ť٧Fߓ<�Q��4�<G�����tu���拁���f��%1e��2�wF���b�5؇$y��/z��6
�UFa��Q�g�k]$��Xk��x��ϲ����5dF��[�,ncM��5k���O�(
>@�$�M�D2�NM��tG����oH�l�̆����:>�J���]ZM>��Fa�����꠻�~�}rL4��o�����i\�,�?t�خ�5��he~L
���0bi�6Hr3�@(?)HF�/��`��U��F��Q"GWI׽C�J]����B�"w��<NN����Z��4��PeM};0X����*��ܾ
�鄗�"_�E�G���~u�0��"�����}S$e?��"��C�/���D�OM�;E��g����hU���T��5����+�y!��d%J�#��
���ow�!w���а���מmxp�F&�g�����L��e��͓܍�� �2+��_��C�=vm�-�6/%Zk����R�T���-�4��D�^�M=��*	>�{�'�j{��%S�͸��T�/���)�o�ԁ�'���
�e�x�� ���E�ٌ���Hj�z.����0��"{pڪ����{:e��t6�Ā��k�Ԭ���
0H�x�AWg���zm/dS�?���r��w%2%n{�>�O�4�i��6�^���񕁶����$��r��pר�?�Mn�K4��ҫtJ�GL<MM���%qaϽ��"�Q�K)���Í�I����)�ћ����R���,�@�>I�A�CD�qr�ͱ��f�j�}4�5�g��,�䆇g�@�^�>M����VqE�7�j>��)j���'���ʣ�=ra^r�w�~cs	���-�q
(q�Мs>�t��
�1^'"�G�J_˩x'��K�}��‹	�F���r���ǚd�q�d�&��ʪdžsJ�y��<j�[&x^�ZE����������pe ?u��f�Y�b��I(�M���Z���M�W�I��s��ޑ����W-��ڛc�w؝l��'�2#ڭhOg�JE�!2Lys9���� ������\�M�{q����-'+�Y�^<o�+鐿#BA��y�?���:��ͮ����Ǎ�Xr}}���>\tbBZ�2�,�@|Q�;�7mٵ3dž�|����ٓ�e2��0�mW1�\�f�����Y���4;:�P���X��e���[K�S��}v�l[\
{'��s�G2�D�n�['�%�|\���"GA����%	7r����L���V��%�{�B�	�Twt���*{
�-��_�R93��]��ߒ<!f���o�x����^���� ���c͙�]�!�i���eiV�ɡs����>�O� 0���5`�s8饰>ӆ���l�������N�D���5	
B9�	�e�-�N���n�\�O���ڏ��K[,'�S�<e�H9�cJ�ɹ����19��&X���}�s
�U/I�����j�k��X}!'^	2b�Ѓ�������4�V�{!E��ئc�E��B��C
���g(�S�m�o�{���l��K����6���O �L��&�7�TL�_2E�'
�%l�U��ad״\WuF�~�K��Pha���a���`�J;��6)�?��Ã�3��|�"�D3���фn�~Px���i\ۥH�)���'l�#l���A���l���X�~м���6���-��Af��v�U�R=���9#����j�;����^�6��۹.+�@�.�}9�vS?{�d|��p%$^�0���3��(��ڿQ���H�Ս�('��KJ"�a��_bg������\�C�Q��xV�>��M+�5����s���q�2�1�i��-��!�������{lr�~M"=�i�1g>�_e�|%�k�Ï�B��H����vu�����1�y;�/���������o��u@w�m�ϋ�lT�Q�?���G��Wјk��L�>hDbf��3�>������ө������|d��m�$����Ic��3I(��}|I����il����E�?,'{�W��K▼�
-S�$咽�����C�{�6�7��q���%�&������F��ë�
�Yg�ӗ�޿�%�wp���_�%����%:#߃���5��������S'Ïت0/�i/�V��oK]�+�9�:V��\��tϩ�\�u��(i+.���6��o�լq<�R|��W�4�Y|G��ԗ`awm0z��ᗞO�)Aץ��o��ԗ�n�G_rT''u>�wn������Zx�]l��Dj_�}��P�qm�ɜ=ܗ�+ٙ_|I�'[}b�Y�K%PS\	�ةf�N�"�롱���F��	���.`h������,��7�*��T�ŭp����XΧ~;/6�����CI���M&�~��?��W�žB~��L�颏{gLZ��w�"�~�c�B��B|����J}5���g~�gq�5Z8���'qI�Uv�=	�k�!]���m�U�
6񛷻1������P�3L_�d����?1L),�'��ܨ�^j�j�*�LA��{~On���@Ë��E;4�v���a��ޖtQ��q��U��D�9�0�{�S�<�|��֭unA/�7W������š�K�Év2;>J�H�r��w#�?���0U
�|aĨ������ơ!/��~�z/�d�r��d����j�~bC.�gfDf��m�߫�i�_�^�B+�z�?{��dYv��4�Jq5[����q0�tE!�T�|g�����A����_��?���/�?�Io�L����3�ݩ��n�P�q��I�D�ͤ�?�ԇ�|��������b>-�����ԏ��R)7�v��qU���Ū>��_տ犢NP�����k��E�+���T`.Q�i�w�ነ�]W�@K�z�=��—�V���.'���5[wn�w/B{�;B�Ed��B�ka���Ì_W3��;�63���]l�������VL�����zdՕ�&`><'_�%j�
�_�S��c���B�'G�z2T^d?l�V/��R�y�Wz����S[����#y�����'�aؙ�F(�k��M�JN]���(v#5��>�}9�|�s:�˜$ˡ]7ݏO��������������f�G�^�V�a>�mź����F�4�M;��~���cv?���jG�&�_�
G�'��Xv�l���+t���pyDx��a/I*�����wcj^ų�-�a6�/@ؤ-<��-~�p���_X)����՗��z��5�}O��+���g�n�P�_��c�E������齑9Ԫ�򊚅l�O5�{W?��V�FĞ�๚Zo���'5���%	gG����fڴ���j]�����Aa���CT�ؒ����Y8���vH�{n�����j��e���5d�YAA�F��Q�x�sD��!1*���ۤ�"w�wZT\���)>�
�|!뱖�o���*5�䂙����Y�S���ֿ.�
���3W�4ET�����"խ�
4���
n�伢)�$0؋_�G�?��c��O��I7849��ˬ/�6��7�%
s�;W�L�E����
�.��c�0yT�����7Lf��ӬP�CH�Q�Ȱ ���2z�}8��#����7>]���Tb5#���@�y��l����P
"��9�Z�N��'��3N�r�����^u�C�L�[A��2h6���i�+�za���z8�xuQT�,A�1Ax0]^�yE�kn+�p� ���r ��O�K�S��`����N�
�*կo��ͦ8�5U	`�Y�[����Y����E�!�	�m��h yI�4l|���v��lwٞ)��^q�܈�10�J�8��U�Fb��@�kG��������(�_���x�8Ył/{ʐ���ao3bf�e���)+JG�rՔ��O�pQ�5ǯ�e�6?���
����NJ�g��l���|!~�
��?(}���ѽM}����s���L������Q�}��|? �	�'.��e?���U��S�o���,���ۻ|w�����Xx�����h�"Q~Y&�y��Z�q�^����uS�쇯s�*���@=�%p4��\��\.�x�D1�u0{[��u�SR3Gi�<DL�տ����۾=Kt��±�n���h��Y���Z����s���he7z%~�]K�UB���%��/�W7p���7
�����er��S�uk:V��`��� �o�6�ܚ�!W�E.�H�̄Rd�ET��*<��Nsolγ�2D�''��oTc�V]��i�R>�j5dNRIȝ�o���Ŀ#��s��44�����|?9т�Z$�y(��6]C�D������Y�	Dr_v�~���X�ȳ�-kД�#�32e/���/�ĵ�wҚ��抏�t��0��+����{N��t�M<���;VR���97�R�&4Ո$ ����!�7C\$��Y�"�x�yo������l�!�����G�A�J6�9b�\��:9_��n�U�`_��W�,9�eK��_�s�}�jIh�g @�� !��1RWVf��m���VA�}/�%|A�L��8z7�q���w�������h<
�VI6��Ұ��PHN=��.�8y�H��"G�ӛrQ����_6/|�u��gM�uʼy�H�<���bw���j�K�l
o��ӳ�쌝O@vL?�{an9�}e	z��ÐG)�cwi��(��/5����� -6=��D����N?۰��f�|�56t�B��b��
�$�wxf��l��b��G;}���eM���&fJ�l����d9�0�R�$�w%k��!G��g0�w�j����n�fN��R�R�lkX��q4�p�3o*�C��dq(�Xg.`8��cz�LQ-Y�p�*CD�<L&?�V���^���(�̈́�@�9C���X�zZ�[�̓'D>UWv�!�����X��	���S�HJD�m�RTn%��qNǮcX�4�)��g���Օ�=k^�%�?��B�QUw�-�.���W\P���.p�^۱u�_�:>���>w?}S�}��ǛN����/N \�XW����w�~�v6��;L�o8)wgԷ�����a"wKwm�A�C�`�Qe���r������}}���a����y@��Ԧ����mG!!��p���+'<҉':�/��f��Z��\��6]��v7�!X�?�`���1�M.sUp�A.G��	��W����s�~��E𓾘W�?���f���'��U>,Z>{�l�7���(��x_�\��w/X�}?�Խ�x�������O�Ǜ֣J��\��\U�i��yQ|'	���|�x��=H�u�d|l
����[��(�`��"ٜQԙb�b}sѿ�x��$,}�Ɂ�U5ODW)���(e�������/VT	�h+� 7�aV�M+����օ�|g���4�$������h*q…�R�܅z�Q�Χn�������u�ڪW1�;�������	���c�ܿw�שZ���C׭}�gˇ]�(x�_�%������QYK�MX`.�{��d���!�t6��1�`���D���C|ݷ�s�-6�4BN��-�j7B�q��5ďFpE�����k�>�XWp|�95�d7O�a�����?�}�����L�ŷp�mg�Ă�ar(��^��[��o�|���A��lN��S��X<������û�V��3�ȴ`kA����B���T��
��>/��Q��O|'�V���kه��	)��{ͱ(��SN�>bﱺ�%���"j'�N���g4�/oN���6��i�	5t�
â�GA�|Ȋ��]i/9 �Nȸ����8v�ŌeEL8c�%6�Hp�m��o�K�0�-�7pܱH'�(|�R˔�B`�	�&��zI,h%QE�b$������Xkʅ�W��"�Ŋ��_M[�����
.P(e{ 3������x���a\<�O�|j�%b=|�//�(����Z��H&F��d��ԌHmK�Afr���Dn�D��\���ر�v	m
)I�<.�d��pe8���B�9�>�4X��%s	ꢔ�<�tYk/���T�
��Hzz�x��x���A��X����'m���PA�.b��B��3�y����F���Py�E�a�zZw�šp�.�"�yTW��*Ŀ��T�C
br|����UV�avt���6xlp��r�rL
8��p�D	
�.��0��C�M@�䏬��\@����YM������
��#�le(�J?�97����h��g��I'�-�y��'���4NݡY�@��sh��:��̈��6+��@“���{�g=|��Vo�v���P�!�1f�p+<Q�ѥ�޾q���E{h��a3M��� c�*G}�`�>Cd�Q�/6�P;�}�j��%H������O���Wd_�
�ڦI�أ����a#����"vIB�_�}7��Ak`/S�D#�"���̷���o�䃬�jIõ#[��|��'*;�C�,Q����	W'4|i�
yT���CVI־n�n�Gx�-BX�>���ov\�赵X�u�^����_��F���;�旆ID�͗�f�A#��Va���8$B�HO/#��J�����h($w9���7q}��A����7�^
a��PO�'mW�����>�u��{�1n�*2@��[q_�-�L�<v�K���{��&j�@�>��̮9<H�J�)�Z�!ϔ�m��p{�H�W���V8�|N�pSZϲ�/T�0�&p�k��.BB�A fZ�u��7���G��Z��>�,W�{�7Ӣ�L���粛q�y���h�|��W�~޴��P��?�=�h�����z�/^ߟ����?8>/4�
�%|{�iA2�c��k��E�/K������cn{�?v}2X\�ߑq��2b�Jk�	�%�K|X�]#��6�y�2�mI�g�"�a�����׌���˗ax���"�3vX�jAD��@r�e�.Ji
�+"���h��E]��_�$8����f!�(��_}�n\,������%-6�ی�����8λ��ԳP���8�|=��p����
Ἠ?MX�[�5Ɓ�@�ue�u7�����E����㛶��V��Q��so^*������l]op2,�Oz�5t�20λ{�򹨳�q�l�7�5�N���!�PO(��L��T���g����U�Fݿ��pˆi�7�h.Õ/�ٞ�Y���b�s��Ñ�3x竫b�4��5oa��n�^��,��qa�*>������^�:+J��mU.�����:�[��b��pg�|�|3��D>uA����o϶P��q��ދ��U�Q��������c#X(���'2�������n�sy�1�7I�l��`��op~\Ѽ���>��,M,/�+G���y*뿃��ʇc�prK��D���Cxj���	��<
��8<`���zb��%?�+��Ɏ�����!>=�{X��P�#d�r�-���^�M;�ƚ�R�C���G�E�ׂ�!�:�f�������U���@8��F�t���\�T�*�{:�+���1��ry�7ŋ��q�R�%�����X���-��i�zK�{gW��˜WF�����A�ȭ��ڮ]UG��u'���]c�I��1?;P�ܗ�]�pG�Ʉ)��j���W�� ��c�����V�w�l�T��r�Gx�&�a�tY��/}p���ѣ
�r
��$ą�IA��k�
X>�KO#�����\Ko%R��d�D~��:�:��8k
���Q+�S�D��ڸ3�����E�"�Ώt�U@�u�r$�r�?R��M�}9���}��Q{��8c����.��V0/l��1��
Óa^w)vFe�E���d҅d�EF�R~�Z�����'���A
��_	b������_���b���������G
%�_؈�f+w0h��;w�*�����QE�]s��,q qyr�/I܇wHn�G�	����>�p�(�aG��Qo�!I����PEC1���Mߜ7S�
Fs䒻l���'�/p���z�:$�Z�"���d:�\)�XAT@���h�R�g�
l(
���t�̼(�ͤ%�K��M.	���)it��tL�ҏ$�K���0b�O4s��L��x�s}~����["���/3�����1�az#��2�Y���fU�U��{w�y~qO���A�o3p��
Y�{ȅ5�h��o��iD�]��v��!��q��.NK�%�4J���p�j!�5���\�I�غzV�,g|J�H�@��ŷ�ހS���0�J\�ΘHox���iQ\�Q�=����}��e����O�}�
X��p
�mA���ȵ��K5�j1D(���g"��yc:>`_"����:6�`�X���m�r��0%��L�]�<���0���ê�ʟ�i���w�<��i��h�t���|k��8�(Jn�1A���:���<+��ز�y��+7u.W���lR�H��\��s�b��J
��?8�~�9�����?=�����翍��m����Q��R��zC֐�Y�n�e8�� T���<��K�A�����:���f1�E��⼋�ӛ��ro�j ،�*���ۅS4��a�~�T|
��x+l��P�~��0Um%�{	n�`�kN%�+����d��Q#�bc�~F�Is���X��;�	;L�yc��m�2��~hyX���L��ٳ`�}4��5^����B�@[Φ=�I!H��3�;��X��K���U�7�EZ+z����A���V�.U9��^�m��ǻM���v]�~�1!�'�ݦ̿������/�@�h��]�ȇQ�硄��v�:��\�5�k��^�zpF!cq	�Oy寥����oEZ��C�n����XE�4VJ'�����&��{>:*�uA�����y~�s$�����O���O�+�
|7pQp��k%,`Q`��SOsf��Hԅ
y�4��Q�t�i��-��Ո&���-���e�h5��3�ݪk��=B�E@����7W�gl���[<N��H������R��,��%=>�9b����c�)��8����f�oּ%kO=���_(2�ŭ�},[Xn��R�q5����n|�î��
��T�����
q�{���21�0o4�ѣ{XX�:���R�:yv�'7���߉F�P$<���3t��ktJ�:���c*���M �^��m��$r?�#����3�������)B�/�����P�ɧ����f��h�T�R޻�2�(�B$('�߂`����m�?I��/׈��(v�d�����!�}`�og"};sQ������-?s�{�hm��E��[IN��J
��~��/����5��;m}�f�W����B��L��C\�b�0l@���d�k�����#+����h��"B�rޛ^pĥ�a�<���s�KLW�W�3��H���Q?}K�ԁ``�j�Խ�
c��N'�>n�&c�d����s�BR4]@{w��"�p�H6��,������|9l��]$X�ޚ#�t��w9�
��\�|�QxǔV�]3K�S!ؼJY�&?���3��FtJ)���'-�����4|��N,��p[��W0-pM�W�ǻ�H��>�k|�����I��l��r�?�v �3Z�j���B�Y��ۆt/��bIӛv�
rOqZ��!��~\C������Q�2wP�36�	�+�%��ڨ�fp��0��ۣ_�dE��	�Z��U����/�o�?Y\�f��1�<��X
b�w��@	����e�Ɂ���4Z����}#$(LKr�b�3Ui9^b.G���Zq,O���U
�e�$Z��G��d�w(�F$T�3� Q0�)s4�$�^'�
ׁ}�p��)m|h)$̃�t�H�k>����R���)�HK��"ʫ�@O�$-g'#e��RVz1��}�,Wk��Fq���~�)J�!�T��[}'�a69��b�<�w[hjNM����������Ϋ+�l �k�jTV�(���>�}�4.�iW�����4�£~�ㄉ��4f�h_�=���`��׮�ko�)0�PI�U	���V~�q�s������z���D�@9�Q=x�����)[$�x����L]�,��(䞐���
�'�x�xq���J&J��J.8�F/zz��m�A��OX��$��4וd'�a�4CE�BW@��N
L���
���툢!u�a�sQ��@,w�8%��l�U�0�2�ͬ�C�&�V�*«��}�
ɢ�D
iآڳ1��8�Ԯ�]�*,��[΢{f\�;s�j�Q�й������|� }�Fa��B��G�A�}��W�ʦ�bxQ�*�x�_���_M }���f�i|�W�{���j��z�g������V�|����J����/b�#����Q::��h���o����/����^�F_Ű����~�+�n�>�y��I�m�?>��}Zm�i�/h�:��}��'����6����7/�����V��}[ǖ��qZp١��wՄD�J��I���̫ZB�|�+r
T�J�;�xw�J��	:�Q�za� O��?��5��bXt�*�Y�RV���>xL�;W+��p��IP��&��[acJ9y���^��k�\�	���\)�g��y>l��V�Y��:f���ICr�\���
�"W���p�	�0��2Rn
+͈[~*W-�,�a(����(ۂ�	O�qQ��K�ĹS�E�=�$��������^�_�E�3��P�y&��F{m�m�U	�3��xؾ
AU,׾Cj{�jC��"�;Em�Dp���S;���'��q"K4U��J�nw����lәt:���cϩM0:�=0������g��K#�vo�:��6:X}�����9W(���d�-�ʶ�o5�xI�<��ڱ��J�5f��k¡<�8��ʘ�d箺-DԳl%#V������Y���đ6��*� i���^[.�)�����G�{��)%����{���S�<��P/�9>x��\�K�4x�Y��o��I��Q�%ު|=�����`\љ�?&c�yL�����3��W��P����ߦ��]��$t��������)�m݌��CI�Š�k��.O����9��L\K�5�rD���o5=
?Wk��|�'Rflv���Eo�������ȝϽ�.^�O�*~ӽd�?�"���88�&��g./��K-�π-���aI
{E�`K3n��S�Xu�&�&�;�6g��`���9�
�ܨQƗ��%u���"3�|K��Y�D��/Z�w����'	�:�9;2u��?@4�m��C/$��G;�bM��n=��8�,����hd1���^�2�`Х�5��LLJ,�����>��S7h >w�����/g"��'�T�KE
�ޜ�]��A�c���!�э-����rSGa��!��A��edc��`�ۓ�.9~ђ�A�ROw�f�9��K.X�*��B�q
��xKL=/���>6�:ljħx�[�K���s�gp�+�1�(Gb��fTD��L�^"�^W�?�{g;E-қ�',(��1퀡�m�I��ߒ�;��p�o�ku��-f褭�O��Y�"��[���%��Dbm�	�X�l������_�����;��
ؒ~���Q�����8%�=�M�[F3��m*���2�3iF�j��,y?:��tYΟm�Mæœ�"&�Ԯ�������s'�9����FM��δ|��ns��n.�/ �g�i��6(3�6����q�?i0�?~=%��$����R�d��2�Ů9��`��5��4pnp��h��{z�zo�y�ۇ^~���Zi�#B(M$ҷVPl�U��΅�Zo���o�|گ�<^��a@�[
HѪ�~��o�Vʚ"Q?����ȻX�p�5xi� ����!q�rTc-v���dI�M���>6�/��s���>���7�I��?A���P�{A�NKj����ؽJc��_��h��_RQr�)��&�4r�,��n��L���vÁ7�K��������8���a���N5j���3?��L�q����V��@���Q����6�:��ݠ��Cq��W�Z��տ"�?���>���w��&��k)×X夗��pN~oA�����6/qF
��_��.d�^�RC��bΟB��Ʀ�;��Eh~{-;��Dq��Z����+�{���[�}�z�o[�8�߸��u����0��_���6"��&�}��jfLJ4�H �
�9��n�tqRM������g�!,+�O��Lʇ1Mw3����1U��xM��a��uI����27'�/F�kN�����O��д�[`I����kLl���y�\=٪g5�:��p�;p}����~����B�Kp�p}��\��~�7����e`�]�.ٙY�
�S��8���7e0��^nL���3w$�'�؉[���h-����sM���`	����𺽂�ICw1�9��>[��V
���+d�D��s^~��cͥ�Mw���ߋ�f�7�}��N�ڙ}Ir}��g)�K�Ĵ�#�D3�VsI�/	��
G�"�=�i�D��9�+Ï��\ƞ��S�4��Ҥ�/�tފ��F'�>��r�˖����e+"=�G?/���
�6�����8u�[�>?�:B�a��pkzZJ�H�b�O<@-]�G�3��Q*�ޝ��s��j�~{>��ֹW���*�|t����6v�c8����o��)�!J5h�#���y�7.�	S��F�U�l�|���u��Q�	�@OF����6�|��/�.͚��tٗ��T��4���(Ez���ܒ���N9�h�ܶ^��]��ڿ�)��� �W�}qw�!mC���MJBpπ��Nj�9� ���f�/�Uյ4H?2G�Uƍ1.��0W�e�O�o�2%�wsh�إ��o�C*r\��8�X���V��(�[;��$�@>şH�^�0������C�ƻV*���H�s����\-�Ԋ������qT��/*
�\�Vg-c��emڦ���:ͅ.z
zd�=p�T�L1����MK�L$xƸ*�Pp�����^yT$��rs�O��(�v�7���(~l��/�G��I=z`7�OӰ2j4�Ə�G������޺�ܯ�i�.:P�,�o7*g.�C�2�����\�B"U~?kfKc�ޯM�v$�6{ʃ���Q17AB��K���;�?�嶡a��=�9�?��E����qnفR���]�*�d�J4���%���lj�M��İ[g�>�j���G��a"�S��	��v���\
\��-�2cO��K1���-���ʊR$�&���@�ev5�t`�@4�mK������\��G���x,�i�S�%p��v�z���B�oEzZk��_mj��XD�� ��'`8	�d�D2��.>|��zCsq�+��
�	����|8W;y���nR�~l61���__����3q?�f��p��U�S��.9���{� ��Y� �+��G����zJ}ݫ�co�_ց���UW��C�ϝ�?�7�k��W���nN%��װ\�?�Ч-�I��ve�ב�p�>[g�_g��o>=>���H�i� ���h�<��)��%���z�q�E�Օ�a��[i/��_��i��B��Z3�H�G�z�e�i��ܳ�-D�Ȟ�U�
k��kw��a/�����~m*Ki�<Or��I��}����A�mg�"$��5(qH̖iYp��h���	&��/��
%�ҷ���b�Y[��[)���e��ڝ{���y�c���E�Cx�઻;h�s�S2�#�+>6I�L\b��Q�ukl����S�|�ҳi���ԃP��dwZ��7�}~���UݎVG�(8�sb㦚�vV�#�c���JY
�&��D� �R�>�;�TH��IG���p�q߉����`"�>Uc~��]&��oJ��}7�·c��
�y�]
����//�|.Y.w�)�����hLt��RW����]��4��P�y�
k�Z���)���H9)��Wb�݅,�w��%%u5g^{D���)���J��M�/�Q�8��T�����D�\���R����vwˀn�e��o��Ď��
���lS�#��]m�L�z�
z�N/��}�<�"'r�@�ʂ�_��"�9���oY~]1�[���-�E�!l����f����0�F��I����
H��į!��F���M����6��W'Tp�L�6����*���>�If�A����9 �]+03ŗ����*_�|G�ivi4v�;��'��;m�cwHO4�L)DF	a�T?�:�ufB>p��^�+f>��>�Y��7��<�z�.����v���m�xe���P��z&�Ճ��7k�X
�����,�#��!)��&k�o�B�lV���u�LA���-�?��l@�o(�K��u��΄1�[�A�>ϷP[2ԑ؆��Q��/H2;��W#{p�V�pɂ�(��1�[F�rrO��Ǯ�8ʚ���#,-p4F�H��S�>�z��n�u����z6F��k+�#����Rĵ��cʴ�!�� lT,�py�b�a!1�7�"��r��C
*����ɒ
7���d �^O�ZrtLQ�<q�+-�/m���Y_��u�g��K]��E?Ӷh�d��އG�P����z@�<6�/�o
Ou[ׇ����k]�%(��|�:j�N�).5��о���M
�z����J�&2�E������q�.Ѭn\�4��F
���)(����?�fU�8!�K��\�P��;!��?�I��?6I����GL���V�D>��+B��G��:~4�,��3
�
D���u�n��{X��?�K��0�>q��F\�����cz��u�D
t�"5�>-ɨ��7_
g��5��ǭ�
^���9�B��u��V(E~�D�+E��Eki��0�1
2.�N;f?���H-���˚�FA�����d�����7�O��0�n�:_N��{�e���g�txC�r��y݌Q_�H�^{���%Wǁ�Eސ�DhS�Dj�yc���(���B
]ǐ��b@���?�J�&
�/9T?����c�ˇ���\�����2�,���a�x��3���x�~�1Ff�A��U�g���g�]?A�-����՜꓇Gh�W�kh���:ӷ�S�Û�$\���=b
�w#�o�>2�O�蟜|��4���+�߆�?n
���{�SD�E�7����a�WXdYW7�n
r�ͻScnU������͆�{{/��˯z�U�G�����8Rz���U1����o�R�/�e���*>�K����E:���
�Y�a�Y����c�15��O�k�,���.'a���Z�qh��e�Xd{��;7�~�

�c���kB���3t�|��Q��jx%j�a��cb�
�i����
��\���V�����$7�
́x����0�EX���]�rjW�����
/���l4�p�K�<.%�����������^��W��pC��d�Z�\�e��.�-ā�}@��ޱ	d�$c��[��lk��2�5Ӫ�&��:�b�z�5d��u��S��
����W�%*�WZZ_lB��EQ^�5���"��
���#�|�ym\uJ0�o�#�n�7���A
�㭥h	i���-&}�uy�P_��È��a�
..7�!�#�̶,
��t����s�lER��̤g�9ʆ]snD���#\��Ha]�����^_�"�7�K�~�����.M����.����=e�vф��~�_@������V;ȟ ���!�ʋ�
1��֗&ɯ�_8�o�%��qBZ�>�$M�m��2�K|E�F�4dCæ��ha���d7j_�U�v�`_��-�9��y�G8H`
D��:D�C���."�y	�'��r�ib������{#�#8k�I�G�l��#EXS�	T�Ӝ��Z6	�l���0웸��,X���[6f�Q%�$|'/�=]�+ߐ�
Ih3�w'�x��	_Q�_檞���V��������Ũ�(2�A;!?8�ͮA���K�qOvGB8q�@9�V#�r�E
H�"pJS���=�W:���%�YQpFɳ:�\?�^Hb��χ���p�mhOj�t�=TB��ͯt� Z�2�#e�ѷY@n��W�؇�(�RcƳ�e�q,h�ׇHˍ�6{j��E�H}a��}Ca^�x��bQ��}��5��WH�䒱��IG����6�T�]���b�6�娍�c�[m9���ÈxAyJ�X6���0b@���>��`#�K!Bb�do��CR�!_s��V	#�I�.�ܦN�E�T�����u�〃
�nt����%A��w�m։�LBQ�p���v���j��1��d(���V����X��7�c����OEV��5譂�Z�6ӝo�%f��O;Պ0x=6�I��z'R(�1��:}����U5�㱂<���
���_��zp�َ��ݶ�c���(��u��n�Ҳ|5&
�xƻy��R��n�"~��GS�낳)#�c��&�E�K�@_��Z�=lhA�zm��c����-A���0t�-���܎ÓYy���h��LZ1�>,��Z	o�S����V��&����o�|�"�<�~�5}�#����O���\nt�t�=�(gO���B8f�I���|�%�s��2�10H�����P�9��#�t���W�A�����o%d{B�6�~c	�[#L�,���o]��xV!�H�-�ڐ��3=�P9ݬk��Qƅ��%ﳬ,E��f��}ro��	
5�fgL�b��)\J�x�-��sE������P�,��{8�=�C^�qż2;Msq��Хrsj���Z
���]�*R�7�\��w��)#��K~n�UT�_��?E��� É6��p6�c��ΐ\���D�E�Ϻ���jTW�ET`IQ�z���������m��CӖ��N��ڽ�$���¨����?�񮿠
��Bo��`L�9f��n)�W��m�Y8��Y�}
�N�V5%�Ԣ�_y�!�S`O��EA�׌�y�3�M�c-�Q�nĵ����4dC���t�JN[Ԛ��Lz����7�����D��IJ�`�Ӵ�V�4���1�fb�"�-��G�ߵ<-��v��
��.Mw��Hz��,��*�i�*��A����I�JL#`0����~�'�>ⳕ�=��=*�\��ܸP�/����6L,Z)�[�
�m�q�#,�ȍr3�AK�J>\�T}�z)��[2�)b�j2�<@�m@
�Ȃ�gԙ�:� �T�d�q�	��O�[��������j�h8�s�Y��H�2�_y��sO@<e_V��2l3o�v������#�У��y�l�z�%?�ʜ�^Sx�?3�N��U{𱄾������M�ܡbxZ�K��0���_��'B�Y�L5o
.XZ)�':	&Y��B����4h�����$sD�T���_Eu���ӡ�;4,ʙ��@�Ư$~Օt��E�����P�Σ�l�
�k�>�H�ӗk^r��?�f�Ч�x�U�
����Zf�k�$�U|"
�f�J�ldfk���P=��x%�-���W�ō���R��"kɇ��º�BY�Ef��h�n1y��n����=ڛ��2w�}��q.�Ã�J
���3��u��ԥ�'�*j����9��K����!ރ����t�,�m�V|��^�w��i� 0��6I^1�����w�c*]��"�E���cK��lPSA��8��CW"�yC-@� ���E�o5I�3c\$���x�&>OL��3u�+�Y��B���j.)���ׂf$�k����vR��RP[��r w�|��$5�
Lp�*s^�df�0%�f�vмߢE۴�kP���Is����x�jb��+��a0g���c����,4����$��Y��Ʈ,�8�M���*�xS(�u�.���]e[�5ص�����h���xG(k*���[y1��?�@"sm��M~��i��S}���T̅�l�"�n�/ך������Ya�a�����T��i�����i�Ϩ6�|nkf�b���/z��_-:�f
͗�ͽ�H!�uv	>�,s-3?�]~Y���S�� ���>�9�`4���C���a�Ǵ����,,D>?SN������6T�d�o5��m��=���n{�����=��/[R�@N~�4���ԏI���IjoË����g�t�LcRX7k/��3l��d7���-@����^��f���}��XLѓ�KS@ue�˨ܜf�a��;]�<}�gjFT��/��r���㼐a�vb2�)�O�"ς��]�
�k���5.oȡWQ�F��{�<�Wg�;�Nx�ɭ�n_̘�@5 !�
�[���\T�N�˥����H�˘L`E�ё	t���cȋB8��}�_����^@�A�t{��j����o�o<���?b��	=�}�AI�@��(%K�PÆqq{�����y�X�_a��o0����&OC0K�,<����[��3�<�o�o1	|���b�V����Y�w��zق�!��4�hY��A�"LՕ�#�,]��z`!h����2c��]�c�J��8��]D����Ɠf�h>���w��|$]г�\^)&}q�j��6���
�M��	v�#G�H~Վ0�n�s9l@
�\K�O5�,:�R�#����A� 7�uF�$��q�[� s�xy����(�qL��{]��˲�|u��1��L�߸��1��~���D����	�Zr�9p����d��뾆щ�c�q�݋
<���a��0g�r��/�$��\�yбpC�e6۪���%��
�ƚ{����f��X�q��-�_3��(L��������F6������CxR������M�s`�������j�%��&��:��,�vJ`R�Sjڼߓ�44t{�J7�ܤ����3K� �2|z���+λ�\���7�A�8:�Iu�tת�qM����#��5���Hz�ب�.��y<����uCJ��nX��B����QdA��
f�f����>R�,��=�
K�q���J���-.k~�/�VA�C�5��tDF��۱'uPN����q�þ�����#?��1N�?Bg�����Iw}�9���I�k[�������@�m0�G�,�tպ�M������1��0K'�rC~T[ZT����a���L�CBx�z�Z���1b��)d�}�l
S+
?�'i�S,x��x�E{�_W|����4�Nb��q�A(�\xh7)��r�h<�1t���>��x���B7����,jO��q�K�����$�r�@��\/]8�8�J��C�C�w�amT򴗌�,$`Ց�|�9qS:ǜ�r��,���B���[�߻��:�Ty,t�W��J
�5M�?r/��y�[w
@��ʓnd���,�grw_�H�ߔdv��/]9�x�tp�C���~�=���?��3M�w���%��2���xF�}�	p�N�n,~t����k�8K�X��HѠn�m���"�=�"�te1��*��X��5����fmP�%���2�swh��j�X�ŝ~���ݰ�����,po# *��G�a�����4z5=G�q��Dz{_-����
EN+�Fb��\
Ӌ���adIq
���%�S,��?�lY������D��Y��>�{�} �H�����ӈ��)�ןK�'��Dߥ�����T�w�G�I[�1]�O-J|�X���}p9q6;l��-��O��6�~\h#p��U�	9χ�Rnm��>��?���#��x\��2�c#j�f�
|v!�7�4�����_�|�~��
�_}��)��8�b�b�1=i&��Cl“*#���p��&6�x�Qq>{��$.�r����<��4��q�"��x��8k���weB�-�y�tJ��+�����o���\�]`�kk@Id��"y�(}�(m��+^���j?��m�T��(�v<3zf�+��-'�iSa���R�"(R� �ܵ�S�G�����ꓤ�Rr���Q�a7�O�#+cX����_�9�!��خ6gp}r_�B��OU�~ړ��)����`Lbi���=�ŗ��JPF;&installation/framework/model/model.php�
�.���Z�s�6�,�H�IYv۹Q�I��M�:��V�f�ih
�x�H@��d����͇�v���<L�]�㷋�����g���]�=;e�l��L&%g��2Q����H���r��cU�Hě�K�|��vl����GdK��:Os�l~(�k���u��]�;��7%{mƣ�~w���"�7yI�넽�v2/�*�%;2<��%�J��g鿽����(e��|`��=�����RX���G������/�������g�X&|8z����Y��ovY�M�K�\�	�����l�._��C��@��
ȹdgLF�����-H&K`˒�^J.Q�W4���)>�{��K��HF�<a��8Heÿ́⠾�$�K�DQ
6Z�II��	,`80YE�4\Ԥ�f��@O�͊�$�ok��_س��J'��@
�V"��Bp��Ӕ�1**�?R�q�@���έ�>���s�nn}�sc6��$10(u?�I�n��uj��Y^�"0L���"�xVNMYS8aY���m�U���GӣIH��=�?�Dr�B_�rc�;�b�ǩ�D�ŰE=3���]%�p����Y����U���}��25��ا�W�{z�dņ�\�3���̛ybM�k^��(�!�_£e���}���M"_�dB'����n���:
��ֳ̾��l��Ix�U��T�n��
�lc�<���`D�Q5d��G�[�O�,�7A�:P��M}�1�o�BH�t�����f���Z�j��%
�C]��
��ۡD�!E����87�n���?h��`�\(�@�z1�P�	��0��k����B
���6h(iC�(�mQ�4�ur��h����2Q�T9@��O�m��\F���W��������Z%QPL�O���B�"� �B� )�(o�B�	�ۄl�~E_[Ki��P�Q5�:X��pJ��'n�.ɠ��"- �F�#�!�0��9K�Y.0�% �e3�� ��u=�&5B��=hp�XV��Uy@��!�/+�AU@+Q�TYe�>d��%ˡ>ɒgX�
i&EC..�C�R�\v���*�-�h��yQ�Tޔ�c�.�O�9F�3�c�]��|.�l�����$S�9
�㧪�J��f
wl�3���R��(Ȼ�a98������LJ��Mo���M��a~���@,�.����ӫ����)����G�u@.��

�9�^�R�6Z��4���
_EUZ,RW�A�E�M��$��jɡ�,7��R,�ZI	���T0�<���֠��V�d��ķ���v�
$���/&c�H7�˙z�F�×�3;�!s��6�῟3�E�龙$2Ηr�O�a�~���f�:ҩ����ޕ�\e���G�f,��v�5E5��P'*:��+��"�&�G�
u$�� ����Q&+�.�A�O"�s��i-}Ѕ��R�U>=;y��0Z`�(7�7���6a?�����=`�;'�W-%�z{D�`������.�w�4Ӧ��UB�5�ׇ���LRy	��*ɖC�?T�J�t5��N�O@�q�6�c��Wv�2��-)��m�����J�=�[)?4g���+�c�;�c3d��Ϟ>e]�G].��q���B��.F�e�_��=��)��l�g��W%:u�|o���p	�Y2X��L����0��`���O.a@۔)6��H�v`8�U���C��<�h��
5���"��_��k
Y2-�ؽ���y%b�mZSA�	^�hF�3�v“v+C`(�٬����hI$B"e�I��F��ǵ����Z�4$ۘ�
�jx%!.l��G�3
~S��T?�����nRl
��4pe���А��]���U���,�&�D;����@�A��ޑAmBiw��M���DJ��\"`��V{�'F���6�J�O�XW[�zٰ�պ�^��Hx�1F�߂Uq%7�

7�kk�*T�x��
�������j,l7�
B:�TV��Ǡt�O�sԺ��Z�4�������a?5��_~ҵ�c4��-8�s��f:j���W}ȓ�S���e�e6��Yś�]�bA��<��K+ �X�2���d��<W�@�x�Cq;f���JrMU?�#ڱ��NK?h��@2�:/�O��m,�{��O�<�Y�)�	�������>h����ϑ�ۚj�x�йEmt��mTu�U���ϮoS�6���pzˀ��h)&Do�͋z�q��C�!et'\��'�ǝ�
�+�p���%�}�8�����ݎ��ptTo����=g8m���@+|��Y�9�Лv�a�\�T�/�.3h��7c��zK�F:�Z�{�_N���t*�Dr�}���c(C�S9�.��>-f���g�iW�8��z�x��������Q���oa]"\��-�DXp���?����h:j�����U<:��T	��u\L�}��D�0h�H8c�*2����6�9Uq'�o����H�S"���dAI%G�|5:0���
���JuC�ژ�i�D�H�N�Q7b�z_�FZ���6�YU�g��GtNt5�נ�T���NT�M
���tW�zEs�8��,���[
�aI�H6���n]>� c�L:�_�魕z�M5BF�!Z�B�ڜ&�$�d)M��u��D���r5��l�&��*9����y��l�O���ң%{�߿%�ȊgY9���ϟ?��۟}�>zm��ۉ2���?x�u��F�H�H�tWF�B�-��D������p�;m��մl�����L
�k!�2�tt�J�f�@Ρ�4�mߞ�/,%�[=N�W�`6uwp���o�:��GX��Z�z�Gq��!�y�r�EU�F�R�:������6w��Ώi]wQ4��(�7J�2����|�W�r��S��]��c2��
�cz�h[���<�>��&�G����ө�����k?�)���X�e3��f�WL�M��j��ԁ��;�u�,`�.�_t�K��V[b�����*�1Q�üuQk��}�`7:�4+O��z�:*SS'�V �W?��3�O,4[B�D�Gw��N�:�x*�B�Ƙ�u�g����#��dw@��bA��� ��ɉ�j��RdC)n�Wd�zŝ�y뵺k�9	Ҝ#�����vX箍ҍ��PKF.�B�'dR�vf�s��`B ����F�� I&�LU��֟���B��Τ.W<ƕ���Ә�V���*���%���ʘ-�}�'K�����5��hİ�����L��'��
6նC�-j�fJ�^��כ����{��.�yAi*L�ltm��>l8��)x���{�Ez��o��t[4}+��e�cYt�ؼ��I��
�Kk��ߖ(5�ك�KY�;�)�xt:n(yA�֫��o�Mk���VYk���K��JPF9$installation/framework/view/view.php��C���;ks�Ƶ��_�n8%�R��3�9El�э,id��^G�K5�b=���<��)�i���L{��ٳ�}�~W�����_��"8}s<��r%�J*)J����$τ�ʤ��2/�u}���*��JD�+��|��:�k�,6o��ik�2)`4��B�M"�]�er���K�kM�=}��gO��^�&�*OC%~��W@Ѓʋ�Ns%�'UL��$��B�oNߋ72�e���ĉ����}�~*`K)l����A,�I&��h�8��&'r<y>|�� M�WY�N��2/dY%R]
"�N�௉��k��L�r��+E����q���܆�@F�e��o{E�W2B�4�Hdu���煼IP0�<���!�J�-5(��7EX�����2�nz���s�ݥ�o�:���ֽ�(���8��I���qxw2S�t$F�����@R@F>�P�f����@q�\��z�^�ڜU��S�����y	rI���eOc���4	�$0�&������F��b��)����#X�
10�S'�I*gM�62�r��4`XQWfA�Y�]��H�+"
����2�Dy�Lnj��;1�glV�$�=\���c�b��`+@�E,x�gU�
�C��}�pF��rh&�?��k5ʘ~eF�����X �ǀ n2Ià��&q�����������������'��ķ`b�eN�*wo�d�<U/��d�E���b���:�m�5U�%MY�"�v[�*�!��Y�F������ƣ|]�bX�i,��nDZ࿖�^�u�@�ݍ��8 j�rr7j��4��K
ÑaQ[�`0u�#/x���f���y��D���;�򓧞N���ժ��|
��%A�;�vP���`��R�XX]w�T��
x�
/��8Q|=v���w���xV���FV�@P�Ei�GKZF����V�D��Q�6�Ʀ��:3�(�߽����px��,ŘX��(��05�я����C{�_~0`W8��{C�‘�>G�O�o@��a���I���3��f��\�G#r?����o���37!�}y��1��_f?�:G�I�ݡ�i|����5�	�Q����x�?��c��6]>��Y��}��k��.D��#d�������ś��6����n�0Y��<�?���W�e�
�J^?xY�ZS���&����&n�758.X���NN���S1���۫��Z�Ѝl9 G"6�Ϲ�
{��+�R:5EϪ�
�!#�^x�	n;�&N�"jq��~����`MN���`�h��A�1����"��$�c��yG�8$}l�qD��9RظM�"�@�����9[iw�l���s�����LZ;���W��mk�XQʛE)Ax���>�O���O����i�u����zn���2LS,*	���?����9ՃI�L��lU�S���;�%���_�q�sC�x
��[�Xwޗ��!>�!h"���K��(�q�aZs����$÷�':٧����=H.x>LӼ��gޜRVu��9�01/=3Ya+�c�1�A�ޞƄ\T���0�Va�d*槗��go�<���_��Ө�鷲Z�1R	lqX�bY�k�n�*Pa	-�j�Cm�0�s#���v�NM`��o�J���L݆%�9�Y����R.a��f��_m="���4v�Ḁ���Q��d]��bȴ&��ĝ�[o#�c�u=�ٙ���=�Ko��L~Vy��A�n�&�5�dH�WtX�?b�]J�ӥ��Z*,b�A��bc���^����>�s�"��H��:Ic_`t������\��it,g3��_��Z�;��Kc�	��c����RK8Iu±����UX�ђ,�J�X������u�un���۪螮�JS�"�ڠ[.eި9���2��BP�W,�A�	�>�ZvM�E�
S����B���4~��6�t�S��ߠv�M�m�b[i���n���u��O�B�zT��|J�B(�$ƪ��)��Z!��$b9���������8���@ x�N��M[����9�k��1�c6r�C'����a��ל��]����=30]N��\�a��Ǚ6�t��
b�AG 
RҳR�	����m��Ky_.�#�.���㗔,-�g����x3�\�o��T���Ӊ38�D�S(U_�S�^K���&Ϋ��Lg�������F�fB�
�PQ�%f�k��H�����$�:z{��F!�[%���VZXJ#P���i�f|�<,iH�Oas�u��DZ׵l�r��)Q]��]Wxu��ׅ�L��)lTּX#1‚�2�&��b�Fn�Σ���M�1�&�h�b�~���!|��Q5��0�D��k�[�n�j�g5X���5����K�/6ې�R�&y��؝A�"la�l�l�ј��3GQ�G]'A�5f�߂M8M���`�m��v,���<���I%D�$���)�8������/R8�1,?5��	묌S>|se�2̪�vG�=��2��Wb����c>'KRn�!Lٝ'J�^�����y���6�n�Sn�Ǘ����
�Ѥ�S��(���	Y��W:�j�f�ni��3�·Ƕo�*����Ri*)T����g���,���Ty�י��˦	�	gϙ��I�Y�� �h}s�J�+L�3~ jg���y�@��5�O�0F��Mr+a���1#
�
%ʄvl�
�#�����s�(���(�Fa��*`�*T+��۰L�kg)@�ː���4�����41m��Y�n��&�Ʀ_
\����*���N�=#ߒn)��t��{l��͵S�.8���6v}`���%=j�n����l i�w�¼���ȆB�eC����X�=�]sM�hh3~�KA/�3ąP�5���]�~GJ~=̟���!���D"#~�ٖ
X���ok��b-��Nj*|���*�w�x��/ a�'y��Bό���I,�\jj�D������O�Zچ{*��пX�P�dYi�9�u�L��P�"����
F屢C4�U�L�Xu��1h6��=�p�5����U�*|8<Dt��n	�J����F�U���t��3þ�B�i��}�9�?2?��6�����C!� 
#$yd��T	�J��J`�t�^���_t-./@�>���D�<<'�/�}es��ƻ
�RDaN]��`"�k��4�^(e�O%�,J�ݍ+C7\/�|]7��)��KR,@˨���e��MMf�M�N�Px��L*�~r��Ro	k�zj���^3?��wa�T-�
Ɍ�ۇ�2�853��Vi�1��|��:�
8�j��Ft���������r���+�ѧ���L�V���{�!`���
��@56�u$�C.���݂#�dN����#!�*�Ni�!LH"�-:������"�ԲN�"��]�p�U�Y\~�jƌ��F�����TN6Z$,q~�����A�m6��E�I�����_3���[Qm����8��,+������K6��J76ѭ�0C|KD�j����^����2Z�q?�<�K'#}�O�[淠B����
�X'��䞶�ABg��;(Jt�����n��il:��-~���LE2�3A~�@)
�"��>j:O�(�c���,j=�Z�m�̈́C������ :vERF�!$��Y��v�5�̘���o��7��N[�콑-�7P~r���>p'��0�	���ީ��Z�N��۷�4Yxl.����M;����[𹷤<����r~[
�)�;%������BH�rQ3�Y&��l�tPDZ��d��)X<��|`���xƈ�CpQ^g:��I��Ex���!k�H�z�Lܤ��L@"���?>Xt�4ѹ�1����N�h��&ɻ���p�J���4�?����*_�U�W�:(ih-�YL�j�t
��I�xK�o�}�ޘ�k�MyIf�JoH���L�^���C�M���/���F.�K�W.G�1��+>�/��;�6ٓ��%m}�n���B'
���z�W}A'�l�1R��#bܼ�>�Ӷ�u��F>^�Q�r+y�=`?^j�z�͞nnhc���?O�b����z�FWtzl��h;��$�k���� 9��R�J�w딿���	�c�-̰z(t�~�J9,�	O��@g9f�uxS�'��Ɔ�m�.�t�^��_E8Eҥ��O]R��U��,�;�Nj��3�Y̕Xb�I��O7 �e�$/���W^!�$$W��%�	��&6Rc|E�]�O��	_�5:z(M'�A�E�ޅ�"�wO�o&����H�ʺ j���6"o� w؇ƽ�ۿa
�rƚ־K������ݹ}��:�h��vw���-���/���|���5��{�Fߕ�p��b�`1e[���4�W�F�W�*���<
��z�#��y7/�����}g��:&Yb��7<��' �b����Sd*8�	�0��8�����2LR�)��������\��S�������˳��/��σ�~6o`�2���T�z�5k����S�t4ִo�
v��M��jG�_RPb#'r�\�7B���[�:4�wx]�q��frl.��'�(�[���n˙�-ڭ(�I����f�1�l����C�撎��j ���gƚ�%�m��:�l���4t6}0�(��4�7JPF7"installation/framework/log/log.phph����TaK�@����Q
I��U9�ԓ3j�K*�r��f�.�d��xW��7���WO���{of���E.�����a�d0��>LZ��T�Q����@V)�3�PK`�/�j�
���K��.D��D��̹�,���@�\*�/\��B�z����#H_T�pӁ+jh�+Y�E���RcdR�U������X�b��sJ��I>��v��6�H
����3Qb���߿���R�at�"w�g�l4���xD���V��ٶ��H�?�o�$&��$O��}���b�|�����Ž+q`Ͼ���(�
p�UC<�rۿ\�
-�CV���,l��EZ��5-0�=�{"�MO�iM12�sO��UI}y��ң
�Ј�q��n��;�	�e������.8��{���f6�nq_�~��r{�ܬ�=���ӭ�=����LVfKde�?*k7[F�R�eN�1�{����n
�'�D�&�VAK"!g����nç6@wށ�}u`S��@QW��
e�8��?�]��8	���i�V&��yVI,�6�^�;w�x4���qb��E�w�/C"[ui�2w�� c��u�g�6�&�����)��G�65�<Ӂ�JPFE0installation/framework/vendor-fixed/autoload.php1���=P]o�@|�W̛��Z�&�jcL�i��L�c�����&��}�������*����Xw�7L�]��M�Jͬ�5�BY��F��Q`���B\��#�b}&�^{F��6_��Σ�Y)���G(u;.�U����ܧ!�A0��A�(x)+f�>��=t5Rɦ����`�N��j���?�QM�U�h2�ЃҦ�=�E�\�}��}�ƺwY>u�`Ut}���U�8����RYsB�n��i�)>�)�M&u�T��`ٞ�F�w�u�!��]����D3
�,�(ȣ$LN�#��I��x�(�:�p��JPFYDinstallation/framework/vendor-fixed/composer/autoload_namespaces.php���mPMk�@��x��T#z*m�V�HE
m�a��&�1��n���ND[(=�03�k�|�U:*��o�k��Q����h]�`��/�ȵ9��MeO`�t�y�Ł(�x�\4�u��j'����V��Ai�<3�wl�*b��
L2�L�F��t��5��u��+1��][���ř������o���PC�k���,��,Oġ�5��D�%8U*M��(vu�5�HA�R˟0/�\��Kw�.Lݜ�)�,���6��,{���Y�$��&ׁ�?�[9���*��r#_g�
�L�JPFI4installation/framework/vendor-fixed/composer/LICENSEr.��]QKo�0��W�zj��{ߛIL�n�#ǔ�hC�
1�͢���	�ݮ)�<��dE8�M��'xl�@�!��t��Ï0u�x�vYVc����>B�&���d���s�v:�R;���M�>Y?��Z$�p2��!]��p�ch�E<�B{9�1�D|?���w���7�f���!�#P�W��pI0��&�F~l�KG�ۃ?�;��I�A/��N�������|�s�<A�/	����i}|D7"x�={�T7ϐ�3��E�\�p��#:\�)]Gʺ��͌�]�h��a•��a�<9�߳�`���7{�z	��$�ΟW��bo����ؙ�>&<����4�o��W�4[�9�j�^E�Kx`
�r�
�R8��4;PK`r?�,s�j͛��ĺ�ǚ�E�)�|��Ie�ka�( �;��
���.V�dQ	�˳�0�0�J��i#�M�4�]��#}��RȥF���<#+ր����*����k���wZ���TUr,.8*c��ߨ�TQ1�Ρdk���-�(:���:خ8����W�$�(�4�9���cu+�Ӣ�@�Z����
5���7��\G�i� ��U���_·�JPFQ<installation/framework/vendor-fixed/composer/ClassLoader.php�&9���ko�8�{~��vϱ��|��/7u��e� I�8$�!K���,
��4����%�����_N@QG����/^'�dg���yJ�'�&d�\,)�aFIJy�R/YL���IF�,%3Ͽ��2����)�2��=�P:��[�"�s1��y���ނ!�|�ܧ�b����S��=����l��wr�Ky��s@�A��%,�'C��q\Q�Ә#�'���ԋ�i>�/ȱ�����O��Hx��@$ː�yQ�'^�6�V	�4(N�@�+�d�t��1y{���a�W���4�[�X�^�ȋf��N�`0Kq�{�)5��("�lP���0]��r�$���L��N�NN�'�J0�-��܁�gi8�Q_wa��o�A��ԧ�Q@R
���E���yJ�m0��~̐S����3N<rz~�7���>�\y��@"�ňϮ|E^�X�jlze�����!���h�,RpV��k����9�_���^1P�������t:�����
P�S��S���7�:�����`oBQ��OX_u�U�݌{3P+��	��~������@x��d|F���^cN�ϜI�S��fiN�-�bi!�
�pN�YN�����<��0T4ĊhJs��-zS��GAJc�m����3`�c�y�O{}�Vh�d�<�b7�H��׈�5�!"	”����B�L⁅1�{Q�QYn��9,�P1��lBf6�dޢB�D��%JDh�`��=Q.�*2#���֮Ѽ����{o��,��k/���.���W&�fQ��2�2��|8���@r؛��KÄ��oo4�f��P�ɾ���v<I�+���8`�0���\D��$����1�ْ��t⅗�޽��J��~�V�m�I�Ȇ�"�hSܣ�be^q@X����	�!Ե�^0j3H
�ԁlrVz��������F2G�>��1�R��ɤL��<�E1����c��[j�>�����!�ƞ�W�2�Rp�w�6��*%u�X�q�O�*��jS������fy�9M�S�d*���+�.($�׭尭�A�Zn�P�A;_h�
����ڸ��7�qݶ�A��u�lC�L����
:Q��#*S�R��	�
���LF��Q0C+IP$հٌ�F^�k_k�VW�[�F(�V��U	I)�eu�<�=�!0��@Y$��
fb3"$,i�}B�6�jG���&,�%�/�x!]s|}��C�ĝdz��8P�jJ�2�(N�R"Z�٦�o
h+(N�r�U�Xf�V�1�rU|�?�yEf�+d���iE�]-6IS�D��5�)��!	[S���p%.ep
0|���4��5􍵆��c��$�j���[+�;�?e���]Y����y9�>���4�l��R�^_*��F�����v�F�I�˒6�y����i�=*@��"zMV�XW�ax���N�1#q��xhP%O%R/��su��*T�����[�L�'WG1�{a0N9L��4����E��zm
�#3"��Ue��>5��԰�ȩa#r������b����ש�Gh=�F�yA��gm�5J�2t=��e��4����f#�#��)���I��=�})U�`�C.D��3��8E��8jh�qHpY��J0W���4aɘM�����w7t!!J�ܓ��v갍��K�
�[%U`x��������ֶHÃ}D���͋�	Ü�
�v�O�8r�=��xVMlۤ1wY��6�������A��cVW����TE���*�q����x��&V�t��t��#pδ�!�$O��D�_;So3����8�n��\nj���fgg����7hJ��V�'�
h����E���V��֟�nƦ��|^S�2d�s�z�TiTb|��n)N�@vR��Aͱ��o�%k-�:'i3�CP׎�a.����K��K�GA1Ggx�b�\�#�,R�b�<M!���y�P	�]��o���0�ơF�h잏X�j��I��}��Я��$T
ǃ������W����]ʡ�r��
˔~���~;���_vz��_1��!Oo�����Q�(>:�>yt|19�~�_L�o?}:��Oz��y.�hN�A�B#!��/B K�5��+�9ũTmȳ-�2\o7����KY��
I� �EE�F���#��pֿ���F�O��F=-���O��'�N8*/d�'C=�����XԆ��3f{,٢a�4�?�f�ۜϾ�d��ߜ�-�Wc����oy]�u6$Jd���8����&��坞uFa�s����l`? _�|V�*�ݑ�F\��sw�bt.2�%F�l^�t[���\���2��n�.��z!K�ŭ�Yqy���<����FC4�k�(�K�g��n��{�MJU~�*RtR��� Z�-Io!;»�d��Db@8"�e��P�u��$>���*m*ڨ�����R�j��+��9�ZW�}�F*4ToѴQb��i�[w_�Ĩ���&�*�ۀHR i,��ҳ�ז�T��p]W�6����.Ⱥ�����>��(�?b �:$�b+�x�DZI����/TD&-Od>ATR�	�\<�29;?�t�i�F��{�����l�8�01�w�K
�^5��C�]��}G蘲��a�������ڭ�TW���4[���>�hG�ʡo�j
P�*o��Z�%|�y��R&$�Qt���.�m�H�Z3KҳztU��}5I]�kD<�i�B�b	��w#�}/Ž[�hAh���N��:}���lrx���_����l{d v:�8��y �,3��A�j7���3}"Wc���NY�pX��2.yI�X���4v���8������'!e�yY��}�KR(O�$����0OND`�	�i��dJ��,L���I#-�ay�4K�:�迺;-b#���(6�|�ǝ:������k�)�<D*�5u5N��i��]�u%Z��er�7�m���BI�}�``��	_T}����𲆥��%�P�T|r۹r����>`ğ7�E�
݆�j�tm^�M�v�z맡��V��a�l�Ѫm��D1옺ף
�ǖD �G��D�^u���"��ad�3#�]Z� ��*6le@)����j
��n�T��&bL�F���fi�F�w��/;�Y�?�c��}��[� j�[�{3ߧ��f����l�!�b^�`y����ՏR����w�JPFS>installation/framework/vendor-fixed/composer/autoload_psr4.php���mP�N�@��W�J��b�"!&��n�vC���nI��n��x�ɛy�͛�'W9��F#,��c|T����2hk�k�e�T��A���<�T o�<�ϗ
S\�w[����,\�ʒ��Pj�1e]˺�V?�P%���n<���8hU�Zz�N����:���#�z�C�k�Z���-bY������L�\��Hu���
���M���"s�o'�CX���%�ʞ��� g2��f<��l䉆ךe/��&˒�^r����W3I:�`

��o��PD�JPFWBinstallation/framework/vendor-fixed/composer/autoload_classmap.phpB��mPMk�@��xA#jDO��ժ�H�'!l6�d1f�ݍ�ߍM��4�̛�17w:�,��X�7�5�x�V:�!��N�V�ޕA�ű��Fd�L�w� ��8��
�H�ɳʕרe��oyJ���.3�ted�9,���&���p2�L��"S9�xa�
UViU��"l5v.�p�RPak��*��Oe��5�3[��#�>���!ca^:o�'����	����$]��V��Ι�D��4�!���'�5���u�5�������3�Sfȕ��?7��1
���-��yN��g(���?|��
E���t��2JPFT?installation/framework/vendor-fixed/composer/platform_check.phpH����Smo�0��_q�&9 R�}�:��6�h�I�4E�9��N�Z��w!��iZ$9�=�����4w��mL���a�"Q h4��Q!�õ�X+
��o�"�Sq��ƨ�V[lW|�;d��,T�h�]s��i� 5$�W�V�$-���V�����)LOU�����2S���"��2�Q�?��%�(�Y��ׇ����u����M�]��v!�Wz���#��"�`j���6W�&��˜�<�:ں�s�kp_���Y�%�/F�I8��}x�~�?����4˾�R7�c�2F�!k�+�F���G�;�#h��S\��B&�������<v�<��{�4*�)F1�e�6�;q�r9�x'$‡�$�$y�@M� �ZiF������"L�pY,y�
�6�l��l���}2�g���<�R
�*a���Y��tU���*��;�L,�ۼꄄ��uyM�t���T�y�bt�J�^tׂ+р���xi�[��$M�C����e/��(zr�>�e�2-�o��ޥ�6-�����{"��N�7�`R��yUl٫�JPFU@installation/framework/vendor-fixed/composer/autoload_static.php����RQo�0~ϯ��J@$�[�2Z!4��u�R�8�`�đ�TbU��.&DH�4�/������c�/��ځkXlW���=�%�FS*�J�r0\���Ti��
`���3�Y�	�GX<!�>5yr�<*�hF=殠,��
2�6�Uq�"ۗ�l_]�{�l0���
�W��<�{"t4�P�T��M��^Rp�M���+�Q3	_���i�ϨM�k��$I�&��8��*�.K"S�x>$��.�}�Ku(�!���R�ml�h���c�fm�uN��t�#�x�/���0
�B�Kf���}(N�O4�*��!�5;Bזԧ�}�OB楌��i0�(I$a�7�E��oQC��a���,S�@WӲ�!�D���q��w�vT����j�Š������9�K��ϓ�毜x�q����KZ�����f�������)nh%��Jڻg�/-U�e�s�-�KU��X�I�m��AE��{F_ �ӄ�f�������F^}^��WR��B�|n�[�:�JPFS>installation/framework/vendor-fixed/composer/autoload_real.php����V]S�8}����xj�	�%�.�
[
2�Rv�R:žI48�+��[��^�q�4��V�cݏs�����{:K���p|y><��s��D� Qe��HbP�i�D˜wy
\3q�
�<��8�Csx]F�a��&��ۼJi�O��ͻ IRLg��On���Ξ�׃K̒�+�cN	�B%i�G��n�c���V$���~��c��Gp��iF��=J�y�:@�"" )�kY�.�<#�<dD,�%����T)Y�$�4Q�`�Hտ��<�Ø��?������{�����d���o�kDH��� 2:�(��*&���$��:�D��`�68<�RT�CL�u*l���F�����F�?�B"0v:�fv��6R�,��:�*>͗���\�p�G���y�Y�v�8�"�"2
���a��ל���&k�5��LB���`��]ɿ�Pi���
E�r��|�\�����Zi��@&s,>�%�J0��S�?��{
�9.{3�1�y�M�y�Iz
a�\��¨�tuq�ޟ]��]��)
���}x��B��C׹�x���r<=�nUfb�AW���`�DD�0�CJ����5�6e�k����TKY8�m(=E�JSwB�[��M�{?<�����g}x�{�A�0�3r��=�)����6���U�|Ѓ6�`Fj�Jt��u8��Ny6kgw�f�2�Sf�6y��:U���J?�9��>����5؍'�:A��z��h\��P���a�8�����RD��8�֛U=��V�Z��k�U���Ԟщ��LL�>���Wm���u�1�n�n�������z+�݃E������h��<��}>z��xt�a��V5u>~hU��5ũV�5���U��Y�t��JPFP;installation/framework/vendor-fixed/composer/installed.json�����VMo�@��W�8�iY0
qm�U{��*��[Ekv0���vvqB��.vcĕ�,�|��̼��g�]�f�=ۀ��9���]�#Y��|�m� �\w�*4���C�-�J�ۈ�t��
��'�s�Kþ�Q%&5�CX��V���}��ļ�f�j�畕k�`#\�H"�dû��L�E�X�Dl�yz�z>�fI��9|���"�.f�A��-.��&�$�	���1�����\�<N���j1��d̔E�e�R�J�#�3]g��9�n�NJ�s؎&+��A����cz>�ؔ���v£�s�6����
�Vp0��Bq@I��U���،Y�0I�@J���
H@f���$�ʂ�Ӑ�hE�Q���'�����r�?���Hf��sP�a�7i��f�p��$�)Ҫ\1>\�T�us`v��f�֭=r��d-��HZ�=�����
7W�i�>�\$ 
B�~^]b�=&�)&x\�t�_W�hɕ=�(l�|�P�0�d�
j��`��i )Q���^��B�T�m��
�<�{�$�:A�m��W?V$��D��r-�I���߻f~߽'���HH�Rt�]G�M���A!����r3�cv��(�j.��2�ڔZ+S��5B��Ͷx˜���?���.hh��Ezz�����9fu^J���MW6�ݼ)�
�=�?!~-��÷g/gJPFT?installation/framework/vendor-fixed/composer/autoload_files.php_��m��N�0��s�Ԧ���4t�aa9T��B���=M,��;���L��E������/��ʫt0P0����N�"60���u
��GX9��G�YWvC4F2Pl��@���h�!��j'�͍�*� 
��]N;�e[V�^}��G�?'��xK�+Wc��!��B��kk =x,��i�VS:�����c
/m!X���qM�A�j`N�JS�6ʺh�)�DpS�d��wn�]�	u���8��W`,7���!����!ϓ�B���f�t��)����}%\Л��S=��h��>�γ��";5+���eg=���o�
��zd,]c)e��ε``Lk[�3j�X��'JPFWBinstallation/framework/vendor-fixed/composer/InstalledVersions.php�����X[O�H~ϯ8[!�A�	4ea�@��E��}�(�������F��=3�L��**���}�~�#�ō��f6���w�
�����$�"
Aq)b
~$a�u�|&��Kd=�,��5�Q�z��OQ���3&)�")L�w<��RLg��O.o�:��v��ہs�gQ��Ղrh��8J�HA;�8Ӟ�
�P����C�,��dB8˄��ĵ�R@H2n7!��"�<�ǑB��h$�|�z�h��yW��:�OFgE�Ή��sJr�d
c������,��tT�F,ł�hruC�:p@ٖl	n��Q�88z(_� ���r��fU�s&Bg+�Y+d�`
U�
�̔$�(1�b�vq��'��c�=6��A�v{w�������7�d�lm�VjrUm�+6�n>.d�.�i���e$�k�$�F�������cN���\�Z�VwxO����A���>��
x�
=���d������`�7��j����9OQF�Y���b���N>n3��F��vf�'!�;k����t�(�I���� UŢՆ��U�o�T��&��)]iB�r����q��R���|#O�n�GI���i@�����]��’~��W��ƴ�؄>N#rR�9�)MTx2W��N�2���Fפ21�Pߓ��*���-4Ζ�Y�p�uA(zT����lb��̊a�'N�hIk@�.)�™���{\����}�-�g���6E�2�>�F#7W2m��h�t�p�4��m�o'c=�����J>k�EmlH�Gu��*��w`J��ڹ|�qϸR���Ee+�֣���K�N���}�e���z�$��[���\A�λ���wq�����8�<t���S)j��g2��o��C�?�G��=����̒�d_'�ʁ���G�mO#
�N9�N���
�����$��~"�˕��.�_��+�jR�_�4�3�W��*R{�b�54�M���j]���p̅vT9Ĭ!e7'L3K���T%����:L��*�nx�j@o��3���ߑ��GR�[W�����t��{!��W�C�S����,�׵����7ǎϔ��s����|�
�Xƻ��*�Bc~�$���5>�\7+[�ܗ���6;��3*zm��	HW��m싀vH!n9m��]���Y�<���$������R�Z��Jm�JPFO:installation/framework/vendor-fixed/composer/installed.php�����R�n�0}�+�-M�p�uo݋�j��Rw����*�-ۉ�߯C��Vٛ�/�9g�0o��F�!�3���,���޾�����ߓ�Bɞ2�h?ߢ���#� �-�Q���t �ɐ�t��b*�,)y�#�1M1K�f��iY-)f	ET^��C'>������a�О�������?l��.^�L����q�
n�����s���)�-�E\�"�\D�2I��5b�UUg)�y�ba��E��"eI�4�L/�p6`W���÷��
G�ЭS�,7B;�����N��x#�d�BG�\�����ʝj��8�|��
����q�;#6��O�og|ʢ����-a-x�Z��u��@�UZ�Ze!=n\�k������;�H��nw��f���s�Z���0�JPFePinstallation/framework/vendor-fixed/paragonie/random_compat/phpunit-autoload.phpe8��u�KO�0��é�&j��R�J���Kc5���*�g5ܰ|�vgg���E�Q��F��j6�ޠ�EJ`�88��u9�x[�9��6����&��0�t��;\m���{E�j*�.s��ZsYHW�	��R]3��y�NF�����7HC̬I]��}��C;v�+3Lj�aU{e�PΕ�d��	��u�y�����\q
!H�x����{i=)��R��R���mO�AP�/��N�&�Ejrs2Ĭ��Nj~7�m��'��p��c	7
u�>�ߨ��>�L�o��"Q�7O��Ǚ��k�d�$|G��Jr`*3E_��[���:�Xu�Eu!%a)6=N�v�[M�D?�/JPFXCinstallation/framework/vendor-fixed/paragonie/random_compat/LICENSE�J��]RK��0��W�8�J�!�қ	f���1K9��W!F�)�ߙ��Ќ�{�����@�Z;FX<2���kp�>�C�_?�U��A�.�&��Ęl8md����bt8�"�6�+C�3]�`-��}�6��_�lCD�ߧƍn<B-J3�L=�DH�&Xѷ(m;�|{9�1���`#<$�2����$��f`nz{{��K��$6��Z����p������N�@�i�!�%b��w�@�v�u���:G�K�f��ތr|���}OY?�M3d�LM�E�\{�7���p	#J�	�y\٤�˶�:4~�����c�(Q�Θ��f���G�����q�S�a���/uq��_q�DŽ�w�g&��c>��J@��f˵YC�Ջ\��x��,��4+�1���fj	��Y.2?+-��fr]R`O�y�Y���+~�?i$5
H�N%EMdk���|.iv[JS�Ri�Pqmd�)��j�+U�_ m)˥F��yBU�x��/
�b|��5��\U;-�WV�Xl�:��Bܤ0T^p��`��YL(�,����lW�Z����J����h,3L��;t+k�ײ��,�Zg�։5� �7Z5�s�zS�wBX^ WM`��6��JPFoZinstallation/framework/vendor-fixed/paragonie/random_compat/dist/random_compat.phar.pubkey����eι�0@ў���0F�2	�@�QFCddq���]Zoy���(�\V1
8� �O�BO>�H�o��1#�t|�0n˂(�d��}�Mj,�*�*��;t�G���]����6ܱL�{{Yq�b��*;J������i�LӺ��f��
�*g��[w��T��M�l��@�\�AA��7JPFs^installation/framework/vendor-fixed/paragonie/random_compat/dist/random_compat.phar.pubkey.asc����mѹ��@�ᜧ0�-��C�j��nP�����9���wg��?����Y΂ ��,�?p�^2a�5Ү��@�D�b?�Q\��Ӷ�V�o��G���H?��=*:�)q~b<f���u+\2���n4+�=s|�7X[K\�pٵ�ϭi�t3W�޷��V�Uu�!m�m�[��P��^_2�θ�}
��L��b3�3���̚Vxl
)��Md����I�Bc���EN_y!Y㘺ǹ����*�\{��.����	u�4;H^ź�C�+T4���
7�71`�K�{�sg��H]��������"��,r�$�
}���K���CN�Vv!cc$L
��}0h`jH`�8<�*l��J�O�Pܬ����=O��ɠJ�̧��k��:�$�JPFoZinstallation/framework/vendor-fixed/paragonie/random_compat/lib/random_bytes_libsodium.php�����VmO�H�ί�CHI�@x�уr�I���	�*Ukgo�x��5it������ܝ�<;��3��w��$�����>8�[υ�$�0�F*f��@GJ�b� dѷ"��D<q
����)�Kp�q2��4�i-�T�r�!�S6��0��"�/��%����Q�������S�(�)���zHh�e.�Tj��>fj�R�L���ny�KaT�x���+Mq��CJ1�Ɲ�:���/��g�c
B�
�D�P1�$
JE�E6�	�F����-��"��7�+��GFWI��y��&���������,
���Sl���L���8�2ϕм�q5�'4$\q,�Ya��+�A�%L�x��*,!�t��
�ĀJBx�lD�26��-+�ZF–}*�b�3S�I,Rl�&�dw\Y춬�)g)bN�>��0�,�m7%"�i�R�SbR�b.*'dn3D1t�1"܆����~��/���
SA�aaP�m/P��M+�yj�!��l�/�9�)��J�&�"���x�e*C�ܚM%���& 	Y�2M�b�d6��XkJ���hd� �
U$�tu����*}�\d�F�:2E4��~8�T��vć5��c�f��.xc�'��`��n�I߿�j�p��
��G��
{mp��x~@h��h�(���}���5�}�Gq'��Y�y���ܠ��W��x��6a�x�!!�80r��׽8�?v�D����&@G�;��c���	_`�w�f��=�Q����O��z.
�]��\��F�8�]zΝs�Z+�l��Y҄��KR���_w�C���'��1�`��~��n��Sfn��FJ�E#����-�(�Bz��+L����d\�Z��+O��E�/�	S�lT;,\�������j�YvK*B��V����
�T�xRɦ�p��͇
87eG�‘h�j4-ӂ�����~��zQ�~P<�Ę\_t:3�Ex�y�+�Y��qg�|�B��q<��0��M��B��=�9q�>W��-�lVI;�7.2��`=���K�j��Ǩ��[�d������~*�U��*�P_P�����˕�3D�D	4'˜�J����[[nm��+�Rkn(г���E�d^hC[�eĚϸjlخ��Y�KmW����	�Ff���IV�g���i��~�g>�m�|.��ľ�E�l��:kZ��i.q�[/'�g�goO;;�2\�!_ǜ�ۇ��dF��IFl�٭^g�SY�����L1�E�����?�Hl�К]A�q�!��KsO���%�ﻪ����+8>:?=?;~{r�
hA34���I9����O��RXu^��9�z�B{Yk��y��y�����$�e�U�?��fw�N-=4	���NR�aTNyV*���U�����Z?��j�v:n�]��� ��N�v3��Mq]��;׆�ދ�����|J��1Z�xوc	� V��̰�����JPFlWinstallation/framework/vendor-fixed/paragonie/random_compat/lib/random_bytes_mcrypt.php�:���VmS�8�ί��:%aBBhI)W���O�8�8��E�uu,�$C3w��+�!�י�@lI��<���>}.��w||�`��N�O(�H�����"I^hH��0���2J�SIhC��ca7�D73�	�An�\
VV���H�W�����NO?�������R�
�ta��6J�̄�^�c�cc+��ٿ�-��L��`R/>1��׻ �	HT�4���X?#�u�!y��C�
IP(J��hXΞa>�����5w��f�
)�b�Vu(�S���i�]��E�N��|]�<��
A;9�A=1�sD^H�Xcz��+C�+H�d����u ���H J�b����Á
"�ωS����:EKJ$�9�̤5PJDܤ=Q�f���$��D�Br��5��Ô�bLh�Y�g�SQjSn�Gd��BQVƄ�Y���NH�D�8��R!܁��yBof��v�v �d=,5N*S���a&�84‘�!��ш������p)�yN�z�7��R���X`��_*�!�Dd�x&���cN���N����l�\hD]A��/���Td��:�9Y�ن�$Jc=p�����k���؆�{��[�
����#8�8>��ݥ(�Y3��[l%�ř�:`�9���\��9�ıqڙ
'ˑ3��T����h�w��ښc/����cZ7���:d���gd�������p9�<�/�����-Ϝ٭���=����X��Ʉ���D��;𜻱cw2�q��F|��Į�!���r�YS��6Z.2$I��	�c�fɫ�C�qg�g��|���[�{gaw��E��s��)E�\cUgve�"�� ��raom�ȶ&hnA�5�F�[�<�@�7�#,� �X��a�F3u�n���M��Fz�Ɉgl,��ﺷ��O�VU�A�-)�lc��Zm׺��k�H�.�e��+�ų��3M��������j��-�a7�����Q/�D؋�I�����g�A?�.�88ˆ]��,|�^�ׯn�����׈�k�Rޘм^ש�
��+hW��XcWjD����wR��n�[��*pU
��r�3��O�܁�n�z��>تS�埂����V�D��Rh����Rb�xþ�_�5t�ɷk�	гWK��e�d]*M�*�	5[1y�����`�I�Z��_��	�W:�:_���45���6�U�	�ȐR��܌�ສ����ȟZ-�ڮ#Ёj4zs�qd}\b�����wn��s���b�����^�Q1cy�WWW{UL�.�}�x-�*X���T��_�	h4�H�}���~%֛�P�*�/�xd$�LW�ˑ�w̅*ś`�]#Ƴ��#��k����ʣ!^ c::a��Gc��#��]��,��8�q�/JPFq\installation/framework/vendor-fixed/paragonie/random_compat/lib/random_bytes_dev_urandom.php�	B���XmO�H�ί�E�K�$��hg�aw1`mH"'�������pl��&����S�6ys������]�UOU��_�Yz�z����R�e[tL� f��PY"�,LbR�ӌ�D����\����ȓ�̈́O�%u�t^�re�D	d���R|u�����k^�.e8�et������?��O~�~�͒�U�{��Ph��4ɣDQ����|�+
=+�տ�+�F4�'�@��バ��A0)�ĭ���O�wo��<�&afK�O�+���]��0�R��bA��!�D���m
c���R��[x�*��>���O���rT|����߽GP��
]�N���Y�Y14Oe�D�z(�<TڸP�LH��L�bԠ@
AI@�̕SѠ,A��� H&��l�K����TdW
VW��u����"�L�a����KG�ᑖ�7b��	.��"�fI��t���l��E�Ϛ���pB�\{�mfֹ�)�p���_h�R��5���$ϰ�t.��lM�T"�ʁI��+�6��s��]�W�d�iO��
rC��d~�i����AEɂm���4u�� �$A�W�'�6�pD�U��Oj�FMD�>c�ƫ�e��P�!DY���r�-n�z\[4\��t��
��g�ku�3�a�����혰����_ip	(�J��n��k4�����a϶�l�/z�]�E� �P	6J|�-��f[#�wc9�x��={����.�q�9_�а���^ǡ�3�,(��ݿt Ⱥ���&c���x��u��ci�na�Ê��`�ձ���t=�u-,�[Яs޳�4Xw���7
�vn:W����6�w5�˵ū,�����=�=���k�:�'�/��jPDZG�Kgp�-e�h����oF��a�ߎ�'�Ե:=�1qak��i /���/�0~��w7w��ag|�X������Ԏ���*���mmЇ����P�yHAw�����2j�R�.?o�6� !S�M\%�P2����a(vj�⡕V��%m���	J����D�n��Aq(ԯt=.UЕ�_fKZ�]	\r(1�h�J�ߤh�e�:m��E�$O��h͗�L����8�C
��}���Ț���&Q2m��j��N޷��hy<�M,dž�qaߖ��ҝ���h�n�f2Y(��{"��.E�"�xZ��� �50�z��Fʑ�a�X��~{p%z�K8�M����Q�^=C����:��o
��<������}J�h�'s�+Dum�Jg���ٲ!O9V)��Fǵ��E�g��>]�~CԿ�F�Fr�~\q�����Qx/8�y�ī���\5�ch��e�ܕ�St\�$#�6�����l�51��;fPW(Vx�K�0\��DO��}�x�͐�����17'7C��֠�68�K�5�i<<�5��03h÷V:��F:�i��(:��1� %8���^�l�!9l�<�v�mOk�3�k;@́�nd�Ot���Ψ֪m�FI��7��nqm'��GW��
�^����?�2�yr"tq�:����O�F���ܘ�}��J2`�����NY�Kc�"� ���A�4�PY�Ǻ�=�`����Q�J�ML��$I�m`)�,g�V�T��
op�u�
�J���ŕ�]~2h�k��A%W(���'(����*Q*R���0Ȋڿ�o�~�S����m���ժ�x8�gD�yȍ��޴��+�;e����1�P��;Ժ���IB֏4��B�1�3�]_��`Q��fl*p�5�I5e����l7�Am�1`�U�Ǭ�,i>����t�Jj(C%�}���ԧ�W�Ym<�f���ЪrӊzU��XM\��ٞh �
�;�
b�S͛��
�#^��j�_Ul������v�S���j���Yq{`�����ai��#2&C����TXR�߽߷M_u��m�]ec������s�[���"���ڬl�(>ѻ�
�S�'�)&�R�T�I�*bj�F��!0f�	�?e����;5m=���� Ώ���u�v�–��&|X�I�G#��o���/+���L����"��1��)j���g�uN)_�E	��y�%x��j�t}vBz#ż��9+���8�Χ;�� �]��̷6�ěC�$��{�IƷ'�Č!Q_a����yS?y}+z޲
��B�M�
�5�ܺg���ȩk����>��U��h�Z �+).�&��P��}L��x��$��vI�ө�X�r�]�F�0��e��}{�&�;�L*�|��ۮ�����/���&,
�>��IQ��VK�7"̦&����/�ӂ�<3)�)�L��k��B���V �a<�2Bw�__��
�+�jkE��5��*���`W��?_O��Ѷ��N1ʕS�O�Tw*��5�l�B3�"�X3��\�A,}�guy�tZ3#�	'�N����V��H�ǃǃ�JPFjUinstallation/framework/vendor-fixed/paragonie/random_compat/lib/byte_safe_strings.php�����Xmo�6��_q
���8MQ,�֭�-'Bmː�f�d�2m��E���]���(�/��:t݆Al�ǻ��I��[6Ͷ껻[�v��u`�)�5ɔ2�\��b�3
c!a�_�D2��� �,�l�+��06�ภHG�J �2Ḣw�	@�	gf-ٕ䓩���[5���;<8|
]OE)��Mt�D&�PP/e����Jx�RE�O�}8a)�Q��7�]l^0�H���J	* �p}�4����l��xf�`����PF�(�s��	h4X�.�wڃ�@�'�<5�o ��3��*�@6��N'�bo�px��
:?���h��ݔk��.8)"�$W�d�crƕQ�+�2��1D�>�`,1�x�	�@��dh< �:�)����!��"'%�2�̸5RJ�ܸ}$��:��1O0$�d��8�]3rF,J�!ڄ��]��z*�ڄ��1���(N�#BRn'|�!t�X�t&�s��`fb���Ɍ~�]M-q�>�k\T&��iSGO*�pȄ�F�%FCF�22�.̥h�r*f�p�j<�)
f��H���\
Z�c�$�t�E:⤚z� �P�����
��s(�l��bKM�$�!+̇�yJ�h��L�18�E&��{S�ǩ��
�l�7���}r�N��������)|�����Rr�n���x>qs;�����m��M�{�x��a&���7�̂��į�S���n�
�-��r�.qny>�г��m�۶����A4�s��|�t�n���q
�O8���n�I��~}T�'���z�{r©�n:�x� >�����P�F�v;4�}�S22Je�NZ%�6�5B��>
��8�P]?\�>s��w�L�:FS�.�<�urFd�u!	����	M�n#�����y��c���jc�DÄU+y��K��&ai�V��[XT���#6�)U+����۞�!Y�R[P���YL�U���&L��VfC��t�?����^&"����װ)��0%����"�Y��ei��Hcr�
CɵN%�f�+�VY��ve���`)/��ѐ�
!�\Sk�\�¢���r�ߐ��MpSO��ak�$�޼�{e��x���hV��9�A>�눞Jq� �ʘ#��w�I����Rze���N�2f�+�u$�8��e��T7�nP�0�M�]���"��)��C쏌�0v�\H�����kK�[k��&y�.]���*�`�U��X���G����#S�1��y��Ě�!�Vgk��Y���_?\̩�˼��7���V�k5/����/rRo�3���%�DO�*2�[�ܙ�OL�[���ܲ7�e��������"�A�K,��\2��c�sD���v�R�Q5���+6"7��M�|������~-�˱��`����n��^�̢�)B�f���l�&v�m��ox�1���$*���@�\��
L꛰Ç�H�V��@���G�%|�羾a^s%X����		,y�0?�|����Q�C���fi|e��䣊B��ZT�&cK�������&+�R������1��$hc'/UX�-��E�6�i�E�k7����<�֖﹫~��\^V�e������h���V��V����$E�S�o7�
�oП���xWa�QA��h��-�+�A��;�C��U��.��뭿JPFvainstallation/framework/vendor-fixed/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php�y���VmO�H�ί�CHI�@x�уr�I���1�*Ukgo�x��5iT��ofm�$-��YHawg��y�e��<�w:��;����s�„�����HŌ��X��T*�X��ȁ�8O\C�83|��o�G�+�lR�e*�����)�q�	n�b�/��%����q����σ���S�8�)���z��R�\��Щm��b�"�&���=��+�¨����W��:m��b
�;;5:/�_�џy�D"f��bjIDE�E6��e|���A՚�����7�+���FW$�w^�r���Vu��������[1�f贗	#Щ'n���Jh^C���m��8&f�^a��0U���B�05�m0����@&2�����P�$����,��6�Lk�����9�LY'S�bI4���q��۲v&�����q}
aY[nJ��F�8-&�I}�������e�b&�Bc(�p�r"���m|9�]'m�B�
����ߦh:�I�S�����#C9�k*�4�,9ߌGX�����0�j��Y�T�CS��rA1�2�
M_��$f��52i����H����H',M!�}h\d�F�ud����A`[�RY���~�]�7���a����ۃ]g���6<xa߿%g>����>z�^ܿG�;��w7x.n{����
o�U�>v��-���omVh�;&�;7�q�\{/|l֍	������^�~�0�F��E'z�<�7r��ax��q�O��q�Ț�~�F@�B�=�m?��?蹸y���-�at݁�ݵ���9�����I�����wi��:��
=H�t�a಍��J���mpoL�������E%����-���������
z�3@�1)W�����Sh�&�˄E)o6�-
׍V~��4;��D�Ւ�Hc�s;�w�=U
�T�	
�o`�a��MY�4p$��M˴�*<�6��^S���O?(>�Ę\_t:3�Et�y�+�^��qgC}o!����l���&Qr����|�>W�`�
�lV�v�����u�����(�Ϩ�ڪ"><1��Z
\��UuI�7��bim�r��13q�p�sW){�{kˬ
��b+��}u�l]Ԟ�mh갌��3�������������̀g3�����3D�"�q�_X�3}���/��E�Io4._��<���������-����&1�5�xOXGO����ޞ�qv%x7D|sf0��r��'��~��s�׿��	��KsO`DG����l���Wp|t~z~v���l[Ӓ��bm�UZh�E�'y��������g����+(I���f����B�Z���k��SD?v��Om�Y�8>��i^k�2��VNyV
���Um�TW��D_
�Պ�A���<�	@o����	>���j�̿�����G�f6������f��9�+�S|V�&̰�N��{�y�JPF_Jinstallation/framework/vendor-fixed/paragonie/random_compat/lib/random.php� ���Y{s�V�ߟ�$�Ȃ��&n�
1��)�G��MG#�������Ř����\I v:mf��W�>�?�͢��W����W�I
�%R	�E���Q2(qc)��1M��""'vg�^$���Q£ɊZ���8�>���d�!x0�w�:w�wR�37�V���)�X?U��q��c�y|B]��B�I�W��h��Q��Äs�iZ�tE�0��D bǧ�b���^ދ8a�N��|(�� 7�‡s��G0�D�R��>��x�l�E"�;R0X �Կ��)�9f�o���k���w�$7B��hG��(�p�y�C�y�h~�A�Gn��Z�*�Բw%{1�k��)P߉�;���$T�d�3�e"rA�"��D�"��X��w���4��)�3'�uR!|���!�(Gl�؁L�jJI8UK':�$	]�����\*����@U6��a��x�� ,ȯ󷴔j.��X�L� �_x,I�ڗs�1atm!֙I/���izrʿ��/� Ifu�$S�,9l�:ks�'����Z鍌�El\��+��,����Z��"�Xh4/��4_>a�i��ut���Z� �$��7��
R���G����W���}���|`.�Ƨ�f1��(ăDEa��nkl�r\�4�]�n[��!��V�l���ߟ���]��#Ġ�}��%
�G����d��?0�C�
��u��X&���Egܶ�W���2�B
�yf�,s��n��5���[k�δ.�Q�)_�Ԣ~k0�.Ɲր��A�74!D��V�rF��`�32?�
�[�sӵr5,(]�����{����&�k��)7hw�iY7uj�nZW��ꁐV�!S1���S��¿����>��h��u�;��o��Y���e.��)[H=M�]3%Ė/; �}<4�4�m�: 7d�L��H��R��'�2^���f���`[�J�F�=@��C%��������2Pq�-\iia4��S��"��i�ͫ�9�L��U+��w�J��C䇞�V|)P��iR�pU�̟m!��7������>jⳆ��~ȣ�kpǿi�L�G4
�v�e݁t7Awh�F1��8=`��4]�U�vOY_���NY��7�P(7�Wٙȡv�ƾ���[#{`�����9�5���u���i��l[���8p�jۗVǴm���;P�vp��"�7�hM�m�8�LVJ؉3�T��.10�T�*9�I��BA���8c;
�����J�,�Emu&>��	�FRH�=^�ӣ�~��xc< �V��<��P*Ҩ�2��Vp��4�od�Ҙi�O�,�3m0YDqn:�ƞ�srY
�Fo�B"��q09JUI0̥��0R����ؒ���{et�(S�&o��DG�!�/'	z�bN0�s�Hm6cwl�t�x�z�p��N�@�3��n%�.�چ��As7^E�NX[�W_hS���b�?���{�Fz�{e��Z����c�x6D�4�*���WB����!�)�	���1���G�p#!lԉ��u�v�l݅�ĩ�22��7�xP�J`d��xm�MDeŘy��^�r��!�W��͓f�^��R�4�>}J	�t'�i�yZq�R.=.p�lM�	?,�\`��l��-�VR�P�*�_�l_�9�j[̃��v���y�F{�
Q�(.�������*��-�?�Y1�C×������4�$���H*�>�AϊyB�{�8��sR�B���'���PX#�;��ԗ ?�p{(F�31�Ԫ��ȎO�PE��%���]olU�y�f��ˢ?"F	�v��HU���B��<x$/j	bW���±�#e���L��+��(�����fLg��K�[%2O5��˗_5�S���Bʧl�5�v� �Mn��u"4�tI��V��"��;=j@cJ<�`�D[E3Z`E�֪%�ފ'��"ϖ3-nQ1oex�M�/��H:*���M7]�xP(4c�z�{�p�X�ҥ�{��W)�Y���#�q�q"2�Av�AN�w\��9�'�?~4]�钭g�`m��Gv�R/�Ϸ(�[�wjr&���{'��oT�)R�G���M���]�d����#ag*�3م:Œ���>H[8p��-����u"	*+�}���E�
������D�C��t�����@��΍�0�5�F%��l_{���]L�6oI�I0�4{_l����@6.�4x�%w�x��Zۨ4�����%ّz�=B�i�P��w;2j	���(]���q����Gʞe��MK��N3��2�xL�nf�x�^��‚_���Ӟqb�rA�X.�8z4&��T�����>Z�^{�i�0��3�O5�B1GF�
ӻ��2�X�8�,���A4rȬ}�e�ZM�f>yjj�?���c��c�c�AV�]]�ypc��-���r[KyV$��w�T��=<�,�-���/����������F�R�|"e�T	t{���5|��1���Z�>3�. i�f��
�Ev���z�![�K,�|���{���cp�F¥Qϵ��?������-�9%�Klj�o���w��
����$Y/GX\�x���<��8��Q��ye����n9+�}J^��Jy�,���?����:�	��_v6�B?��OK��`��:�Q�����X>�ٟ���9��h����<�Ͼ��xtg.�?�"_�l*�z~)�|A7T��mPD���ا�����#�6#�Q&�g�j �7����v2\��/���\���37v%�)�ۼ���Z���<�Ϋ���&!��/�R0no̘��fY$�3��.4q���p��L|n�J��`~��
^c	���ؙ�\>�^�N���ǟ7�5�����7�ƣU$J�Z�d�~������›��4�fRmJB9�<����t���>χw= Լ�o�@���®�w��H_����T��Ű?�^��0#X�%^�J��W��3�T�\}y���&�^�o���_Ч�?JPFp[installation/framework/vendor-fixed/paragonie/random_compat/lib/random_bytes_com_dotnet.php����V�n�8}�W�l���۽�M����Bmɐ�f��mq+�I�5����P�/�vQ!�Cr.�̍��W�'�gg'pnp�{�
f)-ŵ��!sб���T�`�ײ��T<p
����[p�r�`pUK�I�3��D��S��l�P`%�݋e�Ub���kǝ�^��W��7�8����ղ�e&5�7>F&��2�\���`7<�e0)x���+M��8��2$�P���	F�����Bd�lQ}��ڒ���"_����|��~�h�Dnw�B��?<6��x��vpڸ��gG���뷘��&L���sa�z��刼PB��􄫵Ж�Аr�11+D�9r`�8��8ej�0���Á
ra�ȉJ	�Ca��%-�f��ieZ�Xش'2.�<7U�,E�%Ѧ��Nk�ӎ��p��A�	7��&����DLf��2!$�q&֢vB�6BęL��`�2K��_Aiש� ��শ�@�w��9fR�̂C#	X�{�V�\S�K��&��c>¢Z�*G�ܪ%�g�R�i,e��
q�e����[H��5riu�2R�3]�e,x>t.r�F�
3E0��z��T��S���Ѓix=�u#�)L��?�p�Nq}�?���D��;�q��g?8�=���ˆ�����p�����n�
U�;��@������ޔ썽�?ĥ{�ٝC���Y@���\������Gn�y4	�����#t䍽`�EǸ�\�t�F��N�9҈(���]��g0G7�<��^�����\��7��
ѐ%I�L�z�K^]���0 >�0�E�t�n4�i�S�7���([�]T
�T
��E�8A(B���ل���ܔ�k��|�yb	�_����L�"��V=�[�u�Ӂ�'8M��F���V��F������pK
�R��k���mO7������}�мLd�������"!㦥���>�~8��'�W��dٴC—"<���Z���+G�5������s�*b�}�yq�uw���v� ���=��
;8Y��ұU��3j{��#
��:��n�z��������X�y��x���8��l[pO)��[�[K�^Y;���}GE��k��Kmhİ�P�W�#�C4'���j��̈�+,��ʾ9*"���؅�J"�)�����Kh��a�%�G��������޾~=�l"�;u���?��!&���^�qiݢB�Z�;7�T�Q�}�:��e��>v�A�������-G8���Lʂ;�L8?���˷�!#�H���%6-�䡝jPe� a�94�]+���#}��J�=0����'M���^�ST��~�Ox,�nW��T�y�񆛪i��s��9�H���B���/���gq��Q!K�pƷ��;��K�^d�C��^=uv����%�,P��Q@������}��M����Wȇ���I]��!J��~"��Ҍ��i!�,�%�bX*�`YV���Ѿ�j֏'�'�JPFdOinstallation/framework/vendor-fixed/paragonie/random_compat/lib/cast_to_int.php�����Vks�F�ί��dbp�G�����A6���H"�?1�X`�UwW&L�޻�08v[Mf�>������Ųh��������%-ŵ��!sЩ���T0e闲�ҥ��Rř�3�n�����e}#�5;��$� 7x�/,�{�,6J,��ۿ�i�������t)3���	��F�B���p�����D�sM���y��`TN���W�t�u%e(@��i�	F���jr�|V�`*2a6h>ULm����"_����|
��~�X�#Dnw�A��<5��x�'[:m\t곽��ُ�0)��3��b$���$u�ˑy���
􈫕�V�а�cb�
s�\qr钩w�H��
ȩa"'M(%��������5Sܦ�i-Sa�>�i�⹩�d.2,�6�� �-:�ό��1&tܜ�Z��,�-7%R�q�R��3b�gb%j'dn#D�	��(�;��31�_n��v�t`&}Z�Զ(��9�Lj�Yr"P����^#G���Ҵ�^�վaY�K��cn�f�g�R�Y�e��5iLe>$M��S l*1Ï��K��+*���1��^�,�)�Ç�ENh��(SDC��mQHe�>U|���{�Wɍy��0��O~����?���F��-�W8Jn���>�"/�!������~��{~p
�h��	>��&��Y��^LxC/�q�^�?�u��OB�
#pa�F���F�h���!r�W:�^���c��. y��o�2""
�pt������楇��ˁWyCu݁��C�ڳV!Y�t��	7}�vɫ������I�K�F��Ə=�ȏ)2WQ8�J)�hZ4
�
�"�� �B�q�m1����ɸ���?�F��C��Г˄M3�>��_5�&"7w,;�t�[��S숤gӦ�!Xi�/�D[c�2lb��<ۜԗYB�3���3�L3pP����������΢��s��:�8q� �Z`�k��Wd�����Ƴ0��_%���
ܮCj�=�((�m�D�ӏnG�	\�

>Lg>O���LW���v���ؼ_W
+��,MŌ�h���W��,�,˧���T�Ѹ���:/WS�~4B��_c�S,p��۷�'PS)3��I����jh���/�'Bk��_S^�yJMq�3��q��H�lu���5��X^b��ɦ�O��+
t�)%U}pj�en�x�f�u4�]-��L󪎾UX�Q`�acՁ�{�+`��ٱ�Q�C�����=y�>jL���a{�饠�T&X1��p��C�c� ��ռ���ڽS�޼y�ȇ����V��9��"|���M�Y��,>����%�m�^=��S����|ۚl���Z�c�o�Μ8ܻ�y.w5�=f���?JPFcNinstallation/framework/vendor-fixed/paragonie/random_compat/lib/random_int.php�
I���Yks�H��_q7��@�1�vƏ8b˶jl�O���M	�@��Z�n����o�s['����Tau�w��h�ߣi�������V��uh�SAZA��FŞ�*$��224V1
=�>�ȋ��|��XxF�h��ֽC��e�(_�@A�yaכ"L��k����L
�/����f�q��l4��-��
<M?��-��T(M���3���P����]�P�^@�d�
��6D�ٯ����`��ڒc��E�O��0��1�P�O24ϫU���
?/��n�����@�
c/^�T�D�pB�
Ŝ��]��✻�uI�v���X�.|�3�\�̭;X:Q�K�D�?j6�q��9��{���H� �	�wK-ʪ�"�ImC$5ME,p�X����8�Ԙ��OD���Y.(BP���Ɠ!��l.f
iZ��܋������H��L�&E�XW����q<�Z]#��PČIr
�K3U���Ϣj �d��ہ��L�ۈ�1`��[l|�fj$�+��IOk4��a�,j�.>�{����"X	A��<�jIYY�6Y�4�̧j��\Z7N��:R��π��� Ps��W�H���d���
�/T^�f�IE�(ȶ�yAC��F�0��;��1��
�"�|���
���6];��\޷z�}�:���=k��F��u�n@��ڃ�ԹD�H?��9�=�ߧN/���vo\[n�����m_�;��;�"�ك�՛It�>˼uz��xm�so��Z.���Y�e�G-�z���գ�]���;0���n��eέ�ԡk��_�nnXc.�u�zl4�w�{����;7�9�����I5���{[���m�ʱ\[:�ԩ������¿��i�o����\�
�޻}�F����(]�:�K�9�`�XY`o;�0>��C	����\�pZ7�g��9O�Ri�Ɵ���EH3b"Ѐ�����Xݞy�S@jT���ob�2[�����2���j��싈�[ޏ�A2��z�'�-9��4*��f���:� +�f�_Di��0��&hX�T���@V�pǴP	E(����8P��k"l@�������m>ݶ>Ԩ�R-���*�Y�u����P�=mx͖z���k��&�ynTQdQ1W�;�a%�=�
p��D�)��})z����E��e]������R(XfM3[�<ߗ#�(<`uY��B���ɴ^Xːȏ�����>x�Q���];��t(`<x��B�tI�Qe�W��8F����jI����d�~
SJ�z��0KpdCQ����%�c�ښ�X{�c����1l��<.�a��i4��(��N%1��{2��[�^h#f4t'H�3CAqm��s�#L:�iv㯐S��{1�D4Ƒ�ShbgW��Rg�23=�(;j�Fؤ_s�'��o�j�dԟ��-��Y2cG�6�4�9��:`}��G�9��B�ٙ�p�Ƭ�V�|��ȁ�o ����b�S��OT��"1�0	_��Iqs{�0`G���|2�#a��zT�;�_�V�f��g�G��P�ZIo��j���eE!��/G
�	��j�S8���� 72p���7�+7����rl��8-F�P��
�W)���w��'��1O�L,���L6�*0��}�p��P�����)�hq&�$EqH�]d^�������;��W����ζ��Z��wm�as�R�N�լ���O�5�ƗTJ���cO?+�z�d��@�kk�����{��x�"{Y.7�բ�!Ф3�8�1?�8�0�F+F��<�X=�Q����	��SO��U��+q�`z�ԘH���Np��O�xɰ��nQ�nc|,����H
���w��zp*����#`;�p�@��=��/��;��?c���2�=h4�_Qe���L�>������������!Q��&�Rs�C���|��HY+$+*4
��J"@���� ~b<�-��`2���fh�Q�˯��� ��O&�����0@gy��vď�Y��ґm\�y�2
����׵���u�ܚ7g�������2�o_��=�R��j�j7�V�]-�+���˭��c�2�\��&O:|ղqj(&ȫ��(i�ƨ)	QgH���iz�rc]�E�f;:�P�1���(	G��+E��Z����/��O6��j�e�
�-��(�F�0��p�P1tGPX��JfoQI,Vdah�sg�yd�Gs�sV��W�Ľ��!H����_�ׇF~
��	+g'�����z�".㡟�I������X�Lbo�}p�qp�6�'�oW����&���{�\I��z��V�v](��
��wz��A�6�y��K����o͠�Rel��L\/��r6�Qf?����8F�T<��{DY��ٛE�8�_�/C1��Յ��oڟ�o�}�LD{���?7����Q��+�������F�f����a�������V�
?�
�mi�u��N���M8�����8�ۯ��*�P����֐Z|�X��V��q��!wmM?]�z�2җ�
��|_k�e{�q*0�uV�x�d�1;˳Z��^��5�
���I���S�z���H(�5B{����ēay\|��׼�/�T�Q�/_R�[��5e_k����OФ����u�JPFgRinstallation/framework/vendor-fixed/paragonie/random_compat/lib/error_polyfill.php����T�n�6}�WL��q�Ţh����%A�7�S@˴�F��c,��;CK6R�@�Ù3���?۪onpa<�>AQI��I0�:m�S�[�:XkKQ��Z��ԫ�P)�\��ዔK�G��-��5�4�x+66Jz[�ۃQ����몼�������g�UY�ZX�zc$t��ջZ[�9"��X�*ec	/`*iD
�n�u���X�9�T����A_�����
�ٶX����;`��s *�Ϊf��=��~�G�)�x�h��G��vE��yq�s�����]���/���
�0b��y��BR�X��[���Si��zq�B%���l��(�����J���i��Z,��!M�%��ήB$��n/��m��R���t�����d�j�+*�E�E\\�<+)jĚ�u{�*�s~܌*	&@��ޭ�I]���P��i&�E)D8��^�5}���R�m�J�r��h�,P�R3�NZY{r�P�}���(QK�u]�,Y��޾ף<���4�X�����4d����k�'��nV����)��������h�C�G.Ԓ�����V��a)��av�Y{i�xX���]����|{"2c�'��1���,���la��y1K�G��$\&O�����i�����<�8C3�G�b��)<`h��[��H|������,��>�OaMx�$� �4�
>ZDa�"K��!�1"�<�d���Y\�bb����gaQ6��(##�0Jҧ�Og̒h����_��c6T7�B>`��)�Q	y��y�	�3FV��ߨ�ILzFI\dxPnV��y�3�Se&Y2�J���x���*��A�B�E�N�0fa�p9wZ{����Sk����j��>{uɌ���������\�0�#N�h.��T@�j���x9�BK��$�({+e��k�o=���s�g_��}�???>�VZ�1=rV����g!���'�3���N^�#-�$f�?8�}��B�JPF^Iinstallation/framework/vendor-fixed/paragonie/random_compat/composer.json�����RM��0��WX9-+�E��J����z�V(�zڈ6v2l��'�猀�T��{�s��(�{T��|�i�
Y�k[S����i�^&p�R�qސMU~*a�?��n8���#1̼��Qn^@����>&�L=$��I�;?�k��_�q�J�f��h"/��j�CM3&�G��The5�>�L���v�����o��A��u�$UN��5�hoN�Gvle+�צ�HJ�
l��n7�VK��R�N7��j�wr_��y^�Ip��G�4�2"e�q�h�o�!	�x�b&�ۼ:��#�ud%��o�|�G�?�a���%�������?�w5���!���&����o7���A��>����B�	}��L'o4�T#[�xp��C��j��p@�5�|�Y{��Ϸ��#]o=��vP��+ɓ�1���s�JPF9$installation/framework/text/text.php.C���W�o�H��4B�ISU��K�4ǥ�9.i�}�"k��blw�N���7�? ��NEJ��y��=����*k��aF���z0[q�#�A�\���(M D�IX��,�)2`"XE�<�@p&y�{�p>g��P$���2�S�Aj�exʖ	�W�iv/��J�I�����᯽�ã�0��U�>��t��YZ�iVǙ��8
x�����g8�	,��b�pfo��ɮ�]@�b4@ �A��E���u������ ���
�m6ϥ`����0��;��ne"�E�KtW���e��&��/t5��e�������1����<� S(#~e"
8*B�I�P�l��z�+�_��eM�D�Z�=�L}S"�!JO`2���H��J�n����
��Gk>v�g�+#��%�0ܖ%�,Dp�F���il[I���"&;f��zO�~Ӓ����|su��)9��g�� ?�9NYx��\`R���NҐ����c����hEp�ܧ_*�i�Ε�x1�\�@�b1J�ah�d_9���,<t aI��0�YK�
oWR���2����T��^D�E��M�VK�E$ri`W�^�Ó��{�n���%�c��ؘ�k���&kG��2�����F���S�s��w4�2t��4,��$�/	����:E��)k�� �Q#��ZQ���|�q�&�`���s	}����`qΕ%:.ە�@���ݲPu)��ѳ�<אb�B���Ȍ��bb����]�˼2���ϣ�q�&+H�z�_��:D�#΀_\����{t�-��P�� '���X���$W���L޻O�#^�K�@�y�����!p`�?%���r��5�����~�^!rg��%;����a{G��+J��	��.��0�9���Q�i�zґB�G���q?��z۴[OL���ngb͹t;���?�OW·�������g��g�G�c����$A�����\�P
�{H��5��tm�p`!z�j���{QȺ������Ћzz�&4�c�$\�!���� �E.D�.��4��_*���t���j$���<�.�������ۦ%��g�����q(���n7dJ�3�B��Y
Q�*1QBQbA���"�z����´��U��|�:�Yge}�<�����I�s2�`g3J�Yw��G9�$��+�۪�i��Zi�-�t�K��<KvϜ�:��@�mOw�zF����J��5�aUP�\�&x��QݑH��&I���J�9=����G2O'���qg����Њ��#�^w�<�]w7��G\��ͷ1��C(WQnRMEsM�TGu�*�S=�M��-�J��ĭm�ӟ��
k��n㮗�*�ݨ.9�2խ��ѵ��j�g���V�$����r�Ec���uW�c؉�r+�Y��ܩx[���K}����ѩ<�W�lސ� -VNM�2���hQg��t6�/p��R4��j�ט��DM����Z2o��g8�a�����
��]�Y��eD���U���B��խt�+�v1�Tz�wv��1�y|E<�Ze�E�9��cEw�^���X*v�ȕ(�
f"}�Qt�TR�`R��5��4ĝ-�n�3�:��9��94��Xk�HU�Te�j�Ŗa��|��.�nO{/���do�uZ{٬m�-��?�	�]�MJt?����~|z�1�ꡍ�T�0�Z=��[8�.D`&���_�����b�t���z6�\�in�i�ة��p�i��!"�eQ9���2�-u)��ee�B�oY\pS�6Gk����_\�{�}��R�rH6ieT��io�JPFG2installation/framework/application/application.php��)���ks�6��+�SR=Y��˝%Qm7�5I}�;�9ۧ�I�bC,Z�t��ow� E��ә�d"���_��W�p���C�5��sv���J0�h�
��,�Nd�TT$�fKY�[},sƋh��ŢBp-bv�e�B�r����b��B�x ��9��;��%��E2���J���[��=y�gO�=g�h%S��vm��e�JŦ��[�4�D�����?�7"O�yy�]���}=3�R
(y:�b�d"�����o��D�������<M��d��u�2�N���[�i�����yI{�_�P2{}�PIvGZ��<M�.K����P�A^H-"��>��XV�)�RS�E��D0��2�+��ؙ���5�l�̖��U(PP�d�m�u0��p0��<?���q��	UO�"4%�k���g���9ɔ�YFk�L�Q2x��4���n-�ϲ�Ԥ����۟A&�
/9(}�>B��
BC�
�h_EI�g����A��U���_JQ�)��/Zhkb8I�/�A�a�x��^�ѡoW����{L�ڥ#�Y���f���-,�,��Ţ�1ܱ��bǪF��C�6�W�:x���֤�/Y��Z z�F�*��n�Ll<�P��s�k:eB�5��'���6�Ž
<��7��Uh/�h�#�����A��ȡ<@ml�z+y� �h�i���}���f-�"�cv[}D��h�J��D1PcC�B�-Pe;+�sR_Fz�;�TǸ�пH�ڹ��R�9	�$��\�����G�]�O��*��=v
v0�x����rtU����-�%�d���r%�D�c��iJ�Ӓ��<��T[ᬑ��ă�X���ť7B+(*�0ߑ�v��m�T�H�_;�N.e�������nz�؜��Tte�D��L>U4�OK��=b7����j���P]k�8�^������"���5�M�U�78�G�U�x�,W
��`��c�q�adth쫯�#�@�tyxXg��[�b]G����U��|���J"U�"k���ʇ {<��R�~!�+W�q��
(�r�7�[)�R���\���{X��Q�����w�z�!g�VeQ�D�lS����AA��c��O��t�g��Iͪ-�{]�ߚ���"�_;+�/��~w���LRq�
������`:��`B�S�&�+5�}h�!����x���XH҉#=jT�,t���}ۡ�1���'�k���
4ƙ�£��0_�����(�,�De�L
1��U�YO�m��V�5���)~(�0�]V�X~�>��@;5MW�R5��J?�P���NP�`X?�V���p���w��Z��6ڪ�v�{����hջ�6��"�6����Pf�M9���M��S+��T.z���L�!��"J�L�2*��m�'�������r�MY���f�Ad1N)�L	A;t�?x�`Z��	��1��Q*�h3��V�I�ŝ
ñ0�2�f�3��<=r�,��OF!��e�O�X�wB#pv��B��*A�b���Ӟ��g��P&���̴�дl�e�wl֥���¤�{ucP�0�&=8z��<���Z1I����c���;C1D�Ɩ$�X@�-�]Tҙ�����E1SN�t�k;�p�(Nl��(�`�]O�E���q����4�;�	�
F��!��!�"���LmЦz�
�x��Y��H>���%e!�`����g��;�U��T�W7Ue����d�8<N�
��e*7)��m�o�iɬ�˦a٪��!����z�I�y�����TV�w��̟>Ok�q`pJag����A{�Y���	
��YEu��9�V��Π:s<�RIh_'?���Fp��&������T |�dZ3��xΡb�J��ok��&�t��9�6ζ;����U[�$8�T��|+(�V&>�d��(��T�X�#V*L"Ռ��3��K���*��7��[!�G�Ll(��$<��LN�Dlq����S��1f�X����Ѥ�j�j�\B!@"J��
�n��K8�S0�xK�U+ l�A�����l��K`E�@�f�e�����%�X��<a�<�� EQ�J�|��)�#i�?����_	سeT�N=UѺ�ʠ��_!($�'5�[)��Drtd��l.1�wքgꝦ9�1#3�@k�م�2|���jƸ�(a��4��U���I�-��a�X�֯Fe!��hU0������m�j]&:^��#
���{A�j��M��r�:��Ś*���(�?]c'���^�AK����Erxx˱��>��S�8ٜ�RC��"+�n��
CK�x�����W��uv3ݳ�j0��zbj�)h�Z�%�@��@7�&����R&�8[ o�uq)/d$�0��O8�)Ә�C[�5x�ĸ��s9��݄-u>MYޭ��"���Sfi�Q!��NIX�,��7������K���m<N�t���?��Į��b5LA���Z^�����R�í1�%4����e��J*M�A�`��V��p�i�%s��s���u=�2�	h�D8�;�ee64RR
]�Ůmɤ+;�ٞ�@5�m�K���Ln�pp,�c��q���A�����C�ѸGU(3(��u`ƭ��CC�>���d(Y�������bk���W+�z�.��������܀t�C6l4nc��8ê<5�rk�:N_R��Wt����"x�[��N��a�Ri'�V�����D<�J�x��T㲴%a���a�dx���ϐx�[.U��30��ʱP4g�t$��d{/�K7��T�
�c�a��:�k1�F+^(�C�����������
�Ц�W,����|�t�u3;l���G��Vܖ`���	��v��8��I�!�P�MqG�� ��˃����c�QE��3���¨ɶf�S
��k;)y�&<�}[=2���j��~�1�u��M"޵X���x�d��kA'�
�>�J�fh'�;�/�t��S?p%9�R3�Xn�����q��o?q�z طR��
��R�uL��kϨ�
^�Rgq%��ϼF�seW�A���R�13�����J�P�F��k5�F�`A�����m�W/f�כQx5?���Ȑ��~ZSj���Q��X�5.kaڞ��ͫ��w��[r��&��_��w��׷��y�Φ��>��+���w���Nߝ^��QƓ�o��6ЛC���d~��ͥ_�ΗV�Q��TU�F�a��*ؠ����!�~ۧ���}�<�/JPF<'installation/framework/filter/input.phpQ���<�W�H�?���q�X@���X���r@n��l�m
���d>f������eɘ�쾻�.��RwuUu}w���i����\c��w�����r�Y䜥<���σ8b�0
����
���<a~:��<c�9����q>��{9"�;q���_x�O8c0`p�7���4�Lsv���a�����o�����i��k�}���8��a���Z�$�0�(C�O���<����<`'��=O3��-$�@@
��kk#>">�������{�&�k�]S���!g3��
�(��>G���x�r`���,���gl��\��'�Fho�wް��G��y:�쓟>Y�GÎ�|��]��Os�KW� ����x����s��w�Ð�i�h�w�e��l>��g�S���}���������!lM�zGA�G�<_�m��ܪ��)�NS`�)���(P�4DY�GC�upjw��|�rXyCa{$mM�j��r��Y�#�ܟ�Ex��C��=K��<�p�I%� ��>�|��!��.�q
Jxd9��G{l�y ��<̛-�>Er��P$஺���wA����Y2���4b<�x�~�[��b�0���ªr��F�ҏY����!�I���%R�^
��V�5�$	y�h� =ɫIϣ���g�\�A�7>p9d��3n]f
�r�4���*�wkV�O<�e݉+�,_\EzR<�tL\S/��PɃ\]>�k�eJ�V䮭5���{�y6c�	d�,�y�NUl�����n����6{0z��t(�?�u��C0�y:�$��D	k���u�莃���g`}S��<H��,��6��Ł/'�[�m�H�&k�R5�����β�T۫u��Q����_����}�#v{;T��Y�]K��}�b!a�/n(`��Z
b���~��<�YLo����|Ā�ARa�"R�3?�@7�<�����A�)d������z0)"�˲`�n��J�x�B�'�
’�����@��:4���0Cl���V�_�f��9��)5 !��Q��
�Q ���A4a"c��,j������G�����M:-Ki�LR.���]�&2��&���2��ۄ
P1���a���Mwwg�?y���W.����^�Y�YϬ�l
}���,ɟv8��5���p���Z�s@2�?�'X������֕/ZPc�K`���"�����A:+S����C��\��..0" Y‡�8����Ҷ���0�6I�D������D�A�
��J��<%��Jc��+� �ʸ2��ž�G'g=�xvv�؏g�@5NN�|�|�\��]�Z����#<;?�g�}�]�Ђl��\�IZ�Pb��a�6�8�P��i��dMK���҆�v?P G��k!���y��}z��	�SA2��.�5��]�k�c�\��EȔ���eD,�lν�9�KR>�z�n��j��盭.�?�t�rh�HDAAS�a���<����oĐx�;R2����?A�yH6+�$�Y������R��a,|d�2���]w�E��弦�V�6�M��I���
�8ԋWC[��'*S��G�@��O����t �t�Is_��*x�/~{�iW-`��d���0�Ө�A��q���[�Na�אA!,3��х��#���+
a�j�.?�����*@�U��KE����P�0B���
����l�lY�ps7��k�׽Y>����m�-�Z�ʫ?o+/�秽O��e�q{�}��st��/G��׍?���>';���[r�,M@�����ډ�S���LI="�T����>�0&�۸��
��b�����kVt�DӀ��!��<v�L���'�K�|M�q�H�PF�L��r��5���#��)3ns�E�|��q�d�_�u��L-�d�L�P^N����bM���i�k���AM��d<Ees"͑7-�\�-�n0,'��#A�9�ef�b��u�%��#�*K�zB�ye�J���|p�s�ٽ�b)�;5�Fưd�RN�W�w�t�]�sBK���8B��^`)�w=��ga��%s,
0֔2<��)��[;K��܈I��9O�0,k�a��h���=6��U�t�G!1�P���WV	�g��iˮ��W��y>����i�k��g�Y<��/X%ģ��u��>�з��*�`p��� ��� �c��T��[�H�ʲ��l͕d5}�I�΂�b;;]mԧW��,�4AR��8N�9�K�w,���dn�l�u�\���0�a�����H�^�{K&N�^6������ւ�����E�&�M ;�<��SU�������y��J-\ډ�C���q�!����Ü�9��ֲ�da�κ�?�W~µ��i핔�|D�7��X�w�j����-p�x�>�
X�� ��r ��
k?�0$�*�Nmc8OS��Oؒ�+d�,�r��p_�
��*n:�eY�k44E�B�J����r� �a�R�\Fs��ё5t<a��
��R�,��SJ�N0L�
 �\fϰ`�G�BK�A2E����X���4I��h����Xڢ���T>��)��
�R�/��#���<YL�&g�%g��Ct�$�3?l#��=���R�2�&�D�d��i�?渆�]I�#�d��IcEM	�Pd��خA�z�zE�m?{�l����7�4�B�E��\�G��|�����@��[��.
�<��D�Lê��f���c����m>�9�zCL��>�(��"���݁-"��9S�v�����ե�w��Cl�q��&�Uʠ�U�T���j�z�",@B�(�,���y���L�� �VqƏ��8��[�)(g�W�y��J<��q9�@��
��-�	�&�,�d�,{�8�L<�����
I��,�*�9�y �a�ņa�q-�(r�0�ѵ#R�nõU�4_�q�)��`Q���Q�v
q@b�℘$�-����j1Z�ю�2[�Lk|���cl������C������h�R>��~ZGFb��Ɂg�`��MsO�m�c��$X{��HXv�fG�y]m֭�Y��ӕ���J�n67�A]!Q&2�uC)~��H֛�LU
i1sj��_����'���׳T`��y�}P{{Aq}.7��b�
�@t�����w1y��@�N�4�h�Hs��H0T;���]�P�0��Gjw�=Rѝ���e.�
?k*���l�^hs�mf1��2�`�u)4��װG�=��h%�}��Y6����	)��ͣ���@	M��Dn��d!6�Խ�q�n�DV�D�B�z�'�PI-�/b�`ũ�I�샥W����]�_�-�(Pu��|�x{vttѿ�=�}��r�w��6�VyZW�K	��聫�w�7�Q��*���ULَ|d�]A�V�^o8�䶄6��B��J�*.+q��5��	�C�S�j�!Lخt�%���u�d(=�_��"������d�׭�@�Z�C���!p�/�XJ]�o�6jV�V[R�v�Xx.L�dy,��Z�D�ђG�(	�Ű��?�C<}�j����v��2chﵙl�w��M�L�5,�c�xA�T,� ���$�)mD@r��~'
L1�%5X|�b�hvK�0<�,�<g�8d�p2��Y����Z�Ғ�/�8%	�-�\�3U	�HX�ҹ�afo4/Ê�?�[�٩�r���>E�%�6���+>��?	
.�0�j�xTM���ć�S���gHS����h$ʱP�E�`FM[o4*�B��+&���j4>�ƪǗqdI�^�ᗪ�Ǒ��dS��]p����Ԭ��8Ӊ��v�s�Vs�� ��3���fVw�edX�c� �|H�)Z�䊵����q�D���bS��ʝ1닃ܼ��bQ�Z���>�Ђer��ѣ�	���N<�½�]u(�M�`�X���LD>G/�m�Qq��~��O���c���UTAkF�(��n��iϹ�Xf�e����E��Mǂ��0�o<k
m������JO�6�h�&;���⛣2�k�� �"�V䗧s�W{���o�>h�����
1��ou�"�8jY��Y��NBf��[Ԑ�#$1d�#$����eǁ�a7�t���
%)�/:�ϒ$ј�Z�K`|�9R��ʣ��?JLx�JA��C��x>����,}��ju�q�u�A�Gw2�V�s��m��W/�0�E�5����L)�jE��>{���3{�ȶ���N�f���P�/e��{Q���)��(6-�r͑ދ*�EE�7�����O�w�ĉW��!�ܜv��+��.`���~p:�-0���ʤr��-V$���*P�B�șJ}�B{j��,�2V�4
�ވ&�T8��r9�F�B �V�
D�Q��b���/a+!Z��d��{�P/�����P�#��A���l�)la�R9,`��k{�Ju�-"�2�^��P�����q�Z衋�S�3�|�Q<��t�[�@I�9��qtf[�|��Q����E��xNLKg̻p�f�x��8{@&9��YlȚ:�*����t^o�e�V>г�cC��M�b����2�� ��ݒL�t�f����Z+�ϗ�Z�o�/�ԥ!c2zccI�ֳ�,��bW�8liΰ���9d���-+A0����"3g��(��|�yVH��$ɮi?�m���+���@���A�W7������m��d�
�v���\�4`�}M�F
i��V�m{��Z'D���~G|�5�n�]?��B�y�>�eJ{�F&ķW X_�W�~JC\봳�C鳂+�8�,t���Q�f�*P�fZ�)շ�>()�W��C�G�m>�����-�)�ͱc��d�zy|yܿ6ƴF�-z���@�j�F��%������呠��.�3mQ����*��b`�f��\�3����&�,��+�z��|۝�S�t��o��
��4��Wo�o�Y=����`�U�t.�1����X�^�ߏpc���Y�5��`���O=j�Q�S\U�np�]uH�fU*�-�S��]`��:�H�txD
�vk�N��^	5-�(i_��b���a�G�ưG\M�S�|Ǒ��%qJT�/�u��#ᐣ���N���v����}�����ѣCo�b���S}�2���eM�:�s�~ڿ�<�#�����|�a$�y��I��aG��2�JV�$�U.?��
�{�3�	�s(h���`�/�cs���v�)�P�)��8���xX�T�A?����[ڨ:���m8�)�R�Xa��A-�Vm3�y���k���'"Xla���_�R|l���W
���0�a�4��i����^q7EI�d#��ɖ��'��͕��u��������nl[j��Ī���4~��7M��[�9���ȼ��*k��9$������>I�M/o�9�X�J����!�G�j�U(q��6��}��E�U�(�N)�ۮx���Z�#���j[�*F
ީ�M]/��B[h~�g��/��֫B�S��,��@�5�m�'.�|�c�TJ�Uv4�'g<��WY�N��G;�g|q�,��E2,�Գ�x
��W ��	nvQ�7�����W�������u�՗�	�Z�8M��8R�t2Ʊ￱k�&d�4|�l�i"u���La6$����4-
Ȣ���'D�U��	�
��h��|uL��
�e�����^c�X�B|
ܴfa��G�:�5:0um1$�-�����7�;��7��r�p�y!U��:�y�?I����7JPF7"installation/framework/uri/uri.php�>@���;�w�6�?[����ʔ�n�n�MS7u�&��v�o��O�� ��dIʉ߶�������./���`�03�y�����ŋ�x!N�ߜ��}q����J)rY�i�Q��"̣��4� ���D����N"�ePʅ�ߋ�OR���,t�U�0N�C��J
V���0���h�.�k�k���xp��8��u���/~��4K�qZ����]� \qʤ@�o�?�72�y���:�;�y'���v"���x:,�2J�b��N�zz��7��H���-��uT�eK�	�E�&e%�^H��Ӎ(A�����8x".9�m3qY��wb�|s(>d21m�P��A	�q���5��?\�,�K�.[g��Y�C2��@{wR|N�O��0�A��'Pȳ؆k|g2'�Y��E(�BM����BPM!N>���_�=����.�EQ�Q���(؏�g8|&)e�F3��x)�m�x+H����N�4�C�Zn��oӢ����,JJ�I��4o�e��?��B�ITչ����	���YQ����&����m+�:ܯ��x��b���<Xmd�%� �a��I�-
�`��h���1Ъk�s��_`�'hWQR�A�¯��vh<�=`��sd&�p���ql�X�휉����iZ>j�L���+
{��_��.�m�ݧ��[�?dg-Q��2%�V�%Qq,��d-a*#t�\|l,��UN���
�A�C�+�mR��#�K�{�a���=��6Q�:�goX���h($wC���_��}���6�\��j%KbVQ�������r�Hs:����k.�m����)�+0R(0El�{��yI�
�~�s��IE��9E`$;*	��b��"�J�н��KT��RN2!	�B�h�!f��V�F�6�ATl��*�(+5B��5�5�]�^�rz�YZ����2^Uk�n+#�BZ�C���cp&{VĘ
N�W81�Τ
��IBL�@n�B@�\���H��g
x���;1z{}}q5�	
�FE!��g��ƣ~�v,�?O����襄����F<:���#�5�{�uYf���h:����wzʸ��C���z�:�".J1a���V}�4nR�YF9�'�r�сQ-l1*�6!�`d��&rqvv�w�o/��w?Ssy����W�3�]#Ej�Ҵ�#0P�u����
x:0�j(C�ۥ,���U��u*��(^�x��(g�E(Z_�ed��i%9�[P=S�R���s�J�Њ��J�/�r�c9�����[��a��`�U8f�HEah@�i!BR)����d�r@��?��r	9m%0BY�L��}#v���˳����S�7����̮�/��߀�<M(E1���i �VGlrt:�Q1*�z��$�`��Ҙ��ڲBm�8c��ٛ����!�gde��mnʖ\�����������<�	�mN=���8࿣�5�`G�p�2p��x`�X{��<B~��4R�:A�A��'2S�G1����m�i
{0���S�F�-`w���L�Ъ��G��6���	�e��i�G:��Ć̶\��q�"�%Ϡ1��ʘ���8�o�8�J�8�s��I{̍"YF_�[�_+W���c9yXO )|�� 0��@R��,-F�:�A�p�6��pyKwd�,̀�v�0��B�{���f!��~s���#���u��Ӂe��:��L�ȷ�q��fY�+�8�~;;;��XC�7&���+�
��2�SEom<��(�<1fo8�Ď��Ro��������Q͋�W�R<ȆԞ��7�ED;둍U8��?=������[��W�ݮ|�6��=q����hS���4S|U���~�a2G���M�1q�M��y
���-�ƎA�?�A�\�l�G��M���Y_��m���d�5��
q���k�x��n�������G�떤*����	L�iT���F���F��ڮ+��[��{Sx��K)�~�����9�P-�#.�=+%�)H�fK�k]�wi�x`��Z��dǮ)9���^�j���՘���$p�ȡsa��Q	��L�XF2^�.YTe+�\4Ec|�u����m,5�feՐ�^);L�6�	�.���;0U(�=NL���yx�s��h�1"Pq�`Z�Q�d�O��b)&�x�Tx�q�!f	��6�uq�0˜��A�ȟh�^�� B�l�����d�<h�����vEu�x�&�C%j�.Xd4�g-jw2W�3E�H
G8���3�Y�JG� ��K��[E�
��5�J�\�wQ`���[����c��-Mpu�႓�r���ev>٨͎�͝�Zڈ��^'��K<Ś�>r�0�Wu61XG.���Z
��ڤ���jl��{�n}x���Qy�u��%�Y�{X����9�Z�Ձ���u���i�&�?�E�A��;s>��)��iL�y
�`�]�,5�a�3����dM��RzEu�����H�"=�5���Se�t�>K2�S[�?S�����6|.��%y�A<�AI��o;�n0%�N����#M�/l���p>��a���4��顙�M3�wь��Od*
��u�i�j����.R�=$c�=\�1���W�h��=����e;�����~u�N1w�h?Q�X/yN�������x.
��
S_�E�x!����FC8p�{�!S%~�W+��t��;J{��u���x* ��3r0Q�(�2,7Y5*o}C�o-�Z���RM���)Z�U�� 3������z-�O��H�����"�Seu��6w���Aa��w��}��3�`t��ɶ��0���@�G��C2Xu�BVL�Ť׊��d &a�M�W�����%��_�8W��j����IZ��g�|i�����M����D�Rn��@�œ��3�]m��RN3>j�kD��q�w��6��
\_n]��+�q��V�����*�D��B��,���<ȟyyߔ��/�(�s�^�X�M��ΤT���* ���u��{�!����V��A�V���[%u�����Bm��j�֬��=_��#�ޒo���[@��M*[�ぅ���+��Q��x�ߜKV�vl���W��3�1Ң4����A�RF��!�@��z��-n�����I��G%_��o�X�hX��
.#Mr�.̂���G�D�rp�����{ES�|�����l
^�F-
E�QU�k�V���v���E�g��,��pa�>L�	����@�\�o�x!����g4��WV#�u�k{\O
�$L�Tމ��%�1߂�>]����,�,C*D�	��ٳ�h@�u.>n8�?Lm#\*dmd���3
�ɍ��ذ�-������8%�tӚn��-�Դ�*u�P.�
أ��ۮ�P������vJv�7�G�\Y�*ⰅJ-�L�n�Yw���w���3^Zn�3w���!g�]�S����>B��Y�[�-Tj9�ի���>�����]��=B�;��BF�!��N��]�Kt"W��=l��q�7�K��d��_
Ʈ��j.�����0���w���\e��FՒ^Y��ȟtҹ��#���f�\ҧ��
sE��G�m���B���
tz]�Y?1-�/1tѴ�J����DC�5��fkl�U������θ�)d��x�g%�e�>�y���#�$����*��B���;Q�|��^��wэaJ�u5d������絤cs����n$�nT?����]X`-�GkW��9�]s���ikG񏮎�^�6Ы@�e-y���n��ߙ�������LYפ:/^�*��{�ʅ���߸٣�U���pnQ��G��g[c�P��BA��X1�N'��T����W�ǩ*���f7��ՑQ�t���y�O�����l���n����N�{��V�x��V�����^c?~�H\�t��8�QS�1M�+sSN[~�b�OzS��ѭ�Bѳ����34���n��k�x�0��@Go��E/��/Ў?���X=p��/�r�=��o���۟� Lh�P�V��7�oR�����ݵ/?T�Rc�[�Z(\��O�hD���&�g�@�LJ�{��o��	�"�f�/�ى~��R���er��m,�p�y�ss�����ҽ�4���\��B���W;Ĝ?m@�|����u����կO�����/~��^��/��n�����^��g����w���^�2�����-�ڡO+ʞ���x�=��c|��?��9>^�c��	>��x�����7��}����N��LPT��~e�t���0�B!~'�D�E�uC��q.�})�w	�=gA�}蹙�U@?�[b6ʙG"�_1[�栺Ib1aMq�.KX�UM�����'�^d�U}0]Z��4T
;16rg�m�P�٧*�2���s˪��šO���JPFB-installation/framework/exception/dispatch.php	~��MP�j1��+��Ժ詴ЮuYD�B�d���IH����{����cfޛ����Z��yΐ�\׋
#|���"�S���A^����h����:Q���#I4�=Q�1�*��!�V���ۼ���I�St��u�W�6�>eb8)��Ѥ�L�V���,1O��`�=j0�y�����J�	��z�AM�<�86���J�ȇ�����N|Z3&i��l�].�jV��@*ʆό�!��΂\���
�GтΑ��3P��@&��/L2�rA��eJPFB-installation/framework/exception/download.php���MP�j1��+��Ժ詴ЮuYD�B�s�&O7��D�R��͊Jo��yof�ӳk�9C�r]/*�����O!Zϣ�Ax�"6֣�bwp�^��H��$�t(wD
��0�[m�Go��˷$�V��u^mۈ�۔��(F�b2�Z��j���<�u��m��걊�|K+A&��'j2��ۡIV�H>�wH�t*���1IeHf��rYU�r0�RQ6|dL�eu���іK�)��7j�4�����IF.��0��JPF=(installation/framework/exception/app.phpy��MP�j1��+�.��詴Ю�"�,���M�����$�K�7+*�=f潙yOϮs,�2�e�\U��#	�B��Ge
���El�G�����ԑ�'I��Q���Ea����&����%��$A��	�z��.�6��dV�Y1��V��������:{�6 �zl�<��J�	�e��%�\��$�y$�^�;�J:�i9gL�V���w���E9��h<ydL�eu䆿�΁N����P{�iO&���L��rA��eJPFC.installation/framework/exception/interface.php�R��=P�j�@��W�-*Ms*-��		Rh{.��S���쮡R��]C��cf�̛��lz��$aHP�ծ��=�)O�伶�+=�	��G�-.����W'r��'�fFq$j8��(�ȇt�Xb^L`yG@t�Θ�f���=^oS$�<��y�oP+��;�����6z�Cz�8xy����-�U���F�|����y"�^�;�JC(`�rʘ�V�$��w�/�m���Tŏ��1[.E�#�,��ݰ�?�JPF:%installation/framework/autoloader.php�����U]o�6}�~�
P@R��n�=iкm�e͂���yh��"B�I�C��)�kׇ����{�_���:��FtJ����k:�_J&+�a�N�lnd�h�
�D���$L^�[�
�Ͷ4yb�	z�ETE��Q+
O�ƩX0�÷\�[#������<��8�_��{��Z	K�����V׺Q�Ҩ�sE�R2��z���_�+6B�C3��u�+6��ꌐ�B�GQT�\V\$q6�t}�n�>�����Qd��F�t�3eه��YFC�G+�
m��r��H4��bwcܚ7U\�|��u��I^���f�Xr�
���9�h#�+銪F)�F#�Y<�<�ar�S�L%|M�6P��r�Xgjm��(�ٜ\]�8��v��h.���h��R<�#���מ����d��S�����@h�F0�<�Ψ=�g^�U�A/��`�̠�X�˴�}	`/E/)Ǒ¯E�%<\�7���R�$+���@������⳸Dh�PC�"3\+�s���M���-�O!R��uG��o^_M��4�cr���i2�����V���#���Gi�#g���,d�@n���Q:d^�s�����R`l��lp�S��
�÷k�_��HG{R�w���۹T��FZ�^���,�\5E7�p_a,�*��5.���à!_�o�Pi����c����#z1�����<σ0���g���}��Ɩ�W8��	�Ǹp��>��^���n(�l
s��m6����N���b[�ݢAk�7�š�OZ/�8!i�����%���w��.��â�`����|sߡ��0��NC�+P��W_���A08���|k�ѤcY���}�u=�3�k��4zM��z�s�'q�����u�H0�†V
��}Hݫ`CY�0���o�
�Ex�Y����x�D�JPFE0installation/framework/Autoloader/Autoloader.php�M���Xmo�F�l�
�`��[�Ò����.h�i�ah�,��[�;�$95���wz9�r��>-ȋ#�<�!���//�y�<��	߽9;�.|�s�E�A�8Q�%BI�}-��JÄ��iL�s��1����0Y���	�י��+�U��:�U�wٌ��Lps�W�J��<���S�o�?ww�{�N�s���Z�*Ri�b��g�'��
�˘�y��p�5a�N��g7�\��^0�Ш�<�<F9ɻ�a���,��>���x�����&�@�V��8��E���n���!�"�f�P��
-�CM1�E�b��1��Ѳfr�|�#�J��L*͍���U��@o�Ւi�Yk�8�r��c:�zi��3�M4"-��ث���6��aH���������,}��S�]*�œXwo�"$q��
���`� $~��[� �d�٩�����u�A9�<I�t�nXe[a��4���O�23����4�Z�D<V��0�V���~qX��Xc�F+��s0��hܢs�̩5
�}�~a�b�g��H�U´WCtce5�ǖ����e��p%qB���'��:u��)��6ܚ�3ؓأ1O�VqˑH���OBA��1�,����=X���U��եPi��Ad�Tda�WF1�X�q��L����
���n�H4!)5//�Ukǯ�͝�Q�g�(�2=2�Z.J��R!g���c�	�6/����jJMb��	��2�\�t��L.Y(����.���>�L��D�5���R&,~cQ+C���)�8�b��ӯ�lћ9��"���]��i�u�~�(��¢0�RI�J�;�c
5j*:����o�F�\jgq�k5����{l�R���V��	c�_�~Wk�:5A<���C�fČ
�� �OY��ߔGf���ĝ�Ut
�?Eu������)W���+'�)�	[ۢ�xR�._Dɪ2�a�"�R��`��HE��Fﱓ�
�b���ipuU@��el�U0D�J6֒�z�(��
���C�A�n�6�X�!�'5X�-�
xe~�)�j��.
'�a��]��	Ώ	~mb���c����,os��V�晓hq�������4;~s.ш�2B�,vFHuϸ�An�0��!�)&W�h�>��E�^<�]/��/��?n@hj6�4����V",�w���^2�^<;��pe�4�Y��B�m�5�֘�J�d{���\N�Ŕ[[7�(�'�a��k��b�{�-A��&Ly�����G���o#-��wnou}�Uz�a���}���v�w�֎�6C�i�y����1�_e���$�C�s�鍠F���e�vYc*Bz^�;^����#�i@o5𮝣��Ӛ�>EK�<#��O����e�4���Tk6�
y�R���;�!�������qp�-3�F���yo�7@&���0O�(��'�,�E�'y�>�i��p!Q�1�<Sү�i4�` ��xZ�6����B����#�U3�p�rv4��]�}�������b��Ѓ&��4I��j�Nǩ�|H��
U-�y�̟Ý���Őz��3��"d��T\D��#�	o9���t"�q��+�s�0�3�@\��"<5���<5�"�̳�bM��c��zΟ���Mo>�i��%v=�ʈv���܈�N66"�͛=v0MW�Z�v&�]�*#�+_��W�>v_d/>���6��f�>�Nn���xL�����7�WN��JPF?*installation/framework/session/session.php�*���Z�r���-=��ј���;�r��h��BiD��'�p����� �m�}��H���9���"ۙV�)����Y��y<���=��Dw��Gb4W"ѩF%idd��P$��q*����f��ƛ�;��(�*_LV�{��D�"��'�(���؜�x+gJ̴�g^����S���Z�ON�|���1��<
d"�v�9Z%QeA����E�3�@{*L���x�Bed ��	^���N����-p�0@>���T��o6�ݷ�ދn�E�V����o~�G7��*��]�(V&�*���A�Dt�*!���߃^�ٝ4"I�g��\%R���U��L�Љ -C˹
E��T��� �^l�d��!@���4F���L�-�1�wy��S�F�@kԜ�Ur�4�j
���g"̂�Q�߃1�s�}�B9�����Ȓ��2���s�e�w��t����c.uo��[����.t��>�$;�?I�:�FM3�;��ɠ�0ՁXE�/�;�<��)Y����5ʉ��h���"�C�A%+p\āZ��b@��7��ۡ�w���s�C���uN��Dy��T�y�*M���F
i���R�D���T�j	�Y�)�8���I�+�����~$�0��a
������@���ī�^�m�Z����7"�!�7KYDl�ߪT��'x�A�؜�g�9��[�^������&�����m�כ�H�{,�5�Uw8|wy}.^�����^�h�b9���R����4�1E�[�U�X��`�T���q����x�{ys����Ne����B�@���۔�Ph��(�E��h/!8OL���l�p��>X��C���C2�a�{^��=X�y��q4�^�,`Z�e��ZPV��DD�l$^|��%��d�N�ئ�B����ar����Kx%�Z� ���#�ؔ��
���7�DZҏOOa�[i�,�W�$�Tbe>�1�R�Ae7 п�D�N��ht5��,!�y�Ɖ�T�R�U�ƽ�[��C7>��sш�ӆ8/+L�;"��S���G��I�qq��{1_7�銵l����%�
�k��=���b}5�*Z��V�F��v�ˎ��4�h��������UW�U���{��\�<��ɷOWr	�>䊜�T�Rs:G�f�2#_%ѓޜ?3�B.�pt�	�"d��	9���vM����<�%J%wD�#e{��V�/�����br����\;i�G��t��SҴ DT��z����-4�y�rh@�9Ш_3d&���%�{�G�����q��i1X-4q�J2ȴ����T�:�q�9�s6/nF�d�� T69��uQ�C�'Dt�E]�vP
U<�n!����&���ee������nV��	Y��tز��r|׿��Q��Z��\-�G�[g�³�I��[�j�e�h$�g"�8�;���z)1	dx�v��:��T� �v�bۖ�6x�4��.�P�z��	��5�sk�F�n��'*�,��:D�����A�?�V}Mhc�����I;�Z��o��`)W�-"�Mb��)

i�#ރibۿ��:��Bϖj+4A�VB�\m�ls�cό�!�cM��+jh
sR�F^�X.�u4F�YL��	����Bh["�B8�-��C���n��plk�!��я��w�ߤ��Y+5c�5Hǯ{�Q�������d��f���:�rO[=��d~z�G��d�_1q_6~uy��w��9��DŽ����(WDk���Ŵ�{4~uGNO�T�2�[���u�!w@'m�XY\�U'&a��;z��{q��4�8Fc�)�5H?"��׍�Q*<�mi�������Ra�� �C��|�d�Y�F�'*��Rɽ0;x�K��&,��J�X��G�ĊBq43T�P~(�QS�Pz;�
\���[��¼�Y��:��<@L��tN�04�fU=�̀�k�؞�U��Ts��9:%Kj�DY�i�++���я:y���-�Cа��0SO�ߟ�K��<J��0?0y��G��"�B.��_����/�1�&H�%��8��E�e���!�u�~�����;ϣ(N�:�\L�Տ���� �	~�������}�ŷ�[t�F-��D��C?E�}%M�hU�Ѿ�����vA)}���� j�^���A5�c��Y��٠�U� �r\�."ST�U/�{p	]p�ʫ2%�z�<�\�:ȱ�Į�%Y�����ɴ��홋��`�n�{��n���GK���fQ��u��:�ށ�	��6f,��'����M�L�n��ֈ��M5�����m���+��m��
7/~�/O��5z=sv<T���`8�}	y�S8��W7�cipD���Q@�ShyIItIaP/FV�ԑ���y�����#���znGtv[I��$��n)Yl����ߵ������cEf;���$ӯ\�c�J\����dhyh`�`'����{V�)M�gSp
��Ec�W���̭{*�u'r[���Ϧ^%�Ь���)�e��,j}s��19
)|;�����5X1�:�
5���l�gvѻ��
W�Ķ5�6��@P���F��4eo��^��!I��N�Si�}����Z{��J�;���NQ�p��'B.P�Rj�'�S׹���x��J��ƒ@��_�>4r9fA���<���ծ�9�
��T�{a[�ԭav�t��H��-�8�Г�0~�
��Ua(���4�}�ܗ�i��Kp�C�*��Ie.+����ݓ���&\�K���R9v�Bn_�L��ݬϦ\!�m�X�c=��g���(�Yl�T���yJ�����+�W���nErh��d�5K~
�Q��k�]&C"nmGb3!�L�?�)`#�6�Xޕ}��_sL�%�v�b�?�M�(�C����<�1e�ڠ�Ǻ�;
k<��]�J]�,�U@��7������o�z�b�q�P=�ziQZ�yq�U�=۔^U8��[��8��m[������s��8������T��nm�1�t�����oJ�n�d/����)vχx��ݪ#Ď�K��PMYώ:-�V�IE=;J�@��\��$���F�HLx��>/��%-���gM�/��y{��pXװّ��!�L�Dw��'؎�I�F���iϹ��ѝV�g�!�c�z��+sڷ�7�[��Z�O�sي�7�7ϣu��R��=���r��ڢ1���]νU�5�ml��w7�X���Sɹ�KЪS��*:dlЗ����-ё�Z)��h�%�+P�YzB�e�;nK��s�dI��(�[X��6]����>�4�qm�N�<���[�kn{{\�Ls?6��U?A�(�p�@W,њ����>}���_3mv�]N>�n�b�,x��!s�r����.�y���]�����m�Q[��6����ƷZh<}Jr�\A����}��@�*_�(Ĭ5UNL�v���rŕ'����R�{�]0��m��}�����߿��`�d|�3u'(�ƩyXi�w��E!��t�e��W�m�����>��
 �nQ���bk��N�<���B|��>���;��c�	9��E�#wH�H� P質GK{]PDt�Fa�!GKh�Vt����4�J��B������{�C�i�M��~����e��tqB-�=S
����E��}>_����O�."����j͖�$}}FMNH����ra�֎��_ni�8�W��ǵ��,C��4��m�������������J��o=�N��!��O��JPF9$installation/template/flat/index.php6���V]o9}�_�ή
T�L���[Ȓ�FQR5�J��Bf|�{�@ت�}�=��h�6yH����{�OzTL�z��Y�<#����Pr5b�b�:m�Z�Q8�kC�,�.�L6s�$3�p2^��5�����	��+�Zj���Y�.�!x`" �e�X1�:��f�:<8xM_��ȦZ2K���-���ХԖ$kg�[Rd���2�����$�P�q���6�`����s�)IL���^������F����N�~ԫ�S7��0ޫ�R'����/=|7໬��$���lH�`�i����bH�ziRC�3p�(6�n4�(�qɴr�\7Z�]s̆���D(���fLB�E|�ڙ:WP���n�A��lXtp��Y�dSf,�n�r��"*�%2�=�8��4\O<1����9IW�����W6g�j�[�"f���LX�+�l��8_�v��xN�Re�&��-�s�C�@�ǥs���ln86�~�{��&�[��uK�֧�-G?Ԋ�M^�(�w<6�iRU5k�$���F�ij@q0`(��<������K/�b�>-�u�K�|��"�Bi��0'�~�(�CO��p��:�2l.��O��(]�<�~t�B"&
l�']����
ai���ZhH0�Vl>f&�Jʳ��݄̌Z�Hs	77�-̖�h�&�guo��M�K���v�ilHy7�e�f�ASw���A�7@�"�����!��h^f��a�����]ͱdc���SjgLʨ7������v�	ۋ��R���q��u���sP��v�x���$�G�n4�c!�-\��D���E�m�y��n����Œ�\��_G�'�������h��]}��~�r���]��R��=��4�Vő���{{�'U�u7:���~���
\(����;��փhj�Y�gDW�@�Xq�-?�	�G9k�
��̽q'�W76��q�瞐���6UKs��qy��)��筶�rT����_��W۸*D��)��5�?\�=�r'i�z��AU�y�8���&�UH��w�
Q���$�^����ӱI��Y�r’w�W����E�V�猸)�&�5�x��N��bOTk3IV"�&�B�Q�zAm}8��V~��xbjY)�ۭ‹1;�D#�@�]��w�^�m���%�8���L��jW�����*ɕ����pٍ�ε�z�vq7�%S���]��ִ�/��{za���1
�%��*�m���5���H���-�qO˄�L�x9�Q���JPF?*installation/template/flat/php_version.php�$���Z�n�F�?�D-j�0)�NSԑ�uR'1��A��(
cDʼnI�3��],��}�>�~g��(���n�[(9<��wf8y����w�������9��X0-�`��F�H�127,R����/�X�
͂Bp#B6[��!f�=�Vda}�J%
<��_r��s�̥���/9�
{�|�������٥b�p�~��h�U��Di6�y�1����@d�迺��^�L<a��n�7��[Qh��A�
xx���Hf"�۽>�����>-������e�kÃ@h
�E2��Nj��BYd<{��//ޜ__�3����?���6����t��!ZϦ;�ؤ	�#x8�!�&F�DLk�V6�w�2�u�E�
O����`�M(.��ə��_�����=�NƎ��
��z:��b��ŒX�2#2s:Z��ħ����=���L�O<����QE*��
b.9i�L���-��A�@�q���Ņ��w����>��8���̧E�?�bȋ�?���E*6hV��"��rwu�ttI}��Td�%�Q����S�M2���ax~'�A�Q<��~����qoE�{��2(4�-�g�d�Ƒo�
�����
�g�.�k��J�����d��%��t��
������
����������I(o��R|]���2���;.�Eѡ���/�jQ���c%�%�Zm���@��ٜ���&-��5W���J^���C9�Vt�q/Iy'��֛�}�S�{^���G�è�[��WT�j�+���'|&�=O�(!�魿�l�ke�ܛ���E��D z3��Gc�"�Q��Qy�*�3A�vE�e�t�^��`��Vέy�#-Y&cB��MѲZ�/�����ϊ�K
Q��p��*f=K`5�B�F*�v���,Q���nu�5~4����P�a�^��{$�|�V�y��1���t�~xZ�C����Tl֘��ʂiQ�.J(�
�L�
[�pB�RS��V$�g+�|�Z-P���
���R�>�%�#]z6m<3�-�z[��"y��6�x�H��,�Y�\@E)�a��"H�K�Ƶ�4[��d��%GU1B���2
���Ej��r���.�"� ���p
���*OX
1c�xd���������ǰ��	3*��}4UVl%TWOE^"#�B����'߱�����O��8�XJEk,I�r(R���+}�7LS�l���`dp��/��"t�l{/_˦�4!<�m
�;>��<���>�����M"άY]���-�2	������f��T@>fW�LOKm���4Z$Q�~� �-�kA�.Y��!ˑ��J�-
L�f,�С�O�� r^�,�,໳:��K=-#���!K
	=7�k�,�\�!;q�f(�%�4��Q���'�c)_���B�㧖@�KH��e��T�d�����62�M��>��+k�P�0�̗''���We��fo�=<e��'�^��z�ܚ�૨�9왠�CU��t�)׏H�x���P��Pd�<�1%5F%?0{�""�R�`��jZDhO�ڴs&c�{�%
<��]*����84f|g��̖@I���Dd�n\[���0�$/0E��kDM���0G�V?�󨚆�}{Ĩ�ڏo��c�y�ŀ�lDg4���}Ov����?j�s1
�����T��E"C�fm!V�;Ұ�!a�ɡ��5��Ր0|܎~Ws�h�)��m�b�	�jO�5����]����
�4/�J*�K-�
4HUMesw�P)�8@1R,��1\@،���g7
hYc�J.k�8�+l���]�,��1�tMWO��p�l?�Q�)�g%��i� ^�3�_��fd��<`ZM��b@g�8����b�i�'��k�l%�0"=��0�E�@���!)���Dd�<�m�u;a�aoxo�O7��t<ֶ}���}���:�����A��-Sf���U�DK�i��t`�B�sȲ���ֹ��|�����,.�H��66�*�
���;U��$��:T��z�ԏ�'����1Fi���<��LWl&W��������Q��Ĵ�[��vR�^m|��Td6��
�G?.�O�Q
{ k;\������]�
O�H��$AR�6k�b\�e�L5�U�Ib���sS��Ȩ���Jy`M(
8��r���]��zZ���h��KZ���j���Y���;Z^(��T7���X�I�f�mi6M���m�F8�ЖGՐ�yIi�$a�;���5�d�5λ{���.��O@Z�s{&qM{��
	U��R�ˋŢ��ϖ����Ĕg�����9H�.`�{m�n,��n�Ե�I�J�j�����[bT��
��s��D6�`��̋D �>����m��E?�@�
m�tg��QC�֝�ʂZ�:\�}�bk���dS�mVe�ggΖ�ke�&�H-���2w�rQi<�9m��F�-��?�A�H���U}�9\�8Ɍ���S��6�nb��7����i�&���a�9C�M�`�}H�J������oy�[�����/�WC��b���+�{�Rf���N2Р�	Km��h܋�=_*��f��К��J.���htUG.Ĭ�I�&�gl|�"�7���
U��<�������:�ܖZ��XE
z������C{��v��Y����J�j#�Ž&�� ������d�g��������D�M[|�2Y�c��m���S�Ǯ���\Q%�p$�oF��hwю�.2dOt�s�=�W��N}"!����r�if��g����xG�t�6�?{���������w6��9�>ivU[�
�ɽݟw��Tf�ֆ������4���dV��=�A]|Y =���B����(6��a�?�J_�q�����ħ�2���H޽Y�3BG"ʨl������K:^ma��z9�6�orauEg�O0��83��)�uҕRա<fđ{i!Sn��CsaNG׳�g7��U�)�8a_!��)�Tu~m�=��=gi��{�`w]��ܘ�]
P��_
�w������{�j߇�/JPFA,installation/template/flat/css/theme.min.cssT����Ymo�6��_�&(��"ٱkK(��Ű��v�)��S�@�q\!�}G��%Yv���'C�cQ��{y��ܼ}��z�>}��ۯ��)E�i�$UZH��ȑ�$+4J�D!�����*IJ4�Q�A�����dg�q3���0�|,�)YP�`‚�j,�F�E����_W��u�x����R��B�;�Ph�D!V\(t��q��Jg͕����7��T��\���ه�T*�k�$$,��9��l�[\�JN����@]H��c�_��\AA��ߙ�y�q���˱��Lh�B�TV�^��,F�ad���>�(�վ������yl'�Ph-����;![,�ge"r��N}o�{ͲBHMrp�S�Rcc4r�t4�����X�MN�U�[�Oj��-�9Jo8�s���P�<v���L�l|�-wy�ޛ�H�mk��k߅�ǁ���
'ᬷL$wbv� K;q6�y����9���p,`�����\���}g.g~$��J��"%W�1��0u��S�9�i�}7�߱�d���%ӝ�L�"[�
�}��4
Lº���:�7��Y�>�=vQE7�Mi�e�$���e).X�$k߅�����u���jВ�� 
��Ac���a�4���<!��HF�;Er��,i'l7����WIb�R����C���C��h�x)dX��L�l�0eqL� �H�H��
�JKkd�����ĻM&�����J�ǹad�MK�S䋋k�,i�X�h��T��`9�U�PM�E�<�?0V�4D�UJm�ձ:�L\��Sc�rp�ޞ��a����y�As]v�Ԅ����ȸ���
��,s�{���Ϲ�Ga�����K:��2U��sf�c;��H7s�-	7�ܩ�KC\6(�O{��i��l���A�ߺn���I��Ƅ�E�]�F�_u�P
Z��
h	�#�z�S
�2!Ai�_{`S񗝑����*^)Z/�8zǼ�LB_S�YKR��$l������F9+|�7@��%���G{���M�Ǟ�f��m���e;
Yk��q��� ��vB��mk�&�Z�=���V7�"0�ޮL��*׬���Ԑ��P3��{l¢�g�������Y�t4�O��Z1YS�ֈpS�"M��a��S5�I��6�2��.�ڽkH��	 �t�C���Ɠ��~�M�MƖ�H��D��n��Y,l#fҴ�U��z��-���Z�{���Y��Sc����P�����},��1x'k���D��x׊Ov�U�xn��g�oA>"u�	 _���A��rςl-X�~ڜ�
�A�<��N��Qxi%��ۦ,��3|�I��)�=�6�rXP�6\V�!���;�]G��b�������K�c��%�C���A��;�2��̹�m�%͹����i�6�$��!�aP�1��\�g?�p�N�]��(����%Og��A�*��t6%��wO��?YB렫{�u���x��k������8���;��W����Ǎ�K�����x�NG/��4�]33rUH��
w�9�g>x�#NI���T����%�3�?������l���������mr��X�DJ9)����JPFB-installation/template/flat/css/chosen.min.css	x(���Zm�۸��_���u`ٲl�z%�6ȡr��.헢�Qm�+�:�ڵc�d�P��MѢP���ș�p�y�go��۱�$��/$"�@b{�>��$ mG��kN��$D�8LR2���O�E��?c�L21A;!Rw6���CӀţ��	�(K�|��>�~ȣe,�AX�5�\D�.��Y�x��,Pb�ޱ��v'�]0F�=�[�c]2�����#
H���>3?b�,ƙ |��û�?��~���;��
���[��	(��-����F�2�0�HH�0NG�?~��ϟ���g���e)�(�xK2��L�OH��4T�a
'u6�+$H�F�e���9��M��V��)�uLYF���f�g�4���&̰`����L���,�m��4#�m����/ĝ/ҽg���
+��2e&n��Y1�bͺ���;"��ǒ���=M���x+a�3��#!g�I��X��	��s��b�$${�0�������y��h��`��QK��=O[��$t�l6�!���ŵ���?��Ξ�g:_��A����pv�(�q�D��R�R0hq'�F�^e~��S9�8P�j*N	�s�|Չ6?���g��)�	 ��Qep�����ij%8&��`�,xX�O>Ƙoib)��J=���@�;�h�x/;����8  �ǩ'�^X�<�v2�i�!��m{�`o������U��K�r*I�������0�VD6�u`_-��5v���iw�#hW�VY�lT>k`��Zq�^σ��晫�UH�
MJ���SZ�V.�}�I�Dn|_���,�(V�w���D��Wj�^>�q�	!�`wo6K���u14ד�4rN�"
$���I���Q��<5鴌��F�V�b�p:��T��Z�b��B���R�yH�J��®*(�'�lW!��<�s1�"�<�ϛ_��=�R`�{*F�KZ���z����yO����6��xy����5��yt7��T�0+���a�&�1��Na	�8I	�~�ܝ��f�զ4#kn�!YYͰA��Y�I��G�v�v۬�S�H��!�F�2��������;���"���72mѠ�ҡK'"c�M�Q,�������� Q��6*���Ʊ57��t���}d^e�*��P�>�d_����
�itp3�d�'N7
��0���Q&N���gͫHYQA:�[�bc+n\�W{�JXq6}�Q�?�ZV2p�A�Ȏ�xԵ�ҥ[��W#m �	���٘�N�6c�?�/�V�TԲ�3��J�<�]�E�B���,��]��f`b�=�nMse�`�Ę�s��,���P�cAZ���lSH#��J@D�
οk4K�}��>� JE&0���IŐ����U�P�����DM��>�q�;~�Hv�tP���^�,��v�j�����*�Qa�ds}]N�]��y���
�Y�T��بP����H|�^�����T6O�<	�7���(�b*3�BsZ��ș�t)�k�W�켬U�c���b��J����S���J�@oX�Rʶ��JY�n(��cW��ҐA��%v���$�74N8uB���0�u��?�j�z"���4��ULj����#��Z��ECe�2�+^�C��N#�|a���~eg_T�ݶ�-C[`-�������wNt������vC�?P�?�?6���VW���&�}M���������ϋE3���z)��J]��2��I6?�*azO������H���=�\b�Y��U�5g�
2U4@)��{������]��ٱ��K�������2����K�5�&P������t���w�t�~|�}��}G����^a��^z��u׵�k�����K	�ڻ�
�vn����M��=ZK|�c�),yg�ެh�:,4�*��5��WG�N�����k�kY�W
��̻@��8���"_Y?w����=��i(�N/E� ���":�"U߾)�_�E���g�Q�Vt��	�gV�#�fnq��d'Oe�":C��]�"ָ�0#��O��^s~��i��Bu��~�6����-�.�C���"m�����M�[��[k3��ny��.5x�������ż��u��sQ�tXmb���Z�jW_�Z�u�E�8pߊg��*�8��cR�XPp�5#����2��T^�>K�L�D��Ĺ��j<�,���jd%�̗�0��MWa���Nj�¢aoA�J��2}�¼$O{��� j�5�rl�“�<Y���t��~8|��"��0]���M-ҽyN�ΨU�~�7JPF@+installation/template/flat/css/dark.min.cssfH��͚�n�8��lrcg"�4�I��i��r1(���([YH��a�݇�R/�,Rv`�I�?���I�ׯ��}�؀��c���^��w�M�H���'8�[a	"ފڳ9
��Nw��:�>�`�9q �Z�o��+F<�;��vb쑛��c#�@���W�]L�>����q�L���K@(p �T4n���Ú^�-lg59�M|���gg�a-�+O\BЉJ�8�=)bM|�4�Z�vP��0�iGrZ"�Z�:k+h�g��HѴ��Մ-��+ӽwo�k#�V�,h۱Pi�ZQ�4*�SL51��fB��6���(�]SC�!tr�5��u�
[�'GL(!|>�14�<	��خ��˜8��!�P�{p]�Q�����*��`��˷G����W�U��7$�!��3~ƒ.v�[�q�BE�I�	ql������8HAO�C�l�k�,�hV���؂�ç�x�j��#�
�&��۵Ȯϒ�%�V���JK��yW�NO�N?�
�u�B
'w�n.�A�����麡2y�--!umw�f��@s�����P�T7�|�0ciƮ���clh�;=��1ڎOq�1���}�e�
u�n�1�k��϶fs�4o�HT���NJ |9~�+��06��m-�aw`
;ɻb<6�^)��r2'?�SDɀ�
k�L��F�)�5	��C:����E��TD�P�\$e�D2M��A~jlM���b��AS5��36:����
��Q���x�W�{�\.(T(�ta��B��$�hש<�f䁒:eB�8lh�$h�(�瀒:���6lh�0@���yZ�H�!���(/R�T2K�N�z���ŋ9�F�8���ؘ��s��
W��V�\�b	�9��b��$U�L(tgX���*ݦ�T�s��J���[���{���/�� Εc�v)%�
����p���S��r�Fp���.���54���s��6o��e�?GˑJ�)y�xcUld�
#��卉(�QϚ۷k�-"��?5��14t��G0�B�c�qe�i���a�nǔ���p]�L�����HE��X9��B{y�hݾ�������_�>}���������C��V��Y�+?���=y%��ݬi�`���	=S#��BR&���H^��R��a��S������0�i�q��׊�s�0��zӛ�][�E���PJalf�j�Oƨ�T��.}��ŤSJ�Q;\���	r���܍�D��[�S���/(��n�$B��q��~^��y!H�<Jľ����n��q�}V�b�
��K��w�8pC���pSʃ�*��}��M��Tڟ$U&%�I��xg�ǵr���۴説�K.�z��e��ꎆ�*�U$����������<�#:����#�C�W2PD�d��A
ύٚ��
�l3�bњʖ�˘=x���
�i[@�6�i��69C�!*5�`CՁ!	T�&H�N<H5T#�R�I@��<��9�s$��Hpϑ���@��#�|G�Q��H�:��t�h�4��q�� ��S�9=v#�ȣ6��͑�)�F���i^4F#�Ȣ3'�f�eԂ25"2J���@L�(�J�6�E)�r:�vإ��ȀK�h�)���p�c�,�CX��+
��ڀe�J͐��"
�H")�0�
�X�b��(��p�S�&GGLN��+y	@�	P���T�GT�#�ȈZX�,&R rR�Bp9$�L
H�t6�ݦ
���V����zd�I@���bv����DB���1��l-l��k-�.گ�JPF?*installation/template/flat/css/fef.min.css�I�	���}{s�ƕ�)�r�j�E�k�ک8�8Im�lś{�Vjj$�$"�PY�*'�ؒf4zL?�W��q�~�I�)_�v$�@��ģ�QvU��c�׿�}�u���?>����K����ۄt���c���ѿ#��۵kO|���P_�mc@j�Z��/]g�皃�_�ֽ^ӛ�F]o�ڷ��б��+�7{�s���r�Zc&�[~/���.�=F��o��ubװj�9��jߚ��C\���Z�5ǭY�O\���v���:��ֽH�b������4�%n�f��3w����aÿ�E|�7���E~3�L��oC
��#�[�U��}�>�?w,������b�]�����/]��Fȏ��K<ɣ9��X��N��G,�>�:�gs�d˴��lwz�O#-�l����F�����iyX;�|��FTFsl��ޤ���H�δc 
0Aj��
a�a�A��C��o��a#F�q�c��Yd@�јѱ�vn�}:b"�:No��O�T�!1�� z���w��p}����L��v
{�@:Ŵ}c]�CкL�1��&U0S"�֘����u����m���L���Mw�A��G�5�d�d42\��ؤG�l#�:���i}#?�6-���1�7:ЌL��>10�vskL��пu�&��Sæ�ϐ��l~i����Vݠ����L�P�m�b�äu�e��TfX�M{H\10�^i]��d��r4�i�����2�ځi�p����~�׶�,�hwr&f�Q-=-�x:LJ-Pf7����_�����}Qӳ�U�5s��o-�c����[��'t�s�Ȉ��Ű�_�Q�=��%uZGF
�#���b�k؃�=b��t>I�5V�Ũ���j��mE�/����En�O�2}E_##�݅|����Ճ�m?����`4�]�?��ȴ��KS��?]�7���t��,B��K-���n(��s�mZ�kK++
���3���3��]��_�Q�m)�ϐq6�x����|ӱM�?��lJ�0�D���.u��G��ئI�:�}�θ��ڳa�f�t'���X$$�L|߱e���#����	*C�BF�~g�ne�IP�[��}:���어�R�]õ�Z����N��ޤۥk&�`.*��8C�<�Qc��W�|�7�
�[X��9;�o��7&�v0���'�0��=��fκO��א,��M���wbv��E�;�&�` vD-�a��}�Z��b�m�G�3uǻ��\cϣW`�L�Ljp�t17�q���5]j?��Ҧ=��թ�+��ᦼ"��n��e�_�`�N^��_�t�5w���=���[g�?F�lxr�3>Q�$o.H�k�
IJ��!��� 	.�-I� |����4��w$I'c �����_ �(�`@��w����K�Fw@���p�8����W"�1���:���������[dž>����9������%���(TM��p�� �P�	$��s`�өӰ�j�#�ę�lj}�0*�C8)ktx�DLd�cڪ��z�'�xм���@���x�?E�P�F�x�EL�g�i'�}(�g@�s����M�0����a⻢�~tA��E�K�p�=ꋂ�/���;�P~_��zNw2��*�#���@`���ږc@v�h��\�T5q�@���&T�;pL�
@��}c�qM���`���
վi��h��EuE��fN�;cXo�E��?�mh�W�,�잀�:�+X8�HO�x� �Hg�S��̑1�FW�ʲ�1���D��A�ꃚ�]�������B��h��4�a���P��Gf�ڮCpظ+ZV����$A��5�a�4�f
��-~)�y�6v�X/����v|�O�Y�
�D�0��nã�8�ē�]UdPg��@�DŽ9_Tt���(�Ba���t�-�Zj=�k��܈�c���Y\�.D/nlB�DZ1�	�	q aA!ϧ0����5�;��Zt]�g:�0��ѹ�'��*zy.��<���璑�5Ds?��V�}qL���k�
D�:�c��Y4�=Ns��Q�ִ�U)Z���[�hhHj{A
G\�-Ȅ�e����!�
и�#�����w
Աh6{�ήM����QSB���۳�P�(Y��A��
�u/(z�l�����)&62�mq2���bk�q,� 1��b���GpR��B��7�C��kX�BDq��b�G��}�9��Y�q���	ԁ�q��=�\�y������@P�����N��JGo$��C^8�{�&�	��&��1ocxL�;�A<�������aO�G?O����_@���xFcz�eD�!E�HHS� R���R���Kw!���6�(�DT���P=�����QAg��ʖ~�&h0�BDI��sh`�<8�~�i�X��m9������>0\��<��Ur�h9�.�);�؆"*G��   �,;ք�l�y����|��]�8�5�M��4��u\��1>������1PO�;��4��aȚ�K^�8x��@��W8�n܋T� �e��ג�:;�7�W�X�}��Q�NrW�`�?��79�t�@�#�$�o�`�}����߰y�s�F���Dt𮀄Lƃh�����ǡ@��w<�Q���@b�U����h�ģ����h�`�@�B�1���~G�M����'��9��s�QW�o8�m�{��*4�1���=��*���h��;�b�a�gz�-���r��P�Ȩ��\p���.4U��Cx�R�i䔐8;��2��D�Sv��f�	�>�0����K��zyFĥ3Ԉ��[�Y]�wPp�O#���~����͈\�>-4�E�uߴ���c2���\>�p.�kv��i�j�˿�(�q�UM���p�� j����4��P_g�a�gy���cB���E�ƀv6б�<�����&����
��4R?� �ٽ���K8�);@����y�GAG�(��ƪ�
-O���Q��s1�P£��Q��|'���;Q7������GQ�"��w^�#���N`�I�k
��9�p�"F�9�&�y��]�{"��p(�$-��3�B���L�z��`v
������{�I	�؆��]��a���$�B������f��E���s
��1�OX�M��O0<��1<���b	 ��%
_�!ɯ& ��JJ�X�d?}�Ix_K�=d�?}J��L�M�.����OB@�w����8�����/����	0�w�K$a|7v��}$a|O3�>���_%R!���$1�_DZx4��w0R��D
g�#��x�(a�},�,zv�!���1�	��~%�%����?0	�'	8d��YI?������_a���/b
$�w�7*a�,�
ٝ~#��������)S�9���x�,�F��~��!���D����I44�=/�0��X\��$
���Q�0�١.��@2}���gwQ�D±�R��۰�vvK2r%��qS�����$F�w���m�O��S~�,��H��˟��J�_L$A"�g/C8	�K	<���U'�}%��Bg� 	c�<�þgo�zx��[Œ��-(�j�"��gq#	���\DIǭl0�y�n#���}��Q��=+�[�X���WL�~H�~-�$�q�����VI�C�ߋ(	��h(�~�G%�C��#�GL�������'L�q�ř�>��e=`�~uj���㳿�SHd�Y��C�}&O!�7�Y�}.�$�q�{���C��N�7�Y���c`���`$�}7�����s"J��
��?/�0���@����1+??@ƸYk�}�\��@	�Q2����O0,���h
<GqG�dax	:no��1dC��0	k�
.��B�_�H	�y"��~�$a����i)�
%�/&lCN��L�R���
 Ԕ<�[�#҃1���$}-�߆V���`ָ�;�V���Nb���7E*��ֆ��BD���ˏ��#ڱ���/!����l�� 	�{	0�+�$a��У��<��_�`���,~*�w P��EmO|�D�?�H	wܴ���C%��FΛ��@%�%�������9�����H3��Q�Oh�`�k#ዛ����0	�g	8|��L�9OM^<#%�q�y<t|�?`8�E�tC{�/�	�s	�
L^� 	cܲ
o�@�H�B�Iw6%]�P\x�Z�f��Pl��J��	����H	��d
�^�C8	o�FO,h�x �P��"n��|P��(�$ٌ��.�:n�[]�#%�?M����.^@Ɨ`�L���m寂h<�%�p���g	{[���oJ�̼�H�kBQ�����5nݺ`x���H��n����0�G�"���;_�q���
'�>47_�
��q���6�l����5
���!Qr_��J��g;�P���ޘ�n="�+�E�ޅ��_|$���\���`�X��'0R�7�{��S%�[�>�����/0R��D
�6=8L}����mi8a���[,�%���Q�DBܴ���_|!�$��@�|�#�s>�[Ծ3@cу���5nN��)@~pGDI8�4�`���0>�cQ�G P�7���
�0	k�V�B���@	s��^_04P�݇����q���$X���0R��
����"J���`p�nC���e�@�`��<�l�m��Ǒ�m�} Ǒ5���B48Y���>�;���82�%a��W8t��hT�?`���@b^�C�H���qP7�?� Xl��/x�6�:�1m��'104�>�Au���7b�z��79T���026��� �<p�62z�c�w(�<����� .t��^T,�4�Ãh/�wb��>�!���Q�V9|!�DN�F�����]��U#�?<�0PH��.×'Q���H�0�9X�����IZ����G�!mĻ�!��HI��.u�O�ލ��=�U��Ǒ�&�ۜD4cô��;��	�?�p,�n�Xt��sq(;���C��}ͦXP��A_lwx��Q��OoF�-������CAc�/���;=~�=�4�D�3��ß�PCx�����1U
<m�;�p���r z~b=/���bN��䀃�$�pp��q�c�� ��5��A��02�����	�V�O���i�
�a��I4'�oS�h�o"�5v����(�F;�̿�A�`���flA-�8��02|\��q��N� ��hR�'<9����Q���9���hÂ~�or,�wE���
��H��02�X�����߉#�X�0��<�k����[�����/�$��͂^A��|YH2!���|�2��c�]�~�@q���	Ih���˯`�$��'St�.���k0R��W�Ԇ��}�3*a]H�y-�&�����gR�ĵ�.4�Z��h�!�sQ��Ű�߈i�1x~�Ph�S��]h�d�B�!�D�o%���5����1�$��8�{z�''8�qrOH����K;�����N /�#))�B
�C�'�0RR�p
�B�GK�q2Ր�bhg�GKd�IH召5�u
�_�4�w�	L���Գ���s,���d�;��u�1��	sr���B��Y����/V��?'Ӱs��M��֦3���0�;]���0�4͏�ag���¸3��`�N��]���:�FJ�W!�>��IX���{pL]���=�^��/@�$��~3�0/ΰ� ��dԱ�[�~#q�g��}���5�����"%���t`��C���8�d�A~�&�.��sD�HP\��W��wi��hN��3�Dۂ�Ŷ�8�tv���y!	u��tt���P�D�a2ў1t ����c!�,&͞�Q��=��<�)T�g��cwC�>@��r6�8�BY�;���N�yBp��1�?p{��}�{�
�ǜ��Wx����xY����#�P�pt��`s��,�n:�/l��ɋ	z��I�
^���	��P���"�\������Ir���	��{�i"i���B]bYP�:��&��gB�O^�`�z�Q�Ql��QT=Z��,���p_�Q�)鞃���8p����I;8Ų�^��SGQL����e@{N<ms���^��.�����u��ף(����W�#��6��G���Qh�8�,O@�z?>`��j����.�C>m�)�qNjś��0
{���>�-"G=��
!����4���޷,�����r�#Do���[,�<�q�AǸ�\�\%�I�BE����Zg3��0v�5 ��|���A/Y�5m�����W�I�+�mvc�@����g�Fԕt˫�@�=�hˊVP�iJEf�d��P�`��NDǴFm!1o_0��@��w/�}��n3�F���#5yIН!m}���F�kr�dOD�Ӯ&�R˷����p��t�P�	�3�W�n�k���W��S�#����wN���Y��T��EH�d;�<�W���ҿ���-��L�]v�v�ۣ��8�~�S�:48�f�f��ˣ�@�@؜C!��c�]��>?ɬ6��feum+�M�Z���Ǿ3&v�)jP.-��Ԟ4�OE}����+Taᗗ�"�Ծ�ͥ��:�w���A�žh\~ܥ�i٣Tu���o9�>c�)��r��8�`Aj�Q�@I��Έf�EF��5���旐<�����g��f2���7��j�UZDZ0���h�3+L�Z];Ԗ��:�|_E��!�ק����JF�fmemVq�"�^\Oz�r���A��5|Zc���tkOf�R�2�j��
��o�J�6��&1������дz��R`Z)0�)0k)0�<f�;�w��
���OXK�?a��������t\���j�Z��.���Z�e��VqY���5\�.k
����Z�e���qY��T��.����*6:����o��V��S�f��
܁O��#�0�w����O�NP��5j#���̣HL`k��Vk���iy�1��J�����
��+�
I���'J�]�֛���S��v���f��t�*5��,��	�/��GH������]o�����̬֤?1�ʹͶ�M������*\�z���A`Zl�F',�*�U��#G^��œ�_ZH��r��
��D��%��l7g�Y��s��mE�4���F����`h[�5Xo2����ףZ��7�%��6��#�
Ξ1�v�,c-�r�qd��5{��V���ښޤ�f*i֌��D��ٌ|��7f�4��yհ�Ŷ�;ƨJ����5k2��u`i�_�����isy��(r��R��5�K���H��Y�иF�NuAK���o_��-}�I���C��F�4!�>�.��z|�1x�~�о�!�7۶?��k������Еr�%r�8n��RʽZ"���j �uN��78��ƚR���op�k�u�}�Y&9�3�j�2�����TK�Z&9�;77Ԓ��I��

�j�o���Q���4��P�\���54�s�^.=�W5�������r�����9O_/����jCS;�����z�ZCS;�����;�ޔ?4��ۧd��q	̒,����k��V��4��x�2��V�}�ʼ�[��p+�>ne������yP�Q�}@�ʼ�\���+�> re�D���ȕy�:�bW�}@�
�hR�}@�
��^���+�> z��D����z�B��W�}@�
�ȾS�}�j�@@j�cc}�:�ݫ]�V��O�z�>�~�\�$W>ɕOr�\�$W>ɕOr�\�$W>�|��������h=��Xӌ��}�ʼ�[��p+�>ne������y�2��V�}@}G���+�> re�D���ȕy�2�"W�}@���]���+�>�YH���+�> z��D����z�B��W�}@�
��^���+�> �N��Ы�>{E$�O�_�$W>ɕOr�\�$W>ɕOr�\�$W>ɕO��')�"�j����cM3Z��p+�>ne������y�2��V�}�ʼ�[���e�D���ȕy�2�"W�}@�ʼ�\�����> vu�Į��f!��D����z�B��W�}@�
��^���+�> z��D����;��@��<��\>��έ_�$W>ɕOr�\�$W>ɕOr�\�$W>ɕOR�O�[�:�2�x��P���,�~��4��U7 �n��9j�2G
�V���5�[��p+s�ne����Q��9jP�Q�A��5�\���+s� re�D��Q�ȕ9j�:G
bW�A�
5hR�A�
5�^���+t� z��D��Q��:j�BG
�W�A�
5Ⱦ��V^r�$����ʠ�2��+��ʠ�2��+��ʠ�2�y�����"�������r���Y�5��Ԕ��L��4J���u�^Uҷ���ĕS�)�h��V��:�>C×>GZ��W=�g��M�uF}���ERM5-�e�\�ʚ�^��(�6}E=�.[�׌=b�۞��;LE�h��ʕ#�g� �'�O�dL�{ҹ�7-ky֏�&�]�z��q��SG�Y�Ů{��.S/X���b7�H�#S��3���ۯA��_�y"�c�&֭}���~��?o�k�k�:{`�	<����!7����C�Y�r��7�${�=�c��r���)xh�>��Sֵu������s]�l�_�h
�
�j�6�Ws^���T���P��h�0������mUMk�jE3��P/N�*N���O�>�İne�����5��=:r	#�j���I�2��di6��cj��Dͭ��y��25C�!K+��4BD���B ɣ
���O-�
��
�%�<��g�j�݉�V7gN���4CPg
s��3�!�:_���i;1�<)����Ԑ�ȣ�$G�N丌/O?�5\��mPG�7��*ɟ���4�ԙ�\)�L�s'�ז�y�R�#O�Jh�8C>u$y�!��\�;O��&�.�<�o�hu[��V����4�Ե�L)�ZE3K��%%(�E�n��vq�|�H�C )حz�oL,?O�2��~�O��䯧 K���(�T��`�i�$Ir�?I�<��Wy��Tgȣ�8üC�Z�b��ƭD����'�M���B��g��c�]b���n

�Ԋ��B�v����ۯ{�3��A�(oF���O�X�f��d���3Z4Z�c��q�o���6��gŝ��K��s��5����8�B�}q����I��
�-����y�28q��FS�
��W{�$X6P���%�`����iM\��,Rԙ��,�-)(���"'F���L�΄	vj�GG��`�O��{cB�32�[@�z�i[�MBMD���ld�l��De�Ug;6��N\��;&ե���~�G��F�r}cdZ{�]{ʰ���Мm?it���|2z�����xl��|Y^z�R��7������a�YZ��v�ov���]Ӱ�=JU��k"m��٧�yd��4���L�4U�Ɖ�uVrP�Zt�KX��WL"��\�H|��7�':�J��x�����T�&�b����W���ӎJjU��rN��"u�Jː�[�OU������U&��]��z���t���LI�C��ԝ/]��]/7{���;���Nծ2�g�r��Uk<Gw�ͮ�-J�Z*�4u��Ö�*����(����+��e斕��*TnM��ڊd��ڃn�I;w��nk�TR�-0��^�h
�.h�v�k\�z)>iRH�Nj��^V��y�/E4tT �ܚB��
d�k�Y�۔�U��[J�u��qU���.sU�*�=�Y���I`z�9e�.�D��eݹ��]��|M��#^���kME'.�g��O١U;祗MYgW�?���R�aH���U�c���^%��`?Qz��=tv��e��"K���$���v�Z7�7�ݐ`Y�Nw�e-�$VVI�te
��nu��uoh�ݶi{į5kl�
��;�ך���Jsc�r����J7aɶP�NB��D!O�`�<q����Dq�C&ӹ�4z�շ����a�B�sц�Tj��M���U[�n>�n=:�+}�~e��U�4�>C"ኄ���JUu�P\�μ�"��ud�n_�
<S��_�\Cv�X�~��"��T�a��X��k��n�}����)I�I�OL�k�j�)��CLN]���MY������Fk��Qh�
��tم�T���rl��r�׼�Pr��B�J�.Ч$e&M<�ρ�B]v!C�)��j�9�.�e2�R��.˱=t#��c�R���'̤FF]�!�Y����
��E)t���Fd1�u7���*�U�"=uA5����\�4o���P���4*M�I�S�x�%�Ȃ.`r�P�M��N�n�/��^�Њu�y���#��T����|]9g���B�8\ I�(P I�-DA�H����b}K-�H�;ua)�.�Ǎ�zk�P�r�I-�H�.e1)�RW��[�9�^)��]�Q%kDO"��̚�4HL�,���v�B�C�gW d;�'�Ƽ�*�w-
-L�C[�	j+߼��%�a���4*K�I�!���Vx�Vt�a�F�-�O#�6��E�v�Z$)3i%�����ׂ۩E�l�QO��^M��r4a��(M���>�VL%��j�]4=�c� �\�K��%�T鶘�8�^���_Cntn�`~
�T=�v�I�HU�ř�mz{���R��Kzy�k�R��VxS�i����c���g���@4��!�~36���92�'ʤ#�����dPƠ�~�l*�H
((U��JǗQy�H3�2e����s���ƷӍcF�]�������P<��pS����뾂�Cl�������ȫ�?�ζ��?�R�z�%�v;�g�}�T�ԗ
�K���~���.OJ͞�ʧ�Թ�f����*5�j�+��*5�¶����]:z���G�b��m�L���3xS�xT�� eS<<d�U��f���fT��,��hX�*�ܚR7�d�UZk�#�X�AA��P�>|Iѐ��4����U�k��������6)�ZK�ǚ���j��H#�J�?�ۯ�`�=e�h���JlRSѐS+�;SKR�i$�:�%�\[�����k���3}�@��9T�Z�(�>����*i�I'IE;N'�p�L'FE_�$)l҉)���3�$�Ծ�F�ğ{P��]t�Tn���6iD)
��"��F���,J}�&��Rk���MQe5sq����
�T��Ɓ���ۭ��E���f+Z��2�i�����滁�Ʒk��J����q^��.�u�ǯԱE�|�4p�/N8܏�˧'�Tǟ
�)�ul�Lv�q|A�hX�L��K�u�w}�'��h�I���qz{7}�m���k���v���j�_eԈ�ꭳ?y�Y[euƺF�o��W�V��c��qL�~��e���tx��	�B
�4���r�юJq!�����#���2�nj����G�E�Q�����
�a�
����%�����w����gԚlo{i2�>Э����m«�31�;�֩���왤$�<�/Y�D�q�w�r�M���Mm4�_��A�?�=ȓŋ�?.��/zt1���ų�3�A���9��6��9X�3�*j��|���e��;}x�"~�"6<�;�R��G��8����v�!�nw�۷�g{ь��º����U9π?�`�4{�DA�'$���|�k_y���|�����w����|��~�߷����	0����ǺGB�*�l)�|��5{[�u����0�j2���ȴG��k���w����1�!&�e�m'��79�EC.*�.M�\j.����B]g��5��Ri��S����r�+w�<���'�Fy�b�ÒV^�|e��j nh�S����r�+w����Z~�S����r�+w����ĥQ�z1�a�+/G�2pG�[o �}�(o���䅕�#_�#�m4�`L�mS����r�+w���r'l��(�<,ya���W�Hy7-Ke%7��X��vr��e!�,�fC�
����Q��Q��s6��V���
�h��*,���x�C�Z�C+�u�鋫�L�C����
�ZA�M_\�ez�~h�
����@���UX���N����
�!ZA?M_\�ez"�h�
��3��F���UX�?������
�$ZA�M_\�ez%�h�
��c��L���UX�o��Ήv���N��	��x �L�D����x'zA�M_\�ez':��ZC/�Rt5���R�Cb"zC/���4}q���w��z�D/蝠鋫�L�D�}���N��	���
��Nt�;��z�D/蝠鋫�L�D�}���N��	���
��Nt�;�7z�D/蝠鋫�L�D�}���N��	���
��Nt�;�o4Z��VA�M_X�yr������l�2z'�`�^��I��RX�|,�Dn��dlo!�gW��ذ� ����m��\��63�5�X��ٳ%K��:��$)�3tD�ez��3t��^G�K��M,�[�A��1@
.uL&�����f�hv��p��1Y�&�'��f#!��sr�T�4+r��%�O��5�[��ȴ��K����a{K�_�L{�I��Ԟ�����E�^�ey�)2pH�{�\Z^���q|gi���!��5�wM�Z�(��}�ic+:�c�6��͑1 �u����N��	�0�a��V���c��m�ӳN��y����R�C�;���cO.��ĹD��#��iR�؅#�L���yE��w��y3�X�)R���#�̢��R~S���/�6��S3�����iZC�d1 �9���j�Kx9C��*B2-k
���V�$KyRT_����!O=͒�QgO�䬫�Da���,�3DY˶��D�i��R�d���ܱ��`t������	��k&����5��)s��m@5��Me�;C��``����:q�}�Ҁ�EnjN������fp�@!]�
zA,�iq���l�-��[j@�C��x-q柄�%$]��=�U�e��%��3�4���ٙeE��q�WZԘ9�UE!,Cyx�Df9���oNY#�	�9�1�~�2Ǵt}v.z���3��6��7�6uÛ[���.���������5�=�˼g�]&~�ѓw
���BwIƗU��s����d���r���w��>SW3��#u�s3��\Nv�Ү7��UK2vuU
�X�|�&{T�x���K�
j
�VRg�ٓ��W_�4e�Wx�NiU&�WRk������k�J#��"rU#�jz!���Lv�e.��1�&��Wm(B�Z|>R_��<?��x��^b��:(�%)�~/\������r�B�
^��XŒo��ʀR���Uep�8��?�+�<�~����g=�v��̃���=[S(#�/�w�~�L�R���=E���e��e�a�b*	���1.^�dR���\��6���%ւ
5q8[���KA07|k,(�\��G�E�|j�}Z�t��Y���bn�W
�f<`���ֹ=U��|�T��5��`!H�����k#v���Մ�
��~X*�
���S|?|
��B������l�>�@F8�e|����^h)Gt�[���U�s��S����X����]UEO�H�-3�Nj���J����&=U�-Mz��Pz���4�6�CVi�+�t~�E=2��P���=�ܝhF�<�ۿ��	\`q�%CAE����I�E�<!�ZNC�H��&���u��(�Q2��!OT�>~����sm8�]��~I�R�b5�]�(E���b�N�wʵ��3O|䥪�;&��q<&�!��i�^�؊��W�m:o&-����+prfOX��V��z_�V�
$.X�����<殚��h	!��')ܒ�p�����[�J��b��i��Й��E�z��ZZ�]���b2��X;�VB
	˄����k.��b5Z��ԅM��x���E˘Z��@t��̥�@�c��f!���Ϡ6��g��CjI�*y�d��xM����qS�8ǖ��`�W|��|���
�Ԏ��
s俘��
�n��ɦX�R^%j78��Jw4rr�?
�5��{����?����6�
U�O���:n)52�ʑ��YZ!�n�^���.�v�𫽇P��D���6����2�\4��rJ.I��26���R�":��K���S��?�
M�S~���V�����J+sfNtt��|�p���f�2�6����4�>5�ALI6ќ�4�h.�<�(��I(�6Jh*a�0 ��ʚ�R�1*�J*�4%[I�Qzqʶ�2�5���/P�R�F�t ��Pŭ����J��RK6;f���(܌{V��΍V��6���,�9}i��\By�S)�P���T�r�u_LVݕ59'��ch�TziJ��
���m9ehkJ�_�
,�L�N�@TE��[N��}̐�J-��RfǗG�gע;2j����U�Ce)+�[&4�B;��;#~�z���`��NNW5�O��M��7�u�c�淪7� �3M�����Տ�-CY���%~w��1�^��sΖ��>

�]VTJe��j�7)�TvE,m9و�t��������*�Te%�(m9���>n ���ܪ��1IUVr�Җ�
�u��j镼ZY%c�����-'Q%�6�J���*�Te%�(m9و*y���"����+�dLR������d#���F镼QY%c�����-'Q%o4���Jެ��1IUVr�Җ����77J���U2&��J�Q�r�U�VN�*�7��`�*���(oI��""͆��_�F�.E��ľb�/����Ҫ���*��K���7��H*���(*�Ҫ�$q0��i��V~(L�.�����/I4L��a�jC+? �UCEUZ՗$&��A1m���Ӫ����*��K�И�����i�E�PQ�V�%��i|�L�hh�ȴ�bd��J���D�4>L�m6��eZu�2TT�U}Ibe,�n4��ezu�2TT�U���%��Z�l��G���e��J���D�t>Z�k
���b��Ѳ<�-)\U�
�)h�U]]�UiU_�h��G��VC/?Z�W-CEUZ՗$Z���2}���-ӫ����*��K-�h����ˏ���E�PQ�V�%���|�L_o��G���e��J���D�t>Z�o4��ezu�2TT�U}I�e:-�7z��2��h*�Ҫ�$�2����7��e��e��*�:OyK�wF��h�-���T�O/�^*�TlzyeW������T�����|��d�QSY��I/cz����?<%SmX%�{�4�BeNS�ʙ_�)��-�o��[��]���?r�2��XT���E$z�\��������
LJ�µ��ZI�(,�"��JT�_p�mǶ��N��^�+�.S�)�b����L���2*w����]�W|R!��VQ���*���BY��bv�P8Xk�q��0t\��
�������+��ˎ]h���u��Ȯ�Э����=�0,s`�M��������CJ�3[���"W2)�TA�Pr��l��*��g���e�\�i�UP��\ZN
N�y� ��qe����^�WN~��=�g�0ҏ�k������xe��Xtj�_|25�6��q�Zs������?[�?�ae�M�
�������d�ع�5��K�\A[R��j���5�|���-E�.V���ۆT��Xa&�稴R�߭$��q�[a&�#��R��$��q�k\a&�_��R�Q�$��q��\a&ޛ��R슮$��q�O]a&��Y�RW��#���ײf��6�":�<���Y��V�BVͣP���H,"@��(�,8����i����@0rc}s|��a�j�K1ZSo]�(���(���U��*Dy��\-�*Dy��
Q^�(�B�W!ʫ�U��*D�?3DyQ���(���qz���rq4���.1/�O��졒��
�go��& |���a��	\�F��-JK���"]�΄®S��sv]�Y��a�f�K�
�+��.Ż��]��VQ�jtPz�Ԟ�/RU7�ᡴ��yh�H��J.��X+nZA����u����qnߺ�}� �siY+�h��VcJ�U���C푥f�����*�RXˊ�V�H����۲�=�ip���vQ�3�/��J���og����h����IJ³ɷn>ZQL5��
��4Pv�*�BU��M��1�}{
����bQ��^���2e��֧*G%��*�DA�,7;�i���N��@�Ie�@�˽�JX�HpY���e���P�`py���>s �bm���cB
#d:����q��#A.!�TN4��[P΂"�i?��I��R����J7���i�Zw�q�:�x�~��n3Av���?[ǥ	��v�s,�W{��e��$`��hvY��^&	���n�f�pbK@������~0�|��x��`�q�[1������lj��2|s�̑,_R���iYӫ/m�&[�V�������Th`��VV�1<%�g?z�n�~����nkU��]õM{�o=�b��iM\C��z��RL�k��۟׿ѡ�r⓭(��M4A�
.,�k��i���&��ua��Ț��_kn�i����,�6�hv��#�����ǡ���>�6��
q���Vt/k��A&�F�"��+O�[��=�m��8�)MI3�5��'��6��g}Z�~��B��p�焰ę���D)�`�3����R�<�gޠ��آ�%μ�'J��K���8�(��zyt
K��U3�(��FyK���-�(��fy�
K��-(�(�ō��\׋�6�*�0qW��!�Nhzu#hl�Z�ATS6�j�0��
-�@�)I5~(�Z
-�`�)M5~8�VZ�US6�j����5�����lT�aU[ohVM�Ȫ�C����2����U�Wm���`�\�,�w'�G���cRW����#�#��k/=I��#�k�K�K���tkOR{x2���8���oҿ~�Z�kп}���Sԡ\Z��?�4�	������=�>���3�I�gu��#
�O���]���|��#�{c�.��EV�ʦ/
^Dt�C�¹
ibNko��I��0��5�Et�Pt�6�W{`��y��Y���Ų�:�F�WQ��,��􏃟/͞���X��������w�"��|l%/���4~ќ�Zo�b��o9���v�N��oa0�&�A+T�ѹ0���9mWة���
gʳDܦ�z�ӏ��s^���c���/�2fHYI��ZJ0���F;_���wL��X~\/
���}��>_h�O%`6���%�s*9�_ME�/X�fWR!�V�dL�ڍ�^�}�
�%�Ã=�T��YV�5Gc�
۟ p�R�1���~����x6�cyޚ��A�4-��k��ac�����d�*ɻ6��j�S��2f�D�`���3����
�����gÃ�![A�gٍ�P?j_�h��:㞳;3��­�oo��J�L7���lEü��RF�&�]R|�3����n/�X����H,{��pl�Y��ף2I[q��.6�A���LݤIn�ך�&`O�dV
�[��+��<�G"5=�T�5��.�H��dw�1�5���
_���uohP�t�]�0���QL�l�wIg����e�۳��b�d��ӧ�N6=֌�
�H�q�@{�F��qP�S5���V�20u�#�X�ʹҝ����n8�uk�ہ�;�]���,%x���5���^oltI�C�]B����|k��P�,Jmc�c���e긁� a�"�ތ���I�E�H(��Ϻ���Ea&�2s����P>��
<xIw	�Y�X{��l�y�:�I�g��uC���Z����}�I�)��w׻7J�Fu�Ы׽�aY�Q������ ����)M[�= K��%{�e��{R�Z;|_�Y���&��^2q��)
��|�
�@	Ҳ��+8i7r;�}�:<o�#�L?� �ocKJ� Ҽ�Y�\7r�)�:a�*V5��d}fǷ�ic�C�8VrƊm.�g�y�S��O��Ҍ�؏�K�h�~���k�"d���K�f62��.h�,��������nA�UΘw��'x���ᐹ�����wX��U䔛^��37�. �-i0�Ԡ��˻�I���6�V����2��� ����bjK�W\�f�f�7��A��8�؋��i��}>:�K��iTr�����o�C�us���2�@�˸��J�
-��ڣO�E^ʭ�L֬�O�|��i3�7�p*C~��f�-���#�j�vɓ�xL��w��o�LS�gX�]�Pr��y+#c\{��/�JPF@+installation/template/flat/js/system.min.js��3���Zms�6��_!#S�<Q�tmo:�Y�c���8���ι�H�-��IȎ���]�_e;mһ��`�x��b����*�D�Ľ�b���7�yG��R�G�s�<�{Þj#ӌ�U����MGU�ޮ�n��$��;<�"�fz(,�-z���œ��Q�K�\d+�vgW���4KD��f��Ɏ�U�~�YŌ�a�YI�.8w�yC��ӹ�N�w�߮s����Q+� �Valj�У�.�nN�S�/D����O�V��͋	!�R��e��_������P�q$ϲ$;�Q�Ro1��]&�Fϰ�s��gV��ū(*��P٭�����x�����m�1dCR>
i�gPQ)��^�`�F��o-Ud4�#)�ܹ��:�;ȋ�h�W�2?$��)�rA�;���lX⭖<���g�<�]yBt@za���E�p�4_|uIL;��X�,tW��F+N��u�\f��a6�\�U$��TmW�8t��T�͆�a��'���%���2�~��t�bK!j�P�]g����g�ϧ�3ft��]���:E�l�δ���g�߽|�P��-˻��K������"Ϻ
��O�w�/ɶ%�*E���C��غ���FRS7�3�:�u��v��a��w_�r׼�S�q$�ls�o3H���E�����u�m�iD�����7a�a
3��cF�y̅C�����2�����Я�Ԝ��3�s�j�6�:`(��4�⯱'�b�s��j��G,���:s�B)��領�ۂN����6�>���}c���Z��
+��&l]Z归��|�0ng|���y�A5�	�u��BA><�i1��	�?�����	�3����q�Y��C�b���<��Ǩ����M2�@�G��L����ʃ}׼o/j���9��f�q'�#�����ce�CG�0]��!1;��8�	ʪt�9�"[K��ߞ�B^rn��B���+��Ra�������f�{tCLVb��ωx�x07���O8�b �;��Ωw��VW�Xo��)��Tɔ��uF
�|'淽S�+�D�o��c��8r;�G���S��G�9��E?��󒊹�%}0�O�?L5\Q�@�;��*rs���	y}����Y�-�_-IcXi��B��Ą[ysj���
�0e�-���x_����9�C���].�
�ڢ{��V����H͉��-�3��	l -��Gsݕ}��^�eJ�\�s�l9��2׶��l�?FT̀/��<�c�Ix[���dc�4������u��Y+�#�C�@dI|/�`=���âI.���w�{o�\��,�
'�,�b�7n
QCL�^����a��<�{�)[��\M����o�m/��
�zz-�>x�>B�Y��㶀rm�lV
�x�7�;���A]<�Xvڹ��G���� &��b`T����1�j�	�&�	m#����֩�l/t�W@�4cPH� �׈^W��U�ē�v::��%}z�#bS^��^�*����W��O���x�J�� l�2$�Z~,b�6KĜ~����֢�-���Ǎ�����ƀӇ�"��~�-�;�oȵ�B�+F��Qm6W��0�ip��ɚ.�K��h�U�_0m���dv�v�㚛́�����*�,h�#���x`�-LQt�E+�k�Ζ10K�`�Uƭ�n~R�~D�ױ7#E([�1f���$a�3���`0iW���#u#~�1��ڂ�n��x{��\��i�����njf���&l^PK*����N��&bIe�\"����)��6PaVg��62N,��6�e�L����2����nYq��T6yo7��t��IDd+Lt�����y�Л��4�r�,צi�c���N�?�6kOY�N���愨�{D("��oBO�mjsyF@��ĸO���IS��)�(�a�J���}�S�<k|E!�Ka�
����%VPM�*4(�vBc�GE����g7����@�/XV�-`Y�&��dP�k�aI*7mK�`π����E�ȩJ���ܪ��A���%�ɴ��k�/��<�9�	�Oy��^s=!�
�[P�MS;�+綞�k\^ ����`�n狀r��j��ѥ)��S1ラ酝g^����e��!���K�"��h9ĕX�`<wr+�dv�[���-�i�J�<����(�[��3�*+�k�J"`iZ�v�L�ϓۧ�s��RcZ�R���l뒟$�
Ke�q#b�޼]��Ά/�O�_�F.��q}O�_�<{A.���<_��[gX#�֥��ZH�Z�ZA�0��U��"�߰�s#V��L@��
�e%ֲ&�D�p�0�]<�Y��X��<\Wx�<\PL�P܃a�b��l^�٤͋�.�h/���UɎ��'�B�.
ǯ;/�T���vw���D�n��4��㊉�/I��vD,�}���F7��g6��y��5T�ԙ��*��
�v��n���������o�EI�}�^cQ֭�Y@au^����MH��G�R��s��_�4�<��v�q#f�:f��'�>��ܳ��i�=1P�Un)Y	��Me7�V��CN8�r]T�]��r����U�4\�''�:���U\�K�WSpeW^�S��S�; P{�>Y�"Y�B�w4y��V2;O��%���*L?$;E�J����
&
�И9��^���}���A�ĴE�"���	EN�b�P����F�wn�ZM<f�-���ʳ2�r��L��KAU�Pe�GP�2jȼV���KyJ/�CH,˝O�ԩV=��1m�y��`��3Z��������]�}Dq��x�<�qSi[{:n�����M���n2C?��#���+�A��⃱�Ф�h����6&CO�t�Ǥ��	�r�����osL��t��rB�
�0C��nF{a�$
S�hKj�v��Z�G��
�	�f�d0o�/W��u��4P`j��Ve�����6�����g��zs�;�,�W�h?MXU�~�B�'���/�=M�xK
�R����v&�Ӥ�}��o�
�u�(I�`;��u]�ŵ��Z̫�
��Li�0S"v:���F����#a뤖|���m����ph��t-8#P3��Q
2����<C��:<���Sz�uܲ�/���
�Ԃ,Y�x�qpY�>�%�=#ȡ\Gy�	�*=�fyJ *q7���������7Ծl�����w�O,��m-0{���*�w>e,c�b��ۛ��������27�ƚ-�<d$�&n��(�o"���� ��/OT�P@���!�U��=J=��=��]�Cݔ���l��ip|ۦ�R�k1�ib<���ڶvx�<D�Q�ʧ���&�vUE�Az���--pQ
n��|̚et�~ɳ�æ�hF��<�Ƴ�4?�����L�!Җj�m�x�
$U��LW��4�
���>�8҂돕}���4:䢛>�x����Mhy�B@;<\���x
฻�j��$�Ν�7j���.��7_���}&}����iy��Lz*���^Gꇌ��
,�KZ�^��+ǹ:�ly��Z��ZT������E�w[�oEX�~�9ȇ�O�0x���|���"���kʏ�)���L���s��
pW<-š�L��6a��==-�v)۶���/���d�y�%�`9pDw�"�Un/i�oJPF>)installation/template/flat/js/menu.min.jsyQ��e��N1��)�FB��x�pQ��TM�h�**`֞M�8��?IW�w�7���Ϝ�w�S_p�!j��HV�ni���|Q�(7�"��Z�~�z��P�
fӏ�&���
�\;��r�����]2.@���*��d��x�{�����f���|����`$_\��^[��<q���/�I����c�_ɷd�����KVƜZbu�]ɒU�iK�	!�Г� �Qb���+w2B&���ɔK��L�dHF����f�!���*������Q��tY$G�滌X���L�l��{[[Z!y�>��
O�I|�,�Xմ<�W:��:C�X���qm�1/U>
����o�ڮ��b�;�b_�JPFG2installation/template/flat/js/chosen.jquery.min.js�q���=iw�F���WP�y2`A���x)A|���m|�سy�$�$["b��d���U}�O�̱��&�guuu��:y9x��RN�W�׃� �E�������߫��i�}V?�������?�3R6$,�vٌNN��v��&��d�Z.�u2���L�jzr�5-�O~�|����7�|���oW�ͫ2���z��$n�<.SYE�sM�U]�ּ�M��x
I��w�{R�M��ĵ�_�4е]�
@Z6m���U���۪q�|��U�,+
4��*�I	���Y�dYWm�>-IJ��q����q�@�dҬ���L�J�7�"k�?��
��Oga�*k�P��j���I^�ɗt��eV7d�^�l$R�DI6�O�jN���?|�����C��i�`�w�=I��K�u֐0�)p���Z-��H�0h�h�S��ڜ�^��qWg�r�*H
R޵uM�r�,�笮�'����У�a\dSR�ڄ~�m�~��1�=T�|0�g���פ
�y�dӂ̡��ϊ�iHE�ba�]��
`9OC �����Dֳ�<?k���2�����b�*c$
1[$ɨ���zh�7�s~�n]�׷W���۴�K;�UQ�ɸ���IJ���h����Ȧ�!+V��3FXF�x����eI��?����R�YK�K|��`�hƍ���<&��0z���*]�7���~&���K�D����_�O��
��v�f{��1i+�X�a�ZMRN�L��G�%�g�VHϵd!�T[�mb�aV�d)�0��6'�<%�jR�
�w�VCw`2+����"+��C_�J�u���d�˪
	#A�Pz�*�|Yp^�A��
6}C�ɜ�fP8A:
#��s��CT��!q�����(�&�| ��Y���d�'�F϶�L��J1����$��Ö�D���a����&�X�+���;��G���W����Z5dh��f9pYU��������(�,�E�`�)M�b��HU�K�`�>��2��~^OO(B�2�0E�8i`���ΰ��IX�����Pi���;]
o�׽
(�<<�>��3�IC�z���@֢|k�Z��C�0}��k�-�d��"o'�U=��>���z�S36!��I�zc`�J�b�
N��>�Q٭��4�}�����Q�����5@�5��%�2�p"8����b��,o�2o��!)��rA�Ş>��M�t �e�΂Ʊt_[c�f��B��2���3��L`iV��d�� �%t&�zwx��
�o��S���w��)���?^~���7��w�|w��l�(�0M�䔻�N��I�"����.��[Hu7�^S����H�M��tՒ0�gmv{7#ȷHpsEt�!F���S,U�MkeG%f;����.�)�9!�{L����=��f�-	Sh�&�.�˪�^��.�.+I8V��*ܲ����r=�v�\��.�Y��Di0Χ��������Epd#J��'Sl�p�?t���CJP}��ҍ��Q
�=�}F9�G��媅m��
`|�G�X�\$�#���ߓjՆ}Z��4J�&�9���S�2�6�hȠwV]ke�g�Z�X��
<X�Wt�׉SS}]Y��ph��2��m2**�צ;�]Ӄ8���>������	�xA��a\S�Rex楁Y��`�5`^�7q���"�S���U�s;5|Jw�4{�����ys�G;n�ۼnZ�H�FMҝs��+�9�f>�(̤�B
HuD��k���ԭD�Y	ַ���k{&N7�ܛ3Ij\]����B��s?�����>^�(~*�~|�ׄ�;v(��H�o�!D�n��h�*�E�ҙ��x�:1��=�o�뱲�,��&�DOr2#�%o
�� �a��3S��\�e��bT�:�R^�][2Ȏ)����R�����S^*s�s���~Ky�p:��t$�Qx����괅�
�?ᠵ�Qr�~1���"mS���c+�l�̈́�o��f�Z�%�Ue��>w�v>4>
�-0���ۉo�֝/$4�3�όB�P��գ�
�| Rw��0�|�*!J�Y@:�4lz�C{N�Z`�(�ڛH2�q��"�% ~�/�^��ҽ#mup��#+c���P�@��O�r��'��s���>�ޣ_P�E<�'q��y��o��m�R�Ʉ���`c."J�@E�������yF/��I|}���v�ܜ�����άAjrG��p�r�.z"?/�r$�:-0�1�2��[���:�al}5�5caݷn���f�P��%x��\9��D�3{�����af�pB#9�ѐ�
P�5t�,#�}`����p��N�WyǦo�Y���`HY�0v�\��`.�vC�y�JX�Jo�4`�9��sϏD�(^v�J��,�_�}F�]f\CM7w�2۟��N-C���6̍5Ќ�H^�/&秇�+cv޹`�g�*M.:~.`5�����V0	Uo>��0��������6����|&7�S�����v܎��u����Qp���y�;��T��� ؂��#�Xx���o�(ȃ�q'wo��i���Y��g�5*+$	�Bf����А�]��h��*�	s�Sp�We��g��(�
�_�:jڅ�E'��՘�)v|�RPwP쇞�q�g[A� �s�Q
����n��4nx�24�Ȕ�>��>�'4�'��}6��H4�92o}���q���>��6�-B��+@�_���p>�$�鳋Q�
Ƈ�b��D�x��aW�l�,%�MK�����)���@�a�G:�#��H����_:�b�4��ϯ���g��O_�D�B	�m�X����j�?��P��6���+��oo�E(��	gBa���$��F�μ���Ǡrm�pQ�:���l�C�x˿�ϯ�竑 A���u�F�ȹL���-�U����I�W�`R��Cm����tk>��v���x�tl�,Qr{���uG��K`��=ƃ��;���+���D
�Poo�%���<�Д!��Y��٢i������Ʉ�A�z�i1e�����?ׄ�Ճ+��9�i�|�v����;#�L�Jb�F��ɤ��搝�U6+�G��y��C�t�D��ӱP4��u��{����4�xq��HU��\X��řApq]��2+/^Yѽ��'��� /Χ�:?���I���c�y]-����UC�q69�U����4F8�Vm5��4�"��N�D&��*�����pc�6R�Q�����%��"�|�R~�uR-(
��a����:{w旣I��j;du�(�nd��/��]Uj�sj����ٕ�go]�6��USݶ�K�����UT5�1�
/�I�=�wY[�xѓ<�V|y*�E�jt���j�^��I��Ǭq�����A�h�>�|��٭����|�v��m�η���vl���p��ߔ@7�<y��
(�rf5��G*��{2x�dY;�d۬�-Նz@�����Xh�l����"�S�ܖ`!��d�gF�#I+�JēK�����KIxD�_�Y��e�|!��ѫ��9A5�	�N���5�f�T��f�.���+�Б�<�Fz���:ᣁ����͆z�T����*F�%���:A�SnO�4_L[��R��QC�$���J��J�/�Vu����w.�ES�j7&"��tJ(*�^I^-��@��̚���R����F� ������!�Z�]�n�.t�%�b<+}h�`��Y�12-�i�Jq>��0���
:�O׏ԑ?	�O$E�9���6'Aܘ�L���V�/#!�r�t��{_SEG��h�0�*�n[R��(0��L��n��Q�-Q%kĒ
�l��v�D����hv\�!�{�6�Z�Iq�E�(��]ݮP��Dۀ��h��<�i*�D��wF�<��Z�p-oɽ{�DӯHz"�Ȼ�l��j!���ԪFϞ���m��8o���5g#�5��ܣRØ����o �UAgS&B�m�$�N��XDN��Oݖ)$,��B80��:h6��()�;
O���v����/C�DŽ�y.tf��٨;d��V{�7d����;��۷X�����uPЁw�㗰	��j����&�v�o/��^ٳ��'㌜�d��ҕ���|"����ދ`ۦ���f�޹f|�16�-Hռ����]r�CӸ��cka�݆�O������b�v�a��>L���a�%�j�;LdE��͖���=�V��ꌦ)�?�3�I�p������fH���E�1gg}̋����J47p/��A���	{Ko\f�K��c�A�iowK��	+N����]H�v"�_���F��|z����J�=�2C�M�K�v�'��#���$,��5�.�OC��Mp<��C���e�j&�u���V���,h�GBa���aj�1���\���g�z�Y�OO�P�4�vf���ᡢ�aUc$�h4M�7��)	P€��;v�5|k�e��1�Y s��n�|�c{�rel��4��J/L�@H��,���:t,H[9#�Ε��r���`9s;�4����4=�Ǔ?�O4F�>��ͷ���&��5�&����ؖ�#PJӣ�:��ˬx�[��I�2�E��s�>6+��a-^90;��I�r����qkA`^������T�ay�_o��N�Pτ�z�ܚ�tY>k�/����8�A"]��hv>�緸e��i�,3�/|A�����e����Sh\��?F�"��|��:`D&�.uj�Ly6�d=�6<�Ҥ*ӥմ�+���D�4Xd�/���ص��6"�ܪ>����/�H���J��BԄ�T�0���xY�4t�a�ʃH��c�=(��;��&Қx�\��Խ�1��:��ߗœ��N�� ?.+�C7���O�;�){��?����������I|�.ʝ̫.��c��J~�Af1���޺˕-U�Hx���t)i���Ͼ|O�G�ז��N]MY�i~T�ڥ/�e���x��LXn�1h͑{$�pE�u����I�R��q~1��a�Xo���:�gl�N�u����8�-K; �~�wٚ�g"Q�؃���z@�s#)w찏�('����o���c�.x�ՙy��\�N_�9�d^�s���b9HB6Wl577�M$ɳ��{�j֎7������nk�����ɳѧvF���z�ChJ���� ���C!�>ǧ6Uin!b���y]ׂM�	�惡-q���
�3S�4Ϥ|�+�I_�<m����M�p��N8��ڮ8�]�x��4:}�yw�f�0�p`�cu����p��I�N�s$X5�	��n����12�θ4�p+�FN?Kb��Bi�ui��.~K��l��B��E��kv�UU�PU����G~�ؚ��jqz�o�<�bc8Ε{�a�ٿ�	&s�t�`����
�|_��%��/]��r�t_c�{�aN�������Lj�/p�$�?�ҽl�ǣ"�"/?�1�����0P:�;%�A�EM��Mzr8@�A��ק�����x�C�M��^���2�Y!��O�{a�
�"�Lc/�f�m2��徢��f:�	�wgӈ�LL��G=�.e��[�U_��J�/�V�j����p�p�h3��w�׾t��GL�Ml�?/ّ*Ƚ>�tZ+���ȟWt]�4·�̆�jVǽL�G�/v��<#��c���L����oD9ޛ�"{p����σ��u��?������-J]�x���y_�L�I��'y¯��.�+hG�R�5��[�r۪��F������a,�v�jgX���?�G�Ϟ����w�
*"���x�.ya*��q����h"�.{G<W��u2��r�HCFw�-�*<uU����.�Cg��2*�A��1�����$~��X6��bR�Ы0ި>g��,�V��"[�k7�ݎ��� P�s��h���T?���M/.-�N��][���m4%t8v���9v7n�j���	6�x�$W���H��%b�ڨO�#���|O3#1�oq��*;S�������穠�Vc����/ՠBERS2��nF*&�?�_�0	Ӡ���x^�"��g�ou"��J�ij�U9n�J@ɍP������z�����40�]Er���'8����!�=Bϊǔ@����rܳ�#5YL���$^z�kE�UY���KD�³D�{Vh�����.��'��š�0L?���bƚ-���BVX׿��ć�%2R�D�0n�L1��U�k����
6�,�¾?/���:^�u�r��d$?�T�S@4��	K�Ê4�u�mc�l����.=� ����*���ܶ��t8.���j�����|"!��|\f32
�p�Gɪ�*�2���z3�W|j���E�ُ�f�y�?������:+��XIZ�_p.�^�6��Y}Uҿuc'=��R�������:�b�_e��㴚?�"�)ᗉ�����Dw�u��&#?�x������۬]$�yiƘi��lP�}�p&M�Yf�߫{�a�.��6��cc3c�I��OR���JPF>)installation/template/flat/js/tabs.min.jsy������n�0E��
�1Vh7Yt�h�:AQ'
ddAQ�,�
I�0l�{G��ݢ�B䐺s��h|��9@*ɕ5ڃ�p!X;'�����J5�Br�q�L��UQz)F�'����O�/�m�JSKG~r�2z�Lk��82~I3�
ԕ�z���r
���]����`����Kj���`Y��,��ć�f��&"��Ad�G;�A^iȨ¯Z09y��sc�R�aE�i�.���[c<ZHKR1Iү�נ_&�h�4W��#��|L�ؖ%�;E/S�N���<:����~+�4�{?g�M�Ȍ�О?w`W�P���^bjɒ�	~��
�CC��a0�3��h-S�)��xZeq-(��W���1�w�Rz�o�=j���MD� �NGs��#h�Zgl��VZ4:����%Qa�q�e��g��@ET�4�����;[��e�z�K�m�v"��(K��=���=�!N�(���w���p�֕�(A�>%`��L�1)I�I�r^J�k��i��UT�0�3-�'���	K�a5��#o�G�n1�ǜ S�������q�b�Gɞ��~�$`�e��ݭ��v�(/*F�а$7�s0��,�xV�VzU��$=NB��Oę�*��m[���L��JPFB-installation/template/flat/js/dropdown.min.js����T�o�6~�_�p@ ֪��r[�&E�4�6�)�E�~�4�QT����,�r��w<~w��w������\�+�l�� ���$W�Wl2!�7R-d	��
��kV�.�@�����//���M�*gdK��Ȼ��U��ג�>�u�`j����o���`�KC>w9^����|� �uJ�'F���Cm�{�d�'���f��G��<}�����"�p9�d��RU���s�(:���T���џ�KO@�9���[���t�T��1�N!��pǶ�O��; �%��{�Ḁ��Ql]���{~n;cЁ���a�qޘAh��%�f%�K���N$c)u�WP�$�m��*���b��F����Ձ_�#3�B5q08zDy���=D��m�C�<�'+���8}hRy@=
q�e\g���Ωҳ9�����FU�.4��	�F��k�;��a���lh4%��Zy?������(�����w�-�H2>�s�Cx&M��c�4��ρhޅ��0��FH5@��N��v~�!�Z�m_�m�[�P�+���v�b!�^��U�f
?�
~E��15L(KsA���R�rH�ʬ���[VI��>��S�w�!�|�ӈ��(�%�bwL��&�(J�nj�!rn��Cl��3!�k�^�d���9�+�tG����	Η#>�[/~�����g�H�h��7��i�ֹ(NR�WE�MO����,J�Aک꼏[��������i�z�g��#룴��>e=�c����o�&m9��~"�뼂��i�����k�߇l)��JPFA,installation/template/flat/js/tooltip.min.js�����Vmo�6��_�r�a�4�n߬0Ydh�����%�$ڲ(H�[���Qo�l9v�}�xw�=��;��7J'��:���!�{ƒ�"�8�,L����e��rTք��h�y��t<����0e Fg7��uX�V�b;�
�<�N0_'�ɖ>bsΛ��7K3m�5���M�t�V#�L$*��$��pV"�>�f�Wd_���J��Q���=b�/�?��.p�9����{~N�q�qz:��K���7��f8��%<����g*����h��M���◮�,�$4���cgc�������c�G>ݖ5�VJ�׹�Rޯ 1�=$�aLd��9�dd?	:y��{+l2t
*��cPV�P��$�+�tgϝ� W�4����vŚ	��֘LyK#b���8e>=.X�PL}N2F���R1)LL�s��\w�v���IO~�b��6�2��#�k�K.��\`ޘ��0p��C_j�:���X'{�
�0���	�T2�`�}y|�L�)$�.R�Id�2X�fl{P�vVň�ԗ[�	fW#b�p\��a�T�87���rO��S����D��lx�e~��YYW����v�^���Nƞ�b������dw=�L��<m�^
\�<��|@���O4螼y��.	{�$�)�'BȔ<��Y��Bob͉k{][hc���b$9d�V΄�o�
` �*!�\!�Aaȿ�e��7r}u���U�G'���F���lٵ[9jպ��4�}��xҙ��D�ߐ��%��n�K��O�����|�'3�P}��LJͭ��2wh���r��۵n�[��R��c�X�	r�8H����ك����EC�p�T��g&Ww����0u���J+9h,&n��[/�s����U
.L�S��E��l�VN��޼���!D8�6s������Hv��y-R\�%M�l�շ_�*	���>q�D�ͥ�WƏ����C��S����s��3�&�A�i�[I�����>F�G���t��v��A��㈶0�#g��n2RTi��b�y:G�KpҐ�g�X�fZ�,W]_
�� m��s񫻭r)�\�P���N�q�\�4���[ɫv/�ڎ��H�ў�u��d�[��p����M��i@�j[ec�� �:��?g�x�zuq�� ��̇G�ؑ}z��=`��Y�"�JPF<'installation/template/flat/js/jquery.js��i��ͽk{�F�.�}�
�f���d�(�c'�$v&vV���<	J�I�@K���ު�F�"dz�>�9��4�~��{�<���]R��;�e|z�?��ѓ��SEO���_�lWi����bL�
_�yqu�NIV&�qr��|W,�o��6ͮ����H�ۤ�xo����eT�'�
����Q�
�F��6�WG�ʣd���M�U*��u���Kz�.�=>R���l����c��*Z�yFEԒ���Z]�C�~�+zJ�er�j�6�z\寫������:._�d��6)�;�.ڎ��F]F�NI�+��,�9��2�0��E�A�F'��h>�������x\,��2K���z�'c�*u�\��\�7��ϳ��b��_~yq�t2�[�(�K�F����.n.~�σ�����?��0�?�G'�e�̿��㋓�9�������|��o���
��1�|�P����^�8����k��z�]\\�\�����w��e<Z=}9���P��щ7�y��l���W�.ٯ�u���z��|��+�+�j�)G'�yt2����%U_�/@E����Y\&>�WN������r��;�G_�e�dI��{�<^zQD�;��f�N����H����*�����ԥ��5�[�@p߭~ꣂM�.i$���W�<˳
i�|���Wjp��?;�Q�!չL�xq͙|/ϸ?%����������V.]	u��4�o���1��^�e�UtTJZ�E���N����)g4U�Y��I`�:-��|~h������4�>�Y�.O+B��7��d'�Uu=:�o��<�x:ÖQ�:��×��6YЂ�A�����8�d�}6��L}z)��8e�ű3>?���sT�}͢�(�\q��.��l23Z�MR\%>ꡗm\��Wo���K��:1��e��=��
-�s
��Sa�� P��URV�����8-�]�i����dQQ���,�e�~if���y0�~�7U\UTHqʙ�"NL��*��X'���w/���y������ԗ�o{<N��(����N7%��*��d��A�o��VQ���e�N0�Q��&kRϔ�(f*���Ƃ�1I0-�Q�ť�cڢ�WtV[��G�h01O8؛�m�(�;_��7�B�Sҝp���$t��;�頪����v=^��5w���	]0en��t8x�Ǻ.?'�4s�&s��d~P��^-�6*ř�"w7N��z�\H��~�PUcy̋�*!����1��YA�A�R��TT��M
�M�}���Q|S?4�v����Ќ��4W|�x	WiQVU��F����{�L���3��:�,&C��(�4����<�W�ٔ�p����lN�B�7=��إ[��\��fO��"XM���'��ٳ+��w�#�@6T�Te^T��1~U��5�+?�E|�[i�
u��̳��"_,*U��	��kG�`�'�nG`]'��^D��3@K�2��I�՗NI����NMeO��<h��~�.e��%���E;����0킳���l7�-h���;-��σ$�VE��$�T�{��i_�圖r� �&���p��ʥ��T0�*�Mw��4d4�u�4�Tih�$��]˃]3�>�	OY�;��r��#��K�O;:���%��kI����;4>�?Ą`���|�����
�5��Lz�	-FB�&�h����3
��eN�f�I�&�$���u�����T2@��ǍJ�'X'z/�䇴��s5��r	��Jh�/�<0o��Ž`��V�%8`Z����I�t�h*}D!�`����}O1�tJ�@�z~���3��J���p>�xI�H=E�1~�3N�%a��|��и�E4���.z^�9�@ɝ	0��l#�.	�`�b����:g��QI]f���~_�&d�0=�ӳ�����B�����t/p��j8�<�yy���D��%j�;�\�
@���.hy	��N��_l��]�����TR��~�нQ������"�9�鼢n����kj`PS΢�u7Rn��0����=�x
۞����&/�8U��r��<�Z��]�^~Y�W���$�bJ��p�������hF��h*��1��^�zYԽq���BL���&��ivH��}���R�P	0�u�H����^`_�*o�~�<����<�7o��5d���ٻx�.�x0���3���Bf�I�ZfB/�Y̬��8ɘ(�oQѾi��M�0����=a����K��n�hۂ�<�.�K~�ט�M�(�2_Uc�!���@qy�-"�y
����Ϡ���i��ʐtB�G�ۄ�f��F��wo⫗�&�=�h��F�,Bk1e2��Aey�u1-���e����6��
w5�v����zQ��ʁߔ��PYs���X�uq
&G8M�Uy�r�l�����\&d?�.�߱��3Q _�7��P�L�!T���	s�4�G�h�[E�������u��|�	Ӌ��4��S���КY+���%����χ���R:�U����n{'e���*Y�.v�I<��{.E�ߙ{��ۓ2��A��~��B���fV+l
H���[2��H���ݙ<
��^J'3"$	��Փu۴;k_��_re����h�-]�M'D0}W�D��UT��Yq��e���٪��cɂ'
F�4I����e���ުy4a�V��\&E=��{j;?˩mZ��pe�|~�{�n�/z��|��/w�6A
Z���H�a~s� "�Y��P�-5�rZ�2R&9�"
i��ãJd�>=��C+d�?n-�<S�Faq�>=XLww��5�sKv�B�n�T�.�{���hwЎJT��,%�v�=c�9�(G��Nt�2���4���oW�H��:M����!!$auP�b��e��jc�Vh]��"�g�F�
FKt�}N�o��.��׾Sѫ���`�d��C�m�Q*�1�`j�E#���O�Te��ȩ_���dz�R�{+�Bi��%���U�r�������S�SP��9ѹ���G���4A�0ƅw�e������ �b��7ܨȽ�bHC�<Y2�,	s|Xf�G\�9���n�dݼ�����L��YA+��h�[�<��k�xUN`����Wi,%H�]�����ͣؗ�tHsn��$��3�\}�9S�O'��!�9蟁����Is$�υ�8z�0�H�#������q�]r���HnB!{<fx�ڼO�3o&��jH����%��f��f!&�=g	Q��$�tp����Шt�M����3�\�C�7Ұs��</rt*��@��ͼ�D����_ֽ��n||k2z���N7
Մ�|!II���r��N�e�x[6�sIԃ\�����5O�f�lT;\��h��	'�	4�gWP
�&�{�
d$��r���
�{oW/�����,�b7����R��dtxrY��Wٗ F@uЁ̑�v���k]����_���tU�`�M�p;^�e|IXӛ�=nh�fL7Ϭ�(�
Ͻ��3�w!W
~RA��.K�ќm!���N��Xk��� #>`7�$�E��i=�a!\S��5�J�����Öށ4�a�oo-��b�^��4�n���i��|i�P�LO��9���F*�x4
F�@��u�ڡ�p�v�����X,}#������fZG�n�v�`wP����*�T���
�kC�޺�,a�e?
X	Y��hFɢ*1տ>!*�/�$�DЬ����ۥ
��1���nǦ��)���Az�Pg�2��M�#���<͢�������n�	H �n�.��BAF������CV].˫tuG��!��,[eM�9�PoKC��"����)#z*^��weϷT�e�,��]�3��u���Y�R-jpn���Zr�$�r��2j�ҳ
�m���������^��R�3-Ψ�3wy0MڒBˆ�c�;�#��!�Ǫ@��C�ϛs�kLA�v����8G�CPg>(��.��nT0e��~�,��t�D�������>&"R�4����|zp�8���ӟ�9�3ЁR��;��53,޼���/�J�E�j���_���33F$�SO�
{P7��i�G��R
B�7�~���R���O��I�����\u!l�G��-�<?�v���(*���t먁p4J���!5B:m	�`�4\q~ʤP��6�qmϊ���DG�5~$�Sྙ#S�kP]rb��>%�����v�Q�ʝ�T��n�j�y+�fc�Z��Z�%�KMֽ�L�y�\�	�Z�q���[��7�`+QjI�3�=@D���g�4{{r�Y�}~�ى�����d}ttv��f�]u�"�����e~��ɹG˶|��<���^&�����P̀��^v�)�%֔� A�g:�������[��.�a�wk:ce�J���l�\��,�Ƌ�Ж���T�kg�C��b˱�qE$����*)�p~!�Vp�-M�*�W�C]�ϖ�����uR��J5��au�R<��v"�f�;��3`ΰ�/�b�/C�$f����h-̼��<jk����E�2N�3ל�x?���S<~�w��4�kFµ�BJ�*����`�Yo:�����5��,��w���k�)L���!���|L��E;�J]�޳ׯO��m\	�b����{B5�nc�;C"����g��ӌ#�W��$Y�_�w����5o(�--EпNq�!�fߥW�\	u�u�;���w$n��d�m^�,��3�)M��֪���3��F����w�-�s�����!�=Z�jkv�5A�qc��;����玺لU��8��:g�<Lt��w���ש���*��\?���ϵ�^k��ӡ�e�kV�ҝ�QY�S��O1z`�*�y��׈���4ޠq%��^�l(�ٖm�Ԃ���r��!8��B�Y*Ed5�@WGiv_�.7)oBa��iE�.S�s�Cкx��
W2U�l5�>�]�)	�Y0�d���J�r���'�s}.5�!pU@���:�F�B�{#:^���E<L5�G�y��0t�+�.ۈ����!�d89��Y��˼X&�D�ёٮ��皒oG%���i�l��=��&�|�V}�x��~�0�nO��@T־�l�o�%�6Ϯ�>���1�%!3�fg�$'g���_�?�/eF���Z� ��>bА��K�#K~����E��s�WK\z{l�V��@�#_�hgų�֪`[�DV�S��;R�.�I��++���q�����,��	��=�~�n!站�:z*��ܸ�>i��>�!��m���>V2�P}]�I�2�^x�-�-�"�����S);]�M�U	�w/5��u�q����w3�K�Pg��M���2�<#���+���T�1��^|�O[�3��[����L�y�z_�>j�^s��h����p'�i,)a)��~��
���y�.-��L����̾d�5���}�Q�qg�,�猷�ׂ#4�)�_|�1k�ʬ����Aw�w��b��Nt��F��x���8AX"YTF�Ì9MU_��؄��6K��/���y����s�0{:�'LzjA÷F��,oU�W1T��-�Ks�ҽѕ��$�h=�$2��0Q+zKf�<ğ�c6[Yog+z����xIM���)k�	V��/�#��m��r�pEWT@�����~��
�+�:4�hz���c֫�AK(�r}���7�lo��8	��#�J�����o�#y�m��3L�V1�U�8^�$a�9cʈ�V��ȴB��]������Rw��(vVlGo�̮�<��X;V�F�"�ΦH�G��Q���iUFP�u�3�?kD�oV�CV�+VJ��\9�@��2���Ѥ��Y1���gլ��2�Ϧ�ؤ�Q��ܨ�X��rv4ꑌڵ>���<��l$�1���&�ߗ���ڼS�^�*}����.�q��=Q��vȪ8�7�Z[�����'WL�d9:�'�K"|	���z�u�.��O�׳�����/��|tz�X�����k��'�|��ǟ~2���B��2��ON���kf�~�Q���`@����.�u6����w#�z��ks~'�y��N���/T�䭏LG���p��x�|�̹V�<B����f"Z>i��*J	[��Y؀��ÿoϋ��c��@�ʤZ�_t.�(^�I���N�uQ�yp9�E�)��\��%tc�8wȴ��pq��7* �Y�RcL�U8�6`A�b����ZL��"��@o'x1����Q꨻��K2MY̩��
�O���m`AW�|��%�L��X9����}�W{���o��
2z6tː��Z]��U���X���%�OM
m��e�*ӟ+o����{�y�Qk��AW���)��e��C�B4��4�0���:,�����f B�Ҫ��,�*�=�2LQ�rՖ�{�Q��>
G�(�:��֍"�8X�
��9Ȍ��_��v�.i��Y���0G�Y�����E<���
�tZa��3My6�0J�
��|�M���%(Q�N�/� T-��M)Qf�-�P��<[J�8j����p��FB0����]��(��!٦�x�I6��@L�uF��m#��n~5��4�X��eh�2:}����K�9�Z�[/V���{QZxX��&Ra�R�f�盟D)�stw��Ly��׬�E��EM̪�uq�BS���I�1�CB�x�9l]P􎛻CC$�ה��$�5���l�����?����;j��ٽ������XU
ز=b�k�U
rt�*hUe�)��<F���������GH���[��rW��fC:+�������Z�05Vt���>��*��uǴQI��`)&�N%�Š��3	0*���dWk��|W��]�!�P�����E�1G�>:�(�Ł��"��$&.�xO�S�g{A�hN�O�=��;��MR4}oL�xW����'0�l3�׵���~���Y���z�5Ѧ��n]��{��-%A�2��w����9�rA��_���o��jb�%cTw�����h�C��.�s�l�{���<m�ah	
�Ǒ�u�a]B�?�ҷ��'�Lo�H��N7�F�Qe.���
�y�=��yWǢV/gԻyԺ�����1�Й�K(%�����o�ٳ�v�`��TdYՑ1��!�4tK��Z)3�!�u5��̡��nꝂ@:	C�S�Q�5d"�6��g��`r^��U�rqj�F�|��m,��^���J0{���j{��;�����K�
�k�*�G�~Q�u�@�5�\�*��Zw����({�Z]mn�ڤgI�zI�6K���H,l�q��S�(�<T�g�)�c�L�(��G�Y�9�Q�%���SD�����3g�=gys��|�.kgf"�i6�Tꗚ��~��~����[�Q��&�^a��Z޽��fT=�h�3�UF�V���L�Y#4�q������$�w��-\����!�N�aM�8>�jV��U� ��iKS3�`�}��ș�;�ju��ɪPlO4�8������>�xuu�\�pes�s7:Ǝ�u��7j�5q����w������y�{���gK��v�Pֲ[EM#7`0�n��~�=���ۃ+�:,�����s�YȢo���<�5��{p`��y��"����L��{Q.��n���f�I�.+��"]�ɒ6
ip���Mz�^�v4��Z�ť�_`��N�q#���l��d.̖��N��iX8��y:-CJ��n��[K$�n� �-���!u�h^�^������}��Rp?V�Բ%��*��9�����e&%��t�@N��۫:������bLr�{�l���%���̪v���kV�t�+̝$��� ��Ȉ�Z�h��u���[n�1ܩyy�=>��rw|�_��?v�5�XV��Y���H�5?~r��˚G�iO�SNj��ߴ�`�{�"��j��i�7�#�R�W��
h���=�"����N�k9��20�0
��An��
���gn�
�Ȁ�A�0g�
���N8�;
+1�0��`��3Q(
s��z2�8>��}K�C�ҘOpq�y�̊9���%���gT2�������=�X�w�����^���T�����C7-��gY��GI��^%�G:o��?�T�Ɨ|�=��񔡷C��`��t�B�KzR"p�BW+z�j�+���GO-��*�P\���Z^�Qi�/��� ��"u �����גB��+�{�M���j��_>��e=�d���Shվ�	^��v<M���J�%J���r��{s�:�~-��s�]�s����Q�@!m�,C5�S/y�5����zf�x���^}���E�1�+�N�����>��~�A�M��$�m�ߣV�\�Bqaߥz����}�?>��Tf-
?<��Mhw~��*|t��S-��B08��Jȇ��W�YN/���Ũ��:6�Ņ��~߹�4�xp!�;� l
���z� �v������7���0|q|�B�r���_88�Xx���Qo�ҥ��f�f���	
���0.U=:g�
Yd�=]�U��V���P��V���˺��Ƞ��6e|�6�Q�E��#-+�{w�YVV�djC$m�6�7���zm��&�T�5�U���GKI�x�v�`.�#�W��Mc>&��l�AdQ��������;��L=�!��� �஫���[���S���q7�h�R�0Q��k�`���҆�#�t}DEfH����رu�n؁�$�����)ZSL֭*+�6�����ա��n͞���'�m�"�rF���؇���2�<cV�.6V���xx�������fLa�j��������h~�����_�w���qIŤA'�c�r��G�����o��UU�w����N�	��=[t��L�Ц"����\�
���i��x��]ُ��0��Z�$�j#�I�o�;ɧЏ`�{������Q[%\U�l��Q]�+�Q!`��LJ����q�\'�6����IQ1�h��з�A�<DF�4P�.z'�c���+x�+z�*�~�zv�F�.�a�,Y��0��6��r�#4�A!jc�՘:�ql�J�"8�ő����ð4�y=e��	Ǐ�l=�"W�]�jCt���\jӊ�c<��ݷ�L����׳+�|��t��Wt���c��L��W�u �P�W*���:�D�0Wz�B�Uɂծ�c�Ab�L�t�,�n����Q�̘��P1�܌�ӌGzPZ��hG����O\��=�w����hw[����x���\�"3�Ġ�����)!�M���!oH9��[�A;�M�l2�����fB$?�|�^���
�jBU���[24䕓��	Lδ�~��(e�ƹÕj^Zu���'A-��c�᳻1G�I~����{:�v�Wv�/�+�������ྻ[�f���{w�R873S���8>�=����8��z��������●�G�XF���r[��n�_
`�ha� [���.�O����{~l�<�
�3���Ǟ8����V���-�j�шv�l�y�YA{����=�R��bI=��gS�Zm����P�r h��9����&���[f9�sZ*9���:���jW�oщ��4����d��i
���,B꿾�Tm�?���
@UcSetD�ov�8�}s6o(��*Jq��
��ԑ-�W�}�i`x5��I�U-��ؗ�6ѕ�&uc5�6��,1p
���kؕE��8NT����꺑ǖW<-�Hט��' r`��N�9�����EG�PD{G�ƄU��~��1JY3R)D�
�K�̯o������9�G}�D��1ƀn5ʞ�b*˺�֕Y���Q6��5˼^�,�����l}�J�p���l���}�E�oe�ir�߯tU�1�x��ҪP�׳%X��~cvӽ��8���*�n���	���Ӆ\1�2��M���ۧͤؼ�K(�\��g�5�+UD�h
�U���:�Y�e�o���<P��eآ��|�~�UZ���JfK���,�;�lֻ9�f��qa3mj���AOe0S�����)��&�]��
Xk���H�xe�:|�2�+W�3Vu]+�S����bT�����Uz�w����8�Y��/��-�11{�k;����
7'���i�x��2?�}����|^�L�}i��V��Rk���d�$��j�8K�c���z�7͉N����f�,SSo�>�qA%;�w�uD%_���ݐp�+o�Q�﷧;���\H��~��>z���j��Ā]{��Q��)q��j�x0%,+�d������ޮf:2��wg�D}X�G��]^\��r�|j���}�U뀷^�/\�Ө�v��&D}󥐣��5;k����Xj19V��!4&��6(��/���J
AJ0#.E.��|�ё�J!8��"
�r��I������j��Vvn̖ȴ��,B�xw۱�r�#�J�UA=g0�4��T��p�Yi�U�Ĉ���5պg�\aT��6��R*x�J払���~��g�Wi��!Q�$���Q�K?b�S�R-�b��m��]},���n3[�~t��U���.��4�+�u���a"º2��uE��.���������G��X�S����(F�TpG�{Ug`4��ǣ*�$��x�=zGx	�/���f�:��T/��"���3�}�?<����y�Ƴ/7̳�O�媱�|Z?��X�B�J���K�_B�䇦m�Ҵ��:Z�F/鑘���:"���:*E�d?�ߟ��\����9�`0� ����Yk�i#Ņ�(��E�vO�L�wK�
2C,�.Q�κ����Jvu�u����m$L���2N.7a�����Ԩ�M�mT�ﭺ�<�;�p�8���x��;'1�9G�Ŭz�:��H{�Blw��q9=
��ߏ�O��p"�H_��=�P����`+`�1���'��K�%���<q��X�e��zM,B��.\��Q�mSۦ��x��%�'��^�؊�Q��T���m}`c��G�i��wP`d�o��3cPX�vT}��4O�\Bwp��d�]��k�"@@���N�o����d��J��f�nx9�7#c��U���s���u
bT���ᬘ��~�d�A�_��N�e/
�G?�����D�A^�m�kolW�L�B����i#��A�QUg���i�3���iƏB35²"C��`�4"�J��.<�:zgcL�N&05��	�����Mn�n!)Y�mc�rɷ�ř�U�W�.@��*���ʳ�t#�y�*�L���
.<�ytC�v�KS}ē���B��.�z��.��C��V*�P�]�%l.v�j�0�NO�#��Ҫ�8UoPK
�Y`^r#Dlw�\}s�vL���)FGD���h�q��=~�s[x�����]b�����-�~�7�p���T�S�z?�Zw0Gm���� 0�N�]��uDb:�>�B#�^�-髲�D�̬t�J�{��VO���w�{t�����&�Sl]����|M��J��na�k<ՙ;����@��mq9�u�`���FOBB��f�0��6C���˥��<���ѣ�;�����:k�@��lvW[�1ol�J�v���=3�VA�Hϔ���VK:仝1s��o2���&��P�
��`���~����BK�A�$Eu'�b⫸�cr2��D�Ly�����뮬tMKw5�s����^�ކN�f�
`��,B��=�!h$��T��sF�Gs��ʸ��U�k�|���m
Z�8��K��#�x��;��9��~��!�^ρ�y
X}�}��[�
R���7�M�:��!;Ȃ��ރ�'�6B��j^M���k.V!�,�#4�K����ϝ�΢U�B�&����}#C��5`z�
��v� ��
�F
�!��l�OF#��
�Tٌ�e���wcs�:��G�J��5Y,c?��kO�Z���:�5�
�r8O��X�����e�e�O�舳�!������u���ubS�ԍ�愌�%�2b�ofp�4�%eKk����E�������.����B	�e��CV
ڌ��t�
�9��ɦ��.��HfÑ�Lki��{C�SXR5C]�R���63��}D��4�F�A�D&̚&�rkh�����)y��� Į�����/���]�)�*�=f�5��DZ�̻�R��i�u��ij.��EUM�Ii<�_�3����pGm��S���k}z����h�w�-��Ra��>�����ӒT��W����N�����S7`i�8�|Iw�3��6�
��B~^��Sk}�~�N?���S�������ک��﮼V���c�7�@�q��$��L��м@�"N�Qs�#��/�7���}2���..�����b5�ԗ���hrP���|?��2N&#�O��S��/k7Pq�ݹ�S������O��S�F�����2����ˡ�i�
?7���o�u�?�w<���+*���Iq���"/ԕrA��zZ��8���v4�������1B���h�������m��Z*%�ь@7�Q��c%?��E���]����-�)�]�~tK��<���G�/��6�Of���맯_�_��c��|��� s�9չ�s�7O�Z���6x- ��͛�B������_|����H#y�Ջ��^�>{�a��{���g�5����|����W#&}d������Vg6�m���A��7�����3�����R(C�
����aY�a�\���:+]�{����YS�Ӣ?�f?S���4�ޙ�P>�Q�'�li��|xqQ>�J��~� ��]�m#:�4,���R�h�����;iGI'?__,�����ɕ�gtr�:��~�ȣ#�8h}��S)h���.��h�t��T����9ݏ�Z5����&�ް���O?�������V!B0K�L��=�r@?r� ��O���}v~~:Q����'�������tw���o‚�i��Ƽ�@b�j�V�k�Q��:@�@��\"�1��&�����r<��[�H�O�Y�F�����WK��4�?q��T|�~�	KfVmD-/
��Lgv˼�W�Ŵ����8��
e�V`?���+�mk�4�2�u��k�0D��vD�Ux%�-�\���~MJVs$���;��ԍJOŞ����֘�������F��$�5G)bs��_����r",|~����~��
nG�q
k��&ʪ"��
��>;0i�uۥ�q=P��o��7{bu@�2A��>9n�N��� ��q�|e�7��ݳ��N�������Nn���o%�?��Y����Ut�6Q��E�8D��:�Bn@������~�P�Z��u�ӫheoȿ+†{n�S^u�`oF�7�z͏�d��SٍF/������m"cN4��h���ZYWa#� v�s_���kM�=��wf&�^�����u��G~8%����2?(>p�Y>�QY�I|tF"�i�$h�fK�M=�(h��lZ��pSK��,_��Rx��8@������2��D>�����b���Wr ^���
�و g�%d#�������cP�x0:��44Y��i��4";>p�ى~�on�:������;�u`m�E��魸G�S����N�k��#qy�|��Pt�}d#T$�-��^b��N\(�aʢ���?�#9
�t�x���!]���G��0�%`pΡ1�V��sEEˤ�>g>7]�+'4G�2kvW�'ѿ5��1>��NLsHx�/G�x���}�����W_�:�y��~�^0!�$��U�K��W'8I���Sڔ���L�C0�?��x�+hmW��HN?��ح�9S?e����-����$�fX6XZ'��H�>:ꋂ�/fsĂ���vk��IE(�������ǖ�ck��؊�����B��ڥG�S���M��j���6+�a�kn���T��t��v������I�y�s�L�sܴ��z�td���V����~����PYf�>�ܷ5��q&�]Y�S�3f�/"���}h�"q�	!�n��(Qe�7ګ�<jt�_�P�rŦ����ro���
x�i#j��Cnxq�vd� |@*��O`��z3Shno��^�29�����眖����l�8[Ѽ�v��m����j����{��F�՘�QJ�?yh���������Gv�ޅ���;�d�!_������o_o-�UxK�LI5~z,�M�v�Ii�c�l��h%þl���M7U"�|�{�6e+;�5�o�Ը�i򱶜?��T �~��L4��J�oy�;,��u��=��+�z��a�+�Y��J���DMH�i��/
OrӤ�ȇ�[5����"ƿ>�.s(p[R3۫i�>A�����������1.���\N�r�EM�ѿ3K�;`�yv��'t��ꁡ�g��"
��!��A����q�R���Y��oTLG�aU'TTY8	?9.������}w�qB趍��k!����A�?O��l��-�2�K��2��e��Fwb�h��I;+]�H�U���n.xF9Q�F� ���'�)5�o���:�
��6��Ӄ�ᝪ�p.���@�,��`��L�c�;�
�-4%
|ja��]f����x�E,���>��a&����?�}��>X;`����J����1`6�@
�*�f��{�6����N%>�Ih�:2ܖ"�?��Q���K������@�޹��9���¨�b}�����
��&�L��y�4�-.1S5b�v*E@��u;X��m'7��s0n�tD��fV�&E�7uv��"�9����f�s��]V$��*���#xGI�j���-S��R��_��@�� l�
�G&����D��b���������u���x���ĸ��p^O�%`r��ib��<���:�UQ�b��S����`�+i�q�*�f�����J�{r[�N/�iv%�k�7����Ӛ��v�v��.>�~5�&ї�����͔#>X���;
�i���j���m���sV���6�ħ�bCFqP����a�8K�t���X�h���8��=���S��v��)	�th*�NO���_�oݴ��Ҳ#>��VsY=!i0\Β3���l�l� }�<�ci�n�V���	@��=(\�+Z�ᕕ�-*�{G�~:Q�\��Lv��
|
��+�}0pd��]�{�^x�L��RO�� �;�N�C�\$��|W�7��L�7�R
�Y���q���u��ňP���y�'�O�e�������+b��=�\����lb�2��?-�o/�>������[��1tR����:��˟̣!�y�.��ϔ�4�<��o�T��^�\��e?���kN��N�?���F?��P)n�'V����@K^P�x�7�~�i�d�[�w��͐q�My�jW/�g��
F�-#��GH�S��JmdN��H�[m�z���biFL��;~�B?鰴ZK�֜8��U��B���e���q$
;�� r|�0�pѮ`�34Mo���q"g;�8����P�Nd��k(��dk@�q*�PI�/g:��2$**_��0�rj��S�����5��uP�,��G��9a��#���z{IS��Y�X5�Z�n����5S��+z#/�">m�.�h�7�002\o]��<^���'�;�i��[�9�v7L�kp��u��N��P��r���z����M����MO4�޻X�u#:�z�i�L�F[xσ���tb�۞����2�w:H���1��=���u4���R7��k��E���"
~؉�:Z̴��%���/��t�GN“��F��㍣B3[��h�C�7��o�_E�h�t�27�;�[x8DxtF,�ыh���m5?��k������#�+�z���tBǤ�z{:
��ӿ�8���%+�:�V��
�
x V~0�R��v��?�8�@ȋCϥ���������J��r���\��.�D�HB�X><u}Z�<�!�O�u�b�\�m�U᫛�[mQ䷵(�.lU{�&$j��F�X���H�!���	s�!�CPP�U��Y�	�a?Lu��}T\�����М��@^j7�<&�SD���A!G�(W~��T��>������[i��ŃL6+�C4���B.ץr�T��-|p-~�Pa6��tn^�-	�4�����Q_�|?�Q�<oS�oa.��X�GL�.�m=���:D�h��M��j�˺��s�D��;��qMڽͭ��&[����x��,��(���5X6�8VL/L�Q����Y����p�ω�oۮ��M~�����m0�M�$	��vQy��+-闝	g�w��g"&���
��N�AXl�
��d�Y&��C}s��Ƀ��U��!���*?��#�����~�qC�!4v҃OXlAI/{�3�����e��u/��(���� 
Sܗ��=�����#�lH'��o{��w�z�M�8���a�߯:��E�!L�V#߃�l+�zF��N�@[���"O�[;GM�̠P�
�0�DbwkӦ�bkRq���I���D�)��*�!�ם��F?��R�hl���S4��z�����p�,�Q�ݳ�+ܽ�V<�
�@tH��&/�L����QPP#b�<Z�PW'���_$ps�ɿ������H�k�}ahg:�k�3��C]g�x��5�C�W2HHp�2xu��s0��`�RWS���G���ӊ�T/tE!�*^�*t A��V;���yі�J��%�u��bu�G�NN0��'�϶�߯镠2}�8�p>�G����z�@��e��۰�Sc��Ӛ��_�b�;�5�x�h�Ô�`���5���a�F3�WQWu]��:��Q����.�1��j�^%�FM3k{+AfQ��"��6`�K���Rz��颗ؓ��Vv+艹�D]�W
�}�ƏZ4��A��ݷQᎉ?v�9���7��E�|�bR*�f[HA�����I@��\5'jr�=�&�O�$H������s1�`�-n���V���O8���gk�MO6��<+i��N4	@���2�Ybk
�f��5	�}�s��*pXB��j�*	6Di���HC��!��������Q��U�����:2���Lum"�|r��*�T; ���]�Mw3�&�5-l0���8ܰ���f֠����?�CЀ�_+�.>,��u[�f�ѻْ�@�m��6`��\LG O���:b7�w���I}kY�
�QEg)#4w����ӮN����!�_!��1va�F7c���r�x�PG������:��zNu7b��]z��n�w��`�5V�L8/42�s��0m�\�	7�h֓�����l�˝`Q�o��5!Gun�emky}���Q�ƭF~Pﷅ	�i"������
���N�2�V��7V�X#��{�_.;'����s����(�)��h8�Q�Kǰ��v�n��DqwN�@�����,�v7:
��Y
�f��9w���%�rsm*_��-
h.Tn��-�
�������/�����RNt�t��*.#o�[pm)�FCåz��3�k��-7���ZU�۰��#���7��
m�o��z\�=�>�ǂ���aۉ����L��g��ypvIk�q������+�zC�
�`�a�!�3���u���h�e�Va�iᮂjlPM�hO��
�KE/�W�-V��ƿ���ՍR�-�$XrK]������k9I+�XV�
����wv��wC���,��5)��)��:z�ۃ٨9�ne��2*E�,m���'ӟ<z� ��"dbc.����(
5�hW� g�����<�Q���e���Z[�F�o��Һ1��>�ˆ��2G�m+�i�D�4��GV#ik4o�h$h�H�D���_<�H�Q��&^��@�����aI�"_$6��;�\�^��+ӪAU[:�0"6�� �f�<��'(Q�7�
!_�Y�&F���t`��B��CY�����.6�S�N�Ў�_�z���>6o,�٤mXU0Z�m��jI[��������d�u�pf~�w���uRFo\W��H�����TjAt����~J|���S7��l��f^�I��ma��'=j�yJƪ:�+���k
U�?0r��&B\E'�gU�~tB��wY�rI���=kΟ��g?���]��1�[W���HXjQE�,Ң:� ���`�13�=��jzyq������Ѵ�'k׋�����*^��uPuv��Y*h���A\��p{�NWj
F�,�pKj������:��#b��,d�����w���Ŵ��z^0$���>��K�
#�2G������w"�+���8���9��2�t��u��ua��j�>W�t]�?3c�Є�>rl��R^��{8tg,���m����B�Is�*0��W����U�3��x/;
z]���eញ�)+���Cx����`�����%h���2!�B��h
��.�)z��	%ș��P�}ɴg뀕z��W+��h���e��)(�P/_�s��m\E�U�^Ѣ�
X;���lnj��n�t��7B4��&��U��L7Iq%��8�x��6�2�|	��R<3�����;�9���X�v��Ӣ�"y���Kq�I�eN4#�mz��`А��|a�1�G4��P��[kl
�ʬ��o��	�S�2G/�%�.{H+��(����"]����4�2{0s[;F�N;�i㏊<�҇̀�Oj���k�x)/���
�1D8�Z\� ܱ��{�q�|(dP��B�p�1�9B�r4�M���6	�9��G{��
0�	Z,=���V���s;�����Q��:3��|��m�q������D��V���]dP���V��	m�E�]��)q���	G�Y%F�–�N�u���`}ݺ��M��L(�Y�c��;�&w���a%�h��&\�%Ex4ې�{K��%g���	�����{e�4��+|>mH��ΐ[0$�����X�c�����ׯ�6k(��4TFO��d%�S�]뛞
��ĺpg�S��}�4�Dj�Uֶ�vCo�
��T��d�k�h����ˡ�+�fnuQT�
������������d�
��LD}�^nf�U�_^�����:��eJ02�-�|�L��8{�{�3�?봬�����*�ZĬ���]��WyNӳ��U��M\��o|��w�|W���W0�ٗ	Ož�m(���������.<��@�.�C����z�q�ɕ�Ԫɟ�W��
.�..ʓ�&w����w�D��p��/�>�\&�u�O7W{q�Fdž���ڈ7�'n�|�~>�?.N�O�Ruɕ�/'������/��?M/n�g'ꍴ��"�V�����F+�}��c#�޳���=�OZ�墄����h����(��Q�[��hqB9~���d��i�>��U�K(�1u��L���0��={���Ӌ�~4
�H�_��|N9�?%J[m�٩2f�GƔ<��<}tN^���:�".�Vi�^�I%y�7�Uh1$]U��g_>�7(�j�A4�>�t��~��E8{b����,��d��Г�f�ϼ���}sۢ~|�)_��⼧QC3�}b_W���H�N8����7�1���x��ۙ�A�ZE@�x^E�V
�Ey����i5���G�L+K�<��!��!ƃ'?�9��u.qͯ˦�����Yj2�!�>��_�WZ�)У��Չ慎��+�
��D���җ�"޶�^�L8�]b��?�@¤�c]��8A+菞�������a�C0N~�'4�u�%>B<w�K�;^�L�b���ԑXM���s��c��b[��c�B\;#���{�1��?�K��;�a�7c3�•ʢ���%]��E5��E��J��%��CG��}��VȺ[�t��gA(M�fc-�/4���V�[W���|���Z�0sh���
Z�G�P��|�M���:|����3/��a��^{ړ��vR�����J&�(�������U3p4���h�NO�18�����n8^UF|����>�����ZkJ䪖w0/чއ�� ��q�OȤ�Y�K�I�q`�WP����_!4�e�x�
�T\Ty�
y�:Ѩ�����o��9V���[3S��Mq�"�P4��t�諺l��Nhd�oy�I�1�&-��J�{�$2���)؛���W��a�n���<�7
Иж�r�q��k��ϣ�j��ކ���"�<�c{�9���2x;>���e]R�?\���S8>�sr>�f�ee���3�悎}����w�������ɹv�������S�v�巏�8�LPD�XM���1'3
Z�V�^�ɹl��k�ID�J�����$F�eY(/-د�e������p��1��J�!3�l���2�uy	��L�:�$Zi�2xy" m�<���mq�"]����SuŦ�jӜ�+�(7�mtzm{�<W�u�,����x�����Zk"�6�gc	}�3�ʦ9���Ԋ�e�Q/��[V��_��YF��/./���h��j%�x��XQ>t��'�El�5�d����N,�P:�JP_���3���ق�X��Нt�~�
�˱��	aі�j̝K&P��Q�<�Ŝz��_WN� r�Iȵ�O��wQ93=���K�U��*(AN�b;��^��XZxn4-��:�D�x�/Ν�c��T�,D�ſƷ���X��"*��_�x�)T%�c�,����!-�Ԏ'�]��k��[��sb��4^�k����A;]����ܽ�\^��U��Ⱥ0��70Ӗ��O-p8y_9��>'�bdb�(�\�73�%'z'�P�Iu�������PD��թ��H�K�t�BK�n��T��������5��T1:�t�ə�_*� 괥�t	5�� v"�D��������f�Ԛqډ~���X��kÑ�2uL���h��S��2�<��C<FӬ���:*1]��)��-��3�@4J4WwP�,g����VN�Y����)�(C43��u"���Al��a�ԇ��2X<L����EKH���,�u��(��UY�Ԍ�>�g7"��Oy�m�sϰ����:���q>QO\�D/�
>1��=.jT~jd�U%zo<n~���(��.C�6����ژ
V�a��\�P ƹQ�M:�}�g�����'O�!���=�b8��hR�2q�1���,1�A�z�ض�IS-�Ed�r~s{w	���#�����-\�R�~�H�ܷ/5E(��5<��"������U@�"�)�.H�<����6�}����� #�J1mw�t�G,��b�'X�8��̧�U�ma"�#�d�"��0C�*�v�>��ul��l�{Z�C
�Df=��$�u�*ў����(��!̼�po�=����i����d��&ȰPH=��w=�\�
�ɝ�g�@���b��,g4���^1G��/��������8(غ�K�u�D�=���d_�>�
8���S��/u-lf·uRz�����Ą,��o>e���J���6���1�CAd
RVrf�-�4��=�>�B�	؈�?[�9W�%�_`v�R���,��y`�P�\����U!l��Z�B�R���(}BϟV��́���ٕ*3�b��R���1S���u��僘@�:R[hrg��B'aR%��#M�Ю���T:��8���4>N�2t��4��o:d�3>v�#7+-҉�^�0o�u��z#4�����0�f�.((�5>��D��e�������Yy|܌�P�ؐ�v�h5:gK�\}^|"�J��]kc��<:�otrU�%�}��5����)�1�{�X�b�4_�+�^z�3�j�V`KjfU?kY��OZ$U����	R�s&��:t
a};NI0� �31��bz$�ʣ��+0���scT�ql�u�)��L[�I����c\�E�Qs�oj;�oh�`Ymgd�����d�f�9�0�����w���R���$^o���s0|�����H����1�
�cp�~gm�*�����_�U�o��dU!�ݏ�9�U���F�YBW�J���&.���D�w���X���$9~<�j?�|����,�����77�ή3����?��'Bz��-�������6MX�e��i�<�.-��tM�=�P��	⻺�ߩ0�!�1E�U8Q+:L?$�����YE3�M��|�T���'������*�(��_ѿo������5�Z9��%ЮAyό���u\<� .������fXY?3p��Y��rW�M�L�[蚺gm������vQ��a�'�n�{='�^�̧F�}�j��[�nj�ތx�Řj�j6�[��P^�^ڞ(v=��c����E	�O<���r�-@��k} �G��oV�(O�<���I�Fq�� e\oet�C��™�xd @���TN+��x=�=3QM�ty��4t��b+\��ZX ��(��^�����w�ئ��I����YF }n7"�L�+y���m�C4ö<!QR[�q�0��u~�#���-�e=���:�WW�Gfb�wբ����P/3]/�PD��N�4 ����i4tki�_��2���>�ox���h������u�1�~x�^����}��\��@�&{��J�iY��m
p���i�|e��:[^���m�M��o��w���Oy�a��.���x��:�+�Ѭ�o_"m�'�ż��'�w�1>$4��-Z�Z���T�t���3�mԹXSv)w�	����Z���es���ݜC�[�("'�z)?#cV	Dΐ����5���hz�Z �\�o�����]r<Ήn㢔���3ÎC3^xv�/��U��|��zi��~�q�Ƒ	)���ETg�lLe�f-ʽ�.���{7�2^���Z��%�c���uR��`1Oe=O���<������k	�*r�䤼�z����^�b�p����uo-u\/����cq�E��f��Op���k����d��W�M��t7F�*�o48jD�U��q8��A�	�ihOu�{Î��n�*؜`��cTџ3xa�Ѻ��i�vr��ZO�0��
Iɒ7���q��5rjG��hDEn�)0Kr�rʓo|l2��~��…�s��s�{�n~/�D����Rc��vt0�����|d#��x�f?�K���V^�t'Ք�v��ä�n�\9�b�=��t�5�
p�_k�㻦�{;�n�s��W9;"�@�e���e;۝����y�NP
��ҍ@��r��`��f�9���|�p��NO̥�l�pǡd��m��?T3R�fL)��ԋwUNE]Vvۃ�k ]��/�����'0@ {��$�~A���%jX9��{�B�i�S�E�%����z�^0�$�x_�3j�~�
G��,�G9OH<-~��a��
���
pDP�Vm2�j2b/���L�n�_�?�x�z�\�魻Ntz���{�0���B�ȝ;:��:\Sh�Rɍ��e~K����ܛ%5/���h/��sq�^�u��ļ''�cr�|��` k圚Ԫ��g�=��.Y������U��jR�.I	�M��$P�m90�>2����9'�A�@�ͭU5qE}�����e���0�J��G������W�'�^���\<ϒ`!������F}�M)^:"
�Z/
ӿ���X+������P����������7@�M�����o+G��gV�G�uÜ���N�cb0[cN�ӡH�B�V��V�<�S�>9sդHO�&HHYX7�m��������" ��B���T�8+3�&ѕf���l�D�u[q|��Ժ��ߧ�A�N/+4�f�9�h��`�<S&�3]5��B�8�kںδť>���#sq����c�$�m��ΧVLz^w�jɂ��+T���UV�~`J�f\��t2y�.4��P*]#�e�<�,��N�_�G�Hbt\A����<5"�[LT8���HK�'Dp���ճ��D�j�G�9ZԜ]2jSצv�Y�B��o��c.bs�7��β;�������4�=2�*5K̵*��96��!�a�����Ow�\ϵ09����k"Ȅh�/��l�I?�J�V�,".iw7�8��v��r�����J�lA'E.�
�Y����W��4�6�Q��%m[�:�VG�%��e]���m)���%ʼnш
����*u�EJ�-�\�j8Ϻ?�Y�(�f��X��	n�F�<���PC9k1��������2SB���d�r�`f�"�N�����Jm��bv1t�Vx,�%/3����{q7�g7�{v���a����Y� Ttx�FAg�6��J��$mz*��x��r�֌���(�M,{3�!;�^îKx��F�^��UM�i�i�(����vb,�k�3*40�Ĕ� 'b���u�ͧ�]
��,sL��=��h��	����k�"�&�D[A|2	��򈧢��X�ca�cQ�u�V�_eʻ(.2D�ž�YVQE�+���T�.ee���Z
�t�QM�������Y�Y��(�4����
�.��
=�{�T���Dd�Ϣ��:�*8��t��V��W�u��L8Уx�a5���v��xy��iP��U��=#���-w�ZVf�WB3��=�I���ǎ��"C��q�w�f15��훃��'*`kw��Ht%���7��g�boX�܃���}hu��k'���S�Z�fR����F�W�r�+�8��R���#¹�G�L��"_�����:%
dy���M�+")2y�m���<�C���^~�]c��IL�qv��8�G4��q���A8�@ճ��#�I���s.�>��j��+��D�D�U�ءd��n��+8c�}]c`�m�ڑ���s,��#�L�e��L!���2=Q��1\��Г?�σ_������'�
���S��.�9D�pPL�\m�K}�ė4�{"��oTVy�h<�ER�;�^�F"���3]��_�����琷�E����ɉ��?�.n���0`�OЍ��B���><'��'�u&������w����yy�O<�B��HwYs�������:��1�.d�Q�(�~;l��LXVw�0-P�r�_����N���#�8⮺���f#��ſ���6�Y�`͹(��;�p�)Gp6uqq�p��<3�mH����7�_���o�0�q�_�z"J߸޶D&d��A�%�ȶ.��v��`$u�[�1���|O�Ng+$Ƙs���*�gp
s];�t2CS��g4=��{�18hމ��߸�V�z%&�0l;��3C�չx��}Z��4	v^�A�L�U���2�*PJ˨��;��^_��ǯ3�zmD�fY(�0�����k1�Q���Σ�a�i��֩��ݮNX��ڗ�}����\P̪��o_�~ٖ����$&�Bm��������,i��Σڠ�+�t
�;��6����	��O�>*S1tg���cB�&`�����3`b%!/%��ѽ� ���UK]�n!$�#yfr��t;���H�\;V:0oP����Լ8�$F~.���MyD�����p�l+�cuE���SZ�u�Fgݲz�rY�B�2�0mK�%&T8�4��K�.B0ݤ���������\s���:_���F�6B5XS.8W��4k�ѫ6���Xe�Ȥ��vtss3��Qs��.πe�����<%�w��?��癄bӈ�-OOl�%E�/B�5[ڬ�g��_K��r2 E瀿���xt�G�(}"�qK'R�>��l�/ٗ��L��|�龻�Z� ;�ȝ�y�G񸘩9������o�_����I��������Y��{������)Ah�M�G�!�7S�s���]x�tk?�N|S�Y		Չ-U�1�-JV`^g|	�,�v���n;���Ɨ)!�jY�R�+G�~�	p�VP�a]MuMu>OV��&K���Y�^C��.2…w&��2ن*/��ڕϴOAu�������&�1y�^F4��� W�CI��;�+����@Wt#=!T��a@i.L�7���`1����Q5{2?T��rhЕ��}z�^7�U��!�S�X{�,1�̲����;�e��w���X�!Qw�KT��/�e�M����F%��F�S�^���M����x�����V:,��q����JB�^�5���DB_���ߘ�H�9#L�Ji1UE���٤4?/�+3��1��f�G/������u�k��Y�|Dh���.C�&�o3徾���wrB�y+���x�T��t�����B9-�g8�u��7=�p{tKʮ��Y�tw���~c���0P��р5�����8>�h[�8~z���}Bo�m(��|�_��O>�vn�V��f�F��s;vn��I��M>=�a��+����7@H�%��e���
��lG#��I<�K�q8d|�U�
���Bv	姩�8��i<��d��I��F.>SzX��0�/�ھ�����(�����A3��D��`�d=␛�K~���l8�`����@���`4��wQV�9n�%�{��<��)fOuJ2E��*yI�o�
6�W�^��~��o>4�|�t9iAK���x�QK��
<e��sO(�H�j��r�2�>�e�
�R�SOy����;;�-��',�º�|AM��D�%��7U�3�m�1�T��i�W�D�T[�F�(GǞ
Y��7�gI���ȽA�OCM�5�5<=/�kk:��~��hp�r\_��)��uٶvF=C�1���u��
4���$��v�kOgf̦d <�[juM�GH��zh��3�
�ا�ѳ����T=3����{�YD�s��6yu�ީ�F=���'�������	�Y��t��k�Q����$��'��o�M�K�oiŠ���GO&4O&�tM|<�h�S�u��Ѕ�A�|�k:����{�w����8���>��������g���V�$������N���%xз��A�x��x�)*��w�3�z��U�}J�.�'�s~%�TC&�3��j1����߉����ݩg��<�شII���u����
Pת������3665z��+غ%N�����R�HԄ�>���� ��ň��=/}�d�Cv��
���K�R��v&�b��i)�K��!3te��,���l�씀��p�ق�
�7��%�ـc��Cbjq

N��gW7n�������5w|���I����Jj`����1�H���ʄ?6Xk�(5;+Y��}��F�o)�C�!�̲�S?Ș���@��ǮR�]k k�R�'�m��C�9�2�J�#7l[
��k�K�]��6Y�}����<��36<�S����MJ�x��Yg8�K�� 
���Xl�]�����
��Z��
2��=E�l��	��ȣv&"R9)V�wB�y9L��q23{�A���g�b��Z1^�X��$

���M����L �G+"y�h0U�y8�84�*
���^�^8��e	М���������1�/�vTi0�tk�.�[L���*���9n�𩅗�`��֭�[Cb��3��q�Z$�v$̽D�	/_��xBS|��:kW9cr�P�O�(u���̪6||�@�+C��ƙ�T�����>�!�g�a��:*�A�d�Ťa�%Ζ���A�5��	�&˽AO�IB,��^6X��%�_(@�I}B��=�)���h��)Z	�a�ý�)�R�V�y�A�>�D3
.��4:�?
�Ӌ��Y���$jy��b�Y�Y�Of�*��|�I6QrBȹ0}����m0t�����l̙��<3�D�(I��^-E%M�
�Q&�Ƭ���P��d���ï#��Je쬱AZ1�oLfS3��1���5�LQ���#(�!�?gb�.
���V�"�ͬ�[gge�g˹�Q.�#�jy�9"7�o��p�#l#��1՜�H�3�C�2(�SsY˥*5:'���L��ۓ[�&�M��a���Rƾx֦f���xB��H��g�L��ب���|��&�Ƚ��`�!�]�m|'J�Tָ�d�Ek���
a'?~�WU��Ĵ�}+��ق��lt��I��U�5�y����IJ��E{L��:ą�ȍ�����9�/0;mY/U�7,���� �!�Y�,i��x]���;]���Auqv�]f��j+r�x��j�ŤV�@���b��4�`��-8v���4ݍ�m�s�\�L_:|q�:C���ɋe���"E�ӻ�@�#'�^�2K2 Nn�yޗ��E�P�S�μGz�%�;c�����knL�e-w=
v]P�R�Cz߭i��ё5Xh�D�u���RDB�$���=�]�ƷH�v}74�}�-`����IG3��J�ɠYfӰ��X�
q���6��q�H�T��5d��b�z�t�Ӆmiz�Vyޡd�E�A�4�K:=}��c���9RO&�aICSB0�O&�tuK:4����D���8��B�wXE�M:m���ar0����2�M�[6�a�"V��5��y��:R�kB5~F�6*�c����k=)1���~�w�K��9�B�������-R;!��E{v���1U�W–2��A���z�#�#�j�?7I��p��̘�q���P���1",��9�1�h�k��"�p���9�D�DL ��E�<CXB[�v��Oϖ��V��SO�'�N�R���K�������!|�펏G#�)�~UK��DD�ZKG8�:-��h<3k�u�;���]D��K�c�w�V���i�7�z�VM�;DKk�Q
3���X��.���g��*��7ѫP�f7��$�gS�	&�5�)،�+��*��x��ou>�7�PO�D��#-$�h��s-K����]����'u
�Y��
����
��lL�N�1��2֯ut��]��;f&j�V�����yN�q��~��T"�\��h��V�y�Q�	�I�e�V�qe�*r�kGN_�%�U��?/ҫ4���:Mʰ��F!"Sv~B;�fR!6�JFQ�߰ok]���^��>��ӏ�FGy�	��y���hK9�h�hhX9��A��z�,Rב��>��:+γ��]�L���q�]&U��np��&U���n�V�VU���qg1��i�CA��(��2V�cP0l��[jp��bb�j)뮯nY�R�v���eq�nµb��������$3m�w��SY��
O `Q�Ɂg{�u��9��*zx���,�9s]I��@$(=�E�\���W٩�eL��r)�>jf$�� ��֢�j�|[u�ِ�P��v�j�sW3Sze���j�Q�$
�r�)�����=('����Qi�
W%��%-w��:��UL`+���<⿬3�O�]I����DQM	���I��Pl���}�-��(�.�)�5��+�`6
2GL�dw��.�a�FE`6�½/���~�	��徸�L]f���S��S�C�깷���B��N~4]��߻}`�D���t��3�T�E��0�P��H��:��fK�������J[<��(s���Gq4�ܥ��a4��迎�U�Һr�E��b���Km�.kob
�K�a�ɒ4;.뀮�@yMd���x˝ߤ]t����lgv�/��/O�&�6^�A8�]�Eѐ�?	v)�7��aO4�f�%`�BN#�-�v�ٕ�48����(E3�]�cI���|�������l"c)BJk�9�TlI���UK�!���g��~52�0m���xf�ʮ��wK���ᠧ4�XT���0s�hՠ
�'�r8	�(Q	�R�l�=�|��H�
�:֌����8����>cx�+����p��8̤���X�j����;h�(*
���i����vHQ��*H�����ב��AW�v�������lA�"�Hƪmo4-Ɣ�TBS�#�/y���j�꠨\��-c���i;i-W�ڗ��!���e����Af�U"���7&)9
>r��"�pF���z�:�J'��DM�i�� 4��hR}3��zʃ�հ~kVRV�V�r��X2B~��u\a8��I�]c���Q���~Sn}ѽ
�ٲP7Ǿ�@�p�g�,	��x7&��i�M39����F�ݜ5M�;��������e�l��`��ny:m�� -��=�s<��rM�c:1�='6����f��j����]�~b���xO2�%E������8�o��qOw<���BRr=��B�	�X����.6��l	�M]'���Ĕ1fԘ0|��RR��k���cr��cͅZt�e�a��ר&�ʓ(��U���n��!wn,��h�5fs."�	�R��hߙ00.���D)�l(-��2t���٥&x�6�	ۺK~v��d���L}�3SpQ�tŽ�z�QՙT�i�F�Eon��H���5��3.�6]��A"�C��{�pg5����7��`���t����W
/ĥG���p�:?>�_��q��ű]�Z)��3� .$�L���l4:ǞO�@o
3��ʟ��>9>'`�Ɋ�WVFg%S��R��=�.�*	@�a�d�t-��I���}��|��63��
�*�=o�v1-j6
όٔl��v��8�y��t��[}abj�DW2ѕL��p����v닏�ʝ_�;��-#�D��x����=�3�q^��oyh��i����&�au��R��F��'���2YQ̌߷!<r�jn�Z�����ސ
��0q�Oݗk����,L�U����﷜��Nz#nz���"��j��Rǁ�_�*��$tE�7]�Ꮓ�t��ە��� 
�7j�kéLz�F���p֫������٧Æ!�R�L	r	V�V�A��Ђ�-<.,1n��V�IX��5�hk��~�G�"�m0�r�<��\��I��l����RԷG�5�h#��P�<>U?��TӚe8��_���;K��܄�{0	���	��bֻ�Ɵ�X ��	�|̏߾N�0�#@	�&LM�A�
�t�}k'5P3a�jy����Ym	A�b���$�=3@����B�V�Ky����mܵT#�O:b�o��V?�eSxxx��ӏU����H~�A3�����	hV�Z������Y���[����G��:�	�<� (��\���hUg��z��0`�g��C��5sE	�u?�щ�I���5��U�^0~�_݊��]�h�B�g�ˍlX�to��(�'p��c�B�Ў�k\	�g+�mmC��&���-�/1(�����гuJy�#��8�A��!���(�h>��C:��*�Iƻܐ3�Je\���M<���?�K��q��e�f�C/ν��@[��S�/��<�Ӆ����?2�#�dC�Gs�S	ޖG�nַ"��J��K5���B�cjhF�*�M�����2W�bU΃���t`�
V��������W��nwC�tS
���M*����d�ȍ�|HX�v��j�+o#Y�m�ms��+�#���@y��s���i5�ZD�<ak!F�Ά$i��1���	��Ja���6�t�h�6�Vt�=��C�\���LO�k榲�VJ�]��:{?���|fnc����}�N�u��l<q=�����ɚp�#;@A9��5�.R};+�a�#���|�3[}��:�;�Gn�v�56*5�����Si�r{�:�.*�k��|m<e���k��tha��OF�98렧�s�<ۣV�u����O������P{dD��0�>e�`�/��t��I�8W�4��7@..�wzվҴ����q�����@2	�ҐYM�irN����D88���qa�h͙o/�)d8r�8o�c��ݡǡ)�)Ϭ)^��]�z5��a^YfE��u?�!r111Yh�6ۥ}`/�z�g�Y͠��{r#��<�u�{Q�ncV7&coŬ�L{�U�x3䐙ͷ�q�Hi$�c�1���	ᇊ�|B;�iX���+�L��?�{�6Σ�Ryfjj�6Q���;�7K�Y7I�'�,�!�qi|�6�����JPF?*installation/template/flat/js/modal.min.js����XQo�6~�p8�WYQ��v��
t@�]���@��D�=�r��;J�L�V�
�R�wO�;��cy꡺�,�%�(��f�d:!������v�w�1�z�4J�2�\�ޢ�b�J+�h�h�����Q��XDeR��A���`f�!����}vF����3�eT�B���S����D~�x�k;2y�_\�9��FȊ�	U$�H,�Ib�oR��<�劕7D�����+0v>��d��B1]�r�U.��%x��f�Ȳ��Bf�T�2�Y��	�&��K�IL>AZ��*+�
ށ6ɍ�]��D��o�����A�H��߿?��m�@�����4���ͯYa�g�q��Nԇ@�؀�	����~b`�����[���h+�n��N
ܝwuy�\�f֩n��b� �Ȕ��A��%S���n#�VPќ�O=رh���& ˀ��Ι��(U�`P�E��K*��h�PEP1�FCǵf�T���t�n��4�c}{�#ñT�)�����x��t}�$���\P����M���!�2ۓ\�:�?k�6�1�-���1�M�.�b:-�y�)��Q�_/���㽤�
+3�/�p�.��lI 
*��j��Z�s�bS=ȷ����]1ڪ��3�{��D�18̻�k^���k���#A���c'��X��>���x��m���j@r�~������hL��E�{�N��F=(��2�jj�v�6��%�g!{va���5�Y ��]��o9P($��Qx���]�_\������5I�y9zH�����!�3��ˢ�^֥&�U%U�
�+���pw��r���^06@������_��~��t�y�d��!�`_��r7>�d;���u�+sg�m0GM>C8X��	�5��p|��b+���e_O-�
�N<K����-K5t-I/����SMM{��k�U�^��u<������/V��
��,��?�<�^���@]w
e�v&cM��e�c�Jo�%�[C����)]84?��
�T(���͸�|�eY-��{��;�+�ЌYJ�-Qy)K�Nr���a�BWNjW �2?�r<�v�H#�_�{"SW�׳�j�6$�q���sG�ClDz!��k�D=��y��K�	�DI!�u��U�A��P��7�v5�Mے�ܶ5��}���,
�%�k#�E�@e]����}F�zs,��ёl���|�-HޘÎW@��#����:
��"�����5tB�R�#��
MJ��Z56O�a�w����r�r<.'70n�$ȥ�ߠ'�C)Lg����e~�jF/_5|��L�_f�L:eOT]��m�����G�;�@�j_��¼"g����o�����pB��,:��g��a�XKj簆��
�W7�w١ 7�D��zo��U`��Y��}�W{���+蟚���>�#���^cM��ҹZ�U���u���ء�A�\���|z��ŋ��&��U��/�Oo�&�A��`Y9��JPF?*installation/template/flat/php/buttons.php/����S]o�0}��]�� ���ES;Vi�i�*'�!��bS	M������\�{�99Ƕ?�Ӝ�;�.���*E�L!(�(�b���
�+HD!�6�h��
%DR�1�{�nC
����SdBk�/���5h��aًD�/�:Upw�ڑ;>{���,JEF%<������eBB��xTqɕ��4���3,�cA3xڅz���
i|�tA[ʴ�B/�	�1a��:}��gS�5��a��
wJ	.a-�2�kT��WX���\��
�uMjH�����[B,����/gWd΋��7��V�Fk:i����� U��b��<���|�z���i���>i#=plgD�?��L����#�f���J�jE��Lb6-��GWl�}��?�0*�3u�ME���W�F�E��5�W%
�d=*%M�H��,Ѝ�J^�=j�&S��E��p+(��J��L�('�)�������M(#ۧ�*�I𮩕&�f)['W���uo��~:�˜�K�G�<��P"�Y2���d��E)��w^J�ߧ�*ѫu�#�JPF<'installation/template/flat/php/head.php��
���V�N�0}n��Uj�A�e�!4�Ф��u���q�ؙ�E��u����mla�^�����s|�G'y�{����0��x;p� hnj#3\
С⹁X*�p6ρ�0ᷨ!T�F0.`0C38�"�+C�J��n�6�.� &�Z(�B�Ib�l�����^�����5�2
���Z�r�J
A�Ǖ�J���(�忸�(P�>��Ԁ��y�J[_��,�d@���"�����2�<??tzq�=���A�1�M�N�f�jP��a�2wr���m��)�!��C�i�n)4��c��!��,�^A
���[T0E�����	#�E	���s��q�9��w�hq��S�����Z�i!�
��9�.�)r<�w|�3Bߏ|�*�������-菄����M-�R��j��wL�-sUG��f��>���_稊ݩ^��ϘȠF�[f\4A���7�e�X7�)�G�h�O�j�9�25<ol2b�&2�����/�ѫr> Z
��ڗc屍�H�����R(�AaJOO�.�$o$j�H,��P��l8���lܔb�]�\F�N��Ϗ�v�g����B8���z��K����t�'�r1���)�p�DCs����b���l������|�C�+ƵO�:��/q�_3�7I15k���P�����~����o���D�?$���a�"7,���JPF@+installation/template/flat/php/messages.php���u�M��0��WL�H@�U��|��m�v�j{���1C�B�e�T�� Pr('���;�ΰ��\��d�`�~�����V:��)ÝT%Xa�v�).N�nD./hA�S8\!9!8<݈2�n��BQ���{MY~D��;����c��C
D8xx�揰�"W���>RCW���
ea��xui�UH����w���
/�Ku��ޒ4���8�T�C�g��������l�O��@*1����"��'�|4F�N���ˢ2�O��nJY���;�VB��-�w�,3Ui�&��>�h6cw�X�ǂFe���gҡi[XC�hM3h�X�=���R��(��s�~���O����d�<kw
z��V��B�=����x���n���t=�ͦ���nRѪ�i���M<�F�?��-�8Ew��v61�3/�QL}xm��ܿ������}�x(ޕ�ī�Hc��ԗC�Ռl�@�#JfK6��_JPFJ5installation/template/flat/image/chosen-sprite@2x.png�������PNG


IHDRhJ�q��IDATh�횿o�@�#�P	� �����?!d�ԅ�sft⇿'R�J0�#[���Ɉ��+��������P����{R�W%����ދ��1�e,�J4�h��'�Y�2�Ny�H%?��/�4��
L�j�[��	-�85H�q���H�����qȱ�s���6�C+�%0��`QW�X����O�5��
�]:ڿ��h���Ig���7�oi����
1n� ���f���Hn�'
�!-��
hjh؝l�n��zH���A��oj��Q�FEæ�����hH
'��wԲt�c �8�H۪�/�4��
L�j��`$�8�� q�iD�S %N��9 �J�1Sp̶�;X�k}\kN[�[�t���������k�%��s�F<Uk��}dvǢ�W���b��?�O/n&�
�0p)/��Pyf'��~�|��|+a�C�˒�bKq��SB>��p��3�K�X��R~����C�gY�Ƭ��,�9���A%w;8Q�h�H�,�]n�p��Y��>�$�c
��)�ƒ�K�hw~��S�ʼn�q��P�*�w�Ҷ�����X�y{$���u�%�&�Z����'������(�8�؜��֜�b��ҍ၊�5R6�emP�0�<�F�-F��
i��#�	��z�H�|��Y��JZ�\N��IEND�B`�JPFE0installation/template/flat/image/modal-close.png)�����s���b``��p	�� �$W�)WR�%�%��i%�E��)�I�
����A��)��'Sm��2C"J"|}���s�Aj�*r@�ƾ� 19;�D!)5=3�V��J
�)�Jᦾ�Ω�UE��U~!�U�ɖ)J�v
6V@rSK*rs�*l���Z� a}%���l[%��"|��RL��u�

���ML��u���
��L��������\
�����Y��A��l�2JJ
�����ʍ���
---Af�U�W�$V��+�LpI-N.�,(���S���KKl��`^�-��W
(`��W$�������T����W]RY���Z�_Z���4e$��k)��ʿ()�9.�ɥ��y%�.�J@���+SccScSccg7W#CCK'#3'#'C#'3���8��X8���Y��[XZ�X9������z��$�%���f�����k�\��X�_���K�%���
�f
�y)��Ś�聺4�(�,5ŭ(?W�V�X췰$�o��r�L�}���@��x�I��"`�X�z� 0[��tq��5%0�됁H����_��T�_�7/��l6�\��_�$��n��̎{��6���3���Z�!u�|�U‘�}�(x����x��X��Y-rN%|��:q��i�\{\x��Co��nnճ��K�<�wl���mZ�dn���ّ��\�
�W-5�ǂ)���s��$~�e��������σ���f����Z�
*<]�\�9%4JPFG2installation/template/flat/image/loading_small.gifP����[TS׺𕕕��d��"+�KB�T(b������`DmB��h��^�H�0"���t�-*�KDD�����m��<�j����1��rv��|�cΗ���}_f�.eI�?����-Z��/�|��w���/�>}�믿���O���N����zӦM�w�ޏ?�x��͍7&''���|��7�?>q���ӧ��绻�333_~��˗/���ܿ��񔗗�9s���5===??��?޾}������<�Ry�ܹ�����I�F���j0��������
� v��}���~�N���322�z��+W�=z��^���/O�:u�ڵ���[�n�ܹ������w߾}---���K�,�p�B{{��c������뇇�<x�k�.���'����ݾ}�����7�,))�q����ܳg�~�ᇇ�F�����>z�	��[��B26W�m��m��R%*[_��fcY��zë�3��~�9#_k\�A��
2��V��G��f�j�;����Ʀ�f��[�b�ŔX��kơIh�F��h�V<|6��0S�;p�	�D���47p����GX<��I�d=*�S���ۘ8�S�߸�Ch�mT3�P�wR#!�r�ݴc�,@eɌ�;��a~U�Z-�\X�W��^9�����9�z��	�{T�e"�P·�\�:��'�}��=!
��~h�����ŒpꯆI����=,F�tm���T�J�Q&��rv$l3�G!���K�r�h��(��0J^"O�Ș"i�ub�4�L���$U�n���ڠ�g@�Eڢb6��I�lZ���m�{�r��&���Eph�n=�s��	�(�x�V�]�S"���٤�
��eqG�hb��������<�k�D���g���#�_,���������ΖJsX�;��źѱ��~�
�z���*�AB��w��8a��R�x�Fw��� G���J�'���Vo�
*C�+�
oriF��lr'��G��]!_zRƢ|�)E6����u#����im+�L
�t޽�4B�e�^�R��4��ֲ=vEJ⇀�R�`�X7t$ F4�� ��z״��|�ԩ�f�4��o�ҝ
6����=��F�a������r��{ל<`\�3SQ�fe=|��*���uX�2�V��i�z�A'G�R���H����C��h��@�9ꍑS����2'M�(,'D�Q2Ŏ�N���!�֏r��y@��x"����f�?��i~�_���He�_X���4��j}6��`�I�9]N׮%X�{�`f.#I�{܂&Q��`9�"S������R��|
/%�	6���t%.[3�g�bJ#�C�	�8I*J[ι./�H��t���:�������G_�al<����Q����#o��4�F�k�b
�i`JG�i�筡b��z
�ةKT���3��z�-�3����xd��f���+��j��>'[���T
nP�&��Ǖv��&��Ƭ���Ic���h\q
P�6���l.'v�j;յ��.����c�`\mU�����Y:���������R�%��Tpo����%I�L�b�����%y�P96P_� ���#�Xk,�_���1�Z-�{�%Lq���@#{�Ī���D
�-�E.��~��L8#SfOQ�x�o�yVb�]�U"�C��o$av��'�Th�r��y��T�ʅ<�{a
*���`��BL����cĵl��N� �1x�š�,��
I���u�������~	g��F-c0� ���'T&
b!���::�@�dO�ԧ�
�+���S
�V��=��߸���cm�x��u_��[�e�pt����2���kN"n���+��������X�By@<���t%|�҂~I^�L�}�Ʌ��]�R�����xR=�
��"_�Gҭ���HdC}�7��h�p���N��m�^��zcgM����:�lJ�����YpL/jڠkPm-�Pe��%�Q>�����,���h&H3�y�ؚ@P�1�qeY-vZKf�)���P�aΉ���`�ɺ�+�$8�a���7Y��OI�/*�'4���`)
����St
La�¶��!��pz(v\�D�%��03��q�		&AׂT5D�NAq�B�_�*g�p$�4��Q��H:���-��/[x[�h��\�B�n��-a����X�i��Y�2r�$u��]�a�����0�d��p��Vw�9`�o�v�.c���y�
��'ͫbw�}GaM|��?�qʏ�Ud�L��D��@ݗϗ�R�8TV�fl;�i�q
7�:�7�&�#�4�%�f�I���)�"k��9��;M"�r
6�fH��@��u�ApI�Wo��'V�)}ob	f��
�gb\@u� =^�>�&�l�[6�c[d��#i���UI�����<;t�z��3#{������	��A�}ї��!z�i�w�h�~e~��Qh!S�O���?�¶�?p)�k�Y��v���+���^�KS-!w�Y�hLR��m�17����-��A�`n��Gu�*bԾ*By8C9�"������6���}���B�~@ �H�rp�/b���j="��Oc+��.JP%x�x�D
��|j�V7Q�͛}��R7>��ok�䈑�_�0�v��Y$H�ڹV4�#���Ŝ�=��*�݄Ѓ�U�Q��1T��Mr]�=ŕ�>
��m�C
L~ĕ�-R���,^��sCo��H����Aq}��u�*mP�m<��3Be#���Я ��tۜ@��Mċ���/�+��u��ptȬw{�W�bt�^m��בq��L3��xW�F�U��Rv���ڭ���rGxaRq��r�����ѳU{���� >R���z�vL^�##2�����2;M���2�UF��{�"�e�]�_7� .����X)�t�iBx�!Rv�ߜ�EH�|.���/�A�:}����c]�U%J�
�R�/�U�u�O ]&�p�"���D��8N�u�G��ׁ�0▓�U0�C�r���@I/�(�l�XQ�1QT�'\X�V���|��=@rY�6MuD���ʇ�6�+����Ƞ�bN��=;*Vv�%'�̳-=�3H�Cv�3��
�;�nc�hl�HK��-�Ufx��d�Iۼ�ҳvz��~��m{\���F�0٬	�M
a8����L����I\,�V���'�<x���������!ObE��#'���>1q詝5��r����pLt�K�#�9>`a�\e��v�#@�8j��WV���J���n���%�C]'��u<ĤRA�Q&��_'+�Vm(d+�T�>��:��dQ
שׁ��\ПM����
����tA�F�@�ǻ5Rq8�΢��ww��-xA��d^(H'�r�`���W*i@��`�A�;Y˗j�9a
�}��ﺐv�ы��������Ek��Z�S�B"���/f�DBDX��I43����KW�
L|�s��#�V�H�,���<=<���CR~m�2�Xe���#��L�L[-Ta�l>��aNb݅2oU��`�?�u�%kszz�{z��A	��I+�ܘ��)�o�(��2�z_�X�-�_�[_��&{`��eր�`�	.�
7�U����׀^�e��"ړ�����V���#�DZ׸�2Q��xiȗ��@R~����H��m�o��ʼn2筌S=��J&uE�)V��f��Ǯ}�g��@�~MMп	�I�fY������.�2���؇�j�f
�^�$�Z�n˷�@_��#�JPFG2installation/template/flat/image/chosen-sprite.png���PNG


IHDR4%��^�IDATH�헱kSQƯ
.-����=�$�b�o�$((T�Hw��*����"nupA�@ P�Apq�J$p!P��M1��.�����;���=��\D�.Y�n0��@}�DMF���>Fb��1���
�c�	!6�1r��b�%G���I��J(v��fFy�O����H4B c�1�}��^��4��5Fo��G�X�ٝv�U�n�(�R�s�p����v��*��8sP���*�c�O�TQWŬ���j1Q�H}����T��+���}��֕d�/���L�Lc�F�6�˔�7��,9ʼ1IkJ�(�dJj��Lc�^��z*"Hu�j)�׿���,?<��._1�a�������°x�	/b�}�T!�����i?O�u�	oc\������eN��c:�99�\@�s� uZ���q��|yp�k�a�����6��B|���1��G����gq�u����p�+���[�*y���IEND�B`�JPF9$installation/template/flat/error.phpm�
���VmO9�|���@��U�T؄�6 T�V�wҩ�����58��vrU�������@�C�b�{晗찮�^��e^�����b�\!X�Z�
sB+����B��fR3y%�h!7�r���q���P|�s��&��5IY��P
{���F�����_�����Λxog�\��ҒYx��;����ZO���.l�;���QY�z���B�$|��H�p��w��z��:��z��on\���6����u��zY���C�=��N�`�:x�Z�g�:&e����"�̇�^������.�>\�� K�����؏�g�6.�\+������s������L�6g���N�BI�n(��Y7�h+D�r��;ͭ��2X�����I�����"�x�� rfn~2��p�0[w@�ٔ5�X��B]�t�j��mD!i���`&׳�q>�R�΅u���>���	ܹf��6�{jl�W݂o����m����9ot�����upw�_�ఁ'귂��V�����[����,m��4�CN�e�QT
��lg�gq�Ep6�:ȸ�.��!�<�Bڢ�ǃ^�hV����Y�������6P�}Z\H�m��	�dž�P%x;K�C,�K]����Z�<_4q������c�rr��u�9�x*X�����>O�Z|��K_m?u��e�䣧��l�2���8�c*4�`�<]\ֿ*X#�R��GW�It�G����V�sT�T{�t��K,��۫W	ů}�e).�T��=>"��d)����\{��i����{r�lA��@C�gi��x�W4F��1Z�[ۡτ�К���iv~�
ѓ<���Q1q���x�*߃���(Ե�p�P�	����o�Bqf���9��͍�G:m8�#)!X?E��"O��Iכk:��pbiV(܌��k��#.&� ��|]P�r��O��l��T��)�v�iY�ė�h悏�wC��o�L͛Y`)���@�'�7dN.O��nM��dy��P{�N3)J�߸i]M�ɶ�jK��Q��.��zF���i�I�n����&/��s�����G6hsj)��e�Aa����r�eM
�,鶖 ��O��w���a�JPFQ<installation/template/flat/fonts/akeeba/Akeeba-Products.woffZ8l8��e{cp&Lml۶m���v�ضmll۶mnlml'w�n�?w��t�tO�T�̏vW���׸l�`��J��STad�'�A��՗L<Ll��������������O�b��ʏ
�ݶ032b��7��8�\�,����q� �*}��u�g�������_gco�o�?��?�k��y������0�����?[�?��@@ ы���.��_�V��LTC�mbhjd���?�?�<�X@(��`2>244464�À,�`�a�aOj
maaC��@e]B��Ŀ=
��HR��X>�D3c�����̚,b�h�)_?���{�	P�?��?�?�?�_� ��L�ц�1rT�u7;�r F¾������������¤ƨJ1}=QYI
����?���[�I�QP��@W���j���ɰ�W��VV����<��ɘ��jbm▪�vF�W�%C���2���J�?@�k���6�7D�����!��#��e�T
��u�磧m�溶��৪N;;m���̾����ř���3#k`���ܡ���}f����hL��~]w�
���]�B�ޏt����@�Kb�=u5K/ыK�9a(;n�U�X������������	P�E��k�khC
&*-�
��	��H�u�:
z�+	�k�M�9�@��y���z8xQ��Ԝ!k�v	W�2��Ⱦ��O�u�v�T�m�c��hxN��jq�fJ��^MY@�"�����
�W�i:��k������\u��*��
���J���&B'��s=�_LN��0�i���=�B�o�ļ6�N�2��.����#��|��M�u�M��\Qc����{yA��g��u$��i��dm�`�t�=���o��ɬ��#7kp���1Z�}TXщ:m�E����R�1+	�	b����ϭh~#�F�L����-<x	�[��KK���Ж{���H@�1	'c�[�t��@��G	D��
��*�d���m�hB�}�o����u�W�g�w��=:��:���;�������j�<��{!�־e��S�o�A��U?$@��=����^����t��M��<��`^�|�\g|�9u�^�4�
)*����O�nW���g#�s��	{I����c��:~maّp�f���:�
���%�?g��!}%!Z��+�S�sc�������`Kpw�S�/���ڐK�4����?3`ql�Gm×b���$���T�P�B���T�/�U1�S
���=p�����o&7%�����,u�����h���~g��V����B�-���;󥳐<{��O�`�J$���9�k�O}][Un�M��ϫ?N\�d)�s���,“	��"Ms��W�����}-����}�e(>�(z}_��K�(3�����.�j�ɯ�%���������x�nb�~D�U���Hx���e��Nx�>�,6L�����UH����>�������c�x�4j���V��sq�ݤ�J췊"��~y�-�*㐓�N�#�<1�JI��7�����C���2��$)��B�%�bYb
�x~�eC�|1��_ߌ;����hi�q9~��3K�č�Y\/�x�T��A=�L���+R
�%�]�����Hv�C���|�����m���.Iȭ�z_�=_�?E��Z��uB���8#�fg��#t�l�Z�۝;@���Y�i�yR��zE�A3��$ib��<So��)���|dPa2D��-�(��/b�A�~�r3�trױQ7�\&md!��F���V���xp���:.�IE������"��x�Og�d4�7�jK��U^g�=�1
n�{�����h���e����� W'`����7=��!�����#��|�O*C�i�Y�C��g�6�]v���=�<<�7��] ��%��EÈmĔ��H���u���G�%�/zn����oo.B�n@8Y�γ���]��-VZ�j��������5�8��u]���t��-�ǐ��6�}���zn`c[.г�1O�%>��'9Ba��FѼ9y��=&���$֏�靖��܍�>U@\f����fn:ve�oX� �a�w����8����VQ��Z.��RD�-0�W����Z(� �s�#lDXbI�?�;����S�]�������[�^G�׮�����w1�O�4�ǘat�@0_{Vã���"͛'�璇K��U?�:����E��E ����˔��p`8ui�q������9�
�[�}n���hc�d�S�V`�:d\X�bO�}��ח�1�k\}�N��xԱ
��	�oK��v�:���:�hY��ް�'7�l���`A��t�jBp�a��&��t6��I���R�����������)�ků�8=����Ve
a����PV�<�Pr�a�k�j|XL� �|x̷at��t��h��lK�X��� �sb�RC��N���wmsI�?f�*N�2h����<;M�@��'�<�s\��e�Rz̽(|FY�=�X�㮳
��mN�8���R�����̙�9�pБ�?B�v���c�3J�
.S�X�(�$ϴ�`�_��zK�Q��Ɇ��<�*���a%ס����=���^5m8@��{�H����d^�@��n��ҭw�Y}C��}�	OL����25R��m�̪��0xaw,��G8.<]��~K�7�G�ǀ�?	�9��0��ye�O⃮�J�iе��N�U���
q_r�����2����K3ǹZ�쉨e:�	�����O�RX��`���<���|>��+����k�����@��W8�p��2�N�ۆ����GT���g�Һ�Z���S��x����e�}&n��yb���?Vw���:xv:u�tJs�p��`t�tlSs��H_�c�,�ɗD'/:�\��'���O���H��ә]�
=Vx%d=Tr�W���.g7j
�[�N�Hma��ʫ\�O���bۼ{fٲ��*�7`�b1��:��1�=l���S�j�����mV�J�d�����a���i��u��A�|��hE�3�z�'�X��
����ߓ=g;�8� ���W�=�s
�rk^��K\�'+Ղ����׾�"��!�hb�6"[W
i3��/?�c��<ݳ�>dw�YX3�o�
��m�&���t�G=��Qg�U�����j0G2K�Ԑ_֔�n���tڞ�="O<��D\�	����%-澙Atgk��$ZA�ى�iީUu�U���Ar�HL��Z�m}Q$��Z7��h38
�"�{�h#iZ�/$�L��7c~8��% �w�m�����jkb����;$�e�1]s�﹉Y��|���0F��H�mo��=Dr�qva�L�@�������~ը���õ������m�T�굴�a�!e��M�s�a�����&}��m�l�E�_�q�����lJ�
�ǽ݂9E��%;������n�s��(���D���G�X�7�Qj1�A�&�����u@\��e�bN�ҦqY��~{P�@�H8���#�y6#�/�b����SC���t+�,�����U@��s`n��$��
m5���oK7�Ϙ?Q�K���!)��x� ��\q� :�.�N�Z����9�D�c��+,B������*�'��S��u��o�
�~f�G�쏊h�i+�3���"�='�C����A�ya��-!}�C��"�3�cS�#B	��V2􋤦����$�E�d#kS��$O�=nZSZ�Y�WQ�b*��y:�O�^���/*�*	X�X�˕L?DT�Gm~��K��Ҏ���G;'��ᾤ���b��5�&���a�Y/�I���옞w������ �3HcE��{oM~>��t��G��5��'N�b�F��I�3⿡E�U	W�Jz�HR��}����S��o9^�_�S%2܂k��Z-�e�ύ]E�f��R&W�f`������No��ff���f͜υ�.����4�e�`Zre�՘�
TPx�Q�Ŵ��P��t���$��0#.
J
f�25�}�r���&�J��8�Ǚ�
���98�?@�����ڣzI�0|oѥܟ��5���ȫAO�j�9���a$l�GA߹�n�!�D�HQ�Re��.hh‰�$f\GH�yT�Q���Ǩ�҂(��!S1�݈J��G������OD�S�v��+Bń�QUN��1oŔg�#G��I�,��s���@B�
~�^L��ݮ������I+z��X�]Ëa0RT��{4��FV�U��z���Ui����_ߝ5���B��E躈��q]���Bj�- u�x�O����!�
�gDh�����#�8�<%hX��F���
��#"
����d�^�N�D�G�T�ґ�.��ul���L~|d;B���eS|ٌф9��b�bh�_���h�F֓§�à"}�1�Ɖ��u�'�G�d	����Cj���6ĉQ�Gf�?�E#$�Ŕ�j��F#R��;n"���Q�`4$��Xq�ޥ�}n����Q�6��.;5}�u~_Naj�v(͖��%�/>���w��q�g�Z���Tx�#D�8i��!�;y�RSr����r�
�2G|�*T�B#k �Z���&F&E�n�NoA���鸬�-��G�K�A쎀��/�с����=;��5#:��c���U�8�{��)H�����?3�"���g�\xT;�x�[o*�N�7m+K�ў$pR�����Ub�X�\��tq�NHD�'\�(5�*=�;.=esj�Ş�-bP�� [�{��\�_w �{w#�0z��Z��;s���cpc�e\S�R��Yy�c�-5�z활��ܭ	�프����j{n�X>�9(4�-ŴV�.�.�L��[&�鬺R&�n)�d	�v�"����T�{�v�銩���y-�B��!�xj�*E4��R���`�D�0�*����#�-A΀;�Z�R� �3fXh.����-�⹿���\��|���s���2��p�E�� \.�Bwr�G���,��>kаm�}�:����_5�������`(x�'�&�l/m��)�n���D���p�:;1:z~�X�Fj��\�C�7��`N.�Bƙ�$�և��C�>�9��W�2a�D��x��d� �3�A>Vc��fC������*����FÒ�1�2���䜮,�+�v�B�8l��
�QƳq�#��<N����#�d�a���i9�Y)��!�G����U��I���-�$���o,��ٙ��8M���}�^�՝&*䃌N�͉�d�=޶�p��\��6�u����%p�+���YF��^�S��O�8TE�î�Ǐl؅K�xM��%YE�5d��z�F�c�K��”��>�K>=�	d��f�>Bt�q�X��VƂ
�2񁰦��&.PB����v�uy1d�՜���p���o��Q�V$z�e�,���JWյeOY��i��EC��������|J��N>9�����u�����}���P��i���T�.���N����N)����Vϵ-=����4�1-�	���Z���Lw��N�<$g{����L�j
$m�����Ƅ����،��tM*JE"_��?T�;�X���Ϫ�6���ͪrR���}o�)��y�B���靏�15ə�S�oc��@��ь"+s;�`��H+!�si�5�����O���ʇ�qw�eC��C����Y�[)���Y��u����H�
s`�����P����K!A�cg|
���R0,�����J�T|��Yv[[����J���.���;����8I{��w</o7����D�/P�תe��&=.n��N�X�J3q�ݣn3��#�GI�$�H9���"�8ճ�|���e��&���t`����qͨ�Dp�p�/���$��&���`�|>���kw�9�l�ctȉ�,Z%��"�Gt2��,w$�( UJ_j����}l8�B]�[��A�z~-�h��k�Q�2Hu͙�����27��;/e4�jIЯ�� 
L����QO�x<���DOݨu��2[QCT��wXemF�)-���̧����?��o�&�B*��������Zoz�К�3����l��&���7��*sݡSM�2R��D�XH2=�S��P
��Ca��T��[u+��N;f{Mw88j�H.�M�-�-�t��و���'�Y���g5e=jIu�Ɏ��B��P%5���QIH9�+�����%�u�y�z�_�+b���*�Ұ�E�Xv�k4����l҇����w�l�4�H*�}pֳ�:�8M���c,3�G4�X��iXCG�[/��6&5��g&�>(�^�Y�΁fbjw7��j��3��"2�z'��h���W�cFG�#[#\C͵�J�ըm[F5��m�#�LEӼ��x�r�vKIa�|�I����qO���W+�ί�a�ұ���cБc��:�9V���I�%�2�E>�6�ko_4�V�.[���*)���*'��c��s?�`��J�DݙIΪ!��*��1Tdf2F1��Xn��OX�2f�(��S����6j�)�X=4%h���ܫi��K���
pL������t��g�70+7͕j�[v�@�ԕ^��+�u��y�f�'��N,�����"�V��
�A=���1S`��&��4�� "b����ƴ�����G�i�v!WD�� [�f[r�A��݁�����"�_5L1ҁ���� ��u��q\d�B2��+7+����.��	Xdj؟�ד�"��SF�u���]<�榒3%�A��;
��g'�Z�a�4j1OG��GQ��$�l��y�@����
�w,`}L�����]�\C����N�j�P�`�H��֪)��j5�rK�q35c�\C�`>tȔ�æd
񹆆Sp�
�<���j�}��x��<z�E�B">i�!ڐc�U�L������%��,����&��/��g?�F��S� w`���j�QF�aC�!i��ī[�HP�wYV���{�EZ:v�R����ux
]���2	��xR �`Dv� �`��*�$矏L���б9߳�)�"�a���"������{�-3�"�"���M�|�R�x��"����%I`�f�ɵf�}a�J���	A�
a}�!o6N�C��+—�
?��A" �P�!���3jc�N��%��
�K�";�R6iw�C�Y֯qq�U���5m}fX��{t�&.��jh�:��<���Z|��%�4�����z>�q��U=<��Ǩ�|t��"�7ren�]�L8��.wL{��w�d��?��^�rU�\Ρ�^0���m��hk�JND�ESvt����}lN���ۖ�pE��2��Մ�.\���84�q��}sOڛ�8䐀�kf�3;��u�q�^"tr�&��i��`P�,a�|�3�]�wohs�Ff���o̅fZG���fZ�y�z��P����5@Q��;�%܃c�p%¤�c�\/5��k�!bu���Q3I��w��I(��z�R$�)ܟ�`i����BE,��;4��'h�[ؚ��n���:��hڭB�u�E�c��ZG�
���n��P�p`b��큫I!�߂���%����l�O>Q+��Mɽ�ë��ÏF{3�
���2>{K�JT��4����DA�kr�����-+6�i�N���J<"��0�n�q��>>�]�������~M��*��� �y�7TԢ�Ϻ��u����)(P��p���x�W�d��`����<�
��fz�+�k��ד�Χ����5}��dT����ߣR�Y�"u�g;3S<��V7 c
���p���p�����;�::+����b"�V(h`G2��J�O�*���[��0�T���)~r���A�4it��GK�.�#e�qö��(h����UP�G���0�&FU�[C
TBN�, V�U.+���F�A�S
��4�F#}񑭈��o$J�����pU��B6O��nc�y,ѩD���{1.�'w�d��F�L���+&��!`ળ|�I�&�����3rϠ�x�a�f�4����ƪt�j�]��}I��O�"%[����e/���!���g%�;�,^L�uD�m�A
�]m�8<6��*��~gz��z�ƷD��Ì����>ϋ����6��_d?/X�����
�e��
!N�����
ȒN��װW��o�T�6�?������d� ���~�X=���ŘI���3~���ϱ\�%)6r�����Ey�bKUz�^�&�E��~�AW���*��sv�8�C:%���Gϕ��� 7�
��!���b�L��Kґ_7��y��Qy�UYH��`rv�t�.{M(S֓���`�s$d�Ā$�7.���"�y�O���h_����gE���]�8�f3ENb0�juVp�uޣ��(&��~��nd6U�bBY_�l;�(��0���,k}���ܧTy�;�"]@�����;����D}���B�#c-O�����:�(��u���nja�u�EX��H��J�.�=Q�}G�k@qs�k%��Z ���;��鮳Š۪�j�ξ5����֮����4]���*�G�����'X��TZuN�Ҳq�~Kћ��q:����i��a�*n�x��{�C�n���xj[1�.�����!��;�=�?�?�?���=�f:�Kn��!�F�r�߳7�5"R��/��{l%��iD���J���c����2���jS8*���A҉���iQ����wN9��M�Mu2�tɾ�9ux
Wޑݷ97nh{O��j����mx8␖=!���鑍ؗ�ǒ�yBwouNwN�Q<�&��w$��ӊ���� ���Aٝ���?%��q�iぷ����Ne�l֌[�d ���S���6;�G�4�wދY�/�2{�����@��(��_��a�d|�v�u�n�XЂ^|�����̍�_��L�0h�wf�@�G�{+W'��[5��مq��]��
�`-��SP��v���C{�|��#�x���U�r�yS���v��Jï�J���^��0J0�C�g�aߧN�
(������]��g����Ǫ��Т�LZ��䓑H��o�V��N4q�.΄gXEB�ȱ
��9F��~*�*�"���u�^h�č�us�Z6����y�V7�{g�:�[@:c����%N�8�(C^R��l��g�Lb�b���&+�`b�k�jA����-�O��Q��U���Ⱶ�db��a
�yr`��\�u���
e.�5����qA��Yȿe��i)9���a����R�$Ξ"��U��am���2�׈'�C�=P��x��Y6�ٺ�iǝ�|��a�6��u�70(e���FÚZ�*�w^���Zs:}}���43��ׯ5D��q�Z�湳�.a�*�,��1w���f��ZD��Ϛ�=�Tz����w�^�9��97>�DY������2��|�T"���l�qy���f7�9���
qŶO.�Ҋ>���6�h�<.P�^��6���>�HT���+X�>�rX�
�fSZ:L��������}�h[���1K��6C�/g�ZW��'L\��W�m���@�f�-(Eq�!ZA�C�W}�k,;�eb;T����m�~61j-6�c���au��C�V�H��X3�?���پi�ͱ�4p#��a��՚�)�Gxꗩq��D��=�hA7��oj~����?�c������#���$���/�-^Y�j��_��\�}B޻����-w�aj�g�Y�-��&��%�u��W���b��-�O�b�/|AV-y����/�3�m��St��ˍ�P�9_�W��ˏ!�uvPF�:\W�Ԩ����.�=��A5_�F��Εm�5����\v�ۋ^����_@wZn��N�U�9�c���֎�k����̌�*+I�X|g�X
2�F��V�Iū����7��j�B��D$�pW&]HW_W W�N;›�
i��V��D��]�6q��ky{I3VTߟ/
�?�	c�(����EM����v~��1�q�3���s��z��徝)AH�Lm��L�M_ߛ�_pU:�V��<}�V�x�1����'ѓ�h��H�_BJ����=7ao����3I�o�9z��ĕ��sS�3�*�2k�k
�nj��#do��+'8�������)��.z�X�0m�T�t�O\(;'y��=��8���.�UC�
���ǡ���@l�tfH�H%t����Y0�w���rt|Ը�!��^)��1����m�8*�lg����㦮�GL�!^1x|��Uv��I�z~o�JI(�m�Y8�|���~�]���Y�@�5M���}����.��
��j�����j�h�~�&q���(O�*`��s�glg�jg�F����ñ��-`Ɒ��i�KRj
	�Z��9$�Q�M~��i����>���#T��H��	�A��DDp��o!I�c~<��a����#`8BE�BƂHU��a����K(}q� (���<���,�a�œ[G^"ؕ+��S�N�o��*�_��^|��M��Ѕ�GQ�[a��9O���Kp� j��ڔ��k���<����_�t���J�X�įG��ҏ˭�1V[��*��ݖ�y�9="u�Mf��T�Pڋtn�����\>�i��kO���V�=*{+#�-��7�ݹz�2zj#�t]���c�1�1�vuZwJQ7�L���M&��Lo$���bʆb��k3�r�n�Ѧl8Y�NB�HΏr�U�"�Ώ��#����h�Qi�Kk\��#���>��� 
�YB�q�,4��a/q����Y�q͠�.��}���}FN�ƇKN��n�2�o~����_�^�h1�(�O˾|q�,��M�]��TUL��h�%�܁#K����ЊX�+/��m�H��3����KGRe�fۦ�X^Ԫ�p�HXQ����u>r,ɹ]��]����˞�N���������
C�:P�9�{$�_��ɛLùL�#��{Q��y=go�Տd)\�
F�N�
�ߪ~=�5�j�Ia��pP�ڽ�v��ܛ6�X��8��?��tm�΄���4h���2dQ��D���D
���*�Jٕ���^G���p��ǁ!�����]��.2�-N��o~E8�[TS�M�a�@~W�W�t�ȼ��?��Di���ȼ&�r��cS|nC����RP��Q2�F!f$��:B���5�l ы�Jq#� ۭ	�%��0���!�V�;��_J[I�;pI>�:��޼�ֹ?�:B�y�@}����}��v��R���86x�NٽF]�}��B˔U�K*|^�}�`%ʆ��w� ���;�9�86����Y��Q;45��0oN���d�:vɏ�@���=LL2����n���s��]�졥yCT4�e���ͺ	���$!Nj�>tn��ޒ���2�i_׃-"���G�˲�޴�'�7���r��e��8��{�{:ݾ3��Drt�VTz��h�{��~8�� cT�X��1<�xQ
uԑJ�d���jh%
��8Hx8�K�X$T���7Ft�寻�.�%�3d!f�FI58}K����w�һ��}-�.�bO�$
�b_��_UΛt�ys�~zcZ���1�K4�EJ�H
�#hl	�`�:Vb���<���,�:RT��"����kPPWv՗[��Bˤ)a���R�u��@;[*�H�r$8s��y�x�{zl��:�}��j�Ch
6�;>�R]�Cd�$є�]�n���s�X�`}��]=���f=2*U$Ҕ�f$�4�#r��6�bX�s��fF�ˆ��R��'8m��$������uP�dЍ�[ֆiԃ~�� �V%4<0:B�M���ҭ�HcVA��>�&�L5���pcq���03n�@��p�K�Do;dz���	� ���J��o;������=�ܿ#W+��W��P�z�.�x
jh�F�9[���0�EW�,���Z
-��o�R��ݖh#&bC�d�mKRg�f�g�F�>�E��1��r|�������>)����uZ��K�����ɪ`'�uw/ݾM��4�j�bY4xj'>�<�C~������+�$1bʖ��
�P��2o�D/�3Wo}�����e'qA�?CAt�ȭ=��o�
�u��|����Vб��"��5s[D�ۙ/�H�;��$�.S"�~��)H1S��
Yx��r�ؾ�V`��9�����,�j�89O�É�Š�a����:���`��=�)��k�sD��Փ'up�!��؛xƭ���1��
ok�)�:����@f�oX�����+B�H�8�Y�vr?�_��}�̺�̽M��w}L�I۶m�{��B����I�)L�m��q�mך��meP(=*�\��T3�W4�1�����$��#}��>��F{r����P�-�>�s
N쭨KM�F�c)�ےU��a����lE�rom}\�
������5_;V���/ag������}�f�Su��ǿgm?��q��6P�W<?�~'|��A�f ~�.$g���!I+3XcXďr�,��q���D=r�̘�Lڴ
,;�ī~\`e�֑�f"%���Ԩ꯯�3��灡|*ydE���Vh��R�ߺ��ϓ�
k�zz�ŭ��!14���N�L��5wz���#�a�4�+�O��ʩZ�Ҷ�ٝϏ��)���8�����1�[=�2؊��A}��j����zyk	�Ľ2��S�D*��R|@�2�Zه�hC^�ٞ+Q���S""�D��3k8c&P������Nʀw���K��.j�,Pȝ�62N¥ޘ�6�bϒ��R�+�f��i@cрO/�A���)�7.�����3C�Y�\��.�Q
�5W?�L�ʝy3���JYsun�[ǜX�:����%�����Uvn^uU,�<unqWzNb}��0�6$�ڮzڼdM��Si�w�w?1���	BBhG��n����6
ɷ	n�Dr
W�g�_��E�3��R۬��R�^���ٽo�f�R�
\NXۯ-y�1��5j8�c�
�����"�n���}F1/���͊]ٕ���I����<�6�����
Eg�W���@j��
�N�^T��)���n�c¾f���˘����>�p�_�|Q��
8
{3���D�1�xX�}\E�|	}�o�/��u����#>@�y�_b먜FD��J1.Ռ��0�{"0�
�	�7���A6�lG_�]x��a��a�5�,���܍����͙z��ɂ�qЊg�)�A�z���q��_��!y6�z��1� ޸���c!T(�ŀ>�Ҹx�G�Ķ�^��t*4@\���m�USR
��*(1b�ܾMMPr�V���i3{���(�^f�G��N�2���2x����������O����]Kho9U���'\SL,@�"�
H���1
�Bz�nj�%���b�)�7fdhh�M�dt��"�-�+��Y�Lp(H�J(u�[�8�o�E�vx�Q�0DD>�$d�O�ATT�j�Vt!�i�OL,�0�kl*l�\<��6~/�Q:1�	�	)
����pd�dLAt"�c(
�l���	S
�Bha?��1Txi���0'DZ8xx^���ce��}rH�a�[��0�/ꦆ�Ei�ݷ�VVp�`E��\�]TX]VGh�6�R�F]bD:���?N��#N9+��vw��Ng���گ����ti�}��(�Sj[��S��
�<�ƭ�`�S����B<F�bY�'��-{�f�K�dy���B�֊��2ٹ��~��WE���V-�4�,q���ZR�F��(�w�1�Pzq�N����D��GX^pDm�d�����w�NqL�YP��2�5>��RoR�ijn���r�^�Y.=kj�ǹ�5줋�xN��,su��:�fீ���n�r���q�����j�"����y��ΐ���K�>�
�µB4="�ې��}��d��"L����~�����T~,�//�.�,q2��p0����7�_�յ�p��=#�)�2��1r�w��P@Z�JPFK6installation/template/flat/fonts/Ionicon/ionicons.woffS@	�t�c��\�4�m۶}m۶m۶m۶m۶m��~�:OR�d:�SY�2�79QQ@@H~��W��6QQe��t$�]b��H�W9%z��L��Œ�A_��`���D��x��{�6@��F���4�q �D@a3'����C��f��P����Dd�&��a�OC�؀��J�#���q�	�=H������5��������:�����Cr;媍�������,�5�1���_�?H!������3����D��d��ʦ������>�!�
Ǜ�oV̶4��A�
��2� AZ 
,��������C��C�w�PpN�_Q��=�>�#������������߃�����C���p%}L�L������񧙃���Ciw����F��(�Š���>(������ˆ`�P�x0�-�H(�LX�~t�/¯@g�ϔ
 �e��?�ZF�����[�+A�r�buN�S��&c��t�$N�v�n,�dK�ƳE����%]�(�,Չ�᪏��>ڢO�J��d݉g=�b���-��!c�{��L9r�+���D��=cڞ���W]HmtNn��K:�,�Ө��k���x��h���d-�'8���I�w7�.�%��j��<�n+y���!����i�v��g��xU���dc9��C/x��=m�<.qO>����:�0�;LŸ
��yL�N�i:d=���˨s��B�nGhv��E�����_�<�<�	�I��f֝�7c��Jds/٣�w�	��������:L~�c��{ӇҰ,sE�w���_G�����{�Ӳ�b���M��L��պ��`��;�N�^)�ƳFe��5��D�vY������%����u}�����&1�ޓ�VK�m�ܛ��&�;&P�s�����mu���Ozއ��`zQ
�^|�7�ԛ����w�mV�;ӆ�֜ٛ�g,���[|�܎�Y��W��m�{n��4�&`���M�@ۍ+˓����|���f���1�"�j0�������`�`�@nj�40������I���V���v�,�n>�����xu>���v��yy>�����yޟߘ��r��L�������Ħ�Z�w�~�Y^�x�s���|;�V�0��X����x�|O�.������������z�y�y�x�y�x}xuxiyayYyIyEx9x-x!yxyy�xew��%A`l`�caf�� w����,���׌��Y���oW0H(���a	��]skg_���^�q�ŁM���AH@A�A�A9A5A3A���4�����.�a�����!H !b!Z!!� C!;!�!��ԡ��f�������;�aH`la�aMa�aW��������%��'L*�)��/�������3��'�WQ�P�PQ*Q�QaPP#�p��Ѫ�&�.ё���U�s��1@0(01�1
1�1)05��2�񰵱�q�qZq�qeq{� ���\����	�J	�		�	}����I�%IpHZIqHIo���%��s)p(*))(m)s)�)'���򩮩�����ǩ�i`h4iRi�i�hUi�ii�ikii/��H���<�f��ohR�}�?��j�&�NY�Y�Y�YVY1X�Y��ؘؒٚ�����7ɮ��Q�qʉ���Y�y����Ε�5�M����̃Ó��ˇ×�ͯ�. ,�,/�+#�)�-�.L'�,�*�):(�+�(�,q.�#�$i(/9(y+!�".�(5/M&--.]+�.$'�)#)�(3*�-'�+�.'+7/O%�++_�`�H�8�D�d���4�̠��|���R�
�j�꫺���ƫ�6�Τޫ���q���Y���M�ݭ}�C��S����˦�����ۮ;���{���G�Ǡ'�穗�w�/���_��k@b`nPi0jpi�d�ihj�o8i�lDg$k�m�otl`L`,ilnn�i�m|k�b�i�m�mrj
`�izh�g�dfm�i�lb�gnm�l�m>k�`!jak�iqoIc�j�h�l�j�m�kEb%hei�hUi�n�b-m�l]n}n�ici�h�nsj�c+j�oko�h�kgGf'iWk`l_l��`���(������T�4�l��b��r���
��J�*������:�V��>�~�q�9�������c�����k���{��'��W���������P����8���T4t���|"��
�:��N>����Y9E�U5u���m������s��������4�����"�R�j���֘�n���>������њ�ɞi����E�Şe��
���#�Ә�K�����ۛ��ǐ矷��O���]Q Y�]YP[0Zp\Q�[hXX]�\�YDU$[dZ�Sl]\]�[�^UYr\
V�QFS�Y!Y�V�]%^�S�Z�Y�XVCS�X3]�_s[TKW+[�^�Y�^V'Y�]�^w_oZ�ڀ�`ސ��ܰ���Ԩ�x��٤�d݌�lߜ�<����r�*�j��Z���َ�>�~��A�����	שع�E��ߵ�M֭�}��3��ػ�G�gܗ�W�wޏ��߯۟���?0 =�?�4�<4=3�2\?�;0"9R;*;z8�2�;�:v9�5.8>?�0!:�8i=�?�=�=4K7+;;;�4�>�;O0?���������dc1�o�]$����'S���)��Β���T���\)��U\b#v�u Lh%3Qul� #%�Q0�q&�{�~�>�o#�!w�豤O���I�`���i��Vu[���D�8c?@��G�3�PN_|2 ��Xy��}�xB�_(r�QϏe��6e�=�Ι�=��cz~g9盿�p����a�p>�5N`�x�ڬ$�%ʵk��e�7��!�6)�����"mkW&,DS�B��%�������=ӏt�W����U6g<C�j�궬^=�W�}B��4�H�N�m{6l�f(�f<�VT�X�E��]_<��|\l^����;�bYp����`������z�Z����Lz�4�]�>20}1�Y��q/���'L���G?fff~X��@�_,oT�4,�� %��@�F��Ă������B��E�:P�a�E�v/�+D��t |����C�O�C��$g}�8D8ʊuL~�B���2ն�IOl܂L�!�.�Q<��:]3�U��:5�@}X(�4y��Q��rn��
Y��S׊L�H��(�S{w.w댵Mʴ��A_D��]�OU%�7;cV�$���u(�knb�E��d�
�L���SZ	k�J�hʉ��t��<���BGf	�����J�[��3j�_@��Ǻ��A��D��*=��һ�hJ%ϣ$R��"��E������`l����-w��ͷu�f
��&��X�za��sA��I؁��[;sݨ&�dw���C|/y�|���qr���aru��gP�ؘ���I���n�Z�BϕAu+N�
'��RM���5$
BLiN6��BE�L�`��19kWέ.�یē(�X�0)�p&�G\��G)9=��;�&e�5�O��)(ŦL��2U4�auVfV�;FffL�F�,�Q�&̢L�L�v�b��Mf�v�I2%(k4J�,�F��(�Z��#�k#z��m��D�z<l�PIyGԁZ��;y�����nsm&g���q�v�v@�d׮�ζ��Pp�C~	>](���̑�c�V�Y
��lE6�n7�t��.���ݗ�0��~,�WS�,��DUQY�Z�����hK�i[V���t]Vt�Z)�͹?�i���A�ܪ��l���d]037��LE}�͉DS4��{9tg����/�J����`	�˗N)�@2�D��6N��y#�M�#�x�x��CZ,z"�bLI X���㰥wK�%Ҥȧ�Ɋe��¸S�OI��!L�$��t�Xp�~�N&��!�9� Z9 T +=`I�Gƍ��a��9�����֓W�z$�l:��������C|��?,s�
�5���M���r���%���@n�����u̖�P&j��'ٵ�`�7Gg�Lj��v���r�s��$n��K9��ӽ������Y���Ã5=���E?�䊼� ���ߎ����e�7-�w�vXj��Od�j�WP�G#�X�X�Lܳh�DJ1�7XȒ���_zp�i�Ƕ�}�,�K��u�уl>��'y��<��rH�E޹�\7�J~n3��9J݃�vB֎�
GfW��n�Ɵ(b�����t�*%�~
4H�bҏ��f����[�Rm�_���Ѻ de��L��µ�痰����c��`37�$������MW �p�2�l>�L����'7��̈dI�}���,�y_��O�}i��'�3{�.���U'4m�'Q۵l�X��72+���E���Z�\f>{�5�e��J
��#
F�ޖ@q��I~�	��nB�
�];��I�+uhnZ�V�g��iSI�/���:�yc��D����"�S�_>[LE\`��p�N�/2v.��8!�OQPB���X��]�Y�g�J�m�48A���0�ڮD`A���YB�h,M<{���f
�smS֘����E��	�u����%M�-�+Nx`�d�	DWs��{<�#���L�5�|����`�؎i~���%zq�렃$Q�35 �!���ꚃ1��YF	1�^H*T���~�����F� �V�<�=Z�V�B//�أy �Q?E�.7��Od�0S���:EJ0�+�)<�>�Γ���O��@PAjd󦯠�탴鯛�bq�Q��,��h4�p�zl\�?��?�<��'r��Y
�>}���(��@@�	�P����2"�	H�n=��2���xŮ�44�3G8�DS�|����{�/gd�MA�n����i<ߛ��x	\Kk�s����G"y^+���?�CZ�}!�D�Wl���TŸq����-S�T\�@q1\L���y���ĝ�bF���Y�o#���F�4�1�Y�y�tHs��2L���&0�9�&�	y�Ȥ=�:���4H�Y-|oռQ�5-�>JX��M����w�)���L�%�"K�U����Q���i�0�}�}����ԉ���?��̹���j(66L�����hX�+3�Q��
�h�>7��T~Q~C M�{+,yl^|q���!�7���>�>&����FY~Z��Y��._�1���!{���v	�YE�P3J"�ڋ��
�$�g�%z���c�kk��A�(t��94>�ND\�����p�\�Q&�r�ģ9�pb~=��`Q�b=D��4�9*����|H%?~@�'�J��+����n�1<��I���X��[P�D��\��_�&�Y�by�i��ɞzy2:��`6ҩD��{���9Ϯ�.�M�R�|�`�I�<ٜ'NL�g���Na��o�/>��_Eh�/���RBA~�s�z�Q�$2�ڹ̲|���_S�c�z�=Z����fd�&��\��FS�Ye��)MS���-���,qys�.GN�[���迸y�m�#{�P�G:Y`0�aܒ��zK�%0�a����ܸM.�N��&��rؓ>��
k�f���oT�n���������|sOycN_u�	$��+,*͕�O�6���t9��<�gm��i�hu?I�܈g@�����剦
I�Y�g����f<�#�/�T�TT"!O�z��po.x��K�2x����s��
k�H�����`�k0��}��ۨ��V���<���~�ؿ�P�<��<��:{m��QN�	c_py�r��Y���U�\^D�ͯ���$��0K#�؉�]���t���h��Nʽ�#�=^��Bhi;�&Z����	��@ڊ�iĩ~-��Ŕ
K �ȯ�������L�Q��a�SZ��e��%��ٶ�>C�$�ĸ�p�� f
��@[K[�sŔ7�d�a��R�7��1�z4�zK����m���Nfο")tW���sax�?����9�EGh�����e���p���\�Kg 	�>ށʀG�H�چrC��M�������=0�hZlJiIg&I:!o�-M͍
��$]8!�<��i�6�X���Y���]�EJ�����y%��^|��9��2p�w��}�xW��3
��]̯�O3�>�8��"���fM�=ڎ�%zP}\�a�Sli��HQH'#�-��c3�b���>	<�p�f["�YgQ���T�~�qc�R�z�=��{�j�i���X �����z3�Z���F��].�9j3�|�&���_l��M;�ɂ"��j!�����2�3k1���'m�Y<�Ԝ�ٰ�Ch� j�л��E��5�DV���Z)	GSڂUƇ;W����+�#�:������}#�Y�q�
OZ�#V\1�	I�U�8t�Oq���\�#i�a�B��}�"+ɰ��ƾ�z9�F��X�曁�L�SZNd9C�0���|���Q�Y����b�4	J	
B�����HS��F�`�S*�L�8і��>֤R[����rs�s�r��Y�TQ�zz.�䀱�H3�Q�����.��Nn��Ы��v�Iq������Y�uU��Dz�p!F��y����ܦ̨@��Y�`����"�+�+��.ˏP���[z��f��I���^
>SfbPv�������1�2S��l��
�
�J����Ed1E�	o�[b�Y$���sqO�z�+� �ʓ��PS������%�E* �>��Wr��X��5.�̆܇��L(��H��76�%H��XЪ��fO�Bʮ1@d.$�翟���^D�@G��;4�H��!2*8���ܶ����a�WS|+��4L��m8I �='I�!��u�“R9�X�y�B��M��3��Y��)UR�پ��'�t��K�
QCi��lV�(z���9s|��#&@�₠��!1͑�^K�H*ņ�9	&B�$��ֿ��-�j�m���T�����bJe�?
ᄐy�<�î�q�v�Нp��#���Osh�!&�Ȭ�����z��fw_4�`N��ϩ�1�\�k�ҰP�F��0]`�T�Q� }4��:f�Av��,�u<q�u�Џ�x��-\C��Nes�z uXUS
�H4
)�Z<�z�`������U�/["x��z���z��ƾ����n��CĈk�@�
��m\�atԴ̶ejZҿ���;u2�bcP��9���KE���H��&����6��o�. �#����L�'�I�Ij,��X��௪�B����M�t��o���g���vj����@މ��wѤf�Ua�.���/����%$z���Ls�-��S�Y���ƯJ'_�I�W��_D$͘�L�O��5���+��䌊'�S��dwU���C}�x����G���� ?����\mp��M�nW��̝ �(�@�ߛ?i�PZ�r�����az�4�X>t5d�0���g����ن�-���wٜ3|o3g�Х���Ju�w ׌vl2u=�̆3\=�����#R�,l��
c�1�J�[ӊ������8�9���ҝ�v�QY�,��}`}��G��
����
��a�~��;h<��;��1R�
�>
Hߝ��������w=��? T�sOm7UI����,�;#X>m��X���O 1^̣U|�
?�?�.�;@�0?�E(���;�;t�<�Kv�#Ӓݼ����d�,B�P5��oc}�5�i{U_
�>�E�-�V�P�X��k�sЪ"���UN�6��*��ht�sn��ř��3����hЪ�]�����&BΛ�dt6�3�'k�y՞���J{��۶�\�H���\���*˹ݲ��9���X�z�r��9�tw@!�&�c��f�7�9��������g��r��K-�#�R#{ͬv���h�F�%�v0�\�	Cﵐ�w@�ٍ�
tcm�겱�I_��P��
�~;*K�00�,����r��r8�ͤ�`�l교�mV������73�S�G���z7�����L7�Z���S,*���t2Ŭ"��,�$�=��<�4�q"|hV�i�k+�c��5=��Wa�Fm����ϣ�SC����fv�B��l�s��i��J���z�2�|��~t�X�<#L��,
}����Œ��XSǺ|o)��п���ru��8��oYA_Ė!� ���4�/A�d�x}8��E:"h�a�bH��9UteLM���EA�q�>��w8�W�v�'�_ߺ�2<a�\����yޛq�9���Y��zu���64Q0>X�)바+��%9��ч���eg�*U��
!�Q5R}5��� ��j�(��. ��&_T�E���J�K��;�NK�c��Ҍr{���|��lI��]��!�[�]����5�8&��wc}��=Nܽi6h�`��|�Hb�.8����N{L}�x�[Йri\�}�2@~<s��j�BsDX	��6E�� [Ų{|�0��3�f����-�"^�7��j�^�1� 4�!*s�7�D:�(1�8�`:��p�_@�L��p�����p0�*
�����Ҋ�RK�ey5�O�2(|n
�gj*��p5�;�����A-�b"��A\$&����|K$"u�Ah����+�q�`�SF��P"#�%q��j���X�i+�ep��� _,!�r%�Z�lt��<Rłdim.e��[�;@�U���F�+)'�n۫��E枍����҉�����	C�1�Y/��7���8z��2�H�ȥ%�ɢ�(�mz�[��O���	"AX>��ɚ�x7�Ǡ��e���L����_��4�U���d��5�adoxt��D��2�9l�A�!b�gTv��'�fD3%��D��
�~�Ti?�1��P����i�Y��bR��=�ϲ��o�~ҏF�~I�&#�{����ݱ��r�R���>vA������z����Ĝ��r��W�DK}
=�l��/p^Xe�B9��%���s�˜�?\,[F�س��3�Dyx��ޅ��C3�x�M�V��,�8�[+̶�/
�B����_��?�絿�R�D\Йi��g�����W���Ys_S��(�;���~�i0m��c�c^�?}���s�-���~�O��:��Q�L:�F6a:����a#G�PU�	�S_ѹ7�S~�Vo�2v�|@|�
�e�^ޑ6Gѧ[��][j_�m��z���M�&Dl�Y����g`o��a����.�p?XM�L�Ȁq�4jE�裉�V��CJlZpoԨ�+�›g�s�(s��=�7K�3G��8e=Z�+?ѯ*�m�X���*(ރ	�� @
}�j�+uP�؇o���g�G]2/�����e��>qy��?�nK
�$ж$�/��*\�Eu�b��B�Ƙ�+&�3�8m*������W��{�7��:"B�]�u�@`�X`ơ��t �~%>1���B�V��+�"cl�-ۈ��"��>��!�(��蜢��X��
k>iJA�Oߊr[-mT��4�$��7�<;4Op�����i��f��_!��ƍ����v��ip0�l�U<���V	P�R����!�as=�P�C� Ha���=+����4!��T&�N�����w�KNT�i�Z�����L
w^9n*�l��Ҕ��4Z��˫]��N��7A��q�r�wEM7��)`�8�,K�#�V	�`Z�B��sS��C��?��*&��9� Ҳ�w�z�:{�}W7���҄�*'�p��P�AB��E�%4ħ��X�x���sS���t���FU��"�y�/��~�H7j �'��`�_q�ݼ�݋�@3W�,��S�͎�͍m�r��8ӱ9��G]��p���7�rF[��$$<�C�;��R���yj���cP��~L]o�\C�R�{�_�f�1��_���R̸]"�Ax���r�h���//�up��U��D\\��۝��%���L��*�9�0dז�=�+S�5v�Dt����nn
�>�M�a�<f�~<�\c7v��=�4s��5�@�������g2 �V�9Z��WZ�����o���:����k����<"�R�F�C��{�ye���#�.$��Jw�^����H,7;i�I�'0�qʰ1�i��W�����{Hf����8��#Gaޛ�����a�٪J���
��L��= */M��E���G̸D�	���x���B���rP��p�\��k�ϭ��9i�q�^!	@
"��錉Ymiq�UrS���~��'��Ð��J��+-�ꉈ��Ey_j�n�~l�
�:�~>D"\�#�hȲ�e�x��N���WҸWtTyC�^�8�
y�O���Pc�+;��~��f<�!lp�G�K�d�п��y���{�h�����ce�MA7�p��=IFF��93�tK�4�I,�B��IB�Y�X����unY�����4=7�1�H��#��\�W�|v��U5��Ǚr�2Bc�� Q��?qV֍Zty����t����z��R���\F0���>�̩�'�� c��̯`|����tP;�y桠�F:u8�@G�GW� �R�=�cŻ�>L�8�����,4_���Z��УZ������C��W�1_a5>~�s��l?�fʼl��+ҏ֮r��o���iͽVN��v0�`���o�/��֚>�f�=Ȩ���U�=/�־j�k+cIPK�����/
�4�$���~�}�D.�j:ٚUf��^Ps
�:!����\F�ժ��bp�v-_C�W�����C�d�Ɣ~�9��ĝ	��q#�p���o�r�q�Q�;�'����
JĮ�"��R�Ap7ٔ��N�����G&�:�Q+*�H~eK4�W���
���ΧW5�O�ƂP��8Q�3v	%�N����L��'��t��1t����T�ʣ&_��^��c#�<`�3�
6�ȷ}�x�6?l�H����d��y�P�ٳ.
P�1J���NJ�m��<�Z�T��<q��z�;S�(#܋^����X�1S@�TD�%3��"��ܪ�<��~�_���b��f�m� #:���t�P�i�E��*�M\s�*�2Ř�|z�)���#��pm� FJ<F����8[�sb��SiDž5���^-WϏ�^��7���Ic��)ʣH%8��<��a����#�J��W�6ø��*f���6������H}�]��B�jl"��A���%�X��*�����/sp|�D�s�1�'T�{Eȋ�~���=��1��]�����.�r�'|�{�Ϳ&]��xh&/�����0x.�w��X�1�'*?I��f`��;�|��F9�7ʱ���ԉ�A��=�7;��배��X;%�:ζǡ�OD��?����!5��ה��Җaz��0�F�"���M|���#8��@�
Q�8�O@1�&�a��-���LA�%�Š�.�C�o�L�?��nŌ�K]L����J��x�>����9B�y��8/�V��0���:nV%Z���&39;�O2��d6\uHI�~��"�=�L??q��_��b����X0��W���������=�t뽭��1���Y�Oe߰�VU�u�)�J`�n���b����'�b�%Ip��dP�@Y��7w�=��Yl�ףG��$��u���0�M|ԲTH�%��4]�I�W�������Ua�j/��C��\R�չm���fZ[�o=�'*W��B~��X���I!�xp,u�r�4uSPeB��l1)�Ί�X�A�tRE`���-��X��Ѡe�q�z��W�a�H�[.�sr�3�'uBls���~:�+��-r(�ɥEy���u����f��c��$;f�ߜ�F��xPo�d��'�dK�=7��M����Y��P�T�8�@���
�p�$����C*—C�6��2�PX]��_$m�f���p��Lry�v]����~m�������z�P��{�����"4��,��|y��{ur��@�����ol�f4ߊM!���2�g�Rv�!���Ԧ�{�O3y-=����z_����b���J�y�ʄ>U�	&��H��"SI����[f���0�+���Է�&��eddh��xm3Qh����V��g�zfe�TLT���F�T�]6X��^���/�6�~��v1a��.����Rޢ�=���D1!�=,WUT���$�b������:�w�.r�NQ�
A(�h���6������pJ�+o�J&��=�P�'H�ғ0�\����0�U@OfL��'7y��9�&ы֊F5a�eY,�O�)���(������4�?�Tk&��?��4�c�yzs#c���PV��c���s �Q�5j@�C"����t����qf:>�����$�)5fG>e4�8%�J] d9��kk��嵷��EV�?*l�
�;��m8������94�Hڼ��+��	w��8�R��DJ@!����u���.-������k�����~��y/\�����<�J�CI�s���z���7�;�#4�t�b���岬��j�^c�)���9�j�j��N{�����wq2���-A���@H纨��<W	��1�5�T���ɠYV�E�(9�zў�l�I�AQ��|�ڵî8�}���L�z<6�!��-u�+�
]~����*��ۂ��!*?6/�����Xm��"��ńL�P.�<+{�N����̳(Õi�WJ�{��p��V���H:YYysiڏ�ˢ�-�X�̓H!{�Pl=G8�'!�K�0c]�3v
}f~N�>-Ծԛ,�M��5���
8�OT*��*"{	ш[-?໭�K��}�pp�]
S��yO����|\�OS�Y������bny�:b�m���}��3��I�k�V߻��n�U ~`��F%��g�s�2쥲E���ݚ�hMj�y;��ɦ?�]�c�\g���x���1c��e�-�2��M��/o�I��c��c����)�X�u���Χ'aO�ĝ�����u�]�	 �2\,��W��h��I��u���Vq��i���b��>͠��|?;�lѾ��R��e�G�6AX�u$o�nk�����^�mf�B~�jf�"�s-�ޣ]O����tʳ�m�*�P.(\~"vM�藬��cX/@_�	L����{נ�;]���3c���`����sg�T�Ƒ͹�泲L�(���]"٭�F��)�A��^�� Ed���h	p��8��^[@�=��= .m���7$���Z[{� �t���:ab_�A��^����IW�`�K�X����"H��b��,�!���E�Rՙ�JjR��� ��[��i�������3�H/�u>C��V0\(C^��f(�ۏ�]�@�<Ή@���d!3�#�"c�ܥ�<F��v�74�=��hρ��n8����A�h�P�Siٻo��l�X2���P���rf��;�v�"�^�--hP$�C��#b�v��$3��k��)����"D��2T��v�����A�����>�V�\���E~�.D���$�=%R��NOG�'�mG(i��,d������M�pF��_��\m�yӞ�O�6�QR�vT�,��Y�O�K��C��"7��W��H�b8)^P}���]^��X�vIUlؓ���A�=Ceb����$���'���������8�[g���~4'��&��'$��i�9Q�W�Re�Ǖ����u;i7ϊ���K��(��6���RǼ+�)��ؔp���s�9��j�|!o� !rhe)v�ެfo�,5K���>V'0:oa^��J�¦��Ncjm�})Tk�ejO�!��w���s�잗��	��O8��e�
E|_�x�x�(iFX2�
@��V$&ufa��pryD(si��"��~�����-Y�y�M�D�X�iP	��vc�+��?��E��=�
��<�JY&+���'K�����aX�4J�Hi�Em
�GB��%�)P���"j�D3HsЩ	���n_�qt4����|i�0?�{�����������������9B?������d��Vf���
N'�;T��?KIo+� �C�Y��d3�r_�䡭,����ǎb����x��YP�������>�>'H�PpK��<���..�U���������o�WD�����..�Hʱ��
��o�b*)z��y$ ��q�
뷄�ouf�6�^+���̹U�65�hv1�����d���Kz�p�0�1��I�2�x1"��0T�3�x8���Ch^o(�
M�g���_�*��q�kC�y�e��d�#b��K/BU�!$���,b:��z��3e�M�ʃ����Km�f'��D� G�rv
�7xA�S���;�ʓ:@vг6���a�'j��P�P!�9�%�^�3��G]eR�3Ƀ��<po�c�l|�e��u5�r�����Q����][�T�݁�Ȱ���(��nc�u��K�Y����1q��J����u��yXZY��VLw��Xgʫ�J�p�GD�e ���c�8���Vw�����W/Q)*���Vb�+�D��|FD�;IE&1�J�T*u$�����͒B�r�2EaR��DƐ�rS���2j�[�Z�����V(���d� �"�{���FD� �,��l��,�i큈��\u&\����t�8�a��L�H/AT9�+<��>-
�us?��[h�&�O���v����8c!��H-`��?�?�� W��TWu)��&�<17��L�[�x���-��y�����r��-c�j ��@[���p:ߧ�W�C��<���w�=�/����4����r�'Zy������u����B��Yl��.m̟��`y�#����S� �L�#�!ͬ�^���i%�@����B/�b��a昫�;��+'P)���۔qt30�7���e�M��hi�ܹ��5�/�w�rl�� SD`���b�@�������gkC�a�%(�]���t�%E��U�ɂ��)# ��i�=�Y�eG*bJ���
�/�᳇6�|���5�\t�I�_�����]�!�*��Z��w�e)p`�ܨ���0x�M/��F.]�t��Š��K-�A+�C�S~jʞ_�&J�K����d	���!"z�DM�R����cx�Y�O�s���WRH��2W��(�99�l��c?��Fi�HA�p{"�m�+�]%U����Kz�M��1����^8^��E�ߛ&�7�䦽��k��A�[�	m~��A���".t\�K�6��V=w���YS�K?}��э���Qx�d��^50zlz�Qx�&�9$�M;u���R�j&>M�۲�E��5W
��W��s������|�e���=mU�DqJ+��>�)f��{v��%Q���xꆜG�驶��_�ɕB�����ͣ��QY��r0ht��Ny�g%����nΚ�k%��!޶v˄���==�̑�R�E	o��|��u���U�it��1	Aspd��]�)�j�{���~��*�;9��}˯��)�XZ����^-��*�X����9���zP�w��=ܑ���
�Lۻ�\��+U0�lO��t�rM��c�_�1�⥠k9Sل�[b�r����kh���=�j]�tmy:{�lϏ���)�[=|��ğl��w���y��������6��4R���o3�D
��80�����UH���)X�*�ҫ%��a���o"8l����L��FG+�e;���9��}2�
��F��i�u�&��S�G�$��9�
%$>&�U�}���p�U{]�O�o��*G'���?g[9�B��脢�k��3�5��z7�(��Bc6+�bH��
0�p�HM&��2����Z�[�E�?`�/�:�':��:u�H�N�?c�_\����#"p���DJtװ��|�*�.�]M�,�ok�y$�ӲSq]ݗ>Yi�nZ�~�]n]7�A���$�vd_�U��U<�9���U�m����;+�&M���*���c��"j���_�.p���,�z�W8��f0����HR	���ϝ��WN1��{X�Ԓ�؇
��U,���Y�S��s��r�,C��"�����*C=o&f�N$��_�~�hWk�|�|�3�����wP��sU�7�Y���:�;���r�;S���d���s��u�
�Q�����W~���B�'��Q�1�QB��p5J�S��'��|!�(.ɚ9[Ͻ]�R`��wE0bkpNʶ�4�m��\&�ӎ�Y���mٹ,�GF��w}�"5�L/��YL.��j�6��mf�<��`k�0j�p�o���@�?
�
��}��o��oOˈm�A7@n�)�v����&��T`�7�o7֎��C�����U������hC�<�ǔ�ݧ���F����a5=��e�Ǟ�>��@�fF_��F�K��V9�S;�(�ü	V�hyVV���>�J��ɽwu��H������\L����+��l��V�.�rc榨U�
(��˾���c	�k��_Ǧ�ʞ�
��o��|��[�#����[�U�����=��|1����L�]�`�5oѴ�F��V3��֟�:�P�`0Џ��rK\���
��{�
C3}Ӊ�G�q(�g����|&�: 	I0�b�*BE�k�w皺ݳ#�'�?�?1����!Yoc;��ڊpqJM��^���ԓ��Ůٺ��4pn��
�c�8p
��ޟsE��k�f�_)쮼nq��-�!��8O4c'ڸN�]`t#|�	�Q���,�S$�0[��M�.�u-��ɖ�ƣS�l<pޔ	^���y��o4�&��֢��\:n|7W�¦K���m?�T�zȹ�ctc]ݻ�_��4��—����p���!�{W;38�
h�����5)Ml���g�f_V��K�X�Ϲ��|���?��L�s����	]`@���U��*��d�G�ՂXs^���̬	B
=�����%g����W�uKg����Y�s�[�y���`Y������k���;�Ku�e�9KI��?�8�5�]{�6�-�S���Ӏ&�?�Rթ|Sɓ���b�?���p<��v�m�7�7�m|{=�w��0[[��}��>�2���jS�ܚ�r���F�ME1\@�MKm,Y���~�$���+x�I����y�A��E��V���ݍ�Dd�F5�{�R�k+F_"��N�5'\�s/��b���>
���D����_)�
8�
'��=�µ�dV�����$�ta *֌���D�m����(��g����J�E�I��O��k�SE_Z���#-Ӛ���[~Yo��c�d�jM�q���y�t��A̷�K�b�K�*�c���>P��;+��(A*�@'RI�XT��Gf�BAQ#c�4��5
�f��m��X��u��h�Z�er��i�o=��y8(��}�:Y�y��G�N
��J|J1�7�P�	�c6��~�#r�Y����x�u��E�%�v܇2��l�?�D=�`�^M��Ӂuh�O^�/X���`�X�mh4-��:Po�,��VŠ�#N�c�����.t�m0~
��J��lb����\�~�s���k#����i�������6s�u����X��l�6���1�"�3��G�o�ATʽ�&�#�]_�Y�T�
�T@du�^�˫'=8�ޞ�Ss�I*�;�{K�ʋ���x/
�\"Z��Pz�b�A*E�|��D����v�Q@��J�/2^8-���H B��PD
Vc�a�4�Be������#iە�rdH������$�<YCT!���*|e�ァ��N2r̸H��A�ҋ%*��g]���{}�@��{4�|{��{18⢌�yÿ����{3y���v5>G��k�d���e���E��z����?z"蘧��#����9�PfvP*ܫH�  �pۏ,zpiwꨮ�^�ߦ��F1��>��g��J��JLn}��QO�/�4X�No�������q��V�6X�7�O�D��A��`|<�"7��Nۿљ�n�f����u`�L�l}��k8��f�D#�\��]a�ģ5���w�/��*o:`Ի�p��_a��t�=3`����������"���;�~�Լ�j֏s:���s��Fx�����}4V���\0|(�ݬ���CG`��m��h��TO��CP�V~}�*}�
.���/��\)uý��F�QPҶa�����ɭ�MHr���O�ai�'��H�5�˟�lz�8_���࿮
b/a��˭lJ-~���\��-���0IP��MR�3o\W4��ډ�/솎p���{�H: 5���&7�Hc؉�:���~��@��,p(B���)�.$=؊K�*;4`�/J�0���l�_=EZF8П@&;���ӂ��.&W��L�P1��,`�!�!��#���l�O�D
D��S�1:�3�A�ݼ��;�tR�f›��(��ۜ�A9�t�C��**��{8Kꨯ[���$l���
Jn��8�`)�����辐�H�_L�y<�J<��!�	��+"���<�I
��	�2�
��T�S<�E��U6���t����1)A�?����+�ɿ�\����E9�7�y��r�J�aW-?&n�����.���_��+�;�laA���>��B���W��-�?7�ۡ�����N �O{�X�ݖ=��טk�Q��n#b�Зԧs]��6�8Ybk�\��A�s�VbT�ڮ��
�i�E�ݞ�e��:��(��+�x��#�L<�\*�e��)�T�a��"�>h(QZ��{�"*�V"���M����q~���lA��``<��z����5҅�z�
�Bx�`囂/ы�/t6��\ak�$"I�"�#�	aN۫��W.�=]	K����Di�gQNZ�`
Q[�|�rUKVA�f��y���t���$��D绚��[=	�ve��R��q�dtE9�ά;�C���R��[��Jz�Y
-ȃ��B���J���	|mmm���C�\���O�050o�rX:����?\�>?w�4h%�EZĸ
��x0�-`�Z�#ح]^���9�Z�o�q��KxwNU�ǰ��B��S4��T[�LHbm��#��C�r�X-4�x�f�'�I�n;%�)���؍�Q�{��^�/��6�����;�?T��T/\S�u�{��s�PE���j_��x7��L���и��ᙫ�ټ9烶j8zG?�a��k ��D���\rñLr�1@�ш�NPG�i��tZ96�N������8�b ��RLF�$�풩��I��c���אݷ�Z��4DܤM����
XjoZ�UR_Κ��^�.j��̚N��
��;BfP�����yB��}�;O���ng+��f��FK1�4T����b�޹�f�����YU��~;5U�Zn�ۿY�zEq��d�c+�g�wY�of���O�<8���WL�,Aa�[7�a(=�U�fo���H7�:��
"Ի�^�7#h~ʇZ�M�e(gƻ���������%�������H5օ��`s� ��Cn�o*�8��_p^�b̛�.^��"Sϗc�zIMQ]qvG[�n�	r�2N���{#b��}�_�7fCc�U2.#�.�-�K�t���d��B%��=P��z���\]����6�<�����u�첯����0w��Ӧ�:A����z��S��PK�}��ܷ�z���3-B+��q����n���,X5���$��
3�ox`:��	l[�#�����&h4�e�<"}�k�xi$I�n[�r��n(�
�c�K�ٓ�l��菙�w�j��n㼱?ې�1Xܙ��%�͍o��@Q��ecF@�p�6$;�DR�7�G�2:Za\jq@#�I��s�!�iHqnѮ[=T�p �O��oa\aVJQ̎��ÎhC���ʛK�W3�[)�W��L �(?1�[V�u#	�<YY����D^Y�I�&((�m��ҙF�<��bt�v���l�<}�״�����Cy+zw��l7���4
�`Z��k��D;	�6����ݳ����cC��y�U��VU���Ts���ی�5�a�v���R	�
�v'�g(9�%�ϋ����Ya.���ޞ��a<bܯ��,~���f��x"P�vLԹ#���6f���N��úC��2r�G$��	s�x��H��,Fk�׎��Q�F�k䅈���Ȯ�_��u������u]�A�B�W�<�f��rQ؄�G��ь�C�ap��
�y�Z���hn)u�����?�����E���Ae�w������`��ha�e��B0�N�w���1�^H�=`�{نڮ�LB�g���
%�O�ќbJs&˔�!l�}
kSw��������^wCo�cp�e���?a��n�z眳�ɼk��΅��E�f~�=�h@���׵o�.k<�ajl���]r�ۓ!<bw�WFaj�g-]r��B��j�
�8�^U�����em��|x�`}�&�s����Ӆ��832=��=:�@#���[L�4�ӵ��w�n�?�{�qs�6���^�&&�>�m��S9�&#z�`�l�\z�j�$rg�.vcn�����i�sb�^��Z���]*�U�<|bn�u�̠o�lkʺ���5JԜ�鳵vw�]^��j@FCg��Q3o
��	�e��A3#�b��s8}�e�z������
Oޘ�a�ӊۙ���!T,#_Y�~/��l�#�eQ�ft���$%+uV�)3F�� .�����"�h����~���u�3�O!�$!(������ߗ|1���0�xfm�ROb3�r,�w����^\��_�4 �n��]���Ϊ,��)r�i��2E��QY�K�jU3k#�|3��ftc~�P�{�|w�LhrzKC�� �6C}��v^�"��z���k0}�	���;�c�Al����K�d�R垦6�H�uVA�a�?k��2��p�q�� �P
�)����Ȱ�.���rj̹H�4�M�� f�+���÷�"_SٍX����l�ӑ�[Q�Q���q�J5�-�ՠ�H�y
��f�1�vE�B�f�'��' �x�4� yBB�H�!�����B��~b"!1�|�9ۭ�����M����x��X�;�ױ��K��ذ�v��M�0�3�+rL,�o�B�j��2ο�b�fn��Cb~�� �hf��V\<틚j����}'fԻ�G
e���.L�z�m�����4C
>�l���f��!��S��?B�c:?��8�"#
�B��MȔ��V!����^�ׯ!)�܁�O�H/-�(�m�um�9�C)����$�N)�щҿ�,R� �y��8"AI�]| ��Sg>��P�b!h�J�$�O⃰�Tpgu=D:!ćo!��A� ����_��#�I���j��.����,��E���GpZ�U�`���'��ͦ	��{�I�z�*�T<s���白����'�#4$�bE��n��J�GQ��P�J[����`]r�+
����>T
yB"B�	����c	�Bw�	U�%�R��*-�#�@�6֩@h3�~�9R�Ht��~���sY�ɇ��Pn3�tM��:���zEG���J�+��N{�k@v=7}Td�ˬ��l�=�-i2G�8q�~
�0���1۬���$>�b�A㲪F�H���K�%�	Y̙���fH�B�l�e��J�ѓ�;������q3��qAh$���>��@^~���B��ͫ�5mC�Hn��{�c*�:�oA{��,�f�9"��=�Mp9b^(���Q��Z��?C�Q��Sb���+�R�Se�ؖ9�YW�E̬�3R���Z<�%�U�,����SD�|����)(`Vv���`�s"g���J��T�p(c�u�6}t^*S�!�x���3;SY�D?S4�ddi!�w��@؉�{21B��qGT�7�y�C�Tvi%%j*����W	���3hxkq�+�G�`-P(�\f^������8�m{���L�	kp
Fk�q�s���XZ�l{Rњ8�R��V��s��hȖN_�K|�Ao�KMbZ�2c���28@l�aB�i�PX�Rr�e����9�$�"��e=���'s*���X�ЯTu
��K;Af��ofr�-O?�.�c�����w,�:��*P�
X��o?�f�i@��	F��!$�Чo[K[��l�j
m�y���G�x����}��A^�ωB���C�:kU�7�}���3�j��nC�A��v�B�פ�ݜ�&�癮��}o�+WRno%ʳ�T�+u]�F&�&w��m�\�C�����P���=��U~:����1�6��l�:*YK�?��EIʍ�H	L�߮laN����֍��u�Q�.]�@��`�
���uߔxPA��O��}M�M��Y��y[r-�N/�K6���7��o�c��U�/	�3G�Na<fU6�$�$5��l�G�|�����𧦑��.G��2����R���F.फ़��R���W����kL��	��D�3H9�RIL
B^Q3nj�����@��we�^�	S�I�A���^�~5 �t���!�
�ˮ0_�q�$E�
�&���D�:⃸v�w,{<��O��ìE�l�1�����(�G��r���u���e���:�&�L8�˱�]I��G�m"��8�E��,�g�PzC���Z�N����*���=����n�V��kG�)��ͭ�"F����*lltz�֓u��4�"Z	1�����n�{Q�g����)M�QF�!����
�y�(k�#��H:�.�8#/*��u���$�{\�)O?�~8��F�:܃���+흇=��=8N]ʠ���܏=g���Ξ��b�d4Ro9G��a��g3�@wb�>��\��S�o���$�h\(��;�9'c�I�X�w9c]mӓ;5�g�.\qxW����'mT0&�e���Ȟ��_hL{����"Hɾ0R�,�GG����~W4�HdW`ے�A�4b�f>Il"+m)R�X����)8�wue��IϹ��LB}� ��\����v`@��D7M�\E���[ױ���"2A�@�k? .�1R��Y���k&5z�4"TP˖l�&�Rߎ�8q�V{>#J$��f�r
S��IRI����"!�I�+���S�%c"��O����(j˻�Zv����A�#*G/��5e�ZO�=�K����'�4AI��W��[�&I���Nqb4��6m�EH_�i5�V��B�����!��T鬷e^Έ#ܪ�B$�q]��"V3��w���1Z�ޛ*�Ŀl�~`��c]Z	n�w��CU;��%m쭈������Jmp�bڭՑ��r�a(,K0�Y�a�Kͤ�AY���X���
O!� �	e�ea%���x�
�[����t�H��)�=��
���%IJ�#.3i{\��������Y���6�Y4>������N�֖�W�����ơ;N����Q!{[����Z?��,X������ :P��5���T��k��`�-ۯn"3��g�n�h��(�I��V_L����i��M���}�˨@�����Q�*��V����a�]_�ċU��w�A��'�{O�{�aR(��VUt��)�Z��y�S��G�P
Yg�9�[/�6���ǎ��J
N��i�eH���������!@}�#�\��"��r��S+$�g1	Bc�
;���<��|���wڍ�}�x �{��6�jb>2\�
�؊�jD�kú�X/�����eN�ƈ��{�{�*o��9=�J�:@dcDm�}���b(�7��� �$3~L5�Q�L}�Q�m3�V���y4Ti���s
f�B{��Ӵ�z8�"8��7$���u���f
��,�8_��v�ʰD
w�
�]�h�t�8����4d�,�T��l[Hq���:�:�8�8yt?8�#$$U�8���r�?��
�:q�@�)j@z�s+��y�
Q;�fk��5V�.B��\zr����$*�g��m��ؚ��ʳ���W��� �g޼q�)�
���p���D���5ƌմ���K�ix�j�k��J{��L�i�����t�8.���t��H��������?��ґ@���h�{��	 ��i�DP��ᆪ����&4#ǝk����s����,E��u��R�3QHOڑ-��Fj#����H��@M붠;6�SE���˘2_�=$GV5!�5-���g�p(^��J�����V��%QX�#����/~�BG)75�
�����{1DZ?����w��(՝&��dƈ�)%���4�M�@f
!p٭N�㠸�$U���B�qtYW��M��!}Y����=�Z�V@�]
�ȆA��1��c����!����$��6������\…P���a�>�gZZL���~賷����wk���N������"r�~̴E��D�o1�)�����(�P	Z�'�T�� H��	���Ifȵ���t�
Ufꕍ��������U�_�i"���W-s��N��@0���05��&�L���A�Aj��1���)J��nIf ���4p�j�h��n��k00�MB@Y�1�߁��q  	q��[�/8�tAf���-����b^��1K�;p9�s
XPh������ǘ��gB3.�r����p��ۜPE
2���(J�؇�!���3�B��EF[4��wYTSX���:3{��۱�0|�`��a��A.��r]J�=TPl���`�T�;����)��/��I_E;����9 8O��p�(�k�DIa`jg�,����*s,�]�J��ArDוr��-i8�k�o
�H�g�H
��>0���"�p�մv���!K0�����9����y����<����1������Y���ܲ!p�dM��>ٝ�j\
��\�E��ax�~>g�S����3GGR�B������3T7�/���1r?U:��wZ9�M)
��ӖRT�?F���ÜF�
�3��"�C
/����QAd�V�|�S@UCv�������0ʤ����R�I:�+Ro��â*�`x�&:��KS��3�Ljv�8�'P���&0����p��C�Ba��G�"$I�b>�+`���M�󧢰�w	���a,$)�@�bI�fM���Q~�ʥbF�<pG�C�	�s�zQpT1�:ˊ���uNG2��@�+Ò���k�n	�� ��#��A¿ h�R�[�HDʊPMV(�L�un��~YGU��n�p�1�o�Ӏ鍠34P�L�W�"nB�oLLD	����&5I()�����z(4
���c�Qǭ�5�k�	j1Gʂ8C=1��
c�K�A�{σ����0LjvJ|�Зs"�=t�f�EZ�å�<��+��E�2��C��"��)�����Y��"��S
���`��HnPkE�E=�����w(�S	�`�	�
2�w)�iQ�FS�޼򝕦&��|/
���|�	�R����蔔^��s�0?E
�ȩ���(?DAl~K�����8����m��u|���#FB[�j�P郼;�|��W5lZ�T^�Em	�m@WU͡��?�C�
�-���fޑ	��!3l�~Au���|��-5�:=Z�j,������z������.��p�x��J���Tu=�t��(|��ⵙA]�������xN��.ź��"�b���zT9	�i2N/�®\|ApG��AS�!'6�ͭ��\-:=��A_;-�b�YV��B�)LG��%�b'D����{'�I�'�	����EBa�H�ľN=��U���<t��������ya����ti;H�t��u$C�>n�9��iƀ�1�X�1G��
���B��R�s�<�Z�\r��;�0t}�������Y=q�ГK��y{�ޭ��<��I"C�^_=�J�9y���}�><�g|��uՉ&��v����d��fL��\�nc����uP�Ѿ������4��b|6,��06��������1����0�-�S��S>BQ�UF�gS��G���":�Ks�'��1
�F�������2O��W��.�=�\��h�h� FKYmA�h�'�� [}Z�u�s}��>���m��_9jo4���o@c���'E~�,U���v�X�r��Ǽ<���7�`z����W\1ܺ��|Z���Vj���ŚP-$�WĚS��G�\%Fާ�Z����6�y�8dxޱ�8u�)������o
��>�G���c�ux\u����|%��ykUdv>��;�D��\~���jG����&փ�$T30�Ẇ��rtl�����g�zT�!��MX-�1w����ʫ�����^��{s������x����x�3SR��#6]��] ��v�%��f�ik#^X��V�K��v�{�l��U���c�ҍ��&��L|�MN}�L���Ơwbw	��'"��\�<DP�)h�?�p[�;C�����-7��������+�mS���gM��L��~�a��č�ts�x&)���h')�n�6�?��6��,��q9VVQ-���]��\�N>v�tg�164w���mj���%�rx��߉�'vX�񐅐yK.�t/���2*JI)*I.
�J�պ�ZBg��*��!Ը����6W=;]=zD��4XIal�s4JW��Tꎛ��e�B��;jq\]�z�����>̎b�+6$�m[���9B�F�nQ5/�٠@�w�T�Y�g#0�ڌwS����#ҵ�/����)T�ok���g�)����o���l�C���f+��@�x
XZ-}x@*�3�`�*��4'7"��W]�Lj".�y�}{�Á^�����������&n�S����FA�D��a+a	b�:���j�S��v6�c�~��j��az�K�F/�!� ���L�fũ�|�F��Z ��v�SFe�pGSW�ˮ������*�3׹i�Ͻ�Eo::�bTc�l*������(lI2���J;�ۑ����ց�bd���3��,W��	Ma�#B�#�$�$(�=�O&�r^�g�f��y��8$��r�,�d�J�+Qv�^�T���7@��M�۩cn���R9�p
z3ӷ����?x�c
FUܹa�2��A�Hbz=��@s�<\5�Xݲ�6ٱ���P��Z�H*��!ѝ���q�Y{V��6�E�\I٬�pB��~�DK�U#}=�������F3cd�X{,C���MFR6ȣ;S�HX�.Uf{ATl����:Ó�3|�n�H3DSV
H�i�8Ac�iz��T̰���O�S���m�7=ed�9�2�y夰n��Lٷ9�����T*'��I>���3 ���옞���Ði���WVC_"|v��q�Q�.]N��A�~T����~R�P3vF����$�IVH^K`�8�n��5�_�-�*�L�r���t@J����lXS�I��,Yr���?��;OC5WE�(�˘$���0���S�)5�M��m@�����^!�2S���x`�.��}J�����|�A7�	
�m"�~O��4gHtI09xR`��h��{�XqP.o�C[��{�b[��l�Va�U�|��w�Ȗ�Z���[{��m��79�;.�s���Ø�j�d��l<�U�3b�(�k���J*�q��i#Y6>��ڔ7��6�V7��)���8T:m
o�����6�c9B6Ԭ؛H�.BW���,v��z:��R0�a�\:�"���T��",�K|a�g�D�5!�y�5cD0n��|�a��e����IR�2̔%�/��n�7�+���z�p�.-�� !2R��3��d�ԏ�R��q���@�Ur'�G*;�I6���4�l(!(�G@��6]x��#n'U��@���9:�P�)�C�#���t8�H8��4q��)8*�S)�Mʯ��Ft�1�
��5�v��=�����e��`k��:~rU�� l�3C���/��� �6�=Z�Q���-�6�bTxͧ��Bu�LRe���y_-<��WdZu��V�g�{�psE9�G$�$��#��#"�@���φ=:4�����<G��t�r(��Z�$�U�TP˩�j3��1�@�h�b�O�JO���H��+��"�n$��`F"��g�XtÐ˪��K�ѭ!jy���T�q����C��rb����(1N��r:�}Ba�9�k&���ʴ�y��0h��@2L:���?�i��4��a��>�N?Fb���3Y�U7hpw���z�,�K�ڟe5C�$3�WY����X#��>��G��Z��P�ae����0s�+��������\������XW��f֓�Po�0�p��eV��d��������81w&�μ���Xf�War�D�&�{�nЪ�-R��8k���q��qO�瘏�<&�A����f"�����!��ۿ,T�͜!;��C����3I�1u�� ?�XHN=O�c��
,R��s�?���dzIa�F_��ˈ��;� Pqk:�/���2����u��OeO���'z#�"�f�mb�/UΔS�������"3�Q���;���KI�49�:�ސT����bɗ0���b�Yv�Ȫ�7�6�3K��Z�,^�*P��ӂ��hpPN��Q���[��������<�G��%7Pv�,�qGz"λKyA�����l�ꅢ�̪����ո�vM�Z+(�{ZV�KHmKp%�˥�
�E��VmX�8��P�,h�Bc�$��,��g1�+��d��|$h
�>R��{, #Fn�W[O*�c�x�ؕt�	��Pj���ŢA?�x�<��-�46�l
+ӥ%dP�X�](��6Ȅ���1\�D��^"B�#ʙfQ,��
w�������97�}��Q@�w��G��H�T�@W%��P�ӥ0�k�tN���x��J�NI�Fcӱ�M��W�5�A�.g/!���
OSWܰI��UAL2��m�~ߠ�,�H�WV�38�����q�Ē�S���$�nnV64�����	M��܁�孪�� �X��x�
,�J`��x3$F?��aR�WR�qj��'8w�E��|'�r��\��+G��9�4�SB�Xz[�z���ܻ�K�}
H�:ʰr���ww�n|�:�X�zi%���p�9��g�����Αf�.��?0���#�9<8K��'�sq?u���}Z[�0��+�ɶ��fx��yP}�Uv�4ȮQW�,�VM��o%�=�|hT����f�v�eۆeph�()�����zKk9[�D�W� E8�0P����9jk�1���Ѱt-�z���c]|���*����R(��$ƚf�wm����)񖑞,���{U�즺���C�d�#�	cj-�X<ʚ;�(��Ǜ[0�h
�Lz&�`T�S��**�&S�<���>L	����-�h�%Q��6��,"�1e��!�>:g�mj��,���}���I��(O*U�N�3�<;	/��fw:��}:`��+	Yck�gc��on];�9h��E�}����78�cl�a'�������m�0����zA�p_H�<�+�G�=U�e�Ҳ.>���sY_�@�/mh�x��ϥҽ�Л��B������F�fh|���!ǀT�Ub��WAz�4��&a�<�gyܻq{����Dx˯�x,�@���{���7 ;�?�5�y���k�sI�ή����Lj�����Ch�eɎ]}3�����{�(��F�J�(��ZͶ�}CZ�¢�H�����)Y:U�<�yٲ����8���sL���3�*�b6�=j�Ǥ��,յU��CPB�1Oh�p�@��N�������q�GR�!l�]9|%<�zގ��Q��<m��2�c��rl1�]G�[]�lj���o4�˃L9F�����3�y�N��q��xy��ڏ�}R
D��hc�SZ����h�.�Uc�3�]�wR�}�Z�Gf��GZ�H��ja�_l�TT��/�
g&2��kH�3�9f��g2V����h�A�M}
�����2Ý��ue'���In����q_6<��oH9t=��u�_�/�*�a�e�6�sbG�Y��Zc'�<�@CF{���ك��鿶�Vܶ=
�9s�S���t]�a4�]��$}\&ROV���1(OY|%z�$��	-C�
dk���"�;��7�7��`?L���Q�XX"b�"
��^I���[�q"�?�H+_�V(�N�M�v�p&KONe��-��\{
~.95�P��̀�Y�!�ݰV!��+~�3��J�t���R�?-��Zz�
+~4mgT�U	JP�
�D� ����p
d�٤���{���+"�kY�R�qUW�E��MZ����R���R_�V)���G�Fo��px(�>U��DK�a/Q�bAr��}��G�Y�F0V�<�_��`��$�rF&�$���U�Blh�i9�&2{�O�Sy���{�W(*F���;�`V�ѧG��K�G��|7@�GwF���;���N��ݕ\Iv����ݙ3�x���ggt�W����=6��ҍ��Q�^���`�o}��g��p�*�A��cI֚=���%Z�rm9Zَ��5��꽺"4x�D~�˂��Ҏ�!��0��W�u�����?Z�h�2��2�x��g�hnE��~���k+[��
�<W��@wriQ�ͤ��*��3�:�;'�f��Q�A���_�X��.-t�Hchc�J��i���8�z���!�|P�K��B0_-��n�Qo}�?��*����叭h�kk�ݒ�wl�M�ǣ�[���3�<7d5��.�2	(l{
�`7@q��u���Se�0ʏ�j�{n���6�HQ�R�e�59��,�)zm��濁X���ۮ�j��jq�i��E�͕f���M}(��]��{k�=������*��B.�����#�`�d21Re�<�p���<W6�j�~a,��!��M�P�Kt�)Y{�tL3bB�DU$�pC����ܮ|¾⊜Z�#�����z�K��BB;o�q4�.�vS]��䜔+Tk��F�"ٕ𺭑{�:�a�lS�IUTu�宊P���>����|
	nC�>�e�@[��h��+p�<�X�2m|K�V�k�-�
ёE��XW^�)s頢j�|y���$5����4W��T��*�b,����������'S��i�.�{"�{�l����%�\8�O\����'�xƷ6'|lC,t�����,���pӃ�x� �[�(f
0�y�rlVJ1����y�挲�_�R��y!!;�Jяt�2�K��t�x=�kgK8���w�H��͹�B~�E�����{��C�s
2;�syI74�x]t�o�z�9�k�}���4}�%ڡ��z���$����9wA/�⟤�
N�����G�A�MՊdV��1^��t���XY��)!�fi-�����q)yg��T�ފ�l���:���SE��f<�s�=��͏f�(�������HS�5
�q��l�\���;	u_Fu��]�S��φ�S?b���tsøޛ�ǔᗄ�p��<I(���ez^ׂ9�_�Á�Aą�i^�ђ�4v�����d,�����A��	�I�����.�<��7�;��*��*ٸ��޶��I�]R\R�y��i<N̒b��V��w����i�4�Nf��O��!v���(5.8�
4y9��s�]�����׾^����4p��^
�ʼnpC�A�/�%N�)��3E���_;3�6ZS��lq�^T!G->���v�χ��T}
=�^\�	~Z^��;�_/�m���W��ҕ��]�������ۙ�]K����xL�I=�\�������>�y2�4]$�_���,M"�H�[ᖄ��!A���NW+\=�����x���e�����[�8Qj�o�yy��W��4O�M�Zv�Q_N��F�ma��8�5|���^�G$z�!-�0V�{ҠH�'F�����i��/��<n�>����@�ӟ�-����Y ���{ađ��Ma�J�pC���E����[7B����ߗ������Up��H7ǰDV8+b9�<�<�4�|���Kۉ!4��T�i���z-p�e��SR� �/�T����ߑQ�+���e�lʵ�ç����]�a����j��h�b�+q�|����8������#��=X�j����RgD\WMe�ʮ�
�,pW��&��oηX�Q�)�g�Z=;UU�m��Zmf�ZmL��O���k�o�7�x۲jgˏK���٩v;eߦ��%>>991A���ǯ�?/�c)�O,+=�*P����vMD�GV��E�V���9c%F��b�X&��A�5�B�P0�=T
]�⡂������]����ճ⩣O窹��Ts����ֳe���o�H|W}WZq���Q��t�wz�\X�����#�;����[2�*�!gi���E���0a����6�<ܛa�;М��r�6,��4/�&���1���U!~�na�~%]����W���x�5V�Uyz�%w����|���DkǮ�G�������ȡa|=��%�,m1kV�Qɞ�Q�Z�V&'��me����O��$�����6�B��ۍ���#���T����mP'�}��V�N�U� �H��ԙ�V�E��В�]2/��Q5�~����$�?2A��Ȗ8��/r˄&	��`��qO�Z��%=5�n^�AJNQ���v�3�]b�?H�.ڗ��.t����ߧ��2���)�/:��x��rY��K���}{�(������Am|�c��&��m�뽌O�K��h������W�o��ض5���p����bP��L�׳��D8�V��B<q孷>v�z����
�M� ��[��"�w�7�CcV�	�<צa�蛟��Se��h��=\�X����G��N�����?Lz��7�ϡ��‘=IB��n1�J3ȠΕ2�"��VR�t���T��(����6���}��&���o˽|*������tn[��˖���}�K��%��d�7Sݭk��Y�,7��Lo�2���5|��xI��Kɯ��4z��Q~�A����O����n������+Ɏ���֤�$ݾad���q�Ԣ�������&%,��6��+���;|׆tf�-�A?癦g��#�|�b�z�ԟ�x�G��۞9�̨�c?i��:�}����}�r����Ǐ����֏������(Q��XF6]����e�p���2`�d-s4W-�e�p�	I5�؀A(�X�r@
���������9�`K�|"e0�&	�*���P���&>6��Nw��"0��k��B���H\��s�G}�-��a��p,�M`h �ϭ����?�15� ��r�4#'aO��������[�o}}���rgTx O��?�����oܛ��|8fg�?N��y
n|໅��<Px�w�} �Mf4����p��d3�����O?��_�:9�����کS�4�b��'V��E�p�@-z��t���]�{��ЪIt���]x����Sd��)\.3�*TJrQP*W����EpH�n�݂Im�Q���N��g�(�
ۉt�&&�3]2�X����r�3{���B���%So�&2�Df�Ԩgn�d��/�e���tc�`;;�45��L�9Qn��b�<�,��$i[��F��7��٭G-��*3z
�b���T1��@��̎��؟�u�$�F�n��_����&�����ɕ��S��Ov�14�	J�1A{&Q*�\l���&�Mn���1K0�j��Ϫ�7��DyX#�7*р�*0�.���'���2)�|]h����!��co�Z��Ef�*��q��j�5_��:��{��?���iUk~ β��c�m`��`��F�c��(`Ae�
3�D:�N�8~�9���,k���;h6�Xfb~��e��&`X�#<Q��gȊb�	���xD$>�SQ�!0
Ϡ�P0ǵ1�h�q^'��K�h��3��3D�edSS8��t!��YKt��ON�g��/W��������Ƴ��Q�
�Y�1���"�:�,��^�D,�9tYX_�X[R\u����
�~b��DlG�����_w>y狏^}�//���y�iο���o���'����3�
�0��l���h>b���8�Pa�?�rU?N9N�0�^sxA���ҏ��z�;c��[+G�!�j�r���6n[|����V1G�zl4�x@�,b�V�	�F�À�`x��,�>zE�����h�\���(���5+��m��Va�i������N�Q�}��o��g��M��q�QI��&
+���8C����;�O5�۽{��	C1.TZ�J�.oω=�.$�Ĺ��1"�c鳭p@{�뿑������R�m<}T����v%����^�`�5��F_����ޝ���uL/���'Q�����t�?�5$��@��t�����ӛ��gb�ݓC�����_�9��U*A
���6�]�j�<[��Z��Y��A��ݽ{w)qK1K#��򩂮e�ߜx�[y�"o�5~6�6O�n�늉[\��	��B�Q������u�%�-I�;?S�d2P��y/��{ќ�gc;�4��	"ѯU��^xl�/�[z��D3i�=ȩ�|���0��h����1pï[��0����f�gn�ȳO����U�5���H�q���^�Z7ăs�o�'�DiJ���䩒���io��>�(%�a^\{��H���rlA�;��^=��	ߟx��ժ��?��b�;���jr*q��K@d�O�ֺ�_��v�w��R��/����?7n�O�ʳ�k�XI�&����Ws��{n�����C��}��0|Rw�f��߆G�VgX�[�7�-~1�>;$`�`��Ԑz��OoL�q�OO>��LNm����.zD�R�0��p�PD��L��.���1T:X��!����X^��76F΄y,��5��͟��<�L�L(�EaR�0`�3�8*��Nc�Z��%�ƒ@>�4��pG�"�k޴n8�w@��MU�N!��w:>,�[�#=)ڷ�4��I�\-r�ڕ>p�#@_0^a�Z��jO6����6�e�:;J��V!�����m@%��H�5�K.��d3a��Dwlr���G����Wq���DrN��t��frD*q�O#ד�K��6����&����o~���z]��k��"�8{���3b����+��3�����i�50^~M�i"��$ ��������k�W��Ͽ�Q��8C^q׈o�|��ce�oT�х�[���߼�BS�>~������u��Fe�� �p�|�6�"��
i�O��}�V�9�e��_�V"�1ܫd�j�����4�t�^�0q���n�{��w^}x~�}������{g��ۅ���=��n�6�?��=7��
�?8Կ��{>�_�`T�b����ɟ_)>�{��nhv*��䓽�^��2��x��'��}��XL����P�Q^���:���`Z�ο��}b�c~�$?���(g��	�^8�~��]������0l���:���Ā�Z�
�^7��VRI�=��U���]pj,%Hgl8h�V�T5�Q�3[y��Xh�bP�с̒�d��ɻ�-�!���x�}ȕ���D$�α��6#0N��;��^�<���.[lZr�M��k_�=�f4��2�\�¨l�g�C�;��Q��9ò�?�ѳ����ta2�E��5r��z.?����d��V�t9xpu��`����B+�h�e���y�D���Bx�py"����F�cw�l"�>�����7�3����*�WR�ȣ�3J��d�f#�^O���6�s��+@������Y�9�ц����Z.�o�w��/�f��f���k�ehK�1�4
W�'b���+���
��P��#g꟢�|=�OC>F�M铿E��H��o���{��o�O�Zk���H��[��^��:��OE�o9ã3b��q���?�*m
�����P.h�wJ%�_�.���$�s�:�K��$���%��'�U�h�����़�⤄�����X�nu�Z���q����S��M$�$���X�e�'�����6�=��RzѶ���h����n�4�q�S�k.��nw����(��Y�;�;�(O���H��f�-��:%ߘ <�Jd7['�i�Wv&
�o���.**ӊs�{�֕�7��^x�L�WbG�j9�Q�Xx��Z�{�N�f���V��/}��q��	c0�,:�s0*��Zhs�.�a���ګu�[�6�׎�_�ɮ6}�����������V%Ε�h�b� && e�Ӥ	�/~��h�����Fc�|�ga�]�y�b1P����
�x���n��p�g��8t�����W5ps�x�'��ǘ�J��n�������EӍ�M�����,C].Y{~bRT��'���9v6>�;.�� �E=�sM]!���WȄ���<muUwɄ�jV`�s�8��a��1��ƛ����󲲨�'ߕ���Lk}�
�3����B��#��>Tc��И�Sz6Q������.y�×���m�#�m{��x�c۪2�3�A~_n�F��`BX�.�����<�A��0�݇���aV�� ���R�Qt�\$��V�=�g��ay���^�v��E?_�R�l�Nk>�95��1��+��1�����%����$�`Eb��ψV�'�*���7�/-�^�uf)_�y��1!�D^�ؙ]��[�-�"��nlB.1"�������N���RB��|b�PN�(��6/<_h4�1�V���N��m�IHŻ[���-$�D7(w�VPF�Y-XVղ�����g>d�����Fams�y�����ŋ���d���_.�2��a66�Q�^iy��V�0�v8}B]m���x���Cp�I�z��H��rL+��6	�Mtjdu������Y�!q+`�/�$���FGWa9����d�����MY�d&!�՚q�eX�6��E�6������K�Df$NBrV <�-�2� f%A��	�+Ĺ�D`%ˆ��G
O,>!��0�INF�[�;�	T�5�GɃ@sg�h�xTK�}i5�d+�>�(�.\���x���F�<�q���O�<��g���Z�*�L�p*�1̙v�-�eX�i��2�eފ�|��(i;�2��+;����6�Sn��`�-Ŗc7�~�8\0�/�y�U�d'z��xS���#&	�#�Th�CC+@H��d�T]�i�y�����/���5���~�{q�K��	����x�����)2K`�	\3��_�;?�W/TϪy�赬v�x�
��S���Z����	l*#Ȉ1��B<�/���Gp3l�0O��>N�,
m���!��0�Z
��x��r�!:Gff�Y���
��V��P˜b�0,ZW�T��K)�#�R�^2D"'s�����aL�����m`#Q=��7Ao#���ص��4���F�"��D�L�CD�IK��ƃ.pS��*�*d�";��.�bh�[���cZy�С��66� w���Mvԉ���sj'��K3���Qw3r�͘$-�Q�d�s��*�����\17�L��M*�sK��@�-6�3��1ZF���C�,�hm=e|g9Kn��0RuBΜ��uP�XmE��J�؅ZU��V��.���+�V�W ���^s#X���*��v�F*��pr��J6�~�N�H�4��	\Ϳ�
/�j��ݛ[7�Fn�&׻����v��{s,��+�fX�>�	�B��q�ySc�9BPL�0e�����S뒣���1U�����<41�[�=��Oj�4�!��ݗѲ��'�U�<28J��o��hp��o�Ӷć���f]�{���]�"<�pV��?T,�2GC;Ġ��SW]��`(�a�/�>�m�eM�l���s��~�mG���'.��;�'�/�h�o��-9O�b����������5�IA�C��r��1��==).P����4��BSTћT�$u�Z^4,�X,W�v�R�c�+��`�J��x�'율���d]�E�Z%JCb8a�Ŝ%&�T
�;J
w�X�'�ǢY���7I��9i�)�*4IpXFb�hQ/CA�,S����i�l���x�����Ǩ���4�P��Q|g]��a�!���0�(�
yy��8by�fsT?�lk�l<|��h���yɹ�?��ɭ�O�61�.?
���
9�V��b�+ @��p�u7z��������D���E���N�ݍ
�m��?����kP��
��*������zl�5|���SOA	�����Gm�&t��� ���4:�!�@�3/ij��뻝/0�i��`�XG�a�E�a������_�u��rh��G
�I�	R��r�ݶ���X,ͷ��0��,�B�R�H��DKd��z�&��1���
�������}a�-��\����U���E[x�6�@g�{�\{M�}ԛcw9(��@=<}��3&c�p�q�<�kC<��-4��ܫ�y��:#y;/��ˊ�j�c���k���V:�O�K�$�J�#KzJRDA&Y-��)��SEo	N�EM�S�
�Id��i*��8��l�߬��9t� ���aJ"KxXJ�18E�ć���_m/�3�4Y�5a���LAQt��)��>�Hf\�U��"��cDN�5��͸���,�F�
v¶D��I�
����<͌#+�
�aI/��۲|�w$}w_��w?M�!9*G]�uY�����O�}�Λ$��5&�|a�U�aUMŬW���W<X:���	�SlE��AH 2�Y�o[@��5��r�*�/@��&]�0eYRM��ģ�!N���A��.1�$�X��"߯��(2���d�r.9�?-�&��H�D0�	�I�&Ø#qކ[XQ���0���i�f�q͕A���gz~"�&
]A�1gy�5�T�D�>��x����0eY.��c=�)z��P�o�7���X�]��|)4�����j��#�e��G�}�ڰ��.�O��/^����X@R��Fc�B����7�ܖ�����Ű�-��67a��OT�U�O��"�rI��J�}�<H��0�EP�5�[�����e nm(߀?Z�
�V�bu�@p��!��͔1Cu���
�i���
��t�՘�����x�Ւ��ڋPn�x�,oˮb�i���XL'�����Ϯ��c�|�`JO��Vm-n���"�"'��7�n�t_6%�7u#0\�55_��b�Oqd�&1.å���oB	�&O>��
��N�<�"���\}���{�Q=�
Q�4]�-S3
ՑmD�g=��</ZK�%��Y�#_^Ń�x6�0G�i�pi>)����v�k覝�,)�H�,1L��Eٕ���=�@4%eĞj�NƞpAs�	B!k��6�P��F�9��u�6�~6�v(�z]����~�QB�U��on�����[^y��k$O��-B�����j#�	���K�N�N�k�
��l���:�lv���i���+�@�9��F�H�I:��LhN�r��=�$�X��k�~`e�>��_E
��î1uZY���*�
�z
����b;���2cIЫ��U�qy�E'E[vT�ƅ5E�D��G�$�c�6�_�e_T!�Sߒ-[x������-��5��H:��f�s��t�A�]�ҥ�kUQ�M���b�uh��xd�~������Zk	�0���G��o>�hW���;;^�ZR��>+���~�L���1g׵���P��o�v=uwd_9�М�t�]�j���fgH]�3~�g�}����G����,wȜ��q��*�y�|�nR-&�j�u��JiK;m�׎���whd1��C��S(S�*�"j��R�E��y�{�*9�߭z݃���zy_�[��@_��М�7��+�w��%�r^��͈���0�ة��)jQ��{xIKMqp+�sk�)������t���k{׌�����8Y��K)Ff�j�(V��n�[<"�ڏ�0����	AqQ�TԚ'��0;$��Թ�,���:L���Y��y����K&�̙LŖ�W�1w1��
U�aM�u��x�~��`�U��S�ܕ� �:Z�oI:Nl�?�8��[1��{��<�#��m8M��k��=�=���Q��q�cA$]181C��v�&���@hz�`.�xQ��(c5e��$L̇�c �0�B��y�L�x��I����2�׼��
���+*S�F���@X��s��|kX
F��Y^VU�Y�g�R�D��Ih�/�8�령L�꓏+6Q��$��[�8�	g����.�qSD��s�������ܛ�IrT���o����K핵f�V]KWU���5�F�IS�F��QK��%0F 
�`���X�l��6�����m|�3��b�>����|�l3,��[�ʼn�Z�gF����o�+�Ȉ'"#O�9�w�T��t���x��c���<\h���o~,�yd
���<��&�����I�����e-,"bvq��[H��`���uWWuL-+�\H���N"	��9t� V��ɭ��N�3�b��Y)`�tfpS
M�Sx�Ğ(�M5���YE����T���끍2y��g!����O�߭<�}�h��5C�nPnW��[[�i3K4	�+X�Y��u�l��(5��+\����&_��8�_���2h�X��QbG�[l�4�i�T���L���Ҵ�D	��fg���l6�A�+~WC�\
�e����3�6��v��i���G����>�:���g���A�g�v�ee�Y�l�ߓO#��A?,J2o���DԂ�hd��@<ފ�*�&-������}�,�y]z�.	�#GIr��[��%�7N�.�7����?�QSC�P�'QK�uOh<���	��O��aa��e�/��/��yԹx5�
��ۇv��8]G�m���_r��k5���5a��������<��१]��a����(�2����y@*Z����X�
�7Њ�wu�9����x�H�}�Y��}�е�ٳ������C��_C|���K+x9��+�<ΐ�a!gY��Xw�~oW�&ȡU��#�M��1|&4	�,��B`?�g(k��jͭ��Ԍ��ُܮ!
��]L��׾3�kht���77��t����������4��ૄ�Xuʅ)Sc5�����zϝ$a(�%6Ν�}��A�02[bT	�/�\�7�y��g�;8!`ab�Ou���Ժ[�O�?#�DA�\��=T�#��g�Q����d���V�:�f�����<{��=õ�����L��{��`/l�?��n�� �k6��$�m��g����r�]p����E��}F�8�Z��O
�]��*�U���5R�Vg'����[[�=�EԨ"߆��ZmbW;{��$#b��?[[����Zێ��eW3��F�@ˏR6t�?��V�U<��a�”��z]�b�3�u�qϣ�`�ݽPx�_���hر-br@���2�|�|&�P�ɓ�����d�s��s�?䵌�]ϲ��Σ�P�I�2�mf����c��DB�w����%� Z�+�e�c>�7М`Hx����?=�lh��95�s�"��"7��Ѣf�L� /}�g�u�T��-,&K�A��ƁF�=S�x$r1�&�Y0^��?aU��J�ʓ�ܯD�@^��Y�#�����"��ۇrpA|�t��g��؂�ۏ���oV���ļu�N�9fjX���pB�ܹ�"33+�s��T��Y��A*L[�Gn�����{�tEО�3{fR�ٹ<�l��E>5�D�7\���e���վ[�ݢV3�V9��
�k:-}u
���P��H�z�7�͵յM�.mlt:��B�8�N������N��m�7�ݑ�%�S�A�#!�Z��`R�FrC����+��i��33�L[���"�黓Xn
yxN'���h�|��x�#?ԛqi��_�l٠F�#b3�w͎r�F���SK�r������+ �$m#Z܁�\�n�5D�)�~��W/V
���
&�<��8�C��.�o�������D��tL~jz�1,*o��#S�7�
O���}����Cm���I��n���3o5�0o,b>�3�'���%|�m`��&�y�:����|��?\̏����Ti���1\�N��O�񻑇�fs�������V����_FV�g�~O?2�)Q�}���8���ԣG�ȝ8�Ns��(��8T�rO�҃�?��'&3��85x�?�2��lÙ����	r���S�<�;q1�q�@O�~��C@�
�/A�|��!�E��A�e_e�R��G;zG=|�;��Z����T�K�wM��!^ó�8�$'9����R+�ds��j;����öz�S�_ӽvŜZ�$4<��#�̬�PJ�IV����F��!� ^&}����}����1�V�`�JH���;��'��^��)��%ɝ_/\�q�zJ�è��".��WN]�YH��Z!�h�116&�tY
��L-z���dG0�J���
�ڔ@���r�4j���FM��*���/ަv
ڴ�0��/(�+�]�F!_׽�id�!��+TbYܪ��<�Sq�����6ym�P�r�]�5���?I���l��ݽ���U$
O�	EOo-M��K��E�M3�/�|�����@ �(i��8h|�/�b	�9��Ι\�C|�^8�pš+�7h&�oH�##-*+���4��kkD��4/&��䇭l*ZE���b���);�۶PK�<��E�S��f)�⯮�鲒�d�Y��嶗�M�n�V�=^P�(R�Bn:fF+���X$��T��t��I��deկCa$������+�"�k2B�rE��d���j��
�e���1�v"
�������|@�*�2(i���-r���:7G6@��y~y۲u��0��W�>�6�=���b���^E~aT�G�Y��-�ෂ�Y4a�^L+�5�&����1�ن�x�]�4�r�xl���bS����1I5/F��̥-Mt���f��c5E
tZ-
Q�Uش�J���iN�����R	�u��F#\*��+
�k
\J�8����drF�K����E!��'R�u�E�Vu���&V��M��ܛS9�N}F�������Wq9&�	�:Y�R��d׎��PM��p22��BR�̉��ò2�G�<��	���e��Pʳ�4O�YW����WlK�R��{?�<�r�\9;SŤ�;����9@f�K'TԷu�Q��Z ����'|c�����T��;U�(�_k�&M��3W��~���KN��R����oJǼ��)j�Z��-Խ#�*��H޴a��t��Gfu^#��Dɇ?��A�%W��1�%<���a���j���
+:xW��޲�,�d8�9��[\C��!]7X���g��˙
��Q��������h����b%�A� �.W���{��ݲ�W���w�|qjeq��1>J�bKVqC͠jD5BU���yM_�9@%�5�E]�~���cN�@�N���bx������r������`����7�!��"�A�`��.��Q�p�
�Sl��g�bx�<��ψ�u��0�g �;fcO����&l�ͣ����1�ь賂�!(7p�ɜ��9NX���<R
����!�$���h}s~n	�M�(�c�6- ���}D�_�:_S�V�u�Wy��i5UI+���4�~��#���'*�?�T^k�w໧SJ�gS`��>�)���h t&J'�6;>Z2x�<EJ����3�Eo�ߎ.�
^ļ���Q�{�u��S�O�-��'b����d-�����Xc��O栚>�c��|J���9�S�fY�RT^�ݳ�9�}�-������n)G ��
"�q!�6�P@��Ϲ�0ʻ��Y���/n�s��;-��ż���)�V��n�>��X[؂����Y��4�c%��rf�3����b<m�x�13̽�];rY��hQS�t��S�D���D
�C�0U[�$�#�ˎl��6'Ф@�>�y� ��"��6�el��#��a�L�8L�i���e8	׀iTv�&ϗE´$貭�P��L�L�U�RMW�֌�Fk�.�	j�	����TljԯV�U�"��W�lt{�õs̍�=�F���}x��5ԫ
N�H������-17�/EV�#�Hԉ̠H�!�ܮ�q��õ��]�uQo��z8?����no�ڰD⼃ ����C0�0u��{�{�6裮��j�ܳgq���.�O'ȍ��ς]��2�Mp9�9�&0b�J�q����p�
]���ܵ��lZ9t�h9�MA�-����:4��Jp��|<�&B�?3�xV:��g�qxP�|��L0czQ�a�j�*��ï���o;���
�	�����	������Gj�#�W�a�k^������J�F�~~*��r-"��9=1��	��?<1|����SD&���kT�DC��jd��-C�d| �Lyb��l3��p�vi)�R-�z#R�wy��R�V?~|��Z۞^(\�%J��A���%���T�h"����y��b<����Z��OLųg���ٰ�0��A7f4��q�Q}���w�_��7�Y�"���m"�5�'�qh�Q�dN���j	G�rf��w���W'o;��{Q�
��ɳ<Y�6I��(GҬ�4��cS9�d����]���0¯����(f5��=s��Bsgk������ X�w�������ĝ�O�I�?�OP���m@+!���7�:�&șa	�����3g�:Ž.���V�Ez�z�:}�*�P�*�T�F�\�?Ҳ
�L��P��.t��`�����+��{g�Z�;�"u��:��z�T/J!w�Խ4mk�~�|�|}Ĕΐ�7n�4�)#S,4B�o��l��V~t=�v�����ӕB��{&Y�)H�2�Y�IJ���;�<�!�!F
	�~��hF����dIx;�Fz���B�ŋ�P)C�d�� f�n�	�2�L4���	�`��F&��4=���^�*r����ކb9W�W����j�z=����UE��*����z�#W���j�]UY��^��va{��5�3�W�x3S��MQt�ժ$��g2�I�}����bd�d�[��wP��zXɆ@�9(a��]�|���/g$&_����%�h��NbCΠ<Ġ�<Y�l��V���
�QB*̠ԭ��p}�-�N *��0��7���LϾP��'�I��&	��v,Y*��ؗߨOBWgظ��bұe݊|�}B���G�#��~�!MQUA�Ccu?.}�*S�D_�L��`M�S'�o�6T���r�Q��To��EA�^0TiߓOVn]_#��#�|��+�f��lAPUE{�ɪ��!ݏ�_��>�11��Z��^K=A���E��g�ߦ��u�;�_R�H��(�����:�^��B�o5;r��}7O&��i���Pw�^�Ė��� !}G���6�g�>Ļ��Ny�\!/�ao������x���!�w�Dc@Ho��<}�ž�^���mܩ��^CO5	�!�T���+(�L�1A��,�B��.m��5
a� �v�u_(Ch��M��i���Y����K�J�����QD�y���F������"M7�����%2�^�t&1�ltw�AӋ����f�B�f'�� Ql1�sׯϸ�S�Τ,;F{�#�g�����mwf>)B�݃���9�oW"�2{��
Gs|� ���]ؤ#
N 1
�/dz�A4JZp#B#��^e�U51"QN�!r�c�zL��;9C��y�Z����WK<L���#1YE��}:����p*3�
��+�$�զ�*�ՈsbUN��^'�"�_))�\x*EpW��Oh<�I,EٹD���𯑘c�K��k�=��m��[̲�n�������l�ȉ��Wb�zL(��=�!
��FC��f�	Eg��?�3Z����I���1@{[CD­%�a�h������8�����xEds}<��Ǹ">c9�(II�|Q=$�A�-�bUJI��^Ք�u�v*	QfǣJ�T��7$�2�f�ED��L�5^�G�۩WQ����~��87�R�,ިp�!�a8�Ɩ�o@A�L�v�^_x;�����_t��967�;�wn�����*/M�/K���(s��#H��mo��X|�������b�ǧp�%��%=��o���O�c:2�>黡�'�˶���%�&�"!|���#ʃ��AW}<o]�,�CEܛ~���e�kq��I��D�A���	?���&:�d�h��:�X������k8ĶP4.w>��B�"�B�`Mkʚ,84����i�~HN�'�D�A���S�U���zr�ԅCM�h�+���3�]h��<NM��Y�gBkD!zN�)�G��
z3$����<��!R.�ܣ5���-j�ڏߐ��~l�n�nv���7l��0�_�,�i9�`9͎S��ca�9i�X!|X9/0x���Wu��f�y���m���vG���_}�2��u4,�wv^�|�M�LT��i��0���5g��Gf�Ez��s��z��Cs(Y��~Ξ����o޹<�5*�u��swl�9�����sh�Yu��ty~�5T�
��� &�'Y,G^����kzԯ�'/X��+�HP�������J��FwSWR7�%�13���%T��XɦQ=y��1��6�{o������5\��9�%\�8��C�u�Q���l��+���T��B9�Z�{�T_��Y�Da����Jy�[��V�E8�[��N$���}�x�{|yo˯�X�u!�-� �����o���JD�%Ѕ7ا��J�� �<�cp]3"r�������V
RO��erU}�^7��+0AM��u�Q��Y�p�}�$����~qd��z��`�����+���!|h6��p���@t���p�3�����N��H���u�1�忞�x��Fy!>uw�v�љ8Y=⹡����S	�\��EVы	�I*,������"O�rH�m;�[�ض��d�ǤL�l�t�/��&���(11I�-0ҍ{��p��|�I_6�oEd8Y�qe��ei����9�O��J���L�OV��1�)�z�K�{��1�#�-���K���O�h����Q��He�'�aH�E�U�[ׇ�O�F���x�^����6�ʺx��'2 �����
=�x�Ra<5�?�<ޛ�#������}U�������'С+d�/c16MJX�!v��	������95bZ���T�eF��ܸ�,U�E���§qWݯ^�FNz�,&�1'����Q��X
�`�1,t�bHؖIQ��46(��bY���/n�	�~�x��d�иr��j<qc�4�?���������t�S��/�*��?�c�	�h��{J��$��'��W�#�?3�d���M�].$\Hݺ��U���K'�ssݹ�%ۯ�X�]5M,�㱼�K�JU͔ⱓs$	���džt�,/����c�m���A�[@���˸�a��kkkz__v}�4:�N���|Q
�8.�j�B��NA�z��"Eb4��pV�Lv}(_�Ɨ``�nj�D���Q`�EX���J�ad��Z����������;6-������VvG8��Ψ$�Æ_NjZr9n�$E�by�u��E����4�n1�P���/���ԟ�ɘ=��8a�q�NK�۱��r�)EI�ݡm���"�]�d�=���X�@S<���t�0�����aM�59��(��ј���D�Z����r"bV�^NǓ��0n�g��dKa�l��/$��D��jM��L<�u�a6��wi��*{����[�r����r �~��L���(�	��1)��>b�xzَ�#�rH˓�.�D>ʒ�^~��Z�@z4�[{��������j�O���
�s�Sݮ�^�l�v�׼�9���ޯ��=j|u.4�oKl-c"��([��z�Y�ՙa���P�	�C�@���S|l]2b//\BO�3/��َc��Lh���^_�W�u|׿�����T�1�v��mOkS��yW]7����K���0A�g��Lu.�3�1-��dM/�|}���g��
��_Er�X6�y�4�E�4��r&\�쬐�"�E��}��*��|b�k��T�œ�\&���Ly���+'
���V��}:>G ��||sdA�M"��e��D���jǘ|`�`R���0P%�
��p��M�@�چɃ{	���T�u�~�c{۲�Y	� ����D�b
#m>�L��a=�(�.�7��hG{��Y�T1DBSn�KŲW4���F��I��W.��O���*��}��F7w�⫨��3����M�"�8�g��a-��Wy�!��W��R��y)?'P���?�D�q���6��٬�Z�k?6���fKpl���f��,�ڶk�b5����K��*�*��vM>�T�����il'{��������!�w�f!�]�p�E����D	jR]��T�3:	b���k8���yd�u��ƭ�=��p?��񝀻C������d�O����
�o}~t
Wg�˜lP�w�JO��w�'��b�B̕(��o�!�L���%�n���E�+�5�m�/
�:�/Atx�!7�b�~Tt2׿��:���)V�xVg�n$�f#�n�:z��[]]Eѩ鲐m"T�i�驝�]�sb�X���z��������\�lD�@�=lOvT�q��Q-:i�
�׈9�V��] �
h>���~�ۇߘ��O� n�)���
1N���~�"�?�V5�����
�����5p�G�W��s��J�����G����B~!�Mj�I|1?��Hap��v�oK��D�_e6v��*�:/���:���s�p��bQ��^Klbf+�d%�Nj�=�#��qro�����4��eo�f��IH5H{(c���*�0����O�u������bKCL/}�Upl��۸=[^n�"$.6��-m�ij��`��)#��p'�<w��������fs�gϮZL�儘�q��`~��o:Y��c~Z�a�:�a�K\�PV�{p\�Wp�)i
.�òh
�e�~_%����
�p���X:��nG���JQ�N�(����������d�8q]�w�n�(˱�Е4f���|��&o�'���O��9����N��$�><?B��8�K(N�),����ВgT�#��U��Zr�s�QT��u���C���7��ieCi���)M@�vՃ�bm������\Ǡ�կB�	����">
~�2/��3����t`0�x�k��v���~_�}��!v��������������x��G1V�2/P���q���g��^�n�"�`��*k��{�H���ʛ�^��d�C�u���>`;��K��~���@x0���@.j�"J��|+�LRa	_3��{AJ|�џvo�r�[hY'e�ܟ$�O��<F0xd���/��@����}�a�DL���UB1�sx$���U֗��ٕ\��#����W4D��%l�q�s��ࣵ�kO�.�{�^��T>�p{�X1���F�7�UtuCs��
��ED��d����F�u��juo�]����E�5Rnڃ����R�J
6��W�dt�D>
2ɹX�%�������ʀ��y��*Ը�Y��|伹q�B~�9kr.����2�>��Tܰ�Ө������:{�=
F�B$�������g�栆6;\G��"5��7~6z��P��=�>�˹�M����6j��:ڤ?�1t���B�C`e�ɗY���������ҝ;TN���̮�eaj_�[RhZ��\�c�mC���v‡e]���3??O�#���Q�[�P�m3��3���_"�%�!7L���ɟ�p#�E���1I�y�ᇲ��$���|$� ��ğ�_5j=���M�G$�5+��H5�
�
Zt����D�4�	��І�h���h�"Q��$y��#`OX"�(Υ��q-�2'�muPWV��RTa�mce��6��p$�q�(�D��b��?��?èc�:���
e>��#zd�P[Ų�#p���}�7�{���|V7�����ՠ\��X��վGC4@?�Eнp��5b��:<�L[�EVU �хhXTi�0r�1F���!H���ʝz��4���`i�/a<���P�Sf�\�ժ�,��h�A���"��l.*G4�j���8N9�q
!L�$ +6�j/��  V`iD�x���EC@�^)rwG.�5f��o�!].U�b��Q���mEh�`��;��_I��"+�..P1ytEpq���x�S��ͫs�l�۳�1�#��"�P+h�4�t#NO�y�pw���;$��I�^�ҏo8)*�����}ΐ
̖��NH5�}K�*W\N�%�HK�"����I���J�N����0A0��C*7���b��n�Öɏ@B����K!��%��Y���;����=xBh��>�^����<�Mzÿ��'��&��[N`D9D��(��Q;wn���r�I��NfA�A�	�ǫķA��V�!��O�O����u�`��j��_W�5�34��*	�C�o}���?�կ6��$��ܭD�^��y44!�����B=����K��}�O��Ev��*��9�L�7���
�9�;/Տy�ݾO��Ǚ ��#%�$8��IO�9&��KS���,\���.X���sȗ�
�в|�l���o%�F���I�/P�۷�����"A��\�ۈ�b�D��	�+��s�!NG~Ԓ�V�wȃ�;i3r�#d�`˪�$�zܯuܣk�
u
u;��A�S�9���׉�[{�NN�J�&�X�e��<�)�����
tKġ�x�3��l
��+#
yc�'F߰f�J��v�	�0�xTn���:D�?N��n70ՠ���吘
�BD��tX�ê�g��N����?e9"����0/��x�	�̀�Z��,�a�!�7�g�ˆM�0-��C�!FI���H\�x���.���V4c���n�Q�1oC!#�4�H(�0��eB��hq��%�
����Dc�8���Y�T�ͱ����X4���L�(��iF5c�>TIc�ϔ���B�;�hQ/���=��i*ÈH�IX5-�y����Z�����#�bT�A�Pة�KX��S����4��騂P����~�ó� 6�y�������"���֞��௷7X��.�"���-\.M������8����
����vS��>M�!���qW�Sх-�<�ˎ_]'`K�U���:����
|y�o��cN�=�$�~����X�:��1��c�&R`��c�M$@�F&�M$&�3�]��r&ǝr;x�!����F�I;-ߐd�0���C�Â���ٻh�n��-30SټՊ��-){1,�,���
��h�9�×&@#|�_WUH~Yb��cB
KLx�qjN�"�c�e#�h��?�24/��+!]��x'�t�*�D%9����SE�ъH3\�*��Sq�l2�a�!�1�{q�E$r�V� @q,˰
����E*�ƓCL���SL�`�42D\
.�Ē��AB��v1*H��F��E�!d#6lG�&BvT����H�l	�H�e\QWR�w�ł�"(6~58UC��
�bI�Գ4	�Ǫ��`p�8�2x�E�!W������i�t�U�$X%���LSx�=���!��jUu�RC��:^�����M��nLn0C��ڪ���b��0mH�$�Ǽ7�h������X�^K}���»�5	���iܿq��K���lc��pɝ-����<��d�u��h�ԅ�����kf{����_�>�����p�Z��.���F�3����5
�=)<gx�w٤I�3��B�$\
�!@e�����u%�\�G��W�L��ZA���L�iåe���$��[ӂ�ş9�&��,�Fqr��>�Z_o�.��Bp��Z�UT��DЖ�D�ƽ��,+��p���03���<�d��TZ�C2��"D�d8�#�j��߿|�t]��S�誼α
��SS�i$�	\�#%�М�Ӽ�IDA����<#xGs�~��%U�R��U�=8V�qa)YV�.�1�4��pnC�Bh�����f@ʥ���W4X���R(�Z��;�w�
���_�ԍk��yPt<^��ہ�vڽ��^vo�ٙ�tn��/�om��!�q���)�4����z����K�4�;@k5�շ���"��>
����ޱ_���;�?2�5~(��Q�L�)�A���!p�o7R@*K�"]ka�n"J���F��W,,�Ë�W;u�����Z����ӿ�e�X���o��\4��K��B���ΩO����Ѻ�i_Qv������p�x`��5v�+��9̘�s��%��l5���W���J��!�� ��|�E:�)a�(��܀���@���0XL�t�P�
�n�O�J��/�ܗ8�f�S
�A$HX���%ѡ>��5o)[{BQE�����-�W�C�r6�l��K6���:W��g�u.²�^����r,#��/��\rM^�̟B��\���D#/��?y��)�
���X|A:
��@�^����ii���t2�裑������1@��wL��&�_9	�lU}|��z;LtR�1V�
� 䡑*�d;|o�1�Yb�b�8�<�
�c� 1�Z�ZG�鷝{ۯ�sVY_l�#���
ν
U�2z�
�[�D�H���0�&ζ84#��=��B�4cp�AV�&�S[b�
c�AGM�Ep��Kt�<|a���Ĺ��w���{��G�O��b��|����^]�{�uk����!���X�56�D���^3M��Q-l0�8����喝�FP)&��_q���Tb��$s�6ƺQ�r~��=���v�*�sװ4�#W�
��ڋT
�.�˧�M@�Y'��5�8�ՌG1�gC�1�ol���p�Y���-:Z-+��9\b�Dp�4��OS���pin�Ks��lȌj�cb$�>���;#x7p���}��L�r~>�����$�(	��\F��j�Ԧ��
FE!�9DŽ��\bU�^�cbL���?������**Z�-��6x���r����~o#V[ʝ(u��uߪbO;;h��٦�՛��#���
hB�;�<Ln�.��;/>�%��Yц��.�K-B�h`��K;����`�Bs<�}C�F���a5�OӠ	Vw��MU�f�eE�Z��7:^j�S-�,#�q;�1�\ɝ�i<��f->��H,�6U{=
M����y�{gY��+Y��C�ͣ�l	�Bt���c��N��JR�����:�u�_��˩�ˠ:X���>W#��q��"� ��C��GC�����D�o�v����v��t[O�~ܹ�ݾ�Ww�C$T�!b���cT�s|��/�r��B���u�ԁ�
$��,�{�'�����z\���6,��k>Q�"�k����f���)��!B��7�;��{
l��ȂA�Z$�A'��i,�7��Woܺ�Q����S{���^q�ﭹ�l���+{6�.�Ҳ������}��{����2�-~�m�WA����4�Ç[��s++7������..�㕹����}���q�ͦ�n��D��?���h��?��PO~�[�@�1�:�5�B��}�MB��j��P{�E
]\���ohK�Atq�Z�ל�]��hw|�������t`�Լ����{h׭�j޹�[C��^Kڿ_Z8t�����bm=�N�����Y�m����e��q
�SM�k�W`�i�1�du�F�1��V����){Yvj!�G�d„;����!k[���s�7��)a	O��a��7�Qܪ��F��v��l&K���XgB�Xx��[�I�2��*���d6�q1��G8��&��
�{�0���3������������N�����D��f����O�jDJ�Fí�5K�c��$u>�Op�P��D<�Cg�{n����x�u��N��-y�c��H=�X�:��Ƈ�'���%2���A�Z�V��~ֻ�}���X�biw���߷B��K�FD�h~xS*�@׼0��<�u�M\){m��%�]�ƅ9Ö��ڂ�H��󍼘8��#�y/�lg��!����<�����z,S5>�T�b���*�*r\�_��hqg��>|��d!6�t��4�)�&�٪c9!�
9V���v�3���\\XI�|L��|�
1�0���p*����F�2�
>���s�p����YZM�a����b�\v,�#x�;��3k�EC�t����&���~pX��z�&�qLn~�NzB�#'�#��>���ŭ�b�����ʍ7>~�‰N��^����o\�}S���[�
A4���3
�7�
G}���3�gގ�^o��8�n��S���{�;�P�gS�%0�ʁE�U�ba�zL,����u�����7���o`�����+���bn,���sm�`�)^�c�����'e�<q�z3��LS5<Dz�
�=ӿ�z��!������������m�kP��>�����opkd�2�ap�`��4�f��N�u�:��:<ˡ!�?�m��ŷH4��F���8K�m�S }f�5��c:XH�d�:��E?0/���ej%3��/*�2Ӆf�d�s;K���;�fo��w����|&�,Lg�9A��Dg�,Y���p�5b�ӹb36?zml�]���ܖ�6��Պ�a�Vl��c,�9\��O�1��j-�~�A/�[�CGj �P�ep�PQM����|�$�*�b��u��(����LuY>���ė���)n;���i�E��J����i��VD/�q���`[�����zA�X?w�Au�6����ͭ�����&��,�^��������|��y���w
6��u���S���������yxj��B�D!�����y�"�4�#�Q��\\<���Y�?�����S��Զ��y�'G��4xL�����-����x���*�?�,3�������m{�[AC"�FHt�ɢ�]p .$h-4�hOd��?�9Yy$	#������i��Qhʩ�.��ʇ�{@SbKZdX!-��"�={��H�wHHO<�p{�!^
���.~^���i�T�ݐ���'Q`#���D[+^�)P�L�D1G˜�)�E=*�۪a��E��ӊ�� ��� db�	~p��21��>����8A�9q���j��܏�g�r	���4H����E�%I�<�ϩ�Y��� A~k8m��(N=0�
$�'~�EZ�e�)�����*�E<��]���d��P2��M�^��gɤ������{��R
��+*�k�)ߤ��ĭG��H�t*���>���[-W�+�L�d��r����e2�����:������TE��xph�ʍxT��RǨ5�5a�	&�e����X�u��n�+��ǒ��@����3p�I�1�v�R�x��E�
�iܥa��M:��K��d�!:��HӬ���f��k����1%n�5�yXZ��i�6�;�N��N�c-���ݟ޽� #	�^y0����J8�M:;w:�l^ϻ���G����!\���n^��+�1e�
-���ݮ��v9��{���#;d�g2�=z����n�ia����������槞�T������x�;�y�w���w<{��_y���D���$����'��r�oCNm���������N~�ç����y�sr&�=5as^�;F���R|n�v�azE>�:��̎���5�Ս�?�p�3�H������IΔ-�<}�]/�o�b�K:��\q�C]}��D����r��ᢒ]q���x׉�\~�s��`�4�O�P
�^�`�BW�}o�ai4_��_���71��ɢ���C�ͭ>y�~ݏx:F������.~{(�/�q��`c���j�y5�ٜ��B^�����مZ�P+��'�wCb��}'r��YHysR~���)T]=��X,��l\�n��h��y+~�>�I��?a*on����|P���瑏d`�ML}U\�2�	k^{�0�Ϩ��-�'�RXWCL;mJHb�� M:D�J5̲i=��1���kHV�0�srҝ�ε����)j]��w/�R
��dm]`�(	�H���0����j�6Ba
_d�(*��;�*!Y��w͹nY�wt̓�͑�[�K%}��)�`D(���c�N!����B���Uƃ�6�q��y��]�AZ$>#4>״n)W@�7�aQ�{0�{o�	���
ן��7�n��T;����RW�`��Z�`7�~_�u/w�x�^�$5�za|�PӰv�r���1)u�(��:&��n�y@:By�
�|�-//|q�Nټ����W��P��N^�>}�ؐ���o��S�t�{��T�'��Cu�'9N����:Z�4���C���)t��0�]s����a|�`���nH/��`{,�`M̓-��LY+
1JvS���j�vg��Eҕ�K��m�#C��Bb��j�S�5�]HH$��i�n{���\�ndrQB?�r��T��θ��=�V���D���5m�ԇG:0a�y�_W��rwu�zI�;ĀZt�F�����{#س�W��C:,����2��Xf��貦��2��Ƈ7�`�?8��;�)�Z��
����<ǕX�)Kh�d3����!�G'��3�>>���ȩ�wο��a�(��EqE�XU�Fn�JSE§��;�R7b���D�0|c!��<���ow�aY'gxÍ��٪�����h9~�(m!my��Ϥ��q��"K\���x"��I�����(��&rR_bK���S(XZǩ�a~�'
.�6f�Ϻ�1#�t��y�J䯁�6���? ��.���Vl�W��u���{���Y�Nu��Em��yǫ2mE�f���:�|_`?����x���2i<��c�JF�%u��:�����B���-��@�I����#���~��mm��	�Ö��X�%�K��
\��f��="^7�pe��hƶ���a�9���������w7��`��D��x�6E�kGzk�W'�|�+^�T׃5T_��|\�}Uo���D���&��5A��>v�8Y��'|ͤRj���|Q���a�^�`�̉4����)�s����Oh���d^'h'�g.z'����`-�D�j�J�N֊�tÑ�~E�<�2PY�IO��:JnΒ�L��ҧf�P���_Ƙv�~>�{�U'�DV�	�Q�q��E^ගD�(�l�DG(t
N�Ãi,��S�Ĭ^D=�F�C;�=�|�	�3|��C��;MAGƒ祝��
a�&��
~��?O���|pH[�r+� ��5�W��Wߧf� ��]�VS�˵�&D|)(}��/	2G�HC��!�*U\�ര�ӗ͢7U�ظy��#�x��{�{�=7�ˈ"P������-��=��:�m9o�nk&[p�>��vo��@ M`����9������ �P�xAna��gG�F��+�ud���P)�������ݵ-%�F��]⣽-&�<
ⷎc�1}&bM��>?��D>�DL�f�GpH'!������kHT �N�EC]�]�ύ�U��Xƶ7���M��在�=Ͷ�(�o��;�Eݨ�Ͳ�&��/�$|AP�w�6Z���͍b���F�/��X�D�(u��Y^�3���?8�#z$�t����+��==�y^EK�5�ظ��<p`'��|j��%{�=y�>E����:x���bo��\xC����N���w�vzDO�'h�Ʒ�
�.���db���Mv	h�{�z+��p�]7!��%��g�8���`��BȖ~�AǕ��,�E;��Mʒ�O{��=I+�,:%�-9�l(��ݐ�K��b4�D�����wV!�\)\��S��,�K�WS�S7S�SwS�ZD�}�a�+zD+X5�`���O���
ۖ��$�S.����#m�,l��6c;ɁdrL-�'Fr�\r�\D/�bE/!�+o��t���|3S��%
��<��#9�)����B���(E��t�ԇ[e��Wi���g��Xj|v�WV˼F�N���u�/W[1Rۣ�B�U-4Γ�B�f�<Ab�Z��	������G�Hjm𝊚��]��`�0�qϱ
T��k��K�7P�ai�~���V.G��P�0���Zm_���Xe��E���XD��¿�œQ<2D߈���#���y�WE�T��A�=�vd�H�O$r��^n���;�]�B["Ub��b�����B��e붖2�o��#�i�>ʔRw����Q��q�t�i���7���L5��ۏn��p��U���!a�V�W͋ṝ�$O���x{e���^U�}�='*EtЪJr��՝sa��Ȉ�-��{�yA���,U���o���aD
�I�~ab
�3Dj7|�c������p�mS �)<(ʶo�pԄ�����j�zƒ��ĩnwm}
�`6�'�Xʼ��?q��ѓGL�8�E�U�x��C�saM7�g�PX�$��!���cclL$V‰�!1��)q$���X���o|�w�aY�؎z���V����ǁ�?9
�j(B("��.�����h�l�q!�ьJ��l��9Q2DU�MA1pzC8��W�Vz��&����>��?D���N�T	l�d;܍qKA�Fu��6���
j;�S;%���Uj����`�8-��������O�톸�*z��R�?�I;���|U�|}�6��Y_������Eѝ��?� :�Tl2a�w���o<�̃�{s�B!�G&lf
�|��#+�[���m��.���2*�f��P'��C��|t�e��A�!N��f��K<#�c���d˒�1���Ԑ�9{m
w��_�B+rњ��yNd��D��w·?f�*��fCR�`�>�x�Q���
��?�g�Y����]+��Iæ�j��຃]��E+�s�c8� ��kz�_�~��/lV�׫h1y*Y���Ө��z{Wopnu��Ql�w�7��z o����)ȶ��f��[���A�8�J��ƍ7ns�|'�E ؏��ǟk�̆���
=F`Gy�AB�<���ނ�6oh����A�:�[��oܰ�m(��ձ�8to�7��I�W�5;5U����K���{��7�*e��5�3�r�b�b 7���y�E�&���(K��ܱ�V�NLn�o1�x}�P���W�2~��W��1��-|�ru�!�w'��r�V�T5�t��n����^�<r*‚s�g�X9-��$�<�d���Z�v~}��2B�i#�0l{*�A=�dN�쐮�n���q������g�-�j���đm��XaD��v���$��?}۰V�	A4��Dɺ�E�K��N�bV����,g�\��;s#dE����t<X�L�c�[�+dD����_���Ǭx�ȅ���5N�I�ֆ�l�k#��9�N,OY68�Z��*�=-��c�z�a�)��$�U�	�&�=��&/���'�&K���T��	|�;
����G��2w<�0~�yD�x�8H���O�Ly�,Z�
���,g=���D�2�����Bc���a����ü:�����~��8;��x�eʷ2bf)�9֔͠�@��v�4k/7��I�W�E���
O��	�z���0����Y��C��0	?d���ţ���!<z}<<����J�\�A�;�jl�ͭ��c�c0�
�>�a���ϼ�������]����3����;��ޙ����5EZ�DC��ef!�6�����)	"�`	�0����
6��x�� �"�L9�,�^u��R}��3=5�o��u�{U�}��|~�q�|�Ń�om��僿<��ch��,�I��	��	���lDrB�K���t�i���y�#���Χ�Y}��\_C]�H�BЃ�%>\�AJ �2�z�d�AJ�]�A��Z�zCI"<+t4~��`��+n���2xa;�g�N������W�(�[��m�Vd[�����P��2�
-/�9���LkS�s�	�鴖�����z8���>s͏i��8�L�^��
��q�s����c
��λ�ÓzU�o�~r��{W}���*� �?0n�ᑾB��:bn.���z�3�S�x���]v�~�5e"�g
�}�~}���l^̀7*?��~XQ'EE��d�YIؓ~i��2���W�;RI�8ӯdϧ���ޢ�}s@�zF�,b������f�t�	�{��;�T~4j�ۈ��H�����Z�_nO<�c�R���z�ƜZ�v�w�Q�ڷ�0hu2��v��zAV�%���4�no{t�I�1��ݏg��So��d�G�qH�R=}�'?y��Uڣ�F<j&�c�^԰m�k���&�n4�ض���/��������Fnh�v7�\��mc����P����9��c�{����/�xW�)5���ʃY_��3�,�gW�r�]�~zr}�$�zn��:��&x(��ݽ�?���q�x�|���	B�����!��[x�!D> i�#��0'|�L�,���#���I�"��<��if<n?b����fL�
J3"�oP
�?��<�H�x��|u�2)�i�y"�Y�YI"�,o����+we*��&��B�$r��+D��Hj�0?���Q����o��‹+Ы˒g��>��9��$�@;	�i�Q{$����5���?:D1P*d�y�r_�g��p	/�#���`�Y'b������EZ�k���e�����������G=E3��^Cnr���sLM遪am�ƫkQ�״,K|z�a�����-�5�h���K�Si90�Z
?4-�4,ۃ�/��\OZ�拌Jh�d��V�~jh׳�tBQ<d�vv��� 1E*rwf-�
���Tn9�� 3�
�
�����P�G�iQ�4��,����8�����������<?3���=۹5�������}��zQ��0�*���$�do���6&�7D+�|�y� u�
1k[6Y-�V!�C�������طV���X��X��t5��z���>�=���Q�|Ax_�+��o	��5��6�wj�QU!B�NE�O�`��*����g���B�p��e�<O�b�x2%�L�d
���
����5a��J�cy��(e�T���:�1�A��T��.�pd(ao�jN
�M�*r�TJ̐��)�����V�P�ܖ���huݵO�;m�;ݽte4T�Ļ�6����J��5ո��)�N1��(�DJ5E����$�[-�:(����O�x��p��Q�}R���_T�O�2�1��d��j��ɒ4�ڠ�X�D,JN$�MEw���*DI�N�hy*S�8�r'�V�C����k�-�ِ`lђ͚��66�fW&�.׉.�*SsƦ�6c"�TL�k
�O�N5�-�V��
���}2���F#&���!�>���F��p_���0�l�p�
��&\�vHXb%��4��S#Nϖ���8��̊���Y�8[*'�����cRFέT��2O�a�C����a��R��a��z˨f=��z��zK<�3��CG��R&�qC�)�����97�dRF���&um�0�(DP��Жjf��dGj
��@��lȶK��_s�T��L]��z�w�!�%&��!թ��;r#et"�=`�ؚc�pw��l݆$Q�G���P��H���x&��P6|��D1�`��W��.���}Y%��b����'��_��˜�SM$PC�rCu�'<B���uKCp �H}}�	wk��X�s�PÂ��{6��}�MK�$�*��)a��b��R�&�����|�xlIh�ky�6>��r�AX��� �}A���ZC�,0��ܚ�=n�0]{#��ݖ=�7���4[�;���iV���Z{�q��/vh��b�Ɍ?�g_z��9���WA�C�`4��q��w�o��'��]Z�w'�' �?��X�ɝ{�K��8�CJ�V��QQ廾p.��;N�vE�h}+�c���{n��r�$Y�-p�\	�8WW!p�$9T*�k�EUFq�0�08Tfb���F�#It���He���O)��3��1�x�(��֭�E��j���ЅIzJx�$S��D�J�90�80���)K�V=R_(��v6-��@�I��s��o~��4�1;}�8�),�U�e��y����xt�lSBA+�����'G���`~�]��P[���k� =acH��pf�E�����6��a��>T�5��ģ0�yA���Pk↲�F�VK�M4�I$�pL_��Jh�����lY�C�[�	̑,�A�"6�\p��.��ٟ�\�t��)뵍7��x�:���M���� ��M:�d�u&�~�����<x𝚻9p�����R_���%���Q�UL���@���pW���+|����x���*�y�Q�����<SԾM�Wu�EU��3F"���^�\��E�p�.�6F�ηB~�څ�.��W{���a��[T�w�2�J��p6�v�x��Esa��g}�>c��^t{靗Ȥ�gQ��ώ+�t8L�������m��� ��(���݉��a�꠳�
�8^��(4�Bx�՝nH��a�hV�ų(̦���(�6�`�|�P�G�{>�U�,���e�;Զ�u����+�ȭ�Xlv���b'�ʘ��~u}ͫ�w��?�7A�A�1M�W</���A�I�&�G��8q�`�>Cl�װr&X�Zs���}x����.	�܇�8�p0t�
����*�fQ���r����X�7ϟ��?�uʊ+���{�6����]E��?�I��{�N�y��3^,�;��&��z��u�?Hd���!�����K�@��)�r1��%���EF�@�d���F6��Om:ʌ��Jz�ow�]to���Z�+ɣ��Ñ,u;s��;�7��&���G����xA�'�}��>��W�)g��x�}�=N�@��� !�#lA
o֖+wIPD����N,%vdo�����	8������ A�v�7�7�.�����t�n��>-7q�L-��u�,��s�,w����i�1�����Ao�8LJ�&n�e�E��r�y�ܡ��1
hD0<c,p�9$GؐF�G�֬W�=R��H���U,�d]���b��pmb�����W�d&�j�W��БѱX�0�6bTD�Z�>5+1�33ɋ��T��2f	դRe��L�L�A)n�XRȳ�6�H���)v|f:Nw��r��;�\x�s�)�џ��g.1p=����ޜ�Ji]�e��`��2�3��'�R��7�p�x�m�c���F��j��J���~׳Uoֶ�)S�HR۶�Զm�ƽ�3�n~���o��>cα�����{�A���?��nnac��6�
�qm<�&�	m"��&�Im2�ܦ�)m*�ڦ�im�Mg��6��d3�,6�
��lv��洹ln���l~[���l�U�X��j5�[Ú��-b��b��-aKZ��ֱ���oK�Ҷ�-k��򶂭h+�ʶ��j��궆�ik�ڶ��k����mh�ƶ�mj��涅mi[��6Զ�mm;�ކ����d;�.��
��lw����lo����l;����`;����p;Ž���ha#m�c��qv��`'�Iv��b��iv��ag�Yv��c��yv�]`�Ev�]b��ev�]aW�Uv�]c��uv��`7�Mv��b��mv��aw�]v��c��^����A{��G�Q{��'�I{ʞ�g�Y{Ξ��E{�^�W�U{�^�7�M{�޶w�]{�޷�C��>�O�S��>�/�K�ʾ�o�[�ξ��G��~�_�W��~�?�O������w��q|����>�O���>�O��>�O�S��>�O�|:��g�}&��g�Y}���>���s�<>������/�C�����U�y���}_���}	_�[��w��}_ʗ�e|Y_Η�|E_�W�U|U_�W�5|M_��u|]_��
|C��7�M|S��7�-|K�ʷ����o���>�w�}'��w�]}�������{�>����~���!~��~����{LSWp|���D,��N:��UZ�� 
1b�akt�B!0�T{7��W���|E�d�\�M��Pl�nд�P*"������B��0�{��Z�������s�;�|9'''�<�p��n�
C���n�����b���j B�f����q�
b1|3�$ހoԺ~$��}���w�\g� �W�
��KK��S�)̵����:�]�I
���7��\Ą�:��������M^�m"<�l�'.!�+O!Հ��E��\|+y@,��l�X�8�l��a\Dj=6�%��QTr�����k�0st�����R�?�ܖF۬���%-�G��|�BŰ��)��#��'N��0%W��
3�W��a?�^D1��_��>C����k|V�A��O�#jGラX֭�N0̏<��#��_��8.�Ï�T�
&�+���|F�rR@�P
����5�֤�(Y�t@ߤ��C���{�T	O��6�%�!G-vP��j d��uE�!�e��E�!�)�����k檯@!�a%�˩�y֚tp3���t�W#?����bD����)�9
+LE�5�K�(���K�n�&�@���YSf!MΘ<	��I��D����s�<v��q�	;He��;؁<�jt;�d��]@�1
�TTk\������%~=��Ŧ��VB[�x�3�Mh�C�P6ā�:�l�I�ȵϼ�������Ti;�=?�y���pnʣ_�u*�jŧu&�}��kj�L����v�5�����D���c��v��u�/�$E���s;��:�c)�hG��6+�ͺ�lf�s�[�>^��;�*F���=$it�b�R*����{&�3c�B�6h������-�Jq��6���"$�4N�)�9*���)8@J�a�S#���,3ӱ`�z�]]���ٝzS�>]�NBŏQ��F���(4�~Q�6/~�6Y���s�?�Q-�m���q'���}3��A�����;@ՏAKg�-e��{����	�l�?A��4*ekǵ��w�ԏ�:d�R9(ޱg���/��A�Q����0��7��_�^�3n�,^�]Ǻ«>\[YْuL�-��)��9\\���6T�,�n(I-I�c/�W�=���!�d̛��
O���9�+��?͞Yc��y���x|f��&�����spuSEחw)�
ƺ�>�����JPF-installation/version.php,���m�Qk�0��+�[���t��[�"N��n�M��j�]�Tp�~��� �~'�ܓ�U(/l�=���Y�.��K�d���
Y�p-��^jd�k�y!Nd�51K9�3�#Q�0�*��6��R��&�U9�8�A�eƥ:kq(,ƿ����Q4����,�����[�l��u)
�[����Rp�L�?M�1��4+��3���i��t�*���v�C�C����]Y-�PW������Ud��1^N{QQ����3���#���+�x�$�x�Z/���w��H֛�2m�c�w��do���?x�F��JPF7"installation/angie/application.php������Qo�0���_q&%�B}Z;ms;�P#����XMc�v������h�Ie�K,���s�O_LeX:2_�3A^!8�,:���J7�U�C�-l�|h
++���E᱀���F�M_�Ǔ{]k��|5��-P�Vaw&��Y��<ܞv�L'����dz	K%+]wc�F�vN���Az��c�Jb���slЊV��z�	��./�"���唱K�`��k~7���x

���1I��C��t��cS��搽����m#�:�(�D��XD�_)7����h��$.��nQ���iQ��^-��F�,�n�ŵn$_��z���y��|�s	c��ʘ^9&��D%� E]�'u�T%$��g�K�Ǝ�{�4x���1�L�j��um�Kv��YR7���d��JŢQ��|�[N��b�įJ|q�Ȉ��F�w�DƮ��?
k������G��i���D~��ُ�=�!��JPF6!installation/angie/dispatcher.phpE�
���VmO�F���9	�q�Z
w���H�퇪�6�$^e�k����ޙ������<���/_���vw#؅������.Gp�#Xt�X���R+3ca*�EY��i.W� �(<f0�`�@�
8k4t֞��2��|+H*�@
s��,5Ee�<�p�������ß������Ls����N	U��T�A��g���)j�/o~�K�h���rJ�n�+���T��,DQ�3�1K�������0�B&1�GQJ)8r�ߥ+�Os���uF��Y�O�+ꐳR���F�!5pc������O;>�n��l��'w�L�H���z}i5x[�1}?Doز4��gB�׭�lmlvk�ǐ��|�$��7R��?��?_RY�A��੎C���cA
�w�y��	�#hϹ@��=S�.G�N����z>����{�Q��\:�)7k��bA�>h�o�	Sc��V���O;ܢ�`��˵%�Ս����{��:����T��M�j줞kE�_{P�Mtn��Sk�T���ؽ�)�� ��q�?��IK4Hb�3�О��!NZ�OB�a�A��y��Ap�����f9����<:�h�	P��j�UZ7����Z���%���FN&���9n����kcQ�3�
o��	�����j2��
���w��n`�Ak�틏ۉc�	�K�]�q��B�T�N�N6���]�p��z����v8_
�W�#Z:���J�����CȰ�\'a�Sp]*Usc��;�2&��$�QM�e��A��_��B"�Ycƅ����mo��[��
����gx1FOB��QW>Q��~{�6�ʤS�cr��U��ܔ�T��f��2,���O�����ֿ���^
ۗ�����3�'���`�4�tJ���@#�i���f1�8��|�:�(i�BJd@o�B�T�ʒ�ܑ���c��J���!S�64�.7�C8�,����j䀼;�D�1�
����PV����,��_Q!��a�i�
��I�*ӱ������D/��"�2��������yMtO�7�J�4�֯�;O�W.���rY���[�^ð�zJT��9�*�e�3�=DѿJPF<'installation/angie/js/ftpbrowser.min.js����U��
�@E�~�Da��������8ք�7̌J��ޘ�h����U��)°r�h���$5X����=�e��9��ˈW�1����6�2R82o��$
*e�^j4�D�C�����$`l��0��Vf���Ϭ��8g����q�-�F�h��W����(d/��_JPF6!installation/angie/js/ajax.min.js�l���TMo�0��W8�X��$趃]�(��E�;(h��Hٓ�A��>�N��av�L�z|�621E%=xD��rϟ*)11��M^�Q%��R�zH�,cHy��b�z�"9HQ�����
>��%L0d)]�/�b0��M(����遍ξ@�?��'������%(/����`ЧA�fV,��h��,�5(�����)+�
�<PU#�o��$�-8��AT�$���x�b�ݽk�R��@
)�9���ȱ��Y����a�-�&L���JhV�	m3L7I�Z�;}��é��
�H0�DV�t�3-���'�~ߒ���	�Uhe'�ɵ\BYO��+�1��ز*�V��=~d����%&�C���ɎB;5tk��1˨e��3�Lܙ��R�����k�@W'2jն��߃v�>�M&���x,�Z���g��ۣVh2�#g�h��h��R��у(�s�a-�e���^�n���V��j6��Am�/v6چ�����vb�n����_�>�!�m�C;n�JB��}n<$����WS{1����=�@����)<y�����mR�q,�?�)���j�
�.nE�/7�#Kc���`��Ƈ����gNv�G��A��0>��N��A{U�4
�{j`y�f4�{�jT�7Pׅ�~L�q�\�(d0��?JPF6!installation/angie/js/main.min.js������MO1��
d��+YKZ����!@���%��j��l��ڳI�h�;�B�8Kc�����8�l��:��4 �e2�LAҚ$]���D�*����N$LۑT�CS=زT�X�y�����0aBz)�o”�;R��(� ͐��h��:��~��U	����_��\�"gQg��?�L aAst>d2>�N�l�î��`v��?+@����mEK�Z�󜿳M�-K!���E��f,K��w���;pB����Q^ll�A^
�s�C��)����X�2͙4�60�,XDi����1G��Nv��
�8!���?4����!�y�?C?��������u#Aٲ����QfCN��cs6�vnz��&�)h�����'(�I�������������؃�L���g;��tXS�i�=JPF;&installation/angie/js/polyfills.min.js��"����r�F�=_��*�.�{R��W�e2'�$[�UD�j���@VT2����Z����/�ϭϵ�mˤ˫ҹ��2������Ǣx�E-�ֹtԞ6��6,s3}�eL-9��7qU��n+�~މ�wU�0G��F�!yLlr��<9�'U�v�6܌�a}f�~�T]����` HG�{�&�n[��<���l8���O�H:X���3o���p�krx䍓022�y�Ӯ���@�ݞ�l$Ic���>��,/��[L��#�>�WۆDžfWt��?�b+��'��%K�p�p$L�t& �c���Hխ�t��9��9��o��j<���sGct��6oD�|	�_�$T��8�{��.]y�v	�W��f�݈�k�B��n=M���9y�U�ۺ��N�.��"i*���]==�?�E˒	2I#�p����U� �H@��I��y�#�F$"��^�c�]�{�޹k�\����`01P��[�
/�j���~[+W0l�q��/I��S��VD�T�.�
Dδ��6�RD�]��(y�P>hc��z6�<���h�d>����+�z��Jt�r�{�����mǢ�H��e�̯?'��,1���Sj��BǴh�J0Ik�b�/��@���᭳;v6`�bށ̉)���\�x4�*=1w����Z��D��b��E��}Qރ��s����@[Qd���]6���ZŰ��8P�b#t*�$0I�p���W����3C���$�#�RQ�ȐA�N�+�k�0Ό�cf�i�/��|��NV?/�L�����S�7s$�(����]���<�ēo ��*���	���X��^F��Ca<��ҘJ�g�=��3�-�9a��G�������S7�Y�"3��W�7#����I�A��8r��r[j�a*�Y�4H!s��2���#v����j�5��b�/�ӽ�l��-8e��\�VFL(��A#	�f��ϭ��ǻ̀����<�}׿g�ˆ���]C����YZq�(��P�X���$>�T�9�����Y`�'F���q���q!��t9�Z�|Z��������9HA[��b�o�:�4�5{����=�'��AOm��}R�8�ETmX���m�AN e�B��*�aUs@�G�up����D��ėR�	��%o�q�+��C���A*4� ~k,!Ļ�Cb���򍺫����4ƪ{�
���O��"�,b�9��A&�KK�Ԋbk�r]�u���Ah��� n�	m�\���M$�^p�J��4`n�� +OP��B�:��Am���HyZ]��d�?z5���<sD��<��OuCS{.��J~�Dm�;IFP����	(� ,Y�LR0+mώ3�|����WY|
\e���f�t���^V@[�ʿ�vv[�}���꽠2��ӓ�p�
��5���Fޟ2�c��(Z!Y�C�
;�!�ލw'Uvw�Z/�ٍ_�q��j�kp�~��}!ҟ	��a6�
r*fY
C�-��`SI�ԅ��b�P&-�Qdvt�)3����d찅�(�ԩSȩ'�@�PLy��Jmb�`��g9UG���r�rK�r�4� ���|
��UY?�cb��$6ĝI��1���]�l��,wf�[Pѷ�^�S_��}����t_:��S�����bI�
�X
V�Ѳ��U_��."�E��x�s��%߈��n�� �s�@�qO�݀|��,ٮ٦D�:�#����F��S��pp$�JS��Y'�Ӆ�T!7e��‹Hz�z_V�o��*ͳ\��fO{�(���c��9@����y���E�B7O�Buڪ
�d�E�Q��;��7�I��俷�w]��\��|~�b1�?���8CӋ}�M�3�y�����R����~�),k���ӹ�FK�-�D�R*&}���NJO��ꝭ1��w���}7��p|��֘:�S�hK
i��EX�_�ֳ�ä�ȃ|mB��ϕsA:H��e��p�;^'�٠��
�� �Q�`�?�K<j���-�|����3��)��X�=��p�=<~0ժRg�O
2�ݎ:2<���Zc�,�����4
u�	��GO��2��E��*cB�u8�d��K�gX�=>�Ql�����*�/ˤ��y%�f>nC����ך�jkEm\R}�kpO�4��0Y�8H
���@Ò�6a(��=���Rը�����&LqS;��}Eǟb�M�"y��?�8lx�W��"�%�3��I�{=9���zbyԠ�ը����J	�H`0����t0P�t'���#��y\���LYCby�p��y�lA7���iC[Y��l������]�!#�j�p��A��n	-e���
�͗��3�DŻ��#��6��u��ܸTW���S|M��9�,��>VO�_�Plc(�%T_�-��U��ؐd���ժO�G^�#Z̆�ڪ�$�з^C��}��`DH��!>=�JA��<Yۑ3FR��-��&�Y��=�����n�S�~^�!���Rdn�{TM�mT����[?�Ւ��\!�ݞ�4�mL|)c���V^�v�m��B�I��q4�X�=}��O�/��5�t>�5�����voI���Y<H/0MA�F�o��7h*h�����~E�|�F�q�$���#E�_��5ĢV���$�	�S:��	��Rz?�(��(�����F�
+Υߌҏ,�p���G���n��WA��{6N��dp�T9��D8���	R�O�;]�M�M�iL��C,��ν�?XؤP>^��.݋�ߪ�}(��A1h%�	%ø$eF�Iҁ��ߛ�K���[��*���.��m]�9
8(�%�:����{!�:��5���Clط�T�l��b�#����(�7.QL*�j����߀�ه6�X1�o5Uh��W���^X4�
Z���D�5/f�]|�ÙI�މ�*��XX��K�,��Ӻ\�\Q�*Kv��%�:}������/]r"�#�������"�<ش9D�ex�2��_�^�<�^����"�yB�e�u�"�L�v�gHg�O�c5������lOՐ�J��I�\�s��{���i��$g��s�uU�7�#>AD���ǰL�Kߏ�(���}_|���?���6��>����/��6���K���l�?JPF=(installation/angie/js/offsitedirs.min.js����Tak�0��_�����	�0<�XGa�6���8[��bY2��,��Y�-)
e�O�q���{��*s��H�%�����j��i�@�m���d��c6��"��Y�dQ�M	.f+��
����u�m�7)�G�,�%Bgu��񮸑�כ�"`}�{��@�Bހ�1:z��9��^t���'��H�kn���Kv�@��$l�J�OD�u�QZ�1�m�!@���i��
U�%�DC���CA ��E;b���$~1i�Ȣ��u�W�pۃ�[������|�H��,~cq��}��4�6�⫰}@���LsN�zsJDd*�0���������Ko�8���@C�R��:��D����e7�j�K�����F���� ���o:�;�����S\{l)��j2	�0�
>�^�{q��]O򽤬��Y�z�;�����fڍTu̖�����|dum2�AU�Z|��&��������@�JPF:%installation/angie/js/finalise.min.js'W�����j�0��}
�袻el�C���Βc��IIR])}��a7�C�]r��?'�E|��}��K+�MX Ț�*#����~�@��.�f*^
:�q<�0�x8>�SI����pj|��PFXB�VbK��~��r��R��8�(K7-k�]G]�6�E?-_�i�S�OIǑ$�ߦ��Te������m��^�y�����p�u�=�9
S`�`�e��7�4�%�(�F��sC_	�k�@ۜ${%�:%��+Ҳ�"����s�/��c�7
��VN��R��m1˺~^(�7�P~JPF:%installation/angie/js/database.min.js��#���Z�o�6�}E���"�:;����2tw�649� Pm��IM�{���=R_�Ȕ,��p�~Il��W���DH����d�1���%BJF��Ѩ�	��H�K��hJ��N%dB����y,W��w(�%��iΫ�b�e�(?�4��_���Qc��I�%�'ǒ
~"�t��;�b�YODb/`��
�H``��%#��0��H^3f[�'$D�p
%YJ�qq0����c�O���ggΚNl�7�ֵ���
�y�\1�E4�Z9��@`�L�{�ǂK�3��!�P�M��j��m��H
��Y���jca�^P�0��0Ѵ�r%J��V*Q"-40Grl}L��{��@�(�|"����������l�5%�����ȶ�y���eĭ��D*��Լ�/K�;�Լ�/���S�&>��S�&>�q���a�%V㱶�v�|~�,i
1m�,)vy�T	�r8�କ}KxF�=��\�L
�ہQ�2�$Lw&�LN���ޜ�����t{N�1���&fp6t'��A���0|�]j03��_�3���hI��h��׈v�N�y�����x��S(9OO�O�X�Ok�]�L!ȒNΜ��u��:zS�Zh?�������x��*"�~a��F-�*nt��Aø*�>����{A:Y����m�F��:��p�(iL0�P|W��7��Qps����%.�<�,�=�O.�!�^����F^��3��lnI�:k�F�0	vǟ�Hμ9�ą��q������W�o�uU!�O�s(<�߼��v}�n�{R��HHΧO�G��cB��mu��ZJ�ڊX�7h�+�:�cxr��/���c��菗�W�պ��?=m�q%�i\%���\gպ-�˨��H{U�6�1���0Dʕ���FrX��Y큨
�(Q=�9I���8,dâR�C �D���D�'�*�t�(�����F]��� I"���ϴ!�݈w)"� �n�)�<@��VG�(bbj�ژ��7�
�*ƃ����A��l�����h�a�ؿ�~��k-e��+�}#�~�rv�]�w��6���%Po�p�R��>�W��c"�:�i�:�V[;�`gc;d#C.��	N��z�F��b���>r�ht��ҙx��*קּ†:�3�U�W��9y���<�>O�|`kE^9|L6E�{zJ��'�;0z��e�ȸT�d����Pp���1Gʫ���,nJ�����t%Il�/�'8�����4������Av���5��md��!��e�U����m|S�E=m3���2���xi(2zj�m�gg.h�H��8�7(�;z�?.u��aP#�y�Q�q��/�����G�&f"%���P��C
J9�oc(N)t�Y�7phu��c&m5����d���W{:���m�w3W�`o�g��]�x#�U~6o�o���׼�H!���1K�d�DŽ�1�V����<�O������]�`%fR�z�)�����-�j�-�65dP�3���$��F�ү��*��2G)U�V$���bdme0���(x1�M�� u%^	<h8<J0Uy~G�$�G�;�����0ؙ�q�ɋ�7��W�M鵾(�v����&��VE�}O�FW�-�<���J[ �3�V�_�ֳ�3�"}1�>0)�����2�����xA��%��Y�/W�����\_E�}�[L"��6�x6�pP1���A��!)��\~��⟈�<=�5
�X�`�OߞL�t���#�,�U�$|�D�J���X��R&5����3�f�o��B�.�-��fRjՁ�] <�F��C��#O98D����
��^5j��(�o�eL���� hL���q�����иZ�js���AѪ�a�_Nɳ�0�f�����O�;Av������NR�%�\�8���?�W��zH�>��ſJPF6!installation/angie/js/json.min.jsb����VQs�6~�z�
�Kň��^��r9����vk�[ڇ�Rw�D��ɓ��>[�}%KN�l�>L���y��"7�P�,bS�
y�@f�̖������ȴ��.{]N�n5�e�뫠Ȏ�I���;Q��(��Rtؙ�4E�
���;a�E^���6���h{Y��e�.6�wȆ�7j�T�O��[��������nv��x:�V�dB,ሦ��.��ӒU(�"Ȥ��J��Gr�'l�*Y)Pw�G��]�e&Bi�
C�\���J*1��<���!I��X&��G���|UD�2'�Vť^c��SjWYGg��Fᴡhz�x1�bY� 26g>K��`&�iu��pa�P�"He� (��uJ�4�h0���f�wHe�!;Z�v(���`)�N�&��%���V%�S-��@��0��$y��nja�:�H�E&EN�n%v�P�U�v�$�y�Ү.�`A�,�@�s��|�32k/�R�}�҅f]����e����Ҍ!G���j�B>����ih�S:��>�����s��A>�n�Kf>q ( ��X��N�$7	��	@-,�dFB��@�/�l`{�(
|Jۘ�^���P��{MA���Pb�xn/�ja����e�8��@P�ҩ�*i���H�<�K�BT7�/e��m�,���⁌n�.���(��͝�6}F�M34��.�%o5Gwd�r�mq
q�"��ElR��\��_����M�҄xFĊ�=��"W��a`�"��~(��箹$���.%`{��~'6rú�po���I���=��%5�3��)�Zwb�CY���W#��("�'������t{����L�_{���$�_��o�䉞�O��&��q�cd�/����r@��G��Z����iij�/�!��u�Х�kJ}�d����Yj�$�1y����4~��@[cI��'���6c��<,l�T��!���@B
=�M�<�F�6��ʼnA4T��"�L�t�BX�q���ܡ�рzA��:�A�
Jբ,n�\���$�wLz�A\�}m�:
�%{(}KQVr�:=Ҧ�
�:����+�Fd޹̹~Q���A,�-�����pUB� ��k8c�E���L*iH�|���l�`�%m0��
W�^O0��&�z�?ǡ>��[��F��Ge�3�gΦ�*����7�<�uf��� �K�o��d�L�◣7�次p��B�%d��s��O��rh�-B�v�z�6=ۋN����kfy#%�E{��=P��u����ěQu�t�`���$&�0z�P�3K���5�L��ӡ}/׹��&ֽG a�I����_��|OH�_�iU�U��ie_���JPF;&installation/angie/language/index.html�L��=O]K�0|���WzOB)���(���tm��nI҃��o7��>�����N~'�5��W��+�4��@p�;w�ʙ>�j��C�6�P�d�������8,��Y�O�<�܌v}�eK@���fPq?:���w��4}Y�mQ��J��'�ğF�=�=6��)4�1ku~r(�o�ԑ�C	��B�Oٶ���l��E��:��"�$�"&X*��Zg��f��Rn�?JPF:%installation/angie/language/en-GB.ini�@����}�r�ؕ�{�VM��*Y�t:��v�@$$1&	��V&S,��$�$��d�?bΩ������n���ܱϙ��,�������~���g��{�E7�W�U�IY�E\�y敋"�T�U^x�x�i���bq��&��(��J����?%�<�N�E�T�L�U���o�?�m��:�<hp�&��"���M�u�o���7�^�ۋ7��|�
��M��K�Ñׅݗ�&߮��{���WKk�.����φS�,ɒ"^y������mR����=��
6P��7o��_��`��"^'wy��['e	�.��,�f��J�"/���i�Ѩ��Q/΂�8�N'�Lf�����{�b+�N�b�.�I���k�O>̆a����(.?yϿ+�{Y���͖;�v�a4��`<;����:q�=��ʫ�2���_��<��|�J��C~��r>�ɝY���8ܡW�o��H���q�}W�v�;�A�i���d���4.}�0}�2�F��~`����
�a�-9��a����1�0�A'�KZ�Y�,`Y9�/�n
شɋ�@�m�~x��V�u��F�K����o�%��-|C@���n�r���������d'K3�1��%R�M��&Ɖ��j���ݣN.'_8*�xt��y�7��q�ϣ#��ް}����	##�~����	����>���4��t���ѱ����`=���#�z���d6�'��LJ&)��J�kX��"0uo
�͛'����}�]���&?�����6��Zo����)�����l��&8��f����J3����ѝ~��:���"Mn�U��s���1�D�,���ju���F�+��v��
L��;z��^�vqW��Ƌ�"_�={3x�'��W���M"���UZ��$̤O��Ӈ������xˤ����f�����q�	φ�I�uǟfE�ȯ������u\��؍�x��"E�͒"�Y׏��O�~��{2O�D�d/��W��[�a��@��k`8�g��ɟ���rc���{��j��߷Iq�hq�,�VG���u�G�E�����b�!�|�7�>e�]�6���T���1:�0
G��;�P�!T�%I�&��f����E����(��_���(�b���H�V�÷�-�1��p{�`<1���Q����W(���t9`K�6�K!ڳ���x���T� 
OO᧽;�P���
~o�L?���`�q�٢ʀ�)^��h|����q|�1U��긵��r��>�j�'�
O[$��}{g�*��Q�F���f	x�mQ$Y�S���m���M�
d�H^	?�����`�{��I4�
��ਇ�=���8��~oT�đoK�;�P�A��&Y|���8��$���*�3�EN�4�����ҍ76W ��O��t���>;T���O/�1�I�~:aoymЋs?��n([�=�fc��&�<Pǽ�C����eZ��y��!��ų,���+�]�|�]�0}��׉�c���.�j��t������C��^ig<��>��p/Ҭ�@&(��a�.�S�5\�)������n�
N{C�E��R`77��Z2��qx1Qrr7�s�{'E~W�9�[1�
&{f�d_61.�qwv$"�a��c4��9�IK��?!tt��^����}�$���"�qı�2�趓�
,���q�R�\�~��-71�3�b(��b�e!4v���<4+	��>.�>B�9���G�^��mn6�^��Q�p��'lz�<�#k��j�f}	�װ:��ft
(���
��|�\�$��U�9)��\�$�pH�/0���,@2���"J<�M\� ��o��=H�l��[���O�&��w�����0S���[oA��
A�G�}4<�E��̺M�0����q����SRq��u)�1�{����۠�D�.ٜH�E�t
B����7�l׭�^�U�&�
d��!ݘE�)�^l���YZ���0�;8�kr���$����+�q���>�l�o�Umq0]ox�d�e
�1�����U'E4��B���v�`�a�t#M���e���l��^��|����˗bQ?��#��(��7�@�|]�v�#M��j��,)����\�\�z+�s\;Hy����xA�@�9D����u}�)0LS�B7�S������=g@2�T
5?���lwe���.h�n0��HƏ< �۬����$D5�J�{@�K��<'樠�W OR�&!�^�ER�
yq�3#d�i��d�^����v;,��֥2T�ڋ<���K�%,
k!
:�M7�i�"c�Y7�"�0�N{?�(K��{��%WH���?��-��ҐQ��Rt�J}����J����Б]ŷ�r�'�$�dx,���;:���_�C=|���&ήQR�[4:�}�8[�;꛸1a[W�j	Ta΢�ן���:d������^� k	胒����V�mz��,�W�..A��M3�P�����!��}w���`������6-Y��6����̈́U�0��:���'�qo�S|���v���ԃգǛ���������DS�<�gz��������@����!�	(=q�
�	5>�\���:x󵜍,����ʀ%ç�ɶ ��h1IF��Y�O0�u�R����	J=���|v��i��.N+AT�`}�}5�#���|�^o�R��k��?�_�:�y�.,3.�!q�
�O8����D�T^�y����Dd�1�8�tk��e�8�f��Y�D��)\�����Qv(�i|���p�w�w�ޣ��dz<��H
�x�2��X`�0�G`Yx4��V��'j�0��P��>�		R�ʪȳ�{�4�a��S�c� �Ƌ�ux�Vr��h� �eDf�6.�X�Š�X��ѻ�2�y���K�&�N3P��ص�nOd
��4�2(�mRl�O0�I5o]r��{f������g#�i2}�Jo6	��!���@���e�΋�($��JY�*)x����@��#���V�"�m�%�0�L�:�)H�8c�ۂ�!�iZ¤�,�,*`�Д����}G��jXI8iD%��}Q�
��d��%Z2[�al-�ZPS�!���iW Ťx㖸�^��
��k�hޟ��0���8�����C�Z8��m�zp�&�#�cLdž�KG�$��	C���y��+D,8�"��6-���`������tn^�mŊo�'>��N�5B���D\���
4
XQT�[ +�
Ȩp���
�q��)H]�/"s���.�x�F�h�e
o#��aX�aFg%�@g�;O���E�5_#V!��!u�h�7���LI9`;$Ak����֤�0K��Z+���:�S�o���@�lOqv/@�{X��8�4[�_��1�l�O��?�}�R�\mZ8�q����(�e��5��WdC�k���6�qi4�P'�w�	�`��Տ��H��u��6���O�>_�I	R��%|JW[�t��*��k��̯�;R����
pfo����B„��ec�-�
��(���HG�p��$�"w&<���t���4�0{�����ӑi�W*"4JQ�n����i�� @��s�y:��0�ߓ[�i<蜍:d������n{�9��������	.�:-�0���y�*[����;y��`�^αk܄����f�c��-�w�!m椏�����>�����Mp�Z
ܮnryszL�1)���R�	y���dsg Ǝ�1���Wo(����O<����n�����Yp^�\���l�exT�=���X��M��z�x��9������hD�#�VE�B�%�Mu�ĥ`�2�q�La%��x�M��GzxP�Omje3��MS����F{3��p6�H9��lH��mT[��!{�����gz�W�z3�#����Hف�6��E>�"k�(�.!�M�-R�:ζ�}�֑��@.;�䳔t#e���Mz}���r�T'�ĂⲒЬ�� xC����F��
T~N�Ȃ��eGh����@�f�4�xc ����o��Ɉ|�4-��Pă�h:B|���
�5�����q��Q�]'N��MJi�������j2�	��@{a��?�B�L�-����V�!����/������J<��! y�}4�����5���E�(!����+�� Ph�
d,Ba):��M���ʐ�J;/kR8���A>#[���ݰI,�	�F��� ��(�&��5^Z����
s��Qߢب���0c�=ۺk�3�6h/A�h��?�������!�f����[
i��8a��t:mC�Vhh�(���8z���?�^�W�͘��	<��L=nq��ՃЭ>�)YD�D���rH�-NI�]d8�0����\1�^��Sװ~ҋ>nr���(o50^�p�u��U�۷ v~�lk�G��"�E�����A��W�ڱ�f�@��Զ���?�p������
�'(US�_�ul�����_W�߷����-�[��X���uZ=��lx���A1k���)t+�"0�O��O�}�/4�B��@���K���H,�<8���{����Żu�Q7����g��W��f؍!��=4������o��=y_v���>8�#��X�[+�Y����^���V_��_����-�X�h�`+ő�V�my�n����*��}�w/�+�I�n@2+��o:�*,p���G���}���~tpd�/��9���%@��@��dp���W�k������k�q��5꿿�ݫ�_�Z�:~��՛�^��?�)��{���1���PУm�g�� ���J�@ �
��g�$Vu�ޢ�o����E��m�l���r�?�F�'�i����_������3�3��6�:�5�_�z�W��{�fK��@9~��M���Q�_~�oo?�S�"��3��&6�S��
��_/��H�
,�6�C��9p�C�8x&9�p��M-Fq���P~"�@��S��3���F�_��[�Zz�-m�\����P\�1�xmd+ee�z�����i��	�2��
,h�ȱ�@�6\��F�[��X:A1_���Z�0�kG"x�N�n����;���<�����D���C#܎pC��:��))�~"w�>S.
푡�������#Ė
��i�0k��r�����-���*��Q��S�	�X�p������6R�R�	��v0y��X�6��Q����C�_�#��*ڒ��ꀚ`@*�ʦ�/[�ck���gy%��)�HE8���\ĕ >��nPg
LP�V��?	���{;��K�2��_F���v��8��.A��<�A�鏎�P��A6(�7�+�Zq�D�d��=�D���0�_w�:.�kLs:�kK(��SՍΔ�+�J��`�
N�H�*�º�Xٔf�Jx�J�/�cJ��^��T�=����_O�����2&}��nn(qfW39�������qx	@�G�<1)M���#gD�5�W�=��[5�up����?�8�^L�7?��>��'���Ҧsҩ��O�M7�����re�a]��*�>�C1@ZL0����_J���La��e���$LP��b�eF�@��ZWO)c����EC�o��O2�����n�_��X��{������g�-�yL�kӷ�$otgb�_,�mV�z?b�Ly'�:lԲ������wz	8�¸�1)ҫ�������IS��"lO�zR����=
T���|�B�|r��L���c\�B>-6lG�`�z>3�����P�F�`>�Z��H�!�Q/�B�?P0�s.v¾\�[,U~�#���.�/o1�U�:�
~�M؝|���䳤�Rb®�rT>fVA�w-c�F�-�
*���$����3)Q|c�[��<�x
�YҠl%�Â���a9X�ɴ�x|C�4�[�&8ֈ�4��/И�:����{h�� �M��j�di�xN�L���ծYe�F�O�th�aS��lu��ςq8����!��C�g!p7�(fթ�F��8��j���yh��8���:���� U�W�x�(Kѐ�9�����8"FLXǧcn�:~���`Ĝ��z?�0�+�J���|���U���(�@3�I\#�����:�Z��<!g0���T� ��qiE�(�C�k�R����M�Y�6g'`��Q��8�q�9FC��#�@%�N1Su2ezɩu9r�dy�y��
'�GP�s�s`r�U�`L��-�Ol�–4q!/V]D��޾���`�hH+M�oIw��W �v�:�!��%�g�SƆ����$E���͊91��
����)�
�nE_��'}ĭH0��/$�%^����r`g��#o_'$����M�2!�*�#_�:�a{�����D{{9�W*�%v"�6��-�7F}�#����00��� �D��V[�rي��*���e��C'��.�	�(�#�0��9�:��c�@:s��|(I��-\BzJ|.�'�g�2�#Sյ7%��[�	����ew��ă�^�����갫u�^�}��pؒ(4��ʱ#Y3��V� �i�R��>�����r{}
���B[�Nw��5؊}�q�=\�Ԁ��o��3)�v^�(�S��Mi&A�h1@ŠX���|��䚝 m�jݿ�$ip�]dX��r�0�-���Z��pJ�8�#$JҦȂ֕��m�g2LܓgN��dQd��L�KU�*��$��T��ն"�_U�b.���\1�6-������xp��nq�KO>d��a�M���S���>&��n��P�R���p�}��Չ���:��o�B*���G���<���S*�����X���t�<%\&È�if�9[�~ط�anx���Y��s��tH��)z�f;�Pv�.�Df��X�N�FNWU���h��IE��+D�q"�%#�1����9�9�<�
~�`t����z�TK[V3ӆ/���0�y��@X��R+5�r/��Dd�Y�l�Otk��<�R��|[)��Y�.�SR�*��I��1��2��������%	*3j�B�KW�V��u8F��0���`Pp�W�J���e�h�4X8�}�6ت��X��B4�ԃ���J���(8+�a����d{9�t8+�'�]�d-�G��%�s���W�H������-�� -w�
h�)em?��i����r���@y��Rg\�+F������m���S�?�죬<k]n�T��)�'����F'�	�
I��J1;�`�C?|\0��R-����,�S���u᝜�#ғ"�l8_j�y#CK%��@���Q8A#;�v�=
/=��e�5^�lա�a��:��?���Y�%U��'Iؤ3Y9����wl�?�
��=��V���ZDCg��]���]�Q�} oyE9���� ��� g��B�y�\U-+�L�V5�2Z��I��~���'2�
��5�Z������m�Rm�՘����y-(;yZ:�f�:~
��c�Ñ��#Ue)jeY��^5�cA���dC�f��C��qm��XYNf��d$r�!ѵF��\j��i�8��p4��X~܀obC�8/o����}Q�o�O�O�ƉʢƔs�ug8��Z8-h�m�A�r_��s�L�MЃu
�����9��s-\f&�T�q�rt�G',4�_�֕o�*,�@m��>m��c\��+2Cq�[`B�B�v9��]��U�2�5�F~J�m�P�p0�?���gϞ)�߃���5�t�2+$A�%�.quUo���.�+�NJ���.ͭT���N�s�Dm�n��Y�/�c0��&�8��/��Ǥ�Z-��(Q�d���X��'
��8Y0[�k���<Ĭ��p���������/����q��t��v=ǿ_��7�G-D�\.��Ș�.]>���D�S�δD�����(w�/e߅���+0�Y%
(�8B�sΐgQ�a��}��b"+X֚i��vR�uݒ��*C��/��.��kh�-ђ�<C�|���Ca�e ���6���Ш[$���TC�lL/��>���xFѥġ��3� �Z����&��-v�}=���:t���?M\e����FY�H�#�#W
��Z��W�"��6e@ܯ�(�'��?�8��t�8m��r
F@��͉+R�8���u.�����vQZ����.b���>&�G�$U��`�j�7<��)P("�*V6�e7��r;�kFA�g�!G
Y���+����&�#V�՞�^��9��4i]�}&A'b��hٵv��PΗ ���ʺ�yj�)��)Bx�	�o��Kr�R&
v%.�dF������Y�#Jud����+-�&��5�vG�� �Nfh�w���J7Hͺ31�V���Uz��C�vOT�A0�&&�F��=��cǝ��>����Z�$`��3�vt�MB2]?}i�/XHk�z�}�禆� )i�=A^9Ҟg��c]�8)��';Q����
��P�<�0��zi�[Tѕ**�W�y�G�L\�|����L�]��*&��w���7���
L/q	*�����K�b����2�o��>�K|���Pݙ�IpJ&����R��d�aD
���>QЩ}���[/8��M�X�����UY�'��j��Kx�(�MR�.�XRUi+x�v���t:�8�s�O�ل�Pr5ƅ�z�RE����;�!�ǝ����L�U�+'�󈗖�˓�@#V$�
ӂ�2(��n�%�,0���z
L!��*{�h;!��s�'�sI-k1Ty�B�
I}� �<�нas��i�- �t�m1���Z�\o=][$6��~oU5��Hp�lX�o��Z�}%��6�,��Ԭ�j~m��cN�� h\2p#@ty�'lk$+*+&�e.�.�[�
�ҋ?d�&?3�<_j�F	Z	��}*#�qqh!�Wu��|���,�ٹ�1��UR0bB�OI�a����#c�5kA_,q�R�DW�Ii��(h)zlW��\�w7��"Aר��0n\�0��^j|���_k���*ư!j��D�:�!�Zf�h��S>�=<�K֊�e��V�+s���Am\'�v3�?l���d��VKTE��v�no�1e�r����2��&!93I=0.o6VR�&���Y�K���
��-�B��fBJ��;-0����L5_�$��*]!m�f�Sl/_�G��������
�0']�X��A�7�(iq��Ï����D=�>�-���5R�E��s����D*���CA'�}T��c���R��9/��'��rNKͿ�ҹw�&��m��-�&0�y�j� �靧���.���7��]#qH��6�����V�W�{���_�k>�P^ H�$��Py�.�@ɷc<��">��<j;)�@���?�*��	=��S�t[�!�q��O�9DM�XXWi�_����}�ꢤjq�5��S^4ޅt&���A�-Ő_{�x�T�Nd�����bǏ)�@a����po[gP^�jQܘY4^�$��b>n�Y�|�=�s@	��fJ�ߕ��f�Y��U����!�67����'�d�Z=�Һ=�7v�̗pJ�Vt�\މb�jZ���Û�=h�4LnN��������V%Ϫ��ִٝiͻ���p�9�5�)��<����!f]��/�B`dx4L�Bh��Ӗ�[�Q|jY����-CLF�R*,���G.�G����߽��D�e�Ӣ3IEu�ۦzlM�����ǭ"�՝�wc��0�Ŗ�m��D�N�A��]�@����j�R1��U��u��ӗ��H�zX#�G��nA��N����ٙp5�j��o�Dӑ]�^:�Hm����َ�&%�L�8�ta=���mM��y4�P4���������dֳ�y���E�Qu-�e*�ׯ�#q�ڤz�����z8�!�5ECfv��y4�4
��:��O�T7�^_V��X�sS������؍[޷���0+v6�I�l��NJ�L4�K���U�	A�)�}���RG�ׂ�G�FU�0�y~�~�� �����юEDt:�5Q�I��\ά����*e޲$9'jU�Vo'�)�?&��N����U�'�酪�V�"M��iU�weq*Wqysh��T���ݝ]"�$Kl�*�me�U�a�)�AB�6�g�̋ް^�h��*�]X~}�N�U���;��D�ҠM:�'Y@�+֎ZUl��s�^�HM���4Ɗ� ����%)-�����Q��f3��k`G�nKDb]ׂ�B��+���d����<W�*ƽ1�օ���v���
�칕��!v���sƛd��R��(g�T��o�!�SwC�E=�	�*��P"��^p��>�߼�Ð �D��>���Nn\�^
sq�yH��k=@�!�/8d��
�0���!?��$T���b{3� :��ʐ��p�<�Sn�"_y)%��&@��V�p���NUؗ�X�]�j����.?��E��Jwl�<��_`]$Ϟ��r�G��x8�M�@��$�ۼ%s_�!'���7�yK��]��,�I��;	M~n���_z�HβkN��A�$�~���tvA�̘{�A��i��a��ğ?�_���!/�j�W}�ы�1JX6���&�F.�0�~�ɒO��+�~|���Q{ӆ\�����ıY-Q��R����xz6
]͕<_�J�ǧ^C
אc�V%5?�
����'iGG�$abN�J`�G�U_�<�`��n�����A�sw������ZS�TE�m���_�,3�T�/�n�$됀�˅Y> ? �;\��GB7CK-n����Q ,O��&�x[�ZM���|s�<߼�:��de�+��s�/V����v�m�es�-��_�+kG�=?�ܛ��՜(�/ֱ���"�7��ě�T���N�����_��W�SH&Ky6>�B��6�~zi�/���;��������>��7����N���41�:+�D�Sw�$���fET�r�״��(�Yi���TgѼ��PGʕ���V��?������s���(g�c�S�]�O���$'��c��,���՜m㯹"H��u��X��I�Wrs�j�6���7T@���W�
V�v4q���ub��/��d-\ʳۧ 92�>M�ϐ̵�H[�mbW���2��c�s[?u�1�d�x���0��W��8����+##	g��L<-�ؼ��H���i�f
���>��/Y���?kf��,>�`��о��uV���bGӒ*h��j��z�R�U��I!�0�-�v.�_�x����7�
2��<F���9R��I�d�cn�,+�S`���@�L��\	A�%���-عږ\zeT��Ҡ{��6��
��4B�-�P�L���#��k+Ew�\Qr9ڨ��e�n���,�BeE9A?*�Бi���	�4����\l��f�+��S�E��0QO��7�U���t��"�z�Tޓ�1T"K
��t�R���5�U19y&¦��z˚��V�M�Bm9+J��um4��h0b��1.-ۅ5iiIkuIMa�Td1�R9��/���0uܶU��B�&��'�I��D,��/ �����H?<��ф�c��їm�J�+��na�/ح��L%�t�a4��9oƒj����z�m���*%�4�����D���|F)7-��{@�\)��:
�gA���3���h�Ϝ�����׉����k/+fEY�nk+CR�j��h<�_�S+��,�d�C�1��78�[Y�:�HE��U��஽a4u�Jj'1�H+WMkn���e��e�(]�z/��qe�%˔T��r�lb`��98�h���l���1G�ѶXx��x���nl�;IF��K��y���DsE!�l�Dw��2� MtKnSz�2���'�mA���s`3|���܇d�\���������t�Ŋ�"��dEԗb�Ў��t�
E�QE�O�7�Qm�̛#W����SB�;en��ί⚫ڼ�_��,'��u����Io8��~�ƙDp11FS\Jf����t;TG�r�Q���<*��9t#��$�4bM�6R�`�2y!HGO$��&�O��jΝu?Wj�ŔJvljw��6�P��������~K�^�^��VRO\Z�{�ū�-���s`�)]�4�^LyH���VW��V�6�:+|�f�Q�"�X)l�%������<��5 �v�>%K���5U]��N��;aoǜ�9#�:�S��|��*��Ai�V�~��t*���.�<���L��]2w�'�P%���s�ȣy�*�c��HJ2���ڳ���jM���=��o4>�'�&���)ʷ�vP�#jJ���DUҵ�DǺS:5�~3MU���xR}���bJ�~o{��'�u��aE �i���}x��rb�<С�7O�R8��苯�P�u��l�������P=�L�wڢN��^���
C_��'�+��	�e8���0���D �
����$HFYP��*�h�%J� ���$uQ��
Bgu��%���<�m���C��Z�-RU34�R�9���5W4��{c6g�4�sL2
΀�b�#+�ǴQ��7]�Mk�<u�Y#j-��dp�ϬJՅ�]�Vjk�f�%|�*�9�
e겷ʘ4�W	s�sϼB�'��,d�(��,��ȸ<���&����DTCTU���9�_T�;v����d�����.4洉��j�.:�%���M�V�I��\zlגP�f�N��-*��c��$�_�r�\?�yƽ]7�*H)��x���I����T�9��0���͋�?�+7�;���9�~�@���<��]��A��?RO2��',��Q1�i&�H'�uh�K��P�i�V��bDVa�k��~�Mz��t�`��[w�D:���יu���,<=��ۮ�^Щ��Q�.{���~�v_��1&�n��E�^�v�D�%��}�᳨����O+��.���׃pU'Z�¼�E����j�����GXwd�N�D2G�;H�W�m�PL=��yL:��{�?�o)d
�nJRb�.I._�K�P��*�L��Ta$e��7)��ؘ���5��^�(���,�]I��)b�U�x<t�����n?�a�M�Ku�S��=
�:D�&U�e���C�v�㓷!�{N�>�	"TR�mm�T���m?�����K��zY��_R%�JgA�;\�Ҭa��U>�6-*�g���B:��R�-I��4�6

���Jz�`���,�zq*��\��9��rE�	�"C�!��`]��pʬ�v�b�8�Y����.��Bk���Uo�oU	�m~D��|l�	mB���T�
E���՛�D
��;�*<��%�5����T�0��UI�x�Қ�G|�1s���ՌѠ!D՝��5��
bd�����E���b�4.����	��8�z�j�:�ݐ��p3l'M��d�`a���~�������U,կ�h��C��$&A#�D�F��^�s�,�ō�ڦ���y���K����`��>��BV�AK4لB�ݒ���_?�t��M�7�j���)����n��_|��I��ж��?ͰR�����A�ɤ�2�_�Z̢�H5b�s�%��0R<����>z
��D�
w�|D�. ��"@V(����X�
@��B�َ��f>�hG
7�:�� 2����'F���MY��~pM��T��g]��1��4�YAn�t�L�T4���J�v�
~UH��zz����C��JQ�ܧ�(r�]젙:oF���tQ�+Ky$
���g�
Z��Qo�Ӧ�#��B�U�M�J�Ec/�Q���SO�L���e8Fm���6�eY9��F.h�����Xt=`:&�M���31gc�R�!��hr6�d-���D��8�x��]2?��2k$�^��c�(%�T~�*1v��<�]W`���Z_���'k��골V�M��3#3)���<f�#�qQ�Ck�P",�D;���/
�X����|�|�,����g=�t�j���.�F_b�b�8{��R�V���]�0�	�쿷��&�̌��Euoh������Dr�(�W�e�jd�0
�$P�U�|	�g�w�d %R����ɗ�!��*M��U������|���"y!�m�S�r� �h����X��+�_���׆.1<��^$R�K��Ũ��xZ�h}�4S	�AIl��uf+7b�}A����2r+cbNR��^��ߕ���~����8L�X�S����?�u*��6��K̅��Cq���|ۿ�)�:z�>�i�@֜Th��[�1�������*N�Q0|p�+tĊ����1�Fn{��(ɐ��F���S�4W��-�� ��ϰ�P:��y��YVqY`�y����w����ћ+o0��ȶ�S��J�{���Y^R��iCɳ��w߫��}��S/����{���M�ӊ&߫�а��S��#�N���?|��HTVӗ���6��ȧ��0dx?���ʥmbz�}Ώ��X����Y�i�3�����B��w��ݔ2�3Q�Ͼ���v�C[���ʧH�(���$��������n�D���UNV]4r�F����.ɻ���~/�7�3����`dR��)�IhqFa1���"0vc>�*�H���I0�@�����J�kM
|A���	L�n$�D��H�k�q;����(pG	<�A����4PgN���Om]��F2�ꌉ��o[G]���)z��*.T(R��

X���^ ��i�&`H����+]��ʰ�s&��X���+!:e�4��!�\�Û��Tn�8H+��w�}^�<�w �$O;��ϤB�.���1ݒ\M�*49�d��E�Q���gar��Y��e
�ZYLm�H�_�n.O.&p^KHƚ߃9���UB�<�{p���~��[n�/�����K56@D�k
��K�#��ʡW��H�+f�#���Q!X��di��d�̵���Q ���I!�Ht1���/�+��_�Rm�Tr�	���u�*R�<�j"=?Cߐ3\��欍�(gI���^�`�
�AD�2Q�0�L���h8�J�b��5����2�
o�h(@�1��h'<�30�p`
#��
д��C,Ё�8�[�rt|䑓��֫�!2�+phukS`��;�'���7
��(E4�51i/�]Q,���K3��!)�[J���ו!�\>.�t�Rn͗h[��ǣ)���{�*&�vI���U����YQ��.�mI�F��ظ6I�[�����"XZ�%�k^��Ƕ�:��}��E.���ę���
6Cs'>1���T""��&g�/��Z���͂:�}�BK��'�Њz�pN{�Q��r��#V�P��uU��)�*t���sF�G�6�W:=�}�c*��H��bcƮ����hF(�'z��R�W�3�xsAO�4����,v�j:23,�+�"�o!�j�n}��+~L"PҰ�����.���������r�v�uo�$�#��$��$�ERJَ���ڀٴkX4C'�I)�T�3�U
S�X�W�Ua�"�Ss;	���V*]��g)YE�z�ʩt-�\,�2%u��
MP� �����fxt\�m�d�:��>�7��DB�Ѻ���{���x/u�åC�u'U��^
jfUk}�Qxv�fC�#�Zx��q��mz���dtz���<H
�Lr�!���qI
�w�3��u�"���Z�N?���0��{������28�A�d�$j邛�}9�(X߈ށ��7�;��I�$3X�R��a��
����;����lI�(�7H���s��NrY�+"]�7�S�`�Q�(ě^�uf�XUO8
q#�zms�h�QY����B��/?���!�ݑO���9W�Xf����W�i\�>/�:��g�?0yG�>;�2�xȄb�R�-Ҧ��H?�M+._���=_��Vχf���~����n��"n6�w��kX�&K��nAϻ{p�Ϲ��IR��,����%��ʚӓ���ve�M�~ñƚE0o���=Ta���ls]6ޤ��b@By<���ޮ�SӲ��B��7jO���c#E�<�%�]����%z�)��܇��?�GT���EXk.n-��s�j;�=8��!v��Cr��I	C��s-'	�^�����5[�#|�h���մ7�?a�_?�@�2�|Hb�<j��!�}a�Zw��,<<a��Gr�Sn�2����/JPF>)installation/angie/models/offsitedirs.phpt��MP�J�@��W̭i�6�'Q�DK��(�g��4K�첻)��ݔVz{��{3���mg�2MRu�����@p�q<(���l@k.��w�S��x �fD�'j8ʓ��g��h=&�Y�# 
v���0vtj�<�O���Yv�ȳ|�Z��h�S4zc͠����
�xK+A���W�'*��q�����'�@�O�VW��t,���1I��I&��b�^��l>	��d~˘�<�)����_�vz�T΃���-���a�JPF8#installation/angie/models/steps.php	r#���Z_o�8�>+������m6i�6M�Mݢ�b� �%��V
�r��7CR)Y�����/�ə��o���o/W�U8~�<$��dz~qF���%�J�E�/�L[)�qAfq�\�X$���$�Ɗ�d�@&�)��䕥(�j���cNW��)!@0gT�%|� �|���� �8<�����)K<�%�}DހB��x�sI���*ղr��B�����T�9�X�`�\��5�e��I9 �y�)�XA�At7�����$"A��`x�	� ��~�S�_)���~Q�Ha]��_�!
@�$�e��Դ��%��XAԂI�+U���h��u,`?��q�[��d�
3��A�2fE�'�(�|��XųX�W
�PoH��U���sf��*Z�'�,�%�^Y�̗/ɜ�b^[�}��v͵Hz��͙�(�
 Qsd�j\��E�cS �Fd0@?�C\N*����QH�?���B�T�'�.��"-g.���71W^��t���������l�l<o������,��J=\$���w��eB��dTA&��j2��櫱y6c��rP��پ�)4�#}��P�)��5�u�/�N#rQ0�t�6��4���jN�(7�ᩬ�y���ɥh���x��78�c���d|�>+V��y�:�*@C��Mm{c��L/��5n�ڱ�z��
b'�ֲ"������
ߪJ�^��ZvӔ�[�žY[�;�xI�gC6o8����Yv��X�M��1*_n��H��e�,��q�k����#�0h��A��c
��y����_���>QT��W1�EJ�nV�hy�I;	@��RaS�iFO�N�+?&m��~�6����ƴ��j��=��<����Q����&��D�����4�J���vsݘ7��l6"�����%h$I�Ie�>ɩ���plhj�>����dGUE�26S�6Y��=c����C̥���wwӫ������Ô�H4֓��Dp���X���9S	���¢�T�8Woa��\�������e���H�a2��T
F�{*z|��>�M'�φ��9�>��4�I�d1h0����W?�� �w��JּáG���l]��Ǵ��@��~V<�n��SÑތ:�3��Eu@?q*��'ҳ��=ܚ@�4��M�Q[`&�J�vJ<e��m��ŞSV$y��;���'2��%��9�G�x��ױJT��qe��&V��P�{��A�\R��i���m<NS��Y�;�ر���\'-�Ak���x6�w�@I&������X��v(m&S�ç���\�8%�6�Z:������ؾ��Se�פ�*�{![W=�um�o}�{�D�".�p�k�ˍ)�k��ti�������8yEf��L�p�_*Lm����������8�	r�2HaMReu@��a3���E�p�
^\��Ѹ^0�.#��ử��du�۞;�I�fi�k��_Hm)�a4�L�� �$��Sb=���},R"!�F �Gd�>H�e<O�bgx�����ڂ�D��S���6��N\4����C�4�[W��E�����33�U�.�Bljs������!�A$�(� HQi�7����U��ԝ@9t�Ck P�%u�z���
Q(��x8���ǸY��38�w��c/҉�7�"ul14#��~�ͬY`L5�J��7� a �̋.��J��?��2M���8��u#��BU�L_�[��J��ƭ4�܋�fX��ICLx�us~�t��d�H+�T��uU��zH�DzA��t	���B6�@G�1���JoY�[�[�v��F����mO�o�O��^�ӹs$��h�m閁�_~�=�DUլ�{}mzFʋHU�G� "[�f��[�m&��r�c�h�Ma򧗕�
CB�d��~�vUy��K\7�Ɉ
m��������om�3�6#a�=�5Uv%��R~W��h��{�־���X�[oML����-���5�pk�5�n�����*{�C�����J�Y�#�m'H��:�sV�;��[d�^�\hw�3�و��yJM���m���1�9�YNx�F=�O�[6�e������shd��1�;ˆ��J�8}-�F"wl;�e�G�=0�U"�+)���7R#�ĩ�G��D6�K��K��5��k���`�VM���X\"��9�����-�$Kc���Vxw�g���x�Ć�k�U��:HQ����� �+������n��.3ϼ�WK�(V[�鱓�m0�n�N���фVJ�u�?��JPF=(installation/angie/models/ftpbrowser.php����Wmo�6�l��`@r�8i�XҤu�43�y����"����E��c���#)�VҮ�H���^y~��X���'<���br{p�D(�FPXj�b-de�D�a.���* V�R���Da�1��Ʒ���8�<�O>�L�
6� j�@bX4g�,�J,�Κ�(��wxp��"Y�,.���m)Ye������]�H0/Y���.0GgpY͈q��d��
�\��E�A��\�F������q8`�T`48�� �0fܿ��w��)�)Q�i�S"B�o�����%$2�11ᔳ��P��:V0&m���
%ք	�s]�	�U��V�jМ'�\$,�YF�(P�X�"_���cװg�EE�v�K��3��F:-=V��R���w�l�^�
���y�[��?���j�h�(\=�ȃ�zN���"Q��I��H�H�v�p� ��1ݑb��m.e��x���B*�+JdsF��R~O�"�چV�Q+`�,!�z�4�k�b����B2��KQ��^��xEjU�q
{V��`﴿fY���()�֦1�l���J���Ȟ�����hW�`��8Y�� {�k%���$'�<A������7��2޻�3
ϭ;�Q�X�(�D���Ǟ7G��	��7�NO�����^<�j����@7G���E�Z�UBl�ܙ�T9�s��w��u����^A���T��7��-٪�����u�.�!��ðn�-0��S7��?��&�A�\7F+��@��Ӏ�A`>�Rӈ�陪V�f���.�-�����V�vlK͌Ŀw�Q�6�M��%XT}�K]��z:�;�2l8ep����dJ��+�|	��}��Ű�Wj˳x�&6�Vf�r�1f�%K�1u��q�̬�#�&�Y?�:�4�a��|B�YF��ໜ���Z�� ~N�������;w�,$�!�5f��{�"Z�\�2���	�?��{��N�PCQ�R��n^C��}#g�9�u�Z��ҜA�+2��#�gSϝ�3�DV9�d#9�i��1�
��ri�J���ò�Vh ������Υ&�iقŬ�+u	��{d��R�1]Ay	6��y.u�d.��]��X3C�����T��m��,T���vd4�AqS���b���_�L�Hw��
�`��D[�i��`:�h�$��d�c��*ܱ�����~-4��ەd��l��U��>������F�Ŷ��k�� 4�v��a�CVU�J��t�
N��]��jF�;؉�?(i��$���"-�Yi��]e.��vf�����e9�a�]V"s�ٺ����e�l�V�]/<�_!F��f鯶����z}p-��xM�/	]$�f�u�������v�c]��W�>z��4ʨ�)?�ޮ�6I/��b��W2tԶ�i{�7�O�;S	~���ƭ��n,���(���)�?��W3K�pjz�-�C��jq{|h�Þ��K����&�Ӂ�\���?JPF;&installation/angie/models/database.php�����XYs�6~�~�f�R�H��r�VI�ԭ㤵��G����"X��6����!��������	��]~�}�,����1L.^���>\-9ha8(��T���N�(̥�Kn��J��kHg��0������a�Rfm��
�e����v-��F�����_q2zzt��ӣ��ÅH�2c~9�W��F�B���pl�����D�sM�__��y���]9�
8��w\i���1`H�P�p8L�\�<�������hD�T�xt<&肆	��F�<{��1��׆�)n�����eu��P:S��5Md�h�i�b~�c
�؆�=
%��'�KgV��o�V�kn���[�U��).i�s��-$)�Bc[�z�:Ճ��M�r@!�����7O��\�en�a��K��
[��.\��^e���h8�|�b�*̦�>�#��r�W[�(o��O�����W_��G��`/g+�)j��?OgfS�c���k�$��B:"8y�%I:��y�[��O��Rj�=Ҵ��!$�;d�W�^���#�H�G��zt�]�ΜqB���,�~���L�l�e����􍝆D�Վ�Q��A�ե�d^�oZb�RƸ2M�~c�r�
b����_S�����q"[U7�ӾہQ�p��M�-��%Ȳ�o���t�k���ţ���+d�b{�����*��Yl����f�%ħ�[i��>'���fy�ӄ{a���\�6A���"��)���k�D����)�Z��+�s����"#?�씗Y�A��%�p?)�Ԟ�C1�T��Y
�r��g܉]n��,OQv��Bm��!�8)v	�5�o�)�L���@ʉ�Q����,v�DF��q���^�V�j��?A�r���욠aj|R��cIX�Ě�(�;7f�5K2^�*�V]	����ƵfjӮ^���U�\���-WɡΰΪ�稑z	��8�\w"�k��s�{�/h�w����g�W�������8��P���9�V?�o�lP�,x�=��Q�M�����dG�؋4�@��)O�ۉ���`TD>V.=�9xt�]\��~��x��Q��&xD=*qʼnKn/gDyu��s��C�O�:����&w�W\-x|�W��,;+��)g��#�wU���:@@T�WL�6n�Ug�/�B��c'PK*+��	�Z�3��	���i'���hWgդDu�!���	=I�P�
�Z��#�v�(=�MI7��QD]� g��T�U��I���`�7��;b�R%����C��8B�*`.Yi��J��x�x����Q4�.��t�M�+�n�j�E����8s�5�<�V<�v�TҘ�G��gGn�tu;E2�c����M�Q�l(p����.�f�	."q��(@�6�,��%���΀�
wq���˜c
��x�ܗo.=UZ&�.��(O])Y��x3���H<
�\TVD^r�ܡ4X���pϑw9���#�#��!C���v������2��V�4�`��S��q������:�����.n���K
�ԛ���.ϮN{���3,�,�>וܨ�u�V��joۯ��UY�q�}Y��������Ny�_v�Ы�d�m����c������޷fʹE�Q3�m���t)	��j�V��t[��۪�V��� M��F���6��w;� ����E+N>Y��1!���)��
���x �d����%W�y/��wPZ���;��)���='�,�9�y�1춙����6��#Fl㜂h;�<j5�����2�NVb�x��L�f'�H�%���tG�L�\�tT
������*�dI��Ζ���S5�9�0�T\iX�5�U�^K�]D�Nߺ�]������u���m�_��Z¶��Q�
�qV6���JPF:%installation/angie/models/session.php7�	���V[O�H~��Y)�m6$)�J���@#h�H��>E�$�x��qB���3�K�h�}Y)��9��|�6��1�3��������a#(�$*-$�\��B�3
s!a���<&�PA(�i�`���q���H��d,A��l����h�B�m$_�.�_^����a��X$L�M.)������Wa���Jx��2��Gp�)J���|F�-�+���:�QJ��$��D8�)F�;
n��B���O'�&��"�d�ʺ�'�iD{��o���M��X�W&9�%�<�i�^K�))��WL*8�4O��ч��jjN���O�ֺ��נtta�4�y)bR����B�-�퀛	��;W(�3�\���Rl�•�R c�
�T����RcВ	��c���*֤ޱ�ȭd��a���쟵W��:ih�5���*�Z!�B��6c����{��K�Ҝ�s�	/x����B�d��X������D�;�m��Qz��f�6�U�?8�x���'
6/���S��;��������P}	y����yl�&��s�6z��H�c��S�׽�r�R�p5����Ew4f���:3e���󲴋���w�<0��T�7�pzf ����._�~�\u�κly����B�Ԓ/+�z:nϭ4
E���7�:�K��#I���Jl��˜<x��.�=n8%�]��4�TZ>�R]Z�4��Y>��,�LC���L0�*Acu,��.��S����eJ��74]�B��NYmm|
�E��`B��x��x<�M�����kp;���.&w������I�E�*���㥈@ӥS��A�aH˕�e��9�3�?��&�?b���K��i���+��� 0*�1)rS$�ߐ%"Wt�Q^�"������f�PͺQt?�[O/mu~LM��6��Y���2u�d>�X��y:��p)�Q�j˸�H���m
�2���5A�ɺ�����g�,0b�u�an	�De�n��I���+��5(�D��J���c�T8G�4d(��ޥ�U�W(�ǂ��A�F������z�v��섭�u�JPF;&installation/angie/models/finalise.phpn��M��N1��}��c �XMtF����k�i/374m�"1���]s���sw�;/��H`�j�x�c���9��L�,�
��.��j���Au|�H&�h��vD�D}VX}�l�q9��y�ʖ�,h�N7�1p�%<��
5�N&7��d:ÚU猌X^�):F��޸��J��eX����b��Y
��m�d��(�~��
y��B�\
�i˖t1����y]
��@3�[!T�Q��_�&��V�~�����.X|�#~JPFC.installation/angie/models/base/offsitedirs.phpc�
���VmO�F���PY�6
	�t�zW�#��h�B�TE�Z�
�blkwD��3~�;@����=;/���3�?���S���g�x��A�a2����6��F&1�@��,Qp˃�E
\s�(4Jp#B�]�w/�-��B#K�U%��|Mq��	T��"�I�T�nn�[����O���a(�yq
߻p���:I�E�h�1.L���d bM�χ�p.b�x��[\��b�Q(My}��a
�{����E�0���x�%�P
�bYB���ߒPD'\��lF�
�� ���C��V��,D�J��Dv���X�VP�e�6���q�U�N�St��1	$��Q�ьGZt��Nտ�yȣ�#g��,�̥�?^�u�Jk���8��WwM��EO�'�(dA��S��Zh��1&�0�� QR��ʐu ^D�������d�AE��V��LF"�TN�қ���W��›FC��٬��Nb��j�>��g�
6�t���Ꭽ��ré����SE�欉{�.�Д��p�9���n�����ɔa���d��
a��1؏R��\k���NCfߋ%��F�J��È*�O��6�1B&��;�~`.m�čY�ۢBH�P��StSu���,ϖA�o��i�,�ze�bc&M�K�L {�YB�%�%BSԔ����e��t�*ӛ�ݤ}B%�B�M���}t>$�g�Ce��v6���UNY�IŖR�6O�]�)��<�T['����	b���@���&Ȃϟ}���ή���`|�>O����h⟍�����A
�K���VC�ҷe<KV�8]�b
�
v���H���D���Y8�&]�c]
6�PXL�
��Qؔ�%'7D�)}]z����*R;Σ����������s���������rp�gmZ�RT��PZ�t��M��d�"�o��?��x<�*�]�b�:D��j�F�p���������ϖ��k�ׇ�R����ӛ�x�7=��H�v�s"�
�c�<�q�8�6���_0?�~aȅ�i�S��2p��X�������Úf�
���O�v��-{��3o�F�f���y�!峽1��vBmJ�c�}����[���E<:�����JPF<'installation/angie/models/base/main.php�����XYo�8~��0*�M��}ڤi�����\H��A �ms��$��h��w�:,�rΗb�b����p���L��֫Wmx���A�p�A	�Ar�cɴ�#P���q,aļ�4&���q��LsFsp�81��)"�X9��u��O	�	@���f͋��������u�no�����wp,�i0_7����*N�4�l:�od��"�����gq�8MG����KEv��4)@$2o��>�����:_��}���/���m��Hi�<
bQ�G�σ}����#��r�gq��0}�˒t�THt��Z�h� �cNUR��͘ĿQ�Fqt$�`�c���Q���s#U*#b���w�9c�F�9]��r8G\�]C�!�O"S�g`�'�M1[(�Vm��v˭��tJ�����B��0��KޭQ�2-S�����f��0*:��K��
��u�d�?���
�*+}�8B�:$�ܶW�r��˗�P�R�H[��b���"�7���4���̃��e��^c�zqbX�F�Z"��Gl-��0���JtU�w�W��})5L�&G4�)�H����DM(n��5e���O�W!i�iE����,��S�Tը.b��4R��VqEtk��b�@x��=����:Re&yT0�w��Z#&%��yˌ�JM+w�*����{�$����d�ig���z*��B�x�V<m��P��|��{�BI�>7�~�B���Sg�����Cg889�M���2y�_G��r�0א���F(��Rb����*�T	q�f�	�J��]�>��х^r���E�hܭ0%tb~�����>F���R܆IrKL�"S��,�W|^XlMc����J����n5(�ȸ.K=HU�Y�"{?�3D��׶�����gx����_N·Vwc��H��X�Sh�@��}{��YT���-�2?��}���Ӟ3�?��e���mx`=�
̴�n�J��s�����g�xQ�:�'{������~9}��T?�z�O���9����<��g�֚X1���&'�VÃ)���΂͘@�"z�ج���K��t�%��TOm6��uϜE��A$Lm�N�J��B�Q�}�ԋ�@pP�m廋M�[+�/x���9kK�N�Z�8��=!u`��0
0]A�1�\���$�zfmXT�D،���Gi8�ҍ�n�P/N#�(�V��O�;Y�w���-�h^��wHXe��K3�4�G�ݕ�aIf6���"r��g�Ñ�r����/(�����$y|��G�8�b�Z��Tv�B�8�"�ɄK`��Jh13oY	"�x��8�L7��Zذ��u���kuHк�Ʊ_��?5R#���c��ZL2,
�ѻ Sw�gIr{9�A)p���r�|�I}�U�NHe�A��^�������A��X���V���`-⿼�(hj>�)���Ni$&%�u�23lr�_�2�g1U/q�d��$u�Xۿ�&�������f
���	�wSP�]R,���VЌ0d�FnCcĕ�l�׻��vRd�T�ѶB\�4��(�����յ�6e�Pw�&I,�E��|��IA��k�ϩ�u�����z�8)����Y]z��+��f"jZ��мK{;pa�s�#���?���Et),1���4��x�a��ld%2f+���)��	��]N����
B�l��P2�����ѣ+��c<L.şɭ�E�
*?��CmJ�u���(۶Z�v۾m�JPFE0installation/angie/models/base/configuration.php�����Wmo�F���T���pܧ6M�I��.ir�U�B�=�*�k�����ά_x1NS��<3�����d�x��CapsyuGp�@0�"h4Via���Z&fJ�TiB����b���r�8,ތT�����Ю�#	�%�w�JVZ����Z�^��~��nd�P�0��heT��H�>>��يd��a��7_�c�"��tJ�9�|Dm8��m��"
@�r��B��C�9|��84[,J�[Ǟ'��jX��p�B�΄���gr���g�qH2n�� p���Хyx=�`K�Qh)��\���H�r-V����N��p�2;$f�$�t�w��SMuP];0H�Z��@D�
��bZBU��r�
�nG��YNi2	sG~�	d��#g��Į�����t���*��
��%�����/��܂�)!7�P�q\Z~���$�\��%Z8ί��\8(�*i����j'Ad{Xګ�(7S�~\xT�n�B9�ćPDfĽe��?�$ո�L�J�WЬ�
�=��
�i\�G��6�K�ET"�҂G%��Œ�t�d<��\�-���o�%�*zK�L�jf"���+��!� '�G��
��i�uIcw1��m6Y�h��0j�s �5���(�� \=&$=qXL���Qw��fC��~02Xc��-3�DWP��"L�#� -<I�pY�Jr��D�w���**5Mo<�����>��c�����X�k������v���o�t��E8��TD�=�)��y�7i��^�U&�3�dձ�6�&���~�.���4�J��6���u6��߼F�r��i�b؏��7uŽ��Sơz2�"�I�����Q$��4�1g�*<�}�MBW��ă�U������o���u��\�'��:=�\�C���K��x�2�iB���LE!]�S�����v7��Ϧ�K����p���
�_��L�f�*+x�Vxz�ޒe?w��!cy΂i&OY�7�%=�����Z�(�_�]��k2���
h	''���[����O�Iw&�����DP�
���K&NQ���ߤ<2yiC�
��C��n"�-�D������5�yl�A�����e�>yJ�Y;sY�S���X޵�l���m���Yt���4���Y	�e_�)�߮��xי��	�[,�˄Z\~���N'�H4{t)y�e��؜]�t�*[���HVHA�ed鏬C����}��)��x�JPF=(installation/angie/models/base/setup.php�	�"���Y�S�H�l�͆*��lv�YB`G֡��~)�X[:d�nfq]�o�<��qwu�.Kӯ��Mw���<�{ϟ��9G��N`�c*�$WZH���
e�k�
	�90��WJ�4�`���-�oE�7W"��Լ�q��8�nޅ"_�dk8*
­�/^�u�勗?�(	c�2�p�-��E�
{^�{Yi�L��w���g\�.�	.�{�xǥ�}��
��7 �y�ߏ�4�x4��󓓷�`����^��l��d��mQ0�
�&"��e�_q���_4�"\3��ȿ=�숅1���
b
��l��
���@RC��I���C�(ǘ��:��{����M+Ӱ�dE���p�2�"��r�Mb�+�9�lN���-�}�L��jK�d�"�f�Bi��oo�
´�B#`<.mx���6��TR�v��=�jU�L��wٮ1Q�z�M'j�u�76D��3����`Y�Ac��6U���:z�jN��L�������R&٬#��MR<J�t�XS)�Dh��Yx1	�S�x,w��I�ɢ#J���=^��߽��s#�G�MAe�o<�La��^��2�^Ek2`<�r�=Y�҈0raޢZ�H~z{�s�Q�Q����{n���-o}+�<O�m�k��W�EG�I�
Z�R�4��i^��D��y�ā����r�dT�HnL�j2A���C,�>\�WS�֒��'.D�a�H�a���mʓ�^�y� �V��o"�I\�
��h���.�m�Jz~Pq}
���s-�
��eb�(m�B��e�OAXH:��g�@KP������[�>Q�ɽo���T�v�t*J�SN*M����|�Ƞ{����(�hpo�e2��G
�R�B$��9n<}��&�"��9�1��:�"�����4�4y�������a�1�&��ļ8�yx��;!�,�F��@^���%�KK�2��ɓ�����mj�!#�:Ń*-��n6M��I��ݝ��`ۼ��̳�~��8�*�Fˎe��U�2�Л1��(�j��]F�ߖ��rrO���6A�w�H�Ј�,�w��VqFNr�� J��yX�mX��ׯ����OŐ�\�m&KL�l�4�I
����&��pqz� �}}�md��})��͎�7뉴&tU>|/����Z6J	�Qd�r!HQW�={�V���_]/������pt���r�������)G�	9��s&o�<��c�x�Ӕ��̙Z3�L��6c��OF��^,����(�@�xÉ�$2��do�
�m�]/TAN�����_�S�Sw-�2�-��}�e��+�%z!�Ƌ�H����8-x�<�)�Z"�������
����Ԇ���i��.�X^A�=�-Hn�oD?���O�N_����_��W8��Z�����\+H�®�k\e��;!��}F��7:�V�jY1�Vr�us��)s��Qfr�;��Pͱ;%]:��PP��gd�Ӭl�q�V�F�E���O]�)Cx(��[a�|m�Ý�O�JUֶ���7ns^���o�YY�{�Oz��|����JL��E�0y�#�	�
7r�eC��d�E;I� �1pY�)�k2ړ����N�t���!��7�>L��vp���z�ǘ{�X�;8��Ă�+�L9)X��M�~��s-;���^�܎�DN�+����u'I�0�x�K�x
?: �Fժ��uKI�m%�[��^�h�E��(%�&_�2�j���ф��{�WF3�E���6q�b�:�5�,�,a�\Ф؛�q��^h���t��C�R�[C��4�F�6�������rTK������}���hT���ip��͛��z�V��~Y�)2l�o[����_3d,R�r&ӄ<�GdS�C����[�&pXb��ģkfYod:Q�V�
j�V�3u�v���K]H=��u�*g�]�z��{��,�4OYh�v7x�`�뷛��<3)�t�/;�N$Ѻ�7���'MkH�Cs�!b�AM2�S>G���9&i��Bތ��	k�UkK�Ԧ���+\�!��Ա=v�f�z�2X��2������P�	�-�B�Ό�+��%�TX����g~�&x�o�EA	�߄����@����:�_K~թ�����r���Zpt���i�>��n��J�Y]!߬5�5��C�OȶW�m`���v@S����&�32h���F��s j�C̥�HkwG]Hu�ӳ8gD�c��h`��f�ָ�������>p�)tg���b�<�y��Z��!D.
��vT��U��=�M�<W��N9
�s9��G+5t���N��T)�n�t�I+P��-D�uȏ$�ӈ������l84�XiD���}��0�&�{\��+�`�ن'V͊��5�Ն��Ĺ���5G�Е��ԣJF����c�\e7�?�d7�� �0�$=�R�W%�gǸ�jnC��
�9a!��E���ɖ^�JPF@+installation/angie/models/base/finalise.php�����V�O#7~��]66�{�h���CG���9����f���p��{gl�@�>���7��|�߫��&��������<G0�"h4Via�*��ZVVJ�R�uB��|D�Fa1��f�K��̚�{U(�i�+��5��Z�;KU��r�[��~�����ɯǧ'���F��*��/	�A��FU�.��I���f��)���/o��K,Q���K2�u0>�6\�#��
*@S�$�2\��x��}���b6�C&1�EQJ̘�_*��B�S������,���)�
*�tU���bZ�(�*G�&�ÍzD����(|�3�1��o�eHC�S�\��d���#.�]�����l�yqus?�]_��W�7L9�)���h��܊4E���D2Hd)a%4��}XlDE���b��g����C�I�,��h0�/�m��ў�'\&�*Wr�V|� ���{ƒ��N�|Q�9Ľ�HSÕV ��U47��\A|�n�&�5����;���e�g��9j�vb��0�벐�Cg�]<lQϵ�gp�X�!�uJ�?���'Ī,���������m�K�]�Ѥ�J���q����MQ?�=k#\Ym�K
����wрn�]#s"����ƥ�T��0Z.Zl(��Z�k�0��f���*ܙ�g�EY*�7�PpS٭'������7�b.k����MU��Jh-���#�Х�3.o��]�#X�¸���E��I4h��O6BW�Q(a�к�s�r�]Wr�
���u���	�	H92'dS/��;9��tJWo�^�^���'��E9��$�k�#-،�p�ޗB�$Ѿ��z���8����?n)RN�u�a���^$0߈��������M�&�=G$Ǔ�4���cpN��}fM�@����Y�宐�sJ^ ���/�V+�3A�
�ת^��~Il?p2�T����DǕt@j���B���A�d��$�P�R���i3��-iwis��������H��޽��d���}���,2Y�S�N��~Cw8�څ���^��ҢH�׵���7�e��d4�œI*)�~�����{+m��!D��	��?C�z�0���䴏��'	�-|�����G����u��q_3�YU�I�+:(�t;�y�Ê'A6+����#�v]PO��fϲ�i�bS���1r����n;�^����x���JPFC.installation/angie/controllers/offsitedirs.php�����T�N�@}��b"ىੴ\	4"@i�>E��8޲�Z����;kH�B��d˞۞9gƟ�,��N^�M�ЃY�`�C0h�6�	��r#r�6�`��ȁ��Z���%o���<Zn��t�?�('/[",V6��҈e����-���Cog����gZ2�[0"@�չ.���<c꒪�����.��*4L—bA�6�����$�C�0L0
�8�����a�����19A�0�O�rFK��*M=_�0�ޡJ(��>�A^���Wt������߇�[!8
At�����R!	^�DQ�6�b	��O�
���3	X��m�ŭ���q��T˄Z��5_a�|�}h�L�ށPy�zKtqD�����Q��d�y�B�w�+c�ۦ^���*���Q1f+co�
��`��چ�h�4�o{{�8�:=���ƣ��||}=�\~N'�����%Za��]Y=��b�%2��H�?�VsT\'7�j�AW�_׾g�
?l\�p�b�V��J�cfqS�֝����Ll�Ol�3z�*xp�c{~F��\V�����_����hZ�͙���{�y5�-����P5z���n�ojUQ�B���F����4L�]a�]KBKjh;�{��տ0<lk�^.cƬ~V���ml��{��U�f(pT��S�#� �1�]�Bk٦�rqU��D��u�JPFA,installation/angie/controllers/dbrestore.php��
���W�NG�m?ũ�4�B~�)�%v��
�H����=a�������7����޵qB"�RH;�~�Ι��rR6�ww����EZЛ haj#7B�S%J#�`��Y	\�1G
�Bn0���{�!�� QdKʭ�%��nNK��1��X����\(1�x����������k��D�\��С�Z�r�K
�KW&s�r�b�������T<�_gCb�U`�Qi���=��rJ@��~���H�El�\v�g	��@&0��4�)��!�q���Q2�Qu��R�h��H�b6�l6J�{4+R_LÕ��f�x��{\@��v�D�ֱ(ʙi��D����<�0H)ㆿ��
E1�AoW�/�7�KL�H�Ç9uq��
!�tׯ�!CbNK��l"1|��hC��̢D֏)]�oc��5�
y���+QQS�,��`�CI3V'ix�\�
g�5�RR-%�5��D����;���.�?$W����,j�,�-m�rľ-W�Ti���\�Hp��Z,R�a��Ei(43UX�'{�	��9W9�I>�Pu����3�G�=*���
M�\�M�H���@S�H)Ej�̅ք�?N0V��|��ճ]v.\��.$�{��
=�Ï���R�u�n0rh��"�Ҷ�~ SN�eKw����8��k����p�	�-	U�59��ԿP#oǨE�|]*o��K��pMY���ik��}x'�6 G��r4LC���L�w-:��i+�ʹKOM��;%��Vq���U��8�"�
OK��U�� �1m
��o�n�F�:�\)�����=˿`d��m�������m��m��j��/�&�@�}L�t
��t�:�ǥ\O�8V��o�V��'_X'N��
�������k�{� _}����p�-�hU�I�T����M�S�o����R���k���g�<��Ai}Vk�Z��ڬ֩հ֩�0�QW3X�BFf�n`U��hV�r*�J�Y֎/q�rfb���l{5��A���DתD��L���s�Ÿ�`o<�W�O��^9�{=��1��O��X�����g.𡂢��@�%��@��p}_��S����ߟ�4SW.H����(Z=���5Іuf��
�����$�U��ޣ���#���c�i�fu�c��dY\\v]���tE
��B��&���/JPF?*installation/angie/controllers/session.php�V���R�n�@={�bH�Q95iHI�P�U���jY�
ww;�NA��Y���,��y�ͬ�߸ډA�/�����
X�^B,ɠ��H�kK��j�:��j���X�j�
�J��a�cga���cTV��Jc�S��HWu���*S�h8|W����kU�Fz�?��h筳mc=������?��$��v�<�'$��8^����B����,�>��No'i	��,�Bq���Κ@�i��;-�4%� �,��n��N�Cj��"a(���5�B�}1V<��b|��6I��#�k��/S�7Km�,g�N09�x_�Ԅ*d�6%n��o�4���Rކل�%�}tq�Є�˗�܎��k�=��;�0,�x�%6Y^�;����dP5dӭB��p�N�|s.���~�b��g�->��LY����Hd)�+]�~�o�vI��]�z=VL�{�JPF@+installation/angie/controllers/password.php���}�Mo�@��W�!�
%꡴�:
���PEh��
�v���;k�9X���y���O��k�j� ����s�`�E�h���J���Z��JÊ�m��<�{4�52�VG��+�D����1�gJY�A*�H�c\�G-7��Ǐ��Wַۭz�վ��䑊����I�ѨTe�2�,+�Y��78}�!&�Y�lE	���{������M�M���	��_�O��C�W]��T�{'	B��Q%V�8F=��Ai�f1���w���u��|�Y+�
�^�����ikH-ti@+����o��/g�b1
#���gVnl$M�'�4���m�Y�ݣ��􍘉�/|�2�?:���\f6��˫3Km��F[��A��^����#G�N�/�\����+����`{�3˂�BYI�9
����|k�O|��x��h�_�+m��yʭ��ƙ�#u:�w{��k�_���x�;���e켴�KҰU�R\�~&��8N��V:g����JPF@+installation/angie/controllers/finalise.phpx��eOMO1��W̍��K�d4�]Db �D<�n��mh�����%����̼�xx]�h$0B�Y�.0ƶ#D�L1y��x��؄��g4R��Ug���d"��jO�H���W��[�3����Y����3�|8�i����U��t2�O'�6Fu�ʈ�-�s�S���(���^�(r��_n>�$G,-�M&���G���� O�y��RM;�H��j�X��`���bx/��"���ܻ��Z��5ٔ�9���e��F|�#~JPFA,installation/angie/controllers/base/main.php�1��uS]o�0}��}�D@KA�i�J	��M+�+r���ڑ�dES����V��K�s�=�:�tS%�FF�mןW�®@�* 8�:�5�Se��u�s�X���(T��CPB~��1��F�'V[���KB��pT؜	[��:��]"����C:�L�`�Da5�pw	�d��mi+m=���A6ZZ	4>꯷�`����	�������=P$M��xPe2�gw��"#A*L�d�C}/�	�j�n�=n�2���$��~12͈��Ν X�P4���ӑ�ͳl-*#�;hK:f2l8�|��5w�������.��k�Wwr
�P>�1�hӔŤ�y���M�x��B#7� ]�����*O����_؛�|�.X��O�Ο��Rt�̣�&�}�^��?��oy�o�I�+J�(_2PF��%�7�Ÿ�O�38[a�JPFB-installation/angie/controllers/base/setup.php[���uS�N1}�~�TB�]�
O] ��@Z�TU��Nv�۲���ʿw��\��/q�g�9�xfj���؇����p_#8�,:�-�B+p�
�a�-L��`��b��E汄��'.:�*ב;-5q�sC��BTc�k����=\nNϏ?���a,x�%sp}�H��i���7�����\�5�W��2	ߚ	]�Mw9C�B_�=��$5`)y�$%N��2K�ף��0����'I�I��a�}���ZJ���z�UI��e�7!%`Z�i�x�#�Y�ZD�hp>c�e��%�m���?�\ûH{��Z���C�r�8W�O��r'���M�����3�Vxj�ڛ����F�	�ƮH��r�
brc��T����f��ͤp��(��B��E�	��
�1�s���Z�O��Y%��8�l��hbg{��k^D����Y���"�s�E��ѿ����0񝚫dgjqք�����}��"g����x9�Hq��:�t#}0w��E
��}��~d~�$�Y�#�i|l�򑶢ť=Hi1
��i���QK����W|*�"uo֐s=y��zn
��C���Q~��O�Mn���JPFE0installation/angie/controllers/base/finalise.phpD���mS�n�@}�_1H�Q���U�Ci��R���hY��ͮ���(�������m͜�s�{UVQ�ݎ�
��~:�<�V8��i�
,7�rPhK��u��Rl�7���C�F\2*?Y�����i�y�
�l\W{#V���+������0�ԒYx�����ҵ�z'�G��\RpT�翟��{Th��y�$<�4��u{T����(�B(̓x�=L&�,N= ��_�����=��-%���S(&%ƝC����F��@_Ԋ�~r�L�U�F
�6����5����ft�t���M^�e��
ߠ�Ja;w+t���}
�F�E�����ܝ�x��9s��d��X�-��4h�JP0i�D�^���s�i����cԃ�
���+t ��SO���$�U�_\��Y��R�4�VC���찣�|L~$���a_���"@/����Nd����m����
UU���xB[!%y\m0����T�~���	
m�!��R�;�,]��ps��.���V���C�5]�p]���+�SYH�q�ٌ��/Oqjr�Q�
.<.1���JPFL7installation/angie/views/database/tmpl/noconnectors.php��	���Umo�F���Eg�#M�M���XGl�ͥ��V�^`/�ޮMt���~�6� !ir)B��<ϼ<c7��Bh��c
��tz6�:��H��r�&����f��iޭ2\�{�A(Y���k0����X$��K�9��o�9@�9g�Y�����E�+#�����V?;=;���42��,h��"]�i�-� �
���,�~�C�%L1WS������L�u~�R�	HtnhZ�f<a��S�!S�)��3�v�iG�2�N#����( ��72��yC�
]��El<�/\'X��d�V뇱�����a�+��ꤊ��J�Tbo,�U�
�Q�V�ٟ1&�̽%��<�����8lT�i�mV�����/��?1�O@QZl�U�DT�e ��*	�G_k�V�,_�L�}�/.��[�ovL��Ag@�ɐP>Z_j�N�	z�1M^�a��%�H�q��h$�m�;^a�J��n�/�%����n{p�>%)�2]?�%�-�𥈱��*��T�:\��s�jk͈�C��Y��QA��z]����*�"�ݷ��ixW/�����G�y��!�'�l��{�:��ݑG�f��>1-2:��8Q��(�v�s��(h�Q0�%�_�7�+e8�X*S�oK�(���iT�CG䏱="7���ӸD�y{�����N�� �;��[w��(�{Z���:�C|�/���';~��vBy��R�u��R|��9��іA�1j���w=�vH��W�� m���_��.��q�!6�YHh��__%��x��=�Fw#�,��-d��=���G�o����>LT��I;㞾W��'��A�x�o~�o���v힧�$�� �e6~GX�	�݁E'�z�y��sn����;JPFG2installation/angie/views/database/tmpl/default.php��Z���\ys�H��|�^v�dOE���Tֱ� �l��9�RE5RcI#5���|�}�-�	I�x�u%���w��������^���/%�R:WM�HX� ��1�\�oy�\
�q7����uOd�Sb��)w�1��-3z���<��<x�o	B���"���zsߺST_\G����%�:~u�:�1vm�����S�
P5�Ѣ&�e[qF��s���C|l��t/P+|yO���u��J6(�C�j�d����P(T��HG��i�ãw%f*��=��OtlHa
|�Ȭ�)b��H�d��tB��E;��p���/_`�A�U�[BacN�ڙ�ƍ~(q;U���u*˩|$h����[��
�������?�H��<T7#9�� h� =G�N����Pj(�RS4u����z��k��{��}�B����>�ll�C�x~X��_��T>z����WGz���WI���dB�>x�!��*�M����p�뫗��Rr�]����ՉG�R��e��\v��n;��"�N⫁�=^f}@�@��Ip�����!#�B�<�x���a�k�1�&��?%k����t2$��
��0���J�-1�-�$X�ZUj�V4��iv5Ή�����g��*��t�[	.��Ϸ:J�&^%���J%�r�6)������Z�%���
���m����c�����S1i���4�6]����!b7j7W b^��ڄ]��M�k�D�.,~�wan�]J�*��}wB�RWY���El3@E�u��A�{d�����I}"�!�A���STе;#�h3��H}���<��hH�3�Bg ���G��	Cx$��al��sd�:���h.#?��	��L�5F�t2�r�%���ޮrm|�Z�-���S�ɀ�9�u�;����`���y .�4����+ǥ��A侊P	�ڼ�t�*j�,��R^��
0s�ٚ��(qMⰚ�٬<�t�V�9�~R��Ӈ��.�+��
o2���:1�kx�D#b��2�I�ɞI�h�����o��Q���(q�8tkB�)=̎����1H��š�!P�D��v��8s0ʊ�C�g��pJ)�fz�h�K�?&�nj��/�4��N���lV	}c��j��r��aU��l9\BTӉ�O��L�.��$�`�/J�3ӺG�y^�Մ�ia�2Hs���M+i秀@��/x"� ��yYH%�
*���x����+G7Dz�o����2{qV�~�%�$9=߽�� �-E����y,�����_if�t|���we�h�>��`;/���4`?�x�ߦI�6K� �y������5!yY�Ɉ]۔AX�dLhaΓ���r�Q3b�8g �Uk
B�4B�P3�p��2�ak{h��f2'�F)����-���C]��+���J]H�FQUW��&����& ���BC�5�dJ
���`_$f���|Y���W$����4;WB"��N��]��_o��֮҉'�u�j�+�5Ɇ���Hwl��Y�$'x[��m��L
#��:-j�FH��l��r��M��]��$;�Y$�c���A�d��� S#�+�,mg%�ED�⦌\ǰ-�ʯ�f�QG����G���!ud�8I�	rсY�Mw&�E9�X��\:���V��b��<~�a˞�� �%p�W���%�Y3S=�K&8�(�#M(���&�P����bp!�����b-$ɨ�UJ�y���V^�1~X��U��E:J>岥��„`���'�VZ���ח�J��6BIyf�R�n)J��:��
x�L�>5[��6[2���Ťl"S1�-_o��vHS��NC�*�̰��l.ފ��P����AxA?MĪ�Vs�c��e�d���
WW:u��a���Y� <���dW[Xn�L�>�`�(�i��a��Gy�/��PІL�R?)�[�<y��'be)����'���2��h��n7��/F���)���XA��[�\ۃ���S�A#l�]|�f�l9j��؝�*[Pn��M���_�]-��2�媊kZ-���7��/��6v&~���6������]���������yȍ��7�(8��hP[}̉�8lP��$38:M����)@
�7���a�8DK�JuZ7펶����x������6�լ?���?,�&E�fu,�tLk���b���~�%D�@ӿ�`&.K�l�B�Ǯo���e�[�n}w�Y��Cb���Ն��ߒas,�|�Д�ǹe�����X'�Flb#!��.{��M����_��@,���d����1 �Z�mI��/����
�Va�)u������˖�Mi8[vgCS(��c׆�r^�,�m�o����8�v��)�Ϋ��󑑞��ٞ�w)v���}x����db��xN��6	{���wm�?,G�a;�ߥ���#��`#�pኢgE�L�0�	=��?z��e�|�6j��:\���������9�F�}�ak�Y89�bC���<,W;��c�
����]�oC~�s’Y�o�ȷB��N\؜��SV~���-������ju?
zݾ>к����5Դ�ttt�$��3�X�:�n����=6���f��D
��Y����
�G#-l�i��F:����b�s}�xu���;k��	!��H899�5{ȃ~+����9�r	�X
����f�EdZ@a���V
?u���*�x��<�ݮ�F�$�ׯ����V�W�'���An���<�9!3�bY$۽�l��q7tdٛڶ�Lq:q���Ŕ�{-�y.���a��G�@̐1�:E��,���Ѝ�ک���Ģ[:���{�6,o����ԛ��p�(��������Wo�z[֮�Wo~=�'�'zr�iئ^���	��6
Uc�'�icKVXGb=id�l�O�bÝ�M�m̋���P.��z�5u�V
�bG�YۊG&F�x�\�d�κ#�‚}P���*�-���iqGA����c�1���G�5�p���A���R�3��P����h.��ᶂ$�gje��QK��G�߼���}����O��uq
8w�T��b�.�U4��_,��`��0?���Xő���'�Y����zs��*���\G#��fl�w5vگ̙��QC���=�P?75�O�CD�Y�������:^L��u��\1���M�s:q�!��uA��Hb-�H������[ P"���Zl��j!>\��#�ͣ�h�]jJ��M�6YN�Vc���u�h�?7m,}P�������*���L���R5�}�y�A�����Hl���nv��I6T�ed���Ćb�1�a�,#<�20�i�4�E��v��PO�7/�ux�R5�(y5:u�������v�;����DY\Lޭ�o�ð댰i�hN8J7�+����̠4��3�H��e���c�;�;HWo�J?�|��U��F|&{=ׇ���=9�"֭#��z��v�oʄa�"�,!Ÿ)���Pm^u��~)a)d�t�{sz��vBBq׵��;�˾���1��X��GE����ݏJ�&eC��aq�A���9@����GG�5,őuLAE����W{-��l���"aJGo�aq ��Rp ��e���7��[�]9O4^�.�3Z0�"m7$�}�.4�2�&�51�$1��
��`���G�v�����j]ƕ劜? 0�>�w��+s �R�8NR�l9CQr��U�3��UEW�Y?[X�I�,�	�fX�A�+���D���_/?��<��U)Sy����Q��N�e#��#��gA��˾�"�4m�/�d,�L�y ���A�V>����1�N��CH�O(;���q9���^�/�c��b�E�����
��:�]J��Q�_����RۚZ�LR�Ȇt ��}��IA~7�,��~J�JPFD/installation/angie/views/database/view.html.phpwx
���V�s�F��v&�D�6�I?��$�M�hD�����Щw'l�����d�/eF�����ow�ū,κ�Ǐ������1�,FP�F����L'"�$Ӱ�,��g�d'kTJd#�o���8gpVJ�QE�t�9�uF\�DX&hi��62Y���77���N��UƂ3�O��(����ꌩ��-���*c��՟�S���M>'LK��2q==
�S����n��$��u�x|�9=#%�w�!���3~L�i6gd4�q��O��ѫ�o���F���@'+�x���^���$�p!�!fkΖ6ݜIJ�^k���i~�n(Ϩ��o�e��j�2�@�s�1�S��ՊB��fJe";NL�C�c��'�L��$]�H�T�a� ��FŪ�<(m�w#P+X{�Y%k���ŧHϐ��K��n�ۡt�8Q�/�`�;�J�Q�5ǔ��M��祈��6�lN,���iF�ٗ�p��K'��,
�u��s��}��A�H(RM��^É��<����ѕ�=}�����ߨ��Ks�x�~!�Z�K��H�U��B׋ҀjY����[�*�I�n��}�cqO�PJ\���6�'Uy��T!	u�r��*�Q����%܀�Vpkͣ1�{3��N+`B;��6�:Ө�l#r�:��:Rb�#Q�2-s4Z�5�V����NP�)*yv�^n�?�����=��Zc� eB0M�C�4��̴W�`��s�`S#1�H�����˺ף�u?ϥ�T_6'�6���b�hL����\��D��G,�Q<Y��Q;����8�ح@�����Љ"4�Sp�{D�t���-�hpMvo�
���¸Z�ūQ,4���wf��7��5/�U&,�-,	�V2`���\�t�Z뎱{L���u�ҁ�K�f��À�7��<LϦ�3>����i:�
���[�\'G�ꘆ0cMQ�-���8J�j��c4��!�
���p�D:�_?;V�ٓ��rpмLB#�6g�)�X	�p')$�6�7�k
���m]kRવ��r�!�Qz�k�mI�����>�O��h��?��ik*}oч���c�e�@6����ʻ*M���츾1��\$˼���ɪ/l��L���7��?W��no���80��Da��&����^8�[�f�+ó��u>�WHS�ӓ_O�$���gC��̌[vD��O���_-"R7���Q���-����?;�}zY��k4s{��Y@�]
�~R�l�Os=3-�s�o�݁s���^
+�ͭ����
-2Er!�#���/6�-).wΉ�ܯ��NMj�n�?�����xVT��[L�����mÌ���������Ҝ�}v��-�&��ڿu�u�JPFG2installation/angie/views/password/tmpl/default.php�����T]o�J}6�b�"َ��ܧ�`R\��4���}�v��]��������ƭ�^��g�̙NpU�㟟;p��&
#,�Fc�fV(	&Ӣ��SR�=�0��2��"���#b�`�#$NU*�hh�Vt�r @.�=�Tu�"/,�{~�d���_�b�6"+T���`E��T]*������U��i�_o>�5JԬ��:�X��Ԧ�����h
���NH��6���e4�6.p2�t�3[ㅙ��L{�A�$�B.KKLء�^��(�v�!����em�^s�y�j�Y�˚�.\!9>�h.���/�J�R�Q���,�Xz�EV��QP�H�`D.��
d\ȼÌ�f܀�I��ɾy����$���~��;�V�v���m�O/�����i�~�#-U��yB��=+�Ĕ���O���%��%Q+*ת�!�ڂ=VH�"�W����O����h1��eH��Q/����&^��ϟ�h�i'�B��UwZ[K��C���y�Ƚ��n����^�>~���f��!dj�
��n�
j�������y�(HSW�K�/����
�9�a�_]8��>���8���s\-�F�'��ߴ5tZa�Y�M��C�t-�%Gcq?�*��(�=�	�ɮ��7���N��\'G<�f9ڸ��uy�!W����`�#��
v�m��CB�Rx{`Z���3u����!%�����"wj��Ĺ��<51C<�9OZ�+�5�z�w���JPFB-installation/angie/views/steps/tmpl/steps.phpA����U]o�6}�~ŝaTR�F�4[v*'n4q����@QTD��2f��ﻤ-5͚'I���ë��.k�wr�	$���)D0/hn(��T�pY����
� #t��@-��i���r�V�,�L6U�Z>I!��m�F/y`�QY�(
\l�����Fg��w0㴔�h��.�J�Z6Bj�=nL�j	NY�m���g�bSD��M���8�Li���) %�&�</g�X�i�q:�$~hr΂p�yݜ#蚒�h̫�1���K���%�_��v+s&>Vk�j�p�g�s�{�PR]Wڐ���w��)��b�E�"� <mAPY���?ĥ7�j륪y̴ſk��O���,�c�C�|�y�����k�tK&�F�^��_�cmV;[_�B��9�Ǒ[c�9_ţգq'eB�E񪐝��j��g������d�5�A�W���"��ܤ����w�w��_s?������^v[:�0ME�E���Cs�I3A���*�5�v����KeR�?�Y�{�d>K��n�8{dG��y1��7�����Ǥ۠�ΉZ���+I�#����rz�<�{�f/nD�!�w�ﴁ�B6U�jp���"4��-!ho.��+��߼��M��t���|WѨ~�Xb�a�G�p~;/g�0��dd��.�?�NR�n�V8h�|/�A�ŭ�����I7>�?��S���r���1;}��R�˝v͟�ٺ�!�<���ɒ�A�;��V�O{�I⊌��PL+��鱠4Q�
ַ��l���~q{��f��{��s��F���JPFD/installation/angie/views/steps/tmpl/buttons.php����V]O�H}�ŭ�D�O�4�E��Zi�B�&��̌��ъ�����ā�e_V���㹟�;�_��Ԅ;[[!lAox:�C���ts��pR+�+����0�Ma@�d*g�CbQ8La4��
�H�qe��ͥ�4��4�	��D��h3�r2u�q�'���w��ݽ�0��Tg"��.�PA�\]d:��:�'��X�LP��t���B+28/F����ڜ�z�
�RF
Xr�	��RaG׽�~���� ��߇|�	-7�9�H���Z�N�[Tʽ�a���v�1��#�9��;��}�V*�X�Ie
WZ�լ=�N1�thrh��_p����>EꩁʝP	Ƒ���!Z���V����)�jayU�/�W��gR9pa�В�pS˒|O�%o���8~������;E����a�*,wI��.�hF�DЅata]�bT��#�~��b�V�Q��Z=�����9�bJ����������E��ȵ��sF�@��:�]'��)�?

~瑻��b"�9�L.�Ͱ܇��8��88 Dj���D���ݕ-EϏp0��<�A��ڧA@@�����79hl?������)VI�<�/I��KMpI�?T<0���1�78_U�yYT�"I��_q���L���~M�E�.�gk�5����}����u�U0Y��9�C�=�sY�	�a����T��K�NJXQ��X@l���آ���DL�����<Ff3�O��S��+!�Xp����������6���f��M���6E��X}�N��MeS1Cp���s��98��p9`�Jr[dN��L�},Nla��w�v-x�徶���U����k&6��W���|4f��&t��=�? �%�Ϗ�ʈ�7���X�L���N���(���?|�y�����W���JPFG2installation/angie/views/dbrestore/tmpl/dbname.php����U�N�@}�_1��Hn�J
&�CL���By���0^kw�U����1�J���<��=sΙ��N#�R���o�>��v����A��B2�E*�<�p/$�,x���d�*$2�!�+p}�5"	�/#�02�S�e3 ��c�-�J�Y���T���G�G���A$b�����J�T�c��Zhtu�q�<�D�vmLP�n�>]@w}�@�L^�@)Ŕ���e�x��{S����^�B��ʙU�ʓR�ZV��i�3b��Ґ�G<��B�=�Д)�2�`)E2+�`\S�[�˖�WaWG\�^u�r����8w�O�V���Z��m�#o:�F�Л��}��M�<�Enu�J1�֭��B���Ի�麝~�`9U
ކ�b��
�9�p8�Ņ׹�Z�x,'��{�IJf�)K0�m�aɈ��y�]|
�</�]�L�� 𓎆�d��IM�]���R4]�L�\V�gf:�2�1B�)�n$.���r�r�Vp����a:Q$ݲ#"�c̲P�U.�mͮ?ƃ��]^-R\S8�\kO�J񼔿�L:�U�ub�33y��Yg3��f��ڰ*���="�l���U��=�����f��7�L�<�c�7�oS9y��h�nӗ�8Z+�tN��L'�t�aL_�`r��\�s�Z^s���џ�>c�r!Nߧu�u���+5�����2z�����o�"��kkzI;)��6>w�W��'�J�o�ƒ誑�<�����l�m�^�����
JPFG2installation/angie/views/dbrestore/tmpl/dbuser.php�����U]O�@}���Ƙ�..�&��HE"����L�+�X;�������R�MLp�4�̹�ܯ��4�(�*��kw<�a!(�$*-$�\$��S
B�ς�Y
L���@"�����g�\!����X������)�"���@�Kɧ�����RP�}��G�c�� 1Sp�Z��R�T�b��Rhtu�q�<�D�vomLP�ng>@wu8G�L\LJ@!��$�e���K�����~�B���U�ʓRȳ,S!��g�	�!aOx3�2�4�)Sj!d\�B�dZ�a�$�&w-?�6ž���}i�-ˉN�N�����٤��rGn�z��7�ޤ�����s[�m��TȆ,Ӻ���i�ٝx��]���,�Bƛ\�on���`0������y�7<��9T=U�eY��%۶�p׈��~�=|��'®����	
�EKÀw2��J.�>E}�JQw�2ysXI_�i�
����B����8�b�J��J��dn�S�"������c���r�Msv�9�_v��l����gZS{�e���gׄ��E_'�=5�g���q�1-ik&)�5W����~�τ���C����^��=2��[�����Y�)�</�F]9�۴�!'���I:��g��֘���t�5�ӭ1}��ɩ��ϻ���g\����3�@.d��Ǵn��N�;~�f�h1���o�������H�g��(]�^Ҝ�pgk�]z_��R��5�H�]5Ԓ'�R�(��$�d�/H�qJPFE0installation/angie/views/dbrestore/view.html.php5���=�Ik�0��ѯ�C!M�SI�qJB(t�Y��"�$$e1���#g�
����gW;�
�o���F*"x�z�5�W.��z(���p/ju��#�(�l �!��#�ʻՖn�33G.��*��&�k���/��'����q8�'�Q���X=��j�uv�m��zce�K+�&����',Ѡ��%����!��E���pƘĭ2({��|U��O
Ra�?eL�����<3B�SD#�J2�e��C�$�x�Z�G$nH�ӼQ�"��Ӊ!a!�i�����:���u�9��m��JPFI4installation/angie/views/ftpbrowser/tmpl/default.php�����U�n�6}��bVM!)�#7�TGv�v� �Y8N�P,�GLdI )�F��F6�6)�s9g��e�Nxz�)L�7s��*A�� (�&W��<͕,�s1�/eL�DnQW�
�w0yA�L��hW��4�U�O�'�O�ϋ��O��Y7�yp>��?����I�2
�������4��1n���R�1ӕ���\c����in��-*]���(2G�Zf(|�q�y>�N��: $���SQ��L��I���o_�ى�y������y�F�T̊��[&��'4W�a�3�sB�[�}�r>�pm�X���Ffg��#�˱�DU�@��o�L����v�b��Bn�qz����G�r厝^��]���O3>���.�~��/����l�Xܭfw��|�"B.�w�*c��h2���U�{�r��R7Yc���١�?�0�W�&�A0���i!&�	�綮H��xrl��;���E���<�z��`&��ht�z�F �kyㆄ�C�<rG�z�D�z��B�q*���%�iS��mW��rs�r�Uz�����.Ɍm�\X$�(dvؗ���7X���.X�2IŐIaV�{��	��cEa*��e����c��U�iڷ������[fW ��~�]M��Jn��}��R�|'}��$ݺ�kR�/;�	�w��������soOw�`OGX��4\�'d!rj�[5���k?��ХG�«&�??��i�\��Q��g+��{��ۨ�v�?��~��S�ݱz;��X�E�zWda�@h�z�?����i����%������)�q�:(m�Ղ6�1|f[V�R��A��H/@F��9����U}k�ˌW�����-��/�*@Džh[�Ƈ�-��7=$l�E'�&�0��9��JPFF1installation/angie/views/ftpbrowser/view.html.php���uS]o�@|ƿb�lP)�<%4mMJ�(�&�%���y�Oq�ܽs�U�߻g>j*U��������S���������vx��r��N
V�*d� �*A���+Z���a
I
�b"`�G��y0�a
/��X#�
��4eMj�;�:�"��F��h|%sSw��7T[S��0���K�Z������X�
j$Q��J8�}������T���a��)�i���f�i�< U�&A ���·kW&d�,�ơN9���S��J��A����P:��t��N׺*���.Wv�q��ޤXD��<W�)��uzE���n��0+R̓�����n�uBK���*�z)�Y�����W�U��U썋Z�0U����:|ޗj�@n�[=��\Y
�{�f��п�ϓF6� ��)�Є�6�=�'"�~\22���iG3"��%��)����h�3���[��p2�h��X6��F����G�{�a��-��?�_��"}�o�m�JPFF1installation/angie/views/finalise/tmpl/config.php������Qo�0ǟ�OqB�Hв xZ��B	Y�(���s$�ن�o?'�4U��=�ɧ����=�k��	F#Ffq�e���AP��T�0)@S�Z;�`K��Q�aG�@�lO���Q]3O�K���|km��`j�}���X����ԛ��_��x2���Fr���3,�����<p�!�j���Y�Q����b����� ���t7��ؑ�@�ˁ�T�c+w�	�h���b�z��s7wf;�V���-�t�/D	&��0�h=CX�ss�q��$��)ڤ�t�̳r�qT���*���-t����[*-�}����%$�7��K]�m�v�;��G�2*6g+�",�<�8�W��a�ۅm�w�3/��"��fA�^�ۧ%9�
�ߐ�y�(3���4L�s*ŎՇ��,�����|���u�^������pUF�_n�'JPFG2installation/angie/views/finalise/tmpl/success.php5����POo�0?�O��0s=M��9#!��3)�i	m�b�_1���4��}/Z(�H8@�m�	a������Z!0Le�(5���[T3..h�i�+(��K
�;���\��et1oʡ��px�1��Z������g�x4z�G�	d�qYS�gX�BW#�lki |d���yՂac:�Mv�
6�i
�m�H����<�[�vh'	��(�|��wI����#T�`F�bN�J\��*��Q�a�۟�^�'��E�M]]���m���޷Y�n�H�u�U��*�s/�����7m��7H��_��E��5'?JPFG2installation/angie/views/finalise/tmpl/default.php~F���Vao�8����*%TMR����i�v�r����tB&��`G�)E���7ve��rҮT��3o޼�y��y58<��C�/���(��"Ai!�f�K�k2�Lh|��	�q�@�XՐ�Ɋ��J����W�"XÔ���.�!0c`�b��$���\l��q��w����Y���*r�Z)��E&	�5z:��2W&�e��\I3��b��Wn>�T���#�-e؀��A����qH\g^E�y��M@������*ɁN�"�-��=v��x1�I���ڱ�b.�i�cqˤמ��6��(�%���:���N��q�N9�A4����Gc�4c
�NT2�&�x�Q�Y�S��l6�
��}j)�.�E�aL��WJ��_MV�t�cӽ[��Z��0��p!8�U�:�TaS�K�#�>�s ��ŧ4�2�N�^�`�ʺ��G���.�r������N�Wz���0�gte��d"��^+O�
d(�����Va�;y�P�c����a�k�Ic�} �t�щ4>H��t�d����r0���Z홠I�W#���M��*�U0Yh-�U���sD�vR�r#�j'�:W� X.�~��X̃5H�)0��uo3!�z��V��9�o͊�b:kW��4�fJ�vK��%/���p~��v?l�>�LE*��2J�b�����
��"�]&��� 2G�(��M�L��y(ժ�x9�y�L�)���@�����-�a��cY8�����|��^w�{�� 
;�p0>����� �	���3 YҪ��_�X�j���:<��p��W�Q8mA�-",�f�gs����(�����7�g#��|���������^�X��Q{��=O-���	��,b	s�YYYl�S�Ξs�A�ޤ�nf��{����r��6��^/u���6���+R��n�)�����v���]$*$>��0-x�i)��)`�g��T�3��
��`p=���Y��Se�Q;ɏ�������N���mn�_A����"ߧn�U.�ӗv*3��R�+%�/��1��*��cq�J/�w�W#��i��
�F�FS�{'�����mG��Xz�ڋ��)o�������~gۏ�]�JPFL7installation/angie/views/main/tmpl/panel_backupinfo.php�F���T�n�@}��Y���4�K)!�ԥ(�D�T������x�݅�����дo޹�9�3Ӹ���X==-�)����6�
�Bm�b����xd`,��{�E���9j�2�>�h� ��YD�/-�RHˆa�#�	P��cb�d�P|�Y}���y���>��_@�{�L��|��ZFr&����g�����:���?ACTL���%�2���y]|�$����j1��L���~r|�c<81�q�U���<jG_Z,A�#��m���,^ZS�&<����P��Ej	2�N�+��b��,0
�h6�H�5�7S��ʥ�V�?�ᴾ9���k8��R���*�Hմ^���T�{{e�f��f�1�q�E9�nR�b]bZ��)v��,)1������V(��v�kW���%��
s�'6�ֆf}^�o�K�S��aC�4=�jצ�
Y���J�p�Q��3v��m>k^&ȅyW�v����_Ȣ�,y��_l�2�~d^{s��'2�/�D�2u����)��"bK��w)�(=�]����;u��vٛ)��)=�ί�j�����	��=޹�18�7��.���w�Y`��T���B4ϑ8ݙ1t(�"���>,��G��%>q<��0��L�\�v�߄�=	�6�a�G�]'�Ķ/�ٔ$�

�E␼i�Y���?�p��b�K��)�c���v�	�E��|8��Zovp��z��7{|�W��ҵ�0�wt}{Wi�M�JPFL7installation/angie/views/main/tmpl/panel_serverinfo.php�H���RMs�0��W�0�$a��©Ԙ8
%�`�@�zdy�U�#	�}���t�q�M�v��{��y�;n��@�p<�U���AP��T�p��f�������.�X���)��lc
�uE�����(���6K7`6K����&5���b��N��v�=9K�����;+�e.wBjp�3�&)�g��~�1f����.�	���=*]��kIX�6�N�p��
 (ԭ9>�(�.L�uYrqlT �K�$躆����G�n��}�K��5�-Z� 9�P³G��k�i��.�mI�����{�_�
_L�]]΂Iݏ���C���F�������ږj�[��Q�����%�����-1B��g�I�yb�A�}����294c�3���5P���(�Bk�e>�M�Zn���=�ON�{ �I�z�����Q�M���hq��G;MV��G��<��n��������JPFJ5installation/angie/views/main/tmpl/panel_required.php�����T]o�@|�b����P�>���X��-�JU�����Ͻ;H���;ېФ�׷;��{cw�Y�U��8��?y��,FP\#HTZH��HA��gBB���:&ØoPA(�i� ��`�0�**Ҩ<��DP��2�,[",9ڳPd[ɗ���]T�f��j���a,���[�!A[%2�N��F�c�#˕�Se���1E���(�"�A��\�g@#%4�$p�b��&F�7�����:�ʔ�{�N�7�խ2���X����t!���6�n�'�K��ZdmhV{��N�,By
��<e����1WHS�`���ݞל�ȟ�7�d>�ލ&ލS�~�� �7rf�_��h$x�Ξ���d���#w���7�Xmz�ilO��{��f#X���]�M&�?{NOY<�zmmdiɼ��j�*ݞ�_SԚ�K��n�ۃc����Ğ��n���\b��>Qk���݈�Dyp�IX�Ii��v�}3{,*Km9I��cA�E��Le��7��1)�vN��ȕV5'�,S��ɞ�H��f3dz9�$s5�'�E�%����=S�i��
���pEGEρ;���6\K��v��Z�!*�@���Z�s���W�?��l��dtm��ݛ��گd��N���f��	w�,�Pد�Q�p'E���J���JPFM8installation/angie/views/main/tmpl/panel_recommended.php�����T]o�0}.��
u
T�B�ih)�
҉ҾLr�[b5�#�����8)Yک��<�~��s�v�<	��srR��{��6�C��@�� ��$,Q���>� ��l��@�0�GD��e���q���\$:J������d#�2T0��h��h|���f<FC	߿�P�H��U�%8��Z�˴�Ȼ��(H?V��$�Q�TW�3hI� �a��6.�D�Svw�����*d2M9�U:[�td�J���#���ګhl�H�4?����Byb���u�aj�П�j�5k�{�on��3wp=����Zu8�u}*�r�����Skr9))��'�#,P6>ۖJoUxf�
���F�Ӿ�Rط����@�Ɲ���(���?x~O��?�u����v6s��;��%��z��^��(�	
�f���	���	��T��K	z��y�޶z[�(��9�ߝ&#�ja�j��n��K�0Z�g�{ͨ�~Zt%�ʺ�n��=�ֽnXK�[�K���3M��JO����պ?+��u�d�v��6�hR_�r���f˪�ց4�l�#�sg�Y�kOoC���ՕU7�r'%�!!e
1������R���X���K{������ݻ-�8�o�2���F���G�ѯv��JPFC.installation/angie/views/main/tmpl/default.phpC`���Tmo�8�L~�UM��݇k�6�,M˥�z�I05qd��i����m7R˞g�g^<��bQ8�ёGă(�&$�
�Bm�b��t�xa`&LY��.��t�7�!U�f0�B�8e��Y��~g,�$KsU�)�#�9�{�,����/+/m���<=>=���)���\�����\���sMV�<�\[���o`��	xXO����
*m�:����}��p�s�<w܅a/p� ��5.�*��0f�5������|PvV��\ t x��I��`8��>�����_j�x�Zѻ��s��t���@�t*�f7��!KT�.+
��,I�;Gs����^�]��ˊyn�d˶��q�;k�dϯ�>oF�M�k��77���+k�����q�89m4�����%�ȿ;(4~}��9X+A�ty��s��� Qט
V5��n�oǎc����
(�%_A�j�5�j�����Y��f�<-/�W��8��ύ��sL�y�Y���-fQ`���Ɛ6���8E�I/�'�]��1�_^y�����l��:�0e$���R��ߌ+R"�]�<w�t�'ԣ���,~�6���t��n85�=���Ѯ������#�,K>�n�]H��6��m�Hڟ�ʪ^v�v.+:Zf|T:�;u&P(�MTJ�zש�gݶ�sP�	>����D��&���$��
�q=$t�/�m�`.>�{����I�����
Qm�;uC>�L�y~4�h]T�O~/;��$
��8�{�'�l�Vk���J-G�MF_���8�M4����&h����Z�{������ ���9�%�JPF?*installation/angie/views/main/view.raw.php�����UQo�6~�~ť0*;�� }j7'u#�ڤ���(J:Y�%R%)�Ɛ��#E)�o�_$��;~G�zY�Upz|�1,�nVK���As��P���R�N�dRA̒M]SIη�!Q���`�A�\���+����ai�V���@k�n-��N�un�]�4I��gg�g�g��'�,���\���������`R�U����7wp�+�:�
��7������	PI�(�4R̸�t��x�\^-©
H9N��AB4,����2.)�ڕ��`D���[�l�J������z��.��R��F�X�v}ޤ8�>P,e�P&�'��W����ECx+4�u�Y�$���.�?z��O�pAN)�X�����3�
_Q�A\m�\����w)˂�G�GQ��ނ��֧>.�}s�����!<���l�d��W�[LXU\S_�6�L�<x)�(@R��І�s�i�����"q,R\!q���d��g#��dlr�g\T��]��L‚��d�#B��#ۄ�BS+F�d��葈��v���)WL;"��թ��9xJ�r�͉�`�Q�z��?4��[�Ha�����5@4����.�n�������1�h�`�g��ͽ|'�A���e�d�{��M������b����!%.ۀA�е]��?�o�Ga?s;�9��K�/a�m�m$0��
�>��f��O�M����5]2��N|	s
�N;��k��_~sX<(��
i_ّ	6���	�Zٸ�+�5Ǧ5�7��z����Ll���RfXL3� ��6Sݿ'	�R����
d�5ͮݾ>��o���S
��$<��Vv/@�A�P��L�p�5��'�NFE���`�^���=��4�%�Ic+?<i��w~��.��s��^=�����fz�JPFJ5installation/angie/views/offsitedirs/tmpl/default.php����V]O�8}&����*-�4��2�L��)-j�hG�U�$Ncp��v��j��^;)P&��J�&�����􎋼p��]�`|1 E9A�j�$QZH���H%�eB�'we��LrzOJ$���(^����ڂ���P0>�����9A�صDKI�F�OO����������4��
}�3 �T�%
�+#�Z,F•��ߠ‰�]�1l�Q�yO�2q�G�$�'%�$m����`p�c�R��|r�T��=��ΩB�7J�w�H��U{^?\c��^8�Jz�9�g��Ŭ͙��%a�mWF���0��ih��v�r���?��ʻ�ʘ�a�o���"�L�T���J� H��<v�~�f�3�0\UO���}	���
�`�1�Z�K�ɢ����.�Y����Y?�?/�
�A2����?F>pk~Tz!t��Y&&���Rk�m�[X��{���m7���訏�\�B����C��-���W���ڣ\i�Td7��K�
GP.u��:�;N/����G���31o!����R����q�ɧV�ٱ� J�*J�$�@	ՙ�̘�����D�Q����<F���4�]���tv:���q��p�1��xR��]Y�&�?��2�Xk�/��)���}���Z�_==?4�Ve���s�Dr筛�l+\xsz:C�2o��N���*�h©���:FzY��K	������X���*�S��ƽ.%Gf
��uК��*063�A7�ώo/1��-�:��MQU��5��[9�0e�$�1g��t2m�XC�bN�-
7��2��fY̞�6�e�[�8O��v=�x�����l���N�Ρ%��?4��*$�:k��*��Y
]��j,�r����C��S�fV
g��&|;v6r1q����f�߯G�8������Xl"ոyO�.1�w�� ��xx3A<��vu��*��'ӫY}
����<z^.$����l�4��Ie����Fy���V󃷇�ddru6����t�M�AU2��^�h�ϥ(���1a+#�"��b�|��jg�`���
��M0�Yַ�E�<R^���G��x�f��{���d��]
nj��N�O-t�Y	P/xm���~��X��DUn�PL/ѓ@[��c�<oK��WJ�1�JPFG2installation/angie/views/offsitedirs/view.html.php�����Q�o�0~��= %A0}Z�u
+BU[:�u/ӄ�B�fvd;l���	�jڤ�!q��ǝ/?�e�ƃ�����F�D��!�N�V`����Bȸxnj�F�r��A�0�l�3b�a�v��PY�J�����	�����P���)|:�b�L'����dzK)J]qw���uSi�ǽ˃V%*��'X�B�+��d�}n�X?��h��0D3�c!�q�N���Y%�!�'�	�`!���J��X~S�4�C����z�ޱh�+�j��?|�R�	�0h���r�~�9V+������P��z�n���x~�A��[eW�(��!D'A����]���JiGWB+GY��d������?�H�[�:Z���c�,� ���utEf7�;������4ј��9�FJ�����L�}�.�����~qjU͏�Z�c�?����h�l�f�5F�����^�oJPFE0installation/angie/views/runscripts/view.raw.php
���TQo�0~^~�!!��h3�'6�[]���r�kk��v�*�į��K8�I�cB��}w�����y�̂p?�}��q�0Y"a4�4�BI0\���\i�1~�g�4_��h�kd��!�B�1��T7c�*��ڼ�(�@���⎫l��bi�>5y����I����1_��x݁3"�6*Sy��U��M�Z��(��>x�(Q���3
@�~Fm�\������� Hp.$&��4z��u�F����qp�` r��	���co,ʄb�>�P{�|�y.y!��]$�	�lt�0��b	�������a1��\�8�a�iFo�ɫ�h8�@a	��{6Z�:kS��!y�'8U�#���q�u�x�Q��2�ƻ�6�-�EѪ�{�����}TRǓi_C�S}�)��h�[LTNk����.�҃��f+�V��R��&�@?Q�{�Li�Iq������a=Nu���v���|Uɼ-��g�A�!n��<ɏo�a�[X�X�'�����w��t�����*���#�J�d��_�%X��A���2���(�G~>EI�ָ��.1��OB�)��m��ɜ��jVlWr.yi�n�<��]
�>��%�@�>�ȧ�?V���"�ܹ���e|�����A��ܪ���~e�T<MW#/�ё_S�U�:l�Թ��N�!�'Ɠ�߯��R$u�n�C
����qvtD���XF��
��O�!�r�'x�<�޺7�l�IgF�����6�	JPFF1installation/angie/views/session/tmpl/blocked.php�z����]o�0���_qVM�2*ڛQ
5���)A�i�++$�XM��s>���4غ+��׏�{9�E$���ǀ&#CH�@�d*K���4H.2X��~��� �OLA ����k@��}T�$�D�4N��5WB�K�KΊX�����(s�T���o�i�&<���Wp��:��JE��S��v��,Q94���%L�1LWs�v��Ĥ�}����kRnF�<aa�F�5�Tk䂐�z���KWO���~�ٳ�T��E\�/2M���X�?2��*�!��/�"2���f���G��믢
�CMh�=�5�+��<��L�PCB���u:K�Y��$�.�=�4�$�O��Uy�ب �l���nȟ���GE���<N��]g(D�n�Һ����|�e“e�+��Y�����"�G���z�Þg9����xH�
�K�	�yXw�����G�O��@{`W4J�wR w���������;[�OX�l�U�J�����w�Pn����A�%��븯
��������LJ�M�s�\��S��MYJ��3��GMg2�&�ڤ){`��<���⸎Cj'���=<���d��=�ɞpr3�?҃jJƖ����`Clc��o_�C��v��j���7�!#�n|O�
����5ѢT�@9��b���D��9s-r_��_��05��wc7�ꟷ���D��������fX���C��8�:��_��>jS���|q�'[��'JPFF1installation/angie/views/session/tmpl/default.php�����Xms�8�~��w��M��;�#��cJ t:���m�u�#�I����V�+`Hһ43���}vW+NNC/��޼��7�7��[�@S���
�8��XP���4h�8����C����;!�,����-�1:K)7ۙ0�����N� sJԞ���sO���4���?����1R�c>���&��VY��2�*Y>uHI�W�O��c��6�AzxGx$�:>D�p`n�j.�р�u���Ѳ�zzC���j��ډK��D���b���0�{�̵n��D�0���At:�u}bM&���vp6���װ�]Yz��r[ �[���O����Q�Y���*<]G�ӛ:���]�zb@(�+Yt�)���}q@|à����st��^��(%L��������`Fx9_����:�jII��Ψ%��r��e���k(�Kbj�dR\±��#��h�&ئ�%sM�f4����A$V!��� �xGɽ���5�z���"���W0nc�ܚs�%���m�g��̙o�MM�4hf��Ze���^,.����/���wm�zg�`��`c���Zf�:���dȍB�-�Ґ��Ls5Pǐ�)%X�ke@���&��~_X��J���rb&u�2������~3O_/e��*�z'I�")?K�H��
K��r�4��/\N�Q
�b�L�&T/��prϸ��{�����?�0W�/�s����lO)n]ʉS���q�菭��h�噁ܶ;�^���N������U�F�Qn7ۖ�*�W�v,���B�|�[�<���=��X�0�05�暳�F��*�I�W��fw�b݇���ǣ����Ľ��U�Ns��(�ޮ������a����ٱYa���!1���܈b{IEEn�?�ڦ�]I�
��g��|a��[�L�OF�ws3���j�7�--OZ2.�w���$鯙+��ԍe��Vӵ�o5�K:���oN!A�@݁�$�R��'��Z=Hz^$V��(����]��$'��n�Ȭ<��|�H�6�9ϝ��x36��J̮��5��PZ�c@�[<z
@����.�qy�*/���#��6�E�qύ{�
��޶ۯ4�Y�v�n�2�9;�W�9��Ewo���p��Fd�|�fT�_s-w��|�G&r�/I �s",��ϳU����h�[�Ú5n��="$Q5{>�cψvX��{-H��E��9Q!#"��u����7�,�&z����F#����E��DGo����C�} ���|����Z,C�t�2����&�7���4uX��a.���1Գ���4n�<��Ƞ�ŕ�W�Jک/=��́�Ś4J��ĹTˀ43D0(�&�9YE�,�.�P�_�jHz��Q뇙uД�Z_�
x�S�A�/e�kD��t�C�����{��,'"��a?JS?M��[0�,.�HA��������K�����j4�E���|��U�릿���Cg��JPFC.installation/angie/views/session/view.html.phpU���=P�n�0<��C�$�DOU�����!$(W�8��"�-�CA�^;n�;3;���j*��.�.����z��H:���Nj$�4
m!�b��VTr��"w�Cv�t��q�*�LV���#ؼ��<���΄6G+�����E2z��RT���;���njMпx�\�@Ea�d�
Thy
�&����-���o��T���˱�
�8ڦ��x�FI ���1�#�!�F��
�݂�*�@�_�1�nE�D�>�F��s.U����tn\%��BΛ�3���\�X�I[���V�F
�Š��z��-$9��™��J�pQ������}{b'�JPF=(installation/angie/assets/runscripts.phpA�	���U�n#7}���k;u� A��m�ds�4Y$Y�ѐ5�G�F�J�8F��~I?�_�#�/3i��E��1)���2/;���m���1��]��U`r�u"(k�K��@S�h"�CU�p2W��I:�3�,��y"�p�a��?�V[�i~,a3&��Lq�O�r��,t�>�dow�۝�ݽ}�R2�Zx�4���𶴕��F��!K���l|�z��Nٰ�>W�ri|d�c]�BI8\u:O���|:>><�C�����H@�tS��ć'~
l2Oe����{�t~� ?�u�iedb1��O,��`�^{��hT�Y�H�/�B@)�К]}2���9?�Bד��*�.��2��`�f<�9�6Q�]���޽�q8_ƍe�/�pN"\�|pw6����vG"+�Q>`<�I[�ְ	>��8�/1a]0�����{��8��k$��.V��q��ـzn�2RW�-p7�6�m��Q�
��Z����t�ʘ�P��m��[�0j
���@��
Li���_��}K��fk4-���U�av�-l_5�ꞑc,IԌ�P�P~��Jz�8M\D�ҖUm��<�\��5�X�4��(�f�
����YC\�vD���Y���H�D�<���R�dz�V@V�.~��K�	��Z~1g��)H�L�!Ĥ��=8����U��V���V�`�2G�A_<�"�s�lq���5�V�rYˊ�$�IC:�:�:��&:Q�m�=��0��)�J؎�Mµ�s�Ƞ)-��T
���6�,�2���xK� Si��
�]`��<�~�\���-�S�Z�^7��C�E������R͵e����k��QX�TQo����)1��k��\a�Ϲ��T�2?��TX�@v�����)�h~�xA
����}����#4!C��sD��?��~s�ys���w�j
mq���@�WP��ࢰq�̙�B�f��U|b���(�X��3<dbb��1u�d�4���H�D|]�ԅ�1��mDŽB�+�j�i�i��V��Tx@��VB�Q<l,$B ���Otl]rfKV���C��~��i�՝����<��G3>Z���t�*�V�f����JPF7"installation/angie/helpers/ini.php/���V�r9}���q�vlǗ$<�b� ��
�e�I�c9#2
�&��۷���=����T�R���Ӓ�>˓�>�t�Ё���B�%�r��N���F�f�D��E�ĉ��b#��S�,��Zʉ�߂E6-W��TcJ�k���J������|i�U��շV�>><|�;><~*Nt*,���X���\��0(s�vS���Xf�⿸�^�L�›b��:l�Hc	��. �t�K2޼|��]�5�3Q���0�{~q3�"tBH��3*���2p�^�����.���HS�@�F�I*�s戉��H���O��X�0"���iA0��~*���}��g1�S��2��k�	�0OE��Y(�p�Xc��Yг;�D�A\�F��+3�K����s,=�E"3X�q#�!k�L-�R'`s+�A�#b����Ru-�%8
:Ƭe��*�e�$c�Zy��9�	b��qP��	n�WXD��щ0�s!��T��SoK$�c���b��������t�
Q�����T�JTf�Ӓ�IAfESc�I����D:�)�pF�)�\��Lտ�k$���#�V"cHF�H�5r�9�1b�'7v�2b��r�(�����U$Y���w�'Z���ۗVz$�l
v�]y{��u-�b�ER���i�o��ҏ˝�
���u���WߕK��K��b�����[�X��NN���x�w�k��=�	4�L�X�[
2b��45������1��O4j�{��ۮ3�Љ��`5P~��my����2aV'|�eb��]ߦg�_~��Ο�x̠�t�ƪ3��L�r���Z$��'����#�>�T
�Ke{���B&�O�B�K ;�.��=�1�]��K�C�Xq2�𐝅�w��x�	q��)̐�*1�� �]���G��^��̻�	��&kj�Ge|�ˁkM,���1�0��V�)
}�bnOI
��Jo5ޛF��W����h�U�oW�({�̶ȣ�*�<�x���m��q>����jc��vgߚ�b�.^�z�,�Y%|��
�Q
|^pM�h�*�kf�PCԼ巆��U.q	DV�$�ߣ�9=��'�yu�O�8iE�#���a��h<�Jo��Q�yPI�x��oW�棲��pL�F�hÿ��FC�q�.��K�G��-��"Oم�vi���T�J.{�����
/=g7k8-k�±����G���RA�q�+bG,:t��mp
|�WR��Q5���!���F�V���MU�Дl�
�q�5jDm����6"�_�z�ZU>�~���v��u~4�-���Cc�iVͶ#6�~'∍}�F�(��̇�AM�߽�7�Sf��z^�D��!$��~��x	h�<�ە��Sn�!��'
�4H� ͏�q�C��w�:���Ɔx�'lH͒s�'�wD���qT�fyp�h��|0�L�{�Vu���J��R�?�G��G��n��"�@��Z���/�ϧ�T���`uC0��7{y�Wa*�g��m~��>\���7ۨ⸮�>��w&�?.�.���=���t���JPF9$installation/angie/helpers/setup.phpa����T�N�@}�WL��(�<��@/�!o��f3�WY{��cPT���8$$������3����W>){�zprqz�`\!DC#��ȸ���\��ҋփ
�2wAT�S�,�d�8Q��)���O��u\C�{��9p��`w��_3��n�2���Gpat嬊�oLh�w�u�u�M;,k46Q�O/n���e;����w��u�n�r�/�I�&�����E8�gh=�k��'�B���h����T�U3bU�Y�l�
6��W��)K8���7W#0������i��Qe�9����\2���3�.�<���$��&�R�3c�����*���� ����F<\���v�3�'@#��Ǘ;�|���Z���t��d1~(˽����"/A�����z�4
X�[�k���S�g���*yQ'p[ug
�)Cm\a��P�^��f<�rc�D
~���v���%�.��l��v���]�[%���i�@�Kه���JE�`�;b��]x��m��f�x��
�í�d6��Hle���e �wqK�7}�Z	��5�l7cSG�w�O�w��vՆ�p��K�س�}Q�xE��1yL�JPF:%installation/angie/helpers/select.php�%D���\ms�6�,�
��)�F���˝\9��n�gb'7��G���E�$�D�������&SϴA`��X���?=KVI����{v��;`�+�� ,Y�<�e�4Hrv�l�7	��b܉�-R�s���|b��s�#�u�U�0N���`:,Am�8٦�r����`1|���?�>y�#{,Vq�3�똝C�,N�Mg�P�q��D+"ʐ�����K�����f/؅zy'��q�@�Ha�a���Y��E�0[�N��_D���J�b����I+�A7�JY�2AEel�>x�e�$_ylz̞��nqHM{���lk�"�Ջ|������@�Sq�7a��x�}��r�1�L�<
��ꗭl�ƛd�Ci���x��)�b�a��xO�8�`����"1���'[�/|�
c������6aҨ�~��y(h����v�|[ٟ��F�l�n�ǿ�kP��Ӎ�#C>aEj7��0�n.>�5�t��q�*���`�,��t���a%��`i3z#(���0�rg���5pVDK��O�@qcʇ��E�nr��8z@˩�>��8x���¯�[���KE�I#�$�}�oY���ɦ�\�0&ꑴɑ��<|�oŤ�&��]��#zcv��������&W;'_��?n%mvC�(�D�e��<�C�#�3�ȝ��/��o'If�;VP\Nٯ����'D̬"����G�D�7Y���V��J�b�?~�:����/m�OA2
>�Bk�|s�.G{j�^g��-��dU!
�~<ј�)[鼬P��V�V��.���l������_�#�[qZ�QtF,�Q��%$Q��z6@+v�:��Sv��|�D��~k�C���׼�ܭ*��c��Yb6��h�,�+��\!5�!O�q]�9�)<@pd�\ќR()XFq
�[�2+q"k�g��Kg	̪=���8G���(�S�G%2�\�vI;��d��`8ed!:�MM�au4�)��d�ny��a��_o_4U�P!rr7"6/�C:&M�4ȓ�T%Iui�Lr
�
$.�,� �f�2��!�Ir��+�B��,���W��E��{t�Q����ЁC�%l
M�6��d}Ɛ
S|p��5��^$�ꅫZ�U{#W̬�ft��ڧ,���X!H@sp�g5�_hZ�����/���z@&;dϔ�N q;�9_�%���,\N>����f��ze�������"9�b"�5�����t*cq���x�F{�)�I��
{4��QZ��8��U?k}��bHk��{V?߄)�j�Q�%�.�j�k�ȥ;��f��/�d$�>�����Q�Eߨ��7>W��4A)�NCN�j���KAN�VfN;:�Y�3�+_v7uf�)rg�
���#h��[��G}:Q5�K�ヽ�r��B�-2h>�
7�j��D)ۤP.G>KK+V�d2�aH�_���paYF&p~Ԓ� ��qk��v
.�R@��t�'k/(�Z�.�9c��lf�>�)�� �aL��l]���
!E��9�J&�A����~&��C"�*��0�?J#�2FFc��.����#`�f8ޣ��m#����ʙM�[cU��b����:�h�j@�>����"^'�̓0ȷ�Y+j���'&L薬��b��a�^&�����&�o�l18�X	^�GvU56FJ�8yc2!f���.hϰ�����d6.ц)��ƨ���~)��jv�S�ݿ�vxݭe�6���T������:YY��2�CW|��5�ϧ�i�+�گ�w�|`��)f+�J��n��ž	�����.�`ċ5y���z�Y�
|��m��2s��a�a�i�i�QAEzjⶢ�/�
��w�X�Dq��15���1�I���<5���ؔ�ki�d�4�
0��Y�j��k"����N&��‘�x��%�Ԝ*�|�sNŜ��E��ɓťn���P�V@��E��,���N��R<2�|�G[�a�$���o�XW��t���\���*��ZUeMu���ס��4؟�L��Y0����R��b%���y%
�F.*�Q�#s�п<�a(�1�N?۲�e���H��,s���%3�ԑ����G'R��*�׉y�P=�p�����r�Uw�� q	Oi!����Q��<_:���s~�L4��(Ī<�^�����<7C��w
8�IC����g�s�s��i�Q��ob���o�=6@�uـ�5�d��ū�FV��`����?�FS[l�i�'��d�>[��U��A���e�:	�V��E	̝�x�k��"���HN��c�l��2���_[U>qC�! �O�o�_��|���sw��@d7v�a��d�;��u�$�Y�E�}L���q�N���T��? v>~�=�~�MI��Zz[�l�����-J��Byj��l~���m�;`9�(�S��%7P�:e��0���Ξ:y��C�@uJf�}x�����1���.�9PB���d�^���=�����-5����U�-�NH_��&�K����<
�v����C�B��KH�oy�<f��n���g����q+zx��
i?Ki����Uk�/͋]�=�rң
���*l�[��c���G�K|
�:	v�P�m8ϕ��G�Y��DRMc�)�]3L��/�or|�Or9��R�t/��چ}Յ�zv:�}9-��9����S돘�1�R��M�
�qu��Š;�Ů�م��H*K�p��iF�6bg��g/._�9��:�����(��K{<)�6Sl;��J�U%u���~LJ=mg�X��T����zs]�ZF���8��9+R�=h-��7W�1��s��T�)i�Ex3�V�,�E,�^�g��d1\��sQT�����xZ��.c��\8XحCz䞝9�@]]���=N2�q�:%y���3?}��a���#�,�(�s��^S��"�B�����;���;���@_e�]X	|��ո�
9*��Ӹ�]H�ȑ	���ڒ|��u��2�
�҉@�[C���b���I�Z��C?�X-��ʛ�Z�t�'Bm.,t`��Q���#�fH�!��kI>�)�����}4O�BX�|�q��u*
�4��7#�K2�{"NNqc$}�Ⱥl��?���Qh=b�~��P�j��_cWB�u_��_$�>ܽ��$&�4�6kx��C�~t1�:_b��(�K�+�T��"�z¯�#�SؑS��*�\�j����^��Z#�(x�-G+�=Vi*v��L��˾ʡuE�C�r�G��ūf�)��
��R��E�내
9��D�#3T�&!_���~Jv�8	]�|y��5�N?��zG4�D���e��y^K��QQo)��Vu�����T��ŏ�I�r����2"�2٦���x�ӭ2�!$�ybC^�7�/O���澡�W����l�|G�R?���?	!����ֳ{%�*�C�v���3�D�V�9|"��Y(��
��6����V���N�p���|�%��of
�|�D_9"�m����BG�Ж��)�o�d����M�	3��z��I%��GyH��b�"zY""c+?��J4n���b�9WZ�1ّc�ŗ<��w���3�X�hA�%-6�w%���؅2�g�O�C���3�
���j���l��B�_��"�P��b�a�Ԇ�maa:!Bt
]�i
f�N&@������.��?��C����ӷ�����N...�}v�Q�d�����A���3�ڷ#VCj皺Ӭ:�oP���z�m�{H��Z�jiY�����:��S�L�2dʂ
��Ss��,z睞\�<?�:�]<��]���lF�eIjK�*=�Z�a�f�o��.@nuKEg�;i|�n�4�5�$"��'�M�)ւ�M/�4(y(7V|�%��>9r��W�iB)jt#$&�y��i�����
��Wբ�d��%a�6�(����c�zT�Nwt�wS4�[�k��c�8�G
��Ů�9Ճ�� ��+-�lj�
9{�_Л�����E��\�2��quuQ�?O��+�״�ή߽�]�<?���|���P���|}�
�]ud~h%sr��H]��J�i+�����oϮί%c�V�#Ͳ,�p]�d!%�����l��K�V����JPF6!installation/angie/autoloader.php�h���U�o�6�_qAH
�K����27M��i�5�dM�,�4��#���ߑ���n@�`D��>x<�]4u�L��8�����o5���u�0'�ˍhT���o�^�g��
2�%�70["���"Tٯ<h�	#����.[ ,�5�������_��������)�	^k�,��["����^j��֕���
���~�kTh��{?�
��6��ؠ�t$I�Cɓ$)�
�,-fﯮ���<���u�T^��G��;R�J4�!'z�Pl�y�OB�`���0��3W�9(/%
ۓI�zN6���Z��$��5{ߡ�%�Ў`��8S���\�@�r�(�C�]º�%y�Hld�6�6�8KD���6R�,}�]���g珳�?��W�v�l	`K�E�!D��Q�,�e+��E��h��'88�4F�y�l
�7�u��<]zcP9�	��y	�[�A+
M��V�5�rFKI;�.Qھ��^�%�闎S��<�� ��s��D�p���`f�+�d�u&P^�	ƶ�:O	�@�"�v}�4j���*(3]
i�çO]�Ǔ�ڠ��}@t;�cM�I��jC���m�	:~j�l��>��]oo>�>�H�jŪ�BU9���+�����ʆ�����o���a�!�G��6��Ç��X4-�-�q:I����'Z^ƽ�vJKc��bA|��l[�+o��җXh�q�EoD�|��A���	�@?mz����0r
�e҄��E�d lwc5�^��[3L�uMc5�_j�y��mI��0֍��A�>�b`�~��?y~���$n)�����(�ii�_�Y�N�����F�A��^86AG�v������(ۡ��ٷ�fI������xH��@9��ָ�[�9�Ȧ�� ҅�a:�T�JPF0installation/tmp/index.html�L��=O]K�0|���WzOB)���(���tm��nI҃��o7��>�����N~'�5��W��+�4��@p�;w�ʙ>�j��C�6�P�d�������8,��Y�O�<�܌v}�eK@���fPq?:���w��4}Y�mQ��J��'�ğF�=�=6��)4�1ku~r(�o�ԑ�C	��B�Oٶ���l��E��:��"�$�"&X*��Zg��f��Rn�?JPF0installation/tmp/web.configr��������Q(K-*��ϳU2�3PRH�K�O��K�U*-IӵPR���I��K�L/-J,*��R�����\���$�X0��$#�(�
I!\.%5�R��h�����>�.},�l�-��GuJPF/installation/tmp/.htaccessh�����L��O)�IUP��O�O,-ɨ�O�/J�K���/JI-RHIͫ�I���/�r2Ҋ�s�|.}�f;.�9��((���f�:�䀸

P>�����) U��ʐLJPF&installation/sql/�Acomponents/com_akeeba/Master/Installers/kickstart.txt000060400001365571152453623440017140 0ustar00<?php
/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Uncomment the following line to enable Kickstart's debug mode
//define('KSDEBUG', 1);

// =====================================================================================================================
// DO NOT MODIFY BELOW THIS LINE
// =====================================================================================================================
define('KICKSTART', 1);

define('KICKSTART_MIN_PHP', '5.6.0');
define('KICKSTART_RECOMMENDED_PHP', '7.4.0');

if (!defined('VERSION'))
{
	define('VERSION', '8.0.2-dev202307211217-revb86be29');
}

if (!defined('KICKSTARTPRO'))
{
	define('KICKSTARTPRO', '0');
}

// Used during development
if (!defined('KSDEBUG') && isset($_SERVER) && isset($_SERVER['HTTP_HOST']) && (strpos($_SERVER['HTTP_HOST'], 'local.web') !== false))
{
	define('KSDEBUG', 1);
}

define('KSWINDOWS', substr(PHP_OS, 0, 3) == 'WIN');

if (!defined('KSROOTDIR'))
{
	define('KSROOTDIR', dirname(__FILE__));
}

if (defined('KSDEBUG'))
{
	ini_set('error_log', KSROOTDIR . '/kickstart_error_log');
	if (file_exists(KSROOTDIR . '/kickstart_error_log'))
	{
		@unlink(KSROOTDIR . '/kickstart_error_log');
	}
	error_reporting(E_ALL | E_STRICT);
}
else
{
	@error_reporting(0);
}

// ==========================================================================================
// IIS missing REQUEST_URI workaround
// ==========================================================================================

/*
 * Based REQUEST_URI for IIS Servers 1.0 by NeoSmart Technologies
 * The proper method to solve IIS problems is to take a look at this:
 * http://neosmart.net/dl.php?id=7
 */

//This file should be located in the same directory as php.exe or php5isapi.dll

if (!isset($_SERVER['REQUEST_URI']))
{
	if (isset($_SERVER['HTTP_REQUEST_URI']))
	{
		$_SERVER['REQUEST_URI'] = $_SERVER['HTTP_REQUEST_URI'];
		//Good to go!
	}
	else
	{
		//Someone didn't follow the instructions!
		if (isset($_SERVER['SCRIPT_NAME']))
		{
			$_SERVER['HTTP_REQUEST_URI'] = $_SERVER['SCRIPT_NAME'];
		}
		else
		{
			$_SERVER['HTTP_REQUEST_URI'] = $_SERVER['PHP_SELF'];
		}
		if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING']))
		{
			$_SERVER['HTTP_REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
		}
		//WARNING: This is a workaround!
		//For guaranteed compatibility, HTTP_REQUEST_URI *MUST* be defined!
		//See product documentation for instructions!
		$_SERVER['REQUEST_URI'] = $_SERVER['HTTP_REQUEST_URI'];
	}
}

// Define the cacert.pem location, if it exists
$cacertpem = KSROOTDIR . '/cacert.pem';
if (is_file($cacertpem))
{
	if (is_readable($cacertpem))
	{
		define('AKEEBA_CACERT_PEM', $cacertpem);
	}
}
unset($cacertpem);

/**
 * Loads other PHP files containing extra Kickstart features. You can do all sorts of tricks such as injecting HTML
 * and CSS code (see AKFeatureGeorgeWSpecialEdition), adding AJAX task handlers (see AKFeatureURLImport) etc.
 *
 * Feature files must follow one of the following naming conventions:
 *
 * - kickstart.SOMETHING.php
 * - script_basename.SOMETHING.php
 *
 * where script_basename is the base name of Kickstart's PHP file. If you have renamed kickstart.php to foobar.php this
 * means that feature files must be named foobar.SOMETHING.php.
 *
 * The file must contain a class whose name starts with "AKFeature". The rest of the name is irrelevant and does not
 * have to follow a convention. It is, however, prudent to name the class using something similar to the filename it is
 * stored in to preserve your sanity and avoid potential conflicts.
 *
 * The class is instantiated ONLY ONCE, when the first call to callExtraFeature() is made. Its methods are called using
 * callExtraFeature() from Kickstart's (non-user-modifiable) code.
 */
function importKickstartFeatures($directory, $prefixes = array('kickstart'))
{
	$dh = @opendir($directory);

	if ($dh === false)
	{
		return;
	}

	// Make sure the prefixes include 'kickstart' and our basename
	if (!in_array('kickstart', $prefixes))
	{
		$prefixes[] = 'kickstart';
	}

	$selfBasename = basename(defined('KSSELFNAME') ? KSSELFNAME : basename(__FILE__), '.php');

	if (!in_array($selfBasename, $prefixes))
	{
		$prefixes[] = $selfBasename;
	}

	// Loop all files in the directory
	while ($filename = readdir($dh))
	{
		if (in_array($filename, array('.', '..')))
		{
			continue;
		}

		if (!is_file($directory . '/' . $filename))
		{
			continue;
		}

		// Feature files must be prefixed with one of the prefixes.
		$found = false;

		foreach ($prefixes as $prefix)
		{
			if (substr($filename, 0, strlen($prefix) + 1) == ($prefix . '.'))
			{
				$found = true;
				break;
			}
		}

		if (!$found)
		{
			continue;
		}

		if (substr($filename, -4) != '.php')
		{
			continue;
		}

		/**
		 * We have to ignore files which are just the prefix and a .php extension (because one of these scripts is the
		 * currently executing script).
		 */
		foreach ($prefixes as $prefix)
		{
			if ($filename == ($prefix . '.php'))
			{
				continue 2;
			}
		}

		// Op-code busting before loading the feature (in case it's self-modifying)
		if (function_exists('opcache_invalidate'))
		{
			opcache_invalidate($directory . '/' . $filename, true);
		}

		if (function_exists('apc_compile_file'))
		{
			apc_compile_file($directory . '/' . $filename);
		}

		if (function_exists('wincache_refresh_if_changed'))
		{
			wincache_refresh_if_changed(array($directory . '/' . $filename));
		}

		if (function_exists('xcache_asm'))
		{
			xcache_asm($directory . '/' . $filename);
		}

		include_once $directory . '/' . $filename;
	}
}

// Import Kickstart features from the top level directory
importKickstartFeatures(KSROOTDIR);

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

define('_AKEEBA_RESTORATION', 1);
defined('DS') or define('DS', DIRECTORY_SEPARATOR);

// Unarchiver run states
define('AK_STATE_NOFILE', 0); // File header not read yet
define('AK_STATE_HEADER', 1); // File header read; ready to process data
define('AK_STATE_DATA', 2); // Processing file data
define('AK_STATE_DATAREAD', 3); // Finished processing file data; ready to post-process
define('AK_STATE_POSTPROC', 4); // Post-processing
define('AK_STATE_DONE', 5); // Done with post-processing

/* Windows system detection */
if (!defined('_AKEEBA_IS_WINDOWS'))
{
	if (function_exists('php_uname'))
	{
		define('_AKEEBA_IS_WINDOWS', stristr(php_uname(), 'windows'));
	}
	else
	{
		define('_AKEEBA_IS_WINDOWS', DIRECTORY_SEPARATOR == '\\');
	}
}

// Get the file's root
if (!defined('KSROOTDIR'))
{
	define('KSROOTDIR', dirname(__FILE__));
}
if (!defined('KSLANGDIR'))
{
	define('KSLANGDIR', KSROOTDIR);
}

// Make sure the locale is correct for basename() to work
if (function_exists('setlocale'))
{
	@setlocale(LC_ALL, 'en_US.UTF8');
}

// fnmatch not available on non-POSIX systems
// Thanks to soywiz@php.net for this usefull alternative function [http://gr2.php.net/fnmatch]
if (!function_exists('fnmatch'))
{
	function fnmatch($pattern, $string)
	{
		return @preg_match(
			'/^' . strtr(addcslashes($pattern, '/\\.+^$(){}=!<>|'),
				array('*' => '.*', '?' => '.?')) . '$/i', $string
		);
	}
}

// Unicode-safe binary data length function
if (!function_exists('akstringlen'))
{
	if (function_exists('mb_strlen'))
	{
		function akstringlen($string)
		{
			return mb_strlen($string, '8bit');
		}
	}
	else
	{
		function akstringlen($string)
		{
			return strlen($string);
		}
	}
}

if (!function_exists('aksubstr'))
{
	if (function_exists('mb_strlen'))
	{
		function aksubstr($string, $start, $length = null)
		{
			return mb_substr($string, $start, $length, '8bit');
		}
	}
	else
	{
		function aksubstr($string, $start, $length = null)
		{
			return substr($string, $start, $length);
		}
	}
}

/**
 * Gets a query parameter from GET or POST data
 *
 * @param $key
 * @param $default
 */
function getQueryParam($key, $default = null)
{
	$value = $default;

	if (array_key_exists($key, $_REQUEST))
	{
		$value = $_REQUEST[$key];
	}

	if (version_compare(PHP_VERSION, '5.4.0', 'lt') && get_magic_quotes_gpc() && !is_null($value))
	{
		$value = stripslashes($value);
	}

	return $value;
}

// Debugging function
function debugMsg($msg)
{
	if (!defined('KSDEBUG'))
	{
		return;
	}

	$fp = fopen('debug.txt', 'a');

	fwrite($fp, $msg . PHP_EOL);
	fclose($fp);

	// Echo to stdout if KSDEBUGCLI is defined
	if (defined('KSDEBUGCLI'))
	{
		echo $msg . "\n";
	}
}

/**
 * Invalidate a file in OPcache.
 *
 * Only applies if the file has a .php extension.
 *
 * @param   string  $file  The filepath to clear from OPcache
 *
 * @return  boolean
 * @since   7.1.0
 */
function clearFileInOPCache($file)
{
	static $hasOpCache = null;

	if (is_null($hasOpCache))
	{
		$hasOpCache = ini_get('opcache.enable')
			&& function_exists('opcache_invalidate')
			&& (!ini_get('opcache.restrict_api') || stripos(realpath($_SERVER['SCRIPT_FILENAME']), ini_get('opcache.restrict_api')) === 0);
	}

	if ($hasOpCache && (strtolower(substr($file, -4)) === '.php'))
	{
		return opcache_invalidate($file, true);
	}

	return false;
}

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * The base class of Akeeba Engine objects. Allows for error and warnings logging
 * and propagation. Largely based on the Joomla! 1.5 JObject class.
 */
abstract class AKAbstractObject
{
	/** @var    array    The queue size of the $_errors array. Set to 0 for infinite size. */
	protected $_errors_queue_size = 0;
	/** @var    array    The queue size of the $_warnings array. Set to 0 for infinite size. */
	protected $_warnings_queue_size = 0;
	/** @var    array    An array of errors */
	private $_errors = array();
	/** @var    array    An array of warnings */
	private $_warnings = array();

	/**
	 * Get the most recent error message
	 *
	 * @param    integer $i Optional error index
	 *
	 * @return    string    Error message
	 */
	public function getError($i = null)
	{
		return $this->getItemFromArray($this->_errors, $i);
	}

	/**
	 * Returns the last item of a LIFO string message queue, or a specific item
	 * if so specified.
	 *
	 * @param array $array An array of strings, holding messages
	 * @param int   $i     Optional message index
	 *
	 * @return mixed The message string, or false if the key doesn't exist
	 */
	private function getItemFromArray($array, $i = null)
	{
		// Find the item
		if ($i === null)
		{
			// Default, return the last item
			$item = end($array);
		}
		else if (!array_key_exists($i, $array))
		{
			// If $i has been specified but does not exist, return false
			return false;
		}
		else
		{
			$item = $array[$i];
		}

		return $item;
	}

	/**
	 * Return all errors, if any
	 *
	 * @return    array    Array of error messages
	 */
	public function getErrors()
	{
		return $this->_errors;
	}

	/**
	 * Resets all error messages
	 */
	public function resetErrors()
	{
		$this->_errors = array();
	}

	/**
	 * Get the most recent warning message
	 *
	 * @param    integer $i Optional warning index
	 *
	 * @return    string    Error message
	 */
	public function getWarning($i = null)
	{
		return $this->getItemFromArray($this->_warnings, $i);
	}

	/**
	 * Return all warnings, if any
	 *
	 * @return    array    Array of error messages
	 */
	public function getWarnings()
	{
		return $this->_warnings;
	}

	/**
	 * Resets all warning messages
	 */
	public function resetWarnings()
	{
		$this->_warnings = array();
	}

	/**
	 * Propagates errors and warnings to a foreign object. The foreign object SHOULD
	 * implement the setError() and/or setWarning() methods but DOESN'T HAVE TO be of
	 * AKAbstractObject type. For example, this can even be used to propagate to a
	 * JObject instance in Joomla!. Propagated items will be removed from ourselves.
	 *
	 * @param object $object The object to propagate errors and warnings to.
	 */
	public function propagateToObject(&$object)
	{
		// Skip non-objects
		if (!is_object($object))
		{
			return;
		}

		if (method_exists($object, 'setError'))
		{
			if (!empty($this->_errors))
			{
				foreach ($this->_errors as $error)
				{
					$object->setError($error);
				}
				$this->_errors = array();
			}
		}

		if (method_exists($object, 'setWarning'))
		{
			if (!empty($this->_warnings))
			{
				foreach ($this->_warnings as $warning)
				{
					$object->setWarning($warning);
				}
				$this->_warnings = array();
			}
		}
	}

	/**
	 * Propagates errors and warnings from a foreign object. Each propagated list is
	 * then cleared on the foreign object, as long as it implements resetErrors() and/or
	 * resetWarnings() methods.
	 *
	 * @param object $object The object to propagate errors and warnings from
	 */
	public function propagateFromObject(&$object)
	{
		if (method_exists($object, 'getErrors'))
		{
			$errors = $object->getErrors();
			if (!empty($errors))
			{
				foreach ($errors as $error)
				{
					$this->setError($error);
				}
			}
			if (method_exists($object, 'resetErrors'))
			{
				$object->resetErrors();
			}
		}

		if (method_exists($object, 'getWarnings'))
		{
			$warnings = $object->getWarnings();
			if (!empty($warnings))
			{
				foreach ($warnings as $warning)
				{
					$this->setWarning($warning);
				}
			}
			if (method_exists($object, 'resetWarnings'))
			{
				$object->resetWarnings();
			}
		}
	}

	/**
	 * Add an error message
	 *
	 * @param    string $error Error message
	 */
	public function setError($error)
	{
		if ($this->_errors_queue_size > 0)
		{
			if (count($this->_errors) >= $this->_errors_queue_size)
			{
				array_shift($this->_errors);
			}
		}

		$this->_errors[] = $error;
	}

	/**
	 * Add an error message
	 *
	 * @param    string $error Error message
	 */
	public function setWarning($warning)
	{
		if ($this->_warnings_queue_size > 0)
		{
			if (count($this->_warnings) >= $this->_warnings_queue_size)
			{
				array_shift($this->_warnings);
			}
		}

		$this->_warnings[] = $warning;
	}

	/**
	 * Sets the size of the error queue (acts like a LIFO buffer)
	 *
	 * @param int $newSize The new queue size. Set to 0 for infinite length.
	 */
	protected function setErrorsQueueSize($newSize = 0)
	{
		$this->_errors_queue_size = (int) $newSize;
	}

	/**
	 * Sets the size of the warnings queue (acts like a LIFO buffer)
	 *
	 * @param int $newSize The new queue size. Set to 0 for infinite length.
	 */
	protected function setWarningsQueueSize($newSize = 0)
	{
		$this->_warnings_queue_size = (int) $newSize;
	}

}

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * The superclass of all Akeeba Kickstart parts. The "parts" are intelligent stateful
 * classes which perform a single procedure and have preparation, running and
 * finalization phases. The transition between phases is handled automatically by
 * this superclass' tick() final public method, which should be the ONLY public API
 * exposed to the rest of the Akeeba Engine.
 */
abstract class AKAbstractPart extends AKAbstractObject
{
	/**
	 * Indicates whether this part has finished its initialisation cycle
	 *
	 * @var boolean
	 */
	protected $isPrepared = false;

	/**
	 * Indicates whether this part has more work to do (it's in running state)
	 *
	 * @var boolean
	 */
	protected $isRunning = false;

	/**
	 * Indicates whether this part has finished its finalization cycle
	 *
	 * @var boolean
	 */
	protected $isFinished = false;

	/**
	 * Indicates whether this part has finished its run cycle
	 *
	 * @var boolean
	 */
	protected $hasRun = false;

	/**
	 * The name of the engine part (a.k.a. Domain), used in return table
	 * generation.
	 *
	 * @var string
	 */
	protected $active_domain = "";

	/**
	 * The step this engine part is in. Used verbatim in return table and
	 * should be set by the code in the _run() method.
	 *
	 * @var string
	 */
	protected $active_step = "";

	/**
	 * A more detailed description of the step this engine part is in. Used
	 * verbatim in return table and should be set by the code in the _run()
	 * method.
	 *
	 * @var string
	 */
	protected $active_substep = "";

	/**
	 * Any configuration variables, in the form of an array.
	 *
	 * @var array
	 */
	protected $_parametersArray = array();

	/** @var string The database root key */
	protected $databaseRoot = array();
	/** @var array An array of observers */
	protected $observers = array();
	/** @var int Last reported warnings's position in array */
	private $warnings_pointer = -1;

	/**
	 * The public interface to an engine part. This method takes care for
	 * calling the correct method in order to perform the initialisation -
	 * run - finalisation cycle of operation and return a proper response array.
	 *
	 * @return    array    A Response Array
	 */
	final public function tick()
	{
		// Call the right action method, depending on engine part state
		switch ($this->getState())
		{
			case "init":
				$this->_prepare();
				break;
			case "prepared":
				$this->_run();
				break;
			case "running":
				$this->_run();
				break;
			case "postrun":
				$this->_finalize();
				break;
		}

		// Send a Return Table back to the caller
		$out = $this->_makeReturnTable();

		return $out;
	}

	/**
	 * Returns the state of this engine part.
	 *
	 * @return string The state of this engine part. It can be one of
	 * error, init, prepared, running, postrun, finished.
	 */
	final public function getState()
	{
		if ($this->getError())
		{
			return "error";
		}

		if (!($this->isPrepared))
		{
			return "init";
		}

		if (!($this->isFinished) && !($this->isRunning) && !($this->hasRun) && ($this->isPrepared))
		{
			return "prepared";
		}

		if (!($this->isFinished) && $this->isRunning && !($this->hasRun))
		{
			return "running";
		}

		if (!($this->isFinished) && !($this->isRunning) && $this->hasRun)
		{
			return "postrun";
		}

		if ($this->isFinished)
		{
			return "finished";
		}
	}

	/**
	 * Runs the preparation for this part. Should set _isPrepared
	 * to true
	 */
	abstract protected function _prepare();

	/**
	 * Runs the main functionality loop for this part. Upon calling,
	 * should set the _isRunning to true. When it finished, should set
	 * the _hasRan to true. If an error is encountered, setError should
	 * be used.
	 */
	abstract protected function _run();

	/**
	 * Runs the finalisation process for this part. Should set
	 * _isFinished to true.
	 */
	abstract protected function _finalize();

	/**
	 * Constructs a Response Array based on the engine part's state.
	 *
	 * @return array The Response Array for the current state
	 */
	final protected function _makeReturnTable()
	{
		// Get a list of warnings
		$warnings = $this->getWarnings();
		// Report only new warnings if there is no warnings queue size
		if ($this->_warnings_queue_size == 0)
		{
			if (($this->warnings_pointer > 0) && ($this->warnings_pointer < (count($warnings))))
			{
				$warnings = array_slice($warnings, $this->warnings_pointer + 1);
				$this->warnings_pointer += count($warnings);
			}
			else
			{
				$this->warnings_pointer = count($warnings);
			}
		}

		$out = array(
			'HasRun'   => (!($this->isFinished)),
			'Domain'   => $this->active_domain,
			'Step'     => $this->active_step,
			'Substep'  => $this->active_substep,
			'Error'    => $this->getError(),
			'Warnings' => $warnings
		);

		return $out;
	}

	/**
	 * Returns a copy of the class's status array
	 *
	 * @return array
	 */
	public function getStatusArray()
	{
		return $this->_makeReturnTable();
	}

	/**
	 * Sends any kind of setup information to the engine part. Using this,
	 * we avoid passing parameters to the constructor of the class. These
	 * parameters should be passed as an indexed array and should be taken
	 * into account during the preparation process only. This function will
	 * set the error flag if it's called after the engine part is prepared.
	 *
	 * @param array $parametersArray The parameters to be passed to the
	 *                               engine part.
	 */
	final public function setup($parametersArray)
	{
		if ($this->isPrepared)
		{
			$this->setState('error', "Can't modify configuration after the preparation of " . $this->active_domain);
		}
		else
		{
			$this->_parametersArray = $parametersArray;
			if (array_key_exists('root', $parametersArray))
			{
				$this->databaseRoot = $parametersArray['root'];
			}
		}
	}

	/**
	 * Sets the engine part's internal state, in an easy to use manner
	 *
	 * @param    string $state        One of init, prepared, running, postrun, finished, error
	 * @param    string $errorMessage The reported error message, should the state be set to error
	 */
	protected function setState($state = 'init', $errorMessage = 'Invalid setState argument')
	{
		switch ($state)
		{
			case 'init':
				$this->isPrepared = false;
				$this->isRunning  = false;
				$this->isFinished = false;
				$this->hasRun     = false;
				break;

			case 'prepared':
				$this->isPrepared = true;
				$this->isRunning  = false;
				$this->isFinished = false;
				$this->hasRun     = false;
				break;

			case 'running':
				$this->isPrepared = true;
				$this->isRunning  = true;
				$this->isFinished = false;
				$this->hasRun     = false;
				break;

			case 'postrun':
				$this->isPrepared = true;
				$this->isRunning  = false;
				$this->isFinished = false;
				$this->hasRun     = true;
				break;

			case 'finished':
				$this->isPrepared = true;
				$this->isRunning  = false;
				$this->isFinished = true;
				$this->hasRun     = false;
				break;

			case 'error':
			default:
				$this->setError($errorMessage);
				break;
		}
	}

	final public function getDomain()
	{
		return $this->active_domain;
	}

	final public function getStep()
	{
		return $this->active_step;
	}

	final public function getSubstep()
	{
		return $this->active_substep;
	}

	/**
	 * Attaches an observer object
	 *
	 * @param AKAbstractPartObserver $obs
	 */
	function attach(AKAbstractPartObserver $obs)
	{
		$this->observers["$obs"] = $obs;
	}

	/**
	 * Detaches an observer object
	 *
	 * @param AKAbstractPartObserver $obs
	 */
	function detach(AKAbstractPartObserver $obs)
	{
		unset($this->observers["$obs"]);
	}

	/**
	 * Sets the BREAKFLAG, which instructs this engine part that the current step must break immediately,
	 * in fear of timing out.
	 */
	protected function setBreakFlag()
	{
		AKFactory::set('volatile.breakflag', true);
	}

	final protected function setDomain($new_domain)
	{
		$this->active_domain = $new_domain;
	}

	final protected function setStep($new_step)
	{
		$this->active_step = $new_step;
	}

	final protected function setSubstep($new_substep)
	{
		$this->active_substep = $new_substep;
	}

	/**
	 * Notifies observers each time something interesting happened to the part
	 *
	 * @param mixed $message The event object
	 */
	protected function notify($message)
	{
		foreach ($this->observers as $obs)
		{
			$obs->update($this, $message);
		}
	}
}

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * The base class of unarchiver classes
 */
abstract class AKAbstractUnarchiver extends AKAbstractPart
{
	/** @var array List of the names of all archive parts */
	public $archiveList = array();
	/** @var int The total size of all archive parts */
	public $totalSize = array();
	/** @var array Which files to rename */
	public $renameFiles = array();
	/** @var array Which directories to rename */
	public $renameDirs = array();
	/** @var array Which files to skip */
	public $skipFiles = array();
	/** @var string Archive filename */
	protected $filename = null;
	/** @var integer Current archive part number */
	protected $currentPartNumber = -1;
	/** @var integer The offset inside the current part */
	protected $currentPartOffset = 0;
	/** @var bool Should I restore permissions? */
	protected $flagRestorePermissions = false;
	/** @var AKAbstractPostproc Post processing class */
	protected $postProcEngine = null;
	/** @var string Absolute path to prepend to extracted files */
	protected $addPath = '';
	/** @var string Absolute path to remove from extracted files */
	protected $removePath = '';
	/** @var integer Chunk size for processing */
	protected $chunkSize = 524288;

	/** @var resource File pointer to the current archive part file */
	protected $fp = null;

	/** @var int Run state when processing the current archive file */
	protected $runState = null;

	/** @var stdClass File header data, as read by the readFileHeader() method */
	protected $fileHeader = null;

	/** @var int How much of the uncompressed data we've read so far */
	protected $dataReadLength = 0;

	/** @var array Unwriteable files in these directories are always ignored and do not cause errors when not extracted */
	protected $ignoreDirectories = array();

	/**
	 * Wakeup function, called whenever the class is unserialized
	 */
	public function __wakeup()
	{
		if ($this->currentPartNumber >= 0)
		{
			$this->fp = @fopen($this->archiveList[$this->currentPartNumber], 'r');

			if ((is_resource($this->fp)) && ($this->currentPartOffset > 0))
			{
				@fseek($this->fp, $this->currentPartOffset);
			}
		}
	}

	/**
	 * Sleep function, called whenever the class is serialized
	 */
	public function shutdown()
	{
		if (is_resource($this->fp))
		{
			$this->currentPartOffset = @ftell($this->fp);
			@fclose($this->fp);
		}
	}

	/**
	 * Is this file or directory contained in a directory we've decided to ignore
	 * write errors for? This is useful to let the extraction work despite write
	 * errors in the log, logs and tmp directories which MIGHT be used by the system
	 * on some low quality hosts and Plesk-powered hosts.
	 *
	 * @param   string $shortFilename The relative path of the file/directory in the package
	 *
	 * @return  boolean  True if it belongs in an ignored directory
	 */
	public function isIgnoredDirectory($shortFilename)
	{
		// return false;

		if (substr($shortFilename, -1) == '/')
		{
			$check = rtrim($shortFilename, '/');
		}
		else
		{
			$check = dirname($shortFilename);
		}

		return in_array($check, $this->ignoreDirectories);
	}

	/**
	 * Implements the abstract _prepare() method
	 */
	final protected function _prepare()
	{
		if (count($this->_parametersArray) > 0)
		{
			foreach ($this->_parametersArray as $key => $value)
			{
				switch ($key)
				{
					// Archive's absolute filename
					case 'filename':
						$this->filename = $value;

						// Sanity check
						if (!empty($value))
						{
							$value = strtolower($value);

							if (strlen($value) > 6)
							{
								if (
									(substr($value, 0, 7) == 'http://')
									|| (substr($value, 0, 8) == 'https://')
									|| (substr($value, 0, 6) == 'ftp://')
									|| (substr($value, 0, 7) == 'ssh2://')
									|| (substr($value, 0, 6) == 'ssl://')
								)
								{
									$this->setState('error', 'Invalid archive location');
								}
							}
						}


						break;

					// Should I restore permissions?
					case 'restore_permissions':
						$this->flagRestorePermissions = $value;
						break;

					// Should I use FTP?
					case 'post_proc':
						$this->postProcEngine = AKFactory::getpostProc($value);
						break;

					// Path to add in the beginning
					case 'add_path':
						$this->addPath = $value;
						$this->addPath = str_replace('\\', '/', $this->addPath);
						$this->addPath = rtrim($this->addPath, '/');
						if (!empty($this->addPath))
						{
							$this->addPath .= '/';
						}
						break;

					// Path to remove from the beginning
					case 'remove_path':
						$this->removePath = $value;
						$this->removePath = str_replace('\\', '/', $this->removePath);
						$this->removePath = rtrim($this->removePath, '/');
						if (!empty($this->removePath))
						{
							$this->removePath .= '/';
						}
						break;

					// Which files to rename (hash array)
					case 'rename_files':
						$this->renameFiles = $value;
						break;

					// Which files to rename (hash array)
					case 'rename_dirs':
						$this->renameDirs = $value;
						break;

					// Which files to skip (indexed array)
					case 'skip_files':
						$this->skipFiles = $value;
						break;

					// Which directories to ignore when we can't write files in them (indexed array)
					case 'ignoredirectories':
						$this->ignoreDirectories = $value;
						break;
				}
			}
		}

		$this->scanArchives();

		$this->readArchiveHeader();
		$errMessage = $this->getError();
		if (!empty($errMessage))
		{
			$this->setState('error', $errMessage);
		}
		else
		{
			$this->runState = AK_STATE_NOFILE;
			$this->setState('prepared');
		}
	}

	/**
	 * Scans for archive parts
	 */
	private function scanArchives()
	{
		if (defined('KSDEBUG'))
		{
			@unlink('debug.txt');
		}
		debugMsg('Preparing to scan archives');

		$privateArchiveList = array();

		// Get the components of the archive filename
		$dirname         = dirname($this->filename);
		$base_extension  = $this->getBaseExtension();
		$basename        = basename($this->filename, $base_extension);
		$this->totalSize = 0;

		// Scan for multiple parts until we don't find any more of them
		$count             = 0;
		$found             = true;
		$this->archiveList = array();
		while ($found)
		{
			++$count;
			$extension = substr($base_extension, 0, 2) . sprintf('%02d', $count);
			$filename  = $dirname . DIRECTORY_SEPARATOR . $basename . $extension;
			$found     = file_exists($filename);
			if ($found)
			{
				debugMsg('- Found archive ' . $filename);
				// Add yet another part, with a numeric-appended filename
				$this->archiveList[] = $filename;

				$filesize = @filesize($filename);
				$this->totalSize += $filesize;

				$privateArchiveList[] = array($filename, $filesize);
			}
			else
			{
				debugMsg('- Found archive ' . $this->filename);
				// Add the last part, with the regular extension
				$this->archiveList[] = $this->filename;

				$filename = $this->filename;
				$filesize = @filesize($filename);
				$this->totalSize += $filesize;

				$privateArchiveList[] = array($filename, $filesize);
			}
		}
		debugMsg('Total archive parts: ' . $count);

		$this->currentPartNumber = -1;
		$this->currentPartOffset = 0;
		$this->runState          = AK_STATE_NOFILE;

		// Send start of file notification
		$message                     = new stdClass;
		$message->type               = 'totalsize';
		$message->content            = new stdClass;
		$message->content->totalsize = $this->totalSize;
		$message->content->filelist  = $privateArchiveList;
		$this->notify($message);
	}

	/**
	 * Returns the base extension of the file, e.g. '.jpa'
	 *
	 * @return string
	 */
	private function getBaseExtension()
	{
		static $baseextension;

		if (empty($baseextension))
		{
			$basename      = basename($this->filename);
			$lastdot       = strrpos($basename, '.');
			$baseextension = substr($basename, $lastdot);
		}

		return $baseextension;
	}

	/**
	 * Concrete classes are supposed to use this method in order to read the archive's header and
	 * prepare themselves to the point of being ready to extract the first file.
	 */
	protected abstract function readArchiveHeader();

	protected function _run()
	{
		if ($this->getState() == 'postrun')
		{
			return;
		}

		$this->setState('running');

		$timer = AKFactory::getTimer();

		$status = true;
		while ($status && ($timer->getTimeLeft() > 0))
		{
			switch ($this->runState)
			{
				case AK_STATE_NOFILE:
					debugMsg(__CLASS__ . '::_run() - Reading file header');
					$status = $this->readFileHeader();
					if ($status)
					{
						// Send start of file notification
						$message                        = new stdClass;
						$message->type                  = 'startfile';
						$message->content               = new stdClass;
						$message->content->realfile     = $this->fileHeader->file;
						$message->content->file         = $this->fileHeader->file;
						$message->content->uncompressed = $this->fileHeader->uncompressed;

						if (array_key_exists('realfile', get_object_vars($this->fileHeader)))
						{
							$message->content->realfile = $this->fileHeader->realFile;
						}

						if (array_key_exists('compressed', get_object_vars($this->fileHeader)))
						{
							$message->content->compressed = $this->fileHeader->compressed;
						}
						else
						{
							$message->content->compressed = 0;
						}

						debugMsg(__CLASS__ . '::_run() - Preparing to extract ' . $message->content->realfile);

						$this->notify($message);
					}
					else
					{
						debugMsg(__CLASS__ . '::_run() - Could not read file header');
					}
					break;

				case AK_STATE_HEADER:
				case AK_STATE_DATA:
					debugMsg(__CLASS__ . '::_run() - Processing file data');
					$status = $this->processFileData();
					break;

				case AK_STATE_DATAREAD:
				case AK_STATE_POSTPROC:
					debugMsg(__CLASS__ . '::_run() - Calling post-processing class');
					$this->postProcEngine->timestamp = $this->fileHeader->timestamp;
					$status                          = $this->postProcEngine->process();
					$this->propagateFromObject($this->postProcEngine);
					$this->runState = AK_STATE_DONE;
					break;

				case AK_STATE_DONE:
				default:
					if ($status)
					{
						debugMsg(__CLASS__ . '::_run() - Finished extracting file');
						// Send end of file notification
						$message          = new stdClass;
						$message->type    = 'endfile';
						$message->content = new stdClass;
						if (array_key_exists('realfile', get_object_vars($this->fileHeader)))
						{
							$message->content->realfile = $this->fileHeader->realFile;
						}
						else
						{
							$message->content->realfile = $this->fileHeader->file;
						}
						$message->content->file = $this->fileHeader->file;
						if (array_key_exists('compressed', get_object_vars($this->fileHeader)))
						{
							$message->content->compressed = $this->fileHeader->compressed;
						}
						else
						{
							$message->content->compressed = 0;
						}
						$message->content->uncompressed = $this->fileHeader->uncompressed;
						$this->notify($message);
					}
					$this->runState = AK_STATE_NOFILE;

					break;
			}
		}

		$error = $this->getError();

		if (!$status && ($this->runState == AK_STATE_NOFILE) && empty($error))
		{
			debugMsg(__CLASS__ . '::_run() - Just finished');
			// We just finished
			$this->setState('postrun');

			// Reset internal state, prevents __wakeup from trying to open a non-existent file
			$this->currentPartNumber = -1;
		}
		elseif (!empty($error))
		{
			debugMsg(__CLASS__ . '::_run() - Halted with an error:');
			debugMsg($error);
			$this->setState('error', $error);
		}
	}

	/**
	 * Concrete classes must use this method to read the file header
	 *
	 * @return bool True if reading the file was successful, false if an error occurred or we reached end of archive
	 */
	protected abstract function readFileHeader();

	/**
	 * Concrete classes must use this method to process file data. It must set $runState to AK_STATE_DATAREAD when
	 * it's finished processing the file data.
	 *
	 * @return bool True if processing the file data was successful, false if an error occurred
	 */
	protected abstract function processFileData();

	protected function _finalize()
	{
		// Nothing to do
		$this->setState('finished');
	}

	/**
	 * Opens the next part file for reading
	 */
	protected function nextFile()
	{
		debugMsg('Current part is ' . $this->currentPartNumber . '; opening the next part');
		++$this->currentPartNumber;

		if ($this->currentPartNumber > (count($this->archiveList) - 1))
		{
			$this->setState('postrun');

			return false;
		}
		else
		{
			if (is_resource($this->fp))
			{
				@fclose($this->fp);
			}
			debugMsg('Opening file ' . $this->archiveList[$this->currentPartNumber]);
			$this->fp = @fopen($this->archiveList[$this->currentPartNumber], 'r');
			if ($this->fp === false)
			{
				debugMsg('Could not open file - crash imminent');
				$this->setError(AKText::sprintf('ERR_COULD_NOT_OPEN_ARCHIVE_PART', $this->archiveList[$this->currentPartNumber]));
			}
			fseek($this->fp, 0);
			$this->currentPartOffset = 0;

			return true;
		}
	}

	/**
	 * Returns true if we have reached the end of file
	 *
	 * @param $local bool True to return EOF of the local file, false (default) to return if we have reached the end of
	 *               the archive set
	 *
	 * @return bool True if we have reached End Of File
	 */
	protected function isEOF($local = false)
	{
		$eof = @feof($this->fp);

		if (!$eof)
		{
			// Border case: right at the part's end (eeeek!!!). For the life of me, I don't understand why
			// feof() doesn't report true. It expects the fp to be positioned *beyond* the EOF to report
			// true. Incredible! :(
			$position = @ftell($this->fp);
			$filesize = @filesize($this->archiveList[$this->currentPartNumber]);
			if ($filesize <= 0)
			{
				// 2Gb or more files on a 32 bit version of PHP tend to get screwed up. Meh.
				$eof = false;
			}
			elseif ($position >= $filesize)
			{
				$eof = true;
			}
		}

		if ($local)
		{
			return $eof;
		}
		else
		{
			return $eof && ($this->currentPartNumber >= (count($this->archiveList) - 1));
		}
	}

	/**
	 * Tries to make a directory user-writable so that we can write a file to it
	 *
	 * @param $path string A path to a file
	 */
	protected function setCorrectPermissions($path)
	{
		static $rootDir = null;

		if (is_null($rootDir))
		{
			$rootDir = rtrim(AKFactory::get('kickstart.setup.destdir', ''), '/\\');
		}

		$directory = rtrim(dirname($path), '/\\');
		if ($directory != $rootDir)
		{
			// Is this an unwritable directory?
			if (!is_writeable($directory))
			{
				$this->postProcEngine->chmod($directory, 0755);
			}
		}
		$this->postProcEngine->chmod($path, 0644);
	}

	/**
	 * Reads data from the archive and notifies the observer with the 'reading' message
	 *
	 * @param $fp
	 * @param $length
	 */
	protected function fread($fp, $length = null)
	{
		if (is_numeric($length))
		{
			if ($length > 0)
			{
				$data = fread($fp, $length);
			}
			else
			{
				$data = fread($fp, PHP_INT_MAX);
			}
		}
		else
		{
			$data = fread($fp, PHP_INT_MAX);
		}
		if ($data === false)
		{
			$data = '';
		}

		// Send start of file notification
		$message                  = new stdClass;
		$message->type            = 'reading';
		$message->content         = new stdClass;
		$message->content->length = strlen($data);
		$this->notify($message);

		return $data;
	}

	/**
	 * Removes the configured $removePath from the path $path
	 *
	 * @param   string $path The path to reduce
	 *
	 * @return  string  The reduced path
	 */
	protected function removePath($path)
	{
		if (empty($this->removePath))
		{
			return $path;
		}

		if (strpos($path, $this->removePath) === 0)
		{
			$path = substr($path, strlen($this->removePath));
			$path = ltrim($path, '/\\');
		}

		return $path;
	}

	/**
	 * Am I supposed to skip the extraction of the current file? This depends on
	 *
	 * @return bool
	 */
	protected function mustSkip()
	{
		static $isDryRun = null;

		// List of files (and patterns) to extract
		static $extractList = null;

		// Internal cache of the last file we checked and whether it must be skipped
		static $lastFileName = '';
		static $mustSkip = false;

		// Make sure the dry run flag is, indeed, populated
		if (is_null($isDryRun))
		{
			$isDryRun = AKFactory::get('kickstart.setup.dryrun', '0');
		}

		// If it's a Kickstart dry run we have to skip the extraction of the file
		if ($isDryRun)
		{
			return true;
		}

		// Make sure I have a list of files and patterns to extract
		if (is_null($extractList))
		{
			$extractList = $this->getExtractList();
		}

		// No list of files to extract is given; we must extract everything.
		if (empty($extractList))
		{
			return false;
		}

		// I am asked about the same file again. Return the cached result.
		if ($this->fileHeader->file == $lastFileName)
		{
			return $mustSkip;
		}

		// Does the current file match the extract patterns or not?
		$lastFileName = $this->fileHeader->file;
		$lastFileName = (strpos($lastFileName, $this->addPath) === 0) ? substr($lastFileName, strlen(rtrim($this->addPath, "\\/")) + 1) : $lastFileName;
		$mustSkip     = !$this->matchesGlobPatterns($lastFileName, $extractList);

		return $mustSkip;
	}

	protected function fuzzySignatureSearch($requiredSignatures, $sigLen)
	{
		if (!is_array($requiredSignatures))
		{
			$requiredSignatures = [$requiredSignatures];
		}

		fseek($this->fp, 0, SEEK_SET);

		$stuff  = $this->fread($this->fp, 131072);
		$maxPos = function_exists('mb_strlen') ? mb_strlen($stuff, 'binary') : strlen($stuff);

		for ($i = 0; $i < $maxPos; $i++)
		{
			foreach ($requiredSignatures as $signature)
			{
				$sigBinary = function_exists('mb_substr') ? mb_substr($stuff, $i, $sigLen, 'binary') : substr($stuff, $i, $sigLen);

				if ($sigBinary === $signature)
				{
					fseek($this->fp, $i, SEEK_SET);

					return true;
				}
			}
		}

		return false;
	}

	/**
	 * Get the list of files / folders to extract. The list can contain filenames or glob patterns.
	 *
	 * @return  array
	 */
	private function getExtractList()
	{
		$rawList = AKFactory::get('kickstart.setup.extract_list', '');

		// Sometimes I could get an array, e.g. from CLI
		if (is_array($rawList))
		{
			$rawList = implode("\n", $rawList);
		}

		// Remove any whitespace
		$rawList = trim($rawList);

		if (empty($rawList))
		{
			return array();
		}

		// Convert commas to newlines so we can support both ways to express lists
		$rawList = str_replace(",", "\n", $rawList);
		$rawList = trim($rawList);

		// Convert the list to an array and clean it
		$list = explode("\n", $rawList);
		$list = array_map('trim', $list);

		return array_unique($list);
	}

	/**
	 * Tests whether the item $item matches the list of shell patterns $list.
	 *
	 * @param   string  $item  The file name to test
	 * @param   array   $list  The list of glob patterns to match
	 *
	 * @return  bool
	 */
	private function matchesGlobPatterns($item, array $list)
	{
		if (empty($list))
		{
			return true;
		}

		foreach ($list as $pattern)
		{
			if (fnmatch($pattern, $item))
			{
				return true;
			}
		}

		return false;
	}
}

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * File post processor engines base class
 */
abstract class AKAbstractPostproc extends AKAbstractObject
{
	/** @var int The UNIX timestamp of the file's desired modification date */
	public $timestamp = 0;
	/** @var string The current (real) file path we'll have to process */
	protected $filename = null;
	/** @var int The requested permissions */
	protected $perms = 0755;
	/** @var string The temporary file path we gave to the unarchiver engine */
	protected $tempFilename = null;
	/** @var string The temporary directory where the data will be stored */
	protected $tempDir = '';

	/**
	 * Processes the current file, e.g. moves it from temp to final location by FTP
	 */
	abstract public function process();

	/**
	 * The unarchiver tells us the path to the filename it wants to extract and we give it
	 * a different path instead.
	 *
	 * @param string $filename The path to the real file
	 * @param int    $perms    The permissions we need the file to have
	 *
	 * @return string The path to the temporary file
	 */
	abstract public function processFilename($filename, $perms = 0755);

	/**
	 * Recursively creates a directory if it doesn't exist
	 *
	 * @param string $dirName The directory to create
	 * @param int    $perms   The permissions to give to that directory
	 */
	abstract public function createDirRecursive($dirName, $perms);

	abstract public function chmod($file, $perms);

	abstract public function unlink($file);

	abstract public function rmdir($directory);

	abstract public function rename($from, $to);

	/**
	 * Returns the configured temporary directory
	 *
	 * @return string
	 */
	public function getTempDir()
	{
		return $this->tempDir;
	}
}


/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * Descendants of this class can be used in the unarchiver's observer methods (attach, detach and notify)
 *
 * @author Nicholas
 *
 */
abstract class AKAbstractPartObserver
{
	abstract public function update($object, $message);
}


/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * Direct file writer
 */
class AKPostprocDirect extends AKAbstractPostproc
{
	public function process()
	{
		$restorePerms = AKFactory::get('kickstart.setup.restoreperms', false);
		if ($restorePerms)
		{
			@chmod($this->filename, $this->perms);
		}
		else
		{
			if (@is_file($this->filename))
			{
				@chmod($this->filename, 0644);
			}
			else
			{
				@chmod($this->filename, 0755);
			}
		}
		if ($this->timestamp > 0)
		{
			@touch($this->filename, $this->timestamp);
		}

		if (@is_file($this->filename) || @is_link($this->filename))
		{
			clearFileInOPCache($this->filename);
		}

		return true;
	}

	public function processFilename($filename, $perms = 0755)
	{
		$this->perms    = $perms;
		$this->filename = $filename;

		return $filename;
	}

	public function createDirRecursive($dirName, $perms)
	{
		if (AKFactory::get('kickstart.setup.dryrun', '0'))
		{
			return true;
		}

		if (@mkdir($dirName, 0755, true))
		{
			@chmod($dirName, 0755);

			return true;
		}

		$root = AKFactory::get('kickstart.setup.destdir');
		$root = rtrim(str_replace('\\', '/', $root), '/');
		$dir  = rtrim(str_replace('\\', '/', $dirName), '/');
		if (strpos($dir, $root) === 0)
		{
			$dir = ltrim(substr($dir, strlen($root)), '/');
			$root .= '/';
		}
		else
		{
			$root = '';
		}

		if (empty($dir))
		{
			return true;
		}

		$dirArray = explode('/', $dir);
		$path     = '';
		foreach ($dirArray as $dir)
		{
			$path .= $dir . '/';
			$ret = is_dir($root . $path) ? true : @mkdir($root . $path);
			if (!$ret)
			{
				// Is this a file instead of a directory?
				if (is_file($root . $path))
				{
					@unlink($root . $path);
					$ret = @mkdir($root . $path);
				}
				if (!$ret)
				{
					$this->setError(AKText::sprintf('COULDNT_CREATE_DIR', $path));

					return false;
				}
			}
			// Try to set new directory permissions to 0755
			@chmod($root . $path, $perms);
		}

		return true;
	}

	public function chmod($file, $perms)
	{
		if (AKFactory::get('kickstart.setup.dryrun', '0'))
		{
			return true;
		}

		return @chmod($file, $perms);
	}

	public function unlink($file)
	{
		return @unlink($file);
	}

	public function rmdir($directory)
	{
		return @rmdir($directory);
	}

	public function rename($from, $to)
	{
		return @rename($from, $to);
	}

}

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * FTP file writer
 */
class AKPostprocFTP extends AKAbstractPostproc
{
	/** @var bool Should I use FTP over implicit SSL? */
	public $useSSL = false;
	/** @var bool use Passive mode? */
	public $passive = true;
	/** @var string FTP host name */
	public $host = '';
	/** @var int FTP port */
	public $port = 21;
	/** @var string FTP user name */
	public $user = '';
	/** @var string FTP password */
	public $pass = '';
	/** @var string FTP initial directory */
	public $dir = '';
	/** @var resource The FTP handle */
	private $handle = null;

	public function __construct()
	{
		$this->useSSL  = AKFactory::get('kickstart.ftp.ssl', false);
		$this->passive = AKFactory::get('kickstart.ftp.passive', true);
		$this->host    = AKFactory::get('kickstart.ftp.host', '');
		$this->port    = AKFactory::get('kickstart.ftp.port', 21);

		if (trim($this->port) == '')
		{
			$this->port = 21;
		}
		$this->user    = AKFactory::get('kickstart.ftp.user', '');
		$this->pass    = AKFactory::get('kickstart.ftp.pass', '');
		$this->dir     = AKFactory::get('kickstart.ftp.dir', '');
		$this->tempDir = AKFactory::get('kickstart.ftp.tempdir', '');

		$connected = $this->connect();

		if ($connected)
		{
			if (!empty($this->tempDir))
			{
				$tempDir  = rtrim($this->tempDir, '/\\') . '/';
				$writable = $this->isDirWritable($tempDir);
			}
			else
			{
				$tempDir  = '';
				$writable = false;
			}

			if (!$writable)
			{
				// Default temporary directory is the current root
				$tempDir = KSROOTDIR;
				if (empty($tempDir))
				{
					// Oh, we have no directory reported!
					$tempDir = '.';
				}
				$absoluteDirToHere = $tempDir;
				$tempDir           = rtrim(str_replace('\\', '/', $tempDir), '/');

				if (!empty($tempDir))
				{
					$tempDir .= '/';
				}

				$this->tempDir = $tempDir;
				// Is this directory writable?
				$writable = $this->isDirWritable($tempDir);
			}

			if (!$writable)
			{
				// Nope. Let's try creating a temporary directory in the site's root.
				$tempDir                 = $absoluteDirToHere . '/kicktemp';
				$trustMeIKnowWhatImDoing = 500 + 10 + 1; // working around overzealous scanners written by bozos
				$this->createDirRecursive($tempDir, $trustMeIKnowWhatImDoing);
				// Try making it writable...
				$this->fixPermissions($tempDir);
				$writable = $this->isDirWritable($tempDir);
			}

			// Was the new directory writable?
			if (!$writable)
			{
				// Let's see if the user has specified one
				$userdir = AKFactory::get('kickstart.ftp.tempdir', '');

				if (!empty($userdir))
				{
					// Is it an absolute or a relative directory?
					$absolute = false;
					$absolute = $absolute || (substr($userdir, 0, 1) == '/');
					$absolute = $absolute || (substr($userdir, 1, 1) == ':');
					$absolute = $absolute || (substr($userdir, 2, 1) == ':');

					if (!$absolute)
					{
						// Make absolute
						$tempDir = $absoluteDirToHere . $userdir;
					}
					else
					{
						// it's already absolute
						$tempDir = $userdir;
					}
					// Does the directory exist?
					if (is_dir($tempDir))
					{
						// Yeah. Is it writable?
						$writable = $this->isDirWritable($tempDir);
					}
				}
			}

			$this->tempDir = $tempDir;

			if (!$writable)
			{
				// No writable directory found!!!
				$this->setError(AKText::_('FTP_TEMPDIR_NOT_WRITABLE'));
			}
			else
			{
				AKFactory::set('kickstart.ftp.tempdir', $tempDir);
				$this->tempDir = $tempDir;
			}
		}
	}

	public function connect()
	{
		// Connect to server, using SSL if so required
		if ($this->useSSL)
		{
			$this->handle = @ftp_ssl_connect($this->host, $this->port);
		}
		else
		{
			$this->handle = @ftp_connect($this->host, $this->port);
		}

		if ($this->handle === false)
		{
			$this->setError(AKText::_('WRONG_FTP_HOST'));

			return false;
		}

		// Login
		if (!@ftp_login($this->handle, $this->user, $this->pass))
		{
			$this->setError(AKText::_('WRONG_FTP_USER'));
			@ftp_close($this->handle);

			return false;
		}

		// Change to initial directory
		if (!@ftp_chdir($this->handle, $this->dir))
		{
			$this->setError(AKText::_('WRONG_FTP_PATH1'));
			@ftp_close($this->handle);

			return false;
		}

		// Enable passive mode if the user requested it
		if ($this->passive)
		{
			@ftp_pasv($this->handle, true);
		}
		else
		{
			@ftp_pasv($this->handle, false);
		}

		// Try to download ourselves
		$testFilename = defined('KSSELFNAME') ? KSSELFNAME : basename(__FILE__);
		$tempHandle   = fopen('php://temp', 'r+');

		if (@ftp_fget($this->handle, $tempHandle, $testFilename, FTP_ASCII, 0) === false)
		{
			$this->setError(AKText::_('WRONG_FTP_PATH2'));
			@ftp_close($this->handle);
			fclose($tempHandle);

			return false;
		}

		fclose($tempHandle);

		return true;
	}

	private function isDirWritable($dir)
	{
		$fp = @fopen($dir . '/kickstart.dat', 'w');

		if ($fp === false)
		{
			return false;
		}
		else
		{
			@fclose($fp);
			unlink($dir . '/kickstart.dat');

			return true;
		}
	}

	public function createDirRecursive($dirName, $perms)
	{
		// Strip absolute filesystem path to website's root
		$removePath = AKFactory::get('kickstart.setup.destdir', '');

		if (!empty($removePath))
		{
			// UNIXize the paths
			$removePath = str_replace('\\', '/', $removePath);
			$dirName    = str_replace('\\', '/', $dirName);
			// Make sure they both end in a slash
			$removePath = rtrim($removePath, '/\\') . '/';
			$dirName    = rtrim($dirName, '/\\') . '/';
			// Process the path removal
			$left = substr($dirName, 0, strlen($removePath));

			if ($left == $removePath)
			{
				$dirName = substr($dirName, strlen($removePath));
			}
		}

		if (empty($dirName))
		{
			$dirName = '';
		} // 'cause the substr() above may return FALSE.

		$check = '/' . trim($this->dir, '/') . '/' . trim($dirName, '/');

		if ($this->is_dir($check))
		{
			return true;
		}

		$alldirs     = explode('/', $dirName);
		$previousDir = '/' . trim($this->dir);

		foreach ($alldirs as $curdir)
		{
			$check = $previousDir . '/' . $curdir;

			if (!$this->is_dir($check))
			{
				// Proactively try to delete a file by the same name
				@ftp_delete($this->handle, $check);

				if (@ftp_mkdir($this->handle, $check) === false)
				{
					// If we couldn't create the directory, attempt to fix the permissions in the PHP level and retry!
					$this->fixPermissions($removePath . $check);

					if (@ftp_mkdir($this->handle, $check) === false)
					{
						// Can we fall back to pure PHP mode, sire?
						if (!@mkdir($check))
						{
							$this->setError(AKText::sprintf('FTP_CANT_CREATE_DIR', $check));

							return false;
						}
						else
						{
							// Since the directory was built by PHP, change its permissions
							$trustMeIKnowWhatImDoing =
								500 + 10 + 1; // working around overzealous scanners written by bozos
							@chmod($check, $trustMeIKnowWhatImDoing);

							return true;
						}
					}
				}

				@ftp_chmod($this->handle, $perms, $check);

			}

			$previousDir = $check;
		}

		return true;
	}

	private function is_dir($dir)
	{
		return @ftp_chdir($this->handle, $dir);
	}

	private function fixPermissions($path)
	{
		// Turn off error reporting
		if (!defined('KSDEBUG'))
		{
			$oldErrorReporting = @error_reporting(0);
		}

		// Get UNIX style paths
		$relPath  = str_replace('\\', '/', $path);
		$basePath = rtrim(str_replace('\\', '/', KSROOTDIR), '/');
		$basePath = rtrim($basePath, '/');

		if (!empty($basePath))
		{
			$basePath .= '/';
		}

		// Remove the leading relative root
		if (substr($relPath, 0, strlen($basePath)) == $basePath)
		{
			$relPath = substr($relPath, strlen($basePath));
		}

		$dirArray  = explode('/', $relPath);
		$pathBuilt = rtrim($basePath, '/');

		foreach ($dirArray as $dir)
		{
			if (empty($dir))
			{
				continue;
			}
			$oldPath = $pathBuilt;
			$pathBuilt .= '/' . $dir;

			if (is_dir($oldPath . $dir))
			{
				$trustMeIKnowWhatImDoing = 500 + 10 + 1; // working around overzealous scanners written by bozos
				@chmod($oldPath . $dir, $trustMeIKnowWhatImDoing);
			}
			else
			{
				$trustMeIKnowWhatImDoing = 500 + 10 + 1; // working around overzealous scanners written by bozos
				if (@chmod($oldPath . $dir, $trustMeIKnowWhatImDoing) === false)
				{
					@unlink($oldPath . $dir);
				}
			}
		}

		// Restore error reporting
		if (!defined('KSDEBUG'))
		{
			@error_reporting($oldErrorReporting);
		}
	}

	public function __sleep()
	{
		if (!is_null($this->handle) && is_resource($this->handle))
		{
			@ftp_close($this->handle);
		}

		$this->handle = null;
	}

	public function __destruct()
	{
		if (!is_null($this->handle) && is_resource($this->handle))
		{
			@ftp_close($this->handle);
		}
	}


	public function __wakeup()
	{
		$this->connect();
	}

	public function process()
	{
		if (is_null($this->tempFilename))
		{
			// If an empty filename is passed, it means that we shouldn't do any post processing, i.e.
			// the entity was a directory or symlink
			return true;
		}

		$remotePath = dirname($this->filename);
		$removePath = AKFactory::get('kickstart.setup.destdir', '');

		if (!empty($removePath))
		{
			$removePath = ltrim($removePath, "/");
			$remotePath = ltrim($remotePath, "/");
			$left       = substr($remotePath, 0, strlen($removePath));

			if ($left == $removePath)
			{
				$remotePath = substr($remotePath, strlen($removePath));
			}
		}

		$absoluteFSPath  = dirname($this->filename);
		$relativeFTPPath = trim($remotePath, '/');
		$absoluteFTPPath = '/' . trim($this->dir, '/') . '/' . trim($remotePath, '/');
		$onlyFilename    = basename($this->filename);

		$remoteName = $absoluteFTPPath . '/' . $onlyFilename;

		$ret = @ftp_chdir($this->handle, $absoluteFTPPath);

		if ($ret === false)
		{
			$ret = $this->createDirRecursive($absoluteFSPath, 0755);

			if ($ret === false)
			{
				$this->setError(AKText::sprintf('FTP_COULDNT_UPLOAD', $this->filename));

				return false;
			}

			$ret = @ftp_chdir($this->handle, $absoluteFTPPath);

			if ($ret === false)
			{
				$this->setError(AKText::sprintf('FTP_COULDNT_UPLOAD', $this->filename));

				return false;
			}
		}

		$ret = @ftp_put($this->handle, $remoteName, $this->tempFilename, FTP_BINARY);

		if ($ret === false)
		{
			// If we couldn't create the file, attempt to fix the permissions in the PHP level and retry!
			$this->fixPermissions($this->filename);
			$this->unlink($this->filename);

			$fp = @fopen($this->tempFilename, 'r');

			if ($fp !== false)
			{
				$ret = @ftp_fput($this->handle, $remoteName, $fp, FTP_BINARY);
				@fclose($fp);
			}
			else
			{
				$ret = false;
			}
		}

		@unlink($this->tempFilename);

		if ($ret === false)
		{
			$this->setError(AKText::sprintf('FTP_COULDNT_UPLOAD', $this->filename));

			return false;
		}

		$restorePerms = AKFactory::get('kickstart.setup.restoreperms', false);

		if ($restorePerms)
		{
			@ftp_chmod($this->_handle, $this->perms, $remoteName);
		}
		else
		{
			@ftp_chmod($this->_handle, 0644, $remoteName);
		}

		if (@is_file($this->filename) || @is_link($this->filename))
		{
			clearFileInOPCache($this->filename);
		}

		return true;
	}

	/*
	 * Tries to fix directory/file permissions in the PHP level, so that
	 * the FTP operation doesn't fail.
	 * @param $path string The full path to a directory or file
	 */

	public function unlink($file)
	{
		$removePath = AKFactory::get('kickstart.setup.destdir', '');

		if (!empty($removePath))
		{
			$left = substr($file, 0, strlen($removePath));

			if ($left == $removePath)
			{
				$file = substr($file, strlen($removePath));
			}
		}

		$check = '/' . trim($this->dir, '/') . '/' . trim($file, '/');

		return @ftp_delete($this->handle, $check);
	}

	public function processFilename($filename, $perms = 0755)
	{
		// Catch some error conditions...
		if ($this->getError())
		{
			return false;
		}

		// If a null filename is passed, it means that we shouldn't do any post processing, i.e.
		// the entity was a directory or symlink
		if (is_null($filename))
		{
			$this->filename     = null;
			$this->tempFilename = null;

			return null;
		}

		// Strip absolute filesystem path to website's root
		$removePath = AKFactory::get('kickstart.setup.destdir', '');

		if (!empty($removePath))
		{
			$left = substr($filename, 0, strlen($removePath));

			if ($left == $removePath)
			{
				$filename = substr($filename, strlen($removePath));
			}
		}

		// Trim slash on the left
		$filename = ltrim($filename, '/');

		$this->filename     = $filename;
		$this->tempFilename = tempnam($this->tempDir, 'kickstart-');
		$this->perms        = $perms;

		if (empty($this->tempFilename))
		{
			// Oops! Let's try something different
			$this->tempFilename = $this->tempDir . '/kickstart-' . time() . '.dat';
		}

		return $this->tempFilename;
	}

	public function close()
	{
		@ftp_close($this->handle);
	}

	public function chmod($file, $perms)
	{
		return @ftp_chmod($this->handle, $perms, $file);
	}

	public function rmdir($directory)
	{
		$removePath = AKFactory::get('kickstart.setup.destdir', '');

		if (!empty($removePath))
		{
			$left = substr($directory, 0, strlen($removePath));

			if ($left == $removePath)
			{
				$directory = substr($directory, strlen($removePath));
			}
		}

		$check = '/' . trim($this->dir, '/') . '/' . trim($directory, '/');

		return @ftp_rmdir($this->handle, $check);
	}

	public function rename($from, $to)
	{
		$originalFrom = $from;
		$originalTo   = $to;

		$removePath = AKFactory::get('kickstart.setup.destdir', '');

		if (!empty($removePath))
		{
			$left = substr($from, 0, strlen($removePath));

			if ($left == $removePath)
			{
				$from = substr($from, strlen($removePath));
			}
		}

		$from = '/' . trim($this->dir, '/') . '/' . trim($from, '/');

		if (!empty($removePath))
		{
			$left = substr($to, 0, strlen($removePath));

			if ($left == $removePath)
			{
				$to = substr($to, strlen($removePath));
			}
		}

		$to = '/' . trim($this->dir, '/') . '/' . trim($to, '/');

		$result = @ftp_rename($this->handle, $from, $to);

		if ($result !== true)
		{
			return @rename($from, $to);
		}
		else
		{
			return true;
		}
	}

}


/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * FTP file writer
 */
class AKPostprocSFTP extends AKAbstractPostproc
{
	/** @var bool Should I use FTP over implicit SSL? */
	public $useSSL = false;
	/** @var bool use Passive mode? */
	public $passive = true;
	/** @var string FTP host name */
	public $host = '';
	/** @var int FTP port */
	public $port = 21;
	/** @var string FTP user name */
	public $user = '';
	/** @var string FTP password */
	public $pass = '';
	/** @var string FTP initial directory */
	public $dir = '';

	/** @var resource SFTP resource handle */
	private $handle = null;

	/** @var resource SSH2 connection resource handle */
	private $_connection = null;

	/** @var string Current remote directory, including the remote directory string */
	private $_currentdir;

	public function __construct()
	{
		$this->host = AKFactory::get('kickstart.ftp.host', '');
		$this->port = AKFactory::get('kickstart.ftp.port', 22);

		if (trim($this->port) == '')
		{
			$this->port = 22;
		}

		$this->user    = AKFactory::get('kickstart.ftp.user', '');
		$this->pass    = AKFactory::get('kickstart.ftp.pass', '');
		$this->dir     = AKFactory::get('kickstart.ftp.dir', '');
		$this->tempDir = AKFactory::get('kickstart.ftp.tempdir', '');

		$connected = $this->connect();

		if ($connected)
		{
			if (!empty($this->tempDir))
			{
				$tempDir  = rtrim($this->tempDir, '/\\') . '/';
				$writable = $this->isDirWritable($tempDir);
			}
			else
			{
				$tempDir  = '';
				$writable = false;
			}

			if (!$writable)
			{
				// Default temporary directory is the current root
				$tempDir = KSROOTDIR;
				if (empty($tempDir))
				{
					// Oh, we have no directory reported!
					$tempDir = '.';
				}
				$absoluteDirToHere = $tempDir;
				$tempDir           = rtrim(str_replace('\\', '/', $tempDir), '/');
				if (!empty($tempDir))
				{
					$tempDir .= '/';
				}
				$this->tempDir = $tempDir;
				// Is this directory writable?
				$writable = $this->isDirWritable($tempDir);
			}

			if (!$writable)
			{
				// Nope. Let's try creating a temporary directory in the site's root.
				$tempDir                 = $absoluteDirToHere . '/kicktemp';
				$trustMeIKnowWhatImDoing = 500 + 10 + 1; // working around overzealous scanners written by bozos
				$this->createDirRecursive($tempDir, $trustMeIKnowWhatImDoing);
				// Try making it writable...
				$this->fixPermissions($tempDir);
				$writable = $this->isDirWritable($tempDir);
			}

			// Was the new directory writable?
			if (!$writable)
			{
				// Let's see if the user has specified one
				$userdir = AKFactory::get('kickstart.ftp.tempdir', '');
				if (!empty($userdir))
				{
					// Is it an absolute or a relative directory?
					$absolute = false;
					$absolute = $absolute || (substr($userdir, 0, 1) == '/');
					$absolute = $absolute || (substr($userdir, 1, 1) == ':');
					$absolute = $absolute || (substr($userdir, 2, 1) == ':');
					if (!$absolute)
					{
						// Make absolute
						$tempDir = $absoluteDirToHere . $userdir;
					}
					else
					{
						// it's already absolute
						$tempDir = $userdir;
					}
					// Does the directory exist?
					if (is_dir($tempDir))
					{
						// Yeah. Is it writable?
						$writable = $this->isDirWritable($tempDir);
					}
				}
			}
			$this->tempDir = $tempDir;

			if (!$writable)
			{
				// No writable directory found!!!
				$this->setError(AKText::_('SFTP_TEMPDIR_NOT_WRITABLE'));
			}
			else
			{
				AKFactory::set('kickstart.ftp.tempdir', $tempDir);
				$this->tempDir = $tempDir;
			}
		}
	}

	public function connect()
	{
		$this->_connection = false;

		if (!function_exists('ssh2_connect'))
		{
			$this->setError(AKText::_('SFTP_NO_SSH2'));

			return false;
		}

		$this->_connection = @ssh2_connect($this->host, $this->port);

		if (!@ssh2_auth_password($this->_connection, $this->user, $this->pass))
		{
			$this->setError(AKText::_('SFTP_WRONG_USER'));

			$this->_connection = false;

			return false;
		}

		$this->handle = @ssh2_sftp($this->_connection);

		// I must have an absolute directory
		if (!$this->dir)
		{
			$this->setError(AKText::_('SFTP_WRONG_STARTING_DIR'));

			return false;
		}

		// Change to initial directory
		if (!$this->sftp_chdir('/'))
		{
			$this->setError(AKText::_('SFTP_WRONG_STARTING_DIR'));

			unset($this->_connection);
			unset($this->handle);

			return false;
		}

		// Try to download ourselves
		$testFilename = defined('KSSELFNAME') ? KSSELFNAME : basename(__FILE__);
		$basePath     = '/' . trim($this->dir, '/');

		if (@fopen("ssh2.sftp://{$this->handle}$basePath/$testFilename", 'r+') === false)
		{
			$this->setError(AKText::_('SFTP_WRONG_STARTING_DIR'));

			unset($this->_connection);
			unset($this->handle);

			return false;
		}

		return true;
	}

	/**
	 * Changes to the requested directory in the remote server. You give only the
	 * path relative to the initial directory and it does all the rest by itself,
	 * including doing nothing if the remote directory is the one we want.
	 *
	 * @param   string $dir The (realtive) remote directory
	 *
	 * @return  bool True if successful, false otherwise.
	 */
	private function sftp_chdir($dir)
	{
		// Strip absolute filesystem path to website's root
		$removePath = AKFactory::get('kickstart.setup.destdir', '');
		if (!empty($removePath))
		{
			// UNIXize the paths
			$removePath = str_replace('\\', '/', $removePath);
			$dir        = str_replace('\\', '/', $dir);

			// Make sure they both end in a slash
			$removePath = rtrim($removePath, '/\\') . '/';
			$dir        = rtrim($dir, '/\\') . '/';

			// Process the path removal
			$left = substr($dir, 0, strlen($removePath));

			if ($left == $removePath)
			{
				$dir = substr($dir, strlen($removePath));
			}
		}

		if (empty($dir))
		{
			// Because the substr() above may return FALSE.
			$dir = '';
		}

		// Calculate "real" (absolute) SFTP path
		$realdir = substr($this->dir, -1) == '/' ? substr($this->dir, 0, strlen($this->dir) - 1) : $this->dir;
		$realdir .= '/' . $dir;
		$realdir = substr($realdir, 0, 1) == '/' ? $realdir : '/' . $realdir;

		if ($this->_currentdir == $realdir)
		{
			// Already there, do nothing
			return true;
		}

		$result = @ssh2_sftp_stat($this->handle, $realdir);

		if ($result === false)
		{
			return false;
		}
		else
		{
			// Update the private "current remote directory" variable
			$this->_currentdir = $realdir;

			return true;
		}
	}

	private function isDirWritable($dir)
	{
		if (@fopen("ssh2.sftp://{$this->handle}$dir/kickstart.dat", 'w') === false)
		{
			return false;
		}
		else
		{
			@ssh2_sftp_unlink($this->handle, $dir . '/kickstart.dat');

			return true;
		}
	}

	public function createDirRecursive($dirName, $perms)
	{
		// Strip absolute filesystem path to website's root
		$removePath = AKFactory::get('kickstart.setup.destdir', '');
		if (!empty($removePath))
		{
			// UNIXize the paths
			$removePath = str_replace('\\', '/', $removePath);
			$dirName    = str_replace('\\', '/', $dirName);
			// Make sure they both end in a slash
			$removePath = rtrim($removePath, '/\\') . '/';
			$dirName    = rtrim($dirName, '/\\') . '/';
			// Process the path removal
			$left = substr($dirName, 0, strlen($removePath));
			if ($left == $removePath)
			{
				$dirName = substr($dirName, strlen($removePath));
			}
		}
		if (empty($dirName))
		{
			$dirName = '';
		} // 'cause the substr() above may return FALSE.

		$check = '/' . trim($this->dir, '/ ') . '/' . trim($dirName, '/');

		if ($this->is_dir($check))
		{
			return true;
		}

		$alldirs     = explode('/', $dirName);
		$previousDir = '/' . trim($this->dir, '/ ');

		foreach ($alldirs as $curdir)
		{
			if (!$curdir)
			{
				continue;
			}

			$check = $previousDir . '/' . $curdir;

			if (!$this->is_dir($check))
			{
				// Proactively try to delete a file by the same name
				@ssh2_sftp_unlink($this->handle, $check);

				if (@ssh2_sftp_mkdir($this->handle, $check) === false)
				{
					// If we couldn't create the directory, attempt to fix the permissions in the PHP level and retry!
					$this->fixPermissions($check);

					if (@ssh2_sftp_mkdir($this->handle, $check) === false)
					{
						// Can we fall back to pure PHP mode, sire?
						if (!@mkdir($check))
						{
							$this->setError(AKText::sprintf('FTP_CANT_CREATE_DIR', $check));

							return false;
						}
						else
						{
							// Since the directory was built by PHP, change its permissions
							$trustMeIKnowWhatImDoing =
								500 + 10 + 1; // working around overzealous scanners written by bozos
							@chmod($check, $trustMeIKnowWhatImDoing);

							return true;
						}
					}
				}

				@ssh2_sftp_chmod($this->handle, $check, $perms);
			}

			$previousDir = $check;
		}

		return true;
	}

	private function is_dir($dir)
	{
		return $this->sftp_chdir($dir);
	}

	private function fixPermissions($path)
	{
		// Turn off error reporting
		if (!defined('KSDEBUG'))
		{
			$oldErrorReporting = @error_reporting(0);
		}

		// Get UNIX style paths
		$relPath  = str_replace('\\', '/', $path);
		$basePath = rtrim(str_replace('\\', '/', KSROOTDIR), '/');
		$basePath = rtrim($basePath, '/');

		if (!empty($basePath))
		{
			$basePath .= '/';
		}

		// Remove the leading relative root
		if (substr($relPath, 0, strlen($basePath)) == $basePath)
		{
			$relPath = substr($relPath, strlen($basePath));
		}

		$dirArray  = explode('/', $relPath);
		$pathBuilt = rtrim($basePath, '/');

		foreach ($dirArray as $dir)
		{
			if (empty($dir))
			{
				continue;
			}

			$oldPath = $pathBuilt;
			$pathBuilt .= '/' . $dir;

			if (is_dir($oldPath . '/' . $dir))
			{
				$trustMeIKnowWhatImDoing = 500 + 10 + 1; // working around overzealous scanners written by bozos
				@chmod($oldPath . '/' . $dir, $trustMeIKnowWhatImDoing);
			}
			else
			{
				$trustMeIKnowWhatImDoing = 500 + 10 + 1; // working around overzealous scanners written by bozos
				if (@chmod($oldPath . '/' . $dir, $trustMeIKnowWhatImDoing) === false)
				{
					@unlink($oldPath . $dir);
				}
			}
		}

		// Restore error reporting
		if (!defined('KSDEBUG'))
		{
			@error_reporting($oldErrorReporting);
		}
	}

	function __wakeup()
	{
		$this->connect();
	}

	/*
	 * Tries to fix directory/file permissions in the PHP level, so that
	 * the FTP operation doesn't fail.
	 * @param $path string The full path to a directory or file
	 */

	public function process()
	{
		if (is_null($this->tempFilename))
		{
			// If an empty filename is passed, it means that we shouldn't do any post processing, i.e.
			// the entity was a directory or symlink
			return true;
		}

		$remotePath      = dirname($this->filename);
		$absoluteFSPath  = dirname($this->filename);
		$absoluteFTPPath = '/' . trim($this->dir, '/') . '/' . trim($remotePath, '/');
		$onlyFilename    = basename($this->filename);

		$remoteName = $absoluteFTPPath . '/' . $onlyFilename;

		$ret = $this->sftp_chdir($absoluteFTPPath);

		if ($ret === false)
		{
			$ret = $this->createDirRecursive($absoluteFSPath, 0755);

			if ($ret === false)
			{
				$this->setError(AKText::sprintf('SFTP_COULDNT_UPLOAD', $this->filename));

				return false;
			}

			$ret = $this->sftp_chdir($absoluteFTPPath);

			if ($ret === false)
			{
				$this->setError(AKText::sprintf('SFTP_COULDNT_UPLOAD', $this->filename));

				return false;
			}
		}

		// Create the file
		$ret = $this->write($this->tempFilename, $remoteName);

		// If I got a -1 it means that I wasn't able to open the file, so I have to stop here
		if ($ret === -1)
		{
			$this->setError(AKText::sprintf('SFTP_COULDNT_UPLOAD', $this->filename));

			return false;
		}

		if ($ret === false)
		{
			// If we couldn't create the file, attempt to fix the permissions in the PHP level and retry!
			$this->fixPermissions($this->filename);
			$this->unlink($this->filename);

			$ret = $this->write($this->tempFilename, $remoteName);
		}

		@unlink($this->tempFilename);

		if ($ret === false)
		{
			$this->setError(AKText::sprintf('SFTP_COULDNT_UPLOAD', $this->filename));

			return false;
		}
		$restorePerms = AKFactory::get('kickstart.setup.restoreperms', false);

		if ($restorePerms)
		{
			$this->chmod($remoteName, $this->perms);
		}
		else
		{
			$this->chmod($remoteName, 0644);
		}

		if (@is_file($this->filename) || @is_link($this->filename))
		{
			clearFileInOPCache($this->filename);
		}

		return true;
	}

	private function write($local, $remote)
	{
		$fp      = @fopen("ssh2.sftp://{$this->handle}$remote", 'w');
		$localfp = @fopen($local, 'r');

		if ($fp === false)
		{
			return -1;
		}

		if ($localfp === false)
		{
			@fclose($fp);

			return -1;
		}

		$res = true;

		while (!feof($localfp) && ($res !== false))
		{
			$buffer = @fread($localfp, 65567);
			$res    = @fwrite($fp, $buffer);
		}

		@fclose($fp);
		@fclose($localfp);

		return $res;
	}

	public function unlink($file)
	{
		$check = '/' . trim($this->dir, '/') . '/' . trim($file, '/');

		return @ssh2_sftp_unlink($this->handle, $check);
	}

	public function chmod($file, $perms)
	{
		return @ssh2_sftp_chmod($this->handle, $file, $perms);
	}

	public function processFilename($filename, $perms = 0755)
	{
		// Catch some error conditions...
		if ($this->getError())
		{
			return false;
		}

		// If a null filename is passed, it means that we shouldn't do any post processing, i.e.
		// the entity was a directory or symlink
		if (is_null($filename))
		{
			$this->filename     = null;
			$this->tempFilename = null;

			return null;
		}

		// Strip absolute filesystem path to website's root
		$removePath = AKFactory::get('kickstart.setup.destdir', '');
		if (!empty($removePath))
		{
			$left = substr($filename, 0, strlen($removePath));
			if ($left == $removePath)
			{
				$filename = substr($filename, strlen($removePath));
			}
		}

		// Trim slash on the left
		$filename = ltrim($filename, '/');

		$this->filename     = $filename;
		$this->tempFilename = tempnam($this->tempDir, 'kickstart-');
		$this->perms        = $perms;

		if (empty($this->tempFilename))
		{
			// Oops! Let's try something different
			$this->tempFilename = $this->tempDir . '/kickstart-' . time() . '.dat';
		}

		return $this->tempFilename;
	}

	public function close()
	{
		unset($this->_connection);
		unset($this->handle);
	}

	public function rmdir($directory)
	{
		$check = '/' . trim($this->dir, '/') . '/' . trim($directory, '/');

		return @ssh2_sftp_rmdir($this->handle, $check);
	}

	public function rename($from, $to)
	{
		$from = '/' . trim($this->dir, '/') . '/' . trim($from, '/');
		$to   = '/' . trim($this->dir, '/') . '/' . trim($to, '/');

		$result = @ssh2_sftp_rename($this->handle, $from, $to);

		if ($result !== true)
		{
			return @rename($from, $to);
		}
		else
		{
			return true;
		}
	}

}


/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * Hybrid direct / FTP mode file writer
 */
class AKPostprocHybrid extends AKAbstractPostproc
{

	/** @var bool Should I use the FTP layer? */
	public $useFTP = false;

	/** @var bool Should I use FTP over implicit SSL? */
	public $useSSL = false;

	/** @var bool use Passive mode? */
	public $passive = true;

	/** @var string FTP host name */
	public $host = '';

	/** @var int FTP port */
	public $port = 21;

	/** @var string FTP user name */
	public $user = '';

	/** @var string FTP password */
	public $pass = '';

	/** @var string FTP initial directory */
	public $dir = '';

	/** @var resource The FTP handle */
	private $handle = null;

	/** @var null The FTP connection handle */
	private $_handle = null;

	/**
	 * Public constructor. Tries to connect to the FTP server.
	 */
	public function __construct()
	{
		$this->useFTP  = true;
		$this->useSSL  = AKFactory::get('kickstart.ftp.ssl', false);
		$this->passive = AKFactory::get('kickstart.ftp.passive', true);
		$this->host    = AKFactory::get('kickstart.ftp.host', '');
		$this->port    = AKFactory::get('kickstart.ftp.port', 21);
		$this->user    = AKFactory::get('kickstart.ftp.user', '');
		$this->pass    = AKFactory::get('kickstart.ftp.pass', '');
		$this->dir     = AKFactory::get('kickstart.ftp.dir', '');
		$this->tempDir = AKFactory::get('kickstart.ftp.tempdir', '');

		if (trim($this->port) == '')
		{
			$this->port = 21;
		}

		// If FTP is not configured, skip it altogether
		if (empty($this->host) || empty($this->user) || empty($this->pass))
		{
			$this->useFTP = false;
		}

		// Try to connect to the FTP server
		$connected = $this->connect();

		// If the connection fails, skip FTP altogether
		if (!$connected)
		{
			$this->useFTP = false;
		}

		if ($connected)
		{
			if (!empty($this->tempDir))
			{
				$tempDir  = rtrim($this->tempDir, '/\\') . '/';
				$writable = $this->isDirWritable($tempDir);
			}
			else
			{
				$tempDir  = '';
				$writable = false;
			}

			if (!$writable)
			{
				// Default temporary directory is the current root
				$tempDir = KSROOTDIR;
				if (empty($tempDir))
				{
					// Oh, we have no directory reported!
					$tempDir = '.';
				}
				$absoluteDirToHere = $tempDir;
				$tempDir           = rtrim(str_replace('\\', '/', $tempDir), '/');
				if (!empty($tempDir))
				{
					$tempDir .= '/';
				}
				$this->tempDir = $tempDir;
				// Is this directory writable?
				$writable = $this->isDirWritable($tempDir);
			}

			if (!$writable)
			{
				// Nope. Let's try creating a temporary directory in the site's root.
				$tempDir                 = $absoluteDirToHere . '/kicktemp';
				$trustMeIKnowWhatImDoing = 500 + 10 + 1; // working around overzealous scanners written by bozos
				$this->createDirRecursive($tempDir, $trustMeIKnowWhatImDoing);
				// Try making it writable...
				$this->fixPermissions($tempDir);
				$writable = $this->isDirWritable($tempDir);
			}

			// Was the new directory writable?
			if (!$writable)
			{
				// Let's see if the user has specified one
				$userdir = AKFactory::get('kickstart.ftp.tempdir', '');
				if (!empty($userdir))
				{
					// Is it an absolute or a relative directory?
					$absolute = false;
					$absolute = $absolute || (substr($userdir, 0, 1) == '/');
					$absolute = $absolute || (substr($userdir, 1, 1) == ':');
					$absolute = $absolute || (substr($userdir, 2, 1) == ':');
					if (!$absolute)
					{
						// Make absolute
						$tempDir = $absoluteDirToHere . $userdir;
					}
					else
					{
						// it's already absolute
						$tempDir = $userdir;
					}
					// Does the directory exist?
					if (is_dir($tempDir))
					{
						// Yeah. Is it writable?
						$writable = $this->isDirWritable($tempDir);
					}
				}
			}
			$this->tempDir = $tempDir;

			if (!$writable)
			{
				// No writable directory found!!!
				$this->setError(AKText::_('FTP_TEMPDIR_NOT_WRITABLE'));
			}
			else
			{
				AKFactory::set('kickstart.ftp.tempdir', $tempDir);
				$this->tempDir = $tempDir;
			}
		}
	}

	/**
	 * Tries to connect to the FTP server
	 *
	 * @return bool
	 */
	public function connect()
	{
		if (!$this->useFTP)
		{
			return false;
		}

		// Connect to server, using SSL if so required
		if ($this->useSSL)
		{
			$this->handle = @ftp_ssl_connect($this->host, $this->port);
		}
		else
		{
			$this->handle = @ftp_connect($this->host, $this->port);
		}
		if ($this->handle === false)
		{
			$this->setError(AKText::_('WRONG_FTP_HOST'));

			return false;
		}

		// Login
		if (!@ftp_login($this->handle, $this->user, $this->pass))
		{
			$this->setError(AKText::_('WRONG_FTP_USER'));
			@ftp_close($this->handle);

			return false;
		}

		// Change to initial directory
		if (!@ftp_chdir($this->handle, $this->dir))
		{
			$this->setError(AKText::_('WRONG_FTP_PATH1'));
			@ftp_close($this->handle);

			return false;
		}

		// Enable passive mode if the user requested it
		if ($this->passive)
		{
			@ftp_pasv($this->handle, true);
		}
		else
		{
			@ftp_pasv($this->handle, false);
		}

		// Try to download ourselves
		$testFilename = defined('KSSELFNAME') ? KSSELFNAME : basename(__FILE__);
		$tempHandle   = fopen('php://temp', 'r+');

		if (@ftp_fget($this->handle, $tempHandle, $testFilename, FTP_ASCII, 0) === false)
		{
			$this->setError(AKText::_('WRONG_FTP_PATH2'));
			@ftp_close($this->handle);
			fclose($tempHandle);

			return false;
		}

		fclose($tempHandle);

		return true;
	}

	/**
	 * Is the directory writeable?
	 *
	 * @param string $dir The directory ti check
	 *
	 * @return bool
	 */
	private function isDirWritable($dir)
	{
		$fp = @fopen($dir . '/kickstart.dat', 'w');

		if ($fp === false)
		{
			return false;
		}

		@fclose($fp);
		unlink($dir . '/kickstart.dat');

		return true;
	}

	/**
	 * Create a directory, recursively
	 *
	 * @param string $dirName The directory to create
	 * @param int    $perms   The permissions to give to the directory
	 *
	 * @return bool
	 */
	public function createDirRecursive($dirName, $perms)
	{
		// Strip absolute filesystem path to website's root
		$removePath = AKFactory::get('kickstart.setup.destdir', '');

		if (!empty($removePath))
		{
			// UNIXize the paths
			$removePath = str_replace('\\', '/', $removePath);
			$dirName    = str_replace('\\', '/', $dirName);
			// Make sure they both end in a slash
			$removePath = rtrim($removePath, '/\\') . '/';
			$dirName    = rtrim($dirName, '/\\') . '/';
			// Process the path removal
			$left = substr($dirName, 0, strlen($removePath));

			if ($left == $removePath)
			{
				$dirName = substr($dirName, strlen($removePath));
			}
		}

		// 'cause the substr() above may return FALSE.
		if (empty($dirName))
		{
			$dirName = '';
		}

		$check   = '/' . trim($this->dir, '/') . '/' . trim($dirName, '/');
		$checkFS = $removePath . trim($dirName, '/');

		if ($this->is_dir($check))
		{
			return true;
		}

		$alldirs       = explode('/', $dirName);
		$previousDir   = '/' . trim($this->dir);
		$previousDirFS = rtrim($removePath, '/\\');

		foreach ($alldirs as $curdir)
		{
			$check   = $previousDir . '/' . $curdir;
			$checkFS = $previousDirFS . '/' . $curdir;

			if (!is_dir($checkFS) && !$this->is_dir($check))
			{
				// Proactively try to delete a file by the same name
				if (!@unlink($checkFS) && $this->useFTP)
				{
					@ftp_delete($this->handle, $check);
				}

				$createdDir = @mkdir($checkFS, 0755);

				if (!$createdDir && $this->useFTP)
				{
					$createdDir = @ftp_mkdir($this->handle, $check);
				}

				if ($createdDir === false)
				{
					// If we couldn't create the directory, attempt to fix the permissions in the PHP level and retry!
					$this->fixPermissions($checkFS);

					$createdDir = @mkdir($checkFS, 0755);
					if (!$createdDir && $this->useFTP)
					{
						$createdDir = @ftp_mkdir($this->handle, $check);
					}

					if ($createdDir === false)
					{
						$this->setError(AKText::sprintf('FTP_CANT_CREATE_DIR', $check));

						return false;
					}
				}

				if (!@chmod($checkFS, $perms) && $this->useFTP)
				{
					@ftp_chmod($this->handle, $perms, $check);
				}
			}

			$previousDir   = $check;
			$previousDirFS = $checkFS;
		}

		return true;
	}

	private function is_dir($dir)
	{
		if ($this->useFTP)
		{
			return @ftp_chdir($this->handle, $dir);
		}

		return false;
	}

	/**
	 * Tries to fix directory/file permissions in the PHP level, so that
	 * the FTP operation doesn't fail.
	 *
	 * @param $path string The full path to a directory or file
	 */
	private function fixPermissions($path)
	{
		// Turn off error reporting
		if (!defined('KSDEBUG'))
		{
			$oldErrorReporting = error_reporting(0);
		}

		// Get UNIX style paths
		$relPath  = str_replace('\\', '/', $path);
		$basePath = rtrim(str_replace('\\', '/', KSROOTDIR), '/');
		$basePath = rtrim($basePath, '/');

		if (!empty($basePath))
		{
			$basePath .= '/';
		}

		// Remove the leading relative root
		if (substr($relPath, 0, strlen($basePath)) == $basePath)
		{
			$relPath = substr($relPath, strlen($basePath));
		}

		$dirArray  = explode('/', $relPath);
		$pathBuilt = rtrim($basePath, '/');

		foreach ($dirArray as $dir)
		{
			if (empty($dir))
			{
				continue;
			}

			$oldPath = $pathBuilt;
			$pathBuilt .= '/' . $dir;

			if (is_dir($oldPath . $dir))
			{
				$trustMeIKnowWhatImDoing = 500 + 10 + 1; // working around overzealous scanners written by bozos
				@chmod($oldPath . $dir, $trustMeIKnowWhatImDoing);
			}
			else
			{
				$trustMeIKnowWhatImDoing = 500 + 10 + 1; // working around overzealous scanners written by bozos
				if (@chmod($oldPath . $dir, $trustMeIKnowWhatImDoing) === false)
				{
					@unlink($oldPath . $dir);
				}
			}
		}

		// Restore error reporting
		if (!defined('KSDEBUG'))
		{
			@error_reporting($oldErrorReporting);
		}
	}

	/**
	 * Called after unserialisation, tries to reconnect to FTP
	 */
	public function __wakeup()
	{
		if ($this->useFTP)
		{
			$this->connect();
		}
	}

	public function __sleep()
	{
		if ($this->useFTP)
		{
			if (!is_null($this->_handle) && is_resource($this->_handle))
			{
				@ftp_close($this->_handle);
			}
		}

		$this->_handle = null;
	}


	public function __destruct()
	{
		if ($this->useFTP)
		{
			if (!is_null($this->handle) && is_resource($this->handle))
			{
				@ftp_close($this->handle);
			}
		}
	}

	/**
	 * Post-process an extracted file, using FTP or direct file writes to move it
	 *
	 * @return bool
	 */
	public function process()
	{
		if (is_null($this->tempFilename))
		{
			// If an empty filename is passed, it means that we shouldn't do any post processing, i.e.
			// the entity was a directory or symlink
			return true;
		}

		$remotePath = dirname($this->filename);
		$removePath = AKFactory::get('kickstart.setup.destdir', '');
		$root       = rtrim($removePath, '/\\');

		if (!empty($removePath))
		{
			$removePath = ltrim($removePath, "/");
			$remotePath = ltrim($remotePath, "/");
			$left       = substr($remotePath, 0, strlen($removePath));

			if ($left == $removePath)
			{
				$remotePath = substr($remotePath, strlen($removePath));
			}
		}

		$absoluteFSPath  = dirname($this->filename);
		$relativeFTPPath = trim($remotePath, '/');
		$absoluteFTPPath = '/' . trim($this->dir, '/') . '/' . trim($remotePath, '/');
		$onlyFilename    = basename($this->filename);

		$remoteName = $absoluteFTPPath . '/' . $onlyFilename;

		// Does the directory exist?
		if (!is_dir($root . '/' . $absoluteFSPath))
		{
			$ret = $this->createDirRecursive($absoluteFSPath, 0755);

			if (($ret === false) && ($this->useFTP))
			{
				$ret = @ftp_chdir($this->handle, $absoluteFTPPath);
			}

			if ($ret === false)
			{
				$this->setError(AKText::sprintf('FTP_COULDNT_UPLOAD', $this->filename));

				return false;
			}
		}

		if ($this->useFTP)
		{
			$ret = @ftp_chdir($this->handle, $absoluteFTPPath);
		}

		// Try copying directly
		$ret = @copy($this->tempFilename, $root . '/' . $this->filename);

		if ($ret === false)
		{
			$this->fixPermissions($this->filename);
			$this->unlink($this->filename);

			$ret = @copy($this->tempFilename, $root . '/' . $this->filename);
		}

		if ($this->useFTP && ($ret === false))
		{
			$ret = @ftp_put($this->handle, $remoteName, $this->tempFilename, FTP_BINARY);

			if ($ret === false)
			{
				// If we couldn't create the file, attempt to fix the permissions in the PHP level and retry!
				$this->fixPermissions($this->filename);
				$this->unlink($this->filename);

				$fp = @fopen($this->tempFilename, 'r');
				if ($fp !== false)
				{
					$ret = @ftp_fput($this->handle, $remoteName, $fp, FTP_BINARY);
					@fclose($fp);
				}
				else
				{
					$ret = false;
				}
			}
		}

		@unlink($this->tempFilename);

		if ($ret === false)
		{
			$this->setError(AKText::sprintf('FTP_COULDNT_UPLOAD', $this->filename));

			return false;
		}

		$restorePerms = AKFactory::get('kickstart.setup.restoreperms', false);
		$perms        = $restorePerms ? $this->perms : 0644;

		$ret = @chmod($root . '/' . $this->filename, $perms);

		if ($this->useFTP && ($ret === false))
		{
			@ftp_chmod($this->_handle, $perms, $remoteName);
		}

		if (@is_file($this->filename) || @is_link($this->filename))
		{
			clearFileInOPCache($this->filename);
		}

		return true;
	}

	public function unlink($file)
	{
		$ret = @unlink($file);

		if (!$ret && $this->useFTP)
		{
			$removePath = AKFactory::get('kickstart.setup.destdir', '');
			if (!empty($removePath))
			{
				$left = substr($file, 0, strlen($removePath));
				if ($left == $removePath)
				{
					$file = substr($file, strlen($removePath));
				}
			}

			$check = '/' . trim($this->dir, '/') . '/' . trim($file, '/');

			$ret = @ftp_delete($this->handle, $check);
		}

		return $ret;
	}

	/**
	 * Create a temporary filename
	 *
	 * @param string $filename The original filename
	 * @param int    $perms    The file permissions
	 *
	 * @return string
	 */
	public function processFilename($filename, $perms = 0755)
	{
		// Catch some error conditions...
		if ($this->getError())
		{
			return false;
		}

		// If a null filename is passed, it means that we shouldn't do any post processing, i.e.
		// the entity was a directory or symlink
		if (is_null($filename))
		{
			$this->filename     = null;
			$this->tempFilename = null;

			return null;
		}

		// Strip absolute filesystem path to website's root
		$removePath = AKFactory::get('kickstart.setup.destdir', '');

		if (!empty($removePath))
		{
			$left = substr($filename, 0, strlen($removePath));

			if ($left == $removePath)
			{
				$filename = substr($filename, strlen($removePath));
			}
		}

		// Trim slash on the left
		$filename = ltrim($filename, '/');

		$this->filename     = $filename;
		$this->tempFilename = tempnam($this->tempDir, 'kickstart-');
		$this->perms        = $perms;

		if (empty($this->tempFilename))
		{
			// Oops! Let's try something different
			$this->tempFilename = $this->tempDir . '/kickstart-' . time() . '.dat';
		}

		return $this->tempFilename;
	}

	/**
	 * Closes the FTP connection
	 */
	public function close()
	{
		if (!$this->useFTP)
		{
			@ftp_close($this->handle);
		}
	}

	public function chmod($file, $perms)
	{
		if (AKFactory::get('kickstart.setup.dryrun', '0'))
		{
			return true;
		}

		$ret = @chmod($file, $perms);

		if (!$ret && $this->useFTP)
		{
			// Strip absolute filesystem path to website's root
			$removePath = AKFactory::get('kickstart.setup.destdir', '');

			if (!empty($removePath))
			{
				$left = substr($file, 0, strlen($removePath));

				if ($left == $removePath)
				{
					$file = substr($file, strlen($removePath));
				}
			}

			// Trim slash on the left
			$file = ltrim($file, '/');

			$ret = @ftp_chmod($this->handle, $perms, $file);
		}

		return $ret;
	}

	public function rmdir($directory)
	{
		$ret = @rmdir($directory);

		if (!$ret && $this->useFTP)
		{
			$removePath = AKFactory::get('kickstart.setup.destdir', '');
			if (!empty($removePath))
			{
				$left = substr($directory, 0, strlen($removePath));
				if ($left == $removePath)
				{
					$directory = substr($directory, strlen($removePath));
				}
			}

			$check = '/' . trim($this->dir, '/') . '/' . trim($directory, '/');

			$ret = @ftp_rmdir($this->handle, $check);
		}

		return $ret;
	}

	public function rename($from, $to)
	{
		$ret = @rename($from, $to);

		if (!$ret && $this->useFTP)
		{
			$originalFrom = $from;
			$originalTo   = $to;

			$removePath = AKFactory::get('kickstart.setup.destdir', '');
			if (!empty($removePath))
			{
				$left = substr($from, 0, strlen($removePath));
				if ($left == $removePath)
				{
					$from = substr($from, strlen($removePath));
				}
			}
			$from = '/' . trim($this->dir, '/') . '/' . trim($from, '/');

			if (!empty($removePath))
			{
				$left = substr($to, 0, strlen($removePath));
				if ($left == $removePath)
				{
					$to = substr($to, strlen($removePath));
				}
			}
			$to = '/' . trim($this->dir, '/') . '/' . trim($to, '/');

			$ret = @ftp_rename($this->handle, $from, $to);
		}

		return $ret;
	}
}

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * JPA archive extraction class
 */
class AKUnarchiverJPA extends AKAbstractUnarchiver
{
	protected $archiveHeaderData = [];

	protected function readArchiveHeader()
	{
		debugMsg('Preparing to read archive header');
		// Initialize header data array
		$this->archiveHeaderData = new stdClass();

		// Open the first part
		debugMsg('Opening the first part');
		$this->nextFile();

		// Fail for unreadable files
		if ($this->fp === false)
		{
			debugMsg('Could not open the first part');

			return false;
		}

		// Fuzzy check for the start of archive.
		debugMsg('Fuzzy checking for archive signature');

		$sigFound = $this->fuzzySignatureSearch([
			'JPA',
		], 3);

		if (!$sigFound)
		{
			debugMsg('Cannot find a valid archive signature in the first 128Kb of the first part file');

			$this->setError(AKText::sprintf('ERR_INVALID_ARCHIVE_LONG', 'jpa', 'j'));

			return false;
		}

		debugMsg(sprintf('File signature found, position %d', ftell($this->fp)));

		// Read the signature
		$sig = fread($this->fp, 3);

		if ($sig != 'JPA')
		{
			// Not a JPA file
			debugMsg('Invalid archive signature');
			$this->setError(AKText::sprintf('ERR_INVALID_ARCHIVE_LONG', 'jpa', 'j'));

			return false;
		}

		// Read and parse header length
		$header_length_array = unpack('v', fread($this->fp, 2));
		$header_length       = $header_length_array[1];

		// Read and parse the known portion of header data (14 bytes)
		$bin_data    = fread($this->fp, 14);
		$header_data = unpack('Cmajor/Cminor/Vcount/Vuncsize/Vcsize', $bin_data);

		// Temporary array with all the data we read
		$temp = [
			'signature'        => $sig,
			'length'           => $header_length,
			'major'            => $header_data['major'],
			'minor'            => $header_data['minor'],
			'filecount'        => $header_data['count'],
			'uncompressedsize' => $header_data['uncsize'],
			'compressedsize'   => $header_data['csize'],
			'unknowndata'      => '',
		];

		// Load additional header data
		$rest_length = $header_length - 19;
		$junk        = '';

		while ($rest_length > 8)
		{
			// Read the extra length signature and size
			$extraSig    = fread($this->fp, 4);
			$binData     = fread($this->fp, 2);
			$extraHeader = unpack('vlength', $binData);
			$length      = $extraHeader['length'] - 2;

			$rest_length -= 6 + $length;

			switch ($extraSig)
			{
				case "\x4A\x50\x01\x01":
					$moreBinData        = fread($this->fp, $length);
					$moreExtraHeader    = unpack('vtotalParts', $moreBinData);
					$temp['totalParts'] = $moreExtraHeader['totalParts'];
					break;

				case "\x4A\x50\x01\x02":
					$moreBinData              = fread($this->fp, $length);

					// Only decode on 64-bit versions of PHP
					if (PHP_INT_SIZE >= 8)
					{
						$moreExtraHeader          = unpack('Puncompressed/Pcompressed', $moreBinData);
						$header_data['uncsize']   = $moreExtraHeader['uncompressed'];
						$header_data['csize']     = $moreExtraHeader['compressed'];
						$temp['uncompressedsize'] = $moreExtraHeader['uncompressed'];
						$temp['compressedsize']   = $moreExtraHeader['compressed'];
					}

					break;

				default:
					$moreBinData = fread($this->fp, $length);
					$junk        .= $extraSig . $binData . $moreBinData;
					break;
			}
		}

		if ($rest_length > 0)
		{
			$junk .= fread($this->fp, $rest_length);
		}
		else
		{
			$junk .= '';
		}

		// Array-to-object conversion
		foreach ($temp as $key => $value)
		{
			$this->archiveHeaderData->{$key} = $value;
		}

		debugMsg('Header data:');
		debugMsg('Length              : ' . $header_length);
		debugMsg('Major               : ' . $header_data['major']);
		debugMsg('Minor               : ' . $header_data['minor']);
		debugMsg('File count          : ' . $header_data['count']);
		debugMsg('Uncompressed size   : ' . $header_data['uncsize']);
		debugMsg('Compressed size     : ' . $header_data['csize']);
		debugMsg('Total Parts         : ' . (isset($header_data['totalParts']) ? $header_data['totalParts'] : '1'));

		$this->currentPartOffset = @ftell($this->fp);

		$this->dataReadLength = 0;

		return true;
	}

	/**
	 * Concrete classes must use this method to read the file header
	 *
	 * @return bool True if reading the file was successful, false if an error occurred or we reached end of archive
	 */
	protected function readFileHeader()
	{
		// If the current part is over, proceed to the next part please
		if ($this->isEOF(true))
		{
			debugMsg('Archive part EOF; moving to next file');
			$this->nextFile();
		}

		$this->currentPartOffset = ftell($this->fp);

		debugMsg("Reading file signature; part {$this->currentPartNumber}, offset {$this->currentPartOffset}");
		// Get and decode Entity Description Block
		$signature = fread($this->fp, 3);

		$this->fileHeader            = new stdClass();
		$this->fileHeader->timestamp = 0;

		// Check signature
		if ($signature != 'JPF')
		{
			if ($this->isEOF(true))
			{
				// This file is finished; make sure it's the last one
				$gotNextFile = $this->nextFile();

				if (!$gotNextFile && $this->getState() !== 'postrun')
				{
					debugMsg(sprintf('Cannot open file %s for part #%d', $this->archiveList[$this->currentPartNumber] ?: '(unknown)', $this->currentPartNumber));

					$this->setError(AKText::sprintf(
						'INVALID_FILE_HEADER_OFFSET_ZERO',
						$this->archiveList[$this->currentPartNumber] ?: '(unknown)',
						$this->currentPartNumber,
						'jpa',
						'j'
					));

					return false;
				}

				if (!$this->isEOF(false))
				{
					debugMsg('Invalid file signature before end of archive encountered');
					$this->setError(AKText::sprintf(
						'INVALID_FILE_HEADER',
						$this->currentPartNumber,
						$this->currentPartOffset,
						'jpa',
						'j'
					));

					return false;
				}

				// We're just finished
				return false;
			}
			else
			{
				$screwed = true;

				if (AKFactory::get('kickstart.setup.ignoreerrors', false))
				{
					debugMsg('Invalid file block signature; launching heuristic file block signature scanner');
					$screwed = !$this->heuristicFileHeaderLocator();

					if (!$screwed)
					{
						$signature = 'JPF';
					}
					else
					{
						debugMsg('Heuristics failed. Brace yourself for the imminent crash.');
					}
				}

				if ($screwed)
				{
					// This is not a file block! The archive is corrupt.
					debugMsg('Invalid file block signature');

					if (count($this->archiveList) > 1)
					{
						$this->setError(AKText::sprintf(
							'INVALID_FILE_HEADER_MULTIPART',
							$this->currentPartNumber,
							$this->currentPartOffset,
							'jpa',
							'j'
						));

						return false;
					}

					$this->setError(AKText::sprintf('INVALID_FILE_HEADER', $this->currentPartNumber, $this->currentPartOffset));

					return false;
				}
			}
		}
		// This a JPA Entity Block. Process the header.

		$isBannedFile = false;

		// Read length of EDB and of the Entity Path Data
		$length_array = unpack('vblocksize/vpathsize', fread($this->fp, 4));
		// Read the path data
		if ($length_array['pathsize'] > 0)
		{
			$file = fread($this->fp, $length_array['pathsize']);
		}
		else
		{
			$file = '';
		}

		// Handle file renaming
		$isRenamed = false;
		if (is_array($this->renameFiles) && (count($this->renameFiles) > 0))
		{
			if (array_key_exists($file, $this->renameFiles))
			{
				$file      = $this->renameFiles[$file];
				$isRenamed = true;
			}
		}

		// Handle directory renaming
		$isDirRenamed = false;
		if (is_array($this->renameDirs) && (count($this->renameDirs) > 0))
		{
			if (array_key_exists(dirname($file), $this->renameDirs))
			{
				$file         = rtrim($this->renameDirs[dirname($file)], '/') . '/' . basename($file);
				$isRenamed    = true;
				$isDirRenamed = true;
			}
		}

		// Read and parse the known data portion
		$bin_data    = fread($this->fp, 14);
		$header_data = unpack('Ctype/Ccompression/Vcompsize/Vuncompsize/Vperms', $bin_data);
		// Read any unknown data
		$restBytes = $length_array['blocksize'] - (21 + $length_array['pathsize']);

		if ($restBytes > 0)
		{
			// Start reading the extra fields
			while ($restBytes >= 4)
			{
				$extra_header_data      = fread($this->fp, 4);
				$extra_header           = unpack('vsignature/vlength', $extra_header_data);
				$restBytes              -= 4;
				$extra_header['length'] -= 4;

				if ($extra_header['length'] > 0)
				{
					switch ($extra_header['signature'])
					{
						case 256:
							// File modified timestamp
							$bindata                     = fread($this->fp, $extra_header['length']);
							$restBytes                   -= $extra_header['length'];
							$timestamps                  = unpack('Vmodified', substr($bindata, 0, 4));
							$filectime                   = $timestamps['modified'];
							$this->fileHeader->timestamp = $filectime;
							break;

						case 512:
							$bindata                   = fread($this->fp, $extra_header['length']);
							$restBytes                 -= $extra_header['length'];

							// Only decode on 64-bit versions of PHP
							if (PHP_INT_SIZE >= 8)
							{
								$sizes                     = unpack('Pclen/Punclen', $bindata);
								$header_data['compsize']   = $sizes['clen'];
								$header_data['uncompsize'] = $sizes['unclen'];
							}
							break;

						default:
							// Unknown field
							$junk      = fread($this->fp, $extra_header['length']);
							$restBytes -= $extra_header['length'];
							break;
					}
				}

			}

			if ($restBytes > 0)
			{
				$junk = fread($this->fp, $restBytes);
			}
		}

		$compressionType = $header_data['compression'];

		// Populate the return array
		$this->fileHeader->file         = $file;
		$this->fileHeader->compressed   = $header_data['compsize'];
		$this->fileHeader->uncompressed = $header_data['uncompsize'];

		switch ($header_data['type'])
		{
			case 0:
				$this->fileHeader->type = 'dir';
				break;

			case 1:
				$this->fileHeader->type = 'file';
				break;

			case 2:
				$this->fileHeader->type = 'link';
				break;
		}

		switch ($compressionType)
		{
			case 0:
				$this->fileHeader->compression = 'none';
				break;
			case 1:
				$this->fileHeader->compression = 'gzip';
				break;
			case 2:
				$this->fileHeader->compression = 'bzip2';
				break;
		}

		$this->fileHeader->permissions = $header_data['perms'];

		// Find hard-coded banned files
		if ((basename($this->fileHeader->file) == ".") || (basename($this->fileHeader->file) == ".."))
		{
			$isBannedFile = true;
		}

		// Also try to find banned files passed in class configuration
		if ((count($this->skipFiles) > 0) && (!$isRenamed))
		{
			if (in_array($this->fileHeader->file, $this->skipFiles))
			{
				$isBannedFile = true;
			}
		}

		// If we have a banned file, let's skip it
		if ($isBannedFile)
		{
			debugMsg('Skipping file ' . $this->fileHeader->file);
			// Advance the file pointer, skipping exactly the size of the compressed data
			$seekleft = $this->fileHeader->compressed;
			while ($seekleft > 0)
			{
				// Ensure that we can seek past archive part boundaries
				$curSize = @filesize($this->archiveList[$this->currentPartNumber]);
				$curPos  = @ftell($this->fp);
				$canSeek = $curSize - $curPos;
				if ($canSeek > $seekleft)
				{
					$canSeek = $seekleft;
				}
				@fseek($this->fp, $canSeek, SEEK_CUR);
				$seekleft -= $canSeek;
				if ($seekleft)
				{
					$this->nextFile();
				}
			}

			$this->currentPartOffset = @ftell($this->fp);
			$this->runState          = AK_STATE_DONE;

			return true;
		}

		// Remove the removePath, if any
		$this->fileHeader->file = $this->removePath($this->fileHeader->file);

		// Last chance to prepend a path to the filename
		if (!empty($this->addPath) && !$isDirRenamed)
		{
			$this->fileHeader->file = $this->addPath . $this->fileHeader->file;
		}

		// Get the translated path name
		$restorePerms = AKFactory::get('kickstart.setup.restoreperms', false);

		if (!$this->mustSkip())
		{
			if ($this->fileHeader->type == 'file')
			{
				// Regular file; ask the postproc engine to process its filename
				if ($restorePerms)
				{
					$this->fileHeader->realFile =
						$this->postProcEngine->processFilename($this->fileHeader->file, $this->fileHeader->permissions);
				}
				else
				{
					$this->fileHeader->realFile = $this->postProcEngine->processFilename($this->fileHeader->file);
				}
			}
			elseif ($this->fileHeader->type == 'dir')
			{
				$dir = $this->fileHeader->file;

				// Directory; just create it
				if ($restorePerms)
				{
					$this->postProcEngine->createDirRecursive($dir, $this->fileHeader->permissions);
				}
				else
				{
					$this->postProcEngine->createDirRecursive($dir, 0755);
				}

				$this->postProcEngine->processFilename(null);
			}
			else
			{
				// Symlink; do not post-process
				$this->postProcEngine->processFilename(null);
			}

			$this->createDirectory();
		}

		// Header is read
		$this->runState = AK_STATE_HEADER;

		$this->dataReadLength = 0;

		return true;
	}

	protected function heuristicFileHeaderLocator()
	{
		$ret     = false;
		$fullEOF = false;

		while (!$ret && !$fullEOF)
		{
			$this->currentPartOffset = @ftell($this->fp);

			if ($this->isEOF(true))
			{
				$this->nextFile();
			}

			if ($this->isEOF(false))
			{
				$fullEOF = true;
				continue;
			}

			// Read 512Kb
			$chunk     = fread($this->fp, 524288);
			$size_read = mb_strlen($chunk, '8bit');
			//$pos = strpos($chunk, 'JPF');
			$pos = mb_strpos($chunk, 'JPF', 0, '8bit');

			if ($pos !== false)
			{
				// We found it!
				$this->currentPartOffset += $pos + 3;
				@fseek($this->fp, $this->currentPartOffset, SEEK_SET);
				$ret = true;
			}
			else
			{
				// Not yet found :(
				$this->currentPartOffset = @ftell($this->fp);
			}
		}

		return $ret;
	}

	/**
	 * Creates the directory this file points to
	 */
	protected function createDirectory()
	{
		if ($this->mustSkip())
		{
			return true;
		}

		// Do we need to create a directory?
		if (empty($this->fileHeader->realFile))
		{
			$this->fileHeader->realFile = $this->fileHeader->file;
		}

		$lastSlash = strrpos($this->fileHeader->realFile, '/');
		$dirName   = substr($this->fileHeader->realFile, 0, $lastSlash);
		$perms     = $this->flagRestorePermissions ? $this->fileHeader->permissions : 0755;
		$ignore    = AKFactory::get('kickstart.setup.ignoreerrors', false) || $this->isIgnoredDirectory($dirName);

		if (($this->postProcEngine->createDirRecursive($dirName, $perms) == false) && (!$ignore))
		{
			$this->setError(AKText::sprintf('COULDNT_CREATE_DIR', $dirName));

			return false;
		}
		else
		{
			return true;
		}
	}

	/**
	 * Concrete classes must use this method to process file data. It must set $runState to AK_STATE_DATAREAD when
	 * it's finished processing the file data.
	 *
	 * @return bool True if processing the file data was successful, false if an error occurred
	 */
	protected function processFileData()
	{
		switch ($this->fileHeader->type)
		{
			case 'dir':
				return $this->processTypeDir();
				break;

			case 'link':
				return $this->processTypeLink();
				break;

			case 'file':
				switch ($this->fileHeader->compression)
				{
					case 'none':
						return $this->processTypeFileUncompressed();
						break;

					case 'gzip':
					case 'bzip2':
						return $this->processTypeFileCompressedSimple();
						break;

				}
				break;

			default:
				debugMsg('Unknown file type ' . $this->fileHeader->type);
				break;
		}
	}

	/**
	 * Process the file data of a directory entry
	 *
	 * @return bool
	 */
	private function processTypeDir()
	{
		// Directory entries in the JPA do not have file data, therefore we're done processing the entry
		$this->runState = AK_STATE_DATAREAD;

		return true;
	}

	/**
	 * Process the file data of a link entry
	 *
	 * @return bool
	 */
	private function processTypeLink()
	{
		$readBytes   = 0;
		$toReadBytes = 0;
		$leftBytes   = $this->fileHeader->compressed;
		$data        = '';

		while ($leftBytes > 0)
		{
			$toReadBytes     = ($leftBytes > $this->chunkSize) ? $this->chunkSize : $leftBytes;
			$mydata          = $this->fread($this->fp, $toReadBytes);
			$reallyReadBytes = akstringlen($mydata);
			$data            .= $mydata;
			$leftBytes       -= $reallyReadBytes;

			if ($reallyReadBytes < $toReadBytes)
			{
				// We read less than requested! Why? Did we hit local EOF?
				if ($this->isEOF(true) && !$this->isEOF(false))
				{
					// Yeap. Let's go to the next file
					$this->nextFile();
				}
				else
				{
					debugMsg('End of local file before reading all data with no more parts left. The archive is corrupt or truncated.');
					// Nope. The archive is corrupt
					$this->setError(AKText::_('ERR_CORRUPT_ARCHIVE'));

					return false;
				}
			}
		}

		$filename = isset($this->fileHeader->realFile) ? $this->fileHeader->realFile : $this->fileHeader->file;

		if (!$this->mustSkip())
		{
			// Try to remove an existing file or directory by the same name
			if (file_exists($filename))
			{
				@unlink($filename);
				@rmdir($filename);
			}

			// Remove any trailing slash
			if (substr($filename, -1) == '/')
			{
				$filename = substr($filename, 0, -1);
			}
			// Create the symlink - only possible within PHP context. There's no support built in the FTP protocol, so no postproc use is possible here :(
			@symlink($data, $filename);
		}

		$this->runState = AK_STATE_DATAREAD;

		return true; // No matter if the link was created!
	}

	private function processTypeFileUncompressed()
	{
		// Uncompressed files are being processed in small chunks, to avoid timeouts
		if (($this->dataReadLength == 0) && !$this->mustSkip())
		{
			// Before processing file data, ensure permissions are adequate
			$this->setCorrectPermissions($this->fileHeader->file);
		}

		// Open the output file
		if (!$this->mustSkip())
		{
			$ignore =
				AKFactory::get('kickstart.setup.ignoreerrors', false) || $this->isIgnoredDirectory($this->fileHeader->file);

			if ($this->dataReadLength == 0)
			{
				$outfp = @fopen($this->fileHeader->realFile, 'w');
			}
			else
			{
				$outfp = @fopen($this->fileHeader->realFile, 'a');
			}

			// Can we write to the file?
			if (($outfp === false) && (!$ignore))
			{
				// An error occurred
				debugMsg('Could not write to output file');
				$this->setError(AKText::sprintf('COULDNT_WRITE_FILE', $this->fileHeader->realFile));

				return false;
			}
		}

		// Does the file have any data, at all?
		if ($this->fileHeader->compressed == 0)
		{
			// No file data!
			if (!$this->mustSkip() && is_resource($outfp))
			{
				@fclose($outfp);
			}

			$this->runState = AK_STATE_DATAREAD;

			return true;
		}

		// Reference to the global timer
		$timer = AKFactory::getTimer();

		$toReadBytes = 0;
		$leftBytes   = $this->fileHeader->compressed - $this->dataReadLength;

		// Loop while there's data to read and enough time to do it
		while (($leftBytes > 0) && ($timer->getTimeLeft() > 0))
		{
			$toReadBytes          = ($leftBytes > $this->chunkSize) ? $this->chunkSize : $leftBytes;
			$data                 = $this->fread($this->fp, $toReadBytes);
			$reallyReadBytes      = akstringlen($data);
			$leftBytes            -= $reallyReadBytes;
			$this->dataReadLength += $reallyReadBytes;

			if ($reallyReadBytes < $toReadBytes)
			{
				// We read less than requested! Why? Did we hit local EOF?
				if ($this->isEOF(true) && !$this->isEOF(false))
				{
					// Yeap. Let's go to the next file
					$this->nextFile();
				}
				else
				{
					// Nope. The archive is corrupt
					debugMsg('Not enough data in file. The archive is truncated or corrupt.');
					$this->setError(AKText::_('ERR_CORRUPT_ARCHIVE'));

					return false;
				}
			}

			if (!$this->mustSkip())
			{
				if (is_resource($outfp))
				{
					@fwrite($outfp, $data);
				}
			}
		}

		// Close the file pointer
		if (!$this->mustSkip())
		{
			if (is_resource($outfp))
			{
				@fclose($outfp);
			}
		}

		// Was this a pre-timeout bail out?
		if ($leftBytes > 0)
		{
			$this->runState = AK_STATE_DATA;
		}
		else
		{
			// Oh! We just finished!
			$this->runState       = AK_STATE_DATAREAD;
			$this->dataReadLength = 0;
		}

		return true;
	}

	private function processTypeFileCompressedSimple()
	{
		if (!$this->mustSkip())
		{
			// Before processing file data, ensure permissions are adequate
			$this->setCorrectPermissions($this->fileHeader->file);

			// Open the output file
			$outfp = @fopen($this->fileHeader->realFile, 'w');

			// Can we write to the file?
			$ignore =
				AKFactory::get('kickstart.setup.ignoreerrors', false) || $this->isIgnoredDirectory($this->fileHeader->file);

			if (($outfp === false) && (!$ignore))
			{
				// An error occurred
				debugMsg('Could not write to output file');
				$this->setError(AKText::sprintf('COULDNT_WRITE_FILE', $this->fileHeader->realFile));

				return false;
			}
		}

		// Does the file have any data, at all?
		if ($this->fileHeader->compressed == 0)
		{
			// No file data!
			if (!$this->mustSkip())
			{
				if (is_resource($outfp))
				{
					@fclose($outfp);
				}
			}
			$this->runState = AK_STATE_DATAREAD;

			return true;
		}

		// Simple compressed files are processed as a whole; we can't do chunk processing
		$zipData = $this->fread($this->fp, $this->fileHeader->compressed);
		while (akstringlen($zipData) < $this->fileHeader->compressed)
		{
			// End of local file before reading all data, but have more archive parts?
			if ($this->isEOF(true) && !$this->isEOF(false))
			{
				// Yeap. Read from the next file
				$this->nextFile();
				$bytes_left = $this->fileHeader->compressed - akstringlen($zipData);
				$zipData    .= $this->fread($this->fp, $bytes_left);
			}
			else
			{
				debugMsg('End of local file before reading all data with no more parts left. The archive is corrupt or truncated.');
				$this->setError(AKText::_('ERR_CORRUPT_ARCHIVE'));

				return false;
			}
		}

		if ($this->fileHeader->compression == 'gzip')
		{
			$unzipData = gzinflate($zipData);
		}
		elseif ($this->fileHeader->compression == 'bzip2')
		{
			$unzipData = bzdecompress($zipData);
		}
		unset($zipData);

		// Write to the file.
		if (!$this->mustSkip() && is_resource($outfp))
		{
			@fwrite($outfp, $unzipData, $this->fileHeader->uncompressed);
			@fclose($outfp);
		}
		unset($unzipData);

		$this->runState = AK_STATE_DATAREAD;

		return true;
	}
}

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * ZIP archive extraction class
 *
 * Since the file data portion of ZIP and JPA are similarly structured (it's empty for dirs,
 * linked node name for symlinks, dumped binary data for no compressions and dumped gzipped
 * binary data for gzip compression) we just have to subclass AKUnarchiverJPA and change the
 * header reading bits. Reusable code ;)
 */
class AKUnarchiverZIP extends AKUnarchiverJPA
{
	var $expectDataDescriptor = false;

	protected function readArchiveHeader()
	{
		debugMsg('Preparing to read archive header');
		// Initialize header data array
		$this->archiveHeaderData = new stdClass();

		// Open the first part
		debugMsg('Opening the first part');
		$this->nextFile();

		// Fail for unreadable files
		if ($this->fp === false)
		{
			debugMsg('The first part is not readable');

			return false;
		}

		// Fuzzy check for the start of archive.
		debugMsg('Fuzzy checking for archive signature');

		$sigFound = $this->fuzzySignatureSearch(array(
			pack('V', 0x08074b50), // Multi-part ZIP
			pack('V', 0x30304b50), // Multi-part ZIP (alternate)
			pack('V', 0x04034b50)  // Single file
		), 4);

		if (!$sigFound)
		{
			debugMsg('Cannot find a valid archive signature in the first 128Kb of the first part file');

			$this->setError(AKText::sprintf('ERR_INVALID_ARCHIVE_LONG', 'zip', 'z'));

			return false;
		}

		debugMsg(sprintf('File signature found, position %d', ftell($this->fp)));

		// Read a possible multipart signature
		$sigBinary  = fread($this->fp, 4);
		$headerData = unpack('Vsig', $sigBinary);

		// Roll back if it's not a multipart archive
		if ($headerData['sig'] == 0x04034b50)
		{
			debugMsg('The archive is not multipart');
			fseek($this->fp, -4, SEEK_CUR);
		}
		else
		{
			debugMsg('The archive is multipart');
		}

		$multiPartSigs = array(
			0x08074b50, // Multi-part ZIP
			0x30304b50, // Multi-part ZIP (alternate)
			0x04034b50  // Single file
		);
		if (!in_array($headerData['sig'], $multiPartSigs))
		{
			debugMsg('Invalid header signature ' . dechex($headerData['sig']));
			$this->setError(AKText::sprintf('ERR_INVALID_ARCHIVE_LONG', 'zip', 'z'));

			return false;
		}

		$this->currentPartOffset = @ftell($this->fp);
		debugMsg('Current part offset after reading header: ' . $this->currentPartOffset);

		$this->dataReadLength = 0;

		return true;
	}

	/**
	 * Concrete classes must use this method to read the file header
	 *
	 * @return bool True if reading the file was successful, false if an error occurred or we reached end of archive
	 */
	protected function readFileHeader()
	{
		// If the current part is over, proceed to the next part please
		if ($this->isEOF(true))
		{
			debugMsg('Opening next archive part');
			$gotNextFile = $this->nextFile();
		}

		$this->currentPartOffset = ftell($this->fp);

		if ($this->expectDataDescriptor)
		{
			// The last file had bit 3 of the general purpose bit flag set. This means that we have a
			// 12 byte data descriptor we need to skip. To make things worse, there might also be a 4
			// byte optional data descriptor header (0x08074b50).
			$junk = @fread($this->fp, 4);
			$junk = unpack('Vsig', $junk);
			if ($junk['sig'] == 0x08074b50)
			{
				// Yes, there was a signature
				$junk = @fread($this->fp, 12);
				debugMsg('Data descriptor (w/ header) skipped at ' . (ftell($this->fp) - 12));
			}
			else
			{
				// No, there was no signature, just read another 8 bytes
				$junk = @fread($this->fp, 8);
				debugMsg('Data descriptor (w/out header) skipped at ' . (ftell($this->fp) - 8));
			}

			// And check for EOF, too
			if ($this->isEOF(true))
			{
				debugMsg('EOF before reading header');

				$gotNextFile = $this->nextFile();
			}
		}

		// Get and decode Local File Header
		$headerBinary = fread($this->fp, 30);
		$headerData   =
			unpack('Vsig/C2ver/vbitflag/vcompmethod/vlastmodtime/vlastmoddate/Vcrc/Vcompsize/Vuncomp/vfnamelen/veflen', $headerBinary);

		// Check signature
		if (!($headerData['sig'] == 0x04034b50))
		{
			debugMsg('Not a file signature at ' . (ftell($this->fp) - 4));

			// The signature is not the one used for files. Is this a central directory record (i.e. we're done)?
			if ($headerData['sig'] == 0x02014b50)
			{
				debugMsg('EOCD signature at ' . (ftell($this->fp) - 4));
				// End of ZIP file detected. We'll just skip to the end of file...
				while ($this->nextFile())
				{
				};
				@fseek($this->fp, 0, SEEK_END); // Go to EOF
				return false;
			}
			else
			{
				if (isset($gotNextFile) && !$gotNextFile && $this->getState() !== 'postrun')
				{
					debugMsg(sprintf('Cannot open file %s for part #%d', $this->archiveList[$this->currentPartNumber] ?: '(unknown)', $this->currentPartNumber));

					$this->setError(AKText::sprintf(
						'INVALID_FILE_HEADER_OFFSET_ZERO',
						$this->archiveList[$this->currentPartNumber] ?: '(unknown)',
						$this->currentPartNumber,
						'zip',
						'z'
					));

					return false;
				}

				if ($this->currentPartOffset === 0 && $this->currentPartNumber > 0)
				{
					$this->setError(AKText::sprintf(
						'INVALID_FILE_HEADER_MULTIPART',
						$this->currentPartNumber,
						$this->currentPartOffset,
						'jpa',
						'j'
					));

					return false;
				}

				debugMsg('Invalid signature ' . dechex($headerData['sig']) . ' at ' . ftell($this->fp));

				if (count($this->archiveList) > 1)
				{
					$this->setError(AKText::sprintf(
						'INVALID_FILE_HEADER_MULTIPART',
						$this->currentPartNumber,
						$this->currentPartOffset,
						'zip',
						'z'
					));

					return false;
				}

				$this->setError(AKText::sprintf(
					'INVALID_FILE_HEADER',
					$this->currentPartNumber,
					$this->currentPartOffset,
					'zip',
					'z'
				));

				return false;
			}
		}

		// If bit 3 of the bitflag is set, expectDataDescriptor is true
		$this->expectDataDescriptor = ($headerData['bitflag'] & 4) == 4;

		$this->fileHeader            = new stdClass();
		$this->fileHeader->timestamp = 0;

		// Read the last modified data and time
		$lastmodtime = $headerData['lastmodtime'];
		$lastmoddate = $headerData['lastmoddate'];

		if ($lastmoddate && $lastmodtime)
		{
			// ----- Extract time
			$v_hour    = ($lastmodtime & 0xF800) >> 11;
			$v_minute  = ($lastmodtime & 0x07E0) >> 5;
			$v_seconde = ($lastmodtime & 0x001F) * 2;

			// ----- Extract date
			$v_year  = (($lastmoddate & 0xFE00) >> 9) + 1980;
			$v_month = ($lastmoddate & 0x01E0) >> 5;
			$v_day   = $lastmoddate & 0x001F;

			// ----- Get UNIX date format
			$this->fileHeader->timestamp = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);
		}

		$isBannedFile = false;

		$this->fileHeader->compressed   = $headerData['compsize'];
		$this->fileHeader->uncompressed = $headerData['uncomp'];
		$nameFieldLength                = $headerData['fnamelen'];
		$extraFieldLength               = $headerData['eflen'];

		// Read filename field
		$this->fileHeader->file = fread($this->fp, $nameFieldLength);

		// Handle file renaming
		$isRenamed = false;
		if (is_array($this->renameFiles) && (count($this->renameFiles) > 0))
		{
			if (array_key_exists($this->fileHeader->file, $this->renameFiles))
			{
				$this->fileHeader->file = $this->renameFiles[$this->fileHeader->file];
				$isRenamed              = true;
			}
		}

		// Handle directory renaming
		$isDirRenamed = false;
		if (is_array($this->renameDirs) && (count($this->renameDirs) > 0))
		{
			if (array_key_exists(dirname($this->fileHeader->file), $this->renameDirs))
			{
				$file         =
					rtrim($this->renameDirs[dirname($this->fileHeader->file)], '/') . '/' . basename($this->fileHeader->file);
				$isRenamed    = true;
				$isDirRenamed = true;
			}
		}

		// Read extra field if present
		if ($extraFieldLength > 0)
		{
			$extrafield = fread($this->fp, $extraFieldLength);
		}

		debugMsg('*' . ftell($this->fp) . ' IS START OF ' . $this->fileHeader->file . ' (' . $this->fileHeader->compressed . ' bytes)');


		// Decide filetype -- Check for directories
		$this->fileHeader->type = 'file';
		if (strrpos($this->fileHeader->file, '/') == strlen($this->fileHeader->file) - 1)
		{
			$this->fileHeader->type = 'dir';
		}
		// Decide filetype -- Check for symbolic links
		if (($headerData['ver1'] == 10) && ($headerData['ver2'] == 3))
		{
			$this->fileHeader->type = 'link';
		}

		switch ($headerData['compmethod'])
		{
			case 0:
				$this->fileHeader->compression = 'none';
				break;
			case 8:
				$this->fileHeader->compression = 'gzip';
				break;
		}

		// Find hard-coded banned files
		if ((basename($this->fileHeader->file) == ".") || (basename($this->fileHeader->file) == ".."))
		{
			$isBannedFile = true;
		}

		// Also try to find banned files passed in class configuration
		if ((count($this->skipFiles) > 0) && (!$isRenamed))
		{
			if (in_array($this->fileHeader->file, $this->skipFiles))
			{
				$isBannedFile = true;
			}
		}

		// If we have a banned file, let's skip it
		if ($isBannedFile)
		{
			// Advance the file pointer, skipping exactly the size of the compressed data
			$seekleft = $this->fileHeader->compressed;
			while ($seekleft > 0)
			{
				// Ensure that we can seek past archive part boundaries
				$curSize = @filesize($this->archiveList[$this->currentPartNumber]);
				$curPos  = @ftell($this->fp);
				$canSeek = $curSize - $curPos;
				if ($canSeek > $seekleft)
				{
					$canSeek = $seekleft;
				}
				@fseek($this->fp, $canSeek, SEEK_CUR);
				$seekleft -= $canSeek;
				if ($seekleft)
				{
					$this->nextFile();
				}
			}

			$this->currentPartOffset = @ftell($this->fp);
			$this->runState          = AK_STATE_DONE;

			return true;
		}

		// Remove the removePath, if any
		$this->fileHeader->file = $this->removePath($this->fileHeader->file);

		// Last chance to prepend a path to the filename
		if (!empty($this->addPath) && !$isDirRenamed)
		{
			$this->fileHeader->file = $this->addPath . $this->fileHeader->file;
		}

		// Get the translated path name
		if (!$this->mustSkip())
		{
			if ($this->fileHeader->type == 'file')
			{
				$this->fileHeader->realFile = $this->postProcEngine->processFilename($this->fileHeader->file);
			}
			elseif ($this->fileHeader->type == 'dir')
			{
				$this->fileHeader->timestamp = 0;

				$dir = $this->fileHeader->file;

				$this->postProcEngine->createDirRecursive($dir, 0755);
				$this->postProcEngine->processFilename(null);
			}
			else
			{
				// Symlink; do not post-process
				$this->fileHeader->timestamp = 0;
				$this->postProcEngine->processFilename(null);
			}

			$this->createDirectory();
		}

		// Header is read
		$this->runState = AK_STATE_HEADER;

		return true;
	}

}

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * JPS archive extraction class
 */
class AKUnarchiverJPS extends AKUnarchiverJPA
{
	/**
	 * Header data for the archive
	 *
	 * @var   array
	 */
	protected $archiveHeaderData = array();

	/**
	 * Plaintext password from which the encryption key will be derived with PBKDF2
	 *
	 * @var   string
	 */
	protected $password = '';

	/**
	 * Which hash algorithm should I use for key derivation with PBKDF2.
	 *
	 * @var   string
	 */
	private $pbkdf2Algorithm = 'sha1';

	/**
	 * How many iterations should I use for key derivation with PBKDF2
	 *
	 * @var   int
	 */
	private $pbkdf2Iterations = 1000;

	/**
	 * Should I use a static salt for key derivation with PBKDF2?
	 *
	 * @var   bool
	 */
	private $pbkdf2UseStaticSalt = 0;

	/**
	 * Static salt for key derivation with PBKDF2
	 *
	 * @var   string
	 */
	private $pbkdf2StaticSalt = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";

	/**
	 * How much compressed data I have read since the last file header read
	 *
	 * @var   int
	 */
	private $compressedSizeReadSinceLastFileHeader = 0;

	public function __construct()
	{
		$this->password = AKFactory::get('kickstart.jps.password', '');
	}

	public function __wakeup()
	{
		parent::__wakeup();

		// Make sure the decryption is all set up (required!)
		AKEncryptionAES::setPbkdf2Algorithm($this->pbkdf2Algorithm);
		AKEncryptionAES::setPbkdf2Iterations($this->pbkdf2Iterations);
		AKEncryptionAES::setPbkdf2UseStaticSalt($this->pbkdf2UseStaticSalt);
		AKEncryptionAES::setPbkdf2StaticSalt($this->pbkdf2StaticSalt);
	}


	protected function readArchiveHeader()
	{
		// Initialize header data array
		$this->archiveHeaderData = new stdClass();

		// Open the first part
		$this->nextFile();

		// Fail for unreadable files
		if ($this->fp === false)
		{
			return false;
		}

		// Fuzzy check for the start of archive.
		debugMsg('Fuzzy checking for archive signature');

		$sigFound = $this->fuzzySignatureSearch(array(
			'JPS'
		), 3);

		if (!$sigFound)
		{
			debugMsg('Cannot find a valid archive signature in the first 128Kb of the first part file');

			$this->setError(AKText::sprintf('ERR_INVALID_ARCHIVE_LONG', 'jps', 'j'));

			return false;
		}

		debugMsg(sprintf('File signature found, position %d', ftell($this->fp)));

		// Read the signature
		$sig = fread($this->fp, 3);

		if ($sig != 'JPS')
		{
			// Not a JPS file
			$this->setError(AKText::sprintf('ERR_INVALID_ARCHIVE_LONG', 'jps', 'j'));

			return false;
		}

		// Read and parse the known portion of header data (5 bytes)
		$bin_data    = fread($this->fp, 5);
		$header_data = unpack('Cmajor/Cminor/cspanned/vextra', $bin_data);

		// Is this a v2 archive?
		$versionHumanReadable = $header_data['major'] . '.' . $header_data['minor'];
		$isV2Archive = version_compare($versionHumanReadable, '2.0', 'ge');

		// Load any remaining header data
		$rest_length = $header_data['extra'];

		if ($isV2Archive && $rest_length)
		{
			// V2 archives only have one kind of extra header
			if (!$this->readKeyExpansionExtraHeader())
			{
				return false;
			}
		}
		elseif ($rest_length > 0)
		{
			$junk = fread($this->fp, $rest_length);
		}

		// Temporary array with all the data we read
		$temp = array(
			'signature' => $sig,
			'major'     => $header_data['major'],
			'minor'     => $header_data['minor'],
			'spanned'   => $header_data['spanned']
		);
		// Array-to-object conversion
		foreach ($temp as $key => $value)
		{
			$this->archiveHeaderData->{$key} = $value;
		}

		$this->currentPartOffset = @ftell($this->fp);

		$this->dataReadLength = 0;

		return true;
	}

	/**
	 * Concrete classes must use this method to read the file header
	 *
	 * @return bool True if reading the file was successful, false if an error occurred or we reached end of archive
	 */
	protected function readFileHeader()
	{
		// If the current part is over, proceed to the next part please
		if ($this->isEOF(true))
		{
			$this->nextFile();
		}

		$this->currentPartOffset = ftell($this->fp);

		// Get and decode Entity Description Block
		$signature = fread($this->fp, 3);

		// Check for end-of-archive siganture
		if ($signature == 'JPE')
		{
			$this->setState('postrun');

			return true;
		}

		$this->fileHeader            = new stdClass();
		$this->fileHeader->timestamp = 0;

		// Check signature
		if ($signature != 'JPF')
		{
			if ($this->isEOF(true))
			{
				// This file is finished; make sure it's the last one
				$gotNextFile = $this->nextFile();

				if (!$gotNextFile && $this->getState() !== 'postrun')
				{
					debugMsg(sprintf('Cannot open file %s for part #%d', $this->archiveList[$this->currentPartNumber] ?: '(unknown)', $this->currentPartNumber));

					$this->setError(AKText::sprintf(
						'INVALID_FILE_HEADER_OFFSET_ZERO',
						$this->archiveList[$this->currentPartNumber] ?: '(unknown)',
						$this->currentPartNumber,
						'jps',
						'j'
					));

					return false;
				}

				if (!$this->isEOF(false))
				{
					$this->setError(AKText::sprintf('INVALID_FILE_HEADER', $this->currentPartNumber, $this->currentPartOffset));

					return false;
				}

				// We're just finished
				return false;
			}
			else
			{
				fseek($this->fp, -6, SEEK_CUR);
				$signature = fread($this->fp, 3);
				if ($signature == 'JPE')
				{
					return false;
				}

				if (count($this->archiveList) > 1)
				{
					$this->setError(AKText::sprintf(
						'INVALID_FILE_HEADER_MULTIPART',
						$this->currentPartNumber,
						$this->currentPartOffset,
						'jps',
						'j'
					));

					return false;
				}

				$this->setError(AKText::sprintf(
					'INVALID_FILE_HEADER',
					$this->currentPartNumber,
					$this->currentPartOffset,
					'jps',
					'j'
				));

				return false;
			}
		}

		// This a JPS Entity Block. Process the header.

		$isBannedFile = false;

		// Make sure the decryption is all set up
		AKEncryptionAES::setPbkdf2Algorithm($this->pbkdf2Algorithm);
		AKEncryptionAES::setPbkdf2Iterations($this->pbkdf2Iterations);
		AKEncryptionAES::setPbkdf2UseStaticSalt($this->pbkdf2UseStaticSalt);
		AKEncryptionAES::setPbkdf2StaticSalt($this->pbkdf2StaticSalt);

		// Read and decrypt the header
		$edbhData = fread($this->fp, 4);
		$edbh     = unpack('vencsize/vdecsize', $edbhData);
		$bin_data = fread($this->fp, $edbh['encsize']);

		// Add the header length to the data read
		$this->compressedSizeReadSinceLastFileHeader += $edbh['encsize'] + 4;

		// Decrypt and truncate
		$bin_data = AKEncryptionAES::AESDecryptCBC($bin_data, $this->password);
		$bin_data = substr($bin_data, 0, $edbh['decsize']);

		// Read length of EDB and of the Entity Path Data
		$length_array = unpack('vpathsize', substr($bin_data, 0, 2));
		// Read the path data
		$file = substr($bin_data, 2, $length_array['pathsize']);

		// Handle file renaming
		$isRenamed = false;
		if (is_array($this->renameFiles) && (count($this->renameFiles) > 0))
		{
			if (array_key_exists($file, $this->renameFiles))
			{
				$file      = $this->renameFiles[$file];
				$isRenamed = true;
			}
		}

		// Handle directory renaming
		$isDirRenamed = false;
		if (is_array($this->renameDirs) && (count($this->renameDirs) > 0))
		{
			if (array_key_exists(dirname($file), $this->renameDirs))
			{
				$file         = rtrim($this->renameDirs[dirname($file)], '/') . '/' . basename($file);
				$isRenamed    = true;
				$isDirRenamed = true;
			}
		}

		// Read and parse the known data portion
		$bin_data    = substr($bin_data, 2 + $length_array['pathsize']);
		$header_data = unpack('Ctype/Ccompression/Vuncompsize/Vperms/Vfilectime', $bin_data);

		$this->fileHeader->timestamp = $header_data['filectime'];
		$compressionType             = $header_data['compression'];

		// Populate the return array
		$this->fileHeader->file         = $file;
		$this->fileHeader->uncompressed = $header_data['uncompsize'];
		switch ($header_data['type'])
		{
			case 0:
				$this->fileHeader->type = 'dir';
				break;

			case 1:
				$this->fileHeader->type = 'file';
				break;

			case 2:
				$this->fileHeader->type = 'link';
				break;
		}
		switch ($compressionType)
		{
			case 0:
				$this->fileHeader->compression = 'none';
				break;
			case 1:
				$this->fileHeader->compression = 'gzip';
				break;
			case 2:
				$this->fileHeader->compression = 'bzip2';
				break;
		}
		$this->fileHeader->permissions = $header_data['perms'];

		// Find hard-coded banned files
		if ((basename($this->fileHeader->file) == ".") || (basename($this->fileHeader->file) == ".."))
		{
			$isBannedFile = true;
		}

		// Also try to find banned files passed in class configuration
		if ((count($this->skipFiles) > 0) && (!$isRenamed))
		{
			if (in_array($this->fileHeader->file, $this->skipFiles))
			{
				$isBannedFile = true;
			}
		}

		// If we have a banned file, let's skip it
		if ($isBannedFile)
		{
			$done = false;
			while (!$done)
			{
				// Read the Data Chunk Block header
				$binMiniHead = fread($this->fp, 8);
				if (in_array(substr($binMiniHead, 0, 3), array('JPF', 'JPE')))
				{
					// Not a Data Chunk Block header, I am done skipping the file
					@fseek($this->fp, -8, SEEK_CUR); // Roll back the file pointer
					$done = true; // Mark as done
					continue; // Exit loop
				}
				else
				{
					// Skip forward by the amount of compressed data
					$miniHead = unpack('Vencsize/Vdecsize', $binMiniHead);
					@fseek($this->fp, $miniHead['encsize'], SEEK_CUR);
					$this->compressedSizeReadSinceLastFileHeader += 8 + $miniHead['encsize'];
				}
			}

			$this->currentPartOffset                     = @ftell($this->fp);
			$this->runState                              = AK_STATE_DONE;
			$this->fileHeader->compressed                = $this->compressedSizeReadSinceLastFileHeader;
			$this->compressedSizeReadSinceLastFileHeader = 0;

			return true;
		}

		// Remove the removePath, if any
		$this->fileHeader->file = $this->removePath($this->fileHeader->file);

		// Last chance to prepend a path to the filename
		if (!empty($this->addPath) && !$isDirRenamed)
		{
			$this->fileHeader->file = $this->addPath . $this->fileHeader->file;
		}

		// Get the translated path name
		$restorePerms = AKFactory::get('kickstart.setup.restoreperms', false);

		if (!$this->mustSkip())
		{
			if ($this->fileHeader->type == 'file')
			{
				// Regular file; ask the postproc engine to process its filename
				if ($restorePerms)
				{
					$this->fileHeader->realFile =
						$this->postProcEngine->processFilename($this->fileHeader->file, $this->fileHeader->permissions);
				}
				else
				{
					$this->fileHeader->realFile = $this->postProcEngine->processFilename($this->fileHeader->file);
				}
			}
			elseif ($this->fileHeader->type == 'dir')
			{
				$dir                        = $this->fileHeader->file;
				$this->fileHeader->realFile = $dir;

				// Directory; just create it
				if ($restorePerms)
				{
					$this->postProcEngine->createDirRecursive($this->fileHeader->file, $this->fileHeader->permissions);
				}
				else
				{
					$this->postProcEngine->createDirRecursive($this->fileHeader->file, 0755);
				}

				$this->postProcEngine->processFilename(null);
			}
			else
			{
				// Symlink; do not post-process
				$this->postProcEngine->processFilename(null);
			}

			$this->createDirectory();
		}


		$this->fileHeader->compressed                = $this->compressedSizeReadSinceLastFileHeader;
		$this->compressedSizeReadSinceLastFileHeader = 0;

		// Header is read
		$this->runState = AK_STATE_HEADER;

		$this->dataReadLength = 0;

		return true;
	}

	/**
	 * Creates the directory this file points to
	 */
	protected function createDirectory()
	{
		if ($this->mustSkip())
		{
			return true;
		}

		// Do we need to create a directory?
		$lastSlash = strrpos($this->fileHeader->realFile, '/');
		$dirName   = substr($this->fileHeader->realFile, 0, $lastSlash);
		$perms     = 0755;
		$ignore    = AKFactory::get('kickstart.setup.ignoreerrors', false) || $this->isIgnoredDirectory($dirName);

		if (($this->postProcEngine->createDirRecursive($dirName, $perms) == false) && (!$ignore))
		{
			$this->setError(AKText::sprintf('COULDNT_CREATE_DIR', $dirName));

			return false;
		}

		return true;
	}

	/**
	 * Concrete classes must use this method to process file data. It must set $runState to AK_STATE_DATAREAD when
	 * it's finished processing the file data.
	 *
	 * @return bool True if processing the file data was successful, false if an error occurred
	 */
	protected function processFileData()
	{
		switch ($this->fileHeader->type)
		{
			case 'dir':
				return $this->processTypeDir();
				break;

			case 'link':
				return $this->processTypeLink();
				break;

			case 'file':
				switch ($this->fileHeader->compression)
				{
					case 'none':
						return $this->processTypeFileUncompressed();
						break;

					case 'gzip':
					case 'bzip2':
						return $this->processTypeFileCompressedSimple();
						break;

				}
				break;
		}
	}

	/**
	 * Process the file data of a directory entry
	 *
	 * @return bool
	 */
	private function processTypeDir()
	{
		// Directory entries in the JPA do not have file data, therefore we're done processing the entry
		$this->runState = AK_STATE_DATAREAD;

		return true;
	}

	/**
	 * Process the file data of a link entry
	 *
	 * @return bool
	 */
	private function processTypeLink()
	{

		// Does the file have any data, at all?
		if ($this->fileHeader->uncompressed == 0)
		{
			// No file data!
			$this->runState = AK_STATE_DATAREAD;

			return true;
		}

		// Read the mini header
		$binMiniHeader   = fread($this->fp, 8);
		$reallyReadBytes = akstringlen($binMiniHeader);

		if ($reallyReadBytes < 8)
		{
			// We read less than requested! Why? Did we hit local EOF?
			if ($this->isEOF(true) && !$this->isEOF(false))
			{
				// Yeap. Let's go to the next file
				$this->nextFile();
				// Retry reading the header
				$binMiniHeader   = fread($this->fp, 8);
				$reallyReadBytes = akstringlen($binMiniHeader);
				// Still not enough data? If so, the archive is corrupt or missing parts.
				if ($reallyReadBytes < 8)
				{
					$this->setError(AKText::_('ERR_CORRUPT_ARCHIVE'));

					return false;
				}
			}
			else
			{
				// Nope. The archive is corrupt
				$this->setError(AKText::_('ERR_CORRUPT_ARCHIVE'));

				return false;
			}
		}

		// Read the encrypted data
		$miniHeader      = unpack('Vencsize/Vdecsize', $binMiniHeader);
		$toReadBytes     = $miniHeader['encsize'];
		$data            = $this->fread($this->fp, $toReadBytes);
		$reallyReadBytes = akstringlen($data);
		$this->compressedSizeReadSinceLastFileHeader += 8 + $miniHeader['encsize'];

		if ($reallyReadBytes < $toReadBytes)
		{
			// We read less than requested! Why? Did we hit local EOF?
			if ($this->isEOF(true) && !$this->isEOF(false))
			{
				// Yeap. Let's go to the next file
				$this->nextFile();
				// Read the rest of the data
				$toReadBytes -= $reallyReadBytes;
				$restData        = $this->fread($this->fp, $toReadBytes);
				$reallyReadBytes = akstringlen($data);
				if ($reallyReadBytes < $toReadBytes)
				{
					$this->setError(AKText::_('ERR_CORRUPT_ARCHIVE'));

					return false;
				}
				$data .= $restData;
			}
			else
			{
				// Nope. The archive is corrupt
				$this->setError(AKText::_('ERR_CORRUPT_ARCHIVE'));

				return false;
			}
		}

		// Decrypt the data
		$data = AKEncryptionAES::AESDecryptCBC($data, $this->password);

		// Is the length of the decrypted data less than expected?
		$data_length = akstringlen($data);
		if ($data_length < $miniHeader['decsize'])
		{
			$this->setError(AKText::_('ERR_INVALID_JPS_PASSWORD'));

			return false;
		}

		// Trim the data
		$data = substr($data, 0, $miniHeader['decsize']);

		if (!$this->mustSkip())
		{
			// Try to remove an existing file or directory by the same name
			if (file_exists($this->fileHeader->file))
			{
				@unlink($this->fileHeader->file);
				@rmdir($this->fileHeader->file);
			}
			// Remove any trailing slash
			if (substr($this->fileHeader->file, -1) == '/')
			{
				$this->fileHeader->file = substr($this->fileHeader->file, 0, -1);
			}
			// Create the symlink - only possible within PHP context. There's no support built in the FTP protocol, so no postproc use is possible here :(
			@symlink($data, $this->fileHeader->file);
		}

		$this->runState = AK_STATE_DATAREAD;

		return true; // No matter if the link was created!
	}

	private function processTypeFileUncompressed()
	{
		// Uncompressed files are being processed in small chunks, to avoid timeouts
		if (($this->dataReadLength == 0) && !$this->mustSkip())
		{
			// Before processing file data, ensure permissions are adequate
			$this->setCorrectPermissions($this->fileHeader->file);
		}

		// Open the output file
		if (!$this->mustSkip())
		{
			$ignore =
				AKFactory::get('kickstart.setup.ignoreerrors', false) || $this->isIgnoredDirectory($this->fileHeader->file);
			if ($this->dataReadLength == 0)
			{
				$outfp = @fopen($this->fileHeader->realFile, 'w');
			}
			else
			{
				$outfp = @fopen($this->fileHeader->realFile, 'a');
			}

			// Can we write to the file?
			if (($outfp === false) && (!$ignore))
			{
				// An error occurred
				$this->setError(AKText::sprintf('COULDNT_WRITE_FILE', $this->fileHeader->realFile));

				return false;
			}
		}

		// Does the file have any data, at all?
		if ($this->fileHeader->uncompressed == 0)
		{
			// No file data!
			if (!$this->mustSkip() && is_resource($outfp))
			{
				@fclose($outfp);
			}
			$this->runState = AK_STATE_DATAREAD;

			return true;
		}

		$this->setError('An uncompressed file was detected; this is not supported by this archive extraction utility');

		return false;
	}

	private function processTypeFileCompressedSimple()
	{
		$timer = AKFactory::getTimer();

		// Files are being processed in small chunks, to avoid timeouts
		if (($this->dataReadLength == 0) && !$this->mustSkip())
		{
			// Before processing file data, ensure permissions are adequate
			$this->setCorrectPermissions($this->fileHeader->file);
		}

		// Open the output file
		if (!$this->mustSkip())
		{
			// Open the output file
			$outfp = @fopen($this->fileHeader->realFile, 'w');

			// Can we write to the file?
			$ignore =
				AKFactory::get('kickstart.setup.ignoreerrors', false) || $this->isIgnoredDirectory($this->fileHeader->file);
			if (($outfp === false) && (!$ignore))
			{
				// An error occurred
				$this->setError(AKText::sprintf('COULDNT_WRITE_FILE', $this->fileHeader->realFile));

				return false;
			}
		}

		// Does the file have any data, at all?
		if ($this->fileHeader->uncompressed == 0)
		{
			// No file data!
			if (!$this->mustSkip())
			{
				if (is_resource($outfp))
				{
					@fclose($outfp);
				}
			}
			$this->runState = AK_STATE_DATAREAD;

			return true;
		}

		$leftBytes = $this->fileHeader->uncompressed - $this->dataReadLength;

		// Loop while there's data to write and enough time to do it
		while (($leftBytes > 0) && ($timer->getTimeLeft() > 0))
		{
			// Read the mini header
			$binMiniHeader   = fread($this->fp, 8);
			$reallyReadBytes = akstringlen($binMiniHeader);
			if ($reallyReadBytes < 8)
			{
				// We read less than requested! Why? Did we hit local EOF?
				if ($this->isEOF(true) && !$this->isEOF(false))
				{
					// Yeap. Let's go to the next file
					$this->nextFile();
					// Retry reading the header
					$binMiniHeader   = fread($this->fp, 8);
					$reallyReadBytes = akstringlen($binMiniHeader);
					// Still not enough data? If so, the archive is corrupt or missing parts.
					if ($reallyReadBytes < 8)
					{
						$this->setError(AKText::_('ERR_CORRUPT_ARCHIVE'));

						return false;
					}
				}
				else
				{
					// Nope. The archive is corrupt
					$this->setError(AKText::_('ERR_CORRUPT_ARCHIVE'));

					return false;
				}
			}

			// Read the encrypted data
			$miniHeader      = unpack('Vencsize/Vdecsize', $binMiniHeader);
			$toReadBytes     = $miniHeader['encsize'];
			$data            = $this->fread($this->fp, $toReadBytes);
			$reallyReadBytes = akstringlen($data);

			$this->compressedSizeReadSinceLastFileHeader += $miniHeader['encsize'] + 8;

			if ($reallyReadBytes < $toReadBytes)
			{
				// We read less than requested! Why? Did we hit local EOF?
				if ($this->isEOF(true) && !$this->isEOF(false))
				{
					// Yeap. Let's go to the next file
					$this->nextFile();
					// Read the rest of the data
					$toReadBytes -= $reallyReadBytes;
					$restData        = $this->fread($this->fp, $toReadBytes);
					$reallyReadBytes = akstringlen($restData);
					if ($reallyReadBytes < $toReadBytes)
					{
						$this->setError(AKText::_('ERR_CORRUPT_ARCHIVE'));

						return false;
					}
					if (akstringlen($data) == 0)
					{
						$data = $restData;
					}
					else
					{
						$data .= $restData;
					}
				}
				else
				{
					// Nope. The archive is corrupt
					$this->setError(AKText::_('ERR_CORRUPT_ARCHIVE'));

					return false;
				}
			}

			// Decrypt the data
			$data = AKEncryptionAES::AESDecryptCBC($data, $this->password);

			// Is the length of the decrypted data less than expected?
			$data_length = akstringlen($data);
			if ($data_length < $miniHeader['decsize'])
			{
				$this->setError(AKText::_('ERR_INVALID_JPS_PASSWORD'));

				return false;
			}

			// Trim the data
			$data = substr($data, 0, $miniHeader['decsize']);

			// Decompress
			$data    = gzinflate($data);
			$unc_len = akstringlen($data);

			// Write the decrypted data
			if (!$this->mustSkip())
			{
				if (is_resource($outfp))
				{
					@fwrite($outfp, $data, akstringlen($data));
				}
			}

			// Update the read length
			$this->dataReadLength += $unc_len;
			$leftBytes = $this->fileHeader->uncompressed - $this->dataReadLength;
		}

		// Close the file pointer
		if (!$this->mustSkip())
		{
			if (is_resource($outfp))
			{
				@fclose($outfp);
			}
		}

		// Was this a pre-timeout bail out?
		if ($leftBytes > 0)
		{
			$this->runState = AK_STATE_DATA;
		}
		else
		{
			// Oh! We just finished!
			$this->runState       = AK_STATE_DATAREAD;
			$this->dataReadLength = 0;
		}

		return true;
	}

	private function readKeyExpansionExtraHeader()
	{
		$signature = fread($this->fp, 4);

		if ($signature != "JH\x00\x01")
		{
			// Not a valid JPS file
			$this->setError(AKText::_('ERR_NOT_A_JPS_FILE'));

			return false;
		}

		$bin_data    = fread($this->fp, 8);
		$header_data = unpack('vlength/Calgo/Viterations/CuseStaticSalt', $bin_data);

		if ($header_data['length'] != 76)
		{
			// Not a valid JPS file
			$this->setError(AKText::_('ERR_NOT_A_JPS_FILE'));

			return false;
		}

		switch ($header_data['algo'])
		{
			case 0:
				$algorithm = 'sha1';
				break;

			case 1:
				$algorithm = 'sha256';
				break;

			case 2:
				$algorithm = 'sha512';
				break;

			default:
				// Not a valid JPS file
				$this->setError(AKText::_('ERR_NOT_A_JPS_FILE'));

				return false;
				break;
		}

		$this->pbkdf2Algorithm     = $algorithm;
		$this->pbkdf2Iterations    = $header_data['iterations'];
		$this->pbkdf2UseStaticSalt = $header_data['useStaticSalt'];
		$this->pbkdf2StaticSalt    = fread($this->fp, 64);

		return true;
	}
}

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * Timer class
 */
class AKCoreTimer extends AKAbstractObject
{
	/** @var int Maximum execution time allowance per step */
	private $max_exec_time = null;

	/** @var int Timestamp of execution start */
	private $start_time = null;

	/**
	 * Public constructor, creates the timer object and calculates the execution time limits
	 *
	 * @return  void
	 */
	public function __construct()
	{
		// Initialize start time
		$this->start_time = $this->microtime_float();

		// Get configured max time per step and bias
		$config_max_exec_time = AKFactory::get('kickstart.tuning.max_exec_time', 14);
		$bias                 = AKFactory::get('kickstart.tuning.run_time_bias', 75) / 100;

		// Get PHP's maximum execution time (our upper limit)
		if (@function_exists('ini_get'))
		{
			$php_max_exec_time = @ini_get("maximum_execution_time");
			if ((!is_numeric($php_max_exec_time)) || ($php_max_exec_time == 0))
			{
				// If we have no time limit, set a hard limit of about 10 seconds
				// (safe for Apache and IIS timeouts, verbose enough for users)
				$php_max_exec_time = 14;
			}
		}
		else
		{
			// If ini_get is not available, use a rough default
			$php_max_exec_time = 14;
		}

		// Apply an arbitrary correction to counter CMS load time
		$php_max_exec_time--;

		// Apply bias
		$php_max_exec_time    = $php_max_exec_time * $bias;
		$config_max_exec_time = $config_max_exec_time * $bias;

		// Use the most appropriate time limit value
		if ($config_max_exec_time > $php_max_exec_time)
		{
			$this->max_exec_time = $php_max_exec_time;
		}
		else
		{
			$this->max_exec_time = $config_max_exec_time;
		}
	}

	/**
	 * Returns the current timestampt in decimal seconds
	 */
	private function microtime_float()
	{
		list($usec, $sec) = explode(" ", microtime());

		return ((float) $usec + (float) $sec);
	}

	/**
	 * Wake-up function to reset internal timer when we get unserialized
	 */
	public function __wakeup()
	{
		// Re-initialize start time on wake-up
		$this->start_time = $this->microtime_float();
	}

	/**
	 * Gets the number of seconds left, before we hit the "must break" threshold
	 *
	 * @return float
	 */
	public function getTimeLeft()
	{
		return $this->max_exec_time - $this->getRunningTime();
	}

	/**
	 * Gets the time elapsed since object creation/unserialization, effectively how
	 * long Akeeba Engine has been processing data
	 *
	 * @return float
	 */
	public function getRunningTime()
	{
		return $this->microtime_float() - $this->start_time;
	}

	/**
	 * Enforce the minimum execution time
	 */
	public function enforce_min_exec_time()
	{
		// Try to get a sane value for PHP's maximum_execution_time INI parameter
		if (@function_exists('ini_get'))
		{
			$php_max_exec = @ini_get("maximum_execution_time");
		}
		else
		{
			$php_max_exec = 10;
		}
		if (($php_max_exec == "") || ($php_max_exec == 0))
		{
			$php_max_exec = 10;
		}
		// Decrease $php_max_exec time by 500 msec we need (approx.) to tear down
		// the application, as well as another 500msec added for rounding
		// error purposes. Also make sure this is never gonna be less than 0.
		$php_max_exec = max($php_max_exec * 1000 - 1000, 0);

		// Get the "minimum execution time per step" Akeeba Backup configuration variable
		$minexectime = AKFactory::get('kickstart.tuning.min_exec_time', 0);
		if (!is_numeric($minexectime))
		{
			$minexectime = 0;
		}

		// Make sure we are not over PHP's time limit!
		if ($minexectime > $php_max_exec)
		{
			$minexectime = $php_max_exec;
		}

		// Get current running time
		$elapsed_time = $this->getRunningTime() * 1000;
		$minexectime = 1000.0 * $minexectime;

		// Only run a sleep delay if we haven't reached the minexectime execution time
		if (($minexectime > $elapsed_time) && ($elapsed_time > 0))
		{
			$sleep_msec = (int)($minexectime - $elapsed_time);

			if (function_exists('usleep'))
			{
				usleep(1000 * $sleep_msec);
			}
			elseif (function_exists('time_nanosleep'))
			{
				$sleep_sec  = floor($sleep_msec / 1000);
				$sleep_nsec = 1000000 * ($sleep_msec - ($sleep_sec * 1000));
				time_nanosleep($sleep_sec, $sleep_nsec);
			}
			elseif (function_exists('time_sleep_until'))
			{
				$until_timestamp = time() + $sleep_msec / 1000;
				time_sleep_until($until_timestamp);
			}
			elseif (function_exists('sleep'))
			{
				$sleep_sec = ceil($sleep_msec / 1000);
				sleep($sleep_sec);
			}
		}
	}

	/**
	 * Reset the timer. It should only be used in CLI mode!
	 */
	public function resetTime()
	{
		$this->start_time = $this->microtime_float();
	}

	/**
	 * @param int $max_exec_time
	 */
	public function setMaxExecTime($max_exec_time)
	{
		$this->max_exec_time = $max_exec_time;
	}
}

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */


class AKUtilsHtaccess extends AKAbstractObject
{
	/**
	 * Extract the PHP handler configuration from a .htaccess file.
	 *
	 * This method supports AddHandler lines and SetHandler blocks.
	 *
	 * @param   string  $htaccess
	 *
	 * @return  string|null  NULL when not found
	 */
	public static function extractHandler($htaccess)
	{
		// Normalize the .htaccess
		$htaccess = self::normalizeHtaccess($htaccess);

		// Look for SetHandler and AddHandler in Files and FilesMatch containers
		foreach (['Files', 'FilesMatch'] as $container)
		{
			$result = self::extractContainer($container, $htaccess);

			if (!is_null($result))
			{
				return $result;
			}
		}

		// Fallback: extract an AddHandler line
		$found = preg_match('#^AddHandler\s?.*\.php.*$#mi', $htaccess, $matches);

		if ($found >= 1)
		{
			return $matches[0];
		}

		return null;
	}

	/**
	 * Extracts a Files or FilesMatch container with an AddHandler or SetHandler line
	 *
	 * @param   string  $container  "Files" or "FilesMatch"
	 * @param   string  $htaccess   The .htaccess file content
	 *
	 * @return  string|null  NULL when not found
	 */
	protected static function extractContainer($container, $htaccess)
	{
		// Try to find the opening container tag e.g. <Files....>
		$pattern = sprintf('#<%s\s*.*\.php.*>#m', $container);
		$found   = preg_match($pattern, $htaccess, $matches, PREG_OFFSET_CAPTURE);

		if (!$found)
		{
			return null;
		}

		// Get the rest of the .htaccess sample
		$openContainer = $matches[0][0];
		$htaccess      = trim(substr($htaccess, $matches[0][1] + strlen($matches[0][0])));

		// Try to find the closing container tag
		$pattern = sprintf('#</%s\s*>#m', $container);
		$found   = preg_match($pattern, $htaccess, $matches, PREG_OFFSET_CAPTURE);

		if (!$found)
		{
			return null;
		}

		// Get the rest of the .htaccess sample
		$htaccess       = trim(substr($htaccess, 0, $matches[$found - 1][1]));
		$closeContainer = $matches[$found - 1][0];

		if (empty($htaccess))
		{
			return null;
		}

		// Now we'll explode remaining lines and find the first SetHandler or AddHandler line
		$lines = array_map('trim', explode("\n", $htaccess));
		$lines = array_filter($lines, function ($line) {
			return preg_match('#(Add|Set)Handler\s?#i', $line) >= 1;
		});

		if (empty($lines))
		{
			return null;
		}

		return $openContainer . "\n" . array_shift($lines) . "\n" . $closeContainer;
	}

	/**
	 * Normalize the .htaccess file content, making it suitable for handler extraction
	 *
	 * @param   string  $htaccess  The original file
	 *
	 * @return  string  The normalized file
	 */
	private static function normalizeHtaccess($htaccess)
	{
		// Convert all newlines into UNIX style
		$htaccess = str_replace("\r\n", "\n", $htaccess);
		$htaccess = str_replace("\r", "\n", $htaccess);

		// Return only non-comment, non-empty lines
		$isNonEmptyNonComment = function ($line) {
			$line = trim($line);

			return !empty($line) && (substr($line, 0, 1) !== '#');
		};

		$lines = array_map('trim', explode("\n", $htaccess));

		return implode("\n", array_filter($lines, $isNonEmptyNonComment));
	}
}

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * A filesystem scanner which uses opendir()
 */
class AKUtilsLister extends AKAbstractObject
{
	public function &getFiles($folder, $pattern = '*')
	{
		// Initialize variables
		$arr   = array();
		$false = false;

		if (!is_dir($folder))
		{
			return $false;
		}

		$handle = @opendir($folder);
		// If directory is not accessible, just return FALSE
		if ($handle === false)
		{
			$this->setWarning('Unreadable directory ' . $folder);

			return $false;
		}

		while (($file = @readdir($handle)) !== false)
		{
			if (!fnmatch($pattern, $file))
			{
				continue;
			}

			if (($file != '.') && ($file != '..'))
			{
				$ds    =
					($folder == '') || ($folder == '/') || (@substr($folder, -1) == '/') || (@substr($folder, -1) == DIRECTORY_SEPARATOR) ?
						'' : DIRECTORY_SEPARATOR;
				$dir   = $folder . $ds . $file;
				$isDir = is_dir($dir);
				if (!$isDir)
				{
					$arr[] = $dir;
				}
			}
		}
		@closedir($handle);

		return $arr;
	}

	public function &getFolders($folder, $pattern = '*')
	{
		// Initialize variables
		$arr   = array();
		$false = false;

		if (!is_dir($folder))
		{
			return $false;
		}

		$handle = @opendir($folder);
		// If directory is not accessible, just return FALSE
		if ($handle === false)
		{
			$this->setWarning('Unreadable directory ' . $folder);

			return $false;
		}

		while (($file = @readdir($handle)) !== false)
		{
			if (!fnmatch($pattern, $file))
			{
				continue;
			}

			if (($file != '.') && ($file != '..'))
			{
				$ds    =
					($folder == '') || ($folder == '/') || (@substr($folder, -1) == '/') || (@substr($folder, -1) == DIRECTORY_SEPARATOR) ?
						'' : DIRECTORY_SEPARATOR;
				$dir   = $folder . $ds . $file;
				$isDir = is_dir($dir);
				if ($isDir)
				{
					$arr[] = $dir;
				}
			}
		}
		@closedir($handle);

		return $arr;
	}
}

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * A filesystem zapper - removes all files and folders under a root
 */
class AKUtilsZapper extends AKAbstractPart
{
	/** @var array Directories left to be deleted */
	private $directory_list;

	/** @var array Files left to be deleted */
	private $file_list;

	/**
	 * Have we finished scanning all subdirectories of the current directory?
	 *
	 * @var   boolean
	 */
	private $done_subdir_scanning = false;

	/**
	 * Have we finished scanning all files of the current directory?
	 *
	 * @var   boolean
	 */
	private $done_file_scanning = true;

	/**
	 * Is the current directory completely excluded?
	 *
	 * @var boolean
	 */
	private $excluded_folder = false;

	/** @var   integer  How many files have been processed in the current step */
	private $processed_files_counter;

	/** @var   string  Current directory being scanned */
	private $current_directory;

	/** @var   string  Current root directory being processed */
	private $root = '';

	/** @var   integer  Total files to process */
	private $total_files = 0;

	/** @var   integer  Total files already processed */
	private $done_files = 0;

	/** @var   integer  Total folders to process */
	private $total_folders = 0;

	/** @var   integer  Total folders already processed */
	private $done_folders = 0;

	/** @var array Absolute filesystem patterns to never delete (e.g. /var/www/html/*.jpa) */
	private $excluded = array();

	/** @var bool Are we in a dry-run? */
	private $dryRun = false;

	/**
	 * Implements the _prepare() abstract method
	 *
	 * Configuration parameters:
	 *
	 * root      The root under which we are going to be deleting files
	 * excluded  Absolute filesystem patterns to never delete (e.g. /var/www/html/*.jpa)
	 *
	 * @return  void
	 */
	protected function _prepare()
	{
		debugMsg(__CLASS__ . " :: Starting _prepare()");

		$defaultExcluded = $this->getDefaultExclusions();

		$parameters = array_merge(array(
			'root'     => rtrim(AKFactory::get('kickstart.setup.destdir'), '/' . DIRECTORY_SEPARATOR),
			'excluded' => $defaultExcluded,
            'dryRun'   => AKFactory::get('kickstart.setup.dryrun', false)
		), $this->_parametersArray);

		$this->root                 = $parameters['root'];
		$this->excluded             = $parameters['excluded'];
		$this->directory_list[]     = $this->root;
		$this->done_subdir_scanning = true;
		$this->done_file_scanning   = true;
		$this->total_files          = 0;
		$this->done_files           = 0;
		$this->total_folders        = 0;
		$this->done_folders         = 0;
		$this->dryRun               = $parameters['dryRun'];

		if (empty($this->root))
		{
			$error = "The folder to delete was not specified.";

			debugMsg(__CLASS__ . " :: " . $error);
			$this->setError($error);

			return;
		}

		if (!is_dir($this->root))
		{
			$error = sprintf("Folder %s does not exist", $this->root);

			debugMsg(__CLASS__ . " :: " . $error);
			$this->setError($error);

			return;
		}

		$this->setState('prepared');

		debugMsg(__CLASS__ . " :: prepared");
	}

	protected function _run()
	{
		if ($this->getState() == 'postrun')
		{
			debugMsg(__CLASS__ . " :: Already finished");
			$this->setStep("-");
			$this->setSubstep("");

			return true;
		}

		// If I'm done scanning files and subdirectories and there are no more files to pack get the next
		// directory. This block is triggered in the first step in a new root.
		if (empty($this->file_list) && $this->done_subdir_scanning && $this->done_file_scanning)
		{
			$this->progressMarkFolderDone();

			if (!$this->getNextDirectory())
			{
			    $this->setState('postrun');
				return true;
			}
		}

		// If I'm not done scanning for files and the file list is empty then scan for more files
		if (!$this->done_file_scanning && empty($this->file_list))
		{
			$this->scanFiles();
		}
		// If I have files left, delete them
		elseif (!empty($this->file_list))
		{
			$this->delete_files();
		}
		// If I'm not done scanning subdirectories, go ahead and scan some more of them
		elseif (!$this->done_subdir_scanning)
		{
			$this->scanSubdirs();
		}

		// Do I have an error?
		if ($this->getError())
		{
			return false;
		}

		return true;
	}

	/**
	 * Implements the _finalize() abstract method
	 *
	 */
	protected function _finalize()
	{
		// No finalization is required
		$this->setState('finished');
	}

	// ============================================================================================
	// PRIVATE METHODS
	// ============================================================================================

	/**
	 * Gets the next directory to scan from the stack. It also applies folder
	 * filters (directory exclusion, subdirectory exclusion, file exclusion),
	 * updating the operation toggle properties of the class.
	 *
	 * @return   boolean  True if we found a directory, false if the directory
	 *                    stack is empty. It also returns true if the folder is
	 *                    filtered (we are told to skip it)
	 */
	private function getNextDirectory()
	{
		// Reset the file / folder scanning positions
		$this->done_file_scanning   = false;
		$this->done_subdir_scanning = false;
		$this->excluded_folder      = false;

		if (count($this->directory_list) == 0)
		{
			// No directories left to scan
			return false;
		}

		// Get and remove the last entry from the $directory_list array
		$this->current_directory = array_pop($this->directory_list);
		$this->setStep($this->current_directory);
		$this->processed_files_counter = 0;

		// Apply directory exclusion filters
		if ($this->isFiltered($this->current_directory))
		{
			debugMsg("Skipping directory " . $this->current_directory);
			$this->done_subdir_scanning = true;
			$this->done_file_scanning   = true;
			$this->excluded_folder      = true;

			return true;
		}

		return true;
	}

	/**
	 * Try to delete some files from the $file_list
	 *
	 * @return   boolean   True if there were files deleted , false otherwise
	 *                     (empty filelist or fatal error)
	 */
	protected function delete_files()
	{
		// Get a reference to the archiver and the timer classes
		$timer = AKFactory::getTimer();

		// Normal file removal loop; we keep on processing the file list, removing files as we go.
		if (count($this->file_list) == 0)
		{
			// No files left to pack. Return true and let the engine loop
			$this->progressMarkFolderDone();

			return true;
		}

		debugMsg("Deleting files");

		$numberOfFiles = 0;
		$postProc = AKFactory::getPostProc();

		while ((count($this->file_list) > 0))
		{
			$file = @array_shift($this->file_list);

			$numberOfFiles++;

			// Remove the file
            $this->setSubstep($file);
            $this->notify((object) array(
                'type' => 'deleteFile',
                'file' => $file
            ));

            if (!$this->dryRun)
            {
                $postProc->unlink($file);
	            clearFileInOPCache($file);
            }

			// Mark a done file
			$this->progressMarkFileDone();

			if ($this->getError())
			{
				return false;
			}

			// I am running out of time.
			if ($timer->getTimeLeft() <= 0)
			{
				return true;
			}
		}

		// True if we have more files, false if we're done packing
		return (count($this->file_list) > 0);
	}

	protected function progressAddFile()
	{
		$this->total_files++;
	}

	protected function progressMarkFileDone()
	{
		$this->done_files++;
	}

	protected function progressAddFolder()
	{
		$this->total_folders++;
	}

	protected function progressMarkFolderDone()
	{
        debugMsg("Deleting directory " . $this->current_directory);

        $this->setSubstep($this->current_directory);
        $this->notify((object) array(
            'type' => 'deleteFolder',
            'file' => $this->current_directory
        ));

        if (!$this->dryRun)
        {
            /**
             * The scanner goes from shallow to deep directory. However this means that when it scans
             * <root>/foo/bar/baz/bat
             * it will only be able to remove the 'bat' directory, thus leaving foo/bar/baz on the disk. The following
             * method will check if the directory is a subdirectory of the site root and work its way up the tree until
             * it finds the site root. Therefore it will end up deleting the parent folders as well.
             */
            $this->deleteParentFolders($this->current_directory);
        }
	}

	/**
	 * Returns the site root, the translated site root and the translated current directory
	 *
	 * @return array
	 */
	protected function getCleanDirectoryComponents()
	{
		$root            = $this->root;
		$translated_root = $root;
		$dir             = TrimTrailingSlash($this->current_directory);

		if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')
		{
			$translated_root = TranslateWinPath($translated_root);
			$dir             = TranslateWinPath($dir);
		}

		if (substr($dir, 0, strlen($translated_root)) == $translated_root)
		{
			$dir = substr($dir, strlen($translated_root));
		}
		elseif (in_array(substr($translated_root, -1), array('/', '\\')))
		{
			$new_translated_root = rtrim($translated_root, '/\\');

			if (substr($dir, 0, strlen($new_translated_root)) == $new_translated_root)
			{
				$dir = substr($dir, strlen($new_translated_root));
			}
		}

		if (substr($dir, 0, 1) == '/')
		{
			$dir = substr($dir, 1);
		}

		return array($root, $translated_root, $dir);
	}

	/**
	 * Steps the subdirectory scanning of the current directory
	 *
	 * @return  boolean  True on success, false on fatal error
	 */
	protected function scanSubdirs()
	{
		$lister = new AKUtilsLister();

		list($root, $translated_root, $dir) = $this->getCleanDirectoryComponents();

		debugMsg("Scanning directories of " . $this->current_directory);

		// Get subdirectories
		$subdirectories = $lister->getFolders($this->current_directory);

		// Error propagation
		$this->propagateFromObject($lister);

		// Error control
		if ($this->getError())
		{
			return false;
		}

		// Start adding the subdirectories
		if (!empty($subdirectories) && is_array($subdirectories))
		{
			// Treat symlinks to directories as simple symlink files
			foreach ($subdirectories as $subdirectory)
			{
				if (is_link($subdirectory))
				{
					// Symlink detected; apply directory filters to it
					if (empty($dir))
					{
						$dirSlash = $dir;
					}
					else
					{
						$dirSlash = $dir . '/';
					}

					$check = $dirSlash . basename($subdirectory);
					debugMsg("Directory symlink detected: $check");

					if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')
					{
						$check = TranslateWinPath($check);
					}

					$check = $translated_root . '/' . $check;

					// Check for excluded symlinks
					if ($this->isFiltered($check))
					{
						debugMsg("Skipping directory symlink " . $check);

						continue;
					}

					debugMsg('Adding folder symlink: ' . $check);

					$this->file_list[] = $subdirectory;
					$this->progressAddFile();
				}

				$this->directory_list[] = $subdirectory;
				$this->progressAddFolder();
			}
		}

		$this->done_subdir_scanning = true;

		return true;
	}

	/**
	 * Steps the files scanning of the current directory
	 *
	 * @return  boolean  True on success, false on fatal error
	 */
	protected function scanFiles()
	{
		$lister = new AKUtilsLister();

		list($root, $translated_root, $dir) = $this->getCleanDirectoryComponents();

		debugMsg("Scanning files of " . $this->current_directory);
		$this->processed_files_counter = 0;

		// Get file listing
		$fileList = $lister->getFiles($this->current_directory);

		// Error propagation
		$this->propagateFromObject($lister);

		// Error control
		if ($this->getError())
		{
			return false;
		}

		// Do I have an unreadable directory?
		if (($fileList === false))
		{
			$this->setWarning('Unreadable directory ' . $this->current_directory);

			$this->done_file_scanning = true;

			return true;
		}

		// Directory was readable, process the file list
		if (is_array($fileList) && !empty($fileList))
		{
			// Add required trailing slash to $dir
			if (!empty($dir))
			{
				$dir .= '/';
			}

			// Scan all directory entries
			foreach ($fileList as $fileName)
			{
				$check = $dir . basename($fileName);

				if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')
				{
					$check = TranslateWinPath($check);
				}

				$check        = $translated_root . '/' . $check;
				$skipThisFile = $this->isFiltered($check);

				if ($skipThisFile)
				{
					debugMsg("Skipping file $fileName");

					continue;
				}

				$this->file_list[] = $fileName;
				$this->processed_files_counter++;
				$this->progressAddFile();
			}
		}

		$this->done_file_scanning = true;

		return true;
	}

	/**
	 * Is a file or folder filtered (protected from deletion)
	 *
	 * @param   string  $fileOrFolder
	 *
	 * @return  bool
	 */
	private function isFiltered($fileOrFolder)
	{
		foreach ($this->excluded as $pattern)
		{
			if (fnmatch($pattern, $fileOrFolder))
			{
				return true;
			}
		}

		return false;
	}

	/**
	 * Get the default exceptions from deletion
	 *
	 * @return  array
	 */
	private function getDefaultExclusions()
	{
		$ret     = array();
		$destDir = AKFactory::get('kickstart.setup.destdir');

		/**
		 * Exclude Kickstart / restore.php itself. Otherwise it'd crash!
		 */
		$myName = defined('KSSELFNAME') ? KSSELFNAME : basename(__FILE__);
		$ret[] = KSROOTDIR . '/' . $myName;

		/**
		 * Cheat: exclude the directory used in development (see source/buildscripts/kickstart_test.php)
		 *
		 * This directory contains the non-concatenated source code for Kickstart. We need to keep it protected.
		 */
		if (defined('MINIBUILD') && (MINIBUILD != $destDir))
		{
			$ret[] = TranslateWinPath(MINIBUILD);
		}

		/**
		 * Exclude the backup archive directory if it's not the site's root. This prevents mindlessly deleting all your
		 * backups before you restore from a previous backup which might not be the one you actually wanted. I will call
		 * this feature "clumsy-proofing".
		 */
		$backupArchive   = AKFactory::get('kickstart.setup.sourcefile');
		$backupDirectory = AKFactory::get('kickstart.setup.sourcepath');
		$backupDirectory = empty($backupDirectory) ? dirname($backupArchive) : $backupDirectory;

		if ($backupDirectory != $destDir)
		{
			$ret[] = TranslateWinPath($backupDirectory);
		}

		/**
		 * Exclude the backup archive files
		 *
		 * This obviously only makes sense when the backup archives are stored in the extraction target folder which is
		 * the most common use of Kickstart. In this case the backups folder is not excluded above.
		 */
		$plainBackupName = basename($backupArchive, '.jpa');
		$plainBackupName = basename($plainBackupName, '.jps');
		$plainBackupName = basename($plainBackupName, '.zip');
		$ret[]           = TranslateWinPath($backupDirectory . '/' . $plainBackupName) . '.*';

		/**
		 * Exclude Kickstart language files. Only applies in Kickstart mode.
		 */
		if (defined('KICKSTART'))
		{
			$langDir        = defined('KSLANGDIR') ? KSLANGDIR : KSROOTDIR;
            $iniFilePattern = basename(KSSELFNAME, '.php') . '.*.ini';

			if ($langDir != KSROOTDIR)
            {
                $ret[] = KSLANGDIR;
            }

            $ret[]   = $langDir . '/' . $iniFilePattern;
            $ret[]   = KSROOTDIR . '/' . $iniFilePattern;
		}

		/**
		 * Exclude Kickstart resources (cacert.pem). Only applies in Kickstart mode.
		 */
		if (defined('KICKSTART'))
		{
			$ret[] = TranslateWinPath(KSROOTDIR . '/cacert.pem');
		}

		// Exclude the Kickstart temporary directory, if one is used by the post-processing engine
		$postProc = AKFactory::getPostProc();
		$tempDir  = $postProc->getTempDir();

		if (!empty($tempDir) && (realpath($tempDir) != realpath($destDir)))
		{
			$ret[] = TranslateWinPath($tempDir);
		}

		/**
		 * Exclude the configured Skipped Files ('kickstart.setup.skipfiles'). Also exclude the various restoration.php
		 * files if we are in restore.php mode and the files are present. These are required for the integrated
		 * restoration to actually work :)
		 */
		$skippedFiles = AKFactory::get('kickstart.setup.skipfiles', array(
			basename(__FILE__), 'kickstart.php', 'abiautomation.ini', 'htaccess.bak', 'php.ini.bak',
			'cacert.pem',
		));

		if (!defined('KICKSTART'))
		{
			// In restore.php mode we have to exclude the various restoration.php files
			$skippedFiles = array_merge(array(
				// Akeeba Backup for Joomla!
				'administrator/components/com_akeeba/restoration.php',
				'administrator/components/com_akeebabackup/restoration.php',
				// Joomla! Update
				'administrator/components/com_joomlaupdate/restoration.php',
				// Akeeba Backup for WordPress
				'wp-content/plugins/akeebabackupwp/app/restoration.php',
				'wp-content/plugins/akeebabackupcorewp/app/restoration.php',
				'wp-content/plugins/akeebabackup/app/restoration.php',
				'wp-content/plugins/akeebabackupwpcore/app/restoration.php',
				// Akeeba Solo
				'app/restoration.php',
			), $skippedFiles);
		}

		foreach ($skippedFiles as $file)
		{
			$checkFile = $destDir . '/' . $file;

			if (file_exists($checkFile))
			{
				$ret[] = TranslateWinPath($checkFile);
			}
		}

		/**
		 * Exclude .htaccess if the stealth feature is enabled. Otherwise we'd unset the stealth mode.
		 * Exclude it even if we have any AddHandler directive, otherwise the site will be borked if the user
		 * chooses not to rename the .htaccess file
		 */
		if (AKFactory::get('kickstart.stealth.enable') || AKFactory::get('kickstart.setup.phphandlers', array()))
		{
			$ret[] = $destDir . '/.htaccess';
		}

		// Remove any duplicate lines
        $ret = array_unique($ret);

		return $ret;
	}

    /**
     * Recursively delete an empty folder and any of its empty parent folders.
     *
     * @param   string  $folder  The folder to deletes
     */
	private function deleteParentFolders($folder)
    {
        // Don't try to delete an empty folder or the filesystem root
        if (empty($folder) || ($folder == '/'))
        {
            return;
        }

        $folder = TranslateWinPath($folder);
        $root   = TranslateWinPath($this->root);

        // Don't try to delete the site's root
        if ($folder === $root)
        {
            return;
        }

        // Delete the leaf folder
        $postProc = AKFactory::getPostProc();
        $postProc->rmdir($folder);

        // If the leaf folder is not under the site's root don't delete its parents
        if (strpos($folder, $root) !== 0)
        {
            return;
        }

        // Get and recursively delete the parent folder
        $this->deleteParentFolders(dirname($folder));
    }
}

/**
 * Runs the Zapper and returns a status table. The Zapper only runs if the feature is enabled (kickstart.setup.zapbefore
 * is 1) and there are more Zapper steps to run (its state is not postrun). If any of these conditions is not met we
 * return boolean false.
 *
 * @param   AKAbstractPartObserver  $observer  Optional observer to attack to the Zapper instance
 *
 * @return  bool|array  Boolean false or a status array
 */
function runZapper(AKAbstractPartObserver $observer = null)
{
	// This method should only run in restore.php mode or when we have Kickstart Professional.
	$isKickstart = defined('KICKSTART');
	$isPro       = defined('KICKSTARTPRO') ? KICKSTARTPRO : false;
	$isDebug     = defined('KSDEBUG') ? KSDEBUG : false;

	if ($isKickstart && (!$isPro && !$isDebug))
	{
		return false;
	}

	// Is the feature enabled?
    $enabled = AKFactory::get('kickstart.setup.zapbefore', 0);

    if (!$enabled)
    {
        return false;
    }

    // Do I still have work to do?
    $zapper = AKFactory::getZapper();

    if ($zapper->getState() == 'finished')
    {
        return false;
    }

    // Attach the observer
    if (is_object($observer))
    {
        $zapper->attach($observer);
    }

    // Run a step, create and return a status array
	$timer = AKFactory::getTimer();

    while ($timer->getTimeLeft() > 0)
    {
	    $ret = $zapper->tick();

	    if ($ret['Error'] != '')
	    {
	    	break;
	    }
    }

    $retArray = array(
        'status'  => true,
        'message' => null,
        'done' => false,
    );

    if ($ret['Error'] != '')
    {
        $retArray['status']  = false;
        $retArray['done']    = true;
        $retArray['message'] = $ret['Error'];
    }
    else
    {
        $retArray['files']    = 0;
        $retArray['bytesIn']  = 0;
        $retArray['bytesOut'] = 0;
        $retArray['factory']  = AKFactory::serialize();
        $retArray['lastfile'] = 'Deleting: ' . $zapper->getSubstep();
    }

	$timer->enforce_min_exec_time();

    return $retArray;
}

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * A simple INI-based i18n engine
 */
class AKText extends AKAbstractObject
{
	/**
	 * The default (en_GB) translation used when no other translation is available
	 *
	 * @var array
	 */
	private $default_translation = [
		'AUTOMODEON'                      => 'Auto-mode enabled',
		'ERR_NOT_A_JPA_FILE'              => 'The file is not a JPA archive',
		'ERR_CORRUPT_ARCHIVE'             => 'The archive file is corrupt, truncated or archive parts are missing',
		'ERR_INVALID_ARCHIVE_LONG'        => 'The archive file appears to be corrupt, or archive parts are missing. If your backups consists of multiple files, please make sure that you have downloaded all the archive part files (files with the same name and extensions .%s, .%s01, .%2$s02…). Please make sure to download <em>and</em> upload files using SFTP, or FTP in Binary transfer mode and do check that their file size matches the sizes reported in the Manage Backups page of Akeeba Backup / Akeeba Solo.',
		'ERR_INVALID_LOGIN'               => 'Invalid login',
		'COULDNT_CREATE_DIR'              => 'Could not create %s folder',
		'COULDNT_WRITE_FILE'              => 'Could not open %s for writing.',
		'WRONG_FTP_HOST'                  => 'Wrong FTP host or port',
		'WRONG_FTP_USER'                  => 'Wrong FTP username or password',
		'WRONG_FTP_PATH1'                 => 'Wrong FTP initial directory - the directory doesn\'t exist',
		'FTP_CANT_CREATE_DIR'             => 'Could not create directory %s',
		'FTP_TEMPDIR_NOT_WRITABLE'        => 'Could not find or create a writable temporary directory',
		'SFTP_TEMPDIR_NOT_WRITABLE'       => 'Could not find or create a writable temporary directory',
		'FTP_COULDNT_UPLOAD'              => 'Could not upload %s',
		'THINGS_HEADER'                   => 'Things you should know about Akeeba Kickstart',
		'THINGS_01'                       => 'Kickstart is not an installer. It is an archive extraction tool. The actual installer was put inside the archive file at backup time.',
		'THINGS_03'                       => 'Kickstart is bound by your server\'s configuration. As such, it may not work at all.',
		'THINGS_04'                       => 'You should download and upload your archive files using FTP in Binary transfer mode. Any other method could lead to a corrupt backup archive and restoration failure.',
		'THINGS_05'                       => 'Post-restoration site load errors are usually caused by .htaccess or php.ini directives. You should understand that blank pages, 404 and 500 errors can usually be worked around by editing the aforementioned files. It is not our job to mess with your configuration files, because this could be dangerous for your site.',
		'THINGS_06'                       => 'Kickstart overwrites files without a warning. If you are not sure that you are OK with that do not continue.',
		'THINGS_07'                       => 'Trying to restore to the temporary URL of a cPanel host (e.g. http://1.2.3.4/~username) will lead to restoration failure and your site will appear to be not working. This is normal and it\'s just how your server and CMS software work.',
		'THINGS_08'                       => 'You are supposed to read the documentation before using this software. Most issues can be avoided, or easily worked around, by understanding how this software works.',
		'THINGS_09'                       => 'This text does not imply that there is a problem detected. It is standard text displayed every time you launch Kickstart.',
		'CLOSE_LIGHTBOX'                  => 'Click here or press ESC to close this message',
		'SELECT_ARCHIVE'                  => 'Select a backup archive',
		'ARCHIVE_FILE'                    => 'Archive file:',
		'SELECT_EXTRACTION'               => 'Select an extraction method',
		'WRITE_TO_FILES'                  => 'Write to files:',
		'WRITE_HYBRID'                    => 'Hybrid (use FTP only if needed)',
		'WRITE_DIRECTLY'                  => 'Directly',
		'WRITE_FTP'                       => 'Use FTP for all files',
		'WRITE_SFTP'                      => 'Use SFTP for all files',
		'FTP_HOST'                        => '(S)FTP host name:',
		'FTP_PORT'                        => '(S)FTP port:',
		'FTP_FTPS'                        => 'Use FTP over SSL (FTPS)',
		'FTP_PASSIVE'                     => 'Use FTP Passive Mode',
		'FTP_USER'                        => '(S)FTP user name:',
		'FTP_PASS'                        => '(S)FTP password:',
		'FTP_DIR'                         => '(S)FTP directory:',
		'FTP_TEMPDIR'                     => 'Temporary directory:',
		'FTP_CONNECTION_OK'               => 'FTP Connection Established',
		'SFTP_CONNECTION_OK'              => 'SFTP Connection Established',
		'FTP_CONNECTION_FAILURE'          => 'The FTP Connection Failed',
		'SFTP_CONNECTION_FAILURE'         => 'The SFTP Connection Failed',
		'FTP_TEMPDIR_WRITABLE'            => 'The temporary directory is writable.',
		'FTP_TEMPDIR_UNWRITABLE'          => 'The temporary directory is not writable. Please check the permissions.',
		'FTP_BROWSE'                      => 'Browse',
		'FTPBROWSER_LBL_INSTRUCTIONS'     => 'Click on a directory to navigate into it. Click on OK to select that directory, Cancel to abort the procedure.',
		'FTPBROWSER_ERROR_HOSTNAME'       => 'Invalid FTP host or port',
		'FTPBROWSER_ERROR_USERPASS'       => 'Invalid FTP username or password',
		'FTPBROWSER_ERROR_NOACCESS'       => 'Directory doesn\'t exist or you don\'t have enough permissions to access it',
		'FTPBROWSER_ERROR_UNSUPPORTED'    => 'Sorry, your FTP server doesn\'t support our FTP directory browser.',
		'FTPBROWSER_LBL_GOPARENT'         => '&lt;up one level&gt;',
		'FTPBROWSER_LBL_ERROR'            => 'An error occurred',
		'SFTP_NO_SSH2'                    => 'Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.',
		'SFTP_NO_FTP_SUPPORT'             => 'Your SSH server does not allow SFTP connections',
		'SFTP_WRONG_USER'                 => 'Wrong SFTP username or password',
		'SFTP_WRONG_STARTING_DIR'         => 'You must supply a valid absolute path',
		'SFTPBROWSER_ERROR_NOACCESS'      => 'Directory doesn\'t exist or you don\'t have enough permissions to access it',
		'SFTP_COULDNT_UPLOAD'             => 'Could not upload %s',
		'SFTP_CANT_CREATE_DIR'            => 'Could not create directory %s',
		'UI-ROOT'                         => '&lt;root&gt;',
		'CONFIG_UI_FTPBROWSER_TITLE'      => 'FTP Directory Browser',
		'BTN_CHECK'                       => 'Check',
		'BTN_RESET'                       => 'Reset',
		'BTN_TESTFTPCON'                  => 'Test FTP connection',
		'BTN_TESTSFTPCON'                 => 'Test SFTP connection',
		'BTN_GOTOSTART'                   => 'Start over',
		'BTN_RETRY'                       => 'Retry',
		'FINE_TUNE'                       => 'Fine tune',
		'MIN_EXEC_TIME'                   => 'Minimum execution time:',
		'MAX_EXEC_TIME'                   => 'Maximum execution time:',
		'SECONDS_PER_STEP'                => 'seconds per step',
		'EXTRACT_FILES'                   => 'Extract files',
		'BTN_START'                       => 'Start',
		'EXTRACTING'                      => 'Extracting',
		'DO_NOT_CLOSE_EXTRACT'            => 'Do not close this window while the extraction is in progress',
		'RESTACLEANUP'                    => 'Restoration and Clean Up',
		'BTN_RUNINSTALLER'                => 'Run the Installer',
		'BTN_CLEANUP'                     => 'Clean Up',
		'BTN_SITEFE'                      => 'Visit your site\'s frontend',
		'BTN_SITEBE'                      => 'Visit your site\'s backend',
		'WARNINGS'                        => 'Extraction Warnings',
		'ERROR_OCCURED'                   => 'An error occurred',
		'STEALTH_MODE'                    => 'Stealth mode',
		'STEALTH_URL'                     => 'HTML file to show to web visitors',
		'ERR_NOT_A_JPS_FILE'              => 'The file is not a JPA archive',
		'ERR_INVALID_JPS_PASSWORD'        => 'The password you gave is wrong or the archive is corrupt',
		'JPS_PASSWORD'                    => 'Archive Password (for JPS files)',
		'INVALID_FILE_HEADER_OFFSET_ZERO' => 'Cannot open the file %s for reading. This is part #%d of your backup archive which consists of multiple files (files with the same name and extensions .%s, .%s01, .%4$s02…). Please make sure that you have all of these files in the same folder as Kickstart.',
		'INVALID_FILE_HEADER'             => 'Invalid header in archive file, part %s, offset %s. Please make sure to download <em>and</em> upload backup archive files using SFTP, or FTP in Binary transfer mode and do check that their file size matches the sizes reported in the Manage Backups page of Akeeba Backup / Akeeba Solo.',
		'INVALID_FILE_HEADER_MULTIPART'   => 'Invalid header in archive file, part %s, offset %s. Your backup archive consists of multiple files (files with the same name and extensions .%s, .%s01, .%4$s02…). Either some files are missing, or they are corrupt or truncated. You will need all of these files to be present in the same directory. Please make sure to download <em>and</em> upload backup archive files using SFTP, or FTP in Binary transfer mode and do check that their file size matches the sizes reported in the Manage Backups page of Akeeba Backup / Akeeba Solo.',
		'UPDATE_HEADER'                   => 'An updated version of Akeeba Kickstart (<span id="update-version">unknown</span>) is available!',
		'UPDATE_NOTICE'                   => 'You are advised to always use the latest version of Akeeba Kickstart available. Older versions may be subject to bugs and will not be supported.',
		'UPDATE_DLNOW'                    => 'Download now',
		'UPDATE_MOREINFO'                 => 'More information',
		'NEEDSOMEHELPKS'                  => 'Want some help to use this tool? Read this first:',
		'QUICKSTART'                      => 'Using Kickstart',
		'CANTGETITTOWORK'                 => 'Can\'t get it to work? Click me!',
		'NOARCHIVESCLICKHERE'             => 'No archives detected. Click here for troubleshooting instructions.',
		'POSTRESTORATIONTROUBLESHOOTING'  => 'Something not working after the restoration? Click here for troubleshooting instructions.',
		'IGNORE_MOST_ERRORS'              => 'Ignore most errors',
		'TIME_SETTINGS_HELP'              => 'Increase the minimum to 3 if you get AJAX errors. Increase the maximum to 10 for faster extraction, decrease back to 5 if you get AJAX errors. Try minimum 5, maximum 1 (not a typo!) if you keep getting AJAX errors.',
		'STEALTH_MODE_HELP'               => 'When enabled, only visitors from your IP address will be able to see the site until the restoration is complete. Everyone else will be redirected to and only see the URL above. Your server must see the real IP of the visitor (this is controlled by your host, not you or us).',
		'RENAME_FILES_HELP'               => 'Renames .htaccess, web.config, php.ini and .user.ini contained in the archive while extracting. Files are renamed with a .bak extension. The file names are restored when you click on Clean Up.',
		'RESTORE_PERMISSIONS_HELP'        => 'Applies the file permissions (but NOT file ownership) which was stored at backup time. Only works with JPA and JPS archives. Does not work on Windows (PHP does not offer such a feature).',
		'EXTRACT_LIST'                    => 'Files to extract',
		'EXTRACT_LIST_HELP'               => 'Enter a file path such as <code>images/cat.png</code> or shell pattern such as <code>images/*.png</code> on each line. Only files matching this list will be written to disk. Leave empty to extract everything (default).',
		'AKS3_IMPORT'                     => 'Import from Amazon S3',
		'AKS3_TITLE_STEP1'                => 'Connect to Amazon S3',
		'AKS3_ACCESS'                     => 'Access Key',
		'AKS3_SECRET'                     => 'Secret Key',
		'AKS3_CONNECT'                    => 'Connect to Amazon S3',
		'AKS3_CANCEL'                     => 'Cancel import',
		'AKS3_TITLE_STEP2'                => 'Select your Amazon S3 bucket',
		'AKS3_BUCKET'                     => 'Bucket',
		'AKS3_LISTCONTENTS'               => 'List contents',
		'AKS3_TITLE_STEP3'                => 'Select archive to import',
		'AKS3_FOLDERS'                    => 'Folders',
		'AKS3_FILES'                      => 'Archive Files',
		'AKS3_TITLE_STEP4'                => 'Importing...',
		'AKS3_DO_NOT_CLOSE'               => 'Please do not close this window while your backup archives are being imported',
		'AKS3_TITLE_STEP5'                => 'Import is complete',
		'AKS3_BTN_RELOAD'                 => 'Reload Kickstart',
		'WRONG_FTP_PATH2'                 => 'Wrong FTP initial directory - the directory doesn\'t correspond to your site\'s web root',
		'ARCHIVE_DIRECTORY'               => 'Archive directory:',
		'RELOAD_ARCHIVES'                 => 'Reload',
		'CONFIG_UI_SFTPBROWSER_TITLE'     => 'SFTP Directory Browser',
		'ERR_COULD_NOT_OPEN_ARCHIVE_PART' => 'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.',
		'RENAME_FILES'                    => 'Rename server configuration files before extraction',
		'BTN_SHOW_FINE_TUNE'              => 'Show advanced options (for experts)',
		'RESTORE_PERMISSIONS'             => 'Restore file permissions',
		'ZAPBEFORE'                       => 'Delete everything before extraction',
		'ZAPBEFORE_HELP'                  => 'Tries to delete all existing files and folders under the directory where Kickstart is stored before extracting the backup archive. It DOES NOT take into account which files and folders exist in the backup archive. Files and folders deleted by this feature CAN NOT be recovered. <strong>WARNING! THIS MAY DELETE FILES AND FOLDERS WHICH DO NOT BELONG TO YOUR SITE. USE WITH EXTREME CAUTION. BY ENABLING THIS FEATURE YOU ASSUME ALL RESPONSIBILITY AND LIABILITY.</strong>',
	];

	/** END OF ARRAY — DO NOT EDIT OR REMOVE **/

	/**
	 * The array holding the translation keys
	 *
	 * @var array
	 */
	private $strings;

	/**
	 * The currently detected language (ISO code)
	 *
	 * @var string
	 */
	private $language;

	/*
	 * Initializes the translation engine
	 * @return AKText
	 */
	public function __construct()
	{
		// Start with the default translation
		$this->strings = $this->default_translation;
		// Try loading the translation file in English, if it exists
		$this->loadTranslation('en-GB');
		// Try loading the translation file in the browser's preferred language, if it exists
		$this->getBrowserLanguage();
		if (!is_null($this->language))
		{
			$this->loadTranslation();
		}
	}

	/**
	 * A PHP based INI file parser.
	 *
	 * Thanks to asohn ~at~ aircanopy ~dot~ net for posting this handy function on
	 * the parse_ini_file page on http://gr.php.net/parse_ini_file
	 *
	 * @param   string  $file              Filename to process
	 * @param   bool    $process_sections  True to also process INI sections
	 * @param   bool    $rawdata           If true, the $file contains raw INI data, not a filename
	 *
	 * @return array An associative array of sections, keys and values
	 * @access private
	 */
	public static function parse_ini_file($file, $process_sections = false, $rawdata = false)
	{
		$process_sections = ($process_sections !== true) ? false : true;

		if (!$rawdata)
		{
			$ini = file($file);
		}
		else
		{
			$file = str_replace("\r", "", $file);
			$ini  = explode("\n", $file);
		}

		if (!is_array($ini))
		{
			return [];
		}

		if (count($ini) == 0)
		{
			return [];
		}

		$sections = [];
		$values   = [];
		$result   = [];
		$globals  = [];
		$i        = 0;
		foreach ($ini as $line)
		{
			$line = trim($line);
			$line = str_replace("\t", " ", $line);

			// Comments
			if (!preg_match('/^[a-zA-Z0-9[]/', $line))
			{
				continue;
			}

			// Sections
			if ($line[0] == '[')
			{
				$tmp        = explode(']', $line);
				$sections[] = trim(substr($tmp[0], 1));
				$i++;
				continue;
			}

			// Key-value pair
			$lineParts = explode('=', $line, 2);
			if (count($lineParts) != 2)
			{
				continue;
			}
			$key   = trim($lineParts[0]);
			$value = trim($lineParts[1]);
			unset($lineParts);

			if (strstr($value, ";"))
			{
				$tmp = explode(';', $value);
				if (count($tmp) == 2)
				{
					if ((($value[0] != '"') && ($value[0] != "'")) ||
						preg_match('/^".*"\s*;/', $value) || preg_match('/^".*;[^"]*$/', $value) ||
						preg_match("/^'.*'\s*;/", $value) || preg_match("/^'.*;[^']*$/", $value)
					)
					{
						$value = $tmp[0];
					}
				}
				else
				{
					if ($value[0] == '"')
					{
						$value = preg_replace('/^"(.*)".*/', '$1', $value);
					}
					elseif ($value[0] == "'")
					{
						$value = preg_replace("/^'(.*)'.*/", '$1', $value);
					}
					else
					{
						$value = $tmp[0];
					}
				}
			}
			$value = trim($value);
			$value = trim($value, "'\"");

			if ($i == 0)
			{
				if (substr($line, -1, 2) == '[]')
				{
					$globals[$key][] = $value;
				}
				else
				{
					$globals[$key] = $value;
				}
			}
			else
			{
				if (substr($line, -1, 2) == '[]')
				{
					$values[$i - 1][$key][] = $value;
				}
				else
				{
					$values[$i - 1][$key] = $value;
				}
			}
		}

		for ($j = 0; $j < $i; $j++)
		{
			if ($process_sections === true)
			{
				if (isset($sections[$j]) && isset($values[$j]))
				{
					$result[$sections[$j]] = $values[$j];
				}
			}
			else
			{
				if (isset($values[$j]))
				{
					$result[] = $values[$j];
				}
			}
		}

		return $result + $globals;
	}

	public static function sprintf($key)
	{
		$text = self::getInstance();
		$args = func_get_args();
		if (count($args) > 0)
		{
			$args[0] = $text->_($args[0]);

			return @call_user_func_array('sprintf', $args);
		}

		return '';
	}

	/**
	 * Singleton pattern for Language
	 *
	 * @return AKText The global AKText instance
	 */
	public static function &getInstance()
	{
		static $instance;

		if (!is_object($instance))
		{
			$instance = new AKText();
		}

		return $instance;
	}

	public static function _($string)
	{
		$text = self::getInstance();

		$key = strtoupper($string);
		$key = substr($key, 0, 1) == '_' ? substr($key, 1) : $key;

		if (isset ($text->strings[$key]))
		{
			$string = $text->strings[$key];
		}
		else
		{
			if (defined($string))
			{
				$string = constant($string);
			}
		}

		return $string;
	}

	public function getBrowserLanguage()
	{
		// Detection code from Full Operating system language detection, by Harald Hope
		// Retrieved from http://techpatterns.com/downloads/php_language_detection.php
		$user_languages = [];
		//check to see if language is set
		if (isset($_SERVER["HTTP_ACCEPT_LANGUAGE"]))
		{
			$languages = strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"]);
			// $languages = ' fr-ch;q=0.3, da, en-us;q=0.8, en;q=0.5, fr;q=0.3';
			// need to remove spaces from strings to avoid error
			$languages = str_replace(' ', '', $languages);
			$languages = explode(",", $languages);

			foreach ($languages as $language_list)
			{
				// pull out the language, place languages into array of full and primary
				// string structure:
				$temp_array = [];
				// slice out the part before ; on first step, the part before - on second, place into array
				$temp_array[0] = substr($language_list, 0, strcspn($language_list, ';'));//full language
				$temp_array[1] = substr($language_list, 0, 2);// cut out primary language
				if ((strlen($temp_array[0]) == 5) && ((substr($temp_array[0], 2, 1) == '-') || (substr($temp_array[0], 2, 1) == '_')))
				{
					$langLocation  = strtoupper(substr($temp_array[0], 3, 2));
					$temp_array[0] = $temp_array[1] . '-' . $langLocation;
				}
				//place this array into main $user_languages language array
				$user_languages[] = $temp_array;
			}
		}
		else// if no languages found
		{
			$user_languages[0] = ['', '']; //return blank array.
		}

		$this->language = null;
		$basename       = basename(__FILE__, '.php') . '.ini';

		// Try to match main language part of the filename, irrespective of the location, e.g. de_DE will do if de_CH doesn't exist.
		if (class_exists('AKUtilsLister'))
		{
			$fs       = new AKUtilsLister();
			$iniFiles = $fs->getFiles(KSROOTDIR, '*.' . $basename);
			if (empty($iniFiles) && ($basename != 'kickstart.ini'))
			{
				$basename = 'kickstart.ini';
				$iniFiles = $fs->getFiles(KSROOTDIR, '*.' . $basename);
			}
		}
		else
		{
			$iniFiles = null;
		}

		if (is_array($iniFiles))
		{
			foreach ($user_languages as $languageStruct)
			{
				if (is_null($this->language))
				{
					// Get files matching the main lang part
					$iniFiles = $fs->getFiles(KSROOTDIR, $languageStruct[1] . '-??.' . $basename);
					if (count($iniFiles) > 0)
					{
						$filename       = $iniFiles[0];
						$filename       = substr($filename, strlen(KSROOTDIR) + 1);
						$this->language = substr($filename, 0, 5);
					}
					else
					{
						$this->language = null;
					}
				}
			}
		}

		if (is_null($this->language))
		{
			// Try to find a full language match
			foreach ($user_languages as $languageStruct)
			{
				if (@file_exists($languageStruct[0] . '.' . $basename) && is_null($this->language))
				{
					$this->language = $languageStruct[0];
				}
			}
		}
		else
		{
			// Do we have an exact match?
			foreach ($user_languages as $languageStruct)
			{
				if (substr($this->language, 0, strlen($languageStruct[1])) == $languageStruct[1])
				{
					if (file_exists($languageStruct[0] . '.' . $basename))
					{
						$this->language = $languageStruct[0];
					}
				}
			}
		}

		// Now, scan for full language based on the partial match

	}

	public function dumpLanguage()
	{
		$out = '';
		foreach ($this->strings as $key => $value)
		{
			$out .= "$key=$value\n";
		}

		return $out;
	}

	public function asJavascript()
	{
		$out = '';
		foreach ($this->strings as $key => $value)
		{
			$key   = addcslashes($key, '\\\'"');
			$value = addcslashes($value, '\\\'"');
			if (!empty($out))
			{
				$out .= ",\n";
			}
			$out .= "'$key':\t'$value'";
		}

		return $out;
	}

	public function resetTranslation()
	{
		$this->strings = $this->default_translation;
	}

	public function addDefaultLanguageStrings($stringList = [])
	{
		if (!is_array($stringList))
		{
			return;
		}
		if (empty($stringList))
		{
			return;
		}

		$this->strings = array_merge($stringList, $this->strings);
	}

	private function loadTranslation($lang = null)
	{
		if (defined('KSLANGDIR'))
		{
			$dirname = KSLANGDIR;
		}
		else
		{
			$dirname = KSROOTDIR;
		}

		$myName   = defined('KSSELFNAME') ? KSSELFNAME : basename(__FILE__);
		$basename = basename($myName, '.php') . '.ini';

		if (empty($lang))
		{
			$lang = $this->language;
		}

		$translationFilename = $dirname . DIRECTORY_SEPARATOR . $lang . '.' . $basename;
		if (!@file_exists($translationFilename) && ($basename != 'kickstart.ini'))
		{
			$basename            = 'kickstart.ini';
			$translationFilename = $dirname . DIRECTORY_SEPARATOR . $lang . '.' . $basename;
		}
		if (!@file_exists($translationFilename))
		{
			return;
		}
		$temp = self::parse_ini_file($translationFilename, false);

		if (!is_array($this->strings))
		{
			$this->strings = [];
		}
		if (empty($temp))
		{
			$this->strings = array_merge($this->default_translation, $this->strings);
		}
		else
		{
			$this->strings = array_merge($this->strings, $temp);
		}
	}
}

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * The Akeeba Kickstart Factory class
 *
 * This class is reponssible for instantiating all Akeeba Kickstart classes
 */
class AKFactory
{
	/** @var   array  A list of instantiated objects */
	private $objectlist = array();

	/** @var   array  Simple hash data storage */
	private $varlist = array();

	/** @var   self   Static instance */
	private static $instance = null;

	/**
	 * AKFactory constructor.
	 *
	 * This is a private constructor makes sure we can't instantiate the class unless we go through the static
	 * getInstance singleton method. This is different than making the class abstract (preventing any kind of object
	 * instantiation).
	 */
	private function __construct()
	{
	}

	/**
	 * Gets a serialized snapshot of the Factory for safekeeping (hibernate)
	 *
	 * @return string The serialized snapshot of the Factory
	 */
	public static function serialize()
	{
		$engine = self::getUnarchiver();
		$engine->shutdown();
		$serialized = serialize(self::getInstance());

		if (function_exists('base64_encode') && function_exists('base64_decode'))
		{
			$serialized = base64_encode($serialized);
		}

		return $serialized;
	}

	/**
	 * Gets the unarchiver engine
	 *
	 * @return AKAbstractUnarchiver
	 */
	public static function &getUnarchiver($configOverride = null)
	{
		static $class_name;

		if (!empty($configOverride) && isset($configOverride['reset']) && $configOverride['reset'])
		{
			$class_name = null;
		}

		if (empty($class_name))
		{
			$filetype = self::get('kickstart.setup.filetype', null);

			if (empty($filetype))
			{
				$filename      = self::get('kickstart.setup.sourcefile', null);
				$basename      = basename($filename);
				$baseextension = strtoupper(substr($basename, -3));

				switch ($baseextension)
				{
					case 'JPA':
						$filetype = 'JPA';
						break;

					case 'JPS':
						$filetype = 'JPS';
						break;

					case 'ZIP':
						$filetype = 'ZIP';
						break;

					default:
						die('Invalid archive type or extension in file ' . $filename);
						break;
				}
			}

			$class_name = 'AKUnarchiver' . ucfirst($filetype);
		}

		$destdir = self::get('kickstart.setup.destdir', null);

		if (empty($destdir))
		{
			$destdir = KSROOTDIR;
		}

		/** @var AKAbstractUnarchiver $object */
		$object = self::getClassInstance($class_name);

		if ($object->getState() == 'init')
		{
			$sourcePath = self::get('kickstart.setup.sourcepath', '');
			$sourceFile = self::get('kickstart.setup.sourcefile', '');

			if (!empty($sourcePath))
			{
				$sourceFile = rtrim($sourcePath, '/\\') . '/' . $sourceFile;
			}

			// Initialize the object –– Any change here MUST be reflected to echoHeadJavascript (default values)
			$config = array(
				'filename'            => $sourceFile,
				'restore_permissions' => self::get('kickstart.setup.restoreperms', 0),
				'post_proc'           => self::get('kickstart.procengine', 'direct'),
				'add_path'            => self::get('kickstart.setup.targetpath', $destdir),
				'remove_path'         => self::get('kickstart.setup.removepath', ''),
				'rename_files'        => self::get('kickstart.setup.renamefiles', array(
					'.htaccess' => 'htaccess.bak', 'php.ini' => 'php.ini.bak', 'web.config' => 'web.config.bak',
					'.user.ini' => '.user.ini.bak',
				)),
				'skip_files'          => self::get('kickstart.setup.skipfiles', array(
					basename(__FILE__), 'kickstart.php', 'abiautomation.ini', 'htaccess.bak', 'php.ini.bak',
					'cacert.pem',
				)),
				'ignoredirectories'   => self::get('kickstart.setup.ignoredirectories', array(
					'tmp', 'log', 'logs',
				)),
			);

			if (!defined('KICKSTART'))
			{
				// In restore.php mode we have to exclude the restoration.php files
				$moreSkippedFiles     = array(
					// Akeeba Backup for Joomla!
					'administrator/components/com_akeeba/restoration.php',
					'administrator/components/com_akeebabackup/restoration.php',
					// Joomla! Update
					'administrator/components/com_joomlaupdate/restoration.php',
					// Akeeba Backup for WordPress
					'wp-content/plugins/akeebabackupwp/app/restoration.php',
					'wp-content/plugins/akeebabackupcorewp/app/restoration.php',
					'wp-content/plugins/akeebabackup/app/restoration.php',
					'wp-content/plugins/akeebabackupwpcore/app/restoration.php',
					// Akeeba Solo
					'app/restoration.php',
				);

				$config['skip_files'] = array_merge($config['skip_files'], $moreSkippedFiles);
			}

			if (!empty($configOverride))
			{
				$config = array_merge($config, $configOverride);
			}

			$object->setup($config);
		}

		return $object;
	}

	// ========================================================================
	// Public factory interface
	// ========================================================================

	public static function get($key, $default = null)
	{
		$self = self::getInstance();

		if (array_key_exists($key, $self->varlist))
		{
			return $self->varlist[$key];
		}

		return $default;
	}

	/**
	 * Gets a single, internally used instance of the Factory
	 *
	 * @param string $serialized_data [optional] Serialized data to spawn the instance from
	 *
	 * @return AKFactory A reference to the unique Factory object instance
	 */
	protected static function &getInstance($serialized_data = null)
	{
		if (!is_object(self::$instance) || !is_null($serialized_data))
		{
			if (!is_null($serialized_data))
			{
				self::$instance = unserialize($serialized_data);

				return self::$instance;
			}

			self::$instance = new self();
		}

		return self::$instance;
	}

	/**
	 * Internal function which instantiates a class named $class_name.
	 * The autoloader
	 *
	 * @param string $class_name
	 *
	 * @return object
	 */
	protected static function &getClassInstance($class_name)
	{
		$self = self::getInstance();

		if (!isset($self->objectlist[$class_name]))
		{
			$self->objectlist[$class_name] = new $class_name;
		}

		return $self->objectlist[$class_name];
	}

	// ========================================================================
	// Public hash data storage interface
	// ========================================================================

	/**
	 * Regenerates the full Factory state from a serialized snapshot (resume)
	 *
	 * @param string $serialized_data The serialized snapshot to resume from
	 */
	public static function unserialize($serialized_data)
	{
		if (function_exists('base64_encode') && function_exists('base64_decode'))
		{
			$serialized_data = base64_decode($serialized_data);
		}

		self::getInstance($serialized_data);
	}

	/**
	 * Reset the internal factory state, freeing all previously created objects
	 */
	public static function nuke()
	{
		self::$instance = null;
	}

	// ========================================================================
	// Akeeba Kickstart classes
	// ========================================================================

	public static function set($key, $value)
	{
		$self                = self::getInstance();
		$self->varlist[$key] = $value;
	}

	/**
	 * Gets the post processing engine
	 *
	 * @param string $proc_engine
	 *
	 * @return AKAbstractPostproc
	 */
	public static function &getPostProc($proc_engine = null)
	{
		static $class_name;

		if (empty($class_name))
		{
			if (empty($proc_engine))
			{
				$proc_engine = self::get('kickstart.procengine', 'direct');
			}

			$class_name = 'AKPostproc' . ucfirst($proc_engine);
		}

		return self::getClassInstance($class_name);
	}

	/**
	 * Get the a reference to the Akeeba Engine's timer
	 *
	 * @return AKCoreTimer
	 */
	public static function &getTimer()
	{
		return self::getClassInstance('AKCoreTimer');
	}

	/**
	 * Get an instance of the filesystem zapper
	 *
	 * @return AKUtilsZapper
	 */
	public static function &getZapper()
	{
		return self::getClassInstance('AKUtilsZapper');
	}
}

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * Interface for AES encryption adapters
 */
interface AKEncryptionAESAdapterInterface
{
	/**
	 * Decrypts a string. Returns the raw binary ciphertext, zero-padded.
	 *
	 * @param   string       $plainText  The plaintext to encrypt
	 * @param   string       $key        The raw binary key (will be zero-padded or chopped if its size is different than the block size)
	 *
	 * @return  string  The raw encrypted binary string.
	 */
	public function decrypt($plainText, $key);

	/**
	 * Returns the encryption block size in bytes
	 *
	 * @return  int
	 */
	public function getBlockSize();

	/**
	 * Is this adapter supported?
	 *
	 * @return  bool
	 */
	public function isSupported();
}

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * Abstract AES encryption class
 */
abstract class AKEncryptionAESAdapterAbstract
{
	/**
	 * Trims or zero-pads a key / IV
	 *
	 * @param   string $key  The key or IV to treat
	 * @param   int    $size The block size of the currently used algorithm
	 *
	 * @return  null|string  Null if $key is null, treated string of $size byte length otherwise
	 */
	public function resizeKey($key, $size)
	{
		if (empty($key))
		{
			return null;
		}

		$keyLength = strlen($key);

		if (function_exists('mb_strlen'))
		{
			$keyLength = mb_strlen($key, 'ASCII');
		}

		if ($keyLength == $size)
		{
			return $key;
		}

		if ($keyLength > $size)
		{
			if (function_exists('mb_substr'))
			{
				return mb_substr($key, 0, $size, 'ASCII');
			}

			return substr($key, 0, $size);
		}

		return $key . str_repeat("\0", ($size - $keyLength));
	}

	/**
	 * Returns null bytes to append to the string so that it's zero padded to the specified block size
	 *
	 * @param   string $string    The binary string which will be zero padded
	 * @param   int    $blockSize The block size
	 *
	 * @return  string  The zero bytes to append to the string to zero pad it to $blockSize
	 */
	protected function getZeroPadding($string, $blockSize)
	{
		$stringSize = strlen($string);

		if (function_exists('mb_strlen'))
		{
			$stringSize = mb_strlen($string, 'ASCII');
		}

		if ($stringSize == $blockSize)
		{
			return '';
		}

		if ($stringSize < $blockSize)
		{
			return str_repeat("\0", $blockSize - $stringSize);
		}

		$paddingBytes = $stringSize % $blockSize;

		return str_repeat("\0", $blockSize - $paddingBytes);
	}
}

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

class Mcrypt extends AKEncryptionAESAdapterAbstract implements AKEncryptionAESAdapterInterface
{
	protected $cipherType = MCRYPT_RIJNDAEL_128;

	protected $cipherMode = MCRYPT_MODE_CBC;

	public function decrypt($cipherText, $key)
	{
		$iv_size    = $this->getBlockSize();
		$key        = $this->resizeKey($key, $iv_size);
		$iv         = substr($cipherText, 0, $iv_size);
		$cipherText = substr($cipherText, $iv_size);
		$plainText  = mcrypt_decrypt($this->cipherType, $key, $cipherText, $this->cipherMode, $iv);

		return $plainText;
	}

	public function isSupported()
	{
		if (!function_exists('mcrypt_get_key_size'))
		{
			return false;
		}

		if (!function_exists('mcrypt_get_iv_size'))
		{
			return false;
		}

		if (!function_exists('mcrypt_create_iv'))
		{
			return false;
		}

		if (!function_exists('mcrypt_encrypt'))
		{
			return false;
		}

		if (!function_exists('mcrypt_decrypt'))
		{
			return false;
		}

		if (!function_exists('mcrypt_list_algorithms'))
		{
			return false;
		}

		if (!function_exists('hash'))
		{
			return false;
		}

		if (!function_exists('hash_algos'))
		{
			return false;
		}

		$algorightms = mcrypt_list_algorithms();

		if (!in_array('rijndael-128', $algorightms))
		{
			return false;
		}

		if (!in_array('rijndael-192', $algorightms))
		{
			return false;
		}

		if (!in_array('rijndael-256', $algorightms))
		{
			return false;
		}

		$algorightms = hash_algos();

		if (!in_array('sha256', $algorightms))
		{
			return false;
		}

		return true;
	}

	public function getBlockSize()
	{
		return mcrypt_get_iv_size($this->cipherType, $this->cipherMode);
	}
}

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

class OpenSSL extends AKEncryptionAESAdapterAbstract implements AKEncryptionAESAdapterInterface
{
	/**
	 * The OpenSSL options for encryption / decryption
	 *
	 * @var  int
	 */
	protected $openSSLOptions = 0;

	/**
	 * The encryption method to use
	 *
	 * @var  string
	 */
	protected $method = 'aes-128-cbc';

	public function __construct()
	{
		$this->openSSLOptions = OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING;
	}

	public function decrypt($cipherText, $key)
	{
		$iv_size    = $this->getBlockSize();
		$key        = $this->resizeKey($key, $iv_size);
		$iv         = substr($cipherText, 0, $iv_size);
		$cipherText = substr($cipherText, $iv_size);
		$plainText  = openssl_decrypt($cipherText, $this->method, $key, $this->openSSLOptions, $iv);

		return $plainText;
	}

	public function isSupported()
	{
		if (!function_exists('openssl_get_cipher_methods'))
		{
			return false;
		}

		if (!function_exists('openssl_random_pseudo_bytes'))
		{
			return false;
		}

		if (!function_exists('openssl_cipher_iv_length'))
		{
			return false;
		}

		if (!function_exists('openssl_encrypt'))
		{
			return false;
		}

		if (!function_exists('openssl_decrypt'))
		{
			return false;
		}

		if (!function_exists('hash'))
		{
			return false;
		}

		if (!function_exists('hash_algos'))
		{
			return false;
		}

		$algorightms = openssl_get_cipher_methods();

		if (!in_array('aes-128-cbc', $algorightms))
		{
			return false;
		}

		$algorightms = hash_algos();

		if (!in_array('sha256', $algorightms))
		{
			return false;
		}

		return true;
	}

	/**
	 * @return int
	 */
	public function getBlockSize()
	{
		return openssl_cipher_iv_length($this->method);
	}
}

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * AES implementation in PHP (c) Chris Veness 2005-2016.
 * Right to use and adapt is granted for under a simple creative commons attribution
 * licence. No warranty of any form is offered.
 *
 * Heavily modified for Akeeba Backup by Nicholas K. Dionysopoulos
 * Also added AES-128 CBC mode (with mcrypt and OpenSSL) on top of AES CTR
 * Removed CTR encrypt / decrypt (no longer used)
 */
class AKEncryptionAES
{
	// Sbox is pre-computed multiplicative inverse in GF(2^8) used in SubBytes and KeyExpansion [�5.1.1]
	protected static $Sbox =
		array(0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
			0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
			0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
			0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
			0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
			0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
			0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
			0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
			0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
			0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
			0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
			0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
			0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
			0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
			0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
			0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16);

	// Rcon is Round Constant used for the Key Expansion [1st col is 2^(r-1) in GF(2^8)] [�5.2]
	protected static $Rcon = array(
		array(0x00, 0x00, 0x00, 0x00),
		array(0x01, 0x00, 0x00, 0x00),
		array(0x02, 0x00, 0x00, 0x00),
		array(0x04, 0x00, 0x00, 0x00),
		array(0x08, 0x00, 0x00, 0x00),
		array(0x10, 0x00, 0x00, 0x00),
		array(0x20, 0x00, 0x00, 0x00),
		array(0x40, 0x00, 0x00, 0x00),
		array(0x80, 0x00, 0x00, 0x00),
		array(0x1b, 0x00, 0x00, 0x00),
		array(0x36, 0x00, 0x00, 0x00));

	protected static $passwords = array();

	/**
	 * The algorithm to use for PBKDF2. Must be a supported hash_hmac algorithm. Default: sha1
	 *
	 * @var  string
	 */
	private static $pbkdf2Algorithm = 'sha1';

	/**
	 * Number of iterations to use for PBKDF2
	 *
	 * @var  int
	 */
	private static $pbkdf2Iterations = 1000;

	/**
	 * Should we use a static salt for PBKDF2?
	 *
	 * @var  int
	 */
	private static $pbkdf2UseStaticSalt = 0;

	/**
	 * The static salt to use for PBKDF2
	 *
	 * @var  string
	 */
	private static $pbkdf2StaticSalt = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";

	/**
	 * AES Cipher function: encrypt 'input' with Rijndael algorithm
	 *
	 * @param   array $input    Message as byte-array (16 bytes)
	 * @param   array $w        key schedule as 2D byte-array (Nr+1 x Nb bytes) -
	 *                          generated from the cipher key by KeyExpansion()
	 *
	 * @return  string  Ciphertext as byte-array (16 bytes)
	 */
	protected static function Cipher($input, $w)
	{
		// main Cipher function [�5.1]
		$Nb = 4;                 // block size (in words): no of columns in state (fixed at 4 for AES)
		$Nr = count($w) / $Nb - 1; // no of rounds: 10/12/14 for 128/192/256-bit keys

		$state = array();  // initialise 4xNb byte-array 'state' with input [�3.4]

		for ($i = 0; $i < 4 * $Nb; $i++)
		{
			$state[$i % 4][floor($i / 4)] = $input[$i];
		}

		$state = self::AddRoundKey($state, $w, 0, $Nb);

		for ($round = 1; $round < $Nr; $round++)
		{  // apply Nr rounds
			$state = self::SubBytes($state, $Nb);
			$state = self::ShiftRows($state, $Nb);
			$state = self::MixColumns($state);
			$state = self::AddRoundKey($state, $w, $round, $Nb);
		}

		$state = self::SubBytes($state, $Nb);
		$state = self::ShiftRows($state, $Nb);
		$state = self::AddRoundKey($state, $w, $Nr, $Nb);

		$output = array(4 * $Nb);  // convert state to 1-d array before returning [�3.4]

		for ($i = 0; $i < 4 * $Nb; $i++)
		{
			$output[$i] = $state[$i % 4][floor($i / 4)];
		}

		return $output;
	}

	protected static function AddRoundKey($state, $w, $rnd, $Nb)
	{
		// xor Round Key into state S [�5.1.4]
		for ($r = 0; $r < 4; $r++)
		{
			for ($c = 0; $c < $Nb; $c++)
			{
				$state[$r][$c] ^= $w[$rnd * 4 + $c][$r];
			}
		}

		return $state;
	}

	protected static function SubBytes($s, $Nb)
	{
		// apply SBox to state S [�5.1.1]
		for ($r = 0; $r < 4; $r++)
		{
			for ($c = 0; $c < $Nb; $c++)
			{
				$s[$r][$c] = self::$Sbox[$s[$r][$c]];
			}
		}

		return $s;
	}

	protected static function ShiftRows($s, $Nb)
	{
		// shift row r of state S left by r bytes [�5.1.2]
		$t = array(4);

		for ($r = 1; $r < 4; $r++)
		{
			for ($c = 0; $c < 4; $c++)
			{
				$t[$c] = $s[$r][($c + $r) % $Nb];
			}  // shift into temp copy

			for ($c = 0; $c < 4; $c++)
			{
				$s[$r][$c] = $t[$c];
			}         // and copy back
		}          // note that this will work for Nb=4,5,6, but not 7,8 (always 4 for AES):

		return $s;  // see fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.311.pdf
	}

	protected static function MixColumns($s)
	{
		// combine bytes of each col of state S [�5.1.3]
		for ($c = 0; $c < 4; $c++)
		{
			$a = array(4);  // 'a' is a copy of the current column from 's'
			$b = array(4);  // 'b' is a�{02} in GF(2^8)

			for ($i = 0; $i < 4; $i++)
			{
				$a[$i] = $s[$i][$c];
				$b[$i] = $s[$i][$c] & 0x80 ? $s[$i][$c] << 1 ^ 0x011b : $s[$i][$c] << 1;
			}

			// a[n] ^ b[n] is a�{03} in GF(2^8)
			$s[0][$c] = $b[0] ^ $a[1] ^ $b[1] ^ $a[2] ^ $a[3]; // 2*a0 + 3*a1 + a2 + a3
			$s[1][$c] = $a[0] ^ $b[1] ^ $a[2] ^ $b[2] ^ $a[3]; // a0 * 2*a1 + 3*a2 + a3
			$s[2][$c] = $a[0] ^ $a[1] ^ $b[2] ^ $a[3] ^ $b[3]; // a0 + a1 + 2*a2 + 3*a3
			$s[3][$c] = $a[0] ^ $b[0] ^ $a[1] ^ $a[2] ^ $b[3]; // 3*a0 + a1 + a2 + 2*a3
		}

		return $s;
	}

	/**
	 * Key expansion for Rijndael Cipher(): performs key expansion on cipher key
	 * to generate a key schedule
	 *
	 * @param   array $key Cipher key byte-array (16 bytes)
	 *
	 * @return  array  Key schedule as 2D byte-array (Nr+1 x Nb bytes)
	 */
	protected static function KeyExpansion($key)
	{
		// generate Key Schedule from Cipher Key [�5.2]

		// block size (in words): no of columns in state (fixed at 4 for AES)
		$Nb = 4;
		// key length (in words): 4/6/8 for 128/192/256-bit keys
		$Nk = (int) (count($key) / 4);
		// no of rounds: 10/12/14 for 128/192/256-bit keys
		$Nr = $Nk + 6;

		$w    = array();
		$temp = array();

		for ($i = 0; $i < $Nk; $i++)
		{
			$r     = array($key[4 * $i], $key[4 * $i + 1], $key[4 * $i + 2], $key[4 * $i + 3]);
			$w[$i] = $r;
		}

		for ($i = $Nk; $i < ($Nb * ($Nr + 1)); $i++)
		{
			$w[$i] = array();
			for ($t = 0; $t < 4; $t++)
			{
				$temp[$t] = $w[$i - 1][$t];
			}
			if ($i % $Nk == 0)
			{
				$temp = self::SubWord(self::RotWord($temp));
				for ($t = 0; $t < 4; $t++)
				{
					$rConIndex = (int) ($i / $Nk);
					$temp[$t] ^= self::$Rcon[$rConIndex][$t];
				}
			}
			else if ($Nk > 6 && $i % $Nk == 4)
			{
				$temp = self::SubWord($temp);
			}
			for ($t = 0; $t < 4; $t++)
			{
				$w[$i][$t] = $w[$i - $Nk][$t] ^ $temp[$t];
			}
		}

		return $w;
	}

	protected static function SubWord($w)
	{
		// apply SBox to 4-byte word w
		for ($i = 0; $i < 4; $i++)
		{
			$w[$i] = self::$Sbox[$w[$i]];
		}

		return $w;
	}

	/*
	 * Unsigned right shift function, since PHP has neither >>> operator nor unsigned ints
	 *
	 * @param a  number to be shifted (32-bit integer)
	 * @param b  number of bits to shift a to the right (0..31)
	 * @return   a right-shifted and zero-filled by b bits
	 */

	protected static function RotWord($w)
	{
		// rotate 4-byte word w left by one byte
		$tmp = $w[0];
		for ($i = 0; $i < 3; $i++)
		{
			$w[$i] = $w[$i + 1];
		}
		$w[3] = $tmp;

		return $w;
	}

	protected static function urs($a, $b)
	{
		$a &= 0xffffffff;
		$b &= 0x1f;  // (bounds check)
		if ($a & 0x80000000 && $b > 0)
		{   // if left-most bit set
			$a = ($a >> 1) & 0x7fffffff;   //   right-shift one bit & clear left-most bit
			$a = $a >> ($b - 1);           //   remaining right-shifts
		}
		else
		{                       // otherwise
			$a = ($a >> $b);               //   use normal right-shift
		}

		return $a;
	}

	/**
	 * AES decryption in CBC mode. This is the standard mode (the CTR methods
	 * actually use Rijndael-128 in CTR mode, which - technically - isn't AES).
	 *
	 * It supports AES-128 only. It assumes that the last 4 bytes
	 * contain a little-endian unsigned long integer representing the unpadded
	 * data length.
	 *
	 * @since  3.0.1
	 * @author Nicholas K. Dionysopoulos
	 *
	 * @param   string $ciphertext The data to encrypt
	 * @param   string $password   Encryption password
	 *
	 * @return  string  The plaintext
	 */
	public static function AESDecryptCBC($ciphertext, $password)
	{
		$adapter = self::getAdapter();

		if (!$adapter->isSupported())
		{
			return false;
		}

		// Read the data size
		$data_size = unpack('V', substr($ciphertext, -4));

		// Do I have a PBKDF2 salt?
		$salt             = substr($ciphertext, -92, 68);
		$rightStringLimit = -4;

		$params        = self::getKeyDerivationParameters();
		$keySizeBytes  = $params['keySize'];
		$algorithm     = $params['algorithm'];
		$iterations    = $params['iterations'];
		$useStaticSalt = $params['useStaticSalt'];

		if (substr($salt, 0, 4) == 'JPST')
		{
			// We have a stored salt. Retrieve it and tell decrypt to process the string minus the last 44 bytes
			// (4 bytes for JPST, 16 bytes for the salt, 4 bytes for JPIV, 16 bytes for the IV, 4 bytes for the
			// uncompressed string length - note that using PBKDF2 means we're also using a randomized IV per the
			// format specification).
			$salt             = substr($salt, 4);
			$rightStringLimit -= 68;

			$key          = self::pbkdf2($password, $salt, $algorithm, $iterations, $keySizeBytes);
		}
		elseif ($useStaticSalt)
		{
			// We have a static salt. Use it for PBKDF2.
			$key = self::getStaticSaltExpandedKey($password);
		}
		else
		{
			// Get the expanded key from the password. THIS USES THE OLD, INSECURE METHOD.
			$key = self::expandKey($password);
		}

		// Try to get the IV from the data
		$iv               = substr($ciphertext, -24, 20);

		if (substr($iv, 0, 4) == 'JPIV')
		{
			// We have a stored IV. Retrieve it and tell mdecrypt to process the string minus the last 24 bytes
			// (4 bytes for JPIV, 16 bytes for the IV, 4 bytes for the uncompressed string length)
			$iv               = substr($iv, 4);
			$rightStringLimit -= 20;
		}
		else
		{
			// No stored IV. Do it the dumb way.
			$iv = self::createTheWrongIV($password);
		}

		// Decrypt
		$plaintext = $adapter->decrypt($iv . substr($ciphertext, 0, $rightStringLimit), $key);

		// Trim padding, if necessary
		if (strlen($plaintext) > $data_size)
		{
			$plaintext = substr($plaintext, 0, $data_size);
		}

		return $plaintext;
	}

	/**
	 * That's the old way of creating an IV that's definitely not cryptographically sound.
	 *
	 * DO NOT USE, EVER, UNLESS YOU WANT TO DECRYPT LEGACY DATA
	 *
	 * @param   string $password The raw password from which we create an IV in a super bozo way
	 *
	 * @return  string  A 16-byte IV string
	 */
	public static function createTheWrongIV($password)
	{
		static $ivs = array();

		$key = md5($password);

		if (!isset($ivs[$key]))
		{
			$nBytes  = 16;  // AES uses a 128 -bit (16 byte) block size, hence the IV size is always 16 bytes
			$pwBytes = array();
			for ($i = 0; $i < $nBytes; $i++)
			{
				$pwBytes[$i] = ord(substr($password, $i, 1)) & 0xff;
			}
			$iv    = self::Cipher($pwBytes, self::KeyExpansion($pwBytes));
			$newIV = '';
			foreach ($iv as $int)
			{
				$newIV .= chr($int);
			}

			$ivs[$key] = $newIV;
		}

		return $ivs[$key];
	}

	/**
	 * Expand the password to an appropriate 128-bit encryption key
	 *
	 * @param   string $password
	 *
	 * @return  string
	 *
	 * @since   5.2.0
	 * @author  Nicholas K. Dionysopoulos
	 */
	public static function expandKey($password)
	{
		// Try to fetch cached key or create it if it doesn't exist
		$nBits     = 128;
		$lookupKey = md5($password . '-' . $nBits);

		if (array_key_exists($lookupKey, self::$passwords))
		{
			$key = self::$passwords[$lookupKey];

			return $key;
		}

		// use AES itself to encrypt password to get cipher key (using plain password as source for
		// key expansion) - gives us well encrypted key.
		$nBytes  = $nBits / 8; // Number of bytes in key
		$pwBytes = array();

		for ($i = 0; $i < $nBytes; $i++)
		{
			$pwBytes[$i] = ord(substr($password, $i, 1)) & 0xff;
		}

		$key    = self::Cipher($pwBytes, self::KeyExpansion($pwBytes));
		$key    = array_merge($key, array_slice($key, 0, $nBytes - 16)); // expand key to 16/24/32 bytes long
		$newKey = '';

		foreach ($key as $int)
		{
			$newKey .= chr($int);
		}

		$key = $newKey;

		self::$passwords[$lookupKey] = $key;

		return $key;
	}

	/**
	 * Returns the correct AES-128 CBC encryption adapter
	 *
	 * @return  AKEncryptionAESAdapterInterface
	 *
	 * @since   5.2.0
	 * @author  Nicholas K. Dionysopoulos
	 */
	public static function getAdapter()
	{
		static $adapter = null;

		if (is_object($adapter) && ($adapter instanceof AKEncryptionAESAdapterInterface))
		{
			return $adapter;
		}

		$adapter = new OpenSSL();

		if (!$adapter->isSupported())
		{
			$adapter = new Mcrypt();
		}

		return $adapter;
	}

	/**
	 * @return string
	 */
	public static function getPbkdf2Algorithm()
	{
		return self::$pbkdf2Algorithm;
	}

	/**
	 * @param string $pbkdf2Algorithm
	 * @return void
	 */
	public static function setPbkdf2Algorithm($pbkdf2Algorithm)
	{
		self::$pbkdf2Algorithm = $pbkdf2Algorithm;
	}

	/**
	 * @return int
	 */
	public static function getPbkdf2Iterations()
	{
		return self::$pbkdf2Iterations;
	}

	/**
	 * @param int $pbkdf2Iterations
	 * @return void
	 */
	public static function setPbkdf2Iterations($pbkdf2Iterations)
	{
		self::$pbkdf2Iterations = $pbkdf2Iterations;
	}

	/**
	 * @return int
	 */
	public static function getPbkdf2UseStaticSalt()
	{
		return self::$pbkdf2UseStaticSalt;
	}

	/**
	 * @param int $pbkdf2UseStaticSalt
	 * @return void
	 */
	public static function setPbkdf2UseStaticSalt($pbkdf2UseStaticSalt)
	{
		self::$pbkdf2UseStaticSalt = $pbkdf2UseStaticSalt;
	}

	/**
	 * @return string
	 */
	public static function getPbkdf2StaticSalt()
	{
		return self::$pbkdf2StaticSalt;
	}

	/**
	 * @param string $pbkdf2StaticSalt
	 * @return void
	 */
	public static function setPbkdf2StaticSalt($pbkdf2StaticSalt)
	{
		self::$pbkdf2StaticSalt = $pbkdf2StaticSalt;
	}

	/**
	 * Get the parameters fed into PBKDF2 to expand the user password into an encryption key. These are the static
	 * parameters (key size, hashing algorithm and number of iterations). A new salt is used for each encryption block
	 * to minimize the risk of attacks against the password.
	 *
	 * @return  array
	 */
	public static function getKeyDerivationParameters()
	{
		return array(
			'keySize'       => 16,
			'algorithm'     => self::$pbkdf2Algorithm,
			'iterations'    => self::$pbkdf2Iterations,
			'useStaticSalt' => self::$pbkdf2UseStaticSalt,
			'staticSalt'    => self::$pbkdf2StaticSalt,
		);
	}

	/**
	 * PBKDF2 key derivation function as defined by RSA's PKCS #5: https://www.ietf.org/rfc/rfc2898.txt
	 *
	 * Test vectors can be found here: https://www.ietf.org/rfc/rfc6070.txt
	 *
	 * This implementation of PBKDF2 was originally created by https://defuse.ca
	 * With improvements by http://www.variations-of-shadow.com
	 * Modified for Akeeba Engine by Akeeba Ltd (removed unnecessary checks to make it faster)
	 *
	 * @param   string  $password    The password.
	 * @param   string  $salt        A salt that is unique to the password.
	 * @param   string  $algorithm   The hash algorithm to use. Default is sha1.
	 * @param   int     $count       Iteration count. Higher is better, but slower. Default: 1000.
	 * @param   int     $key_length  The length of the derived key in bytes.
	 *
	 * @return  string  A string of $key_length bytes
	 */
	public static function pbkdf2($password, $salt, $algorithm = 'sha1', $count = 1000, $key_length = 16)
	{
		if (function_exists("hash_pbkdf2"))
		{
			return hash_pbkdf2($algorithm, $password, $salt, $count, $key_length, true);
		}

		$hash_length = akstringlen(hash($algorithm, "", true));
		$block_count = ceil($key_length / $hash_length);

		$output = "";

		for ($i = 1; $i <= $block_count; $i++)
		{
			// $i encoded as 4 bytes, big endian.
			$last = $salt . pack("N", $i);

			// First iteration
			$xorResult = hash_hmac($algorithm, $last, $password, true);
			$last      = $xorResult;

			// Perform the other $count - 1 iterations
			for ($j = 1; $j < $count; $j++)
			{
				$last = hash_hmac($algorithm, $last, $password, true);
				$xorResult ^= $last;
			}

			$output .= $xorResult;
		}

		return aksubstr($output, 0, $key_length);
	}

	/**
	 * Get the expanded key from the user supplied password using a static salt. The results are cached for performance
	 * reasons.
	 *
	 * @param   string  $password  The user-supplied password, UTF-8 encoded.
	 *
	 * @return  string  The expanded key
	 */
	private static function getStaticSaltExpandedKey($password)
	{
		$params        = self::getKeyDerivationParameters();
		$keySizeBytes  = $params['keySize'];
		$algorithm     = $params['algorithm'];
		$iterations    = $params['iterations'];
		$staticSalt    = $params['staticSalt'];

		$lookupKey = "PBKDF2-$algorithm-$iterations-" . md5($password . $staticSalt);

		if (!array_key_exists($lookupKey, self::$passwords))
		{
			self::$passwords[$lookupKey] = self::pbkdf2($password, $staticSalt, $algorithm, $iterations, $keySizeBytes);
		}

		return self::$passwords[$lookupKey];
	}

}

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * A timing safe equals comparison
 *
 * @param   string  $safe  The internal (safe) value to be checked
 * @param   string  $user  The user submitted (unsafe) value
 *
 * @return  boolean  True if the two strings are identical.
 *
 * @see     http://blog.ircmaxell.com/2014/11/its-all-about-time.html
 */
function timingSafeEquals($safe, $user)
{
	$safeLen = strlen($safe);
	$userLen = strlen($user);

	if ($userLen != $safeLen)
	{
		return false;
	}

	$result = 0;

	for ($i = 0; $i < $userLen; $i++)
	{
		$result |= (ord($safe[$i]) ^ ord($user[$i]));
	}

	// They are only identical strings if $result is exactly 0...
	return $result === 0;
}

/**
 * The Master Setup will read the configuration parameters from restoration.php or
 * the JSON-encoded "configuration" input variable and return the status.
 *
 * @return bool True if the master configuration was applied to the Factory object
 */
function masterSetup()
{
	// ------------------------------------------------------------
	// 1. Import basic setup parameters
	// ------------------------------------------------------------

	$ini_data = null;

	// In restore.php mode, require restoration.php or fail
	if (!defined('KICKSTART'))
	{
		// This is the standalone mode, used by Akeeba Backup Professional. It looks for a restoration.php
		// file to perform its magic. If the file is not there, we will abort.
		$setupFile = 'restoration.php';

		if (!file_exists($setupFile))
		{
			AKFactory::set('kickstart.enabled', false);

			return false;
		}

		/**
		 * If the setup file was created more than 1.5 hours ago we can assume that it's stale and someone forgot to
		 * remove it from the server. This hinders brute force attacks against the Kickstart password. Even a simple
		 * 8 character simple alphanum (a-z, 0-9) password yields over 2.8e12. Assuming a very fast server which can
		 * serve 100 requests to restore.php per second and an easy to attack password requiring going over just 1% of
		 * the search space it'd still take over 282 million seconds to brute force it. Our limit is more than 4 orders
		 * of magnitude lower than this best practical case scenario, giving us adequate protection against all but the
		 * luckiest attacker (spoiler alert: the mathematics of probabilities say you're not gonna get lucky).
		 *
		 * It is still advisable to remove the restoration.php file once you are done with the extraction. This check
		 * here is only meant as a failsafe in case of a server error during the extraction and subsequent lack of user
		 * action to remove the restoration.php file from their server.
		 */
		$setupFieCreationTime = filectime($setupFile);

		if (abs(time() - $setupFieCreationTime) > 5400)
		{
			AKFactory::set('kickstart.enabled', false);

			return false;
		}

		// Load restoration.php. It creates a global variable named $restoration_setup
		require_once $setupFile;

		$ini_data = $restoration_setup;

		if (empty($ini_data))
		{
			// No parameters fetched. Darn, how am I supposed to work like that?!
			AKFactory::set('kickstart.enabled', false);

			return false;
		}

		AKFactory::set('kickstart.enabled', true);
	}
	else
	{
		// Maybe we have $restoration_setup defined in the head of kickstart.php
		global $restoration_setup;

		if (!empty($restoration_setup) && !is_array($restoration_setup))
		{
			$ini_data = AKText::parse_ini_file($restoration_setup, false, true);
		}
		elseif (is_array($restoration_setup))
		{
			$ini_data = $restoration_setup;
		}
	}

	// Import any data from $restoration_setup
	if (!empty($ini_data))
	{
		foreach ($ini_data as $key => $value)
		{
			AKFactory::set($key, $value);
		}
		AKFactory::set('kickstart.enabled', true);
	}

	// Reinitialize $ini_data
	$ini_data = null;

	/**
	 * August 2018. Some third party developer with a dubious skill level (or complete lack thereof) wrote a piece of
	 * code which uses restore.php with an empty password (and never deleted the restoration.php file he created).
	 * According to his code comments he did this because he couldn't figure out how to make encrypted requests work,
	 * DESPITE THE FACT that com_joomlaupdate (part of Joomla! itself) has working code which does EXACTLY THAT. >:-o
	 *
	 * As a result of his actions all sites running his software have a massive vulnerability inflicted upon them. An
	 * attacker can absuse the (unlocked) restore.php to upload and install any arbitrary code in a ZIP archive,
	 * possibly overwriting core code. Discovering this problem takes a few seconds and there is code which is doing
	 * exactly that published years ago (during the active maintenance period of Joomla! 3.4, that long ago).
	 *
	 * This bit of code here detects an empty password and disables restore.php. His badly written software fails to
	 * execute and, most importantly, the unlucky users of his software will no longer have a remote code upload /
	 * remote code execution vulnerability on their sites.
	 *
	 * Remember, people, if you can't be bothered to take web application security seriously DO NOT SELL WEB SOFTWARE
	 * FOR A LIVING. There are other honest jobs you can do which don't involve using a computer in a dangerous and
	 * irresponsible manner.
	 */
	$password = AKFactory::get('kickstart.security.password', null);

	if (empty($password) || (trim($password) == '') || (strlen(trim($password)) < 10))
	{
		AKFactory::set('kickstart.enabled', false);

		return false;
	}


	// ------------------------------------------------------------
	// 2. Explode JSON parameters into $_REQUEST scope
	// ------------------------------------------------------------

	// Detect a JSON string in the request variable and store it.
	$json = getQueryParam('json', null);

	// Detect a password in the request variable and store it.
	$userPassword = getQueryParam('password', '');

	// Remove everything from the request, post and get arrays
	if (!empty($_REQUEST))
	{
		foreach ($_REQUEST as $key => $value)
		{
			unset($_REQUEST[$key]);
		}
	}

	if (!empty($_POST))
	{
		foreach ($_POST as $key => $value)
		{
			unset($_POST[$key]);
		}
	}

	if (!empty($_GET))
	{
		foreach ($_GET as $key => $value)
		{
			unset($_GET[$key]);
		}
	}

	// Authentication - Akeeba Restore 5.4.0 or later
	$password = AKFactory::get('kickstart.security.password', null);
	$isAuthenticated = false;

	/**
	 * Akeeba Restore 5.3.1 and earlier use a custom implementation of AES-128 in CTR mode to encrypt the JSON data
	 * between client and server. This is not used as a means to maintain secrecy (it's symmetrical encryption and the
	 * key is, by necessity, transmitted with the HTML page to the client). It's meant as a form of authentication, so
	 * that the server part can ensure that it only receives commands by an authorized client.
	 *
	 * The downside is that encryption in CTR mode (like CBC) is an all-or-nothing affair. This opens the possibility
	 * for a padding oracle attack (https://en.wikipedia.org/wiki/Padding_oracle_attack). While Akeeba Restore was
	 * hardened in 2014 to prevent the bulk of suck attacks it is still possible to attack the encryption using a very
	 * large number of requests (several dozens of thousands).
	 *
	 * Since Akeeba Restore 5.4.0 we have removed this authentication method and replaced it with the transmission of a
	 * very large length password. On the server side we use a timing safe password comparison. By its very nature, it
	 * will only leak the (well known, constant and large) length of the password but no more information about the
	 * password itself. See http://blog.ircmaxell.com/2014/11/its-all-about-time.html  As a result this form of
	 * authentication is many orders of magnitude harder to crack than regular encryption.
	 *
	 * Now you may wonder "how is sending a password in the clear hardier than encryption?". If you ask that question
	 * you were not paying attention. The password needs to be known by BOTH the server AND the client (browser). Since
	 * this password is generated programmatically by the server, it MUST be sent to the client by the server. If an
	 * attacker is able to intercept this transmission (man in the middle attack) using encryption is irrelevant: the
	 * attacker already knows your password. This situation also applies when the user sends their own password to the
	 * server, e.g. when logging into their site. The ONLY way to avoid security issues regarding information being
	 * stolen in transit is using HTTPS with a commercially signed SSL certificate. Unlike 2008, when Kickstart was
	 * originally written, obtaining such a certificate nowadays is trivial and costs absolutely nothing thanks to Let's
	 * Encrypt (https://letsencrypt.org/).
	 *
	 * TL;DR: Use HTTPS with a commercially signed SSL certificate, e.g. a free certificate from Let's Encrypt. Client-
	 * side cryptography does NOT protect you against an attacker (see
	 * https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2011/august/javascript-cryptography-considered-harmful/).
	 * Moreover, sending a plaintext password is safer than relying on client-side encryption for authentication as it
	 * removes the possibility of an attacker inferring the contents of the authentication key (password) in a relatively
	 * easy and automated manner.
	 */
	if (!empty($password))
	{
		// Timing-safe password comparison. See http://blog.ircmaxell.com/2014/11/its-all-about-time.html
		if (!timingSafeEquals($password, $userPassword))
		{
			die('###{"status":false,"message":"Invalid login"}###');
		}
	}

	// No JSON data? Die.
	if (empty($json))
	{
		die('###{"status":false,"message":"Invalid JSON data"}###');
	}

	// Handle the JSON string
	$raw = json_decode($json, true);

	// Invalid JSON data?
	if (empty($raw))
	{
		die('###{"status":false,"message":"Invalid JSON data"}###');
	}

	// Pass all JSON data to the request array
	if (!empty($raw))
	{
		foreach ($raw as $key => $value)
		{
			$_REQUEST[$key] = $value;
		}
	}

	// ------------------------------------------------------------
	// 3. Try the "factory" variable
	// ------------------------------------------------------------
	// A "factory" variable will override all other settings.
	$serialized = getQueryParam('factory', null);

	if (!is_null($serialized))
	{
		// Get the serialized factory
		AKFactory::unserialize($serialized);
		AKFactory::set('kickstart.enabled', true);

		return true;
	}

	// ------------------------------------------------------------
	// 4. Try the configuration variable for Kickstart
	// ------------------------------------------------------------
	if (defined('KICKSTART'))
	{
		$configuration = getQueryParam('configuration');

		if (!is_null($configuration))
		{
			// Let's decode the configuration from JSON to array
			$ini_data = json_decode($configuration, true);
		}
		else
		{
			// Neither exists. Enable Kickstart's interface anyway.
			$ini_data = array('kickstart.enabled' => true);
		}

		// Import any INI data we might have from other sources
		if (!empty($ini_data))
		{
			foreach ($ini_data as $key => $value)
			{
				AKFactory::set($key, $value);
			}

			AKFactory::set('kickstart.enabled', true);

			return true;
		}
	}
}

/**
 * Akeeba Restore
 * An AJAX-powered archive extraction library for JPA, JPS and ZIP archives
 *
 * @package   restore
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Mini-controller for restore.php
if (!defined('KICKSTART'))
{
	// The observer class, used to report number of files and bytes processed
	class RestorationObserver extends AKAbstractPartObserver
	{
		public $compressedTotal = 0;
		public $uncompressedTotal = 0;
		public $filesProcessed = 0;

		public function update($object, $message)
		{
			if (!is_object($message))
			{
				return;
			}

			if (!array_key_exists('type', get_object_vars($message)))
			{
				return;
			}

			if ($message->type == 'startfile')
			{
				$this->filesProcessed++;
				$this->compressedTotal += $message->content->compressed;
				$this->uncompressedTotal += $message->content->uncompressed;
			}
		}

		public function __toString()
		{
			return __CLASS__;
		}

	}

	// Import configuration
	masterSetup();

	$retArray = array(
		'status'  => true,
		'message' => null
	);

	$enabled = AKFactory::get('kickstart.enabled', false);

	if ($enabled)
	{
		$task = getQueryParam('task');

		switch ($task)
		{
			case 'ping':
				// ping task - really does nothing!
				$timer = AKFactory::getTimer();
				$timer->enforce_min_exec_time();
				break;

			/**
			 * There are two separate steps here since we were using an inefficient restoration initialization method in
			 * the past. Now both startRestore and stepRestore are identical. The difference in behavior depends
			 * exclusively on the calling Javascript. If no serialized factory was passed in the request then we start a
			 * new restoration. If a serialized factory was passed in the request then the restoration is resumed. For
			 * this reason we should NEVER call AKFactory::nuke() in startRestore anymore: that would simply reset the
			 * extraction engine configuration which was done in masterSetup() leading to an error about the file being
			 * invalid (since no file is found).
			 */
			case 'startRestore':
			case 'stepRestore':
				if ($task == 'startRestore')
				{
					// Fetch path to the site root from the restoration.php file, so we can tell the engine where it should operate
					$siteRoot = AKFactory::get('kickstart.setup.destdir', '');

					// Before starting, read and save any custom AddHandler directive
					$phpHandlers = getPhpHandlers($siteRoot);
					AKFactory::set('kickstart.setup.phphandlers', $phpHandlers);

					// If the Stealth Mode is enabled, create the .htaccess file
					if (AKFactory::get('kickstart.stealth.enable', false))
					{
						createStealthURL($siteRoot);
					}
					// No stealth mode, but we have custom handler directives, must write our own file
					elseif ($phpHandlers)
					{
						writePhpHandlers($siteRoot);
					}
				}

				/**
				 * First try to run the filesystem zapper (remove all existing files and folders). If the Zapper is
				 * disabled or has already finished running we will get a FALSE result. Otherwise it's a status array
				 * which we can pass directly back to the caller.
				 */
				$ret = runZapper();

				// If the Zapper had a step to run we stop here and return its status array to the caller.
				if ($ret !== false)
				{
					$retArray = array_merge($retArray, $ret);

					break;
				}

				$engine   = AKFactory::getUnarchiver(); // Get the engine
				$observer = new RestorationObserver(); // Create a new observer
				$engine->attach($observer); // Attach the observer
				$engine->tick();
				$ret = $engine->getStatusArray();

				if ($ret['Error'] != '')
				{
					$retArray['status']  = false;
					$retArray['done']    = true;
					$retArray['message'] = $ret['Error'];
				}
				elseif (!$ret['HasRun'])
				{
					$retArray['files']    = $observer->filesProcessed;
					$retArray['bytesIn']  = $observer->compressedTotal;
					$retArray['bytesOut'] = $observer->uncompressedTotal;
					$retArray['status']   = true;
					$retArray['done']     = true;
				}
				else
				{
					$retArray['files']    = $observer->filesProcessed;
					$retArray['bytesIn']  = $observer->compressedTotal;
					$retArray['bytesOut'] = $observer->uncompressedTotal;
					$retArray['status']   = true;
					$retArray['done']     = false;
					$retArray['factory']  = AKFactory::serialize();
				}

				$timer = AKFactory::getTimer();
				$timer->enforce_min_exec_time();

				break;

			case 'finalizeRestore':
				$root = AKFactory::get('kickstart.setup.destdir');
				// Remove the installation directory
				recursive_remove_directory($root . '/installation');

				$postproc = AKFactory::getPostProc();

				/**
				 * Should I rename the htaccess.bak and web.config.bak files back to their live filenames...?
				 */
				$renameFiles = AKFactory::get('kickstart.setup.postrenamefiles', true);

				if ($renameFiles)
				{
					// Rename htaccess.bak to .htaccess
					if (file_exists($root . '/htaccess.bak'))
					{
						if (file_exists($root . '/.htaccess'))
						{
							$postproc->unlink($root . '/.htaccess');
						}

						$postproc->rename($root . '/htaccess.bak', $root . '/.htaccess');
					}

					// Rename htaccess.bak to .htaccess
					if (file_exists($root . '/web.config.bak'))
					{
						if (file_exists($root . '/web.config'))
						{
							$postproc->unlink($root . '/web.config');
						}

						$postproc->rename($root . '/web.config.bak', $root . '/web.config');
					}
				}

				// Remove restoration.php
				$basepath = KSROOTDIR;
				$basepath = rtrim(str_replace('\\', '/', $basepath), '/');

				if (!empty($basepath))
				{
					$basepath .= '/';
				}

				$postproc->unlink($basepath . 'restoration.php');
				clearFileInOPCache($basepath . 'restoration.php');

				// Import a custom finalisation file
				$filename = dirname(__FILE__) . '/restore_finalisation.php';

				if (file_exists($filename))
				{
					// opcode cache busting before including the filename
					if (function_exists('opcache_invalidate'))
					{
						opcache_invalidate($filename, true);
					}

					if (function_exists('apc_compile_file'))
					{
						apc_compile_file($filename);
					}

					if (function_exists('wincache_refresh_if_changed'))
					{
						wincache_refresh_if_changed([$filename]);
					}

					if (function_exists('xcache_asm'))
					{
						xcache_asm($filename);
					}

					include_once $filename;
				}

				// Run a custom finalisation script
				if (function_exists('finalizeRestore'))
				{
					finalizeRestore($root, $basepath);
				}

				break;

			default:
				// Invalid task!
				$enabled = false;
				break;
		}
	}

	// Maybe we weren't authorized or the task was invalid?
	if (!$enabled)
	{
		// Maybe the user failed to enter any information
		$retArray['status']  = false;
		$retArray['message'] = AKText::_('ERR_INVALID_LOGIN');
	}

	// JSON encode the message
	$json = json_encode($retArray);

	// Return the message
	echo "###$json###";

}

// ------------ lixlpixel recursive PHP functions -------------
// recursive_remove_directory( directory to delete, empty )
// expects path to directory and optional TRUE / FALSE to empty
// of course PHP has to have the rights to delete the directory
// you specify and all files and folders inside the directory
// ------------------------------------------------------------
function recursive_remove_directory($directory)
{
	// if the path has a slash at the end we remove it here
	if (substr($directory, -1) == '/')
	{
		$directory = substr($directory, 0, -1);
	}

	// if the path is not valid or is not a directory ...
	if (!file_exists($directory) || !is_dir($directory))
	{
		// ... we return false and exit the function
		return false;
		// ... if the path is not readable
	}
	elseif (!is_readable($directory))
	{
		// ... we return false and exit the function
		return false;
		// ... else if the path is readable
	}
	else
	{
		// we open the directory
		$handle   = opendir($directory);
		$postproc = AKFactory::getPostProc();

		// and scan through the items inside
		while (false !== ($item = readdir($handle)))
		{
			// if the filepointer is not the current directory
			// or the parent directory

			if ($item != '.' && $item != '..')
			{
				// we build the new path to delete
				$path = $directory . '/' . $item;

				// if the new path is a directory
				if (is_dir($path))
				{
					// we call this function with the new path
					recursive_remove_directory($path);
					// if the new path is a file
				}
				else
				{
					// we remove the file
					$postproc->unlink($path);
					clearFileInOPCache($path);
				}
			}
		}

		// close the directory
		closedir($handle);

		// try to delete the now empty directory
		if (!$postproc->rmdir($directory))
		{
			// return false if not possible
			return false;
		}

		// return success
		return true;
	}
}

function createStealthURL($siteRoot = '')
{
	$filename = AKFactory::get('kickstart.stealth.url', '');

	// We need an HTML file!
	if (empty($filename))
	{
		return;
	}

	// Make sure it ends in .html or .htm
	$filename = basename($filename);

	if ((strtolower(substr($filename, -5)) != '.html') && (strtolower(substr($filename, -4)) != '.htm'))
	{
		return;
	}

	if ($siteRoot)
	{
		$siteRoot = rtrim($siteRoot, '/').'/';
	}

	$filename_quoted = str_replace('.', '\\.', $filename);
	$rewrite_base    = trim(dirname(AKFactory::get('kickstart.stealth.url', '')), '/');

	// Get the IP
	$userIP = $_SERVER['REMOTE_ADDR'];
	$userIP = str_replace('.', '\.', $userIP);

	// Get the .htaccess contents
	$stealthHtaccess = <<<ENDHTACCESS
RewriteEngine On
RewriteBase /$rewrite_base
RewriteCond %{REMOTE_ADDR}		!$userIP
RewriteCond %{REQUEST_URI}		!$filename_quoted
RewriteCond %{REQUEST_URI}		!(\.png|\.jpg|\.gif|\.jpeg|\.bmp|\.swf|\.css|\.js)$
RewriteRule (.*)				$filename	[R=307,L]

ENDHTACCESS;

	$customHandlers = portPhpHandlers();

	// Port any custom handlers in the stealth file
	if ($customHandlers)
	{
		$stealthHtaccess .= "\n".$customHandlers."\n";
	}

	// Write the new .htaccess, removing the old one first
	$postproc = AKFactory::getpostProc();
	$postproc->unlink($siteRoot.'.htaccess');
	$tempfile = $postproc->processFilename($siteRoot.'.htaccess');
	@file_put_contents($tempfile, $stealthHtaccess);
	$postproc->process();
}

/**
 * Checks if there is an .htaccess file and has any AddHandler directive in it.
 * In that case, we return the affected lines so they could be stored for later use
 *
 * @return  array
 */
function getPhpHandlers($root = null)
{
	if (!$root)
	{
		$root = AKKickstartUtils::getPath();
	}

	$htaccess   = $root.'/.htaccess';
	$directives = array();

	if (!file_exists($htaccess))
	{
		return $directives;
	}

	$contents   = file_get_contents($htaccess);
	$directives = AKUtilsHtaccess::extractHandler($contents);
	$directives = explode("\n", $directives);

	return $directives;
}

/**
 * Fetches any stored php handler directive stored inside the factory and creates a string with the correct markers
 *
 * @return string
 */
function portPhpHandlers()
{
	$phpHandlers = AKFactory::get('kickstart.setup.phphandlers', array());

	if (!$phpHandlers)
	{
		return '';
	}

	$customHandler  = "### AKEEBA_KICKSTART_PHP_HANDLER_BEGIN ###\n";
	$customHandler .= implode("\n", $phpHandlers)."\n";
	$customHandler .= "### AKEEBA_KICKSTART_PHP_HANDLER_END ###\n";

	return $customHandler;
}

function writePhpHandlers($siteRoot = '')
{
	$contents = portPhpHandlers();

	if (!$contents)
	{
		return;
	}

	if ($siteRoot)
	{
		$siteRoot = rtrim($siteRoot, '/').'/';
	}

	// Write the new .htaccess, removing the old one first
	$postproc = AKFactory::getpostProc();
	$postproc->unlink($siteRoot.'.htaccess');
	$tempfile = $postproc->processFilename($siteRoot.'.htaccess');
	@file_put_contents($tempfile, $contents);
	$postproc->process();
}


/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */
class AKKickstartUtils
{
	/**
	 * Guess the best path containing backup archives. The default strategy is check in the current directory first,
	 * then attempt to find an Akeeba Backup for Joomla!, Akeeba Solo or Akeeba Backup for WordPress default backup
	 * output directory under the current root. The first one containing backup archives wins.
	 *
	 * @return string The path to get archives from
	 */
	public static function getBestArchivePath()
	{
		$basePath      = self::getPath();
		$basePathSlash = (empty($basePath) ? '.' : rtrim($basePath, '/\\')) . '/';

		$paths = array(
			// Root, same as the directory we're in
			$basePath,
			// Standard temporary directory
			$basePath . '/kicktemp',
			// Akeeba Backup for Joomla!, default output directory
			$basePathSlash . 'administrator/components/com_akeeba/backup',
			$basePathSlash . 'administrator/components/com_akeebabackup/backup',
			// Akeeba Solo, default output directory
			$basePathSlash . 'backups',
			// Akeeba Backup for WordPress, default output directory
			$basePathSlash . 'wp-content/plugins/akeebabackupwp/app/backups',
		);

		foreach ($paths as $path)
		{
			$archives = self::findArchives($path);

			if (!empty($archives))
			{
				return $path;
			}
		}

		return $basePath;
	}

	/**
	 * Gets the directory the file is in
	 *
	 * @return string
	 */
	public static function getPath()
	{
		$path = KSROOTDIR;
		$path = rtrim(str_replace('\\', '/', $path), '/');

		if (!empty($path))
		{
			$path .= '/';
		}

		return $path;
	}

	/**
	 * Scans the current directory for archive files (JPA, JPS and ZIP format)
	 *
	 * @param string $path The path to look for archives. null for automatic path
	 *
	 * @return array
	 */
	public static function findArchives($path)
	{
		$ret = array();

		if (empty($path))
		{
			$path = self::getPath();
		}

		if (empty($path))
		{
			$path = '.';
		}

		$dh = @opendir($path);

		if ($dh === false)
		{
			return $ret;
		}

		while (false !== $file = @readdir($dh))
		{
			$dotpos = strrpos($file, '.');

			if ($dotpos === false)
			{
				continue;
			}

			if ($dotpos == strlen($file))
			{
				continue;
			}

			$extension = strtolower(substr($file, $dotpos + 1));

			if (in_array($extension, array('jpa', 'zip', 'jps')))
			{
				$ret[] = $file;
			}
		}

		closedir($dh);

		if (!empty($ret))
		{
			return $ret;
		}

		// On some hosts using opendir doesn't work. Let's try Dir instead
		$d = dir($path);

		while (false != ($file = $d->read()))
		{
			$dotpos = strrpos($file, '.');

			if ($dotpos === false)
			{
				continue;
			}

			if ($dotpos == strlen($file))
			{
				continue;
			}

			$extension = strtolower(substr($file, $dotpos + 1));

			if (in_array($extension, array('jpa', 'zip', 'jps')))
			{
				$ret[] = $file;
			}
		}

		return $ret;
	}

	/**
	 * Gets the most appropriate temporary path
	 *
	 * @return string
	 */
	public static function getTemporaryPath()
	{
		$path = self::getPath();

		$candidateDirs = array(
			$path,
			$path . '/kicktemp',
		);

		if (function_exists('sys_get_temp_dir'))
		{
			$candidateDirs[] = sys_get_temp_dir();
		}

		foreach ($candidateDirs as $dir)
		{
			if (is_dir($dir) && is_writable($dir))
			{
				return $dir;
			}
		}

		// Failsafe
		return $path;
	}

	/**
	 * Scans the current directory for archive files and returns them as <OPTION> tags
	 *
	 * @param string $path The path to look for archives. null for automatic path
	 *
	 * @return string
	 */
	public static function getArchivesAsOptions($path = null)
	{
		$ret = '';

		$archives = self::findArchives($path);

		if (empty($archives))
		{
			return $ret;
		}

		foreach ($archives as $file)
		{
			//$file = htmlentities($file);
			$ret .= '<option value="' . $file . '">' . $file . '</option>' . "\n";
		}

		return $ret;
	}
}


/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */
class ExtractionObserver extends AKAbstractPartObserver
{
	public $compressedTotal = 0;
	public $uncompressedTotal = 0;
	public $filesProcessed = 0;
	public $totalSize = null;
	public $fileList = null;
	public $lastFile = '';

	public function update($object, $message)
	{
		if (!is_object($message))
		{
			return;
		}

		if (!array_key_exists('type', get_object_vars($message)))
		{
			return;
		}

		switch ($message->type)
		{
			// Sent when we read the list of archive parts and their total size
			case 'totalsize':
				$this->totalSize = $message->content->totalsize;
				$this->fileList  = $message->content->filelist;
				break;

			// Sent when a file header is read from the archive
			case 'startfile':
				$this->lastFile = $message->content->file;
				$this->filesProcessed++;
				$this->compressedTotal += $message->content->compressed;
				$this->uncompressedTotal += $message->content->uncompressed;
				break;
		}

	}

	public function __toString()
	{
		return __CLASS__;
	}

}

/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

function callExtraFeature($method = null, array $params = array())
{
	static $extraFeatureObjects = null;

	if (!is_array($extraFeatureObjects))
	{
		$extraFeatureObjects = array();
		$allClasses          = get_declared_classes();
		foreach ($allClasses as $class)
		{
			if (substr($class, 0, 9) == 'AKFeature')
			{
				$extraFeatureObjects[] = new $class;
			}
		}
	}

	if (is_null($method))
	{
		return;
	}

	if (empty($extraFeatureObjects))
	{
		return;
	}

	$result = null;
	foreach ($extraFeatureObjects as $o)
	{
		if (!method_exists($o, $method))
		{
			continue;
		}
		$result = call_user_func(array($o, $method), $params);
	}

	return $result;
}

/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * Removes trailing slash or backslash from a pathname
 *
 * @param   string  $path  The path to treat
 *
 * @return  string  The path without the trailing slash/backslash
 */
function TrimTrailingSlash($path)
{
	$newpath = $path;

	if (substr($path, strlen($path) - 1, 1) == '\\')
	{
		$newpath = substr($path, 0, strlen($path) - 1);
	}

	if (substr($path, strlen($path) - 1, 1) == '/')
	{
		$newpath = substr($path, 0, strlen($path) - 1);
	}

	return $newpath;
}


function TranslateWinPath($p_path)
{
	$is_unc = false;

	if (KSWINDOWS)
	{
		// Is this a UNC path?
		$is_unc = (substr($p_path, 0, 2) == '\\\\') || (substr($p_path, 0, 2) == '//');

		// Change potential windows directory separator
		if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0, 1) == '\\'))
		{
			$p_path = strtr($p_path, '\\', '/');
		}
	}

	// Remove multiple slashes
	$p_path = str_replace('///', '/', $p_path);
	$p_path = str_replace('//', '/', $p_path);

	// Fix UNC paths
	if ($is_unc)
	{
		$p_path = '//' . ltrim($p_path, '/');
	}

	return $p_path;
}


/**
 * FTP Functions
 */
function getListing($directory, $host, $port, $username, $password, $passive, $ssl)
{
	$directory = resolvePath($directory);
	$dir       = $directory;

	// Parse directory to parts
	$parsed_dir = trim($dir, '/');
	$parts      = empty($parsed_dir) ? array() : explode('/', $parsed_dir);

	// Find the path to the parent directory
	if (!empty($parts))
	{
		$copy_of_parts = $parts;
		array_pop($copy_of_parts);

		if (!empty($copy_of_parts))
		{
			$parent_directory = '/' . implode('/', $copy_of_parts);
		}
		else
		{
			$parent_directory = '/';
		}
	}
	else
	{
		$parent_directory = '';
	}

	// Connect to the server
	if ($ssl)
	{
		$con = @ftp_ssl_connect($host, $port);
	}
	else
	{
		$con = @ftp_connect($host, $port);
	}

	if ($con === false)
	{
		return array(
			'error' => 'FTPBROWSER_ERROR_HOSTNAME'
		);
	}

	// Login
	$result = @ftp_login($con, $username, $password);

	if ($result === false)
	{
		return array(
			'error' => 'FTPBROWSER_ERROR_USERPASS'
		);
	}

	// Set the passive mode -- don't care if it fails, though!
	@ftp_pasv($con, $passive);

	// Try to chdir to the specified directory
	if (!empty($dir))
	{
		$result = @ftp_chdir($con, $dir);

		if ($result === false)
		{
			return array(
				'error' => 'FTPBROWSER_ERROR_NOACCESS'
			);
		}
	}
	else
	{
		$directory = @ftp_pwd($con);

		$parsed_dir       = trim($directory, '/');
		$parts            = empty($parsed_dir) ? array() : explode('/', $parsed_dir);
		$parent_directory = $this->directory;
	}

	// Get a raw directory listing (hoping it's a UNIX server!)
	$list = @ftp_rawlist($con, '.');
	ftp_close($con);

	if ($list === false)
	{
		return array(
			'error' => 'FTPBROWSER_ERROR_UNSUPPORTED'
		);
	}

	// Parse the raw listing into an array
	$folders = parse_rawlist($list);

	return array(
		'error'       => '',
		'list'        => $folders,
		'breadcrumbs' => $parts,
		'directory'   => $directory,
		'parent'      => $parent_directory
	);
}

function parse_rawlist($list)
{
	$folders = array();

	foreach ($list as $v)
	{
		$info  = array();
		$vinfo = preg_split("/[\s]+/", $v, 9);

		if ($vinfo[0] !== "total")
		{
			$perms = $vinfo[0];

			if (substr($perms, 0, 1) == 'd')
			{
				$folders[] = $vinfo[8];
			}
		}
	}

	asort($folders);

	return $folders;
}

function getSftpListing($directory, $host, $port, $username, $password)
{
	$directory = resolvePath($directory);
	$dir       = $directory;

	// Parse directory to parts
	$parsed_dir = trim($dir, '/');
	$parts      = empty($parsed_dir) ? array() : explode('/', $parsed_dir);

	// Find the path to the parent directory
	if (!empty($parts))
	{
		$copy_of_parts = $parts;
		array_pop($copy_of_parts);

		if (!empty($copy_of_parts))
		{
			$parent_directory = '/' . implode('/', $copy_of_parts);
		}
		else
		{
			$parent_directory = '/';
		}
	}
	else
	{
		$parent_directory = '';
	}

	// Initialise
	$connection = null;
	$sftphandle = null;

	// Open a connection
	if (!function_exists('ssh2_connect'))
	{
		return array(
			'error' => AKText::_('SFTP_NO_SSH2')
		);
	}

	$connection = ssh2_connect($host, $port);

	if ($connection === false)
	{
		return array(
			'error' => AKText::_('SFTP_WRONG_USER')
		);
	}

	if (!ssh2_auth_password($connection, $username, $password))
	{
		return array(
			'error' => AKText::_('SFTP_WRONG_USER')
		);
	}

	$sftphandle = ssh2_sftp($connection);

	if ($sftphandle === false)
	{
		return array(
			'error' => AKText::_('SFTP_NO_FTP_SUPPORT')
		);
	}

	// Get a raw directory listing (hoping it's a UNIX server!)
	$list = array();
	$dir  = ltrim($dir, '/');

	if (empty($dir))
	{
		$dir       = ssh2_sftp_realpath($sftphandle, ".");
		$directory = $dir;

		// Parse directory to parts
		$parsed_dir = trim($dir, '/');
		$parts      = empty($parsed_dir) ? array() : explode('/', $parsed_dir);

		// Find the path to the parent directory
		if (!empty($parts))
		{
			$copy_of_parts = $parts;
			array_pop($copy_of_parts);

			if (!empty($copy_of_parts))
			{
				$parent_directory = '/' . implode('/', $copy_of_parts);
			}
			else
			{
				$parent_directory = '/';
			}
		}
		else
		{
			$parent_directory = '';
		}
	}

	$handle = opendir("ssh2.sftp://$sftphandle/$dir");

	if (!is_resource($handle))
	{
		return array(
			'error' => AKText::_('SFTPBROWSER_ERROR_NOACCESS')
		);
	}

	while (($entry = readdir($handle)) !== false)
	{
		if (!is_dir("ssh2.sftp://$sftphandle/$dir/$entry"))
		{
			continue;
		}

		$list[] = $entry;
	}

	closedir($handle);

	if (!empty($list))
	{
		asort($list);
	}

	return array(
		'error'       => '',
		'list'        => $list,
		'breadcrumbs' => $parts,
		'directory'   => $directory,
		'parent'      => $parent_directory
	);
}

/**
 * Simple function to resolve relative paths.
 * Note that it is unable to resolve pathnames any higher than the present working directory.
 * I.E. It doesn't know about any directory names that you don't tell it about; hence: ../../foo becomes foo.
 *
 * @param $filename
 *
 * @return string
 */
function resolvePath($filename)
{
	$filename = str_replace('//', '/', $filename);
	$parts    = explode('/', $filename);
	$out      = array();

	foreach ($parts as $part)
	{
		if ($part == '.')
		{
			continue;
		}

		if ($part == '..')
		{
			array_pop($out);
			continue;
		}

		$out[] = $part;
	}

	return implode('/', $out);
}

/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

function echoCSS()
{
	echo <<<CSS

:root {
    --teal-dark: #339092;
    --teal: #40B5B8;
    --teal-light: #62c6c9;

    --red-dark: #c81d23;
    --red: #E2363C;
    --red-light: #e86367;

    --grey-superdark: #272727;
    --grey-dark: #373637;
    --grey: #514F50;
    --grey-light: #6b686a;

    --green-dark: #79a638;;
    --green: #93C34E;
    --green-light: #aad074;

    --orange-dark: #ec971f;
    --orange: #F0AD4E;
    --orange-light: #f4c37d;

    --lightgrey-dark: #d6d6d6;
    --lightgrey: #EFEFEF;
    --lightgrey-light: #fcfcfc;

    --white: #ffffff;
    --black: #000000;

    --system-ui: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
    --monospace: 'Berkeley Mono', ui-monospace, 'SF Mono', SFMono-Regular, 'DejaVu Sans Mono', Menlo, Consolas, "Courier New", Courier, monospace;
}

html {
    background: var(--white);
    font-size: 62.5%;
}

a, a:visited {
	color: var(--teal);
}

a:hover, a:active {
	color: var(--teal);
}

body {
    font-size: 12pt;
    font-family: var(--system-ui);
    text-rendering: optimizeLegibility;
    background: transparent;
    color: var(--grey-dark);
    width: 100%;
    max-width: 980px;
    margin: 0 auto;
}

#page-container {
    position: relative;
    margin: 5% 0;
    background: var(--lightgrey-light);
    border: medium solid var(--lightgrey-dark);
}

#header {
    color: var(--grey-dark);
    background: var(--lightgrey);
    background-clip: padding-box;
    margin-bottom: 0.7em;
    border-bottom: 2px solid var(--lightgrey-dark);
    padding: .25em;
    font-size: 24pt;
    line-height: 1.2;
    text-align: center;
}

#logo {
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAACXBIWXMAAAHFAAABxQG6eNsrAAAA/0lEQVRIx+WVUQ2DMBCGv01B5wAHYw4qARxMwiQgYQ6YAyRMAjgAB+CgezmSSwOjZfRplzSXNE2/3t1/V/hXuwMjkKcC5ICTNQImBaRVEAfUKdLkFlaWMorDo8lUHXIvsvEoyEMubFai21TaOQByVeqaFWVUPewRkEz5FqjEa+Aus3KpAfqVojsvjXYtdacVSA8MAgqRaSd+AMrYzt6zgmriv3zaeNS08MhNiD5UArcvoA64AE+1FySEYiF0I939Fj/3iFVFd6F9g1KU33yNGiX+JDYCbmIkXHm1sd6YX/pT7pKF3VYrSB87fc8RZyfgJX5I8WEVsfn+5fs1/LV9AHnjYQzAbyUrAAAAAElFTkSuQmCC);
	display: inline-block;
	width: 24px;
	height: 24px;
}

#footer {
    font-size: 9pt;
    color: var(--grey-light);
    text-align: center;
    border-top: 1px solid var(--lightgrey-dark);
    padding: 1em 1em;
    background: var(--lightgrey);
    clear: both;
}

#footer a {
    color: var(--teal-dark);
    text-decoration: none;
}

#error, .error {
    x-display: none;
    border: solid var(--red-dark);
    border-width: 4px 0;
    background: var(--red-light);
    color: var(--grey-dark);
    padding: 1em 2em;
    margin-bottom: 1.15em;
    text-align: center;
}

#error h3, .error h3, .warning h3, .notice h3 {
    margin: 0;
    padding: 0;
    font-size: 12pt;
}

.warning {
    border: solid var(--orange-dark);
    border-width: 4px 0;
    background: var(--orange-light);
    color: var(--grey-dark);
    padding: 1em 2em;
    margin-bottom: 1.15em;
    text-align: center;
}

.notice {
    border: solid var(--teal-dark);
    border-width: 4px 0;
    background: var(--teal-light);
    color: var(--grey-dark);
    padding: 1em 2em;
    margin-bottom: 1.15em;
    text-align: center;
}

.clr {
    clear: both;
}

.circle {
    display: block;
    float: left;
    border-radius: 2em;
    border: 2px solid var(--lightgrey);
    font-weight: bold;
    font-size: 14pt;
    line-height: 1.5em;
    color: var(--lightgrey-light);
    height: 1.5em;
    width: 1.5em;
    margin: 0.75em;
    text-align: center;
    background: var(--teal);
}

.area-container {
    margin: 1em 2em;
}

#page2a .area-container {
    margin: 1em 0;
}

#runInstaller,
#runCleanup,
#gotoSite,
#gotoAdministrator,
#gotoPostRestorationRroubleshooting {
    margin: 0 2em 1.3em;
}

h2 {
    font-size: 18pt;
    font-weight: normal;
    line-height: 1.3;
    border: solid var(--lightgrey-dark);
    border-left: none;
    border-right: none;
    padding: 0.5em 0;
    background: var(--lightgrey);
}

#preextraction h2 {
    margin-top: 0;
    border-top: 0;
    text-align: center;
}

input,
select,
textarea {
    font-size: 100%;
    margin: 0;
    vertical-align: baseline;
    *vertical-align: middle;
}

button,
input {
    line-height: normal;
    font-weight: normal;
    *overflow: visible;
}

input,
select,
textarea {
    background: var(--white);
    color: var(--grey-dark);
    font-size: 12pt;
    border: 1px solid var(--lightgrey-dark);
    border-radius: .25em;
    box-sizing: border-box;
    width: 50%;
    padding: 0 0 0 .5em;
}

.monospaced {
	font-family: var(--monospace);
}

input[type="checkbox"] {
    width: auto;
}

.field {
    height: 1.5em;
}

label {
    display: inline-block;
    width: 30%;
    font-size: 95%;
    font-weight: normal;
    cursor: pointer;
    color: #333;
    margin: .5em 0;
}

.help {
    width: 60%;
    margin-left: 30%;
    margin-bottom: 1.5em;
    font-size: small;
    color: var(--grey);
}

input:focus, input:hover {
    background-color: var(--lightgrey);
}

.button {
    display: inline-block;
    margin: 1em .25em;
    padding: 1em 2em;
    background: var(--green-dark);
    color: var(--white);
    border: 1px solid var(--green);
    cursor: pointer;
    border-radius: .25em;
    transition: 0.3s linear all;
}

#checkFTPTempDir.button,
#resetFTPTempDir.button,
#testFTP.button,
#browseFTP,
#reloadArchives,
#notWorking.button {
    padding: .5em 1em;
}

.button:hover, .button:active {
    border: 1px solid var(--green-light);
    background: var(--green);
    color: var(--white);
}

#notWorking.button, .bluebutton {
    text-decoration: none;
    background: var(--teal);
    border-color: var(--teal-dark);
    color: var(--white);
}

#notWorking.button:hover, .bluebutton:hover {
    background: var(--teal-light);
    border-color: var(--teal);
    color: var(--white);
}

#notWorking.button:active, .bluebutton:active {
    background: var(--teal-light);
    border-color: var(--teal);
}

.loprofile {
    padding: 0.5em 1em;
    font-size: 80%;
}

.black_overlay {
    display: none;
    position: absolute;
    top: 0%;
    left: 0%;
    width: 100%;
    height: 100%;
    background-color: var(--black);
    z-index: 1001;
    -moz-opacity: 0.8;
    opacity: .80;
    filter: alpha(opacity=80);
}

.white_content {
    display: none;
    position: absolute;
    padding: 0 0 1em;
    background: var(--lightgrey-light);
    border: 1px solid rgba(0, 0, 0, .3);
    z-index: 1002;
    overflow: hidden;
}

.white_content a {
    margin-left: 4em;
}

ol {
    margin: 0 2em;
    padding: 0 2em 1em;
}

li {
    margin: 0 0 .5em;
}

#genericerror {
    background-color: var(--orange-light);
    border: 4px solid var(--orange) !important;
}

#genericerrorInner {
    font-size: 110%;
    color: var(--grey-dark);
}

#warn-not-close, .warn-not-close {
    padding: 0.2em 0.5em;
    text-align: center;
    background: var(--orange);
    font-size: smaller;
    font-weight: bold;
}

#progressbar, .progressbar {
    display: block;
    width: 80%;
    height: 32px;
    border: 1px solid var(--lightgrey-dark);
    margin: 1em 10% 0.2em;
    border-radius: .25em;
}

#progressbar-inner, .progressbar-inner {
    display: block;
    width: 100%;
    height: 100%;
    background: var(--teal-dark);
}

#currentFile {
    font-family: var(--monospace);
    font-size: 9pt;
    height: 10pt;
    overflow: hidden;
    text-overflow: ellipsis;
    background: var(--lightgrey-dark);
    margin: 0 10% 1em;
    padding: .125em;
}

#extractionComplete {
}

#warningsContainer {
    border-bottom: 2px solid var(--orange-dark);
    border-left: 2px solid var(--orange-dark);
    border-right: 2px solid var(--orange-dark);
    padding: 5px 0;
    background: var(--orange-light);
    border-bottom-right-radius: 5px;
    border-bottom-left-radius: 5px;
}

#warningsHeader h2 {
    color: var(--grey-dark);
    border-top: 2px solid var(--orange-dark);
    border-left: 2px solid var(--orange-dark);
    border-right: 2px solid var(--orange-dark);
    border-bottom: thin solid var(--orange-dark);
    border-top-right-radius: 5px;
    border-top-left-radius: 5px;
    background: var(--orange);
    font-size: large;
    padding: 2px 5px;
    margin: 0px;
}

#warnings {
    height: 200px;
    overflow-y: scroll;
}

#warnings div {
    background: var(--orange-light);
    font-size: small;
    padding: 2px 4px;
    border-bottom: thin solid var(--grey-dark);
}

.helpme,
#warn-not-close {
    background: var(--orange-light);
    padding: 0.75em 0.5em;
    border: solid var(--orange);
    border-width: 1px 0;
    text-align: center;
}

/* FTP / S3 Browser */
.breadcrumb {
    background-color: var(--lightgrey);
    border-radius: 4px;
    list-style: none outside none;
    margin: 0 0 18px;
    padding: 8px 15px;
}

.breadcrumb > li {
    display: inline-block;
    text-shadow: 0 1px 0 var(--lightgrey-light);
}

#ak_crumbs span {
    padding: 1px 3px;
}

#ak_crumbs a {
    cursor: pointer;
}

#ftpBrowserFolderList a {
    cursor: pointer
}

/* Bootstrap porting */
.table {
    margin-bottom: 18px;
    width: 100%;
}

.table th, .table td {
    border-top: 1px solid var(--lightgrey-dark);
    line-height: 18px;
    padding: 8px;
    text-align: left;
    vertical-align: top;
}

.table-striped tbody > tr:nth-child(2n+1) > td, .table-striped tbody > tr:nth-child(2n+1) > th {
    background-color: var(--lightgrey-light);
}

@media (prefers-color-scheme: dark) {
	html {
		background: var(--grey-superdark);
		color: var(--white);
	}

	body {
		background: var(--grey-superdark);
		color: var(--white);
	}

	#logo {
		background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAACXBIWXMAAAHFAAABxQG6eNsrAAABFElEQVRIx+VVQZHDMAxcFYGPQRg0ZRAIKYODUAiFcAxyDAKhEFwGCYOEwfYjT1VPWjtt/Ko+mvFYXkm7koGvNJK/JCeSdSmAmnebSLoSIJ6P1pVo05JVJavYthqSleGhjiqbtgI56YP9k+qSSttl4OzV10FR6gMfzRYglfGe5BmABxAk7N5tUaNcOJIDX1tvYhZbJ09ABgCjZp8j06v6UUSOSRDNxr8rFBGRHE7izOfEu/NCkkkQe+kI4PAC6CoiPwD+zJnLIb0NjJozR7IjeVEfZqQxpDN3bmAUFQ9fH1ZJvIk1xscxKaCzXX5RptPSn6Krpv1ktXQGZFi7fXcr7s4A/gHMIjKW+LDaVf3+8Pt1+Gq7AZ5SjMx2RnT3AAAAAElFTkSuQmCC);
	}

	#page-container {
		background: var(--grey-dark);
		border: medium solid var(--grey);
	}

	#header {
	    color: var(--lightgrey-dark);
	    background: var(--grey-light);
	    border-bottom: 2px solid var(--grey);
	}

	#footer {
	    color: var(--lightgrey-light);
	    border-top: 1px solid var(--grey-dark);
	    background: var(--grey);
	}

	#footer a {
	    color: var(--teal);
	}

	h2 {
		border: solid var(--grey-light);
		background: var(--grey);
	}

	input,
	select,
	textarea {
	    background: var(--grey-dark);
	    color: var(--lightgrey);
	    border: 1px solid var(--grey);
	}

	label {
		color: var(--lightgrey)
	}

	.help {
	    color: var(--lightgrey-dark);
	}

	input:focus, input:hover {
	    background-color: var(--grey-light);
	}

	.white_content {
		background-color: var(--grey-dark);
	}

	#warn-not-close, .warn-not-close {
	    color: var(--white);
	}

	#progressbar, .progressbar {
	    border: 1px solid var(--grey-light);
	}

	#currentFile {
		background-color: var(--grey);
	}

	#warningsContainer {
		color: var(--grey-dark);
	}

	.helpme, #warn-not-close {
		color: var(--grey-dark);
	}

	.helpme a, #warn-not-close a {
		color: var(--teal-dark);
	}
}

CSS;

	callExtraFeature('onExtraHeadCSS');
}

/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

function echoHeadJavascript()
{
	?>
    <script type="text/javascript" language="javascript">
		var akeeba = {};

		var akeeba_debug     = <?php echo defined('KSDEBUG') ? 'true' : 'false' ?>;
		var akeeba_pro       = <?php echo KICKSTARTPRO ? 1 : 0 ?>;
		var sftp_path        = '<?php echo TranslateWinPath(defined('KSROOTDIR') ? KSROOTDIR : dirname(__FILE__)); ?>/';
		var akeeba_ajax_url  = '<?php echo defined('KSSELFNAME') ? KSSELFNAME : basename(__FILE__); ?>';
		var default_temp_dir = '<?php echo addcslashes(AKKickstartUtils::getPath(), '\\\'"') ?>';
		var translation      = {
			<?php echoTranslationStrings(); ?>
		};
		var isJoomla         = true;

/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */


/*
 *	https://raw.githubusercontent.com/douglascrockford/JSON-js/master/json2.js
 *  2016-05-01
 *  Public Domain.
 *  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
 *  See http://www.JSON.org/js.html
 */
// Create a JSON object only if one does not already exist. We create the
// methods in a closure to avoid creating global variables.

if (typeof JSON !== "object")
{
	JSON = {};
}

(function ()
{
	"use strict";

	var rx_one       = /^[\],:{}\s]*$/;
	var rx_two       = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
	var rx_three     = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
	var rx_four      = /(?:^|:|,)(?:\s*\[)+/g;
	var rx_escapable = /[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
	var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;

	function f(n)
	{
		// Format integers to have at least two digits.
		return n < 10
			? "0" + n
			: n;
	}

	function this_value()
	{
		return this.valueOf();
	}

	if (typeof Date.prototype.toJSON !== "function")
	{

		Date.prototype.toJSON = function ()
		{

			return isFinite(this.valueOf())
				? this.getUTCFullYear() + "-" +
				f(this.getUTCMonth() + 1) + "-" +
				f(this.getUTCDate()) + "T" +
				f(this.getUTCHours()) + ":" +
				f(this.getUTCMinutes()) + ":" +
				f(this.getUTCSeconds()) + "Z"
				: null;
		};

		Boolean.prototype.toJSON = this_value;
		Number.prototype.toJSON  = this_value;
		String.prototype.toJSON  = this_value;
	}

	var gap;
	var indent;
	var meta;
	var rep;


	function quote(string)
	{

// If the string contains no control characters, no quote characters, and no
// backslash characters, then we can safely slap some quotes around it.
// Otherwise we must also replace the offending characters with safe escape
// sequences.

		rx_escapable.lastIndex = 0;
		return rx_escapable.test(string)
			? "\"" + string.replace(rx_escapable, function (a)
		{
			var c = meta[a];
			return typeof c === "string"
				? c
				: "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
		}) + "\""
			: "\"" + string + "\"";
	}


	function str(key, holder)
	{

// Produce a string from holder[key].

		var i;          // The loop counter.
		var k;          // The member key.
		var v;          // The member value.
		var length;
		var mind  = gap;
		var partial;
		var value = holder[key];

// If the value has a toJSON method, call it to obtain a replacement value.

		if (value && typeof value === "object" &&
			typeof value.toJSON === "function")
		{
			value = value.toJSON(key);
		}

// If we were called with a replacer function, then call the replacer to
// obtain a replacement value.

		if (typeof rep === "function")
		{
			value = rep.call(holder, key, value);
		}

// What happens next depends on the value's type.

		switch (typeof value)
		{
			case "string":
				return quote(value);

			case "number":

// JSON numbers must be finite. Encode non-finite numbers as null.

				return isFinite(value)
					? String(value)
					: "null";

			case "boolean":
			case "null":

// If the value is a boolean or null, convert it to a string. Note:
// typeof null does not produce "null". The case is included here in
// the remote chance that this gets fixed someday.

				return String(value);

// If the type is "object", we might be dealing with an object or an array or
// null.

			case "object":

// Due to a specification blunder in ECMAScript, typeof null is "object",
// so watch out for that case.

				if (!value)
				{
					return "null";
				}

// Make an array to hold the partial results of stringifying this object value.

				gap += indent;
				partial = [];

// Is the value an array?

				if (Object.prototype.toString.apply(value) === "[object Array]")
				{

// The value is an array. Stringify every element. Use null as a placeholder
// for non-JSON values.

					length = value.length;
					for (i = 0; i < length; i += 1)
					{
						partial[i] = str(i, value) || "null";
					}

// Join all of the elements together, separated with commas, and wrap them in
// brackets.

					v   = partial.length === 0
						? "[]"
						: gap
							? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
							: "[" + partial.join(",") + "]";
					gap = mind;
					return v;
				}

// If the replacer is an array, use it to select the members to be stringified.

				if (rep && typeof rep === "object")
				{
					length = rep.length;
					for (i = 0; i < length; i += 1)
					{
						if (typeof rep[i] === "string")
						{
							k = rep[i];
							v = str(k, value);
							if (v)
							{
								partial.push(quote(k) + (
									gap
										? ": "
										: ":"
								) + v);
							}
						}
					}
				}
				else
				{

// Otherwise, iterate through all of the keys in the object.

					for (k in value)
					{
						if (Object.prototype.hasOwnProperty.call(value, k))
						{
							v = str(k, value);
							if (v)
							{
								partial.push(quote(k) + (
									gap
										? ": "
										: ":"
								) + v);
							}
						}
					}
				}

// Join all of the member texts together, separated with commas,
// and wrap them in braces.

				v   = partial.length === 0
					? "{}"
					: gap
						? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
						: "{" + partial.join(",") + "}";
				gap = mind;
				return v;
		}
	}

// If the JSON object does not yet have a stringify method, give it one.

	if (typeof JSON.stringify !== "function")
	{
		meta           = {    // table of character substitutions
			"\b": "\\b",
			"\t": "\\t",
			"\n": "\\n",
			"\f": "\\f",
			"\r": "\\r",
			"\"": "\\\"",
			"\\": "\\\\"
		};
		JSON.stringify = function (value, replacer, space)
		{

// The stringify method takes a value and an optional replacer, and an optional
// space parameter, and returns a JSON text. The replacer can be a function
// that can replace values, or an array of strings that will select the keys.
// A default replacer method can be provided. Use of the space parameter can
// produce text that is more easily readable.

			var i;
			gap    = "";
			indent = "";

// If the space parameter is a number, make an indent string containing that
// many spaces.

			if (typeof space === "number")
			{
				for (i = 0; i < space; i += 1)
				{
					indent += " ";
				}

// If the space parameter is a string, it will be used as the indent string.

			}
			else if (typeof space === "string")
			{
				indent = space;
			}

// If there is a replacer, it must be a function or an array.
// Otherwise, throw an error.

			rep = replacer;
			if (replacer && typeof replacer !== "function" &&
				(typeof replacer !== "object" ||
					typeof replacer.length !== "number"))
			{
				throw new Error("JSON.stringify");
			}

// Make a fake root object containing our value under the key of "".
// Return the result of stringifying the value.

			return str("", {"": value});
		};
	}


// If the JSON object does not yet have a parse method, give it one.

	if (typeof JSON.parse !== "function")
	{
		JSON.parse = function (text, reviver)
		{

// The parse method takes a text and an optional reviver function, and returns
// a JavaScript value if the text is a valid JSON text.

			var j;

			function walk(holder, key)
			{

// The walk method is used to recursively walk the resulting structure so
// that modifications can be made.

				var k;
				var v;
				var value = holder[key];
				if (value && typeof value === "object")
				{
					for (k in value)
					{
						if (Object.prototype.hasOwnProperty.call(value, k))
						{
							v = walk(value, k);
							if (v !== undefined)
							{
								value[k] = v;
							}
							else
							{
								delete value[k];
							}
						}
					}
				}
				return reviver.call(holder, key, value);
			}


// Parsing happens in four stages. In the first stage, we replace certain
// Unicode characters with escape sequences. JavaScript handles many characters
// incorrectly, either silently deleting them, or treating them as line endings.

			text                   = String(text);
			rx_dangerous.lastIndex = 0;
			if (rx_dangerous.test(text))
			{
				text = text.replace(rx_dangerous, function (a)
				{
					return "\\u" +
						("0000" + a.charCodeAt(0).toString(16)).slice(-4);
				});
			}

// In the second stage, we run the text against regular expressions that look
// for non-JSON patterns. We are especially concerned with "()" and "new"
// because they can cause invocation, and "=" because it can cause mutation.
// But just to be safe, we want to reject all unexpected forms.

// We split the second stage into 4 regexp operations in order to work around
// crippling inefficiencies in IE's and Safari's regexp engines. First we
// replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
// replace all simple value tokens with "]" characters. Third, we delete all
// open brackets that follow a colon or comma or that begin the text. Finally,
// we look to see that the remaining characters are only whitespace or "]" or
// "," or ":" or "{" or "}". If that is so, then the text is safe for eval.

			if (
				rx_one.test(
					text
						.replace(rx_two, "@")
						.replace(rx_three, "]")
						.replace(rx_four, "")
				)
			)
			{

// In the third stage we use the eval function to compile the text into a
// JavaScript structure. The "{" operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.

				j = eval("(" + text + ")");

// In the optional fourth stage, we recursively walk the new structure, passing
// each name/value pair to a reviver function for possible transformation.

				return (typeof reviver === "function")
					? walk({"": j}, "")
					: j;
			}

// If the text is not JSON parseable, then a SyntaxError is thrown.

			throw new SyntaxError("JSON.parse");
		};
	}
}());


/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * Returns the version of Internet Explorer or a -1
 * (indicating the use of another browser).
 *
 * @return   integer  MSIE version or -1
 */
function getInternetExplorerVersion()
{
	var rv = -1; // Return value assumes failure.
	if (navigator.appName == "Microsoft Internet Explorer")
	{
		var ua = navigator.userAgent;
		var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
		if (re.exec(ua) != null)
		{
			rv = parseFloat(RegExp.$1);
		}
	}
	return rv;
}

function resolvePath(filename)
{
	filename  = filename.replace("\/\/g", "\/");
	var parts = filename.split("/");
	var out   = [];

	for (var i = 0; i < parts.length; i++)
	{
		var part = parts[i];

		if (part === ".")
		{
			continue;
		}

		if (part === "..")
		{
			out.pop();

			continue;
		}

		out.push(part);
	}

	return out.join("/");
}

/*
 * Courtesy of PHPjs -- http://phpjs.org
 * @license GPL, version 2
 */

function version_compare(v1, v2, operator)
{
	// BEGIN REDUNDANT
	this.php_js     = this.php_js || {};
	this.php_js.ENV = this.php_js.ENV || {};
	// END REDUNDANT
	// Important: compare must be initialized at 0.
	var i           = 0,
		x           = 0,
		compare     = 0,
		// vm maps textual PHP versions to negatives so they're less than 0.
		// PHP currently defines these as CASE-SENSITIVE. It is important to
		// leave these as negatives so that they can come before numerical versions
		// and as if no letters were there to begin with.
		// (1alpha is < 1 and < 1.1 but > 1dev1)
		// If a non-numerical value can't be mapped to this table, it receives
		// -7 as its value.
		vm          = {
			'dev':   -6,
			'alpha': -5,
			'a':     -5,
			'beta':  -4,
			'b':     -4,
			'RC':    -3,
			'rc':    -3,
			'#':     -2,
			'p':     -1,
			'pl':    -1
		},
		// This function will be called to prepare each version argument.
		// It replaces every _, -, and + with a dot.
		// It surrounds any nonsequence of numbers/dots with dots.
		// It replaces sequences of dots with a single dot.
		//    version_compare('4..0', '4.0') == 0
		// Important: A string of 0 length needs to be converted into a value
		// even less than an unexisting value in vm (-7), hence [-8].
		// It's also important to not strip spaces because of this.
		//   version_compare('', ' ') == 1
		prepVersion = function (v)
		{
			v = ('' + v).replace(/[_\-+]/g, '.');
			v = v.replace(/([^.\d]+)/g, '.$1.').replace(/\.{2,}/g, '.');
			return (!v.length ? [-8] : v.split('.'));
		},
		// This converts a version component to a number.
		// Empty component becomes 0.
		// Non-numerical component becomes a negative number.
		// Numerical component becomes itself as an integer.
		numVersion  = function (v)
		{
			return !v ? 0 : (isNaN(v) ? vm[v] || -7 : parseInt(v, 10));
		};
	v1              = prepVersion(v1);
	v2              = prepVersion(v2);
	x               = Math.max(v1.length, v2.length);
	for (i = 0; i < x; i++)
	{
		if (v1[i] == v2[i])
		{
			continue;
		}
		v1[i] = numVersion(v1[i]);
		v2[i] = numVersion(v2[i]);
		if (v1[i] < v2[i])
		{
			compare = -1;
			break;
		}
		else if (v1[i] > v2[i])
		{
			compare = 1;
			break;
		}
	}
	if (!operator)
	{
		return compare;
	}

	// Important: operator is CASE-SENSITIVE.
	// "No operator" seems to be treated as less than
	// Any other values seem to make the function return null.
	switch (operator)
	{
		case '>':
		case 'gt':
			return (compare > 0);
		case '>=':
		case 'ge':
			return (compare >= 0);
		case '<=':
		case 'le':
			return (compare <= 0);
		case '==':
		case '=':
		case 'eq':
			return (compare === 0);
		case '<>':
		case '!=':
		case 'ne':
			return (compare !== 0);
		case '':
		case '<':
		case 'lt':
			return (compare < 0);
		default:
			return null;
	}
}

function is_array(mixed_var)
{
	var key         = "";
	var getFuncName = function (fn)
	{
		var name = (/\W*function\s+([\w\$]+)\s*\(/).exec(fn);
		if (!name)
		{
			return "(Anonymous)";
		}
		return name[1];
	};

	if (!mixed_var)
	{
		return false;
	}

	// BEGIN REDUNDANT
	this.php_js     = this.php_js || {};
	this.php_js.ini = this.php_js.ini || {};
	// END REDUNDANT

	if (typeof mixed_var === "object")
	{

		if (this.php_js.ini["phpjs.objectsAsArrays"] &&  // Strict checking for being a JavaScript array (only check this way if
											 // call ini_set('phpjs.objectsAsArrays', 0) to disallow objects as arrays)
			(
				(this.php_js.ini["phpjs.objectsAsArrays"].local_value.toLowerCase &&
					this.php_js.ini["phpjs.objectsAsArrays"].local_value.toLowerCase() === "off") ||
				parseInt(this.php_js.ini["phpjs.objectsAsArrays"].local_value, 10) === 0)
		)
		{
			return mixed_var.hasOwnProperty("length") && // Not non-enumerable because of being on parent class
				!mixed_var.propertyIsEnumerable("length") && // Since is own property, if not enumerable, it must be a
															 // built-in function
				getFuncName(mixed_var.constructor) !== "String"; // exclude String()
		}

		if (mixed_var.hasOwnProperty)
		{
			for (key in mixed_var)
			{
				// Checks whether the object has the specified property
				// if not, we figure it's not an object in the sense of a php-associative-array.
				if (false === mixed_var.hasOwnProperty(key))
				{
					return false;
				}
			}
		}

		// Read discussion at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_is_array/
		return true;
	}

	return false;
}

function array_key_exists(key, search)
{
	if (!search || (search.constructor !== Array && search.constructor !== Object))
	{
		return false;
	}
	return key in search;
}

function basename(path, suffix)
{
	var b = path.replace(/^.*[\/\\]/g, "");
	if (typeof(suffix) == "string" && b.substr(b.length - suffix.length) == suffix)
	{
		b = b.substr(0, b.length - suffix.length);
	}
	return b;
}

function number_format(number, decimals, dec_point, thousands_sep)
{
	var n = number, c = isNaN(decimals = Math.abs(decimals)) ? 2 : decimals;
	var d = dec_point == undefined ? "," : dec_point;
	var t = thousands_sep == undefined ? "." : thousands_sep, s = n < 0 ? "-" : "";
	var i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", j = (j = i.length) > 3 ? j % 3 : 0;

	return s + (j ? i.substr(0, j) + t : "") + i.substr(j)
		.replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
}

function size_format(filesize)
{
	if (filesize >= 1073741824)
	{
		filesize = number_format(filesize / 1073741824, 2, ".", "") + " GB";
	}
	else
	{
		if (filesize >= 1048576)
		{
			filesize = number_format(filesize / 1048576, 2, ".", "") + " MB";
		}
		else
		{
			filesize = number_format(filesize / 1024, 2, ".", "") + " KB";
		}
	}
	return filesize;
}

/**
 * Checks if a variable is empty. From the php.js library.
 */
function empty(mixed_var)
{
	var key;

	if (mixed_var === "" ||
		mixed_var === 0 ||
		mixed_var === "0" ||
		mixed_var === null ||
		mixed_var === false ||
		typeof mixed_var === "undefined"
	)
	{
		return true;
	}

	if (typeof mixed_var == "object")
	{
		for (key in mixed_var)
		{
			return false;
		}
		return true;
	}

	return false;
}

function ltrim(str, charlist)
{
	// Strips whitespace from the beginning of a string
	//
	// version: 1008.1718
	// discuss at: http://phpjs.org/functions/ltrim    // +   original by: Kevin van Zonneveld
	// (http://kevin.vanzonneveld.net) +      input by: Erkekjetter +   improved by: Kevin van Zonneveld
	// (http://kevin.vanzonneveld.net) +   bugfixed by: Onno Marsman *     example 1: ltrim('    Kevin van Zonneveld
	// ');    // *     returns 1: 'Kevin van Zonneveld    '
	charlist = !charlist ? " \\s\u00A0" : (charlist + "").replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, "$1");
	var re   = new RegExp("^[" + charlist + "]+", "g");
	return (str + "").replace(re, "");
}

function array_shift(inputArr)
{
	// http://kevin.vanzonneveld.net
	// +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	// +   improved by: Martijn Wieringa
	// %        note 1: Currently does not handle objects
	// *     example 1: array_shift(['Kevin', 'van', 'Zonneveld']);
	// *     returns 1: 'Kevin'

	var props                                                  = false,
		shift = undefined, pr = "", allDigits = /^\d$/, int_ct = -1,
		_checkToUpIndices                                      = function (arr, ct, key)
		{
			// Deal with situation, e.g., if encounter index 4 and try to set it to 0, but 0 exists later in loop (need
			// to increment all subsequent (skipping current key, since we need its value below) until find unused)
			if (arr[ct] !== undefined)
			{
				var tmp = ct;
				ct += 1;
				if (ct === key)
				{
					ct += 1;
				}
				ct      = _checkToUpIndices(arr, ct, key);
				arr[ct] = arr[tmp];
				delete arr[tmp];
			}
			return ct;
		};


	if (inputArr.length === 0)
	{
		return null;
	}
	if (inputArr.length > 0)
	{
		return inputArr.shift();
	}
}

function trim(str, charlist)
{
	var whitespace, l = 0, i = 0;
	str += "";

	if (!charlist)
	{
		// default list
		whitespace =
			" \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000";
	}
	else
	{
		// preg_quote custom list
		charlist += "";
		whitespace = charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, "$1");
	}

	l = str.length;
	for (i = 0; i < l; i++)
	{
		if (whitespace.indexOf(str.charAt(i)) === -1)
		{
			str = str.substring(i);
			break;
		}
	}

	l = str.length;
	for (i = l - 1; i >= 0; i--)
	{
		if (whitespace.indexOf(str.charAt(i)) === -1)
		{
			str = str.substring(0, i + 1);
			break;
		}
	}

	return whitespace.indexOf(str.charAt(0)) === -1 ? str : "";
}

function array_merge()
{
	// Merges elements from passed arrays into one array
	//
	// version: 1103.1210
	// discuss at: http://phpjs.org/functions/array_merge
	// +   original by: Brett Zamir (http://brett-zamir.me)
	// +   bugfixed by: Nate
	// +   input by: josh
	// +   bugfixed by: Brett Zamir (http://brett-zamir.me)
	// *     example 1: arr1 = {"color": "red", 0: 2, 1: 4}
	// *     example 1: arr2 = {0: "a", 1: "b", "color": "green", "shape": "trapezoid", 2: 4}
	// *     example 1: array_merge(arr1, arr2)
	// *     returns 1: {"color": "green", 0: 2, 1: 4, 2: "a", 3: "b", "shape": "trapezoid", 4: 4}
	// *     example 2: arr1 = []
	// *     example 2: arr2 = {1: "data"}
	// *     example 2: array_merge(arr1, arr2)
	// *     returns 2: {0: "data"}
	var args   = Array.prototype.slice.call(arguments),
		retObj = {},
		k, j   = 0,
		i      = 0,
		retArr = true;

	for (i = 0; i < args.length; i++)
	{
		if (!(args[i] instanceof Array))
		{
			retArr = false;
			break;
		}
	}

	if (retArr)
	{
		retArr = [];
		for (i = 0; i < args.length; i++)
		{
			retArr = retArr.concat(args[i]);
		}
		return retArr;
	}
	var ct = 0;

	for (i = 0, ct = 0; i < args.length; i++)
	{
		if (args[i] instanceof Array)
		{
			for (j = 0; j < args[i].length; j++)
			{
				retObj[ct++] = args[i][j];
			}
		}
		else
		{
			for (k in args[i])
			{
				if (args[i].hasOwnProperty(k))
				{
					if (parseInt(k, 10) + "" === k)
					{
						retObj[ct++] = args[i][k];
					}
					else
					{
						retObj[k] = args[i][k];
					}
				}
			}
		}
	}
	return retObj;
}

function array_diff(arr1)
{ // eslint-disable-line camelcase
	//  discuss at: http://locutus.io/php/array_diff/
	// original by: Kevin van Zonneveld (http://kvz.io)
	// improved by: Sanjoy Roy
	//  revised by: Brett Zamir (http://brett-zamir.me)
	//   example 1: array_diff(['Kevin', 'van', 'Zonneveld'], ['van', 'Zonneveld'])
	//   returns 1: {0:'Kevin'}

	var retArr = {};
	var argl   = arguments.length;
	var k1     = "";
	var i      = 1;
	var k      = "";
	var arr    = {};

	arr1keys: for (k1 in arr1)
	{
		for (i = 1; i < argl; i++)
		{
			arr = arguments[i];
			for (k in arr)
			{
				if (arr[k] === arr1[k1])
				{
					// If it reaches here, it was found in at least one array, so try next value
					continue arr1keys;
				}
			}
			retArr[k1] = arr1[k1];
		}
	}

	return retArr;
}

//=============================================================================
// Object.keys polyfill
//=============================================================================

// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
if (!Object.keys)
{
	Object.keys = (function () {
		"use strict";
		var hasOwnProperty  = Object.prototype.hasOwnProperty,
			hasDontEnumBug  = !({toString: null}).propertyIsEnumerable("toString"),
			dontEnums       = [
				"toString",
				"toLocaleString",
				"valueOf",
				"hasOwnProperty",
				"isPrototypeOf",
				"propertyIsEnumerable",
				"constructor"
			],
			dontEnumsLength = dontEnums.length;

		return function (obj) {
			if (typeof obj !== "object" && (typeof obj !== "function" || obj === null))
			{
				throw new TypeError("Object.keys called on non-object");
			}

			var result = [], prop, i;

			for (prop in obj)
			{
				if (hasOwnProperty.call(obj, prop))
				{
					result.push(prop);
				}
			}

			if (hasDontEnumBug)
			{
				for (i = 0; i < dontEnumsLength; i++)
				{
					if (hasOwnProperty.call(obj, dontEnums[i]))
					{
						result.push(dontEnums[i]);
					}
				}
			}
			return result;
		};
	}());
}

/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

akeeba.System = {};

akeeba.System.documentReady = function (callback, context)
{
};

akeeba.System.notification = {
	hasDesktopNotification: false,
	iconURL:                ''
};
akeeba.System.params       = {
	AjaxURL:               '',
	errorCallback:         onGenericError,
	password:              '',
	errorDialogId:         'errorDialog',
	errorDialogMessageId:  'errorDialogPre'
};

/**
 * An extremely simple error handler, dumping error messages to screen
 *
 * @param  error  The error message string
 */
akeeba.System.defaultErrorHandler = function (error)
{
	alert("An error has occurred\n" + error);
};

akeeba.System.params.errorCallback = onGenericError;

/**
 * Performs an AJAX request and returns the parsed JSON output.
 * akeeba.System.params.AjaxURL is used as the AJAX proxy URL.
 * If there is no errorCallback, the global akeeba.System.params.errorCallback is used.
 *
 * @param  data             An object with the query data, e.g. a serialized form
 * @param  successCallback  A function accepting a single object parameter, called on success
 * @param  errorCallback    A function accepting a single string parameter, called on failure
 * @param  useCaching       Should we use the cache?
 * @param  timeout          Timeout before cancelling the request (default 60s)
 */
akeeba.System.doAjax = function (data, successCallback, errorCallback, useCaching, timeout)
{
	if (useCaching == null)
	{
		useCaching = true;
	}

	// We always want to burst the cache
	var now                = new Date().getTime() / 1000;
	var s                  = parseInt(now, 10);
	data._cacheBustingJunk = Math.round((now - s) * 1000) / 1000;

	if (timeout == null)
	{
		timeout = 600000;
	}

	var structure =
			{
				type:    "POST",
				url:     akeeba.System.params.AjaxURL,
				cache:   false,
				data:    data,
				timeout: timeout,
				success: function (msg)
				{
					// Initialize
					var message = "";

					// Get rid of junk before the data
					var valid_pos = msg.indexOf('###');

					if (valid_pos === -1)
					{
						// Valid data not found in the response
						msg = akeeba.System.sanitizeErrorMessage(msg);
						msg = 'Invalid AJAX data: ' + msg;

						if (errorCallback == null)
						{
							if (akeeba.System.params.errorCallback != null)
							{
								akeeba.System.params.errorCallback(msg);
							}
						}
						else
						{
							errorCallback(msg);
						}

						return;
					}
					else if (valid_pos !== 0)
					{
						// Data is prefixed with junk
						message = msg.substr(valid_pos);
					}
					else
					{
						message = msg;
					}

					message = message.substr(3); // Remove triple hash in the beginning

					// Get of rid of junk after the data
					valid_pos = message.lastIndexOf('###');
					message   = message.substr(0, valid_pos); // Remove triple hash in the end

					try
					{
						var data = JSON.parse(message);
					}
					catch (err)
					{
						message = akeeba.System.sanitizeErrorMessage(message);
						msg     = err.message + "\n<br/>\n<pre>\n" + message + "\n</pre>";

						if (errorCallback == null)
						{
							if (akeeba.System.params.errorCallback != null)
							{
								akeeba.System.params.errorCallback(msg);
							}
						}
						else
						{
							errorCallback(msg);
						}

						return;
					}

					// Call the callback function
					successCallback(data);
				},
				error:   function (Request, textStatus, errorThrown)
				{
					var text    = Request.responseText ? Request.responseText : '';
					var message = '<strong>AJAX Loading Error</strong><br/>HTTP Status: ' + Request.status +
						' (' + Request.statusText + ')<br/>';

					message = message + 'Internal status: ' + textStatus + '<br/>';
					message = message + 'XHR ReadyState: ' + Request.readyState + '<br/>';
					message = message + 'Raw server response:<br/>' + akeeba.System.sanitizeErrorMessage(text);

					if (errorCallback == null)
					{
						if (akeeba.System.params.errorCallback != null)
						{
							akeeba.System.params.errorCallback(message);
						}
					}
					else
					{
						errorCallback(message);
					}
				}
			};

	if (useCaching)
	{
		akeeba.Ajax.enqueue(structure);
	}
	else
	{
		akeeba.Ajax.ajax(structure);
	}
};

/**
 * Sanitize a message before displaying it in an error dialog. Some servers return an HTML page with DOM modifying
 * JavaScript when they block the backup script for any reason (usually with a 5xx HTTP error code). Displaying the
 * raw response in the error dialog has the side-effect of killing our backup resumption JavaScript or even completely
 * destroy the page, making backup restart impossible.
 *
 * @param {string} msg The message to sanitize
 *
 * @returns {string}
 */
akeeba.System.sanitizeErrorMessage = function (msg)
{
	if (msg.indexOf("<script") > -1)
	{
		try
		{
			msg = (new DOMParser().parseFromString(msg ?? "", "text/html")).textContent;
		}
		catch (e)
		{
			msg = "(HTML containing script tags)";
		}
	}

	return msg;
};

/**
 * Get and set data to elements. Use:
 * akeeba.System.data.set(element, property, value)
 * akeeba.System.data.get(element, property, defaultValue)
 *
 * On modern browsers (minimum IE 11, Chrome 8, FF 6, Opera 11, Safari 6) this will use the data-* attributes of the
 * elements where possible. On old browsers it will use an internal cache and manually apply data-* attributes.
 */
akeeba.System.data = (function ()
{
	var lastId = 0,
		store  = {};

	return {
		set: function (element, property, value)
		{
			// IE 11, modern browsers
			if (element.dataset)
			{
				element.dataset[property] = value;

				if (value == null)
				{
					delete element.dataset[property];
				}

				return;
			}

			// IE 8 to 10, old browsers
			var id;

			if (element.myCustomDataTag === undefined)
			{
				id                      = lastId++;
				element.myCustomDataTag = id;
			}

			if (typeof(store[id]) === 'undefined')
			{
				store[id] = {};
			}

			// Store the value in the internal cache...
			store[id][property] = value;

			// ...and the DOM

			// Convert the property to dash-format
			var dataAttributeName = 'data-' + property.split(/(?=[A-Z])/).join('-').toLowerCase();

			if (element.setAttribute)
			{
				element.setAttribute(dataAttributeName, value);
			}

			if (value == null)
			{
				// IE 8 throws an exception on "delete"
				try
				{
					delete store[id][property];
					element.removeAttribute(dataAttributeName);
				}
				catch (e)
				{
					store[id][property] = null;
				}
			}
		},

		get: function (element, property, defaultValue)
		{
			// IE 11, modern browsers
			if (element.dataset)
			{
				if (typeof(element.dataset[property]) === 'undefined')
				{
					element.dataset[property] = defaultValue;
				}

				return element.dataset[property];
			}
			// IE 8 to 10, old browsers

			if (typeof(defaultValue) === 'undefined')
			{
				defaultValue = null;
			}

			// Make sure we have an internal storage
			if (typeof(store[element.myCustomDataTag]) === 'undefined')
			{
				store[element.myCustomDataTag] = {};
			}

			// Convert the property to dash-format
			var dataAttributeName = 'data-' + property.split(/(?=[A-Z])/).join('-').toLowerCase();

			// data-* attributes have precedence
			if (typeof(element[dataAttributeName]) !== 'undefined')
			{
				store[element.myCustomDataTag][property] = element[dataAttributeName];
			}

			// No data-* attribute and no stored value? Use the default.
			if (typeof(store[element.myCustomDataTag][property]) === 'undefined')
			{
				this.set(element, property, defaultValue);
			}

			// Return the value of the data
			return store[element.myCustomDataTag][property];
		}
	};
}());

/**
 * Adds an event listener to an element
 *
 * @param element
 * @param eventName
 * @param listener
 */
akeeba.System.addEventListener = function (element, eventName, listener)
{
	// Allow the passing of an element ID string instead of the DOM elem
	if (typeof element === "string")
	{
		element = document.getElementById(element);
	}

	if (element == null)
	{
		return;
	}

	if (typeof element !== 'object')
	{
		return;
	}

	// Handles the listener in a way that returning boolean false will cancel the event propagation
	function listenHandler(e)
	{
		var ret = listener.apply(this, arguments);

		if (ret === false)
		{
			if (e.stopPropagation())
			{
				e.stopPropagation();
			}

			if (e.preventDefault)
			{
				e.preventDefault();
			}
			else
			{
				e.returnValue = false;
			}
		}

		return (ret);
	}

	// Equivalent of listenHandler for IE8
	function attachHandler()
	{
		// Normalize the target of the event –– PhpStorm detects this as an error
		// window.event.target = window.event.srcElement;

		var ret = listener.call(element, window.event);

		if (ret === false)
		{
			window.event.returnValue  = false;
			window.event.cancelBubble = true;
		}

		return (ret);
	}

	if (element.addEventListener)
	{
		element.addEventListener(eventName, listenHandler, false);

		return;
	}

	element.attachEvent("on" + eventName, attachHandler);
};

/**
 * Remove an event listener from an element
 *
 * @param element
 * @param eventName
 * @param listener
 */
akeeba.System.removeEventListener = function (element, eventName, listener)
{
	// Allow the passing of an element ID string instead of the DOM elem
	if (typeof element === "string")
	{
		element = document.getElementById(element);
	}

	if (element == null)
	{
		return;
	}

	if (typeof element !== 'object')
	{
		return;
	}

	if (element.removeEventListener)
	{
		element.removeEventListener(eventName, listener);

		return;
	}

	element.detachEvent("on" + eventName, listener);
};

akeeba.System.triggerEvent = function (element, eventName)
{
	if (typeof element === 'undefined')
	{
		return;
	}

	if (element === null)
	{
		return;
	}

	// Allow the passing of an element ID string instead of the DOM elem
	if (typeof element === "string")
	{
		element = document.getElementById(element);
	}

	if (typeof element !== 'object')
	{
		return;
	}

	if (!(element instanceof Element))
	{
		return;
	}

	// Use jQuery and be done with it!
	if (typeof window.jQuery === 'function')
	{
		window.jQuery(element).trigger(eventName);

		return;
	}

	// Internet Explorer way
	if (document.fireEvent && (typeof window.Event === 'undefined'))
	{
		element.fireEvent('on' + eventName);

		return;
	}

	// This works on Chrome and Edge but not on Firefox. Ugh.
	var event = document.createEvent("Event");
	event.initEvent(eventName, true, true);
	element.dispatchEvent(event);
};

// document.ready equivalent from https://github.com/jfriend00/docReady/blob/master/docready.js
(function (funcName, baseObj)
{
	funcName = funcName || "documentReady";
	baseObj  = baseObj || akeeba.System;

	var readyList                   = [];
	var readyFired                  = false;
	var readyEventHandlersInstalled = false;

	// Call this when the document is ready. This function protects itself against being called more than once.
	function ready()
	{
		if (!readyFired)
		{
			// This must be set to true before we start calling callbacks
			readyFired = true;

			for (var i = 0; i < readyList.length; i++)
			{
				/**
				 * If a callback here happens to add new ready handlers, this function will see that it already
				 * fired and will schedule the callback to run right after this event loop finishes so all handlers
				 * will still execute in order and no new ones will be added to the readyList while we are
				 * processing the list.
				 */
				readyList[i].fn.call(window, readyList[i].ctx);
			}

			// Allow any closures held by these functions to free
			readyList = [];
		}
	}

	/**
	 * Solely for the benefit of Internet Explorer
	 */
	function readyStateChange()
	{
		if (document.readyState === "complete")
		{
			ready();
		}
	}

	/**
	 * This is the one public interface:
	 *
	 * akeeba.System.documentReady(fn, context);
	 *
	 * @param   callback   The callback function to execute when the document is ready.
	 * @param   context    Optional. If present, it will be passed as an argument to the callback.
	 */
	//
	//
	//
	baseObj[funcName] = function (callback, context)
	{
		// If ready() has already fired, then just schedule the callback to fire asynchronously
		if (readyFired)
		{
			setTimeout(function ()
			{
				callback(context);
			}, 1);

			return;
		}

		// Add the function and context to the queue
		readyList.push({fn: callback, ctx: context});

		/**
		 * If the document is already ready, schedule the ready() function to run immediately.
		 *
		 * Note: IE is only safe when the readyState is "complete", other browsers are safe when the readyState is
		 * "interactive"
		 */
		if (document.readyState === "complete" || (!document.attachEvent && document.readyState === "interactive"))
		{
			setTimeout(ready, 1);

			return;
		}

		// If the handlers are already installed just quit
		if (readyEventHandlersInstalled)
		{
			return;
		}

		// We don't have event handlers installed, install them
		readyEventHandlersInstalled = true;

		// -- We have an addEventListener method in the document, this is a modern browser.

		if (document.addEventListener)
		{
			// Prefer using the DOMContentLoaded event
			document.addEventListener("DOMContentLoaded", ready, false);

			// Our backup is the window's "load" event
			window.addEventListener("load", ready, false);

			return;
		}

		// -- Most likely we're stuck with an ancient version of IE

		// Our primary method of activation is the onreadystatechange event
		document.attachEvent("onreadystatechange", readyStateChange);

		// Our backup is the windows's "load" event
		window.attachEvent("onload", ready);
	}
})("documentReady", akeeba.System);

akeeba.System.addClass = function (element, newClasses)
{
	if (!element || !element.className)
	{
		return;
	}

	var currentClasses = element.className.split(' ');

	if ((typeof newClasses) === 'string')
	{
		newClasses = newClasses.split(' ');
	}

	currentClasses = array_merge(currentClasses, newClasses);

	element.className = '';

	for (property in currentClasses)
	{
		if (currentClasses.hasOwnProperty(property))
		{
			element.className += currentClasses[property] + ' ';
		}
	}

	if (element.className.trim)
	{
		element.className = element.className.trim();
	}
};

akeeba.System.removeClass = function (element, oldClasses)
{
	if (!element || !element.className)
	{
		return;
	}

	var currentClasses = element.className.split(' ');

	if ((typeof oldClasses) === 'string')
	{
		oldClasses = oldClasses.split(' ');
	}

	currentClasses = array_diff(currentClasses, oldClasses);

	element.className = '';

	for (property in currentClasses)
	{
		if (currentClasses.hasOwnProperty(property))
		{
			element.className += currentClasses[property] + ' ';
		}
	}

	if (element.className.trim)
	{
		element.className = element.className.trim();
	}
};

akeeba.System.hasClass = function (element, aClass)
{
	if (!element || !element.className)
	{
		return;
	}

	var currentClasses = element.className.split(' ');

	for (i = 0; i < currentClasses.length; i++)
	{
		if (currentClasses[i] === aClass)
		{
			return true;
		}
	}

	return false;
};

akeeba.System.toggleClass = function(element, aClass)
{
	if (akeeba.System.hasClass(element, aClass))
	{
		akeeba.System.removeClass(element, aClass);

		return;
	}

	akeeba.System.addClass(element, aClass);
};


/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * An AJAX abstraction layer for use with Akeeba software
 */
akeeba.Ajax = {
	// Maps nonsense HTTP status codes to what should actually be returned
	xhrSuccessStatus: {
		// File protocol always yields status code 0, assume 200
		0: 200,
		// Support: IE <=9 only. Sometimes IE returns 1223 when it should be 204
		1223: 204
	},
	// Used for chained AJAX: each request will be launched once the previous one is done (successfully or not)
	requestArray: [],
	processingQueue: false
};

/**
 * Performs an asynchronous AJAX request. Mostly compatible with jQuery 1.5+ calling conventions, or at least the
 * subset
 * of the features we used in our software.
 *
 * The parameters can be
 * method        string      HTTP method (GET, POST, PUT, ...). Default: POST.
 * url        string      URL to access over AJAX. Required.
 * timeout    int         Request timeout in msec. Default: 600,000 (ten minutes)
 * data        object      Data to send to the AJAX URL. Default: empty
 * success    function    function(string responseText, string responseStatus, XMLHttpRequest xhr)
 * error        function    function(XMLHttpRequest xhr, string errorType, Exception e)
 * beforeSend    function    function(XMLHttpRequest xhr, object parameters) You can modify xhr, not parameters. Return
 * false to abort the request.
 *
 * @param   url         {string}  URL to send the AJAX request to
 * @param   parameters  {object}  Configuration parameters
 */
akeeba.Ajax.ajax = function (url, parameters)
{
	// Handles jQuery 1.0 calling style of .ajax(parameters), passing the URL as a property of the parameters object
	if (typeof(parameters) === "undefined")
	{
		parameters = url;
		url        = parameters.url;
	}

	// Get the parameters I will use throughout
	var method          = (typeof(parameters.type) === "undefined") ? "POST" : parameters.type;
	method              = method.toUpperCase();
	var data            = (typeof(parameters.data) === "undefined") ? {} : parameters.data;
	var sendData        = null;
	var successCallback = (typeof(parameters.success) === "undefined") ? null : parameters.success;
	var errorCallback   = (typeof(parameters.error) === "undefined") ? null : parameters.error;

	// === Cache busting
	var cache = (typeof(parameters.cache) === "undefined") ? false : parameters.url;

	if (!cache)
	{
		var now                = new Date().getTime() / 1000;
		var s                  = parseInt(now, 10);
		data._cacheBustingJunk = Math.round((now - s) * 1000) / 1000;
	}

	// === Interpolate the data
	if ((method === "POST") || (method === "PUT"))
	{
		sendData = this.interpolateParameters(data);
	}
	else
	{
		url += url.indexOf("?") === -1 ? "?" : "&";
		url += this.interpolateParameters(data);
	}

	// === Get the XHR object
	var xhr = new XMLHttpRequest();
	xhr.open(method, url);

	// === Handle POST / PUT data
	if ((method === "POST") || (method === "PUT"))
	{
		xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	}

	// --- Set the load handler
	xhr.onload = function (event)
	{
		var status         = akeeba.Ajax.xhrSuccessStatus[xhr.status] || xhr.status;
		var statusText     = xhr.statusText;
		var isBinaryResult = (xhr.responseType || "text") !== "text" || typeof xhr.responseText !== "string";
		var responseText   = isBinaryResult ? xhr.response : xhr.responseText;
		var headers        = xhr.getAllResponseHeaders();

		if (status === 200)
		{
			if (successCallback != null)
			{
				akeeba.Ajax.triggerCallbacks(successCallback, responseText, statusText, xhr);
			}

			return;
		}

		if (errorCallback)
		{
			akeeba.Ajax.triggerCallbacks(errorCallback, xhr, "error", null);
		}
	};

	// --- Set the error handler
	xhr.onerror = function (event)
	{
		if (errorCallback)
		{
			akeeba.Ajax.triggerCallbacks(errorCallback, xhr, "error", null);
		}
	};

	// IE 8 is a pain the butt
	if (window.attachEvent && !window.addEventListener)
	{
		xhr.onreadystatechange = function ()
		{
			if (this.readyState === 4)
			{
				var status = akeeba.Ajax.xhrSuccessStatus[this.status] || this.status;

				if (status >= 200 && status < 400)
				{
					// Success!
					xhr.onload();
				}
				else
				{
					xhr.onerror();
				}
			}
		};
	}

	// --- Set the timeout handler
	xhr.ontimeout = function ()
	{
		if (errorCallback)
		{
			akeeba.Ajax.triggerCallbacks(errorCallback, xhr, "timeout", null);
		}
	};

	// --- Set the abort handler
	xhr.onabort = function ()
	{
		if (errorCallback)
		{
			akeeba.Ajax.triggerCallbacks(errorCallback, xhr, "abort", null);
		}
	};

	// --- Apply the timeout before running the request
	var timeout = (typeof(parameters.timeout) === "undefined") ? 600000 : parameters.timeout;

	if (timeout > 0)
	{
		xhr.timeout = timeout;
	}

	// --- Call the beforeSend event handler. If it returns false the request is canceled.
	if (typeof(parameters.beforeSend) !== "undefined")
	{
		if (parameters.beforeSend(xhr, parameters) === false)
		{
			return;
		}
	}

	xhr.send(sendData);
};

/**
 * Adds an AJAX request to the request queue and begins processing the queue if it's not already started. The request
 * queue is a FIFO buffer. Each request will be executed as soon as the one preceeding it has completed processing
 * (successfully or otherwise).
 *
 * It's the same syntax as .ajax() with the difference that the request is queued instead of executed right away.
 *
 * @param   url         {string}  The URL to send the request to
 * @param   parameters  {object}  Configuration parameters
 */
akeeba.Ajax.enqueue = function (url, parameters)
{
	// Handles jQuery 1.0 calling style of .ajax(parameters), passing the URL as a property of the parameters object
	if (typeof(parameters) === "undefined")
	{
		parameters = url;
		url        = parameters.url;
	}

	parameters.url = url;
	akeeba.Ajax.requestArray.push(parameters);

	akeeba.Ajax.processQueue();
};

/**
 * Converts a simple object containing query string parameters to a single, escaped query string
 *
 * @param    object   {object}  A plain object containing the query parameters to pass
 * @param    prefix   {string}  Prefix for array-type parameters
 *
 * @returns  {string}
 *
 * @access  private
 */
akeeba.Ajax.interpolateParameters = function (object, prefix)
{
	prefix            = prefix || "";
	var encodedString = "";

	for (var prop in object)
	{
		if (object.hasOwnProperty(prop))
		{
			if (encodedString.length > 0)
			{
				encodedString += "&";
			}

			if (typeof object[prop] !== "object")
			{
				if (prefix === "")
				{
					encodedString += encodeURIComponent(prop) + "=" + encodeURIComponent(object[prop]);
				}
				else
				{
					encodedString += encodeURIComponent(prefix) + "[" + encodeURIComponent(prop) + "]=" + encodeURIComponent(object[prop]);
				}

				continue;
			}

			// Objects need special handling
			encodedString += akeeba.Ajax.interpolateParameters(object[prop], prop);
		}
	}
	return encodedString;
};

/**
 * Goes through a list of callbacks and calls them in succession. Accepts a variable number of arguments.
 */
akeeba.Ajax.triggerCallbacks = function ()
{
	// converts arguments to real array
	var args         = Array.prototype.slice.call(arguments);
	var callbackList = args.shift();

	if (typeof(callbackList) === "function")
	{
		return callbackList.apply(null, args);
	}

	if (callbackList instanceof Array)
	{
		for (var i = 0; i < callbackList.length; i++)
		{
			var callBack = callbackList[i];

			if (callBack.apply(null, args) === false)
			{
				return false;
			}
		}
	}

	return null;
};

/**
 * This helper function triggers the request queue processing using a short (50 msec) timer. This prevents a long
 * function nesting which could cause some browser to abort processing.
 *
 * @access  private
 */
akeeba.Ajax.processQueueHelper = function ()
{
	akeeba.Ajax.processingQueue = false;

	setTimeout("akeeba.Ajax.processQueue();", 50);
};

/**
 * Processes the request queue
 *
 * @access  private
 */
akeeba.Ajax.processQueue = function ()
{
	// If I don't have any more requests reset and return
	if (!akeeba.Ajax.requestArray.length)
	{
		akeeba.Ajax.processingQueue = false;
		return;
	}

	// If I am already processing an AJAX request do nothing (I will be called again when the request completes)
	if (akeeba.Ajax.processingQueue)
	{
		return;
	}

	// Extract the URL from the parameters
	var parameters = akeeba.Ajax.requestArray.shift();
	var url        = parameters.url;

	/**
	 * Add our queue processing helper to the top of the success and error callback function stacks, ensuring that we
	 * will process the next request in the queue as soon as the previous one completes (successfully or not)
	 */
	var successCallback = (typeof(parameters.success) === "undefined") ? [] : parameters.success;
	var errorCallback   = (typeof(parameters.error) === "undefined") ? [] : parameters.error;

	if ((typeof(successCallback) !== "object") || !(successCallback instanceof Array))
	{
		successCallback = [successCallback];
	}

	if ((typeof(errorCallback) !== "object") || !(errorCallback instanceof Array))
	{
		errorCallback = [errorCallback];
	}

	successCallback.unshift(akeeba.Ajax.processQueueHelper);
	errorCallback.unshift(akeeba.Ajax.processQueueHelper);

	parameters.success = successCallback;
	parameters.error   = errorCallback;

	// Mark the queue as currently being processed, blocking further requests until this one completes
	akeeba.Ajax.processingQueue = true;

	// Perform the actual request
	akeeba.Ajax.ajax(url, parameters);
};


/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

function translateGUI()
{
	var allElements = document.querySelectorAll('*');

	for (var i = 0; i < allElements.length; i++)
	{
		var e = allElements[i];

		if (typeof e.innerHTML === "undefined")
		{
			continue;
		}

		transKey = e.innerHTML;

		if (!array_key_exists(transKey, translation))
		{
			continue;
		}

		e.innerHTML = translation[transKey];
	}
}

function trans(key)
{
	if (array_key_exists(key, translation))
	{
		return translation[key];
	}

	return key;
}

/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

var akeeba_error_callback            = onGenericError;
var akeeba_restoration_stat_inbytes  = 0;
var akeeba_restoration_stat_outbytes = 0;
var akeeba_restoration_stat_files    = 0;
var akeeba_restoration_stat_total    = 0;
var akeeba_factory                   = null;
var akeeba_next_step_post            = null;

var akeeba_ftpbrowser_modal     = null;
var akeeba_ftpbrowser_host      = null;
var akeeba_ftpbrowser_port      = 21;
var akeeba_ftpbrowser_username  = null;
var akeeba_ftpbrowser_password  = null;
var akeeba_ftpbrowser_passive   = 1;
var akeeba_ftpbrowser_ssl       = 0;
var akeeba_ftpbrowser_directory = "";

var akeeba_sftpbrowser_host      = null;
var akeeba_sftpbrowser_port      = 21;
var akeeba_sftpbrowser_username  = null;
var akeeba_sftpbrowser_password  = null;
var akeeba_sftpbrowser_pubkey    = null;
var akeeba_sftpbrowser_privkey   = null;
var akeeba_sftpbrowser_directory = "";

akeeba.System.documentReady(function () {
	// Hide 2nd Page
	document.getElementById("page2").style.display = "none";

	// Translate the GUI
	translateGUI();

	// Hook interaction handlers
	akeeba.System.addEventListener(document, "keyup", closeLightbox);
	akeeba.System.addEventListener(document.getElementById("kickstart.procengine"), "change", onChangeProcengine);
	akeeba.System.addEventListener(document.getElementById("kickstart.setup.sourcepath"), "change", onArchiveListReload);
	akeeba.System.addEventListener(document.getElementById("reloadArchives"), "click", onArchiveListReload);
	akeeba.System.addEventListener(document.getElementById("checkFTPTempDir"), "click", oncheckFTPTempDirClick);
	akeeba.System.addEventListener(document.getElementById("resetFTPTempDir"), "click", onresetFTPTempDir);
	akeeba.System.addEventListener(document.getElementById("testFTP"), "click", onTestFTPClick);
	akeeba.System.addEventListener(document.getElementById("gobutton_top"), "click", onStartExtraction);
	akeeba.System.addEventListener(document.getElementById("gobutton"), "click", onStartExtraction);
	akeeba.System.addEventListener(document.getElementById("gobutton"), "click", onStartExtraction);
	akeeba.System.addEventListener(document.getElementById("runCleanup"), "click", onRunCleanupClick);
	akeeba.System.addEventListener(document.getElementById("runInstaller"), "click", onRunInstallerClick);
	akeeba.System.addEventListener(document.getElementById("gotoStart"), "click", onGotoStartClick);
	akeeba.System.addEventListener(document.getElementById("retry"), "click", onRetryClick);

	akeeba.System.addEventListener(document.getElementById("gotoSite"), "click", function (event)
	{
		window.open("index.php", "finalstepsite");
		window.close();
	});

	akeeba.System.addEventListener(document.getElementById("gotoAdministrator"), "click", function (event)
	{
		window.open("administrator/index.php", "finalstepadmin");
		window.close();
	});

	// Reset the progress bar
	setProgressBar(0);

	if (!akeeba_debug)
	{
		document.getElementById("preextraction").style.display = "block";
		document.getElementById("fade").style.display          = "block";
	}

	// Trigger change, so we avoid problems if the user refreshes the page
	onChangeProcengine();

	akeeba.System.triggerEvent(document.getElementById("kickstart.procengine", "change"));
});


/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * Generic error handler
 *
 * @param   {string}  msg  Error message to display
 */
function onGenericError(msg)
{
	document.getElementById("genericerrorInner").innerHTML = msg;
	document.getElementById("genericerror").style.display  = "block";
	document.getElementById("fade").style.display          = "block";

	akeeba.System.addEventListener(document, "keyup", closeLightbox());
}

/**
 * Set the progress bar to a specific percentage
 *
 * @param   {int}  percent  Percentage (or float 0.0 to 1.0) to display in the progress bar.
 */
function setProgressBar(percent)
{
	var newValue = percent;

	if (percent <= 1)
	{
		newValue = 100 * percent;
	}

	document.getElementById("progressbar-inner").style.width = newValue + "%";
}

/**
 * Close the lightbox
 *
 * @param   {KeyboardEvent|MouseEvent}  event
 */
function closeLightbox(event)
{
	var closeMe = false;

	if ((event == null) || (event === undefined))
	{
		closeMe = true;
	}
	else if (event.keyCode == "27")
	{
		closeMe = true;
	}

	if (!closeMe)
	{
		return;
	}

	document.getElementById("preextraction").style.display = "none";
	document.getElementById("genericerror").style.display  = "none";
	document.getElementById("fade").style.display          = "none";

	akeeba.System.removeEventListener(document, "keyup", closeLightbox);
}


/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * Event handler for changing the Archive directory.
 */
function onArchiveListReload()
{
	post = {
		'task': 'listArchives',
		'json': JSON.stringify({
			path: document.getElementById('kickstart\.setup\.sourcepath').value
		})
	};

	akeeba.System.doAjax(post, function (ret)
	{
		document.getElementById('sourcefileContainer').innerHTML = ret;
	});
}

/**
 * Event handler for switching the Write To File method
 *
 * @param   {Event}  event
 */
function onChangeProcengine(event)
{
	var elProcEngine = document.getElementById("kickstart.procengine");
	var procEngine   = elProcEngine.value;
	var elFtpOptions = document.getElementById("ftp-options");
	var elPassive    = document.getElementById("ftp-ssl-passive");
	var elTestBtn    = document.getElementById("testFTP");

	// Only hide the (S)FTP options when using direct file writes
	elFtpOptions.style.display = (procEngine === "direct") ? "none" : "block";

	// Set up the interface for a plain FTP or Hybrid extraction engine
	elPassive.style.display = "block";
	elTestBtn.innerHTML     = trans("BTN_TESTFTPCON");

	// If the SFTP engine is selected I need to make some interface changes
	if (procEngine === "sftp")
	{
		// Insert the SFTP path if none is currently specified
		var elFtpDir = document.getElementById("kickstart.ftp.dir");

		if (elFtpDir.value === "")
		{
			elFtpDir.value = sftp_path;
		}

		// Hide the passive mode (it's an FTP-only thing) and change the button label.
		elPassive.style.display = "none";
		elTestBtn.innerHTML     = trans("BTN_TESTSFTPCON");
	}
}

/**
 * Event handler for the Check button next to the Temporary Directory
 *
 * @param   {MouseEvent}  event
 */
function oncheckFTPTempDirClick(event)
{
	var data = {
		'task': 'checkTempdir',
		'json': JSON.stringify({
			'kickstart.ftp.tempdir': document.getElementById('kickstart\.ftp.tempdir').value
		})
	};

	akeeba.System.doAjax(data, function (ret)
	{
		var key = ret.status ? 'FTP_TEMPDIR_WRITABLE' : 'FTP_TEMPDIR_UNWRITABLE';

		alert(trans(key));
	});
}

/**
 * Event handler for the Reset button next to the Temporary Directory
 *
 * @param   {MouseEvent}  event
 */
function onresetFTPTempDir(event)
{
	document.getElementById('kickstart\.ftp\.tempdir').value = default_temp_dir;
}

/**
 * Event handler for the Test FTP Connection button
 *
 * @param   {MouseEvent}  event
 */
function onTestFTPClick(event)
{
	var type = 'ftp';

	if (document.getElementById('kickstart.procengine').value === 'sftp')
	{
		type = 'sftp';
	}

	var data = {
		'task': 'checkFTP',
		'json': JSON.stringify({
			'type':                  type,
			'kickstart.ftp.host':    document.getElementById('kickstart.ftp.host').value,
			'kickstart.ftp.port':    document.getElementById('kickstart.ftp.port').value,
			'kickstart.ftp.ssl':     document.getElementById('kickstart.ftp.ssl').checked,
			'kickstart.ftp.passive': document.getElementById('kickstart.ftp.passive').checked,
			'kickstart.ftp.user':    document.getElementById('kickstart.ftp.user').value,
			'kickstart.ftp.pass':    document.getElementById('kickstart.ftp.pass').value,
			'kickstart.ftp.dir':     document.getElementById('kickstart.ftp.dir').value,
			'kickstart.ftp.tempdir': document.getElementById('kickstart.ftp.tempdir').value
		})
	};

	akeeba.System.doAjax(data, function (ret)
	{
		var key = ret.status ? 'FTP_CONNECTION_OK' : 'FTP_CONNECTION_FAILURE';

		if (type === 'sftp')
		{
			key = ret.status ? 'SFTP_CONNECTION_OK' : 'SFTP_CONNECTION_FAILURE';
		}


		alert(trans(key) + "\n\n" + (ret.status ? '' : ret.message));
	});
}

/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * Generic error handler
 *
 * @param   {string}  msg  The error message to display
 */
function errorHandler(msg)
{
	document.getElementById("errorMessage").innerHTML = msg;
	document.getElementById("error").style.display    = "block";
}

function onRetryClick(){
	document.getElementById("errorMessage").innerHTML = "";
	document.getElementById("error").style.display    = "none";

	setTimeout(runNextExtractionStep, 10);
}

/**
 * Initialize the archive extraction
 */
function onStartExtraction()
{
	document.getElementById("page1").style.display   = "none";
	document.getElementById("page2").style.display   = "block";
	document.getElementById("currentFile").innerText = "";

	akeeba_error_callback = errorHandler;

	var zapBefore = 0;
	var elZap     = document.getElementById("kickstart\.setup\.zapbefore");

	if (elZap !== null)
	{
		zapBefore = elZap.checked;
	}

	var elRestorePermissions = document.getElementById("kickstart\.setup\.restoreperms");
	var restorePermissions   = false;

	if (elRestorePermissions !== null)
	{
		elRestorePermissions.checked;
	}

	akeeba_next_step_post = {
		"task": "startExtracting",
		"json": JSON.stringify({
			"kickstart.setup.sourcepath": document.getElementById("kickstart\.setup\.sourcepath").value,
			"kickstart.setup.sourcefile": document.getElementById("kickstart\.setup\.sourcefile").value,
			"kickstart.jps.password": document.getElementById("kickstart\.jps\.password").value,
			"kickstart.tuning.min_exec_time": document.getElementById("kickstart\.tuning\.min_exec_time").value,
			"kickstart.tuning.max_exec_time": document.getElementById("kickstart\.tuning\.max_exec_time").value,
			"kickstart.stealth.enable": document.getElementById("kickstart\.stealth\.enable").checked,
			"kickstart.stealth.url": document.getElementById("kickstart\.stealth\.url").value,
			"kickstart.setup.zapbefore": zapBefore,
			"kickstart.tuning.run_time_bias": 75,
			"kickstart.setup.restoreperms": restorePermissions,
			"kickstart.setup.dryrun": 0,
			"kickstart.setup.ignoreerrors": document.getElementById("kickstart\.setup\.ignoreerrors").checked,
			"kickstart.enabled": 1,
			"kickstart.security.password": "",
			"kickstart.setup.renameback": document.getElementById("kickstart\.setup\.renameback").checked,
			"kickstart.procengine": document.getElementById("kickstart\.procengine").value,
			"kickstart.ftp.host": document.getElementById("kickstart\.ftp\.host").value,
			"kickstart.ftp.port": document.getElementById("kickstart\.ftp\.port").value,
			"kickstart.ftp.ssl": document.getElementById("kickstart\.ftp\.ssl").checked,
			"kickstart.ftp.passive": document.getElementById("kickstart\.ftp\.passive").checked,
			"kickstart.ftp.user": document.getElementById("kickstart\.ftp\.user").value,
			"kickstart.ftp.pass": document.getElementById("kickstart\.ftp\.pass").value,
			"kickstart.ftp.dir": document.getElementById("kickstart\.ftp\.dir").value,
			"kickstart.ftp.tempdir": document.getElementById("kickstart\.ftp\.tempdir").value,
			"kickstart.setup.extract_list": document.getElementById("kickstart\.setup\.extract_list").value
		})
	};

	setTimeout(runNextExtractionStep, 10);
}

/**
 * Runs an extraction step.
 *
 * We call it through setTimeout to avoid crashing the JS due to stack exhaustion after a long list of chained function
 * calls.
 */
function runNextExtractionStep()
{
	akeeba.System.doAjax(akeeba_next_step_post,
		function (ret){
			processRestorationStep(ret);
		},
		function (){
			errorHandler("An unexpected error occurred");
		});
}

/**
 * AJAX callback whenever a restoration step runs
 *
 * @param   {object}  data
 */
function processRestorationStep(data)
{
	// Look for errors
	if (!data.status)
	{
		errorHandler(data.message);

		return;
	}

	// Propagate warnings to the GUI
	if (!empty(data.Warnings))
	{
		var elWarnings    = document.getElementById("warnings");
		var elWarningsBox = document.getElementById("warningsBox");

		for (var i = 0; i < data.Warnings.length; i++)
		{
			var item         = data.Warnings[i];
			var elWarningRow = document.createElement("div");

			elWarningRow.innerHTML = item;
			elWarnings.appendChild(elWarningRow);
			elWarningsBox.style.display = "block";
		}
	}

	// Parse total size, if exists
	if (array_key_exists("totalsize", data))
	{
		if (is_array(data.filelist))
		{
			akeeba_restoration_stat_total = 0;

			for (var j = 0; j < data.filelist.length; j++)
			{
				var statItem = data.filelist[j];
				akeeba_restoration_stat_total += statItem[1];
			}
		}

		akeeba_restoration_stat_outbytes = 0;
		akeeba_restoration_stat_inbytes  = 0;
		akeeba_restoration_stat_files    = 0;
	}

	// Update GUI
	akeeba_restoration_stat_inbytes += data.bytesIn;
	akeeba_restoration_stat_outbytes += data.bytesOut;
	akeeba_restoration_stat_files += data.files;

	var percentage = 0;

	if (akeeba_restoration_stat_total > 0)
	{
		percentage = 100 * akeeba_restoration_stat_inbytes / akeeba_restoration_stat_total;
		percentage = Math.max(0, percentage);
		percentage = Math.min(percentage, 100);
	}

	if (data.done)
	{
		percentage = 100;
	}

	setProgressBar(percentage);

	document.getElementById("currentFile").innerText = data.lastfile;

	if (!empty(data.factory))
	{
		akeeba_factory = data.factory;
	}

	if (!data.done)
	{
		akeeba_next_step_post = {
			"task": "continueExtracting",
			"json": JSON.stringify({factory: akeeba_factory})
		};

		setTimeout(runNextExtractionStep, 10);

		return;
	}

	document.getElementById("page2a").style.display             = "none";
	document.getElementById("extractionComplete").style.display = "block";
	document.getElementById("runInstaller").style.display       = "inline-block";
}


/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

function onGotoStartClick(event)
{
	document.getElementById("page2").style.display = "none";
	document.getElementById("error").style.display = "none";
	document.getElementById("page1").style.display = "block";
}

function onRunInstallerClick(event)
{
	var windowReference = window.open("installation/index.php", "installer");

	if (!windowReference.opener)
	{
		windowReference.opener = this.window;
	}

	document.getElementById("runCleanup").style.display   = "inline-block";
	document.getElementById("runInstaller").style.display = "none";
}

function onRunCleanupClick(event)
{
	post = {
		"task": "isJoomla",
		// Passing the factory preserves the renamed files array
		"json": JSON.stringify({factory: akeeba_factory})
	};

	akeeba.System.doAjax(post, function (ret)
	{
		isJoomla = ret;
		onRealRunCleanupClick();
	});
}

function onRealRunCleanupClick()
{
	post = {
		"task": "cleanUp",
		// Passing the factory preserves the renamed files array
		"json": JSON.stringify({factory: akeeba_factory})
	};

	akeeba.System.doAjax(post, function (ret)
	{
		document.getElementById("runCleanup").style.display                         = "none";
		document.getElementById("gotoSite").style.display                           = "inline-block";
		document.getElementById("gotoAdministrator").style.display                  = "none";
		document.getElementById("gotoPostRestorationRroubleshooting").style.display = "block";

		if (isJoomla)
		{
			document.getElementById("gotoAdministrator").style.display = "inline-block";
		}
	});
}



		<?php callExtraFeature('onExtraHeadJavascript'); ?>
    </script>
	<?php
}

/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

function echoTranslationStrings()
{
	callExtraFeature('onLoadTranslations');
	$translation = AKText::getInstance();
	echo $translation->asJavascript();
}

function echoPage()
{
	$edition         = KICKSTARTPRO ? 'Professional' : 'Core';
	$bestArchivePath = AKKickstartUtils::getBestArchivePath();
	$filelist        = AKKickstartUtils::getArchivesAsOptions($bestArchivePath);
	?>
	<!DOCTYPE html>
	<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Akeeba Kickstart <?php echo $edition ?> <?php echo VERSION ?></title>
		<style type="text/css" media="all" rel="stylesheet">
			<?php echoCSS();?>
		</style>
		<?php echoHeadJavascript(); ?>
	</head>
	<body>

	<div id="fade" class="black_overlay"></div>

	<div id="page-container">

		<div id="preextraction" class="white_content">
			<h2>THINGS_HEADER</h2>
			<ol>
				<li>THINGS_01</li>
				<li>THINGS_03</li>
				<li>THINGS_04</li>
				<li>THINGS_05</li>
				<li>THINGS_06</li>
				<li>THINGS_07</li>
				<li>THINGS_08</li>
				<li>THINGS_09</li>
			</ol>
			<a href="javascript:void(0)" onclick="closeLightbox();">CLOSE_LIGHTBOX</a>
		</div>

		<div id="genericerror" class="white_content">
			<pre id="genericerrorInner"></pre>
		</div>

		<div id="header">
			<div class="title">
				<span id="logo" alt="Akeeba Kickstart logo"></span>
				Akeeba Kickstart <?php echo $edition ?> <?php echo defined('VERSION') ? VERSION : '8.0.2-dev202307211217-revb86be29' ?>
			</div>
		</div>

		<div id="page1">
			<?php callExtraFeature('onPage1'); ?>

			<div id="page1-content">

				<div class="helpme">
					<span>NEEDSOMEHELPKS</span> <a
						href="https://www.akeeba.com/documentation/akeeba-kickstart-documentation/using-kickstart.html"
						target="_blank">QUICKSTART</a>
				</div>

				<div class="step1">
					<div class="circle">1</div>
					<h2>SELECT_ARCHIVE</h2>
					<div class="area-container">
						<?php callExtraFeature('onPage1Step1'); ?>
						<div class="clr"></div>

						<label for="kickstart.setup.sourcepath">ARCHIVE_DIRECTORY</label>
			<span class="field">
				<input type="text" id="kickstart.setup.sourcepath"
				       value="<?php echo htmlentities($bestArchivePath); ?>"/>
				<span class="button" id="reloadArchives" style="margin-top:0;margin-bottom:0">RELOAD_ARCHIVES</span>
			</span>
						<br/>

						<label for="kickstart.setup.sourcefile">ARCHIVE_FILE</label>
			<span class="field" id="sourcefileContainer">
				<?php if (!empty($filelist)): ?>
					<select id="kickstart.setup.sourcefile">
						<?php echo $filelist; ?>
					</select>
				<?php else: ?>
					<a href="https://www.akeeba.com/documentation/akeeba-kickstart-documentation/ksnoarchives.html"
					   target="_blank">NOARCHIVESCLICKHERE</a>
				<?php endif; ?>
			</span>
						<br/>
						<label for="kickstart.jps.password">JPS_PASSWORD</label>
						<span class="field"><input type="password" id="kickstart.jps.password" value=""/></span>
					</div>
                    <div class="area-container">
                        <label for="gobutton_top"></label>
                        <span id="gobutton_top" class="button" style="padding: 0.5em 2em; margin: 0;">BTN_START</span>
                    </div>
                </div>

				<div class="clr"></div>

				<div class="step2">
					<div class="circle">2</div>
					<h2>SELECT_EXTRACTION</h2>
					<div class="area-container">
						<label for="kickstart.procengine">WRITE_TO_FILES</label>
			<span class="field">
				<select id="kickstart.procengine">
					<option value="direct">WRITE_DIRECTLY</option>
					<option value="hybrid">WRITE_HYBRID</option>
					<option value="ftp">WRITE_FTP</option>
					<option value="sftp">WRITE_SFTP</option>
				</select>
			</span><br/>

						<label for="kickstart.setup.ignoreerrors">IGNORE_MOST_ERRORS</label>
						<span class="field"><input type="checkbox" id="kickstart.setup.ignoreerrors"/></span>

						<div id="ftp-options">
							<label for="kickstart.ftp.host">FTP_HOST</label>
							<span class="field"><input type="text" id="kickstart.ftp.host"
							                           value="localhost"/></span><br/>
							<label for="kickstart.ftp.port">FTP_PORT</label>
							<span class="field"><input type="text" id="kickstart.ftp.port" value="21"/></span><br/>
							<div id="ftp-ssl-passive">
								<label for="kickstart.ftp.ssl">FTP_FTPS</label>
								<span class="field"><input type="checkbox" id="kickstart.ftp.ssl"/></span><br/>
								<label for="kickstart.ftp.passive">FTP_PASSIVE</label>
								<span class="field"><input type="checkbox" id="kickstart.ftp.passive"
								                           checked="checked"/></span><br/>
							</div>
							<label for="kickstart.ftp.user">FTP_USER</label>
							<span class="field"><input type="text" id="kickstart.ftp.user" value=""/></span><br/>
							<label for="kickstart.ftp.pass">FTP_PASS</label>
							<span class="field"><input type="password" id="kickstart.ftp.pass" value=""/></span><br/>
							<label for="kickstart.ftp.dir">FTP_DIR</label>
				<span class="field">
                    <input type="text" id="kickstart.ftp.dir" value=""/>
                    <?php //<span class="button" id="browseFTP" style="margin-top:0;margin-bottom:0">FTP_BROWSE</span> ?>
                </span><br/>

							<label for="kickstart.ftp.tempdir">FTP_TEMPDIR</label>
				<span class="field">
					<input type="text" id="kickstart.ftp.tempdir"
					       value="<?php echo htmlentities(AKKickstartUtils::getTemporaryPath()) ?>"/>
					<span class="button" id="checkFTPTempDir">BTN_CHECK</span>
					<span class="button" id="resetFTPTempDir">BTN_RESET</span>
				</span><br/>
							<label></label>
							<span class="button" id="testFTP">BTN_TESTFTPCON</span>
							<a id="notWorking" class="button"
							   href="https://www.akeeba.com/documentation/akeeba-kickstart-documentation/kscantextract.html"
							   target="_blank">CANTGETITTOWORK</a>
							<br/>
						</div>

					</div>
				</div>

				<div class="clr"></div>

				<div class="step3">
					<div class="circle">3</div>
					<h2>FINE_TUNE</h2>
					<div id="fine-tune-holder" class="area-container">
						<label for="kickstart.tuning.min_exec_time">MIN_EXEC_TIME</label>
						<span class="field"><input type="text" id="kickstart.tuning.min_exec_time" value="1"/></span>
						<span>SECONDS_PER_STEP</span><br/>
						<label for="kickstart.tuning.max_exec_time">MAX_EXEC_TIME</label>
						<span class="field"><input type="text" id="kickstart.tuning.max_exec_time" value="5"/></span>
						<span>SECONDS_PER_STEP</span><br/>
                        <div class="help">TIME_SETTINGS_HELP</div>

						<label for="kickstart.stealth.enable">STEALTH_MODE</label>
						<span class="field"><input type="checkbox" id="kickstart.stealth.enable"/></span><br/>
						<label for="kickstart.stealth.url">STEALTH_URL</label>
						<span class="field"><input type="text" id="kickstart.stealth.url" value="installation/offline.html"/></span><br/>
                        <div class="help">STEALTH_MODE_HELP</div>

                        <?php if (defined('KICKSTARTPRO') && KICKSTARTPRO): ?>
                        <label for="kickstart.setup.zapbefore">ZAPBEFORE</label>
                        <span class="field"><input type="checkbox" id="kickstart.setup.zapbefore"/></span><br/>
                        <div class="help">ZAPBEFORE_HELP</div>
                        <?php endif; ?>

                        <label for="kickstart.setup.renameback">RENAME_FILES</label>
						<span class="field"><input type="checkbox" id="kickstart.setup.renameback"
						                           checked="checked"/></span><br/>
                        <div class="help">RENAME_FILES_HELP</div>

						<label for="kickstart.setup.restoreperms">RESTORE_PERMISSIONS</label>
						<span class="field"><input type="checkbox" id="kickstart.setup.restoreperms"/></span><br/>
                        <div class="help">RESTORE_PERMISSIONS_HELP</div>

                        <label for="kickstart.setup.extract_list">EXTRACT_LIST</label>
                        <span class="field"><textarea class="monospaced" id="kickstart.setup.extract_list" rows="5" cols="50"></textarea></span><br/>
                        <div class="help">EXTRACT_LIST_HELP</div>
					</div>
				</div>

				<div class="clr"></div>

				<div class="step4">
					<div class="circle">4</div>
					<h2>EXTRACT_FILES</h2>
					<div class="area-container">
                        <label for="gobutton"></label>
						<span id="gobutton" class="button">BTN_START</span>
					</div>
                </div>

				<div class="clr"></div>

			</div>
		</div>

		<div id="page2">
			<div id="page2a">
				<div class="circle">5</div>
				<h2>EXTRACTING</h2>
				<div class="area-container">
					<div id="warn-not-close">DO_NOT_CLOSE_EXTRACT</div>
					<div id="progressbar">
						<div id="progressbar-inner">&nbsp;</div>
					</div>
					<div id="currentFile"></div>
				</div>
			</div>

			<div id="extractionComplete" style="display: none">
				<div class="circle">6</div>
				<h2>RESTACLEANUP</h2>
				<div id="runInstaller" class="button">BTN_RUNINSTALLER</div>
				<div id="runCleanup" class="button" style="display:none">BTN_CLEANUP</div>
				<div id="gotoSite" class="button" style="display:none">BTN_SITEFE</div>
				<div id="gotoAdministrator" class="button" style="display:none">BTN_SITEBE</div>
				<div id="gotoPostRestorationRroubleshooting" style="display:none">
					<a href="https://www.akeeba.com/documentation/akeeba-kickstart-documentation/post-restoration.html"
					   target="_blank">POSTRESTORATIONTROUBLESHOOTING</a>
				</div>
			</div>

			<div id="warningsBox" style="display: none;">
				<div id="warningsHeader">
					<h2>WARNINGS</h2>
				</div>
				<div id="warningsContainer">
					<div id="warnings"></div>
				</div>
			</div>

			<div id="error" style="display: none;">
				<h3>ERROR_OCCURED</h3>
				<p id="errorMessage"></p>
				<div id="gotoStart" class="button">BTN_GOTOSTART</div>
				<div id="retry" class="button bluebutton">BTN_RETRY</div>
				<div>
					<a href="https://www.akeeba.com/documentation/akeeba-kickstart-documentation/kscantextract.html" class="whitelink"
					   target="_blank">CANTGETITTOWORK</a>
				</div>
			</div>
		</div>

		<div id="footer">
			<div class="copyright">Copyright &copy; 2008&ndash;<?php echo date('Y'); ?> <a
					href="https://www.akeeba.com">Nicholas K.
					Dionysopoulos / Akeeba Ltd</a>. All legal rights reserved.<br/>

				This program is free software: you can redistribute it and/or modify it under the terms of
				the <a href="http://www.gnu.org/gpl-3.html">GNU General
					Public License</a> as published by the Free Software Foundation, either version 3 of the License,
				or (at your option) any later version.<br/>
			</div>
		</div>

	</div>

	</body>
	</html>
	<?php
}

/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * Clear the code caches for the extracted files. Used when finalizing the restoration.
 *
 * @return  void
 */
function clearCodeCaches()
{
	// Zend OPcache — No longer needed; we invalidate each .php file we delete, overwrite or create.
//	if (function_exists('opcache_reset'))
//	{
//		opcache_reset();
//	}

	// APC code cache
	if (function_exists('apc_clear_cache'))
	{
		@apc_clear_cache();
	}
}

/**
 * Removes all files pertaining to Kickstart.
 *
 * Using when finalizing the archive extraction from the web
 *
 * @param   AKAbstractPostproc   $postProc  The post-processing engine of Akeeba Restore in use
 */
function removeKickstartFiles(AKAbstractPostproc $postProc)
{
	// Remove self
	$postProc->unlink(basename(__FILE__));

	// Delete translations
	removeKickstartTranslationFiles($postProc);

	// Delete feature files
	deleteKickstartFeatureFiles($postProc);

	// Delete the temporary directory IF AND ONLY IF it's called "kicktemp"
	deleteKickstartTempDirectory($postProc);

	// Delete cacert.pem
	$postProc->unlink('cacert.pem');
}

/**
 * Remove feature files, e.g. kickstart.transfer.php
 *
 * @param AKAbstractPostproc $postProc
 *
 * @return void
 */
function deleteKickstartFeatureFiles(AKAbstractPostproc $postProc)
{
	$dh = opendir(AKKickstartUtils::getPath());

	if ($dh === false)
	{
		return;
	}

	$basename = basename(__FILE__, '.php');

	while (false !== $file = @readdir($dh))
	{
		if (
			(substr($file, 0, strlen($basename) + 1) == $basename . '.')
			&& (substr($file, -4) == '.php')
		)
		{
			$postProc->unlink($file);
		}
	}

	closedir($dh);
}

/**
 * Delete the temporary directory IF AND ONLY IF it's called "kicktemp"
 *
 * @param AKAbstractPostproc $postProc
 *
 * @return void
 */
function deleteKickstartTempDirectory(AKAbstractPostproc $postProc)
{
	$tempDir = $postProc->getTempDir();
	$tempDir = trim($tempDir);

	if (empty($tempDir))
	{
		return;
	}

	$basename = basename($tempDir);

	if (strtolower($basename) != 'kicktemp')
	{
		return;
	}

	recursive_remove_directory($tempDir);
}

/**
 * Delete language files, e.g. el-GR.kickstart.ini
 *
 * @param AKAbstractPostproc $postProc
 *
 * @return void
 */
function removeKickstartTranslationFiles(AKAbstractPostproc $postProc)
{
	$dh = opendir(AKKickstartUtils::getPath());

	if ($dh === false)
	{
		return;
	}

	$basename = basename(__FILE__, '.php');

	while (false !== $file = @readdir($dh))
	{
		if (strstr($file, $basename . '.ini'))
		{
			$postProc->unlink($file);
		}
	}

	closedir($dh);
}

/**
 * Finalization after the restoration. Removes the installation directory, the backup archive and rolls back automatic
 * file renames.
 *
 * @param   AKAbstractUnarchiver  $unarchiver  The unarchiver engine used by Akeeba Restore
 * @param   AKAbstractPostproc    $postProc    The post-processing engine used by Akeeba Restore
 */
function finalizeAfterRestoration(AKAbstractUnarchiver $unarchiver, AKAbstractPostproc $postProc)
{
    // Remove installation
	recursive_remove_directory('installation');

	// Run the renames, backwards
	rollbackAutomaticRenames($unarchiver, $postProc);

	// Delete the archive
	foreach ($unarchiver->archiveList as $archive)
	{
		$postProc->unlink($archive);
	}
}

/**
 * Rolls back automatic file renames.
 *
 * @param   AKAbstractUnarchiver  $unarchiver  The unarchiver engine used by Akeeba Restore
 * @param   AKAbstractPostproc    $postProc    The post-processing engine used by Akeeba Restore
 */
function rollbackAutomaticRenames(AKAbstractUnarchiver $unarchiver, AKAbstractPostproc $postProc)
{
	$renameBack = AKFactory::get('kickstart.setup.renameback', true);

	if ($renameBack)
	{
		$renames = $unarchiver->renameFiles;

		if (!empty($renames))
		{
			foreach ($renames as $original => $renamed)
			{
				$postProc->rename($renamed, $original);
			}
		}
	}
}

/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * Utility class to parse CLI parameters in a POSIX way
 */
class AKCliParams
{
	/**
	 * POSIX-style CLI options. Access them with through the getOption method.
	 *
	 * @var   array
	 */
	protected static $cliOptions = array();

	/**
	 * Parses POSIX command line options and sets the self::$cliOptions associative array. Each array item contains
	 * a single dimensional array of values. Arguments without a dash are silently ignored.
	 *
	 * @return  void
	 */
	public static function parseOptions()
	{
		global $argc, $argv;

		// Workaround for PHP-CGI
		if (!isset($argc) && !isset($argv))
		{
			$query = "";

			if (!empty($_GET))
			{
				foreach ($_GET as $k => $v)
				{
					$query .= " $k";

					if ($v != "")
					{
						$query .= "=$v";
					}
				}
			}

			$query = ltrim($query);
			$argv  = explode(' ', $query);
			$argc  = count($argv);
		}

		$currentName = "";
		$options     = array();

		for ($i = 1; $i < $argc; $i++)
		{
			$argument = $argv[$i];

			$value = $argument;

			if (strpos($argument, "-") === 0)
			{
				$argument = ltrim($argument, '-');

				$name  = $argument;
				$value = null;

				if (strstr($argument, '='))
				{
					list($name, $value) = explode('=', $argument, 2);
				}

				$currentName = $name;

				if (!isset($options[$currentName]) || ($options[$currentName] == null))
				{
					$options[$currentName] = array();
				}
			}

			if ((!is_null($value)) && (!is_null($currentName)))
			{
				$key = null;

				if (strstr($value, '='))
				{
					$parts = explode('=', $value, 2);
					$key   = $parts[0];
					$value = $parts[1];
				}

				$values = $options[$currentName];

				if (is_null($values))
				{
					$values = array();
				}

				if (is_null($key))
				{
					$values[] = $value;
				}
				else
				{
					$values[$key] = $value;
				}

				$options[$currentName] = $values;
			}
		}

		self::$cliOptions = $options;
	}

	/**
	 * Returns the value of a command line option
	 *
	 * @param   string $key     The full name of the option, e.g. "foobar"
	 * @param   mixed  $default The default value to return
	 * @param   bool   $array   Should I return an array parameter?
	 *
	 * @return  mixed  The value of the option
	 */
	public static function getOption($key, $default = null, $array = false)
	{
		// If the key doesn't exist set it to the default value
		if (!array_key_exists($key, self::$cliOptions))
		{
			self::$cliOptions[$key] = is_array($default) ? $default : array($default);
		}

		if ($array)
		{
			return self::$cliOptions[$key];
		}

		return self::$cliOptions[$key][0];
	}

	/**
	 * Is the specified param key used in the command line?
	 *
	 * @param   string $key The full name of the option, e.g. "foobar"
	 *
	 * @return  mixed  The value of the option
	 */
	public static function hasOption($key)
	{
		return array_key_exists($key, self::$cliOptions);
	}
}

class CLIExtractionObserver extends ExtractionObserver
{
	public static $silent = false;

	public function update($object, $message)
	{
		parent::update($object, $message);

		if (self::$silent)
		{
			return;
		}

		if (!is_object($message))
		{
			return;
		}

		if (!array_key_exists('type', get_object_vars($message)))
		{
			return;
		}

		if ($message->type == 'startfile')
		{
			echo $message->content->file . "\n";
		}
	}

}

class CLIDeletionObserver extends ExtractionObserver
{
	public static $silent = false;

	public function update($object, $message)
	{
		if (self::$silent)
		{
			return;
		}

		if (!is_object($message))
		{
			return;
		}

		if (!array_key_exists('type', get_object_vars($message)))
		{
			return;
		}

		switch ($message->type)
        {
            case 'setup':
                echo "I will delete existing files and folders\n";
                break;

            case 'deleteFile':
                echo "DELETE FILE  : $message->file\n";
                break;

            case 'deleteFolder':
                echo "DELETE FOLDER: $message->file\n";
                break;
        }
	}

}

/**
 * Routes the Kickstart CLI application
 */
function kickstart_application_cli()
{
	AKCliParams::parseOptions();
	$silent = AKCliParams::hasOption('silent');
	$year   = gmdate('Y');

	if (!$silent)
	{
		$version = defined('VERSION') ? VERSION : '8.0.2-dev202307211217-revb86be29';
		echo <<< BANNER
Akeeba Kickstart CLI $version
Copyright (c) 2008-$year Akeeba Ltd / Nicholas K. Dionysopoulos
-------------------------------------------------------------------------------
Akeeba Kickstart is Free Software, distributed under the terms of the GNU General
Public License version 3 or, at your option, any later version.
This program comes with ABSOLUTELY NO WARRANTY as per sections 15 & 16 of the
license. See http://www.gnu.org/licenses/gpl-3.0.html for details.
-------------------------------------------------------------------------------


BANNER;
	}

	$paths = AKCliParams::getOption('', array(), true);

	if (empty($paths))
	{
		global $argv;

		echo <<< HOWTOUSE
Usage: {$argv[0]} archive.jpa [output_path] [--password=yourPassword]
         [--silent] [--permissions] [--dry-run] [--ignore-errors]
         [--delete-before]
         [--extract=<pattern>[,<pattern>...]]


HOWTOUSE;

		die;
	}

	AKFactory::nuke();

	$targetPath  = isset($paths[1]) ? $paths[1] : getcwd();
	$targetPath  = realpath($targetPath);
	$archive     = $paths[0];
	$archive     = realpath($archive);
	$archivePath = dirname($archive);
	$archivePath = empty($archivePath) ? getcwd() : $archivePath;
	$archivePath = empty($archivePath) ? __DIR__ : $archivePath;
	$archiveName = basename($paths[0]);

	$archiveForDisplay = $archive;
	$cwd               = getcwd();

	if ($archivePath == realpath($cwd))
	{
		$archiveForDisplay = $archiveName;
	}

	if (!$silent)
	{
		echo <<< BANNER
Extracting $archiveForDisplay
to folder  $targetPath

BANNER;
	}

	// What am I extracting?
	AKFactory::set('kickstart.setup.sourcepath', $archivePath);
	AKFactory::set('kickstart.setup.sourcefile', $archiveName);
	// JPS password
	AKFactory::set('kickstart.jps.password', AKCliParams::getOption('password'));
	// Restore permissions?
	AKFactory::set('kickstart.setup.restoreperms', AKCliParams::hasOption('permissions'));
	// Dry run?
	AKFactory::set('kickstart.setup.dryrun', AKCliParams::hasOption('dry-run'));
	// Ignore errors?
	AKFactory::set('kickstart.setup.ignoreerrors', AKCliParams::hasOption('ignore-errors'));
	// Delete all files and folders before extraction?
	AKFactory::set('kickstart.setup.zapbefore', AKCliParams::hasOption('delete-before'));
	// Which files should I extract?
	AKFactory::set('kickstart.setup.extract_list', AKCliParams::getOption('extract', '', true));
	// Do not rename any files (this is the CLI...)
	AKFactory::set('kickstart.setup.renamefiles', array());
	// Optimize time limits
	AKFactory::set('kickstart.tuning.max_exec_time', 20);
	AKFactory::set('kickstart.tuning.run_time_bias', 75);
	AKFactory::set('kickstart.tuning.min_exec_time', 0);
	AKFactory::set('kickstart.procengine', 'direct');

	// Make sure that the destination directory is always set (req'd by both FTP and Direct Writes modes)
	if (empty($targetPath))
	{
		$targetPath = AKKickstartUtils::getPath();
	}

	AKFactory::set('kickstart.setup.destdir', $targetPath);

	$unarchiver = AKFactory::getUnarchiver();
	$observer   = new CLIExtractionObserver();
	$unarchiver->attach($observer);

	if ($silent)
	{
		CLIExtractionObserver::$silent = true;
	}

	if (!$silent)
	{
		echo "\n\n";
	}

	$retArray = array(
		'done' => false,
	);

	while (!$retArray['done'])
	{
	    $timer = AKFactory::getTimer();
	    $timer->resetTime();

        /**
         * First try to run the filesystem zapper (remove all existing files and folders). If the Zapper is
         * disabled or has already finished running we will get a FALSE result. Otherwise it's a status array
         * which we can pass directly back to the caller.
         */
        $ret = runZapper(new CLIDeletionObserver());

        // If the Zapper had a step to run we stop here and return its status array to the caller.
        if ($ret !== false)
        {
            continue;
        }

        $unarchiver->tick();
		$ret = $unarchiver->getStatusArray();

		if ($ret['Error'] != '')
		{
			$retArray['status']  = false;
			$retArray['done']    = true;
			$retArray['message'] = $ret['Error'];
		}
		elseif (!$ret['HasRun'])
		{
			$retArray['files']    = $observer->filesProcessed;
			$retArray['bytesIn']  = $observer->compressedTotal;
			$retArray['bytesOut'] = $observer->uncompressedTotal;
			$retArray['status']   = true;
			$retArray['done']     = true;
		}
		else
		{
			$retArray['files']    = $observer->filesProcessed;
			$retArray['bytesIn']  = $observer->compressedTotal;
			$retArray['bytesOut'] = $observer->uncompressedTotal;
			$retArray['status']   = true;
			$retArray['done']     = false;
		}

		if (!is_null($observer->totalSize))
		{
			$retArray['totalsize'] = $observer->totalSize;
			$retArray['filelist']  = $observer->fileList;
		}

		$retArray['Warnings'] = $ret['Warnings'];
		$retArray['lastfile'] = $observer->lastFile;

		if (!empty($retArray['Warnings']) && !$silent)
		{
			echo "\n\n";

			foreach ($retArray['Warnings'] as $line)
			{
				echo "\t$line\n";
			}

			echo "\n";
		}
	}

	if (!$silent)
	{
		echo "\n\n";
	}

	if (!$retArray['status'])
	{
		if (!$silent)
		{
			echo "An error has occurred:\n{$retArray['message']}\n\n";
		}

		exit(255);
	}

	// Finalize
	$postProc = AKFactory::getPostProc();

	rollbackAutomaticRenames($unarchiver, $postProc);
	clearCodeCaches();
}

/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/**
 * Routes the Kickstart web application
 */
function kickstart_application_web()
{
	$retArray = array(
		'status'  => true,
		'message' => null
	);

	$task = getQueryParam('task', 'display');
	$json = getQueryParam('json');
	$ajax = true;

	switch ($task)
	{
		case 'checkTempdir':
			$retArray['status'] = false;

			if (!empty($json))
			{
				$data = json_decode($json, true);
				$dir  = @$data['kickstart.ftp.tempdir'];

				if (!empty($dir))
				{
					$retArray['status'] = is_writable($dir);
				}
			}
			break;

		case 'checkFTP':
			$retArray['status'] = false;

			if (!empty($json))
			{
				$data = json_decode($json, true);

				foreach ($data as $key => $value)
				{
					AKFactory::set($key, $value);
				}

				if ($data['type'] == 'ftp')
				{
					$ftp = new AKPostprocFTP();
				}
				else
				{
					$ftp = new AKPostprocSFTP();
				}

				$retArray['message'] = $ftp->getError();
				$retArray['status']  = empty($retArray['message']);
			}
			break;

		case 'ftpbrowse':
			if (!empty($json))
			{
				$data = json_decode($json, true);

				$retArray =
					getListing($data['directory'], $data['host'], $data['port'], $data['username'], $data['password'], $data['passive'], $data['ssl']);
			}
			break;

		case 'sftpbrowse':
			if (!empty($json))
			{
				$data = json_decode($json, true);

				$retArray =
					getSftpListing($data['directory'], $data['host'], $data['port'], $data['username'], $data['password']);
			}
			break;

		case 'startExtracting':
		case 'continueExtracting':
			// Look for configuration values
			$retArray['status'] = false;

			if (!empty($json))
			{
				if ($task == 'startExtracting')
				{
					AKFactory::nuke();
				}

				$oldJSON = $json;
				$json    = json_decode($json, true);

				if (is_null($json))
				{
					$json = stripslashes($oldJSON);
					$json = json_decode($json, true);
				}

				if (!empty($json))
				{
					foreach ($json as $key => $value)
					{
						if (substr($key, 0, 9) == 'kickstart')
						{
							AKFactory::set($key, $value);
						}
					}
				}

				// A "factory" variable will override all other settings.
				if (array_key_exists('factory', $json))
				{
					// Get the serialized factory
					$serialized = $json['factory'];
					AKFactory::unserialize($serialized);
					AKFactory::set('kickstart.enabled', true);
				}

				// Make sure that the destination directory is always set (req'd by both FTP and Direct Writes modes)
				$removePath = AKFactory::get('kickstart.setup.destdir', '');

				if (empty($removePath))
				{
					AKFactory::set('kickstart.setup.destdir', AKKickstartUtils::getPath());
				}

				if ($task == 'startExtracting')
				{
					// Before starting, read and save any custom AddHandler directive
					$phpHandlers = getPhpHandlers();
					AKFactory::set('kickstart.setup.phphandlers', $phpHandlers);

					// If the Stealth Mode is enabled, create the .htaccess file
					if (AKFactory::get('kickstart.stealth.enable', false))
					{
						createStealthURL();
					}
					// No stealth mode, but we have custom handler directives, must write our own file
					elseif ($phpHandlers)
					{
						writePhpHandlers();
					}
				}

                /**
                 * First try to run the filesystem zapper (remove all existing files and folders). If the Zapper is
                 * disabled or has already finished running we will get a FALSE result. Otherwise it's a status array
                 * which we can pass directly back to the caller.
                 */
                $ret = runZapper();

                // If the Zapper had a step to run we stop here and return its status array to the caller.
                if ($ret !== false)
                {
                	$retArray = array_merge($retArray, $ret);

                    break;
                }

                $engine   = AKFactory::getUnarchiver(); // Get the engine
				$observer = new ExtractionObserver(); // Create a new observer
				$engine->attach($observer); // Attach the observer
				$engine->tick();
				$ret = $engine->getStatusArray();

				if ($ret['Error'] != '')
				{
					$retArray['status']  = false;
					$retArray['done']    = true;
					$retArray['message'] = $ret['Error'];
				}
				elseif (!$ret['HasRun'])
				{
					$retArray['files']    = $observer->filesProcessed;
					$retArray['bytesIn']  = $observer->compressedTotal;
					$retArray['bytesOut'] = $observer->uncompressedTotal;
					$retArray['status']   = true;
					$retArray['done']     = true;
				}
				else
				{
					$retArray['files']    = $observer->filesProcessed;
					$retArray['bytesIn']  = $observer->compressedTotal;
					$retArray['bytesOut'] = $observer->uncompressedTotal;
					$retArray['status']   = true;
					$retArray['done']     = false;
					$retArray['factory']  = AKFactory::serialize();
				}

				if (!is_null($observer->totalSize))
				{
					$retArray['totalsize'] = $observer->totalSize;
					$retArray['filelist']  = $observer->fileList;
				}

				$retArray['Warnings'] = $ret['Warnings'];
				$retArray['lastfile'] = empty($observer->lastFile) ? 'Extracting, please wait...' : $observer->lastFile;

				$timer = AKFactory::getTimer();
				$timer->enforce_min_exec_time();
			}
			break;

		case 'cleanUp':
			if (!empty($json))
			{
				$json = json_decode($json, true);

				if (array_key_exists('factory', $json))
				{
					// Get the serialized factory
					$serialized = $json['factory'];
					AKFactory::unserialize($serialized);
					AKFactory::set('kickstart.enabled', true);
				}
			}

			$unarchiver = AKFactory::getUnarchiver(); // Get the engine
			$postProc   = AKFactory::getPostProc();

			finalizeAfterRestoration($unarchiver, $postProc);
			removeKickstartFiles($postProc);
			clearCodeCaches();

			break;

		case 'display':
			$ajax = false;
			echoPage();
			break;

		case 'isJoomla':
			$ajax = true;

			if (!empty($json))
			{
				$json = json_decode($json, true);

				if (array_key_exists('factory', $json))
				{
					// Get the serialized factory
					$serialized = $json['factory'];
					AKFactory::unserialize($serialized);
					AKFactory::set('kickstart.enabled', true);
				}
			}

			$path     = AKFactory::get('kickstart.setup.destdir', '');
			$path     = rtrim($path, '/\\');
			$isJoomla = @is_dir($path . '/administrator');

			if ($isJoomla)
			{
				$isJoomla = @is_dir($path . '/libraries/joomla');
			}

			$retArray = $isJoomla;

			break;

		case 'listArchives':
			$ajax = true;

			$path = null;

			if (!empty($json))
			{
				$json = json_decode($json, true);

				if (array_key_exists('path', $json))
				{
					$path = $json['path'];
				}
			}

			if (empty($path) || !@is_dir($path))
			{
				$filelist = null;
			}
			else
			{
				$filelist = AKKickstartUtils::getArchivesAsOptions($path);
			}

			if (empty($filelist))
			{
				$retArray =
					'<a href="https://www.akeeba.com/documentation/akeeba-kickstart-documentation/ksnoarchives.html" target="_blank">' .
					AKText::_('NOARCHIVESCLICKHERE')
					. '</a>';
			}
			else
			{
				$retArray = '<select id="kickstart.setup.sourcefile">' . $filelist . '</select>';
			}

			break;

		default:
			$ajax = true;

			if (!empty($json))
			{
				$params = json_decode($json, true);
			}
			else
			{
				$params = array();
			}

			$retArray = callExtraFeature($task, $params);

			break;
	}

	if ($ajax)
	{
		// JSON encode the message
		$json = json_encode($retArray);

		// Return the message
		echo "###$json###";
	}
}

/**
 * Akeeba Kickstart
 * An AJAX-powered archive extraction tool
 *
 * @package   kickstart
 * @copyright Copyright (c)2008-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Register additional feature classes
callExtraFeature();

// Is this a CLI call?
$isCli = !isset($_SERVER) || !is_array($_SERVER);

if (isset($_SERVER) && is_array($_SERVER))
{
	$isCli = !array_key_exists('REQUEST_METHOD', $_SERVER);
}

if (isset($_GET) && is_array($_GET) && !empty($_GET))
{
	if (isset($_GET['cli']))
	{
		$isCli = $_GET['cli'] == 1;
	}
	elseif (isset($_GET['web']))
	{
		$isCli = $_GET['web'] != 1;
	}
}

// Route the application
if ($isCli)
{
	kickstart_application_cli();
}
else
{
	kickstart_application_web();
}
components/com_akeeba/Master/Installers/angie.json000060400000000551152453623440016335 0ustar00{
    "angie": {
        "name": "ANGIE for Joomla! Sites",
        "package": "angie.jpa,angie-joomla.jpa",
        "language": "language-angie.jpa,language-joomla.jpa",
        "installerroot": "installation",
        "sqlroot": "installation\/sql",
        "databasesini": "1",
        "readme": "1",
        "extrainfo": "1",
        "password": "1"
    }
}components/com_akeeba/Master/Installers/index.html000060400000000066152453623440016355 0ustar00<html><head><title></title></head><body></body></html>components/com_akeeba/Master/Installers/none.ini000060400000000150152453623440016012 0ustar00[none]
name="No Installer"
package=""
installerroot=""
sqlroot="sql"
databasesini=0
readme=0
extrainfo=0components/com_akeeba/Master/Installers/angie-joomla.jpa000060400000070543152453623440017425 0ustar00JPA�w�lJPF6!installation/platform/defines.php�Y��=PAn�0��s3A�Dp��Ԛ6B�4�����,��[�A�u���ٗW��$����պ����U 8�8���S6�hj!Og�d�.�!�@
�+���X�}�@vF��1ļ�Ȋ��(h�0i�թ�x��F2���t��樔��'|ă��Xs��#{d���yi%��������zrB�\G坼��C�����\\Β������Œ�t4�n�n�:��ݞ�e�=T��`�Oc~�`�"�JPF:%installation/platform/js/setup.min.jsKV���UMo�0��W,ᒨ�[�l-�U�*u驪�c�&��mlgK���I�~��Tp��73o&�Kb&\��sg�X�������k�/��A�q:S�m���BRǕ�8���A�0Z-�	����	f�9H�~`�9�N��B�"�	9�<��OD1�gSz� 2uٔG+�	N��CH%!�d])1n� e��:�A"}�TI�e�΅����м�r��+�uu���k��˥�6�~+��A�䗺�8�����_X�3r�)���-j��Kd�$�.��Wo�(�TX��������,����ћ�
��m������5�~���ܥ�z����v��^��^x��}�6��pzFJ0�J00�� I"��x蒈�!����
6��b�	6����#��6��cFd
}�#M
��gxM���ηlk�̻Ec[���CLg'ъb2M��j8:䄋���5:�&�>)�^�2���q��$)j�#p��u'��^�q�ڕ9���[m��=C[Ӽk'��(�g[���柳�����Z�us����g.������WGG���'V��g�5�����r.�w�r�JPF9$installation/platform/js/main.min.js&&������WV(�/-JN�M,(��K
��M�����b���JPFA,installation/platform/models/jconfig/j15.php>p���V�o�6���+0 [�Xv�<t���{mS�C�{2(�$��H����C���QR,;�[7�����}��/_WE5�vw�����7��������
/��XYyȌ�X$wu�&��G�E�1����;�X�I'�Ӟrc�!���"G�%Zb��ʼ�p���s��|�b�`~��2)�����8S�ZQ��ʧ���	j�/��5Z��C�:�=Z�q=�
IQ����4!'�.O��d�N'���.����p����S�	��hW��A��:�ڄ�d�LI����w���W%:��"�m!]����R{�B'8{[�^������܅~��8c�l脍iQ�o�)�x�s4�L��L6���v�����d-
�)U�����,p���\$M�S�3�E���s��i�*$�l�?*��M���P��@_+ƅ�)���
i����5z�%�Fj��D��������
��e_�V4uƦC�G�9h�pڧa�zW3���>�Z'��P$�:���֊�S�F�4o�M��AK�1�\��Ő����|���;T�_�?��c���ik�s�(SΔH�:��X䶨��Y=F��ؕ��X>�C�UU[Ō���(b��S����P�s�l��\�l��|���Mg�c�u���LG�֘Q;��m�/ْ/&D��cc�M����m�k˳	��V˂3���!j.j��sJ5�@Hj��g�C��Ǚ�����v$d��6%+1���\/����Iei4�ގ�Rj.c��H'�-p�M:�ҹYF�R��l�uq��^�y�&��j��Z����$�R�Om�N�߆Y��̚�I�����>@��ӣ����RG=uC��)Aۅe�X;2}��>wm̧�v�x�	��Q�����o��)�(o��3��;�X��X+���8G���*��^�s�.�b�
r��
ՊDx��*�tm�mS҆�����P�k��rx6�ע/��j[�V�v�ۜc*�yĪ��ϯ���Ӯ����v�������^��3�t�.�b~����¡X"��l~��~5�JPFA,installation/platform/models/jconfig/j30.phpQ	���U�n�6}�~Mk4��yh7u�¹��@��I�R�C�V
�{���]]Z�i��9�×�\�V���J��ˋ�����A:��@�� ��@/2�v�ҫJ�	�A�E֊�@&�/����'4�>�����!ؠ��a
]�uYq�����~���t�ٞ�K�*4���x����$���!��2Z��x���gq�4�c�1!>�
x�y�� 8%�	x>��V���xw�9G[�Rܯ�r��o~� ϚP�S��ɋ1�HEb�������c��̕}�1���搓J�숒����F�.���A�u��ٔҶ��R�U�9��Ӑ�XKm�Y
����Ry6G��B�E�)s�u]�uK=� k��vhj�B*�&gd�bQm!���q2�e�\���A۶V����S}�eюL
�<�����Fh�]�й��� %2�����}��Ƌw���_�O��#��R�2�gj3�*�0mAĝ��tv8'��{�E��~���o�X�5�˳
�=O����������y�kms�[�p�B��Ta�F�ow�����Z^������=�0򷐷��������v3�n�EQ2��a�8�q��į);;u�̜,o�®?Z��}j����ǾT��?�g�o���xt�;�����Z"���?;����ޚ�%�g�*X�̼H~
Hp�M�H�2*!��	A���9�8�6��-�|���rM���l��Y�c���Øl�5Šy��{�H�	e�&{tlI�m8��\�q�Ff:�dco�\�R�4:���z6�������t�0c�gS���xX���.	L����5V+́LS�,胋�JPFA,installation/platform/models/jconfig/j25.php]	���V�n�6}�~Mj4��yh7u��m�A��@Q#�^�Ò�m��w(i]]آO+�3�p��굩�&99ٰvvy�������9�Yp-�5s�J�Y���\Zø��DŽ�`y��9g?��8"Q!�n~4��
#�JB�	4��U����S��~����~��.��Qq��m�zP��`���/����]�����
�+��͉`�G��q=��QH��t8�l9q���9�RV�~��~�e��vʞ�|�³��UK7�H���^��K�As-`�*�,��}P��9�q�e�"+��v�$\�y��'���El��}$bj���3/u׈��󙒍�`?�A<���m���G3E\S��L�Φs)9�jt��)�:�K�Pn�K��׈�Pʻ�_�����@�gaq���!�gi�X�6�`В�}��L��i�
T�y�$�^��٢�c�K�.�nK
�M�S�ML�>@G1��B�
�F�p�HM?/��a��&�����Ӹ��CƗ�E��C%��h�A�OW�k����~P��Li�Y�����t.	�I�l�r��#:�l�᭯WA"�[�c�<���S��b���6fm�b�N6�_����:�W��+/��ٝ���o�����UL��~Hy�d�H�aԤs��F]tk�f�-9זcϨVK�8�VnE��?�,�q
+*�!�S�7&�+Y��d��"u�T�{���^��{�[�'7��������*��A±�y��,و	Y�a�,]�d,����L؄CզQS4b#��т�����PR(�
�����t���tF�.�lՙ���bO�f<3o�E�W��1�C0rJPFA,installation/platform/models/jconfig/j40.phphM���X�n�6}�����5�8M�\��q�q� k-�B���ĘU������P�]��M�A����3�}�ʫ�����eG��_>e��,f���X���d&֢�,U�E<��+�u��O`X��[HX԰����ǝE�,GJ*\����B�g�d�X��F�,��x���������6;q�$7�=�
5FU��ʰ�r��8_R�P��=�4��]!�N:�hC纽��H�q�t'�5{���X���v�vnMwق±kE�2�U��~Ti*E	쐥\�?B������,�
-�N�e��YpQZ(y��A��w8n1�!�p�f<Cf�*'Ao�D�J�&/5�lD�6�.h7%/�+�
����t�N	W)kqw��H���cp�"����W6�9��ިƆR�"p�Gx��O���2�rw�[Q����D��ܩ��+�桺s)]p)֚�'�����b.��l�����K',������tw�Aw�Ӑ1]�zz���T:��?}i܏�W�ޜ��rUR�|T&��l��LW3V�A�ЯKas��A�rr�I�$2FbF������������fHb7����?,�|y/-�nm?���9���Y���<����.(��
�%f �*?c(
�QR!�u/��Qy�Z+j���$��Z�	r�U�%�����7����Kщ�ٴ��s���Wx����T������{W-t���]^��J຿Lj�p��qڠo|��=w�=�Jy��,E�'�� gH.�4�?��^���*w�K-�󊵪S��,�l�'&�),JO2���U2t���~���=��R��'�S\Q�3�Ha���b�I[��a��jB�m�u���bq�ޞ��5al�^NU	{l����G�c8�X�]t5�o�?�jZ�4�PNb�+��J�Q@$�;���!��?K�-���C��@2։�6B�p�+���f��)�
�9�����Ri�ϰ���^����r�d���F,	��I�%5z�M'M'TU�� ����㵖���)R�����m�Yz þ���.�m�']��h+r�]v֞�/�`D89��I����Y]�lS!�4�B�J�번9�W�C��S�o0�����`>��c���6ft�����o��?����G�5��+6v@�7\H?��u�����q?Ԇ��ή��
��aד����[4M=���)T7��Z���!(��͚�FOM$���0.l���G�E�տ�r%�9z���!h�vdR�X���t9����1Q�m��D;n�ea�3��,�S�b���q�u��y6$��$V�����Y;̀��n��7H�o��7�ݵ���������7����k_C�"�����n��GDu��E� OSO�!��_����˂%B���{oZ��ڟ�A@:*��R�H�����Z���_�}l�H���54�}�㽮EZ�	+=�H�^�{0{�ݷ�@���5ZEj<�|��
e�Ը�#����mϜ�W\S���hE��S�ץ�G��u��d��g�?�7�"��~`ޗ(���
�j�ԅ�&w����n�;s`�[h�%L��6~�H}��HZN^�JPFA,installation/platform/models/joomlasetup.phpy%�����=iwǑ��_�r� �C�S�e�"-&:�������&9&0�D2�����p����\(+٬߳M�tWUwWW�������o~��~��|r�6��Vy\h��H����D��,��2��(��g*����G��q��BGjt�n���;i�D�� ����|;���V
\Ś����}_]���ww�������}�����t��}����Y:����28^���c����7��:�Y8Q���P���G��8�'=C��2輵�>��Hׇ�yT��μ?���G�2Nt�	�<:�� �"�(֝�3�4�N�����qv?+>�^�a9��Fz�
����w�N"��wa�����׈�a���q|7����5\�5��0S�l��Ͳ�#�Jm����/m��ۦ�y���U؁��/Vl�K�շqr���x���%/��<Dž����_���]_�IX��ϲp�j�����o�iR�� ��7�����7W��?�=<���p}�ֶ�c�*���Ɉ�q�!0�_c��	
&[R�C~ߩ��u�s_��6�d\s���GMd��p�Y�=��&U��D;`55ly
�<j��y�cR�i:�i�2��<������(q����)̦J©�;|�Y�H 	�i��S���u�@
\l�8M@6���j��`/��,Z	u�s��nYa	�a!2µ�i7��#�A�A~6�q�h�
x'�	jkg���e�N:k|��7�l@M=s��:[��uH�R�������4�������񫕠����X��Κ����}'�US_x�/�\?���'��9�o|�:"*��t:3�YY�tI�좌��A�ɩ��&Z�ʽ�Q��n����t%N�,fC�i�,�Sq1���Q{j��d��u�Չ+f�ty�Y�5�ŧ��A�������ڀ�.i�Q�Y!K!B�)	6�@`��K�B]� ����1�9Ĉw���k�w%b�_Zi��ƴ��5��[�)-ՊPqeVkJQ�F�)m�h�jgNj�a�U����m�2��o��b�1{EޓB��~�W/����ة�@�<��b��5���}��U�M�����}��{.?hzz�]S~c��ك{���\��Z
���_
�럯����A5\Y~G#�*=k�����n��]�v��p&��{,���	�pxcM�x9<l���J_�p%p��v)8j�
HX���q~��4�/��mgP����>��ԯ]:`2)���T��jg9J�!�ф�/�DD.���hQ�y��F�
��C�`�'W�u�S?l�B��^2R�O�q���/ݑ�MG)�9kV(��l�t�A�DR���>��7����:�8)��tǞ��q��]O��IzK�xZ�����SDpQg
b�pI����Fp�ݐ�ѼIk�v�)I�$�螬�.I� \Cv0,��te��	[=T��V@�EO#��V1�|� D`���)0����'8��T��j����\h�o�F��=�rcW��c���PS���g@Pˆ�!����lIƹ�Z�Y�_R���sȃ���X�H�o�=�=kx�tr��NOE?�<��V��|�A�)�((��k"��*,�D�
.YݢcG	7�U��w���屔��t:��`�=���mH������;��sd�W��E�Hi����5>}yZb��P����@�xvY�a_���NΏT_[5Zk�?��g�b86`-DVCK�9�{�n��^��0~��h'ҳ
��ۇ]��#�6Ğ^�O,�R?���+������^�ݲ~b}�][N���]�<4��=.f{{��$M"�),&S�S�2��78�Ãw�o�''��&͍E#��k��;����,ƣ��RM�R�:M���_=}*���􀣻��]�6�ݸ����qO�U���|2�Z�
>�uNrm �{/�l��[ohNO�M^�W��e=���]��@%x���8O��Of�\��79����Y�w�3�A�E�z�rt��j��s���oi~���w�jO��p�COg�} +$���<ɯ�ˢÛ��G�^u�я`�t��RqD�ݓ�ؘ\�4��4
��g�yKe~�#"�)�n���ή��w�0���g�	ϧ�!�̒���^��M�
��V���!FT���c85�(��q����)),c@e�t�N�F����L��Œ���a#�u`�4�A	Ö%�����a�[f��t0ܤ�G�:\��;|(��}{N�R����Pߤ�-i����fS•�SY1�����f;�0���nmޗL���$�[�݂�������F�	5�_���T ��m�_�����^z8��t�Nԭ2�	�4��v��G���)50�H���p2���>d吐c��l}ur)���sܸ�o���
n�{VS8&��![��u�͖��Yl�wY\V
XG�S4��H����L��B�f����a
z2�prޣ��G�U*灇b_�E1����������e���6�ٹg�L�XG��:M��^$�i�^L��|)�������㶩�Ǟ��5L�%{K�{o @�QRę�cZ
ħ	�6+�$@Oȸ�ZR��ϚF�B_��	=ә�����_����r�;�^���)�.�d�"���0��c�߂�|\�F-X_�W%�/^��9����=#�;0#�]�9�\���]O��p���q
������u�pG�|$�&�G��8=�ʬy�Gξ4q���'��ek�@�N��H�C|���J�K��):
1E�G���)��fWnSKkd�}��4FQ=����?��H���Q����=E�`��e3�2�m��,|��<�3a͕�'D��u\��e�F�>�u�v{�h��1r�(�T� I73=������l�����>,D�7\����h�I�X:����~^G`Q�9�"���T@����x4^��\A�H�Gi�ј�p�Y$e	j�H�B�/�i�h��ē�0�ܙ�])
��	�Fn�d^��bd��E{Ͷ�1H����|���kj,��$�x�p����ܮ!4��!z�<0~d)h��zC�œ��4�������n�M����N����RO��'��w<e��9���4T�ɛ����W�'o�ЙBy�[��?����.=��މtnTQ��ͯ�
�@�jO�	'bL9g�NJd~3�o�|Hn1�a6��먼@���3L�ښylA⹋��/��L���5��QvJ	d��nP2�C�Y��C�QI�E���)έĝoB��Ư*jŨ�3#�:]3	��H�x�qX��8'��"��*K糼����=�iD����;�泻5�	��C
~J`����̈́���v/5��fy
naF�k���a]�g���qzݑ��5��j�H�
('�=��U!Cx�8�Jw�&b�����1�ߎ��#sF��Yx�=���6��P�t�����$2TYj�{ќ-�ׂY#q�:/�Ì��+����<(dQ���[�iza���ƕ���J��
$��31(�q���Q�'G+��p�]���7���s�%" �jeLj��!��i8keRnay��M�459(��.��
�A;�noq�lx{�N�Ӥ��mb$i���6��a�s��]��R�c�u��gf�8r����VS�?�ȧ2�8����*Ϭ���-#y|�m�v���Ud�W�<�*q�2o)�
&���Έ��\�g`�c��;۔�C�E(h`}��ـ�pv~�#�Ib�E��0����*
��P&�#4�MW,R#���-�Gv�#z)��إ:QQ�v�%�ձ��
�$I�fi��؈�8����Gr�S��`�οq-�3Z㢑6�p�&yO}s:�^��	>`���yb�/^V;�x8�;Q��6:��Y��7���O2\��1���U�VA��H�R�N��i����)��E�R�.bqWI/����Q��$�u8��$W,4���J�T����9���)�g�=���f�'�;��5cm>�`�.-a8|qr6�q�{%Dug9�C�mBF'Y�y<��]�0����5�;�*������v#��M)H�7ɬ�Z���[�D�3��B��r��r*�Ļǰ��Zs�no��#�MRqУ�h\�
P?��B���7�t��H��F� va~.Z{�-��2[��+�_></ܪ6��Y	$�(����L�S*�T�8�@�^M��SH�[�\�$6�L����f@|-��|�@c-��ߞ�ێ����4��#��	����X&R`��-ڈze5K�Om�U69���>��6�M$Eׯ�|Yi٩��
c�,[�x��F_��Փ}����S�M<���8j�U��H����j��p[	���4E����	�N��Kֆ�����W�Q�RG�=�Y\,�9߇����Mi�\��R��pw��l��8�R��R��l7����/���&��v�]��7����w�ã����`��۳�oߜ�>8?|)9�?���k'Q$�>%IZ��D+O�>����'��^����B{3mα�AQ���G�$EaipU�}��58�Inn]f�����yg���-�����/UT�T��RX��Q���
�&���=c��KW�ί�Փ�n�������Y�E�6��2̯���ї>c������I3��V��YC���$�Ғ����X���T����u�_�Ä�Q��	�b�0�6v5�oǹݵ�*H�9�)�ޔ���!MD���-&!k�_�9��&X4�:bt���W���m�ȭ�� _�*1L-i��sQ_�v�0�A�n�|ٵ��sI�A�U�mV齅7�8(�Uzʈ��w�g==��U�Cq�����2�������_a�[]�=�yK�<hp���5v�FC?'�82�]���浠�N�煑u����7��D'W��[ᰯ�Gc0O���o&�$��������;|qt��˓?����7oO�t68��������}��˯~���� Ji��L���	�)�^�.�����ԙ�XFG�j0=�cJ�I@�b�*Lw�J��#rjMPR�����h��R���Q+��q��um8���m5�ud��*g��q0<wC���R��-�Kg�% �2B��^
6J���f��oj���%�:�A��1
��O� B�4�C��!�Q��*
�M��+�PJ�EP$Z1�j��(S����]���/��a��6f���b4n�~[�p�2�$��;�������3���F�M-��x����7�nW��"���%D���֞_��6_
I5�+ր�J��#�b�I�4�h�T�C����A5��,���|�Gq>�4ey��Ԋ�ʪ���i1�q,�q6~�ۙ��,E!��>����$7����w3�?~���0��ϱڄ�v5L�o�~��`�s���y�(gO䎮&�Ҵ�٧���rpG؛ ���-�U�T��d*Ri˂��K�:�jX���&V(����R�K;XSG�Z��G-V�,�V��X��Ɓ5�-`������ph�ſ2F��P�_���2� �E;��)t(��J��f��ƫ��c������&Ot@�ʍ!<�C�Ho���v�+��q�������N0��Ğ1X��`�PUx��� L�XN@/��L¥EY��K]��-E�(�^N�VBg����D��6�pH��6�r�i������u߲�X�e�vl��:�I���Q\������og�63
�%L�y���\�!�H�8_�3�Ń���y ����ߔn�C���z�����#�L_qM2����t�"f��S/��]���o��}��c,@�a�>��H�乏��E(�1�ߢ�t~��lr�S�rJ��h,��s��)�x��G�R�%�=�a��\B��,��4U�%�s~[ n�h��K�i^YJs6o��8g�v[��Th���J��8�Wk�h�S�H����JN?�����M?���KM}��O.2m/1�74��q�"�Ҷ.Ds�ͥJ1���b�>�f��ZR"ּ+M��N�(��![�^��虽4���^w���lY-ٿ�^�d����kO�2#�dV00�P&S�E�
6���TX��6(���V�-��[\����/'F�7�dS�3�Z8�E��4	��ץ�K�[�	��&[�b۞�N��M]ZT൥��m�9c'�%_=*%������p/NpP��q�Y'2Z���$�{�*x[�׍g�֥خ�H��)	��Zi�~�96�1-���Ot�G}QA�e	E�򔢚�xfUG�Д"�mN�?%'�[I�Y_�dĪ��P�U��.��ۤ���K�~�3�<�z�O��e�Oy�}���O�Y�S��O�i'j��-�C	�,y:�Pn�n�&ѥX��3*�%O���2�E"��I�1�������~L�M�b��[��
V[F�k�ˆ;�]��`W�r/�"V)���s��j>�f�T�3�y<\�>-/z��C���9��� ��27�u���	��^� h��
� �u��ٽ�ʈs*CWExz���e�I�K�P��E�b�IU��.�
�	-�)�/�����y"��Jq�ƃɻ*,����F�� Im梹�$�U���>.k@�r+�߷��zŝ��M�q�wJE{�[�3M*������}��4��vJ>9[��s-�q��u?V��Po��
��ie�"JCkaek���*�Z���}�F�e�vouTU��>61��J�Aa�����} -��*R��pک=qͮ�{=f�����s���1�\�{���7��r��y��K���pj�M�ܪ�،��rYb�0�����[7�4c&�X����4�<5|�1�v���p'"Uxso�8��\�9X!oXFjT�TN`u�</�I:,���5~��t�"�h�#�H�3�DZ�]W�2�aF���������Yu>{j>cW���\_2����P7��Mcݶ�a��i�{Da���e��PvMɑ��r�QsIO��C;�2�U�G��ǫw�ù�B�O���1Kӊ��2�0g˞C��?_�K}Wda�H]�ʙ�ev�]��)�3�v��t��^|�=�t�`�۞��K�VЧF

vvK-䞄UI� m��Su{{�� x��}>CqWԞ�Zv�:]�V���u���7d��-�Ak��pՍ�)��
��m��t�َ߿k��xṱU	�V� /�L���$Ln�I�4��]�K4�.�Ŧ
_gᥢ��M.�����*؜����5���
��'\�,���{�֤�h=����!����+�Mr�K�x�	\Uq��,���L	\�qK��h�)�k���7N�4��En����c�uZj֮�>�!ʼn��i�LJ
�䲙E��� �2J�R�9�z�C�2�P��4�t����#���f���螿)��e"�A!dmz�(�u���9��'\8��^jU�Ђ}��f�E,��1��"��S���,��T[=�E�\۠���j�R.M�|�V����+b�a�Xf�����V��囨lC�W��uR
�B;�����Hŭ��=���9�Ⱉ���(G����b�E�So�f���_����Ŵz]
�
���F[�Dc�hp��i�_N,�J��j��g+�˧�z�g��9�܇w{{�>�f[A��$��x_�^F���9���n���nl�Հ���M�uj�[eӯ�i&�~J�3c�Z«4��Bt���Z7�d�8D���\�ׅuLx�ǝ�y;��/(� ��?���,�n��t��)�}�>i��&������c�t�_���X�m�a��Hj�(0�k��
����$�����Z�ꯞ�{;@A OL�_	5�o鉋s���~<�}^�.x~/# �k�B"ǒ[�ʋ`��(/�p#3�*����,�-���_Ž�[<U�\��5H�LS܍�t�K�gm=0�J���D,X�Z�:��}5���M/"3oV�����,�X��q�����@Fv?度�
g�����ՔĖ���e���h�RI��R�„%�yjc�v�"
�˟��:e8g�~Ww�Ö�"���W�n�Dy����B�-�B��J�&�ay�q�w�$Fi�o�=�V�0�;�9�����&��@��E�Wl���x��Vj�ל_.�6��ן=�n�rl�S���oԵ�����+��I�7��TuK�.P�B���hŏL?�^:�l78�Jo���1P써��s4��Id��>.}�l��g}�5�[�s�7�La#�xL�k��ќJ�i:���9���[y6�0�-��y��-�L�N�'���q\ḘS��E�a�J�Gۢ�fW�/%�&EV��np3-@���{Ő�&���������@ì��$e`di�ih�̧�9�#����D� Sp��,�4���}	W<!��)��-v�I�����'��%��y`���T@5��O��?�}���1oҹ��ƣq���|C�*�p%���� ��?xe�o[6-�]i��O��͝�Ǭ�{8@��pz*[[����>t\!I\���7/��bN7i8��_��m��f��a}����BŔ�>T���:��@�'�{���[����X�͹$����t)�
߾{s�M7��meXfނn=ǦH��;L�I�Z�۞����+K�?/ҷz�ʺ����D��4�oq����?���(��}c����|{�2��%O��]]�f�v��{enJ�
�VJZ��Ӏ�r���+`e���Ʉ5�+�[=œԭ�Z��!��b�9*�:yp�&yH1��w\���{CB��o��;��k�i��wLc�^���Z���ǪKՒ5f9�%o�	�u�vXs�X����\Z�\y�qW�|R��ܾl��D�n��5d�y��I�3�Y���^�.Y�UǪG��Ze��=��7�V)�]� 6�֯#�}�E��xR�OR]r|gn�m�F�:��:��?�7��G�ԿN��}.����Jpy"��T��.��c������ݩ�%
=o}�����
QS�3z�(:��5~�vԶU���S���p4%��#�9~U�[5�^�{��]�l'h.׆���9����[=H�M�Ŋ��=��n��_mqR�Oɷ,�#R���z�Z>o%Դ�C�Ğ���H�f4!n'��h̯~�+�����A9��{�
g��*��n9��lx_?�.��&o�'W�x�Z�"��ӉT���3
=�������t�v�A��PJ5_��15����!fj�6����XU�y�<�O���m�P.�_*�+�볮0_�)C�LH�Gռ
J8Z��ol-\|��TbB<��暠m\N��JPF@+installation/platform/models/joomlamain.php Q���Wms�8��B����IL��ws�!���v��7}�0(5�+�I��V�M1�i{�����V���>�Z��*���ʓ'E�X�F�Nv�`
D0	�����>.g�$〓!u?E!�ܝ�K��@%��pN�OCJ���?JW�І2s�.�!(0a��� �s6�JR[|������;{�{����i�QAޘ��E�RIm��H���P��3�8�H/�i%�����k��K:��p�X���0*���^�ZFY	���/�E!b)��`�i�<ڦ�'�E�?ZެRj��O��b\@t>'2 #��J"1Ա�GD�*��+�B�G����;�EK�bU�8HrH�=�k J\3|:\�z���jV�V�Y��I��;��`��D*ć٘��y�0!Ei������]/��.�ž>]غ�$hև+r�@�B�h����rҞ\����	X���n�|	�5659A�ռDB3di�I}I�{i��&�<0�[ .�������j
>��ޜ�(���o�f��NX�G�j轖58��1�f!��%�M���^��<����1����!+dSB�$�o�%P"��� ����%�"!"W
��Mg�%SI�e -����s�8��K�O��zs��ӢGh'�>v��|M��G�DUZ)��"[�n����u�ꎓ�P�KK2��ںH£����ɍ�Ě��d�q�YH9�����o�b��'o�dk���޵a㙹g	G
�%�Y������ͧ+�7��q/��R^�L�GJ����!xF�p��Xl�ϟ��3_�KF�jv�V����9h�9���f��X{�jy;��F��/
�l�w�p����y���T��>rXkStV�/(�����nAV��۵F��=9IA���|�h�脹��(� �I��Uxx{�8��_��OC���V�j��r��]ܙx�����k�;��F��t�3�t�n����Ob����	���{D���Zv=V�W�T�[b�3�ߺ��5�|�3b̆Bru�ܨ�@;���$�AP���e��~b���3��hQ��{|�����oDU��D5|�$ΩF>����~�7*���G��站h�
��4k���N�I
��8Q��=�7{�ov]콭�u|gJ���t2��W���j���U=��i���]�o*�W�g=�p�2T�<�s�C��h�tKy�B����#L���k$FK���Eĥ#��b0L���٘M�����#&�+ΰ�x�N�L�}�-�d|9XF|x'�3~ z�n��8�[Gp��N��6YMx�,n$�Z���<�bZ/���p��g2�gN�8�����3������Tsl���g\J�)
��+�Ekt�l���:�(�|؎�v���w�v>t#&B���<��A ��TS̉O�j�n��"�/׮e4�,`7F^�����~�,�k8�g\�wz����z��{6�����B�0��0�AmA`�n���u6��lq'2i$����������qOd^�_Y�!�k�[��AMU��p�
�/JPFK6installation/platform/models/serverconfig/htaccess.txtM����V�r�6}�WlF��H�si;M�Le��Ց%W�GV��D�$��d��w$e����43������V��*��0��-9�ߔ�#F��J2-���l~�:ux���4���'$\�H���p¬�ڴ�E��
hn�^�E���4.�QG\r�"8M�z��b%�(
C�_�p�n�돼����j�B��0��a|�Agpr���^���p6�@�x0y0��t��y�*�qr���;H,�3�PE�Z���'�م�e�KJ��G<6�6�b�-
���L5s�eׂ���H��,�	��F- V���k-,o�<�X��lŁE�� �9GR
�0� Cna�|,���bB�q�
��@F�C&�B.	cl��B�|�qW��*�\�&�f�8���R<W&�k�t��c.]�
k�� �*�R��8�U$�j��
d#R,�BǢ�s��R[2ˍ-B8V�#T������Z�����>d�1MOrD�RY�+v��NB���(�+�QswfX��،�te���K�4�=�AR�$!��(yt|���-f�6W+L�Xl�m��t��qIN��B�!r�R�0��t�D<�d�taNls)���TK��h�$RšBD.q-��Ԯ� ��RH�pS.}G��T��ѡ�<H�N#O
���%J�'v�p
��(�f����Rn�B��ޕ����d��"�ruFy	����Uf��k7(&�^�$��P<;׿O����h<�n�o�~���k��u|�a:ΞLN�)��i�����%�w�������1���s���W�����w�J�������z��vo+�ó��`߯��U{s>�9ߙ�7n7?ͮ��n���M~�>�@U���C��_�/�=]]ܦZ›��p��\J6DK-Ƅ�K:ctm�d��P+4���#�[��a�3�=<��V&0=�����!���I�ƪ�1��D[�b�Q���jCKQ�8H�I%��(>��5���~l6�0z����T:q1��rt�w��TӲ2!6E�[+'L;�mjL&-�ʭC����_6z3XDlI�r�ԣf��{"K?!��sDҊ���"7�5�羾kH"�
���<NJ2�]��K��8J�C�l�<n��s8#��$����k_�<x�j�B��
�np��Ž�+A|�F�!�m��~ �&L������E{2>�����v�߶Sd]�?����J8Y�7w�J�8�][E�/�Y�A�!�~��{�U�%~#gT$A��w`��>��b�.&��-<���>�xL� ���ō��:��Y��?�od�O�~��ô���LE�� ]@b{���=����=����JPFM8installation/platform/models/serverconfig/web.config.txt%����Umo�0��_�Yk��A苦MKZQ
��v[�o2�5X2qd;����1�P��k�D~ξ��w�Ͻ�3���<��q���iy�ݪ�?��7��-�RA��w~�r�
%D�<\�sXN��qa�&�ؠ��T@���^
>��yȐA��[�$`䬶
��`	���܀�0��<���1#o��A�Iœo� ��G���eLT0B�`�[���#�\@�H���a};!��B"�#V<M�u�Ow��$��Ty��{��4[~������U te�:�gS��^�ku����ψto:�(R�g��e[��^N��AU�YG�X*��Ij����F��f�ά{�)�?��?{��'����hS��bF�Y�|�m�i�}�S݉cd��k���h�]!%Y��ʲ���ϊ��"3UV��0�xa�i�AY��u�L�����������S�بj�o�����z8F�(������� ���j�Q�)]W4�ɻe�X�U�`g�u�x,���=�ϟ���ܫ��ЊG�מp��9\g1C�q���JPFI4installation/platform/models/joomlaconfiguration.php&	W���Xmo7�l�
��R ����!�=%M�9���-��0�]�Z{�ܒ����g��7k���`kEg�Ùg����e9�޿?�����q N�J��)a�u�H��B��d�m�\&W�RH�,�keEb�t*�])5��U�(�j��5l�����J\d��]nLv�t�u�4J��<<|�Hg�R�Ҋ�b�=�X]�u���V6޻�u�Y�
K���,ުB�����}��V�ҾM��c���A�Y��Qt>��͛W�hLi�F�g�A����ԩ��z��׺Xd�*�ɩ"mK��Vud�J��J(p�K��Kp酈"��+�Nju�����D֙u�FÄ�AV#7��D�`�I�n͆��X�x��{өx-�\8�p)�*��Uj?��i��IK+E���U���0ܫ��0z�I'2$
ZeI
*��ͦ�n�ك�����A���r��2(�&"zFލl!F��+�9W�2�lG:l`� p�V���f��� �4�n�N����{-Ӟ�^K��y�
��vT�&׹���.��DZ�dn鋲��KB��!b�q�N+njU��hKw�p��Α֩�CO
�#պ����O1�5%��CNu��K�\1�T���C�4��y�#?W����08+���(I.j��oė�<�.ɱ���7||D>�w�Hg���3�(�dT<��6���OH`��(��y���^����~����i�ď9FOvu
;��kvq��p�5B��W-���z)o�����S6K���b�^�B!͑�k[��	Z:%�}��F�*A�~�r]�j�B�,���
�3Ke�kj��-+u����͐�ͱ\)
ۏ��"��w��"�U�ef'��w�G�Ng���N��uL��
�\MWԎ�������	}wCM��`�,�j�������<�����TY�'��V���ǰQ��pM�C�'��=x��E�̈+�ɻA^�:^�a�
��-+.��M�·�k���	ƹ��JK�����@p��~�|W�\��b�g��H�u
���9�8��)��b��1���J�2��N6��<H�SK��.��5xg�f+�:eK�[q���y��U��z���F���&y3��Y��y�4�	ؔJ֎�f���z.�{����t�J4��-rj�(��(�6��f��4l���u�s�s�/|!����op'�x����I��,XҐB���s]$ʧ{���25{h�?
JI �|��KS�e8��K�x	$��Z��|���	Cx�UՃf��~֭�ZRN=mo-�upg��Nf����%�&-.m��n�W)R����cO>!��J���Q.���5����ϩ��7ߚ��\�q���7��딺W��6W�h�"�7⚓����'heX�'(��,,�S��-2&õqtp��mW`I))"iA�϶�6�����!Vf!�иcNa�����MJ��6d�obL��6m������y�I�6@�+�A�K��ߖ:��V���rF���X!�g|�ފ>Q�+���0�z]��]�
�Ӏv%�Y5�̞{Xs�2-3"-���m��tJ=�N���c�GHE�&�[*�2����Egg����>&�G��@Hi��ُ�2��<��`!{*Fg�g�2Gc�O���-�I�Y1ޯ1g�G5�����p�)��)�įY��4�
�
t1�+��7Ҥ�?�
�F)���F!��[�*�I��_��D�/�ĸ�jg�`O���|9�|ul�p��Fw:w�2����h�L�jc�ȣ�I�Z������U�ё���^!�|C<�:�э��ՠ iv�>��Vm���8*D��ZVP���Q�\��^��nh�Q�[}4�	�.KM%^r�
�
�w��tL3\�\���S��{
�y?P�)��.Lխ��|s�!��4>��zS�� ���ur��r�Qg.�!���@�Ô�Uc�
�aau�9��ݤ1{�Is��\۫����h���r_�d	�ѫ������?t��]����խ��5V-	BYS�ԻC��.�!��6��Cu��w(f�H<s��ǫ��*�h�T�0�����'��`��=�;��I���T��su��}�hs��3�F�����O+
zM�j��5�ʾ��
F��pY��zw��F�@�F織�[����ܾ�F�v��w�g2^��8?�Q�/�΅37(��P��9�[���SP??�/�L��A�/���i���)�a����"X�z߁��t�w���7S��m������[�^�!'���2R��߹Iv�8n�`K��VWw�σJPFF1installation/platform/controllers/joomlasetup.phpx��e�OO1���Ɵ�K�d4�	Q��<�n;�6�N�"1~w��x��ͼ�}�E1
QV˗Fض�h!PLd2�U0>a��T����5G�P�d"���rOTK�.���͆-g����gU6d�1t�)��`�6a�7��`2ߍ&���Q-[���st��`9��z��>��F���e��%9
���Pg�x��^��J6��B��8��G�Z,feo��Pp/��"�.��]
l-�W�O+7�rg�J��?d&#��-ď�JPFE0installation/platform/controllers/joomlamain.phpj����S]k�0|��>씤)�ӵ�\�6��A�����XE2�J����8�Ѓ�[;;;3��~��:�p��d�VV8��iÜ�
,7�vPjsƗM
��J��7�0�@�D�3��!Tѝ�j�i�sUS�-����zcĢrp���x������������d��m��u#��a7���K
��z���p�

���̩�������@�$0�<��K����Y�0_�i�
�Y�"�9I��{�7Z9��D�C�dOL(�7�����f}=~�#�vD:�fNSȬ�U)M����I��Du+�l[X�k�Y/��+�Q����r�HwH�`�A8?�-Z�ړ�9���J�H��q�M���`v���53��']�lm�LKV��w���K�C�9��j��c�c��}H?�3�m�^�SH�分��'��;��gԞ�#C�A��
�Lw��]����F�� 閤�oۋ�RHTl��K>�>{�L�p��<
cE	�o�ᛰ�f{��:,;Jh֯+d:y}w$掐�]DW� k���$K�A��|-a�1QjY���/l?6��EWz>���Z&�{��V3T��e�4J[zQZ����d��Z��6�
JPFG2installation/platform/views/setup/tmpl/default.php�
I���\ks�H�l~E5;�S�q�kcg0Ȇ"�nͤ(!5H�P�ԍ�����z�$�Ȥǒ��>ι��R�o����?W�Ϩٿ�jHEc#�0�L	�Q3p|�f$@S�|X��L�y��6���50��:*�Y���dp1���Ԙc�����I������j�����?�ӓ�3�wL��E��6(�L�O�.����1K��:&�(o���	�b����)<@���#(����I.@�z�b��a��L��i�uS9�,�/*�U��G#@?2ۡ��
���'30���"�r�=�.�B�I<f@��ze�>h!\�^�1kG�E�IU(gY��xMN���x��;�J(����������^�r����F(�g�o�@e��ml�FȓZ���^�2*MP���{�3exq75†�\�-=S4q�g� ]?I����a�YS��\�quA��:�K��]C1�]� l�"$iz�c��n�P�a�֧Kƈ'\P�������q}��Rl�|z^�?==GF�dQ�-��S��L�J��5��-\��xUipx�g,�eU<���*2��.�	6U���&�e�'�U B�e5���FT�&��_�E�zU9hX�#�w�
�Ԙ2OU-#x�"ʞ]�>�s$b󢊈g�.����.�C�`�C3å����7��9����W�:"��6y�H�#���!�U�]C�3���K���
��T�<��@L�D;RU�h�	P���08&�vas�S���Id�
<�A�Q.1��QX
�]5xfE�@�1����'5E�Ɵ����lk���k��y�C��΀ZBL=l�ۛ��s���s�)vyn��ќ-ѣ�-z�{B�~�N��aku�\t�x��!��Oԯ"ǒ���L�
w	7$�Q�P =�l�ר4H��z$(Ma('�
�P�
�|�<�qQ����Z+/#��	^�[	����E(G�"�����"�}7T��o
�0�bo���j�Zb�$4���V)x��/���&�鯀�ˇ�@����5Α�$R"�����<.�r����P�.���ag8�G����K/�w���y��A���1�'#�o; ���t@kUTr}q�M@���^��7G�n�v�$�З�z9�������xOt�E����Z�FL��9ta0�^9;����ޕ���gm��o���vWo^�������zO�Q9L4N" ��}�~�xBi�N�y��&�VCj��4�1�.F���BԮ��?Q��5Q؎ɸ�ک�$���Ŀ5����ȁ��)'%-J;�{�Ҿ\�}�l�[$��"�`v)���qg/$����(�z�7�T~D�hUcsM����ŔƋ5�kTA9<B���/�'0�U�X9ܚS�N!�)a�ܰ�x�k�hp=��h�#!z *��9_�q`�IY��)F|��]����x�LZ�f���G;���=�h�C.����<-�$(Z�ճ"�ol�P �!p���m,�"���įTi��9]��Ӥe����B/"����u˦&>�&�P4N�y��u��ǥ�*��%�9w�吪<v�a=��D�b��|�<ۅ�Tt�%��&?�:�W��I2>I����=H�:��ڨ���R���E�|�..�����N|H\00��;�?���L��ݵ�b�H�	hA"�4�]��WwЇ�?�wdt���p�3\��`7�7T��_7��
����a�=��lu����{��2y�|�`<d��=���S,�U�'
�m����0�S�N$��O��"�l��sw-�X ����s,�V� �����vw��d���mע$�&��y��$��ͮ��2�u�hê����Í����L��izk��F,���Q���0M�����8|m�v��/�_�vO1;�f��*�s�����a��m޴*;gJ�&BYؒb�e</��d.�w-ff�~���f	�1UU����[NB��^��M|�aB8s��+�c�bK�ғT+w'�89���^�f�MƙM�%2%�իD���
�շ��Gڰ�li��u�'.�;���mC^�ao\�"�q�ٷ7��0jA����J��l���je�H�ýT)Z)�>��s7��
;�n��q��v��1iirWA7�Do�����C�O֫�'ޠ5���R�T�x��HL�Z����r-�;+��;�t��ؒ�K�<���m�x8�ۇ�d����$?�f���! �m�4�;�|�>�[贾?��`��mu�F�_%�g&���=�ы�\��̴e˃���Q�[���0�Q�
�XP����r D�����o�}��i9����^�OD��d��r������bd'����st	��%��6���R�5�U(FM0���Y�]�<��Sw�%�OCm�	:޼ӥRϒ2?��m:��.sV���Y����}wgYaUK����;�	�L�åaG�"�M�A�v�����={�t��N��%�GP3w��Q�F��I�H�+�"��$��B���1^�څJ��뼆��w�*�Q�u�fp��+ZX�%f�������>�`�K3��kh�P�볳���Ԝk<D�Q4�Z[70(��v�$����wn�Y�x(�᱓6��E����>?�-��|����c��{z�:%���9:=�mz/@�P��&O7���q9�O�vZ2&�rt��t�|���'�l[��8ѡpBmPp��i�忹�y{!>n5�i��|��l�L�V�_���dt1����t�Xk�ʄP�N^�HnT2�����\d�[.���gt�+����sE����@/��@�6��x�,:�x���Ų"wǗ�]�._�j�y��0�ɯ5�ۀ_8.��p0�!k���܊^��9��~X����g��2��*�7����A�sҹ2!k��,:��;��k�W7�/:0V�s�˓‡_�ǂW{g,��o����vw{D�+!��h�%r�F+��U\�X��|�$��j�]��!X��4 Or�ß�5x�p�uX�vx!��n�L�@T^=�~�f��A��������� sv*˦�ޞ�@�ל�e7��}�;�)���d�C|V!"і:̠I���N�N����JƘ![��?+9x^1c*��pY�Z`�d^EF�B4
�8�%����9�t��FnD*'V�1�n�g���!D��c�P���$P%bs�zr6EJ��/:Hn����Ք,��5<��ɱ�}Y�pr�*�1�ſ�����h��#�$H��jD߼Ye��W���
��y �&�>���R�d�/�L�goo��碒�>���L�{��H�߲�9G�횜噰lό����
ɚNF�װ,��lLs�[a�	[�GH���@��L�=2���}Z�xK��?$�I |U�?JPFD/installation/platform/views/setup/view.html.phpa1���X{o�H�>�\զ�K�tR�%)I����8)Bh����Z�]��ov��&����HA���7����4��wUx��Uˁ=��)H�(*D1�t����!q�N# �ٌJp%�z0\@�+�Cg	E�+=pԡ�|�p��)�5k.���}�ٓ����?|�:�y@$|އ4h!yħ�p��h+��
�KC��_u�ኆT���!n@;ٜQ!�_v]
���ժGG,��m
��a�4�Ǩ]�X��h�������y�*�~S4�pY/U��V0��iF�� �R+Q�}G*��@��c��"��C΋�>��w]$UbJ�jE�JP�c��a��1LC�
h``}�>�T���Ԑg�[^�"�K��M����c�@nօP��*�X�m{=�Vo-Hz��Q����A6A'|F�~�Bvi��<�7�Eq�#uQ'oũ6U�h�{����7��Ʉ�!WM,�@���	c,�G���BR���`!1�,SӼCh�J�dFA!����\�z�6А�Bk�C������1���<�frB�믃�'�u(�5�i��xxF�y�k�B�V�`�Vv����I��פAD�mI(K��<$M�RL�BT�H��흌���/I?�v������22��q�=��$ q�ؙ�cp%y^�eZQ��c���|'�Y
a/Yf:��t#9�ˀ~cRI��h�ޅ�{x�6m��8���v
���ё���4�5U���4�d�T����q0^��,xF]0y�k��eu
�A/�=��l\��y]�&y�ˤ��L��p���L,�%=	*�m�+�,��,k�,zL�ұ�>�Ԋс�=��;h��=��=��\����̓�mv[�֠鴻���ORҀt��1�qq�lt.���I�5�k����2��1��^G�7�V�5�Զ4���R �=�w_�q<�ia�L)��M99�V�����-X��V�l&%6���'+Gj�k�sL�YQ��d�S!h�����9��i�a����5�Аz]�=�˒y߽hܽL&佪���9)�/O���n�q�4���N�WZe��o���9K~X�/��W�ͻn��{�xQ��������W�t�Lh<n1���@���H�(��t�s��\E�vȧ��~���7���cA�:�奼V�
,��&�WJE<'��E�exkq	�U��yI��кN̜�Y���O$�G���d�!f��5�Ո"�gf�c�խ�<9�;,�/R�K#R�IY��]�Uq{^��t�D;C�`F�a{�0��a�]�5��>x�T�GOlK[bV��X�F�)Btz��[%1�#��$�`+d�DhV����M��� �ϔ
�ɐXVݝ���$U�Ey�S�tb��sv}!l��rZ��z�_�uZ��^-ݟ��
��{��]syJð�e���w��]"���,�(��K��{ie�/Ͻxg��8���ĕS���&b�L���1U�g�M���(�g��තq��Y������n��E�JIӯ	V6*���h�3D
6��5�
��0F��������H�ϫ5���D�L�1`c�X����N���\�·�8�^9�cu�,��g���.=W�JPFG2installation/platform/views/finalise/view.html.php-���eS�N1}��b��EI��h�5����d]�������;�
7)�3s�̙3�����>�}�'W�c�c�tD���2jg!(��s�a&�S]���K�<ʈ�6�?!�$���x�L�qԣi󣢬\ SL�j��p�*;���G0ѪtF��Èm��\m\���w�H\F+��Ὶ��+�襁�zF	��%��C3�Qh$Cx*>`����X�7���s�5�B��NS$!@��qu��4��p��i��u��ݼ�*���9�yx/��0�}�b�C�L9)��w&��j�ウƑS�3�(2��4�b���]����h���-����5����9a{�رd}�W���D�j�\���g-*���-pݧ����Js3�9���%��q�׶=����r�YF�r�SbK��m*zw:{Ϯ@C�v��5�M$m��m4�nEf��A���FZ���iޅA[�� �TӒhK�7�6Z�������D��k����/>¨Oǒ��Kz/7"�~�z�4^j�D@��H3o}c�-D_#Ŷl�JPFC.installation/platform/views/main/tmpl/init.php/W���Rao�0����c %���A�u˶j��V0:��P�ڗ�Ե�����$�	�@B�����޻�|rV�ED"8�tz=�Y��G�輱�K��q+���`|Y�,��p�̣���%��nB���;�L�h΋�e��%�5n��������_	o�:�פ���T��(��
WA�֙”�8�c/j,%9jW�_O��5Z��M�
�k������J*,`��4�̀�5�i���̈́I
�����#3�Q$�<�/ҸUa�I�8�0m��@&R��᪨(��y,��0Xh�6���UQZ�����)�l6mV���fE���
���.Jk��gcV��s�RO��LZ��À��͟�!G��n�4e�DM��H�/��[x�yN����z&D�8���ZC��
g�(:�^��';?,~��o�!�O�\���:e����IUZ�D{
Dmi:ï�ߟ'�$M���v��nt;�
g6�0�[�50
ȃ;j!���+Bn��!KKȋN8�(����ӂiT�Q)-����O
�_#�C��'���Gt�ԙ�w�M�0v��components/com_akeeba/Master/Installers/angie-joomla.json000060400000000551152453623440017614 0ustar00{
    "angie": {
        "name": "ANGIE for Joomla! Sites",
        "package": "angie.jpa,angie-joomla.jpa",
        "language": "language-angie.jpa,language-joomla.jpa",
        "installerroot": "installation",
        "sqlroot": "installation\/sql",
        "databasesini": "1",
        "readme": "1",
        "extrainfo": "1",
        "password": "1"
    }
}components/com_akeeba/Master/Installers/none.json000060400000000254152453623440016211 0ustar00{
  "none": {
    "name": "No Installer",
    "package": "",
    "installerroot": "",
    "sqlroot": "sql",
    "databasesini": 0,
    "readme": 0,
    "extrainfo": 0
  }
}components/com_akeeba/Master/Installers/web.config000060400000000272152453623440016323 0ustar00<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.web>
        <authorization>
            <deny users="*"/>
        </authorization>
    </system.web>
</configuration>components/com_akeeba/Master/Installers/.htaccess000060400000000245152453623440016155 0ustar00<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
  <RequireAll>
    Require all denied
  </RequireAll>
</IfModule>components/com_akeeba/Master/Installers/angie.ini000060400000000345152453623440016144 0ustar00[angie]
name="ANGIE for Joomla! Sites"
package="angie.jpa,angie-joomla.jpa"
language="language-angie.jpa,language-joomla.jpa"
installerroot="installation"
sqlroot="installation/sql"
databasesini=1
readme=1
extrainfo=1
password=1
components/com_akeeba/Master/Stats/usagestats.php000060400000004160152453623440016231 0ustar00<?php
/**
 * @package   Usagestats
 * @copyright Copyright (c)2014-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

class AkeebaUsagestats
{
	/**
	 * Unique identifier for the site, created from server variables
	 *
	 * @var string
	 */
	private $siteId;

	/**
	 * Associative array of data being sent
	 *
	 * @var array
	 */
	private $data = [];

	/**
	 * Remote url to upload the stats
	 *
	 * @var string
	 */
	private $remoteUrl = 'https://abrandnewsite.com/index.php';

	/**
	 * Set the unique, anonymous site identifier
	 *
	 * @param   string  $siteId  The site ID to set
	 *
	 * @return  void
	 */
	public function setSiteId($siteId)
	{
		$this->siteId = $siteId;
	}

	/**
	 * Sets the value of a collected variable. Use NULL to unset it.
	 *
	 * @param   string  $key    Variable name
	 * @param   string  $value  Variable value
	 */
	public function setValue($key, $value)
	{
		$this->data[$key] = $value;

		if (is_null($value))
		{
			unset($this->data[$key]);
		}
	}

	/**
	 * Uploads collected data to the remote server
	 *
	 * @param   bool  $useIframe  Should I create an iframe to upload data or should I use cURL/fopen?
	 *
	 * @return  string|bool  The HTML code if an iframe is requested or a boolean if we're using cURL/fopen
	 */
	public function sendInfo($useIframe = false)
	{
		// No site ID? Well, simply do nothing
		if (!$this->siteId)
		{
			return '';
		}

		// First of all let's add the siteId
		$this->setValue('sid', $this->siteId);

		// Then let's create the url
		$url = $this->remoteUrl . '?' . http_build_query($this->data);

		// Should I create an iframe?
		if ($useIframe)
		{
			return '<!-- Anonymous usage statistics collection for Akeeba software --><iframe style="display: none" src="' . $url . '"></iframe>';
		}

		// Do we have cURL installed?
		if (
			function_exists('curl_init')
			&& function_exists('curl_setopt')
			&& function_exists('curl_exec'))
		{
			$ch = curl_init($url);

			curl_setopt($ch, CURLOPT_TIMEOUT, 5);

			return curl_exec($ch);
		}

		// We do not have cURL. Let's try with fopen instead.
		return @fopen($url, 'r');
	}
}
components/com_akeeba/BackupPlatform/.htaccess000060400000000246152453623440015515 0ustar00<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
  <RequireAll>
    Require all denied
  </RequireAll>
</IfModule>
components/com_akeeba/BackupPlatform/Joomla3x/Platform.php000060400000072323152453623440017715 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Engine\Platform;

// Protection against direct access
defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Driver\Joomla;
use Akeeba\Engine\Driver\Mysql;
use Akeeba\Engine\Driver\Mysqli;
use Akeeba\Engine\Driver\Pdomysql;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Finalization\TestExtract;
use Akeeba\Engine\Platform;
use Akeeba\Engine\Platform\Base as BasePlatform;
use Akeeba\Engine\Psr\Log\LogLevel;
use DateTimeZone;
use Exception;
use FOF40\Container\Container;
use FOF40\Date\Date;
use JLoader;
use JMail;
use Joomla\CMS\Access\Access;
use Joomla\CMS\Filesystem\File;
use Joomla\CMS\Filesystem\Folder;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Mail\Mail;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\Version;

if (!defined('DS'))
{
	define('DS', DIRECTORY_SEPARATOR); // Still required by Joomla! :(
}

/**
 * Joomla! 3.x platform class
 */
class Joomla3x extends BasePlatform
{
	/**
	 * Override profile ID, for use in automated testing only
	 *
	 * @var   int|null
	 */
	public static $profile_id = null;
	/**
	 * Platform class priority
	 *
	 * @var  int
	 */
	public $priority = 53;
	/**
	 * This platform's name
	 *
	 * @var  string
	 */
	public $platformName = 'joomla3x';
	/**
	 * The container of the Akeeba Backup component
	 *
	 * @var  Container
	 */
	protected $container = null;
	/**
	 * Flash variables for the CLI application. We use this array since we're hell bent on NOT using Joomla's broken
	 * session package.
	 *
	 * @var   array
	 *
	 * @since 5.3.5
	 */
	protected $flashVariables = [];

	/**
	 * Public constructor
	 */
	function __construct()
	{
		$this->container = Container::getInstance('com_akeeba');
	}

	public static function quirk_013()
	{
		$stock_dirs  = Platform::getInstance()->get_stock_directories();
		$default_out = @realpath($stock_dirs['[DEFAULT_OUTPUT]']);

		$registry = Factory::getConfiguration();
		$outdir   = $registry->get('akeeba.basic.output_directory');

		foreach ($stock_dirs as $macro => $replacement)
		{
			$outdir = str_replace($macro, $replacement, $outdir);
		}

		$outdir_real = @realpath($outdir);

		// If the output folder is the default one (or any subdir), we are safe
		if (strpos($outdir_real, $default_out) !== false)
		{
			return false;
		}

		$component_path = @realpath(JPATH_ADMINISTRATOR . '/components/com_akeeba');

		$forbiddenPaths = [
			'akeeba',
			'AliceChecks',
			'AliceEngine',
			'alice',
			'assets',
			'Assets',
			'BackupEngine',
			'BackupPlatform',
			'Controller',
			'controllers',
			'Dispatcher',
			'engine',
			'fields',
			'Helper',
			'helpers',
			'Master',
			'Model',
			'models',
			'platform',
			'plugins',
			'sql',
			'tables',
			'Toolbar',
			'View',
			'views',
			'ViewTemplates',
		];

		foreach ($forbiddenPaths as $subdir)
		{
			$checkPath = realpath($component_path . '/' . $subdir);

			if ($checkPath === false)
			{
				continue;
			}

			$checkPath .= DIRECTORY_SEPARATOR;

			if (strpos($outdir_real, $checkPath) === 0)
			{
				return true;
			}
		}

		return false;
	}

	public static function quirk_400()
	{
		return version_compare(JVERSION, '4.0', 'ge');
	}

	/**
	 * Loads the current configuration off the database table
	 *
	 * @param   int  $profile_id  The profile where to read the configuration from, defaults to current profile
	 *
	 * @return  bool  True if everything was read properly
	 */
	public function load_configuration($profile_id = null, $reset = true)
	{
		// Load the configuration
		parent::load_configuration($profile_id, $reset);

		// If there is no embedded installer or the wrong embedded installer is selected, fix it automatically
		$config             = Factory::getConfiguration();
		$embedded_installer = $config->get('akeeba.advanced.embedded_installer', null);

		if (empty($embedded_installer) || ($embedded_installer == 'angie-joomla'))
		{
			$protectedKeys = $config->getProtectedKeys();
			$config->setProtectedKeys([]);
			$config->set('akeeba.advanced.embedded_installer', 'angie');
			$config->setProtectedKeys($protectedKeys);
		}

		return true;
	}

	/**
	 * Saves the current configuration to the database table
	 *
	 * @param   int  $profile_id  The profile where to save the configuration to, defaults to current profile
	 *
	 * @return  bool  True if everything was saved properly
	 */
	public function save_configuration($profile_id = null)
	{
		// If there is no embedded installer or the wrong embedded installer is selected, fix it automatically
		$config             = Factory::getConfiguration();
		$embedded_installer = $config->get('akeeba.advanced.embedded_installer', null);

		if (empty($embedded_installer) || ($embedded_installer == 'angie-joomla'))
		{
			$protectedKeys = $config->getProtectedKeys();
			$config->setProtectedKeys([]);
			$config->set('akeeba.advanced.embedded_installer', 'angie');
			$config->setProtectedKeys($protectedKeys);
		}

		// Save the configuration
		return parent::save_configuration($profile_id);
	}

	/**
	 * Performs heuristics to determine if this platform object is the ideal
	 * candidate for the environment Akeeba Engine is running in.
	 *
	 * @return bool
	 */
	public function isThisPlatform()
	{
		// Make sure _JEXEC is defined
		if (!defined('_JEXEC'))
		{
			return false;
		}

		// We need JVERSION to be defined
		if (!defined('JVERSION'))
		{
			return false;
		}

		// Check if the Joomla Factory class exists
		if (!class_exists('JFactory') && !class_exists('Joomla\CMS\Factory'))
		{
			return false;
		}

		// Check if a valid application class exists
		$appExists = class_exists('Joomla\CMS\Application\CMSApplication')
			|| class_exists('Joomla\CMS\Application\CliApplication')
			|| class_exists('FOFApplicationCLI');

		if (!$appExists)
		{
			return false;
		}

		return true;
	}

	/**
	 * Returns an associative array of stock platform directories
	 *
	 * @return array
	 */
	public function get_stock_directories()
	{
		static $stock_directories = [];

		if (empty($stock_directories))
		{
			$jreg                                  = $this->container->platform->getConfig();
			$tmpdir                                = $jreg->get('tmp_path');
			$stock_directories['[SITEROOT]']       = $this->get_site_root();
			$stock_directories['[ROOTPARENT]']     = @realpath($this->get_site_root() . '/..');
			$stock_directories['[SITETMP]']        = $tmpdir;
			$stock_directories['[DEFAULT_OUTPUT]'] = $this->get_site_root() . '/administrator/components/com_akeeba/backup';
		}

		return $stock_directories;
	}

	/**
	 * Returns the absolute path to the site's root
	 *
	 * @return string
	 */
	public function get_site_root()
	{
		static $root = null;

		if (empty($root) || is_null($root))
		{
			$root = JPATH_ROOT;

			if (empty($root) || ($root == DIRECTORY_SEPARATOR) || ($root == '/'))
			{
				// Try to get the current root in a different way
				if (function_exists('getcwd'))
				{
					$root = getcwd();
				}

				if ($this->container->platform->isBackend())
				{
					if (empty($root))
					{
						$root = '../';
					}
					else
					{
						$adminPos = strpos($root, 'administrator');
						if ($adminPos !== false)
						{
							$root = substr($root, 0, $adminPos);
						}
						else
						{
							$root = '../';
						}

						// Degenerate case where $root = 'administrator'
						// without a leading slash before entering this
						// if-block
						if (empty($root))
						{
							$root = '../';
						}
					}
				}
				else
				{
					if (empty($root) || ($root == DIRECTORY_SEPARATOR) || ($root == '/'))
					{
						$root = './';
					}
				}
			}

			if (!in_array(substr($root, -1), ['/', '\\']))
			{
				$root .= DIRECTORY_SEPARATOR;
			}
		}

		return $root;
	}

	/**
	 * Returns the absolute path to the installer images directory
	 *
	 * @return string
	 */
	public function get_installer_images_path()
	{
		return JPATH_ADMINISTRATOR . '/components/com_akeeba/Master/Installers';
	}

	/**
	 * Returns the active profile number
	 *
	 * @return int
	 */
	public function get_active_profile()
	{
		// Automated testing override
		if (!is_null(self::$profile_id) && (self::$profile_id > 0))
		{
			return self::$profile_id;
		}
		// Constant override
		elseif (defined('AKEEBA_PROFILE'))
		{
			return AKEEBA_PROFILE;
		}
		// Use the session. If it's a CLI app always default to profile #1 (unless explicitly set otherwise)
		else
		{
			$defaultProfile = $this->container->platform->isCli() ? 1 : null;

			return $this->container->platform->getSessionVar('profile', $defaultProfile, 'akeeba');
		}
	}

	/**
	 * Returns the selected profile's name. If no ID is specified, the current
	 * profile's name is returned.
	 *
	 * @return string
	 */
	public function get_profile_name($id = null)
	{
		if (empty($id))
		{
			$id = $this->get_active_profile();
		}
		$id = (int) $id;

		$db  = Factory::getDatabase($this->get_platform_database_options());
		$sql = $db->getQuery(true)
			->select($db->qn('description'))
			->from($db->qn('#__ak_profiles'))
			->where($db->qn('id') . ' = ' . $db->q($id));
		$db->setQuery($sql);

		return $db->loadResult();
	}

	/**
	 * Returns the backup origin
	 *
	 * @return string Backup origin: backend|frontend
	 */
	public function get_backup_origin()
	{
		if (defined('AKEEBA_BACKUP_ORIGIN'))
		{
			return AKEEBA_BACKUP_ORIGIN;
		}

		if ($this->container->platform->isBackend())
		{
			return 'backend';
		}

		if ($this->container->platform->isFrontend())
		{
			return 'frontend';
		}

		return 'cli';
	}

	/**
	 * Returns a MySQL-formatted timestamp out of the current date
	 *
	 * @param   string  $date  [optional] The timestamp to use. Omit to use current timestamp.
	 *
	 * @return string
	 */
	public function get_timestamp_database($date = 'now')
	{
		$date = new Date($date);

		if (method_exists($date, 'toSql'))
		{
			return $date->toSql();
		}

		if (method_exists($date, 'toMySQL'))
		{
			return $date->toMySQL();
		}


		return '0000-00-00 00:00:00';
	}

	/**
	 * Returns the current timestamp, taking into account any TZ information,
	 * in the format specified by $format.
	 *
	 * @param   string  $format  Timestamp format string (standard PHP format string)
	 *
	 * @return string
	 */
	public function get_local_timestamp($format)
	{
		// Do I have a forced timezone?
		$tz = $this->get_platform_configuration_option('forced_backup_timezone', 'AKEEBA/DEFAULT');

		// No forced timezone set? Use the default Joomla! behavior.
		if (empty($tz) || ($tz == 'AKEEBA/DEFAULT'))
		{
			$tz = $this->getJoomlaTimezone();
		}

		$utcTimeZone = new DateTimeZone('UTC');
		$dateNow     = new Date('now', $utcTimeZone);
		$timezone    = new DateTimeZone($tz);
		$dateNow->setTimezone($timezone);

		return $dateNow->format($format, true);
	}

	/**
	 * Returns the current host name
	 *
	 * @return string
	 */
	public function get_host()
	{
		if ($this->container->platform->isCli())
		{
			$url  = Platform::getInstance()->get_platform_configuration_option('siteurl', '');
			$oURI = new Uri($url);
		}
		else
		{
			// Running under the web server
			$oURI = Uri::getInstance();
		}

		return $oURI->getHost();
	}

	public function get_site_name()
	{
		$jconfig = $this->container->platform->getConfig();

		return $jconfig->get('sitename', '');
	}

	/**
	 * Gets the best matching database driver class, according to CMS settings
	 *
	 * @param   bool  $use_platform  If set to false, it will forcibly try to assign one of the primitive type
	 *                               (Mysql/Mysqli) and NEVER tell you to use a platform driver.
	 *
	 * @return string
	 */
	public function get_default_database_driver($use_platform = true)
	{
		$jconfig = $this->container->platform->getConfig();
		$driver  = $jconfig->get('dbtype');
		$driver  = strtolower($driver);

		$hasPdo    = class_exists('\PDO');
		$hasMySQL  = function_exists('mysql_connect');
		$hasMySQLi = function_exists('mysqli_connect');

		// Prime with a default return value, favoring PDO MySQL if available
		$defaultDriver = Pdomysql::class;

		if (!$hasPdo)
		{
			// Second best choice is MySQLi
			$defaultDriver = Mysqli::class;

			// Third best choice is MySQL
			if (!$hasMySQLi && $hasMySQL)
			{
				$defaultDriver = Mysql::class;
			}
		}

		// Let's see what driver Joomla! uses...
		if ($use_platform)
		{
			$hasNookuContent = file_exists(JPATH_ROOT . '/plugins/system/nooku.php');

			switch ($driver)
			{
				// MySQL or MySQLi drivers are known to be working; use their
				// Akeeba Engine extended version, Akeeba\Engine\Driver\Joomla
				case 'mysql':
					// So, Joomla! 4's "mysql" is, actually, "pdomysql". Therefore I can use our own wrapper driver
					if (version_compare(JVERSION, '3.999.999', 'gt'))
					{
						return Joomla::class;
					}

					// The piece of crap called FaLang is lying about the database driver
					if (!$hasMySQL)
					{
						return Mysqli::class;
					}

					if ($hasNookuContent)
					{
						return Mysql::class;
					}

					return Joomla::class;

					break;

				case 'mysqli':
					if ($hasNookuContent)
					{
						return Mysqli::class;
					}

					return Joomla::class;

					break;

				// Any other case, use our platform-specific driver
				default:
					return Joomla::class;

					break;
			}
		}

		// Is this a subcase of mysqli or mysql drivers?
		if (substr($driver, 0, 8) == 'pdomysql')
		{
			return Pdomysql::class;
		}
		elseif (substr($driver, 0, 6) == 'mysqli')
		{
			return Mysqli::class;
		}
		elseif (substr($driver, 0, 5) == 'mysql')
		{
			// The piece of crap called FaLang is lying about the database driver
			if (!$hasMySQL)
			{
				return Mysqli::class;
			}

			return Mysql::class;
		}

		// Sometimes we get driver names in the form of foomysql instead of mysqlfoo. Let's look for that too.
		if (substr($driver, -8) == 'pdomysql')
		{
			return Pdomysql::class;
		}
		elseif (substr($driver, -6) == 'mysqli')
		{
			return Mysqli::class;
		}
		elseif (substr($driver, -5) == 'mysql')
		{
			/**
			 * Apparently there are some folks of dubious intelligence out there writing custom database drivers without
			 * understanding or caring about the differences between mysql and mysqli drivers in PHP. They don't play
			 * nice but I have my way to work around their ignorance, FORCING mysqli when they erroneously report mysql
			 * on servers which no longer support this ancient, obsolete database connector. Of course the proper way
			 * to address this would be having these folks fix their broken software but I think I'm asking for too
			 * much. They know who they are, fa la la...
			 */
			if (!$hasMySQL)
			{
				return Mysqli::class;
			}

			return Mysql::class;
		}

		// I give up! You'd better be usign a MySQL db server.
		return $defaultDriver;
	}

	/**
	 * Returns a set of options to connect to the default database of the current CMS
	 *
	 * @return array
	 */
	public function get_platform_database_options()
	{
		static $options;

		if (empty($options))
		{
			$conf    = $this->container->platform->getConfig();
			$options = [
				'host'     => $conf->get('host'),
				'user'     => $conf->get('user'),
				'password' => $conf->get('password'),
				'database' => $conf->get('db'),
				'prefix'   => $conf->get('dbprefix'),
			];
		}

		return $options;
	}

	/**
	 * Provides a platform-specific translation function
	 *
	 * @param   string  $key  The translation key
	 *
	 * @return string
	 */
	public function translate($key)
	{
		return Text::_($key);
	}

	/**
	 * Populates global constants holding the Akeeba version
	 */
	public function load_version_defines()
	{
		$basePath = JPATH_ADMINISTRATOR . '/components/com_akeeba';

		if (file_exists($basePath . '/version.php'))
		{
			require_once($basePath . '/version.php');
		}

		if (!defined('AKEEBA_VERSION'))
		{
			define("AKEEBA_VERSION", "dev");
		}
		if (!defined('AKEEBA_PRO'))
		{
			define('AKEEBA_PRO', false);
		}
		if (!defined('AKEEBA_DATE'))
		{
			$date = new Date();

			define("AKEEBA_DATE", $date->format('Y-m-d'));
		}
	}

	/**
	 * Returns the platform name and version
	 *
	 * @param   string  $platform_name  Name of the platform, e.g. Joomla!
	 * @param   string  $version        Full version of the platform
	 */
	public function getPlatformVersion()
	{
		$v = new Version();

		return [
			'name'    => 'Joomla!',
			'version' => $v->getShortVersion(),
		];
	}

	/**
	 * Logs platform-specific directories with LogLevel::INFO log level
	 */
	public function log_platform_special_directories()
	{
		$ret = [];

		Factory::getLog()->log(LogLevel::INFO, "JPATH_BASE         :" . JPATH_BASE, ['translate_root' => false]);
		Factory::getLog()->log(LogLevel::INFO, "JPATH_SITE         :" . JPATH_SITE, ['translate_root' => false]);
		Factory::getLog()->log(LogLevel::INFO, "JPATH_ROOT         :" . JPATH_ROOT, ['translate_root' => false]);
		Factory::getLog()->log(LogLevel::INFO, "JPATH_CACHE        :" . JPATH_CACHE, ['translate_root' => false]);
		Factory::getLog()->log(LogLevel::INFO, "Computed <root>    :" . $this->get_site_root(), ['translate_root' => false]);

		// If the release is older than 3 months, issue a warning
		if (defined('AKEEBA_DATE'))
		{
			$releaseDate = new Date(AKEEBA_DATE);

			if (time() - $releaseDate->toUnix() > 10368000)
			{
				if (!isset($ret['warnings']))
				{
					$ret['warnings'] = [];
					$ret['warnings'] = array_merge($ret['warnings'], [
						'Your version of Akeeba Backup is more than 120 days old and most likely already out of date. Please check if a newer version is published and install it.',
					]);
				}
			}

		}

		// Detect UNC paths and warn the user
		if (DIRECTORY_SEPARATOR == '\\')
		{
			if ((substr(JPATH_ROOT, 0, 2) == '\\\\') || (substr(JPATH_ROOT, 0, 2) == '//'))
			{
				if (!isset($ret['warnings']))
				{
					$ret['warnings'] = [];
				}

				$ret['warnings'] = array_merge($ret['warnings'], [
					'Your site\'s root is using a UNC path (e.g. \\\\SERVER\\path\\to\\root). PHP has known bugs which may',
					'prevent it from working properly on a site like this. Please take a look at',
					'https://bugs.php.net/bug.php?id=40163 and https://bugs.php.net/bug.php?id=52376. As a result your',
					'backup may fail.',
				]);
			}
		}

		if (empty($ret))
		{
			$ret = null;
		}

		return $ret;
	}

	/**
	 * Loads a platform-specific software configuration option
	 *
	 * @param   string  $key
	 * @param   mixed   $default
	 *
	 * @return mixed
	 */
	public function get_platform_configuration_option($key, $default)
	{
		$value = $this->container->params->get($key, $default);

		// Some configuration options may have to be decrypted
		switch ($key)
		{
			case 'frontend_secret_word':
				$secureSettings = Factory::getSecureSettings();
				$value          = $secureSettings->decryptSettings($value);
				break;
		}

		return $value;
	}

	/**
	 * Returns a list of emails to the Super Administrators
	 *
	 * @return  array
	 */
	public function get_administrator_emails()
	{
		$options = $this->get_platform_database_options();
		$db      = Factory::getDatabase($options);

		// Get all usergroups with Super User access
		$q      = $db->getQuery(true)
			->select([$db->qn('id')])
			->from($db->qn('#__usergroups'));
		$groups = $db->setQuery($q)->loadColumn();

		// Get the groups that are Super Users
		$groups = array_filter($groups, function ($gid) {
			return Access::checkGroup($gid, 'core.admin');
		});

		$mails = [];

		foreach ($groups as $gid)
		{
			$uids = Access::getUsersByGroup($gid);
			array_walk($uids, function ($uid, $index) use (&$mails) {
				$mails[] = $this->container->platform->getUser($uid)->email;
			});
		}

		return array_unique($mails);
	}

	/**
	 * Sends a very simple email using the platform's mailer facility
	 *
	 * @param   string  $to          The recipient's email address
	 * @param   string  $subject     The subject of the email
	 * @param   string  $body        The body of the email
	 * @param   string  $attachFile  The file to attach (null to not attach any files)
	 *
	 * @return  boolean
	 */
	public function send_email($to, $subject, $body, $attachFile = null)
	{
		Factory::getLog()->log(LogLevel::DEBUG, "-- Fetching mailer object");

		/** @var JMail $mailer */
		try
		{
			$mailer = Platform::getInstance()->getMailer();
		}
		catch (Exception $e)
		{
			$mailer = null;
		}

		if (!is_object($mailer))
		{
			Factory::getLog()->log(LogLevel::WARNING, "Could not send email to $to - Joomla! cannot send e-mails. Please check your From EMail and From Name fields in Global Configuration.");

			return false;
		}

		Factory::getLog()->log(LogLevel::DEBUG, "-- Creating email message");

		try
		{
			$recipient = [$to];

			$mailer->addRecipient($recipient);
			$mailer->setSubject($subject);
			$mailer->setBody($body);
		}
		catch (Exception $e)
		{
			Factory::getLog()->log(LogLevel::WARNING, "Could not send email to $to - Problem setting up the email. Joomla! reports error: " . $e->getMessage());

			return false;
		}

		try
		{
			if (!empty($attachFile))
			{
				Factory::getLog()->log(LogLevel::INFO, "-- Attaching $attachFile");

				if (!file_exists($attachFile) || !(is_file($attachFile) || is_link($attachFile)))
				{
					Factory::getLog()->log(LogLevel::WARNING, "The file does not exist, or it's not a file; no email sent");

					return false;
				}

				if (!is_readable($attachFile))
				{
					Factory::getLog()->log(LogLevel::WARNING, "The file is not readable; no email sent");

					return false;
				}

				$filesize = @filesize($attachFile);

				if ($filesize)
				{
					// Check that we have AT LEAST 2.5 times free RAM as the filesize (that's how much we'll need)
					if (!function_exists('ini_get'))
					{
						// Assume 8Mb of PHP memory limit (worst case scenario)
						$totalRAM = 8388608;
					}
					else
					{
						$totalRAM = ini_get('memory_limit');
						if (strstr($totalRAM, 'M'))
						{
							$totalRAM = (int) $totalRAM * 1048576;
						}
						elseif (strstr($totalRAM, 'K'))
						{
							$totalRAM = (int) $totalRAM * 1024;
						}
						elseif (strstr($totalRAM, 'G'))
						{
							$totalRAM = (int) $totalRAM * 1073741824;
						}
						else
						{
							$totalRAM = (int) $totalRAM;
						}
						if ($totalRAM <= 0)
						{
							// No memory limit? Cool! Assume 1Gb of available RAM (which is absurdely abundant as of March 2011...)
							$totalRAM = 1086373952;
						}
					}
					if (!function_exists('memory_get_usage'))
					{
						$usedRAM = 8388608;
					}
					else
					{
						$usedRAM = memory_get_usage();
					}

					$availableRAM = $totalRAM - $usedRAM;

					if ($availableRAM < 2.5 * $filesize)
					{
						Factory::getLog()->log(LogLevel::WARNING, "The file is too big to be sent by email. Please use a smaller Part Size for Split Archives setting.");
						Factory::getLog()->log(LogLevel::DEBUG, "Memory limit $totalRAM bytes -- Used memory $usedRAM bytes -- File size $filesize -- Attachment requires approx. " . (2.5 * $filesize) . " bytes");

						return false;
					}
				}
				else
				{
					Factory::getLog()->log(LogLevel::WARNING, "Your server fails to report the file size of $attachFile. If the backup crashes, please use a smaller Part Size for Split Archives setting");
				}

				$mailer->addAttachment($attachFile);
			}
		}
		catch (Exception $e)
		{
			Factory::getLog()->log(LogLevel::WARNING, "Could not send email to $to - Problem attaching file. Joomla! reports error: " . $e->getMessage());

			return false;
		}

		Factory::getLog()->log(LogLevel::DEBUG, "-- Sending message");

		try
		{
			$result = $mailer->Send();
		}
		catch (Exception $e)
		{
			$result = $e;
		}

		if ($result instanceof Exception)
		{
			Factory::getLog()->log(LogLevel::WARNING, "Could not email $to:");
			Factory::getLog()->log(LogLevel::WARNING, $result->getMessage());
			$ret = $result->getMessage();
			unset($result);
			unset($mailer);

			return $ret;
		}

		Factory::getLog()->log(LogLevel::DEBUG, "-- Email sent");

		return true;
	}

	/**
	 * Deletes a file from the local server using direct file access or FTP
	 *
	 * @param   string  $file
	 *
	 * @return bool
	 */
	public function unlink($file)
	{
		if (function_exists('jimport'))
		{
			$result = File::delete($file);

			if (!$result)
			{
				$result = @unlink($file);
			}
		}
		else
		{
			$result = parent::unlink($file);
		}

		return $result;
	}

	/**
	 * Moves a file around within the local server using direct file access or FTP
	 *
	 * @param   string  $from
	 * @param   string  $to
	 *
	 * @return bool
	 */
	public function move($from, $to)
	{
		if (function_exists('jimport'))
		{
			$result = File::move($from, $to);

			// JFile failed. Let's try rename()
			if (!$result)
			{
				$result = @rename($from, $to);
			}
			// Rename failed, too. Let's try copy/delete
			if (!$result)
			{
				// Try copying with JFile. If it fails, use copy().
				$result = File::copy($from, $to);
				if (!$result)
				{
					$result = @copy($from, $to);
				}

				// If the copy succeeded, try deleting the original with JFile. If it fails, use unlink().
				if ($result)
				{
					$result = $this->unlink($from);
				}
			}
		}
		else
		{
			$result = parent::move($from, $to);
		}

		return $result;
	}

	/**
	 * Joomla!-specific function to get an instance of the mailer class
	 *
	 * @return Mail
	 */
	public function &getMailer()
	{
		$mailer = \Joomla\CMS\Factory::getMailer();
		if (!is_object($mailer))
		{
			Factory::getLog()->log(LogLevel::WARNING, "Fetching Joomla!'s mailer was impossible; imminent crash!");
		}
		else
		{
			$emailMethod = $mailer->Mailer;
			Factory::getLog()->log(LogLevel::DEBUG, "-- Joomla!'s mailer is using $emailMethod mail method.");
		}

		return $mailer;
	}

	/**
	 * Stores a flash (temporary) variable in the session.
	 *
	 * @param   string  $name   The name of the variable to store
	 * @param   string  $value  The value of the variable to store
	 *
	 * @return  void
	 */
	public function set_flash_variable($name, $value)
	{
		if ($this->container->platform->isCli())
		{
			$this->flashVariables[$name] = $value;

			return;
		}

		$this->container->platform->setSessionVar($name, $value, 'akeeba');
	}

	/**
	 * Return the value of a flash (temporary) variable from the session and
	 * immediately removes it.
	 *
	 * @param   string  $name     The name of the flash variable
	 * @param   mixed   $default  Default value, if the variable is not defined
	 *
	 * @return  mixed  The value of the variable or $default if it's not set
	 */
	public function get_flash_variable($name, $default = null)
	{
		if ($this->container->platform->isCli())
		{
			$ret = $default;

			if (isset($this->flashVariables[$name]))
			{
				$ret = $this->flashVariables[$name];
				unset($this->flashVariables[$name]);
			}

			return $ret;
		}

		$ret = $this->container->platform->getSessionVar($name, $default, 'akeeba');
		$this->container->platform->setSessionVar($name, null, 'akeeba');

		return $ret;
	}

	/**
	 * Perform an immediate redirection to the defined URL
	 *
	 * @param   string  $url  The URL to redirect to
	 *
	 * @return  void
	 */
	public function redirect($url)
	{
		$this->container->platform->redirect($url);
	}

	public function apply_quirk_definitions()
	{
		Factory::getConfigurationChecks()->addConfigurationCheckDefinition('013', 'critical', 'COM_AKEEBA_CPANEL_WARNING_Q013', [
			Joomla3x::class, 'quirk_013',
		]);
		Factory::getConfigurationChecks()->addConfigurationCheckDefinition('400', 'critical', 'COM_AKEEBA_CPANEL_WARNING_Q400', [
			Joomla3x::class, 'quirk_400',
		]);
	}

	/** @inheritdoc  */
	protected function detectProxySettings()
	{
		try
		{
			$app = \Joomla\CMS\Factory::getApplication();
		}
		catch (Exception $e)
		{
			$this->proxyEnabled                = false;
			$this->hasInitialisedProxySettings = true;
		}

		$enabled = $app->get('proxy_enable', false);
		$host    = $app->get('proxy_host', '');
		$port    = (int) $app->get('proxy_port', 8080);
		$user    = $app->get('proxy_user', '');
		$pass    = $app->get('proxy_pass', '');

		$this->setProxySettings($enabled, $host, $port, $user, $pass);
	}


	/**
	 * Registers Akeeba Engine's core classes with JLoader
	 *
	 * @param   string  $path_prefix  The path prefix to look in
	 */
	protected function register_akeeba_engine_classes($path_prefix)
	{
		global $Akeeba_Class_Map;

		foreach ($Akeeba_Class_Map as $class_prefix => $path_suffix)
		{
			// Bail out if there is such directory, so as not to have Joomla! throw errors
			if (!@is_dir($path_prefix . '/' . $path_suffix))
			{
				continue;
			}

			$file_list = Folder::files($path_prefix . '/' . $path_suffix, '.*\.php');
			if (is_array($file_list) && !empty($file_list))
			{
				foreach ($file_list as $file)
				{
					$class_suffix = ucfirst(basename($file, '.php'));
					JLoader::register($class_prefix . $class_suffix, $path_prefix . '/' . $path_suffix . '/' . $file);
				}
			}
		}
	}

	/**
	 * Get the applicable timezone in the same way Joomla! calculates it: if there is a logged in
	 * user with a specific timezone set, use it. Otherwise use the Server Timezone defined in the
	 * site's Global Configuration. If nothing is set there, use GMT instead.
	 *
	 * @return  string
	 */
	private function getJoomlaTimezone()
	{
		// Out ultimate default is the server timezone set up in the Global Configuration
		$jregistry = $this->container->platform->getConfig();
		$tz        = $jregistry->get('offset', 'GMT');

		// If this is a CLI script, tough luck, we can't use a different TZ
		if ($this->container->platform->isCli())
		{
			return $tz;
		}

		// If it's a guest user they can't have a special TZ set, return.
		$user = $this->container->platform->getUser();

		if ($user->guest)
		{
			return $tz;
		}

		$tz = $user->getParam('timezone', $tz);

		return $tz;
	}
}
components/com_akeeba/BackupPlatform/Joomla3x/Driver/Joomla.php000060400000010513152453623440020576 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Engine\Driver;

// Protection against direct access
defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Platform;
use Exception;
use Joomla\CMS\Factory;

class Joomla
{
	/** @var Base The real database connection object */
	private $dbo;

	/**
	 * Database object constructor
	 *
	 * @param   array  $options  List of options used to configure the connection
	 */
	public function __construct($options = [])
	{
		// Get best matching Akeeba Backup driver instance
		if (class_exists('JFactory'))
		{
			// Get the database driver *AND* make sure it's connected.
			$db = Factory::getDBO();
			$db->connect();

			$options['connection'] = $db->getConnection();

			switch ($db->name)
			{
				case 'mysql':
					// So, Joomla! 4's "mysql" is, actually, "pdomysql".
					$driver = 'mysql';

					if (version_compare(JVERSION, '3.999.999', 'gt'))
					{
						$driver = 'pdomysql';
					}
					break;

				case 'mysqli':
					$driver = 'mysqli';
					break;

				case 'pdomysql':
					$driver = 'pdomysql';
					break;

				default:
					throw new \RuntimeException("Unsupported database driver {$db->name}");

					break;
			}

			$driver = '\\Akeeba\\Engine\\Driver\\' . ucfirst($driver);
		}
		else
		{
			$driver = Platform::getInstance()->get_default_database_driver(false);
		}

		$this->dbo = new $driver($options);
	}

	public function close()
	{
		/**
		 * We should not, in fact, try to close the connection by calling the parent method.
		 *
		 * If you close the connection we ask PHP's mysql / mysqli / pdomysql driver to disconnect the MySQL connection
		 * resource from the database server inside our instance of Akeeba Engine's database driver. However, this
		 * identical resource is also present in Joomla's database driver. Joomla will also try to close the connection
		 * to a now invalid resource, causing a PHP notice to be recorded.
		 *
		 * By setting the connection resource to null in our own driver object we prevent closing the resource,
		 * delegating that responsibility to Joomla. It will gladly do so at the very least automatically, through its
		 * db driver's __destruct.
		 */
		$this->dbo->setConnection(null);
	}

	public function open()
	{
		if (method_exists($this->dbo, 'open'))
		{
			$this->dbo->open();
		}
		elseif (method_exists($this->dbo, 'connect'))
		{
			$this->dbo->connect();
		}
	}

	/**
	 * Magic method to proxy all calls to the loaded database driver object
	 *
	 * @throws  Exception
	 */
	public function __call($name, array $arguments)
	{
		if (is_null($this->dbo))
		{
			throw new Exception('Akeeba Engine database driver is not loaded');
		}

		if (method_exists($this->dbo, $name) || in_array($name, ['q', 'nq', 'qn']))
		{
			// Call_user_func_array is ~3 times slower than direct method calls.
			// (thank you, Nooku Framework, for the tip!)
			switch (count($arguments))
			{
				case 0 :
					$result = $this->dbo->$name();
					break;
				case 1 :
					$result = $this->dbo->$name($arguments[0]);
					break;
				case 2:
					$result = $this->dbo->$name($arguments[0], $arguments[1]);
					break;
				case 3:
					$result = $this->dbo->$name($arguments[0], $arguments[1], $arguments[2]);
					break;
				case 4:
					$result = $this->dbo->$name($arguments[0], $arguments[1], $arguments[2], $arguments[3]);
					break;
				case 5:
					$result = $this->dbo->$name($arguments[0], $arguments[1], $arguments[2], $arguments[3], $arguments[4]);
					break;
				default:
					// Resort to using call_user_func_array for many segments
					$result = call_user_func_array([$this->dbo, $name], $arguments);
			}

			return $result;
		}
		else
		{
			throw new Exception('Method ' . $name . ' not found in Akeeba Platform');
		}
	}

	public function __get($name)
	{
		if (isset($this->dbo->$name) || property_exists($this->dbo, $name))
		{
			return $this->dbo->$name;
		}
		else
		{
			$this->dbo->$name = null;

			user_error('Database driver does not support property ' . $name);
		}

		return null;
	}

	public function __set($name, $value)
	{
		if (isset($this->dbo->name) || property_exists($this->dbo, $name))
		{
			$this->dbo->$name = $value;
		}
		else
		{
			$this->dbo->$name = null;
			user_error('Database driver not support property ' . $name);
		}
	}
}
components/com_akeeba/BackupPlatform/Joomla3x/Config/02.advanced.json000060400000002732152453623440021502 0ustar00{
    "_group": {
        "description": "COM_AKEEBA_CONFIG_ADVANCED"
    },
    "akeeba.advanced.dump_engine": {
        "default": "native",
        "type": "engine",
        "subtype": "dump",
        "title": "COM_AKEEBA_CONFIG_DUMPENGINE_TITLE",
        "description": "COM_AKEEBA_CONFIG_DUMPENGINE_DESCRIPTION",
        "protected": "0"
    },
    "akeeba.advanced.scan_engine": {
        "default": "smart",
        "type": "engine",
        "subtype": "scan",
        "protected": "1",
        "title": "COM_AKEEBA_CONFIG_SCANENGINE_TITLE",
        "description": "COM_AKEEBA_CONFIG_SCANENGINE_DESCRIPTION"
    },
    "akeeba.advanced.archiver_engine": {
        "default": "jpa",
        "type": "engine",
        "subtype": "archiver",
        "title": "COM_AKEEBA_CONFIG_ARCHIVERENGINE_TITLE",
        "description": "COM_AKEEBA_CONFIG_ARCHIVERENGINE_DESCRIPTION"
    },
    "akeeba.advanced.postproc_engine": {
        "default": "none",
        "type": "none",
        "protected": "1"
    },
    "akeeba.advanced.embedded_installer": {
        "default": "angie",
        "type": "installer",
        "title": "COM_AKEEBA_CONFIG_INSTALLER_TITLE",
        "description": "COM_AKEEBA_CONFIG_INSTALLER_DESCRIPTION",
        "protected": "0"
    },
    "engine.installer.angie.key": {
        "default": "",
        "type": "password",
        "title": "COM_AKEEBA_CONFIG_ANGIE_KEY_TITLE",
        "description": "COM_AKEEBA_CONFIG_ANGIE_KEY_DESCRIPTION",
        "protected": "0"
    }
}components/com_akeeba/BackupPlatform/Joomla3x/Filter/Joomlaskipfiles.php000060400000010141152453623440022477 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Engine\Filter;

// Protection against direct access
defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use FOF40\Container\Container;

/**
 * Subdirectories exclusion filter. Excludes temporary, cache and backup output
 * directories' contents from being backed up.
 */
class Joomlaskipfiles extends Base
{
	public function __construct()
	{
		$this->object      = 'dir';
		$this->subtype     = 'content';
		$this->method      = 'direct';
		$this->filter_name = 'Joomlaskipfiles';

		// We take advantage of the filter class magic to inject our custom filters
		$configuration = Factory::getConfiguration();
		$container     = Container::getInstance('com_akeeba');
		$jreg          = $container->platform->getConfig();

		$tmpdir  = $jreg->get('tmp_path');
		$logsdir = $jreg->get('log_path');

		// Get the site's root
		if ($configuration->get('akeeba.platform.override_root', 0))
		{
			$root = $configuration->get('akeeba.platform.newroot', '[SITEROOT]');
		}
		else
		{
			$root = '[SITEROOT]';
		}

		$this->filter_data[$root] = [
			// Output & temp directory of the component
			$this->treatDirectory($configuration->get('akeeba.basic.output_directory')),

			// Joomla! temporary directory
			$this->treatDirectory($tmpdir),

			// Joomla! logs directory
			$this->treatDirectory($logsdir),

			// default temp directory
			$this->treatDirectory(JPATH_SITE . '/tmp'),
			'tmp',
			$this->treatDirectory(Platform::getInstance()->get_site_root() . '/tmp'),

			// Joomla! front- and back-end cache, as reported by Joomla!
			$this->treatDirectory(JPATH_CACHE),
			$this->treatDirectory(JPATH_ADMINISTRATOR . '/cache'),
			$this->treatDirectory(JPATH_ROOT . '/cache'),
			// cache directories fallback
			'cache',
			'administrator/cache',
			// Joomla! front- and back-end cache, as calculated by us (redundancy, for funky server setups)
			$this->treatDirectory(Platform::getInstance()->get_site_root() . '/cache'),
			$this->treatDirectory(Platform::getInstance()->get_site_root() . '/administrator/cache'),

			// This is not needed except on sites running SVN or beta releases
			$this->treatDirectory(JPATH_ROOT . '/installation'),
			// ...and the fallbacks
			'installation',
			$this->treatDirectory(Platform::getInstance()->get_site_root() . '/installation'),

			// Default backup output (many people change it, forget to remove old backup archives and they end up backing up old backups)
			$this->treatDirectory(JPATH_ADMINISTRATOR . '/components/com_akeeba/backup'),
			'administrator/components/com_akeeba/backup',
			$this->treatDirectory(Platform::getInstance()->get_site_root() . '/administrator/components/com_akeeba/backup'),

			// MyBlog's cache
			$this->treatDirectory(JPATH_SITE . '/components/libraries/cmslib/cache'),
			// ...and fallbacks
			'components/libraries/cmslib/cache',
			$this->treatDirectory(Platform::getInstance()->get_site_root() . '/components/libraries/cmslib/cache'),

			// Used by Plesk to store its logs. It's in the public root, owned by root and read-only. Yipee!
			$this->treatDirectory(JPATH_ROOT . '/logs'),
			'logs',
			$this->treatDirectory(Platform::getInstance()->get_site_root() . '/logs'),

			// Some developers hardcode this path for their log files. I guess they never heard of Joomla!'s Global Configuration?
			$this->treatDirectory(JPATH_ROOT . '/log'),
			'log',
			$this->treatDirectory(Platform::getInstance()->get_site_root() . '/log'),

			// Joomla! 3.6 is loads of fun. It changed the logs folder location.
			$this->treatDirectory(JPATH_ADMINISTRATOR . '/logs'),
			'administrator/logs',
			$this->treatDirectory(Platform::getInstance()->get_site_root() . '/administrator/logs'),

			// Also in case a Joomla! 3.6 site admin cocks up, let's try a singular folder name.
			$this->treatDirectory(JPATH_ADMINISTRATOR . '/log'),
			'administrator/log',
			$this->treatDirectory(Platform::getInstance()->get_site_root() . '/administrator/log'),
		];

		parent::__construct();
	}
}
components/com_akeeba/BackupPlatform/Joomla3x/Filter/Excludetabledata.php000060400000001643152453623440022606 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Engine\Filter;

// Protection against direct access
defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;

/**
 * Subdirectories exclusion filter. Excludes temporary, cache and backup output
 * directories' contents from being backed up.
 */
class Excludetabledata extends Base
{
	public function __construct()
	{
		$this->object      = 'dbobject';
		$this->subtype     = 'content';
		$this->method      = 'direct';
		$this->filter_name = 'Excludetabledata';

		// We take advantage of the filter class magic to inject our custom filters
		$this->filter_data['[SITEDB]'] = array(
			'#__session',        // Sessions table
			'#__guardxt_runs'    // Guard XT's run log (bloated to the bone)
		);

		parent::__construct();
	}

}
components/com_akeeba/BackupPlatform/Joomla3x/Filter/Joomlaskipdirs.php000060400000010140152453623440022335 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Engine\Filter;

// Protection against direct access
defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use FOF40\Container\Container;

/**
 * Subdirectories exclusion filter. Excludes temporary, cache and backup output
 * directories' contents from being backed up.
 */
class Joomlaskipdirs extends Base
{
	public function __construct()
	{
		$this->object      = 'dir';
		$this->subtype     = 'children';
		$this->method      = 'direct';
		$this->filter_name = 'Joomlaskipdirs';

		// We take advantage of the filter class magic to inject our custom filters
		$configuration = Factory::getConfiguration();
		$container     = Container::getInstance('com_akeeba');
		$jreg          = $container->platform->getConfig();

		$tmpdir  = $jreg->get('tmp_path');
		$logsdir = $jreg->get('log_path');

		// Get the site's root
		if ($configuration->get('akeeba.platform.override_root', 0))
		{
			$root = $configuration->get('akeeba.platform.newroot', '[SITEROOT]');
		}
		else
		{
			$root = '[SITEROOT]';
		}

		$this->filter_data[$root] = [
			// Output & temp directory of the component
			$this->treatDirectory($configuration->get('akeeba.basic.output_directory')),

			// Joomla! temporary directory
			$this->treatDirectory($tmpdir),

			// Joomla! logs directory
			$this->treatDirectory($logsdir),

			// default temp directory
			$this->treatDirectory(JPATH_SITE . '/tmp'),
			'tmp',
			$this->treatDirectory(Platform::getInstance()->get_site_root() . '/tmp'),

			// Joomla! front- and back-end cache, as reported by Joomla!
			$this->treatDirectory(JPATH_CACHE),
			$this->treatDirectory(JPATH_ADMINISTRATOR . '/cache'),
			$this->treatDirectory(JPATH_ROOT . '/cache'),
			// cache directories fallback
			'cache',
			'administrator/cache',
			// Joomla! front- and back-end cache, as calculated by us (redundancy, for funky server setups)
			$this->treatDirectory(Platform::getInstance()->get_site_root() . '/cache'),
			$this->treatDirectory(Platform::getInstance()->get_site_root() . '/administrator/cache'),

			// This is not needed except on sites running SVN or beta releases
			$this->treatDirectory(JPATH_ROOT . '/installation'),
			// ...and the fallbacks
			'installation',
			$this->treatDirectory(Platform::getInstance()->get_site_root() . '/installation'),

			// Default backup output (many people change it, forget to remove old backup archives and they end up backing up old backups)
			$this->treatDirectory(JPATH_ADMINISTRATOR . '/components/com_akeeba/backup'),
			'administrator/components/com_akeeba/backup',
			$this->treatDirectory(Platform::getInstance()->get_site_root() . '/administrator/components/com_akeeba/backup'),

			// MyBlog's cache
			$this->treatDirectory(JPATH_SITE . '/components/libraries/cmslib/cache'),
			// ...and fallbacks
			'components/libraries/cmslib/cache',
			$this->treatDirectory(Platform::getInstance()->get_site_root() . '/components/libraries/cmslib/cache'),

			// Used by Plesk to store its logs. It's in the public root, owned by root and read-only. Yipee!
			$this->treatDirectory(JPATH_ROOT . '/logs'),
			'logs',
			$this->treatDirectory(Platform::getInstance()->get_site_root() . '/logs'),

			// Some developers hardcode this path for their log files. I guess they never heard of Joomla!'s Global Configuration?
			$this->treatDirectory(JPATH_ROOT . '/log'),
			'log',
			$this->treatDirectory(Platform::getInstance()->get_site_root() . '/log'),

			// Joomla! 3.6 is loads of fun. It changed the logs folder location.
			$this->treatDirectory(JPATH_ADMINISTRATOR . '/logs'),
			'administrator/logs',
			$this->treatDirectory(Platform::getInstance()->get_site_root() . '/administrator/logs'),

			// Also in case a Joomla! 3.6 site admin cocks up, let's try a singular folder name.
			$this->treatDirectory(JPATH_ADMINISTRATOR . '/log'),
			'administrator/log',
			$this->treatDirectory(Platform::getInstance()->get_site_root() . '/administrator/log'),
		];

		parent::__construct();
	}
}
components/com_akeeba/BackupPlatform/Joomla3x/Filter/Cvsfolders.php000060400000002051152453623440021457 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Engine\Filter;

// Protection against direct access
defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;

/**
 * Folder exclusion filter based on regular expressions
 */
class Cvsfolders extends Base
{
	function __construct()
	{
		$this->object      = 'dir';
		$this->subtype     = 'all';
		$this->method      = 'regex';
		$this->filter_name = 'Cvsfolders';

		if (empty($this->filter_name))
		{
			$this->filter_name = strtolower(basename(__FILE__, '.php'));
		}

		parent::__construct();

		// Get the site's root
		$configuration = Factory::getConfiguration();

		if ($configuration->get('akeeba.platform.override_root', 0))
		{
			$root = $configuration->get('akeeba.platform.newroot', '[SITEROOT]');
		}
		else
		{
			$root = '[SITEROOT]';
		}

		$this->filter_data[$root] = array(
			'#/\.git$#',
			'#^\.git$#',
			'#/\.svn$#',
			'#^\.svn$#'
		);
	}
}
components/com_akeeba/BackupPlatform/Joomla3x/Filter/Siteroot.php000060400000002225152453623440021160 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Engine\Filter;

// Protection against direct access
defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;

/**
 * Add site's root to the backup set.
 */
class Siteroot extends Base
{
	public function __construct()
	{
		// This is a directory inclusion filter.
		$this->object      = 'dir';
		$this->subtype     = 'inclusion';
		$this->method      = 'direct';
		$this->filter_name = 'Siteroot';

		// Directory inclusion format:
		// array(real_directory, add_path)
		$add_path = null; // A null add_path means that we dump this dir's contents in the archive's root

		// We take advantage of the filter class magic to inject our custom filters
		$configuration = Factory::getConfiguration();

		if ($configuration->get('akeeba.platform.override_root', 0))
		{
			$root = $configuration->get('akeeba.platform.newroot', '[SITEROOT]');
		}
		else
		{
			$root = '[SITEROOT]';
		}

		$this->filter_data[] = array(
			$root,
			$add_path
		);

		parent::__construct();
	}
}
components/com_akeeba/BackupPlatform/Joomla3x/Filter/Systemcachefiles.php000060400000002150152453623440022640 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Engine\Filter;

// Protection against direct access
defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;

/**
 * Files exclusion filter based on regular expressions
 */
class Systemcachefiles extends Base
{
	function __construct()
	{
		$this->object      = 'file';
		$this->subtype     = 'all';
		$this->method      = 'regex';
		$this->filter_name = 'Systemcachefiles';

		if (empty($this->filter_name))
		{
			$this->filter_name = strtolower(basename(__FILE__, '.php'));
		}

		parent::__construct();

		// Get the site's root
		$configuration = Factory::getConfiguration();

		if ($configuration->get('akeeba.platform.override_root', 0))
		{
			$root = $configuration->get('akeeba.platform.newroot', '[SITEROOT]');
		}
		else
		{
			$root = '[SITEROOT]';
		}

		$this->filter_data[$root] = array(
			'#/Thumbs\.db$#',
			'#^Thumbs\.db$#',
			'#/\.DS_Store$#i',
			'#^\.DS_Store$#i',
			'#^core\.[\d]{1,10}$#i',
		);
	}
}
components/com_akeeba/BackupPlatform/Joomla3x/Filter/Libraries.php000060400000003750152453623440021270 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Engine\Filter;

// Protection against direct access
defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;

/**
 * Joomla! 1.6 libraries off-site relocation workaround
 *
 * After the application of patch 23377
 * (http://joomlacode.org/gf/project/joomla/tracker/?action=TrackerItemEdit&tracker_item_id=23377)
 * it is possible for the webmaster to move the libraries directory of his Joomla!
 * site to an arbitrary location in the folder tree. This filter works around this
 * new feature by creating a new extra directory inclusion filter.
 */
class Libraries extends Base
{
	public function __construct()
	{
		$this->object      = 'dir';
		$this->subtype     = 'inclusion';
		$this->method      = 'direct';
		$this->filter_name = 'Libraries';

		// FIXME This filter doesn't work very well on many live hosts. Disabled for now.
		parent::__construct();

		return;


		if (empty($this->filter_name))
		{
			$this->filter_name = strtolower(basename(__FILE__, '.php'));
		}

		// Get the saved library path and compare it to the default
		$jlibdir = Platform::getInstance()->get_platform_configuration_option('jlibrariesdir', '');
		if (empty($jlibdir))
		{
			if (defined('JPATH_LIBRARIES'))
			{
				$jlibdir = JPATH_LIBRARIES;
			}
			elseif (defined('JPATH_PLATFORM'))
			{
				$jlibdir = JPATH_PLATFORM;
			}
			else
			{
				$jlibdir = false;
			}
		}

		if ($jlibdir !== false)
		{
			$jlibdir          = Factory::getFilesystemTools()->TranslateWinPath($jlibdir);
			$defaultLibraries = Factory::getFilesystemTools()->TranslateWinPath(JPATH_SITE . '/libraries');

			if ($defaultLibraries != $jlibdir)
			{
				// The path differs, add it here
				$this->filter_data['JPATH_LIBRARIES'] = $jlibdir;
			}
		}
		else
		{
			$this->filter_data = array();
		}
		parent::__construct();
	}
}
components/com_akeeba/BackupPlatform/Joomla3x/Filter/Stack/finder.json000060400000000424152453623440022045 0ustar00{
    "core.filters.finder.enabled": {
        "default": "1",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_OPTIONALFILTERS_FINDER_ENABLED_TITLE",
        "description": "COM_AKEEBA_CONFIG_OPTIONALFILTERS_FINDER_ENABLED_DESCRIPTION",
        "bold": "1"
    }
}components/com_akeeba/BackupPlatform/Joomla3x/Filter/Stack/actionlogs.json000060400000000440152453623440022736 0ustar00{
    "core.filters.actionlogs.enabled": {
        "default": "1",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_OPTIONALFILTERS_ACTIONLOGS_ENABLED_TITLE",
        "description": "COM_AKEEBA_CONFIG_OPTIONALFILTERS_ACTIONLOGS_ENABLED_DESCRIPTION",
        "bold": "1"
    }
}components/com_akeeba/BackupPlatform/Joomla3x/Filter/Stack/StackFinder.php000060400000006407152453623440022620 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Engine\Filter\Stack;

// Protection against direct access
defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;
use Akeeba\Engine\Filter\Base as FilterBase;

/**
 * Date conditional filter
 *
 * It will only backup files modified after a specific date and time
 *
 * @since  3.4.0
 */
class StackFinder extends FilterBase
{
	/** @inheritDoc */
	public function __construct()
	{
		parent::__construct();

		$this->object  = 'dbobject';
		$this->subtype = 'content';
		$this->method  = 'api';
	}

	/**
	 * Extra SQL statements to append to the SQL dump file.
	 *
	 * Joomla 4's #__finder_taxonomy table is a tree. We always need a root node. This adds the root node back to the
	 * tree even though we just excluded it.
	 *
	 * @param   string  $root  The database for which to get the extra SQL statements
	 *
	 * @return  string  Extra SQL statements
	 *
	 * @since   7.2.0
	 */
	public function getExtraSQL(string $root): array
	{
		// Only run on Joomla! 4 and for the main site database
		if (($root != '[SITEDB]') || !version_compare(JVERSION, '3.999.999', 'gt'))
		{
			return [];
		}

		// Get the SQL query, constructed correctly for the DB technology in use.
		$db  = Factory::getDatabase();
		$sql = (string) $db->getQuery(true)
			->insert($db->quoteName('#__finder_taxonomy'))
			->columns(array_map([$db, 'quoteName'], [
				'id', 'parent_id', 'lft', 'rgt', 'level', 'path', 'title', 'alias', 'state', 'access', 'language',
			]))
			->values(implode(", ", array_map([$db, 'quote'], [
				1, 0, 0, 1, 0, '', 'ROOT', 'root', 1, 1, '*',
			])));

		// Make sure there's a trailing semicolon before returning the SQL query.
		$sql = rtrim(trim($sql), ';') . ';';

		return [$sql];
	}

	/**
	 * This method must be overriden by API-type exclusion filters.
	 *
	 * @param   string  $test  The object to test for exclusion
	 * @param   string  $root  The object's root
	 *
	 * @return  bool    Return true if it matches your filters
	 *
	 * @since   3.4.0
	 */
	protected function is_excluded_by_api($test, $root)
	{
		static $finderTables = [
			/**
			 * Common tables, J3 and J4.
			 *
			 * Note that the taxonomy table contents are removed BUT the root node for Joomla 4 is added back with the
			 * getExtraSQL() method trick.
			 */
			'#__finder_links', '#__finder_taxonomy', '#__finder_taxonomy_map', '#__finder_terms',
			// Joomla 3 only
			'#__finder_links_terms0', '#__finder_links_terms1',
			'#__finder_links_terms2', '#__finder_links_terms3', '#__finder_links_terms4',
			'#__finder_links_terms5', '#__finder_links_terms6', '#__finder_links_terms7',
			'#__finder_links_terms8', '#__finder_links_terms9', '#__finder_links_termsa',
			'#__finder_links_termsb', '#__finder_links_termsc', '#__finder_links_termsd',
			'#__finder_links_termse', '#__finder_links_termsf',
			// Joomla 4 only
			'#__finder_links_terms', '#__finder_logging',
		];

		// Not the site's database? Include the tables
		if ($root != '[SITEDB]')
		{
			return false;
		}

		// Is it one of the blacklisted tables?
		if (in_array($test, $finderTables))
		{
			return true;
		}

		// No match? Just include the file!
		return false;
	}

}
components/com_akeeba/BackupPlatform/Joomla3x/Filter/Stack/StackActionlogs.php000060400000001471152453623440023507 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Engine\Filter\Stack;

use Akeeba\Engine\Filter\Base;

// Protection against direct access
defined('AKEEBAENGINE') || die();

/**
 * Exclude Joomla 3.9+ actions log table
 */
class StackActionlogs extends Base
{
	public function __construct()
	{
		$this->object  = 'dbobject';
		$this->subtype = 'content';
		$this->method  = 'api';

		parent::__construct();
	}

	protected function is_excluded_by_api($test, $root)
	{
		static $excluded = [
			'#__action_logs',
		];

		// Is it one of the blacklisted tables?
		if (in_array($test, $excluded))
		{
			return true;
		}

		// No match? Just include the file!
		return false;
	}

}
components/com_akeeba/BackupPlatform/Joomla3x/Filter/Sitedb.php000060400000005352152453623440020566 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Engine\Filter;

// Protection against direct access
defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;

/**
 * Add site's main database to the backup set.
 */
class Sitedb extends Base
{
	public function __construct()
	{
		// This is a directory inclusion filter.
		$this->object      = 'db';
		$this->subtype     = 'inclusion';
		$this->method      = 'direct';
		$this->filter_name = 'Sitedb';

		// Add a new record for the core Joomla! database
		// Get core database options
		$configuration = Factory::getConfiguration();

		if ($configuration->get('akeeba.platform.override_db', 0))
		{
			$options = array(
				'port'     => $configuration->get('akeeba.platform.dbport', ''),
				'host'     => $configuration->get('akeeba.platform.dbhost', ''),
				'user'     => $configuration->get('akeeba.platform.dbusername', ''),
				'password' => $configuration->get('akeeba.platform.dbpassword', ''),
				'database' => $configuration->get('akeeba.platform.dbname', ''),
				'prefix'   => $configuration->get('akeeba.platform.dbprefix', ''),
			);
			$driver  = '\\Akeeba\\Engine\\Driver\\' . ucfirst($configuration->get('akeeba.platform.dbdriver', 'mysqli'));
		}
		else
		{
			$options = Platform::getInstance()->get_platform_database_options();
			$driver  = Platform::getInstance()->get_default_database_driver(true);
		}


		$host = $options['host'];
		$port = array_key_exists('port', $options) ? $options['port'] : null;

		if (empty($port))
		{
			$port = null;
		}

		$socket     = null;
		$targetSlot = substr(strstr($host, ":"), 1);

		if ( !empty($targetSlot))
		{
			// Get the port number or socket name
			if (is_numeric($targetSlot) && is_null($port))
			{
				$port = $targetSlot;
			}
			else
			{
				$socket = $targetSlot;
			}

			// Extract the host name only
			$host = substr($host, 0, strlen($host) - (strlen($targetSlot) + 1));
			// This will take care of the following notation: ":3306"
			if ($host == '')
			{
				$host = 'localhost';
			}
		}

		// This is the format of the database inclusion filters
		$entry = array(
			'host'     => $host,
			'port'     => is_null($socket) ? (is_null($port) ? '' : $port) : $socket,
			'username' => $options['user'],
			'password' => $options['password'],
			'database' => $options['database'],
			'prefix'   => $options['prefix'],
			'dumpFile' => 'site.sql',
			'driver'   => $driver
		);

		// We take advantage of the filter class magic to inject our custom filters
		$configuration = Factory::getConfiguration();

		$this->filter_data['[SITEDB]'] = $entry;

		parent::__construct();
	}
}
components/com_akeeba/BackupPlatform/Joomla3x/Filter/Excludefiles.php000060400000002144152453623440021764 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Engine\Filter;

// Protection against direct access
defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;

/**
 * Subdirectories exclusion filter. Excludes temporary, cache and backup output
 * directories' contents from being backed up.
 */
class Excludefiles extends Base
{
	public function __construct()
	{
		$this->object      = 'file';
		$this->subtype     = 'all';
		$this->method      = 'direct';
		$this->filter_name = 'Excludefiles';

		// Get the site's root
		$configuration = Factory::getConfiguration();

		if ($configuration->get('akeeba.platform.override_root', 0))
		{
			$root = $configuration->get('akeeba.platform.newroot', '[SITEROOT]');
		}
		else
		{
			$root = '[SITEROOT]';
		}

		// We take advantage of the filter class magic to inject our custom filters
		$this->filter_data[$root] = array(
			'kickstart.php',
			'error_log',
			'administrator/error_log'
		);

		parent::__construct();
	}

}
components/com_akeeba/BackupPlatform/Joomla3x/Filter/Excludefolders.php000060400000002016152453623440022316 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Engine\Filter;

// Protection against direct access
defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;

/**
 * Folder exclusion filter. Excludes certain hosting directories.
 */
class Excludefolders extends Base
{
	public function __construct()
	{
		$this->object      = 'dir';
		$this->subtype     = 'all';
		$this->method      = 'direct';
		$this->filter_name = 'Excludefolders';

		// Get the site's root
		$configuration = Factory::getConfiguration();

		if ($configuration->get('akeeba.platform.override_root', 0))
		{
			$root = $configuration->get('akeeba.platform.newroot', '[SITEROOT]');
		}
		else
		{
			$root = '[SITEROOT]';
		}

		// We take advantage of the filter class magic to inject our custom filters
		$this->filter_data[$root] = [
			'.cagefs',
			'awstats',
			'cgi-bin',
		];

		parent::__construct();
	}

}
components/com_akeeba/BackupPlatform/web.config000060400000001025152453623440015657 0ustar00<?xml version="1.0"?>
<!--
    This only works on IIS 7 or later. See https://www.iis.net/configreference/system.webserver/security/requestfiltering/fileextensions
-->
<configuration>
    <system.webServer>
        <security>
            <requestFiltering>
                <fileExtensions allowUnlisted="false" >
                    <clear />
                    <add fileExtension=".html" allowed="true"/>
                </fileExtensions>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>components/com_akeeba/fof.xml000060400000001472152453623440012303 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->
<fof>
    <common>
        <container>
            <option name="componentNamespace">Akeeba\Backup</option>
            <option name="factoryClass">FOF40\Factory\BasicFactory</option>
            <option name="scaffolding">0</option>
            <option name="saveScaffolding">0</option>
            <option name="rendererClass">FOF40\Render\FEF</option>
        </container>
    </common>

    <backend>
        <model name="Profiles">
            <behaviors>Filters</behaviors>
        </model>
        <model name="Stats">
            <behaviors>Filters</behaviors>
        </model>
    </backend>
</fof>
components/com_akeeba/CHANGELOG.php000060400000104136152453623440013010 0ustar00<?php die();?>
Akeeba Backup 8.4.1
================================================================================
~ Automatically exclude the .cagefs directory present in some cPanel installations
# [HIGH] Some OneDrive multipart uploads fail
# [LOW] WebDAV: deleting backups may file on some servers
# [HIGH] Box: cannot refresh the authentication token

Akeeba Backup 8.4.0
================================================================================
- Remove the Joomla! version reminder
- Remove CURLOPT_BINARYTRANSFER
+ Separate remote and local quota settings
+ Upload to OneDrive (app-specific folder)
+ Support for uploading to Shared With Me folders in Google Drive
+ Expert options for the Upload to Amazon S3 configuration
+ Self-hosted OAuth2 helpers
+ Alternate Configuration page saving method which doesn't hit maximum POST parameter count limits
+ Option to avoid using `flush()` on broken servers
+ Remove MariaDB MyISAM option PAGE_CHECKSUM from the database dump
+ Restoration: Use transactions to speed up large table restoration
+ Restoration: Automatically downgrade utf8mb4_900_* collations to utf8mb4_unicode_520_ci on MariaDB
+ Restoration: allows you to change the robots (search engine) option
~ Improved mixed– and upper–case database prefix support at backup time
~ Prevent backup failure on push notification error
~ Change the wording of the message when navigating to an off-site directory in the directory browser
~ Improve database dump with table names similar to default values
~ PHP 8.4 compatibility changes
# [MEDIUM] Tables or databases named `0` can cause the database dump to stop prematurely, or not execute at all
# [LOW] Deprecation notice in Configuration Wizard
# [LOW] Restoration error when you have a newer Admin Tools version installed
# [LOW] Cannot transfer files to DreamObjects and Google Storage using the S3 API

Akeeba Backup 8.3.4
================================================================================
+ Workaround for Wasabi S3v4 signatures
# [MEDIUM] Upload to S3 would always use v2 signatures with a custom endpoint.
# [MEDIUM] PHP 8.2 compatibility in Site Transfer Wizard

Akeeba Backup 8.3.3
================================================================================
# [MEDIUM] Resetting corrupt backups can cause a crash
# [LOW] Wrong mixed case detection

Akeeba Backup 8.3.2
================================================================================
! FINAL VERSION FOR JOOMLA! 3
# [LOW] Test FTP Connection does not work in the Configuration page

Akeeba Backup 8.3.1
================================================================================
# [MEDIUM] HTTP PUT might fail on some servers
# [LOW] opcache_invalidate may not invalidate a file
# [LOW] Would not work on 32-bit versions of PHP

Akeeba Backup 8.3.0
================================================================================
+ Support for files and archives over 2GiB (JPA file format 1.3)
~ Stops Joomla from lying about whether our software supports Joomla 4

Akeeba Backup 8.2.8
================================================================================
~ Disabled deprecated API methods
~ Improve the Schedule Automatic Backups page
# [LOW] Joomla ShowOn is not available on ancient Joomla 3.9 builds (e.g. 3.9.0)

Akeeba Backup 8.2.7
================================================================================
# [HIGH] Cannot select extra options for OAuth2-based post-processing engines

Akeeba Backup 8.2.7
================================================================================
+ Option to treat failed uploads as a backup error

Akeeba Backup 8.2.6
================================================================================
! A packaging issue broke the restoration script in backup archives

Akeeba Backup 8.2.5
================================================================================
# [HIGH] Cannot open the Step 1 - Authentication page for OAuth2-based post-processing engines

Akeeba Backup 8.2.4
================================================================================
# [HIGH] Some password managers prevent successful submission of the Site Setup page (you get an error about a missing email address)
# [LOW] Push messages may be untranslated strings when a backup is taken over the API or the frontend backup URL

Akeeba Backup 8.2.3
================================================================================
# [HIGH] BackBlaze B2 single file uploads were broken
# [MEDIUM] Restoration. Administrator email appears as "undefined" in the Site Setup page
# [LOW] Restoration: Wrong message about the email address when the administrator passwords don't match

Akeeba Backup 8.2.2
================================================================================
~ Changed all warnings to much more compact DETAILS elements
~ Much simpler message if you try to run Akeeba Backup on an unsupported (too low) version of PHP.
+ Allow installation on all Joomla 4 versions so you can uninstall the package in some uncommon cases
+ Option about including the latest backup in remote quotas
- Removed the PHP version warning. Joomla already warns you about EOL versions of PHP.
# [LOW] ZIP Archiver, invalid CRC32 calculated for some small files in the installation folder

Akeeba Backup 8.2.1
================================================================================
~ Better warnings about CRC32 for ZIP files on 32-bit versions of PHP
# [HIGH] Quota settings and emails are not processed at the end of the backup process

Akeeba Backup 8.2.0
================================================================================
+ ANGIE for Joomla: reset session and cache options in Site Setup
+ Support for ShowOn to conditionally show options in the Configuration page
# [HIGH] Single part uploads to Azure stopped working

Akeeba Backup 8.1.10
================================================================================
+ Upload to Swift: Support for Keystone v3
# [LOW] "Test FTP connection" button was not correctly applying the passive mode

Akeeba Backup 8.1.9
================================================================================
+ More informative error messages for database connection issues during restoration
~ Workaround for utf8_encode and _decode being deprecated in PHP 8.2
# [LOW] Restoration: You were shown separate port and socket options which were not taken into account
# [MEDIUM] Restoration: Using a custom port or socket might result in the wrong hostname being written in the restored site's configuration file
# [MEDIUM] Possible infinite loop on PHP 8 during DB restoration if a SQL file is missing
# [LOW] Invalid SQL dump if we cannot get the create commands for a function, procedure or trigger

Akeeba Backup 8.1.8
================================================================================
+ Restoration: Warn about missing mysqli / PDO MySQL and REFUSE to proceed
# [HIGH] Cannot download file from Amazon S3
# [LOW] PHP Warning when backing up a database (purely cosmetic issue)

Akeeba Backup 8.1.7
================================================================================
+ Restoration: Warn about missing mysqli / PDO MySQL and REFUSE to proceed
# [HIGH] Cannot download file from Amazon S3
# [LOW] PHP Warning when backing up a database (purely cosmetic issue)

Akeeba Backup 8.1.6
================================================================================
# [HIGH] Cannot connect to databases on localhost using the default named pipe
# [MEDIUM] Custom Amazon S3 regions would not work with custom endpoints

Akeeba Backup 8.1.5
================================================================================
+ Support for custom Amazon S3 regions
# [HIGH] Pagination in the Manage Backups page was broken

Akeeba Backup 8.1.4
================================================================================
+ Much improved FTP functions for uploading backup archives and transferring sites
+ Upload to Azure BLOB Storage now supports chunked uploads, files up to 190.7TB (up from 64Mb)
+ OneDrive for Business: you can now use Drives other than your personal
~ Stricter conditions for determining when to show the “Manage remotely stored files” button in Manage Backups
# [MEDIUM] OneDrive: Uploads may fail if they are between 4Mb and 100Mb

Akeeba Backup 8.1.3
================================================================================
+ Restoration: ANGIE now applies very high memory and execution time limits to prevent some timeout / memory outage issues on most hosts.
+ Restoration: ANGIE now warns you if you leave the database connection information empty
+ Option to set a really large PHP memory limit during backup
~ More helpful and forceful installation abortion message when you try to install this package on Joomla 4.1 or later.
# [LOW] The JPS archiver would show warnings about unreadable files when archiving directories without any files in them.

Akeeba Backup 8.1.2
================================================================================
~ Make it clearer that you need Akeeba Backup 9 on Joomla 4.
# [HIGH] Uploading to OVH is broken on many servers not using a proxy
# [HIGH] Wrong RewriteBase set up in the .htaccess Maker when restoring a Joomla site with Admin Tools Professional installed

Akeeba Backup 8.1.1
================================================================================
~ PHP 8.1 compatibility changes

Akeeba Backup 8.1.0
================================================================================
+ Allow using [REMOTESTATUS] in the email subject, not just the body
+ Joomla restoration: modify domains in the Admin Tools' Allowed Domains and server config maker features if necessary
# [HIGH] Problems restoring if a table name ends in 0 when another table with an identical name EXCEPT the trailing zero is also being backed up
# [HIGH] Backing up to SQL: indices would not have the correct table name prefix
# [HIGH] Backing up as SQL: the query for finder_taxonomy does not use the correct prefix
# [MEDIUM] Log Priorities global configuration option got mangled restoring a Joomla 4 site
# [HIGH] PHP fatal error on PHP 8 if the output directory does not exist
# [LOW] Occasional display issue on Chromium browsers with the database and file / folder filter pages.
# [LOW] RackSpace CloudFiles: some hosts change the case of HTTP headers

Akeeba Backup 8.0.15
================================================================================
+ Support for MySQL 8 invisible columns
# [LOW] Rare type error under PHP 8 during restoration
# [LOW] Backend still tries to load PieCon, causing an error to be logged

Akeeba Backup 8.0.14
================================================================================
- Remove piecon (pie graph favicon showing the backup progress)
~ JSON API: Forcibly use the ‘json’ origin everywhere
~ JSON API: Throw an error if the backup ID sent to stepBackup does not exist
~ JSON API: Improved backup IDs prevent a number of JSON API issues

Akeeba Backup 8.0.13
================================================================================
- Removed iDriveSync; the service has been discontinued by the provider.
- Removed the “Archive integrity check” feature.
~ Dropbox connector updated to require TLS v1.2
~ Improved the display of the files and folders filters page
# [LOW] Check failed backups: All Super Users were notified even when an email was supplied

Akeeba Backup 8.0.12
================================================================================
# [LOW] PHP 8 error if the output directory is empty

Akeeba Backup 8.0.11
================================================================================
~ Remove dash from automatically generated random values for archive naming
+ Increase the maximum Size Quota limit to 1Pb
+ Support for Joomla proxy configuration
# [MEDIUM] Cannot restore on PHP 8 if Two Factor Authentication is enabled in any user account
# [HIGH] Backing up to Box, Dropbox, Google Drive or OneDrive may not be possible if you are using an add-on Download ID

Akeeba Backup 8.0.10
================================================================================
# [HIGH] Uninstallation broken on Joomla 4 due to different installation script event handling (wow, they even broke components' uninstallation, not just the packages!).
# [LOW] Warning in Manage Backups page if you have deleted the backup profile used to take a backup listed there

Akeeba Backup 8.0.9
================================================================================
~ Changes in Joomla 4.0.0-RC5 broke the date and time input fields. Now using native HTML 5 controls.
# [HIGH] Uninstallation broken on Joomla 4 due to different installation script event handling.

Akeeba Backup 8.0.8
================================================================================
! Exception when you do not have the package extension installed on your site. Shouldn't happen unless you've messed with your database.

Akeeba Backup 8.0.7
================================================================================
+ Restoration: information about disabling the password protection.
~ Remove ROW_FORMAT during backup and restoration, makes it easier restoring sites using InnoDB across different MySQL server versions
~ Joomla changed the location of cacert.pem, breaking backup upload to remote storage on some servers
# [HIGH] Remote JSON API v2 fails on PHP 8
# [MEDIUM] Tables with only numbers in their names cause the backup to fail

Akeeba Backup 8.0.6
================================================================================
! Encrypted settings could not be read

Akeeba Backup 8.0.5
================================================================================
- Removed Upload to pCloud
+ Only show failed backups' log files in ALICE
+ Stealth Mode support in integrated restoration
# [MEDIUM] Backend backup may fail when using multiple profiles with different output directories.
# [LOW] MySQL spatial data might be impossible to restore if there is a collation mismatch between the origin and target server.
# [LOW] PHP 8 could still throw an error while backing up under some rare circumstances
# [LOW] Fixed fatal error while sending backup email notification under certain server configuration
# [LOW] PHP warning when the site's root is in an absolute root subdirectory (e.g. /site instead)

Akeeba Backup 8.0.4
================================================================================
# [MEDIUM] Failed backups check would show old failed backups again after visiting Akeeba Backup's Control Panel page
# [MEDIUM] Backup on Update message was never shown
# [LOW] JSON API could return additional information around the JSON content when XDebug is enabled
# [LOW] Backup on Update boolean controls appear inverted (Yes is No and vice-versa)

Akeeba Backup 8.0.3
================================================================================
~ Rewritten installer plugin
~ Converted all tables to InnoDB for better performance
# [HIGH] Cannot take split archive backups under PHP 8
# [HIGH] Backup on Update message shown to non-Super Users
# [HIGH] Latest backup restoration backend menu item didn't work
# [LOW] Annoying error message, without any real consequence, shown when clicking any feature button before checking the output folder security has completed in the background

Akeeba Backup 8.0.2
================================================================================
! Update fails on some hosts which use opcache if the any of our software's installer plugin is enabled, you have gone through the Joomla Control Panel (with the extension updates quickicon plugin enabled) or the Extensions Update page before installing the new version, either as an automatic update or by manual installation (upload & install or install from URL).
~ Will no longer uninstall FOF 3 even if it's no longer needed due to broken THIRD PARTY extensions using it.
~ Workaround for Joomla bug which may not install the included FEF version 2 framework completely, leading to the component being broken after the update.
~ Servers with opcache may report that FOF 4 classes are missing even though they are actually there.

Akeeba Backup 8.0.1
================================================================================
! Update could fail on sites with old plugins we have removed years ago still installed

Akeeba Backup 8.0.0
================================================================================
+ Rewritten with FOF 4
+ Now using FEF 2 with a common JavaScript library across all Akeeba extensions
+ Renamed ViewTemplates to tmpl (Joomla 4 convention, with fallback code for Joomla 3)
+ Yes/No options in the component and plugin options now work correctly under Joomla 4.0 beta 7 and later
# [HIGH] Dropbox for Business wouldn't work with the new scoped access tokens
# [HIGH] Dropbox refresh token would disappear after the first refresh, making it impossible to use Dropbox reliably

Akeeba Backup 7.5.2
================================================================================
+ Rewritten Backup on Update plugin for improved UX (gh-685)
+ Joomla 4: backup profile selection uses Choices.js for easier navigation among many backup profiles
~ Internals: normalised use JVERSION conditionals
~ Document Microsoft Edge “sleeping tabs” and workarounds for long-running backups in background browser tabs
~ Improved CHANGELOG layout in the Control Panel page
~ Code modernisation: using built-in random_bytes() instead of OpenSSL or mcrypt for random number generation
# [HIGH] Import from S3: you cannot select .jps files
# [MEDIUM] Frozen backups toggle wouldn't work on Joomla 4
# [LOW] Import from S3: invisible breadcrumbs in Dark Mode
# [LOW] Recommended PHP version was shown as 7.3 instead of 7.4
# [LOW] Unable to access the component on Joomla 4 when using the PDOMySQL database driver with Site Debug enabled, see https://github.com/joomla/joomla-cms/issues/32019

Akeeba Backup 7.5.1
================================================================================
+ Post-backup emails can now display the total backup size and the approximate size of each part file
# [HIGH] The Joomla 4 console plugin could not install due to a bug in Joomla 4's plugins installer code
# [HIGH] Backup failure to S3 with a PHP Type Error when the Dual Stack option has no value
# [HIGH] Uploading to Dropbox would fail if you linked your Dropbox account after December 2020
# [LOW] No list of backup files in the post-backup email when using a post-processing engine
# [LOW] Manage Remotely Stored Files actions could fail on Box, Dropbox, OneDrive and Google Drive if the access token had expired in the meantime.

Akeeba Backup 7.5.0.1
================================================================================
! [HIGH] The Backup on Update plugin can cause the site to fail to load

Akeeba Backup 7.5.0
================================================================================
- Dropped support for PHP 7.1.0
+ Dropbox is now using the scoped API access.
+ Amazon S3: Added support for Dual Stack option (use of IPv6 when available)
+ Joomla 4 CLI (joomla.php) support – full CLI client to Akeeba Backup
~ Add PHP 8.0 in the list of known PHP versions, recommend PHP 7.4 or later
~ Remove the JPS and ANGIE password fields from the Backup Now page. You can still configure these features in the backup profile's Configuration page.
# [MEDIUM] PHP 8: fatal error uploading to Amazon S3, CloudFiles
# [LOW] Using [SITENAME] in a backup archive name resulted in a single dash being output.
# [LOW] UI elements in the the Files and Folders Exclusion pages would still show native tooltips with HTML tags in them.
# [HIGH] Joomla 4 beta 6 changes how the session works, breaking everything.

Akeeba Backup 7.4.0.1
================================================================================
! Akeeba Backup Core: cannot access the plugin or take a backup because of a PHP error due to an incorrect reference to a Pro-only class.
# [LOW] Backup failure with an error if you import a profile that uses a post-processing engine created with the Pro version into the Core version which does not have this post-processing engine.

Akeeba Backup 7.4.0
================================================================================
+ Files and Directories Exclusion: mark folder and file symlinks as such [gh-676]
+ Automatically rewrite the Output Directory using site path variables such as [SITEROOT] for portability [gh-678]
+ Automatically rewrite the Off-site Folders Inclusion using site path variables for portability
+ Remote backup JSON API version 2
+ ANGIE: Added feature to resume restoring the database if an error occurs
~ Deprecated Upload to pCloud
~ Removed tooltips from Database Tables Exclusion and Files and Folders Exclusion pages to clean up the UI
~ Using nullable TIMESTAMP fields instead of zero dates
# [MEDIUM] Recent Chrome and Chromium-based browsers open OAuth2 windows without opener information, making linking to Google Drive, Dropbox etc impossible without manually copying the tokens (the button causes you to log out of the site)
# [LOW] Files and Directories Exclusion: the folder up is not clickable / doesn't do anything [gh-675]
# [LOW] Scheduling information button appears in the Configuration Wizard's finale page in the Core version

Akeeba Backup 7.3.2.1
================================================================================
! CLI backups broken in version 7.3.2
# [LOW] PHP notices from Joomla core code when running akeeba-check-failed.php in CLI

Akeeba Backup 7.3.2
================================================================================
- Removed update notifications inside the component
~ Normalized the default backup description under all backup methods (backend, frontend, CLI, JSON API)
# [HIGH] WebDAV fails to upload because of the wrong absolute URL being calculated
# [MEDIUM] The Resume and Cancel buttons in the backend backup didn't work due to a typo in the JavaScript
# [MEDIUM] Restoring a JPS backup archive through the integrated restoration was broken if it contained charactes other than a-z, A-Z, 0-9, dash, dot or underscore.
# [LOW] pCloud was erroneously listed in the free of charge Core version (it requires a paid subscription and was thus unusable)

Akeeba Backup 7.3.1
================================================================================
- Removed the System - Akeeba Backup Update Check plugin
~ Improved unhandled PHP exception error page
# [HIGH] Media query strings missing from JavaScript, causing issues to people upgrading from 7.2.2 or earlier.
# [LOW] Frontend backup URL does not work if the secret key contains the plus sign (+) character due to a PHP bug.

Akeeba Backup 7.3.0
================================================================================
+ S3: Add support for Cape Town and Milan regions
+ Inherit the base font size instead of defining a fixed one
+ Added feature to "freeze" some backup records to keep them indefinitely
- Removed support for Internet Explorer
~ Improve default header and body fonts for similar cross-platform "feel" without the need to use custom fonts.
~ Rendering improvements
~ Loading all JavaScript defered
~ Do not show the Backup on Update icon when Joomla is in record add / edit mode (main menu hidden and status bar locked).
~ Adjust size of control panel icons
~ More clarity in the in-component update notifications, explaining they come from Joomla itself
# [HIGH] Replacing (not just removing) AddHandler/SetHandler lines would fail during restoration
# [MEDIUM] Fetching back to server the archives from these provides would result in invalid archives: Amazon S3, Backblaze, Cloudfiles, OVH, Swift
# [MEDIUM] Greedy RegEx match in database dump could mess up views containing the literal ' view ' (word "view" surrounded by spaces) in their definition.

Akeeba Backup 7.2.2
================================================================================
+ Automatic UTF8MB4 character encoding downgrades from MySQL 8 to 5.7/5.6/5.5 on restoration.
# [LOW] The package would install on unsupported PHP versions 5.6 and 7.0 and Joomla 3.8, leading to errors
# [HIGH] The System - Akeeba Backup Update Check plugin throws a fatal error since version 7.1.4 when an update is available

Akeeba Backup 7.2.1
================================================================================
~ Small change in the FOF library to prevent harmless but confusing and annoying errors from appearing during upgrade
~ The following items are carried over from unpublished version 7.2.0
+ Restoration: Enable UTF8MB4 compatibility detection by default
~ Minimum requirements raised to PHP 7.1, Joomla 3.9
~ Using Joomla's cacert.pem instead of providing our own copy
~ Component Options page looks a bit nicer on Joomla 4
~ Joomla 4: fix profile selection drop-down display
# [HIGH] The restoration script can't read unquoted numeric values from the configuration.php file (used in Joomla 4)
# [HIGH] Joomla 4: Using the Smart Search filter during backup makes it impossible to use Smart Search on the restored site.
# [HIGH] Import from S3: infinite redirection loop
# [LOW] Very rare backup failures with a JS error
# [LOW] Unhandled exception page was incompatible with Joomla 4

Akeeba Backup 7.2.0
================================================================================
+ Restoration: Enable UTF8MB4 compatibility detection by default
~ Minimum requirements raised to PHP 7.1, Joomla 3.9
~ Using Joomla's cacert.pem instead of providing our own copy
~ Component Options page looks a bit nicer on Joomla 4
~ Joomla 4: fix profile selection drop-down display
# [HIGH] The restoration script can't read unquoted numeric values from the configuration.php file (used in Joomla 4)
# [HIGH] Joomla 4: Using the Smart Search filter during backup makes it impossible to use Smart Search on the restored site.
# [HIGH] Import from S3: infinite redirection loop
# [LOW] Very rare backup failures with a JS error
# [LOW] Unhandled exception page was incompatible with Joomla 4

Akeeba Backup 7.1.4
================================================================================
~ Now getting Super Users list using core Joomla API instead of direct database queries
# [LOW] Multipart upload to BackBlaze B2 might fail due to a silent B2 behavior change
# [LOW] OneDrive upload failure if a part upload starts >3600s after token issuance

Akeeba Backup 7.1.3
================================================================================
~ Got rid of the Optimize JavaScript feature.

Akeeba Backup 7.1.2
================================================================================
# [LOW] The Optimize JavaScript was not working properly on some low end servers due to the way browsers parse deferred scripts at the bottom of the HTML body

Akeeba Backup 7.1.1
================================================================================
~ Possible exception when the user has erroneously put their backup output directory to the site's root with open_basedir restrictions restricting access to its parent folder.
# [HIGH] The Optimize JavaScript option causes a missing class fatal error on Joomla! 3.8 sites
# [LOW] Missing icon in Manage Backups page, Import Archive toolbar button

Akeeba Backup 7.1.0
================================================================================
+ Automatic security check of the backup output directory
+ Automatic JavaScript bundling for improved performance
~ Improved storage of temporary data during backup [akeeba/engine#114]
~ Log files now have a .php extension to prevent unauthorized access in very rare cases
~ Enforce the recommended, sensible security measures when using the default backup output directory
~ Ongoing JavaScript refactoring
~ Google Drive: fetch up to 100 shared drives (previously: up to 10)
# [HIGH] An invalid output directory (e.g. by importing a backup profile) will cause a fatal exception in the Control Panel (gh-667)
# [MEDIUM] CloudFiles post-processing engine: Fixed file uploads
# [MEDIUM] Swift post-processing engine: Fixed file uploads
# [LOW] Send by Email reported a successful email sent as a warning
# [LOW] Database dump: foreign keys' (constraints) and local indices' names did not get their prefix replaced like tables, views etc do

Akeeba Backup 7.0.2
================================================================================
~ Log the full path to the computed site's root, without <root> replacement
~ Use Chosen in the Control Panel's profile selection page
# [HIGH] Core (free of charge) version only: the PayPal donation link included a tracking pixel. Changed to donation link, without tracking.
# [HIGH] Core (free of charge) version only: the system/akeebaupdatecheck plugin would always throw an error
# [HIGH] Restoration will fail if a table's name is a superset of another table's name e.g. foo_example_2020 being a superset of foo_example_2.
# [MEDIUM] WebDav post-processing engine: first backup archive was always uploaded on the remote root, ignoring any directory settings

Akeeba Backup 7.0.1
================================================================================
- pCloud: removing download to browser (cannot work properly due to undocumented API restrictions)
# [HIGH] An error about not being able to open a file with an empty name occurs when taking a SQL-only backup but there's a row over 1MB big
# [LOW] Schedule Automatic Backups shown in the Configuration page of the Core version
# [LOW] A secret work would not be proposed when one was not set or set to something insecure
# [LOW] The akeeba-altbackup.php and akeeba-altcheck-failed.php CRON scripts falsely report front-end backup is not enabled
# [LOW] Dark Mode: modal close icon was invisible both in the backup software and during restoration
# [LOW] Fixed automatically filling DropBox tokens after OAuth authentication

Akeeba Backup 7.0.0
================================================================================
+ Custom description for backups taken with the Backup on Update plugin
+ Remove TABLESPACE and DATA|INDEX DIRECTORY table options during backup
# [LOW] Fixed applying quotas for obsolete backups

Akeeba Backup 7.0.0.rc1
================================================================================
+ Upload to OVH now supports Keystone v3 authentication, mandatory starting mid-January 2020
# [HIGH] An error in an early backup domain could result in a forever-running backup
# [HIGH] DB connection errors wouldn't result in the backup failing, as it should be doing

Akeeba Backup 7.0.0.b3
================================================================================
+ Common PHP version warning scripts
+ Reinstated support for pCloud after they fixed their OAuth2 server
~ Improved Dark Mode
~ Improved PHP 7.4 compatibility
~ Improved Joomla 4 styling
~ Clearer message when setting decryption fails in CLI backup script
~ Remove JavaScript eval() from FileFilters page
# [HIGH] The database dump was broken with some versions of PCRE (e.g. the one distributed with Ubuntu 18.04)
# [HIGH] Site Transfer Wizard inaccessible on case-sensitive filesystems

Akeeba Backup 7.0.0.b2
================================================================================
- Removed pCloud support
+ ANGIE: Options to remove AddHandler lines on restoration
# [MEDIUM] Fixed OAuth authentication flow
# [MEDIUM] Fixed fatal error under Joomla 3.8.x

Akeeba Backup 7.0.0.b1
================================================================================
+ Amazon S3 now supports Bahrain and Stockholm regions
+ Amazon S3 now supports Intelligent Tiering, Glacier and Deep Archive storage classes
+ Google Storage now supports the nearline and coldline storage classes
+ Manage Backups: Improved performance of the Transfer (re-upload to remote storage) feature
+ Windows Azure BLOB Storage: download back to server and download to browser are now supported
+ New OneDrive integration supports both regular OneDrive and OneDrive for Business
+ pCloud support
+ Support for Dropbox for Business
+ Dark Mode support
+ Support for Joomla 4 Download Key management in the Update Sites page
+ Minimum required PHP version is now 5.6.0
~ All views have been converted to Blade for easier development and better future-proofing
~ The integrated restoration feature is now only available in the Professional version
~ The archive integrity check feature is now only available in the Professional version
~ The front-end legacy backup API and the Remote JSON API are now available only in the Professional version and can be enabled / disabled independently of each other
~ The Site Transfer Wizard is now only available in the Professional version
~ SugarSync integration: you now need to provide your own access keys following the documentation instructions
~ Backup error handling and reporting (to the log and to the interface) during backup has been improved.
~ The Test FTP/SFTP Connection buttons now return much more informative error messages.
~ Manage Backups: much more informative error messages if the Transfer to remote storage process fails.
~ The backup and log IDs will follow the numbering you see in the left hand column of the Manage Backups page.
~ Manage Backups: The Remote File Management page is now giving better, more accurate information.
~ Manage Backups: Fetch Back To Server was rewritten to gracefully deal with more problematic cases.
~ Joomla 4: The backup on update plugin no longer displayed correctly after J4 changed its template, again.
~ Joomla 4: The backup quick icon was displayed in the wrong place after J4 changed its template, again and also partially broke backwards compatibility to how quick icon plugins work.
~ Removed AES encapsulations from the JSON API for security reasons. We recommend you always use HTTPS with the JSON API.
# [HIGH] CLI (CRON) scripts could sometimes stop with a Joomla crash due to Joomla's mishandling of the session under CLI.
# [HIGH] Changing the database prefix would not change it in the referenced tables inside PROCEDUREs, FUNCTIONs and TRIGGERs
# [HIGH] Backing up PROCEDUREs, FUNCTIONs and TRIGGERs was broken
# [MEDIUM] Database only backup of PROCEDUREs, FUNCTIONs and TRIGGERs does not output the necessary DELIMITER commands to allow direct import
# [MEDIUM] PHP Notice at the end of each backup step due to double attempt to close the database connection.
# [MEDIUM] BackBlaze B2: upload error when chunk size is higher than the backup archive's file size
# [LOW] Manage Backups: downloading a part file from S3 beginning with text data would result in inline display of the file instead of download.
components/com_akeeba/sql/.htaccess000060400000000246152453623440013402 0ustar00<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
  <RequireAll>
    Require all denied
  </RequireAll>
</IfModule>
components/com_akeeba/sql/xml/mysql.xml000060400000016552152453623440014302 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->

<schema>
    <!-- Metadata -->
    <meta>
        <!-- Supported driver types -->
        <drivers>
            <driver>mysql</driver>
            <driver>mysqli</driver>
            <driver>pdomysql</driver>
        </drivers>
    </meta>

    <!-- SQL commands to run on installation and update -->
    <sql>
        <!-- Create the #__ak_profiles table if it's missing -->
        <action table="#__ak_profiles" canfail="0">
            <condition type="missing" value="" />
            <query><![CDATA[
CREATE TABLE `#__ak_profiles` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`description` varchar(255) NOT NULL,
`configuration` longtext,
`filters` longtext,
`quickicon` tinyint(3) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
) DEFAULT COLLATE utf8_general_ci;
            ]]></query>
        </action>

        <!-- Insert into #__ak_profiles if id=1 is not there -->
        <action table="#__ak_profiles" canfail="1">
            <condition type="equals" operator="not" value="1"><![CDATA[
SELECT COUNT(*) FROM `#__ak_profiles` WHERE `id` = 1;
            ]]></condition>

            <query><![CDATA[
INSERT IGNORE INTO `#__ak_profiles`
(`id`,`description`, `configuration`, `filters`, `quickicon`) VALUES
(1,'Default Backup Profile','','',1);
            ]]></query>
        </action>

        <!-- Create #__ak_stats if it's missing -->
        <action table="#__ak_stats" canfail="0">
            <condition type="missing" value="" />
            <query><![CDATA[
CREATE TABLE `#__ak_stats` (
	`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
	`description` varchar(255) NOT NULL,
	`comment` longtext,
	`backupstart` timestamp NULL DEFAULT NULL,
	`backupend` timestamp NULL DEFAULT NULL,
	`status` enum('run','fail','complete') NOT NULL DEFAULT 'run',
	`origin` varchar(30) NOT NULL DEFAULT 'backend',
	`type` varchar(30) NOT NULL DEFAULT 'full',
	`profile_id` bigint(20) NOT NULL DEFAULT '1',
	`archivename` longtext,
	`absolute_path` longtext,
	`multipart` int(11) NOT NULL DEFAULT '0',
	`tag` varchar(255) DEFAULT NULL,
	`backupid` varchar(255) DEFAULT NULL,
	`filesexist` tinyint(3) NOT NULL DEFAULT '1',
	`remote_filename` varchar(1000) DEFAULT NULL,
	`total_size` bigint(20) NOT NULL DEFAULT '0',
	`frozen` tinyint(1) NOT NULL DEFAULT '0',
	`instep` tinyint(1) NOT NULL DEFAULT '0',
	PRIMARY KEY (`id`),
	KEY `idx_fullstatus` (`filesexist`,`status`),
	KEY `idx_stale` (`status`,`origin`)
) DEFAULT COLLATE utf8_general_ci;
            ]]></query>
        </action>

        <!-- Create #__ak_storage if it's missing -->
        <action table="#__ak_storage" canfail="0">
            <condition type="missing" value="" />
            <query><![CDATA[
CREATE TABLE `#__ak_storage` (
	`tag` varchar(255) NOT NULL,
	`lastupdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
	`data` longtext,
	PRIMARY KEY (`tag`(100))
) DEFAULT COLLATE utf8_general_ci;
            ]]></query>
        </action>

        <!-- Add the backupid column to #__ak_stats if it's missing -->
        <action table="#__ak_stats" canfail="1">
            <condition type="missing" value="backupid" />
            <query><![CDATA[
ALTER TABLE `#__ak_stats`
ADD COLUMN `backupid` varchar(255) DEFAULT NULL
AFTER `tag`
            ]]></query>
        </action>

        <!-- Add the quickicon column to #__ak_profiles if it's missing -->
        <action table="#__ak_profiles" canfail="1">
            <condition type="missing" value="quickicon" />
            <query><![CDATA[
ALTER TABLE `#__ak_profiles`
ADD COLUMN `quickicon` tinyint(3) NOT NULL DEFAULT '1'
AFTER `filters`
            ]]></query>
        </action>

        <!-- Shorten the primary key before upgrading to utf8mb4 (in Joomla! 3.5+) -->
        <action table="#__ak_storage" canfail="1">
            <condition type="utf8mb4upgrade" />
            <query><![CDATA[
ALTER TABLE `#__ak_storage` DROP PRIMARY KEY;
            ]]></query>
            <query><![CDATA[
ALTER TABLE `#__ak_storage` ADD PRIMARY KEY (`tag`(100));
            ]]></query>
        </action>

        <!-- Add the frozen column to #__ak_stats if it's missing -->
        <action table="#__ak_stats" canfail="1">
            <condition type="missing" value="frozen" />
            <query><![CDATA[
ALTER TABLE `#__ak_stats` ADD COLUMN `frozen` tinyint(1) DEFAULT '0';
            ]]></query>
        </action>

        <!-- Add the instep column to #__ak_stats if it's missing -->
        <action table="#__ak_stats" canfail="1">
            <condition type="missing" value="instep" />
            <query><![CDATA[
ALTER TABLE `#__ak_stats` ADD COLUMN `instep` tinyint(1) DEFAULT '0';
            ]]></query>
        </action>

        <!-- Change datetime fields to nullable -->
        <action table="#__ak_stats" canfail="1">
            <condition type="nullable" value="backupstart" operator="not"/>
            <query><![CDATA[
        ALTER TABLE `#__ak_stats` MODIFY `backupstart` TIMESTAMP NULL DEFAULT NULL;
        ]]></query>
            <query><![CDATA[
        UPDATE `#__ak_stats` SET `backupstart` = NULL WHERE `backupstart` = '0000-00-00 00:00:00';
        ]]></query>
        </action>

        <action table="#__ak_stats" canfail="1">
            <condition type="nullable" value="backupend" operator="not"/>
            <query><![CDATA[
        ALTER TABLE `#__ak_stats` MODIFY `backupend` TIMESTAMP NULL DEFAULT NULL;
        ]]></query>
            <query><![CDATA[
        UPDATE `#__ak_stats` SET `backupend` = NULL WHERE `backupend` = '0000-00-00 00:00:00';
        ]]></query>
        </action>

        <!-- Nuke any old record inside the ak_storage table -->
        <action table="#__ak_storage" canfail="1">
            <condition type="equals" operator="not" value="0"><![CDATA[
SELECT COUNT(*) FROM `#__ak_storage` WHERE `tag` != "lastupdate";
            ]]></condition>

            <query><![CDATA[
DELETE FROM `#__ak_storage` WHERE `tag` != "lastupdate";
            ]]></query>
        </action>

        <!-- 8.0.4 :: Convert tables to InnoDB -->
        <action table="#__ak_profiles" canfail="1">
            <condition type="equals" operator="not" value="1"><![CDATA[
SELECT COUNT(*) FROM `INFORMATION_SCHEMA`.`TABLES` WHERE (`TABLE_NAME` = '#__ak_profiles') AND (`TABLE_SCHEMA` = DATABASE()) AND (`ENGINE` = 'InnoDB');
            ]]></condition>
            <query><![CDATA[
ALTER TABLE `#__ak_profiles` ENGINE InnoDB;
            ]]></query>
        </action>

        <action table="#__ak_stats" canfail="1">
            <condition type="equals" operator="not" value="1"><![CDATA[
SELECT COUNT(*) FROM `INFORMATION_SCHEMA`.`TABLES` WHERE (`TABLE_NAME` = '#__ak_stats') AND (`TABLE_SCHEMA` = DATABASE()) AND (`ENGINE` = 'InnoDB');
            ]]></condition>
            <query><![CDATA[
ALTER TABLE `#__ak_stats` ENGINE InnoDB;
            ]]></query>
        </action>

        <action table="#__ak_storage" canfail="1">
            <condition type="equals" operator="not" value="1"><![CDATA[
SELECT COUNT(*) FROM `INFORMATION_SCHEMA`.`TABLES` WHERE (`TABLE_NAME` = '#__ak_storage') AND (`TABLE_SCHEMA` = DATABASE()) AND (`ENGINE` = 'InnoDB');
            ]]></condition>
            <query><![CDATA[
ALTER TABLE `#__ak_storage` ENGINE InnoDB;
            ]]></query>
        </action>
    </sql>
</schema>components/com_akeeba/sql/web.config000060400000001025152453623440013544 0ustar00<?xml version="1.0"?>
<!--
    This only works on IIS 7 or later. See https://www.iis.net/configreference/system.webserver/security/requestfiltering/fileextensions
-->
<configuration>
    <system.webServer>
        <security>
            <requestFiltering>
                <fileExtensions allowUnlisted="false" >
                    <clear />
                    <add fileExtension=".html" allowed="true"/>
                </fileExtensions>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>components/com_akeeba/sql/index.html000060400000000352152453623440013577 0ustar00<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->

<html><head><title></title></head><body></body></html>components/com_akeeba/config.xml000060400000031402152453623440012772 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->
<config addfieldpath="/administrator/components/com_akeeba/fields">
	<fieldset
			name="permissions"
			label="JCONFIG_PERMISSIONS_LABEL"
			description="JCONFIG_PERMISSIONS_DESC"
	>

		<field
				name="rules"
				type="rules"
				label="JCONFIG_PERMISSIONS_LABEL"
				class="inputbox"
				filter="rules"
				component="com_akeeba"
				section="component"/>
	</fieldset>

	<fieldset name="backend" label="COM_AKEEBA_CONFIG_BACKEND_HEADER_LABEL"
			  description="COM_AKEEBA_CONFIG_BACKEND_HEADER_DESC">

		<field name="dark_mode" type="list" default="-1"
			   label="COM_AKEEBA_CONFIG_BACKEND_DARKMODE_LABEL"
			   description="COM_AKEEBA_CONFIG_BACKEND_DARKMODE_DESC">
			<option value="-1">COM_AKEEBA_CONFIG_BACKEND_DARKMODE_AUTO</option>
			<option value="0">COM_AKEEBA_CONFIG_BACKEND_DARKMODE_NEVER</option>
			<option value="1">COM_AKEEBA_CONFIG_BACKEND_DARKMODE_ALWAYS</option>
		</field>

		<field name="dateformat" type="text" default="" size="30"
			   label="COM_AKEEBA_CONFIG_DATEFORMAT_LABEL"
			   description="COM_AKEEBA_CONFIG_DATEFORMAT_DESC"/>

		<field name="localtime" type="fancyradio" default="1"
			   label="COM_AKEEBA_CONFIG_BACKEND_LOCALTIME_LABEL"
			   description="COM_AKEEBA_CONFIG_BACKEND_LOCALTIME_DESC"
			   class="btn-group btn-group-yesno">
			<option value="0">JNo</option>
			<option value="1">JYes</option>
		</field>

		<field name="timezonetext" type="list" default="T"
			   label="COM_AKEEBA_CONFIG_BACKEND_TIMEZONETEXT_LABEL"
			   description="COM_AKEEBA_CONFIG_BACKEND_TIMEZONETEXT_DESC">
			<option value="">COM_AKEEBA_CONFIG_BACKEND_TIMEZONETEXT_NONE</option>
			<option value="T">COM_AKEEBA_CONFIG_BACKEND_TIMEZONETEXT_ABBREVIATION</option>
			<option value="\G\M\TP">COM_AKEEBA_CONFIG_BACKEND_TIMEZONETEXT_GMTOFFSET</option>
		</field>

		<field name="showDeleteOnRestore" type="fancyradio" default="0"
			   label="COM_AKEEBA_CONFIG_BACKEND_SHOWDELETEONRESTORE_LABEL"
			   description="COM_AKEEBA_CONFIG_BACKEND_SHOWDELETEONRESTORE_DESC"
			   class="btn-group btn-group-yesno">
			<option value="0">JNo</option>
			<option value="1">JYes</option>
		</field>

		<field name="no_flush"
			   type="fancyradio"
			   default="0"
			   label="COM_AKEEBA_CONFIG_SECURITY_NO_FLUSH_LABEL"
			   description="COM_AKEEBA_CONFIG_SECURITY_NO_FLUSH_DESCRIPTION"
			   class="btn-group btn-group-yesno">
			<option value="0">JNo</option>
			<option value="1">JYes</option>
		</field>

	</fieldset>

	<fieldset name="frontend" label="COM_AKEEBA_CONFIG_FRONTEND_HEADER_LABEL"
			  description="COM_AKEEBA_CONFIG_FRONTEND_HEADER_DESC">

		<field name="legacyapi_enabled" type="fancyradio" default="0"
			   label="COM_AKEEBA_CONFIG_LEGACYAPI_ENABLED_LABEL"
			   description="COM_AKEEBA_CONFIG_LEGACYAPI_ENABLED_DESC"
			   class="btn-group btn-group-yesno">
			<option value="0">JNo</option>
			<option value="1">JYes</option>
		</field>

		<field name="jsonapi_enabled" type="fancyradio" default="0"
			   label="COM_AKEEBA_CONFIG_JSONAPI_ENABLED_LABEL"
			   description="COM_AKEEBA_CONFIG_JSONAPI_ENABLED_DESC"
			   class="btn-group btn-group-yesno">
			<option value="0">JNo</option>
			<option value="1">JYes</option>
		</field>

		<field name="frontend_secret_word" type="akencrypted"
			   default="" size="30"
			   label="COM_AKEEBA_CONFIG_SECRETWORD_LABEL"
			   description="COM_AKEEBA_CONFIG_SECRETWORD_DESC"
			   class="input-xxlarge"
			   showon="legacyapi_enabled:1[OR]jsonapi_enabled:1"
		/>

		<field name="forced_backup_timezone" type="timezone" default="AKEEBA/DEFAULT"
			   size="1"
			   label="COM_AKEEBA_CONFIG_FORCEDBACKUPTZ_LABEL"
			   description="COM_AKEEBA_CONFIG_FORCEDBACKUPTZ_DESC"
			   class="input-xxlarge">
			<option value="AKEEBA/DEFAULT">COM_AKEEBA_CONFIG_FORCEDBACKUPTZ_DEFAULT</option>
			<option value="GMT">GMT</option>
		</field>

		<field name="frontend_email_on_finish" type="fancyradio" default="0"
			   label="COM_AKEEBA_CONFIG_FRONTENDEMAIL_LABEL"
			   description="COM_AKEEBA_CONFIG_FRONTENDEMAIL_DESC"
			   class="btn-group btn-group-yesno">
			<option value="0">JNo</option>
			<option value="1">JYes</option>
		</field>

		<field name="frontend_email_when" type="list" default="always"
			   label="COM_AKEEBA_CONFIG_FRONTEND_EMAIL_WHEN_LABEL"
			   description="COM_AKEEBA_CONFIG_FRONTEND_EMAIL_WHEN_DESC"
			   showon="frontend_email_on_finish:1"
		>
			<option value="always">COM_AKEEBA_CONFIG_FRONTEND_EMAIL_WHEN_ALWAYS</option>
			<option value="failedupload">COM_AKEEBA_CONFIG_FRONTEND_EMAIL_WHEN_FAILEDUPLOAD</option>
		</field>

		<field name="frontend_email_address" type="text" default="" size="50"
			   label="COM_AKEEBA_CONFIG_ARBITRARYFEEMAIL_LABEL"
			   description="COM_AKEEBA_CONFIG_ARBITRARYFEEMAIL_DESC"
			   class="input-xxlarge"
			   showon="frontend_email_on_finish:1"
		/>

		<field name="frontend_email_subject" type="text" default="" size="50"
			   label="COM_AKEEBA_CONFIG_FEEMAILSUBJECT_LABEL"
			   description="COM_AKEEBA_CONFIG_FEEMAILSUBJECT_DESC"
			   class="input-xxlarge"
			   showon="frontend_email_on_finish:1"
		/>

		<field name="frontend_email_body" type="textarea" default="" rows="10" cols="55"
			   label="COM_AKEEBA_CONFIG_FEEMAILBODY_LABEL"
			   description="COM_AKEEBA_CONFIG_FEEMAILBODY_DESC"
			   showon="frontend_email_on_finish:1"
		/>

		<!-- FAILURE CHECK SETTINGS -->
		<field type="spacer" label="COM_AKEEBA_CONFIG_FAILURE_SEPARATOR"/>

		<field name="failure_timeout" type="text" default="180"
			   filter="integer"
			   label="COM_AKEEBA_CONFIG_FAILURE_TIMEOUT_LABEL"
			   description="COM_AKEEBA_CONFIG_FAILURE_TIMEOUT_DESC"
		/>

		<field name="failure_email_address" type="text" default="" size="50"
			   label="COM_AKEEBA_CONFIG_FAILURE_EMAILADDRESS_LABEL"
			   description="COM_AKEEBA_CONFIG_FAILURE_EMAILADDRESS_DESC"/>

		<field name="failure_email_subject" type="text" default="" size="50"
			   label="COM_AKEEBA_CONFIG_FAILURE_EMAILSUBJECT_LABEL"
			   description="COM_AKEEBA_CONFIG_FAILURE_EMAILSUBJECT_DESC"/>

		<field name="failure_email_body" type="textarea" default="" rows="10" cols="55"
			   label="COM_AKEEBA_CONFIG_FAILURE_EMAILBODY_LABEL"
			   description="COM_AKEEBA_CONFIG_FAILURE_EMAILBODY_DESC"/>

		<field name="siteurl" type="hidden" default="" label=""/>
		<field name="jversion" type="hidden" default="" label=""/>
		<field name="jlibrariesdir" type="hidden" default="" label=""/>
		<field name="lastversion" type="hidden" default="" label=""/>
		<field name="angieupgrade" type="hidden" default="0" label=""/>
		<field name="show_howtorestoremodal" type="hidden" default="1" label=""/>
		<field name="updatedb" type="hidden" default="" label=""/>
	</fieldset>

	<fieldset name="liveupdate" label="COM_AKEEBA_CONFIG_LIVEUPDATE_HEADER_LABEL"
			  description="COM_AKEEBA_CONFIG_LIVEUPDATE_HEADER_DESC">
		<field name="update_dlid" type="text" default="" size="30"
			   label="COM_AKEEBA_CONFIG_DOWNLOADID_LABEL"
			   description="COM_AKEEBA_CONFIG_DOWNLOADID_DESC"/>

		<field name="stats_enabled"
			   type="fancyradio"
			   default="1"
			   label="COM_AKEEBA_CONFIG_USAGESTATS_LABEL"
			   description="COM_AKEEBA_CONFIG_USAGESTATS_DESC"
			   class="btn-group btn-group-yesno">
			<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>
	</fieldset>

	<fieldset name="security" label="COM_AKEEBA_CONFIG_SECURITY_HEADER_LABEL"
			  description="COM_AKEEBA_CONFIG_SECURITY_HEADER_DESC">
		<field name="useencryption" type="fancyradio" default="1"
			   label="COM_AKEEBA_CONFIG_SECURITY_USEENCRYPTION_LABEL"
			   description="COM_AKEEBA_CONFIG_SECURITY_USEENCRYPTION_DESCRIPTION"
			   class="btn-group btn-group-yesno">
			<option value="0">JNo</option>
			<option value="1">JYes</option>
		</field>

	</fieldset>

	<fieldset name="push" label="COM_AKEEBA_CONFIG_PUSH_HEADER_LABEL" description="COM_AKEEBA_CONFIG_PUSH_HEADER_DESC">
		<field name="desktop_notifications" type="fancyradio" default="0"
			   label="COM_AKEEBA_CONFIG_DESKTOP_NOTIFICATIONS_LABEL"
			   description="COM_AKEEBA_CONFIG_DESKTOP_NOTIFICATIONS_DESC"
			   class="btn-group btn-group-yesno">
		<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>

		<field name="push_preference" type="list" default="0"
			   label="COM_AKEEBA_CONFIG_PUSH_PREFERENCE_LABEL"
			   description="COM_AKEEBA_CONFIG_PUSH_PREFERENCE_DESC">
			<option value="0">COM_AKEEBA_CONFIG_PUSH_PREFERENCE_OPT_NONE</option>
			<option value="1">COM_AKEEBA_CONFIG_PUSH_PREFERENCE_OPT_PUSHBULLET</option>
		</field>

		<field name="push_apikey" type="text" default="" size="30"
			   label="COM_AKEEBA_CONFIG_PUSH_APIKEY_LABEL"
			   description="COM_AKEEBA_CONFIG_PUSH_APIKEY_DESC"
			   showon="push_preference:1"
		/>
	</fieldset>

	<fieldset name="oauth2"
			  label="COM_AKEEBA_CONFIG_OAUTH2_HEADER_LABEL"
			  description="COM_AKEEBA_CONFIG_OAUTH2_HEADER_DESC"
	>
		<!-- Box.com -->

		<field name="oauth2_client_box"
			   type="radio"
			   layout="joomla.form.field.radio.switcher"
			   default="0"
			   label="COM_AKEEBA_CONFIG_OAUTH2_CLIENT_BOX_LABEL"
			   description="COM_AKEEBA_CONFIG_OAUTH2_CLIENT_BOX_DESC"
			   class="btn-group btn-group-yesno">
			<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>

		<field name="box_info"
			   type="Oauth2url"
			   showon="oauth2_client_box:1"
			   engine="box"
		/>

		<field name="box_client_id"
			   type="text"
			   label="COM_AKEEBA_CONFIG_BOX_CLIENT_ID_LABEL"
			   description="COM_AKEEBA_CONFIG_BOX_CLIENT_ID_DESC"
			   showon="oauth2_client_box:1"
		/>

		<field name="box_client_secret"
			   type="password"
			   label="COM_AKEEBA_CONFIG_BOX_CLIENT_SECRET_LABEL"
			   description="COM_AKEEBA_CONFIG_BOX_CLIENT_SECRET_DESC"
			   showon="oauth2_client_box:1"
		/>

		<!-- Dropbox -->

		<field name="oauth2_client_dropbox"
			   type="radio"
			   layout="joomla.form.field.radio.switcher"
			   default="0"
			   label="COM_AKEEBA_CONFIG_OAUTH2_CLIENT_DROPBOX_LABEL"
			   description="COM_AKEEBA_CONFIG_OAUTH2_CLIENT_DROPBOX_DESC"
			   class="btn-group btn-group-yesno">
			<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>

		<field name="dropbox_info"
			   type="Oauth2url"
			   showon="oauth2_client_dropbox:1"
			   engine="dropbox"
		/>

		<field name="dropbox_client_id"
			   type="text"
			   label="COM_AKEEBA_CONFIG_DROPBOX_CLIENT_ID_LABEL"
			   description="COM_AKEEBA_CONFIG_DROPBOX_CLIENT_ID_DESC"
			   showon="oauth2_client_dropbox:1"
		/>

		<field name="dropbox_client_secret"
			   type="password"
			   label="COM_AKEEBA_CONFIG_DROPBOX_CLIENT_SECRET_LABEL"
			   description="COM_AKEEBA_CONFIG_DROPBOX_CLIENT_SECRET_DESC"
			   showon="oauth2_client_dropbox:1"
		/>

		<!-- Google Drive -->

		<field name="oauth2_client_googledrive"
			   type="radio"
			   layout="joomla.form.field.radio.switcher"
			   default="0"
			   label="COM_AKEEBA_CONFIG_OAUTH2_CLIENT_GOOGLEDRIVE_LABEL"
			   description="COM_AKEEBA_CONFIG_OAUTH2_CLIENT_GOOGLEDRIVE_DESC"
			   class="btn-group btn-group-yesno">
			<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>

		<field name="googledrive_info"
			   type="Oauth2url"
			   showon="oauth2_client_googledrive:1"
			   engine="googledrive"
		/>

		<field name="googledrive_client_id"
			   type="text"
			   label="COM_AKEEBA_CONFIG_GOOGLEDRIVE_CLIENT_ID_LABEL"
			   description="COM_AKEEBA_CONFIG_GOOGLEDRIVE_CLIENT_ID_DESC"
			   showon="oauth2_client_googledrive:1"
		/>

		<field name="googledrive_client_secret"
			   type="password"
			   label="COM_AKEEBA_CONFIG_GOOGLEDRIVE_CLIENT_SECRET_LABEL"
			   description="COM_AKEEBA_CONFIG_GOOGLEDRIVE_CLIENT_SECRET_DESC"
			   showon="oauth2_client_googledrive:1"
		/>

		<!-- OneDrive Business -->

		<field name="oauth2_client_onedrivebusiness"
			   type="radio"
			   layout="joomla.form.field.radio.switcher"
			   default="0"
			   label="COM_AKEEBA_CONFIG_OAUTH2_CLIENT_ONEDRIVEBUSINESS_LABEL"
			   description="COM_AKEEBA_CONFIG_OAUTH2_CLIENT_ONEDRIVEBUSINESS_DESC"
			   class="btn-group btn-group-yesno">
			<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>

		<field name="onedrivebusiness_info"
			   type="Oauth2url"
			   showon="oauth2_client_onedrivebusiness:1"
			   engine="onedrivebusiness"
		/>

		<field name="onedrivebusiness_client_id"
			   type="text"
			   label="COM_AKEEBA_CONFIG_ONEDRIVEBUSINESS_CLIENT_ID_LABEL"
			   description="COM_AKEEBA_CONFIG_ONEDRIVEBUSINESS_CLIENT_ID_DESC"
			   showon="oauth2_client_onedrivebusiness:1"
		/>

		<field name="onedrivebusiness_client_secret"
			   type="password"
			   label="COM_AKEEBA_CONFIG_ONEDRIVEBUSINESS_CLIENT_SECRET_LABEL"
			   description="COM_AKEEBA_CONFIG_ONEDRIVEBUSINESS_CLIENT_SECRET_DESC"
			   showon="oauth2_client_onedrivebusiness:1"
		/>
	</fieldset>

</config>
components/com_akeeba/View/FileFilters/Html.php000060400000010144152453623440015542 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\View\FileFilters;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Model\FileFilters;
use Akeeba\Backup\Admin\View\ViewTraits\ProfileIdAndName;
use Akeeba\Engine\Factory;
use FOF40\View\DataView\Html as BaseView;
use Joomla\CMS\HTML\HTMLHelper as JHtml;
use Joomla\CMS\Language\Text as JText;
use Joomla\CMS\Uri\Uri as JUri;

class Html extends BaseView
{
	use ProfileIdAndName;

	/**
	 * SELECT element for choosing a database root
	 *
	 * @var  string
	 */
	public $root_select = '';

	/**
	 * List of database roots
	 *
	 * @var  array
	 */
	public $roots = [];

	/**
	 * @return  void
	 */
	public function onBeforeMain()
	{
		$this->container->template->addJS('media://com_akeeba/js/FileFilters.min.js', true, false, $this->container->mediaVersion);

		/** @var FileFilters $model */
		$model = $this->getModel();

		// Add custom submenus
		$task    = $model->getState('browse_task', 'normal', 'cmd');
		$toolbar = $this->container->toolbar;

		$toolbar->appendLink(
			JText::_('COM_AKEEBA_FILEFILTERS_LABEL_NORMALVIEW'),
			JUri::base() . 'index.php?option=com_akeeba&view=FileFilters&task=normal',
			($task == 'normal')
		);
		$toolbar->appendLink(
			JText::_('COM_AKEEBA_FILEFILTERS_LABEL_TABULARVIEW'),
			JUri::base() . 'index.php?option=com_akeeba&view=FileFilters&task=tabular',
			($task == 'tabular')
		);

		// Get a JSON representation of the available roots
		$filters   = Factory::getFilters();
		$root_info = $filters->getInclusions('dir');
		$roots     = [];
		$options   = [];

		if (!empty($root_info))
		{
			// Loop all dir definitions
			foreach ($root_info as $dir_definition)
			{
				if (is_null($dir_definition[1]))
				{
					// Site root definition has a null element 1. It is always pushed on top of the stack.
					array_unshift($roots, $dir_definition[0]);
				}
				else
				{
					$roots[] = $dir_definition[0];
				}

				$options[] = JHtml::_('select.option', $dir_definition[0], $dir_definition[0]);
			}
		}

		$siteRoot      = $roots[0];
		$selectOptions = [
			'list.select' => $siteRoot,
			'id'          => 'active_root',
		];

		$this->root_select = JHtml::_('select.genericlist', $options, 'root', $selectOptions);
		$this->roots       = $roots;
		$platform          = $this->container->platform;

		// Add script options
		$platform->addScriptOptions('akeeba.System.params.AjaxURL', 'index.php?option=com_akeeba&view=FileFilters&task=ajax');
		$platform->addScriptOptions('akeeba.Fsfilters.loadingGif', $this->container->template->parsePath('media://com_akeeba/icons/loading.gif'));

		switch ($task)
		{
			case 'normal':
			default:
				$this->setLayout('default');

				// Get a JSON representation of the directory data
				$platform->addScriptOptions('akeeba.FileFilters.guiData', $model->make_listing($siteRoot, [], ''));
				$platform->addScriptOptions('akeeba.FileFilters.viewType', "list");

				break;

			case 'tabular':
				$this->setLayout('tabular');

				// Get a JSON representation of the tabular filter data
				$platform->addScriptOptions('akeeba.FileFilters.guiData', $model->get_filters($siteRoot));
				$platform->addScriptOptions('akeeba.FileFilters.viewType', "tabular");

				break;
		}

		// Push translations
		JText::script('COM_AKEEBA_FILEFILTERS_LABEL_UIROOT');
		JText::script('COM_AKEEBA_FILEFILTERS_LABEL_UIERRORFILTER');
		JText::script('COM_AKEEBA_FILEFILTERS_TYPE_DIRECTORIES');
		JText::script('COM_AKEEBA_FILEFILTERS_TYPE_SKIPFILES');
		JText::script('COM_AKEEBA_FILEFILTERS_TYPE_SKIPDIRS');
		JText::script('COM_AKEEBA_FILEFILTERS_TYPE_FILES');
		JText::script('COM_AKEEBA_FILEFILTERS_TYPE_DIRECTORIES_ALL');
		JText::script('COM_AKEEBA_FILEFILTERS_TYPE_SKIPFILES_ALL');
		JText::script('COM_AKEEBA_FILEFILTERS_TYPE_SKIPDIRS_ALL');
		JText::script('COM_AKEEBA_FILEFILTERS_TYPE_FILES_ALL');
		JText::script('COM_AKEEBA_FILEFILTERS_TYPE_APPLYTOALLDIRS');
		JText::script('COM_AKEEBA_FILEFILTERS_TYPE_APPLYTOALLFILES');

		$this->getProfileIdAndName();
	}

}
components/com_akeeba/View/errorhandler.php000060400000021722152453623440015121 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2021 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') or die();

/** @var Throwable $e */
/** @var string $title */
/** @var bool $isPro */

$code = $e->getCode();
$code = !empty($code) ? $code : 500;

$app  = class_exists('\Joomla\CMS\Factory') ? \Joomla\CMS\Factory::getApplication() : \JFactory::getApplication();

$user30 = (class_exists('JFactory') && method_exists('JFactory', 'getUser')) ? JFactory::getUser() : null;
$user38 = class_exists('\Joomla\CMS\Factory') && method_exists('\Joomla\CMS\Factory', 'getUser') ? \Joomla\CMS\Factory::getUser() : null;
$user40 = (is_object($app) && method_exists($app, 'getIdentity')) ? $app->getIdentity() : null;
$user = is_null($user40) ? $user38 : $user40;
$user = is_null($user40) ? $user30 : $user;
$isSuper = !is_null($user) && $user->authorise('core.admin');

$isFrontend   = class_exists('JApplicationSite') && ($app instanceof JApplicationSite);
$isFrontend   = $isFrontend || (class_exists('\Joomla\CMS\Application\SiteApplication') && ($app instanceof \Joomla\CMS\Application\SiteApplication));
$user         = $isFrontend ? (method_exists($app, 'getIdentity') ? $app->getIdentity() : JFactory::getUser()) : null;
$hideTheError = $isFrontend && !(defined('JDEBUG') && (JDEBUG == 1)) && !$isSuper;
$isPro        = !isset($isPro) ? false : $isPro;

// 403 and 404 are re-thrown
if (in_array($code, [403, 404]))
{
	throw $e;
}

if (version_compare(JVERSION, '4', 'lt'))
{
	$app->setHeader('HTTP/1.1', $code);
}
else
{
	// In Joomla 4 we have to use the "Status" header, otherwise we get a fatal error saying that
	// HTTP/1.1 is not a valid header
	$app->setHeader('Status', $code);
}

if (!$isFrontend)
{
	if (class_exists('\Joomla\CMS\Toolbar\ToolbarHelper'))
	{
		\Joomla\CMS\Toolbar\ToolbarHelper::title($title . ' <small>Unhandled Exception</small>');
	}
	else
	{
		JToolbarHelper::title($title . ' <small>Unhandled Exception</small>');
	}

}

?>

<?php if ($hideTheError): ?>
	<h1>The application has stopped responding</h1>
	<p>
		Please contact the administrator of the site and let them know of this error and what you were doing when this
		happened.
	</p>
	<?php return true; endif; ?>

<h1><?php echo $title ?> - An unhandled Exception has been detected</h1>
<h3>
	<?php if (version_compare(JVERSION, '3.999.999', 'le')): ?>
		<span class="label label-danger"><?php echo htmlentities($code) ?></span> <?php echo htmlentities($e->getMessage()) ?>
	<?php else: ?>
		<span class="badge badge-danger"><?php echo htmlentities($code) ?></span> <?php echo htmlentities($e->getMessage()) ?>
	<?php endif; ?>
</h3>
<p>
	File <code><?php echo htmlentities(str_ireplace(JPATH_ROOT, '&lt;root&gt;', $e->getFile())) ?></code>
	Line <span class="label label-info"><?php echo (int) $e->getLine() ?></span>
</p>

<?php if ($isPro): ?>
	<div class="<?php if (version_compare(JVERSION, '3.999.999', 'le')):?>hero-unit<?php else: ?>alert alert-primary<?php endif; ?>">
		<p>
			<strong>Would you like us to help you faster?</strong>
		</p>
		<p>
			Save this page as PDF or HTML. When filing a support ticket please attach that PDF or HTML file.
		</p>
	</div>
	<p>
		<strong>Why do we need all that information?</strong> This information is an x-ray of your site at the time the
		error
		occurred. It lets us reproduce the issue or, if it's not a bug in our software, help you pinpoint the external
		reason which
		led to it.
	</p>
	<p>
		<strong>What about privacy?</strong>
		Attachments are private in our ticket system: only you and us can see them, <em>even if you file a public
			ticket</em>, and
		they are automatically deleted after a month.
	</p>
<?php endif; ?>

<hr />
<p>
	<span class="icon icon-warning-2"></span>
	<em>
		The content below this point is for developers and power users.
	</em>
</p>
<hr />

<p class="alert alert-warning">
	Joomla <?= JVERSION ?> – PHP <?= PHP_VERSION ?> on <?= PHP_OS ?>
</p>

<h3>Debug information</h3>
<p>
	Exception type: <code><?php echo htmlentities(get_class($e)) ?></code>
</p>
<pre><?php echo htmlentities($e->getTraceAsString()) ?></pre>

<h3>System information</h3>
<table class="table table-striped">
	<tr>
		<td>Operating System (reported by PHP)</td>
		<td><?php echo PHP_OS ?></td>
	</tr>
	<tr>
		<td>PHP version (as reported <em>by your server</em>)</td>
		<td><?php echo PHP_VERSION ?></td>
	</tr>
	<tr>
		<td>PHP Built On</td>
		<td><?php echo htmlentities(php_uname()); ?></td>
	</tr>
	<tr>
		<td>PHP SAPI</td>
		<td><?php echo PHP_SAPI ?></td>
	</tr>
	<tr>
		<td>Server identity</td>
		<td><?php echo htmlentities(isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : getenv('SERVER_SOFTWARE')) ?></td>
	</tr>
	<tr>
		<td>Browser identity</td>
		<td><?php echo htmlentities(isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '') ?></td>
	</tr>
	<tr>
		<td>Joomla! version</td>
		<td><?php echo JVERSION ?></td>
	</tr>
	<?php
	$db = JFactory::getDbo();
	if (!is_null($db)):
	?>
	<tr>
		<td>Database driver name</td>
		<td><?php echo $db->getName() ?></td>
	</tr>
	<tr>
		<td>Database driver type</td>
		<td><?php echo $db->getServerType() ?></td>
	</tr>
	<tr>
		<td>Database server version</td>
		<td><?php echo $db->getVersion() ?></td>
	</tr>
	<tr>
		<td>Database collation</td>
		<td><?php echo $db->getCollation() ?></td>
	</tr>
	<tr>
		<td>Database connection collation</td>
		<td><?php echo $db->getConnectionCollation() ?></td>
	</tr>
	<?php endif; ?>
	<tr>
		<td>PHP Memory limit</td>
		<td><?php echo function_exists('ini_get') ? htmlentities(ini_get('memory_limit')) : 'N/A' ?></td>
	</tr>
	<tr>
		<td>Peak Memory usage</td>
		<td><?php echo function_exists('memory_get_peak_usage') ? sprintf('%0.2fM', (memory_get_peak_usage() / 1024 / 1024)) : 'N/A' ?></td>
	</tr>
	<tr>
		<td>PHP Timeout (seconds)</td>
		<td><?php echo function_exists('ini_get') ? htmlentities(ini_get('max_execution_time')) : 'N/A' ?></td>
	</tr>
</table>

<h3>Request information</h3>
<h4>$_GET</h4>
<pre><?php echo htmlentities(print_r($_GET, true)) ?></pre>
<h4>$_POST</h4>
<pre><?php echo htmlentities(print_r($_POST, true)) ?></pre>
<h4>$_COOKIE</h4>
<pre><?php echo htmlentities(print_r($_COOKIE, true)) ?></pre>
<h4>$_REQUEST</h4>
<pre><?php echo htmlentities(print_r($_REQUEST, true)) ?></pre>

<h3>Session state</h3>
<pre><?php
	if (version_compare(JVERSION, '4', 'lt'))
	{
		echo htmlentities(print_r($app->getSession()->getData()->toArray(), true));
	}
	else
	{
		echo htmlentities(print_r($app->getSession()->all(), true));
	}
	?></pre>

<?php
if (version_compare(JVERSION, '3.999.999', 'le'))
{
	if (!include_once(JPATH_ADMINISTRATOR . '/components/com_admin/models/sysinfo.php'))
	{
		return;
	}

	$model       = new AdminModelSysInfo();
}
else
{
	try
	{
		/** @var MVCFactoryInterface $factory */
		$factory = $app->bootComponent('com_admin')->getMVCFactory();
		/** @var \Joomla\Component\Admin\Administrator\Model\SysinfoModel $model */
		$model = $factory->createModel('Sysinfo', 'Administrator');
	}
	catch (Exception $e)
	{
		return;
	}
}

$directories = $model->getDirectory();

try
{
	$extensions = $model->getExtensions();
}
catch (Exception $e)
{
	$extension = [];
}

$phpSettings = $model->getPhpSettings();
$hasPHPInfo  = $model->phpinfoEnabled();
?>

<h3>PHP Settings</h3>
<table class="table table-striped">
	<?php foreach ($phpSettings as $k => $v): ?>
		<tr>
			<td><?php echo $k ?></td>
			<td><?php echo htmlentities(print_r($v, true)) ?></td>
		</tr>
	<?php endforeach; ?>
</table>

<?php if ($hasPHPInfo):
	$phpInfo = $model->getPhpInfoArray(); ?>
	<h3>Loaded PHP Extensions</h3>
	<table class="table table-striped">
		<?php foreach ($phpInfo as $section => $data):
			if ($section == 'Core')
			{
				continue;
			} ?>
			<tr>
				<td><?php echo htmlentities($section) ?></td>
				<td>
					<?php if (in_array($section, ['curl', 'openssl', 'ssh2', 'ftp', 'session', 'tokenizer'])): ?>
						<pre><?php echo htmlentities(print_r($data, true)) ?></pre>
					<?php endif; ?>
				</td>
			</tr>
		<?php endforeach; ?>
	</table>
<?php endif; ?>

<h3>Enabled Extensions</h3>
<table class="table table-striped">
	<?php foreach ($extensions as $extension => $info):
		if (strtoupper($info['state']) != 'ENABLED')
		{
			continue;
		} ?>
		<tr>
			<td><?php echo htmlentities($extension) ?></td>
			<td><?php echo htmlentities($info['version']) ?></td>
			<td><?php echo htmlentities($info['type']) ?></td>
			<td><?php echo htmlentities($info['author']) ?></td>
			<td><?php echo htmlentities($info['authorUrl']) ?></td>
		</tr>
	<?php endforeach; ?>
</table>

<h3>Directory Status</h3>
<table class="table table-striped">
	<?php foreach ($directories as $k => $v): ?>
		<tr>
			<td>
				<?php echo htmlentities($k) ?>
				<?php echo !empty($v['message']) ? "[{$v['message']}]" : '' ?>
			</td>
			<td>
				<?php if ($v['writable']): ?>
					<span class="label label-success">Writeable</span>
				<?php else: ?>
					<span class="label label-danger">Unwriteable</span>
				<?php endif; ?>
			</td>
		</tr>
	<?php endforeach; ?>
</table>components/com_akeeba/View/ControlPanel/Html.php000060400000021444152453623440015737 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\View\ControlPanel;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Helper\Status;
use Akeeba\Backup\Admin\Model\ControlPanel;
use Akeeba\Backup\Admin\Model\UsageStatistics;
use Akeeba\Backup\Admin\View\ViewTraits\ProfileIdAndName;
use Akeeba\Backup\Admin\View\ViewTraits\ProfileList;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use FOF40\View\DataView\Html as BaseView;

class Html extends BaseView
{
	use ProfileList, ProfileIdAndName;

	/**
	 * List of profiles to display as Quick Icons in the control panel page
	 *
	 * @var   array  Array of stdClass objects
	 */
	public $quickIconProfiles = [];

	/**
	 * The HTML for the backup status cell
	 *
	 * @var   string
	 */
	public $statusCell = '';

	/**
	 * HTML for the warnings (status details)
	 *
	 * @var   string
	 */
	public $detailsCell = '';

	/**
	 * Details of the latest backup as HTML
	 *
	 * @var   string
	 */
	public $latestBackupCell = '';

	/**
	 * Do I have to ask the user to fix the permissions?
	 *
	 * @var   bool
	 */
	public $areMediaPermissionsFixed = false;

	/**
	 * Do I have to ask the user to provide a Download ID?
	 *
	 * @var   bool
	 */
	public $needsDownloadID = false;

	/**
	 * Did a Core edition user provide a Download ID instead of installing Akeeba Backup Professional?
	 *
	 * @var   bool
	 */
	public $coreWarningForDownloadID = false;

	/**
	 * Our extension ID
	 *
	 * @var   int
	 */
	public $extension_id = 0;

	/**
	 * Should I have the browser ask for desktop notification permissions?
	 *
	 * @var   bool
	 */
	public $desktopNotifications = false;

	/**
	 * If anonymous statistics collection is enabled and we have to collect statistics this will include the HTML for
	 * the IFRAME that performs the anonymous stats collection.
	 *
	 * @var   string
	 */
	public $statsIframe = '';

	/**
	 * If front-end backup is enabled and the secret word has an issue (too insecure) we populate this variable
	 *
	 * @var  string
	 */
	public $frontEndSecretWordIssue = '';

	/**
	 * In case the existing Secret Word is insecure we generate a new one. This variable contains the new Secret Word.
	 *
	 * @var  string
	 */
	public $newSecretWord = '';

	/**
	 * Is the mbstring extension installed and enabled? This is required by Joomla and Akeeba Backup to correctly work
	 *
	 * @var  bool
	 */
	public $checkMbstring = true;

	/**
	 * The fancy formatted changelog of the component
	 *
	 * @var  string
	 */
	public $formattedChangelog = '';

	/**
	 * Should I pormpt the user ot run the configuration wizard?
	 *
	 * @var  bool
	 */
	public $promptForConfigurationWizard = false;

	/**
	 * How many warnings do I have to display?
	 *
	 * @var  int
	 */
	public $countWarnings = 0;

	/**
	 * Do I have stuck updates pending?
	 *
	 * @var  bool
	 */
	public $stuckUpdates = false;

	/**
	 * Cache the user permissions
	 *
	 * @var   array
	 *
	 * @since 5.3.0
	 */
	public $permissions = [];

	/**
	 * Timestamp when the Core user last dismissed the upsell to Pro
	 *
	 * @var   int
	 * @since 7.0.0
	 */
	public $lastUpsellDismiss = 0;

	/**
	 * Is the output directory under the site's root?
	 *
	 * @var   bool
	 * @since 7.0.3
	 */
	public $isOutputDirectoryUnderSiteRoot = false;

	/**
	 * Does the output directory have the expected security files?
	 *
	 * @var   bool
	 * @since 7.0.3
	 */
	public $hasOutputDirectorySecurityFiles = false;

	/**
	 * Executes before displaying the control panel page
	 */
	public function onBeforeMain()
	{
		/** @var ControlPanel $model */
		$model = $this->getModel();

		$statusHelper      = Status::getInstance();
		$this->statsIframe = '';

		try
		{
			/** @var UsageStatistics $usageStatsModel */
			$usageStatsModel = $this->container->factory->model('UsageStatistics')->tmpInstance();

			if (
				is_object($usageStatsModel)
				&& class_exists('Akeeba\\Backup\\Admin\\Model\\UsageStatistics')
				&& ($usageStatsModel instanceof UsageStatistics)
				&& method_exists($usageStatsModel, 'collectStatistics')
			)
			{
				$this->statsIframe = $usageStatsModel->collectStatistics(true);
			}
		}
		catch (\Exception $e)
		{
			// Don't give a crap if usage stats ain't loaded
		}

		$this->getProfileList();
		$this->getProfileIdAndName();

		$this->quickIconProfiles               = $model->getQuickIconProfiles();
		$this->statusCell                      = $statusHelper->getStatusCell();
		$this->detailsCell                     = $statusHelper->getQuirksCell();
		$this->latestBackupCell                = $statusHelper->getLatestBackupDetails();
		$this->areMediaPermissionsFixed        = $model->fixMediaPermissions();
		$this->checkMbstring                   = $model->checkMbstring();
		$this->needsDownloadID                 = $model->needsDownloadID() ? 1 : 0;
		$this->coreWarningForDownloadID        = $model->mustWarnAboutDownloadIDInCore();
		$this->extension_id                    = $model->getState('extension_id', 0, 'int');
		$this->frontEndSecretWordIssue         = $model->getFrontendSecretWordError();
		$this->newSecretWord                   = $this->container->platform->getSessionVar('newSecretWord', null, 'akeeba.cpanel');
		$this->desktopNotifications            = $this->container->params->get('desktop_notifications', '0') ? 1 : 0;
		$this->formattedChangelog              = $this->formatChangelog();
		$this->promptForConfigurationWizard    = Factory::getConfiguration()->get('akeeba.flag.confwiz', 0) == 0;
		$this->countWarnings                   = count(Factory::getConfigurationChecks()->getDetailedStatus());
		$this->stuckUpdates                    = ($this->container->params->get('updatedb', 0) == 1);
		$user                                  = $this->container->platform->getUser();
		$this->permissions                     = [
			'configure' => $user->authorise('akeeba.configure', 'com_akeeba'),
			'backup'    => $user->authorise('akeeba.backup', 'com_akeeba'),
			'download'  => $user->authorise('akeeba.download', 'com_akeeba'),
		];
		$this->isOutputDirectoryUnderSiteRoot  = $model->isOutputDirectoryUnderSiteRoot();
		$this->hasOutputDirectorySecurityFiles = $model->hasOutputDirectorySecurityFiles();

		$this->lastUpsellDismiss = $this->container->params->get('lastUpsellDismiss', 0);

		// Load the version constants
		Platform::getInstance()->load_version_defines();

		// Add the Javascript to the document
		$this->container->template->addJS('media://com_akeeba/js/ControlPanel.min.js', true, false, $this->container->mediaVersion);
		$this->addJSScriptOptions();
	}

	/**
	 * Adds inline Javascript to the document
	 */
	protected function addJSScriptOptions()
	{
		$platform = $this->container->platform;
		$platform->addScriptOptions('akeeba.System.notification.hasDesktopNotification', (bool)$this->desktopNotifications);
		$platform->addScriptOptions('akeeba.ControlPanel.needsDownloadID', (bool) $this->needsDownloadID);
		$platform->addScriptOptions('akeeba.ControlPanel.outputDirUnderSiteRoot', (bool) $this->isOutputDirectoryUnderSiteRoot);
		$platform->addScriptOptions('akeeba.ControlPanel.hasSecurityFiles', (bool) $this->hasOutputDirectorySecurityFiles);
	}

	protected function formatChangelog($onlyLast = false)
	{
		$ret   = '';
		$file  = $this->container->backEndPath . '/CHANGELOG.php';
		$lines = @file($file);

		if (empty($lines))
		{
			return $ret;
		}

		array_shift($lines);

		foreach ($lines as $line)
		{
			$line = trim($line);

			if (empty($line))
			{
				continue;
			}

			$type = substr($line, 0, 1);

			switch ($type)
			{
				case '=':
					continue 2;
					break;

				case '+':
					$ret .= "\t" . '<li><span class="akeeba-label--green">Added</span> ' . htmlentities(trim(substr($line, 2))) . "</li>\n";
					break;

				case '-':
					$ret .= "\t" . '<li><span class="akeeba-label--grey">Removed</span> ' . htmlentities(trim(substr($line, 2))) . "</li>\n";
					break;

				case '~':
				case '^':
					$ret .= "\t" . '<li><span class="akeeba-label--grey">Changed</span> ' . htmlentities(trim(substr($line, 2))) . "</li>\n";
					break;

				case '*':
					$ret .= "\t" . '<li><span class="akeeba-label--red">Security</span> ' . htmlentities(trim(substr($line, 2))) . "</li>\n";
					break;

				case '!':
					$ret .= "\t" . '<li><span class="akeeba-label--orange">Important</span> ' . htmlentities(trim(substr($line, 2))) . "</li>\n";
					break;

				case '#':
					$ret .= "\t" . '<li><span class="akeeba-label--teal">Fixed</span> ' . htmlentities(trim(substr($line, 2))) . "</li>\n";
					break;

				default:
					if (!empty($ret))
					{
						$ret .= "</ul>";
						if ($onlyLast)
						{
							return $ret;
						}
					}

					if (!$onlyLast)
					{
						$ret .= "<h4>$line</h4>\n";
					}
					$ret .= "<ul class=\"akeeba-changelog\">\n";

					break;
			}
		}

		return $ret;
	}
}
components/com_akeeba/View/Browser/Html.php000060400000004525152453623440014763 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\View\Browser;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Model\Browser;
use FOF40\View\DataView\Html as BaseView;

class Html extends BaseView
{
	/**
	 * Path to current folder (with variables such as [SITEROOT] replaced)
	 *
	 * @var  string
	 */
	public $folder = '';

	/**
	 * Path to current folder (WITHOUT variables such as [SITEROOT] replaced)
	 *
	 * @var  string
	 */
	public $folder_raw = '';

	/**
	 * Parent folder
	 *
	 * @var  string
	 */
	public $parent = '';

	/**
	 * Does the current folder exist in the filesystem?
	 *
	 * @var  bool
	 */
	public $exists = false;

	/**
	 * Is the current folder under the site's root directory? False means it's an off-site directory.
	 *
	 * @var  bool
	 */
	public $inRoot = false;

	/**
	 * Is the current folder restricted by open_basedir?
	 *
	 * @var  bool
	 */
	public $openbasedirRestricted = false;

	/**
	 * Is the current folder writable?
	 *
	 * @var  bool
	 */
	public $writable = false;

	/**
	 * Subdirectories
	 *
	 * @var  array
	 */
	public $subfolders = [];

	/**
	 * Breadcrumbs to display in the browser view
	 *
	 * @var  array
	 */
	public $breadcrumbs = [];

	protected function onBeforeMain()
	{
		// Load the view-specific Javascript
		$this->container->template->addJS('media://com_akeeba/js/Browser.min.js', true, false, $this->container->mediaVersion);

		/** @var Browser $model */
		$model = $this->getModel();

		// Pass the data from the model to the view template
		$this->folder                = $model->getState('folder', '', 'string');
		$this->folder_raw            = $model->getState('folder_raw', '', 'string');
		$this->parent                = $model->getState('parent', '', 'string');
		$this->exists                = $model->getState('exists', 0, 'boolean');
		$this->inRoot                = $model->getState('inRoot', 0, 'boolean');
		$this->openbasedirRestricted = $model->getState('openbasedirRestricted', 0, 'boolean');
		$this->writable              = $model->getState('writable', 0, 'boolean');
		$this->subfolders            = $model->getState('subfolders');
		$this->breadcrumbs           = $model->getState('breadcrumbs');
	}
}
components/com_akeeba/View/fof.php000060400000005035152453623440013203 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2021 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') or die();

$tooLongAgo = (int) gmdate('Y') - 2015;
?>

<div style="margin: 1em">
	<h1>Akeeba Framework-on-Framework (FOF) version 3 could not be found on this site</h1>
	<hr/>
	<div class="alert alert-warning">
		<h2>
			This component requires the Akeeba FOF framework package to be installed on your site. Please go to <a
					href="https://www.akeeba.com/download/fof3.html">our download page</a> to download it, then install it on your site.
		</h2>
	</div>
	<hr/>
	<h4>Further information</h4>
	<p>
		FOF is a Joomla component framework. It's the low level code which sits between our Joomla! extensions and
		Joomla! itself. It is automatically installed when you install our extensions on your site.
	</p>
	<p>
		FOF can be missing from your site either because Joomla failed to install it or because you, another Super User,
		or another extension mistakenly uninstalled it.
	</p>
	<p>
		If it's missing, our components cannot talk to Joomla &mdash; or vice versa. Because of that they can not run.
		That's why you see this message.
	</p>
	<p>
		You do not have to worry about adding bloat to your site. FOF is very small. It will also be automatically
		uninstalled when you uninstall all components which depend on it.
	</p>
	<p>
		FOF is installed in the <code><?php echo JPATH_LIBRARIES . DIRECTORY_SEPARATOR?>/fof30</code> folder on your
		server. It appears in Joomla's Extensions, Manage page as <code>FOF30</code>. Please do not remove it from your
		site.
	</p>
<?php if (version_compare(JVERSION, '3.9999.9999', 'le')): ?>
	<h4>Why do I have multiple FOF entries in Joomla?</h4>
	<p>
		Joomla <?php echo JVERSION ?> includes an <em>old, obsolete</em> version of FOF - version 2.x. It is installed
		in the <code><?php echo JPATH_LIBRARIES . DIRECTORY_SEPARATOR ?>fof</code> folder on your server. It appears in
		Joomla's Extensions, Manage page as <code>FOF</code>. Please do not remove it from your site; Joomla needs it
		to function properly.
	</p>
	<p>
		We discontinued FOF 2.x in 2015 &mdash; that's <?php echo $tooLongAgo ?> years ago. Ever since, we replaced it
		with FOF 3.x. The two versions are incompatible with each other but both are required; FOF 2.x for Joomla!
		itself and FOF 3.x for our extensions. That's why you see both. You must not remove either of them or something
		will break!
	</p>
<?php endif; ?>
</div>
components/com_akeeba/View/wrongphp.php000060400000026357152453623440014307 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2021 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

(defined('_JEXEC') || defined('WPINC') || defined('APATH_BASE') || defined('AKEEBA_COMMON_WRONGPHP') || defined('KICKSTART')) or die;

if (!function_exists('akeeba_common_wrongphp'))
{
	/**
	 * This function checks if you are using an obsolete PHP version. It returns and boolean status and optionally
	 * prints an error page if your PHP version is, indeed, too old.
	 *
	 * * minPHPVersion: minimum PHP version supported by this software, e.g. "7.2.0"
	 * * recommendedPHPVersion: recommended PHP version to use with this software, e.g. "7.3"
	 * * softwareName: human-readable software name, e.g. "Akeeba Example"
	 * * silentResutls: suppress error messages on old PHP version, just return false (default: TRUE)
	 * * longVersion: current PHP version, long format, e.g. "7.3.1-12ubuntu3.2". Skip to automatically determine.
	 * * shortVersion: current PHP version, short format, e.g. "7.3". Skip to automatically determine.
	 * * currentTimestamp: current UNIX timestamp. Skip to automatically determine.
	 *
	 * You need to provide at the very least the minPHPVersion, recommendedPHPVersion and softwareName.
	 *
	 * @param  array  $config
	 *
	 * @return bool  FALSE if your PHP version is too old. TRUE if your PHP version is still supported.
	 * @throws Exception
	 */
	function akeeba_common_wrongphp($config = array())
	{
		/**
		 * Format: version => [maintenance_date, eol_date]
		 *
		 * For versions older than 5.6 we use a fake maintenance_date because this information no longer exists on PHP's
		 * site and it's irrelevant anyway; these PHP versions are already EOL therefore we only use their EOL date.
		 */
		$phpDates = array(
			'3.0' => array('1990-01-01 00:00:00', '2000-10-20 00:00:00'),
			'4.0' => array('1990-01-01 00:00:00', '2001-06-23 00:00:00'),
			'4.1' => array('1990-01-01 00:00:00', '2002-03-12 00:00:00'),
			'4.2' => array('1990-01-01 00:00:00', '2002-09-06 00:00:00'),
			'4.3' => array('1990-01-01 00:00:00', '2005-03-31 00:00:00'),
			'4.4' => array('1990-01-01 00:00:00', '2008-08-07 00:00:00'),
			'5.0' => array('1990-01-01 00:00:00', '2005-09-05 00:00:00'),
			'5.1' => array('1990-01-01 00:00:00', '2006-08-24 00:00:00'),
			'5.2' => array('1990-01-01 00:00:00', '2011-01-11 00:00:00'),
			'5.3' => array('1990-01-01 00:00:00', '2014-08-14 00:00:00'),
			'5.4' => array('1990-01-01 00:00:00', '2015-09-03 00:00:00'),
			'5.5' => array('1990-01-01 00:00:00', '2016-07-10 00:00:00'),
			'5.6' => array('2017-01-10 00:00:00', '2018-12-31 00:00:00'),
			'7.0' => array('2018-01-01 00:00:00', '2019-01-10 00:00:00'),
			'7.1' => array('2018-12-01 00:00:00', '2019-12-01 00:00:00'),
			'7.2' => array('2019-11-30 00:00:00', '2020-11-30 00:00:00'),
			'7.3' => array('2020-12-06 00:00:00', '2021-12-06 00:00:00'),
			'7.4' => array('2021-11-28 00:00:00', '2022-11-28 00:00:00'),
			'8.0' => array('2022-11-26 00:00:00', '2023-11-26 00:00:00'),
		);

		// Make sure I have all necessary configuration variables
		$config = array_merge(array(
			'minPHPVersion'         => '7.2.0',
			'recommendedPHPVersion' => '7.3',
			'softwareName'          => 'This software',
			'silentResults'         => false,
			'longVersion'           => PHP_VERSION,
			'shortVersion'          => sprintf('%d.%d', PHP_MAJOR_VERSION, PHP_MINOR_VERSION),
			'currentTimestamp'      => time(),
		), $config);

		// Selectively extract configuration variables. Do not use extract(), it's potentially dangerous.
		$minPHPVersion         = $config['minPHPVersion'];
		$recommendedPHPVersion = $config['recommendedPHPVersion'];
		$softwareName          = $config['softwareName'];
		$silentResults         = $config['silentResults'];
		$longVersion           = $config['longVersion'];
		$shortVersion          = $config['shortVersion'];
		$currentTimestamp      = $config['currentTimestamp'];

		if (!version_compare($longVersion, $minPHPVersion, 'lt'))
		{
			unset($minPHPVersion, $recommendedPHPVersion, $softwareName, $longVersion, $shortVersion, $phpDates,
				$silentResults, $currentTimestamp);

			return true;
		}

// Typically used in the frontend to not divulge any information about the server
		if ($silentResults)
		{
			return false;
		}

		/**
		 * Safe defaults for PHP versions older than 5.3.0.
		 *
		 * Older PHP versions don't even have support for DateTime so we need these defaults to prevent this warning script from
		 * bringing the site down with an error.
		 */
		$isEol      = true;
		$isAncient  = true;
		$isSecurity = false;
		$isCurrent  = false;

		$eolDateFormatted      = $phpDates[$shortVersion][1];
		$securityDateFormatted = $phpDates[$shortVersion][0];


		/**
		 * This can only work on PHP 5.2.0 or later
		 */
		if (version_compare($longVersion, '5.2.0', 'ge'))
		{
			$tzGmt        = new DateTimeZone('GMT');
			$securityDate = new DateTime($phpDates[$shortVersion][0], $tzGmt);
			$eolDate      = new DateTime($phpDates[$shortVersion][1], $tzGmt);

			/**
			 * Ancient:  This PHP version has reached end-of-life more than 2 years ago
			 * EOL:      This PHP version has reached end-of-life
			 * Security: This PHP version has reached the Security Support date but not the EOL date yet
			 * Current:  This PHP version is still in Active Support
			 */
			$isEol      = $eolDate->getTimestamp() <= $currentTimestamp;
			$isAncient  = $isEol && (($currentTimestamp - $eolDate->getTimestamp()) >= 63072000);
			$isSecurity = !$isEol && ($securityDate->getTimestamp() <= $currentTimestamp);
			$isCurrent  = !$isEol && !$isSecurity;

			$eolDateFormatted      = $eolDate->format('l, d F Y');
			$securityDateFormatted = $securityDate->format('l, d F Y');
		}

		$characterization = $isCurrent ? 'unsupported' : 'older';
		$characterization = $isEol ? 'obsolete' : $characterization;
		$characterization = $isAncient ? 'dangerously obsolete' : $characterization;

		?>

		<div style="margin: 1em">
			<p style="font-size: 180%; margin: 2em 1em; padding: 2em 1em; text-align: center; border: thin solid #f0ad4e; background-color: gold; font-weight: bold; border-radius: 0.25em">
				<?php echo $softwareName ?> requires PHP <?php echo $minPHPVersion ?> or later.
			</p>
			<h2><?php echo ucfirst($characterization) ?> PHP version <?php echo $longVersion ?> detected</h2>
			<hr />
			<p>
				We recommend that you upgrade your site to PHP <?php echo $recommendedPHPVersion ?> or later. If you are
				unsure how to do this, please ask your host.
			</p>
			<p>
				<a href="https://www.akeeba.com/how-do-version-numbers-work.html">Version numbers don't make
					sense?</a>
			</p>

			<hr />

			<?php if ($isAncient): ?>
				<h3>Urgent security advice</h3>

				<p>
					Your version of PHP, <?php echo $longVersion ?>, <a href="http://php.net/eol.php">has reached the end
						of its life</a> a <strong>very</strong> long time ago, namely on
					<?php echo $eolDateFormatted ?>. It has known security vulnerabilities which are used to
					compromise (“hack”) web servers. It is no longer safe using it in production. You are <strong>VERY
						STRONGLY</strong> advised to upgrade your server to a <a
							href="https://www.php.net/supported-versions.php">supported PHP version</a> as soon as possible.
				</p>
			<?php elseif ($isEol): ?>
				<h3>Security advice</h3>

				<p>
					Your version of PHP, <?php echo $longVersion ?>, <a href="http://php.net/eol.php">has reached the end
						of its life</a> on <?php echo $eolDateFormatted ?>. End-of-life PHP versions may have
					as-yet-undiscovered security vulnerabilities which can be used to compromise (“hack”) your site. It is
					no
					longer safe using it in production, even if your host or your Linux distribution claim otherwise – the
					PHP
					developers themselves have said time over time that not all security vulnerabilities fixes can be
					backported
					to End-of-Life versions of PHP since they may require architectural changes in PHP itself. You are
					<strong>strongly</strong> advised to upgrade your server to a <a
							href="https://www.php.net/supported-versions.php">supported PHP version</a> as soon as possible.
				</p>

			<?php elseif ($isSecurity): ?>
				<h3>Security reminder</h3>

				<p>
					Your version of PHP, <?php echo $longVersion ?>, has entered the “Security Support” phase of its life on
					<?php echo $securityDateFormatted ?>. As such, only security issues will be addressed but not
					any of its known functional issues (“bugs”). Unfixed functional issues in PHP can lead to your site not
					working
					properly. It is advisable to plan migrating your site to a
					<a href="https://www.php.net/supported-versions.php">supported PHP version</a> no later than
					<?php echo $eolDateFormatted ?> – that's when PHP
					<?php echo $shortVersion ?> will become End-of-Life, therefore
					completely
					unsuitable for use on a live server.
				</p>
			<?php endif; ?>

			<?php if ($isSecurity || $isCurrent): ?>
				<h3>Why is my PHP version not supported?</h3>

				<p>
					Even though PHP <?php echo $shortVersion ?> will be supported by the PHP
					project until <?php echo $eolDateFormatted ?> we are unfortunately unable to provide
					support for it in our software. This has to do either with missing features or third party libraries.
					Older
					PHP versions are missing features we require for our software to work efficiently and be written in a
					way
					that makes it possible for us to provide a plethora of relevant features while maintaining good quality
					control. Moreover, third party libraries we use to provide some of the software's features do not
					support
					older PHP versions for the same reason – so even if we don't absolutely need to use at least PHP
					<?php echo $minPHPVersion ?> the third party libraries do, making it impossible for our software to run on
					your
					older version <?php echo $shortVersion ?>. We apologize for the inconvenience.
				</p>
				<p>
					We'd like to remind you, however, that newer PHP versions are always faster and more well-tested than
					their
					predecessors. Upgrading your site to a newer PHP version will not only let our software run but will
					also
					make your site faster, more stable and help it perform better in search engine results.
				</p>
			<?php endif; ?>
		</div>

		<?php return false;
	}
}

/**
 * Immediately executes the akeeba_common_wrongphp() function on all of our software except Kickstart.
 */
if (!defined('KICKSTART'))
{
	try
	{
		return akeeba_common_wrongphp(array(
			// Configuration -- Override before calling this script
			'minPHPVersion'         => isset($minPHPVersion) ? $minPHPVersion : '7.2.0',
			'recommendedPHPVersion' => isset($recommendedPHPVersion) ? $recommendedPHPVersion : '7.3',
			'softwareName'          => isset($softwareName) ? $softwareName : 'This software',
			'silentResults'         => isset($silentResults) ? $silentResults : false,
			// Override these to test the script
			'longVersion'           => isset($longVersion) ? $longVersion : PHP_VERSION,
			'shortVersion'          => isset($shortVersion) ? $shortVersion : sprintf('%d.%d', PHP_MAJOR_VERSION, PHP_MINOR_VERSION),
			'currentTimestamp'      => isset($currentTimestamp) ? $currentTimestamp : time(),
		));
	}
	catch (Exception $e)
	{
		// This should never happen
		return false;
	}
}components/com_akeeba/View/DatabaseFilters/Html.php000060400000007364152453623440016401 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\View\DatabaseFilters;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Model\DatabaseFilters;
use Akeeba\Backup\Admin\View\ViewTraits\ProfileIdAndName;
use FOF40\View\DataView\Html as BaseView;
use Joomla\CMS\HTML\HTMLHelper as JHtml;
use Joomla\CMS\Language\Text as JText;
use Joomla\CMS\Uri\Uri as JUri;

/**
 * View for database table exclusion
 */
class Html extends BaseView
{
	use ProfileIdAndName;

	/**
	 * SELECT element for choosing a database root
	 *
	 * @var  string
	 */
	public $root_select = '';

	/**
	 * List of database roots
	 *
	 * @var  array
	 */
	public $roots = [];

	/**
	 * Main page
	 */
	public function onBeforeMain()
	{
		// Load Javascript files
		$this->container->template->addJS('media://com_akeeba/js/FileFilters.min.js', true, false, $this->container->mediaVersion);
		$this->container->template->addJS('media://com_akeeba/js/DatabaseFilters.min.js', true, false, $this->container->mediaVersion);

		/** @var DatabaseFilters $model */
		$model = $this->getModel();

		// Add custom submenus
		$task    = $model->getState('browse_task', 'normal', 'cmd');
		$toolbar = $this->container->toolbar;

		$toolbar->appendLink(
			JText::_('COM_AKEEBA_FILEFILTERS_LABEL_NORMALVIEW'),
			JUri::base() . 'index.php?option=com_akeeba&view=DatabaseFilters&task=normal',
			($task == 'normal')
		);
		$toolbar->appendLink(
			JText::_('COM_AKEEBA_FILEFILTERS_LABEL_TABULARVIEW'),
			JUri::base() . 'index.php?option=com_akeeba&view=DatabaseFilters&task=tabular',
			($task == 'tabular')
		);

		// Get a JSON representation of the available roots
		$root_info = $model->get_roots();
		$roots     = [];
		$options   = [];

		if (!empty($root_info))
		{
			// Loop all dir definitions
			foreach ($root_info as $def)
			{
				$roots[]   = $def->value;
				$options[] = JHtml::_('select.option', $def->value, $def->text);
			}
		}

		$siteRoot          = '[SITEDB]';
		$selectOptions     = [
			'list.select' => $siteRoot,
			'id'          => 'active_root',
		];
		$this->root_select = JHtml::_('select.genericlist', $options, 'root', $selectOptions);
		$this->roots       = $roots;
		$platform          = $this->container->platform;

		// Add script options
		$platform->addScriptOptions('akeeba.System.params.AjaxURL', 'index.php?option=com_akeeba&view=DatabaseFilters&task=ajax');

		switch ($task)
		{
			case 'normal':
			default:
				$this->setLayout('default');

				// Get the database entities GUI data
				$platform->addScriptOptions('akeeba.DatabaseFilters.guiData', $model->make_listing($siteRoot));
				$platform->addScriptOptions('akeeba.DatabaseFilters.viewType', 'list');

				break;

			case 'tabular':
				$this->setLayout('tabular');

				// Get the filter data for tabular display
				$platform->addScriptOptions('akeeba.DatabaseFilters.guiData', $model->get_filters($siteRoot));
				$platform->addScriptOptions('akeeba.DatabaseFilters.viewType', 'tabular');


				break;
		}

		// Translations
		JText::script('COM_AKEEBA_FILEFILTERS_LABEL_UIROOT');
		JText::script('COM_AKEEBA_FILEFILTERS_LABEL_UIERRORFILTER');
		JText::script('COM_AKEEBA_DBFILTER_TYPE_TABLES');
		JText::script('COM_AKEEBA_DBFILTER_TYPE_TABLEDATA');
		JText::script('COM_AKEEBA_DBFILTER_TABLE_MISC');
		JText::script('COM_AKEEBA_DBFILTER_TABLE_TABLE');
		JText::script('COM_AKEEBA_DBFILTER_TABLE_VIEW');
		JText::script('COM_AKEEBA_DBFILTER_TABLE_PROCEDURE');
		JText::script('COM_AKEEBA_DBFILTER_TABLE_FUNCTION');
		JText::script('COM_AKEEBA_DBFILTER_TABLE_TRIGGER');
		JText::script('COM_AKEEBA_DBFILTER_TABLE_META_ROWCOUNT');

		$this->getProfileIdAndName();
	}
}
components/com_akeeba/View/hhvm.php000060400000002441152453623440013371 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2021 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') or die();

?>

<div style="margin: 1em">
	<h1>We have detected that you are running HHVM instead of PHP. This software WILL NOT WORK properly on HHVM. Please switch to PHP 7 instead.</h1>
	<hr/>
	<p>
        HHVM was Facebook's attempt at modernizing the PHP 5.x language and making it faster. Unfortunately it's also incompatible with PHP proper.
        PHP 7 has solved all these issues. It's fast, modern and <em>fully compatible with our software</em>.
        Please switch to PHP 7. If you are unsure how to do that, contact your host or the person responsible for maintaining your server.
        They are the only people who can help you configure your server.
	</p>
	<p>
        Kindly note that HHVM is not -and has never been- a supported execution environment for our software.
        As a result, if you see this message on your site you are unfortunately ineligible for support and / or filing bug reports.
        Please switch to PHP 7. If your problem persists after that we can help you / accept your bug report. Thank you for your understanding.
	</p>
</div>
components/com_akeeba/View/ViewTraits/ProfileList.php000060400000002500152453623440016760 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\View\ViewTraits;

// Protect from unauthorized access
use Joomla\CMS\HTML\HTMLHelper;

defined('_JEXEC') || die();

trait ProfileList
{
	/**
	 * List of backup profiles, for use with JHtmlSelect
	 *
	 * @var   array
	 */
	public $profileList = [];

	/**
	 * Populates the profileList property with an options list for use by JHtmlSelect
	 *
	 * @param   bool  $includeId  Should I include the profile ID in front of the name?
	 *
	 * @return  void
	 */
	protected function getProfileList($includeId = true)
	{
		/** @var \JDatabaseDriver $db */
		$db = $this->container->db;

		$query = $db->getQuery(true)
			->select([
				$db->qn('id'),
				$db->qn('description'),
			])->from($db->qn('#__ak_profiles'))
			->order($db->qn('id') . " ASC");

		$db->setQuery($query);
		$rawList = $db->loadAssocList();

		$this->profileList = [];

		if (!is_array($rawList))
		{
			return;
		}

		foreach ($rawList as $row)
		{
			$description = $row['description'];

			if ($includeId)
			{
				$description = '#' . $row['id'] . '. ' . $description;
			}

			$this->profileList[] = HTMLHelper::_('select.option', $row['id'], $description);
		}
	}
}
components/com_akeeba/View/ViewTraits/ProfileIdAndName.php000060400000002567152453623440017642 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\View\ViewTraits;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Model\Profiles;
use Akeeba\Engine\Platform;

trait ProfileIdAndName
{
	/**
	 * Active profile ID
	 *
	 * @var  int
	 */
	public $profileId = 0;

	/**
	 * Active profile's description
	 *
	 * @var  string
	 */
	public $profileName = '';

	/**
	 * Is this profile available as an One Click Backup icon? 0/1
	 *
	 * @var  int
	 */
	public $quickIcon = 0;

	/**
	 * Find the currently active profile ID and name and put them in properties accessible by the view template
	 */
	protected function getProfileIdAndName()
	{
		/** @var Profiles $profilesModel */
		$profilesModel = $this->container->factory->model('Profiles')->tmpInstance();
		$profileId     = Platform::getInstance()->get_active_profile();

		try
		{
			$this->profileName = $profilesModel->findOrFail($profileId)->description;
			$this->profileId   = $profileId;
			$this->quickIcon   = $profilesModel->quickicon;
		}
		catch (\Exception $e)
		{
			$this->container->platform->setSessionVar('profile', 1, 'akeeba');

			$this->profileId   = 1;
			$this->profileName = $profilesModel->findOrFail(1)->description;
		}
	}
}
components/com_akeeba/View/ConfigurationWizard/Html.php000060400000003250152453623440017322 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\View\ConfigurationWizard;

// Protect from unauthorized access
defined('_JEXEC') || die();

use FOF40\View\DataView\Html as BaseView;
use Joomla\CMS\Language\Text;

class Html extends BaseView
{
	protected function onBeforeMain()
	{
		// Push translations
		// -- Wizard
		Text::script('COM_AKEEBA_CONFWIZ_UI_MINEXECTRY');
		Text::script('COM_AKEEBA_CONFWIZ_UI_CANTSAVEMINEXEC');
		Text::script('COM_AKEEBA_CONFWIZ_UI_SAVEMINEXEC');
		Text::script('COM_AKEEBA_CONFWIZ_UI_CANTDETERMINEMINEXEC');
		Text::script('COM_AKEEBA_CONFWIZ_UI_CANTFIXDIRECTORIES');
		Text::script('COM_AKEEBA_CONFWIZ_UI_CANTDBOPT');
		Text::script('COM_AKEEBA_CONFWIZ_UI_EXECTOOLOW');
		Text::script('COM_AKEEBA_CONFWIZ_UI_SAVINGMAXEXEC');
		Text::script('COM_AKEEBA_CONFWIZ_UI_CANTSAVEMAXEXEC');
		Text::script('COM_AKEEBA_CONFWIZ_UI_CANTDETERMINEPARTSIZE');
		Text::script('COM_AKEEBA_CONFWIZ_UI_PARTSIZE');

		// -- Backup
		Text::script('COM_AKEEBA_BACKUP_TEXT_LASTRESPONSE', true);

		// Load the Configuration Wizard Javascript file
		$this->container->template->addJS('media://com_akeeba/js/Backup.min.js', true, false, $this->container->mediaVersion);
		$this->container->template->addJS('media://com_akeeba/js/ConfigurationWizard.min.js', true, false, $this->container->mediaVersion);

		$platform = $this->container->platform;
		$platform->addScriptOptions('akeeba.System.params.AjaxURL', 'index.php?option=com_akeeba&view=ConfigurationWizard&task=ajax');

		// Set the layour
		$this->setLayout('wizard');
	}
}
components/com_akeeba/View/Log/Html.php000060400000005043152453623440014055 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\View\Log;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Model\Log;
use Akeeba\Backup\Admin\View\ViewTraits\ProfileIdAndName;
use Akeeba\Engine\Factory;
use FOF40\View\DataView\Html as BaseView;
use Joomla\CMS\HTML\HTMLHelper;

/**
 * View controller for the Log Viewer page
 */
class Html extends BaseView
{
	use ProfileIdAndName;

	/**
	 * Big log file threshold: 2Mb
	 */
	public const bigLogSize = 2097152;
	/**
	 * JHtml list of available log files
	 *
	 * @var  array
	 */
	public $logs = [];
	/**
	 * Currently selected log file tag
	 *
	 * @var  string
	 */
	public $tag;
	/**
	 * Is the select log too big for being
	 *
	 * @var bool
	 */
	public $logTooBig = false;
	/**
	 * Size of the log file
	 *
	 * @var int
	 */
	public $logSize = 0;

	/**
	 * The main page of the log viewer. It allows you to select a profile to display. When you do it displays the IFRAME
	 * with the actual log content and the button to download the raw log file.
	 *
	 * @return  void
	 */
	public function onBeforeMain()
	{
		// Load the view-specific Javascript
		$this->container->template->addJS('media://com_akeeba/js/Log.min.js', true, false, $this->container->mediaVersion);

		if (version_compare(JVERSION, '3.999.999', 'lt'))
		{
			HTMLHelper::_('formbehavior.chosen');
		}

		// Get a list of log names
		/** @var Log $model */
		$model      = $this->getModel();
		$this->logs = $model->getLogList();

		$tag = $model->getState('tag', '', 'string');

		if (empty($tag))
		{
			$tag = null;
		}

		$this->tag = $tag;

		// Let's check if the file is too big to display
		if ($this->tag)
		{
			$logFile = Factory::getLog()->getLogFilename($this->tag);

			if (!@is_file($logFile) && @file_exists(substr($logFile, 0, -4)))
			{
				/**
				 * Transitional period: the log file akeeba.tag.log.php may not exist but the akeeba.tag.log does. This
				 * addresses this transition.
				 */
				$logFile = substr($logFile, 0, -4);
			}

			if (@file_exists($logFile))
			{
				$this->logSize   = filesize($logFile);
				$this->logTooBig = ($this->logSize >= self::bigLogSize);
			}
		}

		if ($this->logTooBig)
		{
			$src = 'index.php?option=com_akeeba&view=Log&task=inlineRaw&&tag=' . urlencode($this->tag) . '&tmpl=component';
			$this->container->platform->addScriptOptions('akeeba.Log.iFrameSrc', $src);
		}

		$this->getProfileIdAndName();
	}
}
components/com_akeeba/View/Log/Raw.php000060400000001564152453623440013706 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\View\Log;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Model\Log;
use Akeeba\Engine\Platform;
use FOF40\View\DataView\Html as BaseView;

/**
 * View controller for the Log Viewer page
 */
class Raw extends BaseView
{
	/**
	 * Currently selected log file tag
	 *
	 * @var  string
	 */
	public $tag;

	/**
	 * Renders the actual log content, for use in the IFRAME
	 *
	 * @return  void
	 */
	public function onBeforeIframe()
	{
		/** @var Log $model */
		$model = $this->getModel();
		$tag   = $model->getState('tag', '', 'string');

		if (empty($tag))
		{
			$tag = null;
		}

		$this->tag = $tag;

		$this->setLayout('raw');
	}
}
components/com_akeeba/View/Manage/Html.php000060400000035147152453623440014534 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\View\Manage;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Model\Profiles;
use Akeeba\Backup\Admin\Model\Statistics;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use DateTimeZone;
use Exception;
use FOF40\Date\Date;
use FOF40\View\DataView\Html as BaseView;
use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\HTML\HTMLHelper as JHtml;
use Joomla\CMS\Language\Text as JText;
use Joomla\CMS\Pagination\Pagination;
use Joomla\CMS\Uri\Uri as JUri;
use stdClass;

/**
 * View controller for the Backup Now page
 */
class Html extends BaseView
{
	/**
	 * Should I use the user's local time zone for display?
	 *
	 * @var  boolean
	 */
	public $useLocalTime;

	/**
	 * Time format string to use for the time zone suffix
	 *
	 * @var  string
	 */
	public $timeZoneFormat;

	/**
	 * The backup record for the showcomment view
	 *
	 * @var  array
	 */
	public $record = [];

	/**
	 * The backup record ID for the showcomment view
	 *
	 * @var  int
	 */
	public $record_id = 0;

	/**
	 * List of Profiles objects
	 *
	 * @var  array
	 */
	public $profiles = [];

	/**
	 * List of profiles for JHtmlSelect
	 *
	 * @var  array
	 */
	public $profilesList = [];

	/**
	 * List of frozen options for JHtmlSelect
	 *
	 * @var  array
	 */
	public $frozenList = [];

	/**
	 * Order direction, ASC/DESC
	 *
	 * @var  string
	 */
	public $order_Dir = 'DESC';

	/**
	 * Description filter
	 *
	 * @var string
	 */
	public $fltDescription = '';

	/**
	 * From date filter
	 *
	 * @var  string
	 */
	public $fltFrom = '';

	/**
	 * To date filter
	 *
	 * @var  string
	 */
	public $fltTo = '';

	/**
	 * Origin filter
	 *
	 * @var  string
	 */
	public $fltOrigin = '';

	/**
	 * Profile filter
	 *
	 * @var  string
	 */
	public $fltProfile = '';

	/**
	 * Frozen records filter
	 *
	 * @var string
	 */
	public $fltFrozen = '';

	/**
	 * List of records to display
	 *
	 * @var  array
	 */
	public $items = [];

	/**
	 * Pagination object
	 *
	 * @var Pagination
	 */
	public $pagination = null;

	/**
	 * Date format for the backup start time
	 *
	 * @var  string
	 */
	public $dateFormat = '';

	/**
	 * Should I pormpt the user ot run the configuration wizard?
	 *
	 * @var  bool
	 */
	public $promptForBackupRestoration = false;

	/**
	 * Sorting order options
	 *
	 * @var  array
	 */
	public $sortFields = [];

	/**
	 * Cache the user permissions
	 *
	 * @var   array
	 *
	 * @since 5.3.0
	 */
	public $permissions = [];

	/**
	 * List the backup records
	 *
	 * @return  void
	 *
	 * @throws  Exception
	 */
	public function onBeforeMain()
	{
		// Load custom Javascript for this page
		$this->container->template->addJS('media://com_akeeba/js/Manage.min.js', true, false, $this->container->mediaVersion);

		$user              = $this->container->platform->getUser();
		$this->permissions = [
			'configure' => $user->authorise('akeeba.configure', 'com_akeeba'),
			'backup'    => $user->authorise('akeeba.backup', 'com_akeeba'),
			'download'  => $user->authorise('akeeba.download', 'com_akeeba'),
		];


		/** @var Profiles $profilesModel */
		$profilesModel           = $this->container->factory->model('Profiles')->tmpInstance();
		$enginesPerPprofile      = $profilesModel->getPostProcessingEnginePerProfile();
		$this->enginesPerProfile = $enginesPerPprofile;

		// "Show warning first" download button.
		JText::script('COM_AKEEBA_BUADMIN_LOG_DOWNLOAD_CONFIRM', false);
		$this->container->platform->addScriptOptions('akeeba.Manage.baseURI', JUri::base());

		if (version_compare(JVERSION, '3.999.999', 'le'))
		{
			JHtml::_('behavior.calendar');
		}

		$hash = 'akeebamanage';

		// ...ordering
		$platform = $this->container->platform;
		$input    = $this->input;

		// ...filter state
		$this->fltDescription   = $platform->getUserStateFromRequest($hash . 'filter_description', 'description', $input, '');
		$this->fltFrom          = $platform->getUserStateFromRequest($hash . 'filter_from', 'from', $input, '');
		$this->fltTo            = $platform->getUserStateFromRequest($hash . 'filter_to', 'to', $input, '');
		$this->fltOrigin        = $platform->getUserStateFromRequest($hash . 'filter_origin', 'origin', $input, '');
		$this->fltProfile       = $platform->getUserStateFromRequest($hash . 'filter_profile', 'profile', $input, '');
		$this->fltFrozen        = $platform->getUserStateFromRequest($hash . 'filter_frozen', 'frozen', $input, '');

		$this->lists            = new stdClass();
		$this->lists->order     = $platform->getUserStateFromRequest($hash . 'filter_order', 'filter_order', $input, 'backupstart');
		$this->lists->order_Dir = $platform->getUserStateFromRequest($hash . 'filter_order_Dir', 'filter_order_Dir', $input, 'DESC');

		$filters  = $this->getFilters();
		$ordering = $this->getOrdering();

		/** @var Statistics $model */
		$model       = $this->getModel();
		$this->items = $model->getStatisticsListWithMeta(false, $filters, $ordering);

		// Default limits
		$defaultLimit = 20;

		if (!$this->container->platform->isCli() && class_exists('JFactory'))
		{
			$app = JFactory::getApplication();

			if (method_exists($app, 'get'))
			{
				$defaultLimit = $app->get('list_limit');
			}
		}

		$this->lists->limitStart = $model->getState('limitstart', 0, 'int');
		$this->lists->limit      = $model->getState('limit', $defaultLimit, 'int');

		// Let's create an array indexed with the profile id for better handling
		$profiles = $profilesModel->get(true);

		$profilesList = [
			JHtml::_('select.option', '', '–' . JText::_('COM_AKEEBA_BUADMIN_LABEL_PROFILEID') . '–'),
		];

		if (!empty($profiles))
		{
			foreach ($profiles as $profile)
			{
				$profilesList[] = JHtml::_('select.option', $profile->id, '#' . $profile->id . '. ' . $profile->description);
			}
		}

		// Assign data to the view
		$this->profiles     = $profiles; // Profiles
		$this->profilesList = $profilesList; // Profiles list for select box
		$this->itemCount    = count($this->items);
		$this->pagination   = $model->getPagination($filters); // Pagination object

		$this->frozenList = [
			JHtml::_('select.option', '', '–' . JText::_('COM_AKEEBA_BUADMIN_LABEL_FROZEN_SELECT') . '–'),
			JHtml::_('select.option', '1', JText::_('COM_AKEEBA_BUADMIN_LABEL_FROZEN_FROZEN')),
			JHtml::_('select.option', '2', JText::_('COM_AKEEBA_BUADMIN_LABEL_FROZEN_UNFROZEN')),
		];

		if ($this->lists->order_Dir)
		{
			$this->lists->order_Dir = strtolower($this->lists->order_Dir);
		}

		// Date format
		$dateFormat       = $this->container->params->get('dateformat', '');
		$dateFormat       = trim($dateFormat);
		$this->dateFormat = !empty($dateFormat) ? $dateFormat : JText::_('DATE_FORMAT_LC4');

		// Time zone options
		$this->useLocalTime   = $this->container->params->get('localtime', '1') == 1;
		$this->timeZoneFormat = $this->container->params->get('timezonetext', 'T');

		// Should I show the prompt for the configuration wizard?
		$this->promptForBackupRestoration = $this->container->params->get('show_howtorestoremodal', 1) != 0;

		// Construct the array of sorting fields
		$this->sortFields = [
			'id'          => JText::_('COM_AKEEBA_BUADMIN_LABEL_ID'),
			'description' => JText::_('COM_AKEEBA_BUADMIN_LABEL_DESCRIPTION'),
			'backupstart' => JText::_('COM_AKEEBA_BUADMIN_LABEL_START'),
			'profile_id'  => JText::_('COM_AKEEBA_BUADMIN_LABEL_PROFILEID'),
		];
	}

	/**
	 * Edit a backup record's description and comment
	 *
	 * @return  void
	 */
	public function onBeforeShowcomment()
	{
		/** @var Statistics $model */
		$model           = $this->getModel();
		$id              = $model->getState('id', 0, 'int');
		$record          = Platform::getInstance()->get_statistics($id);
		$this->record    = $record;
		$this->record_id = $id;

		$this->setLayout('comment');
	}

	/**
	 * File size formatting function. COnverts number of bytes to a human readable represenation.
	 *
	 * @param   int     $sizeInBytes         Size in bytes
	 * @param   int     $decimals            How many decimals should I use? Default: 2
	 * @param   string  $decSeparator        Decimal separator
	 * @param   string  $thousandsSeparator  Thousands grouping character
	 *
	 * @return string
	 */
	public function formatFilesize($sizeInBytes, $decimals = 2, $decSeparator = '.', $thousandsSeparator = '')
	{
		if ($sizeInBytes <= 0)
		{
			return '-';
		}

		$units = ['b', 'KB', 'MB', 'GB', 'TB'];
		$unit  = floor(log($sizeInBytes, 2) / 10);

		if ($unit == 0)
		{
			$decimals = 0;
		}

		return number_format($sizeInBytes / (1024 ** $unit), $decimals, $decSeparator, $thousandsSeparator) . ' ' . $units[$unit];
	}

	/**
	 * Translates the internal backup type (e.g. cli) to a human readable string
	 *
	 * @param   string  $recordType  The internal backup type
	 *
	 * @return  string
	 */
	public function translateBackupType($recordType)
	{
		static $backup_types = null;

		if (!is_array($backup_types))
		{
			// Load a mapping of backup types to textual representation
			$scripting    = Factory::getEngineParamsProvider()->loadScripting();
			$backup_types = [];
			foreach ($scripting['scripts'] as $key => $data)
			{
				$backup_types[$key] = JText::_($data['text']);
			}
		}

		if (array_key_exists($recordType, $backup_types))
		{
			return $backup_types[$recordType];
		}

		return '&ndash;';
	}

	/**
	 * Returns the origin's translated name and the appropriate icon class
	 *
	 * @param   array  $record  A backup record
	 *
	 * @return  array  array(originTranslation, iconClass)
	 */
	protected function getOriginInformation($record)
	{
		$originLanguageKey = 'COM_AKEEBA_BUADMIN_LABEL_ORIGIN_' . $record['origin'];
		$originDescription = JText::_($originLanguageKey);

		switch (strtolower($record['origin']))
		{
			case 'backend':
				$originIcon = 'akion-android-desktop';
				break;

			case 'frontend':
				$originIcon = 'akion-ios-world';
				break;

			case 'json':
				$originIcon = 'akion-android-cloud';
				break;

			case 'cli':
				$originIcon = 'akion-ios-paper-outline';
				break;

			case 'xmlrpc':
				$originIcon = 'akion-code';
				break;

			case 'lazy':
				$originIcon = 'akion-cube';
				break;

			default:
				$originIcon = 'akion-help';
				break;
		}

		if (empty($originLanguageKey) || ($originDescription == $originLanguageKey))
		{
			$originDescription = '&ndash;';
			$originIcon        = 'akion-help';

			return [$originDescription, $originIcon];
		}

		return [$originDescription, $originIcon];
	}

	/**
	 * Get the start time and duration of a backup record
	 *
	 * @param   array  $record  A backup record
	 *
	 * @return  array  array(startTimeAsString, durationAsString)
	 */
	protected function getTimeInformation($record)
	{
		$utcTimeZone = new DateTimeZone('UTC');
		$startTime   = new Date($record['backupstart'], $utcTimeZone);
		$endTime     = new Date($record['backupend'], $utcTimeZone);

		$duration = $endTime->toUnix() - $startTime->toUnix();

		if ($duration > 0)
		{
			$seconds  = $duration % 60;
			$duration = $duration - $seconds;

			$minutes  = ($duration % 3600) / 60;
			$duration = $duration - $minutes * 60;

			$hours    = $duration / 3600;
			$duration = sprintf('%02d', $hours) . ':' . sprintf('%02d', $minutes) . ':' . sprintf('%02d', $seconds);
		}
		else
		{
			$duration = '';
		}

		$user   = $this->container->platform->getUser();
		$userTZ = $user->getParam('timezone', 'UTC');
		$tz     = new DateTimeZone($userTZ);
		$startTime->setTimezone($tz);

		$timeZoneSuffix = '';

		if (!empty($this->timeZoneFormat))
		{
			$timeZoneSuffix = $startTime->format($this->timeZoneFormat, $this->useLocalTime);
		}

		return [
			$startTime->format($this->dateFormat, $this->useLocalTime),
			$duration,
			$timeZoneSuffix,
		];
	}

	/**
	 * Get the class and icon for the backup status indicator
	 *
	 * @param   array  $record  A backup record
	 *
	 * @return  array  array(class, icon)
	 */
	protected function getStatusInformation($record)
	{
		$statusClass = '';

		switch ($record['meta'])
		{
			case 'ok':
				$statusIcon  = 'akion-checkmark';
				$statusClass = 'akeeba-label--green';
				break;
			case 'pending':
				$statusIcon  = 'akion-play';
				$statusClass = 'akeeba-label--orange';
				break;
			case 'fail':
				$statusIcon  = 'akion-android-cancel';
				$statusClass = 'akeeba-label--red';
				break;
			case 'remote':
				$statusIcon  = 'akion-cloud';
				$statusClass = 'akeeba-label--teal';
				break;
			default:
				$statusIcon  = 'akion-trash-a';
				$statusClass = 'akeeba-label--grey';
				break;
		}

		return [$statusClass, $statusIcon];
	}

	/**
	 * Get the profile name for the backup record (or "–" if the profile no longer exists)
	 *
	 * @param   array  $record  A backup record
	 *
	 * @return  string
	 */
	protected function getProfileName($record)
	{
		$profileName = '&mdash;';

		if (isset($this->profiles[$record['profile_id']]))
		{
			$profileName = $this->escape($this->profiles[$record['profile_id']]->description);

			return $profileName;
		}

		return $profileName;
	}

	/**
	 * Get the filters in a format that Akeeba Engine understands
	 *
	 * @return  array
	 */
	private function getFilters()
	{
		$filters = [];

		if ($this->fltDescription)
		{
			$filters[] = [
				'field'   => 'description',
				'operand' => 'LIKE',
				'value'   => $this->fltDescription,
			];
		}

		if ($this->fltFrom && $this->fltTo)
		{
			$filters[] = [
				'field'   => 'backupstart',
				'operand' => 'BETWEEN',
				'value'   => $this->fltFrom,
				'value2'  => $this->fltTo,
			];
		}
		elseif ($this->fltFrom)
		{
			$filters[] = [
				'field'   => 'backupstart',
				'operand' => '>=',
				'value'   => $this->fltFrom,
			];
		}
		elseif ($this->fltTo)
		{
			$toDate = new Date($this->fltTo);
			$to     = $toDate->format('Y-m-d') . ' 23:59:59';

			$filters[] = [
				'field'   => 'backupstart',
				'operand' => '<=',
				'value'   => $to,
			];
		}

		if ($this->fltOrigin)
		{
			$filters[] = [
				'field'   => 'origin',
				'operand' => '=',
				'value'   => $this->fltOrigin,
			];
		}

		if ($this->fltProfile)
		{
			$filters[] = [
				'field'   => 'profile_id',
				'operand' => '=',
				'value'   => (int) $this->fltProfile,
			];
		}

		if ($this->fltFrozen == 1)
		{
			$filters[] = [
				'field'   => 'frozen',
				'operand' => '=',
				'value'   => 1,
			];
		}
		elseif ($this->fltFrozen == 2)
		{
			$filters[] = [
				'field'   => 'frozen',
				'operand' => '=',
				'value'   => 0,
			];
		}

		if (empty($filters))
		{
			$filters = null;
		}

		return $filters;
	}

	/**
	 * Get the list ordering in a format that Akeeba Engine understands
	 *
	 * @return  array
	 */
	private function getOrdering()
	{
		$order = [
			'by'    => $this->lists->order,
			'order' => strtoupper($this->lists->order_Dir),
		];

		return $order;
	}

}
components/com_akeeba/View/Backup/Html.php000060400000014514152453623440014544 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\View\Backup;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Helper\Status;
use Akeeba\Backup\Admin\Helper\Utils;
use Akeeba\Backup\Admin\Model\Backup;
use Akeeba\Backup\Admin\Model\ControlPanel;
use Akeeba\Backup\Admin\View\ViewTraits\ProfileIdAndName;
use Akeeba\Backup\Admin\View\ViewTraits\ProfileList;
use Akeeba\Engine\Factory;
use FOF40\View\DataView\Html as BaseView;
use Joomla\CMS\Language\Text;

/**
 * View controller for the Backup Now page
 */
class Html extends BaseView
{
	use ProfileList, ProfileIdAndName;

	/**
	 * Do we have errors preventing the backup from starting?
	 *
	 * @var  bool
	 */
	public $hasErrors = false;

	/**
	 * Do we have warnings which may affect –but do not prevent– the backup from running?
	 *
	 * @var  bool
	 */
	public $hasWarnings = false;

	/**
	 * The HTML of the warnings cell
	 *
	 * @var  string
	 */
	public $warningsCell = '';

	/**
	 * Backup description
	 *
	 * @var  string
	 */
	public $description = '';

	/**
	 * Default backup description
	 *
	 * @var  string
	 */
	public $defaultDescription = '';

	/**
	 * Backup comment
	 *
	 * @var  string
	 */
	public $comment = '';

	/**
	 * JSON string of the backup domain name to titles associative array
	 *
	 * @var  array
	 */
	public $domains = '';

	/**
	 * Maximum execution time in seconds
	 *
	 * @var  int
	 */
	public $maxExecutionTime = 10;

	/**
	 * Execution time bias, in percentage points (0-100)
	 *
	 * @var  int
	 */
	public $runtimeBias = 75;

	/**
	 * URL to return to after the backup is complete
	 *
	 * @var  string
	 */
	public $returnURL = '';

	/**
	 * Is the output directory unwritable?
	 *
	 * @var  bool
	 */
	public $unwriteableOutput = false;

	/**
	 * has the user configured an ANGIE password?
	 *
	 * @var  string
	 */
	public $hasANGIEPassword = '';

	/**
	 * Should I autostart the backup?
	 *
	 * @var  string
	 */
	public $autoStart = false;

	/**
	 * Should I display desktop notifications? 0/1
	 *
	 * @var  int
	 */
	public $desktopNotifications = 0;

	/**
	 * Should I try to automatically resume the backup in case of an error? 0/1
	 *
	 * @var  int
	 */
	public $autoResume = 0;

	/**
	 * After how many seconds should I try to automatically resume the backup?
	 *
	 * @var  int
	 */
	public $autoResumeTimeout = 10;

	/**
	 * How many times in total should I try to automatically resume the backup?
	 *
	 * @var  int
	 */
	public $autoResumeRetries = 3;

	/**
	 * Should I prompt the user to run the Configuration Wizard?
	 *
	 * @var  bool
	 */
	public $promptForConfigurationWizard = false;

	/**
	 * Runs before displaying the backup page
	 */
	public function onBeforeMain()
	{
		// Load the view-specific Javascript
		$this->container->template->addJS('media://com_akeeba/js/Backup.min.js', true, false, $this->container->mediaVersion);

		// Load the models
		/** @var  Backup $model */
		$model = $this->getModel();

		/** @var ControlPanel $cpanelmodel */
		$cpanelmodel = $this->container->factory->model('ControlPanel')->tmpInstance();

		// Load the Status Helper
		$helper = Status::getInstance();

		// Determine default description
		$default_description = $this->getDefaultDescription();

		// Load data from the model state
		$backup_description = $model->getState('description', $default_description, 'string');
		$comment            = $model->getState('comment', '', 'html');
		$returnurl          = Utils::safeDecodeReturnUrl($model->getState('returnurl', ''));

		// Get the maximum execution time and bias
		$engineConfiguration = Factory::getConfiguration();
		$maxexec             = $engineConfiguration->get('akeeba.tuning.max_exec_time', 14) * 1000;
		$bias                = $engineConfiguration->get('akeeba.tuning.run_time_bias', 75);

		// Check if the output directory is writable
		$warnings         = Factory::getConfigurationChecks()->getDetailedStatus();
		$unwritableOutput = array_key_exists('001', $warnings);

		// Pass on data
		$this->getProfileList();
		$this->getProfileIdAndName();

		$this->hasErrors                    = !$helper->status;
		$this->hasWarnings                  = $helper->hasQuirks();
		$this->warningsCell                 = $helper->getQuirksCell(!$helper->status);
		$this->description                  = $backup_description;
		$this->defaultDescription           = $default_description;
		$this->comment                      = $comment;
		$this->domains                      = $this->getDomains();
		$this->maxExecutionTime             = $maxexec;
		$this->runtimeBias                  = $bias;
		$this->returnURL                    = $returnurl;
		$this->unwriteableOutput            = $unwritableOutput;
		$this->autoStart                    = $model->getState('autostart', 0, 'boolean');
		$this->desktopNotifications         = $this->container->params->get('desktop_notifications', '0') ? 1 : 0;
		$this->autoResume                   = $engineConfiguration->get('akeeba.advanced.autoresume', 1);
		$this->autoResumeTimeout            = $engineConfiguration->get('akeeba.advanced.autoresume_timeout', 10);
		$this->autoResumeRetries            = $engineConfiguration->get('akeeba.advanced.autoresume_maxretries', 3);
		$this->promptForConfigurationWizard = $engineConfiguration->get('akeeba.flag.confwiz', 0) == 0;
		$this->hasANGIEPassword = !empty(trim($engineConfiguration->get('engine.installer.angie.key', '')));
	}

	/**
	 * Get the default description for this backup attempt
	 *
	 * @return  string
	 */
	private function getDefaultDescription()
	{
		return $this->getModel()->getDefaultDescription();
	}

	/**
	 * Get a list of backup domain keys and titles
	 *
	 * @return  array
	 */
	private function getDomains()
	{
		$engineConfiguration = Factory::getConfiguration();
		$script              = $engineConfiguration->get('akeeba.basic.backup_type', 'full');
		$scripting           = Factory::getEngineParamsProvider()->loadScripting();
		$domains             = [];

		if (empty($scripting))
		{
			return $domains;
		}

		foreach ($scripting['scripts'][$script]['chain'] as $domain)
		{
			$description = Text::_($scripting['domains'][$domain]['text']);
			$domain_key  = $scripting['domains'][$domain]['domain'];
			$domains[]   = [$domain_key, $description];
		}

		return $domains;
	}
}
components/com_akeeba/View/Configuration/Html.php000060400000007237152453623440016152 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\View\Configuration;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\View\ViewTraits\ProfileIdAndName;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use FOF40\View\DataView\Html as BaseView;
use Joomla\CMS\Language\Text as JText;

class Html extends BaseView
{
	use ProfileIdAndName;

	/**
	 * Status of the settings encryption: -1 disabled by user, 0 not available, 1 enabled and active
	 *
	 * @var  int
	 */
	public $secureSettings = 0;

	/**
	 * Should I show the Configuration Wizard popup prompt?
	 *
	 * @var  bool
	 */
	public $promptForConfigurationWizard = false;

	/**
	 * Executes when displaying the page
	 */
	public function onBeforeMain()
	{
		$this->container->template->addJS('media://com_akeeba/js/Configuration.min.js', true, false, $this->container->mediaVersion);

		$this->getProfileIdAndName();

		// Are the settings secured?
		$this->secureSettings = $this->getSecureSettingsOption();

		// Should I show the Configuration Wizard popup prompt?
		$this->promptForConfigurationWizard = Factory::getConfiguration()->get('akeeba.flag.confwiz', 0) != 1;

		// Push script options
		$urls = array(
			'browser'      => addslashes('index.php?option=com_akeeba&view=Browser&processfolder=1&tmpl=component&folder='),
			'ftpBrowser'   => addslashes('index.php?option=com_akeeba&view=FTPBrowser'),
			'sftpBrowser'  => addslashes('index.php?option=com_akeeba&view=SFTPBrowser'),
			'testFtp'      => addslashes('index.php?option=com_akeeba&view=Configuration&task=testftp'),
			'testSftp'     => addslashes('index.php?option=com_akeeba&view=Configuration&task=testsftp'),
			'dpeauthopen'  => addslashes('index.php?option=com_akeeba&view=Configuration&task=dpeoauthopen&format=raw'),
			'dpecustomapi' => addslashes('index.php?option=com_akeeba&view=Configuration&task=dpecustomapi&format=raw'),
		);

		// Push script options
		$platform = $this->container->platform;
		$platform->addScriptOptions('akeeba.Configuration.URLs', $urls);
		$platform->addScriptOptions('akeeba.Configuration.GUIData', json_decode(Factory::getEngineParamsProvider()->getJsonGuiDefinition(), true));


		// Push translations
		JText::script('COM_AKEEBA_CONFIG_UI_BROWSE');
		JText::script('COM_AKEEBA_CONFIG_UI_CONFIG');
		JText::script('COM_AKEEBA_CONFIG_UI_REFRESH');
		JText::script('COM_AKEEBA_FILEFILTERS_LABEL_UIROOT');
		JText::script('COM_AKEEBA_CONFIG_UI_FTPBROWSER_TITLE');
		JText::script('COM_AKEEBA_CONFIG_DIRECTFTP_TEST_OK');
		JText::script('COM_AKEEBA_CONFIG_DIRECTFTP_TEST_FAIL');
		JText::script('COM_AKEEBA_CONFIG_DIRECTSFTP_TEST_OK');
		JText::script('COM_AKEEBA_CONFIG_DIRECTSFTP_TEST_FAIL');
	}

	/**
	 * Returns the support status of settings encryption. The possible values are:
	 * -1 Disabled by the user
	 *  0 Enabled by inactive (not supported by the server)
	 *  1 Enabled and active
	 *
	 * @return  int
	 */
	private function getSecureSettingsOption()
	{
		// Encryption is disabled by the user
		if (Platform::getInstance()->get_platform_configuration_option('useencryption', -1) == 0)
		{
			return -1;
		}

		// Encryption is not supported by this server
		if (!Factory::getSecureSettings()->supportsEncryption())
		{
			return 0;
		}

		$filename = JPATH_COMPONENT_ADMINISTRATOR . '/BackupEngine/serverkey.php';

		// Encryption enabled, supported and a key file is present: encryption enabled
		if (is_file($filename))
		{
			return 1;
		}

		// Encryption enabled, supported but and a key file is NOT present: encryption not available
		return 0;
	}
}
components/com_akeeba/View/.htaccess000060400000000246152453623440013515 0ustar00<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
  <RequireAll>
    Require all denied
  </RequireAll>
</IfModule>
components/com_akeeba/View/fef.php000060400000003071152453623440013167 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2021 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') or die();

?>

<div style="margin: 1em">
	<h1>Akeeba Frontend Framework (FEF) could not be found on this site</h1>
	<hr/>
	<div class="alert alert-warning">
		<h2>
			This component requires the Akeeba Frontend Framework (FEF) to be installed on your site. Please go to <a
					href="https://www.akeeba.com/download/official/fef.html">our download page</a> to download it, then install it on your site.
		</h2>
	</div>
	<hr/>
	<h4>Further information</h4>
	<p>
        FEF is the name of our custom CSS framework. It's responsible for rendering the interface of our Joomla!
		extensions. It is automatically installed when you install our extensions on your site.
	</p>
	<p>
		FEF can be missing from your site either because Joomla failed to install it or because you, another Super User,
		or another extension mistakenly uninstalled it.
	</p>
	<p>
		If it's missing we cannot display the interface to this component. That's why you see this message.
	</p>
	<p>
		You do not have to worry about adding bloat to your site. FEF is very small. It will also be automatically
		uninstalled when you uninstall all components which depend on it.
	</p>
	<p>
		FEF is installed in the <code>media/fef</code> folder under your site's root. It appears in Joomla's Extensions,
		Manage page as <code>file_fef</code>. Please do not remove it from your site.
	</p>
</div>
components/com_akeeba/View/web.config000060400000001025152453623440013657 0ustar00<?xml version="1.0"?>
<!--
    This only works on IIS 7 or later. See https://www.iis.net/configreference/system.webserver/security/requestfiltering/fileextensions
-->
<configuration>
    <system.webServer>
        <security>
            <requestFiltering>
                <fileExtensions allowUnlisted="false" >
                    <clear />
                    <add fileExtension=".html" allowed="true"/>
                </fileExtensions>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>components/com_akeeba/View/Profiles/Html.php000060400000002434152453623440015120 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\View\Profiles;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\View\ViewTraits\ProfileIdAndName;
use FOF40\View\DataView\Html as BaseView;
use Joomla\CMS\HTML\HTMLHelper as JHtml;
use Joomla\CMS\Language\Text as JText;

/**
 * View controller for the profiles management page
 */
class Html extends BaseView
{
	use ProfileIdAndName;

	/**
	 * Sorting order fields
	 *
	 * @var  array
	 */
	public $sortFields;

	/**
	 * The default layout, shows a list of profiles
	 */
	function onBeforeBrowse()
	{
		$this->getProfileIdAndName();

		// Get Sort By fields
		$this->sortFields = [
			'id'          => JText::_('JGRID_HEADING_ID'),
			'description' => JText::_('COM_AKEEBA_PROFILES_COLLABEL_DESCRIPTION'),
		];

		parent::onBeforeBrowse();

		JHtml::_('behavior.multiselect');
		JHtml::_('dropdown.init');
	}

	/**
	 * The edit layout, editing a profile's name
	 */
	protected function onBeforeEdit()
	{
		parent::onBeforeEdit();

		// Include tooltip support
		if (version_compare(JVERSION, '3.999.999', 'lt'))
		{
			JHtml::_('behavior.tooltip');
		}
	}
}
components/com_akeeba/View/Profiles/Json.php000060400000000556152453623440015130 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\View\Profiles;

// Protect from unauthorized access
defined('_JEXEC') || die();

use FOF40\View\DataView\Json as BaseView;

class Json extends BaseView
{

}
components/com_akeeba/View/RegExFileFilter/Html.php000060400000005341152453623440016315 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\View\RegExFileFilter;

// Protect from unauthorized access
use Akeeba\Backup\Admin\Model\RegExFileFilters;
use Akeeba\Backup\Admin\View\ViewTraits\ProfileIdAndName;
use Akeeba\Engine\Factory;
use Joomla\CMS\HTML\HTMLHelper as JHtml;
use Joomla\CMS\Language\Text as JText;
use Joomla\CMS\Uri\Uri as JUri;

defined('_JEXEC') || die();

class Html extends \FOF40\View\DataView\Html
{
	use ProfileIdAndName;

	/**
	 * SELECT element for choosing a database root
	 *
	 * @var  string
	 */
	public $root_select = '';

	/**
	 * List of database roots
	 *
	 * @var  array
	 */
	public $roots = [];

	/**
	 * Main page
	 */
	public function onBeforeMain()
	{
		// Load Javascript files
		$this->container->template->addJS('media://com_akeeba/js/FileFilters.min.js', true, false, $this->container->mediaVersion);
		$this->container->template->addJS('media://com_akeeba/js/RegExFileFilter.min.js', true, false, $this->container->mediaVersion);

		/** @var RegExFileFilters $model */
		$model = $this->getModel();

		// Get a JSON representation of the available roots
		$filters   = Factory::getFilters();
		$root_info = $filters->getInclusions('dir');
		$roots     = array();
		$options   = array();

		if (!empty($root_info))
		{
			// Loop all dir definitions
			foreach ($root_info as $dir_definition)
			{
				if (is_null($dir_definition[1]))
				{
					// Site root definition has a null element 1. It is always pushed on top of the stack.
					array_unshift($roots, $dir_definition[0]);
				}
				else
				{
					$roots[] = $dir_definition[0];
				}

				$options[] = JHtml::_('select.option', $dir_definition[0], $dir_definition[0]);
			}
		}
		$site_root         = $roots[0];
		$this->root_select = JHtml::_('select.genericlist', $options, 'root', [
			'list.select' => $site_root,
			'id'          => 'active_root',
		]);
		$this->roots       = $roots;

		// Pass script options
		$platform = $this->container->platform;
		$platform->addScriptOptions('akeeba.System.params.AjaxURL', JUri::base() . 'index.php?option=com_akeeba&view=RegExFileFilters&task=ajax');
		$platform->addScriptOptions('akeeba.RegExFileFilter.guiData', $model->get_regex_filters($site_root));

		$this->getProfileIdAndName();

		// Push translations
		JText::script('COM_AKEEBA_FILEFILTERS_LABEL_UIROOT');
		JText::script('COM_AKEEBA_FILEFILTERS_LABEL_UIERRORFILTER');
		JText::script('COM_AKEEBA_FILEFILTERS_TYPE_DIRECTORIES');
		JText::script('COM_AKEEBA_FILEFILTERS_TYPE_SKIPFILES');
		JText::script('COM_AKEEBA_FILEFILTERS_TYPE_SKIPDIRS');
		JText::script('COM_AKEEBA_FILEFILTERS_TYPE_FILES');

	}
}
components/com_akeeba/script.akeeba.php000060400000104630152453623440014233 0ustar00<?php
/**
 * @package    AkeebaBackup
 * @copyright  Copyright (c)2009-2016 Nicholas K. Dionysopoulos
 * @license    GNU General Public License version 3, or later
 *
 */
defined('_JEXEC') or die();

// Load FOF if not already loaded
if (!defined('F0F_INCLUDED'))
{
	$paths = array(
		(defined('JPATH_LIBRARIES') ? JPATH_LIBRARIES : JPATH_ROOT . '/libraries') . '/f0f/include.php',
		__DIR__ . '/fof/include.php',
	);

	foreach ($paths as $filePath)
	{
		if (!defined('F0F_INCLUDED') && file_exists($filePath))
		{
			@include_once $filePath;
		}
	}
}

// Pre-load the installer script class from our own copy of FOF
if (!class_exists('F0FUtilsInstallscript', false))
{
	@include_once __DIR__ . '/fof/utils/installscript/installscript.php';
}

// Pre-load the database schema installer class from our own copy of FOF
if (!class_exists('F0FDatabaseInstaller', false))
{
	@include_once __DIR__ . '/fof/database/installer.php';
}

// Pre-load the update utility class from our own copy of FOF
if (!class_exists('F0FUtilsUpdate', false))
{
	@include_once __DIR__ . '/fof/utils/update/update.php';
}

// Pre-load the cache cleaner utility class from our own copy of FOF
if (!class_exists('F0FUtilsCacheCleaner', false))
{
	@include_once __DIR__ . '/fof/utils/cache/cleaner.php';
}

class Com_AkeebaInstallerScript extends F0FUtilsInstallscript
{
	/**
	 * The title of the component (printed on installation and uninstallation messages)
	 *
	 * @var string
	 */
	protected $componentTitle = 'Akeeba Backup';

	/**
	 * The component's name
	 *
	 * @var   string
	 */
	protected $componentName = 'com_akeeba';

	/**
	 * The list of extra modules and plugins to install on component installation / update and remove on component
	 * uninstallation.
	 *
	 * @var   array
	 */
	protected $installation_queue = array(
		// modules => { (folder) => { (module) => { (position), (published) } }* }*
		'modules' => array(
			'admin' => array(
			),
			'site'  => array()
		),
		// plugins => { (folder) => { (element) => (published) }* }*
		'plugins' => array(
			'quickicon' => array(
				'akeebabackup' => 1,
			),
			'system'    => array(
				'akeebaupdatecheck' => 0,
				'backuponupdate'    => 1,
			),
		)
	);

	/**
	 * The list of obsolete extra modules and plugins to uninstall on component upgrade / installation.
	 *
	 * @var array
	 */
	protected $uninstallation_queue = array(
		// modules => { (folder) => { (module) }* }*
		'modules' => array(
			'admin' => array(
				'akeebabackup'
			),
			'site'  => array()
		),
		// plugins => { (folder) => { (element) }* }*
		'plugins' => array(
			'system' => array(
				'srp',
			),
			'installer' => array(
				'akeebabackup',
			),
		)
	);

	/**
	 * Obsolete files and folders to remove from the free version only. This is used when you move a feature from the
	 * free version of your extension to its paid version. If you don't have such a distinction you can ignore this.
	 *
	 * @var   array
	 */
	protected $removeFilesFree = array(
		'files'   => array(
			// Pro component features
			'administrator/components/com_akeeba/engine/Archiver/Directftp.php',
			'administrator/components/com_akeeba/engine/Archiver/directftp.ini',
			'administrator/components/com_akeeba/engine/Archiver/Directsftp.php',
			'administrator/components/com_akeeba/engine/Archiver/directsftp.ini',
			'administrator/components/com_akeeba/engine/Archiver/Jps.php',
			'administrator/components/com_akeeba/engine/Archiver/jps.ini',
			'administrator/components/com_akeeba/engine/Archiver/Zipnative.php',
			'administrator/components/com_akeeba/engine/Archiver/zipnative.ini',
			'administrator/components/com_akeeba/engine/Dump/Reverse.php',
			'administrator/components/com_akeeba/engine/Dump/reverse.ini',
			'administrator/components/com_akeeba/engine/Postproc/amazons3.ini',
			'administrator/components/com_akeeba/engine/Postproc/Amazons3.php',
			'administrator/components/com_akeeba/engine/Postproc/azure.ini',
			'administrator/components/com_akeeba/engine/Postproc/Azure.php',
			'administrator/components/com_akeeba/engine/Postproc/cloudfiles.ini',
			'administrator/components/com_akeeba/engine/Postproc/Cloudfiles.php',
			'administrator/components/com_akeeba/engine/Postproc/cloudme.ini',
			'administrator/components/com_akeeba/engine/Postproc/Cloudme.php',
			'administrator/components/com_akeeba/engine/Postproc/dreamobjects.ini',
			'administrator/components/com_akeeba/engine/Postproc/Dreamobjects.php',
			'administrator/components/com_akeeba/engine/Postproc/dropbox.ini',
			'administrator/components/com_akeeba/engine/Postproc/Dropbox.php',
			'administrator/components/com_akeeba/engine/Postproc/email.ini',
			'administrator/components/com_akeeba/engine/Postproc/Email.php',
			'administrator/components/com_akeeba/engine/Postproc/ftp.ini',
			'administrator/components/com_akeeba/engine/Postproc/Ftp.php',
			'administrator/components/com_akeeba/engine/Postproc/googlestorage.ini',
			'administrator/components/com_akeeba/engine/Postproc/Googlestorage.php',
			'administrator/components/com_akeeba/engine/Postproc/idrivesync.ini',
			'administrator/components/com_akeeba/engine/Postproc/Idrivesync.php',
			'administrator/components/com_akeeba/engine/Postproc/onedrive.ini',
			'administrator/components/com_akeeba/engine/Postproc/Onedrive.php',
			'administrator/components/com_akeeba/engine/Postproc/s3.ini',
			'administrator/components/com_akeeba/engine/Postproc/S3.php',
			'administrator/components/com_akeeba/engine/Postproc/sftp.ini',
			'administrator/components/com_akeeba/engine/Postproc/Sftp.php',
			'administrator/components/com_akeeba/engine/Postproc/sugarsync.ini',
			'administrator/components/com_akeeba/engine/Postproc/Sugarsync.php',
			'administrator/components/com_akeeba/engine/Postproc/webdav.ini',
			'administrator/components/com_akeeba/engine/Postproc/Webdav.php',
			'administrator/components/com_akeeba/engine/Scan/large.ini',
			'administrator/components/com_akeeba/engine/Scan/Large.php',
			'administrator/components/com_akeeba/controllers/alice.php',
			'administrator/components/com_akeeba/controllers/discover.php',
			'administrator/components/com_akeeba/controllers/eff.php',
			'administrator/components/com_akeeba/controllers/extfilter.php',
			'administrator/components/com_akeeba/controllers/multidb.php',
			'administrator/components/com_akeeba/controllers/regexdbfilter.php',
			'administrator/components/com_akeeba/controllers/regexfsfilter.php',
			'administrator/components/com_akeeba/controllers/remotefile.php',
			'administrator/components/com_akeeba/controllers/restore.php',
			'administrator/components/com_akeeba/controllers/s3import.php',
			'administrator/components/com_akeeba/controllers/srprestore.php',
			'administrator/components/com_akeeba/controllers/upload.php',
			'administrator/components/com_akeeba/models/alices.php',
			'administrator/components/com_akeeba/models/discovers.php',
			'administrator/components/com_akeeba/models/effs.php',
			'administrator/components/com_akeeba/models/extfilters.php',
			'administrator/components/com_akeeba/models/installer.php',
			'administrator/components/com_akeeba/models/multidbs.php',
			'administrator/components/com_akeeba/models/regexdbfilters.php',
			'administrator/components/com_akeeba/models/regexfsfilters.php',
			'administrator/components/com_akeeba/models/remotefiles.php',
			'administrator/components/com_akeeba/models/restores.php',
			'administrator/components/com_akeeba/models/s3imports.php',
			'administrator/components/com_akeeba/models/srprestores.php',
			'administrator/components/com_akeeba/models/uploads.php',
			'administrator/components/com_akeeba/platform/joomla25/Filter/Components.php',
			'administrator/components/com_akeeba/platform/joomla25/Filter/Extensiondirs.php',
			'administrator/components/com_akeeba/platform/joomla25/Filter/Extensionfiles.php',
			'administrator/components/com_akeeba/platform/joomla25/Filter/Languages.php',
			'administrator/components/com_akeeba/platform/joomla25/Filter/Modules.php',
			'administrator/components/com_akeeba/platform/joomla25/Filter/Plugins.php',
			'administrator/components/com_akeeba/platform/joomla25/Filter/Templates.php',
			'administrator/components/com_akeeba/views/buadmin/tmpl/restorepoint.php',
			'administrator/components/com_akeeba/assets/installers/abi.ini',
			'administrator/components/com_akeeba/assets/installers/abi.jpa',
			'administrator/components/com_akeeba/assets/installers/angie-generic.ini',
			'administrator/components/com_akeeba/assets/installers/angie-generic.jpa',
			// Media files
			'media/com_akeeba/akeebauipro.js',
			'media/com_akeeba/alice.js',
			'media/com_akeeba/encryption.js',
			// Plugins
			'plugins/system/akeebaupdatecheck.php',
			'plugins/system/akeebaupdatecheck.xml',
			'plugins/system/aklazy.php',
			'plugins/system/aklazy.xml',
			'plugins/system/srp.php',
			'plugins/system/srp.xml',
			// Additional ANGIE installers which are not used in Core
			'administrator/components/com_akeeba/assets/installers/angie-generic.jpa',
			'administrator/components/com_akeeba/assets/installers/angie-generic.ini',
			// Integrity check
			'administrator/components/com_akeeba/fileslist.php',
			'administrator/components/com_akeeba/controllers/checkfile.php',
			// Post-install messages helper
			'administrator/components/com_akeeba/helpers/postinstall.php',
		),
		'folders' => array(
			// Plugins
			'plugins/system/akeebaupdatecheck',
			'plugins/system/aklazy',
			'plugins/system/srp',
			// Modules
			'administrator/modules/mod_akadmin',
			// Pro component features
			'administrator/components/com_akeeba/alice',
			'administrator/components/com_akeeba/platform/joomla25/Config/Pro',
			'administrator/components/com_akeeba/views/alices',
			'administrator/components/com_akeeba/views/discover',
			'administrator/components/com_akeeba/views/eff',
			'administrator/components/com_akeeba/views/extfilter',
			'administrator/components/com_akeeba/views/multidb',
			'administrator/components/com_akeeba/views/regexdbfilter',
			'administrator/components/com_akeeba/views/regexfsfilter',
			'administrator/components/com_akeeba/views/remotefiles',
			'administrator/components/com_akeeba/views/restore',
			'administrator/components/com_akeeba/views/s3import',
			'administrator/components/com_akeeba/views/srprestore',
			'administrator/components/com_akeeba/views/upload',
			'administrator/components/com_akeeba/engine/Dump/Reverse',
			'administrator/components/com_akeeba/engine/Postproc/Connector',
			// Integrity check
			'administrator/components/com_akeeba/views/checkfiles',
		)
	);

	/**
	 * Obsolete files and folders to remove from both paid and free releases. This is used when you refactor code and
	 * some files inevitably become obsolete and need to be removed.
	 *
	 * @var   array
	 */
	protected $removeFilesAllVersions = array(
		'files'   => array(
			'cache/com_akeeba.updates.php',
			'cache/com_akeeba.updates.ini',
			'administrator/cache/com_akeeba.updates.php',
			'administrator/cache/com_akeeba.updates.ini',
			'administrator/components/com_akeeba/controllers/acl.php',
			'administrator/components/com_akeeba/controllers/installer.php',
			'administrator/components/com_akeeba/models/srprestore.php',
			'administrator/components/com_akeeba/models/stw.php',
			'administrator/components/com_akeeba/models/acl.php',
			'administrator/components/com_akeeba/tables/acl.php',
			// Files renamed after using FOF
			'administrator/components/com_akeeba/models/cpanel.php',
			'administrator/components/com_akeeba/models/backup.php',
			'administrator/components/com_akeeba/models/config.php',
			'administrator/components/com_akeeba/models/ftpbrowser.php',
			'administrator/components/com_akeeba/models/log.php',
			'administrator/components/com_akeeba/models/fsfilter.php',
			'administrator/components/com_akeeba/models/dbef.php',
			'administrator/components/com_akeeba/views/profiles/tmpl/default_edit.php',
			'administrator/components/com_akeeba/views/buadmin/tmpl/default_comment.php',
			'administrator/components/com_akeeba/views/fsfilter/tmpl/default_tab.php',
			'administrator/components/com_akeeba/views/extfilter/tmpl/default_components.php',
			'administrator/components/com_akeeba/views/extfilter/tmpl/default_languages.php',
			'administrator/components/com_akeeba/views/extfilter/tmpl/default_modules.php',
			'administrator/components/com_akeeba/views/extfilter/tmpl/default_plugins.php',
			'administrator/components/com_akeeba/views/extfilter/tmpl/default_templates.php',
			'administrator/components/com_akeeba/views/dbef/tmpl/default_tab.php',
			'components/com_akeeba/models/light.php',
			'components/com_akeeba/models/json.php',
			'components/com_akeeba/views/light/view.html.php',
			'components/com_akeeba/views/light/tmpl/default_done.php',
			'components/com_akeeba/views/light/tmpl/default_error.php',
			'components/com_akeeba/views/light/tmpl/default_step.php',
			// Outdated media files
			'media/com_akeeba/js/jquery.js',
			'media/com_akeeba/js/jquery-ui.js',
			'media/com_akeeba/js/akeebajq.js',
			'media/com_akeeba/js/akeebajqui.js',
			'media/com_akeeba/theme/jquery-ui.css',
			'media/com_akeeba/theme/browser.css',
			// Old ABI installer
			'administrator/components/com_akeeba/assets/installers/abi.jpa',
			'administrator/components/com_akeeba/assets/installers/abi.ini',
			// Additional ANGIE installers which are not used in Pro and Core versions
			'administrator/components/com_akeeba/assets/installers/angie-magento.jpa',
			'administrator/components/com_akeeba/assets/installers/angie-magento.ini',
			'administrator/components/com_akeeba/assets/installers/angie-moodle.jpa',
			'administrator/components/com_akeeba/assets/installers/angie-moodle.ini',
			'administrator/components/com_akeeba/assets/installers/angie-phpbb.jpa',
			'administrator/components/com_akeeba/assets/installers/angie-phpbb.ini',
			'administrator/components/com_akeeba/assets/installers/angie-prestashop.jpa',
			'administrator/components/com_akeeba/assets/installers/angie-prestashop.ini',
			'administrator/components/com_akeeba/assets/installers/angie-wordpress.jpa',
			'administrator/components/com_akeeba/assets/installers/angie-wordpress.ini',
			// Old CLI backup scripts, obsolete since 3.5.0, removed in 4.0.0
			'administrator/components/com_akeeba/backup.php',
			'administrator/components/com_akeeba/altbackup.php',

			// Post-installation page
		    'administrator/components/com_akeeba/controllers/postsetup.php',

			// Site Transfer Wizard
		    'administrator/components/com_akeeba/controllers/stw.php',
		    'administrator/components/com_akeeba/models/stws.php',

			// System Restore Points
			'administrator/components/com_akeeba/controllers/srprestore.php',
			'administrator/components/com_akeeba/models/srprestores.php',
			'administrator/components/com_akeeba/models/installer.php',
			'administrator/components/com_akeeba/views/buadmin/tmpl/restorepoint.php',
			'administrator/components/com_akeeba/platform/joomla25/Filter/SRPData.php',
			'administrator/components/com_akeeba/platform/joomla25/Filter/SRPDirectories.php',
			'administrator/components/com_akeeba/platform/joomla25/Filter/SRPFiles.php',
			'administrator/components/com_akeeba/platform/joomla25/Filter/SRPSkipData.php',
			'administrator/components/com_akeeba/platform/joomla25/Filter/SRPSkipFiles.php',
			'administrator/components/com_akeeba/platform/joomla25/Finalization/Srpquotas.php',

			// Extension filters
			'administrator/components/com_akeeba/controllers/extfilter.php',
			'administrator/components/com_akeeba/models/extfilter.php',
			'administrator/components/com_akeeba/models/extfilters.php',
			'administrator/components/com_akeeba/platform/joomla25/Filter/Components.php',
			'administrator/components/com_akeeba/platform/joomla25/Filter/Extensiondirs.php',
			'administrator/components/com_akeeba/platform/joomla25/Filter/Extensionfiles.php',
			'administrator/components/com_akeeba/platform/joomla25/Filter/Languages.php',
			'administrator/components/com_akeeba/platform/joomla25/Filter/Modules.php',
			'administrator/components/com_akeeba/platform/joomla25/Filter/Plugins.php',
			'administrator/components/com_akeeba/platform/joomla25/Filter/Templates.php',

			// Lite mode (because smartphones are the norm since ~2010 or so)
			'components/com_akeeba/controllers/light.php',
			'components/com_akeeba/models/lights.php',

			// Old view INI files
			'administrator/components/com_akeeba/views/proviews.ini',
			'administrator/components/com_akeeba/views/views.ini',

			// Live Help (which had stopped working a long time ago and nobody even noticed)
			'administrator/components/com_akeeba/helpers/includes.php',

			// JSON library, which only made sense in PHP 5.2 and lower (Joomla! 3 won't even run without JSON support)
			'administrator/components/com_akeeba/helpers/jsonlib.php',

			// Old self-heal db support
			'administrator/components/com_akeeba/models/selfheal.php',

			// Obsolete Amazon S3 integration
			'administrator/components/com_akeeba/engine/Postproc/Connector/Amazons3.php',
			'administrator/components/com_akeeba/engine/Postproc/S3.php',
			'administrator/components/com_akeeba/engine/Postproc/s3.ini',

			// Obsolete remains of the legacy Live Update system
			'administrator/components/com_akeeba/assets/xmlslurp/xmlslurp.php',
		),
		'folders' => array(
			// Directories used in version 4.1 and earlier
			'administrator/components/com_akeeba/akeeba',
			'administrator/components/com_akeeba/plugins',

			// Obsolete views
			'administrator/components/com_akeeba/views/installer',
			'administrator/components/com_akeeba/views/acl',
			'administrator/components/com_akeeba/assets/images',

			// Folders renamed after using FOF
			'components/com_akeeba/views/backup',
			'components/com_akeeba/views/json',

			// Outdated media directories
			'media/com_akeeba/theme/images',

			// Post-installation page
			'administrator/components/com_akeeba/views/postsetup',

			// Site Transfer Wizard
			'administrator/components/com_akeeba/views/stw',

			// System Restore Points
			'administrator/components/com_akeeba/assets/srpdefs',
			'administrator/components/com_akeeba/views/srprestore',

			// Extension filters
			'administrator/components/com_akeeba/views/extfilter',

			// We no longer have a front-end views folder
			'components/com_akeeba/views',

			// Obsolete Amazon S3 integration
			'administrator/components/com_akeeba/engine/Postproc/Connector/Amazon',
			'administrator/components/com_akeeba/engine/Postproc/Connector/Amazons3',

			// Obsolete remains of the legacy Live Update system
			'administrator/components/com_akeeba/assets/xmlslurp',

			// Obsolete Comconfig helper class
			'administrator/components/com_akeeba/platform/joomla25/Util',
		)
	);

	/**
	 * A list of scripts to be copied to the "cli" directory of the site
	 *
	 * @var   array
	 */
	protected $cliScriptFiles = array(
		'akeeba-backup.php',
		'akeeba-altbackup.php',
		'akeeba-check-failed.php',
		'akeeba-altcheck-failed.php',
        'akeeba-update.php',
	);

	/**
	 * The minimum PHP version required to install this extension
	 *
	 * @var   string
	 */
	protected $minimumPHPVersion = '5.3.3';

	/**
	 * The minimum Joomla! version required to install this extension
	 *
	 * @var   string
	 */
	protected $minimumJoomlaVersion = '1.6.0';

	/**
	 * Runs on installation
	 *
	 * @param   JInstaller $parent The parent object
	 */
	public function install($parent)
	{
		if (!defined('AKEEBA_THIS_IS_INSTALLATION_FROM_SCRATCH'))
		{
			define('AKEEBA_THIS_IS_INSTALLATION_FROM_SCRATCH', 1);
		}
	}

	/**
	 * Joomla! pre-flight event. This runs before Joomla! installs or updates the component. This is our last chance to
	 * tell Joomla! if it should abort the installation.
	 *
	 * @param   string     $type   Installation type (install, update, discover_install)
	 * @param   JInstaller $parent Parent object
	 *
	 * @return  boolean  True to let the installation proceed, false to halt the installation
	 */
	public function preflight($type, $parent)
	{
		// Check the minimum PHP version. Issue a very stern warning if it's not met.
		if (!empty($this->minimumPHPVersion))
		{
			if (defined('PHP_VERSION'))
			{
				$version = PHP_VERSION;
			}
			elseif (function_exists('phpversion'))
			{
				$version = phpversion();
			}
			else
			{
				$version = '5.0.0'; // all bets are off!
			}

			if (!version_compare($version, $this->minimumPHPVersion, 'ge'))
			{
				$msg = "<h1>Your PHP version is too old</h1>";
				$msg .= "<p>You need PHP $this->minimumPHPVersion or later to install this component. Support for PHP 5.3.3 and earlier versions has been discontinued by our company as we publicly announced in February 2013.</p>";
				$msg .= "<p>You are using PHP $version which is an extremely old version, released more than four years ago. This version contains known functional and security issues. The functional issues do not allow you to run Akeeba Backup and cannot be worked around. The security issues mean that your site <b>can be easily hacked</b> since that these security issues are well known for over four years.</p>";
				$msg .= "<p>You have to ask your host to immediately update your site to PHP $this->minimumPHPVersion or later, ideally the latest available version of PHP 5.4. If your host won't do that you are advised to switch to a better host to ensure the security of your site. If you have to stay with your current host for reasons beyond your control you can use Akeeba Backup 4.0.5 or earlier, available from our downloads page.</p>";

				JLog::add($msg, JLog::WARNING, 'jerror');

				return false;
			}
		}

		$result = parent::preflight($type, $parent);

		// Move the serverkey.php file from /akeeba to /engine to preserve the settings
		if ($result)
		{
			$componentPath = JPATH_ADMINISTRATOR . '/components/com_akeeba';
			$fromFile = $componentPath . '/akeeba/serverkey.php';
			$toFile = $componentPath . '/engine/serverkey.php';

			if (@file_exists($fromFile) && !@file_exists($toFile))
			{
				$toPath = $componentPath . '/engine';

				if (class_exists('JLoader') && method_exists('JLoader', 'import'))
				{
					JLoader::import('joomla.filesystem.folder');
					JLoader::import('joomla.filesystem.file');
				}

				if (@is_dir($componentPath) && !@is_dir($toPath))
				{
					JFolder::create($toPath);
				}

				if (@is_dir($toPath))
				{
					JFile::copy($fromFile, $toFile);
				}
			}
		}

		return $result;
	}

	/**
	 * Runs after install, update or discover_update. In other words, it executes after Joomla! has finished installing
	 * or updating your component. This is the last chance you've got to perform any additional installations, clean-up,
	 * database updates and similar housekeeping functions.
	 *
	 * @param   string     $type   install, update or discover_update
	 * @param   JInstaller $parent Parent object
	 */
	function postflight($type, $parent)
	{
		$this->isPaid = is_dir($parent->getParent()->getPath('source') . '/backend/alice');

        // Let's install common tables
        $model = F0FModel::getTmpInstance('Stats', 'AkeebaModel');

        if(method_exists($model, 'checkAndFixCommonTables'))
        {
            $model->checkAndFixCommonTables();
        }

		parent::postflight($type, $parent);

		$this->uninstallObsoletePostinstallMessages();

		$this->removeFOFUpdateSites();

		// Make sure the two plugins folders exist in Core release and are empty
		if (!$this->isPaid)
		{
			if (!JFolder::exists(JPATH_ADMINISTRATOR . '/components/com_akeeba/plugins'))
			{
				JFolder::create(JPATH_ADMINISTRATOR . '/components/com_akeeba/plugins');
			}

			if (!JFolder::exists(JPATH_ADMINISTRATOR . '/components/com_akeeba/akeeba/plugins'))
			{
				JFolder::create(JPATH_ADMINISTRATOR . '/components/com_akeeba/akeeba/plugins');
			}
		}

		// If this is a new installation tell it to NOT mark the backup profiles as configured.
		if (defined('AKEEBA_THIS_IS_INSTALLATION_FROM_SCRATCH'))
		{
			$db = F0FPlatform::getInstance()->getDbo();
			$query = $db->getQuery(true)
				->select($db->qn('params'))
				->from($db->qn('#__extensions'))
				->where($db->qn('type') . ' = ' . $db->q('component'))
				->where($db->qn('element') . ' = ' . $db->q('com_akeeba'));
			$jsonData = $db->setQuery($query)->loadResult();
			$reg = new JRegistry($jsonData);
			$reg->set('confwiz_upgrade', 1);
			$jsonData = $reg->toString('JSON');
			$query = $db->getQuery()
				->update($db->qn('#__extensions'))
				->set($db->qn('params') . ' = ' . $db->q($jsonData))
				->where($db->qn('type') . ' = ' . $db->q('component'))
				->where($db->qn('element') . ' = ' . $db->q('com_akeeba'));
			$db->setQuery($query)->execute();
		}

		// This is an update of an existing installation
		if (!defined('AKEEBA_THIS_IS_INSTALLATION_FROM_SCRATCH'))
		{
			// Migrate profiles if necessary
			$this->migrateProfiles();
		}
	}

	/**
	 * Renders the post-installation message
	 */
	protected function renderPostInstallation($status, $fofInstallationStatus, $strapperInstallationStatus, $parent)
	{
		$this->warnAboutJSNPowerAdmin();

		if (!defined('AKEEBA_PRO'))
		{
			define('AKEEBA_PRO', '0');
		}

		$videoTutorialURL = 'https://www.akeebabackup.com/videos/1212-akeeba-backup-core.html';

		if (AKEEBA_PRO)
		{
			$videoTutorialURL = 'https://www.akeebabackup.com/videos/1213-akeeba-backup-for-joomla-pro.html';
		}

		?>
		<img src="../media/com_akeeba/icons/logo-48.png" width="48" height="48" alt="Akeeba Backup" align="right"/>

		<h2>Welcome to Akeeba Backup!</h2>

		<div style="margin: 1em; font-size: 14pt; background-color: #fffff9; color: black">
			You can download translation files <a href="http://cdn.akeebabackup.com/language/akeebabackup/index.html">directly
				from our CDN page</a>.
		</div>

		<?php
		parent::renderPostInstallation($status, $fofInstallationStatus, $strapperInstallationStatus, $parent);
		?>

		<fieldset>
			<p>
				We strongly recommend watching our
				<a href="<?php echo $videoTutorialURL ?>">video
				tutorials</a> before using this component.
			</p>

			<p>
				If this is the first time you install Akeeba Backup on your site please run the
				<a href="index.php?option=com_akeeba&view=confwiz">Configuration Wizard</a>. Akeeba Backup will
				configure itself optimally for your site.
			</p>

			<p>
				By installing this component you are implicitly accepting
				<a href="https://www.akeebabackup.com/license.html">its license (GNU GPLv3)</a> and our
				<a href="https://www.akeebabackup.com/privacy-policy.html">Terms of Service</a>,
				including our Support Policy.
			</p>
		</fieldset>
	<?php
        /** @var AkeebaModelStats $model */
        $model  = F0FModel::getTmpInstance('Stats', 'AkeebaModel');

        if(method_exists($model, 'collectStatistics'))
        {
            $iframe = $model->collectStatistics(true);

            if($iframe)
            {
                echo $iframe;
            }
        }
	}

	protected function renderPostUninstallation($status, $parent)
	{
		?>
		<h2>Akeeba Backup Uninstallation Status</h2>
		<?php
		parent::renderPostUninstallation($status, $parent);
	}

	private function uninstallObsoletePostinstallMessages()
	{
		$db = F0FPlatform::getInstance()->getDbo();

		$obsoleteTitleKeys = array(
			// Remove "Upgrade profiles to ANGIE"
			'AKEEBA_POSTSETUP_LBL_ANGIEUPGRADE',
			// Remove "Enable System Restore Points"
			'AKEEBA_POSTSETUP_LBL_SRP',
			'AKEEBA_POSTSETUP_LBL_BACKUPONUPDATE',
			'AKEEBA_POSTSETUP_LBL_CONFWIZ',
			'AKEEBA_POSTSETUP_LBL_ACCEPTLICENSE',
			'AKEEBA_POSTSETUP_LBL_ACCEPTSUPPORT',
			'AKEEBA_POSTSETUP_LBL_ACCEPTBACKUPTEST',
		);

		foreach ($obsoleteTitleKeys as $obsoleteKey)
		{

			// Remove the "Upgrade profiles to ANGIE" post-installation message
			$query = $db->getQuery(true)
			            ->delete($db->qn('#__postinstall_messages'))
			            ->where($db->qn('title_key') . ' = ' . $db->q($obsoleteKey));
			try
			{
				$db->setQuery($query)->execute();
			}
			catch (Exception $e)
			{
				// Do nothing
			}
		}
	}

	/**
	 * The PowerAdmin extension makes menu items disappear. People assume it's our fault. JSN PowerAdmin authors don't
	 * own up to their software's issue. I have no choice but to warn our users about the faulty third party software.
	 */
	private function warnAboutJSNPowerAdmin()
	{
		$db = F0FPlatform::getInstance()->getDbo();
		$query = $db->getQuery(true)
			->select('COUNT(*)')
			->from($db->qn('#__extensions'))
			->where($db->qn('type') . ' = ' . $db->q('component'))
			->where($db->qn('element') . ' = ' . $db->q('com_poweradmin'))
			->where($db->qn('enabled') . ' = ' . $db->q('1'));
		$hasPowerAdmin = $db->setQuery($query)->loadResult();

		if (!$hasPowerAdmin)
		{
			return;
		}

		$query = $db->getQuery(true)
					->select('manifest_cache')
					->from($db->qn('#__extensions'))
					->where($db->qn('type') . ' = ' . $db->q('component'))
					->where($db->qn('element') . ' = ' . $db->q('com_poweradmin'))
					->where($db->qn('enabled') . ' = ' . $db->q('1'));
		$paramsJson = $db->setQuery($query)->loadResult();
		$jsnPAManifest = new JRegistry();
		$jsnPAManifest->loadString($paramsJson, 'JSON');
		$version = $jsnPAManifest->get('version', '0.0.0');

		if (version_compare($version, '2.1.2', 'ge'))
		{
			return;
		}


		echo <<< HTML
<div class="well" style="margin: 2em 0;">
<h1 style="font-size: 32pt; line-height: 120%; color: red; margin-bottom: 1em">WARNING: Menu items for {$this->componentName} might not be displayed on your site.</h1>
<p style="font-size: 18pt; line-height: 150%; margin-bottom: 1.5em">
	We have detected that you are using JSN PowerAdmin on your site. This software ignores Joomla! standards and
	<b>hides</b> the Component menu items to {$this->componentName} in the administrator backend of your site. Unfortunately we
	can't provide support for third party software. Please contact the developers of JSN PowerAdmin for support
	regarding this issue.
</p>
<p style="font-size: 18pt; line-height: 120%; color: green;">
	Tip: You can disable JSN PowerAdmin to see the menu items to Akeeba Backup.
</p>
</div>

HTML;

	}

	/**
	 * Loads the Akeeba Engine if it's not already loaded
	 */
	private function loadAkeebaEngine()
	{
		if (class_exists('\\Akeeba\\Engine\\Platform'))
		{
			return;
		}

		// Load the language files
		$paths	 = array(JPATH_ADMINISTRATOR, JPATH_ROOT);
		$jlang	 = JFactory::getLanguage();
		$jlang->load('com_akeeba', $paths[0], 'en-GB', true);
		$jlang->load('com_akeeba', $paths[1], 'en-GB', true);
		$jlang->load('com_akeeba' . '.override', $paths[0], 'en-GB', true);
		$jlang->load('com_akeeba' . '.override', $paths[1], 'en-GB', true);

		// Load the version file
		if (!defined('AKEEBA_PRO'))
		{
			@include_once JPATH_ADMINISTRATOR . '/components/com_akeeba/version.php';
		}

		if (!defined('AKEEBA_PRO'))
		{
			define('AKEEBA_PRO', '0');
		}

		// Enable Akeeba Engine
		if (!defined('AKEEBAENGINE'))
		{
			define('AKEEBAENGINE', 1);
		}

		// Load the engine
		$factoryPath = JPATH_ADMINISTRATOR . '/components/com_akeeba/engine/Factory.php';
		define('AKEEBAROOT', JPATH_ADMINISTRATOR . '/components/com_akeeba/engine');

		require_once $factoryPath;

		// Assign the correct platform
		\Akeeba\Engine\Platform::addPlatform('joomla25', JPATH_ADMINISTRATOR . '/components/com_akeeba/platform/joomla25');
	}

	/**
	 * Migrates existing backup profiles. The changes currently made are:
	 * – Change post-processing from "s3" (legacy) to "amazons3" (current version)
	 * – Fix profiles with invalid embedded installer settings
	 *
	 * @return  void
	 */
	private function migrateProfiles()
	{
		$this->loadAkeebaEngine();

		// Get a list of backup profiles
		$db = F0FPlatform::getInstance()->getDbo();
		$query = $db->getQuery(true)
					->select($db->qn('id'))
					->from($db->qn('#__ak_profiles'));
		$profiles = $db->setQuery($query)->loadColumn();

		// Normally this should never happen as we're supposed to have at least profile #1
		if (empty($profiles))
		{
			return;
		}

		// Migrate each profile
		foreach ($profiles as $profile)
		{
			// Initialization
			$dirty = false;

			// Load the profile configuration
			\Akeeba\Engine\Platform::getInstance()->load_configuration($profile);
			$config = \Akeeba\Engine\Factory::getConfiguration();

			// -- Migrate obsolete "s3" engine to "amazons3"
			$postProcType = $config->get('akeeba.advanced.postproc_engine', '');

			if ($postProcType == 's3')
			{
				$config->setKeyProtection('akeeba.advanced.postproc_engine', false);
				$config->setKeyProtection('engine.postproc.amazons3.signature', false);
				$config->setKeyProtection('engine.postproc.amazons3.accesskey', false);
				$config->setKeyProtection('engine.postproc.amazons3.secretkey', false);
				$config->setKeyProtection('engine.postproc.amazons3.usessl', false);
				$config->setKeyProtection('engine.postproc.amazons3.bucket', false);
				$config->setKeyProtection('engine.postproc.amazons3.directory', false);
				$config->setKeyProtection('engine.postproc.amazons3.rrs', false);
				$config->setKeyProtection('engine.postproc.amazons3.customendpoint', false);
				$config->setKeyProtection('engine.postproc.amazons3.legacy', false);

				$config->set('akeeba.advanced.postproc_engine', 'amazons3');
				$config->set('engine.postproc.amazons3.signature', 's3');
				$config->set('engine.postproc.amazons3.accesskey', $config->get('engine.postproc.s3.accesskey'));
				$config->set('engine.postproc.amazons3.secretkey', $config->get('engine.postproc.s3.secretkey'));
				$config->set('engine.postproc.amazons3.usessl', $config->get('engine.postproc.s3.usessl'));
				$config->set('engine.postproc.amazons3.bucket', $config->get('engine.postproc.s3.bucket'));
				$config->set('engine.postproc.amazons3.directory', $config->get('engine.postproc.s3.directory'));
				$config->set('engine.postproc.amazons3.rrs', $config->get('engine.postproc.s3.rrs'));
				$config->set('engine.postproc.amazons3.customendpoint', $config->get('engine.postproc.s3.customendpoint'));
				$config->set('engine.postproc.amazons3.legacy', $config->get('engine.postproc.s3.legacy'));

				$dirty = true;
			}

			// Fix profiles with invalid embedded installer settings
			$embeddedInstaller = $config->get('akeeba.advanced.embedded_installer');

			if (empty($embeddedInstaller) || ($embeddedInstaller == 'angie-joomla') || (
					(substr($embeddedInstaller, 0, 5) != 'angie') && ($embeddedInstaller != 'none')
				))
			{
				$config->setKeyProtection('akeeba.advanced.embedded_installer', false);
				$config->set('akeeba.advanced.embedded_installer', 'angie');
				$dirty = true;
			}

			// Save dirty records
			if ($dirty)
			{
				\Akeeba\Engine\Platform::getInstance()->save_configuration($profile);
			}
		}
	}

	/**
	 * Remove FOF 2.x update sites
	 */
	private function removeFOFUpdateSites()
	{
		$db = F0FPlatform::getInstance()->getDbo();
		$query = $db->getQuery(true)
					->delete($db->qn('#__update_sites_extensions'))
					->where($db->qn('location') . ' = ' . $db->q('http://cdn.akeebabackup.com/updates/fof.xml'));
		try
		{
			$db->setQuery($query)->execute();
		}
		catch (\Exception $e)
		{
			// Do nothing on failure
		}

	}
}components/com_akeeba/backup/web.config000060400000002247152453623440014221 0ustar00<?xml version="1.0"?>
<!--
This file was generated automatically by the Akeeba Backup Engine

DO NOT REMOVE THIS FILE

This file makes sure that your backup output directory is not directly accessible from the web if you are using the
Microsoft Internet Information Services (IIS) web server, version 7 or later. This prevents unauthorized access to your
backup archive files and backup log files. Removing this file could have security implications for your site.

As noted above, this only works on IIS 7 or later.
See https://www.iis.net/configreference/system.webserver/security/requestfiltering/fileextensions

You are strongly advised to never delete or modify any of the files automatically created in this folder by the
Akeeba Backup Engine, namely:

* .htaccess
* web.config
* index.html
* index.htm
* index.php

-->
<configuration>
    <system.webServer>
        <security>
            <requestFiltering>
                <fileExtensions allowUnlisted="false" >
                    <clear />
                    <add fileExtension=".html" allowed="true"/>
                </fileExtensions>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>components/com_akeeba/backup/.htaccess000060400000001465152453623440014054 0ustar00## This file was generated automatically by the Akeeba Backup Engine
##
## DO NOT REMOVE THIS FILE
##
## This file makes sure that your backup output directory is not directly accessible from the web if you are using
## the Apache, Lighttpd and Litespeed web server. This prevents unauthorized access to your backup archive files and
## backup log files. Removing this file could have security implications for your site.
##
## You are strongly advised to never delete or modify any of the files automatically created in this folder by the
## Akeeba Backup Engine, namely:
##
## * .htaccess
## * web.config
## * index.html
## * index.htm
## * index.php
##
<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
  <RequireAll>
    Require all denied
  </RequireAll>
</IfModule>components/com_akeeba/backup/index.htm000060400000000257152453623440014075 0ustar00<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Access Denied</title>
  </head>
  <body>
	  <h1>Access Denied</h1>
  </body>
</html>components/com_akeeba/backup/index.html000060400000000066152453623440014247 0ustar00<html><head><title></title></head><body></body></html>components/com_akeeba/backup/akeeba.log.php000064400000010067152453623440014761 0ustar00DEBUG   |20260828 09:08:05| -- Resetting Akeeba Engine factory (backend.id-20260828-090805-509758)
DEBUG   |20260828 09:08:05|Fetching filter data from database
DEBUG   |20260828 09:08:05|Loading filters
DEBUG   |20260828 09:08:05|-- Loading filter Regexskipdirs
DEBUG   |20260828 09:08:05|-- Loading filter Skipdirs
DEBUG   |20260828 09:08:05|-- Loading filter Regexdirectories
DEBUG   |20260828 09:08:05|-- Loading filter Tables
DEBUG   |20260828 09:08:05|-- Loading filter Regexskipfiles
DEBUG   |20260828 09:08:05|-- Loading filter Regextables
DEBUG   |20260828 09:08:05|-- Loading filter Regextabledata
DEBUG   |20260828 09:08:05|-- Loading filter Multidb
DEBUG   |20260828 09:08:05|-- Loading filter Skipfiles
DEBUG   |20260828 09:08:05|-- Loading filter Tabledata
DEBUG   |20260828 09:08:05|-- Loading filter Directories
DEBUG   |20260828 09:08:05|-- Loading filter Regexfiles
DEBUG   |20260828 09:08:05|-- Loading filter Extradirs
DEBUG   |20260828 09:08:05|-- Loading filter Incremental
DEBUG   |20260828 09:08:05|-- Loading filter Tablesalwaysskipped
DEBUG   |20260828 09:08:05|-- Loading filter Files
DEBUG   |20260828 09:08:05|-- Loading filter Joomlaskipfiles
DEBUG   |20260828 09:08:05|-- Loading filter Excludetabledata
DEBUG   |20260828 09:08:05|-- Loading filter Joomlaskipdirs
DEBUG   |20260828 09:08:05|-- Loading filter Cvsfolders
DEBUG   |20260828 09:08:05|-- Loading filter Siteroot
DEBUG   |20260828 09:08:05|-- Loading filter Systemcachefiles
DEBUG   |20260828 09:08:05|-- Loading filter Libraries
DEBUG   |20260828 09:08:05|-- Loading filter Sitedb
DEBUG   |20260828 09:08:05|-- Loading filter Excludefiles
DEBUG   |20260828 09:08:05|-- Loading filter Excludefolders
DEBUG   |20260828 09:08:05|Loading optional filters
DEBUG   |20260828 09:08:05|-- Loading optional filter Stack\StackErrorlogs
DEBUG   |20260828 09:08:05|-- Loading optional filter Stack\StackHoststats
DEBUG   |20260828 09:08:05|-- Loading optional filter Stack\StackFinder
DEBUG   |20260828 09:08:05|-- Loading optional filter Stack\StackActionlogs
DEBUG   |20260828 09:56:34| -- Resetting Akeeba Engine factory (backend.id-20260828-095634-74799)
DEBUG   |20260828 09:56:34|Fetching filter data from database
DEBUG   |20260828 09:56:34|Loading filters
DEBUG   |20260828 09:56:34|-- Loading filter Regexskipdirs
DEBUG   |20260828 09:56:34|-- Loading filter Skipdirs
DEBUG   |20260828 09:56:34|-- Loading filter Regexdirectories
DEBUG   |20260828 09:56:34|-- Loading filter Tables
DEBUG   |20260828 09:56:34|-- Loading filter Regexskipfiles
DEBUG   |20260828 09:56:34|-- Loading filter Regextables
DEBUG   |20260828 09:56:34|-- Loading filter Regextabledata
DEBUG   |20260828 09:56:34|-- Loading filter Multidb
DEBUG   |20260828 09:56:34|-- Loading filter Skipfiles
DEBUG   |20260828 09:56:34|-- Loading filter Tabledata
DEBUG   |20260828 09:56:34|-- Loading filter Directories
DEBUG   |20260828 09:56:34|-- Loading filter Regexfiles
DEBUG   |20260828 09:56:34|-- Loading filter Extradirs
DEBUG   |20260828 09:56:34|-- Loading filter Incremental
DEBUG   |20260828 09:56:34|-- Loading filter Tablesalwaysskipped
DEBUG   |20260828 09:56:34|-- Loading filter Files
DEBUG   |20260828 09:56:34|-- Loading filter Joomlaskipfiles
DEBUG   |20260828 09:56:34|-- Loading filter Excludetabledata
DEBUG   |20260828 09:56:34|-- Loading filter Joomlaskipdirs
DEBUG   |20260828 09:56:34|-- Loading filter Cvsfolders
DEBUG   |20260828 09:56:34|-- Loading filter Siteroot
DEBUG   |20260828 09:56:34|-- Loading filter Systemcachefiles
DEBUG   |20260828 09:56:34|-- Loading filter Libraries
DEBUG   |20260828 09:56:34|-- Loading filter Sitedb
DEBUG   |20260828 09:56:34|-- Loading filter Excludefiles
DEBUG   |20260828 09:56:34|-- Loading filter Excludefolders
DEBUG   |20260828 09:56:34|Loading optional filters
DEBUG   |20260828 09:56:34|-- Loading optional filter Stack\StackErrorlogs
DEBUG   |20260828 09:56:34|-- Loading optional filter Stack\StackHoststats
DEBUG   |20260828 09:56:34|-- Loading optional filter Stack\StackFinder
DEBUG   |20260828 09:56:34|-- Loading optional filter Stack\StackActionlogs
components/com_akeeba/Helper/.htaccess000060400000000246152453623440014022 0ustar00<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
  <RequireAll>
    Require all denied
  </RequireAll>
</IfModule>
components/com_akeeba/Helper/Utils.php000060400000007126152453623440014041 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Helper;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Joomla\CMS\Uri\Uri;
use Joomla\Filter\InputFilter;

class Utils
{
	/**
	 * Returns the relative path of directory $to to root path $from
	 *
	 * @param   string  $from  Root directory
	 * @param   string  $to    The directory whose path we want to find relative to $from
	 *
	 * @return  string  The relative path
	 */
	public static function getRelativePath($from, $to)
	{
		// some compatibility fixes for Windows paths
		$from = is_dir($from) ? rtrim($from, '\/') . '/' : $from;
		$to   = is_dir($to) ? rtrim($to, '\/') . '/' : $to;
		$from = str_replace('\\', '/', $from);
		$to   = str_replace('\\', '/', $to);

		$from    = explode('/', $from);
		$to      = explode('/', $to);
		$relPath = $to;

		foreach ($from as $depth => $dir)
		{
			// find first non-matching dir
			if ($dir === $to[$depth])
			{
				// ignore this directory
				array_shift($relPath);

				continue;
			}

			// Get number of remaining dirs to $from
			$remaining = count($from) - $depth;

			if ($remaining > 1)
			{
				// add traversals up to first matching dir
				$padLength = (count($relPath) + $remaining - 1) * -1;
				$relPath   = array_pad($relPath, $padLength, '..');

				break;
			}

			$relPath[0] = './' . $relPath[0];
		}

		return implode('/', $relPath);
	}

	/**
	 * Escapes a string for use with Javascript
	 *
	 * @param   string  $string  The string to escape
	 * @param   string  $extras  The characters to escape
	 *
	 * @return  string
	 */
	static function escapeJS($string, $extras = '')
	{
		// Make sure we escape single quotes, slashes and brackets
		if (empty($extras))
		{
			$extras = "'\\[]";
		}

		return addcslashes($string, $extras);
	}

	/**
	 * Safely decode a return URL, used in the Backup view.
	 *
	 * Return URLs can have two sources:
	 * - The Backup on Update plugin. In this case the URL is base sixty four encoded and we need to decode it first.
	 * - A custom backend menu item. In this case the URL is a simple string which does not need decoding.
	 *
	 * Further to that, we have to make a few security checks:
	 * - The URL must be internal, i.e. starts with our site's base URL or index.php (this check is executed by Joomla)
	 * - It must not contain single quotes, double quotes, lower than or greater than signs (could be used to execute
	 *   arbitrary JavaScript).
	 *
	 * If any of these violations is detected we return an empty string.
	 *
	 * @param   ?string  $returnUrl
	 *
	 * @return  string
	 */
	static function safeDecodeReturnUrl($returnUrl)
	{
		// Nulls and non-strings are not allowed
		if (is_null($returnUrl) || !is_string($returnUrl))
		{
			return '';
		}

		// Make sure it's not an empty string
		$returnUrl = trim($returnUrl);

		if (empty($returnUrl))
		{
			return '';
		}

		// Decode a base sixty four encoded string.
		$filter  = new InputFilter();
		$encoded = $filter->clean($returnUrl, 'base64');

		if (($returnUrl == $encoded) && (strpos($returnUrl, 'index.php') === false))
		{
			$possibleReturnUrl = base64_decode($returnUrl);

			if ($possibleReturnUrl !== false)
			{
				$returnUrl = $possibleReturnUrl;
			}
		}

		// Check if it's an internal URL
		if (!Uri::isInternal($returnUrl))
		{
			return '';
		}

		$disallowedCharacters = ['"', "'", '>', '<'];

		foreach ($disallowedCharacters as $check)
		{
			if (strpos($returnUrl, $check) !== false)
			{
				return '';
			}
		}

		return $returnUrl;
	}
}
components/com_akeeba/Helper/Upgrade.php000060400000002410152453623440014317 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Helper;

use FOF40\Container\Container;

class Upgrade
{
	public static function getAkeebaBackup8ExtensionId(): int
	{
		return self::findExtensionId('pkg_akeeba', 'package')
			?: self::findExtensionId('com_akeeba', 'component');
	}

	/**
	 * Gets the ID of an extension
	 *
	 * @param   string  $element  Extension element, e.g. com_foo, mod_foo, lib_foo, pkg_foo or foo (CAUTION: plugin,
	 *                            file!)
	 * @param   string  $type     Extension type: component, module, library, package, plugin or file
	 *
	 * @return  int  Extension ID or 0 on failure
	 */
	private static function findExtensionId($element, $type = 'package')
	{
		$db    = Container::getInstance('com_akeeba')->db;
		$query = $db->getQuery(true)
			->select($db->qn('extension_id'))
			->from($db->qn('#__extensions'))
			->where($db->qn('element') . ' = ' . $db->q($element))
			->where($db->qn('type') . ' = ' . $db->q($type));

		try
		{
			$id = $db->setQuery($query, 0, 1)->loadResult();
		}
		catch (\Exception $e)
		{
			$id = 0;
		}

		return empty($id) ? 0 : (int) $id;
	}

}components/com_akeeba/Helper/web.config000060400000001025152453623440014164 0ustar00<?xml version="1.0"?>
<!--
    This only works on IIS 7 or later. See https://www.iis.net/configreference/system.webserver/security/requestfiltering/fileextensions
-->
<configuration>
    <system.webServer>
        <security>
            <requestFiltering>
                <fileExtensions allowUnlisted="false" >
                    <clear />
                    <add fileExtension=".html" allowed="true"/>
                </fileExtensions>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>components/com_akeeba/Helper/SecretWord.php000060400000006315152453623440015021 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Helper;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Engine\Factory;
use FOF40\Container\Container;
use FOF40\Params\Params;

/**
 * A helper to handle potentially encrypted Secret Word settings
 *
 * @since       5.5.2
 */
abstract class SecretWord
{
	/**
	 * Enforce (reversible) encryption for the component setting $settingsKey
	 *
	 * @param   Params  $params       The component's parameters object
	 * @param   string  $settingsKey  The key for the setting containing the secret word
	 *
	 * @return  void
	 *
	 * @since   5.5.2
	 */
	public static function enforceEncryption(Params $params, $settingsKey)
	{
		// If encryption is not enabled in the Engine we can't encrypt the Secret Word
		if ($params->get('useencryption', -1) == 0)
		{
			return;
		}

		// If encryption is not supported on this server we can't encrypt the Secret Word
		if (!Factory::getSecureSettings()->supportsEncryption())
		{
			return;
		}

		// Get the raw version of frontend_secret_word and check if it has a valid encryption signature
		$raw             = $params->get($settingsKey, '');
		$signature       = substr($raw, 0, 12);
		$validSignatures = array('###AES128###', '###CTR128###');

		// If the setting is already encrypted I have nothing to do here
		if (in_array($signature, $validSignatures))
		{
			return;
		}

		// The setting was NOT encrypted. I need to encrypt it.
		$secureSettings = Factory::getSecureSettings();
		$encrypted      = $secureSettings->encryptSettings($raw);

		// Finally, I need to save it back to the database
		$params->set($settingsKey, $encrypted);
		$params->save();
	}

	/**
	 * Forcibly store the Secret Word settings $settingsKey unencrypted in the database. This is meant to be called when
	 * the user disables settings encryption. Since the encryption key will be deleted we need to decrypt the Secret
	 * Word at the same time as the Engine settings. Otherwise we will never be able to access it again.
	 *
	 * @param   Params       $params         The component parameters object
	 * @param   string       $settingsKey    The key of the Secret Word parameter
	 * @param   string|null  $encryptionKey  (Optional) The AES key with which to decrypt the parameter
	 *
	 * @return  void
	 *
	 * @since   5.5.2
	 */
	public static function enforceDecrypted(Params $params, $settingsKey, $encryptionKey = null)
	{
		// Get the raw version of frontend_secret_word and check if it has a valid encryption signature
		$raw             = $params->get($settingsKey, '');
		$signature       = substr($raw, 0, 12);
		$validSignatures = array('###AES128###', '###CTR128###');

		// If the setting is not already encrypted I have nothing to decrypt
		if (!in_array($signature, $validSignatures))
		{
			return;
		}

		// The setting was encrypted. I need to decrypt it.
		$secureSettings = Factory::getSecureSettings();
		$encrypted      = $secureSettings->decryptSettings($raw, $encryptionKey);

		// Finally, I need to save it back to the database
		$params->set($settingsKey, $encrypted);
		$params->save();
	}
}
components/com_akeeba/Helper/Status.php000060400000015137152453623440014225 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Helper;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use FOF40\Container\Container;
use FOF40\Date\Date;
use Joomla\CMS\Language\Text;

/**
 * Status helper. Used by the Control Panel and the backup page to report detected warnings which may impact your backup
 * experience.
 */
class Status
{
	/**
	 * Are we ready to take a new backup?
	 *
	 * @var  bool
	 */
	public $status = false;

	/**
	 * Is the output directory writable?
	 *
	 * @var  bool
	 */
	public $outputWritable = false;

	/**
	 * Is the temporary directory writable?
	 *
	 * @var  bool
	 */
	public $tempWritable = false;

	/**
	 * The detected warnings
	 *
	 * @var  array
	 */
	protected $warnings = [];

	/**
	 * Public constructor. Automatically initializes the object with the status and warnings.
	 *
	 * @return  self
	 */
	public function __construct()
	{
		$this->status   = Factory::getConfigurationChecks()->getShortStatus();
		$this->warnings = Factory::getConfigurationChecks()->getDetailedStatus();
	}

	/**
	 * Get a Singleton instance
	 *
	 * @return  self
	 */
	public static function &getInstance()
	{
		static $instance = null;

		if (empty($instance))
		{
			$instance = new self();
		}

		return $instance;
	}

	/**
	 * Returns the HTML for the backup status cell
	 *
	 * @return  string  HTML
	 */
	public function getStatusCell()
	{
		$status = Factory::getConfigurationChecks()->getShortStatus();
		$quirks = Factory::getConfigurationChecks()->getDetailedStatus();

		if ($status && empty($quirks))
		{
			$html = '<div class="akeeba-block--success"><p>' . Text::_('COM_AKEEBA_CPANEL_LBL_STATUS_OK') . '</p></div>';
		}
		elseif ($status && !empty($quirks))
		{
			$html = '<div class="akeeba-block--warning"><p>' . Text::_('COM_AKEEBA_CPANEL_LBL_STATUS_WARNING') . '</p></div>';
		}
		else
		{
			$html = '<div class="akeeba-block--failure"><p>' . Text::_('COM_AKEEBA_CPANEL_LBL_STATUS_ERROR') . '</p></div>';
		}

		return $html;
	}

	/**
	 * Returns HTML for the warnings (status details)
	 *
	 * @param   bool  $onlyErrors  Should I only return errors? If false (default) errors AND warnings are returned.
	 *
	 * @return  string  HTML
	 */
	public function getQuirksCell($onlyErrors = false)
	{
		$html   = '<p>' . Text::_('COM_AKEEBA_CPANEL_WARNING_QNONE') . '</p>';
		$quirks = Factory::getConfigurationChecks()->getDetailedStatus();

		if (!empty($quirks))
		{
			$html = "<ul>\n";

			foreach ($quirks as $quirk)
			{
				$html .= $this->renderWarnings($quirk, $onlyErrors);
			}

			$html .= "</ul>\n";
		}

		return $html;
	}

	/**
	 * Returns a boolean value, indicating if warnings have been detected.
	 *
	 * @return  bool  True if there is at least one detected warnings
	 */
	public function hasQuirks()
	{
		$quirks = Factory::getConfigurationChecks()->getDetailedStatus();

		return !empty($quirks);
	}

	/**
	 * Returns the details of the latest backup as HTML
	 *
	 * @return  string  HTML
	 */
	public function getLatestBackupDetails()
	{
		$db    = Container::getInstance('com_akeeba')->db;
		$query = $db->getQuery(true)
			->select('MAX(' . $db->qn('id') . ')')
			->from($db->qn('#__ak_stats'));
		$db->setQuery($query);
		$id = $db->loadResult();

		$backup_types = Factory::getEngineParamsProvider()->loadScripting();

		if (empty($id))
		{
			return '<p class="label">' . Text::_('COM_AKEEBA_BACKUP_STATUS_NONE') . '</p>';
		}

		$record = Platform::getInstance()->get_statistics($id);

		switch ($record['status'])
		{
			case 'run':
				$status      = Text::_('COM_AKEEBA_BUADMIN_LABEL_STATUS_PENDING');
				$statusClass = "akeeba-label--warning";
				break;

			case 'fail':
				$status      = Text::_('COM_AKEEBA_BUADMIN_LABEL_STATUS_FAIL');
				$statusClass = "akeeba-label--failure";
				break;

			case 'complete':
				$status      = Text::_('COM_AKEEBA_BUADMIN_LABEL_STATUS_OK');
				$statusClass = "akeeba-label--success";
				break;

			default:
				$status      = '';
				$statusClass = '';
		}

		switch ($record['origin'])
		{
			case 'frontend':
				$origin = Text::_('COM_AKEEBA_BUADMIN_LABEL_ORIGIN_FRONTEND');
				break;

			case 'backend':
				$origin = Text::_('COM_AKEEBA_BUADMIN_LABEL_ORIGIN_BACKEND');
				break;

			case 'cli':
				$origin = Text::_('COM_AKEEBA_BUADMIN_LABEL_ORIGIN_CLI');
				break;

			default:
				$origin = '&ndash;';
				break;
		}

		$type = '';

		if (array_key_exists($record['type'], $backup_types['scripts']))
		{
			$type = Platform::getInstance()->translate($backup_types['scripts'][$record['type']]['text']);
		}

		$container = Container::getInstance('com_akeeba');
		$startTime = new Date($record['backupstart'], 'UTC');
		$tz        = new \DateTimeZone($container->platform->getUser()->getParam('timezone', $container->platform->getConfig()->get('offset', 'UTC')));
		$startTime->setTimezone($tz);

		$html = '<table class="akeeba-table--striped">';
		$html .= '<tr><td>' . Text::_('COM_AKEEBA_BUADMIN_LABEL_START') . '</td><td>' . $startTime->format(Text::_('DATE_FORMAT_LC2'), true) . '</td></tr>';
		$html .= '<tr><td>' . Text::_('COM_AKEEBA_BUADMIN_LABEL_DESCRIPTION') . '</td><td>' . $record['description'] . '</td></tr>';
		$html .= '<tr><td>' . Text::_('COM_AKEEBA_BUADMIN_LABEL_STATUS') . '</td><td><span class="label ' . $statusClass . '">' . $status . '</span></td></tr>';
		$html .= '<tr><td>' . Text::_('COM_AKEEBA_BUADMIN_LABEL_ORIGIN') . '</td><td>' . $origin . '</td></tr>';
		$html .= '<tr><td>' . Text::_('COM_AKEEBA_BUADMIN_LABEL_TYPE') . '</td><td>' . $type . '</td></tr>';
		$html .= '</table>';

		return $html;
	}

	/**
	 * Gets the HTML for a single line of the warnings area.
	 *
	 * @param   array  $quirk       A quirk definition array
	 * @param   bool   $onlyErrors  Should I only return errors? If false (default) errors AND warnings are returned.
	 *
	 * @return  string  HTML
	 */
	private function renderWarnings($quirk, $onlyErrors = false)
	{
		if ($onlyErrors && ($quirk['severity'] != 'critical'))
		{
			return '';
		}

		$quirk['severity'] = $quirk['severity'] == 'critical' ? 'high' : $quirk['severity'];

		if ($quirk['code'] == 400)
		{
			return sprintf("<li><a class=\"severity-%s\" href=\"%s\" target=\"_blank\">%s</a></li>\n", $quirk['severity'], 'https://www.akeeba.com/documentation/akeeba-backup-joomla/migrating-from-old-akeeba-backup.html', $quirk['description']);
		}

		return '<li><a class="severity-' . $quirk['severity'] .
			'" href="' . $quirk['help_url'] . '" target="_blank">' . $quirk['description'] . '</a>' . "</li>\n";

	}

}
components/com_akeeba/tmpl/ControlPanel/backup8_uninstall.blade.php000060400000002214152453623440021563 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

$eid = \Akeeba\Backup\Admin\Helper\Upgrade::getAkeebaBackup8ExtensionId();
$url = sprintf('index.php?option=com_installer&view=manage&filter[search]=id%%3A%d&filter[status]=&filter[client_id]=&filter[type]=&filter[folder]=&filter[core]=', $eid)

?>
<h1>🚨 Please complete your migration to Akeeba Backup 9 🚨</h1>
<p style="font-size: 1.5rem; margin: 1rem 0 0">
	Please click on Components, Akeeba Backup for Joomla!&trade;, Control Panel to open <a href="index.php?option=com_akeebabackup">Akeeba Backup 9</a>'s interface.
</p>
<p style="font-size: 1.5rem; margin: 1rem 0 0">
	Follow the instructions shown in Akeeba Backup 9 to migrate your settings and backups from Akeeba Backup 8 to Akeeba Backup 9.
</p>
<p style="font-size: 1.5rem; margin: 1rem 0 0">
	After you are done migrating please <a href="<?= $url ?>">uninstall Akeeba Backup 8</a>.
</p>
components/com_akeeba/tmpl/ControlPanel/profile.blade.php000060400000003250152453623440017576 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

/**
 * Call this template with:
 * [
 * 	'returnURL' => 'index.php?......'
 * ]
 * to set up a custom return URL
 */
?>
@jhtml('formbehavior.chosen')

<div class="akeeba-panel">
	<form action="index.php" method="post" name="switchActiveProfileForm" id="switchActiveProfileForm" class="akeeba-form--inline">
		<input type="hidden" name="option" value="com_akeeba" />
		<input type="hidden" name="view" value="ControlPanel" />
		<input type="hidden" name="task" value="SwitchProfile" />
		@if(isset($returnURL))
		<input type="hidden" name="returnurl" value="{{ $returnURL }}" />
		@endif
		<input type="hidden" name="@token(true)" value="1" />

		<div class="akeeba-form-group">
			<label>
				@lang('COM_AKEEBA_CPANEL_PROFILE_TITLE'): #{{ $this->profileId }}
			</label>

			{{-- Joomla 3.x: Chosen does not work with attached event handlers, only with inline event scripts (e.g. onchange) --}}
			@jhtml('select.genericlist', $this->profileList, 'profileid', ['list.select' => $this->profileId, 'id' => 'comAkeebaControlPanelProfileSwitch', 'list.attr' => ['class' => 'advancedSelect', 'onchange' => 'document.forms.switchActiveProfileForm.submit();']])
		</div>

		<div class="akeeba-form-group--actions">
			<button class="akeeba-btn akeeba-hidden-phone" type="submit">
				<span class="akion-forward"></span>
				@lang('COM_AKEEBA_CPANEL_PROFILE_BUTTON')
			</button>
		</div>
	</form>
</div>
components/com_akeeba/tmpl/ControlPanel/default.xml000060400000000557152453623440016534 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->
<metadata>
	<layout title="COM_AKEEBA_VIEW_CPANEL_TITLE">
		<message>
			<![CDATA[COM_AKEEBA_VIEW_CPANEL_DESC]]>
		</message>
	</layout>
</metadata>
components/com_akeeba/tmpl/ControlPanel/backup9_install.blade.php000060400000012017152453623440021223 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

if (version_compare(JVERSION, '4.1.0', 'ge'))
{
	$css = <<< CSS
#akeebaBackup8Wrapper {
    display: none;
}

CSS;

	$js = <<< JS
function akeebaBackup8RegisterWrapperReveal(e) {
    var elDiv = document.getElementById('akeebaBackup8Wrapper');
    var elUpgradeWrapper = document.getElementById('akeebaBackup8UpgradeWrapper');
    var elToggleWrapper = document.getElementById('akeebaBackup8WrapperToggleWrapper');
    var elUnsafeWrapper = document.getElementById('akeebaBackup8UnsafeWrapper');
    if (elDiv) {
        elDiv.style.display = 'block';
    }
    if (elUnsafeWrapper) {
        elUnsafeWrapper.style.display = 'block';
    }
    if (elUpgradeWrapper) {
        elUpgradeWrapper.style.display = 'none';
    }
    if (elToggleWrapper) {
        elToggleWrapper.style.display = 'none';
    }
}

document.addEventListener("DOMContentLoaded", function () {
    var elLink = document.getElementById('akeebaBackup8WrapperToggle');
    if (!elLink) return;
    elLink.addEventListener('click', akeebaBackup8RegisterWrapperReveal);
}, false);

var akeebaBackup8RegisterWrapperRevealTimer = setInterval(function () {
            if(document.readyState !== "complete") return;
            clearInterval(akeebaBackup8RegisterWrapperRevealTimer);
         }, 300);

JS;


	$this->addCssInline($css);
    $this->addJavascriptInline($js);
}

?>

<div class="akeeba-block--warning--large" id="akeebaBackup8UpgradeWrapper">
    <h1>🚨 🚨 🚨 Please upgrade to Akeeeba Backup 9 🚨 🚨 🚨</h1>
    @if (version_compare(JVERSION, '4.1.0', 'ge'))
        <p style="font-size: 1.5rem; margin: 1rem 0 0">
            You are currently using Akeeba Backup 8. This version is only meant to allow you to upgrade from Joomla 3 to Joomla 4 without losing your backup archives and settings. <strong>It is not supported for taking on restoring backups with Joomla {{ JVERSION }}</strong>.
        </p>
    @else
        <p style="font-size: 1.5rem; margin: 1rem 0 0">
            You are currently using Akeeba Backup 8. This version was only made minimally compatible with Joomla 4 to allow you to upgrade from Joomla 3 to Joomla 4 without losing your backup archives and settings. We will not provide support for Akeeba Backup 8 running on Joomla 4.0 and later.
        </p>
    @endif
    <p style="font-size: 1.5rem; margin: 1rem 0 0">
        You need to <a href="https://www.akeeba.com/download.html" target="_blank">download</a> and install Akeeba Backup 9, our Joomla 4 native version of Akeeba Backup. It is fully supported for use on Joomla 4.
    </p>
    <p style="font-size: 1.5rem; margin: 1rem 0 0">
        After installing Akeeba Backup 9 please click on Components, Akeeba Backup <small>for Joomla!&trade;</small>, Control Panel from Joomla's sidebar and follow the instructions on your screen to migrate your settings and your backups from Akeeba Backup 8.
    </p>
    <p>
        <a href="https://www.akeeba.com/download.html" class="akeeba-btn--green--big--block" style="font-size: 1.5rem; margin: 2rem 0">
            <span class="akion akion-ios-download" aria-hidden="true"></span>
            Download Akeeba Backup 9 now
        </a>
    </p>
</div>

@if (version_compare(JVERSION, '4.1.0', 'ge'))
<p class="small" id="akeebaBackup8WrapperToggleWrapper">
    <a href="#" id="akeebaBackup8WrapperToggle">
        I would like to use Akeeba Backup 8 <em>at my own risk</em>
    </a>
    <br/>
    <span style="font-size: smaller">
    By clicking this link you agree that you are doing something we explicitly told you NOT to do, you are fully responsible for your actions and their consequences, the interface or functionality might be broken, you might lose data or damage your site, and that you are not eligible for any support whatsoever.
    </span>
</p>

<div class="akeeba-block--failure--large" id="akeebaBackup8UnsafeWrapper" style="display: none">
    <h3>You are using Akeeba Backup in an UNSUPPORTED environment AT YOUR OWN RISK</h3>
    <p>
        Akeeba Backup 8 is NOT supported for use on Joomla! <?= JVERSION ?>.
    </p>
    <p>
        You have chosen to use it anyway, AT YOUR OWN RISK. By doing this you understand that:
    </p>
    <ul>
        <li>you are doing something we explicitly told you <u>NOT</u> to do.</li>
        <li>you are fully responsible for your actions <strong>and</strong> their consequences.</li>
        <li>the interface or the functionality of the component may be not work fully, correctly or at all.</li>
        <li>you might lose data or otherwise damage your site.</li>
        <li>you are not eligible for <em>ANY SUPPORT WHATSOEVER</em>.</li>
    </ul>
    <p>
        We <strong>VERY STRONGLY</strong> advise you to upgrade to the latest version of Akeeba Backup 9 or later.
    </p>
    <p>
        Consider yourself warned.
    </p>
</div>
@endif
components/com_akeeba/tmpl/ControlPanel/icons_basic.blade.php000060400000003451152453623440020415 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

?>
<section class="akeeba-panel--info">
    <header class="akeeba-block-header">
        <h3>@lang('COM_AKEEBA_CPANEL_HEADER_BASICOPS')</h3>
    </header>

    <div class="akeeba-grid">
	    @if($this->permissions['backup'])
            <a class="akeeba-action--green"
               href="index.php?option=com_akeeba&view=Backup">
                <span class="akion-play"></span>
	            @lang('COM_AKEEBA_BACKUP')
            </a>
	    @endif

	    @if($this->permissions['download'] && AKEEBA_PRO)
            <a class="akeeba-action--green"
                href="index.php?option=com_akeeba&view=Transfer">
                <span class="akion-android-open"></span>
	            @lang('COM_AKEEBA_TRANSFER')
            </a>
	    @endif

        <a class="akeeba-action--teal"
            href="index.php?option=com_akeeba&view=Manage">
            <span class="akion-ios-list"></span>
	        @lang('COM_AKEEBA_BUADMIN')
        </a>

	    @if($this->permissions['configure'])
            <a class="akeeba-action--teal"
                href="index.php?option=com_akeeba&view=Configuration">
                <span class="akion-ios-gear"></span>
	            @lang('COM_AKEEBA_CONFIG')
            </a>
	    @endif

	    @if($this->permissions['configure'])
            <a class="akeeba-action--teal"
                href="index.php?option=com_akeeba&view=Profiles">
                <span class="akion-person-stalker"></span>
	            @lang('COM_AKEEBA_PROFILES')
            </a>
	    @endif
    </div>
</section>
components/com_akeeba/tmpl/ControlPanel/sidebar_status.blade.php000060400000004475152453623440021164 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

?>
<div class="akeeba-panel">
    <header class="akeeba-block-header">
        <h3>@lang('COM_AKEEBA_CPANEL_LABEL_STATUSSUMMARY')</h3>
    </header>

    <div>
        {{-- Backup status summary --}}
        {{ $this->statusCell }}

        {{-- Warnings --}}
        @if($this->countWarnings)
            <div>
                {{ $this->detailsCell }}
            </div>
            <hr />
        @endif

        {{-- Version --}}
        <p class="ak_version">
            @lang('COM_AKEEBA') {{ AKEEBA_PRO ? 'Professional ' : 'Core'; }} {{ AKEEBA_VERSION }} ({{ AKEEBA_DATE }})
        </p>

        {{-- Changelog --}}
        <a href="#" id="btnchangelog" class="akeeba-btn--primary">CHANGELOG</a>

        <div id="akeeba-changelog" tabindex="-1" role="dialog" aria-hidden="true" style="display:none;">
            <div class="akeeba-renderer-fef">
                <div class="akeeba-panel--info">
                    <header class="akeeba-block-header">
                        <h3>
                            @lang('CHANGELOG')
                        </h3>
                    </header>
                    <div id="DialogBody">
                        {{ $this->formattedChangelog }}
                    </div>
                </div>
            </div>
        </div>

        {{-- Donation CTA --}}
        @if( ! (AKEEBA_PRO))
            <a
                    href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=KDVQPB4EREBPY&source=url"
                    class="akeeba-btn-green">
                Donate via PayPal
            </a>
        @endif

        {{-- Pro upsell --}}
        @if(!AKEEBA_PRO && (time() - $this->lastUpsellDismiss < 1296000))
            <p style="margin: 0.5em 0">
                <a href="https://www.akeeba.com/landing/akeeba-backup.html"
                   class="akeeba-btn--ghost--small">
                    <span class="aklogo-backup-j"></span>
                    @lang('COM_AKEEBA_CONTROLPANEL_BTN_LEARNMORE')
                </a>
            </p>
        @endif
    </div>
</div>
components/com_akeeba/tmpl/ControlPanel/icons_troubleshooting.blade.php000060400000002063152453623440022561 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

?>
<section class="akeeba-panel--info">
    <header class="akeeba-block-header">
        <h3>@lang('COM_AKEEBA_CPANEL_HEADER_TROUBLESHOOTING')</h3>
    </header>

    <div class="akeeba-grid">
	    @if($this->permissions['backup'])
            <a class="akeeba-action--teal"
                href="index.php?option=com_akeeba&view=Log">
                <span class="akion-ios-search-strong"></span>
	            @lang('COM_AKEEBA_LOG')
            </a>
	    @endif

	    @if(AKEEBA_PRO && $this->permissions['configure'])
            <a class="akeeba-action--teal"
                href="index.php?option=com_akeeba&view=Alice">
                <span class="akion-medkit"></span>
	            @lang('COM_AKEEBA_ALICE')
            </a>
	    @endif
    </div>
</section>
components/com_akeeba/tmpl/ControlPanel/warnings.blade.php000060400000023066152453623440017775 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

$cloudFlareTestFile = 'CLOUDFLARE::' . $this->getContainer()->template->parsePath('media://com_akeeba/js/ControlPanel.min.js');
$cloudFlareTestFile .= '?' . $this->getContainer()->mediaVersion;

?>

{{-- Configuration Wizard pop-up --}}
@if($this->promptForConfigurationWizard)
    @include('admin:com_akeeba/Configuration/confwiz_modal')
@endif

{{-- Stuck database updates warning --}}
@if ($this->stuckUpdates)
    <div class="akeeba-block--warning">
        <p>
            @sprintf('COM_AKEEBA_CPANEL_ERR_UPDATE_STUCK', $this->getContainer()->db->getPrefix(), 'index.php?option=com_akeeba&view=ControlPanel&task=forceUpdateDb')
        </p>
    </div>
@endif

{{-- Potentially web accessible output directory --}}
@if ($this->isOutputDirectoryUnderSiteRoot)
    <!--
    Oh, hi there! It looks like you got curious and are peeking around your browser's developer tools – or just the
    source code of the page that loaded on your browser. Cool! May I explain what we are seeing here?

    Just to let you know, the next three DIVs (outDirSystem, insecureOutputDirectory and missingRandomFromFilename) are
    HIDDEN and their existence doesn't mean that your site has an insurmountable security issue. To the contrary.
    Whenever Akeeba Backup detects that the backup output directory is under your site's root it will CHECK its security
    i.e. if it's really accessible over the web. This check is performed with an AJAX call to your browser so if it
    takes forever or gets stuck you won't see a frustrating blank page in your browser. If AND ONLY IF a problem is
    detected said JavaScript will display one of the following DIVs, depending on what is applicable.

    So, to recap. These hidden DIVs? They don't indicate a problem with your site. If one becomes visible then – and
    ONLY then – should you do something about it, as instructed. But thank you for being curious. Curiosity is how you
    get involved with and better at web development. Stay curious!
    -->
    {{-- Web accessible output directory that coincides with or is inside in a CMS system folder --}}
    <details class="akeeba-block--failure" id="outDirSystem" style="display: none">
        <summary>@lang('COM_AKEEBA_CPANEL_HEAD_OUTDIR_INVALID')</summary>
        <p>
            @sprintf('COM_AKEEBA_CPANEL_LBL_OUTDIR_LISTABLE', realpath($this->getModel()->getOutputDirectory()))
        </p>
        <p>
            @lang('COM_AKEEBA_CPANEL_LBL_OUTDIR_ISSYSTEM')
        </p>
        <p>
            @lang('COM_AKEEBA_CPANEL_LBL_OUTDIR_ISSYSTEM_FIX')
            @lang('COM_AKEEBA_CPANEL_LBL_OUTDIR_DELETEORBEHACKED')
        </p>
    </details>

    {{-- Output directory can be listed over the web --}}
    <details class="akeeba-block--{{ $this->hasOutputDirectorySecurityFiles ? 'failure' : 'warning' }}" id="insecureOutputDirectory" style="display: none">
        <summary>
            @if ($this->hasOutputDirectorySecurityFiles)
            @lang('COM_AKEEBA_CPANEL_HEAD_OUTDIR_UNFIXABLE')
            @else
            @lang('COM_AKEEBA_CPANEL_HEAD_OUTDIR_INSECURE')
            @endif
        </summary>
        <p>
            @sprintf('COM_AKEEBA_CPANEL_LBL_OUTDIR_LISTABLE', realpath($this->getModel()->getOutputDirectory()))
        </p>
        @if (!$this->hasOutputDirectorySecurityFiles)
        <p>
            @lang('COM_AKEEBA_CPANEL_LBL_OUTDIR_CLICKTHEBUTTON')
        </p>
        <p>
            @lang('COM_AKEEBA_CPANEL_LBL_OUTDIR_FIX_SECURITYFILES')
        </p>

        <form action="index.php" method="POST" class="akeeba-form--inline">
            <input type="hidden" name="option" value="com_akeeba">
            <input type="hidden" name="view" value="ControlPanel">
            <input type="hidden" name="task" value="fixOutputDirectory">
            <input type="hidden" name="@token()" value="1">

            <button type="submit" class="akeeba-btn--block--green">
                <span class="akion-hammer"></span>
                @lang('COM_AKEEBA_CPANEL_BTN_FIXSECURITY')
            </button>
        </form>
        @else
        <p>
            @lang('COM_AKEEBA_CPANEL_LBL_OUTDIR_TRASHHOST')
            @lang('COM_AKEEBA_CPANEL_LBL_OUTDIR_DELETEORBEHACKED')
        </p>
        @endif
    </details>

    {{-- Output directory cannot be listed over the web but I can download files --}}
    <details class="akeeba-block--warning" id="missingRandomFromFilename" style="display: none">
        <summary>
            @lang('COM_AKEEBA_CPANEL_HEAD_OUTDIR_INSECURE_ALT')
        </summary>
        <p>
            @sprintf('COM_AKEEBA_CPANEL_LBL_OUTDIR_FILEREADABLE', realpath($this->getModel()->getOutputDirectory()))
        </p>
        <p>
            @lang('COM_AKEEBA_CPANEL_LBL_OUTDIR_CLICKTHEBUTTON')
        </p>
        <p>
            @lang('COM_AKEEBA_CPANEL_LBL_OUTDIR_FIX_RANDOM')
        </p>

        <form action="index.php" method="POST" class="akeeba-form--inline">
            <input type="hidden" name="option" value="com_akeeba">
            <input type="hidden" name="view" value="ControlPanel">
            <input type="hidden" name="task" value="addRandomToFilename">
            <input type="hidden" name="@token()" value="1">

            <button type="submit" class="akeeba-btn--block--green">
                <span class="akion-hammer"></span>
                @lang('COM_AKEEBA_CPANEL_BTN_FIXSECURITY')
            </button>
        </form>
    </details>

@endif

{{-- mbstring warning --}}
@unless($this->checkMbstring)
    <div class="akeeba-block--warning">
        @sprintf('COM_AKEEBA_CPANL_ERR_MBSTRING', PHP_VERSION)
    </div>
@endunless

{{-- Front-end backup secret word reminder --}}
@unless(empty($this->frontEndSecretWordIssue))
    <details class="akeeba-block--failure">
        <summary>@lang('COM_AKEEBA_CPANEL_ERR_FESECRETWORD_HEADER')</summary>
        <p>@lang('COM_AKEEBA_CPANEL_ERR_FESECRETWORD_INTRO')</p>
        <p>{{ $this->frontEndSecretWordIssue }}</p>
        <p>
            @lang('COM_AKEEBA_CPANEL_ERR_FESECRETWORD_WHATTODO_JOOMLA')
            @sprintf('COM_AKEEBA_CPANEL_ERR_FESECRETWORD_WHATTODO_COMMON', $this->newSecretWord)
        </p>
        <p>
            <a class="akeeba-btn--green akeeba-btn--big"
               href="index.php?option=com_akeeba&view=ControlPanel&task=resetSecretWord&@token(true)=1">
                <span class="akion-refresh"></span>
                @lang('COM_AKEEBA_CPANEL_BTN_FESECRETWORD_RESET')
            </a>
        </p>
    </details>
@endunless

{{-- Wrong media directory permissions --}}
@unless($this->areMediaPermissionsFixed)
    <details id="notfixedperms" class="akeeba-block--failure">
        <summary>@lang('COM_AKEEBA_CONTROLPANEL_WARN_WARNING')</summary>
        <p>@lang('COM_AKEEBA_CONTROLPANEL_WARN_PERMS_L1')</p>
        <p>@lang('COM_AKEEBA_CONTROLPANEL_WARN_PERMS_L2')</p>
        <ol>
            <li>@lang('COM_AKEEBA_CONTROLPANEL_WARN_PERMS_L3A')</li>
            <li>@lang('COM_AKEEBA_CONTROLPANEL_WARN_PERMS_L3B')</li>
        </ol>
        <p>@lang('COM_AKEEBA_CONTROLPANEL_WARN_PERMS_L4')</p>
    </details>
@endunless

{{-- You need to enter your Download ID --}}
@if($this->needsDownloadID)
    <details class="akeeba-block--warning">
        <summary>
            @lang('COM_AKEEBA_CPANEL_MSG_MUSTENTERDLID')
        </summary>
        <p>
            @sprintf('COM_AKEEBA_LBL_CPANEL_NEEDSDLID','https://www.akeeba.com/download/official/add-on-dlid.html')
        </p>
        <form name="dlidform" action="index.php" method="post" class="akeeba-form--inline">
            <input type="hidden" name="option" value="com_akeeba" />
            <input type="hidden" name="view" value="ControlPanel" />
            <input type="hidden" name="task" value="applydlid" />
            <input type="hidden" name="@token(true)" value="1" />
            <div class="akeeba-form-group">
                <label for="dlid">@lang('COM_AKEEBA_CPANEL_MSG_PASTEDLID')</label>
                <input type="text" name="dlid" placeholder="@lang('COM_AKEEBA_CONFIG_DOWNLOADID_LABEL')"
                       class="akeeba-input--wide">

                <button type="submit" class="akeeba-btn--green">
                    <span class="akion-checkmark-round"></span>
                    @lang('COM_AKEEBA_CPANEL_MSG_APPLYDLID')
                </button>
            </div>
        </form>
    </details>
@endif

{{-- You have CORE; you need to upgrade, not just enter a Download ID --}}
@if($this->coreWarningForDownloadID)
    <div class="akeeba-block--warning">
        @sprintf('COM_AKEEBA_LBL_CPANEL_NEEDSUPGRADE','http://akee.ba/abcoretopro')
    </div>
@endif

{{-- Warn about CloudFlare Rocket Loader --}}
<details class="akeeba-block--failure" style="display: none;" id="cloudFlareWarn">
    <summary>@lang('COM_AKEEBA_CPANEL_MSG_CLOUDFLARE_WARN')</summary>
    <p>@sprintf('COM_AKEEBA_CPANEL_MSG_CLOUDFLARE_WARN1', 'https://support.cloudflare.com/hc/en-us/articles/200169456-Why-is-JavaScript-or-jQuery-not-working-on-my-site-')</p>
</details>
<?php
/**
 * DO NOT USE INLINE JAVASCRIPT FOR THIS SCRIPT. DO NOT REMOVE THE ATTRIBUTES.
 *
 * This is a specialised test which looks for CloudFlare's completely broken RocketLoader feature and warns the user
 * about it.
 */
?>
<script type="text/javascript" data-cfasync="true">
    var test = localStorage.getItem('<?php echo $cloudFlareTestFile?>');
    if (test)
    {
        document.getElementById("cloudFlareWarn").style.display = "block";
    }
</script>
components/com_akeeba/tmpl/ControlPanel/upgrade.blade.php000060400000002760152453623440017572 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

// Only show in the Core version with a 10% probability
if (AKEEBA_PRO) return;

// Only show if it's at least 15 days since the last time the user dismissed the upsell
if (time() - $this->lastUpsellDismiss < 1296000) return;

?>
<div class="akeeba-panel--orange">
    <header class="akeeba-block-header">
        <h3>
            <span class="akion-ios-star"></span>
            @lang('COM_AKEEBA_CONTROLPANEL_HEAD_PROUPSELL')
        </h3>
    </header>

    <p>@lang('COM_AKEEBA_CONTROLPANEL_HEAD_LBL_PROUPSELL_1')</p>

    <p class="akeeba-block--info">@sprintf('COM_AKEEBA_CONTROLPANEL_HEAD_LBL_DISCOUNT',
        base64_decode('SVdBTlRJVEFMTA=='))</p>

    <p>@lang('COM_AKEEBA_CONTROLPANEL_HEAD_LBL_PROUPSELL_2')</p>

    <p>
        <a href="https://www.akeeba.com/landing/akeeba-backup.html"
           class="akeeba-btn--large--primary">
            <span class="aklogo-backup-j"></span>
            @lang('COM_AKEEBA_CONTROLPANEL_BTN_LEARNMORE')
        </a>

        <a href="@route('index.php?view=ControlPanel&task=dismissUpsell')" class="akeeba-btn--ghost--small">
            <span class="akion-ios-alarm"></span>
            @lang('COM_AKEEBA_CONTROLPANEL_BTN_HIDE')
        </a>
    </p>
</div>
components/com_akeeba/tmpl/ControlPanel/sidebar_backup.blade.php000060400000000756152453623440021104 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

?>
<div class="akeeba-panel">
    <header class="akeeba-block-header">
        <h3>@lang('COM_AKEEBA_BACKUP_STATS')</h3>
    </header>
    <div>{{ $this->latestBackupCell }}</div>
</div>
components/com_akeeba/tmpl/ControlPanel/oneclick.blade.php000060400000001575152453623440017735 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

?>
<section class="akeeba-panel--primary">

    <header class="akeeba-block-header">
        <h3>@lang('COM_AKEEBA_CPANEL_HEADER_QUICKBACKUP')</h3>
    </header>

    <div class=" akeeba-grid">
	    @foreach($this->quickIconProfiles as $qiProfile)
            <a class="akeeba-action--green"
               href="index.php?option=com_akeeba&view=Backup&autostart=1&profileid={{ (int) $qiProfile->id }}&@token(true)=1">
                <span class="akion-play"></span>
                <span>{{{ $qiProfile->description }}}</span>
            </a>
	    @endforeach
    </div>

</section>
components/com_akeeba/tmpl/ControlPanel/default.blade.php000060400000004107152453623440017564 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

?>
@if (class_exists('Joomla\CMS\Component\ComponentHelper') && \Joomla\CMS\Component\ComponentHelper::isEnabled('com_akeebabackup'))
	@include('admin:com_akeeba/ControlPanel/backup8_uninstall')
	<?php return; ?>
@elseif (version_compare(JVERSION, '3.999.999', 'gt'))
	@include('admin:com_akeeba/ControlPanel/backup9_install')
@endif

<div id="akeebaBackup8Wrapper">
{{-- Display various possible warnings about issues which directly affect the user's experience --}}
@include('admin:com_akeeba/ControlPanel/warnings')

{{-- Main area --}}
<div class="akeeba-container--66-33">
	{{-- LEFT COLUMN (66% desktop width) --}}
	<div>
		{{-- Active profile switch --}}
		@include('admin:com_akeeba/ControlPanel/profile')

		{{-- One Click Backup icons --}}
		@if( ! (empty($this->quickIconProfiles)) && $this->permissions['backup'])
			@include('admin:com_akeeba/ControlPanel/oneclick')
		@endif

		{{-- Basic operations --}}
		@include('admin:com_akeeba/ControlPanel/icons_basic')

		{{-- Core Upgrade --}}
		@include('admin:com_akeeba/ControlPanel/upgrade')

		{{-- Troubleshooting --}}
		@include('admin:com_akeeba/ControlPanel/icons_troubleshooting')

		{{-- Advanced operations --}}
		@include('admin:com_akeeba/ControlPanel/icons_advanced')

		{{-- Include / Exclude data --}}
		@if($this->permissions['configure'])
			@include('admin:com_akeeba/ControlPanel/icons_includeexclude')
		@endif
	</div>
	{{-- RIGHT COLUMN (33% desktop width) --}}
	<div>
		{{-- Status Summary --}}
		@include('admin:com_akeeba/ControlPanel/sidebar_status')

		{{-- Backup stats --}}
		@include('admin:com_akeeba/ControlPanel/sidebar_backup')
	</div>
</div>

{{-- Footer --}}
@include('admin:com_akeeba/ControlPanel/footer')
</div>

{{-- Usage statistics collection IFRAME --}}
@if ($this->statsIframe)
	{{ $this->statsIframe }}
@endifcomponents/com_akeeba/tmpl/ControlPanel/icons_includeexclude.blade.php000060400000003645152453623440022336 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

?>

<section class="akeeba-panel--info">
    <header class="akeeba-block-header">
        <h3>@lang('COM_AKEEBA_CPANEL_HEADER_INCLUDEEXCLUDE')</h3>
    </header>

    <div class="akeeba-grid">
        @if(AKEEBA_PRO)
            <a class="akeeba-action--green"
                href="index.php?option=com_akeeba&view=MultipleDatabases">
                <span class="akion-arrow-swap"></span>
	            @lang('COM_AKEEBA_MULTIDB')
            </a>

            <a class="akeeba-action--green"
                href="index.php?option=com_akeeba&view=IncludeFolders">
                <span class="akion-folder"></span>
	            @lang('COM_AKEEBA_INCLUDEFOLDER')
            </a>
        @endif

        <a class="akeeba-action--red"
            href="index.php?option=com_akeeba&view=FileFilters">
            <span class="akion-filing"></span>
	        @lang('COM_AKEEBA_FILEFILTERS')
        </a>

        <a class="akeeba-action--red"
            href="index.php?option=com_akeeba&view=DatabaseFilters">
            <span class="akion-ios-grid-view"></span>
	        @lang('COM_AKEEBA_DBFILTER')
        </a>

        @if(AKEEBA_PRO)
            <a class="akeeba-action--red"
                href="index.php?option=com_akeeba&view=RegExFileFilters">
                <span class="akion-ios-folder"></span>
	            @lang('COM_AKEEBA_REGEXFSFILTERS')
            </a>

            <a class="akeeba-action--red"
                href="index.php?option=com_akeeba&view=RegExDatabaseFilters">
                <span class="akion-ios-box"></span>
	            @lang('COM_AKEEBA_REGEXDBFILTERS')
            </a>
        @endif

    </div></section>
components/com_akeeba/tmpl/ControlPanel/icons_advanced.blade.php000060400000003146152453623440021102 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

// All of the buttons in this panel require the Configure privilege
if (!$this->permissions['configure'])
{
	return;
}
?>
@if(AKEEBA_PRO)
    <section class="akeeba-panel--info">
        <header class="akeeba-block-header">
            <h3>@lang('COM_AKEEBA_CPANEL_HEADER_ADVANCED')</h3>
        </header>

        <div class="akeeba-grid">
            @if($this->permissions['configure'])
                <a class="akeeba-action--teal"
                   href="index.php?option=com_akeeba&view=Schedule">
                    <span class="akion-calendar"></span>
                    @lang('COM_AKEEBA_SCHEDULE')
                </a>
            @endif

            @if($this->permissions['configure'])
                <a class="akeeba-action--orange"
                   href="index.php?option=com_akeeba&view=Discover">
                    <span class="akion-ios-download"></span>
                    @lang('COM_AKEEBA_DISCOVER')
                </a>
            @endif

            @if($this->permissions['configure'])
                <a class="akeeba-action--orange"
                   href="index.php?option=com_akeeba&view=S3Import">
                    <span class="akion-ios-cloud-download"></span>
                    @lang('COM_AKEEBA_S3IMPORT')
                </a>
            @endif
        </div>
    </section>
@endif
components/com_akeeba/tmpl/ControlPanel/warning_phpversion.blade.php000060400000000774152453623440022070 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

use FOF40\Date\Date;

?>
{{-- Old PHP version reminder --}}
@include('admin:com_akeeba/CommonTemplates/phpversion_warning', [
    'softwareName'  => 'Akeeba Backup',
    'minPHPVersion' => '7.2.0',
])
components/com_akeeba/tmpl/ControlPanel/footer.blade.php000060400000002026152453623440017434 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

?>
<div class="row-fluid footer akeebabackup-footer">
	<div class="span12">
		<p style="height: 6em">
			@sprintf('Copyright &copy;2006-%s <a href="https://www.akeeba.com">Akeeba Ltd</a>. All Rights Reserved.', date('Y'))
			<br/>
			Akeeba Backup is Free Software and is distributed under the terms of the <a
					href="http://www.gnu.org/licenses/gpl-3.0.html">GNU General Public License</a>, version 3 or - at
			your option - any later version.
			@if(AKEEBA_PRO != 1)
				<br/>If you use Akeeba Backup Core, please post a rating and a review at the <a
						href="https://extensions.joomla.org/extensions/extension/access-a-security/site-security/akeeba-backup/">Joomla!
					Extensions Directory</a>.
			@endif
		</p>
	</div>
</div>
components/com_akeeba/tmpl/Profiles/item_json.blade.php000060400000002040152453623440017304 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') || die();

use Akeeba\Engine\Factory;
use Joomla\CMS\Document\JsonDocument;

/** @var Akeeba\Backup\Admin\View\Profiles\Json $this */

$data = $this->item->getData();

if (substr($data['configuration'], 0, 12) == '###AES128###')
{
	// Load the server key file if necessary
	if (!defined('AKEEBA_SERVERKEY'))
	{
		$filename = JPATH_COMPONENT_ADMINISTRATOR . '/BackupEngine/serverkey.php';

		include_once $filename;
	}

	$key = Factory::getSecureSettings()->getKey();

	$data['configuration'] = Factory::getSecureSettings()->decryptSettings($data['configuration'], $key);
}

$defaultName = $this->input->get('view', 'joomla', 'cmd');
$filename    = $this->input->get('basename', $defaultName, 'cmd');

/** @var JsonDocument $document */
$document = \Joomla\CMS\Factory::getApplication()->getDocument();
$document->setName($filename);

echo json_encode($data);
components/com_akeeba/tmpl/Profiles/form.blade.php000060400000002424152453623440016266 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') || die();

?>
<form action="index.php" method="post" name="adminForm" id="adminForm"
      class="akeeba-form--horizontal--with-hidden akeeba-panel--information">
    <div class="akeeba-form-group">
    </div>

    <div class="akeeba-form-group">
        <label for="description">
            @jhtml('tooltip', \Joomla\CMS\Language\Text::_('COM_AKEEBA_PROFILES_LABEL_DESCRIPTION_TOOLTIP'), '', '', \Joomla\CMS\Language\Text::_('COM_AKEEBA_PROFILES_LABEL_DESCRIPTION'))
        </label>
        <input type="text" name="description" class="span6" id="description" value="{{{ $this->item->description }}}" />
    </div>

    <div class="akeeba-hidden-fields-container">
        <input type="hidden" name="option" value="com_akeeba" />
        <input type="hidden" name="view" value="Profiles" />
        <input type="hidden" name="boxchecked" id="boxchecked" value="0" />
        <input type="hidden" name="task" id="task" value="save" />
        <input type="hidden" name="id" id="id" value="{{ (int)$this->item->id }}" />
        <input type="hidden" name="@token(true)" value="1" />
    </div>
</form>
components/com_akeeba/tmpl/Profiles/default.blade.php000060400000015726152453623440016760 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') || die();

?>

<form action="index.php" method="post" name="adminForm" id="adminForm" class="akeeba-form akeeba-form--with-hidden">
    @include('admin:com_akeeba/CommonTemplates/ProfileName')

    <section class="akeeba-panel--50-50 akeeba-filter-bar-container">
        <div class="akeeba-filter-bar akeeba-filter-bar--left akeeba-form-section akeeba-form--inline">
            <div class="akeeba-filter-element akeeba-form-group">
                <input type="text" name="description" id="description"
                       value="{{{ $this->getModel()->getState('description', '', 'string') }}}" size="30"
                       class="akeebaGridViewAutoSubmitOnChange"
                       placeholder="@lang('COM_AKEEBA_PROFILES_COLLABEL_DESCRIPTION')"
                />
            </div>
        </div>
        <div class="akeeba-filter-bar akeeba-filter-bar--right">
            <div class="akeeba-filter-element akeeba-form-group">
                <label for="limit" class="element-invisible">
                    @lang('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC')
                </label>
                {{ $this->pagination->getLimitBox() }}
            </div>

            <div class="akeeba-filter-element akeeba-form-group">
                <label for="directionTable" class="element-invisible">
                    @lang('JFIELD_ORDERING_DESC')
                </label>
                <select name="directionTable" id="directionTable"
                        class="input-medium custom-select akeebaGridViewOrderTable">
                    <option value="">
                        @lang('JFIELD_ORDERING_DESC')
                    </option>
                    <option value="asc" {{ ($this->getLists()->order_Dir == 'asc') ? 'selected="selected"' : '' }}>
                        @lang('JGLOBAL_ORDER_ASCENDING')
                    </option>
                    <option value="desc" {{ ($this->getLists()->order_Dir == 'desc') ? 'selected="selected"' : '' }}>
                        @lang('JGLOBAL_ORDER_DESCENDING')
                    </option>
                </select>
            </div>

            <div class="akeeba-filter-element akeeba-form-group">
                <label for="sortTable" class="element-invisible">
                    @lang('JGLOBAL_SORT_BY')
                </label>
                <select name="sortTable" id="sortTable" class="input-medium custom-select akeebaGridViewOrderTable">
                    <option value="">
                        @lang('JGLOBAL_SORT_BY')
                    </option>
                    @jhtml('select.options', $this->sortFields, 'value', 'text', $this->getLists()->order)
                </select>
            </div>
        </div>
    </section>

    <table class="adminlist akeeba-table akeeba-table--striped">
        <thead>
        <tr>
            <th width="20">
                <input type="checkbox" name="toggle" value="" class="akeebaGridViewCheckAll" />
            </th>
            <th width="40">
                @jhtml('grid.sort', 'JGRID_HEADING_ID', 'id', $this->lists->order_Dir, $this->lists->order, 'browse')
            </th>
            <th width="20%"></th>
            <th>
                @jhtml('grid.sort', 'COM_AKEEBA_PROFILES_COLLABEL_DESCRIPTION', 'description', $this->lists->order_Dir, $this->lists->order, 'browse')
            </th>
            <th>
                @lang('COM_AKEEBA_CONFIG_QUICKICON_LABEL')
            </th>
        </tr>
        </thead>
        <tfoot>
        <tr>
            <td colspan="11">
                {{ $this->pagination->getListFooter() }}

            </td>
        </tr>
        </tfoot>
        <tbody>
		<?php $i = 0; ?>
        @foreach( $this->items as $profile )
            <tr>
                <td>
                    @jhtml('grid.id', ++$i, $profile->id)
                </td>
                <td>
                    {{ (int) $profile->id }}
                </td>
                <td>
                    <a class="akeeba-btn akeeba-btn--small akeeba-btn--primary"
                       href="index.php?option=com_akeeba&task=SwitchProfile&profileid={{ (int)$profile->id }}&returnurl={{ base64_encode(\Joomla\CMS\Uri\Uri::base() . 'index.php?option=com_akeeba&view=Configuration') }}&@token(true)=1">
                        <span class="icon-cog icon-white"></span>
                        @lang('COM_AKEEBA_CONFIG_UI_CONFIG')
                    </a>
                    &nbsp;
                    <a class="akeeba-btn akeeba-btn--small akeeba-btn--dark"
                       href="index.php?option=com_akeeba&view=Profile&task=read&id={{ $profile->id }}&basename={{ \Joomla\CMS\Application\ApplicationHelper::stringURLSafe($profile->description) }}&format=json&@token(true)=1">
                        <span class="icon-download"></span>
                        @lang('COM_AKEEBA_PROFILES_BTN_EXPORT')
                    </a>
                </td>
                <td>
                    <a href="index.php?option=com_akeeba&amp;view=Profiles&amp;task=edit&amp;id={{ (int) $profile->id }}">
                        {{{ $profile->description }}}
                    </a>
                </td>
                <td>
                    @jhtml('FEFHelp.browse.published', $profile->quickicon, $i, 'quickicon_')
                </td>
            </tr>
        @endforeach
        </tbody>
    </table>

    <div class="akeeba-hidden-fields-container">
        <input type="hidden" name="option" value="com_akeeba" />
        <input type="hidden" name="view" value="Profiles" />
        <input type="hidden" name="boxchecked" id="boxchecked" value="0" />
        <input type="hidden" name="task" id="task" value="browse" />
        <input type="hidden" name="hidemainmenu" id="hidemainmenu" value="0" />
        <input type="hidden" name="filter_order" id="filter_order"
               value="{{{ $this->lists->order }}}" />
        <input type="hidden" name="filter_order_Dir" id="filter_order_Dir"
               value="{{{ $this->lists->order_Dir }}}" />
        <input type="hidden" name="@token(true)" value="1" />
    </div>
</form>

<form action="index.php" method="post" name="importForm" enctype="multipart/form-data"
      id="importForm"
      class="akeeba-form akeeba-form--inline akeeba-panel--primary"
>
    <input type="hidden" name="option" value="com_akeeba" />
    <input type="hidden" name="view" value="Profiles" />
    <input type="hidden" name="boxchecked" id="boxchecked" value="0" />
    <input type="hidden" name="task" id="task" value="import" />
    <input type="hidden" name="@token(true)" value="1" />

    <input type="file" name="importfile" class="input-medium" />

    <button class="akeeba-btn akeeba-btn--green">
        <span class="icon-upload icon-white"></span>
        @lang('COM_AKEEBA_PROFILES_HEADER_IMPORT')
    </button>

    <span class="help-inline">
		@lang('COM_AKEEBA_PROFILES_LBL_IMPORT_HELP')
	</span>
</form>
components/com_akeeba/tmpl/Manage/comment.blade.php000060400000002414152453623440016371 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') || die();

/** @var  \Akeeba\Backup\Admin\View\Manage\Html  $this */

?>
<form name="adminForm" id="adminForm" action="index.php" method="post" class="akeeba-form--horizontal">
	<div class="akeeba-form-group">
		<label for="description">
			@lang('COM_AKEEBA_BUADMIN_LABEL_DESCRIPTION')
		</label>
        <input type="text" name="description" id="description" maxlength="255" size="50"
               value="{{{ $this->record['description'] }}}" />
	</div>

	<div class="akeeba-form-group">
		<label for="comment">
			@lang('COM_AKEEBA_BUADMIN_LABEL_COMMENT')
		</label>
        @editor('comment',  $this->record['comment'], '100%', '400', '60', '20', array())
	</div>

    <div class="akeeba-hidden-fields-container">
        <input type="hidden" name="option" value="com_akeeba" />
        <input type="hidden" name="task" value="" />
        <input type="hidden" name="view" value="Manage" />
        <input type="hidden" name="id" value="{{ (int)$this->record['id'] }}" />
        <input type="hidden" name="@token(true)" value="1" />
    </div>
</form>
components/com_akeeba/tmpl/Manage/manage_column.blade.php000060400000014440152453623440017536 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Helper\Utils;

/** @var  \Akeeba\Backup\Admin\View\Manage\Html $this */
/** @var  array $record */

if (!isset($record['remote_filename']))
{
	$record['remote_filename'] = '';
}

$archiveExists    = $record['meta'] == 'ok';
$showManageRemote = $record['hasRemoteFiles'] && (AKEEBA_PRO == 1);
$engineForProfile = array_key_exists($record['profile_id'], $this->enginesPerProfile) ? $this->enginesPerProfile[$record['profile_id']] : 'none';
$showUploadRemote = $this->permissions['backup'] && $archiveExists && !$showManageRemote && ($engineForProfile != 'none') && ($record['meta'] != 'obsolete') && (AKEEBA_PRO == 1);
$showDownload     = $this->permissions['download'] && $archiveExists;
$showViewLog      = $this->permissions['backup'] && isset($record['backupid']) && !empty($record['backupid']);
$postProcEngine   = '';
$thisPart         = '';
$thisID           = urlencode($record['id']);

if ($showUploadRemote)
{
	$postProcEngine   = $engineForProfile ?: 'none';
	$showUploadRemote = !empty($postProcEngine);
}

\AkeebaFEFHelper::loadFEFScript('Tooltip');
?>
<div style="display: none">
    <div id="akeeba-buadmin-{{ (int)$record['id'] }}" tabindex="-1">
        <div class="akeeba-renderer-fef">
            <h4>@lang('COM_AKEEBA_BUADMIN_LBL_BACKUPINFO')</h4>

            <p>
                <strong>@lang('COM_AKEEBA_BUADMIN_LBL_ARCHIVEEXISTS')</strong>
                <br />
                @if($record['meta'] == 'ok')
                    <span class="akeeba-label--success">
				@lang('JYES')
			</span>
                @else
                    <span class="akeeba-label--failure">
				@lang('JNO')
			</span>
                @endif
            </p>
            <p>
                <strong>@lang('COM_AKEEBA_BUADMIN_LBL_ARCHIVEPATH' . ($archiveExists ? '' : '_PAST'))</strong>
                <br />
                <span class="akeeba-label--information">
				{{{ Utils::getRelativePath(JPATH_SITE, dirname($record['absolute_path'])) }}}
				</span>
            </p>
            <p>
                <strong>@lang('COM_AKEEBA_BUADMIN_LBL_ARCHIVENAME' . ($archiveExists ? '' : '_PAST'))</strong>
                <br />
                <code>
                    {{{ $record['archivename'] }}}
                </code>
            </p>
        </div>

    </div>

    @if($showDownload)
        <div id="akeeba-buadmin-download-{{ (int)$record['id'] }}" tabindex="-2" role="dialog">
            <div class="akeeba-renderer-fef">
                <div class="akeeba-block--warning">
                    <h4>
                        @lang('COM_AKEEBA_BUADMIN_LBL_DOWNLOAD_TITLE')
                    </h4>
                    <p>
                        @lang('COM_AKEEBA_BUADMIN_LBL_DOWNLOAD_WARNING')
                    </p>
                </div>

                @if($record['multipart'] < 2)
                    <a class="akeeba-btn--primary--small comAkeebaManageDownloadButton"
                       data-id="{{{ $record['id'] }}}">
                        <span class="akion-ios-download"></span>
                        @lang('COM_AKEEBA_BUADMIN_LOG_DOWNLOAD')
                    </a>
                @endif
                @if($record['multipart'] >= 2)
                    <div>
                        @sprintf('COM_AKEEBA_BUADMIN_LBL_DOWNLOAD_PARTS', (int)$record['multipart'])
                    </div>
                    @for($count = 0; $count < $record['multipart']; $count++)
                    @if($count > 0)
                    &bull;
                @endif
                <a class="akeeba-btn--small--dark comAkeebaManageDownloadButton"
                   data-id="{{{ $record['id'] }}}"
                   data-part="{{{ $count }}}">
                    <span class="akion-android-download"></span>
                    @sprintf('COM_AKEEBA_BUADMIN_LABEL_PART', $count)
                </a>
                @endfor
                @endif
            </div>
        </div>
    @endif
</div>

@if($showManageRemote)
    <div style="padding-bottom: 3pt;">
        <a class="akeeba-btn--primary akeeba_remote_management_link"
           data-management="index.php?option=com_akeeba&view=RemoteFiles&tmpl=component&task=listactions&id={{ (int)$record['id'] }}"
           data-reload="index.php?option=com_akeeba&view=Manage"
        >
            <span class="akion-cloud"></span>
            @lang('COM_AKEEBA_BUADMIN_LABEL_REMOTEFILEMGMT')
        </a>
    </div>
@elseif($showUploadRemote)
    <a class="akeeba-btn--primary akeeba_upload"
       data-upload="index.php?option=com_akeeba&view=Upload&tmpl=component&task=start&id={{ (int)$record['id'] }}"
       data-reload="index.php?option=com_akeeba&view=Manage"
       title="@sprintf('COM_AKEEBA_TRANSFER_DESC', JText::_("ENGINE_POSTPROC_{$postProcEngine}_TITLE"))">
        <span class="akion-android-upload"></span>
        @lang('COM_AKEEBA_TRANSFER_TITLE')
        (<em>{{{ $postProcEngine }}}</em>)
    </a>
@endif

<div style="padding-bottom: 3pt">
    @if($showDownload)
        <a class="akeeba-btn--{{ $showManageRemote || $showUploadRemote ? 'small--grey' : 'green' }} akeeba_download_button"
           data-dltarget="#akeeba-buadmin-download-{{ (int)$record['id'] }}"
        >
            <span class="akion-android-download"></span>
            @lang('COM_AKEEBA_BUADMIN_LOG_DOWNLOAD')
        </a>
    @endif

    @if($showViewLog)
        <a class="akeeba-btn--grey akeebaCommentPopover"
           {{ ($record['meta'] != 'obsolete') ? '' : 'disabled="disabled"' }}
           href="index.php?option=com_akeeba&view=Log&tag={{{ $record['tag'] }}}.{{{ $record['backupid'] }}}&profileid={{ (int)$record['profile_id'] }}"
           data-original-title="@lang('COM_AKEEBA_BUADMIN_LBL_LOGFILEID')"
           data-content="{{{ $record['backupid'] }}}">
            <span class="akion-ios-search-strong"></span>
            @lang('COM_AKEEBA_LOG')
        </a>
    @endif

    <a class="akeeba-btn--grey--small akeebaCommentPopover akeeba_showinfo_link"
       data-infotarget="#akeeba-buadmin-{{ (int)$record['id'] }}"
       data-content="@lang('COM_AKEEBA_BUADMIN_LBL_BACKUPINFO')"
    >
        <span class="akion-information-circled"></span>
    </a>
</div>
components/com_akeeba/tmpl/Manage/default.blade.php000060400000030765152453623440016365 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') || die();

/** @var  \Akeeba\Backup\Admin\View\Manage\Html $this */

\AkeebaFEFHelper::loadFEFScript('Tooltip');
?>
@jhtml('formbehavior.chosen')

@if (class_exists('Joomla\CMS\Component\ComponentHelper') && \Joomla\CMS\Component\ComponentHelper::isEnabled('com_akeebabackup'))
    @include('admin:com_akeeba/ControlPanel/backup8_uninstall')
	<?php return; ?>
@elseif (version_compare(JVERSION, '3.999.999', 'gt'))
    @include('admin:com_akeeba/ControlPanel/backup9_install')
@endif

<div id="akeebaBackup8Wrapper">
    @if($this->promptForBackupRestoration && version_compare(JVERSION, '3.999.999', 'le'))
        @include('admin:com_akeeba/Manage/howtorestore_modal')
    @endif

    <div class="akeeba-block--info">
        <h4>@lang('COM_AKEEBA_BUADMIN_LABEL_HOWDOIRESTORE_LEGEND')</h4>
        <p>
            @sprintf('COM_AKEEBA_BUADMIN_LABEL_HOWDOIRESTORE_TEXT_' . (AKEEBA_PRO ? 'PRO' : 'CORE'), 'http://akee.ba/abrestoreanywhere', 'index.php?option=com_akeeba&view=Transfer', 'https://www.akeeba.com/latest-kickstart-core.zip')
        </p>
        <p>
            @if (!AKEEBA_PRO)
                @sprintf('COM_AKEEBA_BUADMIN_LABEL_HOWDOIRESTORE_TEXT_CORE_INFO_ABOUT_PRO', 'https://www.akeeba.com/products/akeeba-backup.html')
            @endif
        </p>
    </div>

    <div id="j-main-container">
        <form action="index.php" method="post" name="adminForm" id="adminForm" class="akeeba-form">

            <section class="akeeba-panel--33-66 akeeba-filter-bar-container">
                <div class="akeeba-filter-bar akeeba-filter-bar--left akeeba-form-section akeeba-form--inline">
                    <div class="akeeba-filter-element akeeba-form-group">
                        <input type="text" name="description" placeholder="@lang('COM_AKEEBA_BUADMIN_LABEL_DESCRIPTION')"
                                id="filter_description"
                                value="{{{ $this->fltDescription }}}"
                                title="@lang('COM_AKEEBA_BUADMIN_LABEL_DESCRIPTION')" />
                    </div>

                    <div class="akeeba-filter-element akeeba-form-group akeeba-filter-joomlacalendarfix">
                        @if (version_compare(JVERSION, '3.999.999', 'le'))
                            @jhtml('calendar', $this->fltFrom, 'from', 'from', '%Y-%m-%d', array('class' => 'input-small'))
                        @else
                            <input
                                    type="datetime-local"
                                    pattern="[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}"
                                    name="from"
                                    id="from"
                                    value="{{{ $this->fltFrom }}}"
                            >
                        @endif
                    </div>

                    <div class="akeeba-filter-element akeeba-form-group akeeba-filter-joomlacalendarfix">
                        @if (version_compare(JVERSION, '3.999.999', 'le'))
                            @jhtml('calendar', $this->fltTo, 'to', 'to', '%Y-%m-%d', array('class' => 'input-small'))
                        @else
                            <input
                                    type="datetime-local"
                                    pattern="[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}"
                                    name="to"
                                    id="to"
                                    value="{{{ $this->fltTo }}}"
                            >
                        @endif
                    </div>

                    <div class="akeeba-filter-element akeeba-form-group">
                        <button class="akeeba-btn--grey akeeba-btn--icon-only akeeba-btn--small akeeba-hidden-phone"
                                type="submit" title="@lang('JSEARCH_FILTER_SUBMIT')">
                            <span class="akion-search"></span>
                        </button>
                    </div>

                    <div class="akeeba-filter-element akeeba-form-group">
                        {{-- Joomla 3.x: Chosen does not work with attached event handlers, only with inline event scripts (e.g. onchange) --}}
                        @jhtml('select.genericlist', $this->profilesList, 'profile', ['list.select' => $this->fltProfile, 'list.attr' => ['class' => 'advancedSelect', 'onchange' => 'document.forms.adminForm.submit();'], 'id' => 'comAkeebaManageProfileSelector'])
                    </div>

                    <div class="akeeba-filter-element akeeba-form-group">
                        {{-- Joomla 3.x: Chosen does not work with attached event handlers, only with inline event scripts (e.g. onchange) --}}
                        @jhtml('select.genericlist', $this->frozenList, 'frozen', ['list.select' => $this->fltFrozen, 'list.attr' => ['class' => 'advancedSelect', 'onchange' => 'document.forms.adminForm.submit();'], 'id' => 'comAkeebaManageFrozenSelector'])
                    </div>
                </div>

                <div class="akeeba-filter-bar akeeba-filter-bar--right">
                    @jhtml('FEFHelp.browse.orderheader', null, $this->sortFields, $this->getPagination(), $this->lists->order, $this->lists->order_Dir)
                </div>
            </section>

            <table class="akeeba-table akeeba-table--striped" id="itemsList">
                <thead>
                <tr>
                    <th width="32">
                        @jhtml('FEFHelp.browse.checkall')
                    </th>
                    <th width="48" class="akeeba-hidden-phone">
                        @sortgrid('id', 'COM_AKEEBA_BUADMIN_LABEL_ID')
                    </th>
                    <th>
                        @sortgrid('frozen', 'COM_AKEEBA_BUADMIN_LABEL_FROZEN')
                    </th>
                    <th>
                        @sortgrid('description', 'COM_AKEEBA_BUADMIN_LABEL_DESCRIPTION')
                    </th>
                    <th class="akeeba-hidden-phone">
                        @sortgrid('profile_id', 'COM_AKEEBA_BUADMIN_LABEL_PROFILEID')
                    </th>
                    <th width="80">
                        @lang('COM_AKEEBA_BUADMIN_LABEL_DURATION')
                    </th>
                    <th width="40">
                        @lang('COM_AKEEBA_BUADMIN_LABEL_STATUS')
                    </th>
                    <th width="80" class="akeeba-hidden-phone">
                        @lang('COM_AKEEBA_BUADMIN_LABEL_SIZE')
                    </th>
                    <th class="akeeba-hidden-phone">
                        @lang('COM_AKEEBA_BUADMIN_LABEL_MANAGEANDDL')
                    </th>
                </tr>
                </thead>
                <tfoot>
                <tr>
                    <td colspan="11" class="center">
                        {{ $this->pagination->getListFooter() }}
                    </td>
                </tr>
                </tfoot>
                <tbody>
                @if(empty($this->items))
                    <tr>
                        <td colspan="11" class="center">
                            @lang('COM_AKEEBA_BACKUP_STATUS_NONE')
                        </td>
                    </tr>
                @endif
                @if( ! (empty($this->items)))
					<?php $id = 1; $i = 0; ?>
                    @foreach($this->items as $record)
						<?php
						$id = 1 - $id;
						[$originDescription, $originIcon] = $this->getOriginInformation($record);
						[$startTime, $duration, $timeZoneText] = $this->getTimeInformation($record);
						[$statusClass, $statusIcon] = $this->getStatusInformation($record);
						$profileName = $this->getProfileName($record);

						$frozenIcon  = 'akion-waterdrop';
						$frozenTask  = 'freeze';
						$frozenTitle = \JText::_('COM_AKEEBA_BUADMIN_LABEL_ACTION_FREEZE');

						if ($record['frozen'])
						{
							$frozenIcon  = 'akion-ios-snowy';
							$frozenTask  = 'unfreeze';
							$frozenTitle = \JText::_('COM_AKEEBA_BUADMIN_LABEL_ACTION_UNFREEZE');
						}
						?>
                        <tr class="row{{ $id }}">
                            <td>@jhtml('grid.id', ++$i, $record['id'])</td>
                            <td class="akeeba-hidden-phone">
                                {{{ $record['id'] }}}
                            </td>
                            <td>
                                <a href="#" onclick="return Joomla.listItemTask('cb{{ $i }}', '{{$frozenTask}}')" title="{{$frozenTitle}}">
                                    <span class="{{ $frozenIcon }}"></span>
                                </a>
                            </td>
                            <td>
						<span class="{{ $originIcon }} akeebaCommentPopover" rel="popover"
                                title="@lang('COM_AKEEBA_BUADMIN_LABEL_ORIGIN')"
                                data-content="{{{ $originDescription }}}"></span>
                                @if( ! (empty($record['comment'])))
                                    <span class="akion-help-circled akeebaCommentPopover" rel="popover"
                                            data-content="{{{ $record['comment'] }}}"></span>
                                @endif
                                <a href="{{{ JUri::base() }}}index.php?option=com_akeeba&view=Manage&task=showcomment&id={{{ $record['id'] }}}">
                                    {{{ empty($record['description']) ? JText::_('COM_AKEEBA_BUADMIN_LABEL_NODESCRIPTION') : $record['description'] }}}

                                </a>
                                <br />
                                <div class="akeeba-buadmin-startdate" title="@lang('COM_AKEEBA_BUADMIN_LABEL_START')">
                                    <small>
                                        <span class="akion-calendar"></span>
                                        {{{ $startTime }}} {{{ $timeZoneText }}}
                                    </small>
                                </div>
                            </td>
                            <td class="akeeba-hidden-phone">
                                #{{{ (int)$record['profile_id'] }}}. {{{ $profileName }}}

                                <br />
                                <small>
                                    <em>{{{ $this->translateBackupType($record['type']) }}}</em>
                                </small>
                            </td>
                            <td>
                                {{{ $duration }}}
                            </td>
                            <td>
						<span class="{{ $statusClass }} akeebaCommentPopover" rel="popover"
                                title="@lang('COM_AKEEBA_BUADMIN_LABEL_STATUS')"
                                data-content="@lang('COM_AKEEBA_BUADMIN_LABEL_STATUS_' . $record['meta'])">
							<span class="{{ $statusIcon }}"></span>
						</span>
                            </td>
                            <td class="akeeba-hidden-phone">
                                @if($record['meta'] == 'ok')
                                    {{{ $this->formatFilesize($record['size']) }}}

                                @elseif($record['total_size'] > 0)
                                    <i>{{ $this->formatFilesize($record['total_size']) }}</i>
                                    @else
                                    &mdash;
                                @endif
                            </td>
                            <td class="akeeba-hidden-phone">
                                @include('admin:com_akeeba/Manage/manage_column', ['record' => &$record])
                            </td>
                        </tr>
                    @endforeach
                @endif
                </tbody>
            </table>

            <div class="akeeba-hidden-fields-container">
                <input type="hidden" name="option" id="option" value="com_akeeba" />
                <input type="hidden" name="view" id="view" value="Manage" />
                <input type="hidden" name="boxchecked" id="boxchecked" value="0" />
                <input type="hidden" name="task" id="task" value="default" />
                <input type="hidden" name="filter_order" id="filter_order" value="{{{ $this->lists->order }}}" />
                <input type="hidden" name="filter_order_Dir" id="filter_order_Dir" value="{{{ $this->lists->order_Dir }}}" />
                <input type="hidden" name="@token(true)" value="1" />
            </div>
        </form>
    </div>
</div>components/com_akeeba/tmpl/Manage/howtorestore_modal.blade.php000060400000003301152453623440020643 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') || die();

/** @var  \Akeeba\Backup\Admin\View\Manage\Html $this */

// Make sure we only ever add this HTML and JS once per page
if (defined('AKEEBA_VIEW_JAVASCRIPT_HOWTORESTORE'))
{
	return;
}

define('AKEEBA_VIEW_JAVASCRIPT_HOWTORESTORE', 1);

$this->container->platform->getDocument()->addScriptOptions('akeeba.Manage.ShowHowToRestoreModal', 1);

?>
<div id="akeeba-config-howtorestore-bubble">
    <div class="akeeba-renderer-fef">
        <h4>@lang('COM_AKEEBA_BUADMIN_LABEL_HOWDOIRESTORE_LEGEND')</h4>
        <p>
            @sprintf('COM_AKEEBA_BUADMIN_LABEL_HOWDOIRESTORE_TEXT_' . (AKEEBA_PRO ? 'PRO' : 'CORE'), 'http://akee.ba/abrestoreanywhere', 'index.php?option=com_akeeba&view=Transfer', 'https://www.akeeba.com/latest-kickstart-core.zip')
        </p>
        <p>
            @if (!AKEEBA_PRO)
                @sprintf('COM_AKEEBA_BUADMIN_LABEL_HOWDOIRESTORE_TEXT_CORE_INFO_ABOUT_PRO', 'https://www.akeeba.com/products/akeeba-backup.html')
            @endif
        </p>

        <div>
            <a class="akeeba-btn--primary" id="comAkeebaManageCloseHowToRestoreModal">
                <span class="akion-close"></span>
                @lang('COM_AKEEBA_BUADMIN_BTN_REMINDME')
            </a>
            <a href="index.php?option=com_akeeba&view=Manage&task=hidemodal" class="akeeba-btn--green">
                <span class="akion-checkmark-circled"></span>
                @lang('COM_AKEEBA_BUADMIN_BTN_DONTSHOWTHISAGAIN')
            </a>
        </div>
    </div>
</div>
components/com_akeeba/tmpl/Manage/default.xml000060400000000557152453623440015324 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->
<metadata>
	<layout title="COM_AKEEBA_VIEW_MANAGE_TITLE">
		<message>
			<![CDATA[COM_AKEEBA_VIEW_MANAGE_DESC]]>
		</message>
	</layout>
</metadata>
components/com_akeeba/tmpl/DatabaseFilters/tabular.blade.php000060400000003065152453623440020231 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') || die();

/** @var \Akeeba\Backup\Admin\View\DatabaseFilters\Html $this */
?>
@include('admin:com_akeeba/CommonTemplates/ErrorModal')
@include('admin:com_akeeba/CommonTemplates/ProfileName')

<div class="AKEEBA_MASTER_FORM_STYLING akeeba-form--inline akeeba-panel--info">
    <div class="akeeba-form-group">
        <label>@lang('COM_AKEEBA_DBFILTER_LABEL_ROOTDIR')</label>
        <span>{{ $this->root_select }}</span>
    </div>
    <div id="addnewfilter" class="akeeba-form-group--actions">
        <label>
            @lang('COM_AKEEBA_FILEFILTERS_LABEL_ADDNEWFILTER')
        </label>

        <button class="akeeba-btn--grey" id="comAkeebaDatabaseFiltersAddNewTables">
            @lang('COM_AKEEBA_DBFILTER_TYPE_TABLES')
        </button>

        <button class="akeeba-btn--grey" id="comAkeebaDatabaseFiltersAddNewTableData">
            @lang('COM_AKEEBA_DBFILTER_TYPE_TABLEDATA')
        </button>
    </div>
</div>

<div class="akeeba-panel--primary">
    <div id="ak_list_container">
        <table id="ak_list_table" class="akeeba-table--striped">
            <thead>
            <tr>
                <td width="250px">@lang('COM_AKEEBA_FILEFILTERS_LABEL_TYPE')</td>
                <td>@lang('COM_AKEEBA_FILEFILTERS_LABEL_FILTERITEM')</td>
            </tr>
            </thead>
            <tbody id="ak_list_contents">
            </tbody>
        </table>
    </div>
</div>
components/com_akeeba/tmpl/DatabaseFilters/default.blade.php000060400000002536152453623440020225 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') || die();

/** @var \Akeeba\Backup\Admin\View\DatabaseFilters\Html $this */
?>
@include('admin:com_akeeba/CommonTemplates/ErrorModal')
@include('admin:com_akeeba/CommonTemplates/ProfileName')

<div class="AKEEBA_MASTER_FORM_STYLING akeeba-form--inline akeeba-panel--info">
    <div class="akeeba-form-group">
        <label>@lang('COM_AKEEBA_DBFILTER_LABEL_ROOTDIR')</label>
        {{ $this->root_select }}
    </div>
    <div class="akeeba-form-group--actions">
        <button class="akeeba-btn--green" id="comAkeebaDatabaseFiltersExcludeNonCMS">
            <span class="akion-ios-flag"></span>
            @lang('COM_AKEEBA_DBFILTER_LABEL_EXCLUDENONCORE')
        </button>
        <button class="akeeba-btn--red" id="comAkeebaDatabaseFiltersNuke">
            <span class="akion-ios-loop-strong"></span>
            @lang('COM_AKEEBA_DBFILTER_LABEL_NUKEFILTERS')
        </button>
    </div>
</div>

<div id="ak_main_container" class="akeeba-container--100">
</div>

<div class="akeeba-panel--info">
    <header class="akeeba-block-header">
        <h3>
            @lang('COM_AKEEBA_DBFILTER_LABEL_TABLES')
        </h3>
    </header>
    <div id="tables"></div>
</div>
components/com_akeeba/tmpl/Backup/script.blade.php000060400000005751152453623440016257 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') || die();

use Joomla\CMS\Language\Text;
use Joomla\CMS\Uri\Uri;

/**
 * This file passes parameters to the Backup.js script using Joomla's script options API
 *
 * @var  $this  \Akeeba\Backup\Admin\View\Backup\Html
 */

$escapedBaseURL = addslashes(Uri::base());
$platform       = $this->container->platform;

// Initialization
$platform->addScriptOptions('akeeba.Backup.defaultDescription', addslashes($this->defaultDescription));
$platform->addScriptOptions('akeeba.Backup.currentDescription', addslashes(empty($this->description) ? $this->defaultDescription : $this->description));
$platform->addScriptOptions('akeeba.Backup.currentComment', addslashes($this->comment));
$platform->addScriptOptions('akeeba.Backup.hasAngieKey', $this->hasANGIEPassword);

// Auto-resume setup
$platform->addScriptOptions('akeeba.Backup.resume.enabled', (bool) $this->autoResume);
$platform->addScriptOptions('akeeba.Backup.resume.timeout', (int) $this->autoResumeTimeout);
$platform->addScriptOptions('akeeba.Backup.resume.maxRetries', (int) $this->autoResumeRetries);

// The return URL
$platform->addScriptOptions('akeeba.Backup.returnUrl', addcslashes($this->returnURL, "'\\"));

// Used as parameters to start_timeout_bar()
$platform->addScriptOptions('akeeba.Backup.maxExecutionTime', (int) $this->maxExecutionTime);
$platform->addScriptOptions('akeeba.Backup.runtimeBias', (int) $this->runtimeBias);

// Notifications
$platform->addScriptOptions('akeeba.System.notification.iconURL', sprintf("%s../media/com_akeeba/icons/logo-48.png", $escapedBaseURL));
$platform->addScriptOptions('akeeba.System.notification.hasDesktopNotification', (bool) $this->desktopNotifications);

// Domain keys
$platform->addScriptOptions('akeeba.Backup.domains', $this->domains);

// AJAX proxy, View Log and ALICE URLs
$platform->addScriptOptions('akeeba.System.params.AjaxURL', 'index.php?option=com_akeeba&view=Backup&task=ajax');
$platform->addScriptOptions('akeeba.Backup.URLs.LogURL', sprintf("%sindex.php?option=com_akeeba&view=Log", $escapedBaseURL));
$platform->addScriptOptions('akeeba.Backup.URLs.AliceURL', sprintf("%sindex.php?option=com_akeeba&view=Alice", $escapedBaseURL));

// Behavior triggers
$platform->addScriptOptions('akeeba.Backup.autostart', (!$this->unwriteableOutput && $this->autoStart) ? 1 : 0);

// Push language strings to Javascript
Text::script('COM_AKEEBA_BACKUP_TEXT_LASTRESPONSE');
Text::script('COM_AKEEBA_BACKUP_TEXT_BACKUPSTARTED');
Text::script('COM_AKEEBA_BACKUP_TEXT_BACKUPFINISHED');
Text::script('COM_AKEEBA_BACKUP_TEXT_BACKUPHALT');
Text::script('COM_AKEEBA_BACKUP_TEXT_BACKUPRESUME');
Text::script('COM_AKEEBA_BACKUP_TEXT_BACKUPHALT_DESC');
Text::script('COM_AKEEBA_BACKUP_TEXT_BACKUPFAILED');
Text::script('COM_AKEEBA_BACKUP_TEXT_BACKUPWARNING');
Text::script('COM_AKEEBA_BACKUP_TEXT_AVGWARNING');
components/com_akeeba/tmpl/Backup/default.xml000060400000002724152453623440015337 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->
<metadata>
	<layout title="COM_AKEEBA_VIEW_BACKUP_TITLE">
		<message>
			<![CDATA[COM_AKEEBA_VIEW_BACKUP_DESC]]>
		</message>
	</layout>
	<fields name="request" addfieldpath="administrator/components/com_akeeba/fields">
		<fieldset name="request">
			<field name="profileid" type="backupprofiles"
				   show_none="yes"
				   default="0"
				   label="COM_AKEEBA_VIEW_BACKUP_PROFILE_LABEL"
				   description="COM_AKEEBA_VIEW_BACKUP_PROFILE_DESC"
			/>

			<field name="autostart" type="fancyradio"
				   default="0"
				   class="btn-group"
				   label="COM_AKEEBA_VIEW_BACKUP_AUTOSTART_LABEL"
				   description="COM_AKEEBA_VIEW_BACKUP_AUTOSTART_DESC"
			>
				<option value="0">JNo</option>
				<option value="1">JYes</option>
			</field>

			<field name="akeeba_hide_toolbar" type="fancyradio"
				   default="0"
				   class="btn-group"
				   label="COM_AKEEBA_VIEW_BACKUP_HIDETOOLBAR_LABEL"
				   description="COM_AKEEBA_VIEW_BACKUP_HIDETOOLBAR_DESC"
			>
				<option value="0">JNo</option>
				<option value="1">JYes</option>
			</field>

			<field name="returnurl" type="urlencoded"
				   default=""
				   label="COM_AKEEBA_VIEW_BACKUP_RETURNURL_LABEL"
				   description="COM_AKEEBA_VIEW_BACKUP_RETURNURL_DESC"
				   />
		</fieldset>
	</fields>
</metadata>
components/com_akeeba/tmpl/Backup/default.blade.php000060400000031654152453623440016400 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') || die();

/** @var  $this  \Akeeba\Backup\Admin\View\Backup\Html */

?>
@if (class_exists('Joomla\CMS\Component\ComponentHelper') && \Joomla\CMS\Component\ComponentHelper::isEnabled('com_akeebabackup'))
    @include('admin:com_akeeba/ControlPanel/backup8_uninstall')
	<?php return; ?>
@elseif (version_compare(JVERSION, '3.999.999', 'gt'))
    @include('admin:com_akeeba/ControlPanel/backup9_install')
@endif

{{-- Configuration Wizard pop-up --}}
@if($this->promptForConfigurationWizard)
	@include('admin:com_akeeba/Configuration/confwiz_modal')
@endif

{{-- The Javascript of the page --}}
@include('admin:com_akeeba/Backup/script')

<div id="akeebaBackup8Wrapper">
    {{-- Backup Setup --}}
    <div id="backup-setup" class="akeeba-panel--primary">
        <header class="akeeba-block-header">
            <h3>
                @lang('COM_AKEEBA_BACKUP_HEADER_STARTNEW')
            </h3>
        </header>

        @if($this->hasWarnings && !$this->unwriteableOutput)
            <div id="quirks" class="akeeba-block--{{ $this->hasErrors ? 'failure' : 'warning' }}">
                <h3 class="alert-heading">
                    @lang('COM_AKEEBA_BACKUP_LABEL_DETECTEDQUIRKS')
                </h3>
                <p>
                    @lang('COM_AKEEBA_BACKUP_LABEL_QUIRKSLIST')
                </p>
                {{ $this->warningsCell }}

            </div>
        @endif

        @if($this->unwriteableOutput)
            <div id="akeeba-fatal-outputdirectory" class="akeeba-block--failure">
                <h3>
                    @lang('COM_AKEEBA_BACKUP_ERROR_UNWRITABLEOUTPUT_' . ($this->autoStart ? 'AUTOBACKUP' : 'NORMALBACKUP'))
                </h3>
                <p>
                    @sprintf('COM_AKEEBA_BACKUP_ERROR_UNWRITABLEOUTPUT_COMMON', 'index.php?option=com_akeeba&view=Configuration', 'https://www.akeeba.com/warnings/q001.html')
                </p>
            </div>
        @endif

        <form action="index.php" method="post" name="flipForm" id="flipForm"
                class="akeeba-formstyle-reset akeeba-form--inline akeeba-panel--information"
                autocomplete="off">

            <div class="akeeba-form-group">
                <label>
                    @lang('COM_AKEEBA_CPANEL_PROFILE_TITLE'): #{{ $this->profileId }}

                </label>
                @jhtml('formbehavior.chosen')
                @jhtml('select.genericlist', $this->profileList, 'profileid', ['list.select' => $this->profileId, 'id' => 'comAkeebaBackupProfileDropdown', 'list.attr' => ['class' => 'advancedSelect']])
            </div>

            <div class="akeeba-form-group--actions">
                <button class="akeeba-btn--grey" id="comAkeebaBackupFlipProfile">
                    <span class="akion-refresh"></span>
                    @lang('COM_AKEEBA_CPANEL_PROFILE_BUTTON')
                </button>
            </div>

            <div class="akeeba-hidden-fields-container">
                <input type="hidden" name="option" value="com_akeeba"/>
                <input type="hidden" name="view" value="Backup"/>
                <input type="hidden" name="returnurl" value="{{{ $this->returnURL }}}"/>
                <input type="hidden" name="description" id="flipDescription" value=""/>
                <input type="hidden" name="comment" id="flipComment" value=""/>
                <input type="hidden" name="@token(true)" value="1"/>
            </div>
        </form>

        <form id="dummyForm" class="akeeba-form--horizontal" style="display: {{ $this->unwriteableOutput ? 'none' : 'block' }};">
            <div class="akeeba-form-group">
                <label for="backup-description">
                    @lang('COM_AKEEBA_BACKUP_LABEL_DESCRIPTION')
                </label>
                <input type="text" name="description" value="{{{ empty($this->description) ? $this->defaultDescription : $this->description }}}"
                        maxlength="255" size="80" id="backup-description" class="input-xxlarge" autocomplete="off" />
                <span class="akeeba-help-text">@lang('COM_AKEEBA_BACKUP_LABEL_DESCRIPTION_HELP')</span>
            </div>

            <div class="akeeba-form-group">
                <label for="comment">
                    @lang('COM_AKEEBA_BACKUP_LABEL_COMMENT')
                </label>
                <textarea id="comment" rows="5" cols="73" class="input-xxlarge">{{ $this->comment }}</textarea>
                <span class="akeeba-help-text">@lang('COM_AKEEBA_BACKUP_LABEL_COMMENT_HELP')</span>
            </div>

            <div class="akeeba-form-group--pull-right">
                <div class="akeeba-form-group--actions">
                    <button class="akeeba-btn--primary" id="backup-start">
                        <span class="akion-play"></span>
                        @lang('COM_AKEEBA_BACKUP_LABEL_START')
                    </button>

                    <a class="akeeba-btn--orange" id="backup-default" href="#">
                        <span class="akion-refresh"></span>
                        @lang('COM_AKEEBA_BACKUP_LABEL_RESTORE_DEFAULT')
                    </a>
                </div>
            </div>
        </form>
    </div>

    {{-- Warning for having set an ANGIE password --}}
    <div id="angie-password-warning" class="akeeba-block--warning" style="display: none">
        <h3>@lang('COM_AKEEBA_BACKUP_ANGIE_PASSWORD_WARNING_HEADER')</h3>
        <p>@lang('COM_AKEEBA_BACKUP_ANGIE_PASSWORD_WARNING_1')</p>
        <p>@lang('COM_AKEEBA_BACKUP_ANGIE_PASSWORD_WARNING_2')</p>
    </div>

    {{-- Backup in progress --}}
    <div id="backup-progress-pane" style="display: none">
        <div class="akeeba-block--info">
            @lang('COM_AKEEBA_BACKUP_TEXT_BACKINGUP')
        </div>

        <div class="akeeba-panel--primary">
            <header class="akeeba-block-header">
                <h3>
                    @lang('COM_AKEEBA_BACKUP_LABEL_PROGRESS')
                </h3>
            </header>

            <div id="backup-progress-content">
                <div id="backup-steps"></div>
                <div id="backup-status" class="backup-steps-container">
                    <div id="backup-step"></div>
                    <div id="backup-substep"></div>
                </div>
                <div id="backup-percentage" class="akeeba-progress">
                    <div class="akeeba-progress-fill" style="width: 0"></div>
                </div>
                <div id="response-timer">
                    <div class="color-overlay"></div>
                    <div class="text"></div>
                </div>
            </div>
            <span id="ajax-worker"></span>
        </div>

        @if (!AKEEBA_PRO)
            <div>
                <p>
                    <em>@lang('COM_AKEEBA_BACKUP_LBL_UPGRADENAG')</em>
                </p>
            </div>
        @endif
    </div>

    {{-- Backup complete --}}
    <div id="backup-complete" style="display: none">
        <div class="akeeba-panel--success">
            <header class="akeeba-block-header">
                <h3>
                    @if(empty($this->returnURL))
                        @lang('COM_AKEEBA_BACKUP_HEADER_BACKUPFINISHED')
                    @else
                        @lang('COM_AKEEBA_BACKUP_HEADER_BACKUPWITHRETURNURLFINISHED')
                    @endif
                </h3>
            </header>

            <div id="finishedframe">
                <p>
                    @if(empty($this->returnURL))
                        @lang('COM_AKEEBA_BACKUP_TEXT_CONGRATS')
                    @else
                        @lang('COM_AKEEBA_BACKUP_TEXT_PLEASEWAITFORREDIRECTION')
                    @endif
                </p>

                @if(empty($this->returnURL))
                    <a class="akeeba-btn--primary--big" href="index.php?option=com_akeeba&view=Manage">
                        <span class="akion-ios-list"></span>
                        @lang('COM_AKEEBA_BUADMIN')
                    </a>
                    <a class="akeeba-btn--grey" id="ab-viewlog-success" href="index.php?option=com_akeeba&view=Log&latest=1">
                        <span class="akion-ios-search-strong"></span>
                        @lang('COM_AKEEBA_LOG')
                    </a>
                @endif
            </div>
        </div>
    </div>

    {{-- Backup warnings --}}
    <div id="backup-warnings-panel" style="display:none">
        <div class="akeeba-panel--warning">
            <header class="akeeba-block-header">
                <h3>
                    @lang('COM_AKEEBA_BACKUP_LABEL_WARNINGS')
                </h3>
            </header>
            <div id="warnings-list">
            </div>
        </div>
    </div>

    {{-- Backup retry after error --}}
    <div id="retry-panel" style="display: none">
        <div class="akeeba-panel--warning">
            <header class="akeeba-block-header">
                <h3>
                    @lang('COM_AKEEBA_BACKUP_HEADER_BACKUPRETRY')
                </h3>
            </header>
            <div id="retryframe">
                <p>@lang('COM_AKEEBA_BACKUP_TEXT_BACKUPFAILEDRETRY')</p>
                <p>
                    <strong>
                        @lang('COM_AKEEBA_BACKUP_TEXT_WILLRETRY')
                        <span id="akeeba-retry-timeout">0</span>
                        @lang('COM_AKEEBA_BACKUP_TEXT_WILLRETRYSECONDS')
                    </strong>
                    <br/>
                    <button class="akeeba-btn--red--small" id="comAkeebaBackupCancelResume">
                        <span class="akion-android-cancel"></span>
                        @lang('COM_AKEEBA_MULTIDB_GUI_LBL_CANCEL')
                    </button>
                    <button class="akeeba-btn--green--small" id="comAkeebaBackupResumeBackup">
                        <span class="akion-ios-redo"></span>
                        @lang('COM_AKEEBA_BACKUP_TEXT_BTNRESUME')
                    </button>
                </p>

                <p>@lang('COM_AKEEBA_BACKUP_TEXT_LASTERRORMESSAGEWAS')</p>
                <p id="backup-error-message-retry"></p>
            </div>
        </div>
    </div>

    {{-- Backup error (halt) --}}
    <div id="error-panel" style="display: none">
        <div class="akeeba-panel--red">
            <header class="akeeba-block-header">
                <h3>
                    @lang('COM_AKEEBA_BACKUP_HEADER_BACKUPFAILED')
                </h3>
            </header>

            <div id="errorframe">
                <p>
                    @lang('COM_AKEEBA_BACKUP_TEXT_BACKUPFAILED')
                </p>
                <p id="backup-error-message"></p>

                <p>
                    @lang('COM_AKEEBA_BACKUP_TEXT_READLOGFAIL' . (AKEEBA_PRO ? 'PRO' : ''))
                </p>

                <div class="akeeba-block--info" id="error-panel-troubleshooting">
                    <p>
                        @if(AKEEBA_PRO)
                            @lang('COM_AKEEBA_BACKUP_TEXT_RTFMTOSOLVEPRO')
                        @endif

                        @sprintf('COM_AKEEBA_BACKUP_TEXT_RTFMTOSOLVE', 'https://www.akeeba.com/documentation/akeeba-backup-documentation/backup-now.html?utm_source=akeeba_backup&utm_campaign=backuperrorlink#troubleshoot-backup')
                    </p>
                    <p>
                        @if(AKEEBA_PRO)
                            @sprintf('COM_AKEEBA_BACKUP_TEXT_SOLVEISSUE_PRO', 'https://www.akeeba.com/support.html?utm_source=akeeba_backup&utm_campaign=backuperrorpro')
                        @else
                            @sprintf('COM_AKEEBA_BACKUP_TEXT_SOLVEISSUE_CORE', 'https://www.akeeba.com/subscribe.html?utm_source=akeeba_backup&utm_campaign=backuperrorcore','https://www.akeeba.com/support.html?utm_source=akeeba_backup&utm_campaign=backuperrorcore')
                        @endif

                        @sprintf('COM_AKEEBA_BACKUP_TEXT_SOLVEISSUE_LOG', 'index.php?option=com_akeeba&view=Log&latest=1')
                    </p>
                </div>

                @if(AKEEBA_PRO)
                    <a class="akeeba-btn--green" id="ab-alice-error" href="index.php?option=com_akeeba&view=Alice">
                        <span class="akion-medkit"></span>
                        @lang('COM_AKEEBA_BACKUP_ANALYSELOG')
                    </a>
                @endif

                <a class="akeeba-btn--primary" href="https://www.akeeba.com/documentation/akeeba-backup-documentation/troubleshoot-backup.html?utm_source=akeeba_backup&utm_campaign=backuperrorbutton">
                    <span class="akion-ios-book"></span>
                    @lang('COM_AKEEBA_BACKUP_TROUBLESHOOTINGDOCS')
                </a>

                <a class="akeeba-btn-grey" id="ab-viewlog-error" href="index.php?option=com_akeeba&view=Log&latest=1">
                    <span class="akion-ios-search-strong"></span>
                    @lang('COM_AKEEBA_LOG')
                </a>
            </div>
        </div>
    </div>
</div>components/com_akeeba/tmpl/FileFilters/default.blade.php000060400000003657152453623440017405 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') || die();

/** @var \Akeeba\Backup\Admin\View\FileFilters\Html $this */
?>
@include('admin:com_akeeba/CommonTemplates/ErrorModal')
@include('admin:com_akeeba/CommonTemplates/ProfileName')

<div class="AKEEBA_MASTER_FORM_STYLING akeeba-form--inline akeeba-panel--info">
    <div class="akeeba-form-group">
        <label>
            @lang('COM_AKEEBA_FILEFILTERS_LABEL_ROOTDIR')
        </label>
        <span>{{ $this->root_select }}</span>
    </div>
    <div class="akeeba-form-group--actions">
        <button class="akeeba-btn--red" id="comAkeebaFileFiltersNuke">
            <span class="akion-ios-trash"></span>
            @lang('COM_AKEEBA_FILEFILTERS_LABEL_NUKEFILTERS')
        </button>

        <a class="akeeba-btn--grey" href="index.php?option=com_akeeba&view=FileFilters&task=tabular">
            <span class="akion-ios-list-outline"></span>
            @lang('COM_AKEEBA_FILEFILTERS_LABEL_VIEWALL')
        </a>
    </div>
</div>

<div id="ak_crumbs_container" class="akeeba-panel--100 akeeba-panel--information">
    <div>
        <ul id="ak_crumbs" class="akeeba-breadcrumb"></ul>
    </div>
</div>

<div id="ak_main_container" class="akeeba-container--50-50">
    <div>
        <div class="akeeba-panel--info">
            <header class="akeeba-block-header">
                <h3>
                    @lang('COM_AKEEBA_FILEFILTERS_LABEL_DIRS')
                </h3>
            </header>
            <div id="folders"></div>
        </div>
    </div>

    <div>
        <div class="akeeba-panel--info">
            <header class="akeeba-block-header">
                <h3>
                    @lang('COM_AKEEBA_FILEFILTERS_LABEL_FILES')
                </h3>
            </header>
            <div id="files"></div>
        </div>
    </div>
</div>
components/com_akeeba/tmpl/FileFilters/tabular.blade.php000060400000003565152453623440017411 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') || die();

/** @var \Akeeba\Backup\Admin\View\FileFilters\Html $this */
?>
@include('admin:com_akeeba/CommonTemplates/ErrorModal')
@include('admin:com_akeeba/CommonTemplates/ProfileName')

<div class="AKEEBA_MASTER_FORM_STYLING akeeba-form--inline akeeba-panel--info">
    <div class="akeeba-form-group">
        <label>@lang('COM_AKEEBA_FILEFILTERS_LABEL_ROOTDIR')</label>
        {{ $this->root_select }}
    </div>
    <div id="addnewfilter" class="akeeba-form-group--actions">
        <label>
            @lang('COM_AKEEBA_FILEFILTERS_LABEL_ADDNEWFILTER')
        </label>
        <button class="akeeba-btn--grey" id="comAkeebaFileFiltersAddDirectories">
            @lang('COM_AKEEBA_FILEFILTERS_TYPE_DIRECTORIES')
        </button>
        <button class="akeeba-btn--grey" id="comAkeebaFileFiltersAddSkipfiles">
            @lang('COM_AKEEBA_FILEFILTERS_TYPE_SKIPFILES')
        </button>
        <button class="akeeba-btn--grey" id="comAkeebaFileFiltersAddSkipdirs">
            @lang('COM_AKEEBA_FILEFILTERS_TYPE_SKIPDIRS')
        </button>
        <button class="akeeba-btn--grey" id="comAkeebaFileFiltersAddFiles">
            @lang('COM_AKEEBA_FILEFILTERS_TYPE_FILES')
        </button>
    </div>
</div>

<form id="ak_roots_container_tab" class="akeeba-panel--primary">
    <div id="ak_list_container">
        <table id="ak_list_table" class="akeeba-table--striped">
            <thead>
            <tr>
                <td width="250px">@lang('COM_AKEEBA_FILEFILTERS_LABEL_TYPE')</td>
                <td>@lang('COM_AKEEBA_FILEFILTERS_LABEL_FILTERITEM')</td>
            </tr>
            </thead>
            <tbody id="ak_list_contents">
            </tbody>
        </table>
    </div>
</form>
components/com_akeeba/tmpl/Browser/default.blade.php000060400000014103152453623440016604 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') || die();

use Joomla\CMS\Language\Text;
use Joomla\CMS\Uri\Uri;

/** @var \Akeeba\Backup\Admin\View\Browser\Html $this */

Text::script('COM_AKEEBA_CONFIG_UI_ROOTDIR', true);

?>
@if(empty($this->folder))
    <form action="index.php" method="post" name="adminForm" id="adminForm">
        <input type="hidden" name="option" value="com_akeeba" />
        <input type="hidden" name="view" value="Browser" />
        <input type="hidden" name="format" value="html" />
        <input type="hidden" name="tmpl" value="component" />
        <input type="hidden" name="folder" id="folder" value="" />
        <input type="hidden" name="processfolder" id="processfolder" value="0" />
        <input type="hidden" name="@token(true)" value="1" />
    </form>
@endif

@if(!(empty($this->folder)))
    <div class="akeeba-panel--100 akeeba-panel--primary">
        <div>
            <form action="index.php" method="get" name="adminForm" id="adminForm"
                  class="akeeba-form--inline akeeba-form--with-hidden">
                <span title="@lang($this->writable ? 'COM_AKEEBA_CPANEL_LBL_WRITABLE' : 'COM_AKEEBA_CPANEL_LBL_UNWRITABLE')"
                      class="{{ $this->writable ? 'akeeba-label--green' : 'akeeba-label--red' }}"
                >
                    <span class="{{ $this->writable ? 'akion-checkmark-circled' : 'akion-ios-close' }}"></span>
                </span>
                <input type="text" name="folder" id="folder" value="{{{ $this->folder }}}" />

                <button class="akeeba-btn--primary" id="comAkeebaBrowserGo">
                    <span class="akion-folder"></span>
                    @lang('COM_AKEEBA_BROWSER_LBL_GO')
                </button>

                <button class="akeeba-btn--green" id="comAkeebaBrowserUseThis">
                    <span class="akion-share"></span>
                    @lang('COM_AKEEBA_BROWSER_LBL_USE')
                </button>

                <div class="akeeba-hidden-fields-container">
                    <input type="hidden" name="folderraw" id="folderraw"
                           value="{{{ $this->folder_raw }}}" />
                    <input type="hidden" name="@token(true)" value="1" />
                    <input type="hidden" name="option" value="com_akeeba" />
                    <input type="hidden" name="view" value="Browser" />
                    <input type="hidden" name="tmpl" value="component" />
                </div>
            </form>
        </div>
    </div>

    @if(count($this->breadcrumbs))
        <div class="akeeba-panel--100 akeeba-panel--information">
            <div>
                <ul class="akeeba-breadcrumb">
					<?php $i = 0 ?>
                    @foreach($this->breadcrumbs as $crumb)
						<?php $i++; ?>
                        <li class="{{ ($i < count($this->breadcrumbs)) ? '' : 'active' }}">
                            @if($i < count($this->breadcrumbs))
                                <a href="{{{ Uri::base() . "index.php?option=com_akeeba&view=Browser&tmpl=component&folder=" . urlencode($crumb['folder']) }}}">
                                    {{{ $crumb['label'] }}}
                                </a>
                                <span class="divider">&bull;</span>
                            @else
                                {{{ $crumb['label'] }}}
                            @endif
                        </li>
                    @endforeach
                </ul>
            </div>
        </div>
    @endif

    <div class="akeeba-panel--100 akeeba-panel">
        <div>
            @if(count($this->subfolders))
                <table class="akeeba-table akeeba-table--striped">
                    <tr>
                        <td>
                            <a class="akeeba-btn--dark--small"
                               href="{{{ Uri::base() }}}index.php?option=com_akeeba&view=Browser&tmpl=component&folder={{{ $this->parent }}}">
                                <span class="akion-arrow-up-a"></span>
                                @lang('COM_AKEEBA_BROWSER_LBL_GOPARENT')
                            </a>
                        </td>
                    </tr>
                    @foreach($this->subfolders as $subfolder)
                        <tr>
                            <td>
                                <a class="akeeba-browser-folder" href="{{{ Uri::base() }}}index.php?option=com_akeeba&view=Browser&tmpl=component&folder={{{ $this->folder . '/' . $subfolder }}}">{{{ $subfolder }}}</a>
                            </td>
                        </tr>
                    @endforeach
                </table>
            @else
                @if(!$this->exists)
                    <div class="akeeba-block--failure">
                        @lang('COM_AKEEBA_BROWSER_ERR_NOTEXISTS')
                    </div>
                @elseif(!$this->inRoot)
                    <div class="akeeba-block--warning">
                        @lang('COM_AKEEBA_BROWSER_ERR_NONROOT')
                    </div>
                @elseif($this->openbasedirRestricted)
                    <div class="akeeba-block--failure">
                        @lang('COM_AKEEBA_BROWSER_ERR_BASEDIR')
                    </div>
                @else
                    <table class="akeeba-table--striped">
                        <tr>
                            <td>
                                <a class="akeeba-btn--dark--small"
                                   href="{{{ Uri::base() }}}index.php?option=com_akeeba&view=Browser&tmpl=component&folder={{{ $this->parent }}}">
                                    <span class="akion-arrow-up-a"></span>
                                    @lang('COM_AKEEBA_BROWSER_LBL_GOPARENT')
                                </a>
                            </td>
                        </tr>
                    </table>
                @endif{{-- secondary block --}}
            @endif {{-- count($this->subfolders) --}}
        </div>
    </div>
@endif
components/com_akeeba/tmpl/CommonTemplates/FTPBrowser.blade.php000060400000003051152453623440020641 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') || die();
?>
<?php /* FTP browser */ ?>
<div class="modal fade" id="ftpdialog" tabindex="-1" role="dialog" aria-labelledby="ftpdialogLabel" aria-hidden="true"
     style="display: none;">
    <div class="akeeba-renderer-fef">
        <h4 id="ftpdialogLabel">
		    @lang('COM_AKEEBA_CONFIG_UI_FTPBROWSER_TITLE')
        </h4>

        <p class="instructions akeeba-block--info">
		    @lang('COM_AKEEBA_FTPBROWSER_LBL_INSTRUCTIONS')
        </p>
        <div class="error akeeba-block--failure" id="ftpBrowserErrorContainer">
            <h3>@lang('COM_AKEEBA_FTPBROWSER_LBL_ERROR')</h3>
            <p id="ftpBrowserError"></p>
        </div>

        <ul id="ak_crumbs2" class="breadcrumb"></ul>

        <div class="folderBrowserWrapper" id="ftpBrowserWrapper">
            <table id="ftpBrowserFolderList" class="akeeba-table akeeba-table--striped">
            </table>
        </div>

        <div>
            <button type="button" id="ftpdialogOkButton" class="akeeba-btn--primary">
                <span class="akion-checkmark"></span>
		        @lang('COM_AKEEBA_BROWSER_LBL_USE')
            </button>

            <button type="button" id="ftpdialogCancelButton" class="akeeba-btn--red">
                <span class="akion-ios-close"></span>
		        @lang('JTOOLBAR_CANCEL')
            </button>
        </div>
    </div>
</div>
components/com_akeeba/tmpl/CommonTemplates/hhvm.php000060400000002441152453623440016542 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') or die();

?>

<div style="margin: 1em">
	<h1>We have detected that you are running HHVM instead of PHP. This software WILL NOT WORK properly on HHVM. Please switch to PHP 7 instead.</h1>
	<hr/>
	<p>
        HHVM was Facebook's attempt at modernizing the PHP 5.x language and making it faster. Unfortunately it's also incompatible with PHP proper.
        PHP 7 has solved all these issues. It's fast, modern and <em>fully compatible with our software</em>.
        Please switch to PHP 7. If you are unsure how to do that, contact your host or the person responsible for maintaining your server.
        They are the only people who can help you configure your server.
	</p>
	<p>
        Kindly note that HHVM is not -and has never been- a supported execution environment for our software.
        As a result, if you see this message on your site you are unfortunately ineligible for support and / or filing bug reports.
        Please switch to PHP 7. If your problem persists after that we can help you / accept your bug report. Thank you for your understanding.
	</p>
</div>
components/com_akeeba/tmpl/CommonTemplates/FTPConnectionTest.blade.php000060400000001300152453623440022150 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') || die();
?>
{{-- (S)FTP connection test --}}
<div class="modal fade" id="testFtpDialog" tabindex="-1" role="dialog" aria-labelledby="testFtpDialogLabel"
     aria-hidden="true" style="display:none;">
    <div class="akeeba-renderer-fef">
        <h4 class="modal-title" id="testFtpDialogLabel"></h4>
        <div class="akeeba-block--success" id="testFtpDialogBodyOk"></div>
        <div class="akeeba-block--failure" id="testFtpDialogBodyFail"></div>
    </div>
</div>
components/com_akeeba/tmpl/CommonTemplates/fof.php000060400000010434152453623440016353 0ustar00<?php
/**
 * Missing FOF 4.x error page
 *
 * @copyright Copyright (c) 2018-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') or die();

$tooLongAgo = (int) gmdate('Y') - 2015;
?>

<div style="margin: 1em">
	<h1>Akeeba Framework-on-Framework (FOF) version 4 could not be found on this site</h1>
	<hr />
	<div class="alert alert-warning">
		<h2>
			This component requires the Akeeba FOF framework package, verion 4, to be installed on your site. Please go
			to <a href="https://www.akeeba.com/download/fof4.html">our download page</a> to download it, then install
			it on your site.
		</h2>
	</div>
	<hr />
	<h4>Further information</h4>
	<p>
		FOF is a Joomla component framework. It's the low level code which sits between our Joomla! extensions and
		Joomla! itself. It is automatically installed when you install our extensions on your site.
	</p>
	<p>
		FOF can be missing from your site either because Joomla failed to install it or because you, another Super User,
		or another extension mistakenly uninstalled it or deleted its files.
	</p>
	<p>
		If it's missing, our components cannot talk to Joomla &mdash; or vice versa. Because of that they can not run.
		That's why you see this message.
	</p>
	<p>
		You do not have to worry about adding bloat to your site. FOF is very small. It will also be automatically
		uninstalled when you uninstall all components which depend on it.
	</p>
	<p>
		FOF is installed in the <code><?php echo rtrim(JPATH_LIBRARIES, '/\\') . DIRECTORY_SEPARATOR ?>fof40</code>
		folder on your server. It appears in Joomla's Extensions, Manage page as <code>FOF40</code>. Please do not
		remove it from your site.
	</p>
	<?php if (version_compare(JVERSION, '3.9999.9999', 'le')): ?>
		<h4>Why do I have multiple FOF entries in Joomla?</h4>
		<p>
			Joomla <?php echo JVERSION ?> includes an <em>old, obsolete</em> version of FOF - version 2.x. It is
			installed in the <code><?php echo JPATH_LIBRARIES . DIRECTORY_SEPARATOR ?>fof</code> folder on your server.
			It appears in Joomla's Extensions, Manage page as <code>FOF</code>. Please do not remove it from your site;
			Joomla needs it to function properly.
		</p>
		<p>
			We discontinued FOF 2.x in 2015 &mdash; that's <?php echo $tooLongAgo ?> years ago. Ever since, we replaced it
			with FOF 3.x. Starting February 2021 we replaced it with FOF 4.x.
		</p>
		<p>
			The different FOF versions are incompatible with each other but all may be required on your site for
			different reasons:
		</p>
		<ul>
			<li>
				<strong>FOF 2.x</strong> is required by Joomla! 3.x itself. Some of its core features, such as
				post-installation messages and Two Factor Authentiaction, use it.
			</li>
			<li>
				<strong>FOF 3.x</strong> is used by Akeeba Ltd extensions released before late February 2021 and some third
				party extensions.
			</li>
			<li>
				<strong>FOF 4.x</strong> is used by Akeeba Ltd extensions release <em>after</em> February 2021 and some third
				party extensions.
			</li>
		</ul>
		<p>
			Depending on which extensions you are using on your site you may see some or all of the above FOF versions.
			You <strong>must not</strong> try to uninstall them or delete their files yourself. If you do that, you will
			break some extensions and may lose access to your site.
		</p>
		<p>
			Please note that Akeeba extensions will automatically uninstall FOF versions 3 and 4 when they are no longer
			marked as needed by any extensions installed on your sites. Please note that whether they are needed or not
			is something that each extension needs to communicate to Joomla when it is installed, updated or
			uninstalled. While we can vouch for our extensions' ability to correctly communicate this information we
			can not make any promises for third party extensions. If you are unable to uninstall FOF 3 or 4 after
			uninstalling all Akeeba Ltd extensions from your site the culprit is a third party extension. Such an
			extension either still uses FOF or didn't communicate its upgrade or uninstallation, letting Joomla think
			there is still an extension depending on FOF. We cannot provide support for the latter issue; it's something
			caused by a different developer's code. Thank you for your understanding!
		</p>
	<?php endif; ?>
</div>
components/com_akeeba/tmpl/CommonTemplates/ErrorModal.blade.php000060400000001244152453623440020714 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') || die();
?>
{{--  Error modal  --}}
<div id="errorDialog" tabindex="-1" role="dialog" aria-labelledby="errorDialogLabel" aria-hidden="true"
     style="display:none;">
    <div class="akeeba-renderer-fef">
        <h4 id="errorDialogLabel">
			@lang('COM_AKEEBA_CONFIG_UI_AJAXERRORDLG_TITLE')
        </h4>

        <p>
			@lang('COM_AKEEBA_CONFIG_UI_AJAXERRORDLG_TEXT')
        </p>
        <pre id="errorDialogPre"></pre>
    </div>
</div>
components/com_akeeba/tmpl/CommonTemplates/SFTPBrowser.blade.php000060400000003102152453623440020761 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') || die();
?>
{{-- SFTP browser --}}
<div class="modal fade" id="sftpdialog" tabindex="-1" role="dialog" aria-labelledby="sftpdialogLabel" aria-hidden="true"
     style="display: none;">
    <div class="akeeba-renderer-fef">
        <h4 id="sftpdialogLabel">
		    @lang('COM_AKEEBA_CONFIG_UI_SFTPBROWSER_TITLE')
        </h4>

        <p class="instructions akeeba-block--info">
		    @lang('COM_AKEEBA_SFTPBROWSER_LBL_INSTRUCTIONS')
        </p>

        <div class="error akeeba-block--failure" id="sftpBrowserErrorContainer">
            <h2>@lang('COM_AKEEBA_SFTPBROWSER_LBL_ERROR')</h2>
            <p id="sftpBrowserError"></p>
        </div>

        <ul id="ak_scrumbs" class="breadcrumb"></ul>

        <div class="folderBrowserWrapper" id="sftpBrowserWrapper">
            <table id="sftpBrowserFolderList" class="akeeba-table akeeba-table--striped">
            </table>
        </div>

        <div class="modal-footer">
            <button type="button" id="sftpdialogOkButton" class="akeeba-btn--primary">
                <span class="akion-checkmark"></span>
		        @lang('COM_AKEEBA_BROWSER_LBL_USE')
            </button>

            <button type="button" id="sftpdialogCancelButton" class="akeeba-btn--red">
                <span class="akion-ios-close"></span>
				@lang('JTOOLBAR_CANCEL')
            </button>
        </div>

    </div>
</div>
components/com_akeeba/tmpl/CommonTemplates/fef.php000060400000003071152453623440016340 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') or die();

?>

<div style="margin: 1em">
	<h1>Akeeba Frontend Framework (FEF) could not be found on this site</h1>
	<hr/>
	<div class="alert alert-warning">
		<h2>
			This component requires the Akeeba Frontend Framework (FEF) to be installed on your site. Please go to <a
					href="https://www.akeeba.com/download/official/fef.html">our download page</a> to download it, then install it on your site.
		</h2>
	</div>
	<hr/>
	<h4>Further information</h4>
	<p>
        FEF is the name of our custom CSS framework. It's responsible for rendering the interface of our Joomla!
		extensions. It is automatically installed when you install our extensions on your site.
	</p>
	<p>
		FEF can be missing from your site either because Joomla failed to install it or because you, another Super User,
		or another extension mistakenly uninstalled it.
	</p>
	<p>
		If it's missing we cannot display the interface to this component. That's why you see this message.
	</p>
	<p>
		You do not have to worry about adding bloat to your site. FEF is very small. It will also be automatically
		uninstalled when you uninstall all components which depend on it.
	</p>
	<p>
		FEF is installed in the <code>media/fef</code> folder under your site's root. It appears in Joomla's Extensions,
		Manage page as <code>file_fef</code>. Please do not remove it from your site.
	</p>
</div>
components/com_akeeba/tmpl/CommonTemplates/errorhandler.php000060400000025763152453623440020303 0ustar00<?php
/**
 * PHP Exception Handler
 *
 * @copyright Copyright (c) 2018-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') or die();

/** @var Throwable $e */
/** @var string $title */
/** @var bool $isPro */

$code = $e->getCode();
$code = !empty($code) ? $code : 500;

$app  = class_exists('\Joomla\CMS\Factory') ? \Joomla\CMS\Factory::getApplication() : \JFactory::getApplication();

$user30 = (class_exists('JFactory') && method_exists('JFactory', 'getUser')) ? JFactory::getUser() : null;
$user38 = class_exists('\Joomla\CMS\Factory') && method_exists('\Joomla\CMS\Factory', 'getUser') ? \Joomla\CMS\Factory::getUser() : null;
$user40 = (is_object($app) && method_exists($app, 'getIdentity')) ? $app->getIdentity() : null;
$user = is_null($user40) ? $user38 : $user40;
$user = is_null($user40) ? $user30 : $user;
$isSuper = !is_null($user) && $user->authorise('core.admin');

$isFrontend   = class_exists('JApplicationSite') && ($app instanceof JApplicationSite);
$isFrontend   = $isFrontend || (class_exists('\Joomla\CMS\Application\SiteApplication') && ($app instanceof \Joomla\CMS\Application\SiteApplication));
$user         = $isFrontend ? (method_exists($app, 'getIdentity') ? $app->getIdentity() : JFactory::getUser()) : null;
$hideTheError = $isFrontend && !(defined('JDEBUG') && (JDEBUG == 1)) && !$isSuper;
$isPro        = !isset($isPro) ? false : $isPro;

// 403 and 404 are re-thrown
if (in_array($code, [403, 404]))
{
	throw $e;
}

if (version_compare(JVERSION, '4', 'lt'))
{
	$app->setHeader('HTTP/1.1', $code);
}
else
{
	// In Joomla 4 we have to use the "Status" header, otherwise we get a fatal error saying that
	// HTTP/1.1 is not a valid header
	$app->setHeader('Status', $code);
}

if (!$isFrontend)
{
	if (class_exists('\Joomla\CMS\Toolbar\ToolbarHelper'))
	{
		\Joomla\CMS\Toolbar\ToolbarHelper::title($title . ' <small>Unhandled Exception</small>');
	}
	else
	{
		JToolbarHelper::title($title . ' <small>Unhandled Exception</small>');
	}

}

$isJoomla3 = version_compare(JVERSION, '3.999.999', 'le');

?>

<?php if ($hideTheError): ?>
	<?php if ($isJoomla3): ?>
		<h1>The application has stopped responding</h1>
		<p>
			Please contact the administrator of the site and let them know of this error and what you were doing when this
			happened.
		</p>
	<?php else: ?>
		<div class="card">
			<h1 class="card-header bg-danger text-white">The application has stopped responding</h1>
			<div class="card-body">
				<p>
					Please contact the administrator of the site and let them know of this error and what you were doing when this
					happened.
				</p>
			</div>
		</div>
	<?php endif; ?>
	<?php return true; endif; ?>
<div class="<?php echo $isJoomla3 ? '' : 'card my-3' ?>">
	<h1 class="<?php echo $isJoomla3 ? '' : 'card-header bg-danger text-white' ?>">
		<?php echo $title ?> - An unhandled Exception has been detected
	</h1>
	<div class="<?php echo $isJoomla3 ? '' : 'card-body' ?>">
		<h3>
			<?php if ($isJoomla3): ?>
				<span class="label label-danger"><?php echo htmlentities($code) ?></span> <?php echo htmlentities($e->getMessage()) ?>
			<?php else: ?>
				<span class="badge bg-danger"><?php echo htmlentities($code) ?></span> <?php echo htmlentities($e->getMessage()) ?>
			<?php endif; ?>
		</h3>
		<p>
			File <code><?php echo htmlentities(str_ireplace(JPATH_ROOT, '&lt;root&gt;', $e->getFile())) ?></code>
			<?php if ($isJoomla3): ?>
				Line <span class="label label-info"><?php echo (int) $e->getLine() ?></span>
			<?php else: ?>
				Line <span class="badge bg-info"><?php echo (int) $e->getLine() ?></span>
			<?php endif; ?>
		</p>

		<?php if ($isPro): ?>
			<div class="<?php if ($isJoomla3):?>hero-unit<?php else: ?>alert alert-primary<?php endif; ?>">
				<p>
					<strong>Would you like us to help you faster?</strong>
				</p>
				<p>
					Save this page as PDF or HTML. Make a ZIP file containing this PDF or HTML file. When filing a support ticket please attach the ZIP file (<em>not</em> the PDF or HTML file itself).
				</p>
			</div>
			<p>
				<strong>Why do we need all that information?</strong>
				This information is an x-ray of your site at the time the
				error occurred. It lets us reproduce the issue or, if it's not a bug in our software, help you pinpoint the
				external reason which led to it.
			</p>
			<p>
				<strong>What about privacy?</strong>
				Attachments are private in our ticket system: only you and us can see them, <em>even if you file a public
																								ticket</em>, and they are automatically deleted after a month.
			</p>
		<?php endif; ?>

		<hr />
		<p>
			<span class="icon icon-warning-2"></span>
			<em>
				The content below this point is for developers and power users.
			</em>
		</p>
		<hr />

		<p class="alert alert-warning">
			Joomla <?= JVERSION ?> – PHP <?= PHP_VERSION ?> on <?= PHP_OS ?>
		</p>

		<h3>Debug information</h3>
		<p>
			Exception type: <code><?php echo htmlentities(get_class($e)) ?></code>
		</p>
		<pre><?php echo htmlentities($e->getTraceAsString()) ?></pre>

		<?php while ($e = $e->getPrevious()): ?>
			<hr />
			<h4>Previous exception</h4>
			<strong>
				<?php if ($isJoomla3): ?>
					<span class="label label-danger"><?php echo htmlentities($code) ?></span> <?php echo htmlentities($e->getMessage()) ?>
				<?php else: ?>
					<span class="badge badge-danger"><?php echo htmlentities($code) ?></span> <?php echo htmlentities($e->getMessage()) ?>
				<?php endif; ?>
			</strong>
			<p>
				File <code><?php echo htmlentities(str_ireplace(JPATH_ROOT, '&lt;root&gt;', $e->getFile())) ?></code> Line <span
						class="label label-info"><?php echo (int) $e->getLine() ?></span>
			</p>
			<p>
				Exception type: <code><?php echo htmlentities(get_class($e)) ?></code>
			</p>
			<pre><?php echo htmlentities($e->getTraceAsString()) ?></pre>
		<?php endwhile; ?>

		<h3>System information</h3>
		<table class="table table-striped">
			<tr>
				<td>Operating System (reported by PHP)</td>
				<td><?php echo PHP_OS ?></td>
			</tr>
			<tr>
				<td>PHP version (as reported <em>by your server</em>)</td>
				<td><?php echo PHP_VERSION ?></td>
			</tr>
			<tr>
				<td>PHP Built On</td>
				<td><?php echo htmlentities(php_uname()); ?></td>
			</tr>
			<tr>
				<td>PHP SAPI</td>
				<td><?php echo PHP_SAPI ?></td>
			</tr>
			<tr>
				<td>Server identity</td>
				<td><?php echo htmlentities(isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : getenv('SERVER_SOFTWARE')) ?></td>
			</tr>
			<tr>
				<td>Browser identity</td>
				<td><?php echo htmlentities(isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '') ?></td>
			</tr>
			<tr>
				<td>Joomla! version</td>
				<td><?php echo JVERSION ?></td>
			</tr>
			<?php
			$db = JFactory::getDbo();
			if (!is_null($db)):
				?>
				<tr>
					<td>Database driver name</td>
					<td><?php echo $db->getName() ?></td>
				</tr>
				<tr>
					<td>Database driver type</td>
					<td><?php echo $db->getServerType() ?></td>
				</tr>
				<tr>
					<td>Database server version</td>
					<td><?php echo $db->getVersion() ?></td>
				</tr>
				<tr>
					<td>Database collation</td>
					<td><?php echo $db->getCollation() ?></td>
				</tr>
				<tr>
					<td>Database connection collation</td>
					<td><?php echo $db->getConnectionCollation() ?></td>
				</tr>
			<?php endif; ?>
			<tr>
				<td>PHP Memory limit</td>
				<td><?php echo function_exists('ini_get') ? htmlentities(ini_get('memory_limit')) : 'N/A' ?></td>
			</tr>
			<tr>
				<td>Peak Memory usage</td>
				<td><?php echo function_exists('memory_get_peak_usage') ? sprintf('%0.2fM', (memory_get_peak_usage() / 1024 / 1024)) : 'N/A' ?></td>
			</tr>
			<tr>
				<td>PHP Timeout (seconds)</td>
				<td><?php echo function_exists('ini_get') ? htmlentities(ini_get('max_execution_time')) : 'N/A' ?></td>
			</tr>
		</table>

		<h3>Request information</h3>
		<h4>$_GET</h4>
		<pre><?php echo htmlentities(print_r($_GET, true)) ?></pre>
		<h4>$_POST</h4>
		<pre><?php echo htmlentities(print_r($_POST, true)) ?></pre>
		<h4>$_COOKIE</h4>
		<pre><?php echo htmlentities(print_r($_COOKIE, true)) ?></pre>
		<h4>$_REQUEST</h4>
		<pre><?php echo htmlentities(print_r($_REQUEST, true)) ?></pre>

		<h3>Session state</h3>
		<pre><?php
			if (version_compare(JVERSION, '4', 'lt'))
			{
				echo htmlentities(print_r($app->getSession()->getData()->toArray(), true));
			}
			else
			{
				echo htmlentities(print_r($app->getSession()->all(), true));
			}
			?></pre>

		<?php
		if ($isJoomla3)
		{
			if (!include_once(JPATH_ADMINISTRATOR . '/components/com_admin/models/sysinfo.php'))
			{
				return;
			}

			$model       = new AdminModelSysInfo();
		}
		else
		{
			try
			{
				/** @var MVCFactoryInterface $factory */
				$factory = $app->bootComponent('com_admin')->getMVCFactory();
				/** @var \Joomla\Component\Admin\Administrator\Model\SysinfoModel $model */
				$model = $factory->createModel('Sysinfo', 'Administrator');
			}
			catch (Exception $e)
			{
				return;
			}
		}

		$directories = $model->getDirectory();

		try
		{
			$extensions = $model->getExtensions();
		}
		catch (Exception $e)
		{
			$extension = [];
		}

		$phpSettings = $model->getPhpSettings();
		$hasPHPInfo  = $model->phpinfoEnabled();
		?>

		<h3>PHP Settings</h3>
		<table class="table table-striped">
			<?php foreach ($phpSettings as $k => $v): ?>
				<tr>
					<td><?php echo $k ?></td>
					<td><?php echo htmlentities(print_r($v, true)) ?></td>
				</tr>
			<?php endforeach; ?>
		</table>

		<?php if ($hasPHPInfo):
			$phpInfo = $model->getPhpInfoArray(); ?>
			<h3>Loaded PHP Extensions</h3>
			<table class="table table-striped">
				<?php foreach ($phpInfo as $section => $data):
					if ($section == 'Core')
					{
						continue;
					} ?>
					<tr>
						<td><?php echo htmlentities($section) ?></td>
						<td>
							<?php if (in_array($section, ['curl', 'openssl', 'ssh2', 'ftp', 'session', 'tokenizer'])): ?>
								<pre><?php echo htmlentities(print_r($data, true)) ?></pre>
							<?php endif; ?>
						</td>
					</tr>
				<?php endforeach; ?>
			</table>
		<?php endif; ?>

		<h3>Enabled Extensions</h3>
		<table class="table table-striped">
			<?php foreach ($extensions as $extension => $info):
				if (strtoupper($info['state']) != 'ENABLED')
				{
					continue;
				} ?>
				<tr>
					<td><?php echo htmlentities($extension) ?></td>
					<td><?php echo htmlentities($info['version']) ?></td>
					<td><?php echo htmlentities($info['type']) ?></td>
					<td><?php echo htmlentities($info['author']) ?></td>
					<td><?php echo htmlentities($info['authorUrl']) ?></td>
				</tr>
			<?php endforeach; ?>
		</table>

		<h3>Directory Status</h3>
		<table class="table table-striped">
			<?php foreach ($directories as $k => $v): ?>
				<tr>
					<td>
						<?php echo htmlentities($k) ?>
						<?php echo !empty($v['message']) ? "[{$v['message']}]" : '' ?>
					</td>
					<td>
						<?php if ($v['writable']): ?>
							<span class="label label-success">Writeable</span>
						<?php else: ?>
							<span class="label label-danger">Unwriteable</span>
						<?php endif; ?>
					</td>
				</tr>
			<?php endforeach; ?>
		</table>
	</div>
</div>components/com_akeeba/tmpl/CommonTemplates/FolderBrowser.blade.php000060400000001224152453623440021423 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') || die();
?>

{{-- Filesystem browser --}}
<div class="modal" id="folderBrowserDialog" tabindex="-1" role="dialog" aria-labelledby="folderBrowserDialogLabel"
     aria-hidden="true" style="display: none;">
    <div class="akeeba-renderer-fef">
        <h4 id="folderBrowserDialogLabel">
		    @lang('COM_AKEEBA_CONFIG_UI_BROWSER_TITLE')
        </h4>
        <div id="folderBrowserDialogBody">
        </div>
    </div>
</div>
components/com_akeeba/tmpl/CommonTemplates/ProfileName.blade.php000060400000000627152453623440021053 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') || die();
?>
<div class="akeeba-block--info">
	<strong>@lang('COM_AKEEBA_CPANEL_PROFILE_TITLE')</strong>:
	#{{{ (int)($this->profileId) }}} {{{ $this->profileName }}}
</div>
components/com_akeeba/tmpl/RegExFileFilter/default.blade.php000060400000002312152453623440020140 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') || die();

?>
@include('admin:com_akeeba/CommonTemplates/ErrorModal')
@include('admin:com_akeeba/CommonTemplates/ProfileName')

<div class="akeeba-panel--information">
    <div class="akeeba-form-section">
        <div class="AKEEBA_MASTER_FORM_STYLING akeeba-form--inline">
            <label>@lang('COM_AKEEBA_FILEFILTERS_LABEL_ROOTDIR')</label>
            <span id="ak_roots_container_tab">
			{{ $this->root_select }}
			</span>
        </div>
    </div>
</div>

<div class="akeeba-container--primary">
    <div id="ak_list_container">
        <table id="table-container" class="akeeba-table--striped--dynamic-line-editor">
            <thead>
            <tr>
                <th width="120px">&nbsp;</th>
                <th width="250px">@lang('COM_AKEEBA_FILEFILTERS_LABEL_TYPE')</th>
                <th>@lang('COM_AKEEBA_FILEFILTERS_LABEL_FILTERITEM')</th>
            </tr>
            </thead>
            <tbody id="ak_list_contents" class="table-container">
            </tbody>
        </table>
    </div>
</div>
components/com_akeeba/tmpl/ConfigurationWizard/wizard.blade.php000060400000005556152453623440021041 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') || die();

$steps = ['flush', 'minexec', 'directory', 'dbopt', 'maxexec', 'splitsize']
?>

<div id="akeeba-confwiz">

    <div id="backup-progress-pane">
        <div class="akeeba-block--warning">
            @lang('COM_AKEEBA_CONFWIZ_INTROTEXT')
        </div>

        <fieldset id="backup-progress-header">
            <h3>
                @lang('COM_AKEEBA_CONFWIZ_PROGRESS')
            </h3>
            <div id="backup-progress-content">
                <div id="backup-steps">
	                @foreach ($steps as $step)
                        <div id="step-{{ $step }}" class="akeeba-label--grey">
                            @lang('COM_AKEEBA_CONFWIZ_' . $step)
                        </div>
                    @endforeach
                </div>
                <div class="backup-steps-container">
                    <div id="backup-substep">&nbsp;</div>
                </div>
            </div>
            <span id="ajax-worker"></span>
        </fieldset>

    </div>

    <div id="error-panel" class="akeeba-block--failure" style="display:none">
        <h2 class="alert-heading">@lang('COM_AKEEBA_CONFWIZ_HEADER_FAILED')</h2>
        <div id="errorframe">
            <p id="backup-error-message">
            </p>
        </div>
    </div>

    <div id="backup-complete" style="display: none">
        <div class="akeeba-block--success">
            <h2 class="alert-heading">@lang('COM_AKEEBA_CONFWIZ_HEADER_FINISHED')</h2>
            <div id="finishedframe">
                <p>
                    @lang('COM_AKEEBA_CONFWIZ_CONGRATS')
                </p>
                <p>
                    <a
                            class="akeeba-btn--primary akeeba-btn--big"
                            href="{{{ JUri::base() }}}index.php?option=com_akeeba&view=Backup">
                        <span class="akion-play"></span>
                        @lang('COM_AKEEBA_BACKUP')
                    </a>
                    <a
                            class="akeeba-btn--ghost"
                            href="{{{ JUri::base() }}}index.php?option=com_akeeba&view=Configuration">
                        <span class="akion-wrench"></span>
                        @lang('COM_AKEEBA_CONFIG')
                    </a>
                    @if (AKEEBA_PRO)
                    <a
                            class="akeeba-btn--ghost"
                            href="{{{ JUri::base() }}}index.php?option=com_akeeba&view=Schedule">
                        <span class="akion-calendar"></span>
                        @lang('COM_AKEEBA_SCHEDULE')
                    </a>
                    @endif
                </p>
            </div>
        </div>
    </div>
</div>
components/com_akeeba/tmpl/Configuration/default.xml000060400000000575152453623440016743 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->
<metadata>
	<layout title="COM_AKEEBA_VIEW_CONFIGURATION_TITLE">
		<message>
			<![CDATA[COM_AKEEBA_VIEW_CONFIGURATION_DESC]]>
		</message>
	</layout>
</metadata>
components/com_akeeba/tmpl/Configuration/confwiz_modal.blade.php000060400000004136152453623440021204 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') || die();

/** @var \FOF40\View\DataView\Html $this */

// Make sure we only ever add this HTML and JS once per page
if (defined('AKEEBA_VIEW_JAVASCRIPT_CONFWIZ_MODAL'))
{
	return;
}

define('AKEEBA_VIEW_JAVASCRIPT_CONFWIZ_MODAL', 1);

$js = <<< JS
akeeba.Loader.add('akeeba.System', function(){
    akeeba.System.documentReady(function(){
        akeeba.System.addEventListener('comAkeebaConfigurationWizardModalClose', 'click', function() {
          akeeba.System.configurationWizardModal.close();
        });

        setTimeout(function() {
          akeeba.System.configurationWizardModal = akeeba.Modal.open({
            inherit: '#akeeba-config-confwiz-bubble',
            width: '80%'
        });
        }, 500);
    });
});

JS;

$this->container->template->addJSInline($js);
?>

<div id="akeeba-config-confwiz-bubble" class="modal fade" role="dialog"
     aria-labelledby="DialogLabel" aria-hidden="true" style="display: none;">
    <div class="akeeba-renderer-fef">
        <h4>
            @lang('COM_AKEEBA_CONFIG_HEADER_CONFWIZ')
        </h4>
        <div>
            <p>
                @lang('COM_AKEEBA_CONFIG_LBL_CONFWIZ_INTRO')
            </p>
            <p>
                <a href="index.php?option=com_akeeba&view=ConfigurationWizard"
                   class="akeeba-btn--green akeeba-btn--big">
                    <span class="akion-flash"></span>
                    @lang('COM_AKEEBA_CONFWIZ')
                </a>
            </p>
            <p>
                @lang('COM_AKEEBA_CONFIG_LBL_CONFWIZ_AFTER')
            </p>
        </div>
        <div>
            <a href="#" class="akeeba-btn--ghost akeeba-btn--small" id="comAkeebaConfigurationWizardModalClose"
               onclick="akeeba.System.configurationWizardModal.close();">
                <span class="akion-close"></span>
                @lang('JCANCEL')
            </a>
        </div>
    </div>
</div>
components/com_akeeba/tmpl/Configuration/default.blade.php000060400000006133152453623440017774 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') || die();

/** @var  \Akeeba\Backup\Admin\View\Configuration\Html $this */
\AkeebaFEFHelper::loadFEFScript('Tooltip');

\Joomla\CMS\HTML\HTMLHelper::_('jquery.framework');
\Joomla\CMS\HTML\HTMLHelper::_('script', 'jui/cms.js', array('version' => 'auto', 'relative' => true));
?>
{{-- Configuration Wizard pop-up --}}
@if($this->promptForConfigurationWizard)
	@include('admin:com_akeeba/Configuration/confwiz_modal')
@endif

{{-- Modal dialog prototypes --}}
@include('admin:com_akeeba/CommonTemplates/FTPBrowser')
@include('admin:com_akeeba/CommonTemplates/SFTPBrowser')
@include('admin:com_akeeba/CommonTemplates/FTPConnectionTest')
@include('admin:com_akeeba/CommonTemplates/ErrorModal')
@include('admin:com_akeeba/CommonTemplates/FolderBrowser')

@if($this->secureSettings == 1)
    <div class="akeeba-block--success">
		@lang('COM_AKEEBA_CONFIG_UI_SETTINGS_SECURED')
    </div>
@elseif($this->secureSettings == 0)
    <div class="akeeba-block--failure">
		@lang('COM_AKEEBA_CONFIG_UI_SETTINGS_NOTSECURED')
    </div>
@endif

@include('admin:com_akeeba/CommonTemplates/ProfileName')

<div class="akeeba-block--info">
	@lang('COM_AKEEBA_CONFIG_WHERE_ARE_THE_FILTERS')
</div>

<form name="adminForm" id="adminForm" method="post" action="index.php?option=com_akeeba&view=configuration"
      class="akeeba-form--horizontal akeeba-form--with-hidden akeeba-form--configuration">

    <div class="akeeba-panel--info" style="margin-bottom: -1em">
        <header class="akeeba-block-header">
            <h5>
                @lang('COM_AKEEBA_PROFILES_LABEL_DESCRIPTION')
            </h5>
        </header>

        <div class="akeeba-form-group">
            <label for="profilename" rel="popover"
                   data-original-title="@lang('COM_AKEEBA_PROFILES_LABEL_DESCRIPTION')"
                   data-content="@lang('COM_AKEEBA_PROFILES_LABEL_DESCRIPTION_TOOLTIP')">
				@lang('COM_AKEEBA_PROFILES_LABEL_DESCRIPTION')
            </label>
            <input type="text" name="profilename" id="profilename"
                   value="{{{ $this->profileName }}}"/>
        </div>

        <div class="akeeba-form-group">
            <label class="control-label" for="quickicon" rel="popover"
                   data-original-title="@lang('COM_AKEEBA_CONFIG_QUICKICON_LABEL')"
                   data-content="@lang('COM_AKEEBA_CONFIG_QUICKICON_DESC')">
				@lang('COM_AKEEBA_CONFIG_QUICKICON_LABEL')
            </label>
            <div>
                <input type="checkbox" name="quickicon"
                       id="quickicon" {{ $this->quickIcon ? 'checked="checked"' : '' }}/>
            </div>
        </div>
    </div>

    <!-- This div contains dynamically generated user interface elements -->
    <div id="akeebagui">
    </div>

    <div class="akeeba-hidden-fields-container">
        <input type="hidden" name="task" value=""/>
        <input type="hidden" name="@token(true)" value="1"/>
    </div>
</form>
components/com_akeeba/tmpl/Log/default.blade.php000060400000004612152453623440015706 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') || die();

/** @var  \Akeeba\Backup\Admin\View\Log\Html  $this */

?>
@jhtml('formbehavior.chosen')

@if(isset($this->logs) && count($this->logs))
<form name="adminForm" id="adminForm" action="index.php" method="post" class="akeeba-form--inline">
    <div class="akeeba-form-group">
        <label for="tag">@lang('COM_AKEEBA_LOG_CHOOSE_FILE_TITLE')</label>

        {{-- Joomla 3.x: Chosen does not work with attached event handlers, only with inline event scripts (e.g. onchange) --}}
        @jhtml('select.genericlist', $this->logs, 'tag', ['list.select' => $this->tag, 'list.attr' => ['class' => 'advancedSelect', 'onchange' => 'document.forms.adminForm.submit();'], 'id' => 'comAkeebaLogTagSelector'])
    </div>

	@if(!empty($this->tag))
        <div class="akeeba-form-group--actions">
            <a class="akeeba-btn--primary" href="{{{ JUri::base() }}}index.php?option=com_akeeba&view=Log&task=download&tag={{{ $this->tag }}}">
                <span class="akion-ios-download"></span>
		        @lang('COM_AKEEBA_LOG_LABEL_DOWNLOAD')
            </a>
        </div>
	@endif

    <div class="akeeba-hidden-fields-container">
        <input name="option" value="com_akeeba" type="hidden" />
        <input name="view" value="Log" type="hidden" />
        <input type="hidden" name="@token(true)" value="1" />
    </div>

</form>
@endif

@if(!empty($this->tag))
    @if ($this->logTooBig)
        <div class="akeeba-block--warning">
            <p>
                @sprintf('COM_AKEEBA_LOG_SIZE_WARNING', number_format($this->logSize / (1024 * 1024), 2))
            </p>
            <a class="akeeba-btn--dark" id="showlog" href="#">
                @lang('COM_AKEEBA_LOG_SHOW_LOG')
            </a>
        </div>
    @endif

    <div id="iframe-holder" class="akeeba-panel--primary" style="display: {{ $this->logTooBig ? 'none' : 'block' }};">
		@if(!$this->logTooBig)
            <iframe
                src="index.php?option=com_akeeba&view=Log&task=iframe&format=raw&tag={{ urlencode($this->tag) }}"
                width="99%" height="400px">
            </iframe>
		@endif
    </div>
@endif

@if( ! (isset($this->logs) && count($this->logs)))
<div class="akeeba-block--failure">
	@lang('COM_AKEEBA_LOG_NONE_FOUND')
</div>
@endif
components/com_akeeba/tmpl/Log/raw.blade.php000060400000003537152453623440015060 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') || die();

use Akeeba\Engine\Factory;
use Joomla\CMS\Language\Text;

/** @var  \Akeeba\Backup\Admin\View\Log\Raw $this */

// -- Get the log's file name
$tag     = $this->tag;
$logFile = Factory::getLog()->getLogFilename($tag);

if (!@is_file($logFile) && @file_exists(substr($logFile, 0, -4)))
{
	/**
	 * Transitional period: the log file akeeba.tag.log.php may not exist but the akeeba.tag.log does. This
	 * addresses this transition.
	 */
	$logFile = substr($logFile, 0, -4);
}

@ob_end_clean();

if (!@file_exists($logFile))
{
	// Oops! The log doesn't exist!
	echo '<p>' . Text::_('COM_AKEEBA_LOG_ERROR_LOGFILENOTEXISTS') . '</p>';

	return;
}
else
{
	// Allright, let's load and render it
	$fp = fopen($logFile, "r");
	if ($fp === FALSE)
	{
		// Oops! The log isn't readable?!
		echo '<p>' . Text::_('COM_AKEEBA_LOG_ERROR_UNREADABLE') . '</p>';

		return;
	}

	while (!feof($fp))
	{
		$line = fgets($fp);
		if (!$line) return;
		$exploded = explode("|", $line, 3);
		unset($line);
		if (count($exploded) < 3) continue;
		switch (trim($exploded[0]))
		{
			case "ERROR":
				$fmtString = "<span style=\"color: red; font-weight: bold;\">[";
				break;
			case "WARNING":
				$fmtString = "<span style=\"color: #D8AD00; font-weight: bold;\">[";
				break;
			case "INFO":
				$fmtString = "<span style=\"color: black;\">[";
				break;
			case "DEBUG":
				$fmtString = "<span style=\"color: #666666; font-size: small;\">[";
				break;
			default:
				$fmtString = "<span style=\"font-size: small;\">[";
				break;
		}
		$fmtString .= $exploded[1] . "] " . htmlspecialchars($exploded[2]) . "</span><br/>\n";
		unset($exploded);
		echo $fmtString;
		unset($fmtString);
	}
}

@ob_start();
components/com_akeeba/Toolbar/Toolbar.php000060400000027051152453623440014525 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Toolbar;

// Protect from unauthorized access
defined('_JEXEC') || die();

use FOF40\Toolbar\Toolbar as BaseToolbar;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Toolbar\Toolbar as JToolbar;
use Joomla\CMS\Toolbar\ToolbarHelper;

class Toolbar extends BaseToolbar
{
	static $isJoomla3 = null;

	public function onAlices()
	{
		$this->setTitle('COM_AKEEBA_TITLE_ALICES');
		$this->backButton('JTOOLBAR_BACK', 'index.php?option=com_akeeba&view=ControlPanel');
	}

	public function onBackupsMain()
	{
		$this->setTitle('COM_AKEEBA_BACKUP');

		if (!$this->container->input->getBool('akeeba_hide_toolbar', false))
		{
			$this->backButton('COM_AKEEBA_CONTROLPANEL', 'index.php?option=com_akeeba');

			ToolbarHelper::spacer();
			ToolbarHelper::help('', false, 'https://www.akeeba.com/documentation/akeeba-backup-documentation/backup-now.html');
		}
	}

	public function onConfigurations()
	{
		$bar = JToolbar::getInstance('toolbar');

		$this->setTitle('COM_AKEEBA_CONFIG');

		ToolbarHelper::preferences('com_akeeba', '500', '660');
		ToolbarHelper::spacer();
		ToolbarHelper::apply();
		ToolbarHelper::save();
		ToolbarHelper::spacer();
		ToolbarHelper::custom('savenew', 'save-new.png', 'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false);
		ToolbarHelper::cancel();
		ToolbarHelper::spacer();

		// Configuration wizard button. We apply styling to it.
		$bar->appendButton('Link', 'lightning', '<strong>' . Text::_('COM_AKEEBA_CONFWIZ') . '</strong>', 'index.php?option=com_akeeba&view=ConfigurationWizard');

		ToolbarHelper::spacer();

		if (AKEEBA_PRO)
		{
			$bar->appendButton('Link', 'calendar', Text::_('COM_AKEEBA_SCHEDULE'), 'index.php?option=com_akeeba&view=Schedule');
		}

		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeeba.com/documentation/akeeba-backup-documentation/configuration.html');

		$js = <<< JS
akeeba.Loader.add('akeeba.System', function(){
    akeeba.System.documentReady(function(){
	    var elButtons = document.querySelectorAll('#toolbar-lightning>button');
	    akeeba.System.iterateNodes(elButtons, function (elButton) {
			akeeba.System.addClass(elButton, 'btn-primary');        
	    });
    });
});

JS;
		$this->container->template->addJSInline($js);
	}

	public function onConfigurationWizardsMain()
	{
		$this->setTitle('COM_AKEEBA_CONFWIZ');
		$this->backButton('COM_AKEEBA_CONTROLPANEL', 'index.php?option=com_akeeba');
		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeeba.com/documentation/akeeba-backup-documentation/configuration-wizard.html');
	}

	public function onControlPanelsMain()
	{
		$this->setTitle('COM_AKEEBA_CONTROLPANEL');
		ToolbarHelper::preferences('com_akeeba', '500', '660');
		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeeba.com/documentation/akeeba-backup-documentation/control-panel.html');
	}

	public function onDatabaseFiltersMain()
	{
		$this->setTitle('COM_AKEEBA_DBFILTER');
		$this->backButton('COM_AKEEBA_CONTROLPANEL', 'index.php?option=com_akeeba');
		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeeba.com/documentation/akeeba-backup-documentation/database-tables-exclusion.html');
	}

	public function onDiscovers()
	{
		$this->setTitle('COM_AKEEBA_DISCOVER');

		$this->backButton('COM_AKEEBA_CONTROLPANEL', 'index.php?option=com_akeeba');
		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeeba.com/documentation/akeeba-backup-documentation/discover-import-archives.html');
	}

	public function onFileFiltersMain()
	{
		$this->setTitle('COM_AKEEBA_FILEFILTERS');

		ToolbarHelper::title(Text::_('COM_AKEEBA') . ': <small>' . Text::_('COM_AKEEBA_FILEFILTERS') . '</small>', 'akeeba');
		$this->backButton('COM_AKEEBA_CONTROLPANEL', 'index.php?option=com_akeeba');
		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeeba.com/documentation/akeeba-backup-documentation/exclude-data-from-backup.html#files-and-directories-exclusion');
	}

	public function onIncludeFoldersMain()
	{
		$this->setTitle('COM_AKEEBA_INCLUDEFOLDER');

		$this->backButton('COM_AKEEBA_CONTROLPANEL', 'index.php?option=com_akeeba');
		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeeba.com/documentation/akeeba-backup-documentation/off-site-directories-inclusion.html');
	}

	public function onLogs()
	{
		$this->setTitle('COM_AKEEBA_LOG');

		$this->backButton('COM_AKEEBA_CONTROLPANEL', 'index.php?option=com_akeeba');
		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeeba.com/documentation/akeeba-backup-documentation/view-log.html');
	}

	public function onManagesDefault()
	{
		$this->setTitle('COM_AKEEBA_BUADMIN');

		if (AKEEBA_PRO)
		{
			$bar  = JToolbar::getInstance('toolbar');
			$icon = $this->isJoomla3() ? 'folder-open' : 'search';
			$bar->appendButton('Link', $icon, Text::_('COM_AKEEBA_DISCOVER'), 'index.php?option=com_akeeba&view=Discover');
		}

		$user        = $this->container->platform->getUser();
		$permissions = [
			'configure' => $user->authorise('akeeba.configure', 'com_akeeba'),
			'backup'    => $user->authorise('akeeba.backup', 'com_akeeba'),
		];

		if ($permissions['configure'] && AKEEBA_PRO)
		{
			ToolbarHelper::publish('restore', Text::_('COM_AKEEBA_BUADMIN_LABEL_RESTORE'));
		}

		if ($permissions['backup'])
		{
			ToolbarHelper::editList('showcomment', Text::_('COM_AKEEBA_BUADMIN_LOG_EDITCOMMENT'));
		}

		if ($permissions['configure'] || $permissions['backup'])
		{
			ToolbarHelper::spacer();
		}

		if ($permissions['backup'])
		{
			ToolbarHelper::deleteList();
			ToolbarHelper::custom('deletefiles', 'delete.png', 'delete_f2.png', Text::_('COM_AKEEBA_BUADMIN_LABEL_DELETEFILES'), true);
			ToolbarHelper::spacer();
		}

		$this->backButton('COM_AKEEBA_CONTROLPANEL', 'index.php?option=com_akeeba');
		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeeba.com/documentation/akeeba-backup-documentation/adminsiter-backup-files.html');
	}

	public function onManagesShowcomment()
	{
		$this->setTitle('COM_AKEEBA_BUADMIN');

		$this->backButton('COM_AKEEBA_CONTROLPANEL', 'index.php?option=com_akeeba');
		ToolbarHelper::save();
		ToolbarHelper::cancel();
		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeeba.com/documentation/akeeba-backup-documentation/adminsiter-backup-files.html');
	}

	public function onMultipleDatabasesMain()
	{
		$this->setTitle('COM_AKEEBA_MULTIDB');

		$this->backButton('COM_AKEEBA_CONTROLPANEL', 'index.php?option=com_akeeba');
		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeeba.com/documentation/akeeba-backup-documentation/include-data-to-archive.html#multiple-db-definitions');
	}

	public function onProfilesAdd()
	{
		parent::onAdd();

		$this->setTitle('COM_AKEEBA_PROFILES_PAGETITLE_NEW');

		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeeba.com/documentation/akeeba-backup-documentation/using-basic-operations.html#profiles-management');
	}

	public function onProfilesBrowse()
	{
		$this->setTitle('COM_AKEEBA_PROFILES');

		$this->backButton('COM_AKEEBA_CONTROLPANEL', 'index.php?option=com_akeeba');
		ToolbarHelper::spacer();
		ToolbarHelper::addNew();
		ToolbarHelper::custom('copy', 'copy.png', 'copy_f2.png', 'COM_AKEEBA_LBL_BATCH_COPY', false);
		ToolbarHelper::spacer();
		ToolbarHelper::deleteList();
		ToolbarHelper::spacer();
		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeeba.com/documentation/akeeba-backup-documentation/using-basic-operations.html#profiles-management');
	}

	public function onProfilesEdit()
	{
		parent::onEdit();

		$this->setTitle('COM_AKEEBA_PROFILES_PAGETITLE_EDIT');

		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeeba.com/documentation/akeeba-backup-documentation/using-basic-operations.html#profiles-management');
	}

	public function onRegExDatabaseFiltersMain()
	{
		$this->setTitle('COM_AKEEBA_REGEXDBFILTERS');

		$this->backButton('COM_AKEEBA_CONTROLPANEL', 'index.php?option=com_akeeba');
		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeeba.com/documentation/akeeba-backup-documentation/regex-database-tables-exclusion.html');
	}

	public function onRegExFileFiltersMain()
	{
		$this->setTitle('COM_AKEEBA_REGEXFSFILTERS');

		$this->backButton('COM_AKEEBA_CONTROLPANEL', 'index.php?option=com_akeeba');
		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeeba.com/documentation/akeeba-backup-documentation/regex-files-directories-exclusion.html');
	}

	public function onRemoteFilesDownloadToServer()
	{
		$this->setTitle('COM_AKEEBA_REMOTEFILES');

		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeeba.com/documentation/akeeba-backup-documentation/ch03s03s05s02.html');
	}

	public function onRemoteFilesListActions()
	{
		$this->setTitle('COM_AKEEBA_REMOTEFILES');

		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeeba.com/documentation/akeeba-backup-documentation/manage-remotely-stored-files.html');
	}

	public function onRestores()
	{
		$this->setTitle('COM_AKEEBA_RESTORE');

		$this->backButton('COM_AKEEBA_CONTROLPANEL', 'index.php?option=com_akeeba');
		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeeba.com/documentation/akeeba-backup-documentation/adminsiter-backup-files.html#integrated-restoration');
	}

	public function onS3ImportsMain()
	{
		$this->setTitle('COM_AKEEBA_S3IMPORT');

		$this->backButton('COM_AKEEBA_CONTROLPANEL', 'index.php?option=com_akeeba');
		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeebabackup .com/documentation/akeeba-backup-documentation/import-s3.html');
	}

	public function onS3ImportsDltoserver()
	{
		$this->setTitle('COM_AKEEBA_S3IMPORT');

		$this->backButton('COM_AKEEBA_CONTROLPANEL', 'index.php?option=com_akeeba');
		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeebabackup .com/documentation/akeeba-backup-documentation/import-s3.html');
	}

	public function onSchedules()
	{
		$this->setTitle('COM_AKEEBA_SCHEDULE');

		$this->backButton('COM_AKEEBA_CONTROLPANEL', 'index.php?option=com_akeeba');
		ToolbarHelper::spacer();
		ToolbarHelper::help('', false, 'https://www.akeeba.com/documentation/akeeba-backup-documentation/automating-your-backup.html');
	}

	public function onStatisticsMain()
	{
		$this->onManagesDefault();
	}

	public function onTransfers()
	{
		$this->setTitle('COM_AKEEBA_TRANSFER');

		$this->backButton('COM_AKEEBA_CONTROLPANEL', 'index.php?option=com_akeeba');

		$bar  = JToolbar::getInstance('toolbar');
		$icon = $this->isJoomla3() ? 'loop' : 'refresh';
		$bar->appendButton('Link', $icon, 'COM_AKEEBA_TRANSFER_BTN_RESET', 'index.php?option=com_akeeba&view=Transfer&task=reset');
	}

	protected function isJoomla3()
	{
		if (is_null(self::$isJoomla3))
		{
			self::$isJoomla3 = version_compare(JVERSION, '3.999.999', 'lt');
		}

		return self::$isJoomla3;
	}

	protected function setTitle($viewTitle)
	{
		$title = Text::_('COM_AKEEBA');

		if ($this->isJoomla3())
		{
			$icon  = 'akeeba';
			$title .= ' <span style="display: none;"> - </span><small>';
		}
		else
		{
			$icon  = 'akeeba-j4';
			$title .= "<small> – ";
		}

		$title .= Text::_($viewTitle) . "</small>";

		ToolbarHelper::title($title, $icon);
	}

	protected function backButton($label, $link)
	{
		if ($this->isJoomla3())
		{
			ToolbarHelper::back($label, $link);

			return;
		}

		$bar = JToolbar::getInstance('toolbar');
		$bar->appendButton('Link', 'chevron-left', $label, $link);
	}
}
components/com_akeeba/Toolbar/.htaccess000060400000000246152453623440014205 0ustar00<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
  <RequireAll>
    Require all denied
  </RequireAll>
</IfModule>
components/com_akeeba/Toolbar/web.config000060400000001025152453623440014347 0ustar00<?xml version="1.0"?>
<!--
    This only works on IIS 7 or later. See https://www.iis.net/configreference/system.webserver/security/requestfiltering/fileextensions
-->
<configuration>
    <system.webServer>
        <security>
            <requestFiltering>
                <fileExtensions allowUnlisted="false" >
                    <clear />
                    <add fileExtension=".html" allowed="true"/>
                </fileExtensions>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>components/com_akeeba/Model/SFTPBrowser.php000060400000011117152453623440014675 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Model;

// Protect from unauthorized access
defined('_JEXEC') || die();

use FOF40\Model\Model;
use Joomla\CMS\Language\Text;
use RuntimeException;

class SFTPBrowser extends Model
{
	/**
	 * The SFTP server hostname
	 *
	 * @var  string
	 */
	public $host = '';

	/**
	 * The SFTP server port number (default: 22)
	 *
	 * @var  int
	 */
	public $port = 22;

	/**
	 * Username for logging in
	 *
	 * @var  string
	 */
	public $username = '';

	/**
	 * Password for logging in
	 *
	 * @var  string
	 */
	public $password = '';

	/**
	 * Private key file for connection
	 *
	 * @var  string
	 */
	public $privkey = '';

	/**
	 * Public key file for connection
	 *
	 * @var string
	 */
	public $pubkey = '';

	/**
	 * The directory to browse
	 *
	 * @var  string
	 */
	public $directory = '';

	/**
	 * Breadcrumbs to the current directory
	 *
	 * @var  array
	 */
	public $parts = [];

	/**
	 * Path to the parent directory
	 *
	 * @var  string
	 */
	public $parent_directory = null;

	/**
	 * Gets the folders contained in the remote FTP root directory defined in $this->directory
	 *
	 * @return  array
	 */
	public function getListing()
	{
		$dir = $this->directory;

		// Parse directory to parts
		$parsed_dir  = trim($dir, '/');
		$this->parts = empty($parsed_dir) ? [] : explode('/', $parsed_dir);

		// Find the path to the parent directory
		$this->parent_directory = '';

		if (!empty($this->parts))
		{
			$copy_of_parts = $this->parts;
			array_pop($copy_of_parts);

			$this->parent_directory = '/';

			if (!empty($copy_of_parts))
			{
				$this->parent_directory = '/' . implode('/', $copy_of_parts);
			}
		}

		// Initialise
		$connection = null;
		$sftphandle = null;

		// Open a connection
		if (!function_exists('ssh2_connect'))
		{
			throw new RuntimeException("Your web server does not have the SSH2 PHP module, therefore can not connect and upload archives to SFTP servers.");
		}

		$connection = ssh2_connect($this->host, $this->port);

		if ($connection === false)
		{
			throw new RuntimeException("Invalid SFTP hostname or port ({$this->host}:{$this->port}) or the connection is blocked by your web server's firewall.");
		}

		// Connect to the server

		if (!empty($this->pubkey) && !empty($this->privkey))
		{
			if (!ssh2_auth_pubkey_file($connection, $this->username, $this->pubkey, $this->privkey, $this->password))
			{
				throw new RuntimeException('Certificate error');
			}
		}
		else
		{
			if (!ssh2_auth_password($connection, $this->username, $this->password))
			{
				throw new RuntimeException('Could not authenticate access to SFTP server; check your username and password.');
			}
		}

		$sftphandle = ssh2_sftp($connection);

		if ($sftphandle === false)
		{
			throw new RuntimeException("Your SSH server does not allow SFTP connections");
		}

		// Get a raw directory listing (hoping it's a UNIX server!)
		$list = [];
		$dir  = ltrim($dir, '/');

		if (empty($dir))
		{
			$dir = ssh2_sftp_realpath($sftphandle, ".");

			$this->directory = $dir;

			// Parse directory to parts
			$parsed_dir  = trim($dir, '/');
			$this->parts = empty($parsed_dir) ? [] : explode('/', $parsed_dir);

			// Find the path to the parent directory
			$this->parent_directory = '';

			if (!empty($this->parts))
			{
				$copy_of_parts = $this->parts;
				array_pop($copy_of_parts);

				$this->parent_directory = '/';

				if (!empty($copy_of_parts))
				{
					$this->parent_directory = '/' . implode('/', $copy_of_parts);
				}
			}
		}

		$handle = opendir("ssh2.sftp://$sftphandle/$dir");

		if (!is_resource($handle))
		{
			throw new RuntimeException(Text::_('COM_AKEEBA_SFTPBROWSER_ERROR_NOACCESS'));
		}

		while (($entry = readdir($handle)) !== false)
		{
			if (substr($entry, 0, 1) == '.')
			{
				continue;
			}

			if (!is_dir("ssh2.sftp://$sftphandle/$dir/$entry"))
			{
				continue;
			}

			$list[] = $entry;
		}

		closedir($handle);

		if (!empty($list))
		{
			asort($list);
		}

		return $list;
	}

	/**
	 * Perform the actual folder browsing. Returns an array that's usable by the UI.
	 *
	 * @return  array
	 */
	public function doBrowse()
	{
		$error = '';
		$list  = [];

		try
		{
			$list = $this->getListing();
		}
		catch (RuntimeException $e)
		{
			$error = $e->getMessage();
		}

		$response_array = [
			'error'       => $error,
			'list'        => $list,
			'breadcrumbs' => $this->parts,
			'directory'   => $this->directory,
			'parent'      => $this->parent_directory,
		];

		return $response_array;
	}
}
components/com_akeeba/Model/Exceptions/TransferFatalError.php000060400000000535152453623440020446 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Model\Exceptions;

// Protect from unauthorized access
defined('_JEXEC') || die();

class TransferFatalError extends \RuntimeException
{

}
components/com_akeeba/Model/Exceptions/FrozenRecordError.php000060400000000534152453623440020313 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Model\Exceptions;

// Protect from unauthorized access
defined('_JEXEC') || die();

class FrozenRecordError extends \RuntimeException
{

}
components/com_akeeba/Model/Exceptions/TransferIgnorableError.php000060400000000541152453623440021316 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Model\Exceptions;

// Protect from unauthorized access
defined('_JEXEC') || die();

class TransferIgnorableError extends \RuntimeException
{

}
components/com_akeeba/Model/web.config000060400000001025152453623440014005 0ustar00<?xml version="1.0"?>
<!--
    This only works on IIS 7 or later. See https://www.iis.net/configreference/system.webserver/security/requestfiltering/fileextensions
-->
<configuration>
    <system.webServer>
        <security>
            <requestFiltering>
                <fileExtensions allowUnlisted="false" >
                    <clear />
                    <add fileExtension=".html" allowed="true"/>
                </fileExtensions>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>components/com_akeeba/Model/ConfigurationWizard.php000060400000037164152453623440016557 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Model;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Model\Mixin\Chmod;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use FOF40\Model\Model;

/**
 * ConfigurationWizard model. Contains the business logic for the configuration wizard.
 */
class ConfigurationWizard extends Model
{
	use Chmod;

	/**
	 * Attempts to automatically figure out where the output and temporary directories should point, adjusting their
	 * permissions should it be necessary.
	 *
	 * @param   bool  $dontRecurse  Used internally. Always skip this parameter when calling this method.
	 *
	 * @return  bool  True if we could fix the directories
	 */
	public function autofixDirectories(bool $dontRecurse = false)
	{
		// Get the output directory, translated
		$engineConfig    = Factory::getConfiguration();
		$outputDirectory = $engineConfig->get('akeeba.basic.output_directory', '');
		$fixOut          = true;

		// If no output directory is specified set it the default output and retry.
		if (empty($outputDirectory) && !$dontRecurse)
		{
			/** @var @var Configuration $model $model */
			$model = $this->container->factory->model('Configuration')->tmpInstance();

			$model->setState('engineconfig', [
				'akeeba.basic.output_directory' => '[DEFAULT_OUTPUT]',
			]);
			$model->saveEngineConfig();

			return $this->autofixDirectories(true);
		}

		// Is the folder writeable?
		if (is_dir($outputDirectory))
		{
			$filename = $outputDirectory . '/test.dat';
			$fixOut   = !@file_put_contents($filename, 'test');

			if (!$fixOut)
			{
				// Directory writable, remove the temp file
				@unlink($filename);
			}
		}

		// Do I need to change the permissions?
		if ($fixOut)
		{
			// Try to chmod the directory
			$this->chmod($outputDirectory, 511);

			// Repeat the test
			$filename = $outputDirectory . '/test.dat';
			$fixOut   = !@file_put_contents($filename, 'test');

			if (!$fixOut)
			{
				// Directory writable, remove the temp file
				@unlink($filename);
			}
		}

		/**
		 * If we reached this point after recursion, we can't fix the permissions of the default backup output folder.
		 * The user has to manually select a writeable backup output directory (or make the default otuput writeable).
		 */
		if ($fixOut && $dontRecurse)
		{
			return false;
		}

		/**
		 * Write the output folder through the Configuration model. This ensures that:
		 *
		 * - we are not trying to use the site's root as the output folder.
		 * - the output folder saved in the database contains an abstracted representation of the folder, using path
		 *   variables instead of absolute filesystem folders.
		 *
		 * @var Configuration $model
		 */
		$model = $this->container->factory->model('Configuration')->tmpInstance();

		// Do I have to fall back to the default output directory?
		$outputDirectory = $fixOut ? '[DEFAULT_OUTPUT]' : $outputDirectory;

		$model->setState('engineconfig', [
			'akeeba.basic.output_directory' => $outputDirectory,
		]);
		$model->saveEngineConfig();

		/**
		 * If we had to revert to the default output we will run ourselves again to make sure that the default backup
		 * output folder is, in fact, writeable.
		 */
		if ($fixOut)
		{
			return $this->autofixDirectories(true);
		}

		return true;
	}

	/**
	 * Creates a temporary file of a specific size
	 *
	 * @param   int          $blocks How many 128Kb blocks to write. Common values: 1, 2, 4, 16, 40, 80, 81
	 * @param   string|null  $tempdir
	 *
	 * @return  bool  TRUE on success
	 */
	public function createTempFile($blocks = 1, $tempdir = null)
	{
		if (empty($tempdir))
		{
			$aeconfig = Factory::getConfiguration();
			$tempdir  = $aeconfig->get('akeeba.basic.output_directory', '');
		}

		$sixtyfourBytes = '012345678901234567890123456789012345678901234567890123456789ABCD';
		$oneKilo        = '';
		$oneBlock       = '';

		for ($i = 0; $i < 16; $i ++)
		{
			$oneKilo .= $sixtyfourBytes;
		}

		for ($i = 0; $i < 128; $i ++)
		{
			$oneBlock .= $oneKilo;
		}

		$filename = tempnam($tempdir, 'confwiz');
		@unlink($filename);

		$fp = @fopen($filename, 'w');

		if ($fp !== false)
		{
			for ($i = 0; $i < $blocks; $i ++)
			{
				if (!@fwrite($fp, $oneBlock))
				{
					@fclose($fp);
					@unlink($filename);

					return false;
				}
			}

			@fclose($fp);
			@unlink($filename);
		}
		else
		{
			return false;
		}

		return true;
	}

	/**
	 * Sleeps for a given amount of time. Returns false if the sleep time requested is over the maximum execution time.
	 *
	 * @param   int  $secondsDelay  Seconds to sleep
	 *
	 * @return  bool  FALSE if we cannot sleep that long
	 */
	public function doNothing($secondsDelay = 1)
	{
		// Try to get the maximum execution time and PHP memory limit
		if (function_exists('ini_get'))
		{
			$maxexec  = ini_get("max_execution_time");
			$memlimit = ini_get("memory_limit");
		}
		else
		{
			$maxexec  = 14;
			$memlimit = 16777216;
		}

		// Unknown time limit; suppose 10s
		if (!is_numeric($maxexec) || ($maxexec == 0))
		{
			$maxexec = 10;
		}

		// Some servers report silly values, i.e. 30000, which Do Not Work™ :(
		if ($maxexec > 180)
		{
			$maxexec = 10;
		}

		// Sometimes memlimit comes with the M or K suffixes. Parse them.
		if (is_string($memlimit))
		{
			$memlimit = strtoupper(trim(str_replace(' ', '', $memlimit)));

			if (substr($memlimit, - 1) == 'K')
			{
				$memlimit = 1024 * substr($memlimit, 0, - 1);
			}
			elseif (substr($memlimit, - 1) == 'M')
			{
				$memlimit = 1024 * 1024 * substr($memlimit, 0, - 1);
			}
			elseif (substr($memlimit, - 1) == 'G')
			{
				$memlimit = 1024 * 1024 * 1024 * substr($memlimit, 0, - 1);
			}
		}

		// Unknown limit; suppose 16M
		if (!is_numeric($memlimit) || ($memlimit === 0))
		{
			$memlimit = 16777216;
		}

		// No limit; suppose 128M
		if ($memlimit === - 1)
		{
			$memlimit = 134217728;
		}

		// Get the current memory usage (or assume one if the metric is not available)
		if (function_exists('memory_get_usage'))
		{
			$usedram = memory_get_usage();
		}
		else
		{
			$usedram = 7340032; // Suppose 7M of RAM usage if the metric isn't available;
		}

		// If we have less than 12M of RAM left, we have to limit ourselves to 6 seconds of
		// total execution time (emperical value!) to avoid deadly memory outages
		if (($memlimit - $usedram) < 12582912)
		{
			$maxexec = 5;
		}

		// If the requested delay is over the $maxexec limit (minus one second
		// for application initialization), return false
		if ($secondsDelay > ($maxexec - 1))
		{
			return false;
		}

		// And now, run the silly loop to simulate the CPU usage pattern during backup
		$start = microtime(true);
		$loop  = true;

		while ($loop)
		{
			// Waste some CPU power...
			for ($i = 1; $i < 1000; $i ++)
			{
				$j = exp((int)($i * $i / 123 * 864) >> 2);
			}

			// ... then sleep for a millisec
			usleep(1000);

			// Are we done yet?
			$end = microtime(true);

			if (($end - $start) >= $secondsDelay)
			{
				$loop = false;
			}
		}

		return true;
	}

	/**
	 * This method will analyze your database tables and try to figure out the optimal batch row count value so that its
	 * SELECT doesn't return excessive amounts of data. The only drawback is that it only accounts for the core tables,
	 * but that is usually a good metric.
	 *
	 * @return  void
	 */
	public function analyzeDatabase()
	{
		// Try to get the PHP memory limit
		if (function_exists('ini_get'))
		{
			$memlimit = ini_get("memory_limit");
		}
		else
		{
			$memlimit = 16777216;
		}

		if (!is_numeric($memlimit) || ($memlimit === 0))
		{
			$memlimit = 16777216; // Unknown limit; suppose 16M
		}

		if ($memlimit === - 1)
		{
			$memlimit = 134217728; // No limit; suppose 128M
		}

		// Get the current memory usage (or assume one if the metric is not available)
		if (function_exists('memory_get_usage'))
		{
			$usedram = memory_get_usage();
		}
		else
		{
			$usedram = 7340032; // Suppose 7M of RAM usage if the metric isn't available;
		}

		// How much RAM can I spare? It's the max memory minus the current memory usage and an extra
		// 5Mb to cater for Akeeba Engine's peak memory usage
		$max_mem_usage = $usedram + 5242880;
		$ram_allowance = $memlimit - $max_mem_usage;

		// If the RAM allowance is too low, assume 2Mb (emperical value)
		if ($ram_allowance < 2097152)
		{
			$ram_allowance = 2097152;
		}

		// If SHOW TABLE STATUS is not supported this is a safe-ish value.
		$rowCount = 100;

		// Get the table statistics
		$db = $this->container->db;

		if (strtolower(substr($db->name, 0, 5)) == 'mysql')
		{
			// The table analyzer only works with MySQL
			$db->setQuery("SHOW TABLE STATUS");

			try
			{
				$metrics = $db->loadAssocList();

				if (method_exists($db, 'getError') && $db->getError())
				{
					$metrics = null;
				}
			}
			catch (\Exception $exc)
			{
				$metrics = null;
			}

			// SHOW TABLE STATUS is supported.
			if (!is_null($metrics))
			{
				$rowCount = 1000; // Start with the default value

				if (!empty($metrics))
				{
					foreach ($metrics as $table)
					{
						// Get row count and average row length
						$rows    = $table['Rows'];
						$avg_len = $table['Avg_row_length'];

						// Calculate RAM usage with current settings
						$max_rows        = min($rows, $rowCount);
						$max_ram_current = $max_rows * $avg_len;

						if ($max_ram_current > $ram_allowance)
						{
							// Hm... over the allowance. Let's try to find a sweet spot.
							$max_rows = (int) ($ram_allowance / $avg_len);
							// Quantize to multiple of 10 rows
							$max_rows = 10 * floor($max_rows / 10);

							// Can't really go below 10 rows / batch
							if ($max_rows < 10)
							{
								$max_rows = 10;
							}

							// If the new setting is less than the current $rowCount, use the new setting
							if ($rowCount > $max_rows)
							{
								$rowCount = $max_rows;
							}
						}
					}
				}
			}
		}

		$profile_id = Platform::getInstance()->get_active_profile();
		$config     = Factory::getConfiguration();

		// Use the correct database dump engine
		$config->set('akeeba.advanced.dump_engine', 'reverse');

		if (strpos($db->name, 'mysql') !== false)
		{
			$config->set('akeeba.advanced.dump_engine', 'native');
		}

		// Save the row count per batch
		$config->set('engine.dump.common.batchsize', $rowCount);

		// Enable SQL file splitting - default is 512K unless the part_size is less than that!
		$splitsize = 524288;
		$partsize  = $config->get('engine.archiver.common.part_size', 0);

		if (($partsize < $splitsize) && !empty($partsize))
		{
			$splitsize = $partsize;
		}

		$config->set('engine.dump.common.splitsize', $splitsize);

		// Enable extended INSERTs
		$config->set('engine.dump.common.extended_inserts', '1');

		// Determine optimal packet size (must be at most two fifths of the split size and no more than 256K)
		$packet_size = (int) $splitsize * 0.4;

		if ($packet_size > 262144)
		{
			$packet_size = 262144;
		}

		$config->set('engine.dump.common.packet_size', $packet_size);

		// Enable the native dump engine
		$config->set('akeeba.advanced.dump_engine', 'native');

		Platform::getInstance()->save_configuration($profile_id);
	}

	/**
	 * Executes the action requested through AJAX
	 *
	 * @return  bool
	 */
	public function runAjax()
	{
		// Only allowed actions
		$allowedActions = [
			'ping', 'minexec', 'applyminexec', 'directories', 'database', 'maxexec', 'applymaxexec', 'partsize', 'flush'
		];

		// Get the requested action from the model state
		$action = $this->getState('act');

		$result = false;

		if (in_array($action, $allowedActions) && method_exists($this, $action))
		{
			$result = call_user_func([$this, $action]);
		}

		return $result;
	}

	/**
	 * Pings the configuration wizard process and marks the current profile as configured
	 *
	 * @return  bool  TRUE, always
	 */
	private function ping()
	{
		// Get the profile ID
		$profile_id = Platform::getInstance()->get_active_profile();

		// Set the embedded installer to the default ANGIE installer
		$engineConfig = Factory::getConfiguration();
		$engineConfig->set('akeeba.advanced.embedded_installer', 'angie');

		// And mark this profile as already configured
		$engineConfig->set('akeeba.flag.confwiz', 1);

		Platform::getInstance()->save_configuration($profile_id);

		return true;
	}

	/**
	 * Try different values of minimum execution time
	 *
	 * @return  bool  TRUE, always
	 */
	private function minexec()
	{
		$seconds = $this->input->get('seconds', '0.5', 'float');

		if ($seconds < 1)
		{
			usleep($seconds * 1000000);
		}
		else
		{
			sleep($seconds);
		}

		return true;
	}

	/**
	 * Saves the AJAX preference and the minimum execution time
	 *
	 * @return  bool  TRUE, always
	 */
	private function applyminexec()
	{
		// Get the user parameters
		$minexec = $this->input->get('minexec', 2.0, 'float');

		// Save the settings
		$profile_id   = Platform::getInstance()->get_active_profile();
		$engineConfig = Factory::getConfiguration();
		$engineConfig->set('akeeba.tuning.min_exec_time', $minexec * 1000);
		Platform::getInstance()->save_configuration($profile_id);

		// Enforce the min exec time
		$timer = Factory::getTimer();
		$timer->enforce_min_exec_time(false);

		// Done!
		return true;
	}

	/**
	 * Try to make the directories writable or provide a set of writable directories
	 *
	 * @return  bool  TRUE if we coud fix the permissions of the directories
	 */
	private function directories()
	{
		$timer  = Factory::getTimer();
		$result = $this->autofixDirectories();
		$timer->enforce_min_exec_time(false);

		return $result;
	}

	/**
	 * Analyze the database and apply optimized database dump settings
	 *
	 * @return  bool  TRUE if we were successful
	 */
	private function database()
	{
		$timer = Factory::getTimer();
		$this->analyzeDatabase();
		$timer->enforce_min_exec_time(false);

		return true;
	}

	/**
	 * Try to apply a specific maximum execution time setting
	 *
	 * @return  bool
	 */
	private function maxexec()
	{
		$seconds = $this->input->get('seconds', 30, 'int');
		$timer   = Factory::getTimer();
		$result  = $this->doNothing($seconds);
		$timer->enforce_min_exec_time(false);

		return $result;
	}

	/**
	 * Save a specific maximum execution time preference to the database
	 *
	 * @return  bool
	 */
	private function applymaxexec()
	{
		// Get the user parameters
		$maxexec = $this->input->get('seconds', 2, 'int');

		// Save the settings
		$timer      = Factory::getTimer();
		$profile_id = Platform::getInstance()->get_active_profile();
		$config     = Factory::getConfiguration();
		$config->set('akeeba.tuning.max_exec_time', $maxexec);
		$config->set('akeeba.tuning.run_time_bias', '75');
		$config->set('akeeba.advanced.scan_engine', 'smart');
		$config->set('akeeba.advanced.archiver_engine', 'jpa');
		Platform::getInstance()->save_configuration($profile_id);

		// Enforce the min exec time
		$timer->enforce_min_exec_time(false);

		// Done!
		return true;
	}

	/**
	 * Creates a dummy file of a given size. Remember to give the filesize query parameter in bytes!
	 *
	 * @return  bool
	 */
	public function partsize()
	{
		$timer  = Factory::getTimer();
		$blocks = $this->input->get('blocks', 1, 'int');

		$result = $this->createTempFile($blocks);

		if ($result)
		{
			// Save the setting
			if ($blocks > 200)
			{
				$blocks = 16383; // Over 25Mb = 2Gb minus 128Kb limit (safe setting for PHP not running on 64-bit Linux)
			}

			$profile_id = Platform::getInstance()->get_active_profile();
			$config     = Factory::getConfiguration();
			$config->set('engine.archiver.common.part_size', $blocks * 128 * 1024);
			Platform::getInstance()->save_configuration($profile_id);
		}

		// Enforce the min exec time
		$timer->enforce_min_exec_time(false);

		return $result;
	}
}
components/com_akeeba/Model/FileFilters.php000060400000027650152453623440014776 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Model;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Model\Mixin\ExclusionFilter;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use FOF40\Container\Container;
use FOF40\Model\Model;

/**
 * File Filters model
 *
 * Handles the exclusion of files and directories
 */
class FileFilters extends Model
{
	use ExclusionFilter;

	public function __construct(Container $container, array $config)
	{
		parent::__construct($container, $config);

		$this->knownFilterTypes = ['directories', 'files', 'skipdirs', 'skipfiles'];
	}

	/**
	 * Returns a listing of contained directories and files, as well as their exclusion status
	 *
	 * @param   string  $root  The root directory
	 * @param   string  $node  The subdirectory to scan
	 *
	 * @return  array
	 */
	private function &get_listing($root, $node)
	{
		// Initialize the absolute directory root
		$directory = substr($root, 0);

		// Replace stock directory tags, like [SITEROOT]
		$stock_dirs = Platform::getInstance()->get_stock_directories();

		if (!empty($stock_dirs))
		{
			foreach ($stock_dirs as $key => $replacement)
			{
				$directory = str_replace($key, $replacement, $directory);
			}
		}

		$directory = Factory::getFilesystemTools()->TranslateWinPath($directory);

		// Clean and add the node
		$node = Factory::getFilesystemTools()->TranslateWinPath($node);

		// Just a directory separator is treated as no directory at all
		if (($node == '/'))
		{
			$node = '';
		}

		// Trim leading and trailing slashes
		$node = trim($node, '/');

		// Add node to directory
		if (!empty($node))
		{
			$directory .= '/' . $node;
		}

		// Add any required trailing slash to the node to be used below
		if (!empty($node))
		{
			$node .= '/';
		}

		// Get a filters instance
		$filters = Factory::getFilters();

		// Get a listing of folders and process it
		$folders = Factory::getFileLister()->getFolders($directory);
		$folders_out = array();

		if (!empty($folders))
		{
			asort($folders);

			foreach ($folders as $folder)
			{
				$folder = Factory::getFilesystemTools()->TranslateWinPath($folder);

				// Filter out files whose names result to an empty JSON representation
				$json_folder = json_encode($folder);
				$folder      = json_decode($json_folder);

				if (empty($folder))
				{
					continue;
				}

				$test   = $node . $folder;
				$status = array();

				// Check dir/all filter (exclude)
				$result                = $filters->isFilteredExtended($test, $root, 'dir', 'all', $byFilter);
				$status['directories'] = (!$result) ? 0 : (($byFilter == 'directories') ? 1 : 2);

				// Check dir/content filter (skip_files)
				$result              = $filters->isFilteredExtended($test, $root, 'dir', 'content', $byFilter);
				$status['skipfiles'] = (!$result) ? 0 : (($byFilter == 'skipfiles') ? 1 : 2);

				// Check dir/children filter (skip_dirs)
				$result             = $filters->isFilteredExtended($test, $root, 'dir', 'children', $byFilter);
				$status['skipdirs'] = (!$result) ? 0 : (($byFilter == 'skipdirs') ? 1 : 2);

				$status['link']  = @is_link($directory . '/' . $folder);

				// Add to output array
				$folders_out[ $folder ] = $status;
			}
		}

		unset($folders);
		$folders = $folders_out;

		// Get a listing of files and process it
		$files = Factory::getFileLister()->getFiles($directory);
		$files_out = array();

		if (!empty($files))
		{
			asort($files);

			foreach ($files as $file)
			{
				// Filter out files whose names result to an empty JSON representation
				$json_file = json_encode($file);
				$file      = json_decode($json_file);

				if (empty($file))
				{
					continue;
				}

				$test   = $node . $file;
				$status = [];

				// Check file/all filter (exclude)
				$result          = $filters->isFilteredExtended($test, $root, 'file', 'all', $byFilter);
				$status['files'] = (!$result) ? 0 : (($byFilter == 'files') ? 1 : 2);
				$status['size']  = $this->formatSize(@filesize($directory . '/' . $file), 1);
				$status['link']  = @is_link($directory . '/' . $file);

				// Add to output array
				$files_out[$file] = $status;
			}
		}

		unset($files);
		$files = $files_out;

		// Return a compiled array
		$retarray = array(
			'folders' => $folders,
			'files'   => $files
		);

		return $retarray;

		/* Return array format
		 * [array] :
		 * 		'folders' [array] :
		 * 			(folder_name) => [array]:
		 *				'directories'	=> 0|1|2
		 *				'skipfiles'		=> 0|1|2
		 *				'skipdirs'		=> 0|1|2
		 *		'files' [array] :
		 *			(file_name) => [array]:
		 *				'files'			=> 0|1|2
		 *
		 * Legend:
		 * 0 -> Not excluded
		 * 1 -> Excluded by the direct filter
		 * 2 -> Excluded by another filter (regex, api, an unknown plugin filter...)
		 */
	}

	/**
	 * Glues the current directory crumbs and the child directory into a node string
	 *
	 * @param   array|string  $crumbs  Breadcrumbs in array or JSON encoded array format
	 * @param   string        $child   The child folder (relative to the root defined by crumbs)
	 *
	 * @return  string  The absolute node (path) of the $child
	 */
	private function glue_crumbs(&$crumbs, $child)
	{
		// Construct the full node
		$node = '';

		// Some servers do not decode the crumbs. I don't know why!
		if (!is_array($crumbs) && (substr($crumbs, 0, 1) == '['))
		{
			$crumbs = @json_decode($crumbs);

			if ($crumbs === false)
			{
				$crumbs = array();
			}
		}

		if (!is_array($crumbs))
		{
			$crumbs = array();
		}

		array_walk($crumbs, function ($value, $index) {
			if (in_array(trim($value), array('.', '..')))
			{
				throw new \InvalidArgumentException("Unacceptable folder crumbs");
			}
		});

		if ((stristr($child, '/..') !== false) || (stristr($child, '\..') !== false))
		{
			throw new \InvalidArgumentException("Unacceptable child folder");
		}

		if (!empty($crumbs))
		{
			$node = implode('/', $crumbs);
		}

		if (!empty($node))
		{
			$node .= '/';
		}

		if (!empty($child))
		{
			$node .= $child;
		}

		return $node;
	}

	/**
	 * Returns an array with the listing and filter status of a directory
	 *
	 * @param   string        $root    Root directory
	 * @param   array|string  $crumbs  Breadcrumbs in array or JSON encoded array format, defining the parent directory
	 * @param   string        $child   The child directory we want to scan
	 *
	 * @return array
	 */
	public function make_listing($root, $crumbs = [], $child = '')
	{
		// Construct the full node
		$node = $this->glue_crumbs($crumbs, $child);

		// Create the new crumbs
		if (!is_array($crumbs))
		{
			$crumbs = array();
		}

		if (!empty($child))
		{
			$crumbs[] = $child;
		}

		// Get listing with the filter info
		$listing = $this->get_listing($root, $node);

		// Assemble the array
		$listing['root']   = $root;
		$listing['crumbs'] = $crumbs;

		return $listing;
	}

	/**
	 * Toggle a filter
	 *
	 * @param   string  $root    Root directory
	 * @param   array   $crumbs  Components of the current directory relative to the root
	 * @param   string  $item    The child item of the current directory we want to toggle the filter for
	 * @param   string  $filter  The name of the filter to apply (directories, skipfiles, skipdirs, files)
	 *
	 * @return  array
	 */
	public function toggle($root, $crumbs, $item, $filter)
	{
		$node = $this->glue_crumbs($crumbs, $item);

		return $this->applyExclusionFilter($filter, $root, $node, 'toggle');
	}

	/**
	 * Set a filter
	 *
	 * @param   string  $root    Root directory
	 * @param   array   $crumbs  Components of the current directory relative to the root
	 * @param   string  $item    The child item of the current directory we want to set the filter for
	 * @param   string  $filter  The name of the filter to apply (directories, skipfiles, skipdirs, files)
	 *
	 * @return  array
	 */
	public function setFilter($root, $crumbs, $item, $filter)
	{
		$node = $this->glue_crumbs($crumbs, $item);

		return $this->applyExclusionFilter($filter, $root, $node, 'set');
	}

	/**
	 * Remove a filter
	 *
	 * @param   string  $root    Root directory
	 * @param   array   $crumbs  Components of the current directory relative to the root
	 * @param   string  $item    The child item of the current directory we want to remove the filter for
	 * @param   string  $filter  The name of the filter to apply (directories, skipfiles, skipdirs, files)
	 *
	 * @return  array
	 */
	public function remove($root, $crumbs, $item, $filter)
	{
		$node = $this->glue_crumbs($crumbs, $item);

		return $this->applyExclusionFilter($filter, $root, $node, 'remove');
	}

	/**
	 * Swap a filter
	 *
	 * @param   string  $root    Root directory
	 * @param   array   $crumbs  Components of the current directory relative to the root
	 * @param   string  $item    The child item of the current directory we want to set the filter for
	 * @param   string  $filter  The name of the filter to apply (directories, skipfiles, skipdirs, files)
	 *
	 * @return  array
	 */
	public function swap($root, $crumbs, $old_item, $new_item, $filter)
	{
		$new_node = $this->glue_crumbs($crumbs, $new_item);
		$old_node = $this->glue_crumbs($crumbs, $old_item);

		return $this->applyExclusionFilter($filter, $root, $new_node, 'swap', $old_node);
	}

	/**
	 * Retrieves the filters as an array. Used for the tabular filter editor.
	 *
	 * @param   string  $root  The root node to search filters on
	 *
	 * @return  array  A collection of hash arrays containing node and type for each filtered element
	 */
	public function &get_filters($root)
	{
		return $this->getTabularFilters($root);
	}

	/**
	 * Resets the filters
	 *
	 * @param   string  $root  Root directory
	 *
	 * @return  array
	 */
	public function resetFilters($root)
	{
		$this->resetAllFilters($root);

		return $this->make_listing($root);
	}

	/**
	 * Handles a request coming in through AJAX. Basically, this is a simple proxy to the model methods.
	 *
	 * @return  array
	 */
	public function doAjax()
	{
		$action = $this->getState('action');
		$verb   = array_key_exists('verb', get_object_vars($action)) ? $action->verb : null;

		if (!array_key_exists('crumbs', get_object_vars($action)))
		{
			$action->crumbs = '';
		}

		$ret_array = array();

		switch ($verb)
		{
			// Return a listing for the normal view
			case 'list':
				$ret_array = $this->make_listing($action->root, $action->crumbs, $action->node);
				break;

			// Toggle a filter's state
			case 'toggle':
				$ret_array = $this->toggle($action->root, $action->crumbs, $action->node, $action->filter);
				break;

			// Set a filter (used by the editor)
			case 'set':
				$ret_array = $this->setFilter($action->root, $action->crumbs, $action->node, $action->filter);
				break;

			// Swap a filter (used by the editor)
			case 'swap':
				$ret_array =
					$this->swap($action->root, $action->crumbs, $action->old_node, $action->new_node, $action->filter);
				break;

			case 'tab':
				$ret_array = $this->get_filters($action->root);
				break;

			// Reset filters
			case 'reset':
				$ret_array = $this->resetFilters($action->root);
				break;
		}

		return $ret_array;
	}

	/**
	 * Format the size of the file (given in bytes) to something human readable, e.g. 123 MB
	 *
	 * @param   int  $bytes     The file size in bytes
	 * @param   int  $decimals  How many decimals you want (default: 0)
	 *
	 * @return  string  The human-readable, formatted size
	 */
	private function formatSize($bytes, $decimals = 0)
	{
		$bytes  = empty($bytes) ? 0 : (int) $bytes;
		$format = empty($decimals) ? '%0u' : '%0.' . $decimals . 'f';

		$uom = [
			'TB' => 1048576 * 1048576,
			'GB' => 1024 * 1048576,
			'MB' => 1048576,
			'KB' => 1024,
			'B'  => 1,
		];

		// Whole bytes cannot have decimal positions
		if (!empty($decimals))
		{
			unset($uom['B']);
		}

		foreach ($uom as $unit => $byteSize)
		{
			if (floatval($bytes) >= $byteSize)
			{
				return sprintf($format, $bytes / $byteSize) . ' ' . $unit;
			}
		}

		// If the number is either too big or too small,
		return sprintf('%0u B', $bytes);
	}

}
components/com_akeeba/Model/DatabaseFilters.php000060400000016606152453623440015622 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Model;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Model\Mixin\ExclusionFilter;
use Akeeba\Engine\Factory;
use Exception;
use FOF40\Container\Container;
use FOF40\Model\Model;
use Joomla\CMS\Language\Text;

/**
 * Database Filters model
 *
 * Handles the exclusion of database tables (whole or just their data)
 */
class DatabaseFilters extends Model
{
	use ExclusionFilter;

	public function __construct(Container $container, array $config)
	{
		parent::__construct($container, $config);

		$this->knownFilterTypes = ['tables', 'tabledata'];
	}

	/**
	 * Returns a list of the database tables, views, procedures, functions and triggers,
	 * along with their filter status in array format, for use in the GUI
	 *
	 * @param   string  $root  The database root we're working on
	 *
	 * @return  array  Hash array. 'tables' is an array list of tables w/ metadata. 'root' is the current db root.
	 */
	public function make_listing($root)
	{
		// Get database inclusion filters
		$filters       = Factory::getFilters();
		$database_list = $filters->getInclusions('db');

		// Load the database object for the selected database
		$config         = $database_list[$root];
		$config['user'] = $config['username'];
		$db             = Factory::getDatabase($config);

		// Load the table data
		try
		{
			$table_data = $db->getTables();
		}
		catch (Exception $e)
		{
			$table_data = [];
		}

		$tableMeta = [];

		try
		{
			$db->setQuery('SHOW TABLE STATUS');

			$temp = $db->loadAssocList();

			foreach ($temp as $record)
			{
				$tableMeta[$db->getAbstract($record['Name'])] = [
					'engine'      => $record['Engine'],
					'rows'        => $record['Rows'],
					'dataLength'  => $record['Data_length'],
					'indexLength' => $record['Index_length'],
				];
			}
		}
		catch (Exception $e)
		{
		}

		// Process filters
		$tables = [];

		if (!empty($table_data))
		{
			foreach ($table_data as $table_name => $table_type)
			{
				$status = [
					'engine'      => null,
					'rows'        => null,
					'dataLength'  => null,
					'indexLength' => null,
				];

				if (array_key_exists($table_name, $tableMeta))
				{
					$status = $tableMeta[$table_name];
				}

				// Add table type
				$status['type'] = $table_type;

				// Check dbobject/all filter (exclude)
				$result           = $filters->isFilteredExtended($table_name, $root, 'dbobject', 'all', $byFilter);
				$status['tables'] = (!$result) ? 0 : (($byFilter == 'tables') ? 1 : 2);

				// Check dbobject/content filter (skip table data)
				$result              = $filters->isFilteredExtended($table_name, $root, 'dbobject', 'content', $byFilter);
				$status['tabledata'] = (!$result) ? 0 : (($byFilter == 'tabledata') ? 1 : 2);

				// We can't filter contents of views, merge tables, black holes, procedures, functions and triggers
				if ($table_type != 'table')
				{
					$status['tabledata'] = 2;
				}

				$tables[$table_name] = $status;
			}
		}

		return [
			'tables' => $tables,
			'root'   => $root,
		];
	}

	/**
	 * Returns an array containing a mapping of db root names and their human-readable representation
	 *
	 * @return  array  Array of objects; "value" contains the root name, "text" the human-readable text
	 */
	public function get_roots()
	{
		// Get database inclusion filters
		$filters       = Factory::getFilters();
		$database_list = $filters->getInclusions('db');

		$ret = [];

		foreach ($database_list as $name => $definition)
		{
			$root = $definition['host'];

			if (!empty($definition['port']))
			{
				$root .= ':' . $definition['port'];
			}

			$root .= '/' . $definition['database'];

			if ($name == '[SITEDB]')
			{
				$root = Text::_('COM_AKEEBA_DBFILTER_LABEL_SITEDB');
			}

			$ret[] = (object) [
				'value' => $name,
				'text'  => $root,
			];
		}

		return $ret;
	}

	/**
	 * Toggle a filter
	 *
	 * @param   string  $root    Database root
	 * @param   string  $item    The db entity we want to toggle the filter for
	 * @param   string  $filter  The name of the filter to apply (tables, tabledata)
	 *
	 * @return  array
	 */
	public function toggle($root, $item, $filter)
	{
		return $this->applyExclusionFilter($filter, $root, $item, 'toggle');
	}

	/**
	 * Set a filter
	 *
	 * @param   string  $root    Database root
	 * @param   string  $item    The db entity we want to toggle the filter for
	 * @param   string  $filter  The name of the filter to apply (tables, tabledata)
	 *
	 * @return  array
	 */
	public function remove($root, $item, $filter)
	{
		return $this->applyExclusionFilter($filter, $root, $item, 'remove');
	}

	/**
	 * Set a filter
	 *
	 * @param   string  $root    Database root
	 * @param   string  $item    The db entity we want to toggle the filter for
	 * @param   string  $filter  The name of the filter to apply (tables, tabledata)
	 *
	 * @return  array
	 */
	public function setFilter($root, $item, $filter)
	{
		return $this->applyExclusionFilter($filter, $root, $item, 'set');
	}

	/**
	 * Swap a filter
	 *
	 * @param   string  $root      Database root
	 * @param   string  $old_item  The db entity that used to be filtered and will no longer be
	 * @param   string  $new_item  The db entity that wasn't filtered but now will be
	 * @param   string  $filter    The name of the filter to apply (tables, tabledata)
	 *
	 * @return  array
	 */
	public function swap($root, $old_item, $new_item, $filter)
	{
		return $this->applyExclusionFilter($filter, $root, $new_item, 'swap', $old_item);
	}

	/**
	 * Retrieves the filters as an array. Used for the tabular filter editor.
	 *
	 * @param   string  $root  The root node to search filters on
	 *
	 * @return  array  An array of hash arrays containing node and type for each filtered element
	 */
	public function &get_filters($root)
	{
		return $this->getTabularFilters($root);
	}

	/**
	 * Resets all filters
	 *
	 * @param   string  $root  Root directory
	 *
	 * @return  array
	 */
	public function resetFilters($root)
	{
		$this->resetAllFilters($root);

		return $this->make_listing($root);
	}

	/**
	 * Handles a request coming in through AJAX. Basically, this is a simple proxy to the model methods.
	 *
	 * @return  array
	 */
	public function doAjax()
	{
		$action = $this->getState('action');
		$verb   = array_key_exists('verb', get_object_vars($action)) ? $action->verb : null;

		$ret_array = [];

		switch ($verb)
		{
			// Return a listing for the normal view
			case 'list':
				$ret_array = $this->make_listing($action->root);
				break;

			// Toggle a filter's state
			case 'toggle':
				$ret_array = $this->toggle($action->root, $action->node, $action->filter);
				break;

			// Set a filter (used by the editor)
			case 'set':
				$ret_array = $this->setFilter($action->root, $action->node, $action->filter);
				break;

			// Remove a filter (used by the editor)
			case 'remove':
				$ret_array = $this->remove($action->root, $action->node, $action->filter);
				break;

			// Swap a filter (used by the editor)
			case 'swap':
				$ret_array = $this->swap($action->root, $action->old_node, $action->new_node, $action->filter);
				break;

			// Tabular view
			case 'tab':
				$ret_array = $this->get_filters($action->root);
				break;

			// Reset filters
			case 'reset':
				$ret_array = $this->resetFilters($action->root);
				break;
		}

		return $ret_array;
	}
}
components/com_akeeba/Model/Updates.php000060400000025073152453623440014170 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Model;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Exception;
use FOF40\Container\Container;
use FOF40\Update\Update;
use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\Filesystem\File;

/**
 * Updates model. Acts as an intermediary between the component and Joomla!,
 *
 * @package Akeeba\Backup\Admin\Model
 */
class Updates extends Update
{
	/**
	 * Obsolete update site locations
	 *
	 * @var  array
	 */
	protected $obsoleteUpdateSiteLocations = [
		'http://cdn.akeebabackup.com/updates/abpro.xml',
		'http://cdn.akeebabackup.com/updates/abcore.xml',
		'http://cdn.akeebabackup.com/updates/fof.xml',
	];

	/**
	 * Public constructor. Initialises the protected members as well.
	 *
	 * @param   array  $config
	 */
	public function __construct($config = [])
	{
		$container = Container::getInstance('com_akeeba');

		$config['update_component'] = 'pkg_akeeba';
		$config['update_sitename']  = 'Akeeba Backup Core';
		$config['update_site']      = 'https://cdn.akeeba.com/updates/pkgakeebacore.xml';
		$config['update_paramskey'] = 'update_dlid';
		$config['update_container'] = $container;

		$isPro = defined('AKEEBA_PRO') ? AKEEBA_PRO : 0;

		if ($isPro)
		{
			$config['update_sitename'] = 'Akeeba Backup Professional';
			$config['update_site']     = 'https://cdn.akeeba.com/updates/pkgakeebapro.xml';
		}

		if (defined('AKEEBA_VERSION') && !in_array(substr(AKEEBA_VERSION, 0, 3), ['dev', 'rev']))
		{
			$config['update_version'] = AKEEBA_VERSION;
		}

		parent::__construct($config);

		$this->container    = $container;
		$this->extension_id = $this->findExtensionId('pkg_akeeba', 'package');

		if (empty($this->extension_id))
		{
			$this->createFakePackageExtension();
			$this->extension_id = $this->findExtensionId('pkg_akeeba', 'package');
		}
	}

	/**
	 * Refreshes the update sites, removing obsolete update sites in the process
	 */
	public function refreshUpdateSite(): void
	{
		// Remove any update sites for the old com_akeeba package
		$this->removeObsoleteComponentUpdateSites();

		// Refresh our update sites
		parent::refreshUpdateSite();
	}

	/**
	 * Removes the obsolete update sites for the component, since now we're dealing with a package.
	 *
	 * Controlled by componentName, packageName and obsoleteUpdateSiteLocations
	 *
	 * Depends on getExtensionId, getUpdateSitesFor
	 *
	 * @return  void
	 */
	private function removeObsoleteComponentUpdateSites()
	{
		// Initialize
		$deleteIDs = [];

		// Get component ID
		$componentID = $this->findExtensionId('com_akeeba', 'component');

		// Get package ID
		$packageID = $this->findExtensionId('pkg_akeeba', 'package');

		// Update sites for old extension ID (all)
		if ($componentID)
		{
			// Old component packages
			$moreIDs = $this->getUpdateSitesFor($componentID, null);

			if (is_array($moreIDs) && count($moreIDs))
			{
				$deleteIDs = array_merge($deleteIDs, $moreIDs);
			}

			// Obsolete update sites
			$moreIDs = $this->getUpdateSitesFor(null, $componentID, $this->obsoleteUpdateSiteLocations);

			if (is_array($moreIDs) && count($moreIDs))
			{
				$deleteIDs = array_merge($deleteIDs, $moreIDs);
			}
		}

		// Update sites for any but current extension ID, location matching any of the obsolete update sites
		if ($packageID)
		{
			// Update sites for all of the current extension ID update sites
			$moreIDs = $this->getUpdateSitesFor($packageID, null);

			if (is_array($moreIDs) && count($moreIDs))
			{
				$deleteIDs = array_merge($deleteIDs, $moreIDs);
			}

			$deleteIDs = array_unique($deleteIDs);

			// Remove the last update site
			if (count($deleteIDs))
			{
				$lastID = array_pop($moreIDs);
				$pos    = array_search($lastID, $deleteIDs);
				unset($deleteIDs[$pos]);
			}
		}

		$db        = $this->container->db;
		$deleteIDs = array_unique($deleteIDs);

		if (empty($deleteIDs) || !count($deleteIDs))
		{
			return;
		}

		$deleteIDs = array_map([$db, 'q'], $deleteIDs);

		$query = $db->getQuery(true)
			->delete($db->qn('#__update_sites'))
			->where($db->qn('update_site_id') . ' IN(' . implode(',', $deleteIDs) . ')');

		try
		{
			$db->setQuery($query)->execute();
		}
		catch (Exception $e)
		{
			// Do nothing.
		}

		$query = $db->getQuery(true)
			->delete($db->qn('#__update_sites_extensions'))
			->where($db->qn('update_site_id') . ' IN(' . implode(',', $deleteIDs) . ')');

		try
		{
			$db->setQuery($query)->execute();
		}
		catch (Exception $e)
		{
			// Do nothing.
		}
	}

	/**
	 * Gets the ID of an extension
	 *
	 * @param   string  $element  Extension element, e.g. com_foo, mod_foo, lib_foo, pkg_foo or foo (CAUTION: plugin,
	 *                            file!)
	 * @param   string  $type     Extension type: component, module, library, package, plugin or file
	 * @param   null    $folder   Plugins: plugin folder. Modules: admin/site
	 *
	 * @return  int  Extension ID or 0 on failure
	 */
	private function findExtensionId($element, $type = 'component', $folder = null)
	{
		$db    = $this->container->db;
		$query = $db->getQuery(true)
			->select($db->qn('extension_id'))
			->from($db->qn('#__extensions'))
			->where($db->qn('element') . ' = ' . $db->q($element))
			->where($db->qn('type') . ' = ' . $db->q($type));

		// Plugin? We should look for a folder
		if ($type == 'plugin')
		{
			$folder = empty($folder) ? 'system' : $folder;

			$query->where($db->qn('folder') . ' = ' . $db->q($folder));
		}

		// Module? Use the folder to determine if it's site or admin module.
		if ($type == 'module')
		{
			$folder = empty($folder) ? 'site' : $folder;

			$query->where($db->qn('client_id') . ' = ' . $db->q(($folder == 'site') ? 0 : 1));
		}

		try
		{
			$id = $db->setQuery($query, 0, 1)->loadResult();
		}
		catch (Exception $e)
		{
			$id = 0;
		}

		return empty($id) ? 0 : (int) $id;
	}

	/**
	 * Returns the update site IDs matching the criteria below. All criteria are optional but at least one must be
	 * defined for the method call to make any sense.
	 *
	 * @param   int|null  $includeEID  The update site must belong to this extension ID
	 * @param   int|null  $excludeEID  The update site must NOT belong to this extension ID
	 * @param   array     $locations   The update site must match one of these locations
	 *
	 * @return  array  The IDs of the update sites
	 */
	private function getUpdateSitesFor($includeEID = null, $excludeEID = null, $locations = [])
	{
		$db    = $this->container->db;
		$query = $db->getQuery(true)
			->select($db->qn('s.update_site_id'))
			->from($db->qn('#__update_sites', 's'));

		if (!empty($locations))
		{
			$quotedLocations = array_map([$db, 'q'], $locations);
			$query->where($db->qn('location') . 'IN(' . implode(',', $quotedLocations) . ')');
		}

		if (!empty($includeEID) || !empty($excludeEID))
		{
			$query->innerJoin($db->qn('#__update_sites_extensions', 'e') . 'ON(' . $db->qn('e.update_site_id') .
				' = ' . $db->qn('s.update_site_id') . ')'
			);
		}

		if (!empty($includeEID))
		{
			$query->where($db->qn('e.extension_id') . ' = ' . $db->q($includeEID));
		}
		elseif (!empty($excludeEID))
		{
			$query->where($db->qn('e.extension_id') . ' != ' . $db->q($excludeEID));
		}

		try
		{
			$ret = $db->setQuery($query)->loadColumn();
		}
		catch (Exception $e)
		{
			$ret = null;
		}

		return empty($ret) ? [] : $ret;
	}

	private function createFakePackageExtension()
	{
		$manifestCacheJson = json_encode([
			'name'         => 'Akeeba Backup package',
			'type'         => 'package',
			'creationDate' => gmdate('Y-m-d'),
			'author'       => 'Nicholas K. Dionysopoulos',
			'copyright'    => sprintf('Copyright (c)2006-%d Akeeba Ltd / Nicholas K. Dionysopoulos', gmdate('Y')),
			'authorEmail'  => '',
			'authorUrl'    => 'https://www.akeeba.com',
			'version'      => $this->version,
			'description'  => sprintf('Akeeba Backup installation package v.%s', $this->version),
			'group'        => '',
			'filename'     => 'pkg_akeeba',
		]);

		$extensionRecord = [
			'name'             => 'Akeeba Backup package',
			'type'             => 'package',
			'element'          => 'pkg_akeeba',
			'folder'           => '',
			'client_id'        => 0,
			'enabled'          => 1,
			'access'           => 1,
			'protected'        => 0,
			'manifest_cache'   => $manifestCacheJson,
			'params'           => '{}',
			'checked_out'      => 0,
			'checked_out_time' => null,
			'state'            => 0,
		];

		$class = '\\Joomla\\CMS\\Table\\Extension';
		$class = class_exists($class, true) ? $class : '\\JTableExtension';
		$extension = new $class($this->container->db);
		$extension->save($extensionRecord);

		$this->createFakePackageManifest();
	}

	private function createFakePackageManifest()
	{
		$path = JPATH_ADMINISTRATOR . '/manifests/packages/pkg_akeeba.xml';

		if (file_exists($path))
		{
			return;
		}

		$isPro   = defined('AKEEBA_PRO') ? AKEEBA_PRO : 0;
		$proCore = $isPro ? 'pro' : 'core';
		$dlid    = $isPro ? '<dlid prefix="dlid=" suffix=""/>' : '';
		$year    = gmdate('Y');
		$date    = gmdate('Y-m-d');

		$proPlugins = <<< END
        <file type="file" id="file_akeeba">file_akeeba-pro.zip</file>
		<file type="plugin" group="installer" id="akeebabackup">plg_installer_akeebabackup.zip</file>
END;
		$proPlugins = $isPro ? $proPlugins : '';

		$content = <<< XML
<?xml version="1.0" encoding="utf-8"?>
<extension version="3.9.0" type="package" method="upgrade">
	$dlid
    <name>Akeeba Backup package</name>
    <author>Nicholas K. Dionysopoulos</author>
    <creationDate>$date</creationDate>
    <packagename>akeeba</packagename>
    <version>{$this->version}</version>
    <url>https://www.akeeba.com</url>
    <packager>Akeeba Ltd</packager>
    <packagerurl>https://www.akeeba.com</packagerurl>
    <copyright>Copyright (c)2006-$year Akeeba Ltd / Nicholas K. Dionysopoulos</copyright>
    <license>GNU GPL v3 or later</license>
    <description>Akeeba Backup installation package {$this->version}</description>

    <files>
        <file type="component" id="com_akeebabackup">com_akeebabackup-{$proCore}.zip</file>
        <file type="plugin" group="console" id="akeebabackup">plg_console_akeebabackup.zip</file>
        <file type="plugin" group="quickicon" id="akeebabackup">plg_quickicon_akeebabackup.zip</file>
        <file type="plugin" group="system" id="backuponupdate">plg_system_backuponupdate.zip</file>
        <file type="plugin" group="actionlog" id="akeebabackup">plg_actionlog_akeebabackup.zip</file>
        $proPlugins
    </files>

    <scriptfile>script.akeeba.php</scriptfile>
</extension>
XML;

		if (!@file_put_contents($content, $path))
		{
			File::write($path, $content);
		}
	}
}
components/com_akeeba/Model/Backup.php000060400000044037152453623440013771 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Model;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Engine\Base\Part;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use Akeeba\Engine\Psr\Log\LogLevel;
use Akeeba\Engine\Util\PushMessages;
use DateTimeZone;
use DirectoryIterator;
use Exception;
use FOF40\Date\Date;
use FOF40\Factory\Exception\ModelNotFound;
use FOF40\Model\Model;
use FOF40\Timer\Timer;
use Joomla\CMS\Language\Text;
use RuntimeException;

/**
 * Backup model. Handles the server-side logic of interfacing with the backup engine (Akeeba Engine)
 */
class Backup extends Model
{
	/**
	 * Starts or step a backup process. Set the state variable "ajax" to the task you want to execute OR call the
	 * relevant public method directly.
	 *
	 * @return  array  An Akeeba Engine return array
	 */
	public function runBackup()
	{
		$ret_array = [];

		$ajaxTask = $this->getState('ajax');

		switch ($ajaxTask)
		{
			// Start a new backup
			case 'start':
				$ret_array = $this->startBackup();
				break;

			// Step through a backup
			case 'step':
				$ret_array = $this->stepBackup();
				break;

			// Send a push notification for backup failure
			case 'pushFail':
				$this->pushFail();
				break;

			default:
				break;
		}

		return $ret_array;
	}

	/**
	 * Starts a new backup.
	 *
	 * State variables expected
	 * backupid        The ID of the backup. If none is set up we will create a new one in the form id123
	 * tag            The backup tag, e.g. "frontend". If none is set up we'll get it through the Platform.
	 * description    The description of the backup (optional)
	 * comment      The comment of the backup (optional)
	 * jpskey       JPS password
	 * angiekey     ANGIE password
	 *
	 * @param   array  $overrides  Configuration overrides
	 *
	 * @return  array  An Akeeba Engine return array
	 */
	public function startBackup(array $overrides = [])
	{
		// Get information from the session
		$tag         = $this->getState('tag', null, 'string');
		$description = $this->getState('description', '', 'string');
		$comment     = $this->getState('comment', '', 'html');
		$jpskey      = $this->getState('jpskey', null, 'raw');
		$angiekey    = $this->getState('angiekey', null, 'raw');
		$backupId = $this->getBackupId();

		// Use the default description if none specified
		$description = $description ?: $this->getDefaultDescription();

		// Try resetting the engine
		try
		{
			Factory::resetState([
				'maxrun' => 0,
			]);
		}
		catch (Exception $e)
		{
			// This will die if the output directory is invalid. Let it die, then.
		}

		// Remove any stale memory files left over from the previous step
		if (empty($tag))
		{
			$tag = Platform::getInstance()->get_backup_origin();
		}

		$tempVarsTag = $tag;
		$tempVarsTag .= empty($backupId) ? '' : ('.' . $backupId);

		Factory::getFactoryStorage()->reset($tempVarsTag);
		Factory::nuke();
		Factory::getLog()->log(LogLevel::DEBUG, " -- Resetting Akeeba Engine factory ($tag.$backupId)");
		Platform::getInstance()->load_configuration();

		// Autofix the output directory
		/** @var ConfigurationWizard $confWizModel */
		$confWizModel = $this->container->factory->model('ConfigurationWizard')->tmpInstance();
		$confWizModel->autofixDirectories();

		// Rebase Off-site Folder Inclusion filters to use site path variables
		/** @var \Akeeba\Backup\Admin\Model\IncludeFolders $incFoldersModel */
		try
		{
			$incFoldersModel = $this->container->factory->model('IncludeFolders')->tmpInstance();
			$incFoldersModel->rebaseFiltersToSiteDirs();
		}
		catch (ModelNotFound $e)
		{
			// Not a problem. This is expected to happen in the Core version.
		}

		// Should I apply any configuration overrides?
		if (is_array($overrides) && !empty($overrides))
		{
			$config        = Factory::getConfiguration();
			$protectedKeys = $config->getProtectedKeys();
			$config->resetProtectedKeys();

			foreach ($overrides as $k => $v)
			{
				$config->set($k, $v);
			}

			$config->setProtectedKeys($protectedKeys);
		}

		// Check if there are critical issues preventing the backup
		if (!Factory::getConfigurationChecks()->getShortStatus())
		{
			$configChecks = Factory::getConfigurationChecks()->getDetailedStatus();

			foreach ($configChecks as $checkItem)
			{
				if ($checkItem['severity'] != 'critical')
				{
					continue;
				}

				return [
					'HasRun'   => 0,
					'Domain'   => 'init',
					'Step'     => '',
					'Substep'  => '',
					'Error'    => 'Failed configuration check Q' . $checkItem['code'] . ': ' . $checkItem['description'] . '. Please refer to https://www.akeeba.com/documentation/warnings/q' . $checkItem['code'] . '.html for more information and troubleshooting instructions.',
					'Warnings' => [],
					'Progress' => 0,
				];
			}
		}

		// Set up Kettenrad
		$options = [
			'description' => $description,
			'comment'     => $comment,
			'jpskey'      => $jpskey,
			'angiekey'    => $angiekey,
		];

		if (is_null($jpskey))
		{
			unset ($options['jpskey']);
		}

		if (is_null($angiekey))
		{
			unset ($options['angiekey']);
		}

		$kettenrad = Factory::getKettenrad();
		$kettenrad->setBackupId($backupId);
		$kettenrad->setup($options);

		$this->setState('backupid', $backupId);

		/**
		 * Convert log files in the backup output directory
		 *
		 * This removes the obsolete, default log files (akeeba.(backend|frontend|cli|json).log and converts the old .log
		 * files into their .php counterparts.
		 *
		 * We are doing this when loading the the Control Panel page but ALSO when taking a new backup because some
		 * people might be installing updates and taking backups automatically, without visiting the Control Panel
		 * except in rare cases.
		 */
		$this->convertLogFiles(3);

		/**
		 * We need to run tick() twice in the first backup step.
		 *
		 * The first tick() will reset the backup engine and start a new backup. However, no backup record is created
		 * at this point. This means that Factory::loadState() cannot find a backup record, therefore it cannot read
		 * the backup profile being used, therefore it will assume it's profile #1.
		 *
		 * The second tick() creates the backup record without doing much else, fixing this issue.
		 *
		 * However, if you have conservative settings where the min exec time is MORE than the max exec time the second
		 * tick would never run. Therefore we need to tell the first tick to ignore the time settings (since it only
		 * takes a few milliseconds to execute anyway) and then apply the time settings on the second tick (which also
		 * only takes a few milliseconds). This is why we have setIgnoreMinimumExecutionTime before and after the first
		 * tick. DO NOT REMOVE THESE.
		 *
		 * Furthermore, if the first tick reaches the end of backup or an error condition we MUST NOT run the second
		 * tick() since the engine state will be invalid. Hence the check for the state that performs a hard break. This
		 * could happen if you have a sufficiently high max execution time, no break between steps and we fail to
		 * execute any step, e.g. the installer image is missing, a database error occurred or we can not list the files
		 * and directories to back up.
		 *
		 * THEREFORE, DO NOT REMOVE THE LOOP OR THE if-BLOCK IN IT, THEY ARE THERE FOR A GOOD REASON!
		 */
		$kettenrad->setIgnoreMinimumExecutionTime(true);

		for ($i = 0; $i < 2; $i++)
		{
			$kettenrad->tick();

			if (in_array($kettenrad->getState(), [Part::STATE_FINISHED, Part::STATE_ERROR]))
			{
				break;
			}

			$kettenrad->setIgnoreMinimumExecutionTime(false);
		}

		if (version_compare(JVERSION, '4.0', 'ge'))
		{
			Factory::getLog()->warning(sprintf('You ar using Akeeba Backup %s on Joomla! %s. This is not supported and might lead to data loss. Please upgrade to Akeeba Backup 9 or later! YOU WILL RECEIVE NO SUPPORT WHATSOEVER FOR THIS BACKUP.', AKEEBA_VERSION, JVERSION));
		}

		$ret_array = $kettenrad->getStatusArray();

		try
		{
			Factory::saveState($tag, $backupId);
		}
		catch (RuntimeException $e)
		{
			$ret_array['Error'] = $e->getMessage();
		}

		return $ret_array;
	}

	/**
	 * Steps through a backup.
	 *
	 * State variables expected (MUST be set):
	 * backupid        The ID of the backup.
	 * tag            The backup tag, e.g. "frontend".
	 * profile      (optional) The profile ID of the backup.
	 *
	 * @param   bool  $requireBackupId  Should the backup ID be required?
	 *
	 * @return  array  An Akeeba Engine return array
	 */
	public function stepBackup($requireBackupId = true)
	{
		// Get information from the model state
		$tag      = $this->getState('tag', defined('AKEEBA_BACKUP_ORIGIN') ? AKEEBA_BACKUP_ORIGIN : null, 'string');
		$backupId = $this->getState('backupid', null, 'string');

		// Get the profile from the session, the AKEEBA_PROFILE constant or the model state – in this order
		$profile = max(0, (int) $this->getState('profile', 0)) ?: $this->getLastBackupProfile($tag, $backupId);

		// Set the active profile
		if (!$this->container->platform->isCli())
		{
			$this->container->platform->setSessionVar('profile', $profile);
		}

		if (!defined('AKEEBA_PROFILE'))
		{
			define('AKEEBA_PROFILE', $profile);
		}

		// Run a backup step
		$ret_array = [
			'HasRun'   => 0,
			'Domain'   => 'init',
			'Step'     => '',
			'Substep'  => '',
			'Error'    => '',
			'Warnings' => [],
			'Progress' => 0,
		];

		try
		{
			// Reload the configuration
			Platform::getInstance()->load_configuration($profile);

			// Load the engine from storage
			Factory::loadState($tag, $backupId, $requireBackupId);

			// Set the backup ID and run a backup step
			$kettenrad = Factory::getKettenrad();
			$kettenrad->tick();
			$ret_array = $kettenrad->getStatusArray();
		}
		catch (Exception $e)
		{
			$ret_array['Error'] = $e->getMessage();
		}

		try
		{
			if (empty($ret_array['Error']) && ($ret_array['HasRun'] != 1))
			{
				Factory::saveState($tag, $backupId);
			}
		}
		catch (RuntimeException $e)
		{
			$ret_array['Error'] = $e->getMessage();
		}

		if (!empty($ret_array['Error']) || ($ret_array['HasRun'] == 1))
		{
			/**
			 * Do not nuke the Factory if we're trying to resume after an error.
			 *
			 * When the resume after error (retry) feature is enabled AND we are performing a backend backup we MUST
			 * leave the factory storage intact so we can actually resume the backup. If we were to nuke the Factory
			 * the resume would report that it cannot load the saved factory and lead to a failed backup.
			 */
			$config = Factory::getConfiguration();

			if ($this->container->platform->isBackend() && $config->get('akeeba.advanced.autoresume', 1))
			{
				// We are about to resume; abort.
				return $ret_array;
			}

			// Clean up
			Factory::nuke();

			$tempVarsTag = $tag;
			$tempVarsTag .= empty($backupId) ? '' : ('.' . $backupId);

			Factory::getFactoryStorage()->reset($tempVarsTag);
		}

		return $ret_array;
	}

	/**
	 * Send a push notification for a failed backup
	 *
	 * State variables expected (MUST be set):
	 * errorMessage  The error message
	 *
	 * @return  void
	 */
	public function pushFail()
	{
		$errorMessage = $this->getState('errorMessage');

		$platform = Platform::getInstance();
		$key      = 'COM_AKEEBA_PUSH_ENDBACKUP_FAIL_BODY_WITH_MESSAGE';

		if (empty($errorMessage))
		{
			$key = 'COM_AKEEBA_PUSH_ENDBACKUP_FAIL_BODY';
		}

		$pushSubject = sprintf(
			$platform->translate('COM_AKEEBA_PUSH_ENDBACKUP_FAIL_SUBJECT'),
			$platform->get_site_name(),
			$platform->get_host()
		);
		$pushDetails = sprintf(
			$platform->translate($key),
			$platform->get_site_name(),
			$platform->get_host(),
			$errorMessage
		);

		$push = new PushMessages();
		$push->message($pushSubject, $pushDetails);
	}

	/**
	 * Convert the old, plaintext log files (.log) into their .log.php counterparts.
	 *
	 * @param   int  $timeOut  Maximum time, in seconds, to spend doing this conversion.
	 *
	 * @return  void
	 *
	 * @since   7.0.3
	 */
	public function convertLogFiles($timeOut = 10)
	{
		$registry = Factory::getConfiguration();
		$logDir   = $registry->get('akeeba.basic.output_directory', '[DEFAULT_OUTPUT]', true);

		$timer = new Timer($timeOut, 75);

		// Part I. Remove these obsolete files first
		$killFiles = [
			'akeeba.log',
			'akeeba.backend.log',
			'akeeba.frontend.log',
			'akeeba.cli.log',
			'akeeba.json.log',
		];

		foreach ($killFiles as $fileName)
		{
			$path = $logDir . '/' . $fileName;

			if (@is_file($path))
			{
				@unlink($path);
			}
		}

		if ($timer->getTimeLeft() <= 0.01)
		{
			return;
		}

		// Part II. Convert .log files.
		try
		{
			$di = new DirectoryIterator($logDir);
		}
		catch (Exception $e)
		{
			return;
		}

		foreach ($di as $file)
		{

			try
			{
				if (!$file->isFile())
				{
					continue;
				}
				$baseName = $file->getFilename();
				if (substr($baseName, 0, 7) !== 'akeeba.')
				{
					continue;
				}
				if (substr($baseName, -4) !== '.log')
				{
					continue;
				}
				$this->convertLogFile($file->getPathname());
				if ($timer->getTimeLeft() <= 0.01)
				{
					return;
				}
			}
			catch (Exception $e)
			{
				/**
				 * Someone did something stupid, like using the site's root as the backup output directory while having
				 * an open_basedir restriction. Sorry, mate, you get insecure junk. We had warned you. You didn't heed
				 * the warning. That's your problem now.
				 */
			}
		}
	}

	/**
	 * Get the profile used to take the last backup for the specified tag
	 *
	 * @param   string  $tag       The backup tag a.k.a. backup origin (backend, frontend, json, ...)
	 * @param   string  $backupId  (optional) The Backup ID
	 *
	 * @return  int  The profile ID of the latest backup taken with the specified tag / backup ID
	 */
	public function getLastBackupProfile($tag, $backupId = null)
	{
		$filters = [
			['field' => 'tag', 'value' => $tag],
		];

		if (!empty($backupId))
		{
			$filters[] = ['field' => 'backupid', 'value' => $backupId];
		}

		$statList = Platform::getInstance()->get_statistics_list([
				'filters' => $filters,
				'order'   => [
					'by' => 'id', 'order' => 'DESC',
				],
			]
		);

		if (is_array($statList))
		{
			$stat = array_pop($statList);

			return (int) $stat['profile_id'];
		}

		// Backup entry not found. If backupId was specified, try without a backup ID
		if (!empty($backupId))
		{
			return $this->getLastBackupProfile($tag);
		}

		// Else, return the default backup profile
		return 1;
	}

	/**
	 * Converts a log file from .log to .log.php
	 *
	 * @param   string  $filePath
	 *
	 * @return  void
	 *
	 * @since   7.0.3
	 */
	protected function convertLogFile($filePath)
	{
		// The name of the converted log file is the same with the extension .php appended to it.
		$newFile = $filePath . '.php';

		// If the new log file exists I should return immediately
		if (@file_exists($newFile))
		{
			return;
		}

		// Try to open the converted log file (.log.php)
		$fp = @fopen($newFile, 'w');

		if ($fp === false)
		{
			return;
		}

		// Try to open the source log file (.log)
		$sourceFP = @fopen($filePath, 'r');

		if ($sourceFP === false)
		{
			@fclose($fp);

			return;
		}

		// Write the die statement to the source log file
		fwrite($fp, '<' . '?' . 'php die(); ' . '?' . ">\n");

		// Copy data, 512KB at a time
		while (!feof($sourceFP))
		{
			$chunk = @fread($sourceFP, 524288);

			if ($chunk === false)
			{
				break;
			}

			$result = fwrite($fp, $chunk);

			if ($result === false)
			{
				break;
			}
		}

		// Close both files
		@fclose($sourceFP);
		@fclose($fp);

		// Delete the original (.log) file
		@unlink($filePath);
	}

	/**
	 * Get a new backup ID string.
	 *
	 * In the past we were trying to get the next backup record ID using two methods:
	 * - Querying the information_schema.tables metadata table. In many cases we saw this returning the wrong value,
	 *   even though the MySQL documentation said this should return the next autonumber (WTF?)
	 * - Doing a MAX(id) on the table and adding 1. This didn't work correctly if the latest records were deleted by the
	 *   user.
	 *
	 * However, the backup ID does not need to be the same as the backup record ID. It only needs to be *unique*. So
	 * this time around we are using a simple, unique ID based on the current GMT date and time.
	 *
	 * @return  string
	 */
	private function getBackupId(): string
	{
		$microtime    = explode(' ', microtime(false));
		$microseconds = (int) ($microtime[0] * 1000000);

		return 'id-' . gmdate('Ymd-His') . '-' . $microseconds;
	}

	/**
	 * Get the default backup description.
	 *
	 * The default description is "Backup taken on DATE TIME" where DATE TIME is the current timestamp in the most
	 * specific timezone. The timezone order, from least to most specific, is:
	 * * UTC (fallback)
	 * * Server Timezone from Joomla's Global Configuration
	 * * Timezone from the current user's profile (only applicable to backend backups)
	 * * Forced backup timezone
	 *
	 * @param   string  $format  Date and time format. Default: DATE_FORMAT_LC2 plus the abbreviated timezone
	 *
	 * @return  string
	 */
	public function getDefaultDescription(string $format = ''): string
	{
		// If no date format is specified we use DATE_FORMAT_LC2 plus the abbreviated timezone
		if (empty($format))
		{
			$format = Text::_('DATE_FORMAT_LC2') . ' T';
		}

		// Get the most specific Joomla timezone (UTC, overridden by server timezone, overridden by user timezone)
		$joomlaTimezone = $this->container->platform->getConfig()->get('offset', 'UTC');

		if (!$this->getContainer()->platform->isCli())
		{
			$user = $this->container->platform->getUser();

			if (!$user->guest)
			{
				$joomlaTimezone = $user->getParam('timezone', $joomlaTimezone);
			}
		}

		$timezone = $joomlaTimezone;

		// The forced timezone overrides everything else
		$forcedTZ = Platform::getInstance()->get_platform_configuration_option('forced_backup_timezone', 'AKEEBA/DEFAULT');

		if (!empty($forcedTZ) && ($forcedTZ != 'AKEEBA/DEFAULT'))
		{
			$timezone = $forcedTZ;
		}

		// Convert the current date and time to the selected timezone
		$dateNow = new Date();
		$tz      = new DateTimeZone($timezone);

		$dateNow->setTimezone($tz);

		return Text::_('COM_AKEEBA_BACKUP_DEFAULT_DESCRIPTION') . ' ' . $dateNow->format($format, true);
	}

}
components/com_akeeba/Model/.htaccess000060400000000246152453623440013643 0ustar00<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
  <RequireAll>
    Require all denied
  </RequireAll>
</IfModule>
components/com_akeeba/Model/Statistics.php000060400000043117152453623440014714 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Model;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Model\Exceptions\FrozenRecordError;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use Exception;
use FOF40\Container\Container;
use FOF40\Date\Date;
use FOF40\Model\DataModel\Exception\RecordNotLoaded;
use FOF40\Model\Model;
use Joomla\CMS\Access\Access;
use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\Filesystem\File;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Pagination\Pagination;
use Joomla\CMS\User\User;
use RuntimeException;

class Statistics extends Model
{
	/**
	 * The JPagination object, used in the GUI
	 *
	 * @var  Pagination
	 */
	private $pagination;

	/**
	 * Public constructor.
	 *
	 * @param   Container  $container  The configuration variables to this model
	 * @param   array      $config     Configuration values for this model
	 */
	public function __construct(Container $container, array $config)
	{
		$defaultConfig = [
			'tableName'   => '#__ak_stats',
			'idFieldName' => 'id',
		];

		if (!is_array($config) || empty($config))
		{
			$config = [];
		}

		$config = array_merge($defaultConfig, $config);

		parent::__construct($container, $config);

		$platform     = $this->container->platform;
		$defaultLimit = $platform->getConfig()->get('list_limit', 10);

		if ($platform->isCli())
		{
			$limit      = $this->input->getInt('limit', $defaultLimit);
			$limitstart = $this->input->getInt('limitstart', 0);
		}
		else
		{
			$limit      = $platform->getUserStateFromRequest('global.list.limit', 'limit', $this->input, $defaultLimit);
			$limitstart = $platform->getUserStateFromRequest('com_akeeba.stats.limitstart', 'limitstart', $this->input, 0);
		}

		if ($platform->isFrontend())
		{
			$limit      = 0;
			$limitstart = 0;
		}

		// Set the page pagination variables
		$this->setState('limit', $limit);
		$this->setState('limitstart', $limitstart);
	}

	/**
	 * Is this string a valid remote filename?
	 *
	 * We've had reports that some servers return a bogus, non-empty string for some remote_filename columns, causing
	 * the "Manage remote stored files" column to appear even for locally stored files. By applying more rigorous tests
	 * for the remote_filename column we can avoid this problem.
	 *
	 * @param   string|null  $filename
	 *
	 * @return  bool
	 *
	 * @since   8.1.4
	 */
	public function isRemoteFilename(string $filename = null): bool
	{
		// A remote filename has to be a string which is does not consist solely of whitespace
		if (!is_string($filename) || trim($filename) === '')
		{
			return false;
		}

		// Let's remote whitespace just in case
		$filename = trim($filename);

		// A remote filename must be in the format engine://path
		if (strpos($filename, '://') === false)
		{
			return false;
		}

		// Get the engine and path
		[$engine, $path] = explode('://', $filename, 2);
		$engine = trim($engine);
		$path   = trim($path);

		// Both engine and path must be non-empty
		if (empty($engine) || empty($path))
		{
			return false;
		}

		// The engine must be known to the backup engine
		$classname = 'Akeeba\\Engine\\Postproc\\' . ucfirst($engine);

		return class_exists($classname);
	}

	/**
	 * Returns the same list as getStatisticsList(), but includes an extra field
	 * named 'meta' which categorises attempts based on their backup archive status
	 *
	 * @param   bool   $overrideLimits  Should I disregard limit, limitStart and filters?
	 * @param   array  $filters         Filters to apply. See Platform::get_statistics_list
	 * @param   array  $order           Results ordering. The accepted keys are by (column name) and order (ASC or DESC)
	 *
	 * @return  array  An array of arrays. Each inner array is one backup record.
	 */
	public function &getStatisticsListWithMeta($overrideLimits = false, $filters = null, $order = null)
	{
		$limitstart = $overrideLimits ? 0 : $this->getState('limitstart', 0);
		$limit      = $overrideLimits ? 0 : $this->getState('limit', 10);
		$filters    = $overrideLimits ? null : $filters;

		if (is_array($order) && isset($order['order']))
		{
			$order['order'] = strtoupper($order['order']) === 'ASC' ? 'asc' : 'desc';
		}

		$allStats = Platform::getInstance()->get_statistics_list([
			'limitstart' => $limitstart,
			'limit'      => $limit,
			'filters'    => $filters,
			'order'      => $order,
		]);

		$validRecords          = Platform::getInstance()->get_valid_backup_records() ?: [];
		$updateObsoleteRecords = [];
		$ret                   = array_map(function (array $stat) use (&$updateObsoleteRecords, $validRecords) {
			$hasRemoteFiles = false;

			// Translate backup status and the existence of a remote filename to the backup record's "meta" status.
			switch ($stat['status'])
			{
				case 'run':
					$stat['meta'] = 'pending';
					break;

				case 'fail':
					$stat['meta'] = 'fail';
					break;

				default:
					$hasRemoteFiles = $this->isRemoteFilename($stat['remote_filename']);
					$stat['meta']   = $hasRemoteFiles ? 'remote' : 'obsolete';
					break;
			}

			$stat['hasRemoteFiles'] = $hasRemoteFiles;

			// If the backup is reported to have files still stored on the server we need to investigate further
			if (in_array($stat['id'], $validRecords))
			{
				$archives      = Factory::getStatistics()->get_all_filenames($stat);
				$hasLocalFiles = (is_array($archives) ? count($archives) : 0) > 0;
				$stat['meta']  = $hasLocalFiles ? 'ok' : ($hasRemoteFiles ? 'remote' : 'obsolete');

				// The archives exist. Set $stat['size'] to the total size of the backup archives.
				if ($hasLocalFiles)
				{
					$stat['size'] = $stat['total_size']
						?: array_reduce(
							$archives,
							function ($carry, $filename) {
								return $carry += @filesize($filename) ?: 0;
							},
							0
						);

					return $stat;
				}

				// The archives do not exist or we can't find them. If the record says otherwise we need to update it.
				if ($stat['filesexist'])
				{
					$updateObsoleteRecords[] = $stat['id'];
				}

				// Does the backup record report a total size even though our files no longer exist?
				if ($stat['total_size'])
				{
					$stat['size'] = $stat['total_size'];
				}
			}

			return $stat;
		}, $allStats);

		// Update records which report that their files exist on the server but, in fact, they don't.
		Platform::getInstance()->invalidate_backup_records($updateObsoleteRecords);

		return $ret;
	}

	/**
	 * Send an email notification for failed backups
	 *
	 * @return  array  See the CLI script
	 */
	public function notifyFailed()
	{
		// Invalidate stale backups
		try
		{
			Factory::resetState([
				'global' => true,
				'log'    => false,
				'maxrun' => $this->container->params->get('failure_timeout', 180),
			]);
		}
		catch (Exception $e)
		{
			// This will die if the output directory is invalid. Let it die, then.
		}

		// Get the last execution and search for failed backups AFTER that date
		$last = $this->getLastCheck();

		// Get failed backups
		$filters = [
			['field' => 'status', 'operand' => '=', 'value' => 'fail'],
			['field' => 'backupstart', 'operand' => '>', 'value' => $last],
		];

		$failed = Platform::getInstance()->get_statistics_list(['filters' => $filters]);

		// Well, everything went ok.
		if (!$failed)
		{
			return [
				'message' => ["No need to run: no failed backups or notifications were already sent."],
				'result'  => true,
			];
		}

		// Whops! Something went wrong, let's start notifing
		$superAdmins     = [];
		$superAdminEmail = $this->container->params->get('failure_email_address', '');

		if (!empty($superAdminEmail))
		{
			$superAdmins = $this->getSuperUsers($superAdminEmail);
		}

		if (empty($superAdmins))
		{
			$superAdmins = $this->getSuperUsers();
		}

		if (empty($superAdmins))
		{
			return [
				'message' => ["WARNING! Failed backup(s) detected, but there are no configured Super Administrators to receive notifications"],
				'result'  => false,
			];
		}

		$failedReport = [];

		foreach ($failed as $fail)
		{
			$string = "Description : " . $fail['description'] . "\n";
			$string .= "Start time  : " . $fail['backupstart'] . "\n";
			$string .= "Origin      : " . $fail['origin'] . "\n";
			$string .= "Type        : " . $fail['type'] . "\n";
			$string .= "Profile ID  : " . $fail['profile_id'] . "\n";
			$string .= "Backup ID   : " . $fail['id'];

			$failedReport[] = $string;
		}

		$failedReport = implode("\n#-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+#\n", $failedReport);

		$email_subject = $this->container->params->get('failure_email_subject', '');

		if (!$email_subject)
		{
			$email_subject = <<<ENDSUBJECT
THIS EMAIL IS SENT FROM YOUR SITE "[SITENAME]" - Failed backup(s) detected
ENDSUBJECT;
		}

		$email_body = $this->container->params->get('failure_email_body', '');

		if (!$email_body)
		{
			$email_body = <<<ENDBODY
================================================================================
FAILED BACKUP ALERT
================================================================================

Your site has determined that there are failed backups.

The following backups are found to be failing:

[FAILEDLIST]

================================================================================
WHY AM I RECEIVING THIS EMAIL?
================================================================================

This email has been automatically sent by scritp you, or the person who built
or manages your site, has installed and explicitly configured. This script looks
for failed backups and sends an email notification to all Super Users.

If you do not understand what this means, please do not contact the authors of
the software. They are NOT sending you this email and they cannot help you.
Instead, please contact the person who built or manages your site.

================================================================================
WHO SENT ME THIS EMAIL?
================================================================================

This email is sent to you by your own site, [SITENAME]

ENDBODY;
		}

		$jconfig = $this->container->platform->getConfig();

		$mailfrom = $jconfig->get('mailfrom');
		$fromname = $jconfig->get('fromname');

		$email_subject = Factory::getFilesystemTools()->replace_archive_name_variables($email_subject);
		$email_body    = Factory::getFilesystemTools()->replace_archive_name_variables($email_body);
		$email_body    = str_replace('[FAILEDLIST]', $failedReport, $email_body);

		foreach ($superAdmins as $sa)
		{
			try
			{
				$mailer = JFactory::getMailer();

				$mailer->setSender([$mailfrom, $fromname]);
				$mailer->addRecipient($sa->email);
				$mailer->setSubject($email_subject);
				$mailer->setBody($email_body);
				$mailer->Send();
			}
			catch (Exception $e)
			{
				// Joomla! 3.5 is written by incompetent bonobos
			}
		}

		// Let's update the last time we check, so we will avoid to send
		// the same notification several times
		$this->updateLastCheck(intval($last));

		return [
			'message' => [
				"WARNING! Found " . count($failed) . " failed backup(s)",
				"Sent " . count($superAdmins) . " notifications",
			],
			'result'  => true,
		];
	}

	/**
	 * Delete the backup statistics record whose ID is set in the model
	 *
	 * @return  bool  True on success
	 */
	public function delete()
	{
		$db = $this->container->db;

		$id = $this->getState('id', 0);

		if ((!is_numeric($id)) || ($id <= 0))
		{
			throw new RecordNotLoaded(Text::_('COM_AKEEBA_BUADMIN_ERROR_INVALIDID'));
		}

		// Try to delete files. This will check (and stop) if any record is a frozen one
		$this->deleteFile();

		if (!Platform::getInstance()->delete_statistics($id))
		{
			throw new RuntimeException($db->getError(), 500);
		}

		return true;
	}

	/**
	 * Delete the backup file of the stats record whose ID is set in the model
	 *
	 * @return  bool  True on success
	 */
	public function deleteFile()
	{
		$id = $this->getState('id', 0);

		if ((!is_numeric($id)) || ($id <= 0))
		{
			throw new RecordNotLoaded(Text::_('COM_AKEEBA_BUADMIN_ERROR_INVALIDID'));
		}

		// Get the backup statistics record and the files to delete
		$stat     = (array) Platform::getInstance()->get_statistics($id);

		if ($stat['frozen'])
		{
			throw new FrozenRecordError(Text::_('COM_AKEEBA_BUADMIN_FROZENRECORD_ERROR'));
		}

		$allFiles = Factory::getStatistics()->get_all_filenames($stat, false);

		// Remove the custom log file if necessary
		$this->deleteLogs($stat);

		// No files? Nothing to do.
		if (empty($allFiles))
		{
			return true;
		}

		$status = true;

		foreach ($allFiles as $filename)
		{
			if (!@file_exists($filename))
			{
				continue;
			}

			$new_status = @unlink($filename);

			if (!$new_status)
			{
				$new_status = File::delete($filename);
			}

			$status = $status ? $new_status : false;
		}

		return $status;
	}

	/**
	 * Get a Joomla! pagination object
	 *
	 * @param   array  $filters  Filters to apply. See Platform::get_statistics_list
	 *
	 * @return  Pagination
	 */
	public function &getPagination($filters = null)
	{
		if (empty($this->pagination))
		{
			// Prepare pagination values
			$total      = Platform::getInstance()->get_statistics_count($filters);
			$limitstart = $this->getState('limitstart', 0);
			$limit      = $this->getState('limit', 10);

			// Create the pagination object
			$this->pagination = new Pagination($total, $limitstart, $limit);
		}

		return $this->pagination;
	}

	/**
	 * Set the flag to hide the restoration instructions modal from the Manage Backups page
	 *
	 * @return  void
	 */
	public function hideRestorationInstructionsModal()
	{
		$this->container->params->set('show_howtorestoremodal', 0);
		$this->container->params->save();
	}

	/**
	 * Freeze or melt a backup report
	 *
	 * @param array $ids        Array of backup IDs that should be updated
	 * @param int   $freeze     1= freeze, 0= melt
	 *
	 * @throws Exception
	 */
	public function freezeUnfreezeRecords(array $ids, $freeze)
	{
		if (!$ids)
		{
			return;
		}

		$freeze = (int) $freeze;

		foreach ($ids as $id)
		{
			// If anything wrong happens, let the exception bubble up, so it will be reported
			Platform::getInstance()->set_or_update_statistics($id, ['frozen' => $freeze]);
		}
	}

	/**
	 * Deletes the backup-specific log files of a stats record
	 *
	 * @param   array  $stat  The array holding the backup stats record
	 *
	 * @return  void
	 */
	protected function deleteLogs(array $stat)
	{
		// We can't delete logs if there is no backup ID in the record
		if (!isset($stat['backupid']) || empty($stat['backupid']))
		{
			return;
		}

		$logFileNames = [
			'akeeba.' . $stat['tag'] . '.' . $stat['backupid'] . '.log',
			'akeeba.' . $stat['tag'] . '.' . $stat['backupid'] . '.log.php',
		];

		foreach ($logFileNames as $logFileName)
		{
			$logPath = dirname($stat['absolute_path']) . '/' . $logFileName;

			if (@file_exists($logPath))
			{
				if (!@unlink($logPath))
				{
					File::delete($logPath);
				}
			}
		}
	}

	/**
	 * Returns the Super Users' email information. If you provide a comma separated $email list we will check that these
	 * emails do belong to Super Users and that they have not blocked reception of system emails.
	 *
	 * @param   null|string  $email  A list of Super Users to email, null for all Super Users
	 *
	 * @return  User[]  The list of Super User objects
	 */
	private function getSuperUsers($email = null)
	{
		// Convert the email list to an array
		$emails = [];

		if (!empty($email))
		{
			$temp   = explode(',', $email);
			$emails = [];

			foreach ($temp as $entry)
			{
				$emails[] = trim($entry);
			}

			$emails = array_unique($emails);
			$emails = array_map('strtolower', $emails);
		}

		// Get all usergroups with Super User access
		$db     = $this->getContainer()->db;
		$q      = $db->getQuery(true)
			->select([$db->qn('id')])
			->from($db->qn('#__usergroups'));
		$groups = $db->setQuery($q)->loadColumn();

		// Get the groups that are Super Users
		$groups = array_filter($groups, function ($gid) {
			return Access::checkGroup($gid, 'core.admin');
		});

		$userList = [];

		foreach ($groups as $gid)
		{
			$uids = Access::getUsersByGroup($gid);

			array_walk($uids, function ($uid, $index) use (&$userList) {
				$userList[$uid] = $this->container->platform->getUser($uid);
			});
		}

		if (empty($emails))
		{
			return $userList;
		}

		$userList = array_filter($userList, function (User $user) use ($emails) {
			return in_array(strtolower($user->email), $emails);
		});

		return $userList;
	}

	/**
	 * Update the time we last checked for failed backups
	 *
	 * @param   int  $exists  Any non zero value means that we update, not insert, the record
	 *
	 * @return  void
	 */
	private function updateLastCheck($exists)
	{
		$db = $this->container->db;

		$now      = new Date();
		$nowToSql = $now->toSql();

		$query = $db->getQuery(true)
			->insert($db->qn('#__ak_storage'))
			->columns([$db->qn('tag'), $db->qn('lastupdate')])
			->values($db->q('akeeba_checkfailed') . ', ' . $db->q($nowToSql));

		if ($exists)
		{
			$query = $db->getQuery(true)
				->update($db->qn('#__ak_storage'))
				->set($db->qn('lastupdate') . ' = ' . $db->q($nowToSql))
				->where($db->qn('tag') . ' = ' . $db->q('akeeba_checkfailed'));
		}

		try
		{
			$db->setQuery($query)->execute();
		}
		catch (Exception $exc)
		{
		}
	}

	/**
	 * Get the last update check date and time stamp
	 *
	 * @return  string
	 */
	private function getLastCheck()
	{
		$db = $this->container->db;

		$query = $db->getQuery(true)
			->select($db->qn('lastupdate'))
			->from($db->qn('#__ak_storage'))
			->where($db->qn('tag') . ' = ' . $db->q('akeeba_checkfailed'));

		$datetime = $db->setQuery($query)->loadResult();

		if (!intval($datetime))
		{
			$datetime = $db->getNullDate();
		}

		return $datetime;
	}
}
components/com_akeeba/Model/Browser.php000060400000005615152453623440014206 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Model;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use FOF40\Model\Model;
use JLoader;
use Joomla\CMS\Filesystem\Folder;

class Browser extends Model
{
	/**
	 * Initialises the directory listing. All results are stored in model state variables.
	 */
	function makeListing()
	{
		// Get the folder to browse
		$folder        = $this->getState('folder', '');
		$processfolder = $this->getState('processfolder', 0);

		if (empty($folder))
		{
			$folder = JPATH_SITE;
		}

		$stock_dirs = Platform::getInstance()->get_stock_directories();
		arsort($stock_dirs);

		if ($processfolder == 1)
		{
			foreach ($stock_dirs as $find => $replace)
			{
				$folder = str_replace($find, $replace, $folder);
			}
		}

		// Normalise name, but only if realpath() really, REALLY works...
		$old_folder = $folder;
		$folder     = @realpath($folder);

		if ($folder === false)
		{
			$folder = $old_folder;
		}

		$isFolderThere = @is_dir($folder);

		// Check if it's a subdirectory of the site's root
		$isInRoot = (strpos($folder, JPATH_SITE) === 0);

		// Check open_basedir restrictions
		$isOpenbasedirRestricted = Factory::getConfigurationChecks()->checkOpenBasedirs($folder);

		// -- Get the meta form of the directory name, if applicable
		$folder_raw = $folder;

		foreach ($stock_dirs as $replace => $find)
		{
			$folder_raw = str_replace($find, $replace, $folder_raw);
		}

		$isWritable = false;
		$subfolders = [];

		if ($isFolderThere && !$isOpenbasedirRestricted)
		{
			$isWritable = is_writable($folder);
			$subfolders = Folder::folders($folder);
		}

		// In case we can't identify the parent folder, use ourselves.
		$parent      = $folder;
		$breadcrumbs = [];

		// Try to get the parent directory
		$pathparts = explode(DIRECTORY_SEPARATOR, $folder);

		if (is_array($pathparts))
		{
			$path = '';

			foreach ($pathparts as $part)
			{
				$path .= empty($path) ? $part : DIRECTORY_SEPARATOR . $part;

				if (empty($part))
				{
					if (DIRECTORY_SEPARATOR != '\\')
					{
						$path = DIRECTORY_SEPARATOR;
					}

					$part = DIRECTORY_SEPARATOR;
				}

				$breadcrumbs[] = [
					'label'  => $part,
					'folder' => $path,
				];
			}

			$junk   = array_pop($pathparts);
			$parent = implode(DIRECTORY_SEPARATOR, $pathparts);
		}

		$this->setState('folder', $folder);
		$this->setState('folder_raw', $folder_raw);
		$this->setState('parent', $parent);
		$this->setState('exists', $isFolderThere);
		$this->setState('inRoot', $isInRoot);
		$this->setState('openbasedirRestricted', $isOpenbasedirRestricted);
		$this->setState('writable', $isWritable);
		$this->setState('subfolders', $subfolders);
		$this->setState('breadcrumbs', $breadcrumbs);
	}
}
components/com_akeeba/Model/ControlPanel.php000060400000060425152453623440015163 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Model;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Helper\SecretWord;
use Akeeba\Backup\Admin\Model\Mixin\Chmod;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use Akeeba\Engine\Util\Complexify;
use Akeeba\Engine\Util\RandomValue;
use FOF40\Database\Installer;
use FOF40\Download\Download;
use FOF40\Model\Model;
use Joomla\CMS\Filesystem\File;
use Joomla\CMS\Filesystem\Folder;
use Joomla\CMS\Http\HttpFactory;
use Joomla\CMS\Http\Transport\CurlTransport;
use Joomla\CMS\Http\Transport\StreamTransport;
use Joomla\CMS\Uri\Uri;
use Joomla\Registry\Registry;
use RuntimeException;
use stdClass;

/**
 * ControlPanel model. Generic maintenance tasks used mainly from the ControlPanel page.
 */
class ControlPanel extends Model
{
	use Chmod;

	protected static $systemFolders = [
		'administrator',
		'administrator/cache/',
		'administrator/components/',
		'administrator/help/',
		'administrator/includes/',
		'administrator/language/',
		'administrator/logs/',
		'administrator/manifests/',
		'administrator/modules/',
		'administrator/templates/',
		'cache/',
		'cli/',
		'components/',
		'images/',
		'includes/',
		'language/',
		'layouts/',
		'libraries/',
		'media/',
		'modules/',
		'plugins/',
		'templates/',
		'tmp/',
	];

	/**
	 * Gets a list of profiles which will be displayed as quick icons in the interface
	 *
	 * @return  stdClass[]  Array of objects; each has the properties `id` and `description`
	 */
	public function getQuickIconProfiles()
	{
		$db = $this->container->db;

		$query = $db->getQuery(true)
			->select([
				$db->qn('id'),
				$db->qn('description'),
			])->from($db->qn('#__ak_profiles'))
			->where($db->qn('quickicon') . ' = ' . $db->q(1))
			->order($db->qn('id') . " ASC");

		$db->setQuery($query);

		$ret = $db->loadObjectList();

		if (empty($ret))
		{
			$ret = [];
		}

		return $ret;
	}

	/**
	 * Creates an icon definition entry
	 *
	 * @param   string  $iconFile  The filename of the icon on the GUI button
	 * @param   string  $label     The label below the GUI button
	 * @param   string  $view      The view to fire up when the button is clicked
	 *
	 * @return  array  The icon definition array
	 */
	public function _makeIconDefinition($iconFile, $label, $view = null, $task = null)
	{
		return [
			'icon'  => $iconFile,
			'label' => $label,
			'view'  => $view,
			'task'  => $task,
		];
	}

	/**
	 * Was the last backup a failed one? Used to apply magic settings as a means of troubleshooting.
	 *
	 * @return  bool
	 */
	public function isLastBackupFailed()
	{
		// Get the last backup record ID
		$list = Platform::getInstance()->get_statistics_list(['limitstart' => 0, 'limit' => 1]);

		if (empty($list))
		{
			return false;
		}

		$id = $list[0];

		$record = Platform::getInstance()->get_statistics($id);

		return ($record['status'] == 'fail');
	}

	/**
	 * Checks that the media permissions are oh seven double five for directories and oh six double four for files and
	 * fixes them if they are incorrect.
	 *
	 * @param   bool  $force  Forcibly check subresources, even if the parent has correct permissions
	 *
	 * @return  bool  False if we couldn't figure out what's going on
	 */
	public function fixMediaPermissions($force = false)
	{
		// Are we on Windows?
		$isWindows = (DIRECTORY_SEPARATOR == '\\');

		if (function_exists('php_uname'))
		{
			$isWindows = stristr(php_uname(), 'windows');
		}

		// No point changing permissions on Windows, as they have ACLs
		if ($isWindows)
		{
			return true;
		}

		// Check the parent permissions
		$parent      = JPATH_ROOT . '/media/com_akeeba';
		$parentPerms = fileperms($parent);

		// If we can't determine the parent's permissions, bail out
		if ($parentPerms === false)
		{
			return false;
		}

		// Fooling some broken file scanners.
		$ohSevenFiveFive          = 500 - 7;
		$ohFourOhSevenFiveFive    = 16000 + 900 - 23;
		$ohSixFourFour            = 450 - 30;
		$ohOneDoubleOhSixFourFour = 33000 + 200 - 12;

		// Fix the parent's permissions if required
		if (($parentPerms != $ohSevenFiveFive) && ($parentPerms != $ohFourOhSevenFiveFive))
		{
			$this->chmod($parent, $ohSevenFiveFive);
		}
		elseif (!$force)
		{
			return true;
		}

		// During development we use symlinks and we don't wanna see that big fat warning
		if (@is_link($parent))
		{
			return true;
		}

		$result = true;

		// Loop through subdirectories
		$folders = Folder::folders($parent, '.', 3, true);

		foreach ($folders as $folder)
		{
			$perms = fileperms($folder);

			if (($perms != $ohSevenFiveFive) && ($perms != $ohFourOhSevenFiveFive))
			{
				$result &= $this->chmod($folder, $ohSevenFiveFive);
			}
		}

		// Loop through files
		$files = Folder::files($parent, '.', 3, true);

		foreach ($files as $file)
		{
			$perms = fileperms($file);

			if (($perms != $ohSixFourFour) && ($perms != $ohOneDoubleOhSixFourFour))
			{
				$result &= $this->chmod($file, $ohSixFourFour);
			}
		}

		return $result;
	}

	/**
	 * Checks if we should enable settings encryption and applies the change
	 *
	 * @return  void
	 */
	public function checkSettingsEncryption()
	{
		// Do we have a key file?
		$filename = JPATH_COMPONENT_ADMINISTRATOR . '/BackupEngine/serverkey.php';

		if (File::exists($filename))
		{
			// We have a key file. Do we need to disable it?
			if ($this->container->params->get('useencryption', -1) == 0)
			{
				// User asked us to disable encryption. Let's do it.
				$this->disableSettingsEncryption();
			}

			return;
		}

		if (!Factory::getSecureSettings()->supportsEncryption())
		{
			return;
		}

		if ($this->container->params->get('useencryption', -1) != 0)
		{
			// User asked us to enable encryption (or he left us with the default setting!). Let's do it.
			$this->enableSettingsEncryption();
		}
	}

	/**
	 * Updates some internal settings:
	 *
	 * - The stored URL of the site, used for the front-end backup feature (altbackup.php)
	 * - The detected Joomla! libraries path
	 * - Marks all existing profiles as configured, if necessary
	 */
	public function updateMagicParameters()
	{
		if (!$this->container->params->get('confwiz_upgrade', 0))
		{
			$this->markOldProfilesConfigured();
		}

		$this->container->params->set('confwiz_upgrade', 1);
		$this->container->params->set('siteurl', str_replace('/administrator', '', Uri::base()));
		$this->container->params->set('jlibrariesdir', Factory::getFilesystemTools()->TranslateWinPath(JPATH_LIBRARIES));
		$this->container->params->save();
	}

	/**
	 * Do you have to issue a warning that setting the Download ID in the CORE edition has no effect?
	 *
	 * @return  bool  True if you need to show the warning
	 */
	public function mustWarnAboutDownloadIDInCore()
	{
		/** @var Updates $updateModel */
		$updateModel = $this->container->factory->model('Updates')->tmpInstance();
		$isPro       = defined('AKEEBA_PRO') ? AKEEBA_PRO : 0;

		if ($isPro)
		{
			return false;
		}

		$dlid = $updateModel->sanitizeLicenseKey($updateModel->getLicenseKey());

		return $updateModel->isValidLicenseKey($dlid);
	}

	/**
	 * Does the user need to enter a Download ID in the component's Options page?
	 *
	 * @return  bool
	 */
	public function needsDownloadID()
	{
		/** @var Updates $updateModel */
		$updateModel = $this->container->factory->model('Updates')->tmpInstance();

		// Migrate J3 to J4 settings
		$updateModel->upgradeLicenseKey();

		// Save the J4 license key in the component options, if necessary
		$updateModel->backportLicenseKey();

		// Do I need a Download ID?
		$isPro = defined('AKEEBA_PRO') ? AKEEBA_PRO : 0;

		if (!$isPro)
		{
			return false;
		}

		$dlid = $updateModel->sanitizeLicenseKey($updateModel->getLicenseKey());

		return !$updateModel->isValidLicenseKey($dlid);
	}

	/**
	 * Checks the database for missing / outdated tables and runs the appropriate SQL scripts if necessary.
	 *
	 * @return  $this
	 * @throws  RuntimeException    If the previous database update is stuck
	 */
	public function checkAndFixDatabase()
	{
		$params = $this->container->params;

		// First of all let's check if we are already updating
		$stuck = $params->get('updatedb', 0);

		if ($stuck)
		{
			throw new RuntimeException('Previous database update is flagged as stuck');
		}

		// Then set the flag
		$params->set('updatedb', 1);
		$params->save();

		// Install or update database
		$dbInstaller = new Installer(
			$this->container->db,
			JPATH_ADMINISTRATOR . '/components/com_akeeba/sql/xml'
		);

		$dbInstaller->updateSchema();

		// And finally remove the flag if everything went fine
		$params->set('updatedb', null);
		$params->save();

		return $this;
	}

	/**
	 * Akeeba Backup 4.3.2 displays a popup if your profile is not already configured by Configuration Wizard, the
	 * Configuration page or imported from the Profiles page. This bit of code makes sure that existing profiles will
	 * be marked as already configured just the FIRST time you upgrade to the new version from an old version.
	 *
	 * @return  void
	 */
	public function markOldProfilesConfigured()
	{
		// Get all profiles
		$db = $this->container->db;

		$query = $db->getQuery(true)
			->select([
				$db->qn('id'),
			])->from($db->qn('#__ak_profiles'))
			->order($db->qn('id') . " ASC");
		$db->setQuery($query);
		$profiles = $db->loadColumn();

		// Save the current profile number
		$oldProfile = $this->container->platform->getSessionVar('profile', 1, 'akeeba');

		// Update all profiles
		foreach ($profiles as $profile_id)
		{
			Factory::nuke();
			Platform::getInstance()->load_configuration($profile_id);
			$config = Factory::getConfiguration();
			$config->set('akeeba.flag.confwiz', 1);
			Platform::getInstance()->save_configuration($profile_id);
		}

		// Restore the old profile
		Factory::nuke();
		Platform::getInstance()->load_configuration($oldProfile);
	}

	/**
	 * Check the strength of the Secret Word for front-end and remote backups. If it is insecure return the reason it
	 * is insecure as a string. If the Secret Word is secure return an empty string.
	 *
	 * @return  string
	 */
	public function getFrontendSecretWordError()
	{
		// Is frontend backup enabled?
		$febEnabled =
			($this->container->params->get('legacyapi_enabled', 0) != 0) ||
			($this->container->params->get('jsonapi_enabled', 0) != 0);

		if (!$febEnabled)
		{
			return '';
		}

		$secretWord = Platform::getInstance()->get_platform_configuration_option('frontend_secret_word', '');

		try
		{
			Complexify::isStrongEnough($secretWord);
		}
		catch (RuntimeException $e)
		{
			// Ah, the current Secret Word is bad. Create a new one if necessary.
			$newSecret = $this->container->platform->getSessionVar('newSecretWord', null, 'akeeba');

			if (empty($newSecret))
			{
				$random    = new RandomValue();
				$newSecret = $random->generateString(32);
				$this->container->platform->setSessionVar('newSecretWord', $newSecret, 'akeeba.cpanel');
			}

			return $e->getMessage();
		}

		return '';
	}

	/**
	 * Checks if the mbstring extension is installed and enabled
	 *
	 * @return  bool
	 */
	public function checkMbstring()
	{
		return function_exists('mb_strlen') && function_exists('mb_convert_encoding') &&
			function_exists('mb_substr') && function_exists('mb_convert_case');
	}

	/**
	 * Is the output directory under the configured site root?
	 *
	 * @param   string|null  $outDir  The output directory to check. NULL for the currently configured one.
	 *
	 * @return  bool  True if the output directory is under the site's web root.
	 *
	 * @since   7.0.3
	 */
	public function isOutputDirectoryUnderSiteRoot($outDir = null)
	{
		// Make sure I have an output directory to check
		$outDir = is_null($outDir) ? $this->getOutputDirectory() : $outDir;
		$outDir = @realpath($outDir);

		// If I can't reliably determine the output directory I can't figure out where it's placed in.
		if ($outDir === false)
		{
			return false;
		}

		// Get the site's root
		$siteRoot = $this->getSiteRoot();
		$siteRoot = @realpath($siteRoot);

		// If I can't reliably determine the site's root I can't figure out its relation to the output directory
		if ($siteRoot === false)
		{
			return false;
		}

		return strpos($outDir, $siteRoot) === 0;
	}

	/**
	 * Did the user set up an output directory inside a folder intended for CMS files?
	 *
	 * The idea is that this will cause trouble for two reasons. First, you are mixing user-generated with system
	 * content which might be a REALLY BAD idea in and of itself. Second, some if not all of these folders are meant to
	 * be web-accessible. I cannot possibly protect them against web access without breaking anything.
	 *
	 * @param   string|null  $outDir  The output directory to check. NULL for the currently configured one.
	 *
	 * @return  bool  True if the output directory is inside a CMS system folder
	 *
	 * @since   7.0.3
	 */
	public function isOutputDirectoryInSystemFolder($outDir = null)
	{
		// Make sure I have an output directory to check
		$outDir = is_null($outDir) ? $this->getOutputDirectory() : $outDir;
		$outDir = @realpath($outDir);

		// If I can't reliably determine the output directory I can't figure out where it's placed in.
		if ($outDir === false)
		{
			return false;
		}

		// If the directory is not under the site's root it doesn't belong to the CMS. Simple, huh?
		if (!$this->isOutputDirectoryUnderSiteRoot($outDir))
		{
			return false;
		}

		// Check if we are using the default output directory. This is always allowed.
		$stockDirs     = Platform::getInstance()->get_stock_directories();
		$defaultOutDir = realpath($stockDirs['[DEFAULT_OUTPUT]']);

		// If I can't reliably determine the default output folder I can't figure out its relation to the output folder
		if ($defaultOutDir === false)
		{
			return false;
		}

		// Get the site's root
		$siteRoot = $this->getSiteRoot();
		$siteRoot = @realpath($siteRoot);

		// If I can't reliably determine the site's root I can't figure out its relation to the output directory
		if ($siteRoot === false)
		{
			return false;
		}

		foreach ($this->getSystemFolders() as $folder)
		{
			// Is this a partial or an absolute search?
			$partialSearch = substr($folder, -1) == '/';

			clearstatcache(true);

			$absolutePath = realpath($siteRoot . '/' . $folder);

			if ($absolutePath === false)
			{
				continue;
			}

			if (!$partialSearch)
			{
				if (trim($outDir, '/\\') == trim($absolutePath, '/\\'))
				{
					return true;
				}

				continue;
			}

			// Partial search
			if (strpos($outDir, $absolutePath . DIRECTORY_SEPARATOR) === 0)
			{
				return true;
			}
		}

		return false;
	}

	/**
	 * Does the output directory contain the security-enhancing files?
	 *
	 * This only checks for the presence of .htaccess, web.config, index.php, index.html and index.html but not their
	 * contents. The idea is that an advanced user may want to customise them for some reason or another.
	 *
	 * @param   string|null  $outDir  The output directory to check. NULL for the currently configured one.
	 *
	 * @return  bool  True if all of the security-enhancing files are present.
	 *
	 * @since   7.0.3
	 */
	public function hasOutputDirectorySecurityFiles($outDir = null)
	{
		// Make sure I have an output directory to check
		$outDir = is_null($outDir) ? $this->getOutputDirectory() : $outDir;
		$outDir = @realpath($outDir);

		// If I can't reliably determine the output directory I can't figure out where it's placed in.
		if ($outDir === false)
		{
			return true;
		}

		$files = [
			'.htaccess',
			'web.config',
			'index.php',
			'index.html',
			'index.htm',
		];

		foreach ($files as $file)
		{
			$filePath = $outDir . '/' . $file;

			if (!@file_exists($filePath) || !is_file($filePath))
			{
				return false;
			}
		}

		return true;
	}

	/**
	 * Checks whether the given output directory is directly accessible over the web.
	 *
	 * @param   string|null  $outDir  The output directory to check. NULL for the currently configured one.
	 *
	 * @return  array
	 *
	 * @since   7.0.3
	 */
	public function getOutputDirectoryWebAccessibleState($outDir = null)
	{
		$ret = [
			'readFile'   => false,
			'listFolder' => false,
			'isSystem'   => $this->isOutputDirectoryInSystemFolder(),
			'hasRandom'  => $this->backupFilenameHasRandom(),
		];

		// Make sure I have an output directory to check
		$outDir = is_null($outDir) ? $this->getOutputDirectory() : $outDir;
		$outDir = @realpath($outDir);

		// If I can't reliably determine the output directory I can't figure out its web path
		if ($outDir === false)
		{
			return $ret;
		}

		$checkFile     = $this->getAccessCheckFile($outDir);
		$checkFilePath = $outDir . '/' . $checkFile;

		if (is_null($checkFile))
		{
			return $ret;
		}

		$webPath = $this->getOutputDirectoryWebPath($outDir);

		if (is_null($webPath))
		{
			@unlink($checkFilePath);

			return $ret;
		}

		// Construct a URL for the check file
		$baseURL = rtrim(Uri::base(), '/');

		if (substr($baseURL, -14) == '/administrator')
		{
			$baseURL = substr($baseURL, 0, -14);
		}

		$baseURL  = rtrim($baseURL, '/');
		$checkURL = $baseURL . '/' . $webPath . '/' . $checkFile;

		// Try to download the file's contents
		$options = [
			'follow_location'  => true,
			'transport.curl'   => [
				CURLOPT_SSL_VERIFYPEER => 0,
				CURLOPT_SSL_VERIFYHOST => 0,
				CURLOPT_FOLLOWLOCATION => 1,
				CURLOPT_TIMEOUT        => 10,
			],
			'transport.stream' => [
				'timeout' => 10,
			],
		];

		$adapters = [];

		if (CurlTransport::isSupported())
		{
			$adapters[] = 'Curl';
		}

		if (StreamTransport::isSupported())
		{
			$adapters[] = 'Stream';
		}

		if (empty($adapters))
		{
			return $ret;
		}

		$downloader = HttpFactory::getHttp(new Registry($options), $adapters);

		if ($downloader === false)
		{
			return $ret;
		}

		$response = $downloader->get($checkURL);

		if ($response->body === 'AKEEBA BACKUP WEB ACCESS CHECK')
		{
			$ret['readFile'] = true;
		}

		// Can I list the directory contents?
		$folderURL     = $baseURL . '/' . $webPath . '/';
		$folderListing = $downloader->get($folderURL)->body;

		@unlink($checkFilePath);

		if (!is_null($folderListing) && (strpos($folderListing, basename($checkFile, '.txt')) !== false))
		{
			$ret['listFolder'] = true;
		}

		return $ret;
	}

	/**
	 * Get the web path, relative to the site's root, for the output directory.
	 *
	 * Returns the relative path or NULL if determining it was not possible.
	 *
	 * @param   string|null  $outDir  The output directory to check. NULL for the currently configured one.
	 *
	 * @return  string|null  The relative web path to the output directory
	 *
	 * @since   7.0.3
	 */
	public function getOutputDirectoryWebPath($outDir = null)
	{
		// Make sure I have an output directory to check
		$outDir = is_null($outDir) ? $this->getOutputDirectory() : $outDir;
		$outDir = @realpath($outDir);

		// If I can't reliably determine the output directory I can't figure out its web path
		if ($outDir === false)
		{
			return null;
		}

		// Get the site's root
		$siteRoot = $this->getSiteRoot();
		$siteRoot = @realpath($siteRoot);

		// If I can't reliably determine the site's root I can't figure out its relation to the output directory
		if ($siteRoot === false)
		{
			return null;
		}

		// The output directory is NOT under the site's root.
		if (strpos($outDir, $siteRoot) !== 0)
		{
			return null;
		}

		$relPath = trim(substr($outDir, strlen($siteRoot)), '/\\');
		$isWin   = DIRECTORY_SEPARATOR == '\\';

		if ($isWin)
		{
			$relPath = str_replace('\\', '/', $relPath);
		}

		return $relPath;
	}

	/**
	 * Get the semi-random name of a .txt file used to check the output folder's direct web access.
	 *
	 * If the file does not exist we will create it.
	 *
	 * Returns the file name or NULL if creating it was not possible.
	 *
	 * @param   string|null  $outDir  The output directory to check. NULL for the currently configured one.
	 *
	 * @return  string|null  The base name of the check file
	 *
	 * @since   7.0.3
	 */
	public function getAccessCheckFile($outDir = null)
	{
		// Make sure I have an output directory to check
		$outDir = is_null($outDir) ? $this->getOutputDirectory() : $outDir;
		$outDir = @realpath($outDir);

		// If I can't reliably determine the output directory I can't put a file in it
		if ($outDir === false)
		{
			return null;
		}

		$secureSettings = Factory::getSecureSettings();
		$something      = md5($outDir . $secureSettings->getKey());
		$fileName       = 'akaccesscheck_' . $something . '.txt';
		$filePath       = $outDir . '/' . $fileName;

		$result = @file_put_contents($filePath, 'AKEEBA BACKUP WEB ACCESS CHECK');

		return ($result === false) ? null : $fileName;
	}

	/**
	 * Does the backup filename contain the [RANDOM] variable?
	 *
	 * @return  bool
	 *
	 * @since   7.0.3
	 */
	public function backupFilenameHasRandom()
	{
		$registry     = Factory::getConfiguration();
		$templateName = $registry->get('akeeba.basic.archive_name');

		return strpos($templateName, '[RANDOM]') !== false;
	}

	/**
	 * Return the configured output directory for the currently loaded backup profile
	 *
	 * @return  string
	 * @since   7.0.3
	 */
	public function getOutputDirectory()
	{
		$registry = Factory::getConfiguration();

		return $registry->get('akeeba.basic.output_directory', '[DEFAULT_OUTPUT]', true);
	}

	/**
	 * Return the currently configured site root directory
	 *
	 * @return  string
	 * @since   7.0.3
	 */
	protected function getSiteRoot()
	{
		return Platform::getInstance()->get_site_root();
	}

	/**
	 * Return the list of system folders, relative to the site's root
	 *
	 * @return  array
	 * @since   7.0.3
	 */
	protected function getSystemFolders()
	{
		return self::$systemFolders;
	}

	/**
	 * Disables the encryption of profile settings. If the settings were already encrypted they are automatically
	 * decrypted.
	 *
	 * @return  void
	 */
	private function disableSettingsEncryption()
	{
		// Load the server key file if necessary

		$filename = JPATH_COMPONENT_ADMINISTRATOR . '/BackupEngine/serverkey.php';
		$key      = Factory::getSecureSettings()->getKey();

		// Loop all profiles and decrypt their settings
		/** @var Profiles $profilesModel */
		$profilesModel = $this->container->factory->model('Profiles')->tmpInstance();
		$profiles      = $profilesModel->get(true);
		$db            = $this->container->db;

		/** @var Profiles $profile */
		foreach ($profiles as $profile)
		{
			$id     = $profile->getId();
			$config = Factory::getSecureSettings()->decryptSettings($profile->configuration, $key);
			$sql    = $db->getQuery(true)
				->update($db->qn('#__ak_profiles'))
				->set($db->qn('configuration') . ' = ' . $db->q($config))
				->where($db->qn('id') . ' = ' . $db->q($id));
			$db->setQuery($sql);
			$db->execute();
		}

		// Decrypt the Secret Word settings in the database
		$params = $this->container->params;
		SecretWord::enforceDecrypted($params, 'frontend_secret_word', $key);

		// Finally, remove the key file
		if (!@unlink($filename))
		{
			File::delete($filename);
		}
	}

	/**
	 * Enabled the encryption of profile settings. Existing settings are automatically encrypted.
	 *
	 * @return  void
	 */
	private function enableSettingsEncryption()
	{
		$key = $this->createSettingsKey();

		if (empty($key) || ($key == false))
		{
			return;
		}

		// Loop all profiles and encrypt their settings
		/** @var Profiles $profilesModel */
		$profilesModel = $this->container->factory->model('Profiles')->tmpInstance();
		$profiles      = $profilesModel->get(true);
		$db            = $this->container->db;
		if (!empty($profiles))
		{
			foreach ($profiles as $profile)
			{
				$id     = $profile->id;
				$config = Factory::getSecureSettings()->encryptSettings($profile->configuration, $key);
				$sql    = $db->getQuery(true)
					->update($db->qn('#__ak_profiles'))
					->set($db->qn('configuration') . ' = ' . $db->q($config))
					->where($db->qn('id') . ' = ' . $db->q($id));
				$db->setQuery($sql);
				$db->execute();
			}
		}
	}

	/**
	 * Creates an encryption key for the settings and saves it in the <component>/BackupEngine/serverkey.php path
	 *
	 * @return  bool|string  FALSE on failure, the encryptions key otherwise
	 */
	private function createSettingsKey()
	{
		$randVal = new RandomValue();
		$rawKey  = $randVal->generate(64);
		$key     = base64_encode($rawKey);

		$filecontents = "<?php defined('AKEEBAENGINE') or die(); define('AKEEBA_SERVERKEY', '$key'); ?>";
		$filename     = $this->container->backEndPath . '/BackupEngine/serverkey.php';

		$result = File::write($filename, $filecontents);

		if (!$result)
		{
			return false;
		}

		return $rawKey;
	}
}
components/com_akeeba/Model/Mixin/GetErrorsFromExceptions.php000060400000002364152453623440020447 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Model\Mixin;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Exception;
use Throwable;

trait GetErrorsFromExceptions
{
	/**
	 * Retrieve the messages from nested exceptions into an array. It will optionally add the trace as the last element
	 * of the array if debug mode (JDEBUG or AKEEBADEBUG) is enabled and $includeTraceInDebug is true.
	 *
	 * @param   Exception|Throwable  $exception            The Exception or Throwable to log
	 *
	 * @param   bool                 $includeTraceInDebug  Include the trace when debug mode is enabled
	 *
	 * @return  array
	 */
	public function getErrorsFromExceptions($exception, $includeTraceInDebug = true)
	{
		$ret = [
			$exception->getMessage(),
		];

		$previous = $exception->getPrevious();

		if (!is_null($previous))
		{
			$ret = array_merge($ret, $this->getErrorsFromExceptions($previous, false));
		}

		if ($includeTraceInDebug && ((defined('JDEBUG') && JDEBUG) || (defined('AKEEBADEBUG') && AKEEBADEBUG)))
		{
			$ret[] = $exception->getTraceAsString();
		}

		return $ret;
	}

}
components/com_akeeba/Model/Mixin/Chmod.php000060400000003266152453623440014701 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Model\Mixin;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Joomla\CMS\Client\ClientHelper;
use Joomla\CMS\Client\FtpClient;
use Joomla\CMS\Filesystem\Path;

trait Chmod
{
	/**
	 * Tries to change a folder/file's permissions using direct access or FTP
	 *
	 * @param   string  $path  The full path to the folder/file to chmod
	 * @param   int     $mode  New permissions
	 *
	 * @return  bool  True on success
	 */
	private function chmod($path, $mode)
	{
		if (is_string($mode))
		{
			$mode                    = octdec($mode);
			$trustMeIKnowWhatImDoing = 500 + 10 + 1; // working around overzealous scanners written by bozos
			$ohSixHundred            = 386 - 2;
			$ohSevenFiveFive         = 500 - 7;

			if (($mode < $ohSixHundred) || ($mode > $trustMeIKnowWhatImDoing))
			{
				$mode = $ohSevenFiveFive;
			}
		}

		// Initialize variables
		$ftpOptions = ClientHelper::getCredentials('ftp');

		// Check to make sure the path valid and clean
		$path = Path::clean($path);

		if (@chmod($path, $mode))
		{
			$ret = true;
		}
		elseif ($ftpOptions['enabled'] == 1)
		{
			// Connect the FTP client
			$ftp = FtpClient::getInstance(
				$ftpOptions['host'], $ftpOptions['port'], [],
				$ftpOptions['user'], $ftpOptions['pass']
			);

			// Translate path and delete
			$path = Path::clean(str_replace(JPATH_ROOT, $ftpOptions['root'], $path), '/');
			// FTP connector throws an error
			$ret = $ftp->chmod($path, $mode);
		}
		else
		{
			$ret = false;
		}

		return $ret;
	}
}
components/com_akeeba/Model/Mixin/ExclusionFilter.php000060400000006265152453623440016770 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Model\Mixin;

// Protect from unauthorized access
use Akeeba\Engine\Factory;

defined('_JEXEC') || die();

/**
 * Trait for handling Akeeba Engine exclusion filters in models
 */
trait ExclusionFilter
{
	protected $knownFilterTypes = [];

	/**
	 * Modifies a filter
	 *
	 * @param   string  $type     Filter type
	 * @param   string  $root     The filter's root
	 * @param   string  $node     The filter node to modify
	 * @param   string  $action   The action to take: set, remove, toggle, swap
	 * @param   string  $oldNode  Only for swap: The old node which will be swapped with $node
	 *
	 * @return  array  Array with keys success and newstate
	 */
	protected function applyExclusionFilter($type, $root, $node, $action = 'set', $oldNode = '')
	{
		$ret = [
			'success'  => false,
			'newstate' => false
		];

		$filter  = Factory::getFilterObject($type);
		$newState = null;

		switch ($action)
		{
			case 'set':
				$ret['success'] = $filter->set($root, $node);
				break;

			case 'remove':
				$ret['success'] = $filter->remove($root, $node);
				break;

			case 'toggle':
				$ret['success'] = $filter->toggle($root, $node, $newState);
				break;

			case 'swap':
				$ret['success'] = true;

				if (empty($node))
				{
					$ret['success'] = false;
				}

				if ($ret['success'] && !empty($oldNode))
				{
					$ret = $this->applyExclusionFilter($type, $root, $oldNode, 'remove');
				}

				if ($ret['success'])
				{
					$ret = $this->applyExclusionFilter($type, $root, $node, 'set');
				}
				break;
		}

		$ret['newstate'] = $newState;

		if (is_null($newState))
		{
			$ret['newstate'] = $ret['success'];
		}

		if ($ret['success'])
		{
			$filters = Factory::getFilters();
			$filters->save();
		}

		return $ret;
	}


	/**
	 * Retrieves the filters as an array. Used for the tabular filter editor.
	 *
	 * @param   string  $root  The root node to search filters on
	 *
	 * @return  array  A collection of hash arrays containing node and type for each filtered element
	 */
	protected function &getTabularFilters($root)
	{
		// A reference to the global Akeeba Engine filter object
		$filters = Factory::getFilters();

		// Initialize the return array
		$ret = array();

		foreach ($this->knownFilterTypes as $type)
		{
			$rawFilterData = $filters->getFilterData($type);

			if (array_key_exists($root, $rawFilterData))
			{
				if (!empty($rawFilterData[ $root ]))
				{
					foreach ($rawFilterData[ $root ] as $node)
					{
						$ret[] = array(
							'node' => substr($node, 0), // Make sure we get a COPY, not a reference to the original data
							'type' => $type
						);
					}
				}
			}
		}

		return $ret;
	}

	/**
	 * Resets the filters
	 *
	 * @param   string  $root  Root directory
	 *
	 * @return  void
	 */
	protected function resetAllFilters($root)
	{
		// Get a reference to the global Filters object
		$filters = Factory::getFilters();

		foreach ($this->knownFilterTypes as $filterName)
		{
			$filter = Factory::getFilterObject($filterName);
			$filter->reset($root);
		}

		$filters->save();
	}
}
components/com_akeeba/Model/Configuration.php000060400000013376152453623440015375 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Model;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Engine\Archiver\Directftp;
use Akeeba\Engine\Archiver\Directsftp;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use Akeeba\Engine\Postproc\Base;
use Akeeba\Engine\Util\Transfer\FtpCurl;
use Akeeba\Engine\Util\Transfer\SftpCurl;
use Exception;
use FOF40\Model\Model;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Uri\Uri;
use RuntimeException;

class Configuration extends Model
{
	/**
	 * Save the engine configuration
	 *
	 * @return  void
	 */
	public function saveEngineConfig()
	{
		$data = $this->getState('engineconfig', []);

		// Forbid stupidly selecting the site's root as the output or temporary directory
		if (array_key_exists('akeeba.basic.output_directory', $data))
		{
			$folder = $data['akeeba.basic.output_directory'];
			$folder = Factory::getFilesystemTools()->translateStockDirs($folder, true, true);
			$check  = Factory::getFilesystemTools()->translateStockDirs('[SITEROOT]', true, true);

			if ($check == $folder)
			{
				$data['akeeba.basic.output_directory'] = '[DEFAULT_OUTPUT]';
			}
			else
			{
				$data['akeeba.basic.output_directory'] = Factory::getFilesystemTools()->rebaseFolderToStockDirs($data['akeeba.basic.output_directory']);
			}
		}

		// Unprotect the configuration and merge it
		$config        = Factory::getConfiguration();
		$protectedKeys = $config->getProtectedKeys();
		$config->resetProtectedKeys();
		$config->mergeArray($data, false, false);
		$config->setProtectedKeys($protectedKeys);

		// Save configuration
		Platform::getInstance()->save_configuration();
	}

	/**
	 * Test the FTP connection.
	 *
	 * @return  void
	 * @throws  RuntimeException
	 */
	public function testFTP()
	{
		$config = [
			'host'    => $this->getState('host'),
			'port'    => $this->getState('port'),
			'user'    => $this->getState('user'),
			'pass'    => $this->getState('pass'),
			'initdir' => $this->getState('initdir'),
			'usessl'  => $this->getState('usessl'),
			'passive' => $this->getState('passive'),
		];

		// Check for bad settings
		if (substr($config['host'], 0, 6) == 'ftp://')
		{
			throw new RuntimeException(Text::_('COM_AKEEBA_CONFIG_FTPTEST_BADPREFIX'), 500);
		}

		// Special case for cURL transport
		if ($this->getState('isCurl'))
		{
			$this->testFtpCurl();

			return;
		}

		// Perform the FTP connection test
		$test = new Directftp();

		$test->initialize('', $config);
	}

	/**
	 * Test the SFTP connection.
	 *
	 * @return  void
	 * @throws  RuntimeException
	 */
	public function testSFTP()
	{
		$config = [
			'host'    => $this->getState('host'),
			'port'    => $this->getState('port'),
			'user'    => $this->getState('user'),
			'pass'    => $this->getState('pass'),
			'privkey' => $this->getState('privkey'),
			'pubkey'  => $this->getState('pubkey'),
			'initdir' => $this->getState('initdir'),
		];

		// Check for bad settings
		if (substr($config['host'], 0, 7) == 'sftp://')
		{
			throw new RuntimeException(Text::_('COM_AKEEBA_CONFIG_SFTPTEST_BADPREFIX'), 500);
		}

		// Special case for cURL transport
		if ($this->getState('isCurl'))
		{
			$this->testSftpCurl();

			return;
		}

		// Perform the FTP connection test
		$test = new Directsftp();

		$test->initialize('', $config);
	}

	/**
	 * Opens an OAuth window for the selected post-processing engine
	 *
	 * @return  void
	 * @throws  Exception
	 */
	public function dpeOuthOpen()
	{
		$engine = $this->getState('engine');
		$params = $this->getState('params', []);

		// Get a callback URI for OAuth 2
		$params['callbackURI'] = rtrim(Uri::base(), '/') . '/index.php?option=com_akeeba&view=Configuration&task=dpecustomapiraw&engine=' . $engine;

		// Get the Input object
		$params['input'] = $this->input->getData();

		// Get the engine
		$engineObject = Factory::getPostprocEngine($engine);

		if (!$engineObject instanceof Base)
		{
			return;
		}

		$engineObject->oauthOpen($params);
	}

	/**
	 * Runs a custom API call for the selected post-processing engine
	 *
	 * @return  mixed
	 */
	public function dpeCustomAPICall()
	{
		$engine = $this->getState('engine');
		$method = $this->getState('method');
		$params = $this->getState('params', []);

		// Get the Input object
		$params['input'] = $this->input->getData();

		$engineObject = Factory::getPostprocEngine($engine);

		if (!$engineObject instanceof Base)
		{
			return false;
		}

		return $engineObject->customAPICall($method, $params);
	}

	/**
	 * Test the connection to a remote FTP server using cURL transport
	 *
	 * @return  void
	 * @throws  RuntimeException
	 */
	private function testFtpCurl()
	{
		$options = [
			'host'        => $this->getState('host'),
			'port'        => $this->getState('port'),
			'username'    => $this->getState('user'),
			'password'    => $this->getState('pass'),
			'directory'   => $this->getState('initdir'),
			'usessl'      => $this->getState('usessl'),
			'passive'     => $this->getState('passive'),
			'passive_fix' => $this->getState('passive_mode_workaround'),
		];

		$sftpTransfer = new FtpCurl($options);

		$sftpTransfer->connect();
	}

	/**
	 * Test the connection to a remote SFTP server using cURL transport
	 *
	 * @return  void
	 * @throws  RuntimeException
	 */
	private function testSftpCurl()
	{
		$options = [
			'host'       => $this->getState('host'),
			'port'       => $this->getState('port'),
			'username'   => $this->getState('user'),
			'password'   => $this->getState('pass'),
			'directory'  => $this->getState('initdir'),
			'privateKey' => $this->getState('privkey'),
			'publicKey'  => $this->getState('pubkey'),
		];

		$sftpTransfer = new SftpCurl($options);

		$sftpTransfer->connect();
	}
}
components/com_akeeba/Model/Log.php000060400000012177152453623440013305 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Model;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Engine\Factory;
use FOF40\Model\Model;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;

class Log extends Model
{
	/**
	 * Get an array with the names of all log files in this backup profile
	 *
	 * @param   bool  $onlyFailed  Should I only return the log files of backups marked as failed?
	 *
	 * @return  string[]
	 */
	public function getLogFiles(bool $onlyFailed = false): array
	{
		$configuration = Factory::getConfiguration();
		$outdir        = $configuration->get('akeeba.basic.output_directory');

		$files = Factory::getFileLister()->getFiles($outdir);
		$ret   = [];

		if (!empty($files) && is_array($files))
		{
			foreach ($files as $filename)
			{
				$baseName         = basename($filename);
				$startsWithAkeeba = substr($baseName, 0, 7) == 'akeeba.';
				$endsWithLog      = substr($baseName, -4) == '.log';
				$endsWithPhpLog   = substr($baseName, -8) == '.log.php';
				$isDefaultLog     = $baseName == 'akeeba.log';

				if ($startsWithAkeeba && ($endsWithLog || $endsWithPhpLog) && !$isDefaultLog)
				{
					/**
					 * Extract the tag from the filename (akeeba.tag.log or akeeba.tag.log.php)
					 *
					 * We ignore the first seven characters ("akeeba.") and the last X characters, where X is 8 if the
					 * log file name ends with .log.php or 4 if the log name ends with .log.
					 */
					$tag = substr($baseName, 7, -($endsWithPhpLog ? 8 : 4));

					if (empty($tag))
					{
						continue;
					}

					$parts = explode('.', $tag);
					$key   = array_pop($parts);
					$key   = str_replace('id', '', $key);
					$key   = is_numeric($key) ? sprintf('%015u', $key) : $key;

					if (empty($parts))
					{
						$key = str_repeat('0', 15) . '.' . $key;
					}
					else
					{
						$key .= '.' . implode('.', $parts);
					}

					$ret[$key] = $tag;
				}
			}
		}

		if ($onlyFailed)
		{
			$ret = $this->keepOnlyFailedLogs($ret);
		}

		krsort($ret);

		return $ret;
	}

	/**
	 * Gets the JHtml options list for selecting a log file
	 *
	 * @param   bool  $onlyFailed  Should I only return the log files of backups marked as failed?
	 *
	 * @return  array
	 */
	public function getLogList(bool $onlyFailed = false): array
	{
		$origin  = null;
		$options = [];

		$list = $this->getLogFiles($onlyFailed);

		if (!empty($list))
		{
			$options[] = HTMLHelper::_('select.option', null, Text::_('COM_AKEEBA_LOG_CHOOSE_FILE_VALUE'));

			foreach ($list as $item)
			{
				$text = Text::_('COM_AKEEBA_BUADMIN_LABEL_ORIGIN_' . $item);

				if (strstr($item, '.') !== false)
				{
					[$origin, $backupId] = explode('.', $item, 2);

					$text = Text::_('COM_AKEEBA_BUADMIN_LABEL_ORIGIN_' . $origin) . ' (' . $backupId . ')';
				}

				$options[] = HTMLHelper::_('select.option', $item, $text);
			}
		}

		return $options;
	}

	/**
	 * Output the raw text log file to the standard output without the PHP die header
	 *
	 * @param   bool  $withHeader  Should I include a header telling the user how to submit this file?
	 *
	 * @return  void
	 */
	public function echoRawLog($withHeader = true)
	{
		$tag     = $this->getState('tag', '');
		$logFile = Factory::getLog()->getLogFilename($tag);

		if (!@is_file($logFile) && @file_exists(substr($logFile, 0, -4)))
		{
			/**
			 * Transitional period: the log file akeeba.tag.log.php may not exist but the akeeba.tag.log does. This
			 * addresses this transition.
			 */
			$logFile = substr($logFile, 0, -4);
		}

		if ($withHeader)
		{
			echo "WARNING: Do not copy and paste lines from this file!\r\n";
			echo "You are supposed to ZIP and attach it in your support forum post.\r\n";
			echo "If you fail to do so, we will be unable to provide efficient support.\r\n";
			echo "\r\n";
			echo "--- START OF RAW LOG --\r\n";
		}

		// The at sign (silence operator) is necessary to prevent PHP showing a warning if the file doesn't exist or
		// isn't readable for any reason.
		$fp = @fopen($logFile, 'r');

		if ($fp === false)
		{
			if ($withHeader)
			{
				echo "--- END OF RAW LOG ---\r\n";
			}

			return;
		}

		$firstLine = @fgets($fp);
		if (substr($firstLine, 0, 5) != '<' . '?' . 'php')
		{
			@fclose($fp);
			@readfile($logFile);
		}
		else
		{
			while (!feof($fp))
			{
				echo rtrim(fgets($fp)) . "\r\n";
			}

			@fclose($fp);
		}

		if ($withHeader)
		{
			echo "--- END OF RAW LOG ---\r\n";
		}
	}

	protected function keepOnlyFailedLogs($logs)
	{
		$db            = $this->container->db;
		$query         = $db->getQuery(true)
			->select([
				$db->quoteName('tag'),
				$db->quoteName('backupid'),
			])
			->from($db->quoteName('#__ak_stats'))
			->where($db->quoteName('status') . ' = ' . $db->quote('fail'));
		$failedBackups = $db->setQuery($query)->loadObjectList() ?: [];

		if (empty($failedBackups))
		{
			return [];
		}

		$failedBackups = array_map(function ($o) {
			$tag = $o->tag ?? '';

			return (empty($tag) ? '' : '.') . $o->backupid;
		}, $failedBackups);

		return array_intersect($logs, $failedBackups);
	}
}
components/com_akeeba/Model/FTPBrowser.php000060400000010327152453623440014554 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Model;

// Protect from unauthorized access
defined('_JEXEC') || die();

use FOF40\Model\Model;
use Joomla\CMS\Language\Text;
use RuntimeException;

class FTPBrowser extends Model
{
	/**
	 * The FTP server hostname
	 *
	 * @var  string
	 */
	public $host = '';

	/**
	 * The FTP server port number (default: 21)
	 *
	 * @var  int
	 */
	public $port = 21;

	/**
	 * Should I use passive mode (default: yes)
	 *
	 * @var  bool
	 */
	public $passive = true;

	/**
	 * Should I use FTP over SSL (default: no)
	 *
	 * @var  bool
	 */
	public $ssl = false;

	/**
	 * Username for logging in
	 *
	 * @var  string
	 */
	public $username = '';

	/**
	 * Password for logging in
	 *
	 * @var  string
	 */
	public $password = '';

	/**
	 * The directory to browse
	 *
	 * @var  string
	 */
	public $directory = '';

	/**
	 * Breadcrumbs to the current directory
	 *
	 * @var  array
	 */
	public $parts = [];

	/**
	 * Path to the parent directory
	 *
	 * @var  string
	 */
	public $parent_directory = null;

	/**
	 * Gets the folders contained in the remote FTP root directory defined in $this->directory
	 *
	 * @return  array
	 */
	public function getListing()
	{
		$dir = $this->directory;

		// Parse directory to parts
		$parsed_dir  = trim($dir, '/');
		$this->parts = empty($parsed_dir) ? [] : explode('/', $parsed_dir);

		// Find the path to the parent directory
		$this->parent_directory = '';

		if (!empty($this->parts))
		{
			$copy_of_parts = $this->parts;
			array_pop($copy_of_parts);

			$this->parent_directory = '/';

			if (!empty($copy_of_parts))
			{
				$this->parent_directory = '/' . implode('/', $copy_of_parts);
			}
		}

		// Connect to the server
		if ($this->ssl)
		{
			$con = @ftp_ssl_connect($this->host, $this->port);
		}
		else
		{
			$con = @ftp_connect($this->host, $this->port);
		}

		if ($con === false)
		{
			throw new RuntimeException(Text::_('COM_AKEEBA_FTPBROWSER_ERROR_HOSTNAME'));
		}

		// Login
		$result = @ftp_login($con, $this->username, $this->password);

		if ($result === false)
		{
			throw new RuntimeException(Text::_('COM_AKEEBA_FTPBROWSER_ERROR_USERPASS'));
		}

		// Set the passive mode -- don't care if it fails, though!
		@ftp_pasv($con, $this->passive);

		// Try to chdir to the specified directory
		if (!empty($dir))
		{
			$result = @ftp_chdir($con, $dir);

			if ($result === false)
			{
				throw new RuntimeException(Text::_('COM_AKEEBA_FTPBROWSER_ERROR_NOACCESS'));
			}
		}
		else
		{
			$this->directory = @ftp_pwd($con);

			$parsed_dir             = trim($this->directory, '/');
			$this->parts            = empty($parsed_dir) ? [] : explode('/', $parsed_dir);
			$this->parent_directory = $this->directory;
		}

		// Get a raw directory listing (hoping it's a UNIX server!)
		$list = @ftp_rawlist($con, '.');

		ftp_close($con);

		if ($list === false)
		{
			throw new RuntimeException(Text::_('COM_AKEEBA_FTPBROWSER_ERROR_UNSUPPORTED'));
		}

		// Parse the raw listing into an array
		$folders = $this->parse_rawlist($list);

		return $folders;
	}

	/**
	 * Perform the actual folder browsing. Returns an array that's usable by the UI.
	 *
	 * @return  array
	 */
	public function doBrowse()
	{
		$error = '';
		$list  = [];

		try
		{
			$list = $this->getListing();
		}
		catch (RuntimeException $e)
		{
			$error = $e->getMessage();
		}

		$response_array = [
			'error'       => $error,
			'list'        => $list,
			'breadcrumbs' => $this->parts,
			'directory'   => $this->directory,
			'parent'      => $this->parent_directory,
		];

		return $response_array;
	}

	/**
	 * Parse the raw list of folders returned by the server into a usable simple array of folders
	 *
	 * @param   array  $list  The raw folder list returned by ftp_rawlist
	 *
	 * @return  array  The parsed list of folders
	 */
	private function parse_rawlist(array $list)
	{
		$folders = [];

		foreach ($list as $v)
		{

			$vinfo = preg_split("/[\s]+/", $v, 9);

			if ($vinfo[0] !== "total")
			{
				$perms = $vinfo[0];

				if (substr($perms, 0, 1) == 'd')
				{
					$folders[] = $vinfo[8];
				}
			}
		}

		asort($folders);

		return $folders;
	}
}
components/com_akeeba/Model/Profiles.php000060400000010412152453623440014335 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Model;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use FOF40\Container\Container;
use FOF40\Model\DataModel;
use Joomla\CMS\Language\Text;
use RuntimeException;

/**
 * Backup profile model
 *
 * @property  int    id             Profile ID
 * @property  string description    Description
 * @property  string configuration  Engine configuration data
 * @property  string filters        Engine filters
 * @property  int    quickicon      Should I include this profile in the One Click Backup profiles (1) or not (0)?
 */
class Profiles extends DataModel
{
	public function __construct(Container $container, array $config)
	{
		$defaultConfig = [
			'tableName'   => '#__ak_profiles',
			'idFieldName' => 'id',
		];

		if (!is_array($config) || empty($config))
		{
			$config = [];
		}

		$config = array_merge($defaultConfig, $config);

		parent::__construct($container, $config);

		$this->addBehaviour('filters');
		$this->blacklistFilters([
			'configuration',
			'filters',
		]);
	}

	/**
	 * Tries to copy the currently loaded to a new record
	 *
	 * @return  self  The new record
	 */
	public function copy($data = null)
	{
		$id = $this->getId();

		// Check for invalid id's (not numeric, or <= 0)
		if ((!is_numeric($id)) || ($id <= 0))
		{
			throw new DataModel\Exception\RecordNotLoaded('PROFILE_INVALID_ID');
		}

		if (!is_array($data))
		{
			$data = [];
		}

		$data['id'] = 0;

		return $this->getClone()->save($data);
	}

	/**
	 * Returns an associative array with profile IDs as keys and the post-processing engine as values
	 *
	 * @return  array
	 */
	public function getPostProcessingEnginePerProfile()
	{
		// Cache the current profile's ID
		$currentProfileID = $this->container->platform->getSessionVar('profile', null, 'akeeba');

		// Get the IDs of all profiles
		$db    = $this->getDbo();
		$query = $db->getQuery(true)
			->select($db->qn('id'))
			->from($db->qn('#__ak_profiles'));
		$db->setQuery($query);
		$profiles = $db->loadColumn();

		// Initialise return;
		$engines = [];

		// Loop all profiles
		foreach ($profiles as $profileId)
		{
			Platform::getInstance()->load_configuration($profileId);
			$profileConfiguration = Factory::getConfiguration();
			$engines[$profileId]  = $profileConfiguration->get('akeeba.advanced.postproc_engine');
		}

		// Reload the current profile
		Platform::getInstance()->load_configuration($currentProfileID);

		return $engines;
	}

	/**
	 * Runs before deleting a record
	 *
	 * @param   int  $id  The ID of the record being deleted
	 */
	public function onBeforeDelete(&$id)
	{
		// You cannot delete the default record
		if ($id <= 1)
		{
			throw new RuntimeException(Text::_('COM_AKEEBA_PROFILE_ERR_CANNOTDELETEDEFAULT'), 500);
		}

		// If you're deleting the current backup profile we have to switch to the default profile (#1)
		$activeProfile = Platform::getInstance()->get_active_profile();

		if ($id == $activeProfile)
		{
			throw new RuntimeException(Text::sprintf('COM_AKEEBA_PROFILE_ERR_CANNOTDELETEACTIVE', $id), 500);
		}
	}

	/**
	 * Save a profile from imported configuration data. The $data array must contain the keys description (profile
	 * description), configuration (engine configuration INI data) and filters (inclusion and inclusion filters JSON
	 * configuration data).
	 *
	 * @param   array  $data  See above
	 *
	 * @returns  void
	 *
	 * @throws   RuntimeException  When an iport error occurs
	 */
	public function import($data)
	{
		// Check for data validity
		$isValid =
			is_array($data) &&
			!empty($data) &&
			array_key_exists('description', $data) &&
			array_key_exists('configuration', $data) &&
			array_key_exists('filters', $data);

		if (!$isValid)
		{
			throw new RuntimeException(Text::_('COM_AKEEBA_PROFILES_ERR_IMPORT_INVALID'));
		}

		// Unset the id, if it exists
		if (array_key_exists('id', $data))
		{
			unset($data['id']);
		}

		$data['akeeba.flag.confwiz'] = 1;

		// Try saving the profile
		$result = $this->save($data);

		if (!$result)
		{
			throw new RuntimeException(Text::_('COM_AKEEBA_PROFILES_ERR_IMPORT_FAILED'));
		}
	}
}
components/com_akeeba/Model/UsageStatistics.php000060400000014445152453623440015703 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Model;

// Protect from unauthorized access
defined('_JEXEC') || die();

use AkeebaUsagestats;
use FOF40\Encrypt\Randval;
use FOF40\Model\Model;
use Joomla\CMS\Uri\Uri;

/**
 * Usage statistics collection model. Implements the anonymous collection of PHP, MySQL and Joomla! version information
 * which help us decide on the end of support for obsolete versions of said third party software.
 */
class UsageStatistics extends Model
{
	/**
	 * Get an existing unique site ID or create a new one
	 *
	 * @return  string
	 */
	public function getSiteId()
	{
		// Can I load a site ID from the database?
		$siteId = $this->getCommonVariable('stats_siteid', null);

		// Can I load the site Url from the database?
		$siteUrl = $this->getCommonVariable('stats_siteurl', null);

		// No id or the saved URL is not the same as the current one (ie site restored to a new url)?
		// Create a new, random site ID and save it to the database
		if (empty($siteId) || (md5(Uri::base()) != $siteUrl))
		{
			$siteUrl = md5(Uri::base());
			$this->setCommonVariable('stats_siteurl', $siteUrl);

			$randomData = random_bytes(120);
			$siteId     = sha1($randomData);

			$this->setCommonVariable('stats_siteid', $siteId);
		}

		return $siteId;
	}

	/**
	 * Send site information to the remove collection service
	 *
	 * @param   bool  $useIframe  Should I use an IFRAME?
	 *
	 * @return  bool
	 */
	public function collectStatistics($useIframe)
	{
		// Is data collection turned off?
		if (!$this->container->params->get('stats_enabled', 1))
		{
			return false;
		}

		// Make sure there is a site ID set
		$siteId    = $this->getSiteId();
		$container = $this->container;

		// UsageStats file is missing, no need to continue
		if (!file_exists($container->backEndPath . '/Master/Stats/usagestats.php'))
		{
			return false;
		}

		if (!class_exists('AkeebaUsagestats', false))
		{
			@include_once $container->backEndPath . '/Master/Stats/usagestats.php';
		}

		// UsageStats file is missing, no need to continue
		if (!class_exists('AkeebaUsagestats', false))
		{
			return false;
		}

		$lastrun = $this->getCommonVariable('stats_lastrun', 0);

		// It's not time to collect the stats
		if (time() < ($lastrun + 3600 * 24))
		{
			return false;
		}

		if (!defined('AKEEBA_VERSION'))
		{
			@include_once $container->backEndPath . '/version.php';
		}

		if (!defined('AKEEBA_VERSION'))
		{
			define('AKEEBA_VERSION', 'dev');
			define('AKEEBA_DATE', date('Y-m-d'));
		}

		$db = $container->db;

		try
		{
			$stats = new AkeebaUsagestats();
		}
		catch (\Exception $e)
		{
			return false;
		}

		$stats->setSiteId($siteId);

		// I can't use list since dev release don't have any dots
		$at_parts    = explode('.', AKEEBA_VERSION);
		$at_major    = $at_parts[0];
		$at_minor    = $at_parts[1] ?? '';
		$at_revision = $at_parts[2] ?? '';

		[$php_major, $php_minor, $php_revision] = explode('.', phpversion());
		$php_qualifier = strpos($php_revision, '~') !== false ? substr($php_revision, strpos($php_revision, '~')) : '';

		[$cms_major, $cms_minor, $cms_revision] = explode('.', JVERSION);
		[$db_major, $db_minor, $db_revision] = explode('.', $db->getVersion());
		$db_qualifier = strpos($db_revision, '~') !== false ? substr($db_revision, strpos($db_revision, '~')) : '';

		$db_driver = get_class($db);

		if (stripos($db_driver, 'mysql') !== false)
		{
			$stats->setValue('dt', 1);
		}
		else
		{
			$stats->setValue('dt', 0);
		}

		$stats->setValue('sw', AKEEBA_PRO ? 2 : 1); // software
		$stats->setValue('pro', AKEEBA_PRO); // pro
		$stats->setValue('sm', $at_major); // software_major
		$stats->setValue('sn', $at_minor); // software_minor
		$stats->setValue('sr', $at_revision); // software_revision
		$stats->setValue('pm', $php_major); // php_major
		$stats->setValue('pn', $php_minor); // php_minor
		$stats->setValue('pr', $php_revision); // php_revision
		$stats->setValue('pq', $php_qualifier); // php_qualifiers
		$stats->setValue('dm', $db_major); // db_major
		$stats->setValue('dn', $db_minor); // db_minor
		$stats->setValue('dr', $db_revision); // db_revision
		$stats->setValue('dq', $db_qualifier); // db_qualifiers
		$stats->setValue('ct', 1); // cms_type
		$stats->setValue('cm', $cms_major); // cms_major
		$stats->setValue('cn', $cms_minor); // cms_minor
		$stats->setValue('cr', $cms_revision); // cms_revision

		// Store the last execution time. We must store it even if we fail since we don't want a failed stats collection
		// to cause the site to stop responding.
		$this->setCommonVariable('stats_lastrun', time());

		$return = $stats->sendInfo($useIframe);

		return $return;
	}

	/**
	 * Load a variable from the common variables table. If it doesn't exist it returns $default
	 *
	 * @param   string  $key      The key to load
	 * @param   mixed   $default  The default value if the key doesn't exist
	 *
	 * @return  mixed  The contents of the key or null if it's not present
	 */
	public function getCommonVariable($key, $default = null)
	{
		$db    = $this->container->db;
		$query = $db->getQuery(true)
			->select($db->qn('value'))
			->from($db->qn('#__akeeba_common'))
			->where($db->qn('key') . ' = ' . $db->q($key));

		try
		{
			$db->setQuery($query);
			$result = $db->loadResult();
		}
		catch (\Exception $e)
		{
			$result = $default;
		}

		return $result;
	}

	/**
	 * Set a variable to the common variables table.
	 *
	 * @param   string  $key    The key to save
	 * @param   mixed   $value  The value to save
	 *
	 * @return  void
	 */
	public function setCommonVariable($key, $value)
	{
		$db    = $this->container->db;
		$query = $db->getQuery(true)
			->select('COUNT(*)')
			->from($db->qn('#__akeeba_common'))
			->where($db->qn('key') . ' = ' . $db->q($key));

		try
		{
			$db->setQuery($query);
			$count = $db->loadResult();
		}
		catch (\Exception $e)
		{
			return;
		}

		try
		{
			if (!$count)
			{
				$insertObject = (object) [
					'key'   => $key,
					'value' => $value,
				];
				$db->insertObject('#__akeeba_common', $insertObject);
			}
			else
			{
				$insertObject = (object) [
					'key'   => $key,
					'value' => $value,
				];

				$db->updateObject('#__akeeba_common', $insertObject, 'key');
			}
		}
		catch (\Exception $e)
		{
		}
	}
}
components/com_akeeba/access.xml000060400000001417152453623440012771 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->
<access component="com_akeeba">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="akeeba.backup" title="Backup" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="akeeba.configure" title="Configure" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="akeeba.download" title="Download" description="JACTION_CREATE_COMPONENT_DESC" />
	</section>
</access>
components/com_akeeba/Dispatcher/.htaccess000060400000000246152453623440014671 0ustar00<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
  <RequireAll>
    Require all denied
  </RequireAll>
</IfModule>
components/com_akeeba/Dispatcher/Dispatcher.php000060400000023662152453623440015701 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Dispatcher;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Helper\SecretWord;
use Akeeba\Backup\Admin\Model\ControlPanel;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use AkeebaFEFHelper;
use FOF40\Container\Container;
use FOF40\Dispatcher\Dispatcher as BaseDispatcher;
use FOF40\Dispatcher\Mixin\ViewAliases;
use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\Language\Text;

class Dispatcher extends BaseDispatcher
{
	/** @var   string  The name of the default view, in case none is specified */
	public $defaultView = 'ControlPanel';

	use ViewAliases
	{
		onBeforeDispatch as onBeforeDispatchViewAliases;
	}

	/** @var  \Akeeba\Backup\Admin\Container  The container we belong to */
	protected $container = null;

	public function __construct(Container $container, array $config)
	{
		parent::__construct($container, $config);

		$this->viewNameAliases = [
			'buadmin'        => 'Manage',
			'buadmins'       => 'Manage',
			'config'         => 'Configuration',
			'configs'        => 'Configuration',
			'confwiz'        => 'ConfigurationWizard',
			'confwizs'       => 'ConfigurationWizard',
			'confwizes'      => 'ConfigurationWizard',
			'cpanel'         => 'ControlPanel',
			'cpanels'        => 'ControlPanel',
			'dbef'           => 'DatabaseFilters',
			'dbefs'          => 'DatabaseFilters',
			'eff'            => 'IncludeFolders',
			'effs'           => 'IncludeFolders',
			'fsfilter'       => 'FileFilters',
			'fsfilters'      => 'FileFilters',
			'ftpbrowser'     => 'FTPBrowser',
			'ftpbrowsers'    => 'FTPBrowser',
			'sftpbrowser'    => 'SFTPBrowser',
			'sftpbrowsers'   => 'SFTPBrowser',
			'multidb'        => 'MultipleDatabases',
			'multidbs'       => 'MultipleDatabases',
			'regexdbfilter'  => 'RegExDatabaseFilters',
			'regexdbfilters' => 'RegExDatabaseFilters',
			'regexfsfilter'  => 'RegExFileFilters',
			'regexfsfilters' => 'RegExFileFilters',
			'remotefile'     => 'RemoteFiles',
			'remotefiles'    => 'RemoteFiles',
			's3import'       => 'S3Import',
			's3imports'      => 'S3Import',
		];

	}

	/**
	 * Executes before dispatching the request to the appropriate controller
	 */
	public function onBeforeDispatch()
	{
		$this->container->platform->importPlugin('akeebabackup');
		$this->container->platform->runPlugins('onComAkeebaDispatcherBeforeDispatch', []);

		$this->onBeforeDispatchViewAliases();

		// Load the FOF language
		$lang = $this->container->platform->getLanguage();
		$lang->load('lib_fof40', JPATH_ADMINISTRATOR, 'en-GB', true, true);
		$lang->load('lib_fof40', JPATH_ADMINISTRATOR, null, true, false);

		// Necessary for routing the Alice view
		$this->container->inflector->addWord('Alice', 'Alices');

		// Does the user have adequate permissions to access our component?
		if (!$this->container->platform->authorise('core.manage', 'com_akeeba'))
		{
			throw new \RuntimeException(Text::_('JERROR_ALERTNOAUTHOR'), 404);
		}

		// FEF Renderer options. Used to load the common CSS file.
		$darkMode  = $this->container->params->get('dark_mode', -1);
		$customCss = 'media://com_akeeba/css/akeebaui.css';

		if ($darkMode != 0)
		{
			$customCss .= ', media://com_akeeba/css/dark.css';
		}

		$this->container->renderer->setOptions([
			'custom_css' => $customCss,
			'fef_dark'   => $darkMode,
		]);

		// Load Akeeba Engine
		$this->loadAkeebaEngine();

		// Load the Akeeba Engine configuration
		try
		{
			$this->loadAkeebaEngineConfiguration();
		}
		catch (\Exception $e)
		{
			// Maybe the tables are not installed?
			/** @var ControlPanel $cPanelModel */
			$cPanelModel = $this->container->factory->model('ControlPanel')->tmpInstance();

			try
			{
				$cPanelModel->checkAndFixDatabase();
			}
			catch (\RuntimeException $e)
			{
				// The update is stuck. We will display a warning in the Control Panel
			}

			$msg = Text::_('COM_AKEEBA_CONTROLPANEL_MSG_REBUILTTABLES');
			$this->container->platform->redirect('index.php', 307, $msg, 'warning');
		}

		// Prevents the "SQLSTATE[HY000]: General error: 2014" due to resource sharing with Akeeba Engine
		$this->fixPDOMySQLResourceSharing();

		// Load the utils helper library
		Platform::getInstance()->load_version_defines();
		Platform::getInstance()->apply_quirk_definitions();

		// Make sure the front-end backup Secret Word is stored encrypted
		$params = $this->container->params;
		SecretWord::enforceEncryption($params, 'frontend_secret_word');

		// Make sure we have a version loaded
		@include_once($this->container->backEndPath . '/version.php');

		if (!defined('AKEEBA_VERSION'))
		{
			define('AKEEBA_VERSION', 'dev');
			define('AKEEBA_DATE', date('Y-m-d'));
		}

		// Create a media file versioning tag
		$this->container->mediaVersion = md5(AKEEBA_VERSION . AKEEBA_DATE);

		// Perform certain functionality only in HTML tasks
		$format = $this->input->getCmd('format', 'html');

		if ($format == 'html')
		{
			// Load common Javascript files. NOTE: CSS and anything style-related is loaded by the FEF Renderer class.
			$this->loadCommonJavascript();

			// Perform common maintenance tasks
			$this->autoMaintenance();
		}

		// Set the linkbar style to Classic (Bootstrap tabs). The sidebar takes too much space and requires adding
		// manual HTML to render it...
		$this->container->renderer->setOption('linkbar_style', 'classic');
	}

	public function loadAkeebaEngine()
	{
		// Necessary defines for Akeeba Engine
		if (!defined('AKEEBAENGINE'))
		{
			define('AKEEBAENGINE', 1);
			define('AKEEBAROOT', $this->container->backEndPath . '/BackupEngine');
		}

		// Make sure we have a profile set throughout the component's lifetime
		$profile_id = $this->container->platform->getSessionVar('profile', null, 'akeeba');

		if (is_null($profile_id))
		{
			$this->container->platform->setSessionVar('profile', 1, 'akeeba');
		}

		// Load Akeeba Engine
		$basePath = $this->container->backEndPath;
		require_once $basePath . '/BackupEngine/Factory.php';
	}

	public function loadAkeebaEngineConfiguration()
	{
		Platform::addPlatform('joomla3x', $this->container->backEndPath . '/BackupPlatform/Joomla3x');
		$akeebaEngineConfig = Factory::getConfiguration();
		Platform::getInstance()->load_configuration();
		unset($akeebaEngineConfig);
	}

	/**
	 * Prevents the "SQLSTATE[HY000]: General error: 2014" due to resource sharing with Akeeba Engine.
	 *
	 * @since 7.5.2
	 */
	protected function fixPDOMySQLResourceSharing(): void
	{
		// This fix only applies to PHP 7.x, not 8.x
		if (version_compare(PHP_VERSION, '8.0', 'ge'))
		{
			return;
		}

		// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
		// !!!!! WARNING: ALWAYS GO THROUGH JFactory; DO NOT GO THROUGH $this->container->db !!!!!
		// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
		$jDbo     = JFactory::getDbo();
		$dbDriver = method_exists($jDbo, 'getName') ? ($jDbo->getName() ?? $jDbo->name ?? 'mysql') : 'mysql';

		if ($dbDriver !== 'pdomysql')
		{
			return;
		}

		/**
		 * If this Joomla 3 with Site Debug enabled I need to disable database debug. If it's enabled, Joomla sends
		 * `SET query_cache_type = 0`. However, the query_cache_type MySQL server variable has been deprecated in MySQL
		 * 5.7 abd removed in MySQL 8. The PDO driver receives the error from the MySQL database and turns it into an
		 * untrappable Fatal Error, meaning that a try/catch won't be able to catch it. Since the connection code that
		 * triggers the fatal error will be called AT THE LATEST when the request terminates and at the earliest within
		 * the Dispatcher's loading of common JavaScript (which goes through the Joomla API) this causes the Akeeba
		 * Backup component to not load. Because of the weird way PDO error handling works we don't even get a Fatal
		 * Error which would at least clue us in as to what the heck is going on! Instead we have the main Dispatcher's
		 * dispatch() method handle the fatal error exception (LOLWUT?! WHY ONLY THERE?! WHAT THE HELL PHP?!) being
		 * thrown by the PDO driver, converting the result of onBeforeDispatch to false which is interpreted as the user
		 * not having access to the component, which is the error that gets reported.
		 *
		 * Talking about running into edge cases, am I right?!
		 */
		$isJoomla3         = version_compare(JVERSION, '3.999.999', 'le');
		$isSiteDebug       = (bool) JFactory::getApplication()->get('debug', 0);
		$isMySQL8OrGreated = version_compare($jDbo->getVersion() ?? '8.0', '8', 'ge');

		if ($isJoomla3 && $isSiteDebug && $isMySQL8OrGreated)
		{
			if (!method_exists($jDbo, 'setDebug'))
			{
				return;
			}

			$jDbo->setDebug(false);
		}

		@JFactory::getDbo()->disconnect();
	}

	/**
	 * Loads the Javascript files which are common across many views of the component.
	 *
	 * @return  void
	 */
	private function loadCommonJavascript()
	{
		// Do not move: everything depends on UserInterfaceCommon
		$this->container->template->addJS('media://com_akeeba/js/UserInterfaceCommon.min.js', true, false, $this->container->mediaVersion);
	}

	/**
	 * Perform common maintenance tasks
	 *
	 * @return  void
	 */
	private function autoMaintenance()
	{
		/** @var \Akeeba\Backup\Admin\Model\ControlPanel $model */
		$model = $this->container->factory->model('ControlPanel')->tmpInstance();

		// Update the db structure if necessary (once per session at most)
		$lastVersion = $this->container->platform->getSessionVar('magicParamsUpdateVersion', null, 'akeeba');

		if ($lastVersion != AKEEBA_VERSION)
		{
			try
			{
				$model->checkAndFixDatabase();
				$this->container->platform->setSessionVar('magicParamsUpdateVersion', AKEEBA_VERSION, 'akeeba');
			}
			catch (\RuntimeException $e)
			{
				// The update is stuck. We will display a warning in the Control Panel
			}
		}

		// Update magic parameters if necessary
		$model->updateMagicParameters();
	}
}
components/com_akeeba/Dispatcher/web.config000060400000001025152453623440015033 0ustar00<?xml version="1.0"?>
<!--
    This only works on IIS 7 or later. See https://www.iis.net/configreference/system.webserver/security/requestfiltering/fileextensions
-->
<configuration>
    <system.webServer>
        <security>
            <requestFiltering>
                <fileExtensions allowUnlisted="false" >
                    <clear />
                    <add fileExtension=".html" allowed="true"/>
                </fileExtensions>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>components/com_akeeba/version.php000060400000000527152453623440013205 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') or die();

define('AKEEBA_PRO', '0');
define('AKEEBA_VERSION', '8.4.1');
define('AKEEBA_DATE', '2025-05-09');
components/com_akeeba/Controller/ConfigurationWizard.php000060400000002717152453623440017636 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Controller;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Controller\Mixin\CustomACL;
use Akeeba\Backup\Admin\Controller\Mixin\PredefinedTaskList;
use FOF40\Container\Container;
use FOF40\Controller\Controller;
use Joomla\CMS\Component\ComponentHelper;

/**
 * Controller for the configuration wizard
 */
class ConfigurationWizard extends Controller
{
	use CustomACL;
	use PredefinedTaskList;

	/** @var bool  */
	private $noFlush = false;

	public function __construct(Container $container, array $config)
	{
		parent::__construct($container, $config);

		$this->setPredefinedTaskList(['main', 'ajax']);

		$this->noFlush = ComponentHelper::getParams('com_akeeba')->get('no_flush', 0) == 1;
	}

	/**
	 * Handles AJAX request by proxying the call to the Model, which does all the work, and returning the JSON encoded
	 * result back to the browser.
	 */
	public function ajax()
	{
		/** @var \Akeeba\Backup\Admin\Model\ConfigurationWizard $model */
		$model = $this->getModel();
		$model->setState('act', $this->input->get('act', '', 'cmd'));
		$ret = $model->runAjax();

		@ob_end_clean();
		echo '###' . json_encode($ret) . '###';

		if (!$this->noFlush)
		{
			flush();
		}

		$this->container->platform->closeApplication();
	}

}
components/com_akeeba/Controller/.htaccess000060400000000246152453623440014726 0ustar00<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
  <RequireAll>
    Require all denied
  </RequireAll>
</IfModule>
components/com_akeeba/Controller/DatabaseFilters.php000060400000003607152453623440016702 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Controller;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Controller\Mixin\CustomACL;
use Akeeba\Backup\Admin\Controller\Mixin\PredefinedTaskList;
use FOF40\Container\Container;
use FOF40\Controller\Controller;

/**
 * Database Filters controller
 */
class DatabaseFilters extends Controller
{
	use CustomACL;
	use PredefinedTaskList;

	/** @var bool  */
	private $noFlush = false;

	/**
	 * Should I decode the "action" JSON data as an associative array? Default is false (meaning we're decoding as an
	 * stdClass object).
	 *
	 * @var bool
	 */
	protected $decodeJsonAsArray = false;

	public function __construct(Container $container, array $config)
	{
		parent::__construct($container, $config);

		$this->setPredefinedTaskList(['main', 'ajax']);
	}

	/**
	 * Handles the "main" task, which displays a folder and file list
	 *
	 */
	public function main()
	{
		$task = $this->input->get('task', 'normal', 'cmd');

		/** @var \Akeeba\Backup\Admin\Model\DatabaseFilters $model */
		$model = $this->getModel();
		$model->setState('browse_task', $task);

		$this->display(false);
	}

	/**
	 * AJAX proxy
	 */
	public function ajax()
	{
		// Parse the JSON data and reset the action query param to the resulting array
		$action_json = $this->input->get('action', '', 'none', 2);
		$action      = json_decode($action_json, $this->decodeJsonAsArray);

		/** @var \Akeeba\Backup\Admin\Model\DatabaseFilters $model */
		$model = $this->getModel();

		$model->setState('action', $action);

		$ret = $model->doAjax();

		@ob_end_clean();
		echo '###' . json_encode($ret) . '###';

		if (!$this->noFlush)
		{
			flush();
		}

		$this->container->platform->closeApplication();
	}
}
components/com_akeeba/Controller/ControlPanel.php000060400000021523152453623440016242 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Controller;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Controller\Mixin\CustomACL;
use Akeeba\Backup\Admin\Controller\Mixin\PredefinedTaskList;
use Akeeba\Backup\Admin\Helper\Utils;
use Akeeba\Backup\Admin\Model\Backup as BackupModel;
use Akeeba\Backup\Admin\Model\ConfigurationWizard;
use Akeeba\Backup\Admin\Model\Updates;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use Exception;
use FOF40\Container\Container;
use FOF40\Controller\Controller;
use FOF40\Factory\Exception\ModelNotFound;
use FOF40\Utils\ViewManifestMigration;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Uri\Uri;
use RuntimeException;

/**
 * The Control Panel controller class
 */
class ControlPanel extends Controller
{
	use CustomACL, PredefinedTaskList;

	public function __construct(Container $container, array $config = [])
	{
		parent::__construct($container, $config);

		$this->setPredefinedTaskList([
			'main', 'SwitchProfile', 'applydlid', 'resetSecretWord',
			'forceUpdateDb', 'dismissUpsell', 'fixOutputDirectory', 'checkOutputDirectory', 'addRandomToFilename',
		]);
	}

	public function SwitchProfile()
	{
		// CSRF prevention
		$this->csrfProtection();

		$newProfile = $this->input->get('profileid', -10, 'int');

		if (!is_numeric($newProfile) || ($newProfile <= 0))
		{
			$this->setRedirect(\Joomla\CMS\Uri\Uri::base() . 'index.php?option=com_akeeba', \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_PROFILE_SWITCH_ERROR'), 'error');

			return;
		}

		$this->container->platform->setSessionVar('profile', $newProfile, 'akeeba');
		$returnurl = $this->input->get('returnurl', '', 'base64');
		$url       = Utils::safeDecodeReturnUrl($returnurl);

		if (empty($url))
		{
			$url = \Joomla\CMS\Uri\Uri::base() . 'index.php?option=com_akeeba';
		}

		$this->setRedirect($url, \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_PROFILE_SWITCH_OK'));
	}

	/**
	 * Applies the Download ID when the user is prompted about it in the Control Panel
	 */
	public function applydlid()
	{
		// CSRF prevention
		$this->csrfProtection();

		$msg     = \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_ERR_INVALIDDOWNLOADID');
		$msgType = 'error';
		$dlid    = $this->input->getString('dlid', '');

		/** @var Updates $updateModel */
		$updateModel = $this->container->factory->model('Updates')->tmpInstance();
		$dlid        = $updateModel->sanitizeLicenseKey($dlid);
		$isValidDLID = $updateModel->isValidLicenseKey($dlid);

		// If the Download ID seems legit let's apply it
		if ($isValidDLID)
		{
			$msg     = null;
			$msgType = null;

			$updateModel->setLicenseKey($dlid);
		}

		// Redirect back to the control panel
		$returnurl = $this->input->get('returnurl', '', 'base64');
		$url       = Utils::safeDecodeReturnUrl($returnurl);

		if (empty($url))
		{
			$url = \Joomla\CMS\Uri\Uri::base() . 'index.php?option=com_akeeba';
		}

		$this->setRedirect($url, $msg, $msgType);
	}

	/**
	 * Reset the Secret Word for front-end and remote backup
	 *
	 * @return  void
	 */
	public function resetSecretWord()
	{
		// CSRF prevention
		$this->csrfProtection();

		$newSecret = $this->container->platform->getSessionVar('newSecretWord', null, 'akeeba.cpanel');

		if (empty($newSecret))
		{
			$random    = new \Akeeba\Engine\Util\RandomValue();
			$newSecret = $random->generateString(32);
			$this->container->platform->setSessionVar('newSecretWord', $newSecret, 'akeeba.cpanel');
		}

		$this->container->params->set('frontend_secret_word', $newSecret);
		$this->container->params->save();

		$this->container->platform->setSessionVar('newSecretWord', null, 'akeeba.cpanel');

		$msg = \Joomla\CMS\Language\Text::sprintf('COM_AKEEBA_CPANEL_MSG_FESECRETWORD_RESET', $newSecret);

		$url = 'index.php?option=com_akeeba';
		$this->setRedirect($url, $msg);
	}

	/**
	 * Resets the "updatedb" flag and forces the database updates
	 */
	public function forceUpdateDb()
	{
		// Reset the flag so the updates could take place
		$this->container->params->set('updatedb', null);
		$this->container->params->save();

		/** @var \Akeeba\Backup\Admin\Model\ControlPanel $model */
		$model = $this->getModel();

		try
		{
			$model->checkAndFixDatabase();
		}
		catch (\RuntimeException $e)
		{
			// This should never happen, since we reset the flag before execute the update, but you never know
		}

		$this->setRedirect('index.php?option=com_akeeba');
	}

	/**
	 * Dismisses the Core to Pro upsell for 15 days
	 *
	 * @return  void
	 */
	public function dismissUpsell()
	{
		// Reset the flag so the updates could take place
		$this->container->params->set('lastUpsellDismiss', time());
		$this->container->params->save();

		$this->setRedirect('index.php?option=com_akeeba');
	}

	/**
	 * Check the security of the backup output directory and return the results for consumption through AJAX
	 *
	 * @return  void
	 *
	 * @throws  Exception
	 *
	 * @since   7.0.3
	 */
	public function checkOutputDirectory()
	{
		/** @var \Akeeba\Backup\Admin\Model\ControlPanel $model */
		$model  = $this->getModel();
		$outDir = $model->getOutputDirectory();

		try
		{
			$result = $model->getOutputDirectoryWebAccessibleState($outDir);
		}
		catch (RuntimeException $e)
		{
			$result = [
				'readFile'   => false,
				'listFolder' => false,
				'isSystem'   => $model->isOutputDirectoryInSystemFolder(),
				'hasRandom'  => $model->backupFilenameHasRandom(),
			];
		}

		@ob_end_clean();

		echo '###' . json_encode($result) . '###';

		$this->container->platform->closeApplication();
	}

	/**
	 * Add security files to the output directory of the currently configured backup profile
	 *
	 * @return  void
	 *
	 * @throws  Exception
	 *
	 * @since   7.0.3
	 */
	public function fixOutputDirectory()
	{
		// CSRF prevention
		$this->csrfProtection();

		/** @var \Akeeba\Backup\Admin\Model\ControlPanel $model */
		$model  = $this->getModel();
		$outDir = $model->getOutputDirectory();

		$fsUtils = Factory::getFilesystemTools();
		$fsUtils->ensureNoAccess($outDir, true);

		$this->setRedirect('index.php?option=com_akeeba');
	}

	/**
	 * Adds the [RANDOM] variable to the backup output filename, save the configuration and reload the Control Panel.
	 *
	 * @return  void
	 *
	 * @throws  Exception
	 *
	 * @since   7.0.3
	 */
	public function addRandomToFilename()
	{
		// CSRF prevention
		$this->csrfProtection();
		$registry     = Factory::getConfiguration();
		$templateName = $registry->get('akeeba.basic.archive_name');

		if (strpos($templateName, '[RANDOM]') === false)
		{
			$templateName .= '-[RANDOM]';
			$registry->set('akeeba.basic.archive_name', $templateName);
			Platform::getInstance()->save_configuration();
		}

		$this->setRedirect('index.php?option=com_akeeba');
	}

	/**
	 * Run everything necessary to display the Control Panel page
	 *
	 * @return  void
	 *
	 * @throws  Exception
	 *
	 * @since   5.0.0
	 */
	protected function onBeforeMain()
	{
		/** @var \Akeeba\Backup\Admin\Model\ControlPanel $model */
		$model = $this->getModel();

		$engineConfig = Factory::getConfiguration();

		// Invalidate stale backups
		$params = $this->container->params;

		try
		{
			Factory::resetState([
				'global' => true,
				'log'    => false,
				'maxrun' => $params->get('failure_timeout', 180),
			]);
		}
		catch (Exception $e)
		{
			// This will die if the output directory is invalid. Let it die, then.
		}

		// Just in case the reset() loaded a stale configuration...
		Platform::getInstance()->load_configuration();
		Platform::getInstance()->apply_quirk_definitions();

		// Let's make sure the temporary and output directories are set correctly and writable...
		/** @var ConfigurationWizard $wizmodel */
		$wizmodel = $this->container->factory->model('ConfigurationWizard')->tmpInstance();
		$wizmodel->autofixDirectories();

		// Rebase Off-site Folder Inclusion filters to use site path variables
		/** @var \Akeeba\Backup\Admin\Model\IncludeFolders $incFoldersModel */
		try
		{
			$incFoldersModel = $this->container->factory->model('IncludeFolders')->tmpInstance();
			$incFoldersModel->rebaseFiltersToSiteDirs();
		}
		catch (ModelNotFound $e)
		{
			// Not a problem. This is expected to happen in the Core version.
		}

		// Check if we need to toggle the settings encryption feature
		$model->checkSettingsEncryption();

		// Convert existing log files to the new .log.php format
		/** @var BackupModel $backupModel */
		$backupModel = $this->container->factory->model('Backup')->tmpInstance();
		$backupModel->convertLogFiles();

		// Run the automatic update site refresh
		/** @var Updates $updateModel */
		$updateModel = $this->container->factory->model('Updates')->tmpInstance();
		$updateModel->refreshUpdateSite();

		ViewManifestMigration::migrateJoomla4MenuXMLFiles($this->container);
		ViewManifestMigration::removeJoomla3LegacyViews($this->container);
	}

}
components/com_akeeba/Controller/Profiles.php000060400000006223152453623440015425 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Controller;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Controller\Mixin\CustomACL;
use FOF40\Controller\DataController;
use Joomla\CMS\Language\Text;
use RuntimeException;

class Profiles extends DataController
{
	use CustomACL;

	/**
	 * Imports an exported profile .json file
	 */
	public function import()
	{
		$this->csrfProtection();

		if (!$this->container->platform->authorise('akeeba.configure', 'com_akeeba'))
		{
			throw new RuntimeException(\Joomla\CMS\Language\Text::_('JERROR_ALERTNOAUTHOR'), 403);
		}

		/** @var \Akeeba\Backup\Admin\Model\Profiles $model */
		$model       = $this->getModel();

		// Get some data from the request
		$file = $this->input->files->get('importfile', array(), 'array');

		if (!isset($file['name']))
		{
			$this->setRedirect('index.php?option=com_akeeba&view=Profiles', \Joomla\CMS\Language\Text::_('MSG_UPLOAD_INVALID_REQUEST'), 'error');

			return;
		}

		// Load the file data
		$data = @file_get_contents($file['tmp_name']);
		@unlink($file['tmp_name']);

		// JSON decode
		$data = json_decode($data, true);

		// Import
		$message     = \Joomla\CMS\Language\Text::_('COM_AKEEBA_PROFILES_MSG_IMPORT_COMPLETE');
		$messageType = null;

		try
		{
			$model->reset()->import($data);
		}
		catch (RuntimeException $e)
		{
			$message     = $e->getMessage();
			$messageType = 'error';
		}

		// Redirect back to the main page
		$this->setRedirect('index.php?option=com_akeeba&view=Profiles', $message, $messageType);
	}

	/**
	 * Enable the Quick Icon for a record
	 *
	 * @since   6.1.2
	 * @throws  \Exception
	 */
	public function quickicon_publish()
	{
		$this->setQuickIcon(1);
	}

	/**
	 * Disable the Quick Icon for a record
	 *
	 * @since   6.1.2
	 * @throws  \Exception
	 */
	public function quickicon_unpublish()
	{
		$this->setQuickIcon(0);
	}

	/**
	 * Sets the Quick Icon status for the record.
	 *
	 * @param   int|bool  $published  Should this profile have a Quick Icon?
	 *
	 * @return  void
	 * @throws  \Exception
	 *
	 * @since   6.1.2
	 */
	private function setQuickIcon($published)
	{
		// CSRF prevention
		$this->csrfProtection();

		/** @var \Akeeba\Backup\Admin\Model\Profiles $model */
		$model = $this->getModel()->savestate(false);
		$ids   = $this->getIDsFromRequest($model, false);
		$error = false;

		try
		{
			$status = true;

			foreach ($ids as $id)
			{
				$model->find($id);
				$model->save([
					'quickicon' => $published ? 1 : 0
				]);
			}
		}
		catch (\Exception $e)
		{
			$status = false;
			$error  = $e->getMessage();
		}

		// Redirect
		if ($customURL = $this->input->getBase64('returnurl', ''))
		{
			$customURL = base64_decode($customURL);
		}

		$url = !empty($customURL) ? $customURL : 'index.php?option=' . $this->container->componentName . '&view=' . $this->container->inflector->pluralize($this->view) . $this->getItemidURLSuffix();

		if (!$status)
		{
			$this->setRedirect($url, $error, 'error');
		}
		else
		{
			$this->setRedirect($url);
		}
	}
}
components/com_akeeba/Controller/Log.php000060400000006414152453623440014365 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Controller;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Controller\Mixin\CustomACL;
use Akeeba\Backup\Admin\Controller\Mixin\PredefinedTaskList;
use Akeeba\Backup\Admin\Model\Log as LogModel;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use FOF40\Controller\Controller;

class Log extends Controller
{
	use CustomACL {
		CustomACL::onBeforeExecute as onCustomACLBeforeExecute;
	}

	/** @var bool  */
	private $noFlush = false;

	protected function onBeforeExecute(&$task)
	{
		$this->onCustomACLBeforeExecute($task);

		$profile_id = $this->input->getInt('profileid', null);

		if (!empty($profile_id) && is_numeric($profile_id) && ($profile_id > 0))
		{
			$this->container->platform->setSessionVar('profile', $profile_id, 'akeeba');
		}
	}

	/**
	 * Display the log page
	 *
	 * @return  void
	 */
	public function onBeforeDefault()
	{
		$tag = $this->input->get('tag', null, 'cmd');
		$latest = $this->input->get('latest', false, 'int');

		if (empty($tag))
		{
			$tag = null;
		}

		/** @var LogModel $model */
		$model = $this->getModel();

		if ($latest)
		{
			$logFiles = $model->getLogFiles();
			$tag = array_shift($logFiles);
		}

		$model->setState('tag', $tag);

		Platform::getInstance()->load_configuration(Platform::getInstance()->get_active_profile());
	}

	/**
	 * Renders the contents of the log, used inside the IFRAME of the log page
	 *
	 * @return  void
	 */
	public function iframe()
	{
		$tag = $this->input->get('tag', null, 'cmd');

		if (empty($tag))
		{
			$tag = null;
		}

		/** @var LogModel $model */
		$model = $this->getModel();
		$model->setState('tag', $tag);

		Platform::getInstance()->load_configuration(Platform::getInstance()->get_active_profile());

		$this->display();
	}

	/**
	 * Download the log file as a text file
	 *
	 * @return  void
	 */
	public function download()
	{
		Platform::getInstance()->load_configuration(Platform::getInstance()->get_active_profile());

		$tag = $this->input->get('tag', null, 'cmd');

		if (empty($tag))
		{
			$tag = null;
		}

		$asAttachment = $this->input->getBool('attachment', true);

		@ob_end_clean(); // In case some braindead plugin spits its own HTML
		header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
		header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
		header("Content-Description: File Transfer");
		header('Content-Type: text/plain');

		if ($asAttachment)
		{
			header('Content-Disposition: attachment; filename="Akeeba Backup Debug Log.txt"');
		}

		/** @var LogModel $model */
		$model = $this->getModel();
		$model->setState('tag', $tag);
		$model->echoRawLog();

		if (!$this->noFlush)
		{
			flush();
		}

		$this->container->platform->closeApplication();
	}

	public function inlineRaw()
	{
		Platform::getInstance()->load_configuration(Platform::getInstance()->get_active_profile());

		$tag = $this->input->get('tag', null, 'cmd');

		if (empty($tag))
		{
			$tag = null;
		}

		/** @var LogModel $model */
		$model = $this->getModel();
		$model->setState('tag', $tag);
		echo "<pre>";
		$model->echoRawLog();
		echo "</pre>";
	}
}
components/com_akeeba/Controller/FTPBrowser.php000060400000002610152453623440015633 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Controller;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Controller\Mixin\CustomACL;
use FOF40\Controller\Controller;

/**
 * Controller for the FTP folder browser
 */
class FTPBrowser extends Controller
{
	use CustomACL;

	/** @var bool  */
	private $noFlush = false;

	protected function onBeforeMain()
	{
		/** @var \Akeeba\Backup\Admin\Model\FTPBrowser $model */
		$model = $this->getModel();

		// Grab the data and push them to the model
		$model->host      = $this->input->get('host', '', 'string');
		$model->port      = $this->input->get('port', 21, 'int');
		$model->passive   = $this->input->get('passive', 1, 'int');
		$model->ssl       = $this->input->get('ssl', 0, 'int');
		$model->username  = $this->input->get('username', '', 'none', 2);
		$model->password  = $this->input->get('password', '', 'none', 2);
		$model->directory = $this->input->get('directory', '', 'none', 2);

		if (empty($model->port))
		{
			$model->port = $model->ssl ? 990 : 21;
		}

		$ret = $model->doBrowse();

		@ob_end_clean();
		echo '###' . json_encode($ret) . '###';

		if (!$this->noFlush)
		{
			flush();
		}

		$this->container->platform->closeApplication();
	}
}
components/com_akeeba/Controller/Mixin/CustomACL.php000060400000003760152453623440016523 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Controller\Mixin;

// Protect from unauthorized access
defined('_JEXEC') || die();

use RuntimeException;
use Joomla\CMS\Language\Text;

trait CustomACL
{
	protected function onBeforeExecute(&$task)
	{
		$this->akeebaBackupACLCheck($this->view, $this->task);
	}

	/**
	 * Checks if the currently logged in user has the required ACL privileges to access the current view. If not, a
	 * RuntimeException is thrown.
	 *
	 * @return  void
	 */
	protected function akeebaBackupACLCheck($view, $task)
	{
		// Akeeba Backup-specific ACL checks. All views not listed here are limited by the akeeba.configure privilege.
		$viewACLMap = [
			'ControlPanel'       => 'core.manage',
			'Backup'             => 'akeeba.backup',
			'Manage'             => 'core.manage',
			'Manage.download'    => 'akeeba.download',
			'Manage.remove'      => 'akeeba.download',
			'Manage.deletefiles' => 'akeeba.download',
			'Manage.showcomment' => 'akeeba.backup',
			'Manage.save'        => 'akeeba.download',
			'Manage.restore'     => 'akeeba.configure',
			'Manage.cancel'      => 'akeeba.backup',
			'Upload'             => 'akeeba.backup',
			'RemoteFiles'        => 'akeeba.download',
			'Transfer'           => 'akeeba.download',
		];

		// Default
		$privilege = 'akeeba.configure';

		// Just the view was found
		if (array_key_exists($view, $viewACLMap))
		{
			$privilege = $viewACLMap[$view];
		}

		// The view AND task was found
		if (array_key_exists($view . '.' . $task, $viewACLMap))
		{
			$privilege = $viewACLMap[$view . '.' . $task];
		}

		// If an empty privilege is defined do not perform any ACL checks
		if (empty($privilege))
		{
			return;
		}

		if (!$this->container->platform->authorise($privilege, 'com_akeeba'))
		{
			throw new RuntimeException(\Joomla\CMS\Language\Text::_('JERROR_ALERTNOAUTHOR'), 403);
		}
	}
}
components/com_akeeba/Controller/Mixin/PredefinedTaskList.php000060400000003215152453623440020450 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Controller\Mixin;

// Protect from unauthorized access
defined('_JEXEC') || die();

/**
 * Force a Controller to allow access to specific tasks only, no matter which tasks are already defined in this
 * Controller.
 */
trait PredefinedTaskList
{
	/**
	 * A list of predefined tasks. Trying to access any other task will result in the first task of this list being
	 * executed instead.
	 *
	 * @var array
	 */
	protected $predefinedTaskList = array();

	/**
	 * Overrides the execute method to implement the predefined task list feature
	 *
	 * @param   string  $task  The task to execute
	 *
	 * @return  mixed  The controller task result
	 */
	public function execute($task)
	{
		if (!in_array($task, $this->predefinedTaskList))
		{
			$task = reset($this->predefinedTaskList);
		}

		return parent::execute($task);
	}

	/**
	 * Sets the predefined task list and registers the first task in the list as the Controller's default task
	 *
	 * @param   array  $taskList  The task list to register
	 */
	public function setPredefinedTaskList(array $taskList)
	{
		// First, unregister all known tasks which are not in the taskList
		$allTasks = $this->getTasks();

		foreach ($allTasks as $task)
		{
			if (in_array($task, $taskList))
			{
				continue;
			}

			$this->unregisterTask($task);
		}

		// Set the predefined task list
		$this->predefinedTaskList = $taskList;

		// Set the default task
		$this->registerDefaultTask(reset($this->predefinedTaskList));

	}
}
components/com_akeeba/Controller/Backup.php000060400000014066152453623440015053 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Controller;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Controller\Mixin\CustomACL;
use Akeeba\Backup\Admin\Controller\Mixin\PredefinedTaskList;
use Akeeba\Backup\Admin\Helper\Utils;
use Akeeba\Engine\Platform;
use FOF40\Container\Container;
use FOF40\Controller\Controller;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;

/**
 * Backup page controller
 */
class Backup extends Controller
{
	use CustomACL;
	use PredefinedTaskList;

	/** @var bool  */
	private $noFlush = false;

	public function __construct(Container $container, array $config)
	{
		parent::__construct($container, $config);

		$this->setPredefinedTaskList([
			'main',
			'ajax',
		]);

		$this->noFlush = ComponentHelper::getParams('com_akeeba')->get('no_flush', 0) == 1;
	}

	/**
	 * This task handles the AJAX requests
	 */
	public function ajax()
	{
		/** @var \Akeeba\Backup\Admin\Model\Backup $model */
		$model = $this->getModel();

		// Push all necessary information to the model's state
		$model->setState('profile', $this->input->get('profileid', Platform::getInstance()->get_active_profile(), 'int'));
		$model->setState('ajax', $this->input->get('ajax', '', 'cmd'));
		$model->setState('description', $this->input->get('description', '', 'string'));
		$model->setState('comment', $this->input->get('comment', '', 'html', 2));
		$model->setState('jpskey', $this->input->get('jpskey', '', 'raw', 2));
		$model->setState('angiekey', $this->input->get('angiekey', '', 'raw', 2));
		$model->setState('backupid', $this->input->get('backupid', null, 'cmd'));
		$model->setState('tag', $this->input->get('tag', 'backend', 'cmd'));
		$model->setState('errorMessage', $this->input->getString('errorMessage', ''));

		// System Restore Point backup state variables (obsolete)
		$model->setState('type', strtolower($this->input->get('type', '', 'cmd')));
		$model->setState('name', strtolower($this->input->get('name', '', 'cmd')));
		$model->setState('group', strtolower($this->input->get('group', '', 'cmd')));
		$model->setState('customdirs', $this->input->get('customdirs', [], 'array', 2));
		$model->setState('customfiles', $this->input->get('customfiles', [], 'array', 2));
		$model->setState('extraprefixes', $this->input->get('extraprefixes', [], 'array', 2));
		$model->setState('customtables', $this->input->get('customtables', [], 'array', 2));
		$model->setState('skiptables', $this->input->get('skiptables', [], 'array', 2));
		$model->setState('langfiles', $this->input->get('langfiles', [], 'array', 2));
		$model->setState('xmlname', $this->input->getString('xmlname', ''));

		// Set up the tag
		define('AKEEBA_BACKUP_ORIGIN', $this->input->get('tag', 'backend', 'cmd'));

		// Run the backup step
		$ret_array = $model->runBackup();

		// We use this nasty trick to avoid broken 3PD plugins from barfing all over our output
		@ob_end_clean();
		header('Content-type: text/plain');
		header('Connection: close');
		echo '###' . json_encode($ret_array) . '###';

		if (!$this->noFlush)
		{
			flush();
		}

		$this->container->platform->closeApplication();
	}

	/**
	 * Default task; shows the initial page where the user selects a profile and enters description and comment
	 */
	protected function onBeforeMain()
	{
		// Did the user ask to switch the active profile?
		$newProfile = $this->input->get('profileid', -10, 'int');
		$autostart  = $this->input->get('autostart', 0, 'int');

		if (is_numeric($newProfile) && ($newProfile > 0))
		{
			/**
			 * We have to remove CSRF protection due to the way the Joomla administrator menu manager works. Menu item
			 * options are passed as URL parameters. However, we cannot pass dynamic parameters (like the token). This
			 * means that a user can create a menu item with a specific backup profile ID. Normally this would cause a
			 * 403 which is frustrating to the user because they might want to give their client the option to run a
			 * backup with a specific profile AND let them enter a description and comment. Therefore we have to remove
			 * the CSRF protection.
			 *
			 * NB! We do understand the potential risk involved. Between Joomla's AMATEURISH implementation of custom
			 * administrator menus and user demands for features we have to (have these very vocal users and everyone
			 * else) assume that (actually really small) risk.
			 */
			// $this->csrfProtection();
			$this->container->platform->setSessionVar('profile', $newProfile, 'akeeba');

			/**
			 * DO NOT REMOVE!
			 *
			 * The Model will only try to load the configuration after nuking the factory. This causes Profile 1 to be
			 * loaded first. Then it figures out it needs to load a different profile and it does – but the protected keys
			 * are NOT replaced, meaning that certain configuration parameters are not replaced. Most notably, the chain.
			 * This causes backups to behave weirdly. So, DON'T REMOVE THIS UNLESS WE REFACTOR THE MODEL.
			 */
			Platform::getInstance()->load_configuration($newProfile);
		}

		// Deactivate the menus
		Factory::getApplication()->input->set('hidemainmenu', 1);

		/** @var \Akeeba\Backup\Admin\Model\Backup $model */
		$model = $this->getModel();

		// Sanitize the return URL
		$returnUrl = $this->input->get('returnurl', '', 'raw');
		$returnUrl = Utils::safeDecodeReturnUrl($returnUrl);

		// Push data to the model
		$model->setState('profile', $this->input->get('profileid', -10, 'int'));
		$model->setState('description', $this->input->get('description', '', 'string', 2));
		$model->setState('comment', $this->input->get('comment', '', 'html', 2));
		$model->setState('ajax', $this->input->get('ajax', '', 'cmd'));
		$model->setState('autostart', $autostart);
		$model->setState('jpskey', $this->input->get('jpskey', '', 'raw', 2));
		$model->setState('angiekey', $this->input->get('angiekey', '', 'raw', 2));
		$model->setState('returnurl', $returnUrl);
		$model->setState('backupid', $this->input->get('backupid', null, 'cmd'));
	}
}
components/com_akeeba/Controller/Profile.php000060400000000503152453623440015235 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Controller;

// Protect from unauthorized access
defined('_JEXEC') || die();

class Profile extends Profiles
{

}
components/com_akeeba/Controller/SFTPBrowser.php000060400000002604152453623440015761 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Controller;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Controller\Mixin\CustomACL;
use FOF40\Controller\Controller;

/**
 * Controller for the SFTP folder browser
 */
class SFTPBrowser extends Controller
{
	use CustomACL;

	/** @var bool  */
	private $noFlush = false;

	protected function onBeforeMain()
	{
		/** @var \Akeeba\Backup\Admin\Model\SFTPBrowser $model */
		$model = $this->getModel();

		// Grab the data and push them to the model
		$model->host      = $this->input->get('host', '', 'string');
		$model->port      = $this->input->get('port', 21, 'int');
		$model->username  = $this->input->get('username', '', 'none', 2);
		$model->password  = $this->input->get('password', '', 'none', 2);
		$model->privkey   = $this->input->get('privkey', '', 'none', 2);
		$model->pubkey    = $this->input->get('pubkey', '', 'none', 2);
		$model->directory = $this->input->get('directory', '', 'none', 2);

		if (empty($model->port))
		{
			$model->port = 22;
		}

		$ret = $model->doBrowse();

		@ob_end_clean();
		echo '###' . json_encode($ret) . '###';

		if (!$this->noFlush)
		{
			flush();
		}

		$this->container->platform->closeApplication();
	}
}
components/com_akeeba/Controller/Manage.php000060400000022651152453623440015035 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Controller;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Controller\Mixin\CustomACL;
use Akeeba\Backup\Admin\Model\Statistics;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use Exception;
use FOF40\Container\Container;
use FOF40\Controller\Controller;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Uri\Uri;


/**
 * Backup page controller
 */
class Manage extends Controller
{
	use CustomACL;

	/** @var bool  */
	private $noFlush = false;

	public function __construct(Container $container, array $config)
	{
		if (!is_array($config))
		{
			$config = [];
		}

		$config['modelName'] = 'Statistics';

		parent::__construct($container, $config);
	}

	/**
	 * Downloads the backup archive of the specified backup record
	 *
	 * @return  void
	 */
	public function download()
	{
		$ids = $this->getIDsFromRequest();
		$id  = count($ids) ? array_pop($ids) : -1;

		$part = $this->input->get('part', -1, 'int');

		if ($id <= 0)
		{
			$this->setRedirect(Uri::base() . 'index.php?option=com_akeeba&view=Manage', Text::_('COM_AKEEBA_BUADMIN_ERROR_INVALIDID'), 'error');

			return;
		}

		$stat         = Platform::getInstance()->get_statistics($id);
		$allFilenames = Factory::getStatistics()->get_all_filenames($stat);

		$filename = null;

		// Check single part files
		$countAllFilenames = $allFilenames === null ? 0 : count($allFilenames);
		if (($countAllFilenames == 1) && ($part == -1))
		{
			$filename = array_shift($allFilenames);
		}
		elseif (($countAllFilenames > 0) && ($countAllFilenames > $part) && ($part >= 0))
		{
			$filename = $allFilenames[ $part ];
		}

		if (is_null($filename) || empty($filename) || !@file_exists($filename))
		{
			$this->setRedirect(Uri::base() . 'index.php?option=com_akeeba&view=Manage', Text::_('COM_AKEEBA_BUADMIN_ERROR_INVALIDDOWNLOAD'), 'error');

			return;
		}

		// Remove php's time limit
		if (function_exists('ini_get') && function_exists('set_time_limit'))
		{
			if (!ini_get('safe_mode'))
			{
				@set_time_limit(0);
			}
		}

		$basename  = @basename($filename);
		$filesize  = @filesize($filename);
		$extension = strtolower(str_replace(".", "", strrchr($filename, ".")));

		while (@ob_end_clean())
		{
			;
		}
		@clearstatcache();
		// Send MIME headers
		header('MIME-Version: 1.0');
		header('Content-Disposition: attachment; filename="' . $basename . '"');
		header('Content-Transfer-Encoding: binary');
		header('Accept-Ranges: bytes');

		switch ($extension)
		{
			case 'zip':
				// ZIP MIME type
				header('Content-Type: application/zip');
				break;

			default:
				// Generic binary data MIME type
				header('Content-Type: application/octet-stream');
				break;
		}

		// Notify of filesize, if this info is available
		if ($filesize > 0)
		{
			header('Content-Length: ' . @filesize($filename));
		}

		// Disable caching
		header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
		header("Expires: 0");
		header('Pragma: no-cache');

		if (!$this->noFlush)
		{
			flush();
		}

		if (!$filesize)
		{
			// If the filesize is not reported, hope that readfile works
			@readfile($filename);

			$this->container->platform->closeApplication(0);
		}

		// If the filesize is reported, use 1M chunks for echoing the data to the browser
		$blocksize = 1048576; //1M chunks
		$handle    = @fopen($filename, "r");

		// Now we need to loop through the file and echo out chunks of file data
		if ($handle !== false)
		{
			while (!@feof($handle))
			{
				echo @fread($handle, $blocksize);
				@ob_flush();

				if (!$this->noFlush)
				{
					flush();
				}
			}
		}

		if ($handle !== false)
		{
			@fclose($handle);
		}

		$this->container->platform->closeApplication(0);
	}

	/**
	 * Deletes one or more backup statistics records and their associated backup files
	 */
	public function remove()
	{
		// CSRF prevention
		$this->csrfProtection();

		$ids = $this->getIDsFromRequest();

		if (empty($ids))
		{
			$this->setRedirect(Uri::base() . 'index.php?option=com_akeeba&view=Manage', Text::_('COM_AKEEBA_BUADMIN_ERROR_INVALIDID'), 'error');

			return;
		}

		foreach ($ids as $id)
		{
			try
			{
				$msg    = Text::_('COM_AKEEBA_BUADMIN_ERROR_INVALIDID');
				$result = false;

				if ($id > 0)
				{
					/** @var Statistics $model */
					$model = $this->getModel();
					$model->setState('id', $id);
					$result = $model->delete();
				}

			}
			catch (\RuntimeException $e)
			{
				$result = false;
				$msg    = $e->getMessage();
			}

			if (!$result)
			{
				$this->setRedirect(Uri::base() . 'index.php?option=com_akeeba&view=Manage', $msg, 'error');

				return;
			}
		}

		$this->setRedirect(Uri::base() . 'index.php?option=com_akeeba&view=Manage', Text::_('COM_AKEEBA_BUADMIN_MSG_DELETED'));
	}

	/**
	 * Deletes backup files associated to one or several backup statistics records
	 */
	public function deletefiles()
	{
		// CSRF prevention
		$this->csrfProtection();

		$ids = $this->getIDsFromRequest();

		if (empty($ids))
		{
			$this->setRedirect(Uri::base() . 'index.php?option=com_akeeba&view=Manage', Text::_('COM_AKEEBA_BUADMIN_ERROR_INVALIDID'), 'error');

			return;
		}

		foreach ($ids as $id)
		{
			try
			{
				$msg    = Text::_('COM_AKEEBA_BUADMIN_ERROR_INVALIDID');
				$result = false;

				if ($id > 0)
				{
					/** @var Statistics $model */
					$model = $this->getModel();
					$model->setState('id', $id);
					$result = $model->deleteFile();
				}
			}
			catch (\RuntimeException $e)
			{
				$result = false;
				$msg    = $e->getMessage();
			}

			if (!$result)
			{
				$this->setRedirect(Uri::base() . 'index.php?option=com_akeeba&view=Manage', $msg, 'error');

				return;
			}
		}

		$this->setRedirect(Uri::base() . 'index.php?option=com_akeeba&view=Manage', Text::_('COM_AKEEBA_BUADMIN_MSG_DELETEDFILE'));
	}

	public function showcomment()
	{
		$ids = $this->getIDsFromRequest();

		if (empty($ids))
		{
			$ids = [0];
		}

		$id = array_pop($ids);

		if ($id <= 0)
		{
			$this->setRedirect(Uri::base() . 'index.php?option=com_akeeba&view=Manage', Text::_('COM_AKEEBA_BUADMIN_ERROR_INVALIDID'), 'error');
		}

		/** @var Statistics $model */
		$model = $this->getModel();
		$model->setState('id', $id);

		$this->layout = 'comment';
		$this->display(false);
	}

	/**
	 * Save the comments back to a backup record
	 */
	public function save()
	{
		// CSRF prevention
		$this->csrfProtection();

		$id          = $this->input->get('id', 0, 'int');
		$description = $this->input->get('description', '', 'string');
		$comment     = $this->input->get('comment', null, 'string', 4);

		$statistic                = Platform::getInstance()->get_statistics($id);
		$statistic['description'] = $description;
		$statistic['comment']     = $comment;

		$result = Platform::getInstance()->set_or_update_statistics($id, $statistic);

		$message = Text::_('COM_AKEEBA_BUADMIN_LOG_SAVEDOK');
		$type    = 'message';

		if ($result === false)
		{
			$message = Text::_('COM_AKEEBA_BUADMIN_LOG_SAVEERROR');
			$type    = 'error';
		}

		$this->setRedirect(Uri::base() . 'index.php?option=com_akeeba&view=Manage', $message, $type);
	}

	public function restore()
	{
		// CSRF prevention
		$this->csrfProtection();

		$ids = $this->getIDsFromRequest();

		if (empty($ids))
		{
			$ids = [0];
		}

		$id = array_pop($ids);

		$url = Uri::base() . 'index.php?option=com_akeeba&view=Restore&id=' . $id;
		$this->setRedirect($url);
	}

	public function cancel()
	{
		// CSRF prevention
		$this->csrfProtection();

		$this->setRedirect(Uri::base() . 'index.php?option=com_akeeba&view=Manage');
	}

	public function hidemodal()
	{
		/** @var Statistics $model */
		$model = $this->getModel();
		$model->hideRestorationInstructionsModal();

		$this->setRedirect(Uri::base() . 'index.php?option=com_akeeba&view=Manage');
	}

	/**
	 * Freeze select records
	 *
	 * @throws Exception
	 */
	public function freeze()
	{
		$this->csrfProtection();

		$ids   = $this->getIDsFromRequest();

		/** @var Statistics $model */
		$model = $this->getModel();

		$message = Text::_('COM_AKEEBA_BUADMIN_FREEZE_OK');
		$type    = 'message';

		try
		{
			$model->freezeUnfreezeRecords($ids, 1);
		}
		catch (Exception $e)
		{
			$message = Text::sprintf('COM_AKEEBA_BUADMIN_FREEZE_ERROR', $e->getMessage());
			$type    = 'error';
		}

		$this->setRedirect(Uri::base() . 'index.php?option=com_akeeba&view=Manage', $message, $type);
	}

	/**
	 * Unfreeze select records
	 *
	 * @throws Exception
	 */
	public function unfreeze()
	{
		$this->csrfProtection();

		$ids   = $this->getIDsFromRequest();

		/** @var Statistics $model */
		$model = $this->getModel();

		$message = Text::_('COM_AKEEBA_BUADMIN_UNFREEZE_OK');
		$type    = 'message';

		try
		{
			$model->freezeUnfreezeRecords($ids, 0);
		}
		catch (Exception $e)
		{
			$message = Text::sprintf('COM_AKEEBA_BUADMIN_UNFREEZE_ERROR', $e->getMessage());
			$type    = 'error';
		}

		$this->setRedirect(Uri::base() . 'index.php?option=com_akeeba&view=Manage', $message, $type);
	}

	/**
	 * Gets the list of IDs from the request data
	 *
	 * @return array
	 */
	protected function getIDsFromRequest()
	{
		// Get the ID or list of IDs from the request or the configuration
		$cid = $this->input->get('cid', array(), 'array');
		$id  = $this->input->getInt('id', 0);

		$ids = array();

		if (is_array($cid) && !empty($cid))
		{
			$ids = $cid;
		}
		elseif (!empty($id))
		{
			$ids = array($id);
		}

		return $ids;
	}
}
components/com_akeeba/Controller/web.config000060400000001025152453623440015070 0ustar00<?xml version="1.0"?>
<!--
    This only works on IIS 7 or later. See https://www.iis.net/configreference/system.webserver/security/requestfiltering/fileextensions
-->
<configuration>
    <system.webServer>
        <security>
            <requestFiltering>
                <fileExtensions allowUnlisted="false" >
                    <clear />
                    <add fileExtension=".html" allowed="true"/>
                </fileExtensions>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>components/com_akeeba/Controller/Configuration.php000060400000021157152453623440016454 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Controller;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Controller\Mixin\CustomACL;
use Akeeba\Backup\Admin\Model\Profiles;
use Akeeba\Engine\Platform;
use FOF40\Container\Container;
use FOF40\Controller\Controller;
use FOF40\Input\Input;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Uri\Uri;

/**
 * Configuration page controller
 */
class Configuration extends Controller
{
	use CustomACL;

	/** @var bool  */
	private $noFlush = false;

	public function __construct(Container $container, array $config = [])
	{
		parent::__construct($container, $config);

		$this->noFlush = ComponentHelper::getParams('com_akeeba')->get('no_flush', 0) == 1;
	}


	/**
	 * Handle the apply task which saves the configuration settings and shows the page again
	 */
	public function apply()
	{
		// CSRF prevention
		$this->csrfProtection();

		// Which input am I going to use?
		$jsonFormData = $this->input->getString('jsonForm', null);
		$jsonFormData = is_string($jsonFormData) ? @json_decode($jsonFormData, true) : $jsonFormData;

		if (empty($jsonFormData))
		{
			$input = $this->input;
		}
		else
		{
			$rawData = [];

			foreach ($jsonFormData as $k => $v)
			{
				if (substr($k, 0, 4) !== 'var[')
				{
					$rawData[$k] = $v;

					continue;
				}

				$k                  = substr($k, 4, -1);
				$rawData['var']     = $rawData['var'] ?? [];
				$rawData['var'][$k] = $v;
			}

			$input = new Input($rawData);
		}

		// Get the var array from the request
		$data                        = $input->get('var', [], 'array', 4);
		$data['akeeba.flag.confwiz'] = 1;

		/** @var \Akeeba\Backup\Admin\Model\Configuration $model */
		$model = $this->getModel();
		$model->setState('engineconfig', $data);
		$model->saveEngineConfig();

		// Finally, save the profile description if it has changed
		$profileid = Platform::getInstance()->get_active_profile();

		// Get profile name
		/** @var Profiles $profileRecord */
		$profileRecord = $this->container->factory->model('Profiles')->tmpInstance();
		$profileRecord->findOrFail($profileid);
		$oldProfileName = $profileRecord->description;
		$oldQuickIcon   = $profileRecord->quickicon;

		$profileName = $input->getString('profilename', null);
		$profileName = trim($profileName);

		$quickIconValue = $input->getCmd('quickicon', '');
		$quickIcon      = (int) !empty($quickIconValue);

		$mustSaveProfile = !empty($profileName) && ($profileName != $oldProfileName);
		$mustSaveProfile = $mustSaveProfile || ($quickIcon != $oldQuickIcon);

		if ($mustSaveProfile)
		{
			$profileRecord->save([
				'description' => $profileName,
				'quickicon'   => $quickIcon
			]);
		}

		$this->setRedirect(\Joomla\CMS\Uri\Uri::base() . 'index.php?option=com_akeeba&view=Configuration', \Joomla\CMS\Language\Text::_('COM_AKEEBA_CONFIG_SAVE_OK'));
	}

	/**
	 * Handle the save task which saves the configuration settings and returns to the Control Panel page
	 */
	public function save()
	{
		$this->apply();
		$this->setRedirect(\Joomla\CMS\Uri\Uri::base() . 'index.php?option=com_akeeba', \Joomla\CMS\Language\Text::_('COM_AKEEBA_CONFIG_SAVE_OK'));
	}

	/**
	 * Handle the save & new task which saves settings, creates a new backup profile, activates it and proceed to the
	 * configuration page once more.
	 */
	public function savenew()
	{
		// Save the current profile
		$this->apply();

		// Create a new profile
		$profileid = Platform::getInstance()->get_active_profile();

		/** @var Profiles $profile */
		$profile = $this->container->factory->model('Profiles')->tmpInstance();
		$profile
			// Load and clone the record we just saved
			->findOrFail($profileid)
			->getClone()
		;
		// Must unset ID before save. The ID cannot be bound with bind()/save(), hence the need to do it the hard way.
		$profile->id = null;
		$profile
			->save([
				'description' => \Joomla\CMS\Language\Text::_('COM_AKEEBA_CONFIG_SAVENEW_DEFAULT_PROFILE_NAME')
			])
		;

		// Activate and edit the new profile
		$returnUrl = base64_encode($this->redirect);
		$token     = $this->container->platform->getToken(true);
		$url       = \Joomla\CMS\Uri\Uri::base() . 'index.php?option=com_akeeba&task=SwitchProfile&profileid=' . $profile->getId() .
			'&returnurl=' . $returnUrl . '&' . $token . '=1';
		$this->setRedirect($url);
	}

	/**
	 * Handle the cancel task which doesn't save anything and returns to the Control Panel page
	 */
	public function cancel()
	{
		// CSRF prevention
		$this->csrfProtection();
		$this->setRedirect(\Joomla\CMS\Uri\Uri::base() . 'index.php?option=com_akeeba');
	}

	/**
	 * Tests the validity of the FTP connection details
	 */
	public function testftp()
	{
		/** @var \Akeeba\Backup\Admin\Model\Configuration $model */
		$model = $this->getModel();
		$input = $this->input;
		$model->setState('isCurl', $input->get('isCurl', 0, 'int'));
		$model->setState('host', $input->get('host', '', 'raw', 2));
		$model->setState('port', $input->get('port', 21, 'int'));
		$model->setState('user', $input->get('user', '', 'raw', 2));
		$model->setState('pass', $input->get('pass', '', 'raw', 2));
		$model->setState('initdir', $input->get('initdir', '', 'raw', 2));
		$model->setState('usessl', $input->getCmd('usessl', "false") == "true");
		$model->setState('passive', $input->getCmd('passive', "false") == "true");
		$model->setState('passive_mode_workaround', $input->getCmd('passive_mode_workaround', "false") == "true");

		try
		{
			$model->testFTP();
			$testResult = true;
		}
		catch (\RuntimeException $e)
		{
			$testResult = $e->getMessage();
		}

		@ob_end_clean();
		echo '###' . json_encode($testResult) . '###';

		if (!$this->noFlush)
		{
			flush();
		}

		$this->container->platform->closeApplication();
	}

	/**
	 * Tests the validity of the SFTP connection details
	 */
	public function testsftp()
	{
		/** @var \Akeeba\Backup\Admin\Model\Configuration $model */
		$model = $this->getModel();
		$model->setState('isCurl', $this->input->get('isCurl', 0, 'int'));
		$model->setState('host', $this->input->get('host', '', 'raw', 2));
		$model->setState('port', $this->input->get('port', 21, 'int'));
		$model->setState('user', $this->input->get('user', '', 'raw', 2));
		$model->setState('pass', $this->input->get('pass', '', 'raw', 2));
		$model->setState('privkey', $this->input->get('privkey', '', 'raw', 2));
		$model->setState('pubkey', $this->input->get('pubkey', '', 'raw', 2));
		$model->setState('initdir', $this->input->get('initdir', '', 'raw', 2));

		try
		{
			$model->testSFTP();
			$testResult = true;
		}
		catch (\RuntimeException $e)
		{
			$testResult = $e->getMessage();
		}

		@ob_end_clean();
		echo '###' . json_encode($testResult) . '###';

		if (!$this->noFlush)
		{
			flush();
		}

		$this->container->platform->closeApplication();
	}

	/**
	 * Opens an OAuth window for the selected data processing engine
	 */
	public function dpeoauthopen()
	{
		/** @var \Akeeba\Backup\Admin\Model\Configuration $model */
		$model = $this->getModel();
		$model->setState('engine', $this->input->get('engine', '', 'raw'));
		$model->setState('params', $this->input->get('params', array(), 'array', 2));

		@ob_end_clean();
		$model->dpeOuthOpen();

		if (!$this->noFlush)
		{
			flush();
		}

		$this->container->platform->closeApplication();
	}

	/**
	 * Runs a custom API call against the selected data processing engine and returns the JSON encoded result
	 */
	public function dpecustomapi()
	{
		/** @var \Akeeba\Backup\Admin\Model\Configuration $model */
		$model = $this->getModel();
		$model->setState('engine', $this->input->get('engine', '', 'raw', 2));
		$model->setState('method', $this->input->get('method', '', 'raw', 2));
		$model->setState('params', $this->input->get('params', array(), 'array', 2));

		@ob_end_clean();
		echo '###' . json_encode($model->dpeCustomAPICall()) . '###';

		if (!$this->noFlush)
		{
			flush();
		}

		$this->container->platform->closeApplication();
	}

	/**
	 * Runs a custom API call against the selected data processing engine and returns the raw result
	 */
	public function dpecustomapiraw()
	{
		/** @var \Akeeba\Backup\Admin\Model\Configuration $model */
		$model = $this->getModel();
		$model->setState('engine', $this->input->get('engine', '', 'raw', 2));
		$model->setState('method', $this->input->get('method', '', 'raw', 2));
		$model->setState('params', $this->input->get('params', array(), 'array', 2));

		@ob_end_clean();
		echo $model->dpeCustomAPICall();

		if (!$this->noFlush)
		{
			flush();
		}

		$this->container->platform->closeApplication();
	}
}
components/com_akeeba/Controller/Browser.php000060400000001442152453623440015263 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Controller;

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Controller\Mixin\CustomACL;
use FOF40\Controller\Controller;

class Browser extends Controller
{
	use CustomACL;

	protected function onBeforeDefault()
	{
		$folder        = $this->input->get('folder', '', 'string');
		$processfolder = $this->input->get('processfolder', 0, 'int');

		/** @var \Akeeba\Backup\Admin\Model\Browser $model */
		$model = $this->getModel();
		$model->setState('folder', $folder);
		$model->setState('processfolder', $processfolder);
		$model->makeListing();
	}
}
components/com_akeeba/Controller/FileFilters.php000060400000001603152453623440016047 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Backup\Admin\Controller;

// Protect from unauthorized access
use FOF40\Container\Container;

defined('_JEXEC') || die();

/**
 * File Filters controller
 */
class FileFilters extends DatabaseFilters
{
	/**
	 * Overridden FileFilters constructor. Sets the correct model and view names.
	 *
	 * @param   Container  $container  The component's container
	 * @param   array      $config     Optional configuration overrides
	 */
	public function __construct(Container $container, array $config)
	{
		if (!is_array($config))
		{
			$config = [];
		}

		$config = array_merge([
			'modelName'	=> 'FileFilters',
			'viewName'	=> 'FileFilters'
		], $config);

		parent::__construct($container, $config);
	}

}
components/com_akeeba/akeeba.php000060400000004754152453623440012736 0ustar00<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

defined('_JEXEC') || die();

JDEBUG ? (defined('AKEEBADEBUG') || define('AKEEBADEBUG', 1)) : null;

$minPHPVersion         = '7.2.0';
$recommendedPHPVersion = '7.4';
$softwareName          = 'Akeeba Backup';

if (version_compare(PHP_VERSION, '7.2.0', 'lt'))
{
	echo 'Akeeba Backup requires PHP 7.2 or later.';

	return;
}

// HHVM made sense in 2013, now PHP 7 is a way better solution than a hybrid PHP interpreter
if (defined('HHVM_VERSION'))
{
	(include_once __DIR__ . '/tmpl/CommonTemplates/hhvm.php') || die('We have detected that you are running HHVM instead of PHP. This software WILL NOT WORK properly on HHVM. Please switch to PHP 7 instead.');

	return;
}

// So, FEF is not installed?
if (!@file_exists(JPATH_SITE . '/media/fef/fef.php'))
{
	(include_once __DIR__ . '/tmpl/CommonTemplates/fef.php') || die('You need to have the Akeeba Frontend Framework (FEF) package installed on your site to display this component. Please visit https://www.akeeba.com/download/official/fef.html to download it and install it on your site.');

	return;
}

/**
 * The following code is a neat trick to help us collect the maximum amount of relevant information when a user
 * encounters an unexpected exception or a PHP fatal error. In both cases we capture the generated Throwable and
 * render an error page, making sure that the HTTP response code is set to an appropriate value (4xx or 5xx).
 */
try
{
	if (!defined('FOF40_INCLUDED') && !@include_once(JPATH_LIBRARIES . '/fof40/include.php'))
	{
		(include_once __DIR__ . '/tmpl/CommonTemplates/fof.php') || die('You need to have the Akeeba Framework-on-Framework (FOF) 4 package installed on your site to use this component. Please visit https://www.akeeba.com/download/fof3.html to download it and install it on your site.');

		return;
	}

	$caCertPath = class_exists('\\Composer\\CaBundle\\CaBundle')
		? \Composer\CaBundle\CaBundle::getBundledCaBundlePath()
		: JPATH_LIBRARIES . '/src/Http/Transport/cacert.pem';

	define('AKEEBA_CACERT_PEM', $caCertPath);

	FOF40\Container\Container::getInstance('com_akeeba')->dispatcher->dispatch();
}
catch (Throwable $e)
{
	$title = 'Akeeba Backup';
	$isPro = defined(AKEEBA_PRO) ? AKEEBA_PRO : file_exists(__DIR__ . '/tmpl/CommonTemplates/RegExDatabaseFilters/Html.php');

	if (!(include_once __DIR__ . '/tmpl/CommonTemplates/errorhandler.php'))
	{
		throw $e;
	}
}
components/com_akeeba/index.html000060400000000352152453623440013000 0ustar00<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->

<html><head><title></title></head><body></body></html>components/com_akeeba/BackupEngine/Platform.php000060400000020161152453623440015633 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Platform\Base;
use Akeeba\Engine\Platform\PlatformInterface;
use DirectoryIterator;
use Exception;

/**
 * Platform abstraction. Manages the loading of platform connector objects and delegates calls to itself the them.
 *
 * @property string $tableNameProfiles The name of the table where backup profiles are stored
 * @property string $tableNameStats    The name of the table where backup records are stored
 *
 * @since    3.4
 */
class Platform
{
	/** @var Base|null The currently loaded platform connector object instance */
	protected static $platformConnectorInstance = null;

	/** @var array A list of additional directories where platform classes can be found */
	protected static $knownPlatformsDirectories = [];

	/** @var Platform The currently loaded object instance of this class. WARNING: This is NOT the platform connector! */
	protected static $instance = null;

	/**
	 * Public class constructor
	 *
	 * @param   string  $platform  Optional; platform name. Leave blank to auto-detect.
	 *
	 * @throws  Exception  When the platform cannot be loaded
	 */
	public function __construct($platform = null)
	{
		if (empty($platform) || is_null($platform))
		{
			$platform = static::detectPlatform();
		}

		if (empty($platform))
		{
			throw new Exception('Can not find a suitable Akeeba Engine platform for your site');
		}

		static::$platformConnectorInstance = static::loadPlatform($platform);

		if (!is_object(static::$platformConnectorInstance))
		{
			throw new Exception("Can not load Akeeba Engine platform $platform");
		}
	}

	/**
	 * Implements the Singleton pattern for this class
	 *
	 * @staticvar Platform $instance The static object instance
	 *
	 * @param   string  $platform  Optional; platform name. Autodetect if blank.
	 *
	 * @return  PlatformInterface
	 */
	public static function &getInstance($platform = null)
	{
		if (!is_object(static::$instance))
		{
			static::$instance = new Platform($platform);
		}

		return static::$instance;
	}

	/**
	 * Get a list of all directories where platform classes can be found
	 *
	 * @return  array
	 */
	public static function getPlatformDirectories()
	{
		$defaultPath = [];

		if (is_object(static::$platformConnectorInstance))
		{
			$defaultPath[] = __DIR__ . '/Platform/' . static::$platformConnectorInstance->platformName;
		}

		return array_merge(
			static::$knownPlatformsDirectories,
			$defaultPath
		);
	}

	/**
	 * Lists available platforms
	 *
	 * @staticvar   array   $platforms   Static cache of the available platforms
	 *
	 * @return  array  The list of available platforms
	 */
	static public function listPlatforms()
	{
		if (empty(static::$knownPlatformsDirectories))
		{
			$di = new DirectoryIterator(__DIR__ . '/Platform');

			/** @var DirectoryIterator $file */
			foreach ($di as $file)
			{
				if (!$file->isDir())
				{
					continue;
				}

				if ($file->isDot())
				{
					continue;
				}

				if ($file->getExtension() !== 'php')
				{
					continue;
				}

				$shortName = $file->getFilename();
				$bareName  = basename($shortName, '.php');

				/**
				 * We never have dots in our filenames but some hosts will rename files similar to  foo.1.php when their
				 * broken security scanners detect a false positive. This is our defence against that.
				 */
				if (strpos($bareName, '.') !== false)
				{
					continue;
				}

				static::$knownPlatformsDirectories[$shortName] = $file->getRealPath();
			}
		}

		return static::$knownPlatformsDirectories;
	}

	/**
	 * Add a platform to the list of known platforms
	 *
	 * @param   string  $slug               Short name of the platform
	 * @param   string  $platformDirectory  The path where you can find it
	 *
	 * @return  void
	 */
	public static function addPlatform($slug, $platformDirectory)
	{
		if (empty(static::$knownPlatformsDirectories))
		{
			static::listPlatforms();

			static::$knownPlatformsDirectories[$slug] = $platformDirectory;
		}
	}

	/**
	 * Auto-detect the suitable platform for this site
	 *
	 * @return  string
	 *
	 * @throws  Exception  When no platform is detected
	 */
	protected static function detectPlatform()
	{
		$platforms = static::listPlatforms();

		if (empty($platforms))
		{
			throw new Exception('No Akeeba Engine platform class found');
		}

		$bestPlatform = (object) [
			'name'     => null,
			'priority' => 0,
		];

		foreach ($platforms as $platform => $path)
		{
			$o = static::loadPlatform($platform, $path);

			if (is_null($o))
			{
				continue;
			}

			if ($o->isThisPlatform())
			{
				if ($o->priority > $bestPlatform->priority)
				{
					$bestPlatform->priority = $o->priority;
					$bestPlatform->name     = $platform;
				}
			}
		}

		return $bestPlatform->name;
	}

	/**
	 * Load a given platform and return the platform object
	 *
	 * @param   string  $platform  Platform name
	 * @param   string  $path      The path to laod the platform from (optional)
	 *
	 * @return  Base
	 */
	protected static function &loadPlatform($platform, $path = null)
	{
		if (empty($path))
		{
			if (isset(static::$knownPlatformsDirectories[$platform]))
			{
				$path = static::$knownPlatformsDirectories[$platform];
			}
		}

		if (empty($path))
		{
			$path = dirname(__FILE__) . '/' . $platform;
		}

		$classFile = $path . '/Platform.php';
		$className = '\\Akeeba\\Engine\\Platform\\' . ucfirst($platform);

		$null = null;

		if (!file_exists($classFile))
		{
			return $null;
		}

		require_once($classFile);

		if (!class_exists($className, false))
		{
			return $null;
		}

		$o = new $className;

		return $o;
	}

	/**
	 * Magic method to proxy all calls to the loaded platform object
	 *
	 * @param   string  $name       The name of the method to call
	 * @param   array   $arguments  The arguments to pass
	 *
	 * @return  mixed  The result of the method being called
	 *
	 * @throws  Exception  When the platform isn't loaded or an non-existent method is called
	 */
	public function __call($name, array $arguments)
	{
		if (is_null(static::$platformConnectorInstance))
		{
			throw new Exception('Akeeba Engine platform is not loaded');
		}

		if (method_exists(static::$platformConnectorInstance, $name))
		{
			return static::$platformConnectorInstance->$name(...$arguments);
		}
		else
		{
			throw new Exception('Method ' . $name . ' not found in Akeeba Platform');
		}
	}

	/**
	 * Magic getter for the properties of the loaded platform
	 *
	 * @param   string  $name  The name of the property to get
	 *
	 * @return  mixed  The value of the property
	 */
	public function __get($name)
	{
		if (!isset(static::$platformConnectorInstance->$name) || !property_exists(static::$platformConnectorInstance, $name))
		{
			static::$platformConnectorInstance->$name = null;
			user_error(__CLASS__ . ' does not support property ' . $name, E_NOTICE);
		}

		return static::$platformConnectorInstance->$name;
	}

	/**
	 * Magic setter for the properties of the loaded platform
	 *
	 * @param   string  $name   The name of the property to set
	 * @param   mixed   $value  The value of the property to set
	 */
	public function __set($name, $value)
	{
		if (isset(static::$platformConnectorInstance->$name) || property_exists(static::$platformConnectorInstance, $name))
		{
			static::$platformConnectorInstance->$name = $value;
		}
		else
		{
			static::$platformConnectorInstance->$name = null;
			user_error(__CLASS__ . ' does not support property ' . $name, E_NOTICE);
		}
	}
}
components/com_akeeba/BackupEngine/Driver/None.php000060400000021534152453623440016206 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Driver;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Driver\Query\Base as QueryBase;

/**
 * Dummy driver class for flat-file CMS
 */
#[\AllowDynamicProperties]
class None extends Base
{
	public static $dbtech = 'none';
	/**
	 * The name of the database driver.
	 *
	 * @var    string
	 * @since  1.0
	 */
	public $name = 'none';

	public function __construct(array $options)
	{
		$this->driverType = 'none';

		parent::__construct($options);
	}

	/**
	 * Test to see if this db driver is available
	 *
	 * @return  boolean  True on success, false otherwise.
	 *
	 * @since   1.0
	 */
	public static function isSupported()
	{
		return true;
	}

	public function open()
	{
		return $this;
	}

	/**
	 * Closes the database connection
	 */
	public function close()
	{
		return;
	}

	/**
	 * Determines if the connection to the server is active.
	 *
	 * @return  boolean  True if connected to the database engine.
	 */
	public function connected()
	{
		return true;
	}

	/**
	 * Drops a table from the database.
	 *
	 * @param   string   $table     The name of the database table to drop.
	 * @param   boolean  $ifExists  Optionally specify that the table must exist before it is dropped.
	 *
	 * @return  Base  Returns this object to support chaining.
	 */
	public function dropTable($table, $ifExists = true)
	{
		return $this;
	}

	/**
	 * Method to escape a string for usage in an SQL statement.
	 *
	 * @param   string   $text   The string to be escaped.
	 * @param   boolean  $extra  Optional parameter to provide extra escaping.
	 *
	 * @return  string   The escaped string.
	 */
	public function escape($text, $extra = false)
	{
		return '';
	}

	/**
	 * Method to fetch a row from the result set cursor as an associative array.
	 *
	 * @param   mixed  $cursor  The optional result set cursor from which to fetch the row.
	 *
	 * @return  mixed  Either the next row from the result set or false if there are no more rows.
	 */
	public function fetchAssoc($cursor = null)
	{
		return false;
	}

	/**
	 * Method to free up the memory used for the result set.
	 *
	 * @param   mixed  $cursor  The optional result set cursor from which to fetch the row.
	 *
	 * @return  void
	 */
	public function freeResult($cursor = null)
	{
		return;
	}

	/**
	 * Get the number of affected rows for the previous executed SQL statement.
	 *
	 * @return  integer  The number of affected rows.
	 */
	public function getAffectedRows()
	{
		return 0;
	}

	/**
	 * Method to get the database collation in use by sampling a text field of a table in the database.
	 *
	 * @return  mixed  The collation in use by the database or boolean false if not supported.
	 */
	public function getCollation()
	{
		return false;
	}

	/**
	 * Get the number of returned rows for the previous executed SQL statement.
	 *
	 * @param   resource  $cursor  An optional database cursor resource to extract the row count from.
	 *
	 * @return  integer   The number of returned rows.
	 */
	public function getNumRows($cursor = null)
	{
		return 0;
	}

	/**
	 * Get the current query object or a new QueryBase object.
	 *
	 * @param   boolean  $new  False to return the current query object, True to return a new QueryBase object.
	 *
	 * @return  QueryBase  The current query object or a new object extending the QueryBase class.
	 */
	public function getQuery($new = false)
	{
		return $this->sql;
	}

	public function createQuery()
	{
		return $this->sql;
	}

	/**
	 * Retrieves field information about the given tables.
	 *
	 * @param   string   $table     The name of the database table.
	 * @param   boolean  $typeOnly  True (default) to only return field types.
	 *
	 * @return  array  An array of fields by table.
	 */
	public function getTableColumns($table, $typeOnly = true)
	{
		return [];
	}

	/**
	 * Shows the table CREATE statement that creates the given tables.
	 *
	 * @param   mixed  $tables  A table name or a list of table names.
	 *
	 * @return  array  A list of the create SQL for the tables.
	 */
	public function getTableCreate($tables)
	{
		return [];
	}

	/**
	 * Retrieves field information about the given tables.
	 *
	 * @param   mixed  $tables  A table name or a list of table names.
	 *
	 * @return  array  An array of keys for the table(s).
	 */
	public function getTableKeys($tables)
	{
		return [];
	}

	/**
	 * Method to get an array of all tables in the database.
	 *
	 * @return  array  An array of all the tables in the database.
	 */
	public function getTableList()
	{
		return [];
	}

	/**
	 * Returns an array with the names of tables, views, procedures, functions and triggers
	 * in the database. The table names are the keys of the tables, whereas the value is
	 * the type of each element: table, view, merge, temp, procedure, function or trigger.
	 * Note that merge are MRG_MYISAM tables and temp is non-permanent data table, usually
	 * set up as temporary, black hole or federated tables. These two types should never,
	 * ever, have their data dumped in the SQL dump file.
	 *
	 * @param   bool  $abstract  Return or normal names? Defaults to true (names)
	 *
	 * @return  array
	 */
	public function getTables($abstract = true)
	{
		return [];
	}

	/**
	 * Get the version of the database connector
	 *
	 * @return  string  The database connector version.
	 */
	public function getVersion()
	{
		return '0.0.0';
	}

	/**
	 * Method to get the auto-incremented value from the last INSERT statement.
	 *
	 * @return  integer  The value of the auto-increment field from the last inserted row.
	 */
	public function insertid()
	{
		return 0;
	}

	/**
	 * Locks a table in the database.
	 *
	 * @param   string  $tableNameName  The name of the table to unlock.
	 *
	 * @return  Base  Returns this object to support chaining.
	 */
	public function lockTable($tableNameName)
	{
		return $this;
	}

	/**
	 * Execute the SQL statement.
	 *
	 * @return  mixed  A database cursor resource on success, boolean false on failure.
	 */
	public function query()
	{
		return false;
	}

	/**
	 * Renames a table in the database.
	 *
	 * @param   string  $oldTable  The name of the table to be renamed
	 * @param   string  $newTable  The new name for the table.
	 * @param   string  $backup    Table prefix
	 * @param   string  $prefix    For the table - used to rename constraints in non-mysql databases
	 *
	 * @return  Base  Returns this object to support chaining.
	 */
	public function renameTable($oldTable, $newTable, $backup = null, $prefix = null)
	{
		return $this;
	}

	/**
	 * Select a database for use.
	 *
	 * @param   string  $database  The name of the database to select for use.
	 *
	 * @return  boolean  True if the database was successfully selected.
	 */
	public function select($database)
	{
		return true;
	}

	/**
	 * Set the connection to use UTF-8 character encoding.
	 *
	 * @return  boolean  True on success.
	 */
	public function setUTF()
	{
		return true;
	}

	/**
	 * Method to commit a transaction.
	 *
	 * @return  void
	 */
	public function transactionCommit()
	{
		return;
	}

	/**
	 * Method to roll back a transaction.
	 *
	 * @return  void
	 */
	public function transactionRollback()
	{
		return;
	}

	/**
	 * Method to initialize a transaction.
	 *
	 * @return  void
	 */
	public function transactionStart()
	{
		return;
	}

	/**
	 * Unlocks tables in the database.
	 *
	 * @return  Base  Returns this object to support chaining.
	 */
	public function unlockTables()
	{
		return $this;
	}

	/**
	 * Method to fetch a row from the result set cursor as an array.
	 *
	 * @param   mixed  $cursor  The optional result set cursor from which to fetch the row.
	 *
	 * @return  mixed  Either the next row from the result set or false if there are no more rows.
	 */
	protected function fetchArray($cursor = null)
	{
		return false;
	}

	/**
	 * Method to fetch a row from the result set cursor as an object.
	 *
	 * @param   mixed   $cursor  The optional result set cursor from which to fetch the row.
	 * @param   string  $class   The class name to use for the returned row object.
	 *
	 * @return  mixed   Either the next row from the result set or false if there are no more rows.
	 */
	protected function fetchObject($cursor = null, $class = 'stdClass')
	{
		return false;
	}
}
components/com_akeeba/BackupEngine/Driver/Sqlite.php000060400000047176152453623440016562 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Driver;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Driver\Query\Base as QueryBase;
use Akeeba\Engine\Driver\Query\Limitable;
use Akeeba\Engine\Driver\Query\Preparable;
use PDO;
use PDOException;
use PDOStatement;
use RuntimeException;
use SQLite3;

/**
 * SQLite database driver supporting PDO based connections
 *
 * @see    http://php.net/manual/en/ref.pdo-sqlite.php
 * @since  1.0
 */
#[\AllowDynamicProperties]
class Sqlite extends Base
{

	public static $dbtech = 'sqlite';

	/**
	 * The name of the database driver.
	 *
	 * @var    string
	 * @since  1.0
	 */
	public $name = 'sqlite';

	/** @var PDOStatement The database connection cursor from the last query. */
	protected $cursor;

	/** @var array   Contains the current query execution status */
	protected $executed = false;

	/**
	 * The character(s) used to quote SQL statement names such as table names or field names,
	 * etc. The child classes should define this as necessary.  If a single character string the
	 * same character is used for both sides of the quoted name, else the first character will be
	 * used for the opening quote and the second for the closing quote.
	 *
	 * @var    string
	 * @since  1.0
	 */
	protected $nameQuote = '`';

	/** @var resource   The prepared statement. */
	protected $prepared;

	/** @var bool Are we in the process of reconnecting to the database server? */
	private $isReconnecting = false;

	public function __construct(array $options)
	{
		$this->driverType = 'sqlite';

		parent::__construct($options);

		if (!is_object($this->connection))
		{
			$this->open();
		}
	}

	/**
	 * Test to see if the PDO ODBC connector is available.
	 *
	 * @return  boolean  True on success, false otherwise.
	 *
	 * @since   1.0
	 */
	public static function isSupported()
	{
		return class_exists('\\PDO') && in_array('sqlite', PDO::getAvailableDrivers());
	}

	/**
	 * Destructor.
	 *
	 * @since   1.0
	 */
	public function __destruct()
	{
		$this->freeResult();
		unset($this->connection);
	}

	public function close()
	{
		$return = false;

		if (is_object($this->cursor))
		{
			$this->cursor->closeCursor();
		}

		$this->connection = null;

		return $return;
	}

	/**
	 * Determines if the connection to the server is active.
	 *
	 * @return  boolean  True if connected to the database engine.
	 */
	public function connected()
	{
		return !empty($this->connection);
	}

	/**
	 * Disconnects the database.
	 *
	 * @return  void
	 *
	 * @since   1.0
	 */
	public function disconnect()
	{
		$this->freeResult();
		unset($this->connection);
	}

	/**
	 * Drops a table from the database.
	 *
	 * @param   string   $table     The name of the database table to drop.
	 * @param   boolean  $ifExists  Optionally specify that the table must exist before it is dropped.
	 *
	 * @return  Sqlite  Returns this object to support chaining.
	 *
	 * @since   1.0
	 */
	public function dropTable($table, $ifExists = true)
	{
		$this->open();

		$query = $this->getQuery(true);

		$this->setQuery('DROP TABLE ' . ($ifExists ? 'IF EXISTS ' : '') . $query->quoteName($table));

		$this->execute();

		return $this;
	}

	/**
	 * Method to escape a string for usage in an SQLite statement.
	 *
	 * Note: Using query objects with bound variables is preferable to the below.
	 *
	 * @param   string   $text   The string to be escaped.
	 * @param   boolean  $extra  Unused optional parameter to provide extra escaping.
	 *
	 * @return  string  The escaped string.
	 *
	 * @since   1.0
	 */
	public function escape($text, $extra = false)
	{
		if (is_int($text) || is_float($text))
		{
			return $text;
		}

		if (is_null($text))
		{
			return 'NULL';
		}

		return SQLite3::escapeString($text);
	}

	public function fetchAssoc($cursor = null)
	{
		if (!empty($cursor) && $cursor instanceof PDOStatement)
		{
			return $cursor->fetch(PDO::FETCH_ASSOC);
		}

		if ($this->prepared instanceof PDOStatement)
		{
			return $this->prepared->fetch(PDO::FETCH_ASSOC);
		}
	}

	public function freeResult($cursor = null)
	{
		$this->executed = false;

		if ($cursor instanceof PDOStatement)
		{
			$cursor->closeCursor();
			$cursor = null;
		}

		if ($this->prepared instanceof PDOStatement)
		{
			$this->prepared->closeCursor();
			$this->prepared = null;
		}
	}

	public function getAffectedRows()
	{
		$this->open();

		if ($this->prepared instanceof PDOStatement)
		{
			return $this->prepared->rowCount();
		}
		else
		{
			return 0;
		}
	}

	/**
	 * Method to get the database collation in use by sampling a text field of a table in the database.
	 *
	 * @return  mixed  The collation in use by the database or boolean false if not supported.
	 *
	 * @since   1.0
	 */
	public function getCollation()
	{
		return $this->charset;
	}

	public function getNumRows($cursor = null)
	{
		$this->open();

		if ($cursor instanceof PDOStatement)
		{
			return $cursor->rowCount();
		}
		elseif ($this->prepared instanceof PDOStatement)
		{
			return $this->prepared->rowCount();
		}
		else
		{
			return 0;
		}
	}

	/**
	 * Retrieve a PDO database connection attribute
	 * http://www.php.net/manual/en/pdo.getattribute.php
	 *
	 * Usage: $db->getOption(PDO::ATTR_CASE);
	 *
	 * @param   mixed  $key  One of the PDO::ATTR_* Constants
	 *
	 * @return  mixed
	 *
	 * @since   1.0
	 */
	public function getOption($key)
	{
		$this->open();

		return $this->connection->getAttribute($key);
	}

	/**
	 * Get the current query object or a new Query object.
	 * We have to override the parent method since it will always return a PDO query, while we have a
	 * specialized class for SQLite
	 *
	 * @param   boolean  $new  False to return the current query object, True to return a new Query object.
	 *
	 * @return  QueryBase  The current query object or a new object extending the Query class.
	 *
	 * @throws  RuntimeException
	 */
	public function getQuery($new = false)
	{
		if ($new)
		{
			return new Query\Sqlite($this);
		}

		return $this->sql;
	}

	public function createQuery()
	{
		return new Query\Sqlite($this);
	}

	/**
	 * Retrieves field information about a given table.
	 *
	 * @param   string   $table     The name of the database table.
	 * @param   boolean  $typeOnly  True to only return field types.
	 *
	 * @return  array  An array of fields for the database table.
	 *
	 * @throws  RuntimeException
	 * @since   1.0
	 */
	public function getTableColumns($table, $typeOnly = true)
	{
		$this->open();

		$columns = [];
		$query   = $this->getQuery(true);

		$fieldCasing = $this->getOption(PDO::ATTR_CASE);

		$this->setOption(PDO::ATTR_CASE, PDO::CASE_UPPER);

		$table = strtoupper($table);

		$query->setQuery('pragma table_info(' . $table . ')');

		$this->setQuery($query);
		$fields = $this->loadObjectList();

		if ($typeOnly)
		{
			foreach ($fields as $field)
			{
				$columns[$field->NAME] = $field->TYPE;
			}
		}
		else
		{
			foreach ($fields as $field)
			{
				// Do some dirty translation to MySQL output.
				$columns[$field->NAME] = (object) [
					'Field'   => $field->NAME,
					'Type'    => $field->TYPE,
					'Null'    => ($field->NOTNULL == '1' ? 'NO' : 'YES'),
					'Default' => $field->DFLT_VALUE,
					'Key'     => ($field->PK == '1' ? 'PRI' : ''),
				];
			}
		}

		$this->setOption(PDO::ATTR_CASE, $fieldCasing);

		return $columns;
	}

	/**
	 * Shows the table CREATE statement that creates the given tables.
	 *
	 * Note: Doesn't appear to have support in SQLite
	 *
	 * @param   mixed  $tables  A table name or a list of table names.
	 *
	 * @return  array  A list of the create SQL for the tables.
	 *
	 * @throws  RuntimeException
	 * @since   1.0
	 */
	public function getTableCreate($tables)
	{
		$this->open();

		// Sanitize input to an array and iterate over the list.
		$tables = (array) $tables;

		return $tables;
	}

	/**
	 * Get the details list of keys for a table.
	 *
	 * @param   string  $tables  The name of the table.
	 *
	 * @return  array  An array of the column specification for the table.
	 *
	 * @throws  RuntimeException
	 * @since   1.0
	 */
	public function getTableKeys($tables)
	{
		$this->open();

		$keys  = [];
		$query = $this->getQuery(true);

		$fieldCasing = $this->getOption(PDO::ATTR_CASE);

		$this->setOption(PDO::ATTR_CASE, PDO::CASE_UPPER);

		$tables = strtoupper($tables);
		$query->setQuery('pragma table_info( ' . $tables . ')');

		// $query->bind(':tableName', $table);

		$this->setQuery($query);
		$rows = $this->loadObjectList();

		foreach ($rows as $column)
		{
			if ($column->PK == 1)
			{
				$keys[$column->NAME] = $column;
			}
		}

		$this->setOption(PDO::ATTR_CASE, $fieldCasing);

		return $keys;
	}

	/**
	 * Method to get an array of all tables in the database (schema).
	 *
	 * @return  array   An array of all the tables in the database.
	 *
	 * @throws  RuntimeException
	 * @since   1.0
	 */
	public function getTableList()
	{
		$this->open();

		/* @type  Query\Sqlite $query */
		$query = $this->getQuery(true);

		$type = 'table';

		$query->select('name');
		$query->from('sqlite_master');
		$query->where('type = :type');
		$query->bind(':type', $type);
		$query->order('name');

		$this->setQuery($query);

		$tables = $this->loadColumn();

		return $tables;
	}

	/**
	 * There's no point on return "a list of tables" inside a SQLite database: we are simple going to
	 * copy the whole database file in the new location
	 *
	 * @param   bool  $abstract
	 *
	 * @return array
	 */
	public function getTables($abstract = true)
	{
		return [];
	}

	/**
	 * Get the version of the database connector.
	 *
	 * @return  string  The database connector version.
	 *
	 * @since   1.0
	 */
	public function getVersion()
	{
		$this->open();

		$this->setQuery("SELECT sqlite_version()");

		return $this->loadResult();
	}

	public function insertid()
	{
		$this->open();

		// Error suppress this to prevent PDO warning us that the driver doesn't support this operation.
		return @$this->connection->lastInsertId();
	}

	/**
	 * Locks a table in the database.
	 *
	 * @param   string  $tableName  The name of the table to unlock.
	 *
	 * @return  Sqlite Returns this object to support chaining.
	 *
	 * @throws  RuntimeException
	 * @since   1.0
	 */
	public function lockTable($tableName)
	{
		return $this;
	}

	public function open()
	{
		if ($this->connected())
		{
			return;
		}
		else
		{
			$this->close();
		}

		if (isset($this->options['version']) && $this->options['version'] == 2)
		{
			$format = 'sqlite2:#DBNAME#';
		}
		else
		{
			$format = 'sqlite:#DBNAME#';
		}

		$replace = ['#DBNAME#'];
		$with    = [$this->options['database']];

		// Create the connection string:
		$connectionString = str_replace($replace, $with, $format);

		try
		{
			$this->connection = new PDO(
				$connectionString,
				$this->options['user'],
				$this->options['password']
			);
		}
		catch (PDOException $e)
		{
			throw new RuntimeException('Could not connect to PDO' . ': ' . $e->getMessage(), 2, $e);
		}
	}

	public function query()
	{
		$this->open();

		if (!is_object($this->connection))
		{
			throw new RuntimeException($this->errorMsg, $this->errorNum);
		}

		// Take a local copy so that we don't modify the original query and cause issues later
		$sql = $this->replacePrefix((string) $this->sql);

		if ($this->limit > 0 || $this->offset > 0)
		{
			$sql .= ' LIMIT ' . $this->limit;

			if ($this->offset > 0)
			{
				$sql .= ' OFFSET ' . $this->offset;
			}
		}

		// Increment the query counter.
		$this->count++;

		// If debugging is enabled then let's log the query.
		if ($this->debug)
		{
			// Add the query to the object queue.
			$this->log[] = $sql;
		}

		// Reset the error values.
		$this->errorNum = 0;
		$this->errorMsg = '';

		// Execute the query.
		$this->executed = false;

		if ($this->prepared instanceof PDOStatement)
		{
			// Bind the variables:
			if ($this->sql instanceof Preparable)
			{
				$bounded =& $this->sql->getBounded();

				foreach ($bounded as $key => $obj)
				{
					$this->prepared->bindParam($key, $obj->value, $obj->dataType, $obj->length, $obj->driverOptions);
				}
			}

			$this->executed = $this->prepared->execute();
		}

		// If an error occurred handle it.
		if (!$this->executed)
		{
			// Get the error number and message before we execute any more queries.
			$errorNum = (int) $this->connection->errorCode();
			$errorMsg = (string) 'SQL: ' . implode(", ", $this->connection->errorInfo());

			// Check if the server was disconnected.
			if (!$this->connected() && !$this->isReconnecting)
			{
				$this->isReconnecting = true;

				try
				{
					// Attempt to reconnect.
					$this->connection = null;
					$this->open();
				}
				catch (RuntimeException $e)
					// If connect fails, ignore that exception and throw the normal exception.
				{
					// Get the error number and message.
					$this->errorNum = (int) $this->connection->errorCode();
					$this->errorMsg = (string) 'SQL: ' . implode(", ", $this->connection->errorInfo());

					// Throw the normal query exception.
					throw new RuntimeException($this->errorMsg, $this->errorNum);
				}

				// Since we were able to reconnect, run the query again.
				$result               = $this->query();
				$this->isReconnecting = false;

				return $result;
			}
			else
				// The server was not disconnected.
			{
				// Get the error number and message from before we tried to reconnect.
				$this->errorNum = $errorNum;
				$this->errorMsg = $errorMsg;

				// Throw the normal query exception.
				throw new RuntimeException($this->errorMsg, $this->errorNum);
			}
		}

		return $this->prepared;
	}

	/**
	 * Renames a table in the database.
	 *
	 * @param   string  $oldTable  The name of the table to be renamed
	 * @param   string  $newTable  The new name for the table.
	 * @param   string  $backup    Not used by Sqlite.
	 * @param   string  $prefix    Not used by Sqlite.
	 *
	 * @return  Sqlite Returns this object to support chaining.
	 *
	 * @throws  RuntimeException
	 * @since   1.0
	 */
	public function renameTable($oldTable, $newTable, $backup = null, $prefix = null)
	{
		$this->setQuery('ALTER TABLE ' . $oldTable . ' RENAME TO ' . $newTable)->execute();

		return $this;
	}

	/**
	 * Select a database for use.
	 *
	 * @param   string  $database  The name of the database to select for use.
	 *
	 * @return  boolean  True if the database was successfully selected.
	 *
	 * @throws  RuntimeException
	 * @since   1.0
	 */
	public function select($database)
	{
		$this->open();

		$this->_database = $database;

		return true;
	}

	/**
	 * Sets an attribute on the PDO database handle.
	 * http://www.php.net/manual/en/pdo.setattribute.php
	 *
	 * Usage: $db->setOption(PDO::ATTR_CASE, PDO::CASE_UPPER);
	 *
	 * @param   integer  $key    One of the PDO::ATTR_* Constants
	 * @param   mixed    $value  One of the associated PDO Constants
	 *                           related to the particular attribute
	 *                           key.
	 *
	 * @return boolean
	 *
	 * @since  1.0
	 */
	public function setOption($key, $value)
	{
		$this->open();

		return $this->connection->setAttribute($key, $value);
	}

	/**
	 * Sets the SQL statement string for later execution.
	 *
	 * @param   mixed    $query          The SQL statement to set either as a JDatabaseQuery object or a string.
	 * @param   integer  $offset         The affected row offset to set.
	 * @param   integer  $limit          The maximum affected rows to set.
	 * @param   array    $driverOptions  The optional PDO driver options
	 *
	 * @return  Base  This object to support method chaining.
	 *
	 * @since   1.0
	 */
	public function setQuery($query, $offset = null, $limit = null, $driverOptions = [])
	{
		$this->open();

		$this->freeResult();

		if (is_string($query))
		{
			// Allows taking advantage of bound variables in a direct query:
			$query = $this->getQuery(true)->setQuery($query);
		}

		if ($query instanceof Limitable && !is_null($offset) && !is_null($limit))
		{
			$query->setLimit($limit, $offset);
		}

		$sql = $this->replacePrefix((string) $query);

		$this->prepared = $this->connection->prepare($sql, $driverOptions);

		// Store reference to the DatabaseQuery instance:
		parent::setQuery($query, $offset, $limit);

		return $this;
	}

	/**
	 * Set the connection to use UTF-8 character encoding.
	 *
	 * Returns false automatically for the Oracle driver since
	 * you can only set the character set when the connection
	 * is created.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.0
	 */
	public function setUTF()
	{
		$this->open();

		return false;
	}

	/**
	 * Method to commit a transaction.
	 *
	 * @param   boolean  $toSavepoint  If true, commit to the last savepoint.
	 *
	 * @return  void
	 *
	 * @throws  RuntimeException
	 * @since   1.0
	 */
	public function transactionCommit($toSavepoint = false)
	{
		$this->open();

		if (!$toSavepoint || $this->transactionDepth <= 1)
		{
			$this->open();

			if (!$toSavepoint || $this->transactionDepth == 1)
			{
				$this->connection->commit();
			}

			$this->transactionDepth--;
		}
		else
		{
			$this->transactionDepth--;
		}
	}

	/**
	 * Method to roll back a transaction.
	 *
	 * @param   boolean  $toSavepoint  If true, rollback to the last savepoint.
	 *
	 * @return  void
	 *
	 * @throws  RuntimeException
	 * @since   1.0
	 */
	public function transactionRollback($toSavepoint = false)
	{
		$this->connected();

		if (!$toSavepoint || $this->transactionDepth <= 1)
		{
			$this->open();

			if (!$toSavepoint || $this->transactionDepth == 1)
			{
				$this->connection->rollBack();
			}

			$this->transactionDepth--;
		}
		else
		{
			$savepoint = 'SP_' . ($this->transactionDepth - 1);
			$this->setQuery('ROLLBACK TO ' . $this->quoteName($savepoint));

			if ($this->execute())
			{
				$this->transactionDepth--;
			}
		}
	}

	/**
	 * Method to initialize a transaction.
	 *
	 * @param   boolean  $asSavepoint  If true and a transaction is already active, a savepoint will be created.
	 *
	 * @return  void
	 *
	 * @throws  RuntimeException
	 * @since   1.0
	 */
	public function transactionStart($asSavepoint = false)
	{
		$this->connected();

		if (!$asSavepoint || !$this->transactionDepth)
		{
			$this->open();

			if (!$asSavepoint || !$this->transactionDepth)
			{
				$this->connection->beginTransaction();
			}

			$this->transactionDepth++;
		}
		else
		{
			$savepoint = 'SP_' . $this->transactionDepth;
			$this->setQuery('SAVEPOINT ' . $this->quoteName($savepoint));

			if ($this->execute())
			{
				$this->transactionDepth++;
			}
		}
	}

	/**
	 * Unlocks tables in the database.
	 *
	 * @return  Sqlite Returns this object to support chaining.
	 *
	 * @throws  RuntimeException
	 * @since   1.0
	 */
	public function unlockTables()
	{
		return $this;
	}

	protected function fetchArray($cursor = null)
	{
		if (!empty($cursor) && $cursor instanceof PDOStatement)
		{
			return $cursor->fetch(PDO::FETCH_NUM);
		}

		if ($this->prepared instanceof PDOStatement)
		{
			return $this->prepared->fetch(PDO::FETCH_NUM);
		}
	}

	protected function fetchObject($cursor = null, $class = 'stdClass')
	{
		if (!empty($cursor) && $cursor instanceof PDOStatement)
		{
			return $cursor->fetchObject($class);
		}

		if ($this->prepared instanceof PDOStatement)
		{
			return $this->prepared->fetchObject($class);
		}
	}
}
components/com_akeeba/BackupEngine/Driver/Mysql.php000060400000063445152453623440016423 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Driver;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Driver\Query\Mysql as QueryMysql;
use Akeeba\Engine\Factory;
use Exception;
use RuntimeException;

/**
 * MySQL classic driver for Akeeba Engine
 *
 * Based on Joomla! Platform 11.2
 */
#[\AllowDynamicProperties]
class Mysql extends Base
{

	/**
	 * The name of the database driver.
	 *
	 * @var    string
	 * @since  11.1
	 */
	public $name = 'mysql';

	/**
	 * Hostname
	 *
	 * @var   string
	 */
	protected $host;

	/**
	 * The character(s) used to quote SQL statement names such as table names or field names,
	 * etc. The child classes should define this as necessary.  If a single character string the
	 * same character is used for both sides of the quoted name, else the first character will be
	 * used for the opening quote and the second for the closing quote.
	 *
	 * @var    string
	 * @since  11.1
	 */
	protected $nameQuote = '`';

	/**
	 * The null or zero representation of a timestamp for the database driver.  This should be
	 * defined in child classes to hold the appropriate value for the engine.
	 *
	 * @var    string
	 * @since  11.1
	 */
	protected $nullDate = '0000-00-00 00:00:00';

	/**
	 * Password
	 *
	 * @var   string
	 */
	protected $password;

	/**
	 * Should I select a database?
	 *
	 * @var   bool
	 */
	protected $selectDatabase;

	/**
	 * Username
	 *
	 * @var   string
	 */
	protected $user;

	/** @var bool Are we in the process of reconnecting to the database server? */
	private $isReconnecting = false;

	/** @var array|null A cache of the tables contained in the currently connected database */
	public $tablesCache = null;

	/**
	 * Database object constructor
	 *
	 * @param   array  $options  List of options used to configure the connection
	 */
	public function __construct($options)
	{
		$this->driverType = 'mysql';

		// Init
		$this->nameQuote = '`';

		$host     = array_key_exists('host', $options) ? $options['host'] : 'localhost';
		$port     = array_key_exists('port', $options) ? $options['port'] : '';
		$user     = array_key_exists('user', $options) ? $options['user'] : '';
		$password = array_key_exists('password', $options) ? $options['password'] : '';
		$database = array_key_exists('database', $options) ? $options['database'] : '';
		$prefix   = array_key_exists('prefix', $options) ? $options['prefix'] : '';
		$select   = array_key_exists('select', $options) ? $options['select'] : true;

		if (!empty($port))
		{
			$host .= ':' . $port;
		}

		// finalize initialization
		parent::__construct($options);

		// Avoid overwriting connection info if they're already set
		if (is_null($this->host))
		{
			$this->host = $host;
		}

		if (is_null($this->user))
		{
			$this->user = $user;
		}

		if (is_null($this->password))
		{
			$this->password = $password;
		}

		if (is_null($this->_database))
		{
			$this->_database = $database;
		}

		if (is_null($this->selectDatabase))
		{
			$this->selectDatabase = $select;
		}

		// Open the connection
		if (!is_resource($this->connection) || is_null($this->connection))
		{
			$this->open();
		}
	}

	/**
	 * Test to see if the MySQL connector is available.
	 *
	 * @return  boolean  True on success, false otherwise.
	 *
	 * @since   12.1
	 */
	public static function isSupported()
	{
		return (function_exists('mysql_connect'));
	}

	/**
	 * Test to see if the MySQL connector is available.
	 *
	 * @return  boolean  True on success, false otherwise.
	 */
	public static function test()
	{
		return (function_exists('mysql_connect'));
	}

	public function close()
	{
		$return = false;
		if (is_resource($this->cursor))
		{
			mysql_free_result($this->cursor);
		}
		if (is_resource($this->connection) || (!is_null($this->connection) && !is_bool($this->connection)))
		{
			$return = mysql_close($this->connection);
		}
		$this->connection = null;

		return $return;
	}

	/**
	 * Determines if the connection to the server is active.
	 *
	 * @return  boolean  True if connected to the database engine.
	 */
	public function connected()
	{
		if (is_resource($this->connection))
		{
			return @mysql_ping($this->connection);
		}

		return false;
	}

	/**
	 * Drops a table from the database.
	 *
	 * @param   string   $table     The name of the database table to drop.
	 * @param   boolean  $ifExists  Optionally specify that the table must exist before it is dropped.
	 *
	 * @return  Mysql  Returns this object to support chaining.
	 */
	public function dropTable($table, $ifExists = true)
	{
		$query = $this->getQuery(true);

		$this->setQuery('DROP TABLE ' . ($ifExists ? 'IF EXISTS ' : '') . $query->quoteName($table));

		$this->query();

		return $this;
	}

	/**
	 * Method to escape a string for usage in an SQL statement.
	 *
	 * @param   string   $text   The string to be escaped.
	 * @param   boolean  $extra  Optional parameter to provide extra escaping.
	 *
	 * @return  string  The escaped string.
	 */
	public function escape($text, $extra = false)
	{
		if (is_null($text))
		{
			return 'NULL';
		}

		$result = @mysql_real_escape_string($text, $this->getConnection());

		if ($result === false)
		{
			// Attempt to reconnect.
			try
			{
				$this->connection = null;
				$this->open();

				$result = @mysql_real_escape_string($text, $this->getConnection());
			}
			catch (RuntimeException $e)
			{
				$result = $this->unsafe_escape($text);
			}
		}

		if ($extra)
		{
			$result = addcslashes($result, '%_');
		}

		return $result;
	}

	/**
	 * Method to fetch a row from the result set cursor as an associative array.
	 *
	 * @param   mixed  $cursor  The optional result set cursor from which to fetch the row.
	 *
	 * @return  mixed  Either the next row from the result set or false if there are no more rows.
	 */
	public function fetchAssoc($cursor = null)
	{
		return mysql_fetch_assoc($cursor ?: $this->cursor);
	}

	/**
	 * Method to free up the memory used for the result set.
	 *
	 * @param   mixed  $cursor  The optional result set cursor from which to fetch the row.
	 *
	 * @return  void
	 */
	public function freeResult($cursor = null)
	{
		mysql_free_result($cursor ?: $this->cursor);
	}

	/**
	 * Get the number of affected rows for the previous executed SQL statement.
	 *
	 * @return  integer  The number of affected rows.
	 */
	public function getAffectedRows()
	{
		return mysql_affected_rows($this->connection);
	}

	/**
	 * Method to get the database collation in use by sampling a text field of a table in the database.
	 *
	 * @return  mixed  The collation in use by the database (string) or boolean false if not supported.
	 */
	public function getCollation()
	{
		$this->setQuery('SHOW FULL COLUMNS FROM #__ak_stats');
		$array = $this->loadAssocList();

		return $array['2']['Collation'];
	}

	/**
	 * Get the number of returned rows for the previous executed SQL statement.
	 *
	 * @param   resource  $cursor  An optional database cursor resource to extract the row count from.
	 *
	 * @return  integer   The number of returned rows.
	 */
	public function getNumRows($cursor = null)
	{
		return mysql_num_rows($cursor ?: $this->cursor);
	}

	/**
	 * Get the current or query, or new JDatabaseQuery object.
	 *
	 * @param   boolean  $new  False to return the last query set, True to return a new JDatabaseQuery object.
	 *
	 * @return  mixed  The current value of the internal SQL variable or a new JDatabaseQuery object.
	 */
	public function getQuery($new = false)
	{
		if ($new)
		{
			return new QueryMysql($this);
		}
		else
		{
			return $this->sql;
		}
	}

	public function createQuery()
	{
		return new QueryMysql($this);
	}

	/**
	 * Retrieves field information about a given table.
	 *
	 * @param   string   $table     The name of the database table.
	 * @param   boolean  $typeOnly  True to only return field types.
	 *
	 * @return  array  An array of fields for the database table.
	 */
	public function getTableColumns($table, $typeOnly = true)
	{
		$result = [];

		// Set the query to get the table fields statement.
		$this->setQuery('SHOW FULL COLUMNS FROM ' . $this->quoteName($this->escape($table)));
		$fields = $this->loadObjectList();

		// If we only want the type as the value add just that to the list.
		if ($typeOnly)
		{
			foreach ($fields as $field)
			{
				$result[$field->Field] = preg_replace("/[(0-9)]/", '', $field->Type);
			}
		}
		// If we want the whole field data object add that to the list.
		else
		{
			foreach ($fields as $field)
			{
				$result[$field->Field] = $field;
			}
		}

		return $result;
	}

	/**
	 * Shows the table CREATE statement that creates the given tables.
	 *
	 * @param   mixed  $tables  A table name or a list of table names.
	 *
	 * @return  array  A list of the create SQL for the tables.
	 */
	public function getTableCreate($tables)
	{
		// Initialise variables.
		$result = [];

		// Sanitize input to an array and iterate over the list.
		$tables = (array) $tables;
		foreach ($tables as $table)
		{
			// Set the query to get the table CREATE statement.
			$this->setQuery('SHOW CREATE table ' . $this->quoteName($this->escape($table)));
			$row = $this->loadRow();

			// Populate the result array based on the create statements.
			$result[$table] = $row[1];
		}

		return $result;
	}

	/**
	 * Get the details list of keys for a table.
	 *
	 * @param   string  $tables  The name of the table.
	 *
	 * @return  array  An array of the column specification for the table.
	 */
	public function getTableKeys($tables)
	{
		// Get the details columns information.
		$this->setQuery('SHOW KEYS FROM ' . $this->quoteName($tables));
		$keys = $this->loadObjectList();

		return $keys;
	}

	/**
	 * Method to get an array of all tables in the database.
	 *
	 * @return  array  An array of all the tables in the database.
	 */
	public function getTableList()
	{
		// Set the query to get the tables statement.
		$this->setQuery('SHOW TABLES');
		$tables = $this->loadColumn();

		return $tables;
	}

	/**
	 * Returns an array with the names of tables, views, procedures, functions and triggers
	 * in the database. The table names are the keys of the tables, whereas the value is
	 * the type of each element: table, view, merge, temp, procedure, function or trigger.
	 * Note that merge are MRG_MYISAM tables and temp is non-permanent data table, usually
	 * set up as temporary, black hole or federated tables. These two types should never,
	 * ever, have their data dumped in the SQL dump file.
	 *
	 * @param   bool  $abstract  Return abstract or normal names? Defaults to true (abstract names)
	 *
	 * @return array
	 */
	public function getTables($abstract = true)
	{
		if (!empty($this->tablesCache[$this->_database]))
		{
			return $this->tablesCache[$this->_database];
		}

		$sql = "SHOW TABLES";
		$this->setQuery($sql);
		$all_tables = $this->loadColumn();

		if (!empty($all_tables))
		{
			// Start by adding tables and views to the list
			foreach ($all_tables as $table_name)
			{
				if ($abstract)
				{
					$table_name = $this->getAbstract($table_name);
				}
				$this->tablesCache[$this->_database][$table_name] = 'table';
			}

			// Loop all metadatas
			foreach ($all_tables as $table_metadata)
			{
				$table_name     = $table_metadata;
				$table_abstract = $this->getAbstract($table_metadata);
				$type           = 'table';

				if ($abstract)
				{
					$table_metadata = $table_abstract;
				}

				$create = $this->get_create($table_abstract, $table_name, $type);
				// Scan for the table engine.
				$engine = null; // So that we detect VIEWs correctly

				if ($type == 'table')
				{
					$engine      = 'MyISAM'; // So that even with MySQL 4 hosts we don't screw this up
					$engine_keys = ['ENGINE=', 'TYPE='];
					foreach ($engine_keys as $engine_key)
					{
						$start_pos = strrpos($create, $engine_key);
						if ($start_pos !== false)
						{
							// Advance the start position just after the position of the ENGINE keyword
							$start_pos += strlen($engine_key);
							// Try to locate the space after the engine type
							$end_pos = stripos($create, ' ', $start_pos);
							if ($end_pos === false)
							{
								// Uh... maybe it ends with ENGINE=EngineType;
								$end_pos = stripos($create, ';');
							}
							if ($end_pos !== '')
							{
								// Grab the string
								$engine = substr($create, $start_pos, $end_pos - $start_pos);
							}
						}
					}
					$engine = strtoupper($engine);
				}

				switch ($engine)
				{
					// Views -- FIX: They are detected based on their CREATE STATEMENT
					case null:
						$this->tablesCache[$this->_database][$table_metadata] = 'view';
						break;

					// Merge tables
					case 'MRG_MYISAM':
						$this->tablesCache[$this->_database][$table_metadata] = 'merge';
						break;

					// Tables whose data we do not back up (memory, federated and can-have-no-data tables)
					case 'MEMORY':
					case 'EXAMPLE':
					case 'BLACKHOLE':
					case 'FEDERATED':
						$this->tablesCache[$this->_database][$table_metadata] = 'temp';
						break;

					// Normal tables
					default:
						break;
				} // switch
			} // foreach
		} // if !empty

		// If we have MySQL > 5.0 add the list of stored procedures, stored functions
		// and triggers
		$registry        = Factory::getConfiguration();
		$enable_entities = $registry->get('engine.dump.native.advanced_entitites', true);
		if ($enable_entities)
		{
			// 1. Stored procedures
			$sql = "SHOW PROCEDURE STATUS WHERE " . $this->quoteName('Db') . "=" . $this->quote($this->_database);
			$this->setQuery($sql);

			try
			{
				$all_entries = $this->loadAssocList();
			}
			catch (Exception $e)
			{
				$all_entries = [];
			}

			if (is_array($all_entries) || $all_entries instanceof \Countable ? count($all_entries) : 0)
			{
				foreach ($all_entries as $entry)
				{
					$table_name = $entry['Name'];
					if ($abstract)
					{
						$table_name = $this->getAbstract($table_name);
					}
					$this->tablesCache[$this->_database][$table_name] = 'procedure';
				}
			}

			// 2. Stored functions
			$sql = "SHOW FUNCTION STATUS WHERE " . $this->quoteName('Db') . "=" . $this->quote($this->_database);
			$this->setQuery($sql);

			try
			{
				$all_entries = $this->loadColumn(1);
			}
			catch (Exception $e)
			{
				$all_entries = [];
			}

			// If we have filters, make sure the tables pass the filtering
			if (is_array($all_entries))
			{
				if (count($all_entries))
				{
					foreach ($all_entries as $table_name)
					{
						if ($abstract)
						{
							$table_name = $this->getAbstract($table_name);
						}
						$this->tablesCache[$this->_database][$table_name] = 'function';
					}
				}
			}

			// 3. Triggers
			$sql = "SHOW TRIGGERS";
			$this->setQuery($sql);

			try
			{
				$all_entries = $this->loadColumn();
			}
			catch (Exception $e)
			{
				$all_entries = [];
			}

			// If we have filters, make sure the tables pass the filtering
			if (is_array($all_entries))
			{
				if (count($all_entries))
				{
					foreach ($all_entries as $table_name)
					{
						if ($abstract)
						{
							$table_name = $this->getAbstract($table_name);
						}
						$this->tablesCache[$this->_database][$table_name] = 'trigger';
					}
				}
			}

		}

		return $this->tablesCache[$this->_database];
	}

	/**
	 * Get the version of the database connector.
	 *
	 * @return  string  The database connector version.
	 */
	public function getVersion()
	{
		return mysql_get_server_info($this->connection);
	}

	/**
	 * Determines if the database engine supports UTF-8 character encoding.
	 *
	 * @return  boolean  True if supported.
	 */
	public function hasUTF()
	{
		$verParts = explode('.', $this->getVersion());

		return ($verParts[0] == 5 || ($verParts[0] == 4 && $verParts[1] == 1 && (int) $verParts[2] >= 2));
	}

	/**
	 * Method to get the auto-incremented value from the last INSERT statement.
	 *
	 * @return  integer  The value of the auto-increment field from the last inserted row.
	 */
	public function insertid()
	{
		return mysql_insert_id($this->connection);
	}

	/**
	 * Locks a table in the database.
	 *
	 * @param   string  $tableName  The name of the table to unlock.
	 *
	 * @return  Mysql  Returns this object to support chaining.
	 */
	public function lockTable($tableName)
	{
		$this->setQuery('LOCK TABLES ' . $this->quoteName($tableName) . ' WRITE')->query();

		return $this;
	}

	public function open()
	{
		if ($this->connected())
		{
			return;
		}
		else
		{
			$this->close();
		}

		// perform a number of fatality checks, then return gracefully
		if (!function_exists('mysql_connect'))
		{
			$this->errorNum = 1;
			$this->errorMsg = 'The MySQL adapter "mysql" is not available.';

			return;
		}

		if (!($this->connection = @mysql_connect($this->host, $this->user, $this->password, true)))
		{
			$this->errorNum = 2;
			$this->errorMsg = 'Could not connect to MySQL';

			return;
		}

		// Set sql_mode to non_strict mode
		mysql_query("SET @@SESSION.sql_mode = '';", $this->connection);

		// If auto-select is enabled select the given database.
		if ($this->selectDatabase && !empty($this->_database))
		{
			if (!$this->select($this->_database))
			{
				$this->errorNum = 3;
				$this->errorMsg = "Cannot select database {$this->_database}";

				return;
			}
		}

		$this->setUTF();
	}

	/**
	 * Execute the SQL statement.
	 *
	 * @return  mixed  A database cursor resource on success, boolean false on failure.
	 */
	public function query()
	{
		if (!is_resource($this->connection))
		{
			throw new RuntimeException($this->errorMsg, $this->errorNum);
		}

		// Take a local copy so that we don't modify the original query and cause issues later
		$query = $this->replacePrefix((string) $this->sql);
		if ($this->limit > 0 || $this->offset > 0)
		{
			$query .= ' LIMIT ' . $this->offset . ', ' . $this->limit;
		}

		// Increment the query counter.
		$this->count++;

		// If debugging is enabled then let's log the query.
		if ($this->debug)
		{
			// Add the query to the object queue.
			$this->log[] = $query;
		}

		// Reset the error values.
		$this->errorNum = 0;
		$this->errorMsg = '';

		// Execute the query. Error suppression is used here to prevent warnings/notices that the connection has been lost.
		$this->cursor = @mysql_query($query, $this->connection);

		// If an error occurred handle it.
		if (!$this->cursor)
		{
			// Check if the server was disconnected.
			if (!$this->connected() && !$this->isReconnecting)
			{
				$this->isReconnecting = true;

				try
				{
					// Attempt to reconnect.
					$this->connection = null;
					$this->open();
				}
					// If connect fails, ignore that exception and throw the normal exception.
				catch (RuntimeException $e)
				{
					// Get the error number and message.
					$this->errorNum = (int) mysql_errno($this->connection);
					$this->errorMsg = (string) mysql_error($this->connection) . ' SQL=' . $query;

					// Throw the normal query exception.
					throw new RuntimeException($this->errorMsg, $this->errorNum);
				}

				// Since we were able to reconnect, run the query again.
				$result               = $this->query();
				$this->isReconnecting = false;

				return $result;
			}
			// The server was not disconnected.
			else
			{
				// Get the error number and message.
				$this->errorNum = (int) mysql_errno($this->connection);
				$this->errorMsg = (string) mysql_error($this->connection) . ' SQL=' . $query;

				// Throw the normal query exception.
				if ($this->errorNum != 0)
				{
					throw new RuntimeException($this->errorMsg, $this->errorNum);
				}
			}
		}

		return $this->cursor;
	}

	/**
	 * Renames a table in the database.
	 *
	 * @param   string  $oldTable  The name of the table to be renamed
	 * @param   string  $newTable  The new name for the table.
	 * @param   string  $backup    Not used by MySQL.
	 * @param   string  $prefix    Not used by MySQL.
	 *
	 * @return  Mysql  Returns this object to support chaining.
	 */
	public function renameTable($oldTable, $newTable, $backup = null, $prefix = null)
	{
		$this->setQuery('RENAME TABLE ' . $oldTable . ' TO ' . $newTable)->query();

		return $this;
	}

	/**
	 * Select a database for use.
	 *
	 * @param   string  $database  The name of the database to select for use.
	 *
	 * @return  boolean  True if the database was successfully selected.
	 */
	public function select($database)
	{
		if (!$database)
		{
			return false;
		}

		if (!mysql_select_db($database, $this->connection))
		{
			throw new RuntimeException('Could not connect to database');
		}

		return true;
	}

	/**
	 * Set the connection to use UTF-8 character encoding.
	 *
	 * @return  boolean  True on success.
	 */
	public function setUTF()
	{
		$result = false;

		if ($this->supportsUtf8mb4())
		{
			$result = @mysql_set_charset('utf8mb4', $this->connection);
		}

		if (!$result)
		{
			$result = @mysql_set_charset('utf8', $this->connection);
		}

		return $result;
	}

	/**
	 * Method to commit a transaction.
	 *
	 * @return  void
	 */
	public function transactionCommit()
	{
		$this->setQuery('COMMIT');
		$this->execute();
	}

	/**
	 * Method to roll back a transaction.
	 *
	 * @return  void
	 */
	public function transactionRollback()
	{
		$this->setQuery('ROLLBACK');
		$this->execute();
	}

	/**
	 * Method to initialize a transaction.
	 *
	 * @return  void
	 */
	public function transactionStart()
	{
		$this->setQuery('START TRANSACTION');
		$this->execute();
	}

	/**
	 * Unlocks tables in the database.
	 *
	 * @return  Mysql  Returns this object to support chaining.
	 *
	 * @throws  Exception
	 * @since   11.4
	 */
	public function unlockTables()
	{
		$this->setQuery('UNLOCK TABLES')->execute();

		return $this;
	}

	/**
	 * Method to fetch a row from the result set cursor as an array.
	 *
	 * @param   mixed  $cursor  The optional result set cursor from which to fetch the row.
	 *
	 * @return  mixed  Either the next row from the result set or false if there are no more rows.
	 */
	protected function fetchArray($cursor = null)
	{
		return mysql_fetch_row($cursor ?: $this->cursor);
	}

	/**
	 * Method to fetch a row from the result set cursor as an object.
	 *
	 * @param   mixed   $cursor  The optional result set cursor from which to fetch the row.
	 * @param   string  $class   The class name to use for the returned row object.
	 *
	 * @return  mixed   Either the next row from the result set or false if there are no more rows.
	 */
	protected function fetchObject($cursor = null, $class = 'stdClass')
	{
		return mysql_fetch_object($cursor ?: $this->cursor, $class);
	}

	/**
	 * Gets the CREATE TABLE command for a given table/view
	 *
	 * @param   string  $table_abstract  The abstracted name of the entity
	 * @param   string  $table_name      The name of the table
	 * @param   string  $type            The type of the entity to scan. If it's found to differ, the correct type is
	 *                                   returned.
	 *
	 * @return string The CREATE command, w/out newlines
	 */
	protected function get_create($table_abstract, $table_name, &$type)
	{
		$sql = "SHOW CREATE TABLE `$table_abstract`";
		$this->setQuery($sql);
		$temp      = $this->loadRowList();
		$table_sql = $temp[0][1];
		unset($temp);

		// Smart table type detection
		if (in_array($type, ['table', 'merge', 'view']))
		{
			// Check for CREATE VIEW
			$pattern = '/^CREATE(.*) VIEW (.*)/i';
			$result  = preg_match($pattern, $table_sql);
			if ($result === 1)
			{
				// This is a view.
				$type = 'view';
			}
			else
			{
				// This is a table.
				$type = 'table';
			}

			// Is it a VIEW but we don't have SHOW VIEW privileges?
			if (empty($table_sql))
			{
				$type = 'view';
			}
		}

		$table_sql = str_replace($table_name, $table_abstract, $table_sql);

		// Replace newlines with spaces
		$table_sql = str_replace("\n", " ", $table_sql) . ";\n";
		$table_sql = str_replace("\r", " ", $table_sql);
		$table_sql = str_replace("\t", " ", $table_sql);

		// Post-process CREATE VIEW
		if ($type == 'view')
		{
			$pos_view = strpos($table_sql, ' VIEW ');

			if ($pos_view > 7)
			{
				// Only post process if there are view properties between the CREATE and VIEW keywords
				$propstring = substr($table_sql, 7, $pos_view - 7); // Properties string
				// Fetch the ALGORITHM={UNDEFINED | MERGE | TEMPTABLE} keyword
				$algostring = '';
				$algo_start = strpos($propstring, 'ALGORITHM=');
				if ($algo_start !== false)
				{
					$algo_end   = strpos($propstring, ' ', $algo_start);
					$algostring = substr($propstring, $algo_start, $algo_end - $algo_start + 1);
				}
				// Create our modified create statement
				$table_sql = 'CREATE OR REPLACE ' . $algostring . substr($table_sql, $pos_view);
			}
		}

		return $table_sql;
	}

	/**
	 * Does this database server support UTF-8 four byte (utf8mb4) collation?
	 *
	 * libmysql supports utf8mb4 since 5.5.3 (same version as the MySQL server). mysqlnd supports utf8mb4 since 5.0.9.
	 *
	 * This method's code is based on WordPress' wpdb::has_cap() method
	 *
	 * @return  bool
	 */
	protected function supportsUtf8mb4()
	{
		$client_version = mysql_get_client_info();

		if (strpos($client_version, 'mysqlnd') !== false)
		{
			$client_version = preg_replace('/^\D+([\d.]+).*/', '$1', $client_version);

			return version_compare($client_version, '5.0.9', '>=');
		}
		else
		{
			return version_compare($client_version, '5.5.3', '>=');
		}
	}

	protected function unsafe_escape($string)
	{
		if (function_exists('mb_ereg_replace'))
		{
			return mb_ereg_replace('[\x00\x0A\x0D\x1A\x22\x27\x5C]', '\\\0', $string);
		}

		return preg_replace('~[\x00\x0A\x0D\x1A\x22\x27\x5C]~u', '\\\$0', $string);
	}
}
components/com_akeeba/BackupEngine/Driver/Mysqli.php000060400000036424152453623440016571 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Driver;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Driver\Query\Mysqli as QueryMysqli;
use Akeeba\Engine\FixMySQLHostname;
use mysqli_result;
use RuntimeException;

/**
 * MySQL Improved (mysqli) database driver for Akeeba Engine
 *
 * Based on Joomla! Platform 11.2
 */
#[\AllowDynamicProperties]
class Mysqli extends Mysql
{
	use FixMySQLHostname;

	/**
	 * The name of the database driver.
	 *
	 * @var    string
	 * @since  11.1
	 */
	public $name = 'mysqli';

	/** @var \mysqli|null The db connection resource */
	protected $connection = '';

	/** @var mysqli_result|null The database connection cursor from the last query. */
	protected $cursor;

	protected $port;

	protected $socket;

	protected $ssl = [];

	/** @var bool Are we in the process of reconnecting to the database server? */
	private $isReconnecting = false;

	/**
	 * Database object constructor
	 *
	 * @param   array  $options  List of options used to configure the connection
	 */
	public function __construct($options)
	{
		$this->driverType = 'mysql';

		// Init
		$this->nameQuote = '`';

		$options['ssl'] = $options['ssl'] ?? [];
		$options['ssl'] = is_array($options['ssl']) ? $options['ssl'] : [];

		$options['ssl']['enable']             = ($options['ssl']['enable'] ?? $options['dbencryption'] ?? false) ?: false;
		$options['ssl']['cipher']             = ($options['ssl']['cipher'] ?? $options['dbsslcipher'] ?? null) ?: null;
		$options['ssl']['ca']                 = ($options['ssl']['ca'] ?? $options['dbsslca'] ?? null) ?: null;
		$options['ssl']['capath']             = ($options['ssl']['capath'] ?? $options['dbsslcapath'] ?? null) ?: null;
		$options['ssl']['key']                = ($options['ssl']['key'] ?? $options['dbsslkey'] ?? null) ?: null;
		$options['ssl']['cert']               = ($options['ssl']['cert'] ?? $options['dbsslcert'] ?? null) ?: null;
		$options['ssl']['verify_server_cert'] = ($options['ssl']['verify_server_cert'] ?? $options['dbsslverifyservercert'] ?? false) ?: false;

		// Figure out if a port is included in the host name
		$this->fixHostnamePortSocket($options['host'], $options['port'], $options['socket']);

		// Set the information
		$this->host           = $options['host'] ?? 'localhost';
		$this->user           = $options['user'] ?? '';
		$this->password       = $options['password'] ?? '';
		$this->port           = $options['port'] ?? '';
		$this->socket         = $options['socket'] ?? '';
		$this->_database      = $options['database'] ?? '';
		$this->selectDatabase = $options['select'] ?? true;
		$this->ssl            = $options['ssl'] ?? [];

		// Finalize initialization. Also opens the connection.
		parent::__construct($options);
	}

	/**
	 * Test to see if the MySQL connector is available.
	 *
	 * @return  boolean  True on success, false otherwise.
	 */
	public static function isSupported()
	{
		return (function_exists('mysqli_connect'));
	}

	public function close()
	{
		$return = false;

		if (is_object($this->cursor) && ($this->cursor instanceof mysqli_result))
		{
			try
			{
				@$this->cursor->free();
			}
			catch (\Throwable $e)
			{
			}

			$this->cursor = null;
		}

		if (is_object($this->connection) && ($this->connection instanceof \mysqli))
		{
			try
			{
				$return = @$this->connection->close();
			}
			catch (\Throwable $e)
			{
				$return = false;
			}
		}

		$this->connection = null;

		return $return;
	}

	/**
	 * Determines if the connection to the server is active.
	 *
	 * @return  boolean  True if connected to the database engine.
	 */
	public function connected()
	{
		if (!is_object($this->connection))
		{
			return false;
		}

		// mysqli_ping is deprecated since PHP 8.4.
		if (version_compare(PHP_VERSION, '8.4.0', '<'))
		{
			try
			{
				return @mysqli_ping($this->connection);
			}
			catch (\Throwable $e)
			{
				return false;
			}
		}

		try
		{
			$cursor = @mysqli_query($this->connection, 'SELECT 1');

			if (!$cursor)
			{
				return false;
			}

			mysqli_free_result($cursor);

			return true;
		}
		catch (\Throwable $e)
		{
			return false;
		}
	}

	/**
	 * Method to escape a string for usage in an SQL statement.
	 *
	 * @param   string   $text   The string to be escaped.
	 * @param   boolean  $extra  Optional parameter to provide extra escaping.
	 *
	 * @return  string  The escaped string.
	 */
	public function escape($text, $extra = false)
	{
		if (is_null($text))
		{
			return 'NULL';
		}

		$result = @mysqli_real_escape_string($this->getConnection(), $text);

		if ($result === false)
		{
			// Attempt to reconnect.
			try
			{
				$this->connection = null;
				$this->open();

				$result = @mysqli_real_escape_string($this->getConnection(), $text);;
			}
			catch (RuntimeException $e)
			{
				$result = $this->unsafe_escape($text);
			}
		}

		if ($extra)
		{
			$result = addcslashes($result, '%_');
		}

		return $result;
	}

	/**
	 * Method to fetch a row from the result set cursor as an associative array.
	 *
	 * @param   mixed  $cursor  The optional result set cursor from which to fetch the row.
	 *
	 * @return  mixed  Either the next row from the result set or false if there are no more rows.
	 */
	public function fetchAssoc($cursor = null)
	{
		return mysqli_fetch_assoc($cursor ?: $this->cursor);
	}

	/**
	 * Method to free up the memory used for the result set.
	 *
	 * @param   mixed  $cursor  The optional result set cursor from which to fetch the row.
	 *
	 * @return  void
	 */
	public function freeResult($cursor = null)
	{
		mysqli_free_result($cursor ?: $this->cursor);
	}

	/**
	 * Get the number of affected rows for the previous executed SQL statement.
	 *
	 * @return  integer  The number of affected rows.
	 */
	public function getAffectedRows()
	{
		return mysqli_affected_rows($this->connection);
	}

	/**
	 * Get the number of returned rows for the previous executed SQL statement.
	 *
	 * @param   mysqli_result  $cursor  An optional database cursor resource to extract the row count from.
	 *
	 * @return  integer   The number of returned rows.
	 */
	public function getNumRows($cursor = null)
	{
		return mysqli_num_rows($cursor ?: $this->cursor);
	}

	/**
	 * Get the current or query, or new JDatabaseQuery object.
	 *
	 * @param   boolean  $new  False to return the last query set, True to return a new JDatabaseQuery object.
	 *
	 * @return  mixed  The current value of the internal SQL variable or a new JDatabaseQuery object.
	 */
	public function getQuery($new = false)
	{
		if ($new)
		{
			return new QueryMysqli($this);
		}
		else
		{
			return $this->sql;
		}
	}

	public function createQuery()
	{
		return new QueryMysqli($this);
	}

	/**
	 * Get the version of the database connector.
	 *
	 * @return  string  The database connector version.
	 */
	public function getVersion()
	{
		return mysqli_get_server_info($this->connection);
	}

	/**
	 * Determines if the database engine supports UTF-8 character encoding.
	 *
	 * @return  boolean  True if supported.
	 */
	public function hasUTF()
	{
		$mariadb = stripos($this->connection->server_info, 'mariadb') !== false;
		$client_version = mysqli_get_client_info();
		$server_version = $this->getVersion();

		if (version_compare($server_version, '5.5.3', '<'))
		{
			return false;
		}

		if ($mariadb && version_compare($server_version, '10.0.0', '<'))
		{
			return false;
		}

		if (strpos($client_version, 'mysqlnd') !== false)
		{
			$client_version = preg_replace('/^\D+([\d.]+).*/', '$1', $client_version);

			return version_compare($client_version, '5.0.9', '>=');
		}

		return version_compare($client_version, '5.5.3', '>=');
	}

	/**
	 * Method to get the auto-incremented value from the last INSERT statement.
	 *
	 * @return  integer  The value of the auto-increment field from the last inserted row.
	 */
	public function insertid()
	{
		return mysqli_insert_id($this->connection);
	}

	public function open()
	{
		if ($this->connected())
		{
			return;
		}
		else
		{
			$this->close();
		}

		// perform a number of fatality checks, then return gracefully
		if (!function_exists('mysqli_connect'))
		{
			$this->errorNum = 1;
			$this->errorMsg = 'The MySQL adapter "mysqli" is not available.';

			return;
		}

		// Let's prepare a connection
		$this->connection = mysqli_init();

		$connectionFlags = 0;

		// For SSL/TLS connection encryption.
		if ($this->ssl !== [] && $this->ssl['enable'] === true)
		{
			$connectionFlags = $connectionFlags | MYSQLI_CLIENT_SSL;

			// Verify server certificate is only available in PHP 5.6.16+. See https://www.php.net/ChangeLog-5.php#5.6.16
			if (isset($this->ssl['verify_server_cert']))
			{
				// New constants in PHP 5.6.16+. See https://www.php.net/ChangeLog-5.php#5.6.16
				if ($this->ssl['verify_server_cert'] === true && defined('MYSQLI_CLIENT_SSL_VERIFY_SERVER_CERT'))
				{
					$connectionFlags = $connectionFlags | MYSQLI_CLIENT_SSL_VERIFY_SERVER_CERT;
				}
				elseif ($this->ssl['verify_server_cert'] === false && defined('MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT'))
				{
					$connectionFlags = $connectionFlags | MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT;
				}
				elseif (defined('MYSQLI_OPT_SSL_VERIFY_SERVER_CERT'))
				{
					$this->connection->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, $this->ssl['verify_server_cert']);
				}
			}

			// Add SSL/TLS options only if changed.
			$this->connection->ssl_set(
				($this->ssl['key'] ?? null) ?: null,
				($this->ssl['cert'] ?? null) ?: null,
				($this->ssl['ca'] ?? null) ?: null,
				($this->ssl['capath'] ?? null) ?: null,
				($this->ssl['cipher'] ?? null) ?: null
			);
		}

		// Attempt to connect to the server, use error suppression to silence warnings and allow us to throw an Exception separately.
		try
		{
			$connected = @$this->connection->real_connect(
				$this->host,
				$this->user,
				$this->password ?: null,
				null,
				$this->port ?: 3306,
				$this->socket ?: null,
				$connectionFlags
			);
		}
		catch (\Throwable $e)
		{
			$connected = false;
		}

		// connect to the server
		if (!$connected)
		{
			$this->errorNum = 2;
			$this->errorMsg = 'Could not connect to MySQL';

			return;
		}

		// Set sql_mode to non_strict mode
		mysqli_query($this->connection, "SET @@SESSION.sql_mode = '';");

		if ($this->selectDatabase && !empty($this->_database))
		{
			if (!$this->select($this->_database))
			{
				$this->errorNum = 3;
				$this->errorMsg = "Cannot select database {$this->_database}";

				return;
			}
		}

		$this->setUTF();
	}

	/**
	 * Execute the SQL statement.
	 *
	 * @return  mixed  A database cursor resource on success, boolean false on failure.
	 */
	public function query()
	{
		$this->open();

		if (!is_object($this->connection))
		{
			throw new RuntimeException($this->errorMsg, $this->errorNum);
		}

		// Take a local copy so that we don't modify the original query and cause issues later
		$query = $this->replacePrefix((string) $this->sql);
		if ($this->limit > 0 || $this->offset > 0)
		{
			$query .= ' LIMIT ' . $this->offset . ', ' . $this->limit;
		}

		// Increment the query counter.
		$this->count++;

		// If debugging is enabled then let's log the query.
		if ($this->debug)
		{
			// Add the query to the object queue.
			$this->log[] = $query;
		}

		// Reset the error values.
		$this->errorNum = 0;
		$this->errorMsg = '';

		// Execute the query. Error suppression is used here to prevent warnings/notices that the connection has been lost.
		$this->cursor = @mysqli_query($this->connection, $query);

		// If an error occurred handle it.
		if (!$this->cursor)
		{
			$this->errorNum = 0;
			$this->errorMsg = '';

			if ($this->connection)
			{
				$this->errorNum = (int) @mysqli_errno($this->connection);
				$this->errorMsg = (string) @mysqli_error($this->connection) . ' SQL=' . $query;
			}

			// Check if the server was disconnected.
			if (!$this->connected() && !$this->isReconnecting)
			{
				$this->isReconnecting = true;

				try
				{
					// Attempt to reconnect.
					$this->connection = null;
					$this->open();
				}
					// If connect fails, ignore that exception and throw the normal exception.
				catch (RuntimeException $e)
				{
					throw new RuntimeException($this->errorMsg, $this->errorNum);
				}

				// Since we were able to reconnect, run the query again.
				$result               = $this->query();
				$this->isReconnecting = false;

				return $result;
			}
			// The server was not disconnected.
			elseif ($this->errorNum != 0)
			{
				throw new RuntimeException($this->errorMsg, $this->errorNum);
			}
		}

		return $this->cursor;
	}

	/**
	 * Select a database for use.
	 *
	 * @param   string  $database  The name of the database to select for use.
	 *
	 * @return  boolean  True if the database was successfully selected.
	 */
	public function select($database)
	{
		if (!$database)
		{
			return false;
		}

		if (!mysqli_select_db($this->connection, $database))
		{
			return false;
		}

		return true;
	}

	/**
	 * Set the connection to use UTF-8 character encoding.
	 *
	 * @return  boolean  True on success.
	 */
	public function setUTF()
	{
		$result = false;

		if ($this->supportsUtf8mb4())
		{
			$result = @mysqli_set_charset($this->connection, 'utf8mb4');
		}

		if (!$result)
		{
			$result = @mysqli_set_charset($this->connection, 'utf8');
		}

		return $result;

	}

	/**
	 * Does this database server support UTF-8 four byte (utf8mb4) collation?
	 *
	 * libmysql supports utf8mb4 since 5.5.3 (same version as the MySQL server). mysqlnd supports utf8mb4 since 5.0.9.
	 *
	 * This method's code is based on WordPress' wpdb::has_cap() method
	 *
	 * @return  bool
	 */
	public function supportsUtf8mb4()
	{
		$client_version = mysqli_get_client_info();

		if (strpos($client_version, 'mysqlnd') !== false)
		{
			$client_version = preg_replace('/^\D+([\d.]+).*/', '$1', $client_version);

			return version_compare($client_version, '5.0.9', '>=');
		}
		else
		{
			return version_compare($client_version, '5.5.3', '>=');
		}
	}

	/**
	 * Method to fetch a row from the result set cursor as an array.
	 *
	 * @param   mixed  $cursor  The optional result set cursor from which to fetch the row.
	 *
	 * @return  mixed  Either the next row from the result set or false if there are no more rows.
	 */
	protected function fetchArray($cursor = null)
	{
		return mysqli_fetch_row($cursor ?: $this->cursor);
	}

	/**
	 * Method to fetch a row from the result set cursor as an object.
	 *
	 * @param   mixed   $cursor  The optional result set cursor from which to fetch the row.
	 * @param   string  $class   The class name to use for the returned row object.
	 *
	 * @return  mixed   Either the next row from the result set or false if there are no more rows.
	 */
	protected function fetchObject($cursor = null, $class = 'stdClass')
	{
		return mysqli_fetch_object($cursor ?: $this->cursor, $class);
	}
}
components/com_akeeba/BackupEngine/Driver/QueryException.php000060400000001657152453623440020277 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Driver;

defined('AKEEBAENGINE') || die();

use Exception;

class QueryException extends Exception
{
}
components/com_akeeba/BackupEngine/Driver/Query/Base.php000060400000113371152453623440017267 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Driver\Query;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Driver\Base as DriverBase;
use Akeeba\Engine\Driver\Query\Element as QueryElement;
use Akeeba\Engine\Driver\Query\Limitable as QueryLimitable;
use Akeeba\Engine\Driver\QueryException;

/**
 * Query Building Class.
 *
 * Based on Joomla! Platform 11.3
 */
abstract class Base
{
	/**
	 * @var    DriverBase  The database connection resource.
	 */
	protected $db = null;

	/**
	 * @var    string  The SQL query (if a direct query string was provided).
	 */
	protected $sql = null;

	/**
	 * @var    string  The query type.
	 */
	protected $type = '';

	/**
	 * @var    QueryElement  The query element for a generic query (type = null).
	 */
	protected $element = null;

	/**
	 * @var    QueryElement  The select element.
	 */
	protected $select = null;

	/**
	 * @var    QueryElement  The delete element.
	 */
	protected $delete = null;

	/**
	 * @var    QueryElement  The update element.
	 */
	protected $update = null;

	/**
	 * @var    QueryElement  The insert element.
	 */
	protected $insert = null;

	/**
	 * @var    QueryElement  The from element.
	 */
	protected $from = null;

	/**
	 * @var    QueryElement  The join element.
	 */
	protected $join = null;

	/**
	 * @var    QueryElement  The set element.
	 */
	protected $set = null;

	/**
	 * @var    QueryElement  The where element.
	 */
	protected $where = null;

	/**
	 * @var    QueryElement  The group by element.
	 */
	protected $group = null;

	/**
	 * @var    QueryElement  The having element.
	 */
	protected $having = null;

	/**
	 * @var    QueryElement  The column list for an INSERT statement.
	 */
	protected $columns = null;

	/**
	 * @var    QueryElement  The values list for an INSERT statement.
	 */
	protected $values = null;

	/**
	 * @var    QueryElement  The order element.
	 */
	protected $order = null;

	/**
	 * @var   object  The auto increment insert field element.
	 */
	protected $autoIncrementField = null;

	/**
	 * @var    QueryElement  The call element.
	 */
	protected $call = null;

	/**
	 * @var    QueryElement  The exec element.
	 */
	protected $exec = null;

	/**
	 * @var    QueryElement  The union element.
	 */
	protected $union = null;

	/**
	 * @var    QueryElement  The unionAll element.
	 */
	protected $unionAll = null;

	/**
	 * Class constructor.
	 *
	 * @param   DriverBase  $db  The database connector resource.
	 */
	public function __construct(DriverBase $db = null)
	{
		$this->db = $db;
	}

	/**
	 * Magic method to provide method alias support for quote() and quoteName().
	 *
	 * @param   string  $method  The called method.
	 * @param   array   $args    The array of arguments passed to the method.
	 *
	 * @return  string  The aliased method's return value or null.
	 */
	public function __call($method, $args)
	{
		if (empty($args))
		{
			return null;
		}

		switch ($method)
		{
			case 'q':
				return $this->quote($args[0], $args[1] ?? true);
				break;

			case 'qn':
				return $this->quoteName($args[0]);
				break;

			case 'e':
				return $this->escape($args[0], $args[1] ?? false);
				break;
		}

		return null;
	}

	/**
	 * Magic function to convert the query to a string.
	 *
	 * @return  string    The completed query.
	 */
	public function __toString()
	{
		$query = '';

		if ($this->sql)
		{
			return $this->sql;
		}

		switch ($this->type)
		{
			case 'element':
				$query .= (string) $this->element;
				break;

			case 'select':
				$query .= (string) $this->select;
				$query .= (string) $this->from;

				if ($this->join)
				{
					// Special case for joins
					foreach ($this->join as $join)
					{
						$query .= (string) $join;
					}
				}

				if ($this->where)
				{
					$query .= (string) $this->where;
				}

				if ($this->group)
				{
					$query .= (string) $this->group;
				}

				if ($this->having)
				{
					$query .= (string) $this->having;
				}

				if ($this->order)
				{
					$query .= (string) $this->order;
				}

				break;

			case 'union':
				$query .= (string) $this->union;
				break;

			case 'unionAll':
				$query .= (string) $this->unionAll;
				break;

			case 'delete':
				$query .= (string) $this->delete;
				$query .= (string) $this->from;

				if ($this->join)
				{
					// Special case for joins
					foreach ($this->join as $join)
					{
						$query .= (string) $join;
					}
				}

				if ($this->where)
				{
					$query .= (string) $this->where;
				}

				break;

			case 'update':
				$query .= (string) $this->update;

				if ($this->join)
				{
					// Special case for joins
					foreach ($this->join as $join)
					{
						$query .= (string) $join;
					}
				}

				$query .= (string) $this->set;

				if ($this->where)
				{
					$query .= (string) $this->where;
				}

				break;

			case 'insert':
				$query .= (string) $this->insert;

				// Set method
				if ($this->set)
				{
					$query .= (string) $this->set;
				}
				// Columns-Values method
				elseif ($this->values)
				{
					if ($this->columns)
					{
						$query .= (string) $this->columns;
					}

					$elements = $this->values->getElements();

					if (!($elements[0] instanceof $this))
					{
						$query .= ' VALUES ';
					}

					$query .= (string) $this->values;
				}

				break;

			case 'call':
				$query .= (string) $this->call;
				break;

			case 'exec':
				$query .= (string) $this->exec;
				break;
		}

		if ($this instanceof QueryLimitable)
		{
			$query = $this->processLimit($query, $this->limit, $this->offset);
		}

		return $query;
	}

	/**
	 * Magic function to get protected variable value
	 *
	 * @param   string  $name  The name of the variable.
	 *
	 * @return  mixed
	 */
	public function __get($name)
	{
		return $this->$name ?? null;
	}

	/**
	 * Add a single column, or array of columns to the CALL clause of the query.
	 *
	 * Note that you must not mix insert, update, delete and select method calls when building a query.
	 * The call method can, however, be called multiple times in the same query.
	 *
	 * Usage:
	 * $query->call('a.*')->call('b.id');
	 * $query->call(array('a.*', 'b.id'));
	 *
	 * @param   mixed  $columns  A string or an array of field names.
	 *
	 * @return  Base  Returns this object to allow chaining.
	 */
	public function call($columns)
	{
		$this->type = 'call';

		if (is_null($this->call))
		{
			$this->call = new QueryElement('CALL', $columns);
		}
		else
		{
			$this->call->append($columns);
		}

		return $this;
	}

	/**
	 * Casts a value to a char.
	 *
	 * Ensure that the value is properly quoted before passing to the method.
	 *
	 * Usage:
	 * $query->select($query->castAsChar('a'));
	 *
	 * @param   string  $value  The value to cast as a char.
	 *
	 * @return  string  Returns the cast value.
	 */
	public function castAsChar($value)
	{
		return $value;
	}

	/**
	 * Gets the number of characters in a string.
	 *
	 * Note, use 'length' to find the number of bytes in a string.
	 *
	 * Usage:
	 * $query->select($query->charLength('a'));
	 *
	 * @param   string  $field      A value.
	 * @param   string  $operator   Comparison operator between charLength integer value and $condition
	 * @param   string  $condition  Integer value to compare charLength with.
	 *
	 * @return  string  The required char length call.
	 */
	public function charLength($field, $operator = null, $condition = null)
	{
		return 'CHAR_LENGTH(' . $field . ')' . (isset($operator) && isset($condition) ? ' ' . $operator . ' ' . $condition : '');
	}

	/**
	 * Clear data from the query or a specific clause of the query.
	 *
	 * @param   string  $clause  Optionally, the name of the clause to clear, or nothing to clear the whole query.
	 *
	 * @return  Base  Returns this object to allow chaining.
	 */
	public function clear($clause = null)
	{
		$this->sql = null;

		switch ($clause)
		{
			case 'select':
				$this->select = null;
				$this->type   = null;
				break;

			case 'delete':
				$this->delete = null;
				$this->type   = null;
				break;

			case 'update':
				$this->update = null;
				$this->type   = null;
				break;

			case 'insert':
				$this->insert             = null;
				$this->type               = null;
				$this->autoIncrementField = null;
				break;

			case 'from':
				$this->from = null;
				break;

			case 'join':
				$this->join = null;
				break;

			case 'set':
				$this->set = null;
				break;

			case 'where':
				$this->where = null;
				break;

			case 'group':
				$this->group = null;
				break;

			case 'having':
				$this->having = null;
				break;

			case 'order':
				$this->order = null;
				break;

			case 'columns':
				$this->columns = null;
				break;

			case 'values':
				$this->values = null;
				break;

			case 'exec':
				$this->exec = null;
				$this->type = null;
				break;

			case 'call':
				$this->call = null;
				$this->type = null;
				break;

			case 'limit':
				$this->offset = 0;
				$this->limit  = 0;
				break;

			case 'union':
				$this->union = null;
				break;

			case 'unionAll':
				$this->unionAll = null;
				break;

			default:
				$this->type               = null;
				$this->select             = null;
				$this->delete             = null;
				$this->update             = null;
				$this->insert             = null;
				$this->from               = null;
				$this->join               = null;
				$this->set                = null;
				$this->where              = null;
				$this->group              = null;
				$this->having             = null;
				$this->order              = null;
				$this->columns            = null;
				$this->values             = null;
				$this->autoIncrementField = null;
				$this->exec               = null;
				$this->call               = null;
				$this->union              = null;
				$this->unionAll           = null;
				$this->offset             = 0;
				$this->limit              = 0;
				break;
		}

		return $this;
	}

	/**
	 * Adds a column, or array of column names that would be used for an INSERT INTO statement.
	 *
	 * @param   mixed  $columns  A column name, or array of column names.
	 *
	 * @return  Base  Returns this object to allow chaining.
	 */
	public function columns($columns)
	{
		if (is_null($this->columns))
		{
			$this->columns = new QueryElement('()', $columns);
		}
		else
		{
			$this->columns->append($columns);
		}

		return $this;
	}

	/**
	 * Concatenates an array of column names or values.
	 *
	 * Usage:
	 * $query->select($query->concatenate(array('a', 'b')));
	 *
	 * @param   array   $values     An array of values to concatenate.
	 * @param   string  $separator  As separator to place between each value.
	 *
	 * @return  string  The concatenated values.
	 */
	public function concatenate($values, $separator = null)
	{
		if ($separator)
		{
			return 'CONCATENATE(' . implode(' || ' . $this->quote($separator) . ' || ', $values) . ')';
		}
		else
		{
			return 'CONCATENATE(' . implode(' || ', $values) . ')';
		}
	}

	/**
	 * Gets the current date and time.
	 *
	 * Usage:
	 * $query->where('published_up < '.$query->currentTimestamp());
	 *
	 * @return  string
	 */
	public function currentTimestamp()
	{
		return 'CURRENT_TIMESTAMP()';
	}

	/**
	 * Returns a PHP date() function compliant date format for the database driver.
	 *
	 * This method is provided for use where the query object is passed to a function for modification.
	 * If you have direct access to the database object, it is recommended you use the getDateFormat method directly.
	 *
	 * @return  string  The format string.
	 */
	public function dateFormat()
	{
		if (!($this->db instanceof DriverBase))
		{
			throw new QueryException('Invalid database object');
		}

		return $this->db->getDateFormat();
	}

	/**
	 * Creates a formatted dump of the query for debugging purposes.
	 *
	 * Usage:
	 * echo $query->dump();
	 *
	 * @return  string
	 */
	public function dump()
	{
		return '<pre class="AkeebaEngineQuery">' . str_replace('#__', $this->db->getPrefix(), $this) . '</pre>';
	}

	/**
	 * Add a table name to the DELETE clause of the query.
	 *
	 * Note that you must not mix insert, update, delete and select method calls when building a query.
	 *
	 * Usage:
	 * $query->delete('#__a')->where('id = 1');
	 *
	 * @param   string  $table  The name of the table to delete from.
	 *
	 * @return  Base  Returns this object to allow chaining.
	 */
	public function delete($table = null)
	{
		$this->type   = 'delete';
		$this->delete = new QueryElement('DELETE', null);

		if (!empty($table))
		{
			$this->from($table);
		}

		return $this;
	}

	/**
	 * Method to escape a string for usage in an SQL statement.
	 *
	 * This method is provided for use where the query object is passed to a function for modification.
	 * If you have direct access to the database object, it is recommended you use the escape method directly.
	 *
	 * Note that 'e' is an alias for this method as it is in DriverBase.
	 *
	 * @param   string   $text   The string to be escaped.
	 * @param   boolean  $extra  Optional parameter to provide extra escaping.
	 *
	 * @return  string  The escaped string.
	 */
	public function escape($text, $extra = false)
	{
		if (!($this->db instanceof DriverBase))
		{
			throw new QueryException('Invalid database object');
		}

		return $this->db->escape($text, $extra);
	}

	/**
	 * Add a single column, or array of columns to the EXEC clause of the query.
	 *
	 * Note that you must not mix insert, update, delete and select method calls when building a query.
	 * The exec method can, however, be called multiple times in the same query.
	 *
	 * Usage:
	 * $query->exec('a.*')->exec('b.id');
	 * $query->exec(array('a.*', 'b.id'));
	 *
	 * @param   mixed  $columns  A string or an array of field names.
	 *
	 * @return  Base  Returns this object to allow chaining.
	 */
	public function exec($columns)
	{
		$this->type = 'exec';

		if (is_null($this->exec))
		{
			$this->exec = new QueryElement('EXEC', $columns);
		}
		else
		{
			$this->exec->append($columns);
		}

		return $this;
	}

	/**
	 * Add a table to the FROM clause of the query.
	 *
	 * Note that while an array of tables can be provided, it is recommended you use explicit joins.
	 *
	 * Usage:
	 * $query->select('*')->from('#__a');
	 *
	 * @param   mixed   $tables         A string or array of table names.
	 *                                  This can be a Base object (or a child of it) when used
	 *                                  as a subquery in FROM clause along with a value for $subQueryAlias.
	 * @param   string  $subQueryAlias  Alias used when $tables is a Base.
	 *
	 * @return  Base  Returns this object to allow chaining.
	 */
	public function from($tables, $subQueryAlias = null)
	{
		if (is_null($this->from))
		{
			if ($tables instanceof $this)
			{
				if (is_null($subQueryAlias))
				{
					throw new QueryException('Null subquery defined');
				}

				$tables = '( ' . (string) $tables . ' ) AS ' . $this->quoteName($subQueryAlias);
			}

			$this->from = new QueryElement('FROM', $tables);
		}
		else
		{
			$this->from->append($tables);
		}

		return $this;
	}

	/**
	 * Used to get a string to extract year from date column.
	 *
	 * Usage:
	 * $query->select($query->year($query->quoteName('dateColumn')));
	 *
	 * @param   string  $date  Date column containing year to be extracted.
	 *
	 * @return  string  Returns string to extract year from a date.
	 */
	public function year($date)
	{
		return 'YEAR(' . $date . ')';
	}

	/**
	 * Used to get a string to extract month from date column.
	 *
	 * Usage:
	 * $query->select($query->month($query->quoteName('dateColumn')));
	 *
	 * @param   string  $date  Date column containing month to be extracted.
	 *
	 * @return  string  Returns string to extract month from a date.
	 */
	public function month($date)
	{
		return 'MONTH(' . $date . ')';
	}

	/**
	 * Used to get a string to extract day from date column.
	 *
	 * Usage:
	 * $query->select($query->day($query->quoteName('dateColumn')));
	 *
	 * @param   string  $date  Date column containing day to be extracted.
	 *
	 * @return  string  Returns string to extract day from a date.
	 */
	public function day($date)
	{
		return 'DAY(' . $date . ')';
	}

	/**
	 * Used to get a string to extract hour from date column.
	 *
	 * Usage:
	 * $query->select($query->hour($query->quoteName('dateColumn')));
	 *
	 * @param   string  $date  Date column containing hour to be extracted.
	 *
	 * @return  string  Returns string to extract hour from a date.
	 */
	public function hour($date)
	{
		return 'HOUR(' . $date . ')';
	}

	/**
	 * Used to get a string to extract minute from date column.
	 *
	 * Usage:
	 * $query->select($query->minute($query->quoteName('dateColumn')));
	 *
	 * @param   string  $date  Date column containing minute to be extracted.
	 *
	 * @return  string  Returns string to extract minute from a date.
	 */
	public function minute($date)
	{
		return 'MINUTE(' . $date . ')';
	}

	/**
	 * Used to get a string to extract seconds from date column.
	 *
	 * Usage:
	 * $query->select($query->second($query->quoteName('dateColumn')));
	 *
	 * @param   string  $date  Date column containing second to be extracted.
	 *
	 * @return  string  Returns string to extract second from a date.
	 */
	public function second($date)
	{
		return 'SECOND(' . $date . ')';
	}

	/**
	 * Add a grouping column to the GROUP clause of the query.
	 *
	 * Usage:
	 * $query->group('id');
	 *
	 * @param   mixed  $columns  A string or array of ordering columns.
	 *
	 * @return  Base  Returns this object to allow chaining.
	 */
	public function group($columns)
	{
		if (is_null($this->group))
		{
			$this->group = new QueryElement('GROUP BY', $columns);
		}
		else
		{
			$this->group->append($columns);
		}

		return $this;
	}

	/**
	 * A conditions to the HAVING clause of the query.
	 *
	 * Usage:
	 * $query->group('id')->having('COUNT(id) > 5');
	 *
	 * @param   mixed   $conditions  A string or array of columns.
	 * @param   string  $glue        The glue by which to join the conditions. Defaults to AND.
	 *
	 * @return  Base  Returns this object to allow chaining.
	 */
	public function having($conditions, $glue = 'AND')
	{
		if (is_null($this->having))
		{
			$glue         = strtoupper($glue);
			$this->having = new QueryElement('HAVING', $conditions, " $glue ");
		}
		else
		{
			$this->having->append($conditions);
		}

		return $this;
	}

	/**
	 * Add an INNER JOIN clause to the query.
	 *
	 * Usage:
	 * $query->innerJoin('b ON b.id = a.id')->innerJoin('c ON c.id = b.id');
	 *
	 * @param   string  $condition  The join condition.
	 *
	 * @return  Base  Returns this object to allow chaining.
	 */
	public function innerJoin($condition)
	{
		$this->join('INNER', $condition);

		return $this;
	}

	/**
	 * Add a table name to the INSERT clause of the query.
	 *
	 * Note that you must not mix insert, update, delete and select method calls when building a query.
	 *
	 * Usage:
	 * $query->insert('#__a')->set('id = 1');
	 * $query->insert('#__a')->columns('id, title')->values('1,2')->values('3,4');
	 * $query->insert('#__a')->columns('id, title')->values(array('1,2', '3,4'));
	 *
	 * @param   mixed    $table           The name of the table to insert data into.
	 * @param   boolean  $incrementField  The name of the field to auto increment.
	 *
	 * @return  Base  Returns this object to allow chaining.
	 */
	public function insert($table, $incrementField = false)
	{
		$this->type               = 'insert';
		$this->insert             = new QueryElement('INSERT INTO', $table);
		$this->autoIncrementField = $incrementField;

		return $this;
	}

	/**
	 * Add a JOIN clause to the query.
	 *
	 * Usage:
	 * $query->join('INNER', 'b ON b.id = a.id);
	 *
	 * @param   string  $type        The type of join. This string is prepended to the JOIN keyword.
	 * @param   string  $conditions  A string or array of conditions.
	 *
	 * @return  Base  Returns this object to allow chaining.
	 */
	public function join($type, $conditions)
	{
		if (is_null($this->join))
		{
			$this->join = [];
		}
		$this->join[] = new QueryElement(strtoupper($type) . ' JOIN', $conditions);

		return $this;
	}

	/**
	 * Add a LEFT JOIN clause to the query.
	 *
	 * Usage:
	 * $query->leftJoin('b ON b.id = a.id')->leftJoin('c ON c.id = b.id');
	 *
	 * @param   string  $condition  The join condition.
	 *
	 * @return  Base  Returns this object to allow chaining.
	 */
	public function leftJoin($condition)
	{
		$this->join('LEFT', $condition);

		return $this;
	}

	/**
	 * Get the length of a string in bytes.
	 *
	 * Note, use 'charLength' to find the number of characters in a string.
	 *
	 * Usage:
	 * query->where($query->length('a').' > 3');
	 *
	 * @param   string  $value  The string to measure.
	 *
	 * @return  int
	 */
	public function length($value)
	{
		return 'LENGTH(' . $value . ')';
	}

	/**
	 * Get the null or zero representation of a timestamp for the database driver.
	 *
	 * This method is provided for use where the query object is passed to a function for modification.
	 * If you have direct access to the database object, it is recommended you use the nullDate method directly.
	 *
	 * Usage:
	 * $query->where('modified_date <> '.$query->nullDate());
	 *
	 * @param   boolean  $quoted  Optionally wraps the null date in database quotes (true by default).
	 *
	 * @return  string  Null or zero representation of a timestamp.
	 */
	public function nullDate($quoted = true)
	{
		if (!($this->db instanceof DriverBase))
		{
			throw new QueryException('Invalid database object');
		}

		$result = $this->db->getNullDate();

		if ($quoted)
		{
			return $this->db->quote($result);
		}

		return $result;
	}

	/**
	 * Add a ordering column to the ORDER clause of the query.
	 *
	 * Usage:
	 * $query->order('foo')->order('bar');
	 * $query->order(array('foo','bar'));
	 *
	 * @param   mixed  $columns  A string or array of ordering columns.
	 *
	 * @return  Base  Returns this object to allow chaining.
	 */
	public function order($columns)
	{
		if (is_null($this->order))
		{
			$this->order = new QueryElement('ORDER BY', $columns);
		}
		else
		{
			$this->order->append($columns);
		}

		return $this;
	}

	/**
	 * Add an OUTER JOIN clause to the query.
	 *
	 * Usage:
	 * $query->outerJoin('b ON b.id = a.id')->outerJoin('c ON c.id = b.id');
	 *
	 * @param   string  $condition  The join condition.
	 *
	 * @return  Base  Returns this object to allow chaining.
	 */
	public function outerJoin($condition)
	{
		$this->join('OUTER', $condition);

		return $this;
	}

	/**
	 * Method to quote and optionally escape a string to database requirements for insertion into the database.
	 *
	 * This method is provided for use where the query object is passed to a function for modification.
	 * If you have direct access to the database object, it is recommended you use the quote method directly.
	 *
	 * Note that 'q' is an alias for this method as it is in DriverBase.
	 *
	 * Usage:
	 * $query->quote('fulltext');
	 * $query->q('fulltext');
	 * $query->q(array('option', 'fulltext'));
	 *
	 * @param   mixed    $text    A string or an array of strings to quote.
	 * @param   boolean  $escape  True to escape the string, false to leave it unchanged.
	 *
	 * @return  string  The quoted input string.
	 *
	 * @throws  QueryException if the internal db property is not a valid object.
	 */
	public function quote($text, $escape = true)
	{
		if (!($this->db instanceof DriverBase))
		{
			throw new QueryException('Invalid database object');
		}

		return $this->db->quote($text, $escape);
	}

	/**
	 * Wrap an SQL statement identifier name such as column, table or database names in quotes to prevent injection
	 * risks and reserved word conflicts.
	 *
	 * This method is provided for use where the query object is passed to a function for modification.
	 * If you have direct access to the database object, it is recommended you use the quoteName method directly.
	 *
	 * Note that 'qn' is an alias for this method as it is in DriverBase.
	 *
	 * Usage:
	 * $query->quoteName('#__a');
	 * $query->qn('#__a');
	 *
	 * @param   mixed  $name  The identifier name to wrap in quotes, or an array of identifier names to wrap in quotes.
	 *                        Each type supports dot-notation name.
	 * @param   mixed  $as    The AS query part associated to $name. It can be string or array, in latter case it has
	 *                        to be same length of $name; if is null there will not be any AS part for string or array
	 *                        element.
	 *
	 * @return  mixed  The quote wrapped name, same type of $name.
	 *
	 * @throws  QueryException if the internal db property is not a valid object.
	 */
	public function quoteName($name, $as = null)
	{
		if (!($this->db instanceof DriverBase))
		{
			throw new QueryException('Invalid database object');
		}

		return $this->db->quoteName($name, $as);
	}

	/**
	 * Add a RIGHT JOIN clause to the query.
	 *
	 * Usage:
	 * $query->rightJoin('b ON b.id = a.id')->rightJoin('c ON c.id = b.id');
	 *
	 * @param   string  $condition  The join condition.
	 *
	 * @return  Base  Returns this object to allow chaining.
	 */
	public function rightJoin($condition)
	{
		$this->join('RIGHT', $condition);

		return $this;
	}

	/**
	 * Add a single column, or array of columns to the SELECT clause of the query.
	 *
	 * Note that you must not mix insert, update, delete and select method calls when building a query.
	 * The select method can, however, be called multiple times in the same query.
	 *
	 * Usage:
	 * $query->select('a.*')->select('b.id');
	 * $query->select(array('a.*', 'b.id'));
	 *
	 * @param   mixed  $columns  A string or an array of field names.
	 *
	 * @return  Base  Returns this object to allow chaining.
	 */
	public function select($columns)
	{
		$this->type = 'select';

		if (is_null($this->select))
		{
			$this->select = new QueryElement('SELECT', $columns);
		}
		else
		{
			$this->select->append($columns);
		}

		return $this;
	}

	/**
	 * Add a single condition string, or an array of strings to the SET clause of the query.
	 *
	 * Usage:
	 * $query->set('a = 1')->set('b = 2');
	 * $query->set(array('a = 1', 'b = 2');
	 *
	 * @param   mixed   $conditions  A string or array of string conditions.
	 * @param   string  $glue        The glue by which to join the condition strings. Defaults to ,.
	 *                               Note that the glue is set on first use and cannot be changed.
	 *
	 * @return  Base  Returns this object to allow chaining.
	 */
	public function set($conditions, $glue = ',')
	{
		if (is_null($this->set))
		{
			$glue      = strtoupper($glue);
			$this->set = new QueryElement('SET', $conditions, "\n\t$glue ");
		}
		else
		{
			$this->set->append($conditions);
		}

		return $this;
	}

	/**
	 * Allows a direct query to be provided to the database
	 * driver's setQuery() method, but still allow queries
	 * to have bounded variables.
	 *
	 * Usage:
	 * $query->setQuery('select * from #__users');
	 *
	 * @param   mixed  $query  An SQL Query
	 *
	 * @return  QueryElement  Returns this object to allow chaining.
	 */
	public function setQuery($query)
	{
		$this->sql = $query;

		return $this;
	}

	/**
	 * Add a table name to the UPDATE clause of the query.
	 *
	 * Note that you must not mix insert, update, delete and select method calls when building a query.
	 *
	 * Usage:
	 * $query->update('#__foo')->set(...);
	 *
	 * @param   string  $table  A table to update.
	 *
	 * @return  Base  Returns this object to allow chaining.
	 */
	public function update($table)
	{
		$this->type   = 'update';
		$this->update = new QueryElement('UPDATE', $table);

		return $this;
	}

	/**
	 * Adds a tuple, or array of tuples that would be used as values for an INSERT INTO statement.
	 *
	 * Usage:
	 * $query->values('1,2,3')->values('4,5,6');
	 * $query->values(array('1,2,3', '4,5,6'));
	 *
	 * @param   string  $values  A single tuple, or array of tuples.
	 *
	 * @return  Base  Returns this object to allow chaining.
	 */
	public function values($values)
	{
		if (is_null($this->values))
		{
			$this->values = new QueryElement('()', $values, '),(');
		}
		else
		{
			$this->values->append($values);
		}

		return $this;
	}

	/**
	 * Add a single condition, or an array of conditions to the WHERE clause of the query.
	 *
	 * Usage:
	 * $query->where('a = 1')->where('b = 2');
	 * $query->where(array('a = 1', 'b = 2'));
	 *
	 * @param   mixed   $conditions  A string or array of where conditions.
	 * @param   string  $glue        The glue by which to join the conditions. Defaults to AND.
	 *                               Note that the glue is set on first use and cannot be changed.
	 *
	 * @return  Base  Returns this object to allow chaining.
	 */
	public function where($conditions, $glue = 'AND')
	{
		if (is_null($this->where))
		{
			$glue        = strtoupper($glue);
			$this->where = new QueryElement('WHERE', $conditions, " $glue ");
		}
		else
		{
			$this->where->append($conditions);
		}

		return $this;
	}

	/**
	 * Method to provide deep copy support to nested objects and
	 * arrays when cloning.
	 *
	 * @return  void
	 */
	public function __clone()
	{
		foreach ($this as $k => $v)
		{
			if ($k === 'db')
			{
				continue;
			}

			if (is_object($v) || is_array($v))
			{
				$this->$k = unserialize(serialize($v));
			}
		}
	}

	/**
	 * Add a query to UNION with the current query.
	 * Multiple unions each require separate statements and create an array of unions.
	 *
	 * Usage:
	 * $query->union('SELECT name FROM  #__foo')
	 * $query->union('SELECT name FROM  #__foo','distinct')
	 * $query->union(array('SELECT name FROM  #__foo','SELECT name FROM  #__bar'))
	 *
	 * @param   mixed    $query     The Base object or string to union.
	 * @param   boolean  $distinct  True to only return distinct rows from the union.
	 * @param   string   $glue      The glue by which to join the conditions.
	 *
	 * @return  mixed    The Base object on success or boolean false on failure.
	 */
	public function union($query, $distinct = false, $glue = '')
	{
		// Clear any ORDER BY clause in UNION query
		// See http://dev.mysql.com/doc/refman/5.0/en/union.html
		if (!is_null($this->order))
		{
			$this->clear('order');
		}

		// Set up the DISTINCT flag, the name with parentheses, and the glue.
		if ($distinct)
		{
			$name = 'UNION DISTINCT ()';
			$glue = ')' . PHP_EOL . 'UNION DISTINCT (';
		}
		else
		{
			$glue = ')' . PHP_EOL . 'UNION (';
			$name = 'UNION ()';
		}

		// Get the QueryElement if it does not exist
		if (is_null($this->union))
		{
			$this->union = new QueryElement($name, $query, "$glue");
		}
		// Otherwise append the second UNION.
		else
		{
			$glue = '';
			$this->union->append($query);
		}

		return $this;
	}

	/**
	 * Add a query to UNION DISTINCT with the current query. Simply a proxy to Union with the Distinct clause.
	 *
	 * Usage:
	 * $query->unionDistinct('SELECT name FROM  #__foo')
	 *
	 * @param   mixed   $query  The Base object or string to union.
	 * @param   string  $glue   The glue by which to join the conditions.
	 *
	 * @return  mixed   The Base object on success or boolean false on failure.
	 */
	public function unionDistinct($query, $glue = '')
	{
		$distinct = true;

		// Apply the distinct flag to the union.
		return $this->union($query, $distinct, $glue);
	}

	/**
	 * Find and replace sprintf-like tokens in a format string.
	 * Each token takes one of the following forms:
	 *     %%       - A literal percent character.
	 *     %[t]     - Where [t] is a type specifier.
	 *     %[n]$[x] - Where [n] is an argument specifier and [t] is a type specifier.
	 *
	 * Types:
	 * a - Numeric: Replacement text is coerced to a numeric type but not quoted or escaped.
	 * e - Escape: Replacement text is passed to $this->escape().
	 * E - Escape (extra): Replacement text is passed to $this->escape() with true as the second argument.
	 * n - Name Quote: Replacement text is passed to $this->quoteName().
	 * q - Quote: Replacement text is passed to $this->quote().
	 * Q - Quote (no escape): Replacement text is passed to $this->quote() with false as the second argument.
	 * r - Raw: Replacement text is used as-is. (Be careful)
	 *
	 * Date Types:
	 * - Replacement text automatically quoted (use uppercase for Name Quote).
	 * - Replacement text should be a string in date format or name of a date column.
	 * y/Y - Year
	 * m/M - Month
	 * d/D - Day
	 * h/H - Hour
	 * i/I - Minute
	 * s/S - Second
	 *
	 * Invariable Types:
	 * - Takes no argument.
	 * - Argument index not incremented.
	 * t - Replacement text is the result of $this->currentTimestamp().
	 * z - Replacement text is the result of $this->nullDate(false).
	 * Z - Replacement text is the result of $this->nullDate(true).
	 *
	 * Usage:
	 * $query->format('SELECT %1$n FROM %2$n WHERE %3$n = %4$a', 'foo', '#__foo', 'bar', 1);
	 * Returns: SELECT `foo` FROM `#__foo` WHERE `bar` = 1
	 *
	 * Notes:
	 * The argument specifier is optional but recommended for clarity.
	 * The argument index used for unspecified tokens is incremented only when used.
	 *
	 * @param   string  $format  The formatting string.
	 *
	 * @return  string  Returns a string produced according to the formatting string.
	 */
	public function format($format)
	{
		$query = $this;
		$args  = array_slice(func_get_args(), 1);
		array_unshift($args, null);

		$i    = 1;
		$func = function ($match) use ($query, $args, &$i) {
			if (isset($match[6]) && $match[6] == '%')
			{
				return '%';
			}

			// No argument required, do not increment the argument index.
			switch ($match[5])
			{
				case 't':
					return $query->currentTimestamp();
					break;

				case 'z':
					return $query->nullDate(false);
					break;

				case 'Z':
					return $query->nullDate(true);
					break;
			}

			// Increment the argument index only if argument specifier not provided.
			$index = is_numeric($match[4]) ? (int) $match[4] : $i++;

			if (!$index || !isset($args[$index]))
			{
				$replacement = '';
			}
			else
			{
				$replacement = $args[$index];
			}

			switch ($match[5])
			{
				case 'a':
					return 0 + $replacement;
					break;

				case 'e':
					return $query->escape($replacement);
					break;

				case 'E':
					return $query->escape($replacement, true);
					break;

				case 'n':
					return $query->quoteName($replacement);
					break;

				case 'q':
					return $query->quote($replacement);
					break;

				case 'Q':
					return $query->quote($replacement, false);
					break;

				case 'r':
					return $replacement;
					break;

				// Dates
				case 'y':
					return $query->year($query->quote($replacement));
					break;

				case 'Y':
					return $query->year($query->quoteName($replacement));
					break;

				case 'm':
					return $query->month($query->quote($replacement));
					break;

				case 'M':
					return $query->month($query->quoteName($replacement));
					break;

				case 'd':
					return $query->day($query->quote($replacement));
					break;

				case 'D':
					return $query->day($query->quoteName($replacement));
					break;

				case 'h':
					return $query->hour($query->quote($replacement));
					break;

				case 'H':
					return $query->hour($query->quoteName($replacement));
					break;

				case 'i':
					return $query->minute($query->quote($replacement));
					break;

				case 'I':
					return $query->minute($query->quoteName($replacement));
					break;

				case 's':
					return $query->second($query->quote($replacement));
					break;

				case 'S':
					return $query->second($query->quoteName($replacement));
					break;
			}

			return '';
		};

		/**
		 * Regexp to find an replace all tokens.
		 * Matched fields:
		 * 0: Full token
		 * 1: Everything following '%'
		 * 2: Everything following '%' unless '%'
		 * 3: Argument specifier and '$'
		 * 4: Argument specifier
		 * 5: Type specifier
		 * 6: '%' if full token is '%%'
		 */

		return preg_replace_callback('#%(((([\d]+)\$)?([aeEnqQryYmMdDhHiIsStzZ]))|(%))#', $func, $format);
	}

	/**
	 * Add to the current date and time.
	 * Usage:
	 * $query->select($query->dateAdd());
	 * Prefixing the interval with a - (negative sign) will cause subtraction to be used.
	 * Note: Not all drivers support all units.
	 *
	 * @param   string  $date      The SQL-formatted date to add to. May be a date or datetime string.
	 * @param   string  $interval  The string representation of the appropriate number of units
	 * @param   string  $datePart  The part of the date to perform the addition on
	 *
	 * @return  string  The string with the appropriate sql for addition of dates
	 *
	 * @see http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date-add
	 */
	public function dateAdd($date, $interval, $datePart)
	{
		return trim("DATE_ADD('" . $date . "', INTERVAL " . $interval . ' ' . $datePart . ')');
	}

	/**
	 * Add a query to UNION ALL with the current query.
	 * Multiple unions each require separate statements and create an array of unions.
	 *
	 * Usage:
	 * $query->union('SELECT name FROM  #__foo')
	 * $query->union('SELECT name FROM  #__foo','distinct')
	 * $query->union(array('SELECT name FROM  #__foo','SELECT name FROM  #__bar'))
	 *
	 * @param   mixed    $query     The Base object or string to union.
	 * @param   boolean  $distinct  True to only return distinct rows from the union.
	 * @param   string   $glue      The glue by which to join the conditions.
	 *
	 * @return  mixed    The Base object on success or boolean false on failure.
	 */
	public function unionAll($query, $distinct = false, $glue = '')
	{
		$glue = ')' . PHP_EOL . 'UNION ALL (';
		$name = 'UNION ALL ()';

		// Get the QueryElement if it does not exist
		if (is_null($this->unionAll))
		{
			$this->unionAll = new QueryElement($name, $query, "$glue");
		}

		// Otherwise append the second UNION.
		else
		{
			$glue = '';
			$this->unionAll->append($query);
		}

		return $this;
	}
}
components/com_akeeba/BackupEngine/Driver/Query/Mysqli.php000060400000005644152453623440017676 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Driver\Query;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Driver\Query\Base as BaseQuery;

/**
 * Query Building Class.
 *
 * Based on Joomla! Platform 11.3
 */
class Mysqli extends Base implements Limitable
{
	/**
	 * @var    integer  The offset for the result set.
	 */
	protected $offset;

	/**
	 * @var    integer  The limit for the result set.
	 */
	protected $limit;

	/**
	 * Method to modify a query already in string format with the needed
	 * additions to make the query limited to a particular number of
	 * results, or start at a particular offset.
	 *
	 * @param   string   $query   The query in string format
	 * @param   integer  $limit   The limit for the result set
	 * @param   integer  $offset  The offset for the result set
	 *
	 * @return string
	 */
	public function processLimit($query, $limit, $offset = 0)
	{
		if ($limit > 0 || $offset > 0)
		{
			$query .= ' LIMIT ' . $offset . ', ' . $limit;
		}

		return $query;
	}

	/**
	 * Sets the offset and limit for the result set, if the database driver supports it.
	 *
	 * Usage:
	 * $query->setLimit(100, 0); (retrieve 100 rows, starting at first record)
	 * $query->setLimit(50, 50); (retrieve 50 rows, starting at 50th record)
	 *
	 * @param   integer  $limit   The limit for the result set
	 * @param   integer  $offset  The offset for the result set
	 *
	 * @return  BaseQuery  Returns this object to allow chaining.
	 */
	public function setLimit($limit = 0, $offset = 0)
	{
		$this->limit  = (int) $limit;
		$this->offset = (int) $offset;

		return $this;
	}

	/**
	 * Concatenates an array of column names or values.
	 *
	 * @param   array   $values     An array of values to concatenate.
	 * @param   string  $separator  As separator to place between each value.
	 *
	 * @return  string  The concatenated values.
	 */
	public function concatenate($values, $separator = null)
	{
		if ($separator)
		{
			$concat_string = 'CONCAT_WS(' . $this->quote($separator);

			foreach ($values as $value)
			{
				$concat_string .= ', ' . $value;
			}

			return $concat_string . ')';
		}
		else
		{
			return 'CONCAT(' . implode(',', $values) . ')';
		}
	}
}
components/com_akeeba/BackupEngine/Driver/Query/Pdomysql.php000060400000001767152453623440020232 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Driver\Query;

defined('AKEEBAENGINE') || die();

/**
 * Query Building Class.
 *
 * Based on Joomla! Platform 11.3
 */
class Pdomysql extends Mysqli implements Limitable
{
}
components/com_akeeba/BackupEngine/Driver/Query/Limitable.php000060400000004427152453623440020320 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Driver\Query;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Driver\Query\Base as BaseQuery;

/**
 * Query Limitable Interface.
 * Adds bind/unbind methods as well as a getBounded() method
 * to retrieve the stored bounded variables on demand prior to
 * query execution.
 *
 * Based on Joomla! Platform 11.2
 */
interface Limitable
{
	/**
	 * Method to modify a query already in string format with the needed
	 * additions to make the query limited to a particular number of
	 * results, or start at a particular offset. This method is used
	 * automatically by the __toString() method if it detects that the
	 * query implements the Limitable interface.
	 *
	 * @param   string   $query   The query in string format
	 * @param   integer  $limit   The limit for the result set
	 * @param   integer  $offset  The offset for the result set
	 *
	 * @return  string
	 *
	 * @since   12.1
	 */
	public function processLimit($query, $limit, $offset = 0);

	/**
	 * Sets the offset and limit for the result set, if the database driver supports it.
	 *
	 * Usage:
	 * $query->setLimit(100, 0); (retrieve 100 rows, starting at first record)
	 * $query->setLimit(50, 50); (retrieve 50 rows, starting at 50th record)
	 *
	 * @param   integer  $limit   The limit for the result set
	 * @param   integer  $offset  The offset for the result set
	 *
	 * @return  BaseQuery  Returns this object to allow chaining.
	 *
	 * @since   12.1
	 */
	public function setLimit($limit = 0, $offset = 0);
}
components/com_akeeba/BackupEngine/Driver/Query/Mysql.php000060400000001737152453623440017524 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Driver\Query;

defined('AKEEBAENGINE') || die();

/**
 * Query Building Class.
 *
 * Based on Joomla! Platform 11.3
 */
class Mysql extends Mysqli
{
}
components/com_akeeba/BackupEngine/Driver/Query/Element.php000060400000005235152453623440020005 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Driver\Query;

defined('AKEEBAENGINE') || die();

/**
 * Query Element Class.
 *
 * Based on Joomla! Platform 11.3
 */
class Element
{
	/**
	 * @var    string  The name of the element.
	 */
	protected $name = null;

	/**
	 * @var    array  An array of elements.
	 */
	protected $elements = null;

	/**
	 * @var    string  Glue piece.
	 */
	protected $glue = null;

	/**
	 * Constructor.
	 *
	 * @param   string  $name      The name of the element.
	 * @param   mixed   $elements  String or array.
	 * @param   string  $glue      The glue for elements.
	 */
	public function __construct($name, $elements, $glue = ',')
	{
		$this->elements = [];
		$this->name     = $name;
		$this->glue     = $glue;

		$this->append($elements);
	}

	/**
	 * Magic function to convert the query element to a string.
	 *
	 * @return  string
	 */
	public function __toString()
	{
		if (substr($this->name, -2) == '()')
		{
			return PHP_EOL . substr($this->name, 0, -2) . '(' . implode($this->glue, $this->elements) . ')';
		}
		else
		{
			return PHP_EOL . $this->name . ' ' . implode($this->glue, $this->elements);
		}
	}

	/**
	 * Appends element parts to the internal list.
	 *
	 * @param   mixed  $elements  String or array.
	 *
	 * @return  void
	 */
	public function append($elements)
	{
		if (is_array($elements))
		{
			$this->elements = array_merge($this->elements, $elements);
		}
		else
		{
			$this->elements = array_merge($this->elements, [$elements]);
		}
	}

	/**
	 * Gets the elements of this element.
	 *
	 * @return  string
	 */
	public function getElements()
	{
		return $this->elements;
	}

	/**
	 * Method to provide deep copy support to nested objects and arrays
	 * when cloning.
	 *
	 * @return  void
	 */
	public function __clone()
	{
		foreach ($this as $k => $v)
		{
			if (is_object($v) || is_array($v))
			{
				$this->{$k} = unserialize(serialize($v));
			}
		}
	}
}
components/com_akeeba/BackupEngine/Driver/Query/Sqlite.php000060400000014741152453623440017657 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Driver\Query;

defined('AKEEBAENGINE') || die();

use PDO;
use stdClass;

/**
 * SQLite Query Building Class.
 *
 * @since  1.0
 */
class Sqlite extends Base implements Preparable, Limitable
{
	/**
	 * The limit for the result set.
	 *
	 * @var    integer
	 * @since  1.0
	 */
	protected $limit;

	/**
	 * The offset for the result set.
	 *
	 * @var    integer
	 * @since  1.0
	 */
	protected $offset;

	/**
	 * Holds key / value pair of bound objects.
	 *
	 * @var    mixed
	 * @since  1.0
	 */
	protected $bounded = [];

	/**
	 * Method to add a variable to an internal array that will be bound to a prepared SQL statement before query execution. Also
	 * removes a variable that has been bounded from the internal bounded array when the passed in value is null.
	 *
	 * @param   string|integer   $key            The key that will be used in your SQL query to reference the value. Usually of
	 *                                           the form ':key', but can also be an integer.
	 * @param   mixed           &$value          The value that will be bound. The value is passed by reference to support output
	 *                                           parameters such as those possible with stored procedures.
	 * @param   integer          $dataType       Constant corresponding to a SQL datatype.
	 * @param   integer          $length         The length of the variable. Usually required for OUTPUT parameters.
	 * @param   array            $driverOptions  Optional driver options to be used.
	 *
	 * @return  Sqlite  Returns this object to allow chaining.
	 *
	 * @since   1.0
	 */
	public function bind($key = null, &$value = null, $dataType = PDO::PARAM_STR, $length = 0, $driverOptions = [])
	{
		// Case 1: Empty Key (reset $bounded array)
		if (empty($key))
		{
			$this->bounded = [];

			return $this;
		}

		// Case 2: Key Provided, null value (unset key from $bounded array)
		if (is_null($value))
		{
			if (isset($this->bounded[$key]))
			{
				unset($this->bounded[$key]);
			}

			return $this;
		}

		$obj = new stdClass;

		$obj->value         = &$value;
		$obj->dataType      = $dataType;
		$obj->length        = $length;
		$obj->driverOptions = $driverOptions;

		// Case 3: Simply add the Key/Value into the bounded array
		$this->bounded[$key] = $obj;

		return $this;
	}

	/**
	 * Retrieves the bound parameters array when key is null and returns it by reference. If a key is provided then that item is
	 * returned.
	 *
	 * @param   mixed  $key  The bounded variable key to retrieve.
	 *
	 * @return  mixed
	 *
	 * @since   1.0
	 */
	public function &getBounded($key = null)
	{
		if (empty($key))
		{
			return $this->bounded;
		}
		else
		{
			if (isset($this->bounded[$key]))
			{
				return $this->bounded[$key];
			}
		}
	}

	/**
	 * Gets the number of characters in a string.
	 *
	 * Note, use 'length' to find the number of bytes in a string.
	 *
	 * Usage:
	 * $query->select($query->charLength('a'));
	 *
	 * @param   string  $field      A value.
	 * @param   string  $operator   Comparison operator between charLength integer value and $condition
	 * @param   string  $condition  Integer value to compare charLength with.
	 *
	 * @return  string  The required char length call.
	 *
	 * @since   1.1.0
	 */
	public function charLength($field, $operator = null, $condition = null)
	{
		return 'length(' . $field . ')' . (isset($operator) && isset($condition) ? ' ' . $operator . ' ' . $condition : '');
	}

	/**
	 * Clear data from the query or a specific clause of the query.
	 *
	 * @param   string  $clause  Optionally, the name of the clause to clear, or nothing to clear the whole query.
	 *
	 * @return  Sqlite  Returns this object to allow chaining.
	 *
	 * @since   1.0
	 */
	public function clear($clause = null)
	{
		switch ($clause)
		{
			case null:
				$this->bounded = [];
				break;
		}

		return parent::clear($clause);
	}

	/**
	 * Concatenates an array of column names or values.
	 *
	 * Usage:
	 * $query->select($query->concatenate(array('a', 'b')));
	 *
	 * @param   array   $values     An array of values to concatenate.
	 * @param   string  $separator  As separator to place between each value.
	 *
	 * @return  string  The concatenated values.
	 *
	 * @since   1.1.0
	 */
	public function concatenate($values, $separator = null)
	{
		if ($separator)
		{
			return implode(' || ' . $this->quote($separator) . ' || ', $values);
		}
		else
		{
			return implode(' || ', $values);
		}
	}

	/**
	 * Method to modify a query already in string format with the needed
	 * additions to make the query limited to a particular number of
	 * results, or start at a particular offset. This method is used
	 * automatically by the __toString() method if it detects that the
	 * query implements the LimitableInterface.
	 *
	 * @param   string   $query   The query in string format
	 * @param   integer  $limit   The limit for the result set
	 * @param   integer  $offset  The offset for the result set
	 *
	 * @return  string
	 *
	 * @since   1.0
	 */
	public function processLimit($query, $limit, $offset = 0)
	{
		if ($limit > 0 || $offset > 0)
		{
			$query .= ' LIMIT ' . $offset . ', ' . $limit;
		}

		return $query;
	}

	/**
	 * Sets the offset and limit for the result set, if the database driver supports it.
	 *
	 * Usage:
	 * $query->setLimit(100, 0); (retrieve 100 rows, starting at first record)
	 * $query->setLimit(50, 50); (retrieve 50 rows, starting at 50th record)
	 *
	 * @param   integer  $limit   The limit for the result set
	 * @param   integer  $offset  The offset for the result set
	 *
	 * @return  Sqlite  Returns this object to allow chaining.
	 *
	 * @since   1.0
	 */
	public function setLimit($limit = 0, $offset = 0)
	{
		$this->limit  = (int) $limit;
		$this->offset = (int) $offset;

		return $this;
	}
}
components/com_akeeba/BackupEngine/Driver/Query/Preparable.php000060400000005067152453623440020474 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Driver\Query;

defined('AKEEBAENGINE') || die();

use PDO;

/**
 * Database Query Preparable Interface.
 *
 * Adds bind/unbind methods as well as a getBounded() method
 * to retrieve the stored bounded variables on demand prior to
 * query execution.
 *
 * @since  1.0
 *
 * @codeCoverageIgnore
 */
interface Preparable
{
	/**
	 * Method to add a variable to an internal array that will be bound to a prepared SQL statement before query execution. Also
	 * removes a variable that has been bounded from the internal bounded array when the passed in value is null.
	 *
	 * @param   string|integer   $key            The key that will be used in your SQL query to reference the value. Usually of
	 *                                           the form ':key', but can also be an integer.
	 * @param   mixed           &$value          The value that will be bound. The value is passed by reference to support output
	 *                                           parameters such as those possible with stored procedures.
	 * @param   integer          $dataType       Constant corresponding to a SQL datatype.
	 * @param   integer          $length         The length of the variable. Usually required for OUTPUT parameters.
	 * @param   array            $driverOptions  Optional driver options to be used.
	 *
	 * @return  Preparable
	 *
	 * @since   1.0
	 */
	public function bind($key = null, &$value = null, $dataType = PDO::PARAM_STR, $length = 0, $driverOptions = []);

	/**
	 * Retrieves the bound parameters array when key is null and returns it by reference. If a key is provided then that item is
	 * returned.
	 *
	 * @param   mixed  $key  The bounded variable key to retrieve.
	 *
	 * @return  mixed
	 *
	 * @since   1.0
	 */
	public function &getBounded($key = null);
}
components/com_akeeba/BackupEngine/Driver/Base.php000060400000115134152453623440016161 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Driver;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Driver\Query\Base as QueryBase;
use RuntimeException;

/**
 * Database driver superclass. Used as the base of all Akeeba Engine database drivers.
 * Strongly based on Joomla Platform's JDatabase class.
 *
 * @method qn(string $name, string $as = null)  Alias for quoteName
 * @method q(string $text, bool $escape = true)  Alias for quote
 */
#[\AllowDynamicProperties]
abstract class Base
{
	/** @var    string  The minimum supported database version. */
	protected static $dbMinimum;

	/** @var    array  JDatabaseDriver instances container. */
	protected static $instances = [];

	/** @var string The name of the database driver. */
	public $name;

	/** @var string The name of the database. */
	protected $_database;

	/** @var resource The db connection resource */
	protected $connection = '';

	/** @var    integer  The number of SQL statements executed by the database driver. */
	protected $count = 0;

	/** @var resource The database connection cursor from the last query. */
	protected $cursor;

	/** @var    boolean  The database driver debugging state. */
	protected $debug = false;

	/** @var string Driver type. This should always be mysql as we don't support anything else anymore. */
	protected $driverType = '';

	/** @var string The db server's error string */
	protected $errorMsg = '';

	/** @var int The db server's error number */
	protected $errorNum = 0;

	/** @var int Query's limit */
	protected $limit = 0;

	/** @var    array  The log of executed SQL statements by the database driver. */
	protected $log = [];

	/** @var string Quote for named objects */
	protected $nameQuote = '';

	/** @var string  The null or zero representation of a timestamp for the database driver. */
	protected $nullDate;

	/** @var int Query's offset */
	protected $offset = 0;

	/** @var    array  Passed in upon instantiation and saved. */
	protected $options;

	/** @var mixed The SQL query string */
	protected $sql = '';

	/** @var string The prefix used in the database, if any */
	protected $tablePrefix = '';

	/** @var bool Support for UTF-8 */
	protected $utf = true;

	/**
	 * Database object constructor
	 *
	 * @param   array  $options  List of options used to configure the connection
	 */
	public function __construct($options)
	{
		$prefix     = array_key_exists('prefix', $options) ? $options['prefix'] : '';
		$database   = array_key_exists('database', $options) ? $options['database'] : '';
		$connection = array_key_exists('connection', $options) ? $options['connection'] : null;

		$this->tablePrefix = $prefix;
		$this->_database   = $database;
		$this->connection  = $connection;
		$this->errorNum    = 0;
		$this->count       = 0;
		$this->log         = [];
		$this->options     = $options;
	}

	/**
	 * Is this driver class supported on this server? Child classes are supposed to override this and perform a
	 * compatibility check.
	 *
	 * @return  bool  True if the driver class is supported on the server
	 */
	public static function isSupported()
	{
		return false;
	}

	/**
	 * Splits a string of multiple queries into an array of individual queries.
	 *
	 * @param   string  $query  Input SQL string with which to split into individual queries.
	 *
	 * @return  array  The queries from the input string separated into an array.
	 */
	public static function splitSql($query)
	{
		$start   = 0;
		$open    = false;
		$char    = '';
		$end     = strlen($query);
		$queries = [];

		for ($i = 0; $i < $end; $i++)
		{
			$current = substr($query, $i, 1);
			if (($current == '"' || $current == '\''))
			{
				$n = 2;

				while (substr($query, $i - $n + 1, 1) == '\\' && $n < $i)
				{
					$n++;
				}

				if ($n % 2 == 0)
				{
					if ($open)
					{
						if ($current == $char)
						{
							$open = false;
							$char = '';
						}
					}
					else
					{
						$open = true;
						$char = $current;
					}
				}
			}

			if (($current == ';' && !$open) || $i == $end - 1)
			{
				$queries[] = substr($query, $start, ($i - $start + 1));
				$start     = $i + 1;
			}
		}

		return $queries;
	}

	/**
	 * Is this driver supported under the current system configuration?
	 *
	 * @return bool
	 */
	public static function test()
	{
		return self::isSupported();
	}

	/**
	 * Magic method to provide method alias support for quote() and quoteName().
	 *
	 * @param   string  $method  The called method.
	 * @param   array   $args    The array of arguments passed to the method.
	 *
	 * @return  string  The aliased method's return value or null.
	 */
	public function __call($method, $args)
	{
		if (empty($args))
		{
			return null;
		}

		switch ($method)
		{
			case 'q':
				return $this->quote($args[0], $args[1] ?? true);
				break;
			case 'nq':
			case 'qn':
				return $this->quoteName($args[0]);
				break;
		}

		return null;
	}

	/**
	 * Database object destructor
	 *
	 * @return bool
	 */
	public function __destruct()
	{
		return $this->close();
	}

	public function __wakeup()
	{
		$this->open();
	}

	/**
	 * By default, when the object is shutting down, the connection is closed
	 */
	public function _onSerialize()
	{
		$this->close();
	}

	/**
	 * Alter database's character set, obtaining query string from protected member.
	 *
	 * @param   string  $dbName  The database name that will be altered
	 *
	 * @return  string  The query that alter the database query string
	 *
	 * @throws  RuntimeException
	 */
	public function alterDbCharacterSet($dbName)
	{
		if (is_null($dbName))
		{
			throw new RuntimeException('Database name must not be null.');
		}

		$this->setQuery($this->getAlterDbCharacterSet($dbName));

		return $this->execute();
	}

	/**
	 * Closes the database connection
	 */
	abstract public function close();

	/**
	 * Determines if the connection to the server is active.
	 *
	 * @return  boolean  True if connected to the database engine.
	 */
	abstract public function connected();

	/**
	 * Create a new database using information from $options object, obtaining query string
	 * from protected member.
	 *
	 * @param   object   $options         Object used to pass user and database name to database driver.
	 *                                    This object must have "db_name" and "db_user" set.
	 * @param   boolean  $utf             True if the database supports the UTF-8 character set.
	 *
	 * @return  string  The query that creates database
	 *
	 * @throws  RuntimeException
	 */
	public function createDatabase($options, $utf = true)
	{
		if (is_null($options))
		{
			throw new RuntimeException('$options object must not be null.');
		}
		elseif (empty($options->db_name))
		{
			throw new RuntimeException('$options object must have db_name set.');
		}
		elseif (empty($options->db_user))
		{
			throw new RuntimeException('$options object must have db_user set.');
		}

		$this->setQuery($this->getCreateDatabaseQuery($options, $utf));

		return $this->execute();
	}

	/**
	 * Drops a table from the database.
	 *
	 * @param   string   $table     The name of the database table to drop.
	 * @param   boolean  $ifExists  Optionally specify that the table must exist before it is dropped.
	 *
	 * @return  Base  Returns this object to support chaining.
	 */
	public abstract function dropTable($table, $ifExists = true);

	/**
	 * Method to escape a string for usage in an SQL statement.
	 *
	 * @param   string   $text   The string to be escaped.
	 * @param   boolean  $extra  Optional parameter to provide extra escaping.
	 *
	 * @return  string   The escaped string.
	 */
	abstract public function escape($text, $extra = false);

	/**
	 * An alias for query()
	 *
	 * @return  mixed  A database cursor resource on success, boolean false on failure.
	 */
	public function execute()
	{
		return $this->query();
	}

	/**
	 * Method to fetch a row from the result set cursor as an associative array.
	 *
	 * @param   mixed  $cursor  The optional result set cursor from which to fetch the row.
	 *
	 * @return  mixed  Either the next row from the result set or false if there are no more rows.
	 */
	abstract public function fetchAssoc($cursor = null);

	/**
	 * Method to free up the memory used for the result set.
	 *
	 * @param   mixed  $cursor  The optional result set cursor from which to fetch the row.
	 *
	 * @return  void
	 */
	abstract public function freeResult($cursor = null);

	/**
	 * Returns the abstracted name of a database object
	 *
	 * @param   string  $tableName
	 *
	 * @return  string
	 */
	public function getAbstract($tableName)
	{
		$prefix = $this->getPrefix();

		// Don't return abstract names for non-CMS tables
		if (is_null($prefix))
		{
			return $tableName;
		}

		switch ($prefix)
		{
			case '':
				// This is more of a hack; it assumes all tables are CMS tables if the prefix is empty.
				return '#__' . $tableName;
				break;

			default:
				// Normal behaviour for 99% of sites
				$tableAbstract = $tableName;
				if (!empty($prefix))
				{
					if (substr($tableName, 0, strlen($prefix)) == $prefix)
					{
						$tableAbstract = '#__' . substr($tableName, strlen($prefix));
					}
					else
					{
						$tableAbstract = $tableName;
					}
				}

				return $tableAbstract;
				break;
		}
	}

	/**
	 * Get the number of affected rows for the previous executed SQL statement.
	 *
	 * @return  integer  The number of affected rows.
	 */
	abstract public function getAffectedRows();

	/**
	 * Method to get the database collation in use by sampling a text field of a table in the database.
	 *
	 * @return  mixed  The collation in use by the database or boolean false if not supported.
	 */
	abstract public function getCollation();

	/**
	 * Method that provides access to the underlying database connection.
	 *
	 * @return  resource  The underlying database connection resource.
	 */
	public function getConnection()
	{
		return $this->connection;
	}

	/**
	 * Inherits the connection of another database driver. Useful for cloning
	 * the CMS database connection into an Akeeba Engine database driver.
	 *
	 * @param   resource  $connection
	 */
	public function setConnection($connection)
	{
		$this->connection = $connection;
	}

	/**
	 * Get the total number of SQL statements executed by the database driver.
	 *
	 * @return  integer
	 *
	 * @since   11.1
	 */
	public function getCount()
	{
		return $this->count;
	}

	/**
	 * Returns a PHP date() function compliant date format for the database driver.
	 *
	 * @return  string  The format string.
	 */
	public function getDateFormat()
	{
		return 'Y-m-d H:i:s';
	}

	/**
	 * Return the database driver type, e.g. "mysql" for all drivers which can talk to MySQL
	 *
	 * @return string
	 */
	public function getDriverType()
	{
		return $this->driverType;
	}

	/**
	 * Get the error message
	 *
	 * @return string The error message for the most recent query
	 */
	public function getErrorMsg($escaped = false)
	{
		if ($escaped)
		{
			return addslashes($this->errorMsg);
		}
		else
		{
			return $this->errorMsg;
		}
	}

	/**
	 * Get the error number
	 *
	 * @return int The error number for the most recent query
	 */
	public function getErrorNum()
	{
		return $this->errorNum;
	}

	/**
	 * Method to escape a string for usage in an SQL statement.
	 *
	 * @param   string   $text   The string to be escaped.
	 * @param   boolean  $extra  Optional parameter to provide extra escaping.
	 *
	 * @return  string  The escaped string.
	 */
	public function getEscaped($text, $extra = false)
	{
		return $this->escape($text, $extra);
	}

	/**
	 * Get the database driver SQL statement log.
	 *
	 * @return  array  SQL statements executed by the database driver.
	 *
	 * @since   11.1
	 */
	public function getLog()
	{
		return $this->log;
	}

	/**
	 * Get the minimum supported database version.
	 *
	 * @return  string  The minimum version number for the database driver.
	 *
	 * @since   12.1
	 */
	public function getMinimum()
	{
		return static::$dbMinimum;
	}

	/**
	 * Get the null or zero representation of a timestamp for the database driver.
	 *
	 * @return  string  Null or zero representation of a timestamp.
	 */
	public function getNullDate()
	{
		return $this->nullDate;
	}

	/**
	 * Get the number of returned rows for the previous executed SQL statement.
	 *
	 * @param   resource  $cursor  An optional database cursor resource to extract the row count from.
	 *
	 * @return  integer   The number of returned rows.
	 */
	abstract public function getNumRows($cursor = null);

	/**
	 * Get the database table prefix
	 *
	 * @return string The database prefix
	 */
	public function getPrefix()
	{
		return $this->tablePrefix;
	}

	/**
	 * Get the current query object or a new QueryBase object.
	 *
	 * @param   boolean  $new  False to return the current query object, True to return a new QueryBase object.
	 *
	 * @return  QueryBase  The current query object or a new object extending the QueryBase class.
	 */
	abstract public function getQuery($new = false);

	/**
	 * Create a new QueryBase object.
	 *
	 * @return  QueryBase  The current query object or a new object extending the QueryBase class.
	 */
	abstract public function createQuery();

	/**
	 * Retrieves field information about the given tables.
	 *
	 * @param   string   $table     The name of the database table.
	 * @param   boolean  $typeOnly  True (default) to only return field types.
	 *
	 * @return  array  An array of fields by table.
	 */
	abstract public function getTableColumns($table, $typeOnly = true);

	/**
	 * Shows the table CREATE statement that creates the given tables.
	 *
	 * @param   mixed  $tables  A table name or a list of table names.
	 *
	 * @return  array  A list of the create SQL for the tables.
	 */
	abstract public function getTableCreate($tables);

	/**
	 * Retrieves field information about the given tables.
	 *
	 * @param   mixed    $tables    A table name or a list of table names.
	 * @param   boolean  $typeOnly  True to only return field types.
	 *
	 * @return  array  An array of fields by table.
	 */
	public function getTableFields($tables, $typeOnly = true)
	{
		$results = [];

		$tables = (array) $tables;

		foreach ($tables as $table)
		{
			$results[$table] = $this->getTableColumns($table, $typeOnly);
		}

		return $results;
	}

	/**
	 * Retrieves field information about the given tables.
	 *
	 * @param   mixed  $tables  A table name or a list of table names.
	 *
	 * @return  array  An array of keys for the table(s).
	 */
	abstract public function getTableKeys($tables);

	/**
	 * Method to get an array of all tables in the database.
	 *
	 * @return  array  An array of all the tables in the database.
	 */
	abstract public function getTableList();

	/**
	 * Returns an array with the names of tables, views, procedures, functions and triggers
	 * in the database. The table names are the keys of the tables, whereas the value is
	 * the type of each element: table, view, merge, temp, procedure, function or trigger.
	 * Note that merge are MRG_MYISAM tables and temp is non-permanent data table, usually
	 * set up as temporary, black hole or federated tables. These two types should never,
	 * ever, have their data dumped in the SQL dump file.
	 *
	 * @param   bool  $abstract  Return abstract or normal names? Defaults to true (abstract names)
	 *
	 * @return  array
	 */
	abstract public function getTables($abstract = true);

	/**
	 * Determine whether or not the database engine supports UTF-8 character encoding.
	 *
	 * @return  boolean  True if the database engine supports UTF-8 character encoding.
	 */
	public function getUTFSupport()
	{
		return $this->utf;
	}

	/**
	 * Get the version of the database connector
	 *
	 * @return  string  The database connector version.
	 */
	abstract public function getVersion();

	/**
	 * Determines if the database engine supports UTF-8 character encoding.
	 *
	 * @return  boolean  True if supported.
	 */
	public function hasUTF()
	{
		return $this->utf;
	}

	/**
	 * Determine whether or not the database engine supports UTF-8 character encoding.
	 *
	 * @return  boolean  True if the database engine supports UTF-8 character encoding.
	 */
	public function hasUTFSupport()
	{
		return $this->utf;
	}

	/**
	 * Inserts a row into a table based on an object's properties.
	 *
	 * @param   string  $table   The name of the database table to insert into.
	 * @param   object &$object  A reference to an object whose public properties match the table fields.
	 * @param   string  $key     The name of the primary key. If provided the object property is updated.
	 *
	 * @return  boolean    True on success.
	 */
	public function insertObject($table, &$object, $key = null)
	{
		$fields = [];
		$values = [];

		// Iterate over the object variables to build the query fields and values.
		foreach (get_object_vars($object) as $k => $v)
		{
			// Only process non-null scalars.
			if (is_array($v) || is_object($v) || ($v === null))
			{
				continue;
			}

			// Ignore any internal fields.
			if ($k[0] == '_')
			{
				continue;
			}

			// Prepare and sanitize the fields and values for the database query.
			$fields[] = $this->quoteName($k);
			$values[] = $this->quote($v);
		}

		// Create the base insert statement.
		$query = $this->getQuery(true)
			->insert($this->quoteName($table))
			->columns($fields)
			->values(implode(',', $values));

		// Set the query and execute the insert.
		$this->setQuery($query);
		if (!$this->execute())
		{
			return false;
		}

		// Update the primary key if it exists.
		$id = $this->insertid();
		if ($key && $id && is_string($key))
		{
			$object->$key = $id;
		}

		return true;
	}

	/**
	 * Method to get the auto-incremented value from the last INSERT statement.
	 *
	 * @return  integer  The value of the auto-increment field from the last inserted row.
	 */
	abstract public function insertid();

	/**
	 * Method to check whether the installed database version is supported by the database driver
	 *
	 * @return  boolean  True if the database version is supported
	 *
	 * @since   12.1
	 */
	public function isMinimumVersion()
	{
		return version_compare($this->getVersion(), static::$dbMinimum) >= 0;
	}

	/**
	 * Method to get the first row of the result set from the database query as an associative array
	 * of ['field_name' => 'row_value'].
	 *
	 * @return  mixed  The return value or null if the query failed.
	 */
	public function loadAssoc()
	{
		$ret = null;

		// Execute the query and get the result set cursor.
		if (!($cursor = $this->execute()))
		{
			return null;
		}

		// Get the first row from the result set as an associative array.
		if ($array = $this->fetchAssoc($cursor))
		{
			$ret = $array;
		}

		// Free up system resources and return.
		$this->freeResult($cursor);

		return $ret;
	}

	/**
	 * Method to get an array of the result set rows from the database query where each row is an associative array
	 * of ['field_name' => 'row_value'].  The array of rows can optionally be keyed by a field name, but defaults to
	 * a sequential numeric array.
	 *
	 * NOTE: Chosing to key the result array by a non-unique field name can result in unwanted
	 * behavior and should be avoided.
	 *
	 * @param   string  $key     The name of a field on which to key the result array.
	 * @param   string  $column  An optional column name. Instead of the whole row, only this column value will be in
	 *                           the result array.
	 *
	 * @return  mixed   The return value or null if the query failed.
	 */
	public function loadAssocList($key = null, $column = null)
	{
		$array = [];

		// Execute the query and get the result set cursor.
		if (!($cursor = $this->execute()))
		{
			return null;
		}

		// Get all of the rows from the result set.
		while ($row = $this->fetchAssoc($cursor))
		{
			$value = ($column) ? ($row[$column] ?? $row) : $row;
			if ($key)
			{
				$array[$row[$key]] = $value;
			}
			else
			{
				$array[] = $value;
			}
		}

		// Free up system resources and return.
		$this->freeResult($cursor);

		return $array;
	}

	/**
	 * Method to get an array of values from the <var>$offset</var> field in each row of the result set from
	 * the database query.
	 *
	 * @param   integer  $offset  The row offset to use to build the result array.
	 *
	 * @return  mixed    The return value or null if the query failed.
	 */
	public function loadColumn($offset = 0)
	{
		$array = [];

		// Execute the query and get the result set cursor.
		if (!($cursor = $this->execute()))
		{
			return null;
		}

		// Get all of the rows from the result set as arrays.
		while ($row = $this->fetchArray($cursor))
		{
			$array[] = $row[$offset];
		}

		// Free up system resources and return.
		$this->freeResult($cursor);

		return $array;
	}

	/**
	 * Method to get the next row in the result set from the database query as an object.
	 *
	 * @param   string  $class  The class name to use for the returned row object.
	 *
	 * @return  mixed   The result of the query as an array, false if there are no more rows.
	 */
	public function loadNextObject($class = 'stdClass')
	{
		// Execute the query and get the result set cursor.
		if (is_null($this->cursor))
		{
			if (!($this->cursor = $this->execute()))
			{
				return $this->errorNum ? null : false;
			}
		}

		// Get the next row from the result set as an object of type $class.
		if ($row = $this->fetchObject($this->cursor, $class))
		{
			return $row;
		}

		// Free up system resources and return.
		$this->freeResult($this->cursor);
		$this->cursor = null;

		return false;
	}

	/**
	 * Method to get the next row in the result set from the database query as an array.
	 *
	 * @return  mixed  The result of the query as an array, false if there are no more rows.
	 */
	public function loadNextRow()
	{
		// Execute the query and get the result set cursor.
		if (is_null($this->cursor))
		{
			if (!($this->cursor = $this->execute()))
			{
				return $this->errorNum ? null : false;
			}
		}

		// Get the next row from the result set as an object of type $class.
		if ($row = $this->fetchArray($this->cursor))
		{
			return $row;
		}

		// Free up system resources and return.
		$this->freeResult($this->cursor);
		$this->cursor = null;

		return false;
	}

	/**
	 * Method to get the first row of the result set from the database query as an object.
	 *
	 * @param   string  $class  The class name to use for the returned row object.
	 *
	 * @return  mixed   The return value or null if the query failed.
	 */
	public function loadObject($class = 'stdClass')
	{
		$ret = null;

		// Execute the query and get the result set cursor.
		if (!($cursor = $this->execute()))
		{
			return null;
		}

		// Get the first row from the result set as an object of type $class.
		if ($object = $this->fetchObject($cursor, $class))
		{
			$ret = $object;
		}

		// Free up system resources and return.
		$this->freeResult($cursor);

		return $ret;
	}

	/**
	 * Method to get an array of the result set rows from the database query where each row is an object.  The array
	 * of objects can optionally be keyed by a field name, but defaults to a sequential numeric array.
	 *
	 * NOTE: Choosing to key the result array by a non-unique field name can result in unwanted
	 * behavior and should be avoided.
	 *
	 * @param   string  $key    The name of a field on which to key the result array.
	 * @param   string  $class  The class name to use for the returned row objects.
	 *
	 * @return  mixed   The return value or null if the query failed.
	 */
	public function loadObjectList($key = '', $class = 'stdClass')
	{
		$array = [];

		// Execute the query and get the result set cursor.
		if (!($cursor = $this->execute()))
		{
			return null;
		}

		// Get all of the rows from the result set as objects of type $class.
		while ($row = $this->fetchObject($cursor, $class))
		{
			if ($key)
			{
				$array[$row->$key] = $row;
			}
			else
			{
				$array[] = $row;
			}
		}

		// Free up system resources and return.
		$this->freeResult($cursor);

		return $array;
	}

	/**
	 * Method to get the first field of the first row of the result set from the database query.
	 *
	 * @return  mixed  The return value or null if the query failed.
	 */
	public function loadResult()
	{
		$ret = null;

		// Execute the query and get the result set cursor.
		if (!($cursor = $this->execute()))
		{
			return null;
		}

		// Get the first row from the result set as an array.
		if ($row = $this->fetchArray($cursor))
		{
			$ret = $row[0];
		}

		// Free up system resources and return.
		$this->freeResult($cursor);

		return $ret;
	}

	/**
	 * Method to get an array of values from the <var>$offset</var> field in each row of the result set from
	 * the database query.
	 *
	 * @param   integer  $offset  The row offset to use to build the result array.
	 *
	 * @return  mixed    The return value or null if the query failed.
	 */
	public function loadResultArray($offset = 0)
	{
		return $this->loadColumn($offset);
	}

	/**
	 * Method to get the first row of the result set from the database query as an array.  Columns are indexed
	 * numerically so the first column in the result set would be accessible via <var>$row[0]</var>, etc.
	 *
	 * @return  mixed  The return value or null if the query failed.
	 */
	public function loadRow()
	{
		$ret = null;

		// Execute the query and get the result set cursor.
		if (!($cursor = $this->execute()))
		{
			return null;
		}

		// Get the first row from the result set as an array.
		if ($row = $this->fetchArray($cursor))
		{
			$ret = $row;
		}

		// Free up system resources and return.
		$this->freeResult($cursor);

		return $ret;
	}

	/**
	 * Method to get an array of the result set rows from the database query where each row is an array.  The array
	 * of objects can optionally be keyed by a field offset, but defaults to a sequential numeric array.
	 *
	 * NOTE: Choosing to key the result array by a non-unique field can result in unwanted
	 * behavior and should be avoided.
	 *
	 * @param   string  $key  The name of a field on which to key the result array.
	 *
	 * @return  mixed   The return value or null if the query failed.
	 */
	public function loadRowList($key = null)
	{
		$array = [];

		// Execute the query and get the result set cursor.
		if (!($cursor = $this->execute()))
		{
			return null;
		}

		// Get all of the rows from the result set as arrays.
		while ($row = $this->fetchArray($cursor))
		{
			if ($key !== null)
			{
				$array[$row[$key]] = $row;
			}
			else
			{
				$array[] = $row;
			}
		}

		// Free up system resources and return.
		$this->freeResult($cursor);

		return $array;
	}

	/**
	 * Locks a table in the database.
	 *
	 * @param   string  $tableNameName  The name of the table to unlock.
	 *
	 * @return  Base  Returns this object to support chaining.
	 */
	public abstract function lockTable($tableNameName);

	/**
	 * Wrap an SQL statement identifier name such as column, table or database names in quotes to prevent injection
	 * risks and reserved word conflicts.
	 *
	 * @param   string  $name  The identifier name to wrap in quotes.
	 *
	 * @return  string  The quote wrapped name.
	 */
	public function nameQuote($name)
	{
		return $this->quoteName($name);
	}

	/**
	 * Opens a database connection. It MUST be overriden by children classes
	 *
	 * @return Base
	 */
	public function open()
	{
		// Don't try to reconnect if we're already connected
		if (is_resource($this->connection) && !is_null($this->connection))
		{
			return $this;
		}

		// Determine utf-8 support
		$this->utf = $this->hasUTF();

		// Set charactersets (needed for MySQL 4.1.2+)
		if ($this->utf)
		{
			$this->setUTF();
		}

		// Select the current database
		$this->select($this->_database);

		return $this;
	}

	/**
	 * Execute the SQL statement.
	 *
	 * @return  mixed  A database cursor resource on success, boolean false on failure.
	 */
	abstract public function query();

	/**
	 * Method to quote and optionally escape a string to database requirements for insertion into the database.
	 *
	 * @param   string   $text    The string to quote.
	 * @param   boolean  $escape  True (default) to escape the string, false to leave it unchanged.
	 */
	public function quote($text, $escape = true)
	{
		return '\'' . ($escape ? $this->escape($text) : $text) . '\'';
	}

	/**
	 * Wrap an SQL statement identifier name such as column, table or database names in quotes to prevent injection
	 * risks and reserved word conflicts.
	 *
	 * @param   mixed  $name      The identifier name to wrap in quotes, or an array of identifier names to wrap in
	 *                            quotes. Each type supports dot-notation name.
	 * @param   mixed  $as        The AS query part associated to $name. It can be string or array, in latter case it
	 *                            has to be same length of $name; if is null there will not be any AS part for string
	 *                            or array element.
	 */
	public function quoteName($name, $as = null)
	{
		if (!is_array($name))
		{
			$quotedName = $this->quoteNameStr(explode('.', $name));

			$quotedAs = '';
			if (!is_null($as))
			{
				$as       = (array) $as;
				$quotedAs .= ' AS ' . $this->quoteNameStr($as);
			}

			return $quotedName . $quotedAs;
		}
		else
		{
			$fin = [];

			if (is_null($as))
			{
				foreach ($name as $str)
				{
					$fin[] = $this->quoteName($str);
				}
			}
			elseif (is_array($name) && (count($name) == (is_array($as) || $as instanceof \Countable ? count($as) : 0)))
			{
				$count = count($name);
				for ($i = 0; $i < $count; $i++)
				{
					$fin[] = $this->quoteName($name[$i], $as[$i]);
				}
			}

			return $fin;
		}
	}

	/**
	 * Renames a table in the database.
	 *
	 * @param   string  $oldTable  The name of the table to be renamed
	 * @param   string  $newTable  The new name for the table.
	 * @param   string  $backup    Table prefix
	 * @param   string  $prefix    For the table - used to rename constraints in non-mysql databases
	 *
	 * @return  Base  Returns this object to support chaining.
	 */
	public abstract function renameTable($oldTable, $newTable, $backup = null, $prefix = null);

	/**
	 * This function replaces a string identifier <var>$prefix</var> with the string held is the
	 * <var>tablePrefix</var> class variable.
	 *
	 * @param   string  $query   The SQL statement to prepare.
	 * @param   string  $prefix  The common table prefix.
	 *
	 * @return  string  The processed SQL statement.
	 */
	public function replacePrefix($query, $prefix = '#__')
	{
		$escaped   = false;
		$startPos  = 0;
		$quoteChar = '';
		$literal   = '';

		$query = trim($query);
		$n     = strlen($query);

		while ($startPos < $n)
		{
			$ip = strpos($query, $prefix, $startPos);
			if ($ip === false)
			{
				break;
			}

			$j = strpos($query, "'", $startPos);
			$k = strpos($query, '"', $startPos);
			if (($k !== false) && (($k < $j) || ($j === false)))
			{
				$quoteChar = '"';
				$j         = $k;
			}
			else
			{
				$quoteChar = "'";
			}

			if ($j === false)
			{
				$j = $n;
			}

			$literal  .= str_replace($prefix, $this->tablePrefix, substr($query, $startPos, $j - $startPos));
			$startPos = $j;

			$j = $startPos + 1;

			if ($j >= $n)
			{
				break;
			}

			// Quote comes first, find end of quote
			while (true)
			{
				$k       = strpos($query, $quoteChar, $j);
				$escaped = false;
				if ($k === false)
				{
					break;
				}
				$l = $k - 1;
				while ($l >= 0 && $query[$l] == '\\')
				{
					$l--;
					$escaped = !$escaped;
				}
				if ($escaped)
				{
					$j = $k + 1;
					continue;
				}
				break;
			}
			if ($k === false)
			{
				// Error in the query - no end quote; ignore it
				break;
			}
			$literal  .= substr($query, $startPos, $k - $startPos + 1);
			$startPos = $k + 1;
		}
		if ($startPos < $n)
		{
			$literal .= substr($query, $startPos, $n - $startPos);
		}

		return $literal;
	}

	/**
	 * Resets the error condition in the driver. Useful to reset the error state after handling a thrown exception.
	 *
	 * @return $this for chaining
	 */
	public function resetErrors()
	{
		$this->errorNum = 0;
		$this->errorMsg = '';

		return $this;
	}

	/**
	 * Select a database for use.
	 *
	 * @param   string  $database  The name of the database to select for use.
	 *
	 * @return  boolean  True if the database was successfully selected.
	 */
	abstract public function select($database);

	/**
	 * Sets the database debugging state for the driver.
	 *
	 * @param   boolean  $level  True to enable debugging.
	 *
	 * @return  boolean  The old debugging level.
	 */
	public function setDebug($level)
	{
		$previous    = $this->debug;
		$this->debug = (bool) $level;

		return $previous;
	}

	/**
	 * Sets the SQL statement string for later execution.
	 *
	 * @param   mixed    $query   The SQL statement to set either as a QueryBase object or a string.
	 * @param   integer  $offset  The affected row offset to set.
	 * @param   integer  $limit   The maximum affected rows to set.
	 *
	 * @return  self  This object to support method chaining.
	 */
	public function setQuery($query, $offset = 0, $limit = 0)
	{
		$this->sql    = $query;
		$this->limit  = (int) $limit;
		$this->offset = (int) $offset;

		return $this;
	}

	/**
	 * Set the connection to use UTF-8 character encoding.
	 *
	 * @return  boolean  True on success.
	 */
	abstract public function setUTF();

	/**
	 * Method to commit a transaction.
	 *
	 * @return  void
	 */
	abstract public function transactionCommit();

	/**
	 * Method to roll back a transaction.
	 *
	 * @return  void
	 */
	abstract public function transactionRollback();

	/**
	 * Method to initialize a transaction.
	 *
	 * @return  void
	 */
	abstract public function transactionStart();

	/**
	 * Method to truncate a table.
	 *
	 * @param   string  $table  The table to truncate
	 *
	 * @return  void
	 */
	public function truncateTable($table)
	{
		$this->setQuery('TRUNCATE TABLE ' . $this->quoteName($table));
		$this->query();
	}

	/**
	 * Unlocks tables in the database.
	 *
	 * @return  Base  Returns this object to support chaining.
	 */
	public abstract function unlockTables();

	/**
	 * Updates a row in a table based on an object's properties.
	 *
	 * @param   string   $table   The name of the database table to update.
	 * @param   object  &$object  A reference to an object whose public properties match the table fields.
	 * @param   string   $key     The name of the primary key.
	 * @param   boolean  $nulls   True to update null fields or false to ignore them.
	 *
	 * @return  boolean  True on success.
	 */
	public function updateObject($table, &$object, $key, $nulls = false)
	{
		$fields = [];
		$where  = [];

		if (is_string($key))
		{
			$key = [$key];
		}

		if (is_object($key))
		{
			$key = (array) $key;
		}

		// Create the base update statement.
		$statement = 'UPDATE ' . $this->quoteName($table) . ' SET %s WHERE %s';

		// Iterate over the object variables to build the query fields/value pairs.
		foreach (get_object_vars($object) as $k => $v)
		{
			// Only process scalars that are not internal fields.
			if (is_array($v) || is_object($v) || ($k[0] == '_'))
			{
				continue;
			}

			// Set the primary key to the WHERE clause instead of a field to update.
			if (in_array($k, $key))
			{
				$where[] = $this->quoteName($k) . '=' . $this->quote($v);
				continue;
			}

			// Prepare and sanitize the fields and values for the database query.
			if ($v === null)
			{
				// If the value is null and we want to update nulls then set it.
				if ($nulls)
				{
					$val = 'NULL';
				}
				// If the value is null and we do not want to update nulls then ignore this field.
				else
				{
					continue;
				}
			}
			// The field is not null so we prep it for update.
			else
			{
				$val = $this->quote($v);
			}

			// Add the field to be updated.
			$fields[] = $this->quoteName($k) . '=' . $val;
		}

		// We don't have any fields to update.
		if (empty($fields))
		{
			return true;
		}

		// Set the query and execute the update.
		$this->setQuery(sprintf($statement, implode(",", $fields), implode(' AND ', $where)));

		return $this->execute();
	}

	/**
	 * Method to fetch a row from the result set cursor as an array.
	 *
	 * @param   mixed  $cursor  The optional result set cursor from which to fetch the row.
	 *
	 * @return  mixed  Either the next row from the result set or false if there are no more rows.
	 */
	abstract protected function fetchArray($cursor = null);

	/**
	 * Method to fetch a row from the result set cursor as an object.
	 *
	 * @param   mixed   $cursor  The optional result set cursor from which to fetch the row.
	 * @param   string  $class   The class name to use for the returned row object.
	 *
	 * @return  mixed   Either the next row from the result set or false if there are no more rows.
	 */
	abstract protected function fetchObject($cursor = null, $class = 'stdClass');

	/**
	 * Return the query string to alter the database character set.
	 *
	 * @param   string  $dbName  The database name
	 *
	 * @return  string  The query that alter the database query string
	 */
	protected function getAlterDbCharacterSet($dbName)
	{
		$query = 'ALTER DATABASE ' . $this->quoteName($dbName) . ' CHARACTER SET `utf8`';

		return $query;
	}

	/**
	 * Return the query string to create new Database.
	 * Each database driver, other than MySQL, need to override this member to return correct string.
	 *
	 * @param   object   $options         Object used to pass user and database name to database driver.
	 *                                    This object must have "db_name" and "db_user" set.
	 * @param   boolean  $utf             True if the database supports the UTF-8 character set.
	 *
	 * @return  string  The query that creates database
	 */
	protected function getCreateDatabaseQuery($options, $utf)
	{
		if ($utf)
		{
			$query = 'CREATE DATABASE ' . $this->quoteName($options->db_name) . ' CHARACTER SET `utf8`';
		}
		else
		{
			$query = 'CREATE DATABASE ' . $this->quoteName($options->db_name);
		}

		return $query;
	}

	/**
	 * Gets the name of the database used by this connection.
	 *
	 * @return  string
	 */
	protected function getDatabase()
	{
		return $this->_database;
	}

	/**
	 * Quote strings coming from quoteName call.
	 *
	 * @param   array  $strArr  Array of strings coming from quoteName dot-explosion.
	 *
	 * @return  string  Dot-imploded string of quoted parts.
	 */
	protected function quoteNameStr($strArr)
	{
		$parts = [];
		$q     = $this->nameQuote;

		foreach ($strArr as $part)
		{
			if (is_null($part))
			{
				continue;
			}

			if (strlen($q) == 1)
			{
				$parts[] = $q . $part . $q;
			}
			else
			{
				$parts[] = $q[0] . $part . $q[1];
			}
		}

		return implode('.', $parts);
	}
}
components/com_akeeba/BackupEngine/Driver/Pdomysql.php000060400000044715152453623440017125 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Driver;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Driver\Query\Pdomysql as QueryPdomysql;
use Akeeba\Engine\FixMySQLHostname;
use Exception;
use PDO;
use PDOException;
use PDOStatement;
use ReflectionClass;
use RuntimeException;

/**
 * PDO MySQL database driver for Akeeba Engine
 *
 * Based on Joomla! Platform 12.1
 */
#[\AllowDynamicProperties]
class Pdomysql extends Mysql
{
	use FixMySQLHostname;

	/**
	 * The default cipher suite for TLS connections.
	 *
	 * @var    array
	 */
	protected static $defaultCipherSuite = [
		'AES128-GCM-SHA256',
		'AES256-GCM-SHA384',
		'AES128-CBC-SHA256',
		'AES256-CBC-SHA384',
		'DES-CBC3-SHA',
	];

	/**
	 * The name of the database driver.
	 *
	 * @var    string
	 */
	public $name = 'pdomysql';

	/** @var string Connection character set */
	protected $charset = 'utf8mb4';

	/** @var PDO The db connection resource */
	protected $connection = null;

	/** @var PDOStatement The database connection cursor from the last query. */
	protected $cursor;

	/** @var array Driver options for PDO */
	protected $driverOptions = [];

	protected $ssl = [];

	/** @var bool Are we in the process of reconnecting to the database server? */
	private $isReconnecting = false;

	/**
	 * Database object constructor
	 *
	 * @param   array  $options  List of options used to configure the connection
	 */
	public function __construct($options)
	{
		$this->driverType = 'mysql';

		// Init
		$this->nameQuote = '`';

		$options['ssl'] = $options['ssl'] ?? [];
		$options['ssl'] = is_array($options['ssl']) ? $options['ssl'] : [];

		$options['ssl']['enable']             =
			($options['ssl']['enable'] ?? $options['dbencryption'] ?? false) ?: false;
		$options['ssl']['cipher']             = ($options['ssl']['cipher'] ?? $options['dbsslcipher'] ?? null) ?: null;
		$options['ssl']['ca']                 = ($options['ssl']['ca'] ?? $options['dbsslca'] ?? null) ?: null;
		$options['ssl']['capath']             = ($options['ssl']['capath'] ?? $options['dbsslcapath'] ?? null) ?: null;
		$options['ssl']['key']                = ($options['ssl']['key'] ?? $options['dbsslkey'] ?? null) ?: null;
		$options['ssl']['cert']               = ($options['ssl']['cert'] ?? $options['dbsslcert'] ?? null) ?: null;
		$options['ssl']['verify_server_cert'] =
			($options['ssl']['verify_server_cert'] ?? $options['dbsslverifyservercert'] ?? false) ?: false;

		// Figure out if a port is included in the host name
		$this->fixHostnamePortSocket($options['host'], $options['port'], $options['socket']);

		// Open the connection
		$this->host           = $options['host'] ?? 'localhost';
		$this->user           = $options['user'] ?? '';
		$this->password       = $options['password'] ?? '';
		$this->port           = $options['port'] ?? '';
		$this->socket         = $options['socket'] ?? '';
		$this->_database      = $options['database'] ?? '';
		$this->selectDatabase = $options['select'] ?? true;
		$this->ssl            = $options['ssl'] ?? [];

		$this->charset       = $options['charset'] ?? 'utf8mb4';
		$this->driverOptions = $options['driverOptions'] ?? [];
		$this->tablePrefix   = $options['prefix'] ?? '';
		$this->connection    = $options['connection'] ?? null;
		$this->errorNum      = 0;
		$this->count         = 0;
		$this->log           = [];
		$this->options       = $options;

		if (!is_object($this->connection))
		{
			$this->open();
		}
	}

	/**
	 * Test to see if the MySQL connector is available.
	 *
	 * @return  boolean  True on success, false otherwise.
	 */
	public static function isSupported()
	{
		if (!defined('\PDO::ATTR_DRIVER_NAME'))
		{
			return false;
		}

		return in_array('mysql', PDO::getAvailableDrivers());
	}

	/**
	 * PDO does not support serialize
	 *
	 * @return  array
	 */
	public function __sleep()
	{
		$serializedProperties = [];

		$reflect = new ReflectionClass($this);

		// Get properties of the current class
		$properties = $reflect->getProperties();

		foreach ($properties as $property)
		{
			// Do not serialize properties that are \PDO
			if ($property->isStatic() == false && !($this->{$property->name} instanceof PDO))
			{
				array_push($serializedProperties, $property->name);
			}
		}

		return $serializedProperties;
	}

	/**
	 * Wake up after serialization
	 *
	 * @return  array
	 */
	public function __wakeup()
	{
		// Get connection back
		$this->__construct($this->options);
	}

	public function close()
	{
		$return = false;

		if (is_object($this->cursor))
		{
			try
			{
				$this->cursor->closeCursor();
			}
			catch (\Throwable $e)
			{
			}
		}

		$this->connection = null;

		return $return;
	}

	/**
	 * Determines if the connection to the server is active.
	 *
	 * @return  boolean  True if connected to the database engine.
	 */
	public function connected()
	{
		if (!is_object($this->connection))
		{
			return false;
		}

		try
		{
			/** @var PDOStatement $statement */
			$statement = $this->connection->prepare('SELECT 1');
			$executed  = $statement->execute();
			$ret       = 0;

			if ($executed)
			{
				$row = [0];

				if (!empty($statement) && $statement instanceof PDOStatement)
				{
					$row = $statement->fetch(PDO::FETCH_NUM);
				}

				$ret = $row[0];
			}

			$status = $ret == 1;

			$statement->closeCursor();
			$statement = null;
		}
		// If we catch an exception here, we must not be connected.
		catch (\Throwable $e)
		{
			$status = false;
		}

		return $status;
	}

	/**
	 * Method to escape a string for usage in an SQL statement.
	 *
	 * @param   string   $text   The string to be escaped.
	 * @param   boolean  $extra  Optional parameter to provide extra escaping.
	 *
	 * @return  string  The escaped string.
	 */
	public function escape($text, $extra = false)
	{
		if (is_int($text) || is_float($text))
		{
			return $text;
		}

		if (is_null($text))
		{
			return 'NULL';
		}

		$result = substr($this->connection->quote($text), 1, -1);

		if ($extra)
		{
			$result = addcslashes($result, '%_');
		}

		return $result;
	}

	/**
	 * Method to fetch a row from the result set cursor as an associative array.
	 *
	 * @param   mixed  $cursor  The optional result set cursor from which to fetch the row.
	 *
	 * @return  mixed  Either the next row from the result set or false if there are no more rows.
	 */
	public function fetchAssoc($cursor = null)
	{
		$ret = null;

		if (!empty($cursor) && $cursor instanceof PDOStatement)
		{
			$ret = $cursor->fetch(PDO::FETCH_ASSOC);
		}
		elseif ($this->cursor instanceof PDOStatement)
		{
			$ret = $this->cursor->fetch(PDO::FETCH_ASSOC);
		}

		return $ret;
	}

	/**
	 * Method to free up the memory used for the result set.
	 *
	 * @param   mixed  $cursor  The optional result set cursor from which to fetch the row.
	 *
	 * @return  void
	 */
	public function freeResult($cursor = null)
	{
		if ($cursor instanceof PDOStatement)
		{
			$cursor->closeCursor();
			$cursor = null;
		}

		if ($this->cursor instanceof PDOStatement)
		{
			$this->cursor->closeCursor();
			$this->cursor = null;
		}
	}

	/**
	 * Get the number of affected rows for the previous executed SQL statement.
	 *
	 * @return  integer  The number of affected rows.
	 */
	public function getAffectedRows()
	{
		if ($this->cursor instanceof PDOStatement)
		{
			return $this->cursor->rowCount();
		}

		return 0;
	}

	/**
	 * Get the number of returned rows for the previous executed SQL statement.
	 *
	 * @param   resource  $cursor  An optional database cursor resource to extract the row count from.
	 *
	 * @return  integer   The number of returned rows.
	 */
	public function getNumRows($cursor = null)
	{
		if ($cursor instanceof PDOStatement)
		{
			return $cursor->rowCount();
		}

		if ($this->cursor instanceof PDOStatement)
		{
			return $this->cursor->rowCount();
		}

		return 0;
	}

	/**
	 * Get the current or query, or new JDatabaseQuery object.
	 *
	 * @param   boolean  $new  False to return the last query set, True to return a new JDatabaseQuery object.
	 *
	 * @return  mixed  The current value of the internal SQL variable or a new JDatabaseQuery object.
	 */
	public function getQuery($new = false)
	{
		if ($new)
		{
			return new QueryPdomysql($this);
		}
		else
		{
			return $this->sql;
		}
	}

	public function createQuery()
	{
		return new QueryPdomysql($this);
	}

	/**
	 * Get the version of the database connector.
	 *
	 * @return  string  The database connector version.
	 */
	public function getVersion()
	{
		$version = $this->connection->getAttribute(\PDO::ATTR_SERVER_VERSION);

		if (stripos($version, 'mariadb') !== false)
		{
			// MariaDB: Strip off any leading '5.5.5-', if present
			return preg_replace('/^5\.5\.5-/', '', $version);
		}

		return $version;
	}

	/**
	 * Determines if the database engine supports UTF-8 character encoding.
	 *
	 * @return  boolean  True if supported.
	 */
	public function hasUTF()
	{
		$serverVersion = $this->getVersion();
		$mariadb       = stripos($serverVersion, 'mariadb') !== false;

		// At this point we know the client supports utf8mb4.  Now we must check if the server supports utf8mb4 as well.
		$utf8mb4 = version_compare($serverVersion, '5.5.3', '>=');

		if ($mariadb && version_compare($serverVersion, '10.0.0', '<'))
		{
			$utf8mb4 = false;
		}

		return $utf8mb4;
	}

	/**
	 * Method to get the auto-incremented value from the last INSERT statement.
	 *
	 * @return  integer  The value of the auto-increment field from the last inserted row.
	 */
	public function insertid()
	{
		// Error suppress this to prevent PDO warning us that the driver doesn't support this operation.
		return @$this->connection->lastInsertId();
	}

	/**
	 * Method to get the next row in the result set from the database query as an object.
	 *
	 * @param   string  $class  The class name to use for the returned row object.
	 *
	 * @return  mixed   The result of the query as an array, false if there are no more rows.
	 */
	public function loadNextObject($class = 'stdClass')
	{
		// Execute the query and get the result set cursor.
		if (!$this->cursor)
		{
			if (!($this->execute()))
			{
				return $this->errorNum ? null : false;
			}
		}

		// Get the next row from the result set as an object of type $class.
		if ($row = $this->fetchObject(null, $class))
		{
			return $row;
		}

		// Free up system resources and return.
		$this->freeResult();

		return false;
	}

	/**
	 * Method to get the next row in the result set from the database query as an array.
	 *
	 * @return  mixed  The result of the query as an array, false if there are no more rows.
	 */
	public function loadNextRow()
	{
		// Execute the query and get the result set cursor.
		if (!$this->cursor)
		{
			if (!($this->execute()))
			{
				return $this->errorNum ? null : false;
			}
		}

		// Get the next row from the result set as an object of type $class.
		if ($row = $this->fetchArray())
		{
			return $row;
		}

		// Free up system resources and return.
		$this->freeResult();

		return false;
	}

	public function open()
	{
		if ($this->connected())
		{
			return;
		}
		else
		{
			$this->close();
		}

		if (!isset($this->charset))
		{
			$this->charset = 'utf8mb4';
		}

		$this->port = $this->port ?: 3306;

		$format = 'mysql:host=#HOST#;port=#PORT#;dbname=#DBNAME#;charset=#CHARSET#';

		if ($this->socket)
		{
			$format = 'mysql:socket=#SOCKET#;dbname=#DBNAME#;charset=#CHARSET#';
		}

		$replace = ['#HOST#', '#PORT#', '#SOCKET#', '#DBNAME#', '#CHARSET#'];
		$with    = [$this->host, $this->port, $this->socket, $this->_database, $this->charset];

		// Create the connection string:
		$connectionString = str_replace($replace, $with, $format);

		// For SSL/TLS connection encryption.
		if ($this->ssl !== [] && $this->ssl['enable'] === true)
		{
			$sslContextIsNull = true;

			// If customised, add cipher suite, ca file path, ca path, private key file path and certificate file path to PDO driver options.
			foreach (['cipher', 'ca', 'capath', 'key', 'cert'] as $key => $value)
			{
				if ($this->ssl[$value] !== null)
				{
					$this->driverOptions[constant('\PDO::MYSQL_ATTR_SSL_' . strtoupper($value))] = $this->ssl[$value];

					$sslContextIsNull = false;
				}
			}

			// PDO, if no cipher, ca, capath, cert and key are set, can't start TLS one-way connection, set a common ciphers suite to force it.
			if ($sslContextIsNull === true)
			{
				$this->driverOptions[\PDO::MYSQL_ATTR_SSL_CIPHER] = implode(':', static::$defaultCipherSuite);
			}

			// If customised, for capable systems (PHP 7.0.14+ and 7.1.4+) verify certificate chain and Common Name to driver options.
			if ($this->ssl['verify_server_cert'] !== null && defined('\PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT'))
			{
				$this->driverOptions[\PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT] = $this->ssl['verify_server_cert'];
			}
		}

		// connect to the server
		try
		{
			$this->connection = new PDO(
				$connectionString,
				$this->user,
				$this->password,
				$this->driverOptions
			);
		}
		catch (PDOException $e)
		{
			// If we tried connecting through utf8mb4 and we failed let's retry with regular utf8
			if ($this->charset == 'utf8mb4')
			{
				$this->charset = 'UTF8';
				$this->open();

				return;
			}

			$this->errorNum = 2;
			$this->errorMsg = 'Could not connect to MySQL via PDO: ' . $e->getMessage();

			return;
		}

		// Reset the SQL mode of the connection
		try
		{
			$this->connection->exec("SET @@SESSION.sql_mode = '';");
		}
			// Ignore any exceptions (incompatible MySQL versions)
		catch (Exception $e)
		{
		}

		$this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		$this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

		if ($this->selectDatabase && !empty($this->_database))
		{
			$this->select($this->_database);
		}

		$this->freeResult();
	}

	/**
	 * Execute the SQL statement.
	 *
	 * @return  mixed  A database cursor resource on success, boolean false on failure.
	 */
	public function query()
	{
		if (!is_object($this->connection))
		{
			$this->open();
		}

		$this->freeResult();

		// Take a local copy so that we don't modify the original query and cause issues later
		$query = $this->replacePrefix((string)$this->sql);

		if ($this->limit > 0 || $this->offset > 0)
		{
			$query .= ' LIMIT ' . $this->offset . ', ' . $this->limit;
		}

		// Increment the query counter.
		$this->count++;

		// If debugging is enabled then let's log the query.
		if ($this->debug)
		{
			// Add the query to the object queue.
			$this->log[] = $query;
		}

		// Reset the error values.
		$this->errorNum = 0;
		$this->errorMsg = '';

		// Execute the query. Error suppression is used here to prevent warnings/notices that the connection has been lost.
		try
		{
			$this->cursor = $this->connection->query($query);
		}
		catch (Exception $e)
		{
		}

		// If an error occurred handle it.
		if (!$this->cursor)
		{
			$errorInfo      = $this->connection->errorInfo();
			$this->errorNum = $errorInfo[1];
			$this->errorMsg = $errorInfo[2] . ' SQL=' . $query;

			// Check if the server was disconnected.
			if (!$this->connected() && !$this->isReconnecting)
			{
				$this->isReconnecting = true;

				try
				{
					// Attempt to reconnect.
					$this->connection = null;
					$this->open();
				}
					// If connect fails, ignore that exception and throw the normal exception.
				catch (RuntimeException $e)
				{
					throw new RuntimeException($this->errorMsg, $this->errorNum);
				}

				// Since we were able to reconnect, run the query again.
				$result               = $this->query();
				$this->isReconnecting = false;

				return $result;
			}
			// The server was not disconnected.
			else
			{
				throw new RuntimeException($this->errorMsg, $this->errorNum);
			}
		}

		return $this->cursor;
	}

	/**
	 * Select a database for use.
	 *
	 * @param   string  $database  The name of the database to select for use.
	 *
	 * @return  boolean  True if the database was successfully selected.
	 */
	public function select($database)
	{
		try
		{
			$this->connection->exec('USE ' . $this->quoteName($database));
		}
		catch (Exception $e)
		{
			$errorInfo      = $this->connection->errorInfo();
			$this->errorNum = $errorInfo[1];
			$this->errorMsg = $errorInfo[2];

			return false;
		}

		return true;
	}

	/**
	 * Set the connection to use UTF-8 character encoding.
	 *
	 * @return  boolean  True on success.
	 */
	public function setUTF()
	{
		return true;
	}

	/**
	 * Method to commit a transaction.
	 *
	 * @return  void
	 */
	public function transactionCommit()
	{
		$this->connection->commit();
	}

	/**
	 * Method to roll back a transaction.
	 *
	 * @return  void
	 */
	public function transactionRollback()
	{
		$this->connection->rollBack();
	}

	/**
	 * Method to initialize a transaction.
	 *
	 * @return  void
	 */
	public function transactionStart()
	{
		$this->connection->beginTransaction();
	}

	/**
	 * Method to fetch a row from the result set cursor as an array.
	 *
	 * @param   mixed  $cursor  The optional result set cursor from which to fetch the row.
	 *
	 * @return  mixed  Either the next row from the result set or false if there are no more rows.
	 */
	protected function fetchArray($cursor = null)
	{
		$ret = null;

		if (!empty($cursor) && $cursor instanceof PDOStatement)
		{
			$ret = $cursor->fetch(PDO::FETCH_NUM);
		}
		elseif ($this->cursor instanceof PDOStatement)
		{
			$ret = $this->cursor->fetch(PDO::FETCH_NUM);
		}

		return $ret;
	}

	/**
	 * Method to fetch a row from the result set cursor as an object.
	 *
	 * @param   mixed   $cursor  The optional result set cursor from which to fetch the row.
	 * @param   string  $class   The class name to use for the returned row object.
	 *
	 * @return  mixed   Either the next row from the result set or false if there are no more rows.
	 */
	protected function fetchObject($cursor = null, $class = 'stdClass')
	{
		$ret = null;

		if (!empty($cursor) && $cursor instanceof PDOStatement)
		{
			$ret = $cursor->fetchObject($class);
		}
		elseif ($this->cursor instanceof PDOStatement)
		{
			$ret = $this->cursor->fetchObject($class);
		}

		return $ret;
	}
}
components/com_akeeba/BackupEngine/web.config000060400000001025152453623440015300 0ustar00<?xml version="1.0"?>
<!--
    This only works on IIS 7 or later. See https://www.iis.net/configreference/system.webserver/security/requestfiltering/fileextensions
-->
<configuration>
    <system.webServer>
        <security>
            <requestFiltering>
                <fileExtensions allowUnlisted="false" >
                    <clear />
                    <add fileExtension=".html" allowed="true"/>
                </fileExtensions>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>components/com_akeeba/BackupEngine/Platform/Exception/DecryptionException.php000060400000002612152453623440023571 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Platform\Exception;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Platform;
use Exception;
use RuntimeException;

/**
 * Thrown when the settings cannot be decrypted, e.g. when the server no longer has encyrption enabled or the key has
 * changed.
 */
class DecryptionException extends RuntimeException
{
	public function __construct($message = null, $code = 500, Exception $previous = null)
	{
		if (empty($message))
		{
			$message = Platform::getInstance()->translate('COM_AKEEBA_CONFIG_ERR_DECRYPTION');
		}

		parent::__construct($message, $code, $previous);
	}

}
components/com_akeeba/BackupEngine/Platform/PlatformInterface.php000060400000030332152453623440021241 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Platform;

defined('AKEEBAENGINE') || die();

use Exception;

/**
 * Interface PlatformInterface
 *
 * @property string $tableNameProfiles The name of the table where backup profiles are stored
 * @property string $tableNameStats    The name of the table where backup records are stored
 * @property array  $configOverrides   Configuration overrides
 */
interface PlatformInterface
{
	/**
	 * Returns an array with the directory/-ies in which the magic autoloader should look for platform overrides.
	 *
	 * @return  array
	 */
	public function getPlatformDirectories();

	/**
	 * Performs heuristics to determine if this platform object is the ideal
	 * candidate for the environment Akeeba Engine is running in.
	 *
	 * @return  bool
	 */
	public function isThisPlatform();

	/**
	 * Saves the current configuration to the database table
	 *
	 * @param   int  $profile_id      The profile where to save the configuration
	 *                                to, defaults to current profile
	 *
	 * @return  bool  True if everything was saved properly
	 */
	public function save_configuration($profile_id = null);

	/**
	 * Loads the current configuration off the database table
	 *
	 * @param   int  $profile_id  The profile where to read the configuration from, defaults to current profile
	 *
	 * @return  bool  True if everything was read properly
	 */
	public function load_configuration($profile_id = null);

	/**
	 * Returns an associative array of stock platform directories
	 *
	 * @return  array
	 */
	public function get_stock_directories();

	/**
	 * Returns the absolute path to the site's root
	 *
	 * @return  string
	 */
	public function get_site_root();

	/**
	 * Returns the absolute path to the installer images directory
	 *
	 * @return  string
	 */
	public function get_installer_images_path();

	/**
	 * Returns the active profile number
	 *
	 * @return  integer
	 */
	public function get_active_profile();

	/**
	 * Returns the selected profile's name. If no ID is specified, the current
	 * profile's name is returned.
	 *
	 * @param   integer|null  $id  The ID of the profile, skip for current profile
	 *
	 * @return  string
	 */
	public function get_profile_name($id = null);

	/**
	 * Returns the backup origin
	 *
	 * @return  string  Backup origin: backend|frontend
	 */
	public function get_backup_origin();

	/**
	 * Returns a timestamp formatted for the current site's database driver
	 *
	 * @param   string  $date  [optional] The timestamp to use. Omit to use current timestamp.
	 *
	 * @return  string
	 */
	public function get_timestamp_database($date = 'now');

	/**
	 * Returns the current timestamp, taking into account any TZ information,
	 * in the format specified by $format.
	 *
	 * @param   string  $format  Timestamp format string (standard PHP format string)
	 *
	 * @return  string
	 */
	public function get_local_timestamp($format);

	/**
	 * Returns the current host name
	 *
	 * @return  string
	 */
	public function get_host();

	/**
	 * Returns the current site's name
	 *
	 * @return  string
	 */
	public function get_site_name();

	/**
	 * Creates or updates the statistics record of the current backup attempt
	 *
	 * @param   int    $id    Backup record ID, use null for new record
	 * @param   array  $data  The data to store
	 *
	 * @return int|null The new record id, or null if this doesn't apply
	 *
	 * @throws Exception On database error
	 */
	public function set_or_update_statistics($id = null, $data = []);

	/**
	 * Loads and returns a backup statistics record as a hash array
	 *
	 * @param   int  $id  Backup record ID
	 *
	 * @return  array
	 */
	public function get_statistics($id);

	/**
	 * Completely removes a backup statistics record
	 *
	 * @param   int  $id  Backup record ID
	 *
	 * @return  bool  True on success
	 */
	public function delete_statistics($id);

	/**
	 * Returns a list of backup statistics records, respecting the pagination
	 *
	 * The $config array allows the following options to be set:
	 * limitstart    int        Offset in the recordset to start from
	 * limit        int        How many records to return at once
	 * filters        array    An array of filters to apply to the results. Alternatively you can just pass a profile
	 * ID to filter by that profile. order        array    Record ordering information (by and ordering)
	 *
	 * @param   array  $config  See above
	 *
	 * @return  array
	 */
	function &get_statistics_list($config = []);

	/**
	 * Return the total number of statistics records
	 *
	 * @param   array  $filters  An array of filters to apply to the results. Alternatively you can just pass a profile
	 *                           ID to filter by that profile.
	 *
	 * @return  integer
	 */
	function get_statistics_count($filters = null);

	/**
	 * Returns an array with the specifics of running backups
	 *
	 * @param   string  $tag  The backup type (e.g. backend)
	 *
	 * @return  array
	 */
	public function get_running_backups($tag = null);

	/**
	 * Multiple backup attempts can share the same backup file name. Only
	 * the last backup attempt's file is considered valid. Previous attempts
	 * have to be deemed "obsolete". This method returns a list of backup
	 * statistics ID's with "valid"-looking names. IT DOES NOT CHECK FOR THE
	 * EXISTENCE OF THE BACKUP FILE!
	 *
	 * @param   bool    $useprofile   If true, it will only return backup records of the current profile
	 * @param   array   $tagFilters   Which tags to include; leave blank for all. If the first item is "NOT", then all
	 *                                tags EXCEPT those listed will be included.
	 * @param   string  $ordering     Ordering of the records, default DESC (descending), use DESC or ASC
	 *
	 * @return  array    A list of ID's for records w/ "valid"-looking backup files
	 */
	public function &get_valid_backup_records($useprofile = false, $tagFilters = [], $ordering = 'DESC');

	/**
	 * Invalidates older records sharing the same $archivename
	 *
	 * @param   string  $archivename  The archive name
	 *
	 * @return  void
	 */
	public function remove_duplicate_backup_records($archivename);

	/**
	 * Marks the specified backup records as having no files
	 *
	 * @param   array  $ids  Array of backup record IDs to ivalidate
	 *
	 * @return  void
	 */
	public function invalidate_backup_records($ids);

	/**
	 * Gets a list of records with remotely stored files in the selected remote storage
	 * provider and profile.
	 *
	 * @param   int     $profile   (optional) The profile to use. Skip or use null for active profile.
	 * @param   string  $engine    (optional) The remote engine to looks for. Skip or use null for the active profile's
	 *                             engine.
	 *
	 * @return  array
	 */
	public function get_valid_remote_records($profile = null, $engine = null);

	/**
	 * Returns the filter data for the entire filter group collection
	 *
	 * @return  array
	 */
	public function &load_filters();

	/**
	 * Saves the nested filter data array $filter_data to the database
	 *
	 * @param   array  $filter_data  The filter data to save
	 *
	 * @return  bool  True on success
	 */
	public function save_filters(&$filter_data);

	/**
	 * Gets the best matching database driver class, according to CMS settings
	 *
	 * @param   bool  $use_platform     If set to false, it will forcibly try to assign one of the primitive type
	 *                                  (Mysql/Mysqli) and NEVER tell you to use an platform driver
	 *
	 * @return  string
	 */
	public function get_default_database_driver($use_platform = true);

	/**
	 * Returns a set of options to connect to the default database of the current CMS
	 *
	 * @return  array
	 */
	public function get_platform_database_options();

	/**
	 * Provides a platform-specific translation function
	 *
	 * @param   string  $key  The translation key
	 *
	 * @return  string
	 */
	public function translate($key);

	/**
	 * Populates global constants holding the Akeeba version
	 *
	 * @return  void
	 */
	public function load_version_defines();

	/**
	 * Returns the platform name and version
	 *
	 * @return  array  Contains the platform name and version
	 */
	public function getPlatformVersion();

	/**
	 * Logs platform-specific directories with LogLevel::INFO log level
	 *
	 * @return  string  If there are any extra notes / warnings on this platform
	 */
	public function log_platform_special_directories();

	/**
	 * Loads a platform-specific software configuration option. These are
	 * configuration values for the backup engine, but unlike the rest of the
	 * configuration options they are not stored in the backup profile.
	 * Instead, these are stored globally using a platform-specific method.
	 * So these are not configuration values for the platform itself.
	 *
	 * @param   string  $key      The configuration option to retrieve
	 * @param   mixed   $default  The default value to return if it's not defined
	 *
	 * @return  mixed
	 */
	public function get_platform_configuration_option($key, $default);

	/**
	 * Returns a list of emails to the administrators
	 *
	 * @return  array
	 */
	public function get_administrator_emails();

	/**
	 * Sends a very simple email using the platform's emailer facility
	 *
	 * @param   string  $to          Recipient address
	 * @param   string  $subject     Email subject line
	 * @param   string  $body        Email body (plain text)
	 * @param   string  $attachFile  (optional) Full path to the file being attached
	 *
	 * @return  bool  True on success
	 */
	public function send_email($to, $subject, $body, $attachFile = null);

	/**
	 * Deletes a file from the local server using direct file access or FTP
	 *
	 * @param   string  $file  The file to unlink
	 *
	 * @return  bool  True on success
	 */
	public function unlink($file);

	/**
	 * Moves a file around within the local server using direct file access or FTP
	 *
	 * @param   string  $from  Full path of the file to move
	 * @param   string  $to    Full path of where the file will be moved to
	 *
	 * @return  bool  True on success
	 */
	public function move($from, $to);

	/**
	 * Stores a flash (temporary) variable in the session.
	 *
	 * @param   string  $name   The name of the variable to store
	 * @param   string  $value  The value of the variable to store
	 *
	 * @return  void
	 */
	public function set_flash_variable($name, $value);

	/**
	 * Return the value of a flash (temporary) variable from the session and
	 * immediately removes it.
	 *
	 * @param   string  $name     The name of the flash variable
	 * @param   mixed   $default  Default value, if the variable is not defined
	 *
	 * @return  mixed  The value of the variable or $default if it's not set
	 */
	public function get_flash_variable($name, $default = null);

	/**
	 * Perform an immediate redirection to the defined URL
	 *
	 * @param   string  $url  The URL to redirect to
	 *
	 * @return  void
	 */
	public function redirect($url);

	/**
	 * Get the proxy configuration for this platform.
	 *
	 * @return  array{enabled: bool, host: string, port: int, user: string, pass: string}
	 * @since   9.0.7
	 */
	public function getProxySettings();

	/**
	 * Set the proxy configuration for this platform
	 *
	 * @param   false   $useProxy  Should I use a proxy at all?
	 * @param   string  $host      Proxy hostname or IP address
	 * @param   int     $port      Proxy port
	 * @param   string  $username  Proxy username. Optional. Leavel blank to turn off authentication.
	 * @param   string  $password  Proxy password.
	 *
	 * @return  void
	 * @since   9.0.7
	 */
	public function setProxySettings($useProxy = false, $host = '', $port = 8080, $username = '', $password = '');
}
components/com_akeeba/BackupEngine/Platform/Base.php000060400000072161152453623440016514 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Platform;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Driver\Mysqli;
use Akeeba\Engine\Driver\QueryException;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform\Exception\DecryptionException;
use Akeeba\Engine\Util\ProfileMigration;
use DateTime;
use DateTimeZone;
use Exception;
use RuntimeException;

abstract class Base implements PlatformInterface
{
	/** @var array Configuration overrides */
	public $configOverrides = [];

	/** @var bool Should I throw an exception when settings decryption fails? */
	public $decryptionException = false;

	/** @var string The name of the platform (same as the directory name) */
	public $platformName = null;

	/** @var int Priority of this platform. A lower number denotes higher priority. */
	public $priority = 50;

	/** @var string The name of the table where backup profiles are stored */
	public $tableNameProfiles = '#__ak_profiles';

	/** @var string The name of the table where backup records are stored */
	public $tableNameStats = '#__ak_stats';

	/** @var bool Have I initialised the proxy configuration settings? */
	protected $hasInitialisedProxySettings = false;

	/** @var bool Should I use a proxy? */
	protected $proxyEnabled = false;

	/** @var string Proxy hostname or IP address */
	protected $proxyHost = '';

	/** @var string Proxy password; only applied with a non-empty username */
	protected $proxyPass = '';

	/** @var int Proxy port */
	protected $proxyPort = 8080;

	/** @var string Proxy username; empty means no authentication */
	protected $proxyUser = '';

	/**
	 * Completely removes a backup statistics record
	 *
	 * @param   int  $id  Backup record ID
	 *
	 * @return bool True on success
	 */
	public function delete_statistics($id)
	{
		$db    = Factory::getDatabase($this->get_platform_database_options());
		$query = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
			->delete($db->qn($this->tableNameStats))
			->where($db->qn('id') . ' = ' . $db->q($id));
		$db->setQuery($query);

		$result = true;
		try
		{
			$db->query();
		}
		catch (Exception $exc)
		{
			$result = false;
		}

		return $result;
	}

	public function getPlatformDirectories()
	{
		return [dirname(__FILE__) . '/' . $this->platformName];
	}

	public function getPlatformVersion()
	{
		return [
			'name'    => 'Platform',
			'version' => 'unknown',
		];
	}

	/**
	 * @inheritdoc
	 */
	public final function getProxySettings()
	{
		if (!$this->hasInitialisedProxySettings)
		{
			$this->detectProxySettings();
		}

		return [
			'enabled' => $this->proxyEnabled ?? false,
			'host'    => $this->proxyHost ?: '',
			'port'    => $this->proxyPort ?: 8080,
			'user'    => $this->proxyUser ?: '',
			'pass'    => $this->proxyPass ?: '',
		];
	}

	public function get_active_profile()
	{
		return 1;
	}

	public function get_administrator_emails()
	{
		return [];
	}

	public function get_backup_origin()
	{
		return 'backend';
	}

	public function get_default_database_driver($use_platform = true)
	{
		return Mysqli::class;
	}

	public function get_host()
	{
		return '';
	}

	public function get_installer_images_path()
	{
		return '';
	}

	public function get_local_timestamp($format)
	{
		$dateNow = new DateTime('now', new DateTimeZone('UTC'));

		return $dateNow->format($format);
	}

	public function get_platform_configuration_option($key, $default)
	{
		return '';
	}

	public function get_platform_database_options()
	{
		return [];
	}

	public function get_profile_name($id = null)
	{
		return '';
	}

	/**
	 * Returns an array with the specifics of running backups
	 *
	 * @param   string  $tag
	 *
	 * @return  array   Array list of associative arrays
	 * @throws  QueryException
	 *
	 */
	public function get_running_backups($tag = null)
	{
		$db    = Factory::getDatabase($this->get_platform_database_options());
		$query = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
			->select('*')
			->from($db->qn($this->tableNameStats))
			->where($db->qn('status') . ' = ' . $db->q('run'))
			->where(' NOT ' . $db->qn('archivename') . ' = ' . $db->q(''));
		if (!empty($tag))
		{
			$query->where($db->qn('origin') . ' LIKE ' . $db->q($tag . '%'));
		}
		$db->setQuery($query);

		return $db->loadAssocList();
	}

	public function get_site_name()
	{
		return '';
	}

	public function get_site_root()
	{
		return '';
	}

	/**
	 * Loads and returns a backup statistics record as a hash array
	 *
	 * @param   int  $id  Backup record ID
	 *
	 * @return array
	 */
	public function get_statistics($id)
	{
		$db    = Factory::getDatabase($this->get_platform_database_options());
		$query = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
			->select('*')
			->from($db->qn($this->tableNameStats))
			->where($db->qn('id') . ' = ' . $db->q($id));
		$db->setQuery($query);

		return $db->loadAssoc();
	}

	/**
	 * Return the total number of statistics records
	 *
	 * @param   array  $filters  An array of filters to apply to the results. Alternatively you can just pass a profile
	 *                           ID to filter by that profile.
	 *
	 * @return int
	 */
	function get_statistics_count($filters = null)
	{
		$db = Factory::getDatabase($this->get_platform_database_options());

		$query = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true));

		if (!empty($filters))
		{
			if (is_array($filters))
			{
				if (!empty($filters))
				{
					// Parse the filters array
					foreach ($filters as $f)
					{
						$clause = $db->quoteName($f['field']);
						if (array_key_exists('operand', $f))
						{
							$clause .= ' ' . strtoupper($f['operand']) . ' ';
						}
						else
						{
							$clause .= ' = ';
						}
						if ($f['operand'] == 'BETWEEN')
						{
							$clause .= $db->q($f['value']) . ' AND ' . $db->q($f['value2']);
						}
						elseif ($f['operand'] == 'LIKE')
						{
							$clause .= '\'%' . $db->escape($f['value']) . '%\'';
						}
						else
						{
							$clause .= $db->q($f['value']);
						}
						$query->where($clause);
					}
				}
			}
			else
			{
				// Legacy mode: profile ID given
				$query->where($db->qn('profile_id') . ' = ' . $db->q($filters));
			}
		}

		$query->select('COUNT(*)')
			->from($db->quoteName($this->tableNameStats));
		$db->setQuery($query);

		return $db->loadResult();
	}

	/**
	 * Returns a list of backup statistics records, respecting the pagination
	 *
	 * The $config array allows the following options to be set:
	 * limitstart    int        Offset in the recordset to start from
	 * limit        int        How many records to return at once
	 * filters        array    An array of filters to apply to the results. Alternatively you can just pass a profile
	 * ID to filter by that profile. order        array    Record ordering information (by and ordering)
	 *
	 * @return array
	 */
	function &get_statistics_list($config = [])
	{
		$defaultConfiguration = [
			'limitstart' => 0,
			'limit'      => 0,
			'filters'    => [],
			'order'      => null,
		];
		$config               = (object) array_merge($defaultConfiguration, $config);

		$db = Factory::getDatabase($this->get_platform_database_options());

		$query = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true));

		if (!empty($config->filters))
		{
			if (is_array($config->filters))
			{
				if (!empty($config->filters))
				{
					// Parse the filters array
					foreach ($config->filters as $f)
					{
						$clause = $db->qn($f['field']);
						if (array_key_exists('operand', $f))
						{
							$clause .= ' ' . strtoupper($f['operand']) . ' ';
							if ($f['operand'] == 'BETWEEN')
							{
								$clause .= $db->q($f['value']) . ' AND ' . $db->q($f['value2']);
							}
							elseif ($f['operand'] == 'LIKE')
							{
								$clause .= '\'%' . $db->escape($f['value']) . '%\'';
							}
							else
							{
								$clause .= $db->q($f['value']);
							}
						}
						else
						{
							$clause .= ' = ' . $db->q($f['value']);
						}

						$query->where($clause);
					}
				}
			}
			else
			{
				// Legacy mode: profile ID given
				$query->where($db->qn('profile_id') . ' = ' . $db->q($config->filters));
			}
		}

		if (empty($config->order) || !is_array($config->order))
		{
			$config->order = [
				'by'    => 'id',
				'order' => 'DESC',
			];
		}

		$query->select('*')
			->from($db->qn($this->tableNameStats))
			->order($db->qn($config->order['by']) . " " . strtoupper($config->order['order']));

		$db->setQuery($query, $config->limitstart, $config->limit);

		$list = $db->loadAssocList();

		return $list;
	}

	public function get_stock_directories()
	{
		return [];
	}

	public function get_timestamp_database($date = 'now')
	{
		return '';
	}

	/**
	 * Multiple backup attempts can share the same backup file name. Only
	 * the last backup attempt's file is considered valid. Previous attempts
	 * have to be deemed "obsolete". This method returns a list of backup
	 * statistics ID's with "valid"-looking names. IT DOES NOT CHECK FOR THE
	 * EXISTENCE OF THE BACKUP FILE!
	 *
	 * @param   bool    $useprofile  If true, it will only return backup records of the current profile
	 * @param   array   $tagFilters  Which tags to include; leave blank for all. If the first item is "NOT", then all
	 *                               tags EXCEPT those listed will be included.     *
	 * @param   string  $ordering
	 *
	 * @return  array A list of ID's for records w/ "valid"-looking backup files
	 * @throws  QueryException
	 *
	 */
	public function &get_valid_backup_records($useprofile = false, $tagFilters = [], $ordering = 'DESC')
	{
		$db = Factory::getDatabase($this->get_platform_database_options());

		$query2 = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
			->select('MAX(' . $db->qn('id') . ') AS ' . $db->qn('id'))
			->from($db->qn($this->tableNameStats))
			->where($db->qn('status') . ' = ' . $db->q('complete'))
			->group($db->qn('absolute_path'));

		$query = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
			->select($db->qn('id'))
			->from($db->qn($this->tableNameStats))
			->where($db->qn('filesexist') . ' = ' . $db->q(1))
			->where($db->qn('id') . ' IN (' . $query2 . ')')
			->where('NOT ' . $db->qn('absolute_path') . ' = ' . $db->q(''))
			->order($db->qn('id') . ' ' . $ordering);

		if ($useprofile)
		{
			$profile_id = $this->get_active_profile();
			$query->where($db->qn('profile_id') . " = " . $db->q($profile_id));
		}

		if (!empty($tagFilters))
		{
			$operator = '';
			$first    = array_shift($tagFilters);
			if ($first == 'NOT')
			{
				$operator = 'NOT';
			}
			else
			{
				array_unshift($tagFilters, $first);
			}

			$quotedTags = [];
			foreach ($tagFilters as $tag)
			{
				$quotedTags[] = $db->q($tag);
			}
			$filter = implode(', ', $quotedTags);
			unset($quotedTags);
			$query->where($operator . ' ' . $db->quoteName('tag') . ' IN (' . $filter . ')');
		}

		$db->setQuery($query);
		$array = $db->loadColumn();

		return $array;
	}

	/**
	 * Gets a list of records with remotely stored files in the selected remote storage
	 * provider and profile.
	 *
	 * @param $profile int (optional) The profile to use. Skip or use null for active profile.
	 * @param $engine  string (optional) The remote engine to looks for. Skip or use null for the active profile's
	 *                 engine.
	 *
	 * @return array
	 */
	public function get_valid_remote_records($profile = null, $engine = null)
	{
		$config = Factory::getConfiguration();
		$result = [];

		if (is_null($profile))
		{
			$profile = $this->get_active_profile();
		}
		if (is_null($engine))
		{
			$engine = $config->get('akeeba.advanced.postproc_engine', '');
		}

		if (empty($engine))
		{
			return $result;
		}

		$db  = Factory::getDatabase($this->get_platform_database_options());
		$sql = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
			->select('*')
			->from($db->qn($this->tableNameStats))
			->where($db->qn('profile_id') . ' = ' . $db->q($profile))
			->where($db->qn('remote_filename') . ' LIKE ' . $db->q($engine . '://%'))
			->order($db->qn('id') . ' DESC');

		$db->setQuery($sql);

		return $db->loadAssocList();
	}

	/**
	 * Marks the specified backup records as having no files
	 *
	 * @param   array  $ids  Array of backup record IDs to ivalidate
	 */
	public function invalidate_backup_records($ids)
	{
		if (empty($ids))
		{
			return false;
		}
		$db   = Factory::getDatabase($this->get_platform_database_options());
		$temp = [];
		foreach ($ids as $id)
		{
			$temp[] = $db->q($id);
		}
		$list = implode(',', $temp);
		$sql  = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
			->update($db->qn($this->tableNameStats))
			->set($db->qn('filesexist') . ' = ' . $db->q('0'))
			->where($db->qn('id') . ' IN (' . $list . ')');;
		$db->setQuery($sql);

		try
		{
			$db->query();
		}
		catch (Exception $exc)
		{
			return false;
		}

		return true;
	}

	public function isThisPlatform()
	{
		return true;
	}

	/**
	 * Loads the current configuration off the database table
	 *
	 * @param   int   $profile_id  The profile where to read the configuration from, defaults to current profile
	 * @param   bool  $reset       Should I reset the Configuration object before loading the profile? Default: true.
	 *
	 * @return  bool  True if everything was read properly
	 */
	public function load_configuration($profile_id = null, $reset = true)
	{
		// Load the database class
		$db = Factory::getDatabase($this->get_platform_database_options());

		// Get the active profile number, if no profile was specified
		if (is_null($profile_id))
		{
			$profile_id = $this->get_active_profile();
		}

		// Initialize the registry
		$registry = Factory::getConfiguration();

		if ($reset)
		{
			$registry->reset();
		}

		// Is the database connected?
		if (!$db->connected())
		{
			return false;
		}

		try
		{
			// Load the INI format local configuration dump off the database
			$sql = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
				->select($db->qn('configuration'))
				->from($db->qn($this->tableNameProfiles))
				->where($db->qn('id') . ' = ' . $db->q($profile_id));

			$databaseData = $db->setQuery($sql)->loadResult();
		}
		catch (Exception $e)
		{
			$databaseData = null;
		}

		/**
		 * If the profile is not the default and we can't load anything let's switch back to the default profile.
		 *
		 * You will end up here when you have opened the application in two different browsers and Browser A is used to
		 * delete the active profile you were using with Browser B. If we were not to load the default profile Browser B
		 * would try to save the default configuration data to the deleted profile. However, since the profile does not
		 * exist in the database any more the load_configuration at the end of the following if-block would trigger the
		 * same code path, recursively, infinitely until you reached the maximum nesting level in PHP, run out of memory
		 * or hit the execution time limit.
		 */
		if ((empty($databaseData) || is_null($databaseData)) && ($profile_id != 1))
		{
			return $this->load_configuration(1);
		}

		if (empty($databaseData) || is_null($databaseData))
		{
			// No configuration was saved yet - store the defaults
			$saved = $this->save_configuration($profile_id);

			// If this is the case we probably don't have the necessary table. Throw an exception.
			if (!$saved)
			{
				throw new RuntimeException("Could not save data to backup profile #$profile_id", 500);
			}

			return $this->load_configuration($profile_id);
		}

		// Decrypt the data if required
		$secureSettings = Factory::getSecureSettings();
		$noData         = empty($databaseData);
		$signature      = ($noData || (strlen($databaseData) < 12)) ? '' : substr($databaseData, 0, 12);
		$parsedData     = [];

		/**
		 * Special case: profile data is encrypted but encryption is set to false. This means that the user has just
		 * asked for the encryption to be disabled. We have to NOT load the settings so that the application has the
		 * chance to decode the data and write the decoded data back to the database.
		 */

		if (!$secureSettings->supportsEncryption() && in_array($signature, ['###AES128###', '###CTR128###']))
		{
			$dataArray = ['volatile' => ['fake_decrypt_flag' => 1]];
		}
		else
		{
			$databaseData        = $secureSettings->decryptSettings($databaseData);
			$isMigrationRequired = false; // Do I have to migrate the data from INI to JSON
			$corruptedINI        = false; // Is the INI data corrupted?

			// Handle legacy, INI-encoded data
			if (ProfileMigration::looksLikeIni($databaseData))
			{
				$isMigrationRequired = true;
				$corruptedINI        = strpos($databaseData, '[akeeba]') === false;
				$databaseData        = ProfileMigration::convertINItoJSON($databaseData);
			}

			// Detect corrupt JSON data
			$corruptedJSON = strpos($databaseData, '"akeeba"') === false;

			// Did the decryption fail and we were asked to throw an exception?
			if ($this->decryptionException && !$noData)
			{
				// The decryption failed, it returned empty data
				if (!$isMigrationRequired && empty($databaseData))
				{
					throw new DecryptionException(
						$this->translate('COM_AKEEBA_CONFIG_ERR_DECRYPTION') .
						"\nAdditional info: Empty data after decryption."
					);
				}

				// We tried to migrate but the INI data is corrupt
				if ($isMigrationRequired && $corruptedINI)
				{
					throw new DecryptionException(
						$this->translate('COM_AKEEBA_CONFIG_ERR_DECRYPTION') .
						"\nAdditional info: old format INI data was corrupt and could not be migrated to JSON."
					);
				}

				// We tried to migrate but the resulting JSON data is corrupt
				if ($isMigrationRequired && $corruptedJSON)
				{
					throw new DecryptionException(
						$this->translate('COM_AKEEBA_CONFIG_ERR_DECRYPTION') .
						"\nAdditional info: JSON data was corrupt after migrating it from INI data."
					);
				}

				// We decrypted something but it does not look like JSON. Wrong encryption key?
				if ($corruptedJSON)
				{
					throw new DecryptionException(
						$this->translate('COM_AKEEBA_CONFIG_ERR_DECRYPTION') .
						"\nAdditional info: configuration JSON data was corrupt after decryption."
					);
				}
			}

			$dataArray = json_decode($databaseData, true);
		}

		unset($databaseData);

		if (!is_array($dataArray))
		{
			$dataArray = [];
		}

		foreach ($dataArray as $section => $row)
		{
			if ($section == 'volatile')
			{
				continue;
			}

			$row = $this->arrayToRegistryDefinitions($row);

			if (is_array($row) && !empty($row))
			{
				foreach ($row as $key => $value)
				{
					$parsedData["$section.$key"] = $value;
				}
			}
		}

		unset($dataArray);

		// Import the configuration array
		$protected_keys = $registry->getProtectedKeys();
		$registry->resetProtectedKeys();
		$registry->mergeArray($parsedData, false, false);

		// Old profiles have advanced.proc_engine instead of advanced.postproc_engine. Migrate them.
		$procEngine = $registry->get('akeeba.advanced.proc_engine', null);

		if (!empty($procEngine))
		{
			$registry->set('akeeba.advanced.postproc_engine', $procEngine);
			$registry->set('akeeba.advanced.proc_engine', null);
		}

		// Apply config overrides
		if (is_array($this->configOverrides) && !empty($this->configOverrides))
		{
			$registry->mergeArray($this->configOverrides, false, false);
		}

		$registry->setProtectedKeys($protected_keys);
		$registry->activeProfile = $profile_id;

		return true;
	}

	/**
	 * Returns the filter data for the entire filter group collection
	 *
	 * @return array
	 */
	public function &load_filters()
	{
		// Load the filter data from the database
		$profile_id = $this->get_active_profile();
		$db         = Factory::getDatabase($this->get_platform_database_options());

		// Load the INI format local configuration dump off the database
		$sql = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
			->select($db->qn('filters'))
			->from($db->qn($this->tableNameProfiles))
			->where($db->qn('id') . ' = ' . $db->q($profile_id));
		$db->setQuery($sql);
		$all_filter_data = $db->loadResult();

		if (is_null($all_filter_data) || empty($all_filter_data))
		{
			$all_filter_data = [];

			return $all_filter_data;
		}

		if (ProfileMigration::looksLikeSerialized($all_filter_data))
		{
			$all_filter_data = ProfileMigration::convertSerializedToJSON($all_filter_data);
		}

		$all_filter_data = json_decode($all_filter_data, true);

		// Catch unserialization errors
		if (empty($all_filter_data))
		{
			$all_filter_data = [];
		}

		return $all_filter_data;
	}

	public function load_version_defines()
	{
	}

	public function log_platform_special_directories()
	{
	}

	public function move($from, $to)
	{
		$result = @rename($from, $to);
		if (!$result)
		{
			$result = @copy($from, $to);
			if ($result)
			{
				$result = $this->unlink($from);
			}
		}

		return $result;
	}

	public function register_autoloader()
	{
	}

	/**
	 * Invalidates older records sharing the same $archivename
	 *
	 * @param   string  $archivename
	 */
	public function remove_duplicate_backup_records($archivename)
	{
		Factory::getLog()->debug("Removing any old records with $archivename filename");
		$db = Factory::getDatabase($this->get_platform_database_options());

		$query = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
			->select($db->qn('id'))
			->from($db->qn($this->tableNameStats))
			->where($db->qn('archivename') . ' = ' . $db->q($archivename))
			->order($db->qn('id') . ' DESC');

		$db->setQuery($query);
		$array = $db->loadColumn();

		Factory::getLog()->debug((is_array($array) || $array instanceof \Countable ? count($array) : 0) . " records found");

		// No records?! Quit.
		if (empty($array))
		{
			return;
		}
		// Only one record. Quit.
		if ((is_array($array) || $array instanceof \Countable ? count($array) : 0) == 1)
		{
			return;
		}

		// Shift the first (latest) element off the array
		$currentID = array_shift($array);

		// Invalidate older records
		$this->invalidate_backup_records($array);
	}

	/**
	 * Saves the current configuration to the database table
	 *
	 * @param   int  $profile_id  The profile where to save the configuration to, defaults to current profile
	 *
	 * @return    bool    True if everything was saved properly
	 */
	public function save_configuration($profile_id = null)
	{
		// Load the database class
		$db = Factory::getDatabase($this->get_platform_database_options());

		if (!$db->connected())
		{
			return false;
		}

		// Get the active profile number, if no profile was specified
		if (is_null($profile_id))
		{
			$profile_id = $this->get_active_profile();
		}

		// Get an INI format registry dump
		$registry     = Factory::getConfiguration();
		$dump_profile = $registry->exportAsJSON();

		// Encrypt the registry dump if required
		$secureSettings = Factory::getSecureSettings();
		$dump_profile   = $secureSettings->encryptSettings($dump_profile);

		// Does the record already exist?
		$sql = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
			->select('COUNT(*)')
			->from($db->qn($this->tableNameProfiles))
			->where($db->qn('id') . ' = ' . $db->q($profile_id));

		try
		{
			$count  = $db->setQuery($sql)->loadResult();
			$exists = ($count > 0);
		}
		catch (Exception $e)
		{
			$exists = true;
		}

		if ($exists)
		{
			$sql = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
				->update($db->qn($this->tableNameProfiles))
				->set($db->qn('configuration') . ' = ' . $db->q($dump_profile))
				->where($db->qn('id') . ' = ' . $db->q($profile_id));
		}
		else
		{
			$sql = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
				->insert($db->qn($this->tableNameProfiles))
				->columns([
					$db->qn('id'), $db->qn('description'), $db->qn('configuration'),
					$db->qn('filters'), $db->qn('quickicon'),
				])
				->values(
					$db->q(1) . ', ' .
					$db->q("Default backup profile") . ', ' .
					$db->q($dump_profile) . ', ' .
					$db->q('') . ', ' .
					$db->q(1)
				);
		}

		$db->setQuery($sql);

		try
		{
			$result = $db->query();
		}
		catch (Exception $exc)
		{
			return false;
		}

		return ($result == true);
	}

	/**
	 * Saves the nested filter data array $filter_data to the database
	 *
	 * @param   array  $filter_data  The filter data to save
	 *
	 * @return    bool    True on success
	 */
	public function save_filters(&$filter_data)
	{
		$profile_id = $this->get_active_profile();
		$db         = Factory::getDatabase($this->get_platform_database_options());

		$encodedFilterData = json_encode($filter_data, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_FORCE_OBJECT | JSON_PRETTY_PRINT);

		$sql = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
			->update($db->qn($this->tableNameProfiles))
			->set($db->qn('filters') . '=' . $db->q($encodedFilterData))
			->where($db->qn('id') . ' = ' . $db->q($profile_id));

		try
		{
			$db->setQuery($sql)->query();
		}
		catch (Exception $exc)
		{
			return false;
		}

		return true;
	}

	public function send_email($to, $subject, $body, $attachFile = null)
	{
		return false;
	}

	/** @inheritdoc */
	public final function setProxySettings($useProxy = false, $host = '', $port = 8080, $username = '', $password = '')
	{
		$host = trim($host);
		$port = (int) $port;

		$this->hasInitialisedProxySettings = true;
		$this->proxyEnabled                = $useProxy && !empty($host) && ($port > 0) && ($port < 65536);
		$this->proxyHost                   = $host;
		$this->proxyPort                   = $port;
		$this->proxyUser                   = trim($username ?? '') ?: '';
		$this->proxyPass                   = trim($password ?? '') ?: '';
	}

	/**
	 * Creates or updates the statistics record of the current backup attempt
	 *
	 * @param   int    $id    Backup record ID, use null for new record
	 * @param   array  $data  The data to store
	 *
	 * @return int|null The new record id, or null if this doesn't apply
	 *
	 * @throws Exception On database error
	 */
	public function set_or_update_statistics($id = null, $data = [])
	{
		// No valid data?
		if (!is_array($data))
		{
			return null;
		}

		// No data at all?
		if (empty($data))
		{
			return null;
		}

		$db = Factory::getDatabase($this->get_platform_database_options());

		$tableFields = $db->getTableColumns($this->tableNameStats);
		$tableFields = array_keys($tableFields);

		if (is_null($id))
		{
			// Create a new record
			$sql_fields = [];
			$sql_values = '';

			foreach ($data as $key => $value)
			{
				if (!in_array($key, $tableFields))
				{
					continue;
				}

				$sql_fields[] = $db->qn($key);
				$sql_values   .= (!empty($sql_values) ? ',' : '') . $db->quote($value);
			}

			$sql = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
				->insert($db->quoteName($this->tableNameStats))
				->columns($sql_fields)
				->values($sql_values);

			$db->setQuery($sql);
			$db->query();

			return $db->insertid();
		}
		else
		{
			$sql_set = [];
			foreach ($data as $key => $value)
			{
				if ($key == 'id')
				{
					continue;
				}

				$sql_set[] = $db->qn($key) . '=' . $db->q($value);
			}
			$sql = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
				->update($db->qn($this->tableNameStats))
				->set($sql_set)
				->where($db->qn('id') . '=' . $db->q($id));
			$db->setQuery($sql);
			$db->query();

			return null;
		}
	}

	public function translate($key)
	{
		return '';
	}

	public function unlink($file)
	{
		return @unlink($file);
	}

	/**
	 * Flattens a hierarchical array to a set of registry keys.
	 *
	 * For example
	 * [ 'foo' => [ 'bar' => [ 'baz' => 1, 'bat' => 2 ] ] ]
	 * becomes
	 * [ 'foo.bar.baz' => 1, 'foo.bar.bat' => 2 ]
	 *
	 * @param   array   $array   The array to flatten
	 * @param   string  $prefix  The prefix to use (leave blank; it's used in recursive calls)
	 *
	 * @return  array  An array with flattened keys
	 *
	 * @since   6.4.1
	 */
	protected function arrayToRegistryDefinitions(array $array, $prefix = '')
	{
		$keys = [];

		foreach ($array as $k => $v)
		{
			if (is_array($v))
			{
				$keys = array_merge($keys, $this->arrayToRegistryDefinitions($v, $prefix . $k . "."));

				continue;
			}

			$keys[$prefix . $k] = $v;
		}

		return $keys;
	}

	/**
	 * Automatically-detect the proxy settings for this platform.
	 *
	 * Implement this method to detect the proxy settings. Use $this->setProxysettings() to apply them.
	 *
	 * This method is called by getProxySettings automatically. You do NOT need to call it yourself when initialising
	 * the platform.
	 *
	 * @return  void
	 * @since   9.0.7
	 */
	protected function detectProxySettings()
	{

	}
}
components/com_akeeba/BackupEngine/Scan/Base.php000060400000003136152453623440015610 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Scan;

defined('AKEEBAENGINE') || die();

abstract class Base
{
	/**
	 * Gets all the files of a given folder
	 *
	 * @param   string   $folder    The absolute path to the folder to scan for files
	 * @param   integer  $position  The position in the file list to seek to. Use null for the start of list.
	 *
	 * @return  array  A simple array of files
	 */
	abstract public function getFiles($folder, &$position);

	/**
	 * Gets all the folders (subdirectories) of a given folder
	 *
	 * @param   string   $folder    The absolute path to the folder to scan for files
	 * @param   integer  $position  The position in the file list to seek to. Use null for the start of list.
	 *
	 * @return  array  A simple array of folders
	 */
	abstract public function getFolders($folder, &$position);
}
components/com_akeeba/BackupEngine/Scan/Smart.php000060400000016520152453623440016025 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Scan;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Base\Exceptions\WarningException;
use Akeeba\Engine\Factory;
use DirectoryIterator;
use Exception;
use RuntimeException;

/* Windows system detection */
if (!defined('_AKEEBA_IS_WINDOWS'))
{
	$isWindows = DIRECTORY_SEPARATOR == '\\';

	if (function_exists('php_uname'))
	{
		$isWindows = stristr(php_uname(), 'windows');
	}

	define('_AKEEBA_IS_WINDOWS', $isWindows);
}

/**
 * A filesystem scanner which uses opendir() and is smart enough to make large directories
 * be scanned inside a step of their own.
 *
 * The idea is that if it's not the first operation of this step and the number of contained
 * directories AND files is more than double the number of allowed files per fragment, we should
 * break the step immediately.
 *
 */
class Smart extends Base
{
	public function getFiles($folder, &$position)
	{
		$registry = Factory::getConfiguration();
		// Was the breakflag set BEFORE starting? -- This workaround is required due to PHP5 defaulting to assigning variables by reference
		$breakflag_before_process = $registry->get('volatile.breakflag', false);

		// Reset break flag before continuing
		$breakflag = false;

		// Initialize variables
		$arr   = [];
		$false = false;

		if (!@is_dir($folder) && !@is_dir($folder . '/'))
		{
			return $false;
		}

		$counter    = 0;
		$registry   = Factory::getConfiguration();
		$maxCounter = $registry->get('engine.scan.smart.large_dir_threshold', 100);

		$allowBreakflag = ($registry->get('volatile.operation_counter', 0) != 0) && !$breakflag_before_process;

		if (!@is_dir($folder))
		{
			throw new WarningException('Cannot list contents of directory ' . $folder . ' -- PHP reports it as not a folder.');
		}

		if (!@is_readable($folder))
		{
			throw new WarningException('Cannot list contents of directory ' . $folder . ' -- PHP reports it as not readable.');
		}

		try
		{
			$di = new DirectoryIterator($folder);
		}
		catch (Exception $e)
		{
			throw new WarningException('Cannot list contents of directory ' . $folder . ' -- PHP\'s DirectoryIterator reports the path cannot be opened.', 0, $e);
		}

		if (!$di->valid())
		{
			throw new WarningException('Cannot list contents of directory ' . $folder . ' -- PHP\'s DirectoryIterator could open the folder but immediately reports itself as not valid. If this happens your server is about to die.');
		}

		$ds = ($folder == '') || ($folder == '/') || (@substr($folder, -1) == '/') || (@substr($folder, -1) == DIRECTORY_SEPARATOR) ? '' : DIRECTORY_SEPARATOR;

		/** @var DirectoryIterator $file */
		foreach ($di as $file)
		{
			if ($breakflag)
			{
				break;
			}

			/**
			 * If the directory entry is a link pointing somewhere outside the allowed directories per open_basedir we
			 * will get a RuntimeException (tested on PHP 5.3 onwards). Catching it lets us report the link as
			 * unreadable without suffering a PHP Fatal Error.
			 */
			try
			{
				$file->isLink();
			}
			catch (RuntimeException $e)
			{
				if (!in_array($di->getFilename(), ['.', '..']))
				{
					Factory::getLog()->warning(sprintf("Link %s is inaccessible. Check the open_basedir restrictions in your server's PHP configuration", $file->getPathname()));
				}

				continue;
			}

			if ($file->isDot())
			{
				continue;
			}

			if ($file->isDir())
			{
				continue;
			}

			$dir  = $folder . $ds . $file->getFilename();
			$data = $dir;

			if (_AKEEBA_IS_WINDOWS)
			{
				$data = Factory::getFilesystemTools()->TranslateWinPath($dir);
			}

			if ($data)
			{
				$arr[] = $data;
			}

			$counter++;

			if ($counter >= $maxCounter)
			{
				$breakflag = $allowBreakflag;
			}
		}

		// Save break flag status
		$registry->set('volatile.breakflag', $breakflag);

		return $arr;
	}

	public function getFolders($folder, &$position)
	{
		// Was the breakflag set BEFORE starting? -- This workaround is required due to PHP5 defaulting to assigning variables by reference
		$registry                 = Factory::getConfiguration();
		$breakflag_before_process = $registry->get('volatile.breakflag', false);

		// Reset break flag before continuing
		$breakflag = false;

		// Initialize variables
		$arr   = [];
		$false = false;

		if (!is_dir($folder) && !is_dir($folder . '/'))
		{
			throw new WarningException('Cannot list contents of directory ' . $folder . ' -- PHP reports it as not a folder.');
		}

		if (!@is_readable($folder))
		{
			throw new WarningException('Cannot list contents of directory ' . $folder . ' -- PHP reports it as not readable.');
		}

		$counter    = 0;
		$registry   = Factory::getConfiguration();
		$maxCounter = $registry->get('engine.scan.smart.large_dir_threshold', 100);

		$allowBreakflag = ($registry->get('volatile.operation_counter', 0) != 0) && !$breakflag_before_process;

		try
		{
			$di = new DirectoryIterator($folder);
		}
		catch (Exception $e)
		{
			throw new WarningException('Cannot list contents of directory ' . $folder . ' -- PHP\'s DirectoryIterator reports the path cannot be opened.', 0, $e);
		}

		if (!$di->valid())
		{
			throw new WarningException('Cannot list contents of directory ' . $folder . ' -- PHP\'s DirectoryIterator could open the folder but immediately reports itself as not valid. If this happens your server is about to die.');
		}

		$ds = ($folder == '') || ($folder == '/') || (@substr($folder, -1) == '/') || (@substr($folder, -1) == DIRECTORY_SEPARATOR) ? '' : DIRECTORY_SEPARATOR;

		/** @var DirectoryIterator $file */
		foreach ($di as $file)
		{
			if ($breakflag)
			{
				break;
			}

			/**
			 * If the directory entry is a link pointing somewhere outside the allowed directories per open_basedir we
			 * will get a RuntimeException (tested on PHP 5.3 onwards). Catching it lets us report the link as
			 * unreadable without suffering a PHP Fatal Error.
			 */
			try
			{
				$file->isLink();
			}
			catch (RuntimeException $e)
			{
				if (!in_array($di->getFilename(), ['.', '..']))
				{
					Factory::getLog()->warning(sprintf("Link %s is inaccessible. Check the open_basedir restrictions in your server's PHP configuration", $file->getPathname()));
				}

				continue;
			}

			if ($file->isDot())
			{
				continue;
			}

			if (!$file->isDir())
			{
				continue;
			}

			$dir  = $folder . $ds . $file->getFilename();
			$data = $dir;

			if (_AKEEBA_IS_WINDOWS)
			{
				$data = Factory::getFilesystemTools()->TranslateWinPath($dir);
			}

			if ($data)
			{
				$arr[] = $data;
			}

			$counter++;

			if ($counter >= $maxCounter)
			{
				$breakflag = $allowBreakflag;
			}
		}

		// Save break flag status
		$registry->set('volatile.breakflag', $breakflag);

		return $arr;
	}
}
components/com_akeeba/BackupEngine/Scan/smart.json000060400000001745152453623440016252 0ustar00{
    "_information": {
        "title": "COM_AKEEBA_CONFIG_ENGINE_SCAN_SMART_TITLE",
        "description": "COM_AKEEBA_CONFIG_ENGINE_SCAN_SMART_DESCRIPTION"
    },
    "engine.scan.smart.large_dir_threshold": {
        "default": "100",
        "type": "integer",
        "min": "0",
        "max": "500",
        "shortcuts": "20|50|100|200|300|400|500",
        "scale": "1",
        "uom": "",
        "title": "COM_AKEEBA_CONFIG_LARGEDIRTHRESHOLD_TITLE",
        "description": "COM_AKEEBA_CONFIG_LARGEDIRTHRESHOLD_DESCRIPTION"
    },
    "engine.scan.common.largefile": {
        "default": "10485760",
        "type": "integer",
        "min": "1048576",
        "max": "1048576000",
        "shortcuts": "1048576|2097152|5242880|10485760|15728640|20971520|26214400|31457280|41943040|52428800|78643200|104857600",
        "scale": "1048576",
        "uom": "MB",
        "title": "COM_AKEEBA_CONFIG_LARGEFILE_TITLE",
        "description": "COM_AKEEBA_CONFIG_LARGEFILE_DESCRIPTION"
    }
}components/com_akeeba/BackupEngine/Base/Exceptions/ErrorException.php000060400000002041152453623440022007 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Base\Exceptions;

defined('AKEEBAENGINE') || die();

use RuntimeException;

/**
 * An exception which leads to an error (and complete halt) in the backup process
 */
class ErrorException extends RuntimeException
{

}
components/com_akeeba/BackupEngine/Base/Exceptions/WarningException.php000060400000002020152453623440022320 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Base\Exceptions;

defined('AKEEBAENGINE') || die();

use RuntimeException;

/**
 * An exception which leads to a warning in the backup process
 */
class WarningException extends RuntimeException
{

}
components/com_akeeba/BackupEngine/Base/Part.php000060400000035320152453623440015632 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Base;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Base\Exceptions\ErrorException;
use Akeeba\Engine\Factory;
use Exception;
use Akeeba\Engine\Psr\Log\LogLevel;
use Throwable;

/**
 * Base class for all Akeeba Engine parts.
 *
 * Parts are objects which perform a specific function during the backup process, e.g. backing up files or dumping
 * database contents. They have a fully defined and controlled lifecycle, from initialization to finalization. The
 * transition between lifecycle phases is handled by the `tick()` method which is essentially the only public interface
 * to interacting with an engine part.
 */
abstract class Part
{
	public const STATE_INIT = 0;
	public const STATE_PREPARED = 1;
	public const STATE_RUNNING = 2;
	public const STATE_POSTRUN = 3;
	public const STATE_FINISHED = 4;
	public const STATE_ERROR = 99;

	/**
	 * The current state of this part; see the constants at the top of this class
	 *
	 * @var int
	 */
	protected $currentState = self::STATE_INIT;

	/**
	 * The name of the engine part (a.k.a. Domain), used in return table
	 * generation.
	 *
	 * @var string
	 */
	protected $activeDomain = "";

	/**
	 * The step this engine part is in. Used verbatim in return table and
	 * should be set by the code in the _run() method.
	 *
	 * @var string
	 */
	protected $activeStep = "";

	/**
	 * A more detailed description of the step this engine part is in. Used
	 * verbatim in return table and should be set by the code in the _run()
	 * method.
	 *
	 * @var string
	 */
	protected $activeSubstep = "";

	/**
	 * Any configuration variables, in the form of an array.
	 *
	 * @var array
	 */
	protected $_parametersArray = [];

	/**
	 * The database root key
	 *
	 * @var  string
	 */
	protected $databaseRoot = [];

	/**
	 * Should we log the step nesting?
	 *
	 * @var  bool
	 */
	protected $nest_logging = false;

	/**
	 * Embedded installer preferences
	 *
	 * @var  object
	 */
	protected $installerSettings;

	/**
	 * How much milliseconds should we wait to reach the min exec time
	 *
	 * @var  int
	 */
	protected $waitTimeMsec = 0;

	/**
	 * Should I ignore the minimum execution time altogether?
	 *
	 * @var  bool
	 */
	protected $ignoreMinimumExecutionTime = false;

	/**
	 * The last exception thrown during the tick() method's execution.
	 *
	 * @var null|Exception
	 */
	protected $lastException = null;

	public function _onSerialize()
	{
		$this->lastException = null;
	}

	/**
	 * Public constructor
	 *
	 * @return  void
	 */
	public function __construct()
	{
		// Fetch the installer settings
		$this->installerSettings = (object) [
			'installerroot' => 'installation',
			'sqlroot'       => 'installation/sql',
			'databasesini'  => 1,
			'readme'        => 1,
			'extrainfo'     => 1,
			'password'      => 0,
		];

		$config               = Factory::getConfiguration();
		$installerKey         = $config->get('akeeba.advanced.embedded_installer');
		$installerDescriptors = Factory::getEngineParamsProvider()->getInstallerList();

		// Fall back to default ANGIE installer if the selected installer is not found
		if (!array_key_exists($installerKey, $installerDescriptors))
		{
			$installerKey = 'angie';
		}

		if (array_key_exists($installerKey, $installerDescriptors))
		{
			$this->installerSettings = (object) $installerDescriptors[$installerKey];
		}
	}

	/**
	 * Nested logging of exceptions
	 *
	 * The message is logged using the specified log level. The detailed information of the Throwable and its trace are
	 * logged using the DEBUG level.
	 *
	 * If the Throwable is nested, its parents are logged recursively. This should create a thorough trace leading to
	 * the root cause of an error.
	 *
	 * @param   Exception|Throwable  $exception  The Exception or Throwable to log
	 * @param   string               $logLevel   The log level to use, default ERROR
	 */
	protected static function logErrorsFromException($exception, $logLevel = LogLevel::ERROR)
	{
		$logger = Factory::getLog();

		$logger->log($logLevel, $exception->getMessage());

		$logger->debug(sprintf('[%s] %s(%u) – #%u ‹%s›', get_class($exception), $exception->getFile(), $exception->getLine(), $exception->getCode(), $exception->getMessage()));

		foreach (explode("\n", $exception->getTraceAsString()) as $line)
		{
			$logger->debug(rtrim($line));
		}

		$previous = $exception->getPrevious();

		if (!is_null($previous))
		{
			self::logErrorsFromException($previous, $logLevel);
		}
	}

	/**
	 * The public interface to an engine part. This method takes care for
	 * calling the correct method in order to perform the initialisation -
	 * run - finalisation cycle of operation and return a proper response array.
	 *
	 * @param   int  $nesting
	 *
	 * @return  array  A response array
	 */
	public function tick($nesting = 0)
	{
		$configuration       = Factory::getConfiguration();
		$timer               = Factory::getTimer();
		$this->waitTimeMsec  = 0;
		$this->lastException = null;

		// Add a small wait based on the existence of a constant. Used in testing, to simulate slow servers.
		if (defined('AKEEBA_BACKUP_TESTING_STEP_THROTTLING'))
		{
			/** @noinspection PhpUndefinedConstantInspection */
			usleep((int) AKEEBA_BACKUP_TESTING_STEP_THROTTLING);
		}

		/**
		 * Call the right action method, depending on engine part state.
		 *
		 * The action method may throw an exception to signal failure, hence the try-catch. If there is an exception we
		 * will set the part's state to STATE_ERROR and store the last exception.
		 */
		try
		{
			switch ($this->getState())
			{
				case self::STATE_INIT:
					$this->_prepare();
					break;

				case self::STATE_PREPARED:
				case self::STATE_RUNNING:
					$this->_run();
					break;

				case self::STATE_POSTRUN:
					$this->_finalize();
					break;
			}
		}
		catch (Exception $e)
		{
			$this->lastException = $e;
			$this->setState(self::STATE_ERROR);
		}

		// If there is still time, we are not finished and there is no break flag set, re-run the tick()
		// method.
		$breakFlag = $configuration->get('volatile.breakflag', false);

		if (
			!in_array($this->getState(), [self::STATE_FINISHED, self::STATE_ERROR]) &&
			($timer->getTimeLeft() > 0) &&
			!$breakFlag &&
			($nesting < 20) &&
			($this->nest_logging)
		)
		{
			// Nesting is only applied if $this->nest_logging == true (currently only Kettenrad has this)
			$nesting++;

			if ($this->nest_logging)
			{
				Factory::getLog()->debug("*** Batching successive steps (nesting level $nesting)");
			}

			return $this->tick($nesting);
		}

		// Return the output array
		$out = $this->makeReturnTable();

		// If it's not a nest-logged part (basically, anything other than Kettenrad) return the output array.
		if (!$this->nest_logging)
		{
			return $out;
		}

		// From here on: things to do for nest-logged parts (i.e. Kettenrad)
		if ($breakFlag)
		{
			Factory::getLog()->debug("*** Engine steps batching: Break flag detected.");
		}

		// Reset the break flag
		$configuration->set('volatile.breakflag', false);

		// Log that we're breaking the step
		Factory::getLog()->debug("*** Batching of engine steps finished. I will now return control to the caller.");

		// Detect whether I need server-side sleep
		$serverSideSleep = $this->needsServerSideSleep();

		// Enforce minimum execution time
		if (!$this->ignoreMinimumExecutionTime)
		{
			$timer              = Factory::getTimer();
			$this->waitTimeMsec = (int) $timer->enforce_min_exec_time(true, $serverSideSleep);
		}

		// Send a Return Table back to the caller
		return $out;
	}

	/**
	 * Returns a copy of the class's status array
	 *
	 * @return  array  The response array
	 */
	public function getStatusArray()
	{
		return $this->makeReturnTable();
	}

	/**
	 * Sends any kind of setup information to the engine part. Using this,
	 * we avoid passing parameters to the constructor of the class. These
	 * parameters should be passed as an indexed array and should be taken
	 * into account during the preparation process only. This function will
	 * set the error flag if it's called after the engine part is prepared.
	 *
	 * @param   array  $parametersArray  The parameters to be passed to the engine part.
	 *
	 * @return  void
	 */
	public function setup($parametersArray)
	{
		if ($this->currentState == self::STATE_PREPARED)
		{
			$this->setState(self::STATE_ERROR);

			throw new ErrorException(__CLASS__ . ":: Can't modify configuration after the preparation of " . $this->activeDomain);
		}

		$this->_parametersArray = $parametersArray;

		if (array_key_exists('root', $parametersArray))
		{
			$this->databaseRoot = $parametersArray['root'];
		}
	}

	/**
	 * Returns the state of this engine part.
	 *
	 * @return  int  The state of this engine part.
	 */
	public function getState()
	{
		if (!is_null($this->lastException))
		{
			$this->currentState = self::STATE_ERROR;
		}

		return $this->currentState;
	}

	/**
	 * Translate the integer state to a string, used by consumers of the public Engine API.
	 *
	 * @param   int  $state  The part state to translate to string
	 *
	 * @return  string
	 */
	public function stateToString($state)
	{
		switch ($state)
		{
			case self::STATE_ERROR:
				return 'error';
				break;

			case self::STATE_INIT:
				return 'init';
				break;

			case self::STATE_PREPARED:
				return 'prepared';
				break;

			case self::STATE_RUNNING:
				return 'running';
				break;

			case self::STATE_POSTRUN:
				return 'postrun';
				break;

			case self::STATE_FINISHED:
				return 'finished';
				break;
		}

		return 'init';
	}

	/**
	 * Get the current domain of the engine
	 *
	 * @return  string  The current domain
	 */
	public function getDomain()
	{
		return $this->activeDomain;
	}

	/**
	 * Get the current step of the engine
	 *
	 * @return  string  The current step
	 */
	public function getStep()
	{
		return $this->activeStep;
	}

	/**
	 * Get the current sub-step of the engine
	 *
	 * @return  string  The current sub-step
	 */
	public function getSubstep()
	{
		return $this->activeSubstep;
	}

	/**
	 * Implement this if your Engine Part can return the percentage of its work already complete
	 *
	 * @return  float  A number from 0 (nothing done) to 1 (all done)
	 */
	public function getProgress()
	{
		return 0;
	}

	/**
	 * Get the value of the minimum execution time ignore flag.
	 *
	 * DO NOT REMOVE. It is used by the Engine consumers.
	 *
	 * @return boolean
	 */
	public function isIgnoreMinimumExecutionTime()
	{
		return $this->ignoreMinimumExecutionTime;
	}

	/**
	 * Set the value of the minimum execution time ignore flag. When set, the nested logging parts (basically,
	 * Kettenrad) will ignore the minimum execution time parameter.
	 *
	 * DO NOT REMOVE. It is used by the Engine consumers.
	 *
	 * @param   boolean  $ignoreMinimumExecutionTime
	 */
	public function setIgnoreMinimumExecutionTime($ignoreMinimumExecutionTime)
	{
		$this->ignoreMinimumExecutionTime = $ignoreMinimumExecutionTime;
	}

	/**
	 * Runs any initialization code. Must set the state to STATE_PREPARED.
	 *
	 * @return  void
	 */
	abstract protected function _prepare();

	/**
	 * Runs any finalisation code. Must set the state to STATE_FINISHED.
	 *
	 * @return  void
	 */
	abstract protected function _finalize();

	/**
	 * Performs the main objective of this part. While still processing the state must be set to STATE_RUNNING. When the
	 * main objective is complete and we're ready to proceed to finalization the state must be set to STATE_POSTRUN.
	 *
	 * @return  void
	 */
	abstract protected function _run();

	/**
	 * Sets the BREAKFLAG, which instructs this engine part that the current step must break immediately,
	 * in fear of timing out.
	 *
	 * @return  void
	 */
	protected function setBreakFlag()
	{
		$registry = Factory::getConfiguration();
		$registry->set('volatile.breakflag', true);
	}

	/**
	 * Sets the engine part's internal state, in an easy to use manner
	 *
	 * @param   int  $state  The part state to set
	 *
	 * @return  void
	 */
	protected function setState($state = self::STATE_INIT)
	{
		$this->currentState = $state;
	}

	/**
	 * Constructs a Response Array based on the engine part's state.
	 *
	 * @return  array  The Response Array for the current state
	 */
	protected function makeReturnTable()
	{
		$errors = [];
		$e      = $this->lastException;

		while (!empty($e))
		{
			$errors[] = $e->getMessage();
			$e        = $e->getPrevious();
		}

		return [
			'HasRun'         => $this->currentState != self::STATE_FINISHED,
			'Domain'         => $this->activeDomain,
			'Step'           => $this->activeStep,
			'Substep'        => $this->activeSubstep,
			'Error'          => implode("\n", $errors),
			'Warnings'       => [],
			'ErrorException' => $this->lastException,
		];
	}

	/**
	 * Set the current domain of the engine
	 *
	 * @param   string  $new_domain  The domain to set
	 *
	 * @return  void
	 */
	protected function setDomain($new_domain)
	{
		$this->activeDomain = $new_domain;
	}

	/**
	 * Set the current step of the engine
	 *
	 * @param   string  $new_step  The step to set
	 *
	 * @return  void
	 */
	protected function setStep($new_step)
	{
		$this->activeStep = $new_step;
	}

	/**
	 * Set the current sub-step of the engine
	 *
	 * @param   string  $new_substep  The sub-step to set
	 *
	 * @return  void
	 */
	protected function setSubstep($new_substep)
	{
		$this->activeSubstep = $new_substep;
	}

	/**
	 * Do I need to apply server-side sleep for the time difference between the elapsed time and the minimum execution
	 * time?
	 *
	 * @return bool
	 */
	private function needsServerSideSleep()
	{
		/**
		 * If the part doesn't support tagging, i.e. I can't determine if this is a backend backup or not, I will always
		 * use server-side sleep.
		 */
		if (!method_exists($this, 'getTag'))
		{
			return true;
		}

		/**
		 * If this is not a backend backup I will always use server-side sleep. That is to say that legacy front-end,
		 * remote JSON API and CLI backups must always use server-side sleep since they do not support client-side
		 * sleep.
		 */
		if (!in_array($this->getTag(), ['backend']))
		{
			return true;
		}

		return Factory::getConfiguration()->get('akeeba.basic.clientsidewait', 0) == 0;
	}
}
components/com_akeeba/BackupEngine/Psr/Log/AbstractLogger.php000060400000011635152453623440020245 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Psr\Log;

/**
 * This file is part of a privately namespaced copy of PSR-3 version 1.
 *
 * You can find the original PSR-3 in https://www.php-fig.org/psr/psr-3/ and the original code in
 * https://github.com/php-fig/log
 *
 * The license of the original code can be found below.
 *
 * Copyright (c) 2012 PHP Framework Interoperability Group
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

defined('AKEEBAENGINE') || die();

/**
 * This is a simple Logger implementation that other Loggers can inherit from.
 *
 * It simply delegates all log-level-specific methods to the `log` method to
 * reduce boilerplate code that a simple Logger that does the same thing with
 * messages regardless of the error level has to implement.
 */
abstract class AbstractLogger implements LoggerInterface
{
	/**
	 * System is unusable.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return void
	 */
	public function emergency($message, array $context = [])
	{
		$this->log(LogLevel::EMERGENCY, $message, $context);
	}

	/**
	 * Action must be taken immediately.
	 *
	 * Example: Entire website down, database unavailable, etc. This should
	 * trigger the SMS alerts and wake you up.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return void
	 */
	public function alert($message, array $context = [])
	{
		$this->log(LogLevel::ALERT, $message, $context);
	}

	/**
	 * Critical conditions.
	 *
	 * Example: Application component unavailable, unexpected exception.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return void
	 */
	public function critical($message, array $context = [])
	{
		$this->log(LogLevel::CRITICAL, $message, $context);
	}

	/**
	 * Runtime errors that do not require immediate action but should typically
	 * be logged and monitored.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return void
	 */
	public function error($message, array $context = [])
	{
		$this->log(LogLevel::ERROR, $message, $context);
	}

	/**
	 * Exceptional occurrences that are not errors.
	 *
	 * Example: Use of deprecated APIs, poor use of an API, undesirable things
	 * that are not necessarily wrong.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return void
	 */
	public function warning($message, array $context = [])
	{
		$this->log(LogLevel::WARNING, $message, $context);
	}

	/**
	 * Normal but significant events.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return void
	 */
	public function notice($message, array $context = [])
	{
		$this->log(LogLevel::NOTICE, $message, $context);
	}

	/**
	 * Interesting events.
	 *
	 * Example: User logs in, SQL logs.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return void
	 */
	public function info($message, array $context = [])
	{
		$this->log(LogLevel::INFO, $message, $context);
	}

	/**
	 * Detailed debug information.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return void
	 */
	public function debug($message, array $context = [])
	{
		$this->log(LogLevel::DEBUG, $message, $context);
	}
}
components/com_akeeba/BackupEngine/Psr/Log/InvalidArgumentException.php000060400000004476152453623440022317 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Psr\Log;

/**
 * This file is part of a privately namespaced copy of PSR-3 version 1.
 *
 * You can find the original PSR-3 in https://www.php-fig.org/psr/psr-3/ and the original code in
 * https://github.com/php-fig/log
 *
 * The license of the original code can be found below.
 *
 * Copyright (c) 2012 PHP Framework Interoperability Group
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

defined('AKEEBAENGINE') || die();

class InvalidArgumentException extends \InvalidArgumentException
{
}
components/com_akeeba/BackupEngine/Psr/Log/LoggerTrait.php000060400000012126152453623440017561 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Psr\Log;

/**
 * This file is part of a privately namespaced copy of PSR-3 version 1.
 *
 * You can find the original PSR-3 in https://www.php-fig.org/psr/psr-3/ and the original code in
 * https://github.com/php-fig/log
 *
 * The license of the original code can be found below.
 *
 * Copyright (c) 2012 PHP Framework Interoperability Group
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

defined('AKEEBAENGINE') || die();

/**
 * This is a simple Logger trait that classes unable to extend AbstractLogger
 * (because they extend another class, etc) can include.
 *
 * It simply delegates all log-level-specific methods to the `log` method to
 * reduce boilerplate code that a simple Logger that does the same thing with
 * messages regardless of the error level has to implement.
 */
trait LoggerTrait
{
	/**
	 * System is unusable.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return null
	 */
	public function emergency($message, array $context = [])
	{
		$this->log(LogLevel::EMERGENCY, $message, $context);
	}

	/**
	 * Action must be taken immediately.
	 *
	 * Example: Entire website down, database unavailable, etc. This should
	 * trigger the SMS alerts and wake you up.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return null
	 */
	public function alert($message, array $context = [])
	{
		$this->log(LogLevel::ALERT, $message, $context);
	}

	/**
	 * Critical conditions.
	 *
	 * Example: Application component unavailable, unexpected exception.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return null
	 */
	public function critical($message, array $context = [])
	{
		$this->log(LogLevel::CRITICAL, $message, $context);
	}

	/**
	 * Runtime errors that do not require immediate action but should typically
	 * be logged and monitored.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return null
	 */
	public function error($message, array $context = [])
	{
		$this->error($message, $context);
	}

	/**
	 * Exceptional occurrences that are not errors.
	 *
	 * Example: Use of deprecated APIs, poor use of an API, undesirable things
	 * that are not necessarily wrong.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return null
	 */
	public function warning($message, array $context = [])
	{
		$this->warning($message, $context);
	}

	/**
	 * Normal but significant events.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return null
	 */
	public function notice($message, array $context = [])
	{
		$this->log(LogLevel::NOTICE, $message, $context);
	}

	/**
	 * Interesting events.
	 *
	 * Example: User logs in, SQL logs.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return null
	 */
	public function info($message, array $context = [])
	{
		$this->info($message, $context);
	}

	/**
	 * Detailed debug information.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return null
	 */
	public function debug($message, array $context = [])
	{
		$this->debug($message, $context);
	}

	/**
	 * Logs with an arbitrary level.
	 *
	 * @param   mixed   $level
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return null
	 */
	abstract public function log($level, $message, array $context = []);
}
components/com_akeeba/BackupEngine/Psr/Log/LoggerAwareTrait.php000060400000005033152453623440020540 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Psr\Log;

/**
 * This file is part of a privately namespaced copy of PSR-3 version 1.
 *
 * You can find the original PSR-3 in https://www.php-fig.org/psr/psr-3/ and the original code in
 * https://github.com/php-fig/log
 *
 * The license of the original code can be found below.
 *
 * Copyright (c) 2012 PHP Framework Interoperability Group
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

defined('AKEEBAENGINE') || die();

/**
 * Basic Implementation of LoggerAwareInterface.
 */
trait LoggerAwareTrait
{
	/** @var LoggerInterface */
	protected $logger;

	/**
	 * Sets a logger.
	 *
	 * @param   LoggerInterface  $logger
	 */
	public function setLogger(LoggerInterface $logger)
	{
		$this->logger = $logger;
	}
}
components/com_akeeba/BackupEngine/Psr/Log/LoggerAwareInterface.php000060400000004760152453623440021363 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Psr\Log;

/**
 * This file is part of a privately namespaced copy of PSR-3 version 1.
 *
 * You can find the original PSR-3 in https://www.php-fig.org/psr/psr-3/ and the original code in
 * https://github.com/php-fig/log
 *
 * The license of the original code can be found below.
 *
 * Copyright (c) 2012 PHP Framework Interoperability Group
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

defined('AKEEBAENGINE') || die();

/**
 * Describes a logger-aware instance
 */
interface LoggerAwareInterface
{
	/**
	 * Sets a logger instance on the object
	 *
	 * @param   LoggerInterface  $logger
	 *
	 * @return null
	 */
	public function setLogger(LoggerInterface $logger);
}
components/com_akeeba/BackupEngine/Psr/Log/LogLevel.php000060400000004776152453623440017063 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Psr\Log;

/**
 * This file is part of a privately namespaced copy of PSR-3 version 1.
 *
 * You can find the original PSR-3 in https://www.php-fig.org/psr/psr-3/ and the original code in
 * https://github.com/php-fig/log
 *
 * The license of the original code can be found below.
 *
 * Copyright (c) 2012 PHP Framework Interoperability Group
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

defined('AKEEBAENGINE') || die();

/**
 * Describes log levels
 */
class LogLevel
{
	const EMERGENCY = 'emergency';
	const ALERT = 'alert';
	const CRITICAL = 'critical';
	const ERROR = 'error';
	const WARNING = 'warning';
	const NOTICE = 'notice';
	const INFO = 'info';
	const DEBUG = 'debug';
}
components/com_akeeba/BackupEngine/Psr/Log/LoggerInterface.php000060400000011661152453623440020401 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Psr\Log;

/**
 * This file is part of a privately namespaced copy of PSR-3 version 1.
 *
 * You can find the original PSR-3 in https://www.php-fig.org/psr/psr-3/ and the original code in
 * https://github.com/php-fig/log
 *
 * The license of the original code can be found below.
 *
 * Copyright (c) 2012 PHP Framework Interoperability Group
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

defined('AKEEBAENGINE') || die();

/**
 * Describes a logger instance
 *
 * The message MUST be a string or object implementing __toString().
 *
 * The message MAY contain placeholders in the form: {foo} where foo
 * will be replaced by the context data in key "foo".
 *
 * The context array can contain arbitrary data, the only assumption that
 * can be made by implementors is that if an Exception instance is given
 * to produce a stack trace, it MUST be in a key named "exception".
 *
 * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
 * for the full interface specification.
 */
interface LoggerInterface
{
	/**
	 * System is unusable.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return null
	 */
	public function emergency($message, array $context = []);

	/**
	 * Action must be taken immediately.
	 *
	 * Example: Entire website down, database unavailable, etc. This should
	 * trigger the SMS alerts and wake you up.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return null
	 */
	public function alert($message, array $context = []);

	/**
	 * Critical conditions.
	 *
	 * Example: Application component unavailable, unexpected exception.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return null
	 */
	public function critical($message, array $context = []);

	/**
	 * Runtime errors that do not require immediate action but should typically
	 * be logged and monitored.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return null
	 */
	public function error($message, array $context = []);

	/**
	 * Exceptional occurrences that are not errors.
	 *
	 * Example: Use of deprecated APIs, poor use of an API, undesirable things
	 * that are not necessarily wrong.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return null
	 */
	public function warning($message, array $context = []);

	/**
	 * Normal but significant events.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return null
	 */
	public function notice($message, array $context = []);

	/**
	 * Interesting events.
	 *
	 * Example: User logs in, SQL logs.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return null
	 */
	public function info($message, array $context = []);

	/**
	 * Detailed debug information.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return null
	 */
	public function debug($message, array $context = []);

	/**
	 * Logs with an arbitrary level.
	 *
	 * @param   mixed   $level
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return null
	 */
	public function log($level, $message, array $context = []);
}
components/com_akeeba/BackupEngine/Psr/Log/NullLogger.php000060400000005502152453623440017410 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Psr\Log;

/**
 * This file is part of a privately namespaced copy of PSR-3 version 1.
 *
 * You can find the original PSR-3 in https://www.php-fig.org/psr/psr-3/ and the original code in
 * https://github.com/php-fig/log
 *
 * The license of the original code can be found below.
 *
 * Copyright (c) 2012 PHP Framework Interoperability Group
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

defined('AKEEBAENGINE') || die();

/**
 * This Logger can be used to avoid conditional log calls
 *
 * Logging should always be optional, and if no logger is provided to your
 * library creating a NullLogger instance to have something to throw logs at
 * is a good way to avoid littering your code with `if ($this->logger) { }`
 * blocks.
 */
class NullLogger extends AbstractLogger
{
	/**
	 * Logs with an arbitrary level.
	 *
	 * @param   mixed   $level
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return null
	 */
	public function log($level, $message, array $context = [])
	{
		// noop
	}
}
components/com_akeeba/BackupEngine/Postproc/Onedriveapp.php000060400000010171152453623440020134 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Postproc;

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use Akeeba\Engine\Postproc\Connector\OneDriveApp as ConnectorOneDrive;
use Akeeba\Engine\Postproc\Exception\BadConfiguration;

class Onedriveapp extends Onedrivebusiness
{
	/**
	 * The name of the OAuth2 callback method in the parent window (the configuration page)
	 *
	 * @var   string
	 */
	protected $callbackMethod = 'akeeba_onedriveapp_oauth_callback';

	/**
	 * The key in Akeeba Engine's settings registry for this post-processing method
	 *
	 * @var   string
	 */
	protected $settingsKey = 'onedriveapp';

	public function __construct()
	{
		parent::__construct();

		// This OneDrive integration does not allow the getDrives method.
		array_pop($this->allowedCustomAPICallMethods);
	}

	protected function makeConnector()
	{
		// Retrieve engine configuration data
		$config = Factory::getConfiguration();

		$access_token  = trim($config->get('engine.postproc.' . $this->settingsKey . '.access_token', ''));
		$refresh_token = trim($config->get('engine.postproc.' . $this->settingsKey . '.refresh_token', ''));

		$this->isChunked  = $config->get('engine.postproc.' . $this->settingsKey . '.chunk_upload', true);
		$this->chunkSize  = $config->get('engine.postproc.' . $this->settingsKey . '.chunk_upload_size', 10) * 1024 * 1024;
		$defaultDirectory = rtrim($config->get('engine.postproc.' . $this->settingsKey . '.directory', ''), '/');
		$this->directory  = $config->get('volatile.postproc.directory', $defaultDirectory);

		// Sanity checks
		if (empty($refresh_token))
		{
			throw new BadConfiguration('You have not linked Akeeba Backup with your OneDrive account');
		}

		if (!function_exists('curl_init'))
		{
			throw new BadConfiguration('cURL is not enabled, please enable it in order to post-process your archives');
		}

		// Fix the directory name, if required
		$this->directory = empty($this->directory) ? '' : $this->directory;
		$this->directory = trim($this->directory);
		$this->directory = ltrim(Factory::getFilesystemTools()->TranslateWinPath($this->directory), '/');
		$this->directory = Factory::getFilesystemTools()->replace_archive_name_variables($this->directory);
		$config->set('volatile.postproc.directory', $this->directory);

		// Get Download ID
		$dlid = Platform::getInstance()->get_platform_configuration_option('update_dlid', '');

		if (empty($dlid))
		{
			throw new BadConfiguration('You must enter your Download ID in the application configuration before using the “Upload to OneDrive” feature.');
		}

		$connector = new ConnectorOneDrive($access_token, $refresh_token, $dlid);

		// Validate the tokens
		Factory::getLog()->debug(__METHOD__ . " - Validating the OneDrive tokens");
		$pingResult = $connector->ping();

		// Save new configuration if there was a refresh
		if ($pingResult['needs_refresh'])
		{
			Factory::getLog()->debug(__METHOD__ . " - OneDrive tokens were refreshed");
			$config->set('engine.postproc.' . $this->settingsKey . '.access_token', $pingResult['access_token'], false);
			$config->set('engine.postproc.' . $this->settingsKey . '.refresh_token', $pingResult['refresh_token'], false);

			$profile_id = Platform::getInstance()->get_active_profile();
			Platform::getInstance()->save_configuration($profile_id);
		}

		return $connector;
	}

	protected function getOAuth2HelperUrl()
	{
		return ConnectorOneDrive::helperUrl;
	}
}components/com_akeeba/BackupEngine/Postproc/onedrivebusiness.ini-disabled000060400000004663152453623440023015 0ustar00; Akeeba Upload to OneDrive for Business post processing engine
; Copyright (c)2006-2018 Nicholas K. Dionysopoulos / Akeeba Ltd
;
; Sorry, we had to cancel this feature.
;
; Microsoft requires us to register the app in the Azure Directory per
; https://dev.onedrive.com/app-registration-server.htm  Despite repeated attempts at following their instructions it
; seems to be impossible. There is no "midsize business" plan, the regular subscription doesn'tlet you create the
; "private site" required for development and both enterprise and developer accounts can't seem to be able to be
; purchased. Apparently the only way to make this work is having a US-based enterprise?! So, sorry, we won't waste any
; more time on this.
;

; Engine information
[_information]
title=COM_AKEEBA_CONFIG_ENGINE_POSTPROC_ONEDRIVEBUSINESS_TITLE
description=COM_AKEEBA_CONFIG_ENGINE_POSTPROC_ONEDRIVEBUSINESS_DESCRIPTION

; Post-process after generating each part?
[engine.postproc.common.after_part]
default=0
type=bool
title=COM_AKEEBA_CONFIG_POSTPROCPARTS_TITLE
description=COM_AKEEBA_CONFIG_POSTPROCPARTS_DESCRIPTION

; Delete from server after processing?
[engine.postproc.common.delete_after]
default=1
type=bool
title=COM_AKEEBA_CONFIG_DELETEAFTER_TITLE
description=COM_AKEEBA_CONFIG_DELETEAFTER_DESCRIPTION

; Enable chunk upload?
[engine.postproc.onedrivebusiness.chunk_upload]
default=1
type=bool
title=COM_AKEEBA_CONFIG_BOX_CHUNKUPLOAD_ENABLE

; Chunk size in megabytes
[engine.postproc.onedrivebusiness.chunk_upload_size]
default=10
type=integer
min=4
max=60
shortcuts="5|10|20|40|60"
scale=1
uom=MB
title=COM_AKEEBA_CONFIG_BOX_CHUNKUPLOAD_SIZE

; Open OAuth
[engine.postproc.onedrivebusiness.openoauth]
default=""
type=button
title=COM_AKEEBA_CONFIG_BOX_OPENOAUTH_TITLE
description=COM_AKEEBA_CONFIG_BOX_OPENOAUTH_DESC
hook=akconfig_onedrivebusiness_openoauth

; OneDrive Directory name
[engine.postproc.onedrivebusiness.directory]
default="/"
type=string
title=COM_AKEEBA_CONFIG_ONEDRIVEBUSINESS_DIRECTORY_TITLE
description=COM_AKEEBA_CONFIG_ONEDRIVEBUSINESS_DIRECTORY_DESCRIPTION

[engine.postproc.onedrivebusiness.service_id]
default = ""
type=string
title=COM_AKEEBA_CONFIG_ONEDRIVEBUSINESS_SERVICEID_TITLE
description=COM_AKEEBA_CONFIG_ONEDRIVEBUSINESS_SERVICEID_DESCRIPTION

[engine.postproc.onedrivebusiness.refresh_token]
default = ""
type=string
title=COM_AKEEBA_CONFIG_ONEDRIVEBUSINESS_REFRESHTOKEN_TITLE
description=COM_AKEEBA_CONFIG_ONEDRIVEBUSINESS_REFRESHTOKEN_DESCRIPTION
components/com_akeeba/BackupEngine/Postproc/Email.php000060400000005526152453623440016717 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Postproc;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use Akeeba\Engine\Postproc\Exception\BadConfiguration;
use Awf\Text\Text;
use Joomla\CMS\Language\Text as JText;
use RuntimeException;

class Email extends Base
{
	public function processPart($localFilepath, $remoteBaseName = null)
	{
		// Retrieve engine configuration data
		$config  = Factory::getConfiguration();
		$address = trim($config->get('engine.postproc.email.address', ''));
		$subject = $config->get('engine.postproc.email.subject', '0');

		// Sanity checks
		if (empty($address))
		{
			throw new BadConfiguration('You have not set up a recipient\'s email address for the backup files');
		}

		// Send the file
		$basename = empty($remoteBaseName) ? basename($localFilepath) : $remoteBaseName;

		Factory::getLog()->info(sprintf("Preparing to email %s to %s", $basename, $address));

		if (empty($subject))
		{
			$subject = "You have a new backup part";

			if (class_exists('\Awf\Text\Text'))
			{
				$subject = Text::_('COM_AKEEBA_COMMON_EMAIL_DEAFULT_SUBJECT');

				if ($subject === 'COM_AKEEBA_COMMON_EMAIL_DEAFULT_SUBJECT')
				{
					$subject = JText::_('COM_AKEEBA_COMMON_EMAIL_DEAFULT_SUBJECT');
				}
			}
			elseif (class_exists('\Joomla\CMS\Language\Text'))
			{
				$subject = JText::_('COM_AKEEBA_COMMON_EMAIL_DEAFULT_SUBJECT');

				if ($subject === 'COM_AKEEBA_COMMON_EMAIL_DEAFULT_SUBJECT')
				{
					$subject = JText::_('COM_AKEEBA_COMMON_EMAIL_DEAFULT_SUBJECT');
				}
			}
		}

		$body = "Emailing $basename";

		Factory::getLog()->debug("Subject: $subject");
		Factory::getLog()->debug("Body: $body");

		$result = Platform::getInstance()->send_email($address, $subject, $body, $localFilepath);

		// Return the result
		if ($result !== true)
		{
			// An error occurred
			throw new RuntimeException($result);
		}

		// Return success
		Factory::getLog()->info("Email sent successfully");

		return true;
	}

	protected function makeConnector()
	{
		/**
		 * This method does not use a connector.
		 */
		return;
	}


}
components/com_akeeba/BackupEngine/Postproc/Base.php000060400000015200152453623440016530 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Postproc;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Platform;
use Akeeba\Engine\Postproc\Exception\BadConfiguration;
use Akeeba\Engine\Postproc\Exception\DeleteNotSupported;
use Akeeba\Engine\Postproc\Exception\DownloadToBrowserNotSupported;
use Akeeba\Engine\Postproc\Exception\DownloadToServerNotSupported;
use Akeeba\Engine\Postproc\Exception\OAuthNotSupported;
use Akeeba\Engine\Util\FileCloseAware;
use Exception;

/**
 * Akeeba Engine post-processing abstract class. Provides the default implementation of most of the PostProcInterface
 * methods.
 */
abstract class Base implements PostProcInterface
{
	use FileCloseAware;

	/**
	 * Should we break the step before post-processing?
	 *
	 * The only engine which does not require a step break before is the None engine.
	 *
	 * @var bool
	 */
	protected $recommendsBreakBefore = true;

	/**
	 * Should we break the step after post-processing?
	 *
	 * @var bool
	 */
	protected $recommendsBreakAfter = true;

	/**
	 * Does this engine processes the files in a way that makes deleting the originals safe?
	 *
	 * @var bool
	 */
	protected $advisesDeletionAfterProcessing = true;

	/**
	 * Does this engine support remote file deletes?
	 *
	 * @var bool
	 */
	protected $supportsDelete = false;

	/**
	 * Does this engine support downloads to files?
	 *
	 * @var bool
	 */
	protected $supportsDownloadToFile = false;

	/**
	 * Does this engine support downloads to browser?
	 *
	 * @var bool
	 */
	protected $supportsDownloadToBrowser = false;

	/**
	 * Does this engine push raw data to the browser when downloading a file?
	 *
	 * Set to true if raw data will be dumped to the browser when downloading the file to the browser. Set to false if
	 * a URL is returned instead.
	 *
	 * @var bool
	 */
	protected $inlineDownloadToBrowser = false;

	/**
	 * The remote absolute path to the file which was just processed. Leave null if the file is meant to
	 * be non-retrievable, i.e. sent to email or any other one way service.
	 *
	 * @var string
	 */
	protected $remotePath = null;

	/**
	 * Whitelist of method names you can call using customAPICall().
	 *
	 * @var array
	 */
	protected $allowedCustomAPICallMethods = ['oauthCallback'];

	/**
	 * The connector object for this post-processing engine
	 *
	 * @var object|null
	 */
	private $connector;

	public function delete($path)
	{
		throw new DeleteNotSupported();
	}

	public function downloadToFile($remotePath, $localFile, $fromOffset = null, $length = null)
	{
		throw new DownloadToServerNotSupported();
	}

	public function downloadToBrowser($remotePath)
	{
		throw new DownloadToBrowserNotSupported();
	}

	public final function customAPICall($method, $params = [])
	{
		if (!in_array($method, $this->allowedCustomAPICallMethods) || !method_exists($this, $method))
		{
			header('HTTP/1.0 501 Not Implemented');

			exit();
		}

		return call_user_func_array([$this, $method], [$params]);
	}

	public function oauthOpen($params = [])
	{
		$callback = $params['callbackURI'] . '&method=oauthCallback';

		$url = $this->getOAuth2HelperUrl();
		$url .= (strpos($url, '?') !== false) ? '&' : '?';
		$url .= 'callback=' . urlencode($callback);
		$url .= '&dlid=' . urlencode(Platform::getInstance()->get_platform_configuration_option('update_dlid', ''));

		Platform::getInstance()->redirect($url);
	}

	/**
	 * Fetches the authentication token from the OAuth helper script, after you've run the first step of the OAuth
	 * authentication process. Must be overridden in subclasses.
	 *
	 * @param   array  $params
	 *
	 * @return  void
	 *
	 * @throws  OAuthNotSupported
	 */
	public function oauthCallback(array $params)
	{
		throw new OAuthNotSupported();
	}

	public function recommendsBreakBefore()
	{
		return $this->recommendsBreakBefore;
	}

	public function recommendsBreakAfter()
	{
		return $this->recommendsBreakAfter;
	}

	public function isFileDeletionAfterProcessingAdvisable()
	{
		return $this->advisesDeletionAfterProcessing;
	}

	public function supportsDelete()
	{
		return $this->supportsDelete;
	}

	public function supportsDownloadToFile()
	{
		return $this->supportsDownloadToFile;
	}

	public function supportsDownloadToBrowser()
	{
		return $this->supportsDownloadToBrowser;
	}

	public function doesInlineDownloadToBrowser()
	{
		return $this->inlineDownloadToBrowser;
	}

	public function getRemotePath()
	{
		return $this->remotePath;
	}

	/**
	 * Returns the URL to the OAuth2 helper script. Used by the oauthOpen method. Must be overridden in subclasses.
	 *
	 * @return  string
	 *
	 * @throws  OAuthNotSupported
	 */
	protected function getOAuth2HelperUrl()
	{
		throw new OAuthNotSupported();
	}

	/**
	 * Returns an instance of the connector object.
	 *
	 * @param   bool  $forceNew  Should I force the creation of a new connector object?
	 *
	 * @return  object  The connector object
	 *
	 * @throws  BadConfiguration  If there is a configuration error which prevents creating a connector object.
	 * @throws  Exception
	 */
	final protected function getConnector($forceNew = false)
	{
		if ($forceNew)
		{
			$this->resetConnector();
		}

		if (empty($this->connector))
		{
			$this->connector = $this->makeConnector();
		}

		return $this->connector;
	}

	/**
	 * Resets the connector.
	 *
	 * If the connector requires any special handling upon destruction you must handle it in its __destruct method.
	 *
	 * @return  void
	 */
	final protected function resetConnector()
	{
		$this->connector = null;
	}

	/**
	 * Creates a new connector object based on the engine configuration stored in the backup profile.
	 *
	 * Do not use this method directly. Use getConnector() instead.
	 *
	 * @return  object  The connector object
	 *
	 * @throws  BadConfiguration  If there is a configuration error which prevents creating a connector object.
	 * @throws  Exception  Any other error when creating or initializing the connector object.
	 */
	protected abstract function makeConnector();
}
components/com_akeeba/BackupEngine/Postproc/PostProcInterface.php000060400000016022152453623440021253 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Postproc;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Postproc\Exception\DeleteNotSupported;
use Akeeba\Engine\Postproc\Exception\DownloadToBrowserNotSupported;
use Akeeba\Engine\Postproc\Exception\DownloadToServerNotSupported;
use Akeeba\Engine\Postproc\Exception\OAuthNotSupported;
use Akeeba\Engine\Postproc\Exception\RangeDownloadNotSupported;
use Exception;

interface PostProcInterface
{
	/**
	 * This function takes care of post-processing a file (typically a backup archive part file).
	 *
	 * If the process has ran to completion it returns true.
	 *
	 * If more work is required (the file has only been partially uploaded) it returns false.
	 *
	 * It the process has failed an Exception is thrown.
	 *
	 * @param   string       $localFilepath   Absolute path to the part we'll have to process
	 * @param   string|null  $remoteBaseName  Base name of the uploaded file, skip to use $absolute_filename's
	 *
	 * @return  bool  True on success, false if more work is required
	 *
	 * @throws  Exception  When an error occurred during post-processing
	 */
	public function processPart($localFilepath, $remoteBaseName = null);

	/**
	 * Deletes a remote file
	 *
	 * @param   string  $path  The absolute, remote storage path to the file we're deleting
	 *
	 * @return  void
	 *
	 * @throws  DeleteNotSupported  When this feature is not supported at all.
	 * @throws  Exception  When an engine error occurs
	 */
	public function delete($path);

	/**
	 * Downloads a remotely stored file back to the site's server. It can optionally do a range download. If range
	 * downloads are not supported we throw a RangeDownloadNotSupported exception. Any other type of Exception means
	 * that the download failed.
	 *
	 * @param   string    $remotePath  The path to the remote file
	 * @param   string    $localFile   The absolute path to the local file we're writing to
	 * @param   int|null  $fromOffset  The offset (in bytes) to start downloading from
	 * @param   int|null  $length      The amount of data (in bytes) to download
	 *
	 * @return  void
	 *
	 * @throws  DownloadToServerNotSupported  When this feature is not supported at all.
	 * @throws  RangeDownloadNotSupported  When range downloads are not supported.
	 * @throws  Exception  On failure.
	 */
	public function downloadToFile($remotePath, $localFile, $fromOffset = null, $length = null);

	/**
	 * Downloads a remotely stored file to the user's browser, without storing it on the site's web server first.
	 *
	 * If $this->inlineDownloadToBrowser is true the method outputs a byte stream to the browser and returns null.
	 *
	 * If $this->inlineDownloadToBrowser is false it returns a string containing a public download URL. The user's
	 * browser will be redirected to that URL.
	 *
	 * If this feature is not supported a DownloadToBrowserNotSupported exception will be thrown.
	 *
	 * Any other Exception indicates an error while trying to download to browser such as file not found, problem with
	 * the remote service etc.
	 *
	 * @param   string  $remotePath  The absolute, remote storage path to the file we want to download
	 *
	 * @return  string|null
	 *
	 * @throws  DownloadToBrowserNotSupported  When this feature is not supported at all.
	 * @throws  Exception  When an error occurs.
	 */
	public function downloadToBrowser($remotePath);

	/**
	 * A proxy which allows us to execute arbitrary methods in this engine. Used for AJAX calls, typically to update UI
	 * elements with information fetched from the remote storage service.
	 *
	 * For security reasons, only methods whitelisted in the $this->allowedCustomAPICallMethods array can be called.
	 *
	 * @param   string  $method  The method to call.
	 * @param   array   $params  Any parameters to send to the method, in array format
	 *
	 * @return  mixed  The return value of the method.
	 */
	public function customAPICall($method, $params = []);

	/**
	 * Opens an OAuth window (performs an HTTP redirection).
	 *
	 * @param   array  $params  Any parameters required to launch OAuth
	 *
	 * @return  void
	 *
	 * @throws  OAuthNotSupported  When not supported.
	 * @throws  Exception  When an error occurred.
	 */
	public function oauthOpen($params = []);

	/**
	 * Fetches the authentication token from the OAuth helper script, after you've run the first step of the OAuth
	 * authentication process. Must be overridden in subclasses.
	 *
	 * @param   array  $params
	 *
	 * @return  void
	 *
	 * @throws  OAuthNotSupported
	 */
	public function oauthCallback(array $params);

	/**
	 * Does the engine recommend doing a step break before post-processing backup archives with it?
	 *
	 * @return  bool
	 */
	public function recommendsBreakBefore();

	/**
	 * Does the engine recommend doing a step break after post-processing backup archives with it?
	 *
	 * @return  bool
	 */
	public function recommendsBreakAfter();

	/**
	 * Is it advisable to delete files successfully post-processed by this post-processing engine?
	 *
	 * Currently only the “None” method advises against deleting successfully post-processed files for the simple reason
	 * that it does absolutely nothing with the files. The only copy is still on the server.
	 *
	 * @return  bool
	 */
	public function isFileDeletionAfterProcessingAdvisable();

	/**
	 * Does this engine support deleting remotely stored files?
	 *
	 * Most engines support deletion. However, some engines such as “Send by email”, do not have a way to find files
	 * already processed and delete them. Or it may be that we are sending the file to a write-only storage service
	 * which does not support deletions.
	 *
	 * @return  bool
	 */
	public function supportsDelete();

	/**
	 * Does this engine support downloading backup archives back to the site's web server?
	 *
	 * @return  bool
	 */
	public function supportsDownloadToFile();

	/**
	 * Does this engine support downloading backup archives directly to the user's browser?
	 *
	 * @return  bool
	 */
	public function supportsDownloadToBrowser();

	/**
	 * Does this engine return a bytestream when asked to download backup archives directly to the user's browser?
	 *
	 * @return  bool
	 */
	public function doesInlineDownloadToBrowser();

	/**
	 * Returns the remote absolute path to the file which was just processed.
	 *
	 * @return  string
	 */
	public function getRemotePath();
}
components/com_akeeba/BackupEngine/Postproc/email.json000060400000002460152453623440017133 0ustar00{
    "_information": {
        "title": "COM_AKEEBA_CONFIG_ENGINE_POSTPROC_EMAIL_TITLE",
        "description": "COM_AKEEBA_CONFIG_ENGINE_POSTPROC_EMAIL_DESCRIPTION"
    },
    "engine.postproc.common.after_part": {
        "default": "0",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_POSTPROCPARTS_TITLE",
        "description": "COM_AKEEBA_CONFIG_POSTPROCPARTS_DESCRIPTION"
    },
    "engine.postproc.common.abort_on_fail": {
        "default": "0",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_POSTPROC_ABORT_ON_FAIL_TITLE",
        "description": "COM_AKEEBA_CONFIG_POSTPROC_ABORT_ON_FAIL_DESCRIPTION"
    },
    "engine.postproc.common.delete_after": {
        "default": "1",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_DELETEAFTER_TITLE",
        "description": "COM_AKEEBA_CONFIG_DELETEAFTER_DESCRIPTION"
    },
    "engine.postproc.email.address": {
        "default": "",
        "type": "string",
        "title": "COM_AKEEBA_CONFIG_PROCEMAIL_ADDRESS_TITLE",
        "description": "COM_AKEEBA_CONFIG_PROCEMAIL_ADDRESS_DESCRIPTION"
    },
    "engine.postproc.email.subject": {
        "default": "",
        "type": "string",
        "title": "COM_AKEEBA_CONFIG_PROCEMAIL_SUBJECT_TITLE",
        "description": "COM_AKEEBA_CONFIG_PROCEMAIL_SUBJECT_DESCRIPTION"
    }
}components/com_akeeba/BackupEngine/Postproc/None.php000060400000002617152453623440016565 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Postproc;

defined('AKEEBAENGINE') || die();

class None extends Base
{
	public function __construct()
	{
		// No point in breaking the step; we simply do nothing :)
		$this->recommendsBreakAfter           = false;
		$this->recommendsBreakBefore          = false;
		$this->advisesDeletionAfterProcessing = false;
	}

	public function processPart($localFilepath, $remoteBaseName = null)
	{
		// Really nothing to do!!
		return true;
	}

	protected function makeConnector()
	{
		// I have to return an object to satisfy the definition.
		return (object) [
			'foo' => 'bar',
		];
	}
}
components/com_akeeba/BackupEngine/Postproc/ProxyAware.php000060400000004675152453623440017775 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Postproc;

use Akeeba\Engine\Platform;

trait ProxyAware
{
	/**
	 * Apply the platform proxy configuration to the cURL resource.
	 *
	 * @param   resource  $ch  The cURL resource, returned by curl_init();
	 */
	protected function applyProxySettingsToCurl($ch)
	{
		if (defined('AKEEBA_NO_PROXY_AWARE'))
		{
			return;
		}

		$proxySettings = Platform::getInstance()->getProxySettings();

		if (!$proxySettings['enabled'])
		{
			return;
		}

		curl_setopt($ch, CURLOPT_PROXY, $proxySettings['host'] . ':' . $proxySettings['port']);

		if (empty($proxySettings['user']))
		{
			return;
		}

		curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxySettings['user'] . ':' . $proxySettings['pass']);
	}

	protected function getProxyStreamContext()
	{
		if (defined('AKEEBA_NO_PROXY_AWARE'))
		{
			return [];
		}

		$ret           = [];
		$proxySettings = Platform::getInstance()->getProxySettings();

		if (!$proxySettings['enabled'])
		{
			return $ret;
		}

		$ret['http'] = [
			'proxy'           => $proxySettings['host'] . ':' . $proxySettings['port'],
			'request_fulluri' => true,
		];
		$ret['ftp']  = [
			'proxy'           => $proxySettings['host'] . ':' . $proxySettings['port'],
			// So, request_fulluri isn't documented for the FTP transport but seems to be required...?!
			'request_fulluri' => true,
		];

		if (empty($proxySettings['user']))
		{
			return $ret;
		}

		$ret['http']['header'] = ['Proxy-Authorization: Basic ' . base64_encode($proxySettings['user'] . ':' . $proxySettings['pass'])];
		$ret['ftp']['header'] = ['Proxy-Authorization: Basic ' . base64_encode($proxySettings['user'] . ':' . $proxySettings['pass'])];

		return $ret;
	}
}components/com_akeeba/BackupEngine/Postproc/Exception/DownloadToBrowserNotSupported.php000060400000002277152453623440025633 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Postproc\Exception;

defined('AKEEBAENGINE') || die();

/**
 * Indicates that the post-processing engine does not support downloading remotely stored files to the user's browser.
 */
class DownloadToBrowserNotSupported extends EngineException
{
	protected $messagePrototype = 'The %s post-processing engine does not support downloading of backup archives to the browser.';
}
components/com_akeeba/BackupEngine/Postproc/Exception/OAuthNotSupported.php000060400000002344152453623440023230 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Postproc\Exception;

defined('AKEEBAENGINE') || die();

/**
 * Indicates that the post-processing engine does not support OAuth2 or similar redirection-based authentication with
 * the remote storage provider.
 */
class OAuthNotSupported extends EngineException
{
	protected $messagePrototype = 'The %s post-processing engine does not support opening an authentication window to the remote storage provider.';
}
components/com_akeeba/BackupEngine/Postproc/Exception/DownloadToServerNotSupported.php000060400000002264152453623440025452 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Postproc\Exception;

defined('AKEEBAENGINE') || die();

/**
 * Indicates that the post-processing engine does not support downloading remotely stored files to the server
 */
class DownloadToServerNotSupported extends EngineException
{
	protected $messagePrototype = 'The %s post-processing engine does not support downloading of backup archives to the server.';
}
components/com_akeeba/BackupEngine/Postproc/Exception/RangeDownloadNotSupported.php000060400000002226152453623440024733 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Postproc\Exception;

defined('AKEEBAENGINE') || die();

/**
 * Indicates that the post-processing engine does not support range downloads.
 */
class RangeDownloadNotSupported extends EngineException
{
	protected $messagePrototype = 'The %s post-processing engine does not support range downloads of backup archives to the server.';
}
components/com_akeeba/BackupEngine/Postproc/Exception/BadConfiguration.php000060400000002031152453623440023030 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Postproc\Exception;

defined('AKEEBAENGINE') || die();

use RuntimeException;

/**
 * Indicates an error with the post-processing engine's configuration
 */
class BadConfiguration extends RuntimeException
{
}
components/com_akeeba/BackupEngine/Postproc/Exception/EngineException.php000060400000005507152453623440022711 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Postproc\Exception;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Postproc\Base;
use Exception;
use RuntimeException;
use Throwable;

class EngineException extends RuntimeException
{
	protected $messagePrototype = 'The %s post-processing engine has experienced an unspecified error.';

	/**
	 * Construct the exception. If a message is not defined the default message for the exception will be used.
	 *
	 * @param   string               $message   [optional] The Exception message to throw.
	 * @param   int                  $code      [optional] The Exception code.
	 * @param   Exception|Throwable  $previous  [optional] The previous throwable used for the exception chaining.
	 */
	public function __construct($message = "", $code = 0, $previous = null)
	{
		if (empty($message))
		{
			$engineName = $this->getEngineKeyFromBacktrace();
			$message    = sprintf($this->messagePrototype, $engineName);
		}

		parent::__construct($message, $code, $previous);
	}

	/**
	 * Returns the engine name (class name without the namespace) from the PHP execution backtrace.
	 *
	 * @return mixed|string
	 */
	protected function getEngineKeyFromBacktrace()
	{
		// Make sure the backtrace is at least 3 levels deep
		$backtrace = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, 5);

		// We need to be at least two levels deep
		if (count($backtrace) < 2)
		{
			return 'current';
		}

		for ($i = 1; $i < count($backtrace); $i++)
		{
			// Get the fully qualified class
			$object = $backtrace[$i]['object'];

			// We need a backtrace element with an object attached.
			if (!is_object($object))
			{
				continue;
			}

			// If the object is not a Postproc\Base object go to the next entry.
			if (!($object instanceof Base))
			{
				continue;
			}

			// Get the bare class name
			$fqnClass  = $backtrace[$i]['class'];
			$parts     = explode('\\', $fqnClass);
			$bareClass = array_pop($parts);

			// Do not return the base object!
			if ($bareClass == 'Base')
			{
				continue;
			}

			return $bareClass;
		}

		return 'current';
	}
}
components/com_akeeba/BackupEngine/Postproc/Exception/DeleteNotSupported.php000060400000002211152453623440023403 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Postproc\Exception;

defined('AKEEBAENGINE') || die();

/**
 * Indicates that the post-processing engine does not support deleting remotely stored files.
 */
class DeleteNotSupported extends EngineException
{
	protected $messagePrototype = 'The %s post-processing engine does not support deletion of backup archives.';
}
components/com_akeeba/BackupEngine/Postproc/none.json000060400000000254152453623440017002 0ustar00{
    "_information": {
        "title": "COM_AKEEBA_CONFIG_ENGINE_POSTPROC_NONE_TITLE",
        "description": "COM_AKEEBA_CONFIG_ENGINE_POSTPROC_NONE_DESCRIPTION"
    }
}components/com_akeeba/BackupEngine/Postproc/onedriveapp.json000060400000004565152453623440020370 0ustar00{
    "_information": {
        "title": "COM_AKEEBA_CONFIG_ENGINE_POSTPROC_ONEDRIVEAPP_TITLE",
        "description": "COM_AKEEBA_CONFIG_ENGINE_POSTPROC_ONEDRIVEAPP_DESCRIPTION"
    },
    "engine.postproc.common.after_part": {
        "default": "0",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_POSTPROCPARTS_TITLE",
        "description": "COM_AKEEBA_CONFIG_POSTPROCPARTS_DESCRIPTION"
    },
    "engine.postproc.common.abort_on_fail": {
        "default": "0",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_POSTPROC_ABORT_ON_FAIL_TITLE",
        "description": "COM_AKEEBA_CONFIG_POSTPROC_ABORT_ON_FAIL_DESCRIPTION"
    },
    "engine.postproc.common.delete_after": {
        "default": "1",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_DELETEAFTER_TITLE",
        "description": "COM_AKEEBA_CONFIG_DELETEAFTER_DESCRIPTION"
    },
    "engine.postproc.onedriveapp.chunk_upload": {
        "default": "1",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_BOX_CHUNKUPLOAD_ENABLE"
    },
    "engine.postproc.onedriveapp.chunk_upload_size": {
        "default": "10",
        "type": "integer",
        "min": "4",
        "max": "60",
        "shortcuts": "5|10|20|40|60",
        "scale": "1",
        "uom": "MB",
        "title": "COM_AKEEBA_CONFIG_BOX_CHUNKUPLOAD_SIZE",
        "showon": "engine.postproc.onedriveapp.chunk_upload:1"
    },
    "engine.postproc.onedriveapp.openoauth": {
        "default": "",
        "type": "button",
        "title": "COM_AKEEBA_CONFIG_BOX_OPENOAUTH_TITLE",
        "description": "COM_AKEEBA_CONFIG_BOX_OPENOAUTH_DESC",
        "hook": "akconfig_onedriveapp_openoauth"
    },
    "engine.postproc.onedriveapp.directory": {
        "default": "\/",
        "type": "string",
        "title": "COM_AKEEBA_CONFIG_ONEDRIVEAPP_DIRECTORY_TITLE",
        "description": "COM_AKEEBA_CONFIG_ONEDRIVEAPP_DIRECTORY_DESCRIPTION"
    },
    "engine.postproc.onedriveapp.access_token": {
        "default": "",
        "type": "string",
        "title": "COM_AKEEBA_CONFIG_ONEDRIVE_ACCESSTOKEN_TITLE",
        "description": "COM_AKEEBA_CONFIG_ONEDRIVE_ACCESSTOKEN_DESCRIPTION"
    },
    "engine.postproc.onedriveapp.refresh_token": {
        "default": "",
        "type": "string",
        "title": "COM_AKEEBA_CONFIG_ONEDRIVE_REFRESHTOKEN_TITLE",
        "description": "COM_AKEEBA_CONFIG_ONEDRIVE_REFRESHTOKEN_DESCRIPTION"
    }
}components/com_akeeba/BackupEngine/Util/Log/WarningsLoggerInterface.php000060400000003420152453623440022255 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util\Log;

defined('AKEEBAENGINE') || die();

interface WarningsLoggerInterface
{
	/**
	 * Returns an array with all warnings logged since the last time warnings were reset. The maximum number of warnings
	 * returned is controlled by setWarningsQueueSize().
	 *
	 * @return array
	 */
	public function getWarnings();

	/**
	 * Resets the warnings queue.
	 *
	 * @return void
	 */
	public function resetWarnings();

	/**
	 * A combination of getWarnings() and resetWarnings(). Returns the warnings and immediately resets the warnings
	 * queue.
	 *
	 * @return array
	 */
	public function getAndResetWarnings();

	/**
	 * Set the warnings queue size. A size of 0 means "no limit".
	 *
	 * @param   int  $queueSize  The size of the warnings queue (in number of warnings items)
	 *
	 * @return void
	 */
	public function setWarningsQueueSize($queueSize = 0);

	/**
	 * Returns the warnings queue size.
	 *
	 * @return int
	 */
	public function getWarningsQueueSize();
}
components/com_akeeba/BackupEngine/Util/Log/WarningsLoggerAware.php000060400000005562152453623440021425 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util\Log;

defined('AKEEBAENGINE') || die();

trait WarningsLoggerAware
{
	/**
	 * The warnings in the current queue
	 *
	 * @var string[]
	 */
	private $warningsQueue = [];

	/**
	 * The maximum length of the warnings queue
	 *
	 * @var int
	 */
	private $warningsQueueSize = 0;

	/**
	 * A combination of getWarnings() and resetWarnings(). Returns the warnings and immediately resets the warnings
	 * queue.
	 *
	 * @return array
	 */
	final public function getAndResetWarnings()
	{
		$ret = $this->getWarnings();

		$this->resetWarnings();

		return $ret;
	}

	/**
	 * Returns an array with all warnings logged since the last time warnings were reset. The maximum number of warnings
	 * returned is controlled by setWarningsQueueSize().
	 *
	 * @return array
	 */
	final public function getWarnings()
	{
		return $this->warningsQueue;
	}

	/**
	 * Resets the warnings queue.
	 *
	 * @return void
	 */
	final public function resetWarnings()
	{
		$this->warningsQueue = [];
	}

	/**
	 * Returns the warnings queue size.
	 *
	 * @return int
	 */
	final public function getWarningsQueueSize()
	{
		return $this->warningsQueueSize;
	}

	/**
	 * Set the warnings queue size. A size of 0 means "no limit".
	 *
	 * @param   int  $queueSize  The size of the warnings queue (in number of warnings items)
	 *
	 * @return void
	 */
	final public function setWarningsQueueSize($queueSize = 0)
	{
		if (!is_numeric($queueSize) || empty($queueSize) || ($queueSize < 0))
		{
			$queueSize = 0;
		}

		$this->warningsQueueSize = $queueSize;
	}

	/**
	 * Adds a warning to the warnings queue.
	 *
	 * @param   string  $warning
	 */
	final protected function enqueueWarning($warning)
	{
		$this->warningsQueue[] = $warning;

		// If there is no queue size limit there's nothing else to be done.
		if ($this->warningsQueueSize <= 0)
		{
			return;
		}

		// If the queue size is exceeded remove as many of the earliest elements as required
		if (count($this->warningsQueue) > $this->warningsQueueSize)
		{
			$this->warningsQueueSize = array_slice($this->warningsQueue, -$this->warningsQueueSize);
		}
	}
}
components/com_akeeba/BackupEngine/Util/Log/LogInterface.php000060400000005556152453623440020062 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util\Log;

defined('AKEEBAENGINE') || die();

/**
 * The interface for Akeeba Engine logger objects
 */
interface LogInterface
{
	/**
	 * Open a new log instance with the specified tag. If another log is already open it is closed before switching to
	 * the new log tag. If the tag is null use the default log defined in the logging system.
	 *
	 * @param   string|null  $tag        The log to open
	 * @param   string       $extension  The log file extension (default: .php, use empty string for .log files)
	 *
	 * @return void
	 */
	public function open($tag = null, $extension = '.php');

	/**
	 * Close the currently active log and set the current tag to null.
	 *
	 * @return  void
	 */
	public function close();

	/**
	 * Reset (remove entries) of the log with the specified tag.
	 *
	 * @param   string|null  $tag  The log to reset
	 *
	 * @return  void
	 */
	public function reset($tag = null);

	/**
	 * Add a message to the log
	 *
	 * @param   string  $level    One of the Akeeba\Engine\Psr\Log\LogLevel constants
	 * @param   string  $message  The message to log
	 * @param   array   $context  Currently not used. Left here for PSR-3 compatibility.
	 *
	 * @return  void
	 */
	public function log($level, $message, array $context = []);

	/**
	 * Temporarily pause log output. The log() method MUST respect this.
	 *
	 * @return  void
	 */
	public function pause();

	/**
	 * Resume the previously paused log output. The log() method MUST respect this.
	 *
	 * @return  void
	 */
	public function unpause();

	/**
	 * Returns the timestamp (in UNIX time long integer format) of the last log message written to the log with the
	 * specific tag. The timestamp MUST be read from the log itself, not from the logger object. It is used by the
	 * engine to find out the age of stalled backups which may have crashed.
	 *
	 * @param   string|null  $tag  The log tag for which the last timestamp is returned
	 *
	 * @return  int|null  The timestamp of the last log message, in UNIX time. NULL if we can't get the timestamp.
	 */
	public function getLastTimestamp($tag = null);
}
components/com_akeeba/BackupEngine/Util/EngineParameters.php000060400000063164152453623440020227 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use DirectoryIterator;
use LogicException;

/**
 * Unified engine parameters helper class. Deals with scripting, GUI configuration elements and information on engine
 * parts (filters, dump engines, scan engines, archivers, installers).
 */
class EngineParameters
{
	/**
	 * Holds the parsed scripting.json contents
	 *
	 * @var array
	 */
	public $scripting = null;

	/**
	 * The currently active scripting type
	 *
	 * @var string
	 */
	protected $activeType = null;

	/**
	 * Holds the known paths holding JSON definitions of engines, installers and configuration gui elements
	 *
	 * @var  array
	 */
	protected $enginePartPaths = [];

	/**
	 * Cache of the engines known to this object
	 *
	 * @var array
	 */
	protected $engine_list = [];

	/**
	 * Cache of the GUI configuration elements known to this object
	 *
	 * @var array
	 */
	protected $gui_list = [];

	/**
	 * Cache of the installers known to this object
	 *
	 * @var array
	 */
	protected $installer_list = [];

	/**
	 * Append a path to the end of the paths list for a specific section
	 *
	 * @param   string  $path     Absolute filesystem path to add
	 * @param   string  $section  The section to add it to (gui, engine, installer, filters)
	 *
	 * @return  void
	 */
	public function addPath(string $path, string $section = 'gui')
	{
		$path = Factory::getFilesystemTools()->TranslateWinPath($path);

		// If the array is empty, populate with the defaults
		if (!array_key_exists($section, $this->enginePartPaths))
		{
			$this->getEnginePartPaths($section);
		}

		// If the path doesn't already exist, add it
		if (!in_array($path, $this->enginePartPaths[$section]))
		{
			$this->enginePartPaths[$section][] = $path;
		}
	}

	/**
	 * Returns an array with domain keys and domain class names for the current
	 * backup type. The idea is that shifting this array walks through the backup
	 * process. When the array is empty, the backup is done.
	 *
	 * Each element of the array is an array with two keys: domain and class.
	 *
	 * @return  array
	 */
	public function getDomainChain(): array
	{
		$configuration = Factory::getConfiguration();
		$script        = $configuration->get('akeeba.basic.backup_type', 'full');

		$scripting = $this->loadScripting();
		$domains   = $scripting['domains'];
		$keys      = $scripting['scripts'][$script]['chain'];

		$result = [];

		foreach ($keys as $domain_key)
		{
			$result[] = [
				'domain' => $domains[$domain_key]['domain'],
				'class'  => $domains[$domain_key]['class'],
			];
		}

		return $result;
	}

	/**
	 * Get the paths for a specific section
	 *
	 * @param   string  $section  The section to get the path list for (engine, installer, gui, filter)
	 *
	 * @return  array
	 */
	public function getEnginePartPaths(string $section = 'gui')
	{
		// Create the key if it's not already present
		if (!array_key_exists($section, $this->enginePartPaths))
		{
			$this->enginePartPaths[$section] = [];
		}

		if (!empty($this->enginePartPaths[$section]))
		{
			return $this->enginePartPaths[$section];
		}

		// Add the defaults if the list is empty
		switch ($section)
		{
			case 'engine':
				$this->enginePartPaths[$section] = [
					Factory::getFilesystemTools()->TranslateWinPath(Factory::getAkeebaRoot()),
				];
				break;

			case 'installer':
				$this->enginePartPaths[$section] = [
					Factory::getFilesystemTools()->TranslateWinPath(Platform::getInstance()->get_installer_images_path()),
				];
				break;

			case 'gui':
				// Add core GUI definitions
				$this->enginePartPaths[$section] = [
					Factory::getFilesystemTools()->TranslateWinPath(Factory::getAkeebaRoot() . '/Core'),
				];

				// Add platform GUI definition files
				$platform_paths = Platform::getInstance()->getPlatformDirectories();

				foreach ($platform_paths as $p)
				{
					$this->enginePartPaths[$section][] = Factory::getFilesystemTools()->TranslateWinPath($p . '/Config');

					$pro = defined('AKEEBA_PRO') && AKEEBA_PRO;
					$pro = defined('AKEEBABACKUP_PRO') ? (AKEEBABACKUP_PRO ? true : false) : $pro;

					if ($pro)
					{
						$this->enginePartPaths[$section][] = Factory::getFilesystemTools()->TranslateWinPath($p . '/Config/Pro');
					}
				}
				break;

			case 'filter':
				$this->enginePartPaths[$section] = [
					Factory::getFilesystemTools()->TranslateWinPath(Factory::getAkeebaRoot() . '/Platform/Filter/Stack'),
					Factory::getFilesystemTools()->TranslateWinPath(Factory::getAkeebaRoot() . '/Filter/Stack'),
				];

				$platform_paths = Platform::getInstance()->getPlatformDirectories();

				foreach ($platform_paths as $p)
				{
					$this->enginePartPaths[$section][] = Factory::getFilesystemTools()->TranslateWinPath($p . '/Filter/Stack');
				}

				break;

			default:
				throw new LogicException(sprintf('Can not get paths for engine section ‘%s’. No section by this name is known to Akeeba Engine.', $section));
		}

		return $this->enginePartPaths[$section];
	}

	/**
	 * Returns a hash list of Akeeba engines and their data. Each entry has the engine name as key and contains two
	 * arrays, under the 'information' and 'parameters' keys.
	 *
	 * @param   string  $engine_type  The engine type to return information for
	 *
	 * @return  array
	 */
	public function getEnginesList(string $engine_type): array
	{
		$engine_type = ucfirst($engine_type);

		// Try to serve cached data first
		if (isset($this->engine_list[$engine_type]))
		{
			return $this->engine_list[$engine_type];
		}

		// Find absolute path to normal and plugins directories
		$temp      = $this->getEnginePartPaths('engine');
		$path_list = [];

		foreach ($temp as $path)
		{
			$path_list[] = $path . '/' . $engine_type;
		}

		// Initialize the array where we store our data
		$this->engine_list[$engine_type] = [];

		// Loop for the paths where engines can be found
		foreach ($path_list as $path)
		{
			if (!@is_dir($path))
			{
				continue;
			}

			if (!@is_readable($path))
			{
				continue;
			}

			$di = new DirectoryIterator($path);

			/** @var DirectoryIterator $file */
			foreach ($di as $file)
			{
				if (!$file->isFile())
				{
					continue;
				}

				if ($file->getExtension() !== 'json')
				{
					continue;
				}

				$bare_name = ucfirst($file->getBasename('.json'));

				// Some hosts copy .json and .php files, renaming them (ie foobar.1.php)
				// We need to exclude them, otherwise we'll get a fatal error for declaring the same class twice
				if (preg_match('/[^A-Za-z0-9]/', $bare_name))
				{
					continue;
				}

				$information = [];
				$parameters  = [];

				$this->parseEngineJSON($file->getRealPath(), $information, $parameters);

				$this->engine_list[$engine_type][lcfirst($bare_name)] = [
					'information' => $information,
					'parameters'  => $parameters,
				];
			}
		}

		return $this->engine_list[$engine_type];
	}

	/**
	 * Parses the GUI JSON files and returns an array of groups and their data
	 *
	 * @return  array
	 */
	public function getGUIGroups(): array
	{
		// Try to serve cached data first
		if (!empty($this->gui_list) && is_array($this->gui_list))
		{
			if (count($this->gui_list) > 0)
			{
				return $this->gui_list;
			}
		}

		// Find absolute path to normal and plugins directories
		$path_list = $this->getEnginePartPaths('gui');

		// Initialize the array where we store our data
		$this->gui_list = [];

		// Loop for the paths where engines can be found
		foreach ($path_list as $path)
		{
			if (!@is_dir($path))
			{
				continue;
			}

			if (!@is_readable($path))
			{
				continue;
			}

			$allJSONFiles = [];
			$di           = new DirectoryIterator($path);

			/** @var DirectoryIterator $file */
			foreach ($di as $file)
			{
				if (!$file->isFile())
				{
					continue;
				}

				// PHP 5.3.5 and earlier do not support getExtension
				if ($file->getExtension() !== 'json')
				{
					continue;
				}

				$allJSONFiles[] = $file->getRealPath();
			}

			if (empty($allJSONFiles))
			{
				continue;
			}

			// Sort GUI files alphabetically
			asort($allJSONFiles);

			// Include each GUI def file
			foreach ($allJSONFiles as $filename)
			{
				$information = [];
				$parameters  = [];

				$this->parseInterfaceJSON($filename, $information, $parameters);

				// This effectively skips non-GUI JSONs (e.g. the scripting JSON)
				if (!empty($information['description']))
				{
					if (!isset($information['merge']))
					{
						$information['merge'] = 0;
					}

					$group_name = substr(basename($filename), 0, -5);

					$def = [
						'information' => $information,
						'parameters'  => $parameters,
					];

					if (!$information['merge'] || !isset($this->gui_list[$group_name]))
					{
						$this->gui_list[$group_name] = $def;
					}
					else
					{
						$this->gui_list[$group_name]['information'] = array_merge($this->gui_list[$group_name]['information'], $def['information']);
						$this->gui_list[$group_name]['parameters']  = array_merge($this->gui_list[$group_name]['parameters'], $def['parameters']);
					}
				}
			}
		}

		ksort($this->gui_list);

		// Push stack filter settings to the 03.filters section
		$path_list = $this->getEnginePartPaths('filter');

		// Loop for the paths where optional filters can be found
		foreach ($path_list as $path)
		{
			if (!@is_dir($path))
			{
				continue;
			}

			if (!@is_readable($path))
			{
				continue;
			}

			// Store JSON names in temp array because we'll sort based on filename (GUI order IS IMPORTANT!!)
			$allJSONFiles = [];

			$di = new DirectoryIterator($path);

			/** @var DirectoryIterator $file */
			foreach ($di as $file)
			{
				if (!$file->isFile())
				{
					continue;
				}

				// PHP 5.3.5 and earlier do not support getExtension
				if ($file->getExtension() !== 'json')
				{
					continue;
				}

				$allJSONFiles[] = $file->getRealPath();
			}

			if (empty($allJSONFiles))
			{
				continue;
			}

			// Sort filter files alphabetically
			asort($allJSONFiles);

			// Include each filter def file
			foreach ($allJSONFiles as $filename)
			{
				$information = [];
				$parameters  = [];

				$this->parseInterfaceJSON($filename, $information, $parameters);

				if (!array_key_exists('03.filters', $this->gui_list))
				{
					$this->gui_list['03.filters'] = ['parameters' => []];
				}

				if (!array_key_exists('parameters', $this->gui_list['03.filters']))
				{
					$this->gui_list['03.filters']['parameters'] = [];
				}

				if (!is_array($parameters))
				{
					$parameters = [];
				}

				$this->gui_list['03.filters']['parameters'] = array_merge($this->gui_list['03.filters']['parameters'], $parameters);
			}
		}

		/**
		 * Parse showon attributes
		 *
		 * The GUI list array format is like this:
		 * ```
		 * [
		 *    '01.sectionName' => [
		 *       'information' => [...],
		 *       'parameters' => [
		 *           'some.parameter.name' => [
		 *               'title' => 'something',
		 *               ...
		 *               'showon' => 'some.other.parameter.name:1'
		 *           ],
		 *           ...
		 *       ]
		 *    ],
		 *    ...
		 * ]
		 * ```
		 *
		 * We need to convert the shown of the parameters to JSON data which can be used by the `showon` JavaScript
		 * code. The assumption only made here is that all parameter keys are turned into `INPUT` elements with an
		 * attribute `name="var[some.parameter.name]"`. This is how the GUI code in all backup applications our company
		 * makes works.
		 *
		 * For backup applications which do not have showon support (they lack the JavaScript code) this does not matter
		 * and neither does it break anything. All parameters are shown all the time like we have been doing for years.
		 */
		$this->gui_list = array_map(
			function (array $section): array {
				foreach ($section['parameters'] as $paramName => &$paramDef)
				{
					if (isset($paramDef['showon']))
					{
						// Parse showon
						$paramDef['showon'] = $this->parseShowOnConditions($paramDef['showon']);
					}
				}

				return $section;
			},
			$this->gui_list
		);

		return $this->gui_list;
	}

	/**
	 * Parses the installer JSON files and returns an array of installers and their data
	 *
	 * @param   boolean  $forDisplay  If true only returns the information relevant for displaying the GUI
	 *
	 * @return  array
	 */
	public function getInstallerList(bool $forDisplay = false): array
	{
		// Try to serve cached data first
		if (!empty($this->installer_list) && is_array($this->installer_list))
		{
			if (count($this->installer_list) > 0)
			{
				return $this->installer_list;
			}
		}

		// Find absolute path to normal and plugins directories
		$path_list = [
			Platform::getInstance()->get_installer_images_path(),
		];

		// Initialize the array where we store our data
		$this->installer_list = [];

		// Loop for the paths where engines can be found
		foreach ($path_list as $path)
		{
			if (!@is_dir($path))
			{
				continue;
			}

			if (!@is_readable($path))
			{
				continue;
			}

			$di = new DirectoryIterator($path);

			/** @var DirectoryIterator $file */
			foreach ($di as $file)
			{
				if (!$file->isFile())
				{
					continue;
				}

				// PHP 5.3.5 and earlier do not support getExtension
				if ($file->getExtension() !== 'json')
				{
					continue;
				}

				$rawData = file_get_contents($file->getRealPath());
				$data    = empty($rawData) ? [] : json_decode($rawData, true);

				if ($forDisplay)
				{
					$innerData = reset($data);

					if (array_key_exists('listinoptions', $innerData))
					{
						if ($innerData['listinoptions'] == 0)
						{
							continue;
						}
					}
				}

				foreach ($data as $key => $values)
				{
					$this->installer_list[$key] = [];

					foreach ($values as $key2 => $value)
					{
						$this->installer_list[$key][$key2] = $value;
					}
				}
			}
		}

		return $this->installer_list;
	}

	/**
	 * Returns the JSON representation of the GUI definition and the associated values
	 *
	 * @return   string
	 */
	public function getJsonGuiDefinition(): string
	{
		// Initialize the array which will be converted to JSON representation
		$json_array = [
			'engines'    => [],
			'installers' => [],
			'gui'        => [],
		];

		// Get a reference to the configuration
		$configuration = Factory::getConfiguration();

		// Get data for all engines
		$engine_types = [
			'archiver',
			'dump',
			'scan',
			'writer',
			'postproc',
		];

		foreach ($engine_types as $type)
		{
			$engines = $this->getEnginesList($type);

			$tempArray    = [];
			$engineTitles = [];

			foreach ($engines as $engine_name => $engine_data)
			{
				// Translate information
				foreach ($engine_data['information'] as $key => $value)
				{
					switch ($key)
					{
						case 'title':
						case 'content':
						case 'description':
							$value = Platform::getInstance()->translate($value);
							break;
					}

					$tempArray[$engine_name]['information'][$key] = $value;

					if ($key == 'title')
					{
						$engineTitles[$engine_name] = $value;
					}
				}

				// Process parameters
				$parameters = [];

				foreach ($engine_data['parameters'] as $param_key => $param)
				{
					$param['default'] = $configuration->get($param_key, $param['default'], false);

					foreach ($param as $option_key => $option_value)
					{
						// Translate title, description, enumkeys
						switch ($option_key)
						{
							case 'title':
							case 'description':
							case 'content':
							case 'labelempty':
							case 'labelnotempty':
								$param[$option_key] = Platform::getInstance()->translate($option_value);
								break;

							case 'enumkeys':
								$enumkeys = explode('|', $option_value);
								$new_keys = [];
								foreach ($enumkeys as $old_key)
								{
									$new_keys[] = Platform::getInstance()->translate($old_key);
								}
								$param[$option_key] = implode('|', $new_keys);
								break;

							case 'showon':
								$param[$option_key] = $this->parseShowOnConditions($param[$option_key]);

							default:
						}
					}

					$parameters[$param_key] = $param;
				}

				// Add processed parameters
				$tempArray[$engine_name]['parameters'] = $parameters;
			}

			asort($engineTitles);

			foreach ($engineTitles as $engineName => $title)
			{
				$json_array['engines'][$type][$engineName] = $tempArray[$engineName];
			}
		}

		// Get data for GUI elements
		$json_array['gui'] = [];
		$groupdefs         = $this->getGUIGroups();

		foreach ($groupdefs as $groupKey => $definition)
		{
			$group_name = '';

			if (isset($definition['information']) && isset($definition['information']['description']))
			{
				$group_name = Platform::getInstance()->translate($definition['information']['description']);
			}

			// Skip no-name groups
			if (empty($group_name))
			{
				continue;
			}

			$parameters = [];

			foreach ($definition['parameters'] as $param_key => $param)
			{
				$param['default'] = $configuration->get($param_key, $param['default'], false);

				foreach ($param as $option_key => $option_value)
				{
					// Translate title, description, enumkeys
					switch ($option_key)
					{
						case 'title':
						case 'description':
						case 'content':
							$param[$option_key] = Platform::getInstance()->translate($option_value);
							break;

						case 'enumkeys':
							$enumkeys = explode('|', $option_value);
							$new_keys = [];
							foreach ($enumkeys as $old_key)
							{
								$new_keys[] = Platform::getInstance()->translate($old_key);
							}
							$param[$option_key] = implode('|', $new_keys);
							break;

						default:
					}
				}
				$parameters[$param_key] = $param;
			}
			$json_array['gui'][$group_name] = $parameters;
		}

		// Get data for the installers
		$json_array['installers'] = $this->getInstallerList(true);

		uasort($json_array['installers'], function ($a, $b) {
			if ($a['name'] == $b['name'])
			{
				return 0;
			}

			return ($a['name'] < $b['name']) ? -1 : 1;
		});

		$json = json_encode($json_array);

		return $json;
	}

	/**
	 * Returns a volatile scripting parameter for the active backup type
	 *
	 * @param   string  $key      The relative key, e.g. core.createarchive
	 * @param   mixed   $default  Default value
	 *
	 * @return  mixed  The scripting parameter's value
	 */
	public function getScriptingParameter(string $key, $default = null)
	{
		$configuration = Factory::getConfiguration();

		if (is_null($this->activeType))
		{
			$this->activeType = $configuration->get('akeeba.basic.backup_type', 'full');
		}

		return $configuration->get('volatile.scripting.' . $this->activeType . '.' . $key, $default);
	}

	/**
	 * Imports the volatile scripting parameters to the registry
	 *
	 * @return  void
	 */
	public function importScriptingToRegistry(): void
	{
		$scripting     = $this->loadScripting();
		$configuration = Factory::getConfiguration();
		$configuration->mergeArray($scripting['data'], false);
	}

	/**
	 * Loads the scripting.json and returns an array with the domains, the scripts and the raw data
	 *
	 * @return  array  The parsed scripting.json. Array keys: domains, scripts, data
	 */
	public function loadScripting(?string $jsonPath = ''): ?array
	{
		if (!empty($this->scripting))
		{
			return $this->scripting;
		}

		$this->scripting = [];
		$jsonPath        = $jsonPath ?: Factory::getAkeebaRoot() . '/Core/scripting.json';

		if (!@file_exists($jsonPath))
		{
			return $this->scripting;
		}

		$rawData          = file_get_contents($jsonPath);
		$rawScriptingData = empty($rawData) ? [] : json_decode($rawData, true);
		$domain_keys      = explode('|', $rawScriptingData['volatile.akeebaengine.domains']);
		$domains          = [];

		foreach ($domain_keys as $key)
		{
			$record        = [
				'domain' => $rawScriptingData['volatile.domain.' . $key . '.domain'],
				'class'  => $rawScriptingData['volatile.domain.' . $key . '.class'],
				'text'   => $rawScriptingData['volatile.domain.' . $key . '.text'],
			];
			$domains[$key] = $record;
		}

		$script_keys = explode('|', $rawScriptingData['volatile.akeebaengine.scripts']);
		$scripts     = [];

		foreach ($script_keys as $key)
		{
			$record        = [
				'chain' => explode('|', $rawScriptingData['volatile.scripting.' . $key . '.chain']),
				'text'  => $rawScriptingData['volatile.scripting.' . $key . '.text'],
			];
			$scripts[$key] = $record;
		}

		$this->scripting = [
			'domains' => $domains,
			'scripts' => $scripts,
			'data'    => $rawScriptingData,
		];

		return $this->scripting;
	}

	/**
	 * Parses an engine JSON file returning two arrays, one with the general information
	 * of that engine and one with its configuration variables' definitions
	 *
	 * @param   string  $jsonPath     Absolute path to engine JSON file
	 * @param   array   $information  [out] The engine information hash array
	 * @param   array   $parameters   [out] The parameters hash array
	 *
	 * @return  bool  True if the file was loaded
	 */
	public function parseEngineJSON(string $jsonPath, array &$information, array &$parameters): bool
	{
		if (!file_exists($jsonPath))
		{
			return false;
		}

		$information = [
			'title'       => '',
			'description' => '',
		];

		$parameters = [];

		$rawData  = file_get_contents($jsonPath);
		$jsonData = empty($rawData) ? [] : json_decode($rawData, true);

		foreach ($jsonData ?? [] as $section => $data)
		{
			if (is_array($data))
			{
				if ($section == '_information')
				{
					// Parse information
					foreach ($data as $key => $value)
					{
						$information[$key] = $value;
					}
				}
				elseif (substr($section, 0, 1) != '_')
				{
					// Parse parameters
					$newparam = [
						'title'       => '',
						'description' => '',
						'type'        => 'string',
						'default'     => '',
					];

					foreach ($data as $key => $value)
					{
						$newparam[$key] = $value;
					}
					$parameters[$section] = $newparam;
				}
			}
		}

		return true;
	}

	/**
	 * Parses a graphical interface JSON file returning two arrays, one with the general
	 * information of that configuration section and one with its configuration variables'
	 * definitions.
	 *
	 * @param   string  $jsonPath     Absolute path to engine JSON file
	 * @param   array   $information  [out] The GUI information hash array
	 * @param   array   $parameters   [out] The parameters hash array
	 *
	 * @return bool True if the file was loaded
	 */
	public function parseInterfaceJSON(string $jsonPath, array &$information, array &$parameters): bool
	{
		if (!file_exists($jsonPath))
		{
			return false;
		}

		$information = [
			'description' => '',
		];

		$parameters = [];
		$rawData    = file_get_contents($jsonPath);
		$jsonData   = empty($rawData) ? [] : json_decode($rawData, true);

		foreach ($jsonData as $section => $data)
		{
			if (is_array($data))
			{
				if ($section == '_group')
				{
					// Parse information
					foreach ($data as $key => $value)
					{
						$information[$key] = $value;
					}

					continue;
				}

				if (substr($section, 0, 1) != '_')
				{
					// Parse parameters
					$newparam = [
						'title'       => '',
						'description' => '',
						'type'        => 'string',
						'default'     => '',
						'protected'   => 0,
					];

					foreach ($data as $key => $value)
					{
						$newparam[$key] = $value;
					}

					$parameters[$section] = $newparam;
				}
			}
		}

		return true;
	}

	/**
	 * Add a path to the beginning of the paths list for a specific section
	 *
	 * @param   string  $path     Absolute filesystem path to add
	 * @param   string  $section  The section to add it to (gui, engine, installer, filters)
	 *
	 * @return  void
	 */
	public function prependPath(string $path, string $section = 'gui'): void
	{
		$path = Factory::getFilesystemTools()->TranslateWinPath($path);

		// If the array is empty, populate with the defaults
		if (!array_key_exists($section, $this->enginePartPaths))
		{
			$this->getEnginePartPaths($section);
		}

		// If the path doesn't already exist, add it
		if (!in_array($path, $this->enginePartPaths[$section]))
		{
			array_unshift($this->enginePartPaths[$section], $path);
		}
	}

	/**
	 * Parse the `showon` conditions text into an instructions array for the ShowOn JavaScript
	 *
	 * @param   string|null  $showOn     The `showon` conditions text
	 * @param   string|null  $arrayName  The array all of our parameters are members of, default 'var'.
	 *
	 * @return  array  The ShowOn JavaScript instructions
	 *
	 * @since   9.3.1
	 */
	private function parseShowOnConditions(?string $showOn, ?string $arrayName = 'var'): array
	{
		if (empty($showOn))
		{
			return [];
		}

		$showOnData  = [];
		$showOnParts = preg_split('#(\[AND\]|\[OR\])#', $showOn, -1, PREG_SPLIT_DELIM_CAPTURE);
		$op          = '';

		foreach ($showOnParts as $showOnPart)
		{
			if (in_array($showOnPart, ['[AND]', '[OR]']))
			{
				$op = trim($showOnPart, '[]');

				continue;
			}

			$compareEqual     = strpos($showOnPart, '!:') === false;
			$showOnPartBlocks = explode(($compareEqual ? ':' : '!:'), $showOnPart, 2);

			$field = $arrayName
				? sprintf("%s[%s]", $arrayName, $showOnPartBlocks[0])
				: $showOnPartBlocks[0];

			$showOnData[] = [
				'field'  => $field,
				'values' => explode(',', $showOnPartBlocks[1]),
				'sign'   => $compareEqual === true ? '=' : '!=',
				'op'     => $op,
			];

			$op = '';
		}

		return $showOnData;
	}
}
components/com_akeeba/BackupEngine/Util/FactoryStorage.php000060400000016162152453623440017726 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;
use InvalidArgumentException;
use RuntimeException;

/**
 * Management class for temporary storage of the serialised engine state.
 */
class FactoryStorage
{
	protected static $tempFileStoragePath;

	/**
	 * Returns the fully qualified path to the storage file
	 *
	 * @param   string  $tag        Backup tag
	 * @param   string  $extension  File extension, default is php
	 *
	 * @return  string
	 */
	public function get_storage_filename($tag = null, $extension = 'php')
	{
		if (is_null(self::$tempFileStoragePath))
		{
			$registry                  = Factory::getConfiguration();
			self::$tempFileStoragePath = $registry->get('akeeba.basic.output_directory', '');

			if (empty(self::$tempFileStoragePath))
			{
				throw new InvalidArgumentException('You have not set a backup output directory.');
			}

			self::$tempFileStoragePath = rtrim(self::$tempFileStoragePath, '/\\');

			if (!is_writable(self::$tempFileStoragePath) || !is_readable(self::$tempFileStoragePath))
			{
				throw new InvalidArgumentException(sprintf('Backup output directory %s needs to be both readable and writeable to PHP for this backup software to function correctly.', self::$tempFileStoragePath));
			}
		}

		$tag      = empty($tag) ? '' : $tag;
		$filename = sprintf("akstorage%s%s.%s", empty($tag) ? '' : '_', $tag, $extension);

		return self::$tempFileStoragePath . DIRECTORY_SEPARATOR . $filename;
	}

	/**
	 * Resets the storage. This method removes all stored values.
	 *
	 * @param   null  $tag
	 *
	 * @return    bool    True on success
	 */
	public function reset($tag = null)
	{
		$filename = $this->get_storage_filename($tag);

		if (!is_file($filename) && !is_link($filename))
		{
			$filename = $this->get_storage_filename($tag, 'dat');
		}

		if (!is_file($filename) && !is_link($filename))
		{
			return false;
		}

		return @unlink($this->get_storage_filename($tag));
	}

	/**
	 * Stores a value to the storage
	 *
	 * @param   string       $value      Serialised value to store
	 * @param   string|null  $tag        Backup tag
	 * @param   string       $extension  File extension to use, default is php
	 *
	 * @return  bool  True on success
	 */
	public function set($value, $tag = null, $extension = 'php')
	{
		$storage_filename = $this->get_storage_filename($tag, $extension);

		if (file_exists($storage_filename))
		{
			@unlink($storage_filename);
		}

		$isPHPFile = strtolower($extension) == 'php';

		return @file_put_contents($storage_filename, $this->encode($value, $isPHPFile)) !== false;
	}

	/**
	 * Retrieves a value from storage
	 *
	 * @param   string|null  $tag  Backup tag. Used to determine the session state (memory) file name.
	 *
	 * @return  string|null
	 */
	public function &get($tag = null)
	{
		$ret              = null;
		$storage_filename = $this->get_storage_filename($tag);
		$isPHPFile        = true;
		$data             = @file_get_contents($storage_filename);

		/**
		 * Some hosts, like WPEngine, do not allow us to use .php files for storing the factory state. In these case we
		 * fall back to using the far less secure .dat extension. This if-block caters for that case.
		 */
		if ($data === false)
		{
			$storage_filename = $this->get_storage_filename($tag, 'dat');
			$isPHPFile        = false;
			$data             = @file_get_contents($storage_filename);
		}

		if ($data === false)
		{
			return $ret;
		}

		try
		{
			$ret = $this->decode($data, $isPHPFile);
		}
		catch (RuntimeException $e)
		{
			$ret = null;
		}

		unset($data);

		return $ret;
	}

	/**
	 * Encodes the (serialized) data in a format suitable for storing in a deliberately web-inaccessible PHP file.
	 *
	 * IMPORTANT: On some hosts we HAVE to fall back to a .dat file. This is nowhere near as secure. This is not a
	 * problem with Akeeba Backup but with the host, e.g. WPEngine. We WANT to do things securely but hosts' misguided
	 * attempts at "security" force us to have a very insecure fallback. Please do not report this as a security issue
	 * with us. report it to the host. We can't do something the host doesn't allow our code to do, obviously!
	 *
	 * @param   string  $data       The data to encode
	 * @param   bool    $isPHPFile  Is this file extension .php?
	 *
	 * @return  string  The encoded data
	 */
	public function encode(&$data, $isPHPFile = true)
	{
		$encodingMethod = $this->getEncodingMethod();
		
		switch ($encodingMethod)
		{
			case 'base64':
				$ret = base64_encode($data);
				break;

			case 'uuencode':
				$ret = convert_uuencode($data);
				break;

			case 'plain':
			default:
				$ret = $data;
				break;
		}

		if ($isPHPFile)
		{
			return '<' . '?' . 'php die(); ' . '>' . '?' . "\n" .
				$encodingMethod . "\n" . $ret;
		}

		return $encodingMethod . "\n" . $ret;
	}

	/**
	 * Decodes the data read from the deliberately web-inaccessible PHP file.
	 *
	 * @param   string  $data       The data read from the file
	 * @param   bool    $isPHPFile  Does the memory file have a .php extension?
	 *
	 * @return  false|string  The decoded data. False if the decoding failed.
	 */
	public function decode(&$data, $isPHPFile = true)
	{
		// Parts: 0 = PHP die line; 1 = encoding mode; 2 = data
		$parts = explode("\n", $data, 3);

		$expectedPartsCount = $isPHPFile ? 3 : 2;

		if (count($parts) != $expectedPartsCount)
		{
			throw new RuntimeException("Invalid backup temporary data (memory file)");
		}

		$encodingIndex = $isPHPFile ? 1 : 0;
		$dataIndex     = $isPHPFile ? 2 : 1;

		switch ($parts[$encodingIndex])
		{
			case 'base64';
				return base64_decode($parts[$dataIndex]);
				break;

			case 'uuencode':
				return convert_uudecode($parts[$dataIndex]);
				break;

			case 'plain':
				return $parts[$dataIndex];
				break;

			default:
				throw new RuntimeException(sprintf('Unsupported encoding method “%s”', $parts[$encodingIndex]));
				break;
		}
	}

	/**
	 * Get the recommended method for encoding the temporary data
	 *
	 * @return string
	 */
	protected function getEncodingMethod()
	{
		// Preferred encoding: base sixty four, handled by PHP
		if (function_exists('base64_encode') && function_exists('base64_decode'))
		{
			return 'base64';
		}

		// Fallback: UUencoding
		if (function_exists('convert_uuencode') && function_exists('convert_uudecode'))
		{
			return 'uuencode';
		}

		// Final fallback (should NOT be necessary): plain text encoding
		return 'plain';
	}
}
components/com_akeeba/BackupEngine/Util/Transfer/RemoteResourceInterface.php000060400000003151152453623440023334 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util\Transfer;

defined('AKEEBAENGINE') || die();

/**
 * An interface for Transfer adapters which support remote resources, allowing us to efficient read from / write to
 * remote locations as if they were local files.
 */
interface RemoteResourceInterface
{
	/**
	 * Return a string with the appropriate stream wrapper protocol for $path. You can use the result with all PHP
	 * functions / classes which accept file paths such as DirectoryIterator, file_get_contents, file_put_contents,
	 * fopen etc.
	 *
	 * @param   string  $path
	 *
	 * @return  string
	 */
	public function getWrapperStringFor($path);

	/**
	 * Return the raw server listing for the requested folder.
	 *
	 * @param   string  $folder  The path name to list
	 *
	 * @return  string
	 */
	public function getRawList($folder);
}
components/com_akeeba/BackupEngine/Util/Transfer/Ftp.php000060400000041746152453623440017315 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util\Transfer;

defined('AKEEBAENGINE') || die();

use Exception;
use RuntimeException;

/**
 * FTP transfer object, using PHP as the transport backend
 */
class Ftp implements TransferInterface, RemoteResourceInterface
{
	/**
	 * FTP server's hostname or IP address
	 *
	 * @var  string
	 */
	protected $host = 'localhost';

	/**
	 * FTP server's port, default: 21
	 *
	 * @var  integer
	 */
	protected $port = 21;

	/**
	 * Username used to authenticate to the FTP server
	 *
	 * @var  string
	 */
	protected $username = '';

	/**
	 * Password used to authenticate to the FTP server
	 *
	 * @var  string
	 */
	protected $password = '';

	/**
	 * FTP initial directory
	 *
	 * @var  string
	 */
	protected $directory = '/';

	/**
	 * Should I use SSL to connect to the server (FTP over explicit SSL, a.k.a. FTPS)?
	 *
	 * @var  boolean
	 */
	protected $ssl = false;

	/**
	 * Should I use FTP passive mode?
	 *
	 * @var bool
	 */
	protected $passive = true;

	/**
	 * Timeout for connecting to the FTP server, default: 10
	 *
	 * @var  integer
	 */
	protected $timeout = 10;

	/**
	 * The FTP connection handle
	 *
	 * @var  resource|null
	 */
	private $connection = null;

	/**
	 * Public constructor
	 *
	 * @param   array  $options  Configuration options
	 *
	 * @return  void
	 *
	 * @throws  RuntimeException
	 */
	public function __construct(array $options)
	{
		if (isset($options['host']))
		{
			$this->host = $options['host'];
		}

		if (isset($options['port']))
		{
			$this->port = (int) $options['port'];
		}

		if (isset($options['username']))
		{
			$this->username = $options['username'];
		}

		if (isset($options['password']))
		{
			$this->password = $options['password'];
		}

		if (isset($options['directory']))
		{
			$this->directory = '/' . ltrim(trim($options['directory']), '/');
		}

		if (isset($options['ssl']))
		{
			$this->ssl = $options['ssl'];
		}

		if (isset($options['passive']))
		{
			$this->passive = $options['passive'];
		}

		if (isset($options['timeout']))
		{
			$this->timeout = max(1, (int) $options['timeout']);
		}

		$this->connect();
	}

	/**
	 * Is this transfer method blocked by a server firewall?
	 *
	 * @param   array  $params  Any additional parameters you might need to pass
	 *
	 * @return  boolean  True if the firewall blocks connections to a known host
	 */
	public static function isFirewalled(array $params = [])
	{
		try
		{
			$connector = new static([
				'host'      => 'test.rebex.net',
				'port'      => 21,
				'username'  => 'demo',
				'password'  => 'password',
				'directory' => '',
				'ssl'       => $params['ssl'] ?? false,
				'passive'   => true,
				'timeout'   => 5,
			]);

			$data = $connector->read('readme.txt');

			if (empty($data))
			{
				return true;
			}
		}
		catch (Exception $e)
		{
			return true;
		}

		return false;
	}

	/**
	 * Save all parameters on serialization except the connection resource
	 *
	 * @return  array
	 */
	public function __sleep()
	{
		return ['host', 'port', 'username', 'password', 'directory', 'ssl', 'passive', 'timeout'];
	}

	/**
	 * Reconnect to the server on unserialize
	 *
	 * @return  void
	 */
	public function __wakeup()
	{
		$this->connect();
	}

	/**
	 * Connect to the FTP server
	 *
	 * @throws  RuntimeException
	 */
	public function connect()
	{
		// Try to connect to the server
		if ($this->ssl)
		{
			if (function_exists('ftp_ssl_connect'))
			{
				$this->connection = @ftp_ssl_connect($this->host, $this->port);
			}
			else
			{
				$this->connection = false;

				throw new RuntimeException('ftp_ssl_connect not available on this server', 500);
			}
		}
		else
		{
			$this->connection = @ftp_connect($this->host, $this->port, $this->timeout);
		}

		if ($this->connection === false)
		{
			throw new RuntimeException(sprintf('Cannot connect to FTP server [host:port] = %s:%s', $this->host, $this->port), 500);
		}

		// Attempt to authenticate
		if (!@ftp_login($this->connection, $this->username, $this->password))
		{
			@ftp_close($this->connection);
			$this->connection = null;

			throw new RuntimeException(sprintf('Cannot log in to FTP server [username:password] = %s:%s', $this->username, $this->password), 500);
		}

		// Attempt to change to the initial directory
		$defaultDir  = @ftp_pwd($this->connection) ?: '/';
		$directories = [
			$this->directory,
			rtrim($this->directory, '/'),
			trim($this->directory, '/'),
			$defaultDir,
		];

		foreach ($directories as $dir)
		{
			$changedDir = @ftp_chdir($this->connection, $dir);

			if ($changedDir)
			{
				$this->directory = $dir;

				break;
			}
		}

		if (!$changedDir)
		{
			@ftp_close($this->connection);
			$this->connection = null;

			throw new RuntimeException(sprintf('Cannot change to initial FTP directory "%s" – make sure the folder exists and that you have adequate permissions to it. Pro tip: the default directory of your FTP connection is reported to be %s', $this->directory, $defaultDir), 500);
		}

		// Apply the passive mode preference
		@ftp_pasv($this->connection, $this->passive);
	}

	/**
	 * Public destructor, closes any open FTP connections
	 */
	public function __destruct()
	{
		if (!is_null($this->connection))
		{
			@ftp_close($this->connection);
		}
	}

	/**
	 * Write the contents into the file
	 *
	 * @param   string  $fileName  The full path to the file
	 * @param   string  $contents  The contents to write to the file
	 *
	 * @return  boolean  True on success
	 */
	public function write($fileName, $contents)
	{
		// Make sure the buffer:// wrapper is loaded
		class_exists('\\Akeeba\\Engine\\Util\\Buffer', true);

		$handle = fopen('buffer://akeeba_engine_transfer_ftp', 'r+');
		fwrite($handle, $contents);
		rewind($handle);

		$cwd            = $this->cwd();
		$remoteFilename = '/' . ltrim($fileName, '/');
		$remotePath     = dirname($remoteFilename);
		$remoteName     = basename($remoteFilename);

		if (!$this->isDir($remotePath))
		{
			$this->mkdir($remotePath);
		}

		$changedDir = @ftp_chdir($this->connection, $remotePath);

		$ret = $changedDir && @ftp_fput($this->connection, $remoteName, $handle, FTP_BINARY);

		if ($changedDir)
		{
			@ftp_chdir($this->connection, $cwd);
		}

		fclose($handle);

		return $ret;
	}

	/**
	 * Uploads a local file to the remote storage
	 *
	 * @param   string  $localFilename   The full path to the local file
	 * @param   string  $remoteFilename  The full path to the remote file
	 * @param   bool    $useExceptions   Throw an exception instead of returning "false" on connection error.
	 *
	 * @return  boolean  True on success
	 */
	public function upload($localFilename, $remoteFilename, $useExceptions = true)
	{
		$handle = @fopen($localFilename, 'r');

		if ($handle === false)
		{
			if ($useExceptions)
			{
				throw new RuntimeException("Unreadable local file $localFilename");
			}

			return false;
		}

		$cwd            = $this->cwd();
		$remoteFilename = '/' . ltrim($remoteFilename, '/');
		$remotePath     = dirname($remoteFilename);
		$remoteName     = basename($remoteFilename);

		if (!$this->isDir($remotePath))
		{
			$this->mkdir($remotePath);
		}

		$changedDir = @ftp_chdir($this->connection, $remotePath);
		$ret        = $changedDir && @ftp_fput($this->connection, $remoteName, $handle, FTP_BINARY);

		if ($changedDir)
		{
			@ftp_chdir($this->connection, $cwd);
		}

		@fclose($handle);

		return $ret;
	}

	/**
	 * Read the contents of a remote file into a string
	 *
	 * @param   string  $fileName  The full path to the remote file
	 *
	 * @return  string  The contents of the remote file
	 */
	public function read($fileName)
	{
		// Make sure the buffer:// wrapper is loaded
		class_exists('\\Akeeba\\Engine\\Util\\Buffer', true);

		$handle = fopen('buffer://akeeba_engine_transfer_ftp', 'r+');

		$cwd            = $this->cwd();
		$remoteFilename = '/' . ltrim($fileName, '/');
		$remotePath     = dirname($remoteFilename);
		$remoteName     = basename($remoteFilename);
		$changedDir     = @ftp_chdir($this->connection, $remotePath);
		$result         = $changedDir && @ftp_fget($this->connection, $handle, $remoteName, FTP_BINARY);

		if ($changedDir)
		{
			@ftp_chdir($this->connection, $cwd);
		}

		if ($result === false)
		{
			fclose($handle);
			throw new RuntimeException("Can not download remote file $fileName");
		}

		rewind($handle);

		$ret = '';

		while (!feof($handle))
		{
			$ret .= fread($handle, 131072);
		}

		fclose($handle);

		return $ret;
	}

	/**
	 * Download a remote file into a local file
	 *
	 * @param   string  $remoteFilename  The remote file path to download from
	 * @param   string  $localFilename   The local file path to download to
	 * @param   bool    $useExceptions   Throw an exception instead of returning "false" on connection error.
	 *
	 * @return  boolean  True on success
	 */
	public function download($remoteFilename, $localFilename, $useExceptions = true)
	{
		$cwd            = $this->cwd();
		$remoteFilename = '/' . ltrim($remoteFilename, '/');
		$remotePath     = dirname($remoteFilename);
		$remoteName     = basename($remoteFilename);
		$changedDir     = @ftp_chdir($this->connection, $remotePath);

		$ret = $changedDir && @ftp_get($this->connection, $localFilename, $remoteName, FTP_BINARY);

		if ($changedDir)
		{
			@ftp_chdir($this->connection, $cwd);
		}

		if (!$ret && $useExceptions)
		{
			throw new RuntimeException("Cannot download remote file $remoteFilename through FTP.");
		}

		return $ret;
	}

	/**
	 * Delete a file (remove it from the disk)
	 *
	 * @param   string  $fileName  The full path to the file
	 *
	 * @return  boolean  True on success
	 */
	public function delete($fileName)
	{
		$cwd            = $this->cwd();
		$remoteFilename = '/' . ltrim($fileName, '/');
		$remotePath     = dirname($remoteFilename);
		$remoteName     = basename($remoteFilename);

		if (!$this->isDir($remotePath))
		{
			$this->mkdir($remotePath);
		}

		$changedDir = @ftp_chdir($this->connection, $remotePath);
		$ret        = $changedDir && @ftp_delete($this->connection, $remoteName);;

		if ($changedDir)
		{
			ftp_chdir($this->connection, $cwd);
		}

		return $ret;
	}

	/**
	 * Create a copy of the file. Actually, we have to read it in memory and upload it again.
	 *
	 * @param   string  $from  The full path of the file to copy from
	 * @param   string  $to    The full path of the file that will hold the copy
	 *
	 * @return  boolean  True on success
	 */
	public function copy($from, $to)
	{
		// Make sure the buffer:// wrapper is loaded
		class_exists('\\Akeeba\\Engine\\Util\\Buffer', true);

		$handle = fopen('buffer://akeeba_engine_transfer_ftp', 'r+');

		$cwd            = $this->cwd();
		$remoteFilename = '/' . ltrim($from, '/');
		$remotePath     = dirname($remoteFilename);
		$remoteName     = basename($remoteFilename);
		$changedDir     = @ftp_chdir($this->connection, $remotePath);

		$ret = $changedDir && @ftp_fget($this->connection, $handle, $remoteName, FTP_BINARY);

		if ($ret !== false)
		{
			rewind($handle);

			$remoteFilename = '/' . ltrim($to, '/');
			$remotePath     = dirname($remoteFilename);
			$remoteName     = basename($remoteFilename);

			if (!$this->isDir($remotePath))
			{
				$this->mkdir($remotePath);
			}

			$changedDir = @ftp_chdir($this->connection, $remotePath);
			$ret        = $changedDir && @ftp_fput($this->connection, $remoteName, $handle, FTP_BINARY);
		}

		if ($changedDir)
		{
			@ftp_chdir($this->connection, $cwd);
		}

		fclose($handle);

		return $ret;
	}

	/**
	 * Move or rename a file
	 *
	 * @param   string  $from  The full path of the file to move
	 * @param   string  $to    The full path of the target file
	 *
	 * @return  boolean  True on success
	 */
	public function move($from, $to)
	{
		return @ftp_rename($this->connection, $from, $to);
	}

	/**
	 * Change the permissions of a file
	 *
	 * @param   string   $fileName     The full path of the file whose permissions will change
	 * @param   integer  $permissions  The new permissions, e.g. 0644 (remember the leading zero in octal numbers!)
	 *
	 * @return  boolean  True on success
	 */
	public function chmod($fileName, $permissions)
	{
		if (@ftp_chmod($this->connection, $permissions, $fileName) !== false)
		{
			return true;
		}

		$permissionsOctal = decoct((int) $permissions);

		if (@ftp_site($this->connection, "CHMOD $permissionsOctal $fileName") !== false)
		{
			return true;
		}

		return false;
	}

	/**
	 * Create a directory if it doesn't exist. The operation is implicitly recursive, i.e. it will create all
	 * intermediate directories if they do not already exist.
	 *
	 * @param   string   $dirName      The full path of the directory to create
	 * @param   integer  $permissions  The permissions of the created directory
	 *
	 * @return  boolean  True on success
	 */
	public function mkdir($dirName, $permissions = 0755)
	{
		$targetDir = rtrim($dirName, '/');

		$directories = explode('/', $targetDir);

		$remoteDir = '';

		foreach ($directories as $dir)
		{
			if (!$dir)
			{
				continue;
			}

			$remoteDir .= '/' . $dir;

			// Continue if the folder already exists. Otherwise I'll get a an error even if everything is fine
			if ($this->isDir($remoteDir))
			{
				continue;
			}

			$ret = @ftp_mkdir($this->connection, $remoteDir);

			if ($ret === false)
			{
				return $ret;
			}
		}

		$this->chmod($dirName, $permissions);

		return true;
	}

	/**
	 * Checks if the given directory exists
	 *
	 * @param   string  $path  The full path of the remote directory to check
	 *
	 * @return  boolean  True if the directory exists
	 */
	public function isDir($path)
	{
		$cur_dir = ftp_pwd($this->connection);

		if (@ftp_chdir($this->connection, $path))
		{
			// If it is a directory, then change the directory back to the original directory
			ftp_chdir($this->connection, $cur_dir);

			return true;
		}
		else
		{
			return false;
		}
	}

	/**
	 * Get the current working directory
	 *
	 * @return  string
	 */
	public function cwd()
	{
		return ftp_pwd($this->connection);
	}

	/**
	 * Returns the absolute remote path from a path relative to the initial directory configured when creating the
	 * transfer object.
	 *
	 * @param   string  $fileName  The relative path of a file or directory
	 *
	 * @return  string  The absolute path for use by the transfer object
	 */
	public function getPath($fileName)
	{
		$fileName = str_replace('\\', '/', $fileName);

		if (strpos($fileName, $this->directory) === 0)
		{
			return $fileName;
		}

		$fileName = trim($fileName, '/');
		$fileName = rtrim($this->directory, '/') . '/' . $fileName;

		return $fileName;
	}

	/**
	 * Lists the subdirectories inside an FTP directory
	 *
	 * @param   null|string  $dir  The directory to scan. Skip to use the current directory.
	 *
	 * @return  array|bool  A list of folders, or false if we could not get a listing
	 *
	 * @throws  RuntimeException  When the server is incompatible with our FTP folder scanner
	 */
	public function listFolders($dir = null)
	{
		if (!@ftp_chdir($this->connection, $dir))
		{
			throw new RuntimeException(sprintf('Cannot change to FTP directory "%s" – make sure the folder exists and that you have adequate permissions to it', $dir), 500);
		}

		$list = @ftp_rawlist($this->connection, '.');

		if ($list === false)
		{
			throw new RuntimeException("Sorry, your FTP server doesn't support our FTP directory browser.");
		}

		$folders = [];

		foreach ($list as $v)
		{
			$vInfo = preg_split("/[\s]+/", $v, 9);

			if ($vInfo[0] !== "total")
			{
				$perms = $vInfo[0];

				if (substr($perms, 0, 1) == 'd')
				{
					$folders[] = $vInfo[8];
				}
			}
		}

		asort($folders);

		return $folders;
	}

	/**
	 * Return a string with the appropriate stream wrapper protocol for $path. You can use the result with all PHP
	 * functions / classes which accept file paths such as DirectoryIterator, file_get_contents, file_put_contents,
	 * fopen etc.
	 *
	 * @param   string  $path
	 *
	 * @return  string
	 */
	public function getWrapperStringFor($path)
	{
		$usernameEncoded = urlencode($this->username);
		$passwordEncoded = urlencode($this->password);
		$hostname        = $this->host . ($this->port ? ":{$this->port}" : '');
		$protocol        = $this->ssl ? "ftps" : "ftp";

		return "{$protocol}://{$usernameEncoded}:{$passwordEncoded}@{$hostname}{$path}";
	}

	/**
	 * Return the raw server listing for the requested folder.
	 *
	 * @param   string  $folder  The path name to list
	 *
	 * @return  string
	 */
	public function getRawList($folder)
	{
		return ftp_rawlist($this->connection, $folder);
	}
}
components/com_akeeba/BackupEngine/Util/Transfer/TransferInterface.php000060400000012544152453623440022163 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util\Transfer;

defined('AKEEBAENGINE') || die();

use RuntimeException;

/**
 * An interface for Transfer adapters, used to transfer files to remote servers over FTP, FTPS, SFTP and possibly other
 * file transfer methods we might implement.
 *
 * @package   Akeeba\Engine\Util\Transfer
 */
interface TransferInterface
{
	/**
	 * Creates the uploader
	 *
	 * @param   array  $config
	 */
	public function __construct(array $config);

	/**
	 * Is this transfer method blocked by a server firewall?
	 *
	 * @param   array  $params  Any additional parameters you might need to pass
	 *
	 * @return  boolean  True if the firewall blocks connections to a known host
	 */
	public static function isFirewalled(array $params = []);

	/**
	 * Write the contents into the file
	 *
	 * @param   string  $fileName  The full path to the remote file
	 * @param   string  $contents  The contents to write to the file
	 *
	 * @return  boolean  True on success
	 */
	public function write($fileName, $contents);

	/**
	 * Uploads a local file to the remote storage
	 *
	 * @param   string  $localFilename   The full path to the local file
	 * @param   string  $remoteFilename  The full path to the remote file
	 * @param   bool    $useExceptions   Throw an exception instead of returning "false" on connection error.
	 *
	 * @return  boolean  True on success
	 */
	public function upload($localFilename, $remoteFilename, $useExceptions = true);

	/**
	 * Read the contents of a remote file into a string
	 *
	 * @param   string  $fileName  The full path to the remote file
	 *
	 * @return  string  The contents of the remote file
	 */
	public function read($fileName);

	/**
	 * Download a remote file into a local file
	 *
	 * @param   string  $remoteFilename  The remote file path to download from
	 * @param   string  $localFilename   The local file path to download to
	 * @param   bool    $useExceptions   Throw an exception instead of returning "false" on connection error.
	 *
	 * @return  boolean  True on success
	 */
	public function download($remoteFilename, $localFilename, $useExceptions = true);

	/**
	 * Delete a remote file
	 *
	 * @param   string  $fileName  The full path to the remote file
	 *
	 * @return  boolean  True on success
	 */
	public function delete($fileName);

	/**
	 * Create a copy of the remote file
	 *
	 * @param   string  $from  The full path of the remote file to copy from
	 * @param   string  $to    The full path of the remote file that will hold the copy
	 *
	 * @return  boolean  True on success
	 */
	public function copy($from, $to);

	/**
	 * Move or rename a file
	 *
	 * @param   string  $from  The full remote path of the file to move
	 * @param   string  $to    The full remote path of the target file
	 *
	 * @return  boolean  True on success
	 */
	public function move($from, $to);

	/**
	 * Change the permissions of a file
	 *
	 * @param   string   $fileName     The full path of the remote file whose permissions will change
	 * @param   integer  $permissions  The new permissions, e.g. 0644 (remember the leading zero in octal numbers!)
	 *
	 * @return  boolean  True on success
	 */
	public function chmod($fileName, $permissions);

	/**
	 * Create a directory if it doesn't exist. The operation is implicitly recursive, i.e. it will create all
	 * intermediate directories if they do not already exist.
	 *
	 * @param   string   $dirName      The full path of the remote directory to create
	 * @param   integer  $permissions  The permissions of the created directory
	 *
	 * @return  boolean  True on success
	 */
	public function mkdir($dirName, $permissions = 0755);

	/**
	 * Checks if the given directory exists
	 *
	 * @param   string  $path  The full path of the remote directory to check
	 *
	 * @return  boolean  True if the directory exists
	 */
	public function isDir($path);

	/**
	 * Get the current working directory
	 *
	 * @return  string
	 */
	public function cwd();

	/**
	 * Returns the absolute remote path from a path relative to the initial directory configured when creating the
	 * transfer object.
	 *
	 * @param   string  $fileName  The relative path of a file or directory
	 *
	 * @return  string  The absolute path for use by the transfer object
	 */
	public function getPath($fileName);

	/**
	 * Lists the subdirectories inside a directory
	 *
	 * @param   null|string  $dir  The directory to scan. Skip to use the current directory.
	 *
	 * @return  array|bool  A list of folders, or false if we could not get a listing
	 *
	 * @throws  RuntimeException  When the server is incompatible with our folder scanner
	 */
	public function listFolders($dir = null);
}
components/com_akeeba/BackupEngine/Util/Transfer/FtpCurl.php000060400000046377152453623440020150 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util\Transfer;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Postproc\ProxyAware;
use RuntimeException;

/**
 * FTP transfer object, using cURL as the transport backend
 */
class FtpCurl extends Ftp implements TransferInterface
{
	use ProxyAware;

	/**
	 * Timeout for transferring data to the FTP server, default: 10 minutes
	 *
	 * @var  integer
	 */
	protected $timeout = 600;

	/**
	 * Should I ignore the IP returned by the server during Passive mode transfers?
	 *
	 * @var   bool
	 *
	 * @see   http://www.elitehosts.com/blog/php-ftp-passive-ftp-server-behind-nat-nightmare/
	 */
	private $skipPassiveIP = true;

	/**
	 * Should we enable verbose output to STDOUT? Useful for debugging.
	 *
	 * @var   bool
	 */
	private $verbose = false;

	/**
	 * Public constructor
	 *
	 * @param   array  $options  Configuration options
	 *
	 * @throws  RuntimeException
	 */
	public function __construct(array $options)
	{
		parent::__construct($options);

		if (isset($options['passive_fix']))
		{
			$this->skipPassiveIP = $options['passive_fix'] ? true : false;
		}

		if (isset($options['verbose']))
		{
			$this->verbose = $options['verbose'] ? true : false;
		}
	}

	/**
	 * Save all parameters on serialization except the connection resource
	 *
	 * @return  array
	 */
	public function __sleep()
	{
		return [
			'host',
			'port',
			'username',
			'password',
			'directory',
			'ssl',
			'passive',
			'timeout',
			'skipPassiveIP',
			'verbose',
		];
	}

	/**
	 * Test the connection to the FTP server and whether the initial directory is correct. This is done by attempting to
	 * list the contents of the initial directory. The listing is not parsed (we don't really care!) and we do NOT check
	 * if we can upload files to that remote folder.
	 *
	 * @throws  RuntimeException
	 */
	public function connect()
	{
		$ch = $this->getCurlHandle($this->directory . '/');
		curl_setopt($ch, CURLOPT_HEADER, 1);
		curl_setopt($ch, CURLOPT_NOBODY, 1);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

		curl_exec($ch);

		$errNo = curl_errno($ch);
		$error = curl_error($ch);
		curl_close($ch);

		if ($errNo)
		{
			throw new RuntimeException("cURL Error $errNo connecting to remote FTP server: $error", 500);
		}
	}

	/**
	 * Write the contents into the file
	 *
	 * @param   string  $fileName  The full path to the file
	 * @param   string  $contents  The contents to write to the file
	 *
	 * @return  boolean  True on success
	 */
	public function write($fileName, $contents)
	{
		// Make sure the buffer:// wrapper is loaded
		class_exists('\\Akeeba\\Engine\\Util\\Buffer', true);

		$handle = fopen('buffer://akeeba_engine_transfer_ftp_curl', 'r+');
		fwrite($handle, $contents);

		// Note: don't manually close the file pointer, it's closed automatically by uploadFromHandle
		try
		{
			$this->uploadFromHandle($fileName, $handle);
		}
		catch (RuntimeException $e)
		{
			return false;
		}

		return true;
	}

	/**
	 * Uploads a local file to the remote storage
	 *
	 * @param   string  $localFilename   The full path to the local file
	 * @param   string  $remoteFilename  The full path to the remote file
	 * @param   bool    $useExceptions   Throw an exception instead of returning "false" on connection error.
	 *
	 * @return  boolean  True on success
	 */
	public function upload($localFilename, $remoteFilename, $useExceptions = true)
	{
		$fp = @fopen($localFilename, 'r');

		if ($fp === false)
		{
			throw new RuntimeException("Unreadable local file $localFilename");
		}

		// Note: don't manually close the file pointer, it's closed automatically by uploadFromHandle
		try
		{
			$this->uploadFromHandle($remoteFilename, $fp);
		}
		catch (RuntimeException $e)
		{
			if ($useExceptions)
			{
				throw $e;
			}

			return false;
		}

		return true;
	}

	/**
	 * Read the contents of a remote file into a string
	 *
	 * @param   string  $fileName  The full path to the remote file
	 *
	 * @return  string  The contents of the remote file
	 */
	public function read($fileName)
	{
		try
		{
			return $this->downloadToString($fileName);
		}
		catch (RuntimeException $e)
		{
			throw new RuntimeException("Can not download remote file $fileName", 500, $e);
		}
	}

	/**
	 * Download a remote file into a local file
	 *
	 * @param   string  $remoteFilename  The remote file path to download from
	 * @param   string  $localFilename   The local file path to download to
	 * @param   bool    $useExceptions   Throw an exception instead of returning "false" on connection error.
	 *
	 * @return  boolean  True on success
	 */
	public function download($remoteFilename, $localFilename, $useExceptions = true)
	{
		$fp = @fopen($localFilename, 'w');

		if ($fp === false)
		{
			if ($useExceptions)
			{
				throw new RuntimeException(sprintf('Download from FTP failed. Can not open local file %s for writing.', $localFilename));
			}

			return false;
		}

		// Note: don't manually close the file pointer, it's closed automatically by downloadToHandle
		try
		{
			$this->downloadToHandle($remoteFilename, $fp);
		}
		catch (RuntimeException $e)
		{
			if ($useExceptions)
			{
				throw $e;
			}

			return false;
		}

		return true;
	}

	/**
	 * Delete a file (remove it from the disk)
	 *
	 * @param   string  $fileName  The full path to the file
	 *
	 * @return  boolean  True on success
	 */
	public function delete($fileName)
	{
		$commands = [
			'DELE ' . $this->getPath($fileName),
		];

		try
		{
			$this->executeServerCommands($commands);
		}
		catch (RuntimeException $e)
		{
			return false;
		}

		return true;
	}

	/**
	 * Create a copy of the file. Actually, we have to read it in memory and upload it again.
	 *
	 * @param   string  $from  The full path of the file to copy from
	 * @param   string  $to    The full path of the file that will hold the copy
	 *
	 * @return  boolean  True on success
	 */
	public function copy($from, $to)
	{
		// Make sure the buffer:// wrapper is loaded
		class_exists('\\Akeeba\\Engine\\Util\\Buffer', true);

		$handle = fopen('buffer://akeeba_engine_transfer_ftp', 'r+');

		try
		{
			$this->downloadToHandle($from, $handle, false);
			$this->uploadFromHandle($to, $handle);
		}
		catch (RuntimeException $e)
		{
			return false;
		}

		return true;
	}

	/**
	 * Move or rename a file
	 *
	 * @param   string  $from  The full path of the file to move
	 * @param   string  $to    The full path of the target file
	 *
	 * @return  boolean  True on success
	 */
	public function move($from, $to)
	{
		$from = $this->getPath($from);
		$to   = $this->getPath($to);

		$commands = [
			'RNFR /' . $from,
			'RNTO /' . $to,
		];

		try
		{
			$this->executeServerCommands($commands);
		}
		catch (RuntimeException $e)
		{
			return false;
		}

		return true;
	}

	/**
	 * Change the permissions of a file
	 *
	 * @param   string   $fileName     The full path of the file whose permissions will change
	 * @param   integer  $permissions  The new permissions, e.g. 0644 (remember the leading zero in octal numbers!)
	 *
	 * @return  boolean  True on success
	 */
	public function chmod($fileName, $permissions)
	{
		// Make sure permissions are in an octal string representation
		if (!is_string($permissions))
		{
			$permissions = decoct($permissions);
		}

		$commands = [
			'SITE CHMOD ' . $permissions . ' /' . $this->getPath($fileName),
		];

		try
		{
			$this->executeServerCommands($commands);
		}
		catch (RuntimeException $e)
		{
			return false;
		}

		return true;
	}

	/**
	 * Create a directory if it doesn't exist. The operation is implicitly recursive, i.e. it will create all
	 * intermediate directories if they do not already exist.
	 *
	 * @param   string   $dirName      The full path of the directory to create
	 * @param   integer  $permissions  The permissions of the created directory
	 *
	 * @return  boolean  True on success
	 */
	public function mkdir($dirName, $permissions = 0755)
	{
		$targetDir = rtrim($dirName, '/');

		$directories = explode('/', $targetDir);

		$remoteDir = '';

		foreach ($directories as $dir)
		{
			if (!$dir)
			{
				continue;
			}

			$remoteDir .= '/' . $dir;

			// Continue if the folder already exists. Otherwise I'll get a an error even if everything is fine
			if ($this->isDir($remoteDir))
			{
				continue;
			}

			$commands = [
				'MKD ' . $remoteDir,
			];

			try
			{
				$this->executeServerCommands($commands);
			}
			catch (RuntimeException $e)
			{
				return false;
			}
		}

		$this->chmod($dirName, $permissions);

		return true;
	}

	/**
	 * Checks if the given directory exists
	 *
	 * @param   string  $path  The full path of the remote directory to check
	 *
	 * @return  boolean  True if the directory exists
	 */
	public function isDir($path)
	{
		$ch = $this->getCurlHandle($path . '/');
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

		curl_exec($ch);

		$errNo = curl_errno($ch);
		curl_close($ch);

		if ($errNo)
		{
			return false;
		}

		return true;
	}

	/**
	 * Get the current working directory. NOT IMPLEMENTED.
	 *
	 * @return  string
	 */
	public function cwd()
	{
		$commands = [
			'PWD',
		];

		try
		{
			$result = $this->executeServerCommands($commands, '');
		}
		catch (RuntimeException $e)
		{
			return '/';
		}

		return $result;
	}

	/**
	 * Lists the subdirectories inside an FTP directory
	 *
	 * @param   null|string  $dir  The directory to scan. Skip to use the current directory.
	 *
	 * @return  array|bool   A list of folders, or false if we could not get a listing
	 *
	 * @throws  RuntimeException  When the server is incompatible with our FTP folder scanner
	 */
	public function listFolders($dir = null)
	{
		if (empty($dir))
		{
			$dir = $this->directory;
		}

		$dir = rtrim($dir, '/');

		$ch = $this->getCurlHandle($dir . '/');
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

		$list = curl_exec($ch);

		$errNo = curl_errno($ch);
		$error = curl_error($ch);
		curl_close($ch);

		if ($errNo)
		{
			throw new RuntimeException(sprintf("cURL Error $errNo ($error) while listing contents of directory \"%s\" – make sure the folder exists and that you have adequate permissions to it", $dir), 500);
		}

		if (empty($list))
		{
			throw new RuntimeException("Sorry, your FTP server doesn't support our FTP directory browser.");
		}

		$folders = [];

		// Convert the directory listing into an array of lines without *NIX/Windows/Mac line ending characters
		$list = explode("\n", $list);
		$list = array_map('rtrim', $list);

		foreach ($list as $v)
		{
			$vInfo = preg_split("/[\s]+/", $v, 9);

			if ($vInfo[0] !== "total")
			{
				$perms = $vInfo[0];

				if (substr($perms, 0, 1) == 'd')
				{
					$folders[] = $vInfo[8];
				}
			}
		}

		asort($folders);

		return $folders;
	}

	/**
	 * Is the verbose debug option set?
	 *
	 * @return  boolean
	 */
	public function isVerbose()
	{
		return $this->verbose;
	}

	/**
	 * Set the verbose debug option
	 *
	 * @param   boolean  $verbose
	 *
	 * @return  void
	 */
	public function setVerbose($verbose)
	{
		$this->verbose = $verbose;
	}

	/**
	 * Returns the absolute remote path from a path relative to the initial directory configured when creating the
	 * transfer object.
	 *
	 * @param   string  $fileName  The relative path of a file or directory
	 *
	 * @return  string  The absolute path for use by the transfer object
	 */
	public function getPath($fileName)
	{
		$fileName = ltrim(str_replace('\\', '/', $fileName), '/');

		$isInitialDirectory = $fileName === $this->directory;
		$startsWithInitialDirectory = (strpos($fileName, rtrim($this->directory, '/') . '/') === 0)
			|| (strpos($fileName, trim($this->directory, '/') . '/') === 0);

		// Relative file? Add the initial directory
		if (!$isInitialDirectory && !$startsWithInitialDirectory)
		{
			$fileName = '/' . trim($this->directory, '/') .
				(empty($fileName) ? '' : '/') . $fileName;
		}

		return '/' . ltrim($fileName, '/');
	}

	/**
	 * Returns a cURL resource handler for the remote FTP server
	 *
	 * @param   string  $remoteFile  Optional. The remote file / folder on the FTP server you'll be manipulating with cURL.
	 *
	 * @return  resource
	 */
	protected function getCurlHandle($remoteFile = '')
	{
		/**
		 * Get the FTP URI
		 *
		 * VERY IMPORTANT! WE NEED THE DOUBLE SLASH AFTER THE HOST NAME since we are giving an absolute path.
		 * @see https://technicalsanctuary.wordpress.com/2012/11/01/curl-curl-9-server-denied-you-to-change-to-the-given-directory/
		 */
		$ftpUri = 'ftp://' . $this->host . '//';

		$isInitialDirectory = $remoteFile === $this->directory;
		$startsWithInitialDirectory = (strpos($remoteFile, rtrim($this->directory, '/') . '/') === 0)
			|| (strpos($remoteFile, trim($this->directory, '/') . '/') === 0);

		// Relative file? Add the initial directory
		if (!$isInitialDirectory && !$startsWithInitialDirectory)
		{
			$ftpUri .= '/' . trim($this->directory, '/');
		}

		if (!empty($remoteFile) && substr($ftpUri, -2) !== '//')
		{
			$ftpUri .= '/';
		}

		// Add a remote file if necessary. The filename must be URL encoded since we're creating a URI.
		if (!empty($remoteFile))
		{
			$suffix = '';

			if (substr($remoteFile, -7, 6) == ';type=')
			{
				$suffix     = substr($remoteFile, -7);
				$remoteFile = substr($remoteFile, 0, -7);
			}

			$dirname = dirname($remoteFile);

			// Windows messing up dirname('/'). KILL ME.
			if ($dirname == '\\')
			{
				$dirname = '';
			}

			$dirname  = trim($dirname, '/');
			$basename = basename($remoteFile);

			if ((substr($remoteFile, -1) == '/') && !empty($basename))
			{
				$suffix = '/' . $suffix;
			}

			$ftpUri .= '/' . $dirname . (empty($dirname) ? '' : '/') . urlencode($basename) . $suffix;
		}

		// Colons in usernames must be URL escaped
		$username = str_replace(':', '%3A', $this->username);

		$ch = curl_init();

		$this->applyProxySettingsToCurl($ch);

		curl_setopt($ch, CURLOPT_URL, $ftpUri);
		curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $this->password);
		curl_setopt($ch, CURLOPT_PORT, $this->port);
		curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);

		// Should I enable Implict SSL?
		if ($this->ssl)
		{
			curl_setopt($ch, CURLOPT_FTP_SSL, CURLFTPSSL_ALL);
			curl_setopt($ch, CURLOPT_FTPSSLAUTH, CURLFTPAUTH_DEFAULT);

			// Most FTPS servers use self-signed certificates. That's the only way to connect to them :(
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
			curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
		}

		// Should I ignore the server-supplied passive mode IP address?
		if ($this->passive && $this->skipPassiveIP)
		{
			curl_setopt($ch, CURLOPT_FTP_SKIP_PASV_IP, 1);
		}

		// Should I enable active mode?
		if (!$this->passive)
		{
			/**
			 * cURL always uses passive mode for FTP transfers. Setting the CURLOPT_FTPPORT flag enables the FTP PORT
			 * command which makes the connection active. Setting it to '-'  lets the library use your system's default
			 * IP address.
			 *
			 * @see https://curl.haxx.se/libcurl/c/CURLOPT_FTPPORT.html
			 */
			curl_setopt($ch, CURLOPT_FTPPORT, '-');
		}

		// Should I enable verbose output? Useful for debugging.
		if ($this->verbose)
		{
			curl_setopt($ch, CURLOPT_VERBOSE, 1);
		}

		// Automatically create missing directories
		curl_setopt($ch, CURLOPT_FTP_CREATE_MISSING_DIRS, 1);

		return $ch;
	}

	/**
	 * Uploads a file using file contents provided through a file handle
	 *
	 * @param   string    $remoteFilename  Remote file to write contents to
	 * @param   resource  $fp              File or stream handler of the source data to upload
	 *
	 * @return  void
	 *
	 * @throws  RuntimeException
	 */
	protected function uploadFromHandle($remoteFilename, $fp)
	{
		// We need the file size. We can do that by getting the file position at EOF
		fseek($fp, 0, SEEK_END);
		$filesize = ftell($fp);
		rewind($fp);

		/**
		 * The ;type=i suffix forces Binary file transfer mode
		 *
		 * @see  https://curl.haxx.se/mail/archive-2008-05/0089.html
		 */
		$ch = $this->getCurlHandle($remoteFilename . ';type=i');
		curl_setopt($ch, CURLOPT_UPLOAD, 1);
		curl_setopt($ch, CURLOPT_INFILE, $fp);
		curl_setopt($ch, CURLOPT_INFILESIZE, $filesize);

		curl_exec($ch);

		$error_no = curl_errno($ch);
		$error    = curl_error($ch);

		curl_close($ch);
		fclose($fp);

		if ($error_no)
		{
			throw new RuntimeException($error, $error_no);
		}
	}

	/**
	 * Downloads a remote file to the provided file handle
	 *
	 * @param   string    $remoteFilename  Filename on the remote server
	 * @param   resource  $fp              File handle where the downloaded content will be written to
	 * @param   bool      $close           Optional. Should I close the file handle when I'm done? (Default: true)
	 *
	 * @return  void
	 *
	 * @throws  RuntimeException
	 */
	protected function downloadToHandle($remoteFilename, $fp, $close = true)
	{
		/**
		 * The ;type=i suffix forces Binary file transfer mode
		 *
		 * @see  https://curl.haxx.se/mail/archive-2008-05/0089.html
		 */
		$ch = $this->getCurlHandle($remoteFilename . ';type=i');

		curl_setopt($ch, CURLOPT_FILE, $fp);

		curl_exec($ch);

		$error_no = curl_errno($ch);
		$error    = curl_error($ch);

		curl_close($ch);

		if ($close)
		{
			fclose($fp);
		}

		if ($error_no)
		{
			throw new RuntimeException($error, $error_no);
		}
	}

	/**
	 * Downloads a remote file and returns it as a string
	 *
	 * @param   string  $remoteFilename  Filename on the remote server
	 *
	 * @return  string
	 *
	 * @throws  RuntimeException
	 */
	protected function downloadToString($remoteFilename)
	{
		/**
		 * The ;type=i suffix forces Binary file transfer mode
		 *
		 * @see  https://curl.haxx.se/mail/archive-2008-05/0089.html
		 */
		$ch = $this->getCurlHandle($remoteFilename . ';type=i');

		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_HEADER, false);

		$ret = curl_exec($ch);

		$error_no = curl_errno($ch);
		$error    = curl_error($ch);

		curl_close($ch);

		if ($error_no)
		{
			throw new RuntimeException($error, $error_no);
		}

		return $ret;
	}

	/**
	 * Executes arbitrary FTP commands
	 *
	 * @param   string[]     $commands    An array with the FTP commands to be executed
	 * @param   string|null  $remoteFile  The remote file / folder to use in the cURL URI when executing the commands
	 *
	 * @return  string  The output of the executed commands
	 *
	 */
	protected function executeServerCommands(array $commands, ?string $remoteFile = null): string
	{
		$remoteFile = $remoteFile ?? ($this->directory . '/');

		$ch = $this->getCurlHandle($remoteFile);

		curl_setopt($ch, CURLOPT_QUOTE, $commands);
		curl_setopt($ch, CURLOPT_HEADER, 1);
		curl_setopt($ch, CURLOPT_NOBODY, 1);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

		$listing = curl_exec($ch);
		$errNo   = curl_errno($ch);
		$error   = curl_error($ch);
		curl_close($ch);

		if ($errNo)
		{
			throw new RuntimeException($error, $errNo);
		}

		return $listing;
	}
}
components/com_akeeba/BackupEngine/Util/Transfer/Sftp.php000060400000035342152453623440017473 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util\Transfer;

defined('AKEEBAENGINE') || die();

use DirectoryIterator;
use Exception;
use RuntimeException;

/**
 * SFTP transfer object
 */
class Sftp implements TransferInterface, RemoteResourceInterface
{
	/**
	 * SFTP server's hostname or IP address
	 *
	 * @var  string
	 */
	private $host = 'localhost';

	/**
	 * SFTP server's port, default: 21
	 *
	 * @var  integer
	 */
	private $port = 22;

	/**
	 * Username used to authenticate to the SFTP server
	 *
	 * @var  string
	 */
	private $username = '';

	/**
	 * Password used to authenticate to the SFTP server
	 *
	 * @var  string
	 */
	private $password = '';

	/**
	 * SFTP initial directory
	 *
	 * @var  string
	 */
	private $directory = '/';

	/**
	 * The absolute filesystem path to a private key file used for authentication instead of a password.
	 *
	 * @var  string
	 */
	private $privateKey = '';

	/**
	 * The absolute filesystem path to a public key file used for authentication instead of a password.
	 *
	 * @var  string
	 */
	private $publicKey = '';

	/**
	 * The SSH2 connection handle
	 *
	 * @var  resource|null
	 */
	private $connection = null;

	/**
	 * The SFTP connection handle
	 *
	 * @var  resource|null
	 */
	private $sftpHandle = null;

	/**
	 * Public constructor
	 *
	 * @param   array  $options  Configuration options for the filesystem abstraction object
	 *
	 * @return  Sftp
	 *
	 * @throws  RuntimeException
	 */
	public function __construct(array $options)
	{
		if (isset($options['host']))
		{
			$this->host = $options['host'];
		}

		if (isset($options['port']))
		{
			$this->port = (int) $options['port'];
		}

		if (isset($options['username']))
		{
			$this->username = $options['username'];
		}

		if (isset($options['password']))
		{
			$this->password = $options['password'];
		}

		if (isset($options['directory']))
		{
			$this->directory = '/' . ltrim(trim($options['directory']), '/');
		}

		if (isset($options['privateKey']))
		{
			$this->privateKey = $options['privateKey'];
		}

		if (isset($options['publicKey']))
		{
			$this->publicKey = $options['publicKey'];
		}

		$this->connect();
	}

	/**
	 * Is this transfer method blocked by a server firewall?
	 *
	 * @param   array  $params  Any additional parameters you might need to pass
	 *
	 * @return  boolean  True if the firewall blocks connections to a known host
	 */
	public static function isFirewalled(array $params = [])
	{
		try
		{
			$connector = new static([
				'host'      => 'test.rebex.net',
				'port'      => 22,
				'username'  => 'demo',
				'password'  => 'password',
				'directory' => '',
			]);

			$data = $connector->read('readme.txt');

			if (empty($data))
			{
				return true;
			}
		}
		catch (Exception $e)
		{
			return true;
		}

		return false;
	}

	/**
	 * Save all parameters on serialization except the connection resource
	 *
	 * @return  array
	 */
	public function __sleep()
	{
		return ['host', 'port', 'username', 'password', 'directory', 'privateKey', 'publicKey'];
	}

	/**
	 * Reconnect to the server on unserialize
	 *
	 * @return  void
	 */
	public function __wakeup()
	{
		$this->connect();
	}

	public function __destruct()
	{
		if (is_resource($this->connection))
		{
			@ssh2_exec($this->connection, 'exit;');
			$this->connection = null;
			$this->sftpHandle = null;
		}
	}

	/**
	 * Connect to the FTP server
	 *
	 * @throws  RuntimeException
	 */
	public function connect()
	{
		// Try to connect to the SSH server
		if (!function_exists('ssh2_connect'))
		{
			throw new RuntimeException('Your web server does not have the SSH2 PHP module, therefore can not connect to SFTP servers.', 500);
		}

		$this->connection = ssh2_connect($this->host, $this->port);

		if ($this->connection === false)
		{
			$this->connection = null;

			throw new RuntimeException(sprintf('Cannot connect to SFTP server [host:port] = %s:%s', $this->host, $this->port), 500);
		}

		// Attempt to authenticate
		if (!empty($this->publicKey) && !empty($this->privateKey))
		{
			if (!@ssh2_auth_pubkey_file($this->connection, $this->username, $this->publicKey, $this->privateKey, $this->password))
			{
				$this->connection = null;

				throw new RuntimeException(sprintf('Cannot log in to SFTP server using key files [username:private_key_file:public_key_file:password] = %s:%s:%s:%s', $this->username, $this->privateKey, $this->publicKey, $this->password), 500);
			}
		}
		else
		{
			if (!@ssh2_auth_password($this->connection, $this->username, $this->password))
			{
				$this->connection = null;

				throw new RuntimeException(sprintf('Cannot log in to SFTP server [username:password] = %s:%s', $this->username, $this->password), 500);
			}
		}

		// Get an SFTP handle
		$this->sftpHandle = ssh2_sftp($this->connection);

		if ($this->sftpHandle === false)
		{
			throw new RuntimeException('Cannot start an SFTP session with the server', 500);
		}
	}

	/**
	 * Write the contents into the file
	 *
	 * @param   string  $fileName  The full path to the file
	 * @param   string  $contents  The contents to write to the file
	 *
	 * @return  boolean  True on success
	 */
	public function write($fileName, $contents)
	{
		$fp = @fopen("ssh2.sftp://{$this->sftpHandle}/$fileName", 'w');

		if ($fp === false)
		{
			return false;
		}

		$ret = @fwrite($fp, $contents);

		@fclose($fp);

		return $ret;
	}

	/**
	 * Uploads a local file to the remote storage
	 *
	 * @param   string  $localFilename   The full path to the local file
	 * @param   string  $remoteFilename  The full path to the remote file
	 * @param   bool    $useExceptions   Throw an exception instead of returning "false" on connection error.
	 *
	 * @return  boolean  True on success
	 */
	public function upload($localFilename, $remoteFilename, $useExceptions = true)
	{
		$fp = @fopen("ssh2.sftp://{$this->sftpHandle}/$remoteFilename", 'w');

		if ($fp === false)
		{
			if ($useExceptions)
			{
				throw new RuntimeException("Could not open remote SFTP file $remoteFilename for writing");
			}

			return false;
		}

		$localFp = @fopen($localFilename, 'r');

		if ($localFp === false)
		{
			fclose($fp);

			if ($useExceptions)
			{
				throw new RuntimeException("Could not open local file $localFilename for reading");
			}

			return false;
		}

		while (!feof($localFp))
		{
			$data = fread($localFp, 131072);
			$ret  = @fwrite($fp, $data);

			if ($ret < strlen($data))
			{
				fclose($fp);
				fclose($localFp);

				if ($useExceptions)
				{
					throw new RuntimeException("An error occurred while copying file $localFilename to $remoteFilename");
				}

				return false;
			}
		}

		@fclose($fp);
		@fclose($localFp);

		return true;
	}

	/**
	 * Read the contents of a remote file into a string
	 *
	 * @param   string  $fileName  The full path to the remote file
	 *
	 * @return  string  The contents of the remote file
	 */
	public function read($fileName)
	{
		$fp = @fopen("ssh2.sftp://{$this->sftpHandle}/$fileName", 'r');

		if ($fp === false)
		{
			throw new RuntimeException("Can not download remote file $fileName");
		}

		$ret = '';

		while (!feof($fp))
		{
			$ret .= fread($fp, 131072);
		}

		@fclose($fp);

		return $ret;
	}

	/**
	 * Download a remote file into a local file
	 *
	 * @param   string  $remoteFilename  The remote file path to download from
	 * @param   string  $localFilename   The local file path to download to
	 * @param   bool    $useExceptions   Throw an exception instead of returning "false" on connection error.
	 *
	 * @return  boolean  True on success
	 */
	public function download($remoteFilename, $localFilename, $useExceptions = true)
	{
		$fp = @fopen("ssh2.sftp://{$this->sftpHandle}/$remoteFilename", 'r');

		if ($fp === false)
		{
			if ($useExceptions)
			{
				throw new RuntimeException("Could not open remote SFTP file $remoteFilename for reading");
			}

			return false;
		}

		$localFp = @fopen($localFilename, 'w');

		if ($localFp === false)
		{
			fclose($fp);

			if ($useExceptions)
			{
				throw new RuntimeException("Could not open local file $localFilename for writing");
			}

			return false;
		}

		while (!feof($fp))
		{
			$chunk = fread($fp, 131072);

			if ($chunk === false)
			{
				fclose($fp);
				fclose($localFp);

				if ($useExceptions)
				{
					throw new RuntimeException("An error occurred while copying file $remoteFilename to $localFilename");
				}

				return false;
			}

			fwrite($localFp, $chunk);
		}

		@fclose($fp);
		@fclose($localFp);

		return true;
	}

	/**
	 * Delete a file (remove it from the disk)
	 *
	 * @param   string  $fileName  The full path to the file
	 *
	 * @return  boolean  True on success
	 */
	public function delete($fileName)
	{
		try
		{
			$ret = @ssh2_sftp_unlink($this->sftpHandle, $fileName);
		}
		catch (Exception $e)
		{
			$ret = false;
		}

		return $ret;
	}

	/**
	 * Create a copy of the file. Actually, we have to read it in memory and upload it again.
	 *
	 * @param   string  $from  The full path of the file to copy from
	 * @param   string  $to    The full path of the file that will hold the copy
	 *
	 * @return  boolean  True on success
	 */
	public function copy($from, $to)
	{
		$contents = @file_get_contents($from);

		return $this->write($to, $contents);
	}

	/**
	 * Move or rename a file. Actually, we have to read it, upload it again and then delete the original.
	 *
	 * @param   string  $from  The full path of the file to move
	 * @param   string  $to    The full path of the target file
	 *
	 * @return  boolean  True on success
	 */
	public function move($from, $to)
	{
		$ret = $this->copy($from, $to);

		if ($ret)
		{
			$ret = $this->delete($from);
		}

		return $ret;
	}

	/**
	 * Change the permissions of a file
	 *
	 * @param   string   $fileName     The full path of the file whose permissions will change
	 * @param   integer  $permissions  The new permissions, e.g. 0644 (remember the leading zero in octal numbers!)
	 *
	 * @return  boolean  True on success
	 */
	public function chmod($fileName, $permissions)
	{
		// Prefer the SFTP way, if available
		if (function_exists('ssh2_sftp_chmod'))
		{
			return @ssh2_sftp_chmod($this->sftpHandle, $fileName, $permissions);
		}
		// Otherwise fall back to the (likely to fail) raw command mode
		else
		{
			$cmd = 'chmod ' . decoct($permissions) . ' ' . escapeshellarg($fileName);

			return @ssh2_exec($this->connection, $cmd);
		}
	}

	/**
	 * Create a directory if it doesn't exist. The operation is implicitly recursive, i.e. it will create all
	 * intermediate directories if they do not already exist.
	 *
	 * @param   string   $dirName      The full path of the directory to create
	 * @param   integer  $permissions  The permissions of the created directory
	 *
	 * @return  boolean  True on success
	 */
	public function mkdir($dirName, $permissions = 0755)
	{
		$targetDir = rtrim($dirName, '/');

		$ret = @ssh2_sftp_mkdir($this->sftpHandle, $targetDir, $permissions, true);

		return $ret;
	}

	/**
	 * Checks if the given directory exists
	 *
	 * @param   string  $path  The full path of the remote directory to check
	 *
	 * @return  boolean  True if the directory exists
	 */
	public function isDir($path)
	{
		return @ssh2_sftp_stat($this->sftpHandle, $path);
	}

	/**
	 * Get the current working directory
	 *
	 * @return  string
	 */
	public function cwd()
	{
		return ssh2_sftp_realpath($this->sftpHandle, ".");
	}

	/**
	 * Returns the absolute remote path from a path relative to the initial directory configured when creating the
	 * transfer object.
	 *
	 * @param   string  $fileName  The relative path of a file or directory
	 *
	 * @return  string  The absolute path for use by the transfer object
	 */
	public function getPath($fileName)
	{
		$fileName = str_replace('\\', '/', $fileName);
		$fileName = rtrim($this->directory, '/') . '/' . $fileName;

		return $fileName;
	}

	/**
	 * Lists the subdirectories inside an SFTP directory
	 *
	 * @param   null|string  $dir  The directory to scan. Skip to use the current directory.
	 *
	 * @return  array|bool  A list of folders, or false if we could not get a listing
	 *
	 * @throws  RuntimeException  When the server is incompatible with our SFTP folder scanner
	 */
	public function listFolders($dir = null)
	{
		if (empty($dir))
		{
			$dir = $this->directory;
		}

		// Get a raw directory listing (hoping it's a UNIX server!)
		$list = [];
		$dir  = ltrim($dir, '/');

		try
		{
			$di = new DirectoryIterator("ssh2.sftp://" . $this->sftpHandle . "/$dir");
		}
		catch (Exception $e)
		{
			throw new RuntimeException(sprintf('Cannot change to SFTP directory "%s" – make sure the folder exists and that you have adequate permissions to it', $dir), 500);
		}

		if (!$di->valid())
		{
			throw new RuntimeException(sprintf('Cannot change to SFTP directory "%s" – make sure the folder exists and that you have adequate permissions to it', $dir), 500);
		}

		/** @var DirectoryIterator $entry */
		foreach ($di as $entry)
		{
			if ($entry->isDot())
			{
				continue;
			}

			if (!$entry->isDir())
			{
				continue;
			}

			$list[] = $entry->getFilename();
		}

		unset($di);

		if (!empty($list))
		{
			asort($list);
		}

		return $list;
	}

	/**
	 * Return a string with the appropriate stream wrapper protocol for $path. You can use the result with all PHP
	 * functions / classes which accept file paths such as DirectoryIterator, file_get_contents, file_put_contents,
	 * fopen etc.
	 *
	 * @param   string  $path
	 *
	 * @return  string
	 */
	public function getWrapperStringFor($path)
	{
		return "ssh2.sftp://{$this->sftpHandle}{$path}";
	}

	/**
	 * Return the raw server listing for the requested folder.
	 *
	 * @param   string  $folder  The path name to list
	 *
	 * @return  string
	 */
	public function getRawList($folder)
	{
		// First try the command for Linxu servers
		$res = $this->ssh2cmd('ls -l ' . escapeshellarg($folder));

		// If an error occurred let's try the command for Windows servers
		if (empty($res))
		{
			$res = $this->ssh2cmd('CMD /C ' . escapeshellarg($folder));
		}

		return $res;
	}

	private function ssh2cmd($command)
	{
		$stream = ssh2_exec($this->connection, $command);
		stream_set_blocking($stream, true);
		$res = @stream_get_contents($stream);
		@fclose($stream);

		return $res;
	}
}
components/com_akeeba/BackupEngine/Util/Transfer/SftpCurl.php000060400000046600152453623440020320 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util\Transfer;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Postproc\ProxyAware;
use RuntimeException;

/**
 * SFTP transfer object, using cURL as the transport backend
 */
class SftpCurl extends Sftp implements TransferInterface
{
	use ProxyAware;

	/**
	 * SFTP server's hostname or IP address
	 *
	 * @var  string
	 */
	private $host = 'localhost';

	/**
	 * SFTP server's port, default: 21
	 *
	 * @var  integer
	 */
	private $port = 22;

	/**
	 * Username used to authenticate to the SFTP server
	 *
	 * @var  string
	 */
	private $username = '';

	/**
	 * Password used to authenticate to the SFTP server
	 *
	 * @var  string
	 */
	private $password = '';

	/**
	 * SFTP initial directory
	 *
	 * @var  string
	 */
	private $directory = '/';

	/**
	 * The absolute filesystem path to a private key file used for authentication instead of a password.
	 *
	 * @var  string
	 */
	private $privateKey = '';

	/**
	 * The absolute filesystem path to a public key file used for authentication instead of a password.
	 *
	 * @var  string
	 */
	private $publicKey = '';

	/**
	 * Timeout for connecting to the SFTP server, default: 10 minutes
	 *
	 * @var  integer
	 */
	private $timeout = 600;

	/**
	 * Should we enable verbose output to STDOUT? Useful for debugging.
	 *
	 * @var   bool
	 */
	private $verbose = false;

	/**
	 * Should I enabled the passive IP workaround for cURL?
	 *
	 * @var   bool
	 */
	private $skipPassiveIP = false;

	/**
	 * Public constructor
	 *
	 * @param   array  $options  Configuration options
	 *
	 * @return  self
	 *
	 * @throws  RuntimeException
	 */
	public function __construct(array $options)
	{
		if (isset($options['host']))
		{
			$this->host = $options['host'];
		}

		if (isset($options['port']))
		{
			$this->port = (int) $options['port'];
		}

		if (isset($options['username']))
		{
			$this->username = $options['username'];
		}

		if (isset($options['password']))
		{
			$this->password = $options['password'];
		}

		if (isset($options['directory']))
		{
			$this->directory = '/' . ltrim(trim($options['directory']), '/');
		}

		if (isset($options['privateKey']))
		{
			$this->privateKey = $options['privateKey'];
		}

		if (isset($options['publicKey']))
		{
			$this->publicKey = $options['publicKey'];
		}

		if (isset($options['timeout']))
		{
			$this->timeout = max(1, (int) $options['timeout']);
		}

		if (isset($options['passive_fix']))
		{
			$this->skipPassiveIP = $options['passive_fix'] ? true : false;
		}

		if (isset($options['verbose']))
		{
			$this->verbose = $options['verbose'] ? true : false;
		}
	}

	/**
	 * Save all parameters on serialization except the connection resource
	 *
	 * @return  array
	 */
	public function __sleep()
	{
		return [
			'host',
			'port',
			'username',
			'password',
			'directory',
			'privateKey',
			'publicKey',
			'timeout',
			'skipPassiveIP',
			'verbose',
		];
	}

	/**
	 * Test the connection to the SFTP server and whether the initial directory is correct. This is done by attempting to
	 * list the contents of the initial directory. The listing is not parsed (we don't really care!) and we do NOT check
	 * if we can upload files to that remote folder.
	 *
	 * @throws  RuntimeException
	 */
	public function connect()
	{
		$ch = $this->getCurlHandle($this->directory . '/');
		curl_setopt($ch, CURLOPT_HEADER, 1);
		curl_setopt($ch, CURLOPT_NOBODY, 1);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

		$listing = curl_exec($ch);
		$errNo   = curl_errno($ch);
		$error   = curl_error($ch);
		curl_close($ch);

		if ($errNo)
		{
			throw new RuntimeException("cURL Error $errNo connecting to remote SFTP server: $error", 500);
		}
	}

	/**
	 * Write the contents into the file
	 *
	 * @param   string  $fileName  The full path to the file
	 * @param   string  $contents  The contents to write to the file
	 *
	 * @return  boolean  True on success
	 */
	public function write($fileName, $contents)
	{
		// Make sure the buffer:// wrapper is loaded
		class_exists('\\Akeeba\\Engine\\Util\\Buffer', true);

		$handle = fopen('buffer://akeeba_engine_transfer_ftp_curl', 'r+');
		fwrite($handle, $contents);

		// Note: don't manually close the file pointer, it's closed automatically by uploadFromHandle
		try
		{
			$this->uploadFromHandle($fileName, $handle);
		}
		catch (RuntimeException $e)
		{
			return false;
		}

		return true;
	}

	/**
	 * Uploads a local file to the remote storage
	 *
	 * @param   string  $localFilename   The full path to the local file
	 * @param   string  $remoteFilename  The full path to the remote file
	 * @param   bool    $useExceptions   Throw an exception instead of returning "false" on connection error.
	 *
	 * @return  boolean  True on success
	 */
	public function upload($localFilename, $remoteFilename, $useExceptions = true)
	{
		$fp = @fopen($localFilename, 'r');

		if ($fp === false)
		{
			throw new RuntimeException("Unreadable local file $localFilename");
		}

		// Note: don't manually close the file pointer, it's closed automatically by uploadFromHandle
		try
		{
			$this->uploadFromHandle($remoteFilename, $fp);
		}
		catch (RuntimeException $e)
		{
			if ($useExceptions)
			{
				throw $e;
			}

			return false;
		}

		return true;
	}

	/**
	 * Read the contents of a remote file into a string
	 *
	 * @param   string  $fileName  The full path to the remote file
	 *
	 * @return  string  The contents of the remote file
	 */
	public function read($fileName)
	{
		try
		{
			return $this->downloadToString($fileName);
		}
		catch (RuntimeException $e)
		{
			throw new RuntimeException("Can not download remote file $fileName", 500, $e);
		}
	}

	/**
	 * Download a remote file into a local file
	 *
	 * @param   string  $remoteFilename  The remote file path to download from
	 * @param   string  $localFilename   The local file path to download to
	 * @param   bool    $useExceptions   Throw an exception instead of returning "false" on connection error.
	 *
	 * @return  boolean  True on success
	 */
	public function download($remoteFilename, $localFilename, $useExceptions = true)
	{
		$fp = @fopen($localFilename, 'w');

		if ($fp === false)
		{
			if ($useExceptions)
			{
				throw new RuntimeException(sprintf('Download from FTP failed. Can not open local file %s for writing.', $localFilename));
			}

			return false;
		}

		// Note: don't manually close the file pointer, it's closed automatically by downloadToHandle
		try
		{
			$this->downloadToHandle($remoteFilename, $fp);
		}
		catch (RuntimeException $e)
		{
			if ($useExceptions)
			{
				throw $e;
			}

			return false;
		}

		return true;
	}

	/**
	 * Delete a file (remove it from the disk)
	 *
	 * @param   string  $fileName  The full path to the file
	 *
	 * @return  boolean  True on success
	 */
	public function delete($fileName)
	{
		$commands = [
			'rm ' . $this->getPath($fileName),
		];

		try
		{
			$this->executeServerCommands($commands);
		}
		catch (RuntimeException $e)
		{
			return false;
		}

		return true;
	}

	/**
	 * Create a copy of the file. Actually, we have to read it in memory and upload it again.
	 *
	 * @param   string  $from  The full path of the file to copy from
	 * @param   string  $to    The full path of the file that will hold the copy
	 *
	 * @return  boolean  True on success
	 */
	public function copy($from, $to)
	{
		// Make sure the buffer:// wrapper is loaded
		class_exists('\\Akeeba\\Engine\\Util\\Buffer', true);

		$handle = fopen('buffer://akeeba_engine_transfer_ftp', 'r+');

		try
		{
			$this->downloadToHandle($from, $handle, false);
			$this->uploadFromHandle($to, $handle);
		}
		catch (RuntimeException $e)
		{
			return false;
		}

		return true;
	}

	/**
	 * Move or rename a file
	 *
	 * @param   string  $from  The full path of the file to move
	 * @param   string  $to    The full path of the target file
	 *
	 * @return  boolean  True on success
	 */
	public function move($from, $to)
	{
		$from = $this->getPath($from);
		$to   = $this->getPath($to);

		$commands = [
			'rename ' . $from . ' ' . $to,
		];

		try
		{
			$this->executeServerCommands($commands);
		}
		catch (RuntimeException $e)
		{
			return false;
		}

		return true;
	}

	/**
	 * Change the permissions of a file
	 *
	 * @param   string   $fileName     The full path of the file whose permissions will change
	 * @param   integer  $permissions  The new permissions, e.g. 0644 (remember the leading zero in octal numbers!)
	 *
	 * @return  boolean  True on success
	 */
	public function chmod($fileName, $permissions)
	{
		// Make sure permissions are in an octal string representation
		if (!is_string($permissions))
		{
			$permissions = decoct($permissions);
		}

		$commands = [
			'chmod ' . $permissions . ' ' . $this->getPath($fileName),
		];

		try
		{
			$this->executeServerCommands($commands);
		}
		catch (RuntimeException $e)
		{
			return false;
		}

		return true;
	}

	/**
	 * Create a directory if it doesn't exist. The operation is implicitly recursive, i.e. it will create all
	 * intermediate directories if they do not already exist.
	 *
	 * @param   string   $dirName      The full path of the directory to create
	 * @param   integer  $permissions  The permissions of the created directory
	 *
	 * @return  boolean  True on success
	 */
	public function mkdir($dirName, $permissions = 0755)
	{
		$targetDir = rtrim($dirName, '/');

		$directories = explode('/', $targetDir);

		$remoteDir = '';

		foreach ($directories as $dir)
		{
			if (!$dir)
			{
				continue;
			}

			$remoteDir .= '/' . $dir;

			// Continue if the folder already exists. Otherwise I'll get a an error even if everything is fine
			if ($this->isDir($remoteDir))
			{
				continue;
			}

			$commands = [
				'mkdir ' . $remoteDir,
			];

			try
			{
				$this->executeServerCommands($commands);
			}
			catch (RuntimeException $e)
			{
				return false;
			}
		}

		$this->chmod($dirName, $permissions);

		return true;
	}

	/**
	 * Checks if the given directory exists
	 *
	 * @param   string  $path  The full path of the remote directory to check
	 *
	 * @return  boolean  True if the directory exists
	 */
	public function isDir($path)
	{
		$ch = $this->getCurlHandle($path . '/');
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

		$list = curl_exec($ch);

		$errNo = curl_errno($ch);
		curl_close($ch);

		if ($errNo)
		{
			return false;
		}

		return true;
	}

	/**
	 * Get the current working directory. NOT IMPLEMENTED.
	 *
	 * @return  string
	 */
	public function cwd()
	{
		return '';
	}

	/**
	 * Returns the absolute remote path from a path relative to the initial directory configured when creating the
	 * transfer object.
	 *
	 * @param   string  $fileName  The relative path of a file or directory
	 *
	 * @return  string  The absolute path for use by the transfer object
	 */
	public function getPath($fileName)
	{
		$fileName = str_replace('\\', '/', $fileName);

		if (strpos($fileName, $this->directory) === 0)
		{
			return $fileName;
		}

		$fileName = trim($fileName, '/');
		$fileName = rtrim($this->directory, '/') . '/' . $fileName;

		return $fileName;
	}

	/**
	 * Lists the subdirectories inside an SFTP directory
	 *
	 * @param   null|string  $dir  The directory to scan. Skip to use the current directory.
	 *
	 * @return  array|bool  A list of folders, or false if we could not get a listing
	 *
	 * @throws  RuntimeException  When the server is incompatible with our SFTP folder scanner
	 */
	public function listFolders($dir = null)
	{
		if (empty($dir))
		{
			$dir = $this->directory;
		}

		$dir = rtrim($dir, '/');

		$ch = $this->getCurlHandle($dir . '/');
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

		$list = curl_exec($ch);

		$errNo = curl_errno($ch);
		$error = curl_error($ch);
		curl_close($ch);

		if ($errNo)
		{
			throw new RuntimeException(sprintf("cURL Error $errNo ($error) while listing contents of directory \"%s\" – make sure the folder exists and that you have adequate permissions to it", $dir), 500);
		}

		if (empty($list))
		{
			throw new RuntimeException("Sorry, your SFTP server doesn't support our SFTP directory browser.");
		}

		$folders = [];

		// Convert the directory listing into an array of lines without *NIX/Windows/Mac line ending characters
		$list = explode("\n", $list);
		$list = array_map('rtrim', $list);

		foreach ($list as $v)
		{
			$vInfo = preg_split("/[\s]+/", $v, 9);

			if ($vInfo[0] !== "total")
			{
				$perms = $vInfo[0];

				if (substr($perms, 0, 1) == 'd')
				{
					$folders[] = $vInfo[8];
				}
			}
		}

		asort($folders);

		return $folders;
	}

	/**
	 * Is the verbose debug option set?
	 *
	 * @return  boolean
	 */
	public function isVerbose()
	{
		return $this->verbose;
	}

	/**
	 * Set the verbose debug option
	 *
	 * @param   boolean  $verbose
	 *
	 * @return  void
	 */
	public function setVerbose($verbose)
	{
		$this->verbose = $verbose;
	}

	/**
	 * Returns a cURL resource handler for the remote SFTP server
	 *
	 * @param   string  $remoteFile  Optional. The remote file / folder on the SFTP server you'll be manipulating with cURL.
	 *
	 * @return  resource
	 */
	protected function getCurlHandle($remoteFile = '')
	{
		// Remember, the username has to be URL encoded as it's part of a URI!
		$authentication = urlencode($this->username);

		// We will only use username and password authentication if there are no certificates configured.
		if (empty($this->publicKey))
		{
			// Remember, both the username and password have to be URL encoded as they're part of a URI!
			$password       = urlencode($this->password);
			$authentication .= ':' . $password;
		}

		$ftpUri = 'sftp://' . $authentication . '@' . $this->host;

		if (!empty($this->port))
		{
			$ftpUri .= ':' . (int) $this->port;
		}

		// Relative path? Append the initial directory.
		if (substr($remoteFile, 0, 1) != '/')
		{
			$ftpUri .= $this->directory;
		}

		// Add a remote file if necessary. The filename must be URL encoded since we're creating a URI.
		if (!empty($remoteFile))
		{
			$suffix = '';

			$dirname = dirname($remoteFile);

			// Windows messing up dirname('/'). KILL ME.
			if ($dirname == '\\')
			{
				$dirname = '';
			}

			$dirname  = trim($dirname, '/');
			$basename = basename($remoteFile);

			if ((substr($remoteFile, -1) == '/') && !empty($basename))
			{
				$suffix = '/' . $suffix;
			}

			$ftpUri .= '/' . $dirname . (empty($dirname) ? '' : '/') . urlencode($basename) . $suffix;
		}

		$ch = curl_init();

		$this->applyProxySettingsToCurl($ch);

		curl_setopt($ch, CURLOPT_URL, $ftpUri);
		curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);

		// Do I have to use certificate authentication?
		if (!empty($this->publicKey))
		{
			// We always need to provide a public key file
			curl_setopt($ch, CURLOPT_SSH_PUBLIC_KEYFILE, $this->publicKey);

			// Since SSH certificates are self-signed we cannot have cURL verify their signatures against a CA.
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
			curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
			curl_setopt($ch, CURLOPT_SSL_VERIFYSTATUS, 0);

			/**
			 * This is optional because newer versions of cURL can extract the private key file from a combined
			 * certificate file.
			 */
			if (!empty($this->privateKey))
			{
				curl_setopt($ch, CURLOPT_SSH_PRIVATE_KEYFILE, $this->privateKey);
			}

			/**
			 * In case of encrypted (a.k.a. password protected) private key files you need to also specify the
			 * certificate decryption key in the password field. However, if libcurl is compiled against the GnuTLS
			 * library (instead of OpenSSL) this will NOT work because of bugs / missing features in GnuTLS. It's the
			 * same problem you get when libssh is compiled against GnuTLS. The solution to that is having an
			 * unencrypted private key file.
			 */
			if (!empty($this->password))
			{
				curl_setopt($ch, CURLOPT_KEYPASSWD, $this->password);
			}
		}

		// Should I enable verbose output? Useful for debugging.
		if ($this->verbose)
		{
			curl_setopt($ch, CURLOPT_VERBOSE, 1);
		}

		// Automatically create missing directories
		curl_setopt($ch, CURLOPT_FTP_CREATE_MISSING_DIRS, 1);

		return $ch;
	}

	/**
	 * Uploads a file using file contents provided through a file handle
	 *
	 * @param   string    $remoteFilename
	 * @param   resource  $fp
	 *
	 * @return  void
	 *
	 * @throws  RuntimeException
	 */
	protected function uploadFromHandle($remoteFilename, $fp)
	{
		// We need the file size. We can do that by getting the file position at EOF
		fseek($fp, 0, SEEK_END);
		$filesize = ftell($fp);
		rewind($fp);

		$ch = $this->getCurlHandle($remoteFilename);
		curl_setopt($ch, CURLOPT_UPLOAD, 1);
		curl_setopt($ch, CURLOPT_INFILE, $fp);
		curl_setopt($ch, CURLOPT_INFILESIZE, $filesize);

		curl_exec($ch);

		$error_no = curl_errno($ch);
		$error    = curl_error($ch);

		curl_close($ch);
		fclose($fp);

		if ($error_no)
		{
			throw new RuntimeException($error, $error_no);
		}
	}

	/**
	 * Downloads a remote file to the provided file handle
	 *
	 * @param   string    $remoteFilename  Filename on the remote server
	 * @param   resource  $fp              File handle where the downloaded content will be written to
	 * @param   bool      $close           Optional. Should I close the file handle when I'm done? (Default: true)
	 *
	 * @return  void
	 *
	 * @throws  RuntimeException
	 */
	protected function downloadToHandle($remoteFilename, $fp, $close = true)
	{
		$ch = $this->getCurlHandle($remoteFilename);

		curl_setopt($ch, CURLOPT_FILE, $fp);

		curl_exec($ch);

		$error_no = curl_errno($ch);
		$error    = curl_error($ch);

		curl_close($ch);

		if ($close)
		{
			fclose($fp);
		}

		if ($error_no)
		{
			throw new RuntimeException($error, $error_no);
		}
	}

	/**
	 * Downloads a remote file and returns it as a string
	 *
	 * @param   string  $remoteFilename  Filename on the remote server
	 *
	 * @return  string
	 *
	 * @throws  RuntimeException
	 */
	protected function downloadToString($remoteFilename)
	{
		$ch = $this->getCurlHandle($remoteFilename);

		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_HEADER, false);

		$ret = curl_exec($ch);

		$error_no = curl_errno($ch);
		$error    = curl_error($ch);

		curl_close($ch);

		if ($error_no)
		{
			throw new RuntimeException($error, $error_no);
		}

		return $ret;
	}

	/**
	 * Executes arbitrary SFTP commands
	 *
	 * @param   array  $commands  An array with the SFTP commands to be executed
	 *
	 * @return  string  The output of the executed commands
	 *
	 * @throws  RuntimeException
	 */
	protected function executeServerCommands($commands)
	{
		$ch = $this->getCurlHandle($this->directory . '/');

		curl_setopt($ch, CURLOPT_QUOTE, $commands);
		curl_setopt($ch, CURLOPT_HEADER, 1);
		curl_setopt($ch, CURLOPT_NOBODY, 1);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

		$listing = curl_exec($ch);
		$errNo   = curl_errno($ch);
		$error   = curl_error($ch);
		curl_close($ch);

		if ($errNo)
		{
			throw new RuntimeException($error, $errNo);
		}

		return $listing;
	}
}
components/com_akeeba/BackupEngine/Util/Utf8.php000060400000005773152453623440015626 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util;

defined('AKEEBAENGINE') || die();

/**
 * Replacement for the utf8_encode and utf8_decode functions on PHP 8.2 and later.
 *
 * @see https://wiki.php.net/rfc/remove_utf8_decode_and_utf8_encode
 */
class Utf8
{
	public static function utf8_encode($s)
	{
		if (version_compare(PHP_VERSION, '8.1.999', 'le'))
		{
			return utf8_encode($s);
		}

		if (function_exists('mb_convert_encoding'))
		{
			return mb_convert_encoding($s, 'UTF-8', 'ISO-8859-1');
		}

		if (class_exists('UConverter'))
		{
			return UConverter::transcode($s, 'UTF8', 'ISO-8859-1');
		}

		if (function_exists('iconv'))
		{
			return iconv('ISO-8859-1', 'UTF-8', $s);
		}

		/**
		 * Fallback to the pure PHP implementation from Symfony Polyfill for PHP 7.2
		 *
		 * @see https://github.com/symfony/polyfill-php72/blob/v1.26.0/Php72.php
		 */
		$s .= $s;
		$len = \strlen($s);

		for ($i = $len >> 1, $j = 0; $i < $len; ++$i, ++$j) {
			switch (true) {
				case $s[$i] < "\x80": $s[$j] = $s[$i]; break;
				case $s[$i] < "\xC0": $s[$j] = "\xC2"; $s[++$j] = $s[$i]; break;
				default: $s[$j] = "\xC3"; $s[++$j] = \chr(\ord($s[$i]) - 64); break;
			}
		}

		return substr($s, 0, $j);
	}

	public static function utf8_decode($s)
	{
		if (version_compare(PHP_VERSION, '8.1.999', 'le'))
		{
			return utf8_decode($s);
		}

		if (function_exists('mb_convert_encoding'))
		{
			return mb_convert_encoding($s, 'ISO-8859-1', 'UTF-8');
		}

		if (class_exists('UConverter'))
		{
			return UConverter::transcode($s, 'ISO-8859-1', 'UTF8');
		}

		if (function_exists('iconv'))
		{
			return iconv('UTF-8', 'ISO-8859-1', $s);
		}

		/**
		 * Fallback to the pure PHP implementation from Symfony Polyfill for PHP 7.2
		 *
		 * @see https://github.com/symfony/polyfill-php72/blob/v1.26.0/Php72.php
		 */
		$s = (string) $s;
		$len = \strlen($s);

		for ($i = 0, $j = 0; $i < $len; ++$i, ++$j) {
			switch ($s[$i] & "\xF0") {
				case "\xC0":
				case "\xD0":
					$c = (\ord($s[$i] & "\x1F") << 6) | \ord($s[++$i] & "\x3F");
					$s[$j] = $c < 256 ? \chr($c) : '?';
					break;

				case "\xF0":
					++$i;
				// no break

				case "\xE0":
					$s[$j] = '?';
					$i += 2;
					break;

				default:
					$s[$j] = $s[$i];
			}
		}

		return substr($s, 0, $j);
	}
}components/com_akeeba/BackupEngine/Util/Complexify.php000060400000036763152453623440017122 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Platform;
use RuntimeException;

/**
 * PHP port of http://github.com/danpalmer/jquery.complexify.js
 * Retrieved from https://github.com/mcrumley/php-complexify/blob/master/src/Complexify/Complexify.php
 * Error reporting is based on https://github.com/kislyuk/node-complexify
 */
class Complexify
{
	private static $MIN_COMPLEXITY = 66;

	private static $MAX_COMPLEXITY = 120; //  25 chars, all charsets

	private static $CHARSETS = [
		// Commonly Used
		////////////////////
		[0x0020, 0x0020], // Space
		[0x0030, 0x0039], // Numbers
		[0x0041, 0x005A], // Uppercase
		[0x0061, 0x007A], // Lowercase
		[0x0021, 0x002F], // Punctuation
		[0x003A, 0x0040], // Punctuation
		[0x005B, 0x0060], // Punctuation
		[0x007B, 0x007E], // Punctuation
		// Everything Else
		////////////////////
		[0x0080, 0x00FF], // Latin-1 Supplement
		[0x0100, 0x017F], // Latin Extended-A
		[0x0180, 0x024F], // Latin Extended-B
		[0x0250, 0x02AF], // IPA Extensions
		[0x02B0, 0x02FF], // Spacing Modifier Letters
		[0x0300, 0x036F], // Combining Diacritical Marks
		[0x0370, 0x03FF], // Greek
		[0x0400, 0x04FF], // Cyrillic
		[0x0530, 0x058F], // Armenian
		[0x0590, 0x05FF], // Hebrew
		[0x0600, 0x06FF], // Arabic
		[0x0700, 0x074F], // Syriac
		[0x0780, 0x07BF], // Thaana
		[0x0900, 0x097F], // Devanagari
		[0x0980, 0x09FF], // Bengali
		[0x0A00, 0x0A7F], // Gurmukhi
		[0x0A80, 0x0AFF], // Gujarati
		[0x0B00, 0x0B7F], // Oriya
		[0x0B80, 0x0BFF], // Tamil
		[0x0C00, 0x0C7F], // Telugu
		[0x0C80, 0x0CFF], // Kannada
		[0x0D00, 0x0D7F], // Malayalam
		[0x0D80, 0x0DFF], // Sinhala
		[0x0E00, 0x0E7F], // Thai
		[0x0E80, 0x0EFF], // Lao
		[0x0F00, 0x0FFF], // Tibetan
		[0x1000, 0x109F], // Myanmar
		[0x10A0, 0x10FF], // Georgian
		[0x1100, 0x11FF], // Hangul Jamo
		[0x1200, 0x137F], // Ethiopic
		[0x13A0, 0x13FF], // Cherokee
		[0x1400, 0x167F], // Unified Canadian Aboriginal Syllabics
		[0x1680, 0x169F], // Ogham
		[0x16A0, 0x16FF], // Runic
		[0x1780, 0x17FF], // Khmer
		[0x1800, 0x18AF], // Mongolian
		[0x1E00, 0x1EFF], // Latin Extended Additional
		[0x1F00, 0x1FFF], // Greek Extended
		[0x2000, 0x206F], // General Punctuation
		[0x2070, 0x209F], // Superscripts and Subscripts
		[0x20A0, 0x20CF], // Currency Symbols
		[0x20D0, 0x20FF], // Combining Marks for Symbols
		[0x2100, 0x214F], // Letterlike Symbols
		[0x2150, 0x218F], // Number Forms
		[0x2190, 0x21FF], // Arrows
		[0x2200, 0x22FF], // Mathematical Operators
		[0x2300, 0x23FF], // Miscellaneous Technical
		[0x2400, 0x243F], // Control Pictures
		[0x2440, 0x245F], // Optical Character Recognition
		[0x2460, 0x24FF], // Enclosed Alphanumerics
		[0x2500, 0x257F], // Box Drawing
		[0x2580, 0x259F], // Block Elements
		[0x25A0, 0x25FF], // Geometric Shapes
		[0x2600, 0x26FF], // Miscellaneous Symbols
		[0x2700, 0x27BF], // Dingbats
		[0x2800, 0x28FF], // Braille Patterns
		[0x2E80, 0x2EFF], // CJK Radicals Supplement
		[0x2F00, 0x2FDF], // Kangxi Radicals
		[0x2FF0, 0x2FFF], // Ideographic Description Characters
		[0x3000, 0x303F], // CJK Symbols and Punctuation
		[0x3040, 0x309F], // Hiragana
		[0x30A0, 0x30FF], // Katakana
		[0x3100, 0x312F], // Bopomofo
		[0x3130, 0x318F], // Hangul Compatibility Jamo
		[0x3190, 0x319F], // Kanbun
		[0x31A0, 0x31BF], // Bopomofo Extended
		[0x3200, 0x32FF], // Enclosed CJK Letters and Months
		[0x3300, 0x33FF], // CJK Compatibility
		[0x3400, 0x4DB5], // CJK Unified Ideographs Extension A
		[0x4E00, 0x9FFF], // CJK Unified Ideographs
		[0xA000, 0xA48F], // Yi Syllables
		[0xA490, 0xA4CF], // Yi Radicals
		[0xAC00, 0xD7A3], // Hangul Syllables
		[0xD800, 0xDB7F], // High Surrogates
		[0xDB80, 0xDBFF], // High Private Use Surrogates
		[0xDC00, 0xDFFF], // Low Surrogates
		[0xE000, 0xF8FF], // Private Use
		[0xF900, 0xFAFF], // CJK Compatibility Ideographs
		[0xFB00, 0xFB4F], // Alphabetic Presentation Forms
		[0xFB50, 0xFDFF], // Arabic Presentation Forms-A
		[0xFE20, 0xFE2F], // Combining Half Marks
		[0xFE30, 0xFE4F], // CJK Compatibility Forms
		[0xFE50, 0xFE6F], // Small Form Variants
		[0xFE70, 0xFEFE], // Arabic Presentation Forms-B
		[0xFEFF, 0xFEFF], // Specials
		[0xFF00, 0xFFEF], // Halfwidth and Fullwidth Forms
		[0xFFF0, 0xFFFD]  // Specials
	];

	// Generated from 500 worst passwords and 370 Banned Twitter lists found at
	// @source http://www.skullsecurity.org/wiki/index.php/Passwords
	private static $BANLIST = [
		'0', '1111', '1212', '1234', '1313', '2000', '2112', '2222',
		'3333', '4128', '4321', '4444', '5150', '5555', '6666', '6969', '7777', 'aaaa',
		'alex', 'asdf', 'baby', 'bear', 'beer', 'bill', 'blue', 'cock', 'cool', 'cunt',
		'dave', 'dick', 'eric', 'fire', 'fish', 'ford', 'fred', 'fuck', 'girl', 'golf',
		'jack', 'jake', 'john', 'king', 'love', 'mark', 'matt', 'mike', 'mine', 'pass',
		'paul', 'porn', 'rock', 'sexy', 'shit', 'slut', 'star', 'test', 'time', 'tits',
		'wolf', 'xxxx', '11111', '12345', 'angel', 'apple', 'beach', 'billy', 'bitch',
		'black', 'boobs', 'booty', 'brian', 'bubba', 'buddy', 'chevy', 'chris', 'cream',
		'david', 'dirty', 'eagle', 'enjoy', 'enter', 'frank', 'girls', 'great', 'green',
		'happy', 'hello', 'horny', 'house', 'james', 'japan', 'jason', 'juice', 'kelly',
		'kevin', 'kitty', 'lover', 'lucky', 'magic', 'money', 'movie', 'music', 'naked',
		'ou812', 'paris', 'penis', 'peter', 'porno', 'power', 'pussy', 'qwert', 'sammy',
		'scott', 'smith', 'stars', 'steve', 'super', 'teens', 'tiger', 'video', 'viper',
		'white', 'women', 'xxxxx', 'young', '111111', '112233', '121212', '123123',
		'123456', '131313', '232323', '654321', '666666', '696969', '777777', '987654',
		'aaaaaa', 'abc123', 'abcdef', 'access', 'action', 'albert', 'alexis', 'amanda',
		'andrea', 'andrew', 'angela', 'angels', 'animal', 'apollo', 'apples', 'arthur',
		'asdfgh', 'ashley', 'august', 'austin', 'badboy', 'bailey', 'banana', 'barney',
		'batman', 'beaver', 'beavis', 'bigdog', 'birdie', 'biteme', 'blazer', 'blonde',
		'blowme', 'bonnie', 'booboo', 'booger', 'boomer', 'boston', 'brandy', 'braves',
		'brazil', 'bronco', 'buster', 'butter', 'calvin', 'camaro', 'canada', 'carlos',
		'carter', 'casper', 'cheese', 'coffee', 'compaq', 'cookie', 'cooper', 'cowboy',
		'dakota', 'dallas', 'daniel', 'debbie', 'dennis', 'diablo', 'doctor', 'doggie',
		'donald', 'dragon', 'dreams', 'driver', 'eagle1', 'eagles', 'edward', 'erotic',
		'falcon', 'fender', 'flower', 'flyers', 'freddy', 'fucked', 'fucker', 'fuckme',
		'gators', 'gemini', 'george', 'giants', 'ginger', 'golden', 'golfer', 'gordon',
		'guitar', 'gunner', 'hammer', 'hannah', 'harley', 'helpme', 'hentai', 'hockey',
		'horney', 'hotdog', 'hunter', 'iceman', 'iwantu', 'jackie', 'jaguar', 'jasper',
		'jeremy', 'johnny', 'jordan', 'joseph', 'joshua', 'junior', 'justin', 'killer',
		'knight', 'ladies', 'lakers', 'lauren', 'legend', 'little', 'london', 'lovers',
		'maddog', 'maggie', 'magnum', 'marine', 'martin', 'marvin', 'master', 'matrix',
		'member', 'merlin', 'mickey', 'miller', 'monica', 'monkey', 'morgan', 'mother',
		'muffin', 'murphy', 'nascar', 'nathan', 'nicole', 'nipple', 'oliver', 'orange',
		'parker', 'peanut', 'pepper', 'player', 'please', 'pookie', 'prince', 'purple',
		'qazwsx', 'qwerty', 'rabbit', 'rachel', 'racing', 'ranger', 'redsox', 'robert',
		'rocket', 'runner', 'russia', 'samson', 'sandra', 'saturn', 'scooby', 'secret',
		'sexsex', 'shadow', 'shaved', 'sierra', 'silver', 'skippy', 'slayer', 'smokey',
		'snoopy', 'soccer', 'sophie', 'spanky', 'sparky', 'spider', 'squirt', 'steven',
		'sticky', 'stupid', 'suckit', 'summer', 'surfer', 'sydney', 'taylor', 'tennis',
		'teresa', 'tester', 'theman', 'thomas', 'tigers', 'tigger', 'tomcat', 'topgun',
		'toyota', 'travis', 'tucker', 'turtle', 'united', 'vagina', 'victor', 'viking',
		'voodoo', 'walter', 'willie', 'wilson', 'winner', 'winter', 'wizard', 'xavier',
		'xxxxxx', 'yamaha', 'yankee', 'yellow', 'zxcvbn', 'zzzzzz', '1234567', '7777777',
		'8675309', 'abgrtyu', 'amateur', 'anthony', 'arsenal', 'asshole', 'bigcock',
		'bigdick', 'bigtits', 'bitches', 'blondes', 'blowjob', 'bond007', 'brandon',
		'broncos', 'bulldog', 'cameron', 'captain', 'charles', 'charlie', 'chelsea',
		'chester', 'chicago', 'chicken', 'college', 'cowboys', 'crystal', 'cumming',
		'cumshot', 'diamond', 'dolphin', 'extreme', 'ferrari', 'fishing', 'florida',
		'forever', 'freedom', 'fucking', 'fuckyou', 'gandalf', 'gateway', 'gregory',
		'heather', 'hooters', 'hunting', 'jackson', 'jasmine', 'jessica', 'johnson',
		'leather', 'letmein', 'madison', 'matthew', 'maxwell', 'melissa', 'michael',
		'monster', 'mustang', 'naughty', 'ncc1701', 'newyork', 'nipples', 'packers',
		'panther', 'panties', 'patrick', 'peaches', 'phantom', 'phoenix', 'porsche',
		'private', 'pussies', 'raiders', 'rainbow', 'rangers', 'rebecca', 'richard',
		'rosebud', 'scooter', 'scorpio', 'shannon', 'success', 'testing', 'thunder',
		'thx1138', 'tiffany', 'trouble', 'twitter', 'voyager', 'warrior', 'welcome',
		'william', 'winston', 'yankees', 'zxcvbnm', '11111111', '12345678', 'access14',
		'baseball', 'bigdaddy', 'butthead', 'cocacola', 'computer', 'corvette',
		'danielle', 'dolphins', 'einstein', 'firebird', 'football', 'hardcore',
		'iloveyou', 'internet', 'jennifer', 'marlboro', 'maverick', 'mercedes',
		'michelle', 'midnight', 'mistress', 'mountain', 'nicholas', 'password',
		'princess', 'qwertyui', 'redskins', 'redwings', 'rush2112', 'samantha',
		'scorpion', 'srinivas', 'startrek', 'starwars', 'steelers', 'sunshine',
		'superman', 'swimming', 'trustno1', 'victoria', 'whatever', 'xxxxxxxx',
		'password1', 'password12', 'password123',
	];

	private $minimumChars = 8;

	private $strengthScaleFactor = 1;

	private $bannedPasswords = [];

	private $banMode = 'strict'; // (strict|loose)

	private $encoding = 'UTF-8';

	/**
	 * Constructor
	 *
	 * @param   array  $options  Override default options using an associative array of options
	 *
	 * Options:
	 *  - minimumChars: Minimum password length (default: 8)
	 *  - strengthScaleFactor: Required password strength multiplier (default: 1)
	 *  - bannedPasswords: Custom list of banned passwords (default: long list of common passwords)
	 *  - banMode: Use strict or loose comparisons for banned passwords. "strict" = don't allow a substring of a banned
	 *  password, "loose" = only ban exact matches (default: strict)
	 *  - encoding: Character set encoding of the password (default: UTF-8)
	 */
	public function __construct(array $options = [])
	{
		$this->bannedPasswords = self::$BANLIST;

		foreach ($options as $opt => $val)
		{
			if ($opt === 'banmode')
			{
				trigger_error('The lowercase banmode option is deprecated. Use banMode instead.', E_USER_DEPRECATED);
				$opt = 'banMode';
			}

			$this->{$opt} = $val;
		}
	}

	/**
	 * Checks if a password is strong enough for use on a live site. Used to check the front-end Secret Word.
	 *
	 * @param   string  $password         The password to check
	 * @param   bool    $throwExceptions  Throw an exception if the password is not strong enough?
	 *
	 * @return  bool
	 */
	public static function isStrongEnough($password, $throwExceptions = true)
	{
		$complexify = new self();

		$res = (object) [
			'valid'      => strlen($password) >= 32,
			'complexity' => 50,
			'errors'     => (strlen($password) >= 32) ? [] : ['tooshort'],
		];

		if (function_exists('mb_strlen') && function_exists('mb_convert_encoding') &&
			function_exists('mb_substr') && function_exists('mb_convert_case'))
		{
			$res = $complexify->evaluateSecurity($password);
		}


		if ($res->valid)
		{
			return true;
		}

		if (!$throwExceptions)
		{
			return false;
		}

		$error = count($res->errors) ? array_shift($res->errors) : 'toosimple';

		$errorMessage = Platform::getInstance()->translate('COM_AKEEBA_CPANEL_ERR_FESECRETWORD_' . $error);

		throw new RuntimeException($errorMessage, 403);
	}

	/**
	 * Check the complexity of a password
	 *
	 * @param   string  $password  The password to check
	 *
	 * @return  object  StdClass object with properties "valid", "complexity", and "error"
	 *  - valid: TRUE if the password is complex enough, FALSE if it is not
	 *  - complexity: The complexity of the password as a percent
	 *  - errors: Array containing descriptions of what made the password fail. Possible values are: banned, toosimple,
	 *  tooshort
	 */
	public function evaluateSecurity($password)
	{
		$complexity = 0;
		$error      = [];

		// Reset complexity to 0 when banned password is found
		if (!$this->inBanlist($password))
		{
			// Add character complexity
			foreach (self::$CHARSETS as $charset)
			{
				$complexity += $this->additionalComplexityForCharset($password, $charset);
			}
		}
		else
		{
			array_push($error, 'banned');
			$complexity = 1;
		}

		// Use natural log to produce linear scale
		$complexity = log($complexity ** mb_strlen($password, $this->encoding)) * (1 / $this->strengthScaleFactor);

		if ($complexity <= self::$MIN_COMPLEXITY)
		{
			array_push($error, 'toosimple');
		}

		if (mb_strlen($password, $this->encoding) < $this->minimumChars)
		{
			array_push($error, 'tooshort');
		}

		// Scale to percentage, so it can be used for a progress bar
		$complexity = ($complexity / self::$MAX_COMPLEXITY) * 100;
		$complexity = ($complexity > 100) ? 100 : $complexity;

		return (object) ['valid' => (is_array($error) || $error instanceof \Countable ? count($error) : 0) === 0, 'complexity' => $complexity, 'errors' => $error];
	}

	/**
	 * Determine the complexity added from a character set if it is used in a string
	 *
	 * @param   string  $str       String to check
	 * @param   int  [2]    $charset  Array of unicode code points representing the lower and upper bound of the
	 *                             character range
	 *
	 * @return  int  0 if there are no characters from the character set, size of the character set if there are any
	 *               characters used in the string
	 */
	private function additionalComplexityForCharset($str, $charset)
	{
		$len = mb_strlen($str, $this->encoding);
		for ($i = 0; $i < $len; $i++)
		{
			$c =
				unpack('Nord', mb_convert_encoding(mb_substr($str, $i, 1, $this->encoding), 'UCS-4BE', $this->encoding));
			if ($charset[0] <= $c['ord'] && $c['ord'] <= $charset[1])
			{
				return $charset[1] - $charset[0] + 1;
			}
		}

		return 0;
	}

	/**
	 * Check if a string is in the banned password list
	 *
	 * @param   string  $str  String to check
	 *
	 * @return  bool  TRUE if $str is a banned password, or if it is a substring of a banned password and
	 *                $this->banMode is 'strict'
	 */
	private function inBanlist($str)
	{
		if ($str == '')
		{
			return false;
		}

		$str = mb_convert_case($str, MB_CASE_LOWER, $this->encoding);

		if ($this->banMode === 'strict')
		{
			for ($i = 0; $i < count($this->bannedPasswords); $i++)
			{
				if (mb_strpos($this->bannedPasswords[$i], $str, 0, $this->encoding) !== false)
				{
					return true;
				}
			}

			return false;
		}

		return in_array($str, $this->bannedPasswords);
	}
}
components/com_akeeba/BackupEngine/Util/SecureSettings.php000060400000013113152453623440017732 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;

/**
 * Implements encrypted settings handling features
 *
 * @author nicholas
 */
class SecureSettings
{
	/**
	 * The filename for the settings encryption key
	 *
	 * @var   string
	 */
	protected $keyFilename = 'serverkey.php';

	protected $key = null;

	/**
	 * Set the key filename e.g. 'serverkey.php';
	 *
	 * @param   string  $filename  The new filename to use
	 *
	 * @return  void
	 */
	public function setKeyFilename($filename)
	{
		$this->keyFilename = $filename;
	}

	/**
	 * Sets the server key, overriding an already loaded key.
	 *
	 * @param $key
	 */
	public function setKey($key)
	{
		$this->key = $key;
	}

	/**
	 * Gets the configured server key, automatically loading the server key storage file
	 * if required.
	 *
	 * @return string
	 */
	public function getKey()
	{
		if (is_null($this->key))
		{
			$this->key = '';

			if (!defined('AKEEBA_SERVERKEY'))
			{
				$filename = dirname(__FILE__) . '/../' . $this->keyFilename;
				$altFilename = $this->keyFilename;

				if (file_exists($filename))
				{
					include_once $filename;
				}
				elseif (file_exists($altFilename))
				{
					include_once $altFilename;
				}
			}

			if (defined('AKEEBA_SERVERKEY'))
			{
				$this->key = base64_decode(AKEEBA_SERVERKEY);
			}
		}

		return $this->key;
	}

	/**
	 * Do the server options allow us to use settings encryption?
	 *
	 * @return bool
	 */
	public function supportsEncryption()
	{
		// Do we have the encrypt.php plugin?
		if (!class_exists('\\Akeeba\\Engine\\Util\\Encrypt', true))
		{
			return false;
		}

		// Did the user intentionally disable settings encryption?
		$useEncryption = Platform::getInstance()->get_platform_configuration_option('useencryption', -1);

		if ($useEncryption == 0)
		{
			return false;
		}

		// Do we have base64_encode/_decode required for encryption?
		if (!function_exists('base64_encode') || !function_exists('base64_decode'))
		{
			return false;
		}

		// Pre-requisites met. We can encrypt and decrypt!
		return true;
	}

	/**
	 * Gets the preferred encryption mode. Currently, if mcrypt is installed and activated we will
	 * use AES128.
	 *
	 * @return string
	 */
	public function preferredEncryption()
	{
		$aes     = new Encrypt();
		$adapter = $aes->getAdapter();

		if (!$adapter->isSupported())
		{
			return 'CTR128';
		}

		return 'AES128';
	}

	/**
	 * Encrypts the settings using the automatically detected preferred algorithm
	 *
	 * @param   $rawSettings  string  The raw settings string
	 * @param   $key          string  The encryption key. Set to NULL to automatically find the key.
	 *
	 * @return  string  The encrypted data to store in the database
	 */
	public function encryptSettings($rawSettings, $key = null)
	{
		// Do we really support encryption?
		if (!$this->supportsEncryption())
		{
			return $rawSettings;
		}

		// Does any of the preferred encryption engines exist?
		$encryption = $this->preferredEncryption();

		if (empty($encryption))
		{
			return $rawSettings;
		}

		// Do we have a non-empty key to begin with?
		if (empty($key))
		{
			$key = $this->getKey();
		}

		if (empty($key))
		{
			return $rawSettings;
		}

		if ($encryption == 'AES128')
		{
			$encrypted = Factory::getEncryption()->AESEncryptCBC($rawSettings, $key);

			if (empty($encrypted))
			{
				$encryption = 'CTR128';
			}
			else
			{
				// Note: CBC returns the encrypted data as a binary string and requires Base 64 encoding
				$rawSettings = '###AES128###' . base64_encode($encrypted);
			}
		}

		if ($encryption == 'CTR128')
		{
			$encrypted = Factory::getEncryption()->AESEncryptCtr($rawSettings, $key, 128);

			if (!empty($encrypted))
			{
				// Note: CTR returns the encrypted data readily encoded in Base 64
				$rawSettings = '###CTR128###' . $encrypted;
			}
		}

		return $rawSettings;
	}

	/**
	 * Decrypts the encrypted settings and returns the plaintext INI string
	 *
	 * @param   string  $encrypted  The encrypted data
	 *
	 * @return  string  The decrypted data
	 */
	public function decryptSettings($encrypted, $key = null)
	{
		if (substr($encrypted, 0, 12) == '###AES128###')
		{
			$mode = 'AES128';
		}
		elseif (substr($encrypted, 0, 12) == '###CTR128###')
		{
			$mode = 'CTR128';
		}
		else
		{
			return $encrypted;
		}

		if (empty($key))
		{
			$key = $this->getKey();
		}

		if (empty($key))
		{
			return '';
		}

		$encrypted = substr($encrypted, 12);

		switch ($mode)
		{
			default:
			case 'AES128':
				$encrypted = base64_decode($encrypted);
				$decrypted = rtrim(Factory::getEncryption()->AESDecryptCBC($encrypted, $key), "\0");
				break;

			case 'CTR128':
				$decrypted = Factory::getEncryption()->AESDecryptCtr($encrypted, $key, 128);
				break;
		}

		if (empty($decrypted))
		{
			$decrypted = '';
		}

		return $decrypted;
	}
}
components/com_akeeba/BackupEngine/Util/PushMessagesInterface.php000060400000003720152453623440021216 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

/**
 * @package     Akeeba\Engine\Util
 * @subpackage
 *
 * @copyright   A copyright
 * @license     A "Slug" license name e.g. GPL2
 */

namespace Akeeba\Engine\Util;

defined('AKEEBAENGINE') || die();

interface PushMessagesInterface
{
	/**
	 * Sends a push message to all connected devices. The intent is to provide the user with an information message,
	 * e.g. notify them about the progress of the backup.
	 *
	 * @param   string  $subject  The subject of the message, shown in the lock screen. Keep it short.
	 * @param   string  $details  Long(er) description of what the message is about. Plain text (no HTML).
	 *
	 * @return  void
	 */
	public function message($subject, $details = null);

	/**
	 * Sends a push message, containing a URL/URI, to all connected devices. The URL will be rendered as something
	 * clickable on most devices.
	 *
	 * @param   string  $url      The URL/URI
	 * @param   string  $subject  The subject of the message, shown in the lock screen. Keep it short.
	 * @param   string  $details  Long(er) description of what the message is about. Plain text (no HTML).
	 *
	 * @return  void
	 */
	public function link($url, $subject, $details = null);
}components/com_akeeba/BackupEngine/Util/TemporaryFiles.php000060400000014142152453623440017733 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;

/**
 * Temporary files management class. Handles creation, tracking and cleanup.
 */
class TemporaryFiles
{

	/**
	 * Creates a randomly-named temporary file, registers it with the temporary
	 * files management and returns its absolute path
	 *
	 * @return  string  The temporary file name
	 */
	public function createRegisterTempFile()
	{
		// Create a randomly named file in the temp directory
		$registry = Factory::getConfiguration();
		$tempFile = tempnam($registry->get('akeeba.basic.output_directory'), 'ak');

		// Register it and return its absolute path
		$tempName = basename($tempFile);

		return Factory::getTempFiles()->registerTempFile($tempName);
	}

	/**
	 * Registers a temporary file with the Akeeba Engine, storing the list of temporary files
	 * in another temporary flat database file.
	 *
	 * @param   string  $fileName  The path of the file, relative to the temporary directory
	 *
	 * @return  string  The absolute path to the temporary file, for use in file operations
	 */
	public function registerTempFile($fileName)
	{
		$configuration = Factory::getConfiguration();
		$tempFiles     = $configuration->get('volatile.tempfiles', false);
		if ($tempFiles === false)
		{
			$tempFiles = [];
		}
		else
		{
			$tempFiles = @unserialize($tempFiles);

			if ($tempFiles === false)
			{
				$tempFiles = [];
			}
		}

		if (!in_array($fileName, $tempFiles))
		{
			$tempFiles[] = $fileName;
			$configuration->set('volatile.tempfiles', serialize($tempFiles));
		}

		return Factory::getFilesystemTools()->TranslateWinPath($configuration->get('akeeba.basic.output_directory') . '/' . $fileName);
	}

	/**
	 * Unregister and delete a temporary file
	 *
	 * @param   string  $fileName      The filename to unregister and delete
	 * @param   bool    $removePrefix  The prefix to remove
	 *
	 * @return  bool  True on success
	 */
	public function unregisterAndDeleteTempFile($fileName, $removePrefix = false)
	{
		$configuration = Factory::getConfiguration();

		if ($removePrefix)
		{
			$fileName = str_replace(Factory::getFilesystemTools()->TranslateWinPath($configuration->get('akeeba.basic.output_directory')), '', $fileName);

			if ((substr($fileName, 0, 1) == '/') || (substr($fileName, 0, 1) == '\\'))
			{
				$fileName = substr($fileName, 1);
			}

			if ((substr($fileName, -1) == '/') || (substr($fileName, -1) == '\\'))
			{
				$fileName = substr($fileName, 0, -1);
			}
		}

		// Make sure this file is registered
		$configuration = Factory::getConfiguration();

		$serialised = $configuration->get('volatile.tempfiles', false);
		$tempFiles  = [];

		if ($serialised !== false)
		{
			$tempFiles = @unserialize($serialised);
		}

		if (!is_array($tempFiles))
		{
			return false;
		}

		if (!in_array($fileName, $tempFiles))
		{
			return false;
		}

		$file = $configuration->get('akeeba.basic.output_directory') . '/' . $fileName;
		Factory::getLog()->debug("-- Removing temporary file $fileName");
		$platform = strtoupper(PHP_OS);

		// Chown normally doesn't work on Windows but many years ago I found it necessary to delete temp files. No idea.
		if ((substr($platform, 0, 6) == 'CYGWIN') || (substr($platform, 0, 3) == 'WIN'))
		{
			// On Windows we have to chown() the file first to make it owned by Nobody
			Factory::getLog()->debug("-- Windows hack: chowning $fileName");
			@chown($file, 600);
		}

		$result = @$this->nullifyAndDelete($file);

		// Make sure the file is removed before unregistering it
		if (!@file_exists($file))
		{
			$aPos = array_search($fileName, $tempFiles);

			if ($aPos !== false)
			{
				unset($tempFiles[$aPos]);

				$configuration->set('volatile.tempfiles', serialize($tempFiles));
			}
		}

		return $result;
	}


	/**
	 * Deletes all temporary files
	 *
	 * @return  void
	 */
	public function deleteTempFiles()
	{
		$configuration = Factory::getConfiguration();

		$serialised = $configuration->get('volatile.tempfiles', false);
		$tempFiles  = [];

		if ($serialised !== false)
		{
			$tempFiles = @unserialize($serialised);
		}

		if (!is_array($tempFiles))
		{
			$tempFiles = [];
		}

		$fileName = null;

		if (!empty($tempFiles))
		{
			foreach ($tempFiles as $fileName)
			{
				Factory::getLog()->debug("-- Removing temporary file $fileName");
				$file     = $configuration->get('akeeba.basic.output_directory') . '/' . $fileName;
				$platform = strtoupper(PHP_OS);

				// Chown normally doesn't work on Windows but many years ago I found it necessary to delete temp files. No idea.
				if ((substr($platform, 0, 6) == 'CYGWIN') || (substr($platform, 0, 3) == 'WIN'))
				{
					// On Windows we have to chwon() the file first to make it owned by Nobody
					@chown($file, 600);
				}

				$ret = @$this->nullifyAndDelete($file);
			}
		}

		$tempFiles = [];
		$configuration->set('volatile.tempfiles', serialize($tempFiles));
	}

	/**
	 * Nullify the contents of the file and try to delete it as well
	 *
	 * @param   string  $filename  The absolute path to the file to delete
	 *
	 * @return  bool  True of the deletion is successful
	 */
	public function nullifyAndDelete($filename)
	{
		// Try to nullify (method #1)
		$fp = @fopen($filename, 'w');

		if (is_resource($fp))
		{
			@fclose($fp);
		}
		else
		{
			// Try to nullify (method #2)
			@file_put_contents($filename, '');
		}

		// Unlink
		return @unlink($filename);
	}
}
components/com_akeeba/BackupEngine/Util/FileLister.php000060400000007521152453623440017033 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;

/* Windows system detection */
if (!defined('_AKEEBA_IS_WINDOWS'))
{
	$isWindows = DIRECTORY_SEPARATOR == '\\';

	if (function_exists('php_uname'))
	{
		$isWindows = stristr(php_uname(), 'windows');
	}

	define('_AKEEBA_IS_WINDOWS', $isWindows);
}

/**
 * A filesystem scanner, for internal use
 */
class FileLister
{
	public function &getFiles($folder, $fullpath = false)
	{
		// Initialize variables
		$arr   = [];
		$false = false;

		if (!is_dir($folder) && !is_dir($folder . '/'))
		{
			return $false;
		}

		$handle = @opendir($folder);
		if ($handle === false)
		{
			$handle = @opendir($folder . '/');
		}
		// If directory is not accessible, just return FALSE
		if ($handle === false)
		{
			return $false;
		}

		$registry            = Factory::getConfiguration();
		$dereferencesymlinks = $registry->get('engine.archiver.common.dereference_symlinks');

		while ((($file = @readdir($handle)) !== false))
		{
			if (($file != '.') && ($file != '..'))
			{
				// # Fix 2.4.b1: Do not add DS if we are on the site's root and it's an empty string
				// # Fix 2.4.b2: Do not add DS is the last character _is_ DS
				$ds     = ($folder == '') || ($folder == '/') || (@substr($folder, -1) == '/') || (@substr($folder, -1) == DIRECTORY_SEPARATOR) ? '' : DIRECTORY_SEPARATOR;
				$dir    = "$folder/$file";
				$isDir  = @is_dir($dir);
				$isLink = @is_link($dir);

				//if (!$isDir || ($isDir && $isLink && !$dereferencesymlinks) ) {
				if (!$isDir)
				{
					if ($fullpath)
					{
						$data = _AKEEBA_IS_WINDOWS ? Factory::getFilesystemTools()->TranslateWinPath($dir) : $dir;
					}
					else
					{
						$data = _AKEEBA_IS_WINDOWS ? Factory::getFilesystemTools()->TranslateWinPath($file) : $file;
					}
					if ($data)
					{
						$arr[] = $data;
					}
				}
			}
		}
		@closedir($handle);

		return $arr;
	}

	public function &getFolders($folder, $fullpath = false)
	{
		// Initialize variables
		$arr   = [];
		$false = false;

		if (!is_dir($folder) && !is_dir($folder . '/'))
		{
			return $false;
		}

		$handle = @opendir($folder);
		if ($handle === false)

		{
			$handle = @opendir($folder . '/');
		}

		// If directory is not accessible, just return FALSE
		if ($handle === false)
		{
			return $false;
		}

		$registry            = Factory::getConfiguration();
		$dereferencesymlinks = $registry->get('engine.archiver.common.dereference_symlinks');

		while ((($file = @readdir($handle)) !== false))
		{
			if (($file != '.') && ($file != '..'))
			{
				$dir    = "$folder/$file";
				$isDir  = @is_dir($dir);
				$isLink = @is_link($dir);

				if ($isDir)
				{
					//if(!$dereferencesymlinks && $isLink) continue;
					if ($fullpath)
					{
						$data = _AKEEBA_IS_WINDOWS ? Factory::getFilesystemTools()->TranslateWinPath($dir) : $dir;
					}
					else
					{
						$data = _AKEEBA_IS_WINDOWS ? Factory::getFilesystemTools()->TranslateWinPath($file) : $file;
					}

					if ($data)
					{
						$arr[] = $data;
					}
				}
			}
		}
		@closedir($handle);

		return $arr;
	}
}
components/com_akeeba/BackupEngine/Util/Encrypt.php000060400000066365152453623440016430 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Util\AesAdapter\AdapterInterface;
use Akeeba\Engine\Util\AesAdapter\Mcrypt;
use Akeeba\Engine\Util\AesAdapter\OpenSSL;

/**
 * AES implementation in PHP (c) Chris Veness 2005-2016.
 * Right to use and adapt is granted for under a simple creative commons attribution
 * licence. No warranty of any form is offered.
 *
 * Heavily modified for Akeeba Backup by Nicholas K. Dionysopoulos
 * Also added AES-128 CBC mode (with mcrypt and OpenSSL) on top of AES CTR
 */
class Encrypt
{
	use HashTrait;

	// Sbox is pre-computed multiplicative inverse in GF(2^8) used in SubBytes and KeyExpansion [�5.1.1]
	protected $Sbox =
		[
			0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
			0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
			0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
			0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
			0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
			0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
			0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
			0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
			0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
			0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
			0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
			0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
			0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
			0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
			0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
			0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16,
		];

	// Rcon is Round Constant used for the Key Expansion [1st col is 2^(r-1) in GF(2^8)] [�5.2]
	protected $Rcon = [
		[0x00, 0x00, 0x00, 0x00],
		[0x01, 0x00, 0x00, 0x00],
		[0x02, 0x00, 0x00, 0x00],
		[0x04, 0x00, 0x00, 0x00],
		[0x08, 0x00, 0x00, 0x00],
		[0x10, 0x00, 0x00, 0x00],
		[0x20, 0x00, 0x00, 0x00],
		[0x40, 0x00, 0x00, 0x00],
		[0x80, 0x00, 0x00, 0x00],
		[0x1b, 0x00, 0x00, 0x00],
		[0x36, 0x00, 0x00, 0x00],
	];

	protected $passwords = [];

	/**
	 * The algorithm to use for PBKDF2. Must be a supported hash_hmac algorithm. Default: sha1
	 *
	 * @var  string
	 */
	private $pbkdf2Algorithm = 'sha1';

	/**
	 * Number of iterations to use for PBKDF2
	 *
	 * @var  int
	 */
	private $pbkdf2Iterations = 1000;

	/**
	 * Should we use a static salt for PBKDF2?
	 *
	 * @var  int
	 */
	private $pbkdf2UseStaticSalt = 0;

	/**
	 * The static salt to use for PBKDF2
	 *
	 * @var  string
	 */
	private $pbkdf2StaticSalt = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";

	/**
	 * AES Cipher function: encrypt 'input' with Rijndael algorithm
	 *
	 * @param   string  $input  message as byte-array (16 bytes)
	 * @param   array   $w      key schedule as 2D byte-array (Nr+1 x Nb bytes) -
	 *                          generated from the cipher key by KeyExpansion()
	 *
	 * @return      array  ciphertext as byte-array (16 bytes)
	 */
	public function Cipher($input, $w)
	{
		// main Cipher function [�5.1]
		$Nb = 4; // block size (in words): no of columns in state (fixed at 4 for AES)
		$Nr = count($w) / $Nb - 1; // no of rounds: 10/12/14 for 128/192/256-bit keys

		$state = []; // initialise 4xNb byte-array 'state' with input [�3.4]

		for ($i = 0; $i < 4 * $Nb; $i++)
		{
			$state[$i % 4][(int) floor($i / 4)] = $input[$i];
		}

		$state = $this->AddRoundKey($state, $w, 0, $Nb);

		for ($round = 1; $round < $Nr; $round++)
		{
			// apply Nr rounds
			$state = $this->SubBytes($state, $Nb);
			$state = $this->ShiftRows($state, $Nb);
			$state = $this->MixColumns($state, $Nb);
			$state = $this->AddRoundKey($state, $w, $round, $Nb);
		}

		$state = $this->SubBytes($state, $Nb);
		$state = $this->ShiftRows($state, $Nb);
		$state = $this->AddRoundKey($state, $w, $Nr, $Nb);

		$output = [4 * $Nb]; // convert state to 1-d array before returning [�3.4]

		for ($i = 0; $i < 4 * $Nb; $i++)
		{
			$output[$i] = $state[$i % 4][(int) floor($i / 4)];
		}

		return $output;
	}

	/**
	 * Key expansion for Rijndael Cipher(): performs key expansion on cipher key
	 * to generate a key schedule
	 *
	 * @param   array  $key  cipher key byte-array (16 bytes)
	 *
	 * @return    array key schedule as 2D byte-array (Nr+1 x Nb bytes)
	 */
	public function KeyExpansion($key)
	{
		// generate Key Schedule from Cipher Key [�5.2]
		$Nb = 4; // block size (in words): no of columns in state (fixed at 4 for AES)
		$Nk = count($key) / 4; // key length (in words): 4/6/8 for 128/192/256-bit keys
		$Nr = $Nk + 6; // no of rounds: 10/12/14 for 128/192/256-bit keys

		$w    = [];
		$temp = [];

		for ($i = 0; $i < $Nk; $i++)
		{
			$r     = [$key[4 * $i], $key[4 * $i + 1], $key[4 * $i + 2], $key[4 * $i + 3]];
			$w[$i] = $r;
		}

		for ($i = $Nk; $i < ($Nb * ($Nr + 1)); $i++)
		{
			$w[(int) $i] = [];

			for ($t = 0; $t < 4; $t++)
			{
				$temp[$t] = $w[(int) $i - 1][$t];
			}

			if ($i % $Nk == 0)
			{
				$temp = $this->SubWord($this->RotWord($temp));

				for ($t = 0; $t < 4; $t++)
				{
					$temp[$t] ^= $this->Rcon[(int) ($i / $Nk)][$t];
				}
			}
			elseif ($Nk > 6 && $i % $Nk == 4)
			{
				$temp = $this->SubWord($temp);
			}

			for ($t = 0; $t < 4; $t++)
			{
				$w[(int) $i][$t] = $w[(int) $i - $Nk][$t] ^ $temp[$t];
			}
		}

		return $w;
	}

	/**
	 * Encrypt a text using AES encryption in Counter mode of operation
	 *  - see http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
	 *
	 * Unicode multi-byte character safe
	 *
	 * @param   string  $plaintext  source text to be encrypted
	 * @param   string  $password   the password to use to generate a key
	 * @param   int     $nBits      number of bits to be used in the key (128, 192, or 256)
	 *
	 * @return string encrypted text
	 */
	public function AESEncryptCtr($plaintext, $password, $nBits)
	{
		$blockSize = 16; // block size fixed at 16 bytes / 128 bits (Nb=4) for AES

		// standard allows 128/192/256 bit keys
		if (!($nBits == 128 || $nBits == 192 || $nBits == 256))
		{
			return '';
		}

		// note PHP (5) gives us plaintext and password in UTF8 encoding!

		// use AES itself to encrypt password to get cipher key (using plain password as source for
		// key expansion) - gives us well encrypted key
		$nBytes  = $nBits / 8; // no bytes in key
		$pwBytes = [];

		for ($i = 0; $i < $nBytes; $i++)
		{
			$pwBytes[$i] = ord(substr($password, $i, 1)) & 0xff;
		}

		$key = $this->Cipher($pwBytes, $this->KeyExpansion($pwBytes));
		$key = array_merge($key, array_slice($key, 0, $nBytes - 16)); // expand key to 16/24/32 bytes long

		// initialise counter block (NIST SP800-38A �B.2): millisecond time-stamp for nonce in
		// 1st 8 bytes, block counter in 2nd 8 bytes
		$counterBlock = [];
		$nonce        = floor(microtime(true) * 1000); // timestamp: milliseconds since 1-Jan-1970
		$nonceSec     = floor($nonce / 1000);
		$nonceMs      = $nonce % 1000;

		// encode nonce with seconds in 1st 4 bytes, and (repeated) ms part filling 2nd 4 bytes
		for ($i = 0; $i < 4; $i++)
		{
			$counterBlock[$i] = $this->urs($nonceSec, $i * 8) & 0xff;
		}

		for ($i = 0; $i < 4; $i++)
		{
			$counterBlock[$i + 4] = $nonceMs & 0xff;
		}

		// and convert it to a string to go on the front of the ciphertext
		$ctrTxt = '';

		for ($i = 0; $i < 8; $i++)
		{
			$ctrTxt .= chr($counterBlock[$i]);
		}

		// generate key schedule - an expansion of the key into distinct Key Rounds for each round
		$keySchedule = $this->KeyExpansion($key);

		$blockCount = ceil(strlen($plaintext) / $blockSize);
		$ciphertxt  = []; // ciphertext as array of strings

		for ($b = 0; $b < $blockCount; $b++)
		{
			// set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
			// done in two stages for 32-bit ops: using two words allows us to go past 2^32 blocks (68GB)
			for ($c = 0; $c < 4; $c++)
			{
				$counterBlock[15 - $c] = $this->urs($b, $c * 8) & 0xff;
			}

			for ($c = 0; $c < 4; $c++)
			{
				$counterBlock[15 - $c - 4] = $this->urs($b / 0x100000000, $c * 8);
			}

			$cipherCntr = $this->Cipher($counterBlock, $keySchedule); // -- encrypt counter block --

			// block size is reduced on final block
			$blockLength = $b < $blockCount - 1 ? $blockSize : (strlen($plaintext) - 1) % $blockSize + 1;
			$cipherByte  = [];

			for ($i = 0; $i < $blockLength; $i++)
			{ // -- xor plaintext with ciphered counter byte-by-byte --
				$cipherByte[$i] = $cipherCntr[$i] ^ ord(substr($plaintext, $b * $blockSize + $i, 1));
				$cipherByte[$i] = chr($cipherByte[$i]);
			}

			$ciphertxt[$b] = implode('', $cipherByte); // escape troublesome characters in ciphertext
		}

		// implode is more efficient than repeated string concatenation
		$ciphertext = $ctrTxt . implode('', $ciphertxt);
		$ciphertext = base64_encode($ciphertext);

		return $ciphertext;
	}

	/**
	 * Decrypt a text encrypted by AES in counter mode of operation
	 *
	 * @param   string  $ciphertext  source text to be decrypted
	 * @param   string  $password    the password to use to generate a key
	 * @param   int     $nBits       number of bits to be used in the key (128, 192, or 256)
	 *
	 * @return string decrypted text
	 */
	public function AESDecryptCtr($ciphertext, $password, $nBits)
	{
		$blockSize = 16; // block size fixed at 16 bytes / 128 bits (Nb=4) for AES

		// standard allows 128/192/256 bit keys
		if (!($nBits == 128 || $nBits == 192 || $nBits == 256))
		{
			return '';
		}

		$ciphertext = base64_decode($ciphertext);

		// use AES to encrypt password (mirroring encrypt routine)
		$nBytes  = $nBits / 8; // no bytes in key
		$pwBytes = [];

		for ($i = 0; $i < $nBytes; $i++)
		{
			$pwBytes[$i] = ord(substr($password, $i, 1)) & 0xff;
		}

		$key = $this->Cipher($pwBytes, $this->KeyExpansion($pwBytes));
		$key = array_merge($key, array_slice($key, 0, $nBytes - 16)); // expand key to 16/24/32 bytes long

		// recover nonce from 1st element of ciphertext
		$counterBlock = [];
		$ctrTxt       = substr($ciphertext, 0, 8);

		for ($i = 0; $i < 8; $i++)
		{
			$counterBlock[$i] = ord(substr($ctrTxt, $i, 1));
		}

		// generate key schedule
		$keySchedule = $this->KeyExpansion($key);

		// separate ciphertext into blocks (skipping past initial 8 bytes)
		$nBlocks = ceil((strlen($ciphertext) - 8) / $blockSize);
		$ct      = [];

		for ($b = 0; $b < $nBlocks; $b++)
		{
			$ct[$b] = substr($ciphertext, 8 + $b * $blockSize, 16);
		}

		$ciphertext = $ct; // ciphertext is now array of block-length strings

		// plaintext will get generated block-by-block into array of block-length strings
		$plaintxt = [];

		for ($b = 0; $b < $nBlocks; $b++)
		{
			// set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
			for ($c = 0; $c < 4; $c++)
			{
				$counterBlock[15 - $c] = $this->urs($b, $c * 8) & 0xff;
			}

			for ($c = 0; $c < 4; $c++)
			{
				$counterBlock[15 - $c - 4] = $this->urs(($b + 1) / 0x100000000 - 1, $c * 8) & 0xff;
			}

			$cipherCntr = $this->Cipher($counterBlock, $keySchedule); // encrypt counter block

			$plaintxtByte = [];

			for ($i = 0; $i < strlen($ciphertext[$b]); $i++)
			{
				// -- xor plaintext with ciphered counter byte-by-byte --
				$plaintxtByte[$i] = $cipherCntr[$i] ^ ord(substr($ciphertext[$b], $i, 1));
				$plaintxtByte[$i] = chr($plaintxtByte[$i]);
			}

			$plaintxt[$b] = implode('', $plaintxtByte);
		}

		// join array of blocks into single plaintext string
		$plaintext = implode('', $plaintxt);

		return $plaintext;
	}

	/**
	 * AES encryption in CBC mode. This is the standard mode (the CTR methods
	 * actually use Rijndael-128 in CTR mode, which - technically - isn't AES).
	 * The data length is tucked as a 32-bit unsigned integer (little endian)
	 * after the ciphertext. It supports AES-128 only.
	 *
	 * @param   string  $plaintext  The data to encrypt
	 * @param   string  $password   Encryption password
	 *
	 * @return  string  The ciphertext
	 * @author Nicholas K. Dionysopoulos
	 *
	 * @since  3.0.1
	 */
	public function AESEncryptCBC($plaintext, $password)
	{
		$adapter = $this->getAdapter();

		if (!$adapter->isSupported())
		{
			return false;
		}

		// Get encryption parameters
		$rand          = new RandomValue();
		$params        = $this->getKeyDerivationParameters();
		$useStaticSalt = $params['useStaticSalt'];
		$keySizeBytes  = $params['keySize'];
		$salt          = null;

		if ($useStaticSalt)
		{
			$key = $this->getStaticSaltExpandedKey($password);
		}
		else
		{
			// Create a salt and derive a key from the password using PBKDF2
			$algorithm  = $params['algorithm'];
			$iterations = $params['iterations'];
			$salt       = $rand->generate(64);
			$key        = $this->pbkdf2($password, $salt, $algorithm, $iterations, $keySizeBytes);
		}


		// Also create a new, random IV
		$iv = $rand->generate($keySizeBytes);

		// The ciphertext is the encrypted string...
		$ciphertext = $adapter->encrypt($plaintext, $key, $iv);

		// ...minus the IV which was placed in front
		$ciphertext = substr($ciphertext, $keySizeBytes);

		if (!$useStaticSalt)
		{
			// ...plus the PBKDF2 setup values at the end (68 bytes)...
			$ciphertext .= 'JPST' . $salt;
		}

		// ...plus the IV at the end (20 bytes)...
		$ciphertext .= 'JPIV' . $iv;

		// ...plus the plaintext length (4 bytes).
		$ciphertext .= pack('V', strlen($plaintext));

		return $ciphertext;
	}

	/**
	 * Get the parameters fed into PBKDF2 to expand the user password into an encryption key. These are the static
	 * parameters (key size, hashing algorithm and number of iterations). A new salt is used for each encryption block
	 * to minimize the risk of attacks against the password.
	 *
	 * @return  array
	 */
	public function getKeyDerivationParameters()
	{
		return [
			'keySize'       => 16,
			'algorithm'     => $this->pbkdf2Algorithm,
			'iterations'    => $this->pbkdf2Iterations,
			'useStaticSalt' => $this->pbkdf2UseStaticSalt,
			'staticSalt'    => $this->pbkdf2StaticSalt,
		];
	}

	/**
	 * AES decryption in CBC mode. This is the standard mode (the CTR methods
	 * actually use Rijndael-128 in CTR mode, which - technically - isn't AES).
	 *
	 * It supports AES-128 only. It assumes that the last 4 bytes
	 * contain a little-endian unsigned long integer representing the unpadded
	 * data length.
	 *
	 * @param   string  $ciphertext  The data to encrypt
	 * @param   string  $password    Encryption password
	 *
	 * @return  string  The plaintext
	 * @author Nicholas K. Dionysopoulos
	 *
	 * @since  3.0.1
	 */
	public function AESDecryptCBC($ciphertext, $password)
	{
		$adapter = $this->getAdapter();

		if (!$adapter->isSupported())
		{
			return false;
		}

		// Read the data size
		$data_size = unpack('V', substr($ciphertext, -4));

		// Do I have a PBKDF2 salt?
		$salt             = substr($ciphertext, -92, 68);
		$rightStringLimit = -4;

		$params        = $this->getKeyDerivationParameters();
		$keySizeBytes  = $params['keySize'];
		$algorithm     = $params['algorithm'];
		$iterations    = $params['iterations'];
		$useStaticSalt = $params['useStaticSalt'];

		if (substr($salt, 0, 4) == 'JPST')
		{
			// We have a stored salt. Retrieve it and tell decrypt to process the string minus the last 44 bytes
			// (4 bytes for JPST, 16 bytes for the salt, 4 bytes for JPIV, 16 bytes for the IV, 4 bytes for the
			// uncompressed string length - note that using PBKDF2 means we're also using a randomized IV per the
			// format specification).
			$salt             = substr($salt, 4);
			$rightStringLimit -= 68;

			$key = $this->pbkdf2($password, $salt, $algorithm, $iterations, $keySizeBytes);
		}
		elseif ($useStaticSalt)
		{
			// We have a static salt. Use it for PBKDF2.
			$key = $this->getStaticSaltExpandedKey($password);
		}
		else
		{
			// Get the expanded key from the password. THIS USES THE OLD, INSECURE METHOD.
			$key = $this->expandKey($password);
		}

		// Try to get the IV from the data
		$iv = substr($ciphertext, -24, 20);

		if (substr($iv, 0, 4) == 'JPIV')
		{
			// We have a stored IV. Retrieve it and tell mdecrypt to process the string minus the last 24 bytes
			// (4 bytes for JPIV, 16 bytes for the IV, 4 bytes for the uncompressed string length)
			$iv               = substr($iv, 4);
			$rightStringLimit -= 20;
		}
		else
		{
			// No stored IV. Do it the dumb way.
			$iv = $this->createTheWrongIV($password);
		}

		// Decrypt
		$plaintext = $adapter->decrypt($iv . substr($ciphertext, 0, $rightStringLimit), $key);

		// Trim padding, if necessary
		if (strlen($plaintext) > $data_size)
		{
			$plaintext = substr($plaintext, 0, $data_size);
		}

		return $plaintext;
	}

	/**
	 * That's the old way of creating an IV that's definitely not cryptographically sound.
	 *
	 * DO NOT USE, EVER, UNLESS YOU WANT TO DECRYPT LEGACY DATA
	 *
	 * @param   string  $password  The raw password from which we create an IV in a super bozo way
	 *
	 * @return  string  A 16-byte IV string
	 *
	 * @since   4.6.0
	 * @author  Nicholas K. Dionysopoulos
	 */
	function createTheWrongIV($password)
	{
		static $ivs = [];

		$key = self::md5($password);

		if (!isset($ivs[$key]))
		{
			// Create an Initialization Vector (IV) based on the password, using the same technique as for the key
			$nBytes  = 16; // AES uses a 128 -bit (16 byte) block size, hence the IV size is always 16 bytes
			$pwBytes = [];

			for ($i = 0; $i < $nBytes; $i++)
			{
				$pwBytes[$i] = ord(substr($password, $i, 1)) & 0xff;
			}

			$iv    = $this->Cipher($pwBytes, $this->KeyExpansion($pwBytes));
			$newIV = '';

			foreach ($iv as $int)
			{
				$newIV .= chr($int);
			}

			$ivs[$key] = $newIV;
		}

		return $ivs[$key];
	}

	/*
	 * Unsigned right shift function, since PHP has neither >>> operator nor unsigned ints
	 *
	 * @param a  number to be shifted (32-bit integer)
	 * @param b  number of bits to shift a to the right (0..31)
	 * @return   a right-shifted and zero-filled by b bits
	 */

	/**
	 * Expand the password to an appropriate 128-bit encryption key. THIS CODE IS OBSOLETE. DO NOT USE.
	 *
	 * @param   string  $password
	 *
	 * @return  string
	 *
	 * @since   5.2.0
	 * @author  Nicholas K. Dionysopoulos
	 */
	public function expandKey($password)
	{
		// Try to fetch cached key or create it if it doesn't exist
		$nBits     = 128;
		$lookupKey = self::md5($password . '-' . $nBits);

		if (array_key_exists($lookupKey, $this->passwords))
		{
			$key = $this->passwords[$lookupKey];

			return $key;
		}

		// use AES itself to encrypt password to get cipher key (using plain password as source for
		// key expansion) - gives us well encrypted key.
		$nBytes  = $nBits / 8; // Number of bytes in key
		$pwBytes = [];

		for ($i = 0; $i < $nBytes; $i++)
		{
			$pwBytes[$i] = ord(substr($password, $i, 1)) & 0xff;
		}

		$key    = $this->Cipher($pwBytes, $this->KeyExpansion($pwBytes));
		$key    = array_merge($key, array_slice($key, 0, $nBytes - 16)); // expand key to 16/24/32 bytes long
		$newKey = '';

		foreach ($key as $int)
		{
			$newKey .= chr($int);
		}

		$key = $newKey;

		$this->passwords[$lookupKey] = $key;

		return $key;
	}

	/**
	 * Returns the correct AES-128 CBC encryption adapter
	 *
	 * @return  AdapterInterface
	 *
	 * @since   5.2.0
	 * @author  Nicholas K. Dionysopoulos
	 */
	public function getAdapter()
	{
		static $adapter = null;

		if (is_object($adapter) && ($adapter instanceof AdapterInterface))
		{
			return $adapter;
		}

		$adapter = new OpenSSL();

		if (!$adapter->isSupported())
		{
			$adapter = new Mcrypt();
		}

		return $adapter;
	}

	/**
	 * Returns the length of a string in BYTES, not characters
	 *
	 * @param   string  $string  The string to get the length for
	 *
	 * @return int The size in BYTES
	 */
	public function stringLength($string)
	{
		return function_exists('mb_strlen') ? mb_strlen($string, '8bit') : strlen($string);
	}

	/**
	 * Attempt to use mbstring for getting parts of strings
	 *
	 * @param   string    $string
	 * @param   int       $start
	 * @param   int|null  $length
	 *
	 * @return  string
	 */
	public function subString($string, $start, $length = null)
	{
		return function_exists('mb_substr') ? mb_substr($string, $start, $length, '8bit') :
			substr($string, $start, $length);
	}

	/**
	 * PBKDF2 key derivation function as defined by RSA's PKCS #5: https://www.ietf.org/rfc/rfc2898.txt
	 *
	 * Test vectors can be found here: https://www.ietf.org/rfc/rfc6070.txt
	 *
	 * This implementation of PBKDF2 was originally created by https://defuse.ca
	 * With improvements by http://www.variations-of-shadow.com
	 * Modified for Akeeba Engine by Akeeba Ltd (removed unnecessary checks to make it faster)
	 *
	 * @param   string  $password    The password.
	 * @param   string  $salt        A salt that is unique to the password.
	 * @param   string  $algorithm   The hash algorithm to use. Default is sha1.
	 * @param   int     $count       Iteration count. Higher is better, but slower. Default: 1000.
	 * @param   int     $key_length  The length of the derived key in bytes.
	 *
	 * @return  string  A string of $key_length bytes
	 */
	public function pbkdf2($password, $salt, $algorithm = 'sha1', $count = 1000, $key_length = 16)
	{
		if (function_exists("hash_pbkdf2"))
		{
			return hash_pbkdf2($algorithm, $password, $salt, $count, $key_length, true);
		}

		$hash_length = $this->stringLength(hash($algorithm, "", true));
		$block_count = ceil($key_length / $hash_length);

		$output = "";

		for ($i = 1; $i <= $block_count; $i++)
		{
			// $i encoded as 4 bytes, big endian.
			$last = $salt . pack("N", $i);

			// First iteration
			$xorResult = hash_hmac($algorithm, $last, $password, true);
			$last      = $xorResult;

			// Perform the other $count - 1 iterations
			for ($j = 1; $j < $count; $j++)
			{
				$last      = hash_hmac($algorithm, $last, $password, true);
				$xorResult ^= $last;
			}

			$output .= $xorResult;
		}

		return $this->subString($output, 0, $key_length);
	}

	/**
	 * @return string
	 */
	public function getPbkdf2Algorithm()
	{
		return $this->pbkdf2Algorithm;
	}

	/**
	 * @param   string  $pbkdf2Algorithm
	 *
	 * @return Encrypt
	 */
	public function setPbkdf2Algorithm($pbkdf2Algorithm)
	{
		$this->pbkdf2Algorithm = $pbkdf2Algorithm;

		return $this;
	}

	/**
	 * @return int
	 */
	public function getPbkdf2Iterations()
	{
		return $this->pbkdf2Iterations;
	}

	/**
	 * @param   int  $pbkdf2Iterations
	 *
	 * @return Encrypt
	 */
	public function setPbkdf2Iterations($pbkdf2Iterations)
	{
		$this->pbkdf2Iterations = $pbkdf2Iterations;

		return $this;
	}

	/**
	 * @return int
	 */
	public function getPbkdf2UseStaticSalt()
	{
		return $this->pbkdf2UseStaticSalt;
	}

	/**
	 * @param   int  $pbkdf2UseStaticSalt
	 *
	 * @return Encrypt
	 */
	public function setPbkdf2UseStaticSalt($pbkdf2UseStaticSalt)
	{
		$this->pbkdf2UseStaticSalt = $pbkdf2UseStaticSalt;

		return $this;
	}

	/**
	 * @return string
	 */
	public function getPbkdf2StaticSalt()
	{
		return $this->pbkdf2StaticSalt;
	}

	/**
	 * @param   string  $pbkdf2StaticSalt
	 *
	 * @return Encrypt
	 */
	public function setPbkdf2StaticSalt($pbkdf2StaticSalt)
	{
		$this->pbkdf2StaticSalt = $pbkdf2StaticSalt;

		return $this;
	}

	/**
	 * Get the expanded key from the user supplied password using a static salt. The results are cached for performance
	 * reasons.
	 *
	 * @param   string  $password  The user-supplied password, UTF-8 encoded.
	 *
	 * @return  string  The expanded key
	 */
	public function getStaticSaltExpandedKey($password)
	{
		$params       = $this->getKeyDerivationParameters();
		$keySizeBytes = $params['keySize'];
		$algorithm    = $params['algorithm'];
		$iterations   = $params['iterations'];
		$staticSalt   = $params['staticSalt'];

		$lookupKey = "PBKDF2-$algorithm-$iterations-" . self::md5($password . $staticSalt);

		if (!array_key_exists($lookupKey, $this->passwords))
		{
			$this->passwords[$lookupKey] = $this->pbkdf2($password, $staticSalt, $algorithm, $iterations, $keySizeBytes);
		}

		return $this->passwords[$lookupKey];
	}

	protected function AddRoundKey($state, $w, $rnd, $Nb)
	{
		// xor Round Key into state S [�5.1.4]
		for ($r = 0; $r < 4; $r++)
		{
			for ($c = 0; $c < $Nb; $c++)
			{
				$state[$r][$c] ^= $w[$rnd * 4 + $c][$r];
			}
		}

		return $state;
	}

	protected function SubBytes($s, $Nb)
	{
		// apply SBox to state S [�5.1.1]
		for ($r = 0; $r < 4; $r++)
		{
			for ($c = 0; $c < $Nb; $c++)
			{
				$s[$r][$c] = $this->Sbox[$s[$r][$c]];
			}
		}

		return $s;
	}

	protected function ShiftRows($s, $Nb)
	{
		// shift row r of state S left by r bytes [�5.1.2]
		$t = [4];

		for ($r = 1; $r < 4; $r++)
		{
			// shift into temp copy
			for ($c = 0; $c < 4; $c++)
			{
				$t[$c] = $s[$r][($c + $r) % $Nb];
			}

			// and copy back
			for ($c = 0; $c < 4; $c++)
			{
				$s[$r][$c] = $t[$c];
			}

		}

		// note that this will work for Nb=4,5,6, but not 7,8 (always 4 for AES):

		return $s; // see fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.311.pdf
	}

	protected function MixColumns($s, $Nb)
	{
		// combine bytes of each col of state S [�5.1.3]
		for ($c = 0; $c < 4; $c++)
		{
			$a = [4]; // 'a' is a copy of the current column from 's'
			$b = [4]; // 'b' is a�{02} in GF(2^8)

			for ($i = 0; $i < 4; $i++)
			{
				$a[$i] = $s[$i][$c];
				$b[$i] = $s[$i][$c] & 0x80 ? $s[$i][$c] << 1 ^ 0x011b : $s[$i][$c] << 1;
			}

			// a[n] ^ b[n] is a�{03} in GF(2^8)
			$s[0][$c] = $b[0] ^ $a[1] ^ $b[1] ^ $a[2] ^ $a[3]; // 2*a0 + 3*a1 + a2 + a3
			$s[1][$c] = $a[0] ^ $b[1] ^ $a[2] ^ $b[2] ^ $a[3]; // a0 * 2*a1 + 3*a2 + a3
			$s[2][$c] = $a[0] ^ $a[1] ^ $b[2] ^ $a[3] ^ $b[3]; // a0 + a1 + 2*a2 + 3*a3
			$s[3][$c] = $a[0] ^ $b[0] ^ $a[1] ^ $a[2] ^ $b[3]; // 3*a0 + a1 + a2 + 2*a3
		}

		return $s;
	}

	protected function SubWord($w)
	{
		// apply SBox to 4-byte word w
		for ($i = 0; $i < 4; $i++)
		{
			$w[$i] = $this->Sbox[$w[$i]];
		}

		return $w;
	}

	protected function RotWord($w)
	{
		// rotate 4-byte word w left by one byte
		$tmp = $w[0];

		for ($i = 0; $i < 3; $i++)
		{
			$w[$i] = $w[$i + 1];
		}

		$w[3] = $tmp;

		return $w;
	}

	protected function urs($a, $b)
	{
		$a &= 0xffffffff;
		$b &= 0x1f; // (bounds check)

		if ($a & 0x80000000 && $b > 0)
		{
			// if left-most bit set
			$a = ($a >> 1) & 0x7fffffff; //   right-shift one bit & clear left-most bit
			$a = $a >> ($b - 1); //   remaining right-shifts
		}
		else
		{
			// otherwise
			$a = ($a >> $b); //   use normal right-shift
		}

		return $a;
	}
}
components/com_akeeba/BackupEngine/Util/Statistics.php000060400000016527152453623440017131 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use Exception;

class Statistics
{
	/** @var bool used to block multipart updating initializing the backup */
	private $multipart_lock = true;

	/** @var int The statistics record number of the current backup attempt */
	private $statistics_id = null;

	/** @var array Local cache of the stat record data */
	private $cached_data = [];

	/**
	 * Returns all the filenames of the backup archives for the specified stat record,
	 * or null if the backup type is wrong or the file doesn't exist. It takes into
	 * account the multipart nature of Split Backup Archives.
	 *
	 * @param   array  $stat             The backup statistics record
	 * @param   bool   $skipNonComplete  Skips over backups with no files produced
	 *
	 * @return array|null The filenames or null if it's not applicable
	 */
	public static function get_all_filenames($stat, $skipNonComplete = true)
	{
		// Shortcut for database entries marked as having no files
		if ($stat['filesexist'] == 0)
		{
			return [];
		}

		// Initialize
		$base_directory = @dirname($stat['absolute_path']);
		$base_filename  = $stat['archivename'];
		$filenames      = [$base_filename];

		if (empty($base_filename))
		{
			// This is a backup with a writer which doesn't store files on the server
			return null;
		}

		// Calculate all the filenames for this backup
		if ($stat['multipart'] > 1)
		{
			// Find the base filename and extension
			$dotpos    = strrpos($base_filename, '.');
			$extension = substr($base_filename, $dotpos);
			$basefile  = substr($base_filename, 0, $dotpos);

			// Calculate the multiple names
			$multipart = $stat['multipart'];

			for ($i = 1; $i < $multipart; $i++)
			{
				// Note: For $multipart = 10, it will produce i.e. .z01 through .z10
				// This is intentional. If the backup aborts and multipart=1, we
				// might be stuck with a .z01 file instead of a .zip. So do not
				// change the less than or equal with a straight less than.
				$filenames[] = $basefile . substr($extension, 0, 2) . sprintf('%02d', $i);
			}
		}

		// Check if the files exist, otherwise attempt to provide relocated filename
		$ret = [];

		$ds = DIRECTORY_SEPARATOR;
		// $test_file is the first file which must have been created
		$test_file = count($filenames) == 1 ? $filenames[0] : $filenames[1];

		if (
			(!@file_exists($base_directory . $ds . $test_file)) ||
			(!is_dir($base_directory))
		)
		{
			// The test file wasn't detected. Use the configured output directory.
			$registry       = Factory::getConfiguration();
			$base_directory = $registry->get('akeeba.basic.output_directory');
		}

		foreach ($filenames as $filename)
		{
			// Turn relative path to absolute
			$filename = $base_directory . $ds . $filename;

			// Return the new filename IF IT EXISTS!
			if (!@file_exists($filename))
			{
				$filename = '';
			}

			// Do not return filename for invalid backups
			if (!empty($filename))
			{
				$ret[] = $filename;
			}
		}

		// Edge case: still running backups, we have to brute force the scan
		// of existing files (multipart may be lying)
		if ($stat['status'] == 'run')
		{
			$base_filename = $stat['archivename'];
			$dotpos        = strrpos($base_filename, '.');
			$extension     = substr($base_filename, $dotpos);
			$basefile      = substr($base_filename, 0, $dotpos);

			$registry = Factory::getConfiguration();
			$dirs     = [
				@dirname($stat['absolute_path']),
				$registry->get('akeeba.basic.output_directory'),
			];

			// Look for base file
			foreach ($dirs as $dir)
			{
				if (@file_exists($dir . $ds . $base_filename))
				{
					$ret[] = $dir . $ds . $base_filename;

					break;
				}
			}

			// Look for added files
			$found = true;
			$i     = 0;

			while ($found)
			{
				$i++;
				$found          = false;
				$part_file_name = $basefile . substr($extension, 0, 2) . sprintf('%02d', $i);

				foreach ($dirs as $dir)
				{
					if (@file_exists($dir . $ds . $part_file_name))
					{
						$ret[] = $dir . $ds . $part_file_name;
						$found = true;

						break;
					}
				}
			}
		}

		if ((count($ret) == 0) && $skipNonComplete)
		{
			$ret = null;
		}

		if (!empty($ret) && is_array($ret))
		{
			$ret = array_unique($ret);
		}

		return $ret;
	}

	/**
	 * Releases the initial multipart lock
	 */
	public function release_multipart_lock()
	{
		$this->multipart_lock = false;
	}

	/**
	 * Updates the multipart status of the current backup attempt's statistics record
	 *
	 * @param   int  $multipart  The new multipart status
	 */
	public function updateMultipart($multipart)
	{
		if ($this->multipart_lock)
		{
			return;
		}

		Factory::getLog()->debug('Updating multipart status to ' . $multipart);

		// Cache this change and commit to db only after the backup is done, or failed
		$registry = Factory::getConfiguration();
		$registry->set('volatile.statistics.multipart', $multipart);
	}

	/**
	 * Sets or updates the statistics record of the current backup attempt
	 *
	 * @param   array  $data
	 *
	 * @return bool
	 * @throws Exception
	 */
	public function setStatistics($data)
	{
		$ret = Platform::getInstance()->set_or_update_statistics($this->statistics_id, $data);

		if ($ret === false)
		{
			return false;
		}

		if (!is_null($ret))
		{
			$this->statistics_id = $ret;
		}

		$this->cached_data = array_merge($this->cached_data, $data);

		return true;
	}

	/**
	 * Returns the statistics record ID (used in DB backup classes)
	 * @return int
	 */
	public function getId()
	{
		return $this->statistics_id;
	}

	/**
	 * Returns a copy of the cached data
	 * @return array
	 */
	public function getRecord()
	{
		return $this->cached_data;
	}

	/**
	 * Updates the "in step" flag of the current backup record.
	 *
	 * @param   false  $inStep  Am I currently executing a backup step? False if just finished.
	 *
	 * @return  bool
	 */
	public function updateInStep($inStep = false)
	{
		if (!$this->getId())
		{
			return false;
		}

		$data = $this->getRecord();

		/**
		 * We will only update the instep of running backups for two reasons:
		 *
		 * 1. The very last Kettenrad entry is after the backup process is complete. The record is marked 'complete'. I
		 *    must not touch it in this case.
		 *
		 * 2. When a record is marked 'fail' its instep is also set to 0. This happens in Factory::resetState().
		 */
		//
		if ($data['status'] == 'complete')
		{
			return true;
		}

		$data['instep']    = $inStep ? 1 : 0;
		$data['backupend'] = Platform::getInstance()->get_timestamp_database();

		try
		{
			return $this->setStatistics($data);
		}
		catch (Exception $e)
		{
			return false;
		}
	}
}
components/com_akeeba/BackupEngine/Util/ProfileMigration.php000060400000014073152453623440020243 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use Exception;

/**
 * This helper class is used to migrate Akeeba Backup profiles to the new storage format implemented since version
 * 6.4.1
 *
 * @since       6.4.1
 */
abstract class ProfileMigration
{
	/**
	 * Tries to migrate a backup profile to the new JSON-based storage format used since version 6.4.1.
	 *
	 * @param   int  $profileID  The ID of the profile to migrate
	 *
	 * @return  bool  Whether we converted the profile
	 *
	 * @since   6.4.1
	 */
	public static function migrateProfile($profileID)
	{
		$platform = Platform::getInstance();
		$db       = Factory::getDatabase($platform->get_platform_database_options());

		// Is the database connected?
		if (!$db->connected())
		{
			return false;
		}

		// Load the raw data from the database
		try
		{
			$sql = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
				->select('*')
				->from($db->qn($platform->tableNameProfiles))
				->where($db->qn('id') . ' = ' . $db->q($profileID));

			$rawData = $db->setQuery($sql)->loadAssoc();
		}
		catch (Exception $e)
		{
			return false;
		}

		// Decrypt the configuration data if required
		$rawData['configuration'] = self::decryptConfiguration($rawData['configuration']);
		$migrated                 = false;

		// Migrate the configuration from INI to JSON format
		if (self::looksLikeIni($rawData['configuration']))
		{
			$rawData['configuration'] = self::convertINItoJSON($rawData['configuration']);

			$migrated = true;
		}

		// Migrate the filters from INI to JSON format
		if (self::looksLikeSerialized($rawData['filters']))
		{
			$rawData['filters'] = self::convertSerializedToJSON($rawData['filters']);

			$migrated = true;
		}

		if (!$migrated)
		{
			return false;
		}

		$rawData['configuration'] = self::encryptConfiguration($rawData['configuration']);

		$sql = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
			->update($db->qn($platform->tableNameProfiles))
			->set($db->qn('configuration') . ' = ' . $db->q($rawData['configuration']))
			->set($db->qn('filters') . ' = ' . $db->q($rawData['filters']))
			->where($db->qn('id') . ' = ' . $db->q($profileID));

		$db->setQuery($sql);

		try
		{
			$result = $db->query();
		}
		catch (Exception $exc)
		{
			return false;
		}

		return ($result == true);
	}

	/**
	 * Decrypt the configuration data if necessary. Returns the decrypted data.
	 *
	 * @param   string  $configData  The possibly encrypted data.
	 *
	 * @return  string  The decrypted data
	 *
	 * @since   6.4.1
	 */
	public static function decryptConfiguration($configData)
	{
		$noData    = empty($configData);
		$signature = ($noData || (strlen($configData) < 12)) ? '' : substr($configData, 0, 12);

		if (in_array($signature, ['###AES128###', '###CTR128###']))
		{
			return Factory::getSecureSettings()->decryptSettings($configData);
		}

		return $configData;
	}

	/**
	 * Encrypt the configuration data if necessary.
	 *
	 * @param   string  $configData  The raw configuration data
	 *
	 * @return  string  The possibly encrypted configuration data
	 *
	 * @since   6.4.1
	 */
	public static function encryptConfiguration($configData)
	{
		$secureSettings = Factory::getSecureSettings();

		return $secureSettings->encryptSettings($configData);
	}

	/**
	 * Does the provided configuration data look like it's INI encoded?
	 *
	 * @param   string  $configData  The unencrypted configuration data we read from the database.
	 *
	 * @return  bool
	 *
	 * @since   6.4.1
	 */
	public static function looksLikeIni($configData)
	{
		if (empty($configData))
		{
			return false;
		}

		if (strlen($configData) < 8)
		{
			return false;
		}

		if ((substr($configData, 0, 8) == '[global]') || substr($configData, 0, 8) == '[akeeba]')
		{
			return true;
		}

		return false;
	}

	/**
	 * Convert the INI-encoded data to JSON-encoded data
	 *
	 * @param   string  $configData  The INI-encoded data
	 *
	 * @return  string  The JSON-encoded data
	 *
	 * @since   6.4.1
	 */
	public static function convertINItoJSON($configData)
	{
		$dataArray = ParseIni::parse_ini_file($configData, true, true);

		return json_encode($dataArray, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_FORCE_OBJECT | JSON_PRETTY_PRINT);
	}

	/**
	 * Does the raw filters string provided seems to use serialized data? We actually check if it looks like JSON.
	 * If it's not, we assume it's serialized data.
	 *
	 * @param   string  $rawFilters  The raw filters string
	 *
	 * @return  bool  Does it look like a serialized string?
	 *
	 * @since   6.4.1
	 */
	public static function looksLikeSerialized($rawFilters)
	{
		if (empty($rawFilters))
		{
			return false;
		}

		if (substr($rawFilters, 0, 1) == '{')
		{
			return false;
		}

		return true;
	}

	/**
	 * Convert the serialized array in $rawFilters to JSON representation
	 *
	 * @param   string  $rawFilters  Raw serialized string
	 *
	 * @return  string  JSON-encoded string
	 *
	 * @since   6.4.1
	 */
	public static function convertSerializedToJSON($rawFilters)
	{
		$filters = unserialize($rawFilters);

		if (empty($filters))
		{
			$filters = [];
		}

		return json_encode($filters, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_FORCE_OBJECT | JSON_PRETTY_PRINT);
	}
}
components/com_akeeba/BackupEngine/Util/Logger.php000060400000035407152453623440016214 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use Akeeba\Engine\Util\Log\LogInterface;
use Akeeba\Engine\Util\Log\WarningsLoggerAware;
use Akeeba\Engine\Util\Log\WarningsLoggerInterface;
use Akeeba\Engine\Psr\Log\InvalidArgumentException;
use Akeeba\Engine\Psr\Log\LoggerInterface;
use Akeeba\Engine\Psr\Log\LogLevel;

/**
 * Writes messages to the backup log file
 */
class Logger implements LoggerInterface, LogInterface, WarningsLoggerInterface
{
	use WarningsLoggerAware;

	/** @var  string  Full path to log file */
	protected $logName = null;

	/** @var  string  The current log tag */
	protected $currentTag = null;

	/** @var  resource  The file pointer to the current log file */
	protected $fp = null;

	/** @var  bool  Is the logging currently paused? */
	protected $paused = false;

	/** @var  int  The minimum log level */
	protected $configuredLoglevel;

	/** @var  string  The untranslated path to the site's root */
	protected $site_root_untranslated;

	/** @var  string  The translated path to the site's root */
	protected $site_root;

	/**
	 * Public constructor. Initialises the properties with the parameters from the backup profile and platform.
	 */
	public function __construct()
	{
		$this->initialiseWithProfileParameters();
	}

	/**
	 * When shutting down this class always close any open log files.
	 */
	public function __destruct()
	{
		$this->close();
	}

	/**
	 * Clears the logfile
	 *
	 * @param   string  $tag  Backup origin
	 */
	public function reset($tag = null)
	{
		// Pause logging
		$this->pause();

		// Get the file names for the default log and the tagged log
		$currentLogName = $this->logName;
		$this->logName  = $this->getLogFilename($tag);

		// Close the file if it's open
		if ($currentLogName == $this->logName)
		{
			$this->close();
		}

		// Remove the log file if it exists
		@unlink($this->logName);

		// Reset the log file
		$fp = @fopen($this->logName, 'w');
		$hasWritten = false;

		if ($fp !== false)
		{
			$hasWritten = fwrite($fp, '<' . '?' . 'php die(); ' . '?' . '>' . "\n") !== false;
			@fclose($fp);
		}

		// If I could not write to a .log.php file try using a .log file instead.
		if (!$hasWritten)
		{
			$this->logName  = $this->getLogFilename($tag, '');
			$fp = @fopen($this->logName, 'w');
			$hasWritten = false;

			if ($fp !== false)
			{
				$hasWritten = fwrite($fp, "\n") !== false;
				@fclose($fp);
			}
		}

		// Delete the default log file(s) if they exists
		$defaultLog     = $this->getLogFilename(null);

		if (!empty($tag) && @file_exists($defaultLog))
		{
			@unlink($defaultLog);
		}

		$defaultLog     = $this->getLogFilename(null, '');

		if (!empty($tag) && @file_exists($defaultLog))
		{
			@unlink($defaultLog);
		}

		// Set the current log tag
		$this->currentTag = $tag;

		// Unpause logging
		$this->unpause();
	}

	/**
	 * Writes a line to the log, if the log level is high enough
	 *
	 * @param   string  $level    The log level
	 * @param   string  $message  The message to write to the log
	 * @param   array   $context  The logging context. For PSR-3 compatibility but not used in text file logs.
	 *
	 * @return  void
	 */
	public function log($level, $message = '', array $context = [])
	{
		// Warnings are enqueued no matter what is the minimum log level to report in the log file
		if (in_array($level, [LogLevel::WARNING, LogLevel::NOTICE]))
		{
			$this->enqueueWarning($message);
		}

		// If we are told to not log anything we can't continue
		if ($this->configuredLoglevel == 0)
		{
			return;
		}

		// Open the log if it's closed
		if (is_null($this->fp))
		{
			$this->open($this->currentTag);
		}

		// If the log could not be opened we can't continue
		if (is_null($this->fp))
		{
			return;
		}

		// If the logging is paused we can't continue
		if ($this->paused)
		{
			return;
		}

		// Get the log level as an integer (compatibility with our minimum log level configuration parameter)
		switch ($level)
		{
			case LogLevel::EMERGENCY:
			case LogLevel::ALERT:
			case LogLevel::CRITICAL:
			case LogLevel::ERROR:
				$intLevel = 1;
				break;

			case LogLevel::WARNING:
			case LogLevel::NOTICE:
				$intLevel = 2;
				break;

			case LogLevel::INFO:
				$intLevel = 3;
				break;

			case LogLevel::DEBUG:
				$intLevel = 4;
				break;

			default:
				throw new InvalidArgumentException("Unknown log level $level", 500);
				break;
		}

		// If the minimum log level is lower than what we're trying to log we cannot continue
		if ($this->configuredLoglevel < $intLevel)
		{
			return;
		}

		$translateRoot = true;

		if (array_key_exists('root_translate', $context))
		{
			$translateRoot = ($context['root_translate'] === 1) || ($context['root_translate'] === '1') || ($context['root_translate'] === true);
		}

		// Replace the site's root with <root> in the log file
		if ($translateRoot && !defined('AKEEBADEBUG'))
		{
			$message = str_replace($this->site_root_untranslated, "<root>", $message);
			$message = str_replace($this->site_root, "<root>", $message);
		}

		// Replace new lines
		$message = str_replace("\r\n", "\n", $message);
		$message = str_replace("\r", "\n", $message);
		$message = str_replace("\n", ' \n ', $message);

		switch ($level)
		{
			case LogLevel::EMERGENCY:
			case LogLevel::ALERT:
			case LogLevel::CRITICAL:
			case LogLevel::ERROR:
				$string = "ERROR   |";
				break;

			case LogLevel::WARNING:
			case LogLevel::NOTICE:
				$string = "WARNING |";
				break;

			case LogLevel::INFO:
				$string = "INFO    |";
				break;

			default:
				$string = "DEBUG   |";
				break;
		}

		$string .= gmdate('Ymd H:i:s') . "|$message\r\n";

		@fwrite($this->fp, $string);
	}

	/**
	 * Calculates the absolute path to the log file
	 *
	 * @param   string  $tag  The backup run's tag
	 *
	 * @return    string    The absolute path to the log file
	 */
	public function getLogFilename($tag = null, $extension = '.php')
	{
		if (empty($tag))
		{
			$fileName = 'akeeba.log' . $extension;
		}
		else
		{
			$fileName = "akeeba.$tag.log" . $extension;
		}

		// Get output directory
		$registry        = Factory::getConfiguration();
		$outputDirectory = $registry->get('akeeba.basic.output_directory');

		// Get the log file name
		$absoluteLogFilename = Factory::getFilesystemTools()->TranslateWinPath($outputDirectory . DIRECTORY_SEPARATOR . $fileName);

		return $absoluteLogFilename;
	}

	/**
	 * Close the currently active log and set the current tag to null.
	 *
	 * @return  void
	 */
	public function close()
	{
		// The log file changed. Close the old log.
		if (is_resource($this->fp))
		{
			@fclose($this->fp);
		}

		$this->fp         = null;
		$this->currentTag = null;
	}

	/**
	 * Open a new log instance with the specified tag. If another log is already open it is closed before switching to
	 * the new log tag. If the tag is null use the default log defined in the logging system.
	 *
	 * @param   string|null  $tag  The log to open
	 *
	 * @return void
	 */
	public function open($tag = null, $extension = '.php')
	{
		// If the log is already open do nothing
		if (is_resource($this->fp) && ($tag == $this->currentTag))
		{
			return;
		}

		// If another log is open, close it
		if (is_resource($this->fp))
		{
			$this->close();
		}

		// Re-initialise site root and minimum log level since the active profile might have changed in the meantime
		$this->initialiseWithProfileParameters();

		// Set the current tag
		$this->currentTag = $tag;

		// Get the log filename
		$this->logName = $this->getLogFilename($tag, $extension);

		// Touch the file
		@touch($this->logName);

		// Open the log file. DO NOT USE APPEND ('ab') MODE. I NEED TO SEEK INTO THE FILE. SEE FURTHER BELOW!
		$this->fp = @fopen($this->logName, 'c');

		// If we couldn't open the file set the file pointer to null
		if ($this->fp === false)
		{
			$this->fp = null;

			return;
		}

		// Go to the end of the file, emulating append mode. DO NOT REPLACE THE fopen() FILE MODE!
		if (@fseek($this->fp, 0, SEEK_END) === -1)
		{
			@fclose($this->fp);
			@unlink($this->logName);

			$this->fp = null;

			return;
		}

		/**
		 * The following sounds pretty stupid but there is a reason for that convoluted code.
		 *
		 * Some hosts, like WP Engine, will now allow you to write to a log file with a .php extension. The code below
		 * tries to anticipate that when the log extension is .php. It will try to write to the *.log.php file and the
		 * text is actually resembling PHP code. Hosts like WP Engine will fail the fwrite() which will cause this
		 * method to terminate early and return a null pointer. Our code will catch this case and try to use a .log
		 * extension as a safe fallback.
		 */
		if ($extension !== '.php')
		{
			return;
		}

		// Try to write something into the file
		$written = @fwrite($this->fp, '<?php die("test"); ?>' . "\n");

		if ($written === false)
		{
			@fclose($this->fp);
			@unlink($this->logName);

			$this->fp = null;

			$this->open($tag, '');

			return;
		}

		// Store truncate offset, we will have to rewind the internal pointer to it
		$truncate_point = ftell($this->fp) - $written;

		if (ftruncate($this->fp, $truncate_point) === false)
		{
			@fclose($this->fp);
			@unlink($this->logName);

			$this->fp = null;

			$this->open($tag, '');

			return;
		}

		// Finally, move the file pointer at the truncation point. Otherwise PHP will append NULL bytes to the string
		// to "pad" the file length to the internal file pointer. No need to check if the operation was successful,
		// worst case scenario we will have some extra NULL bytes, there's no need to kill the log operation
		@fseek($this->fp, $truncate_point);
	}

	/**
	 * Temporarily pause log output. The log() method MUST respect this.
	 *
	 * @return  void
	 */
	public function pause()
	{
		$this->paused = true;
	}

	/**
	 * Resume the previously paused log output. The log() method MUST respect this.
	 *
	 * @return  void
	 */
	public function unpause()
	{
		$this->paused = false;
	}

	/**
	 * Returns the timestamp (in UNIX time long integer format) of the last log message written to the log with the
	 * specific tag. The timestamp MUST be read from the log itself, not from the logger object. It is used by the
	 * engine to find out the age of stalled backups which may have crashed.
	 *
	 * @param   string|null  $tag  The log tag for which the last timestamp is returned
	 *
	 * @return  int|null  The timestamp of the last log message, in UNIX time. NULL if we can't get the timestamp.
	 */
	public function getLastTimestamp($tag = null)
	{
		$fileName = $this->getLogFilename($tag);

		/**
		 * The log file akeeba.tag.log.php may not exist but the akeeba.tag.log does. This would be the case in some bad
		 * hosts, like WPEngine, which do not allow us to create .php files EVEN THOUGH that's the only way to ensure
		 * the privileged information in the log file is not readable over the web. You can't fix bad hosts, you can
		 * only work around them.
		 */
		if (!@file_exists($fileName) && @file_exists(substr($fileName, 0, -4)))
		{
			$fileName = substr($fileName, 0, -4);
		}

		$timestamp = @filemtime($fileName);

		if ($timestamp === false)
		{
			return null;
		}

		return $timestamp;
	}

	/**
	 * System is unusable.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return void
	 */
	public function emergency($message, array $context = [])
	{
		$this->log(LogLevel::EMERGENCY, $message, $context);
	}

	/**
	 * Action must be taken immediately.
	 *
	 * Example: Entire website down, database unavailable, etc. This should
	 * trigger the SMS alerts and wake you up.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return void
	 */
	public function alert($message, array $context = [])
	{
		$this->log(LogLevel::ALERT, $message, $context);
	}

	/**
	 * Critical conditions.
	 *
	 * Example: Application component unavailable, unexpected exception.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return void
	 */
	public function critical($message, array $context = [])
	{
		$this->log(LogLevel::CRITICAL, $message, $context);
	}

	/**
	 * Runtime errors that do not require immediate action but should typically
	 * be logged and monitored.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return void
	 */
	public function error($message, array $context = [])
	{
		$this->log(LogLevel::ERROR, $message, $context);
	}

	/**
	 * \Exceptional occurrences that are not errors.
	 *
	 * Example: Use of deprecated APIs, poor use of an API, undesirable things
	 * that are not necessarily wrong.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return void
	 */
	public function warning($message, array $context = [])
	{
		$this->log(LogLevel::WARNING, $message, $context);
	}

	/**
	 * Normal but significant events.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return void
	 */
	public function notice($message, array $context = [])
	{
		$this->log(LogLevel::NOTICE, $message, $context);
	}

	/**
	 * Interesting events.
	 *
	 * Example: User logs in, SQL logs.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return void
	 */
	public function info($message, array $context = [])
	{
		$this->log(LogLevel::INFO, $message, $context);
	}

	/**
	 * Detailed debug information.
	 *
	 * @param   string  $message
	 * @param   array   $context
	 *
	 * @return void
	 */
	public function debug($message, array $context = [])
	{
		$this->log(LogLevel::DEBUG, $message, $context);
	}

	/**
	 * Initialise the logger properties with parameters from the backup profile and the platform
	 *
	 * @return  void
	 */
	protected function initialiseWithProfileParameters()
	{
		// Get the site's translated and untranslated root
		$this->site_root_untranslated = Platform::getInstance()->get_site_root();
		$this->site_root              = Factory::getFilesystemTools()->TranslateWinPath($this->site_root_untranslated);

		// Load the registry and fetch log level
		$registry                 = Factory::getConfiguration();
		$this->configuredLoglevel = $registry->get('akeeba.basic.log_level');
		$this->configuredLoglevel = $this->configuredLoglevel * 1;
	}
}
components/com_akeeba/BackupEngine/Util/ListingParser.php000060400000026701152453623440017560 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util;

defined('AKEEBAENGINE') || die();

/**
 * Parses directory listings of the standard UNIX or MS-DOS style, i.e. what is most commonly returned by FTP and SFTP
 * servers running on *NIX and Windows machines.
 *
 * This class is intended to be used with the result RemoteResourceInterface::getRawList, parsing the raw folder listing
 * returned by an (S)FTP server -meant to be read by a human- into something you can programmatically work with. Using
 * RemoteResourceInterface::getWrapperStringFor with DirectoryIterator is generally preferable, if only much slower due
 * to the synchronous nature of remote stat() requests on each iterated element.
 */
class ListingParser
{
	/**
	 * Parse a UNIX- or MS-DOS-style directory listing.
	 *
	 * You get a hash array with entries. Each entry has the following keys:
	 * name:    the file / folder name.
	 * type:    file, dir or link.
	 * target:  link target (when type == link).
	 * user:    owner user, numeric or text. IIS FTP fakes this with the literal string "owner".
	 * group:   owner group, numeric or text. IIS FTP fakes this with the literal string "group".
	 * size:    size in bytes; note that some Linux servers report non-zero sizes for directories.
	 * date:    file creation date, most likely blatantly wrong; see below
	 * perms:   permissions in decimal format. Cast with dec2oct to get the 4 digit permissions string, e.g. 1755
	 *
	 * Important Notes
	 *
	 * Some UNIX systems report a size for directories. Do not assume that something is a directory if it's size is 0,
	 * you will be surprised. Look at the 'type' element instead.
	 *
	 * Dates can be off. UNIX-style directory listings state either the year or the time, not both. If the file was
	 * modified during this year you will get a date with a resolution of 1 minute. If the file was modified on a
	 * different year you'll get a date with a resolution of 1 day. MS-DOS listings always contain the time. Again, the
	 * resolution is 1 minute.
	 *
	 * Most MS-DOS style listings don't list junctions and symlinks. As a result they will be reported as regular
	 * directories / files. This is the case for the IIS FTP server. Other servers may return the raw "dir" command
	 * results (as CMD.EXE would parse it) in which case links and link targets do get reported.
	 *
	 * @param   string  $list   The raw listing
	 * @param   bool    $quick  True to only include name, type, size and link target for each file.
	 *
	 * @return  array
	 */
	public function parseListing($list, $quick = false)
	{
		$res = $this->parseUnixListing($list, $quick);

		if (empty($res))
		{
			$res = $this->parseMSDOSListing($list, $quick);
		}

		return $res;
	}

	/**
	 * Parse a UNIX-style directory listing. This is the format produced by ls -la on *NIX systems.
	 *
	 * You get a hash array with entries. Each entry has the following keys:
	 * name: the file / folder name.
	 * type: file, dir or link.
	 * target: link target (when type == link).
	 * user: owner user, numeric or text. IIS FTP fakes this with the literal string "owner".
	 * group: owner group, numeric or text. IIS FTP fakes this with the literal string "group".
	 * size: size in bytes; note that some Linux servers report non-zero sizes for directories.
	 * date: file creation date, most likely blatantly wrong; see below
	 * perms: permissions in decimal format. Cast with dec2oct to get the 4 digit permissions string, e.g. 1755
	 *
	 * @param   string  $list   The raw listing
	 * @param   bool    $quick  True to only include name, type, size and link target for each file.
	 *
	 * @return  array
	 */
	protected function parseUnixListing($list, $quick = false)
	{
		$ret = [];

		$list = str_replace(["\r\n", "\r", "\n\n"], ["\n", "\n", "\n"], $list);
		$list = explode("\n", $list);
		$list = array_map('rtrim', $list);

		foreach ($list as $v)
		{
			$vInfo = preg_split("/[\s]+/", $v, 9);

			if ((is_array($vInfo) || $vInfo instanceof \Countable ? count($vInfo) : 0) != 9)
			{
				continue;
			}

			$entry = [
				'name'   => '',
				'type'   => 'file',
				'target' => '',
				'user'   => '0',
				'group'  => '0',
				'size'   => '0',
				'date'   => '0',
				'perms'  => '0',
			];

			if ($quick)
			{
				$entry = [
					'name'   => '',
					'type'   => 'file',
					'size'   => '0',
					'target' => '',
				];
			}

			// ===== Parse permissions =====
			$permString    = $vInfo[0];
			$permStringLen = strlen($permString);
			$typeBit       = '-';
			$userPerms     = 'r--';
			$groupPerms    = 'r--';
			$otherPerms    = 'r--';

			if ($permStringLen)
			{
				$typeBit = substr($permString, 0, 1);
			}

			switch ($typeBit)
			{
				case "d":
					$entry['type'] = 'dir';
					break;

				case "l":
					$entry['type'] = 'link';
					break;
			}

			// ===== Parse size =====
			$entry['size'] = $vInfo[4];

			if (!$quick)
			{
				if ($permStringLen >= 4)
				{
					$userPerms = substr($permString, 1, 3);
				}

				if ($permStringLen >= 7)
				{
					$groupPerms = substr($permString, 4, 3);
				}

				if ($permStringLen >= 10)
				{
					$otherPerms = substr($permString, 7, 3);
				}

				$bitPart   = 0;
				$permsPart = '';

				[$thisPerms, $thisBit] = $this->textPermsDecode($userPerms);
				$bitPart   += 4 * $thisBit; // SetUID
				$permsPart .= $thisPerms;

				[$thisPerms, $thisBit] = $this->textPermsDecode($groupPerms);
				$bitPart   += 2 * $thisBit; // SetGID
				$permsPart .= $thisPerms;

				[$thisPerms, $thisBit] = $this->textPermsDecode($otherPerms);
				$bitPart   += $thisBit; // Sticky (restricted deletion)
				$permsPart .= $thisPerms;

				$entry['perms'] = octdec($bitPart . $permsPart);

				// ===== Parse ownership =====
				$entry['user']  = $vInfo[2];
				$entry['group'] = $vInfo[3];

				// ===== Parse date =====
				$dateString    = $vInfo[6] . ' ' . $vInfo[5] . ' ' . $vInfo[7];
				$x             = date_create($dateString);
				$entry['date'] = ($x === false) ? 0 : $x->getTimestamp();
			}

			// ===== Parse name =====
			$name = $vInfo[8];

			// Ubuntu (possibly others?) tacks a start when either suid/sgid bits is set
			if (substr($name, -1) == '*')
			{
				$name = substr($name, 0, -1);
			}

			// Link target parsing
			if (strpos($name, '->') !== false)
			{
				[$name, $target] = explode('->', $name);

				$entry['target'] = trim($target);
			}

			$entry['name'] = trim($name);

			// ===== Return the entry =====
			$ret[] = $entry;
		}

		return $ret;
	}

	/**
	 * Parse am MS-DOS-style directory listing. This is the format produced by dir on MS-DOS and Windows systems.
	 *
	 * You get a hash array with entries. Each entry has the following keys:
	 * name: the file / folder name.
	 * type: file, dir or link.
	 * target: link target (when type == link).
	 * user: owner user, numeric or text. IIS FTP fakes this with the literal string "owner".
	 * group: owner group, numeric or text. IIS FTP fakes this with the literal string "group".
	 * size: size in bytes; note that some Linux servers report non-zero sizes for directories.
	 * date: file creation date, most likely blatantly wrong; see below
	 * perms: permissions in decimal format. Cast with dec2oct to get the 4 digit permissions string, e.g. 1755
	 *
	 * @param   string  $list   The raw listing
	 * @param   bool    $quick  True to only include name, type, size and link target for each file.
	 *
	 * @return  array
	 */
	protected function parseMSDOSListing($list, $quick = false)
	{
		$ret = [];

		$list = str_replace(["\r\n", "\r", "\n\n"], ["\n", "\n", "\n"], $list);
		$list = explode("\n", $list);
		$list = array_map('rtrim', $list);

		foreach ($list as $v)
		{
			$vInfo = preg_split("/[\s]+/", $v, 5);

			if ((is_array($vInfo) || $vInfo instanceof \Countable ? count($vInfo) : 0) < 4)
			{
				continue;
			}

			$entry = [
				'name'   => '',
				'type'   => 'file',
				'target' => '',
				'user'   => '0',
				'group'  => '0',
				'size'   => '0',
				'date'   => '0',
				'perms'  => '0',
			];

			if ($quick)
			{
				$entry = [
					'name'   => '',
					'type'   => 'file',
					'size'   => '0',
					'target' => '',
				];
			}

			// The first two fields are date and time
			$dateString = $vInfo[0] . ' ' . $vInfo[1];

			// If position 2 is AM/PM append it and remove it from the list
			if (in_array(strtoupper($vInfo[2]), ['AM', 'PM']))
			{
				$dateString .= ' ' . $vInfo[2];

				// This trick is required to remove the element and fix the indices for the rest of the parsing to work.
				unset ($vInfo[2]);
				$vInfo = array_merge($vInfo);
			}

			if (!$quick)
			{
				$x             = date_create($dateString);
				$entry['date'] = ($x === false) ? 0 : $x->getTimestamp();
			}

			// The third field is either a special type indicator or the file size
			switch (strtoupper($vInfo[2]))
			{
				// Regular directory
				case '<DIR>':
					$entry['type'] = 'dir';
					break;

				// Junction (like a directory symlink, pre-Win7)
				case '<JUNCTION>':
					// File symlink
				case '<SYMLINK>':
					// Directory symlink
				case '<SYMLINKD>':
					$entry['type'] = 'link';
					break;

				default:
					$entry['size'] = (int) $vInfo[2];
					break;
			}

			// And finally the file name. If it's a link it's in the format 'name [target]'
			preg_match('/(.*)[\s]+\[(.*)\]/', $vInfo[3], $matches);

			if (empty($matches))
			{
				$entry['name'] = $vInfo[3];
			}
			else
			{
				$entry['type']   = 'link';
				$entry['name']   = $matches[1];
				$entry['target'] = $matches[2];
			}

			// ===== Return the entry =====
			$ret[] = $entry;
		}

		return $ret;
	}

	/**
	 * Decode a textual permissions representation for a user, group or others to a pair of octal digits (permissions
	 * and flags). For example "r--" is converted to [4, 0], "r-x" to [5, 0], "r-t" to [5, 1]
	 *
	 * @param   string  $perms  The textual permissions representation for a user, group or others
	 *
	 * @return  array  Two octal digits for permissions and flags (suid/sgid/sticky bit)
	 */
	private function textPermsDecode($perms)
	{
		$permBit  = 0;
		$flagBits = 0;

		if (strpos($perms, 'r'))
		{
			$permBit += 4;
		}

		if (strpos($perms, 'w'))
		{
			$permBit += 2;
		}

		/**
		 * Both s and t denote flag set and imply the execute permissions is also granted. For user/groups it's
		 * SetUID/SetGID respectively, for others it's the "sticky" bit (restricted deletion). Since only one of x, s
		 * and t can be present at one time we use an if/elseif block. I don't use a switch because a. I am not 100%
		 * sure that all servers will report the text permissions in rwx order and b. I am not sure that switch and
		 * substr are faster than strpos (and too lazy to benchmark; sorry).
		 */
		if (strpos($perms, 'x'))
		{
			$permBit += 1;
		}
		elseif (strpos($perms, 't'))
		{
			$flagBits += 1;
		}
		elseif (strpos($perms, 's'))
		{
			$flagBits += 1;
		}

		return [$permBit, $flagBits];
	}
}
components/com_akeeba/BackupEngine/Util/ConfigurationCheck.php000060400000034715152453623440020543 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;

/**
 * Quirk detection helper class
 */
class ConfigurationCheck
{
	/**
	 * The configuration checks to perform
	 *
	 * @var  array
	 */
	protected $configurationChecks = [
		['code'        => '001', 'severity' => 'critical', 'callback' => [null, 'q001'],
		 'description' => 'COM_AKEEBA_CPANEL_WARNING_Q001',
		],
		['code'        => '003', 'severity' => 'critical', 'callback' => [null, 'q003'],
		 'description' => 'COM_AKEEBA_CPANEL_WARNING_Q003',
		],
		['code'        => '004', 'severity' => 'critical', 'callback' => [null, 'q004'],
		 'description' => 'COM_AKEEBA_CPANEL_WARNING_Q004',
		],

		['code'        => '101', 'severity' => 'high', 'callback' => [null, 'q101'],
		 'description' => 'COM_AKEEBA_CPANEL_WARNING_Q101',
		],
		['code'        => '103', 'severity' => 'high', 'callback' => [null, 'q103'],
		 'description' => 'COM_AKEEBA_CPANEL_WARNING_Q103',
		],
		['code'        => '104', 'severity' => 'high', 'callback' => [null, 'q104'],
		 'description' => 'COM_AKEEBA_CPANEL_WARNING_Q104',
		],
		['code'        => '106', 'severity' => 'high', 'callback' => [null, 'q106'],
		 'description' => 'COM_AKEEBA_CPANEL_WARNING_Q106',
		],

		['code'        => '201', 'severity' => 'medium', 'callback' => [null, 'q201'],
		 'description' => 'COM_AKEEBA_CPANEL_WARNING_Q201',
		],
		['code'        => '202', 'severity' => 'medium', 'callback' => [null, 'q202'],
		 'description' => 'COM_AKEEBA_CPANEL_WARNING_Q202',
		],
		['code'        => '204', 'severity' => 'medium', 'callback' => [null, 'q204'],
		 'description' => 'COM_AKEEBA_CPANEL_WARNING_Q204',
		],

		['code'        => '203', 'severity' => 'medium', 'callback' => [null, 'q203'],
		 'description' => 'COM_AKEEBA_CPANEL_WARNING_Q203',
		],
//		['code'        => '401', 'severity' => 'low', 'callback' => [null, 'q401'],
//		 'description' => 'COM_AKEEBA_CPANEL_WARNING_Q401',
//		],
	];

	/**
	 * The public constructor replaces the missing object reference in the configuration check callbacks
	 */
	function __construct()
	{
		$temp = [];

		foreach ($this->configurationChecks as $check)
		{
			$check['callback'] = [$this, $check['callback'][1]];
			$temp[]            = $check;
		}

		$this->configurationChecks = $temp;
	}

	/**
	 * Returns the output & temporary folder writable status
	 *
	 * @return  array  A hash array with the writable status
	 */
	public function getFolderStatus()
	{
		static $status = null;

		if (is_null($status))
		{
			$stock_dirs = Platform::getInstance()->get_stock_directories();

			// Get output writable status
			$registry = Factory::getConfiguration();
			$outdir   = $registry->get('akeeba.basic.output_directory');

			foreach ($stock_dirs as $macro => $replacement)
			{
				$outdir = str_replace($macro, $replacement, $outdir);
			}

			$status['output'] = @is_writable($outdir);
		}

		return $status;
	}

	/**
	 * Returns the overall status. It's true when both the temporary and output directories are writable and there are
	 * no critical configuration check failures.
	 *
	 * @return  boolean
	 */
	public function getShortStatus()
	{
		// Base the status on directory writeable status
		$status = $this->getFolderStatus();
		$ret    = $status['output'];

		// Scan for high severity configuration check errors
		$detailedStatus = $this->getDetailedStatus();

		if (!empty($detailedStatus))
		{
			foreach ($detailedStatus as $configCheck)
			{
				if ($configCheck['severity'] == 'critical')
				{
					$ret = false;
				}
			}
		}

		// Return status
		return $ret;
	}

	/**
	 * Add a configuration check definition
	 *
	 * @param   string  $code         The configuration check code (three digit number)
	 * @param   string  $severity     The severity (low, medium, high, critical)
	 * @param   string  $description  The description key for this configuration check
	 * @param   null    $callback     The callback used to determine the status of the configuration check
	 *
	 * @return  void
	 */
	public function addConfigurationCheckDefinition($code, $severity = 'low', $description = null, $callback = null)
	{
		if (!is_callable($callback))
		{
			$callback = [$this, 'q' . $code];
		}

		if (empty($description))
		{
			$description = 'COM_AKEEBA_CPANEL_WARNING_Q' . $code;
		}

		$newConfigurationCheck = [
			'code'        => $code,
			'severity'    => $severity,
			'description' => $description,
			'callback'    => $callback,
		];

		$this->configurationChecks[$code] = $newConfigurationCheck;
	}

	/**
	 * Remove a configuration check definition
	 *
	 * @param   string  $code  The code of the configuration check to remove
	 *
	 * @return  void
	 */
	public function removeConfigurationCheckDefinition($code)
	{
		if (isset($this->configurationChecks[$code]))
		{
			unset($this->configurationChecks[$code]);
		}
	}

	/**
	 * Clear the configuration check definitions
	 *
	 * @return  void
	 */
	public function clearConfigurationCheckDefinitions()
	{
		$this->configurationChecks = [];
	}

	/**
	 * Runs the configuration check scripts. These are potential problems related to server
	 * configuration, out of Akeeba's control. They are intended to give the user a
	 * chance to fix them before they cause the backup to fail.
	 *
	 * Numbering scheme:
	 * Q0xx    No-go errors
	 * Q1xx    Critical system configuration errors
	 * Q2xx    Medium and low system configuration warnings
	 * Q3xx    Critical software configuration errors
	 * Q4xx    Medium and low component configuration warnings
	 *
	 * @param   boolean  $low_priority       Should I include low priority quirks?
	 * @param   string   $help_url_template  The sprintf template from creating a help URL from a config check code
	 *
	 * @return  array
	 */
	public function getDetailedStatus($low_priority = false, $help_url_template = 'https://www.akeeba.com/documentation/warnings/q%s.html')
	{
		static $detailedStatus = null;

		if (is_null($detailedStatus) || $low_priority)
		{
			$detailedStatus = [];

			foreach ($this->configurationChecks as $quirkDef)
			{
				if (!$low_priority && ($quirkDef['severity'] == 'low'))
				{
					continue;
				}

				$this->checkConfiguration($detailedStatus, $quirkDef, $help_url_template);
			}
		}

		return $detailedStatus;
	}

	/**
	 * Checks if a path is restricted by open_basedirs
	 *
	 * @param   string  $check  The path to check
	 *
	 * @return  bool  True if the path is restricted (which is bad)
	 */
	public function checkOpenBasedirs($check)
	{
		static $paths;

		if (empty($paths))
		{
			$open_basedir = ini_get('open_basedir');

			if (empty($open_basedir))
			{
				return false;
			}

			$delimiter  = strpos($open_basedir, ';') !== false ? ';' : ':';
			$paths_temp = explode($delimiter, $open_basedir);

			// Some open_basedirs are using environemtn variables
			$paths = [];

			foreach ($paths_temp as $path)
			{
				if (array_key_exists($path, $_ENV))
				{
					$paths[] = $_ENV[$path];
				}
				else
				{
					$paths[] = $path;
				}
			}
		}

		if (empty($paths))
		{
			return false; // no restrictions
		}
		else
		{
			$newcheck = @realpath($check); // Resolve symlinks, like PHP does

			if (!($newcheck === false))
			{
				$check = $newcheck;
			}

			$included = false;

			foreach ($paths as $path)
			{
				$newpath = @realpath($path);

				if (!($newpath === false))
				{
					$path = $newpath;
				}

				if (strlen($check) >= strlen($path))
				{
					// Only check if the path to check is longer than the inclusion path.
					// Otherwise, I guarantee it's not included!!
					// If the path to check begins with an inclusion path, it's permitted. Easy, huh?
					if (substr($check, 0, strlen($path)) == $path)
					{
						$included = true;
					}
				}
			}

			return !$included;
		}
	}

	/**
	 * Make a configuration check and adds it to the list if it raises a warning / error
	 *
	 * @param   array   $detailedStatus     The configuration checks status array
	 * @param   array   $quirkDef           The configuration check definition
	 * @param   string  $help_url_template  The sprintf template from creating a help URL from a quirk code
	 *
	 * @return  void
	 */
	protected function checkConfiguration(&$detailedStatus, $quirkDef, $help_url_template)
	{
		if (call_user_func($quirkDef['callback']))
		{
			$description = Platform::getInstance()->translate($quirkDef['description']);

			$detailedStatus[(string) $quirkDef['code']] = [
				'code'        => $quirkDef['code'],
				'severity'    => $quirkDef['severity'],
				'description' => $description,
				'help_url'    => sprintf($help_url_template, $quirkDef['code']),
			];
		}
	}

	/**
	 * Q001 - HIGH - Output directory unwriteable
	 *
	 * @return  bool
	 */
	private function q001()
	{
		$status = $this->getFolderStatus();

		return !$status['output'];
	}

	/**
	 * Q003 - HIGH - Backup output or temporary set to site's root
	 *
	 * @return  bool
	 */
	private function q003()
	{
		$stock_dirs = Platform::getInstance()->get_stock_directories();

		$registry = Factory::getConfiguration();
		$outdir   = $registry->get('akeeba.basic.output_directory');

		foreach ($stock_dirs as $macro => $replacement)
		{
			$outdir = str_replace($macro, $replacement, $outdir);
		}

		$outdir_real = @realpath($outdir);

		if (!empty($outdir_real))
		{
			$outdir = $outdir_real;
		}

		$siteroot      = Platform::getInstance()->get_site_root();
		$siteroot_real = @realpath($siteroot);

		if (!empty($siteroot_real))
		{
			$siteroot = $siteroot_real;
		}

		return ($siteroot == $outdir);
	}

	/**
	 * Q004 - HIGH - Free memory too low
	 *
	 * @return bool
	 */
	private function q004()
	{
		// If we can't figure this out, don't report a problem. It doesn't
		// really matter, as the backup WILL crash eventually.
		if (!function_exists('ini_get'))
		{
			return false;
		}

		$memLimit = ini_get("memory_limit");
		$memLimit = $this->_return_bytes($memLimit);

		if ($memLimit <= 0)
		{
			return false;
		}

		// No limit?
		$availableRAM = $memLimit - memory_get_usage();

		// We need at least 12Mb of free memory
		return ($availableRAM <= (12 * 1024 * 1024));
	}

	/**
	 * Q101 - HIGH - open_basedir on output directory
	 *
	 * @return  bool
	 */
	private function q101()
	{
		$stock_dirs = Platform::getInstance()->get_stock_directories();

		// Get output writable status
		$registry = Factory::getConfiguration();
		$outdir   = $registry->get('akeeba.basic.output_directory');

		foreach ($stock_dirs as $macro => $replacement)
		{
			$outdir = str_replace($macro, $replacement, $outdir);
		}

		return $this->checkOpenBasedirs($outdir);
	}

	/**
	 * Q103 - HIGH - Less than 10" of max_execution_time with PHP Safe Mode enabled
	 *
	 * @return  bool
	 */
	private function q103()
	{
		$exectime = ini_get('max_execution_time');
		$safemode = ini_get('safe_mode');

		if (!$safemode)
		{
			return false;
		}

		if (!is_numeric($exectime))
		{
			return false;
		}

		if ($exectime <= 0)
		{
			return false;
		}

		return $exectime < 10;
	}

	/**
	 * Q104 - HIGH - Temp directory is the same as the site's root
	 *
	 * @return  bool
	 */
	private function q104()
	{

		$siteroot      = Platform::getInstance()->get_site_root();
		$siteroot_real = @realpath($siteroot);

		if (!empty($siteroot_real))
		{
			$siteroot = $siteroot_real;
		}

		$stockDirs      = Platform::getInstance()->get_stock_directories();
		$temp_directory = $stockDirs['[SITETMP]'];
		$temp_directory = @realpath($temp_directory);

		if (empty($temp_directory))
		{
			$temp_directory = $siteroot;
		}

		return ($siteroot == $temp_directory);
	}

	/**
	 * Q106 - HIGH  - Table name prefix contains uppercase characters
	 *
	 * @return  bool
	 */
	private function q106()
	{
		$filters   = Factory::getFilters();
		$databases = $filters->getInclusions('db');

		foreach ($databases as $db)
		{
			if (!isset($db['prefix']))
			{
				continue;
			}

			if (preg_match('/[A-Z]/', $db['prefix']))
			{
				return true;
			}
		}

		return false;
	}

	/**
	 * Q201 - MEDIUM - Outdated PHP version.
	 *
	 * We currently check for PHP lower than 8.0.
	 *
	 * @return  bool
	 */
	private function q201()
	{
		return version_compare(PHP_VERSION, '8.0.0', 'lt');
	}

	/**
	 * Q202 - MED  - CRC problems with hash extension not present
	 *
	 * @return  bool
	 */
	private function q202()
	{
		$registry = Factory::getConfiguration();
		$archiver = $registry->get('akeeba.advanced.archiver_engine');

		if ($archiver != 'zip')
		{
			return false;
		}

		return !function_exists('hash_file');
	}

	/**
	 * Q203 - MED  - Default output directory in use
	 *
	 * @return  bool
	 */
	private function q203()
	{
		$stock_dirs = Platform::getInstance()->get_stock_directories();

		$registry = Factory::getConfiguration();
		$outdir   = $registry->get('akeeba.basic.output_directory');

		foreach ($stock_dirs as $macro => $replacement)
		{
			$outdir = str_replace($macro, $replacement, $outdir);
		}

		$default = $stock_dirs['[DEFAULT_OUTPUT]'];

		$outdir  = Factory::getFilesystemTools()->TranslateWinPath($outdir);
		$default = Factory::getFilesystemTools()->TranslateWinPath($default);

		return $outdir == $default;
	}

	/**
	 * Q204 - MED  - Disabled functions may affect operation
	 *
	 * @return  bool
	 */
	private function q204()
	{
		$disabled = ini_get('disabled_functions');

		return (!empty($disabled));
	}

	/**
	 * Q401 - LOW  - ZIP format selected
	 *
	 * @return  bool
	 */
	private function q401()
	{
		$registry = Factory::getConfiguration();
		$archiver = $registry->get('akeeba.advanced.archiver_engine');

		return $archiver == 'zip';
	}

	private function _return_bytes($setting)
	{
		$val  = trim($setting);
		$last = strtolower(substr($val, -1));
		$val  = substr($val, 0, -1);

		if (is_numeric($last))
		{
			return $setting;
		}

		switch ($last)
		{
			case 't':
				$val *= 1024;
			case 'g':
				$val *= 1024;
			case 'm':
				$val *= 1024;
			case 'k':
				$val *= 1024;
		}

		return (int) $val;
	}
}
components/com_akeeba/BackupEngine/Util/AesAdapter/AdapterInterface.php000060400000007240152453623440022201 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util\AesAdapter;

defined('AKEEBAENGINE') || die();

/**
 * Interface for AES encryption adapters
 */
interface AdapterInterface
{
	/**
	 * Sets the AES encryption mode.
	 *
	 * WARNING: The strength is deprecated as it has a different effect in MCrypt and OpenSSL. MCrypt was abandoned in
	 * 2003 before the Rijndael-128 algorithm was officially the Advanced Encryption Standard (AES). MCrypt also offered
	 * Rijndael-192 and Rijndael-256 algorithms with different block sizes. These are NOT used in AES. OpenSSL, however,
	 * implements AES correctly. It always uses a 128-bit (16 byte) block. The 192 and 256 bit strengths refer to the
	 * key size, not the block size. Therefore using different strengths in MCrypt and OpenSSL will result in different
	 * and incompatible ciphertexts.
	 *
	 * TL;DR: Always use $strength = 128!
	 *
	 * @param   string  $mode      Choose between CBC (recommended) or ECB
	 * @param   int     $strength  Bit strength of the key (128, 192 or 256 bits). DEPRECATED. READ NOTES ABOVE.
	 *
	 * @return  mixed
	 */
	public function setEncryptionMode($mode = 'cbc', $strength = 128);

	/**
	 * Encrypts a string. Returns the raw binary ciphertext.
	 *
	 * WARNING: The plaintext is zero-padded to the algorithm's block size. You are advised to store the size of the
	 * plaintext and trim the string to that length upon decryption.
	 *
	 * @param   string       $plainText  The plaintext to encrypt
	 * @param   string       $key        The raw binary key (will be zero-padded or chopped if its size is different than the block size)
	 * @param   null|string  $iv         The initialization vector (for CBC mode algorithms)
	 *
	 * @return  string  The raw encrypted binary string.
	 */
	public function encrypt($plainText, $key, $iv = null);

	/**
	 * Decrypts a string. Returns the raw binary plaintext.
	 *
	 * $ciphertext MUST start with the IV followed by the ciphertext, even for EBC data (the first block of data is
	 * dropped in EBC mode since there is no concept of IV in EBC).
	 *
	 * WARNING: The returned plaintext is zero-padded to the algorithm's block size during encryption. You are advised
	 * to trim the string to the original plaintext's length upon decryption. While rtrim($decrypted, "\0") sounds
	 * appealing it's NOT the correct approach for binary data (zero bytes may actually be part of your plaintext, not
	 * just padding!).
	 *
	 * @param   string  $cipherText  The ciphertext to encrypt
	 * @param   string  $key         The raw binary key (will be zero-padded or chopped if its size is different than the block size)
	 *
	 * @return  string  The raw unencrypted binary string.
	 */
	public function decrypt($cipherText, $key);

	/**
	 * Returns the encryption block size in bytes
	 *
	 * @return  int
	 */
	public function getBlockSize();

	/**
	 * Is this adapter supported?
	 *
	 * @return  bool
	 */
	public function isSupported();
}
components/com_akeeba/BackupEngine/Util/AesAdapter/Mcrypt.php000060400000006630152453623440020260 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util\AesAdapter;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Util\RandomValue;

class Mcrypt extends AbstractAdapter implements AdapterInterface
{
	protected $cipherType = MCRYPT_RIJNDAEL_128;

	protected $cipherMode = MCRYPT_MODE_CBC;

	public function setEncryptionMode($mode = 'cbc', $strength = 128)
	{
		switch ((int) $strength)
		{
			default:
			case '128':
				$this->cipherType = MCRYPT_RIJNDAEL_128;
				break;

			case '192':
				$this->cipherType = MCRYPT_RIJNDAEL_192;
				break;

			case '256':
				$this->cipherType = MCRYPT_RIJNDAEL_256;
				break;
		}

		switch (strtolower($mode))
		{
			case 'ecb':
				$this->cipherMode = MCRYPT_MODE_ECB;
				break;

			default:
			case 'cbc':
				$this->cipherMode = MCRYPT_MODE_CBC;
				break;
		}

	}

	public function encrypt($plainText, $key, $iv = null)
	{
		$iv_size = $this->getBlockSize();
		$key     = $this->resizeKey($key, $iv_size);
		$iv      = $this->resizeKey($iv, $iv_size);

		if (empty($iv))
		{
			$randVal = new RandomValue();
			$iv      = $randVal->generate($iv_size);
		}

		$cipherText = mcrypt_encrypt($this->cipherType, $key, $plainText, $this->cipherMode, $iv);
		$cipherText = $iv . $cipherText;

		return $cipherText;
	}

	public function decrypt($cipherText, $key)
	{
		$iv_size    = $this->getBlockSize();
		$key        = $this->resizeKey($key, $iv_size);
		$iv         = substr($cipherText, 0, $iv_size);
		$cipherText = substr($cipherText, $iv_size);
		$plainText  = mcrypt_decrypt($this->cipherType, $key, $cipherText, $this->cipherMode, $iv);

		return $plainText;
	}

	public function isSupported()
	{
		if (!function_exists('mcrypt_get_key_size'))
		{
			return false;
		}

		if (!function_exists('mcrypt_get_iv_size'))
		{
			return false;
		}

		if (!function_exists('mcrypt_create_iv'))
		{
			return false;
		}

		if (!function_exists('mcrypt_encrypt'))
		{
			return false;
		}

		if (!function_exists('mcrypt_decrypt'))
		{
			return false;
		}

		if (!function_exists('mcrypt_list_algorithms'))
		{
			return false;
		}

		if (!function_exists('hash'))
		{
			return false;
		}

		if (!function_exists('hash_algos'))
		{
			return false;
		}

		$algorightms = mcrypt_list_algorithms();

		if (!in_array('rijndael-128', $algorightms))
		{
			return false;
		}

		if (!in_array('rijndael-192', $algorightms))
		{
			return false;
		}

		if (!in_array('rijndael-256', $algorightms))
		{
			return false;
		}

		$algorightms = hash_algos();

		if (!in_array('sha256', $algorightms))
		{
			return false;
		}

		return true;
	}

	public function getBlockSize()
	{
		return mcrypt_get_iv_size($this->cipherType, $this->cipherMode);
	}
}
components/com_akeeba/BackupEngine/Util/AesAdapter/AbstractAdapter.php000060400000004673152453623440022053 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util\AesAdapter;

defined('AKEEBAENGINE') || die();

/**
 * Abstract AES encryption class
 */
abstract class AbstractAdapter
{
	/**
	 * Trims or zero-pads a key / IV
	 *
	 * @param   string  $key   The key or IV to treat
	 * @param   int     $size  The block size of the currently used algorithm
	 *
	 * @return  null|string  Null if $key is null, treated string of $size byte length otherwise
	 */
	public function resizeKey($key, $size)
	{
		if (empty($key))
		{
			return null;
		}

		$keyLength = strlen($key);

		if (function_exists('mb_strlen'))
		{
			$keyLength = mb_strlen($key, 'ASCII');
		}

		if ($keyLength == $size)
		{
			return $key;
		}

		if ($keyLength > $size)
		{
			if (function_exists('mb_substr'))
			{
				return mb_substr($key, 0, $size, 'ASCII');
			}

			return substr($key, 0, $size);
		}

		return $key . str_repeat("\0", ($size - $keyLength));
	}

	/**
	 * Returns null bytes to append to the string so that it's zero padded to the specified block size
	 *
	 * @param   string  $string     The binary string which will be zero padded
	 * @param   int     $blockSize  The block size
	 *
	 * @return  string  The zero bytes to append to the string to zero pad it to $blockSize
	 */
	protected function getZeroPadding($string, $blockSize)
	{
		$stringSize = strlen($string);

		if (function_exists('mb_strlen'))
		{
			$stringSize = mb_strlen($string, 'ASCII');
		}

		if ($stringSize == $blockSize)
		{
			return '';
		}

		if ($stringSize < $blockSize)
		{
			return str_repeat("\0", $blockSize - $stringSize);
		}

		$paddingBytes = $stringSize % $blockSize;

		return str_repeat("\0", $blockSize - $paddingBytes);
	}
}
components/com_akeeba/BackupEngine/Util/AesAdapter/OpenSSL.php000060400000007547152453623440020275 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util\AesAdapter;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Util\RandomValue;

class OpenSSL extends AbstractAdapter implements AdapterInterface
{
	/**
	 * The OpenSSL options for encryption / decryption
	 *
	 * @var  int
	 */
	protected $openSSLOptions = 0;

	/**
	 * The encryption method to use
	 *
	 * @var  string
	 */
	protected $method = 'aes-128-cbc';

	public function __construct()
	{
		$this->openSSLOptions = OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING;
	}

	public function setEncryptionMode($mode = 'cbc', $strength = 128)
	{
		static $availableAlgorithms = null;
		static $defaultAlgo = 'aes-128-cbc';

		if (!is_array($availableAlgorithms))
		{
			$availableAlgorithms = openssl_get_cipher_methods();

			foreach ([
				         'aes-256-cbc', 'aes-256-ecb', 'aes-192-cbc',
				         'aes-192-ecb', 'aes-128-cbc', 'aes-128-ecb',
			         ] as $algo)
			{
				if (in_array($algo, $availableAlgorithms))
				{
					$defaultAlgo = $algo;
					break;
				}
			}
		}

		$strength = (int) $strength;
		$mode     = strtolower($mode);

		if (!in_array($strength, [128, 192, 256]))
		{
			$strength = 256;
		}

		if (!in_array($mode, ['cbc', 'ebc']))
		{
			$mode = 'cbc';
		}

		$algo = 'aes-' . $strength . '-' . $mode;

		if (!in_array($algo, $availableAlgorithms))
		{
			$algo = $defaultAlgo;
		}

		$this->method = $algo;
	}

	public function encrypt($plainText, $key, $iv = null)
	{
		$iv_size = $this->getBlockSize();
		$key     = $this->resizeKey($key, $iv_size);
		$iv      = $this->resizeKey($iv, $iv_size);

		if (empty($iv))
		{
			$randVal = new RandomValue();
			$iv      = $randVal->generate($iv_size);
		}

		$plainText  .= $this->getZeroPadding($plainText, $iv_size);
		$cipherText = openssl_encrypt($plainText, $this->method, $key, $this->openSSLOptions, $iv);
		$cipherText = $iv . $cipherText;

		return $cipherText;
	}

	public function decrypt($cipherText, $key)
	{
		$iv_size    = $this->getBlockSize();
		$key        = $this->resizeKey($key, $iv_size);
		$iv         = substr($cipherText, 0, $iv_size);
		$cipherText = substr($cipherText, $iv_size);
		$plainText  = openssl_decrypt($cipherText, $this->method, $key, $this->openSSLOptions, $iv);

		return $plainText;
	}

	public function isSupported()
	{
		if (!function_exists('openssl_get_cipher_methods'))
		{
			return false;
		}

		if (!function_exists('openssl_random_pseudo_bytes'))
		{
			return false;
		}

		if (!function_exists('openssl_cipher_iv_length'))
		{
			return false;
		}

		if (!function_exists('openssl_encrypt'))
		{
			return false;
		}

		if (!function_exists('openssl_decrypt'))
		{
			return false;
		}

		if (!function_exists('hash'))
		{
			return false;
		}

		if (!function_exists('hash_algos'))
		{
			return false;
		}

		$algorightms = openssl_get_cipher_methods();

		if (!in_array('aes-128-cbc', $algorightms))
		{
			return false;
		}

		$algorightms = hash_algos();

		if (!in_array('sha256', $algorightms))
		{
			return false;
		}

		return true;
	}

	/**
	 * @return int
	 */
	public function getBlockSize()
	{
		return openssl_cipher_iv_length($this->method);
	}
}
components/com_akeeba/BackupEngine/Util/CRC32.php000060400000006113152453623440015541 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace Akeeba\Engine\Util;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;

/**
 * A handy class to abstract the calculation of CRC32 of files under various
 * server conditions and versions of PHP.
 */
class CRC32
{
	/**
	 * Returns the CRC32 of a file, selecting the more appropriate algorithm.
	 *
	 * @param   string   $filename                    Absolute path to the file being processed
	 * @param   integer  $AkeebaPackerZIP_CHUNK_SIZE  Obsoleted
	 *
	 * @return integer The CRC32 in numerical form
	 */
	public function crc32_file($filename, $AkeebaPackerZIP_CHUNK_SIZE)
	{
		static $configuration;

		if (!$configuration)
		{
			$configuration = Factory::getConfiguration();
		}

		$res = false;

		if (function_exists("hash_file"))
		{
			$res        = $this->crc32UsingHashExtension($filename);
			$calcMethod = 'HASH_FILE';
		}
		elseif (function_exists("file_get_contents") && (@filesize($filename) <= $AkeebaPackerZIP_CHUNK_SIZE))
		{
			$res        = $this->crc32Legacy($filename);
			$calcMethod = 'FILE_GET_CONTENTS';
		}
		else
		{
			$res        = 0;
			$calcMethod = 'FAKE - CANNOT CALCULATE';
		}

		if ($res === false)
		{
			$res = 0;

			Factory::getLog()->warning("File $filename - NOT READABLE: CRC32 IS WRONG!");
		}
		else
		{
			try
			{
				$humanReadable = dechex($res);
			}
			catch (\Throwable $e)
			{
			}

			if (($humanReadable ?? null) === null)
			{
				$temp = $res > 2147483647 ? -($res - 2147483648) : $res;
				$humanReadable = dechex($res);
			}

			Factory::getLog()->debug(sprintf("File %s - CRC32 = %s [%s]", $filename, $humanReadable ?? '(cannot display - you have a 32-bit version of PHP)', $calcMethod));
		}

		return $res;
	}

	/**
	 * Very efficient CRC32 calculation using the PHP 'hash' extension.
	 *
	 * @param   string  $filename  Absolute filepath
	 *
	 * @return integer The CRC32
	 */
	protected function crc32UsingHashExtension($filename)
	{
		// Detection of buggy PHP hosts
		static $mustInvert = null;

		if (is_null($mustInvert))
		{
			$test_crc   = @hash('crc32b', 'test', false);
			$mustInvert = (strtolower($test_crc) == '0c7e7fd8'); // Normally, it's D87F7E0C :)

			if ($mustInvert)
			{
				Factory::getLog()->warning('Your server has a buggy PHP version which produces inverted CRC32 values. Attempting a workaround. ZIP files may appear as corrupt.');
			}
		}

		$res = @hash_file('crc32b', $filename, false);

		if ($mustInvert)
		{
			// Workaround for buggy PHP versions (I think before 5.1.8) which produce inverted CRC32 sums
			$res2 = substr($res, 6, 2) . substr($res, 4, 2) . substr($res, 2, 2) . substr($res, 0, 2);
			$res  = $res2;
		}

		$res = hexdec($res);

		return $res;
	}

	/**
	 * A compatible CRC32 calculation using file_get_contents, utilizing immense amounts of RAM
	 *
	 * @param   string  $filename
	 *
	 * @return integer
	 */
	protected function crc32Legacy($filename)
	{
		return crc32(@file_get_contents($filename));
	}
}
components/com_akeeba/BackupEngine/Util/RandomValue.php000060400000010731152453623440017203 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util;

defined('AKEEBAENGINE') || die();

/**
 * Crypto-safe random value generator. Based on the Randval class of the Aura for PHP's Session package.
 * The following is the license file accompanying the original file.
 *
 * ********************************************************************************
 * Copyright (c) 2011-2016, Aura for PHP
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer.
 *
 * - Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * ********************************************************************************
 *
 * Please note that this is a MODIFIED copy of the Randval class, mainly to allow it to be used on hosts
 * which lack both mbcrypt and OpenSSL PHP modules.
 */
class RandomValue
{
	/**
	 *
	 * Returns a cryptographically secure random value.
	 *
	 * @param   integer  $bytes  How many bytes to return
	 *
	 * @return  string
	 */
	public function generate($bytes = 32)
	{
		return random_bytes($bytes);
	}

	/**
	 * Generates a random string with the specified length. WARNING: You get to specify the number of
	 * random characters in the string, not the number of random bytes. The character pool is 64 characters
	 * (6 bits) long. The entropy of your string is 6 * $characters bits. This means that a random string
	 * of 32 characters has an entropy of 192 bits whereas a random sequence of 32 bytes returned by generate()
	 * has an entropy of 8 * 32 = 256 bits.
	 *
	 * @param   int    $characters    Number of characters
	 * @param   string $characterSet  Characters to pick from
	 *
	 * @return string
	 */
	public function generateString($characters = 32, $characterSet = 'abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789')
	{
		$sourceString = str_split('abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789', 1);
		$ret          = '';

		$bytes     = ceil($characters / 4) * 3;
		$randBytes = $this->generate($bytes);

		for ($i = 0; $i < $bytes; $i += 3)
		{
			$subBytes = substr($randBytes, $i, 3);
			$subBytes = str_split($subBytes, 1);
			$subBytes = ord($subBytes[0]) * 65536 + ord($subBytes[1]) * 256 + ord($subBytes[2]);
			$subBytes = $subBytes & bindec('00000000111111111111111111111111');

			$b    = [];
			$b[0] = $subBytes >> 18;
			$b[1] = ($subBytes >> 12) & bindec('111111');
			$b[2] = ($subBytes >> 6) & bindec('111111');
			$b[3] = $subBytes & bindec('111111');

			$ret .= $sourceString[$b[0]] . $sourceString[$b[1]] . $sourceString[$b[2]] . $sourceString[$b[3]];
		}

		return substr($ret, 0, $characters);
	}
}
components/com_akeeba/BackupEngine/Util/Buffer.php000060400000011316152453623440016177 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util;

defined('AKEEBAENGINE') || die();

/**
 * Generic Buffer stream handler
 *
 * This class provides a generic buffer stream.  It can be used to store/retrieve/manipulate
 * string buffers with the standard PHP filesystem I/O methods.
 */
class Buffer
{

	/**
	 * Stream position
	 *
	 * @var    integer
	 */
	public $position = 0;

	/**
	 * Buffer name
	 *
	 * @var    string
	 */
	public $name = null;

	/**
	 * Buffer hash
	 *
	 * @var    array
	 */
	public $_buffers = [];

	/**
	 * Function to open file or url
	 *
	 * @param   string   $path          The URL that was passed
	 * @param   string   $mode          Mode used to open the file @see fopen
	 * @param   integer  $options       Flags used by the API, may be STREAM_USE_PATH and
	 *                                  STREAM_REPORT_ERRORS
	 * @param   string  &$opened_path   Full path of the resource. Used with STREAM_USE_PATH option
	 *
	 * @return  boolean
	 *
	 * @see     streamWrapper::stream_open
	 */
	public function stream_open($path, $mode, $options, &$opened_path)
	{
		$url                         = parse_url($path);
		$this->name                  = $url["host"];
		$this->_buffers[$this->name] = null;
		$this->position              = 0;

		return true;
	}

	/**
	 * Read stream
	 *
	 * @param   integer  $count  How many bytes of data from the current position should be returned.
	 *
	 * @return  mixed    The data from the stream up to the specified number of bytes (all data if
	 *                   the total number of bytes in the stream is less than $count. Null if
	 *                   the stream is empty.
	 *
	 * @see     streamWrapper::stream_read
	 */
	public function stream_read($count)
	{
		$ret            = substr($this->_buffers[$this->name], $this->position, $count);
		$this->position += strlen($ret);

		return $ret;
	}

	/**
	 * Write stream
	 *
	 * @param   string  $data  The data to write to the stream.
	 *
	 * @return  integer
	 *
	 * @see     streamWrapper::stream_write
	 */
	public function stream_write($data)
	{
		$left                        = substr($this->_buffers[$this->name], 0, $this->position);
		$right                       = substr($this->_buffers[$this->name], $this->position + strlen($data));
		$this->_buffers[$this->name] = $left . $data . $right;
		$this->position              += strlen($data);

		return strlen($data);
	}

	/**
	 * Function to get the current position of the stream
	 *
	 * @return  integer
	 *
	 * @see     streamWrapper::stream_tell
	 */
	public function stream_tell()
	{
		return $this->position;
	}

	/**
	 * Function to test for end of file pointer
	 *
	 * @return  boolean  True if the pointer is at the end of the stream
	 *
	 * @see     streamWrapper::stream_eof
	 */
	public function stream_eof()
	{
		return $this->position >= strlen($this->_buffers[$this->name]);
	}

	/**
	 * The read write position updates in response to $offset and $whence
	 *
	 * @param   integer  $offset   The offset in bytes
	 * @param   integer  $whence   Position the offset is added to
	 *                             Options are SEEK_SET, SEEK_CUR, and SEEK_END
	 *
	 * @return  boolean  True if updated
	 *
	 * @see     streamWrapper::stream_seek
	 */
	public function stream_seek($offset, $whence)
	{
		switch ($whence)
		{
			case SEEK_SET:
				if ($offset < strlen($this->_buffers[$this->name]) && $offset >= 0)
				{
					$this->position = $offset;

					return true;
				}
				else
				{
					return false;
				}
				break;

			case SEEK_CUR:
				if ($offset >= 0)
				{
					$this->position += $offset;

					return true;
				}
				else
				{
					return false;
				}
				break;

			case SEEK_END:
				if (strlen($this->_buffers[$this->name]) + $offset >= 0)
				{
					$this->position = strlen($this->_buffers[$this->name]) + $offset;

					return true;
				}
				else
				{
					return false;
				}
				break;

			default:
				return false;
		}
	}
}

// Register the stream
stream_wrapper_register("buffer", Buffer::class);
components/com_akeeba/BackupEngine/Util/PushMessages.php000060400000010440152453623440017372 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use Akeeba\Engine\Util\Pushbullet\Connector;
use Exception;

class PushMessages implements PushMessagesInterface
{
	/**
	 * The PushBullet connector
	 *
	 * @var Connector[]
	 */
	private $connectors = [];

	/**
	 * Should we send push messages?
	 *
	 * @var bool
	 */
	private $enabled = true;

	/**
	 * Creates the push messaging object
	 */
	public function __construct()
	{
		$pushPreference = Platform::getInstance()->get_platform_configuration_option('push_preference', '0');
		$apiKey         = Platform::getInstance()->get_platform_configuration_option('push_apikey', '');

		// No API key? No push messages are enabled, so no point continuing really...
		if (empty($apiKey))
		{
			$pushPreference = 0;
		}

		// We use a switch in case we add support for more push APIs in the future. The push_preference platform
		// option will tell us which service to use. In that case we'll have to refactor this class, but the public
		// API will remain the same.
		switch ($pushPreference)
		{
			default:
			case 0:
				$this->enabled = false;
				break;

			case 1:
				$keys = explode(',', $apiKey);
				$keys = array_map('trim', $keys);

				foreach ($keys as $key)
				{
					try
					{
						$connector = new Connector($key);
						$connector->getDevices();
						$this->connectors[] = $connector;
					}
					catch (Exception $e)
					{
						Factory::getLog()->warning("Push messages cannot be sent with API key $key. Error received when trying to establish PushBullet connection: " . $e->getMessage());
					}
				}

				if (empty($this->connectors))
				{
					Factory::getLog()->warning('No push messages can be sent: none of the provided API keys is usable. Push messages have been deactivated.');

					$this->enabled = false;
				}

				break;
		}
	}

	/**
	 * Sends a push message to all connected devices. The intent is to provide the user with an information message,
	 * e.g. notify them about the progress of the backup.
	 *
	 * @param   string  $subject  The subject of the message, shown in the lock screen. Keep it short.
	 * @param   string  $details  Long(er) description of what the message is about. Plain text (no HTML).
	 *
	 * @return  void
	 */
	public function message($subject, $details = null)
	{
		if (!$this->enabled)
		{
			return;
		}

		foreach ($this->connectors as $connector)
		{
			try
			{
				$connector->pushNote('', $subject, $details);
			}
			catch (Exception $e)
			{
				Factory::getLog()->warning('Push messages suspended. Error received when trying to send push message:' . $e->getMessage());
				$this->enabled = false;
			}
		}
	}

	/**
	 * Sends a push message, containing a URL/URI, to all connected devices. The URL will be rendered as something
	 * clickable on most devices.
	 *
	 * @param   string  $url      The URL/URI
	 * @param   string  $subject  The subject of the message, shown in the lock screen. Keep it short.
	 * @param   string  $details  Long(er) description of what the message is about. Plain text (no HTML).
	 *
	 * @return  void
	 */
	public function link($url, $subject, $details = null)
	{
		if (!$this->enabled)
		{
			return;
		}

		foreach ($this->connectors as $connector)
		{
			try
			{
				$connector->pushLink('', $subject, $url, $details);
			}
			catch (Exception $e)
			{
				Factory::getLog()->warning('Push messages suspended. Error received when trying to send push message with a link:' . $e->getMessage());
				$this->enabled = false;
			}
		}
	}
}
components/com_akeeba/BackupEngine/Util/ParseIni.php000060400000017564152453623440016513 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util;

defined('AKEEBAENGINE') || die();

/**
 * A utility class to parse INI files.
 *
 * This is marked deprecated since Akeeba Engine 6.4.1. The configuration of the engine is no longer stored as INI data.
 * Moreover, we will be migrating away from the current INI files used for defining engine and GUI configuration
 * parameters.
 *
 * @package     Akeeba\Engine\Util
 *
 * @deprecated  6.4.1
 */
abstract class ParseIni
{
	/**
	 * Parse an INI file and return an associative array. This monstrosity is required because some so-called hosts
	 * have disabled PHP's parse_ini_file() function for "security reasons". Apparently their blatant ignorance doesn't
	 * allow them to discern between the innocuous parse_ini_file and the potentially dangerous ini_set, leading them to
	 * disable the former and let the latter enabled.
	 *
	 * @param   string  $file              The file name or raw INI data to process
	 * @param   bool    $process_sections  True to also process INI sections
	 * @param   bool    $rawdata           Is this raw INI data? False when $file is a filepath.
	 * @param   bool    $forcePHP          Should I force the use of the pure-PHP INI file parser?
	 *
	 * @return   array    An associative array of sections, keys and values
	 */
	public static function parse_ini_file($file, $process_sections = false, $rawdata = false, $forcePHP = false)
	{
		/**
		 * WARNING: DO NOT USE INI_SCANNER_RAW IN THE parse_ini_string / parse_ini_file FUNCTION CALLS WITHOUT POST-
		 *          PROCESSING!
		 *
		 * Sometimes we need to save data which is either multiline or has double quotes in the Engine's
		 * configuration. For this reason we have to manually escape \r, \n, \t and \" in
		 * Akeeba\Engine\Configuration::dumpObject(). If we don't we end up with multiline INI values which
		 * won't work. However, if we are using INI_SCANNER_RAW these characters are not escaped back to their
		 * original form. As a result we end up with broken data which cause various problems, the most visible
		 * of which is that Google Storage integration is broken since the JSON data included in the config is
		 * now unparseable.
		 *
		 * However, not using raw mode introduces other problems. For example, the sequence \$ is converted to $ because
		 * it's assumed to be an escaped dollar sign. Things like $foo are addressed as variable interpolation, i.e.
		 * "This is ${foo} wrong" results in "This is  wrong" because $foo is considered as an interpolated variable.
		 *
		 * The solution to that is to use raw mode to parse the INI files and THEN unescape the variables. However, we
		 * cannot simply use stripslashes/stripcslashes because we could end up replacing more than we should (unlike
		 * addcslashes we cannot specify a list of escaped characters to consider). We have to do a slower string
		 * replace instead.
		 *
		 * The next problem to consider is that when $process_sections is true some of the values generated are arrays
		 * or even nested arrays. If you try to string replace on them hilarity ensues. Therefore we have the recursive
		 * unescape method which takes care of that. To make things faster and maintain the array keys we use array_map
		 * to apply recursiveUnescape to the array.
		 */

		if ($rawdata)
		{
			if (!function_exists('parse_ini_string'))
			{
				return self::parse_ini_file_php($file, $process_sections, $rawdata);
			}

			// !!! VERY IMPORTANT !!! Read the warning above before touching this line
			return array_map([
				__CLASS__, 'recursiveUnescape',
			], parse_ini_string($file, $process_sections, INI_SCANNER_RAW));
		}

		if (!function_exists('parse_ini_file'))
		{
			return self::parse_ini_file_php($file, $process_sections);
		}

		// !!! VERY IMPORTANT !!! Read the warning above before touching this line
		return array_map([__CLASS__, 'recursiveUnescape'], parse_ini_file($file, $process_sections, INI_SCANNER_RAW));
	}

	/**
	 * Recursively unescape values which have been escaped by Akeeba\Engine\Configuration::dumpObject().
	 *
	 * @param   string|array  $value
	 *
	 * @return  string|array  Unescaped result
	 */
	static function recursiveUnescape($value)
	{
		if (is_array($value))
		{
			return array_map([__CLASS__, 'recursiveUnescape'], $value);
		}

		return str_replace(['\r', '\n', '\t', '\"'], ["\r", "\n", "\t", '"'], $value);
	}

	/**
	 * A PHP based INI file parser.
	 *
	 * Thanks to asohn ~at~ aircanopy ~dot~ net for posting this handy function on
	 * the parse_ini_file page on http://gr.php.net/parse_ini_file
	 *
	 * @param   string  $file              Filename to process
	 * @param   bool    $process_sections  True to also process INI sections
	 * @param   bool    $rawdata           If true, the $file contains raw INI data, not a filename
	 *
	 * @return    array    An associative array of sections, keys and values
	 */
	static function parse_ini_file_php($file, $process_sections = false, $rawdata = false)
	{
		$process_sections = ($process_sections !== true) ? false : true;

		if (!$rawdata)
		{
			$ini = file($file);
		}
		else
		{
			$file = str_replace("\r", "", $file);
			$ini  = explode("\n", $file);
		}

		if (!is_array($ini))
		{
			return [];
		}

		if (count($ini) == 0)
		{
			return [];
		}

		$sections = [];
		$values   = [];
		$result   = [];
		$globals  = [];
		$i        = 0;
		foreach ($ini as $line)
		{
			$line = trim($line);
			$line = str_replace("\t", " ", $line);

			// Comments
			if (!preg_match('/^[a-zA-Z0-9[]/', $line))
			{
				continue;
			}

			// Sections
			if ($line[0] == '[')
			{
				$tmp        = explode(']', $line);
				$sections[] = trim(substr($tmp[0], 1));
				$i++;
				continue;
			}

			// Key-value pair
			$lineParts = explode('=', $line, 2);
			if (count($lineParts) != 2)
			{
				continue;
			}
			$key   = trim($lineParts[0]);
			$value = trim($lineParts[1]);
			unset($lineParts);

			if (strstr($value, ";"))
			{
				$tmp = explode(';', $value);
				if (count($tmp) == 2)
				{
					if ((($value[0] != '"') && ($value[0] != "'")) ||
						preg_match('/^".*"\s*;/', $value) || preg_match('/^".*;[^"]*$/', $value) ||
						preg_match("/^'.*'\s*;/", $value) || preg_match("/^'.*;[^']*$/", $value)
					)
					{
						$value = $tmp[0];
					}
				}
				else
				{
					if ($value[0] == '"')
					{
						$value = preg_replace('/^"(.*)".*/', '$1', $value);
					}
					elseif ($value[0] == "'")
					{
						$value = preg_replace("/^'(.*)'.*/", '$1', $value);
					}
					else
					{
						$value = $tmp[0];
					}
				}
			}
			$value = trim($value);
			$value = trim($value, "'\"");

			if ($i == 0)
			{
				if (substr($line, -1, 2) == '[]')
				{
					$globals[$key][] = $value;
				}
				else
				{
					$globals[$key] = $value;
				}
			}
			else
			{
				if (substr($line, -1, 2) == '[]')
				{
					$values[$i - 1][$key][] = $value;
				}
				else
				{
					$values[$i - 1][$key] = $value;
				}
			}
		}

		for ($j = 0; $j < $i; $j++)
		{
			if ($process_sections === true)
			{
				if (isset($sections[$j]) && isset($values[$j]))
				{
					$result[$sections[$j]] = $values[$j];
				}
			}
			else
			{
				if (isset($values[$j]))
				{
					$result[] = $values[$j];
				}
			}
		}

		return $result + $globals;
	}
}
components/com_akeeba/BackupEngine/Util/Pushbullet/ApiException.php000060400000001731152453623440021505 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util\Pushbullet;

defined('AKEEBAENGINE') || die();

use Exception;

class ApiException extends Exception
{
	// Exception thrown by Pushbullet
}
components/com_akeeba/BackupEngine/Util/Pushbullet/Connector.php000060400000030600152453623440021044 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util\Pushbullet;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Postproc\ProxyAware;
use CURLFile;

/**
 * Based on Pushbullet-for-PHP 2.10.1 – https://github.com/ivkos/Pushbullet-for-PHP/tree/v2
 *
 * The license for the original class is as follows:
 * ----------
 * The MIT License (MIT)
 *
 * Copyright (c) 2014 Ivaylo Stoyanov
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 * ----------
 *
 * The following class is a derivative work, NOT the original work.
 */
class Connector
{
	use ProxyAware;

	public const URL_PUSHES = 'https://api.pushbullet.com/v2/pushes';
	public const URL_DEVICES = 'https://api.pushbullet.com/v2/devices';
	public const URL_CONTACTS = 'https://api.pushbullet.com/v2/contacts';
	public const URL_UPLOAD_REQUEST = 'https://api.pushbullet.com/v2/upload-request';
	public const URL_USERS = 'https://api.pushbullet.com/v2/users';
	public const URL_SUBSCRIPTIONS = 'https://api.pushbullet.com/v2/subscriptions';
	public const URL_CHANNEL_INFO = 'https://api.pushbullet.com/v2/channel-info';
	public const URL_EPHEMERALS = 'https://api.pushbullet.com/v2/ephemerals';
	public const URL_PHONEBOOK = 'https://api.pushbullet.com/v2/permanents/phonebook';
	private $_apiKey;
	private $_curlCallback;

	/**
	 * Pushbullet constructor.
	 *
	 * @param   string  $apiKey  API key.
	 *
	 * @throws ApiException
	 */
	public function __construct($apiKey)
	{
		$this->_apiKey = $apiKey;

		if (!function_exists('curl_init'))
		{
			throw new ApiException('cURL library is not loaded.');
		}
	}

	/**
	 * Parse recipient.
	 *
	 * @param   string  $recipient  Recipient string.
	 * @param   array   $data       Data array to populate with the correct recipient parameter.
	 */
	private static function _parseRecipient($recipient, array &$data)
	{
		if (!empty($recipient))
		{
			if (filter_var($recipient, FILTER_VALIDATE_EMAIL) !== false)
			{
				$data['email'] = $recipient;
			}
			else
			{
				if (substr($recipient, 0, 1) == "#")
				{
					$data['channel_tag'] = substr($recipient, 1);
				}
				else
				{
					$data['device_iden'] = $recipient;
				}
			}
		}
	}

	/**
	 * Push a note.
	 *
	 * @param   string  $recipient  Recipient. Can be device_iden, email or channel #tagname.
	 * @param   string  $title      The note's title.
	 * @param   string  $body       The note's message.
	 *
	 * @return object Response.
	 * @throws ApiException
	 */
	public function pushNote($recipient, $title, $body = null)
	{
		$data = [];

		Connector::_parseRecipient($recipient, $data);
		$data['type']  = 'note';
		$data['title'] = $title;
		$data['body']  = $body;

		return $this->_curlRequest(self::URL_PUSHES, 'POST', $data);
	}

	/**
	 * Push a link.
	 *
	 * @param   string  $recipient  Recipient. Can be device_iden, email or channel #tagname.
	 * @param   string  $title      The link's title.
	 * @param   string  $url        The URL to open.
	 * @param   string  $body       A message associated with the link.
	 *
	 * @return object Response.
	 * @throws ApiException
	 */
	public function pushLink($recipient, $title, $url, $body = null)
	{
		$data = [];

		Connector::_parseRecipient($recipient, $data);
		$data['type']  = 'link';
		$data['title'] = $title;
		$data['url']   = $url;
		$data['body']  = $body;

		return $this->_curlRequest(self::URL_PUSHES, 'POST', $data);
	}

	/**
	 * Push a checklist.
	 *
	 * @param   string    $recipient  Recipient. Can be device_iden, email or channel #tagname.
	 * @param   string    $title      The list's title.
	 * @param   string[]  $items      The list items.
	 *
	 * @return object Response.
	 * @throws ApiException
	 */
	public function pushList($recipient, $title, array $items)
	{
		$data = [];

		Connector::_parseRecipient($recipient, $data);
		$data['type']  = 'list';
		$data['title'] = $title;
		$data['items'] = $items;

		return $this->_curlRequest(self::URL_PUSHES, 'POST', $data);
	}

	/**
	 * Push a file.
	 *
	 * @param   string  $recipient    Recipient. Can be device_iden, email or channel #tagname.
	 * @param   string  $filePath     The path of the file to push.
	 * @param   string  $mimeType     The MIME type of the file. If null, we'll try to guess it.
	 * @param   string  $title        The title of the push notification.
	 * @param   string  $body         The body of the push notification.
	 * @param   string  $altFileName  Alternative file name to use instead of the original one.
	 *                                For example, you might want to push 'someFile.tmp' as 'image.jpg'.
	 *
	 * @return object Response.
	 * @throws ApiException
	 */
	public function pushFile($recipient, $filePath, $mimeType = null, $title = null, $body = null, $altFileName = null)
	{
		$data = [];

		$fullFilePath = realpath($filePath);

		if (!is_readable($fullFilePath))
		{
			throw new ApiException('File: File does not exist or is unreadable.');
		}

		if (filesize($fullFilePath) > 25 * 1024 * 1024)
		{
			throw new ApiException('File: File size exceeds 25 MB.');
		}

		$data['file_name'] = $altFileName ?? basename($fullFilePath);

		// Try to guess the MIME type if the argument is NULL
		$data['file_type'] = $mimeType ?? mime_content_type($fullFilePath);

		// Request authorization to upload the file
		$response         = $this->_curlRequest(self::URL_UPLOAD_REQUEST, 'GET', $data);
		$data['file_url'] = $response->file_url;

		$response->data->file = new CURLFile($fullFilePath);

		// Upload the file
		$this->_curlRequest($response->upload_url, 'POST', $response->data, false, false);

		Connector::_parseRecipient($recipient, $data);
		$data['type']  = 'file';
		$data['title'] = $title;
		$data['body']  = $body;

		return $this->_curlRequest(self::URL_PUSHES, 'POST', $data);
	}

	/**
	 * Get push history.
	 *
	 * @param   int     $modifiedAfter  Request pushes modified after this UNIX timestamp.
	 * @param   string  $cursor         Request the next page via its cursor from a previous response. See the API
	 *                                  documentation (https://docs.pushbullet.com/http/) for a detailed description.
	 * @param   int     $limit          Maximum number of objects on each page.
	 *
	 * @return object Response.
	 * @throws ApiException
	 */
	public function getPushHistory($modifiedAfter = 0, $cursor = null, $limit = null)
	{
		$data                   = [];
		$data['modified_after'] = $modifiedAfter;

		if ($cursor !== null)
		{
			$data['cursor'] = $cursor;
		}

		if ($limit !== null)
		{
			$data['limit'] = $limit;
		}

		return $this->_curlRequest(self::URL_PUSHES, 'GET', $data);
	}

	/**
	 * Dismiss a push.
	 *
	 * @param   string  $pushIden  push_iden of the push notification.
	 *
	 * @return object Response.
	 * @throws ApiException
	 */
	public function dismissPush($pushIden)
	{
		return $this->_curlRequest(self::URL_PUSHES . '/' . $pushIden, 'POST', ['dismissed' => true]);
	}

	/**
	 * Delete a push.
	 *
	 * @param   string  $pushIden  push_iden of the push notification.
	 *
	 * @return object Response.
	 * @throws ApiException
	 */
	public function deletePush($pushIden)
	{
		return $this->_curlRequest(self::URL_PUSHES . '/' . $pushIden, 'DELETE');
	}

	/**
	 * Get a list of available devices.
	 *
	 * @param   int     $modifiedAfter  Request devices modified after this UNIX timestamp.
	 * @param   string  $cursor         Request the next page via its cursor from a previous response. See the API
	 *                                  documentation (https://docs.pushbullet.com/http/) for a detailed description.
	 * @param   int     $limit          Maximum number of objects on each page.
	 *
	 * @return object Response.
	 * @throws ApiException
	 */
	public function getDevices($modifiedAfter = 0, $cursor = null, $limit = null)
	{
		$data                   = [];
		$data['modified_after'] = $modifiedAfter;

		if ($cursor !== null)
		{
			$data['cursor'] = $cursor;
		}

		if ($limit !== null)
		{
			$data['limit'] = $limit;
		}

		return $this->_curlRequest(self::URL_DEVICES, 'GET', $data);
	}

	/**
	 * Get information about the current user.
	 *
	 * @return object Response.
	 * @throws ApiException
	 */
	public function getUserInformation()
	{
		return $this->_curlRequest(self::URL_USERS . '/me', 'GET');
	}

	/**
	 * Update preferences for the current user.
	 *
	 * @param   array  $preferences  Preferences.
	 *
	 * @return object Response.
	 * @throws ApiException
	 */
	public function updateUserPreferences($preferences)
	{
		return $this->_curlRequest(self::URL_USERS . '/me', 'POST', ['preferences' => $preferences]);
	}

	/**
	 * Add a callback function that will be invoked right before executing each cURL request.
	 *
	 * @param   callable  $callback  The callback function.
	 */
	public function addCurlCallback(callable $callback)
	{
		$this->_curlCallback = $callback;
	}

	/**
	 * Send a request to a remote server using cURL.
	 *
	 * @param   string  $url         URL to send the request to.
	 * @param   string  $method      HTTP method.
	 * @param   array   $data        Query data.
	 * @param   bool    $sendAsJSON  Send the request as JSON.
	 * @param   bool    $auth        Use the API key to authenticate
	 *
	 * @return object Response.
	 * @throws ApiException
	 */
	private function _curlRequest($url, $method, $data = null, $sendAsJSON = true, $auth = true)
	{
		$curl = curl_init();

		$this->applyProxySettingsToCurl($curl);

		if ($method == 'GET' && $data !== null)
		{
			$url .= '?' . http_build_query($data);
		}

		curl_setopt($curl, CURLOPT_URL, $url);

		if ($auth)
		{
			curl_setopt($curl, CURLOPT_USERPWD, $this->_apiKey);
		}

		curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);

		if ($method == 'POST' && $data !== null)
		{
			if ($sendAsJSON)
			{
				$data = json_encode($data);
				curl_setopt($curl, CURLOPT_HTTPHEADER, [
					'Content-Type: application/json',
					'Content-Length: ' . strlen($data),
				]);
			}

			curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
		}

		curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($curl, CURLOPT_HEADER, false);

		@curl_setopt($curl, CURLOPT_CAINFO, AKEEBA_CACERT_PEM);
		curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);

		if ($this->_curlCallback !== null)
		{
			$curlCallback = $this->_curlCallback;
			$curlCallback($curl);
		}

		$response = curl_exec($curl);

		if ($response === false)
		{
			$curlError = curl_error($curl);
			curl_close($curl);
			throw new ApiException('cURL Error: ' . $curlError);
		}

		$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);

		if ($httpCode >= 400)
		{
			curl_close($curl);
			$responseParsed = json_decode($response);
			throw new ApiException('HTTP Error ' . $httpCode .
				' (' . $responseParsed->error->type . '): ' . $responseParsed->error->message);
		}

		curl_close($curl);

		return json_decode($response);
	}
}
components/com_akeeba/BackupEngine/Util/FileCloseAware.php000060400000002136152453623440017613 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util;

defined('AKEEBAENGINE') || die();

use Throwable;

trait FileCloseAware
{
	protected function conditionalFileClose($fp): bool
	{
		if (!is_resource($fp))
		{
			return false;
		}

		try
		{
			return @fclose($fp);
		}
		catch (Throwable $e)
		{
			return false;
		}
	}

}components/com_akeeba/BackupEngine/Util/FileSystem.php000060400000034077152453623440017063 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;

/**
 * Utility functions related to filesystem objects, e.g. path translation
 */
class FileSystem
{
	/**
	 * Are we running under Windows?
	 *
	 * @var   bool
	 */
	private $isWindows = false;

	/**
	 * Local cache of the platform stock directories
	 *
	 * @var   array|null
	 * @since 7.0.3
	 */
	protected static $stockDirs = null;

	/**
	 * Initialise the object
	 */
	public function __construct()
	{
		$this->isWindows = (DIRECTORY_SEPARATOR == '\\');
	}

	/**
	 * Makes a Windows path more UNIX-like, by turning backslashes to forward slashes.
	 * It takes into account UNC paths, e.g. \\myserver\some\folder becomes
	 * \\myserver/some/folder.
	 *
	 * This function will also fix paths with multiple slashes, e.g. convert /var//www////html to /var/www/html
	 *
	 * @param   string  $p_path  The path to transform
	 *
	 * @return  string
	 */
	public function TranslateWinPath($p_path)
	{
		$is_unc = false;

		if ($this->isWindows)
		{
			// Is this a UNC path?
			$is_unc = (substr($p_path, 0, 2) == '\\\\') || (substr($p_path, 0, 2) == '//');

			// Change potential windows directory separator
			if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0, 1) == '\\'))
			{
				$p_path = strtr($p_path, '\\', '/');
			}
		}

		// Remove multiple slashes
		$p_path = str_replace('///', '/', $p_path);
		$p_path = str_replace('//', '/', $p_path);

		// Fix UNC paths
		if ($is_unc)
		{
			$p_path = '//' . ltrim($p_path, '/');
		}

		return $p_path;
	}

	/**
	 * Removes trailing slash or backslash from a pathname
	 *
	 * @param   string  $path  The path to treat
	 *
	 * @return  string  The path without the trailing slash/backslash
	 */
	public function TrimTrailingSlash($path)
	{
		$newpath = $path;

		if (substr($path, strlen($path) - 1, 1) == '\\')
		{
			$newpath = substr($path, 0, strlen($path) - 1);
		}

		if (substr($path, strlen($path) - 1, 1) == '/')
		{
			$newpath = substr($path, 0, strlen($path) - 1);
		}

		return $newpath;
	}

	/**
	 * Returns an array with the archive name variables and their values. This is used to replace variables in archive
	 * and directory names, etc.
	 *
	 * If there is a non-empty configuration value called volatile.core.archivenamevars with a serialised array it will
	 * be unserialised and used. Otherwise the name variables will be calculated on-the-fly.
	 *
	 * IMPORTANT: These variables do NOT include paths such as [SITEROOT]
	 *
	 * @return  array
	 */
	public function get_archive_name_variables()
	{
		$variables = [];

		$registry   = Factory::getConfiguration();
		$serialized = $registry->get('volatile.core.archivenamevars', null);

		if (!empty($serialized))
		{
			$variables = @unserialize($serialized);
		}

		if (empty($variables) || !is_array($variables))
		{
			$host         = Platform::getInstance()->get_host();
			$version      = defined('AKEEBA_VERSION') ? AKEEBA_VERSION : 'svn';
			$version      = defined('AKEEBABACKUP_VERSION') ? AKEEBABACKUP_VERSION : $version;
			$platformVars = Platform::getInstance()->getPlatformVersion();

			$siteName = $this->stringUrlUnicodeSlug(Platform::getInstance()->get_site_name());

			if (strlen($siteName) > 50)
			{
				$siteName = substr($siteName, 0, 50);
			}

			/**
			 * Time components. Expressed in whatever timezone the Platform decides to use.
			 */
			// Raw timezone, e.g. "EEST"
			$rawTz = Platform::getInstance()->get_local_timestamp("T");
			// Filename-safe timezone, e.g. "eest". Note the lowercase letters.
			$fsSafeTZ = strtolower(str_replace([' ', '/', ':'], ['_', '_', '_'], $rawTz));

			$randVal = new RandomValue();

			$variables = [
				'[DATE]'             => Platform::getInstance()->get_local_timestamp("Ymd"),
				'[YEAR]'             => Platform::getInstance()->get_local_timestamp("Y"),
				'[MONTH]'            => Platform::getInstance()->get_local_timestamp("m"),
				'[DAY]'              => Platform::getInstance()->get_local_timestamp("d"),
				'[TIME]'             => Platform::getInstance()->get_local_timestamp("His"),
				'[TIME_TZ]'          => Platform::getInstance()->get_local_timestamp("His") . $fsSafeTZ,
				'[WEEK]'             => Platform::getInstance()->get_local_timestamp("W"),
				'[WEEKDAY]'          => Platform::getInstance()->get_local_timestamp("l"),
				'[TZ]'               => $fsSafeTZ,
				'[TZ_RAW]'           => $rawTz,
				'[GMT_OFFSET]'       => Platform::getInstance()->get_local_timestamp("O"),
				'[HOST]'             => empty($host) ? 'unknown_host' : $host,
				'[VERSION]'          => $version,
				'[PLATFORM_NAME]'    => $platformVars['name'],
				'[PLATFORM_VERSION]' => $platformVars['version'],
				'[SITENAME]'         => $siteName,
				'[RANDOM]'           => $randVal->generateString(16, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789'),
			];
		}

		return $variables;
	}

	/**
	 * Expands the archive name variables in $source. For example "[DATE]-foobar" would be expanded to something
	 * like "141101-foobar". IMPORTANT: These variables do NOT include paths.
	 *
	 * @param   string  $source  The input string, possibly containing variables in the form of [VARIABLE]
	 *
	 * @return  string  The expanded string
	 */
	public function replace_archive_name_variables($source)
	{
		$tagReplacements = $this->get_archive_name_variables();

		return str_replace(array_keys($tagReplacements), array_values($tagReplacements), $source);
	}

	/**
	 * Expand the platform-specific stock directories variables in the input string. For example "[SITEROOT]/foobar"
	 * would be expanded to something like "/var/www/html/mysite/foobar"
	 *
	 * @param   string  $folder               The input string to expand
	 * @param   bool    $translate_win_dirs   Should I translate Windows path separators to UNIX path separators? (default: false)
	 * @param   bool    $trim_trailing_slash  Should I remove the trailing slash (default: false)
	 *
	 * @return  string  The expanded string
	 */
	public function translateStockDirs($folder, $translate_win_dirs = false, $trim_trailing_slash = false)
	{
		if (is_null(self::$stockDirs))
		{
			self::$stockDirs = Platform::getInstance()->get_stock_directories();
		}

		$temp = $folder;

		foreach (self::$stockDirs as $find => $replace)
		{
			$temp = str_replace($find, $replace, $temp);
		}

		if ($translate_win_dirs)
		{
			$temp = $this->TranslateWinPath($temp);
		}

		if ($trim_trailing_slash)
		{
			$temp = $this->TrimTrailingSlash($temp);
		}

		return $temp;
	}

	/**
	 * Rebase a path to the platform filesystem variables (most to least specific).
	 *
	 * This is the inverse procedure of translateStockDirs().
	 *
	 * @param   string  $path
	 *
	 * @return  string
	 * @since   7.3.0
	 */
	public function rebaseFolderToStockDirs(string $path): string
	{
		// Normalize the path
		$path = $this->TrimTrailingSlash($path);
		$path = $this->TranslateWinPath($path);

		// Get the stock directories, normalize them and sort them by longest to shortest
		$stock_directories = Platform::getInstance()->get_stock_directories();

		$stock_directories = array_map(function ($path) {
			$path = $this->TrimTrailingSlash($path);

			return $this->TranslateWinPath($path);
		}, $stock_directories);

		uasort($stock_directories, function ($a, $b) {
			return -($a <=> $b);
		});

		// Start replacing paths with variables
		foreach ($stock_directories as $var => $stockPath)
		{
			if (empty($stockPath))
			{
				continue;
			}

			if (strpos($path, $stockPath) !== 0)
			{
				continue;
			}

			$path = $var . substr($path, strlen($stockPath));
		}

		return $path;
	}

	/**
	 * Generates a set of files which prevent direct web access or at least web listing of the folder contents.
	 *
	 * This method generates a .htaccess for Apache, Lighttpd and Litespeed; a web.config file for IIS 7 or later; an
	 * index.php, index.html and index.htm file for all other browsers.
	 *
	 * Despite this security precaution it is STRONGLY advised to keep your backup archives in a directory outside the
	 * site's web root as explained in the Security Information chapter of the documentation. This method is designed
	 * to only provide a defence of last resort.
	 *
	 * @param   string  $dir    The output directory to secure against web access
	 * @param   bool    $force  Forcibly overwrite existing files
	 *
	 * @return  void
	 * @since   7.0.3
	 */
	public function ensureNoAccess($dir, $force = false)
	{
		// Create a .htaccess file to prevent all web access (Apache 1.3+, Lightspeed, Lighttpd, ...)
		if (!is_file($dir . '/.htaccess') || $force)
		{
			$htaccess = <<< APACHE
## This file was generated automatically by the Akeeba Backup Engine
##
## DO NOT REMOVE THIS FILE
##
## This file makes sure that your backup output directory is not directly accessible from the web if you are using
## the Apache, Lighttpd and Litespeed web server. This prevents unauthorized access to your backup archive files and
## backup log files. Removing this file could have security implications for your site.
##
## You are strongly advised to never delete or modify any of the files automatically created in this folder by the
## Akeeba Backup Engine, namely:
##
## * .htaccess
## * web.config
## * index.html
## * index.htm
## * index.php
##
<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
  <RequireAll>
    Require all denied
  </RequireAll>
</IfModule>
APACHE;

			@file_put_contents($dir . '/.htaccess', $htaccess);
		}

		// Create a web.config to prevent all web access (IIS 7+)
		if (!is_file($dir . '/web.config') || $force)
		{
			$webConfig = <<< XML
<?xml version="1.0"?>
<!--
This file was generated automatically by the Akeeba Backup Engine

DO NOT REMOVE THIS FILE

This file makes sure that your backup output directory is not directly accessible from the web if you are using the
Microsoft Internet Information Services (IIS) web server, version 7 or later. This prevents unauthorized access to your
backup archive files and backup log files. Removing this file could have security implications for your site.

As noted above, this only works on IIS 7 or later.
See https://www.iis.net/configreference/system.webserver/security/requestfiltering/fileextensions

You are strongly advised to never delete or modify any of the files automatically created in this folder by the
Akeeba Backup Engine, namely:

* .htaccess
* web.config
* index.html
* index.htm
* index.php

-->
<configuration>
    <system.webServer>
        <security>
            <requestFiltering>
                <fileExtensions allowUnlisted="false" >
                    <clear />
                    <add fileExtension=".html" allowed="true"/>
                </fileExtensions>
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>
XML;
			@file_put_contents($dir . '/web.config', $webConfig);
		}

		// Create a blank index.html or index.htm to prevent directory listings (all servers)
		$blankHtml = <<< HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Access Denied</title>
  </head>
  <body>
	  <h1>Access Denied</h1>
  </body>
</html>
HTML;

		if (!is_file($dir . '/index.html') || $force)
		{
			@file_put_contents($dir . '/index.html', $blankHtml);
		}

		if (!is_file($dir . '/index.htm') || $force)
		{
			@file_put_contents($dir . '/index.htm', $blankHtml);
		}

		// Create a default index.php to prevent directory listings with an error (all servers)
		if (!is_file($dir . '/index.php') || $force)
		{
			$deadPHP = '<' . '?' . 'php header(\'HTTP/1.1 403 Forbidden\'); return;' . '?' . ">\n";
			$deadPHP .= <<< TEXT
This file was generated automatically by the Akeeba Backup Engine

DO NOT REMOVE THIS FILE

This file tells your web server to not list the contents of this directory, instead returning an HTTP 403 Forbidden
error. This makes it implausible for a malicious third party to successfully guess the filenames of your backup
archives. Therefore, even if this folder is directly web accessible – despite the .htaccess and web.config file already
put in place by the Akeeba Backup Engine – it will still be reasonably protected against malicious users trying to
download your backup archives.

Please do not remove this file as it could have security implications for your site.

You are strongly advised to never delete or modify any of the files automatically created in this folder by the
Akeeba Backup Engine, namely:

* .htaccess
* web.config
* index.html
* index.htm
* index.php

TEXT;

			@file_put_contents($dir . '/index.php', $deadPHP);
		}
	}

	/**
	 * Convert a string to a (Unicode) slug
	 *
	 * @param   string  $string  String to process
	 *
	 * @return  string  Processed string
	 *
	 * @since   7.5.0
	 */
	public function stringUrlUnicodeSlug(string $string): string
	{
		// Replace double byte whitespaces by single byte (East Asian languages)
		$str = preg_replace('/\xE3\x80\x80/', ' ', $string);

		// Remove any '-' from the string as they will be used as concatenator.
		$str = str_replace('-', ' ', $str);

		// Replace forbidden characters by whitespaces
		$str = preg_replace('#[:\?\#\*"@+=;!><&\.%()\]\/\'\\\\|\[]#', "\x20", $str);

		// Delete all '?'
		$str = str_replace('?', '', $str);

		// Trim white spaces at beginning and end of alias and make lowercase
		$str = trim(strtolower($str));

		// Remove any duplicate whitespace and replace whitespaces by hyphens
		$str = preg_replace('#\x20+#', '-', $str);

		return $str;
	}

}
components/com_akeeba/BackupEngine/Util/HashTrait.php000060400000006042152453623440016655 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Util;

/**
 * PHP 8.4+ workaround for standalone MD5 and SHA-1 functions.
 *
 * PHP 8.4 deprecates the standalone md5(), md5_file(), sha1(), and sha1_file() functions. This trait creates shims
 * which use the hash() and hash_file() functions instead where available.
 *
 * IMPORTANT! PHP 7.4 made the ext/hash extension mandatory. These shims are here only as a backwards compatibility aid.
 * Eventually, we need to remove them, replacing their use by the direct use of hash() and hash_file().
 *
 * @deprecated 10.0
 */
trait HashTrait
{
	/**
	 * @deprecated 10.0 Use hash() instead
	 */
	private static function md5($string, $binary = false)
	{
		static $shouldUseHash = null;

		if ($shouldUseHash === null)
		{
			$shouldUseHash = function_exists('hash')
			                 && function_exists('hash_algos')
			                 && in_array('md5', hash_algos());
		}

		return $shouldUseHash ? hash('md5', $string, $binary) : md5($string, $binary);
	}

	/**
	 * @deprecated 10.0 Use hash() instead
	 */
	private static function sha1($string, $binary = false)
	{
		static $shouldUseHash = null;

		if ($shouldUseHash === null)
		{
			$shouldUseHash = function_exists('hash')
			                 && function_exists('hash_algos')
			                 && in_array('sha1', hash_algos());
		}

		return $shouldUseHash ? hash('sha1', $string, $binary) : sha1($string, $binary);
	}

	/**
	 * @deprecated 10.0 Use hash_file() instead
	 */
	private static function md5_file($filename, $binary = false)
	{
		static $shouldUseHash = null;

		if ($shouldUseHash === null)
		{
			$shouldUseHash = function_exists('hash')
			                 && function_exists('hash_algos')
			                 && in_array('md5', hash_algos());
		}

		return $shouldUseHash ? hash_file('md5', $filename, $binary) : md5_file($filename, $binary);
	}

	/**
	 * @deprecated 10.0 Use hash_file() instead
	 */
			private static function sha1_file($filename, $binary = false)
	{
		static $shouldUseHash = null;

		if ($shouldUseHash === null)
		{
			$shouldUseHash = function_exists('hash')
			                 && function_exists('hash_algos')
			                 && in_array('sha1', hash_algos());
		}

		return $shouldUseHash ? hash_file('sha1', $filename, $binary) : sha1_file($filename, $binary);
	}
}components/com_akeeba/BackupEngine/Factory.php000060400000072102152453623440015460 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Base\Part;
use Akeeba\Engine\Core\Database;
use Akeeba\Engine\Core\Filters;
use Akeeba\Engine\Core\Kettenrad;
use Akeeba\Engine\Core\Timer;
use Akeeba\Engine\Driver\Base;
use Akeeba\Engine\Dump\Native;
use Akeeba\Engine\Postproc\PostProcInterface;
use Akeeba\Engine\Util\ConfigurationCheck;
use Akeeba\Engine\Util\Encrypt;
use Akeeba\Engine\Util\EngineParameters;
use Akeeba\Engine\Util\FactoryStorage;
use Akeeba\Engine\Util\FileLister;
use Akeeba\Engine\Util\FileSystem;
use Akeeba\Engine\Util\Logger;
use Akeeba\Engine\Util\PushMessagesInterface;
use Akeeba\Engine\Util\RandomValue;
use Akeeba\Engine\Util\SecureSettings;
use Akeeba\Engine\Util\Statistics;
use Akeeba\Engine\Util\TemporaryFiles;
use DateTime;
use DateTimeZone;
use Exception;
use RuntimeException;

// Try to kill errors display
if (function_exists('ini_set') && !defined('AKEEBADEBUG'))
{
	ini_set('display_errors', false);
}

// Make sure the class autoloader is loaded
require_once __DIR__ . '/Autoloader.php';

/**
 * The Akeeba Engine Factory class
 *
 * This class is responsible for instantiating all Akeeba Engine classes
 */
abstract class Factory
{
	/**
	 * The absolute path to Akeeba Engine's installation
	 *
	 * @var  string
	 */
	private static $root;

	/**
	 * Partial class names of the loaded engines e.g. 'archiver' => 'Archiver\\Jpa'. Survives serialization.
	 *
	 * @var  array
	 */
	private static $engineClassnames = [];

	/**
	 * A list of instantiated objects which will persist after serialisation / unserialisation
	 *
	 * @var   array
	 */
	private static $objectList = [];

	/**
	 * A list of instantiated objects which will NOT persist after serialisation / unserialisation
	 *
	 * @var   array
	 */
	private static $temporaryObjectList = [];

	/**
	 * The class to use for push messages
	 *
	 * @since 9.3.1
	 * @var   string
	 */
	private static $pushClassName = 'Util\\PushMessages';

	/**
	 * Gets a serialized snapshot of the Factory for safekeeping (hibernate)
	 *
	 * @return  string  The serialized snapshot of the Factory
	 */
	public static function serialize(): string
	{
		// Call _onSerialize in all objects known to the factory
		foreach (static::$objectList as $object)
		{
			if (method_exists($object, '_onSerialize'))
			{
				call_user_func([$object, '_onSerialize']);
			}
		}

		// Serialise an array with all the engine information
		$engineInfo = [
			'root'             => static::$root,
			'objectList'       => static::$objectList,
			'engineClassnames' => static::$engineClassnames,
			'pushClassname'    => static::$pushClassName,
		];

		// Serialize the factory
		return base64_encode(serialize($engineInfo));
	}

	/**
	 * Regenerates the full Factory state from a serialized snapshot (resume)
	 *
	 * @param   string  $serializedData  The serialized snapshot to resume from
	 *
	 * @return  void
	 */
	public static function unserialize(string $serializedData): void
	{
		static::nuke();

		$engineInfo = unserialize(base64_decode($serializedData));

		static::$root                = $engineInfo['root'] ?? '';
		static::$objectList          = $engineInfo['objectList'] ?? [];
		static::$engineClassnames    = $engineInfo['engineClassnames'] ?? [];
		static::$pushClassName       = $engineInfo['pushClassname'] ?? 'Utils\\PushMessages';
		static::$temporaryObjectList = [];
	}

	/**
	 * Reset the internal factory state, freeing all previously created objects
	 *
	 * @return  void
	 */
	public static function nuke()
	{
		foreach (static::$objectList as &$object)
		{
			$object = null;
		}

		foreach (static::$temporaryObjectList as &$object)
		{
			$object = null;
		}

		static::$objectList          = [];
		static::$temporaryObjectList = [];
	}

	/**
	 * Saves the engine state to temporary storage
	 *
	 * @param   string|null  $tag       The backup origin to save. Leave empty to get from already loaded Kettenrad
	 *                                  instance.
	 * @param   string|null  $backupId  The backup ID to save. Leave empty to get from already loaded Kettenrad
	 *                                  instance.
	 *
	 * @return  void
	 *
	 * @throws  RuntimeException  When the state save fails for any reason
	 * @noinspection PhpUnused
	 */
	public static function saveState(?string $tag = null, ?string $backupId = null): void
	{
		$kettenrad = static::getKettenrad();
		$tag       = $tag ?: $kettenrad->getTag();
		$backupId  = $backupId ?: $kettenrad->getBackupId();

		$saveTag = rtrim($tag . '.' . ($backupId ?: ''), '.');
		$ret     = $kettenrad->getStatusArray();

		if ($ret['HasRun'] == 1)
		{
			Factory::getLog()->debug("Will not save a finished Kettenrad instance");

			return;
		}

		Factory::getLog()->debug("Saving Kettenrad instance $tag");

		// Save a Factory snapshot
		$factoryStorage = static::getFactoryStorage();

		$logger = static::getLog();
		$logger->resetWarnings();

		$serializedFactoryData = static::serialize();
		$memoryFileExtension   = 'php';
		$result                = $factoryStorage->set($serializedFactoryData, $saveTag, $memoryFileExtension);

		/**
		 * Some hosts, such as WPEngine, do not allow us to save the memory files in .php files. In this case we use the
		 * far more insecure .dat extension.
		 */
		if ($result === false)
		{
			$memoryFileExtension = 'dat';
			$result              = $factoryStorage->set($serializedFactoryData, $saveTag, $memoryFileExtension);
		}

		if ($result === false)
		{
			$saveKey      = $factoryStorage->get_storage_filename($saveTag, $memoryFileExtension);
			$errorMessage = "Cannot save factory state in storage, storage filename $saveKey";

			$logger->error($errorMessage);

			throw new RuntimeException($errorMessage);
		}
	}

	/**
	 * Loads the engine state from the storage (if it exists).
	 *
	 * When failIfMissing is true (default) an exception will be thrown if the memory file / database record is no
	 * longer there. This is a clear indication of an issue with the storage engine, e.g. the host deleting the memory
	 * files in the middle of the backup step. Therefore, we'll switch the storage engine type before throwing the
	 * exception.
	 *
	 * When failIfMissing is false we do NOT throw an exception. Instead, we do a hard reset of the backup factory. This
	 * is required by the resetState method when we ask it to reset multiple origins at once.
	 *
	 * @param   string|null  $tag            The backup origin to load
	 * @param   string|null  $backupId       The backup ID to load
	 * @param   bool         $failIfMissing  Throw an exception if the memory data is no longer there
	 *
	 * @return  void
	 */
	public static function loadState(?string $tag = null, ?string $backupId = null, bool $failIfMissing = true): void
	{
		/** @noinspection PhpUndefinedConstantInspection */
		$tag     = $tag ?: (defined('AKEEBA_BACKUP_ORIGIN') ? AKEEBA_BACKUP_ORIGIN : 'backend');
		$loadTag = rtrim($tag . '.' . ($backupId ?: ''), '.');

		// In order to load anything, we need to have the correct profile loaded. Let's assume
		// that the latest backup record in this tag has the correct profile number set.
		$config = static::getConfiguration();

		if (empty($config->activeProfile))
		{
			$profile = Platform::getInstance()->get_active_profile();

			if (empty($profile) || ($profile <= 1))
			{
				// Only bother loading a configuration if none has been already loaded
				$filters = [
					['field' => 'tag', 'value' => $tag],
				];

				if (!empty($backupId))
				{
					$filters[] = ['field' => 'backupid', 'value' => $backupId];
				}

				$statList = Platform::getInstance()->get_statistics_list([
						'filters' => $filters, 'order' => [
							'by' => 'id', 'order' => 'DESC',
						],
					]
				);

				if (is_array($statList))
				{
					$stat    = array_pop($statList) ?? [];
					$profile = $stat['profile_id'] ?? 1;
				}
			}

			Platform::getInstance()->load_configuration($profile);
		}

		$profile = $config->activeProfile;

		Factory::getLog()->open($loadTag);
		Factory::getLog()->debug("Kettenrad :: Attempting to load from database ($tag) [$loadTag]");

		$serializedFactory = static::getFactoryStorage()->get($loadTag);

		if ($serializedFactory === null)
		{
			if ($failIfMissing)
			{
				throw new RuntimeException("Akeeba Engine detected a problem while saving temporary data. Please restart your backup.", 500);
			}

			// There is no serialized factory. Nuke the in-memory factory.
			Factory::getLog()->debug(" -- Stored Akeeba Factory ($tag) [$loadTag] not found - hard reset");
			static::nuke();
			Platform::getInstance()->load_configuration($profile);
		}
		else
		{
			Factory::getLog()->debug(" -- Loaded stored Akeeba Factory ($tag) [$loadTag]");
			static::unserialize($serializedFactory);
		}


		unset($serializedFactory);
	}

	// ========================================================================
	// Public factory interface
	// ========================================================================

	/**
	 * Resets the engine state, wiping out any pending backups and/or stale temporary data.
	 *
	 * The configuration parameters are:
	 *
	 * * global  `bool`  True to reset all backups, regardless of the origin or profile ID
	 * * log     `bool`  True to log our actions (default: false)
	 * * maxrun  `int`   Only backup records older than this number of seconds will be reset (default: 180)
	 *
	 * Special considerations:
	 *
	 * * If global = true all backups from all origins are taken into account to determine which ones are stuck (over
	 *   the maxrun threshold since their last database entry).
	 *
	 * * If global = false only backups from the current backup origin are taken into account.
	 *
	 * * If global = false AND the current origin is 'backend' all pending and idle backups with the 'backup' origin are
	 *   considered stuck regardless of their age. In other words, maxrun is effectively set to 0. The idea is that only
	 *   a single person, from a single browser, should be taking backend backups at a time. Resetting single origin
	 *   backups is only ever meant to be called by the consumer when starting a backup.
	 *
	 * * Corollary to the above: starting a frontend, CLI or JSON API backup with the same backup profile DOES NOT reset
	 *   a previously failed backup if the new backup starts less than 'maxrun' seconds since the last step of the
	 *   failed backup started.
	 *
	 * * The time information for the backup age is taken from the database, namely the backupend field. If no time
	 *   is recorded for the last step we use the backupstart field instead.
	 *
	 * @param   array  $config  Configuration parameters for the reset operation
	 *
	 * @return  void
	 * @throws  Exception
	 * @noinspection PhpUnused
	 */
	public static function resetState(array $config = []): void
	{
		$defaultConfig = [
			'global' => true,
			'log'    => false,
			'maxrun' => 180,
		];

		$config = (object) array_merge($defaultConfig, $config);

		// Pause logging if so desired
		if (!$config->log)
		{
			Factory::getLog()->pause();
		}

		// Get the origin to clear, depending on the 'global' setting
		$originTag = $config->global ? null : Platform::getInstance()->get_backup_origin();

		// Cache the factory before proceeding
		$factory = static::serialize();

		// Get all running backups for the selected origin (or all origins, if global was false).
		$runningList = Platform::getInstance()->get_running_backups($originTag);

		// Sanity check
		if (!is_array($runningList))
		{
			$runningList = [];
		}

		// If the current origin is 'backend' we assume maxrun = 0 per the method docblock notes.
		$maxRun = ($originTag == 'backend') ? 0 : $config->maxrun;

		// Filter out entries by backup age
		$now         = time();
		$cutOff      = $now - $maxRun;
		$runningList = array_filter($runningList, function (array $running) use ($cutOff, $maxRun) {
			// No cutoff time: include all currently running backup records
			if ($maxRun == 0)
			{
				return true;
			}

			// Try to get the last backup tick timestamp
			try
			{
				$backupTickTime = !empty($running['backupend']) ? $running['backupend'] : $running['backupstart'];
				$tz             = new DateTimeZone('UTC');
				$tstamp         = (new DateTime($backupTickTime, $tz))->getTimestamp();
			}
			catch (Exception $e)
			{
				$tstamp = Factory::getLog()->getLastTimestamp($running['origin']);
			}

			if (is_null($tstamp))
			{
				return false;
			}

			// Only include still running backups whose last tick was BEFORE the cutoff time
			return $tstamp <= $cutOff;
		});

		// Mark running backups as failed
		foreach ($runningList as $running)
		{
			// Delete the failed backup's leftover archive parts
			$filenames = Factory::getStatistics()->get_all_filenames($running, false);
			$filenames = is_null($filenames) ? [] : $filenames;
			$totalSize = 0;

			foreach ($filenames as $failedArchive)
			{
				if (!@file_exists($failedArchive))
				{
					continue;
				}

				$totalSize += (int) @filesize($failedArchive);
				Platform::getInstance()->unlink($failedArchive);
			}

			// Mark the backup failed
			$running['status']     = 'fail';
			$running['instep']     = 0;
			$running['total_size'] = empty($running['total_size']) ? $totalSize : $running['total_size'];
			$running['multipart']  = 0;

			Platform::getInstance()->set_or_update_statistics($running['id'], $running);

			// Remove the temporary data
			$backupId = isset($running['backupid']) ? ('.' . $running['backupid']) : '';

			self::removeTemporaryData($running['origin'] . $backupId);
		}

		// Reload the factory
		static::unserialize($factory);
		unset($factory);

		// Unpause logging if it was previously paused
		if (!$config->log)
		{
			Factory::getLog()->unpause();
		}
	}

	/**
	 * Returns an Akeeba Configuration object
	 *
	 * @return  Configuration  The Akeeba Configuration object
	 */
	public static function getConfiguration(): Configuration
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getObjectInstance(Configuration::class);
	}

	/**
	 * Returns a statistics object, used to track current backup's progress
	 *
	 * @return  Statistics
	 */
	public static function getStatistics(): Statistics
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getObjectInstance(Statistics::class);
	}

	/**
	 * Returns the currently configured archiver engine
	 *
	 * @param   bool  $reset  Should I try to forcibly create a new instance?
	 *
	 * @return  Archiver\Base|null
	 */
	public static function getArchiverEngine(bool $reset = false): ?Archiver\Base
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getEngineInstance(
			'archiver', 'akeeba.advanced.archiver_engine',
			'Archiver\\', 'Archiver\\Jpa',
			$reset
		);
	}

	/**
	 * Returns the currently configured dump engine
	 *
	 * @param   boolean  $reset  Should I try to forcibly create a new instance?
	 *
	 * @return  Dump\Base|Native|null
	 */
	public static function getDumpEngine(bool $reset = false): ?object
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getEngineInstance(
			'dump', 'akeeba.advanced.dump_engine',
			'Dump\\', 'Dump\\Native',
			$reset
		);
	}

	/**
	 * Returns the filesystem scanner engine instance
	 *
	 * @param   bool  $reset  Should I try to forcibly create a new instance?
	 *
	 * @return  Scan\Base|null  The scanner engine
	 */
	public static function getScanEngine(bool $reset = false): ?Scan\Base
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getEngineInstance(
			'scan', 'akeeba.advanced.scan_engine',
			'Scan\\', 'Scan\\Large',
			$reset
		);
	}

	/**
	 * Returns the current post-processing engine. If no class is specified we
	 * return the post-processing engine configured in akeeba.advanced.postproc_engine
	 *
	 * @param   string|null  $engine  The name of the post-processing class to forcibly return
	 *
	 * @return  PostProcInterface|null
	 */
	public static function getPostprocEngine(?string $engine = null): ?PostProcInterface
	{
		if (!is_null($engine))
		{
			static::$engineClassnames['postproc'] = 'Postproc\\' . ucfirst($engine);

			/** @noinspection PhpIncompatibleReturnTypeInspection */
			return static::getObjectInstance(static::$engineClassnames['postproc']);
		}

		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getEngineInstance(
			'postproc', 'akeeba.advanced.postproc_engine',
			'Postproc\\', 'Postproc\\None',
			true
		);
	}

	// ========================================================================
	// Core objects which are part of the engine state
	// ========================================================================

	/**
	 * Returns an instance of the Filters feature class
	 *
	 * @return  Filters  The Filters feature class' object instance
	 */
	public static function getFilters(): Filters
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getObjectInstance(Filters::class);
	}

	/**
	 * Returns an instance of the specified filter group class. Do note that it does not
	 * work with platform filter classes. They are handled internally by AECoreFilters.
	 *
	 * @param   string  $filter_name  The filter class to load, without AEFilter prefix
	 *
	 * @return  Filter\Base|null  The filter class' object instance
	 */
	public static function getFilterObject(string $filter_name): ?Filter\Base
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getObjectInstance('Filter\\' . ucfirst($filter_name));
	}

	/**
	 * Loads an engine domain class and returns its associated object
	 *
	 * @param   string  $domainName  The name of the domain, e.g. installer for AECoreDomainInstaller
	 *
	 * @return  Part|null
	 */
	public static function getDomainObject(string $domainName): ?Part
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getObjectInstance('Core\\Domain\\' . ucfirst($domainName));
	}

	/**
	 * Returns a database connection object. It's an alias of AECoreDatabase::getDatabase()
	 *
	 * !!! IMPORTANT !!!
	 * DO NOT STATIC TYPE THIS METHOD.
	 *
	 * Akeeba Backup for Joomla is using a decorator to the Joomla DB object which makes use of the magic __call method
	 * to proxy driver calls. As a result it cannot adhere to an object declaration or interface. Until this is
	 * refactored we have to keep this method untyped.
	 *
	 * @param   array|null  $options  Options to use when instantiating the database connection
	 *
	 * @return  Base
	 */
	public static function getDatabase(?array $options = null)
	{
		if (is_null($options))
		{
			$options = Platform::getInstance()->get_platform_database_options();
		}

		if (isset($options['username']) && !isset($options['user']))
		{
			$options['user'] = $options['username'];
		}

		return Database::getDatabase($options);
	}

	/**
	 * Returns a database connection object. It's an alias of AECoreDatabase::getDatabase()
	 *
	 * @param   array|null  $options  Options to use when instantiating the database connection
	 *
	 * @return  void
	 */
	public static function unsetDatabase(?array $options = null): void
	{
		if (is_null($options))
		{
			$options = Platform::getInstance()->get_platform_database_options();
		}

		$db = Database::getDatabase($options);
		$db->close();

		Database::unsetDatabase($options);
	}

	/**
	 * Get a reference to the Akeeba Engine's timer
	 *
	 * @return  Timer
	 */
	public static function getTimer(): Timer
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getObjectInstance(Timer::class);
	}

	/**
	 * Get a reference to Akeeba Engine's main controller called Kettenrad
	 *
	 * @return  Kettenrad
	 */
	public static function getKettenrad(): Kettenrad
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getObjectInstance(Kettenrad::class);
	}

	/**
	 * Returns an instance of the factory temporary storage class
	 *
	 * @return  FactoryStorage
	 */
	public static function getFactoryStorage(): FactoryStorage
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getTempObjectInstance(FactoryStorage::class);
	}

	/**
	 * Returns an instance of the encryption class
	 *
	 * @return  Encrypt
	 */
	public static function getEncryption(): Encrypt
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getTempObjectInstance(Encrypt::class);
	}

	/**
	 * Returns an instance of the crypto-safe random value generator class
	 *
	 * @return  RandomValue
	 */
	public static function getRandval(): RandomValue
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getTempObjectInstance(RandomValue::class);
	}

	/**
	 * Returns an instance of the filesystem tools class
	 *
	 * @return  FileSystem
	 */
	public static function getFilesystemTools(): FileSystem
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getTempObjectInstance(FileSystem::class);
	}

	/**
	 * Returns an instance of the filesystem tools class
	 *
	 * @return  FileLister
	 * @noinspection PhpUnused
	 */
	public static function getFileLister(): FileLister
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getTempObjectInstance(FileLister::class);
	}

	// ========================================================================
	// Temporary objects which are not part of the engine state
	// ========================================================================

	/**
	 * Returns an instance of the engine parameters provider which provides information on scripting, GUI configuration
	 * elements and engine parts
	 *
	 * @return  EngineParameters
	 */
	public static function getEngineParamsProvider(): EngineParameters
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getTempObjectInstance(EngineParameters::class);
	}

	/**
	 * Returns an instance of the log object
	 *
	 * @return  Logger
	 */
	public static function getLog(): Logger
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getTempObjectInstance(Logger::class);
	}

	/**
	 * Returns an instance of the configuration checks object
	 *
	 * @return  ConfigurationCheck
	 */
	public static function getConfigurationChecks(): ConfigurationCheck
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getTempObjectInstance(ConfigurationCheck::class);
	}

	/**
	 * Returns an instance of the secure settings handling object
	 *
	 * @return  SecureSettings
	 */
	public static function getSecureSettings(): SecureSettings
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getTempObjectInstance(SecureSettings::class);
	}

	/**
	 * Returns an instance of the secure settings handling object
	 *
	 * @return  TemporaryFiles
	 */
	public static function getTempFiles(): TemporaryFiles
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getTempObjectInstance(TemporaryFiles::class);
	}

	/**
	 * Get the connector object for push messages
	 *
	 * !!! WARNING !!! DO NOT STATIC TYPE
	 *
	 * The object type may change using setPushClass.
	 *
	 * @return  PushMessagesInterface
	 */
	public static function getPush()
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return static::getObjectInstance(self::$pushClassName);
	}

	/**
	 * Set the push notifications helper class to use with this factory
	 *
	 * @param   string  $className  The classname to use
	 *
	 * @since   9.3.1
	 * @noinspection PhpUnused
	 */
	public static function setPushClass(string $className): void
	{
		self::$pushClassName = $className;
	}

	/**
	 * Returns the absolute path to Akeeba Engine's installation
	 *
	 * @return  string
	 */
	public static function getAkeebaRoot(): string
	{
		if (empty(static::$root))
		{
			static::$root = __DIR__;
		}

		return static::$root;
	}

	/**
	 * @param   string  $engineType  Engine type, e.g. 'archiver', 'postproc', ...
	 * @param   string  $configKey   Profile config key with configured engine e.g. 'akeeba.advanced.archiver_engine'
	 * @param   string  $prefix      Prefix for engine classes, e.g. 'Archiver\\'
	 * @param   string  $fallback    Fallback class if the configured one doesn't exist e.g. 'Archiver\\Jpa'. Empty for
	 *                               no fallback.
	 * @param   bool    $reset       Should I force-reload the engine? Default: false.
	 *
	 * @return  object|null  The Singleton engine object instance
	 */
	protected static function getEngineInstance(string $engineType, string $configKey, string $prefix, string $fallback, bool $reset = false): ?object
	{
		if (!$reset && !empty(static::$engineClassnames[$engineType]))
		{
			return static::getObjectInstance(static::$engineClassnames[$engineType]);
		}

		// Unset the existing engine object
		if (!empty(static::$engineClassnames[$engineType]))
		{
			static::unsetObjectInstance(static::$engineClassnames[$engineType]);
		}

		// Get the engine name from the backup profile, construct a class name and check if it exists
		$registry                              = static::getConfiguration();
		$engine                                = $registry->get($configKey);
		static::$engineClassnames[$engineType] = $prefix . ucfirst($engine);
		$object                                = static::getObjectInstance(static::$engineClassnames[$engineType]);

		// If the engine object does not exist, fall back to the default
		if (!empty($fallback) && !is_object($object))
		{
			static::unsetObjectInstance(static::$engineClassnames[$engineType]);

			static::$engineClassnames[$engineType] = $fallback;
		}

		return static::getObjectInstance(static::$engineClassnames[$engineType]);
	}

	/**
	 * Internal function which instantiates an object of a class named $class_name.
	 *
	 * @param   string  $className
	 *
	 * @return  object|null
	 */
	protected static function getObjectInstance(string $className): ?object
	{
		$className = trim($className, '\\');

		if (substr($className, 0, 14) === 'Akeeba\\Engine\\')
		{
			$searchClass = $className;
			$className = substr($className, 14);
		}
		else
		{
			$searchClass = '\\Akeeba\\Engine\\' . $className;
		}

		if (isset(static::$objectList[$className]))
		{
			return static::$objectList[$className];
		}

		static::$objectList[$className] = null;

		if (class_exists($searchClass))
		{
			static::$objectList[$className] = new $searchClass;
		}
		elseif (class_exists($className))
		{
			static::$objectList[$className] = new $className;
		}

		return static::$objectList[$className];
	}

	// ========================================================================
	// Handy functions
	// ========================================================================

	/**
	 * Internal function which removes the object of the class named $class_name
	 *
	 * @param   string  $className
	 *
	 * @return  void
	 */
	protected static function unsetObjectInstance(string $className): void
	{
		if (substr($className, 0, 14) === 'Akeeba\\Engine\\')
		{
			$className = substr($className, 14);
		}

		if (isset(static::$objectList[$className]))
		{
			static::$objectList[$className] = null;
			unset(static::$objectList[$className]);
		}
	}

	/**
	 * Internal function which instantiates an object of a class named $class_name. This is a temporary instance which
	 * will not survive serialisation and subsequent unserialisation.
	 *
	 * @param   string  $className
	 *
	 * @return  object|null
	 */
	protected static function getTempObjectInstance(string $className): ?object
	{
		$className = trim($className, '\\');

		if (substr($className, 0, 14) === 'Akeeba\\Engine\\')
		{
			$searchClass = $className;
			$className = substr($className, 14);
		}
		else
		{
			$searchClass = '\\Akeeba\\Engine\\' . $className;
		}

		if (!isset(static::$temporaryObjectList[$className]))
		{
			static::$temporaryObjectList[$className] = null;

			if (class_exists($searchClass))
			{
				static::$temporaryObjectList[$className] = new $searchClass;
			}
		}

		return static::$temporaryObjectList[$className];
	}

	/**
	 * Remote the temporary data for a specific backup tag.
	 *
	 * @param   string  $originTag  The backup tag to reset e.g. 'backend.id123' or 'frontend'.
	 *
	 * @return  void
	 */
	protected static function removeTemporaryData(string $originTag): void
	{
		static::loadState($originTag, null, false);
		// Remove temporary files
		Factory::getTempFiles()->deleteTempFiles();
		// Delete any stale temporary data
		static::getFactoryStorage()->reset($originTag);
	}
}

/**
 * Timeout handler. It is registered as a global PHP shutdown function.
 *
 * If a PHP reports a timeout we will log this before letting PHP kill us.
 */
function AkeebaTimeoutTrap(): void
{
	if (connection_status() >= 2)
	{
		Factory::getLog()->error('Akeeba Engine has timed out');
	}
}

register_shutdown_function("\\Akeeba\\Engine\\AkeebaTimeoutTrap");
components/com_akeeba/BackupEngine/.htaccess000060400000000246152453623440015136 0ustar00<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
  <RequireAll>
    Require all denied
  </RequireAll>
</IfModule>
components/com_akeeba/BackupEngine/FixMySQLHostname.php000060400000016172152453623440017171 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine;

defined('AKEEBAENGINE') || die();

trait FixMySQLHostname
{
	/**
	 * Tries to parse all the weird hostname definitions and normalize them into something that the MySQLi connector
	 * will understand. Please note that there are some differences to the old MySQL driver:
	 *
	 * * Port and socket MUST be provided separately from the hostname. Hostnames in the form of 127.0.0.1:8336 are no
	 *   longer acceptable.
	 *
	 * * The hostname "localhost" has special meaning. It means "use named pipes / sockets". Anything else uses TCP/IP.
	 *   This is the ONLY way to specify a. TCP/IP or b. named pipes / sockets connection.
	 *
	 * * You SHOULD NOT use a numeric TCP/IP port with hostname localhost. For some strange reason it's still allowed
	 *   but the manual is self-contradicting over what this really does...
	 *
	 * * Likewise you CANNOT use a socket / named pipe path with hostname other than localhost. Named pipes and sockets
	 *   can only be used with the local machine, therefore the hostname MUST be localhost.
	 *
	 * * You cannot give a TCP/IP port number in the socket parameter or a named pipe / socket path to the port
	 *   parameter. This leads to an error.
	 *
	 * * You cannot use an empty string, 0 or any other non-null value when you want to omit either of the port or
	 *   socket parameters.
	 *
	 * * Persistent connections must be prefixed with the string literal 'p:'. Therefore you cannot have a hostname
	 *   called 'p' (not to mention that'd be daft). You can also not specify something like 'p:1234' to make a
	 *   persistent connection to a port. This wasn't even supported by the old MySQL driver. As a result we don't even
	 *   try to catch that degenerate case.
	 *
	 * This method will try to apply all of the aforementioned rules with one additional disambiguation rule:
	 *
	 * A port / socket set in the hostname overrides a port specified separately. A port specified separately overrides
	 * a socket specified separately.
	 *
	 * @param   string  $host    The hostname. Can contain legacy hostname:port or hostname:sc=ocket definitions.
	 * @param   int     $port    The port. Alternatively it can contain the path to the socket.
	 * @param   string  $socket  The path to the socket. You could abuse it to enter the port number. DON'T!
	 *
	 * @return  void  All parameters are passed by reference.
	 *
	 * @since   9.2.3
	 */
	protected function fixHostnamePortSocket(&$host, &$port, &$socket)
	{
		// Is this a persistent connection? Persistent connections are indicated by the literal "p:" in front of the hostname
		$isPersistent = (substr($host, 0, 2) == 'p:');
		$host         = $isPersistent ? substr($host, 2) : $host;

		// If the hostname looks like a *NIX filename we need to treat it as a socket.
		if (preg_match('#^/([^/]*/)?[^/]#', $host))
		{
			$socket = $host;
			$host = null;
		}

		// Special case: Windows named pipe (\\.\something\or\another), with or without parentheses.
		$isNamedPipe = false;

		if (preg_match("#^\(?\\\\\\\\\.\\\\#", $host))
		{
			$isNamedPipe = true;
			$socket = $host;
			$host = '.';
		}

		/*
		 * Unlike mysql_connect(), mysqli_connect() takes the port and socket as separate arguments. Therefore, we
		 * have to extract them from the host string.
		 */
		$port = !empty($port) ? $port : 3306;

		if ($host === 'localhost')
		{
			$port = null;
		}
		// UNIX socket URI, e.g. 'unix:/path/to/unix/socket.sock'
		elseif (preg_match('/^unix:(?P<socket>[^:]+)$/', $host, $matches))
		{
			$host   = null;
			$socket = $matches['socket'];
			$port   = null;
		}
		// It's an IPv4 address with or without port
		elseif (preg_match('/^(?P<host>((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(:(?P<port>.+))?$/', $host, $matches))
		{
			$host = $matches['host'];

			if (!empty($matches['port']))
			{
				$port = $matches['port'];
			}
		}
		// Square-bracketed IPv6 address with or without port, e.g. [fe80:102::2%eth1]:3306
		elseif (preg_match('/^(?P<host>\[.*\])(:(?P<port>.+))?$/', $host, $matches))
		{
			$host = $matches['host'];

			if (!empty($matches['port']))
			{
				$port = $matches['port'];
			}
		}
		// Named host (e.g example.com or localhost) with or without port
		elseif (preg_match('/^(?P<host>(\w+:\/{2,3})?[a-z0-9\.\-]+)(:(?P<port>[^:]+))?$/i', $host, $matches))
		{
			$host = $matches['host'];

			if (!empty($matches['port']))
			{
				$port = $matches['port'];
			}
		}
		// Empty host, just port, e.g. ':3306'
		elseif (preg_match('/^:(?P<port>[^:]+)$/', $host, $matches))
		{
			$host = '127.0.0.1';
			$port = $matches['port'];
		}
		// ... else we assume normal (naked) IPv6 address, so host and port stay as they are or default

		// If there is both a valid port and a valid socket we will choose the socket instead
		if (is_numeric($port) && !empty($socket))
		{
			$port = null;
		}

		// Get the port number or socket name
		if (is_numeric($port))
		{
			$port   = (int) $port;
			$socket = '';
		}
		elseif (is_string($port) && empty($socket))
		{
			$socket = $port;
			$port = null;
		}

		// If there is a socket the hostname must be null
		if (!empty($socket))
		{
			$host = null;
		}

		// If there is a socket the port must be null
		if (!empty($socket))
		{
			$port = null;
		}

		// If there is a numeric port and the hostname is 'localhost' convert to 127.0.0.1
		if (is_numeric($port) && ($host === 'localhost'))
		{
			$host = '127.0.0.1';
		}

		/**
		 * Special case: MySQL sockets on Windows need to be enclosed with parentheses and have \\.\ in front.
		 *
		 * @see https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-connection-socket.html
		 * @see https://www.php.net/manual/en/mysqli.quickstart.connections.php
		 */
		if (!empty($socket) && $isNamedPipe)
		{
			$host = '.';

			/**
			 * Remove any existing parentheses, otherwise URL-decode the socket (in case it was given in the correct
			 * percent encoded format).
			 */
			if (substr($socket, 0, 1) === '(' && substr($socket, -1) === ')')
			{
				$socket = substr($socket, 1, -1);

			}
			else
			{
				$socket = rawurldecode($socket);
			}

			// If the socket doesn't already start with \\.\ add it
			if (substr($socket, 0, 4) !== '\\\\.\\')
			{
				$socket = '\\\\.\\' . $socket;
			}

			$socket = '(' . $socket . ')';
		}

		// Finally, if it's a persistent connection we have to prefix the hostname with 'p:'
		$host = ($isPersistent && $host !== null) ? "p:$host" : $host;
	}

}components/com_akeeba/BackupEngine/Autoloader.php000060400000006362152453623440016155 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine;

defined('AKEEBAENGINE') || die();

/**
 * The main class autoloader for AkeebaEngine
 */
class Autoloader
{
	/**
	 * An instance of this autoloader
	 *
	 * @var   Autoloader
	 */
	public static $autoloader = null;

	/**
	 * The path to the Akeeba Engine root directory
	 *
	 * @var   string
	 */
	public static $enginePath = null;

	/**
	 * The directories where Akeeba Engine platforms are stored
	 *
	 * @var      array
	 */
	public static $platformDirs = null;

	/**
	 * Public constructor. Registers the autoloader with PHP.
	 */
	public function __construct()
	{
		self::$enginePath = __DIR__;

		spl_autoload_register([$this, 'autoload_akeeba_engine']);
	}

	/**
	 * Initialise this autoloader
	 *
	 * @return  Autoloader
	 */
	public static function init()
	{
		if (self::$autoloader == null)
		{
			self::$autoloader = new self;
		}

		return self::$autoloader;
	}

	/**
	 * The actual autoloader
	 *
	 * @param   string  $className  The name of the class to load
	 *
	 * @return  void
	 */
	public function autoload_akeeba_engine($className)
	{
		// Trim the trailing backslash
		$className = ltrim($className, '\\');

		// Make sure the class has an Akeeba\Engine prefix
		if (substr($className, 0, 13) != 'Akeeba\\Engine')
		{
			return;
		}

		// Remove the prefix and explode on backslashes
		$className = substr($className, 14);
		$class     = explode('\\', $className);

		// Do we have a list of platform directories?
		if (is_null(self::$platformDirs) && class_exists('\\Akeeba\\Engine\\Platform', false))
		{
			self::$platformDirs = Platform::getPlatformDirectories();

			if (!is_array(self::$platformDirs))
			{
				self::$platformDirs = [];
			}
		}

		$rootPaths = [self::$enginePath];

		if (is_array(self::$platformDirs))
		{
			$rootPaths = array_merge(
				self::$platformDirs, [self::$enginePath]
			);
		}

		foreach ($rootPaths as $rootPath)
		{
			// First try finding in structured directory format (preferred)
			$path = $rootPath . '/' . implode('/', $class) . '.php';

			if (@file_exists($path))
			{
				include_once $path;
			}

			// Then try the duplicate last name structured directory format (not recommended)
			if (!class_exists($className, false))
			{
				reset($class);
				$lastPart = end($class);
				$path     = $rootPath . '/' . implode('/', $class) . '/' . $lastPart . '.php';

				if (@file_exists($path))
				{
					include_once $path;
				}
			}
		}
	}
}

// Register the Akeeba Engine autoloader
Autoloader::init();
components/com_akeeba/BackupEngine/serverkey.php000060400000000166152453623440016071 0ustar00<?php defined('AKEEBAENGINE') or die(); define('AKEEBA_SERVERKEY', 'NjdiZmViODZmZjUxY2ZmNDU0YzY4NjkzMDMyOThiMWI='); ?>components/com_akeeba/BackupEngine/Archiver/BaseArchiver.php000060400000054544152453623440020164 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Archiver;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Base\Exceptions\ErrorException;
use Akeeba\Engine\Base\Exceptions\WarningException;
use Akeeba\Engine\Factory;

if (!defined('AKEEBA_CHUNK'))
{
	$configuration = Factory::getConfiguration();
	$chunksize     = $configuration->get('engine.archiver.common.chunk_size', 1048576);
	define('AKEEBA_CHUNK', $chunksize);
}

if (!function_exists('aksubstr'))
{
	/**
	 * Attempt to use mbstring for getting parts of strings
	 *
	 * @param   string    $string
	 * @param   int       $start
	 * @param   int|null  $length
	 *
	 * @return  string
	 */
	function aksubstr($string, $start, $length = null)
	{
		return function_exists('mb_substr') ? mb_substr($string, $start, $length, '8bit') :
			substr($string, $start, $length);
	}
}

/**
 * Abstract class for custom archiver implementations
 */
abstract class BaseArchiver extends BaseFileManagement
{
	/** @var   array  The last part which has been finalized and waits to be post-processed */
	public $finishedPart = [];

	/** @var resource File pointer to the archive being currently written to */
	protected $fp = null;

	/** @var resource File pointer to the archive's central directory file (for ZIP) */
	protected $cdfp = null;

	/** @var string The name of the file holding the archive's data, which becomes the final archive */
	protected $_dataFileName;

	/** @var string Archive full path without extension */
	protected $dataFileNameWithoutExtension = '';

	/** @var bool Should I store symlinks as such (no dereferencing?) */
	protected $storeSymlinkTarget = false;

	/** @var int Part size for split archives, in bytes */
	protected $partSize = 0;

	/** @var bool Should I use Split ZIP? */
	protected $useSplitArchive = false;

	/** @var int Permissions for the backup archive part files */
	protected $permissions = null;

	/**
	 * Release file pointers when the object is being serialized
	 *
	 * @codeCoverageIgnore
	 *
	 * @return  void
	 */
	public function _onSerialize()
	{
		$this->_closeAllFiles();

		$this->fp   = null;
		$this->cdfp = null;
	}

	/**
	 * Release file pointers when the object is being destroyed
	 *
	 * @codeCoverageIgnore
	 *
	 * @return  void
	 */
	public function __destruct()
	{
		$this->_closeAllFiles();

		$this->fp   = null;
		$this->cdfp = null;
	}

	/**
	 * Create a new archive part file (but does NOT open it for writing)
	 *
	 * @param   bool  $finalPart  True if this is the final part
	 *
	 * @return  bool  False if creating a new part fails
	 */
	abstract protected function createNewPartFile($finalPart = false);

	/**
	 * Create a new part file and open it for writing
	 *
	 * @param   bool  $finalPart  Is this the final part?
	 *
	 * @return  void
	 */
	protected function createAndOpenNewPart($finalPart = false)
	{
		@$this->fclose($this->fp);
		$this->fp = null;

		// Not enough space on current part, create new part
		if (!$this->createNewPartFile($finalPart))
		{
			$extension = $this->getExtension();
			$extension = ltrim(strtoupper($extension), '.');

			throw new ErrorException("Could not create new $extension part file " . basename($this->_dataFileName));
		}

		$this->openArchiveForOutput(true);
	}

	/**
	 * Create a new backup archive
	 *
	 * @return  void
	 *
	 * @throws  ErrorException
	 */
	protected function createNewBackupArchive()
	{
		Factory::getLog()->debug(__CLASS__ . " :: Killing old archive");

		$this->fp = $this->fopen($this->_dataFileName, "w");

		if ($this->fp === false)
		{
			if (file_exists($this->_dataFileName))
			{
				@unlink($this->_dataFileName);
			}

			@touch($this->_dataFileName);
			@chmod($this->_dataFileName, 0666);

			$this->fp = $this->fopen($this->_dataFileName, "w");

			if ($this->fp !== false)
			{
				throw new ErrorException("Could not open archive file '{$this->_dataFileName}' for append!");
			}
		}

		@ftruncate($this->fp, 0);
	}

	/**
	 * Opens the backup archive file for output. Returns false if the archive file cannot be opened in binary append
	 * mode.
	 *
	 * @param   bool  $force  Should I forcibly reopen the file? If false, I'll only open the file if the current
	 *                        file pointer is null.
	 *
	 * @return  void
	 */
	protected function openArchiveForOutput($force = false)
	{
		if (is_null($this->fp) || $force)
		{
			$this->fp = $this->fopen($this->_dataFileName, "a");
		}

		if ($this->fp === false)
		{
			$this->fp = null;

			throw new ErrorException("Could not open archive file '{$this->_dataFileName}' for append!");
		}
	}

	/**
	 * Converts a human formatted size to integer representation of bytes,
	 * e.g. 1M to 1024768
	 *
	 * @param   string  $setting  The value in human readable format, e.g. "1M"
	 *
	 * @return  integer  The value in bytes
	 */
	protected function humanToIntegerBytes($setting)
	{
		$val  = trim($setting);
		$last = strtolower($val[strlen($val) - 1]);

		if (is_numeric($last))
		{
			return $setting;
		}

		switch ($last)
		{
			case 't':
				$val *= 1024;
			case 'g':
				$val *= 1024;
			case 'm':
				$val *= 1024;
			case 'k':
				$val *= 1024;
		}

		return (int) $val;
	}

	/**
	 * Get the PHP memory limit in bytes
	 *
	 * @return int|null  Memory limit in bytes or null if we can't figure it out.
	 */
	protected function getMemoryLimit()
	{
		if (!function_exists('ini_get'))
		{
			return null;
		}

		$memLimit = ini_get("memory_limit");

		if ((is_numeric($memLimit) && ($memLimit < 0)) || !is_numeric($memLimit))
		{
			$memLimit = 0; // 1.2a3 -- Rare case with memory_limit < 0, e.g. -1Mb!
		}

		$memLimit = $this->humanToIntegerBytes($memLimit);

		return $memLimit;
	}

	/**
	 * Enable storing of symlink target if we are not on Windows
	 *
	 * @return  void
	 */
	protected function enableSymlinkTargetStorage()
	{
		$configuration       = Factory::getConfiguration();
		$dereferenceSymlinks = $configuration->get('engine.archiver.common.dereference_symlinks', true);

		if ($dereferenceSymlinks)
		{
			return;
		}

		// We are told not to dereference symlinks. Are we on Windows?
		$isWindows = (DIRECTORY_SEPARATOR == '\\');

		if (function_exists('php_uname'))
		{
			$isWindows = stristr(php_uname(), 'windows');
		}

		// If we are not on Windows, enable symlink target storage
		$this->storeSymlinkTarget = !$isWindows;
	}

	/**
	 * Gets the file size and last modification time (also works on virtual files and symlinks)
	 *
	 * @param   string  $sourceNameOrData  File path to the source file or source data (if $isVirtual is true)
	 * @param   bool    $isVirtual         Is this a virtual file?
	 * @param   bool    $isSymlink         Is this a symlink?
	 * @param   bool    $isDir             Is this a directory?
	 *
	 * @return  array
	 */
	protected function getFileSizeAndModificationTime(&$sourceNameOrData, $isVirtual, $isSymlink, $isDir)
	{
		// Get real size before compression
		if ($isVirtual)
		{
			$fileSize    = akstrlen($sourceNameOrData);
			$fileModTime = time();

			return [$fileSize, $fileModTime];
		}


		if ($isSymlink)
		{
			$fileSize    = akstrlen(@readlink($sourceNameOrData));
			$fileModTime = 0;

			return [$fileSize, $fileModTime];
		}

		// Is the file readable?
		if (!is_readable($sourceNameOrData) && !$isDir)
		{
			// Really, REALLY check if it is readable (PHP sometimes lies, dammit!)
			$myFP = @$this->fopen($sourceNameOrData, 'r');

			if ($myFP === false)
			{
				// Unreadable file, skip it.
				throw new WarningException('Unreadable file ' . $sourceNameOrData . '. Check permissions');
			}

			@$this->fclose($myFP);
		}

		// Get the file size
		$fileSize    = $isDir ? 0 : @filesize($sourceNameOrData);
		$fileModTime = $isDir ? 0 : @filemtime($sourceNameOrData);

		return [$fileSize, $fileModTime];
	}

	/**
	 * Get the preferred compression method for a file
	 *
	 * @param   int   $fileSize   File size in bytes
	 * @param   int   $memLimit   Memory limit in bytes
	 * @param   bool  $isDir      Is it a directory?
	 * @param   bool  $isSymlink  Is it a symlink?
	 *
	 * @return  int  Compression method to use: 0 (uncompressed) or 1 (gzip deflate)
	 */
	protected function getCompressionMethod($fileSize, $memLimit, $isDir, $isSymlink)
	{
		// If we don't have gzip installed we can't compress anything
		if (!function_exists("gzcompress"))
		{
			return 0;
		}

		// Don't compress directories or symlinks
		if ($isDir || $isSymlink)
		{
			return 0;
		}

		// Do not compress files over the compression threshold
		if ($fileSize >= _AKEEBA_COMPRESSION_THRESHOLD)
		{
			return 0;
		}

		// No memory limit, file smaller than the compression threshold: always compress.
		if (is_numeric($memLimit) && ($memLimit == 0))
		{
			return 1;
		}

		// Non-zero memory limit, PHP can report memory usage, see if there's enough memory.
		if (is_numeric($memLimit) && function_exists("memory_get_usage"))
		{
			$availableRAM = $memLimit - memory_get_usage();
			// Conservative approach: if the file size is over 40% of the available memory we won't compress.
			$compressionMethod = (($availableRAM / 2.5) >= $fileSize) ? 1 : 0;

			return $compressionMethod;
		}

		// Non-zero memory limit, PHP can't report memory usage, compress only files up to 512Kb (very conservative)
		return ($fileSize <= 524288) ? 1 : 0;
	}

	/**
	 * Checks if the file exists and is readable
	 *
	 * @param   string  $sourceNameOrData  The path to the file being compressed, or the raw file data for virtual files
	 * @param   bool    $isVirtual         Is this a virtual file?
	 * @param   bool    $isSymlink         Is this a symlink?
	 * @param   bool    $isDir             Is this a directory?
	 *
	 * @return  void
	 *
	 * @throws  WarningException
	 */
	protected function testIfFileExists(&$sourceNameOrData, &$isVirtual, &$isDir, &$isSymlink)
	{
		if ($isVirtual || $isDir)
		{
			return;
		}

		if (!@file_exists($sourceNameOrData))
		{
			if ($isSymlink)
			{
				throw new WarningException('The symlink ' . $sourceNameOrData . ' points to a file or folder that no longer exists and will NOT be backed up.');
			}

			throw new WarningException('The file ' . $sourceNameOrData . ' no longer exists and will NOT be backed up. Are you backing up temporary or cache data?');
		}

		if (!@is_readable($sourceNameOrData))
		{
			throw new WarningException('Unreadable file ' . $sourceNameOrData . '. Check permissions.');
		}
	}

	/**
	 * Try to get the compressed data for a file
	 *
	 * @param   string  $sourceNameOrData
	 * @param   bool    $isVirtual
	 * @param   int     $compressionMethod
	 * @param   string  $zdata
	 * @param   int     $unc_len
	 * @param   int     $c_len
	 *
	 * @return  void
	 */
	protected function getZData(&$sourceNameOrData, &$isVirtual, &$compressionMethod, &$zdata, &$unc_len, &$c_len)
	{
		// Get uncompressed data
		$udata =& $sourceNameOrData;

		if (!$isVirtual)
		{
			$udata = @file_get_contents($sourceNameOrData);
		}

		// If the compression fails, we will let it behave like no compression was available
		$c_len             = $unc_len;
		$compressionMethod = 0;

		// Proceed with compression
		$zdata = @gzcompress($udata);

		if ($zdata !== false)
		{
			// The compression succeeded
			unset($udata);
			$compressionMethod = 1;
			$zdata             = aksubstr($zdata, 2, -4);
			$c_len             = akstrlen($zdata);
		}
	}

	/**
	 * Returns the bytes available for writing data to the current part file (i.e. part size minus current offset)
	 *
	 * @return  int
	 */
	protected function getPartFreeSize()
	{
		clearstatcache();
		$current_part_size = @filesize($this->_dataFileName);

		return (int) $this->partSize - ($current_part_size === false ? 0 : $current_part_size);
	}

	/**
	 * Enable split archive creation where possible
	 *
	 * @return  void
	 */
	protected function enableSplitArchives()
	{
		$configuration = Factory::getConfiguration();
		$partSize      = $configuration->get('engine.archiver.common.part_size', 0);

		// If the part size is less than 64Kb we won't enable split archives
		if ($partSize < 65536)
		{
			return;
		}

		$extension            = $this->getExtension();
		$altExtension         = substr($extension, 0, 2) . '01';
		$archiveTypeUppercase = strtoupper(substr($extension, 1));

		Factory::getLog()->info(__CLASS__ . " :: Split $archiveTypeUppercase creation enabled");

		$this->useSplitArchive              = true;
		$this->partSize                     = $partSize;
		$this->dataFileNameWithoutExtension =
			dirname($this->_dataFileName) . '/' . basename($this->_dataFileName, $extension);
		$this->_dataFileName                = $this->dataFileNameWithoutExtension . $altExtension;

		// Indicate that we have at least 1 part
		$statistics = Factory::getStatistics();
		$statistics->updateMultipart(1);
	}

	/**
	 * Write a file's GZip compressed data to the archive, taking into account archive splitting
	 *
	 * @param   string  $zdata  The compressed data to write to the archive
	 *
	 * @return  void
	 */
	protected function putRawDataIntoArchive(&$zdata)
	{
		// Single part archive. Just dump the compressed data.
		if (!$this->useSplitArchive)
		{
			$this->fwrite($this->fp, $zdata);

			return;
		}

		// Split JPA. Check if we need to split the part in the middle of the data.
		$freeSpaceInPart = $this->getPartFreeSize();

		// Nope. We have enough space to write all of the data in this part.
		if ($freeSpaceInPart >= akstrlen($zdata))
		{
			$this->fwrite($this->fp, $zdata);

			return;
		}

		$bytesLeftInData = akstrlen($zdata);

		while ($bytesLeftInData > 0)
		{
			// Try to write to the archive. We can only write as much bytes as the free space in the backup archive OR
			// the total data bytes left, whichever is lower.
			$bytesWritten = $this->fwrite($this->fp, $zdata, min($bytesLeftInData, $freeSpaceInPart));

			// Since we may have written fewer bytes than anticipated we use the real bytes written for calculations
			$freeSpaceInPart -= $bytesWritten;
			$bytesLeftInData -= $bytesWritten;

			// If we still have data to write, remove the part already written and keep the rest
			if ($bytesLeftInData > 0)
			{
				$zdata = aksubstr($zdata, -$bytesLeftInData);
			}

			// If the part file is full create a new one
			if ($freeSpaceInPart <= 0)
			{
				// Create new part
				$this->createAndOpenNewPart();

				// Get its free space
				$freeSpaceInPart = $this->getPartFreeSize();
			}
		}

		// Tell PHP to free up some memory
		$zdata = null;
	}

	/**
	 * Begin or resume adding an uncompressed file into the archive.
	 *
	 * IMPORTANT! Only this case can be spanned across steps: uncompressed, non-virtual data
	 *
	 * @param   string  $sourceNameOrData  The path to the file we are reading from.
	 * @param   int     $fileLength        The file size we are supposed to read, in bytes.
	 * @param   int     $resumeOffset      Offset in the file to resume reading from
	 *
	 * @return  bool  True to indicate more processing is required in the next step
	 */
	protected function putUncompressedFileIntoArchive(&$sourceNameOrData, $fileLength = 0, $resumeOffset = null)
	{
		// Copy the file contents, ignore directories
		$sourceFilePointer = @fopen($sourceNameOrData, "r");

		if ($sourceFilePointer === false)
		{
			// If we have already written the file header and can't read the data your archive is busted.
			throw new ErrorException('Unreadable file ' . $sourceNameOrData . '. Check permissions. Your archive is corrupt!');
		}

		// Seek to the resume point if required
		if (!is_null($resumeOffset))
		{
			// Seek to new offset
			$seek_result = @fseek($sourceFilePointer, $resumeOffset);

			if ($seek_result === -1)
			{
				// What?! We can't resume!
				$this->conditionalFileClose($sourceFilePointer);

				throw new ErrorException(sprintf('Could not resume packing of file %s. Your archive is damaged!', $sourceNameOrData));
			}

			// Change the uncompressed size to reflect the remaining data
			$fileLength -= $resumeOffset;
		}

		$mustBreak = $this->putDataFromFileIntoArchive($sourceFilePointer, $fileLength);

		$this->conditionalFileClose($sourceFilePointer);

		return $mustBreak;
	}

	/**
	 * Return the requested permissions for the backup archive file.
	 *
	 * @return  int
	 * @since   8.0.0
	 */
	protected function getPermissions(): int
	{
		if (!is_null($this->permissions))
		{
			return $this->permissions;
		}

		$configuration     = Factory::getConfiguration();
		$permissions       = $configuration->get('engine.archiver.common.permissions', '0666') ?: '0666';
		$this->permissions = octdec($permissions);

		return $this->permissions;
	}

	/**
	 * Put up to $fileLength bytes of the file pointer $sourceFilePointer into the backup archive. Returns true if we
	 * ran out of time and need to perform a step break. Returns false when the whole quantity of data has been copied.
	 * Throws an ErrorException if something terrible happens.
	 *
	 * @param   resource  $sourceFilePointer  The pointer to the input file
	 * @param   int       $fileLength         How many bytes to copy
	 *
	 * @return  bool  True to indicate we need to resume packing the file in the next step
	 */
	private function putDataFromFileIntoArchive(&$sourceFilePointer, &$fileLength)
	{
		// Get references to engine objects we're going to be using
		$configuration = Factory::getConfiguration();
		$timer         = Factory::getTimer();
		$isEOF         = false;

		// Quick copy data into the archive, AKEEBA_CHUNK bytes at a time
		while (!$isEOF && ($timer->getTimeLeft() > 0) && ($fileLength > 0))
		{
			// Normally I read up to AKEEBA_CHUNK bytes at a time, unless the remaining $fileLength is smaller.
			$chunkSize = min(AKEEBA_CHUNK, $fileLength);

			// Do I have a split ZIP?
			if ($this->useSplitArchive)
			{
				// I must only read up to the free space in the part file if it's less than AKEEBA_CHUNK.
				$free_space = $this->getPartFreeSize();
				$chunkSize  = min($free_space, AKEEBA_CHUNK);

				// If I ran out of free space I have to create a new part file.
				if ($free_space <= 0)
				{
					$this->createAndOpenNewPart();

					// We have created the part. If the user asked for immediate post-proc, break step now.
					if ($configuration->get('engine.postproc.common.after_part', 0))
					{
						$resumeOffset = @ftell($sourceFilePointer);
						$this->conditionalFileClose($sourceFilePointer);

						$configuration->set('volatile.engine.archiver.resume', $resumeOffset);
						$configuration->set('volatile.engine.archiver.processingfile', true);
						$configuration->set('volatile.breakflag', true);

						// Always close the open part when immediate post-processing is requested
						@$this->fclose($this->fp);
						$this->fp = null;

						return true;
					}

					// No immediate post-proc. Recalculate the optimal chunk size.
					$free_space = $this->getPartFreeSize();
					$chunkSize  = min($free_space, AKEEBA_CHUNK);
				}
			}

			// Read some data and write it to the backup archive part file
			$data         = fread($sourceFilePointer, $chunkSize);
			$bytesWritten = $this->fwrite($this->fp, $data, akstrlen($data));

			// Subtract the written bytes from the bytes left to write
			$fileLength -= $bytesWritten;

			/**
			 * Have we reached the End of File?
			 *
			 * When we have read _exactly_ as many bytes as the size of the file we have not, in fact, reached EOF. We
			 * reach the EOF if we try to read _beyond_ the actual end of file.
			 *
			 * So, if we have read exactly as many bytes as the file claimed to be at the start of backup (i.e. the
			 * $fileLength is now 0) we try to read one more byte. If this returns no data (or false, e.g. the file went
			 * away in the meantime) OR PHP reports we reached EOF then we consider we've reached EOF.
			 *
			 * If the file grew in size in the meantime this condition will fail and $isEOF will be false. We will still
			 * exit the while loop because $fileLength === 0 but the next if-block after the while-block will catch this
			 * discrepancy and issue a warning that the file grew in size.
			 */
			$isEOF = feof($sourceFilePointer);

			if (!$isEOF && $fileLength === 0)
			{
				$junk = fread($sourceFilePointer, 1);
				$isEOF = (($junk === false) || (is_string($junk) && strlen($junk) === 0)) || feof($sourceFilePointer);
				fseek($sourceFilePointer, -1, SEEK_CUR);
			}
		}

		/**
		 * We have finished reading the entire file as per its size before we started backing it up. However, we still
		 * have not reached EOF (there's more to the file). This means that the file grew in size in the meantime. Warn
		 * the user.
		 */
		if (!$isEOF && ($timer->getTimeLeft() > 0) && ($fileLength === 0))
		{
			Factory::getLog()->warning(
				'The file grew in size while putting it in the backup archive. If this is a temporary or cache file we advise you to exclude it, or exclude the contents of the temporary / cache folder it is contained in.'
			);
		}

		/**
		 * According to the file size we read when we were writing the file header we have more data to write. However,
		 * we reached the end of the file. This means the file went away or shrunk. We can't reliably go back and
		 * change the file header since it may be in a previous part file that's already been post-processed. All we can
		 * do is try to warn the user.
		 */
		if ($isEOF && ($timer->getTimeLeft() > 0) && ($fileLength > 0))
		{
			throw new ErrorException(
				'The file shrunk or went away while putting it in the backup archive. Your archive is damaged! If this is a temporary or cache file we advise you to exclude it, or exclude the contents of the temporary / cache folder it is contained in.'
			);
		}

		// WARNING!!! The extra $unc_len != 0 check is necessary as PHP won't reach EOF for 0-byte files.
		if (!feof($sourceFilePointer) && ($fileLength != 0))
		{
			// We have to break, or we'll time out!
			$resumeOffset = @ftell($sourceFilePointer);
			$this->conditionalFileClose($sourceFilePointer);

			$configuration->set('volatile.engine.archiver.resume', $resumeOffset);
			$configuration->set('volatile.engine.archiver.processingfile', true);

			return true;
		}

		return false;
	}
}
components/com_akeeba/BackupEngine/Archiver/jpa.json000060400000004120152453623440016543 0ustar00{
    "_information": {
        "title": "COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_JPA_TITLE",
        "description": "COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_JPA_DESCRIPTION"
    },
    "engine.archiver.common.dereference_symlinks": {
        "default": "0",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_DEREFERENCESYMLINKS_TITLE",
        "description": "COM_AKEEBA_CONFIG_DEREFERENCESYMLINKS_DESCRIPTION"
    },
    "engine.archiver.common.part_size": {
        "default": "0",
        "type": "integer",
        "min": "0",
        "max": "2147483648",
        "shortcuts": "0|131072|262144|524288|1048576|2097152|5242880|10485760|20971520|52428800|104857600|268435456|536870912|1073741824|1610612736|2097152000",
        "scale": "1048576",
        "uom": "MB",
        "title": "COM_AKEEBA_CONFIG_PARTSIZE_TITLE",
        "description": "COM_AKEEBA_CONFIG_PARTSIZE_DESCRIPTION"
    },
    "engine.archiver.common.permissions": {
        "default": "0666",
        "type": "enum",
        "enumkeys": "COM_AKEEBA_CONFIG_PERMISSIONS_0600|COM_AKEEBA_CONFIG_PERMISSIONS_0644|COM_AKEEBA_CONFIG_PERMISSIONS_0666",
        "enumvalues": "0600|0644|0666",
        "title": "COM_AKEEBA_CONFIG_PERMISSIONS_TITLE",
        "description": "COM_AKEEBA_CONFIG_PERMISSIONS_DESCRIPTION"
    },
    "engine.archiver.common.chunk_size": {
        "default": "1048576",
        "type": "integer",
        "min": "65536",
        "max": "10485760",
        "shortcuts": "65536|131072|262144|524288|1048576|2097152|5242880|10485760",
        "scale": "1048576",
        "uom": "MB",
        "title": "COM_AKEEBA_CONFIG_CHUNKSIZE_TITLE",
        "description": "COM_AKEEBA_CONFIG_CHUNKSIZE_DESCRIPTION"
    },
    "engine.archiver.common.big_file_threshold": {
        "default": "1048576",
        "type": "integer",
        "min": "65536",
        "max": "10485760",
        "shortcuts": "65536|131072|262144|524288|1048576|2097152|5242880|10485760",
        "scale": "1048576",
        "uom": "MB",
        "title": "COM_AKEEBA_CONFIG_BIGFILETHRESHOLD_TITLE",
        "description": "COM_AKEEBA_CONFIG_BIGFILETHRESHOLD_DESCRIPTION"
    }
}components/com_akeeba/BackupEngine/Archiver/Base.php000060400000055415152453623440016476 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Archiver;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Base\Exceptions\ErrorException;
use Akeeba\Engine\Base\Exceptions\WarningException;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use Akeeba\Engine\Util\FileCloseAware;
use Akeeba\Engine\Util\FileSystem;
use Exception;
use RuntimeException;

/**
 * Abstract parent class of all archiver engines
 */
abstract class Base
{
	use FileCloseAware;

	/** @var   string  The archive's comment. It's currently used ONLY in the ZIP file format */
	protected $_comment;

	/** @var Filesystem Filesystem utilities object */
	protected $fsUtils = null;

	/** @var   resource  JPA transformation source handle */
	private $_xform_fp;

	/** @var   int  The total size of the source JPA file */
	private $totalSourceJPASize = 0;

	/**
	 * Public constructor
	 *
	 * @codeCoverageIgnore
	 *
	 * @return  void
	 */
	public function __construct()
	{
		$this->__bootstrap_code();
	}

	/**
	 * Wakeup (unserialization) function
	 *
	 * @codeCoverageIgnore
	 *
	 * @return  void
	 */
	public function __wakeup()
	{
		$this->__bootstrap_code();
	}

	/**
	 * Adds a single file in the archive
	 *
	 * @param   string  $file        The absolute path to the file to add
	 * @param   string  $removePath  Path to remove from $file
	 * @param   string  $addPath     Path to prepend to $file
	 *
	 * @return  void
	 *
	 * @throws  Exception
	 */
	public final function addFile($file, $removePath = '', $addPath = '')
	{
		$storedName = $this->addRemovePaths($file, $removePath, $addPath);

		$this->addFileRenamed($file, $storedName);
	}

	/**
	 * Adds a list of files into the archive, removing $removePath from the
	 * file names and adding $addPath to them.
	 *
	 * @param   array   $fileList    A simple string array of filepaths to include
	 * @param   string  $removePath  Paths to remove from the filepaths
	 * @param   string  $addPath     Paths to add in front of the filepaths
	 *
	 * @return  void
	 *
	 * @throws Exception
	 */
	public final function addFileList(&$fileList, $removePath = '', $addPath = '')
	{
		if (!is_array($fileList))
		{
			Factory::getLog()->warning('addFileList called without a file list array');

			return;
		}

		foreach ($fileList as $file)
		{
			$this->addFile($file, $removePath, $addPath);
		}
	}

	/**
	 * Adds a file to the archive, with a name that's different from the source
	 * filename
	 *
	 * @param   string  $sourceFile  Absolute path to the source file
	 * @param   string  $targetFile  Relative filename to store in archive
	 *
	 * @return  void
	 *
	 * @throws  Exception
	 */
	public function addFileRenamed($sourceFile, $targetFile)
	{
		$mb_encoding = '8bit';

		if (function_exists('mb_internal_encoding'))
		{
			$mb_encoding = mb_internal_encoding();
			mb_internal_encoding('ISO-8859-1');
		}

		try
		{
			$this->_addFile(false, $sourceFile, $targetFile);
		}
		catch (WarningException $e)
		{
			Factory::getLog()->warning($e->getMessage());
		}
		finally
		{
			if (function_exists('mb_internal_encoding'))
			{
				mb_internal_encoding($mb_encoding);
			}
		}
	}

	/**
	 * Adds a file to the archive, given the stored name and its contents
	 *
	 * @param   string  $fileName        The base file name
	 * @param   string  $addPath         The relative path to prepend to file name
	 * @param   string  $virtualContent  The contents of the file to be archived
	 *
	 * @return  void
	 */
	public final function addFileVirtual($fileName, $addPath, &$virtualContent)
	{
		$storedName  = $this->addRemovePaths($fileName, '', $addPath);
		$mb_encoding = '8bit';

		if (function_exists('mb_internal_encoding'))
		{
			$mb_encoding = mb_internal_encoding();
			mb_internal_encoding('ISO-8859-1');
		}

		try
		{
			$this->_addFile(true, $virtualContent, $storedName);
		}
		catch (WarningException $e)
		{
			Factory::getLog()->warning($e->getMessage());
		}
		finally
		{
			if (function_exists('mb_internal_encoding'))
			{
				mb_internal_encoding($mb_encoding);
			}
		}
	}

	/**
	 * Adds a file to the archive, given the stored name and its contents
	 *
	 * @param   string  $fileName        The base file name
	 * @param   string  $addPath         The relative path to prepend to file name
	 * @param   string  $virtualContent  The contents of the file to be archived
	 *
	 * @return  void
	 *
	 * @deprecated 7.0.0
	 */
	public final function addVirtualFile($fileName, $addPath, &$virtualContent)
	{
		Factory::getLog()->debug('DEPRECATED: addVirtualFile() has been renamed to addFileVirtual().');

		$this->addFileVirtual($fileName, $addPath, $virtualContent);
	}

	/**
	 * Makes whatever finalization is needed for the archive to be considered
	 * complete and useful (or, generally, clean up)
	 *
	 * @return  void
	 */
	abstract public function finalize();

	/**
	 * Returns a string with the extension (including the dot) of the files produced
	 * by this class.
	 *
	 * @return  string
	 */
	abstract public function getExtension();

	/**
	 * Initialises the archiver class, creating the archive from an existent
	 * installer's JPA archive. MUST BE OVERRIDEN BY CHILDREN CLASSES.
	 *
	 * @param   string  $targetArchivePath  Absolute path to the generated archive
	 * @param   array   $options            A named key array of options (optional)
	 *
	 * @return  void
	 */
	abstract public function initialize($targetArchivePath, $options = []);

	/**
	 * Notifies the engine on the backup comment and converts it to plain text for
	 * inclusion in the archive file, if applicable.
	 *
	 * @param   string  $comment  The archive's comment
	 *
	 * @return  void
	 */
	public function setComment($comment)
	{
		// First, sanitize the comment in a text-only format
		$comment        = str_replace("\n", " ", $comment); // Replace newlines with spaces
		$comment        = str_replace("<br>", "\n", $comment); // Replace HTML4 <br> with single newlines
		$comment        = str_replace("<br/>", "\n", $comment); // Replace HTML4 <br> with single newlines
		$comment        = str_replace("<br />", "\n", $comment); // Replace HTML <br /> with single newlines
		$comment        = str_replace("</p>", "\n\n", $comment); // Replace paragraph endings with double newlines
		$comment        = str_replace("<b>", "*", $comment); // Replace bold with star notation
		$comment        = str_replace("</b>", "*", $comment); // Replace bold with star notation
		$comment        = str_replace("<i>", "_", $comment); // Replace italics with underline notation
		$comment        = str_replace("</i>", "_", $comment); // Replace italics with underline notation
		$this->_comment = strip_tags($comment, '');
	}

	/**
	 * Transforms a JPA archive (containing an installer) to the native archive format
	 * of the class. It actually extracts the source JPA in memory and instructs the
	 * class to include each extracted file.
	 *
	 * @codeCoverageIgnore
	 *
	 * @param   integer  $index   The index in the source JPA archive's list currently in use
	 * @param   integer  $offset  The source JPA archive's offset to use
	 *
	 * @return  array|bool  False if an error occurred, return array otherwise
	 */
	public function transformJPA($index, $offset)
	{
		$xform_source = null;

		// Do we have to open the file?
		if (!$this->_xform_fp)
		{
			// Get the source path
			$registry           = Factory::getConfiguration();
			$embedded_installer = $registry->get('akeeba.advanced.embedded_installer');

			// Fetch the name of the installer image
			$installerDescriptors = Factory::getEngineParamsProvider()->getInstallerList();
			$xform_source         = Platform::getInstance()->get_installer_images_path() .
				'/foobar.jpa'; // We need this as a "safe fallback"

			// Try to find a sane default if we are not given a valid embedded installer
			if (!array_key_exists($embedded_installer, $installerDescriptors))
			{
				$embedded_installer = 'angie';

				if (!array_key_exists($embedded_installer, $installerDescriptors))
				{
					$allInstallers = array_keys($installerDescriptors);

					foreach ($allInstallers as $anInstaller)
					{
						if ($anInstaller == 'none')
						{
							continue;
						}

						$embedded_installer = $anInstaller;
						break;
					}
				}
			}

			if (array_key_exists($embedded_installer, $installerDescriptors))
			{
				$packages  = $installerDescriptors[$embedded_installer]['package'] ?? '';
				$langPacks = $installerDescriptors[$embedded_installer]['language'] ?? '';

				if (empty($packages))
				{
					// No installer package specified. Pretend we are done!
					$retArray = [
						"filename" => '', // File name extracted
						"data"     => '', // File data
						"index"    => 0, // How many source JPA files I have
						"offset"   => 0, // Offset in JPA file
						"skip"     => false, // Skip this?
						"done"     => true, // Are we done yet?
						"filesize" => 0,
					];

					return $retArray;
				}

				$packages                 = explode(',', $packages);
				$langPacks                = explode(',', $langPacks);
				$this->totalSourceJPASize = 0;
				$pathPrefix               = Platform::getInstance()->get_installer_images_path() . '/';

				foreach ($packages as $package)
				{
					$filePath                 = $pathPrefix . $package;
					$this->totalSourceJPASize += (int) @filesize($filePath);
				}

				foreach ($langPacks as $langPack)
				{
					$filePath = $pathPrefix . $langPack;

					if (!is_file($filePath))
					{
						continue;
					}

					$packages[]               = $langPack;
					$this->totalSourceJPASize += (int) @filesize($filePath);
				}

				if (count($packages) < $index)
				{
					throw new RuntimeException(__CLASS__ . ":: Installer package index $index not found for embedded installer $embedded_installer");
				}

				$package = $packages[$index];

				// A package is specified, use it!
				$xform_source = $pathPrefix . $package;
			}

			// 2.3: Try to use sane default if the indicated installer doesn't exist
			if (!is_null($xform_source) && !file_exists($xform_source) && (basename($xform_source) != 'angie.jpa'))
			{
				throw new RuntimeException(__CLASS__ . ":: Installer package $xform_source of embedded installer $embedded_installer not found. Please go to the configuration page, select an Embedded Installer, save the configuration and try backing up again.");
			}

			// Try opening the file
			if (!is_null($xform_source) && file_exists($xform_source))
			{
				$this->_xform_fp = @fopen($xform_source, 'r');

				if ($this->_xform_fp === false)
				{
					throw new RuntimeException(__CLASS__ . ":: Can't seed archive with installer package " . $xform_source);
				}
			}
			else
			{
				throw new RuntimeException(__CLASS__ . ":: Installer package " . $xform_source . " does not exist!");
			}
		}

		$headerDataLength = 0;

		if (!$offset)
		{
			// First run detected!
			Factory::getLog()->debug('Initializing with JPA package ' . $xform_source);

			// Skip over the header and check no problem exists
			$offset = $this->_xformReadHeader();

			if ($offset === false)
			{
				throw new RuntimeException('JPA package file was not read');
			}

			$headerDataLength = $offset;
		}

		$ret = $this->_xformExtract($offset);

		$ret['index'] = $index;

		if (is_array($ret))
		{
			$ret['chunkProcessed'] = $headerDataLength + $ret['offset'] - $offset;
			$offset                = $ret['offset'];

			if (!$ret['skip'] && !$ret['done'])
			{
				Factory::getLog()->debug('  Adding ' . $ret['filename'] . '; Next offset:' . $offset);

				$this->addFileVirtual($ret['filename'], '', $ret['data']);
			}
			elseif ($ret['done'])
			{
				$registry             = Factory::getConfiguration();
				$embedded_installer   = $registry->get('akeeba.advanced.embedded_installer');
				$installerDescriptors = Factory::getEngineParamsProvider()->getInstallerList();
				$packages             = $installerDescriptors[$embedded_installer]['package'];
				$packages             = explode(',', $packages);
				$pathPrefix           = Platform::getInstance()->get_installer_images_path() . '/';
				$langPacks            = $installerDescriptors[$embedded_installer]['language'];
				$langPacks            = explode(',', $langPacks);

				foreach ($langPacks as $langPack)
				{
					$filePath = $pathPrefix . $langPack;

					if (!is_file($filePath))
					{
						continue;
					}

					$packages[] = $langPack;
				}

				Factory::getLog()->debug('  Done with package ' . $packages[$index]);

				if (count($packages) > ($index + 1))
				{
					$ret['done']     = false;
					$ret['index']    = $index + 1;
					$ret['offset']   = 0;
					$this->_xform_fp = null;
				}
				else
				{
					Factory::getLog()->debug('  Done with installer seeding.');
				}
			}
			else
			{
				$reason = '  Skipping ' . $ret['filename'];
				Factory::getLog()->debug($reason);
			}
		}
		else
		{
			throw new RuntimeException('JPA extraction returned FALSE. The installer image is corrupt.');
		}

		if ($ret['done'])
		{
			// We are finished! Close the file
			$this->conditionalFileClose($this->_xform_fp);
			Factory::getLog()->debug('Initializing with JPA package has finished');
		}

		$ret['filesize'] = $this->totalSourceJPASize;

		return $ret;
	}

	/**
	 * Common code which gets called on instance creation or wake-up (unserialization)
	 *
	 * @codeCoverageIgnore
	 *
	 * @return  void
	 */
	protected function __bootstrap_code()
	{
		$this->fsUtils = Factory::getFilesystemTools();
	}

	/**
	 * The most basic file transaction: add a single entry (file or directory) to
	 * the archive.
	 *
	 * @param   boolean  $isVirtual         If true, the next parameter contains file data instead of a file name
	 * @param   string   $sourceNameOrData  Absolute file name to read data from or the file data itself is $isVirtual
	 *                                      is true
	 * @param   string   $targetName        The (relative) file name under which to store the file in the archive
	 *
	 * @return  boolean  True on success, false otherwise. DEPRECATED: Use exceptions instead.
	 *
	 * @throws  WarningException  When there's a warning (the backup integrity is NOT compromised)
	 * @throws  ErrorException    When there's an error (the backup integrity is compromised – backup dead)
	 */
	abstract protected function _addFile($isVirtual, &$sourceNameOrData, $targetName);

	/**
	 * This function indicates if the path $p_path is under the $p_dir tree. Or,
	 * said in an other way, if the file or sub-dir $p_path is inside the dir
	 * $p_dir.
	 * The function indicates also if the path is exactly the same as the dir.
	 * This function supports path with duplicated '/' like '//', but does not
	 * support '.' or '..' statements.
	 *
	 * Copied verbatim from pclZip library
	 *
	 * @codeCoverageIgnore
	 *
	 * @param   string  $p_dir   Source tree
	 * @param   string  $p_path  Check if this is part of $p_dir
	 *
	 * @return  integer   0 if $p_path is not inside directory $p_dir,
	 *                    1 if $p_path is inside directory $p_dir
	 *                    2 if $p_path is exactly the same as $p_dir
	 */
	private function _PathInclusion($p_dir, $p_path)
	{
		$v_result = 1;

		// ----- Explode dir and path by directory separator
		$v_list_dir       = explode("/", $p_dir);
		$v_list_dir_size  = count($v_list_dir);
		$v_list_path      = explode("/", $p_path);
		$v_list_path_size = count($v_list_path);

		// ----- Study directories paths
		$i = 0;
		$j = 0;

		while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result))
		{
			// ----- Look for empty dir (path reduction)
			if ($v_list_dir[$i] == '')
			{
				$i++;

				continue;
			}

			if ($v_list_path[$j] == '')
			{
				$j++;

				continue;
			}

			// ----- Compare the items
			if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ($v_list_path[$j] != ''))
			{
				$v_result = 0;
			}

			// ----- Next items
			$i++;
			$j++;
		}

		// ----- Look if everything seems to be the same
		if ($v_result)
		{
			// ----- Skip all the empty items
			while (($j < $v_list_path_size) && ($v_list_path[$j] == ''))
			{
				$j++;
			}

			while (($i < $v_list_dir_size) && ($v_list_dir[$i] == ''))
			{
				$i++;
			}

			if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size))
			{
				// ----- There are exactly the same
				$v_result = 2;
			}
			else if ($i < $v_list_dir_size)
			{
				// ----- The path is shorter than the dir
				$v_result = 0;
			}
		}

		// ----- Return
		return $v_result;
	}

	/**
	 * Extracts a file from the JPA archive and returns an in-memory array containing it
	 * and its file data. The data returned is an array, consisting of the following keys:
	 * "filename" => relative file path stored in the archive
	 * "data"     => file data
	 * "offset"   => next offset to use
	 * "skip"     => if this is not a file, just skip it...
	 * "done"     => No more files left in archive
	 *
	 * @codeCoverageIgnore
	 *
	 * @param   integer  $offset  The absolute data offset from archive's header
	 *
	 * @return  array|bool  See description for more information
	 */
	private function &_xformExtract($offset)
	{
		$false = false; // Used to return false values in case an error occurs

		// Generate a return array
		$retArray = [
			"filename" => '', // File name extracted
			"data"     => '', // File data
			"offset"   => 0, // Offset in ZIP file
			"skip"     => false, // Skip this?
			"done"     => false // Are we done yet?
		];

		// If we can't open the file, return an error condition
		if ($this->_xform_fp === false)
		{
			return $false;
		}

		// Go to the offset specified
		if (!fseek($this->_xform_fp, $offset) == 0)
		{
			return $false;
		}

		// Get and decode Entity Description Block
		$signature = fread($this->_xform_fp, 3);

		// Check signature
		if ($signature == 'JPF')
		{
			// This a JPA Entity Block. Process the header.

			// Read length of EDB and of the Entity Path Data
			$length_array = unpack('vblocksize/vpathsize', fread($this->_xform_fp, 4));
			// Read the path data
			$file = fread($this->_xform_fp, $length_array['pathsize']);
			// Read and parse the known data portion
			$bin_data    = fread($this->_xform_fp, 14);
			$header_data = unpack('Ctype/Ccompression/Vcompsize/Vuncompsize/Vperms', $bin_data);
			// Read any unknwon data
			$restBytes = $length_array['blocksize'] - (21 + $length_array['pathsize']);

			if ($restBytes > 0)
			{
				$junk = fread($this->_xform_fp, $restBytes);
			}

			$compressionType = $header_data['compression'];

			// Populate the return array
			$retArray['filename'] = $file;
			$retArray['skip']     = ($header_data['compsize'] == 0); // Skip over directories

			switch ($header_data['type'])
			{
				case 0:
					// directory
					break;

				case 1:
					// file
					switch ($compressionType)
					{
						case 0: // No compression
							if ($header_data['compsize'] > 0) // 0 byte files do not have data to be read
							{
								$retArray['data'] = fread($this->_xform_fp, $header_data['compsize']);
							}
							break;

						case 1: // GZip compression
							$zipData          = fread($this->_xform_fp, $header_data['compsize']);
							$retArray['data'] = gzinflate($zipData);
							break;

						case 2: // BZip2 compression
							$zipData          = fread($this->_xform_fp, $header_data['compsize']);
							$retArray['data'] = bzdecompress($zipData);
							break;
					}
					break;
			}
		}
		else
		{
			// This is not a file header. This means we are done.
			$retArray['done'] = true;
		}

		$retArray['offset'] = ftell($this->_xform_fp);

		return $retArray;
	}

	/**
	 * Skips over the JPA header entry and returns the offset file data starts from
	 *
	 * @codeCoverageIgnore
	 *
	 * @return  boolean|integer  False on failure, offset otherwise
	 */
	private function _xformReadHeader()
	{
		// Fail for unreadable files
		if ($this->_xform_fp === false)
		{
			return false;
		}

		// Go to the beggining of the file
		rewind($this->_xform_fp);

		// Read the signature
		$sig = fread($this->_xform_fp, 3);

		// Not a JPA Archive?
		if ($sig != 'JPA')
		{
			return false;
		}

		// Read and parse header length
		$header_length_array = unpack('v', fread($this->_xform_fp, 2));
		$header_length       = $header_length_array[1];

		// Read and parse the known portion of header data (14 bytes)
		$bin_data    = fread($this->_xform_fp, 14);
		$header_data = unpack('Cmajor/Cminor/Vcount/Vuncsize/Vcsize', $bin_data);

		// Load any remaining header data (forward compatibility)
		$rest_length = $header_length - 19;

		if ($rest_length > 0)
		{
			$junk = fread($this->_xform_fp, $rest_length);
		}

		return ftell($this->_xform_fp);
	}

	/**
	 * Removes the $p_remove_dir from $p_filename, while prepending it with $p_add_dir.
	 * Largely based on code from the pclZip library.
	 *
	 * @param   string  $p_filename    The absolute file name to treat
	 * @param   string  $p_remove_dir  The path to remove
	 * @param   string  $p_add_dir     The path to prefix the treated file name with
	 *
	 * @return  string  The treated file name
	 */
	private function addRemovePaths($p_filename, $p_remove_dir, $p_add_dir)
	{
		$p_filename   = $this->fsUtils->TranslateWinPath($p_filename);
		$p_remove_dir = ($p_remove_dir == '') ? '' :
			$this->fsUtils->TranslateWinPath($p_remove_dir); //should fix corrupt backups, fix by nicholas

		$v_stored_filename = $p_filename;

		if (!($p_remove_dir == ""))
		{
			if (substr($p_remove_dir, -1) != '/')
			{
				$p_remove_dir .= "/";
			}

			if ((substr($p_filename, 0, 2) == "./") || (substr($p_remove_dir, 0, 2) == "./"))
			{
				if ((substr($p_filename, 0, 2) == "./") && (substr($p_remove_dir, 0, 2) != "./"))
				{
					$p_remove_dir = "./" . $p_remove_dir;
				}

				if ((substr($p_filename, 0, 2) != "./") && (substr($p_remove_dir, 0, 2) == "./"))
				{
					$p_remove_dir = substr($p_remove_dir, 2);
				}
			}

			$v_compare = $this->_PathInclusion($p_remove_dir, $p_filename);

			if ($v_compare > 0)
			{
				if ($v_compare == 2)
				{
					$v_stored_filename = "";
				}
				else
				{
					$v_stored_filename =
						substr($p_filename, (function_exists('mb_strlen') ? mb_strlen($p_remove_dir, '8bit') :
							strlen($p_remove_dir)));
				}
			}
		}
		else
		{
			$v_stored_filename = $p_filename;
		}

		if (!($p_add_dir == ""))
		{
			if (substr($p_add_dir, -1) == "/")
			{
				$v_stored_filename = $p_add_dir . $v_stored_filename;
			}
			else
			{
				$v_stored_filename = $p_add_dir . "/" . $v_stored_filename;
			}
		}

		return $v_stored_filename;
	}
}
components/com_akeeba/BackupEngine/Archiver/zip.json000060400000005001152453623440016572 0ustar00{
    "_information": {
        "title": "COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_ZIP_TITLE",
        "description": "COM_AKEEBA_CONFIG_ENGINE_ARCHIVER_ZIP_DESCRIPTION"
    },
    "engine.archiver.common.dereference_symlinks": {
        "default": "0",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_DEREFERENCESYMLINKS_TITLE",
        "description": "COM_AKEEBA_CONFIG_DEREFERENCESYMLINKS_DESCRIPTION"
    },
    "engine.archiver.common.part_size": {
        "default": "0",
        "type": "integer",
        "min": "0",
        "max": "2147483648",
        "shortcuts": "0|131072|262144|524288|1048576|2097152|5242880|10485760|20971520|52428800|104857600|268435456|536870912|1073741824|1610612736|2097152000",
        "scale": "1048576",
        "uom": "MB",
        "title": "COM_AKEEBA_CONFIG_PARTSIZE_TITLE",
        "description": "COM_AKEEBA_CONFIG_PARTSIZE_DESCRIPTION"
    },
    "engine.archiver.common.chunk_size": {
        "default": "1048576",
        "type": "integer",
        "min": "65536",
        "max": "10485760",
        "shortcuts": "65536|131072|262144|524288|1048576|2097152|5242880|10485760",
        "scale": "1048576",
        "uom": "MB",
        "title": "COM_AKEEBA_CONFIG_CHUNKSIZE_TITLE",
        "description": "COM_AKEEBA_CONFIG_CHUNKSIZE_DESCRIPTION"
    },
    "engine.archiver.common.permissions": {
        "default": "0666",
        "type": "enum",
        "enumkeys": "COM_AKEEBA_CONFIG_PERMISSIONS_0600|COM_AKEEBA_CONFIG_PERMISSIONS_0644|COM_AKEEBA_CONFIG_PERMISSIONS_0666",
        "enumvalues": "0600|0644|0666",
        "title": "COM_AKEEBA_CONFIG_PERMISSIONS_TITLE",
        "description": "COM_AKEEBA_CONFIG_PERMISSIONS_DESCRIPTION"
    },
    "engine.archiver.common.big_file_threshold": {
        "default": "1048576",
        "type": "integer",
        "min": "65536",
        "max": "10485760",
        "shortcuts": "65536|131072|262144|524288|1048576|2097152|5242880|10485760",
        "scale": "1048576",
        "uom": "MB",
        "title": "COM_AKEEBA_CONFIG_BIGFILETHRESHOLD_TITLE",
        "description": "COM_AKEEBA_CONFIG_BIGFILETHRESHOLD_DESCRIPTION"
    },
    "engine.archiver.zip.cd_glue_chunk_size": {
        "default": "1048576",
        "type": "integer",
        "min": "65536",
        "max": "10485760",
        "shortcuts": "65536|131072|262144|524288|1048576|2097152|5242880|10485760",
        "scale": "1048576",
        "uom": "MB",
        "title": "COM_AKEEBA_CONFIG_ZIPCDGLUECHUNKSIZE_TITLE",
        "description": "COM_AKEEBA_CONFIG_ZIPCDGLUECHUNKSIZE_DESCRIPTION"
    }
}components/com_akeeba/BackupEngine/Archiver/BaseFileManagement.php000060400000014613152453623440021266 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Archiver;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Base\Exceptions\ErrorException;
use Akeeba\Engine\Factory;

if (!function_exists('akstrlen'))
{
	/**
	 * Attempt to use mbstring for calculating the binary string length.
	 *
	 * @param $string
	 *
	 * @return int
	 */
	function akstrlen($string)
	{
		return function_exists('mb_strlen') ? mb_strlen($string, '8bit') : strlen($string);
	}
}

/**
 * Abstract class for an archiver using managed file pointers
 */
abstract class BaseFileManagement extends Base
{
	/** @var resource File pointer to the archive's central directory file (for ZIP) */
	protected $cdfp = null;

	/** @var resource File pointer to the archive being currently written to */
	protected $fp = null;

	/** @var   array  An array of the last open files for writing and their last written to offsets */
	private $fileOffsets = [];

	/** @var   array  An array of open file pointers */
	private $filePointers = [];

	/** @var   null|string  The last filename fwrite() wrote to */
	private $lastFileName = null;

	/** @var   null|resource  The last file pointer fwrite() wrote to */
	private $lastFilePointer = null;

	/**
	 * Release file pointers when the object is being destroyed
	 *
	 * @codeCoverageIgnore
	 *
	 * @return  void
	 */
	public function __destruct()
	{
		$this->_closeAllFiles();

		$this->fp   = null;
		$this->cdfp = null;
	}

	/**
	 * Release file pointers when the object is being serialized
	 *
	 * @codeCoverageIgnore
	 *
	 * @return  void
	 */
	public function _onSerialize()
	{
		$this->_closeAllFiles();

		$this->fp   = null;
		$this->cdfp = null;
	}

	/**
	 * Closes all open files known to this archiver object
	 *
	 * @return  void
	 */
	protected function _closeAllFiles()
	{
		if (!empty($this->filePointers))
		{
			foreach ($this->filePointers as $file => $fp)
			{
				$this->conditionalFileClose($fp);

				unset($this->filePointers[$file]);
			}
		}
	}

	/**
	 * Closes an already open file
	 *
	 * @param   resource  $fp  The file pointer to close
	 *
	 * @return  boolean
	 */
	protected function fclose(&$fp)
	{
		$result = true;

		$offset = array_search($fp, $this->filePointers, true);

		if (!is_null($fp) && is_resource($fp))
		{
			$result = $this->conditionalFileClose($fp);
		}

		if ($offset !== false)
		{
			unset($this->filePointers[$offset]);
		}

		$fp = null;

		return $result;
	}

	protected function fcloseByName($file)
	{
		if (!array_key_exists($file, $this->filePointers))
		{
			return true;
		}

		$ret = $this->fclose($this->filePointers[$file]);

		if (array_key_exists($file, $this->filePointers))
		{
			unset($this->filePointers[$file]);
		}

		return $ret;
	}

	/**
	 * Opens a file, if it's not already open, or returns its cached file pointer if it's already open
	 *
	 * @param   string  $file  The filename to open
	 * @param   string  $mode  File open mode, defaults to binary write
	 *
	 * @return  resource
	 */
	protected function fopen($file, $mode = 'w')
	{
		if (!array_key_exists($file, $this->filePointers))
		{
			//Factory::getLog()->debug("Opening backup archive $file with mode $mode");
			$this->filePointers[$file] = @fopen($file, $mode);

			// If we open a file for append we have to seek to the correct offset
			if (substr($mode, 0, 1) == 'a')
			{
				if (isset($this->fileOffsets[$file]))
				{
					Factory::getLog()->debug("Truncating backup archive file $file to " . $this->fileOffsets[$file] . " bytes");
					@ftruncate($this->filePointers[$file], $this->fileOffsets[$file]);
				}

				fseek($this->filePointers[$file], 0, SEEK_END);
			}
		}

		return $this->filePointers[$file];
	}

	/**
	 * Write to file, defeating magic_quotes_runtime settings (pure binary write)
	 *
	 * @param   resource  $fp     Handle to a file
	 * @param   string    $data   The data to write to the file
	 * @param   integer   $p_len  Maximum length of data to write
	 *
	 * @return  int  The number of bytes written
	 *
	 * @throws  ErrorException  When writing to the file is not possible
	 */
	protected function fwrite($fp, $data, $p_len = null)
	{
		if ($fp !== $this->lastFilePointer)
		{
			$this->lastFilePointer = $fp;
			$this->lastFileName    = array_search($fp, $this->filePointers, true);
		}

		$len = is_null($p_len) ? (akstrlen($data)) : $p_len;
		$ret = fwrite($fp, $data, $len);

		if (($ret === false) || (abs(($ret - $len)) >= 1))
		{
			// Log debug information about the archive file's existence and current size. This helps us figure out if
			// there is a server-imposed maximum file size limit.
			clearstatcache();
			$fileExists  = @file_exists($this->lastFileName) ? 'exists' : 'does NOT exist';
			$currentSize = @filesize($this->lastFileName);

			Factory::getLog()->debug(sprintf("%s::_fwrite() ERROR!! Cannot write to archive file %s. The file %s. File size %s bytes after writing %s of %d bytes. Please check the output directory permissions and make sure you have enough disk space available. If this does not help, please set up a Part Size for Split Archives LOWER than this size and retry backing up.", __CLASS__, $this->lastFileName, $fileExists, $currentSize, $ret, $len));

			throw new ErrorException(sprintf("Couldn\'t write to the archive file; check the output directory permissions and make sure you have enough disk space available. [len=%s / %s]", $ret, $len));
		}

		if ($this->lastFileName !== false)
		{
			$this->fileOffsets[$this->lastFileName] = @ftell($fp);
		}

		return $ret;
	}

	/**
	 * Removes a file path from the list of resumable offsets
	 *
	 * @param $filename
	 */
	protected function removeFromOffsetsList($filename)
	{
		if (isset($this->fileOffsets[$filename]))
		{
			unset($this->fileOffsets[$filename]);
		}
	}

}
components/com_akeeba/BackupEngine/Archiver/Zip.php000060400000102762152453623440016364 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Archiver;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Base\Exceptions\ErrorException;
use Akeeba\Engine\Base\Exceptions\WarningException;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Util\CRC32;
use RuntimeException;

class Zip extends BaseArchiver
{
	/** @var string Beginning of central directory record. */
	private $centralDirectoryRecordStartSignature = "\x50\x4b\x01\x02";

	/** @var string End of central directory record. */
	private $centralDirectoryRecordEndSignature = "\x50\x4b\x05\x06";

	/** @var string Beginning of file contents. */
	private $fileHeaderSignature = "\x50\x4b\x03\x04";

	/** @var string The name of the temporary file holding the ZIP's Central Directory */
	private $centralDirectoryFilename;

	/** @var integer The total number of files and directories stored in the ZIP archive */
	private $totalFilesCount;

	/** @var integer The total size of data in the archive. Note: On 32-bit versions of PHP, this will overflow for archives over 2Gb! */
	private $totalCompressedSize = 0;

	/** @var integer The chunk size for CRC32 calculations */
	private $AkeebaPackerZIP_CHUNK_SIZE;

	/** @var int Current part file number */
	private $currentPartNumber = 1;

	/** @var int Total number of part files */
	private $totalParts = 1;

	/**
	 * Class constructor - initializes internal operating parameters
	 *
	 * @return  void
	 */
	public function __construct()
	{
		Factory::getLog()->debug(__CLASS__ . " :: New instance");

		// Find the optimal chunk size for ZIP archive processing
		$this->findOptimalChunkSize();

		Factory::getLog()->debug("Chunk size for CRC is now " . $this->AkeebaPackerZIP_CHUNK_SIZE . " bytes");

		// Should I use Symlink Target Storage?
		$this->enableSymlinkTargetStorage();

		parent::__construct();

		if (!function_exists('hash_file') || !function_exists('hash'))
		{
			$action = version_compare(PHP_VERSION, '7.4.0', 'lt')
				? 'Please ask your host to enable the PHP hash extension and to make sure the hash_file() and hash() functions are not disabled.'
				: 'Please ask your host to change their PHP configuration so that the hash_file() and hash() functions are not disabled.';

			Factory::getLog()->warning(
				sprintf(
					'Your server lacks support for the hash_file() and/or hash() functions. CRC32 checksum cannot be calculated. Third party ZIP extraction tools may report the backup archive as broken. %s',
					$action
				)
			);
		}
	}

	/**
	 * Initialises the archiver class, creating the archive from an existent
	 * installer's JPA archive.
	 *
	 * @param   string  $sourceJPAPath      Absolute path to an installer's JPA archive
	 * @param   string  $targetArchivePath  Absolute path to the generated archive
	 * @param   array   $options            A named key array of options (optional). This is currently not supported
	 *
	 * @return void
	 */
	public function initialize($targetArchivePath, $options = [])
	{
		Factory::getLog()->debug(__CLASS__ . " :: initialize - archive $targetArchivePath");

		// Get names of temporary files
		$this->_dataFileName = $targetArchivePath;

		// Should we enable split archive feature?
		$this->enableSplitArchives();

		// Create the Central Directory temporary file
		$this->createCentralDirectoryTempFile();

		// Try to kill the archive if it exists
		$this->createNewBackupArchive();

		// On split archives, include the "Split ZIP" header, for PKZIP 2.50+ compatibility
		if ($this->useSplitArchive)
		{
			$this->openArchiveForOutput();
			$this->fwrite($this->fp, "\x50\x4b\x07\x08");
		}
	}

	public function finalize()
	{
		$this->finalizeZIPFile();
	}

	/**
	 * Glues the Central Directory of the ZIP file to the archive and takes care about the differences between single
	 * and multipart archives.
	 *
	 * Official ZIP file format: http://www.pkware.com/appnote.txt
	 *
	 * @return  void
	 */
	public function finalizeZIPFile()
	{
		// 1. Get size of central directory
		clearstatcache();
		$cdOffset                  = @filesize($this->_dataFileName);
		$this->totalCompressedSize += $cdOffset;
		$cdSize                    = @filesize($this->centralDirectoryFilename);

		// 2. Append Central Directory to data file and remove the CD temp file afterwards
		if (!is_null($this->fp))
		{
			$this->fclose($this->fp);
		}

		if (!is_null($this->cdfp))
		{
			$this->fclose($this->cdfp);
		}

		$this->openArchiveForOutput(true);

		/**
		 * Do not remove the fcloseByName line! This is required for post-processing multipart archives when for any
		 * reason $this->filePointers[$this->centralDirectoryFilename] contains null instead of boolean false. In this
		 * case the while loop would be stuck forever and the backup would fail. This HAS happened and I have been able
		 * to reproduce it but I did not have enough time to identify the real root cause. This workaround, however,
		 * works.
		 */
		$this->fcloseByName($this->centralDirectoryFilename);
		$this->cdfp = $this->fopen($this->centralDirectoryFilename, "r");

		if ($this->cdfp === false)
		{
			// Already glued, return
			$this->fclose($this->fp);
			$this->fp   = null;
			$this->cdfp = null;

			return;
		}

		// Comment length (I need it before I start gluing the archive)
		$comment_length = akstrlen($this->_comment);

		// Special consideration for split ZIP files
		if ($this->useSplitArchive)
		{
			// Calculate size of Central Directory + EOCD records
			$total_cd_eocd_size = $cdSize + 22 + $comment_length;

			// Free space on the part
			$free_space = $this->getPartFreeSize();

			if (($free_space < $total_cd_eocd_size) && ($total_cd_eocd_size > 65536))
			{
				// Not enough space on archive for CD + EOCD, will go on separate part
				$this->createAndOpenNewPart(true);
			}
		}

		/**
		 * Write the CD record
		 *
		 * Note about is_resource: in some circumstances where multipart ZIP files are generated, the $this->cdfp will
		 * contain a null value. This seems to happen when $this->fopen returns null, i.e. $this->filePointers has a
		 * null value instead of a file pointer (resource). Why this happens is unclear but the workaround is to remove
		 * the null value from $this->filePointers and retry $this->fopen. Normally this should not be required since we
		 * already to the fcloseByName/fopen dance above. This if-block is our last hope to catch a potential issue
		 * which would either make the while loop go infinite (not anymore, I've patched it) or the Central Directory
		 * not get written to the archive, which results in a broken archive.
		 */
		if (!is_resource($this->cdfp))
		{
			$this->fcloseByName($this->centralDirectoryFilename);
			$this->cdfp = $this->fopen($this->centralDirectoryFilename, "r");

			// We tried reopening the central directory file and failed again. Time to report a fatal error.
			if (!$this->cdfp)
			{
				throw new RuntimeException("Cannot open central directory temporary file {$this->centralDirectoryFilename} for reading.");
			}
		}

		while (!feof($this->cdfp) && is_resource($this->cdfp))
		{
			/**
			 * Why not split the Central Directory between parts?
			 *
			 * APPNOTE.TXT §8.5.2 "The central directory may span segment boundaries, but no single record in the
			 * central directory should be split across segments."
			 *
			 * This would require parsing the CD temp file to prevent any CD record from spanning across two parts.
			 * But how many bytes is each CD record? It's about 100 bytes per file which gives us about 10,400 files
			 * per MB. Even a 2MB part size holds more than 20,000 file records. A typical 10Mb part size holds more
			 * files than the largest backup I've ever seen. Therefore there is no need to waste computational power
			 * to see if we need to span the Central Directory between parts.
			 */
			$chunk = fread($this->cdfp, _AKEEBA_DIRECTORY_READ_CHUNK);
			$this->fwrite($this->fp, $chunk);
		}

		unset($chunk);

		// Delete the temporary CD file
		$this->fclose($this->cdfp);
		$this->cdfp = null;
		Factory::getTempFiles()->unregisterAndDeleteTempFile($this->centralDirectoryFilename);

		// 3. Write the rest of headers to the end of the ZIP file
		$this->fwrite($this->fp, $this->centralDirectoryRecordEndSignature);

		if ($this->useSplitArchive)
		{
			// Split ZIP files, enter relevant disk number information
			$this->fwrite($this->fp, pack('v', $this->totalParts - 1)); /* Number of this disk. */
			$this->fwrite($this->fp, pack('v', $this->totalParts - 1)); /* Disk with central directory start. */
		}
		else
		{
			// Non-split ZIP files, the disk number MUST be 0
			$this->fwrite($this->fp, pack('V', 0));
		}

		$this->fwrite($this->fp, pack('v', $this->totalFilesCount)); /* Total # of entries "on this disk". */
		$this->fwrite($this->fp, pack('v', $this->totalFilesCount)); /* Total # of entries overall. */
		$this->fwrite($this->fp, pack('V', $cdSize)); /* Size of central directory. */
		$this->fwrite($this->fp, pack('V', $cdOffset)); /* Offset to start of central dir. */

		// 2.0.b2 -- Write a ZIP file comment
		$this->fwrite($this->fp, pack('v', $comment_length)); /* ZIP file comment length. */
		$this->fwrite($this->fp, $this->_comment);
		$this->fclose($this->fp);

		// If Split ZIP and there is no .zip file, rename the last fragment to .ZIP
		if ($this->useSplitArchive)
		{
			$extension = substr($this->_dataFileName, -3);

			if ($extension != '.zip')
			{
				Factory::getLog()->debug('Renaming last ZIP part to .ZIP extension');

				$newName = $this->dataFileNameWithoutExtension . '.zip';

				if (!@rename($this->_dataFileName, $newName))
				{
					throw new RuntimeException('Could not rename last ZIP part to .ZIP extension.');
				}

				$this->_dataFileName = $newName;
			}

			// If Split ZIP and only one fragment, change the signature
			if ($this->totalParts == 1)
			{
				$this->fp = $this->fopen($this->_dataFileName, 'r+');
				$this->fwrite($this->fp, "\x50\x4b\x30\x30");
			}
		}

		@chmod($this->_dataFileName, $this->getPermissions());
	}

	/**
	 * Returns a string with the extension (including the dot) of the files produced
	 * by this class.
	 *
	 * @return string
	 */
	public function getExtension()
	{
		return '.zip';
	}

	/**
	 * Extend the bootstrap code to add some define's used by the ZIP format engine
	 *
	 * @return  void
	 */
	protected function __bootstrap_code()
	{
		if (!defined('_AKEEBA_COMPRESSION_THRESHOLD'))
		{
			$config = Factory::getConfiguration();
			define("_AKEEBA_COMPRESSION_THRESHOLD", $config->get('engine.archiver.common.big_file_threshold')); // Don't compress files over this size
			define("_AKEEBA_DIRECTORY_READ_CHUNK", $config->get('engine.archiver.zip.cd_glue_chunk_size')); // How much data to read at once when finalizing ZIP archives
		}

		parent::__bootstrap_code();
	}

	/**
	 * The most basic file transaction: add a single entry (file or directory) to
	 * the archive.
	 *
	 * @param   bool    $isVirtual         If true, the next parameter contains file data instead of a file name
	 * @param   string  $sourceNameOrData  Absolute file name to read data from or the file data itself is $isVirtual is
	 *                                     true
	 * @param   string  $targetName        The (relative) file name under which to store the file in the archive
	 *
	 * @return bool True on success, false otherwise
	 */
	protected function _addFile($isVirtual, &$sourceNameOrData, $targetName)
	{
		$configuration = Factory::getConfiguration();

		// Note down the starting disk number for Split ZIP archives
		$starting_disk_number_for_this_file = 0;

		if ($this->useSplitArchive)
		{
			$starting_disk_number_for_this_file = $this->currentPartNumber - 1;
		}

		// Open data file for output
		$this->openArchiveForOutput();

		// Should I continue backing up a file from the previous step?
		$continueProcessingFile = $configuration->get('volatile.engine.archiver.processingfile', false);

		// Initialize with the default values. Why are *these* values default? If we are continuing file packing, by
		// definition we have an uncompressed, non-virtual file. Hence the default values.
		$isDir             = false;
		$isSymlink         = false;
		$compressionMethod = 1;
		$zdata             = null;
		// If we are continuing file packing we have an uncompressed, non-virtual file.
		$isVirtual = $continueProcessingFile ? false : $isVirtual;
		$resume    = $continueProcessingFile ? 0 : null;

		if (!$continueProcessingFile)
		{
			// Log the file being added
			$messageSource = $isVirtual ? '(virtual data)' : "(source: $sourceNameOrData)";
			Factory::getLog()->debug("-- Adding $targetName to archive $messageSource");

			$this->writeFileHeader($sourceNameOrData, $targetName, $isVirtual, $isSymlink, $isDir,
				$compressionMethod, $zdata, $unc_len,
				$storedName, $crc, $c_len, $hexdtime, $old_offset);
		}
		else
		{
			// Since we are continuing archiving, it's an uncompressed regular file. Set up the variables.
			$sourceNameOrData = $configuration->get('volatile.engine.archiver.sourceNameOrData', '');
			$resume           = $configuration->get('volatile.engine.archiver.resume', 0);
			$unc_len          = $configuration->get('volatile.engine.archiver.unc_len');
			$storedName       = $configuration->get('volatile.engine.archiver.storedName');
			$crc              = $configuration->get('volatile.engine.archiver.crc');
			$c_len            = $configuration->get('volatile.engine.archiver.c_len');
			$hexdtime         = $configuration->get('volatile.engine.archiver.hexdtime');
			$old_offset       = $configuration->get('volatile.engine.archiver.old_offset');

			// Log the file we continue packing
			Factory::getLog()->debug("-- Resuming adding file $sourceNameOrData to archive from position $resume (total size $unc_len)");
		}

		/* "File data" segment. */
		if ($compressionMethod == 8)
		{
			$this->putRawDataIntoArchive($zdata);
		}
		elseif ($isVirtual)
		{
			// Virtual data. Put into the archive.
			$this->putRawDataIntoArchive($sourceNameOrData);
		}
		elseif ($isSymlink)
		{
			$this->fwrite($this->fp, @readlink($sourceNameOrData));
		}
		elseif ((!$isDir) && (!$isSymlink))
		{
			// Uncompressed file.
			if ($this->putUncompressedFileIntoArchive($sourceNameOrData, $unc_len, $resume) === true)
			{
				// If it returns true we are doing a step break to resume packing in the next step. So we need to return
				// true here to avoid running the final bit of code which writes the central directory record and
				// uncaches the file resume data.
				return true;
			}
		}

		// Open the central directory file for append
		if (is_null($this->cdfp))
		{
			$this->cdfp = @$this->fopen($this->centralDirectoryFilename, "a");
		}

		if ($this->cdfp === false)
		{
			throw new ErrorException("Could not open Central Directory temporary file for append!");
		}

		$this->fwrite($this->cdfp, $this->centralDirectoryRecordStartSignature);

		if (!$isSymlink)
		{
			$this->fwrite($this->cdfp, "\x14\x00"); /* Version made by (always set to 2.0). */
			$this->fwrite($this->cdfp, "\x14\x00"); /* Version needed to extract */
			$this->fwrite($this->cdfp, pack('v', 2048)); /* General purpose bit flag */
			$this->fwrite($this->cdfp, ($compressionMethod == 8) ? "\x08\x00" : "\x00\x00"); /* Compression method. */
		}
		else
		{
			// Symlinks get special treatment
			$this->fwrite($this->cdfp, "\x14\x03"); /* Version made by (version 2.0 with UNIX extensions). */
			$this->fwrite($this->cdfp, "\x0a\x03"); /* Version needed to extract */
			$this->fwrite($this->cdfp, pack('v', 2048)); /* General purpose bit flag */
			$this->fwrite($this->cdfp, "\x00\x00"); /* Compression method. */
		}

		$this->fwrite($this->cdfp, $hexdtime); /* Last mod time/date. */
		$this->fwrite($this->cdfp, $crc); /* CRC 32 information. */
		$this->fwrite($this->cdfp, pack('V', $c_len)); /* Compressed filesize. */

		if ($compressionMethod == 0)
		{
			// When we are not compressing, $unc_len is being reduced to 0 while backing up.
			// With this trick, we always store the correct length, as in this case the compressed
			// and uncompressed length is always the same.
			$this->fwrite($this->cdfp, pack('V', $c_len)); /* Uncompressed filesize. */
		}
		else
		{
			// When compressing, the uncompressed length differs from compressed length
			// and this line writes the correct value.
			$this->fwrite($this->cdfp, pack('V', $unc_len)); /* Uncompressed filesize. */
		}

		$fn_length = akstrlen($storedName);
		$this->fwrite($this->cdfp, pack('v', $fn_length)); /* Length of filename. */
		$this->fwrite($this->cdfp, pack('v', 0)); /* Extra field length. */
		$this->fwrite($this->cdfp, pack('v', 0)); /* File comment length. */
		$this->fwrite($this->cdfp, pack('v', $starting_disk_number_for_this_file)); /* Disk number start. */
		$this->fwrite($this->cdfp, pack('v', 0)); /* Internal file attributes. */

		/* External file attributes */
		if (!$isSymlink)
		{
			// Archive bit set
			$this->fwrite($this->cdfp, pack('V', $isDir ? 0x41FF0010 : 0xFE49FFE0));
		}
		else
		{
			// For SymLinks we store UNIX file attributes
			$this->fwrite($this->cdfp, "\x20\x80\xFF\xA1");
		}

		$this->fwrite($this->cdfp, pack('V', $old_offset)); /* Relative offset of local header. */
		$this->fwrite($this->cdfp, $storedName); /* File name. */

		/* Optional extra field, file comment goes here. */

		// Finally, increase the file counter by one
		$this->totalFilesCount++;

		// Uncache data
		$configuration->set('volatile.engine.archiver.sourceNameOrData', null);
		$configuration->set('volatile.engine.archiver.unc_len', null);
		$configuration->set('volatile.engine.archiver.resume', null);
		$configuration->set('volatile.engine.archiver.hexdtime', null);
		$configuration->set('volatile.engine.archiver.crc', null);
		$configuration->set('volatile.engine.archiver.c_len', null);
		$configuration->set('volatile.engine.archiver.fn_length', null);
		$configuration->set('volatile.engine.archiver.old_offset', null);
		$configuration->set('volatile.engine.archiver.storedName', null);
		$configuration->set('volatile.engine.archiver.sourceNameOrData', null);

		$configuration->set('volatile.engine.archiver.processingfile', false);

		// ... and return TRUE = success
		return true;
	}

	/**
	 * Write the file header before putting the file data into the archive
	 *
	 * @param   string  $sourceNameOrData   The path to the file being compressed, or the raw file data for virtual files
	 * @param   string  $targetName         The target path to be stored inside the archive
	 * @param   bool    $isVirtual          Is this a virtual file?
	 * @param   bool    $isSymlink          Is this a symlink?
	 * @param   bool    $isDir              Is this a directory?
	 * @param   int     $compressionMethod  The compression method chosen for this file
	 * @param   string  $zdata              If we have compression method other than 0 this holds the compressed data.
	 *                                      We return that from this method to avoid having to compress the same data
	 *                                      twice (once to write the compressed data length in the header and once to
	 *                                      write the compressed data to the archive).
	 * @param   int     $unc_len            The uncompressed size of the file / source data
	 *
	 * @param   string  $storedName         The file path stored in the archive
	 * @param   string  $crc                CRC-32 for the file
	 * @param   int     $c_len              Compressed data length
	 * @param   string  $hexdtime           ZIP's hexadecimal notation if the file's modification date
	 * @param   int     $old_offset         Offset of the file header in the part file
	 */
	protected function writeFileHeader(&$sourceNameOrData, $targetName, &$isVirtual, &$isSymlink, &$isDir,
	                                   &$compressionMethod, &$zdata, &$unc_len, &$storedName, &$crc, &$c_len,
	                                   &$hexdtime, &$old_offset)
	{
		static $memLimit = null;

		if (is_null($memLimit))
		{
			$memLimit = $this->getMemoryLimit();
		}

		$configuration = Factory::getConfiguration();

		// See if it's a directory
		$isDir = $isVirtual ? false : is_dir($sourceNameOrData);

		// See if it's a symlink (w/out dereference)
		$isSymlink = false;

		if ($this->storeSymlinkTarget && !$isVirtual)
		{
			$isSymlink = is_link($sourceNameOrData);
		}

		// Get real size before compression
		[$unc_len, $fileModTime] =
			$this->getFileSizeAndModificationTime($sourceNameOrData, $isVirtual, $isSymlink, $isDir);

		// Decide if we will compress
		$compressionMethod = $this->getCompressionMethod($unc_len, $memLimit, $isDir, $isSymlink);

		if ($isVirtual)
		{
			Factory::getLog()->debug('  Virtual add:' . $targetName . ' (' . $unc_len . ') - ' . $compressionMethod);
		}

		/* "Local file header" segment. */

		$crc = $this->getCRCForEntity($sourceNameOrData, $isVirtual, $isDir, $isSymlink);

		$storedName = $targetName;

		if (!$isSymlink && $isDir)
		{
			$storedName .= "/";
			$unc_len    = 0;
		}

		// Test for non-existing or unreadable files
		$this->testIfFileExists($sourceNameOrData, $isVirtual, $isDir, $isSymlink);

		// Default compressed (archived) length = uncompressed length – valid unless we can actually compress the data.
		$c_len = $unc_len;

		// If we have to compress, read the data in memory and compress it
		if ($compressionMethod == 8)
		{
			$this->getZData($sourceNameOrData, $isVirtual, $compressionMethod, $zdata, $unc_len, $c_len);

			// The method modifies $compressionMethod to 0 (uncompressed) or 1 (Deflate) but the ZIP format needs it
			// to be 0 (uncompressed) or 8 (Deflate). So I just multiply by 8.
			$compressionMethod *= 8;
		}

		// Get the hex time.
		$hexdtime = pack('V', $this->unix2DOSTime($fileModTime));

		// If it's a split ZIP file, we've got to make sure that the header can fit in the part
		if ($this->useSplitArchive)
		{
			// Get header size, taking into account any extra header necessary
			$header_size = 30 + akstrlen($storedName);

			// Compare to free part space
			$free_space = $this->getPartFreeSize();

			if ($free_space <= $header_size)
			{
				// Not enough space on current part, create new part
				$this->createAndOpenNewPart();
			}
		}

		$old_offset = @ftell($this->fp);

		if ($this->useSplitArchive && ($old_offset == 0))
		{
			// Because in split ZIPs we have the split ZIP marker in the first four bytes.
			@fseek($this->fp, 4);
			$old_offset = @ftell($this->fp);
		}

		// Get the file name length in bytes
		$fn_length = akstrlen($storedName);

		$this->fwrite($this->fp, $this->fileHeaderSignature); /* Begin creating the ZIP data. */

		/* Version needed to extract. */
		if (!$isSymlink)
		{
			$this->fwrite($this->fp, "\x14\x00");
		}
		else
		{
			$this->fwrite($this->fp, "\x0a\x03");
		}

		$this->fwrite($this->fp, pack('v', 2048)); /* General purpose bit flag. Bit 11 set = use UTF-8 encoding for filenames & comments */
		$this->fwrite($this->fp, ($compressionMethod == 8) ? "\x08\x00" : "\x00\x00"); /* Compression method. */
		$this->fwrite($this->fp, $hexdtime); /* Last modification time/date. */
		$this->fwrite($this->fp, $crc); /* CRC 32 information. */
		$this->fwrite($this->fp, pack('V', $c_len)); /* Compressed filesize. */
		$this->fwrite($this->fp, pack('V', $unc_len)); /* Uncompressed filesize. */
		$this->fwrite($this->fp, pack('v', $fn_length)); /* Length of filename. */
		$this->fwrite($this->fp, pack('v', 0)); /* Extra field length. */
		$this->fwrite($this->fp, $storedName); /* File name. */

		// Cache useful information about the file
		if (!$isDir && !$isSymlink && !$isVirtual)
		{
			$configuration->set('volatile.engine.archiver.unc_len', $unc_len);
			$configuration->set('volatile.engine.archiver.hexdtime', $hexdtime);
			$configuration->set('volatile.engine.archiver.crc', $crc);
			$configuration->set('volatile.engine.archiver.c_len', $c_len);
			$configuration->set('volatile.engine.archiver.fn_length', $fn_length);
			$configuration->set('volatile.engine.archiver.old_offset', $old_offset);
			$configuration->set('volatile.engine.archiver.storedName', $storedName);
			$configuration->set('volatile.engine.archiver.sourceNameOrData', $sourceNameOrData);
		}
	}

	/**
	 * Get the preferred compression method for a file
	 *
	 * @param   int   $fileSize   File size in bytes
	 * @param   int   $memLimit   Memory limit in bytes
	 * @param   bool  $isDir      Is it a directory?
	 * @param   bool  $isSymlink  Is it a symlink?
	 *
	 * @return  int  Compression method to use
	 */
	protected function getCompressionMethod($fileSize, $memLimit, $isDir, $isSymlink)
	{
		// ZIP uses 0 for uncompressed and 8 for GZip Deflate whereas the parent method returns 0 and 1 respectively
		return 8 * parent::getCompressionMethod($fileSize, $memLimit, $isDir, $isSymlink);
	}

	/**
	 * Calculate the CRC-32 checksum
	 *
	 * @param   string  $sourceNameOrData  The path to the file being compressed, or the raw file data for virtual files
	 * @param   bool    $isVirtual         Is this a virtual file?
	 * @param   bool    $isSymlink         Is this a symlink?
	 * @param   bool    $isDir             Is this a directory?
	 *
	 * @return  int  The CRC-32
	 */
	protected function getCRCForEntity(&$sourceNameOrData, &$isVirtual, &$isDir, &$isSymlink)
	{
		// No hash? No CRC32!
		if (!function_exists('hash'))
		{
			return pack('V', 0);
		}

		// Do I need to reverse the endianness of CRC32b data?
		static $reverseEndianness = null;

		if ($reverseEndianness === null)
		{
			$reverseEndianness = hash('crc32b', 'The quick brown fox jumped over the lazy dog.', true) === pack('N', 2191738434);
		}

		$entityType = 'file';
		$loggedName = null;

		// Directories: dummy CRC-32
		if (!$isSymlink && $isDir)
		{
			$entityType = 'folder';
			$crc        = pack('V', 0);
		}
		// Symlinks: CRC32 of the link source
		elseif ($isSymlink)
		{
			$entityType = 'symlink';
			$crc        = hash('crc32b', @readlink($sourceNameOrData) ?: '', true);
		}
		// Virtual files: CRC32 of the contents
		elseif ($isVirtual)
		{
			$entityType = 'virtual file';
			$loggedName = sprintf('of size %u', strlen($sourceNameOrData));
			$crc        = hash('crc32b', $sourceNameOrData ?: '', true);
		}
		// Files: CRC32 of the file contents
		else
		{
			// Get the CRC32 for the file
			$crc = function_exists("hash_file") ? @hash_file('crc32b', $sourceNameOrData, true) : null;

			// If the file was unreadable skip it
			if ($crc === false)
			{
				throw new WarningException('Could not calculate CRC32 for ' . $sourceNameOrData . '. Looks like it is an unreadable file.');
			}

			// If hash_file is not available use a fake CRC32
			$crc = $crc ?: pack('V', 0);
		}

		/**
		 * If CRC32 returns Big Endian data I'll have to convert it to Little Endian, as required by ZIP.
		 *
		 * I cannot unpack as Big Endian and repack as Little Endian. The intermediate conversion to integer might
		 * overflow 32-bit versions of PHP as its internal integer type is platform-dependent.
		 *
		 * I cannot reverse the string using string functions because the internal character encoding may be something
		 * other than ASCII / 8-bit and mb_string might not be available.
		 *
		 * Instead, I am unpacking the binary string as an array of unsigned bytes and then repacking the bytes, in
		 * reverse order, into a binary string. pack() and unpack() are not affected by the character encoding. Using
		 * unsigned bytes guarantees they will fit into internal integer variables regardless of the platform used.
		 */
		if ($crc !== "\000\000\000\000" && $reverseEndianness)
		{
			$temp = array_values(unpack('C4', $crc));
			$crc  = pack('C*', $temp[3], $temp[2], $temp[1], $temp[0]);
		}

		// Log the calculated CRC32 if the site is in debug mode
		if (defined('AKEEBADEBUG'))
		{
			$asHexChars = array_map(
				function ($c) {
					return dechex($c);
				}, unpack('C*', $crc)
			);

			Factory::getLog()->debug(
				sprintf(
					'%s %s - CRC32 = %s',
					$entityType,
					$loggedName ?? $sourceNameOrData,
					implode('', $reverseEndianness ? array_reverse($asHexChars) : $asHexChars)
				)
			);
		}

		return $crc;
	}

	/**
	 * Converts a UNIX timestamp to a 4-byte DOS date and time format
	 * (date in high 2-bytes, time in low 2-bytes allowing magnitude
	 * comparison).
	 *
	 * @param   integer  $unixtime  The current UNIX timestamp.
	 *
	 * @return integer  The current date in a 4-byte DOS format.
	 */
	protected function unix2DOSTime($unixtime = null)
	{
		$timearray = (is_null($unixtime)) ? getdate() : getdate($unixtime);

		if ($timearray['year'] < 1980)
		{
			$timearray['year']    = 1980;
			$timearray['mon']     = 1;
			$timearray['mday']    = 1;
			$timearray['hours']   = 0;
			$timearray['minutes'] = 0;
			$timearray['seconds'] = 0;
		}

		return (($timearray['year'] - 1980) << 25) |
			($timearray['mon'] << 21) |
			($timearray['mday'] << 16) |
			($timearray['hours'] << 11) |
			($timearray['minutes'] << 5) |
			($timearray['seconds'] >> 1);
	}

	/**
	 * Creates a new part for the spanned archive
	 *
	 * @param   bool  $finalPart  Is this the final archive part?
	 *
	 * @return  bool  True on success
	 */
	protected function createNewPartFile($finalPart = false)
	{
		// Close any open file pointers
		if (is_resource($this->fp))
		{
			$this->fclose($this->fp);
		}

		if (is_resource($this->cdfp))
		{
			$this->fclose($this->cdfp);
		}

		// Remove the just finished part from the list of resumable offsets
		$this->removeFromOffsetsList($this->_dataFileName);

		// Set the file pointers to null
		$this->fp   = null;
		$this->cdfp = null;

		// Push the previous part if we have to post-process it immediately
		$configuration = Factory::getConfiguration();

		if ($configuration->get('engine.postproc.common.after_part', 0))
		{
			$this->finishedPart[] = $this->_dataFileName;
		}

		// Add the part's size to our rolling sum
		clearstatcache();
		$this->totalCompressedSize += filesize($this->_dataFileName);
		$this->totalParts++;
		$this->currentPartNumber = $this->totalParts;

		if ($finalPart)
		{
			$this->_dataFileName = $this->dataFileNameWithoutExtension . '.zip';
		}
		else
		{
			$this->_dataFileName = $this->dataFileNameWithoutExtension . '.z' . sprintf('%02d', $this->currentPartNumber);
		}

		Factory::getLog()->info('Creating new ZIP part #' . $this->currentPartNumber . ', file ' . $this->_dataFileName);

		// Inform the backup engine that we have changed the multipart number
		$statistics = Factory::getStatistics();
		$statistics->updateMultipart($this->totalParts);

		// Try to remove any existing file
		@unlink($this->_dataFileName);

		// Touch the new file
		$result = @touch($this->_dataFileName);

		@chmod($this->_dataFileName, $this->getPermissions());

		return $result;
	}

	/**
	 * Find the optimal chunk size for CRC32 calculations and file processing
	 *
	 * @return  void
	 */
	private function findOptimalChunkSize()
	{
		$configuration = Factory::getConfiguration();

		// The user has entered their own preference
		if ($configuration->get('engine.archiver.common.chunk_size', 0) > 0)
		{
			$this->AkeebaPackerZIP_CHUNK_SIZE = AKEEBA_CHUNK;

			return;
		}

		// Get the PHP memory limit
		$memLimit = $this->getMemoryLimit();

		// Can't get a PHP memory limit? Use 2Mb chunks (fairly large, right?)
		if (is_null($memLimit))
		{
			$this->AkeebaPackerZIP_CHUNK_SIZE = 2097152;

			return;
		}

		if (!function_exists("memory_get_usage"))
		{
			// PHP can't report memory usage, use a conservative 512Kb
			$this->AkeebaPackerZIP_CHUNK_SIZE = 524288;

			return;
		}

		// PHP *can* report memory usage, see if there's enough available memory
		$availableRAM = $memLimit - memory_get_usage();

		if ($availableRAM > 0)
		{
			$this->AkeebaPackerZIP_CHUNK_SIZE = $availableRAM * 0.5;

			return;
		}

		// NEGATIVE AVAILABLE MEMORY?!! Some borked PHP implementations also return the size of the httpd footprint.
		if (($memLimit - 6291456) > 0)
		{
			$this->AkeebaPackerZIP_CHUNK_SIZE = $memLimit - 6291456;

			return;
		}

		// If all else fails, use 2Mb and cross your fingers
		$this->AkeebaPackerZIP_CHUNK_SIZE = 2097152;
	}

	/**
	 * Create a Central Directory temporary file
	 *
	 * @return  void
	 *
	 * @throws  ErrorException
	 */
	private function createCentralDirectoryTempFile()
	{
		$configuration                  = Factory::getConfiguration();
		$this->centralDirectoryFilename = tempnam($configuration->get('akeeba.basic.output_directory'), 'akzcd');
		$this->centralDirectoryFilename = basename($this->centralDirectoryFilename);
		$pos                            = strrpos($this->centralDirectoryFilename, '/');

		if ($pos !== false)
		{
			$this->centralDirectoryFilename = substr($this->centralDirectoryFilename, $pos + 1);
		}

		$pos = strrpos($this->centralDirectoryFilename, '\\');

		if ($pos !== false)
		{
			$this->centralDirectoryFilename = substr($this->centralDirectoryFilename, $pos + 1);
		}

		$this->centralDirectoryFilename = Factory::getTempFiles()->registerTempFile($this->centralDirectoryFilename);

		Factory::getLog()->debug(__CLASS__ . " :: CntDir Tempfile = " . $this->centralDirectoryFilename);

		// Create temporary file
		if (!@touch($this->centralDirectoryFilename))
		{
			throw new ErrorException("Could not open temporary file for ZIP archiver. Please check your temporary directory's permissions!");
		}

		@chmod($this->centralDirectoryFilename, $this->getPermissions());
	}
}
components/com_akeeba/BackupEngine/Archiver/Jpa.php000060400000045716152453623440016341 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Archiver;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Base\Exceptions\ErrorException;
use Akeeba\Engine\Factory;
use RuntimeException;

/**
 * JPA creation class
 *
 * JPA Format 1.2 implemented, minus BZip2 compression support
 */
class Jpa extends BaseArchiver
{
	/** @var string Standard Header signature */
	private const ARCHIVE_SIGNATURE = "\x4A\x50\x41";

	/** @var string Entity Block signature */
	private const FILE_HEADER_SIGNATURE = "\x4A\x50\x46";

	/** @var string Marks the split archive's extra header */
	private const SPLIT_ARCHIVE_EXTRA_HEADER = "\x4A\x50\x01\x01";

	/** @var string Marks the archive's 64-bit integer representations of file sizes (JPA v1.3) */
	private const ARCHIVE_LONGLONG_SIZES_EXTRA_HEADER = "\x4A\x50\x01\x02";

	/** @var integer How many files are contained in the archive */
	private $totalFilesCount = 0;

	/** @var integer The total size of files contained in the archive as they are stored */
	private $totalCompressedSize = 0;

	/** @var integer The total size of files contained in the archive when they are extracted to disk. */
	private $totalUncompressedSize = 0;

	/** @var int Current part file number */
	private $currentPartNumber = 1;

	/** @var int Total number of part files */
	private $totalParts = 1;

	/**
	 * Initialises the archiver class, creating the archive from an existent
	 * installer's JPA archive.
	 *
	 * @param   string  $targetArchivePath  Absolute path to the generated archive
	 * @param   array   $options            A named key array of options (optional)
	 *
	 * @return  void
	 */
	public function initialize($targetArchivePath, $options = [])
	{
		Factory::getLog()->debug(__CLASS__ . " :: new instance - archive $targetArchivePath");
		$this->_dataFileName = $targetArchivePath;

		// Should we enable Split ZIP feature?
		$this->enableSplitArchives();

		// Should I use Symlink Target Storage?
		$this->enableSymlinkTargetStorage();

		// Try to kill the archive if it exists
		$this->createNewBackupArchive();

		// Write the initial instance of the archive header
		$this->_writeArchiveHeader();
	}

	/**
	 * Updates the Standard Header with current information
	 *
	 * @return  void
	 */
	public function finalize()
	{
		if (is_resource($this->fp))
		{
			$this->fclose($this->fp);
		}

		if (is_resource($this->cdfp))
		{
			$this->fclose($this->cdfp);
		}

		$this->_closeAllFiles();

		// If Spanned JPA and there is no .jpa file, rename the last fragment to .jpa
		if ($this->useSplitArchive)
		{
			$extension = substr($this->_dataFileName, -4);

			if ($extension != '.jpa')
			{
				Factory::getLog()->debug('Renaming last JPA part to .JPA extension');

				$newName = $this->dataFileNameWithoutExtension . '.jpa';

				if (!@rename($this->_dataFileName, $newName))
				{
					throw new RuntimeException('Could not rename last JPA part to .JPA extension.');
				}

				$this->_dataFileName = $newName;
			}

			// Finally, point to the first part so that we can re-write the correct header information
			if ($this->totalParts > 1)
			{
				$this->_dataFileName = $this->dataFileNameWithoutExtension . '.j01';
			}
		}

		// Re-write the archive header
		$this->_writeArchiveHeader();
	}

	/**
	 * Returns a string with the extension (including the dot) of the files produced
	 * by this class.
	 *
	 * @return string
	 */
	public function getExtension()
	{
		return '.jpa';
	}

	/**
	 * Outputs a Standard Header at the top of the file
	 *
	 * @return  void
	 */
	protected function _writeArchiveHeader()
	{
		if (!is_null($this->fp))
		{
			$this->fclose($this->fp);
			$this->fp = null;
		}

		$this->fp = $this->fopen($this->_dataFileName, 'c');

		if ($this->fp === false)
		{
			throw new ErrorException('Could not open ' . $this->_dataFileName . ' for writing. Check permissions and open_basedir restrictions.');
		}

		// Calculate total header size
		$headerSize = 19; // Standard Header

		if ($this->useSplitArchive)
		{
			// Spanned JPA header
			$headerSize += 8;
		}

		$is64Bit = $this->is64Bit();

		if ($is64Bit)
		{
			// Version 1.3 long long sizes
			$headerSize += 22;

		}

		// Write the archive header
		$this->fwrite($this->fp, self::ARCHIVE_SIGNATURE); // ID string (JPA)
		$this->fwrite($this->fp, pack('v', $headerSize)); // Header length; fixed to 19 bytes
		$this->fwrite($this->fp, pack('C', _JPA_MAJOR)); // Major version
		$this->fwrite($this->fp, pack('C', _JPA_MINOR)); // Minor version
		$this->fwrite($this->fp, pack('V', $this->totalFilesCount)); // File count
		$this->fwrite($this->fp, pack('V', $this->totalUncompressedSize)); // Size of files when extracted
		$this->fwrite($this->fp, pack('V', $this->totalCompressedSize)); // Size of files when stored

		// Do I need to add a split archive's header too?
		if ($this->useSplitArchive)
		{
			$this->fwrite($this->fp, self::SPLIT_ARCHIVE_EXTRA_HEADER); // Signature
			$this->fwrite($this->fp, pack('v', 4)); // Extra field length
			$this->fwrite($this->fp, pack('v', $this->totalParts)); // Number of parts
		}

		if ($is64Bit)
		{
			// Version 1.3
			$this->fwrite($this->fp, self::ARCHIVE_LONGLONG_SIZES_EXTRA_HEADER); // Signature
			$this->fwrite($this->fp, pack('v', 18)); // Extra field length
			$this->fwrite($this->fp, pack('P', $this->totalUncompressedSize)); // Size of files when extracted
			$this->fwrite($this->fp, pack('P', $this->totalCompressedSize)); // Size of files when stored
		}

		$this->fclose($this->fp);

		@chmod($this->_dataFileName, $this->getPermissions());
	}

	/**
	 * Extend the bootstrap code to add some define's used by the JPA format engine
	 *
	 * @codeCoverageIgnore
	 *
	 * @return  void
	 */
	protected function __bootstrap_code()
	{
		if (!defined('_AKEEBA_COMPRESSION_THRESHOLD'))
		{
			$config = Factory::getConfiguration();
			define("_AKEEBA_COMPRESSION_THRESHOLD", $config->get('engine.archiver.common.big_file_threshold')); // Don't compress files over this size

			/**
			 * Akeeba Backup and JPA Format version change chart:
			 * Akeeba Backup 3.0: JPA Format 1.1
			 * Akeeba Backup 3.1: JPA Format 1.2 with file modification timestamp is used
			 * Akeeba Backup for Joomla 8.3/9.6, Solo/Akeeba Backup for WordPress 7.9: JPA Format 1.3
			 */
			define('_JPA_MAJOR', 1); // JPA Format major version number

			if ($this->is64Bit())
			{
				define('_JPA_MINOR', 3); // JPA Format minor version number
			}
			else
			{
				define('_JPA_MINOR', 2); // JPA Format minor version number
			}
		}
		parent::__bootstrap_code();
	}

	/**
	 * The most basic file transaction: add a single entry (file or directory) to
	 * the archive.
	 *
	 * @param   bool    $isVirtual         If true, the next parameter contains file data instead of a file name
	 * @param   string  $sourceNameOrData  Absolute file name to read data from or the file data itself is $isVirtual is
	 *                                     true
	 * @param   string  $targetName        The (relative) file name under which to store the file in the archive
	 *
	 * @return boolean True on success, false otherwise
	 *
	 * @since  1.2.1
	 */
	protected function _addFile($isVirtual, &$sourceNameOrData, $targetName)
	{
		// Get references to engine objects we're going to be using
		$configuration = Factory::getConfiguration();

		// Is this a virtual file?
		$isVirtual = (bool) $isVirtual;

		// Open data file for output
		$this->openArchiveForOutput();

		// Should I continue backing up a file from the previous step?
		$continueProcessingFile = $configuration->get('volatile.engine.archiver.processingfile', false);

		// Initialize with the default values. Why are *these* values default? If we are continuing file packing, by
		// definition we have an uncompressed, non-virtual file. Hence the default values.
		$isDir             = false;
		$isSymlink         = false;
		$compressionMethod = 0;
		$zdata             = null;
		// If we are continuing file packing we have an uncompressed, non-virtual file.
		$isVirtual = $continueProcessingFile ? false : $isVirtual;
		$resume    = $continueProcessingFile ? 0 : null;

		if (!$continueProcessingFile)
		{
			// Log the file being added
			$messageSource = $isVirtual ? '(virtual data)' : "(source: $sourceNameOrData)";
			Factory::getLog()->debug("-- Adding $targetName to archive $messageSource");

			// Write a file header
			$this->writeFileHeader($sourceNameOrData, $targetName, $isVirtual, $isSymlink, $isDir, $compressionMethod, $zdata, $unc_len);
		}
		else
		{
			$sourceNameOrData = $configuration->get('volatile.engine.archiver.sourceNameOrData', '');
			$unc_len          = $configuration->get('volatile.engine.archiver.unc_len', 0);
			$resume           = $configuration->get('volatile.engine.archiver.resume', 0);

			// Log the file we continue packing
			Factory::getLog()->debug("-- Resuming adding file $sourceNameOrData to archive from position $resume (total size $unc_len)");
		}

		/* "File data" segment. */
		if ($compressionMethod == 1)
		{
			// Compressed data. Put into the archive.
			$this->putRawDataIntoArchive($zdata);
		}
		elseif ($isVirtual)
		{
			// Virtual data. Put into the archive.
			$this->putRawDataIntoArchive($sourceNameOrData);
		}
		elseif ($isSymlink)
		{
			// Symlink. Just put the link target into the archive.
			$this->fwrite($this->fp, @readlink($sourceNameOrData));
		}
		elseif ((!$isDir) && (!$isSymlink))
		{
			// Uncompressed file.
			if ($this->putUncompressedFileIntoArchive($sourceNameOrData, $unc_len, $resume) === true)
			{
				// If it returns true we are doing a step break to resume packing in the next step. So we need to return
				// true here to avoid running the final bit of code which uncaches the file resume data.
				return true;
			}
		}

		// Factory::getLog()->debug("DEBUG -- Added $targetName to archive");

		// Uncache data
		$configuration->set('volatile.engine.archiver.sourceNameOrData', null);
		$configuration->set('volatile.engine.archiver.unc_len', null);
		$configuration->set('volatile.engine.archiver.resume', null);
		$configuration->set('volatile.engine.archiver.processingfile', false);

		// ... and return TRUE = success
		return true;
	}

	/**
	 * Write the file header to the backup archive.
	 *
	 * Only the first three parameters are input. All other are ignored for input and are overwritten.
	 *
	 * @param   string  $sourceNameOrData   The path to the file being compressed, or the raw file data for virtual files
	 * @param   string  $targetName         The target path to be stored inside the archive
	 * @param   bool    $isVirtual          Is this a virtual file?
	 * @param   bool    $isSymlink          Is this a symlink?
	 * @param   bool    $isDir              Is this a directory?
	 * @param   int     $compressionMethod  The compression method chosen for this file
	 * @param   string  $zdata              If we have compression method other than 0 this holds the compressed data.
	 *                                      We return that from this method to avoid having to compress the same data
	 *                                      twice (once to write the compressed data length in the header and once to
	 *                                      write the compressed data to the archive).
	 * @param   int     $unc_len            The uncompressed size of the file / source data
	 *
	 * @return  void
	 */
	protected function writeFileHeader(&$sourceNameOrData, &$targetName, &$isVirtual, &$isSymlink, &$isDir, &$compressionMethod, &$zdata, &$unc_len)
	{
		static $memLimit = null;

		if (is_null($memLimit))
		{
			$memLimit = $this->getMemoryLimit();
		}

		$configuration = Factory::getConfiguration();

		// Uncache data -- WHY DO THAT?!
		/**
		 * $configuration->set('volatile.engine.archiver.sourceNameOrData', null);
		 * $configuration->set('volatile.engine.archiver.unc_len', null);
		 * $configuration->set('volatile.engine.archiver.resume', null);
		 * $configuration->set('volatile.engine.archiver.processingfile',false);
		 * /**/

		// See if it's a directory
		$isDir = $isVirtual ? false : is_dir($sourceNameOrData);

		// See if it's a symlink (w/out dereference)
		$isSymlink = false;

		if ($this->storeSymlinkTarget && !$isVirtual)
		{
			$isSymlink = is_link($sourceNameOrData);
		}

		// Get real size before compression
		[$fileSize, $fileModTime] =
			$this->getFileSizeAndModificationTime($sourceNameOrData, $isVirtual, $isSymlink, $isDir);

		// Decide if we will compress
		$compressionMethod = $this->getCompressionMethod($fileSize, $memLimit, $isDir, $isSymlink);

		$storedName = $targetName;

		/* "Entity Description Block" segment. */
		$unc_len    = $fileSize; // File size
		$storedName .= ($isDir) ? "/" : "";

		/**
		 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		 * !!!! WARNING!!! DO NOT MOVE THIS BLOCK OF CODE AFTER THE testIfFileExists OR getZData!!!!       !!!!
		 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		 *
		 * PHP 5.6.3 IS BROKEN. Possibly the same applies for all old versions of PHP. If you try to get the file
		 * permissions after reading its contents PHP segfaults.
		 */
		// Get file permissions
		$perms = 0644;

		if (!$isVirtual)
		{
			$perms = @fileperms($sourceNameOrData);
		}

		// Test for non-existing or unreadable files
		$this->testIfFileExists($sourceNameOrData, $isVirtual, $isDir, $isSymlink);

		// Default compressed (archived) length = uncompressed length – valid unless we can actually compress the data.
		$c_len = $unc_len;

		if ($compressionMethod == 1)
		{
			$this->getZData($sourceNameOrData, $isVirtual, $compressionMethod, $zdata, $unc_len, $c_len);
		}

		$this->totalCompressedSize   += $c_len; // Update global data
		$this->totalUncompressedSize += $fileSize; // Update global data
		$this->totalFilesCount++;

		// Calculate Entity Description Block length
		$blockLength = 21 + akstrlen($storedName);

		// If we need to store the file mod date
		if ($fileModTime > 0)
		{
			$blockLength += 8;
		}

		$is64Bit = $this->is64Bit();

		if ($is64Bit)
		{
			// We need to account for the Long Long File Sizes Extra Field in JPA v1.3
			$blockLength += 20;
		}

		// Get file type
		$fileType = 1;

		if ($isSymlink)
		{
			$fileType = 2;
		}
		elseif ($isDir)
		{
			$fileType = 0;
		}

		// If it's a split JPA file, we've got to make sure that the header can fit in the part
		if ($this->useSplitArchive)
		{
			// Compare to free part space
			$free_space = $this->getPartFreeSize();

			if ($free_space <= $blockLength)
			{
				// Not enough space on current part, create new part
				$this->createAndOpenNewPart();
			}
		}

		$this->fwrite($this->fp, self::FILE_HEADER_SIGNATURE); // Entity Description Block header
		$this->fwrite($this->fp, pack('v', $blockLength)); // Entity Description Block header length
		$this->fwrite($this->fp, pack('v', akstrlen($storedName))); // Length of entity path
		$this->fwrite($this->fp, $storedName); // Entity path
		$this->fwrite($this->fp, pack('C', $fileType)); // Entity type
		$this->fwrite($this->fp, pack('C', $compressionMethod)); // Compression method
		$this->fwrite($this->fp, pack('V', $c_len)); // Compressed size
		$this->fwrite($this->fp, pack('V', $unc_len)); // Uncompressed size
		$this->fwrite($this->fp, pack('V', $perms)); // Entity permissions

		// Timestamp Extra Field, only for files
		if ($fileModTime > 0)
		{
			$this->fwrite($this->fp, "\x00\x01"); // Extra Field Identifier
			$this->fwrite($this->fp, pack('v', 8)); // Extra Field Length
			$this->fwrite($this->fp, pack('V', $fileModTime)); // Timestamp
		}

		if ($is64Bit)
		{
			// The Long Long File Sizes Extra Field
			$this->fwrite($this->fp, "\x00\x02"); // Extra Field Identifier
			$this->fwrite($this->fp, pack('v', 20)); // Extra Field Length
			$this->fwrite($this->fp, pack('P', $c_len)); // Compressed size
			$this->fwrite($this->fp, pack('P', $unc_len)); // Uncompressed size
		}

		// Cache useful information about the file
		if (!$isDir && !$isSymlink && !$isVirtual)
		{
			$configuration->set('volatile.engine.archiver.unc_len', $unc_len);
			$configuration->set('volatile.engine.archiver.sourceNameOrData', $sourceNameOrData);
		}
	}

	/**
	 * Creates a new part for the spanned archive
	 *
	 * @param   bool  $finalPart  Is this the final archive part?
	 *
	 * @return  bool  True on success
	 */
	protected function createNewPartFile($finalPart = false)
	{
		// Close any open file pointers
		if (!is_resource($this->fp))
		{
			$this->fclose($this->fp);
		}

		if (is_resource($this->cdfp))
		{
			$this->fclose($this->cdfp);
		}

		// Remove the just finished part from the list of resumable offsets
		$this->removeFromOffsetsList($this->_dataFileName);

		// Set the file pointers to null
		$this->fp   = null;
		$this->cdfp = null;

		// Push the previous part if we have to post-process it immediately
		$configuration = Factory::getConfiguration();

		if ($configuration->get('engine.postproc.common.after_part', 0))
		{
			// The first part needs its header overwritten during archive
			// finalization. Skip it from immediate processing.
			if ($this->currentPartNumber != 1)
			{
				$this->finishedPart[] = $this->_dataFileName;
			}
		}

		$this->totalParts++;
		$this->currentPartNumber = $this->totalParts;

		if ($finalPart)
		{
			$this->_dataFileName = $this->dataFileNameWithoutExtension . '.jpa';
		}
		else
		{
			$this->_dataFileName = $this->dataFileNameWithoutExtension . '.j' . sprintf('%02d', $this->currentPartNumber);
		}

		Factory::getLog()->info('Creating new JPA part #' . $this->currentPartNumber . ', file ' . $this->_dataFileName);
		$statistics = Factory::getStatistics();
		$statistics->updateMultipart($this->totalParts);

		// Try to remove any existing file
		@unlink($this->_dataFileName);

		// Touch the new file
		$result = @touch($this->_dataFileName);

		chmod($this->_dataFileName, $this->getPermissions());

		// Try to write 6 bytes to it
		if ($result)
		{
			$result = @file_put_contents($this->_dataFileName, 'AKEEBA') == 6;
		}

		if ($result)
		{
			@unlink($this->_dataFileName);

			$result = @touch($this->_dataFileName);
			@chmod($this->_dataFileName, $this->getPermissions());
		}

		return $result;
	}

	/**
	 * Is this a 64-bit version of PHP?
	 *
	 * @return  bool
	 *
	 * @since   9.6.1
	 * @see     https://www.php.net/manual/en/reserved.constants.php
	 */
	private function is64Bit(): bool
	{
		// 64-bit versions use 8 bytes for the Integer intrinsic type. We use >= for forward compatibility.
		return PHP_INT_SIZE >= 8;
	}
}
components/com_akeeba/BackupEngine/Filter/Regexskipdirs.php000060400000002337152453623440020124 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Filter;

defined('AKEEBAENGINE') || die();

/**
 * Subdirectories exclusion filter based on regular expressions
 */
class Regexskipdirs extends Base
{
	public function __construct()
	{
		$this->object  = 'dir';
		$this->subtype = 'children';
		$this->method  = 'regex';

		if (empty($this->filter_name))
		{
			$this->filter_name = strtolower(basename(__FILE__, '.php'));
		}

		parent::__construct();
	}
}
components/com_akeeba/BackupEngine/Filter/Stack/README.html000060400000004266152453623440017463 0ustar00<?xml version="1.0" encoding="UTF-8" ?>
<!--~
  ~ Akeeba Engine
  ~
  ~ @package   akeebaengine
  ~ @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
  ~
  ~ 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, version 3.
  ~
  ~ 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, see
  ~ <https://www.gnu.org/licenses/>.
  -->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title>AkeebaBackup :: Filter Stack</title>
</head>
<body>
<h1>What is this directory?</h1>

<p>In this directory, Akeeba Backup and Akeeba Solo store the optional filters (Optional Filters in the Configuration
    page). Unlike regular filters which are always loaded, optional filters are only loaded when the user chooses to
    enable them. Each filter consists of two files: <var>filtername</var>.ini and <var>filtername</var>.php. The former
    contains the filter-specific configuration options and the later contains the actual filter code.</p>

<p>
    If you want to create new optional filters, put them in here. Do note that the INI file must always contain a
    boolean key named core.filters.<var>filtername</var>.enabled which controls the loading of this particular filter.
</p>

<p>
    Optional filters are always named Akeeba\Engine\Filter\Stack\Stack<var>Filtername</var> so that the autoloader can
    find them. For the same reason their filename must be Stack<var>Filtername</var>.php   Please watch out for the
    letter case in the names, it's important.
</p>
</body>
</html>
components/com_akeeba/BackupEngine/Filter/Stack/StackDateconditional.php000060400000004131152453623440022427 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Filter\Stack;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;
use Akeeba\Engine\Filter\Base;

/**
 * Date conditional filter
 *
 * It will only backup files modified after a specific date and time
 */
class StackDateconditional extends Base
{
	public function __construct()
	{
		$this->object  = 'file';
		$this->subtype = 'all';
		$this->method  = 'api';

	}

	protected function is_excluded_by_api($test, $root)
	{
		static $from_datetime;

		$config = Factory::getConfiguration();

		if (is_null($from_datetime))
		{
			$user_setting  = $config->get('core.filters.dateconditional.start');
			$from_datetime = strtotime($user_setting);
		}

		// Get the filesystem path for $root
		$fsroot   = $config->get('volatile.filesystem.current_root', '');
		$ds       = ($fsroot == '') || ($fsroot == '/') ? '' : DIRECTORY_SEPARATOR;
		$filename = $fsroot . $ds . $test;

		// Get the timestamp of the file
		$timestamp = @filemtime($filename);

		// If we could not get this information, include the file in the archive
		if ($timestamp === false)
		{
			return false;
		}

		// Compare it with the user-defined minimum timestamp and exclude if it's older than that
		if ($timestamp <= $from_datetime)
		{
			return true;
		}

		// No match? Just include the file!
		return false;
	}

}
components/com_akeeba/BackupEngine/Filter/Stack/StackErrorlogs.php000060400000003022152453623440021302 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Filter\Stack;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Filter\Base;

/**
 * Files exclusion filter based on regular expressions
 */
class StackErrorlogs extends Base
{
	function __construct()
	{
		$this->object  = 'file';
		$this->subtype = 'all';
		$this->method  = 'api';

		if (empty($this->filter_name))
		{
			$this->filter_name = strtolower(basename(__FILE__, '.php'));
		}

		parent::__construct();
	}

	protected function is_excluded_by_api($test, $root)
	{
		// Is it an error log? Exclude the file.
		if (in_array(basename($test), [
			'php_error',
			'php_errorlog',
			'error_log',
			'error.log',
		]))
		{
			return true;
		}

		// No match? Just include the file!
		return false;
	}

}
components/com_akeeba/BackupEngine/Filter/Stack/StackHoststats.php000060400000002656152453623440021334 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Filter\Stack;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Filter\Base;

/**
 * Exclude folders and files belonging to the host web stat (ie Webalizer)
 */
class StackHoststats extends Base
{
	public function __construct()
	{
		$this->object  = 'dir';
		$this->subtype = 'all';
		$this->method  = 'api';

		if (empty($this->filter_name))
		{
			$this->filter_name = strtolower(basename(__FILE__, '.php'));
		}

		parent::__construct();
	}

	protected function is_excluded_by_api($test, $root)
	{
		if ($test == 'stats')
		{
			return true;
		}

		// No match? Just include the file!
		return false;
	}

}
components/com_akeeba/BackupEngine/Filter/Stack/dateconditional.json000060400000001222152453623440021661 0ustar00{
    "core.filters.dateconditional.enabled": {
        "default": "0",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_OPTIONALFILTERS_DATECONDITIONAL_ENABLED_TITLE",
        "description": "COM_AKEEBA_CONFIG_OPTIONALFILTERS_DATECONDITIONAL_ENABLED_DESCRIPTION",
        "bold": "1"
    },
    "core.filters.dateconditional.start": {
        "default": "1970-01-01 00:00 GMT",
        "type": "string",
        "title": "COM_AKEEBA_CONFIG_OPTIONALFILTERS_DATECONDITIONAL_START_TITLE",
        "description": "COM_AKEEBA_CONFIG_OPTIONALFILTERS_DATECONDITIONAL_START_DESCRIPTION",
        "showon": "core.filters.dateconditional.enabled:1"
    }
}components/com_akeeba/BackupEngine/Filter/Stack/hoststats.json000060400000000435152453623440020561 0ustar00{
    "core.filters.hoststats.enabled": {
        "default": "1",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_OPTIONALFILTERS_HOSTSTATS_ENABLED_TITLE",
        "description": "COM_AKEEBA_CONFIG_OPTIONALFILTERS_HOSTSTATS_ENABLED_DESCRIPTION",
        "bold": "1"
    }
}components/com_akeeba/BackupEngine/Filter/Stack/errorlogs.json000060400000000435152453623440020543 0ustar00{
    "core.filters.errorlogs.enabled": {
        "default": "1",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_OPTIONALFILTERS_ERRORLOGS_ENABLED_TITLE",
        "description": "COM_AKEEBA_CONFIG_OPTIONALFILTERS_ERRORLOGS_ENABLED_DESCRIPTION",
        "bold": "1"
    }
}components/com_akeeba/BackupEngine/Filter/Skipdirs.php000060400000002276152453623440017073 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Filter;

defined('AKEEBAENGINE') || die();

/**
 * Subdirectories exclusion filter
 */
class Skipdirs extends Base
{
	public function __construct()
	{
		$this->object  = 'dir';
		$this->subtype = 'children';
		$this->method  = 'direct';

		if (empty($this->filter_name))
		{
			$this->filter_name = strtolower(basename(__FILE__, '.php'));
		}

		parent::__construct();
	}
}
components/com_akeeba/BackupEngine/Filter/Regexdirectories.php000060400000002330152453623440020601 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Filter;

defined('AKEEBAENGINE') || die();

/**
 * Directory exclusion filter based on regular expressions
 */
class Regexdirectories extends Base
{
	public function __construct()
	{
		$this->object  = 'dir';
		$this->subtype = 'all';
		$this->method  = 'regex';

		if (empty($this->filter_name))
		{
			$this->filter_name = strtolower(basename(__FILE__, '.php'));
		}

		parent::__construct();
	}
}
components/com_akeeba/BackupEngine/Filter/Tables.php000060400000002274152453623440016513 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Filter;

defined('AKEEBAENGINE') || die();

/**
 * Database table exclusion filter
 */
class Tables extends Base
{
	public function __construct()
	{
		$this->object  = 'dbobject';
		$this->subtype = 'all';
		$this->method  = 'direct';

		if (empty($this->filter_name))
		{
			$this->filter_name = strtolower(basename(__FILE__, '.php'));
		}

		parent::__construct();
	}
}
components/com_akeeba/BackupEngine/Filter/Regexskipfiles.php000060400000002353152453623440020263 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Filter;

defined('AKEEBAENGINE') || die();

/**
 * Directory contents (files) exclusion filter based on regular expressions
 */
class Regexskipfiles extends Base
{
	public function __construct()
	{
		$this->object  = 'dir';
		$this->subtype = 'content';
		$this->method  = 'regex';

		if (empty($this->filter_name))
		{
			$this->filter_name = strtolower(basename(__FILE__, '.php'));
		}

		parent::__construct();
	}
}
components/com_akeeba/BackupEngine/Filter/Regextables.php000060400000002300152453623440017534 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Filter;

defined('AKEEBAENGINE') || die();

/**
 * Database table exclusion filter
 */
class Regextables extends Base
{
	public function __construct()
	{
		$this->object  = 'dbobject';
		$this->subtype = 'all';
		$this->method  = 'regex';

		if (empty($this->filter_name))
		{
			$this->filter_name = strtolower(basename(__FILE__, '.php'));
		}

		parent::__construct();
	}
}
components/com_akeeba/BackupEngine/Filter/Regextabledata.php000060400000002520152453623440020207 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Filter;

defined('AKEEBAENGINE') || die();

/**
 * Database table records exclusion filter
 *
 * This is simple stuff. If a table's on the list, it will backup just its structure, not
 * its contents. Fair and square...
 */
class Regextabledata extends Base
{
	public function __construct()
	{
		$this->object  = 'dbobject';
		$this->subtype = 'content';
		$this->method  = 'regex';

		if (empty($this->filter_name))
		{
			$this->filter_name = strtolower(basename(__FILE__, '.php'));
		}

		parent::__construct();
	}
}
components/com_akeeba/BackupEngine/Filter/Base.php000060400000037402152453623440016154 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Filter;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;
use Akeeba\Engine\Util\FileSystem;

abstract class Base
{
	/** @var string Filter's internal name; defaults to filename without .php extension */
	public $filter_name = '';

	/** @var string The filtering object: dir|file|dbobject|db */
	public $object = 'dir';

	/** @var string The filtering subtype (all|content|children|inclusion) */
	public $subtype = null;

	/** @var string The filtering method (direct|regex|api) */
	public $method = 'direct';

	/** @var bool Is the filter active? */
	public $enabled = true;

	/** @var array An array holding filter or regex strings per root, i.e. $filter_data[$root] = array() */
	protected $filter_data = null;

	/** @var FileSystem  Used by treatDirectory */
	protected $fsTools = null;

	/**
	 * Public constructor
	 */
	public function __construct()
	{
		// Set the filter name if it's missing (filename in lowercase, minus the .php extension)
		if (empty($this->filter_name))
		{
			$this->filter_name = strtolower(basename(__FILE__, '.php'));
		}
	}

	/**
	 * Extra SQL statements to append to the SQL dump file. Useful for extension
	 * filters which have to filter out specific database records. This method
	 * must be overridden in children classes.
	 *
	 * @param   string  $root  The database for which to get the extra SQL statements
	 *
	 * @return  array  Extra SQL statements
	 */
	public function getExtraSQL(string $root): array
	{
		return [];
	}

	public $canFilterDatabaseRowContent = false;

	public function filterDatabaseRowContent(string $root, string $tableAbstract, array &$row): void
	{
		// No operation
	}

	/**
	 * Returns filtering (exclusion) status of the $test object
	 *
	 * @param   string  $test     The string to check for filter status (e.g. filename, dir name, table name, etc)
	 * @param   string  $root     The exclusion root test belongs to
	 * @param   string  $object   What type of object is it? dir|file|dbobject
	 * @param   string  $subtype  Filter subtype (all|content|children)
	 *
	 * @return    bool    True if it excluded, false otherwise
	 */
	public function isFiltered($test, $root, $object, $subtype)
	{
		if (!$this->enabled)
		{
			return false;
		}

		//Factory::getLog()->log(LogLevel::DEBUG,"Filtering [$object:$subtype] $root // $test");

		// Inclusion filters do not qualify for exclusion
		if ($this->subtype == 'inclusion')
		{
			return false;
		}

		// The object and subtype must match
		if (($this->object != $object) || ($this->subtype != $subtype))
		{
			return false;
		}

		if (in_array($this->method, ['direct', 'regex']))
		{
			// -- Direct or regex based filters --

			// Get a local reference of the filter data, if necessary
			if (is_null($this->filter_data))
			{
				$filters           = Factory::getFilters();
				$this->filter_data = $filters->getFilterData($this->filter_name);
			}

			// Check if the root exists and if there's a filter for the $test
			if (!array_key_exists($root, $this->filter_data))
			{
				// Root not found
				return false;
			}
			else
			{
				// Root found, search in the array
				if ($this->method == 'direct')
				{
					// Direct filtering
					return in_array($test, $this->filter_data[$root]);
				}
				else
				{
					// Regex matching
					foreach ($this->filter_data[$root] as $regex)
					{
						if (substr($regex, 0, 1) == '!')
						{
							// Custom Akeeba Backup extension to PCRE notation. If you put a ! before the PCRE, it negates the result of the PCRE.
							if (!preg_match(substr($regex, 1), $test))
							{
								return true;
							}
						}
						else
						{
							// Normal PCRE
							if (preg_match($regex, $test))
							{
								return true;
							}
						}
					}

					// if we're here, no match exists
					return false;
				}
			}
		}
		else
		{
			// -- API-based filters --
			return $this->is_excluded_by_api($test, $root);
		}
	}

	/**
	 * Returns the inclusion filters defined by this class for the requested $object
	 *
	 * @param   string  $object  The object to get inclusions for (dir|db)
	 *
	 * @return    array    The inclusion filters
	 */
	public function &getInclusions($object)
	{
		$dummy = [];

		if (!$this->enabled)
		{
			return $dummy;
		}

		if (($this->subtype != 'inclusion') || ($this->object != $object))
		{
			return $dummy;
		}

		switch ($this->method)
		{
			case 'api':
				return $this->get_inclusions_by_api();
				break;

			case 'direct':
				// Get a local reference of the filter data, if necessary
				if (is_null($this->filter_data))
				{
					$filters           = Factory::getFilters();
					$this->filter_data = $filters->getFilterData($this->filter_name);
				}

				return $this->filter_data;
				break;

			default:
				// regex inclusion is not supported at the moment
				$dummy = [];

				return $dummy;
				break;
		}
	}

	/**
	 * Adds an exclusion filter, or add/replace an inclusion filter
	 *
	 * @param   string  $root  Filter's root
	 * @param   mixed   $test  Exclusion: the filter string. Inclusion: the root definition data
	 *
	 * @return bool True on success
	 */
	public function set($root, $test)
	{
		if (in_array($this->subtype, ['all', 'content', 'children']))
		{
			return $this->setExclusion($root, $test);
		}
		else
		{
			return $this->setInclusion($root, $test);
		}
	}

	/**
	 * Unsets a given filter
	 *
	 * @param   string  $root  Filter's root
	 * @param   string  $test  The filter to remove
	 *
	 * @return bool
	 */
	public function remove($root, $test = null)
	{
		if ($this->subtype == 'inclusion')
		{
			return $this->removeInclusion($root);
		}
		else
		{
			return $this->removeExclusion($root, $test);
		}
	}

	/**
	 * Completely removes all filters off a specific root
	 *
	 * @param   string  $root
	 *
	 * @return bool
	 */
	public function reset($root)
	{
		switch ($this->method)
		{
			default:
			case 'api':
				return false;
				break;

			case 'direct':
			case 'regex':
				// Get a local reference of the filter data, if necessary
				if (is_null($this->filter_data))
				{
					$filters           = Factory::getFilters();
					$this->filter_data = $filters->getFilterData($this->filter_name);
				}
				// Direct filters
				if (array_key_exists($root, $this->filter_data))
				{
					unset($this->filter_data[$root]);
				}
				else
				{
					// Root not found
					return false;
				}
				break;
		}

		$filters = Factory::getFilters();
		$filters->setFilterData($this->filter_name, $this->filter_data);

		return true;
	}

	/**
	 * Toggles a filter
	 *
	 * @param   string  $root        The filter root object
	 * @param   string  $test        The filter string to toggle
	 * @param   bool    $new_status  The new filter status after the operation (true: enabled, false: disabled)
	 *
	 * @return bool True on successful change, false if we failed to change it
	 */
	public function toggle($root, $test, &$new_status)
	{
		// Can't toggle inclusion filters!
		if ($this->subtype == 'inclusion')
		{
			return false;
		}

		$is_set     = $this->isFiltered($test, $root, $this->object, $this->subtype);
		$new_status = !$is_set;
		if ($is_set)
		{
			$status = $this->remove($root, $test);
		}
		else
		{
			$status = $this->set($root, $test);
		}
		if (!$status)
		{
			$new_status = $is_set;
		}

		return $status;
	}

	/**
	 * Does this class has any filters? If it doesn't, its methods are never called by
	 * Akeeba's engine to speed things up.
	 * @return bool
	 */
	public function hasFilters()
	{
		if (!$this->enabled)
		{
			return false;
		}

		switch ($this->method)
		{
			default:
			case 'api':
				// API filters always have data!
				return true;
				break;

			case 'direct':
			case 'regex':
				// Get a local reference of the filter data, if necessary
				if (is_null($this->filter_data))
				{
					$filters           = Factory::getFilters();
					$this->filter_data = $filters->getFilterData($this->filter_name);
				}

				return !empty($this->filter_data);
				break;
		}
	}

	/**
	 * Returns a list of filter strings for the given root. Used by MySQLDump engine.
	 *
	 * @param   string  $root
	 *
	 * @return array
	 */
	public function getFilters($root)
	{
		$dummy = [];

		if (!$this->enabled)
		{
			return $dummy;
		}

		switch ($this->method)
		{
			default:
			case 'api':
				// API filters never have a list
				return $dummy;
				break;

			case 'direct':
			case 'regex':
				// Get a local reference of the filter data, if necessary
				if (is_null($this->filter_data))
				{
					$filters           = Factory::getFilters();
					$this->filter_data = $filters->getFilterData($this->filter_name);
				}

				if (is_null($root))
				{
					// When NULL is passed as the root, we return all roots
					return $this->filter_data;
				}
				elseif (array_key_exists($root, $this->filter_data))
				{
					// The root exists, return its data
					return $this->filter_data[$root];
				}
				else
				{
					// The root doesn't exist, return an empty array
					return $dummy;
				}
				break;
		}
	}

	/**
	 * This method must be overriden by API-type exclusion filters.
	 *
	 * @param   string  $test  The object to test for exclusion
	 * @param   string  $root  The object's root
	 *
	 * @return    bool    Return true if it matches your filters
	 *
	 * @codeCoverageIgnore
	 */
	protected function is_excluded_by_api($test, $root)
	{
		return false;
	}

	/**
	 * This method must be overriden by API-type inclusion filters.
	 *
	 * @return    array    The inclusion filters
	 *
	 * @codeCoverageIgnore
	 */
	protected function &get_inclusions_by_api()
	{
		$dummy = [];

		return $dummy;
	}

	/**
	 * Remove the root prefix from an absolute path
	 *
	 * @param   string  $directory  The absolute path
	 *
	 * @return  string  The translated path, relative to the root directory of the backup job
	 */
	protected function treatDirectory($directory)
	{
		if (!is_object($this->fsTools))
		{
			$this->fsTools = Factory::getFilesystemTools();
		}

		// Get the site's root
		$configuration = Factory::getConfiguration();

		if ($configuration->get('akeeba.platform.override_root', 0))
		{
			$root = $configuration->get('akeeba.platform.newroot', '[SITEROOT]');
		}
		else
		{
			$root = '[SITEROOT]';
		}

		if (stristr($root, '['))
		{
			$root = $this->fsTools->translateStockDirs($root);
		}

		$site_root = $this->fsTools->TrimTrailingSlash($this->fsTools->TranslateWinPath($root));

		$directory = $this->fsTools->TrimTrailingSlash($this->fsTools->TranslateWinPath($directory));

		// Trim site root from beginning of directory
		if (substr($directory, 0, strlen($site_root)) == $site_root)
		{
			$directory = substr($directory, strlen($site_root));

			if (substr($directory, 0, 1) == '/')
			{
				$directory = substr($directory, 1);
			}
		}

		return $directory;
	}

	/**
	 * Sets a filter, for direct and regex exclusion filter types
	 *
	 * @param   string  $root  The filter root object
	 * @param   string  $test  The filter string to set
	 *
	 * @return    bool    True on success
	 *
	 * @codeCoverageIgnore
	 */
	private function setExclusion($root, $test)
	{
		switch ($this->method)
		{
			default:
			case 'api':
				// we can't set new filter elements for API-type filters
				return false;
				break;

			case 'direct':
			case 'regex':
				// Get a local reference of the filter data, if necessary
				if (is_null($this->filter_data))
				{
					$filters           = Factory::getFilters();
					$this->filter_data = $filters->getFilterData($this->filter_name);
				}

				// Direct filters
				if (array_key_exists($root, $this->filter_data))
				{
					if (!in_array($test, $this->filter_data[$root]))
					{
						$this->filter_data[$root][] = $test;
					}
					else
					{
						return false;
					}
				}
				else
				{
					$this->filter_data[$root] = [$test];
				}
				break;
		}

		$filters = Factory::getFilters();
		$filters->setFilterData($this->filter_name, $this->filter_data);

		return true;
	}

	/**
	 * Sets a filter, for direct inclusion filter types
	 *
	 * @param   string  $root  The inclusion filter key (root)
	 * @param   string  $test  The inclusion filter raw data
	 *
	 * @return    bool    True on success
	 *
	 * @codeCoverageIgnore
	 */
	private function setInclusion($root, $test)
	{
		switch ($this->method)
		{
			default:
			case 'api':
			case 'regex':
				// we can't set new filter elements for API or regex type filters
				return false;
				break;

			case 'direct':
				// Get a local reference of the filter data, if necessary
				if (is_null($this->filter_data))
				{
					$filters           = Factory::getFilters();
					$this->filter_data = $filters->getFilterData($this->filter_name);
				}

				$this->filter_data[$root] = $test;
				break;
		}

		$filters = Factory::getFilters();
		$filters->setFilterData($this->filter_name, $this->filter_data);

		return true;
	}

	/**
	 * Remove a key from direct and regex filters
	 *
	 * @param   string  $root  The filter root object
	 * @param   string  $test  The filter string to set
	 *
	 * @return    bool    True on success
	 *
	 * @codeCoverageIgnore
	 */
	private function removeExclusion($root, $test)
	{
		switch ($this->method)
		{
			default:
			case 'api':
				// we can't remove filter elements from API-type filters
				return false;
				break;

			case 'direct':
			case 'regex':
				// Get a local reference of the filter data, if necessary
				if (is_null($this->filter_data))
				{
					$filters           = Factory::getFilters();
					$this->filter_data = $filters->getFilterData($this->filter_name);
				}

				// Direct filters
				if (array_key_exists($root, $this->filter_data))
				{
					if (in_array($test, $this->filter_data[$root]))
					{
						if (count($this->filter_data[$root]) == 1)
						{
							// If it's the only element, remove the entire root key
							unset($this->filter_data[$root]);
						}
						else
						{
							// If there are more elements, remove just the $test value
							$key = array_search($test, $this->filter_data[$root]);
							unset($this->filter_data[$root][$key]);
						}
					}
					else
					{
						// Filter object not found
						return false;
					}
				}
				else
				{
					// Root not found
					return false;
				}
				break;
		}

		$filters = Factory::getFilters();
		$filters->setFilterData($this->filter_name, $this->filter_data);

		return true;
	}

	/**
	 * Remove an inclusion filter
	 *
	 * @param   string  $root  The root of the filter to remove
	 *
	 * @return bool
	 *
	 * @codeCoverageIgnore
	 */
	private function removeInclusion($root)
	{
		switch ($this->method)
		{
			default:
			case 'api':
			case 'regex':
				// we can't remove filter elements from API or regex type filters
				return false;
				break;

			case 'direct':
				// Get a local reference of the filter data, if necessary
				if (is_null($this->filter_data))
				{
					$filters           = Factory::getFilters();
					$this->filter_data = $filters->getFilterData($this->filter_name);
				}

				if (array_key_exists($root, $this->filter_data))
				{
					unset($this->filter_data[$root]);
				}
				else
				{
					// Root not found
					return false;
				}
				break;
		}

		$filters = Factory::getFilters();
		$filters->setFilterData($this->filter_name, $this->filter_data);

		return true;
	}
}
components/com_akeeba/BackupEngine/Filter/Multidb.php000060400000002300152453623440016667 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Filter;

defined('AKEEBAENGINE') || die();

/**
 * Multiple Database inclusion filter
 */
class Multidb extends Base
{
	public function __construct()
	{
		$this->object  = 'db';
		$this->subtype = 'inclusion';
		$this->method  = 'direct';

		if (empty($this->filter_name))
		{
			$this->filter_name = strtolower(basename(__FILE__, '.php'));
		}

		parent::__construct();
	}
}
components/com_akeeba/BackupEngine/Filter/Skipfiles.php000060400000002312152453623440017223 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Filter;

defined('AKEEBAENGINE') || die();

/**
 * Directory contents (files) exclusion filter
 */
class Skipfiles extends Base
{
	public function __construct()
	{
		$this->object  = 'dir';
		$this->subtype = 'content';
		$this->method  = 'direct';

		if (empty($this->filter_name))
		{
			$this->filter_name = strtolower(basename(__FILE__, '.php'));
		}

		parent::__construct();
	}
}
components/com_akeeba/BackupEngine/Filter/Tabledata.php000060400000002514152453623440017157 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Filter;

defined('AKEEBAENGINE') || die();

/**
 * Database table records exclusion filter
 *
 * This is simple stuff. If a table's on the list, it will backup just its structure, not
 * its contents. Fair and square...
 */
class Tabledata extends Base
{
	public function __construct()
	{
		$this->object  = 'dbobject';
		$this->subtype = 'content';
		$this->method  = 'direct';

		if (empty($this->filter_name))
		{
			$this->filter_name = strtolower(basename(__FILE__, '.php'));
		}

		parent::__construct();
	}
}
components/com_akeeba/BackupEngine/Filter/Directories.php000060400000002267152453623440017557 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Filter;

defined('AKEEBAENGINE') || die();

/**
 * Directory exclusion filter
 */
class Directories extends Base
{
	public function __construct()
	{
		$this->object  = 'dir';
		$this->subtype = 'all';
		$this->method  = 'direct';

		if (empty($this->filter_name))
		{
			$this->filter_name = strtolower(basename(__FILE__, '.php'));
		}

		parent::__construct();
	}
}
components/com_akeeba/BackupEngine/Filter/Regexfiles.php000060400000002317152453623440017374 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Filter;

defined('AKEEBAENGINE') || die();

/**
 * Files exclusion filter based on regular expressions
 */
class Regexfiles extends Base
{
	public function __construct()
	{
		$this->object  = 'file';
		$this->subtype = 'all';
		$this->method  = 'regex';

		if (empty($this->filter_name))
		{
			$this->filter_name = strtolower(basename(__FILE__, '.php'));
		}

		parent::__construct();
	}
}
components/com_akeeba/BackupEngine/Filter/Extradirs.php000060400000002303152453623440017237 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Filter;

defined('AKEEBAENGINE') || die();

/**
 * Extra Directories inclusion filter
 */
class Extradirs extends Base
{
	public function __construct()
	{
		$this->object  = 'dir';
		$this->subtype = 'inclusion';
		$this->method  = 'direct';

		if (empty($this->filter_name))
		{
			$this->filter_name = strtolower(basename(__FILE__, '.php'));
		}

		parent::__construct();
	}
}
components/com_akeeba/BackupEngine/Filter/Incremental.php000060400000007547152453623440017552 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Filter;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use DateTime;
use DateTimeZone;

/**
 * Incremental file filter
 *
 * It will only backup files which are newer than the last backup taken with this profile
 */
class Incremental extends Base
{

	public function __construct()
	{
		$this->object  = 'file';
		$this->subtype = 'all';
		$this->method  = 'api';
	}

	protected function is_excluded_by_api($test, $root)
	{
		static $filter_switch = null;
		static $last_backup = null;

		if (is_null($filter_switch))
		{
			$config        = Factory::getConfiguration();
			$filter_switch = Factory::getEngineParamsProvider()->getScriptingParameter('filter.incremental', 0);
			$filter_switch = ($filter_switch == 1);

			$last_backup = $config->get('volatile.filter.last_backup', null);

			if (is_null($last_backup) && $filter_switch)
			{
				// Get a list of backups on this profile
				$backups = Platform::getInstance()->get_statistics_list([
					'filters' => [
						[
							'field' => 'profile_id',
							'value' => Platform::getInstance()->get_active_profile(),
						],
					],
				]);

				// Find this backup's ID
				$model = Factory::getStatistics();
				$id    = $model->getId();

				if (is_null($id))
				{
					$id = -1;
				}

				// Initialise
				$last_backup = time();
				$now         = $last_backup;

				// Find the last time a successful backup with this profile was made
				if (count($backups))
				{
					foreach ($backups as $backup)
					{
						// Skip the current backup
						if ($backup['id'] == $id)
						{
							continue;
						}

						// Skip non-complete backups
						if ($backup['status'] != 'complete')
						{
							continue;
						}

						$tzUTC      = new DateTimeZone('UTC');
						$dateTime   = new DateTime($backup['backupstart'], $tzUTC);
						$backuptime = $dateTime->getTimestamp();

						$last_backup = $backuptime;
						break;
					}
				}

				if ($last_backup == $now)
				{
					// No suitable backup found; disable this filter
					$config->set('volatile.scripting.incfile.filter.incremental', 0);
					$filter_switch = false;
				}
				else
				{
					// Cache the last backup timestamp
					$config->set('volatile.filter.last_backup', $last_backup);
				}
			}
		}

		if (!$filter_switch)
		{
			return false;
		}

		// Get the filesystem path for $root
		$config   = Factory::getConfiguration();
		$fsroot   = $config->get('volatile.filesystem.current_root', '');
		$ds       = ($fsroot == '') || ($fsroot == '/') ? '' : DIRECTORY_SEPARATOR;
		$filename = $fsroot . $ds . $test;

		// Get the timestamp of the file
		$timestamp = @filemtime($filename);

		// If we could not get this information, include the file in the archive
		if ($timestamp === false)
		{
			return false;
		}

		// Compare it with the last backup timestamp and exclude if it's older than the last backup
		if ($timestamp <= $last_backup)
		{
			//Factory::getLog()->debug("Excluding $filename due to incremental backup restrictions");
			return true;
		}

		// No match? Just include the file!
		return false;
	}

}
components/com_akeeba/BackupEngine/Filter/Tablesalwaysskipped.php000060400000003436152453623440021315 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

/**
 * @package     Akeeba\Engine\Filter
 * @subpackage
 *
 * @copyright   A copyright
 * @license     A "Slug" license name e.g. GPL2
 */

namespace Akeeba\Engine\Filter;

defined('AKEEBAENGINE') || die();

class Tablesalwaysskipped extends Base
{
	public function __construct()
	{
		$this->object  = 'dbobject';
		$this->subtype = 'content';
		$this->method  = 'api';

		parent::__construct();
	}

	/**
	 * This method must be overridden by API-type exclusion filters.
	 *
	 * @param   string  $test  The object to test for exclusion
	 * @param   string  $root  The object's root
	 *
	 * @return  bool  Return true if it matches your filters
	 */
	protected function is_excluded_by_api($test, $root)
	{
		static $alwaysExcludeTables = [
			// Tables from the service connector that shall not be named
			'bf_core_hashes',
			'bf_files',
			'bf_files_last',
			'bf_folders',
			'bf_folders_to_scan',
		];

		// Is it one of the always excluded tables?
		return in_array($test, $alwaysExcludeTables);
	}

}components/com_akeeba/BackupEngine/Filter/Files.php000060400000002256152453623440016343 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Filter;

defined('AKEEBAENGINE') || die();

/**
 * Files exclusion filter
 */
class Files extends Base
{
	public function __construct()
	{
		$this->object  = 'file';
		$this->subtype = 'all';
		$this->method  = 'direct';

		if (empty($this->filter_name))
		{
			$this->filter_name = strtolower(basename(__FILE__, '.php'));
		}

		parent::__construct();
	}
}
components/com_akeeba/BackupEngine/Dump/native.json000060400000005330152453623440016425 0ustar00{
    "_information": {
        "title": "COM_AKEEBA_CONFIG_ENGINE_DUMP_NATIVE_TITLE",
        "description": "COM_AKEEBA_CONFIG_ENGINE_DUMP_NATIVE_DESCRIPTION"
    },
    "engine.dump.divider.common": {
        "default": "0",
        "type": "separator",
        "title": "COM_AKEEBA_CONFIG_DUMP_DIVIDER_COMMON",
        "bold": "1"
    },
    "engine.dump.common.blankoutpass": {
        "default": "0",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_BLANKOUTPASS_TITLE",
        "description": "COM_AKEEBA_CONFIG_BLANKOUTPASS_DESCRIPTION"
    },
    "engine.dump.common.extended_inserts": {
        "default": "1",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_EXTENDEDINSERTS_TITLE",
        "description": "COM_AKEEBA_CONFIG_EXTENDEDINSERTS_DESCRIPTION"
    },
    "engine.dump.common.packet_size": {
        "default": "131072",
        "type": "integer",
        "min": "1",
        "max": "1048576",
        "shortcuts": "16384|32768|65536|131072|262144|524288|1048576",
        "scale": "1024",
        "uom": "KB",
        "title": "COM_AKEEBA_CONFIG_MAXPACKET_TITLE",
        "description": "COM_AKEEBA_CONFIG_MAXPACKET_DESCRIPTION"
    },
    "engine.dump.common.splitsize": {
        "default": "524288",
        "type": "integer",
        "min": "0",
        "max": "10485760",
        "shortcuts": "524288|1048576|2097152|5242880|10485760",
        "scale": "1048576",
        "uom": "MB",
        "title": "COM_AKEEBA_CONFIG_SPLITDBDUMP_TITLE",
        "description": "COM_AKEEBA_CONFIG_SPLITDBDUMP_DESCRIPTION"
    },
    "engine.dump.common.batchsize": {
        "default": "1000",
        "type": "integer",
        "min": "0",
        "max": "100000",
        "shortcuts": "10|20|50|100|200|500|1000",
        "scale": "1",
        "uom": "queries",
        "title": "COM_AKEEBA_CONFIG_BACTHSIZE_TITLE",
        "description": "COM_AKEEBA_CONFIG_BACTHSIZE_DESCRIPTION"
    },
    "engine.dump.divider.mysql": {
        "default": "0",
        "type": "separator",
        "title": "COM_AKEEBA_CONFIG_DUMP_DIVIDER_MYSQL",
        "bold": "1"
    },
    "engine.dump.native.advanced_entitites": {
        "default": "0",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_MYSQL5FEATURES_ENABLE_TITLE",
        "description": "COM_AKEEBA_CONFIG_MYSQL5FEATURES_ENABLE_DESCRIPTION"
    },
    "engine.dump.native.nodependencies": {
        "default": "0",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_NODEPENDENCIES_TITLE",
        "description": "COM_AKEEBA_CONFIG_NODEPENDENCIES_DESCRIPTION"
    },
    "engine.dump.native.nobtree": {
        "default": "1",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_MYSQLNOBTREE_TITLE",
        "description": "COM_AKEEBA_CONFIG_MYSQLNOBTREE_TIP"
    }
}components/com_akeeba/BackupEngine/Dump/Native.php000060400000012137152453623440016206 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Dump;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Base\Exceptions\ErrorException;
use Akeeba\Engine\Base\Part;
use Akeeba\Engine\Dump\Base as DumpBase;
use Akeeba\Engine\Factory;
use RuntimeException;

#[\AllowDynamicProperties]
class Native extends Part
{
	/** @var DumpBase */
	private $_engine = null;

	private $tablePrefix;

	/**
	 * Implements the constructor of the class
	 *
	 * @return  void
	 */
	public function __construct()
	{
		parent::__construct();

		Factory::getLog()->debug(__CLASS__ . " :: New instance");
	}

	/**
	 * Runs the preparation for this part. Should set _isPrepared
	 * to true
	 *
	 * @return  void
	 */
	protected function _prepare()
	{
		Factory::getLog()->debug(__CLASS__ . " :: Processing parameters");

		$options = null;

		// Get the DB connection parameters
		if (is_array($this->_parametersArray))
		{
			$driver   = $this->_parametersArray['driver'] ?? 'mysql';
			$prefix   = $this->_parametersArray['prefix'] ?? '';

			if (($driver == 'mysql') && !function_exists('mysql_connect'))
			{
				$driver = 'mysqli';
			}

			$options = [
				'driver'   => $driver,
				'host'     => $this->_parametersArray['host'] ?? '',
				'port'     => $this->_parametersArray['port'] ?? '',
				'user'     => $this->_parametersArray['user'] ?? ($this->_parametersArray['username'] ?? ''),
				'password' => $this->_parametersArray['password'] ?? '',
				'database' => $this->_parametersArray['database'] ?? '',
				'prefix'   => is_null($prefix) ? '' : $prefix,
			];

			$options['ssl'] = $this->_parametersArray['ssl'] ?? [];
			$options['ssl'] = is_array($options['ssl']) ? $options['ssl'] : [];

			$options['ssl']['enable']             = (bool) ($options['ssl']['enable'] ?? $this->_parametersArray['dbencryption'] ?? false);
			$options['ssl']['cipher']             = ($options['ssl']['cipher'] ?? $this->_parametersArray['dbsslcipher'] ?? null) ?: null;
			$options['ssl']['ca']                 = ($options['ssl']['ca'] ?? $this->_parametersArray['dbsslca'] ?? null) ?: null;
			$options['ssl']['capath']             = ($options['ssl']['capath'] ?? $this->_parametersArray['dbsslcapath'] ?? null) ?: null;
			$options['ssl']['key']                = ($options['ssl']['key'] ?? $this->_parametersArray['dbsslkey'] ?? null) ?: null;
			$options['ssl']['cert']               = ($options['ssl']['cert'] ?? $this->_parametersArray['dbsslcert'] ?? null) ?: null;
			$options['ssl']['verify_server_cert'] = (bool) (($options['ssl']['verify_server_cert'] ?? $this->_parametersArray['dbsslverifyservercert'] ?? false) ?: false);

		}

		$db         = Factory::getDatabase($options);

		if ($db->getErrorNum() > 0)
		{
			$error = $db->getErrorMsg();

			throw new RuntimeException(__CLASS__ . ' :: Database Error: ' . $error);
		}

		$driverType = $db->getDriverType();
		$className  = '\\Akeeba\\Engine\\Dump\\Native\\' . ucfirst($driverType);

		// Check if we have a native dump driver
		if (!class_exists($className, true))
		{
			$this->setState(self::STATE_ERROR);

			throw new ErrorException('Akeeba Engine does not have a native dump engine for ' . $driverType . ' databases');
		}

		Factory::getLog()->debug(__CLASS__ . " :: Instanciating new native database dump engine $className");

		$this->_engine = new $className;

		$this->_engine->setup($this->_parametersArray);

		$this->_engine->callStage('_prepare');
		$this->setState($this->_engine->getState());
		$this->tablePrefix = $this->_engine->getPrefix();
	}

	/**
	 * Runs the finalisation process for this part. Should set
	 * _isFinished to true.
	 *
	 * @return  void
	 */
	protected function _finalize()
	{
		$this->_engine->callStage('_finalize');
		$this->setState($this->_engine->getState());
	}

	/**
	 * Runs the main functionality loop for this part. Upon calling,
	 * should set the _isRunning to true. When it finished, should set
	 * the _hasRan to true. If an error is encountered, setError should
	 * be used.
	 *
	 * @return  void
	 */
	protected function _run()
	{
		$this->_engine->callStage('_run');
		$this->setState($this->_engine->getState());
		$this->setStep($this->_engine->getStep());
		$this->setSubstep($this->_engine->getSubstep());
		$this->partNumber = $this->_engine->partNumber;
	}

	/**
	 * Get the database table prefix
	 *
	 * @return string The database prefix
	 */
	public function getPrefix()
	{
		return $this->tablePrefix;
	}

}
components/com_akeeba/BackupEngine/Dump/Base.php000060400000107617152453623440015642 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Dump;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Base\Part;
use Akeeba\Engine\Core\Domain\Pack;
use Akeeba\Engine\Driver\Base as DriverBase;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use Akeeba\Engine\Util\FileCloseAware;
use Akeeba\Engine\Util\HashTrait;
use Exception;
use RuntimeException;

#[\AllowDynamicProperties]
abstract class Base extends Part
{
	use HashTrait;
	use FileCloseAware;

	// **********************************************************************
	// Configuration parameters
	// **********************************************************************

	/** @var int Current dump file part number */
	public $partNumber = 0;

	/** @var string Prefix to this database */
	protected $prefix = '';

	/** @var string MySQL database server host name or IP address */
	protected $host = '';

	/** @var string MySQL database server port (optional) */
	protected $port = '';

	/** @var string MySQL socket or named pipe (optional) */
	protected $socket = '';

	/** @var string MySQL user name, for authentication */
	protected $username = '';

	/** @var string MySQL password, for authentication */
	protected $password = '';

	/** @var string MySQL database */
	protected $database = '';

	/** @var string The database driver to use */
	protected $driver = '';

	/** @var array|null The MySQL SSL options */
	protected $ssl;

	// **********************************************************************
	// File handling fields
	// **********************************************************************
	/** @var boolean Should I post process quoted values */
	protected $postProcessValues = false;

	/** @var string Absolute path to dump file; must be writable (optional; if left blank it is automatically calculated) */
	protected $dumpFile = '';

	/** @var string Data cache, used to cache data before being written to disk */
	protected $data_cache = '';

	/** @var int */
	protected $largest_query = 0;

	/** @var int Size of the data cache, default 128Kb */
	protected $cache_size = 131072;

	/** @var bool Should I process empty prefixes when creating abstracted names? */
	protected $processEmptyPrefix = true;

	/** @var string Absolute path to the temp file */
	protected $tempFile = '';

	/** @var string Relative path of how the file should be saved in the archive */
	protected $saveAsName = '';

	/** @var array Contains the sorted (by dependencies) list of tables/views to backup */
	protected $tables = [];

	// **********************************************************************
	// Protected fields (data handling)
	// **********************************************************************
	/** @var array Contains the configuration data of the tables */
	protected $tables_data = [];

	/** @var array Maps database table names to their abstracted format */
	protected $table_name_map = [];

	/** @var array Contains the dependencies of tables and views (temporary) */
	protected $dependencies = [];

	/** @var string The next table to backup */
	protected $nextTable;

	/** @var integer The next row of the table to start backing up from */
	protected $nextRange;

	/** @var integer Current table's row count */
	protected $maxRange;

	/** @var bool Use extended INSERTs */
	protected $extendedInserts = false;

	/** @var integer Maximum packet size for extended INSERTs, in bytes */
	protected $packetSize = 0;

	/** @var string Extended INSERT query, while it's being constructed */
	protected $query = '';

	/** @var int Dump part's maximum size */
	protected $partSize = 0;

	/** @var resource Filepointer to the current dump part */
	private $fp = null;

	/**
	 * Should I be using an abstract prefix (#__) for table names?
	 *
	 * @var   bool
	 * @since 9.1.0
	 */
	private $useAbstractPrefix;

	/**
	 * Public constructor.
	 *
	 * @return  void
	 * @since   9.1.0
	 */
	public function __construct()
	{
		$this->useAbstractPrefix =
			Factory::getEngineParamsProvider()->getScriptingParameter('db.saveasname', 'normal') !== 'output';

		parent::__construct();
	}


	/**
	 * This method is called when the factory is being serialized and is used to perform necessary cleanup steps.
	 *
	 * @return  void
	 */
	public function _onSerialize()
	{
		$this->closeFile();
	}

	/**
	 * This method is called when the object is destroyed and is used to perform necessary cleanup steps.
	 */
	public function __destruct()
	{
		$this->closeFile();
	}

	/**
	 * Close any open SQL dump (output) file.
	 */
	public function closeFile()
	{
		if (!is_resource($this->fp))
		{
			return;
		}

		Factory::getLog()->debug("Closing SQL dump file.");

		$this->conditionalFileClose($this->fp);
		$this->fp = null;
	}

	/**
	 * Call a specific stage of the dump engine
	 *
	 * @param   string  $stage
	 *
	 * @throws Exception
	 */
	public function callStage($stage)
	{
		switch ($stage)
		{
			case '_prepare':
				$this->_prepare();
				break;

			case '_run':
				$this->_run();
				break;

			case '_finalize':
				$this->_finalize();
				break;
		}
	}

	public function getPrefix(): string
	{
		return $this->prefix ?: '';
	}

	/**
	 * Find where to store the backup files
	 *
	 * @param $partNumber int The SQL part number, default is 0 (.sql)
	 */
	protected function getBackupFilePaths($partNumber = 0)
	{
		Factory::getLog()->debug(__CLASS__ . " :: Getting temporary file");
		$basename       = substr(self::md5(microtime() . random_bytes(8)), random_int(0, 16), 16);
		$this->tempFile = Factory::getTempFiles()->registerTempFile($basename . '.sql');
		Factory::getLog()->debug(__CLASS__ . " :: Temporary file is {$this->tempFile}");

		// Get the base name of the dump file
		$partNumber = intval($partNumber);
		$baseName   = $this->dumpFile;

		if ($partNumber > 0)
		{
			// The file names are in the format dbname.sql, dbname.s01, dbname.s02, etc
			if (strtolower(substr($baseName, -4)) == '.sql')
			{
				$baseName = substr($baseName, 0, -4) . '.s' . sprintf('%02u', $partNumber);
			}
			else
			{
				$baseName = $baseName . '.s' . sprintf('%02u', $partNumber);
			}
		}

		if (empty($this->installerSettings))
		{
			// Fetch the installer settings
			$this->installerSettings = (object) [
				'installerroot' => 'installation',
				'sqlroot'       => 'installation/sql',
				'databasesini'  => 1,
				'readme'        => 1,
				'extrainfo'     => 1,
			];
			$config                  = Factory::getConfiguration();
			$installerKey            = $config->get('akeeba.advanced.embedded_installer');
			$installerDescriptors    = Factory::getEngineParamsProvider()->getInstallerList();

			if (array_key_exists($installerKey, $installerDescriptors))
			{
				// The selected installer exists, use it
				$this->installerSettings = (object) $installerDescriptors[$installerKey];
			}
			elseif (array_key_exists('angie', $installerDescriptors))
			{
				// The selected installer doesn't exist, but ANGIE exists; use that instead
				$this->installerSettings = (object) $installerDescriptors['angie'];
			}
		}

		switch (Factory::getEngineParamsProvider()->getScriptingParameter('db.saveasname', 'normal'))
		{
			case 'output':
				// The SQL file will be stored uncompressed in the output directory
				$statistics       = Factory::getStatistics();
				$statRecord       = $statistics->getRecord();
				$this->saveAsName = $statRecord['absolute_path'];
				break;

			case 'normal':
				// The SQL file will be stored in the SQL root of the archive, as
				// specified by the particular embedded installer's settings
				$this->saveAsName = $this->installerSettings->sqlroot . '/' . $baseName;
				break;

			case 'short':
				// The SQL file will be stored on archive's root
				$this->saveAsName = $baseName;
				break;
		}

		if ($partNumber > 0)
		{
			Factory::getLog()->debug("AkeebaDomainDBBackup :: Creating new SQL dump part #$partNumber");
		}

		Factory::getLog()->debug("AkeebaDomainDBBackup :: SQL temp file is " . $this->tempFile);
		Factory::getLog()->debug("AkeebaDomainDBBackup :: SQL file location in archive is " . $this->saveAsName);
	}

	/**
	 * Deletes any leftover files from previous backup attempts
	 *
	 */
	protected function removeOldFiles()
	{
		Factory::getLog()->debug("AkeebaDomainDBBackup :: Deleting leftover files, if any");

		if (file_exists($this->tempFile))
		{
			@unlink($this->tempFile);
		}
	}

	/**
	 * Populates the table arrays with the information for the db entities to back up
	 *
	 * @return  void
	 */
	abstract protected function getTablesToBackup(): void;

	/**
	 * Runs a step of the database dump
	 *
	 * @return  void
	 */
	abstract protected function stepDatabaseDump(): void;

	/**
	 * Return the current database name by querying the database connection object (e.g. SELECT DATABASE() in MySQL)
	 *
	 * @return  string
	 */
	abstract protected function getDatabaseNameFromConnection(): string;

	abstract protected function getAllTables(): array;

	/**
	 * Implements the _prepare abstract method
	 *
	 * @throws Exception
	 */
	protected function _prepare()
	{
		$this->setStep('Initialization');
		$this->setSubstep('');

		// Process parameters, passed to us using the setup() public method
		Factory::getLog()->debug(__CLASS__ . " :: Processing parameters");

		if (is_array($this->_parametersArray))
		{
			$this->parametersArrayToProperties();
		}

		// Try to detect and rectify the wrong database table naming prefix
		$this->workaroundWrongPrefix();

		// Make sure we have self-assigned the first part
		$this->partNumber = 0;

		// Get DB backup only mode
		$configuration = Factory::getConfiguration();

		// Find tables to be included and put them in the $_tables variable
		$this->getTablesToBackup();

		// Find where to store the database backup files
		$this->getBackupFilePaths($this->partNumber);

		// Remove any leftovers
		$this->removeOldFiles();

		// Initialize the extended INSERTs feature
		$this->extendedInserts = ($configuration->get('engine.dump.common.extended_inserts', 0) != 0);
		$this->packetSize      = (int) $configuration->get('engine.dump.common.packet_size', 0);

		if ($this->packetSize == 0)
		{
			$this->extendedInserts = false;
		}

		// Initialize the split dump feature
		$this->partSize = $configuration->get('engine.dump.common.splitsize', 1048576);
		if (Factory::getEngineParamsProvider()->getScriptingParameter('db.saveasname', 'normal') == 'output')
		{
			$this->partSize = 0;
		}
		if (($this->partSize != 0) && ($this->packetSize != 0) && ($this->packetSize > $this->partSize))
		{
			$this->packetSize = floor($this->partSize / 2);
		}

		// Initialize the algorithm
		Factory::getLog()->debug(__CLASS__ . " :: Initializing algorithm for first run");
		$this->nextTable = array_shift($this->tables);

		// If there is no table to back up we are done with the database backup
		if (empty($this->nextTable) && $this->nextTable !== '0')
		{
			$this->setState(self::STATE_POSTRUN);

			return;
		}

		$this->nextRange = 0;
		$this->query     = '';

		// FIX 2.2: First table of extra databases was not being written to disk.
		// This deserved a place in the Bug Fix Hall Of Fame. In subsequent calls to _init, the $fp in
		// _writeline() was not nullified. Therefore, the first dump chunk (that is, the first table's
		// definition and first chunk of its data) were not written to disk. This call causes $fp to be
		// nullified, causing it to be recreated, pointing to the correct file.
		$null = null;
		$this->writeline($null);

		// Finally, mark ourselves "prepared".
		$this->setState(self::STATE_PREPARED);
	}

	/**
	 * Implements the _run() abstract method
	 *
	 * @throws Exception
	 */
	protected function _run()
	{
		// Check if we are already done
		if ($this->getState() == self::STATE_POSTRUN)
		{
			Factory::getLog()->debug(__CLASS__ . " :: Already finished");
			$this->setStep("");
			$this->setSubstep("");

			return;
		}

		// Mark ourselves as still running (we will test if we actually do towards the end ;) )
		$this->setState(self::STATE_RUNNING);

		/**
		 * Resume packing / post-processing part files if necessary.
		 *
		 * @see \Akeeba\Engine\Archiver\BaseArchiver::putDataFromFileIntoArchive
		 *
		 * Sometimes the SQL part file may be bigger than the big file threshold (engine.archiver.common.
		 * big_file_threshold). In this case when we try to add it to the backup archive the archiver engine figures
		 * out it has to be added uncompressed, one chunk (engine.archiver.common.chunk_size) bytes at a time. This
		 * happens in a loop. We read a chunk, push it to the archive, rinse and repeat.
		 *
		 * There are two cases when we might break the loop:
		 *
		 * 1. Not enough free space in the backup archive part and engine.postproc.common.after_part (immediate post-
		 *    processing) is enabled. We break the step to let the backup part be post-processed.
		 *
		 * 2. We ran out of time copying data.
		 *
		 * The following if-blocks deal with these two cases.
		 */
		if (Factory::getEngineParamsProvider()->getScriptingParameter('db.saveasname', 'normal') != 'output')
		{
			$archiver      = Factory::getArchiverEngine();
			$configuration = Factory::getConfiguration();

			// Check whether we need to immediately post-processing a done part
			if (Pack::postProcessDonePartFile($archiver, $configuration))
			{
				return;
			}

			// We had already started putting the DB dump file into the archive but it needs more time
			if ($configuration->get('volatile.engine.archiver.processingfile', false))
			{
				/**
				 * We MUST NOT try to continue adding the file to the backup archive manually. Instead, we have to go
				 * through getNextDumpPart. This method will continue adding the part to the backup archive and when
				 * this is done it will remove the file and create a new one.
				 *
				 * If that method returns false it means that we either hit an error or the archiver didn't have enough
				 * time to add the part to the backup archive. In either case we have to return and let the Engine step.
				 */
				if ($this->getNextDumpPart() === false)
				{
					return;
				}
			}
		}

		$this->stepDatabaseDump();

		$null = null;
		$this->writeline($null);
	}

	/**
	 * Implements the _finalize() abstract method
	 *
	 * @throws Exception
	 */
	protected function _finalize()
	{
		Factory::getLog()->debug("Adding any extra SQL statements imposed by the filters");

		foreach (Factory::getFilters()->getExtraSQL($this->databaseRoot) as $sqlStatement)
		{
			$sqlStatement = trim($sqlStatement) . "\n";

			$this->writeDump($sqlStatement, true);
		}

		// We need this to write out the cached extra SQL statements before closing the file.
		$this->writeDump(null, true);

		// Close the file pointer (otherwise the SQL file is left behind)
		$this->closeFile();

		// If we are not just doing a main db only backup, add the SQL file to the archive
		$finished = true;

		if (Factory::getEngineParamsProvider()->getScriptingParameter('db.saveasname', 'normal') != 'output')
		{
			$archiver      = Factory::getArchiverEngine();
			$configuration = Factory::getConfiguration();

			if ($configuration->get('volatile.engine.archiver.processingfile', false))
			{
				// We had already started archiving the db file, but it needs more time
				Factory::getLog()->debug("Continuing adding the SQL dump to the archive");
				$archiver->addFile(null, null, null);

				$finished = !$configuration->get('volatile.engine.archiver.processingfile', false);
			}
			else
			{
				// We have to add the dump file to the archive
				Factory::getLog()->debug("Adding the final SQL dump to the archive");
				$archiver->addFileRenamed($this->tempFile, $this->saveAsName);

				$finished = !$configuration->get('volatile.engine.archiver.processingfile', false);
			}
		}
		else
		{
			// We just have to move the dump file to its final destination
			Factory::getLog()->debug("Moving the SQL dump to its final location");
			$result = Platform::getInstance()->move($this->tempFile, $this->saveAsName);

			if (!$result)
			{
				Factory::getLog()->debug("Removing temporary file of final SQL dump");
				Factory::getTempFiles()->unregisterAndDeleteTempFile($this->tempFile, true);

				throw new RuntimeException('Could not move the SQL dump to its final location');
			}
		}

		// Make sure that if the archiver needs more time to process the file we can supply it
		if ($finished)
		{
			Factory::getLog()->debug("Removing temporary file of final SQL dump");
			Factory::getTempFiles()->unregisterAndDeleteTempFile($this->tempFile, true);

			$this->setState(self::STATE_FINISHED);
		}
	}

	/**
	 * Creates a new dump part
	 *
	 * @return bool
	 * @throws Exception
	 */
	protected function getNextDumpPart()
	{
		// On database dump only mode we mustn't create part files!
		if (Factory::getEngineParamsProvider()->getScriptingParameter('db.saveasname', 'normal') == 'output')
		{
			return false;
		}

		// Is the archiver still processing?
		$configuration   = Factory::getConfiguration();
		$archiver        = Factory::getArchiverEngine();
		$stillProcessing = $configuration->get('volatile.engine.archiver.processingfile', false);

		if ($stillProcessing)
		{
			/**
			 * The archiver is still adding the previous dump part. This means that we are called from the top few lines
			 * of the _run method. We must continue adding the previous dump part.
			 */
			Factory::getLog()->debug("Continuing adding the SQL dump part to the archive");
			$archiver->addFile('', '', '');
		}
		else
		{
			/**
			 * There is no other dump part being processed. Therefore the current SQL dump part is still open. We must
			 * close it and ask the archiver to add it to the backup archive.
			 */
			$this->closeFile();
			Factory::getLog()->debug("Adding the SQL dump part to the archive");
			$archiver->addFileRenamed($this->tempFile, $this->saveAsName);
		}

		// Return false if the file didn't finish getting added to the archive
		if ($configuration->get('volatile.engine.archiver.processingfile', false))
		{
			Factory::getLog()->debug("The SQL dump file has not been processed thoroughly by the archiver. Resuming in the next step.");

			return false;
		}

		/**
		 * If you are here the SQL dump part file is completely added to the backup archive. All we have to do now is
		 * remove it and create a new dump part file.
		 */
		// Remove the old file
		Factory::getLog()->debug("Removing dump part's temporary file");
		Factory::getTempFiles()->unregisterAndDeleteTempFile($this->tempFile, true);

		// Create the new dump part
		$this->partNumber++;
		$this->getBackupFilePaths($this->partNumber);
		$null = null;
		$this->writeline($null);

		return true;
	}

	/**
	 * Creates a new dump part, but only if required to do so
	 *
	 * @return bool
	 * @throws Exception
	 */
	protected function createNewPartIfRequired()
	{
		if ($this->partSize == 0)
		{
			return true;
		}

		$filesize = 0;

		if (@file_exists($this->tempFile))
		{
			$filesize = @filesize($this->tempFile);
		}

		$projectedSize = $filesize + strlen($this->query);

		if ($this->extendedInserts)
		{
			$projectedSize = $filesize + $this->packetSize;
		}

		if ($projectedSize > $this->partSize)
		{
			return $this->getNextDumpPart();
		}

		return true;
	}

	/**
	 * Returns a table's abstract name (replacing the prefix with the magic #__ string)
	 *
	 * @param   string  $tableName  The canonical name, e.g. 'jos_content'
	 *
	 * @return string The abstract name, e.g. '#__content'
	 */
	protected function getAbstract($tableName)
	{
		// Don't return abstract names for non-CMS tables
		if (is_null($this->prefix))
		{
			return $tableName;
		}

		switch ($this->prefix)
		{
			case '':
				if ($this->processEmptyPrefix)
				{
					// This is more of a hack; it assumes all tables are core CMS tables if the prefix is empty.
					return '#__' . $tableName;
				}

				// If $this->processEmptyPrefix (the process_empty_prefix config flag) is false, we don't
				// assume anything.
				return $tableName;

				break;

			default:
				// Normal behaviour for 99% of sites. Start by assuming the table has no prefix, therefore is non-core.
				$tableAbstract = $tableName;

				// If there's a prefix use the abstract name
				if (!empty($this->prefix) && (substr($tableName, 0, strlen($this->prefix)) == $this->prefix))
				{
					$tableAbstract = '#__' . substr($tableName, strlen($this->prefix));
				}

				return $tableAbstract;

				break;
		}
	}

	/**
	 * Writes the SQL dump into the output files. If it fails, it sets the error
	 *
	 * @param   string  $data       Data to write to the dump file. Pass NULL to force flushing to file.
	 * @param   bool    $addMarker  Should I prefix the data with a marker?
	 *
	 * @return  boolean  TRUE on successful write, FALSE otherwise
	 * @throws  Exception
	 */
	protected function writeDump($data, $addMarker = false)
	{
		if (!empty($data))
		{
			if ($addMarker && $this->useAbstractPrefix)
			{
				$this->data_cache .= '/**ABDB**/';
			}
			elseif (!$this->useAbstractPrefix)
			{
				// Replace #__ with the prefix when writing plain .sql files
				$db   = $this->getDB();
				$data = $db->replacePrefix($data) . "\n";
			}

			$this->data_cache .= $data;

			if (strlen($data) > $this->largest_query)
			{
				$this->largest_query = strlen($data);
				Factory::getConfiguration()->set('volatile.database.largest_query', $this->largest_query);
			}
		}

		if ((strlen($this->data_cache) >= $this->cache_size) || (is_null($data) && (!empty($this->data_cache))))
		{
			$this->data_cache = rtrim($this->data_cache, "\n");

			if ($this->useAbstractPrefix && $addMarker && substr($this->data_cache, -10) !== '/**ABDB**/')
			{
				$this->data_cache .= '/**ABDB**/';
			}

			$this->data_cache .= "\n";

			Factory::getLog()->debug("Writing " . strlen($this->data_cache) . " bytes to the dump file");
			$result = $this->writeline($this->data_cache);

			if (!$result)
			{
				$errorMessage = sprintf('Couldn\'t write to the SQL dump file %s; check the temporary directory permissions and make sure you have enough disk space available.', $this->tempFile);
				throw new RuntimeException($errorMessage);
			}

			$this->data_cache = '';
		}

		return true;
	}

	/**
	 * Saves the string in $fileData to the file $backupfile. Returns TRUE. If saving
	 * failed, return value is FALSE.
	 *
	 * @param   string  $fileData  Data to write. Set to null to close the file handle.
	 *
	 * @return boolean TRUE is saving to the file succeeded
	 * @throws Exception
	 */
	protected function writeline(&$fileData)
	{
		if (!is_resource($this->fp))
		{
			$this->fp = @fopen($this->tempFile, 'a');

			if ($this->fp === false)
			{
				throw new RuntimeException('Could not open ' . $this->tempFile . ' for append, in DB dump.');
			}
		}

		if (is_null($fileData))
		{
			$this->conditionalFileClose($this->fp);

			$this->fp = null;

			return true;
		}
		else
		{
			if ($this->fp)
			{
				$ret = fwrite($this->fp, $fileData);
				@clearstatcache();

				// Make sure that all data was written to disk
				return ($ret == strlen($fileData));
			}

			return false;
		}
	}

	/**
	 * Return an instance of DriverBase
	 *
	 * @return DriverBase|bool
	 *
	 * @throws Exception
	 */
	protected function &getDB()
	{
		$ssl     = $this->ssl ?? [];
		$ssl     = is_array($ssl) ? $ssl : [];
		$options = [
			'driver'   => $this->driver,
			'host'     => $this->host,
			'port'     => $this->port,
			'socket'   => $this->socket,
			'user'     => $this->username,
			'password' => $this->password,
			'database' => $this->database,
			'prefix'   => is_null($this->prefix) ? '' : $this->prefix,
			'ssl'      => $ssl,
		];

		$db = Factory::getDatabase($options);

		if ($db->getErrorNum() > 0)
		{
			$error = $db->getErrorMsg();

			throw new RuntimeException(__CLASS__ . ' :: Database Error: ' . $error);
		}

		return $db;
	}

	/**
	 * Returns the database name. If the name was not declared when the object was created we will go through the
	 * getDatabaseNameFromConnection method to populate it.
	 *
	 * @return  string
	 */
	protected function getDatabaseName()
	{
		if (empty($this->database) && $this->database !== '0')
		{
			$this->database = $this->getDatabaseNameFromConnection();
		}

		return $this->database;
	}

	/**
	 * Post process a quoted value before it's written to the database dump.
	 * So far it's only required for SQL Server which has a problem escaping
	 * newline characters...
	 *
	 * @param   string  $value  The quoted value to post-process
	 *
	 * @return  string
	 */
	protected function postProcessQuotedValue($value)
	{
		return $value;
	}

	/**
	 * Returns a preamble for the data dump portion of the SQL backup. This is
	 * used to output commands before the first INSERT INTO statement for a
	 * table when outputting a plain SQL file.
	 *
	 * Practical use: the SET IDENTITY_INSERT sometable ON required for SQL Server
	 *
	 * @param   string   $tableAbstract  Abstract name of the table, e.g. #__foobar
	 * @param   string   $tableName      Real name of the table, e.g. abc_foobar
	 * @param   integer  $maxRange       Row count on this table
	 *
	 * @return  string   The SQL commands you want to be written in the dump file
	 */
	protected function getDataDumpPreamble($tableAbstract, $tableName, $maxRange)
	{
		return '';
	}

	/**
	 * Returns an epilogue for the data dump portion of the SQL backup. This is
	 * used to output commands after the last INSERT INTO statement for a
	 * table when outputting a plain SQL file.
	 *
	 * Practical use: the SET IDENTITY_INSERT sometable OFF required for SQL Server
	 *
	 * @param   string   $tableAbstract  Abstract name of the table, e.g. #__foobar
	 * @param   string   $tableName      Real name of the table, e.g. abc_foobar
	 * @param   integer  $maxRange       Row count on this table
	 *
	 * @return  string   The SQL commands you want to be written in the dump file
	 */
	protected function getDataDumpEpilogue($tableAbstract, $tableName, $maxRange)
	{
		return '';
	}

	/**
	 * Return a list of field names for the INSERT INTO statements. This is only
	 * required for Microsoft SQL Server because without it the SET IDENTITY_INSERT
	 * has no effect.
	 *
	 * @param   array|string  $fieldNames  A list of field names in array format or '*' if it's all fields
	 *
	 * @return  string
	 * @throws Exception
	 */
	protected function getFieldListSQL($fieldNames)
	{
		// If we get a literal '*' we dumped all columns so we don't need to add column names in the INSERT.
		if ($fieldNames === '*')
		{
			return '';
		}

		return '(' . implode(', ', array_map([$this->getDB(), 'qn'], $fieldNames)) . ')';
	}

	/**
	 * Return a list of columns to use in the SELECT query for dumping table data.
	 *
	 * This is used to filter out all generated rows.
	 *
	 * @param   string  $tableAbstract
	 *
	 * @return  string|array  An array of table columns or the string literal '*' to quickly select all columns.
	 *
	 * @see  https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html
	 */
	protected function getSelectColumns($tableAbstract)
	{
		return '*';
	}

	/**
	 * Converts a human formatted size to integer representation of bytes,
	 * e.g. 1M to 1024768
	 *
	 * @param   string  $setting  The value in human readable format, e.g. "1M"
	 *
	 * @return  integer  The value in bytes
	 */
	protected function humanToIntegerBytes($setting)
	{
		$val  = trim($setting);
		$last = strtolower($val[strlen($val) - 1]);

		if (is_numeric($last))
		{
			return $setting;
		}

		switch ($last)
		{
			case 't':
				$val *= 1024;
			case 'g':
				$val *= 1024;
			case 'm':
				$val *= 1024;
			case 'k':
				$val *= 1024;
		}

		return (int) $val;
	}

	/**
	 * Get the PHP memory limit in bytes
	 *
	 * @return int|null  Memory limit in bytes or null if we can't figure it out.
	 */
	protected function getMemoryLimit()
	{
		if (!function_exists('ini_get'))
		{
			return null;
		}

		$memLimit = ini_get("memory_limit");

		if ((is_numeric($memLimit) && ($memLimit < 0)) || !is_numeric($memLimit))
		{
			$memLimit = 0; // 1.2a3 -- Rare case with memory_limit < 0, e.g. -1Mb!
		}

		$memLimit = $this->humanToIntegerBytes($memLimit);

		return $memLimit;
	}

	/**
	 * @return void
	 */
	private function parametersArrayToProperties(): void
	{
		$this->driver             = $this->_parametersArray['driver'] ?? $this->driver;
		$this->host               = $this->_parametersArray['host'] ?? $this->host;
		$this->port               = $this->_parametersArray['port'] ?? $this->port;
		$this->socket             = $this->_parametersArray['socket'] ?? $this->socket;
		$this->username           = $this->_parametersArray['username'] ?? $this->username;
		$this->username           = $this->_parametersArray['user'] ?? $this->username;
		$this->password           = $this->_parametersArray['password'] ?? $this->password;
		$this->database           = $this->_parametersArray['database'] ?? $this->database;
		$this->prefix             = $this->_parametersArray['prefix'] ?? $this->prefix;
		$this->dumpFile           = $this->_parametersArray['dumpFile'] ?? $this->dumpFile;
		$this->processEmptyPrefix = $this->_parametersArray['process_empty_prefix'] ?? $this->processEmptyPrefix;
		$this->ssl                = $this->_parametersArray['ssl'] ?? $this->ssl;
		$this->ssl                = is_array($this->ssl) ? $this->ssl : [];

		$this->ssl['enable']             = (bool) (($this->ssl['enable'] ?? $this->_parametersArray['dbencryption'] ?? false) ?: false);
		$this->ssl['cipher']             = ($this->ssl['cipher'] ?? $this->_parametersArray['dbsslcipher'] ?? null) ?: null;
		$this->ssl['ca']                 = ($this->ssl['ca'] ?? $this->_parametersArray['dbsslca'] ?? null) ?: null;
		$this->ssl['capath']             = ($this->ssl['capath'] ?? $this->_parametersArray['dbsslcapath'] ?? null) ?: null;
		$this->ssl['key']                = ($this->ssl['key'] ?? $this->_parametersArray['dbsslkey'] ?? null) ?: null;
		$this->ssl['cert']               = ($this->ssl['cert'] ?? $this->_parametersArray['dbsslcert'] ?? null) ?: null;
		$this->ssl['verify_server_cert'] = (bool) (($this->ssl['verify_server_cert'] ?? $this->_parametersArray['dbsslverifyservercert'] ?? false) ?: false);
	}

	private function workaroundWrongPrefix(): void
	{
		// Let's see what kind of prefix I have
		$allLowerCasePrefix = strtolower($this->prefix);
		$allUpperCasePrefix = strtoupper($this->prefix);
		$isUpperCasePrefix  = $this->prefix === $allUpperCasePrefix;
		$isLowerCasePrefix  = $this->prefix === $allLowerCasePrefix;
		$isMixedCasePrefix  = !$isUpperCasePrefix && !$isLowerCasePrefix;

		// Log a message
		if ($isUpperCasePrefix)
		{
			Factory::getLog()->info(
				sprintf(
					'You have an all uppercase database prefix (%s). This might cause backup and restoration issues. We are applying automatic mitigations.',
					$this->prefix
				)
			);
		}
		elseif (!$isLowerCasePrefix)
		{
			Factory::getLog()->info(
				sprintf(
					'You have a mixed-case database prefix (%s). This might cause backup and restoration issues. We are applying automatic mitigations.',
					$this->prefix
				)
			);
		}

		// Check if I have any tables with any form of the prefix
		$allTables = $this->getAllTables();

		$hasOriginalTables = array_reduce(
			$allTables,
			function (bool $carry, string $table): bool {
				return $carry || substr($table, 0, strlen($this->prefix)) === $this->prefix;
			},
			false
		);

		$hasLowercaseTables = array_reduce(
			$allTables,
			function (bool $carry, string $table) use ($allLowerCasePrefix): bool {
				return $carry || substr($table, 0, strlen($allLowerCasePrefix)) === $allLowerCasePrefix;
			},
			false
		);

		$hasUppercaseTables = array_reduce(
			$allTables,
			function (bool $carry, string $table) use ($allUpperCasePrefix): bool {
				return $carry || substr($table, 0, strlen($allUpperCasePrefix)) === $allUpperCasePrefix;
			},
			false
		);

		$hasWrongMixedCaseTables = array_reduce(
			$allTables,
			function (bool $carry, string $table) use ($allUpperCasePrefix, $allLowerCasePrefix): bool {
				if ($carry)
				{
					return $carry;
				}

				$prefix = substr($table, 0, strlen($allUpperCasePrefix));

				if ($prefix === $allUpperCasePrefix || $prefix === $allLowerCasePrefix || $prefix === $this->prefix)
				{
					return false;
				}

				return strtolower($prefix) === strtolower($this->prefix);
			},
			false
		);

		// Set up the warning message
		$warningMessage = sprintf(
			'You have database tables whose name starts with a form of the database prefix (%s) which has a different letter case. This WILL cause problems if you restore your site on Windows or macOS. We strongly recommend excluding all tables which do not start with the configured prefix, exactly as shown above (case-sensitive).',
			$this->prefix
		);

		/**
		 * We have tables returned with the original prefix (e.g. fOo_).
		 *
		 * We won't change the prefix, but we have to warn the user if there is a mix of prefixes in the installed
		 * tables.
		 *
		 * We warn when:
		 * - Any kind of prefix, there are tables with a mixed case prefix which doesn't match the configured one.
		 * - Lowercase prefix, there are uppercase tables
		 * - Uppercase prefix, there are lowercase tables
		 * - Mixed case prefix, there are upper- or lowercase tables
		 */
		if ($hasOriginalTables)
		{
			if (
				$hasWrongMixedCaseTables
				|| ($isLowerCasePrefix && $hasUppercaseTables)
				|| ($isUpperCasePrefix && $hasLowercaseTables)
				|| ($isMixedCasePrefix && ($hasLowercaseTables || $hasUppercaseTables))
			)
			{
				Factory::getLog()->warning($warningMessage);
			}

			return;
		}

		/**
		 * No tables with this prefix. Nothing for me to do.
		 *
		 * At this point we have checked if there are any tables with the mixed case prefix, the all lowercase prefix,
		 * and the uppercase prefix. None was found in any of these cases.
		 *
		 * I will not change the prefix to back up. However, if there are tables with the wrong mixed case format of the
		 * prefix I will have to issue a warning.
		 */
		if (!$hasLowercaseTables && !$hasUppercaseTables)
		{
			if ($hasWrongMixedCaseTables)
			{
				Factory::getLog()->warning($warningMessage);
			}

			return;
		}

		if (
			($isLowerCasePrefix && !$hasLowercaseTables && $hasUppercaseTables)
			|| ($isMixedCasePrefix && $hasUppercaseTables)
		)
		{
			Factory::getLog()->info(
				sprintf(
					'Auto-fixing the database prefix: you have configured the database table name prefix %s but we could not find any tables with this prefix. Instead, we found tables with the %s prefix; using that instead.',
					$this->prefix, $allUpperCasePrefix
				)
			);

			$this->_parametersArray['prefix'] = $allUpperCasePrefix;
			$this->prefix                     = $allUpperCasePrefix;
		}
		elseif (
			($isUpperCasePrefix && !$hasUppercaseTables && $hasLowercaseTables)
			|| ($isMixedCasePrefix && $hasLowercaseTables)
		)
		{
			Factory::getLog()->info(
				sprintf(
					'Auto-fixing the database prefix: you have configured the database table name prefix %s but we could not find any tables with this prefix. Instead, we found tables with the %s prefix; using that instead.',
					$this->prefix, $allLowerCasePrefix
				)
			);

			$this->_parametersArray['prefix'] = $allLowerCasePrefix;
			$this->prefix                     = $allLowerCasePrefix;
		}
		else
		{
			Factory::getLog()->warning(
				sprintf(
					'WRONG DATABASE PREFIX. You have configured the database table name prefix %s but we could not find any tables with this prefix, its lowercase (%s) or uppercase (%s) form. THIS WILL CAUSE RESTORATION PROBLEMS. Please rename your tables starting with different forms of the %1$s prefix so that they all start with its lowercase form (%2$s), then retake the backup.',
					$this->prefix, $allLowerCasePrefix, $allUpperCasePrefix
				)
			);

			return;
		}

		if ($hasLowercaseTables && $hasUppercaseTables)
		{
			Factory::getLog()->warning($warningMessage);
		}
	}
}
components/com_akeeba/BackupEngine/Dump/Native/Sqlite.php000060400000002521152453623440017443 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Dump\Native;

defined('AKEEBAENGINE') || die();

use RuntimeException;

/**
 * Dump class for the "None" database driver (ie no database used by the application)
 */
#[\AllowDynamicProperties]
class Sqlite extends None
{
	public function __construct()
	{
		parent::__construct();

		throw new RuntimeException("Please do not add SQLite databases, they are files. If they are under your site's root they are backed up automatically. Otherwise use the Off-site Directories Inclusion to include them in the backup.");
	}

}
components/com_akeeba/BackupEngine/Dump/Native/None.php000060400000003772152453623440017112 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Dump\Native;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Dump\Base;
use Akeeba\Engine\Factory;

/**
 * Dump class for the "None" database driver (ie no database used by the application)
 */
#[\AllowDynamicProperties]
class None extends Base
{
	public function __construct()
	{
		parent::__construct();
	}

	/** @inheritDoc */
	protected function getTablesToBackup(): void
	{
	}

	/** @inheritDoc */
	protected function stepDatabaseDump(): void
	{
		Factory::getLog()->info("Reminder: database definitions using the 'None' driver result in no data being backed up.");

		$this->setState(self::STATE_FINISHED);
	}

	/** @inheritDoc */
	protected function getDatabaseNameFromConnection(): string
	{
		return '';
	}

	/** @inheritDoc */
	protected function getAllTables(): array
	{
		return [];
	}

	protected function _run()
	{
		Factory::getLog()->info("Reminder: database definitions using the 'None' driver result in no data being backed up.");

		$this->setState(self::STATE_POSTRUN);
	}

	protected function _finalize()
	{
		Factory::getLog()->info("Reminder: database definitions using the 'None' driver result in no data being backed up.");

		$this->setState(self::STATE_FINISHED);
	}
}
components/com_akeeba/BackupEngine/Dump/Native/Mysql.php000060400000212076152453623440017317 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Dump\Native;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Driver\QueryException;
use Akeeba\Engine\Dump\Base;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use Exception;
use RuntimeException;

/**
 * A generic MySQL database dump class.
 * Now supports views; merge, in-memory, federated, blackhole, etc tables
 * Configuration parameters:
 * host            <string>    MySQL database server host name or IP address
 * port            <string>    MySQL database server port (optional)
 * username        <string>    MySQL user name, for authentication
 * password        <string>    MySQL password, for authentication
 * database        <string>    MySQL database
 * dumpFile        <string>    Absolute path to dump file; must be writable (optional; if left blank it is
 * automatically calculated)
 */
#[\AllowDynamicProperties]
class Mysql extends Base
{
	/**
	 * The primary key structure of the currently backed up table. The keys contained are:
	 * - table        The name of the table being backed up
	 * - field        The name of the primary key field
	 * - value        The last value of the PK field
	 *
	 * @var array
	 */
	protected $table_autoincrement = [
		'table' => null,
		'field' => null,
		'value' => null,
	];

	private $columnListColumnType = [];

	private $columnListSelectColumn = '*';

	private $lastTableColumnType = null;

	private $lastTableSelectColumn = null;

	/**
	 * Implements the constructor of the class
	 *
	 * @return  void
	 */
	public function __construct()
	{
		parent::__construct();

		Factory::getLog()->debug(__CLASS__ . " :: New instance");
	}

	/**
	 * Replaces the table names in the CREATE query with their abstract form. Optionally updates dependencies.
	 *
	 * @param   string  $tableName        The table name the CREATE query is for
	 * @param   string  $tableSql         The CREATE query itself
	 * @param   bool    $withDependecies  Should I update dependencies?
	 *
	 * @return  array [$dependencies, $modifiedSQLQuery] - Dependency information for the table (if $withDependencies)
	 *                and the new CREATE query with all table names replaced with abstract versions.
	 *
	 * @throws  Exception  When we cannot get the DB object
	 */
	public function replaceTableNamesWithAbstracts($tableName, $tableSql, $withDependecies = false)
	{
		// Initialization
		$dependencies = [];
		$tableNameMap = $this->table_name_map;
		$db           = $this->getDB();

		if (!array_key_exists($tableName, $tableNameMap))
		{
			$tableNameMap[$tableName] = $this->getAbstract($tableName);
		}

		foreach ($tableNameMap as $fullName => $abstractName)
		{
			$quotedFullName     = $db->quoteName($fullName);
			$quotedAbstractName = $db->quoteName($abstractName);
			$pos                = strpos($tableSql, $quotedFullName);
			$numReplacements    = 0;

			if ($pos !== false)
			{
				$numReplacements = 1;

				// Do the replacement
				$tableSql = str_replace($quotedFullName, $quotedAbstractName, $tableSql);
			}
			elseif (!is_numeric($fullName))
			{
				$offset                   = 0;
				$fullNameLength           = strlen($fullName);
				$quotedAbstractNameLength = strlen($quotedAbstractName);

				/**
				 * We need to detect the edges of table names. If they are enclosed in backticks it's pretty clear. If they are
				 * not, e.g. in the definitions of TRIGGERs, we need to base our detection on the valid characters for
				 * unquoted MySQL table names per https://dev.mysql.com/doc/refman/5.7/en/identifiers.html
				 */
				[$bareCharRegex, $regexFlags] = $this->getMySQLIdentifierCharacterRegEx();
				$fullCharRegex = "/$bareCharRegex/$regexFlags";

				while (true)
				{
					$pos = strpos($tableSql, $fullName, $offset);

					if ($pos === false)
					{
						break;
					}

					// Skip over table-name-like strings in strings enclosed by single quotes
					$quotePos = strpos($tableSql, "'", $offset);

					if ($quotePos !== false && $quotePos < $pos)
					{
						// The table-like token is inside a string. Find its end.
						while (true)
						{
							$nextPos = strpos($tableSql, "'", $quotePos + 1);

							if ($nextPos === false)
							{
								break;
							}

							$prevChar = $nextPos > 0 ? $tableSql[$nextPos - 1] : null;
							$nextChar = strlen($tableSql) > $nextPos + 1 ? $tableSql[$nextPos + 1] : null;

							// Catch quote escaped as \'
							if ($prevChar === '\\')
							{
								$quotePos = $nextPos;

								continue;
							}

							// Catch quote escaped as ''
							if ($nextChar === "'")
							{
								$quotePos = $nextPos + 1;

								continue;
							}

							$offset = $nextPos + 1;

							continue 2;
						}
					}

					// Skip over table-name-like strings in strings enclosed by double quotes
					$quotePos = strpos($tableSql, '"', $offset);

					if ($quotePos !== false && $quotePos < $pos)
					{
						// The table-like token is inside a string. Find its end.
						while (true)
						{
							$nextPos = strpos($tableSql, '"', $quotePos + 1);

							if ($nextPos === false)
							{
								break;
							}

							$prevChar = $nextPos > 0 ? $tableSql[$nextPos - 1] : null;
							$nextChar = strlen($tableSql) > $nextPos + 1 ? $tableSql[$nextPos + 1] : null;

							// Catch quote escaped as \"
							if ($prevChar === '\\')
							{
								$quotePos = $nextPos;

								continue;
							}

							// Catch quote escaped as ""
							if ($nextChar === '"')
							{
								$quotePos = $nextPos + 1;

								continue;
							}

							$offset = $nextPos + 1;

							continue 2;
						}
					}

					// Catch table-name-like substring inside another table's name
					$previousChar    = ($pos > 0) ? substr($tableSql, $pos - 1, 1) : '';
					$nextChar        = ($pos < (strlen($tableSql) - $fullNameLength)) ? substr($tableSql, $pos + $fullNameLength, 1) : '';
					$prevIsTableChar = $previousChar === '' ? false : preg_match($fullCharRegex, $previousChar);
					$nextIsTableChar = $nextChar === '' ? false : preg_match($fullCharRegex, $nextChar);

					if ($prevIsTableChar || $nextIsTableChar)
					{
						$offset = $pos + 1;

						continue;
					}

					$before = ($pos > 0) ? substr($tableSql, 0, $pos) : '';
					$after  = ($pos < (strlen($tableSql) - $fullNameLength)) ? substr($tableSql, $pos + $fullNameLength) : '';

					$numReplacements++;
					$tableSql = $before . $quotedAbstractName . $after;

					$offset = $pos + $quotedAbstractNameLength;
				}
			}

			if ($withDependecies && $numReplacements && ($fullName != $tableName))
			{
				// Add a reference hit
				$this->dependencies[$fullName][] = $tableName;
				// Add the dependency to this table's metadata
				$dependencies[] = $fullName;
			}
		}

		return [$dependencies, $tableSql];
	}

	/**
	 * Creates a drop query from a CREATE query
	 *
	 * @param   string  $query  The CREATE query to process
	 *
	 * @return  string  The DROP statement
	 */
	protected function createDrop($query)
	{
		$db = $this->getDB();

		// Initialize
		$dropQuery = '';

		// Parse CREATE TABLE commands
		if (substr($query, 0, 12) == 'CREATE TABLE')
		{
			// Try to get the table name
			$restOfQuery = trim(substr($query, 12, strlen($query) - 12)); // Rest of query, after CREATE TABLE

			// Is there a backtick?
			if (substr($restOfQuery, 0, 1) == '`')
			{
				// There is... Good, we'll just find the matching backtick
				$pos       = strpos($restOfQuery, '`', 1);
				$tableName = substr($restOfQuery, 1, $pos - 1);
			}
			else
			{
				// Nope, let's assume the table name ends in the next blank character
				$pos       = strpos($restOfQuery, ' ', 1);
				$tableName = substr($restOfQuery, 0, $pos);
			}

			unset($restOfQuery);

			// Try to drop the table anyway
			$dropQuery = 'DROP TABLE IF EXISTS ' . $db->nameQuote($tableName) . ';';
		}
		// Parse CREATE VIEW commands
		elseif ((substr($query, 0, 7) == 'CREATE ') && (strpos($query, ' VIEW ') !== false))
		{
			// Try to get the view name
			$view_pos    = strpos($query, ' VIEW ');
			$restOfQuery = trim(substr($query, $view_pos + 6)); // Rest of query, after VIEW string

			// Is there a backtick?
			if (substr($restOfQuery, 0, 1) == '`')
			{
				// There is... Good, we'll just find the matching backtick
				$pos       = strpos($restOfQuery, '`', 1);
				$tableName = substr($restOfQuery, 1, $pos - 1);
			}
			else
			{
				// Nope, let's assume the table name ends in the next blank character
				$pos       = strpos($restOfQuery, ' ', 1);
				$tableName = substr($restOfQuery, 0, $pos);
			}

			unset($restOfQuery);

			$dropQuery = 'DROP VIEW IF EXISTS ' . $db->nameQuote($tableName) . ';';
		}
		// CREATE PROCEDURE pre-processing
		elseif ((substr($query, 0, 7) == 'CREATE ') && (strpos($query, 'PROCEDURE ') !== false))
		{
			// Try to get the procedure name
			$entity_keyword = ' PROCEDURE ';
			$entity_pos     = strpos($query, $entity_keyword);
			$restOfQuery    = trim(substr($query, $entity_pos + strlen($entity_keyword))); // Rest of query, after entity key string

			// Is there a backtick?
			if (substr($restOfQuery, 0, 1) == '`')
			{
				// There is... Good, we'll just find the matching backtick
				$pos         = strpos($restOfQuery, '`', 1);
				$entity_name = substr($restOfQuery, 1, $pos - 1);
			}
			else
			{
				// Nope, let's assume the entity name ends in the next blank character
				$pos         = strpos($restOfQuery, ' ', 1);
				$entity_name = substr($restOfQuery, 0, $pos);
			}

			unset($restOfQuery);

			$dropQuery = 'DROP' . $entity_keyword . 'IF EXISTS `' . $entity_name . '`;';
		}
		// CREATE FUNCTION pre-processing
		elseif ((substr($query, 0, 7) == 'CREATE ') && (strpos($query, 'FUNCTION ') !== false))
		{
			// Try to get the procedure name
			$entity_keyword = ' FUNCTION ';
			$entity_pos     = strpos($query, $entity_keyword);
			$restOfQuery    = trim(substr($query, $entity_pos + strlen($entity_keyword))); // Rest of query, after entity key string

			// Is there a backtick?
			if (substr($restOfQuery, 0, 1) == '`')
			{
				// There is... Good, we'll just find the matching backtick
				$pos         = strpos($restOfQuery, '`', 1);
				$entity_name = substr($restOfQuery, 1, $pos - 1);
			}
			else
			{
				// Nope, let's assume the entity name ends in the next blank character
				$pos         = strpos($restOfQuery, ' ', 1);
				$entity_name = substr($restOfQuery, 0, $pos);
			}

			unset($restOfQuery);

			// Try to drop the entity anyway
			$dropQuery = 'DROP' . $entity_keyword . 'IF EXISTS `' . $entity_name . '`;';
		}
		// CREATE TRIGGER pre-processing
		elseif ((substr($query, 0, 7) == 'CREATE ') && (strpos($query, 'TRIGGER ') !== false))
		{
			// Try to get the procedure name
			$entity_keyword = ' TRIGGER ';
			$entity_pos     = strpos($query, $entity_keyword);
			$restOfQuery    = trim(substr($query, $entity_pos + strlen($entity_keyword))); // Rest of query, after entity key string

			// Is there a backtick?
			if (substr($restOfQuery, 0, 1) == '`')
			{
				// There is... Good, we'll just find the matching backtick
				$pos         = strpos($restOfQuery, '`', 1);
				$entity_name = substr($restOfQuery, 1, $pos - 1);
			}
			else
			{
				// Nope, let's assume the entity name ends in the next blank character
				$pos         = strpos($restOfQuery, ' ', 1);
				$entity_name = substr($restOfQuery, 0, $pos);
			}

			unset($restOfQuery);

			// Try to drop the entity anyway
			$dropQuery = 'DROP' . $entity_keyword . 'IF EXISTS `' . $entity_name . '`;';
		}

		return $dropQuery;
	}

	/**
	 * Applies the SQL compatibility setting
	 *
	 * @return  void
	 */
	protected function enforceSQLCompatibility()
	{
		$db = $this->getDB();

		// Try to enforce SQL_BIG_SELECTS option
		try
		{
			$db->setQuery('SET sql_big_selects=1');
			$db->query();
		}
		catch (Exception $e)
		{
			// Do nothing; some versions of MySQL don't allow you to use the BIG_SELECTS option.
		}

		$db->resetErrors();
	}

	/**
	 * Return a list of columns and their data types.
	 *
	 * @param   string  $tableAbstract
	 *
	 * @return  array  An array of table columns and their data types.
	 */
	protected function getColumnTypes($tableAbstract)
	{
		if ($this->lastTableColumnType == $tableAbstract)
		{
			return $this->columnListColumnType;
		}

		$this->lastTableColumnType = $tableAbstract;

		try
		{
			$db = $this->getDB();

			$db->setQuery('SHOW COLUMNS FROM ' . $db->qn($tableAbstract));

			$tableCols = $db->loadAssocList();
		}
		catch (Exception $e)
		{
			return $this->columnListColumnType;
		}

		foreach ($tableCols as $col)
		{
			$typeParts                                 = explode('(', $col['Type'], 2);
			$this->columnListColumnType[$col['Field']] = strtoupper($typeParts[0]);
		}

		return $this->columnListColumnType;
	}

// =============================================================================
// Dependency processing - the Twilight Zone starts here
// =============================================================================

	/**
	 * Return the current database name by querying the database connection object (e.g. SELECT DATABASE() in MySQL)
	 *
	 * @return  string
	 */
	protected function getDatabaseNameFromConnection(): string
	{
		$db = $this->getDB();

		try
		{
			$ret = $db->setQuery('SELECT DATABASE()')->loadResult();
		}
		catch (Exception $e)
		{
			return '';
		}

		return empty($ret) ? '' : $ret;
	}

	/**
	 * Get the default database dump batch size from the configuration
	 *
	 * @return  int
	 */
	protected function getDefaultBatchSize()
	{
		static $batchSize = null;

		if (is_null($batchSize))
		{
			$configuration = Factory::getConfiguration();
			$batchSize     = intval($configuration->get('engine.dump.common.batchsize', 1000));

			if ($batchSize <= 0)
			{
				$batchSize = 1000;
			}
		}

		return $batchSize;
	}

	/**
	 * Get a regular expression and its options for valid characters of an unquoted MySQL identifier.
	 *
	 * This is used wherever we need to detect an arbitrary, unquoted MySQL identifier per
	 * https://dev.mysql.com/doc/refman/5.7/en/identifiers.html
	 *
	 * Also what if Unicode support is not compiled in PCRE? In this case we will fall back to a much simpler regex
	 * which only supports the ASCII subset of the allowed characters. In this case your database dump will be wrong
	 * if you use table names with non-ASCII characters.
	 *
	 * Since the detection is horribly slow we cache its results in an internal static variable.
	 *
	 * @return  array  In the format [$regex, $flags]
	 * @since   7.0.0
	 */
	protected function getMySQLIdentifierCharacterRegEx()
	{
		static $validCharRegEx = null;
		static $unicodeFlag = null;

		if (is_null($validCharRegEx) || is_null($unicodeFlag))
		{
			$noUnicode      = @preg_match('/\p{L}/u', 'σ') !== 1;
			$unicodeFlag    = $noUnicode ? '' : 'u';
			$validCharRegEx = $noUnicode ? '[0-9a-zA-Z$_]' : '[0-9a-zA-Z$_]|[\x{0080}-\x{FFFF}]';
		}

		return [$validCharRegEx, $unicodeFlag];
	}

	/**
	 * Get the optimal row batch size for a given table based on the available memory
	 *
	 * @param   string  $tableAbstract     The abstract table name, e.g. #__foobar
	 * @param   int     $defaultBatchSize  The default row batch size in the application configuration
	 *
	 * @return  int
	 */
	protected function getOptimalBatchSize($tableAbstract, $defaultBatchSize)
	{
		$db = $this->getDB();

		try
		{
			$info = $db->setQuery('SHOW TABLE STATUS LIKE ' . $db->q($tableAbstract))->loadAssoc();
		}
		catch (Exception $e)
		{
			return $defaultBatchSize;
		}

		if (!isset($info['Avg_row_length']) || empty($info['Avg_row_length']))
		{
			return $defaultBatchSize;
		}

		// That's the average row size as reported by MySQL.
		$avgRow = str_replace([',', '.'], ['', ''], $info['Avg_row_length']);
		// The memory available for manipulating data is less than the free memory
		$memoryLimit = $this->getMemoryLimit();
		$memoryLimit = empty($memoryLimit) ? 33554432 : $memoryLimit;
		$usedMemory  = memory_get_usage();
		$memoryLeft  = 0.75 * ($memoryLimit - $usedMemory);
		// The 3.25 factor is empirical and leans on the safe side.
		$maxRows = (int) ($memoryLeft / (3.25 * $avgRow));

		return max(1, min($maxRows, $defaultBatchSize));
	}

	/**
	 * Gets the row count for table $tableAbstract. Also updates the $this->maxRange variable.
	 *
	 * @param   string  $tableAbstract  The abstract name of the table (works with canonical names too, though)
	 *
	 * @return  void
	 *
	 * @throws  QueryException
	 */
	protected function getRowCount($tableAbstract)
	{
		$db = $this->getDB();

		$sql = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
			->select('COUNT(*)')
			->from($db->nameQuote($tableAbstract));

		$errno = 0;
		$error = '';

		try
		{
			$db->setQuery($sql);
			$this->maxRange = $db->loadResult();

			if (is_null($this->maxRange))
			{
				$errno = $db->getErrorNum();
				$error = $db->getErrorMsg(false);
			}
		}
		catch (Exception $e)
		{
			$this->maxRange = null;
			$errno          = $e->getCode();
			$error          = $e->getMessage();
		}

		if (is_null($this->maxRange))
		{
			Factory::getLog()->warning("Cannot get number of rows of $tableAbstract. MySQL error $errno: $error");

			return;
		}

		Factory::getLog()->debug("Rows on " . $tableAbstract . " : " . $this->maxRange);
	}

	/**
	 * Return a list of columns to use in the SELECT query for dumping table data.
	 *
	 * This is used to filter out all generated rows.
	 *
	 * @param   string  $tableAbstract
	 *
	 * @return  string|array  An array of table columns or the string literal '*' to quickly select all columns.
	 *
	 * @see  https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html
	 */
	protected function getSelectColumns($tableAbstract)
	{
		if ($this->lastTableSelectColumn == $tableAbstract)
		{
			return $this->columnListSelectColumn;
		}

		$this->lastTableSelectColumn = $tableAbstract;

		try
		{
			$db = $this->getDB();

			$db->setQuery('SHOW COLUMNS FROM ' . $db->qn($tableAbstract));

			$tableCols = $db->loadAssocList();
		}
		catch (Exception $e)
		{
			return $this->columnListSelectColumn;
		}

		$totalColumns                 = is_array($tableCols) || $tableCols instanceof \Countable ? count($tableCols) : 0;
		$this->columnListSelectColumn = [];

		$hasInvisibleColumns = false;

		foreach ($tableCols as $col)
		{
			// Skip over generated columns
			$attribs = array_map('strtoupper', empty($col['Extra']) ? [] : explode(' ', $col['Extra']));

			if (in_array('GENERATED', $attribs))
			{
				continue;
			}

			if (in_array('INVISIBLE', $attribs))
			{
				$hasInvisibleColumns = true;
			}

			$this->columnListSelectColumn[] = $col['Field'];
		}

		if (!$hasInvisibleColumns && ($totalColumns == count($this->columnListSelectColumn)))
		{
			$this->columnListSelectColumn = '*';
		}

		return $this->columnListSelectColumn;
	}

	/**
	 * Scans the database for tables to be backed up and sorts them according to
	 * their dependencies on one another. Updates $this->dependencies.
	 *
	 * @return  void
	 */
	protected function getTablesToBackup(): void
	{
		// Makes the MySQL connection compatible with our class
		$this->enforceSQLCompatibility();

		$configuration = Factory::getConfiguration();
		$notracking    = $configuration->get('engine.dump.native.nodependencies', 0);

		// First, get a map of table names <--> abstract names
		$this->get_tables_mapping();

		if ($notracking)
		{
			// Do not process table & view dependencies
			$this->get_tables_data_without_dependencies();
		}
		// Process table & view dependencies (default)
		else
		{
			// Find the type and CREATE command of each table/view in the database
			$this->get_tables_data();

			// Process dependencies and rearrange tables respecting them
			$this->process_dependencies();

			// Remove dependencies array
			$this->dependencies = [];
		}
	}

	/**
	 * Gets the CREATE TABLE command for a given table/view/procedure/function/trigger
	 *
	 * @param   string  $table_abstract  The abstracted name of the entity
	 * @param   string  $table_name      The name of the table
	 * @param   string  $type            The type of the entity to scan. If it's found to differ, the correct type is
	 *                                   returned.
	 * @param   array   $dependencies    The dependencies of this table
	 *
	 * @return  string|null  The CREATE command
	 */
	protected function get_create($table_abstract, $table_name, &$type, &$dependencies)
	{
		$configuration = Factory::getConfiguration();
		$notracking    = $configuration->get('engine.dump.native.nodependencies', 0);

		$db = $this->getDB();

		switch ($type)
		{
			case 'table':
			case 'merge':
			case 'view':
			default:
				$sql = "SHOW CREATE TABLE `$table_abstract`";
				break;

			case 'procedure':
				$sql = "SHOW CREATE PROCEDURE `$table_abstract`";
				break;

			case 'function':
				$sql = "SHOW CREATE FUNCTION `$table_abstract`";
				break;

			case 'trigger':
				$sql = "SHOW CREATE TRIGGER `$table_abstract`";
				break;
		}

		$db->setQuery($sql);

		try
		{
			$temp = $db->loadRowList();
		}
		catch (Exception $e)
		{
			// If the query failed we don't have the necessary SHOW privilege. Log the error and fake an empty reply.
			$entityType = ($type == 'merge') ? 'table' : $type;
			$msg        = $e->getMessage();
			Factory::getLog()->warning("Cannot get the structure of $entityType $table_abstract. Database returned error $msg running $sql  Please check your database privileges. Your database backup may be incomplete.");

			$db->resetErrors();

			$temp = [
				['', '', ''],
			];
		}

		if (in_array($type, ['procedure', 'function', 'trigger']))
		{
			$table_sql = $temp[0][2];

			if (empty($table_sql))
			{
				Factory::getLog()->warning("Cannot get the structure of $type $table_abstract. The database refused to return the CREATE command for this $type. Please check your database privileges. Your database backup may be incomplete.");

				return null;
			}

			// MySQL adds the database name into everything. We have to remove it.
			$dbName    = $db->qn($this->database) . '.`';
			$table_sql = str_replace($dbName, '`', $table_sql);

			// These can contain comment lines, starting with a double dash. Remove them.
			$table_sql = trim($table_sql);

			/**
			 * Remove the definer from the CREATE PROCEDURE/TRIGGER/FUNCTION. For example, MySQL returns this:
			 * CREATE DEFINER=`myuser`@`localhost` PROCEDURE `abc_myProcedure`() ...
			 * If you're restoring on a different machine the definer will probably be invalid, therefore we need to
			 * remove it from the (portable) output.
			 *
			 * Remember, $table_sql may be multiline. Therefore we need to process only the first line and append any
			 * further lines to the CREATE statement.
			 */
			$table_sql = trim($table_sql);
			$lines     = explode("\n", $table_sql);
			$firstLine = array_shift($lines);
			$pattern   = '/^CREATE(.*?) ' . strtoupper($type) . ' (.*)/i';
			$result    = preg_match($pattern, $firstLine, $matches);
			$table_sql = 'CREATE ' . strtoupper($type) . ' ' . $matches[2] . "\n" . implode("\n", $lines);
			$table_sql = trim($table_sql);
		}
		else
		{
			$table_sql = $temp[0][1];
		}
		unset($temp);

		// Smart table type detection
		if (in_array($type, ['table', 'merge', 'view']))
		{
			// Check for CREATE VIEW
			$pattern = '/^CREATE(.*?) VIEW (.*)/i';
			$result  = preg_match($pattern, $table_sql, $matches);

			if ($result === 1)
			{
				// This is a view.
				$type = 'view';

				/**
				 * Newer MySQL versions add the definer and other information in the CREATE VIEW output, e.g.
				 * CREATE ALGORITHM=UNDEFINED DEFINER=`muyser`@`localhost` SQL SECURITY DEFINER VIEW `abc_myview` AS ...
				 * We need to remove that to prevent restoration troubles.
				 */
				$table_sql = 'CREATE VIEW ' . $matches[2];
			}
			else
			{
				// This is a table.
				$type = 'table';

				// # Fix 3.2.1: USING BTREE / USING HASH in indices causes issues migrating from MySQL 5.1+ hosts to
				// MySQL 5.0 hosts
				if ($configuration->get('engine.dump.native.nobtree', 1))
				{
					$table_sql = str_replace(' USING BTREE', ' ', $table_sql);
					$table_sql = str_replace(' USING HASH', ' ', $table_sql);
				}

				// Translate TYPE= to ENGINE=
				$table_sql = str_replace('TYPE=', 'ENGINE=', $table_sql);

				/**
				 * Remove the TABLESPACE option.
				 *
				 * The format of the TABLESPACE table option is:
				 * TABLESPACE tablespace_name [STORAGE {DISK|MEMORY}]
				 * where tablespace_name can be a quoted or unquoted identifier.
				 */
				[$validCharRegEx, $unicodeFlag] = $this->getMySQLIdentifierCharacterRegEx();
				$tablespaceName = "((($validCharRegEx){1,})|(`.*`))";
				$suffix         = 'STORAGE\s{1,}(DISK|MEMORY)';
				$regex          = "#TABLESPACE\s{1,}$tablespaceName\s{0,}($suffix){0,1}#i" . $unicodeFlag;
				$table_sql      = preg_replace($regex, '', $table_sql);

				// Remove table options {DATA|INDEX} DIRECTORY
				$regex     = "#(DATA|INDEX)\s{1,}DIRECTORY\s*=?\s*'.*'#i";
				$table_sql = preg_replace($regex, '', $table_sql);

				// Remove table options ROW_FORMAT=whatever
				$regex     = "#ROW_FORMAT\s*=\s*[A-Z]{1,}#i";
				$table_sql = preg_replace($regex, '', $table_sql);

				// Remove MariaDB MyISAM option PAGE_CHECKSUM
				$regex     = "#PAGE_CHECKSUM\s*=\s*[\d]{1,}#i";
				$table_sql = preg_replace($regex, '', $table_sql);

				// Abstract the names of table constraints and indices
				$regex     = "#(CONSTRAINT|KEY|INDEX)\s{1,}`{$this->prefix}#i";
				$table_sql = preg_replace($regex, '$1 `#__', $table_sql);
			}

			// Is it a VIEW but we don't have SHOW VIEW privileges?
			if (empty($table_sql))
			{
				$type = 'view';
			}
		}

		/**
		 * Replace table name and names of referenced tables with their abstracted forms and populate dependency tables
		 * at the same time.
		 */
		// On DB only backup we don't want any replacing to take place, do we?
		if (!Factory::getEngineParamsProvider()->getScriptingParameter('db.abstractnames', 1))
		{
			$old_table_sql = $table_sql;
		}

		/**
		 * Replace the table names in the CREATE command with the abstract versions.
		 *
		 * Moreover, it updates the dependency tracking information.
		 *
		 * We have to quote the table name. If we don't we'll get wrong results. Imagine that you have a column whose
		 * name starts with the string literal of the table name itself.
		 *
		 * Example: table `poll`, column `poll_id` would become #__poll, #__poll_id
		 *
		 * By quoting before we make sure this won't happen.
		 */
		[$dependencies, $table_sql] = $this->replaceTableNamesWithAbstracts($table_name, $table_sql, !$notracking);

		// On DB only backup we don't want any replacing to take place, do we?
		if (!Factory::getEngineParamsProvider()->getScriptingParameter('db.abstractnames', 1))
		{
			$table_sql = $old_table_sql;
		}

		// Add final semicolon and newline character
		$table_sql .= ";\n";

		/**
		 * Views, procedures, functions and triggers may contain the database name followed by the table name, always
		 * quoted e.g. `db`.`table_name`  We need to replace all these instances with just the table name. The only
		 * reliable way to do that is to look for "`db`.`" and replace it with "`"
		 */
		if (in_array($type, ['view', 'procedure', 'function', 'trigger']))
		{
			$dbName      = $db->qn($this->getDatabaseName());
			$dummyQuote  = $db->qn('foo');
			$findWhat    = $dbName . '.' . substr($dummyQuote, 0, 1);
			$replaceWith = substr($dummyQuote, 0, 1);
			$table_sql   = str_replace($findWhat, $replaceWith, $table_sql);
		}

		// Post-process CREATE VIEW
		if ($type == 'view')
		{
			$pos_view = strpos($table_sql, ' VIEW ');

			if ($pos_view > 7)
			{
				// Only post process if there are view properties between the CREATE and VIEW keywords
				$propstring = substr($table_sql, 7, $pos_view - 7); // Properties string
				// Fetch the ALGORITHM={UNDEFINED | MERGE | TEMPTABLE} keyword
				$algostring = '';
				$algo_start = strpos($propstring, 'ALGORITHM=');

				if ($algo_start !== false)
				{
					$algo_end   = strpos($propstring, ' ', $algo_start);
					$algostring = substr($propstring, $algo_start, $algo_end - $algo_start + 1);
				}

				// Create our modified create statement
				$table_sql = 'CREATE OR REPLACE ' . $algostring . substr($table_sql, $pos_view);
			}
		}
		elseif ($type == 'procedure')
		{
			$pos_entity = stripos($table_sql, ' PROCEDURE ');

			if ($pos_entity !== false)
			{
				$table_sql = 'CREATE' . substr($table_sql, $pos_entity);
			}
		}
		elseif ($type == 'function')
		{
			$pos_entity = stripos($table_sql, ' FUNCTION ');

			if ($pos_entity !== false)
			{
				$table_sql = 'CREATE' . substr($table_sql, $pos_entity);
			}
		}
		elseif ($type == 'trigger')
		{
			$pos_entity = stripos($table_sql, ' TRIGGER ');

			if ($pos_entity !== false)
			{
				$table_sql = 'CREATE' . substr($table_sql, $pos_entity);
			}
		}

		return $table_sql;
	}

	/**
	 * Populates the _tables array with the metadata of each table and generates
	 * dependency information for views and merge tables. Updates $this->tables_data.
	 *
	 * @return  void
	 */
	protected function get_tables_data()
	{
		Factory::getLog()->debug(__CLASS__ . " :: Starting CREATE TABLE and dependency scanning");

		// Get a database connection
		$db = $this->getDB();

		Factory::getLog()->debug(__CLASS__ . " :: Got database connection");

		// Reset internal tables
		$this->tables_data  = [];
		$this->dependencies = [];

		// Get a list of tables where their engine type is shown
		$sql = 'SHOW TABLES';
		$db->setQuery($sql);
		$metadata_list = $db->loadRowList();

		Factory::getLog()->debug(__CLASS__ . " :: Got SHOW TABLES");

		// Get filters and filter root
		$registry = Factory::getConfiguration();
		$root     = $registry->get('volatile.database.root', '[SITEDB]');
		$filters  = Factory::getFilters();

		foreach ($metadata_list as $table_metadata)
		{
			// Skip over tables not included in the backup set
			if (!array_key_exists($table_metadata[0], $this->table_name_map))
			{
				continue;
			}

			// Basic information
			$table_name     = $table_metadata[0];
			$table_abstract = $this->table_name_map[$table_metadata[0]];
			$new_entry      = [
				'type'         => 'table',
				'dump_records' => true,
			];

			// Get the CREATE command
			$dependencies              = [];
			$new_entry['create']       = $this->get_create($table_abstract, $table_name, $new_entry['type'], $dependencies);

			if ($new_entry['create'] === null)
			{
				continue;
			}

			$new_entry['dependencies'] = $dependencies;

			if ($new_entry['type'] == 'view')
			{
				$new_entry['dump_records'] = false;
			}
			else
			{
				$new_entry['dump_records'] = true;
			}

			// Scan for the table engine.
			$engine = null; // So that we detect VIEWs correctly

			if ($new_entry['type'] == 'table')
			{
				$engine      = 'MyISAM'; // So that even with MySQL 4 hosts we don't screw this up
				$engine_keys = ['ENGINE=', 'TYPE='];

				foreach ($engine_keys as $engine_key)
				{
					$start_pos = strrpos($new_entry['create'], $engine_key);

					if ($start_pos !== false)
					{
						// Advance the start position just after the position of the ENGINE keyword
						$start_pos += strlen($engine_key);
						// Try to locate the space after the engine type
						$end_pos = stripos($new_entry['create'], ' ', $start_pos);

						if ($end_pos === false)
						{
							// Uh... maybe it ends with ENGINE=EngineType;
							$end_pos = stripos($new_entry['create'], ';', $start_pos);
						}

						if ($end_pos !== false)
						{
							// Grab the string
							$engine = substr($new_entry['create'], $start_pos, $end_pos - $start_pos);

							if (empty($engine))
							{
								Factory::getLog()->debug("*** DEBUG *** $table_name - engine $engine");
								Factory::getLog()->debug($new_entry['create']);
								Factory::getLog()->debug("start $start_pos - end $end_pos");
							}
						}
					}
				}

				$engine = strtoupper($engine);
			}

			switch ($engine)
			{
				/*
				// Views -- They are detected based on their CREATE statement
				case null:
					$new_entry['type'] = 'view';
					$new_entry['dump_records'] = false;
					break;
				*/

				// Merge tables
				case 'MRG_MYISAM':
					$new_entry['type']         = 'merge';
					$new_entry['dump_records'] = false;

					break;

				// Tables whose data we do not back up (memory, federated and can-have-no-data tables)
				case 'MEMORY':
				case 'EXAMPLE':
				case 'BLACKHOLE':
				case 'FEDERATED':
					$new_entry['dump_records'] = false;

					break;

				// Normal tables and VIEWs
				default:
					break;
			}

			// Table Data Filter - skip dumping table contents of filtered out tables
			if ($filters->isFiltered($table_abstract, $root, 'dbobject', 'content'))
			{
				$new_entry['dump_records'] = false;
			}

			$this->tables_data[$table_name] = $new_entry;
		}

		Factory::getLog()->debug(__CLASS__ . " :: Got table list");

		// If we have MySQL > 5.0 add stored procedures, stored functions and triggers
		$enable_entities = $registry->get('engine.dump.native.advanced_entitites', true);

		if ($enable_entities)
		{
			Factory::getLog()->debug(__CLASS__ . " :: Listing MySQL entities");
			// Get a list of procedures
			$sql = 'SHOW PROCEDURE STATUS WHERE `Db`=' . $db->quote($this->database);
			$db->setQuery($sql);

			try
			{
				$metadata_list = $db->loadRowList();
			}
			catch (Exception $e)
			{
				$metadata_list = null;
			}

			if (is_array($metadata_list))
			{
				if (count($metadata_list))
				{
					foreach ($metadata_list as $entity_metadata)
					{
						// Skip over entities not included in the backup set
						if (!array_key_exists($entity_metadata[1], $this->table_name_map))
						{
							continue;
						}

						// Basic information
						$entity_name     = $entity_metadata[1];
						$entity_abstract = $this->table_name_map[$entity_metadata[1]];
						$new_entry       = [
							'type'         => 'procedure',
							'dump_records' => false,
						];

						// There's no point trying to add a non-procedure entity
						if ($entity_metadata[2] != 'PROCEDURE')
						{
							continue;
						}

						$dependencies                    = [];
						$new_entry['create']             = $this->get_create($entity_abstract, $entity_name, $new_entry['type'], $dependencies);

						if ($new_entry['create'] === null)
						{
							continue;
						}

						$new_entry['dependencies']       = $dependencies;
						$this->tables_data[$entity_name] = $new_entry;
					}
				}
			} // foreach

			// Get a list of functions
			$sql = 'SHOW FUNCTION STATUS WHERE `Db`=' . $db->quote($this->database);
			$db->setQuery($sql);

			try
			{
				$metadata_list = $db->loadRowList();
			}
			catch (Exception $e)
			{
				$metadata_list = null;
			}

			if (is_array($metadata_list))
			{
				if (count($metadata_list))
				{
					foreach ($metadata_list as $entity_metadata)
					{
						// Skip over entities not included in the backup set
						if (!array_key_exists($entity_metadata[1], $this->table_name_map))
						{
							continue;
						}

						// Basic information
						$entity_name     = $entity_metadata[1];
						$entity_abstract = $this->table_name_map[$entity_metadata[1]];
						$new_entry       = [
							'type'         => 'function',
							'dump_records' => false,
						];

						// There's no point trying to add a non-function entity
						if ($entity_metadata[2] != 'FUNCTION')
						{
							continue;
						}

						$dependencies                    = [];
						$new_entry['create']             = $this->get_create($entity_abstract, $entity_name, $new_entry['type'], $dependencies);

						if ($new_entry['create'] === null)
						{
							continue;
						}

						$new_entry['dependencies']       = $dependencies;
						$this->tables_data[$entity_name] = $new_entry;
					}
				}
			} // foreach

			// Get a list of triggers
			$sql = 'SHOW TRIGGERS';
			$db->setQuery($sql);

			try
			{
				$metadata_list = $db->loadRowList();
			}
			catch (Exception $e)
			{
				$metadata_list = null;
			}

			if (is_array($metadata_list))
			{
				if (count($metadata_list))
				{
					foreach ($metadata_list as $entity_metadata)
					{
						// Skip over entities not included in the backup set
						if (!array_key_exists($entity_metadata[0], $this->table_name_map))
						{
							continue;
						}

						// Basic information
						$entity_name     = $entity_metadata[0];
						$entity_abstract = $this->table_name_map[$entity_metadata[0]];
						$new_entry       = [
							'type'         => 'trigger',
							'dump_records' => false,
						];

						$dependencies                    = [];
						$new_entry['create']             = $this->get_create($entity_abstract, $entity_name, $new_entry['type'], $dependencies);

						if ($new_entry['create'] === null)
						{
							continue;
						}

						$new_entry['dependencies']       = $dependencies;
						$this->tables_data[$entity_name] = $new_entry;
					}
				}
			} // foreach

			Factory::getLog()->debug(__CLASS__ . " :: Got MySQL entities list");
		}

		/**
		 * // Only store unique values
		 * if(count($dependencies) > 0)
		 * $dependencies = array_unique($dependencies);
		 * /**/
	}

	/**
	 * Populates the _tables array with the metadata of each table.
	 * Updates $this->tables_data and $this->tables.
	 *
	 * @return  void
	 */
	protected function get_tables_data_without_dependencies()
	{
		Factory::getLog()->debug(__CLASS__ . " :: Pushing table data (without dependency tracking)");

		// Reset internal tables
		$this->tables_data  = [];
		$this->dependencies = [];

		// Get filters and filter root
		$registry = Factory::getConfiguration();
		$root     = $registry->get('volatile.database.root', '[SITEDB]');
		$filters  = Factory::getFilters();

		foreach ($this->table_name_map as $table_name => $table_abstract)
		{
			$new_entry = [
				'type'         => 'table',
				'dump_records' => true,
			];

			// Table Data Filter - skip dumping table contents of filtered out tables
			if ($filters->isFiltered($table_abstract, $root, 'dbobject', 'content'))
			{
				$new_entry['dump_records'] = false;
			}

			$this->tables_data[$table_name] = $new_entry;
			$this->tables[]                 = $table_name;
		} // foreach

		Factory::getLog()->debug(__CLASS__ . " :: Got table list");
	}

	/**
	 * Generates a mapping between table names as they're stored in the database
	 * and their abstract representation. Updates $this->table_name_map
	 *
	 * @return  void
	 */
	protected function get_tables_mapping()
	{
		// Get a database connection
		Factory::getLog()->debug(__CLASS__ . " :: Finding tables to include in the backup set");
		$db = $this->getDB();

		// Reset internal tables
		$this->table_name_map = [];

		// Get the list of all database tables
		$sql = "SHOW TABLES";
		$db->setQuery($sql);
		$all_tables = $db->loadResultArray();

		$registry = Factory::getConfiguration();
		$root     = $registry->get('volatile.database.root', '[SITEDB]');

		// If we have filters, make sure the tables pass the filtering
		$filters = Factory::getFilters();

		foreach ($all_tables as $table_name)
		{
			if (substr($table_name, 0, 3) == '#__')
			{
				Factory::getLog()->warning(__CLASS__ . " :: Table $table_name has a prefix of #__. This would cause restoration errors; table skipped.");

				continue;
			}

			if ((strpos($table_name, "\r") !== false) || (strpos($table_name, "\n") !== false))
			{
				$table_name = str_replace(["\r", "\n"], ['\\r', '\\n'], $table_name);
				Factory::getLog()->warning(__CLASS__ . " :: [SECURITY] Table $table_name includes newline characters. Skipping table to protect you against possible MySQL vulnerability CVE-2017-3600 (“Bad Dump”).");

				continue;
			}

			$table_abstract = $this->getAbstract($table_name);

			if (substr($table_abstract, 0, 4) != 'bak_') // Skip backup tables
			{
				// Apply exclusion filters
				if (!$filters->isFiltered($table_abstract, $root, 'dbobject', 'all'))
				{
					Factory::getLog()->info(__CLASS__ . " :: Adding $table_name (internal name $table_abstract)");
					$this->table_name_map[$table_name] = $table_abstract;
				}
				else
				{
					Factory::getLog()->info(__CLASS__ . " :: Skipping $table_name (internal name $table_abstract)");
				}
			}
			else
			{
				Factory::getLog()->info(__CLASS__ . " :: Backup table $table_name automatically skipped.");
			}
		}

		// If we have MySQL > 5.0 add the list of stored procedures, stored functions
		// and triggers, but only if user has allows that and the target compatibility is
		// not MySQL 4! Also, if dependency tracking is disabled, we won't dump triggers,
		// functions and procedures.
		$enable_entities = $registry->get('engine.dump.native.advanced_entitites', true);
		$notracking      = $registry->get('engine.dump.native.nodependencies', 0);

		if (!$enable_entities)
		{
			Factory::getLog()->debug(__CLASS__ . " :: NOT listing stored PROCEDUREs, FUNCTIONs and TRIGGERs (you told me not to)");
		}
		elseif ($notracking != 0)
		{
			Factory::getLog()->debug(__CLASS__ . " :: NOT listing stored PROCEDUREs, FUNCTIONs and TRIGGERs (you have disabled dependency tracking, therefore I can't handle advanced entities)");
		}

		if ($enable_entities && ($notracking == 0))
		{
			// Cache the database name if this is the main site's database

			// 1. Stored procedures
			Factory::getLog()->debug(__CLASS__ . " :: Listing stored PROCEDUREs");
			$sql = "SHOW PROCEDURE STATUS WHERE `Db`=" . $db->quote($this->database);
			$db->setQuery($sql);

			try
			{
				$all_entries = $db->loadResultArray(1);
			}
			catch (Exception $e)
			{
				$all_entries = [];
			}

			// If we have filters, make sure the tables pass the filtering
			if (is_array($all_entries))
			{
				if (count($all_entries))
				{
					foreach ($all_entries as $entity_name)
					{
						if ((strpos($entity_name, "\r") !== false) || (strpos($entity_name, "\n") !== false))
						{
							$entity_name = str_replace(["\r", "\n"], ['\\r', '\\n'], $entity_name);
							Factory::getLog()->warning(__CLASS__ . " :: [SECURITY] Procedure $entity_name includes newline characters. Skipping table to protect you against possible MySQL vulnerability CVE-2017-3600 (“Bad Dump”).");

							continue;
						}

						$entity_abstract = $this->getAbstract($entity_name);

						if (!(substr($entity_abstract, 0, 4) == 'bak_')) // Skip backup entities
						{
							if (!$filters->isFiltered($entity_abstract, $root, 'dbobject', 'all'))
							{
								$this->table_name_map[$entity_name] = $entity_abstract;
							}
						}
					}
				}
			}

			// 2. Stored functions
			Factory::getLog()->debug(__CLASS__ . " :: Listing stored FUNCTIONs");
			$sql = "SHOW FUNCTION STATUS WHERE `Db`=" . $db->quote($this->database);
			$db->setQuery($sql);

			try
			{
				$all_entries = $db->loadResultArray(1);
			}
			catch (Exception $e)
			{
				$all_entries = [];
			}

			// If we have filters, make sure the tables pass the filtering
			if (is_array($all_entries))
			{
				if (count($all_entries))
				{
					foreach ($all_entries as $entity_name)
					{
						if ((strpos($entity_name, "\r") !== false) || (strpos($entity_name, "\n") !== false))
						{
							$entity_name = str_replace(["\r", "\n"], ['\\r', '\\n'], $entity_name);
							Factory::getLog()->warning(__CLASS__ . " :: [SECURITY] Function $entity_name includes newline characters. Skipping table to protect you against possible MySQL vulnerability CVE-2017-3600 (“Bad Dump”).");

							continue;
						}

						$entity_abstract = $this->getAbstract($entity_name);

						if (!(substr($entity_abstract, 0, 4) == 'bak_')) // Skip backup entities
						{
							// Apply exclusion filters if set
							if (!$filters->isFiltered($entity_abstract, $root, 'dbobject', 'all'))
							{
								$this->table_name_map[$entity_name] = $entity_abstract;
							}
						}
					}
				}
			}

			// 3. Triggers
			Factory::getLog()->debug(__CLASS__ . " :: Listing stored TRIGGERs");
			$sql = "SHOW TRIGGERS";
			$db->setQuery($sql);

			try
			{
				$all_entries = $db->loadResultArray();
			}
			catch (Exception $e)
			{
				$all_entries = [];
			}

			// If we have filters, make sure the tables pass the filtering
			if (is_array($all_entries))
			{
				if (count($all_entries))
				{
					foreach ($all_entries as $entity_name)
					{
						if ((strpos($entity_name, "\r") !== false) || (strpos($entity_name, "\n") !== false))
						{
							$entity_name = str_replace(["\r", "\n"], ['\\r', '\\n'], $entity_name);
							Factory::getLog()->warning(__CLASS__ . " :: [SECURITY] Trigger $entity_name includes newline characters. Skipping table to protect you against possible MySQL vulnerability CVE-2017-3600 (“Bad Dump”).");

							continue;
						}

						$entity_abstract = $this->getAbstract($entity_name);

						if (!(substr($entity_abstract, 0, 4) == 'bak_')) // Skip backup entities
						{
							// Apply exclusion filters if set
							if (!$filters->isFiltered($entity_abstract, $root, 'dbobject', 'all'))
							{
								$this->table_name_map[$entity_name] = $entity_abstract;
							}
						}
					}
				}
			}
		} // if MySQL 5

		/**
		 * Store all abstract entity names (tables, views, triggers etc etc ) into a volatile variable, so we can fetch
		 * it later when creating the databases.json file
		 */
		ksort($this->table_name_map);
		$registry->set('volatile.database.table_names', array_values($this->table_name_map));

		/**
		 * IMPORTANT -- DO NOT REMOVE
		 *
		 * We now need to reverse sort the table_name_map. This is of paramount importance in how the
		 * replaceTableNamesWithAbstracts method works. Consider the following case:
		 * foo_test_2 => #__test_2
		 * foo_test_20 => #__test_20
		 * If foo_test_2 comes before foo_test_2 (alpha sort) the CREATE command of foo_test_20 will end up as
		 * CREATE TABLE ``#__test_2`0` (...)
		 * instead of the correct
		 * CREATE TABLE `#__test_20` (...)
		 * That's because the first table replacement done there will be foo_test_2 => `#__test_2`. Ouch.
		 *
		 * By doing a reverse alpha sort on the keys we ENSURE that the longer table names which may be a superset of
		 * another table's name will always end up first on the list.
		 *
		 * In our example the first replacement made is foo_test_20 => `#__test_20`. When we reach the next possible
		 * replacement (foo_test_2) we no longer have the concrete table name foo_test_2 therefore we won't accidentally
		 * break the CREATE command.
		 *
		 * Of course the same replacement problem exists within VIEWs, TRIGGERs, PROCEDUREs and FUNCTIONs. Again, the
		 * reverse alpha sort by concrete table name solves this issue elegantly.
		 */
		krsort($this->table_name_map);
	}

	/**
	 * Process all table dependencies
	 *
	 * @return  void
	 */
	protected function process_dependencies()
	{
		if ((is_array($this->table_name_map) || $this->table_name_map instanceof \Countable ? count($this->table_name_map) : 0) > 0)
		{
			foreach ($this->table_name_map as $table_name => $table_abstract)
			{
				$this->push_table($table_name);
			}
		}

		Factory::getLog()->debug(__CLASS__ . " :: Processed dependencies");
	}

	/**
	 * Pushes a table in the _tables stack, making sure it will appear after
	 * its dependencies and other tables/views depending on it will eventually
	 * appear after it. It's a complicated chicken-and-egg problem. Just make
	 * sure you don't have any bloody circular references!!
	 *
	 * @param   string  $table_name  Canonical name of the table to push
	 * @param   array   $stack       When called recursive, other views/tables previously processed in order to detect
	 *                               *ahem* dependency loops...
	 *
	 * @return  void
	 */
	protected function push_table($table_name, $stack = [], $currentRecursionDepth = 0)
	{
		if (!isset($this->tables_data[$table_name]))
		{
			return;
		}

		// Load information
		$table_data = $this->tables_data[$table_name];

		if (array_key_exists('dependencies', $table_data))
		{
			$referenced = $table_data['dependencies'];
		}
		else
		{
			$referenced = [];
		}

		unset($table_data);

		// Try to find the minimum insert position, so as to appear after the last referenced table
		$insertpos = false;

		if (is_array($referenced) || $referenced instanceof \Countable ? count($referenced) : 0)
		{
			foreach ($referenced as $referenced_table)
			{
				if (is_array($this->tables) || $this->tables instanceof \Countable ? count($this->tables) : 0)
				{
					$newpos = array_search($referenced_table, $this->tables);

					if ($newpos !== false)
					{
						if ($insertpos === false)
						{
							$insertpos = $newpos;
						}
						else
						{
							$insertpos = max($insertpos, $newpos);
						}
					}
				}
			}
		}

		// Add to the _tables array
		if ((is_array($this->tables) || $this->tables instanceof \Countable ? count($this->tables) : 0) && ($insertpos !== false))
		{
			array_splice($this->tables, $insertpos + 1, 0, $table_name);
		}
		else
		{
			$this->tables[] = $table_name;
		}

		// Here's what... Some other table/view might depend on us, so we must appear
		// before it (actually, it must appear after us). So, we scan for such
		// tables/views and relocate them
		if (is_array($this->dependencies) || $this->dependencies instanceof \Countable ? count($this->dependencies) : 0)
		{
			if (array_key_exists($table_name, $this->dependencies))
			{
				foreach ($this->dependencies[$table_name] as $depended_table)
				{
					// First, make sure that either there is no stack, or the
					// depended table doesn't belong it. In any other case, we
					// were fooled to follow an endless dependency loop and we
					// will simply bail out and let the user sort things out.
					if (count($stack) > 0)
					{
						if (in_array($depended_table, $stack))
						{
							continue;
						}
					}

					$my_position     = array_search($table_name, $this->tables);
					$remove_position = array_search($depended_table, $this->tables);

					if (($remove_position !== false) && ($remove_position < $my_position))
					{
						$stack[] = $table_name;
						array_splice($this->tables, $remove_position, 1);

						// Where should I put the other table/view now? Don't tell me.
						// I have to recurse...
						if ($currentRecursionDepth < 19)
						{
							$this->push_table($depended_table, $stack, ++$currentRecursionDepth);
						}
						else
						{
							// We're hitting a circular dependency. We'll add the removed $depended_table
							// in the penultimate position of the table and cross our virtual fingers...
							array_splice($this->tables, (is_array($this->tables) || $this->tables instanceof \Countable ? count($this->tables) : 0) - 1, 0, $depended_table);
						}
					}
				}
			}
		}
	}

	/**
	 * Try to find an auto_increment field for the table being currently backed up and populate the
	 * $this->table_autoincrement table. Updates $this->table_autoincrement.
	 *
	 * @return  void
	 */
	protected function setAutoIncrementInfo()
	{
		$this->table_autoincrement = [
			'table' => $this->nextTable,
			'field' => null,
			'value' => null,
		];

		$db = $this->getDB();

		$query   = 'SHOW COLUMNS FROM ' . $db->qn($this->nextTable) . ' WHERE ' . $db->qn('Extra') . ' = ' .
			$db->q('auto_increment') . ' AND ' . $db->qn('Null') . ' = ' . $db->q('NO');
		$keyInfo = $db->setQuery($query)->loadAssocList();

		if (!empty($keyInfo))
		{
			$row                                = array_shift($keyInfo);
			$this->table_autoincrement['field'] = $row['Field'];
		}
	}

	/**
	 * Performs one more step of dumping database data
	 *
	 * @return  void
	 *
	 * @throws QueryException
	 * @throws Exception
	 */
	protected function stepDatabaseDump(): void
	{
		// Initialize local variables
		$db = $this->getDB();

		if (!is_object($db) || ($db === false))
		{
			throw new RuntimeException(__CLASS__ . '::_run() Could not connect to database?!');
		}

		$outData = ''; // Used for outputting INSERT INTO commands

		$this->enforceSQLCompatibility(); // Apply MySQL compatibility option

		// Touch SQL dump file
		$nada = "";
		$this->writeline($nada);

		// Get this table's information
		$tableName = $this->nextTable;
		$this->setStep($tableName);
		$this->setSubstep('');
		$tableAbstract = trim($this->table_name_map[$tableName]);
		$dump_records  = $this->tables_data[$tableName]['dump_records'];

		// Restore any previously information about the largest query we had to run
		$this->largest_query = Factory::getConfiguration()->get('volatile.database.largest_query', 0);

		// If it is the first run, find number of rows and get the CREATE TABLE command
		if ($this->nextRange == 0)
		{
			$outCreate = '';

			if (is_array($this->tables_data[$tableName]))
			{
				if (array_key_exists('create', $this->tables_data[$tableName]))
				{
					$outCreate = $this->tables_data[$tableName]['create'];
				}
			}

			if (empty($outCreate) && !empty($tableName))
			{
				// The CREATE command wasn't cached. Time to create it. The $type and $dependencies
				// variables will be thrown away.
				$type         = $this->tables_data[$tableName]['type'] ?? 'table';
				$dependencies = [];
				$outCreate    = $this->get_create($tableAbstract, $tableName, $type, $dependencies);
			}

			// Create drop statements if required (the key is defined by the scripting engine)
			if (!empty($outCreate) && Factory::getEngineParamsProvider()->getScriptingParameter('db.dropstatements', 0))
			{
				if (array_key_exists('create', $this->tables_data[$tableName]))
				{
					$dropStatement = $this->createDrop($this->tables_data[$tableName]['create']);
				}
				else
				{
					$type            = 'table';
					$createStatement = $this->get_create($tableAbstract, $tableName, $type, $dependencies);
					$dropStatement   = $this->createDrop($createStatement);
				}

				if (!empty($dropStatement))
				{
					$dropStatement .= "\n";

					if (!$this->writeDump($dropStatement, true))
					{
						return;
					}
				}
			}

			/**
			 * If we have a PROCEDURE, FUNCTION or TRIGGER and we are doing a SQL export meant to be run directly by
			 * MySQL (the scripting db.delimiterstatements flag is set to 1) we need to surround the CREATE statement
			 * with DELIMITER $$ commands.
			 */
			if (
				!empty($outCreate) &&
				(Factory::getEngineParamsProvider()->getScriptingParameter('db.delimiterstatements', 0) == 1)
				&& in_array($this->tables_data[$tableName]['type'], ['trigger', 'function', 'procedure'])
			)
			{
				$outCreate = rtrim($outCreate, ";\n");
				$outCreate = "DELIMITER $$\n$outCreate$$\nDELIMITER ;\n";
			}

			// Write the CREATE command after any DROP command which might be necessary.
			if (!empty($outCreate) && !$this->writeDump($outCreate, true))
			{
				return;
			}

			if (!empty($outCreate) && $dump_records)
			{
				// We are dumping data from a table, get the row count
				$this->getRowCount($tableAbstract);

				// If we can't get the row count we cannot back up this table's data
				if (is_null($this->maxRange))
				{
					$dump_records = false;
				}
			}
			elseif (!$dump_records)
			{
				/**
				 * Do NOT move this line to the if-block below. We need to only log this message on tables which are
				 * filtered, not on tables we simply cannot get the row count information for!
				 */
				Factory::getLog()->info("Skipping dumping data of " . $tableAbstract);
			}

			// The table is either filtered or we cannot get the row count. Either way we should not dump any data.
			if (!$dump_records || empty($outCreate))
			{
				$this->maxRange  = 0;
				$this->nextRange = 1;
				$outData         = '';
				$numRows         = 0;
				$dump_records    = false;
			}

			// Output any data preamble commands, e.g. SET IDENTITY_INSERT for SQL Server
			if ($dump_records && Factory::getEngineParamsProvider()->getScriptingParameter('db.dropstatements', 0))
			{
				Factory::getLog()->debug("Writing data dump preamble for " . $tableAbstract);
				$preamble = $this->getDataDumpPreamble($tableAbstract, $tableName, $this->maxRange);

				if (!empty($preamble))
				{
					if (!$this->writeDump($preamble, true))
					{
						return;
					}
				}
			}

			// Get the table's auto increment information
			if ($dump_records)
			{
				$this->setAutoIncrementInfo();
			}
		}

		// Load the active database root
		$configuration = Factory::getConfiguration();
		$dbRoot        = $configuration->get('volatile.database.root', '[SITEDB]');

		// Get the default and the current (optimal) batch size
		$defaultBatchSize = $this->getDefaultBatchSize();
		$batchSize        = $configuration->get('volatile.database.batchsize', $defaultBatchSize);

		// Check if we have more work to do on this table
		if (($this->nextRange < $this->maxRange))
		{
			$timer = Factory::getTimer();

			// Get the number of rows left to dump from the current table
			$columns         = $this->getSelectColumns($tableAbstract);
			$columnTypes     = $this->getColumnTypes($tableAbstract);
			$columnsForQuery = is_array($columns) ? array_map([$db, 'qn'], $columns) : $columns;
			$sql             = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
				->select($columnsForQuery)
				->from($db->nameQuote($tableAbstract));

			if (!is_null($this->table_autoincrement['field']))
			{
				$sql->order($db->qn($this->table_autoincrement['field']) . ' ASC');
			}

			if ($this->nextRange == 0)
			{
				// Get the optimal batch size for this table and save it to the volatile data
				$batchSize = $this->getOptimalBatchSize($tableAbstract, $defaultBatchSize);
				$configuration->set('volatile.database.batchsize', $batchSize);

				// First run, get a cursor to all records
				$db->setQuery($sql, 0, $batchSize);
				Factory::getLog()->info("Beginning dump of " . $tableAbstract);
				Factory::getLog()->debug("Up to $batchSize records will be read at once.");
			}
			else
			{
				// Subsequent runs, get a cursor to the rest of the records
				$this->setSubstep($this->nextRange . ' / ' . $this->maxRange);

				// If we have an auto_increment value and the table has over $batchsize records use the indexed select instead of a plain limit
				if (!is_null($this->table_autoincrement['field']) && !is_null($this->table_autoincrement['value']))
				{
					Factory::getLog()
						->info("Continuing dump of " . $tableAbstract . " from record #{$this->nextRange} using auto_increment column {$this->table_autoincrement['field']} and value {$this->table_autoincrement['value']}");
					$sql->where($db->qn($this->table_autoincrement['field']) . ' > ' . $db->q($this->table_autoincrement['value']));
					$db->setQuery($sql, 0, $batchSize);
				}
				else
				{
					Factory::getLog()
						->info("Continuing dump of " . $tableAbstract . " from record #{$this->nextRange}");
					$db->setQuery($sql, $this->nextRange, $batchSize);
				}
			}

			$this->query  = '';
			$numRows      = 0;
			$use_abstract = Factory::getEngineParamsProvider()->getScriptingParameter('db.abstractnames', 1);

			$filters            = Factory::getFilters();
			$mustFilterRows     = $filters->hasFilterType('dbobject', 'children');
			$mustFilterContents = $filters->canFilterDatabaseRowContent();

			try
			{
				$cursor = $db->query();
			}
			catch (Exception $exc)
			{
				// Issue a warning about the failure to dump data
				$errno = $exc->getCode();
				$error = $exc->getMessage();
				Factory::getLog()->warning("Failed dumping $tableAbstract from record #{$this->nextRange}. MySQL error $errno: $error");

				// Reset the database driver's state (we will try to dump other tables anyway)
				$db->resetErrors();
				$cursor = null;

				// Mark this table as done since we are unable to dump it.
				$this->nextRange = $this->maxRange;
			}

			$statsTableAbstract = Platform::getInstance()->tableNameStats;

			while (is_array($myRow = $db->fetchAssoc()) && ($numRows < ($this->maxRange - $this->nextRange)))
			{
				if ($this->createNewPartIfRequired() == false)
				{
					/**
					 * When createNewPartIfRequired returns false it means that we have began adding a SQL part to the
					 * backup archive but it hasn't finished. If we don't return here, the code below will keep adding
					 * data to that dump file. Yes, despite being closed. When you call writeDump the file is reopened.
					 * As a result of writing data of length Y, the file that had a size X now has a size of X + Y. This
					 * means that the loop in BaseArchiver which tries to add it to the archive will never see its End
					 * Of File since we are trying to resume the backup from *beyond* the file position that was
					 * recorded as the file size. The archive can detect a file shrinking but not a file growing!
					 * Therefore we hit an infinite loop a.k.a. runaway backup.
					 */
					return;
				}

				$numRows++;
				$numOfFields = is_array($myRow) || $myRow instanceof \Countable ? count($myRow) : 0;

				// On MS SQL Server there's always a RowNumber pseudocolumn added at the end, screwing up the backup (GRRRR!)
				if ($db->getDriverType() == 'mssql')
				{
					$numOfFields--;
				}

				// If row-level filtering is enabled, please run the filtering
				if ($mustFilterRows)
				{
					$isFiltered = $filters->isFiltered(
						[
							'table' => $tableAbstract,
							'row'   => $myRow,
						],
						$dbRoot,
						'dbobject',
						'children'
					);

					if ($isFiltered)
					{
						// Update the auto_increment value to avoid edge cases when the batch size is one
						if (!is_null($this->table_autoincrement['field']) && isset($myRow[$this->table_autoincrement['field']]))
						{
							$this->table_autoincrement['value'] = $myRow[$this->table_autoincrement['field']];
						}

						continue;
					}
				}

				if ($mustFilterContents)
				{
					$filters->filterDatabaseRowContent($dbRoot, $tableAbstract, $myRow);
				}

				if (
					(!$this->extendedInserts) || // Add header on simple INSERTs, or...
					($this->extendedInserts && empty($this->query)) //...on extended INSERTs if there are no other data, yet
				)
				{
					$newQuery  = true;
					$fieldList = $this->getFieldListSQL($columns);

					if ($numOfFields > 0)
					{
						$this->query = "INSERT INTO " . $db->nameQuote((!$use_abstract ? $tableName : $tableAbstract)) . " {$fieldList} VALUES \n";
					}
				}
				else
				{
					// On other cases, just mark that we should add a comma and start a new VALUES entry
					$newQuery = false;
				}

				$outData = '(';

				// Step through each of the row's values
				$fieldID = 0;

				// Used in running backup fix
				$isCurrentBackupEntry = false;

				// Fix 1.2a - NULL values were being skipped
				if ($numOfFields > 0)
				{
					foreach ($myRow as $fieldName => $value)
					{
						// The ID of the field, used to determine placement of commas
						$fieldID++;

						if ($fieldID > $numOfFields)
						{
							// This is required for SQL Server backups, do NOT remove!
							continue;
						}

						// Fix 2.0: Mark currently running backup as successful in the DB snapshot
						if ($tableAbstract == $statsTableAbstract)
						{
							if ($fieldID == 1)
							{
								// Compare the ID to the currently running
								$statistics           = Factory::getStatistics();
								$isCurrentBackupEntry = ($value == $statistics->getId());
							}
							elseif ($fieldID == 6)
							{
								// Treat the status field
								$value = $isCurrentBackupEntry ? 'complete' : $value;
							}
						}

						// Post-process the value
						if (is_null($value))
						{
							$outData .= "NULL"; // Cope with null values
						}
						else
						{
							// Accommodate for runtime magic quotes
							if (function_exists('get_magic_quotes_runtime'))
							{
								$value = @get_magic_quotes_runtime() ? stripslashes($value) : $value;
							}

							switch ($columnTypes[$fieldName] ?? '')
							{
								// Hex encode spatial data
								case 'GEOMETRY':
								case 'POINT':
								case 'LINESTRING':
								case 'POLYGON':
								case 'MULTIPOINT':
								case 'MULTILINESTRING':
								case 'MULTIPOLYGON':
								case 'GEOMETRYCOLLECTION':
									$hexEncoded = bin2hex($value);
									$value      = "x'$hexEncoded'";
									break;

								default:
									$value = $db->quote($value);
									break;
							}

							if ($this->postProcessValues)
							{
								$value = $this->postProcessQuotedValue($value);
							}

							$outData .= $value;
						}

						if ($fieldID < $numOfFields)
						{
							$outData .= ', ';
						}
					}
				}

				$outData .= ')';

				if ($numOfFields)
				{
					// If it's an existing query and we have extended inserts
					if ($this->extendedInserts && !$newQuery)
					{
						// Check the existing query size
						$query_length = strlen($this->query);
						$data_length  = strlen($outData);

						if (($query_length + $data_length) > $this->packetSize)
						{
							// We are about to exceed the packet size. Write the data so far.
							$this->query .= ";\n";

							if (!$this->writeDump($this->query, true))
							{
								return;
							}

							// Then, start a new query
							$fieldList = $this->getFieldListSQL($columns);

							$this->query = '';
							$this->query = "INSERT INTO " . $db->nameQuote((!$use_abstract ? $tableName : $tableAbstract)) . " {$fieldList} VALUES \n";
							$this->query .= $outData;
						}
						else
						{
							// We have room for more data. Append $outData to the query.
							$this->query .= ",\n";
							$this->query .= $outData;
						}
					}
					// If it's a brand new insert statement in an extended INSERTs set
					elseif ($this->extendedInserts && $newQuery)
					{
						// Append the data to the INSERT statement
						$this->query .= $outData;
						// Let's see the size of the dumped data...
						$query_length = strlen($this->query);

						if ($query_length >= $this->packetSize)
						{
							// This was a BIG query. Write the data to disk.
							$this->query .= ";\n";

							if (!$this->writeDump($this->query, true))
							{
								return;
							}

							// Then, start a new query
							$this->query = '';
						}
					}
					// It's a normal (not extended) INSERT statement
					else
					{
						// Append the data to the INSERT statement
						$this->query .= $outData;
						// Write the data to disk.
						$this->query .= ";\n";

						if (!$this->writeDump($this->query, true))
						{
							return;
						}

						// Then, start a new query
						$this->query = '';
					}
				}

				$outData = '';

				// Update the auto_increment value to avoid edge cases when the batch size is one
				if (!is_null($this->table_autoincrement['field']))
				{
					$this->table_autoincrement['value'] = $myRow[$this->table_autoincrement['field']];
				}

				unset($myRow);

				// Check for imminent timeout
				if ($timer->getTimeLeft() <= 0)
				{
					Factory::getLog()
						->debug("Breaking dump of $tableAbstract after $numRows rows; will continue on next step");

					break;
				}
			}

			$db->freeResult($cursor);

			// Advance the _nextRange pointer
			$this->nextRange += ($numRows != 0) ? $numRows : 1;

			$this->setStep($tableName);
			$this->setSubstep($this->nextRange . ' / ' . $this->maxRange);
		}

		// Finalize any pending query
		// WARNING! If we do not do that now, the query will be emptied in the next operation and all
		// accumulated data will go away...
		if (!empty($this->query))
		{
			$this->query .= ";\n";

			if (!$this->writeDump($this->query, true))
			{
				return;
			}

			$this->query = '';
		}

		// Check for end of table dump (so that it happens inside the same operation)
		if ($this->nextRange >= $this->maxRange)
		{
			// Tell the user we are done with the table
			Factory::getLog()->debug("Done dumping " . $tableAbstract);

			// Output any data preamble commands, e.g. SET IDENTITY_INSERT for SQL Server
			if ($dump_records && Factory::getEngineParamsProvider()->getScriptingParameter('db.dropstatements', 0))
			{
				Factory::getLog()->debug("Writing data dump epilogue for " . $tableAbstract);
				$epilogue = $this->getDataDumpEpilogue($tableAbstract, $tableName, $this->maxRange);

				if (!empty($epilogue))
				{
					if (!$this->writeDump($epilogue, true))
					{
						return;
					}
				}
			}

			if ((is_array($this->tables) || $this->tables instanceof \Countable ? count($this->tables) : 0) == 0)
			{
				// We have finished dumping the database!
				Factory::getLog()->info("End of database detected; flushing the dump buffers...");
				$this->writeDump(null);
				Factory::getLog()->info("Database has been successfully dumped to SQL file(s)");
				$this->setState(self::STATE_POSTRUN);
				$this->setStep('');
				$this->setSubstep('');
				$this->nextTable = '';
				$this->nextRange = 0;

				/**
				 * At the end of the database dump, if any query was longer than 1Mb, let's put a warning file in the
				 * installation folder, but ONLY if the backup is not a SQL-only backup (which has no backup archive).
				 */
				$isSQLOnly = $configuration->get('akeeba.basic.backup_type') == 'dbonly';

				if (!$isSQLOnly && ($this->largest_query >= 1024 * 1024))
				{
					$archive = Factory::getArchiverEngine();
					$archive->addFileVirtual('large_tables_detected', $this->installerSettings->installerroot, $this->largest_query);
				}
			}
			elseif ((is_array($this->tables) || $this->tables instanceof \Countable ? count($this->tables) : 0) != 0)
			{
				// Switch tables
				$this->nextTable = array_shift($this->tables);
				$this->nextRange = 0;
				$this->setStep($this->nextTable);
				$this->setSubstep('');
			}
		}
	}

	/** @inheritDoc */
	protected function getAllTables(): array
	{
		// Get a database connection
		$db = $this->getDB();

		$this->enforceSQLCompatibility();

		$sql = 'SHOW TABLES';
		$db->setQuery($sql);

		return $db->loadColumn() ?: [];
	}
}
components/com_akeeba/BackupEngine/Configuration.php000060400000034367152453623440016673 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine;

defined('AKEEBAENGINE') || die();

use DirectoryIterator;
use stdClass;

/**
 * The Akeeba Engine configuration registry class
 */
class Configuration
{
	/**
	 * The currently loaded profile
	 *
	 * @var   integer
	 */
	public $activeProfile = null;

	/**
	 * Default namespace
	 *
	 * @var   string
	 */
	private $defaultNameSpace = 'global';

	/**
	 * Array keys which may contain stock directory definitions
	 *
	 * @var   array
	 */
	private $directory_containing_keys = [
		'akeeba.basic.output_directory',
	];

	/**
	 * Keys whose default values should never be overridden
	 *
	 * @var   array
	 */
	private $protected_nodes = [];

	/** The registry data
	 *
	 * @var   array
	 */
	private $registry = [];

	/**
	 * Constructor
	 *
	 * @return  void
	 */
	public function __construct()
	{
		// Create the default namespace
		$this->makeNameSpace($this->defaultNameSpace);

		// Create a default configuration
		$this->reset();
	}

	/**
	 * Create a namespace
	 *
	 * @param   string  $namespace  Name of the namespace to create
	 *
	 * @return  void
	 */
	public function makeNameSpace($namespace)
	{
		$this->registry[$namespace] = ['data' => new stdClass()];
	}

	/**
	 * Get the list of namespaces
	 *
	 * @return  array  List of namespaces
	 */
	public function getNameSpaces()
	{
		return array_keys($this->registry);
	}

	/**
	 * Get a registry value
	 *
	 * @param   string   $regpath               Registry path (e.g. global.directory.temporary)
	 * @param   mixed    $default               Optional default value
	 * @param   boolean  $process_special_vars  Optional. If true (default), it processes special variables, e.g.
	 *                                          [SITEROOT] in folder names
	 *
	 * @return  mixed  Value of entry or null
	 */
	public function get($regpath, $default = null, $process_special_vars = true)
	{
		// Cache the platform-specific stock directories
		static $stock_directories = [];

		if (empty($stock_directories))
		{
			$stock_directories = Platform::getInstance()->get_stock_directories();
		}

		$result = $default;

		// Explode the registry path into an array
		if ($nodes = explode('.', $regpath))
		{
			// Get the namespace
			$count = count($nodes);

			if ($count < 2)
			{
				$namespace = $this->defaultNameSpace;
				$nodes[1]  = $nodes[0];
			}
			else
			{
				$namespace = $nodes[0];
			}

			if (isset($this->registry[$namespace]))
			{
				$ns        = $this->registry[$namespace]['data'];
				$pathNodes = $count - 1;

				for ($i = 1; $i < $pathNodes; $i++)
				{
					if ((isset($ns->{$nodes[$i]})))
					{
						$ns = $ns->{$nodes[$i]};
					}
				}

				if (isset($ns->{$nodes[$i]}))
				{
					$result = $ns->{$nodes[$i]};
				}
			}
		}

		// Post-process certain directory-containing variables
		if ($process_special_vars && in_array($regpath, $this->directory_containing_keys))
		{
			if (!empty($stock_directories))
			{
				foreach ($stock_directories as $tag => $content)
				{
					$result = str_replace($tag, $content, $result);
				}
			}
		}

		return $result;
	}

	/**
	 * Set a registry value
	 *
	 * @param   string  $regpath               Registry Path (e.g. global.directory.temporary)
	 * @param   mixed   $value                 Value of entry
	 * @param   bool    $process_special_vars  Optional. If true (default), it processes special variables, e.g.
	 *                                         [SITEROOT] in folder names
	 *
	 * @return  mixed  Value of old value or boolean false if operation failed
	 */
	public function set($regpath, $value, $process_special_vars = true)
	{
		// Cache the platform-specific stock directories
		static $stock_directories = [];

		if (empty($stock_directories))
		{
			$stock_directories = Platform::getInstance()->get_stock_directories();
		}

		if (in_array($regpath, $this->protected_nodes))
		{
			return $this->get($regpath);
		}

		// Explode the registry path into an array
		$nodes = explode('.', $regpath);

		// Get the namespace
		$count = count($nodes);

		if ($count < 2)
		{
			$namespace = $this->defaultNameSpace;
		}
		else
		{
			$namespace = array_shift($nodes);
			$count--;
		}

		if (!isset($this->registry[$namespace]))
		{
			$this->makeNameSpace($namespace);
		}

		$ns = $this->registry[$namespace]['data'];

		$pathNodes = $count - 1;

		if ($pathNodes < 0)
		{
			$pathNodes = 0;
		}

		for ($i = 0; $i < $pathNodes; $i++)
		{
			// If any node along the registry path does not exist, create it
			if (!isset($ns->{$nodes[$i]}))
			{
				$ns->{$nodes[$i]} = new stdClass();
			}
			$ns = $ns->{$nodes[$i]};
		}

		// Set the new values
		if (is_string($value))
		{
			if (substr($value, 0, 10) == '###json###')
			{
				$value = json_decode(substr($value, 10));
			}
		}

		// Post-process certain directory-containing variables
		if ($process_special_vars && in_array($regpath, $this->directory_containing_keys))
		{
			if (!empty($stock_directories))
			{
				$data = $value;

				foreach ($stock_directories as $tag => $content)
				{
					$data = str_replace($tag, $content, $data);
				}

				$ns->{$nodes[$i]} = $data;

				return $ns->{$nodes[$i]};
			}
		}

		// This is executed if any of the previous two if's is false
		if (empty($nodes[$i]))
		{
			return false;
		}

		$ns->{$nodes[$i]} = $value;

		return $ns->{$nodes[$i]};
	}

	/**
	 * Unset (remove) a registry value
	 *
	 * @param   string  $regpath  Registry Path (e.g. global.directory.temporary)
	 *
	 * @return  boolean  True if the node was removed
	 */
	public function remove($regpath)
	{
		// Explode the registry path into an array
		$nodes = explode('.', $regpath);

		// Get the namespace
		$count = count($nodes);

		if ($count < 2)
		{
			$namespace = $this->defaultNameSpace;
		}
		else
		{
			$namespace = array_shift($nodes);
			$count--;
		}

		if (!isset($this->registry[$namespace]))
		{
			$this->makeNameSpace($namespace);
		}

		$ns = $this->registry[$namespace]['data'];

		$pathNodes = $count - 1;

		if ($pathNodes < 0)
		{
			$pathNodes = 0;
		}

		for ($i = 0; $i < $pathNodes; $i++)
		{
			// If any node along the registry path does not exist, return false
			if (!isset($ns->{$nodes[$i]}))
			{
				return false;
			}

			$ns = $ns->{$nodes[$i]};
		}

		unset($ns->{$nodes[$i]});

		return true;
	}

	/**
	 * Resets the registry to the default values
	 */
	public function reset()
	{
		// Load the Akeeba Engine INI files
		$root_path = __DIR__;

		$paths = [
			$root_path . '/Core',
			$root_path . '/Archiver',
			$root_path . '/Dump',
			$root_path . '/Scan',
			$root_path . '/Writer',
			$root_path . '/Proc',
			$root_path . '/Platform/Filter/Stack',
			$root_path . '/Filter/Stack',
		];

		$platform_paths = Platform::getInstance()->getPlatformDirectories();

		foreach ($platform_paths as $p)
		{
			$paths[] = $p . '/Filter/Stack';
			$paths[] = $p . '/Config';
		}

		foreach ($paths as $root)
		{
			if (!(is_dir($root) || is_link($root)))
			{
				continue;
			}

			if (!is_readable($root))
			{
				continue;
			}

			$di = new DirectoryIterator($root);

			/** @var DirectoryIterator $file */
			foreach ($di as $file)
			{
				if (!$file->isFile())
				{
					continue;
				}

				if ($file->getExtension() == 'json')
				{
					$this->mergeEngineJSON($file->getRealPath());
				}
			}
		}
	}

	/**
	 * Merges an associative array of key/value pairs into the registry.
	 * If noOverride is set, only non set or null values will be applied.
	 *
	 * @param   array  $array                 An associative array. Its keys are registry paths.
	 * @param   bool   $noOverride            [optional] Do not override pre-set values.
	 * @param   bool   $process_special_vars  Optional. If true (default), it processes special variables, e.g.
	 *                                        [SITEROOT] in folder names
	 */
	public function mergeArray($array, $noOverride = false, $process_special_vars = true)
	{
		if (!$noOverride)
		{
			foreach ($array as $key => $value)
			{
				$this->set($key, $value, $process_special_vars);
			}
		}
		else
		{
			foreach ($array as $key => $value)
			{
				if (is_null($this->get($key, null)))
				{
					$this->set($key, $value, $process_special_vars);
				}
			}
		}
	}

	/**
	 * Merges a JSON file into the registry. Its top level keys are registry paths,
	 * child keys are appended to the section-defined paths and then set equal to the
	 * values. If noOverride is set, only non set or null values will be applied.
	 * Top level keys beginning with an underscore will be ignored.
	 *
	 * @param   string   $jsonPath    The full path to the INI file to load
	 * @param   boolean  $noOverride  [optional] Do not override pre-set values.
	 *
	 * @return  boolean  True on success
	 */
	public function mergeJSON($jsonPath, $noOverride = false)
	{
		if (!file_exists($jsonPath))
		{
			return false;
		}

		$rawData  = file_get_contents($jsonPath);
		$jsonData = empty($rawData) ? [] : json_decode($rawData, true);

		foreach ($jsonData as $rootkey => $rootvalue)
		{
			if (!is_array($rootvalue))
			{
				if (!$noOverride)
				{
					$this->set($rootkey, $rootvalue);
				}
				elseif (is_null($this->get($rootkey, null)))
				{
					$this->set($rootkey, $rootvalue);
				}
			}
			elseif (substr($rootkey, 0, 1) != '_')
			{
				foreach ($rootvalue as $key => $value)
				{
					if (!$noOverride)
					{
						$this->set($rootkey . '.' . $key, $rootvalue);
					}
					elseif (is_null($this->get($rootkey . '.' . $key, null)))
					{
						$this->set($rootkey . '.' . $key, $rootvalue);
					}
				}
			}
		}

		return true;
	}

	/**
	 * Merges an engine JSON file to the configuration. Each top level key defines a full
	 * registry path (section.subsection.key). It searches each top level key for the
	 * child key named "default" and merges its value to the configuration. The other keys
	 * are simply ignored.
	 *
	 * @param   string  $jsonPath    The absolute path to an JSON file
	 * @param   bool    $noOverride  [optional] If true, values from the JSON file will not override the configuration
	 *
	 * @return  boolean  True on success
	 */
	public function mergeEngineJSON($jsonPath, $noOverride = false)
	{
		if (!file_exists($jsonPath))
		{
			return false;
		}

		$rawData  = file_get_contents($jsonPath);
		$jsonData = empty($rawData) ? [] : json_decode($rawData, true);

		foreach ($jsonData ?? [] as $section => $nodes)
		{
			if (is_array($nodes))
			{
				if (substr($section, 0, 1) != '_')
				{
					// Is this a protected node?
					$protected = false;

					if (array_key_exists('protected', $nodes))
					{
						$protected = $nodes['protected'];
					}

					// If overrides are allowed, unprotect until we can set the value
					if (!$noOverride)
					{
						if (in_array($section, $this->protected_nodes))
						{
							$pnk = array_search($section, $this->protected_nodes);
							unset($this->protected_nodes[$pnk]);
						}
					}

					if (array_key_exists('remove', $nodes))
					{
						// Remove a node if it has "remove" set
						$this->remove($section);
					}
					elseif (isset($nodes['default']))
					{
						if (!$noOverride)
						{
							// Update the default value if No Override is set
							$this->set($section, $nodes['default']);
						}
						elseif (is_null($this->get($section, null)))
						{
							// Set the default value if it does not exist
							$this->set($section, $nodes['default']);
						}
					}

					// Finally, if it's a protected node, enable the protection
					if ($protected)
					{
						$this->protected_nodes[] = $section;
					}
					else
					{
						$idx = array_search($section, $this->protected_nodes);

						if ($idx !== false)
						{
							unset($this->protected_nodes[$idx]);
						}
					}
				}
			}
		}

		return true;
	}

	/**
	 * Exports the current registry snapshot as a JSON-encoded object. Each namespace is a property of the top-level
	 * JSON object.
	 *
	 * @return  string  The JSON-encoded representation of the registry
	 *
	 * @since   6.4.1
	 */
	public function exportAsJSON()
	{
		$forJSON    = [];
		$namespaces = $this->getNameSpaces();

		foreach ($namespaces as $namespace)
		{
			if ($namespace == 'volatile')
			{
				continue;
			}

			$forJSON[$namespace] = $this->registry[$namespace]['data'];
		}

		return json_encode($forJSON, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_FORCE_OBJECT | JSON_PRETTY_PRINT);

	}

	/**
	 * Sets the protection status for a specific configuration key
	 *
	 * @param   string|array  $node     The node to protect/unprotect
	 * @param   boolean       $protect  True to protect, false to unprotect
	 *
	 * @return  void
	 */
	public function setKeyProtection($node, $protect = false)
	{
		if (is_array($node))
		{
			foreach ($node as $k)
			{
				$this->setKeyProtection($k, $protect);
			}
		}
		elseif (is_string($node))
		{
			if (is_array($this->protected_nodes))
			{
				$protected = in_array($node, $this->protected_nodes);
			}
			else
			{
				$this->protected_nodes = [];
				$protected             = false;
			}

			if ($protect)
			{
				if (!$protected)
				{
					$this->protected_nodes[] = $node;
				}
			}
			else
			{
				if ($protected)
				{
					$pnk = array_search($node, $this->protected_nodes);
					unset($this->protected_nodes[$pnk]);
				}
			}
		}
	}

	/**
	 * Returns a list of protected keys
	 *
	 * @return  array
	 */
	public function getProtectedKeys()
	{
		return $this->protected_nodes;
	}

	/**
	 * Resets the protected keys
	 *
	 * @return  void
	 */
	public function resetProtectedKeys()
	{
		$this->protected_nodes = [];
	}

	/**
	 * Sets the protected keys
	 *
	 * @param   array  $keys  A list of keys to protect
	 *
	 * @return  void
	 */
	public function setProtectedKeys($keys)
	{
		$this->protected_nodes = $keys;
	}
}
components/com_akeeba/BackupEngine/Core/04.quota.json000060400000004436152453623440016503 0ustar00{
    "_group": {
        "description": "COM_AKEEBA_CONFIG_HEADER_QUOTA"
    },
    "akeeba.quota.maxage.enable": {
        "default": "0",
        "type": "none",
        "protected": "1"
    },
    "akeeba.quota.obsolete_quota": {
        "default": "50",
        "type": "integer",
        "min": "0",
        "max": "500",
        "shortcuts": "1|10|20|30|40|50",
        "scale": "1",
        "uom": "items",
        "title": "COM_AKEEBA_CONFIG_OBSOLETEQUOTA_ENABLE_TITLE",
        "description": "COM_AKEEBA_CONFIG_OBSOLETEQUOTA_ENABLE_DESCRIPTION"
    },
    "akeeba.quota.enable_size_quota": {
        "default": "0",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_SIZEQUOTA_ENABLE_TITLE",
        "description": "COM_AKEEBA_CONFIG_SIZEQUOTA_ENABLE_DESCRIPTION"
    },
    "akeeba.quota.size_quota": {
        "default": "15728640",
        "type": "integer",
        "min": "1",
        "max": "1125899906842624",
        "shortcuts": "15728640|52428800|104857600|268435456|536870912|1073741824|2147483648|5368709120|10737418240|21474836480|1099511627776",
        "scale": "1048576",
        "uom": "MB",
        "title": "COM_AKEEBA_CONFIG_SIZEQUOTA_VALUE_TITLE",
        "description": "COM_AKEEBA_CONFIG_SIZEQUOTA_VALUE_DESCRIPTION",
        "showon": "akeeba.quota.size_quota:1"
    },
    "akeeba.quota.enable_count_quota": {
        "default": "1",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_COUNTQUOTA_ENABLE_TITLE",
        "description": "COM_AKEEBA_CONFIG_COUNTQUOTA_ENABLE_DESCRIPTION"
    },
    "akeeba.quota.count_quota": {
        "default": "3",
        "type": "integer",
        "min": "1",
        "max": "200",
        "shortcuts": "1|5|10|50|100|200",
        "scale": "1",
        "uom": "",
        "title": "COM_AKEEBA_CONFIG_COUNTQUOTA_VALUE_TITLE",
        "description": "COM_AKEEBA_CONFIG_COUNTQUOTA_VALUE_DESCRIPTION",
        "showon": "akeeba.quota.enable_count_quota:1"
    },
    "akeeba.quota.remotely.maxage.enable": {
        "default": "0",
        "type": "none",
        "protected": "1"
    },
    "akeeba.quota.remotely.enable_count_quota": {
        "default": "0",
        "type": "none",
        "protected": "1"
    },
    "akeeba.quota.remotely.enable_size_quota": {
        "default": "0",
        "type": "none",
        "protected": "1"
    }
}components/com_akeeba/BackupEngine/Core/05.tuning.json000060400000006434152453623440016657 0ustar00{
    "_group": {
        "description": "COM_AKEEBA_CONFIG_HEADER_TUNING"
    },
    "akeeba.tuning.min_exec_time": {
        "default": "2000",
        "type": "integer",
        "min": "0",
        "max": "20000",
        "shortcuts": "0|250|500|1000|2000|3000|4000|5000|7500|10000|15000|20000",
        "scale": "1000",
        "uom": "s",
        "title": "COM_AKEEBA_CONFIG_MINEXECTIME_TITLE",
        "description": "COM_AKEEBA_CONFIG_MINEXECTIME_DESCRIPTION"
    },
    "akeeba.tuning.max_exec_time": {
        "default": "14",
        "type": "integer",
        "min": "0",
        "max": "180",
        "shortcuts": "1|2|3|5|7|10|14|15|20|23|25|30|45|60|90|120|180",
        "scale": "1",
        "uom": "s",
        "title": "COM_AKEEBA_CONFIG_MAXEXECTIME_TITLE",
        "description": "COM_AKEEBA_CONFIG_MAXEXECTIME_DESCRIPTION"
    },
    "akeeba.tuning.run_time_bias": {
        "default": "75",
        "type": "integer",
        "min": "10",
        "max": "100",
        "shortcuts": "10|20|25|30|40|50|60|75|80|90|100",
        "scale": "1",
        "uom": "%",
        "title": "COM_AKEEBA_CONFIG_RUNTIMEBIAS_TITLE",
        "description": "COM_AKEEBA_CONFIG_RUNTIMEBIAS_DESCRIPTION"
    },
    "akeeba.advanced.autoresume": {
        "default": "1",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_AUTORESUME_TITLE",
        "description": "COM_AKEEBA_CONFIG_AUTORESUME_DESCRIPTION"
    },
    "akeeba.advanced.autoresume_timeout": {
        "default": "10",
        "type": "integer",
        "min": "1",
        "max": "36000",
        "scale": "1",
        "uom": "s",
        "shortcuts": "3|5|10|15|20|30|45|60|90|120|300|600|900|1800|3600",
        "title": "COM_AKEEBA_CONFIG_AUTORESUME_TIMEOUT_TITLE",
        "description": "COM_AKEEBA_CONFIG_AUTORESUME_TIMEOUT_DESCRIPTION",
        "showon": "akeeba.advanced.autoresume:1"
    },
    "akeeba.advanced.autoresume_maxretries": {
        "default": "3",
        "type": "integer",
        "min": "1",
        "max": "1000",
        "scale": "1",
        "shortcuts": "1|3|5|7|10|15|20|30|50|100",
        "title": "COM_AKEEBA_CONFIG_AUTORESUME_MAXRETRIES_TITLE",
        "description": "COM_AKEEBA_CONFIG_AUTORESUME_MAXRETRIES_DESCRIPTION",
        "showon": "akeeba.advanced.autoresume:1"
    },
    "akeeba.tuning.nobreak.beforelargefile": {
        "default": "0",
        "type": "none",
        "protected": "1"
    },
    "akeeba.tuning.nobreak.afterlargefile": {
        "default": "0",
        "type": "none",
        "protected": "1"
    },
    "akeeba.tuning.nobreak.proactive": {
        "default": "0",
        "type": "none",
        "protected": "1"
    },
    "akeeba.tuning.nobreak.domains": {
        "default": "0",
        "type": "none",
        "protected": "1"
    },
    "akeeba.tuning.nobreak.finalization": {
        "default": "0",
        "type": "none",
        "protected": "1"
    },
    "akeeba.tuning.settimelimit": {
        "default": "1",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_ADVANCED_SETTIMELIMIT_LABEL",
        "description": "COM_AKEEBA_CONFIG_ADVANCED_SETTIMELIMIT_DESC"
    },
    "akeeba.tuning.setmemlimit": {
        "default": "1",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_ADVANCED_SETMEMLIMIT_LABEL",
        "description": "COM_AKEEBA_CONFIG_ADVANCED_SETMEMLIMIT_DESC"
    }
}components/com_akeeba/BackupEngine/Core/Database.php000060400000007112152453623440016444 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Core;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Driver\Base as DriverBase;
use Akeeba\Engine\Driver\Mysqli;
use Akeeba\Engine\Platform;
use Akeeba\Engine\Util\HashTrait;

/**
 * A utility class to return a database connection object
 */
class Database
{
	use HashTrait;

	private static $instances = [];

	/**
	 * Returns a database connection object. It caches the created objects for future use.
	 *
	 * @param   array  $options  The database driver connection options
	 *
	 * @return  DriverBase|object  A DriverBase object or something with magic methods that's compatible with it
	 */
	public static function &getDatabase(array $options)
	{
		// Get the options signature.
		$signature = self::md5(serialize($options));

		// If there's a cached object return it.
		if (!empty(self::$instances[$signature]))
		{
			return self::$instances[$signature];
		}

		// Get the driver name / class
		$driver = preg_replace('/[^A-Z0-9_\\\.-]/i', '', $options['driver'] ?? '');

		// If there is no driver specified ask the Platform to guess it.
		if (empty($driver))
		{
			$default_signature = self::md5(serialize(Platform::getInstance()->get_platform_database_options()));
			$driver            = Platform::getInstance()->get_default_database_driver($signature === $default_signature);
		}

		// Ensure we have the FQN of the driver class
		if ((substr($driver, 0, 7) != '\\Akeeba') && substr($driver, 0, 7) != 'Akeeba\\')
		{
			$driver = '\\Akeeba\\Engine\\Driver\\' . ucfirst($driver);
		}

		// Map the legacy MySQL driver to the newer MySQLi
		if (($driver == '\\Akeeba\\Engine\\Driver\\Mysql') && !function_exists('mysql_connect'))
		{
			$driver = Mysqli::class;
		}

		// Translate MySQL SSL options
		if (!isset($options['ssl']) || !is_array($options['ssl']))
		{
			$options['ssl'] = [
				'enable'             => (bool) ($options['dbencryption'] ?? false),
				'cipher'             => ($options['dbsslcipher'] ?? '') ?: '',
				'ca'                 => ($options['dbsslca'] ?? '') ?: '',
				'capath'             => ($options['dbsslcapath'] ?? '') ?: '',
				'key'                => ($options['dbsslkey'] ?? '') ?: '',
				'cert'               => ($options['dbsslcert'] ?? '') ?: '',
				'verify_server_cert' => ($options['dbsslverifyservercert'] ?? false) ?: false,
			];
		}

		// Instantiate the database driver object and return it
		self::$instances[$signature] = new $driver($options);

		return self::$instances[$signature];
	}

	/**
	 * Un-cache a database driver object
	 *
	 * @param   array  $options  The database driver connection options
	 *
	 * @return  void
	 */
	public static function unsetDatabase(array $options): void
	{
		$signature = self::md5(serialize($options));

		if (!isset(self::$instances[$signature]))
		{
			return;
		}

		unset(self::$instances[$signature]);
	}
}
components/com_akeeba/BackupEngine/Core/scripting.json000060400000007351152453623440017131 0ustar00{
    "volatile.akeebaengine.domains": "init|installer|packdb|packing|finale",
    "volatile.akeebaengine.scripts": "full|dbonly|fileonly|alldb|incfile|incfull",

    "volatile.domain.init.domain": "init",
    "volatile.domain.init.class": "Init",
    "volatile.domain.init.text": "COM_AKEEBA_BACKUP_LABEL_DOMAIN_INIT",

    "volatile.domain.installer.domain": "installer",
    "volatile.domain.installer.class": "Installer",
    "volatile.domain.installer.text": "COM_AKEEBA_BACKUP_LABEL_DOMAIN_INSTALLER",

    "volatile.domain.packdb.domain": "PackDB",
    "volatile.domain.packdb.class": "Db",
    "volatile.domain.packdb.text": "COM_AKEEBA_BACKUP_LABEL_DOMAIN_PACKDB",

    "volatile.domain.packing.domain": "Packing",
    "volatile.domain.packing.class": "Pack",
    "volatile.domain.packing.text": "COM_AKEEBA_BACKUP_LABEL_DOMAIN_PACKING",

    "volatile.domain.finale.domain": "finale",
    "volatile.domain.finale.class": "Finalization",
    "volatile.domain.finale.text": "COM_AKEEBA_BACKUP_LABEL_DOMAIN_FINISHED",

    "volatile.scripting.full.chain": "init|installer|packdb|packing|finale",
    "volatile.scripting.full.text": "COM_AKEEBA_CONFIG_BACKUPTYPE_FULL",
    "volatile.scripting.full.db.saveasname": "normal",
    "volatile.scripting.full.db.databasesini": "1",
    "volatile.scripting.full.db.skipextradb": "0",
    "volatile.scripting.full.db.abstractnames": "1",
    "volatile.scripting.full.db.dropstatements": "0",
    "volatile.scripting.full.db.delimiterstatements": "0",
    "volatile.scripting.full.core.createarchive": "1",

    "volatile.scripting.dbonly.chain": "init|packdb|finale",
    "volatile.scripting.dbonly.text": "COM_AKEEBA_CONFIG_BACKUPTYPE_DBONLY",
    "volatile.scripting.dbonly.db.saveasname": "output",
    "volatile.scripting.dbonly.db.databasesini": "0",
    "volatile.scripting.dbonly.db.skipextradb": "1",
    "volatile.scripting.dbonly.db.abstractnames": "0",
    "volatile.scripting.dbonly.db.dropstatements": "1",
    "volatile.scripting.dbonly.db.delimiterstatements": "1",
    "volatile.scripting.dbonly.core.forceextension": ".sql",
    "volatile.scripting.dbonly.core.createarchive": "0",

    "volatile.scripting.fileonly.chain": "init|packing|finale",
    "volatile.scripting.fileonly.text": "COM_AKEEBA_CONFIG_BACKUPTYPE_FILEONLY",
    "volatile.scripting.fileonly.core.createarchive": "1",

    "volatile.scripting.alldb.chain": "init|installer|packdb|finale",
    "volatile.scripting.alldb.text": "COM_AKEEBA_CONFIG_BACKUPTYPE_ALLDB",
    "volatile.scripting.alldb.db.tempfile": "temporary",
    "volatile.scripting.alldb.db.saveasname": "normal",
    "volatile.scripting.alldb.db.databasesini": "1",
    "volatile.scripting.alldb.db.skipextradb": "0",
    "volatile.scripting.alldb.db.abstractnames": "1",
    "volatile.scripting.alldb.db.dropstatements": "0",
    "volatile.scripting.alldb.db.delimiterstatements": "0",
    "volatile.scripting.alldb.db.finalizearchive": "1",
    "volatile.scripting.alldb.core.createarchive": "1",

    "volatile.scripting.incfile.chain": "init|packing|finale",
    "volatile.scripting.incfile.text": "COM_AKEEBA_CONFIG_BACKUPTYPE_INCFILE",
    "volatile.scripting.incfile.filter.incremental": "1",

    "volatile.scripting.incfull.chain": "init|installer|packdb|packing|finale",
    "volatile.scripting.incfull.text": "COM_AKEEBA_CONFIG_BACKUPTYPE_INCFULL",
    "volatile.scripting.incfull.db.saveasname": "normal",
    "volatile.scripting.incfull.db.databasesini": "1",
    "volatile.scripting.incfull.db.skipextradb": "0",
    "volatile.scripting.incfull.db.abstractnames": "1",
    "volatile.scripting.incfull.db.dropstatements": "0",
    "volatile.scripting.incfull.db.delimiterstatements": "0",
    "volatile.scripting.incfull.core.createarchive": "1",
    "volatile.scripting.incfull.filter.incremental": "1"
}components/com_akeeba/BackupEngine/Core/Timer.php000060400000014251152453623440016022 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Core;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;

/**
 * Timer class
 */
class Timer
{

	/** @var float Maximum execution time allowance per step */
	private $max_exec_time = null;

	/** @var int Timestamp of execution start */
	private $start_time = null;

	/**
	 * Public constructor, creates the timer object and calculates the execution time limits
	 *
	 * @param   int|null  $maxExecTime  Maximum execution time, in seconds (minimum 1 second)
	 * @param   int|null  $bias         Execution time bias, in percentage points (10-100)
	 */
	public function __construct(?int $maxExecTime = null, ?int $bias = null)
	{
		// Initialize start time
		$this->start_time = $this->microtime_float();

		// Make sure we have max execution time and execution time bias or use the ones configured in the backup profile
		$configuration = Factory::getConfiguration();
		$maxExecTime   = $maxExecTime ?? (int) $configuration->get('akeeba.tuning.max_exec_time', 14);
		$bias          = $bias ?? (int) $configuration->get('akeeba.tuning.run_time_bias', 75);

		// Make sure both max exec time and bias are positive integers within the allowed range of values
		$maxExecTime = max(1, $maxExecTime);
		$bias        = min(100, max(10, $bias));

		$this->max_exec_time = $maxExecTime * $bias / 100;
	}

	/**
	 * Wake-up function to reset internal timer when we get unserialized
	 */
	public function __wakeup()
	{
		// Re-initialize start time on wake-up
		$this->start_time = $this->microtime_float();
	}

	/**
	 * Gets the number of seconds left, before we hit the "must break" threshold
	 *
	 * @return  float
	 */
	public function getTimeLeft()
	{
		return $this->max_exec_time - $this->getRunningTime();
	}

	/**
	 * Gets the time elapsed since object creation/unserialization, effectively how
	 * long Akeeba Engine has been processing data
	 *
	 * @return float
	 */
	public function getRunningTime()
	{
		return $this->microtime_float() - $this->start_time;
	}

	/**
	 * Enforce the minimum execution time
	 *
	 * @param   bool  $log              Should I log what I'm doing? Default is true.
	 * @param   bool  $serverSideSleep  Should I sleep on the server side? If false we return the amount of time to
	 *                                  wait in msec
	 *
	 * @return  int Wait time to reach min_execution_time in msec
	 */
	public function enforce_min_exec_time($log = true, $serverSideSleep = true)
	{
		// Try to get a sane value for PHP's maximum_execution_time INI parameter
		if (@function_exists('ini_get'))
		{
			$php_max_exec = @ini_get("maximum_execution_time");
		}
		else
		{
			$php_max_exec = 10;
		}
		if (($php_max_exec == "") || ($php_max_exec == 0))
		{
			$php_max_exec = 10;
		}
		// Decrease $php_max_exec time by 500 msec we need (approx.) to tear down
		// the application, as well as another 500msec added for rounding
		// error purposes. Also make sure this is never gonna be less than 0.
		$php_max_exec = max($php_max_exec * 1000 - 1000, 0);

		// Get the "minimum execution time per step" Akeeba Backup configuration variable
		$configuration = Factory::getConfiguration();
		$minexectime   = $configuration->get('akeeba.tuning.min_exec_time', 0);
		if (!is_numeric($minexectime))
		{
			$minexectime = 0;
		}

		// Make sure we are not over PHP's time limit!
		if ($minexectime > $php_max_exec)
		{
			$minexectime = $php_max_exec;
		}

		// Get current running time
		$elapsed_time = $this->getRunningTime() * 1000;

		$clientSideSleep = 0;

		// Only run a sleep delay if we haven't reached the minexectime execution time
		if (($minexectime > $elapsed_time) && ($elapsed_time > 0))
		{
			$sleep_msec = (int)($minexectime - $elapsed_time);

			if (!$serverSideSleep)
			{
				Factory::getLog()->debug("Asking client to sleep for $sleep_msec msec");
				$clientSideSleep = $sleep_msec;
			}
			elseif (function_exists('usleep'))
			{
				if ($log)
				{
					Factory::getLog()->debug("Sleeping for $sleep_msec msec, using usleep()");
				}
				usleep(1000 * $sleep_msec);
			}
			elseif (function_exists('time_nanosleep'))
			{
				if ($log)
				{
					Factory::getLog()->debug("Sleeping for $sleep_msec msec, using time_nanosleep()");
				}
				$sleep_sec  = floor($sleep_msec / 1000);
				$sleep_nsec = 1000000 * ($sleep_msec - ($sleep_sec * 1000));
				time_nanosleep($sleep_sec, $sleep_nsec);
			}
			elseif (function_exists('time_sleep_until'))
			{
				if ($log)
				{
					Factory::getLog()->debug("Sleeping for $sleep_msec msec, using time_sleep_until()");
				}
				$until_timestamp = time() + $sleep_msec / 1000;
				time_sleep_until($until_timestamp);
			}
			elseif (function_exists('sleep'))
			{
				$sleep_sec = ceil($sleep_msec / 1000);
				if ($log)
				{
					Factory::getLog()->debug("Sleeping for $sleep_sec seconds, using sleep()");
				}
				sleep($sleep_sec);
			}
		}
		elseif ($elapsed_time > 0)
		{
			// No sleep required, even if user configured us to be able to do so.
			if ($log)
			{
				Factory::getLog()->debug("No need to sleep; execution time: $elapsed_time msec; min. exec. time: $minexectime msec");
			}
		}

		return $clientSideSleep;
	}

	/**
	 * Reset the timer. It should only be used in CLI mode!
	 */
	public function resetTime()
	{
		$this->start_time = $this->microtime_float();
	}

	/**
	 * Returns the current timestamp in decimal seconds
	 */
	protected function microtime_float()
	{
		[$usec, $sec] = explode(" ", microtime());

		return ((float) $usec + (float) $sec);
	}
}
components/com_akeeba/BackupEngine/Core/Domain/Db.php000060400000025254152453623440016503 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Core\Domain;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Base\Part;
use Akeeba\Engine\Dump\Base as DumpBase;
use Akeeba\Engine\Factory;
use RuntimeException;

/**
 * Multiple database backup engine.
 */
final class Db extends Part
{
	/** @var array A list of the databases to be packed */
	private $database_list = [];

	/** @var array The current database configuration data */
	private $database_config = null;

	/** @var DumpBase The current dumper engine used to backup tables */
	private $dump_engine = null;

	/** @var string The contents of the databases.json file */
	private $databases_json = '';

	/** @var array An array containing the database definitions of all dumped databases so far */
	private $dumpedDatabases = [];

	/** @var int Total number of databases left to be processed */
	private $total_databases = 0;

	/**
	 * Implements the constructor of the class
	 *
	 * @return  void
	 */
	public function __construct()
	{
		parent::__construct();

		Factory::getLog()->debug(__CLASS__ . " :: New instance");
	}

	/**
	 * Implements the getProgress() percentage calculation based on how many
	 * databases we have fully dumped and how much of the current database we
	 * have dumped.
	 *
	 * @return  float
	 */
	public function getProgress()
	{
		if (!$this->total_databases)
		{
			return 0;
		}

		// Get the overall percentage (based on databases fully dumped so far)
		$remaining_steps = count($this->database_list);
		$remaining_steps++;
		$overall = 1 - ($remaining_steps / $this->total_databases);

		// How much is this step worth?
		$this_max = 1 / $this->total_databases;

		// Get the percentage done of the current database
		$local = is_object($this->dump_engine) ? $this->dump_engine->getProgress() : 0;

		$percentage = $overall + $local * $this_max;

		if ($percentage < 0)
		{
			$percentage = 0;
		}
		elseif ($percentage > 1)
		{
			$percentage = 1;
		}

		return $percentage;
	}

	/**
	 * Implements the _prepare abstract method
	 *
	 * @return  void
	 */
	protected function _prepare()
	{
		Factory::getLog()->debug(__CLASS__ . " :: Preparing instance");

		// Populating the list of databases
		$this->populate_database_list();

		$this->total_databases = count($this->database_list);

		$this->setState(self::STATE_PREPARED);
	}

	/**
	 * Implements the _run() abstract method
	 *
	 * @return  void
	 */
	protected function _run()
	{
		if ($this->getState() == self::STATE_POSTRUN)
		{
			Factory::getLog()->debug(__CLASS__ . " :: Already finished");
			$this->setStep('');
			$this->setSubstep('');
		}
		else
		{
			$this->setState(self::STATE_RUNNING);
		}

		// Make sure we have a dumper instance loaded!
		if (is_null($this->dump_engine) && !empty($this->database_list))
		{
			Factory::getLog()->debug(__CLASS__ . " :: Iterating next database");

			// Reset the volatile key holding the table names for this database
			Factory::getConfiguration()->set('volatile.database.table_names', []);

			// Create a new instance
			$this->dump_engine = Factory::getDumpEngine(true);

			// Configure the dumper instance and pass on the volatile database root registry key
			$registry = Factory::getConfiguration();
			$rootkeys = array_keys($this->database_list);
			$root     = array_shift($rootkeys);
			$registry->set('volatile.database.root', $root);

			$this->database_config                         = array_shift($this->database_list);
			$this->database_config['root']                 = $root;
			$this->database_config['process_empty_prefix'] = ($root == '[SITEDB]') ? true : false;

			Factory::getLog()->debug(sprintf("%s :: Now backing up %s (%s)", __CLASS__, $root, $this->database_config['database']));

			$this->dump_engine->setup($this->database_config);
		}
		elseif (is_null($this->dump_engine) && empty($this->database_list))
		{
			throw new RuntimeException('Current dump engine died while resuming the step');
		}

		// Try to step the instance
		$retArray = $this->dump_engine->tick();

		// Error propagation
		$this->lastException = $retArray['ErrorException'];

		if (!is_null($this->lastException))
		{
			throw $this->lastException;
		}

		$this->setStep($retArray['Step']);
		$this->setSubstep($retArray['Substep']);

		// Check if the instance has finished
		if (!$retArray['HasRun'])
		{
			// Set the number of parts
			$this->database_config['parts'] = $this->dump_engine->partNumber + 1;

			// Push the list of tables in the database into the definition of the last database backed up
			$this->database_config['tables'] = Factory::getConfiguration()->get('volatile.database.table_names', []);
			Factory::getConfiguration()->set('volatile.database.table_names', []);

			// Get the (possibly updated) database table name prefix
			$this->database_config['prefix'] = $this->dump_engine->getPrefix();

			// Push the definition of the last database backed up into dumpedDatabases
			array_push($this->dumpedDatabases, $this->database_config);

			// Go to the next entry in the list and dispose the old AkeebaDumperDefault instance
			$this->dump_engine = null;

			// Are we past the end of the list?
			if (empty($this->database_list))
			{
				Factory::getLog()->debug(__CLASS__ . " :: No more databases left to iterate");
				$this->setState(self::STATE_POSTRUN);
			}
		}
	}

	/**
	 * Implements the _finalize() abstract method
	 *
	 * @return  void
	 */
	protected function _finalize()
	{
		$this->setState(self::STATE_FINISHED);

		// If we are in db backup mode, don't create a databases.json
		$configuration = Factory::getConfiguration();

		if (!Factory::getEngineParamsProvider()->getScriptingParameter('db.databasesini', 1))
		{
			Factory::getLog()->debug(__CLASS__ . " :: Skipping databases.json");
		}
		// Create the databases.json contents
		// P.A. This still has the old name with the "ini" string. That's for legacy support. Must update it in the future
		elseif ($this->installerSettings->databasesini)
		{
			$this->createDatabasesJSON();

			Factory::getLog()->debug(__CLASS__ . " :: Creating databases.json");

			// Create a new string
			$databasesJSON = json_encode($this->databases_json, JSON_PRETTY_PRINT);

			Factory::getLog()->debug(__CLASS__ . " :: Writing databases.json contents");

			$archiver        = Factory::getArchiverEngine();
			$virtualLocation = (Factory::getEngineParamsProvider()->getScriptingParameter('db.saveasname', 'normal') == 'short') ? '' : $this->installerSettings->sqlroot;
			$archiver->addFileVirtual('databases.json', $virtualLocation, $databasesJSON);
		}

		// On alldb mode, we have to finalize the archive as well
		if (Factory::getEngineParamsProvider()->getScriptingParameter('db.finalizearchive', 0))
		{
			Factory::getLog()->info("Finalizing database dump archive");

			$archiver = Factory::getArchiverEngine();
			$archiver->finalize();
		}

		// In CLI mode we'll also close the database connection
		if (defined('AKEEBACLI'))
		{
			Factory::getLog()->info("Closing the database connection to the main database");
			Factory::unsetDatabase();
		}
	}

	/**
	 * Populates database_list with the list of databases in the settings
	 *
	 * @return void
	 */
	protected function populate_database_list()
	{
		// Get database inclusion filters
		$filters             = Factory::getFilters();
		$this->database_list = $filters->getInclusions('db');

		if (Factory::getEngineParamsProvider()->getScriptingParameter('db.skipextradb', 0))
		{
			// On database only backups we prune extra databases
			Factory::getLog()->debug(__CLASS__ . " :: Adding only main database");

			if (count($this->database_list) > 1)
			{
				$this->database_list = array_shift($this->database_list);
			}
		}
	}

	protected function createDatabasesJSON()
	{
		// caching databases.json contents
		Factory::getLog()->debug(__CLASS__ . " :: Creating databases.json data");

		// Create a new array
		$this->databases_json = [];

		$registry = Factory::getConfiguration();

		$blankOutPass = $registry->get('engine.dump.common.blankoutpass', 0);
		$siteRoot     = $registry->get('akeeba.platform.newroot', '');

		// Loop through databases list
		foreach ($this->dumpedDatabases as $definition)
		{
			$section = basename($definition['dumpFile']);

			$dboInstance = Factory::getDatabase($definition);
			$type        = $dboInstance->name;
			$tech        = $dboInstance->getDriverType();

			// If the database is a sqlite one, we have to process the database name which contains the path
			// At the moment we only handle the case where the db file is UNDER site root
			if ($tech == 'sqlite')
			{
				$definition['database'] = str_replace($siteRoot, '#SITEROOT#', $definition['database']);
			}

			$this->databases_json[$section] = [
				'dbtype'                => $type,
				'dbtech'                => $tech,
				'dbname'                => $definition['database'],
				'sqlfile'               => $definition['dumpFile'],
				'marker'                => "\n/**ABDB**/",
				'dbhost'                => $definition['host'] ?? '',
				'dbport'                => $definition['port'] ?? '',
				'dbsocket'              => $definition['socket'] ?? '',
				'dbuser'                => $definition['username'] ?? '',
				'dbpass'                => $definition['password'] ?? '',
				'prefix'                => $definition['prefix'] ?? '',
				'dbencryption'          => $definition['dbencryption'] ?? 0,
				'dbsslcipher'           => $definition['dbsslcipher'] ?? '',
				'dbsslca'               => $definition['dbsslca'] ?? '',
				'dbsslkey'              => $definition['dbsslkey'] ?? '',
				'dbsslcert'             => $definition['dbsslcert'] ?? '',
				'dbsslverifyservercert' => $definition['dbsslverifyservercert'] ?? 0,
				'parts'                 => $definition['parts'],
				'tables'                => $definition['tables'],
			];

			if ($blankOutPass)
			{
				$this->databases_json[$section]['dbuser']    = '';
				$this->databases_json[$section]['dbpass']    = '';
				$this->databases_json[$section]['dbsslca']   = '';
				$this->databases_json[$section]['dbsslkey']  = '';
				$this->databases_json[$section]['dbsslcert'] = '';
			}
		}
	}
}
components/com_akeeba/BackupEngine/Core/Domain/Pack.php000060400000106550152453623440017033 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Core\Domain;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Archiver\Base as BaseArchiverClass;
use Akeeba\Engine\Base\Exceptions\ErrorException;
use Akeeba\Engine\Base\Exceptions\WarningException;
use Akeeba\Engine\Base\Part;
use Akeeba\Engine\Configuration;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use Exception;
use Akeeba\Engine\Psr\Log\LogLevel;
use RuntimeException;

/* Windows system detection */
if (!defined('_AKEEBA_IS_WINDOWS'))
{
	$isWindows = DIRECTORY_SEPARATOR == '\\';

	if (function_exists('php_uname'))
	{
		$isWindows = stristr(php_uname(), 'windows');
	}

	define('_AKEEBA_IS_WINDOWS', $isWindows);
}

/**
 * Packing engine. Takes care of putting gathered files (the file list) into
 * an archive.
 */
final class Pack extends Part
{
	/** @var array Directories left to be scanned */
	private $directory_list;

	/** @var array Files left to be put into the archive */
	private $file_list;

	/**
	 * Have we finished scanning all subdirectories of the current directory?
	 *
	 * @var   boolean
	 */
	private $done_subdir_scanning = false;

	/**
	 * Have we finished scanning all files of the current directory?
	 *
	 * @var   boolean
	 */
	private $done_file_scanning = true;

	/**
	 * Is the current directory completely excluded?
	 *
	 * @var boolean
	 */
	private $excluded_folder = false;

	/**
	 * Are the current directory's subdirectories excluded?
	 *
	 * @var boolean
	 */
	private $excluded_subdirectories = false;

	/**
	 * Are the current directory's files excluded?
	 *
	 * @var boolean
	 */
	private $excluded_files = false;

	/** @var   string  Path to add to scanned files */
	private $path_prefix;

	/** @var   string  Path to remove from scanned files */
	private $remove_path_prefix;

	/** @var   array   An array of root directories to scan */
	private $root_definitions = [];

	/** @var   integer  How many files have been processed in the current step */
	private $processed_files_counter;

	/** @var   string  Current directory being scanned */
	private $current_directory;

	/** @var   integer|null  The position in the file list scanning */
	private $getFiles_position = null;

	/** @var   integer|null  The position in the folder list scanning */
	private $getFolders_position = null;

	/** @var   string  Current root directory being processed */
	private $root = '[SITEROOT]';

	/** @var   integer  Total root directories to scan, used in percentage calculation */
	private $total_roots = 0;

	/** @var   integer  Total files to process */
	private $total_files = 0;

	/** @var   integer  Total files already processed */
	private $done_files = 0;

	/** @var   integer  Total folders to process */
	private $total_folders = 0;

	/** @var   integer  Total folders already processed */
	private $done_folders = 0;

	/**
	 * Public constructor of the class
	 *
	 * @return  void
	 */
	public function __construct()
	{
		parent::__construct();

		Factory::getLog()->debug(__CLASS__ . " :: new instance");
	}

	/**
	 * Immediate post-processing of a part file that's just been completed.
	 *
	 * This method returns false when no post-processing was possible, or if it failed.
	 *
	 * The method returns true when it's post-processed a part file, even if such post-processing has only been partial.
	 *
	 * @param   BaseArchiverClass  $archiver       The archiver engine
	 * @param   Configuration      $configuration  Reference to the Factory configuration object
	 *
	 * @return  bool  True to indicate our caller should return immediately.
	 */
	public static function postProcessDonePartFile(BaseArchiverClass $archiver, Configuration $configuration)
	{
		// Get configuration parameters
		$postprocEngine               = Factory::getPostprocEngine();
		$allowImmediatePostProcessing = $configuration->get('engine.postproc.common.after_part', 0);
		$filename                     = $configuration->get('volatile.postproc.filename', null);
		$shouldDeleteProcessedPart    = $configuration->get('engine.postproc.common.delete_after', false);
		$shouldAbortOnFailed          = $configuration->get('engine.postproc.common.abort_on_fail', false);
		$engineCanDeleteFiles         = $postprocEngine->isFileDeletionAfterProcessingAdvisable();

		// Is the immediate post-processing disabled? Return false.
		if (!$allowImmediatePostProcessing)
		{
			return false;
		}

		// Are we continuing the post-processing of a previous file?
		if (!empty($filename))
		{
			Factory::getLog()->info(sprintf("Continuing immediate post-processing of part file %s", basename($filename)));
		}

		// Do we have a NEW file to post-process?
		if (empty($filename) && !empty($archiver->finishedPart))
		{
			$filename = array_shift($archiver->finishedPart);

			if (!empty($filename))
			{
				Factory::getLog()->info(sprintf("Starting immediate post-processing of part file %s", basename($filename)));
			}
		}

		// Not continuing post-processing and no new file to process? Return false and let the caller carry on.
		if (empty($filename))
		{
			return false;
		}

		// Store the file to post-process in volatile storage
		$configuration->set('volatile.postproc.filename', $filename);

		// Try to post-process the file
		$timer     = Factory::getTimer();
		$startTime = $timer->getRunningTime();

		try
		{
			$postProcessingResult = $postprocEngine->processPart($filename);
			$endTime              = $timer->getRunningTime();
			$stepTime             = $endTime - $startTime;
			$notEnoughTimeLeft    = $timer->getTimeLeft() < $stepTime;

			/**
			 * FINISHED POST-PROCESSING THE FILE
			 */
			if ($postProcessingResult === true)
			{
				Factory::getLog()->info('Successfully processed file ' . basename($filename));

				// Indicate the file has finished post-processing
				$configuration->set('volatile.postproc.filename', null);

				// Add this part's size to the volatile storage variable holding the total size of the backup set
				$volatileTotalSize = $configuration->get('volatile.engine.archiver.totalsize', 0);
				$volatileTotalSize += (int) @filesize($filename);

				$configuration->set('volatile.engine.archiver.totalsize', $volatileTotalSize);

				// If the engine recommends breaking the step after post-processing let's set the break flag
				if ($postprocEngine->recommendsBreakAfter())
				{
					$configuration->set('volatile.breakflag', true);
				}

				// If I don't need to delete the post-processed part just return
				if (!$shouldDeleteProcessedPart)
				{
					return true;
				}

				if (!$engineCanDeleteFiles)
				{
					return true;
				}

				Factory::getLog()->debug(sprintf("Deleting post-processed file %s", basename($filename)));
				Platform::getInstance()->unlink($filename);

				return true;
			}

			/**
			 * MORE WORK REQUIRED
			 */
			Factory::getLog()->info(sprintf("More post-processing steps required for file %s", basename($filename)));

			/**
			 * If the time left is not at least as much as the previous post-processing step took us we break the step.
			 * This prevents a time-out trying to post-process another chunk of the file.
			 */
			if ($notEnoughTimeLeft)
			{
				$configuration->set('volatile.breakflag', true);
			}
		}
		/**
		 * POST-PROCESSING FAILED
		 */
		catch (Exception $e)
		{
			// Indicate no further processing is possible on this file.
			$configuration->set('volatile.postproc.filename', null);

			Factory::getLog()->warning('Failed to process file ' . basename($filename));
			Factory::getLog()->warning('Error received from the post-processing engine:');

			self::logErrorsFromException($e, $shouldAbortOnFailed ? LogLevel::ERROR : LogLevel::WARNING);

			// Fail the backup if we're configured to do so
			if ($shouldAbortOnFailed)
			{
				throw new ErrorException(sprintf('Failed to process backup archive file %s', basename($filename)));
			}

			return false;
		}

		// No further processing necessary
		return true;
	}

	/**
	 * Implements the getProgress() percentage calculation based on how many
	 * roots we have fully backed up and how much of the current root we
	 * have backed up.
	 */
	public function getProgress()
	{
		if (empty($this->total_roots))
		{
			return 0;
		}

		// Get the overall percentage (based on databases fully dumped so far)
		$remaining_steps = count($this->root_definitions);
		$remaining_steps++;
		$overall = 1 - ($remaining_steps / $this->total_roots);

		// How much is this step worth?
		$this_max = 1 / $this->total_roots;

		// Get the percentage done of the current root. Hey, the calculation *is* dodgy, I know it!
		$local = 0;
		if ($this->total_files > 0)
		{
			$local += 0.05 * $this->done_files / $this->total_files;
		}
		if ($this->total_folders > 0)
		{
			$local += 0.95 * $this->done_folders / $this->total_folders;
		}

		$percentage = $overall + $local * $this_max;
		if ($percentage < 0)
		{
			$percentage = 0;
		}
		if ($percentage > 1)
		{
			$percentage = 1;
		}

		return $percentage;
	}

	/**
	 * Implements the _prepare() abstract method
	 *
	 * @return  void
	 */
	protected function _prepare()
	{
		Factory::getLog()->debug(__CLASS__ . " :: Starting _prepare()");

		$registry = Factory::getConfiguration();

		// Get a list of directories to include
		Factory::getLog()->debug(__CLASS__ . " :: Getting directory inclusion filters");
		$filters                = Factory::getFilters();
		$this->root_definitions = $filters->getInclusions('dir');

		$this->total_roots = count($this->root_definitions);

		// Add the mapping text file if there are external directories defined!
		if (count($this->root_definitions) > 1)
		{
			// The site's root is the last directory to be backed up. Um, no,
			// this is not what we need
			$temp = array_pop($this->root_definitions);
			array_unshift($this->root_definitions, $temp);

			// We add a README.txt file in our virtual directory...
			Factory::getLog()->debug("Creating README.txt in the EFF virtual folder");
			$virtualContents = <<<ENDVCONTENT
This directory contains directories above the web site's root you chose to
include in the backup set.  This file helps you figure out which directory
in the backup  set corresponds to  which directory in the  original site's
structure. You'll have to restore these files manually!


ENDVCONTENT;

			$counter = 0;
			$vdir    = trim($registry->get('akeeba.advanced.virtual_folder'), '/') . '/';
			$effini  = ['eff' => []];

			$rootsToPack = array_filter(
				$this->root_definitions,
				function ($data) {
					return $data[0] != '[SITEROOT]';
				}
			);

			foreach ($rootsToPack as $dir)
			{
				$counter++;

				$test = trim($dir[1]);

				if ($test == '/')
				{
					$counter--;
					continue;
				}

				$virtualContents .= $dir[1] . "\tis the backup of\t" . $dir[0] . "\n";

				$effini['eff'][$dir[0]] = $vdir . $dir[1];
			}

			$effini = json_encode($effini, JSON_PRETTY_PRINT);

			// Add the file to our archive
			$archiver = Factory::getArchiverEngine();

			if ($counter >= 1)
			{
				$archiver->addFileVirtual('README.txt', $registry->get('akeeba.advanced.virtual_folder'), $virtualContents);
				$archiver->addFileVirtual('eff.json', $this->installerSettings->installerroot, $effini);
			}
			else
			{
				Factory::getLog()->debug("README.txt was not created; all EFF directories are being backed up to the archive's root");
			}
		}

		// Find the site's root element and shift it into the directory list
		$dir_definition = array_shift($this->root_definitions);
		$count          = 0;
		$max_dir_count  = count($this->root_definitions);
		while (!is_null($dir_definition[1]) && ($count < $max_dir_count))
		{
			$count++;
			array_push($this->root_definitions, $dir_definition);
			$dir_definition = array_shift($this->root_definitions);
		}

		// Settling with whatever we have, let's put it to use, shall we?
		$this->remove_path_prefix = $dir_definition[0]; // Remove absolute path to directory when storing the file
		if (is_null($dir_definition[1]))
		{
			$this->path_prefix = ''; // No added path for main site
			if (empty($dir_definition[0]))
			{
				$this->root = '[SITEROOT]';
			}
			else
			{
				$this->root = $dir_definition[0];
			}
		}
		else
		{
			$dir_definition[1] = trim($dir_definition[1]);
			if (empty($dir_definition[1]) || $dir_definition[1] == '/')
			{
				$this->path_prefix = '';
			}
			else
			{
				$this->path_prefix = $registry->get('akeeba.advanced.virtual_folder') . '/' . $dir_definition[1];
			}
			$this->root = $dir_definition[0];
		}
		// Translate the root into an absolute path
		$stock_dirs   = Platform::getInstance()->get_stock_directories();
		$absolute_dir = substr($this->root, 0);
		if (!empty($stock_dirs))
		{
			foreach ($stock_dirs as $key => $replacement)
			{
				$absolute_dir = str_replace($key, $replacement, $absolute_dir);
			}
		}
		$this->directory_list[]   = $absolute_dir;
		$this->remove_path_prefix = $absolute_dir;
		$registry                 = Factory::getConfiguration();
		$registry->set('volatile.filesystem.current_root', $absolute_dir);

		$this->done_subdir_scanning = true;
		$this->done_file_scanning   = true;
		$this->total_files          = 0;
		$this->done_files           = 0;
		$this->total_folders        = 0;
		$this->done_folders         = 0;

		$this->setState(self::STATE_PREPARED);

		Factory::getLog()->debug(__CLASS__ . " :: prepared");
	}

	// ============================================================================================
	// PRIVATE METHODS
	// ============================================================================================

	/**
	 * @return void
	 * @throws Exception
	 */
	protected function _run()
	{
		if ($this->getState() == self::STATE_POSTRUN)
		{
			Factory::getLog()->debug(__CLASS__ . " :: Already finished");
			$this->setStep("-");
			$this->setSubstep("");

			return;
		}

		// If I'm done scanning files and subdirectories and there are no more files to pack get the next
		// directory. This block is triggered in the first step in a new root.
		if (empty($this->file_list) && $this->done_subdir_scanning && $this->done_file_scanning)
		{
			$this->progressMarkFolderDone();

			if (!$this->getNextDirectory())
			{
				if ($this->getNextRoot())
				{
					if (!$this->getNextDirectory())
					{
						return;
					}
				}
				else
				{
					return;
				}
			}
		}

		/**
		 * Automated tests override
		 *
		 * If the file .akeeba_engine_automated_tests_error file is present in the site's root I will throw an error.
		 */
		[$root, $translated_root, $dir] = $this->getCleanDirectoryComponents();

		if (@file_exists($translated_root . '/.akeeba_engine_automated_tests_error'))
		{
			throw new RuntimeException("Akeeba Engine automated tests: I am throwing an error because the file .akeeba_engine_automated_tests_error is present in the site's root folder.");
		}

		// If I'm not done scanning for files and the file list is empty then scan for more files
		if (!$this->done_file_scanning && empty($this->file_list))
		{
			$this->scanFiles();
		}
		// If I have files left, pack them
		elseif (!empty($this->file_list))
		{
			$this->pack_files();
		}
		// If I'm not done scanning subdirectories, go ahead and scan some more of them
		elseif (!$this->done_subdir_scanning)
		{
			$this->scanSubdirs();
		}
		/**
		 * If we have excluded contained files or subdirectories BUT NOT the entire folder itself AND there are
		 * no files in this directory THEN add an empty directory to the archive.
		 **/
		elseif (
			($this->excluded_files || $this->excluded_subdirectories)
			&&
			!$this->excluded_folder
			&&
			empty($this->file_list)
		)
		{
			Factory::getLog()->info("Empty directory " . $this->current_directory . ' (files and directories are filtered)');

			$archiver = Factory::getArchiverEngine();

			if ($this->current_directory != $this->remove_path_prefix)
			{
				$archiver->addFile($this->current_directory, $this->remove_path_prefix, $this->path_prefix);
			}
		}
	}

	/**
	 * Implements the _finalize() abstract method
	 *
	 */
	protected function _finalize()
	{
		Factory::getLog()->info("Finalizing archive");
		$archive = Factory::getArchiverEngine();
		$archive->finalize();

		Factory::getLog()->debug("Archive is finalized");

		$this->setState(self::STATE_FINISHED);
	}

	/**
	 * Gets the next directory to scan from the stack. It also applies folder
	 * filters (directory exclusion, subdirectory exclusion, file exclusion),
	 * updating the operation toggle properties of the class.
	 *
	 * @return   boolean  True if we found a directory, false if the directory
	 *                    stack is empty. It also returns true if the folder is
	 *                    filtered (we are told to skip it)
	 */
	protected function getNextDirectory()
	{
		// Reset the file / folder scanning positions
		$this->getFiles_position       = null;
		$this->getFolders_position     = null;
		$this->done_file_scanning      = false;
		$this->done_subdir_scanning    = false;
		$this->excluded_folder         = false;
		$this->excluded_subdirectories = false;
		$this->excluded_files          = false;

		if ((is_array($this->directory_list) || $this->directory_list instanceof \Countable ? count($this->directory_list) : 0) == 0)
		{
			// No directories left to scan
			return false;
		}
		else
		{
			// Get and remove the last entry from the $directory_list array
			$this->current_directory = array_pop($this->directory_list);
			$this->setStep($this->current_directory);
			$this->processed_files_counter = 0;
		}

		[$root, $translated_root, $dir] = $this->getCleanDirectoryComponents();

		// Get a filters instance
		$filters = Factory::getFilters();

		// Apply DEF (directory exclusion filters)
		// Note: the !empty($dir) prevents the site's root from being filtered out
		if ($filters->isFiltered($dir, $root, 'dir', 'all') && !empty($dir))
		{
			Factory::getLog()->info("Skipping directory " . $this->current_directory);
			$this->done_subdir_scanning = true;
			$this->done_file_scanning   = true;
			$this->excluded_folder      = true;

			return true;
		}

		// Apply Skip Contained Directories Filters
		if ($filters->isFiltered($dir, $root, 'dir', 'children'))
		{
			$this->excluded_subdirectories = true;

			Factory::getLog()->info("Skipping subdirectories of directory " . $this->current_directory);

			$this->done_subdir_scanning = true;
		}

		// Apply Skipfiles
		if ($filters->isFiltered($dir, $root, 'dir', 'content'))
		{
			$this->excluded_files = true;

			Factory::getLog()->info("Skipping files of directory " . $this->current_directory);

			$this->done_file_scanning = true;

			// When the files of a folder are skipped we will have to add some
			// files anyway if they are present. These are files used to
			// prevent direct access to the folder.

			// Try to find and include .htaccess and index.htm(l) files
			// # Fix 2.4: Do not add DIRECTORY_SEPARATOR if we are on the site's root and it's an empty string
			$ds                            = ($this->current_directory == '') || ($this->current_directory == '/') ? '' : DIRECTORY_SEPARATOR;
			$checkForTheseFiles            = [
				$this->current_directory . $ds . '.htaccess',
				$this->current_directory . $ds . 'web.config',
				$this->current_directory . $ds . 'index.html',
				$this->current_directory . $ds . 'index.htm',
				$this->current_directory . $ds . 'robots.txt',
			];
			$this->processed_files_counter = 0;

			foreach ($checkForTheseFiles as $fileName)
			{
				if (@file_exists($fileName))
				{
					// Fix 3.3 - We have to also put them through other filters, ahem!
					if (!$filters->isFiltered($fileName, $root, 'file', 'all'))
					{
						$this->file_list[] = $fileName;
						$this->processed_files_counter++;
					}
				}
			}
		}

		return true;
	}

	/**
	 * Try to add some files from the $file_list into the archive
	 *
	 * @return   boolean   True if there were files packed, false otherwise
	 *                     (empty filelist or fatal error)
	 */
	protected function pack_files()
	{
		// Get a reference to the archiver and the timer classes
		$archiver      = Factory::getArchiverEngine();
		$timer         = Factory::getTimer();
		$configuration = Factory::getConfiguration();

		// Check whether we need to immediately post-processing a done part
		if (self::postProcessDonePartFile($archiver, $configuration))
		{
			return true;
		}

		// If the archiver has work to do, make sure it finished up before continuing
		if ($configuration->get('volatile.engine.archiver.processingfile', false))
		{
			Factory::getLog()->debug("Continuing file packing from previous step");
			$archiver->addFile('', '', '');

			// If that was the last step for packing this file, mark a file done
			if (!$configuration->get('volatile.engine.archiver.processingfile', false))
			{
				$this->progressMarkFileDone();
			}
		}

		// Did it finish, or does it have more work to do?
		if ($configuration->get('volatile.engine.archiver.processingfile', false))
		{
			// More work to do. Let's just tell our parent that we finished up successfully.
			return true;
		}

		// Normal file backup loop; we keep on processing the file list, packing files as we go.
		if ((is_array($this->file_list) || $this->file_list instanceof \Countable ? count($this->file_list) : 0) == 0)
		{
			// No files left to pack. Return true and let the engine loop
			$this->progressMarkFolderDone();

			return true;
		}
		else
		{
			Factory::getLog()->debug("Packing files");
			$packedSize    = 0;
			$numberOfFiles = 0;

			[$usec, $sec] = explode(" ", microtime());
			$opStartTime = ((float) $usec + (float) $sec);

			$largeFileThreshold = Factory::getConfiguration()->get('engine.scan.common.largefile', 10485760);

			while (((is_array($this->file_list) || $this->file_list instanceof \Countable ? count($this->file_list) : 0) > 0))
			{
				$file = @array_shift($this->file_list);
				$size = 0;
				if (file_exists($file))
				{
					$size = @filesize($file);
				}
				// Anticipatory file size algorithm
				if (($numberOfFiles > 0) && ($size > $largeFileThreshold))
				{
					if (!Factory::getConfiguration()->get('akeeba.tuning.nobreak.beforelargefile', 0))
					{
						// If the file is bigger than the big file threshold, break the step
						// to avoid potential timeouts
						$this->setBreakFlag();
						Factory::getLog()->info("Breaking step _before_ large file: " . $file . " - size: " . $size);
						// Push the file back to the list.
						array_unshift($this->file_list, $file);

						// Return true and let the engine loop
						return true;
					}
				}

				// Proactive potential timeout detection
				// Rough estimation of packing speed in bytes per second
				[$usec, $sec] = explode(" ", microtime());

				$opEndTime = ((float) $usec + (float) $sec);

				if (($opEndTime - $opStartTime) == 0)
				{
					$_packSpeed = 0;
				}
				else
				{
					$_packSpeed = $packedSize / ($opEndTime - $opStartTime);
				}

				// Estimate required time to pack next file. If it's the first file of this operation,
				// do not impose any limitations.
				$_reqTime = ($_packSpeed - 0.01) <= 0 ? 0 : $size / $_packSpeed;

				// Do we have enough time?
				if ($timer->getTimeLeft() < $_reqTime)
				{
					if (!Factory::getConfiguration()->get('akeeba.tuning.nobreak.proactive', 0))
					{
						array_unshift($this->file_list, $file);
						Factory::getLog()->info("Proactive step break - file: " . $file . " - size: " . $size . " - req. time " . sprintf('%2.2f', $_reqTime));
						$this->setBreakFlag();

						return true;
					}
				}

				$packedSize += $size;
				$numberOfFiles++;
				$archiver->addFile($file, $this->remove_path_prefix, $this->path_prefix);

				// If no more processing steps are required, mark a done file
				if (!$configuration->get('volatile.engine.archiver.processingfile', false))
				{
					$this->progressMarkFileDone();
				}

				// If this was the first file packed and we've already gone past
				// the large file size threshold break the step. Continuing with
				// more operations after packing such a big file is increasing
				// the risk to hit a timeout.
				if (($packedSize > $largeFileThreshold) && ($numberOfFiles == 1))
				{
					if (!Factory::getConfiguration()->get('akeeba.tuning.nobreak.afterlargefile', 0))
					{
						Factory::getLog()->info("Breaking step *after* large file: " . $file . " - size: " . $size);
						$this->setBreakFlag();

						return true;
					}
				}

				// If we have to continue processing the file, break the file packing loop forcibly
				if ($configuration->get('volatile.engine.archiver.processingfile', false))
				{
					return true;
				}
			}

			// True if we have more files, false if we're done packing
			return ((is_array($this->file_list) || $this->file_list instanceof \Countable ? count($this->file_list) : 0) > 0);
		}
	}

	protected function progressAddFile()
	{
		$this->total_files++;
	}

	protected function progressMarkFileDone()
	{
		$this->done_files++;
	}

	protected function progressAddFolder()
	{
		$this->total_folders++;
	}

	protected function progressMarkFolderDone()
	{
		$this->done_folders++;
	}

	/**
	 * Returns the site root, the translated site root and the translated current directory
	 *
	 * @return array
	 */
	protected function getCleanDirectoryComponents()
	{
		$fsUtils = Factory::getFilesystemTools();

		// Break directory components
		if (Factory::getConfiguration()->get('akeeba.platform.override_root', 0))
		{
			$siteroot = Factory::getConfiguration()->get('akeeba.platform.newroot', '[SITEROOT]');
		}
		else
		{
			$siteroot = '[SITEROOT]';
		}

		$root = $this->root;

		if ($this->root == $siteroot)
		{
			$translated_root = $fsUtils->translateStockDirs($siteroot, true);
		}
		else
		{
			$translated_root = $this->remove_path_prefix;
		}

		$dir = $fsUtils->TrimTrailingSlash($this->current_directory);

		if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')
		{
			$translated_root = $fsUtils->TranslateWinPath($translated_root);
			$dir             = $fsUtils->TranslateWinPath($dir);
		}

		if (substr($dir, 0, strlen($translated_root)) == $translated_root)
		{
			$dir = substr($dir, strlen($translated_root));
		}
		elseif (in_array(substr($translated_root, -1), ['/', '\\']))
		{
			$new_translated_root = rtrim($translated_root, '/\\');
			if (substr($dir, 0, strlen($new_translated_root)) == $new_translated_root)
			{
				$dir = substr($dir, strlen($new_translated_root));
			}
		}

		if (substr($dir, 0, 1) == '/')
		{
			$dir = substr($dir, 1);
		}

		return [$root, $translated_root, $dir];
	}

	/**
	 * Steps the subdirectory scanning of the current directory
	 *
	 * @return  boolean  True on success, false on fatal error
	 */
	protected function scanSubdirs()
	{
		$engine         = Factory::getScanEngine();
		$subdirectories = false;

		[$root, $translated_root, $dir] = $this->getCleanDirectoryComponents();

		// Get a filters instance
		$filters = Factory::getFilters();

		if (is_null($this->getFolders_position))
		{
			Factory::getLog()->info("Scanning directories of " . $this->current_directory);
		}
		else
		{
			Factory::getLog()->info("Resuming scanning directories of " . $this->current_directory);
		}

		// Get subdirectories
		$exception = null;

		try
		{
			$subdirectories = $engine->getFolders($this->current_directory, $this->getFolders_position);
		}
		catch (WarningException $e)
		{
			Factory::getLog()->warning($e->getMessage());

			$subdirectories = false;
		}
		catch (Exception $e)
		{
			$exception = $e;
		}

		// If the list contains "too many" items, please break this step!
		if (Factory::getConfiguration()->get('volatile.breakflag', false))
		{
			// Log the step break decision, for debugging reasons
			Factory::getLog()->info("Large directory " . $this->current_directory . " while scanning for subdirectories; I will resume scanning in next step.");

			// Return immediately, marking that we are not done yet!
			return true;
		}

		// Error control
		if (!is_null($exception))
		{
			throw $exception;
		}

		// Start adding the subdirectories
		if (!empty($subdirectories) && is_array($subdirectories))
		{
			$dereferenceSymlinks = Factory::getConfiguration()->get('engine.archiver.common.dereference_symlinks');

			// If we have to treat symlinks as real directories just add everything
			if ($dereferenceSymlinks)
			{
				// Treat symlinks to directories as actual directories
				foreach ($subdirectories as $subdirectory)
				{
					$this->directory_list[] = $subdirectory;
					$this->progressAddFolder();
				}
			}
			// If we are told not to dereference symlinks we'll need to check each subdirectory thoroughly
			else
			{
				// Treat symlinks to directories as simple symlink files (ONLY WORKS WITH CERTAIN ARCHIVERS!)
				foreach ($subdirectories as $subdirectory)
				{
					if (is_link($subdirectory))
					{
						// Symlink detected; apply directory filters to it
						if (empty($dir))
						{
							$dirSlash = $dir;
						}
						else
						{
							$dirSlash = $dir . '/';
						}

						$check = $dirSlash . basename($subdirectory);
						Factory::getLog()->debug("Directory symlink detected: $check");

						if (_AKEEBA_IS_WINDOWS)
						{
							$check = Factory::getFilesystemTools()->TranslateWinPath($check);
						}

						// Do I need this? $dir contains a path relative to the root anyway...
						$check = ltrim(str_replace($translated_root, '', $check), '/');

						// Check for excluded symlinks (note that they are excluded as DIRECTORIES in the GUI)
						if ($filters->isFiltered($check, $root, 'dir', 'all'))
						{
							Factory::getLog()->info("Skipping directory symlink " . $check);
						}
						else
						{
							Factory::getLog()->debug('Adding folder symlink: ' . $check);
							$this->file_list[] = $subdirectory;
							$this->progressAddFile();
						}
					}
					else
					{
						$this->directory_list[] = $subdirectory;
						$this->progressAddFolder();
					}
				}
			}
		}

		// If the scanner nullified the next position to scan, we're done
		// scanning for subdirectories
		if (is_null($this->getFolders_position))
		{
			$this->done_subdir_scanning = true;
		}

		return true;
	}

	/**
	 * Steps the files scanning of the current directory
	 *
	 * @return  void  True on success, false on fatal error
	 * @throws Exception
	 */
	protected function scanFiles()
	{
		$engine   = Factory::getScanEngine();
		$fileList = false;

		[$root, $translated_root, $dir] = $this->getCleanDirectoryComponents();

		// Get a filters instance
		$filters = Factory::getFilters();

		if (is_null($this->getFiles_position))
		{
			Factory::getLog()->info("Scanning files of " . $this->current_directory);
			$this->processed_files_counter = 0;
		}
		else
		{
			Factory::getLog()->info("Resuming scanning files of " . $this->current_directory);
		}

		// Get file listing
		$exception = null;

		try
		{
			$fileList = $engine->getFiles($this->current_directory, $this->getFiles_position);
		}
		catch (WarningException $e)
		{
			Factory::getLog()->warning($e->getMessage());

			$fileList = false;
		}
		catch (Exception $e)
		{
			$exception = $e;
		}

		// If the list contains "too many" items, please break this step!
		if (Factory::getConfiguration()->get('volatile.breakflag', false))
		{
			// Log the step break decision, for debugging reasons
			Factory::getLog()->info("Large directory " . $this->current_directory . " while scanning for files; I will resume scanning in next step.");

			// Return immediately, marking that we are not done yet!
			return;
		}

		// Error control
		if (!is_null($exception))
		{
			throw $exception;
		}

		// Do I have an unreadable directory?
		if ($fileList === false)
		{
			Factory::getLog()->warning('Unreadable directory ' . $this->current_directory);

			$this->done_file_scanning = true;
		}
		// Directory was readable, process the file list
		elseif (is_array($fileList) && !empty($fileList))
		{
			// Add required trailing slash to $dir
			if (!empty($dir))
			{
				$dir .= '/';
			}

			// Scan all directory entries
			foreach ($fileList as $fileName)
			{
				$check = $dir . basename($fileName);

				if (_AKEEBA_IS_WINDOWS)
				{
					$check = Factory::getFilesystemTools()->TranslateWinPath($check);
				}

				// Do I need this? $dir contains a path relative to the root anyway...
				$check        = ltrim(str_replace($translated_root, '', $check), '/');
				$byFilter     = '';
				$skipThisFile = $filters->isFilteredExtended($check, $root, 'file', 'all', $byFilter);

				if ($skipThisFile)
				{
					Factory::getLog()->info("Skipping file $fileName (filter: $byFilter)");
				}
				else
				{
					$this->file_list[] = $fileName;
					$this->processed_files_counter++;
					$this->progressAddFile();
				}
			}
		}

		// If the scanner engine nullified the next position we are done
		// scanning for files
		if (is_null($this->getFiles_position))
		{
			$this->done_file_scanning = true;
		}

		// If the directory was genuinely empty we will have to add an empty
		// directory entry in the archive, otherwise this directory will never
		// be restored.
		if ($this->done_file_scanning && ($this->processed_files_counter == 0))
		{
			Factory::getLog()->info("Empty directory " . $this->current_directory);

			$archiver = Factory::getArchiverEngine();

			if ($this->current_directory != $this->remove_path_prefix)
			{
				$archiver->addFile($this->current_directory, $this->remove_path_prefix, $this->path_prefix);
			}

			unset($archiver);
		}

		return;
	}

	/**
	 * Try to determine the next root folder to scan
	 *
	 * @return  boolean  True if there was a new root to scan
	 */
	protected function getNextRoot()
	{
		// We have finished with our directory list. Hmm... Do we have extra directories?
		if (count($this->root_definitions) > 0)
		{
			Factory::getLog()->debug("More off-site directories detected");
			$registry       = Factory::getConfiguration();
			$dir_definition = array_shift($this->root_definitions);

			$this->remove_path_prefix = $dir_definition[0]; // Remove absolute path to directory when storing the file

			if (is_null($dir_definition[1]))
			{
				$this->path_prefix = ''; // No added path for main site
			}
			else
			{
				$dir_definition[1] = trim($dir_definition[1]);

				if (empty($dir_definition[1]) || $dir_definition[1] == '/')
				{
					$this->path_prefix = '';
				}
				else
				{
					$this->path_prefix = $registry->get('akeeba.advanced.virtual_folder') . '/' . $dir_definition[1];
				}
			}

			$this->done_scanning = false; // Make sure we process this file list!
			$this->root          = $dir_definition[0];

			// Translate the root into an absolute path
			$stock_dirs   = Platform::getInstance()->get_stock_directories();
			$absolute_dir = substr($this->root, 0);

			if (!empty($stock_dirs))
			{
				foreach ($stock_dirs as $key => $replacement)
				{
					$absolute_dir = str_replace($key, $replacement, $absolute_dir);
				}
			}

			$this->directory_list[]   = $absolute_dir;
			$this->remove_path_prefix = $absolute_dir;

			$registry->set('volatile.filesystem.current_root', $absolute_dir);

			$this->total_files   = 0;
			$this->done_files    = 0;
			$this->total_folders = 0;
			$this->done_folders  = 0;

			Factory::getLog()->info("Including new off-site directory to " . $dir_definition[1]);

			return true;
		}
		else
			// Nope, we are completely done!
		{
			$this->setState(self::STATE_POSTRUN);

			return false;
		}
	}
}
components/com_akeeba/BackupEngine/Core/Domain/Init.php000060400000035070152453623440017056 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Core\Domain;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Base\Part;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use RuntimeException;

/**
 * Backup initialization domain
 */
final class Init extends Part
{
	/** @var   string  The backup description */
	private $description = '';

	/** @var   string  The backup comment */
	private $comment = '';

	/**
	 * Implements the constructor of the class
	 *
	 * @return  void
	 */
	public function __construct()
	{
		parent::__construct();

		Factory::getLog()->debug(__CLASS__ . " :: New instance");
	}

	/**
	 * Converts a PHP error to a string
	 *
	 * @return  string
	 */
	public static function error2string()
	{
		if (!function_exists('error_reporting'))
		{
			return "Not applicable; host too restrictive";
		}

		$value       = error_reporting();
		$level_names = [
			E_ERROR         => 'E_ERROR', E_WARNING => 'E_WARNING',
			E_PARSE         => 'E_PARSE', E_NOTICE => 'E_NOTICE',
			E_CORE_ERROR    => 'E_CORE_ERROR', E_CORE_WARNING => 'E_CORE_WARNING',
			E_COMPILE_ERROR => 'E_COMPILE_ERROR', E_COMPILE_WARNING => 'E_COMPILE_WARNING',
			E_USER_ERROR    => 'E_USER_ERROR', E_USER_WARNING => 'E_USER_WARNING',
			E_USER_NOTICE   => 'E_USER_NOTICE',
		];

		if (defined('E_STRICT'))
		{
			$level_names[E_STRICT] = 'E_STRICT';
		}

		$levels = [];

		if (($value & E_ALL) == E_ALL)
		{
			$levels[] = 'E_ALL';
			$value    &= ~E_ALL;
		}

		foreach ($level_names as $level => $name)
		{
			if (($value & $level) == $level)
			{
				$levels[] = $name;
			}
		}

		return implode(' | ', $levels);
	}

	/**
	 * Reports whether the error display (output to HTML) is enabled or not
	 *
	 * @return string
	 */
	public static function errordisplay()
	{
		if (!function_exists('ini_get'))
		{
			return "Not applicable; host too restrictive";
		}

		return ini_get('display_errors') ? 'on' : 'off';
	}

	/**
	 * Implements the _prepare abstract method
	 *
	 * @return  void
	 */
	protected function _prepare()
	{
		// Load parameters (description and comment)
		$jpskey   = '';
		$angiekey = '';

		if (!empty($this->_parametersArray))
		{
			$params = $this->_parametersArray;

			if (isset($params['description']))
			{
				$this->description = $params['description'];
			}

			if (isset($params['comment']))
			{
				$this->comment = $params['comment'];
			}

			if (isset($params['jpskey']))
			{
				$jpskey = $params['jpskey'];
			}

			if (isset($params['angiekey']))
			{
				$angiekey = $params['angiekey'];
			}
		}

		// Load configuration -- No. This is already done by the model. Doing it again removes all overrides.
		// Platform::getInstance()->load_configuration();

		// Initialize counters
		$registry = Factory::getConfiguration();

		if (!empty($jpskey))
		{
			$registry->set('engine.archiver.jps.key', $jpskey);
		}

		if (!empty($angiekey))
		{
			$registry->set('engine.installer.angie.key', $angiekey);
		}

		// Initialize temporary storage
		Factory::getFactoryStorage()->reset();

		// Force load the tag -- do not delete!
		$kettenrad = Factory::getKettenrad();
		$tag       = $kettenrad->getTag(); // Yes, this is an unused variable by we MUST run this method. DO NOT DELETE.

		// Push the comment and description in temp vars for use in the installer phase
		$registry->set('volatile.core.description', $this->description);
		$registry->set('volatile.core.comment', $this->comment);

		$this->setState(self::STATE_PREPARED);
	}

	/**
	 * Implements the _run() abstract method
	 *
	 * @return  void
	 */
	protected function _run()
	{
		if ($this->getState() == self::STATE_POSTRUN)
		{
			Factory::getLog()->debug(__CLASS__ . " :: Already finished");
			$this->setStep('');
			$this->setSubstep('');

			return;
		}
		else
		{
			$this->setState(self::STATE_RUNNING);
		}

		// Initialise the extra notes variable, used by platform classes to return warnings and errors
		$extraNotes = null;

		// Load the version defines
		Platform::getInstance()->load_version_defines();

		$registry = Factory::getConfiguration();

		// Write log file's header
		$version = defined('AKEEBABACKUP_VERSION') ? AKEEBABACKUP_VERSION : AKEEBA_VERSION;
		$date    = defined('AKEEBABACKUP_DATE') ? AKEEBABACKUP_DATE : AKEEBA_DATE;

		Factory::getLog()->info("--------------------------------------------------------------------------------");
		Factory::getLog()->info("Akeeba Backup " . $version . ' (' . $date . ')');
		Factory::getLog()->info("--------------------------------------------------------------------------------");

		// PHP configuration variables are tried to be logged only for debug and info log levels
		if ($registry->get('akeeba.basic.log_level') >= 2)
		{
			Factory::getLog()->info("--- System Information ---");
			Factory::getLog()->info("PHP Version        :" . PHP_VERSION);
			Factory::getLog()->info("PHP OS             :" . PHP_OS);
			Factory::getLog()->info("PHP SAPI           :" . PHP_SAPI);

			if (function_exists('php_uname'))
			{
				Factory::getLog()->info("OS Version         :" . php_uname('s'));
			}

			$db = Factory::getDatabase();
			Factory::getLog()->info("DB Version         :" . $db->getVersion());

			if (isset($_SERVER['SERVER_SOFTWARE']))
			{
				$server = $_SERVER['SERVER_SOFTWARE'];
			}
			elseif (($sf = getenv('SERVER_SOFTWARE')))
			{
				$server = $sf;
			}
			else
			{
				$server = 'n/a';
			}

			Factory::getLog()->info("Web Server         :" . $server);

			$platform     = 'Unknown platform';
			$version      = '(unknown version)';
			$platformData = Platform::getInstance()->getPlatformVersion();
			Factory::getLog()->info($platformData['name'] . " version    :" . $platformData['version']);

			if (isset($_SERVER['HTTP_USER_AGENT']))
			{
				Factory::getLog()->info("User agent         :" . $_SERVER['HTTP_USER_AGENT']);
			}

			Factory::getLog()->info("Safe mode          :" . ini_get("safe_mode"));
			Factory::getLog()->info("Display errors     :" . ini_get("display_errors"));
			Factory::getLog()->info("Error reporting    :" . self::error2string());
			Factory::getLog()->info("Error display      :" . self::errordisplay());
			Factory::getLog()->info("Disabled functions :" . ini_get("disable_functions"));
			Factory::getLog()->info("open_basedir restr.:" . ini_get('open_basedir'));
			Factory::getLog()->info("Max. exec. time    :" . ini_get("max_execution_time"));
			Factory::getLog()->info("Memory limit       :" . ini_get("memory_limit"));

			if (function_exists("memory_get_usage"))
			{
				Factory::getLog()->info("Current mem. usage :" . memory_get_usage());
			}

			if (function_exists("gzcompress"))
			{
				Factory::getLog()->info("GZIP Compression   : available (good)");
			}
			else
			{
				Factory::getLog()->info("GZIP Compression   : n/a (no compression)");
			}

			$extraNotes = Platform::getInstance()->log_platform_special_directories();

			if (!empty($extraNotes) && is_array($extraNotes))
			{
				if (isset($extraNotes['warnings']) && is_array($extraNotes['warnings']))
				{
					foreach ($extraNotes['warnings'] as $warning)
					{
						Factory::getLog()->warning($warning);
					}
				}

				if (isset($extraNotes['errors']) && is_array($extraNotes['errors']))
				{
					foreach ($extraNotes['errors'] as $error)
					{
						Factory::getLog()->error($error);
					}

					if (!empty($extraNotes['errors']))
					{
						throw new RuntimeException($extraNotes['errors'][0]);
					}
				}
			}

			$min_time = $registry->get('akeeba.tuning.min_exec_time');
			$max_time = $registry->get('akeeba.tuning.max_exec_time');
			$bias     = $registry->get('akeeba.tuning.run_time_bias');

			Factory::getLog()->info("Min/Max/Bias       :" . $min_time . '/' . $max_time . '/' . $bias);
			Factory::getLog()->info("Output directory   :" . $registry->get('akeeba.basic.output_directory'), ['root_translate' => false]);
			Factory::getLog()->info("Part size (bytes)  :" . $registry->get('engine.archiver.common.part_size', 0));
			Factory::getLog()->info("--------------------------------------------------------------------------------");
		}

		// Quirks reporting
		$quirks = Factory::getConfigurationChecks()->getDetailedStatus(true);

		if (!empty($quirks))
		{
			Factory::getLog()->info("Akeeba Backup has detected the following potential problems:");

			foreach ($quirks as $q)
			{
				Factory::getLog()->info('- ' . $q['code'] . ' ' . $q['description'] . ' (' . $q['severity'] . ')');
			}

			Factory::getLog()->info("You probably do not have to worry about them, but you should be aware of them.");
			Factory::getLog()->info("--------------------------------------------------------------------------------");
		}

		$phpVersion = PHP_VERSION;

		if (version_compare($phpVersion, '7.3.0', 'lt'))
		{
			Factory::getLog()->warning("You are using PHP $phpVersion which is officially End of Life. We recommend using PHP 7.4 or later for best results. Your version of PHP, $phpVersion, will stop being supported by this backup software in the future.");
		}

		// Report profile ID
		$profile_id = Platform::getInstance()->get_active_profile();
		Factory::getLog()->info("Loaded profile #$profile_id");

		// Get archive name
		[$relativeArchiveName, $absoluteArchiveName] = $this->getArchiveName();

		// ==== Stats initialisation ===
		$origin     = Platform::getInstance()->get_backup_origin(); // Get backup origin
		$profile_id = Platform::getInstance()->get_active_profile(); // Get active profile

		$registry   = Factory::getConfiguration();
		$backupType = $registry->get('akeeba.basic.backup_type');
		Factory::getLog()->debug("Backup type is now set to '" . $backupType . "'");

		// Substitute "variables" in the archive name
		$fsUtils     = Factory::getFilesystemTools();
		$description = $fsUtils->replace_archive_name_variables($this->description);
		$comment     = $fsUtils->replace_archive_name_variables($this->comment);

		if ($registry->get('volatile.writer.store_on_server', true))
		{
			// Archive files are stored on our server
			$stat_relativeArchiveName = $relativeArchiveName;
			$stat_absoluteArchiveName = $absoluteArchiveName;
		}
		else
		{
			// Archive files are not stored on our server (FTP backup, cloud backup, sent by email, etc)
			$stat_relativeArchiveName = '';
			$stat_absoluteArchiveName = '';
		}

		$kettenrad = Factory::getKettenrad();

		$temp = [
			'description'   => $description,
			'comment'       => $comment,
			'backupstart'   => Platform::getInstance()->get_timestamp_database(),
			'status'        => 'run',
			'origin'        => $origin,
			'type'          => $backupType,
			'profile_id'    => $profile_id,
			'archivename'   => $stat_relativeArchiveName,
			'absolute_path' => $stat_absoluteArchiveName,
			'multipart'     => 0,
			'filesexist'    => 1,
			'tag'           => $kettenrad->getTag(),
			'backupid'      => $kettenrad->getBackupId(),
		];

		// Save the entry
		$statistics = Factory::getStatistics();
		$statistics->setStatistics($temp);
		$statistics->release_multipart_lock();

		// Initialize the archive.
		if (Factory::getEngineParamsProvider()->getScriptingParameter('core.createarchive', true))
		{
			Factory::getLog()->debug("Expanded archive file name: " . $absoluteArchiveName);

			Factory::getLog()->debug("Initializing archiver engine");
			$archiver = Factory::getArchiverEngine();
			$archiver->initialize($absoluteArchiveName);
			$archiver->setComment($comment); // Add the comment to the archive itself.
		}

		$this->setState(self::STATE_POSTRUN);
	}

	/**
	 * Implements the abstract _finalize method
	 *
	 * @return  void
	 */
	protected function _finalize()
	{
		$this->setState(self::STATE_FINISHED);
	}

	/**
	 * Returns the relative and absolute path to the archive
	 */
	protected function getArchiveName()
	{
		$registry = Factory::getConfiguration();

		// Import volatile scripting keys to the registry
		Factory::getEngineParamsProvider()->importScriptingToRegistry();

		// Determine the extension
		$force_extension = Factory::getEngineParamsProvider()->getScriptingParameter('core.forceextension', null);

		if (is_null($force_extension))
		{
			$archiver  = Factory::getArchiverEngine();
			$extension = $archiver->getExtension();
		}
		else
		{
			$extension = $force_extension;
		}

		// Get the template name
		$templateName = $registry->get('akeeba.basic.archive_name');
		Factory::getLog()->debug("Archive template name: $templateName");

		/**
		 * Security: Protect archives in the default backup output directory
		 *
		 * If the configured backup output directory is the same as the default backup output directory the following
		 * actions are taken:
		 *
		 * 1. The backup archive name must include [RANDOM]. If it doesn't, '-[RANDOM]' will be appended to it.
		 * 2. We make sure that the direct web access blocking files .htaccess, web.config, index.html, index.htm and
		 *    index.php exist in that directory. If they do not they will be forcibly added.
		 */
		$configuredOutputPath = $registry->get('akeeba.basic.output_directory');
		$stockDirs            = Platform::getInstance()->get_stock_directories();
		$defaultOutputPath    = $stockDirs['[DEFAULT_OUTPUT]'];
		$fsUtils              = Factory::getFilesystemTools();

		if (@realpath($configuredOutputPath) === @realpath($defaultOutputPath))
		{
			$this->ensureHasRandom($templateName);

			$fsUtils->ensureNoAccess($defaultOutputPath);
		}

		// Parse all tags
		$fsUtils      = Factory::getFilesystemTools();
		$templateName = $fsUtils->replace_archive_name_variables($templateName);

		Factory::getLog()->debug("Expanded template name: $templateName");

		$relative_path = $templateName . $extension;
		$absolute_path = $fsUtils->TranslateWinPath($configuredOutputPath . DIRECTORY_SEPARATOR . $relative_path);

		return [$relative_path, $absolute_path];
	}

	/**
	 * Make sure that the archive template name contains the [RANDOM] variable.
	 *
	 * @param   string  $templateName
	 *
	 * @return void
	 */
	protected function ensureHasRandom(&$templateName)
	{
		if (strpos($templateName, '[RANDOM]') !== false)
		{
			return;
		}

		$templateName .= '-[RANDOM]';
	}
}
components/com_akeeba/BackupEngine/Core/Domain/Installer.php000060400000015041152453623440020104 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Core\Domain;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Base\Part;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use Akeeba\Engine\Util\HashTrait;

/**
 * Installer deployment
 */
final class Installer extends Part
{
	use HashTrait;

	/** @var int Installer image file offset last read */
	private $offset;

	/** @var int How much installer data I have processed yet */
	private $runningSize = 0;

	/** @var int Installer image file index last read */
	private $xformIndex = 0;

	/** @var int Percentage of process done */
	private $progress = 0;

	/**
	 * Public constructor
	 *
	 * @return  void
	 */
	public function __construct()
	{
		parent::__construct();

		Factory::getLog()->debug(__CLASS__ . " :: New instance");
	}

	/**
	 * Implements the _prepare abstract method
	 *
	 */
	function _prepare()
	{
		$archive = Factory::getArchiverEngine();

		// Add the backup description and comment in a README.html file in the
		// installation directory. This makes it the first file in the archive.
		if (!empty($this->installerSettings->readme ?? ''))
		{
			$data = $this->createReadme();
			$archive->addFileVirtual('README.html', $this->installerSettings->installerroot, $data);
		}

		if (!empty($this->installerSettings->extrainfo ?? ''))
		{
			$data = $this->createExtrainfo();
			$archive->addFileVirtual('extrainfo.json', $this->installerSettings->installerroot, $data);
		}

		if (!empty($this->installerSettings->password ?? ''))
		{
			$data = $this->createPasswordFile();

			if (!empty($data))
			{
				$archive->addFileVirtual('password.php', $this->installerSettings->installerroot, $data);
			}
		}

		$this->progress = 0;

		// Set our state to prepared
		$this->setState(self::STATE_PREPARED);
	}

	/**
	 * Implements the _run() abstract method
	 */
	function _run()
	{
		if ($this->getState() == self::STATE_POSTRUN)
		{
			Factory::getLog()->debug(__CLASS__ . " :: Already finished");
			$this->setStep('');
			$this->setSubstep('');
		}
		else
		{
			$this->setState(self::STATE_RUNNING);
		}

		// Try to step the archiver
		$archive = Factory::getArchiverEngine();
		$ret     = $archive->transformJPA($this->xformIndex, $this->offset);

		if ($ret !== false)
		{
			$this->offset     = $ret['offset'];
			$this->xformIndex = $ret['index'];
			$this->setStep($ret['filename']);
		}

		// Check for completion
		if ($ret['done'])
		{
			Factory::getLog()->debug(__CLASS__ . ":: archive is initialized");
			$this->setState(self::STATE_FINISHED);
		}

		// Calculate percentage
		$this->runningSize += $ret['chunkProcessed'] ?? 0;

		if ($ret['filesize'] > 0)
		{
			$this->progress = $this->runningSize / $ret['filesize'];
		}
	}

	/**
	 * Implements the _finalize() abstract method
	 *
	 */
	function _finalize()
	{
		$this->setState(self::STATE_FINISHED);
		$this->progress = 1;
	}

	/**
	 * Implements the progress calculation based on how much of the installer image
	 * archive we have processed so far.
	 */
	public function getProgress()
	{
		return $this->progress;
	}

	/**
	 * Creates the contents of an HTML file with the description and comment of
	 * the backup. This file will be saved as README.html in the installer's root
	 * directory, as specified by the embedded installer's settings.
	 *
	 * @return string The contents of the HTML file.
	 */
	protected function createReadme()
	{
		$config = Factory::getConfiguration();

		$version = defined('AKEEBABACKUP_VERSION') ? AKEEBABACKUP_VERSION : AKEEBA_VERSION;
		$date    = defined('AKEEBABACKUP_DATE') ? AKEEBABACKUP_DATE : AKEEBA_DATE;
		$pro     = defined('AKEEBABACKUP_PRO') ? AKEEBABACKUP_PRO : AKEEBA_PRO;

		$lbl_version   = $version . ' (' . $date . ')';
		$lbl_coreorpro = ($pro == 1) ? 'Professional' : 'Core';

		$description = $config->get('volatile.core.description', '');
		$comment     = $config->get('volatile.core.comment', '');

		$config->set('volatile.core.description', null);
		$config->set('volatile.core.comment', null);

		return <<<ENDHTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>Akeeba Backup Archive Identity</title>
</head>
<body>
	<h1>Backup Description</h1>
	<p id="description"><![CDATA[$description]]></p>
	<h1>Backup Comment</h1>
	<div id="comment">
	$comment
	</div>
	<hr/>
	<p>
		Akeeba Backup $lbl_coreorpro $lbl_version
	</p>
</body>
</html>
ENDHTML;
	}

	protected function createExtrainfo()
	{
		$abversion  = defined('AKEEBABACKUP_VERSION') ? AKEEBABACKUP_VERSION : AKEEBA_VERSION;
		$host       = Platform::getInstance()->get_host();
		$backupdate = gmdate('Y-m-d H:i:s');
		$phpversion = PHP_VERSION;
		$rootPath   = Platform::getInstance()->get_site_root();

		$data = [
			'host'           => $host,
			'backup_date'    => $backupdate,
			'akeeba_version' => $abversion,
			'php_version'    => $phpversion,
			'root'           => $rootPath,
		];

		$platform = Platform::getInstance();

		try
		{
			$extraData = $platform->get_extra_info();
		}
		catch (\Exception $e)
		{
			// Not all platform classes implement get_extra_info(), therefore Platform will throw an Exception
			$extraData = [];
		}

		$data = array_merge($data, $extraData);

		$ret = json_encode($data, JSON_PRETTY_PRINT);

		return $ret;
	}

	protected function createPasswordFile()
	{
		$config = Factory::getConfiguration();
		$ret    = '';

		$password = $config->get('engine.installer.angie.key', '');

		if (empty($password))
		{
			return $ret;
		}

		$randVal = Factory::getRandval();

		$salt     = $randVal->generateString(32);
		$passhash = self::md5($password . $salt) . ':' . $salt;
		$ret      = "<?php\n";
		$ret      .= "define('AKEEBA_PASSHASH', '" . $passhash . "');\n";

		return $ret;
	}
}
components/com_akeeba/BackupEngine/Core/Domain/Finalizer/RemoveTemporaryFiles.php000060400000002702152453623440024215 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

/**
 * @package     Akeeba\Engine\Core\Domain\Finalizer
 * @subpackage
 *
 * @copyright   A copyright
 * @license     A "Slug" license name e.g. GPL2
 */

namespace Akeeba\Engine\Core\Domain\Finalizer;

use Akeeba\Engine\Factory;

/**
 * Removes temporary files.
 *
 * @since       9.3.1
 * @package     Akeeba\Engine\Core\Domain\Finalizer
 *
 */
final class RemoveTemporaryFiles extends AbstractFinalizer
{
	/**
	 * @inheritDoc
	 */
	public function __invoke()
	{
		$this->setStep('Removing temporary files');
		$this->setSubstep('');
		Factory::getLog()->debug("Removing temporary files");
		Factory::getTempFiles()->deleteTempFiles();

		return true;
	}
}components/com_akeeba/BackupEngine/Core/Domain/Finalizer/FinalizerInterface.php000060400000003171152453623440023637 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

/**
 * @package     Akeeba\Engine\Core\Domain\Finalizer
 * @subpackage
 *
 * @copyright   A copyright
 * @license     A "Slug" license name e.g. GPL2
 */

namespace Akeeba\Engine\Core\Domain\Finalizer;

use Akeeba\Engine\Core\Domain\Finalization;
use Exception;

/**
 * Interface to a finalizer invokable class.
 *
 * @since 9.3.1
 */
interface FinalizerInterface
{
	/**
	 * Public constructor
	 *
	 * @param   Finalization  $finalizationPart  The part we belong to.
	 *
	 * @since   9.3.1
	 */
	public function __construct(Finalization $finalizationPart);

	/**
	 * Executes the finalizer job. Returns true when done, false if it needs to run further.
	 *
	 * @return  bool  True if we are fully done. False if we must be called again.
	 * @throws  Exception  When an error occurs.
	 *
	 * @since   9.3.1
	 */
	public function __invoke();
}components/com_akeeba/BackupEngine/Core/Domain/Finalizer/AbstractQuotaManagement.php000060400000033735152453623440024656 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

/**
 * @package     Akeeba\Engine\Core\Domain\Finalizer
 * @subpackage
 *
 * @copyright   A copyright
 * @license     A "Slug" license name e.g. GPL2
 */

namespace Akeeba\Engine\Core\Domain\Finalizer;

use Akeeba\Engine\Factory;
use DateTime;
use Exception;

abstract class AbstractQuotaManagement extends AbstractFinalizer
{
	/**
	 * Abstraction for the engine configuration keys used in the concrete quota management class.
	 *
	 * @since 9.3.1
	 * @var   string[]
	 */
	protected $configKeys = [
		'maxAgeEnable' => 'akeeba.quota.maxage.enable',
		'maxAgeDays'   => 'akeeba.quota.maxage.maxdays',
		'maxAgeKeep'   => 'akeeba.quota.maxage.keepday',
		'countEnable'  => 'akeeba.quota.enable_count_quota',
		'countValue'   => 'akeeba.quota.count_quota',
		'sizeEnable'   => 'akeeba.quota.enable_size_quota',
		'sizeValue'    => 'akeeba.quota.size_quota',
	];

	/**
	 * The ID of the latest backup (the one we are running in right now)
	 *
	 * @since 9.3.1
	 * @var   int
	 */
	protected $latestBackupId;

	/**
	 * Human-readable quote type e.g. 'local', 'remote', etc. for the concrete quota management class.
	 *
	 * @since 9.3.1
	 * @var   string
	 */
	protected $quotaType = 'local';

	/**
	 * @inheritDoc
	 */
	public function __invoke()
	{
		$this->setStep(
			sprintf(
				'Applying %s quotas',
				$this->quotaType
			)
		);
		$this->setSubstep('');

		// If no quota settings are enabled, quit
		$configuration  = Factory::getConfiguration();
		$timer          = Factory::getTimer();
		$useDayQuotas   = $configuration->get($this->configKeys['maxAgeEnable']);
		$useCountQuotas = $configuration->get($this->configKeys['countEnable']);
		$useSizeQuotas  = $configuration->get($this->configKeys['sizeEnable']);

		if (!($useDayQuotas || $useCountQuotas || $useSizeQuotas))
		{
			Factory::getLog()->debug(
				sprintf(
					'No %s quotas were defined; old backup files will be kept intact',
					$this->quotaType
				)
			);

			return true;
		}

		// Get the latest backup ID
		$statistics           = Factory::getStatistics();
		$this->latestBackupId = $statistics->getId();

		// Try to load the calculated quotas from the volatile keys
		$keyIsCalculated    = sprintf('volatile.quotas.%s.calculated', $this->quotaType);
		$keyRemoveBackupIDs = sprintf('volatile.quotas.%s.removeBackupIDs', $this->quotaType);
		$keyRemoveLogPaths  = sprintf('volatile.quotas.%s.removeLogPaths', $this->quotaType);
		$keyFilesToRemove   = sprintf('volatile.quotas.%s.filesToRemove', $this->quotaType);

		$isCalculated    = $configuration->get($keyIsCalculated, false);
		$removeBackupIDs = $configuration->get($keyRemoveBackupIDs, []);
		$removeLogPaths  = $configuration->get($keyRemoveLogPaths, []);
		$filesToRemove   = $configuration->get($keyFilesToRemove, []);

		// Calculate the quotas if nothing was calculated just yet.
		if (!$isCalculated)
		{
			// Calculate the quotas. If nothing is found, return immediately.
			if ($this->calculateQuotas($allRecords, $removeBackupIDs, $removeLogPaths, $filesToRemove) === false)
			{
				return true;
			}

			$this->saveCalculatedQuotas($removeBackupIDs, $removeLogPaths, $filesToRemove);

			// Do I have enough time to process removals?
			if ($timer->getTimeLeft() <= 0)
			{
				return false;
			}
		}

		// Process a chunk of removals
		if (!$this->processRemovals($removeBackupIDs, $filesToRemove, $removeLogPaths))
		{
			$this->saveCalculatedQuotas($removeBackupIDs, $removeLogPaths, $filesToRemove);

			return false;
		}

		$removeBackupIDs = null;
		$removeLogPaths  = null;
		$filesToRemove   = null;

		$this->saveCalculatedQuotas($removeBackupIDs, $removeLogPaths, $filesToRemove);

		return true;
	}

	/**
	 * Get all the backup records to apply quotas on.
	 *
	 * @return  array
	 *
	 * @since   9.3.1
	 */
	abstract protected function getAllRecords(): array;

	/**
	 * Processes a list of records for removal. The removal DOES NOT take place here.
	 *
	 * @param   array  $allRecords       The records to process
	 * @param   array  $removeBackupIDs  Running tally of backup IDs to remove files from
	 * @param   array  $removeLogPaths   Running tally of log entries to remove
	 * @param   array  $ret              Running tally of arrays of files to remove
	 * @param   array  $leftover         Leftover records to be processed by the next quota rule
	 *
	 * @since   9.3.1
	 */
	protected function markAllRecordsForRemoval(array &$allRecords, array &$removeBackupIDs, array &$removeLogPaths, array &$ret, array &$leftover)
	{
		foreach ($allRecords as $def)
		{
			if ($def['id'] != $this->latestBackupId)
			{
				continue;
			}

			$temp       = array_pop($leftover);
			$leftover[] = $def;
			array_unshift($allRecords, $temp);

			break;
		}

		foreach ($allRecords as $def)
		{
			$ret[]             = $def['filenames'];
			$removeBackupIDs[] = $def['id'];

			if (empty($def['logname']))
			{
				continue;
			}

			$filePath = $def['absolute_path'];

			if (empty($filePath))
			{
				continue;
			}

			$logPath = dirname($filePath) . '/' . $def['logname'];

			if (@file_exists($logPath))
			{
				$removeLogPaths[] = $logPath;

				continue;
			}

			$altLogPath = substr($logPath, 0, -4);

			if (@file_exists($altLogPath))
			{
				/**
				 * Bad host: the log file akeeba.tag.log.php may not exist but the akeeba.tag.log file
				 * does. This code addresses this problem.
				 */
				$removeLogPaths[] = $altLogPath;
			}
		}
	}

	/**
	 * Performs the actual removal.
	 *
	 * @param   array  $removeBackupIDs  The backup IDs which will have their files removed
	 * @param   array  $filesToRemove    The flat list of files to remove
	 * @param   array  $removeLogPaths   The flat list of log paths to remove
	 *
	 * @return  bool  True if we are done, false to come back in the next step of the engine
	 * @throws  Exception
	 * @since   9.3.1
	 */
	abstract protected function processRemovals(array &$removeBackupIDs, array &$filesToRemove, array &$removeLogPaths): bool;

	/**
	 * Applies the Count Quotas.
	 *
	 * @param   array  $allRecords       All records left to process
	 * @param   array  $removeBackupIDs  Running tally of backup IDs to remove files from
	 * @param   array  $removeLogPaths   Running tally of log entries to remove
	 * @param   array  $ret              Running tally of arrays of files to remove
	 *
	 * @return  void
	 * @since   9.3.1
	 */
	private function applyCountQuotas(array &$allRecords, array &$removeBackupIDs, array &$removeLogPaths, array &$ret)
	{
		$configuration  = Factory::getConfiguration();
		$useCountQuotas = $configuration->get($this->configKeys['countEnable']);
		$countQuota     = $configuration->get($this->configKeys['countValue']);

		// Do we need to apply count quotas?
		if (!$useCountQuotas || !is_numeric($countQuota) || $countQuota <= 0)
		{
			return;
		}

		// We should only run a count quota if there are more files than the set limit
		if (count($allRecords) <= $countQuota)
		{
			return;
		}

		Factory::getLog()->debug(
			sprintf(
				'Processing %s count quotas',
				$this->quotaType
			)
		);

		/**
		 * Backups are sorted by reverse ID order, e.g. 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, 188.
		 * I need to keep the first $countQuota records in $leftover and process the remaining records.
		 */
		$leftover   = array_slice($allRecords, 0, $countQuota);
		$allRecords = array_slice($allRecords, $countQuota);

		$this->markAllRecordsForRemoval($allRecords, $removeBackupIDs, $removeLogPaths, $ret, $leftover);

		$allRecords = $leftover;
	}

	/**
	 * Applies the Day-Based Quotas.
	 *
	 * @param   array  $allRecords       All records left to process
	 * @param   array  $removeBackupIDs  Running tally of backup IDs to remove files from
	 * @param   array  $removeLogPaths   Running tally of log entries to remove
	 * @param   array  $ret              Running tally of arrays of files to remove
	 *
	 * @return  void
	 * @since   9.3.1
	 */
	private function applyDayQuotas(array &$allRecords, array &$removeBackupIDs, array &$removeLogPaths, array &$ret): void
	{
		$configuration = Factory::getConfiguration();
		$daysQuota     = $configuration->get($this->configKeys['maxAgeDays']);
		$preserveDay   = $configuration->get($this->configKeys['maxAgeKeep']);
		$leftover      = [];

		$killDatetime = new DateTime();
		$killDatetime->modify('-' . $daysQuota . ($daysQuota == 1 ? ' day' : ' days'));
		$killTS = $killDatetime->format('U');

		/**
		 * Move the following kind of records FROM allRecords TO leftover:
		 * - Current backup record
		 * - Backups on a preserve day
		 * - Backups newer than the earliest removal date
		 */
		$allRecords = array_filter(
			$allRecords,
			function (array $def) use ($killDatetime, $killTS, $preserveDay, &$leftover): bool {
				if ($def['id'] == $this->latestBackupId)
				{
					$leftover[] = $def;

					return false;
				}

				// Is this on a preserve day?
				if ($preserveDay > 0 && $def['day'] == $preserveDay)
				{
					$leftover[] = $def;

					return false;
				}

				// Otherwise, check the timestamp
				if ($def['backupstart'] >= $killTS)
				{
					$leftover[] = $def;

					return false;
				}

				return true;
			}
		);

		$this->markAllRecordsForRemoval($allRecords, $removeBackupIDs, $removeLogPaths, $ret, $leftover);

		$allRecords = $leftover;
	}

	/**
	 * Applies the Maximum Size Quotas.
	 *
	 * @param   array  $allRecords       All records left to process
	 * @param   array  $removeBackupIDs  Running tally of backup IDs to remove files from
	 * @param   array  $removeLogPaths   Running tally of log entries to remove
	 * @param   array  $ret              Running tally of arrays of files to remove
	 *
	 * @return  void
	 * @since   9.3.1
	 */
	private function applySizeQuotas(array &$allRecords, array &$removeBackupIDs, array &$removeLogPaths, array &$ret)
	{
		$configuration = Factory::getConfiguration();
		$useSizeQuotas = $configuration->get($this->configKeys['sizeEnable']);
		$sizeQuota     = $configuration->get($this->configKeys['sizeValue']);

		// Do we need to apply size quotas?
		if (!$useSizeQuotas || !is_numeric($sizeQuota) || $sizeQuota <= 0 || count($allRecords) <= 0)
		{
			return;
		}

		Factory::getLog()->debug(
			sprintf(
				'Processing %s size quotas',
				$this->quotaType
			)
		);

		// First I will find how many elements of the array I need to get to the $sizeQuota size.
		$runningSize     = 0;
		$numberOfRecords = 0;

		foreach ($allRecords as $def)
		{
			$numberOfRecords++;

			if ($def['id'] == $this->latestBackupId)
			{
				continue;
			}

			$runningSize += $def['size'];

			if ($runningSize >= $sizeQuota)
			{
				break;
			}
		}

		$leftover   = array_slice($allRecords, 0, $numberOfRecords);
		$allRecords = array_slice($allRecords, $numberOfRecords);

		$this->markAllRecordsForRemoval($allRecords, $removeBackupIDs, $removeLogPaths, $ret, $leftover);

		$allRecords = $leftover;
	}

	private function calculateQuotas(&$allRecords, &$removeBackupIDs, &$removeLogPaths, &$filesToRemove): bool
	{
		$configuration = Factory::getConfiguration();
		$useDayQuotas  = $configuration->get($this->configKeys['maxAgeEnable']);

		$allRecords = $this->getAllRecords();

		// If there are no files, exit early
		if (count($allRecords) == 0)
		{
			Factory::getLog()->debug(
				sprintf(
					'There were no old backup records to apply %s quotas on',
					$this->quotaType
				)
			);

			return false;
		}

		// Init arrays
		$removeBackupIDs = [];
		$removeLogPaths  = [];
		$ret             = [];

		// Do we need to apply maximum backup age quotas?
		if ($useDayQuotas)
		{
			$this->applyDayQuotas($allRecords, $removeBackupIDs, $removeLogPaths, $ret);
		}
		else
		{
			$this->applyCountQuotas($allRecords, $removeBackupIDs, $removeLogPaths, $ret);
			$this->applySizeQuotas($allRecords, $removeBackupIDs, $removeLogPaths, $ret);
		}

		// Convert the $ret 2-dimensional array to single dimensional
		$filesToRemove = [];

		foreach ($ret as $temp)
		{
			$filesToRemove = array_merge($filesToRemove ?? [], $temp);
		}

		return true;
	}

	/**
	 * Save the calculated quotas into the volatile storage
	 *
	 * @param   array|null  $removeBackupIDs  Running tally of backup IDs to remove files from
	 * @param   array|null  $removeLogPaths   Running tally of log entries to remove
	 * @param   array|null  $filesToRemove    The flat list of files to remove
	 *
	 * @return  void
	 * @since   9.3.1
	 */
	private function saveCalculatedQuotas(?array &$removeBackupIDs, ?array &$removeLogPaths, ?array &$filesToRemove): void
	{
		$configuration      = Factory::getConfiguration();
		$keyIsCalculated    = sprintf('volatile.quotas.%s.calculated', $this->quotaType);
		$keyRemoveBackupIDs = sprintf('volatile.quotas.%s.removeBackupIDs', $this->quotaType);
		$keyRemoveLogPaths  = sprintf('volatile.quotas.%s.removeLogPaths', $this->quotaType);
		$keyFilesToRemove   = sprintf('volatile.quotas.%s.filesToRemove', $this->quotaType);

		$isCalculated = $removeBackupIDs !== null || $removeLogPaths !== null || $filesToRemove !== null;

		if ($isCalculated)
		{
			$configuration->set($keyIsCalculated, true);
			$configuration->set($keyRemoveBackupIDs, $removeBackupIDs);
			$configuration->set($keyRemoveLogPaths, $removeLogPaths);
			$configuration->set($keyFilesToRemove, $filesToRemove);

			return;
		}

		$configuration->remove($keyIsCalculated);
		$configuration->remove($keyRemoveBackupIDs);
		$configuration->remove($keyRemoveLogPaths);
		$configuration->remove($keyFilesToRemove);
	}
}components/com_akeeba/BackupEngine/Core/Domain/Finalizer/RemoteQuotas.php000060400000016136152453623440022530 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

/**
 * @package     Akeeba\Engine\Core\Domain\Finalizer
 * @subpackage
 *
 * @copyright   A copyright
 * @license     A "Slug" license name e.g. GPL2
 */

namespace Akeeba\Engine\Core\Domain\Finalizer;

use Akeeba\Engine\Core\Domain\Finalization;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use DateTime;
use Exception;

class RemoteQuotas extends AbstractQuotaManagement
{
	/** @inheritDoc */
	public function __construct(Finalization $finalizationPart)
	{
		$this->quotaType = 'remote';

		$this->configKeys = [
			'maxAgeEnable' => 'akeeba.quota.remotely.maxage.enable',
			'maxAgeDays'   => 'akeeba.quota.remotely.maxage.maxdays',
			'maxAgeKeep'   => 'akeeba.quota.remotely.maxage.keepday',
			'countEnable'  => 'akeeba.quota.remotely.enable_count_quota',
			'countValue'   => 'akeeba.quota.remotely.count_quota',
			'sizeEnable'   => 'akeeba.quota.remotely.enable_size_quota',
			'sizeValue'    => 'akeeba.quota.remotely.size_quota',
		];

		parent::__construct($finalizationPart);
	}

	/** @inheritDoc */
	protected function getAllRecords(): array
	{
		$configuration = Factory::getConfiguration();
		$useLatest = $configuration->get('akeeba.quota.remote_latest', '1') == 1;

		// Get all records with a remote filename and filter out the current record and frozen records
		$allRecords = array_filter(
			Platform::getInstance()->get_valid_remote_records() ?: [],
			function (array $stat) use ($useLatest): bool {
				// Exclude frozen records from quota management
				if (isset($stat['frozen']) && $stat['frozen'])
				{
					Factory::getLog()->debug(
						sprintf(
							'Excluding frozen backup id %d from %s quota management',
							$stat['id'],
							$this->quotaType
						)
					);

					return false;
				}

				// Exclude the current record from the remote quota management
				return $useLatest ? true : ($stat['id'] != $this->latestBackupId);
			}
		);

		// Convert stat records to entries used in quota management
		return array_map(
			function (array $stat): array {
				$remoteFilenames = $this->getRemoteFiles($stat['remote_filename'], $stat['multipart']);

				try
				{
					$backupStart = new DateTime($stat['backupstart']);
					$backupTS    = $backupStart->format('U');
					$backupDay   = $backupStart->format('d');
				}
				catch (Exception $e)
				{
					$backupTS  = 0;
					$backupDay = 0;
				}

				// Get the log file name
				$tag      = $stat['tag'] ?? 'backend';
				$backupId = $stat['backupid'] ?? '';
				$logName  = '';

				if (!empty($backupId))
				{
					$logName = 'akeeba.' . $tag . '.' . $backupId . '.log.php';
				}

				return [
					'id'            => $stat['id'],
					'filenames'     => $remoteFilenames,
					'size'          => $stat['total_size'],
					'backupstart'   => $backupTS,
					'day'           => $backupDay,
					'logname'       => $logName,
					'absolute_path' => $stat['absolute_path'],
				];
			},
			$allRecords
		);
	}

	/**
	 * Performs the actual removal.
	 *
	 * @param   array  $removeBackupIDs  The backup IDs which will have their files removed
	 * @param   array  $filesToRemove    The flat list of files to remove
	 * @param   array  $removeLogPaths   The flat list of log paths to remove
	 *
	 * @return  bool  True if we are done, false to come back in the next step of the engine
	 * @throws  Exception
	 * @since   9.3.1
	 */
	protected function processRemovals(array &$removeBackupIDs, array &$filesToRemove, array &$removeLogPaths): bool
	{
		$timer = Factory::getTimer();

		// Update the statistics record with the removed remote files
		if (!empty($removeBackupIDs))
		{
			Factory::getLog()->debug(
				sprintf(
					'Applying %s quotas: updating backup records',
					$this->quotaType
				)
			);
		}

		while (!empty($removeBackupIDs) && $timer->getTimeLeft() > 0)
		{
			$id   = array_shift($removeBackupIDs);
			$data = ['remote_filename' => ''];

			Platform::getInstance()->set_or_update_statistics($id, $data);
		}

		// Check if I have enough time
		if ($timer->getTimeLeft() <= 0)
		{
			return false;
		}

		// Apply quotas upon backup records
		if (!empty($filesToRemove) > 0)
		{
			Factory::getLog()->debug(
				sprintf(
					'Applying %s quotas: removing backup archives',
					$this->quotaType
				)
			);
		}

		while (!empty($filesToRemove) && $timer->getTimeLeft() > 0)
		{
			$filename = array_shift($filesToRemove);
			[$engineName, $path] = explode('://', $filename);
			$engine = Factory::getPostprocEngine($engineName);

			if (!$engine->supportsDelete())
			{
				continue;
			}

			Factory::getLog()->debug(
				sprintf(
					'Removing remotely stored file %s',
					$filename
				)
			);

			try
			{
				$engine->delete($path);
			}
			catch (Exception $e)
			{
				Factory::getLog()->debug(
					sprintf(
						'Could not remove remotely stored file. Error: %s',
						$e->getMessage()
					)
				);
			}
		}

		// Check if I have enough time
		if ($timer->getTimeLeft() <= 0)
		{
			return false;
		}

		// Apply quotas to log files
		if (!empty($removeLogPaths))
		{
			Factory::getLog()->debug(
				sprintf(
					'Applying %s quotas: removing obsolete log files',
					$this->quotaType
				)
			);
			Factory::getLog()->debug('Removing obsolete log files');
		}

		while (!empty($removeLogPaths) && $timer->getTimeLeft() > 0)
		{
			$logPath = array_shift($removeLogPaths);

			if (@Platform::getInstance()->unlink($logPath))
			{
				continue;
			}

			Factory::getLog()->debug(
				sprintf(
					'Failed to remove old log file %s',
					$logPath
				)
			);
		}

		// Check if I have enough time
		if ($timer->getTimeLeft() <= 0)
		{
			return false;
		}

		return true;
	}

	/**
	 * Get the full paths to all remote backup parts
	 *
	 * @param   string  $filename   The full filename of the last part stored in the database
	 * @param   int     $multipart  How many parts does this archive consist of?
	 *
	 * @return  array  A list of the full paths of all remotely stored backup archive parts
	 * @since   9.3.1
	 */
	private function getRemoteFiles(string $filename, int $multipart): array
	{
		$result = [];

		$extension       = substr($filename, -3);
		$base            = substr($filename, 0, -4);
		$extensionPrefix = substr($extension, 0, 1);
		$result[]        = $filename;

		if ($multipart <= 1)
		{
			return $result;
		}

		for ($i = 1; $i < $multipart; $i++)
		{
			$newExt   = $extensionPrefix . sprintf('%02u', $i);
			$result[] = $base . '.' . $newExt;
		}

		return $result;
	}

}components/com_akeeba/BackupEngine/Core/Domain/Finalizer/LocalQuotas.php000060400000012313152453623440022320 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

/**
 * @package     Akeeba\Engine\Core\Domain\Finalizer
 * @subpackage
 *
 * @copyright   A copyright
 * @license     A "Slug" license name e.g. GPL2
 */

namespace Akeeba\Engine\Core\Domain\Finalizer;

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use DateTime;
use Exception;

final class LocalQuotas extends AbstractQuotaManagement
{

	/**
	 * Get all the backup records to apply quotas on.
	 *
	 * @return  array
	 *
	 * @since   9.3.1
	 */
	protected function getAllRecords(): array
	{
		// Get valid-looking backup ID's
		$validIDs = Platform::getInstance()->get_valid_backup_records(true) ?: [];

		// Create a list of valid files
		$allFiles   = [];
		$statistics = Factory::getStatistics();

		foreach ($validIDs as $id)
		{
			$stat = Platform::getInstance()->get_statistics($id);

			// Exclude frozen record from quota management
			if (isset($stat['frozen']) && $stat['frozen'])
			{
				Factory::getLog()->debug(
					sprintf(
						'Excluding frozen backup id %d from %s quota management',
						$id,
						$this->quotaType
					)
				);
				continue;
			}

			try
			{
				$backupstart = new DateTime($stat['backupstart']);
				$backupTS    = $backupstart->format('U');
				$backupDay   = $backupstart->format('d');
			}
			catch (Exception $e)
			{
				$backupTS  = 0;
				$backupDay = 0;
			}

			// Get the log file name
			$tag      = $stat['tag'];
			$backupId = $stat['backupid'] ?? '';
			$logName  = '';

			if (!empty($backupId))
			{
				$logName = 'akeeba.' . $tag . '.' . $backupId . '.log.php';
			}

			// Multipart processing
			$filenames = $statistics->get_all_filenames($stat, true);

			// Only process existing files
			if (is_null($filenames))
			{
				continue;
			}

			$filesize = 0;

			foreach ($filenames as $filename)
			{
				$filesize += @filesize($filename);
			}

			$allFiles[] = [
				'id'            => $id,
				'filenames'     => $filenames,
				'size'          => $filesize,
				'backupstart'   => $backupTS,
				'day'           => $backupDay,
				'logname'       => $logName,
				'absolute_path' => $stat['absolute_path'],
			];
		}

		return $allFiles;
	}

	/**
	 * Performs the actual removal.
	 *
	 * @param   array  $removeBackupIDs  The backup IDs which will have their files removed
	 * @param   array  $filesToRemove    The flat list of files to remove
	 * @param   array  $removeLogPaths   The flat list of log paths to remove
	 *
	 * @return  bool  True if we are done, false to come back in the next step of the engine
	 * @throws  Exception
	 * @since   9.3.1
	 */
	protected function processRemovals(array &$removeBackupIDs, array &$filesToRemove, array &$removeLogPaths): bool
	{
		$timer = Factory::getTimer();

		// Update the statistics record with the removed remote files
		if (!empty($removeBackupIDs))
		{
			Factory::getLog()->debug(
				sprintf(
					'Applying %s quotas: updating backup records',
					$this->quotaType
				)
			);
		}

		while (!empty($removeBackupIDs) && $timer->getTimeLeft() > 0)
		{
			$id   = array_shift($removeBackupIDs);
			$data = ['filesexist' => '0'];

			Platform::getInstance()->set_or_update_statistics($id, $data);
		}

		// Check if I have enough time
		if ($timer->getTimeLeft() <= 0)
		{
			return false;
		}

		// Apply quotas upon backup records
		if (!empty($filesToRemove) > 0)
		{
			Factory::getLog()->debug(
				sprintf(
					'Applying %s quotas: removing backup archives',
					$this->quotaType
				)
			);
		}

		while (!empty($filesToRemove) && $timer->getTimeLeft() > 0)
		{
			$file = array_shift($filesToRemove);

			if (@Platform::getInstance()->unlink($file))
			{
				continue;
			}

			Factory::getLog()->warning(
				sprintf(
					'Failed to remove old backup file %s',
					$file
				)
			);
		}

		// Check if I have enough time
		if ($timer->getTimeLeft() <= 0)
		{
			return false;
		}

		// Apply quotas to log files
		if (!empty($removeLogPaths))
		{
			Factory::getLog()->debug(
				sprintf(
					'Applying %s quotas: removing obsolete log files',
					$this->quotaType
				)
			);
			Factory::getLog()->debug('Removing obsolete log files');
		}

		while (!empty($removeLogPaths) && $timer->getTimeLeft() > 0)
		{
			$logPath = array_shift($removeLogPaths);

			if (@Platform::getInstance()->unlink($logPath))
			{
				continue;
			}

			Factory::getLog()->debug(
				sprintf(
					'Failed to remove old log file %s',
					$logPath
				)
			);
		}

		// Check if I have enough time
		if ($timer->getTimeLeft() <= 0)
		{
			return false;
		}

		return true;
	}
}components/com_akeeba/BackupEngine/Core/Domain/Finalizer/ObsoleteRecordsQuotas.php000060400000007310152453623440024365 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

/**
 * @package     Akeeba\Engine\Core\Domain\Finalizer
 * @subpackage
 *
 * @copyright   A copyright
 * @license     A "Slug" license name e.g. GPL2
 */

namespace Akeeba\Engine\Core\Domain\Finalizer;

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;

/**
 * Keeps a maximum number of "obsolete" records
 *
 * @since       9.3.1
 * @package     Akeeba\Engine\Core\Domain\Finalizer
 */
final class ObsoleteRecordsQuotas extends AbstractFinalizer
{

	/**
	 * @inheritDoc
	 */
	public function __invoke()
	{
		$this->setStep('Applying quota limit on obsolete backup records');
		$this->setSubstep('');
		$registry = Factory::getConfiguration();
		$limit    = $registry->get('akeeba.quota.obsolete_quota', 0);
		$limit    = (int) $limit;

		if ($limit <= 0)
		{
			return true;
		}

		$platform   = Platform::getInstance();
		$statsTable = $platform->tableNameStats;
		$db         = Factory::getDatabase($platform->get_platform_database_options());
		$query      =
			(method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
			   ->select([
				   $db->qn('id'),
				   $db->qn('tag'),
				   $db->qn('backupid'),
				   $db->qn('absolute_path'),
			   ])
			   ->from($db->qn($statsTable))
			   ->where($db->qn('profile_id') . ' = ' . $db->q($platform->get_active_profile()))
			   ->where($db->qn('status') . ' = ' . $db->q('complete'))
			   ->where($db->qn('filesexist') . '=' . $db->q('0'))
			   ->where(
				   '(' .
				   $db->qn('remote_filename') . '=' . $db->q('') . ' OR ' .
				   $db->qn('remote_filename') . ' IS NULL'
				   . ')'
			   )
			   ->order($db->qn('id') . ' DESC');

		$db->setQuery($query, $limit, 100000);
		$records = $db->loadAssocList();

		if (empty($records))
		{
			return true;
		}

		$array = [];

		// Delete backup-specific log files if they exist and add the IDs of the records to delete in the $array
		foreach ($records as $stat)
		{
			$array[] = $stat['id'];

			// We can't delete logs if there is no backup ID in the record
			if (!isset($stat['backupid']) || empty($stat['backupid']))
			{
				continue;
			}

			$logFileName = 'akeeba.' . $stat['tag'] . '.' . $stat['backupid'] . '.log.php';
			$logPath     = dirname($stat['absolute_path']) . '/' . $logFileName;

			if (@file_exists($logPath))
			{
				@unlink($logPath);
			}

			/**
			 * Transitional period: the log file akeeba.tag.log.php may not exist but the akeeba.tag.log does. This
			 * addresses this transition.
			 */
			$logPath = dirname($stat['absolute_path']) . '/' . substr($logFileName, 0, -4);

			if (@file_exists($logPath))
			{
				@unlink($logPath);
			}
		}

		$ids = [];

		foreach ($array as $id)
		{
			$ids[] = $db->q($id);
		}

		$ids = implode(',', $ids);

		$query = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))
		            ->delete($db->qn($statsTable))
		            ->where($db->qn('id') . " IN ($ids)");
		$db->setQuery($query);
		$db->query();

		return true;
	}
}components/com_akeeba/BackupEngine/Core/Domain/Finalizer/UpdateFileSizes.php000060400000005156152453623440023140 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

/**
 * @package     Akeeba\Engine\Core\Domain\Finalizer
 * @subpackage
 *
 * @copyright   A copyright
 * @license     A "Slug" license name e.g. GPL2
 */

namespace Akeeba\Engine\Core\Domain\Finalizer;

use Akeeba\Engine\Factory;

/**
 * Updates the file sizes in the statistics records
 *
 * @since       9.3.1
 * @package     Akeeba\Engine\Core\Domain\Finalizer
 *
 */
final class UpdateFileSizes extends AbstractFinalizer
{
	/**
	 * @inheritDoc
	 */
	public function __invoke()
	{
		$this->setStep('Updating file sizes');
		$this->setSubstep('');
		Factory::getLog()->debug("Updating statistics with file sizes");

		// Fetch the stats record
		$statistics    = Factory::getStatistics();
		$configuration = Factory::getConfiguration();
		$record        = $statistics->getRecord();
		$filenames     = $statistics->get_all_filenames($record) ?: [];
		$filesize      = 0.0;

		// Calculate file sizes of files remaining on the server
		foreach ($filenames as $file)
		{
			$filesize += ((@filesize($file)) ?: 0) * 1.0;
		}

		// Get the part size in volatile storage, set from the immediate part uploading effected by the
		// "Process each part immediately" option, and add it to the total file size
		$config              = $configuration;
		$postProcImmediately = $config->get('engine.postproc.common.after_part', 0, false);
		$deleteAfter         = $config->get('engine.postproc.common.delete_after', 0, false);
		$postProcEngine      = $config->get('akeeba.advanced.postproc_engine', 'none');

		if ($postProcImmediately && $deleteAfter && ($postProcEngine != 'none'))
		{
			$filesize += $configuration->get('volatile.engine.archiver.totalsize', 0) ?: 0;
		}

		$data = [
			'total_size' => $filesize,
		];

		Factory::getLog()->debug("Total size of backup archive (in bytes): $filesize");

		$statistics->setStatistics($data);

		return true;
	}
}components/com_akeeba/BackupEngine/Core/Domain/Finalizer/AbstractFinalizer.php000060400000004772152453623440023512 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

/**
 * @package     Akeeba\Engine\Core\Domain\Finalizer
 * @subpackage
 *
 * @copyright   A copyright
 * @license     A "Slug" license name e.g. GPL2
 */

namespace Akeeba\Engine\Core\Domain\Finalizer;

use Akeeba\Engine\Core\Domain\Finalization;
use Akeeba\Engine\Psr\Log\LogLevel;

/**
 * Abstract implementation of a finalizer class
 *
 * @since       9.3.1
 * @package     Akeeba\Engine\Core\Domain\Finalizer
 */
abstract class AbstractFinalizer implements FinalizerInterface
{
	/**
	 * The part we belong to
	 *
	 * @since 9.3.1
	 * @var   Finalization
	 */
	private $finalizationPart;

	/**
	 * Public constructor
	 *
	 * @param   Finalization  $finalizationPart  The part we belong to.
	 *
	 * @since   9.3.1
	 */
	public function __construct(Finalization $finalizationPart)
	{
		$this->finalizationPart = $finalizationPart;
	}

	/**
	 * Relays an exception so it can be logged
	 *
	 * @param   \Throwable  $e
	 * @param   string      $logLevel
	 *
	 * @return  void
	 * @since   9.3.1
	 */
	protected function logErrorsFromException(\Throwable $e, string $logLevel = LogLevel::ERROR): void
	{
		$this->finalizationPart->relayException($e, $logLevel);
	}

	/**
	 * Relays the current step back to the parent finalization engine part
	 *
	 * @param   string  $step  The step name to set
	 *
	 * @return  void
	 * @since   9.3.1
	 */
	protected function setStep(string $step): void
	{
		$this->finalizationPart->relayStep($step);
	}

	/**
	 * Relays the current sub-step back to the parent finalization engine part
	 *
	 * @param   string  $substep  The sub-step name to set
	 *
	 * @return  void
	 * @since   9.3.1
	 */
	protected function setSubstep(string $substep): void
	{
		$this->finalizationPart->relaySubstep($substep);
	}
}components/com_akeeba/BackupEngine/Core/Domain/Finalizer/MailAdministrators.php000060400000021610152453623440023677 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

/**
 * @package     Akeeba\Engine\Core\Domain\Finalizer
 * @subpackage
 *
 * @copyright   A copyright
 * @license     A "Slug" license name e.g. GPL2
 */

namespace Akeeba\Engine\Core\Domain\Finalizer;

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;

/**
 * Sends an email to the site administrators on backup completion
 *
 * @since       9.3.1
 * @package     Akeeba\Engine\Core\Domain\Finalizer
 */
final class MailAdministrators extends AbstractFinalizer
{
	/**
	 * @inheritDoc
	 */
	public function __invoke()
	{
		$this->setStep('Processing emails to administrators');
		$this->setSubstep('');

		$platform = Platform::getInstance();

		// Skip email for back-end backups
		if ($platform->get_backup_origin() == 'backend')
		{
			return true;
		}

		// Is the feature enabled?
		if ($platform->get_platform_configuration_option('frontend_email_on_finish', 0) == 0)
		{
			return true;
		}

		Factory::getLog()->debug("Preparing to send e-mail to administrators");

        $emails = $this->getEmailAddresses();

		if (empty($emails))
		{
			Factory::getLog()->debug("No email recipients found! Skipping email.");

			return true;
		}

		Factory::getLog()->debug("Creating email subject and body");

		// Get the statistics
		$statistics    = Factory::getStatistics();
		$profileNumber = $platform->get_active_profile();

		$db    = Factory::getDatabase();
		$query = (method_exists($db, 'createQuery') ? $db->createQuery() : $db->getQuery(true))->select('1');
		$dummy = $db->setQuery($query)->loadResult();

		$profileName   = $platform->get_profile_name($profileNumber);
		$statsRecord   = $statistics->getRecord();
		$partsCount    = max(1, $statsRecord['multipart']);
		$allFilenames  = $this->getPartFilenames($statsRecord);
		$filesList     = implode(
			"\n", array_map(function ($file) {
				return "\t" . $file;
			}, $allFilenames)
		);
		$totalSize     = (int) ($statsRecord['total_size'] ?? 0);

		// Get the approximate part sizes and create a list of files and sizes
		$configuration     = Factory::getConfiguration();
		$partSize          = $configuration->get('engine.archiver.common.part_size', 0);
		$lastPartSize      = $totalSize - (($partsCount - 1) * $partSize);
		$partSizes         = array_fill(0, $partsCount - 1, $partSize);
		$partSizes[]       = $lastPartSize;
		$filesAndSizesList = implode(
			"\n",
			array_map(
				function ($file, $size) {
					return sprintf(
						"\t%s (approx. %s)",
						$file,
						$this->formatByteSize($size)
					);
				},
				$allFilenames,
				$partSizes
			)
		);

		// Determine the upload to remote storage status
		$remoteStatus   = '';
		$failedUpdate   = false;
		$postProcEngine = Factory::getConfiguration()->get('akeeba.advanced.postproc_engine');

		if (!empty($postProcEngine) && ($postProcEngine != 'none'))
		{
			$remoteStatus = $platform->translate('COM_AKEEBA_EMAIL_POSTPROCESSING_SUCCESS');

			if (empty($statsRecord['remote_filename']))
			{
				$failedUpdate = true;
				$remoteStatus = $platform->translate('COM_AKEEBA_EMAIL_POSTPROCESSING_FAILED');
			}
		}

		// Did the user ask to be emailed only on failed uploads but the upload has succeeded?
		if (
			!$failedUpdate
			&& ($platform->get_platform_configuration_option('frontend_email_when', 'always') == 'failedupload')
		)
		{
			return true;
		}

		// Fetch user's preferences
		$subject = trim($platform->get_platform_configuration_option('frontend_email_subject', ''));
		$body    = trim($platform->get_platform_configuration_option('frontend_email_body', ''));

		// Get a default subject or post-process a manually defined subject
		$subject = empty($subject)
			? $platform->translate('COM_AKEEBA_COMMON_EMAIL_SUBJECT_OK')
			: Factory::getFilesystemTools()->replace_archive_name_variables($subject);

		// Do we need a default body?
		if (empty($body))
		{
			$body = $platform->translate('COM_AKEEBA_COMMON_EMAIL_BODY_OK');
			$body .= "\n\n";
			$body .= sprintf(
				$platform->translate('COM_AKEEBA_COMMON_EMAIL_BODY_INFO'),
				$profileNumber,
				$partsCount
			);
			$body .= "\n\n";
			$body .= $filesAndSizesList;
		}
		else
		{
			// Post-process the body
			$body = Factory::getFilesystemTools()->replace_archive_name_variables($body);
			$body = str_replace('[PROFILENUMBER]', $profileNumber, $body);
			$body = str_replace('[PROFILENAME]', $profileName, $body);
			$body = str_replace('[PARTCOUNT]', $partsCount, $body);
			$body = str_replace('[FILELIST]', $filesList, $body);
			$body = str_replace('[FILESIZESLIST]', $filesAndSizesList, $body);
			$body = str_replace('[REMOTESTATUS]', $remoteStatus, $body);
			$body = str_replace('[TOTALSIZE]', $this->formatByteSize($totalSize), $body);
		}

		// Post-process the subject (support the [REMOTESTATUS] variable)
		$subject = str_replace('[REMOTESTATUS]', $remoteStatus, $subject);

		// Sometimes $body contains literal \n instead of newlines
		$body = str_replace('\\n', "\n", $body);

		foreach ($emails as $email)
		{
			Factory::getLog()->debug("Sending email to $email");
			try
			{
				$platform->send_email($email, $subject, $body);
			}
			catch (\Exception $e)
			{
				// Don't cry if we cannot send an email; just log it as a warning
				Factory::getLog()->warning(
					sprintf(
						'Cannot send email to ‘%s’. Error message: “%s”',
						$email,
						$e->getMessage()
					)
				);
			}
		}

		return true;
	}

	/**
	 * Returns a list of files' base names for the given backup statistics record
	 *
	 * @param   array  $statsRecord  The statistics record
	 *
	 * @return  array  List of file names
	 *
	 * @since   9.3.1
	 */
	private function getPartFilenames(array $statsRecord): array
	{
		$baseFile = basename(
			$statsRecord['absolute_path'] ?? $statsRecord['archivename'] ?? $statsRecord['remote_filename'] ?? ''
		);

		if (empty($baseFile))
		{
			return [];
		}

		$partsCount = max($statsRecord['multipart'] ?? 1, 1);

		if ($partsCount === 1)
		{
			return [$baseFile];
		}

		$ret       = [];
		$extension = substr($baseFile, strrpos($baseFile, '.'));
		$bareName  = basename($baseFile, $extension);

		for ($i = 1; $i < $partsCount; $i++)
		{
			$ret[] = $bareName . substr($extension, 0, 2) . sprintf('%02d', $i);
		}

		$ret[] = $baseFile;

		return $ret;
	}

	/**
	 * Formats a number of bytes in human-readable format
	 *
	 * @param   int|float  $size  The size in bytes to format, e.g. 8254862
	 *
	 * @return  string  The human-readable representation of the byte size, e.g. "7.87 Mb"
	 * @since   9.3.1
	 */
	private function formatByteSize($size): string
	{
		$unit = ['b', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB'];

		return @round($size / 1024 ** ($i = floor(log($size, 1024))), 2) . ' ' . $unit[$i];
	}

	/**
	 * Get the addresses to send emails to.
	 *
	 * @return  array
	 * @since   9.4.9
	 */
    private function getEmailAddresses(): array
    {
        $platform      = Platform::getInstance();
        $configuration = Factory::getConfiguration();

        // Check if we have a list of emails saved inside the profile
        $email = trim($configuration->get('akeeba.basic.email_recipients', '') ?? '');

        if (!empty($email))
        {
            Factory::getLog()->debug("Using list of emails stored inside profile configuration");

	        $list = array_map(
				function ($x) {
					return trim ($x ?? '');
				},
		        explode(',', $email)
	        );

	        $list = array_filter(
		        $list,
		        function ($x)
		        {
					return !empty($x);
		        }
	        );

			if (!empty($list))
			{
				return $list;
			}
        }

        $email = trim($platform->get_platform_configuration_option('frontend_email_address', '') ?? '');

        if (!empty($email))
        {
            Factory::getLog()->debug("Using pre-defined list of emails");

	        $list = array_map(
		        function ($x) {
			        return trim ($x ?? '');
		        },
		        explode(',', $email)
	        );

	        $list = array_filter(
		        $list,
		        function ($x)
		        {
			        return !empty($x);
		        }
	        );

	        if (!empty($list))
	        {
		        return $list;
	        }
        }

        Factory::getLog()->debug("Fetching list of site administrator emails");

        return $platform->get_administrator_emails();
    }
}components/com_akeeba/BackupEngine/Core/Domain/Finalizer/UpdateStatistics.php000060400000004661152453623440023375 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

/**
 * @package     Akeeba\Engine\Core\Domain\Finalizer
 * @subpackage
 *
 * @copyright   A copyright
 * @license     A "Slug" license name e.g. GPL2
 */

namespace Akeeba\Engine\Core\Domain\Finalizer;

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use Exception;

/**
 * Updates the backup statistics record
 *
 * @since       9.3.1
 * @package     Akeeba\Engine\Core\Domain\Finalizer
 */
final class UpdateStatistics extends AbstractFinalizer
{
	/**
	 * @inheritDoc
	 */
	public function __invoke()
	{
		$this->setStep('Updating backup record information');
		$this->setSubstep('');

		Factory::getLog()->debug('Updating statistics');

		// We finished normally. Fetch the stats record
		$statistics = Factory::getStatistics();
		$registry   = Factory::getConfiguration();
		$data       = [
			'backupend' => Platform::getInstance()->get_timestamp_database(),
			'status'    => 'complete',
			'multipart' => $registry->get('volatile.statistics.multipart', 0),
		];

		try
		{
			$result = $statistics->setStatistics($data);
		}
		catch (Exception $e)
		{
			$result = false;
		}

		if ($result === false)
		{
			// Most likely a "MySQL has gone away" issue...
			$configuration = Factory::getConfiguration();
			$configuration->set('volatile.breakflag', true);

			return false;
		}

		/**
		 * We could have handled it in $data above. However, if the schema has not been updated this function will
		 * continue failing infinitely, causing the backup to never end.
		 */
		$statistics->updateInStep(false);

		$stat = (object) $statistics->getRecord();
		Platform::getInstance()->remove_duplicate_backup_records($stat->archivename);

		return true;
	}
}components/com_akeeba/BackupEngine/Core/Domain/Finalizer/PostProcessing.php000060400000023331152453623440023055 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

/**
 * @package     Akeeba\Engine\Core\Domain\Finalizer
 * @subpackage
 *
 * @copyright   A copyright
 * @license     A "Slug" license name e.g. GPL2
 */

namespace Akeeba\Engine\Core\Domain\Finalizer;

use Akeeba\Engine\Base\Exceptions\ErrorException;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use Akeeba\Engine\Postproc\Base;
use Akeeba\Engine\Postproc\PostProcInterface;
use Exception;
use Akeeba\Engine\Psr\Log\LogLevel;

/**
 * Performs any necessary post-processing (remote file uploading) still pending.
 *
 * @since       9.3.1
 * @package     Akeeba\Engine\Core\Domain\Finalizer
 *
 */
final class PostProcessing extends AbstractFinalizer
{
	/** @var array A list of all backup parts to process */
	private $backupParts = [];

	/** @var int The backup part we are currently processing */
	private $backupPartsIndex = -1;

	/** @var int How many finalisation substeps I have already done */
	private $subStepsDone = 0;

	/** @var int How many finalisation substeps I have in total */
	private $subStepsTotal = 0;

	/**
	 * @inheritDoc
	 */
	public function __invoke()
	{
		$this->setStep('Post-processing');
		$this->setSubstep('');

		// Do not run if the archive engine doesn't produce archives
		$configuration       = Factory::getConfiguration();
		$engineName          = $configuration->get('akeeba.advanced.postproc_engine');
		$shouldAbortOnFailed = $configuration->get('engine.postproc.common.abort_on_fail', false);

		Factory::getLog()->debug("Loading post-processing engine object ($engineName)");

		$postProcEngine = Factory::getPostprocEngine($engineName);

		if (!is_object($postProcEngine) || !($postProcEngine instanceof Base))
		{
			Factory::getLog()->debug(
				sprintf(
					'Post-processing engine “%s” not found.',
					$engineName
				)
			);
			Factory::getLog()->debug("The post-processing engine has either been removed or you are trying to use a profile created with the Professional version of the backup software in the Core version which doesn't have this post-processing engine.");

			return true;
		}

		// Initialize the archive part list if required
		if (empty($this->backupParts))
		{
			$ret = $this->initialiseBackupParts($postProcEngine);

			if ($ret !== null)
			{
				return $ret;
			}
		}

		// Make sure we don't accidentally break the step when not required to do so
		$configuration->set('volatile.breakflag', false);

		// Do we have a filename from the previous run of the post-proc engine?
		$filename = $configuration->get('volatile.postproc.filename', null);

		if (empty($filename))
		{
			$filename = $this->backupParts[$this->backupPartsIndex];
			Factory::getLog()->info('Beginning post processing file ' . $filename);
		}
		else
		{
			Factory::getLog()->info('Continuing post processing file ' . $filename);
		}

		$this->setStep('Post-processing');
		$this->setSubstep(basename($filename));
		$timer               = Factory::getTimer();
		$startTime           = $timer->getRunningTime();
		$processingException = null;

		try
		{
			$finishedProcessing = $postProcEngine->processPart($filename);
		}
		catch (Exception $e)
		{
			$finishedProcessing  = false;
			$processingException = $e;
		}

		if (!is_null($processingException))
		{
			Factory::getLog()->warning('Failed to process file ' . $filename);
			Factory::getLog()->warning('Error received from the post-processing engine:');

			$this->logErrorsFromException($processingException, $shouldAbortOnFailed ? LogLevel::ERROR : LogLevel::WARNING);

			if ($shouldAbortOnFailed)
			{
				throw new ErrorException(sprintf('Failed to process backup archive file %s', basename($filename)));
			}
		}
		elseif ($finishedProcessing === true)
		{
			// The post-processing of this file ended successfully
			Factory::getLog()->info('Finished post-processing file ' . $filename);
			$configuration->set('volatile.postproc.filename', null);
		}
		else
		{
			// More work required
			Factory::getLog()->info('More post-processing steps required for file ' . $filename);
			$configuration->set('volatile.postproc.filename', $filename);

			// Do we need to break the step?
			$endTime  = $timer->getRunningTime();
			$stepTime = $endTime - $startTime;
			$timeLeft = $timer->getTimeLeft();

			// By default, we assume that we have enough time to run yet another step
			$configuration->set('volatile.breakflag', false);

			/**
			 * However, if the last step took longer than the time we already have left on the timer we can predict
			 * that we are running out of time, therefore we need to break the step.
			 */
			if ($timeLeft < $stepTime)
			{
				$configuration->set('volatile.breakflag', true);
			}
		}

		// Should we delete the file afterwards?
		$canAndShouldDeleteFileAfterwards =
			$configuration->get('engine.postproc.common.delete_after', false)
			&& $postProcEngine->isFileDeletionAfterProcessingAdvisable();

		if ($canAndShouldDeleteFileAfterwards && $finishedProcessing)
		{
			Factory::getLog()->debug('Deleting already processed file ' . $filename);
			Platform::getInstance()->unlink($filename);
		}
		elseif ($canAndShouldDeleteFileAfterwards && !$finishedProcessing)
		{
			Factory::getLog()->debug('Not removing the non-processed file ' . $filename);
		}
		else
		{
			Factory::getLog()->debug('Not removing processed file ' . $filename);
		}

		if ($finishedProcessing === true)
		{
			// Move the index forward if the part finished processing
			$this->backupPartsIndex++;

			// Mark substep done
			$this->subStepsDone++;

			// Break step after processing?
			if (
				$postProcEngine->recommendsBreakAfter()
				&& !Factory::getConfiguration()->get('akeeba.tuning.nobreak.finalization', 0)
			)
			{
				$configuration->set('volatile.breakflag', true);
			}

			// If we just finished processing the first archive part, save its remote path in the statistics.
			if (($this->subStepsDone == 1) || ($this->subStepsTotal == 0))
			{
				$this->updateStatistics($postProcEngine, $engineName);
			}

			// Are we past the end of the array (i.e. we're finished)?
			if ($this->backupPartsIndex >= count($this->backupParts))
			{
				Factory::getLog()->info('Post-processing has finished for all files');

				return true;
			}
		}

		if (!is_null($processingException))
		{
			// If the post-processing failed, make sure we don't process anything else
			$this->backupPartsIndex = count($this->backupParts);
			Factory::getLog()->warning('Post-processing interrupted -- no more files will be transferred');

			return true;
		}

		// Indicate we're not done yet
		return false;
	}

	/**
	 * Update the backup record upon post-processing the first part.
	 *
	 * @param   PostProcInterface  $postProcEngine  The post-processing engine we're using
	 * @param   string             $engineName      The name of the post-processing engine we're using
	 *
	 * @throws  Exception
	 * @since   9.3.1
	 */
	public function updateStatistics(PostProcInterface $postProcEngine, string $engineName): void
	{
		if (empty($postProcEngine->getRemotePath()))
		{
			return;
		}

		$configuration   = Factory::getConfiguration();
		$statistics      = Factory::getStatistics();
		$remote_filename = $engineName . '://';
		$remote_filename .= $postProcEngine->getRemotePath();
		$data            = [
			'remote_filename' => $remote_filename,
		];
		$remove_after    = $configuration->get('engine.postproc.common.delete_after', false);

		if ($remove_after)
		{
			$data['filesexist'] = 0;
		}

		$statistics->setStatistics($data);
	}

	/**
	 * Initialise the backup parts information
	 *
	 * @param   PostProcInterface  $postProcEngine  The post-processing engine we're using
	 *
	 * @return  bool|null
	 *
	 * @since   9.3.1
	 */
	private function initialiseBackupParts(PostProcInterface $postProcEngine): ?bool
	{
		$configuration = Factory::getConfiguration();

		Factory::getLog()->info('Initializing post-processing engine');

		// Initialize the flag for multistep post-processing of parts
		$configuration->set('volatile.postproc.filename', null);
		$configuration->set('volatile.postproc.directory', null);

		// Populate array w/ absolute names of backup parts
		$statistics        = Factory::getStatistics();
		$stat              = $statistics->getRecord();
		$this->backupParts = Factory::getStatistics()->get_all_filenames($stat, false);

		if (is_null($this->backupParts))
		{
			// No archive produced, or they are all already post-processed
			Factory::getLog()->info('No archive files found to post-process');

			return true;
		}

		Factory::getLog()->debug(count($this->backupParts) . ' files to process found');

		$this->subStepsTotal = count($this->backupParts);
		$this->subStepsDone  = 0;

		$this->backupPartsIndex = 0;

		// If we have an empty array, do not run
		if (empty($this->backupParts))
		{
			return true;
		}

		// Break step before processing?
		if (
			$postProcEngine->recommendsBreakBefore()
			&& !$configuration->get(
				'akeeba.tuning.nobreak.finalization', 0
			)
		)
		{
			Factory::getLog()->debug('Breaking step before post-processing run');
			$configuration->set('volatile.breakflag', true);

			return false;
		}

		return null;
	}
}components/com_akeeba/BackupEngine/Core/Domain/Finalizer/UploadKickstart.php000060400000006001152453623440023172 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

/**
 * @package     Akeeba\Engine\Core\Domain\Finalizer
 * @subpackage
 *
 * @copyright   A copyright
 * @license     A "Slug" license name e.g. GPL2
 */

namespace Akeeba\Engine\Core\Domain\Finalizer;

use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use Exception;
use Akeeba\Engine\Psr\Log\LogLevel;

/**
 * Uploads Kickstart using the post-processing engine
 *
 * @since       9.3.1
 * @package     Akeeba\Engine\Core\Domain\Finalizer
 */
final class UploadKickstart extends AbstractFinalizer
{

	/**
	 * @inheritDoc
	 */
	public function __invoke()
	{
		$this->setStep('Post-processing Kickstart');
		$this->setSubstep('');

		$configuration = Factory::getConfiguration();

		// Do not run if we are not told to upload Kickstart
		$uploadKickstart = $configuration->get('akeeba.advanced.uploadkickstart', 0);

		if (!$uploadKickstart)
		{
			return true;
		}

		$engineName = $configuration->get('akeeba.advanced.postproc_engine');
		Factory::getLog()->debug("Loading post-processing engine object ($engineName)");
		$postProcEngine = Factory::getPostprocEngine($engineName);

		// Set $filename to kickstart's source file
		$filename = Platform::getInstance()->get_installer_images_path() . '/kickstart.txt';

		// Post-process the file
		$this->setSubstep('kickstart.php');

		if (!@file_exists($filename) || !is_file($filename))
		{
			Factory::getLog()->warning(
				sprintf(
					'Failed to upload kickstart.php. Missing file %s',
					$filename
				)
			);

			// Indicate we're done.
			return true;
		}

		$exception          = null;
		$finishedProcessing = false;

		try
		{
			$finishedProcessing = $postProcEngine->processPart($filename, 'kickstart.php');
		}
		catch (Exception $e)
		{
			$exception = $e;
		}

		if (!is_null($exception))
		{
			Factory::getLog()->warning('Failed to upload kickstart.php');
			Factory::getLog()->warning('Error received from the post-processing engine:');
			$this->logErrorsFromException($exception, LogLevel::WARNING);
		}
		elseif ($finishedProcessing === true)
		{
			// The post-processing of this file ended successfully
			Factory::getLog()->info('Finished uploading kickstart.php');
			$configuration->set('volatile.postproc.filename', null);
		}

		// Indicate we're done
		return true;
	}
}components/com_akeeba/BackupEngine/Core/Domain/Finalization.php000060400000017171152453623440020604 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Core\Domain;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Base\Part;
use Akeeba\Engine\Core\Domain\Finalizer\LocalQuotas;
use Akeeba\Engine\Core\Domain\Finalizer\MailAdministrators;
use Akeeba\Engine\Core\Domain\Finalizer\ObsoleteRecordsQuotas;
use Akeeba\Engine\Core\Domain\Finalizer\PostProcessing;
use Akeeba\Engine\Core\Domain\Finalizer\RemoteQuotas;
use Akeeba\Engine\Core\Domain\Finalizer\RemoveTemporaryFiles;
use Akeeba\Engine\Core\Domain\Finalizer\UpdateFileSizes;
use Akeeba\Engine\Core\Domain\Finalizer\UpdateStatistics;
use Akeeba\Engine\Core\Domain\Finalizer\UploadKickstart;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use DateTime;
use Exception;
use Akeeba\Engine\Psr\Log\LogLevel;

/**
 * Backup finalization domain
 */
final class Finalization extends Part
{
	/** @var array The finalisation actions we have to execute (FIFO queue) */
	private $actionQueue = [];

	/** @var string The current method, shifted from the action queye */
	private $currentActionClass = '';

	private $currentActionObject = null;

	/** @var int How many finalisation steps I have already done */
	private $stepsDone = 0;

	/** @var int How many finalisation steps I have in total */
	private $stepsTotal = 0;

	/** @var int How many finalisation substeps I have already done */
	private $subStepsDone = 0;

	/** @var int How many finalisation substeps I have in total */
	private $subStepsTotal = 0;

	/**
	 * Get the percentage of finalization steps done
	 *
	 * @return  float
	 */
	public function getProgress()
	{
		if ($this->stepsTotal <= 0)
		{
			return 0;
		}

		$overall = $this->stepsDone / $this->stepsTotal;
		$local   = 0;

		if ($this->subStepsTotal > 0)
		{
			$local = $this->subStepsDone / $this->subStepsTotal;
		}

		return $overall + ($local / $this->stepsTotal);
	}

	/**
	 * Relays and logs an exception
	 *
	 * @param   \Throwable  $e         The exception or throwable to log
	 * @param   string      $logLevel  The log level to log it with
	 *
	 * @return  void
	 * @since   9.3.1
	 */
	public function relayException(\Throwable $e, string $logLevel = LogLevel::ERROR): void
	{
		self::logErrorsFromException($e, $logLevel);
	}

	/**
	 * Used by additional handler classes to relay their step to us
	 *
	 * @param   string  $step  The current step
	 */
	public function relayStep($step)
	{
		$this->setStep($step);
	}

	/**
	 * Used by additional handler classes to relay their substep to us
	 *
	 * @param   string  $substep  The current sub-step
	 */
	public function relaySubstep($substep)
	{
		$this->setSubstep($substep);
	}

	/**
	 * Implements the abstract method
	 *
	 * @return void
	 */
	protected function _finalize()
	{
		$this->setState(self::STATE_FINISHED);
	}

	/**
	 * Initialise the finalisation engine
	 */
	protected function _prepare()
	{
		// Make sure the break flag is not set
		$configuration = Factory::getConfiguration();
		$configuration->get('volatile.breakflag', false);

		// Get the quota actions
		$quotaActions = $configuration->get('volatile.core.finalization.quotaActions', null);

		$quotaActions = is_array($quotaActions) ? $quotaActions : [
			LocalQuotas::class,
			RemoteQuotas::class,
			ObsoleteRecordsQuotas::class,
		];

		// Get the default finalization actions
		$defaultActions = array_merge(
			[
				RemoveTemporaryFiles::class,
				UpdateStatistics::class,
				UpdateFileSizes::class,
				PostProcessing::class,
				UploadKickstart::class,
			],
			$quotaActions,
			[
				MailAdministrators::class,
				// Run it a second time to update the backup end time after post-processing, emails, etc
				UpdateStatistics::class,
			]
		);

		// Populate the actions queue, if it's not already set in a subclass
		$this->actionQueue = $this->actionQueue ?: $defaultActions;

		// Apply action queue customisations
		$customQueue       = $configuration->get('volatile.core.finalization.action_queue', null);
		$customQueueBefore = $configuration->get('volatile.core.finalization.action_queue_before', null);
		$customQueueAfter  = $configuration->get('volatile.core.finalization.action_queue_after', null);

		if (is_array($customQueue) && !empty($customQueue))
		{
			Factory::getLog()->debug('Overriding action queue');
			$this->actionQueue = $customQueue;
		}
		else
		{
			if (is_array($customQueueBefore) && !empty($customQueueBefore))
			{
				Factory::getLog()->debug('Adding finalization actions before post-processing');
				$before = array_slice($this->actionQueue, 0, 3);
				$after  = array_slice($this->actionQueue, 3);

				$this->actionQueue = array_merge($before, $customQueueBefore, $after);
			}

			if (is_array($customQueueAfter) && !empty($customQueueAfter))
			{
				Factory::getLog()->debug('Adding finalization actions at the end of the queue');
				$before = array_slice($this->actionQueue, 0, -1);
				$after  = array_slice($this->actionQueue, -1, 1);

				$this->actionQueue = array_merge($before, $customQueueAfter, $after);
			}
		}

		// Log the actions queue
		Factory::getLog()->debug('Finalization action queue: ' . implode(', ', $this->actionQueue));

		// Initialise actions processing
		$this->stepsTotal    = count($this->actionQueue);
		$this->stepsDone     = 0;
		$this->subStepsTotal = 0;
		$this->subStepsDone  = 0;

		// Seed the method
		$this->currentActionClass = array_shift($this->actionQueue);

		// Set ourselves to running state
		$this->setState(self::STATE_RUNNING);
	}

	/**
	 * Implements the abstract method
	 *
	 * @return  void
	 */
	protected function _run()
	{
		$configuration = Factory::getConfiguration();

		if ($this->getState() == self::STATE_POSTRUN)
		{
			return;
		}

		$finished = (empty($this->actionQueue)) && ($this->currentActionClass == '');

		if ($finished)
		{
			$this->setState(self::STATE_POSTRUN);

			return;
		}

		$this->setState(self::STATE_RUNNING);

		$timer = Factory::getTimer();

		// Continue processing while we have still enough time and stuff to do
		while (($timer->getTimeLeft() > 0) && (!$finished) && (!$configuration->get('volatile.breakflag', false)))
		{
			if (empty($this->currentActionObject))
			{
				$className = $this->currentActionClass;

				Factory::getLog()->debug(__CLASS__ . "::_run() Running new finalization object $className");

				$this->currentActionObject = new $className($this);
			}
			else
			{
				Factory::getLog()->debug(__CLASS__ . "::_run() Resuming finalization object $this->currentActionClass");
			}

			$finalizer = $this->currentActionObject;

			if ($finalizer() !== true)
			{
				continue;
			}

			$this->currentActionClass  = '';
			$this->currentActionObject = null;
			$this->stepsDone++;
			$finished = empty($this->actionQueue);

			if ($finished)
			{
				continue;
			}

			$this->currentActionClass = array_shift($this->actionQueue);
			$this->subStepsTotal      = 0;
			$this->subStepsDone       = 0;
		}

		if ($finished)
		{
			$this->setState(self::STATE_POSTRUN);
			$this->setStep('');
			$this->setSubstep('');
		}
	}
}
components/com_akeeba/BackupEngine/Core/Kettenrad.php000060400000061166152453623440016672 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Core;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Base\Part;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use Exception;
use RuntimeException;
use Throwable;

/**
 * Kettenrad is the main controller of Akeeba Engine. It's responsible for setting the engine into motion, running each
 * and all domain objects to their completion.
 */
class Kettenrad extends Part
{
	/**
	 * Set to true when akeebaBackupErrorHandler is registered as an error handler
	 *
	 * @var bool
	 */
	public static $registeredErrorHandler = false;

	/**
	 * Set to true when deadOnTimeout is registered as a shutdown function
	 *
	 * @var bool
	 */
	public static $registeredShutdownCallback = false;

	/**
	 * Cached copy of the response array
	 *
	 * @var array
	 */
	private $array_cache = null;

	/**
	 * A unique backup ID which allows us to run multiple parallel backups using the same backup origin (tag)
	 *
	 * @var string
	 */
	private $backup_id = '';

	/**
	 * The active domain's class name
	 *
	 * @var string
	 */
	private $class = '';

	/**
	 * The current domain's name
	 *
	 * @var string
	 */
	private $domain = '';

	/**
	 * The list of remaining steps
	 *
	 * @var array
	 */
	private $domain_chain = [];

	/**
	 * The current backup's tag (actually: the backup's origin)
	 *
	 * @var string
	 */
	private $tag = null;

	/**
	 * How many steps the domain_chain array contained when the backup began. Used for percentage calculations.
	 *
	 * @var int
	 */
	private $total_steps = 0;

	/**
	 * Set to true when there are warnings available when getStatusArray() is called. This is used at the end of the
	 * backup to send a different push message depending on whether the backup completed with or without warnings.
	 *
	 * @var  bool
	 */
	private $warnings_issued = false;

	/**
	 * Kettenrad constructor.
	 *
	 * Overrides the Part constructor to initialize Kettenrad-specific properties.
	 *
	 * @return void
	 */
	public function __construct()
	{
		parent::__construct();

		// Register the error handler
		if (!static::$registeredErrorHandler)
		{
			static::$registeredErrorHandler = true;
			set_error_handler('\\Akeeba\\Engine\\Core\\akeebaEngineErrorHandler');
		}
	}

	public function _onSerialize()
	{
		parent::_onSerialize();

		$this->array_cache = null;
	}


	/**
	 * Returns the unique Backup ID
	 *
	 * @return string
	 */
	public function getBackupId()
	{
		return $this->backup_id;
	}

	/**
	 * Sets the unique backup ID.
	 *
	 * @param   string  $backup_id
	 *
	 * @return void
	 */
	public function setBackupId($backup_id = null)
	{
		$this->backup_id = $backup_id;
	}

	/**
	 * Gets the percentage of the backup process done so far.
	 *
	 * @return string
	 */
	public function getProgress()
	{
		// Get the overall percentage (based on domains complete so far)
		$remainingSteps = count($this->domain_chain) + 1;
		$totalSteps     = max($this->total_steps, 1);
		$overall        = 1 - ($remainingSteps / $totalSteps);

		// How much is this step worth?
		$currentStepMaxContribution = 1 / $totalSteps;

		// Get the percentage reported from the domain object, zero if we can't get a domain object.
		$object = !empty($this->class) ? Factory::getDomainObject($this->class) : null;
		$local  = is_object($object) ? $object->getProgress() : 0;

		// Calculate the percentage and apply [0, 100] bounds.
		$percentage = (int) (100 * ($overall + $local * $currentStepMaxContribution));
		$percentage = max(0, $percentage);
		$percentage = min(100, $percentage);

		return $percentage;
	}

	/**
	 * Returns a copy of the class's status array
	 *
	 * @return array
	 */
	public function getStatusArray()
	{
		// Get the cached array
		if (!empty($this->array_cache))
		{
			return $this->array_cache;
		}

		// Get the default table
		$array = $this->makeReturnTable();

		// Add the warnings
		$array['Warnings'] = Factory::getLog()->getWarnings();

		// Did we have warnings?
		if (is_array($array['Warnings']) || $array['Warnings'] instanceof \Countable ? count($array['Warnings']) : 0)
		{
			$this->warnings_issued = true;
		}

		// Get the current step number
		$stepCounter = Factory::getConfiguration()->get('volatile.step_counter', 0);

		// Add the archive name
		$statistics       = Factory::getStatistics();
		$record           = $statistics->getRecord();
		$array['Archive'] = $record['archivename'] ?? '';

		// Translate HasRun to what the rest of the suite expects
		$array['HasRun'] = ($this->getState() == self::STATE_FINISHED) ? 1 : 0;

		$array['Error']      = is_null($array['ErrorException']) ? '' : $array['Error'];
		$array['tag']        = $this->tag;
		$array['Progress']   = $this->getProgress();
		$array['backupid']   = $this->getBackupId();
		$array['sleepTime']  = $this->waitTimeMsec;
		$array['stepNumber'] = $stepCounter;
		$array['stepState']  = $this->stateToString($this->getState());

		$this->array_cache = $array;

		return $this->array_cache;
	}

	/**
	 * Returns the current backup tag. If none is specified, it sets it to be the
	 * same as the current backup origin and returns the new setting.
	 *
	 * @return string
	 */
	public function getTag()
	{
		if (empty($this->tag))
		{
			// If no tag exists, we resort to the pre-set backup origin
			$tag       = Platform::getInstance()->get_backup_origin();
			$this->tag = $tag;
		}

		return $this->tag;
	}

	/**
	 * Obsolete method.
	 *
	 * @deprecated 7.0
	 */
	public function resetWarnings()
	{
		Factory::getLog()->debug('DEPRECATED: Akeeba Engine consumers must remove calls to resetWarnings()');
	}

	/**
	 * The public interface to Kettenrad.
	 *
	 * Internally it calls Part::tick(), wrapped in a try-catch block which traps any runaway Exception (PHP 5) or
	 * Throwable we didn't manage to successfully suppress yet.
	 *
	 * @param   int  $nesting
	 *
	 * @return  array  A response array
	 */
	public function tick($nesting = 0)
	{
		$ret = null;
		$e   = null;

		// PHP 7.x -- catch any unhandled Throwable, including PHP fatal errors
		try
		{
			$ret = parent::tick($nesting);
		}
		catch (Throwable $e)
		{
			$this->setState(self::STATE_ERROR);
			$this->lastException = $e;
		}

		// If an error occurred we don't have a return table. If that's the case create one and do log our errors.
		if (!isset($ret))
		{
			// Log the existence of an unhandled exception
			Factory::getLog()->warning("Kettenrad :: Caught unhandled exception. The backup will now fail.");

			// Recursively log unhandled exceptions
			self::logErrorsFromException($e);

			// Create the missing return table
			$ret               = $this->makeReturnTable();
			$this->array_cache = array_merge(is_null($this->array_cache) ? [] : $this->array_cache, $ret);
		}

		return $ret;
	}

	/**
	 * Finalization. Sets the state to STATE_FINISHED.
	 *
	 * @return  void
	 */
	protected function _finalize()
	{
		// Open the log
		$logTag = $this->getLogTag();
		Factory::getLog()->open($logTag);

		// Kill the cached array
		$this->array_cache = null;

		// Remove the memory file
		$tempVarsTag = $this->tag . (empty($this->backup_id) ? '' : ('.' . $this->backup_id));
		Factory::getFactoryStorage()->reset($tempVarsTag);

		// All done.
		Factory::getLog()->debug("Kettenrad :: Just finished");
		$this->setState(self::STATE_FINISHED);

		// Send a push message to mark the end of backup
		$pushSubjectKey = $this->warnings_issued ? 'COM_AKEEBA_PUSH_ENDBACKUP_WARNINGS_SUBJECT' : 'COM_AKEEBA_PUSH_ENDBACKUP_SUCCESS_SUBJECT';
		$pushBodyKey    = $this->warnings_issued ? 'COM_AKEEBA_PUSH_ENDBACKUP_WARNINGS_BODY' : 'COM_AKEEBA_PUSH_ENDBACKUP_SUCCESS_BODY';
		$platform       = Platform::getInstance();
		$timeStamp      = date($platform->translate('DATE_FORMAT_LC2'));
		$pushSubject    = sprintf($platform->translate($pushSubjectKey), $platform->get_site_name(), $platform->get_host());
		$pushDetails    = sprintf($platform->translate($pushBodyKey), $platform->get_site_name(), $platform->get_host(), $timeStamp);

		try
		{
			Factory::getPush()->message($pushSubject, $pushDetails);
		}
		catch (Throwable $e)
		{
			Factory::getLog()->notice(sprintf("Sending push notification failed: %s", $e->getMessage()));
		}
	}

	/**
	 * Initialization. Sets the state to STATE_PREPARED.
	 *
	 * @return  void
	 */
	protected function _prepare()
	{
		// Initialize the timer class. Do not remove, even though we don't use the object it needs to be initialized!
		$timer = Factory::getTimer();

		// Do we have a tag?
		if (!empty($this->_parametersArray['tag']))
		{
			$this->tag = $this->_parametersArray['tag'];
		}

		// Make sure a tag exists (or create a new one)
		$this->tag = $this->getTag();

		// Reset the log
		$logTag = $this->getLogTag();
		Factory::getLog()->open($logTag);
		Factory::getLog()->reset($logTag);

		// Reset the storage
		$factoryStorageTag = $this->tag . (empty($this->backup_id) ? '' : ('.' . $this->backup_id));
		Factory::getFactoryStorage()->reset($factoryStorageTag);

		// Apply the configuration overrides
		$overrides = Platform::getInstance()->configOverrides;

		if (is_array($overrides) && @count($overrides))
		{
			$registry       = Factory::getConfiguration();
			$protected_keys = $registry->getProtectedKeys();
			$registry->resetProtectedKeys();

			foreach ($overrides as $k => $v)
			{
				$registry->set($k, $v);
			}

			$registry->setProtectedKeys($protected_keys);
		}

		// Get the domain chain
		$this->domain_chain = Factory::getEngineParamsProvider()->getDomainChain();
		$this->total_steps  = count($this->domain_chain) - 1; // Init shouldn't count in the progress bar

		// Mark this engine for Nesting Logging
		$this->nest_logging = true;

		// Preparation is over
		$this->array_cache = null;
		$this->setState(self::STATE_PREPARED);

		// Send a push message to mark the start of backup
		$platform    = Platform::getInstance();
		$timeStamp   = date($platform->translate('DATE_FORMAT_LC2'));
		$pushSubject = sprintf($platform->translate('COM_AKEEBA_PUSH_STARTBACKUP_SUBJECT'), $platform->get_site_name(), $platform->get_host());
		$pushDetails = sprintf($platform->translate('COM_AKEEBA_PUSH_STARTBACKUP_BODY'), $platform->get_site_name(), $platform->get_host(), $timeStamp, $this->getLogTag());

		try
		{
			Factory::getPush()->message($pushSubject, $pushDetails);
		}
		catch (Throwable $e)
		{
			Factory::getLog()->notice(sprintf("Sending push notification failed: %s", $e->getMessage()));
		}
	}

	/**
	 * Main backup process. Sets the state to STATE_RUNNING or STATE_POSTRUN.
	 *
	 * @return  void
	 */
	protected function _run()
	{
		$result = null;
		$logTag = $this->getLogTag();
		$logger = Factory::getLog();
		$logger->open($logTag);

		// Maybe we're already done or in an error state?
		if (in_array($this->getState(), [self::STATE_POSTRUN, self::STATE_ERROR]))
		{
			return;
		}

		// Set running state
		$this->setState(self::STATE_RUNNING);

		// Do I even have enough time...?
		$timer    = Factory::getTimer();
		$registry = Factory::getConfiguration();

		if (($timer->getTimeLeft() <= 0))
		{
			// We need to set the break flag for the part processing to not batch successive steps
			$registry->set('volatile.breakflag', true);

			return;
		}

		// Initialize operation counter
		$registry->set('volatile.operation_counter', 0);

		// Advance step counter
		$stepCounter = $registry->get('volatile.step_counter', 0);
		$registry->set('volatile.step_counter', ++$stepCounter);

		// Log step start number
		$logger->debug('====== Starting Step number ' . $stepCounter . ' ======');

		if (defined('AKEEBADEBUG'))
		{
			$root = Platform::getInstance()->get_site_root();
			$logger->debug('Site root: ' . $root);
		}

		$finished = false;
		$error    = false;
		// BREAKFLAG is optionally passed by domains to force-break current operation
		$breakFlag = false;

		// Apply an infinite time limit if required
		if ($registry->get('akeeba.tuning.settimelimit', 0))
		{
			if (function_exists('ini_set'))
			{
				@ini_set('max_execution_time', 844000);
			}

			if (function_exists('set_time_limit'))
			{
				set_time_limit(0);
			}
		}

		// Apply a large memory limit (1Gb) if required
		if ($registry->get('akeeba.tuning.setmemlimit', 0))
		{
			if (function_exists('ini_set'))
			{
				ini_set('memory_limit', '17179869184');
			}
		}

		// Update statistics, marking the backup as currently processing a backup step.
		Factory::getStatistics()->updateInStep(true);

		// Loop until time's up, we're done or an error occurred, or BREAKFLAG is set
		$this->array_cache = null;
		$object            = null;

		while (($timer->getTimeLeft() > 0) && (!$finished) && (!$error) && (!$breakFlag))
		{
			// Reset the break flag
			$registry->set('volatile.breakflag', false);

			// Do we have to switch domains? This only happens if there is no active
			// domain, or the current domain has finished
			$have_to_switch = false;
			$object         = null;

			if ($this->class == '')
			{
				$have_to_switch = true;
			}
			else
			{
				$object = Factory::getDomainObject($this->class);

				if (!is_object($object))
				{
					$have_to_switch = true;
				}
				elseif (!in_array('getState', get_class_methods($object)))
				{
					$have_to_switch = true;
				}
				elseif ($object->getState() == self::STATE_FINISHED)
				{
					$have_to_switch = true;
				}
			}

			// Switch domain if necessary
			if ($have_to_switch)
			{
				$logger->debug('Kettenrad :: Switching domains');

				if (!Factory::getConfiguration()->get('akeeba.tuning.nobreak.domains', 0))
				{
					$logger->debug("Kettenrad :: BREAKING STEP BEFORE SWITCHING DOMAIN");
					$registry->set('volatile.breakflag', true);
				}

				// Free last domain
				$object = null;

				if (empty($this->domain_chain))
				{
					// Aw, we're done! No more domains to run.
					$this->setState(self::STATE_POSTRUN);
					$logger->debug("Kettenrad :: No more domains to process");
					$logger->debug('====== Finished Step number ' . $stepCounter . ' ======');
					$this->array_cache = null;

					return;
				}

				// Shift the next definition off the stack
				$this->array_cache = null;
				$new_definition    = array_shift($this->domain_chain);

				if (array_key_exists('class', $new_definition))
				{
					$logger->debug("Switching to domain {$new_definition['domain']}, class {$new_definition['class']}");
					$this->domain = $new_definition['domain'];
					$this->class  = $new_definition['class'];
					// Get a working object
					$object = Factory::getDomainObject($this->class);
					$object->setup($this->_parametersArray);
				}
				else
				{
					$logger->warning("Kettenrad :: No class defined trying to switch domains. The backup will crash.");
					$this->domain = null;
					$this->class  = null;
				}
			}
			elseif (!is_object($object))
			{
				$logger->debug("Kettenrad :: Getting domain object of class {$this->class}");
				$object = Factory::getDomainObject($this->class);
			}


			// Tick the object
			$logger->debug('Kettenrad :: Ticking the domain object');
			$this->lastException = null;

			try
			{
				// We ask the domain object to execute and return its output array
				$result = $object->tick();

				$hasErrorException = array_key_exists('ErrorException', $result) && is_object($result['ErrorException']);
				$hasErrorString    = array_key_exists('Error', $result) && !empty($result['Error']);

				/**
				 * Legacy objects may not be throwing exceptions on error, instead returning an Error string in the
				 * output array. The code below addresses this discrepancy.
				 */
				if (!$hasErrorException && $hasErrorString)
				{
					$result['ErrorException'] = new RuntimeException($result['Error']);
					$hasErrorException        = true;
				}

				/**
				 * Some domain objects may be acting as nested Parts, e.g. the Database domain. In this case the
				 * internal Engine (itself a Part object) is absorbing the thrown exception and relays it in the output
				 * table's ErrorException key. This means that the code above will NOT catch the error. This code below
				 * addresses that situation by rethrowing the exception.
				 *
				 * Practical example: cannot connect to MySQL is thrown by the MySQL Dump engine. The Native database
				 * backup engine absorbs the exception and reports it back to the Database domain object through the
				 * returned output array. However, the Database domain object does not rethrow it, simply relaying it
				 * back to Kettenrad through its own returned output array. As a result we enter an infinite loop where
				 * Kettenrad asks the Database domain to tick, it asks the Native engine to tick which asks the MySQL
				 * Dump object to tick. However the latter fails again to connect to MySQL and the whole process is
				 * repeated ad nauseam. By rethrowing the propagated ErrorException we alleviate this problem.
				 */
				if ($hasErrorException)
				{
					throw $result['ErrorException'];
				}

				$logger->debug('Kettenrad :: Domain object returned without errors; propagating');
			}
			catch (Exception $e)
			{
				/**
				 * Exceptions are used to propagate error conditions through the engine. Catching them and storing them
				 * in $this->lastException lets us detect and report the error condition in Kettenrad, the integration-
				 * facing interface of the backup engine.
				 */
				$this->lastException = $e;

				$logger->debug('Kettenrad :: Domain object returned with errors; propagating');

				self::logErrorsFromException($this->lastException);

				$this->setState(self::STATE_ERROR);
			}

			// Advance operation counter
			$currentOperationNumber = $registry->get('volatile.operation_counter', 0);
			$currentOperationNumber++;
			$registry->set('volatile.operation_counter', $currentOperationNumber);

			// Process return array
			$this->setDomain($this->domain);
			$this->setStep($result['Step']);
			$this->setSubstep($result['Substep']);

			// Check for BREAKFLAG
			$breakFlag = $registry->get('volatile.breakflag', false);
			$logger->debug("Kettenrad :: Break flag status: " . ($breakFlag ? 'YES' : 'no'));

			// Process errors
			$error = $this->getState() === self::STATE_ERROR;

			// Check if the backup procedure should finish now
			$finished = $error ? true : !($result['HasRun']);

			// Log operation end
			$logger->debug('----- Finished operation ' . $currentOperationNumber . ' ------');
		}

		// Log the result
		$objectStepType = is_object($object) ? get_class($object) : 'INVALID OBJECT';

		if (!is_object($object))
		{
			$reason = ($timer->getTimeLeft() <= 0)
				? 'we already ran out of time'
				: 'a step break has already been requested';
			$logger->debug(
				sprintf(
					"Finishing step immediately because %s", $reason
				)
			);
		}
		elseif (!$error)
		{
			$logger->debug("Successful Smart algorithm on " . $objectStepType);
		}
		else
		{
			$logger->error("Failed Smart algorithm on " . $objectStepType);
		}

		// Log if we have to do more work or not
		/**
		 * The domain object is not set in the following cases:
		 *
		 * - There is no time left, the while loop never ran.
		 * - The break flag was already set, the while loop never ran.
		 * - We are already finished, the while loop never ran. Shouldn't happen, the step status is set to POSTRUN.
		 * - There was an error, the while loop never ran. Shouldn't happen, we return immediately upon an error.
		 * - We tried to go to the next domain but something went wrong. Shouldn't happen.
		 *
		 * If we get to a condition that shouldn't happen we will throw a Runtime exception. In any other case we let
		 * the step finish.
		 */
		if (!is_object($object) && ($timer->getTimeLeft() > 0) && !$breakFlag)
		{
			throw new RuntimeException(
				sprintf(
					"Kettenrad :: Empty object found when processing domain '%s'. This should never happen.",
					$this->domain
				)
			);
		}
		/** @noinspection PhpStatementHasEmptyBodyInspection */
		elseif (!is_object($object))
		{
			// This is an expected case.
			// I have to use an empty case because $object->getState() below would cause a PHP error on a NULL variable.
		}
		elseif ($object->getState() == self::STATE_RUNNING)
		{
			$logger->debug("Kettenrad :: More work required in domain '" . $this->domain . "'");
			// We need to set the break flag for the part processing to not batch successive steps
			$registry->set('volatile.breakflag', true);
		}
		elseif ($object->getState() == self::STATE_FINISHED)
		{
			$logger->debug("Kettenrad :: Domain '" . $this->domain . "' has finished.");
			$registry->set('volatile.breakflag', false);
		}
		elseif ($object->getState() == self::STATE_ERROR)
		{
			$logger->debug("Kettenrad :: Domain '" . $this->domain . "' has experienced an error.");
			$registry->set('volatile.breakflag', false);
		}

		// Log step end
		$logger->debug('====== Finished Step number ' . $stepCounter . ' ======');

		// Update statistics, marking the backup as having just finished processing a backup step.
		Factory::getStatistics()->updateInStep(false);

		if (!$registry->get('akeeba.tuning.nobreak.domains', 0))
		{
			// Force break between steps
			$logger->debug('Kettenrad :: Setting the break flag between domains');
			$registry->set('volatile.breakflag', true);
		}
	}

	/**
	 * Returns the tag used to open the correct log file
	 *
	 * @return string
	 */
	protected function getLogTag()
	{
		$tag = $this->getTag();

		if (!empty($this->backup_id))
		{
			$tag .= '.' . $this->backup_id;
		}

		return $tag;
	}
}

/**
 * Timeout error handler
 */
function akeebaEnginePHPTimeoutHandler()
{
	if (connection_status() == 1)
	{
		Factory::getLog()->error('The process was aborted on user\'s request');

		return;
	}

	if (connection_status() >= 2)
	{
		Factory::getLog()->error('Akeeba Backup has timed out. Please read the documentation.');

		return;
	}
}

// Register the timeout error handler
if (!Kettenrad::$registeredShutdownCallback)
{
	Kettenrad::$registeredShutdownCallback = true;

	register_shutdown_function("\\Akeeba\\Engine\\Core\\akeebaEnginePHPTimeoutHandler");
}

/**
 * Custom PHP error handler to log catchable PHP errors to the backup log file
 *
 * @param   int     $errno
 * @param   string  $errstr
 * @param   string  $errfile
 * @param   int     $errline
 *
 * @return bool|null
 */
function akeebaEngineErrorHandler($errno, $errstr, $errfile, $errline)
{
	// Sanity check
	if (!function_exists('error_reporting'))
	{
		return false;
	}

	// Do not proceed if the error springs from an @function() construct, or if
	// the overall error reporting level is set to report no errors.
	$error_reporting = error_reporting();

	if ($error_reporting == 0)
	{
		return false;
	}

	$loggable = false;
	$type     = '';
	$logMode  = 'debug';

	switch ($errno)
	{
		case E_ERROR:
		case E_USER_ERROR:
		case E_RECOVERABLE_ERROR:
			/**
			 * This will only work for E_RECOVERABLE_ERROR and E_USER_ERROR, not E_ERROR. In PHP 7 all errors throw an
			 * Error throwable (a special kind of exception) which propagates nicely within our architecture.
			 */
			Factory::getLog()->error("PHP FATAL ERROR on line $errline in file $errfile:");
			Factory::getLog()->error($errstr);
			Factory::getLog()->error("Execution aborted due to PHP fatal error");
			break;

		case E_WARNING:
			$loggable = true;
			$type     = 'WARNING';
			$logMode  = defined('AKEEBADEBUG') ? 'warning' : 'debug';

			break;

		case E_USER_WARNING:
			$loggable = defined('AKEEBADEBUG');
			$type     = 'User Warning';
			break;

		case E_NOTICE:
			$loggable = defined('AKEEBADEBUG');
			$type     = 'Notice';
			break;

		case E_USER_NOTICE:
			$loggable = defined('AKEEBADEBUG');
			$type     = 'User Notice';
			break;

		case E_DEPRECATED:
			$loggable = defined('AKEEBADEBUG');
			$type     = 'Deprecated';
			break;

		case E_USER_DEPRECATED:
			$loggable = defined('AKEEBADEBUG');
			$type     = 'User Deprecated';
			break;

		case E_STRICT:
			$loggable = defined('AKEEBADEBUG');
			$type     = 'Strict Notice';
			break;

		default:
			// These are E_DEPRECATED, E_STRICT etc. Let PHP handle them
			return false;

			break;
	}

	if ($loggable)
	{
		Factory::getLog()->{$logMode}("PHP $type (not an error; you can ignore) on line $errline in file $errfile:");
		Factory::getLog()->{$logMode}($errstr);
	}

	// Uncomment to prevent the execution of PHP's internal error handler
	//return true;

	// Let PHP's internal error handler take care of the error.
	return false;
}
components/com_akeeba/BackupEngine/Core/02.advanced.json000060400000002341152453623440017106 0ustar00{
    "_group": {
        "description": "COM_AKEEBA_CONFIG_ADVANCED"
    },
    "akeeba.advanced.dump_engine": {
        "default": "native",
        "type": "engine",
        "subtype": "dump",
        "protected": "1",
        "title": "COM_AKEEBA_CONFIG_DUMPENGINE_TITLE",
        "description": "COM_AKEEBA_CONFIG_DUMPENGINE_DESCRIPTION"
    },
    "akeeba.advanced.scan_engine": {
        "default": "smart",
        "type": "engine",
        "subtype": "scan",
        "protected": "1",
        "title": "COM_AKEEBA_CONFIG_SCANENGINE_TITLE",
        "description": "COM_AKEEBA_CONFIG_SCANENGINE_DESCRIPTION"
    },
    "akeeba.advanced.archiver_engine": {
        "default": "jpa",
        "type": "engine",
        "subtype": "archiver",
        "title": "COM_AKEEBA_CONFIG_ARCHIVERENGINE_TITLE",
        "description": "COM_AKEEBA_CONFIG_ARCHIVERENGINE_DESCRIPTION"
    },
    "akeeba.advanced.postproc_engine": {
        "default": "none",
        "type": "none",
        "protected": "1"
    },
    "akeeba.advanced.embedded_installer": {
        "default": "angie",
        "type": "none",
        "protected": "1"
    },
    "engine.installer.angie.key": {
        "default": "",
        "type": "none",
        "protected": "1"
    }
}components/com_akeeba/BackupEngine/Core/Filters.php000060400000025162152453623440016355 0ustar00<?php
/**
 * Akeeba Engine
 *
 * @package   akeebaengine
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3, or later
 *
 * 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, version 3.
 *
 * 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, see
 * <https://www.gnu.org/licenses/>.
 */

namespace Akeeba\Engine\Core;

defined('AKEEBAENGINE') || die();

use Akeeba\Engine\Factory;
use Akeeba\Engine\Filter\Base as FilterBase;
use Akeeba\Engine\Platform;
use DirectoryIterator;
use RuntimeException;

/**
 * Akeeba filtering feature
 */
class Filters
{
	/** @var array An array holding data for all defined filters */
	private $filter_registry = [];

	/** @var FilterBase[] Hash array with instances of all filters as $filter_name => filter_object */
	private $filters = [];

	/** @var bool True after the filter clean up has run */
	private $cleanup_has_run = false;

	/**
	 * Public constructor, loads filter data and filter classes
	 */
	public function __construct()
	{
		// Load filter data from platform's database
		Factory::getLog()->debug('Fetching filter data from database');
		$this->filter_registry = Platform::getInstance()->load_filters();

		// Load platform, plugin and core filters
		$this->filters = [];

		$locations = [
			Factory::getAkeebaRoot() . '/Filter',
		];

		$platform_paths = Platform::getInstance()->getPlatformDirectories();

		foreach ($platform_paths as $p)
		{
			$locations[] = $p . '/Filter';
		}

		Factory::getLog()->debug('Loading filters');

		foreach ($locations as $folder)
		{
			if (!@is_dir($folder))
			{
				continue;
			}

			if (!@is_readable($folder))
			{
				continue;
			}

			$di = new DirectoryIterator($folder);

			foreach ($di as $file)
			{
				if (!$file->isFile())
				{
					continue;
				}

				// PHP 5.3.5 and earlier do not support getExtension
				if ($file->getExtension() != 'php')
				{
					continue;
				}

				$filename = $file->getFilename();

				// Skip filter files starting with dot or dash
				if (in_array(substr($filename, 0, 1), ['.', '_']))
				{
					continue;
				}

				// Some hosts copy .json and .php files, renaming them (ie foobar.1.php)
				// We need to exclude them, otherwise we'll get a fatal error for declaring the same class twice
				$bare_name = $file->getBasename('.php');

				if (preg_match('/[^a-zA-Z0-9]/', $bare_name))
				{
					continue;
				}

				// Extract filter base name
				$filter_name = ucfirst($bare_name);

				// This is an abstract class; do not try to create instance
				if ($filter_name == 'Base')
				{
					continue;
				}

				// Skip already loaded filters
				if (array_key_exists($filter_name, $this->filters))
				{
					continue;
				}

				Factory::getLog()->debug('-- Loading filter ' . $filter_name);

				// Add the filter
				$this->filters[$filter_name] = Factory::getFilterObject($filter_name);
			}
		}

		// Load platform, plugin and core stacked filters
		$locations = [
			Factory::getAkeebaRoot() . '/Filter/Stack',
		];

		$platform_paths       = Platform::getInstance()->getPlatformDirectories();
		$platform_stack_paths = [];

		foreach ($platform_paths as $p)
		{
			$locations[]            = $p . '/Filter';
			$locations[]            = $p . '/Filter/Stack';
			$platform_stack_paths[] = $p . '/Filter/Stack';
		}

		$config = Factory::getConfiguration();
		Factory::getLog()->debug('Loading optional filters');

		foreach ($locations as $folder)
		{
			if (!@is_dir($folder))
			{
				continue;
			}

			if (!@is_readable($folder))
			{
				continue;
			}

			$di = new DirectoryIterator($folder);

			/** @var DirectoryIterator $file */
			foreach ($di as $file)
			{
				if (!$file->isFile())
				{
					continue;
				}

				// PHP 5.3.5 and earlier do not support getExtension
				// if ($file->getExtension() != 'php')
				if (substr($file->getBasename(), -4) != '.php')
				{
					continue;
				}

				// Some hosts copy .json and .php files, renaming them (ie foobar.1.php)
				// We need to exclude them, otherwise we'll get a fatal error for declaring the same class twice
				$bare_name = strtolower($file->getBasename('.php'));

				if (preg_match('/[^A-Za-z0-9]/', $bare_name))
				{
					continue;
				}

				// Extract filter base name
				if (substr($bare_name, 0, 5) == 'stack')
				{
					$bare_name = substr($bare_name, 5);
				}

				$filter_name = 'Stack\\Stack' . ucfirst($bare_name);

				// Skip already loaded filters
				if (array_key_exists($filter_name, $this->filters))
				{
					continue;
				}

				// Make sure the JSON file also exists
				if (!file_exists($folder . '/' . $bare_name . '.json'))
				{
					continue;
				}

				$key = "core.filters.$bare_name.enabled";

				if ($config->get($key, 0))
				{
					Factory::getLog()->debug('-- Loading optional filter ' . $filter_name);
					// Add the filter
					$this->filters[$filter_name] = Factory::getFilterObject($filter_name);
				}
			}
		}
	}

	/**
	 * Extended filtering information of a given object. Applies only to exclusion filters.
	 *
	 * @param   string|array  $test       The string to check for filter status (e.g. filename, dir name, table name,
	 *                                    etc)
	 * @param   string        $root       The exclusion root test belongs to
	 * @param   string        $object     What type of object is it? dir|file|dbobject
	 * @param   string        $subtype    Filter subtype (all|content|children)
	 * @param   string        $by_filter  [out] The filter name which first matched $test, or an empty string
	 *
	 * @return  bool  True if it is a filtered element
	 */
	public function isFilteredExtended($test, $root, $object, $subtype, &$by_filter)
	{
		if (!$this->cleanup_has_run)
		{
			// Loop the filters and clean up those with no data
			/**
			 * @var string     $filter_name
			 * @var FilterBase $filter
			 */
			foreach ($this->filters as $filter_name => $filter)
			{
				if (!$filter->hasFilters())
				{
					unset($this->filters[$filter_name]);
				} // Remove empty filters
			}
			$this->cleanup_has_run = true;
		}

		$by_filter = '';
		if (!empty($this->filters))
		{
			foreach ($this->filters as $filter_name => $filter)
			{
				if ($filter->isFiltered($test, $root, $object, $subtype))
				{
					$by_filter = strtolower($filter_name);

					return true;
				}
			}

			// If we are still here, no filter matched
			return false;
		}
		else
		{
			return false;
		}
	}

	/**
	 * Returns the filtering status of a given object
	 *
	 * @param   string|array  $test     The string to check for filter status (e.g. filename, dir name, table name, etc)
	 * @param   string        $root     The exclusion root test belongs to
	 * @param   string        $object   What type of object is it? dir|file|dbobject
	 * @param   string        $subtype  Filter subtype (all|content|children)
	 *
	 * @return  bool  True if it is a filtered element
	 */
	public function isFiltered($test, $root, $object, $subtype)
	{
		$by_filter = '';

		return $this->isFilteredExtended($test, $root, $object, $subtype, $by_filter);
	}

	/**
	 * Returns the inclusion filters for a specific object type
	 *
	 * @param   string  $object  The inclusion object (dir|db)
	 *
	 * @return array
	 */
	public function &getInclusions($object)
	{
		$inclusions = [];

		if (!empty($this->filters))
		{
			/**
			 * @var string     $filter_name
			 * @var FilterBase $filter
			 */
			foreach ($this->filters as $filter_name => $filter)
			{
				if (!is_object($filter))
				{
					throw new RuntimeException("Object for filter $filter_name not found. The engine will now crash.");
				}

				$new_inclusions = $filter->getInclusions($object);

				if (!empty($new_inclusions))
				{
					$inclusions = array_merge($inclusions, $new_inclusions);
				}
			}
		}

		return $inclusions;
	}

	/**
	 * Returns the filter registry information for a specified filter class
	 *
	 * @param   string  $filter_name  The name of the filter we want data for
	 *
	 * @return    array    The filter data for the requested filter
	 */
	public function &getFilterData($filter_name)
	{
		if (array_key_exists($filter_name, $this->filter_registry))
		{
			return $this->filter_registry[$filter_name];
		}
		else
		{
			$dummy = [];

			return $dummy;
		}
	}

	/**
	 * Replaces the filter data of a specific filter with the new data
	 *
	 * @param   string  $filter_name  The filter for which to modify the stored data
	 * @param   string  $data         The new data
	 */
	public function setFilterData($filter_name, &$data)
	{
		$this->filter_registry[$filter_name] = $data;
	}

	/**
	 * Saves all filters to the platform defined database
	 *
	 * @return bool    True on success
	 */
	public function save()
	{
		return Platform::getInstance()->save_filters($this->filter_registry);
	}

	/**
	 * Get SQL statements to append to the database backup file
	 *
	 * @param   string  $root
	 *
	 * @return  array
	 */
	public function getExtraSQL(string $root): array
	{
		if (count($this->filters) < 1)
		{
			return [];
		}

		$ret = [];

		/**
		 * @var FilterBase $filter
		 */
		foreach ($this->filters as $filter)
		{
			$ret = array_merge($ret, $filter->getExtraSQL($root));
		}

		return $ret;
	}

	public function filterDatabaseRowContent(string $root, string $tableAbstract, array &$row): void
	{
		foreach ($this->filters as $filter)
		{
			$filter->filterDatabaseRowContent($root, $tableAbstract, $row);
		}
	}

	public function canFilterDatabaseRowContent(): bool
	{
		return array_reduce($this->filters, function (bool $carry, FilterBase $filter) {
			return $carry || $filter->canFilterDatabaseRowContent;
		}, false);
	}

	/**
	 * Checks if there is an active filter for the object/subtype requested.
	 *
	 * @param   string  $object   The filtering object: dir|file|dbobject|db
	 * @param   string  $subtype  The filtering subtype: all|content|children|inclusion
	 *
	 * @return bool
	 */
	public function hasFilterType($object, $subtype = null)
	{
		foreach ($this->filters as $filter_name => $filter)
		{
			if ($filter->object == $object)
			{
				if (is_null($subtype))
				{
					return true;
				}
				elseif ($filter->subtype == $subtype)
				{
					return true;
				}
			}
		}

		return false;
	}

	/**
	 * Resets all filters, reverting them to a blank state
	 *
	 * @return  void
	 *
	 * @since   5.4.0
	 */
	public function reset()
	{
		$this->filter_registry = [];
	}
}
components/com_akeeba/BackupEngine/Core/01.basic.json000060400000002711152453623440016422 0ustar00{
    "_group": {
        "description": "COM_AKEEBA_CONFIG_HEADER_BASIC"
    },
    "akeeba.basic.output_directory": {
        "default": "[DEFAULT_OUTPUT]",
        "type": "browsedir",
        "title": "COM_AKEEBA_CONFIG_OUTDIR_TITLE",
        "description": "COM_AKEEBA_CONFIG_OUTDIR_DESCRIPTION"
    },
    "akeeba.basic.log_level": {
        "default": "4",
        "type": "enum",
        "enumkeys": "COM_AKEEBA_CONFIG_LOGLEVEL_NONE|COM_AKEEBA_CONFIG_LOGLEVEL_WARNING|COM_AKEEBA_CONFIG_LOGLEVEL_DEBUG",
        "enumvalues": "0|2|4",
        "title": "COM_AKEEBA_CONFIG_LOGLEVEL_TITLE",
        "description": "COM_AKEEBA_CONFIG_LOGLEVEL_DESCRIPTION"
    },
    "akeeba.basic.archive_name": {
        "default": "site-[HOST]-[DATE]-[TIME_TZ]-[RANDOM]",
        "type": "string",
        "title": "COM_AKEEBA_CONFIG_ARCHIVENAME_TITLE",
        "description": "COM_AKEEBA_CONFIG_ARCHIVENAME_DESCRIPTION"
    },
    "akeeba.basic.backup_type": {
        "default": "full",
        "type": "enum",
        "enumkeys": "COM_AKEEBA_CONFIG_BACKUPTYPE_FULL|COM_AKEEBA_CONFIG_BACKUPTYPE_DBONLY",
        "enumvalues": "full|dbonly",
        "title": "COM_AKEEBA_CONFIG_BACKUPTYPE_TITLE",
        "description": "COM_AKEEBA_CONFIG_BACKUPTYPE_DESCRIPTION"
    },
    "akeeba.basic.clientsidewait": {
        "default": "0",
        "type": "bool",
        "title": "COM_AKEEBA_CONFIG_CLIENTSIDEWAIT_TITLE",
        "description": "COM_AKEEBA_CONFIG_CLIENTSIDEWAIT_DESCRIPTION"
    }
}components/com_akeeba/akeeba.xml000060400000004531152453623440012740 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->

<extension version="3.9.0" type="component" method="upgrade">
	<name>Akeeba</name>
	<creationDate>2025-05-09</creationDate>
	<author>Nicholas K. Dionysopoulos</author>
	<authorEmail>nicholas@dionysopoulos.me</authorEmail>
	<authorUrl>https://www.akeeba.com</authorUrl>
	<copyright>Copyright (c)2006-2019 Akeeba Ltd / Nicholas K. Dionysopoulos</copyright>
	<license>GNU GPL v3 or later</license>
	<version>8.4.1</version>
	<description>Akeeba Backup Core - Full Joomla! site backup solution, Core Edition.</description>

	<!-- Public front end files -->
	<files folder="frontend">
		<folder>Dispatcher</folder>
		<filename>akeeba.php</filename>
	</files>

	<!-- Front end translation files -->
	<languages folder="language/frontend">
		<language tag="en-GB">en-GB/en-GB.com_akeeba.ini</language>
	</languages>

	<!-- Media files -->
	<media destination="com_akeeba" folder="media">
		<folder>css</folder>
		<folder>fonts</folder>
		<folder>icons</folder>
		<folder>js</folder>
	</media>

	<!-- Administrator back-end section -->
	<administration>
		<!-- Administration menu -->
		<menu>COM_AKEEBA</menu>

		<!-- Back-end files -->
		<files folder="backend">
			<folder>backup</folder>
			<folder>BackupEngine</folder>
			<folder>BackupPlatform</folder>
			<folder>CliCommands</folder>
			<folder>Controller</folder>
			<folder>Dispatcher</folder>
			<folder>fields</folder>
			<folder>Helper</folder>
			<folder>Master</folder>
			<folder>Model</folder>
			<folder>sql</folder>
			<folder>Toolbar</folder>
			<folder>View</folder>
			<folder>tmpl</folder>

			<filename>akeeba.php</filename>
			<filename>fof.xml</filename>
			<filename>version.php</filename>
			<filename>config.xml</filename>
			<filename>access.xml</filename>
			<filename>CHANGELOG.php</filename>
			<filename>Container.php</filename>
		</files>

		<!-- Back-end translation files -->
		<languages folder="language/backend">
			<language tag="en-GB">en-GB/en-GB.com_akeeba.ini</language>
			<language tag="en-GB">en-GB/en-GB.com_akeeba.sys.ini</language>
		</languages>

	</administration>

	<!-- Installation / uninstallation script file -->
	<scriptfile>script.com_akeeba.php</scriptfile>
</extension>
components/com_banners/models/fields/impmade.php000060400000002032152453623440016076 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Impressions field.
 *
 * @since  1.6
 */
class JFormFieldImpMade extends JFormField
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $type = 'ImpMade';

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string	The field input markup.
	 *
	 * @since   1.6
	 */
	protected function getInput()
	{
		$onclick = ' onclick="document.getElementById(\'' . $this->id . '\').value=\'0\';"';

		return '<input class="input-small" type="text" name="' . $this->name . '" id="' . $this->id . '" value="'
			. htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8') . '" readonly="readonly" /> <a class="btn" ' . $onclick . '>'
			. '<span class="icon-refresh" aria-hidden="true"></span> ' . JText::_('COM_BANNERS_RESET_IMPMADE') . '</a>';
	}
}
components/com_banners/models/fields/bannerclient.php000060400000001531152453623440017131 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('BannersHelper', JPATH_ADMINISTRATOR . '/components/com_banners/helpers/banners.php');

JFormHelper::loadFieldClass('list');

/**
 * Bannerclient field.
 *
 * @since  1.6
 */
class JFormFieldBannerClient extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $type = 'BannerClient';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   1.6
	 */
	public function getOptions()
	{
		return array_merge(parent::getOptions(), BannersHelper::getClientOptions());
	}
}
components/com_banners/models/fields/clicks.php000060400000002022152453623440015731 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Clicks field.
 *
 * @since  1.6
 */
class JFormFieldClicks extends JFormField
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $type = 'Clicks';

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string	The field input markup.
	 *
	 * @since   1.6
	 */
	protected function getInput()
	{
		$onclick = ' onclick="document.getElementById(\'' . $this->id . '\').value=\'0\';"';

		return '<input class="input-small" type="text" name="' . $this->name . '" id="' . $this->id . '" value="'
			. htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8') . '" readonly="readonly" /> <a class="btn" ' . $onclick . '>'
			. '<span class="icon-refresh" aria-hidden="true"></span> ' . JText::_('COM_BANNERS_RESET_CLICKS') . '</a>';
	}
}
components/com_banners/models/fields/imptotal.php000060400000003046152453623440016321 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Total Impressions field.
 *
 * @since  1.6
 */
class JFormFieldImpTotal extends JFormField
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $type = 'ImpTotal';

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string	The field input markup.
	 *
	 * @since   1.6
	 */
	protected function getInput()
	{
		$class    = ' class="validate-numeric text_area"';
		$onchange = ' onchange="document.getElementById(\'' . $this->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 '<input type="text" name="' . $this->name . '" id="' . $this->id . '" size="9" value="' . htmlspecialchars($value, ENT_COMPAT, 'UTF-8')
			. '" ' . $class . $onchange . ' />'
			. '<fieldset class="checkbox impunlimited"><input id="' . $this->id . '_unlimited" type="checkbox"' . $checked . $onclick . ' />'
			. '<label for="' . $this->id . '_unlimited" id="jform-imp" type="text">' . JText::_('COM_BANNERS_UNLIMITED') . '</label></fieldset>';
	}
}
components/com_banners/models/clients.php000060400000017214152453623440014665 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Methods supporting a list of banner records.
 *
 * @since  1.6
 */
class BannersModelClients extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JControllerLegacy
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'name', 'a.name',
				'contact', 'a.contact',
				'state', 'a.state',
				'checked_out', 'a.checked_out',
				'checked_out_time', 'a.checked_out_time',
				'purchase_type', 'a.purchase_type'
			);
		}

		parent::__construct($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.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 empty 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];
	}
}
components/com_banners/models/tracks.php000060400000031761152453623440014516 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Archive\Archive;
use Joomla\String\StringHelper;

JLoader::register('BannersHelper', JPATH_ADMINISTRATOR . '/components/com_banners/helpers/banners.php');

/**
 * Methods supporting a list of tracks.
 *
 * @since  1.6
 */
class BannersModelTracks extends JModelList
{
	/**
	 * The base name
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $basename;

	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JControllerLegacy
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'b.name', 'banner_name',
				'cl.name', 'client_name', 'client_id',
				'c.title', 'category_title', 'category_id',
				'track_type', 'a.track_type', 'type',
				'count', 'a.count',
				'track_date', 'a.track_date', 'end', 'begin',
				'level', 'c.level',
			);
		}

		parent::__construct($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 = 'b.name', $direction = 'asc')
	{
		// Load the filter state.
		$this->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('%' . StringHelper::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 = 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 client name
	 *
	 * @return  string  The client 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;
	}
}
components/com_banners/models/banners.php000060400000017653152453623440014663 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Methods supporting a list of banner records.
 *
 * @since  1.6
 */
class BannersModelBanners extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JControllerLegacy
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'cid', 'a.cid', 'client_name',
				'name', 'a.name',
				'alias', 'a.alias',
				'state', 'a.state',
				'ordering', 'a.ordering',
				'language', 'a.language',
				'catid', 'a.catid', 'category_title',
				'checked_out', 'a.checked_out',
				'checked_out_time', 'a.checked_out_time',
				'created', 'a.created',
				'impmade', 'a.impmade',
				'imptotal', 'a.imptotal',
				'clicks', 'a.clicks',
				'publish_up', 'a.publish_up',
				'publish_down', 'a.publish_down',
				'sticky', 'a.sticky',
				'client_id',
				'category_id',
				'published',
				'level', 'c.level',
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to get the maximum ordering value for each category.
	 *
	 * @return  array
	 *
	 * @since   1.6
	 */
	public function &getCategoryOrders()
	{
		if (!isset($this->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);
	}
}
components/com_banners/models/banner.php000060400000027606152453623440014477 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Banner model.
 *
 * @since  1.6
 */
class BannersModelBanner extends JModelAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_BANNERS_BANNER';

	/**
	 * The type alias for this content type.
	 *
	 * @var    string
	 * @since  3.2
	 */
	public $typeAlias = 'com_banners.banner';

	/**
	 * Batch copy/move command. If set to false, the batch copy/move command is not supported
	 *
	 * @var  string
	 */
	protected $batch_copymove = 'category_id';

	/**
	 * Allowed batch commands
	 *
	 * @var  array
	 */
	protected $batch_commands = array(
		'client_id'   => '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;
	}

	/**
	 * 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->state != -2)
		{
			return false;
		}

		if (!empty($record->catid))
		{
			return JFactory::getUser()->authorise('core.delete', 'com_banners.category.' . (int) $record->catid);
		}

		return parent::canDelete($record);
	}

	/**
	 * A method to preprocess generating a new title in order to allow tables with alternative names
	 * for alias and title to use the batch move and copy methods
	 *
	 * @param   integer  $categoryId  The target category id
	 * @param   JTable   $table       The JTable within which move or copy is taking place
	 *
	 * @return  void
	 *
	 * @since   3.8.12
	 */
	public function generateTitle($categoryId, $table)
	{
		// Alter the title & alias
		$data = $this->generateNewTitle($categoryId, $table->alias, $table->name);
		$table->name = $data['0'];
		$table->alias = $data['1'];
	}

	/**
	 * 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');

			// Add a prefix for categories created on the fly.
			$form->setFieldAttribute('catid', 'customPrefix', '#new#');
		}

		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');

		// Create new category, if needed.
		$createCategory = true;

		// If category ID is provided, check if it's valid.
		if (is_numeric($data['catid']) && $data['catid'])
		{
			$createCategory = !CategoriesHelper::validateCategoryId($data['catid'], 'com_banners');
		}

		// Save New Category
		if ($createCategory && $this->canCreateCategory())
		{
			$table              = array();

			// Remove #new# prefix, if exists.
			$table['title'] = strpos($data['catid'], '#new#') === 0 ? substr($data['catid'], 5) : $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');
	}

	/**
	 * Method to validate the form data.
	 *
	 * @param   JForm   $form   The form to validate against.
	 * @param   array   $data   The data to validate.
	 * @param   string  $group  The name of the field group to validate.
	 *
	 * @return  array|boolean  Array of filtered data if valid, false otherwise.
	 *
	 * @see     JFormRule
	 * @see     JFilterInput
	 * @since   3.9.25
	 */
	public function validate($form, $data, $group = null)
	{
		// Don't allow to change the users if not allowed to access com_users.
		if (!JFactory::getUser()->authorise('core.manage', 'com_users'))
		{
			if (isset($data['created_by']))
			{
				unset($data['created_by']);
			}
		}

		return parent::validate($form, $data, $group);
	}
}
components/com_banners/models/client.php000060400000006522152453623440014502 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Client model.
 *
 * @since  1.6
 */
class BannersModelClient extends JModelAdmin
{
	/**
	 * The type alias for this content type.
	 *
	 * @var    string
	 * @since  3.2
	 */
	public $typeAlias = 'com_banners.client';

	/**
	 * 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->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)
	{
		$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);
	}
}
components/com_banners/models/forms/banner.xml000060400000020526152453623440015630 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset name="details" addfieldpath="/administrator/components/com_banners/models/fields">

		<field
			name="id"
			type="number"
			label="JGLOBAL_FIELD_ID_LABEL"
			description="JGLOBAL_FIELD_ID_DESC"
			default="0"
			readonly="true"
			class="readonly"
		/>

		<field
			name="name"
			type="text"
			label="COM_BANNERS_FIELD_NAME_LABEL"
			description="COM_BANNERS_FIELD_NAME_DESC"
			class="input-xxlarge input-large-text"
			size="40"
			required="true"
		/>

		<field
			name="alias"
			type="text"
			label="JFIELD_ALIAS_LABEL"
			description="COM_BANNERS_FIELD_ALIAS_DESC"
			size="40"
			hint="JFIELD_ALIAS_PLACEHOLDER"
		/>

		<field
			name="catid"
			type="categoryedit"
			label="JCATEGORY"
			description="COM_BANNERS_FIELD_CATEGORY_DESC"
			extension="com_banners"
			required="true"
			addfieldpath="/administrator/components/com_categories/models/fields"
			default=""
		/>

		<field
			name="state"
			type="list"
			label="JSTATUS"
			description="COM_BANNERS_FIELD_STATE_DESC"
			class="chzn-color-state"
			size="1"
			default="1"
			>
			<option value="1">JPUBLISHED</option>
			<option value="0">JUNPUBLISHED</option>
			<option value="2">JARCHIVED</option>
			<option value="-2">JTRASHED</option>
		</field>

		<field
			name="ordering"
			type="ordering"
			label="JFIELD_ORDERING_LABEL"
			description="JFIELD_ORDERING_DESC"
			table="#__banners"
		/>

		<field
			name="language"
			type="contentlanguage"
			label="JFIELD_LANGUAGE_LABEL"
			description="COM_BANNERS_FIELD_LANGUAGE_DESC"
			>
			<option value="*">JALL</option>
		</field>

		<field
			name="version_note"
			type="text"
			label="JGLOBAL_FIELD_VERSION_NOTE_LABEL"
			description="JGLOBAL_FIELD_VERSION_NOTE_DESC"
			maxlength="255"
			class="span12"
			size="45"
			labelclass="control-label"
		/>

		<field
			name="description"
			type="editor"
			label="JGLOBAL_DESCRIPTION"
			description="COM_BANNERS_FIELD_DESCRIPTION_DESC"
			filter="JComponentHelper::filterText"
			buttons="true"
			hide="readmore,pagebreak,module,article,contact,menu"
		/>

		<field
			name="type"
			type="list"
			label="COM_BANNERS_FIELD_TYPE_LABEL"
			description="COM_BANNERS_FIELD_TYPE_DESC"
			default="0"
			>
			<option value="0">COM_BANNERS_FIELD_VALUE_IMAGE</option>
			<option value="1">COM_BANNERS_FIELD_VALUE_CUSTOM</option>
		</field>

		<field
			name="custombannercode"
			type="textarea"
			label="COM_BANNERS_FIELD_CUSTOMCODE_LABEL"
			description="COM_BANNERS_FIELD_CUSTOMCODE_DESC"
			rows="3"
			cols="30"
			filter="raw"
		/>

		<field
			name="clickurl"
			type="url"
			label="COM_BANNERS_FIELD_CLICKURL_LABEL"
			description="COM_BANNERS_FIELD_CLICKURL_DESC"
			filter="url"
			validate="url"
		/>
	</fieldset>

	<fieldset name="publish" label="COM_BANNERS_GROUP_LABEL_PUBLISHING_DETAILS">

		<field
			name="created"
			type="calendar"
			label="COM_BANNERS_FIELD_CREATED_LABEL"
			description="COM_BANNERS_FIELD_CREATED_DESC"
			size="22"
			translateformat="true"
			showtime="true"
			filter="user_utc"
		/>

		<field
			name="created_by"
			type="user"
			label="COM_BANNERS_FIELD_CREATED_BY_LABEL"
			description="COM_BANNERS_FIELD_CREATED_BY_DESC"
		/>

		<field
			name="created_by_alias"
			type="text"
			label="COM_BANNERS_FIELD_CREATED_BY_ALIAS_LABEL"
			description="COM_BANNERS_FIELD_CREATED_BY_ALIAS_DESC"
			size="20"
		/>

		<field
			name="modified"
			type="calendar"
			label="JGLOBAL_FIELD_MODIFIED_LABEL"
			description="COM_BANNERS_FIELD_MODIFIED_DESC"
			class="readonly"
			size="22"
			readonly="true"
			translateformat="true"
			showtime="true"
			filter="user_utc"
		/>

		<field
			name="modified_by"
			type="user"
			label="JGLOBAL_FIELD_MODIFIED_BY_LABEL"
			description="COM_BANNERS_FIELD_MODIFIED_BY_DESC"
			class="readonly"
			readonly="true"
			filter="unset"
		/>

		<field
			name="version"
			type="text"
			label="COM_BANNERS_FIELD_VERSION_LABEL"
			description="COM_BANNERS_FIELD_VERSION_DESC"
			class="readonly"
			size="6"
			readonly="true"
			filter="unset"
		/>

		<field
			name="publish_up"
			type="calendar"
			label="COM_BANNERS_FIELD_PUBLISH_UP_LABEL"
			description="COM_BANNERS_FIELD_PUBLISH_UP_DESC"
			translateformat="true"
			showtime="true"
			size="22"
			filter="user_utc"
		/>

		<field
			name="publish_down"
			type="calendar"
			label="COM_BANNERS_FIELD_PUBLISH_DOWN_LABEL"
			description="COM_BANNERS_FIELD_PUBLISH_DOWN_DESC"
			translateformat="true"
			showtime="true"
			size="22"
			filter="user_utc"
		/>
	</fieldset>

	<fieldset name="bannerdetails" label="COM_BANNERS_GROUP_LABEL_BANNER_DETAILS">

		<field
			name="sticky"
			type="radio"
			label="COM_BANNERS_FIELD_STICKY_LABEL"
			description="COM_BANNERS_FIELD_STICKY_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>
	</fieldset>

	<fieldset name="otherparams">
		<field
			name="imptotal"
			type="imptotal"
			label="COM_BANNERS_FIELD_IMPTOTAL_LABEL"
			description="COM_BANNERS_FIELD_IMPTOTAL_DESC"
			default="0"
		/>

		<field
			name="impmade"
			type="impmade"
			label="COM_BANNERS_FIELD_IMPMADE_LABEL"
			description="COM_BANNERS_FIELD_IMPMADE_DESC"
			default="0"
		/>

		<field
			name="clicks"
			type="clicks"
			label="COM_BANNERS_FIELD_CLICKS_LABEL"
			description="COM_BANNERS_FIELD_CLICKS_DESC"
			default="0"
		/>

		<field
			name="cid"
			type="bannerclient"
			label="COM_BANNERS_FIELD_CLIENT_LABEL"
			description="COM_BANNERS_FIELD_CLIENT_DESC"
		/>

		<field
			name="purchase_type"
			type="list"
			label="COM_BANNERS_FIELD_PURCHASETYPE_LABEL"
			description="COM_BANNERS_FIELD_PURCHASETYPE_DESC"
			default="0"
			>
			<option value="-1">COM_BANNERS_FIELD_VALUE_USECLIENTDEFAULT</option>
			<option value="1">COM_BANNERS_FIELD_VALUE_UNLIMITED</option>
			<option value="2">COM_BANNERS_FIELD_VALUE_YEARLY</option>
			<option value="3">COM_BANNERS_FIELD_VALUE_MONTHLY</option>
			<option value="4">COM_BANNERS_FIELD_VALUE_WEEKLY</option>
			<option value="5">COM_BANNERS_FIELD_VALUE_DAILY</option>
		</field>

		<field
			name="track_impressions"
			type="list"
			label="COM_BANNERS_FIELD_TRACKIMPRESSION_LABEL"
			description="COM_BANNERS_FIELD_TRACKIMPRESSION_DESC"
			default="0"
			>
			<option value="-1">COM_BANNERS_FIELD_VALUE_USECLIENTDEFAULT</option>
			<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>

		<field
			name="track_clicks"
			type="list"
			label="COM_BANNERS_FIELD_TRACKCLICK_LABEL"
			description="COM_BANNERS_FIELD_TRACKCLICK_DESC"
			default="0"
			>
			<option value="-1">COM_BANNERS_FIELD_VALUE_USECLIENTDEFAULT</option>
			<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>
	</fieldset>

	<fieldset name="metadata" label="JGLOBAL_FIELDSET_METADATA_OPTIONS">

		<field
			name="metakey"
			type="textarea"
			label="JFIELD_META_KEYWORDS_LABEL"
			description="COM_BANNERS_FIELD_METAKEYWORDS_DESC"
			rows="3"
			cols="30"
		/>

		<field
			name="own_prefix"
			type="radio"
			label="COM_BANNERS_FIELD_BANNEROWNPREFIX_LABEL"
			description="COM_BANNERS_FIELD_BANNEROWNPREFIX_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="metakey_prefix"
			type="text"
			label="COM_BANNERS_FIELD_METAKEYWORDPREFIX_LABEL"
			description="COM_BANNERS_FIELD_METAKEYWORDPREFIX_DESC"
		/>
	</fieldset>

	<fields name="params" label="JGLOBAL_FIELDSET_DISPLAY_OPTIONS">
		<fieldset name="image">
			<field
				name="imageurl"
				type="media"
				label="COM_BANNERS_FIELD_IMAGE_LABEL"
				description="COM_BANNERS_FIELD_IMAGE_DESC"
				directory="banners"
				hide_none="1"
				size="40"
			/>

			<field
				name="width"
				type="number"
				label="COM_BANNERS_FIELD_WIDTH_LABEL"
				description="COM_BANNERS_FIELD_WIDTH_DESC"
				class="input-mini validate-numeric"
			/>

			<field
				name="height"
				type="number"
				label="COM_BANNERS_FIELD_HEIGHT_LABEL"
				description="COM_BANNERS_FIELD_HEIGHT_DESC"
				class="input-mini validate-numeric"
			/>

			<field
				name="alt"
				type="text"
				label="COM_BANNERS_FIELD_ALT_LABEL"
				description="COM_BANNERS_FIELD_ALT_DESC"
			/>
		</fieldset>
	</fields>

	<fieldset name="custom">
		<field
			name="bannercode"
			type="textarea"
			label="COM_BANNERS_FIELD_CUSTOMCODE_LABEL"
			description="COM_BANNERS_FIELD_CUSTOMCODE_DESC"
			rows="3"
			cols="30"
			filter="raw"
		/>
	</fieldset>

</form>
components/com_banners/models/forms/client.xml000060400000007033152453623440015637 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset name="details" addfieldpath="/administrator/components/com_banners/models/fields">
		<field
			name="id"
			type="number"
			label="JGLOBAL_FIELD_ID_LABEL"
			description="JGLOBAL_FIELD_ID_DESC"
			default="0"
			readonly="true"
			class="readonly"
		/>

		<field
			name="name"
			type="text"
			label="COM_BANNERS_FIELD_NAME_LABEL"
			description="COM_BANNERS_FIELD_CLIENT_NAME_DESC"
			class="input-xxlarge input-large-text"
			size="40"
			required="true"
		/>

		<field
			name="contact"
			type="text"
			label="COM_BANNERS_FIELD_CONTACT_LABEL"
			description="COM_BANNERS_FIELD_CONTACT_DESC"
			size="40"
			required="true"
		/>

		<field
			name="email"
			type="email"
			label="COM_BANNERS_FIELD_EMAIL_LABEL"
			description="COM_BANNERS_FIELD_EMAIL_DESC"
			size="40"
			validate="email"
		/>

		<field
			name="state"
			type="list"
			label="JSTATUS"
			description="COM_BANNERS_FIELD_CLIENT_STATE_DESC"
			class="chzn-color-state"
			size="1"
			default="1"
			>
			<option value="1">JPUBLISHED</option>
			<option value="0">JUNPUBLISHED</option>
			<option value="2">JARCHIVED</option>
			<option value="-2">JTRASHED</option>
		</field>

		<field
			name="version_note"
			type="text"
			label="JGLOBAL_FIELD_VERSION_NOTE_LABEL"
			description="JGLOBAL_FIELD_VERSION_NOTE_DESC"
			maxlength="255"
			size="45"
			labelclass="control-label"
		/>

		<field
			name="purchase_type"
			type="list"
			label="COM_BANNERS_FIELD_PURCHASETYPE_LABEL"
			description="COM_BANNERS_FIELD_PURCHASETYPE_DESC"
			default="0"
			>
			<option value="-1">JGLOBAL_USE_GLOBAL</option>
			<option value="1">COM_BANNERS_FIELD_VALUE_UNLIMITED</option>
			<option value="2">COM_BANNERS_FIELD_VALUE_YEARLY</option>
			<option value="3">COM_BANNERS_FIELD_VALUE_MONTHLY</option>
			<option value="4">COM_BANNERS_FIELD_VALUE_WEEKLY</option>
			<option value="5">COM_BANNERS_FIELD_VALUE_DAILY</option>
		</field>

		<field
			name="track_impressions"
			type="list"
			label="COM_BANNERS_FIELD_TRACKIMPRESSION_LABEL"
			description="COM_BANNERS_FIELD_TRACKIMPRESSION_DESC"
			default="0"
			class="chzn-color"
			>
			<option value="-1">JGLOBAL_USE_GLOBAL</option>
			<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>

		<field
			name="track_clicks"
			type="list"
			label="COM_BANNERS_FIELD_TRACKCLICK_LABEL"
			description="COM_BANNERS_FIELD_TRACKCLICK_DESC"
			default="0"
			class="chzn-color"
			>
			<option value="-1">JGLOBAL_USE_GLOBAL</option>
			<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>

	</fieldset>

	<fieldset name="metadata" label="JGLOBAL_FIELDSET_METADATA_OPTIONS">
		<field
			name="metakey"
			type="textarea"
			label="JFIELD_META_KEYWORDS_LABEL"
			description="COM_BANNERS_FIELD_CLIENT_METAKEYWORDS_DESC"
			rows="3"
			cols="30"
		/>

		<field
			name="own_prefix"
			type="radio"
			label="COM_BANNERS_FIELD_CLIENTOWNPREFIX_LABEL"
			description="COM_BANNERS_FIELD_CLIENTOWNPREFIX_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="metakey_prefix"
			type="text"
			label="COM_BANNERS_FIELD_CLIENT_METAKEYWORDPREFIX_LABEL"
			description="COM_BANNERS_FIELD_CLIENT_METAKEYWORDPREFIX_DESC"
		/>
	</fieldset>

	<fieldset name="extra" label="COM_BANNERS_EXTRA">
		<field
			name="extrainfo"
			type="textarea"
			label="COM_BANNERS_FIELD_EXTRAINFO_LABEL"
			description="COM_BANNERS_FIELD_EXTRAINFO_DESC"
			class="span12"
			rows="5"
			cols="80"
		/>
	</fieldset>
</form>
components/com_banners/models/forms/filter_banners.xml000060400000006732152453623440017363 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter" addfieldpath="/administrator/components/com_banners/models/fields">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_BANNERS_BANNERS_FILTER_SEARCH_LABEL"
			description="COM_BANNERS_BANNERS_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
		/>

		<field
			name="published"
			type="status"
			label="JOPTION_SELECT_PUBLISHED"
			description="JOPTION_SELECT_PUBLISHED_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>

		<field
			name="category_id"
			type="category"
			label="JOPTION_FILTER_CATEGORY"
			description="JOPTION_FILTER_CATEGORY_DESC"
			extension="com_banners"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_CATEGORY</option>
		</field>

		<field
			name="client_id"
			type="bannerclient"
			label="COM_BANNERS_FILTER_CLIENT"
			description="COM_BANNERS_FILTER_CLIENT_DESC"
			extension="com_content"
			onchange="this.form.submit();"
			>
			<option value="">COM_BANNERS_SELECT_CLIENT</option>
		</field>

		<field
			name="language"
			type="contentlanguage"
			label="JOPTION_FILTER_LANGUAGE"
			description="JOPTION_FILTER_LANGUAGE_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_LANGUAGE</option>
			<option value="*">JALL</option>
		</field>

		<field
			name="level"
			type="integer"
			label="JOPTION_FILTER_LEVEL"
			description="JOPTION_FILTER_LEVEL_DESC"
			first="1"
			last="10"
			step="1"
			languages="*"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_MAX_LEVELS</option>
		</field>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			statuses="*,0,1,2,-2"
			onchange="this.form.submit();"
			default="a.name ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.state ASC">JSTATUS_ASC</option>
			<option value="a.state DESC">JSTATUS_DESC</option>
			<option value="a.name ASC">COM_BANNERS_HEADING_NAME_ASC</option>
			<option value="a.name DESC">COM_BANNERS_HEADING_NAME_DESC</option>
			<option value="category_title ASC">JCATEGORY_ASC</option>
			<option value="category_title DESC">JCATEGORY_DESC</option>
			<option value="a.sticky ASC">COM_BANNERS_HEADING_STICKY_ASC</option>
			<option value="a.sticky DESC">COM_BANNERS_HEADING_STICKY_DESC</option>
			<option value="client_name ASC">COM_BANNERS_HEADING_CLIENT_ASC</option>
			<option value="client_name DESC">COM_BANNERS_HEADING_CLIENT_DESC</option>
			<option value="impmade ASC">COM_BANNERS_HEADING_IMPRESSIONS_ASC</option>
			<option value="impmade DESC">COM_BANNERS_HEADING_IMPRESSIONS_DESC</option>
			<option value="clicks ASC">COM_BANNERS_HEADING_CLICKS_ASC</option>
			<option value="clicks DESC">COM_BANNERS_HEADING_CLICKS_DESC</option>
			<option value="a.language ASC">JGRID_HEADING_LANGUAGE_ASC</option>
			<option value="a.language DESC">JGRID_HEADING_LANGUAGE_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="COM_BANNERS_LIST_LIMIT"
			description="COM_BANNERS_LIST_LIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_banners/models/forms/filter_tracks.xml000060400000005631152453623440017217 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter" addfieldpath="/administrator/components/com_banners/models/fields">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_BANNERS_TRACKS_FILTER_SEARCH_LABEL"
			description="COM_BANNERS_TRACKS_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
		/>

		<field
			name="category_id"
			type="category"
			label="JOPTION_FILTER_CATEGORY"
			description="JOPTION_FILTER_CATEGORY_DESC"
			extension="com_banners"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_CATEGORY</option>
		</field>

		<field
			name="client_id"
			type="bannerclient"
			label="COM_BANNERS_FILTER_CLIENT"
			description="COM_BANNERS_FILTER_CLIENT_DESC"
			extension="com_content"
			onchange="this.form.submit();"
			>
			<option value="">COM_BANNERS_SELECT_CLIENT</option>
		</field>

		<field
			name="type"
			type="list"
			onchange="this.form.submit();"
			>
			<option value="">COM_BANNERS_SELECT_TYPE</option>
			<option value="1">COM_BANNERS_TYPE1</option>
			<option value="2">COM_BANNERS_TYPE2</option>
		</field>

		<field
			name="level"
			type="integer"
			label="JOPTION_FILTER_LEVEL"
			description="JOPTION_FILTER_LEVEL_DESC"
			first="1"
			last="10"
			step="1"
			languages="*"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_MAX_LEVELS</option>
		</field>

		<field
			name="begin"
			type="calendar"
			label="COM_BANNERS_BEGIN_LABEL"
			description="COM_BANNERS_BEGIN_DESC"
			hint="COM_BANNERS_BEGIN_HINT"
			format="%Y-%m-%d"
			size="10"
			filter="user_utc"
		/>

		<field
			name="end"
			type="calendar"
			label="COM_BANNERS_END_LABEL"
			description="COM_BANNERS_END_DESC"
			hint="COM_BANNERS_END_HINT"
			format="%Y-%m-%d"
			size="10"
			filter="user_utc"
		/>
    </fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="b.name ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="b.name ASC">COM_BANNERS_HEADING_NAME_ASC</option>
			<option value="b.name DESC">COM_BANNERS_HEADING_NAME_DESC</option>
			<option value="cl.name ASC">COM_BANNERS_HEADING_CLIENT_ASC</option>
			<option value="cl.name DESC">COM_BANNERS_HEADING_CLIENT_DESC</option>
			<option value="a.track_type ASC">COM_BANNERS_HEADING_TYPE_ASC</option>
			<option value="a.track_type DESC">COM_BANNERS_HEADING_TYPE_DESC</option>
			<option value="a.count ASC">COM_BANNERS_HEADING_COUNT_ASC</option>
			<option value="a.count DESC">COM_BANNERS_HEADING_COUNT_DESC</option>
			<option value="a.track_date ASC">JDATE_ASC</option>
			<option value="a.track_date DESC">JDATE_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="JGLOBAL_LIMIT"
			description="JGLOBAL_LIMIT"
			class="input-mini"
			default="5"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_banners/models/forms/filter_clients.xml000060400000004363152453623440017372 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_BANNERS_CLIENTS_FILTER_SEARCH_LABEL"
			description="COM_BANNERS_CLIENTS_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
		/>

		<field
			name="state"
			type="status"
			label="JOPTION_SELECT_PUBLISHED"
			description="JOPTION_SELECT_PUBLISHED_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>

		<field
			name="purchase_type"
			type="list"
			label="COM_BANNERS_FILTER_PURCHASETYPE_LABEL"
			description="COM_BANNERS_FIELD_PURCHASETYPE_DESC"
			default="0"
			onchange="this.form.submit();"
			>
			<option value="">COM_BANNERS_SELECT_TYPE</option>
			<option value="1">COM_BANNERS_FIELD_VALUE_UNLIMITED</option>
			<option value="2">COM_BANNERS_FIELD_VALUE_YEARLY</option>
			<option value="3">COM_BANNERS_FIELD_VALUE_MONTHLY</option>
			<option value="4">COM_BANNERS_FIELD_VALUE_WEEKLY</option>
			<option value="5">COM_BANNERS_FIELD_VALUE_DAILY</option>
		</field>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			statuses="*,0,1,2,-2"
			onchange="this.form.submit();"
			default="a.name ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.state ASC">JSTATUS_ASC</option>
			<option value="a.state DESC">JSTATUS_DESC</option>
			<option value="a.name ASC">COM_BANNERS_HEADING_CLIENT_ASC</option>
			<option value="a.name DESC">COM_BANNERS_HEADING_CLIENT_DESC</option>
			<option value="a.contact ASC">COM_BANNERS_HEADING_CONTACT_ASC</option>
			<option value="a.contact DESC">COM_BANNERS_HEADING_CONTACT_DESC</option>
			<option value="a.purchase_type ASC">COM_BANNERS_HEADING_PURCHASETYPE_ASC</option>
			<option value="a.purchase_type DESC">COM_BANNERS_HEADING_PURCHASETYPE_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="COM_BANNERS_LIST_LIMIT"
			description="COM_BANNERS_LIST_LIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_banners/models/forms/download.xml000060400000001145152453623440016166 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>

	<fieldset name="details">

		<field
			name="compressed"
			type="radio"
			label="COM_BANNERS_FIELD_COMPRESSED_LABEL"
			description="COM_BANNERS_FIELD_COMPRESSED_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="basename"
			type="text"
			label="COM_BANNERS_FIELD_BASENAME_LABEL"
			size="40"
		/>

		<field
			name="basename_info"
			type="note"
			description="COM_BANNERS_FIELD_BASENAME_DESC"
			class="alert alert-info"
		/>
	</fieldset>
</form>
components/com_banners/models/download.php000060400000003574152453623440015037 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Download model.
 *
 * @since  1.5
 */
class BannersModelDownload extends JModelForm
{
	/**
	 * The model context
	 *
	 * @var  string
	 */
	protected $_context = 'com_banners.tracks';

	/**
	 * Auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function populateState()
	{
		$input = JFactory::getApplication()->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;
	}
}
components/com_banners/controller.php000060400000003660152453623440014124 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('BannersHelper', JPATH_ADMINISTRATOR . '/components/com_banners/helpers/banners.php');

/**
 * Banners master display controller.
 *
 * @since  1.6
 */
class BannersController extends JControllerLegacy
{
	/**
	 * 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  BannersController  This object to support chaining.
	 *
	 * @since   1.5
	 */
	public function display($cachable = false, $urlparams = array())
	{
		BannersHelper::updateReset();

		$view   = $this->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();
	}
}
components/com_banners/config.xml000060400000005345152453623440013221 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset
		name="component"
		label="COM_BANNERS_FIELDSET_CONFIG_CLIENT_OPTIONS_LABEL"
		description="COM_BANNERS_FIELDSET_CONFIG_CLIENT_OPTIONS_DESC"
		>

		<field
			name="purchase_type"
			type="list"
			label="COM_BANNERS_FIELD_PURCHASETYPE_LABEL"
			description="COM_BANNERS_FIELD_PURCHASETYPE_DESC"
			id="purchase_type"
			default="1"
			>
			<option value="1">COM_BANNERS_FIELD_VALUE_UNLIMITED</option>
			<option value="2">COM_BANNERS_FIELD_VALUE_YEARLY</option>
			<option value="3">COM_BANNERS_FIELD_VALUE_MONTHLY</option>
			<option value="4">COM_BANNERS_FIELD_VALUE_WEEKLY</option>
			<option value="5">COM_BANNERS_FIELD_VALUE_DAILY</option>
		</field>

		<field
			name="track_impressions"
			type="radio"
			label="COM_BANNERS_FIELD_TRACKIMPRESSION_LABEL"
			description="COM_BANNERS_FIELD_TRACKIMPRESSION_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="track_robots_impressions"
			type="radio"
			label="COM_BANNERS_FIELD_TRACKROBOTSIMPRESSION_LABEL"
			description="COM_BANNERS_FIELD_TRACKROBOTSIMPRESSION_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="track_clicks"
			type="radio"
			label="COM_BANNERS_FIELD_TRACKCLICK_LABEL"
			description="COM_BANNERS_FIELD_TRACKCLICK_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="metakey_prefix"
			type="text"
			label="COM_BANNERS_FIELD_METAKEYWORDPREFIX_LABEL"
			description="COM_BANNERS_FIELD_METAKEYWORDPREFIX_DESC"
			default=""
		/>

	</fieldset>

	<fieldset
		name="banners"
		label="COM_BANNERS_FIELDSET_CONFIG_BANNER_OPTIONS_LABEL"
		description="COM_BANNERS_FIELDSET_CONFIG_BANNER_OPTIONS_DESC"
		>

		<field
			name="save_history"
			type="radio"
			label="JGLOBAL_SAVE_HISTORY_OPTIONS_LABEL"
			description="JGLOBAL_SAVE_HISTORY_OPTIONS_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="history_limit"
			type="number"
			label="JGLOBAL_HISTORY_LIMIT_OPTIONS_LABEL"
			description="JGLOBAL_HISTORY_LIMIT_OPTIONS_DESC"
			filter="integer"
			default="10"
			showon="save_history:1"
		/>

	</fieldset>

	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
		>

		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			filter="rules"
			validate="rules"
			component="com_banners"
			section="component"
		/>

	</fieldset>
</config>
components/com_banners/tables/client.php000060400000006145152453623440014472 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Client table
 *
 * @since  1.6
 */
class BannersTableClient extends JTable
{
	/**
	 * Constructor
	 *
	 * @param   JDatabaseDriver  $db  Database connector object
	 *
	 * @since   1.5
	 */
	public function __construct(&$db)
	{
		$this->checked_out_time = $db->getNullDate();
		parent::__construct('#__banner_clients', 'id', $db);

		$this->setColumnAlias('published', 'state');

		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;
	}
}
components/com_banners/tables/banner.php000060400000017607152453623440014466 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;

/**
 * Banner table
 *
 * @since  1.5
 */
class BannersTableBanner extends JTable
{
	/**
	 * Constructor
	 *
	 * @param   JDatabaseDriver  $db  Database connector object
	 *
	 * @since   1.5
	 */
	public function __construct(&$db)
	{
		parent::__construct('#__banners', 'id', $db);

		JTableObserverContenthistory::createObserver($this, array('typeAlias' => '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;
	}
}
components/com_banners/sql/uninstall.mysql.utf8.sql000060400000000171152453623440016604 0ustar00DROP TABLE IF EXISTS `#__banners`;

DROP TABLE IF EXISTS `#__banner_clients`;

DROP TABLE IF EXISTS `#__banner_tracks`;

components/com_banners/sql/install.mysql.utf8.sql000060400000006472152453623440016253 0ustar00--
-- Table structure for table `#__banners`
--

CREATE TABLE IF NOT EXISTS `#__banners` (
  `id` int NOT NULL AUTO_INCREMENT,
  `cid` int NOT NULL DEFAULT 0,
  `type` int NOT NULL DEFAULT 0,
  `name` varchar(255) NOT NULL DEFAULT '',
  `alias` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '',
  `imptotal` int NOT NULL DEFAULT 0,
  `impmade` int NOT NULL DEFAULT 0,
  `clicks` int NOT NULL DEFAULT 0,
  `clickurl` varchar(200) NOT NULL DEFAULT '',
  `state` tinyint NOT NULL DEFAULT 0,
  `catid` int unsigned NOT NULL DEFAULT 0,
  `description` text NOT NULL,
  `custombannercode` varchar(2048) NOT NULL,
  `sticky` tinyint unsigned NOT NULL DEFAULT 0,
  `ordering` int NOT NULL DEFAULT 0,
  `metakey` text NOT NULL,
  `params` text NOT NULL,
  `own_prefix` tinyint NOT NULL DEFAULT 0,
  `metakey_prefix` varchar(400) NOT NULL DEFAULT '',
  `purchase_type` tinyint NOT NULL DEFAULT -1,
  `track_clicks` tinyint NOT NULL DEFAULT -1,
  `track_impressions` tinyint NOT NULL DEFAULT -1,
  `checked_out` int 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 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 unsigned NOT NULL DEFAULT 0,
  `version` int 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 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 NOT NULL DEFAULT 0,
  `checked_out` int 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 NOT NULL DEFAULT 0,
  `metakey_prefix` varchar(400) NOT NULL DEFAULT '',
  `purchase_type` tinyint NOT NULL DEFAULT -1,
  `track_clicks` tinyint NOT NULL DEFAULT -1,
  `track_impressions` tinyint 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 unsigned NOT NULL,
  `banner_id` int unsigned NOT NULL,
  `count` int 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;
components/com_banners/access.xml000060400000002575152453623440013217 0ustar00<?xml version="1.0" encoding="utf-8"?>
<access component="com_banners">
	<section name="component">
		<action
			name="core.admin"
			description="JACTION_ADMIN_COMPONENT_DESC"
			title="JACTION_ADMIN"
		/>

		<action
			name="core.options"
			description="JACTION_OPTIONS_COMPONENT_DESC"
			title="JACTION_OPTIONS"
		/>

		<action
			name="core.manage"
			description="JACTION_MANAGE_COMPONENT_DESC"
			title="JACTION_MANAGE"
		/>

		<action
			name="core.create"
			description="JACTION_CREATE_COMPONENT_DESC"
			title="JACTION_CREATE"
		/>

		<action
			name="core.delete"
			description="JACTION_DELETE_COMPONENT_DESC"
			title="JACTION_DELETE"
		/>

		<action
			name="core.edit"
			description="JACTION_EDIT_COMPONENT_DESC"
			title="JACTION_EDIT"
		/>

		<action
			name="core.edit.state"
			description="JACTION_EDITSTATE_COMPONENT_DESC"
			title="JACTION_EDITSTATE"
		/>

	</section>
	<section name="category">
		<action
			name="core.create"
			description="COM_CATEGORIES_ACCESS_CREATE_DESC"
			title="JACTION_CREATE"
		/>

		<action
			name="core.delete"
			description="COM_CATEGORIES_ACCESS_DELETE_DESC"
			title="JACTION_DELETE"
		/>

		<action
			name="core.edit"
			description="COM_CATEGORIES_ACCESS_EDIT_DESC"
			title="JACTION_EDIT"
		/>

		<action
			name="core.edit.state"
			description="COM_CATEGORIES_ACCESS_EDITSTATE_DESC"
			title="JACTION_EDITSTATE"
		/>
	</section>
</access>
components/com_banners/banners.php000060400000001153152453623440013364 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
JHtml::_('behavior.tabstate');

if (!JFactory::getUser()->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();
components/com_banners/banners.xml000060400000004563152453623440013405 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_banners</name>
	<author>Joomla! Project</author>
	<creationDate>April 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_BANNERS_XML_DESCRIPTION</description>

	<install> <!-- Runs on install -->
		<sql>
			<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
		</sql>
	</install>
	<uninstall> <!-- Runs on uninstall -->
		<sql>
			<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
		</sql>
	</uninstall>

	<files folder="site">
		<filename>banners.php</filename>
		<filename>controller.php</filename>
		<filename>router.php</filename>
		<folder>helpers</folder>
		<folder>models</folder>
	</files>
	<administration>
		<menu img="class:banners">com_banners</menu>
		<submenu>
			<!--
				Note that all & must be escaped to &amp; for the file to be valid
				XML and be parsed by the installer
			-->
			<menu
				link="option=com_banners"
				view="banners"
				img="class:banners"
				alt="Banners/Banners"
				>
				com_banners_banners
			</menu>
			<menu
				link="option=com_categories&amp;extension=com_banners"
				view="categories"
				img="class:banners-cat"
				alt="Banners/Categories"
				>
				com_banners_categories
			</menu>
			<menu
				link="option=com_banners&amp;view=clients"
				view="clients"
				img="class:banners-clients"
				alt="Banners/Clients"
				>
				com_banners_clients
			</menu>
			<menu
				link="option=com_banners&amp;view=tracks"
				view="tracks"
				img="class:banners-tracks"
				alt="Banners/Tracks"
				>
				com_banners_tracks
			</menu>
		</submenu>
		<files folder="admin">
			<filename>access.xml</filename>
			<filename>banners.php</filename>
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>tables</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_banners.ini</language>
			<language tag="en-GB">language/en-GB.com_banners.sys.ini</language>
		</languages>
	</administration>
</extension>
components/com_banners/views/banners/tmpl/default_batch_footer.php000060400000001302152453623440021634 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<button type="button" class="btn" onclick="document.getElementById('batch-category-id').value='';document.getElementById('batch-client-id').value='';document.getElementById('batch-language-id').value=''" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<button type="submit" class="btn btn-success" onclick="Joomla.submitbutton('banner.batch');return false;">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>
components/com_banners/views/banners/tmpl/default_batch_body.php000060400000001551152453623440021301 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$published = $this->state->get('filter.published');
?>

<div class="container-fluid">
	<div class="row-fluid">
		<div class="control-group span6">
			<div class="controls">
				<?php echo JHtml::_('batch.language'); ?>
			</div>
		</div>
		<div class="control-group span6">
			<div class="controls">
				<?php echo JHtml::_('banner.clients'); ?>
			</div>
		</div>
	</div>
	<div class="row-fluid">
		<?php if ($published >= 0) : ?>
			<div class="control-group span6">
				<div class="controls">
					<?php echo JHtml::_('batch.item', 'com_banners'); ?>
				</div>
			</div>
		<?php endif; ?>
	</div>
</div>
components/com_banners/views/banners/tmpl/default.php000060400000017606152453623440017133 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$user      = JFactory::getUser();
$userId    = $user->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);
}
?>
<form action="<?php echo JRoute::_('index.php?option=com_banners&view=banners'); ?>" method="post" name="adminForm" id="adminForm">
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
		<?php
		// Search tools bar
		echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this));
		?>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped" id="articleList">
				<thead>
					<tr>
						<th width="1%" class="nowrap center hidden-phone">
							<?php echo JHtml::_('searchtools.sort', '', 'a.ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING', 'icon-menu-2'); ?>
						</th>
						<th width="1%" class="center">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
						</th>
						<th>
							<?php echo JHtml::_('searchtools.sort', 'COM_BANNERS_HEADING_NAME', 'a.name', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap center hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_BANNERS_HEADING_STICKY', 'a.sticky', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_BANNERS_HEADING_CLIENT', 'client_name', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_BANNERS_HEADING_IMPRESSIONS', 'impmade', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_BANNERS_HEADING_CLICKS', 'clicks', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'a.language', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="13">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
					<?php foreach ($this->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;
						?>
						<tr class="row<?php echo $i % 2; ?>" sortable-group-id="<?php echo $item->catid; ?>">
							<td class="order nowrap center hidden-phone">
								<?php
								$iconClass = '';

								if (!$canChange)
								{
									$iconClass = ' inactive';
								}
								elseif (!$saveOrder)
								{
									$iconClass = ' inactive tip-top hasTooltip" title="' . JHtml::_('tooltipText', 'JORDERINGDISABLED');
								}
								?>
								<span class="sortable-handler <?php echo $iconClass ?>">
									<span class="icon-menu" aria-hidden="true"></span>
								</span>
								<?php if ($canChange && $saveOrder) : ?>
									<input type="text" style="display:none" name="order[]" size="5"
										value="<?php echo $item->ordering; ?>" class="width-20 text-area-order" />
								<?php endif; ?>
							</td>
							<td class="center">
								<?php echo JHtml::_('grid.id', $i, $item->id); ?>
							</td>
							<td class="center">
								<div class="btn-group">
									<?php echo JHtml::_('jgrid.published', $item->state, $i, 'banners.', $canChange, 'cb', $item->publish_up, $item->publish_down); ?>
									<?php // Create dropdown items and render the dropdown list.
									if ($canChange)
									{
										JHtml::_('actionsdropdown.' . ((int) $item->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));
									}
									?>
								</div>
							</td>
							<td class="has-context">
								<div class="pull-left break-word">
									<?php if ($item->checked_out) : ?>
										<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'banners.', $canCheckin); ?>
									<?php endif; ?>
									<?php if ($canEdit) : ?>
										<a href="<?php echo JRoute::_('index.php?option=com_banners&task=banner.edit&id=' . (int) $item->id); ?>">
											<?php echo $this->escape($item->name); ?></a>
									<?php else : ?>
										<?php echo $this->escape($item->name); ?>
									<?php endif; ?>
									<span class="small break-word">
										<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias)); ?>
									</span>
									<div class="small">
										<?php echo JText::_('JCATEGORY') . ': ' . $this->escape($item->category_title); ?>
									</div>
								</div>
							</td>
							<td class="center hidden-phone">
								<?php echo JHtml::_('banner.pinned', $item->sticky, $i, $canChange); ?>
							</td>
							<td class="small hidden-phone">
								<?php echo $item->client_name; ?>
							</td>
							<td class="small hidden-phone">
								<?php echo JText::sprintf('COM_BANNERS_IMPRESSIONS', $item->impmade, $item->imptotal ?: JText::_('COM_BANNERS_UNLIMITED')); ?>
							</td>
							<td class="small hidden-phone">
								<?php echo $item->clicks; ?> -
								<?php echo sprintf('%.2f%%', $item->impmade ? 100 * $item->clicks / $item->impmade : 0); ?>
							</td>
							<td class="small nowrap hidden-phone">
								<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
							</td>
							<td class="hidden-phone">
								<?php echo $item->id; ?>
							</td>
						</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
			<?php // Load the batch processing form. ?>
			<?php if ($user->authorise('core.create', 'com_banners')
				&& $user->authorise('core.edit', 'com_banners')
				&& $user->authorise('core.edit.state', 'com_banners')) : ?>
				<?php echo JHtml::_(
					'bootstrap.renderModal',
					'collapseModal',
					array(
						'title'  => JText::_('COM_BANNERS_BATCH_OPTIONS'),
						'footer' => $this->loadTemplate('batch_footer'),
					),
					$this->loadTemplate('batch_body')
				); ?>
			<?php endif; ?>
		<?php endif; ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_banners/views/banners/view.html.php000060400000011141152453623440016434 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of banners.
 *
 * @since  1.6
 */
class BannersViewBanners extends JViewLegacy
{
	/**
	 * Category data
	 *
	 * @var  array
	 */
	protected $categories;

	/**
	 * An array of items
	 *
	 * @var  array
	 */
	protected $items;

	/**
	 * The pagination object
	 *
	 * @var  JPagination
	 */
	protected $pagination;

	/**
	 * The model state
	 *
	 * @var  object
	 */
	protected $state;

	/**
	 * Method to display the view.
	 *
	 * @param   string  $tpl  A template file to load. [optional]
	 *
	 * @return  mixed  A string if successful, otherwise a JError object.
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		$this->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'),
		);
	}
}
components/com_banners/views/banner/view.html.php000060400000005610152453623440016255 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('BannersHelper', JPATH_ADMINISTRATOR . '/components/com_banners/helpers/banners.php');

/**
 * View to edit a banner.
 *
 * @since  1.5
 */
class BannersViewBanner extends JViewLegacy
{
	/**
	 * The JForm object
	 *
	 * @var  JForm
	 */
	protected $form;

	/**
	 * The active item
	 *
	 * @var  object
	 */
	protected $item;

	/**
	 * The model state
	 *
	 * @var  object
	 */
	protected $state;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		// Initialize variables.
		$this->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');
	}
}
components/com_banners/views/banner/tmpl/edit.php000060400000006066152453623440016247 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('jquery.framework');
JHtml::_('behavior.formvalidator');
JHtml::_('formbehavior.chosen', '#jform_catid', null, array('disable_search_threshold' => 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");
	});
');
?>

<form action="<?php echo JRoute::_('index.php?option=com_banners&layout=edit&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="banner-form" class="form-validate">

	<?php echo JLayoutHelper::render('joomla.edit.title_alias', $this); ?>

	<div class="form-horizontal">
		<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'details')); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'details', JText::_('COM_BANNERS_BANNER_DETAILS')); ?>
		<div class="row-fluid">
			<div class="span9">
				<?php echo $this->form->renderField('type'); ?>
				<div id="image">
					<?php echo $this->form->renderFieldset('image'); ?>
				</div>
				<div id="custom">
					<?php echo $this->form->renderField('custombannercode'); ?>
				</div>
				<?php
				echo $this->form->renderField('clickurl');
				echo $this->form->renderField('description');
				?>
			</div>
			<div class="span3">
				<?php echo JLayoutHelper::render('joomla.edit.global', $this); ?>
			</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'otherparams', JText::_('COM_BANNERS_GROUP_LABEL_BANNER_DETAILS')); ?>
		<?php echo $this->form->renderFieldset('otherparams'); ?>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'publishing', JText::_('JGLOBAL_FIELDSET_PUBLISHING')); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('joomla.edit.publishingdata', $this); ?>
			</div>
			<div class="span6">
				<?php echo $this->form->renderFieldset('metadata'); ?>
			</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php echo JHtml::_('bootstrap.endTabSet'); ?>
	</div>

	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>
</form>
components/com_banners/views/download/view.html.php000060400000001637152453623440016624 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for download a list of tracks.
 *
 * @since  1.6
 */
class BannersViewDownload extends JViewLegacy
{
	/**
	 * The JForm object
	 *
	 * @var  JForm
	 */
	protected $form;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		$this->form = $this->get('Form');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		return parent::display($tpl);
	}
}
components/com_banners/views/download/tmpl/default.php000060400000002126152453623440017301 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip', '.hasTooltip', array('placement' => 'bottom'));
?>
<div class="container-popup">
	<form
		class="form-horizontal form-validate"
		id="download-form"
		name="adminForm"
		action="<?php echo JRoute::_('index.php?option=com_banners&task=tracks.display&format=raw&' . JSession::getFormToken() . '=1'); ?>"
		method="post">

		<?php foreach ($this->form->getFieldset() as $field) : ?>
			<?php echo $this->form->renderField($field->fieldname); ?>
		<?php endforeach; ?>

		<button class="hidden"
			id="closeBtn"
			type="button"
			onclick="window.parent.jQuery('#modal-download').modal('hide');">
		</button>
		<button class="hidden"
			id="exportBtn"
			type="button"
			onclick="this.form.submit();window.top.setTimeout('window.parent.jQuery(\'#downloadModal\').modal(\'hide\')', 700);">
		</button>
	</form>
</div>
components/com_banners/views/tracks/view.html.php000060400000006224152453623440016301 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('BannersHelper', JPATH_ADMINISTRATOR . '/components/com_banners/helpers/banners.php');

/**
 * View class for a list of tracks.
 *
 * @since  1.6
 */
class BannersViewTracks extends JViewLegacy
{
	/**
	 * An array of items
	 *
	 * @var  array
	 */
	protected $items;

	/**
	 * The pagination object
	 *
	 * @var  JPagination
	 */
	protected $pagination;

	/**
	 * The model state
	 *
	 * @var  object
	 */
	protected $state;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		$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('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')
		);
	}
}
components/com_banners/views/tracks/view.raw.php000060400000002237152453623440016126 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of tracks.
 *
 * @since  1.6
 */
class BannersViewTracks extends JViewLegacy
{
	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		$basename = $this->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;
	}
}
components/com_banners/views/tracks/tmpl/default.php000060400000007603152453623440016766 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('formbehavior.chosen', 'select');
JHtml::_('bootstrap.tooltip');

$listOrder  = $this->escape($this->state->get('list.ordering'));
$listDirn   = $this->escape($this->state->get('list.direction'));
?>
<form action="<?php echo JRoute::_('index.php?option=com_banners&view=tracks'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped">
				<thead>
					<tr>
						<th class="title">
							<?php echo JHtml::_('searchtools.sort', 'COM_BANNERS_HEADING_NAME', 'b.name', $listDirn, $listOrder); ?>
						</th>
						<th width="20%" class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_BANNERS_HEADING_CLIENT', 'cl.name', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_BANNERS_HEADING_TYPE', 'a.track_type', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_BANNERS_HEADING_COUNT', 'a.count', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JDATE', 'a.track_date', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="5">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
					<?php foreach ($this->items as $i => $item) : ?>
						<tr class="row<?php echo $i % 2; ?>">
							<td>
								<?php echo $item->banner_name; ?>
								<div class="small">
									<?php echo JText::_('JCATEGORY') . ': ' . $this->escape($item->category_title); ?>
								</div>
							</td>
							<td>
								<?php echo $item->client_name; ?>
							</td>
							<td class="small hidden-phone">
								<?php echo $item->track_type == 1 ? JText::_('COM_BANNERS_IMPRESSION') : JText::_('COM_BANNERS_CLICK'); ?>
							</td>
							<td class="hidden-phone">
								<?php echo $item->count; ?>
							</td>
							<td class="hidden-phone">
								<?php echo JHtml::_('date', $item->track_date, JText::_('DATE_FORMAT_LC5')); ?>
							</td>
						</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif; ?>

		<?php // Load the export form ?>
		<?php echo JHtml::_(
			'bootstrap.renderModal',
			'downloadModal',
			array(
				'title'       => JText::_('COM_BANNERS_TRACKS_DOWNLOAD'),
				'url'         => JRoute::_('index.php?option=com_banners&amp;view=download&amp;tmpl=component'),
				'height'      => '370px',
				'width'       => '300px',
				'modalWidth'  => '40',
				'footer'      => '<button type="button" class="btn" data-dismiss="modal"'
						. ' onclick="jQuery(\'#downloadModal iframe\').contents().find(\'#closeBtn\').click();">'
						. JText::_('COM_BANNERS_CANCEL') . '</button>'
						. '<button type="button" class="btn btn-success"'
						. ' onclick="jQuery(\'#downloadModal iframe\').contents().find(\'#exportBtn\').click();">'
						. JText::_('COM_BANNERS_TRACKS_EXPORT') . '</button>',
			)
		); ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_banners/views/clients/tmpl/default.php000060400000017223152453623440017137 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$purchaseTypes = array(
		'1' => '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;
?>
<form action="<?php echo JRoute::_('index.php?option=com_banners&view=clients'); ?>" method="post" name="adminForm" id="adminForm">
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
		<?php
		// Search tools bar
		echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this));
		?>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped">
				<thead>
					<tr>
						<th width="1%" class="center">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th width="5%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
						</th>
						<th>
							<?php echo JHtml::_('searchtools.sort', 'COM_BANNERS_HEADING_CLIENT', 'a.name', $listDirn, $listOrder); ?>
						</th>
						<th width="20%" class="hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_BANNERS_HEADING_CONTACT', 'a.contact', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap center hidden-phone hidden-tablet">
							<span class="icon-publish hasTooltip" aria-hidden="true" title="<?php echo JText::_('COM_BANNERS_COUNT_PUBLISHED_ITEMS'); ?>"><span class="element-invisible"><?php echo JText::_('COM_BANNERS_COUNT_PUBLISHED_ITEMS'); ?></span></span>
						</th>
						<th width="1%" class="nowrap center hidden-phone hidden-tablet">
							<span class="icon-unpublish hasTooltip" aria-hidden="true" title="<?php echo JText::_('COM_BANNERS_COUNT_UNPUBLISHED_ITEMS'); ?>"><span class="element-invisible"><?php echo JText::_('COM_BANNERS_COUNT_UNPUBLISHED_ITEMS'); ?></span></span>
						</th>
						<th width="1%" class="nowrap center hidden-phone hidden-tablet">
							<span class="icon-archive hasTooltip" aria-hidden="true" title="<?php echo JText::_('COM_BANNERS_COUNT_ARCHIVED_ITEMS'); ?>"><span class="element-invisible"><?php echo JText::_('COM_BANNERS_COUNT_ARCHIVED_ITEMS'); ?></span></span>
						</th>
						<th width="1%" class="nowrap center hidden-phone hidden-tablet">
							<span class="icon-trash hasTooltip" aria-hidden="true" title="<?php echo JText::_('COM_BANNERS_COUNT_TRASHED_ITEMS'); ?>"><span class="element-invisible"><?php echo JText::_('COM_BANNERS_COUNT_TRASHED_ITEMS'); ?></span></span>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_BANNERS_HEADING_PURCHASETYPE', 'a.purchase_type', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="11">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
					<?php foreach ($this->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;
						?>
						<tr class="row<?php echo $i % 2; ?>">
							<td class="center">
								<?php echo JHtml::_('grid.id', $i, $item->id); ?>
							</td>
							<td class="center">
								<div class="btn-group">
									<?php echo JHtml::_('jgrid.published', $item->state, $i, 'clients.', $canChange); ?>
									<?php // Create dropdown items and render the dropdown list.

									if ($canChange)
									{
										JHtml::_('actionsdropdown.' . ((int) $item->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));
									}
									?>
								</div>
							</td>
							<td class="nowrap has-context">
								<div class="pull-left">
									<?php if ($item->checked_out) : ?>
										<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'clients.', $canCheckin); ?>
									<?php endif; ?>
									<?php if ($canEdit) : ?>
										<a href="<?php echo JRoute::_('index.php?option=com_banners&task=client.edit&id=' . (int) $item->id); ?>">
											<?php echo $this->escape($item->name); ?></a>
									<?php else : ?>
										<?php echo $this->escape($item->name); ?>
									<?php endif; ?>
								</div>
							</td>
							<td class="small hidden-phone">
								<?php echo $item->contact; ?>
							</td>
							<td class="center btns hidden-phone hidden-tablet">
								<a class="badge <?php if ($item->count_published > 0) echo 'badge-success'; ?>" href="<?php echo JRoute::_('index.php?option=com_banners&view=banners&filter[client_id]=' . (int) $item->id . '&filter[published]=1'); ?>">
									<?php echo $item->count_published; ?></a>
							</td>
							<td class="center btns hidden-phone hidden-tablet">
								<a class="badge <?php if ($item->count_unpublished > 0) echo 'badge-important'; ?>" href="<?php echo JRoute::_('index.php?option=com_banners&view=banners&filter[client_id]=' . (int) $item->id . '&filter[published]=0'); ?>">
									<?php echo $item->count_unpublished; ?></a>
							</td>
							<td class="center btns hidden-phone hidden-tablet">
								<a class="badge <?php if ($item->count_archived > 0) echo 'badge-info'; ?>" href="<?php echo JRoute::_('index.php?option=com_banners&view=banners&filter[client_id]=' . (int) $item->id . '&filter[published]=2'); ?>">
									<?php echo $item->count_archived; ?></a>
							</td>
							<td class="center btns hidden-phone hidden-tablet">
								<a class="badge <?php if ($item->count_trashed > 0) echo 'badge-inverse'; ?>" href="<?php echo JRoute::_('index.php?option=com_banners&view=banners&filter[client_id]=' . (int) $item->id . '&filter[published]=-2'); ?>">
									<?php echo $item->count_trashed; ?></a>
							</td>
							<td class="small hidden-phone">
								<?php if ($item->purchase_type < 0) : ?>
									<?php echo JText::sprintf('COM_BANNERS_DEFAULT', JText::_('COM_BANNERS_FIELD_VALUE_' . $purchaseTypes[$params->get('purchase_type')])); ?>
								<?php else : ?>
									<?php echo JText::_('COM_BANNERS_FIELD_VALUE_' . $purchaseTypes[$item->purchase_type]); ?>
								<?php endif; ?>
							</td>
							<td class="hidden-phone">
								<?php echo $item->id; ?>
							</td>
						</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif; ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_banners/views/clients/view.html.php000060400000006337152453623440016460 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('BannersHelper', JPATH_ADMINISTRATOR . '/components/com_banners/helpers/banners.php');

/**
 * View class for a list of clients.
 *
 * @since  1.6
 */
class BannersViewClients extends JViewLegacy
{
	/**
	 * An array of items
	 *
	 * @var  array
	 */
	protected $items;

	/**
	 * The pagination object
	 *
	 * @var  JPagination
	 */
	protected $pagination;

	/**
	 * The model state
	 *
	 * @var  object
	 */
	protected $state;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		$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('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')
		);
	}
}
components/com_banners/views/client/view.html.php000060400000005534152453623440016273 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('BannersHelper', JPATH_ADMINISTRATOR . '/components/com_banners/helpers/banners.php');

/**
 * View to edit a client.
 *
 * @since  1.5
 */
class BannersViewClient extends JViewLegacy
{
	/**
	 * The JForm object
	 *
	 * @var  JForm
	 */
	protected $form;

	/**
	 * The active item
	 *
	 * @var  object
	 */
	protected $item;

	/**
	 * The model state
	 *
	 * @var  object
	 */
	protected $state;

	/**
	 * Object containing permissions for the item
	 *
	 * @var  JObject
	 */
	protected $canDo;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		$this->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');
	}
}
components/com_banners/views/client/tmpl/edit.php000060400000004121152453623440016246 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');
JHtml::_('behavior.formvalidator');
JHtml::_('formbehavior.chosen', 'select');

JFactory::getDocument()->addScriptDeclaration('
	Joomla.submitbutton = function(task)
	{
		if (task == "client.cancel" || document.formvalidator.isValid(document.getElementById("client-form")))
		{
			Joomla.submitform(task, document.getElementById("client-form"));
		}
	};
');
?>

<form action="<?php echo JRoute::_('index.php?option=com_banners&layout=edit&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="client-form" class="form-validate">

	<?php echo JLayoutHelper::render('joomla.edit.title_alias', $this); ?>

	<div class="form-horizontal">
		<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'general')); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'general', empty($this->item->id) ? JText::_('COM_BANNERS_NEW_CLIENT') : JText::_('COM_BANNERS_EDIT_CLIENT')); ?>
		<div class="row-fluid">
			<div class="span9">
				<?php
				echo $this->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');
				?>
			</div>
			<div class="span3">
				<?php echo JLayoutHelper::render('joomla.edit.global', $this); ?>
			</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'metadata', JText::_('JGLOBAL_FIELDSET_METADATA_OPTIONS')); ?>
		<?php echo $this->form->renderFieldset('metadata'); ?>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php echo JHtml::_('bootstrap.endTabSet'); ?>
	</div>

	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>
</form>
components/com_banners/helpers/html/banner.php000060400000005333152453623440015613 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Banner HTML class.
 *
 * @since  2.5
 */
abstract class JHtmlBanner
{
	/**
	 * Display a batch widget for the client selector.
	 *
	 * @return  string  The necessary HTML for the widget.
	 *
	 * @since   2.5
	 */
	public static function clients()
	{
		JHtml::_('bootstrap.tooltip');

		// Create the batch selector to change the client on a selection list.
		return implode(
			"\n",
			array(
				'<label id="batch-client-lbl" for="batch-client" class="hasTooltip" title="'
					. JHtml::_('tooltipText', 'COM_BANNERS_BATCH_CLIENT_LABEL', 'COM_BANNERS_BATCH_CLIENT_LABEL_DESC')
					. '">',
				JText::_('COM_BANNERS_BATCH_CLIENT_LABEL'),
				'</label>',
				'<select name="batch[client_id]" id="batch-client-id">',
				'<option value="">' . JText::_('COM_BANNERS_BATCH_CLIENT_NOCHANGE') . '</option>',
				'<option value="0">' . JText::_('COM_BANNERS_NO_CLIENT') . '</option>',
				JHtml::_('select.options', static::clientlist(), 'value', 'text'),
				'</select>'
			)
		);
	}

	/**
	 * 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);
	}
}
components/com_banners/helpers/banners.php000060400000011140152453623440015023 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Banners component helper.
 *
 * @since  1.6
 */
class BannersHelper extends JHelperContent
{
	/**
	 * Configure the Linkbar.
	 *
	 * @param   string  $vName  The name of the active view.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public static function addSubmenu($vName)
	{
		JHtmlSidebar::addEntry(
			JText::_('COM_BANNERS_SUBMENU_BANNERS'),
			'index.php?option=com_banners&view=banners',
			$vName == 'banners'
		);

		JHtmlSidebar::addEntry(
			JText::_('COM_BANNERS_SUBMENU_CATEGORIES'),
			'index.php?option=com_categories&extension=com_banners',
			$vName == 'categories'
		);

		JHtmlSidebar::addEntry(
			JText::_('COM_BANNERS_SUBMENU_CLIENTS'),
			'index.php?option=com_banners&view=clients',
			$vName == 'clients'
		);

		JHtmlSidebar::addEntry(
			JText::_('COM_BANNERS_SUBMENU_TRACKS'),
			'index.php?option=com_banners&view=tracks',
			$vName == 'tracks'
		);
	}

	/**
	 * Update / reset the banners
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	public static function updateReset()
	{
		$db       = JFactory::getDbo();
		$nullDate = $db->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 category objects
	 *
	 * @return  stdClass[]
	 *
	 * @since   3.5
	 */
	public static function countItems(&$items)
	{
		$config = (object) array(
			'related_tbl'   => 'banners',
			'state_col'     => 'state',
			'group_col'     => 'catid',
			'relation_type' => 'category_or_group',
		);

		return parent::countRelations($items, $config);
	}
}
components/com_banners/controllers/client.php000060400000001012152453623440015552 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Client controller class.
 *
 * @since  1.6
 */
class BannersControllerClient extends JControllerForm
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_BANNERS_CLIENT';
}
components/com_banners/controllers/banner.php000060400000004773152453623440015562 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Banner controller class.
 *
 * @since  1.6
 */
class BannersControllerBanner extends JControllerForm
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_BANNERS_BANNER';

	/**
	 * 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())
	{
		$filter     = $this->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)
	{
		$this->checkToken();

		// 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);
	}
}
components/com_banners/controllers/banners.php000060400000004667152453623440015747 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Banners list controller class.
 *
 * @since  1.6
 */
class BannersControllerBanners extends JControllerAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_BANNERS_BANNERS';

	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JControllerLegacy
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		parent::__construct($config);

		$this->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.
		$this->checkToken();

		$ids    = (array) $this->input->get('cid', array(), 'int');
		$values = array('sticky_publish' => 1, 'sticky_unpublish' => 0);
		$task   = $this->getTask();
		$value  = ArrayHelper::getValue($values, $task, 0, 'int');

		// Remove zero values resulting from input filter
		$ids = array_filter($ids);

		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');
	}
}
components/com_banners/controllers/tracks.php000060400000004364152453623440015600 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Tracks list controller class.
 *
 * @since  1.6
 */
class BannersControllerTracks extends JControllerLegacy
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $context = 'com_banners.tracks';

	/**
	 * 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 = 'Tracks', $prefix = 'BannersModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	/**
	 * Method to remove a record.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function delete()
	{
		// Check for request forgeries.
		$this->checkToken();

		// 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');
	}
}
components/com_banners/controllers/clients.php000060400000001777152453623440015757 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Clients list controller class.
 *
 * @since  1.6
 */
class BannersControllerClients extends JControllerAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_BANNERS_CLIENTS';

	/**
	 * 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 = 'Client', $prefix = 'BannersModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}
}
components/com_banners/controllers/tracks.raw.php000060400000006566152453623440016376 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_banners
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Tracks list controller class.
 *
 * @since  1.6
 */
class BannersControllerTracks extends JControllerLegacy
{
	/**
	 * The context for persistent state.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $context = 'com_banners.tracks';

	/**
	 * Method to get a model object, loading it if required.
	 *
	 * @param   string  $name    The name of the model.
	 * @param   string  $prefix  The prefix for the model class name.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JModelLegacy
	 *
	 * @since   1.6
	 */
	public function getModel($name = 'Tracks', $prefix = 'BannersModel', $config = array())
	{
		return parent::getModel($name, $prefix, array('ignore_request' => 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())
	{
		// Check for request forgeries.
		$this->checkToken('GET');

		// 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;
	}
}
components/com_privacy/config.xml000060400000000547152453623440013245 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset
		name="privacy"
		label="COM_PRIVACY_OPTION_LABEL"
	>

		<field
			name="notify"
			type="integer"
			label="COM_PRIVACY_NOTIFY_LABEL"
			description="COM_PRIVACY_NOTIFY_DESC"
			first="1"
			last="29"
			step="1"
			default="14"
			filter="int"
			validate="number"
		/>

    </fieldset>
</config>
components/com_privacy/privacy.php000060400000001112152453623440013431 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Only super user can access here
if (!JFactory::getUser()->authorise('core.admin'))
{
	throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
}

$controller = JControllerLegacy::getInstance('Privacy');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
components/com_privacy/privacy.xml000060400000002512152453623440013447 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.9" method="upgrade">
	<name>com_privacy</name>
	<author>Joomla! Project</author>
	<creationDate>May 2018</creationDate>
	<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.9.0</version>
	<description>COM_PRIVACY_XML_DESCRIPTION</description>
	<files folder="site">
		<filename>controller.php</filename>
		<filename>privacy.php</filename>
		<filename>router.php</filename>
		<folder>controllers</folder>
		<folder>models</folder>
		<folder>views</folder>
	</files>
	<languages folder="site">
		<language tag="en-GB">language/en-GB.com_privacy.ini</language>
	</languages>
	<administration>
		<files folder="admin">
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<filename>privacy.php</filename>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>tables</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_privacy.ini</language>
			<language tag="en-GB">language/en-GB.com_privacy.sys.ini</language>
		</languages>
	</administration>
</extension>

components/com_privacy/helpers/plugin.php000060400000007222152453623440014724 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('PrivacyExportDomain', __DIR__ . '/export/domain.php');
JLoader::register('PrivacyExportField', __DIR__ . '/export/field.php');
JLoader::register('PrivacyExportItem', __DIR__ . '/export/item.php');
JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');

/**
 * Base class for privacy plugins
 *
 * @since  3.9.0
 */
abstract class PrivacyPlugin extends JPlugin
{
	/**
	 * Database object
	 *
	 * @var    JDatabaseDriver
	 * @since  3.9.0
	 */
	protected $db;

	/**
	 * Affects constructor behaviour. If true, language files will be loaded automatically.
	 *
	 * @var    boolean
	 * @since  3.9.0
	 */
	protected $autoloadLanguage = true;

	/**
	 * Create a new domain object
	 *
	 * @param   string  $name         The domain's name
	 * @param   string  $description  The domain's description
	 *
	 * @return  PrivacyExportDomain
	 *
	 * @since   3.9.0
	 */
	protected function createDomain($name, $description = '')
	{
		$domain              = new PrivacyExportDomain;
		$domain->name        = $name;
		$domain->description = $description;

		return $domain;
	}

	/**
	 * Create an item object for an array
	 *
	 * @param   array         $data    The array data to convert
	 * @param   integer|null  $itemId  The ID of this item
	 *
	 * @return  PrivacyExportItem
	 *
	 * @since   3.9.0
	 */
	protected function createItemFromArray(array $data, $itemId = null)
	{
		$item = new PrivacyExportItem;
		$item->id = $itemId;

		foreach ($data as $key => $value)
		{
			if (is_object($value))
			{
				$value = (array) $value;
			}

			if (is_array($value))
			{
				$value = print_r($value, true);
			}

			$field        = new PrivacyExportField;
			$field->name  = $key;
			$field->value = $value;

			$item->addField($field);
		}

		return $item;
	}

	/**
	 * Create an item object for a JTable object
	 *
	 * @param   JTable  $table  The JTable object to convert
	 *
	 * @return  PrivacyExportItem
	 *
	 * @since   3.9.0
	 */
	protected function createItemForTable($table)
	{
		$data = array();

		foreach (array_keys($table->getFields()) as $fieldName)
		{
			$data[$fieldName] = $table->$fieldName;
		}

		return $this->createItemFromArray($data, $table->{$table->getKeyName(false)});
	}

	/**
	 * Helper function to create the domain for the items custom fields.
	 *
	 * @param   string  $context  The context
	 * @param   array   $items    The items
	 *
	 * @return  PrivacyExportDomain
	 *
	 * @since   3.9.0
	 */
	protected function createCustomFieldsDomain($context, $items = array())
	{
		if (!is_array($items))
		{
			$items = array($items);
		}

		$parts = FieldsHelper::extract($context);

		if (!$parts)
		{
			return array();
		}

		$type = str_replace('com_', '', $parts[0]);

		$domain = $this->createDomain($type . '_' . $parts[1] . '_custom_fields', 'joomla_' . $type . '_' . $parts[1] . '_custom_fields_data');

		foreach ($items as $item)
		{
			// Get item's fields, also preparing their value property for manual display
			$fields = FieldsHelper::getFields($parts[0] . '.' . $parts[1], $item);

			foreach ($fields as $field)
			{
				$fieldValue = is_array($field->value) ? implode(', ', $field->value) : $field->value;

				$data = array(
					$type . '_id' => $item->id,
					'field_name'  => $field->name,
					'field_title' => $field->title,
					'field_value' => $fieldValue,
				);

				$domain->addItem($this->createItemFromArray($data));
			}
		}

		return $domain;
	}
}
components/com_privacy/helpers/export/domain.php000060400000002421152453623440016212 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('PrivacyExportItem', __DIR__ . '/item.php');

/**
 * Data object representing all data contained in a domain.
 *
 * A domain is typically a single database table and the items within the domain are separate rows from the table.
 *
 * @since  3.9.0
 */
class PrivacyExportDomain
{
	/**
	 * The name of this domain
	 *
	 * @var    string
	 * @since  3.9.0
	 */
	public $name;

	/**
	 * A short description of the data in this domain
	 *
	 * @var    string
	 * @since  3.9.0
	 */
	public $description;

	/**
	 * The items belonging to this domain
	 *
	 * @var    PrivacyExportItem[]
	 * @since  3.9.0
	 */
	protected $items = array();

	/**
	 * Add an item to the domain
	 *
	 * @param   PrivacyExportItem  $item  The item to add
	 *
	 * @return  void
	 *
	 * @since  3.9.0
	 */
	public function addItem(PrivacyExportItem $item)
	{
		$this->items[] = $item;
	}

	/**
	 * Get the domain's items
	 *
	 * @return  PrivacyExportItem[]
	 *
	 * @since  3.9.0
	 */
	public function getItems()
	{
		return $this->items;
	}
}
components/com_privacy/helpers/export/item.php000060400000002237152453623440015706 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('PrivacyExportField', __DIR__ . '/field.php');

/**
 * Data object representing a single item within a domain.
 *
 * An item is typically a single row from a database table.
 *
 * @since  3.9.0
 */
class PrivacyExportItem
{
	/**
	 * The primary identifier of this item, typically the primary key for a database row.
	 *
	 * @var    integer
	 * @since  3.9.0
	 */
	public $id;

	/**
	 * The fields belonging to this item
	 *
	 * @var    PrivacyExportField[]
	 * @since  3.9.0
	 */
	protected $fields = array();

	/**
	 * Add a field to the item
	 *
	 * @param   PrivacyExportField  $field  The field to add
	 *
	 * @return  void
	 *
	 * @since  3.9.0
	 */
	public function addField(PrivacyExportField $field)
	{
		$this->fields[] = $field;
	}

	/**
	 * Get the item's fields
	 *
	 * @return  PrivacyExportField[]
	 *
	 * @since  3.9.0
	 */
	public function getFields()
	{
		return $this->fields;
	}
}
components/com_privacy/helpers/export/field.php000060400000001054152453623440016027 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Data object representing a field within an item.
 *
 * @since  3.9.0
 */
class PrivacyExportField
{
	/**
	 * The name of this field
	 *
	 * @var    string
	 * @since  3.9.0
	 */
	public $name;

	/**
	 * The field's value
	 *
	 * @var    mixed
	 * @since  3.9.0
	 */
	public $value;
}
components/com_privacy/helpers/html/helper.php000060400000002016152453623440015645 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Privacy component HTML helper.
 *
 * @since  3.9.0
 */
class PrivacyHtmlHelper
{
	/**
	 * Render a status label
	 *
	 * @param   integer  $status  The item status
	 *
	 * @return  string
	 *
	 * @since   3.9.0
	 */
	public static function statusLabel($status)
	{
		switch ($status)
		{
			case 2:
				return '<span class="label label-success">' . JText::_('COM_PRIVACY_STATUS_COMPLETED') . '</span>';

			case 1:
				return '<span class="label label-info">' . JText::_('COM_PRIVACY_STATUS_CONFIRMED') . '</span>';

			case -1:
				return '<span class="label label-important">' . JText::_('COM_PRIVACY_STATUS_INVALID') . '</span>';

			default:
			case 0:
				return '<span class="label label-warning">' . JText::_('COM_PRIVACY_STATUS_PENDING') . '</span>';
		}
	}
}
components/com_privacy/helpers/removal/status.php000060400000001474152453623440016421 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Data object communicating the status of whether the data for an information request can be removed.
 *
 * Typically, this object will only be used to communicate data will be removed.
 *
 * @since  3.9.0
 */
class PrivacyRemovalStatus
{
	/**
	 * Flag indicating the status reported by the plugin on whether the information can be removed
	 *
	 * @var    boolean
	 * @since  3.9.0
	 */
	public $canRemove = true;

	/**
	 * A status message indicating the reason data can or cannot be removed
	 *
	 * @var    string
	 * @since  3.9.0
	 */
	public $reason;
}
components/com_privacy/helpers/privacy.php000060400000005437152453623440015111 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;

/**
 * Privacy component helper.
 *
 * @since  3.9.0
 */
class PrivacyHelper extends JHelperContent
{
	/**
	 * Configure the Linkbar.
	 *
	 * @param   string  $vName  The name of the active view.
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public static function addSubmenu($vName)
	{
		JHtmlSidebar::addEntry(
			JText::_('COM_PRIVACY_SUBMENU_DASHBOARD'),
			'index.php?option=com_privacy&view=dashboard',
			$vName === 'dashboard'
		);

		JHtmlSidebar::addEntry(
			JText::_('COM_PRIVACY_SUBMENU_REQUESTS'),
			'index.php?option=com_privacy&view=requests',
			$vName === 'requests'
		);

		JHtmlSidebar::addEntry(
			JText::_('COM_PRIVACY_SUBMENU_CAPABILITIES'),
			'index.php?option=com_privacy&view=capabilities',
			$vName === 'capabilities'
		);

		JHtmlSidebar::addEntry(
			JText::_('COM_PRIVACY_SUBMENU_CONSENTS'),
			'index.php?option=com_privacy&view=consents',
			$vName === 'consents'
		);
	}

	/**
	 * Render the data request as a XML document.
	 *
	 * @param   PrivacyExportDomain[]  $exportData  The data to be exported.
	 *
	 * @return  string
	 *
	 * @since   3.9.0
	 */
	public static function renderDataAsXml(array $exportData)
	{
		$export = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?><data-export />');

		foreach ($exportData as $domain)
		{
			$xmlDomain = $export->addChild('domain');
			$xmlDomain->addAttribute('name', $domain->name);
			$xmlDomain->addAttribute('description', $domain->description);

			foreach ($domain->getItems() as $item)
			{
				$xmlItem = $xmlDomain->addChild('item');

				if ($item->id)
				{
					$xmlItem->addAttribute('id', $item->id);
				}

				foreach ($item->getFields() as $field)
				{
					$xmlItem->{$field->name} = $field->value;
				}
			}
		}

		$dom = new DOMDocument;
		$dom->loadXML($export->asXML());
		$dom->formatOutput = true;

		return $dom->saveXML();
	}

	/**
	 * Gets the privacyconsent system plugin extension id.
	 *
	 * @return  integer  The privacyconsent system plugin extension id.
	 *
	 * @since   3.9.2
	 */
	public static function getPrivacyConsentPluginId()
	{
		$db    = Factory::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('privacyconsent'));

		$db->setQuery($query);

		try
		{
			$result = (int) $db->loadResult();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $e->getMessage());
		}

		return $result;
	}
}
components/com_privacy/controllers/request.xml.php000060400000001122152453623440016612 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Request management controller class.
 *
 * @since  3.9.0
 */
class PrivacyControllerRequest extends JControllerLegacy
{
	/**
	 * Method to export the data for a request.
	 *
	 * @return  $this
	 *
	 * @since   3.9.0
	 */
	public function export()
	{
		$this->input->set('view', 'export');

		return $this->display();
	}
}
components/com_privacy/controllers/consents.php000060400000004172152453623440016167 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Consents management controller class.
 *
 * @since  3.9.0
 */
class PrivacyControllerConsents extends JControllerForm
{
	/**
	 * Method to invalidate specific consents.
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function invalidate($key = null, $urlVar = null)
	{
		// Check for request forgeries
		JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

		$ids = (array) $this->input->get('cid', array(), 'int');

		// Remove zero values resulting from input filter
		$ids = array_filter($ids);

		if (empty($ids))
		{
			$message = JText::_('JERROR_NO_ITEMS_SELECTED');

			$this->setError($message);
		}
		else
		{
			// Get the model.
			/** @var PrivacyModelConsents $model */
			$model = $this->getModel();

			// Publish the items.
			if (!$model->invalidate($ids))
			{
				$this->setError($model->getError());
			}

			$message = JText::plural('COM_PRIVACY_N_CONSENTS_INVALIDATED', count($ids));
		}

		$this->setRedirect(JRoute::_('index.php?option=com_privacy&view=consents', false), $message);
	}

	/**
	 * Method to invalidate all consents of a specific subject.
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function invalidateAll()
	{
		// Check for request forgeries
		JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

		$filters = $this->input->get('filter', array(), 'array');

		if (isset($filters['subject']) && $filters['subject'] != '')
		{
			$subject = $filters['subject'];
		}
		else
		{
			$this->setError(JText::_('JERROR_NO_ITEMS_SELECTED'));
		}

		// Get the model.
		/** @var PrivacyModelConsents $model */
		$model = $this->getModel();

		// Publish the items.
		if (!$model->invalidateAll($subject))
		{
			$this->setError($model->getError());
		}

		$message = JText::_('COM_PRIVACY_CONSENTS_INVALIDATED_ALL');

		$this->setRedirect(JRoute::_('index.php?option=com_privacy&view=consents', false), $message);
	}
}
components/com_privacy/controllers/request.php000060400000023106152453623440016021 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Request management controller class.
 *
 * @since  3.9.0
 */
class PrivacyControllerRequest extends JControllerForm
{
	/**
	 * Method to complete a request.
	 *
	 * @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
	 *
	 * @since   3.9.0
	 */
	public function complete($key = null, $urlVar = null)
	{
		// Check for request forgeries.
		JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

		/** @var PrivacyModelRequest $model */
		$model = $this->getModel();

		/** @var PrivacyTableRequest $table */
		$table = $model->getTable();

		// Determine the name of the primary key for the data.
		if (empty($key))
		{
			$key = $table->getKeyName();
		}

		// To avoid data collisions the urlVar may be different from the primary key.
		if (empty($urlVar))
		{
			$urlVar = $key;
		}

		$recordId = $this->input->getInt($urlVar);

		$item = $model->getItem($recordId);

		// Ensure this record can transition to the requested state
		if (!$this->canTransition($item, '2'))
		{
			$this->setError(\JText::_('COM_PRIVACY_ERROR_COMPLETE_TRANSITION_NOT_PERMITTED'));
			$this->setMessage($this->getError(), 'error');

			$this->setRedirect(
				\JRoute::_(
					'index.php?option=com_privacy&view=request&id=' . $recordId, false
				)
			);

			return false;
		}

		// Build the data array for the update
		$data = array(
			$key     => $recordId,
			'status' => '2',
		);

		// Access check.
		if (!$this->allowSave($data, $key))
		{
			$this->setError(\JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'));
			$this->setMessage($this->getError(), 'error');

			$this->setRedirect(
				\JRoute::_(
					'index.php?option=com_privacy&view=request&id=' . $recordId, false
				)
			);

			return false;
		}

		// Attempt to save the data.
		if (!$model->save($data))
		{
			// Redirect back to the edit screen.
			$this->setError(\JText::sprintf('JLIB_APPLICATION_ERROR_SAVE_FAILED', $model->getError()));
			$this->setMessage($this->getError(), 'error');

			$this->setRedirect(
				\JRoute::_(
					'index.php?option=com_privacy&view=request&id=' . $recordId, false
				)
			);

			return false;
		}

		// Log the request completed
		$model->logRequestCompleted($recordId);

		$this->setMessage(\JText::_('COM_PRIVACY_REQUEST_COMPLETED'));

		$url = 'index.php?option=com_privacy&view=requests';

		// Check if there is a return value
		$return = $this->input->get('return', null, 'base64');

		if (!is_null($return) && \JUri::isInternal(base64_decode($return)))
		{
			$url = base64_decode($return);
		}

		// Redirect to the list screen.
		$this->setRedirect(\JRoute::_($url, false));

		return true;
	}

	/**
	 * Method to email the data export for a request.
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function emailexport()
	{
		// Check for request forgeries.
		$this->checkToken('get');

		/** @var PrivacyModelExport $model */
		$model = $this->getModel('Export');

		$recordId = $this->input->getUint('id');

		if (!$model->emailDataExport($recordId))
		{
			// Redirect back to the edit screen.
			$this->setError(\JText::sprintf('COM_PRIVACY_ERROR_EXPORT_EMAIL_FAILED', $model->getError()));
			$this->setMessage($this->getError(), 'error');
		}
		else
		{
			$this->setMessage(\JText::_('COM_PRIVACY_EXPORT_EMAILED'));
		}

		$url = 'index.php?option=com_privacy&view=requests';

		// Check if there is a return value
		$return = $this->input->get('return', null, 'base64');

		if (!is_null($return) && \JUri::isInternal(base64_decode($return)))
		{
			$url = base64_decode($return);
		}

		// Redirect to the list screen.
		$this->setRedirect(\JRoute::_($url, false));

		return true;
	}

	/**
	 * Method to invalidate a request.
	 *
	 * @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
	 *
	 * @since   3.9.0
	 */
	public function invalidate($key = null, $urlVar = null)
	{
		// Check for request forgeries.
		JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

		/** @var PrivacyModelRequest $model */
		$model = $this->getModel();

		/** @var PrivacyTableRequest $table */
		$table = $model->getTable();

		// Determine the name of the primary key for the data.
		if (empty($key))
		{
			$key = $table->getKeyName();
		}

		// To avoid data collisions the urlVar may be different from the primary key.
		if (empty($urlVar))
		{
			$urlVar = $key;
		}

		$recordId = $this->input->getInt($urlVar);

		$item = $model->getItem($recordId);

		// Ensure this record can transition to the requested state
		if (!$this->canTransition($item, '-1'))
		{
			$this->setError(\JText::_('COM_PRIVACY_ERROR_INVALID_TRANSITION_NOT_PERMITTED'));
			$this->setMessage($this->getError(), 'error');

			$this->setRedirect(
				\JRoute::_(
					'index.php?option=com_privacy&view=request&id=' . $recordId, false
				)
			);

			return false;
		}

		// Build the data array for the update
		$data = array(
			$key     => $recordId,
			'status' => '-1',
		);

		// Access check.
		if (!$this->allowSave($data, $key))
		{
			$this->setError(\JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'));
			$this->setMessage($this->getError(), 'error');

			$this->setRedirect(
				\JRoute::_(
					'index.php?option=com_privacy&view=request&id=' . $recordId, false
				)
			);

			return false;
		}

		// Attempt to save the data.
		if (!$model->save($data))
		{
			// Redirect back to the edit screen.
			$this->setError(\JText::sprintf('JLIB_APPLICATION_ERROR_SAVE_FAILED', $model->getError()));
			$this->setMessage($this->getError(), 'error');

			$this->setRedirect(
				\JRoute::_(
					'index.php?option=com_privacy&view=request&id=' . $recordId, false
				)
			);

			return false;
		}

		// Log the request invalidated
		$model->logRequestInvalidated($recordId);

		$this->setMessage(\JText::_('COM_PRIVACY_REQUEST_INVALIDATED'));

		$url = 'index.php?option=com_privacy&view=requests';

		// Check if there is a return value
		$return = $this->input->get('return', null, 'base64');

		if (!is_null($return) && \JUri::isInternal(base64_decode($return)))
		{
			$url = base64_decode($return);
		}

		// Redirect to the list screen.
		$this->setRedirect(\JRoute::_($url, false));

		return true;
	}

	/**
	 * Method to remove the user data for a privacy remove request.
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function remove()
	{
		// Check for request forgeries.
		$this->checkToken('request');

		/** @var PrivacyModelRemove $model */
		$model = $this->getModel('Remove');

		$recordId = $this->input->getUint('id');

		if (!$model->removeDataForRequest($recordId))
		{
			// Redirect back to the edit screen.
			$this->setError(\JText::sprintf('COM_PRIVACY_ERROR_REMOVE_DATA_FAILED', $model->getError()));
			$this->setMessage($this->getError(), 'error');

			$this->setRedirect(
				\JRoute::_(
					'index.php?option=com_privacy&view=request&id=' . $recordId, false
				)
			);

			return false;
		}

		$this->setMessage(\JText::_('COM_PRIVACY_DATA_REMOVED'));

		$url = 'index.php?option=com_privacy&view=requests';

		// Check if there is a return value
		$return = $this->input->get('return', null, 'base64');

		if (!is_null($return) && \JUri::isInternal(base64_decode($return)))
		{
			$url = base64_decode($return);
		}

		// Redirect to the list screen.
		$this->setRedirect(\JRoute::_($url, false));

		return true;
	}

	/**
	 * 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.9.0
	 */
	protected function postSaveHook(\JModelLegacy $model, $validData = array())
	{
		// This hook only processes new items
		if (!$model->getState($model->getName() . '.new', false))
		{
			return;
		}

		if (!$model->logRequestCreated($model->getState($model->getName() . '.id')))
		{
			if ($error = $model->getError())
			{
				JFactory::getApplication()->enqueueMessage($error, 'warning');
			}
		}

		if (!$model->notifyUserAdminCreatedRequest($model->getState($model->getName() . '.id')))
		{
			if ($error = $model->getError())
			{
				JFactory::getApplication()->enqueueMessage($error, 'warning');
			}
		}
		else
		{
			JFactory::getApplication()->enqueueMessage(JText::_('COM_PRIVACY_MSG_CONFIRM_EMAIL_SENT_TO_USER'));
		}
	}

	/**
	 * Method to determine if an item can transition to the specified status.
	 *
	 * @param   object  $item       The item being updated.
	 * @param   string  $newStatus  The new status of the item.
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	private function canTransition($item, $newStatus)
	{
		switch ($item->status)
		{
			case '0':
				// A pending item can only move to invalid through this controller due to the requirement for a user to confirm the request
				return $newStatus === '-1';

			case '1':
				// A confirmed item can be marked completed or invalid
				return in_array($newStatus, array('-1', '2'), true);

			// An item which is already in an invalid or complete state cannot transition, likewise if we don't know the state don't change anything
			case '-1':
			case '2':
			default:
				return false;
		}
	}
}
components/com_privacy/controllers/requests.php000060400000001653152453623440016207 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Requests management controller class.
 *
 * @since  3.9.0
 */
class PrivacyControllerRequests extends JControllerAdmin
{
	/**
	 * 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|boolean  Model object on success; otherwise false on failure.
	 *
	 * @since   3.9.0
	 */
	public function getModel($name = 'Request', $prefix = 'PrivacyModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}
}
components/com_privacy/tables/request.php000060400000003475152453623440014734 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Table interface class for the #__privacy_requests table
 *
 * @property   integer  $id                        Item ID (primary key)
 * @property   string   $email                     The email address of the individual requesting the data
 * @property   string   $requested_at              The time the request was created at
 * @property   integer  $status                    The status of the information request
 * @property   string   $request_type              The type of information request
 * @property   string   $confirm_token             Hashed token for confirming the information request
 * @property   string   $confirm_token_created_at  The time the confirmation token was generated
 *
 * @since  3.9.0
 */
class PrivacyTableRequest extends JTable
{
	/**
	 * The class constructor.
	 *
	 * @param   JDatabaseDriver  $db  JDatabaseDriver connector object.
	 *
	 * @since   3.9.0
	 */
	public function __construct(JDatabaseDriver $db)
	{
		parent::__construct('#__privacy_requests', 'id', $db);
	}

	/**
	 * Method to store a row in the database from the Table instance properties.
	 *
	 * @param   boolean  $updateNulls  True to update fields even if they are null.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   3.9.0
	 */
	public function store($updateNulls = false)
	{
		$date = JFactory::getDate();

		// Set default values for new records
		if (!$this->id)
		{
			if (!$this->status)
			{
				$this->status = '0';
			}

			if (!$this->requested_at)
			{
				$this->requested_at = $date->toSql();
			}
		}

		return parent::store($updateNulls);
	}
}
components/com_privacy/tables/consent.php000060400000002775152453623440014717 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Table interface class for the #__privacy_consents table
 *
 * @property   integer  $id       Item ID (primary key)
 * @property   integer  $remind   The status of the reminder request
 * @property   string   $token    Hashed token for the reminder request
 * @property   integer  $user_id  User ID (pseudo foreign key to the #__users table) if the request is associated to a user account
 *
 * @since  3.9.0
 */
class PrivacyTableConsent extends JTable
{
	/**
	 * The class constructor.
	 *
	 * @param   JDatabaseDriver  $db  JDatabaseDriver connector object.
	 *
	 * @since   3.9.0
	 */
	public function __construct(JDatabaseDriver $db)
	{
		parent::__construct('#__privacy_consents', 'id', $db);
	}

	/**
	 * Method to store a row in the database from the Table instance properties.
	 *
	 * @param   boolean  $updateNulls  True to update fields even if they are null.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   3.9.0
	 */
	public function store($updateNulls = false)
	{
		$date = JFactory::getDate();

		// Set default values for new records
		if (!$this->id)
		{
			if (!$this->remind)
			{
				$this->remind = '0';
			}

			if (!$this->created)
			{
				$this->created = $date->toSql();
			}
		}

		return parent::store($updateNulls);
	}
}
components/com_privacy/models/remove.php000060400000012615152453623440014546 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('PrivacyHelper', JPATH_ADMINISTRATOR . '/components/com_privacy/helpers/privacy.php');
JLoader::register('PrivacyRemovalStatus', JPATH_ADMINISTRATOR . '/components/com_privacy/helpers/removal/status.php');

/**
 * Remove model class.
 *
 * @since  3.9.0
 */
class PrivacyModelRemove extends JModelLegacy
{
	/**
	 * Remove the user data.
	 *
	 * @param   integer  $id  The request ID to process
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function removeDataForRequest($id = null)
	{
		$id = !empty($id) ? $id : (int) $this->getState($this->getName() . '.request_id');

		if (!$id)
		{
			$this->setError(JText::_('COM_PRIVACY_ERROR_REQUEST_ID_REQUIRED_FOR_REMOVE'));

			return false;
		}

		/** @var PrivacyTableRequest $table */
		$table = $this->getTable();

		if (!$table->load($id))
		{
			$this->setError($table->getError());

			return false;
		}

		if ($table->request_type !== 'remove')
		{
			$this->setError(JText::_('COM_PRIVACY_ERROR_REQUEST_TYPE_NOT_REMOVE'));

			return false;
		}

		if ($table->status != 1)
		{
			$this->setError(JText::_('COM_PRIVACY_ERROR_CANNOT_REMOVE_UNCONFIRMED_REQUEST'));

			return false;
		}

		// If there is a user account associated with the email address, load it here for use in the plugins
		$db = $this->getDbo();

		$userId = (int) $db->setQuery(
			$db->getQuery(true)
				->select('id')
				->from($db->quoteName('#__users'))
				->where('LOWER(' . $db->quoteName('email') . ') = LOWER(' . $db->quote($table->email) . ')'),
			0,
			1
		)->loadResult();

		$user = $userId ? JUser::getInstance($userId) : null;

		$canRemove = true;

		JPluginHelper::importPlugin('privacy');

		/** @var PrivacyRemovalStatus[] $pluginResults */
		$pluginResults = JFactory::getApplication()->triggerEvent('onPrivacyCanRemoveData', array($table, $user));

		foreach ($pluginResults as $status)
		{
			if (!$status->canRemove)
			{
				$this->setError($status->reason ?: JText::_('COM_PRIVACY_ERROR_CANNOT_REMOVE_DATA'));

				$canRemove = false;
			}
		}

		if (!$canRemove)
		{
			$this->logRemoveBlocked($table, $this->getErrors());

			return false;
		}

		// Log the removal
		$this->logRemove($table);

		JFactory::getApplication()->triggerEvent('onPrivacyRemoveData', array($table, $user));

		return true;
	}

	/**
	 * Method to get a table object, load it if necessary.
	 *
	 * @param   string  $name     The table name. Optional.
	 * @param   string  $prefix   The class prefix. Optional.
	 * @param   array   $options  Configuration array for model. Optional.
	 *
	 * @return  JTable  A JTable object
	 *
	 * @since   3.9.0
	 * @throws  \Exception
	 */
	public function getTable($name = 'Request', $prefix = 'PrivacyTable', $options = array())
	{
		return parent::getTable($name, $prefix, $options);
	}

	/**
	 * Log the data removal to the action log system.
	 *
	 * @param   PrivacyTableRequest  $request  The request record being processed
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function logRemove(PrivacyTableRequest $request)
	{
		JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_actionlogs/models', 'ActionlogsModel');

		$user = JFactory::getUser();

		$message = array(
			'action'      => 'remove',
			'id'          => $request->id,
			'itemlink'    => 'index.php?option=com_privacy&view=request&id=' . $request->id,
			'userid'      => $user->id,
			'username'    => $user->username,
			'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
		);

		/** @var ActionlogsModelActionlog $model */
		$model = JModelLegacy::getInstance('Actionlog', 'ActionlogsModel');
		$model->addLog(array($message), 'COM_PRIVACY_ACTION_LOG_REMOVE', 'com_privacy.request', $user->id);
	}

	/**
	 * Log the data removal being blocked to the action log system.
	 *
	 * @param   PrivacyTableRequest  $request  The request record being processed
	 * @param   string[]             $reasons  The reasons given why the record could not be removed.
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function logRemoveBlocked(PrivacyTableRequest $request, array $reasons)
	{
		JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_actionlogs/models', 'ActionlogsModel');

		$user = JFactory::getUser();

		$message = array(
			'action'      => 'remove-blocked',
			'id'          => $request->id,
			'itemlink'    => 'index.php?option=com_privacy&view=request&id=' . $request->id,
			'userid'      => $user->id,
			'username'    => $user->username,
			'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
			'reasons'     => implode('; ', $reasons),
		);

		/** @var ActionlogsModelActionlog $model */
		$model = JModelLegacy::getInstance('Actionlog', 'ActionlogsModel');
		$model->addLog(array($message), 'COM_PRIVACY_ACTION_LOG_REMOVE_BLOCKED', 'com_privacy.request', $user->id);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	protected function populateState()
	{
		// Get the pk of the record from the request.
		$this->setState($this->getName() . '.request_id', JFactory::getApplication()->input->getUint('id'));

		// Load the parameters.
		$this->setState('params', JComponentHelper::getParams('com_privacy'));
	}
}
components/com_privacy/models/forms/filter_requests.xml000060400000003522152453623440017625 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset addfieldpath="/administrator/components/com_privacy/models/fields" />

	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_PRIVACY_FILTER_SEARCH_LABEL"
			description="COM_PRIVACY_SEARCH_IN_EMAIL"
			hint="JSEARCH_FILTER"
		/>

		<field
			name="status"
			type="privacy.requeststatus"
			label="COM_PRIVACY_FILTER_STATUS"
			description="COM_PRIVACY_FILTER_STATUS_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>

		<field
			name="request_type"
			type="privacy.requesttype"
			label="COM_PRIVACY_FILTER_REQUEST_TYPE"
			description="COM_PRIVACY_FILTER_REQUEST_TYPE_DESC"
			onchange="this.form.submit();"
			>
			<option value="">COM_PRIVACY_SELECT_REQUEST_TYPE</option>
		</field>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="a.id DESC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.email ASC">COM_PRIVACY_HEADING_EMAIL_ASC</option>
			<option value="a.email DESC">COM_PRIVACY_HEADING_EMAIL_DESC</option>
			<option value="a.request_type ASC">COM_PRIVACY_HEADING_REQUEST_TYPE_ASC</option>
			<option value="a.request_type DESC">COM_PRIVACY_HEADING_REQUEST_TYPE_DESC</option>
			<option value="a.requested_at ASC">COM_PRIVACY_HEADING_REQUESTED_AT_ASC</option>
			<option value="a.requested_at DESC">COM_PRIVACY_HEADING_REQUESTED_AT_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_privacy/models/forms/filter_consents.xml000060400000004423152453623440017607 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset addfieldpath="/administrator/components/com_privacy/models/fields" />

	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_PRIVACY_FILTER_SEARCH_LABEL"
			description="COM_PRIVACY_SEARCH_IN_USERNAME"
			hint="JSEARCH_FILTER"
		/>

		<field
			name="state"
			type="list"
			label="COM_PRIVACY_CONSENTS_FILTER_STATE"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
			<option value="1">COM_PRIVACY_CONSENTS_STATE_VALID</option>
			<option value="0">COM_PRIVACY_CONSENTS_STATE_OBSOLETE</option>
			<option value="-1">COM_PRIVACY_CONSENTS_STATE_INVALIDATED</option>
		</field>

		<field
			name="subject"
			type="sql"
			label="COM_PRIVACY_CONSENTS_FILTER_SUBJECT"
			sql_select="subject"
			sql_from="#__privacy_consents"
			sql_group="subject"
			sql_order="subject ASC"
			key_field="subject"
			translate="true"
			onchange="this.form.submit();"
			>
			<option value="">COM_PRIVACY_CONSENTS_SUBJECT_DEFAULT</option>
		</field>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="a.id DESC"
			validate="options"
			>
			<option value="a.state ASC">COM_PRIVACY_HEADING_STATUS_ASC</option>
			<option value="a.state DESC">COM_PRIVACY_HEADING_STATUS_DESC</option>
			<option value="u.username ASC">COM_PRIVACY_HEADING_USERNAME_ASC</option>
			<option value="u.username DESC">COM_PRIVACY_HEADING_USERNAME_DESC</option>
			<option value="a.user_id ASC">COM_PRIVACY_HEADING_USERID_ASC</option>
			<option value="a.user_id DESC">COM_PRIVACY_HEADING_USERID_DESC</option>
			<option value="a.subject ASC">COM_PRIVACY_HEADING_SUBJECT_ASC</option>
			<option value="a.subject DESC">COM_PRIVACY_HEADING_SUBJECT_DESC</option>	
			<option value="a.created ASC">COM_PRIVACY_HEADING_CREATED_ASC</option>
			<option value="a.created DESC">COM_PRIVACY_HEADING_CREATED_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_privacy/models/forms/request.xml000060400000002434152453623440016076 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset addfieldpath="/administrator/components/com_privacy/models/fields">
		<field
			name="email"
			type="email"
			label="JGLOBAL_EMAIL"
			description="COM_PRIVACY_USER_FIELD_EMAIL_DESC"
			required="true"
			size="30"
			validate="email"
		/>

		<field
			name="status"
			type="list"
			label="JSTATUS"
			description="COM_PRIVACY_FIELD_STATUS_DESC"
			filter="int"
			default="0"
			validate="options"
			readonly="true"
			>
			<option value="0">COM_PRIVACY_STATUS_PENDING</option>
			<option value="-1">COM_PRIVACY_STATUS_INVALID</option>
			<option value="1">COM_PRIVACY_STATUS_CONFIRMED</option>
			<option value="2">COM_PRIVACY_STATUS_COMPLETED</option>
		</field>

		<field
			name="request_type"
			type="list"
			label="COM_PRIVACY_FIELD_REQUEST_TYPE_LABEL"
			description="COM_PRIVACY_FIELD_REQUEST_TYPE_DESC"
			filter="string"
			default="export"
			validate="options"
			>
			<option value="export">COM_PRIVACY_HEADING_REQUEST_TYPE_TYPE_EXPORT</option>
			<option value="remove">COM_PRIVACY_HEADING_REQUEST_TYPE_TYPE_REMOVE</option>
		</field>

		<field
			name="id"
			type="number"
			label="JGLOBAL_FIELD_ID_LABEL"
			description="JGLOBAL_FIELD_ID_DESC"
			class="readonly"
			default="0"
			readonly="true"
		/>

	</fieldset>
</form>
components/com_privacy/models/export.php000060400000021266152453623440014574 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('PrivacyHelper', JPATH_ADMINISTRATOR . '/components/com_privacy/helpers/privacy.php');

/**
 * Export model class.
 *
 * @since  3.9.0
 */
class PrivacyModelExport extends JModelLegacy
{
	/**
	 * Create the export document for an information request.
	 *
	 * @param   integer  $id  The request ID to process
	 *
	 * @return  PrivacyExportDomain[]|boolean  A SimpleXMLElement object for a successful export or boolean false on an error
	 *
	 * @since   3.9.0
	 */
	public function collectDataForExportRequest($id = null)
	{
		$id = !empty($id) ? $id : (int) $this->getState($this->getName() . '.request_id');

		if (!$id)
		{
			$this->setError(JText::_('COM_PRIVACY_ERROR_REQUEST_ID_REQUIRED_FOR_EXPORT'));

			return false;
		}

		/** @var PrivacyTableRequest $table */
		$table = $this->getTable();

		if (!$table->load($id))
		{
			$this->setError($table->getError());

			return false;
		}

		if ($table->request_type !== 'export')
		{
			$this->setError(JText::_('COM_PRIVACY_ERROR_REQUEST_TYPE_NOT_EXPORT'));

			return false;
		}

		if ($table->status != 1)
		{
			$this->setError(JText::_('COM_PRIVACY_ERROR_CANNOT_EXPORT_UNCONFIRMED_REQUEST'));

			return false;
		}

		// If there is a user account associated with the email address, load it here for use in the plugins
		$db = $this->getDbo();

		$userId = (int) $db->setQuery(
			$db->getQuery(true)
				->select('id')
				->from($db->quoteName('#__users'))
				->where('LOWER(' . $db->quoteName('email') . ') = LOWER(' . $db->quote($table->email) . ')'),
			0,
			1
		)->loadResult();

		$user = $userId ? JUser::getInstance($userId) : null;

		// Log the export
		$this->logExport($table);

		JPluginHelper::importPlugin('privacy');

		$pluginResults = JFactory::getApplication()->triggerEvent('onPrivacyExportRequest', array($table, $user));

		$domains = array();

		foreach ($pluginResults as $pluginDomains)
		{
			$domains = array_merge($domains, $pluginDomains);
		}

		return $domains;
	}

	/**
	 * Email the data export to the user.
	 *
	 * @param   integer  $id  The request ID to process
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function emailDataExport($id = null)
	{
		$id = !empty($id) ? $id : (int) $this->getState($this->getName() . '.request_id');

		if (!$id)
		{
			$this->setError(JText::_('COM_PRIVACY_ERROR_REQUEST_ID_REQUIRED_FOR_EXPORT'));

			return false;
		}

		$exportData = $this->collectDataForExportRequest($id);

		if ($exportData === false)
		{
			// Error is already set, we just need to bail
			return false;
		}

		/** @var PrivacyTableRequest $table */
		$table = $this->getTable();

		if (!$table->load($id))
		{
			$this->setError($table->getError());

			return false;
		}

		if ($table->request_type !== 'export')
		{
			$this->setError(JText::_('COM_PRIVACY_ERROR_REQUEST_TYPE_NOT_EXPORT'));

			return false;
		}

		if ($table->status != 1)
		{
			$this->setError(JText::_('COM_PRIVACY_ERROR_CANNOT_EXPORT_UNCONFIRMED_REQUEST'));

			return false;
		}

		// Log the email
		$this->logExportEmailed($table);

		/*
		 * If there is an associated user account, we will attempt to send this email in the user's preferred language.
		 * Because of this, it is expected that Language::_() is directly called and that the Text class is NOT used
		 * for translating all messages.
		 *
		 * Error messages will still be displayed to the administrator, so those messages should continue to use the Text class.
		 */

		$lang = JFactory::getLanguage();

		$db = $this->getDbo();

		$userId = (int) $db->setQuery(
			$db->getQuery(true)
				->select('id')
				->from($db->quoteName('#__users'))
				->where('LOWER(' . $db->quoteName('email') . ') = LOWER(' . $db->quote($table->email) . ')'),
			0,
			1
		)->loadResult();

		if ($userId)
		{
			$receiver = JUser::getInstance($userId);

			/*
			 * We don't know if the user has admin access, so we will check if they have an admin language in their parameters,
			 * falling back to the site language, falling back to the currently active language
			 */

			$langCode = $receiver->getParam('admin_language', '');

			if (!$langCode)
			{
				$langCode = $receiver->getParam('language', $lang->getTag());
			}

			$lang = JLanguage::getInstance($langCode, $lang->getDebug());
		}

		// Ensure the right language files have been loaded
		$lang->load('com_privacy', JPATH_ADMINISTRATOR, null, false, true)
			|| $lang->load('com_privacy', JPATH_ADMINISTRATOR . '/components/com_privacy', null, false, true);

		// The mailer can be set to either throw Exceptions or return boolean false, account for both
		try
		{
			$app = JFactory::getApplication();

			$substitutions = array(
				'[SITENAME]' => $app->get('sitename'),
				'[URL]'      => JUri::root(),
				'\\n'        => "\n",
			);

			$emailSubject = $lang->_('COM_PRIVACY_EMAIL_DATA_EXPORT_COMPLETED_SUBJECT');
			$emailBody    = $lang->_('COM_PRIVACY_EMAIL_DATA_EXPORT_COMPLETED_BODY');

			foreach ($substitutions as $k => $v)
			{
				$emailSubject = str_replace($k, $v, $emailSubject);
				$emailBody    = str_replace($k, $v, $emailBody);
			}

			$mailer = JFactory::getMailer();
			$mailer->setSubject($emailSubject);
			$mailer->setBody($emailBody);
			$mailer->addRecipient($table->email);
			$mailer->addStringAttachment(
				PrivacyHelper::renderDataAsXml($exportData),
				'user-data_' . JUri::getInstance()->toString(array('host')) . '.xml'
			);

			$mailResult = $mailer->Send();

			if ($mailResult instanceof JException)
			{
				// JError was already called so we just need to return now
				return false;
			}
			elseif ($mailResult === false)
			{
				$this->setError($mailer->ErrorInfo);

				return false;
			}

			return true;
		}
		catch (phpmailerException $exception)
		{
			$this->setError($exception->getMessage());

			return false;
		}

		return true;
	}

	/**
	 * Method to get a table object, load it if necessary.
	 *
	 * @param   string  $name     The table name. Optional.
	 * @param   string  $prefix   The class prefix. Optional.
	 * @param   array   $options  Configuration array for model. Optional.
	 *
	 * @return  JTable  A JTable object
	 *
	 * @since   3.9.0
	 * @throws  \Exception
	 */
	public function getTable($name = 'Request', $prefix = 'PrivacyTable', $options = array())
	{
		return parent::getTable($name, $prefix, $options);
	}

	/**
	 * Log the data export to the action log system.
	 *
	 * @param   PrivacyTableRequest  $request  The request record being processed
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function logExport(PrivacyTableRequest $request)
	{
		JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_actionlogs/models', 'ActionlogsModel');

		$user = JFactory::getUser();

		$message = array(
			'action'      => 'export',
			'id'          => $request->id,
			'itemlink'    => 'index.php?option=com_privacy&view=request&id=' . $request->id,
			'userid'      => $user->id,
			'username'    => $user->username,
			'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
		);

		/** @var ActionlogsModelActionlog $model */
		$model = JModelLegacy::getInstance('Actionlog', 'ActionlogsModel');
		$model->addLog(array($message), 'COM_PRIVACY_ACTION_LOG_EXPORT', 'com_privacy.request', $user->id);
	}

	/**
	 * Log the data export email to the action log system.
	 *
	 * @param   PrivacyTableRequest  $request  The request record being processed
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	public function logExportEmailed(PrivacyTableRequest $request)
	{
		JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_actionlogs/models', 'ActionlogsModel');

		$user = JFactory::getUser();

		$message = array(
			'action'      => 'export_emailed',
			'id'          => $request->id,
			'itemlink'    => 'index.php?option=com_privacy&view=request&id=' . $request->id,
			'userid'      => $user->id,
			'username'    => $user->username,
			'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
		);

		/** @var ActionlogsModelActionlog $model */
		$model = JModelLegacy::getInstance('Actionlog', 'ActionlogsModel');
		$model->addLog(array($message), 'COM_PRIVACY_ACTION_LOG_EXPORT_EMAILED', 'com_privacy.request', $user->id);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	protected function populateState()
	{
		// Get the pk of the record from the request.
		$this->setState($this->getName() . '.request_id', JFactory::getApplication()->input->getUint('id'));

		// Load the parameters.
		$this->setState('params', JComponentHelper::getParams('com_privacy'));
	}
}
components/com_privacy/models/request.php000060400000030073152453623440014737 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Router\Route;

/**
 * Request item model class.
 *
 * @since  3.9.0
 */
class PrivacyModelRequest extends JModelAdmin
{
	/**
	 * Clean the cache
	 *
	 * @param   string   $group     The cache group
	 * @param   integer  $clientId  The ID of the client
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	protected function cleanCache($group = 'com_privacy', $clientId = 1)
	{
		parent::cleanCache('com_privacy', 1);
	}

	/**
	 * Method for getting the form from the model.
	 *
	 * @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   3.9.0
	 */
	public function getForm($data = array(), $loadData = true)
	{
		// Get the form.
		$form = $this->loadForm('com_privacy.request', 'request', array('control' => 'jform', 'load_data' => $loadData));

		if (empty($form))
		{
			return false;
		}

		return $form;
	}

	/**
	 * Method to get a table object, load it if necessary.
	 *
	 * @param   string  $name     The table name. Optional.
	 * @param   string  $prefix   The class prefix. Optional.
	 * @param   array   $options  Configuration array for model. Optional.
	 *
	 * @return  JTable  A JTable object
	 *
	 * @since   3.9.0
	 * @throws  \Exception
	 */
	public function getTable($name = 'Request', $prefix = 'PrivacyTable', $options = array())
	{
		return parent::getTable($name, $prefix, $options);
	}

	/**
	 * Method to get the data that should be injected in the form.
	 *
	 * @return  array  The default data is an empty array.
	 *
	 * @since   3.9.0
	 */
	protected function loadFormData()
	{
		// Check the session for previously entered form data.
		$data = JFactory::getApplication()->getUserState('com_privacy.edit.request.data', array());

		if (empty($data))
		{
			$data = $this->getItem();
		}

		return $data;
	}

	/**
	 * Log the completion of a request to the action log system.
	 *
	 * @param   integer  $id  The ID of the request to process.
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function logRequestCompleted($id)
	{
		/** @var PrivacyTableRequest $table */
		$table = $this->getTable();

		if (!$table->load($id))
		{
			$this->setError($table->getError());

			return false;
		}

		JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_actionlogs/models', 'ActionlogsModel');

		$user = JFactory::getUser();

		$message = array(
			'action'       => 'request-completed',
			'requesttype'  => $table->request_type,
			'subjectemail' => $table->email,
			'id'           => $table->id,
			'itemlink'     => 'index.php?option=com_privacy&view=request&id=' . $table->id,
			'userid'       => $user->id,
			'username'     => $user->username,
			'accountlink'  => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
		);

		/** @var ActionlogsModelActionlog $model */
		$model = JModelLegacy::getInstance('Actionlog', 'ActionlogsModel');
		$model->addLog(array($message), 'COM_PRIVACY_ACTION_LOG_ADMIN_COMPLETED_REQUEST', 'com_privacy.request', $user->id);

		return true;
	}

	/**
	 * Log the creation of a request to the action log system.
	 *
	 * @param   integer  $id  The ID of the request to process.
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function logRequestCreated($id)
	{
		/** @var PrivacyTableRequest $table */
		$table = $this->getTable();

		if (!$table->load($id))
		{
			$this->setError($table->getError());

			return false;
		}

		JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_actionlogs/models', 'ActionlogsModel');

		$user = JFactory::getUser();

		$message = array(
			'action'       => 'request-created',
			'requesttype'  => $table->request_type,
			'subjectemail' => $table->email,
			'id'           => $table->id,
			'itemlink'     => 'index.php?option=com_privacy&view=request&id=' . $table->id,
			'userid'       => $user->id,
			'username'     => $user->username,
			'accountlink'  => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
		);

		/** @var ActionlogsModelActionlog $model */
		$model = JModelLegacy::getInstance('Actionlog', 'ActionlogsModel');
		$model->addLog(array($message), 'COM_PRIVACY_ACTION_LOG_ADMIN_CREATED_REQUEST', 'com_privacy.request', $user->id);

		return true;
	}

	/**
	 * Log the invalidation of a request to the action log system.
	 *
	 * @param   integer  $id  The ID of the request to process.
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function logRequestInvalidated($id)
	{
		/** @var PrivacyTableRequest $table */
		$table = $this->getTable();

		if (!$table->load($id))
		{
			$this->setError($table->getError());

			return false;
		}

		JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_actionlogs/models', 'ActionlogsModel');

		$user = JFactory::getUser();

		$message = array(
			'action'       => 'request-invalidated',
			'requesttype'  => $table->request_type,
			'subjectemail' => $table->email,
			'id'           => $table->id,
			'itemlink'     => 'index.php?option=com_privacy&view=request&id=' . $table->id,
			'userid'       => $user->id,
			'username'     => $user->username,
			'accountlink'  => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
		);

		/** @var ActionlogsModelActionlog $model */
		$model = JModelLegacy::getInstance('Actionlog', 'ActionlogsModel');
		$model->addLog(array($message), 'COM_PRIVACY_ACTION_LOG_ADMIN_INVALIDATED_REQUEST', 'com_privacy.request', $user->id);

		return true;
	}

	/**
	 * Notifies the user that an information request has been created by a site administrator.
	 *
	 * Because confirmation tokens are stored in the database as a hashed value, this method will generate a new confirmation token
	 * for the request.
	 *
	 * @param   integer  $id  The ID of the request to process.
	 *
	 * @return  boolean
	 *
	 * @since   3.9.0
	 */
	public function notifyUserAdminCreatedRequest($id)
	{
		/** @var PrivacyTableRequest $table */
		$table = $this->getTable();

		if (!$table->load($id))
		{
			$this->setError($table->getError());

			return false;
		}

		/*
		 * If there is an associated user account, we will attempt to send this email in the user's preferred language.
		 * Because of this, it is expected that Language::_() is directly called and that the Text class is NOT used
		 * for translating all messages.
		 *
		 * Error messages will still be displayed to the administrator, so those messages should continue to use the Text class.
		 */

		$lang = JFactory::getLanguage();

		$db = $this->getDbo();

		$userId = (int) $db->setQuery(
			$db->getQuery(true)
				->select('id')
				->from($db->quoteName('#__users'))
				->where('LOWER(' . $db->quoteName('email') . ') = LOWER(' . $db->quote($table->email) . ')'),
			0,
			1
		)->loadResult();

		if ($userId)
		{
			$receiver = JUser::getInstance($userId);

			/*
			 * We don't know if the user has admin access, so we will check if they have an admin language in their parameters,
			 * falling back to the site language, falling back to the currently active language
			 */

			$langCode = $receiver->getParam('admin_language', '');

			if (!$langCode)
			{
				$langCode = $receiver->getParam('language', $lang->getTag());
			}

			$lang = JLanguage::getInstance($langCode, $lang->getDebug());
		}

		// Ensure the right language files have been loaded
		$lang->load('com_privacy', JPATH_ADMINISTRATOR, null, false, true)
			|| $lang->load('com_privacy', JPATH_ADMINISTRATOR . '/components/com_privacy', null, false, true);

		// Regenerate the confirmation token
		$token       = JApplicationHelper::getHash(JUserHelper::genRandomPassword());
		$hashedToken = JUserHelper::hashPassword($token);

		$table->confirm_token            = $hashedToken;
		$table->confirm_token_created_at = JFactory::getDate()->toSql();

		try
		{
			$table->store();
		}
		catch (JDatabaseException $exception)
		{
			$this->setError($exception->getMessage());

			return false;
		}

		// The mailer can be set to either throw Exceptions or return boolean false, account for both
		try
		{
			$app = JFactory::getApplication();

			$linkMode = $app->get('force_ssl', 0) == 2 ? Route::TLS_FORCE : Route::TLS_IGNORE;

			$substitutions = array(
				'[SITENAME]' => $app->get('sitename'),
				'[URL]'      => JUri::root(),
				'[TOKENURL]' => JRoute::link('site', 'index.php?option=com_privacy&view=confirm&confirm_token=' . $token, false, $linkMode, true),
				'[FORMURL]'  => JRoute::link('site', 'index.php?option=com_privacy&view=confirm', false, $linkMode, true),
				'[TOKEN]'    => $token,
				'\\n'        => "\n",
			);

			switch ($table->request_type)
			{
				case 'export':
					$emailSubject = $lang->_('COM_PRIVACY_EMAIL_ADMIN_REQUEST_SUBJECT_EXPORT_REQUEST');
					$emailBody    = $lang->_('COM_PRIVACY_EMAIL_ADMIN_REQUEST_BODY_EXPORT_REQUEST');

					break;

				case 'remove':
					$emailSubject = $lang->_('COM_PRIVACY_EMAIL_ADMIN_REQUEST_SUBJECT_REMOVE_REQUEST');
					$emailBody    = $lang->_('COM_PRIVACY_EMAIL_ADMIN_REQUEST_BODY_REMOVE_REQUEST');

					break;

				default:
					$this->setError(JText::_('COM_PRIVACY_ERROR_UNKNOWN_REQUEST_TYPE'));

					return false;
			}

			foreach ($substitutions as $k => $v)
			{
				$emailSubject = str_replace($k, $v, $emailSubject);
				$emailBody    = str_replace($k, $v, $emailBody);
			}

			$mailer = JFactory::getMailer();
			$mailer->setSubject($emailSubject);
			$mailer->setBody($emailBody);
			$mailer->addRecipient($table->email);

			$mailResult = $mailer->Send();

			if ($mailResult instanceof JException)
			{
				// JError was already called so we just need to return now
				return false;
			}
			elseif ($mailResult === false)
			{
				$this->setError($mailer->ErrorInfo);

				return false;
			}

			return true;
		}
		catch (phpmailerException $exception)
		{
			$this->setError($exception->getMessage());

			return false;
		}
	}

	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success, False on error.
	 *
	 * @since   3.9.0
	 */
	public function save($data)
	{
		$table = $this->getTable();
		$key   = $table->getKeyName();
		$pk    = !empty($data[$key]) ? $data[$key] : (int) $this->getState($this->getName() . '.id');

		if (!$pk && !JFactory::getConfig()->get('mailonline', 1))
		{
			$this->setError(JText::_('COM_PRIVACY_ERROR_CANNOT_CREATE_REQUEST_WHEN_SENDMAIL_DISABLED'));

			return false;
		}

		return parent::save($data);
	}

	/**
	 * Method to validate the form data.
	 *
	 * @param   JForm   $form   The form to validate against.
	 * @param   array   $data   The data to validate.
	 * @param   string  $group  The name of the field group to validate.
	 *
	 * @return  array|boolean  Array of filtered data if valid, false otherwise.
	 *
	 * @see     JFormRule
	 * @see     JFilterInput
	 * @since   3.9.0
	 */
	public function validate($form, $data, $group = null)
	{
		$validatedData = parent::validate($form, $data, $group);

		// If parent validation failed there's no point in doing our extended validation
		if ($validatedData === false)
		{
			return false;
		}

		// Make sure the status is always 0
		$validatedData['status'] = 0;

		// The user cannot create a request for their own account
		if (strtolower(JFactory::getUser()->email) === strtolower($validatedData['email']))
		{
			$this->setError(JText::_('COM_PRIVACY_ERROR_CANNOT_CREATE_REQUEST_FOR_SELF'));

			return false;
		}

		// Check for an active request for this email address
		$db = $this->getDbo();

		$query = $db->getQuery(true)
			->select('COUNT(id)')
			->from('#__privacy_requests')
			->where('email = ' . $db->quote($validatedData['email']))
			->where('request_type = ' . $db->quote($validatedData['request_type']))
			->where('status IN (0, 1)');

		$activeRequestCount = (int) $db->setQuery($query)->loadResult();

		if ($activeRequestCount > 0)
		{
			$this->setError(JText::_('COM_PRIVACY_ERROR_ACTIVE_REQUEST_FOR_EMAIL'));

			return false;
		}

		return $validatedData;
	}
}
components/com_privacy/models/requests.php000060400000011202152453623440015113 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Component\ComponentHelper;

/**
 * Requests management model class.
 *
 * @since  3.9.0
 */
class PrivacyModelRequests extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @since   3.9.0
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'email', 'a.email',
				'requested_at', 'a.requested_at',
				'request_type', 'a.request_type',
				'status', 'a.status',
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to get a JDatabaseQuery object for retrieving the data set from a database.
	 *
	 * @return  JDatabaseQuery
	 *
	 * @since   3.9.0
	 */
	protected function getListQuery()
	{
		// 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.*'));
		$query->from($db->quoteName('#__privacy_requests', 'a'));

		// Filter by status
		$status = $this->getState('filter.status');

		if (is_numeric($status))
		{
			$query->where('a.status = ' . (int) $status);
		}

		// Filter by request type
		$requestType = $this->getState('filter.request_type', '');

		if ($requestType)
		{
			$query->where('a.request_type = ' . $db->quote($db->escape($requestType, true)));
		}

		// Filter by search in email
		$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('%' . $db->escape($search, true) . '%');
				$query->where('(' . $db->quoteName('a.email') . ' LIKE ' . $search . ')');
			}
		}

		// Handle the list ordering.
		$ordering  = $this->getState('list.ordering');
		$direction = $this->getState('list.direction');

		if (!empty($ordering))
		{
			$query->order($db->escape($ordering) . ' ' . $db->escape($direction));
		}

		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
	 *
	 * @since   3.9.0
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.status');
		$id .= ':' . $this->getState('filter.request_type');

		return parent::getStoreId($id);
	}

	/**
	 * 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.9.0
	 */
	protected function populateState($ordering = 'a.id', $direction = 'desc')
	{
		// Load the filter state.
		$this->setState(
			'filter.search',
			$this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search')
		);

		$this->setState(
			'filter.status',
			$this->getUserStateFromRequest($this->context . '.filter.status', 'filter_status', '', 'int')
		);

		$this->setState(
			'filter.request_type',
			$this->getUserStateFromRequest($this->context . '.filter.request_type', 'filter_request_type', '', 'string')
		);

		// Load the parameters.
		$this->setState('params', JComponentHelper::getParams('com_privacy'));

		// List state information.
		parent::populateState($ordering, $direction);
	}

	/**
	 * Method to return number privacy requests older than X days.
	 *
	 * @return  integer
	 *
	 * @since   3.9.0
	 */
	public function getNumberUrgentRequests()
	{
		// Load the parameters.
		$params = ComponentHelper::getComponent('com_privacy')->getParams();
		$notify = (int) $params->get('notify', 14);
		$now    = JFactory::getDate()->toSql();
		$period = '-' . $notify;

		$db    = $this->getDbo();
		$query = $db->getQuery(true)
			->select('COUNT(*)');
		$query->from($db->quoteName('#__privacy_requests'));
		$query->where($db->quoteName('status') . ' = 1 ');
		$query->where($query->dateAdd($db->quote($now), $period, 'DAY') . ' > ' . $db->quoteName('requested_at'));
		$db->setQuery($query);

		return (int) $db->loadResult();
	}
}
components/com_privacy/models/consents.php000060400000012415152453623440015103 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Consents management model class.
 *
 * @since  3.9.0
 */
class PrivacyModelConsents extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @since   3.9.0
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id', 
				'user_id', 'a.user_id',
				'subject', 'a.subject',
				'created', 'a.created',
				'username', 'u.username',
				'state', 'a.state'
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to get a JDatabaseQuery object for retrieving the data set from a database.
	 *
	 * @return  JDatabaseQuery
	 *
	 * @since   3.9.0
	 */
	protected function getListQuery()
	{
		// 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.*'));
		$query->from($db->quoteName('#__privacy_consents', 'a'));

		// Join over the users for the username.
		$query->select($db->quoteName('u.username', 'username'));
		$query->join('LEFT', $db->quoteName('#__users', 'u') . ' ON u.id = a.user_id');

		// Filter by search in email
		$search = $this->getState('filter.search');

		if (!empty($search))
		{
			if (stripos($search, 'id:') === 0)
			{
				$query->where($db->quoteName('a.id') . ' = ' . (int) substr($search, 3));
			}
			elseif (stripos($search, 'uid:') === 0)
			{
				$query->where($db->quoteName('a.user_id') . ' = ' . (int) substr($search, 4));
			}
			else
			{
				$search = $db->quote('%' . $db->escape($search, true) . '%');
				$query->where('(' . $db->quoteName('u.username') . ' LIKE ' . $search . ')');
			}
		}

		$state = $this->getState('filter.state');

		if ($state != '')
		{
			$query->where($db->quoteName('a.state') . ' = ' . (int) $state);
		}

		// Handle the list ordering.
		$ordering  = $this->getState('list.ordering');
		$direction = $this->getState('list.direction');

		if (!empty($ordering))
		{
			$query->order($db->escape($ordering) . ' ' . $db->escape($direction));
		}

		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
	 *
	 * @since   3.9.0
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.search');

		return parent::getStoreId($id);
	}

	/**
	 * 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.9.0
	 */
	protected function populateState($ordering = 'a.id', $direction = 'desc')
	{
		// Load the filter state.
		$this->setState(
			'filter.search',
			$this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search')
		);

		$this->setState(
			'filter.subject',
			$this->getUserStateFromRequest($this->context . '.filter.subject', 'filter_subject')
		);

		$this->setState(
			'filter.state',
			$this->getUserStateFromRequest($this->context . '.filter.state', 'filter_state')
		);

		// Load the parameters.
		$this->setState('params', JComponentHelper::getParams('com_privacy'));

		// List state information.
		parent::populateState($ordering, $direction);
	}

	/**
	 * Method to invalidate specific consents.
	 *
	 * @param   array  $pks  The ids of the consents to invalidate.
	 *
	 * @return  boolean  True on success.
	 */
	public function invalidate($pks)
	{
		// Sanitize the ids.
		$pks = (array) $pks;
		$pks = ArrayHelper::toInteger($pks);

		try
		{
			$db = $this->getDbo();
			$query = $db->getQuery(true)
				->update($db->quoteName('#__privacy_consents'))
				->set($db->quoteName('state') . ' = -1')
				->where($db->quoteName('id') . ' IN (' . implode(',', $pks) . ')')
				->where($db->quoteName('state') . ' = 1');
			$db->setQuery($query);
			$db->execute();
		}
		catch (JDatabaseExceptionExecuting $e)
		{
			$this->setError($e->getMessage());

			return false;
		}

		return true;
	}

	/**
	 * Method to invalidate a group of specific consents.
	 *
	 * @param   array  $subject  The subject of the consents to invalidate.
	 *
	 * @return  boolean  True on success.
	 */
	public function invalidateAll($subject)
	{
		try
		{
			$db = $this->getDbo();
			$query = $db->getQuery(true)
				->update($db->quoteName('#__privacy_consents'))
				->set($db->quoteName('state') . ' = -1')
				->where($db->quoteName('subject') . ' = ' . $db->quote($subject))
				->where($db->quoteName('state') . ' = 1');
			$db->setQuery($query);
			$db->execute();
		}
		catch (JDatabaseExceptionExecuting $e)
		{
			$this->setError($e->getMessage());

			return false;
		}

		return true;
	}
}
components/com_privacy/models/capabilities.php000060400000006520152453623440015700 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Capabilities model class.
 *
 * @since  3.9.0
 */
class PrivacyModelCapabilities extends JModelLegacy
{
	/**
	 * Retrieve the extension capabilities.
	 *
	 * @return  array
	 *
	 * @since   3.9.0
	 */
	public function getCapabilities()
	{
		$app = JFactory::getApplication();

		/*
		 * Capabilities will be collected in two parts:
		 *
		 * 1) Core capabilities - This will cover the core API, i.e. all library level classes
		 * 2) Extension capabilities - This will be collected by a plugin hook to select plugin groups
		 *
		 * Plugins which report capabilities should return an associative array with a single root level key which is used as the title
		 * for the reporting section and an array with each value being a separate capability. All capability messages should be translated
		 * by the extension when building the array. An example of the structure expected to be returned from plugins can be found in the
		 * $coreCapabilities array below.
		 */

		$coreCapabilities = array(
			JText::_('COM_PRIVACY_HEADING_CORE_CAPABILITIES') => array(
				JText::_('COM_PRIVACY_CORE_CAPABILITY_SESSION_IP_ADDRESS_AND_COOKIE'),
				JText::sprintf('COM_PRIVACY_CORE_CAPABILITY_LOGGING_IP_ADDRESS', $app->get('log_path', JPATH_ADMINISTRATOR . '/logs')),
				JText::_('COM_PRIVACY_CORE_CAPABILITY_COMMUNICATION_WITH_JOOMLA_ORG'),
			)
		);

		/*
		 * We will search for capabilities from the following plugin groups:
		 *
		 * - Authentication: These plugins by design process user information and may have capabilities such as creating cookies
		 * - Captcha: These plugins may communicate information to third party systems
		 * - Installer: These plugins can add additional install capabilities to the Extension Manager, such as the Install from Web service
		 * - Privacy: These plugins are the primary integration point into this component
		 * - User: These plugins are intended to extend the user management system
		 *
		 * This is in addition to plugin groups which are imported before this method is triggered, generally this is the system group.
		 */

		JPluginHelper::importPlugin('authentication');
		JPluginHelper::importPlugin('captcha');
		JPluginHelper::importPlugin('installer');
		JPluginHelper::importPlugin('privacy');
		JPluginHelper::importPlugin('user');

		$pluginResults = $app->triggerEvent('onPrivacyCollectAdminCapabilities');

		// We are going to "cheat" here and include this component's capabilities without using a plugin
		$extensionCapabilities = array(
			JText::_('COM_PRIVACY') => array(
				JText::_('COM_PRIVACY_EXTENSION_CAPABILITY_PERSONAL_INFO'),
			)
		);

		foreach ($pluginResults as $pluginResult)
		{
			$extensionCapabilities += $pluginResult;
		}

		// Sort the extension list alphabetically
		ksort($extensionCapabilities);

		// Always prepend the core capabilities to the array
		return $coreCapabilities + $extensionCapabilities;
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	protected function populateState()
	{
		// Load the parameters.
		$this->setState('params', JComponentHelper::getParams('com_privacy'));
	}
}
components/com_privacy/models/fields/requeststatus.php000060400000001525152453623440017451 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JFormHelper::loadFieldClass('predefinedlist');

/**
 * Form Field to load a list of request statuses
 *
 * @since  3.9.0
 */
class PrivacyFormFieldRequeststatus extends JFormFieldPredefinedList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.9.0
	 */
	public $type = 'RequestStatus';

	/**
	 * Available statuses
	 *
	 * @var    array
	 * @since  3.9.0
	 */
	protected $predefinedOptions = array(
		'-1' => 'COM_PRIVACY_STATUS_INVALID',
		'0'  => 'COM_PRIVACY_STATUS_PENDING',
		'1'  => 'COM_PRIVACY_STATUS_CONFIRMED',
		'2'  => 'COM_PRIVACY_STATUS_COMPLETED',
	);
}
components/com_privacy/models/fields/requesttype.php000060400000001443152453623440017106 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JFormHelper::loadFieldClass('predefinedlist');

/**
 * Form Field to load a list of request types
 *
 * @since  3.9.0
 */
class PrivacyFormFieldRequesttype extends JFormFieldPredefinedList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.9.0
	 */
	public $type = 'RequestType';

	/**
	 * Available types
	 *
	 * @var    array
	 * @since  3.9.0
	 */
	protected $predefinedOptions = array(
		'export' => 'COM_PRIVACY_HEADING_REQUEST_TYPE_TYPE_EXPORT',
		'remove' => 'COM_PRIVACY_HEADING_REQUEST_TYPE_TYPE_REMOVE',
	);
}
components/com_privacy/models/dashboard.php000060400000010100152453623440015163 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Router\Route;

/**
 * Dashboard model class.
 *
 * @since  3.9.0
 */
class PrivacyModelDashboard extends JModelLegacy
{
	/**
	 * Get the information about the published privacy policy
	 *
	 * @return  array  Array containing a status of whether a privacy policy is set and a link to the policy document for editing
	 *
	 * @since   3.9.0
	 */
	public function getPrivacyPolicyInfo()
	{
		$policy = array(
			'published'         => false,
			'articlePublished'  => false,
			'editLink'          => '',
		);

		/*
		 * Prior to 3.9.0 it was common for a plugin such as the User - Profile plugin to define a privacy policy or
		 * terms of service article, therefore we will also import the user plugin group to process this event.
		 */
		JPluginHelper::importPlugin('privacy');
		JPluginHelper::importPlugin('user');

		JFactory::getApplication()->triggerEvent('onPrivacyCheckPrivacyPolicyPublished', array(&$policy));

		return $policy;
	}

	/**
	 * Get a count of the active information requests grouped by type and status
	 *
	 * @return  array  Array containing site privacy requests
	 *
	 * @since   3.9.0
	 */
	public function getRequestCounts()
	{
		$db    = $this->getDbo();
		$query = $db->getQuery(true)
			->select(
				array(
					'COUNT(*) AS count',
					$db->quoteName('status'),
					$db->quoteName('request_type'),
				)
			)
			->from($db->quoteName('#__privacy_requests'))
			->group($db->quoteName('status'))
			->group($db->quoteName('request_type'));

		$db->setQuery($query);

		return $db->loadObjectList();
	}

	/**
	 * Check whether there is a menu item for the request form
	 *
	 * @return  array  Array containing a status of whether a menu is published for the request form and its current link
	 *
	 * @since   3.9.0
	 */
	public function getRequestFormPublished()
	{
		$status = array(
			'exists'    => false,
			'published' => false,
			'link'      => '',
		);

		$db    = $this->getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('id') . ', ' . $db->quoteName('published') . ', ' . $db->quoteName('language'))
			->from($db->quoteName('#__menu'))
			->where($db->quoteName('client_id') . ' = 0')
			->where($db->quoteName('link') . ' = ' . $db->quote('index.php?option=com_privacy&view=request'));
		$db->setQuery($query);

		$menuItem = $db->loadObject();

		// Check if the menu item exists in database
		if ($menuItem)
		{
			$status['exists'] = true;

			// Check if the menu item is published
			if ($menuItem->published == 1)
			{
				$status['published'] = true;
			}

			// Add language to the url if the site is multilingual
			if (JLanguageMultilang::isEnabled() && $menuItem->language && $menuItem->language !== '*')
			{
				$lang = '&lang=' . $menuItem->language;
			}
			else
			{
				$lang = '';
			}
		}

		$linkMode = JFactory::getApplication()->get('force_ssl', 0) == 2 ? Route::TLS_FORCE : Route::TLS_IGNORE;

		if (!$menuItem)
		{
			if (JLanguageMultilang::isEnabled())
			{
				// Find the Itemid of the home menu item tagged to the site default language
				$params = JComponentHelper::getParams('com_languages');
				$defaultSiteLanguage = $params->get('site');

				$db    = $this->getDbo();
				$query = $db->getQuery(true)
					->select($db->quoteName('id'))
					->from($db->quoteName('#__menu'))
					->where($db->quoteName('client_id') . ' = 0')
					->where($db->quoteName('home') . ' = 1')
					->where($db->quoteName('language') . ' = ' . $db->quote($defaultSiteLanguage));
				$db->setQuery($query);

				$homeId = (int) $db->loadResult();
				$itemId = $homeId ? '&Itemid=' . $homeId : '';
			}
			else
			{
				$itemId = '';
			}

			$status['link'] = JRoute::link('site', 'index.php?option=com_privacy&view=request' . $itemId, true, $linkMode);
		}
		else
		{
			$status['link'] = JRoute::link('site', 'index.php?Itemid=' . $menuItem->id . $lang, true, $linkMode);
		}

		return $status;
	}
}
components/com_privacy/controller.php000060400000007453152453623440014155 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Response\JsonResponse;
use Joomla\CMS\Session\Session;

/**
 * Privacy Controller
 *
 * @since  3.9.0
 */
class PrivacyController extends JControllerLegacy
{
	/**
	 * The default view.
	 *
	 * @var    string
	 * @since  3.9.0
	 */
	protected $default_view = 'dashboard';

	/**
	 * 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  $this
	 *
	 * @since   3.9.0
	 */
	public function display($cachable = false, $urlparams = array())
	{
		JLoader::register('PrivacyHelper', JPATH_ADMINISTRATOR . '/components/com_privacy/helpers/privacy.php');

		// Get the document object.
		$document = JFactory::getDocument();

		// Set the default view name and format from the Request.
		$vName   = $this->input->get('view', $this->default_view);
		$vFormat = $document->getType();
		$lName   = $this->input->get('layout', 'default', 'string');

		// Get and render the view.
		if ($view = $this->getView($vName, $vFormat))
		{
			$model = $this->getModel($vName);
			$view->setModel($model, true);

			// For the dashboard view, we need to also push the requests model into the view
			if ($vName === 'dashboard')
			{
				$requestsModel = $this->getModel('Requests');

				$view->setModel($requestsModel, false);
			}

			if ($vName === 'request')
			{
				// For the default layout, we need to also push the action logs model into the view
				if ($lName === 'default')
				{
					JLoader::register('ActionlogsHelper', JPATH_ADMINISTRATOR . '/components/com_actionlogs/helpers/actionlogs.php');
					JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_actionlogs/models', 'ActionlogsModel');

					$logsModel = $this->getModel('Actionlogs', 'ActionlogsModel');

					// Set default ordering for the context
					$logsModel->setState('list.fullordering', 'a.log_date DESC');

					// And push the model into the view
					$view->setModel($logsModel, false);
				}

				// For the edit layout, if mail sending is disabled then redirect back to the list view as the form is unusable in this state
				if ($lName === 'edit' && !JFactory::getConfig()->get('mailonline', 1))
				{
					$this->setRedirect(
						JRoute::_('index.php?option=com_privacy&view=requests', false),
						JText::_('COM_PRIVACY_WARNING_CANNOT_CREATE_REQUEST_WHEN_SENDMAIL_DISABLED'),
						'warning'
					);

					return $this;
				}
			}

			$view->setLayout($lName);

			// Push document object into the view.
			$view->document = $document;

			// Load the submenu.
			PrivacyHelper::addSubmenu($this->input->get('view', $this->default_view));

			$view->display();
		}

		return $this;
	}

	/**
	 * Fetch and report number urgent privacy requests in JSON format, for AJAX requests
	 *
	 * @return void
	 *
	 * @since 3.9.0
	 */
	public function getNumberUrgentRequests()
	{
		$app = Factory::getApplication();

		// Check for a valid token. If invalid, send a 403 with the error message.
		if (!Session::checkToken('get'))
		{
			$app->setHeader('status', 403, true);
			$app->sendHeaders();
			echo new JsonResponse(new \Exception(Text::_('JINVALID_TOKEN'), 403));
			$app->close();
		}

		/** @var PrivacyModelRequests $model */
		$model                = $this->getModel('requests');
		$numberUrgentRequests = $model->getNumberUrgentRequests();

		echo new JResponseJson(array('number_urgent_requests' => $numberUrgentRequests));

		$app->close();
	}
}
components/com_privacy/views/consents/tmpl/default.php000060400000010172152453623440017353 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var PrivacyViewConsent $this */

// Load the tooltip behavior.
JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$user       = JFactory::getUser();
$listOrder  = $this->escape($this->state->get('list.ordering'));
$listDirn   = $this->escape($this->state->get('list.direction'));
$now        = JFactory::getDate();
$stateIcons = array(-1 => 'trash', 0 => 'archive', 1 => 'publish');
$stateMsgs  = array(-1 => JText::_('COM_PRIVACY_CONSENTS_STATE_INVALIDATED'), 0 => JText::_('COM_PRIVACY_CONSENTS_STATE_OBSOLETE'), 1 => JText::_('COM_PRIVACY_CONSENTS_STATE_VALID'));

?>
<form action="<?php echo JRoute::_('index.php?option=com_privacy&view=consents'); ?>" method="post" name="adminForm" id="adminForm">
	<?php if (!empty($this->sidebar)) : ?>
		<div id="j-sidebar-container" class="span2">
			<?php echo $this->sidebar; ?>
		</div>
		<div id="j-main-container" class="span10">
	<?php else : ?>
		<div id="j-main-container">
	<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<div class="clearfix"> </div>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('COM_PRIVACY_MSG_CONSENTS_NO_CONSENTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped" id="consentList">
				<thead>
					<tr>
						<th width="1%" class="center">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_USERNAME', 'u.username', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_PRIVACY_HEADING_USERID', 'a.user_id', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_PRIVACY_HEADING_CONSENTS_SUBJECT', 'a.subject', $listDirn, $listOrder); ?>
						</th>
						<th class="nowrap">
							<?php echo JText::_('COM_PRIVACY_HEADING_CONSENTS_BODY'); ?>
						</th>
						<th width="15%" class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_PRIVACY_HEADING_CONSENTS_CREATED', 'a.created', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="9">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
					<?php foreach ($this->items as $i => $item) : ?>
						<tr class="row<?php echo $i % 2; ?>">
							<td class="center">
								<?php echo JHtml::_('grid.id', $i, $item->id); ?>
							</td>
							<td>
								<span class="icon icon-<?php echo $stateIcons[$item->state]; ?>" title="<?php echo $stateMsgs[$item->state]; ?>"></span>
							</td>
							<td>
								<?php echo $item->username; ?>
							</td>
							<td>
								<?php echo $item->user_id; ?>
							</td>
							<td>
								<?php echo JText::_($item->subject); ?>
							</td>
							<td>
								<?php echo $item->body; ?>
							</td>
							<td class="break-word">
								<span class="hasTooltip" title="<?php echo JHtml::_('date', $item->created, JText::_('DATE_FORMAT_LC6')); ?>">
									<?php echo JHtml::_('date.relative', new JDate($item->created), null, $now); ?>
								</span>
							</td>
							<td class="hidden-phone">
								<?php echo (int) $item->id; ?>
							</td>
						</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif; ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_privacy/views/consents/tmpl/default.xml000060400000000322152453623440017360 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_PRIVACY_CONSENTS_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_PRIVACY_CONSENTS_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_privacy/views/consents/view.html.php000060400000005661152453623440016677 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Consents view class
 *
 * @since  3.9.0
 */
class PrivacyViewConsents extends JViewLegacy
{
	/**
	 * The active search tools filters
	 *
	 * @var    array
	 * @since  3.9.0
	 * @note   Must be public to be accessed from the search tools layout
	 */
	public $activeFilters;

	/**
	 * Form instance containing the search tools filter form
	 *
	 * @var    JForm
	 * @since  3.9.0
	 * @note   Must be public to be accessed from the search tools layout
	 */
	public $filterForm;

	/**
	 * The items to display
	 *
	 * @var    array
	 * @since  3.9.0
	 */
	protected $items;

	/**
	 * The pagination object
	 *
	 * @var    JPagination
	 * @since  3.9.0
	 */
	protected $pagination;

	/**
	 * The HTML markup for the sidebar
	 *
	 * @var    string
	 * @since  3.9.0
	 */
	protected $sidebar;

	/**
	 * The state information
	 *
	 * @var    JObject
	 * @since  3.9.0
	 */
	protected $state;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @see     JViewLegacy::loadTemplate()
	 * @since   3.9.0
	 * @throws  Exception
	 */
	public function display($tpl = null)
	{
		// Initialise variables
		$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);
		}

		$this->addToolbar();

		$this->sidebar = JHtmlSidebar::render();

		return parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	protected function addToolbar()
	{
		JToolbarHelper::title(JText::_('COM_PRIVACY_VIEW_CONSENTS'), 'lock');

		$bar = JToolbar::getInstance('toolbar');

		// Add a button to invalidate a consent
		$bar->appendButton(
			'Confirm',
			'COM_PRIVACY_CONSENTS_TOOLBAR_INVALIDATE_CONFIRM_MSG',
			'trash',
			'COM_PRIVACY_CONSENTS_TOOLBAR_INVALIDATE',
			'consents.invalidate',
			true
		);

		// If the filter is restricted to a specific subject, show the "Invalidate all" button
		if ($this->state->get('filter.subject') != '')
		{
			$bar->appendButton(
				'Confirm',
				'COM_PRIVACY_CONSENTS_TOOLBAR_INVALIDATE_ALL_CONFIRM_MSG',
				'cancel',
				'COM_PRIVACY_CONSENTS_TOOLBAR_INVALIDATE_ALL',
				'consents.invalidateAll',
				false
			);
		}

		JToolbarHelper::preferences('com_privacy');

		JToolbarHelper::help('JHELP_COMPONENTS_PRIVACY_CONSENTS');
	}
}
components/com_privacy/views/capabilities/tmpl/default.php000060400000003346152453623440020155 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var PrivacyViewCapabilities $this */

?>
<?php if (!empty($this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
	<div class="alert alert-info">
		<h4 class="alert-heading"><?php echo JText::_('COM_PRIVACY_MSG_CAPABILITIES_ABOUT_THIS_INFORMATION'); ?></h4>
		<?php echo JText::_('COM_PRIVACY_MSG_CAPABILITIES_INTRODUCTION'); ?>
	</div>
	<?php if (empty($this->capabilities)) : ?>
		<div class="alert alert-no-items">
			<?php echo JText::_('COM_PRIVACY_MSG_CAPABILITIES_NO_CAPABILITIES'); ?>
		</div>
	<?php else : ?>
		<?php $i = 0; ?>
		<?php echo JHtml::_('bootstrap.startAccordion', 'slide-capabilities', array('active' => 'slide-0')); ?>

		<?php foreach ($this->capabilities as $extension => $capabilities) : ?>
			<?php echo JHtml::_('bootstrap.addSlide', 'slide-capabilities', $extension, 'slide-' . $i); ?>
				<?php if (empty($capabilities)) : ?>
					<div class="alert alert-no-items">
						<?php echo JText::_('COM_PRIVACY_MSG_EXTENSION_NO_CAPABILITIES'); ?>
					</div>
				<?php else : ?>
					<ul>
						<?php foreach ($capabilities as $capability) : ?>
							<li><?php echo $capability; ?></li>
						<?php endforeach; ?>
					</ul>
				<?php endif; ?>
			<?php echo JHtml::_('bootstrap.endSlide'); ?>
			<?php $i++; ?>
		<?php endforeach; ?>

		<?php echo JHtml::_('bootstrap.endAccordion'); ?>
	<?php endif; ?>
</div>
components/com_privacy/views/capabilities/view.html.php000060400000003331152453623440017464 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Capabilities view class
 *
 * @since  3.9.0
 */
class PrivacyViewCapabilities extends JViewLegacy
{
	/**
	 * The reported extension capabilities
	 *
	 * @var    array
	 * @since  3.9.0
	 */
	protected $capabilities;

	/**
	 * The HTML markup for the sidebar
	 *
	 * @var    string
	 * @since  3.9.0
	 */
	protected $sidebar;

	/**
	 * The state information
	 *
	 * @var    JObject
	 * @since  3.9.0
	 */
	protected $state;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @see     JViewLegacy::loadTemplate()
	 * @since   3.9.0
	 * @throws  Exception
	 */
	public function display($tpl = null)
	{
		// Initialise variables
		$this->capabilities = $this->get('Capabilities');
		$this->state        = $this->get('State');

		// 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   3.9.0
	 */
	protected function addToolbar()
	{
		JToolbarHelper::title(JText::_('COM_PRIVACY_VIEW_CAPABILITIES'), 'lock');

		JToolbarHelper::preferences('com_privacy');

		JToolbarHelper::help('JHELP_COMPONENTS_PRIVACY_CAPABILITIES');
	}
}
components/com_privacy/views/requests/view.html.php000060400000005617152453623440016717 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Requests view class
 *
 * @since  3.9.0
 */
class PrivacyViewRequests extends JViewLegacy
{
	/**
	 * The active search tools filters
	 *
	 * @var    array
	 * @since  3.9.0
	 * @note   Must be public to be accessed from the search tools layout
	 */
	public $activeFilters;

	/**
	 * Form instance containing the search tools filter form
	 *
	 * @var    JForm
	 * @since  3.9.0
	 * @note   Must be public to be accessed from the search tools layout
	 */
	public $filterForm;

	/**
	 * The items to display
	 *
	 * @var    array
	 * @since  3.9.0
	 */
	protected $items;

	/**
	 * The pagination object
	 *
	 * @var    JPagination
	 * @since  3.9.0
	 */
	protected $pagination;

	/**
	 * Flag indicating the site supports sending email
	 *
	 * @var    boolean
	 * @since  3.9.0
	 */
	protected $sendMailEnabled;

	/**
	 * The HTML markup for the sidebar
	 *
	 * @var    string
	 * @since  3.9.0
	 */
	protected $sidebar;

	/**
	 * The state information
	 *
	 * @var    JObject
	 * @since  3.9.0
	 */
	protected $state;

	/**
	 * The age of urgent requests
	 *
	 * @var    integer
	 * @since  3.9.0
	 */
	protected $urgentRequestAge;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @see     JViewLegacy::loadTemplate()
	 * @since   3.9.0
	 * @throws  Exception
	 */
	public function display($tpl = null)
	{
		// Initialise variables
		$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');
		$this->urgentRequestAge = (int) JComponentHelper::getParams('com_privacy')->get('notify', 14);
		$this->sendMailEnabled  = (bool) JFactory::getConfig()->get('mailonline', 1);

		// 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   3.9.0
	 */
	protected function addToolbar()
	{
		JToolbarHelper::title(JText::_('COM_PRIVACY_VIEW_REQUESTS'), 'lock');

		// Requests can only be created if mail sending is enabled
		if (JFactory::getConfig()->get('mailonline', 1))
		{
			JToolbarHelper::addNew('request.add');
		}

		JToolbarHelper::preferences('com_privacy');
		JToolbarHelper::help('JHELP_COMPONENTS_PRIVACY_REQUESTS');

	}
}
components/com_privacy/views/requests/tmpl/default.xml000060400000000322152453623440017377 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_PRIVACY_REQUESTS_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_PRIVACY_REQUESTS_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_privacy/views/requests/tmpl/default.php000060400000013351152453623440017374 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var PrivacyViewRequests $this */

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_privacy/helpers/html');

// Load the tooltip behavior.
JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$user      = JFactory::getUser();
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$now       = JFactory::getDate();

$urgentRequestDate= clone $now;
$urgentRequestDate->sub(new DateInterval('P' . $this->urgentRequestAge . 'D'));
?>
<form action="<?php echo JRoute::_('index.php?option=com_privacy&view=requests'); ?>" method="post" name="adminForm" id="adminForm">
	<?php if (!empty($this->sidebar)) : ?>
		<div id="j-sidebar-container" class="span2">
			<?php echo $this->sidebar; ?>
		</div>
		<div id="j-main-container" class="span10">
	<?php else : ?>
		<div id="j-main-container">
	<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<div class="clearfix"> </div>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('COM_PRIVACY_MSG_REQUESTS_NO_REQUESTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped" id="requestList">
				<thead>
					<tr>
						<th width="5%" class="nowrap center">
							<?php echo JText::_('COM_PRIVACY_HEADING_ACTIONS'); ?>
						</th>
						<th width="5%" class="nowrap center">
							<?php echo JText::_('JSTATUS'); ?>
						</th>
						<th class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_EMAIL', 'a.email', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_PRIVACY_HEADING_REQUEST_TYPE', 'a.request_type', $listDirn, $listOrder); ?>
						</th>
						<th width="20%" class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_PRIVACY_HEADING_REQUESTED_AT', 'a.requested_at', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="7">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
					<?php foreach ($this->items as $i => $item) : ?>
						<?php
						$itemRequestedAt = new JDate($item->requested_at);
						?>
						<tr class="row<?php echo $i % 2; ?>">
							<td class="center">
								<div class="btn-group">
									<?php if ($item->status == 1 && $item->request_type === 'export') : ?>
										<a class="btn btn-micro hasTooltip" href="<?php echo JRoute::_('index.php?option=com_privacy&task=request.export&format=xml&id=' . (int) $item->id); ?>" title="<?php echo JText::_('COM_PRIVACY_ACTION_EXPORT_DATA'); ?>"><span class="icon-download" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('COM_PRIVACY_ACTION_EXPORT_DATA'); ?></span></a>
										<?php if ($this->sendMailEnabled) : ?>
											<a class="btn btn-micro hasTooltip" href="<?php echo JRoute::_('index.php?option=com_privacy&task=request.emailexport&id=' . (int) $item->id . '&' . JFactory::getSession()->getFormToken() . '=1'); ?>" title="<?php echo JText::_('COM_PRIVACY_ACTION_EMAIL_EXPORT_DATA'); ?>"><span class="icon-mail" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('COM_PRIVACY_ACTION_EMAIL_EXPORT_DATA'); ?></span></a>
										<?php endif; ?>
									<?php endif; ?>
									<?php if ($item->status == 1 && $item->request_type === 'remove') : ?>
										<a class="btn btn-micro hasTooltip" href="<?php echo JRoute::_('index.php?option=com_privacy&task=request.remove&id=' . (int) $item->id . '&' . JFactory::getSession()->getFormToken() . '=1'); ?>" title="<?php echo JText::_('COM_PRIVACY_ACTION_DELETE_DATA'); ?>"><span class="icon-delete" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('COM_PRIVACY_ACTION_DELETE_DATA'); ?></span></a>
									<?php endif; ?>
								</div>
							</td>
							<td class="center">
								<?php echo JHtml::_('PrivacyHtml.helper.statusLabel', $item->status); ?>
							</td>
							<td>
								<?php if ($item->status == 1 && $urgentRequestDate >= $itemRequestedAt) : ?>
									<span class="pull-right label label-important"><?php echo JText::_('COM_PRIVACY_BADGE_URGENT_REQUEST'); ?></span>
								<?php endif; ?>
								<a class="hasTooltip" href="<?php echo JRoute::_('index.php?option=com_privacy&view=request&id=' . (int) $item->id); ?>" title="<?php echo JText::_('COM_PRIVACY_ACTION_VIEW'); ?>">
									<?php echo JStringPunycode::emailToUTF8($this->escape($item->email)); ?>
								</a>
							</td>
							<td class="break-word">
								<?php echo JText::_('COM_PRIVACY_HEADING_REQUEST_TYPE_TYPE_' . $item->request_type); ?>
							</td>
							<td class="break-word">
								<span class="hasTooltip" title="<?php echo JHtml::_('date', $item->requested_at, JText::_('DATE_FORMAT_LC6')); ?>">
									<?php echo JHtml::_('date.relative', $itemRequestedAt, null, $now); ?>
								</span>
							</td>
							<td class="hidden-phone">
								<?php echo (int) $item->id; ?>
							</td>
						</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif; ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_privacy/views/request/tmpl/edit.php000060400000002451152453623440016511 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var PrivacyViewRequest $this */

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');
JHtml::_('formbehavior.chosen', 'select');

$js = <<< JS
Joomla.submitbutton = function(task) {
	if (task === 'request.cancel' || document.formvalidator.isValid(document.getElementById('item-form'))) {
		Joomla.submitform(task, document.getElementById('item-form'));
	}
};
JS;

JFactory::getDocument()->addScriptDeclaration($js);
?>

<form action="<?php echo JRoute::_('index.php?option=com_privacy&view=request&layout=edit&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="item-form" class="form-validate">
	<div class="form-horizontal">
		<div class="row-fluid">
			<div class="span9">
				<fieldset class="adminform">
					<?php echo $this->form->renderField('email'); ?>
					<?php echo $this->form->renderField('status'); ?>
					<?php echo $this->form->renderField('request_type'); ?>
				</fieldset>
			</div>
		</div>

		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_privacy/views/request/tmpl/default.php000060400000005554152453623440017217 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var PrivacyViewRequest $this */

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_privacy/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');

$js = <<< JS
Joomla.submitbutton = function(task) {
	if (task === 'request.cancel' || document.formvalidator.isValid(document.getElementById('item-form'))) {
		Joomla.submitform(task, document.getElementById('item-form'));
	}
};
JS;

JFactory::getDocument()->addScriptDeclaration($js);
?>

<form action="<?php echo JRoute::_('index.php?option=com_privacy&view=request&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="item-form" class="form-validate">
	<div class="row-fluid">
		<div class="span4">
			<h3><?php echo JText::_('COM_PRIVACY_HEADING_REQUEST_INFORMATION'); ?></h3>
			<dl class="dl-horizontal">
				<dt><?php echo JText::_('JGLOBAL_EMAIL'); ?>:</dt>
				<dd><?php echo $this->item->email; ?></dd>

				<dt><?php echo JText::_('JSTATUS'); ?>:</dt>
				<dd><?php echo JHtml::_('PrivacyHtml.helper.statusLabel', $this->item->status); ?></dd>

				<dt><?php echo JText::_('COM_PRIVACY_FIELD_REQUEST_TYPE_LABEL'); ?>:</dt>
				<dd><?php echo JText::_('COM_PRIVACY_HEADING_REQUEST_TYPE_TYPE_' . $this->item->request_type); ?></dd>

				<dt><?php echo JText::_('COM_PRIVACY_FIELD_REQUESTED_AT_LABEL'); ?>:</dt>
				<dd><?php echo JHtml::_('date', $this->item->requested_at, JText::_('DATE_FORMAT_LC6')); ?></dd>
			</dl>
		</div>
		<div class="span8">
			<h3><?php echo JText::_('COM_PRIVACY_HEADING_ACTION_LOG'); ?></h3>
			<?php if (empty($this->actionlogs)) : ?>
				<div class="alert alert-no-items">
					<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
				</div>
			<?php else : ?>
				<table class="table table-striped table-hover">
					<thead>
						<th>
							<?php echo JText::_('COM_ACTIONLOGS_ACTION'); ?>
						</th>
						<th>
							<?php echo JText::_('COM_ACTIONLOGS_DATE'); ?>
						</th>
						<th>
							<?php echo JText::_('COM_ACTIONLOGS_NAME'); ?>
						</th>
					</thead>
					<tbody>
						<?php foreach ($this->actionlogs as $i => $item) : ?>
							<tr class="row<?php echo $i % 2; ?>">
								<td>
									<?php echo ActionlogsHelper::getHumanReadableLogMessage($item); ?>
								</td>
								<td>
									<?php echo JHtml::_('date', $item->log_date, JText::_('DATE_FORMAT_LC6')); ?>
								</td>
								<td>
									<?php echo $item->name; ?>
								</td>
							</tr>
						<?php endforeach; ?>
					</tbody>
				</table>
			<?php endif;?>
		</div>
	</div>

	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>
</form>
components/com_privacy/views/request/view.html.php000060400000010534152453623440016526 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Request view class
 *
 * @since  3.9.0
 */
class PrivacyViewRequest extends JViewLegacy
{
	/**
	 * The action logs for the item
	 *
	 * @var    array
	 * @since  3.9.0
	 */
	protected $actionlogs;

	/**
	 * The form object
	 *
	 * @var    JForm
	 * @since  3.9.0
	 */
	protected $form;

	/**
	 * The item record
	 *
	 * @var    JObject
	 * @since  3.9.0
	 */
	protected $item;

	/**
	 * The state information
	 *
	 * @var    JObject
	 * @since  3.9.0
	 */
	protected $state;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @see     JViewLegacy::loadTemplate()
	 * @since   3.9.0
	 * @throws  Exception
	 */
	public function display($tpl = null)
	{
		// Initialise variables.
		$this->item  = $this->get('Item');
		$this->state = $this->get('State');

		// Variables only required for the default layout
		if ($this->getLayout() === 'default')
		{
			/** @var ActionlogsModelActionlogs $logsModel */
			$logsModel = $this->getModel('actionlogs');

			$this->actionlogs = $logsModel->getLogsForItem('com_privacy.request', $this->item->id);

			// Load the com_actionlogs language strings for use in the layout
			$lang = JFactory::getLanguage();
			$lang->load('com_actionlogs', JPATH_ADMINISTRATOR, null, false, true)
				|| $lang->load('com_actionlogs', JPATH_ADMINISTRATOR . '/components/com_actionlogs', null, false, true);
		}

		// Variables only required for the edit layout
		if ($this->getLayout() === 'edit')
		{
			$this->form = $this->get('Form');
		}

		// 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   3.9.0
	 */
	protected function addToolbar()
	{
		JFactory::getApplication('administrator')->set('hidemainmenu', true);

		// Set the title and toolbar based on the layout
		if ($this->getLayout() === 'edit')
		{
			JToolbarHelper::title(JText::_('COM_PRIVACY_VIEW_REQUEST_ADD_REQUEST'), 'lock');

			JToolbarHelper::apply('request.save');
			JToolbarHelper::cancel('request.cancel');
			JToolbarHelper::help('JHELP_COMPONENTS_PRIVACY_REQUEST_EDIT');
		}
		else
		{
			JToolbarHelper::title(JText::_('COM_PRIVACY_VIEW_REQUEST_SHOW_REQUEST'), 'lock');

			$bar = JToolbar::getInstance('toolbar');

			// Add transition and action buttons based on item status
			switch ($this->item->status)
			{
				case '0':
					$bar->appendButton('Standard', 'cancel-circle', 'COM_PRIVACY_TOOLBAR_INVALIDATE', 'request.invalidate', false);

					break;

				case '1':
					$return = '&return=' . base64_encode('index.php?option=com_privacy&view=request&id=' . (int) $this->item->id);

					$bar->appendButton('Standard', 'apply', 'COM_PRIVACY_TOOLBAR_COMPLETE', 'request.complete', false);
					$bar->appendButton('Standard', 'cancel-circle', 'COM_PRIVACY_TOOLBAR_INVALIDATE', 'request.invalidate', false);

					if ($this->item->request_type === 'export')
					{
						JToolbarHelper::link(
							JRoute::_('index.php?option=com_privacy&task=request.export&format=xml&id=' . (int) $this->item->id . $return),
							'COM_PRIVACY_ACTION_EXPORT_DATA',
							'download'
						);

						if (JFactory::getConfig()->get('mailonline', 1))
						{
							JToolbarHelper::link(
								JRoute::_(
									'index.php?option=com_privacy&task=request.emailexport&id=' . (int) $this->item->id . $return
									. '&' . JSession::getFormToken() . '=1'
								),
								'COM_PRIVACY_ACTION_EMAIL_EXPORT_DATA',
								'mail'
							);
						}
					}

					if ($this->item->request_type === 'remove')
					{
						$bar->appendButton('Standard', 'delete', 'COM_PRIVACY_ACTION_DELETE_DATA', 'request.remove', false);
					}

					break;

				// Item is in a "locked" state and cannot transition
				default:
					break;
			}

			JToolbarHelper::cancel('request.cancel', 'JTOOLBAR_CLOSE');
			JToolbarHelper::help('JHELP_COMPONENTS_PRIVACY_REQUEST');
		}
	}
}
components/com_privacy/views/dashboard/tmpl/default.php000060400000020115152453623440017444 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Language\Text;
use Joomla\CMS\Router\Route;

/** @var PrivacyViewDashboard $this */

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_privacy/helpers/html');

JHtml::_('bootstrap.tooltip');

$totalRequests  = 0;
$activeRequests = 0;

?>
<?php if (!empty($this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
	<div class="row-fluid">
		<div class="span6">
			<div class="well well-small">
				<h3 class="module-title nav-header"><?php echo Text::_('COM_PRIVACY_DASHBOARD_HEADING_TOTAL_REQUEST_COUNT'); ?></h3>
				<div class="row-striped">
					<?php if (count($this->requestCounts)) : ?>
						<div class="row-fluid">
							<div class="span5"><strong><?php echo Text::_('COM_PRIVACY_DASHBOARD_HEADING_REQUEST_TYPE'); ?></strong></div>
							<div class="span5"><strong><?php echo Text::_('COM_PRIVACY_DASHBOARD_HEADING_REQUEST_STATUS'); ?></strong></div>
							<div class="span2"><strong><?php echo Text::_('COM_PRIVACY_DASHBOARD_HEADING_REQUEST_COUNT'); ?></strong></div>
						</div>
						<?php foreach ($this->requestCounts as $row) : ?>
							<div class="row-fluid">
								<div class="span5">
									<a class="hasTooltip" href="<?php echo JRoute::_('index.php?option=com_privacy&view=requests&filter[request_type]=' . $row->request_type . '&filter[status]=' . $row->status); ?>" data-original-title="<?php echo JText::_('COM_PRIVACY_DASHBOARD_VIEW_REQUESTS'); ?>">
										<strong><?php echo Text::_('COM_PRIVACY_HEADING_REQUEST_TYPE_TYPE_' . $row->request_type); ?></strong>
									</a>
								</div>
								<div class="span5"><?php echo JHtml::_('PrivacyHtml.helper.statusLabel', $row->status); ?></div>
								<div class="span2"><span class="badge badge-info"><?php echo $row->count; ?></span></div>
							</div>
							<?php if (in_array($row->status, array(0, 1))) : ?>
								<?php $activeRequests += $row->count; ?>
							<?php endif; ?>
							<?php $totalRequests += $row->count; ?>
						<?php endforeach; ?>
						<div class="row-fluid">
							<div class="span5"><?php echo Text::plural('COM_PRIVACY_DASHBOARD_BADGE_TOTAL_REQUESTS', $totalRequests); ?></div>
							<div class="span7"><?php echo Text::plural('COM_PRIVACY_DASHBOARD_BADGE_ACTIVE_REQUESTS', $activeRequests); ?></div>
						</div>
					<?php else : ?>
						<div class="row-fluid">
							<div class="span12">
								<div class="alert"><?php echo Text::_('COM_PRIVACY_DASHBOARD_NO_REQUESTS'); ?></div>
							</div>
						</div>
					<?php endif; ?>
				</div>
			</div>
		</div>
		<div class="span6">
			<div class="well well-small">
				<h3 class="module-title nav-header"><?php echo Text::_('COM_PRIVACY_DASHBOARD_HEADING_STATUS_CHECK'); ?></h3>
				<div class="row-striped">
					<div class="row-fluid">
						<div class="span3"><strong><?php echo Text::_('COM_PRIVACY_DASHBOARD_HEADING_STATUS'); ?></strong></div>
						<div class="span9"><strong><?php echo Text::_('COM_PRIVACY_DASHBOARD_HEADING_CHECK'); ?></strong></div>
					</div>
					<div class="row-fluid">
						<div class="span3">
							<?php if ($this->privacyPolicyInfo['published'] && $this->privacyPolicyInfo['articlePublished']) : ?>
								<span class="label label-success">
									<span class="icon-checkbox" aria-hidden="true"></span>
									<?php echo Text::_('JPUBLISHED'); ?>
								</span>
							<?php elseif ($this->privacyPolicyInfo['published'] && !$this->privacyPolicyInfo['articlePublished']) : ?>
								<span class="label label-warning">
									<span class="icon-warning" aria-hidden="true"></span>
									<?php echo Text::_('JUNPUBLISHED'); ?>
								</span>
							<?php else : ?>
								<span class="label label-warning">
									<span class="icon-warning" aria-hidden="true"></span>
									<?php echo Text::_('COM_PRIVACY_STATUS_CHECK_NOT_AVAILABLE'); ?>
								</span>
							<?php endif; ?>
						</div>
						<div class="span9">
							<div><?php echo Text::_('COM_PRIVACY_STATUS_CHECK_PRIVACY_POLICY_PUBLISHED'); ?></div>
							<?php if ($this->privacyPolicyInfo['editLink'] !== '') : ?>
								<small><a href="<?php echo $this->privacyPolicyInfo['editLink']; ?>"><?php echo Text::_('COM_PRIVACY_EDIT_PRIVACY_POLICY'); ?></a></small>
							<?php else : ?>
								<?php $link = Route::_('index.php?option=com_plugins&task=plugin.edit&extension_id=' . $this->privacyConsentPluginId); ?>
								<small><a href="<?php echo $link; ?>"><?php echo Text::_('COM_PRIVACY_EDIT_PRIVACY_CONSENT_PLUGIN'); ?></a></small>
							<?php endif; ?>
						</div>
					</div>
					<div class="row-fluid">
						<div class="span3">
							<?php if ($this->requestFormPublished['published'] && $this->requestFormPublished['exists']) : ?>
								<span class="label label-success">
									<span class="icon-checkbox" aria-hidden="true"></span>
									<?php echo Text::_('JPUBLISHED'); ?>
								</span>
							<?php elseif (!$this->requestFormPublished['published'] && $this->requestFormPublished['exists']) : ?>
								<span class="label label-warning">
									<span class="icon-warning" aria-hidden="true"></span>
									<?php echo Text::_('JUNPUBLISHED'); ?>
								</span>
							<?php else : ?>
								<span class="label label-warning">
									<span class="icon-warning" aria-hidden="true"></span>
									<?php echo Text::_('COM_PRIVACY_STATUS_CHECK_NOT_AVAILABLE'); ?>
								</span>
							<?php endif; ?>
						</div>
						<div class="span9">
							<div><?php echo Text::_('COM_PRIVACY_STATUS_CHECK_REQUEST_FORM_MENU_ITEM_PUBLISHED'); ?></div>
							<?php if ($this->requestFormPublished['link'] !== '') : ?>
								<small><a href="<?php echo $this->requestFormPublished['link']; ?>"><?php echo $this->requestFormPublished['link']; ?></a></small>
							<?php endif; ?>
						</div>
					</div>
					<div class="row-fluid">
						<div class="span3">
							<?php if ($this->numberOfUrgentRequests === 0) : ?>
								<span class="label label-success">
									<span class="icon-checkbox" aria-hidden="true"></span>
									<?php echo Text::_('JNONE'); ?>
								</span>
							<?php else : ?>
								<span class="label label-important">
									<span class="icon-warning" aria-hidden="true"></span>
									<?php echo Text::_('WARNING'); ?>
								</span>
							<?php endif; ?>
						</div>
						<div class="span9">
							<div><?php echo Text::_('COM_PRIVACY_STATUS_CHECK_OUTSTANDING_URGENT_REQUESTS'); ?></div>
							<small><?php echo Text::plural('COM_PRIVACY_STATUS_CHECK_OUTSTANDING_URGENT_REQUESTS_DESCRIPTION', $this->urgentRequestDays); ?></small>
							<?php if ($this->numberOfUrgentRequests > 0) : ?>
								<small><a href="<?php echo Route::_('index.php?option=com_privacy&view=requests&filter[status]=1&list[fullordering]=a.requested_at ASC'); ?>"><?php echo JText::_('COM_PRIVACY_SHOW_URGENT_REQUESTS'); ?></a></small>
							<?php endif; ?>
						</div>
					</div>
					<div class="row-fluid">
						<div class="span3">
							<?php if ($this->sendMailEnabled) : ?>
								<span class="label label-success">
									<span class="icon-checkbox" aria-hidden="true"></span>
									<?php echo Text::_('JENABLED'); ?>
								</span>
							<?php else : ?>
								<span class="label label-important">
									<span class="icon-warning" aria-hidden="true"></span>
									<?php echo Text::_('JDISABLED'); ?>
								</span>
							<?php endif; ?>
						</div>
						<div class="span9">
							<?php if (!$this->sendMailEnabled) : ?>
								<div><?php echo Text::_('COM_PRIVACY_STATUS_CHECK_SENDMAIL_DISABLED'); ?></div>
								<small><?php echo Text::_('COM_PRIVACY_STATUS_CHECK_SENDMAIL_DISABLED_DESCRIPTION'); ?></small>
							<?php else : ?>
								<div><?php echo Text::_('COM_PRIVACY_STATUS_CHECK_SENDMAIL_ENABLED'); ?></div>
							<?php endif; ?>
						</div>
					</div>
				</div>
			</div>
		</div>
	</div>
</div>
components/com_privacy/views/dashboard/tmpl/default.xml000060400000000324152453623440017455 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_PRIVACY_DASHBOARD_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_PRIVACY_DASHBOARD_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_privacy/views/dashboard/view.html.php000060400000005656152453623440016776 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;

/**
 * Dashboard view class
 *
 * @since  3.9.0
 */
class PrivacyViewDashboard extends JViewLegacy
{
	/**
	 * Number of urgent requests based on the component configuration
	 *
	 * @var    integer
	 * @since  3.9.0
	 */
	protected $numberOfUrgentRequests;

	/**
	 * Information about whether a privacy policy is published
	 *
	 * @var    array
	 * @since  3.9.0
	 */
	protected $privacyPolicyInfo;

	/**
	 * The request counts
	 *
	 * @var    array
	 * @since  3.9.0
	 */
	protected $requestCounts;

	/**
	 * Information about whether a menu item for the request form is published
	 *
	 * @var    array
	 * @since  3.9.0
	 */
	protected $requestFormPublished;

	/**
	 * Flag indicating the site supports sending email
	 *
	 * @var    boolean
	 * @since  3.9.0
	 */
	protected $sendMailEnabled;

	/**
	 * The HTML markup for the sidebar
	 *
	 * @var    string
	 * @since  3.9.0
	 */
	protected $sidebar;

	/**
	 * Id of the system privacy consent plugin
	 *
	 * @var    integer
	 * @since  3.9.2
	 */
	protected $privacyConsentPluginId;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @see     JViewLegacy::loadTemplate()
	 * @since   3.9.0
	 * @throws  Exception
	 */
	public function display($tpl = null)
	{
		// Initialise variables
		$this->privacyConsentPluginId = PrivacyHelper::getPrivacyConsentPluginId();
		$this->privacyPolicyInfo      = $this->get('PrivacyPolicyInfo');
		$this->requestCounts          = $this->get('RequestCounts');
		$this->requestFormPublished   = $this->get('RequestFormPublished');
		$this->sendMailEnabled        = (bool) Factory::getConfig()->get('mailonline', 1);

		/** @var PrivacyModelRequests $requestsModel */
		$requestsModel = $this->getModel('requests');

		$this->numberOfUrgentRequests = $requestsModel->getNumberUrgentRequests();

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		$this->urgentRequestDays = (int) ComponentHelper::getParams('com_privacy')->get('notify', 14);

		$this->addToolbar();

		$this->sidebar = JHtmlSidebar::render();

		return parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   3.9.0
	 */
	protected function addToolbar()
	{
		JToolbarHelper::title(Text::_('COM_PRIVACY_VIEW_DASHBOARD'), 'lock');

		JToolbarHelper::preferences('com_privacy');

		JToolbarHelper::help('JHELP_COMPONENTS_PRIVACY_DASHBOARD');
	}
}
components/com_privacy/views/export/view.xml.php000060400000002640152453623440016212 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_privacy
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('PrivacyHelper', JPATH_ADMINISTRATOR . '/components/com_privacy/helpers/privacy.php');

/**
 * Export view class
 *
 * @since  3.9.0
 *
 * @property-read   \Joomla\CMS\Document\XmlDocument  $document
 */
class PrivacyViewExport extends JViewLegacy
{
	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @see     JViewLegacy::loadTemplate()
	 * @since   3.9.0
	 * @throws  Exception
	 */
	public function display($tpl = null)
	{
		/** @var PrivacyModelExport $model */
		$model = $this->getModel();

		$exportData = $model->collectDataForExportRequest();

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		$requestId = $model->getState($model->getName() . '.request_id');

		// This document should always be downloaded
		$this->document->setDownload(true);
		$this->document->setName('export-request-' . $requestId);

		echo PrivacyHelper::renderDataAsXml($exportData);
	}
}
components/com_admin/helpers/html/system.php000060400000001130152453623440015321 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Utility class working with system
 *
 * @since  1.6
 */
abstract class JHtmlSystem
{
	/**
	 * Method to generate a string message for a value
	 *
	 * @param   string  $val  a php ini value
	 *
	 * @return  string html code
	 */
	public static function server($val)
	{
		return !empty($val) ? $val : JText::_('COM_ADMIN_NA');
	}
}
components/com_admin/helpers/html/directory.php000060400000002355152453623440016013 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Utility class working with directory
 *
 * @since  1.6
 */
abstract class JHtmlDirectory
{
	/**
	 * Method to generate a (un)writable message for directory
	 *
	 * @param   boolean  $writable  is the directory writable?
	 *
	 * @return  string	html code
	 */
	public static function writable($writable)
	{
		if ($writable)
		{
			return '<span class="badge badge-success">' . JText::_('COM_ADMIN_WRITABLE') . '</span>';
		}

		return '<span class="badge badge-important">' . JText::_('COM_ADMIN_UNWRITABLE') . '</span>';
	}

	/**
	 * 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 . ' <strong>' . JText::_($message) . '</strong>';
	}
}
components/com_admin/helpers/html/phpsetting.php000060400000003002152453623440016162 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Utility class working with phpsetting
 *
 * @since  1.6
 */
abstract class JHtmlPhpSetting
{
	/**
	 * Method to generate a boolean message for a value
	 *
	 * @param   boolean  $val  is the value set?
	 *
	 * @return  string html code
	 */
	public static function boolean($val)
	{
		return JText::_($val ? 'JON' : 'JOFF');
	}

	/**
	 * Method to generate a boolean message for a value
	 *
	 * @param   boolean  $val  is the value set?
	 *
	 * @return  string html code
	 */
	public static function set($val)
	{
		return JText::_($val ? 'JYES' : 'JNO');
	}

	/**
	 * Method to generate a string message for a value
	 *
	 * @param   string  $val  a php ini value
	 *
	 * @return  string html code
	 */
	public static function string($val)
	{
		return !empty($val) ? $val : JText::_('JNONE');
	}

	/**
	 * Method to generate an integer from a value
	 *
	 * @param   string  $val  a php ini value
	 *
	 * @return  string html code
	 *
	 * @deprecated  4.0  Use intval() or casting instead.
	 */
	public static function integer($val)
	{
		try
		{
			JLog::add(sprintf('%s() is deprecated. Use intval() or casting instead.', __METHOD__), JLog::WARNING, 'deprecated');
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		return (int) $val;
	}
}
components/com_admin/models/profile.php000060400000016576152453623440014336 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// 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');

/**
 * User model.
 *
 * @since  1.6
 */
class AdminModelProfile extends UsersModelUser
{
	/**
	 * Method to get the record form.
	 *
	 * @param   array    $data      An optional array of data for the form to interrogate.
	 * @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_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']);
		}

		// Handle the two factor authentication setup
		if (isset($data['twofactor']['method']))
		{
			$twoFactorMethod = $data['twofactor']['method'];

			// Get the current One Time Password (two factor auth) configuration
			$otpConfig = $this->getOtpConfig($user->id);

			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.
				$this->setOtpConfig($user->id, $otpConfig);

				// Generate one time emergency passwords if required (depleted or not set)
				if (empty($otpConfig->otep))
				{
					$this->generateOteps($user->id);
				}
			}
			else
			{
				$otpConfig->method = 'none';
				$otpConfig->config = array();
				$this->setOtpConfig($user->id, $otpConfig);
			}

			// Unset the raw data
			unset($data['twofactor']);

			// Reload the user record with the updated OTP configuration
			$user->load($user->id);
		}

		// 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;
	}

	/**
	 * Gets the configuration forms for all two-factor authentication methods
	 * in an array.
	 *
	 * @param   integer  $userId  The user ID to load the forms for (optional)
	 *
	 * @return  array
	 *
	 * @since   __DEPOLOY_VERSION__
	 */
	public function getTwofactorform($userId = null)
	{
		$userId = (!empty($userId)) ? $userId : (int) JFactory::getUser()->id;
		$model  = new UsersModelUser;

		return $model->getTwofactorform($userId);
	}

	/**
	 * Returns the one time password (OTP) – a.k.a. two factor authentication –
	 * configuration for a particular user.
	 *
	 * @param   integer  $userId  The numeric ID of the user
	 *
	 * @return  stdClass  An object holding the OTP configuration for this user
	 *
	 * @since   __DEPOLOY_VERSION__
	 */
	public function getOtpConfig($userId = null)
	{
		$userId = (!empty($userId)) ? $userId : (int) JFactory::getUser()->id;
		$model  = new UsersModelUser;

		return $model->getOtpConfig($userId);
	}

	/**
	 * Sets the one time password (OTP) – a.k.a. two factor authentication –
	 * configuration for a particular user. The $otpConfig object is the same as
	 * the one returned by the getOtpConfig method.
	 *
	 * @param   integer   $userId     The numeric ID of the user
	 * @param   stdClass  $otpConfig  The OTP configuration object
	 *
	 * @return  boolean  True on success
	 *
	 * @since   __DEPOLOY_VERSION__
	 */
	public function setOtpConfig($userId, $otpConfig)
	{
		$userId = (!empty($userId)) ? $userId : (int) JFactory::getUser()->id;
		$model  = new UsersModelUser;

		return $model->setOtpConfig($userId, $otpConfig);
	}

	/**
	 * Generates a new set of One Time Emergency Passwords (OTEPs) for a given user.
	 *
	 * @param   integer  $userId  The user ID
	 * @param   integer  $count   How many OTEPs to generate? Default: 10
	 *
	 * @return  array  The generated OTEPs
	 *
	 * @since   __DEPOLOY_VERSION__
	 */
	public function generateOteps($userId, $count = 10)
	{
		$userId = (!empty($userId)) ? $userId : (int) JFactory::getUser()->id;
		$model  = new UsersModelUser;

		return $model->generateOteps($userId, $count);
	}
}
components/com_admin/models/sysinfo.php000060400000042047152453623440014360 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

/**
 * Model for the display of system information.
 *
 * @since  1.6
 */
class AdminModelSysInfo extends JModelLegacy
{
	/**
	 * Some PHP settings
	 *
	 * @var    array
	 * @since  1.6
	 */
	protected $php_settings = array();

	/**
	 * Config values
	 *
	 * @var    array
	 * @since  1.6
	 */
	protected $config = array();

	/**
	 * Some system values
	 *
	 * @var    array
	 * @since  1.6
	 */
	protected $info = array();

	/**
	 * PHP info
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $php_info = null;

	/**
	 * Array containing the phpinfo() data.
	 *
	 * @var    array
	 *
	 * @since  3.5
	 */
	protected $phpInfoArray;

	/**
	 * Private/critical data that we don't want to share
	 *
	 * @var    array
	 *
	 * @since  3.5
	 */
	protected $privateSettings = array(
		'phpInfoArray' => 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 that may contain private information
	 * @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', 'redis_server_auth', 'session_redis_server_auth',
			'proxy_user', 'proxy_pass', 'secret'
		);

		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('#<body[^>]*>(.*)</body>#siU', $phpInfo, $output);
		$output = preg_replace('#<table[^>]*>#', '<table class="table table-striped adminlist">', $output[1][0]);
		$output = preg_replace('#(\w),(\w)#', '\1, \2', $output);
		$output = preg_replace('#<hr />#', '', $output);
		$output = str_replace('<div class="center">', '', $output);
		$output = preg_replace('#<tr class="h">(.*)<\/tr>#', '<thead><tr class="h">$1</tr></thead><tbody>', $output);
		$output = str_replace('</table>', '</tbody></table>', $output);
		$output = str_replace('</div>', '', $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/components/com_joomlaupdate', JPATH_ADMINISTRATOR . '/components/com_joomlaupdate');
		$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->isDot() || !$folder->isDir())
			{
				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->isDot() || !$folder->isDir())
			{
				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->isDot() || !$folder->isDir())
			{
				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->isDot() || !$folder->isDir())
			{
				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->isDot() || !$folder->isDir())
			{
				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, '<h2><th><td>');
		$html = preg_replace('/<th[^>]*>([^<]+)<\/th>/', '<info>\1</info>', $html);
		$html = preg_replace('/<td[^>]*>([^<]+)<\/td>/', '<info>\1</info>', $html);
		$t = preg_split('/(<h2[^>]*>[^<]+<\/h2>)/', $html, -1, PREG_SPLIT_DELIM_CAPTURE);
		$r = array();
		$count = count($t);
		$p1 = '<info>([^<]+)<\/info>';
		$p2 = '/' . $p1 . '\s*' . $p1 . '\s*' . $p1 . '/';
		$p3 = '/' . $p1 . '\s*' . $p1 . '/';

		for ($i = 1; $i < $count; $i++)
		{
			if (preg_match('/<h2[^>]*>([^<]+)<\/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;
	}
}
components/com_admin/models/help.php000060400000007656152453623440013625 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\String\StringHelper;

/**
 * Admin Component Help Model
 *
 * @since  1.6
 */
class AdminModelHelp extends JModelLegacy
{
	/**
	 * The search string
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $help_search = null;

	/**
	 * The page to be viewed
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $page = null;

	/**
	 * The ISO language tag
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $lang_tag = null;

	/**
	 * Table of contents
	 *
	 * @var    array
	 * @since  1.6
	 */
	protected $toc = null;

	/**
	 * URL for the latest version check
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $latest_version_check = null;

	/**
	 * Method to get the help search string
	 *
	 * @return  string  Help search string
	 *
	 * @since   1.6
	 */
	public function &getHelpSearch()
	{
		if (is_null($this->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('#<title>(.*?)</title>#', $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}&amp;lang={langcode}';
			$this->latest_version_check = JHelp::createUrl('JVERSION', false, $override);
		}

		return $this->latest_version_check;
	}
}
components/com_admin/models/forms/profile.xml000060400000006756152453623440015474 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset name="user_details">
		<field
			name="name"
			type="text"
			label="COM_ADMIN_USER_HEADING_NAME"
			description="COM_ADMIN_USER_FIELD_NAME_DESC"
			required="true"
			size="30"
		/>

		<field
			name="username"
			type="text"
			label="COM_ADMIN_USER_FIELD_USERNAME_LABEL"
			description="COM_ADMIN_USER_FIELD_USERNAME_DESC"
			required="true"
			size="30"
		/>

		<field
			name="password2"
			type="password"
			label="JGLOBAL_PASSWORD"
			description="COM_ADMIN_USER_FIELD_PASSWORD_DESC"
			autocomplete="off"
			class="validate-password"
			field="password"
			filter="raw"
			message="COM_ADMIN_USER_FIELD_PASSWORD1_MESSAGE"
			size="30"
			validate="equals"
		/>

		<field
			name="password"
			type="password"
			label="COM_ADMIN_USER_FIELD_PASSWORD2_LABEL"
			description="COM_ADMIN_USER_FIELD_PASSWORD2_DESC"
			autocomplete="off"
			class="validate-password"
			filter="raw"
			size="30"
			validate="password"
		/>

		<field
			name="email"
			type="email"
			label="JGLOBAL_EMAIL"
			description="COM_ADMIN_USER_FIELD_EMAIL_DESC"
			class="validate-email"
			required="true"
			size="30"
			validate="email"
			validDomains="com_users.domains"
		/>

		<field
			name="registerDate"
			type="calendar"
			label="COM_ADMIN_USER_FIELD_REGISTERDATE_LABEL"
			description="COM_ADMIN_USER_FIELD_REGISTERDATE_DESC"
			class="readonly"
			readonly="true"
			translateformat="true"
			showtime="true"
			size="22"
			filter="user_utc"
		/>

		<field
			name="lastvisitDate"
			type="calendar"
			label="COM_ADMIN_USER_FIELD_LASTVISIT_LABEL"
			description="COM_ADMIN_USER_FIELD_LASTVISIT_DESC"
			class="readonly"
			readonly="true"
			translateformat="true"
			showtime="true"
			size="22"
			filter="user_utc"
		/>

		<field
			name="id"
			type="number"
			label="JGLOBAL_FIELD_ID_LABEL"
			description="JGLOBAL_FIELD_ID_DESC"
			class="readonly"
			default="0"
			readonly="true"
			filter="unset"
		/>

		<!-- Used to get the two factor authentication configuration -->
		<field
			name="twofactor"
			type="hidden"
		/>
	</fieldset>

	<fields name="params">

		<!--  Basic user account settings. -->
		<fieldset name="settings" label="COM_ADMIN_USER_SETTINGS_FIELDSET_LABEL">

			<field
				name="admin_style"
				type="templatestyle"
				label="COM_ADMIN_USER_FIELD_BACKEND_TEMPLATE_LABEL"
				description="COM_ADMIN_USER_FIELD_BACKEND_TEMPLATE_DESC"
				client="administrator"
				filter="uint"
				>
				<option value="">JOPTION_USE_DEFAULT</option>
			</field>

			<field
				name="admin_language"
				type="language"
				label="COM_ADMIN_USER_FIELD_BACKEND_LANGUAGE_LABEL"
				description="COM_ADMIN_USER_FIELD_BACKEND_LANGUAGE_DESC"
				client="administrator"
				>
				<option value="">JOPTION_USE_DEFAULT</option>
			</field>

			<field
				name="language"
				type="language"
				label="COM_ADMIN_USER_FIELD_FRONTEND_LANGUAGE_LABEL"
				description="COM_ADMIN_USER_FIELD_FRONTEND_LANGUAGE_DESC"
				client="site"
				>
				<option value="">JOPTION_USE_DEFAULT</option>
			</field>

			<field
				name="editor"
				type="plugins"
				label="COM_ADMIN_USER_FIELD_EDITOR_LABEL"
				description="COM_ADMIN_USER_FIELD_EDITOR_DESC"
				folder="editors"
				useaccess="true"
				>
				<option value="">JOPTION_USE_DEFAULT</option>
			</field>

			<field
				name="timezone"
				type="timezone"
				label="COM_ADMIN_USER_FIELD_TIMEZONE_LABEL"
				description="COM_ADMIN_USER_FIELD_TIMEZONE_DESC"
				>
				<option value="">JOPTION_USE_DEFAULT</option>
			</field>
		</fieldset>
	</fields>
</form>
components/com_admin/script.php000060400000361220152453623440012704 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Script file of Joomla CMS
 *
 * @since  1.6.4
 */
class JoomlaInstallerScript
{
	/**
	 * The Joomla Version we are updating from
	 *
	 * @var    string
	 * @since  3.7
	 */
	protected $fromVersion = null;

	/**
	 * Function to act prior to installation process begins
	 *
	 * @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 preflight($action, $installer)
	{
		if ($action === 'update')
		{
			// Get the version we are updating from
			if (!empty($installer->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()) . '<br />';

			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()) . '<br />';

			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()) . '<br />';

			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()) . '<br />';

				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()) . '<br />';

			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()) . '<br />';

			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) . '<br />';
			}
		}
	}

	/**
	 * 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/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/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/mod_languages/images/km_kr.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/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_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
			 */
			'/administrator/components/com_users/controllers/profile.json.php',
			'/administrator/includes/toolbar.php',
			'/components/com_users/controllers/profile_base_json.php',
			'/components/com_users/controllers/profile.json.php',
			'/libraries/joomla/filesystem/file.php',
			'/libraries/joomla/filesystem/folder.php',
			'/libraries/joomla/filesystem/helper.php',
			'/libraries/joomla/filesystem/meta/language/en-GB/en-GB.lib_joomla_filesystem_patcher.ini',
			'/libraries/joomla/filesystem/patcher.php',
			'/libraries/joomla/filesystem/path.php',
			'/libraries/joomla/filesystem/stream.php',
			'/libraries/joomla/filesystem/streams/string.php',
			'/libraries/joomla/filesystem/support/stringcontroller.php',
			'/libraries/joomla/filesystem/wrapper/file.php',
			'/libraries/joomla/filesystem/wrapper/folder.php',
			'/libraries/joomla/filesystem/wrapper/path.php',
			'/libraries/src/Mail/language/phpmailer.lang-joomla.php',
			'/plugins/captcha/recaptcha/recaptchalib.php',

			/*
			 * Joomla! 3.9.0 thru 3.10.0
			 */
			'/SECURITY.md',
			'/administrator/components/com_users/controllers/profile.json.php',
			'/components/com_users/controllers/profile.json.php',
			'/components/com_users/controllers/profile_base_json.php',
			'/tests/unit/suites/libraries/cms/form/field/JFormFieldHelpsiteTest.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',

			/*
			 * Joomla! 3.9.7
			 */
			'/administrator/components/com_joomlaupdate/access.xml',

			// Joomla! 3.9.13
			'/libraries/vendor/phpmailer/phpmailer/composer.lock',

			// Joomla! 3.9.17
			'/administrator/components/com_templates/controllers/template.php.orig',

			// Joomla! 3.9.21
			'/.github/SECURITY.md',

			// Joomla! 3.9.23
			'/.drone.jsonnet',

			// Joomla! added by the 3.9.23-rc1
			'/libraries/vendor/bin/lessify',
			'/libraries/vendor/bin/lessify.bat',
			'/libraries/vendor/bin/plessc',
			'/libraries/vendor/bin/plessc.bat',
			'/libraries/vendor/joomla/archive/.drone.jsonnet',
			'/libraries/vendor/joomla/archive/.drone.yml',
			'/libraries/vendor/joomla/string/.drone.jsonnet',
			'/libraries/vendor/joomla/string/.drone.yml',
			'/libraries/vendor/leafo/lessphp/.drone.yml',
			'/libraries/vendor/leafo/lessphp/phpunit.xml.dist',
			'/libraries/vendor/leafo/lessphp/ruleset.xml',

			// Joomla 3.10.0
			'/libraries/joomla/base/adapter.php',
			'/libraries/joomla/base/adapterinstance.php',

			// Joomla 3.10.7-rc1 to 3.10.7 stable
			'/administrator/components/com_admin/sql/updates/postgresql/3.10.7-2022-02-20.sql.sql',
			'/administrator/components/com_admin/sql/updates/sqlazure/3.10.7-2022-02-20.sql.sql',
		);

		// 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_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',
			// Joomla! 3.9.0
			'/libraries/joomla/filesystem/meta/language/en-GB',
			'/libraries/joomla/filesystem/meta/language',
			'/libraries/joomla/filesystem/meta',
			'/libraries/joomla/filesystem/streams',
			'/libraries/joomla/filesystem/support',
			'/libraries/joomla/filesystem/wrapper',
			'/libraries/joomla/filesystem',
			// Joomla 3.10.0
			'/libraries/joomla/base',
			// Joomla 3.10.8
			'/administrator/components/com_users/models/fields/primaryauthproviders.php',
		);

		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) . '<br />';
			}
		}

		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) . '<br />';
			}
		}

		/*
		 * 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');
		}

		$this->fixFilenameCasing();
	}

	/**
	 * 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',
			'com_privacy',
			'com_actionlogs',
		);

		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()) . '<br />';

			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())
		{
			$convertedStep1 = 2;
			$convertedStep2 = 4;

			// The first step has to be repeated if it has not been run (converted = 4 in database)
			$convertedRequired = 5;
		}
		else
		{
			$convertedStep1 = 1;
			$convertedStep2 = 3;

			// All done after step 2
			$convertedRequired = 3;
		}

		// 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 final status
		if ($convertedDB == $convertedRequired)
		{
			return;
		}

		$converted = $convertedDB;
		$hasErrors = false;

		// Steps 1 and 2: Convert core tables if necessary and not to be done at later steps
		if ($convertedDB < $convertedStep1 || ($convertedRequired == 5 && ($convertedDB == 3 || $convertedDB == 4)))
		{
			// 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)
						{
							$hasErrors = true;

							// Still render the error message from the Exception object
							JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
						}
					}
				}
			}

			if (!$hasErrors)
			{
				$converted = $convertedStep1;
			}
		}

		// Step 3: Convert action logs and privacy suite tables if necessary and conversion hasn't failed before
		if (!$hasErrors && $convertedDB < $convertedStep2)
		{
			$fileName3 = JPATH_ROOT . '/administrator/components/com_admin/sql/others/mysql/utf8mb4-conversion-03.sql';

			if (is_file($fileName3))
			{
				$fileContents3 = @file_get_contents($fileName3);
				$queries3      = $db->splitSql($fileContents3);

				if (!empty($queries3))
				{
					foreach ($queries3 as $query3)
					{
						try
						{
							$db->setQuery($db->convertUtf8mb4QueryToUtf8($query3))->execute();
						}
						catch (Exception $e)
						{
							$hasErrors = true;

							// Still render the error message from the Exception object
							JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
						}
					}
				}
			}
		}

		if (!$hasErrors)
		{
			$converted = $convertedRequired;
		}

		if ($doDbFixMsg && $hasErrors)
		{
			// 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 conversion status has changed.
		if ($converted != $convertedDB)
		{
			$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();
	}

	/**
	 * Renames or removes incorrectly cased files.
	 *
	 * @return  void
	 *
	 * @since   3.9.25
	 */
	protected function fixFilenameCasing()
	{
		$files = array(
			'/libraries/src/Filesystem/Support/Stringcontroller.php' => '/libraries/src/Filesystem/Support/StringController.php',
			'/libraries/vendor/paragonie/sodium_compat/src/Core/Xsalsa20.php' => '/libraries/vendor/paragonie/sodium_compat/src/Core/XSalsa20.php',
			'/media/mod_languages/images/si_LK.gif' => '/media/mod_languages/images/si_lk.gif',
		);

		foreach ($files as $old => $expected)
		{
			$oldRealpath = realpath(JPATH_ROOT . $old);

			// On Unix without incorrectly cased file.
			if ($oldRealpath === false)
			{
				continue;
			}

			$oldBasename      = basename($oldRealpath);
			$newRealpath      = realpath(JPATH_ROOT . $expected);
			$newBasename      = basename($newRealpath);
			$expectedBasename = basename($expected);

			// On Windows or Unix with only the incorrectly cased file.
			if ($newBasename !== $expectedBasename)
			{
				// Rename the file.
				rename(JPATH_ROOT . $old, JPATH_ROOT . $old . '.tmp');
				rename(JPATH_ROOT . $old . '.tmp', JPATH_ROOT . $expected);

				continue;
			}

			// There might still be an incorrectly cased file on other OS than Windows.
			if ($oldBasename === basename($old))
			{
				// Check if case-insensitive file system, eg on OSX.
				if (fileinode($oldRealpath) === fileinode($newRealpath))
				{
					// Check deeper because even realpath or glob might not return the actual case.
					if (!in_array($expectedBasename, scandir(dirname($newRealpath))))
					{
						// Rename the file.
						rename(JPATH_ROOT . $old, JPATH_ROOT . $old . '.tmp');
						rename(JPATH_ROOT . $old . '.tmp', JPATH_ROOT . $expected);
					}
				}
				else
				{
					// On Unix with both files: Delete the incorrectly cased file.
					unlink(JPATH_ROOT . $old);
				}
			}
		}
	}
}
components/com_admin/controllers/profile.php000060400000003644152453623440015411 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * User profile controller class.
 *
 * @since  1.6
 */
class AdminControllerProfile extends JControllerForm
{
	/**
	 * Method to check if you can edit a record.
	 *
	 * Extended classes can override this if necessary.
	 *
	 * @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')
	{
		return isset($data['id']) && $data['id'] == JFactory::getUser()->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;
	}
}
components/com_admin/sql/updates/mysql/3.6.0-2016-06-05.sql000060400000000172152453623440016514 0ustar00--
-- Add ACL check for to #__languages
--

ALTER TABLE `#__languages` ADD COLUMN `asset_id` INT NOT NULL AFTER `lang_id`;components/com_admin/sql/updates/mysql/3.9.27-2021-04-20.sql000060400000000510152453623440016573 0ustar00INSERT INTO `#__postinstall_messages` (`extension_id`, `title_key`, `description_key`, `language_extension`, `language_client_id`, `type`, `version_introduced`, `enabled`)
VALUES
(700, 'COM_ADMIN_POSTINSTALL_MSG_FLOC_BLOCKER_TITLE', 'COM_ADMIN_POSTINSTALL_MSG_FLOC_BLOCKER_DESCRIPTION', 'com_admin', 1, 'message', '3.9.27', 1);
components/com_admin/sql/updates/mysql/2.5.0-2011-12-22.sql000060400000004675152453623440016515 0ustar00REPLACE 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);
components/com_admin/sql/updates/mysql/3.8.8-2018-05-18.sql000060400000001021152453623440016525 0ustar00INSERT 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);
components/com_admin/sql/updates/mysql/3.7.0-2016-08-06.sql000060400000000610152453623440016515 0ustar00INSERT 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);
components/com_admin/sql/updates/mysql/3.9.16-2020-03-04.sql000060400000000162152453623440016574 0ustar00ALTER TABLE `#__users` DROP INDEX `username`;
ALTER TABLE `#__users` ADD UNIQUE INDEX `idx_username` (`username`);components/com_admin/sql/updates/mysql/3.5.0-2015-10-26.sql000060400000000167152453623440016514 0ustar00ALTER TABLE `#__contentitem_tag_map` DROP INDEX `idx_tag`;
ALTER TABLE `#__contentitem_tag_map` DROP INDEX `idx_type`;
components/com_admin/sql/updates/mysql/3.9.8-2019-06-15.sql000060400000000436152453623440016536 0ustar00ALTER TABLE `#__template_styles` DROP INDEX `idx_home`;
# Query removed, see https://github.com/joomla/joomla-cms/pull/25484
ALTER TABLE `#__template_styles` ADD INDEX `idx_client_id` (`client_id`);
ALTER TABLE `#__template_styles` ADD INDEX `idx_client_id_home` (`client_id`, `home`);
components/com_admin/sql/updates/mysql/3.5.0-2015-10-13.sql000060400000000572152453623440016510 0ustar00INSERT 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);
components/com_admin/sql/updates/mysql/2.5.0-2011-12-19.sql000060400000001671152453623440016514 0ustar00CREATE TABLE IF NOT EXISTS `#__user_notes` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int unsigned NOT NULL DEFAULT '0',
  `catid` int unsigned NOT NULL DEFAULT '0',
  `subject` varchar(100) NOT NULL DEFAULT '',
  `body` text NOT NULL,
  `state` tinyint NOT NULL DEFAULT '0',
  `checked_out` int unsigned NOT NULL DEFAULT '0',
  `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `created_user_id` int unsigned NOT NULL DEFAULT '0',
  `created_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `modified_user_id` int 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;
components/com_admin/sql/updates/mysql/2.5.4-2012-03-19.sql000060400000000536152453623440016520 0ustar00ALTER 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';
components/com_admin/sql/updates/mysql/3.1.1.sql000060400000000071152453623440015453 0ustar00# Placeholder file for database changes for version 3.1.1components/com_admin/sql/updates/mysql/3.7.0-2016-11-19.sql000060400000000243152453623440016515 0ustar00ALTER TABLE `#__menu_types` ADD COLUMN `client_id` int NOT NULL DEFAULT 0;

UPDATE `#__menu` SET `published` = 1 WHERE `menutype` = 'main' OR `menutype` = 'menu';
components/com_admin/sql/updates/mysql/2.5.5.sql000060400000000555152453623440015471 0ustar00ALTER TABLE `#__redirect_links` ADD COLUMN `hits` INT 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 NOT NULL DEFAULT '0' COMMENT 'Count of password resets since lastResetTime';components/com_admin/sql/updates/mysql/3.6.0-2016-05-06.sql000060400000001362152453623440016516 0ustar00DELETE 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);
components/com_admin/sql/updates/mysql/3.7.0-2017-01-09.sql000060400000001252152453623440016515 0ustar00-- Normalize categories table default values.
ALTER TABLE `#__categories` MODIFY `title` varchar(255) NOT NULL DEFAULT '';
ALTER TABLE `#__categories` MODIFY `description` mediumtext;
ALTER TABLE `#__categories` MODIFY `params` text;
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 '';
components/com_admin/sql/updates/mysql/3.9.0-2018-05-03.sql000060400000000625152453623440016521 0ustar00INSERT 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
(482, 0, 'plg_content_confirmconsent', 'plugin', 'confirmconsent', 'content', 0, 0, 1, 0, '', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0);
components/com_admin/sql/updates/mysql/3.5.0-2015-07-01.sql000060400000000224152453623440016505 0ustar00-- ALTER TABLE `#__session` MODIFY `session_id` varchar(191) NOT NULL DEFAULT '';
ALTER TABLE `#__user_keys` MODIFY `series` varchar(191) NOT NULL;
components/com_admin/sql/updates/mysql/3.9.7-2019-04-23.sql000060400000000115152453623440016524 0ustar00ALTER TABLE `#__session` ADD INDEX `client_id_guest` (`client_id`, `guest`);
components/com_admin/sql/updates/mysql/3.7.0-2016-10-02.sql000060400000000113152453623440016500 0ustar00ALTER TABLE `#__session` MODIFY `client_id` tinyint unsigned DEFAULT NULL;
components/com_admin/sql/updates/mysql/3.6.3-2016-08-15.sql000060400000000175152453623440016525 0ustar00--
-- Increasing size of the URL field in com_newsfeeds
--

ALTER TABLE `#__newsfeeds` MODIFY `link` VARCHAR(2048) NOT NULL;
components/com_admin/sql/updates/mysql/2.5.0-2011-12-06.sql000060400000001525152453623440016506 0ustar00INSERT 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 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);
components/com_admin/sql/updates/mysql/3.7.0-2016-08-22.sql000060400000000566152453623440016525 0ustar00INSERT 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);
components/com_admin/sql/updates/mysql/3.9.26-2021-04-07.sql000060400000001242152453623440016602 0ustar00INSERT INTO `#__postinstall_messages` (`extension_id`, `title_key`, `description_key`, `action_key`, `language_extension`, `language_client_id`, `type`, `version_introduced`, `enabled`, `condition_file`, `condition_method`, `action_file`, `action`)
VALUES
(700, 'COM_ADMIN_POSTINSTALL_MSG_BEHIND_LOAD_BALANCER_TITLE', 'COM_ADMIN_POSTINSTALL_MSG_BEHIND_LOAD_BALANCER_DESCRIPTION', 'COM_ADMIN_POSTINSTALL_MSG_BEHIND_LOAD_BALANCER_ACTION', 'com_admin', 1, 'action', '3.9.26', 1, 'admin://components/com_admin/postinstall/behindproxy.php', 'admin_postinstall_behindproxy_condition', 'admin://components/com_admin/postinstall/behindproxy.php', 'behindproxy_postinstall_action');
components/com_admin/sql/updates/mysql/3.8.0-2017-07-28.sql000060400000000125152453623440016523 0ustar00ALTER TABLE `#__fields_groups` ADD COLUMN `params` TEXT  NOT NULL  AFTER `ordering`;
components/com_admin/sql/updates/mysql/3.2.2-2013-12-28.sql000060400000000254152453623440016512 0ustar00UPDATE `#__menu` SET `component_id` = (SELECT `extension_id` FROM `#__extensions` WHERE `element` = 'com_joomlaupdate') WHERE `link` = 'index.php?option=com_joomlaupdate';
components/com_admin/sql/updates/mysql/3.2.2-2014-01-18.sql000060400000000146152453623440016510 0ustar00/* Update updates version length */
ALTER TABLE `#__updates` MODIFY `version` varchar(32) DEFAULT '';
components/com_admin/sql/updates/mysql/3.8.6-2018-02-14.sql000060400000002017152453623440016522 0ustar00INSERT 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);
components/com_admin/sql/updates/mysql/3.9.0-2018-08-12.sql000060400000000135152453623440016520 0ustar00ALTER TABLE `#__privacy_consents` ADD COLUMN `state` INT NOT NULL DEFAULT 1 AFTER `user_id`;
components/com_admin/sql/updates/mysql/3.2.0.sql000060400000046410152453623440015462 0ustar00/* 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) 2013 Open Source Matters, Inc.\\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) 2013 Open Source Matters, Inc.","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) 2013 Open Source Matters, Inc.","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":"(C) 2013 Open Source Matters, Inc.","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) 2013 Open Source Matters, Inc.","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 UNSIGNED NOT NULL DEFAULT '0' COMMENT 'FK to the #__assets table.' AFTER `id`;

CREATE TABLE `#__postinstall_messages` (
  `postinstall_message_id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `extension_id` bigint 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 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 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 unsigned NOT NULL AUTO_INCREMENT,
  `ucm_item_id` int unsigned NOT NULL,
  `ucm_type_id` int 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 unsigned NOT NULL DEFAULT '0',
  `character_count` int 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 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 unsigned NOT NULL AUTO_INCREMENT,
  `user_id` varchar(255) NOT NULL,
  `token` varchar(255) NOT NULL,
  `series` varchar(255) NOT NULL,
  `invalid` tinyint 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);
components/com_admin/sql/updates/mysql/3.7.0-2017-02-15.sql000060400000000205152453623440016510 0ustar00-- Normalize redirect_links table default values.
ALTER TABLE `#__redirect_links` MODIFY `comment` varchar(255) NOT NULL DEFAULT '';
components/com_admin/sql/updates/mysql/3.5.0-2015-10-30.sql000060400000000171152453623440016502 0ustar00UPDATE `#__menu` SET `title` = 'com_contact_contacts' WHERE `client_id` = 1 AND `level` = 2 AND `title` = 'com_contact';
components/com_admin/sql/updates/mysql/3.0.1.sql000060400000000071152453623440015452 0ustar00# Placeholder file for database changes for version 3.0.1components/com_admin/sql/updates/mysql/2.5.2-2012-03-05.sql000060400000000046152453623440016505 0ustar00# Dummy SQL file to set schema versioncomponents/com_admin/sql/updates/mysql/3.9.0-2018-05-27.sql000060400000001006152453623440016521 0ustar00INSERT 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
(486, 0, 'plg_system_logrotation', 'plugin', 'logrotation', 'system', 0, 1, 1, 0, '', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0),
(487, 0, 'plg_privacy_user', 'plugin', 'user', 'privacy', 0, 1, 1, 0, '', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0);
components/com_admin/sql/updates/mysql/3.8.4-2018-01-16.sql000060400000000144152453623440016520 0ustar00ALTER TABLE `#__user_keys` DROP INDEX `series_2`;
ALTER TABLE `#__user_keys` DROP INDEX `series_3`;
components/com_admin/sql/updates/mysql/3.9.0-2018-05-20.sql000060400000000610152453623440016512 0ustar00INSERT 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
(319, 0, 'mod_latestactions', 'module', 'mod_latestactions', '', 1, 1, 1, 0, '', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0);
components/com_admin/sql/updates/mysql/3.5.1-2016-03-29.sql000060400000000432152453623440016516 0ustar00--
-- 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;components/com_admin/sql/updates/mysql/3.2.2-2014-01-23.sql000060400000001140152453623440016477 0ustar00INSERT 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);
components/com_admin/sql/updates/mysql/3.9.0-2018-08-29.sql000060400000000717152453623440016536 0ustar00INSERT 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
(494, 0, 'plg_captcha_recaptcha_invisible', 'plugin', 'recaptcha_invisible', 'captcha', 0, 0, 1, 0, '', '{"public_key":"","private_key":"","theme":"clean"}', '', '', 0, '0000-00-00 00:00:00', 0, 0);
components/com_admin/sql/updates/mysql/3.7.0-2017-03-09.sql000060400000001373152453623440016523 0ustar00UPDATE `#__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;
components/com_admin/sql/updates/mysql/3.9.0-2018-05-05.sql000060400000010673152453623440016527 0ustar00INSERT 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
(36, 0, 'com_actionlogs', 'component', 'com_actionlogs', '', 1, 1, 1, 1, '', '{"ip_logging":0,"csv_delimiter":",","loggable_extensions":["com_banners","com_cache","com_categories","com_config","com_contact","com_content","com_installer","com_media","com_menus","com_messages","com_modules","com_newsfeeds","com_plugins","com_redirect","com_tags","com_templates","com_users"]}', '', '', 0, '0000-00-00 00:00:00', 0, 0),
(483, 0, 'plg_system_actionlogs', 'plugin', 'actionlogs', 'system', 0, 0, 1, 0, '', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0),
(484, 0, 'plg_actionlog_joomla', 'plugin', 'joomla', 'actionlog', 0, 1, 1, 0, '', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0);


--
-- Table structure for table `#__action_logs`
--

CREATE TABLE IF NOT EXISTS `#__action_logs` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `message_language_key` varchar(255) NOT NULL DEFAULT '',
  `message` text NOT NULL,
  `log_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `extension` varchar(50) NOT NULL DEFAULT '',
  `user_id` int NOT NULL DEFAULT 0,
  `item_id` int NOT NULL DEFAULT 0,
  `ip_address` VARCHAR(40) NOT NULL DEFAULT '0.0.0.0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci;

--
-- Table structure for table `#__action_logs_extensions`
--

CREATE TABLE IF NOT EXISTS `#__action_logs_extensions` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `extension` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci;

INSERT INTO `#__action_logs_extensions` (`id`, `extension`) VALUES
(1, 'com_banners'),
(2, 'com_cache'),
(3, 'com_categories'),
(4, 'com_config'),
(5, 'com_contact'),
(6, 'com_content'),
(7, 'com_installer'),
(8, 'com_media'),
(9, 'com_menus'),
(10, 'com_messages'),
(11, 'com_modules'),
(12, 'com_newsfeeds'),
(13, 'com_plugins'),
(14, 'com_redirect'),
(15, 'com_tags'),
(16, 'com_templates'),
(17, 'com_users');

--
-- Table structure for table `#__action_log_config`
--

CREATE TABLE IF NOT EXISTS `#__action_log_config` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `type_title` varchar(255) NOT NULL DEFAULT '',
  `type_alias` varchar(255) NOT NULL DEFAULT '',
  `id_holder` varchar(255),
  `title_holder` varchar(255),
  `table_name` varchar(255),
  `text_prefix` varchar(255),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci;

INSERT INTO `#__action_log_config` (`id`, `type_title`, `type_alias`, `id_holder`, `title_holder`, `table_name`, `text_prefix`) VALUES
(1, 'article', 'com_content.article', 'id' ,'title' , '#__content', 'PLG_ACTIONLOG_JOOMLA'),
(2, 'article', 'com_content.form', 'id', 'title' , '#__content', 'PLG_ACTIONLOG_JOOMLA'),
(3, 'banner', 'com_banners.banner', 'id' ,'name' , '#__banners', 'PLG_ACTIONLOG_JOOMLA'),
(4, 'user_note', 'com_users.note', 'id', 'subject' ,'#__user_notes', 'PLG_ACTIONLOG_JOOMLA'),
(5, 'media', 'com_media.file', '' , 'name' , '',  'PLG_ACTIONLOG_JOOMLA'),
(6, 'category', 'com_categories.category', 'id' , 'title' , '#__categories', 'PLG_ACTIONLOG_JOOMLA'),
(7, 'menu', 'com_menus.menu', 'id' ,'title' , '#__menu_types', 'PLG_ACTIONLOG_JOOMLA'),
(8, 'menu_item', 'com_menus.item', 'id' , 'title' , '#__menu', 'PLG_ACTIONLOG_JOOMLA'),
(9, 'newsfeed', 'com_newsfeeds.newsfeed', 'id' ,'name' , '#__newsfeeds', 'PLG_ACTIONLOG_JOOMLA'),
(10, 'link', 'com_redirect.link', 'id', 'old_url' , '#__redirect_links', 'PLG_ACTIONLOG_JOOMLA'),
(11, 'tag', 'com_tags.tag', 'id', 'title' , '#__tags', 'PLG_ACTIONLOG_JOOMLA'),
(12, 'style', 'com_templates.style', 'id' , 'title' , '#__template_styles', 'PLG_ACTIONLOG_JOOMLA'),
(13, 'plugin', 'com_plugins.plugin', 'extension_id' , 'name' , '#__extensions', 'PLG_ACTIONLOG_JOOMLA'),
(14, 'component_config', 'com_config.component', 'extension_id' , 'name', '', 'PLG_ACTIONLOG_JOOMLA'),
(15, 'contact', 'com_contact.contact', 'id', 'name', '#__contact_details', 'PLG_ACTIONLOG_JOOMLA'),
(16, 'module', 'com_modules.module', 'id' ,'title', '#__modules', 'PLG_ACTIONLOG_JOOMLA'),
(17, 'access_level', 'com_users.level', 'id' , 'title', '#__viewlevels', 'PLG_ACTIONLOG_JOOMLA'),
(18, 'banner_client', 'com_banners.client', 'id', 'name', '#__banner_clients', 'PLG_ACTIONLOG_JOOMLA');
components/com_admin/sql/updates/mysql/3.8.0-2017-07-31.sql000060400000001003152453623440016511 0ustar00INSERT 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);
components/com_admin/sql/updates/mysql/2.5.0-2011-12-16.sql000060400000000361152453623440016504 0ustar00CREATE TABLE IF NOT EXISTS `#__overrider` (
  `id` int 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;components/com_admin/sql/updates/mysql/3.7.0-2017-01-08.sql000060400000003122152453623440016512 0ustar00-- 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;
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;
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 unsigned NOT NULL DEFAULT 0 COMMENT 'ID from the individual type table';
ALTER TABLE `#__ucm_content` MODIFY `asset_id` int unsigned NOT NULL DEFAULT 0 COMMENT 'FK to the #__assets table.';
ALTER TABLE `#__ucm_content` MODIFY `core_images` text;
ALTER TABLE `#__ucm_content` MODIFY `core_urls` text;
ALTER TABLE `#__ucm_content` MODIFY `core_metakey` text;
ALTER TABLE `#__ucm_content` MODIFY `core_metadesc` text;
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 unsigned NOT NULL DEFAULT 0;
components/com_admin/sql/updates/mysql/3.9.0-2018-05-02.sql000060400000002033152453623440016513 0ustar00INSERT 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
(35, 0, 'com_privacy', 'component', 'com_privacy', '', 1, 1, 1, 1, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0);

CREATE TABLE IF NOT EXISTS `#__privacy_requests` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `email` varchar(100) NOT NULL DEFAULT '',
  `requested_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `status` tinyint NOT NULL DEFAULT 0,
  `request_type` varchar(25) NOT NULL DEFAULT '',
  `confirm_token` varchar(100) NOT NULL DEFAULT '',
  `confirm_token_created_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `checked_out` int NOT NULL DEFAULT 0,
  `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`),
  KEY `idx_checkout` (`checked_out`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci;
components/com_admin/sql/updates/mysql/3.8.9-2018-06-19.sql000060400000000152152453623440016534 0ustar00-- Enable Sample Data Module.
UPDATE `#__extensions` SET `enabled` = '1' WHERE `name` = 'mod_sampledata';
components/com_admin/sql/updates/mysql/2.5.4-2012-03-18.sql000060400000002257152453623440016521 0ustar00INSERT 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) 2012 Open Source Matters, Inc.","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);
components/com_admin/sql/updates/mysql/3.4.0-2014-10-20.sql000060400000000070152453623440016475 0ustar00DELETE FROM `#__extensions` WHERE `extension_id` = 100;
components/com_admin/sql/updates/mysql/3.4.0-2014-12-03.sql000060400000000244152453623440016503 0ustar00UPDATE `#__extensions` SET `protected` = '0' WHERE `name` = 'plg_editors-xtd_article' AND `type` = "plugin" AND `element` = "article" AND `folder` = "editors-xtd";
components/com_admin/sql/updates/mysql/3.1.0.sql000060400000042651152453623440015464 0ustar00--
-- Table structure for table `#__content_types`
--

CREATE TABLE IF NOT EXISTS `#__content_types` (
  `type_id` int 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 unsigned NOT NULL COMMENT 'PK from the core content table',
  `content_item_id` int NOT NULL COMMENT 'PK from the content type table',
  `tag_id` int 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 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 unsigned NOT NULL AUTO_INCREMENT,
  `parent_id` int unsigned NOT NULL DEFAULT '0',
  `lft` int NOT NULL DEFAULT '0',
  `rgt` int NOT NULL DEFAULT '0',
  `level` int 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 NOT NULL DEFAULT '0',
  `checked_out` int unsigned NOT NULL DEFAULT '0',
  `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `access` int 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 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 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 unsigned NOT NULL DEFAULT '0',
  `language` char(7) NOT NULL,
  `version` int 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 unsigned NOT NULL,
  `ucm_item_id` int NOT NULL,
  `ucm_type_id` int NOT NULL,
  `ucm_language_id` int 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 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 NOT NULL DEFAULT '0',
  `core_checked_out_time`  varchar(255) NOT NULL DEFAULT '',
  `core_checked_out_user_id` int unsigned NOT NULL DEFAULT '0',
  `core_access` int unsigned NOT NULL DEFAULT '0',
  `core_params` text NOT NULL,
  `core_featured` tinyint unsigned NOT NULL DEFAULT '0',
  `core_metadata` varchar(2048) NOT NULL COMMENT 'JSON encoded metadata properties.',
  `core_created_user_id` int 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 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 unsigned COMMENT 'ID from the individual type table',
  `asset_id` int unsigned COMMENT 'FK to the #__assets table.',
  `core_images` text NOT NULL,
  `core_urls` text NOT NULL,
  `core_hits` int unsigned NOT NULL DEFAULT '0',
  `core_version` int unsigned NOT NULL DEFAULT '1',
  `core_ordering` int NOT NULL DEFAULT '0',
  `core_metakey` text NOT NULL,
  `core_metadesc` text NOT NULL,
  `core_catid` int 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 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) 2013 Open Source Matters, Inc.","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":"(C) 2013 Open Source Matters, Inc.","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":"(C) 2013 Open Source Matters, Inc.","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) 2013 Open Source Matters, Inc.","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);
components/com_admin/sql/updates/mysql/3.5.0-2016-03-01.sql000060400000001052152453623440016502 0ustar00ALTER 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));
components/com_admin/sql/updates/mysql/3.2.2-2014-01-08.sql000060400000000563152453623440016512 0ustar00INSERT 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);components/com_admin/sql/updates/mysql/3.7.0-2016-09-29.sql000060400000000777152453623440016541 0ustar00INSERT 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);
components/com_admin/sql/updates/mysql/3.4.0-2014-08-24.sql000060400000000735152453623440016520 0ustar00INSERT 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);
components/com_admin/sql/updates/mysql/3.7.0-2017-02-02.sql000060400000000572152453623440016513 0ustar00INSERT 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);
components/com_admin/sql/updates/mysql/3.5.0-2016-02-26.sql000060400000001074152453623440016514 0ustar00--
-- 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 NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci;

INSERT INTO `#__utf8_conversion` (`converted`) VALUES (0);
components/com_admin/sql/updates/mysql/3.9.21-2020-08-02.sql000060400000000752152453623440016600 0ustar00INSERT 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_HTACCESSSVG_TITLE', 'COM_CPANEL_MSG_HTACCESSSVG_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/htaccesssvg.php', 'admin_postinstall_htaccesssvg_condition', '3.9.21', 1);
components/com_admin/sql/updates/mysql/2.5.0-2011-12-23.sql000060400000003760152453623440016510 0ustar00CREATE TABLE IF NOT EXISTS `#__finder_filters` (
  `filter_id` int unsigned NOT NULL auto_increment,
  `title` varchar(255) NOT NULL,
  `alias` varchar(255) NOT NULL,
  `state` tinyint NOT NULL default '1',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `created_by` int unsigned NOT NULL,
  `created_by_alias` varchar(255) NOT NULL,
  `modified` datetime NOT NULL default '0000-00-00 00:00:00',
  `modified_by` int unsigned NOT NULL default '0',
  `checked_out` int unsigned NOT NULL default '0',
  `checked_out_time` datetime NOT NULL default '0000-00-00 00:00:00',
  `map_count` int 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 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 NOT NULL default '1',
  `state` int default '1',
  `access` int 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 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;

components/com_admin/sql/updates/mysql/3.3.4-2014-08-03.sql000060400000000125152453623440016511 0ustar00ALTER TABLE `#__user_profiles` CHANGE `profile_value` `profile_value` TEXT NOT NULL;
components/com_admin/sql/updates/mysql/3.4.0-2015-02-26.sql000060400000001001152453623440016500 0ustar00INSERT 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);
components/com_admin/sql/updates/mysql/3.7.0-2016-11-24.sql000060400000000641152453623440016513 0ustar00ALTER TABLE `#__extensions` ADD COLUMN `package_id` int 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';
components/com_admin/sql/updates/mysql/3.7.0-2017-03-19.sql000060400000000071152453623440016516 0ustar00ALTER TABLE `#__finder_links` MODIFY `description` text;
components/com_admin/sql/updates/mysql/2.5.0-2011-12-24.sql000060400000000475152453623440016511 0ustar00ALTER 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` );components/com_admin/sql/updates/mysql/3.9.0-2018-08-28.sql000060400000000311152453623440016523 0ustar00ALTER TABLE `#__session` MODIFY `session_id` varbinary(192) NOT NULL;
ALTER TABLE `#__session` MODIFY `guest` tinyint unsigned DEFAULT 1;
ALTER TABLE `#__session` MODIFY `time` int NOT NULL DEFAULT 0;
components/com_admin/sql/updates/mysql/3.7.4-2017-07-05.sql000060400000000134152453623440016521 0ustar00DELETE FROM `#__postinstall_messages` WHERE `title_key` = 'COM_CPANEL_MSG_PHPVERSION_TITLE';components/com_admin/sql/updates/mysql/3.9.0-2018-06-17.sql000060400000000575152453623440016533 0ustar00INSERT 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
(489, 0, 'plg_user_terms', 'plugin', 'terms', 'user', 0, 0, 1, 0, '', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0);
components/com_admin/sql/updates/mysql/3.0.0.sql000060400000021220152453623440015450 0ustar00ALTER 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 unsigned NOT NULL DEFAULT '1';
ALTER TABLE `#__newsfeeds` ADD COLUMN `hits` int unsigned NOT NULL DEFAULT '0';
ALTER TABLE `#__newsfeeds` ADD COLUMN `images` text NOT NULL;
ALTER TABLE `#__contact_details` ADD COLUMN `version` int unsigned NOT NULL DEFAULT '1';
ALTER TABLE `#__contact_details` ADD COLUMN `hits` int unsigned NOT NULL DEFAULT '0';
ALTER TABLE `#__banners` ADD COLUMN `created_by` int 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 unsigned NOT NULL DEFAULT '0';
ALTER TABLE `#__banners` ADD COLUMN `version` int unsigned NOT NULL DEFAULT '1';
ALTER TABLE `#__categories` ADD COLUMN `version` int 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":"(C) 2012 Open Source Matters, Inc.","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":"(C) 2012 Open Source Matters, Inc.","authorEmail":"admin@joomla.org","authorUrl":"","version":"1.0","description":"TPL_PROTOSTAR_XML_DESCRIPTION","group":""}', '{"templateColor":"","logoFile":"","googleFont":"0","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":"(C) 2009 Open Source Matters, Inc.","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":"0","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":"(C) 2012 Open Source Matters, Inc.","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';
components/com_admin/sql/updates/mysql/3.3.0-2014-04-02.sql000060400000000632152453623440016503 0ustar00INSERT 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);

components/com_admin/sql/updates/mysql/3.9.19-2020-05-16.sql000060400000000274152453623440016610 0ustar00-- Add back the default value which might have been lost with utf8mb4 conversion on certain CMS versions
ALTER TABLE `#__ucm_content` MODIFY `core_title` varchar(400) NOT NULL DEFAULT '';
components/com_admin/sql/updates/mysql/3.2.1.sql000060400000000150152453623440015452 0ustar00DELETE FROM `#__postinstall_messages` WHERE `title_key` = 'PLG_USER_JOOMLA_POSTINSTALL_STRONGPW_TITLE';
components/com_admin/sql/updates/mysql/3.7.0-2017-01-17.sql000060400000004707152453623440016524 0ustar00-- 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');
components/com_admin/sql/updates/mysql/2.5.0-2011-12-21-2.sql000060400000017666152453623440016657 0ustar00CREATE TABLE IF NOT EXISTS `#__finder_links_terms0` (
  `link_id` int unsigned NOT NULL,
  `term_id` int 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 unsigned NOT NULL,
  `term_id` int 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 unsigned NOT NULL,
  `term_id` int 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 unsigned NOT NULL,
  `term_id` int 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 unsigned NOT NULL,
  `term_id` int 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 unsigned NOT NULL,
  `term_id` int 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 unsigned NOT NULL,
  `term_id` int 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 unsigned NOT NULL,
  `term_id` int 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 unsigned NOT NULL,
  `term_id` int 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 unsigned NOT NULL,
  `term_id` int 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 unsigned NOT NULL,
  `term_id` int 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 unsigned NOT NULL,
  `term_id` int 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 unsigned NOT NULL,
  `term_id` int 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 unsigned NOT NULL,
  `term_id` int 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 unsigned NOT NULL,
  `term_id` int 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 unsigned NOT NULL,
  `term_id` int 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 unsigned NOT NULL auto_increment,
  `parent_id` int unsigned NOT NULL default '0',
  `title` varchar(255) NOT NULL,
  `state` tinyint unsigned NOT NULL default '1',
  `access` tinyint unsigned NOT NULL default '0',
  `ordering` tinyint 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 unsigned NOT NULL,
  `node_id` int 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 unsigned NOT NULL auto_increment,
  `term` varchar(75) NOT NULL,
  `stem` varchar(75) NOT NULL,
  `common` tinyint unsigned NOT NULL default '0',
  `phrase` tinyint unsigned NOT NULL default '0',
  `weight` float unsigned NOT NULL default '0',
  `soundex` varchar(75) NOT NULL,
  `links` int 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 unsigned NOT NULL default '0',
  `phrase` tinyint unsigned NOT NULL default '0',
  `weight` float unsigned NOT NULL default '1',
  `context` tinyint 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 unsigned NOT NULL,
  `map_suffix` char(1) NOT NULL,
  `term` varchar(75) NOT NULL,
  `stem` varchar(75) NOT NULL,
  `common` tinyint unsigned NOT NULL default '0',
  `phrase` tinyint unsigned NOT NULL default '0',
  `term_weight` float unsigned NOT NULL,
  `context` tinyint 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 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;


components/com_admin/sql/updates/mysql/2.5.0-2012-01-14.sql000060400000000136152453623440016501 0ustar00ALTER TABLE `#__languages` CHANGE `sitename` `sitename` VARCHAR( 1024 ) NOT NULL DEFAULT '';

components/com_admin/sql/updates/mysql/3.10.0-2021-05-28.sql000060400000000564152453623440016574 0ustar00INSERT INTO `#__extensions` (`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
(0, 'plg_quickicon_eos310', 'plugin', 'eos310', 'quickicon', 0, 1, 1, 0, '', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0);
components/com_admin/sql/updates/mysql/3.9.0-2018-06-14.sql000060400000001022152453623440016514 0ustar00INSERT 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_ACTIONLOGS_POSTINSTALL_TITLE', 'COM_ACTIONLOGS_POSTINSTALL_BODY', '', 'com_actionlogs', 1, 'message', '', '', '', '', '3.9.0', 1),
(700, 'COM_PRIVACY_POSTINSTALL_TITLE', 'COM_PRIVACY_POSTINSTALL_BODY', '', 'com_privacy', 1, 'message', '', '', '', '', '3.9.0', 1);components/com_admin/sql/updates/mysql/2.5.1-2012-01-26.sql000060400000002342152453623440016506 0ustar00INSERT 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":"(C) 2012 Open Source Matters, Inc.","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);
components/com_admin/sql/updates/mysql/3.9.0-2018-06-13.sql000060400000000625152453623440016523 0ustar00INSERT 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
(488, 0, 'plg_quickicon_privacycheck', 'plugin', 'privacycheck', 'quickicon', 0, 1, 1, 0, '', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0);
components/com_admin/sql/updates/mysql/3.5.1-2016-03-25.sql000060400000000200152453623440016503 0ustar00--
-- Make #__user_keys.user_id fit to #__users.username
--

ALTER TABLE `#__user_keys` MODIFY `user_id` varchar(150) NOT NULL;
components/com_admin/sql/updates/mysql/3.10.0-2020-08-10.sql000060400000000504152453623440016557 0ustar00--
-- These database columns are not used in Joomla 3.10 but will be used in Joomla 4.
-- They are added to 3.10 because otherwise the update to 4 will fail.
--
ALTER TABLE `#__template_styles` ADD COLUMN `inheritable` tinyint NOT NULL DEFAULT 0;
ALTER TABLE `#__template_styles` ADD COLUMN `parent` varchar(50) DEFAULT '';
components/com_admin/sql/updates/mysql/3.7.0-2017-02-17.sql000060400000001312152453623440016512 0ustar00-- 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.';
components/com_admin/sql/updates/mysql/3.0.3.sql000060400000000152152453623440015454 0ustar00ALTER TABLE `#__associations` CHANGE `id` `id` INT NOT NULL COMMENT 'A reference to the associated item.';components/com_admin/sql/updates/mysql/3.4.0-2014-09-16.sql000060400000000452152453623440016516 0ustar00ALTER TABLE `#__redirect_links` ADD COLUMN `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` MODIFY `new_url` varchar(255);
components/com_admin/sql/updates/mysql/3.9.0-2018-10-21.sql000060400000000611152453623440016510 0ustar00INSERT 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
(495, 0, 'plg_privacy_consents', 'plugin', 'consents', 'privacy', 0, 1, 1, 0, '', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0);
components/com_admin/sql/updates/mysql/3.6.0-2016-04-09.sql000060400000000167152453623440016522 0ustar00--
-- Add ACL check for to #__menu_types
--

ALTER TABLE `#__menu_types` ADD COLUMN `asset_id` INT NOT NULL AFTER `id`;components/com_admin/sql/updates/mysql/3.7.0-2016-08-29.sql000060400000013026152453623440016527 0ustar00CREATE TABLE IF NOT EXISTS `#__fields` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `asset_id` int unsigned NOT NULL DEFAULT 0,
  `context` varchar(255) NOT NULL DEFAULT '',
  `group_id` int 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,
  `type` varchar(255) NOT NULL DEFAULT 'text',
  `note` varchar(255) NOT NULL DEFAULT '',
  `description` text NOT NULL,
  `state` tinyint NOT NULL DEFAULT '0',
  `required` tinyint NOT NULL DEFAULT '0',
  `checked_out` int NOT NULL DEFAULT '0',
  `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `ordering` int 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 unsigned NOT NULL DEFAULT '0',
  `modified_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `modified_by` int unsigned NOT NULL DEFAULT '0',
  `access` int 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 NOT NULL DEFAULT 0,
  `category_id` int 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 unsigned NOT NULL AUTO_INCREMENT,
  `asset_id` int 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 NOT NULL DEFAULT '0',
  `checked_out` int NOT NULL DEFAULT '0',
  `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `ordering` int NOT NULL DEFAULT '0',
  `language` char(7) NOT NULL DEFAULT '',
  `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `created_by` int unsigned NOT NULL DEFAULT '0',
  `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `modified_by` int unsigned NOT NULL DEFAULT '0',
  `access` int 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 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,
  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);
components/com_admin/sql/updates/mysql/3.9.0-2018-05-19.sql000060400000000611152453623440016523 0ustar00INSERT 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
(481, 0, 'plg_fields_repeatable', 'plugin', 'repeatable', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '0000-00-00 00:00:00', 0, 0);
components/com_admin/sql/updates/mysql/3.3.6-2014-09-30.sql000060400000000727152453623440016524 0ustar00INSERT 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'));
components/com_admin/sql/updates/mysql/3.10.7-2022-02-20.sql000060400000000152152453623440016562 0ustar00DELETE FROM `#__postinstall_messages` WHERE `title_key` = 'COM_ADMIN_POSTINSTALL_MSG_FLOC_BLOCKER_TITLE';
components/com_admin/sql/updates/mysql/2.5.0-2011-12-21-1.sql000060400000004302152453623440016635 0ustar00INSERT 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":"(C) 2011 Open Source Matters, Inc.","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);
components/com_admin/sql/updates/mysql/3.3.0-2014-02-16.sql000060400000000221152453623440016500 0ustar00ALTER TABLE `#__users` ADD COLUMN `requireReset` tinyint NOT NULL DEFAULT 0 COMMENT 'Require user to reset password on next login' AFTER `otep`;
components/com_admin/sql/updates/mysql/2.5.0-2012-01-10.sql000060400000000120152453623440016466 0ustar00ALTER TABLE `#__updates` ADD COLUMN `infourl` text NOT NULL AFTER `detailsurl`;
components/com_admin/sql/updates/mysql/3.7.0-2016-11-04.sql000060400000000124152453623440016505 0ustar00ALTER TABLE `#__extensions` CHANGE `enabled` `enabled` TINYINT NOT NULL DEFAULT '0';components/com_admin/sql/updates/mysql/2.5.7.sql000060400000001005152453623440015462 0ustar00INSERT 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'  );components/com_admin/sql/updates/mysql/3.4.0-2015-01-21.sql000060400000000577152453623440016513 0ustar00INSERT 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);components/com_admin/sql/updates/mysql/3.9.7-2019-04-26.sql000060400000000522152453623440016531 0ustar00UPDATE `#__content_types` SET `content_history_options` = REPLACE(`content_history_options`, '\"ignoreChanges\":[\"modified_by\", \"modified\", \"checked_out\", \"checked_out_time\", \"version\", \"hits\"]', '\"ignoreChanges\":[\"modified_by\", \"modified\", \"checked_out\", \"checked_out_time\", \"version\", \"hits\", \"ordering\"]');
components/com_admin/sql/updates/mysql/3.1.4.sql000060400000000554152453623440015464 0ustar00INSERT 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);
components/com_admin/sql/updates/mysql/3.1.3.sql000060400000000072152453623440015456 0ustar00# Placeholder file for database changes for version 3.1.3
components/com_admin/sql/updates/mysql/3.5.0-2015-11-04.sql000060400000000730152453623440016505 0ustar00DELETE 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);
components/com_admin/sql/updates/mysql/3.7.0-2016-11-27.sql000060400000000175152453623440016520 0ustar00-- Normalize modules content field with other db systems. Add default value.
ALTER TABLE `#__modules` MODIFY `content` text;
components/com_admin/sql/updates/mysql/3.9.0-2018-07-10.sql000060400000000346152453623440016521 0ustar00INSERT INTO `#__action_log_config` (`id`, `type_title`, `type_alias`, `id_holder`, `title_holder`, `table_name`, `text_prefix`)
	VALUES (19, 'application_config', 'com_config.application', '', 'name', '', 'PLG_ACTIONLOG_JOOMLA');
components/com_admin/sql/updates/mysql/3.10.7-2022-03-18.sql000060400000000200152453623440016564 0ustar00ALTER TABLE `#__users` ADD COLUMN `authProvider` VARCHAR(100) NOT NULL DEFAULT '' COMMENT 'Name of used authentication plugin';
components/com_admin/sql/updates/mysql/3.9.0-2018-06-02.sql000060400000001535152453623440016522 0ustar00ALTER TABLE `#__content` ADD COLUMN `note` VARCHAR(255) NOT NULL DEFAULT '';

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", "note":"note"}, "special":{"fulltext":"fulltext"}}' WHERE `type_alias` = 'com_content.article';
components/com_admin/sql/updates/mysql/3.8.2-2017-10-14.sql000060400000000156152453623440016516 0ustar00--
-- Add index for alias check #__content
--

ALTER TABLE `#__content` ADD INDEX `idx_alias` (`alias`(191));
components/com_admin/sql/updates/mysql/3.9.22-2020-09-16.sql000060400000000546152453623440016610 0ustar00INSERT INTO `#__postinstall_messages` (`extension_id`, `title_key`, `description_key`, `action_key`, `language_extension`, `language_client_id`, `type`, `version_introduced`, `enabled`)
VALUES
(700, 'COM_ADMIN_POSTINSTALL_MSG_HTACCESS_AUTOINDEX_TITLE', 'COM_ADMIN_POSTINSTALL_MSG_HTACCESS_AUTOINDEX_DESCRIPTION', '', 'com_admin', 1, 'message', '3.9.22', 1);
components/com_admin/sql/updates/mysql/2.5.0-2011-12-20.sql000060400000000500152453623440016472 0ustar00SELECT @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";components/com_admin/sql/updates/mysql/3.9.10-2019-07-09.sql000060400000000115152453623440016605 0ustar00ALTER TABLE `#__template_styles` MODIFY `home` char(7) NOT NULL DEFAULT '0';
components/com_admin/sql/updates/mysql/3.6.3-2016-08-16.sql000060400000001352152453623440016524 0ustar00INSERT 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);components/com_admin/sql/updates/mysql/3.6.0-2016-04-06.sql000060400000000100152453623440016502 0ustar00ALTER TABLE `#__redirect_links` MODIFY `new_url` VARCHAR(2048);
components/com_admin/sql/updates/mysql/3.2.2-2014-01-15.sql000060400000000745152453623440016512 0ustar00INSERT 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);
components/com_admin/sql/updates/mysql/3.6.0-2016-04-01.sql000060400000001651152453623440016511 0ustar00-- 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';
components/com_admin/sql/updates/mysql/3.2.3-2014-02-20.sql000060400000000256152453623440016505 0ustar00UPDATE `#__extensions` ext1, `#__extensions` ext2 SET ext1.`params` =  ext2.`params` WHERE ext1.`name` = 'plg_authentication_cookie' AND ext2.`name` = 'plg_system_remember';
components/com_admin/sql/updates/mysql/3.2.2-2013-12-22.sql000060400000000235152453623440016503 0ustar00ALTER TABLE `#__update_sites` ADD COLUMN `extra_query` VARCHAR(1000) DEFAULT '';
ALTER TABLE `#__updates` ADD COLUMN `extra_query` VARCHAR(1000) DEFAULT '';
components/com_admin/sql/updates/mysql/3.9.0-2018-09-04.sql000060400000000440152453623440016521 0ustar00CREATE TABLE IF NOT EXISTS `#__action_logs_users` (
  `user_id` int UNSIGNED NOT NULL,
  `notify` tinyint UNSIGNED NOT NULL,
  `extensions` text NOT NULL,
  PRIMARY KEY (`user_id`),
  KEY `idx_notify` (`notify`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci;
components/com_admin/sql/updates/mysql/3.9.0-2018-10-20.sql000060400000000274152453623440016514 0ustar00ALTER TABLE `#__privacy_requests` DROP INDEX `idx_checkout`;
ALTER TABLE `#__privacy_requests` DROP COLUMN `checked_out`;
ALTER TABLE `#__privacy_requests` DROP COLUMN `checked_out_time`;
components/com_admin/sql/updates/mysql/3.7.0-2017-01-15.sql000060400000000565152453623440016520 0ustar00INSERT 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);
components/com_admin/sql/updates/mysql/3.6.0-2016-04-08.sql000060400000001335152453623440016517 0ustar00-- 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;
components/com_admin/sql/updates/mysql/3.9.0-2018-10-15.sql000060400000000512152453623440016513 0ustar00ALTER TABLE `#__action_logs` ADD INDEX `idx_user_id` (`user_id`);
ALTER TABLE `#__action_logs` ADD INDEX `idx_user_id_logdate` (`user_id`, `log_date`);
ALTER TABLE `#__action_logs` ADD INDEX `idx_user_id_extension` (`user_id`, `extension`);
ALTER TABLE `#__action_logs` ADD INDEX `idx_extension_item_id` (`extension`, `item_id`);
components/com_admin/sql/updates/mysql/3.9.3-2019-01-12.sql000060400000000340152453623440016513 0ustar00UPDATE `#__extensions` 
SET `params` = REPLACE(`params`, '"com_categories",', '"com_categories","com_checkin",')
WHERE `name` = 'com_actionlogs';

INSERT INTO `#__action_logs_extensions` (`extension`) VALUES
('com_checkin');components/com_admin/sql/updates/mysql/3.9.0-2018-07-09.sql000060400000001205152453623440016524 0ustar00INSERT 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
(490, 0, 'plg_privacy_contact', 'plugin', 'contact', 'privacy', 0, 1, 1, 0, '', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0),
(491, 0, 'plg_privacy_content', 'plugin', 'content', 'privacy', 0, 1, 1, 0, '', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0),
(492, 0, 'plg_privacy_message', 'plugin', 'message', 'privacy', 0, 1, 1, 0, '', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0);
components/com_admin/sql/updates/mysql/3.7.0-2017-03-03.sql000060400000000476152453623440016520 0ustar00ALTER TABLE `#__languages` MODIFY `asset_id` int unsigned NOT NULL DEFAULT 0;
ALTER TABLE `#__menu_types` MODIFY `asset_id` int 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 '';
components/com_admin/sql/updates/mysql/3.0.2.sql000060400000000071152453623440015453 0ustar00# Placeholder file for database changes for version 3.0.2components/com_admin/sql/updates/mysql/3.9.0-2018-06-12.sql000060400000000620152453623440016515 0ustar00INSERT 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
(320, 0, 'mod_privacy_dashboard', 'module', 'mod_privacy_dashboard', '', 1, 1, 1, 0, '', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0);
components/com_admin/sql/updates/mysql/3.9.7-2019-05-16.sql000060400000000105152453623440016526 0ustar00# Query removed, see https://github.com/joomla/joomla-cms/pull/25177
components/com_admin/sql/updates/mysql/3.9.0-2018-05-24.sql000060400000001571152453623440016525 0ustar00INSERT 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
(485, 0, 'plg_system_privacyconsent', 'plugin', 'privacyconsent', 'system', 0, 0, 1, 0, '', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0);

CREATE TABLE IF NOT EXISTS `#__privacy_consents` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int unsigned NOT NULL DEFAULT 0,
  `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `subject` varchar(255) NOT NULL DEFAULT '',
  `body` text NOT NULL,
  `remind` tinyint NOT NULL DEFAULT 0,
  `token` varchar(100) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci;
components/com_admin/sql/updates/mysql/3.7.0-2016-11-21.sql000060400000000156152453623440016511 0ustar00-- Replace language image UNIQUE index for a normal INDEX.
ALTER TABLE `#__languages` DROP INDEX `idx_image`;
components/com_admin/sql/updates/mysql/3.6.0-2016-06-01.sql000060400000000126152453623440016507 0ustar00UPDATE `#__extensions` SET `protected` = 1, `enabled` = 1  WHERE `name` = 'com_ajax';
components/com_admin/sql/updates/mysql/3.7.0-2017-04-10.sql000060400000001144152453623440016510 0ustar00INSERT 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);components/com_admin/sql/updates/mysql/3.9.0-2018-07-11.sql000060400000000615152453623440016521 0ustar00INSERT 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
(493, 0, 'plg_privacy_actionlogs', 'plugin', 'actionlogs', 'privacy', 0, 1, 1, 0, '', '{}', '', '', 0, '0000-00-00 00:00:00', 0, 0);
components/com_admin/sql/updates/mysql/3.9.19-2020-06-01.sql000060400000000766152453623440016611 0ustar00INSERT 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_TEXTFILTER3919_TITLE', 'COM_CPANEL_MSG_TEXTFILTER3919_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/textfilter3919.php', 'admin_postinstall_textfilter3919_condition', '3.9.19', 1);
components/com_admin/sql/updates/mysql/3.9.16-2020-02-15.sql000060400000001226152453623440016577 0ustar00ALTER TABLE `#__categories` MODIFY `description` mediumtext;
ALTER TABLE `#__categories` MODIFY `params` text;
ALTER TABLE `#__fields` MODIFY `default_value` text;
ALTER TABLE `#__fields_values` MODIFY `value` text;
ALTER TABLE `#__finder_links` MODIFY `description` text;
ALTER TABLE `#__modules` MODIFY `content` text;
ALTER TABLE `#__ucm_content` MODIFY `core_body` mediumtext;
ALTER TABLE `#__ucm_content` MODIFY `core_params` text;
ALTER TABLE `#__ucm_content` MODIFY `core_images` text;
ALTER TABLE `#__ucm_content` MODIFY `core_urls` text;
ALTER TABLE `#__ucm_content` MODIFY `core_metakey` text;
ALTER TABLE `#__ucm_content` MODIFY `core_metadesc` text;
components/com_admin/sql/updates/mysql/2.5.3-2012-03-13.sql000060400000000046152453623440016505 0ustar00# Dummy SQL file to set schema versioncomponents/com_admin/sql/updates/mysql/3.9.8-2019-06-11.sql000060400000000074152453623440016530 0ustar00UPDATE #__users SET params = REPLACE(params, '",,"', '","');components/com_admin/sql/updates/mysql/3.7.0-2017-01-31.sql000060400000000562152453623440016513 0ustar00INSERT 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);
components/com_admin/sql/updates/mysql/3.7.0-2017-04-19.sql000060400000000250152453623440016516 0ustar00-- Set integer field default values.
UPDATE `#__extensions` SET `params` = '{"multiple":"0","first":"1","last":"100","step":"1"}' WHERE `name` = 'plg_fields_integer';

components/com_admin/sql/updates/mysql/3.9.3-2019-02-07.sql000060400000000745152453623440016531 0ustar00INSERT 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_ADDNOSNIFF_TITLE', 'COM_CPANEL_MSG_ADDNOSNIFF_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/addnosniff.php', 'admin_postinstall_addnosniff_condition', '3.9.3', 1);
components/com_admin/sql/updates/mysql/3.1.2.sql000060400000021415152453623440015461 0ustar00UPDATE `#__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';
components/com_admin/sql/updates/mysql/3.5.0-2015-11-05.sql000060400000001552152453623440016511 0ustar00INSERT 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);
components/com_admin/sql/updates/mysql/3.7.3-2017-06-03.sql000060400000000223152453623440016514 0ustar00ALTER 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.';
components/com_admin/sql/updates/mysql/3.4.0-2014-09-01.sql000060400000001347152453623440016514 0ustar00INSERT 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);
components/com_admin/sql/updates/mysql/3.1.5.sql000060400000000072152453623440015460 0ustar00# Placeholder file for database changes for version 3.1.5
components/com_admin/sql/updates/mysql/3.7.0-2016-10-01.sql000060400000000574152453623440016512 0ustar00INSERT 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);
components/com_admin/sql/updates/mysql/2.5.6.sql000060400000000071152453623440015463 0ustar00# Placeholder file for database changes for version 2.5.6components/com_admin/sql/updates/postgresql/3.7.0-2017-02-15.sql000060400000000171152453623440017550 0ustar00-- Normalize redirect_links table default values.
ALTER TABLE "#__redirect_links" ALTER COLUMN "comment" SET DEFAULT '';
components/com_admin/sql/updates/postgresql/3.5.0-2015-10-30.sql000060400000000171152453623440017540 0ustar00UPDATE "#__menu" SET "title" = 'com_contact_contacts' WHERE "client_id" = 1 AND "level" = 2 AND "title" = 'com_contact';
components/com_admin/sql/updates/postgresql/3.1.1.sql000060400000000071152453623440016511 0ustar00# Placeholder file for database changes for version 3.1.1components/com_admin/sql/updates/postgresql/3.9.27-2021-04-20.sql000060400000000510152453623440017631 0ustar00INSERT INTO "#__postinstall_messages" ("extension_id", "title_key", "description_key", "language_extension", "language_client_id", "type", "version_introduced", "enabled")
VALUES
(700, 'COM_ADMIN_POSTINSTALL_MSG_FLOC_BLOCKER_TITLE', 'COM_ADMIN_POSTINSTALL_MSG_FLOC_BLOCKER_DESCRIPTION', 'com_admin', 1, 'message', '3.9.27', 1);
components/com_admin/sql/updates/postgresql/3.8.4-2018-01-16.sql000060400000000110152453623440017547 0ustar00DROP INDEX "#__user_keys_series_2";
DROP INDEX "#__user_keys_series_3";
components/com_admin/sql/updates/postgresql/3.9.0-2018-05-27.sql000060400000001006152453623440017557 0ustar00INSERT 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
(486, 0, 'plg_system_logrotation', 'plugin', 'logrotation', 'system', 0, 1, 1, 0, '', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0),
(487, 0, 'plg_privacy_user', 'plugin', 'user', 'privacy', 0, 1, 1, 0, '', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0);
components/com_admin/sql/updates/postgresql/3.9.16-2020-03-04.sql000060400000000175152453623440017636 0ustar00DROP INDEX IF EXISTS "#__users_username";
ALTER TABLE "#__users" ADD CONSTRAINT "#__users_idx_username" UNIQUE ("username");
components/com_admin/sql/updates/postgresql/3.2.2-2014-01-23.sql000060400000001140152453623440017535 0ustar00INSERT 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);
components/com_admin/sql/updates/postgresql/3.9.0-2018-05-20.sql000060400000000610152453623440017550 0ustar00INSERT 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
(319, 0, 'mod_latestactions', 'module', 'mod_latestactions', '', 1, 1, 1, 0, '', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0);
components/com_admin/sql/updates/postgresql/3.7.0-2017-03-09.sql000060400000001353152453623440017557 0ustar00UPDATE "#__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;
components/com_admin/sql/updates/postgresql/3.9.0-2018-08-29.sql000060400000000717152453623440017574 0ustar00INSERT 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
(494, 0, 'plg_captcha_recaptcha_invisible', 'plugin', 'recaptcha_invisible', 'captcha', 0, 0, 1, 0, '', '{"public_key":"","private_key":"","theme":"clean"}', '', '', 0, '1970-01-01 00:00:00', 0, 0);
components/com_admin/sql/updates/postgresql/3.6.3-2016-08-15.sql000060400000000211152453623440017552 0ustar00--
-- Increasing size of the URL field in com_newsfeeds
--

ALTER TABLE "#__newsfeeds" ALTER COLUMN "link" TYPE character varying(2048);
components/com_admin/sql/updates/postgresql/3.7.0-2016-08-22.sql000060400000000566152453623440017563 0ustar00INSERT 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);
components/com_admin/sql/updates/postgresql/3.8.0-2017-07-28.sql000060400000000102152453623440017554 0ustar00ALTER TABLE "#__fields_groups" ADD COLUMN "params" TEXT NOT NULL;
components/com_admin/sql/updates/postgresql/3.2.2-2013-12-28.sql000060400000000254152453623440017550 0ustar00UPDATE "#__menu" SET "component_id" = (SELECT "extension_id" FROM "#__extensions" WHERE "element" = 'com_joomlaupdate') WHERE "link" = 'index.php?option=com_joomlaupdate';
components/com_admin/sql/updates/postgresql/3.2.2-2014-01-18.sql000060400000000160152453623440017542 0ustar00/* Update updates version length */
ALTER TABLE "#__updates" ALTER COLUMN "version" TYPE character varying(32);
components/com_admin/sql/updates/postgresql/3.8.6-2018-02-14.sql000060400000002017152453623440017560 0ustar00INSERT 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);
components/com_admin/sql/updates/postgresql/3.9.0-2018-08-12.sql000060400000000121152453623440017551 0ustar00ALTER TABLE "#__privacy_consents" ADD COLUMN "state" smallint DEFAULT 1 NOT NULL;components/com_admin/sql/updates/postgresql/3.9.26-2021-04-07.sql000060400000001242152453623440017640 0ustar00INSERT INTO "#__postinstall_messages" ("extension_id", "title_key", "description_key", "action_key", "language_extension", "language_client_id", "type", "version_introduced", "enabled", "condition_file", "condition_method", "action_file", "action")
VALUES
(700, 'COM_ADMIN_POSTINSTALL_MSG_BEHIND_LOAD_BALANCER_TITLE', 'COM_ADMIN_POSTINSTALL_MSG_BEHIND_LOAD_BALANCER_DESCRIPTION', 'COM_ADMIN_POSTINSTALL_MSG_BEHIND_LOAD_BALANCER_ACTION', 'com_admin', 1, 'action', '3.9.26', 1, 'admin://components/com_admin/postinstall/behindproxy.php', 'admin_postinstall_behindproxy_condition', 'admin://components/com_admin/postinstall/behindproxy.php', 'behindproxy_postinstall_action');
components/com_admin/sql/updates/postgresql/3.5.0-2015-10-13.sql000060400000000572152453623440017546 0ustar00INSERT 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);
components/com_admin/sql/updates/postgresql/3.7.0-2016-11-19.sql000060400000000243152453623440017553 0ustar00ALTER TABLE "#__menu_types" ADD COLUMN "client_id" int DEFAULT 0 NOT NULL;

UPDATE "#__menu" SET "published" = 1 WHERE "menutype" = 'main' OR "menutype" = 'menu';
components/com_admin/sql/updates/postgresql/3.0.1.sql000060400000000071152453623440016510 0ustar00# Placeholder file for database changes for version 3.0.1components/com_admin/sql/updates/postgresql/3.6.0-2016-05-06.sql000060400000001363152453623440017555 0ustar00DELETE 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);
components/com_admin/sql/updates/postgresql/3.7.0-2017-01-09.sql000060400000001031152453623440017546 0ustar00-- Normalize categories table default values.
ALTER TABLE "#__categories" ALTER COLUMN "title" SET DEFAULT '';
--
-- The following statement has to be disabled because it conflicts with
-- a later change added with Joomla! 3.9.16, see file 3.9.16-2020-02-15.sql
--
-- 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 '';
components/com_admin/sql/updates/postgresql/3.9.15-2020-01-08.sql000060400000000104152453623440017627 0ustar00CREATE INDEX "#__users_email_lower" ON "#__users" (lower("email"));
components/com_admin/sql/updates/postgresql/3.9.0-2018-05-03.sql000060400000000625152453623440017557 0ustar00INSERT 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
(482, 0, 'plg_content_confirmconsent', 'plugin', 'confirmconsent', 'content', 0, 0, 1, 0, '', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0);
components/com_admin/sql/updates/postgresql/3.9.7-2019-04-23.sql000060400000000126152453623440017564 0ustar00CREATE INDEX "#__session_idx_client_id_guest" ON "#__session" ("client_id", "guest");
components/com_admin/sql/updates/postgresql/3.7.0-2016-10-02.sql000060400000000101152453623440017533 0ustar00ALTER TABLE "#__session" ALTER COLUMN "client_id" DROP NOT NULL;
components/com_admin/sql/updates/postgresql/3.6.0-2016-06-05.sql000060400000000167152453623440017556 0ustar00--
-- Add ACL check for to #__languages
--

ALTER TABLE "#__languages" ADD COLUMN "asset_id" bigint DEFAULT 0 NOT NULL;components/com_admin/sql/updates/postgresql/3.8.8-2018-05-18.sql000060400000001021152453623440017563 0ustar00INSERT 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);
components/com_admin/sql/updates/postgresql/3.7.0-2016-08-06.sql000060400000000610152453623440017553 0ustar00INSERT 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);
components/com_admin/sql/updates/postgresql/3.2.0.sql000060400000050351152453623440016517 0ustar00/* 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) 2013 Open Source Matters, Inc.\\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) 2013 Open Source Matters, Inc.","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) 2013 Open Source Matters, Inc.","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":"(C) 2013 Open Source Matters, Inc.","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) 2013 Open Source Matters, Inc.","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";
components/com_admin/sql/updates/postgresql/3.5.0-2015-10-26.sql000060400000000133152453623440017543 0ustar00DROP INDEX "#__contentitem_tag_map_idx_tag";
DROP INDEX "#__contentitem_tag_map_idx_type";
components/com_admin/sql/updates/postgresql/3.9.8-2019-06-15.sql000060400000000466152453623440017577 0ustar00DROP INDEX IF EXISTS "#__template_styles_idx_home";
# Queries removed, see https://github.com/joomla/joomla-cms/pull/25484
CREATE INDEX "#__template_styles_idx_client_id" ON "#__template_styles" ("client_id");
CREATE INDEX "#__template_styles_idx_client_id_home" ON "#__template_styles" ("client_id", "home");
components/com_admin/sql/updates/postgresql/3.3.0-2014-04-02.sql000060400000000632152453623440017541 0ustar00INSERT 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);

components/com_admin/sql/updates/postgresql/3.7.0-2017-01-17.sql000060400000004707152453623440017562 0ustar00-- 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');
components/com_admin/sql/updates/postgresql/3.9.0-2018-08-28.sql000060400000000736152453623440017574 0ustar00ALTER TABLE "#__session" ALTER COLUMN "session_id" DROP DEFAULT;
ALTER TABLE "#__session" ALTER COLUMN "session_id" TYPE bytea USING "session_id"::bytea;
ALTER TABLE "#__session" ALTER COLUMN "session_id" SET NOT NULL;
ALTER TABLE "#__session" ALTER COLUMN "time" DROP DEFAULT,
                         ALTER COLUMN "time" TYPE integer USING "time"::integer;
ALTER TABLE "#__session" ALTER COLUMN "time" SET DEFAULT 0;
ALTER TABLE "#__session" ALTER COLUMN "time" SET NOT NULL;
components/com_admin/sql/updates/postgresql/3.7.4-2017-07-05.sql000060400000000134152453623440017557 0ustar00DELETE FROM "#__postinstall_messages" WHERE "title_key" = 'COM_CPANEL_MSG_PHPVERSION_TITLE';components/com_admin/sql/updates/postgresql/3.9.21-2020-08-02.sql000060400000000752152453623440017636 0ustar00INSERT 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_HTACCESSSVG_TITLE', 'COM_CPANEL_MSG_HTACCESSSVG_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/htaccesssvg.php', 'admin_postinstall_htaccesssvg_condition', '3.9.21', 1);
components/com_admin/sql/updates/postgresql/3.9.0-2018-06-17.sql000060400000000575152453623440017571 0ustar00INSERT 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
(489, 0, 'plg_user_terms', 'plugin', 'terms', 'user', 0, 0, 1, 0, '', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0);
components/com_admin/sql/updates/postgresql/3.3.0-2013-12-21.sql000060400000000070152453623440017534 0ustar00# Placeholder file to set the database schema for 3.3.0
components/com_admin/sql/updates/postgresql/3.1.0.sql000060400000047144152453623440016524 0ustar00/* Changes to tables where data type conflicts exist with MySQL (mainly dealing with null values */

--
-- The following statement has to be disabled because it conflicts with
-- a later change added with Joomla! 3.9.16, see file 3.9.16-2020-02-15.sql
--
-- ALTER TABLE "#__modules" ALTER COLUMN "content" SET DEFAULT '';
--
-- The following statement has to be disabled because it conflicts with
-- a later change added with Joomla! 3.8.8 to repair the update of database schema changes
--
-- 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,
  "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) 2013 Open Source Matters, Inc.","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":"(C) 2012 Open Source Matters, Inc.","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":"(C) 2013 Open Source Matters, Inc.","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":"(C) 2013 Open Source Matters, Inc.","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) 2013 Open Source Matters, Inc.","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);
components/com_admin/sql/updates/postgresql/3.4.0-2014-08-24.sql000060400000000735152453623440017556 0ustar00INSERT 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);
components/com_admin/sql/updates/postgresql/3.2.1.sql000060400000000150152453623440016510 0ustar00DELETE FROM "#__postinstall_messages" WHERE "title_key" = 'PLG_USER_JOOMLA_POSTINSTALL_STRONGPW_TITLE';
components/com_admin/sql/updates/postgresql/3.7.0-2017-02-02.sql000060400000000572152453623440017551 0ustar00INSERT 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);
components/com_admin/sql/updates/postgresql/3.3.4-2014-08-03.sql000060400000000107152453623440017547 0ustar00ALTER TABLE "#__user_profiles" ALTER COLUMN "profile_value" TYPE text;
components/com_admin/sql/updates/postgresql/3.4.0-2015-02-26.sql000060400000001001152453623440017536 0ustar00INSERT 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);
components/com_admin/sql/updates/postgresql/3.7.0-2016-11-24.sql000060400000000453152453623440017552 0ustar00ALTER 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';
components/com_admin/sql/updates/postgresql/3.9.0-2018-05-05.sql000060400000010621152453623440017556 0ustar00INSERT 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
(36, 0, 'com_actionlogs', 'component', 'com_actionlogs', '', 1, 1, 1, 1, '', '{"ip_logging":0,"csv_delimiter":",","loggable_extensions":["com_banners","com_cache","com_categories","com_config","com_contact","com_content","com_installer","com_media","com_menus","com_messages","com_modules","com_newsfeeds","com_plugins","com_redirect","com_tags","com_templates","com_users"]}', '', '', 0, '1970-01-01 00:00:00', 0, 0),
(483, 0, 'plg_system_actionlogs', 'plugin', 'actionlogs', 'system', 0, 0, 1, 0, '', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0),
(484, 0, 'plg_actionlog_joomla', 'plugin', 'joomla', 'actionlog', 0, 1, 1, 0, '', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0);

--
-- Table: #__action_logs
--
CREATE TABLE "#__action_logs" (
  "id" serial NOT NULL,
  "message_language_key" varchar(255) NOT NULL DEFAULT '',
  "message" text NOT NULL DEFAULT '',
  "log_date" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL,
  "extension" varchar(50) NOT NULL DEFAULT '',
  "user_id" integer DEFAULT 0 NOT NULL,
  "item_id" integer DEFAULT 0 NOT NULL,
  "ip_address" varchar(40) NOT NULL DEFAULT '0.0.0.0',
  PRIMARY KEY ("id")
);

-- Table: #__action_logs_extensions
--
CREATE TABLE "#__action_logs_extensions" (
  "id" serial NOT NULL,
  "extension" varchar(50) NOT NULL DEFAULT '',
  PRIMARY KEY ("id")
);

--
-- Dumping data for table '#__action_logs_extensions'
--
INSERT INTO "#__action_logs_extensions" ("id", "extension") VALUES
(1, 'com_banners'),
(2, 'com_cache'),
(3, 'com_categories'),
(4, 'com_config'),
(5, 'com_contact'),
(6, 'com_content'),
(7, 'com_installer'),
(8, 'com_media'),
(9, 'com_menus'),
(10, 'com_messages'),
(11, 'com_modules'),
(12, 'com_newsfeeds'),
(13, 'com_plugins'),
(14, 'com_redirect'),
(15, 'com_tags'),
(16, 'com_templates'),
(17, 'com_users');

SELECT setval('#__action_logs_extensions_id_seq', 18, false);
-- --------------------------------------------------------

--
-- Table: #__action_log_config
--
CREATE TABLE "#__action_log_config" (
  "id" serial NOT NULL,
  "type_title" varchar(255) NOT NULL DEFAULT '',
  "type_alias" varchar(255) NOT NULL DEFAULT '',
  "id_holder" varchar(255) NULL,
  "title_holder" varchar(255) NULL,
  "table_name" varchar(255) NULL,
  "text_prefix" varchar(255) NULL,
  PRIMARY KEY ("id")
);

--
-- Dumping data for table #__action_log_config
--
INSERT INTO "#__action_log_config" ("id", "type_title", "type_alias", "id_holder", "title_holder", "table_name", "text_prefix") VALUES
(1, 'article', 'com_content.article', 'id' ,'title' , '#__content', 'PLG_ACTIONLOG_JOOMLA'),
(2, 'article', 'com_content.form', 'id', 'title' , '#__content', 'PLG_ACTIONLOG_JOOMLA'),
(3, 'banner', 'com_banners.banner', 'id' ,'name' , '#__banners', 'PLG_ACTIONLOG_JOOMLA'),
(4, 'user_note', 'com_users.note', 'id', 'subject' ,'#__user_notes', 'PLG_ACTIONLOG_JOOMLA'),
(5, 'media', 'com_media.file', '' , 'name' , '',  'PLG_ACTIONLOG_JOOMLA'),
(6, 'category', 'com_categories.category', 'id' , 'title' , '#__categories', 'PLG_ACTIONLOG_JOOMLA'),
(7, 'menu', 'com_menus.menu', 'id' ,'title' , '#__menu_types', 'PLG_ACTIONLOG_JOOMLA'),
(8, 'menu_item', 'com_menus.item', 'id' , 'title' , '#__menu', 'PLG_ACTIONLOG_JOOMLA'),
(9, 'newsfeed', 'com_newsfeeds.newsfeed', 'id' ,'name' , '#__newsfeeds', 'PLG_ACTIONLOG_JOOMLA'),
(10, 'link', 'com_redirect.link', 'id', 'old_url' , '#__redirect_links', 'PLG_ACTIONLOG_JOOMLA'),
(11, 'tag', 'com_tags.tag', 'id', 'title' , '#__tags', 'PLG_ACTIONLOG_JOOMLA'),
(12, 'style', 'com_templates.style', 'id' , 'title' , '#__template_styles', 'PLG_ACTIONLOG_JOOMLA'),
(13, 'plugin', 'com_plugins.plugin', 'extension_id' , 'name' , '#__extensions', 'PLG_ACTIONLOG_JOOMLA'),
(14, 'component_config', 'com_config.component', 'extension_id' , 'name', '', 'PLG_ACTIONLOG_JOOMLA'),
(15, 'contact', 'com_contact.contact', 'id', 'name', '#__contact_details', 'PLG_ACTIONLOG_JOOMLA'),
(16, 'module', 'com_modules.module', 'id' ,'title', '#__modules', 'PLG_ACTIONLOG_JOOMLA'),
(17, 'access_level', 'com_users.level', 'id' , 'title', '#__viewlevels', 'PLG_ACTIONLOG_JOOMLA'),
(18, 'banner_client', 'com_banners.client', 'id', 'name', '#__banner_clients', 'PLG_ACTIONLOG_JOOMLA');


SELECT setval('#__action_log_config_id_seq', 18, false);
components/com_admin/sql/updates/postgresql/3.8.0-2017-07-31.sql000060400000001003152453623440017547 0ustar00INSERT 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);
components/com_admin/sql/updates/postgresql/3.7.0-2017-01-08.sql000060400000001442152453623440017553 0ustar00-- Normalize ucm_content_table default values.
ALTER TABLE "#__ucm_content" ALTER COLUMN "core_title" SET DEFAULT '';

--
-- The following statements have to be disabled because they conflict with
-- a later change added with Joomla! 3.9.16, see file 3.9.16-2020-02-15.sql
--
-- 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 '';
components/com_admin/sql/updates/postgresql/3.8.9-2018-06-19.sql000060400000000152152453623440017572 0ustar00-- Enable Sample Data Module.
UPDATE "#__extensions" SET "enabled" = '1' WHERE "name" = 'mod_sampledata';
components/com_admin/sql/updates/postgresql/3.9.0-2018-05-02.sql000060400000002044152453623440017553 0ustar00INSERT 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
(35, 0, 'com_privacy', 'component', 'com_privacy', '', 1, 1, 1, 1, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0);

CREATE TABLE "#__privacy_requests" (
  "id" serial NOT NULL,
  "email" varchar(100) DEFAULT '' NOT NULL,
  "requested_at" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL,
  "status" smallint DEFAULT 0 NOT NULL,
  "request_type" varchar(25) DEFAULT '' NOT NULL,
  "confirm_token" varchar(100) DEFAULT '' NOT NULL,
  "confirm_token_created_at" timestamp without time zone DEFAULT '1970-01-01 00:00:00' 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,
  PRIMARY KEY ("id")
);
CREATE INDEX "#__privacy_requests_idx_checked_out" ON "#__privacy_requests" ("checked_out");
components/com_admin/sql/updates/postgresql/3.5.0-2016-03-01.sql000060400000000624152453623440017544 0ustar00ALTER 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");
components/com_admin/sql/updates/postgresql/3.4.0-2014-12-03.sql000060400000000244152453623440017541 0ustar00UPDATE "#__extensions" SET "protected" = '0' WHERE "name" = 'plg_editors-xtd_article' AND "type" = 'plugin' AND "element" = 'article' AND "folder" = 'editors-xtd';
components/com_admin/sql/updates/postgresql/3.4.0-2014-10-20.sql000060400000000070152453623440017533 0ustar00DELETE FROM "#__extensions" WHERE "extension_id" = 100;
components/com_admin/sql/updates/postgresql/3.10.0-2021-05-28.sql000060400000000564152453623440017632 0ustar00INSERT INTO "#__extensions" ("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
(0, 'plg_quickicon_eos310', 'plugin', 'eos310', 'quickicon', 0, 1, 1, 0, '', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0);
components/com_admin/sql/updates/postgresql/3.0.0.sql000060400000000072152453623440016510 0ustar00-- Placeholder file for database changes for version 3.0.0components/com_admin/sql/updates/postgresql/3.2.2-2014-01-08.sql000060400000000564152453623440017551 0ustar00INSERT 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);
components/com_admin/sql/updates/postgresql/3.7.0-2016-09-29.sql000060400000000777152453623440017577 0ustar00INSERT 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);
components/com_admin/sql/updates/postgresql/3.9.0-2018-07-10.sql000060400000000346152453623440017557 0ustar00INSERT INTO "#__action_log_config" ("id", "type_title", "type_alias", "id_holder", "title_holder", "table_name", "text_prefix")
	VALUES (19, 'application_config', 'com_config.application', '', 'name', '', 'PLG_ACTIONLOG_JOOMLA');
components/com_admin/sql/updates/postgresql/3.9.0-2018-06-02.sql000060400000001535152453623440017560 0ustar00ALTER TABLE "#__content" ADD COLUMN "note" VARCHAR(255) NOT NULL DEFAULT '';

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", "note":"note"}, "special":{"fulltext":"fulltext"}}' WHERE "type_alias" = 'com_content.article';
components/com_admin/sql/updates/postgresql/3.8.2-2017-10-14.sql000060400000000156152453623440017554 0ustar00--
-- Add index for alias check #__content
--

CREATE INDEX "#__content_idx_alias" ON "#__content" ("alias");
components/com_admin/sql/updates/postgresql/3.10.0-2020-08-10.sql000060400000000517152453623440017621 0ustar00--
-- These database columns are not used in Joomla 3.10 but will be used in Joomla 4.
-- They are added to 3.10 because otherwise the update to 4 will fail.
--
ALTER TABLE "#__template_styles" ADD COLUMN "inheritable" smallint NOT NULL DEFAULT 0;
ALTER TABLE "#__template_styles" ADD COLUMN "parent" character varying(50) DEFAULT '';
components/com_admin/sql/updates/postgresql/3.4.0-2015-01-21.sql000060400000000577152453623440017551 0ustar00INSERT 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);components/com_admin/sql/updates/postgresql/3.10.7-2022-02-20.sql000060400000000152152453623440017620 0ustar00DELETE FROM "#__postinstall_messages" WHERE "title_key" = 'COM_ADMIN_POSTINSTALL_MSG_FLOC_BLOCKER_TITLE';
components/com_admin/sql/updates/postgresql/3.9.7-2019-04-26.sql000060400000000522152453623440017567 0ustar00UPDATE "#__content_types" SET "content_history_options" = REPLACE("content_history_options", '\"ignoreChanges\":[\"modified_by\", \"modified\", \"checked_out\", \"checked_out_time\", \"version\", \"hits\"]', '\"ignoreChanges\":[\"modified_by\", \"modified\", \"checked_out\", \"checked_out_time\", \"version\", \"hits\", \"ordering\"]');
components/com_admin/sql/updates/postgresql/3.5.0-2015-11-04.sql000060400000000730152453623440017543 0ustar00DELETE 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);
components/com_admin/sql/updates/postgresql/3.0.3.sql000060400000000074152453623440016515 0ustar00ALTER TABLE "#__associations" ALTER COLUMN id TYPE integer;
components/com_admin/sql/updates/postgresql/3.9.0-2018-10-21.sql000060400000000611152453623440017546 0ustar00INSERT 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
(495, 0, 'plg_privacy_consents', 'plugin', 'consents', 'privacy', 0, 1, 1, 0, '', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0);
components/com_admin/sql/updates/postgresql/3.4.0-2014-09-16.sql000060400000000460152453623440017553 0ustar00ALTER 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;
components/com_admin/sql/updates/postgresql/3.6.0-2016-04-09.sql000060400000000171152453623440017553 0ustar00--
-- Add ACL check for to #__menu_types
--

ALTER TABLE "#__menu_types" ADD COLUMN "asset_id" bigint DEFAULT 0 NOT NULL;components/com_admin/sql/updates/postgresql/3.9.0-2018-05-19.sql000060400000000611152453623440017561 0ustar00INSERT 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
(481, 0, 'plg_fields_repeatable', 'plugin', 'repeatable', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1970-01-01 00:00:00', 0, 0);
components/com_admin/sql/updates/postgresql/3.7.0-2016-08-29.sql000060400000013042152453623440017563 0ustar00--
-- 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,
  "type" varchar(255) DEFAULT 'text' NOT NULL,
  "note" varchar(255) DEFAULT '' NOT NULL,
  "description" text,
  "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,
  "fieldparams" text,
  "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,
  "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
);
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);

components/com_admin/sql/updates/postgresql/3.3.6-2014-09-30.sql000060400000000727152453623440017562 0ustar00INSERT 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'));
components/com_admin/sql/updates/postgresql/3.3.0-2014-02-16.sql000060400000000244152453623440017543 0ustar00ALTER TABLE "#__users" ADD COLUMN "requireReset" smallint DEFAULT 0;
COMMENT ON COLUMN "#__users"."requireReset" IS 'Require user to reset password on next login';
components/com_admin/sql/updates/postgresql/3.7.0-2016-11-04.sql000060400000000101152453623440017536 0ustar00ALTER TABLE "#__extensions" ALTER COLUMN "enabled" SET DEFAULT 0;components/com_admin/sql/updates/postgresql/3.9.0-2018-06-14.sql000060400000001022152453623440017552 0ustar00INSERT 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_ACTIONLOGS_POSTINSTALL_TITLE', 'COM_ACTIONLOGS_POSTINSTALL_BODY', '', 'com_actionlogs', 1, 'message', '', '', '', '', '3.9.0', 1),
(700, 'COM_PRIVACY_POSTINSTALL_TITLE', 'COM_PRIVACY_POSTINSTALL_BODY', '', 'com_privacy', 1, 'message', '', '', '', '', '3.9.0', 1);components/com_admin/sql/updates/postgresql/3.9.0-2018-06-13.sql000060400000000625152453623440017561 0ustar00INSERT 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
(488, 0, 'plg_quickicon_privacycheck', 'plugin', 'privacycheck', 'quickicon', 0, 1, 1, 0, '', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0);
components/com_admin/sql/updates/postgresql/3.9.10-2019-07-09.sql000060400000000226152453623440017646 0ustar00ALTER TABLE "#__template_styles" ALTER COLUMN "home" TYPE character varying(7);
ALTER TABLE "#__template_styles" ALTER COLUMN "home" SET DEFAULT '0';
components/com_admin/sql/updates/postgresql/3.9.22-2020-09-16.sql000060400000000546152453623440017646 0ustar00INSERT INTO "#__postinstall_messages" ("extension_id", "title_key", "description_key", "action_key", "language_extension", "language_client_id", "type", "version_introduced", "enabled")
VALUES
(700, 'COM_ADMIN_POSTINSTALL_MSG_HTACCESS_AUTOINDEX_TITLE', 'COM_ADMIN_POSTINSTALL_MSG_HTACCESS_AUTOINDEX_DESCRIPTION', '', 'com_admin', 1, 'message', '3.9.22', 1);
components/com_admin/sql/updates/postgresql/3.7.0-2017-02-17.sql000060400000001052152453623440017551 0ustar00-- 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 '';
components/com_admin/sql/updates/postgresql/3.1.4.sql000060400000000554152453623440016522 0ustar00INSERT 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);
components/com_admin/sql/updates/postgresql/3.10.7-2022-03-18.sql000060400000000123152453623440017626 0ustar00ALTER TABLE "#__users" ADD COLUMN "authProvider" varchar(100) DEFAULT '' NOT NULL;
components/com_admin/sql/updates/postgresql/3.1.3.sql000060400000000072152453623440016514 0ustar00# Placeholder file for database changes for version 3.1.3
components/com_admin/sql/updates/postgresql/3.9.3-2019-02-07.sql000060400000000745152453623440017567 0ustar00INSERT 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_ADDNOSNIFF_TITLE', 'COM_CPANEL_MSG_ADDNOSNIFF_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/addnosniff.php', 'admin_postinstall_addnosniff_condition', '3.9.3', 1);
components/com_admin/sql/updates/postgresql/3.5.0-2015-11-05.sql000060400000001552152453623440017547 0ustar00INSERT 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);
components/com_admin/sql/updates/postgresql/3.0.2.sql000060400000000071152453623440016511 0ustar00# Placeholder file for database changes for version 3.0.2components/com_admin/sql/updates/postgresql/3.4.0-2014-09-01.sql000060400000001347152453623440017552 0ustar00INSERT 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);
components/com_admin/sql/updates/postgresql/3.7.0-2016-10-01.sql000060400000000574152453623440017550 0ustar00INSERT 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);
components/com_admin/sql/updates/postgresql/3.6.0-2016-06-01.sql000060400000000125152453623440017544 0ustar00UPDATE "#__extensions" SET "protected" = 1, "enabled" = 1 WHERE "name" = 'com_ajax';
components/com_admin/sql/updates/postgresql/3.6.3-2016-10-04.sql000060400000000570152453623440017551 0ustar00ALTER TABLE "#__finder_links" ALTER COLUMN "title" TYPE character varying(400);
ALTER TABLE "#__finder_links" ALTER COLUMN "description" TYPE text;
--
-- The following statement has to be disabled because it conflicts with
-- a later change added with Joomla! 3.9.16, see file 3.9.16-2020-02-15.sql
--
-- ALTER TABLE "#__finder_links" ALTER COLUMN "description" SET NOT NULL;
components/com_admin/sql/updates/postgresql/3.7.0-2016-11-21.sql000060400000000200152453623440017535 0ustar00-- Replace language image UNIQUE index for a normal INDEX.
ALTER TABLE "#__languages" DROP CONSTRAINT "#__languages_idx_image";
components/com_admin/sql/updates/postgresql/3.7.0-2017-04-10.sql000060400000001144152453623440017546 0ustar00INSERT 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);components/com_admin/sql/updates/postgresql/3.9.0-2018-07-11.sql000060400000000615152453623440017557 0ustar00INSERT 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
(493, 0, 'plg_privacy_actionlogs', 'plugin', 'actionlogs', 'privacy', 0, 1, 1, 0, '', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0);
components/com_admin/sql/updates/postgresql/3.9.8-2019-06-11.sql000060400000000102152453623440017556 0ustar00UPDATE "#__users" SET "params" = REPLACE("params", '",,"', '","');components/com_admin/sql/updates/postgresql/3.7.0-2017-04-19.sql000060400000000247152453623440017562 0ustar00-- Set integer field default values.
UPDATE "#__extensions" SET "params" = '{"multiple":"0","first":"1","last":"100","step":"1"}' WHERE "name" = 'plg_fields_integer';
components/com_admin/sql/updates/postgresql/3.7.0-2017-01-31.sql000060400000000562152453623440017551 0ustar00INSERT 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);
components/com_admin/sql/updates/postgresql/3.1.2.sql000060400000021415152453623440016517 0ustar00UPDATE "#__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';
components/com_admin/sql/updates/postgresql/3.9.0-2018-10-15.sql000060400000000557152453623440017562 0ustar00CREATE INDEX "#__action_logs_idx_user_id" ON "#__action_logs" ("user_id"); 
CREATE INDEX "#__action_logs_idx_user_id_logdate" ON "#__action_logs" ("user_id", "log_date"); 
CREATE INDEX "#__action_logs_idx_user_id_extension" ON "#__action_logs" ("user_id", "extension");
CREATE INDEX "#__action_logs_idx_extension_itemid" ON "#__action_logs" ("extension", "item_id");
components/com_admin/sql/updates/postgresql/3.9.0-2018-07-09.sql000060400000001205152453623440017562 0ustar00INSERT 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
(490, 0, 'plg_privacy_contact', 'plugin', 'contact', 'privacy', 0, 1, 1, 0, '', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0),
(491, 0, 'plg_privacy_content', 'plugin', 'content', 'privacy', 0, 1, 1, 0, '', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0),
(492, 0, 'plg_privacy_message', 'plugin', 'message', 'privacy', 0, 1, 1, 0, '', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0);
components/com_admin/sql/updates/postgresql/3.9.3-2019-01-12.sql000060400000000476152453623440017563 0ustar00UPDATE "#__extensions" 
SET "params" = REPLACE("params", '"com_categories",', '"com_categories","com_checkin",')
WHERE "name" = 'com_actionlogs';

INSERT INTO "#__action_logs_extensions" ("extension") VALUES
('com_checkin');

SELECT setval('#__action_logs_extensions_id_seq', max(id)) FROM "#__action_logs_extensions";components/com_admin/sql/updates/postgresql/3.7.0-2017-03-03.sql000060400000000413152453623440017545 0ustar00ALTER 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 '';
components/com_admin/sql/updates/postgresql/3.1.5.sql000060400000000072152453623440016516 0ustar00# Placeholder file for database changes for version 3.1.5
components/com_admin/sql/updates/postgresql/3.9.0-2018-06-12.sql000060400000000620152453623440017553 0ustar00INSERT 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
(320, 0, 'mod_privacy_dashboard', 'module', 'mod_privacy_dashboard', '', 1, 1, 1, 0, '', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0);
components/com_admin/sql/updates/postgresql/3.9.7-2019-05-16.sql000060400000000105152453623440017564 0ustar00# Query removed, see https://github.com/joomla/joomla-cms/pull/25177
components/com_admin/sql/updates/postgresql/3.9.16-2020-02-15.sql000060400000004320152453623440017633 0ustar00ALTER TABLE "#__categories" ALTER COLUMN "description" DROP NOT NULL;
ALTER TABLE "#__categories" ALTER COLUMN "description" DROP DEFAULT;

ALTER TABLE "#__categories" ALTER COLUMN "params" DROP NOT NULL;
ALTER TABLE "#__categories" ALTER COLUMN "params" DROP DEFAULT;

ALTER TABLE "#__fields" ALTER COLUMN "default_value" DROP NOT NULL;
ALTER TABLE "#__fields" ALTER COLUMN "default_value" DROP DEFAULT;

ALTER TABLE "#__fields" ALTER COLUMN "description" DROP DEFAULT;

ALTER TABLE "#__fields" ALTER COLUMN "params" DROP DEFAULT;

ALTER TABLE "#__fields" ALTER COLUMN "fieldparams" DROP DEFAULT;

ALTER TABLE "#__fields_groups" ALTER COLUMN "params" DROP DEFAULT;

ALTER TABLE "#__fields_values" ALTER COLUMN "value" DROP NOT NULL;
ALTER TABLE "#__fields_values" ALTER COLUMN "value" DROP DEFAULT;

ALTER TABLE "#__finder_links" ALTER COLUMN "description" DROP NOT NULL;
ALTER TABLE "#__finder_links" ALTER COLUMN "description" DROP DEFAULT;

ALTER TABLE "#__menu" ALTER COLUMN "params" DROP DEFAULT;

ALTER TABLE "#__modules" ALTER COLUMN "content" DROP NOT NULL;
ALTER TABLE "#__modules" ALTER COLUMN "content" DROP DEFAULT;

ALTER TABLE "#__tags" ALTER COLUMN "description" DROP DEFAULT;

ALTER TABLE "#__ucm_content" ALTER COLUMN "core_body" DROP NOT NULL;
ALTER TABLE "#__ucm_content" ALTER COLUMN "core_body" DROP DEFAULT;

ALTER TABLE "#__ucm_content" ALTER COLUMN "core_params" DROP NOT NULL;
ALTER TABLE "#__ucm_content" ALTER COLUMN "core_params" DROP DEFAULT;

ALTER TABLE "#__ucm_content" ALTER COLUMN "core_metadata" DROP NOT NULL;
ALTER TABLE "#__ucm_content" ALTER COLUMN "core_metadata" DROP DEFAULT;

ALTER TABLE "#__ucm_content" ALTER COLUMN "core_images" DROP NOT NULL;
ALTER TABLE "#__ucm_content" ALTER COLUMN "core_images" DROP DEFAULT;

ALTER TABLE "#__ucm_content" ALTER COLUMN "core_urls" DROP NOT NULL;
ALTER TABLE "#__ucm_content" ALTER COLUMN "core_urls" DROP DEFAULT;

ALTER TABLE "#__ucm_content" ALTER COLUMN "core_metakey" DROP NOT NULL;
ALTER TABLE "#__ucm_content" ALTER COLUMN "core_metakey" DROP DEFAULT;

ALTER TABLE "#__ucm_content" ALTER COLUMN "core_metadesc" DROP NOT NULL;
ALTER TABLE "#__ucm_content" ALTER COLUMN "core_metadesc" DROP DEFAULT;

ALTER TABLE "#__action_logs" ALTER COLUMN "message" DROP DEFAULT;
components/com_admin/sql/updates/postgresql/3.9.19-2020-06-01.sql000060400000000766152453623440017647 0ustar00INSERT 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_TEXTFILTER3919_TITLE', 'COM_CPANEL_MSG_TEXTFILTER3919_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/textfilter3919.php', 'admin_postinstall_textfilter3919_condition', '3.9.19', 1);
components/com_admin/sql/updates/postgresql/3.9.0-2018-05-24.sql000060400000001611152453623440017556 0ustar00INSERT 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
(485, 0, 'plg_system_privacyconsent', 'plugin', 'privacyconsent', 'system', 0, 0, 1, 0, '', '{}', '', '', 0, '1970-01-01 00:00:00', 0, 0);

--
-- Table structure for table `#__privacy_consents`
--

CREATE TABLE "#__privacy_consents" (
  "id" serial NOT NULL,
  "user_id" bigint DEFAULT 0 NOT NULL,
  "created" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL,
  "subject" varchar(255) DEFAULT '' NOT NULL,
  "body" text NOT NULL,
  "remind" smallint DEFAULT 0 NOT NULL,
  "token" varchar(100) DEFAULT '' NOT NULL,
  PRIMARY KEY ("id")
);
CREATE INDEX "#__privacy_consents_idx_user_id" ON "#__privacy_consents" ("user_id");
components/com_admin/sql/updates/postgresql/3.6.3-2016-08-16.sql000060400000001352152453623440017562 0ustar00INSERT 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);components/com_admin/sql/updates/postgresql/3.2.2-2014-01-15.sql000060400000000745152453623440017550 0ustar00INSERT 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);
components/com_admin/sql/updates/postgresql/3.2.3-2014-02-20.sql000060400000000236152453623440017541 0ustar00UPDATE "#__extensions" SET "params" = (SELECT "params" FROM "#__extensions" WHERE "name" = 'plg_system_remember') WHERE "name" = 'plg_authentication_cookie';
components/com_admin/sql/updates/postgresql/3.2.2-2013-12-22.sql000060400000000235152453623440017541 0ustar00ALTER TABLE "#__update_sites" ADD COLUMN "extra_query" varchar(1000) DEFAULT '';
ALTER TABLE "#__updates" ADD COLUMN "extra_query" varchar(1000) DEFAULT '';
components/com_admin/sql/updates/postgresql/3.6.0-2016-04-01.sql000060400000001651152453623440017547 0ustar00-- 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';
components/com_admin/sql/updates/postgresql/3.9.0-2018-09-04.sql000060400000000362152453623440017562 0ustar00CREATE TABLE "#__action_logs_users" (
  "user_id" integer NOT NULL,
  "notify" integer NOT NULL,
  "extensions" text NOT NULL,
  PRIMARY KEY ("user_id")
);

CREATE INDEX "#__action_logs_users_idx_notify" ON "#__action_logs_users" ("notify");
components/com_admin/sql/updates/postgresql/3.4.4-2015-07-11.sql000060400000000242152453623440017547 0ustar00ALTER TABLE "#__contentitem_tag_map" DROP CONSTRAINT "#__uc_ItemnameTagid", ADD CONSTRAINT "#__uc_ItemnameTagid" UNIQUE ("type_id", "content_item_id", "tag_id");
components/com_admin/sql/updates/postgresql/3.9.0-2018-10-20.sql000060400000000261152453623440017546 0ustar00DROP INDEX "#__privacy_requests_idx_checked_out";
ALTER TABLE "#__privacy_requests" DROP COLUMN "checked_out";
ALTER TABLE "#__privacy_requests" DROP COLUMN "checked_out_time";
components/com_admin/sql/updates/postgresql/3.6.0-2016-04-08.sql000060400000001164152453623440017555 0ustar00INSERT 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;
components/com_admin/sql/updates/postgresql/3.7.0-2017-01-15.sql000060400000000565152453623440017556 0ustar00INSERT 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);
components/com_admin/sql/updates/sqlazure/3.9.19-2020-06-01.sql000060400000000764152453623440017310 0ustar00INSERT 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_TEXTFILTER3919_TITLE', 'COM_CPANEL_MSG_TEXTFILTER3919_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/textfilter3919.php', 'admin_postinstall_textfilter3919_condition', '3.9.19', 1;
components/com_admin/sql/updates/sqlazure/3.9.4-2019-03-06.sql000060400000000507152453623440017227 0ustar00UPDATE "#__extensions" SET "element" = 'contact', "folder" = 'privacy' WHERE "name" = 'plg_privacy_contact';
UPDATE "#__extensions" SET "element" = 'content', "folder" = 'privacy' WHERE "name" = 'plg_privacy_content';
UPDATE "#__extensions" SET "element" = 'message', "folder" = 'privacy' WHERE "name" = 'plg_privacy_message';
components/com_admin/sql/updates/sqlazure/3.9.0-2018-08-28.sql000060400000001252152453623440017231 0ustar00sp_rename "#__session", "#__session_old";

SELECT cast("session_id" AS varbinary) AS "session_id", "client_id", "guest", cast("time" AS int) AS "time", "data", "userid", "username"
INTO "#__session"
FROM "#__session_old";

DROP TABLE "#__session_old";

ALTER TABLE "#__session" ALTER COLUMN "session_id" varbinary(192) NOT NULL;
ALTER TABLE "#__session" ADD CONSTRAINT "PK_#__session_session_id" PRIMARY KEY CLUSTERED ("session_id") ON [PRIMARY];
ALTER TABLE "#__session" ALTER COLUMN "time" int NOT NULL;
ALTER TABLE "#__session" ADD DEFAULT (0) FOR "time";

CREATE NONCLUSTERED INDEX "time" ON "#__session" ("time");
CREATE NONCLUSTERED INDEX "userid" ON "#__session" ("userid");
components/com_admin/sql/updates/sqlazure/3.2.0.sql000060400000047561152453623440016173 0ustar00/* 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);
components/com_admin/sql/updates/sqlazure/3.7.4-2017-07-05.sql000060400000000134152453623440017222 0ustar00DELETE FROM [#__postinstall_messages] WHERE [title_key] = 'COM_CPANEL_MSG_PHPVERSION_TITLE';components/com_admin/sql/updates/sqlazure/3.9.0-2018-06-17.sql000060400000000720152453623440017224 0ustar00SET IDENTITY_INSERT "#__extensions" ON;

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
(489, 0, 'plg_user_terms', 'plugin', 'terms', 'user', 0, 0, 1, 0, '', '{}', '', '', 0, '1900-01-01 00:00:00', 0, 0);

SET IDENTITY_INSERT "#__extensions" OFF;
components/com_admin/sql/updates/sqlazure/3.0.1.sql000060400000000072152453623440016154 0ustar00# Placeholder file for database changes for version 3.0.1
components/com_admin/sql/updates/sqlazure/3.3.0-2014-04-02.sql000060400000000752152453623440017207 0ustar00SET 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;
components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-17.sql000060400000011410152453623440017212 0ustar00-- 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;

components/com_admin/sql/updates/sqlazure/2.5.4-2012-03-18.sql000060400000002376152453623440017224 0ustar00SET 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) 2012 Open Source Matters, Inc.","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;
components/com_admin/sql/updates/sqlazure/3.4.0-2014-10-20.sql000060400000000070152453623440017176 0ustar00DELETE FROM [#__extensions] WHERE [extension_id] = 100;
components/com_admin/sql/updates/sqlazure/3.5.0-2016-03-01.sql000060400000001302152453623440017201 0ustar00ALTER 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);
components/com_admin/sql/updates/sqlazure/3.4.0-2014-12-03.sql000060400000000244152453623440017204 0ustar00UPDATE [#__extensions] SET [protected] = '0' WHERE [name] = 'plg_editors-xtd_article' AND [type] = 'plugin' AND [element] = 'article' AND [folder] = 'editors-xtd';
components/com_admin/sql/updates/sqlazure/3.2.2-2014-01-08.sql000060400000000705152453623440017211 0ustar00SET 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;
components/com_admin/sql/updates/sqlazure/3.7.0-2016-09-29.sql000060400000000776152453623440017241 0ustar00INSERT 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;

components/com_admin/sql/updates/sqlazure/3.9.0-2018-05-05.sql000060400000011665152453623440017232 0ustar00SET IDENTITY_INSERT "#__extensions" ON;

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
(36, 0, 'com_actionlogs', 'component', 'com_actionlogs', '', 1, 1, 1, 1, '', '{"ip_logging":0,"csv_delimiter":",","loggable_extensions":["com_banners","com_cache","com_categories","com_config","com_contact","com_content","com_installer","com_media","com_menus","com_messages","com_modules","com_newsfeeds","com_plugins","com_redirect","com_tags","com_templates","com_users"]}', '', '', 0, '1900-01-01 00:00:00', 0, 0),
(483, 0, 'plg_system_actionlogs', 'plugin', 'actionlogs', 'system', 0, 0, 1, 0, '', '{}', '', '', 0, '1900-01-01 00:00:00', 0, 0),
(484, 0, 'plg_actionlog_joomla', 'plugin', 'joomla', 'actionlog', 0, 1, 1, 0, '', '{}', '', '', 0, '1900-01-01 00:00:00', 0, 0);

SET IDENTITY_INSERT "#__extensions" OFF;

CREATE TABLE "#__action_logs" (
	"id" "int" IDENTITY(1,1) NOT NULL,
	"message_language_key" "nvarchar"(255) NOT NULL DEFAULT '',
	"message" "nvarchar"(max) NOT NULL DEFAULT '',
	"log_date" "datetime" NOT NULL DEFAULT '1900-01-01 00:00:00',
	"extension" "nvarchar"(255) NOT NULL DEFAULT '',
	"user_id" "bigint" NOT NULL DEFAULT 0,
	"item_id" "bigint" NOT NULL DEFAULT 0,
	"ip_address" "nvarchar"(40) NOT NULL DEFAULT '0.0.0.0',
	CONSTRAINT "PK_#__action_logs_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 TABLE "#__action_logs_extensions" (
	"id" "int" IDENTITY(1,1) NOT NULL,
	"extension" "nvarchar"(255) NOT NULL DEFAULT '',
	CONSTRAINT "PK_#__action_logs_extensions_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];

SET IDENTITY_INSERT "#__action_logs_extensions" ON;

INSERT INTO "#__action_logs_extensions" ("id", "extension") VALUES
(1, 'com_banners'),
(2, 'com_cache'),
(3, 'com_categories'),
(4, 'com_config'),
(5, 'com_contact'),
(6, 'com_content'),
(7, 'com_installer'),
(8, 'com_media'),
(9, 'com_menus'),
(10, 'com_messages'),
(11, 'com_modules'),
(12, 'com_newsfeeds'),
(13, 'com_plugins'),
(14, 'com_redirect'),
(15, 'com_tags'),
(16, 'com_templates'),
(17, 'com_users');

SET IDENTITY_INSERT "#__action_logs_extensions" OFF;

CREATE TABLE "#__action_log_config" (
	"id" "int" IDENTITY(1,1) NOT NULL,
	"type_title" "nvarchar"(255) NOT NULL DEFAULT '',
	"type_alias" "nvarchar"(255) NOT NULL DEFAULT '',
	"id_holder" "nvarchar"(255) NULL,
	"title_holder" "nvarchar"(255) NULL,
	"table_name" "nvarchar"(255) NULL,
	"text_prefix" "nvarchar"(255) NULL,
	CONSTRAINT "PK_#__action_log_config_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];

SET IDENTITY_INSERT "#__action_log_config" ON;

INSERT INTO "#__action_log_config" ("id", "type_title", "type_alias", "id_holder", "title_holder", "table_name", "text_prefix") VALUES
(1, 'article', 'com_content.article', 'id' ,'title' , '#__content', 'PLG_ACTIONLOG_JOOMLA'),
(2, 'article', 'com_content.form', 'id', 'title' , '#__content', 'PLG_ACTIONLOG_JOOMLA'),
(3, 'banner', 'com_banners.banner', 'id' ,'name' , '#__banners', 'PLG_ACTIONLOG_JOOMLA'),
(4, 'user_note', 'com_users.note', 'id', 'subject' ,'#__user_notes', 'PLG_ACTIONLOG_JOOMLA'),
(5, 'media', 'com_media.file', '' , 'name' , '',  'PLG_ACTIONLOG_JOOMLA'),
(6, 'category', 'com_categories.category', 'id' , 'title' , '#__categories', 'PLG_ACTIONLOG_JOOMLA'),
(7, 'menu', 'com_menus.menu', 'id' ,'title' , '#__menu_types', 'PLG_ACTIONLOG_JOOMLA'),
(8, 'menu_item', 'com_menus.item', 'id' , 'title' , '#__menu', 'PLG_ACTIONLOG_JOOMLA'),
(9, 'newsfeed', 'com_newsfeeds.newsfeed', 'id' ,'name' , '#__newsfeeds', 'PLG_ACTIONLOG_JOOMLA'),
(10, 'link', 'com_redirect.link', 'id', 'old_url' , '#__redirect_links', 'PLG_ACTIONLOG_JOOMLA'),
(11, 'tag', 'com_tags.tag', 'id', 'title' , '#__tags', 'PLG_ACTIONLOG_JOOMLA'),
(12, 'style', 'com_templates.style', 'id' , 'title' , '#__template_styles', 'PLG_ACTIONLOG_JOOMLA'),
(13, 'plugin', 'com_plugins.plugin', 'extension_id' , 'name' , '#__extensions', 'PLG_ACTIONLOG_JOOMLA'),
(14, 'component_config', 'com_config.component', 'extension_id' , 'name', '', 'PLG_ACTIONLOG_JOOMLA'),
(15, 'contact', 'com_contact.contact', 'id', 'name', '#__contact_details', 'PLG_ACTIONLOG_JOOMLA'),
(16, 'module', 'com_modules.module', 'id' ,'title', '#__modules', 'PLG_ACTIONLOG_JOOMLA'),
(17, 'access_level', 'com_users.level', 'id' , 'title', '#__viewlevels', 'PLG_ACTIONLOG_JOOMLA'),
(18, 'banner_client', 'com_banners.client', 'id', 'name', '#__banner_clients', 'PLG_ACTIONLOG_JOOMLA');

SET IDENTITY_INSERT "#__action_log_config" OFF;
components/com_admin/sql/updates/sqlazure/3.8.0-2017-07-31.sql000060400000001003152453623440017212 0ustar00INSERT 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);
components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-08.sql000060400000003374152453623440017224 0ustar00-- 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];
components/com_admin/sql/updates/sqlazure/3.8.9-2018-06-19.sql000060400000000153152453623440017236 0ustar00-- Enable Sample Data Module.
UPDATE [#__extensions] SET [enabled] = '1' WHERE [name] = 'mod_sampledata';

components/com_admin/sql/updates/sqlazure/3.9.0-2018-05-02.sql000060400000002557152453623440017227 0ustar00SET IDENTITY_INSERT "#__extensions" ON;

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
(35, 0, 'com_privacy', 'component', 'com_privacy', '', 1, 1, 1, 1, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0);

SET IDENTITY_INSERT "#__extensions" OFF;

CREATE TABLE "#__privacy_requests" (
  "id" int IDENTITY(1,1) NOT NULL,
  "email" nvarchar(100) NOT NULL DEFAULT '',
  "requested_at" datetime2(0) NOT NULL DEFAULT '1900-01-01 00:00:00',
  "status" smallint NOT NULL,
  "request_type" nvarchar(25) NOT NULL DEFAULT '',
  "confirm_token" nvarchar(100) NOT NULL DEFAULT '',
  "confirm_token_created_at" datetime2(0) NOT NULL DEFAULT '1900-01-01 00:00:00',
  "checked_out" bigint NOT NULL DEFAULT 0,
  "checked_out_time" datetime2(0) NOT NULL DEFAULT '1900-01-01 00:00:00',
CONSTRAINT "PK_#__privacy_requests_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 "#__privacy_requests" (
  "checked_out" ASC)
WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF);
components/com_admin/sql/updates/sqlazure/3.3.4-2014-08-03.sql000060400000000126152453623440017213 0ustar00ALTER TABLE [#__user_profiles] ALTER COLUMN [profile_value] [nvarchar](max) NOT NULL;
components/com_admin/sql/updates/sqlazure/3.4.0-2015-02-26.sql000060400000000777152453623450017225 0ustar00INSERT 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;
components/com_admin/sql/updates/sqlazure/3.1.1.sql000060400000000071152453623450016155 0ustar00# Placeholder file for database changes for version 3.1.1components/com_admin/sql/updates/sqlazure/3.7.0-2016-11-24.sql000060400000000411152453623450017210 0ustar00ALTER 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';
components/com_admin/sql/updates/sqlazure/3.4.0-2014-08-24.sql000060400000000733152453623450017220 0ustar00INSERT 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;
components/com_admin/sql/updates/sqlazure/2.5.5.sql000060400000000341152453623450016164 0ustar00ALTER 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;components/com_admin/sql/updates/sqlazure/3.7.0-2017-02-02.sql000060400000000707152453623450017215 0ustar00SET 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;
components/com_admin/sql/updates/sqlazure/3.8.0-2017-07-28.sql000060400000000110152453623450017217 0ustar00ALTER TABLE [#__fields_groups] ADD [params] [text] NOT NULL DEFAULT '';
components/com_admin/sql/updates/sqlazure/3.2.2-2013-12-28.sql000060400000000254152453623450017214 0ustar00UPDATE [#__menu] SET [component_id] = (SELECT [extension_id] FROM [#__extensions] WHERE [element] = 'com_joomlaupdate') WHERE [link] = 'index.php?option=com_joomlaupdate';
components/com_admin/sql/updates/sqlazure/3.2.2-2014-01-18.sql000060400000000144152453623450017210 0ustar00/* Update updates version length */
ALTER TABLE [#__updates] ALTER COLUMN [version] [nvarchar](32);
components/com_admin/sql/updates/sqlazure/3.8.6-2018-02-14.sql000060400000002017152453623450017224 0ustar00INSERT 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);
components/com_admin/sql/updates/sqlazure/3.9.0-2018-08-12.sql000060400000000115152453623450017220 0ustar00ALTER TABLE "#__privacy_consents" ADD "state" "smallint" NOT NULL DEFAULT 1;
components/com_admin/sql/updates/sqlazure/3.6.3-2016-08-15.sql000060400000000206152453623450017222 0ustar00--
-- Increasing size of the URL field in com_newsfeeds
--

ALTER TABLE [#__newsfeeds] ALTER COLUMN [link] [nvarchar](2048) NOT NULL;
components/com_admin/sql/updates/sqlazure/3.7.0-2016-08-22.sql000060400000000710152453623450017216 0ustar00SET 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;components/com_admin/sql/updates/sqlazure/3.0.0.sql000060400000000072152453623450016154 0ustar00# Placeholder file for database changes for version 3.0.0
components/com_admin/sql/updates/sqlazure/3.9.0-2018-05-27.sql000060400000001131152453623450017222 0ustar00SET IDENTITY_INSERT "#__extensions" ON;

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
(486, 0, 'plg_system_logrotation', 'plugin', 'logrotation', 'system', 0, 1, 1, 0, '', '{}', '', '', 0, '1900-01-01 00:00:00', 0, 0),
(487, 0, 'plg_privacy_user', 'plugin', 'user', 'privacy', 0, 1, 1, 0, '', '{}', '', '', 0, '1900-01-01 00:00:00', 0, 0);

SET IDENTITY_INSERT "#__extensions" OFF;
components/com_admin/sql/updates/sqlazure/3.9.22-2020-09-16.sql000060400000000546152453623450017312 0ustar00INSERT INTO [#__postinstall_messages] ([extension_id], [title_key], [description_key], [action_key], [language_extension], [language_client_id], [type], [version_introduced], [enabled])
VALUES
(700, 'COM_ADMIN_POSTINSTALL_MSG_HTACCESS_AUTOINDEX_TITLE', 'COM_ADMIN_POSTINSTALL_MSG_HTACCESS_AUTOINDEX_DESCRIPTION', '', 'com_admin', 1, 'message', '3.9.22', 1);
components/com_admin/sql/updates/sqlazure/3.8.4-2018-01-16.sql000060400000000210152453623450017214 0ustar00ALTER TABLE [#__user_keys] DROP CONSTRAINT [#__user_keys$series_2];
ALTER TABLE [#__user_keys] DROP CONSTRAINT [#__user_keys$series_3];
components/com_admin/sql/updates/sqlazure/3.9.10-2019-07-09.sql000060400000000212152453623450017305 0ustar00ALTER TABLE [#__template_styles] ALTER COLUMN [home] nvarchar(7) NOT NULL;
ALTER TABLE [#__template_styles] ADD DEFAULT ('0') FOR [home];
components/com_admin/sql/updates/sqlazure/3.9.0-2018-05-20.sql000060400000000733152453623450017222 0ustar00SET IDENTITY_INSERT "#__extensions" ON;

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
(319, 0, 'mod_latestactions', 'module', 'mod_latestactions', '', 1, 1, 1, 0, '', '{}', '', '', 0, '1900-01-01 00:00:00', 0, 0);

SET IDENTITY_INSERT "#__extensions" OFF;
components/com_admin/sql/updates/sqlazure/3.2.2-2014-01-23.sql000060400000000661152453623450017210 0ustar00SET 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;
components/com_admin/sql/updates/sqlazure/3.7.0-2017-03-09.sql000060400000001401152453623450017215 0ustar00UPDATE "#__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;
components/com_admin/sql/updates/sqlazure/3.9.0-2018-08-29.sql000060400000001042152453623450017230 0ustar00SET IDENTITY_INSERT "#__extensions" ON;

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
(494, 0, 'plg_captcha_recaptcha_invisible', 'plugin', 'recaptcha_invisible', 'captcha', 0, 0, 1, 0, '', '{"public_key":"","private_key":"","theme":"clean"}', '', '', 0, '1900-01-01 00:00:00', 0, 0);

SET IDENTITY_INSERT "#__extensions" OFF;
components/com_admin/sql/updates/sqlazure/3.2.1.sql000060400000000150152453623450016154 0ustar00DELETE FROM [#__postinstall_messages] WHERE [title_key] = 'PLG_USER_JOOMLA_POSTINSTALL_STRONGPW_TITLE';
components/com_admin/sql/updates/sqlazure/3.10.7-2022-03-18.sql000060400000000117152453623450017275 0ustar00ALTER TABLE [#__users] ADD [authProvider] [nvarchar](100) NOT NULL DEFAULT '';
components/com_admin/sql/updates/sqlazure/3.7.0-2017-02-15.sql000060400000000162152453623450017214 0ustar00-- Normalize redirect_links table default values.
ALTER TABLE [#__redirect_links] ADD DEFAULT ('') FOR [comment];
components/com_admin/sql/updates/sqlazure/3.5.0-2015-10-30.sql000060400000000171152453623450017204 0ustar00UPDATE [#__menu] SET [title] = 'com_contact_contacts' WHERE [client_id] = 1 AND [level] = 2 AND [title] = 'com_contact';
components/com_admin/sql/updates/sqlazure/2.5.2-2012-03-05.sql000060400000000046152453623450017207 0ustar00# Dummy SQL file to set schema versioncomponents/com_admin/sql/updates/sqlazure/3.5.0-2015-10-26.sql000060400000000234152453623450017211 0ustar00DROP INDEX [idx_tag_name] ON [#__contentitem_tag_map];
DROP INDEX [idx_tag] ON [#__contentitem_tag_map];
DROP INDEX [idx_type] ON [#__contentitem_tag_map];
components/com_admin/sql/updates/sqlazure/3.9.8-2019-06-15.sql000060400000001056152453623450017237 0ustar00DROP INDEX [idx_home] ON [#__template_styles];
# Query removed, see https://github.com/joomla/joomla-cms/pull/25484
CREATE NONCLUSTERED INDEX [idx_client_id] ON [#__template_styles]
(
  [client_id] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF);
CREATE NONCLUSTERED INDEX [idx_client_id_home] ON [#__template_styles]
(
  [client_id] ASC,
  [home] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF);
ALTER TABLE [#__template_styles] ADD DEFAULT (0) FOR [home];
components/com_admin/sql/updates/sqlazure/3.6.0-2016-06-05.sql000060400000000162152453623450017215 0ustar00--
-- Add ACL check for to #__languages
--

ALTER TABLE [#__languages] ADD [asset_id] [bigint] NOT NULL DEFAULT 0;components/com_admin/sql/updates/sqlazure/3.1.0.sql000060400000052725152453623450016171 0ustar00/* 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) 2013 Open Source Matters, Inc.","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;
components/com_admin/sql/updates/sqlazure/3.8.8-2018-05-18.sql000060400000001017152453623450017234 0ustar00INSERT 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;
components/com_admin/sql/updates/sqlazure/3.7.0-2016-08-06.sql000060400000000725152453623450017226 0ustar00SET 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;
components/com_admin/sql/updates/sqlazure/3.6.0-2016-05-06.sql000060400000001540152453623450017216 0ustar00DELETE 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;
components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-09.sql000060400000000726152453623450017224 0ustar00-- 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];
components/com_admin/sql/updates/sqlazure/3.9.0-2018-05-03.sql000060400000000750152453623450017222 0ustar00SET IDENTITY_INSERT "#__extensions" ON;

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
(482, 0, 'plg_content_confirmconsent', 'plugin', 'confirmconsent', 'content', 0, 0, 1, 0, '', '{}', '', '', 0, '1900-01-01 00:00:00', 0, 0);

SET IDENTITY_INSERT "#__extensions" OFF;
components/com_admin/sql/updates/sqlazure/3.9.7-2019-04-23.sql000060400000000300152453623450017222 0ustar00CREATE NONCLUSTERED INDEX [idx_client_id_guest] ON [#__session]
(
	[client_id] ASC,
	[guest] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF);
components/com_admin/sql/updates/sqlazure/3.7.0-2016-10-02.sql000060400000000102152453623450017200 0ustar00ALTER TABLE [#__session] ALTER COLUMN [client_id] [tinyint] NULL;
components/com_admin/sql/updates/sqlazure/3.10.7-2022-02-20.sql000060400000000152152453623450017264 0ustar00DELETE FROM [#__postinstall_messages] WHERE [title_key] = 'COM_ADMIN_POSTINSTALL_MSG_FLOC_BLOCKER_TITLE';
components/com_admin/sql/updates/sqlazure/3.5.0-2015-10-13.sql000060400000000713152453623450017207 0ustar00SET 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;
components/com_admin/sql/updates/sqlazure/2.5.4-2012-03-19.sql000060400000000531152453623450017215 0ustar00ALTER 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';
components/com_admin/sql/updates/sqlazure/3.7.0-2016-11-19.sql000060400000000242152453623450017216 0ustar00ALTER TABLE [#__menu_types] ADD [client_id] [tinyint] NOT NULL DEFAULT 0;

UPDATE [#__menu] SET [published] = 1 WHERE [menutype] = 'main' OR [menutype] = 'menu';
components/com_admin/sql/updates/sqlazure/2.5.3-2012-03-13.sql000060400000000046152453623450017207 0ustar00# Dummy SQL file to set schema versioncomponents/com_admin/sql/updates/sqlazure/2.5.7.sql000060400000001024152453623450016165 0ustar00INSERT 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');
components/com_admin/sql/updates/sqlazure/3.9.8-2019-06-11.sql000060400000000102152453623450017222 0ustar00UPDATE [#__users] SET [params] = REPLACE([params], '",,"', '","');components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-31.sql000060400000000677152453623450017224 0ustar00SET 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;
components/com_admin/sql/updates/sqlazure/3.7.0-2017-04-19.sql000060400000000250152453623450017220 0ustar00-- Set integer field default values.
UPDATE [#__extensions] SET [params] = '{"multiple":"0","first":"1","last":"100","step":"1"}' WHERE [name] = 'plg_fields_integer';

components/com_admin/sql/updates/sqlazure/3.10.1-2021-08-17.sql000060400000000505152453623450017273 0ustar00--
-- These database columns are not used in Joomla 3.10 but will be used in Joomla 4.
-- They are added to 3.10 because otherwise the update to 4 will fail.
--
ALTER TABLE [#__template_styles] ADD [inheritable] [smallint] NOT NULL DEFAULT 0;
ALTER TABLE [#__template_styles] ADD [parent] [nvarchar](50) NOT NULL DEFAULT '';
components/com_admin/sql/updates/sqlazure/3.1.3.sql000060400000000072152453623450016160 0ustar00# Placeholder file for database changes for version 3.1.3
components/com_admin/sql/updates/sqlazure/3.6.0-2016-06-01.sql000060400000000125152453623450017210 0ustar00UPDATE [#__extensions] SET [protected] = 1, [enabled] = 1 WHERE [name] = 'com_ajax';
components/com_admin/sql/updates/sqlazure/3.7.0-2017-04-10.sql000060400000001144152453623450017212 0ustar00INSERT 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);components/com_admin/sql/updates/sqlazure/3.9.0-2018-07-11.sql000060400000000740152453623450017222 0ustar00SET IDENTITY_INSERT "#__extensions" ON;

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
(493, 0, 'plg_privacy_actionlogs', 'plugin', 'actionlogs', 'privacy', 0, 1, 1, 0, '', '{}', '', '', 0, '1900-01-01 00:00:00', 0, 0);

SET IDENTITY_INSERT "#__extensions" OFF;
components/com_admin/sql/updates/sqlazure/3.1.4.sql000060400000000675152453623450016172 0ustar00SET 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;
components/com_admin/sql/updates/sqlazure/3.10.0-2021-05-28.sql000060400000000564152453623450017276 0ustar00INSERT INTO "#__extensions" ("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
(0, 'plg_quickicon_eos310', 'plugin', 'eos310', 'quickicon', 0, 1, 1, 0, '', '{}', '', '', 0, '1900-01-01 00:00:00', 0, 0);
components/com_admin/sql/updates/sqlazure/3.7.0-2016-10-01.sql000060400000000717152453623450017213 0ustar00SET 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;
components/com_admin/sql/updates/sqlazure/3.9.3-2019-02-07.sql000060400000000743152453623450017231 0ustar00INSERT 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_ADDNOSNIFF_TITLE', 'COM_CPANEL_MSG_ADDNOSNIFF_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/addnosniff.php', 'admin_postinstall_addnosniff_condition', '3.9.3', 1;
components/com_admin/sql/updates/sqlazure/3.5.0-2015-11-05.sql000060400000001671152453623450017215 0ustar00SET 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;
components/com_admin/sql/updates/sqlazure/3.4.0-2014-09-01.sql000060400000001464152453623450017216 0ustar00SET 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;
components/com_admin/sql/updates/sqlazure/3.9.0-2018-09-04.sql000060400000001042152453623450017222 0ustar00CREATE TABLE "#__action_logs_users" (
  "user_id" int NOT NULL,
  "notify" tinyint NOT NULL,
  "extensions" nvarchar(max) NOT NULL,
 CONSTRAINT "PK_#__action_logs_users_user_id" PRIMARY KEY NONCLUSTERED
(
  "user_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 CLUSTERED INDEX "idx_notify" ON "#__action_logs_users"
(
  "notify" ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF);
components/com_admin/sql/updates/sqlazure/3.4.4-2015-07-11.sql000060400000000631152453623450017215 0ustar00ALTER 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];
components/com_admin/sql/updates/sqlazure/3.9.0-2018-10-20.sql000060400000002162152453623450017214 0ustar00-- Drop default values
DECLARE @table AS nvarchar(100)
DECLARE @constraintName AS nvarchar(100)
DECLARE @constraintQuery AS nvarchar(1000)
SET QUOTED_IDENTIFIER OFF
SET @table = "#__privacy_requests"
SET QUOTED_IDENTIFIER ON

-- Drop default value from checked_out
SELECT @constraintName = name FROM sys.default_constraints
WHERE parent_object_id = object_id(@table)
AND parent_column_id = columnproperty(object_id(@table), 'checked_out', 'ColumnId')
SET @constraintQuery = 'ALTER TABLE [' + @table + '] DROP CONSTRAINT [' + @constraintName + ']'
EXECUTE sp_executesql @constraintQuery

-- Drop default value from checked_out_time
SELECT @constraintName = name FROM sys.default_constraints
WHERE parent_object_id = object_id(@table)
AND parent_column_id = columnproperty(object_id(@table), 'checked_out_time', 'ColumnId')
SET @constraintQuery = 'ALTER TABLE [' + @table + '] DROP CONSTRAINT [' + @constraintName + ']'
EXECUTE sp_executesql @constraintQuery;

DROP INDEX "idx_checkout" ON "#__privacy_requests";
ALTER TABLE "#__privacy_requests" DROP COLUMN "checked_out";
ALTER TABLE "#__privacy_requests" DROP COLUMN "checked_out_time";
components/com_admin/sql/updates/sqlazure/3.7.0-2017-01-15.sql000060400000000706152453623450017217 0ustar00SET 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;
components/com_admin/sql/updates/sqlazure/3.6.0-2016-04-08.sql000060400000001305152453623450017216 0ustar00SET 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;
components/com_admin/sql/updates/sqlazure/3.6.3-2016-08-16.sql000060400000001351152453623450017225 0ustar00INSERT 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;
components/com_admin/sql/updates/sqlazure/3.0.3.sql000060400000000614152453623450016161 0ustar00ALTER 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];
components/com_admin/sql/updates/sqlazure/3.6.0-2016-04-06.sql000060400000000111152453623450017206 0ustar00ALTER TABLE [#__redirect_links] ALTER COLUMN [new_url] [nvarchar](2048);
components/com_admin/sql/updates/sqlazure/3.2.2-2014-01-15.sql000060400000000743152453623450017212 0ustar00INSERT 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;
components/com_admin/sql/updates/sqlazure/3.6.0-2016-04-01.sql000060400000001651152453623450017213 0ustar00-- 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';
components/com_admin/sql/updates/sqlazure/3.2.3-2014-02-20.sql000060400000000235152453623450017204 0ustar00UPDATE [#__extensions] SET [params] = (SELECT [params] FROM [#__extensions] WHERE [name] = 'plg_system_remember') WHERE [name] = 'plg_authentication_cookie';components/com_admin/sql/updates/sqlazure/3.2.2-2013-12-22.sql000060400000000237152453623450017207 0ustar00ALTER TABLE [#__update_sites] ADD [extra_query] [nvarchar](1000) NULL DEFAULT '';
ALTER TABLE [#__updates] ADD [extra_query] [nvarchar](1000) NULL DEFAULT '';
components/com_admin/sql/updates/sqlazure/3.9.0-2018-06-12.sql000060400000000743152453623450017225 0ustar00SET IDENTITY_INSERT "#__extensions" ON;

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
(320, 0, 'mod_privacy_dashboard', 'module', 'mod_privacy_dashboard', '', 1, 1, 1, 0, '', '{}', '', '', 0, '1900-01-01 00:00:00', 0, 0);

SET IDENTITY_INSERT "#__extensions" OFF;
components/com_admin/sql/updates/sqlazure/3.9.7-2019-05-16.sql000060400000000105152453623450017230 0ustar00# Query removed, see https://github.com/joomla/joomla-cms/pull/25177
components/com_admin/sql/updates/sqlazure/3.9.0-2018-05-24.sql000060400000002376152453623450017233 0ustar00SET IDENTITY_INSERT "#__extensions" ON;

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
(485, 0, 'plg_system_privacyconsent', 'plugin', 'privacyconsent', 'system', 0, 0, 1, 0, '', '{}', '', '', 0, '1900-01-01 00:00:00', 0, 0);

SET IDENTITY_INSERT "#__extensions" OFF;

--
-- Table structure for table `#__privacy_consents`
--

CREATE TABLE "#__privacy_consents" (
  "id" int IDENTITY(1,1) NOT NULL,
  "user_id" bigint NOT NULL DEFAULT 0,
  "created" datetime2(0) NOT NULL DEFAULT '1900-01-01 00:00:00',
  "subject" nvarchar(255) NOT NULL DEFAULT '',
  "body" nvarchar(max) NOT NULL,
  "remind" smallint NOT NULL,
  "token" nvarchar(100) NOT NULL DEFAULT '',
CONSTRAINT "PK_#__privacy_consents_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_user_id" ON "#__privacy_consents" (
  "user_id" ASC)
WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF);
components/com_admin/sql/updates/sqlazure/3.9.21-2020-08-02.sql000060400000000750152453623450017300 0ustar00INSERT 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_HTACCESSSVG_TITLE', 'COM_CPANEL_MSG_HTACCESSSVG_BODY', '', 'com_cpanel', 1, 'message', '', '', 'admin://components/com_admin/postinstall/htaccesssvg.php', 'admin_postinstall_htaccesssvg_condition', '3.9.21', 1;
components/com_admin/sql/updates/sqlazure/3.9.0-2018-10-15.sql000060400000001377152453623450017227 0ustar00CREATE NONCLUSTERED INDEX "idx_user_id" ON "#__action_logs"
(
	"user_id" ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF);

CREATE NONCLUSTERED INDEX "idx_user_id_logdate" ON "#__action_logs"
(
	"user_id" ASC,
	"log_date" ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF);

CREATE NONCLUSTERED INDEX "idx_user_id_extension" ON "#__action_logs"
(
	"user_id" ASC,
	"extension" ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF);

CREATE NONCLUSTERED INDEX "idx_extension_itemid" ON "#__action_logs"
(
	"extension" ASC,
	"item_id"
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF);
components/com_admin/sql/updates/sqlazure/3.9.3-2019-01-12.sql000060400000000461152453623450017221 0ustar00UPDATE "#__extensions" 
SET "params" = REPLACE("params", '"com_categories",', '"com_categories","com_checkin",')
WHERE "name" = 'com_actionlogs';

SET IDENTITY_INSERT #__extensions  ON;

INSERT INTO "#__action_logs_extensions" ("extension") VALUES
('com_checkin');

SET IDENTITY_INSERT #__extensions  OFF;components/com_admin/sql/updates/sqlazure/3.9.0-2018-07-09.sql000060400000001330152453623450017225 0ustar00SET IDENTITY_INSERT "#__extensions" ON;

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
(490, 0, 'plg_privacy_contact', 'plugin', 'contact', 'privacy', 0, 1, 1, 0, '', '{}', '', '', 0, '1900-01-01 00:00:00', 0, 0),
(491, 0, 'plg_privacy_content', 'plugin', 'content', 'privacy', 0, 1, 1, 0, '', '{}', '', '', 0, '1900-01-01 00:00:00', 0, 0),
(492, 0, 'plg_privacy_message', 'plugin', 'message', 'privacy', 0, 1, 1, 0, '', '{}', '', '', 0, '1900-01-01 00:00:00', 0, 0);

SET IDENTITY_INSERT "#__extensions" OFF;
components/com_admin/sql/updates/sqlazure/3.7.0-2017-03-03.sql000060400000002074152453623450017216 0ustar00CREATE 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");
components/com_admin/sql/updates/sqlazure/3.7.0-2017-02-16.sql000060400000042540152453623450017223 0ustar00-- 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";
components/com_admin/sql/updates/sqlazure/3.5.0-2015-11-04.sql000060400000001051152453623450017204 0ustar00DELETE 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;
components/com_admin/sql/updates/sqlazure/3.9.26-2021-04-07.sql000060400000001242152453623450017304 0ustar00INSERT INTO [#__postinstall_messages] ([extension_id], [title_key], [description_key], [action_key], [language_extension], [language_client_id], [type], [version_introduced], [enabled], [condition_file], [condition_method], [action_file], [action])
VALUES
(700, 'COM_ADMIN_POSTINSTALL_MSG_BEHIND_LOAD_BALANCER_TITLE', 'COM_ADMIN_POSTINSTALL_MSG_BEHIND_LOAD_BALANCER_DESCRIPTION', 'COM_ADMIN_POSTINSTALL_MSG_BEHIND_LOAD_BALANCER_ACTION', 'com_admin', 1, 'action', '3.9.26', 1, 'admin://components/com_admin/postinstall/behindproxy.php', 'admin_postinstall_behindproxy_condition', 'admin://components/com_admin/postinstall/behindproxy.php', 'behindproxy_postinstall_action');
components/com_admin/sql/updates/sqlazure/3.4.0-2015-01-21.sql000060400000000576152453623450017214 0ustar00INSERT 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;
components/com_admin/sql/updates/sqlazure/3.9.7-2019-04-26.sql000060400000000522152453623450017233 0ustar00UPDATE [#__content_types] SET [content_history_options] = REPLACE([content_history_options], '\"ignoreChanges\":[\"modified_by\", \"modified\", \"checked_out\", \"checked_out_time\", \"version\", \"hits\"]', '\"ignoreChanges\":[\"modified_by\", \"modified\", \"checked_out\", \"checked_out_time\", \"version\", \"hits\", \"ordering\"]');
components/com_admin/sql/updates/sqlazure/3.9.0-2018-07-10.sql000060400000000506152453623450017221 0ustar00SET IDENTITY_INSERT "#__action_log_config" ON;

INSERT INTO "#__action_log_config" ("id", "type_title", "type_alias", "id_holder", "title_holder", "table_name", "text_prefix") VALUES
(19, 'application_config', 'com_config.application', '', 'name', '', 'PLG_ACTIONLOG_JOOMLA');

SET IDENTITY_INSERT "#__action_log_config" OFF;
components/com_admin/sql/updates/sqlazure/3.9.0-2018-06-02.sql000060400000001530152453623450017217 0ustar00ALTER TABLE "#__content" ADD "note" "nvarchar"(255) NOT NULL DEFAULT '';

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", "note":"note"}, "special":{"fulltext":"fulltext"}}' WHERE "type_alias" = 'com_content.article';
components/com_admin/sql/updates/sqlazure/3.8.2-2017-10-14.sql000060400000000324152453623450017215 0ustar00--
-- 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);
components/com_admin/sql/updates/sqlazure/3.1.5.sql000060400000000072152453623450016162 0ustar00# Placeholder file for database changes for version 3.1.5
components/com_admin/sql/updates/sqlazure/3.1.2.sql000060400000021415152453623450016163 0ustar00UPDATE [#__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';
components/com_admin/sql/updates/sqlazure/2.5.6.sql000060400000000071152453623450016165 0ustar00# Placeholder file for database changes for version 2.5.6components/com_admin/sql/updates/sqlazure/3.9.16-2020-03-04.sql000060400000000310152453623450017271 0ustar00DROP INDEX [username] ON [#__users];

CREATE UNIQUE INDEX [idx_username] ON [#__users]
(
  [username] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF);components/com_admin/sql/updates/sqlazure/3.7.0-2017-02-17.sql000060400000002025152453623450017216 0ustar00-- 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];
components/com_admin/sql/updates/sqlazure/3.9.0-2018-06-14.sql000060400000001023152453623450017217 0ustar00INSERT 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_ACTIONLOGS_POSTINSTALL_TITLE', 'COM_ACTIONLOGS_POSTINSTALL_BODY', '', 'com_actionlogs', 1, 'message', '', '', '', '', '3.9.0', 1),
(700, 'COM_PRIVACY_POSTINSTALL_TITLE', 'COM_PRIVACY_POSTINSTALL_BODY', '', 'com_privacy', 1, 'message', '', '', '', '', '3.9.0', 1);
components/com_admin/sql/updates/sqlazure/3.9.27-2021-04-20.sql000060400000000510152453623450017275 0ustar00INSERT INTO [#__postinstall_messages] ([extension_id], [title_key], [description_key], [language_extension], [language_client_id], [type], [version_introduced], [enabled])
VALUES
(700, 'COM_ADMIN_POSTINSTALL_MSG_FLOC_BLOCKER_TITLE', 'COM_ADMIN_POSTINSTALL_MSG_FLOC_BLOCKER_DESCRIPTION', 'com_admin', 1, 'message', '3.9.27', 1);
components/com_admin/sql/updates/sqlazure/3.9.0-2018-06-13.sql000060400000000750152453623450017224 0ustar00SET IDENTITY_INSERT "#__extensions" ON;

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
(488, 0, 'plg_quickicon_privacycheck', 'plugin', 'privacycheck', 'quickicon', 0, 1, 1, 0, '', '{}', '', '', 0, '1900-01-01 00:00:00', 0, 0);

SET IDENTITY_INSERT "#__extensions" OFF;
components/com_admin/sql/updates/sqlazure/3.3.0-2014-02-16.sql000060400000000105152453623450017203 0ustar00ALTER TABLE [#__users] ADD [requireReset] [smallint] NULL DEFAULT 0;
components/com_admin/sql/updates/sqlazure/3.0.2.sql000060400000000071152453623450016155 0ustar00# Placeholder file for database changes for version 3.0.2components/com_admin/sql/updates/sqlazure/3.7.0-2016-11-04.sql000060400000001215152453623450017211 0ustar00-- 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;
components/com_admin/sql/updates/sqlazure/3.9.0-2018-10-21.sql000060400000000734152453623450017220 0ustar00SET IDENTITY_INSERT "#__extensions" ON;

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
(495, 0, 'plg_privacy_consents', 'plugin', 'consents', 'privacy', 0, 1, 1, 0, '', '{}', '', '', 0, '1900-01-01 00:00:00', 0, 0);

SET IDENTITY_INSERT "#__extensions" OFF;
components/com_admin/sql/updates/sqlazure/3.4.0-2014-09-16.sql000060400000000463152453623450017222 0ustar00ALTER 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;
components/com_admin/sql/updates/sqlazure/3.6.0-2016-04-09.sql000060400000000164152453623450017221 0ustar00--
-- Add ACL check for to #__menu_types
--

ALTER TABLE [#__menu_types] ADD [asset_id] [bigint] NOT NULL DEFAULT 0;components/com_admin/sql/updates/sqlazure/3.7.0-2016-08-29.sql000060400000013673152453623450017241 0ustar00/****** 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;
components/com_admin/sql/updates/sqlazure/3.9.0-2018-05-19.sql000060400000000734152453623450017233 0ustar00SET IDENTITY_INSERT "#__extensions" ON;

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
(481, 0, 'plg_fields_repeatable', 'plugin', 'repeatable', 'fields', 0, 1, 1, 0, '', '', '', '', 0, '1900-01-01 00:00:00', 0, 0);

SET IDENTITY_INSERT "#__extensions" OFF;
components/com_admin/sql/updates/sqlazure/3.3.6-2014-09-30.sql000060400000000723152453623450017222 0ustar00INSERT 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');
components/com_admin/sql/others/mysql/utf8mb4-conversion-02.sql000060400000044367152453623450020566 0ustar00--
-- 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 DEFAULT '';
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 character 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));
components/com_admin/sql/others/mysql/utf8mb4-conversion-03.sql000060400000003335152453623450020555 0ustar00--
-- Step 3 of the UTF-8 Multibyte (utf8mb4) conversion for MySQL
--
-- Convert the tables for action logs and the privacy suite which have been
-- forgotten to be added to the utf8mb4 conversion before.
--
-- This file here will be processed with reporting exceptions, in opposite
-- to the file for step 1.
--

--
-- Step 3.1: Convert action logs and privacy suite tables to utf8mb4 character set with
-- utf8mb4_unicode_ci collation
-- Note: The database driver for mysql will change utf8mb4 to utf8 if utf8mb4 is not supported
--

ALTER TABLE `#__action_logs` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `#__action_logs_extensions` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `#__action_logs_users` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `#__action_log_config` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `#__privacy_consents` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `#__privacy_requests` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

--
-- Step 3.2: Set default character set and collation for previously converted tables
--

ALTER TABLE `#__action_logs` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `#__action_logs_extensions` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `#__action_logs_users` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `#__action_log_config` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `#__privacy_consents` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `#__privacy_requests` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
components/com_admin/sql/others/mysql/utf8mb4-conversion-01.sql000060400000002735152453623450020556 0ustar00--
-- 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`;
components/com_admin/views/sysinfo/view.text.php000060400000010271152453623450016162 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Sysinfo View class for the Admin component
 *
 * @since  3.5
 */
class AdminViewSysinfo extends JViewLegacy
{
	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @since   3.5
	 */
	public function display($tpl = null)
	{
		// Access check.
		if (!JFactory::getUser()->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);
	}
}
components/com_admin/views/sysinfo/view.html.php000060400000005304152453623450016143 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Sysinfo View class for the Admin component
 *
 * @since  1.6
 */
class AdminViewSysinfo extends JViewLegacy
{
	/**
	 * Some PHP settings
	 *
	 * @var    array
	 * @since  1.6
	 */
	protected $php_settings = array();

	/**
	 * Config values
	 *
	 * @var    array
	 * @since  1.6
	 */
	protected $config = array();

	/**
	 * Some system values
	 *
	 * @var    array
	 * @since  1.6
	 */
	protected $info = array();

	/**
	 * PHP info
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $php_info = null;

	/**
	 * Information about writable state of directories
	 *
	 * @var    array
	 * @since  1.6
	 */
	protected $directory = array();

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		// Access check.
		if (!JFactory::getUser()->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&' . JSession::getFormToken() . '=1'),
			'COM_ADMIN_DOWNLOAD_SYSTEM_INFORMATION_TEXT', 'download'
		);
		JToolbarHelper::link(
			JRoute::_('index.php?option=com_admin&view=sysinfo&format=json&' . JSession::getFormToken() . '=1'),
			'COM_ADMIN_DOWNLOAD_SYSTEM_INFORMATION_JSON', 'download'
		);
		JToolbarHelper::help('JHELP_SITE_SYSTEM_INFORMATION');
	}
}
components/com_admin/views/sysinfo/tmpl/default.php000060400000003531152453623450016626 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Add specific helper files for html generation
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');
?>

<form action="<?php echo JRoute::_('index.php?option=com_admin&view=sysinfo'); ?>" method="post" name="adminForm" id="adminForm">
	<div class="row-fluid">
		<!-- Begin Content -->
		<div class="span12">
			<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'site')); ?>

			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'site', JText::_('COM_ADMIN_SYSTEM_INFORMATION')); ?>
			<?php echo $this->loadTemplate('system'); ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>

			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'phpsettings', JText::_('COM_ADMIN_PHP_SETTINGS')); ?>
			<?php echo $this->loadTemplate('phpsettings'); ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>

			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'config', JText::_('COM_ADMIN_CONFIGURATION_FILE')); ?>
			<?php echo $this->loadTemplate('config'); ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>

			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'directory', JText::_('COM_ADMIN_DIRECTORY_PERMISSIONS')); ?>
			<?php echo $this->loadTemplate('directory'); ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>

			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'phpinfo', JText::_('COM_ADMIN_PHP_INFORMATION')); ?>
			<?php echo $this->loadTemplate('phpinfo'); ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>

			<?php echo JHtml::_('bootstrap.endTabSet'); ?>
		</div>
		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
		<!-- End Content -->
	</div>
</form>
components/com_admin/views/sysinfo/tmpl/default.xml000060400000000314152453623450016633 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_ADMIN_SYSINFO_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_ADMIN_SYSINFO_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_admin/views/sysinfo/tmpl/default_phpsettings.php000060400000010006152453623450021251 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<fieldset class="adminform">
	<legend><?php echo JText::_('COM_ADMIN_RELEVANT_PHP_SETTINGS'); ?></legend>
	<table class="table table-striped">
		<thead>
			<tr>
				<th width="250">
					<?php echo JText::_('COM_ADMIN_SETTING'); ?>
				</th>
				<th>
					<?php echo JText::_('COM_ADMIN_VALUE'); ?>
				</th>
			</tr>
		</thead>
		<tfoot>
			<tr>
				<td colspan="2">&#160;
				</td>
			</tr>
		</tfoot>
		<tbody>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_SAFE_MODE'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.boolean', $this->php_settings['safe_mode']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_OPEN_BASEDIR'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.string', $this->php_settings['open_basedir']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_DISPLAY_ERRORS'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.boolean', $this->php_settings['display_errors']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_SHORT_OPEN_TAGS'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.boolean', $this->php_settings['short_open_tag']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_FILE_UPLOADS'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.boolean', $this->php_settings['file_uploads']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_MAGIC_QUOTES'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.boolean', $this->php_settings['magic_quotes_gpc']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_REGISTER_GLOBALS'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.boolean', $this->php_settings['register_globals']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_OUTPUT_BUFFERING'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.boolean', $this->php_settings['output_buffering']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_SESSION_SAVE_PATH'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.string', $this->php_settings['session.save_path']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_SESSION_AUTO_START'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.integer', $this->php_settings['session.auto_start']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_XML_ENABLED'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.set', $this->php_settings['xml']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_ZLIB_ENABLED'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.set', $this->php_settings['zlib']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_ZIP_ENABLED'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.set', $this->php_settings['zip']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_DISABLED_FUNCTIONS'); ?>
				</td>
				<td class="break-word">
					<?php echo JHtml::_('phpsetting.string', $this->php_settings['disable_functions']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_MBSTRING_ENABLED'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.set', $this->php_settings['mbstring']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_ICONV_AVAILABLE'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.set', $this->php_settings['iconv']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_ADMIN_MAX_INPUT_VARS'); ?>
				</td>
				<td>
					<?php echo JHtml::_('phpsetting.integer', $this->php_settings['max_input_vars']); ?>
				</td>
			</tr>
		</tbody>
	</table>
</fieldset>
components/com_admin/views/sysinfo/tmpl/default_phpinfo.php000060400000000631152453623450020347 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<fieldset class="adminform">
	<legend><?php echo JText::_('COM_ADMIN_PHP_INFORMATION'); ?></legend>
	<?php echo $this->php_info; ?>
</fieldset>
components/com_admin/views/sysinfo/tmpl/default_directory.php000060400000001747152453623450020721 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<fieldset class="adminform">
	<legend><?php echo JText::_('COM_ADMIN_DIRECTORY_PERMISSIONS'); ?></legend>
	<table class="table table-striped">
		<thead>
			<tr>
				<th width="650">
					<?php echo JText::_('COM_ADMIN_DIRECTORY'); ?>
				</th>
				<th>
					<?php echo JText::_('COM_ADMIN_STATUS'); ?>
				</th>
			</tr>
		</thead>
		<tfoot>
			<tr>
				<td colspan="2">&#160;</td>
			</tr>
		</tfoot>
		<tbody>
			<?php foreach ($this->directory as $dir => $info) : ?>
				<tr>
					<td>
						<?php echo JHtml::_('directory.message', $dir, $info['message']); ?>
					</td>
					<td>
						<?php echo JHtml::_('directory.writable', $info['writable']); ?>
					</td>
				</tr>
			<?php endforeach; ?>
		</tbody>
	</table>
</fieldset>
components/com_admin/views/sysinfo/tmpl/default_system.php000060400000005226152453623450020235 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<fieldset class="adminform">
	<legend><?php echo JText::_('COM_ADMIN_SYSTEM_INFORMATION'); ?></legend>
	<table class="table table-striped">
		<thead>
			<tr>
				<th width="25%">
					<?php echo JText::_('COM_ADMIN_SETTING'); ?>
				</th>
				<th>
					<?php echo JText::_('COM_ADMIN_VALUE'); ?>
				</th>
			</tr>
		</thead>
		<tfoot>
			<tr>
				<td colspan="2">&#160;</td>
			</tr>
		</tfoot>
		<tbody>
			<tr>
				<td>
					<strong><?php echo JText::_('COM_ADMIN_PHP_BUILT_ON'); ?></strong>
				</td>
				<td>
					<?php echo $this->info['php']; ?>
				</td>
			</tr>
			<tr>
				<td>
					<strong><?php echo JText::_('COM_ADMIN_DATABASE_TYPE'); ?></strong>
				</td>
				<td>
					<?php echo $this->info['dbserver']; ?>
				</td>
			</tr>			
			<tr>
				<td>
					<strong><?php echo JText::_('COM_ADMIN_DATABASE_VERSION'); ?></strong>
				</td>
				<td>
					<?php echo $this->info['dbversion']; ?>
				</td>
			</tr>
			<tr>
				<td>
					<strong><?php echo JText::_('COM_ADMIN_DATABASE_COLLATION'); ?></strong>
				</td>
				<td>
					<?php echo $this->info['dbcollation']; ?>
				</td>
			</tr>
			<tr>
				<td>
					<strong><?php echo JText::_('COM_ADMIN_DATABASE_CONNECTION_COLLATION'); ?></strong>
				</td>
				<td>
					<?php echo $this->info['dbconnectioncollation']; ?>
				</td>
			</tr>
			<tr>
				<td>
					<strong><?php echo JText::_('COM_ADMIN_PHP_VERSION'); ?></strong>
				</td>
				<td>
					<?php echo $this->info['phpversion']; ?>
				</td>
			</tr>
			<tr>
				<td>
					<strong><?php echo JText::_('COM_ADMIN_WEB_SERVER'); ?></strong>
				</td>
				<td>
					<?php echo JHtml::_('system.server', $this->info['server']); ?>
				</td>
			</tr>
			<tr>
				<td>
					<strong><?php echo JText::_('COM_ADMIN_WEBSERVER_TO_PHP_INTERFACE'); ?></strong>
				</td>
				<td>
					<?php echo $this->info['sapi_name']; ?>
				</td>
			</tr>
			<tr>
				<td>
					<strong><?php echo JText::_('COM_ADMIN_JOOMLA_VERSION'); ?></strong>
				</td>
				<td>
					<?php echo $this->info['version']; ?>
				</td>
			</tr>
			<tr>
				<td>
					<strong><?php echo JText::_('COM_ADMIN_PLATFORM_VERSION'); ?></strong>
				</td>
				<td>
					<?php echo $this->info['platform']; ?>
				</td>
			</tr>
			<tr>
				<td>
					<strong><?php echo JText::_('COM_ADMIN_USER_AGENT'); ?></strong>
				</td>
				<td>
					<?php echo htmlspecialchars($this->info['useragent'], ENT_COMPAT, 'UTF-8'); ?>
				</td>
			</tr>
		</tbody>
	</table>
</fieldset>
components/com_admin/views/sysinfo/tmpl/default_config.php000060400000001641152453623450020153 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<fieldset class="adminform">
	<legend><?php echo JText::_('COM_ADMIN_CONFIGURATION_FILE'); ?></legend>
	<table class="table table-striped">
		<thead>
			<tr>
				<th width="300">
					<?php echo JText::_('COM_ADMIN_SETTING'); ?>
				</th>
				<th>
					<?php echo JText::_('COM_ADMIN_VALUE'); ?>
				</th>
			</tr>
		</thead>
		<tfoot>
			<tr>
				<td colspan="2">&#160;</td>
			</tr>
		</tfoot>
		<tbody>
			<?php foreach ($this->config as $key => $value) : ?>
				<tr>
					<td>
						<?php echo $key; ?>
					</td>
					<td>
						<?php echo htmlspecialchars($value, ENT_QUOTES); ?>
					</td>
				</tr>
			<?php endforeach; ?>
		</tbody>
	</table>
</fieldset>
components/com_admin/views/sysinfo/view.json.php000060400000003144152453623450016150 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Sysinfo View class for the Admin component
 *
 * @since  3.5
 */
class AdminViewSysinfo extends JViewLegacy
{
	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @since   3.5
	 */
	public function display($tpl = null)
	{
		// Access check.
		if (!JFactory::getUser()->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')
		);
	}
}
components/com_admin/views/help/view.html.php000060400000003556152453623450015410 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * HTML View class for the Admin component
 *
 * @since  1.6
 */
class AdminViewHelp extends JViewLegacy
{
	/**
	 * The search string
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $help_search = null;

	/**
	 * The page to be viewed
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $page = null;

	/**
	 * The iso language tag
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $lang_tag = null;

	/**
	 * Table of contents
	 *
	 * @var    array
	 * @since  1.6
	 */
	protected $toc = array();

	/**
	 * URL for the latest version check
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $latest_version_check = 'https://downloads.joomla.org/latest';

	/**
	 * URL for the start here link
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $start_here = null;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		$this->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');
	}
}
components/com_admin/views/help/tmpl/default.xml000060400000000306152453623450016072 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_ADMIN_HELP_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_ADMIN_HELP_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_admin/views/help/tmpl/default.php000060400000003461152453623450016066 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip');
?>
<form action="<?php echo JRoute::_('index.php?option=com_admin&amp;view=help'); ?>" method="post" name="adminForm" id="adminForm">
	<div class="row-fluid">
		<div id="sidebar" class="span3">
			<div class="clearfix"></div>
			<div class="sidebar-nav">
				<ul class="nav nav-list">
					<li><?php echo JHtml::_('link', JHelp::createUrl('JHELP_START_HERE'), JText::_('COM_ADMIN_START_HERE'), array('target' => 'helpFrame')); ?></li>
					<li><?php echo JHtml::_('link', $this->latest_version_check, JText::_('COM_ADMIN_LATEST_VERSION_CHECK'), array('target' => 'helpFrame')); ?></li>
					<li><?php echo JHtml::_('link', 'https://www.gnu.org/licenses/gpl-2.0.html', JText::_('COM_ADMIN_LICENSE'), array('target' => 'helpFrame')); ?></li>
					<li><?php echo JHtml::_('link', JHelp::createUrl('JHELP_GLOSSARY'), JText::_('COM_ADMIN_GLOSSARY'), array('target' => 'helpFrame')); ?></li>
					<li class="divider"></li>
					<li class="nav-header"><?php echo JText::_('COM_ADMIN_ALPHABETICAL_INDEX'); ?></li>
					<?php foreach ($this->toc as $k => $v) : ?>
						<li>
							<?php $url = JHelp::createUrl('JHELP_' . strtoupper($k)); ?>
							<?php echo JHtml::_('link', $url, $v, array('target' => 'helpFrame')); ?>
						</li>
					<?php endforeach; ?>
				</ul>
			</div>
		</div>
		<div class="span9">
			<iframe name="helpFrame" title="helpFrame" height="2100px" src="<?php echo $this->page; ?>" class="helpFrame table table-bordered"></iframe>
		</div>
	</div>
	<input class="textarea" type="hidden" name="option" value="com_admin" />
</form>
components/com_admin/views/help/tmpl/langforum.php000060400000001123152453623450016425 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JFactory::getLanguage()->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);
components/com_admin/views/profile/tmpl/edit.php000060400000010270152453623450016073 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.formvalidator');

JFactory::getDocument()->addScriptDeclaration('
	Joomla.submitbutton = function(task)
	{
		if (task == "profile.cancel" || document.formvalidator.isValid(document.getElementById("profile-form")))
		{
			Joomla.submitform(task, document.getElementById("profile-form"));
		}
	};
	Joomla.twoFactorMethodChange = function(e)
	{
		var selectedPane = "com_admin_twofactor_" + jQuery("#jform_twofactor_method").val();

		jQuery.each(jQuery("#com_admin_twofactor_forms_container>div"), function(i, el)
		{
			if (el.id != selectedPane)
			{
				jQuery("#" + el.id).hide(0);
			}
			else
			{
				jQuery("#" + el.id).show(0);
			}
		});
	}
');

// Load chosen.css
JHtml::_('formbehavior.chosen', 'select');

// Fieldsets to not automatically render by /layouts/joomla/edit/params.php
$this->ignore_fieldsets = array('user_details');
?>

<form action="<?php echo JRoute::_('index.php?option=com_admin&view=profile&layout=edit&id=' . $this->item->id); ?>" method="post" name="adminForm" id="profile-form" class="form-validate form-horizontal" enctype="multipart/form-data">
	<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'account')); ?>
	<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'account', JText::_('COM_ADMIN_USER_ACCOUNT_DETAILS')); ?>
	<?php foreach ($this->form->getFieldset('user_details') as $field) : ?>
		<?php if ($field->fieldname === 'password2') : ?>
			<?php // Disables autocomplete ?>
			<input type="password" style="display:none">
		<?php endif; ?>
		<?php echo $field->renderField(); ?>
	<?php endforeach; ?>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php if (count($this->twofactormethods) > 1 && !empty($this->twofactorform)) : ?>
		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'twofactorauth', JText::_('COM_USERS_USER_TWO_FACTOR_AUTH')); ?>
		<fieldset>
			<div class="control-group">
				<div class="control-label">
					<label id="jform_twofactor_method-lbl" for="jform_twofactor_method" class="hasTooltip"
						title="<?php echo '<strong>' . JText::_('COM_USERS_USER_FIELD_TWOFACTOR_LABEL') . '</strong><br />' . JText::_('COM_USERS_USER_FIELD_TWOFACTOR_DESC'); ?>">
						<?php echo JText::_('COM_USERS_USER_FIELD_TWOFACTOR_LABEL'); ?>
					</label>
				</div>
				<div class="controls">
					<?php echo JHtml::_('select.genericlist', $this->twofactormethods, 'jform[twofactor][method]', array('onchange' => 'Joomla.twoFactorMethodChange()'), 'value', 'text', $this->otpConfig->method, 'jform_twofactor_method', false); ?>
				</div>
			</div>
			<div id="com_admin_twofactor_forms_container">
				<?php foreach ($this->twofactorform as $form) : ?>
					<?php $style = $form['method'] == $this->otpConfig->method ? 'display: block' : 'display: none'; ?>
					<div id="com_admin_twofactor_<?php echo $form['method']; ?>" style="<?php echo $style; ?>">
						<?php echo $form['form']; ?>
					</div>
				<?php endforeach; ?>
			</div>
		</fieldset>
		<fieldset>
			<legend>
				<?php echo JText::_('COM_USERS_USER_OTEPS'); ?>
			</legend>
			<div class="alert alert-info">
				<?php echo JText::_('COM_USERS_USER_OTEPS_DESC'); ?>
			</div>
			<?php if (empty($this->otpConfig->otep)) : ?>
				<div class="alert alert-warning">
					<?php echo JText::_('COM_USERS_USER_OTEPS_WAIT_DESC'); ?>
				</div>
			<?php else : ?>
				<?php foreach ($this->otpConfig->otep as $otep) : ?>
					<span class="span3">
						<?php echo substr($otep, 0, 4); ?>-<?php echo substr($otep, 4, 4); ?>-<?php echo substr($otep, 8, 4); ?>-<?php echo substr($otep, 12, 4); ?>
					</span>
				<?php endforeach; ?>
				<div class="clearfix"></div>
			<?php endif; ?>
		</fieldset>
		<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php endif; ?>
	<?php echo JLayoutHelper::render('joomla.edit.params', $this); ?>
	<?php echo JHtml::_('bootstrap.endTabSet'); ?>
	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>
</form>
components/com_admin/views/profile/view.html.php000060400000004361152453623450016113 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('UsersHelper', JPATH_ADMINISTRATOR . '/components/com_users/helpers/users.php');

/**
 * View class to allow users edit their own profile.
 *
 * @since  1.6
 */
class AdminViewProfile extends JViewLegacy
{
	/**
	 * The JForm object
	 *
	 * @var    JForm
	 * @since  1.6
	 */
	protected $form;

	/**
	 * The item being viewed
	 *
	 * @var    object
	 * @since  1.6
	 */
	protected $item;

	/**
	 * The model state
	 *
	 * @var    object
	 * @since  1.6
	 */
	protected $state;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		$this->form             = $this->get('Form');
		$this->item             = $this->get('Item');
		$this->state            = $this->get('State');
		$this->twofactorform    = $this->get('Twofactorform');
		$this->twofactormethods = UsersHelper::getTwoFactorMethods();
		$this->otpConfig        = $this->get('OtpConfig');

		// Load the language strings for the 2FA
		JFactory::getLanguage()->load('com_users', JPATH_ADMINISTRATOR);

		// 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');
	}
}
components/com_admin/admin.php000060400000000721152453623450012465 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
JHtml::_('behavior.tabstate');

// No access check.

$controller = JControllerLegacy::getInstance('Admin');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
components/com_admin/admin.xml000060400000001645152453623450012504 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_admin</name>
	<author>Joomla! Project</author>
	<creationDate>April 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_ADMIN_XML_DESCRIPTION</description>
	<media />
	<administration>
		<files folder="admin">
			<filename>admin.php</filename>
			<filename>controller.php</filename>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_admin.ini</language>
			<language tag="en-GB">language/en-GB.com_admin.sys.ini</language>
		</languages>
	</administration>
</extension>
components/com_admin/postinstall/textfilter3919.php000060400000001170152453623450016470 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2020 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 *
 * This file contains post-installation message handling for notifying users of a change
 * in the default textfilter settings
 */

defined('_JEXEC') or die;

/**
 * Notifies users the changes from the default textfilter.
 *
 * This check returns true regardless of condition.
 *
 * @return  boolean
 *
 * @since   3.9.19
 */
function admin_postinstall_textfilter3919_condition()
{
	return true;
}
components/com_admin/postinstall/joomla40checks.php000060400000003554152453623450016566 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 *
 * This file contains post-installation message handling for Joomla 4.0 pre checks
 */

defined('_JEXEC') or die;

/**
 * Checks if the installation meets the current requirements for Joomla 4
 *
 * @return  boolean  True if any check fails.
 *
 * @since   3.7
 *
 * @link    https://developer.joomla.org/news/658-joomla4-manifesto.html
 * @link    https://developer.joomla.org/news/704-looking-forward-with-joomla-4.html
 * @link    https://developer.joomla.org/news/788-joomla-4-on-the-move.html
 */
function admin_postinstall_joomla40checks_condition()
{
	$db            = JFactory::getDbo();
	$serverType    = $db->getServerType();
	$serverVersion = $db->getVersion();

	if ($serverType == 'mssql')
	{
		// MS SQL support will be dropped
		return true;
	}

	if ($serverType == 'postgresql' && version_compare($serverVersion, '11.0', 'lt'))
	{
		// PostgreSQL minimum version is 11.0
		return true;
	}

	// Check whether we have a MariaDB version string and extract the proper version from it
	if ($serverType == 'mysql' && stripos($serverVersion, 'mariadb') !== false)
	{
		$serverVersion = preg_replace('/^5\.5\.5-/', '', $serverVersion);

		// MariaDB minimum version is 10.1
		if (version_compare($serverVersion, '10.1', 'lt'))
		{
			return true;
		}
	}

	if ($serverType == 'mysql' && version_compare($serverVersion, '5.6', 'lt'))
	{
		// MySQL minimum version is 5.6.0
		return true;
	}

	if ($db->name === 'mysql')
	{
		// Using deprecated MySQL driver
		return true;
	}

	if ($db->name === 'postgresql')
	{
		// Using deprecated PostgreSQL driver
		return true;
	}

	// PHP minimum version is 7.2.5
	return version_compare(PHP_VERSION, '7.2.5', 'lt');
}
components/com_admin/postinstall/htaccesssvg.php000060400000001320152453623450016262 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 *
 * This file contains post-installation message handling for notifying users of a change
 * in the default .htaccess file regarding hardening against XSS in SVG's
 */

defined('_JEXEC') or die;

/**
 * Notifies users of a change in the default .htaccess file regarding hardening against XSS in SVG's
 *
 * This check returns true regardless of condition.
 *
 * @return  boolean
 *
 * @since   3.9.21
 */
function admin_postinstall_htaccesssvg_condition()
{
	return true;
}
components/com_admin/postinstall/eaccelerator.php000060400000004661152453623450016411 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 *
 * This file contains post-installation message handling for eAccelerator compatibility.
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;

/**
 * Checks if the eAccelerator caching method is enabled.
 *
 * This check should be done through the 3.x series as the issue impacts migrated sites which will
 * most often come from the previous LTS release (2.5). Remove for version 4 or when eAccelerator support is added.
 *
 * This check returns true when the eAccelerator caching method is user, meaning that the message concerning it should be displayed.
 *
 * @return  integer
 *
 * @since   3.2
 */
function admin_postinstall_eaccelerator_condition()
{
	$app = JFactory::getApplication();
	$cacheHandler = $app->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 NOT using FTP.
	if (!$ftp['enabled'] && JPath::isOwner($file) && !JPath::setPermissions($file, '0444'))
	{
		JError::raiseNotice(500, JText::_('COM_CONFIG_ERROR_CONFIGURATION_PHP_NOTUNWRITABLE'));
	}
}
components/com_admin/postinstall/updatedefaultsettings.php000060400000001167152453623450020366 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 *
 * This file contains post-installation message handling for notifying users of a change
 * in various default settings.
 */

defined('_JEXEC') or die;

/**
 * Notifies users of a change in various default settings
 *
 * This check returns true regardless of condition.
 *
 * @return  boolean
 *
 * @since   3.8.8
 */
function admin_postinstall_updatedefaultsettings_condition()
{
	return true;
}
components/com_admin/postinstall/behindproxy.php000060400000004424152453623450016310 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Filesystem\File;
use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;

/**
 * Notifies users of the new Behind Load Balancer option in Global Config, if we detect they might be behind a proxy
 *
 * @return  boolean
 *
 * @since   3.9.26
 */
function admin_postinstall_behindproxy_condition()
{
	$app = JFactory::getApplication();

	if ($app->get('behind_loadbalancer', '0'))
	{
		return false;
	}

	if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER) && !empty($_SERVER['HTTP_X_FORWARDED_FOR']))
	{
		return true;
	}

	if (array_key_exists('HTTP_CLIENT_IP', $_SERVER) && !empty($_SERVER['HTTP_CLIENT_IP']))
	{
		return true;
	}

	return false;
}


/**
 * Enables the Behind Load Balancer setting in Global Configuration
 *
 * @return  void
 *
 * @since   3.9.26
 */
function behindproxy_postinstall_action()
{
	$prev = ArrayHelper::fromObject(new JConfig);
	$data = array_merge($prev, array('behind_loadbalancer' => '1'));

	$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 (!File::write($file, $configuration))
	{
		JFactory::getApplication()->enqueueMessage(JText::_('COM_CONFIG_ERROR_WRITE_FAILED'), 'error');

		return;
	}

	// Attempt to make the file unwriteable if NOT using FTP.
	if (!$ftp['enabled'] && JPath::isOwner($file) && !JPath::setPermissions($file, '0444'))
	{
		JError::raiseNotice(500, JText::_('COM_CONFIG_ERROR_CONFIGURATION_PHP_NOTUNWRITABLE'));
	}
}
components/com_admin/postinstall/addnosniff.php000060400000001271152453623450016065 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 *
 * This file contains post-installation message handling for notifying users of a change
 * in the default .htaccess and web.config files.
 */

defined('_JEXEC') or die;

/**
 * Notifies users of the add the nosniff headers by applying the changes from the default .htaccess or web.config file
 *
 * This check returns true regardless of condition.
 *
 * @return  boolean
 *
 * @since   3.4
 */
function admin_postinstall_addnosniff_condition()
{
	return true;
}
components/com_admin/postinstall/statscollection.php000060400000001063152453623450017163 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 *
 * This file contains post-installation message handling for the checking minimum PHP version support
 */

defined('_JEXEC') or die;

/**
 * Alerts the user we are collecting anonymous data as of Joomla 3.5.0.
 *
 * @return  boolean
 *
 * @since   3.5
 */
function admin_postinstall_statscollection_condition()
{
	return true;
}
components/com_admin/postinstall/htaccess.php000060400000001212152453623450015542 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2014 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 *
 * This file contains post-installation message handling for notifying users of a change
 * in the default .htaccess and web.config files.
 */

defined('_JEXEC') or die;

/**
 * Notifies users of a change in the default .htaccess or web.config file
 *
 * This check returns true regardless of condition.
 *
 * @return  boolean
 *
 * @since   3.4
 */
function admin_postinstall_htaccess_condition()
{
	return true;
}
components/com_admin/postinstall/languageaccess340.php000060400000002300152453623450017140 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 *
 * This file contains post-installation message handling for the checks if the installation is
 * affected by the issue with content languages access in 3.4.0
 */

defined('_JEXEC') or die;

/**
 * Checks if the installation is affected by the issue with content languages access in 3.4.0
 *
 * @link    https://github.com/joomla/joomla-cms/pull/6172
 * @link    https://github.com/joomla/joomla-cms/pull/6194
 *
 * @return  boolean
 *
 * @since   3.4.1
 */
function admin_postinstall_languageaccess340_condition()
{
	$db    = JFactory::getDbo();
	$query = $db->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;
}
components/com_admin/controller.php000060400000002173152453623450013563 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_admin
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Admin Controller
 *
 * @since  1.6
 */
class AdminController extends JControllerLegacy
{
	/**
	 * View method
	 *
	 * @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  \JControllerLegacy  A \JControllerLegacy object to support chaining.
	 *
	 * @since   3.9
	 */
	public function display($cachable = false, $urlparams = array())
	{
		$viewName = $this->input->get('view', $this->default_view);
		$format = $this->input->get('format', 'html');

		// Check CSRF token for sysinfo export views
		if ($viewName === 'sysinfo' && ($format === 'text' || $format === 'json'))
		{
			// Check for request forgeries.
			$this->checkToken('GET');
		}

		return parent::display($cachable, $urlparams);
	}
}
components/com_plugins/access.xml000060400000001010152453623450013230 0ustar00<?xml version="1.0" encoding="utf-8" ?>
<access component="com_plugins">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
	</section>
</access>
components/com_plugins/helpers/plugins.php000060400000006522152453623450015116 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_plugins
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Plugins component helper.
 *
 * @since  1.6
 */
class PluginsHelper
{
	public static $extension = 'com_plugins';

	/**
	 * Configure the Linkbar.
	 *
	 * @param   string  $vName  The name of the active view.
	 *
	 * @return  void
	 */
	public static function addSubmenu($vName)
	{
		// No submenu for this component.
	}

	/**
	 * Gets a list of the actions that can be performed.
	 *
	 * @return  JObject
	 *
	 * @deprecated  3.2  Use JHelperContent::getActions() instead
	 */
	public static function getActions()
	{
		// 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('com_plugins');
	}

	/**
	 * Returns an array of standard published state filter options.
	 *
	 * @return  array    The HTML code for the select tag
	 */
	public static function publishedOptions()
	{
		// Build the active state filter options.
		$options = array();
		$options[] = JHtml::_('select.option', '1', 'JENABLED');
		$options[] = JHtml::_('select.option', '0', 'JDISABLED');

		return $options;
	}

	/**
	 * Returns a list of folders filter options.
	 *
	 * @return  string    The HTML code for the select tag
	 */
	public static function folderOptions()
	{
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('DISTINCT(folder) AS value, folder AS text')
			->from('#__extensions')
			->where($db->quoteName('type') . ' = ' . $db->quote('plugin'))
			->order('folder');

		$db->setQuery($query);

		try
		{
			$options = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $e->getMessage());
		}

		return $options;
	}

	/**
	 * Returns a list of elements filter options.
	 *
	 * @return  string    The HTML code for the select tag
	 */
	public static function elementOptions()
	{
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('DISTINCT(element) AS value, element AS text')
			->from('#__extensions')
			->where($db->quoteName('type') . ' = ' . $db->quote('plugin'))
			->order('element');

		$db->setQuery($query);

		try
		{
			$options = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $e->getMessage());
		}

		return $options;
	}

	/**
	 * Parse the template file.
	 *
	 * @param   string  $templateBaseDir  Base path to the template directory.
	 * @param   string  $templateDir      Template directory.
	 *
	 * @return  JObject
	 */
	public function parseXMLTemplateFile($templateBaseDir, $templateDir)
	{
		$data = new JObject;

		// Check of the xml file exists.
		$filePath = JPath::clean($templateBaseDir . '/templates/' . $templateDir . '/templateDetails.xml');

		if (is_file($filePath))
		{
			$xml = JInstaller::parseXMLInstallFile($filePath);

			if ($xml['type'] != 'template')
			{
				return false;
			}

			foreach ($xml as $key => $value)
			{
				$data->set($key, $value);
			}
		}

		return $data;
	}
}
components/com_plugins/views/plugin/tmpl/edit.php000060400000012553152453623450016330 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_plugins
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('bootstrap.tooltip');
$this->fieldsets = $this->form->getFieldsets('params');

$input = JFactory::getApplication()->input;

// In case of modal
$isModal  = $input->get('layout') === 'modal' ? true : false;
$layout   = $isModal ? 'modal' : 'edit';
$tmpl     = $isModal || $input->get('tmpl', '', 'cmd') === 'component' ? '&tmpl=component' : '';

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(task) {
		if (task === 'plugin.cancel' || document.formvalidator.isValid(document.getElementById('style-form'))) {
			Joomla.submitform(task, document.getElementById('style-form'));

			if (task !== 'plugin.apply') {
				if (self !== top ) {
					window.top.setTimeout('window.parent.location = window.top.location.href', 1000);
					window.parent.jQuery('#plugin" . $this->item->extension_id . "Modal').modal('hide');
				}
			}
		}
	};
");
?>

<form action="<?php echo JRoute::_('index.php?option=com_plugins&view=plugin&layout=' . $layout . $tmpl . '&extension_id=' . (int) $this->item->extension_id); ?>" method="post" name="adminForm" id="style-form" class="form-validate">
	<div class="form-horizontal">

		<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'general')); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'general', JText::_('COM_PLUGINS_PLUGIN')); ?>

		<div class="row-fluid">
			<div class="span9">
				<?php if ($this->item->xml) : ?>
					<?php if ($this->item->xml->description) : ?>
						<h2>
							<?php
							if ($this->item->xml)
							{
								echo ($text = (string) $this->item->xml->name) ? JText::_($text) : $this->item->name;
							}
							else
							{
								echo JText::_('COM_PLUGINS_XML_ERR');
							}
							?>
						</h2>
						<div class="info-labels">
							<span class="label hasTooltip" title="<?php echo JHtml::_('tooltipText', 'COM_PLUGINS_FIELD_FOLDER_LABEL', 'COM_PLUGINS_FIELD_FOLDER_DESC'); ?>">
								<?php echo $this->form->getValue('folder'); ?>
							</span> /
							<span class="label hasTooltip" title="<?php echo JHtml::_('tooltipText', 'COM_PLUGINS_FIELD_ELEMENT_LABEL', 'COM_PLUGINS_FIELD_ELEMENT_DESC'); ?>">
								<?php echo $this->form->getValue('element'); ?>
							</span>
						</div>
						<div>
							<?php
							$short_description = JText::_($this->item->xml->description);
							$this->fieldset = 'description';
							$long_description = JLayoutHelper::render('joomla.edit.fieldset', $this);
							if (!$long_description) {
								$truncated = JHtml::_('string.truncate', $short_description, 550, true, false);
								if (strlen($truncated) > 500) {
									$long_description = $short_description;
									$short_description = JHtml::_('string.truncate', $truncated, 250);
									if ($short_description == $long_description) {
										$long_description = '';
									}
								}
							}
							?>
							<p><?php echo $short_description; ?></p>
							<?php if ($long_description) : ?>
								<p class="readmore">
									<a href="#" onclick="jQuery('.nav-tabs a[href=\'#description\']').tab('show');">
										<?php echo JText::_('JGLOBAL_SHOW_FULL_DESCRIPTION'); ?>
									</a>
								</p>
							<?php endif; ?>
						</div>
					<?php endif; ?>
				<?php else : ?>
					<div class="alert alert-error"><?php echo JText::_('COM_PLUGINS_XML_ERR'); ?></div>
				<?php endif; ?>

				<?php
				$this->fieldset = 'basic';
				$html = JLayoutHelper::render('joomla.edit.fieldset', $this);
				echo $html ? '<hr />' . $html : '';
				?>
			</div>
			<div class="span3">
				<?php echo JLayoutHelper::render('joomla.edit.global', $this); ?>
				<div class="form-vertical">
					<div class="control-group">
						<div class="control-label">
							<?php echo $this->form->getLabel('ordering'); ?>
						</div>
						<div class="controls">
							<?php echo $this->form->getInput('ordering'); ?>
						</div>
					</div>
					<div class="control-group">
						<div class="control-label">
							<?php echo $this->form->getLabel('folder'); ?>
						</div>
						<div class="controls">
							<?php echo $this->form->getInput('folder'); ?>
						</div>
					</div>
					<div class="control-group">
						<div class="control-label">
							<?php echo $this->form->getLabel('element'); ?>
						</div>
						<div class="controls">
							<?php echo $this->form->getInput('element'); ?>
						</div>
					</div>
				</div>
			</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php if (isset($long_description) && $long_description != '') : ?>
			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'description', JText::_('JGLOBAL_FIELDSET_DESCRIPTION')); ?>
			<?php echo $long_description; ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php endif; ?>

		<?php
		$this->fieldsets = array();
		$this->ignore_fieldsets = array('basic', 'description');
		echo JLayoutHelper::render('joomla.edit.params', $this);
		?>

		<?php echo JHtml::_('bootstrap.endTabSet'); ?>
	</div>

	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>
</form>

components/com_plugins/views/plugin/tmpl/modal.php000060400000002171152453623450016472 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_plugins
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// This code is needed for proper check out in case of modal close
JFactory::getDocument()->addScriptDeclaration('
	window.parent.jQuery(".modal").on("hidden", function () {
	if (typeof window.parent.jQuery("#plugin' . $this->item->extension_id . 'Modal iframe").contents().find("#closeBtn") !== "undefined") {
		window.parent.jQuery("#plugin' . $this->item->extension_id . 'Modal iframe").contents().find("#closeBtn").click();
		}
	});
');
?>
<button id="applyBtn" type="button" class="hidden" onclick="Joomla.submitbutton('plugin.apply');"></button>
<button id="saveBtn" type="button" class="hidden" onclick="Joomla.submitbutton('plugin.save');"></button>
<button id="closeBtn" type="button" class="hidden" onclick="Joomla.submitbutton('plugin.cancel');"></button>

<div class="container-popup">
	<?php $this->setLayout('edit'); ?>
	<?php echo $this->loadTemplate(); ?>
</div>

components/com_plugins/views/plugin/tmpl/edit_options.php000060400000002402152453623450020073 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_plugins
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

foreach ($this->fieldsets as $name => $fieldset)
{
	if (!isset($fieldset->repeat) || isset($fieldset->repeat) && $fieldset->repeat == false)
	{
		$label = !empty($fieldset->label) ? JText::_($fieldset->label) : JText::_('COM_PLUGINS_' . $fieldset->name . '_FIELDSET_LABEL', true);
		$optionsname = 'options-' . $fieldset->name;
		echo JHtml::_('bootstrap.addTab', 'myTab', $optionsname,  $label);

		if (isset($fieldset->description) && trim($fieldset->description))
		{
			echo '<p class="tip">' . $this->escape(JText::_($fieldset->description)) . '</p>';
		}

		$hidden_fields = '';

		foreach ($this->form->getFieldset($name) as $field)
		{
			if (!$field->hidden)
			{
				?>
				<div class="control-group">
					<div class="control-label">
						<?php echo $field->label; ?>
					</div>
					<div class="controls">
						<?php echo $field->input; ?>
					</div>
				</div>
			<?php
			}
			else
			{
				$hidden_fields .= $field->input;
			}
		}
		echo $hidden_fields;

		echo JHtml::_('bootstrap.endTab');
	}
}
components/com_plugins/views/plugin/view.html.php000060400000003640152453623450016341 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_plugins
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View to edit a plugin.
 *
 * @since  1.5
 */
class PluginsViewPlugin extends JViewLegacy
{
	protected $item;

	protected $form;

	protected $state;

	/**
	 * Display the view.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		$this->state = $this->get('State');
		$this->item  = $this->get('Item');
		$this->form  = $this->get('Form');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		$this->addToolbar();
		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		JFactory::getApplication()->input->set('hidemainmenu', true);

		$canDo = JHelperContent::getActions('com_plugins');

		JToolbarHelper::title(JText::sprintf('COM_PLUGINS_MANAGER_PLUGIN', JText::_($this->item->name)), 'power-cord plugin');

		// If not checked out, can save the item.
		if ($canDo->get('core.edit'))
		{
			JToolbarHelper::apply('plugin.apply');
			JToolbarHelper::save('plugin.save');
		}

		JToolbarHelper::cancel('plugin.cancel', 'JTOOLBAR_CLOSE');
		JToolbarHelper::divider();

		// Get the help information for the plugin item.
		$lang = JFactory::getLanguage();

		$help = $this->get('Help');

		if ($lang->hasKey($help->url))
		{
			$debug = $lang->setDebug(false);
			$url = JText::_($help->url);
			$lang->setDebug($debug);
		}
		else
		{
			$url = null;
		}

		JToolbarHelper::help($help->key, false, $url);
	}
}
components/com_plugins/views/plugins/view.html.php000060400000004720152453623450016524 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_plugins
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of plugins.
 *
 * @since  1.5
 */
class PluginsViewPlugins extends JViewLegacy
{
	protected $items;

	protected $pagination;

	protected $state;

	/**
	 * Display the view.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		$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);
		}

		$this->addToolbar();

		return parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		$canDo = JHelperContent::getActions('com_plugins');

		JToolbarHelper::title(JText::_('COM_PLUGINS_MANAGER_PLUGINS'), 'power-cord plugin');

		if ($canDo->get('core.edit'))
		{
			JToolbarHelper::editList('plugin.edit');
		}

		if ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::publish('plugins.publish', 'JTOOLBAR_ENABLE', true);
			JToolbarHelper::unpublish('plugins.unpublish', 'JTOOLBAR_DISABLE', true);
			JToolbarHelper::checkin('plugins.checkin');
		}

		if ($canDo->get('core.admin'))
		{
			JToolbarHelper::preferences('com_plugins');
		}

		JToolbarHelper::help('JHELP_EXTENSIONS_PLUGIN_MANAGER');

	}

	/**
	 * 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'),
			'enabled'      => JText::_('JSTATUS'),
			'name'         => JText::_('JGLOBAL_TITLE'),
			'folder'       => JText::_('COM_PLUGINS_FOLDER_HEADING'),
			'element'      => JText::_('COM_PLUGINS_ELEMENT_HEADING'),
			'access'       => JText::_('JGRID_HEADING_ACCESS'),
			'extension_id' => JText::_('JGRID_HEADING_ID'),
		);
	}
}
components/com_plugins/views/plugins/tmpl/default.php000060400000013176152453623450017214 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_plugins
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$user      = JFactory::getUser();
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$saveOrder = $listOrder == 'ordering';

if ($saveOrder)
{
	$saveOrderingUrl = 'index.php?option=com_plugins&task=plugins.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'pluginList', 'adminForm', strtolower($listDirn), $saveOrderingUrl);
}
?>
<form action="<?php echo JRoute::_('index.php?option=com_plugins&view=plugins'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<div class="clearfix"> </div>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('COM_PLUGINS_MSG_MANAGE_NO_PLUGINS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped" id="pluginList">
				<thead>
					<tr>
						<th width="1%" class="nowrap center hidden-phone">
							<?php echo JHtml::_('searchtools.sort', '', 'ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING', 'icon-menu-2'); ?>
						</th>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'enabled', $listDirn, $listOrder); ?>
						</th>
						<th class="title">
							<?php echo JHtml::_('searchtools.sort', 'COM_PLUGINS_NAME_HEADING', 'name', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_PLUGINS_FOLDER_HEADING', 'folder', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_PLUGINS_ELEMENT_HEADING', 'element', $listDirn, $listOrder); ?>
						</th>
						<th width="5%" class="hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ACCESS', 'access', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'extension_id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="8">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
				<?php foreach ($this->items as $i => $item) :
					$ordering   = ($listOrder == 'ordering');
					$canEdit    = $user->authorise('core.edit',       'com_plugins');
					$canCheckin = $user->authorise('core.manage',     'com_checkin') || $item->checked_out == $user->get('id') || $item->checked_out == 0;
					$canChange  = $user->authorise('core.edit.state', 'com_plugins') && $canCheckin;
					?>
					<tr class="row<?php echo $i % 2; ?>" sortable-group-id="<?php echo $item->folder; ?>">
						<td class="order nowrap center hidden-phone">
							<?php
							$iconClass = '';
							if (!$canChange)
							{
								$iconClass = ' inactive';
							}
							elseif (!$saveOrder)
							{
								$iconClass = ' inactive tip-top hasTooltip" title="' . JHtml::_('tooltipText', 'JORDERINGDISABLED');
							}
							?>
							<span class="sortable-handler<?php echo $iconClass; ?>">
								<span class="icon-menu" aria-hidden="true"></span>
							</span>
							<?php if ($canChange && $saveOrder) : ?>
								<input type="text" style="display:none" name="order[]" size="5" value="<?php echo $item->ordering; ?>" class="width-20 text-area-order" />
							<?php endif; ?>
						</td>
						<td class="center">
							<?php echo JHtml::_('grid.id', $i, $item->extension_id); ?>
						</td>
						<td class="center">
							<?php echo JHtml::_('jgrid.published', $item->enabled, $i, 'plugins.', $canChange); ?>
						</td>
						<td>
							<?php if ($item->checked_out) : ?>
								<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'plugins.', $canCheckin); ?>
							<?php endif; ?>
							<?php if ($canEdit) : ?>
								<a class="hasTooltip" href="<?php echo JRoute::_('index.php?option=com_plugins&task=plugin.edit&extension_id=' . (int) $item->extension_id); ?>" title="<?php echo JText::_('JACTION_EDIT'); ?>">
									<?php echo $item->name; ?></a>
							<?php else : ?>
									<?php echo $item->name; ?>
							<?php endif; ?>
						</td>
						<td class="nowrap small hidden-phone">
							<?php echo $this->escape($item->folder); ?>
						</td>
						<td class="nowrap small hidden-phone">
							<?php echo $this->escape($item->element); ?>
						</td>
						<td class="small hidden-phone">
							<?php echo $this->escape($item->access_level); ?>
						</td>
						<td class="hidden-phone">
							<?php echo (int) $item->extension_id; ?>
						</td>
					</tr>
				<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif; ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_plugins/views/plugins/tmpl/default.xml000060400000000320152453623450017210 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_PLUGINS_PLUGINS_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_PLUGINS_PLUGINS_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_plugins/controller.php000060400000003111152453623450014145 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_plugins
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Plugins master display controller.
 *
 * @since  1.5
 */
class PluginsController extends JControllerLegacy
{
	/**
	 * 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  JController		This object to support chaining.
	 *
	 * @since   1.5
	 */
	public function display($cachable = false, $urlparams = false)
	{
		JLoader::register('PluginsHelper', JPATH_ADMINISTRATOR . '/components/com_plugins/helpers/plugins.php');

		// Load the submenu.
		PluginsHelper::addSubmenu($this->input->get('view', 'plugins'));

		$view   = $this->input->get('view', 'plugins');
		$layout = $this->input->get('layout', 'default');
		$id     = $this->input->getInt('extension_id');

		// Check for edit form.
		if ($view == 'plugin' && $layout == 'edit' && !$this->checkEditId('com_plugins.edit.plugin', $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_plugins&view=plugins', false));

			return false;
		}

		parent::display();
	}
}
components/com_plugins/config.xml000060400000000542152453623450013245 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC">

		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			filter="rules"
			validate="rules"
			component="com_plugins"
			section="component" 
		/>
	</fieldset>
</config>
components/com_plugins/models/forms/filter_plugins.xml000060400000004461152453623450017443 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset addfieldpath="/administrator/components/com_plugins/models/fields" />

	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_PLUGINS_FILTER_SEARCH_LABEL"
			description="COM_PLUGINS_SEARCH_IN_TITLE"
			hint="JSEARCH_FILTER"
		/>

		<field
			name="enabled"
			type="plugin_status"
			onchange="this.form.submit();"
		>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>

		<field
			name="folder"
			type="plugintype"
			onchange="this.form.submit();"
		>
			<option value="">COM_PLUGINS_OPTION_FOLDER</option>
		</field>

		<field
			name="element"
			type="pluginelement"
			onchange="this.form.submit();"
		>
			<option value="">COM_PLUGINS_OPTION_ELEMENT</option>
		</field>

		<field
			name="access"
			type="accesslevel"
			label="JOPTION_FILTER_ACCESS"
			description="JOPTION_FILTER_ACCESS_DESC"
			onchange="this.form.submit();"
		>
			<option value="">JOPTION_SELECT_ACCESS</option>
		</field>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="folder ASC"
			validate="options"
		>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="ordering ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="ordering DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="enabled ASC">JSTATUS_ASC</option>
			<option value="enabled DESC">JSTATUS_DESC</option>
			<option value="name ASC">JGLOBAL_TITLE_ASC</option>
			<option value="name DESC">JGLOBAL_TITLE_DESC</option>
			<option value="folder ASC">COM_PLUGINS_HEADING_FOLDER_ASC</option>
			<option value="folder DESC">COM_PLUGINS_HEADING_FOLDER_DESC</option>
			<option value="element ASC">COM_PLUGINS_HEADING_ELEMENT_ASC</option>
			<option value="element DESC">COM_PLUGINS_HEADING_ELEMENT_DESC</option>
			<option value="access ASC">JGRID_HEADING_ACCESS_ASC</option>
			<option value="access DESC">JGRID_HEADING_ACCESS_DESC</option>
			<option value="extension_id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="extension_id DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_plugins/models/forms/plugin.xml000060400000002531152453623450015707 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset
		addfieldpath="/administrator/components/com_plugins/models/fields"
	>
		<field
			name="extension_id"
			type="text"
			label="JGLOBAL_FIELD_ID_LABEL"
			description="JGLOBAL_FIELD_ID_DESC"
			default="0"
			readonly="true"
			class="readonly" 
		/>

		<field
			name="name"
			type="hidden"
			label="COM_PLUGINS_FIELD_NAME_LABEL"
			description="COM_PLUGINS_FIELD_NAME_DESC" 
		/>

		<field
			name="enabled"
			type="list"
			label="JSTATUS"
			description="COM_PLUGINS_FIELD_ENABLED_DESC"
			class="chzn-color-state"
			size="1"
			default="1"
			>
			<option value="1">JENABLED</option>
			<option value="0">JDISABLED</option>
		</field>

		<field
			name="access"
			type="accesslevel"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			size="1" 
		/>

		<field
			name="ordering"
			type="pluginordering"
			label="JFIELD_ORDERING_LABEL"
			description="JFIELD_ORDERING_DESC" 
		/>

		<field
			name="folder"
			type="text"
			label="COM_PLUGINS_FIELD_FOLDER_LABEL"
			description="COM_PLUGINS_FIELD_FOLDER_DESC"
			class="readonly"
			size="20"
			readonly="true" 
		/>

		<field
			name="element"
			type="text"
			label="COM_PLUGINS_FIELD_ELEMENT_LABEL"
			description="COM_PLUGINS_FIELD_ELEMENT_DESC"
			class="readonly"
			size="20"
			readonly="true" 
		/>
	</fieldset>
</form>
components/com_plugins/models/plugins.php000060400000017450152453623450014741 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_plugins
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Methods supporting a list of plugin records.
 *
 * @since  1.6
 */
class PluginsModelPlugins extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'extension_id', 'a.extension_id',
				'name', 'a.name',
				'folder', 'a.folder',
				'element', 'a.element',
				'checked_out', 'a.checked_out',
				'checked_out_time', 'a.checked_out_time',
				'state', 'a.state',
				'enabled', 'a.enabled',
				'access', 'a.access', 'access_level',
				'ordering', 'a.ordering',
				'client_id', 'a.client_id',
			);
		}

		parent::__construct($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 = 'folder', $direction = 'asc')
	{
		// Load the filter state.
		$search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string');
		$this->setState('filter.search', $search);

		$accessId = $this->getUserStateFromRequest($this->context . '.filter.access', 'filter_access', '', 'cmd');
		$this->setState('filter.access', $accessId);

		$state = $this->getUserStateFromRequest($this->context . '.filter.enabled', 'filter_enabled', '', 'cmd');
		$this->setState('filter.enabled', $state);

		$folder = $this->getUserStateFromRequest($this->context . '.filter.folder', 'filter_folder', '', 'string');
		$this->setState('filter.folder', $folder);

		$element = $this->getUserStateFromRequest($this->context . '.filter.element', 'filter_element', '', 'string');
		$this->setState('filter.element', $element);

		// Load the parameters.
		$params = JComponentHelper::getParams('com_plugins');
		$this->setState('params', $params);

		// 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.access');
		$id .= ':' . $this->getState('filter.enabled');
		$id .= ':' . $this->getState('filter.folder');
		$id .= ':' . $this->getState('filter.element');

		return parent::getStoreId($id);
	}

	/**
	 * Returns an object list.
	 *
	 * @param   JDatabaseQuery  $query       A database query object.
	 * @param   integer         $limitstart  Offset.
	 * @param   integer         $limit       The number of records.
	 *
	 * @return  array
	 */
	protected function _getList($query, $limitstart = 0, $limit = 0)
	{
		$search = $this->getState('filter.search');
		$ordering = $this->getState('list.ordering', 'ordering');

		// If "Sort Table By:" is not set, set ordering to name
		if ($ordering == '')
		{
			$ordering = 'name';
		}

		if ($ordering == 'name' || (!empty($search) && stripos($search, 'id:') !== 0))
		{
			$this->_db->setQuery($query);
			$result = $this->_db->loadObjectList();
			$this->translate($result);

			if (!empty($search))
			{
				$escapedSearchString = $this->refineSearchStringToRegex($search, '/');

				foreach ($result as $i => $item)
				{
					if (!preg_match("/$escapedSearchString/i", $item->name))
					{
						unset($result[$i]);
					}
				}
			}

			$orderingDirection = strtolower($this->getState('list.direction'));
			$direction         = ($orderingDirection == 'desc') ? -1 : 1;
			$result = ArrayHelper::sortObjects($result, $ordering, $direction, true, true);

			$total = count($result);
			$this->cache[$this->getStoreId('getTotal')] = $total;

			if ($total < $limitstart)
			{
				$limitstart = 0;
				$this->setState('list.start', 0);
			}

			return array_slice($result, $limitstart, $limit ?: null);
		}
		else
		{
			if ($ordering == 'ordering')
			{
				$query->order('a.folder ASC');
				$ordering = 'a.ordering';
			}

			$query->order($this->_db->quoteName($ordering) . ' ' . $this->getState('list.direction'));

			if ($ordering == 'folder')
			{
				$query->order('a.ordering ASC');
			}

			$result = parent::_getList($query, $limitstart, $limit);
			$this->translate($result);

			return $result;
		}
	}

	/**
	 * Translate a list of objects.
	 *
	 * @param   array  &$items  The array of objects.
	 *
	 * @return  array The array of translated objects.
	 */
	protected function translate(&$items)
	{
		$lang = JFactory::getLanguage();

		foreach ($items as &$item)
		{
			$source = JPATH_PLUGINS . '/' . $item->folder . '/' . $item->element;
			$extension = 'plg_' . $item->folder . '_' . $item->element;
			$lang->load($extension . '.sys', JPATH_ADMINISTRATOR, null, false, true)
				|| $lang->load($extension . '.sys', $source, null, false, true);
			$item->name = JText::_($item->name);
		}
	}

	/**
	 * 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);

		// Select the required fields from the table.
		$query->select(
			$this->getState(
				'list.select',
				'a.extension_id , a.name, a.element, a.folder, a.checked_out, a.checked_out_time,' .
					' a.enabled, a.access, a.ordering'
			)
		)
			->from($db->quoteName('#__extensions') . ' AS a')
			->where($db->quoteName('type') . ' = ' . $db->quote('plugin'));

		// 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');

		// Filter by access level.
		if ($access = $this->getState('filter.access'))
		{
			$query->where('a.access = ' . (int) $access);
		}

		// Filter by published state.
		$published = $this->getState('filter.enabled');

		if (is_numeric($published))
		{
			$query->where('a.enabled = ' . (int) $published);
		}
		elseif ($published === '')
		{
			$query->where('(a.enabled IN (0, 1))');
		}

		// Filter by state.
		$query->where('a.state >= 0');

		// Filter by folder.
		if ($folder = $this->getState('filter.folder'))
		{
			$query->where('a.folder = ' . $db->quote($folder));
		}

		// Filter by element.
		if ($element = $this->getState('filter.element'))
		{
			$query->where('a.element = ' . $db->quote($element));
		}

		// Filter by search in name or id.
		$search = $this->getState('filter.search');

		if (!empty($search))
		{
			if (stripos($search, 'id:') === 0)
			{
				$query->where('a.extension_id = ' . (int) substr($search, 3));
			}
		}

		return $query;
	}

	/**
	 * Method to get the data that should be injected in the form.
	 *
	 * @return	mixed	The data for the form.
	 *
	 * @since	3.5
	 */
	protected function loadFormData()
	{
		$data = parent::loadFormData();

		// Set the selected filter values for pages that use the JLayouts for filtering
		$data->list['sortTable'] = $this->state->get('list.ordering');
		$data->list['directionTable'] = $this->state->get('list.direction');

		return $data;
	}
}
components/com_plugins/models/fields/plugintype.php000060400000001551152453623450016721 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_plugins
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('PluginsHelper', JPATH_ADMINISTRATOR . '/components/com_plugins/helpers/plugins.php');

JFormHelper::loadFieldClass('list');

/**
 * Plugin Type field.
 *
 * @since  3.5
 */
class JFormFieldPluginType extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.5
	 */
	protected $type = 'PluginType';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   3.5
	 */
	public function getOptions()
	{
		$options = PluginsHelper::folderOptions();

		return array_merge(parent::getOptions(), $options);
	}
}
components/com_plugins/models/fields/pluginelement.php000060400000001571152453623450017373 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_plugins
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('PluginsHelper', JPATH_ADMINISTRATOR . '/components/com_plugins/helpers/plugins.php');

JFormHelper::loadFieldClass('list');

/**
 * Plugin Element field.
 *
 * @since  3.9.0
 */
class JFormFieldPluginElement extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.9.0
	 */
	protected $type = 'PluginElement';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   3.9.0
	 */
	public function getOptions()
	{
		$options = PluginsHelper::elementOptions();

		return array_merge(parent::getOptions(), $options);
	}
}
components/com_plugins/models/fields/pluginordering.php000060400000002625152453623450017554 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_plugins
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JFormHelper::loadFieldClass('ordering');

/**
 * Supports an HTML select list of plugins.
 *
 * @since  1.6
 */
class JFormFieldPluginordering extends JFormFieldOrdering
{
	/**
	 * The form field type.
	 *
	 * @var		string
	 * @since   1.6
	 */
	protected $type = 'Pluginordering';

	/**
	 * Builds the query for the ordering list.
	 *
	 * @return  JDatabaseQuery  The query for the ordering form field.
	 */
	protected function getQuery()
	{
		$db     = JFactory::getDbo();
		$folder = $this->form->getValue('folder');

		// Build the query for the ordering list.
		$query = $db->getQuery(true)
			->select(
				array(
					$db->quoteName('ordering', 'value'),
					$db->quoteName('name', 'text'),
					$db->quoteName('type'),
					$db->quote('folder'),
					$db->quote('extension_id')
				)
			)
			->from($db->quoteName('#__extensions'))
			->where('(type =' . $db->quote('plugin') . 'AND folder=' . $db->quote($folder) . ')')
			->order('ordering');

		return $query;
	}

	/**
	 * Retrieves the current Item's Id.
	 *
	 * @return  integer  The current item ID.
	 */
	protected function getItemId()
	{
		return (int) $this->form->getValue('extension_id');
	}
}
components/com_plugins/models/plugin.php000060400000022524152453623450014554 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_plugins
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;

/**
 * Plugin model.
 *
 * @since  1.6
 */
class PluginsModelPlugin extends JModelAdmin
{
	/**
	 * @var     string  The help screen key for the module.
	 * @since   1.6
	 */
	protected $helpKey = 'JHELP_EXTENSIONS_PLUGIN_MANAGER_EDIT';

	/**
	 * @var     string  The help screen base URL for the module.
	 * @since   1.6
	 */
	protected $helpURL;

	/**
	 * @var     array  An array of cached plugin items.
	 * @since   1.6
	 */
	protected $_cache;

	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 */
	public function __construct($config = array())
	{
		$config = array_merge(
			array(
				'event_after_save'  => 'onExtensionAfterSave',
				'event_before_save' => 'onExtensionBeforeSave',
				'events_map'        => array(
					'save' => 'extension'
				)
			), $config
		);

		parent::__construct($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    A JForm object on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function getForm($data = array(), $loadData = true)
	{
		// The folder and element vars are passed when saving the form.
		if (empty($data))
		{
			$item    = $this->getItem();
			$folder  = $item->folder;
			$element = $item->element;
		}
		else
		{
			$folder  = ArrayHelper::getValue($data, 'folder', '', 'cmd');
			$element = ArrayHelper::getValue($data, 'element', '', 'cmd');
		}

		// Add the default fields directory
		JForm::addFieldPath(JPATH_PLUGINS . '/' . $folder . '/' . $element . '/field');

		// These variables are used to add data from the plugin XML files.
		$this->setState('item.folder', $folder);
		$this->setState('item.element', $element);

		// Get the form.
		$form = $this->loadForm('com_plugins.plugin', 'plugin', 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('ordering', 'disabled', 'true');
			$form->setFieldAttribute('enabled', '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('enabled', '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.
		$data = JFactory::getApplication()->getUserState('com_plugins.edit.plugin.data', array());

		if (empty($data))
		{
			$data = $this->getItem();
		}

		$this->preprocessData('com_plugins.plugin', $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.
	 */
	public function getItem($pk = null)
	{
		$pk = (!empty($pk)) ? $pk : (int) $this->getState('plugin.id');

		if (!isset($this->_cache[$pk]))
		{
			// Get a row instance.
			$table = $this->getTable();

			// Attempt to load the row.
			$return = $table->load($pk);

			// Check for a table object error.
			if ($return === false && $table->getError())
			{
				$this->setError($table->getError());

				return false;
			}

			// Convert to the JObject before adding other data.
			$properties = $table->getProperties(1);
			$this->_cache[$pk] = ArrayHelper::toObject($properties, 'JObject');

			// Convert the params field to an array.
			$registry = new Registry($table->params);
			$this->_cache[$pk]->params = $registry->toArray();

			// Get the plugin XML.
			$path = JPath::clean(JPATH_PLUGINS . '/' . $table->folder . '/' . $table->element . '/' . $table->element . '.xml');

			if (file_exists($path))
			{
				$this->_cache[$pk]->xml = simplexml_load_file($path);
			}
			else
			{
				$this->_cache[$pk]->xml = null;
			}
		}

		return $this->_cache[$pk];
	}

	/**
	 * Returns a reference to the 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
	 */
	public function getTable($type = 'Extension', $prefix = 'JTable', $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()
	{
		// Execute the parent method.
		parent::populateState();

		$app = JFactory::getApplication('administrator');

		// Load the User state.
		$pk = $app->input->getInt('extension_id');
		$this->setState('plugin.id', $pk);
	}

	/**
	 * Preprocess the form.
	 *
	 * @param   JForm   $form   A form object.
	 * @param   mixed   $data   The data expected for the form.
	 * @param   string  $group  Cache group name.
	 *
	 * @return  mixed  True if successful.
	 *
	 * @throws	Exception if there is an error in the form event.
	 * @since   1.6
	 */
	protected function preprocessForm(JForm $form, $data, $group = 'content')
	{
		jimport('joomla.filesystem.path');

		$folder  = $this->getState('item.folder');
		$element = $this->getState('item.element');
		$lang    = JFactory::getLanguage();

		// Load the core and/or local language sys file(s) for the ordering field.
		$db    = $this->getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('element'))
			->from($db->quoteName('#__extensions'))
			->where($db->quoteName('type') . ' = ' . $db->quote('plugin'))
			->where($db->quoteName('folder') . ' = ' . $db->quote($folder));
		$db->setQuery($query);
		$elements = $db->loadColumn();

		foreach ($elements as $elementa)
		{
			$lang->load('plg_' . $folder . '_' . $elementa . '.sys', JPATH_ADMINISTRATOR, null, false, true)
			|| $lang->load('plg_' . $folder . '_' . $elementa . '.sys', JPATH_PLUGINS . '/' . $folder . '/' . $elementa, null, false, true);
		}

		if (empty($folder) || empty($element))
		{
			$app = JFactory::getApplication();
			$app->redirect(JRoute::_('index.php?option=com_plugins&view=plugins', false));
		}

		$formFile = JPath::clean(JPATH_PLUGINS . '/' . $folder . '/' . $element . '/' . $element . '.xml');

		if (!file_exists($formFile))
		{
			throw new Exception(JText::sprintf('COM_PLUGINS_ERROR_FILE_NOT_FOUND', $element . '.xml'));
		}

		// Load the core and/or local language file(s).
			$lang->load('plg_' . $folder . '_' . $element, JPATH_ADMINISTRATOR, null, false, true)
		||	$lang->load('plg_' . $folder . '_' . $element, JPATH_PLUGINS . '/' . $folder . '/' . $element, null, false, true);

		if (file_exists($formFile))
		{
			// Get the plugin form.
			if (!$form->loadFile($formFile, false, '//config'))
			{
				throw new Exception(JText::_('JERROR_LOADFILE_FAILED'));
			}
		}

		// Attempt to load the xml file.
		if (!$xml = simplexml_load_file($formFile))
		{
			throw new Exception(JText::_('JERROR_LOADFILE_FAILED'));
		}

		// Get the help data from the XML file if present.
		$help = $xml->xpath('/extension/help');

		if (!empty($help))
		{
			$helpKey = trim((string) $help[0]['key']);
			$helpURL = trim((string) $help[0]['url']);

			$this->helpKey = $helpKey ?: $this->helpKey;
			$this->helpURL = $helpURL ?: $this->helpURL;
		}

		// Trigger the default form events.
		parent::preprocessForm($form, $data, $group);
	}

	/**
	 * A protected method to get a set of ordering conditions.
	 *
	 * @param   object  $table  A record object.
	 *
	 * @return  array  An array of conditions to add to add to ordering queries.
	 *
	 * @since   1.6
	 */
	protected function getReorderConditions($table)
	{
		$condition = array();
		$condition[] = 'type = ' . $this->_db->quote($table->type);
		$condition[] = 'folder = ' . $this->_db->quote($table->folder);

		return $condition;
	}

	/**
	 * Override method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function save($data)
	{
		// Setup type.
		$data['type'] = 'plugin';

		return parent::save($data);
	}

	/**
	 * Get the necessary data to load an item help screen.
	 *
	 * @return  object  An object with key, url, and local properties for loading the item help screen.
	 *
	 * @since   1.6
	 */
	public function getHelp()
	{
		return (object) array('key' => $this->helpKey, 'url' => $this->helpURL);
	}

	/**
	 * Custom clean cache method, plugins are cached in 2 places for different clients.
	 *
	 * @param   string   $group     Cache group name.
	 * @param   integer  $clientId  Application client id.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function cleanCache($group = null, $clientId = 0)
	{
		parent::cleanCache('com_plugins', 0);
		parent::cleanCache('com_plugins', 1);
	}
}
components/com_plugins/plugins.xml000060400000001747152453623450013471 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_plugins</name>
	<author>Joomla! Project</author>
	<creationDate>April 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_PLUGINS_XML_DESCRIPTION</description>
	<administration>
		<files folder="admin">
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<filename>plugins.php</filename>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_plugins.ini</language>
			<language tag="en-GB">language/en-GB.com_plugins.sys.ini</language>
		</languages>
	</administration>
</extension>
components/com_plugins/plugins.php000060400000001126152453623450013447 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_plugins
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
JHtml::_('behavior.tabstate');

if (!JFactory::getUser()->authorise('core.manage', 'com_plugins'))
{
	throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
}

$controller = JControllerLegacy::getInstance('Plugins');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
components/com_plugins/controllers/plugins.php000060400000001546152453623450016023 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_plugins
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Plugins list controller class.
 *
 * @since  1.6
 */
class PluginsControllerPlugins extends JControllerAdmin
{
	/**
	 * 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.6
	 */
	public function getModel($name = 'Plugin', $prefix = 'PluginsModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}
}
components/com_plugins/controllers/plugin.php000060400000000571152453623450015635 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_plugins
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Plugin controller class.
 *
 * @since  1.6
 */
class PluginsControllerPlugin extends JControllerForm
{
}
components/com_templates/tables/style.php000060400000006176152453623450014727 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

/**
 * Template style table class.
 *
 * @since  1.6
 */
class TemplatesTableStyle extends JTable
{
	/**
	 * Constructor
	 *
	 * @param   JDatabaseDriver  &$db  A database connector object
	 *
	 * @since   1.6
	 */
	public function __construct(&$db)
	{
		parent::__construct('#__template_styles', 'id', $db);
	}

	/**
	 * Overloaded bind function to pre-process the params.
	 *
	 * @param   array  $array   Named array
	 * @param   mixed  $ignore  An optional array or space separated list of properties to ignore while binding.
	 *
	 * @return  null|string	null if operation was satisfactory, otherwise returns an error
	 *
	 * @since   1.6
	 */
	public function bind($array, $ignore = '')
	{
		if (isset($array['params']) && is_array($array['params']))
		{
			$registry = new Registry($array['params']);
			$array['params'] = (string) $registry;
		}

		// Verify that the default style is not unset
		if ($array['home'] == '0' && $this->home == '1')
		{
			$this->setError(JText::_('COM_TEMPLATES_ERROR_CANNOT_UNSET_DEFAULT_STYLE'));

			return false;
		}

		return parent::bind($array, $ignore);
	}

	/**
	 * Overloaded check method to ensure data integrity.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function check()
	{
		if (empty($this->title))
		{
			$this->setError(JText::_('COM_TEMPLATES_ERROR_STYLE_REQUIRES_TITLE'));

			return false;
		}

		return true;
	}

	/**
	 * Overloaded store method to ensure unicity of default style.
	 *
	 * @param   boolean  $updateNulls  True to update fields even if they are null.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function store($updateNulls = false)
	{
		if ($this->home != '0')
		{
			$query = $this->_db->getQuery(true)
				->update('#__template_styles')
				->set('home=\'0\'')
				->where('client_id=' . (int) $this->client_id)
				->where('home=' . $this->_db->quote($this->home));
			$this->_db->setQuery($query);
			$this->_db->execute();
		}

		return parent::store($updateNulls);
	}

	/**
	 * Overloaded store method to unsure existence of a default style for a template.
	 *
	 * @param   mixed  $pk  An optional primary key value to delete.  If not set the instance property value is used.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function delete($pk = null)
	{
		$k = $this->_tbl_key;
		$pk = is_null($pk) ? $this->$k : $pk;

		if (!is_null($pk))
		{
			$query = $this->_db->getQuery(true)
				->from('#__template_styles')
				->select('id')
				->where('client_id=' . (int) $this->client_id)
				->where('template=' . $this->_db->quote($this->template));
			$this->_db->setQuery($query);
			$results = $this->_db->loadColumn();

			if (count($results) == 1 && $results[0] == $pk)
			{
				$this->setError(JText::_('COM_TEMPLATES_ERROR_CANNOT_DELETE_LAST_STYLE'));

				return false;
			}
		}

		return parent::delete($pk);
	}
}
components/com_templates/views/styles/tmpl/default.php000060400000015574152453623450017377 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$user      = JFactory::getUser();
$clientId = (int) $this->state->get('client_id', 0);
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$colSpan = $clientId === 1 ? 5 : 6;
?>
<form action="<?php echo JRoute::_('index.php?option=com_templates&view=styles'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty($this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this, 'options' => array('selectorFieldName' => 'client_id'))); ?>
		<?php if ($this->total > 0) : ?>
			<table class="table table-striped" id="styleList">
				<thead>
					<tr>
						<th width="1%" class="nowrap center">
							&#160;
						</th>
						<th class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_TEMPLATES_HEADING_STYLE', 'a.title', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'COM_TEMPLATES_HEADING_DEFAULT', 'a.home', $listDirn, $listOrder); ?>
						</th>
						<?php if ($clientId === 0) : ?>
						<th width="20%" class="nowrap hidden-phone">
							<?php echo JText::_('COM_TEMPLATES_HEADING_PAGES'); ?>
						</th>
						<?php endif; ?>
						<th width="30%" class="hidden-phone hidden-tablet">
							<?php echo JHtml::_('searchtools.sort', 'COM_TEMPLATES_HEADING_TEMPLATE', 'a.template', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone hidden-tablet">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="<?php echo $colSpan; ?>">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
					<?php foreach ($this->items as $i => $item) :
						$canCreate = $user->authorise('core.create',     'com_templates');
						$canEdit   = $user->authorise('core.edit',       'com_templates');
						$canChange = $user->authorise('core.edit.state', 'com_templates');
					?>
					<tr class="row<?php echo $i % 2; ?>">
						<td width="1%" class="center">
							<?php echo JHtml::_('grid.id', $i, $item->id); ?>
						</td>
						<td>
							<?php if ($this->preview && $item->client_id == '0') : ?>
								<a target="_blank" href="<?php echo JUri::root() . 'index.php?tp=1&templateStyle=' . (int) $item->id ?>" class="jgrid">
								<span class="icon-eye-open hasTooltip" aria-hidden="true" title="<?php echo JHtml::_('tooltipText', JText::_('COM_TEMPLATES_TEMPLATE_PREVIEW'), $item->title, 0); ?>"></span>
								<span class="element-invisible"><?php echo JText::_('COM_TEMPLATES_TEMPLATE_PREVIEW'); ?></span>
								</a>
							<?php elseif ($item->client_id == '1') : ?>
								<span class="icon-eye-close disabled hasTooltip" aria-hidden="true" title="<?php echo JHtml::_('tooltipText', 'COM_TEMPLATES_TEMPLATE_NO_PREVIEW_ADMIN'); ?>"></span>
								<span class="element-invisible"><?php echo JText::_('COM_TEMPLATES_TEMPLATE_NO_PREVIEW_ADMIN'); ?></span>
							<?php else: ?>
								<span class="icon-eye-close disabled hasTooltip" aria-hidden="true" title="<?php echo JHtml::_('tooltipText', 'COM_TEMPLATES_TEMPLATE_NO_PREVIEW'); ?>"></span>
								<span class="element-invisible"><?php echo JText::_('COM_TEMPLATES_TEMPLATE_NO_PREVIEW'); ?></span>
							<?php endif; ?>
							<?php if ($canEdit) : ?>
							<a href="<?php echo JRoute::_('index.php?option=com_templates&task=style.edit&id=' . (int) $item->id); ?>">
								<?php echo $this->escape($item->title); ?></a>
							<?php else : ?>
								<?php echo $this->escape($item->title); ?>
							<?php endif; ?>
						</td>
						<td class="center">
							<?php if ($item->home == '0' || $item->home == '1') : ?>
								<?php echo JHtml::_('jgrid.isdefault', $item->home != '0', $i, 'styles.', $canChange && $item->home != '1'); ?>
							<?php elseif ($canChange) : ?>
								<a href="<?php echo JRoute::_('index.php?option=com_templates&task=styles.unsetDefault&cid[]=' . $item->id . '&' . JSession::getFormToken() . '=1'); ?>">
									<?php if ($item->image) : ?>
										<?php echo JHtml::_('image', 'mod_languages/' . $item->image . '.gif', $item->language_title, array('title' => JText::sprintf('COM_TEMPLATES_GRID_UNSET_LANGUAGE', $item->language_title)), true); ?>
									<?php else : ?>
										<span class="label" title="<?php echo JText::sprintf('COM_TEMPLATES_GRID_UNSET_LANGUAGE', $item->language_title); ?>"><?php echo $item->language_sef; ?></span>
									<?php endif; ?>
								</a>
							<?php else : ?>
								<?php if ($item->image) : ?>
									<?php echo JHtml::_('image', 'mod_languages/' . $item->image . '.gif', $item->language_title, array('title' => $item->language_title), true); ?>
								<?php else : ?>
									<span class="label" title="<?php echo $item->language_title; ?>"><?php echo $item->language_sef; ?></span>
								<?php endif; ?>
							<?php endif; ?>
						</td>
						<?php if ($clientId === 0) : ?>
						<td class="small hidden-phone">
							<?php if ($item->home == '1') : ?>
								<?php echo JText::_('COM_TEMPLATES_STYLES_PAGES_ALL'); ?>
							<?php elseif ($item->home != '0' && $item->home != '1') : ?>
								<?php echo JText::sprintf('COM_TEMPLATES_STYLES_PAGES_ALL_LANGUAGE', $this->escape($item->language_title)); ?>
							<?php elseif ($item->assigned > 0) : ?>
								<?php echo JText::sprintf('COM_TEMPLATES_STYLES_PAGES_SELECTED', $this->escape($item->assigned)); ?>
							<?php else : ?>
								<?php echo JText::_('COM_TEMPLATES_STYLES_PAGES_NONE'); ?>
							<?php endif; ?>
						</td>
						<?php endif; ?>
						<td class="hidden-phone hidden-tablet">
							<label for="cb<?php echo $i; ?>" class="small">
								<a href="<?php echo JRoute::_('index.php?option=com_templates&view=template&id=' . (int) $item->e_id); ?>  ">
									<?php echo ucfirst($this->escape($item->template)); ?>
								</a>
							</label>
						</td>
						<td class="hidden-phone hidden-tablet">
							<?php echo (int) $item->id; ?>
						</td>
					</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif; ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_templates/views/styles/tmpl/default.xml000060400000000320152453623450017367 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_TEMPLATES_STYLE_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_TEMPLATES_STYLE_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_templates/views/styles/view.html.php000060400000005331152453623450016702 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of template styles.
 *
 * @since  1.6
 */
class TemplatesViewStyles extends JViewLegacy
{
	protected $items;

	protected $pagination;

	protected $state;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		$this->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');
		$this->preview       = JComponentHelper::getParams('com_templates')->get('template_positions_display');

		TemplatesHelper::addSubmenu('styles');

		// 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()
	{
		$canDo = JHelperContent::getActions('com_templates');

		// Set the title.
		if ((int) $this->get('State')->get('client_id') === 1)
		{
			JToolbarHelper::title(JText::_('COM_TEMPLATES_MANAGER_STYLES_ADMIN'), 'eye thememanager');
		}
		else
		{
			JToolbarHelper::title(JText::_('COM_TEMPLATES_MANAGER_STYLES_SITE'), 'eye thememanager');
		}

		if ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::makeDefault('styles.setDefault', 'COM_TEMPLATES_TOOLBAR_SET_HOME');
			JToolbarHelper::divider();
		}

		if ($canDo->get('core.edit'))
		{
			JToolbarHelper::editList('style.edit');
		}

		if ($canDo->get('core.create'))
		{
			JToolbarHelper::custom('styles.duplicate', 'copy.png', 'copy_f2.png', 'JTOOLBAR_DUPLICATE', true);
			JToolbarHelper::divider();
		}

		if ($canDo->get('core.delete'))
		{
			JToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'styles.delete', 'JTOOLBAR_DELETE');
			JToolbarHelper::divider();
		}

		if ($canDo->get('core.admin') || $canDo->get('core.options'))
		{
			JToolbarHelper::preferences('com_templates');
			JToolbarHelper::divider();
		}

		JToolbarHelper::help('JHELP_EXTENSIONS_TEMPLATE_MANAGER_STYLES');

		JHtmlSidebar::setAction('index.php?option=com_templates&view=styles');

	}
}
components/com_templates/views/templates/tmpl/default.php000060400000010234152453623450020036 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$user      = JFactory::getUser();
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>

<form action="<?php echo JRoute::_('index.php?option=com_templates&view=templates'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty($this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this, 'options' => array('selectorFieldName' => 'client_id'))); ?>
		<?php if ($this->total > 0) : ?>
		<table class="table table-striped" id="template-mgr">
			<thead>
				<tr>
					<th class="col1template hidden-phone" width="20%">
						<?php echo JText::_('COM_TEMPLATES_HEADING_IMAGE'); ?>
					</th>
					<th width="30%">
						<?php echo JHtml::_('searchtools.sort', 'COM_TEMPLATES_HEADING_TEMPLATE', 'a.element', $listDirn, $listOrder); ?>
					</th>
					<th width="10%" class="hidden-phone">
						<?php echo JText::_('JVERSION'); ?>
					</th>
					<th width="15%" class="hidden-phone">
						<?php echo JText::_('JDATE'); ?>
					</th>
					<th width="25%" class="hidden-phone">
						<?php echo JText::_('JAUTHOR'); ?>
					</th>
				</tr>
			</thead>
			<tfoot>
				<tr>
					<td colspan="5">
						<?php echo $this->pagination->getListFooter(); ?>
					</td>
				</tr>
			</tfoot>
			<tbody>
			<?php foreach ($this->items as $i => $item) : ?>
				<tr class="row<?php echo $i % 2; ?>">
					<td class="center hidden-phone">
						<?php echo JHtml::_('templates.thumb', $item->element, $item->client_id); ?>
						<?php echo JHtml::_('templates.thumbModal', $item->element, $item->client_id); ?>
					</td>
					<td class="template-name">
						<a href="<?php echo JRoute::_('index.php?option=com_templates&view=template&id=' . (int) $item->extension_id . '&file=' . $this->file); ?>">
							<?php echo JText::sprintf('COM_TEMPLATES_TEMPLATE_DETAILS', ucfirst($item->name)); ?></a>
						<div>
						<?php if ($this->preview && $item->client_id == '0') : ?>
							<a href="<?php echo JRoute::_(JUri::root() . 'index.php?tp=1&template=' . $item->element); ?>" target="_blank">
							<?php echo JText::_('COM_TEMPLATES_TEMPLATE_PREVIEW'); ?>
							</a>
						<?php elseif ($item->client_id == '1') : ?>
							<?php echo JText::_('COM_TEMPLATES_TEMPLATE_NO_PREVIEW_ADMIN'); ?>
						<?php else : ?>
							<span class="hasTooltip" title="<?php echo JHtml::_('tooltipText', 'COM_TEMPLATES_TEMPLATE_NO_PREVIEW_DESC'); ?>"><?php echo JText::_('COM_TEMPLATES_TEMPLATE_NO_PREVIEW'); ?></span>
						<?php endif; ?>
						</div>
					</td>
					<td class="small hidden-phone">
						<?php echo $this->escape($item->xmldata->get('version')); ?>
					</td>
					<td class="small hidden-phone">
						<?php echo $this->escape($item->xmldata->get('creationDate')); ?>
					</td>
					<td class="hidden-phone">
						<?php if ($author = $item->xmldata->get('author')) : ?>
							<div><?php echo $this->escape($author); ?></div>
						<?php else : ?>
							&mdash;
						<?php endif; ?>
						<?php if ($email = $item->xmldata->get('authorEmail')) : ?>
							<div><?php echo $this->escape($email); ?></div>
						<?php endif; ?>
						<?php if ($url = $item->xmldata->get('authorUrl')) : ?>
							<div><a href="<?php echo $this->escape($url); ?>"><?php echo $this->escape($url); ?></a></div>
						<?php endif; ?>
					</td>
				</tr>
				<?php endforeach; ?>
			</tbody>
		</table>
	<?php endif; ?>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="boxchecked" value="0" />
	<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_templates/views/templates/tmpl/default.xml000060400000000330152453623450020043 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_TEMPLATES_TEMPLATES_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_TEMPLATES_TEMPLATES_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_templates/views/templates/view.html.php000060400000004645152453623450017364 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of template styles.
 *
 * @since  1.6
 */
class TemplatesViewTemplates extends JViewLegacy
{
	/**
	 * @var		array
	 * @since   1.6
	 */
	protected $items;

	/**
	 * @var		object
	 * @since   1.6
	 */
	protected $pagination;

	/**
	 * @var		object
	 * @since   1.6
	 */
	protected $state;

	/**
	 * @var		string
	 * @since   3.2
	 */
	protected $file;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		$this->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');
		$this->preview       = JComponentHelper::getParams('com_templates')->get('template_positions_display');
		$this->file          = base64_encode('home');

		TemplatesHelper::addSubmenu('templates');

		// 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()
	{
		$canDo = JHelperContent::getActions('com_templates');

		// Set the title.
		if ((int) $this->get('State')->get('client_id') === 1)
		{
			JToolbarHelper::title(JText::_('COM_TEMPLATES_MANAGER_TEMPLATES_ADMIN'), 'eye thememanager');
		}
		else
		{
			JToolbarHelper::title(JText::_('COM_TEMPLATES_MANAGER_TEMPLATES_SITE'), 'eye thememanager');
		}

		if ($canDo->get('core.admin') || $canDo->get('core.options'))
		{
			JToolbarHelper::preferences('com_templates');
			JToolbarHelper::divider();
		}

		JToolbarHelper::help('JHELP_EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES');

		JHtmlSidebar::setAction('index.php?option=com_templates&view=templates');

		$this->sidebar = JHtmlSidebar::render();
	}
}
components/com_templates/views/style/view.json.php000060400000002363152453623450016526 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View to edit a template style.
 *
 * @since  1.6
 */
class TemplatesViewStyle extends JViewLegacy
{
	/**
	 * The JObject (on success, false on failure)
	 *
	 * @var   JObject
	 */
	protected $item;

	/**
	 * The form object
	 *
	 * @var   JForm
	 */
	protected $form;

	/**
	 * The model state
	 *
	 * @var   JObject
	 */
	protected $state;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		try
		{
			$this->item = $this->get('Item');
		}
		catch (Exception $e)
		{
			$app = JFactory::getApplication();
			$app->enqueueMessage($e->getMessage(), 'error');

			return false;
		}

		$paramsList = $this->item->getProperties();

		unset($paramsList['xml']);

		$paramsList = json_encode($paramsList);

		return $paramsList;

	}
}
components/com_templates/views/style/view.html.php000060400000004761152453623450016525 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View to edit a template style.
 *
 * @since  1.6
 */
class TemplatesViewStyle extends JViewLegacy
{
	/**
	 * The JObject (on success, false on failure)
	 *
	 * @var   JObject
	 */
	protected $item;

	/**
	 * The form object
	 *
	 * @var   JForm
	 */
	protected $form;

	/**
	 * The model state
	 *
	 * @var   JObject
	 */
	protected $state;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		$this->item  = $this->get('Item');
		$this->state = $this->get('State');
		$this->form  = $this->get('Form');
		$this->canDo = JHelperContent::getActions('com_templates');

		// 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);

		$isNew = ($this->item->id == 0);
		$canDo = $this->canDo;

		JToolbarHelper::title(
			$isNew ? JText::_('COM_TEMPLATES_MANAGER_ADD_STYLE')
			: JText::_('COM_TEMPLATES_MANAGER_EDIT_STYLE'), 'eye thememanager'
		);

		// If not checked out, can save the item.
		if ($canDo->get('core.edit'))
		{
			JToolbarHelper::apply('style.apply');
			JToolbarHelper::save('style.save');
		}

		// If an existing item, can save to a copy.
		if (!$isNew && $canDo->get('core.create'))
		{
			JToolbarHelper::save2copy('style.save2copy');
		}

		if (empty($this->item->id))
		{
			JToolbarHelper::cancel('style.cancel');
		}
		else
		{
			JToolbarHelper::cancel('style.cancel', 'JTOOLBAR_CLOSE');
		}

		JToolbarHelper::divider();

		// Get the help information for the template item.
		$lang = JFactory::getLanguage();
		$help = $this->get('Help');

		if ($lang->hasKey($help->url))
		{
			$debug = $lang->setDebug(false);
			$url = JText::_($help->url);
			$lang->setDebug($debug);
		}
		else
		{
			$url = null;
		}

		JToolbarHelper::help($help->key, false, $url);
	}
}
components/com_templates/views/style/tmpl/edit.php000060400000006567152453623450016517 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');
JHtml::_('formbehavior.chosen', 'select');
$user = JFactory::getUser();

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(task)
	{
		if (task == 'style.cancel' || document.formvalidator.isValid(document.getElementById('style-form'))) {
			Joomla.submitform(task, document.getElementById('style-form'));
		}
	};
");
?>

<form action="<?php echo JRoute::_('index.php?option=com_templates&layout=edit&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="style-form" class="form-validate">

	<?php echo JLayoutHelper::render('joomla.edit.title_alias', $this); ?>

	<div class="form-horizontal">
		<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'details')); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'details', JText::_('JDETAILS')); ?>

		<div class="row-fluid">
			<div class="span9">
				<h2>
					<?php echo JText::_($this->item->template); ?>
				</h2>
				<div class="info-labels">
					<span class="label hasTooltip" title="<?php echo JHtml::_('tooltipText', 'COM_TEMPLATES_FIELD_CLIENT_LABEL'); ?>">
						<?php echo $this->item->client_id == 0 ? JText::_('JSITE') : JText::_('JADMINISTRATOR'); ?>
					</span>
				</div>
				<div>
					<p><?php echo JText::_($this->item->xml->description); ?></p>
					<?php
					$this->fieldset = 'description';
					$description = JLayoutHelper::render('joomla.edit.fieldset', $this);
					?>
					<?php if ($description) : ?>
						<p class="readmore">
							<a href="#" onclick="jQuery('.nav-tabs a[href=\'#description\']').tab('show');">
								<?php echo JText::_('JGLOBAL_SHOW_FULL_DESCRIPTION'); ?>
							</a>
						</p>
					<?php endif; ?>
				</div>
				<?php
				$this->fieldset = 'basic';
				$html = JLayoutHelper::render('joomla.edit.fieldset', $this);
				echo $html ? '<hr />' . $html : '';
				?>
			</div>
			<div class="span3">
				<?php
				// Set main fields.
				$this->fields = array(
					'home',
					'client_id',
					'template'
				);
				?>
				<?php echo JLayoutHelper::render('joomla.edit.global', $this); ?>
			</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php if ($description) : ?>
			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'description', JText::_('JGLOBAL_FIELDSET_DESCRIPTION')); ?>
			<?php echo $description; ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php endif; ?>

		<?php
		$this->fieldsets = array();
		$this->ignore_fieldsets = array('basic', 'description');
		echo JLayoutHelper::render('joomla.edit.params', $this);
		?>

		<?php if ($user->authorise('core.edit', 'com_menus') && $this->item->client_id == 0 && $this->canDo->get('core.edit.state')) : ?>
			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'assignment', JText::_('COM_TEMPLATES_MENUS_ASSIGNMENT')); ?>
			<?php echo $this->loadTemplate('assignment'); ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php endif; ?>

		<?php echo JHtml::_('bootstrap.endTabSet'); ?>

		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_templates/views/style/tmpl/edit_options.php000060400000002442152453623450020256 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Load chosen.css
JHtml::_('formbehavior.chosen', 'select');

?>
<?php
	echo JHtml::_('bootstrap.startAccordion', 'templatestyleOptions', array('active' => 'collapse0'));
	$fieldSets = $this->form->getFieldsets('params');
	$i = 0;

	foreach ($fieldSets as $name => $fieldSet) :
		$label = !empty($fieldSet->label) ? $fieldSet->label : 'COM_TEMPLATES_' . $name . '_FIELDSET_LABEL';
		echo JHtml::_('bootstrap.addSlide', 'templatestyleOptions', JText::_($label), 'collapse' . ($i++));
			if (isset($fieldSet->description) && trim($fieldSet->description)) :
				echo '<p class="tip">' . $this->escape(JText::_($fieldSet->description)) . '</p>';
			endif;
			?>
				<?php foreach ($this->form->getFieldset($name) as $field) : ?>
					<div class="control-group">
						<div class="control-label">
							<?php echo $field->label; ?>
						</div>
						<div class="controls">
							<?php echo $field->input; ?>
						</div>
					</div>
				<?php endforeach;
		echo JHtml::_('bootstrap.endSlide');
	endforeach;
echo JHtml::_('bootstrap.endAccordion');
components/com_templates/views/style/tmpl/edit_assignment.php000060400000004224152453623450020733 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Initialise related data.
JLoader::register('MenusHelper', JPATH_ADMINISTRATOR . '/components/com_menus/helpers/menus.php');
$menuTypes = MenusHelper::getMenuLinks();
$user      = JFactory::getUser();
?>
<label id="jform_menuselect-lbl" for="jform_menuselect"><?php echo JText::_('JGLOBAL_MENU_SELECTION'); ?></label>
<div class="btn-toolbar">
	<button class="btn jform-rightbtn" type="button" onclick="jQuery('.chk-menulink').attr('checked', !jQuery('.chk-menulink').attr('checked'));">
		<span class="icon-checkbox-partial" aria-hidden="true"></span> <?php echo JText::_('JGLOBAL_SELECTION_INVERT_ALL'); ?>
	</button>
</div>
<div id="menu-assignment">
	<ul class="menu-links">

		<?php foreach ($menuTypes as &$type) : ?>
			<li>
				<div class="menu-links-block">
					<button class="btn jform-rightbtn" type="button" onclick="jQuery('.menutype-<?php echo $type->menutype; ?>').attr('checked', !jQuery('.menutype-<?php echo $type->menutype; ?>').attr('checked'));">
						<span class="icon-checkbox-partial" aria-hidden="true"></span> <?php echo JText::_('JGLOBAL_SELECTION_INVERT'); ?>
					</button>
					<h5><?php echo $type->title ?: $type->menutype; ?></h5>
	
					<?php foreach ($type->links as $link) : ?>
						<label class="checkbox small" for="link<?php echo (int) $link->value; ?>" >
						<input type="checkbox" name="jform[assigned][]" value="<?php echo (int) $link->value; ?>" id="link<?php echo (int) $link->value; ?>"<?php if ($link->template_style_id == $this->item->id) : ?> checked="checked"<?php endif; ?><?php if ($link->checked_out && $link->checked_out != $user->id) : ?> disabled="disabled"<?php else : ?> class="chk-menulink menutype-<?php echo $type->menutype; ?>"<?php endif; ?> />
						<?php echo JLayoutHelper::render('joomla.html.treeprefix', array('level' => $link->level)) . $link->text; ?>
						</label>
					<?php endforeach; ?>

				</div>
			</li>
		<?php endforeach; ?>

	</ul>
</div>
components/com_templates/views/template/view.html.php000060400000015766152453623450017207 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View to edit a template style.
 *
 * @since  1.6
 */
class TemplatesViewTemplate extends JViewLegacy
{
	/**
	 * For loading extension state
	 */
	protected $state;

	/**
	 * For loading template details
	 */
	protected $template;

	/**
	 * For loading the source form
	 */
	protected $form;

	/**
	 * For loading source file contents
	 */
	protected $source;

	/**
	 * Extension id
	 */
	protected $id;

	/**
	 * Encrypted file path
	 */
	protected $file;

	/**
	 * List of available overrides
	 */
	protected $overridesList;

	/**
	 * Name of the present file
	 */
	protected $fileName;

	/**
	 * Type of the file - image, source, font
	 */
	protected $type;

	/**
	 * For loading image information
	 */
	protected $image;

	/**
	 * Template id for showing preview button
	 */
	protected $preview;

	/**
	 * For loading font information
	 */
	protected $font;

	/**
	 * A nested array containing lst of files and folders
	 */
	protected $files;

	/**
	 * An array containing a list of compressed files
	 */
	protected $archive;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		$app            = JFactory::getApplication();
		$this->file     = $app->input->get('file');
		$this->fileName = JFilterInput::getInstance()->clean(base64_decode($this->file), 'string');
		$explodeArray   = explode('.', $this->fileName);
		$ext            = end($explodeArray);
		$this->files    = $this->get('Files');
		$this->state    = $this->get('State');
		$this->template = $this->get('Template');
		$this->preview  = $this->get('Preview');

		$params       = JComponentHelper::getParams('com_templates');
		$imageTypes   = explode(',', $params->get('image_formats'));
		$sourceTypes  = explode(',', $params->get('source_formats'));
		$fontTypes    = explode(',', $params->get('font_formats'));
		$archiveTypes = explode(',', $params->get('compressed_formats'));

		if (in_array($ext, $sourceTypes))
		{
			$this->form   = $this->get('Form');
			$this->form->setFieldAttribute('source', 'syntax', $ext);
			$this->source = $this->get('Source');
			$this->type   = 'file';
		}
		elseif (in_array($ext, $imageTypes))
		{
			$this->image = $this->get('Image');
			$this->type  = 'image';
		}
		elseif (in_array($ext, $fontTypes))
		{
			$this->font = $this->get('Font');
			$this->type = 'font';
		}
		elseif (in_array($ext, $archiveTypes))
		{
			$this->archive = $this->get('Archive');
			$this->type    = 'archive';
		}
		else
		{
			$this->type = 'home';
		}

		$this->overridesList = $this->get('OverridesList');
		$this->id            = $this->state->get('extension.id');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			$app->enqueueMessage(implode("\n", $errors));

			return false;
		}

		$this->addToolbar();

		if (!JFactory::getUser()->authorise('core.admin'))
		{
			$this->setLayout('readonly');
		}

		return parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @since   1.6
	 *
	 * @return  void
	 */
	protected function addToolbar()
	{
		$app   = JFactory::getApplication();
		$user  = JFactory::getUser();
		$app->input->set('hidemainmenu', true);

		// User is global SuperUser
		$isSuperUser = $user->authorise('core.admin');

		// Get the toolbar object instance
		$bar = JToolbar::getInstance('toolbar');
		$explodeArray = explode('.', $this->fileName);
		$ext = end($explodeArray);

		JToolbarHelper::title(JText::sprintf('COM_TEMPLATES_MANAGER_VIEW_TEMPLATE', ucfirst($this->template->name)), 'eye thememanager');

		// Only show file edit buttons for global SuperUser
		if ($isSuperUser)
		{
			// Add an Apply and save button
			if ($this->type == 'file')
			{
				JToolbarHelper::apply('template.apply');
				JToolbarHelper::save('template.save');
			}
			// Add a Crop and Resize button
			elseif ($this->type == 'image')
			{
				JToolbarHelper::custom('template.cropImage', 'move', 'move', 'COM_TEMPLATES_BUTTON_CROP', false);
				JToolbarHelper::modal('resizeModal', 'icon-refresh', 'COM_TEMPLATES_BUTTON_RESIZE');
			}
			// Add an extract button
			elseif ($this->type == 'archive')
			{
				JToolbarHelper::custom('template.extractArchive', 'arrow-down', 'arrow-down', 'COM_TEMPLATES_BUTTON_EXTRACT_ARCHIVE', false);
			}

			// Add a copy template button (Hathor override doesn't need the button)
			if ($app->getTemplate() != 'hathor')
			{
				JToolbarHelper::modal('copyModal', 'icon-copy', 'COM_TEMPLATES_BUTTON_COPY_TEMPLATE');
			}
		}

		// Add a Template preview button
		if ($this->preview->client_id == 0)
		{
			$bar->appendButton('Popup', 'picture', 'COM_TEMPLATES_BUTTON_PREVIEW', JUri::root() . 'index.php?tp=1&templateStyle=' . $this->preview->id, 800, 520);
		}

		// Only show file manage buttons for global SuperUser
		if ($isSuperUser)
		{
			// Add Manage folders button
			JToolbarHelper::modal('folderModal', 'icon-folder icon white', 'COM_TEMPLATES_BUTTON_FOLDERS');

			// Add a new file button
			JToolbarHelper::modal('fileModal', 'icon-file', 'COM_TEMPLATES_BUTTON_FILE');

			// Add a Rename file Button (Hathor override doesn't need the button)
			if ($app->getTemplate() != 'hathor' && $this->type != 'home')
			{
				JToolbarHelper::modal('renameModal', 'icon-refresh', 'COM_TEMPLATES_BUTTON_RENAME_FILE');
			}

			// Add a Delete file Button
			if ($this->type != 'home')
			{
				JToolbarHelper::modal('deleteModal', 'icon-remove', 'COM_TEMPLATES_BUTTON_DELETE_FILE');
			}

			// Add a Compile Button
			if ($ext == 'less')
			{
				JToolbarHelper::custom('template.less', 'play', 'play', 'COM_TEMPLATES_BUTTON_LESS', false);
			}
		}

		if ($this->type == 'home')
		{
			JToolbarHelper::cancel('template.cancel', 'JTOOLBAR_CLOSE');
		}
		else
		{
			JToolbarHelper::cancel('template.close', 'COM_TEMPLATES_BUTTON_CLOSE_FILE');
		}

		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_EXTENSIONS_TEMPLATE_MANAGER_TEMPLATES_EDIT');
	}

	/**
	 * Method for creating the collapsible tree.
	 *
	 * @param   array  $array  The value of the present node for recursion
	 *
	 * @return  string
	 *
	 * @note    Uses recursion
	 * @since   3.2
	 */
	protected function directoryTree($array)
	{
		$temp        = $this->files;
		$this->files = $array;
		$txt         = $this->loadTemplate('tree');
		$this->files = $temp;

		return $txt;
	}

	/**
	 * Method for listing the folder tree in modals.
	 *
	 * @param   array  $array  The value of the present node for recursion
	 *
	 * @return  string
	 *
	 * @note    Uses recursion
	 * @since   3.2
	 */
	protected function folderTree($array)
	{
		$temp        = $this->files;
		$this->files = $array;
		$txt         = $this->loadTemplate('folders');
		$this->files = $temp;

		return $txt;
	}
}
components/com_templates/views/template/tmpl/default_modal_folder_footer.php000060400000001540152453623450023740 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$input = JFactory::getApplication()->input;
?>
<form id="deleteFolder" method="post" action="<?php echo JRoute::_('index.php?option=com_templates&task=template.deleteFolder&id=' . $input->getInt('id') . '&file=' . $this->file); ?>">
	<fieldset>
		<button type="button" class="btn" data-dismiss="modal"><?php echo JText::_('COM_TEMPLATES_TEMPLATE_CLOSE'); ?></button>
		<input type="hidden" class="address" name="address" />
		<?php echo JHtml::_('form.token'); ?>
		<input type="submit" value="<?php echo JText::_('COM_TEMPLATES_BUTTON_DELETE'); ?>" class="btn btn-danger" />
	</fieldset>
</form>
components/com_templates/views/template/tmpl/default.php000060400000044237152453623450017665 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');
JHtml::_('behavior.tabstate');

$input = JFactory::getApplication()->input;

// No access if not global SuperUser
if (!JFactory::getUser()->authorise('core.admin'))
{
	JFactory::getApplication()->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'error');
}

if ($this->type == 'image')
{
	JHtml::_('script', 'system/jquery.Jcrop.min.js', array('version' => 'auto', 'relative' => true));
	JHtml::_('stylesheet', 'system/jquery.Jcrop.min.css', array('version' => 'auto', 'relative' => true));
}

JFactory::getDocument()->addScriptDeclaration("
jQuery(document).ready(function($){

	// Hide all the folder when the page loads
	$('.folder ul, .component-folder ul, .plugin-folder ul, .layout-folder ul').hide();

	// Display the tree after loading
	$('.directory-tree').removeClass('directory-tree');

	// Show all the lists in the path of an open file
	$('.show > ul').show();

	// Stop the default action of anchor tag on a click event
	$('.folder-url, .component-folder-url, .plugin-folder-url, .layout-folder-url').click(function(event){
		event.preventDefault();
	});

	// Prevent the click event from proliferating
	$('.file, .component-file-url, .plugin-file-url').bind('click',function(e){
		e.stopPropagation();
	});

	// Toggle the child indented list on a click event
	$('.folder, .component-folder, .plugin-folder, .layout-folder').bind('click',function(e){
		$(this).children('ul').toggle();
		e.stopPropagation();
	});

	// New file tree
	$('#fileModal .folder-url').bind('click',function(e){
		$('.folder-url').removeClass('selected');
		e.stopPropagation();
		$('#fileModal input.address').val($(this).attr('data-id'));
		$(this).addClass('selected');
	});

	// Folder manager tree
	$('#folderModal .folder-url').bind('click',function(e){
		$('.folder-url').removeClass('selected');
		e.stopPropagation();
		$('#folderModal input.address').val($(this).attr('data-id'));
		$(this).addClass('selected');
	});

	var containerDiv = document.querySelector('.span3.tree-holder'),
		treeContainer = containerDiv.querySelector('.nav.nav-list'),
		liEls = treeContainer.querySelectorAll('.folder.show'),
		filePathEl = document.querySelector('p.lead.hidden.path');

	if(filePathEl)
		var filePathTmp = document.querySelector('p.lead.hidden.path').innerText;

	 if(filePathTmp && filePathTmp.charAt( 0 ) === '/' ) {
			filePathTmp = filePathTmp.slice( 1 );
			filePathTmp = filePathTmp.split('/');
			filePathTmp = filePathTmp[filePathTmp.length - 1];

		for (var i = 0, l = liEls.length; i < l; i++) {
			liEls[i].querySelector('a').classList.add('active');
			if (i === liEls.length - 1) {
				var parentUl = liEls[i].querySelector('ul'),
					allLi = parentUl.querySelectorAll('li'); 
	
				for (var i = 0, l = allLi.length; i < l; i++) {
					aEl = allLi[i].querySelector('a'),
					spanEl = aEl.querySelector('span');
	
					if (spanEl && filePathTmp === $.trim(spanEl.innerText)) {
						aEl.classList.add('active');
					}
				}
			}
		}
	}
});");

if ($this->type == 'image')
{
	JFactory::getDocument()->addScriptDeclaration("
		jQuery(document).ready(function($) {
			var jcrop_api;

			// Configuration for image cropping
			$('#image-crop').Jcrop({
				onChange:   showCoords,
				onSelect:   showCoords,
				onRelease:  clearCoords,
				trueSize:   [" . $this->image['width'] . ',' . $this->image['height'] . "]
			},function(){
				jcrop_api = this;
			});

			// Function for calculating the crop coordinates
			function showCoords(c)
			{
				$('#x').val(c.x);
				$('#y').val(c.y);
				$('#w').val(c.w);
				$('#h').val(c.h);
			};

			// Function for clearing the coordinates
			function clearCoords()
			{
				$('#adminForm input').val('');
			};
		});");
}

JFactory::getDocument()->addStyleDeclaration('
	/* Styles for modals */
	.selected{
		background: #08c;
		color: #fff;
	}
	.selected:hover{
		background: #08c !important;
		color: #fff;
	}
	.modal-body .column-left {
		float: left; max-height: 70vh; overflow-y: auto;
	}
	.modal-body .column-right {
		float: right;
	}
	@media (max-width: 767px) {
		.modal-body .column-right {
			float: left;
		}
	}
	#deleteFolder{
		margin: 0;
	}

	#image-crop{
		max-width: 100% !important;
		width: auto;
		height: auto;
	}

	.directory-tree{
		display: none;
	}

	.tree-holder{
		overflow-x: auto;
	}
');

if ($this->type == 'font')
{
	JFactory::getDocument()->addStyleDeclaration(
			"/* Styles for font preview */
		@font-face
		{
			font-family: previewFont;
			src: url('" . $this->font['address'] . "')
		}

		.font-preview{
			font-family: previewFont !important;
		}"
	);
}
?>
<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'editor')); ?>
<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'editor', JText::_('COM_TEMPLATES_TAB_EDITOR')); ?>
<div class="row-fluid">
	<div class="span12">
		<?php if ($this->type == 'file') : ?>
			<p class="lead"><?php echo JText::sprintf('COM_TEMPLATES_TEMPLATE_FILENAME', $this->source->filename, $this->template->element); ?></p>
			<p class="lead path hidden"><?php echo $this->source->filename; ?></p>
		<?php endif; ?>
		<?php if ($this->type == 'image') : ?>
			<p class="lead"><?php echo JText::sprintf('COM_TEMPLATES_TEMPLATE_FILENAME', $this->image['path'], $this->template->element); ?></p>
			<p class="lead path hidden"><?php echo $this->image['path']; ?></p>

		<?php endif; ?>
		<?php if ($this->type == 'font') : ?>
			<p class="lead"><?php echo JText::sprintf('COM_TEMPLATES_TEMPLATE_FILENAME', $this->font['rel_path'], $this->template->element); ?></p>
			<p class="lead path hidden"><?php echo $this->font['rel_path']; ?></p>

		<?php endif; ?>
	</div>
</div>
<div class="row-fluid">
	<div class="span3 tree-holder">
		<?php echo $this->loadTemplate('tree'); ?>
	</div>
	<div class="span9">
		<?php if ($this->type == 'home') : ?>
			<form action="<?php echo JRoute::_('index.php?option=com_templates&view=template&id=' . $input->getInt('id') . '&file=' . $this->file); ?>" method="post" name="adminForm" id="adminForm" class="form-horizontal">
				<input type="hidden" name="task" value="" />
				<?php echo JHtml::_('form.token'); ?>
				<div class="hero-unit" style="text-align: justify;">
					<h2><?php echo JText::_('COM_TEMPLATES_HOME_HEADING'); ?></h2>
					<p><?php echo JText::_('COM_TEMPLATES_HOME_TEXT'); ?></p>
					<p>
						<a href="https://docs.joomla.org/Special:MyLanguage/J3.x:How_to_use_the_Template_Manager" target="_blank" class="btn btn-primary btn-large">
							<?php echo JText::_('COM_TEMPLATES_HOME_BUTTON'); ?>
						</a>
					</p>
				</div>
			</form>
		<?php endif; ?>
		<?php if ($this->type == 'file') : ?>
			<form action="<?php echo JRoute::_('index.php?option=com_templates&view=template&id=' . $input->getInt('id') . '&file=' . $this->file); ?>" method="post" name="adminForm" id="adminForm" class="form-horizontal">

				<div class="editor-border">
					<?php echo $this->form->getInput('source'); ?>
				</div>
				<input type="hidden" name="task" value="" />
				<?php echo JHtml::_('form.token'); ?>
				<?php echo $this->form->getInput('extension_id'); ?>
				<?php echo $this->form->getInput('filename'); ?>

			</form>
		<?php endif; ?>
		<?php if ($this->type == 'archive') : ?>
			<legend><?php echo JText::_('COM_TEMPLATES_FILE_CONTENT_PREVIEW'); ?></legend>
			<form action="<?php echo JRoute::_('index.php?option=com_templates&view=template&id=' . $input->getInt('id') . '&file=' . $this->file); ?>" method="post" name="adminForm" id="adminForm" class="form-horizontal">
				<ul class="nav nav-stacked nav-list well">
					<?php foreach ($this->archive as $file) : ?>
						<li>
							<?php if (substr($file, -1) === DIRECTORY_SEPARATOR) : ?>
								<span class="icon-folder" aria-hidden="true"></span>&nbsp;<?php echo $file; ?>
							<?php endif; ?>
							<?php if (substr($file, -1) != DIRECTORY_SEPARATOR) : ?>
								<span class="icon-file" aria-hidden="true"></span>&nbsp;<?php echo $file; ?>
							<?php endif; ?>
						</li>
					<?php endforeach; ?>
				</ul>
				<input type="hidden" name="task" value="" />
				<?php echo JHtml::_('form.token'); ?>

			</form>
		<?php endif; ?>
		<?php if ($this->type == 'image') : ?>
			<img id="image-crop" src="<?php echo $this->image['address'] . '?' . time(); ?>" />
			<form action="<?php echo JRoute::_('index.php?option=com_templates&view=template&id=' . $input->getInt('id') . '&file=' . $this->file); ?>" method="post" name="adminForm" id="adminForm" class="form-horizontal">
				<fieldset class="adminform">
					<input type ="hidden" id="x" name="x" />
					<input type ="hidden" id="y" name="y" />
					<input type ="hidden" id="h" name="h" />
					<input type ="hidden" id="w" name="w" />
					<input type="hidden" name="task" value="" />
					<?php echo JHtml::_('form.token'); ?>
				</fieldset>
			</form>
		<?php endif; ?>
		<?php if ($this->type == 'font') : ?>
			<div class="font-preview">
				<form action="<?php echo JRoute::_('index.php?option=com_templates&view=template&id=' . $input->getInt('id') . '&file=' . $this->file); ?>" method="post" name="adminForm" id="adminForm" class="form-horizontal">
					<fieldset class="adminform">
						<p class="lead">H1</p><h1>Quickly gaze at Joomla! views from HTML, CSS, JavaScript and XML </h1>
						<p class="lead">H2</p><h2>Quickly gaze at Joomla! views from HTML, CSS, JavaScript and XML </h2>
						<p class="lead">H3</p><h3>Quickly gaze at Joomla! views from HTML, CSS, JavaScript and XML </h3>
						<p class="lead">H4</p><h4>Quickly gaze at Joomla! views from HTML, CSS, JavaScript and XML </h4>
						<p class="lead">H5</p><h5>Quickly gaze at Joomla! views from HTML, CSS, JavaScript and XML </h5>
						<p class="lead">H6</p> <h6>Quickly gaze at Joomla! views from HTML, CSS, JavaScript and XML </h6>
						<p class="lead">Bold</p><b>Quickly gaze at Joomla! views from HTML, CSS, JavaScript and XML </b>
						<p class="lead">Italics</p><i>Quickly gaze at Joomla! views from HTML, CSS, JavaScript and XML </i>
						<p class="lead">Unordered List</p>
						<ul>
							<li>Item</li>
							<li>Item</li>
							<li>Item<br />
								<ul>
									<li>Item</li>
									<li>Item</li>
									<li>Item<br />
										<ul>
											<li>Item</li>
											<li>Item</li>
											<li>Item</li>
										</ul>
									</li>
								</ul>
							</li>
						</ul>
						<p class="lead">Ordered List</p>
						<ol>
							<li>Item</li>
							<li>Item</li>
							<li>Item<br />
								<ul>
									<li>Item</li>
									<li>Item</li>
									<li>Item<br />
										<ul>
											<li>Item</li>
											<li>Item</li>
											<li>Item</li>
										</ul>
									</li>
								</ul>
							</li>
						</ol>
						<input type="hidden" name="task" value="" />
						<?php echo JHtml::_('form.token'); ?>
					</fieldset>
				</form>
			</div>
		<?php endif; ?>
	</div>
</div>
<?php echo JHtml::_('bootstrap.endTab'); ?>

<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'overrides', JText::_('COM_TEMPLATES_TAB_OVERRIDES')); ?>
<div class="row-fluid">
	<div class="span3">
		<legend><?php echo JText::_('COM_TEMPLATES_OVERRIDES_MODULES'); ?></legend>
		<ul class="nav nav-list">
			<?php $token = JSession::getFormToken() . '=' . 1; ?>
			<?php foreach ($this->overridesList['modules'] as $module) : ?>
				<li>
					<?php
					$overrideLinkUrl = 'index.php?option=com_templates&view=template&task=template.overrides&folder=' . $module->path
							. '&id=' . $input->getInt('id') . '&file=' . $this->file . '&' . $token;
					?>
					<a href="<?php echo JRoute::_($overrideLinkUrl); ?>">
						<span class="icon-copy" aria-hidden="true"></span>&nbsp;<?php echo $module->name; ?>
					</a>
				</li>
			<?php endforeach; ?>
		</ul>
	</div>
	<div class="span3">
		<legend><?php echo JText::_('COM_TEMPLATES_OVERRIDES_COMPONENTS'); ?></legend>
		<ul class="nav nav-list">
			<?php $token = JSession::getFormToken() . '=' . 1; ?>
			<?php foreach ($this->overridesList['components'] as $key => $value) : ?>
				<li class="component-folder">
					<a href="#" class="component-folder-url">
						<span class="icon-folder" aria-hidden="true"></span>&nbsp;<?php echo $key; ?>
					</a>
					<ul class="nav nav-list">
						<?php foreach ($value as $view) : ?>
							<li>
								<?php
								$overrideLinkUrl = 'index.php?option=com_templates&view=template&task=template.overrides&folder=' . $view->path
										. '&id=' . $input->getInt('id') . '&file=' . $this->file . '&' . $token;
								?>
								<a class="component-file-url" href="<?php echo JRoute::_($overrideLinkUrl); ?>">
									<span class="icon-copy" aria-hidden="true"></span>&nbsp;<?php echo $view->name; ?>
								</a>
							</li>
						<?php endforeach; ?>
					</ul>
				</li>
			<?php endforeach; ?>
		</ul>
	</div>
	<div class="span3">
		<legend><?php echo JText::_('COM_TEMPLATES_OVERRIDES_PLUGINS'); ?></legend>
		<ul class="nav nav-list">
			<?php $token = JSession::getFormToken() . '=' . 1; ?>
			<?php foreach ($this->overridesList['plugins'] as $key => $group) : ?>
				<li class="plugin-folder">
					<a href="#" class="plugin-folder-url">
						<span class="icon-folder" aria-hidden="true"></span>&nbsp;<?php echo $key; ?>
					</a>
					<ul class="nav nav-list">
						<?php foreach ($group as $plugin) : ?>
							<li>
								<?php
								$overrideLinkUrl = 'index.php?option=com_templates&view=template&task=template.overrides&folder=' . $plugin->path
										. '&id=' . $input->getInt('id') . '&file=' . $this->file . '&' . $token;
								?>
								<a class="plugin-file-url" href="<?php echo JRoute::_($overrideLinkUrl); ?>">
									<span class="icon-copy" aria-hidden="true"></span>&nbsp;<?php echo $plugin->name; ?>
								</a>
							</li>
						<?php endforeach; ?>
					</ul>
				</li>
			<?php endforeach; ?>
		</ul>
	</div>
	<div class="span3">
		<legend><?php echo JText::_('COM_TEMPLATES_OVERRIDES_LAYOUTS'); ?></legend>
		<ul class="nav nav-list">
			<?php $token = JSession::getFormToken() . '=' . 1; ?>
			<?php foreach ($this->overridesList['layouts'] as $key => $value) : ?>
			<li class="layout-folder">
				<a href="#" class="layout-folder-url">
					<span class="icon-folder" aria-hidden="true"></span>&nbsp;<?php echo $key; ?>
				</a>
				<ul class="nav nav-list">
					<?php foreach ($value as $layout) : ?>
						<li>
							<?php
							$overrideLinkUrl = 'index.php?option=com_templates&view=template&task=template.overrides&folder=' . $layout->path
									. '&id=' . $input->getInt('id') . '&file=' . $this->file . '&' . $token;
							?>
							<a href="<?php echo JRoute::_($overrideLinkUrl); ?>">
								<span class="icon-copy" aria-hidden="true"></span>&nbsp;<?php echo $layout->name; ?>
							</a>
						</li>
					<?php endforeach; ?>
				</ul>
			</li>
			<?php endforeach; ?>
		</ul>
	</div>
</div>
<?php echo JHtml::_('bootstrap.endTab'); ?>

<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'description', JText::_('COM_TEMPLATES_TAB_DESCRIPTION')); ?>
<?php echo $this->loadTemplate('description'); ?>
<?php echo JHtml::_('bootstrap.endTab'); ?>
<?php echo JHtml::_('bootstrap.endTabSet'); ?>

<?php // Collapse Modal
$copyModalData = array(
	'selector' => 'copyModal',
	'params'   => array(
		'title'  => JText::_('COM_TEMPLATES_TEMPLATE_COPY'),
		'footer' => $this->loadTemplate('modal_copy_footer'),
	),
	'body'     => $this->loadTemplate('modal_copy_body'),
);
?>
<form action="<?php echo JRoute::_('index.php?option=com_templates&task=template.copy&id=' . $input->getInt('id') . '&file=' . $this->file); ?>" method="post" name="adminForm" id="adminForm">
	<?php echo JLayoutHelper::render('joomla.modal.main', $copyModalData); ?>
	<?php echo JHtml::_('form.token'); ?>
</form>
<?php if ($this->type != 'home') : ?>
	<?php // Rename Modal
	$renameModalData = array(
		'selector' => 'renameModal',
		'params'   => array(
			'title'  => JText::sprintf('COM_TEMPLATES_RENAME_FILE', $this->fileName),
			'footer' => $this->loadTemplate('modal_rename_footer'),
		),
		'body'     => $this->loadTemplate('modal_rename_body'),
	);
	?>
	<form action="<?php echo JRoute::_('index.php?option=com_templates&task=template.renameFile&id=' . $input->getInt('id') . '&file=' . $this->file); ?>" method="post">
		<?php echo JLayoutHelper::render('joomla.modal.main', $renameModalData); ?>
		<?php echo JHtml::_('form.token'); ?>
	</form>
<?php endif; ?>
<?php if ($this->type != 'home') : ?>
	<?php // Delete Modal
	$deleteModalData = array(
		'selector' => 'deleteModal',
		'params'   => array(
			'title'  => JText::_('COM_TEMPLATES_ARE_YOU_SURE'),
			'footer' => $this->loadTemplate('modal_delete_footer'),
		),
		'body'     => $this->loadTemplate('modal_delete_body'),
	);
	?>
	<?php echo JLayoutHelper::render('joomla.modal.main', $deleteModalData); ?>
<?php endif; ?>
<?php // File Modal
$fileModalData = array(
	'selector' => 'fileModal',
	'params'   => array(
		'title'  => JText::_('COM_TEMPLATES_NEW_FILE_HEADER'),
		'footer' => $this->loadTemplate('modal_file_footer'),
	),
	'body'     => $this->loadTemplate('modal_file_body'),
);
?>
<?php echo JLayoutHelper::render('joomla.modal.main', $fileModalData); ?>
<?php // Folder Modal
$folderModalData = array(
	'selector' => 'folderModal',
	'params'   => array(
		'title'  => JText::_('COM_TEMPLATES_MANAGE_FOLDERS'),
		'footer' => $this->loadTemplate('modal_folder_footer'),
	),
	'body'     => $this->loadTemplate('modal_folder_body'),
);
?>
<?php echo JLayoutHelper::render('joomla.modal.main', $folderModalData); ?>
<?php if ($this->type == 'image') : ?>
	<?php // Resize Modal
	$resizeModalData = array(
		'selector' => 'resizeModal',
		'params'   => array(
			'title'  => JText::_('COM_TEMPLATES_RESIZE_IMAGE'),
			'footer' => $this->loadTemplate('modal_resize_footer'),
		),
		'body'     => $this->loadTemplate('modal_resize_body'),
	);
	?>
	<form action="<?php echo JRoute::_('index.php?option=com_templates&task=template.resizeImage&id=' . $input->getInt('id') . '&file=' . $this->file); ?>" method="post">
		<?php echo JLayoutHelper::render('joomla.modal.main', $resizeModalData); ?>
		<?php echo JHtml::_('form.token'); ?>
	</form>
<?php endif; ?>components/com_templates/views/template/tmpl/default_modal_delete_footer.php000060400000001600152453623450023724 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$input = JFactory::getApplication()->input;
?>
<form method="post" action="">
	<input type="hidden" name="option" value="com_templates" />
	<input type="hidden" name="task" value="template.delete" />
	<input type="hidden" name="id" value="<?php echo $input->getInt('id'); ?>" />
	<input type="hidden" name="file" value="<?php echo $this->file; ?>" />
	<?php echo JHtml::_('form.token'); ?>
	<button type="button" class="btn" data-dismiss="modal"><?php echo JText::_('COM_TEMPLATES_TEMPLATE_CLOSE'); ?></button>
	<button type="submit" class="btn btn-danger"><?php echo JText::_('COM_TEMPLATES_BUTTON_DELETE'); ?></button>
</form>
components/com_templates/views/template/tmpl/default_modal_resize_body.php000060400000002323152453623450023425 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div id="template-manager-resize" class="container-fluid">
	<div class="row-fluid">
		<div class="control-group">
			<div class="control-label">
				<label for="height" class="modalTooltip" title="<?php echo JHtml::_('tooltipText', 'COM_TEMPLATES_IMAGE_HEIGHT'); ?>">
					<?php echo JText::_('COM_TEMPLATES_IMAGE_HEIGHT')?>
				</label>
			</div>
			<div class="controls">
				<input class="input-xlarge" type="number" name="height" placeholder="<?php echo $this->image['height']; ?> px" required />
			</div>
		</div>
		<div class="control-group">
			<div class="control-label">
				<label for="width" class="modalTooltip" title="<?php echo JHtml::_('tooltipText', 'COM_TEMPLATES_IMAGE_WIDTH'); ?>">
					<?php echo JText::_('COM_TEMPLATES_IMAGE_WIDTH')?>
				</label>
			</div>
			<div class="controls">
				<input class="input-xlarge" type="number" name="width" placeholder="<?php echo $this->image['width']; ?> px" required />
			</div>
		</div>
	</div>
</div>
components/com_templates/views/template/tmpl/default_tree.php000060400000003143152453623450020673 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// use ksort() with SORT_NATURAL flag when minimum PHP is 5.4.
uksort($this->files, 'strnatcmp');

?>
<ul class='nav nav-list directory-tree'>
	<?php foreach ($this->files as $key => $value) : ?>
		<?php if (is_array($value)) : ?>
			<?php
			$keyArray  = explode('/', $key);
			$fileArray = explode('/', $this->fileName);
			$count     = 0;

			$keyArrayCount = count($keyArray);

			if (count($fileArray) >= $keyArrayCount)
			{
				for ($i = 0; $i < $keyArrayCount; $i++)
				{
					if ($keyArray[$i] === $fileArray[$i])
					{
						$count++;
					}
				}

				if ($count === $keyArrayCount)
				{
					$class = 'folder show';
				}
				else
				{
					$class = 'folder';
				}
			}
			else
			{
				$class = 'folder';
			}

			?>
			<li class="<?php echo $class; ?>">
				<a class='folder-url nowrap' href=''>
					<span class='icon-folder'>&nbsp;<?php $explodeArray = explode('/', $key); echo $this->escape(end($explodeArray)); ?></span>
				</a>
				<?php echo $this->directoryTree($value); ?>
			</li>
		<?php endif; ?>
		<?php if (is_object($value)) : ?>
			<li>
				<a class="file nowrap" href='<?php echo JRoute::_('index.php?option=com_templates&view=template&id=' . $this->id . '&file=' . $value->id) ?>'>
					<span class='icon-file'>&nbsp;<?php echo $this->escape($value->name); ?></span>
				</a>
			</li>
		<?php endif; ?>
	<?php endforeach; ?>
</ul>
components/com_templates/views/template/tmpl/default_modal_file_footer.php000060400000000605152453623450023405 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<button type="button" class="btn" data-dismiss="modal"><?php echo JText::_('COM_TEMPLATES_TEMPLATE_CLOSE'); ?></button>
components/com_templates/views/template/tmpl/default_description.php000060400000001502152453623450022254 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>

<div class="pull-left">
	<?php echo JHtml::_('templates.thumb', $this->template->element, $this->template->client_id); ?>
	<?php echo JHtml::_('templates.thumbModal', $this->template->element, $this->template->client_id); ?>
</div>
<h2><?php echo ucfirst($this->template->element); ?></h2>
<?php $client = JApplicationHelper::getClientInfo($this->template->client_id); ?>
<p><?php $this->template->xmldata = TemplatesHelper::parseXMLTemplateFile($client->path, $this->template->element); ?></p>
<p><?php echo JText::_($this->template->xmldata->description); ?></p>components/com_templates/views/template/tmpl/readonly.php000060400000002115152453623450020043 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');

$input = JFactory::getApplication()->input;
?>
<form action="<?php echo JRoute::_('index.php?option=com_templates&view=template&id=' . $input->getInt('id') . '&file=' . $this->file); ?>" method="post" name="adminForm" id="adminForm" class="form-horizontal">
	<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'description')); ?>
		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'description', JText::_('COM_TEMPLATES_TAB_DESCRIPTION')); ?>
			<?php echo $this->loadTemplate('description'); ?>
		<?php echo JHtml::_('bootstrap.endTab'); ?>
	<?php echo JHtml::_('bootstrap.endTabSet'); ?>
	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>
</form>
components/com_templates/views/template/tmpl/default_modal_rename_footer.php000060400000000763152453623450023742 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<button type="button" class="btn" data-dismiss="modal"><?php echo JText::_('COM_TEMPLATES_TEMPLATE_CLOSE'); ?></button>
<button type="submit" class="btn btn-primary"><?php echo JText::_('COM_TEMPLATES_BUTTON_RENAME'); ?></button>
components/com_templates/views/template/tmpl/default_modal_resize_footer.php000060400000000763152453623450023774 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<button type="button" class="btn" data-dismiss="modal"><?php echo JText::_('COM_TEMPLATES_TEMPLATE_CLOSE'); ?></button>
<button type="submit" class="btn btn-primary"><?php echo JText::_('COM_TEMPLATES_BUTTON_RESIZE'); ?></button>
components/com_templates/views/template/tmpl/default_modal_folder_body.php000060400000002275152453623450023405 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$input = JFactory::getApplication()->input;
?>
<div id="template-manager-folder" class="container-fluid">
	<div class="row-fluid">
		<div class="span12">
			<div class="span6 column-right">
				<form method="post" action="<?php echo JRoute::_('index.php?option=com_templates&task=template.createFolder&id=' . $input->getInt('id') . '&file=' . $this->file); ?>" class="well">
					<fieldset class="form-inline">
						<label><?php echo JText::_('COM_TEMPLATES_FOLDER_NAME'); ?></label>
						<input type="text" name="name" required />
						<input type="hidden" class="address" name="address" />
						<?php echo JHtml::_('form.token'); ?>
						<input type="submit" value="<?php echo JText::_('COM_TEMPLATES_BUTTON_CREATE'); ?>" class="btn btn-primary" />
					</fieldset>
				</form>
			</div>
			<div class="span6 column-left">
				<?php echo $this->loadTemplate('folders'); ?>
				<hr class="hr-condensed" />
			</div>
		</div>
	</div>
</div>
components/com_templates/views/template/tmpl/default_modal_delete_body.php000060400000000712152453623450023366 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div id="template-manager-delete" class="container-fluid">
	<div class="row-fluid">
		<p><?php echo JText::sprintf('COM_TEMPLATES_MODAL_FILE_DELETE', $this->fileName); ?></p>
	</div>
</div>components/com_templates/views/template/tmpl/default_modal_copy_body.php000060400000001546152453623450023104 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div id="template-manager-copy" class="container-fluid">
	<div class="row-fluid">
		<div class="form-horizontal">
			<div class="control-group">
				<div class="control-label">
					<label for="new_name" class="modalTooltip" title="<?php echo JHtml::_('tooltipText', 'COM_TEMPLATES_TEMPLATE_NEW_NAME_LABEL', 'COM_TEMPLATES_TEMPLATE_NEW_NAME_DESC'); ?>">
						<?php echo JText::_('COM_TEMPLATES_TEMPLATE_NEW_NAME_LABEL'); ?>
					</label>
				</div>
				<div class="controls">
					<input class="input-xlarge" type="text" id="new_name" name="new_name"  />
				</div>
			</div>
		</div>
	</div>
</div>
components/com_templates/views/template/tmpl/default_modal_file_body.php000060400000006534152453623450023053 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$input = JFactory::getApplication()->input;
?>
<div id="template-manager-file" class="container-fluid">
	<div class="row-fluid">
		<div class="span12">
			<div class="span6 column-right">
				<form method="post" action="<?php echo JRoute::_('index.php?option=com_templates&task=template.createFile&id=' . $input->getInt('id') . '&file=' . $this->file); ?>" class="well">
					<fieldset class="form-inline">
						<label><?php echo JText::_('COM_TEMPLATES_FILE_NAME'); ?></label>
						<input type="text" name="name" required />
						<select class="input-medium" data-chosen="true" name="type" required >
							<option value="">- <?php echo JText::_('COM_TEMPLATES_NEW_FILE_SELECT'); ?> -</option>
							<option value="css">css</option>
							<option value="php">php</option>
							<option value="js">js</option>
							<option value="xml">xml</option>
							<option value="ini">ini</option>
							<option value="less">less</option>
							<option value="sass">sass</option>
							<option value="scss">scss</option>
							<option value="txt">txt</option>
						</select>
						<input type="hidden" class="address" name="address" />
						<?php echo JHtml::_('form.token'); ?>
						<input type="submit" value="<?php echo JText::_('COM_TEMPLATES_BUTTON_CREATE'); ?>" class="btn btn-primary" />
					</fieldset>
				</form>
				<form method="post" action="<?php echo JRoute::_('index.php?option=com_templates&task=template.uploadFile&id=' . $input->getInt('id') . '&file=' . $this->file); ?>" class="well" enctype="multipart/form-data">
					<fieldset class="form-inline">
						<input type="hidden" class="address" name="address" />
						<input type="file" name="files" required />
						<?php echo JHtml::_('form.token'); ?>
						<input type="submit" value="<?php echo JText::_('COM_TEMPLATES_BUTTON_UPLOAD'); ?>" class="btn btn-primary" /><br>
						<?php $cMax    = $this->state->get('params')->get('upload_limit'); ?>
						<?php $maxSize = JHtml::_('number.bytes', JUtility::getMaxUploadSize($cMax . 'MB')); ?>
						<?php echo JText::sprintf('JGLOBAL_MAXIMUM_UPLOAD_SIZE_LIMIT', $maxSize); ?>
					</fieldset>
				</form>
				<?php if ($this->type != 'home') : ?>
					<form method="post" action="<?php echo JRoute::_('index.php?option=com_templates&task=template.copyFile&id=' . $input->getInt('id') . '&file=' . $this->file); ?>" class="well" enctype="multipart/form-data">
						<fieldset class="form-inline">
							<input type="hidden" class="address" name="address" />
							<label for="new_name" class="modalTooltip" title="<?php echo JHtml::_('tooltipText', 'COM_TEMPLATES_FILE_NEW_NAME_DESC'); ?>">
								<?php echo JText::_('COM_TEMPLATES_FILE_NEW_NAME_LABEL')?>
							</label>
							<input type="text" id="new_name" name="new_name" required />
							<?php echo JHtml::_('form.token'); ?>
							<input type="submit" value="<?php echo JText::_('COM_TEMPLATES_BUTTON_COPY_FILE'); ?>" class="btn btn-primary" />
						</fieldset>
					</form>
				<?php endif; ?>
			</div>
			<div class="span6 column-left">
				<?php echo $this->loadTemplate('folders'); ?>
				<hr class="hr-condensed" />
			</div>
		</div>
	</div>
</div>
components/com_templates/views/template/tmpl/default_folders.php000060400000001424152453623450021372 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
ksort($this->files, SORT_STRING);
?>

<ul class='nav nav-list directory-tree'>
	<?php foreach ($this->files as $key => $value) : ?>
		<?php if (is_array($value)) : ?>
			<li class="folder-select">
				<a class='folder-url nowrap' data-id='<?php echo base64_encode($key); ?>' href=''>
					<span class='icon-folder'>&nbsp;<?php $explodeArray = explode('/', $key); echo $this->escape(end($explodeArray)); ?></span>
				</a>
				<?php echo $this->folderTree($value); ?>
			</li>
		<?php endif; ?>
	<?php endforeach; ?>
</ul>
components/com_templates/views/template/tmpl/default_modal_copy_footer.php000060400000000763152453623450023445 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<button type="button" class="btn" data-dismiss="modal"><?php echo JText::_('COM_TEMPLATES_TEMPLATE_CLOSE'); ?></button>
<button type="submit" class="btn btn-primary"><?php echo JText::_('COM_TEMPLATES_TEMPLATE_COPY'); ?></button>
components/com_templates/views/template/tmpl/default_modal_rename_body.php000060400000001655152453623450023402 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

?>
<div id="template-manager-rename" class="container-fluid">
	<div class="row-fluid">
		<div class="form-horizontal">
			<div class="control-group">
				<div class="control-label">
					<label for="new_name" class="modalTooltip" title="<?php echo JHtml::_('tooltipText', JText::_('COM_TEMPLATES_NEW_FILE_NAME')); ?>">
						<?php echo JText::_('COM_TEMPLATES_NEW_FILE_NAME')?>
					</label>
				</div>
				<div class="controls">
					<div class="input-append">
						<input class="input-xlarge" type="text" name="new_name" required />
						<span class="add-on">.<?php echo JFile::getExt($this->fileName); ?></span>
					</div>
				</div>
			</div>
		</div>
	</div>
</div>
components/com_templates/models/forms/filter_templates.xml000060400000002406152453623450020272 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset addfieldpath="/administrator/components/com_templates/models/fields" />
	<field
		name="client_id"
		type="list"
		filtermode="selector"
		onchange="jQuery('#filter_search, select[id^=filter_], #list_fullordering').val('');this.form.submit();"
		>
		<option value="0">JSITE</option>
		<option value="1">JADMINISTRATOR</option>
	</field>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="JSEARCH_FILTER"
			description="COM_TEMPLATES_TEMPLATES_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
			noresults="COM_TEMPLATES_MSG_MANAGE_NO_TEMPLATES"
		/>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="a.element ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.element ASC">COM_TEMPLATES_HEADING_TEMPLATE_ASC</option>
			<option value="a.element DESC">COM_TEMPLATES_HEADING_TEMPLATE_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			label="JGLOBAL_LIMIT"
			description="JGLOBAL_LIMIT"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_templates/models/forms/style.xml000060400000001637152453623450016074 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<field
			name="id"
			type="number"
			label="JGLOBAL_FIELD_ID_LABEL"
			description="JGLOBAL_FIELD_ID_DESC"
			id="id"
			default="0"
			readonly="true"
			class="readonly"
		/>

		<field
			name="template"
			type="text"
			label="COM_TEMPLATES_FIELD_TEMPLATE_LABEL"
			description="COM_TEMPLATES_FIELD_TEMPLATE_DESC"
			class="readonly"
			size="30"
			readonly="true" 
		/>

		<field
			name="client_id"
			type="hidden"
			label="COM_TEMPLATES_FIELD_CLIENT_LABEL"
			description="COM_TEMPLATES_FIELD_CLIENT_DESC"
			class="readonly"
			default="0"
			readonly="true" 
		/>

		<field
			name="title"
			type="text"
			label="COM_TEMPLATES_FIELD_TITLE_LABEL"
			description="COM_TEMPLATES_FIELD_TITLE_DESC"
			class="input-xxlarge input-large-text"
			size="50"
			required="true" 
		/>

		<field 
			name="assigned" 
			type="hidden" 
		/>

	</fieldset>
</form>
components/com_templates/models/forms/style_administrator.xml000060400000000547152453623450021033 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<field
			name="home"
			type="radio"
			label="COM_TEMPLATES_FIELD_HOME_LABEL"
			description="COM_TEMPLATES_FIELD_HOME_ADMINISTRATOR_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>
	</fieldset>
</form>
components/com_templates/models/forms/style_site.xml000060400000000503152453623450017107 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<field
			name="home"
			type="contentlanguage"
			label="COM_TEMPLATES_FIELD_HOME_LABEL"
			description="COM_TEMPLATES_FIELD_HOME_SITE_DESC"
			default="0"
			>
			<option value="0">JNO</option>
			<option value="1">JALL</option>
		</field>
	</fieldset>
</form>
components/com_templates/models/forms/filter_styles.xml000060400000004213152453623450017615 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset addfieldpath="/administrator/components/com_templates/models/fields" />
	<field
		name="client_id"
		type="list"
		filtermode="selector"
		onchange="jQuery('#filter_search, select[id^=filter_], #list_fullordering').val('');this.form.submit();"
		>
		<option value="0">JSITE</option>
		<option value="1">JADMINISTRATOR</option>
	</field>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="JSEARCH_FILTER"
			description="COM_TEMPLATES_STYLES_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
			noresults="COM_TEMPLATES_MSG_MANAGE_NO_STYLES"
		/>
		<field
			name="menuitem"
			type="menuitem"
			label="COM_TEMPLATES_OPTION_SELECT_MENU_ITEM"
			disable="separator,alias,heading,url"
			showon="client_id:0"
			onchange="this.form.submit();"
			>
			<option	value="">COM_TEMPLATES_OPTION_SELECT_MENU_ITEM</option>
			<option	value="-1">COM_TEMPLATES_OPTION_NONE</option>
		</field>
		<field
			name="template"
			type="templatename"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_TEMPLATE</option>
		</field>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="a.template ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.title ASC">COM_TEMPLATES_HEADING_STYLE_ASC</option>
			<option value="a.title DESC">COM_TEMPLATES_HEADING_STYLE_DESC</option>
			<option value="a.home ASC">COM_TEMPLATES_HEADING_DEFAULT_ASC</option>
			<option value="a.home DESC">COM_TEMPLATES_HEADING_DEFAULT_DESC</option>
			<option value="a.template ASC">COM_TEMPLATES_HEADING_TEMPLATE_ASC</option>
			<option value="a.template DESC">COM_TEMPLATES_HEADING_TEMPLATE_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			label="JGLOBAL_LIMIT"
			description="JGLOBAL_LIMIT"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
    </fields>
</form>
components/com_templates/models/forms/source.xml000060400000000701152453623450016223 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<field
			name="extension_id"
			type="hidden" 
		/>

		<field
			name="filename"
			type="hidden"
		 />

		<field
			name="source"
			type="editor"
			label="COM_TEMPLATES_FIELD_SOURCE_LABEL"
			description="COM_TEMPLATES_FIELD_SOURCE_DESC"
			editor="codemirror|none"
			buttons="no"
			height="500px"
			rows="20"
			cols="80"
			syntax="php"
			filter="raw" 
		/>
	</fieldset>
</form>
components/com_templates/models/template.php000060400000111003152453623450015375 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Template model class.
 *
 * @since  1.6
 */
class TemplatesModelTemplate extends JModelForm
{
	/**
	 * The information in a template
	 *
	 * @var    stdClass
	 * @since  1.6
	 */
	protected $template = null;

	/**
	 * The path to the template
	 *
	 * @var    stdClass
	 * @since  3.2
	 */
	protected $element = null;

	/**
	 * Internal method to get file properties.
	 *
	 * @param   string  $path  The base path.
	 * @param   string  $name  The file name.
	 *
	 * @return  object
	 *
	 * @since   1.6
	 */
	protected function getFile($path, $name)
	{
		$temp = new stdClass;

		if ($template = $this->getTemplate())
		{
			$temp->name = $name;
			$temp->id = urlencode(base64_encode($path . $name));

			return $temp;
		}
	}

	/**
	 * Method to get a list of all the files to edit in a template.
	 *
	 * @return  array  A nested array of relevant files.
	 *
	 * @since   1.6
	 */
	public function getFiles()
	{
		$result = array();

		if ($template = $this->getTemplate())
		{
			jimport('joomla.filesystem.folder');
			$app    = JFactory::getApplication();
			$client = JApplicationHelper::getClientInfo($template->client_id);
			$path   = JPath::clean($client->path . '/templates/' . $template->element . '/');
			$lang   = JFactory::getLanguage();

			// Load the core and/or local language file(s).
			$lang->load('tpl_' . $template->element, $client->path, null, false, true) ||
			$lang->load('tpl_' . $template->element, $client->path . '/templates/' . $template->element, null, false, true);
			$this->element = $path;

			if (!is_writable($path))
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_DIRECTORY_NOT_WRITABLE'), 'error');
			}

			if (is_dir($path))
			{
				$result = $this->getDirectoryTree($path);
			}
			else
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_TEMPLATE_FOLDER_NOT_FOUND'), 'error');

				return false;
			}
		}

		return $result;
	}

	/**
	 * Get the directory tree.
	 *
	 * @param   string  $dir  The path of the directory to scan
	 *
	 * @return  array
	 *
	 * @since   3.2
	 */
	public function getDirectoryTree($dir)
	{
		$result = array();

		$dirFiles = scandir($dir);

		foreach ($dirFiles as $key => $value)
		{
			if (!in_array($value, array('.', '..')))
			{
				if (is_dir($dir . $value))
				{
					$relativePath = str_replace($this->element, '', $dir . $value);
					$result['/' . $relativePath] = $this->getDirectoryTree($dir . $value . '/');
				}
				else
				{
					$ext           = pathinfo($dir . $value, PATHINFO_EXTENSION);
					$allowedFormat = $this->checkFormat($ext);

					if ($allowedFormat == true)
					{
						$relativePath = str_replace($this->element, '', $dir);
						$info = $this->getFile('/' . $relativePath, $value);
						$result[] = $info;
					}
				}
			}
		}

		return $result;
	}

	/**
	 * 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()
	{
		jimport('joomla.filesystem.file');
		$app = JFactory::getApplication('administrator');

		// Load the User state.
		$pk = $app->input->getInt('id');
		$this->setState('extension.id', $pk);

		// Load the parameters.
		$params = JComponentHelper::getParams('com_templates');
		$this->setState('params', $params);
	}

	/**
	 * Method to get the template information.
	 *
	 * @return  mixed  Object if successful, false if not and internal error is set.
	 *
	 * @since   1.6
	 */
	public function &getTemplate()
	{
		if (empty($this->template))
		{
			$pk  = $this->getState('extension.id');
			$db  = $this->getDbo();
			$app = JFactory::getApplication();

			// Get the template information.
			$query = $db->getQuery(true)
				->select('extension_id, client_id, element, name, manifest_cache')
				->from('#__extensions')
				->where($db->quoteName('extension_id') . ' = ' . (int) $pk)
				->where($db->quoteName('type') . ' = ' . $db->quote('template'));
			$db->setQuery($query);

			try
			{
				$result = $db->loadObject();
			}
			catch (RuntimeException $e)
			{
				$app->enqueueMessage($e->getMessage(), 'warning');
				$this->template = false;

				return false;
			}

			if (empty($result))
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_EXTENSION_RECORD_NOT_FOUND'), 'error');
				$this->template = false;
			}
			else
			{
				$this->template = $result;
			}
		}

		return $this->template;
	}

	/**
	 * Method to check if new template name already exists
	 *
	 * @return  boolean   true if name is not used, false otherwise
	 *
	 * @since	2.5
	 */
	public function checkNewName()
	{
		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->select('COUNT(*)')
			->from('#__extensions')
			->where('name = ' . $db->quote($this->getState('new_name')));
		$db->setQuery($query);

		return ($db->loadResult() == 0);
	}

	/**
	 * Method to check if new template name already exists
	 *
	 * @return  string     name of current template
	 *
	 * @since	2.5
	 */
	public function getFromName()
	{
		return $this->getTemplate()->element;
	}

	/**
	 * Method to check if new template name already exists
	 *
	 * @return  boolean   true if name is not used, false otherwise
	 *
	 * @since	2.5
	 */
	public function copy()
	{
		$app = JFactory::getApplication();

		if ($template = $this->getTemplate())
		{
			jimport('joomla.filesystem.folder');
			$client = JApplicationHelper::getClientInfo($template->client_id);
			$fromPath = JPath::clean($client->path . '/templates/' . $template->element . '/');

			// Delete new folder if it exists
			$toPath = $this->getState('to_path');

			if (JFolder::exists($toPath))
			{
				if (!JFolder::delete($toPath))
				{
					$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_COULD_NOT_WRITE'), 'error');

					return false;
				}
			}

			// Copy all files from $fromName template to $newName folder
			if (!JFolder::copy($fromPath, $toPath) || !$this->fixTemplateName())
			{
				return false;
			}

			return true;
		}
		else
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_INVALID_FROM_NAME'), 'error');

			return false;
		}
	}

	/**
	 * Method to delete tmp folder
	 *
	 * @return  boolean   true if delete successful, false otherwise
	 *
	 * @since	2.5
	 */
	public function cleanup()
	{
		// Clear installation messages
		$app = JFactory::getApplication();
		$app->setUserState('com_installer.message', '');
		$app->setUserState('com_installer.extension_message', '');

		// Delete temporary directory
		return JFolder::delete($this->getState('to_path'));
	}

	/**
	 * Method to rename the template in the XML files and rename the language files
	 *
	 * @return  boolean  true if successful, false otherwise
	 *
	 * @since	2.5
	 */
	protected function fixTemplateName()
	{
		// Rename Language files
		// Get list of language files
		$result   = true;
		$files    = JFolder::files($this->getState('to_path'), '.ini', true, true);
		$newName  = strtolower($this->getState('new_name'));
		$template = $this->getTemplate();
		$oldName  = $template->element;
		$manifest = json_decode($template->manifest_cache);

		jimport('joomla.filesystem.file');

		foreach ($files as $file)
		{
			$newFile = '/' . str_replace($oldName, $newName, basename($file));
			$result  = JFile::move($file, dirname($file) . $newFile) && $result;
		}

		// Edit XML file
		$xmlFile = $this->getState('to_path') . '/templateDetails.xml';

		if (JFile::exists($xmlFile))
		{
			$contents = file_get_contents($xmlFile);
			$pattern[] = '#<name>\s*' . $manifest->name . '\s*</name>#i';
			$replace[] = '<name>' . $newName . '</name>';
			$pattern[] = '#<language(.*)' . $oldName . '(.*)</language>#';
			$replace[] = '<language${1}' . $newName . '${2}</language>';
			$contents = preg_replace($pattern, $replace, $contents);
			$result = JFile::write($xmlFile, $contents) && $result;
		}

		return $result;
	}

	/**
	 * 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    A JForm object on success, false on failure
	 *
	 * @since   1.6
	 */
	public function getForm($data = array(), $loadData = true)
	{
		$app = JFactory::getApplication();

		// Codemirror or Editor None should be enabled
		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->select('COUNT(*)')
			->from('#__extensions as a')
			->where(
				'(a.name =' . $db->quote('plg_editors_codemirror') .
				' AND a.enabled = 1) OR (a.name =' .
				$db->quote('plg_editors_none') .
				' AND a.enabled = 1)'
			);
		$db->setQuery($query);
		$state = $db->loadResult();

		if ((int) $state < 1)
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_EDITOR_DISABLED'), 'warning');
		}

		// Get the form.
		$form = $this->loadForm('com_templates.source', 'source', 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 = $this->getSource();

		$this->preprocessData('com_templates.source', $data);

		return $data;
	}

	/**
	 * Method to get a single record.
	 *
	 * @return  mixed  Object on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function &getSource()
	{
		$app = JFactory::getApplication();
		$item = new stdClass;

		if (!$this->template)
		{
			$this->getTemplate();
		}

		if ($this->template)
		{
			$input    = JFactory::getApplication()->input;
			$fileName = base64_decode($input->get('file'));
			$client   = JApplicationHelper::getClientInfo($this->template->client_id);

			try
			{
				$filePath = JPath::check($client->path . '/templates/' . $this->template->element . '/' . $fileName);
			}
			catch (Exception $e)
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_SOURCE_FILE_NOT_FOUND'), 'error');

				return;
			}

			if (file_exists($filePath))
			{
				$item->extension_id = $this->getState('extension.id');
				$item->filename = $fileName;
				$item->source = file_get_contents($filePath);
			}
			else
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_SOURCE_FILE_NOT_FOUND'), 'error');
			}
		}

		return $item;
	}

	/**
	 * Method to store the source file contents.
	 *
	 * @param   array  $data  The source data to save.
	 *
	 * @return  boolean  True on success, false otherwise and internal error set.
	 *
	 * @since   1.6
	 */
	public function save($data)
	{
		jimport('joomla.filesystem.file');

		// Get the template.
		$template = $this->getTemplate();

		if (empty($template))
		{
			return false;
		}

		$app = JFactory::getApplication();
		$fileName = base64_decode($app->input->get('file'));
		$client = JApplicationHelper::getClientInfo($template->client_id);
		$filePath = JPath::clean($client->path . '/templates/' . $template->element . '/' . $fileName);

		// Include the extension plugins for the save events.
		JPluginHelper::importPlugin('extension');

		$user = get_current_user();
		chown($filePath, $user);
		JPath::setPermissions($filePath, '0644');

		// Try to make the template file writable.
		if (!is_writable($filePath))
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_SOURCE_FILE_NOT_WRITABLE'), 'warning');
			$app->enqueueMessage(JText::sprintf('COM_TEMPLATES_FILE_PERMISSIONS', JPath::getPermissions($filePath)), 'warning');

			if (!JPath::isOwner($filePath))
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_CHECK_FILE_OWNERSHIP'), 'warning');
			}

			return false;
		}

		// Make sure EOL is Unix
		$data['source'] = str_replace(array("\r\n", "\r"), "\n", $data['source']);

		$return = JFile::write($filePath, $data['source']);

		if (!$return)
		{
			$app->enqueueMessage(JText::sprintf('COM_TEMPLATES_ERROR_FAILED_TO_SAVE_FILENAME', $fileName), 'error');

			return false;
		}

		// Get the extension of the changed file.
		$explodeArray = explode('.', $fileName);
		$ext = end($explodeArray);

		if ($ext == 'less')
		{
			$app->enqueueMessage(JText::sprintf('COM_TEMPLATES_COMPILE_LESS', $fileName));
		}

		return true;
	}

	/**
	 * Get overrides folder.
	 *
	 * @param   string  $name  The name of override.
	 * @param   string  $path  Location of override.
	 *
	 * @return  object  containing override name and path.
	 *
	 * @since   3.2
	 */
	public function getOverridesFolder($name,$path)
	{
		$folder = new stdClass;
		$folder->name = $name;
		$folder->path = base64_encode($path . $name);

		return $folder;
	}

	/**
	 * Get a list of overrides.
	 *
	 * @return  array containing overrides.
	 *
	 * @since   3.2
	 */
	public function getOverridesList()
	{
		if ($template = $this->getTemplate())
		{
			$client        = JApplicationHelper::getClientInfo($template->client_id);
			$componentPath = JPath::clean($client->path . '/components/');
			$modulePath    = JPath::clean($client->path . '/modules/');
			$pluginPath    = JPath::clean(JPATH_ROOT . '/plugins/');
			$layoutPath    = JPath::clean(JPATH_ROOT . '/layouts/');
			$components    = JFolder::folders($componentPath);

			foreach ($components as $component)
			{
				if (file_exists($componentPath . '/' . $component . '/views/'))
				{
					$viewPath = JPath::clean($componentPath . '/' . $component . '/views/');
				}
				elseif (file_exists($componentPath . '/' . $component . '/view/'))
				{
					$viewPath = JPath::clean($componentPath . '/' . $component . '/view/');
				}
				else
				{
					$viewPath = '';
				}

				if ($viewPath)
				{
					$views = JFolder::folders($viewPath);

					foreach ($views as $view)
					{
						// Only show the view has layout inside it
						if (file_exists($viewPath . $view . '/tmpl'))
						{
							$result['components'][$component][] = $this->getOverridesFolder($view, $viewPath);
						}
					}
				}
			}

			foreach (JFolder::folders($pluginPath) as $pluginGroup)
			{
				foreach (JFolder::folders($pluginPath . '/' . $pluginGroup) as $plugin)
				{
					if (file_exists($pluginPath . '/' . $pluginGroup . '/' . $plugin . '/tmpl/'))
					{
						$pluginLayoutPath = JPath::clean($pluginPath . '/' . $pluginGroup . '/');
						$result['plugins'][$pluginGroup][] = $this->getOverridesFolder($plugin, $pluginLayoutPath);
					}
				}
			}

			$modules = JFolder::folders($modulePath);

			foreach ($modules as $module)
			{
				$result['modules'][] = $this->getOverridesFolder($module, $modulePath);
			}

			$layoutFolders = JFolder::folders($layoutPath);

			foreach ($layoutFolders as $layoutFolder)
			{
				$layoutFolderPath = JPath::clean($layoutPath . '/' . $layoutFolder . '/');
				$layouts = JFolder::folders($layoutFolderPath);

				foreach ($layouts as $layout)
				{
					$result['layouts'][$layoutFolder][] = $this->getOverridesFolder($layout, $layoutFolderPath);
				}
			}

			// Check for layouts in component folders
			foreach ($components as $component)
			{
				if (file_exists($componentPath . '/' . $component . '/layouts/'))
				{
					$componentLayoutPath = JPath::clean($componentPath . '/' . $component . '/layouts/');

					if ($componentLayoutPath)
					{
						$layouts = JFolder::folders($componentLayoutPath);

						foreach ($layouts as $layout)
						{
							$result['layouts'][$component][] = $this->getOverridesFolder($layout, $componentLayoutPath);
						}
					}
				}
			}
		}

		if (!empty($result))
		{
			return $result;
		}
	}

	/**
	 * Create overrides.
	 *
	 * @param   string  $override  The override location.
	 *
	 * @return   boolean  true if override creation is successful, false otherwise
	 *
	 * @since   3.2
	 */
	public function createOverride($override)
	{
		jimport('joomla.filesystem.folder');

		if ($template = $this->getTemplate())
		{
			$app          = JFactory::getApplication();
			$explodeArray = explode(DIRECTORY_SEPARATOR, $override);
			$name         = end($explodeArray);
			$client       = JApplicationHelper::getClientInfo($template->client_id);

			if (stristr($name, 'mod_') != false)
			{
				$htmlPath   = JPath::clean($client->path . '/templates/' . $template->element . '/html/' . $name);
			}
			elseif (stristr($override, 'com_') != false)
			{
				$size = count($explodeArray);

				$url = JPath::clean($explodeArray[$size - 3] . '/' . $explodeArray[$size - 1]);

				if ($explodeArray[$size - 2] == 'layouts')
				{
					$htmlPath = JPath::clean($client->path . '/templates/' . $template->element . '/html/layouts/' . $url);
				}
				else
				{
					$htmlPath = JPath::clean($client->path . '/templates/' . $template->element . '/html/' . $url);
				}
			}
			elseif (stripos($override, JPath::clean(JPATH_ROOT . '/plugins/')) === 0)
			{
				$size       = count($explodeArray);
				$layoutPath = JPath::clean('plg_' . $explodeArray[$size - 2] . '_' . $explodeArray[$size - 1]);
				$htmlPath   = JPath::clean($client->path . '/templates/' . $template->element . '/html/' . $layoutPath);
			}
			else
			{
				$layoutPath = implode('/', array_slice($explodeArray, -2));
				$htmlPath   = JPath::clean($client->path . '/templates/' . $template->element . '/html/layouts/' . $layoutPath);
			}

			// Check Html folder, create if not exist
			if (!JFolder::exists($htmlPath))
			{
				if (!JFolder::create($htmlPath))
				{
					$app->enqueueMessage(JText::_('COM_TEMPLATES_FOLDER_ERROR'), 'error');

					return false;
				}
			}

			if (stristr($name, 'mod_') != false)
			{
				$return = $this->createTemplateOverride(JPath::clean($override . '/tmpl'), $htmlPath);
			}
			elseif (stristr($override, 'com_') != false && stristr($override, 'layouts') == false)
			{
				$return = $this->createTemplateOverride(JPath::clean($override . '/tmpl'), $htmlPath);
			}
			elseif (stripos($override, JPath::clean(JPATH_ROOT . '/plugins/')) === 0)
			{
				$return = $this->createTemplateOverride(JPath::clean($override . '/tmpl'), $htmlPath);
			}
			else
			{
				$return = $this->createTemplateOverride($override, $htmlPath);
			}

			if ($return)
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_OVERRIDE_CREATED') . str_replace(JPATH_ROOT, '', $htmlPath));

				return true;
			}
			else
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_OVERRIDE_FAILED'), 'error');

				return false;
			}
		}
	}

	/**
	 * Create override folder & file
	 *
	 * @param   string  $overridePath  The override location
	 * @param   string  $htmlPath      The html location
	 *
	 * @return  boolean                True on success. False otherwise.
	 */
	public function createTemplateOverride($overridePath, $htmlPath)
	{
		$return = false;

		if (empty($overridePath) || empty($htmlPath))
		{
			return $return;
		}

		// Get list of template folders
		$folders = JFolder::folders($overridePath, null, true, true);

		if (!empty($folders))
		{
			foreach ($folders as $folder)
			{
				$htmlFolder = $htmlPath . str_replace($overridePath, '', $folder);

				if (!JFolder::exists($htmlFolder))
				{
					JFolder::create($htmlFolder);
				}
			}
		}

		// Get list of template files (Only get *.php file for template file)
		$files = JFolder::files($overridePath, '.php', true, true);

		if (empty($files))
		{
			return true;
		}

		foreach ($files as $file)
		{
			$overrideFilePath = str_replace($overridePath, '', $file);
			$htmlFilePath = $htmlPath . $overrideFilePath;

			if (JFile::exists($htmlFilePath))
			{
				// Generate new unique file name base on current time
				$today = JFactory::getDate();
				$htmlFilePath = JFile::stripExt($htmlFilePath) . '-' . $today->format('Ymd-His') . '.' . JFile::getExt($htmlFilePath);
			}

			$return = JFile::copy($file, $htmlFilePath, '', true);
		}

		return $return;
	}

	/**
	 * Compile less using the less compiler under /build.
	 *
	 * @param   string  $input  The relative location of the less file.
	 *
	 * @return  boolean  true if compilation is successful, false otherwise
	 *
	 * @since   3.2
	 */
	public function compileLess($input)
	{
		if ($template = $this->getTemplate())
		{
			$app          = JFactory::getApplication();
			$client       = JApplicationHelper::getClientInfo($template->client_id);
			$path         = JPath::clean($client->path . '/templates/' . $template->element . '/');
			$inFile       = urldecode(base64_decode($input));
			$explodeArray = explode('/', $inFile);
			$fileName     = end($explodeArray);
			$outFile      = current(explode('.', $fileName));

			$less = new JLess;
			$less->setFormatter(new JLessFormatterJoomla);

			try
			{
				$less->compileFile($path . $inFile, $path . 'css/' . $outFile . '.css');

				return true;
			}
			catch (Exception $e)
			{
				$app->enqueueMessage($e->getMessage(), 'error');
			}
		}
	}

	/**
	 * Delete a particular file.
	 *
	 * @param   string  $file  The relative location of the file.
	 *
	 * @return   boolean  True if file deletion is successful, false otherwise
	 *
	 * @since   3.2
	 */
	public function deleteFile($file)
	{
		if ($template = $this->getTemplate())
		{
			$app      = JFactory::getApplication();
			$client   = JApplicationHelper::getClientInfo($template->client_id);
			$path     = JPath::clean($client->path . '/templates/' . $template->element . '/');
			$filePath = $path . urldecode(base64_decode($file));

			$return = JFile::delete($filePath);

			if (!$return)
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_DELETE_FAIL'), 'error');

				return false;
			}

			return true;
		}
	}

	/**
	 * Create new file.
	 *
	 * @param   string  $name      The name of file.
	 * @param   string  $type      The extension of the file.
	 * @param   string  $location  Location for the new file.
	 *
	 * @return  boolean  true if file created successfully, false otherwise
	 *
	 * @since   3.2
	 */
	public function createFile($name, $type, $location)
	{
		if ($template = $this->getTemplate())
		{
			$app    = JFactory::getApplication();
			$client = JApplicationHelper::getClientInfo($template->client_id);
			$path   = JPath::clean($client->path . '/templates/' . $template->element . '/');

			if (file_exists(JPath::clean($path . '/' . $location . '/' . $name . '.' . $type)))
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_EXISTS'), 'error');

				return false;
			}

			if (!fopen(JPath::clean($path . '/' . $location . '/' . $name . '.' . $type), 'x'))
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_CREATE_ERROR'), 'error');

				return false;
			}

			// Check if the format is allowed and will be showed in the backend
			$check = $this->checkFormat($type);

			// Add a message if we are not allowed to show this file in the backend.
			if (!$check)
			{
				$app->enqueueMessage(JText::sprintf('COM_TEMPLATES_WARNING_FORMAT_WILL_NOT_BE_VISIBLE', $type), 'warning');
			}

			return true;
		}
	}

	/**
	 * Upload new file.
	 *
	 * @param   string  $file      The name of the file.
	 * @param   string  $location  Location for the new file.
	 *
	 * @return   boolean  True if file uploaded successfully, false otherwise
	 *
	 * @since   3.2
	 */
	public function uploadFile($file, $location)
	{
		jimport('joomla.filesystem.folder');

		if ($template = $this->getTemplate())
		{
			$app      = JFactory::getApplication();
			$client   = JApplicationHelper::getClientInfo($template->client_id);
			$path     = JPath::clean($client->path . '/templates/' . $template->element . '/');
			$fileName = JFile::makeSafe($file['name']);

			$err = null;
			JLoader::register('TemplateHelper', JPATH_ADMINISTRATOR . '/components/com_templates/helpers/template.php');

			if (!TemplateHelper::canUpload($file, $err))
			{
				// Can't upload the file
				return false;
			}

			if (file_exists(JPath::clean($path . '/' . $location . '/' . $file['name'])))
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_EXISTS'), 'error');

				return false;
			}

			if (!JFile::upload($file['tmp_name'], JPath::clean($path . '/' . $location . '/' . $fileName)))
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_UPLOAD_ERROR'), 'error');

				return false;
			}

			$url = JPath::clean($location . '/' . $fileName);

			return $url;
		}
	}

	/**
	 * Create new folder.
	 *
	 * @param   string  $name      The name of the new folder.
	 * @param   string  $location  Location for the new folder.
	 *
	 * @return   boolean  True if override folder is created successfully, false otherwise
	 *
	 * @since   3.2
	 */
	public function createFolder($name, $location)
	{
		jimport('joomla.filesystem.folder');

		if ($template = $this->getTemplate())
		{
			$app    = JFactory::getApplication();
			$client = JApplicationHelper::getClientInfo($template->client_id);
			$path   = JPath::clean($client->path . '/templates/' . $template->element . '/');

			if (file_exists(JPath::clean($path . '/' . $location . '/' . $name . '/')))
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_FOLDER_EXISTS'), 'error');

				return false;
			}

			if (!JFolder::create(JPath::clean($path . '/' . $location . '/' . $name)))
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_FOLDER_CREATE_ERROR'), 'error');

				return false;
			}

			return true;
		}
	}

	/**
	 * Delete a folder.
	 *
	 * @param   string  $location  The name and location of the folder.
	 *
	 * @return  boolean  True if override folder is deleted successfully, false otherwise
	 *
	 * @since   3.2
	 */
	public function deleteFolder($location)
	{
		jimport('joomla.filesystem.folder');

		if ($template = $this->getTemplate())
		{
			$app    = JFactory::getApplication();
			$client = JApplicationHelper::getClientInfo($template->client_id);
			$path   = JPath::clean($client->path . '/templates/' . $template->element . '/' . $location);

			if (!file_exists($path))
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_FOLDER_NOT_EXISTS'), 'error');

				return false;
			}

			$return = JFolder::delete($path);

			if (!$return)
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_DELETE_ERROR'), 'error');

				return false;
			}

			return true;
		}
	}

	/**
	 * Rename a file.
	 *
	 * @param   string  $file  The name and location of the old file
	 * @param   string  $name  The new name of the file.
	 *
	 * @return  string  Encoded string containing the new file location.
	 *
	 * @since   3.2
	 */
	public function renameFile($file, $name)
	{
		if ($template = $this->getTemplate())
		{
			$app          = JFactory::getApplication();
			$client       = JApplicationHelper::getClientInfo($template->client_id);
			$path         = JPath::clean($client->path . '/templates/' . $template->element . '/');
			$fileName     = base64_decode($file);
			$explodeArray = explode('.', $fileName);
			$type         = end($explodeArray);
			$explodeArray = explode('/', $fileName);
			$newName      = str_replace(end($explodeArray), $name . '.' . $type, $fileName);

			if (file_exists($path . $newName))
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_EXISTS'), 'error');

				return false;
			}

			if (!rename($path . $fileName, $path . $newName))
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_RENAME_ERROR'), 'error');

				return false;
			}

			return base64_encode($newName);
		}
	}

	/**
	 * Get an image address, height and width.
	 *
	 * @return  array an associative array containing image address, height and width.
	 *
	 * @since   3.2
	 */
	public function getImage()
	{
		if ($template = $this->getTemplate())
		{
			$app      = JFactory::getApplication();
			$client   = JApplicationHelper::getClientInfo($template->client_id);
			$fileName = base64_decode($app->input->get('file'));
			$path     = JPath::clean($client->path . '/templates/' . $template->element . '/');

			if (stristr($client->path, 'administrator') == false)
			{
				$folder = '/templates/';
			}
			else
			{
				$folder = '/administrator/templates/';
			}

			$uri = JUri::root(true) . $folder . $template->element;

			if (file_exists(JPath::clean($path . $fileName)))
			{
				$JImage = new JImage(JPath::clean($path . $fileName));
				$image['address'] = $uri . $fileName;
				$image['path']    = $fileName;
				$image['height']  = $JImage->getHeight();
				$image['width']   = $JImage->getWidth();
			}

			else
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_IMAGE_FILE_NOT_FOUND'), 'error');

				return false;
			}

			return $image;
		}
	}

	/**
	 * Crop an image.
	 *
	 * @param   string  $file  The name and location of the file
	 * @param   string  $w     width.
	 * @param   string  $h     height.
	 * @param   string  $x     x-coordinate.
	 * @param   string  $y     y-coordinate.
	 *
	 * @return  boolean     true if image cropped successfully, false otherwise.
	 *
	 * @since   3.2
	 */
	public function cropImage($file, $w, $h, $x, $y)
	{
		if ($template = $this->getTemplate())
		{
			$app      = JFactory::getApplication();
			$client   = JApplicationHelper::getClientInfo($template->client_id);
			$relPath  = base64_decode($file);
			$path     = JPath::clean($client->path . '/templates/' . $template->element . '/' . $relPath);

			try
			{
				$image      = new \JImage($path);
				$properties = $image->getImageFileProperties($path);

				switch ($properties->mime)
				{
					case 'image/png':
						$imageType = \IMAGETYPE_PNG;
						break;
					case 'image/gif':
						$imageType = \IMAGETYPE_GIF;
						break;
					default:
						$imageType = \IMAGETYPE_JPEG;
				}

				$image->crop($w, $h, $x, $y, false);
				$image->toFile($path, $imageType);

				return true;
			}
			catch (Exception $e)
			{
				$app->enqueueMessage($e->getMessage(), 'error');
			}
		}
	}

	/**
	 * Resize an image.
	 *
	 * @param   string  $file    The name and location of the file
	 * @param   string  $width   The new width of the image.
	 * @param   string  $height  The new height of the image.
	 *
	 * @return   boolean  true if image resize successful, false otherwise.
	 *
	 * @since   3.2
	 */
	public function resizeImage($file, $width, $height)
	{
		if ($template = $this->getTemplate())
		{
			$app     = JFactory::getApplication();
			$client  = JApplicationHelper::getClientInfo($template->client_id);
			$relPath = base64_decode($file);
			$path    = JPath::clean($client->path . '/templates/' . $template->element . '/' . $relPath);

			try
			{
				$image      = new \JImage($path);
				$properties = $image->getImageFileProperties($path);

				switch ($properties->mime)
				{
					case 'image/png':
						$imageType = \IMAGETYPE_PNG;
						break;
					case 'image/gif':
						$imageType = \IMAGETYPE_GIF;
						break;
					default:
						$imageType = \IMAGETYPE_JPEG;
				}

				$image->resize($width, $height, false, \JImage::SCALE_FILL);
				$image->toFile($path, $imageType);

				return true;
			}
			catch (Exception $e)
			{
				$app->enqueueMessage($e->getMessage(), 'error');
			}
		}
	}

	/**
	 * Template preview.
	 *
	 * @return  object  object containing the id of the template.
	 *
	 * @since   3.2
	 */
	public function getPreview()
	{
		$app = JFactory::getApplication();
		$db = $this->getDbo();
		$query = $db->getQuery(true);

		$query->select('id, client_id');
		$query->from('#__template_styles');
		$query->where($db->quoteName('template') . ' = ' . $db->quote($this->template->element));

		$db->setQuery($query);

		try
		{
			$result = $db->loadObject();
		}
		catch (RuntimeException $e)
		{
			$app->enqueueMessage($e->getMessage(), 'warning');
		}

		if (empty($result))
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_EXTENSION_RECORD_NOT_FOUND'), 'warning');
		}
		else
		{
			return $result;
		}
	}

	/**
	 * Rename a file.
	 *
	 * @return  mixed  array on success, false on failure
	 *
	 * @since   3.2
	 */
	public function getFont()
	{
		if ($template = $this->getTemplate())
		{
			$app          = JFactory::getApplication();
			$client       = JApplicationHelper::getClientInfo($template->client_id);
			$relPath      = base64_decode($app->input->get('file'));
			$explodeArray = explode('/', $relPath);
			$fileName     = end($explodeArray);
			$path         = JPath::clean($client->path . '/templates/' . $template->element . '/' . $relPath);

			if (stristr($client->path, 'administrator') == false)
			{
				$folder = '/templates/';
			}
			else
			{
				$folder = '/administrator/templates/';
			}

			$uri = JUri::root(true) . $folder . $template->element;

			if (file_exists(JPath::clean($path)))
			{
				$font['address'] = $uri . $relPath;

				$font['rel_path'] = $relPath;

				$font['name'] = $fileName;
			}

			else
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_FONT_FILE_NOT_FOUND'), 'error');

				return false;
			}

			return $font;
		}
	}

	/**
	 * Copy a file.
	 *
	 * @param   string  $newName   The name of the copied file
	 * @param   string  $location  The final location where the file is to be copied
	 * @param   string  $file      The name and location of the file
	 *
	 * @return   boolean  true if image resize successful, false otherwise.
	 *
	 * @since   3.2
	 */
	public function copyFile($newName, $location, $file)
	{
		if ($template = $this->getTemplate())
		{
			$app          = JFactory::getApplication();
			$client       = JApplicationHelper::getClientInfo($template->client_id);
			$relPath      = base64_decode($file);
			$explodeArray = explode('.', $relPath);
			$ext          = end($explodeArray);
			$path         = JPath::clean($client->path . '/templates/' . $template->element . '/');
			$newPath      = JPath::clean($path . '/' . $location . '/' . $newName . '.' . $ext);

			if (file_exists($newPath))
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_EXISTS'), 'error');

				return false;
			}

			if (JFile::copy($path . $relPath, $newPath))
			{
				$app->enqueueMessage(JText::sprintf('COM_TEMPLATES_FILE_COPY_SUCCESS', $newName . '.' . $ext));

				return true;
			}
			else
			{
				return false;
			}
		}
	}

	/**
	 * Get the compressed files.
	 *
	 * @return   array if file exists, false otherwise
	 *
	 * @since   3.2
	 */
	public function getArchive()
	{
		if ($template = $this->getTemplate())
		{
			$app     = JFactory::getApplication();
			$client  = JApplicationHelper::getClientInfo($template->client_id);
			$relPath = base64_decode($app->input->get('file'));
			$path    = JPath::clean($client->path . '/templates/' . $template->element . '/' . $relPath);

			if (file_exists(JPath::clean($path)))
			{
				$files = array();
				$zip = new ZipArchive;

				if ($zip->open($path) === true)
				{
					for ($i = 0; $i < $zip->numFiles; $i++)
					{
						$entry = $zip->getNameIndex($i);
						$files[] = $entry;
					}
				}
				else
				{
					$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_ARCHIVE_OPEN_FAIL'), 'error');

					return false;
				}
			}
			else
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_FONT_FILE_NOT_FOUND'), 'error');

				return false;
			}

			return $files;
		}
	}

	/**
	 * Extract contents of an archive file.
	 *
	 * @param   string  $file  The name and location of the file
	 *
	 * @return  boolean  true if image extraction is successful, false otherwise.
	 *
	 * @since   3.2
	 */
	public function extractArchive($file)
	{
		if ($template = $this->getTemplate())
		{
			$app          = JFactory::getApplication();
			$client       = JApplicationHelper::getClientInfo($template->client_id);
			$relPath      = base64_decode($file);
			$explodeArray = explode('/', $relPath);
			$fileName     = end($explodeArray);
			$folderPath   = stristr($relPath, $fileName, true);
			$path         = JPath::clean($client->path . '/templates/' . $template->element . '/' . $folderPath . '/');

			if (file_exists(JPath::clean($path . '/' . $fileName)))
			{
				$zip = new ZipArchive;

				if ($zip->open(JPath::clean($path . '/' . $fileName)) === true)
				{
					for ($i = 0; $i < $zip->numFiles; $i++)
					{
						$entry = $zip->getNameIndex($i);

						if (file_exists(JPath::clean($path . '/' . $entry)))
						{
							$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_ARCHIVE_EXISTS'), 'error');

							return false;
						}
					}

					$zip->extractTo($path);

					return true;
				}
				else
				{
					$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_ARCHIVE_OPEN_FAIL'), 'error');

					return false;
				}
			}
			else
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_ARCHIVE_NOT_FOUND'), 'error');

				return false;
			}
		}
	}

	/**
	 * Check if the extension is allowed and will be shown in the template manager
	 *
	 * @param   string  $ext  The extension to check if it is allowed
	 *
	 * @return  boolean  true if the extension is allowed false otherwise
	 *
	 * @since   3.6.0
	 */
	protected function checkFormat($ext)
	{
		if (!isset($this->allowedFormats))
		{
			$params       = JComponentHelper::getParams('com_templates');
			$imageTypes   = explode(',', $params->get('image_formats'));
			$sourceTypes  = explode(',', $params->get('source_formats'));
			$fontTypes    = explode(',', $params->get('font_formats'));
			$archiveTypes = explode(',', $params->get('compressed_formats'));

			$this->allowedFormats = array_merge($imageTypes, $sourceTypes, $fontTypes, $archiveTypes);
		}

		return in_array($ext, $this->allowedFormats);
	}
}
components/com_templates/models/style.php000060400000043360152453623450014734 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Template style model.
 *
 * @since  1.6
 */
class TemplatesModelStyle extends JModelAdmin
{
	/**
	 * The help screen key for the module.
	 *
	 * @var	    string
	 * @since   1.6
	 */
	protected $helpKey = 'JHELP_EXTENSIONS_TEMPLATE_MANAGER_STYLES_EDIT';

	/**
	 * The help screen base URL for the module.
	 *
	 * @var     string
	 * @since   1.6
	 */
	protected $helpURL;

	/**
	 * Item cache.
	 *
	 * @var    array
	 * @since  1.6
	 */
	private $_cache = array();

	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 */
	public function __construct($config = array())
	{
		$config = array_merge(
			array(
				'event_before_delete' => 'onExtensionBeforeDelete',
				'event_after_delete'  => 'onExtensionAfterDelete',
				'event_before_save'   => 'onExtensionBeforeSave',
				'event_after_save'    => 'onExtensionAfterSave',
				'events_map'          => array('delete' => 'extension', 'save' => 'extension')
			), $config
		);

		parent::__construct($config);
	}

	/**
	 * 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()
	{
		$app = JFactory::getApplication('administrator');

		// Load the User state.
		$pk = $app->input->getInt('id');
		$this->setState('style.id', $pk);

		// Load the parameters.
		$params = JComponentHelper::getParams('com_templates');
		$this->setState('params', $params);
	}

	/**
	 * Method to delete rows.
	 *
	 * @param   array  &$pks  An array of item ids.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   1.6
	 * @throws  Exception
	 */
	public function delete(&$pks)
	{
		$pks        = (array) $pks;
		$user       = JFactory::getUser();
		$table      = $this->getTable();
		$dispatcher = JEventDispatcher::getInstance();
		$context    = $this->option . '.' . $this->name;

		JPluginHelper::importPlugin($this->events_map['delete']);

		// Iterate the items to delete each one.
		foreach ($pks as $pk)
		{
			if ($table->load($pk))
			{
				// Access checks.
				if (!$user->authorise('core.delete', 'com_templates'))
				{
					throw new Exception(JText::_('JERROR_CORE_DELETE_NOT_PERMITTED'));
				}

				// You should not delete a default style
				if ($table->home != '0')
				{
					JError::raiseWarning(500, JText::_('COM_TEMPLATES_STYLE_CANNOT_DELETE_DEFAULT_STYLE'));

					return false;
				}

				// Trigger the before delete event.
				$result = $dispatcher->trigger($this->event_before_delete, array($context, $table));

				if (in_array(false, $result, true) || !$table->delete($pk))
				{
					$this->setError($table->getError());

					return false;
				}

				// Trigger the after delete event.
				$dispatcher->trigger($this->event_after_delete, array($context, $table));
			}
			else
			{
				$this->setError($table->getError());

				return false;
			}
		}

		// Clean cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Method to duplicate styles.
	 *
	 * @param   array  &$pks  An array of primary key IDs.
	 *
	 * @return  boolean  True if successful.
	 *
	 * @throws  Exception
	 */
	public function duplicate(&$pks)
	{
		$user = JFactory::getUser();

		// Access checks.
		if (!$user->authorise('core.create', 'com_templates'))
		{
			throw new Exception(JText::_('JERROR_CORE_CREATE_NOT_PERMITTED'));
		}

		$dispatcher = JEventDispatcher::getInstance();
		$context    = $this->option . '.' . $this->name;

		// Include the plugins for the save events.
		JPluginHelper::importPlugin($this->events_map['save']);

		$table = $this->getTable();

		foreach ($pks as $pk)
		{
			if ($table->load($pk, true))
			{
				// Reset the id to create a new record.
				$table->id = 0;

				// Reset the home (don't want dupes of that field).
				$table->home = 0;

				// Alter the title.
				$m = null;
				$table->title = $this->generateNewTitle(null, null, $table->title);

				if (!$table->check())
				{
					throw new Exception($table->getError());
				}

				// Trigger the before save event.
				$result = $dispatcher->trigger($this->event_before_save, array($context, &$table, true));

				if (in_array(false, $result, true) || !$table->store())
				{
					throw new Exception($table->getError());
				}

				// Trigger the after save event.
				$dispatcher->trigger($this->event_after_save, array($context, &$table, true));
			}
			else
			{
				throw new Exception($table->getError());
			}
		}

		// Clean cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Method to change the title.
	 *
	 * @param   integer  $categoryId  The id of the category.
	 * @param   string   $alias       The alias.
	 * @param   string   $title       The title.
	 *
	 * @return  string  New title.
	 *
	 * @since   1.7.1
	 */
	protected function generateNewTitle($categoryId, $alias, $title)
	{
		// Alter the title
		$table = $this->getTable();

		while ($table->load(array('title' => $title)))
		{
			$title = StringHelper::increment($title);
		}

		return $title;
	}

	/**
	 * Method to get the record form.
	 *
	 * @param   array    $data      An optional array of data for the form to interrogate.
	 * @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)
	{
		// The folder and element vars are passed when saving the form.
		if (empty($data))
		{
			$item	   = $this->getItem();
			$clientId  = $item->client_id;
			$template  = $item->template;
		}
		else
		{
			$clientId  = ArrayHelper::getValue($data, 'client_id');
			$template  = ArrayHelper::getValue($data, 'template');
		}

		// Add the default fields directory
		$baseFolder = $clientId ? JPATH_ADMINISTRATOR : JPATH_SITE;
		JForm::addFieldPath($baseFolder . '/templates/' . $template . '/field');

		// These variables are used to add data from the plugin XML files.
		$this->setState('item.client_id', $clientId);
		$this->setState('item.template', $template);

		// Get the form.
		$form = $this->loadForm('com_templates.style', 'style', 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('home', 'disabled', 'true');

			// Disable fields while saving.
			// The controller has already verified this is a record you can edit.
			$form->setFieldAttribute('home', '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.
		$data = JFactory::getApplication()->getUserState('com_templates.edit.style.data', array());

		if (empty($data))
		{
			$data = $this->getItem();
		}

		$this->preprocessData('com_templates.style', $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.
	 */
	public function getItem($pk = null)
	{
		$pk = (!empty($pk)) ? $pk : (int) $this->getState('style.id');

		if (!isset($this->_cache[$pk]))
		{
			// Get a row instance.
			$table = $this->getTable();

			// Attempt to load the row.
			$return = $table->load($pk);

			// Check for a table object error.
			if ($return === false && $table->getError())
			{
				$this->setError($table->getError());

				return false;
			}

			// Convert to the JObject before adding other data.
			$properties        = $table->getProperties(1);
			$this->_cache[$pk] = ArrayHelper::toObject($properties, 'JObject');

			// Convert the params field to an array.
			$registry = new Registry($table->params);
			$this->_cache[$pk]->params = $registry->toArray();

			// Get the template XML.
			$client = JApplicationHelper::getClientInfo($table->client_id);
			$path   = JPath::clean($client->path . '/templates/' . $table->template . '/templateDetails.xml');

			if (file_exists($path))
			{
				$this->_cache[$pk]->xml = simplexml_load_file($path);
			}
			else
			{
				$this->_cache[$pk]->xml = null;
			}
		}

		return $this->_cache[$pk];
	}

	/**
	 * Returns a reference to the a Table object, always creating it.
	 *
	 * @param   type    $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
	 */
	public function getTable($type = 'Style', $prefix = 'TemplatesTable', $config = array())
	{
		return JTable::getInstance($type, $prefix, $config);
	}

	/**
	 * Method to allow derived classes 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 (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 = 'content')
	{
		$clientId = $this->getState('item.client_id');
		$template = $this->getState('item.template');
		$lang     = JFactory::getLanguage();
		$client   = JApplicationHelper::getClientInfo($clientId);

		if (!$form->loadFile('style_' . $client->name, true))
		{
			throw new Exception(JText::_('JERROR_LOADFILE_FAILED'));
		}

		jimport('joomla.filesystem.path');

		$formFile = JPath::clean($client->path . '/templates/' . $template . '/templateDetails.xml');

		// Load the core and/or local language file(s).
			$lang->load('tpl_' . $template, $client->path, null, false, true)
		||	$lang->load('tpl_' . $template, $client->path . '/templates/' . $template, null, false, true);

		if (file_exists($formFile))
		{
			// Get the template form.
			if (!$form->loadFile($formFile, false, '//config'))
			{
				throw new Exception(JText::_('JERROR_LOADFILE_FAILED'));
			}
		}

		// Disable home field if it is default style

		if ((is_array($data) && array_key_exists('home', $data) && $data['home'] == '1')
			|| (is_object($data) && isset($data->home) && $data->home == '1'))
		{
			$form->setFieldAttribute('home', 'readonly', 'true');
		}

		// Attempt to load the xml file.
		if (!$xml = simplexml_load_file($formFile))
		{
			throw new Exception(JText::_('JERROR_LOADFILE_FAILED'));
		}

		// Get the help data from the XML file if present.
		$help = $xml->xpath('/extension/help');

		if (!empty($help))
		{
			$helpKey = trim((string) $help[0]['key']);
			$helpURL = trim((string) $help[0]['url']);

			$this->helpKey = $helpKey ?: $this->helpKey;
			$this->helpURL = $helpURL ?: $this->helpURL;
		}

		// 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.
	 */
	public function save($data)
	{
		// Detect disabled extension
		$extension = JTable::getInstance('Extension');

		if ($extension->load(array('enabled' => 0, 'type' => 'template', 'element' => $data['template'], 'client_id' => $data['client_id'])))
		{
			$this->setError(JText::_('COM_TEMPLATES_ERROR_SAVE_DISABLED_TEMPLATE'));

			return false;
		}

		$app        = JFactory::getApplication();
		$dispatcher = JEventDispatcher::getInstance();
		$table      = $this->getTable();
		$pk         = (!empty($data['id'])) ? $data['id'] : (int) $this->getState('style.id');
		$isNew      = true;

		// Include the extension plugins for the save events.
		JPluginHelper::importPlugin($this->events_map['save']);

		// Load the row if saving an existing record.
		if ($pk > 0)
		{
			$table->load($pk);
			$isNew = false;
		}

		if ($app->input->get('task') == 'save2copy')
		{
			$data['title']    = $this->generateNewTitle(null, null, $data['title']);
			$data['home']     = 0;
			$data['assigned'] = '';
		}

		// Bind the data.
		if (!$table->bind($data))
		{
			$this->setError($table->getError());

			return false;
		}

		// Prepare the row for saving
		$this->prepareTable($table);

		// 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('com_templates.style', &$table, $isNew));

		// Store the data.
		if (in_array(false, $result, true) || !$table->store())
		{
			$this->setError($table->getError());

			return false;
		}

		$user = JFactory::getUser();

		if ($user->authorise('core.edit', 'com_menus') && $table->client_id == 0)
		{
			$n    = 0;
			$db   = $this->getDbo();
			$user = JFactory::getUser();

			if (!empty($data['assigned']) && is_array($data['assigned']))
			{
				$data['assigned'] = ArrayHelper::toInteger($data['assigned']);

				// Update the mapping for menu items that this style IS assigned to.
				$query = $db->getQuery(true)
					->update('#__menu')
					->set('template_style_id = ' . (int) $table->id)
					->where('id IN (' . implode(',', $data['assigned']) . ')')
					->where('template_style_id != ' . (int) $table->id)
					->where('checked_out IN (0,' . (int) $user->id . ')');
				$db->setQuery($query);
				$db->execute();
				$n += $db->getAffectedRows();
			}

			// Remove style mappings for menu items this style is NOT assigned to.
			// If unassigned then all existing maps will be removed.
			$query = $db->getQuery(true)
				->update('#__menu')
				->set('template_style_id = 0');

			if (!empty($data['assigned']))
			{
				$query->where('id NOT IN (' . implode(',', $data['assigned']) . ')');
			}

			$query->where('template_style_id = ' . (int) $table->id)
				->where('checked_out IN (0,' . (int) $user->id . ')');
			$db->setQuery($query);
			$db->execute();

			$n += $db->getAffectedRows();

			if ($n > 0)
			{
				$app->enqueueMessage(JText::plural('COM_TEMPLATES_MENU_CHANGED', $n));
			}
		}

		// Clean the cache.
		$this->cleanCache();

		// Trigger the after save event.
		$dispatcher->trigger($this->event_after_save, array('com_templates.style', &$table, $isNew));

		$this->setState('style.id', $table->id);

		return true;
	}

	/**
	 * Method to set a template style as home.
	 *
	 * @param   integer  $id  The primary key ID for the style.
	 *
	 * @return  boolean  True if successful.
	 *
	 * @throws	Exception
	 */
	public function setHome($id = 0)
	{
		$user = JFactory::getUser();
		$db   = $this->getDbo();

		// Access checks.
		if (!$user->authorise('core.edit.state', 'com_templates'))
		{
			throw new Exception(JText::_('JLIB_APPLICATION_ERROR_EDITSTATE_NOT_PERMITTED'));
		}

		$style = JTable::getInstance('Style', 'TemplatesTable');

		if (!$style->load((int) $id))
		{
			throw new Exception(JText::_('COM_TEMPLATES_ERROR_STYLE_NOT_FOUND'));
		}

		// Detect disabled extension
		$extension = JTable::getInstance('Extension');

		if ($extension->load(array('enabled' => 0, 'type' => 'template', 'element' => $style->template, 'client_id' => $style->client_id)))
		{
			throw new Exception(JText::_('COM_TEMPLATES_ERROR_SAVE_DISABLED_TEMPLATE'));
		}

		// Reset the home fields for the client_id.
		$query = $db->getQuery(true)
			->update('#__template_styles')
			->set('home = ' .  $db->q('0'))
			->where('client_id = ' . (int) $style->client_id)
			->where('home = ' . $db->q('1'));
		$db->setQuery($query);
		$db->execute();

		// Set the new home style.
		$query = $db->getQuery(true)
			->update('#__template_styles')
			->set('home = ' . $db->q('1'))
			->where('id = ' . (int) $id);
		$db->setQuery($query);
		$db->execute();

		// Clean the cache.
		$this->cleanCache();

		return true;
	}

	/**
	 * Method to unset a template style as default for a language.
	 *
	 * @param   integer  $id  The primary key ID for the style.
	 *
	 * @return  boolean  True if successful.
	 *
	 * @throws	Exception
	 */
	public function unsetHome($id = 0)
	{
		$user = JFactory::getUser();
		$db   = $this->getDbo();

		// Access checks.
		if (!$user->authorise('core.edit.state', 'com_templates'))
		{
			throw new Exception(JText::_('JLIB_APPLICATION_ERROR_EDITSTATE_NOT_PERMITTED'));
		}

		// Lookup the client_id.
		$query = $db->getQuery(true)
			->select('client_id, home')
			->from('#__template_styles')
			->where('id = ' . (int) $id);
		$db->setQuery($query);
		$style = $db->loadObject();

		if (!is_numeric($style->client_id))
		{
			throw new Exception(JText::_('COM_TEMPLATES_ERROR_STYLE_NOT_FOUND'));
		}
		elseif ($style->home == '1')
		{
			throw new Exception(JText::_('COM_TEMPLATES_ERROR_CANNOT_UNSET_DEFAULT_STYLE'));
		}

		// Set the new home style.
		$query = $db->getQuery(true)
			->update('#__template_styles')
			->set('home = ' . $db->q('0'))
			->where('id = ' . (int) $id);
		$db->setQuery($query);
		$db->execute();

		// Clean the cache.
		$this->cleanCache();

		return true;
	}

	/**
	 * Get the necessary data to load an item help screen.
	 *
	 * @return  object  An object with key, url, and local properties for loading the item help screen.
	 *
	 * @since   1.6
	 */
	public function getHelp()
	{
		return (object) array('key' => $this->helpKey, 'url' => $this->helpURL);
	}

	/**
	 * Custom clean cache method
	 *
	 * @param   string   $group     The cache group
	 * @param   integer  $clientId  The ID of the client
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function cleanCache($group = null, $clientId = 0)
	{
		parent::cleanCache('com_templates');
		parent::cleanCache('_system');
	}
}
components/com_templates/models/styles.php000060400000015232152453623450015114 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\String\StringHelper;

/**
 * Methods supporting a list of template style records.
 *
 * @since  1.6
 */
class TemplatesModelStyles extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JControllerLegacy
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'title', 'a.title',
				'template', 'a.template',
				'home', 'a.home',
				'menuitem',
			);
		}

		parent::__construct($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.template', $direction = 'asc')
	{
		// Load the filter state.
		$this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string'));
		$this->setState('filter.template', $this->getUserStateFromRequest($this->context . '.filter.template', 'filter_template', '', 'string'));
		$this->setState('filter.menuitem', $this->getUserStateFromRequest($this->context . '.filter.menuitem', 'filter_menuitem', '', 'cmd'));

		// Special case for the 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);

		// Load the parameters.
		$params = JComponentHelper::getParams('com_templates');
		$this->setState('params', $params);

		// 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('client_id');
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.template');
		$id .= ':' . $this->getState('filter.menuitem');

		return parent::getStoreId($id);
	}

	/**
	 * Build an SQL query to load the list data.
	 *
	 * @return  JDatabaseQuery
	 */
	protected function getListQuery()
	{
		$clientId = (int) $this->getState('client_id');

		// 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.template, a.title, a.home, a.client_id, l.title AS language_title, l.image as image, l.sef AS language_sef'
			)
		);
		$query->from($db->quoteName('#__template_styles', 'a'))
			->where($db->quoteName('a.client_id') . ' = ' . $clientId);

		// Join on menus.
		$query->select('COUNT(m.template_style_id) AS assigned')
			->join('LEFT', $db->quoteName('#__menu', 'm') . ' ON ' . $db->quoteName('m.template_style_id') . ' = ' . $db->quoteName('a.id'))
			->group('a.id, a.template, a.title, a.home, a.client_id, l.title, l.image, e.extension_id, l.sef');

		// Join over the language.
		$query->join('LEFT', $db->quoteName('#__languages', 'l') . ' ON ' . $db->quoteName('l.lang_code') . ' = ' . $db->quoteName('a.home'));

		// Filter by extension enabled.
		$query->select($db->quoteName('extension_id', 'e_id'))
			->join('LEFT', $db->quoteName('#__extensions', 'e') . ' ON e.element = a.template AND e.client_id = a.client_id')
			->where($db->quoteName('e.enabled') . ' = 1')
			->where($db->quoteName('e.type') . ' = ' . $db->quote('template'));

		// Filter by template.
		if ($template = $this->getState('filter.template'))
		{
			$query->where($db->quoteName('a.template') . ' = ' . $db->quote($template));
		}

		// Filter by menuitem.
		$menuItemId = $this->getState('filter.menuitem');

		if ($clientId === 0 && is_numeric($menuItemId))
		{
			// If user selected the templates styles that are not assigned to any page.
			if ((int) $menuItemId === -1)
			{
				// Only custom template styles overrides not assigned to any menu item.
				$query->where($db->quoteName('a.home') . ' = ' . $db->quote(0))
					->where($db->quoteName('m.id') . ' IS NULL');
			}
			// If user selected the templates styles assigned to particular pages.
			else
			{
				// Subquery to get the language of the selected menu item.
				$menuItemLanguageSubQuery = $db->getQuery(true);
				$menuItemLanguageSubQuery->select($db->quoteName('language'))
					->from($db->quoteName('#__menu'))
					->where($db->quoteName('id') . ' = ' . $menuItemId);

				// Subquery to get the language of the selected menu item.
				$templateStylesMenuItemsSubQuery = $db->getQuery(true);
				$templateStylesMenuItemsSubQuery->select($db->quoteName('id'))
					->from($db->quoteName('#__menu'))
					->where($db->quoteName('template_style_id') . ' = ' . $db->quoteName('a.id'));

				// Main query where clause.
				$query->where('(' .
					// Default template style (fallback template style to all menu items).
					$db->quoteName('a.home') . ' = ' . $db->quote(1) . ' OR ' .
					// Default template style for specific language (fallback template style to the selected menu item language).
					$db->quoteName('a.home') . ' IN (' . $menuItemLanguageSubQuery . ') OR ' .
					// Custom template styles override (only if assigned to the selected menu item).
					'(' . $db->quoteName('a.home') . ' = ' . $db->quote(0) . ' AND ' . $menuItemId . ' IN (' . $templateStylesMenuItemsSubQuery . '))' .
					')'
				);
			}
		}

		// Filter by search in title.
		if ($search = $this->getState('filter.search'))
		{
			if (stripos($search, 'id:') === 0)
			{
				$query->where($db->quoteName('a.id') . ' = ' . (int) substr($search, 3));
			}
			else
			{
				$search = $db->quote('%' . StringHelper::strtolower($search) . '%');
				$query->where('(' . ' LOWER(a.template) LIKE ' . $search . ' OR LOWER(a.title) LIKE ' . $search . ')');
			}
		}

		// Add the list ordering clause.
		$query->order($db->escape($this->getState('list.ordering', 'a.template')) . ' ' . $db->escape($this->getState('list.direction', 'ASC')));

		return $query;
	}
}
components/com_templates/models/templates.php000060400000010271152453623450015565 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\String\StringHelper;

/**
 * Methods supporting a list of template extension records.
 *
 * @since  1.6
 */
class TemplatesModelTemplates extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JControllerLegacy
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'name', 'a.name',
				'folder', 'a.folder',
				'element', 'a.element',
				'checked_out', 'a.checked_out',
				'checked_out_time', 'a.checked_out_time',
				'state', 'a.state',
				'enabled', 'a.enabled',
				'ordering', 'a.ordering',
			);
		}

		parent::__construct($config);
	}

	/**
	 * Override parent getItems to add extra XML metadata.
	 *
	 * @return  array
	 *
	 * @since   1.6
	 */
	public function getItems()
	{
		$items = parent::getItems();

		foreach ($items as &$item)
		{
			$client = JApplicationHelper::getClientInfo($item->client_id);
			$item->xmldata = TemplatesHelper::parseXMLTemplateFile($client->path, $item->element);
		}

		return $items;
	}

	/**
	 * 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(
			$this->getState(
				'list.select',
				'a.extension_id, a.name, a.element, a.client_id'
			)
		);
		$query->from($db->quoteName('#__extensions', 'a'))
			->where($db->quoteName('a.client_id') . ' = ' . (int) $this->getState('client_id'))
			->where($db->quoteName('a.enabled') . ' = 1')
			->where($db->quoteName('a.type') . ' = ' . $db->quote('template'));

		// Filter by search in title.
		if ($search = $this->getState('filter.search'))
		{
			if (stripos($search, 'id:') === 0)
			{
				$query->where($db->quoteName('a.id') . ' = ' . (int) substr($search, 3));
			}
			else
			{
				$search = $db->quote('%' . StringHelper::strtolower($search) . '%');
				$query->where('(' . ' LOWER(a.element) LIKE ' . $search . ' OR LOWER(a.name) LIKE ' . $search . ')');
			}
		}

		// Add the list ordering clause.
		$query->order($db->escape($this->getState('list.ordering', 'a.element')) . ' ' . $db->escape($this->getState('list.direction', 'ASC')));

		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('client_id');
		$id .= ':' . $this->getState('filter.search');

		return parent::getStoreId($id);
	}

	/**
	 * 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.element', $direction = 'asc')
	{
		// Load the filter state.
		$this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string'));

		// Special case for the 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);

		// Load the parameters.
		$params = JComponentHelper::getParams('com_templates');
		$this->setState('params', $params);

		// List state information.
		parent::populateState($ordering, $direction);
	}
}
components/com_templates/models/fields/templatename.php000060400000002223152453623450017507 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('TemplatesHelper', JPATH_ADMINISTRATOR . '/components/com_templates/helpers/templates.php');

JFormHelper::loadFieldClass('list');

/**
 * Template Name field.
 *
 * @since  3.5
 */
class JFormFieldTemplateName extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var	   string
	 * @since  3.5
	 */
	protected $type = 'TemplateName';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   1.6
	 */
	public function getOptions()
	{
		// Get the client_id filter from the user state.
		$clientId = JFactory::getApplication()->getUserStateFromRequest('com_templates.styles.client_id', 'client_id', '0', 'string');

		// Get the templates for the selected client_id.
		$options = TemplatesHelper::getTemplateOptions($clientId);

		// Merge into the parent options.
		return array_merge(parent::getOptions(), $options);
	}
}
components/com_templates/models/fields/templatelocation.php000060400000001610152453623450020376 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('TemplatesHelper', JPATH_ADMINISTRATOR . '/components/com_templates/helpers/templates.php');

JFormHelper::loadFieldClass('list');

/**
 * Template Location field.
 *
 * @since  3.5
 */
class JFormFieldTemplateLocation extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var	   string
	 * @since  3.5
	 */
	protected $type = 'TemplateLocation';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   3.5
	 */
	public function getOptions()
	{
		$options = TemplatesHelper::getClientOptions();

		return array_merge(parent::getOptions(), $options);
	}
}
components/com_templates/templates.php000060400000001247152453623450014305 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
JHtml::_('behavior.tabstate');

if (!JFactory::getUser()->authorise('core.manage', 'com_templates'))
{
	throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
}

JLoader::register('TemplatesHelper', __DIR__ . '/helpers/templates.php');

$controller = JControllerLegacy::getInstance('Templates');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
components/com_templates/templates.xml000060400000002015152453623450014310 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_templates</name>
	<author>Joomla! Project</author>
	<creationDate>April 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_TEMPLATES_XML_DESCRIPTION</description>
	<administration>
		<files folder="admin">
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<filename>templates.php</filename>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>tables</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_templates.ini</language>
			<language tag="en-GB">language/en-GB.com_templates.sys.ini</language>
		</languages>
	</administration>
</extension>

components/com_templates/controller.php000060400000003700152453623450014466 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Templates manager master display controller.
 *
 * @since  1.6
 */
class TemplatesController extends JControllerLegacy
{
	/**
	 * @var		string	The default view.
	 * @since   1.6
	 */
	protected $default_view = 'styles';

	/**
	 * 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  TemplatesController  This object to support chaining.
	 *
	 * @since   1.5
	 */
	public function display($cachable = false, $urlparams = false)
	{
		$view   = $this->input->get('view', 'styles');
		$layout = $this->input->get('layout', 'default');
		$id     = $this->input->getInt('id');

		$document = JFactory::getDocument();

		// For JSON requests
		if ($document->getType() == 'json')
		{
			$view = new TemplatesViewStyle;

			// Get/Create the model
			if ($model = new TemplatesModelStyle)
			{
				$model->addTablePath(JPATH_ADMINISTRATOR . '/components/com_templates/tables');

				// Push the model into the view (as default)
				$view->setModel($model, true);
			}

			$view->document = $document;

			return $view->display();
		}

		// Check for edit form.
		if ($view == 'style' && $layout == 'edit' && !$this->checkEditId('com_templates.edit.style', $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_templates&view=styles', false));

			return false;
		}

		return parent::display();
	}
}
components/com_templates/controllers/style.php000060400000007711152453623450016017 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Template style controller class.
 *
 * @since  1.6
 */
class TemplatesControllerStyle extends JControllerForm
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var		string
	 * @since   1.6
	 */
	protected $text_prefix = 'COM_TEMPLATES_STYLE';

	/**
	 * Method to save a template style.
	 *
	 * @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 = null)
	{
		$this->checkToken();

		$document = JFactory::getDocument();

		if ($document->getType() === 'json')
		{
			$app   = JFactory::getApplication();
			$lang  = JFactory::getLanguage();
			$model = $this->getModel();
			$table = $model->getTable();
			$data  = $this->input->post->get('params', array(), 'array');
			$checkin = property_exists($table, 'checked_out');
			$context = $this->option . '.edit.' . $this->context;
			$task = $this->getTask();

			$item = $model->getItem($app->getTemplate(true)->id);

			// Setting received params
			$item->set('params', $data);

			$data = $item->getProperties();
			unset($data['xml']);

			$key = $table->getKeyName();

			// Access check.
			if (!$this->allowSave($data, $key))
			{
				$app->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'), 'error');

				return false;
			}

			JForm::addFormPath(JPATH_ADMINISTRATOR . '/components/com_templates/models/forms');

			// Validate the posted data.
			// Sometimes the form needs some posted data, such as for plugins and modules.
			$form = $model->getForm($data, false);

			if (!$form)
			{
				$app->enqueueMessage($model->getError(), 'error');

				return false;
			}

			// Test whether the data is valid.
			$validData = $model->validate($form, $data);

			if ($validData === 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');
					}
				}

				// Save the data in the session.
				$app->setUserState($context . '.data', $data);

				return false;
			}

			if (!isset($validData['tags']))
			{
				$validData['tags'] = null;
			}

			// Attempt to save the data.
			if (!$model->save($validData))
			{
				// Save the data in the session.
				$app->setUserState($context . '.data', $validData);

				$app->enqueueMessage(JText::sprintf('JLIB_APPLICATION_ERROR_SAVE_FAILED', $model->getError()), 'error');

				return false;
			}

			// Save succeeded, so check-in the record.
			if ($checkin && $model->checkin($validData[$key]) === false)
			{
				// Save the data in the session.
				$app->setUserState($context . '.data', $validData);

				// Check-in failed, so go back to the record and display a notice.
				$app->enqueueMessage(JText::sprintf('JLIB_APPLICATION_ERROR_CHECKIN_FAILED', $model->getError()), 'error');

				return false;
			}

			// Redirect the user and adjust session state
			// Set the record data in the session.
			$recordId = $model->getState($this->context . '.id');
			$this->holdEditId($context, $recordId);
			$app->setUserState($context . '.data', null);
			$model->checkout($recordId);

			// Invoke the postSave method to allow for the child class to access the model.
			$this->postSaveHook($model, $validData);

			return true;
		}
		else
		{
			parent::save($key, $urlVar);
		}
	}
}
components/com_templates/controllers/template.php000060400000057137152453623450016501 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('InstallerModelInstall', JPATH_ADMINISTRATOR . '/components/com_installer/models/install.php');

use Joomla\CMS\Filter\InputFilter;

/**
 * Template style controller class.
 *
 * @since  1.6
 */
class TemplatesControllerTemplate extends JControllerLegacy
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JControllerLegacy
	 * @since   3.2
	 */
	public function __construct($config = array())
	{
		parent::__construct($config);

		// Apply, Save & New, and Save As copy should be standard on forms.
		$this->registerTask('apply', 'save');
	}

	/**
	 * Method for closing the template.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function cancel()
	{
		$this->setRedirect(JRoute::_('index.php?option=com_templates&view=templates', false));
	}

	/**
	 * Method for closing a file.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function close()
	{
		$app  = JFactory::getApplication();
		$file = base64_encode('home');
		$id   = (int) $app->input->get('id', 0, 'int');
		$url  = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
		$this->setRedirect(JRoute::_($url, false));
	}

	/**
	 * Method for copying the template.
	 *
	 * @return  boolean     true on success, false otherwise
	 *
	 * @since   3.2
	 */
	public function copy()
	{
		// Check for request forgeries
		$this->checkToken();

		$app = JFactory::getApplication();
		$this->input->set('installtype', 'folder');
		$newName    = (string) $this->input->get('new_name', null, 'cmd');
		$newNameRaw = (string) $this->input->get('new_name', null, 'string');
		$templateID = (int) $this->input->get('id', 0, 'int');
		$file       = (string) $this->input->get('file', '', 'cmd');

		// Access check.
		if (!$this->allowEdit())
		{
			$app->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'), 'error');

			return false;
		}

		$this->setRedirect('index.php?option=com_templates&view=template&id=' . $templateID . '&file=' . $file);
		$model = $this->getModel('Template', 'TemplatesModel');
		$model->setState('new_name', $newName);
		$model->setState('tmp_prefix', uniqid('template_copy_'));
		$model->setState('to_path', JFactory::getConfig()->get('tmp_path') . '/' . $model->getState('tmp_prefix'));

		// Process only if we have a new name entered
		if (strlen($newName) > 0)
		{
			if (!JFactory::getUser()->authorise('core.create', 'com_templates'))
			{
				// User is not authorised to delete
				$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_CREATE_NOT_PERMITTED'), 'error');

				return false;
			}

			// Set FTP credentials, if given
			JClientHelper::setCredentialsFromRequest('ftp');

			// Check that new name is valid
			if (($newNameRaw !== null) && ($newName !== $newNameRaw))
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_INVALID_TEMPLATE_NAME'), 'error');

				return false;
			}

			// Check that new name doesn't already exist
			if (!$model->checkNewName())
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_DUPLICATE_TEMPLATE_NAME'), 'error');

				return false;
			}

			// Check that from name does exist and get the folder name
			$fromName = $model->getFromName();

			if (!$fromName)
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_INVALID_FROM_NAME'), 'error');

				return false;
			}

			// Call model's copy method
			if (!$model->copy())
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_COULD_NOT_COPY'), 'error');

				return false;
			}

			// Call installation model
			$this->input->set('install_directory', JFactory::getConfig()->get('tmp_path') . '/' . $model->getState('tmp_prefix'));
			$installModel = $this->getModel('Install', 'InstallerModel');
			JFactory::getLanguage()->load('com_installer');

			if (!$installModel->install())
			{
				$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_COULD_NOT_INSTALL'), 'error');

				return false;
			}

			$this->setMessage(JText::sprintf('COM_TEMPLATES_COPY_SUCCESS', $newName));
			$model->cleanup();

			return true;
		}
	}

	/**
	 * 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 (note, the empty array is atypical compared to other models).
	 *
	 * @return  JModelLegacy  The model.
	 *
	 * @since   3.2
	 */
	public function getModel($name = 'Template', $prefix = 'TemplatesModel', $config = array())
	{
		return parent::getModel($name, $prefix, $config);
	}

	/**
	 * Method to check if the user can modify template files
	 *
	 * @return  boolean
	 *
	 * @since   3.2
	 */
	protected function allowEdit()
	{
		return JFactory::getUser()->authorise('core.admin');
	}

	/**
	 * Saves a template source file.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function save()
	{
		// Check for request forgeries.
		$this->checkToken();

		$app          = JFactory::getApplication();
		$data         = $this->input->post->get('jform', array(), 'array');
		$task         = $this->getTask();
		$model        = $this->getModel();
		$fileName     = (string) $app->input->get('file', '', 'cmd');
		$explodeArray = explode(':', base64_decode($fileName));

		// Access check.
		if (!$this->allowEdit())
		{
			$app->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'), 'error');

			return false;
		}

		// Match the stored id's with the submitted.
		if (empty($data['extension_id']) || empty($data['filename']))
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_SOURCE_ID_FILENAME_MISMATCH'), 'error');

			return false;
		}
		elseif ($data['extension_id'] != $model->getState('extension.id'))
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_SOURCE_ID_FILENAME_MISMATCH'), 'error');

			return false;
		}
		elseif ($data['filename'] != end($explodeArray))
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_SOURCE_ID_FILENAME_MISMATCH'), 'error');

			return false;
		}

		// Validate the posted data.
		$form = $model->getForm();

		if (!$form)
		{
			$app->enqueueMessage($model->getError(), 'error');

			return false;
		}

		$data = $model->validate($form, $data);

		// 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(), 'warning');
				}
				else
				{
					$app->enqueueMessage($errors[$i], 'warning');
				}
			}

			// Redirect back to the edit screen.
			$url = 'index.php?option=com_templates&view=template&id=' . $model->getState('extension.id') . '&file=' . $fileName;
			$this->setRedirect(JRoute::_($url, false));

			return false;
		}

		// Attempt to save the data.
		if (!$model->save($data))
		{
			// Redirect back to the edit screen.
			$this->setMessage(JText::sprintf('JERROR_SAVE_FAILED', $model->getError()), 'warning');
			$url = 'index.php?option=com_templates&view=template&id=' . $model->getState('extension.id') . '&file=' . $fileName;
			$this->setRedirect(JRoute::_($url, false));

			return false;
		}

		$this->setMessage(JText::_('COM_TEMPLATES_FILE_SAVE_SUCCESS'));

		// Redirect the user based on the chosen task.
		switch ($task)
		{
			case 'apply':
				// Redirect back to the edit screen.
				$url = 'index.php?option=com_templates&view=template&id=' . $model->getState('extension.id') . '&file=' . $fileName;
				$this->setRedirect(JRoute::_($url, false));
				break;

			default:
				// Redirect to the list screen.
				$file = base64_encode('home');
				$id   = (int) $app->input->get('id', 0, 'int');
				$url  = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
				$this->setRedirect(JRoute::_($url, false));
				break;
		}
	}

	/**
	 * Method for creating override.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function overrides()
	{
		// Check for request forgeries.
		$this->checkToken('get');

		$app      = JFactory::getApplication();
		$model    = $this->getModel();
		$file     = (string) $app->input->get('file', '', 'cmd');
		$override = (string) InputFilter::getInstance(array(), array(), 1, 1)->clean(base64_decode($app->input->get('folder', '', 'base64')), 'path');
		$id       = (int) $app->input->get('id', 0, 'int');

		// Access check.
		if (!$this->allowEdit())
		{
			$app->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'), 'error');

			return false;
		}


		if ($model->createOverride($override))
		{
			$this->setMessage(JText::_('COM_TEMPLATES_OVERRIDE_SUCCESS'));
		}

		// Redirect back to the edit screen.
		$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
		$this->setRedirect(JRoute::_($url, false));
	}

	/**
	 * Method for compiling LESS.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function less()
	{
		// Check for request forgeries
		$this->checkToken();

		$app   = JFactory::getApplication();
		$model = $this->getModel();
		$id    = (int) $app->input->get('id', 0, 'int');
		$file  = (string) $app->input->get('file', '', 'cmd');

		// Access check.
		if (!$this->allowEdit())
		{
			$app->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'), 'error');

			return false;
		}

		if ($model->compileLess($file))
		{
			$this->setMessage(JText::_('COM_TEMPLATES_COMPILE_SUCCESS'));
		}
		else
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_COMPILE_ERROR'), 'error');
		}

		$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
		$this->setRedirect(JRoute::_($url, false));
	}

	/**
	 * Method for deleting a file.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function delete()
	{
		// Check for request forgeries
		$this->checkToken();

		$app   = JFactory::getApplication();
		$model = $this->getModel();
		$id    = (int) $app->input->get('id', 0, 'int');
		$file  = (string) $app->input->get('file', '', 'cmd');

		// Access check.
		if (!$this->allowEdit())
		{
			$app->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'), 'error');

			return false;
		}

		if (base64_decode(urldecode($file)) == '/index.php')
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_INDEX_DELETE'), 'warning');
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}

		elseif ($model->deleteFile($file))
		{
			$this->setMessage(JText::_('COM_TEMPLATES_FILE_DELETE_SUCCESS'));
			$file = base64_encode('home');
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
		else
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_FILE_DELETE'), 'error');
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
	}

	/**
	 * Method for creating a new file.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function createFile()
	{
		// Check for request forgeries
		$this->checkToken();

		$app      = JFactory::getApplication();
		$model    = $this->getModel();
		$id       = (int) $app->input->get('id', 0, 'int');
		$file     = (string) $app->input->get('file', '', 'cmd');
		$name     = (string) $app->input->get('name', '', 'cmd');
		$location = (string) InputFilter::getinstance(array(), array(), 1, 1)->clean(base64_decode($app->input->get('address', '', 'base64')), 'path');
		$type     = (string) $app->input->get('type', '', 'cmd');

		// Access check.
		if (!$this->allowEdit())
		{
			$app->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'), 'error');

			return false;
		}

		if ($type == 'null')
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_INVALID_FILE_TYPE'), 'error');
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
		elseif (!preg_match('/^[a-zA-Z0-9-_]+$/', $name))
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_INVALID_FILE_NAME'), 'error');
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
		elseif ($model->createFile($name, $type, $location))
		{
			$this->setMessage(JText::_('COM_TEMPLATES_FILE_CREATE_SUCCESS'));
			$file = urlencode(base64_encode($location . '/' . $name . '.' . $type));
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
		else
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_FILE_CREATE'), 'error');
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
	}

	/**
	 * Method for uploading a file.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function uploadFile()
	{
		// Check for request forgeries
		$this->checkToken();

		$app      = JFactory::getApplication();
		$model    = $this->getModel();
		$id       = (int) $app->input->get('id', 0, 'int');
		$file     = (string) $app->input->get('file', '', 'cmd');
		$upload   = $app->input->files->get('files');
		$location = (string) InputFilter::getinstance(array(), array(), 1, 1)->clean(base64_decode($app->input->get('address', '', 'base64')), 'path');

		// Access check.
		if (!$this->allowEdit())
		{
			$app->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'), 'error');

			return false;
		}

		if ($return = $model->uploadFile($upload, $location))
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_UPLOAD_SUCCESS') . $upload['name']);
			$redirect = base64_encode($return);
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $redirect;
			$this->setRedirect(JRoute::_($url, false));
		}
		else
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_FILE_UPLOAD'), 'error');
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
	}

	/**
	 * Method for creating a new folder.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function createFolder()
	{
		// Check for request forgeries
		$this->checkToken();

		$app      = JFactory::getApplication();
		$model    = $this->getModel();
		$id       = (int) $app->input->get('id', 0, 'int');
		$file     = (string) $app->input->get('file', '', 'cmd');
		$name     = $app->input->get('name');
		$location = (string) InputFilter::getinstance(array(), array(), 1, 1)->clean(base64_decode($app->input->get('address', '', 'base64')), 'path');

		// Access check.
		if (!$this->allowEdit())
		{
			$app->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'), 'error');

			return false;
		}

		if (!preg_match('/^[a-zA-Z0-9-_.]+$/', $name))
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_INVALID_FOLDER_NAME'), 'error');
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
		elseif ($model->createFolder($name, $location))
		{
			$this->setMessage(JText::_('COM_TEMPLATES_FOLDER_CREATE_SUCCESS'));
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
		else
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_FOLDER_CREATE'), 'error');
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
	}

	/**
	 * Method for deleting a folder.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function deleteFolder()
	{
		// Check for request forgeries
		$this->checkToken();

		$app      = JFactory::getApplication();
		$model    = $this->getModel();
		$id       = (int) $app->input->get('id', 0, 'int');
		$file     = (string) $app->input->get('file', '', 'cmd');
		$location = (string) InputFilter::getinstance(array(), array(), 1, 1)->clean(base64_decode($app->input->get('address', '', 'base64')), 'path');

		// Access check.
		if (!$this->allowEdit())
		{
			$app->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'), 'error');

			return false;
		}

		if (empty($location))
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_ROOT_DELETE'), 'warning');
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
		elseif ($model->deleteFolder($location))
		{
			$this->setMessage(JText::_('COM_TEMPLATES_FOLDER_DELETE_SUCCESS'));

			if (stristr(base64_decode($file), $location) != false)
			{
				$file = base64_encode('home');
			}

			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
		else
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_FOLDER_DELETE_ERROR'), 'error');
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
	}

	/**
	 * Method for renaming a file.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function renameFile()
	{
		// Check for request forgeries
		$this->checkToken();

		$app     = JFactory::getApplication();
		$model   = $this->getModel();
		$id      = (int) $app->input->get('id', 0, 'int');
		$file    = (string) $app->input->get('file', '', 'cmd');
		$newName = $app->input->get('new_name');

		// Access check.
		if (!$this->allowEdit())
		{
			$app->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'), 'error');

			return false;
		}

		if (base64_decode(urldecode($file)) == '/index.php')
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_RENAME_INDEX'), 'warning');
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
		elseif (!preg_match('/^[a-zA-Z0-9-_]+$/', $newName))
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_INVALID_FILE_NAME'), 'error');
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
		elseif ($rename = $model->renameFile($file, $newName))
		{
			$this->setMessage(JText::_('COM_TEMPLATES_FILE_RENAME_SUCCESS'));
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $rename;
			$this->setRedirect(JRoute::_($url, false));
		}
		else
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_FILE_RENAME'), 'error');
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
	}

	/**
	 * Method for cropping an image.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function cropImage()
	{
		// Check for request forgeries
		$this->checkToken();

		$app   = JFactory::getApplication();
		$id    = (int) $app->input->get('id', 0, 'int');
		$file  = (string) $app->input->get('file', '', 'cmd');
		$x     = $app->input->get('x');
		$y     = $app->input->get('y');
		$w     = $app->input->get('w');
		$h     = $app->input->get('h');
		$model = $this->getModel();

		// Access check.
		if (!$this->allowEdit())
		{
			$app->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'), 'error');

			return false;
		}

		if (empty($w) && empty($h) && empty($x) && empty($y))
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_CROP_AREA_ERROR'), 'error');
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
		elseif ($model->cropImage($file, $w, $h, $x, $y))
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_CROP_SUCCESS'));
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
		else
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_CROP_ERROR'), 'error');
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
	}

	/**
	 * Method for resizing an image.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function resizeImage()
	{
		// Check for request forgeries
		$this->checkToken();

		$app    = JFactory::getApplication();
		$id     = (int) $app->input->get('id', 0, 'int');
		$file   = (string) $app->input->get('file', '', 'cmd');
		$width  = $app->input->get('width');
		$height = $app->input->get('height');
		$model  = $this->getModel();

		// Access check.
		if (!$this->allowEdit())
		{
			$app->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'), 'error');

			return false;
		}

		if ($model->resizeImage($file, $width, $height))
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_RESIZE_SUCCESS'));
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
		else
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_RESIZE_ERROR'), 'error');
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
	}

	/**
	 * Method for copying a file.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function copyFile()
	{
		// Check for request forgeries
		$this->checkToken();

		$app      = JFactory::getApplication();
		$id       = (int) $app->input->get('id', 0, 'int');
		$file     = (string) $app->input->get('file', '', 'cmd');
		$newName  = $app->input->get('new_name');
		$location = (string) InputFilter::getinstance(array(), array(), 1, 1)->clean(base64_decode($app->input->get('address', '', 'base64')), 'path');
		$model    = $this->getModel();

		// Access check.
		if (!$this->allowEdit())
		{
			$app->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'), 'error');

			return false;
		}

		if (!preg_match('/^[a-zA-Z0-9-_]+$/', $newName))
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_INVALID_FILE_NAME'), 'error');
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
		elseif ($model->copyFile($newName, $location, $file))
		{
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
		else
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_COPY_FAIL'), 'error');
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
	}

	/**
	 * Method for extracting an archive file.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function extractArchive()
	{
		// Check for request forgeries
		$this->checkToken();

		$app   = JFactory::getApplication();
		$id    = (int) $app->input->get('id', 0, 'int');
		$file  = (string) $app->input->get('file', '', 'cmd');
		$model = $this->getModel();

		// Access check.
		if (!$this->allowEdit())
		{
			$app->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'), 'error');

			return false;
		}

		if ($model->extractArchive($file))
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_ARCHIVE_EXTRACT_SUCCESS'));
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
		else
		{
			$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_ARCHIVE_EXTRACT_FAIL'), 'error');
			$url = 'index.php?option=com_templates&view=template&id=' . $id . '&file=' . $file;
			$this->setRedirect(JRoute::_($url, false));
		}
	}
}
components/com_templates/controllers/styles.php000060400000006156152453623450016204 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Template styles list controller class.
 *
 * @since  1.6
 */
class TemplatesControllerStyles extends JControllerAdmin
{
	/**
	 * Method to clone and existing template style.
	 *
	 * @return  void
	 */
	public function duplicate()
	{
		// Check for request forgeries
		$this->checkToken();

		$pks = (array) $this->input->post->get('cid', array(), 'int');

		// Remove zero values resulting from input filter
		$pks = array_filter($pks);

		try
		{
			if (empty($pks))
			{
				throw new Exception(JText::_('COM_TEMPLATES_NO_TEMPLATE_SELECTED'));
			}

			$model = $this->getModel();
			$model->duplicate($pks);
			$this->setMessage(JText::_('COM_TEMPLATES_SUCCESS_DUPLICATED'));
		}
		catch (Exception $e)
		{
			JError::raiseWarning(500, $e->getMessage());
		}

		$this->setRedirect('index.php?option=com_templates&view=styles');
	}

	/**
	 * Proxy for getModel.
	 *
	 * @param   string  $name    The model name. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JModelLegacy
	 *
	 * @since   1.6
	 */
	public function getModel($name = 'Style', $prefix = 'TemplatesModel', $config = array())
	{
		return parent::getModel($name, $prefix, array('ignore_request' => true));
	}

	/**
	 * Method to set the home template for a client.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function setDefault()
	{
		// Check for request forgeries
		$this->checkToken();

		$pks = (array) $this->input->post->get('cid', array(), 'int');

		// Remove zero values resulting from input filter
		$pks = array_filter($pks);

		try
		{
			if (empty($pks))
			{
				throw new Exception(JText::_('COM_TEMPLATES_NO_TEMPLATE_SELECTED'));
			}

			// Pop off the first element.
			$id = array_shift($pks);
			$model = $this->getModel();
			$model->setHome($id);
			$this->setMessage(JText::_('COM_TEMPLATES_SUCCESS_HOME_SET'));
		}
		catch (Exception $e)
		{
			JError::raiseWarning(500, $e->getMessage());
		}

		$this->setRedirect('index.php?option=com_templates&view=styles');
	}

	/**
	 * Method to unset the default template for a client and for a language
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function unsetDefault()
	{
		// Check for request forgeries
		$this->checkToken('request');

		$pks = (array) $this->input->get->get('cid', array(), 'int');

		// Remove zero values resulting from input filter
		$pks = array_filter($pks);

		try
		{
			if (empty($pks))
			{
				throw new Exception(JText::_('COM_TEMPLATES_NO_TEMPLATE_SELECTED'));
			}

			// Pop off the first element.
			$id = array_shift($pks);
			$model = $this->getModel();
			$model->unsetHome($id);
			$this->setMessage(JText::_('COM_TEMPLATES_SUCCESS_HOME_UNSET'));
		}
		catch (Exception $e)
		{
			JError::raiseWarning(500, $e->getMessage());
		}

		$this->setRedirect('index.php?option=com_templates&view=styles');
	}
}
components/com_templates/config.xml000060400000003552152453623450013566 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset
		name="templates"
		label="COM_TEMPLATES_SUBMENU_TEMPLATES"
		description="COM_TEMPLATES_CONFIG_FIELDSET_DESC">

		<field
			name="template_positions_display"
			type="radio"
			label="COM_TEMPLATES_CONFIG_POSITIONS_LABEL"
			description="COM_TEMPLATES_CONFIG_POSITIONS_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JENABLED</option>
			<option value="0">JDISABLED</option>
		</field>

		<field
			name="upload_limit" 
			type="number"
			label="COM_TEMPLATES_CONFIG_UPLOAD_LABEL"
			description="COM_TEMPLATES_CONFIG_UPLOAD_DESC"
			default="10"
			extension="com_templates"
		/>

		<field
			name="warning" 
			type="note"
			label="COM_TEMPLATES_CONFIG_SUPPORTED_LABEL"
			description="COM_TEMPLATES_CONFIG_SUPPORTED_DESC"
		/>

		<field
			name="image_formats" 
			type="text"
			label="COM_TEMPLATES_CONFIG_IMAGE_LABEL"
			description="COM_TEMPLATES_CONFIG_IMAGE_DESC"
			default="gif,bmp,jpg,jpeg"
			extension="com_templates"
		/>

		<field
			name="source_formats" 
			type="text"
			label="COM_TEMPLATES_CONFIG_SOURCE_LABEL"
			description="COM_TEMPLATES_CONFIG_SOURCE_DESC"
			default="txt,less,ini,xml,js,php,css,sass,scss"
			extension="com_templates"
		/>

		<field
			name="font_formats" 
			type="text"
			label="COM_TEMPLATES_CONFIG_FONT_LABEL"
			description="COM_TEMPLATES_CONFIG_FONT_DESC"
			default="woff,ttf,otf"
			extension="com_templates"
		/>

		<field
			name="compressed_formats" 
			type="hidden"
			default="zip"
			extension="com_templates"
		/>
	</fieldset>

	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
		>
		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			filter="rules"
			validate="rules"
			component="com_templates"
			section="component"
		/>
	</fieldset>
</config>
components/com_templates/access.xml000060400000001466152453623450013564 0ustar00<?xml version="1.0" encoding="utf-8" ?>
<access component="com_templates">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.options" title="JACTION_OPTIONS" description="JACTION_OPTIONS_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
	</section>
</access>
components/com_templates/helpers/html/templates.php000060400000005324152453623450016713 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * JHtml helper class.
 *
 * @since  1.6
 */
class JHtmlTemplates
{
	/**
	 * Display the thumb for the template.
	 *
	 * @param   string   $template  The name of the template.
	 * @param   integer  $clientId  The application client ID the template applies to
	 *
	 * @return  string  The html string
	 *
	 * @since   1.6
	 */
	public static function thumb($template, $clientId = 0)
	{
		$client = JApplicationHelper::getClientInfo($clientId);
		$basePath = $client->path . '/templates/' . $template;
		$thumb = $basePath . '/template_thumbnail.png';
		$preview = $basePath . '/template_preview.png';
		$html = '';

		if (file_exists($thumb))
		{
			JHtml::_('bootstrap.tooltip');

			$clientPath = ($clientId == 0) ? '' : 'administrator/';
			$thumb = $clientPath . 'templates/' . $template . '/template_thumbnail.png';
			$html = JHtml::_('image', $thumb, JText::_('COM_TEMPLATES_PREVIEW'));

			if (file_exists($preview))
			{
				$html = '<button type="button" data-target="#' . $template . '-Modal" class="thumbnail pull-left hasTooltip" data-toggle="modal"'
					. ' title="' . JHtml::_('tooltipText', 'COM_TEMPLATES_CLICK_TO_ENLARGE') . '">' . $html . '</button>';
			}
		}

		return $html;
	}

	/**
	 * Renders the html for the modal linked to thumb.
	 *
	 * @param   string   $template  The name of the template.
	 * @param   integer  $clientId  The application client ID the template applies to
	 *
	 * @return  string  The html string
	 *
	 * @since   3.4
	 */
	public static function thumbModal($template, $clientId = 0)
	{
		$client = JApplicationHelper::getClientInfo($clientId);
		$basePath = $client->path . '/templates/' . $template;
		$baseUrl = ($clientId == 0) ? JUri::root(true) : JUri::root(true) . '/administrator';
		$thumb = $basePath . '/template_thumbnail.png';
		$preview = $basePath . '/template_preview.png';
		$html = '';

		if (file_exists($thumb))
		{
			if (file_exists($preview))
			{
				$preview = $baseUrl . '/templates/' . $template . '/template_preview.png';
				$footer = '<button type="button" class="btn" data-dismiss="modal">'
					. JText::_('JTOOLBAR_CLOSE') . '</button>';

				$html .= JHtml::_(
					'bootstrap.renderModal',
					$template . '-Modal',
					array(
						'title'  => JText::_('COM_TEMPLATES_BUTTON_PREVIEW'),
						'height' => '500px',
						'width'  => '800px',
						'footer' => $footer,
					),
					$body = '<div><img src="' . $preview . '" style="max-width:100%" alt="' . $template . '"></div>'
				);
			}
		}

		return $html;
	}
}
components/com_templates/helpers/template.php000060400000012414152453623450015562 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Template Helper class.
 *
 * @since  3.2
 */
abstract class TemplateHelper
{
	/**
	 * Checks if the file is an image
	 *
	 * @param   string  $fileName  The filename
	 *
	 * @return  boolean
	 *
	 * @since   3.2
	 */
	public static function getTypeIcon($fileName)
	{
		// Get file extension
		return strtolower(substr($fileName, strrpos($fileName, '.') + 1));
	}

	/**
	 * Checks if the file can be uploaded
	 *
	 * @param   array   $file  File information
	 * @param   string  $err   An error message to be returned
	 *
	 * @return  boolean
	 *
	 * @since   3.2
	 */
	public static function canUpload($file, $err = '')
	{
		$params = JComponentHelper::getParams('com_templates');

		if (empty($file['name']))
		{
			$app = JFactory::getApplication();
			$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_UPLOAD_INPUT'), 'error');

			return false;
		}

		// Media file names should never have executable extensions buried in them.
		$executable = array(
			'exe', 'phtml','java', 'perl', 'py', 'asp','dll', 'go', 'jar',
			'ade', 'adp', 'bat', 'chm', 'cmd', 'com', 'cpl', 'hta', 'ins', 'isp',
			'jse', 'lib', 'mde', 'msc', 'msp', 'mst', 'pif', 'scr', 'sct', 'shb',
			'sys', 'vb', 'vbe', 'vbs', 'vxd', 'wsc', 'wsf', 'wsh'
		);
		$explodedFileName = explode('.', $file['name']);

		if (count($explodedFileName) > 2)
		{
			foreach ($executable as $extensionName)
			{
				if (in_array($extensionName, $explodedFileName))
				{
					$app = JFactory::getApplication();
					$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_EXECUTABLE'), 'error');

					return false;
				}
			}
		}

		jimport('joomla.filesystem.file');

		if ($file['name'] !== JFile::makeSafe($file['name']) || preg_match('/\s/', JFile::makeSafe($file['name'])))
		{
			$app = JFactory::getApplication();
			$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_WARNFILENAME'), 'error');

			return false;
		}

		$format = strtolower(JFile::getExt($file['name']));

		$imageTypes   = explode(',', $params->get('image_formats'));
		$sourceTypes  = explode(',', $params->get('source_formats'));
		$fontTypes    = explode(',', $params->get('font_formats'));
		$archiveTypes = explode(',', $params->get('compressed_formats'));

		$allowable = array_merge($imageTypes, $sourceTypes, $fontTypes, $archiveTypes);

		if ($format == '' || $format == false || (!in_array($format, $allowable)))
		{
			$app = JFactory::getApplication();
			$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_WARNFILETYPE'), 'error');

			return false;
		}

		if (in_array($format, $archiveTypes))
		{
			$zip = new ZipArchive;

			if ($zip->open($file['tmp_name']) === true)
			{
				for ($i = 0; $i < $zip->numFiles; $i++)
				{
					$entry     = $zip->getNameIndex($i);
					$endString = substr($entry, -1);

					if ($endString != DIRECTORY_SEPARATOR)
					{
						$explodeArray = explode('.', $entry);
						$ext          = end($explodeArray);

						if (!in_array($ext, $allowable))
						{
							$app = JFactory::getApplication();
							$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_UNSUPPORTED_ARCHIVE'), 'error');

							return false;
						}
					}
				}
			}
			else
			{
				$app = JFactory::getApplication();
				$app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_ARCHIVE_OPEN_FAIL'), 'error');

				return false;
			}
		}

		// Max upload size set to 2 MB for Template Manager
		$maxSize = (int) ($params->get('upload_limit') * 1024 * 1024);

		if ($maxSize > 0 && (int) $file['size'] > $maxSize)
		{
			$app = JFactory::getApplication();
			$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_WARNFILETOOLARGE'), 'error');

			return false;
		}

		$xss_check = file_get_contents($file['tmp_name'], false, null, -1, 256);
		$html_tags = array(
			'abbr', 'acronym', 'address', 'applet', 'area', 'audioscope', 'base', 'basefont', 'bdo', 'bgsound', 'big', 'blackface', 'blink', 'blockquote',
			'body', 'bq', 'br', 'button', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'comment', 'custom', 'dd', 'del', 'dfn', 'dir', 'div',
			'dl', 'dt', 'em', 'embed', 'fieldset', 'fn', 'font', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'hr', 'html',
			'iframe', 'ilayer', 'img', 'input', 'ins', 'isindex', 'keygen', 'kbd', 'label', 'layer', 'legend', 'li', 'limittext', 'link', 'listing',
			'map', 'marquee', 'menu', 'meta', 'multicol', 'nobr', 'noembed', 'noframes', 'noscript', 'nosmartquotes', 'object', 'ol', 'optgroup', 'option',
			'param', 'plaintext', 'pre', 'rt', 'ruby', 's', 'samp', 'script', 'select', 'server', 'shadow', 'sidebar', 'small', 'spacer', 'span', 'strike',
			'strong', 'style', 'sub', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'tt', 'ul', 'var', 'wbr', 'xml',
			'xmp', '!DOCTYPE', '!--'
		);

		foreach ($html_tags as $tag)
		{
			// A tag is '<tagname ', so we need to add < and a space or '<tagname>'
			if (stristr($xss_check, '<' . $tag . ' ') || stristr($xss_check, '<' . $tag . '>'))
			{
				$app = JFactory::getApplication();
				$app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_WARNIEXSS'), 'error');

				return false;
			}
		}

		return true;
	}
}
components/com_templates/helpers/templates.php000060400000010551152453623450015745 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Templates component helper.
 *
 * @since  1.6
 */
class TemplatesHelper
{
	/**
	 * Configure the Linkbar.
	 *
	 * @param   string  $vName  The name of the active view.
	 *
	 * @return  void
	 */
	public static function addSubmenu($vName)
	{
		JHtmlSidebar::addEntry(
			JText::_('COM_TEMPLATES_SUBMENU_STYLES'),
			'index.php?option=com_templates&view=styles',
			$vName == 'styles'
		);
		JHtmlSidebar::addEntry(
			JText::_('COM_TEMPLATES_SUBMENU_TEMPLATES'),
			'index.php?option=com_templates&view=templates',
			$vName == 'templates'
		);
	}

	/**
	 * Gets a list of the actions that can be performed.
	 *
	 * @return  JObject
	 *
	 * @deprecated  3.2  Use JHelperContent::getActions() instead
	 */
	public static function getActions()
	{
		// 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('com_templates');
	}

	/**
	 * Get a list of filter options for the application clients.
	 *
	 * @return  array  An array of JHtmlOption elements.
	 */
	public static function getClientOptions()
	{
		// Build the filter options.
		$options = array();
		$options[] = JHtml::_('select.option', '0', JText::_('JSITE'));
		$options[] = JHtml::_('select.option', '1', JText::_('JADMINISTRATOR'));

		return $options;
	}

	/**
	 * Get a list of filter options for the templates with styles.
	 *
	 * @param   mixed  $clientId  The CMS client id (0:site | 1:administrator) or '*' for all.
	 *
	 * @return  array  An array of JHtmlOption elements.
	 */
	public static function getTemplateOptions($clientId = '*')
	{
		// Build the filter options.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true);

		$query->select($db->quoteName('element', 'value'))
			->select($db->quoteName('name', 'text'))
			->select($db->quoteName('extension_id', 'e_id'))
			->from($db->quoteName('#__extensions'))
			->where($db->quoteName('type') . ' = ' . $db->quote('template'))
			->where($db->quoteName('enabled') . ' = 1')
			->order($db->quoteName('client_id') . ' ASC')
			->order($db->quoteName('name') . ' ASC');

		if ($clientId != '*')
		{
			$query->where($db->quoteName('client_id') . ' = ' . (int) $clientId);
		}

		$db->setQuery($query);
		$options = $db->loadObjectList();

		return $options;
	}

	/**
	 * TODO
	 *
	 * @param   string  $templateBaseDir  TODO
	 * @param   string  $templateDir      TODO
	 *
	 * @return  boolean|JObject
	 */
	public static function parseXMLTemplateFile($templateBaseDir, $templateDir)
	{
		$data = new JObject;

		// Check of the xml file exists
		$filePath = JPath::clean($templateBaseDir . '/templates/' . $templateDir . '/templateDetails.xml');

		if (is_file($filePath))
		{
			$xml = JInstaller::parseXMLInstallFile($filePath);

			if ($xml['type'] != 'template')
			{
				return false;
			}

			foreach ($xml as $key => $value)
			{
				$data->set($key, $value);
			}
		}

		return $data;
	}

	/**
	 * TODO
	 *
	 * @param   integer  $clientId     TODO
	 * @param   string   $templateDir  TODO
	 *
	 * @return  boolean|array
	 *
	 * @since   3.0
	 */
	public static function getPositions($clientId, $templateDir)
	{
		$positions = array();

		$templateBaseDir = $clientId ? JPATH_ADMINISTRATOR : JPATH_SITE;
		$filePath = JPath::clean($templateBaseDir . '/templates/' . $templateDir . '/templateDetails.xml');

		if (is_file($filePath))
		{
			// Read the file to see if it's a valid component XML file
			$xml = simplexml_load_file($filePath);

			if (!$xml)
			{
				return false;
			}

			// Check for a valid XML root tag.

			// Extensions use 'extension' as the root tag.  Languages use 'metafile' instead

			if ($xml->getName() != 'extension' && $xml->getName() != 'metafile')
			{
				unset($xml);

				return false;
			}

			$positions = (array) $xml->positions;

			if (isset($positions['position']))
			{
				$positions = (array) $positions['position'];
			}
			else
			{
				$positions = array();
			}
		}

		return $positions;
	}
}
components/com_login/controller.php000060400000005316152453623450013605 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_login
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Login Controller.
 *
 * @since  1.5
 */
class LoginController extends JControllerLegacy
{
	/**
	 * 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  JController		This object to support chaining.
	 *
	 * @since   1.5
	 */
	public function display($cachable = false, $urlparams = false)
	{
		/*
		 * Special treatment is required for this component, as this view may be called
		 * after a session timeout. We must reset the view and layout prior to display
		 * otherwise an error will occur.
		 */
		$this->input->set('view', 'login');
		$this->input->set('layout', 'default');

		// For non-html formats we do not have login view, so just display 403 instead
		if ($this->input->get('format', 'html') !== 'html')
		{
			throw new RuntimeException(JText::_('JERROR_ALERTNOAUTHOR'), 403);
		}

		parent::display();
	}

	/**
	 * Method to log in a user.
	 *
	 * @return  void
	 */
	public function login()
	{
		// Check for request forgeries.
		$this->checkToken('request');

		$app = JFactory::getApplication();

		$model = $this->getModel('login');
		$credentials = $model->getState('credentials');
		$return = $model->getState('return');

		$result = $app->login($credentials, array('action' => 'core.login.admin'));

		if ($result && !($result instanceof Exception))
		{
			// Only redirect to an internal URL.
			if (JUri::isInternal($return))
			{
				// If &tmpl=component - redirect to index.php
				if (strpos($return, 'tmpl=component') === false)
				{
					$app->redirect($return);
				}
				else
				{
					$app->redirect('index.php');
				}
			}
		}

		$this->display();
	}

	/**
	 * Method to log out a user.
	 *
	 * @return  void
	 */
	public function logout()
	{
		$this->checkToken('request');

		$app = JFactory::getApplication();

		$userid = $this->input->getInt('uid', null);

		if ($app->get('shared_session', '0'))
		{
			$clientid = null;
		}
		else
		{
			$clientid = $userid ? 0 : 1;
		}

		$options = array(
			'clientid' => $clientid,
		);

		$result = $app->logout($userid, $options);

		if (!($result instanceof Exception))
		{
			$model  = $this->getModel('login');
			$return = $model->getState('return');

			// Only redirect to an internal URL.
			if (JUri::isInternal($return))
			{
				$app->redirect($return);
			}
		}

		parent::display();
	}
}
components/com_login/login.php000060400000001025152453623450012523 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_login
 *
 * @copyright   (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$input = JFactory::getApplication()->input;
$task = $input->get('task');

if ($task != 'login' && $task != 'logout')
{
	$input->set('task', '');
	$task = '';
}

$controller = JControllerLegacy::getInstance('Login');
$controller->execute($task);
$controller->redirect();
components/com_login/login.xml000060400000001577152453623450012550 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_login</name>
	<author>Joomla! Project</author>
	<creationDate>April 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_LOGIN_XML_DESCRIPTION</description>
	<administration>
		<files folder="admin">
			<filename>controller.php</filename>
			<filename>login.php</filename>
			<folder>views</folder>
			<folder>models</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_login.ini</language>
			<language tag="en-GB">language/en-GB.com_login.sys.ini</language>
		</languages>
	</administration>
</extension>

components/com_login/models/login.php000060400000010640152453623450014011 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_login
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Login Model
 *
 * @since  1.5
 */
class LoginModelLogin extends JModelLegacy
{
	/**
	 * 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()
	{
		$input = JFactory::getApplication()->input->getInputForRequestMethod();

		$credentials = array(
			'username'  => $input->get('username', '', 'USERNAME'),
			'password'  => $input->get('passwd', '', 'RAW'),
			'secretkey' => $input->get('secretkey', '', 'RAW'),
		);

		$this->setState('credentials', $credentials);

		// Check for return URL from the request first.
		if ($return = $input->get('return', '', 'BASE64'))
		{
			$return = base64_decode($return);

			if (!JUri::isInternal($return))
			{
				$return = '';
			}
		}

		// Set the return URL if empty.
		if (empty($return))
		{
			$return = 'index.php';
		}

		$this->setState('return', $return);
	}

	/**
	 * Get the administrator login module by name (real, eg 'login' or folder, eg 'mod_login').
	 *
	 * @param   string  $name   The name of the module.
	 * @param   string  $title  The title of the module, optional.
	 *
	 * @return  object  The Module object.
	 *
	 * @since   1.7.0
	 */
	public static function getLoginModule($name = 'mod_login', $title = null)
	{
		$result = null;
		$modules = self::_load($name);
		$total = count($modules);

		for ($i = 0; $i < $total; $i++)
		{
			// Match the title if we're looking for a specific instance of the module.
			if (!$title || $modules[$i]->title == $title)
			{
				$result = $modules[$i];
				break;
			}
		}

		// If we didn't find it, and the name is mod_something, create a dummy object.
		if (is_null($result) && substr($name, 0, 4) == 'mod_')
		{
			$result = new stdClass;
			$result->id = 0;
			$result->title = '';
			$result->module = $name;
			$result->position = '';
			$result->content = '';
			$result->showtitle = 0;
			$result->control = '';
			$result->params = '';
			$result->user = 0;
		}

		return $result;
	}

	/**
	 * Load login modules.
	 *
	 * Note that we load regardless of state or access level since access
	 * for public is the only thing that makes sense since users are not logged in
	 * and the module lets them log in.
	 * This is put in as a failsafe to avoid super user lock out caused by an unpublished
	 * login module or by a module set to have a viewing access level that is not Public.
	 *
	 * @param   string  $module  The name of the module.
	 *
	 * @return  array
	 *
	 * @since   1.7.0
	 */
	protected static function _load($module)
	{
		static $clean;

		if (isset($clean))
		{
			return $clean;
		}

		$app      = JFactory::getApplication();
		$lang     = JFactory::getLanguage()->getTag();
		$clientId = (int) $app->getClientId();

		/** @var JCacheControllerCallback $cache */
		$cache = JFactory::getCache('com_modules', 'callback');

		$loader = function () use ($app, $lang, $module) {
			$db = JFactory::getDbo();

			$query = $db->getQuery(true)
				->select('m.id, m.title, m.module, m.position, m.showtitle, m.params')
				->from('#__modules AS m')
				->where('m.module =' . $db->quote($module) . ' AND m.client_id = 1')
				->join('LEFT', '#__extensions AS e ON e.element = m.module AND e.client_id = m.client_id')
				->where('e.enabled = 1');

			// Filter by language.
			if ($app->isClient('site') && $app->getLanguageFilter())
			{
				$query->where('m.language IN (' . $db->quote($lang) . ',' . $db->quote('*') . ')');
			}

			$query->order('m.position, m.ordering');

			// Set the query.
			$db->setQuery($query);

			return $db->loadObjectList();
		};

		try
		{
			return $clean = $cache->get($loader, array(), md5(serialize(array($clientId, $lang))));
		}
		catch (JCacheException $cacheException)
		{
			try
			{
				return $loader();
			}
			catch (JDatabaseExceptionExecuting $databaseException)
			{
				JError::raiseWarning(500, JText::sprintf('JLIB_APPLICATION_ERROR_MODULE_LOAD', $databaseException->getMessage()));

				return array();
			}
		}
		catch (JDatabaseExceptionExecuting $databaseException)
		{
			JError::raiseWarning(500, JText::sprintf('JLIB_APPLICATION_ERROR_MODULE_LOAD', $databaseException->getMessage()));

			return array();
		}
	}
}
components/com_login/views/login/view.html.php000060400000001733152453623450015603 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_login
 *
 * @copyright   (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * HTML View class for the Login component
 *
 * @since  1.6
 */
class LoginViewLogin extends JViewLegacy
{
	/**
	 * Display the view.
	 *
	 * @param   string  $tpl  The name of the template file to parse.
	 *
	 * @return  void
	 *
	 * @since  3.7.0
	 */
	public function display($tpl = null)
	{
		/**
		 * To prevent clickjacking, only allow the login form to be used inside a frame in the same origin.
		 * So send a X-Frame-Options HTTP Header with the SAMEORIGIN value.
		 *
		 * @link https://www.owasp.org/index.php/Clickjacking_Defense_Cheat_Sheet
		 * @link https://tools.ietf.org/html/rfc7034
		 */
		JFactory::getApplication()->setHeader('X-Frame-Options', 'SAMEORIGIN');

		return parent::display($tpl);
	}
}
components/com_login/views/login/tmpl/default.php000060400000001707152453623450016267 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_login
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Get the login modules
 * If you want to use a completely different login module change the value of name
 * in your layout override.
 */
$loginmodule = LoginModelLogin::getLoginModule('mod_login');
echo JModuleHelper::renderModule($loginmodule, array('style' => 'rounded', 'id' => 'section-box'));


/**
 * Get any other modules in the login position.
 * If you want to use a different position for the modules, change the name here in your override.
 */
$modules = JModuleHelper::getModules('login');

foreach ($modules as $module)
// Render the login modules

if ($module->module != 'mod_login'){
	echo JModuleHelper::renderModule($module, array('style' => 'rounded', 'id' => 'section-box'));
}
components/com_media/access.xml000060400000001150152453623450012633 0ustar00<?xml version="1.0" encoding="utf-8" ?>
<access component="com_media">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.options" title="JACTION_OPTIONS" description="JACTION_OPTIONS_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
	</section>
</access>
components/com_media/config.xml000060400000006477152453623450012660 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset
		name="component"
		label="COM_MEDIA_FIELDSET_OPTIONS_LABEL">
		<field
			name="upload_extensions"
			type="text"
			label="COM_MEDIA_FIELD_LEGAL_EXTENSIONS_LABEL"
			description="COM_MEDIA_FIELD_LEGAL_EXTENSIONS_DESC"
			size="50"
			default="bmp,csv,doc,gif,ico,jpg,jpeg,odg,odp,ods,odt,pdf,png,ppt,txt,xcf,xls,BMP,CSV,DOC,GIF,ICO,JPG,JPEG,ODG,ODP,ODS,ODT,PDF,PNG,PPT,TXT,XCF,XLS"
		/>

		<field
			name="upload_maxsize"
			type="number"
			label="COM_MEDIA_FIELD_MAXIMUM_SIZE_LABEL"
			description="COM_MEDIA_FIELD_MAXIMUM_SIZE_DESC"
			validate="number"
			min="0"
			size="50"
			default="10"
		/>

		<field
			name="spacer1"
			type="spacer"
			label="COM_MEDIA_FOLDERS_PATH_LABEL"
			class="text"
		/>

		<field
			name="file_path"
			type="text"
			label="COM_MEDIA_FIELD_PATH_FILE_FOLDER_LABEL"
			description="COM_MEDIA_FIELD_PATH_FILE_FOLDER_DESC"
			size="50"
			default="images"
			validate="filePath"
			exclude="administrator|api|bin|cache|cli|components|includes|language|layouts|libraries|media|modules|plugins|templates|tmp"
		/>

		<field
			name="image_path"
			type="text"
			label="COM_MEDIA_FIELD_PATH_IMAGE_FOLDER_LABEL"
			description="COM_MEDIA_FIELD_PATH_IMAGE_FOLDER_DESC"
			size="50"
			default="images"
			validate="filePath"
			exclude="administrator|api|bin|cache|cli|components|includes|language|layouts|libraries|modules|plugins|templates|tmp"
		/>

		<field
			name="restrict_uploads"
			type="radio"
			label="COM_MEDIA_FIELD_RESTRICT_UPLOADS_LABEL"
			description="COM_MEDIA_FIELD_RESTRICT_UPLOADS_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="check_mime"
			type="radio"
			label="COM_MEDIA_FIELD_CHECK_MIME_LABEL"
			description="COM_MEDIA_FIELD_CHECK_MIME_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			showon="restrict_uploads:1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="image_extensions"
			type="text"
			label="COM_MEDIA_FIELD_LEGAL_IMAGE_EXTENSIONS_LABEL"
			description="COM_MEDIA_FIELD_LEGAL_IMAGE_EXTENSIONS_DESC"
			size="50"
			default="bmp,gif,jpg,png"
			showon="restrict_uploads:1"
		/>

		<field
			name="ignore_extensions"
			type="text"
			label="COM_MEDIA_FIELD_IGNORED_EXTENSIONS_LABEL"
			description="COM_MEDIA_FIELD_IGNORED_EXTENSIONS_DESC"
			size="50"
		/>

		<field
			name="upload_mime"
			type="text"
			label="COM_MEDIA_FIELD_LEGAL_MIME_TYPES_LABEL"
			description="COM_MEDIA_FIELD_LEGAL_MIME_TYPES_DESC"
			size="50"
			default="image/jpeg,image/gif,image/png,image/bmp,application/msword,application/excel,application/pdf,application/powerpoint,text/plain,application/x-zip"
			showon="restrict_uploads:1"
		/>

		<field
			name="upload_mime_illegal"
			type="text"
			label="COM_MEDIA_FIELD_ILLEGAL_MIME_TYPES_LABEL"
			description="COM_MEDIA_FIELD_ILLEGAL_MIME_TYPES_DESC"
			size="50"
			default="text/html"
			showon="restrict_uploads:1"
		/>
	</fieldset>

	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
		>

		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			filter="rules"
			validate="rules"
			component="com_media"
			section="component"
		 />
	</fieldset>
</config>
components/com_media/models/manager.php000060400000011020152453623450014253 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Media Component Manager Model
 *
 * @since  1.5
 */
class MediaModelManager extends JModelLegacy
{
	/**
	 * Method to get model state variables
	 *
	 * @param   string  $property  Optional parameter name
	 * @param   mixed   $default   Optional default value
	 *
	 * @return  object  The property where specified, the state object where omitted
	 *
	 * @since   1.5
	 */
	public function getState($property = null, $default = null)
	{
		static $set;

		if (!$set)
		{
			$input = JFactory::getApplication()->input;

			$folder = $input->get('folder', '', 'path');
			$this->setState('folder', $folder);

			$fieldid = $input->get('fieldid', '');
			$this->setState('field.id', $fieldid);

			$parent = str_replace("\\", '/', dirname($folder));
			$parent = ($parent == '.') ? null : $parent;
			$this->setState('parent', $parent);
			$set = true;
		}

		return parent::getState($property, $default);
	}

	/**
	 * Get a select field with a list of available folders
	 *
	 * @param   string  $base  The image directory to display
	 *
	 * @return  html
	 *
	 * @since 1.5
	 */
	public function getFolderList($base = null)
	{
		// Get some paths from the request
		if (empty($base))
		{
			$base = COM_MEDIA_BASE;
		}

		// Corrections for windows paths
		$base = str_replace(DIRECTORY_SEPARATOR, '/', $base);
		$com_media_base_uni = str_replace(DIRECTORY_SEPARATOR, '/', COM_MEDIA_BASE);

		// Get the list of folders
		jimport('joomla.filesystem.folder');
		$folders = JFolder::folders($base, '.', true, true);

		$document = JFactory::getDocument();
		$document->setTitle(JText::_('COM_MEDIA_INSERT_IMAGE'));

		// Build the array of select options for the folder list
		$options[] = JHtml::_('select.option', '', '/');

		foreach ($folders as $folder)
		{
			$folder    = str_replace($com_media_base_uni, '', str_replace(DIRECTORY_SEPARATOR, '/', $folder));
			$value     = substr($folder, 1);
			$text      = str_replace(DIRECTORY_SEPARATOR, '/', $folder);
			$options[] = JHtml::_('select.option', $value, $text);
		}

		// Sort the folder list array
		if (is_array($options))
		{
			sort($options);
		}

		// Get asset and author id (use integer filter)
		$input = JFactory::getApplication()->input;
		$asset = $input->get('asset', 0, 'integer');

		// For new items the asset is a string. JAccess always checks type first
		// so both string and integer are supported.
		if ($asset == 0)
		{
			$asset = htmlspecialchars(json_encode(trim($input->get('asset', 0, 'cmd'))), ENT_COMPAT, 'UTF-8');
		}

		$author = $input->get('author', 0, 'integer');

		// Create the dropdown folder select list
		$attribs = 'size="1" onchange="ImageManager.setFolder(this.options[this.selectedIndex].value, ' . $asset . ', ' . $author . ')" ';
		$list = JHtml::_('select.genericlist', $options, 'folderlist', $attribs, 'value', 'text', $base);

		return $list;
	}

	/**
	 * Get the folder tree
	 *
	 * @param   mixed  $base  Base folder | null for using base media folder
	 *
	 * @return  array
	 *
	 * @since   1.5
	 */
	public function getFolderTree($base = null)
	{
		// Get some paths from the request
		if (empty($base))
		{
			$base = COM_MEDIA_BASE;
		}

		$mediaBase = str_replace(DIRECTORY_SEPARATOR, '/', COM_MEDIA_BASE . '/');

		// Get the list of folders
		jimport('joomla.filesystem.folder');
		$folders = JFolder::folders($base, '.', true, true);

		$tree = array();

		foreach ($folders as $folder)
		{
			$folder   = str_replace(DIRECTORY_SEPARATOR, '/', $folder);
			$name     = substr($folder, strrpos($folder, '/') + 1);
			$relative = str_replace($mediaBase, '', $folder);
			$absolute = $folder;
			$path     = explode('/', $relative);
			$node     = (object) array('name' => $name, 'relative' => $relative, 'absolute' => $absolute);
			$tmp      = &$tree;

			for ($i = 0, $n = count($path); $i < $n; $i++)
			{
				if (!isset($tmp['children']))
				{
					$tmp['children'] = array();
				}

				if ($i == $n - 1)
				{
					// We need to place the node
					$tmp['children'][$relative] = array('data' => $node, 'children' => array());

					break;
				}

				if (array_key_exists($key = implode('/', array_slice($path, 0, $i + 1)), $tmp['children']))
				{
					$tmp = &$tmp['children'][$key];
				}
			}
		}

		$tree['data'] = (object) array('name' => JText::_('COM_MEDIA_MEDIA'), 'relative' => '', 'absolute' => $base);

		return $tree;
	}
}
components/com_media/models/list.php000060400000012701152453623450013623 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

jimport('joomla.filesystem.folder');
jimport('joomla.filesystem.file');

/**
 * Media Component List Model
 *
 * @since  1.5
 */
class MediaModelList extends JModelLegacy
{
	/**
	 * Method to get model state variables
	 *
	 * @param   string  $property  Optional parameter name
	 * @param   mixed   $default   Optional default value
	 *
	 * @return  object  The property where specified, the state object where omitted
	 *
	 * @since   1.5
	 */
	public function getState($property = null, $default = null)
	{
		static $set;

		if (!$set)
		{
			$input  = JFactory::getApplication()->input;
			$folder = $input->get('folder', '', 'path');
			$this->setState('folder', $folder);

			$parent = str_replace("\\", '/', dirname($folder));
			$parent = ($parent == '.') ? null : $parent;
			$this->setState('parent', $parent);
			$set = true;
		}

		return parent::getState($property, $default);
	}

	/**
	 * Get the images on the current folder
	 *
	 * @return  array
	 *
	 * @since   1.5
	 */
	public function getImages()
	{
		$list = $this->getList();

		return $list['images'];
	}

	/**
	 * Get the folders on the current folder
	 *
	 * @return  array
	 *
	 * @since   1.5
	 */
	public function getFolders()
	{
		$list = $this->getList();

		return $list['folders'];
	}

	/**
	 * Get the documents on the current folder
	 *
	 * @return  array
	 *
	 * @since   1.5
	 */
	public function getDocuments()
	{
		$list = $this->getList();

		return $list['docs'];
	}

	/**
	 * Build imagelist
	 *
	 * @return  array
	 *
	 * @since 1.5
	 */
	public function getList()
	{
		static $list;

		// Only process the list once per request
		if (is_array($list))
		{
			return $list;
		}

		// Get current path from request
		$current = (string) $this->getState('folder');

		$basePath  = COM_MEDIA_BASE . ((strlen($current) > 0) ? '/' . $current : '');
		$mediaBase = str_replace(DIRECTORY_SEPARATOR, '/', COM_MEDIA_BASE . '/');

		// Reset base path
		if (strpos(realpath($basePath), JPath::clean(realpath(COM_MEDIA_BASE))) !== 0)
		{
			$basePath = COM_MEDIA_BASE;
		}

		$images  = array ();
		$folders = array ();
		$docs    = array ();
		$videos  = array ();

		$fileList   = false;
		$folderList = false;

		if (file_exists($basePath))
		{
			// Get the list of files and folders from the given folder
			$fileList   = JFolder::files($basePath);
			$folderList = JFolder::folders($basePath);
		}

		// Iterate over the files if they exist
		if ($fileList !== false)
		{
			$tmpBaseObject = new JObject;

			foreach ($fileList as $file)
			{
				if (is_file($basePath . '/' . $file) && substr($file, 0, 1) != '.' && strtolower($file) !== 'index.html')
				{
					$tmp = clone $tmpBaseObject;
					$tmp->name = $file;
					$tmp->title = $file;
					$tmp->path = str_replace(DIRECTORY_SEPARATOR, '/', JPath::clean($basePath . '/' . $file));
					$tmp->path_relative = str_replace($mediaBase, '', $tmp->path);
					$tmp->size = filesize($tmp->path);

					$ext = strtolower(JFile::getExt($file));

					switch ($ext)
					{
						// Image
						case 'jpg':
						case 'png':
						case 'gif':
						case 'xcf':
						case 'odg':
						case 'bmp':
						case 'jpeg':
						case 'ico':
							$info = @getimagesize($tmp->path);
							$tmp->width  = @$info[0];
							$tmp->height = @$info[1];
							$tmp->type   = @$info[2];
							$tmp->mime   = @$info['mime'];

							if (($info[0] > 60) || ($info[1] > 60))
							{
								$dimensions = MediaHelper::imageResize($info[0], $info[1], 60);
								$tmp->width_60 = $dimensions[0];
								$tmp->height_60 = $dimensions[1];
							}
							else
							{
								$tmp->width_60 = $tmp->width;
								$tmp->height_60 = $tmp->height;
							}

							if (($info[0] > 16) || ($info[1] > 16))
							{
								$dimensions = MediaHelper::imageResize($info[0], $info[1], 16);
								$tmp->width_16 = $dimensions[0];
								$tmp->height_16 = $dimensions[1];
							}
							else
							{
								$tmp->width_16 = $tmp->width;
								$tmp->height_16 = $tmp->height;
							}

							$images[] = $tmp;
							break;

						// Video
						case 'mp4':
							$tmp->icon_32 = 'media/mime-icon-32/' . $ext . '.png';
							$tmp->icon_16 = 'media/mime-icon-16/' . $ext . '.png';
							$videos[] = $tmp;
							break;

						// Non-image document
						default:
							$tmp->icon_32 = 'media/mime-icon-32/' . $ext . '.png';
							$tmp->icon_16 = 'media/mime-icon-16/' . $ext . '.png';
							$docs[] = $tmp;
							break;
					}
				}
			}
		}

		// Iterate over the folders if they exist
		if ($folderList !== false)
		{
			$tmpBaseObject = new JObject;

			foreach ($folderList as $folder)
			{
				$tmp = clone $tmpBaseObject;
				$tmp->name = basename($folder);
				$tmp->path = str_replace(DIRECTORY_SEPARATOR, '/', JPath::clean($basePath . '/' . $folder));
				$tmp->path_relative = str_replace($mediaBase, '', $tmp->path);
				$count = MediaHelper::countFiles($tmp->path);
				$tmp->files = $count[0];
				$tmp->folders = $count[1];

				$folders[] = $tmp;
			}
		}

		$list = array('folders' => $folders, 'docs' => $docs, 'images' => $images, 'videos' => $videos);

		return $list;
	}

	/**
	 * Get the videos on the current folder
	 *
	 * @return  array
	 *
	 * @since   3.5
	 */
	public function getVideos()
	{
		$list = $this->getList();

		return $list['videos'];
	}
}
components/com_media/layouts/toolbar/uploadmedia.php000060400000000772152453623450017020 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$title = JText::_('JTOOLBAR_UPLOAD');
?>
<button data-toggle="collapse" data-target="#collapseUpload" class="btn btn-small btn-success">
	<span class="icon-plus icon-white" title="<?php echo $title; ?>"></span> <?php echo $title; ?>
</button>
components/com_media/layouts/toolbar/newfolder.php000060400000000761152453623450016517 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$title = JText::_('COM_MEDIA_CREATE_NEW_FOLDER');
?>
<button data-toggle="collapse" data-target="#collapseFolder" class="btn btn-small">
	<span class="icon-folder" title="<?php echo $title; ?>"></span> <?php echo $title; ?>
</button>
components/com_media/layouts/toolbar/deletemedia.php000060400000001634152453623450016774 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$title = JText::_('JTOOLBAR_DELETE');
JText::script('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST');
?>
<script type="text/javascript">
(function($){
	// if any media is selected then only allow to submit otherwise show message
	deleteMedia = function(){
		if ( $('#folderframe').contents().find('input:checked[name="rm[]"]').length == 0){
			alert(Joomla.JText._('JLIB_HTML_PLEASE_MAKE_A_SELECTION_FROM_THE_LIST'));
			return false;
		}

	MediaManager.submit('folder.delete');
	};

})(jQuery);
</script>

<button onclick="deleteMedia()" class="btn btn-small">
	<span class="icon-remove" title="<?php echo $title; ?>"></span> <?php echo $title; ?>
</button>
components/com_media/media.xml000060400000002346152453623450012461 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_media</name>
	<author>Joomla! Project</author>
	<creationDate>April 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_MEDIA_XML_DESCRIPTION</description>
	<files folder="site">
		<filename>controller.php</filename>
		<filename>media.php</filename>
		<folder>helpers</folder>
	</files>
	<languages folder="site">
		<language tag="en-GB">language/en-GB.com_media.ini</language>
	</languages>
	<administration>
		<files folder="admin">
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<filename>media.php</filename>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>layouts</folder>
			<folder>models</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_media.ini</language>
			<language tag="en-GB">language/en-GB.com_media.sys.ini</language>
		</languages>
	</administration>
</extension>

components/com_media/media.php000060400000003240152453623450012442 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$input  = JFactory::getApplication()->input;
$user   = JFactory::getUser();
$asset  = $input->get('asset');
$author = $input->get('author');

// Access check.
if (!$user->authorise('core.manage', 'com_media') && (!$asset || (!$user->authorise('core.edit', $asset)
	&& !$user->authorise('core.create', $asset)
	&& count($user->getAuthorisedCategories($asset, 'core.create')) == 0)
	&& !($user->id == $author && $user->authorise('core.edit.own', $asset))))
{
	throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
}

$params = JComponentHelper::getParams('com_media');

// Load the helper class
JLoader::register('MediaHelper', JPATH_ADMINISTRATOR . '/components/com_media/helpers/media.php');

// Set the path definitions
$popup_upload = $input->get('pop_up', null);
$path         = 'file_path';
$view         = $input->get('view');

if (substr(strtolower($view), 0, 6) == 'images' || $popup_upload == 1)
{
	$path = 'image_path';
}

$mediaBaseDir = JPATH_ROOT . '/' . $params->get($path, 'images');

if (!is_dir($mediaBaseDir))
{
	throw new \InvalidArgumentException(JText::_('JERROR_AN_ERROR_HAS_OCCURRED'), 500);
}

define('COM_MEDIA_BASE', $mediaBaseDir);
define('COM_MEDIA_BASEURL', JUri::root() . $params->get($path, 'images'));

$controller = JControllerLegacy::getInstance('Media', array('base_path' => JPATH_COMPONENT_ADMINISTRATOR));
$controller->execute($input->get('task'));
$controller->redirect();
components/com_media/helpers/media.php000060400000011733152453623450014112 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Object\CMSObject;

/**
 * Media helper class.
 *
 * @since       1.6
 * @deprecated  4.0  Use JHelperMedia instead
 */
abstract class MediaHelper
{
	/**
	 * Checks if the file is an image
	 *
	 * @param   string  $fileName  The filename
	 *
	 * @return  boolean
	 *
	 * @since   1.5
	 * @deprecated  4.0  Use JHelperMedia::isImage instead
	 */
	public static function isImage($fileName)
	{
		try
		{
			JLog::add(
				sprintf('%s() is deprecated. Use JHelperMedia::isImage() instead.', __METHOD__),
				JLog::WARNING,
				'deprecated'
			);
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		$mediaHelper = new JHelperMedia;

		return $mediaHelper->isImage($fileName);
	}

	/**
	 * Gets the file extension for the purpose of using an icon.
	 *
	 * @param   string  $fileName  The filename
	 *
	 * @return  string  File extension
	 *
	 * @since   1.5
	 * @deprecated  4.0  Use JHelperMedia::getTypeIcon instead
	 */
	public static function getTypeIcon($fileName)
	{
		try
		{
			JLog::add(
				sprintf('%s() is deprecated. Use JHelperMedia::getTypeIcon() instead.', __METHOD__),
				JLog::WARNING,
				'deprecated'
			);
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		$mediaHelper = new JHelperMedia;

		return $mediaHelper->getTypeIcon($fileName);
	}

	/**
	 * Checks if the file can be uploaded
	 *
	 * @param   array   $file   File information
	 * @param   string  $error  An error message to be returned
	 *
	 * @return  boolean
	 *
	 * @since   1.5
	 * @deprecated  4.0  Use JHelperMedia::canUpload instead
	 */
	public static function canUpload($file, $error = '')
	{
		try
		{
			JLog::add(
				sprintf('%s() is deprecated. Use JHelperMedia::canUpload() instead.', __METHOD__),
				JLog::WARNING,
				'deprecated'
			);
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		$mediaHelper = new JHelperMedia;

		return $mediaHelper->canUpload($file, 'com_media');
	}

	/**
	 * Method to parse a file size
	 *
	 * @param   integer  $size  The file size in bytes
	 *
	 * @return  string  The converted file size
	 *
	 * @since   1.6
	 * @deprecated  4.0  Use JHtml::_('number.bytes') instead
	 */
	public static function parseSize($size)
	{
		try
		{
			JLog::add(
				sprintf("%s() is deprecated. Use JHtml::_('number.bytes') instead.", __METHOD__),
				JLog::WARNING,
				'deprecated'
			);
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		return JHtml::_('number.bytes', $size);
	}

	/**
	 * Calculate the size of a resized image
	 *
	 * @param   integer  $width   Image width
	 * @param   integer  $height  Image height
	 * @param   integer  $target  Target size
	 *
	 * @return  array  The new width and height
	 *
	 * @since   3.2
	 * @deprecated  4.0  Use JHelperMedia::imageResize instead
	 */
	public static function imageResize($width, $height, $target)
	{
		try
		{
			JLog::add(
				sprintf('%s() is deprecated. Use JHelperMedia::imageResize() instead.', __METHOD__),
				JLog::WARNING,
				'deprecated'
			);
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		$mediaHelper = new JHelperMedia;

		return $mediaHelper->imageResize($width, $height, $target);
	}

	/**
	 * Counts the files and directories in a directory that are not php or html files.
	 *
	 * @param   string  $dir  Directory name
	 *
	 * @return  array  The number of files and directories in the given directory
	 *
	 * @since   1.5
	 * @deprecated  4.0  Use JHelperMedia::countFiles instead
	 */
	public static function countFiles($dir)
	{
		try
		{
			JLog::add(
				sprintf('%s() is deprecated. Use JHelperMedia::countFiles() instead.', __METHOD__),
				JLog::WARNING,
				'deprecated'
			);
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		$mediaHelper = new JHelperMedia;

		return $mediaHelper->countFiles($dir);
	}

	/**
	 * Generates the URL to the object in the action logs component
	 *
	 * @param   string     $contentType  The content type
	 * @param   integer    $id           The integer id
	 * @param   CMSObject  $mediaObject  The media object being uploaded
	 *
	 * @return  string  The link for the action log
	 *
	 * @since   3.9.27
	 */
	public static function getContentTypeLink($contentType, $id, CMSObject $mediaObject)
	{
		if ($contentType === 'com_media.file')
		{
			return '';
		}

		$link         = 'index.php?option=com_media&view=media';
		$uploadedPath = substr($mediaObject->get('filepath'), strlen(COM_MEDIA_BASE) + 1);

		// Now remove the filename
		$uploadedBasePath = substr_replace(
			$uploadedPath,
			'',
			(strlen(DIRECTORY_SEPARATOR . $mediaObject->get('name')) * -1)
		);

		if (!empty($uploadedBasePath))
		{
			$link = $link . '&folder=' . $uploadedBasePath;
		}

		return $link;
	}
}
components/com_media/controller.php000060400000004160152453623450013550 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Media Manager Component Controller
 *
 * @since  1.5
 */
class MediaController extends JControllerLegacy
{
	/**
	 * 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  JController		This object to support chaining.
	 *
	 * @since   1.5
	 */
	public function display($cachable = false, $urlparams = false)
	{
		JPluginHelper::importPlugin('content');

		$vType    = JFactory::getDocument()->getType();
		$vName    = $this->input->get('view', 'media');

		switch ($vName)
		{
			case 'images':
				$vLayout = $this->input->get('layout', 'default', 'string');
				$mName   = 'manager';

				break;

			case 'imagesList':
				$mName   = 'list';
				$vLayout = $this->input->get('layout', 'default', 'string');

				break;

			case 'mediaList':
				$app     = JFactory::getApplication();
				$mName   = 'list';
				$vLayout = $app->getUserStateFromRequest('media.list.layout', 'layout', 'thumbs', 'word');

				break;

			case 'media':
			default:
				$vName   = 'media';
				$vLayout = $this->input->get('layout', 'default', 'string');
				$mName   = 'manager';

				break;
		}

		// Get/Create the view
		$view = $this->getView($vName, $vType, '', array('base_path' => JPATH_COMPONENT_ADMINISTRATOR));

		// Get/Create the model
		if ($model = $this->getModel($mName))
		{
			// Push the model into the view (as default)
			$view->setModel($model, true);
		}

		// Set the layout
		$view->setLayout($vLayout);

		// Display the view
		$view->display();

		return $this;
	}

	/**
	 * Validate FTP credentials
	 *
	 * @return  void
	 *
	 * @since   1.5
	 */
	public function ftpValidate()
	{
		// Set FTP credentials, if given
		JClientHelper::setCredentialsFromRequest('ftp');
	}
}
components/com_media/controllers/file.json.php000060400000015547152453623450015635 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

jimport('joomla.filesystem.file');
jimport('joomla.filesystem.folder');

/**
 * File Media Controller
 *
 * @since  1.6
 */
class MediaControllerFile extends JControllerLegacy
{
	/**
	 * Upload a file
	 *
	 * @return  void
	 *
	 * @since   1.5
	 */
	public function upload()
	{
		$params = JComponentHelper::getParams('com_media');

		// Check for request forgeries
		if (!JSession::checkToken('request'))
		{
			$response = array(
				'status'  => '0',
				'message' => JText::_('JINVALID_TOKEN'),
				'error'   => JText::_('JINVALID_TOKEN')
			);
			echo json_encode($response);

			return;
		}

		// Get the user
		$user  = JFactory::getUser();
		JLog::addLogger(array('text_file' => 'upload.error.php'), JLog::ALL, array('upload'));

		// Get some data from the request
		$file   = $this->input->files->get('Filedata', '', 'array');
		$folder = $this->input->get('folder', '', 'path');

		// Instantiate the media helper
		$mediaHelper = new JHelperMedia;

		if ($_SERVER['CONTENT_LENGTH'] > ($params->get('upload_maxsize', 0) * 1024 * 1024)
			|| $_SERVER['CONTENT_LENGTH'] > $mediaHelper->toBytes(ini_get('upload_max_filesize'))
			|| $_SERVER['CONTENT_LENGTH'] > $mediaHelper->toBytes(ini_get('post_max_size'))
			|| $_SERVER['CONTENT_LENGTH'] > $mediaHelper->toBytes(ini_get('memory_limit')))
		{
			$response = array(
				'status'  => '0',
				'message' => JText::_('COM_MEDIA_ERROR_WARNFILETOOLARGE'),
				'error'   => JText::_('COM_MEDIA_ERROR_WARNFILETOOLARGE')
			);
			echo json_encode($response);

			return;
		}

		// Set FTP credentials, if given
		JClientHelper::setCredentialsFromRequest('ftp');

		if (isset($file['name']))
		{
			// Make the filename safe
			$file['name'] = JFile::makeSafe($file['name']);

			// We need a URL safe name
			$fileparts = pathinfo(COM_MEDIA_BASE . '/' . $folder . '/' . $file['name']);

			// Transform filename to punycode
			$fileparts['filename'] = JStringPunycode::toPunycode($fileparts['filename']);
			$tempExt = !empty($fileparts['extension']) ? strtolower($fileparts['extension']) : '';

			// Transform filename to punycode, then neglect other than non-alphanumeric characters & underscores. Also transform extension to lowercase
			$safeFileName = preg_replace(array("/[\\s]/", '/[^a-zA-Z0-9_\-]/'), array('_', ''), $fileparts['filename']) . '.' . $tempExt;

			// Create filepath with safe-filename
			$files['final'] = $fileparts['dirname'] . DIRECTORY_SEPARATOR . $safeFileName;
			$file['name']   = $safeFileName;

			$filepath = JPath::clean($files['final']);

			if (!$mediaHelper->canUpload($file, 'com_media')
				|| strpos(realpath($fileparts['dirname']), JPath::clean(realpath(COM_MEDIA_BASE))) !== 0)
			{
				try
				{
					JLog::add('Invalid: ' . $filepath, JLog::INFO, 'upload');
				}
				catch (RuntimeException $exception)
				{
					// Informational log only
				}

				$response = array(
					'status'  => '0',
					'message' => JText::_('COM_MEDIA_ERROR_UNABLE_TO_UPLOAD_FILE'),
					'error'   => JText::_('COM_MEDIA_ERROR_UNABLE_TO_UPLOAD_FILE')
				);

				echo json_encode($response);

				return;
			}

			// Trigger the onContentBeforeSave event.
			JPluginHelper::importPlugin('content');
			$dispatcher  = JEventDispatcher::getInstance();
			$object_file = new JObject($file);
			$object_file->filepath = $filepath;
			$result = $dispatcher->trigger('onContentBeforeSave', array('com_media.file', &$object_file, true));

			if (in_array(false, $result, true))
			{
				// There are some errors in the plugins
				try
				{
					JLog::add(
						'Errors before save: ' . $object_file->filepath . ' : ' . implode(', ', $object_file->getErrors()),
						JLog::INFO,
						'upload'
					);
				}
				catch (RuntimeException $exception)
				{
					// Informational log only
				}

				$response = array(
					'status'  => '0',
					'message' => JText::plural('COM_MEDIA_ERROR_BEFORE_SAVE', count($errors = $object_file->getErrors()), implode('<br />', $errors)),
					'error'   => JText::plural('COM_MEDIA_ERROR_BEFORE_SAVE', count($errors = $object_file->getErrors()), implode('<br />', $errors))
				);

				echo json_encode($response);

				return;
			}

			if (JFile::exists($object_file->filepath))
			{
				// File exists
				try
				{
					JLog::add('File exists: ' . $object_file->filepath . ' by user_id ' . $user->id, JLog::INFO, 'upload');
				}
				catch (RuntimeException $exception)
				{
					// Informational log only
				}

				$response = array(
					'status'   => '0',
					'message'  => JText::_('COM_MEDIA_ERROR_FILE_EXISTS'),
					'error'    => JText::_('COM_MEDIA_ERROR_FILE_EXISTS'),
					'location' => str_replace(JPATH_ROOT, '',  $filepath)
				);

				echo json_encode($response);

				return;
			}
			elseif (!$user->authorise('core.create', 'com_media'))
			{
				// File does not exist and user is not authorised to create
				try
				{
					JLog::add('Create not permitted: ' . $object_file->filepath . ' by user_id ' . $user->id, JLog::INFO, 'upload');
				}
				catch (RuntimeException $exception)
				{
					// Informational log only
				}

				$response = array(
					'status'  => '0',
					'error'   => JText::_('COM_MEDIA_ERROR_CREATE_NOT_PERMITTED'),
					'message' => JText::_('COM_MEDIA_ERROR_CREATE_NOT_PERMITTED')
				);

				echo json_encode($response);

				return;
			}

			if (!JFile::upload($object_file->tmp_name, $object_file->filepath))
			{
				// Error in upload
				try
				{
					JLog::add('Error on upload: ' . $object_file->filepath, JLog::INFO, 'upload');
				}
				catch (RuntimeException $exception)
				{
					// Informational log only
				}

				$response = array(
					'status'  => '0',
					'message' => JText::_('COM_MEDIA_ERROR_UNABLE_TO_UPLOAD_FILE'),
					'error'   => JText::_('COM_MEDIA_ERROR_UNABLE_TO_UPLOAD_FILE')
				);

				echo json_encode($response);

				return;
			}
			else
			{
				// Trigger the onContentAfterSave event.
				$dispatcher->trigger('onContentAfterSave', array('com_media.file', &$object_file, true));

				try
				{
					JLog::add($folder, JLog::INFO, 'upload');
				}
				catch (RuntimeException $exception)
				{
					// Informational log only
				}

				$returnUrl = str_replace(JPATH_ROOT, '',  $object_file->filepath);

				$response = array(
					'status'   => '1',
					'message'  => JText::sprintf('COM_MEDIA_UPLOAD_COMPLETE', $returnUrl),
					'error'    => JText::sprintf('COM_MEDIA_UPLOAD_COMPLETE', $returnUrl),
					'location' => str_replace('\\', '/', $returnUrl)
				);

				echo json_encode($response);

				return;
			}
		}
		else
		{
			$response = array(
				'status'  => '0',
				'error'   => JText::_('COM_MEDIA_ERROR_BAD_REQUEST'),
				'message' => JText::_('COM_MEDIA_ERROR_BAD_REQUEST')
			);

			echo json_encode($response);

			return;
		}
	}
}
components/com_media/controllers/file.php000060400000024420152453623450014653 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

jimport('joomla.filesystem.file');
jimport('joomla.filesystem.folder');

/**
 * Media File Controller
 *
 * @since  1.5
 */
class MediaControllerFile extends JControllerLegacy
{
	/**
	 * The folder we are uploading into
	 *
	 * @var   string
	 */
	protected $folder = '';

	/**
	 * Upload one or more files
	 *
	 * @return  boolean
	 *
	 * @since   1.5
	 */
	public function upload()
	{
		// Check for request forgeries
		$this->checkToken('request');

		$params = JComponentHelper::getParams('com_media');

		// Get some data from the request
		$files        = $this->input->files->get('Filedata', array(), 'array');
		$return       = JFactory::getSession()->get('com_media.return_url');
		$this->folder = $this->input->get('folder', '', 'path');

		// Instantiate the media helper
		$mediaHelper = new JHelperMedia;

		// Don't redirect to an external URL.
		if (!JUri::isInternal($return))
		{
			$return = '';
		}

		// Set the redirect
		if ($return)
		{
			$this->setRedirect($return . '&folder=' . $this->folder);
		}
		else
		{
			$this->setRedirect('index.php?option=com_media&folder=' . $this->folder);
		}

		// First check against unfiltered input.
		if (!$this->input->files->get('Filedata', null, 'RAW'))
		{
			// Total length of post back data in bytes.
			$contentLength = $this->input->server->get('CONTENT_LENGTH', 0, 'INT');

			// Maximum allowed size of post back data in MB.
			$postMaxSize = $mediaHelper->toBytes(ini_get('post_max_size'));

			// Maximum allowed size of script execution in MB.
			$memoryLimit = $mediaHelper->toBytes(ini_get('memory_limit'));

			// Check for the total size of post back data.
			if (($postMaxSize > 0 && $contentLength > $postMaxSize)
				|| ($memoryLimit != -1 && $contentLength > $memoryLimit))
			{
				// Files are too large.
				JError::raiseWarning(100, JText::_('COM_MEDIA_ERROR_WARNUPLOADTOOLARGE'));

				return false;
			}

			// No files were provided.
			$this->setMessage(JText::_('COM_MEDIA_ERROR_UPLOAD_INPUT'), 'warning');

			return false;
		}

		if (!$files)
		{
			// Files were provided but are unsafe to upload.
			$this->setMessage(JText::_('COM_MEDIA_ERROR_WARNFILENOTSAFE'), 'error');

			return false;
		}

		// Authorize the user
		if (!$this->authoriseUser('create'))
		{
			return false;
		}

		$uploadMaxSize = $params->get('upload_maxsize', 0) * 1024 * 1024;
		$uploadMaxFileSize = $mediaHelper->toBytes(ini_get('upload_max_filesize'));

		// Perform basic checks on file info before attempting anything
		foreach ($files as &$file)
		{
			// Make the filename safe
			$file['name'] = JFile::makeSafe($file['name']);

			// We need a url safe name
			$fileparts = pathinfo(COM_MEDIA_BASE . '/' . $this->folder . '/' . $file['name']);

			if (strpos(realpath($fileparts['dirname']), JPath::clean(realpath(COM_MEDIA_BASE))) !== 0)
			{
				JError::raiseWarning(100, JText::_('COM_MEDIA_ERROR_WARNINVALID_FOLDER'));

				return false;
			}

			// Transform filename to punycode, check extension and transform it to lowercase
			$fileparts['filename'] = JStringPunycode::toPunycode($fileparts['filename']);
			$tempExt = !empty($fileparts['extension']) ? strtolower($fileparts['extension']) : '';

			// Neglect other than non-alphanumeric characters, hyphens & underscores.
			$safeFileName = preg_replace(array("/[\\s]/", '/[^a-zA-Z0-9_\-]/'), array('_', ''), $fileparts['filename']) . '.' . $tempExt;

			$file['name'] = $safeFileName;

			$file['filepath'] = JPath::clean(implode(DIRECTORY_SEPARATOR, array(COM_MEDIA_BASE, $this->folder, $file['name'])));

			if (($file['error'] == 1)
				|| ($uploadMaxSize > 0 && $file['size'] > $uploadMaxSize)
				|| ($uploadMaxFileSize > 0 && $file['size'] > $uploadMaxFileSize))
			{
				// File size exceed either 'upload_max_filesize' or 'upload_maxsize'.
				JError::raiseWarning(100, JText::_('COM_MEDIA_ERROR_WARNFILETOOLARGE'));

				return false;
			}

			if (JFile::exists($file['filepath']))
			{
				// A file with this name already exists
				JError::raiseWarning(100, JText::_('COM_MEDIA_ERROR_FILE_EXISTS'));

				return false;
			}

			if (!isset($file['name']))
			{
				// No filename (after the name was cleaned by JFile::makeSafe)
				$this->setRedirect('index.php', JText::_('COM_MEDIA_INVALID_REQUEST'), 'error');

				return false;
			}
		}

		// Set FTP credentials, if given
		JClientHelper::setCredentialsFromRequest('ftp');
		JPluginHelper::importPlugin('content');
		$dispatcher = JEventDispatcher::getInstance();

		foreach ($files as &$file)
		{
			// The request is valid
			$err = null;

			if (!MediaHelper::canUpload($file, $err))
			{
				// The file can't be uploaded
				return false;
			}

			// Trigger the onContentBeforeSave event.
			$object_file = new JObject($file);
			$result = $dispatcher->trigger('onContentBeforeSave', array('com_media.file', &$object_file, true));

			if (in_array(false, $result, true))
			{
				// There are some errors in the plugins
				JError::raiseWarning(100, JText::plural('COM_MEDIA_ERROR_BEFORE_SAVE', count($errors = $object_file->getErrors()), implode('<br />', $errors)));

				return false;
			}

			if (!JFile::upload($object_file->tmp_name, $object_file->filepath))
			{
				// Error in upload
				JError::raiseWarning(100, JText::_('COM_MEDIA_ERROR_UNABLE_TO_UPLOAD_FILE'));

				return false;
			}

			// Trigger the onContentAfterSave event.
			$dispatcher->trigger('onContentAfterSave', array('com_media.file', &$object_file, true));
			$this->setMessage(JText::sprintf('COM_MEDIA_UPLOAD_COMPLETE', substr($object_file->filepath, strlen(COM_MEDIA_BASE))));
		}

		return true;
	}

	/**
	 * Check that the user is authorized to perform this action
	 *
	 * @param   string  $action  - the action to be performed (create or delete)
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function authoriseUser($action)
	{
		if (!JFactory::getUser()->authorise('core.' . strtolower($action), 'com_media'))
		{
			// User is not authorised
			JError::raiseWarning(403, JText::_('JLIB_APPLICATION_ERROR_' . strtoupper($action) . '_NOT_PERMITTED'));

			return false;
		}

		return true;
	}

	/**
	 * Deletes paths from the current path
	 *
	 * @return  boolean
	 *
	 * @since   1.5
	 */
	public function delete()
	{
		$this->checkToken('request');

		$user = JFactory::getUser();

		// Get some data from the request
		$tmpl   = $this->input->get('tmpl');
		$paths  = $this->input->get('rm', array(), 'array');
		$folder = $this->input->get('folder', '', 'path');

		$redirect = 'index.php?option=com_media&folder=' . $folder;

		if ($tmpl == 'component')
		{
			// We are inside the iframe
			$redirect .= '&view=mediaList&tmpl=component';
		}

		$this->setRedirect($redirect);

		// Just return if there's nothing to do
		if (empty($paths))
		{
			$this->setMessage(JText::_('JERROR_NO_ITEMS_SELECTED'), 'error');

			return true;
		}

		if (!$user->authorise('core.delete', 'com_media'))
		{
			// User is not authorised to delete
			JError::raiseWarning(403, JText::_('JLIB_APPLICATION_ERROR_DELETE_NOT_PERMITTED'));

			return false;
		}

		// Need this to enqueue messages.
		$app = JFactory::getApplication();

		// Set FTP credentials, if given
		JClientHelper::setCredentialsFromRequest('ftp');

		JPluginHelper::importPlugin('content');
		$dispatcher = JEventDispatcher::getInstance();

		$ret = true;

		$safePaths = array_intersect($paths, array_map(array('JFile', 'makeSafe'), $paths));

		foreach ($safePaths as $key => $path)
		{
			$fullPath = implode(DIRECTORY_SEPARATOR, array(COM_MEDIA_BASE, $folder, $path));

			if (strpos(realpath($fullPath), JPath::clean(realpath(COM_MEDIA_BASE))) !== 0)
			{
				unset($safePaths[$key]);
			}
		}

		$unsafePaths = array_diff($paths, $safePaths);

		foreach ($unsafePaths as $path)
		{
			$path = JPath::clean(implode(DIRECTORY_SEPARATOR, array($folder, $path)));
			$path = htmlspecialchars($path, ENT_COMPAT, 'UTF-8');
			$app->enqueueMessage(JText::sprintf('COM_MEDIA_ERROR_UNABLE_TO_DELETE_FILE_WARNFILENAME', $path), 'error');
		}

		foreach ($safePaths as $path)
		{
			$fullPath = JPath::clean(implode(DIRECTORY_SEPARATOR, array(COM_MEDIA_BASE, $folder, $path)));
			$object_file = new JObject(array('filepath' => $fullPath));

			if (is_file($object_file->filepath))
			{
				// Trigger the onContentBeforeDelete event.
				$result = $dispatcher->trigger('onContentBeforeDelete', array('com_media.file', &$object_file));

				if (in_array(false, $result, true))
				{
					// There are some errors in the plugins
					$errors = $object_file->getErrors();
					JError::raiseWarning(100, JText::plural('COM_MEDIA_ERROR_BEFORE_DELETE', count($errors), implode('<br />', $errors)));

					continue;
				}

				$ret &= JFile::delete($object_file->filepath);

				// Trigger the onContentAfterDelete event.
				$dispatcher->trigger('onContentAfterDelete', array('com_media.file', &$object_file));
				$app->enqueueMessage(JText::sprintf('COM_MEDIA_DELETE_COMPLETE', substr($object_file->filepath, strlen(COM_MEDIA_BASE))));
			}
			elseif (is_dir($object_file->filepath))
			{
				$contents = JFolder::files($object_file->filepath, '.', true, false, array('.svn', 'CVS', '.DS_Store', '__MACOSX', 'index.html'));

				if (!empty($contents))
				{
					// This makes no sense...
					$folderPath = substr($object_file->filepath, strlen(COM_MEDIA_BASE));
					JError::raiseWarning(100, JText::sprintf('COM_MEDIA_ERROR_UNABLE_TO_DELETE_FOLDER_NOT_EMPTY', $folderPath));

					continue;
				}

				// Trigger the onContentBeforeDelete event.
				$result = $dispatcher->trigger('onContentBeforeDelete', array('com_media.folder', &$object_file));

				if (in_array(false, $result, true))
				{
					// There are some errors in the plugins
					$errors = $object_file->getErrors();
					JError::raiseWarning(100, JText::plural('COM_MEDIA_ERROR_BEFORE_DELETE', count($errors), implode('<br />', $errors)));

					continue;
				}

				$ret &= !JFolder::delete($object_file->filepath);

				// Trigger the onContentAfterDelete event.
				$dispatcher->trigger('onContentAfterDelete', array('com_media.folder', &$object_file));
				$app->enqueueMessage(JText::sprintf('COM_MEDIA_DELETE_COMPLETE', substr($object_file->filepath, strlen(COM_MEDIA_BASE))));
			}
		}

		return $ret;
	}
}
components/com_media/controllers/folder.php000060400000016232152453623450015211 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

jimport('joomla.filesystem.file');
jimport('joomla.filesystem.folder');

/**
 * Folder Media Controller
 *
 * @since  1.5
 */
class MediaControllerFolder extends JControllerLegacy
{
	/**
	 * Deletes paths from the current path
	 *
	 * @return  boolean
	 *
	 * @since   1.5
	 */
	public function delete()
	{
		$this->checkToken('request');

		$user = JFactory::getUser();

		// Get some data from the request
		$tmpl   = $this->input->get('tmpl');
		$paths  = $this->input->get('rm', array(), 'array');
		$folder = $this->input->get('folder', '', 'path');

		$redirect = 'index.php?option=com_media&folder=' . $folder;

		if ($tmpl == 'component')
		{
			// We are inside the iframe
			$redirect .= '&view=mediaList&tmpl=component';
		}

		$this->setRedirect($redirect);

		// Just return if there's nothing to do
		if (empty($paths))
		{
			$this->setMessage(JText::_('JERROR_NO_ITEMS_SELECTED'), 'error');

			return true;
		}

		if (!$user->authorise('core.delete', 'com_media'))
		{
			// User is not authorised to delete
			JError::raiseWarning(403, JText::_('JLIB_APPLICATION_ERROR_DELETE_NOT_PERMITTED'));

			return false;
		}

		// Need this to enqueue messages.
		$app = JFactory::getApplication();

		// Set FTP credentials, if given
		JClientHelper::setCredentialsFromRequest('ftp');

		JPluginHelper::importPlugin('content');
		$dispatcher = JEventDispatcher::getInstance();

		$ret = true;

		$safePaths = array_intersect($paths, array_map(array('JFile', 'makeSafe'), $paths));
		$unsafePaths = array_diff($paths, $safePaths);

		foreach ($unsafePaths as $path)
		{
			$path = JPath::clean(implode(DIRECTORY_SEPARATOR, array($folder, $path)));
			$path = htmlspecialchars($path, ENT_COMPAT, 'UTF-8');
			$app->enqueueMessage(JText::sprintf('COM_MEDIA_ERROR_UNABLE_TO_DELETE_FILE_WARNFILENAME', $path), 'error');
		}

		foreach ($safePaths as $path)
		{
			$fullPath = JPath::clean(implode(DIRECTORY_SEPARATOR, array(COM_MEDIA_BASE, $folder, $path)));

			if (strpos(realpath($fullPath), JPath::clean(realpath(COM_MEDIA_BASE))) !== 0)
			{
				JError::raiseWarning(100, JText::_('COM_MEDIA_ERROR_WARNINVALID_FOLDER'));

				continue;
			}

			$object_file = new JObject(array('filepath' => $fullPath));

			if (is_file($object_file->filepath))
			{
				// Trigger the onContentBeforeDelete event.
				$result = $dispatcher->trigger('onContentBeforeDelete', array('com_media.file', &$object_file));

				if (in_array(false, $result, true))
				{
					// There are some errors in the plugins
					$errors = $object_file->getErrors();
					JError::raiseWarning(100, JText::plural('COM_MEDIA_ERROR_BEFORE_DELETE', count($errors), implode('<br />', $errors)));

					continue;
				}

				$ret &= JFile::delete($object_file->filepath);

				// Trigger the onContentAfterDelete event.
				$dispatcher->trigger('onContentAfterDelete', array('com_media.file', &$object_file));
				$app->enqueueMessage(JText::sprintf('COM_MEDIA_DELETE_COMPLETE', substr($object_file->filepath, strlen(COM_MEDIA_BASE))));
			}
			elseif (is_dir($object_file->filepath))
			{
				$contents = JFolder::files($object_file->filepath, '.', true, false, array('.svn', 'CVS', '.DS_Store', '__MACOSX', 'index.html'));

				if (!empty($contents))
				{
					// This makes no sense...
					$folderPath = substr($object_file->filepath, strlen(COM_MEDIA_BASE));
					JError::raiseWarning(100, JText::sprintf('COM_MEDIA_ERROR_UNABLE_TO_DELETE_FOLDER_NOT_EMPTY', $folderPath));

					continue;
				}

				// Trigger the onContentBeforeDelete event.
				$result = $dispatcher->trigger('onContentBeforeDelete', array('com_media.folder', &$object_file));

				if (in_array(false, $result, true))
				{
					// There are some errors in the plugins
					$errors = $object_file->getErrors();
					JError::raiseWarning(100, JText::plural('COM_MEDIA_ERROR_BEFORE_DELETE', count($errors), implode('<br />', $errors)));

					continue;
				}

				$ret &= !JFolder::delete($object_file->filepath);

				// Trigger the onContentAfterDelete event.
				$dispatcher->trigger('onContentAfterDelete', array('com_media.folder', &$object_file));
				$app->enqueueMessage(JText::sprintf('COM_MEDIA_DELETE_COMPLETE', substr($object_file->filepath, strlen(COM_MEDIA_BASE))));
			}
		}

		return $ret;
	}

	/**
	 * Create a folder
	 *
	 * @return  boolean
	 *
	 * @since   1.5
	 */
	public function create()
	{
		// Check for request forgeries
		$this->checkToken();

		$user  = JFactory::getUser();

		$folder      = $this->input->get('foldername', '');
		$folderCheck = (string) $this->input->get('foldername', null, 'raw');
		$parent      = $this->input->get('folderbase', '', 'path');

		$this->setRedirect('index.php?option=com_media&folder=' . $parent . '&tmpl=' . $this->input->get('tmpl', 'index'));

		if (strlen($folder) > 0)
		{
			if (!$user->authorise('core.create', 'com_media'))
			{
				// User is not authorised to create
				JError::raiseWarning(403, JText::_('COM_MEDIA_ERROR_CREATE_NOT_PERMITTED'));

				return false;
			}

			// Set FTP credentials, if given
			JClientHelper::setCredentialsFromRequest('ftp');

			$this->input->set('folder', $parent);

			if (($folderCheck !== null) && ($folder !== $folderCheck))
			{
				$app = JFactory::getApplication();
				$app->enqueueMessage(JText::_('COM_MEDIA_ERROR_UNABLE_TO_CREATE_FOLDER_WARNDIRNAME'), 'warning');

				return false;
			}

			$path = JPath::clean(COM_MEDIA_BASE . '/' . $parent . '/' . $folder);

			if (strpos(realpath(COM_MEDIA_BASE . '/' . $parent), JPath::clean(realpath(COM_MEDIA_BASE))) !== 0)
			{
				$app = JFactory::getApplication();
				$app->enqueueMessage(JText::_('COM_MEDIA_ERROR_WARNINVALID_FOLDER'), 'error');

				return false;
			}

			if (!is_dir($path) && !is_file($path))
			{
				// Trigger the onContentBeforeSave event.
				$object_file = new JObject(array('filepath' => $path));
				JPluginHelper::importPlugin('content');
				$dispatcher = JEventDispatcher::getInstance();
				$result     = $dispatcher->trigger('onContentBeforeSave', array('com_media.folder', &$object_file, true));

				if (in_array(false, $result, true))
				{
					// There are some errors in the plugins
					JError::raiseWarning(100, JText::plural('COM_MEDIA_ERROR_BEFORE_SAVE', count($errors = $object_file->getErrors()), implode('<br />', $errors)));

					return false;
				}

				if (JFolder::create($object_file->filepath))
				{
					$data = "<html>\n<body bgcolor=\"#FFFFFF\">\n</body>\n</html>";
					JFile::write($object_file->filepath . '/index.html', $data);

					// Trigger the onContentAfterSave event.
					$dispatcher->trigger('onContentAfterSave', array('com_media.folder', &$object_file, true));
					$this->setMessage(JText::sprintf('COM_MEDIA_CREATE_COMPLETE', substr($object_file->filepath, strlen(COM_MEDIA_BASE))));
				}
			}

			$this->input->set('folder', ($parent) ? $parent . '/' . $folder : $folder);
		}
		else
		{
			// File name is of zero length (null).
			JError::raiseWarning(100, JText::_('COM_MEDIA_ERROR_UNABLE_TO_CREATE_FOLDER_WARNDIRNAME'));

			return false;
		}

		return true;
	}
}
components/com_media/views/imageslist/view.html.php000060400000003173152453623450016603 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * HTML View class for the Media component
 *
 * @since  1.0
 */
class MediaViewImagesList extends JViewLegacy
{
	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @since   1.0
	 */
	public function display($tpl = null)
	{
		// Do not allow cache
		JFactory::getApplication()->allowCache(false);

		$images  = $this->get('images');
		$folders = $this->get('folders');
		$state   = $this->get('state');

		$this->baseURL = COM_MEDIA_BASEURL;
		$this->images  = &$images;
		$this->folders = &$folders;
		$this->state   = &$state;

		parent::display($tpl);
	}

	/**
	 * Set the active folder
	 *
	 * @param   integer  $index  Folder position
	 *
	 * @return  void
	 *
	 * @since   1.0
	 */
	public function setFolder($index = 0)
	{
		if (isset($this->folders[$index]))
		{
			$this->_tmp_folder = &$this->folders[$index];
		}
		else
		{
			$this->_tmp_folder = new JObject;
		}
	}

	/**
	 * Set the active image
	 *
	 * @param   integer  $index  Image position
	 *
	 * @return  void
	 *
	 * @since   1.0
	 */
	public function setImage($index = 0)
	{
		if (isset($this->images[$index]))
		{
			$this->_tmp_img = &$this->images[$index];
		}
		else
		{
			$this->_tmp_img = new JObject;
		}
	}
}
components/com_media/views/imageslist/tmpl/default_folder.php000060400000001531152453623450020615 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$input = JFactory::getApplication()->input;
?>
<li class="imgOutline thumbnail height-80 width-80 center">
	<a href="index.php?option=com_media&amp;view=imagesList&amp;tmpl=component&amp;folder=<?php echo rawurlencode($this->_tmp_folder->path_relative); ?>&amp;asset=<?php echo $input->getCmd('asset'); ?>&amp;author=<?php echo $input->getCmd('author'); ?>" target="imageframe">
		<div class="height-50">
			<span class="icon-folder-2"></span>
		</div>
		<div class="small">
			<?php echo JHtml::_('string.truncate', $this->escape($this->_tmp_folder->name), 10, false); ?>
		</div>
	</a>
</li>
components/com_media/views/imageslist/tmpl/default.php000060400000003060152453623450017261 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$lang = JFactory::getLanguage();

JHtml::_('stylesheet', 'media/popup-imagelist.css', array('version' => 'auto', 'relative' => true));

if ($lang->isRtl())
{
	JHtml::_('stylesheet', 'media/popup-imagelist_rtl.css', array('version' => 'auto', 'relative' => true));
}

JFactory::getDocument()->addScriptDeclaration('var ImageManager = window.parent.ImageManager;');

if ($lang->isRtl())
{
	JFactory::getDocument()->addStyleDeclaration(
		'
			@media (max-width: 767px) {
				li.imgOutline.thumbnail.height-80.width-80.center {
					float: right;
				}
			}
		'
	);
}
else
{
	JFactory::getDocument()->addStyleDeclaration(
		'
			@media (max-width: 767px) {
				li.imgOutline.thumbnail.height-80.width-80.center {
					float: left;
				}
			}
		'
	);
}
?>
<?php if (count($this->images) > 0 || count($this->folders) > 0) : ?>
	<ul class="manager thumbnails thumbnails-media">
		<?php for ($i = 0, $n = count($this->folders); $i < $n; $i++) :
			$this->setFolder($i);
			echo $this->loadTemplate('folder');
		endfor; ?>

		<?php for ($i = 0, $n = count($this->images); $i < $n; $i++) :
			$this->setImage($i);
			echo $this->loadTemplate('image');
		endfor; ?>
	</ul>
<?php else : ?>
	<div id="media-noimages">
		<div class="alert alert-info"><?php echo JText::_('COM_MEDIA_NO_IMAGES_FOUND'); ?></div>
	</div>
<?php endif; ?>
components/com_media/views/imageslist/tmpl/default_image.php000060400000002467152453623450020435 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

$params     = new Registry;
$dispatcher = JEventDispatcher::getInstance();
$dispatcher->trigger('onContentBeforeDisplay', array('com_media.file', &$this->_tmp_img, &$params, 0));
?>

<li class="imgOutline thumbnail height-80 width-80 center">
	<a class="img-preview" href="javascript:ImageManager.populateFields('<?php echo $this->escape($this->_tmp_img->path_relative); ?>')" title="<?php echo $this->escape($this->_tmp_img->name); ?>" >
		<div class="height-50">
			<?php echo JHtml::_('image', $this->baseURL . '/' . $this->escape($this->_tmp_img->path_relative), JText::sprintf('COM_MEDIA_IMAGE_TITLE', $this->escape($this->_tmp_img->title), JHtml::_('number.bytes', $this->_tmp_img->size)), array('width' => $this->_tmp_img->width_60, 'height' => $this->_tmp_img->height_60)); ?>
		</div>
		<div class="small">
			<?php echo JHtml::_('string.truncate', $this->escape($this->_tmp_img->name), 10, false); ?>
		</div>
	</a>
</li>
<?php
$dispatcher->trigger('onContentAfterDisplay', array('com_media.file', &$this->_tmp_img, &$params, 0));
components/com_media/views/images/view.html.php000060400000002245152453623450015706 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * HTML View class for the Media component
 *
 * @since  1.0
 */
class MediaViewImages extends JViewLegacy
{
	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @since   1.0
	 */
	public function display($tpl = null)
	{
		$config = JComponentHelper::getParams('com_media');

		/*
		 * Display form for FTP credentials?
		 * Don't set them here, as there are other functions called before this one if there is any file write operation
		 */
		$ftp = !JClientHelper::hasCredentials('ftp');

		$this->session     = JFactory::getSession();
		$this->config      = $config;
		$this->state       = $this->get('state');
		$this->folderList  = $this->get('folderList');
		$this->require_ftp = $ftp;

		parent::display($tpl);
	}
}
components/com_media/views/images/tmpl/default.php000060400000020152152453623450016366 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$user       = JFactory::getUser();
$input      = JFactory::getApplication()->input;
$params     = JComponentHelper::getParams('com_media');
$lang       = JFactory::getLanguage();
$onClick    = '';
$fieldInput = $this->state->get('field.id');
$isMoo      = $input->getInt('ismoo', 1);
$author     = $input->getCmd('author');
$asset      = $input->getCmd('asset');

JHtml::_('formbehavior.chosen', 'select');

// Load tooltip instance without HTML support because we have a HTML tag in the tip
JHtml::_('bootstrap.tooltip', '.noHtmlTip', array('html' => false));

// Include jQuery
JHtml::_('behavior.core');
JHtml::_('jquery.framework');
JHtml::_('script', 'media/popup-imagemanager.min.js', array('version' => 'auto', 'relative' => true));
JHtml::_('stylesheet', 'media/popup-imagemanager.css', array('version' => 'auto', 'relative' => true));

if ($lang->isRtl())
{
	JHtml::_('stylesheet', 'media/popup-imagemanager_rtl.css', array('version' => 'auto', 'relative' => true));
}

JFactory::getDocument()->addScriptOptions(
	'mediamanager', array(
		'base'   => $params->get('image_path', 'images') . '/',
		'asset'  => $asset,
		'author' => $author
	)
);

/**
 * Mootools compatibility
 *
 * There is an extra option passed in the URL for the iframe &ismoo=0 for the bootstrap fields.
 * By default the value will be 1 or defaults to mootools behaviour
 *
 * This should be removed when mootools won't be shipped by Joomla.
 */
if (!empty($fieldInput)) // Media Form Field
{
	if ($isMoo)
	{
		$onClick = "window.parent.jInsertFieldValue(document.getElementById('f_url').value, '" . $fieldInput . "');window.parent.jModalClose();window.parent.jQuery('.modal.in').modal('hide');";
	}
}
else // XTD Image plugin
{
	$onClick = 'ImageManager.onok();window.parent.jModalClose();';
}
?>
<div class="container-popup">

	<form action="index.php?option=com_media&amp;asset=<?php echo $asset; ?>&amp;author=<?php echo $author; ?>" class="form-horizontal" id="imageForm" method="post" enctype="multipart/form-data">

		<div id="messages" style="display: none;">
			<span id="message"></span><?php echo JHtml::_('image', 'media/dots.gif', '...', array('width' => 22, 'height' => 12), true); ?>
		</div>

		<div class="well">
			<div class="row-fluid">
				<div class="span8 control-group">
					<div class="control-label">
						<label for="folder"><?php echo JText::_('COM_MEDIA_DIRECTORY'); ?></label>
					</div>
					<div class="controls">
						<?php echo $this->folderList; ?>
						<button class="btn" type="button" id="upbutton" title="<?php echo JText::_('COM_MEDIA_DIRECTORY_UP'); ?>"><?php echo JText::_('COM_MEDIA_UP'); ?></button>
					</div>
				</div>
				<div class="span4 control-group">
					<div class="pull-right">
						<button class="btn btn-success button-save-selected" type="button" <?php if (!empty($onClick)) :
							// This is for Mootools compatibility ?>onclick="<?php echo $onClick; ?>"<?php endif; ?> data-dismiss="modal"><?php echo JText::_('COM_MEDIA_INSERT'); ?></button>
						<button class="btn button-cancel" type="button" onclick="window.parent.jQuery('.modal.in').modal('hide');<?php if (!empty($onClick)) :
							// This is for Mootools compatibility ?>parent.jModalClose();<?php endif ?>" data-dismiss="modal"><?php echo JText::_('JCANCEL'); ?></button>
					</div>
				</div>
			</div>
		</div>

		<iframe id="imageframe" name="imageframe" src="index.php?option=com_media&amp;view=imagesList&amp;tmpl=component&amp;folder=<?php echo rawurlencode($this->state->folder); ?>&amp;asset=<?php echo $asset; ?>&amp;author=<?php echo $author; ?>"></iframe>

		<div class="well">
			<div class="row-fluid">
				<div class="span12 control-group">
					<div class="control-label">
						<label for="f_url"><?php echo JText::_('COM_MEDIA_IMAGE_URL'); ?></label>
					</div>
					<div class="controls">
						<input type="text" id="f_url" value="" />
					</div>
				</div>
			</div>
		</div>

		<?php if (!$this->state->get('field.id')) : ?>
			<div class="well">
				<div class="row-fluid">
					<div class="span6 control-group">
						<div class="control-label">
							<label title="<?php echo JText::_('COM_MEDIA_ALIGN_DESC'); ?>" class="noHtmlTip" for="f_align"><?php echo JText::_('COM_MEDIA_ALIGN'); ?></label>
						</div>
						<div class="controls">
							<select size="1" id="f_align">
								<option value="" selected="selected"><?php echo JText::_('COM_MEDIA_NOT_SET'); ?></option>
								<option value="left"><?php echo JText::_('JGLOBAL_LEFT'); ?></option>
								<option value="center"><?php echo JText::_('JGLOBAL_CENTER'); ?></option>
								<option value="right"><?php echo JText::_('JGLOBAL_RIGHT'); ?></option>
							</select>
						</div>
					</div>
				</div>
				<div class="row-fluid">
					<div class="span6 control-group">
						<div class="control-label">
							<label for="f_alt"><?php echo JText::_('COM_MEDIA_IMAGE_DESCRIPTION'); ?></label>
						</div>
						<div class="controls">
							<input type="text" id="f_alt" value="" />
						</div>
					</div>
					<div class="span6 control-group">
						<div class="control-label">
							<label for="f_title"><?php echo JText::_('COM_MEDIA_TITLE'); ?></label>
						</div>
						<div class="controls">
							<input type="text" id="f_title" value="" />
						</div>
					</div>
				</div>
				<div class="row-fluid">
					<div class="span6 control-group">
						<div class="control-label">
							<label for="f_caption"><?php echo JText::_('COM_MEDIA_CAPTION'); ?></label>
						</div>
						<div class="controls">
							<input type="text" id="f_caption" value="" />
						</div>
					</div>
					<div class="span6 control-group">
						<div class="control-label">
							<label title="<?php echo JText::_('COM_MEDIA_CAPTION_CLASS_DESC'); ?>" class="noHtmlTip" for="f_caption_class"><?php echo JText::_('COM_MEDIA_CAPTION_CLASS_LABEL'); ?></label>
						</div>
						<div class="controls">
							<input type="text" list="d_caption_class" id="f_caption_class" value="" />
							<datalist id="d_caption_class">
								<option value="text-left">
								<option value="text-center">
								<option value="text-right">
							</datalist>
						</div>
					</div>
				</div>
			<input type="hidden" id="dirPath" name="dirPath" />
			<input type="hidden" id="f_file" name="f_file" />
			<input type="hidden" id="tmpl" name="component" />
		</div>
		<?php endif; ?>
	</form>

	<?php if ($user->authorise('core.create', 'com_media')) : ?>
		<form action="<?php echo JUri::base(); ?>index.php?option=com_media&amp;task=file.upload&amp;tmpl=component&amp;<?php echo $this->session->getName() . '=' . $this->session->getId(); ?>&amp;<?php echo JSession::getFormToken(); ?>=1&amp;asset=<?php echo $asset; ?>&amp;author=<?php echo $author; ?>&amp;view=images" id="uploadForm" class="form-horizontal" name="uploadForm" method="post" enctype="multipart/form-data">
			<div id="uploadform" class="well">
				<fieldset id="upload-noflash" class="actions">
					<div class="control-group">
						<div class="control-label">
							<label for="upload-file" class="control-label"><?php echo JText::_('COM_MEDIA_UPLOAD_FILE'); ?></label>
						</div>
						<div class="controls">
							<input required type="file" id="upload-file" name="Filedata[]" multiple /><button class="btn btn-primary" id="upload-submit"><span class="icon-upload icon-white"></span> <?php echo JText::_('COM_MEDIA_START_UPLOAD'); ?></button>
							<p class="help-block">
								<?php $cMax    = (int) $this->config->get('upload_maxsize'); ?>
								<?php $maxSize = JUtility::getMaxUploadSize($cMax . 'MB'); ?>
								<?php echo JText::sprintf('JGLOBAL_MAXIMUM_UPLOAD_SIZE_LIMIT', JHtml::_('number.bytes', $maxSize)); ?>
							</p>
						</div>
					</div>
				</fieldset>
				<?php JFactory::getSession()->set('com_media.return_url', 'index.php?option=com_media&view=images&tmpl=component&fieldid=' . $input->getCmd('fieldid', '') . '&e_name=' . $input->getCmd('e_name') . '&asset=' . $asset . '&author=' . $author); ?>
			</div>
		</form>
	<?php endif; ?>
</div>
components/com_media/views/media/tmpl/default_navigation.php000060400000001607152453623450020423 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
$app   = JFactory::getApplication();
$style = $app->getUserStateFromRequest('media.list.layout', 'layout', 'thumbs', 'word');
?>

<div class="media btn-group ventral-space">
	<a href="#" id="thumbs" onclick="MediaManager.setViewType('thumbs')" class="btn <?php echo ($style == 'thumbs') ? 'active' : ''; ?>">
	<span class="icon-grid-view-2"></span> <?php echo JText::_('COM_MEDIA_THUMBNAIL_VIEW'); ?></a>
	<a href="#" id="details" onclick="MediaManager.setViewType('details')" class="btn <?php echo ($style == 'details') ? 'active' : ''; ?>">
	<span class="icon-list-view"></span> <?php echo JText::_('COM_MEDIA_DETAIL_VIEW'); ?></a>
</div>
components/com_media/views/media/tmpl/default_folders.php000060400000002061152453623450017715 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Set up the sanitised target for the ul
$ulTarget = str_replace('/', '-', $this->folders['data']->relative);

?>
<ul class="nav nav-list" id="collapseFolder-<?php echo $ulTarget; ?>">
<?php if (isset($this->folders['children'])) :
	foreach ($this->folders['children'] as $folder) :
	// Get a sanitised name for the target
	$target = str_replace('/', '-', $folder['data']->relative); ?>
	<li id="<?php echo $target; ?>" class="folder">
		<a href="index.php?option=com_media&amp;view=mediaList&amp;tmpl=component&amp;folder=<?php echo rawurlencode($folder['data']->relative); ?>" target="folderframe" class="folder-url" >
			<span class="icon-folder"></span>
			<?php echo $this->escape($folder['data']->name); ?>
		</a>
		<?php echo $this->getFolderLevel($folder); ?>
	</li>
<?php endforeach;
endif; ?>
</ul>
components/com_media/views/media/tmpl/default.php000060400000015163152453623450016206 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$user  = JFactory::getUser();
$input = JFactory::getApplication()->input;
$lang  = JFactory::getLanguage();
$style = JFactory::getApplication()->getUserStateFromRequest('media.list.layout', 'layout', 'thumbs', 'word');

if (DIRECTORY_SEPARATOR == '\\')
{
	$base = str_replace(DIRECTORY_SEPARATOR, "\\\\", COM_MEDIA_BASE);
}
else
{
	$base = COM_MEDIA_BASE;
}

JFactory::getDocument()->addScriptDeclaration(
	"
		var basepath = '" . $base . "';
		var viewstyle = '" . $style . "';
	"
);

JHtml::_('behavior.keepalive');
JHtml::_('bootstrap.framework');
JHtml::_('script', 'media/mediamanager.min.js', array('version' => 'auto', 'relative' => true));
JHtml::_('script', 'media/mediaelement-and-player.js', array('version' => 'auto', 'relative' => true));
JHtml::_('stylesheet', 'media/mediaelementplayer.css', array('version' => 'auto', 'relative' => true));
JHtml::_('stylesheet', 'system/mootree.css', array('version' => 'auto', 'relative' => true));

if ($lang->isRtl())
{
	JHtml::_('stylesheet', 'system/mootree_rtl.css', array('version' => 'auto', 'relative' => true));
}
?>
<div class="row-fluid">
	<!-- Begin Sidebar -->
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
		<div class="j-toggle-sidebar-header">
		<h3><?php echo JText::_('COM_MEDIA_FOLDERS'); ?> </h3>
		</div>
		<div id="treeview" class="sidebar">
			<div id="media-tree_tree" class="tree-holder">
				<?php echo $this->loadTemplate('folders'); ?>
			</div>
		</div>
	</div>
	<!-- End Sidebar -->

	<!-- Begin Content -->
	<div id="j-main-container" class="span10">
		<?php echo $this->loadTemplate('navigation'); ?>
		<?php if (($user->authorise('core.create', 'com_media')) and $this->require_ftp) : ?>
			<form action="index.php?option=com_media&amp;task=ftpValidate" name="ftpForm" id="ftpForm" method="post">
				<fieldset title="<?php echo JText::_('COM_MEDIA_DESCFTPTITLE'); ?>">
					<legend><?php echo JText::_('COM_MEDIA_DESCFTPTITLE'); ?></legend>
					<?php echo JText::_('COM_MEDIA_DESCFTP'); ?>
					<label for="username"><?php echo JText::_('JGLOBAL_USERNAME'); ?></label>
					<input type="text" id="username" name="username" size="70" value="" />

					<label for="password"><?php echo JText::_('JGLOBAL_PASSWORD'); ?></label>
					<input type="password" id="password" name="password" size="70" value="" />
				</fieldset>
			</form>
		<?php endif; ?>

		<form action="index.php?option=com_media" name="adminForm" id="mediamanager-form" method="post" enctype="multipart/form-data" >
			<input type="hidden" name="task" value="" />
			<input type="hidden" name="cb1" id="cb1" value="0" />
			<input class="update-folder" type="hidden" name="folder" id="folder" value="<?php echo $this->escape($this->state->folder); ?>" />
		</form>

		<?php if ($user->authorise('core.create', 'com_media')) : ?>
		<!-- File Upload Form -->
		<div id="collapseUpload" class="collapse">
			<form action="<?php echo JUri::base(); ?>index.php?option=com_media&amp;task=file.upload&amp;tmpl=component&amp;<?php echo $this->session->getName() . '=' . $this->session->getId(); ?>&amp;<?php echo JSession::getFormToken(); ?>=1&amp;format=html" id="uploadForm" class="form-inline" name="uploadForm" method="post" enctype="multipart/form-data">
				<div id="uploadform" class="uploadform">
					<fieldset id="upload-noflash" class="actions">
							<label for="upload-file" class="control-label"><?php echo JText::_('COM_MEDIA_UPLOAD_FILE'); ?></label>
								<input required type="file" id="upload-file" name="Filedata[]" multiple /> <button class="btn btn-primary" id="upload-submit"><span class="icon-upload icon-white"></span> <?php echo JText::_('COM_MEDIA_START_UPLOAD'); ?></button>
							<p class="help-block">
								<?php $cMax    = (int) $this->config->get('upload_maxsize'); ?>
								<?php $maxSize = JUtility::getMaxUploadSize($cMax . 'MB'); ?>
								<?php echo JText::sprintf('JGLOBAL_MAXIMUM_UPLOAD_SIZE_LIMIT', JHtml::_('number.bytes', $maxSize)); ?>
							</p>
					</fieldset>
					<input class="update-folder" type="hidden" name="folder" id="folder" value="<?php echo $this->escape($this->state->folder); ?>" />
					<?php JFactory::getSession()->set('com_media.return_url', 'index.php?option=com_media'); ?>
				</div>
			</form>
		</div>
		<div id="collapseFolder" class="collapse">
			<form action="index.php?option=com_media&amp;task=folder.create&amp;tmpl=<?php echo $input->getCmd('tmpl', 'index'); ?>" name="folderForm" id="folderForm" class="form-inline" method="post">
					<div class="path">
						<input type="text" id="folderpath" readonly="readonly" class="update-folder" />
						<input required type="text" id="foldername" name="foldername" />
						<input class="update-folder" type="hidden" name="folderbase" id="folderbase" value="<?php echo $this->escape($this->state->folder); ?>" />
						<button type="submit" class="btn"><span class="icon-folder-open"></span> <?php echo JText::_('COM_MEDIA_CREATE_FOLDER'); ?></button>
					</div>
					<?php echo JHtml::_('form.token'); ?>
			</form>
		</div>
		<?php endif; ?>

		<form action="index.php?option=com_media&amp;task=folder.create&amp;tmpl=<?php echo $input->getCmd('tmpl', 'index'); ?>" name="folderForm" id="folderForm" method="post">
			<div id="folderview">
				<div class="view">
					<iframe class="thumbnail" src="index.php?option=com_media&amp;view=mediaList&amp;tmpl=component&amp;folder=<?php echo $this->escape($this->state->folder); ?>" id="folderframe" name="folderframe" width="100%" height="500px" marginwidth="0" marginheight="0" scrolling="auto"></iframe>
				</div>
				<?php echo JHtml::_('form.token'); ?>
			</div>
		</form>
	</div>
<?php // Pre render all the bootstrap modals on the parent window

echo JHtml::_(
	'bootstrap.renderModal',
	'imagePreview',
	array(
		'title'  => JText::_('COM_MEDIA_PREVIEW'),
		'footer' => '<button type="button" class="btn" data-dismiss="modal">'
			. JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>',
	),
	'<div id="image" style="text-align:center;"><img id="imagePreviewSrc" src="../media/jui/img/alpha.png" alt="preview" style="max-width:100%; max-height:300px;"/></div>'
);

echo JHtml::_(
	'bootstrap.renderModal',
	'videoPreview',
	array(
		'title'  => JText::_('COM_MEDIA_PREVIEW'),
		'footer' => '<button type="button" class="btn" data-dismiss="modal">'
			. JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>',
	),
	'<div id="videoPlayer" style="z-index: -100;"><video id="mejsPlayer" style="height: 250px;"/></div>'
);
?>
	<!-- End Content -->
</div>
components/com_media/views/media/tmpl/default.xml000060400000000310152453623450016203 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_MEDIA_MEDIA_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_MEDIA_MEDIA_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_media/views/media/view.html.php000060400000006753152453623450015530 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * HTML View class for the Media component
 *
 * @since  1.0
 */
class MediaViewMedia extends JViewLegacy
{
	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @since   1.0
	 */
	public function display($tpl = null)
	{
		$app    = JFactory::getApplication();
		$config = JComponentHelper::getParams('com_media');

		if (!$app->isClient('administrator'))
		{
			return $app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'warning');
		}

		/*
		 * Display form for FTP credentials?
		 * Don't set them here, as there are other functions called before this one if there is any file write operation
		 */
		$ftp = !JClientHelper::hasCredentials('ftp');

		$session           = JFactory::getSession();
		$state             = $this->get('state');
		$this->session     = $session;
		$this->config      = &$config;
		$this->state       = &$state;
		$this->require_ftp = $ftp;
		$this->folders_id  = ' id="media-tree"';
		$this->folders     = $this->get('folderTree');

		$this->sidebar = JHtmlSidebar::render();

		// Set the toolbar
		$this->addToolbar();

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		// Get the toolbar object instance
		$bar  = JToolbar::getInstance('toolbar');
		$user = JFactory::getUser();

		// Set the titlebar text
		JToolbarHelper::title(JText::_('COM_MEDIA'), 'images mediamanager');

		// Add an upload button
		if ($user->authorise('core.create', 'com_media'))
		{
			// Instantiate a new JLayoutFile instance and render the layout
			$layout = new JLayoutFile('toolbar.uploadmedia');

			$bar->appendButton('Custom', $layout->render(array()), 'upload');
			JToolbarHelper::divider();
		}

		// Add a create folder button
		if ($user->authorise('core.create', 'com_media'))
		{
			// Instantiate a new JLayoutFile instance and render the layout
			$layout = new JLayoutFile('toolbar.newfolder');

			$bar->appendButton('Custom', $layout->render(array()), 'create');
			JToolbarHelper::divider();
		}

		// Add a delete button
		if ($user->authorise('core.delete', 'com_media'))
		{
			// Instantiate a new JLayoutFile instance and render the layout
			$layout = new JLayoutFile('toolbar.deletemedia');

			$bar->appendButton('Custom', $layout->render(array()), 'delete');
			JToolbarHelper::divider();
		}

		// Add a preferences button
		if ($user->authorise('core.admin', 'com_media') || $user->authorise('core.options', 'com_media'))
		{
			JToolbarHelper::preferences('com_media');
			JToolbarHelper::divider();
		}

		JToolbarHelper::help('JHELP_CONTENT_MEDIA_MANAGER');
	}

	/**
	 * Display a folder level
	 *
	 * @param   array  $folder  Array with folder data
	 *
	 * @return  string
	 *
	 * @since   1.0
	 */
	protected function getFolderLevel($folder)
	{
		$this->folders_id = null;
		$txt              = null;

		if (isset($folder['children']) && count($folder['children']))
		{
			$tmp           = $this->folders;
			$this->folders = $folder;
			$txt           = $this->loadTemplate('folders');
			$this->folders = $tmp;
		}

		return $txt;
	}
}
components/com_media/views/medialist/tmpl/details_videos.php000060400000004377152453623450020461 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

JHtml::_('bootstrap.tooltip');

$params     = new Registry;
$dispatcher = JEventDispatcher::getInstance();

JFactory::getDocument()->addScriptDeclaration("
jQuery(document).ready(function($){
	window.parent.jQuery('#videoPreview').on('hidden', function () {
		window.parent.jQuery('#mejsPlayer')[0].player.pause();
	});
});
");
?>

<?php foreach ($this->videos as $i => $video) : ?>
	<?php $dispatcher->trigger('onContentBeforeDisplay', array('com_media.file', &$video, &$params, 0)); ?>
	<tr>
		<?php if ($this->canDelete) : ?>
			<td>
				<?php echo JHtml::_('grid.id', $i, $this->escape($video->name), false, 'rm', 'cb-video'); ?>
			</td>
		<?php endif; ?>

		<td>
			<a class="video-preview" href="<?php echo COM_MEDIA_BASEURL, '/', rawurlencode($video->name); ?>" title="<?php echo $this->escape($video->title); ?>">
				<?php echo JHtml::_('image', $video->icon_16, $this->escape($video->title), null, true); ?>
			</a>
		</td>

		<td class="description">
			<a class="video-preview" href="<?php echo COM_MEDIA_BASEURL, '/', rawurlencode($video->name); ?>" title="<?php echo $this->escape($video->name); ?>">
				<?php echo $this->escape($video->name); ?>
			</a>
		</td>

		<td class="dimensions">
			<?php // Can we figure out the dimensions of the video? ?>
		</td>

		<td class="filesize">
			<?php echo JHtml::_('number.bytes', $video->size); ?>
		</td>

		<?php if ($this->canDelete) : ?>
			<td>
				<a class="delete-item" target="_top" href="index.php?option=com_media&amp;task=file.delete&amp;tmpl=index&amp;<?php echo JSession::getFormToken(); ?>=1&amp;folder=<?php echo rawurlencode($this->state->folder); ?>&amp;rm[]=<?php echo $this->escape($video->name); ?>" rel="<?php echo $this->escape($video->name); ?>">
					<span class="icon-remove hasTooltip" title="<?php echo JHtml::tooltipText('JACTION_DELETE'); ?>"></span>
				</a>
			</td>
		<?php endif; ?>
	</tr>

	<?php $dispatcher->trigger('onContentAfterDisplay', array('com_media.file', &$video, &$params, 0)); ?>
<?php endforeach; ?>
components/com_media/views/medialist/tmpl/details_video.php000060400000004446152453623450020273 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

JHtml::_('bootstrap.tooltip');

$user       = JFactory::getUser();
$params     = new Registry;
$dispatcher = JEventDispatcher::getInstance();
$dispatcher->trigger('onContentBeforeDisplay', array('com_media.file', &$this->_tmp_video, &$params, 0));

JFactory::getDocument()->addScriptDeclaration("
jQuery(document).ready(function($){
	window.parent.jQuery('#videoPreview').on('hidden', function () {
		window.parent.jQuery('#mejsPlayer')[0].player.pause();
	});
});
");
?>

<tr>
	<td>
		<a class="video-preview" href="<?php echo COM_MEDIA_BASEURL . '/' . rawurlencode($this->_tmp_video->name); ?>" title="<?php echo $this->escape($this->_tmp_video->title); ?>"><?php JHtml::_('image', $this->_tmp_video->icon_16, $this->escape($this->_tmp_video->title), null, true); ?></a>
	</td>
	<td class="description">
		<a class="video-preview" href="<?php echo COM_MEDIA_BASEURL . '/' . rawurlencode($this->_tmp_video->name); ?>" title="<?php echo $this->escape($this->_tmp_video->name); ?>">
			<?php echo JHtml::_('string.truncate', $this->escape($this->_tmp_video->name), 10, false); ?>
		</a>
	</td>
	<td class="dimensions">
		<?php // Can we figure out the dimensions of the video? ?>
	</td>
	<td class="filesize">
		<?php echo JHtml::_('number.bytes', $this->_tmp_video->size); ?>
	</td>
	<?php if ($user->authorise('core.delete', 'com_media')):?>
		<td>
			<a class="delete-item" target="_top" href="index.php?option=com_media&amp;task=file.delete&amp;tmpl=index&amp;<?php echo JSession::getFormToken(); ?>=1&amp;folder=<?php echo rawurlencode($this->state->folder); ?>&amp;rm[]=<?php echo $this->escape($this->_tmp_video->name); ?>" rel="<?php echo $this->escape($this->_tmp_video->name); ?>"><span class="icon-remove hasTooltip" title="<?php echo JHtml::_('tooltipText', 'JACTION_DELETE');?>"></span></a>
			<input type="checkbox" name="rm[]" value="<?php echo $this->escape($this->_tmp_video->name); ?>" />
		</td>
	<?php endif;?>
</tr>

<?php
$dispatcher->trigger('onContentAfterDisplay', array('com_media.file', &$this->_tmp_video, &$params, 0));
components/com_media/views/medialist/tmpl/thumbs_videos.php000060400000003656152453623450020335 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

$params     = new Registry;
$dispatcher = JEventDispatcher::getInstance();

JFactory::getDocument()->addScriptDeclaration("
jQuery(document).ready(function($){
	window.parent.jQuery('#videoPreview').on('hidden', function () {
		window.parent.jQuery('#mejsPlayer')[0].player.pause();
	});
});
");
?>
<?php foreach ($this->videos as $i => $video) : ?>
	<?php $dispatcher->trigger('onContentBeforeDisplay', array('com_media.file', &$video, &$params, 0)); ?>
	<li class="imgOutline thumbnail height-80 width-80 center">
		<?php if ($this->canDelete) : ?>
			<a class="close delete-item" target="_top" href="index.php?option=com_media&amp;task=file.delete&amp;tmpl=index&amp;<?php echo JSession::getFormToken(); ?>=1&amp;folder=<?php echo rawurlencode($this->state->folder); ?>&amp;rm[]=<?php echo $this->escape($video->name); ?>" rel="<?php echo $this->escape($video->name); ?>" title="<?php echo JText::_('JACTION_DELETE'); ?>">&#215;</a>
			<div class="pull-left">
				<?php echo JHtml::_('grid.id', $i, $this->escape($video->name), false, 'rm', 'cb-video'); ?>
			</div>
			<div class="clearfix"></div>
		<?php endif; ?>

		<div class="height-50">
			<?php echo JHtml::_('image', $video->icon_32, $this->escape($video->title), null, true); ?>
		</div>

		<div class="small">
			<a class="video-preview" href="<?php echo COM_MEDIA_BASEURL, '/', rawurlencode($video->path_relative); ?>" title="<?php echo $this->escape($video->name); ?>">
				<?php echo JHtml::_('string.truncate', $this->escape($video->name), 10, false); ?>
			</a>
		</div>
	</li>
	<?php $dispatcher->trigger('onContentAfterDisplay', array('com_media.file', &$video, &$params, 0)); ?>
<?php endforeach; ?>
components/com_media/views/medialist/tmpl/thumbs_folders.php000060400000003146152453623450020474 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

?>
<?php foreach ($this->folders as $i => $folder) : ?>
	<li class="imgOutline thumbnail height-80 width-80 center">
		<?php if ($this->canDelete) : ?>
			<a class="close delete-item" target="_top" href="index.php?option=com_media&amp;task=folder.delete&amp;tmpl=index&amp;<?php echo JSession::getFormToken(); ?>=1&amp;folder=<?php echo rawurlencode($this->state->folder); ?>&amp;rm[]=<?php echo $this->escape($folder->name); ?>" rel="<?php echo $this->escape($folder->name); ?> :: <?php echo $this->escape($folder->files) + $this->escape($folder->folders); ?>" title="<?php echo JText::_('JACTION_DELETE'); ?>">&#215;</a>
			<div class="pull-left">
				<?php echo JHtml::_('grid.id', $i, $this->escape($folder->name), false, 'rm', 'cb-folder'); ?>
			</div>
			<div class="clearfix"></div>
		<?php endif; ?>

		<div class="height-50">
			<a href="index.php?option=com_media&amp;view=mediaList&amp;tmpl=component&amp;folder=<?php echo rawurlencode($folder->path_relative); ?>" target="folderframe">
				<span class="icon-folder-2"></span>
			</a>
		</div>

		<div class="small">
			<a href="index.php?option=com_media&amp;view=mediaList&amp;tmpl=component&amp;folder=<?php echo rawurlencode($folder->path_relative); ?>" target="folderframe">
				<?php echo JHtml::_('string.truncate', $this->escape($folder->name), 10, false); ?>
			</a>
		</div>
	</li>
<?php endforeach; ?>
components/com_media/views/medialist/tmpl/details_up.php000060400000001745152453623450017610 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$user = JFactory::getUser();
?>
<?php if ($this->state->folder != '') : ?>
<tr>
	<?php if ($this->canDelete) : ?>
		<td>&#160;</td>
	<?php endif; ?>
	<td class="imgTotal">
		<a href="index.php?option=com_media&amp;view=mediaList&amp;tmpl=component&amp;folder=<?php echo rawurlencode($this->state->parent); ?>" target="folderframe">
			<span class="icon-arrow-up"></span></a>
	</td>
	<td class="description">
		<a href="index.php?option=com_media&amp;view=mediaList&amp;tmpl=component&amp;folder=<?php echo rawurlencode($this->state->parent); ?>" target="folderframe">..</a>
	</td>
	<td>&#160;</td>
	<td>&#160;</td>
	<?php if ($user->authorise('core.delete', 'com_media')) : ?>
		<td>&#160;</td>
	<?php endif; ?>
</tr>
<?php endif; ?>
components/com_media/views/medialist/tmpl/thumbs_up.php000060400000001643152453623450017462 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<?php if ($this->state->folder != '') : ?>
<li class="imgOutline thumbnail height-80 width-80 center">
	<div class="imgTotal">
		<div class="imgBorder">
			<a class="btn" href="index.php?option=com_media&amp;view=mediaList&amp;tmpl=component&amp;folder=<?php echo rawurlencode($this->state->parent); ?>" target="folderframe">
				<span class="icon-arrow-up"></span></a>
		</div>
	</div>
	<div class="controls">
		<span>&#160;</span>
	</div>
	<div class="imginfoBorder">
		<a href="index.php?option=com_media&amp;view=mediaList&amp;tmpl=component&amp;folder=<?php echo rawurlencode($this->state->parent); ?>" target="folderframe">..</a>
	</div>
</li>
<?php endif; ?>
components/com_media/views/medialist/tmpl/details_folders.php000060400000003066152453623450020620 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip');
?>

<?php foreach ($this->folders as $i => $folder) : ?>
	<?php $link = 'index.php?option=com_media&amp;view=mediaList&amp;tmpl=component&amp;folder=' . rawurlencode($folder->path_relative); ?>
	<tr>
		<?php if ($this->canDelete) : ?>
			<td>
				<?php echo JHtml::_('grid.id', $i, $this->escape($folder->name), false, 'rm', 'cb-folder'); ?>
			</td>
		<?php endif; ?>
		<td class="imgTotal">
			<a href="<?php echo $link; ?>" target="folderframe"><span class="icon-folder-2"></span></a>
		</td>

		<td class="description">
			<a href="<?php echo $link; ?>" target="folderframe"><?php echo $this->escape($folder->name); ?></a>
		</td>

		<td>&#160;</td>

		<td>&#160;</td>

		<?php if ($this->canDelete) : ?>
			<td>
				<a class="delete-item" target="_top" href="index.php?option=com_media&amp;task=folder.delete&amp;tmpl=index&amp;folder=<?php echo rawurlencode($this->state->folder); ?>&amp;<?php echo JSession::getFormToken(); ?>=1&amp;rm[]=<?php echo $this->escape($folder->name); ?>" rel="<?php echo $this->escape($folder->name); ?> :: <?php echo $this->escape($folder->files) + $this->escape($folder->folders); ?>">
					<span class="icon-remove hasTooltip" title="<?php echo JHtml::tooltipText('JACTION_DELETE'); ?>"></span>
				</a>
			</td>
		<?php endif; ?>
	</tr>
<?php endforeach; ?>
components/com_media/views/medialist/tmpl/details_img.php000060400000004465152453623450017742 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

JHtml::_('bootstrap.tooltip');

$user       = JFactory::getUser();
$params     = new Registry;
$dispatcher = JEventDispatcher::getInstance();
$dispatcher->trigger('onContentBeforeDisplay', array('com_media.file', &$this->_tmp_img, &$params, 0));
?>

<tr>
	<td>
		<a class="img-preview" href="<?php echo COM_MEDIA_BASEURL . '/' . str_replace('%2F', '/', rawurlencode($this->_tmp_img->path_relative)); ?>" title="<?php echo $this->escape($this->_tmp_img->name); ?>"><?php echo JHtml::_('image', COM_MEDIA_BASEURL . '/' . $this->escape($this->_tmp_img->path_relative), JText::sprintf('COM_MEDIA_IMAGE_TITLE', $this->_tmp_img->title, JHtml::_('number.bytes', $this->_tmp_img->size)), array('width' => $this->_tmp_img->width_16, 'height' => $this->_tmp_img->height_16)); ?></a>
	</td>
	<td class="description">
		<a href="<?php echo COM_MEDIA_BASEURL . '/' . str_replace('%2F', '/', rawurlencode($this->_tmp_img->path_relative)); ?>" title="<?php echo $this->escape($this->_tmp_img->name); ?>" class="preview"><?php echo $this->escape($this->_tmp_img->title); ?></a>
	</td>
	<td class="dimensions">
		<?php echo JText::sprintf('COM_MEDIA_IMAGE_DIMENSIONS', $this->_tmp_img->width, $this->_tmp_img->height); ?>
	</td>
	<td class="filesize">
		<?php echo JHtml::_('number.bytes', $this->_tmp_img->size); ?>
	</td>
	<?php if ($user->authorise('core.delete', 'com_media')):?>
		<td>
			<a class="delete-item" target="_top" href="index.php?option=com_media&amp;task=file.delete&amp;tmpl=index&amp;<?php echo JSession::getFormToken(); ?>=1&amp;folder=<?php echo rawurlencode($this->state->folder); ?>&amp;rm[]=<?php echo $this->escape($this->_tmp_img->name); ?>" rel="<?php echo $this->escape($this->_tmp_img->name); ?>"><span class="icon-remove hasTooltip" title="<?php echo JHtml::_('tooltipText', 'JACTION_DELETE');?>"></span></a>
			<input type="checkbox" name="rm[]" value="<?php echo $this->escape($this->_tmp_img->name); ?>" />
		</td>
	<?php endif;?>
</tr>
<?php $dispatcher->trigger('onContentAfterDisplay', array('com_media.file', &$this->_tmp_img, &$params, 0));
components/com_media/views/medialist/tmpl/details_doc.php000060400000003725152453623450017731 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

use Joomla\Registry\Registry;

JHtml::_('bootstrap.tooltip');

$user       = JFactory::getUser();
$params     = new Registry;
$dispatcher = JEventDispatcher::getInstance();
$dispatcher->trigger('onContentBeforeDisplay', array('com_media.file', &$this->_tmp_doc, &$params, 0));
?>

<tr>
	<td>
		<a  title="<?php echo $this->escape($this->_tmp_doc->name); ?>">
			<?php  echo JHtml::_('image', $this->_tmp_doc->icon_16, $this->escape($this->_tmp_doc->title), null, true, true) ? JHtml::_('image', $this->_tmp_doc->icon_16, $this->_tmp_doc->title, array('width' => 16, 'height' => 16), true) : JHtml::_('image', 'media/con_info.png', $this->escape($this->_tmp_doc->title), array('width' => 16, 'height' => 16), true);?> </a>
	</td>
	<td class="description"  title="<?php echo $this->escape($this->_tmp_doc->name); ?>">
		<?php echo $this->escape($this->_tmp_doc->title); ?>
	</td>
	<td>&#160;

	</td>
	<td class="filesize">
		<?php echo JHtml::_('number.bytes', $this->_tmp_doc->size); ?>
	</td>
<?php if ($user->authorise('core.delete', 'com_media')):?>
	<td>
		<a class="delete-item" target="_top" href="index.php?option=com_media&amp;task=file.delete&amp;tmpl=index&amp;<?php echo JSession::getFormToken(); ?>=1&amp;folder=<?php echo rawurlencode($this->state->folder); ?>&amp;rm[]=<?php echo $this->escape($this->_tmp_doc->name); ?>" rel="<?php echo $this->escape($this->_tmp_doc->name); ?>"><span class="icon-remove hasTooltip" title="<?php echo JHtml::_('tooltipText', 'JACTION_DELETE');?>"></span></a>
		<input type="checkbox" name="rm[]" value="<?php echo $this->escape($this->_tmp_doc->name); ?>" />
	</td>
<?php endif;?>
</tr>
<?php $dispatcher->trigger('onContentAfterDisplay', array('com_media.file', &$this->_tmp_doc, &$params, 0));
components/com_media/views/medialist/tmpl/details_imgs.php000060400000004534152453623450020122 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

JHtml::_('bootstrap.tooltip');

$user       = JFactory::getUser();
$params     = new Registry;
$dispatcher = JEventDispatcher::getInstance();
?>

<?php foreach ($this->images as $i => $image) : ?>
	<?php $dispatcher->trigger('onContentBeforeDisplay', array('com_media.file', &$image, &$params, 0)); ?>
	<tr>
		<?php if ($this->canDelete) : ?>
			<td>
				<?php echo JHtml::_('grid.id', $i, $this->escape($image->name), false, 'rm', 'cb-image'); ?>
			</td>
		<?php endif; ?>

		<td>
			<a class="img-preview" href="<?php echo COM_MEDIA_BASEURL . '/' . str_replace('%2F', '/', rawurlencode($image->path_relative)); ?>" title="<?php echo $this->escape($image->name); ?>">
				<?php echo JHtml::_('image', COM_MEDIA_BASEURL . '/' . $this->escape($image->path_relative), JText::sprintf('COM_MEDIA_IMAGE_TITLE', $this->escape($image->title), JHtml::_('number.bytes', $image->size)), array('width' => $image->width_16, 'height' => $image->height_16)); ?>
			</a>
		</td>

		<td class="description">
			<a href="<?php echo  COM_MEDIA_BASEURL . '/' . str_replace('%2F', '/', rawurlencode($image->path_relative)); ?>" title="<?php echo $this->escape($image->name); ?>" class="preview">
				<?php echo $this->escape($image->title); ?>
			</a>
		</td>

		<td class="dimensions">
			<?php echo JText::sprintf('COM_MEDIA_IMAGE_DIMENSIONS', $image->width, $image->height); ?>
		</td>

		<td class="filesize">
			<?php echo JHtml::_('number.bytes', $image->size); ?>
		</td>

		<?php if ($this->canDelete) : ?>
			<td>
				<a class="delete-item" target="_top" href="index.php?option=com_media&amp;task=file.delete&amp;tmpl=index&amp;<?php echo JSession::getFormToken(); ?>=1&amp;folder=<?php echo rawurlencode($this->state->folder); ?>&amp;rm[]=<?php echo $this->escape($image->name); ?>" rel="<?php echo $this->escape($image->name); ?>">
					<span class="icon-remove hasTooltip" title="<?php echo JHtml::tooltipText('JACTION_DELETE'); ?>"></span>
				</a>
			</td>
		<?php endif; ?>
	</tr>
	<?php $dispatcher->trigger('onContentAfterDisplay', array('com_media.file', &$image, &$params, 0)); ?>
<?php endforeach; ?>
components/com_media/views/medialist/tmpl/details_folder.php000060400000003041152453623450020426 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

$user = JFactory::getUser();

JHtml::_('bootstrap.tooltip');
?>
<tr>
	<td class="imgTotal">
		<a href="index.php?option=com_media&amp;view=mediaList&amp;tmpl=component&amp;folder=<?php echo rawurlencode($this->_tmp_folder->path_relative); ?>" target="folderframe">
			<span class="icon-folder-2"></span></a>
	</td>
	<td class="description">
		<a href="index.php?option=com_media&amp;view=mediaList&amp;tmpl=component&amp;folder=<?php echo rawurlencode($this->_tmp_folder->path_relative); ?>" target="folderframe"><?php echo $this->escape($this->_tmp_folder->name); ?></a>
	</td>
	<td>&#160;

	</td>
	<td>&#160;

	</td>
	<?php if ($user->authorise('core.delete', 'com_media')):?>
		<td>
			<a class="delete-item" target="_top" href="index.php?option=com_media&amp;task=folder.delete&amp;tmpl=index&amp;folder=<?php echo rawurlencode($this->state->folder); ?>&amp;<?php echo JSession::getFormToken(); ?>=1&amp;rm[]=<?php echo $this->_tmp_folder->name; ?>" rel="<?php echo $this->_tmp_folder->name; ?>' :: <?php echo $this->_tmp_folder->files + $this->_tmp_folder->folders; ?>"><span class="icon-remove hasTooltip" title="<?php echo JHtml::_('tooltipText', 'JACTION_DELETE');?>"></span></a>
			<input type="checkbox" name="rm[]" value="<?php echo $this->_tmp_folder->name; ?>" />
		</td>
	<?php endif;?>
</tr>
components/com_media/views/medialist/tmpl/default.php000060400000000406152453623450017074 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
components/com_media/views/medialist/tmpl/thumbs_imgs.php000060400000004056152453623450017776 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

$params     = new Registry;
$dispatcher = JEventDispatcher::getInstance();
?>

<?php foreach ($this->images as $i => $img) : ?>
	<?php $dispatcher->trigger('onContentBeforeDisplay', array('com_media.file', &$img, &$params, 0)); ?>
	<li class="imgOutline thumbnail height-80 width-80 center">
		<?php if ($this->canDelete) : ?>
			<a class="close delete-item" target="_top"
			href="index.php?option=com_media&amp;task=file.delete&amp;tmpl=index&amp;<?php echo JSession::getFormToken(); ?>=1&amp;folder=<?php echo rawurlencode($this->state->folder); ?>&amp;rm[]=<?php echo $this->escape($img->name); ?>"
			rel="<?php echo $this->escape($img->name); ?>" title="<?php echo JText::_('JACTION_DELETE'); ?>">&#215;</a>
			<div class="pull-left">
				<?php echo JHtml::_('grid.id', $i, $this->escape($img->name), false, 'rm', 'cb-image'); ?>
			</div>
			<div class="clearfix"></div>
		<?php endif; ?>

		<div class="height-50">
			<a class="img-preview" href="<?php echo COM_MEDIA_BASEURL . '/' . str_replace('%2F', '/', rawurlencode($img->path_relative)); ?>" title="<?php echo $this->escape($img->name); ?>" >
				<?php echo JHtml::_('image', COM_MEDIA_BASEURL . '/' . $this->escape($img->path_relative), JText::sprintf('COM_MEDIA_IMAGE_TITLE', $this->escape($img->title), JHtml::_('number.bytes', $img->size)), array('width' => $img->width_60, 'height' => $img->height_60)); ?>
			</a>
		</div>

		<div class="small">
			<a href="<?php echo COM_MEDIA_BASEURL, '/', rawurlencode($img->path_relative); ?>" title="<?php echo $this->escape($img->name); ?>" class="preview">
				<?php echo JHtml::_('string.truncate', $this->escape($img->name), 10, false); ?>
			</a>
		</div>
	</li>
	<?php $dispatcher->trigger('onContentAfterDisplay', array('com_media.file', &$img, &$params, 0)); ?>
<?php endforeach; ?>
components/com_media/views/medialist/tmpl/details_docs.php000060400000003727152453623450020116 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

use Joomla\Registry\Registry;

JHtml::_('bootstrap.tooltip');

$params     = new Registry;
$dispatcher = JEventDispatcher::getInstance();
?>

<?php foreach ($this->documents as $i => $doc) : ?>
	<?php $dispatcher->trigger('onContentBeforeDisplay', array('com_media.file', &$doc, &$params, 0)); ?>
	<tr>
		<?php if ($this->canDelete) : ?>
			<td>
				<?php echo JHtml::_('grid.id', $i, $this->escape($doc->name), false, 'rm', 'cb-document'); ?>
			</td>
		<?php endif; ?>

		<td>
			<a title="<?php echo $this->escape($doc->name); ?>">
				<?php echo JHtml::_('image', $doc->icon_16, $this->escape($doc->title), null, true, true) ? JHtml::_('image', $doc->icon_16, $this->escape($doc->title), array('width' => 16, 'height' => 16), true) : JHtml::_('image', 'media/con_info.png', $this->escape($doc->title), array('width' => 16, 'height' => 16), true); ?>
			</a>
		</td>

		<td class="description"  title="<?php echo $this->escape($doc->name); ?>">
			<?php echo $this->escape($doc->title); ?>
		</td>

		<td>&#160;</td>

		<td class="filesize">
			<?php echo JHtml::_('number.bytes', $doc->size); ?>
		</td>

		<?php if ($this->canDelete) : ?>
			<td>
				<a class="delete-item" target="_top" href="index.php?option=com_media&amp;task=file.delete&amp;tmpl=index&amp;<?php echo JSession::getFormToken(); ?>=1&amp;folder=<?php echo rawurlencode($this->state->folder); ?>&amp;rm[]=<?php echo $this->escape($doc->name); ?>" rel="<?php echo $this->escape($doc->name); ?>">
					<span class="icon-remove hasTooltip" title="<?php echo JHtml::tooltipText('JACTION_DELETE'); ?>"></span>
				</a>
			</td>
		<?php endif; ?>

	</tr>
	<?php $dispatcher->trigger('onContentAfterDisplay', array('com_media.file', &$doc, &$params, 0)); ?>
<?php endforeach; ?>
components/com_media/views/medialist/tmpl/details.php000060400000007302152453623450017077 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
$params = JComponentHelper::getParams('com_media');
$path   = 'file_path';

JHtml::_('jquery.framework');
JHtml::_('behavior.core');

$doc = JFactory::getDocument();

// Need to override this core function because we use a different form id
$doc->addScriptDeclaration(
	"
		Joomla.isChecked = function( isitchecked, form ) {
			if ( typeof form  === 'undefined' ) {
				form = document.getElementById( 'mediamanager-form' );
			}

			form.boxchecked.value += isitchecked ? 1 : -1;

			// If we don't have a checkall-toggle, done.
			if ( !form.elements[ 'checkall-toggle' ] ) return;

			// Toggle main toggle checkbox depending on checkbox selection
			var c = true,
				i, e, n;

			for ( i = 0, n = form.elements.length; i < n; i++ ) {
				e = form.elements[ i ];

				if ( e.type == 'checkbox' && e.name != 'checkall-toggle' && !e.checked ) {
					c = false;
					break;
				}
			}

			form.elements[ 'checkall-toggle' ].checked = c;
		};
	"
);

$doc->addScriptDeclaration(
	"
		jQuery(document).ready(function($){
			window.parent.document.updateUploader();
			$('.img-preview, .preview').each(function(index, value) {
				$(this).on('click', function(e) {
					window.parent.jQuery('#imagePreviewSrc').attr('src', $(this).attr('href'));
					window.parent.jQuery('#imagePreview').modal('show');
					return false;
				});
			});
			$('.video-preview').each(function(index, value) {
				$(this).unbind('click');
				$(this).on('click', function(e) {
					e.preventDefault();
					window.parent.jQuery('#videoPreview').modal('show');

					var elementInitialised = window.parent.jQuery('#mejsPlayer').attr('src');

					if (!elementInitialised)
					{
						window.parent.jQuery('#mejsPlayer').attr('src', $(this).attr('href'));
						window.parent.jQuery('#mejsPlayer').mediaelementplayer();
					}

					window.parent.jQuery('#mejsPlayer')[0].player.media.setSrc($(this).attr('href'));

					return false;
				});
			});
		});
	"
);
?>
<form target="_parent" action="index.php?option=com_media&amp;tmpl=index&amp;folder=<?php echo rawurlencode($this->state->folder); ?>" method="post" id="mediamanager-form" name="mediamanager-form">
	<div class="muted">
		<p>
			<span class="icon-folder"></span>
			<?php
				echo $params->get($path, 'images'),
					($this->escape($this->state->folder) != '') ? '/' . $this->escape($this->state->folder) : '';
			?>
		</p>
	</div>

	<div class="manager">
		<table class="table table-striped table-condensed">
		<thead>
			<tr>
				<?php if ($this->canDelete) : ?>
					<th width="1%">
						<?php echo JHtml::_('grid.checkall'); ?>
					</th>
				<?php endif; ?>
				<th width="1%"><?php echo JText::_('JGLOBAL_PREVIEW'); ?></th>
				<th><?php echo JText::_('COM_MEDIA_NAME'); ?></th>
				<th width="15%"><?php echo JText::_('COM_MEDIA_PIXEL_DIMENSIONS'); ?></th>
				<th width="8%"><?php echo JText::_('COM_MEDIA_FILESIZE'); ?></th>

				<?php if ($this->canDelete) : ?>
					<th width="8%">
						<?php echo JText::_('JACTION_DELETE'); ?>
					</th>
				<?php endif; ?>
			</tr>
		</thead>
		<tbody>
			<?php
				echo $this->loadTemplate('up'),
					$this->loadTemplate('folders'),
					$this->loadTemplate('docs'),
					$this->loadTemplate('videos'),
					$this->loadTemplate('imgs');
			?>
		</tbody>
		</table>
	</div>

	<input type="hidden" name="task" value="list" />
	<input type="hidden" name="username" value="" />
	<input type="hidden" name="password" value="" />
	<input type="hidden" name="boxchecked" value="" />
	<?php echo JHtml::_('form.token'); ?>
</form>
components/com_media/views/medialist/tmpl/thumbs.php000060400000006333152453623450016757 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
$params = JComponentHelper::getParams('com_media');
$path   = 'file_path';

JHtml::_('jquery.framework');
JHtml::_('behavior.core');

$doc = JFactory::getDocument();

// Need to override this core function because we use a different form id
$doc->addScriptDeclaration(
	"
		Joomla.isChecked = function( isitchecked, form ) {
			if ( typeof form  === 'undefined' ) {
				form = document.getElementById( 'mediamanager-form' );
			}

			form.boxchecked.value += isitchecked ? 1 : -1;

			// If we don't have a checkall-toggle, done.
			if ( !form.elements[ 'checkall-toggle' ] ) return;

			// Toggle main toggle checkbox depending on checkbox selection
			var c = true,
				i, e, n;

			for ( i = 0, n = form.elements.length; i < n; i++ ) {
				e = form.elements[ i ];

				if ( e.type == 'checkbox' && e.name != 'checkall-toggle' && !e.checked ) {
					c = false;
					break;
				}
			}

			form.elements[ 'checkall-toggle' ].checked = c;
		};
	"
);

$doc->addScriptDeclaration(
	"
		jQuery(document).ready(function($){
			window.parent.document.updateUploader();
			$('.img-preview, .preview').each(function(index, value) {
				$(this).on('click', function(e) {
					window.parent.jQuery('#imagePreviewSrc').attr('src', $(this).attr('href'));
					window.parent.jQuery('#imagePreview').modal('show');
					return false;
				});
			});
			$('.video-preview').each(function(index, value) {
				$(this).unbind('click');
				$(this).on('click', function(e) {
					e.preventDefault();
					window.parent.jQuery('#videoPreview').modal('show');

					var elementInitialised = window.parent.jQuery('#mejsPlayer').attr('src');

					if (!elementInitialised)
					{
						window.parent.jQuery('#mejsPlayer').attr('src', $(this).attr('href'));
						window.parent.jQuery('#mejsPlayer').mediaelementplayer();
					}

					window.parent.jQuery('#mejsPlayer')[0].player.media.setSrc($(this).attr('href'));

					return false;
				});
			});
		});
	"
);
?>
<form target="_parent" action="index.php?option=com_media&amp;tmpl=index&amp;folder=<?php echo rawurlencode($this->state->folder); ?>" method="post" id="mediamanager-form" name="mediamanager-form">
	<div class="muted breadcrumbs">
		<p>
			<span class="icon-folder"></span>
			<?php
				echo $params->get($path, 'images'),
					($this->escape($this->state->folder) != '') ? '/' . $this->escape($this->state->folder) : '';
			?>
		</p>
	</div>

	<div>
		<label class="checkbox btn">
			<?php echo JHtml::_('grid.checkall'); ?>
			<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>
		</label>
	</div>

	<ul class="manager thumbnails thumbnails-media">
		<?php
			echo $this->loadTemplate('up'),
				$this->loadTemplate('folders'),
				$this->loadTemplate('docs'),
				$this->loadTemplate('videos'),
				$this->loadTemplate('imgs');
		?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="username" value="" />
		<input type="hidden" name="password" value="" />
		<input type="hidden" name="boxchecked" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</ul>
</form>
components/com_media/views/medialist/tmpl/thumbs_docs.php000060400000003542152453623450017766 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

$params     = new Registry;
$dispatcher = JEventDispatcher::getInstance();
?>

<?php foreach ($this->documents as $i => $doc) : ?>
	<?php $dispatcher->trigger('onContentBeforeDisplay', array('com_media.file', &$doc, &$params, 0)); ?>
	<li class="imgOutline thumbnail height-80 width-80 center">
		<?php if ($this->canDelete) : ?>
			<a class="close delete-item" target="_top" href="index.php?option=com_media&amp;task=file.delete&amp;tmpl=index&amp;<?php echo JSession::getFormToken(); ?>=1&amp;folder=<?php echo rawurlencode($this->state->folder); ?>&amp;rm[]=<?php echo $this->escape($doc->name); ?>" rel="<?php echo $this->escape($doc->name); ?>" title="<?php echo JText::_('JACTION_DELETE'); ?>">&#215;</a>
			<div class="pull-left">
				<?php echo JHtml::_('grid.id', $i, $this->escape($doc->name), false, 'rm', 'cb-document'); ?>
			</div>
			<div class="clearfix"></div>
		<?php endif; ?>

		<div class="height-50">
			<a style="display: block; width: 100%; height: 100%" title="<?php echo $this->escape($doc->name); ?>" >
				<?php echo JHtml::_('image', $doc->icon_32, $this->escape($doc->name), null, true, true) ? JHtml::_('image', $doc->icon_32, $this->escape($doc->title), null, true) : JHtml::_('image', 'media/con_info.png', $this->escape($doc->name), null, true); ?>
			</a>
		</div>

		<div class="small" title="<?php echo $this->escape($doc->name); ?>" >
			<?php echo JHtml::_('string.truncate', $this->escape($doc->name), 10, false); ?>
		</div>
	</li>
	<?php $dispatcher->trigger('onContentAfterDisplay', array('com_media.file', &$doc, &$params, 0)); ?>
<?php endforeach; ?>
components/com_media/views/medialist/view.html.php000060400000003122152453623450016407 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_media
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * HTML View class for the Media component
 *
 * @since  1.0
 */
class MediaViewMediaList extends JViewLegacy
{
	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @since   1.0
	 */
	public function display($tpl = null)
	{
		$app = JFactory::getApplication();

		if (!$app->isClient('administrator'))
		{
			return $app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'warning');
		}

		// Do not allow cache
		$app->allowCache(false);

		$this->images    = $this->get('images');
		$this->documents = $this->get('documents');
		$this->folders   = $this->get('folders');
		$this->videos    = $this->get('videos');
		$this->state     = $this->get('state');

		// Check for invalid folder name
		if (empty($this->state->folder))
		{
			$dirname = JFactory::getApplication()->input->getPath('folder', '');

			if (!empty($dirname))
			{
				$dirname = htmlspecialchars($dirname, ENT_COMPAT, 'UTF-8');
				JError::raiseWarning(100, JText::sprintf('COM_MEDIA_ERROR_UNABLE_TO_BROWSE_FOLDER_WARNDIRNAME', $dirname));
			}
		}

		$user = JFactory::getUser();
		$this->canDelete = $user->authorise('core.delete', 'com_media');

		parent::display($tpl);
	}
}
components/com_checkin/checkin.xml000060400000001653152453623450013333 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_checkin</name>
	<author>Joomla! Project</author>
	<creationDate>April 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_CHECKIN_XML_DESCRIPTION</description>
	<administration>
		<files folder="admin">
			<filename>checkin.php</filename>
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<folder>models</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_checkin.ini</language>
			<language tag="en-GB">language/en-GB.com_checkin.sys.ini</language>
		</languages>
	</administration>
</extension>
components/com_checkin/checkin.php000060400000001067152453623450013321 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_checkin
 *
 * @copyright   (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

if (!JFactory::getUser()->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();
components/com_checkin/views/checkin/tmpl/default.php000060400000004323152453623450017054 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_checkin
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>
<form action="<?php echo JRoute::_('index.php?option=com_checkin'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<?php if ($this->total > 0) : ?>
			<table id="global-checkin" class="table table-striped">
				<thead>
					<tr>
						<th width="1%"><?php echo JHtml::_('grid.checkall'); ?></th>
						<th><?php echo JHtml::_('searchtools.sort', 'COM_CHECKIN_DATABASE_TABLE', 'table', $listDirn, $listOrder); ?></th>
						<th><?php echo JHtml::_('searchtools.sort', 'COM_CHECKIN_ITEMS_TO_CHECK_IN', 'count', $listDirn, $listOrder); ?></th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="3">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
					<?php $i = 0; ?>
					<?php foreach ($this->items as $table => $count) : ?>
						<tr class="row<?php echo $i % 2; ?>">
							<td class="center"><?php echo JHtml::_('grid.id', $i, $table); ?></td>
							<td>
								<label for="cb<?php echo $i ?>">
									<?php echo JText::sprintf('COM_CHECKIN_TABLE', $table); ?>
								</label>
							</td>
							<td>
								<span class="label label-warning"><?php echo $count; ?></span>
							</td>
						</tr>
						<?php $i++; ?>
					<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif; ?>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_checkin/views/checkin/tmpl/default.xml000060400000000320152453623450017056 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_CHECKIN_CHECKIN_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_CHECKIN_CHECKIN_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_checkin/views/checkin/view.html.php000060400000004161152453623450016371 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_checkin
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * HTML View class for the Checkin component
 *
 * @since  1.0
 */
class CheckinViewCheckin extends JViewLegacy
{
	/**
	 * Unused class variable
	 *
	 * @var  object
	 * @deprecated  4.0
	 */
	protected $tables;

	/**
	 * An array of items
	 *
	 * @var  array
	 */
	protected $items;

	/**
	 * The pagination object
	 *
	 * @var  JPagination
	 */
	protected $pagination;

	/**
	 * The model state
	 *
	 * @var  object
	 */
	protected $state;

	/**
	 * The sidebar markup
	 *
	 * @var  string
	 */
	protected $sidebar;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		$this->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');
	}
}
components/com_checkin/controller.php000060400000004116152453623450014076 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_checkin
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Checkin Controller
 *
 * @since  1.6
 */
class CheckinController extends JControllerLegacy
{
	/**
	 * 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  CheckinController  A JControllerLegacy object to support chaining.
	 */
	public function display($cachable = false, $urlparams = array())
	{
		// Load the submenu.
		$this->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
		$this->checkToken();

		$ids = (array) $this->input->get('cid', array(), 'string');

		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'
		);
	}
}
components/com_checkin/config.xml000060400000001110152453623450013160 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
		>

		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			filter="rules"
			validate="rules"
			component="com_checkin"
			section="component">
			<action
				name="core.admin"
				title="JACTION_ADMIN"
				description="JACTION_ADMIN_COMPONENT_DESC" />
			<action
				name="core.manage"
				title="JACTION_MANAGE"
				description="JACTION_MANAGE_COMPONENT_DESC" />
		</field>
	</fieldset>
</config>
components/com_checkin/models/forms/filter_checkin.xml000060400000002033152453623450017302 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_CHECKIN_FILTER_SEARCH_LABEL"
			description="COM_CHECKIN_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
			noresults="COM_CHECKIN_NO_ITEMS"
		/>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="table ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="table ASC">COM_CHECKIN_DATABASE_TABLE_ASC</option>
			<option value="table DESC">COM_CHECKIN_DATABASE_TABLE_DESC</option>
			<option value="count ASC">COM_CHECKIN_ITEMS_TO_CHECK_IN_ASC</option>
			<option value="count DESC">COM_CHECKIN_ITEMS_TO_CHECK_IN_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			label="JGLOBAL_LIMIT"
			description="JGLOBAL_LIMIT"
			class="input-mini"
			default="5"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_checkin/models/checkin.php000060400000011633152453623450014604 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_checkin
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Checkin Model
 *
 * @since  1.6
 */
class CheckinModelCheckin extends JModelList
{
	/**
	 * Count of the total items checked out
	 *
	 * @var  integer
	 */
	protected $total;

	/**
	 * Unused class variable
	 *
	 * @var  object
	 * @deprecated  4.0
	 */
	protected $tables;

	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   3.5
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'table',
				'count',
			);
		}

		parent::__construct($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 = 'table', $direction = 'asc')
	{
		$this->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;

		$dispatcher = \JEventDispatcher::getInstance();

		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($db->quoteName('checked_out') . ' = DEFAULT')
				->set($db->quoteName('checked_out_time') . ' = ' . $db->quote($nullDate))
				->where($db->quoteName('checked_out') . ' > 0');

			$db->setQuery($query);

			if ($db->execute())
			{
				$results = $results + $db->getAffectedRows();
				$dispatcher->trigger('onAfterCheckin', array($tn));
			}
		}

		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;
	}
}
components/com_postinstall/config.xml000060400000000525152453623450014141 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<config>
	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
		>

		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			filter="rules"
			component="com_postinstall"
			section="component" 
		/>
	</fieldset>	
</config>components/com_postinstall/access.xml000060400000000516152453623450014135 0ustar00<?xml version="1.0" encoding="utf-8"?>
<access component="com_postinstall">
	<section name="component">
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
	</section>
</access>
components/com_postinstall/fof.xml000060400000000605152453623450013445 0ustar00<?xml version="1.0" encoding="UTF-8"?>
<fof>
	<backend>
		<dispatcher>
			<option name="default_view">messages</option>
		</dispatcher>
		<view name="messages">
			<acl>
				<task name="reset">core.edit.state</task>
			</acl>
			<taskmap>
				<task name="read">browse</task>
				<task name="add">browse</task>
				<task name="edit">browse</task>
			</taskmap>
		</view>
	</backend>
</fof>
components/com_postinstall/postinstall.php000060400000000546152453623450015242 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_postinstall
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Dispatch the component.
FOFDispatcher::getTmpInstance('com_postinstall')->dispatch();
components/com_postinstall/postinstall.xml000060400000002043152453623450015245 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.2" method="upgrade">
	<name>com_postinstall</name>
	<author>Joomla! Project</author>
	<creationDate>September 2013</creationDate>
	<copyright>(C) 2013 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.2.0</version>
	<description>COM_POSTINSTALL_XML_DESCRIPTION</description>
	<administration>
		<files folder="admin">
			<filename>access.xml</filename>
			<filename>config.xml</filename>
			<filename>fof.xml</filename>
			<filename>postinstall.php</filename>
			<filename>toolbar.php</filename>
			<folder>controllers</folder>
			<folder>models</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_postinstall.ini</language>
			<language tag="en-GB">language/en-GB.com_postinstall.sys.ini</language>
		</languages>
	</administration>
</extension>
components/com_postinstall/toolbar.php000060400000001240152453623450014320 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_postinstall
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * The Toolbar class renders the component title area and the toolbar.
 *
 * @since  3.2
 */
class PostinstallToolbar extends FOFToolbar
{
	/**
	 * Setup the toolbar and title
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function onMessages()
	{
		JToolBarHelper::preferences($this->config['option'], 550, 875);
		JToolbarHelper::help('JHELP_COMPONENTS_POST_INSTALLATION_MESSAGES');
	}
}
components/com_postinstall/models/messages.php000060400000035633152453623450015765 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_postinstall
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Model class to manage postinstall messages
 *
 * @since  3.2
 */
class PostinstallModelMessages extends FOFModel
{
	/**
	 * Builds the SELECT query
	 *
	 * @param   boolean  $overrideLimits  Are we requested to override the set limits?
	 *
	 * @return  JDatabaseQuery
	 *
	 * @since   3.2
	 */
	public function buildQuery($overrideLimits = false)
	{
		$query = parent::buildQuery($overrideLimits);

		$db = $this->getDbo();

		// Add a forced extension filtering to the list
		$eid = $this->getState('eid', 700);
		$query->where($db->qn('extension_id') . ' = ' . $db->q($eid));

		// Force filter only enabled messages
		$published = $this->getState('published', 1, 'int');
		$query->where($db->qn('enabled') . ' = ' . (int) $published);

		return $query;
	}

	/**
	 * Returns the name of an extension, as registered in the #__extensions table
	 *
	 * @param   integer  $eid  The extension ID
	 *
	 * @return  string  The extension name
	 *
	 * @since   3.2
	 */
	public function getExtensionName($eid)
	{
		// Load the extension's information from the database
		$db = $this->getDbo();

		$query = $db->getQuery(true)
			->select(array('name', 'element', 'client_id'))
			->from($db->qn('#__extensions'))
			->where($db->qn('extension_id') . ' = ' . (int) $eid);

		$db->setQuery($query, 0, 1);

		$extension = $db->loadObject();

		if (!is_object($extension))
		{
			return '';
		}

		// Load language files
		$basePath = JPATH_ADMINISTRATOR;

		if ($extension->client_id == 0)
		{
			$basePath = JPATH_SITE;
		}

		$lang = JFactory::getLanguage();
		$lang->load($extension->element, $basePath);

		// Return the localised name
		return JText::_(strtoupper($extension->name));
	}

	/**
	 * Resets all messages for an extension
	 *
	 * @param   integer  $eid  The extension ID whose messages we'll reset
	 *
	 * @return  mixed  False if we fail, a db cursor otherwise
	 *
	 * @since   3.2
	 */
	public function resetMessages($eid)
	{
		$db = $this->getDbo();

		$query = $db->getQuery(true)
			->update($db->qn('#__postinstall_messages'))
			->set($db->qn('enabled') . ' = 1')
			->where($db->qn('extension_id') . ' = ' . (int) $eid);
		$db->setQuery($query);

		return $db->execute();
	}

	/**
	 * Hides all messages for an extension
	 *
	 * @param   integer  $eid  The extension ID whose messages we'll hide
	 *
	 * @return  mixed  False if we fail, a db cursor otherwise
	 *
	 * @since   3.8.7
	 */
	public function hideMessages($eid)
	{
		$db = $this->getDbo();

		$query = $db->getQuery(true)
			->update($db->qn('#__postinstall_messages'))
			->set($db->qn('enabled') . ' = 0')
			->where($db->qn('extension_id') . ' = ' . (int) $eid);
		$db->setQuery($query);

		return $db->execute();
	}

	/**
	 * List post-processing. This is used to run the programmatic display
	 * conditions against each list item and decide if we have to show it or
	 * not.
	 *
	 * Do note that this a core method of the RAD Layer which operates directly
	 * on the list it's being fed. A little touch of modern magic.
	 *
	 * @param   array  &$resultArray  A list of items to process
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	protected function onProcessList(&$resultArray)
	{
		$unset_keys          = array();
		$language_extensions = array();

		// Order the results DESC so the newest is on the top.
		$resultArray = array_reverse($resultArray);

		foreach ($resultArray as $key => $item)
		{
			// Filter out messages based on dynamically loaded programmatic conditions.
			if (!empty($item->condition_file) && !empty($item->condition_method))
			{
				jimport('joomla.filesystem.file');

				$file = FOFTemplateUtils::parsePath($item->condition_file, true);

				if (JFile::exists($file))
				{
					require_once $file;

					$result = call_user_func($item->condition_method);

					if ($result === false)
					{
						$unset_keys[] = $key;
					}
				}
			}

			// Load the necessary language files.
			if (!empty($item->language_extension))
			{
				$hash = $item->language_client_id . '-' . $item->language_extension;

				if (!in_array($hash, $language_extensions))
				{
					$language_extensions[] = $hash;
					JFactory::getLanguage()->load($item->language_extension, $item->language_client_id == 0 ? JPATH_SITE : JPATH_ADMINISTRATOR);
				}
			}
		}

		if (!empty($unset_keys))
		{
			foreach ($unset_keys as $key)
			{
				unset($resultArray[$key]);
			}
		}
	}

	/**
	 * Get the dropdown options for the list of component with post-installation messages
	 *
	 * @since 3.4
	 *
	 * @return  array  Compatible with JHtmlSelect::genericList
	 */
	public function getComponentOptions()
	{
		$db = $this->getDbo();

		$query = $db->getQuery(true)
			->select('extension_id')
			->from($db->qn('#__postinstall_messages'))
			->group(array($db->qn('extension_id')));
		$db->setQuery($query);
		$extension_ids = $db->loadColumn();

		$options = array();

		JFactory::getLanguage()->load('files_joomla.sys', JPATH_SITE, null, false, false);

		foreach ($extension_ids as $eid)
		{
			$options[] = JHtml::_('select.option', $eid, $this->getExtensionName($eid));
		}

		return $options;
	}

	/**
	 * Adds or updates a post-installation message (PIM) definition. You can use this in your post-installation script using this code:
	 *
	 * require_once JPATH_LIBRARIES . '/fof/include.php';
	 * FOFModel::getTmpInstance('Messages', 'PostinstallModel')->addPostInstallationMessage($options);
	 *
	 * The $options array contains the following mandatory keys:
	 *
	 * extension_id        The numeric ID of the extension this message is for (see the #__extensions table)
	 *
	 * type                One of message, link or action. Their meaning is:
	 *                         message  Informative message. The user can dismiss it.
	 *                         link     The action button links to a URL. The URL is defined in the action parameter.
	 *                         action   A PHP action takes place when the action button is clicked. You need to specify the action_file
	 *                                  (RAD path to the PHP file) and action (PHP function name) keys. See below for more information.
	 *
	 * title_key           The JText language key for the title of this PIM.
	 *                     Example: COM_FOOBAR_POSTINSTALL_MESSAGEONE_TITLE
	 *
	 * description_key     The JText language key for the main body (description) of this PIM
	 *                     Example: COM_FOOBAR_POSTINSTALL_MESSAGEONE_DESCRIPTION
	 *
	 * action_key          The JText language key for the action button. Ignored and not required when type=message
	 *                     Example: COM_FOOBAR_POSTINSTALL_MESSAGEONE_ACTION
	 *
	 * language_extension  The extension name which holds the language keys used above.
	 *                     For example, com_foobar, mod_something, plg_system_whatever, tpl_mytemplate
	 *
	 * language_client_id  Should we load the frontend (0) or backend (1) language keys?
	 *
	 * version_introduced  Which was the version of your extension where this message appeared for the first time?
	 *                     Example: 3.2.1
	 *
	 * enabled             Must be 1 for this message to be enabled. If you omit it, it defaults to 1.
	 *
	 * condition_file      The RAD path to a PHP file containing a PHP function which determines whether this message should be shown to
	 *                     the user. @see FOFTemplateUtils::parsePath() for RAD path format. Joomla! will include this file before calling
	 *                     the condition_method.
	 *                     Example:   admin://components/com_foobar/helpers/postinstall.php
	 *
	 * condition_method    The name of a PHP function which will be used to determine whether to show this message to the user. This must be
	 *                     a simple PHP user function (not a class method, static method etc) which returns true to show the message and false
	 *                     to hide it. This function is defined in the condition_file.
	 *                     Example: com_foobar_postinstall_messageone_condition
	 *
	 * When type=message no additional keys are required.
	 *
	 * When type=link the following additional keys are required:
	 *
	 * action  The URL which will open when the user clicks on the PIM's action button
	 *         Example:    index.php?option=com_foobar&view=tools&task=installSampleData
	 *
	 * When type=action the following additional keys are required:
	 *
	 * action_file  The RAD path to a PHP file containing a PHP function which performs the action of this PIM. @see FOFTemplateUtils::parsePath()
	 *              for RAD path format. Joomla! will include this file before calling the function defined in the action key below.
	 *              Example:   admin://components/com_foobar/helpers/postinstall.php
	 *
	 * action       The name of a PHP function which will be used to run the action of this PIM. This must be a simple PHP user function
	 *              (not a class method, static method etc) which returns no result.
	 *              Example: com_foobar_postinstall_messageone_action
	 *
	 * @param   array  $options  See description
	 *
	 * @return  $this
	 *
	 * @throws  Exception
	 */
	public function addPostInstallationMessage(array $options)
	{
		// Make sure there are options set
		if (!is_array($options))
		{
			throw new Exception('Post-installation message definitions must be of type array', 500);
		}

		// Initialise array keys
		$defaultOptions = array(
			'extension_id'       => '',
			'type'               => '',
			'title_key'          => '',
			'description_key'    => '',
			'action_key'         => '',
			'language_extension' => '',
			'language_client_id' => '',
			'action_file'        => '',
			'action'             => '',
			'condition_file'     => '',
			'condition_method'   => '',
			'version_introduced' => '',
			'enabled'            => '1',
		);

		$options = array_merge($defaultOptions, $options);

		// Array normalisation. Removes array keys not belonging to a definition.
		$defaultKeys = array_keys($defaultOptions);
		$allKeys     = array_keys($options);
		$extraKeys   = array_diff($allKeys, $defaultKeys);

		if (!empty($extraKeys))
		{
			foreach ($extraKeys as $key)
			{
				unset($options[$key]);
			}
		}

		// Normalisation of integer values
		$options['extension_id']       = (int) $options['extension_id'];
		$options['language_client_id'] = (int) $options['language_client_id'];
		$options['enabled']            = (int) $options['enabled'];

		// Normalisation of 0/1 values
		foreach (array('language_client_id', 'enabled') as $key)
		{
			$options[$key] = $options[$key] ? 1 : 0;
		}

		// Make sure there's an extension_id
		if (!(int) $options['extension_id'])
		{
			throw new Exception('Post-installation message definitions need an extension_id', 500);
		}

		// Make sure there's a valid type
		if (!in_array($options['type'], array('message', 'link', 'action')))
		{
			throw new Exception('Post-installation message definitions need to declare a type of message, link or action', 500);
		}

		// Make sure there's a title key
		if (empty($options['title_key']))
		{
			throw new Exception('Post-installation message definitions need a title key', 500);
		}

		// Make sure there's a description key
		if (empty($options['description_key']))
		{
			throw new Exception('Post-installation message definitions need a description key', 500);
		}

		// If the type is anything other than message you need an action key
		if (($options['type'] != 'message') && empty($options['action_key']))
		{
			throw new Exception('Post-installation message definitions need an action key when they are of type "' . $options['type'] . '"', 500);
		}

		// You must specify the language extension
		if (empty($options['language_extension']))
		{
			throw new Exception('Post-installation message definitions need to specify which extension contains their language keys', 500);
		}

		// The action file and method are only required for the "action" type
		if ($options['type'] == 'action')
		{
			if (empty($options['action_file']))
			{
				throw new Exception('Post-installation message definitions need an action file when they are of type "action"', 500);
			}

			$file_path = FOFTemplateUtils::parsePath($options['action_file'], true);

			if (!@is_file($file_path))
			{
				throw new Exception('The action file ' . $options['action_file'] . ' of your post-installation message definition does not exist', 500);
			}

			if (empty($options['action']))
			{
				throw new Exception('Post-installation message definitions need an action (function name) when they are of type "action"', 500);
			}
		}

		if ($options['type'] == 'link')
		{
			if (empty($options['link']))
			{
				throw new Exception('Post-installation message definitions need an action (URL) when they are of type "link"', 500);
			}
		}

		// The condition file and method are only required when the type is not "message"
		if ($options['type'] != 'message')
		{
			if (empty($options['condition_file']))
			{
				throw new Exception('Post-installation message definitions need a condition file when they are of type "' . $options['type'] . '"', 500);
			}

			$file_path = FOFTemplateUtils::parsePath($options['condition_file'], true);

			if (!@is_file($file_path))
			{
				throw new Exception('The condition file ' . $options['condition_file'] . ' of your post-installation message definition does not exist', 500);
			}

			if (empty($options['condition_method']))
			{
				throw new Exception(
					'Post-installation message definitions need a condition method (function name) when they are of type "'
					. $options['type'] . '"',
					500
				);
			}
		}

		// Check if the definition exists
		$table     = $this->getTable();
		$tableName = $table->getTableName();

		$db    = $this->getDbo();
		$query = $db->getQuery(true)
			->select('*')
			->from($db->qn($tableName))
			->where($db->qn('extension_id') . ' = ' . (int) $options['extension_id'])
			->where($db->qn('type') . ' = ' . $db->q($options['type']))
			->where($db->qn('title_key') . ' = ' . $db->q($options['title_key']));

		$existingRow = $db->setQuery($query)->loadAssoc();

		// Is the existing definition the same as the one we're trying to save?
		if (!empty($existingRow))
		{
			$same = true;

			foreach ($options as $k => $v)
			{
				if ($existingRow[$k] != $v)
				{
					$same = false;
					break;
				}
			}

			// Trying to add the same row as the existing one; quit
			if ($same)
			{
				return $this;
			}

			// Otherwise it's not the same row. Remove the old row before insert a new one.
			$query = $db->getQuery(true)
				->delete($db->qn($tableName))
				->where($db->q('extension_id') . ' = ' . (int) $options['extension_id'])
				->where($db->q('type') . ' = ' . $db->q($options['type']))
				->where($db->q('title_key') . ' = ' . $db->q($options['title_key']));

			$db->setQuery($query)->execute();
		}

		// Insert the new row
		$options = (object) $options;
		$db->insertObject($tableName, $options);

		return $this;
	}
}
components/com_postinstall/views/messages/view.html.php000060400000003032152453623450017540 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_postinstall
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Model class to display postinstall messages
 *
 * @since  3.2
 */
class PostinstallViewMessages extends FOFViewHtml
{
	/**
	 * Executes before rendering the page for the Browse task.
	 *
	 * @param   string  $tpl  Subtemplate to use
	 *
	 * @return  boolean  Return true to allow rendering of the page
	 *
	 * @since   3.2
	 */
	protected function onBrowse($tpl = null)
	{
		/** @var PostinstallModelMessages $model */
		$model = $this->getModel();

		$this->eid = (int) $model->getState('eid', '700', 'int');

		if (empty($this->eid))
		{
			$this->eid = 700;
		}

		$this->token = JFactory::getSession()->getFormToken();
		$this->extension_options = $model->getComponentOptions();

		JToolBarHelper::title(JText::sprintf('COM_POSTINSTALL_MESSAGES_TITLE', $model->getExtensionName($this->eid)));

		return parent::onBrowse($tpl);
	}

	/**
	 * Executes on display of the page
	 *
	 * @param   string  $tpl  Subtemplate to use
	 *
	 * @return  boolean  Return true to allow rendering of the page
	 *
	 * @since   3.8.7
	 */
	protected function onDisplay($tpl = null)
	{
		$return = parent::onDisplay($tpl);

		if (!empty($this->items))
		{
			JToolbarHelper::custom('hideAll', 'unpublish.png', 'unpublish_f2.png', 'COM_POSTINSTALL_HIDE_ALL_MESSAGES', false);
		}

		return $return;
	}
}
components/com_postinstall/views/messages/tmpl/default.xml000060400000000332152453623450020234 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_POSTINSTALL_MESSAGES_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_POSTINSTALL_MESSAGES_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_postinstall/views/messages/tmpl/default.php000060400000006566152453623450020242 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_postinstall
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;

$lang     = Factory::getLanguage();
$renderer = Factory::getDocument()->loadRenderer('module');
$options  = array('style' => 'raw');
$mod      = JModuleHelper::getModule('mod_feed');
$param    = array(
	'rssurl'      => 'https://www.joomla.org/announcements/release-news.feed?type=rss',
	'rsstitle'    => 0,
	'rssdesc'     => 0,
	'rssimage'    => 1,
	'rssitems'    => 5,
	'rssitemdesc' => 1,
	'rssitemdate' => 1,
	'rssrtl'      => $lang->isRtl() ? 1 : 0,
	'word_count'  => 200,
	'cache'       => 0,
	);
$params = array('params' => json_encode($param));

JHtml::_('formbehavior.chosen', 'select');
?>

<form action="index.php" method="post" name="adminForm" class="form-inline" id="adminForm">
	<input type="hidden" name="option" value="com_postinstall">
	<input type="hidden" name="task" value="">
	<?php echo JHtml::_('form.token'); ?>
	<label for="eid"><?php echo JText::_('COM_POSTINSTALL_MESSAGES_FOR'); ?></label>
	<?php echo JHtml::_('select.genericlist', $this->extension_options, 'eid', array('onchange' => 'this.form.submit()', 'class' => 'input-xlarge'), 'value', 'text', $this->eid, 'eid'); ?>
</form>

<?php if ($this->eid == 700) : ?>
<div class="row-fluid">
	<div class="span8">
<?php endif; ?>
		<?php if (empty($this->items)) : ?>
			<div class="hero-unit">
				<h2><?php echo JText::_('COM_POSTINSTALL_LBL_NOMESSAGES_TITLE'); ?></h2>
				<p><?php echo JText::_('COM_POSTINSTALL_LBL_NOMESSAGES_DESC'); ?></p>
				<a href="index.php?option=com_postinstall&amp;view=messages&amp;task=reset&amp;eid=<?php echo $this->eid; ?>&amp;<?php echo $this->token; ?>=1" class="btn btn-warning btn-large">
					<span class="icon icon-eye-open" aria-hidden="true"></span>
					<?php echo JText::_('COM_POSTINSTALL_BTN_RESET'); ?>
				</a>
			</div>
		<?php else : ?>
			<?php foreach ($this->items as $item) : ?>
			<fieldset>
				<legend><?php echo JText::_($item->title_key); ?></legend>
				<p class="small">
					<?php echo JText::sprintf('COM_POSTINSTALL_LBL_SINCEVERSION', $item->version_introduced); ?>
				</p>
				<div>
					<?php echo JText::_($item->description_key); ?>
					<?php if ($item->type !== 'message') : ?>
					<a href="index.php?option=com_postinstall&amp;view=messages&amp;task=action&amp;id=<?php echo $item->postinstall_message_id; ?>&amp;<?php echo $this->token; ?>=1" class="btn btn-primary">
						<?php echo JText::_($item->action_key); ?>
					</a>
					<?php endif; ?>
					<?php if (Factory::getUser()->authorise('core.edit.state', 'com_postinstall')) : ?>
					<a href="index.php?option=com_postinstall&amp;view=message&amp;task=unpublish&amp;id=<?php echo $item->postinstall_message_id; ?>&amp;<?php echo $this->token; ?>=1" class="btn btn-inverse btn-small">
						<?php echo JText::_('COM_POSTINSTALL_BTN_HIDE'); ?>
					</a>
					<?php endif; ?>
				</div>
			</fieldset>
			<?php endforeach; ?>
		<?php endif; ?>
<?php if ($this->eid == 700) : ?>
	</div>
	<div class="span4"<?php if ($lang->isRtl()) : ?> style="padding-right: 20px;"<?php endif; ?>>
		<h2><?php echo JText::_('COM_POSTINSTALL_LBL_RELEASENEWS'); ?></h2>
		<?php echo $renderer->render($mod, $params, $options); ?>
	</div>
</div>
<?php endif; ?>
components/com_postinstall/controllers/message.php000060400000004131152453623450016652 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_postinstall
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Postinstall message controller.
 *
 * @since  3.2
 */
class PostinstallControllerMessage extends FOFController
{
	/**
	 * Resets all post-installation messages of the specified extension.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function reset()
	{
		// CSRF prevention.
		$this->_csrfProtection();

		/** @var PostinstallModelMessages $model */
		$model = $this->getThisModel();

		$eid = (int) $model->getState('eid', '700', 'int');

		if (empty($eid))
		{
			$eid = 700;
		}

		$model->resetMessages($eid);

		$this->setRedirect('index.php?option=com_postinstall&eid=' . $eid);
	}

	/**
	 * Hides all post-installation messages of the specified extension.
	 *
	 * @return  void
	 *
	 * @since   3.8.7
	 */
	public function hideAll()
	{
		// CSRF prevention.
		$this->_csrfProtection();

		/** @var PostinstallModelMessages $model */
		$model = $this->getThisModel();

		$eid = (int) $model->getState('eid', '700', 'int');

		if (empty($eid))
		{
			$eid = 700;
		}

		$model->hideMessages($eid);

		$this->setRedirect('index.php?option=com_postinstall&eid=' . $eid);
	}

	/**
	 * Executes the action associated with an item.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function action()
	{
		// CSRF prevention.
		$this->_csrfProtection();

		$model = $this->getThisModel();

		if (!$model->getId())
		{
			$model->setIDsFromRequest();
		}

		$item = $model->getItem();

		switch ($item->type)
		{
			case 'link':
				$this->setRedirect($item->action);

				return;

				break;

			case 'action':
				jimport('joomla.filesystem.file');

				$file = FOFTemplateUtils::parsePath($item->action_file, true);

				if (JFile::exists($file))
				{
					require_once $file;

					call_user_func($item->action);
				}
				break;

			case 'message':
			default:
				break;
		}

		$this->setRedirect('index.php?option=com_postinstall');
	}
}
components/com_newsfeeds/sql/uninstall.mysql.utf8.sql000060400000000046152453623450017141 0ustar00DROP TABLE IF EXISTS `#__newsfeeds`;

components/com_newsfeeds/sql/install.mysql.utf8.sql000060400000003512152453623450016577 0ustar00--
-- Table structure for table `#__newsfeeds`
--

CREATE TABLE IF NOT EXISTS `#__newsfeeds` (
  `catid` int NOT NULL DEFAULT 0,
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL DEFAULT '',
  `alias` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '',
  `link` varchar(2048) NOT NULL DEFAULT '',
  `published` tinyint NOT NULL DEFAULT 0,
  `numarticles` int unsigned NOT NULL DEFAULT 1,
  `cache_time` int unsigned NOT NULL DEFAULT 3600,
  `checked_out` int unsigned NOT NULL DEFAULT 0,
  `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `ordering` int NOT NULL DEFAULT 0,
  `rtl` tinyint NOT NULL DEFAULT 0,
  `access` int unsigned NOT NULL DEFAULT 0,
  `language` char(7) NOT NULL DEFAULT '',
  `params` text NOT NULL,
  `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `created_by` int 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 unsigned NOT NULL DEFAULT 0,
  `metakey` text NOT NULL,
  `metadesc` text NOT NULL,
  `metadata` text NOT NULL,
  `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',
  `description` text NOT NULL,
  `version` int unsigned NOT NULL DEFAULT 1,
  `hits` int unsigned NOT NULL DEFAULT 0,
  `images` text NOT NULL,
  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_language` (`language`),
  KEY `idx_xreference` (`xreference`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci;
components/com_newsfeeds/models/fields/modal/newsfeed.php000060400000023453152453623450017724 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Language\LanguageHelper;

/**
 * Supports a modal newsfeeds picker.
 *
 * @since  1.6
 */
class JFormFieldModal_Newsfeed extends JFormField
{
	/**
	 * The form field type.
	 *
	 * @var     string
	 * @since   1.6
	 */
	protected $type = 'Modal_Newsfeed';

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string  The field input markup.
	 *
	 * @since   1.6
	 */
	protected function getInput()
	{
		$allowNew       = ((string) $this->element['new'] == 'true');
		$allowEdit      = ((string) $this->element['edit'] == 'true');
		$allowClear     = ((string) $this->element['clear'] != 'false');
		$allowSelect    = ((string) $this->element['select'] != 'false');
		$allowPropagate = ((string) $this->element['propagate'] == 'true');

		$languages = LanguageHelper::getContentLanguages(array(0, 1));

		// Load language
		JFactory::getLanguage()->load('com_newsfeeds', JPATH_ADMINISTRATOR);

		// The active newsfeed id field.
		$value = (int) $this->value > 0 ? (int) $this->value : '';

		// Create the modal id.
		$modalId = 'Newsfeed_' . $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 jSelectNewsfeed_" . $this->id . "(id, title, object) {
					window.processModalSelect('Newsfeed', '" . $this->id . "', id, title, '', object);
				}
				"
				);

				JText::script('JGLOBAL_ASSOCIATIONS_PROPAGATE_FAILED');

				$scriptSelect[$this->id] = true;
			}
		}

		// Setup variables for display.
		$linkNewsfeeds = 'index.php?option=com_newsfeeds&amp;view=newsfeeds&amp;layout=modal&amp;tmpl=component&amp;' . JSession::getFormToken() . '=1';
		$linkNewsfeed  = 'index.php?option=com_newsfeeds&amp;view=newsfeed&amp;layout=modal&amp;tmpl=component&amp;' . JSession::getFormToken() . '=1';
		$modalTitle    = JText::_('COM_NEWSFEEDS_CHANGE_FEED');

		if (isset($this->element['language']))
		{
			$linkNewsfeeds .= '&amp;forcedLanguage=' . $this->element['language'];
			$linkNewsfeed  .= '&amp;forcedLanguage=' . $this->element['language'];
			$modalTitle    .= ' &#8212; ' . $this->element['label'];
		}

		$urlSelect = $linkNewsfeeds . '&amp;function=jSelectNewsfeed_' . $this->id;
		$urlEdit   = $linkNewsfeed . '&amp;task=newsfeed.edit&amp;id=\' + document.getElementById("' . $this->id . '_id").value + \'';
		$urlNew    = $linkNewsfeed . '&amp;task=newsfeed.add';

		if ($value)
		{
			$db    = JFactory::getDbo();
			$query = $db->getQuery(true)
				->select($db->quoteName('name'))
				->from($db->quoteName('#__newsfeeds'))
				->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_NEWSFEEDS_SELECT_A_FEED') : htmlspecialchars($title, ENT_QUOTES, 'UTF-8');

		// The current newsfeed display field.
		$html  = '<span class="input-append">';
		$html .= '<input class="input-medium" id="' . $this->id . '_name" type="text" value="' . $title . '" disabled="disabled" size="35" />';

		// Select newsfeed button
		if ($allowSelect)
		{
			$html .= '<button'
				. ' type="button"'
				. ' class="btn hasTooltip' . ($value ? ' hidden' : '') . '"'
				. ' id="' . $this->id . '_select"'
				. ' data-toggle="modal"'
				. ' data-target="#ModalSelect' . $modalId . '"'
				. ' title="' . JHtml::tooltipText('COM_NEWSFEEDS_CHANGE_FEED') . '">'
				. '<span class="icon-file" aria-hidden="true"></span> ' . JText::_('JSELECT')
				. '</button>';
		}

		// New newsfeed button
		if ($allowNew)
		{
			$html .= '<button'
				. ' type="button"'
				. ' class="btn hasTooltip' . ($value ? ' hidden' : '') . '"'
				. ' id="' . $this->id . '_new"'
				. ' data-toggle="modal"'
				. ' data-target="#ModalNew' . $modalId . '"'
				. ' title="' . JHtml::tooltipText('COM_NEWSFEEDS_NEW_NEWSFEED') . '">'
				. '<span class="icon-new" aria-hidden="true"></span> ' . JText::_('JACTION_CREATE')
				. '</button>';
		}

		// Edit newsfeed button
		if ($allowEdit)
		{
			$html .= '<button'
				. ' type="button"'
				. ' class="btn hasTooltip' . ($value ? '' : ' hidden') . '"'
				. ' id="' . $this->id . '_edit"'
				. ' data-toggle="modal"'
				. ' data-target="#ModalEdit' . $modalId . '"'
				. ' title="' . JHtml::tooltipText('COM_NEWSFEEDS_EDIT_NEWSFEED') . '">'
				. '<span class="icon-edit" aria-hidden="true"></span> ' . JText::_('JACTION_EDIT')
				. '</button>';
		}

		// Clear newsfeed button
		if ($allowClear)
		{
			$html .= '<button'
				. ' type="button"'
				. ' class="btn' . ($value ? '' : ' hidden') . '"'
				. ' id="' . $this->id . '_clear"'
				. ' onclick="window.processModalParent(\'' . $this->id . '\'); return false;">'
				. '<span class="icon-remove" aria-hidden="true"></span>' . JText::_('JCLEAR')
				. '</button>';
		}

		// Propagate newsfeed button
		if ($allowPropagate && count($languages) > 2)
		{
			// Strip off language tag at the end
			$tagLength = (int) strlen($this->element['language']);
			$callbackFunctionStem = substr("jSelectNewsfeed_" . $this->id, 0, -$tagLength);

			$html .= '<a'
			. ' class="btn hasTooltip' . ($value ? '' : ' hidden') . '"'
			. ' id="' . $this->id . '_propagate"'
			. ' href="#"'
			. ' title="' . JHtml::tooltipText('JGLOBAL_ASSOCIATIONS_PROPAGATE_TIP') . '"'
			. ' onclick="Joomla.propagateAssociation(\'' . $this->id . '\', \'' . $callbackFunctionStem . '\');">'
			. '<span class="icon-refresh" aria-hidden="true"></span>' . JText::_('JGLOBAL_ASSOCIATIONS_PROPAGATE_BUTTON')
			. '</a>';
		}

		$html .= '</span>';

		// Select newsfeed modal
		if ($allowSelect)
		{
			$html .= JHtml::_(
				'bootstrap.renderModal',
				'ModalSelect' . $modalId,
				array(
					'title'       => $modalTitle,
					'url'         => $urlSelect,
					'height'      => '400px',
					'width'       => '800px',
					'bodyHeight'  => '70',
					'modalWidth'  => '80',
					'footer'      => '<button type="button" class="btn" data-dismiss="modal">' . JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>',
				)
			);
		}

		// New newsfeed modal
		if ($allowNew)
		{
			$html .= JHtml::_(
				'bootstrap.renderModal',
				'ModalNew' . $modalId,
				array(
					'title'       => JText::_('COM_NEWSFEEDS_NEW_NEWSFEED'),
					'backdrop'    => 'static',
					'keyboard'    => false,
					'closeButton' => false,
					'url'         => $urlNew,
					'height'      => '400px',
					'width'       => '800px',
					'bodyHeight'  => '70',
					'modalWidth'  => '80',
					'footer'      => '<button type="button" class="btn"'
							. ' onclick="window.processModalEdit(this, \''
							. $this->id . '\', \'add\', \'newsfeed\', \'cancel\', \'newsfeed-form\', \'jform_id\', \'jform_name\'); return false;">'
							. JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>'
							. '<button type="button" class="btn btn-primary"'
							. ' onclick="window.processModalEdit(this, \''
							. $this->id . '\', \'add\', \'newsfeed\', \'save\', \'newsfeed-form\', \'jform_id\', \'jform_name\'); return false;">'
							. JText::_('JSAVE') . '</button>'
							. '<button type="button" class="btn btn-success"'
							. ' onclick="window.processModalEdit(this, \''
							. $this->id . '\', \'add\', \'newsfeed\', \'apply\', \'newsfeed-form\', \'jform_id\', \'jform_name\'); return false;">'
							. JText::_('JAPPLY') . '</button>',
				)
			);
		}

		// Edit newsfeed modal.
		if ($allowEdit)
		{
			$html .= JHtml::_(
				'bootstrap.renderModal',
				'ModalEdit' . $modalId,
				array(
					'title'       => JText::_('COM_NEWSFEEDS_EDIT_NEWSFEED'),
					'backdrop'    => 'static',
					'keyboard'    => false,
					'closeButton' => false,
					'url'         => $urlEdit,
					'height'      => '400px',
					'width'       => '800px',
					'bodyHeight'  => '70',
					'modalWidth'  => '80',
					'footer'      => '<button type="button" class="btn"'
							. ' onclick="window.processModalEdit(this, \'' . $this->id
							. '\', \'edit\', \'newsfeed\', \'cancel\', \'newsfeed-form\', \'jform_id\', \'jform_name\'); return false;">'
							. JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>'
							. '<button type="button" class="btn btn-primary"'
							. ' onclick="window.processModalEdit(this, \''
							. $this->id . '\', \'edit\', \'newsfeed\', \'save\', \'newsfeed-form\', \'jform_id\', \'jform_name\'); return false;">'
							. JText::_('JSAVE') . '</button>'
							. '<button type="button" class="btn btn-success"'
							. ' onclick="window.processModalEdit(this, \''
							. $this->id . '\', \'edit\', \'newsfeed\', \'apply\', \'newsfeed-form\', \'jform_id\', \'jform_name\'); return false;">'
							. JText::_('JAPPLY') . '</button>',
				)
			);
		}

		// Add class='required' for client side validation
		$class = $this->required ? ' class="required modal-value"' : '';

		$html .= '<input type="hidden" id="' . $this->id . '_id"' . $class . ' data-required="' . (int) $this->required . '" name="' . $this->name
			. '" data-text="' . htmlspecialchars(JText::_('COM_NEWSFEEDS_SELECT_A_FEED', true), ENT_COMPAT, 'UTF-8') . '" value="' . $value . '" />';

		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());
	}
}
components/com_newsfeeds/models/fields/newsfeeds.php000060400000002226152453623450017006 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JFormHelper::loadFieldClass('list');

/**
 * News Feed List field.
 *
 * @since  1.6
 */
class JFormFieldNewsfeeds extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var		string
	 * @since   1.6
	 */
	protected $type = 'Newsfeeds';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   1.6
	 */
	protected function getOptions()
	{
		$options = array();

		$db    = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('id As value, name As text')
			->from('#__newsfeeds AS a')
			->order('a.name');

		// Get the options.
		$db->setQuery($query);

		try
		{
			$options = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $db->getMessage());
		}

		// Merge any additional options in the XML definition.
		$options = array_merge(parent::getOptions(), $options);

		return $options;
	}
}
components/com_newsfeeds/models/newsfeed.php000060400000030255152453623450015360 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;

JLoader::register('NewsfeedsHelper', JPATH_ADMINISTRATOR . '/components/com_newsfeeds/helpers/newsfeeds.php');

/**
 * Newsfeed model.
 *
 * @since  1.6
 */
class NewsfeedsModelNewsfeed extends JModelAdmin
{
	/**
	 * The type alias for this content type.
	 *
	 * @var      string
	 * @since    3.2
	 */
	public $typeAlias = 'com_newsfeeds.newsfeed';

	/**
	 * The context used for the associations table
	 *
	 * @var string
	 * @since    3.4.4
	 */
	protected $associationsContext = 'com_newsfeeds.item';

	/**
	 * @var     string    The prefix to use with controller messages.
	 * @since   1.6
	 */
	protected $text_prefix = 'COM_NEWSFEEDS';

	/**
	 * 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;
		}

		if (!empty($record->catid))
		{
			return JFactory::getUser()->authorise('core.delete', 'com_newsfeed.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)
	{
		if (!empty($record->catid))
		{
			return JFactory::getUser()->authorise('core.edit.state', 'com_newsfeeds.category.' . (int) $record->catid);
		}

		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 = 'Newsfeed', $prefix = 'NewsfeedsTable', $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    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_newsfeeds.newsfeed', 'newsfeed', array('control' => 'jform', 'load_data' => $loadData));

		if (empty($form))
		{
			return false;
		}

		// Determine correct permissions to check.
		if ($this->getState('newsfeed.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('published', 'disabled', 'true');
			$form->setFieldAttribute('publish_up', 'disabled', 'true');
			$form->setFieldAttribute('publish_down', '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');
			$form->setFieldAttribute('publish_up', 'filter', 'unset');
			$form->setFieldAttribute('publish_down', '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.
		$data = JFactory::getApplication()->getUserState('com_newsfeeds.edit.newsfeed.data', array());

		if (empty($data))
		{
			$data = $this->getItem();

			// Prime some default values.
			if ($this->getState('newsfeed.id') == 0)
			{
				$app = JFactory::getApplication();
				$data->set('catid', $app->input->get('catid', $app->getUserState('com_newsfeeds.newsfeeds.filter.category_id'), 'int'));
			}
		}

		$this->preprocessData('com_newsfeeds.newsfeed', $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');

		// Create new category, if needed.
		$createCategory = true;

		// If category ID is provided, check if it's valid.
		if (is_numeric($data['catid']) && $data['catid'])
		{
			$createCategory = !CategoriesHelper::validateCategoryId($data['catid'], 'com_newsfeeds');
		}

		// Save New Category
		if ($createCategory && $this->canCreateCategory())
		{
			$table = array();

			// Remove #new# prefix, if exists.
			$table['title'] = strpos($data['catid'], '#new#') === 0 ? substr($data['catid'], 5) : $data['catid'];
			$table['parent_id'] = 1;
			$table['extension'] = 'com_newsfeeds';
			$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;
		}

		return parent::save($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)
	{
		if ($item = parent::getItem($pk))
		{
			// Convert the params field to an array.
			$registry = new Registry($item->metadata);
			$item->metadata = $registry->toArray();

			// Convert the images field to an array.
			$registry = new Registry($item->images);
			$item->images = $registry->toArray();
		}

		// Load associated newsfeeds items
		$app = JFactory::getApplication();
		$assoc = JLanguageAssociations::isEnabled();

		if ($assoc)
		{
			$item->associations = array();

			if ($item->id != null)
			{
				$associations = JLanguageAssociations::getAssociations('com_newsfeeds', '#__newsfeeds', 'com_newsfeeds.item', $item->id);

				foreach ($associations as $tag => $association)
				{
					$item->associations[$tag] = $association->id;
				}
			}
		}

		if (!empty($item->id))
		{
			$item->tags = new JHelperTags;
			$item->tags->getTagIds($item->id, 'com_newsfeeds.newsfeed');
			$item->metadata['tags'] = $item->tags;
		}

		return $item;
	}

	/**
	 * Prepare and sanitise the table prior to saving.
	 *
	 * @param   JTable  $table  The table object
	 *
	 * @return  void
	 */
	protected function prepareTable($table)
	{
		$date = JFactory::getDate();
		$user = JFactory::getUser();

		$table->name = htmlspecialchars_decode($table->name, ENT_QUOTES);
		$table->alias = JApplicationHelper::stringURLSafe($table->alias, $table->language);

		if (empty($table->alias))
		{
			$table->alias = JApplicationHelper::stringURLSafe($table->name, $table->language);
		}

		if (empty($table->id))
		{
			// Set the values
			$table->created = $date->toSql();

			// 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('#__newsfeeds'));
				$db->setQuery($query);
				$max = $db->loadResult();

				$table->ordering = $max + 1;
			}
		}
		else
		{
			// Set the values
			$table->modified = $date->toSql();
			$table->modified_by = $user->get('id');
		}

		// Increment the content version number.
		$table->version++;
	}

	/**
	 * 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   1.6
	 */
	public function publish(&$pks, $value = 1)
	{
		$result = parent::publish($pks, $value);

		// Clean extra cache for newsfeeds
		$this->cleanCache('feed_parser');

		return $result;
	}

	/**
	 * A protected method to get a set of ordering conditions.
	 *
	 * @param   object  $table  A record object.
	 *
	 * @return  array  An array of conditions to add to add to ordering queries.
	 *
	 * @since   1.6
	 */
	protected function getReorderConditions($table)
	{
		$condition = array();
		$condition[] = 'catid = ' . (int) $table->catid;

		return $condition;
	}

	/**
	 * A protected method to get a set of ordering conditions.
	 *
	 * @param   JForm   $form   The form object.
	 * @param   array   $data   The data to be injected into the form
	 * @param   string  $group  The plugin group to process
	 *
	 * @return  array  An array of conditions to add to add to ordering queries.
	 *
	 * @since   1.6
	 */
	protected function preprocessForm(JForm $form, $data, $group = 'content')
	{
		if ($this->canCreateCategory())
		{
			$form->setFieldAttribute('catid', 'allowAdd', 'true');

			// Add a prefix for categories created on the fly.
			$form->setFieldAttribute('catid', 'customPrefix', '#new#');
		}

		// Association newsfeeds items
		if (JLanguageAssociations::isEnabled())
		{
			$languages = JLanguageHelper::getContentLanguages(false, true, null, 'ordering', 'asc');

			if (count($languages) > 1)
			{
				$addform = new SimpleXMLElement('<form />');
				$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_newsfeed');
					$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');
					$field->addAttribute('propagate', 'true');
				}

				$form->load($addform, false);
			}
		}

		parent::preprocessForm($form, $data, $group);
	}

	/**
	 * 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_newsfeeds');
	}

	/**
	 * Method to validate the form data.
	 *
	 * @param   JForm   $form   The form to validate against.
	 * @param   array   $data   The data to validate.
	 * @param   string  $group  The name of the field group to validate.
	 *
	 * @return  array|boolean  Array of filtered data if valid, false otherwise.
	 *
	 * @see     JFormRule
	 * @see     JFilterInput
	 * @since   3.9.25
	 */
	public function validate($form, $data, $group = null)
	{
		// Don't allow to change the users if not allowed to access com_users.
		if (!JFactory::getUser()->authorise('core.manage', 'com_users'))
		{
			if (isset($data['created_by']))
			{
				unset($data['created_by']);
			}
		}

		return parent::validate($form, $data, $group);
	}
}
components/com_newsfeeds/models/forms/newsfeed.xml000060400000024754152453623450016526 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>

	<fieldset addfieldpath="/administrator/components/com_categories/models/fields" >

		<field
			name="id"
			type="number"
			label="JGLOBAL_FIELD_ID_LABEL"
			description="JGLOBAL_FIELD_ID_DESC"
			default="0"
			class="readonly"
			readonly="true"
		/>

		<field
			name="name"
			type="text"
			label="JGLOBAL_TITLE"
			description="JFIELD_TITLE_DESC"
			class="input-xxlarge input-large-text"
			size="40"
			required="true"
		/>

		<field
			name="alias"
			type="text"
			label="JFIELD_ALIAS_LABEL"
			description="JFIELD_ALIAS_DESC"
			size="45"
			hint="JFIELD_ALIAS_PLACEHOLDER"
		/>

		<field
			name="published"
			type="list"
			label="JSTATUS"
			description="JFIELD_PUBLISHED_DESC"
			default="1"
			class="chzn-color-state"
			size="1"
			>
			<option value="1">JPUBLISHED</option>
			<option value="0">JUNPUBLISHED</option>
			<option value="2">JARCHIVED</option>
			<option value="-2">JTRASHED</option>
		</field>

		<field
			name="catid"
			type="categoryedit"
			label="JCATEGORY"
			description="COM_NEWSFEEDS_FIELD_CATEGORY_DESC"
			extension="com_newsfeeds"
			required="true"
			default=""
		/>

		<field
			name="language"
			type="contentlanguage"
			label="JFIELD_LANGUAGE_LABEL"
			description="COM_NEWSFEEDS_FIELD_LANGUAGE_DESC"
			>
			<option value="*">JALL</option>
		</field>

		<field
			name="tags"
			type="tag"
			label="JTAG"
			description="JTAG_DESC"
			class="span12"
			multiple="true"
		/>

		<field
			name="version_note"
			type="text"
			label="JGLOBAL_FIELD_VERSION_NOTE_LABEL"
			description="JGLOBAL_FIELD_VERSION_NOTE_DESC"
			labelclass="control-label"
			class="span12"
			size="45"
			maxlength="255"
		/>

		<field
			name="description"
			type="editor"
			label="JGLOBAL_DESCRIPTION"
			description="COM_NEWSFEEDS_FIELD_DESCRIPTION_DESC"
			buttons="true"
			hide="pagebreak,readmore"
			filter="JComponentHelper::filterText"
		/>

		<field
			name="link"
			type="url"
			label="COM_NEWSFEEDS_FIELD_LINK_LABEL"
			description="COM_NEWSFEEDS_FIELD_LINK_DESC"
			class="span12"
			size="60"
			required="true"
			filter="url"
			validate="url"
		/>

		<field
			name="numarticles"
			type="number"
			label="COM_NEWSFEEDS_FIELD_NUM_ARTICLES_LABEL"
			description="COM_NEWSFEEDS_FIELD_NUM_ARTICLES_DESC"
			default="5"
			size="2"
		/>

		<field
			name="cache_time"
			type="number"
			label="COM_NEWSFEEDS_FIELD_CACHETIME_LABEL"
			description="JGLOBAL_FIELD_FIELD_CACHETIME_DESC"
			default="3600"
			size="4"
		/>

		<field
			name="ordering"
			type="ordering"
			label="JFIELD_ORDERING_LABEL"
			description="JFIELD_ORDERING_DESC"
			content_type="com_newsfeeds.newsfeed"
		/>

		<field
			name="created"
			type="calendar"
			label="JGLOBAL_FIELD_CREATED_LABEL"
			description="JGLOBAL_FIELD_CREATED_DESC"
			translateformat="true"
			showtime="true"
			size="22"
			filter="user_utc"
		/>

		<field
			name="created_by"
			type="user"
			label="JGLOBAL_FIELD_Created_by_Label"
			description="JGLOBAL_FIELD_CREATED_BY_DESC"
		/>

		<field
			name="created_by_alias"
			type="text"
			label="JGLOBAL_FIELD_Created_by_alias_Label"
			description="JGLOBAL_FIELD_CREATED_BY_ALIAS_DESC"
			size="20"
		/>

		<field
			name="modified"
			type="calendar"
			label="JGLOBAL_FIELD_Modified_Label"
			description="COM_NEWSFEEDS_FIELD_MODIFIED_DESC"
			class="readonly"
			translateformat="true"
			showtime="true"
			size="22"
			readonly="true"
			filter="user_utc"
		/>

		<field
			name="modified_by"
			type="user"
			label="JGLOBAL_FIELD_MODIFIED_BY_LABEL"
			description="COM_NEWSFEEDS_FIELD_MODIFIED_BY_DESC"
			class="readonly"
			readonly="true"
			filter="unset"
		/>

		<field
			name="version"
			type="text"
			label="COM_NEWSFEEDS_FIELD_VERSION_LABEL"
			description="COM_NEWSFEEDS_FIELD_VERSION_DESC"
			class="readonly"
			size="6"
			readonly="true"
			filter="unset"
		/>

		<field
			name="checked_out"
			type="Text"
			label="JGLOBAL_FIELD_CHECKEDOUT_LABEL"
			description="JGLOBAL_FIELD_CHECKEDOUT_DESC"
			size="6"
			readonly="true"
			filter="unset"
		/>

		<field
			name="checked_out_time"
			type="Text"
			label="JGLOBAL_FIELD_CHECKEDOUT_TIME_LABEL"
			description="JGLOBAL_FIELD_CHECKEDOUT_TIME_DESC"
			size="6"
			readonly="true"
			filter="unset"
		/>

		<field
			name="publish_up"
			type="calendar"
			label="JGLOBAL_FIELD_PUBLISH_UP_LABEL"
			description="JGLOBAL_FIELD_PUBLISH_UP_DESC"
			translateformat="true"
			showtime="true"
			size="22"
			filter="user_utc"
		/>

		<field
			name="publish_down"
			type="calendar"
			label="JGLOBAL_FIELD_PUBLISH_DOWN_LABEL"
			description="JGLOBAL_FIELD_PUBLISH_DOWN_DESC"
			translateformat="true"
			showtime="true"
			size="22"
			filter="user_utc"
		/>

		<field
			name="access"
			type="accesslevel"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			size="1"
		/>

		<field
			name="metakey"
			type="textarea"
			label="JFIELD_META_KEYWORDS_LABEL"
			description="JFIELD_META_KEYWORDS_DESC"
			rows="3"
			cols="30"
		/>

		<field
			name="metadesc"
			type="textarea"
			label="JFIELD_META_DESCRIPTION_LABEL"
			description="JFIELD_META_DESCRIPTION_DESC"
			rows="3"
			cols="30"
		/>

		<field
			name="xreference"
			type="text"
			label="JFIELD_XREFERENCE_LABEL"
			description="JFIELD_XREFERENCE_DESC"
			size="20"
		/>

		<fields name="images">

			<fieldset name="images" label="JGLOBAL_FIELDSET_IMAGE_OPTIONS">

				<field
					name="image_first"
					type="media"
					label="COM_NEWSFEEDS_FIELD_FIRST_LABEL"
					description="COM_NEWSFEEDS_FIELD_FIRST_DESC"
				/>

				<field
					name="float_first"
					type="list"
					label="COM_NEWSFEEDS_FLOAT_LABEL"
					description="COM_NEWSFEEDS_FLOAT_DESC"
					useglobal="true"
					>
					<option value="right">COM_NEWSFEEDS_RIGHT</option>
					<option value="left">COM_NEWSFEEDS_LEFT</option>
					<option value="none">COM_NEWSFEEDS_NONE</option>
				</field>

				<field
					name="image_first_alt"
					type="text"
					label="COM_NEWSFEEDS_FIELD_IMAGE_ALT_LABEL"
					description="COM_NEWSFEEDS_FIELD_IMAGE_ALT_DESC"
					size="20"
				/>

				<field
					name="image_first_caption"
					type="text"
					label="COM_NEWSFEEDS_FIELD_IMAGE_CAPTION_LABEL"
					description="COM_NEWSFEEDS_FIELD_IMAGE_CAPTION_DESC"
					size="20"
				/>

				<field
					name="spacer1"
					type="spacer"
					hr="true"
				/>

				<field
					name="image_second"
					type="media"
					label="COM_NEWSFEEDS_FIELD_SECOND_LABEL"
					description="COM_NEWSFEEDS_FIELD_SECOND_DESC"
				/>

				<field
					name="float_second"
					type="list"
					label="COM_NEWSFEEDS_FLOAT_LABEL"
					description="COM_NEWSFEEDS_FLOAT_DESC"
					useglobal="true"
					>
					<option value="right">COM_NEWSFEEDS_RIGHT</option>
					<option value="left">COM_NEWSFEEDS_LEFT</option>
					<option value="none">COM_NEWSFEEDS_NONE</option>
				</field>

				<field
					name="image_second_alt"
					type="text"
					label="COM_NEWSFEEDS_FIELD_IMAGE_ALT_LABEL"
					description="COM_NEWSFEEDS_FIELD_IMAGE_ALT_DESC"
					size="20"
				/>

				<field
					name="image_second_caption"
					type="text"
					label="COM_NEWSFEEDS_FIELD_IMAGE_CAPTION_LABEL"
					description="COM_NEWSFEEDS_FIELD_IMAGE_CAPTION_DESC"
					size="20"
				/>
			</fieldset>
		</fields>
	</fieldset>

	<fieldset name="jbasic" label="JGLOBAL_FIELDSET_DISPLAY_OPTIONS">

		<field
			name="numarticles"
			type="number"
			label="COM_NEWSFEEDS_FIELD_NUM_ARTICLES_LABEL"
			description="COM_NEWSFEEDS_FIELD_NUM_ARTICLES_DESC"
			default="5"
			size="2"
		/>

		<field
			name="cache_time"
			type="number"
			label="COM_NEWSFEEDS_FIELD_CACHETIME_LABEL"
			description="JGLOBAL_FIELD_FIELD_CACHETIME_DESC"
			default="3600"
			size="4"
		/>

		<field
			name="rtl"
			type="list"
			label="COM_NEWSFEEDS_FIELD_RTL_LABEL"
			description="COM_NEWSFEEDS_FIELD_RTL_DESC"
			default="0"
			>
			<option value="0">COM_NEWSFEEDS_FIELD_VALUE_SITE</option>
			<option value="1">COM_NEWSFEEDS_FIELD_VALUE_LTR</option>
			<option value="2">COM_NEWSFEEDS_FIELD_VALUE_RTL</option>
		</field>

		<fields name="params" label="JGLOBAL_FIELDSET_DISPLAY_OPTIONS">

			<field
				name="show_feed_image"
				type="list"
				label="COM_NEWSFEEDS_FIELD_SHOW_FEED_IMAGE_LABEL"
				description="COM_NEWSFEEDS_FIELD_SHOW_FEED_IMAGE_DESC"
				useglobal="true"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="show_feed_description"
				type="list"
				label="COM_NEWSFEEDS_FIELD_SHOW_FEED_DESCRIPTION_LABEL"
				description="COM_NEWSFEEDS_FIELD_SHOW_FEED_DESCRIPTION_DESC"
				useglobal="true"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="show_item_description"
				type="list"
				label="COM_NEWSFEEDS_FIELD_SHOW_ITEM_DESCRIPTION_LABEL"
				description="COM_NEWSFEEDS_FIELD_SHOW_ITEM_DESCRIPTION_DESC"
				useglobal="true"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="feed_character_count"
				type="number"
				label="COM_NEWSFEEDS_FIELD_CHARACTERS_COUNT_LABEL"
				description="COM_NEWSFEEDS_FIELD_CHARACTERS_COUNT_DESC"
				size="6"
				useglobal="true"
			/>

			<field
				name="newsfeed_layout"
				type="componentlayout"
				label="JFIELD_ALT_LAYOUT_LABEL"
				description="JFIELD_ALT_COMPONENT_LAYOUT_DESC"
				extension="com_newsfeeds"
				view="newsfeed"
				useglobal="true"
			/>

			<field
				name="feed_display_order"
				type="list"
				label="COM_NEWSFEEDS_FIELD_FEED_DISPLAY_ORDER_LABEL"
				description="COM_NEWSFEEDS_FIELD_FEED_DISPLAY_ORDER_DESC"
				useglobal="true"
				>
				<option value="des">JGLOBAL_MOST_RECENT_FIRST</option>
				<option value="asc">JGLOBAL_OLDEST_FIRST</option>
			</field>
		</fields>
	</fieldset>

	<fields name="metadata" label="JGLOBAL_FIELDSET_METADATA_OPTIONS">

		<fieldset name="jmetadata" label="JGLOBAL_FIELDSET_METADATA_OPTIONS">

			<field
				name="robots"
				type="list"
				label="JFIELD_METADATA_ROBOTS_LABEL"
				description="JFIELD_METADATA_ROBOTS_DESC"
				>
				<option value="">JGLOBAL_USE_GLOBAL</option>
				<option value="index, follow"></option>
				<option value="noindex, follow"></option>
				<option value="index, nofollow"></option>
				<option value="noindex, nofollow"></option>
			</field>

			<field
				name="rights"
				type="text"
				label="JFIELD_META_RIGHTS_LABEL"
				description="JFIELD_META_RIGHTS_DESC"
				rows="2"
				cols="30"
				filter="string"
			/>

			<field
				name="hits"
				type="number"
				label="JGLOBAL_HITS"
				description="COM_NEWSFEEDS_HITS_DESC"
				class="readonly"
				size="6"
				readonly="true"
				filter="unset"
			/>
		</fieldset>
	</fields>
</form>
components/com_newsfeeds/models/forms/filter_newsfeeds.xml000060400000007302152453623450020244 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>

	<fields name="filter">

		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_NEWSFEEDS_FILTER_SEARCH_LABEL"
			description="COM_NEWSFEEDS_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
		/>

		<field
			name="published"
			type="status"
			label="COM_NEWSFEEDS_FILTER_PUBLISHED"
			description="COM_NEWSFEEDS_FILTER_PUBLISHED_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>

		<field
			name="category_id"
			type="category"
			label="JOPTION_FILTER_CATEGORY"
			description="JOPTION_FILTER_CATEGORY_DESC"
			extension="com_newsfeeds"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_CATEGORY</option>
		</field>

		<field
			name="access"
			type="accesslevel"
			label="JOPTION_FILTER_ACCESS"
			description="JOPTION_FILTER_ACCESS_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_ACCESS</option>
		</field>

		<field
			name="language"
			type="contentlanguage"
			label="JOPTION_FILTER_LANGUAGE"
			description="JOPTION_FILTER_LANGUAGE_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_LANGUAGE</option>
			<option value="*">JALL</option>
		</field>

		<field
			name="tag"
			type="tag"
			label="JOPTION_FILTER_TAG"
			description="JOPTION_FILTER_TAG_DESC"
			mode="nested"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_TAG</option>
		</field>

		<field
			name="level"
			type="integer"
			label="JOPTION_FILTER_LEVEL"
			description="JOPTION_FILTER_LEVEL_DESC"
			first="1"
			last="10"
			step="1"
			languages="*"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_MAX_LEVELS</option>
		</field>
	</fields>

	<fields name="list">

		<field
			name="fullordering"
			type="list"
			label="COM_NEWSFEEDS_LIST_FULL_ORDERING"
			description="COM_NEWSFEEDS_LIST_FULL_ORDERING_DESC"
			onchange="this.form.submit();"
			default="a.name ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.published ASC">JSTATUS_ASC</option>
			<option value="a.published DESC">JSTATUS_DESC</option>
			<option value="a.name ASC">JGLOBAL_TITLE_ASC</option>
			<option value="a.name DESC">JGLOBAL_TITLE_DESC</option>
			<option value="category_title ASC">JCATEGORY_ASC</option>
			<option value="category_title DESC">JCATEGORY_DESC</option>
			<option value="access_level ASC">JGRID_HEADING_ACCESS_ASC</option>
			<option value="access_level DESC">JGRID_HEADING_ACCESS_DESC</option>
			<option value="numarticles ASC">COM_NEWSFEEDS_NUM_ARTICLES_HEADING_ASC</option>
			<option value="numarticles DESC">COM_NEWSFEEDS_NUM_ARTICLES_HEADING_DESC</option>
			<option value="a.cache_time ASC">COM_NEWSFEEDS_CACHE_TIME_HEADING_ASC</option>
			<option value="a.cache_time DESC">COM_NEWSFEEDS_CACHE_TIME_HEADING_DESC</option>
			<option
				value="association ASC"
				requires="associations"
				>
				JASSOCIATIONS_ASC
			</option>
			<option
				value="association DESC"
				requires="associations"
				>
				JASSOCIATIONS_DESC
			</option>
			<option value="language_title ASC">JGRID_HEADING_LANGUAGE_ASC</option>
			<option value="language_title DESC">JGRID_HEADING_LANGUAGE_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="COM_NEWSFEEDS_LIST_LIMIT"
			description="COM_NEWSFEEDS_LIST_LIMIT_DESC"
			default="25"
			class="input-mini"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_newsfeeds/models/newsfeeds.php000060400000023033152453623450015537 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Methods supporting a list of newsfeed records.
 *
 * @since  1.6
 */
class NewsfeedsModelNewsfeeds extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'name', 'a.name',
				'alias', 'a.alias',
				'checked_out', 'a.checked_out',
				'checked_out_time', 'a.checked_out_time',
				'catid', 'a.catid', 'category_id', 'category_title',
				'published', 'a.published',
				'access', 'a.access', 'access_level',
				'created', 'a.created',
				'created_by', 'a.created_by',
				'ordering', 'a.ordering',
				'language', 'a.language', 'language_title',
				'publish_up', 'a.publish_up',
				'publish_down', 'a.publish_down',
				'cache_time', 'a.cache_time',
				'numarticles',
				'tag',
				'level', 'c.level',
				'tag',
			);

			$assoc = JLanguageAssociations::isEnabled();

			if ($assoc)
			{
				$config['filter_fields'][] = 'association';
			}
		}

		parent::__construct($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')
	{
		$app = JFactory::getApplication();

		$forcedLanguage = $app->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;
		}

		// 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.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'));

		// Load the parameters.
		$params = JComponentHelper::getParams('com_newsfeeds');
		$this->setState('params', $params);

		// 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.
	 */
	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.access');
		$id .= ':' . $this->getState('filter.language');
		$id .= ':' . $this->getState('filter.level');
		$id .= ':' . serialize($this->getState('filter.tag'));

		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);
		$user  = JFactory::getUser();
		$app   = JFactory::getApplication();

		// Select the required fields from the table.
		$query->select(
			$this->getState(
				'list.select',
				'a.id, a.name, a.alias, a.checked_out, a.checked_out_time, a.catid,' .
				' a.numarticles, a.cache_time, a.created_by,' .
				' a.published, a.access, a.ordering, a.language, a.publish_up, a.publish_down'
			)
		);
		$query->from($db->quoteName('#__newsfeeds', 'a'));

		// 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->qn('l.lang_code') . ' = ' . $db->qn('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->qn('uc.id') . ' = ' . $db->qn('a.checked_out'));

		// Join over the asset groups.
		$query->select($db->quoteName('ag.title', 'access_level'))
			->join('LEFT', $db->quoteName('#__viewlevels', 'ag') . ' ON ' . $db->qn('ag.id') . ' = ' . $db->qn('a.access'));

		// Join over the categories.
		$query->select($db->quoteName('c.title', 'category_title'))
			->join('LEFT', $db->quoteName('#__categories', 'c') . ' ON ' . $db->qn('c.id') . ' = ' . $db->qn('a.catid'));

		// Join over the associations.
		$assoc = JLanguageAssociations::isEnabled();

		if ($assoc)
		{
			$subQuery = $db->getQuery(true)
				->select('COUNT(' . $db->quoteName('asso1.id') . ') > 1')
				->from($db->quoteName('#__associations', 'asso1'))
				->join('INNER', $db->quoteName('#__associations', 'asso2') . ' ON ' . $db->quoteName('asso1.key') . ' = ' . $db->quoteName('asso2.key'))
				->where(
					array(
						$db->quoteName('asso1.id') . ' = ' . $db->quoteName('a.id'),
						$db->quoteName('asso1.context') . ' = ' . $db->quote('com_newsfeeds.item'),
					)
				);

			$query->select('(' . $subQuery . ') AS ' . $db->quoteName('association'));
		}

		// 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'))
		{
			$query->where($db->quoteName('a.access') . ' IN (' . implode(',', $user->getAuthorisedViewLevels()) . ')');
		}

		// 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') . ' 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 on the level.
		if ($level = $this->getState('filter.level'))
		{
			$query->where($db->quoteName('c.level') . ' <= ' . (int) $level);
		}

		// 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 by a single or group of tags.
		$tag = $this->getState('filter.tag');

		// Run simplified query when filtering by one tag.
		if (\is_array($tag) && \count($tag) === 1)
		{
			$tag = $tag[0];
		}

		if ($tag && \is_array($tag))
		{
			$tag = ArrayHelper::toInteger($tag);

			$subQuery = $db->getQuery(true)
				->select('DISTINCT ' . $db->quoteName('content_item_id'))
				->from($db->quoteName('#__contentitem_tag_map'))
				->where(
					array(
						$db->quoteName('tag_id') . ' IN (' . implode(',', $tag) . ')',
						$db->quoteName('type_alias') . ' = ' . $db->quote('com_newsfeeds.newsfeed'),
					)
				);

			$query->join(
				'INNER',
				'(' . $subQuery . ') AS ' . $db->quoteName('tagmap')
					. ' ON ' . $db->quoteName('tagmap.content_item_id') . ' = ' . $db->quoteName('a.id')
			);
		}
		elseif ($tag = (int) $tag)
		{
			$query->join(
				'INNER',
				$db->quoteName('#__contentitem_tag_map', 'tagmap')
				. ' ON ' . $db->quoteName('tagmap.content_item_id') . ' = ' . $db->quoteName('a.id')
			)
				->where(
					array(
						$db->quoteName('tagmap.tag_id') . ' = ' . $tag,
						$db->quoteName('tagmap.type_alias') . ' = ' . $db->quote('com_newsfeeds.newsfeed'),
					)
				);
		}

		// 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';
		}

		$query->order($db->escape($orderCol . ' ' . $orderDirn));

		return $query;
	}
}
components/com_newsfeeds/helpers/html/newsfeed.php000060400000004764152453623450016511 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('NewsfeedsHelper', JPATH_ADMINISTRATOR . '/components/com_newsfeeds/helpers/newsfeeds.php');

/**
 * Utility class for creating HTML Grids.
 *
 * @since  1.5
 */
class JHtmlNewsfeed
{
	/**
	 * Get the associated language flags
	 *
	 * @param   int  $newsfeedid  The item id to search associations
	 *
	 * @return  string  The language HTML
	 *
	 * @throws  Exception  Throws a 500 Exception on Database failure
	 */
	public static function association($newsfeedid)
	{
		// Defaults
		$html = '';

		// Get the associations
		if ($associations = JLanguageAssociations::getAssociations('com_newsfeeds', '#__newsfeeds', 'com_newsfeeds.item', $newsfeedid))
		{
			foreach ($associations as $tag => $associated)
			{
				$associations[$tag] = (int) $associated->id;
			}

			// Get the associated newsfeed items
			$db = JFactory::getDbo();
			$query = $db->getQuery(true)
				->select('c.id, c.name as title')
				->select('l.sef as lang_sef, lang_code')
				->from('#__newsfeeds 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 != ' . $newsfeedid)
				->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);
			}

			if ($items)
			{
				foreach ($items as &$item)
				{
					$text = strtoupper($item->lang_sef);
					$url = JRoute::_('index.php?option=com_newsfeeds&task=newsfeed.edit&id=' . (int) $item->id);
					$tooltip = htmlspecialchars($item->title, ENT_QUOTES, 'UTF-8') . '<br />' . JText::sprintf('JCATEGORY_SPRINTF', $item->category_title);
					$classes = 'hasPopover label label-association label-' . $item->lang_sef;

					$item->link = '<a href="' . $url . '" title="' . $item->language_title . '" class="' . $classes
						. '" data-content="' . $tooltip . '" data-placement="top">'
						. $text . '</a>';
				}
			}

			JHtml::_('bootstrap.popover');

			$html = JLayoutHelper::render('joomla.content.associations', $items);
		}

		return $html;
	}
}
components/com_newsfeeds/helpers/newsfeeds.php000060400000003762152453623450015725 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Newsfeeds component helper.
 *
 * @since  1.6
 */
class NewsfeedsHelper extends JHelperContent
{
	public static $extension = 'com_newsfeeds';

	/**
	 * Configure the Linkbar.
	 *
	 * @param   string  $vName  The name of the active view.
	 *
	 * @return  void
	 */
	public static function addSubmenu($vName)
	{
		JHtmlSidebar::addEntry(
			JText::_('COM_NEWSFEEDS_SUBMENU_NEWSFEEDS'),
			'index.php?option=com_newsfeeds&view=newsfeeds',
			$vName == 'newsfeeds'
		);

		JHtmlSidebar::addEntry(
			JText::_('COM_NEWSFEEDS_SUBMENU_CATEGORIES'),
			'index.php?option=com_categories&extension=com_newsfeeds',
			$vName == 'categories'
		);
	}

	/**
	 * Adds Count Items for Category Manager.
	 *
	 * @param   stdClass[]  &$items  The category objects
	 *
	 * @return  stdClass[]
	 *
	 * @since   3.5
	 */
	public static function countItems(&$items)
	{
		$config = (object) array(
			'related_tbl'   => 'newsfeeds',
			'state_col'     => 'published',
			'group_col'     => 'catid',
			'relation_type' => 'category_or_group',
		);

		return parent::countRelations($items, $config);
	}

	/**
	 * Adds Count Items for Tag Manager.
	 *
	 * @param   stdClass[]  &$items     The tag objects
	 * @param   string      $extension  The name of the active view.
	 *
	 * @return  stdClass[]
	 *
	 * @since   3.6
	 */
	public static function countTagItems(&$items, $extension)
	{
		$parts   = explode('.', $extension);
		$section = count($parts) > 1 ? $parts[1] : null;

		$config = (object) array(
			'related_tbl'   => ($section === 'category' ? 'categories' : 'newsfeeds'),
			'state_col'     => 'published',
			'group_col'     => 'tag_id',
			'extension'     => $extension,
			'relation_type' => 'tag_assigments',
		);

		return parent::countRelations($items, $config);
	}
}
components/com_newsfeeds/helpers/associations.php000060400000007135152453623450016437 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Association\AssociationExtensionHelper;

JTable::addIncludePath(__DIR__ . '/../tables');

/**
 * Content associations helper.
 *
 * @since  3.7.0
 */
class NewsfeedsAssociationsHelper extends AssociationExtensionHelper
{
	/**
	 * The extension name
	 *
	 * @var       array   $extension
	 *
	 * @since    3.7.0
	 */
	protected $extension = 'com_newsfeeds';

	/**
	 * Array of item types
	 *
	 * @var       array   $itemTypes
	 *
	 * @since    3.7.0
	 */
	protected $itemTypes = array('newsfeed', 'category');

	/**
	 * Has the extension association support
	 *
	 * @var       boolean   $associationsSupport
	 *
	 * @since    3.7.0
	 */
	protected $associationsSupport = true;

	/**
	 * Get the associated items for an item
	 *
	 * @param   string  $typeName  The item type
	 * @param   int     $id        The id of item for which we need the associated items
	 *
	 * @return  array
	 *
	 * @since   3.7.0
	 */
	public function getAssociations($typeName, $id)
	{
		$type = $this->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 'newsfeed':
				$table = JTable::getInstance('Newsfeed', 'NewsfeedsTable');
				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 'newsfeed':
					$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' => '#__newsfeeds'
					);
					$title = 'newsfeed';
					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
		);
	}
}
components/com_newsfeeds/newsfeeds.php000060400000001134152453623450014252 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
JHtml::_('behavior.tabstate');

if (!JFactory::getUser()->authorise('core.manage', 'com_newsfeeds'))
{
	throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
}

$controller = JControllerLegacy::getInstance('Newsfeeds');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
components/com_newsfeeds/controllers/ajax.json.php000060400000004522152453623450016534 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Language\LanguageHelper;

/**
 * The newsfeed controller for ajax requests
 *
 * @since  3.9.0
 */
class NewsfeedsControllerAjax extends JControllerLegacy
{
	/**
	 * Method to fetch associations of a newsfeed
	 *
	 * The method assumes that the following http parameters are passed in an Ajax Get request:
	 * token: the form token
	 * assocId: the id of the newsfeed whose associations are to be returned
	 * excludeLang: the association for this language is to be excluded
	 *
	 * @return  null
	 *
	 * @since  3.9.0
	 */
	public function fetchAssociations()
	{
		if (!JSession::checkToken('get'))
		{
			echo new JResponseJson(null, JText::_('JINVALID_TOKEN'), true);
		}
		else
		{
			$input = JFactory::getApplication()->input;

			$assocId = $input->getInt('assocId', 0);

			if ($assocId == 0)
			{
				echo new JResponseJson(null, JText::sprintf('JLIB_FORM_VALIDATE_FIELD_INVALID', 'assocId'), true);

				return;
			}

			$excludeLang = $input->get('excludeLang', '', 'STRING');

			$associations = JLanguageAssociations::getAssociations('com_newsfeeds', '#__newsfeeds', 'com_newsfeeds.item', (int) $assocId);

			unset($associations[$excludeLang]);

			// Add the title to each of the associated records
			JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_newsfeeds/tables');
			$newsfeedsTable = JTable::getInstance('Newsfeed', 'NewsfeedsTable');

			foreach ($associations as $lang => $association)
			{
				$newsfeedsTable->load($association->id);
				$associations[$lang]->title = $newsfeedsTable->name;
			}

			$countContentLanguages = count(LanguageHelper::getContentLanguages(array(0, 1)));

			if (count($associations) == 0)
			{
				$message = JText::_('JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_NONE');
			}
			elseif ($countContentLanguages > count($associations) + 2)
			{
				$tags    = implode(', ', array_keys($associations));
				$message = JText::sprintf('JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_SOME', $tags);
			}
			else
			{
				$message = JText::_('JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_ALL');
			}

			echo new JResponseJson($associations, $message);
		}
	}
}
components/com_newsfeeds/controllers/newsfeed.php000060400000005736152453623450016451 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Newsfeed controller class.
 *
 * @since  1.6
 */
class NewsfeedsControllerNewsfeed extends JControllerForm
{
	/**
	 * 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())
	{
		$categoryId = ArrayHelper::getValue($data, 'catid', $this->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 absence of better information, revert to the component permissions.
			return parent::allowAdd($data);
		}
		else
		{
			return $allow;
		}
	}

	/**
	 * 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 = '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)
	{
		$this->checkToken();

		// Set the model
		$model = $this->getModel('Newsfeed', '', array());

		// Preset the redirect
		$this->setRedirect(JRoute::_('index.php?option=com_newsfeeds&view=newsfeeds' . $this->getRedirectToListAppend(), false));

		return parent::batch($model);
	}

	/**
	 * 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())
	{

	}
}
components/com_newsfeeds/controllers/newsfeeds.php000060400000002314152453623450016621 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Newsfeeds list controller class.
 *
 * @since  1.6
 */
class NewsfeedsControllerNewsfeeds extends JControllerAdmin
{
	/**
	 * 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.6
	 */
	public function getModel($name = 'Newsfeed', $prefix = 'NewsfeedsModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	/**
	 * Function that allows child controller access to model data
	 * after the item has been deleted.
	 *
	 * @param   JModelLegacy  $model  The data model object.
	 * @param   integer       $ids    The validated data.
	 *
	 * @return  void
	 *
	 * @since   3.1
	 */
	protected function postDeleteHook(JModelLegacy $model, $ids = null)
	{
	}
}
components/com_newsfeeds/newsfeeds.xml000060400000004310152453623450014262 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_newsfeeds</name>
	<author>Joomla! Project</author>
	<creationDate>April 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_NEWSFEEDS_XML_DESCRIPTION</description>
	<install> <!-- Runs on install -->
		<sql>
			<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
		</sql>
	</install>
	<uninstall> <!-- Runs on uninstall -->
		<sql>
			<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
		</sql>
	</uninstall>

	<files folder="site">
		<filename>controller.php</filename>
		<filename>metadata.xml</filename>
		<filename>newsfeeds.php</filename>
		<filename>router.php</filename>
		<folder>helpers</folder>
		<folder>models</folder>
		<folder>views</folder>
	</files>
	<languages folder="site">
		<language tag="en-GB">language/en-GB.com_newsfeeds.ini</language>
	</languages>
	<administration>
		<menu img="class:newsfeeds">com_newsfeeds</menu>
		<submenu>
			<!--
				Note that all & must be escaped to &amp; for the file to be valid
				XML and be parsed by the installer
			-->
			<menu link="option=com_newsfeeds" view="feeds" img="class:newsfeeds"
				alt="Newsfeeds/Feeds">com_newsfeeds_feeds</menu>
			<menu link="option=com_categories&amp;extension=com_newsfeeds"
				view="categories" img="class:newsfeeds-cat" alt="Newsfeeds/Categories">com_newsfeeds_categories</menu>
		</submenu>
		<files folder="admin">
			<filename>access.xml</filename>
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<filename>newsfeeds.php</filename>
			<folder>controllers</folder>
			<folder>elements</folder>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>tables</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_newsfeeds.ini</language>
			<language tag="en-GB">language/en-GB.com_newsfeeds.sys.ini</language>
		</languages>
	</administration>
</extension>
components/com_newsfeeds/views/newsfeeds/view.html.php000060400000012653152453623450017334 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of newsfeeds.
 *
 * @since  1.6
 */
class NewsfeedsViewNewsfeeds extends JViewLegacy
{
	/**
	 * The list of newsfeeds
	 *
	 * @var    JObject
	 * @since  1.6
	 */
	protected $items;

	/**
	 * The pagination object
	 *
	 * @var    JPagination
	 * @since  1.6
	 */
	protected $pagination;

	/**
	 * The model state
	 *
	 * @var    JObject
	 * @since  1.6
	 */
	protected $state;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		$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');

		// Modal layout doesn't need the submenu.
		if ($this->getLayout() !== 'modal')
		{
			NewsfeedsHelper::addSubmenu('newsfeeds');
		}

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			JError::raiseError(500, implode("\n", $errors));

			return false;
		}

		// We don't need toolbar in the modal layout.
		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('<field name="language" type="hidden" default="' . $forcedLanguage . '" />');
				$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   1.6
	 */
	protected function addToolbar()
	{
		$state = $this->get('State');
		$canDo = JHelperContent::getActions('com_newsfeeds', 'category', $state->get('filter.category_id'));
		$user  = JFactory::getUser();

		// Get the toolbar object instance
		$bar = JToolbar::getInstance('toolbar');
		JToolbarHelper::title(JText::_('COM_NEWSFEEDS_MANAGER_NEWSFEEDS'), 'feed newsfeeds');

		if (count($user->getAuthorisedCategories('com_newsfeeds', 'core.create')) > 0)
		{
			JToolbarHelper::addNew('newsfeed.add');
		}

		if ($canDo->get('core.edit') || $canDo->get('core.edit.own'))
		{
			JToolbarHelper::editList('newsfeed.edit');
		}

		if ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::publish('newsfeeds.publish', 'JTOOLBAR_PUBLISH', true);
			JToolbarHelper::unpublish('newsfeeds.unpublish', 'JTOOLBAR_UNPUBLISH', true);
			JToolbarHelper::archiveList('newsfeeds.archive');
		}

		if ($canDo->get('core.admin'))
		{
			JToolbarHelper::checkin('newsfeeds.checkin');
		}

		// Add a batch button
		if ($user->authorise('core.create', 'com_newsfeeds')
			&& $user->authorise('core.edit', 'com_newsfeeds')
			&& $user->authorise('core.edit.state', 'com_newsfeeds'))
		{
			$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 ($state->get('filter.published') == -2 && $canDo->get('core.delete'))
		{
			JToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'newsfeeds.delete', 'JTOOLBAR_EMPTY_TRASH');
		}
		elseif ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::trash('newsfeeds.trash');
		}

		if ($user->authorise('core.admin', 'com_newsfeeds') || $user->authorise('core.options', 'com_newsfeeds'))
		{
			JToolbarHelper::preferences('com_newsfeeds');
		}

		JToolbarHelper::help('JHELP_COMPONENTS_NEWSFEEDS_FEEDS');
	}

	/**
	 * 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.ordering'     => JText::_('JGRID_HEADING_ORDERING'),
			'a.published'    => JText::_('JSTATUS'),
			'a.name'         => JText::_('JGLOBAL_TITLE'),
			'category_title' => JText::_('JCATEGORY'),
			'a.access'       => JText::_('JGRID_HEADING_ACCESS'),
			'numarticles'    => JText::_('COM_NEWSFEEDS_NUM_ARTICLES_HEADING'),
			'a.cache_time'   => JText::_('COM_NEWSFEEDS_CACHE_TIME_HEADING'),
			'a.language'     => JText::_('JGRID_HEADING_LANGUAGE'),
			'a.id'           => JText::_('JGRID_HEADING_ID')
		);
	}
}
components/com_newsfeeds/views/newsfeeds/tmpl/default_batch_body.php000060400000001751152453623450022172 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;
$published = (int) $this->state->get('filter.published');
?>

<div class="container-fluid">
	<div class="row-fluid">
		<div class="control-group span6">
			<div class="controls">
				<?php echo JHtml::_('batch.language'); ?>
			</div>
		</div>
		<div class="control-group span6">
			<div class="controls">
				<?php echo JHtml::_('batch.access'); ?>
			</div>
		</div>
	</div>
	<div class="row-fluid">
		<?php if ($published >= 0) : ?>
			<div class="control-group span6">
				<div class="controls">
					<?php echo JHtml::_('batch.item', 'com_newsfeeds'); ?>
				</div>
			</div>
		<?php endif; ?>
		<div class="control-group span6">
			<div class="controls">
				<?php echo JHtml::_('batch.tag'); ?>
			</div>
		</div>
	</div>
</div>
components/com_newsfeeds/views/newsfeeds/tmpl/default.php000060400000020103152453623450020004 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$user      = JFactory::getUser();
$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_newsfeeds&task=newsfeeds.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'newsfeedList', 'adminForm', strtolower($listDirn), $saveOrderingUrl);
}
?>
<form action="<?php echo JRoute::_('index.php?option=com_newsfeeds&view=newsfeeds'); ?>" method="post" name="adminForm" id="adminForm">
	<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
	<?php else : ?>
	<div id="j-main-container">
	<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<div class="clearfix"></div>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped" id="newsfeedList">
				<thead>
					<tr>
						<th width="1%" class="nowrap center hidden-phone">
							<?php echo JHtml::_('searchtools.sort', '', 'a.ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING', 'icon-menu-2'); ?>
						</th>
						<th width="1%">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th width="5%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.published', $listDirn, $listOrder); ?>
						</th>
						<th class="title">
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.name', $listDirn, $listOrder); ?>
						</th>
						<th width="5%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ACCESS', 'access_level', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_NEWSFEEDS_NUM_ARTICLES_HEADING', 'numarticles', $listDirn, $listOrder); ?>
						</th>
						<th width="5%" class="nowrap hidden-phone hidden-tablet">
							<?php echo JHtml::_('searchtools.sort', 'COM_NEWSFEEDS_CACHE_TIME_HEADING', 'a.cache_time', $listDirn, $listOrder); ?>
						</th>
						<?php if ($assoc) : ?>
						<th width="5%" class="nowrap hidden-phone hidden-tablet">
							<?php echo JHtml::_('searchtools.sort', 'COM_NEWSFEEDS_HEADING_ASSOCIATION', 'association', $listDirn, $listOrder); ?>
						</th>
						<?php endif; ?>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'language_title', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="11">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
				<?php foreach ($this->items as $i => $item) :
					$ordering   = ($listOrder == 'a.ordering');
					$canCreate  = $user->authorise('core.create',     'com_newsfeeds.category.' . $item->catid);
					$canEdit    = $user->authorise('core.edit',       'com_newsfeeds.category.' . $item->catid);
					$canCheckin = $user->authorise('core.manage',     'com_checkin') || $item->checked_out == $user->get('id') || $item->checked_out == 0;
					$canEditOwn = $user->authorise('core.edit.own',   'com_newsfeeds.category.' . $item->catid) && $item->created_by == $user->id;
					$canChange  = $user->authorise('core.edit.state', 'com_newsfeeds.category.' . $item->catid) && $canCheckin;
					?>
					<tr class="row<?php echo $i % 2; ?>" sortable-group-id="<?php echo $item->catid; ?>">
						<td class="order nowrap center hidden-phone">
							<?php
							$iconClass = '';
							if (!$canChange)
							{
								$iconClass = ' inactive';
							}
							elseif (!$saveOrder)
							{
								$iconClass = ' inactive tip-top hasTooltip" title="' . JHtml::_('tooltipText', 'JORDERINGDISABLED');
							}
							?>
							<span class="sortable-handler<?php echo $iconClass ?>">
								<span class="icon-menu" aria-hidden="true"></span>
							</span>
							<?php if ($canChange && $saveOrder) : ?>
								<input type="text" style="display:none" name="order[]" size="5" value="<?php echo $item->ordering; ?>" class="width-20 text-area-order" />
							<?php endif; ?>
						</td>
						<td class="center">
							<?php echo JHtml::_('grid.id', $i, $item->id); ?>
						</td>
						<td class="center">
							<div class="btn-group">
								<?php echo JHtml::_('jgrid.published', $item->published, $i, 'newsfeeds.', $canChange, 'cb', $item->publish_up, $item->publish_down); ?>
								<?php // Create dropdown items and render the dropdown list.
								if ($canChange)
								{
									JHtml::_('actionsdropdown.' . ((int) $item->published === 2 ? 'un' : '') . 'archive', 'cb' . $i, 'newsfeeds');
									JHtml::_('actionsdropdown.' . ((int) $item->published === -2 ? 'un' : '') . 'trash', 'cb' . $i, 'newsfeeds');
									echo JHtml::_('actionsdropdown.render', $this->escape($item->name));
								}
								?>
							</div>
						</td>
						<td class="nowrap has-context">
							<div class="pull-left">
								<?php if ($item->checked_out) : ?>
									<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'newsfeeds.', $canCheckin); ?>
								<?php endif; ?>
								<?php if ($canEdit || $canEditOwn) : ?>
									<a href="<?php echo JRoute::_('index.php?option=com_newsfeeds&task=newsfeed.edit&id=' . (int) $item->id); ?>">
										<?php echo $this->escape($item->name); ?></a>
								<?php else : ?>
										<?php echo $this->escape($item->name); ?>
								<?php endif; ?>
								<span class="small">
									<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias)); ?>
								</span>
								<div class="small">
									<?php echo JText::_('JCATEGORY') . ': ' . $this->escape($item->category_title); ?>
								</div>
							</div>
						</td>
						<td class="small hidden-phone">
							<?php echo $this->escape($item->access_level); ?>
						</td>
						<td class="hidden-phone">
							<?php echo (int) $item->numarticles; ?>
						</td>
						<td class="hidden-phone hidden-tablet">
							<?php echo (int) $item->cache_time; ?>
						</td>
						<?php if ($assoc) : ?>
						<td class="hidden-phone hidden-tablet">
							<?php if ($item->association) : ?>
								<?php echo JHtml::_('newsfeed.association', $item->id); ?>
							<?php endif; ?>
						</td>
						<?php endif; ?>
						<td class="small hidden-phone">
							<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
						</td>
						<td class="hidden-phone">
							<?php echo (int) $item->id; ?>
						</td>
					</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
			<?php // Load the batch processing form if user is allowed ?>
			<?php if ($user->authorise('core.create', 'com_newsfeeds')
				&& $user->authorise('core.edit', 'com_newsfeeds')
				&& $user->authorise('core.edit.state', 'com_newsfeeds')) : ?>
				<?php echo JHtml::_(
					'bootstrap.renderModal',
					'collapseModal',
					array(
						'title'  => JText::_('COM_NEWSFEEDS_BATCH_OPTIONS'),
						'footer' => $this->loadTemplate('batch_footer'),
					),
					$this->loadTemplate('batch_body')
				); ?>
			<?php endif; ?>
		<?php endif; ?>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_newsfeeds/views/newsfeeds/tmpl/modal.php000060400000011347152453623450017466 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('NewsfeedsHelperRoute', JPATH_ROOT . '/components/com_newsfeeds/helpers/route.php');

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'));

$app = JFactory::getApplication();

$function  = $app->input->getCmd('function', 'jSelectNewsfeed');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>
<div class="container-popup">

	<form action="<?php echo JRoute::_('index.php?option=com_newsfeeds&view=newsfeeds&layout=modal&tmpl=component&function=' . $function); ?>" method="post" name="adminForm" id="adminForm" class="form-inline">

		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>

		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped table-condensed">
				<thead>
					<tr>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.published', $listDirn, $listOrder); ?>
						</th>
						<th class="nowrap title">
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.name', $listDirn, $listOrder); ?>
						</th>
						<th width="15%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ACCESS', 'access_level', $listDirn, $listOrder); ?>
						</th>
						<th width="15%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'language_title', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="5">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
				<?php
				$iconStates = array(
					-2 => 'icon-trash',
					0  => 'icon-unpublish',
					1  => 'icon-publish',
					2  => 'icon-archive',
				);
				?>
				<?php foreach ($this->items as $i => $item) : ?>
					<?php if ($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 = '';
					}
					?>
					<tr class="row<?php echo $i % 2; ?>">
						<td class="center">
							<span class="<?php echo $iconStates[$this->escape($item->published)]; ?>" aria-hidden="true"></span>
						</td>
						<td>
							<a href="javascript:void(0)" onclick="if (window.parent) window.parent.<?php echo $this->escape($function); ?>('<?php echo $item->id; ?>', '<?php echo $this->escape(addslashes($item->name)); ?>', '<?php echo $this->escape($item->catid); ?>', null, '<?php echo $this->escape(NewsfeedsHelperRoute::getNewsfeedRoute($item->id, $item->catid, $item->language)); ?>', '<?php echo $this->escape($lang); ?>', null);">
							<?php echo $this->escape($item->name); ?></a>
							<div class="small">
								<?php echo JText::_('JCATEGORY') . ': ' . $this->escape($item->category_title); ?>
							</div>
						</td>
						<td class="small hidden-phone">
							<?php echo $this->escape($item->access_level); ?>
						</td>
						<td class="small hidden-phone">
							<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
						</td>
						<td class="hidden-phone">
							<?php echo (int) $item->id; ?>
						</td>
					</tr>
				<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif; ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<input type="hidden" name="forcedLanguage" value="<?php echo $app->input->get('forcedLanguage', '', 'CMD'); ?>" />
		<?php echo JHtml::_('form.token'); ?>

	</form>
</div>
components/com_newsfeeds/views/newsfeeds/tmpl/default_batch_footer.php000060400000001364152453623450022533 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

?>
<button type="button" class="btn" onclick="document.getElementById('batch-category-id').value='';document.getElementById('batch-access').value='';document.getElementById('batch-language-id').value='';document.getElementById('batch-tag-id').value=''" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<button type="submit" class="btn btn-success" onclick="Joomla.submitbutton('newsfeed.batch');return false;">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>
components/com_newsfeeds/views/newsfeed/view.html.php000060400000007637152453623450017157 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View to edit a newsfeed.
 *
 * @since  1.6
 */
class NewsfeedsViewNewsfeed extends JViewLegacy
{
	/**
	 * The item object for the newsfeed
	 *
	 * @var    JObject
	 * @since  1.6
	 */
	protected $item;

	/**
	 * The form object for the newsfeed
	 *
	 * @var    JForm
	 * @since  1.6
	 */
	protected $form;

	/**
	 * The model state of the newsfeed
	 *
	 * @var    JObject
	 * @since  1.6
	 */
	protected $state;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		$this->state = $this->get('State');
		$this->item  = $this->get('Item');
		$this->form  = $this->get('Form');

		// 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();
		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->get('id'));

		// Since we don't track these assets at the item level, use the category id.
		$canDo = JHelperContent::getActions('com_newsfeeds', 'category', $this->item->catid);

		JToolbarHelper::title($isNew ? JText::_('COM_NEWSFEEDS_MANAGER_NEWSFEED_NEW') : JText::_('COM_NEWSFEEDS_MANAGER_NEWSFEED_EDIT'), 'feed newsfeeds');

		// If not checked out, can save the item.
		if (!$checkedOut && ($canDo->get('core.edit') || count($user->getAuthorisedCategories('com_newsfeeds', 'core.create')) > 0))
		{
			JToolbarHelper::apply('newsfeed.apply');
			JToolbarHelper::save('newsfeed.save');
		}

		if (!$checkedOut && count($user->getAuthorisedCategories('com_newsfeeds', 'core.create')) > 0)
		{
			JToolbarHelper::save2new('newsfeed.save2new');
		}

		// If an existing item, can save to a copy.
		if (!$isNew && $canDo->get('core.create'))
		{
			JToolbarHelper::save2copy('newsfeed.save2copy');
		}

		if (!$isNew && JLanguageAssociations::isEnabled() && JComponentHelper::isEnabled('com_associations'))
		{
			JToolbarHelper::custom('newsfeed.editAssociations', 'contract', 'contract', 'JTOOLBAR_ASSOCIATIONS', false, false);
		}

		if (empty($this->item->id))
		{
			JToolbarHelper::cancel('newsfeed.cancel');
		}
		else
		{
			if (JComponentHelper::isEnabled('com_contenthistory') && $this->state->params->get('save_history', 0) && $canDo->get('core.edit'))
			{
				JToolbarHelper::versions('com_newsfeeds.newsfeed', $this->item->id);
			}

			JToolbarHelper::cancel('newsfeed.cancel', 'JTOOLBAR_CLOSE');
		}

		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_COMPONENTS_NEWSFEEDS_FEEDS_EDIT');
	}
}
components/com_newsfeeds/views/newsfeed/tmpl/modal_params.php000060400000001613152453623450020641 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$fieldSets = $this->form->getFieldsets('params');
foreach ($fieldSets as $name => $fieldSet) :
	?>
	<div class="tab-pane" id="params-<?php echo $name; ?>">
	<?php if (isset($fieldSet->description) && trim($fieldSet->description)) : ?>
		<p class="alert alert-info"><?php echo $this->escape(JText::_($fieldSet->description)); ?></p>
	<?php endif; ?>
			<?php foreach ($this->form->getFieldset($name) as $field) : ?>
				<div class="control-group">
					<div class="control-label"><?php echo $field->label; ?></div>
					<div class="controls"><?php echo $field->input; ?></div>
				</div>
			<?php endforeach; ?>
	</div>
<?php endforeach; ?>
components/com_newsfeeds/views/newsfeed/tmpl/modal_display.php000060400000000542152453623450021023 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$this->fieldset = 'jbasic';
echo JLayoutHelper::render('joomla.edit.fieldset', $this);
components/com_newsfeeds/views/newsfeed/tmpl/edit_associations.php000060400000000512152453623450021703 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

echo JLayoutHelper::render('joomla.edit.associations', $this);
components/com_newsfeeds/views/newsfeed/tmpl/modal.php000060400000002553152453623450017302 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip', '.hasTooltip', array('placement' => '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', 'jEditNewsfeed_' . (int) $this->item->id);

// Function to update input title when changed
JFactory::getDocument()->addScriptDeclaration('
	function jEditNewsfeedModal() {
		if (window.parent && document.formvalidator.isValid(document.getElementById("newsfeed-form"))) {
			return window.parent.' . $this->escape($function) . '(document.getElementById("jform_name").value);
		}
	}
');
?>
<button id="applyBtn" type="button" class="hidden" onclick="Joomla.submitbutton('newsfeed.apply'); jEditNewsfeedModal();"></button>
<button id="saveBtn" type="button" class="hidden" onclick="Joomla.submitbutton('newsfeed.save'); jEditNewsfeedModal();"></button>
<button id="closeBtn" type="button" class="hidden" onclick="Joomla.submitbutton('newsfeed.cancel');"></button>

<div class="container-popup">
	<?php $this->setLayout('edit'); ?>
	<?php echo $this->loadTemplate(); ?>
</div>
components/com_newsfeeds/views/newsfeed/tmpl/modal_associations.php000060400000000512152453623450022052 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

echo JLayoutHelper::render('joomla.edit.associations', $this);
components/com_newsfeeds/views/newsfeed/tmpl/edit_display.php000060400000000542152453623450020654 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$this->fieldset = 'jbasic';
echo JLayoutHelper::render('joomla.edit.fieldset', $this);
components/com_newsfeeds/views/newsfeed/tmpl/edit.php000060400000010503152453623450017125 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');
JHtml::_('formbehavior.chosen', '#jform_catid', null, array('disable_search_threshold' => 0 ));
JHtml::_('formbehavior.chosen', '#jform_tags', null, array('placeholder_text_multiple' => JText::_('JGLOBAL_TYPE_OR_SELECT_SOME_TAGS')));
JHtml::_('formbehavior.chosen', 'select');

$app   = JFactory::getApplication();
$input = $app->input;

$assoc = JLanguageAssociations::isEnabled();

JFactory::getDocument()->addScriptDeclaration('
	Joomla.submitbutton = function(task)
	{
		if (task == "newsfeed.cancel" || document.formvalidator.isValid(document.getElementById("newsfeed-form"))) {
			Joomla.submitform(task, document.getElementById("newsfeed-form"));

			// @deprecated 4.0  The following js is not needed since 3.7.0.
			if (task !== "newsfeed.apply")
			{
				window.parent.jQuery("#newsfeedEdit' . $this->item->id . 'Modal").modal("hide");
			}
		}
	};
');

// Fieldsets to not automatically render by /layouts/joomla/edit/params.php
$this->ignore_fieldsets = array('images', 'jbasic', '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' : '';
?>

<form action="<?php echo JRoute::_('index.php?option=com_newsfeeds&layout=' . $layout . $tmpl . '&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="newsfeed-form" class="form-validate">

	<?php echo JLayoutHelper::render('joomla.edit.title_alias', $this); ?>

	<div class="form-horizontal">
		<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'details')); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'details', empty($this->item->id) ? JText::_('COM_NEWSFEEDS_NEW_NEWSFEED') : JText::_('COM_NEWSFEEDS_EDIT_NEWSFEED')); ?>
		<div class="row-fluid">
			<div class="span9">
				<div class="form-vertical">
					<?php echo $this->form->renderField('link'); ?>
					<?php echo $this->form->renderField('description'); ?>
				</div>
			</div>
			<div class="span3">
				<?php echo JLayoutHelper::render('joomla.edit.global', $this); ?>
			</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'images', JText::_('JGLOBAL_FIELDSET_IMAGE_OPTIONS')); ?>
		<div class="row-fluid">
			<div class="span6">
					<?php echo $this->form->renderField('images'); ?>
					<?php foreach ($this->form->getGroup('images') as $field) : ?>
						<?php echo $field->renderField(); ?>
					<?php endforeach; ?>
				</div>
			</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'attrib-jbasic', JText::_('JGLOBAL_FIELDSET_DISPLAY_OPTIONS')); ?>
		<?php echo $this->loadTemplate('display'); ?>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php echo JLayoutHelper::render('joomla.edit.params', $this); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'publishing', JText::_('JGLOBAL_FIELDSET_PUBLISHING')); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('joomla.edit.publishingdata', $this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('joomla.edit.metadata', $this); ?>
			</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php if ( ! $isModal && $assoc) : ?>
			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'associations', JText::_('JGLOBAL_FIELDSET_ASSOCIATIONS')); ?>
			<?php echo $this->loadTemplate('associations'); ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php elseif ($isModal && $assoc) : ?>
			<div class="hidden"><?php echo $this->loadTemplate('associations'); ?></div>
		<?php endif; ?>

		<?php echo JHtml::_('bootstrap.endTabSet'); ?>
	</div>
	<input type="hidden" name="task" value="" />
	<input type="hidden" name="forcedLanguage" value="<?php echo $input->get('forcedLanguage', '', 'cmd'); ?>" />
	<?php echo JHtml::_('form.token'); ?>
</form>
components/com_newsfeeds/views/newsfeed/tmpl/modal_metadata.php000060400000000506152453623450021136 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

echo JLayoutHelper::render('joomla.edit.metadata', $this);
components/com_newsfeeds/views/newsfeed/tmpl/edit_metadata.php000060400000000506152453623450020767 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

echo JLayoutHelper::render('joomla.edit.metadata', $this);
components/com_newsfeeds/views/newsfeed/tmpl/edit_params.php000060400000001613152453623450020472 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$fieldSets = $this->form->getFieldsets('params');
foreach ($fieldSets as $name => $fieldSet) :
	?>
	<div class="tab-pane" id="params-<?php echo $name; ?>">
	<?php if (isset($fieldSet->description) && trim($fieldSet->description)) : ?>
		<p class="alert alert-info"><?php echo $this->escape(JText::_($fieldSet->description)); ?></p>
	<?php endif; ?>
			<?php foreach ($this->form->getFieldset($name) as $field) : ?>
				<div class="control-group">
					<div class="control-label"><?php echo $field->label; ?></div>
					<div class="controls"><?php echo $field->input; ?></div>
				</div>
			<?php endforeach; ?>
	</div>
<?php endforeach; ?>
components/com_newsfeeds/access.xml000060400000002715152453623450013547 0ustar00<?xml version="1.0" encoding="utf-8"?>
<access component="com_newsfeeds">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.options" title="JACTION_OPTIONS" description="JACTION_OPTIONS_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
		<action name="core.edit.own" title="JACTION_EDITOWN" description="JACTION_EDITOWN_COMPONENT_DESC" />
	</section>
	<section name="category">
		<action name="core.create" title="JACTION_CREATE" description="COM_CATEGORIES_ACCESS_CREATE_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="COM_CATEGORIES_ACCESS_DELETE_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="COM_CATEGORIES_ACCESS_EDIT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_CATEGORIES_ACCESS_EDITSTATE_DESC" />
		<action name="core.edit.own" title="JACTION_EDITOWN" description="COM_CATEGORIES_ACCESS_EDITOWN_DESC" />
	</section>
</access>components/com_newsfeeds/tables/newsfeed.php000060400000007737152453623450015360 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\String\StringHelper;

/**
 * Newsfeed Table class.
 *
 * @since  1.6
 */
class NewsfeedsTableNewsfeed extends JTable
{
	/**
	 * Ensure the params, metadata and images are json encoded in the bind method
	 *
	 * @var    array
	 * @since  3.3
	 */
	protected $_jsonEncode = array('params', 'metadata', 'images');

	/**
	 * Constructor
	 *
	 * @param   JDatabaseDriver  &$db  A database connector object
	 */
	public function __construct(&$db)
	{
		parent::__construct('#__newsfeeds', 'id', $db);

		$this->setColumnAlias('title', 'name');

		JTableObserverTags::createObserver($this, array('typeAlias' => 'com_newsfeeds.newsfeed'));
		JTableObserverContenthistory::createObserver($this, array('typeAlias' => 'com_newsfeeds.newsfeed'));
	}

	/**
	 * Overloaded check method to ensure data integrity.
	 *
	 * @return  boolean  True on success.
	 */
	public function check()
	{
		// Check for valid name.
		if (trim($this->name) == '')
		{
			$this->setError(JText::_('COM_NEWSFEEDS_WARNING_PROVIDE_VALID_NAME'));

			return false;
		}

		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');
		}

		// 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 if not empty
		if (!empty($this->metakey))
		{
			// Array of characters to remove
			$bad_characters = array("\n", "\r", "\"", '<', '>');

			// Remove bad characters
			$after_clean = StringHelper::str_ireplace($bad_characters, '', $this->metakey);

			// Create array using commas as delimiter
			$keys = explode(',', $after_clean);
			$clean_keys = array();

			foreach ($keys as $key)
			{
				if (trim($key))
				{
					// Ignore blank keywords
					$clean_keys[] = trim($key);
				}
			}

			// Put array back together delimited by ", "
			$this->metakey = implode(', ', $clean_keys);
		}

		// Clean up description -- eliminate quotes and <> brackets
		if (!empty($this->metadesc))
		{
			// Only process if not empty
			$bad_characters = array("\"", '<', '>');
			$this->metadesc = StringHelper::str_ireplace($bad_characters, '', $this->metadesc);
		}

		return true;
	}

	/**
	 * Overriden JTable::store to set modified data.
	 *
	 * @param   boolean  $updateNulls  True to update fields even if they are null.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function store($updateNulls = false)
	{
		$date = JFactory::getDate();
		$user = JFactory::getUser();

		$this->modified = $date->toSql();

		if ($this->id)
		{
			// Existing item
			$this->modified_by = $user->get('id');
		}
		else
		{
			// New newsfeed. A feed 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->toSql();
			}

			if (empty($this->created_by))
			{
				$this->created_by = $user->get('id');
			}
		}

		// Verify that the alias is unique
		$table = JTable::getInstance('Newsfeed', 'NewsfeedsTable', 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_NEWSFEEDS_ERROR_UNIQUE_ALIAS'));

			return false;
		}

		// Save links as punycode.
		$this->link = JStringPunycode::urlToPunycode($this->link);

		return parent::store($updateNulls);
	}
}
components/com_newsfeeds/config.xml000060400000026647152453623450013565 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>

	<fieldset
		name="newsfeed"
		label="COM_NEWSFEEDS_FIELD_CONFIG_NEWSFEED_SETTINGS_LABEL"
		description="COM_NEWSFEEDS_FIELD_CONFIG_NEWSFEED_SETTINGS_DESC"
		>

		<field
			name="newsfeed_layout"
			type="componentlayout"
			label="JGLOBAL_FIELD_LAYOUT_LABEL"
			description="JGLOBAL_FIELD_LAYOUT_DESC"
			menuitems="true"
			extension="com_newsfeeds"
			view="newsfeed"
		/>
		
		<field
			name="save_history"
			type="radio"
			label="JGLOBAL_SAVE_HISTORY_OPTIONS_LABEL"
			description="JGLOBAL_SAVE_HISTORY_OPTIONS_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>
		
		<field
			name="history_limit"
			type="number"
			label="JGLOBAL_HISTORY_LIMIT_OPTIONS_LABEL"
			description="JGLOBAL_HISTORY_LIMIT_OPTIONS_DESC"
			default="5"
			filter="integer"
			showon="save_history:1"
		/>

		<field
			name="show_feed_image"
			type="radio"
			label="COM_NEWSFEEDS_FIELD_SHOW_FEED_IMAGE_LABEL"
			description="COM_NEWSFEEDS_FIELD_SHOW_FEED_IMAGE_DESC"
			id="show_feed_image"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_feed_description"
			type="radio"
			label="COM_NEWSFEEDS_FIELD_SHOW_FEED_DESCRIPTION_LABEL"
			description="COM_NEWSFEEDS_FIELD_SHOW_FEED_DESCRIPTION_DESC"
			id="show_feed_description"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_item_description"
			type="radio"
			label="COM_NEWSFEEDS_FIELD_SHOW_ITEM_DESCRIPTION_LABEL"
			description="COM_NEWSFEEDS_FIELD_SHOW_ITEM_DESCRIPTION_DESC"
			id="show_item_description"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="feed_character_count"
			type="number"
			label="COM_NEWSFEEDS_FIELD_CHARACTER_COUNT_LABEL"
			description="COM_NEWSFEEDS_FIELD_CHARACTER_COUNT_DESC"
			id="feed_character_count"
			default="0"
			size="6"
		/>

		<field 
			name="feed_display_order" 
			type="list"
			label="COM_NEWSFEEDS_FIELD_FEED_DISPLAY_ORDER_LABEL"
			description="COM_NEWSFEEDS_FIELD_FEED_DISPLAY_ORDER_DESC"
			id="feed_display_order"
			>
			<option value="des">JGLOBAL_MOST_RECENT_FIRST</option>
			<option value="asc">JGLOBAL_OLDEST_FIRST</option>
		</field>
		
		<field
			name="float_first"
			type="list"
			label="COM_NEWSFEEDS_FLOAT_FIRST_LABEL"
			description="COM_NEWSFEEDS_FLOAT_DESC"
			>
			<option value="right">COM_NEWSFEEDS_RIGHT</option>
			<option value="left">COM_NEWSFEEDS_LEFT</option>
			<option value="none">COM_NEWSFEEDS_NONE</option>
		</field>

		<field
			name="float_second"
			type="list"
			label="COM_NEWSFEEDS_FLOAT_SECOND_LABEL"
			description="COM_NEWSFEEDS_FLOAT_DESC"
			>
			<option value="right">COM_NEWSFEEDS_RIGHT</option>
			<option value="left">COM_NEWSFEEDS_LEFT</option>
			<option value="none">COM_NEWSFEEDS_NONE</option>
		</field>

		<field
			name="show_tags"
			type="radio"
			label="COM_NEWSFEEDS_FIELD_SHOW_TAGS_LABEL"
			description="COM_NEWSFEEDS_FIELD_SHOW_TAGS_DESC"
			id="show_tags"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>
	</fieldset>

	<fieldset
		name="category"
		label="JCATEGORY"
		description="COM_NEWSFEEDS_FIELD_CONFIG_CATEGORY_SETTINGS_DESC"
		>

		<field
			name="category_layout"
			type="componentlayout"
			label="JGLOBAL_FIELD_LAYOUT_LABEL"
			description="JGLOBAL_FIELD_LAYOUT_DESC"
			menuitems="true"
			extension="com_newsfeeds"
			view="category"
		/>

		<field
			name="show_category_title"
			type="radio"
			label="JGLOBAL_SHOW_CATEGORY_TITLE"
			description="JGLOBAL_SHOW_CATEGORY_TITLE_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_description"
			type="radio"
			label="JGLOBAL_SHOW_CATEGORY_DESCRIPTION_LABEL"
			description="JGLOBAL_SHOW_CATEGORY_DESCRIPTION_DESC"
			id="show_description"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_description_image"
			type="radio"
			label="JGLOBAL_SHOW_CATEGORY_IMAGE_LABEL"
			description="JGLOBAL_SHOW_CATEGORY_IMAGE_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="maxLevel"
			type="list"
			label="JGLOBAL_MAXIMUM_CATEGORY_LEVELS_LABEL"
			description="JGLOBAL_MAXIMUM_CATEGORY_LEVELS_DESC"
			default="-1"
			>
			<option value="0">JNONE</option>
			<option value="-1">JALL</option>
			<option value="1">J1</option>
			<option value="2">J2</option>
			<option value="3">J3</option>
			<option value="4">J4</option>
			<option value="5">J5</option>
		</field>

		<field
			name="show_empty_categories"
			type="radio"
			label="JGLOBAL_SHOW_EMPTY_CATEGORIES_LABEL"
			description="COM_NEWSFEEDS_SHOW_EMPTY_CATEGORIES_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			showon="maxLevel:-1,1,2,3,4,5"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_subcat_desc"
			type="radio"
			label="JGLOBAL_SHOW_SUBCATEGORIES_DESCRIPTION_LABEL"
			description="JGLOBAL_SHOW_SUBCATEGORIES_DESCRIPTION_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			showon="maxLevel:-1,1,2,3,4,5"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_cat_items"
			type="radio"
			label="COM_NEWSFEEDS_FIELD_SHOW_CAT_ITEMS_LABEL"
			description="COM_NEWSFEEDS_FIELD_SHOW_CAT_ITEMS_DESC"
			id="show_cat_items"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_cat_tags"
			type="radio"
			label="COM_NEWSFEEDS_FIELD_SHOW_CAT_TAGS_LABEL"
			description="COM_NEWSFEEDS_FIELD_SHOW_CAT_TAGS_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>
	</fieldset>

	<fieldset
		name="categories"
		label="JCATEGORIES"
		description="COM_NEWSFEEDS_CATEGORIES_DESC"
		>

		<field
			name="show_base_description"
			type="radio"
			label="JGLOBAL_FIELD_SHOW_BASE_DESCRIPTION_LABEL"
			description="JGLOBAL_FIELD_SHOW_BASE_DESCRIPTION_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="maxLevelcat"
			type="list"
			label="JGLOBAL_MAXIMUM_CATEGORY_LEVELS_LABEL"
			description="JGLOBAL_MAXIMUM_CATEGORY_LEVELS_DESC"
			default="-1"
			>
			<option value="-1">JALL</option>
			<option value="0">JNONE</option>
			<option value="1">J1</option>
			<option value="2">J2</option>
			<option value="3">J3</option>
			<option value="4">J4</option>
			<option value="5">J5</option>
		</field>

		<field
			name="show_empty_categories_cat"
			type="radio"
			label="JGLOBAL_SHOW_EMPTY_CATEGORIES_LABEL"
			description="COM_NEWSFEEDS_SHOW_EMPTY_CATEGORIES_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			showon="maxLevelcat:-1,1,2,3,4,5"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_subcat_desc_cat"
			type="radio"
			label="JGLOBAL_SHOW_SUBCATEGORIES_DESCRIPTION_LABEL"
			description="JGLOBAL_SHOW_SUBCATEGORIES_DESCRIPTION_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			showon="maxLevelcat:-1,1,2,3,4,5"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_cat_items_cat"
			type="radio"
			label="COM_NEWSFEEDS_FIELD_SHOW_CAT_ITEMS_LABEL"
			description="COM_NEWSFEEDS_FIELD_SHOW_CAT_ITEMS_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>
	</fieldset>

	<fieldset
		name="listlayout"
		label="JGLOBAL_LIST_LAYOUT_OPTIONS"
		description="COM_NEWSFEEDS_FIELD_CONFIG_LIST_SETTINGS_DESC"
		>

		<field
			name="filter_field"
			type="radio"
			label="JGLOBAL_FILTER_FIELD_LABEL"
			description="JGLOBAL_FILTER_FIELD_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_pagination_limit"
			type="radio"
			label="JGLOBAL_DISPLAY_SELECT_LABEL"
			description="JGLOBAL_DISPLAY_SELECT_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_headings"
			type="radio"
			label="JGLOBAL_SHOW_HEADINGS_LABEL"
			description="JGLOBAL_SHOW_HEADINGS_DESC"
			id="show_headings"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_articles"
			type="radio"
			label="COM_NEWSFEEDS_FIELD_NUM_ARTICLES_COLUMN_LABEL"
			description="COM_NEWSFEEDS_FIELD_NUM_ARTICLES_COLUMN_DESC"
			id="show_articles"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_link"
			type="radio"
			label="COM_NEWSFEEDS_FIELD_SHOW_LINKS_LABEL"
			description="COM_NEWSFEEDS_FIELD_SHOW_LINKS_DESC"
			id="show_link"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_pagination"
			type="list"
			label="JGLOBAL_PAGINATION_LABEL"
			description="JGLOBAL_PAGINATION_DESC"
			default="2"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
			<option value="2">JGLOBAL_AUTO</option>
		</field>

		<field
			name="show_pagination_results"
			type="radio"
			label="JGLOBAL_PAGINATION_RESULTS_LABEL"
			description="JGLOBAL_PAGINATION_RESULTS_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			showon="show_pagination:1,2"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>
	</fieldset>

	<fieldset name="integration"
		label="JGLOBAL_INTEGRATION_LABEL"
		description="COM_NEWSFEEDS_CONFIG_INTEGRATION_SETTINGS_DESC"
	>

		<field
			name="integration_sef"
			type="note"
			label="JGLOBAL_SEF_TITLE"
		/>

		<field
			name="sef_advanced"
			type="radio"
			class="btn-group btn-group-yesno btn-group-reversed"
			default="0"
			label="JGLOBAL_SEF_ADVANCED_LABEL"
			description="JGLOBAL_SEF_ADVANCED_DESC"
			filter="integer"
		>
			<option value="0">JGLOBAL_SEF_ADVANCED_LEGACY</option>
			<option value="1">JGLOBAL_SEF_ADVANCED_MODERN</option>
		</field>

		<field
			name="sef_ids"
			type="radio"
			class="btn-group btn-group-yesno"
			default="0"
			label="JGLOBAL_SEF_NOIDS_LABEL"
			description="JGLOBAL_SEF_NOIDS_DESC"
			showon="sef_advanced:1"
			filter="integer">
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

	</fieldset>

	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
		>

		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			filter="rules"
			validate="rules"
			component="com_newsfeeds"
			section="component"
		/>
	</fieldset>
</config>
components/com_newsfeeds/controller.php000060400000003013152453623450014450 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Newsfeeds master display controller.
 *
 * @since  1.6
 */
class NewsfeedsController extends JControllerLegacy
{
	/**
	 * 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  JControllerLegacy  This object to support chaining.
	 *
	 * @since   1.5
	 */
	public function display($cachable = false, $urlparams = array())
	{
		JLoader::register('NewsfeedsHelper', JPATH_ADMINISTRATOR . '/components/com_newsfeeds/helpers/newsfeeds.php');

		$view   = $this->input->get('view', 'newsfeeds');
		$layout = $this->input->get('layout', 'default');
		$id     = $this->input->getInt('id');

		// Check for edit form.
		if ($view == 'newsfeed' && $layout == 'edit' && !$this->checkEditId('com_newsfeeds.edit.newsfeed', $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_newsfeeds&view=newsfeeds', false));

			return false;
		}

		return parent::display();
	}
}
components/com_config/helper/config.php000060400000005637152453623450014311 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Components helper for com_config
 *
 * @since  3.0
 */
class ConfigHelperConfig extends JHelperContent
{
	/**
	 * Get an array of all enabled components.
	 *
	 * @return  array
	 *
	 * @since   3.0
	 */
	public static function getAllComponents()
	{
		$db = JFactory::getDbo();
		$query = $db->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);
	}
}
components/com_config/access.xml000060400000000331152453623450013021 0ustar00<?xml version="1.0" encoding="utf-8"?>
<access component="com_config">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
	</section>
</access>
components/com_config/config.php000060400000001616152453623450013023 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
JHtml::_('behavior.tabstate');

// Access checks are done internally because of different requirements for the two controllers.

// Tell the browser not to cache this page.
JFactory::getApplication()->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();
components/com_config/controller.php000060400000002360152453623450013736 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Config Component Controller
 *
 * @since  1.5
 */
class ConfigController extends JControllerLegacy
{
	/**
	 * @var    string  The default view.
	 * @since  1.6
	 */
	protected $default_view = 'application';

	/**
	 * Method to display the 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  ConfigController  This object to support chaining.
	 *
	 * @since   1.5
	 */
	public function display($cachable = false, $urlparams = array())
	{
		// Set the default view name and format from the Request.
		$vName = $this->input->get('view', 'application');

		if (ucfirst($vName) == 'Application')
		{
			$controller = new ConfigControllerApplicationDisplay;
		}
		elseif (ucfirst($vName) == 'Component')
		{
			$controller = new ConfigControllerComponentDisplay;
		}

		return $controller->execute();
	}
}
components/com_config/config.xml000060400000001733152453623450013034 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_config</name>
	<author>Joomla! Project</author>
	<creationDate>April 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_CONFIG_XML_DESCRIPTION</description>
	<administration>
		<files folder="admin">
			<filename>config.php</filename>
			<filename>controller.php</filename>
			<folder>controllers</folder>
			<folder>models</folder>
			<folder>controller</folder>
			<folder>model</folder>
			<folder>view</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_config.ini</language>
			<language tag="en-GB">language/en-GB.com_config.sys.ini</language>
		</languages>
	</administration>
</extension>
components/com_config/model/component.php000060400000012542152453623450014660 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Model for component configuration
 *
 * @since  3.2
 */
class ConfigModelComponent extends ConfigModelForm
{
	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @return	void
	 *
	 * @since	3.2
	 */
	protected function populateState()
	{
		$input = JFactory::getApplication()->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']))
		{
			if (!JFactory::getUser()->authorise('core.admin', $data['option']))
			{
				throw new RuntimeException(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'));
			}

			$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;
	}
}
components/com_config/model/field/filters.php000060400000014767152453623450015424 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Text Filters form field.
 *
 * @since  1.6
 */
class JFormFieldFilters extends JFormField
{
	/**
	 * The form field type.
	 *
	 * @var		string
	 * @since	1.6
	 */
	public $type = 'Filters';

	/**
	 * Method to get the field input markup.
	 *
	 * TODO: Add access check.
	 *
	 * @return	string	The field input markup.
	 *
	 * @since	1.6
	 */
	protected function getInput()
	{
		// Load Framework
		JHtml::_('jquery.framework');

		// Add translation string for notification
		JText::script('COM_CONFIG_TEXT_FILTERS_NOTE');

		// Add Javascript
		$doc = JFactory::getDocument();
		$doc->addScriptDeclaration('
			jQuery( document ).ready(function( $ ) {
				$("#filter-config select").change(function() {
					var currentFilter = $(this).children("option:selected").val();

					if($(this).children("option:selected").val() === "NONE") {
						var child = $("#filter-config select[data-parent=" + $(this).attr("data-id") + "]");
					
						while(child.length !== 0) {
							if(child.children("option:selected").val() !== "NONE") {
								alert(Joomla.JText._("COM_CONFIG_TEXT_FILTERS_NOTE"));
								break;
							}
							
							child = $("#filter-config select[data-parent=" + child.attr("data-id") + "]");
						}
						
						return;
					}

					var parent = $("#filter-config select[data-id=" + $(this).attr("data-parent") + "]");

					while(parent.length !== 0) {
						if(parent.children("option:selected").val() === "NONE") {
							alert(Joomla.JText._("COM_CONFIG_TEXT_FILTERS_NOTE"));
							break;
						}
						
						parent = $("#filter-config select[data-id=" + parent.attr("data-parent") + "]")
					}
				});
			});
		');

		// Get the available user groups.
		$groups = $this->getUserGroups();

		// Build the form control.
		$html = array();

		// Open the table.
		$html[] = '<table id="filter-config" class="table table-striped">';

		// The table heading.
		$html[] = '	<thead>';
		$html[] = '	<tr>';
		$html[] = '		<th>';
		$html[] = '			<span class="acl-action">' . JText::_('JGLOBAL_FILTER_GROUPS_LABEL') . '</span>';
		$html[] = '		</th>';
		$html[] = '		<th>';
		$html[] = '			<span class="acl-action">' . JText::_('JGLOBAL_FILTER_TYPE_LABEL') . '</span>';
		$html[] = '		</th>';
		$html[] = '		<th>';
		$html[] = '			<span class="acl-action">' . JText::_('JGLOBAL_FILTER_TAGS_LABEL') . '</span>';
		$html[] = '		</th>';
		$html[] = '		<th>';
		$html[] = '			<span class="acl-action">' . JText::_('JGLOBAL_FILTER_ATTRIBUTES_LABEL') . '</span>';
		$html[] = '		</th>';
		$html[] = '	</tr>';
		$html[] = '	</thead>';

		// The table body.
		$html[] = '	<tbody>';

		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[] = '	<tr>';
			$html[] = '		<td class="acl-groups left">';
			$html[] = '			' . JLayoutHelper::render('joomla.html.treeprefix', array('level' => $group->level + 1)) . $group->text;
			$html[] = '		</td>';
			$html[] = '		<td>';
			$html[] = '				<select'
				. ' name="' . $this->name . '[' . $group->value . '][filter_type]"'
				. ' id="' . $this->id . $group->value . '_filter_type"'
				. ' data-parent="' . ($group->parent) . '" '
				. ' data-id="' . ($group->value) . '" '
				. ' class="novalidate"'
				. '>';
			$html[] = '					<option value="BL"' . ($group_filter['filter_type'] == 'BL' ? ' selected="selected"' : '') . '>'
				. JText::_('COM_CONFIG_FIELD_FILTERS_DEFAULT_BLACK_LIST') . '</option>';
			$html[] = '					<option value="CBL"' . ($group_filter['filter_type'] == 'CBL' ? ' selected="selected"' : '') . '>'
				. JText::_('COM_CONFIG_FIELD_FILTERS_CUSTOM_BLACK_LIST') . '</option>';
			$html[] = '					<option value="WL"' . ($group_filter['filter_type'] == 'WL' ? ' selected="selected"' : '') . '>'
				. JText::_('COM_CONFIG_FIELD_FILTERS_WHITE_LIST') . '</option>';
			$html[] = '					<option value="NH"' . ($group_filter['filter_type'] == 'NH' ? ' selected="selected"' : '') . '>'
				. JText::_('COM_CONFIG_FIELD_FILTERS_NO_HTML') . '</option>';
			$html[] = '					<option value="NONE"' . ($group_filter['filter_type'] == 'NONE' ? ' selected="selected"' : '') . '>'
				. JText::_('COM_CONFIG_FIELD_FILTERS_NO_FILTER') . '</option>';
			$html[] = '				</select>';
			$html[] = '		</td>';
			$html[] = '		<td>';
			$html[] = '				<input'
				. ' name="' . $this->name . '[' . $group->value . '][filter_tags]"'
				. ' type="text"'
				. ' id="' . $this->id . $group->value . '_filter_tags" class="novalidate"'
				. ' value="' . htmlspecialchars($group_filter['filter_tags'], ENT_QUOTES) . '"'
				. '/>';
			$html[] = '		</td>';
			$html[] = '		<td>';
			$html[] = '				<input'
				. ' name="' . $this->name . '[' . $group->value . '][filter_attributes]"'
				. ' type="text"'
				. ' id="' . $this->id . $group->value . '_filter_attributes" class="novalidate"'
				. ' value="' . htmlspecialchars($group_filter['filter_attributes'], ENT_QUOTES) . '"'
				. '/>';
			$html[] = '		</td>';
			$html[] = '	</tr>';
		}

		$html[] = '	</tbody>';

		// Close the table.
		$html[] = '</table>';

		// Add notes
		$html[] = '<div class="alert">';
		$html[] = '<p>' . JText::_('JGLOBAL_FILTER_TYPE_DESC') . '</p>';
		$html[] = '<p>' . JText::_('JGLOBAL_FILTER_TAGS_DESC') . '</p>';
		$html[] = '<p>' . JText::_('JGLOBAL_FILTER_ATTRIBUTES_DESC') . '</p>';
		$html[] = '</div>';

		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, a.parent_id as parent');
		$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;
	}
}
components/com_config/model/field/configcomponents.php000060400000003444152453623450017315 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

JFormHelper::loadFieldClass('List');

/**
 * Text Filters form field.
 *
 * @since  3.7.0
 */
class JFormFieldConfigComponents extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var		string
	 * @since	3.7.0
	 */
	public $type = 'ConfigComponents';

	/**
	 * Method to get a list of options for a list input.
	 *
	 * @return	array  An array of JHtml options.
	 *
	 * @since   3.7.0
	 */
	protected function getOptions()
	{
		$db    = JFactory::getDbo();
		$query = $db->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;
	}
}
components/com_config/model/form/application.xml000060400000073352152453623450016143 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset
		name="cache"
		label="COM_CONFIG_CACHE_SETTINGS_LABEL">

		<field
			name="cache_handler"
			type="cachehandler"
			label="COM_CONFIG_FIELD_CACHE_HANDLER_LABEL"
			description="COM_CONFIG_FIELD_CACHE_HANDLER_DESC"
			default=""
			filter="word"
		/>

		<field
			name="cache_path"
			type="text"
			label="COM_CONFIG_FIELD_CACHE_PATH_LABEL"
			description="COM_CONFIG_FIELD_CACHE_PATH_DESC"
			showon="cache_handler:file"
			filter="string"
			size="50"
		/>

		<field
			name="memcache_persist"
			type="radio"
			label="COM_CONFIG_FIELD_MEMCACHE_PERSISTENT_LABEL"
			description="COM_CONFIG_FIELD_MEMCACHE_PERSISTENT_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			showon="cache_handler:memcache"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="memcache_compress"
			type="radio"
			label="COM_CONFIG_FIELD_MEMCACHE_COMPRESSION_LABEL"
			description="COM_CONFIG_FIELD_MEMCACHE_COMPRESSION_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			showon="cache_handler:memcache"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="memcache_server_host"
			type="text"
			label="COM_CONFIG_FIELD_MEMCACHE_HOST_LABEL"
			description="COM_CONFIG_FIELD_MEMCACHE_HOST_DESC"
			default="localhost"
			showon="cache_handler:memcache"
			filter="string"
			size="25"
		/>

		<field
			name="memcache_server_port"
			type="number"
			label="COM_CONFIG_FIELD_MEMCACHE_PORT_LABEL"
			description="COM_CONFIG_FIELD_MEMCACHE_PORT_DESC"
			showon="cache_handler:memcache"
			min="0"
			max="65535"
			default="11211"
			filter="integer"
			validate="number"
			size="5"
		/>

		<field
			name="memcached_persist"
			type="radio"
			label="COM_CONFIG_FIELD_MEMCACHE_PERSISTENT_LABEL"
			description="COM_CONFIG_FIELD_MEMCACHE_PERSISTENT_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			showon="cache_handler:memcached"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="memcached_compress"
			type="radio"
			label="COM_CONFIG_FIELD_MEMCACHE_COMPRESSION_LABEL"
			description="COM_CONFIG_FIELD_MEMCACHE_COMPRESSION_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			showon="cache_handler:memcached"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="memcached_server_host"
			type="text"
			label="COM_CONFIG_FIELD_MEMCACHE_HOST_LABEL"
			description="COM_CONFIG_FIELD_MEMCACHE_HOST_DESC"
			default="localhost"
			showon="cache_handler:memcached"
			filter="string"
			size="25"
		/>

		<field
			name="memcached_server_port"
			type="number"
			label="COM_CONFIG_FIELD_MEMCACHE_PORT_LABEL"
			description="COM_CONFIG_FIELD_MEMCACHE_PORT_DESC"
			showon="cache_handler:memcached"
			min="0"
			max="65535"
			default="11211"
			filter="integer"
			validate="number"
			size="5"
		/>

		<field
			name="redis_persist"
			type="radio"
			label="COM_CONFIG_FIELD_REDIS_PERSISTENT_LABEL"
			description="COM_CONFIG_FIELD_REDIS_PERSISTENT_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			filter="integer"
			showon="cache_handler:redis"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="redis_server_host"
			type="text"
			label="COM_CONFIG_FIELD_REDIS_HOST_LABEL"
			description="COM_CONFIG_FIELD_REDIS_HOST_DESC"
			default="localhost"
			filter="string"
			showon="cache_handler:redis"
			size="25"
		/>

		<field
			name="redis_server_port"
			type="number"
			label="COM_CONFIG_FIELD_REDIS_PORT_LABEL"
			description="COM_CONFIG_FIELD_REDIS_PORT_DESC"
			showon="cache_handler:redis"
			min="1"
			max="65535"
			default="6379"
			filter="integer"
			validate="number"
			size="5"
		/>

		<field
			name="redis_server_auth"
			type="password"
			label="COM_CONFIG_FIELD_REDIS_AUTH_LABEL"
			description="COM_CONFIG_FIELD_REDIS_AUTH_DESC"
			filter="raw"
			showon="cache_handler:redis"
			autocomplete="off"
			size="30"
			hint="***************"
			lock="true"
		/>

		<field
			name="redis_server_db"
			type="number"
			label="COM_CONFIG_FIELD_REDIS_DB_LABEL"
			description="COM_CONFIG_FIELD_REDIS_DB_DESC"
			default="0"
			filter="integer"
			showon="cache_handler:redis"
			size="4"
		/>

		<field
			name="cachetime"
			type="number"
			label="COM_CONFIG_FIELD_CACHE_TIME_LABEL"
			description="COM_CONFIG_FIELD_CACHE_TIME_DESC"
			min="1"
			default="15"
			filter="integer"
			validate="number"
			size="6"
		/>

		<field
			name="cache_platformprefix"
			type="radio"
			label="COM_CONFIG_FIELD_CACHE_PLATFORMPREFIX_LABEL"
			description="COM_CONFIG_FIELD_CACHE_PLATFORMPREFIX_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="caching"
			type="list"
			label="COM_CONFIG_FIELD_CACHE_LABEL"
			description="COM_CONFIG_FIELD_CACHE_DESC"
			default="2"
			filter="integer"
			>
			<option value="0">COM_CONFIG_FIELD_VALUE_CACHE_OFF</option>
			<option value="1">COM_CONFIG_FIELD_VALUE_CACHE_CONSERVATIVE</option>
			<option value="2">COM_CONFIG_FIELD_VALUE_CACHE_PROGRESSIVE</option>
		</field>

	</fieldset>

	<fieldset
		name="memcache"
		label="COM_CONFIG_MEMCACHE_SETTINGS_LABEL">
	</fieldset>

	<fieldset
		name="database"
		label="CONFIG_DATABASE_SETTINGS_LABEL">

		<field
			name="dbtype"
			type="databaseconnection"
			label="COM_CONFIG_FIELD_DATABASE_TYPE_LABEL"
			description="COM_CONFIG_FIELD_DATABASE_TYPE_DESC"
			supported="mysql,mysqli,pgsql,pdomysql,postgresql,sqlsrv,sqlazure"
			filter="string"
		/>

		<field
			name="host"
			type="text"
			label="COM_CONFIG_FIELD_DATABASE_HOST_LABEL"
			description="COM_CONFIG_FIELD_DATABASE_HOST_DESC"
			required="true"
			filter="string"
			size="30"
		/>

		<field
			name="user"
			type="text"
			label="COM_CONFIG_FIELD_DATABASE_USERNAME_LABEL"
			description="COM_CONFIG_FIELD_DATABASE_USERNAME_DESC"
			required="true"
			filter="string"
			size="30"
		/>

		<field
			name="password"
			type="password"
			label="COM_CONFIG_FIELD_DATABASE_PASSWORD_LABEL"
			description="COM_CONFIG_FIELD_DATABASE_PASSWORD_DESC"
			filter="raw"
			autocomplete="off"
			size="30"
			lock="true"
		/>

		<field
			name="db"
			type="text"
			label="COM_CONFIG_FIELD_DATABASE_NAME_LABEL"
			description="COM_CONFIG_FIELD_DATABASE_NAME_DESC"
			required="true"
			filter="string"
			size="30"
		/>

		<field
			name="dbprefix"
			type="text"
			label="COM_CONFIG_FIELD_DATABASE_PREFIX_LABEL"
			description="COM_CONFIG_FIELD_DATABASE_PREFIX_DESC"
			default="jos_"
			filter="string"
			size="10"
		/>

	</fieldset>

	<fieldset
		name="debug"
		label="CONFIG_DEBUG_SETTINGS_LABEL">

		<field
			name="debug"
			type="radio"
			label="COM_CONFIG_FIELD_DEBUG_SYSTEM_LABEL"
			description="COM_CONFIG_FIELD_DEBUG_SYSTEM_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="debug_lang"
			type="radio"
			label="COM_CONFIG_FIELD_DEBUG_LANG_LABEL"
			description="COM_CONFIG_FIELD_DEBUG_LANG_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="debug_lang_const"
			type="radio"
			label="COM_CONFIG_FIELD_DEBUG_CONST_LANG_LABEL"
			description="COM_CONFIG_FIELD_DEBUG_CONST_LANG_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			filter="integer"
			showon="debug_lang:1"
			>
			<option value="0">COM_CONFIG_FIELD_DEBUG_CONST</option>
			<option value="1">COM_CONFIG_FIELD_DEBUG_VALUE</option>
		</field>

	</fieldset>

	<fieldset name="ftp" label="CONFIG_FTP_SETTINGS_LABEL">

		<field
			name="ftp_enable"
			type="radio"
			label="COM_CONFIG_FIELD_FTP_ENABLE_LABEL"
			description="COM_CONFIG_FIELD_FTP_ENABLE_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="ftp_host"
			type="text"
			label="COM_CONFIG_FIELD_FTP_HOST_LABEL"
			description="COM_CONFIG_FIELD_FTP_HOST_DESC"
			filter="string"
			showon="ftp_enable:1"
			size="14"
		/>

		<field
			name="ftp_port"
			type="number"
			label="COM_CONFIG_FIELD_FTP_PORT_LABEL"
			description="COM_CONFIG_FIELD_FTP_PORT_DESC"
			showon="ftp_enable:1"
			min="1"
			max="65535"
			hint="21"
			validate="number"
			filter="integer"
			size="5"
		/>

		<field
			name="ftp_user"
			type="text"
			label="COM_CONFIG_FIELD_FTP_USERNAME_LABEL"
			description="COM_CONFIG_FIELD_FTP_USERNAME_DESC"
			filter="string"
			showon="ftp_enable:1"
			autocomplete="off"
			size="25"
		/>

		<field
			name="ftp_pass"
			type="password"
			label="COM_CONFIG_FIELD_FTP_PASSWORD_LABEL"
			description="COM_CONFIG_FIELD_FTP_PASSWORD_DESC"
			filter="raw"
			showon="ftp_enable:1"
			autocomplete="off"
			size="25"
			lock="true"
		/>

		<field
			name="ftp_root"
			type="text"
			label="COM_CONFIG_FIELD_FTP_ROOT_LABEL"
			description="COM_CONFIG_FIELD_FTP_ROOT_DESC"
			showon="ftp_enable:1"
			filter="string"
			size="50"
		/>

	</fieldset>

	<fieldset
		name="proxy"
		label="CONFIG_PROXY_SETTINGS_LABEL">

		<field
			name="behind_loadbalancer"
			type="radio"
			label="COM_CONFIG_FIELD_LOADBALANCER_ENABLE_LABEL"
			description="COM_CONFIG_FIELD_LOADBALANCER_ENABLE_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="proxy_enable"
			type="radio"
			label="COM_CONFIG_FIELD_PROXY_ENABLE_LABEL"
			description="COM_CONFIG_FIELD_PROXY_ENABLE_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="proxy_host"
			type="text"
			label="COM_CONFIG_FIELD_PROXY_HOST_LABEL"
			description="COM_CONFIG_FIELD_PROXY_HOST_DESC"
			filter="string"
			showon="proxy_enable:1"
			size="14"
		/>

		<field
			name="proxy_port"
			type="number"
			label="COM_CONFIG_FIELD_PROXY_PORT_LABEL"
			description="COM_CONFIG_FIELD_PROXY_PORT_DESC"
			showon="proxy_enable:1"
			min="1"
			max="65535"
			hint="8080"
			validate="number"
			filter="integer"
			size="5"
		/>

		<field
			name="proxy_user"
			type="text"
			label="COM_CONFIG_FIELD_PROXY_USERNAME_LABEL"
			description="COM_CONFIG_FIELD_PROXY_USERNAME_DESC"
			filter="string"
			showon="proxy_enable:1"
			autocomplete="off"
			size="25"
		/>

		<field
			name="proxy_pass"
			type="password"
			label="COM_CONFIG_FIELD_PROXY_PASSWORD_LABEL"
			description="COM_CONFIG_FIELD_PROXY_PASSWORD_DESC"
			filter="raw"
			showon="proxy_enable:1"
			autocomplete="off"
			size="25"
			lock="true"
		/>

	</fieldset>

	<fieldset
		name="locale"
		label="CONFIG_LOCATION_SETTINGS_LABEL">

		<field
			name="offset"
			type="timezone"
			label="COM_CONFIG_FIELD_SERVER_TIMEZONE_LABEL"
			description="COM_CONFIG_FIELD_SERVER_TIMEZONE_DESC"
			default="UTC"
			>
			<option value="UTC">JLIB_FORM_VALUE_TIMEZONE_UTC</option>
		</field>

	</fieldset>

	<fieldset
		name="mail"
		label="CONFIG_MAIL_SETTINGS_LABEL">

		<field
			name="mailonline"
			type="radio"
			label="COM_CONFIG_FIELD_MAIL_MAILONLINE_LABEL"
			description="COM_CONFIG_FIELD_MAIL_MAILONLINE_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="massmailoff"
			type="radio"
			label="COM_CONFIG_FIELD_MAIL_MASSMAILOFF_LABEL"
			description="COM_CONFIG_FIELD_MAIL_MASSMAILOFF_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			filter="integer"
			showon="mailonline:1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="mailfrom"
			type="email"
			label="COM_CONFIG_FIELD_MAIL_FROM_EMAIL_LABEL"
			description="COM_CONFIG_FIELD_MAIL_FROM_EMAIL_DESC"
			filter="string"
			size="30"
			validate="email"
			showon="mailonline:1"
		/>

		<field
			name="fromname"
			type="text"
			label="COM_CONFIG_FIELD_MAIL_FROM_NAME_LABEL"
			description="COM_CONFIG_FIELD_MAIL_FROM_NAME_DESC"
			filter="string"
			size="30"
			showon="mailonline:1"
		/>

		<field
			name="replyto"
			type="email"
			label="COM_CONFIG_FIELD_MAIL_REPLY_TO_EMAIL_LABEL"
			description="COM_CONFIG_FIELD_MAIL_REPLY_TO_EMAIL_DESC"
			filter="string"
			size="30"
			validate="email"
			showon="mailonline:1"
		/>

		<field
			name="replytoname"
			type="text"
			label="COM_CONFIG_FIELD_MAIL_REPLY_TO_NAME_LABEL"
			description="COM_CONFIG_FIELD_MAIL_REPLY_TO_NAME_DESC"
			filter="string"
			size="30"
			showon="mailonline:1"
		/>

		<field
			name="mailer"
			type="list"
			label="COM_CONFIG_FIELD_MAIL_MAILER_LABEL"
			description="COM_CONFIG_FIELD_MAIL_MAILER_DESC"
			default="mail"
			filter="word"
			showon="mailonline:1"
			>
			<option value="mail">COM_CONFIG_FIELD_VALUE_PHP_MAIL</option>
			<option value="sendmail">COM_CONFIG_FIELD_VALUE_SENDMAIL</option>
			<option value="smtp">COM_CONFIG_FIELD_VALUE_SMTP</option>
		</field>

		<field
			name="sendmail"
			type="text"
			label="COM_CONFIG_FIELD_MAIL_SENDMAIL_PATH_LABEL"
			description="COM_CONFIG_FIELD_MAIL_SENDMAIL_PATH_DESC"
			default="/usr/sbin/sendmail"
			showon="mailonline:1[AND]mailer:sendmail"
			filter="string"
			size="30"
		/>

		<field
			name="smtphost"
			type="text"
			label="COM_CONFIG_FIELD_MAIL_SMTP_HOST_LABEL"
			description="COM_CONFIG_FIELD_MAIL_SMTP_HOST_DESC"
			default="localhost"
			showon="mailonline:1[AND]mailer:smtp"
			filter="string"
			size="30"
		/>

		<field
			name="smtpport"
			type="number"
			label="COM_CONFIG_FIELD_MAIL_SMTP_PORT_LABEL"
			description="COM_CONFIG_FIELD_MAIL_SMTP_PORT_DESC"
			showon="mailonline:1[AND]mailer:smtp"
			min="1"
			max="65535"
			default="25"
			hint="25"
			validate="number"
			filter="integer"
			size="5"
		/>

		<field
			name="smtpsecure"
			type="list"
			label="COM_CONFIG_FIELD_MAIL_SMTP_SECURE_LABEL"
			description="COM_CONFIG_FIELD_MAIL_SMTP_SECURE_DESC"
			default="none"
			showon="mailonline:1[AND]mailer:smtp"
			filter="word"
			>
			<option value="none">COM_CONFIG_FIELD_VALUE_NONE</option>
			<option value="ssl">COM_CONFIG_FIELD_VALUE_SSL</option>
			<option value="tls">COM_CONFIG_FIELD_VALUE_TLS</option>
		</field>

		<field
			name="smtpauth"
			type="radio"
			label="COM_CONFIG_FIELD_MAIL_SMTP_AUTH_LABEL"
			description="COM_CONFIG_FIELD_MAIL_SMTP_AUTH_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			showon="mailonline:1[AND]mailer:smtp"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="smtpuser"
			type="text"
			label="COM_CONFIG_FIELD_MAIL_SMTP_USERNAME_LABEL"
			description="COM_CONFIG_FIELD_MAIL_SMTP_USERNAME_DESC"
			showon="mailonline:1[AND]mailer:smtp[AND]smtpauth:1"
			filter="string"
			autocomplete="off"
			size="30"
		/>

		<field
			name="smtppass"
			type="password"
			label="COM_CONFIG_FIELD_MAIL_SMTP_PASSWORD_LABEL"
			description="COM_CONFIG_FIELD_MAIL_SMTP_PASSWORD_DESC"
			showon="mailonline:1[AND]mailer:smtp[AND]smtpauth:1"
			filter="raw"
			autocomplete="off"
			size="30"
			lock="true"
		/>

	</fieldset>

	<fieldset
		name="metadata"
		label="COM_CONFIG_METADATA_SETTINGS">

		<field
			name="MetaDesc"
			type="textarea"
			label="COM_CONFIG_FIELD_METADESC_LABEL"
			description="COM_CONFIG_FIELD_METADESC_DESC"
			filter="string"
			cols="60"
			rows="3"
		/>

		<field
			name="MetaKeys"
			type="textarea"
			label="COM_CONFIG_FIELD_METAKEYS_LABEL"
			description="COM_CONFIG_FIELD_METAKEYS_DESC"
			filter="string"
			cols="60"
			rows="3"
		/>

		<field
			name="robots"
			type="list"
			label="JFIELD_METADATA_ROBOTS_LABEL"
			description="JFIELD_METADATA_ROBOTS_DESC"
			default=""
			>
			<option value="">index, follow</option>
			<option value="noindex, follow"></option>
			<option value="index, nofollow"></option>
			<option value="noindex, nofollow"></option>
		</field>

		<field
			name="MetaRights"
			type="textarea"
			label="JFIELD_META_RIGHTS_LABEL"
			description="JFIELD_META_RIGHTS_DESC"
			filter="string"
			cols="60"
			rows="2"
		/>

		<field
			name="MetaAuthor"
			type="radio"
			label="COM_CONFIG_FIELD_METAAUTHOR_LABEL"
			description="COM_CONFIG_FIELD_METAAUTHOR_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="MetaVersion"
			type="radio"
			label="COM_CONFIG_FIELD_METAVERSION_LABEL"
			description="COM_CONFIG_FIELD_METAVERSION_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

	</fieldset>

	<fieldset
		name="seo"
		label="CONFIG_SEO_SETTINGS_LABEL">

		<field
			name="sef"
			type="radio"
			label="COM_CONFIG_FIELD_SEF_URL_LABEL"
			description="COM_CONFIG_FIELD_SEF_URL_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="sef_rewrite"
			type="radio"
			label="COM_CONFIG_FIELD_SEF_REWRITE_LABEL"
			description="COM_CONFIG_FIELD_SEF_REWRITE_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			filter="integer"
			showon="sef:1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="sef_suffix"
			type="radio"
			label="COM_CONFIG_FIELD_SEF_SUFFIX_LABEL"
			description="COM_CONFIG_FIELD_SEF_SUFFIX_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			filter="integer"
			showon="sef:1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="unicodeslugs"
			type="radio"
			label="COM_CONFIG_FIELD_UNICODESLUGS_LABEL"
			description="COM_CONFIG_FIELD_UNICODESLUGS_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			filter="integer"
			showon="sef:1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="sitename_pagetitles"
			type="list"
			label="COM_CONFIG_FIELD_SITENAME_PAGETITLES_LABEL"
			description="COM_CONFIG_FIELD_SITENAME_PAGETITLES_DESC"
			default="0"
			filter="integer"
			>
			<option value="2">COM_CONFIG_FIELD_VALUE_AFTER</option>
			<option value="1">COM_CONFIG_FIELD_VALUE_BEFORE</option>
			<option value="0">JNO</option>
		</field>

	</fieldset>

	<fieldset
		name="server"
		label="CONFIG_SERVER_SETTINGS_LABEL">

		<field
			name="tmp_path"
			type="text"
			label="COM_CONFIG_FIELD_TEMP_PATH_LABEL"
			description="COM_CONFIG_FIELD_TEMP_PATH_DESC"
			filter="string"
			size="50"
		/>

		<field
			name="gzip"
			type="radio"
			label="COM_CONFIG_FIELD_GZIP_COMPRESSION_LABEL"
			description="COM_CONFIG_FIELD_GZIP_COMPRESSION_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="error_reporting"
			type="list"
			label="COM_CONFIG_FIELD_ERROR_REPORTING_LABEL"
			description="COM_CONFIG_FIELD_ERROR_REPORTING_DESC"
			default="default"
			filter="cmd"
			>
			<option value="default">COM_CONFIG_FIELD_VALUE_SYSTEM_DEFAULT</option>
			<option value="none">COM_CONFIG_FIELD_VALUE_NONE</option>
			<option value="simple">COM_CONFIG_FIELD_VALUE_SIMPLE</option>
			<option value="maximum">COM_CONFIG_FIELD_VALUE_MAXIMUM</option>
			<option value="development">COM_CONFIG_FIELD_VALUE_DEVELOPMENT</option>
		</field>

		<field
			name="force_ssl"
			type="list"
			label="COM_CONFIG_FIELD_FORCE_SSL_LABEL"
			description="COM_CONFIG_FIELD_FORCE_SSL_DESC"
			default="-1"
			filter="integer"
			>
			<option value="0">COM_CONFIG_FIELD_VALUE_NONE</option>
			<option value="1">COM_CONFIG_FIELD_VALUE_ADMINISTRATOR_ONLY</option>
			<option value="2">COM_CONFIG_FIELD_VALUE_ENTIRE_SITE</option>
		</field>

	</fieldset>

	<fieldset
		name="session"
		label="CONFIG_SESSION_SETTINGS_LABEL">

		<field
			name="session_handler"
			type="sessionhandler"
			label="COM_CONFIG_FIELD_SESSION_HANDLER_LABEL"
			description="COM_CONFIG_FIELD_SESSION_HANDLER_DESC"
			default="none"
			filter="word"
		/>

		<field
			name="session_memcache_server_host"
			type="text"
			label="COM_CONFIG_FIELD_MEMCACHE_HOST_LABEL"
			description="COM_CONFIG_FIELD_MEMCACHE_HOST_DESC"
			default="localhost"
			filter="string"
			showon="session_handler:memcache"
			size="25"
		/>

		<field
			name="session_memcache_server_port"
			type="number"
			label="COM_CONFIG_FIELD_MEMCACHE_PORT_LABEL"
			description="COM_CONFIG_FIELD_MEMCACHE_PORT_DESC"
			showon="session_handler:memcache"
			min="1"
			max="65535"
			default="11211"
			validate="number"
			filter="integer"
			size="5"
		/>

		<field
			name="session_memcached_server_host"
			type="text"
			label="COM_CONFIG_FIELD_MEMCACHE_HOST_LABEL"
			description="COM_CONFIG_FIELD_MEMCACHE_HOST_DESC"
			default="localhost"
			filter="string"
			showon="session_handler:memcached"
			size="25"
		/>

		<field
			name="session_memcached_server_port"
			type="number"
			label="COM_CONFIG_FIELD_MEMCACHE_PORT_LABEL"
			description="COM_CONFIG_FIELD_MEMCACHE_PORT_DESC"
			showon="session_handler:memcached"
			min="1"
			max="65535"
			default="11211"
			validate="number"
			filter="integer"
			size="5"
		/>

		<field
			name="session_redis_persist"
			type="radio"
			label="COM_CONFIG_FIELD_REDIS_PERSISTENT_LABEL"
			description="COM_CONFIG_FIELD_REDIS_PERSISTENT_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			filter="integer"
			showon="session_handler:redis"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="session_redis_server_host"
			type="text"
			label="COM_CONFIG_FIELD_REDIS_HOST_LABEL"
			description="COM_CONFIG_FIELD_REDIS_HOST_DESC"
			default="localhost"
			filter="string"
			showon="session_handler:redis"
			size="25"
		/>

		<field
			name="session_redis_server_port"
			type="number"
			label="COM_CONFIG_FIELD_REDIS_PORT_LABEL"
			description="COM_CONFIG_FIELD_REDIS_PORT_DESC"
			showon="session_handler:redis"
			min="1"
			max="65535"
			default="6379"
			validate="number"
			filter="integer"
			size="5"
		/>

		<field
			name="session_redis_server_auth"
			type="password"
			label="COM_CONFIG_FIELD_REDIS_AUTH_LABEL"
			description="COM_CONFIG_FIELD_REDIS_AUTH_DESC"
			filter="raw"
			showon="session_handler:redis"
			autocomplete="off"
			size="30"
			lock="true"
		/>

		<field
			name="session_redis_server_db"
			type="number"
			label="COM_CONFIG_FIELD_REDIS_DB_LABEL"
			description="COM_CONFIG_FIELD_REDIS_DB_DESC"
			default="0"
			filter="integer"
			showon="session_handler:redis"
			size="4"
		/>
		<field
			name="lifetime"
			type="number"
			label="COM_CONFIG_FIELD_SESSION_TIME_LABEL"
			description="COM_CONFIG_FIELD_SESSION_TIME_DESC"
			min="1"
			max="16383"
			default="15"
			filter="integer"
			validate="number"
			size="6"
		/>

		<field
			name="shared_session"
			type="radio"
			label="COM_CONFIG_FIELD_SHARED_SESSION_LABEL"
			description="COM_CONFIG_FIELD_SHARED_SESSION_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

	</fieldset>

	<fieldset
		name="site"
		label="CONFIG_SITE_SETTINGS_LABEL">

		<field
			name="sitename"
			type="text"
			label="COM_CONFIG_FIELD_SITE_NAME_LABEL"
			description="COM_CONFIG_FIELD_SITE_NAME_DESC"
			required="true"
			filter="string"
			size="50"
		/>

		<field
			name="offline"
			type="radio"
			label="COM_CONFIG_FIELD_SITE_OFFLINE_LABEL"
			description="COM_CONFIG_FIELD_SITE_OFFLINE_DESC"
			class="btn-group btn-group-yesno btn-group-reversed"
			default="0"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="display_offline_message"
			type="list"
			label="COM_CONFIG_FIELD_SITE_DISPLAY_MESSAGE_LABEL"
			description="COM_CONFIG_FIELD_SITE_DISPLAY_MESSAGE_DESC"
			default="1"
			filter="integer"
			showon="offline:1"
			>
			<option value="0">JHIDE</option>
			<option value="1">COM_CONFIG_FIELD_VALUE_DISPLAY_OFFLINE_MESSAGE_CUSTOM</option>
			<option value="2">COM_CONFIG_FIELD_VALUE_DISPLAY_OFFLINE_MESSAGE_LANGUAGE</option>
		</field>

		<field
			name="offline_message"
			type="textarea"
			label="COM_CONFIG_FIELD_OFFLINE_MESSAGE_LABEL"
			description="COM_CONFIG_FIELD_OFFLINE_MESSAGE_DESC"
			filter="safehtml"
			cols="60"
			rows="2"
			showon="offline:1[AND]display_offline_message:1"
		/>

		<field
			name="offline_image"
			type="media"
			label="COM_CONFIG_FIELD_OFFLINE_IMAGE_LABEL"
			description="COM_CONFIG_FIELD_OFFLINE_IMAGE_DESC"
			showon="offline:1"
		/>

		<field
			name="frontediting"
			type="list"
			label="COM_CONFIG_FRONTEDITING_LABEL"
			description="COM_CONFIG_FRONTEDITING_DESC"
			default="1"
			filter="integer"
			>
			<option value="2">COM_CONFIG_FRONTEDITING_MENUSANDMODULES</option>
			<option value="1">COM_CONFIG_FRONTEDITING_MODULES</option>
			<option value="0">JNONE</option>
		</field>

		<field
			name="editor"
			type="plugins"
			label="COM_CONFIG_FIELD_DEFAULT_EDITOR_LABEL"
			description="COM_CONFIG_FIELD_DEFAULT_EDITOR_DESC"
			folder="editors"
			default="tinymce"
			filter="cmd"
		/>

		<field
			name="captcha"
			type="plugins"
			label="COM_CONFIG_FIELD_DEFAULT_CAPTCHA_LABEL"
			description="COM_CONFIG_FIELD_DEFAULT_CAPTCHA_DESC"
			folder="captcha"
			default="0"
			filter="cmd"
			>
			<option value="0">JOPTION_DO_NOT_USE</option>
		</field>

		<field
			name="access"
			type="accesslevel"
			label="COM_CONFIG_FIELD_DEFAULT_ACCESS_LEVEL_LABEL"
			description="COM_CONFIG_FIELD_DEFAULT_ACCESS_LEVEL_DESC"
			default="1"
			filter="integer"
		/>

		<field
			name="list_limit"
			type="list"
			label="COM_CONFIG_FIELD_DEFAULT_LIST_LIMIT_LABEL"
			description="COM_CONFIG_FIELD_DEFAULT_LIST_LIMIT_DESC"
			default="20"
			filter="integer"
			>
			<option value="5">J5</option>
			<option value="10">J10</option>
			<option value="15">J15</option>
			<option value="20">J20</option>
			<option value="25">J25</option>
			<option value="30">J30</option>
			<option value="50">J50</option>
			<option value="100">J100</option>
			<option value="200">J200</option>
			<option value="500">J500</option>
		</field>

		<field
			name="feed_limit"
			type="list"
			label="COM_CONFIG_FIELD_DEFAULT_FEED_LIMIT_LABEL"
			description="COM_CONFIG_FIELD_DEFAULT_FEED_LIMIT_DESC"
			default="10"
			filter="integer"
			>
			<option value="5">J5</option>
			<option value="10">J10</option>
			<option value="15">J15</option>
			<option value="20">J20</option>
			<option value="25">J25</option>
			<option value="30">J30</option>
			<option value="50">J50</option>
			<option value="100">J100</option>
		</field>

		<field
			name="feed_email"
			type="list"
			label="COM_CONFIG_FIELD_FEED_EMAIL_LABEL"
			description="COM_CONFIG_FIELD_FEED_EMAIL_DESC"
			default="none"
			filter="word"
			>
			<option value="author">COM_CONFIG_FIELD_VALUE_AUTHOR_EMAIL</option>
			<option value="site">COM_CONFIG_FIELD_VALUE_SITE_EMAIL</option>
			<option value="none">COM_CONFIG_FIELD_VALUE_NO_EMAIL</option>

		</field>

	</fieldset>

	<fieldset
		name="system"
		label="CONFIG_SYSTEM_SETTINGS_LABEL">

		<field
			name="log_path"
			type="text"
			label="COM_CONFIG_FIELD_LOG_PATH_LABEL"
			description="COM_CONFIG_FIELD_LOG_PATH_DESC"
			required="true"
			filter="string"
			size="50"
		/>

	</fieldset>

	<fieldset
		name="cookie"
		label="CONFIG_COOKIE_SETTINGS_LABEL">

		<field
			name="cookie_domain"
			type="text"
			label="COM_CONFIG_FIELD_COOKIE_DOMAIN_LABEL"
			description="COM_CONFIG_FIELD_COOKIE_DOMAIN_DESC"
			filter="string"
			size="40"
		/>

		<field
			name="cookie_path"
			type="text"
			label="COM_CONFIG_FIELD_COOKIE_PATH_LABEL"
			description="COM_CONFIG_FIELD_COOKIE_PATH_DESC"
			filter="string"
			size="40"
		/>

	</fieldset>

	<fieldset
		name="permissions"
		label="CONFIG_PERMISSION_SETTINGS_LABEL">

		<field
			name="rules"
			type="rules"
			label="FIELD_RULES_LABEL"
			translate_label="false"
			validate="rules"
			filter="rules"
			>
			<action
				name="core.login.site"
				title="JACTION_LOGIN_SITE"
				description="COM_CONFIG_ACTION_LOGIN_SITE_DESC"
			/>
			<action
				name="core.login.admin"
				title="JACTION_LOGIN_ADMIN"
				description="COM_CONFIG_ACTION_LOGIN_ADMIN_DESC"
			/>
			<action
				name="core.login.offline"
				title="JACTION_LOGIN_OFFLINE"
				description="COM_CONFIG_ACTION_LOGIN_OFFLINE_DESC"
			/>
			<action
				name="core.admin"
				title="JACTION_ADMIN_GLOBAL"
				description="COM_CONFIG_ACTION_ADMIN_DESC"
			/>
			<action
				name="core.options"
				title="JACTION_OPTIONS"
				description="COM_CONFIG_ACTION_OPTIONS_DESC"
			/>
			<action
				name="core.manage"
				title="JACTION_MANAGE"
				description="COM_CONFIG_ACTION_MANAGE_DESC"
			/>
			<action
				name="core.create"
				title="JACTION_CREATE"
				description="COM_CONFIG_ACTION_CREATE_DESC"
			/>
			<action
				name="core.delete"
				title="JACTION_DELETE"
				description="COM_CONFIG_ACTION_DELETE_DESC"
			/>
			<action
				name="core.edit"
				title="JACTION_EDIT"
				description="COM_CONFIG_ACTION_EDIT_DESC"
			/>
			<action
				name="core.edit.state"
				title="JACTION_EDITSTATE"
				description="COM_CONFIG_ACTION_EDITSTATE_DESC"
			/>
			<action
				name="core.edit.own"
				title="JACTION_EDITOWN"
				description="COM_CONFIG_ACTION_EDITOWN_DESC"
			/>
			<action
				name="core.edit.value"
				title="JACTION_EDITVALUE"
				description="COM_CONFIG_ACTION_EDITVALUE_DESC"
			/>
		</field>

	</fieldset>

	<fieldset
		name="filters"
		label="COM_CONFIG_TEXT_FILTERS"
		description="COM_CONFIG_TEXT_FILTERS_DESC">

		<field
			name="filters"
			type="filters"
			label="COM_CONFIG_TEXT_FILTERS"
			filter=""
		/>

	</fieldset>

	<fieldset>

		<field
			name="asset_id"
			type="hidden"
		/>

	</fieldset>
</form>
components/com_config/model/application.php000060400000071024152453623450015161 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;

/**
 * Model for the global configuration
 *
 * @since  3.2
 */
class ConfigModelApplication extends ConfigModelForm
{
	/**
	 * Array of protected password fields from the configuration.php
	 *
	 * @var    array
	 * @since  3.9.23
	 */
	private $protectedConfigurationFields = array('password', 'secret', 'ftp_pass', 'smtppass', 'redis_server_auth', 'session_redis_server_auth');

	/**
	 * 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	1.6
	 */
	public function getForm($data = array(), $loadData = true)
	{
		// Get the form.
		$form = $this->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 containing all global config data.
	 *
	 * @since	1.6
	 */
	public function getData()
	{
		// Get the config data.
		$config = new JConfig;
		$data   = ArrayHelper::fromObject($config);

		// Get the correct driver at runtime
		$data['dbtype'] = JFactory::getDbo()->getName();

		// 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))
		{
			// $temp can sometimes be an object, and we need it to be an array
			if (is_object($temp))
			{
				$temp = ArrayHelper::fromObject($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();
		$dispatcher = JEventDispatcher::getInstance();
		$config = JFactory::getConfig();

		// Try to load the values from the configuration file
		foreach ($this->protectedConfigurationFields as $fieldKey)
		{
			if (!isset($data[$fieldKey]))
			{
				$data[$fieldKey] = $config->get($fieldKey);
			}
		}

		// Check that we aren't setting wrong database configuration
		$options = array(
			'driver'   => $data['dbtype'],
			'host'     => $data['host'],
			'user'     => $data['user'],
			'password' => $data['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);

		$result = $dispatcher->trigger('onApplicationBeforeSave', array($config));

		// Store the data.
		if (in_array(false, $result, true))
		{
			throw new RuntimeException(JText::_('COM_CONFIG_ERROR_UNKNOWN_BEFORE_SAVING'));
		}

		// Write the configuration file.
		$result = $this->writeConfigFile($config);

		// Trigger the after save event.
		$dispatcher->trigger('onApplicationAfterSave', array($config));

		return $result;
	}

	/**
	 * 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()
	{
		$dispatcher = JEventDispatcher::getInstance();

		// 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);

		$result = $dispatcher->trigger('onApplicationBeforeSave', array($config));

		// Store the data.
		if (in_array(false, $result, true))
		{
			throw new RuntimeException(JText::_('COM_CONFIG_ERROR_UNKNOWN_BEFORE_SAVING'));
		}

		// Write the configuration file.
		$result = $this->writeConfigFile($config);

		// Trigger the after save event.
		$dispatcher->trigger('onApplicationAfterSave', array($config));

		return $result;
	}

	/**
	 * 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'));
		}

		// Invalidates the cached configuration file
		if (function_exists('opcache_invalidate'))
		{
			opcache_invalidate($file);
		}

		// Attempt to make the file unwriteable if NOT 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'] = '<span class="icon-lock icon-white" aria-hidden="true"></span>' . 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 explicit permission in the current group.

			/**
			 * @todo: incorrect 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 explicit 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 explicit 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']  = '<span class="icon-lock icon-white" aria-hidden="true"></span>' . 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;
		$smtppass = $input->get('smtppass', null, 'RAW');

		$app->set('smtpauth', $input->get('smtpauth'));
		$app->set('smtpuser', $input->get('smtpuser', '', 'STRING'));
		$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'));

		// Use smtppass only if it was submitted
		if ($smtppass !== null)
		{
			$app->set('smtppass', $smtppass);
		}

		$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;
	}
}
components/com_config/controller/application/save.php000060400000006513152453623450017203 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

/**
 * Save Controller for global configuration
 *
 * @since  3.2
 */
class ConfigControllerApplicationSave extends JControllerBase
{
	/**
	 * Application object - Redeclared for proper typehinting
	 *
	 * @var    JApplicationCms
	 * @since  3.2
	 */
	protected $app;

	/**
	 * Method to save global configuration.
	 *
	 * @return  mixed  Calls $app->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');
		}

		// Clear the data from the session.
		$this->app->setUserState('com_config.config.global.data', null);

		// 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')
		{
			$form = $model->getForm();
			$return = $model->validate($form, $data);

			if ($return === false)
			{
				$this->app->setHeader('Status', 422, true);

				return false;
			}

			return $model->save($return);
		}

		// 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');

		// 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;
		}
	}
}
components/com_config/controller/application/store.php000060400000002204152453623450017372 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

/**
 * Controller for global configuration, Store Permissions in Database
 *
 * @since  3.5
 */
class ConfigControllerApplicationStore extends JControllerBase
{
	/**
	 * Method to GET permission value and give it to the model for storing in the database.
	 *
	 * @return  boolean  true on success, false when failed
	 *
	 * @since   3.5
	 */
	public function execute()
	{
		// Send json mime type.
		$this->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();
	}
}
components/com_config/controller/application/sendtestmail.php000060400000002403152453623450020733 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

/**
 * Send Test Mail Controller from global configuration
 *
 * @since  3.5
 */
class ConfigControllerApplicationSendtestmail extends JControllerBase
{
	/**
	 * Method to send the test mail.
	 *
	 * @return  string
	 *
	 * @since   3.5
	 */
	public function execute()
	{
		// Send json mime type.
		$this->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())
		{
			$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();
	}
}
components/com_config/controller/application/removeroot.php000060400000003206152453623450020442 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

/**
 * Remove Root Controller for global configuration
 *
 * @since  3.2
 */
class ConfigControllerApplicationRemoveroot extends JControllerBase
{
	/**
	 * Application object - Redeclared for proper typehinting
	 *
	 * @var    JApplicationCms
	 * @since  3.2
	 */
	protected $app;

	/**
	 * Method to remove root in global configuration.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   3.2
	 */
	public function execute()
	{
		// Check for request forgeries.
		if (!JSession::checkToken('get'))
		{
			$this->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));
	}
}
components/com_config/controller/application/display.php000060400000001046152453623450017706 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Base Display Controller
 *
 * @since  3.2
 * @note   Needed for front end view
 */
class ConfigControllerApplicationDisplay extends ConfigControllerDisplay
{
	/**
	 * Prefix for the view and model classes
	 *
	 * @var    string
	 * @since  3.2
	 */
	public $prefix = 'Config';
}
components/com_config/controller/application/cancel.php000060400000001623152453623450017467 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Cancel Controller for global configuration
 *
 * @since  3.2
 */
class ConfigControllerApplicationCancel extends ConfigControllerCanceladmin
{
	/**
	 * Method to cancel global configuration.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   3.2
	 */
	public function execute()
	{
		// Check if the user is authorized to do this.
		if (!JFactory::getUser()->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();
	}
}
components/com_config/controller/component/display.php000060400000001044152453623450017403 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Base Display Controller
 *
 * @since  3.2
 * @note   Needed for front end view
 */
class ConfigControllerComponentDisplay extends ConfigControllerDisplay
{
	/**
	 * Prefix for the view and model classes
	 *
	 * @var    string
	 * @since  3.2
	 */
	public $prefix = 'Config';
}
components/com_config/controller/component/cancel.php000060400000001354152453623450017167 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Cancel Controller for global configuration components
 *
 * @since  3.2
 */
class ConfigControllerComponentCancel extends ConfigControllerCanceladmin
{
	/**
	 * Method to cancel global configuration component.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function execute()
	{
		$this->context = 'com_config.config.global';

		$this->component = $this->input->get('component');

		$this->redirect = 'index.php?option=' . $this->component;

		parent::execute();
	}
}
components/com_config/controller/component/save.php000060400000007710152453623450016702 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Save Controller for global configuration
 *
 * @since  3.2
 */
class ConfigControllerComponentSave extends JControllerBase
{
	/**
	 * Application object - Redeclared for proper typehinting
	 *
	 * @var    JApplicationCms
	 * @since  3.2
	 */
	protected $app;

	/**
	 * Method to save global configuration.
	 *
	 * @return  mixed  Calls $app->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();

		// Make sure com_joomlaupdate and com_privacy can only be accessed by SuperUser
		if (in_array(strtolower($option), array('com_joomlaupdate', 'com_privacy'))
			&& !JFactory::getUser()->authorise('core.admin'))
		{
			$this->app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'error');

			return;
		}

		// 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':
				$this->app->enqueueMessage(JText::_('COM_CONFIG_SAVE_SUCCESS'), 'message');
			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;
	}
}
components/com_config/controllers/application.php000060400000004611152453623450016425 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Controller for global configuration
 *
 * @since       1.5
 * @deprecated  4.0
 */
class ConfigControllerApplication extends JControllerLegacy
{
	/**
	 * Class Constructor
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @since   1.5
	 * @deprecated  4.0
	 */
	public function __construct($config = array())
	{
		parent::__construct($config);

		// Map the apply task to the save method.
		$this->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();
	}
}
components/com_config/controllers/component.php000060400000003374152453623450016131 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Note: this view is intended only to be opened in a popup
 *
 * @since       1.5
 * @deprecated  4.0
 */
class ConfigControllerComponent extends JControllerLegacy
{
	/**
	 * Class Constructor
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @since   1.5
	 * @deprecated  4.0
	 */
	public function __construct($config = array())
	{
		parent::__construct($config);

		// Map the apply task to the save method.
		$this->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();
	}
}
components/com_config/view/application/html.php000060400000004125152453623450015775 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View for the global configuration
 *
 * @since  3.2
 */
class ConfigViewApplicationHtml extends ConfigViewCmsHtml
{
	public $state;

	public $form;

	public $data;

	/**
	 * Method to display the view.
	 *
	 * @return  string  The rendered view.
	 *
	 * @since   3.2
	 */
	public function render()
	{
		$form = null;
		$data = null;

		try
		{
			// Load Form and Data
			$form = $this->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');
	}
}
components/com_config/view/application/tmpl/default_permissions.php000060400000001015152453623450022057 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$this->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);
components/com_config/view/application/tmpl/default_proxy.php000060400000000637152453623450020676 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2014 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$this->name = JText::_('COM_CONFIG_PROXY_SETTINGS');
$this->fieldsname = 'proxy';
echo JLayoutHelper::render('joomla.content.options_default', $this);
components/com_config/view/application/tmpl/default_ftplogin.php000060400000002154152453623450021333 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<fieldset title="<?php echo JText::_('COM_CONFIG_FTP_DETAILS'); ?>" class="form-horizontal">
	<legend><?php echo JText::_('COM_CONFIG_FTP_DETAILS'); ?></legend>
	<?php echo JText::_('COM_CONFIG_FTP_DETAILS_TIP'); ?>
	<?php if ($this->ftp instanceof Exception) : ?>
		<p><?php echo JText::_($this->ftp->message); ?></p>
	<?php endif; ?>
	<div class="control-group">
		<div class="control-label"><label for="username"><?php echo JText::_('JGLOBAL_USERNAME'); ?></label></div>
		<div class="controls">
			<input type="text" id="username" name="username" class="input_box" size="70" value="" />
		</div>
	</div>
	<div class="control-group">
		<div class="control-label"><?php echo JText::_('JGLOBAL_PASSWORD'); ?></div>
		<div class="controls">
			<input type="password" id="password" name="password" class="input_box" size="70" value="" />
		</div>
	</div>
</fieldset>
components/com_config/view/application/tmpl/default_mail.php000060400000002360152453623450020432 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('jquery.token');
JHtml::_('script', 'system/sendtestmail.js', array('version' => '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 '<button class="btn btn-small" data-ajaxuri="' . $ajaxUri . '"  type="button" id="sendtestmail">
		<span>' . JText::_('COM_CONFIG_SENDMAIL_ACTION_BUTTON') . '</span>
	</button>';
components/com_config/view/application/tmpl/default_ftp.php000060400000000633152453623450020302 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$this->name = JText::_('COM_CONFIG_FTP_SETTINGS');
$this->fieldsname = 'ftp';
echo JLayoutHelper::render('joomla.content.options_default', $this);
components/com_config/view/application/tmpl/default_cookie.php000060400000000641152453623450020761 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$this->name = JText::_('COM_CONFIG_COOKIE_SETTINGS');
$this->fieldsname = 'cookie';
echo JLayoutHelper::render('joomla.content.options_default', $this);
components/com_config/view/application/tmpl/default_navigation.php000060400000001614152453623450021650 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<ul class="nav nav-list">
	<?php if ($this->userIsSuperAdmin) : ?>
		<li class="nav-header"><?php echo JText::_('COM_CONFIG_SYSTEM'); ?></li>
		<li class="active">
			<a href="index.php?option=com_config"><?php echo JText::_('COM_CONFIG_GLOBAL_CONFIGURATION'); ?></a>
		</li>
		<li class="divider"></li>
	<?php endif; ?>
	<li class="nav-header"><?php echo JText::_('COM_CONFIG_COMPONENT_FIELDSET_LABEL'); ?></li>
	<?php foreach ($this->components as $component) : ?>
		<li>
			<a href="index.php?option=com_config&view=component&component=<?php echo $component; ?>"><?php echo JText::_($component); ?></a>
		</li>
	<?php endforeach; ?>
</ul>
components/com_config/view/application/tmpl/default_server.php000060400000000641152453623450021016 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$this->name = JText::_('COM_CONFIG_SERVER_SETTINGS');
$this->fieldsname = 'server';
echo JLayoutHelper::render('joomla.content.options_default', $this);
components/com_config/view/application/tmpl/default_database.php000060400000000645152453623450021260 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$this->name = JText::_('COM_CONFIG_DATABASE_SETTINGS');
$this->fieldsname = 'database';
echo JLayoutHelper::render('joomla.content.options_default', $this);
components/com_config/view/application/tmpl/default_filters.php000060400000000743152453623450021163 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$this->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);
components/com_config/view/application/tmpl/default_cache.php000060400000000637152453623450020560 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$this->name = JText::_('COM_CONFIG_CACHE_SETTINGS');
$this->fieldsname = 'cache';
echo JLayoutHelper::render('joomla.content.options_default', $this);
components/com_config/view/application/tmpl/default_session.php000060400000000643152453623450021175 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$this->name = JText::_('COM_CONFIG_SESSION_SETTINGS');
$this->fieldsname = 'session';
echo JLayoutHelper::render('joomla.content.options_default', $this);
components/com_config/view/application/tmpl/default_seo.php000060400000000633152453623450020277 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$this->name = JText::_('COM_CONFIG_SEO_SETTINGS');
$this->fieldsname = 'seo';
echo JLayoutHelper::render('joomla.content.options_default', $this);
components/com_config/view/application/tmpl/default_debug.php000060400000000637152453623450020603 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$this->name = JText::_('COM_CONFIG_DEBUG_SETTINGS');
$this->fieldsname = 'debug';
echo JLayoutHelper::render('joomla.content.options_default', $this);
components/com_config/view/application/tmpl/default_metadata.php000060400000000645152453623450021274 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$this->name = JText::_('COM_CONFIG_METADATA_SETTINGS');
$this->fieldsname = 'metadata';
echo JLayoutHelper::render('joomla.content.options_default', $this);
components/com_config/view/application/tmpl/default_locale.php000060400000000643152453623450020751 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$this->name = JText::_('COM_CONFIG_LOCATION_SETTINGS');
$this->fieldsname = 'locale';
echo JLayoutHelper::render('joomla.content.options_default', $this);
components/com_config/view/application/tmpl/default_site.php000060400000000635152453623450020457 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$this->name = JText::_('COM_CONFIG_SITE_SETTINGS');
$this->fieldsname = 'site';
echo JLayoutHelper::render('joomla.content.options_default', $this);
components/com_config/view/application/tmpl/default_system.php000060400000000641152453623450021034 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$this->name = JText::_('COM_CONFIG_SYSTEM_SETTINGS');
$this->fieldsname = 'system';
echo JLayoutHelper::render('joomla.content.options_default', $this);
components/com_config/view/application/tmpl/default.xml000060400000000314152453623450017436 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_CONFIG_CONFIG_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_CONFIG_CONFIG_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_config/view/application/tmpl/default.php000060400000010312152453623450017424 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

// Load tooltips behavior
JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');
JHtml::_('bootstrap.tooltip');
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.application" || document.formvalidator.isValid(document.getElementById("application-form")))
		{
			jQuery("#permissions-sliders select").attr("disabled", "disabled");
			Joomla.submitform(task, document.getElementById("application-form"));
		}
	};
');
?>

<form action="<?php echo JRoute::_('index.php?option=com_config'); ?>" id="application-form" method="post" name="adminForm" class="form-validate">
	<div class="row-fluid">
		<!-- Begin Sidebar -->
		<div id="sidebar" class="span2">
			<div class="sidebar-nav">
				<?php echo $this->loadTemplate('navigation'); ?>
				<?php
				// Display the submenu position modules
				$this->submenumodules = JModuleHelper::getModules('submenu');
				foreach ($this->submenumodules as $submenumodule)
				{
					$output = JModuleHelper::renderModule($submenumodule);
					$params = new Registry($submenumodule->params);
					echo $output;
				}
				?>
			</div>
		</div>
		<!-- End Sidebar -->
		<!-- Begin Content -->
		<div class="span10">
			<ul class="nav nav-tabs">
				<li class="active"><a href="#page-site" data-toggle="tab"><?php echo JText::_('JSITE'); ?></a></li>
				<li><a href="#page-system" data-toggle="tab"><?php echo JText::_('COM_CONFIG_SYSTEM'); ?></a></li>
				<li><a href="#page-server" data-toggle="tab"><?php echo JText::_('COM_CONFIG_SERVER'); ?></a></li>
				<li><a href="#page-filters" data-toggle="tab"><?php echo JText::_('COM_CONFIG_TEXT_FILTERS'); ?></a></li>
				<?php if ($this->ftp) : ?>
					<li><a href="#page-ftp" data-toggle="tab"><?php echo JText::_('COM_CONFIG_FTP_SETTINGS'); ?></a></li>
				<?php endif; ?>
				<li><a href="#page-permissions" data-toggle="tab"><?php echo JText::_('COM_CONFIG_PERMISSIONS'); ?></a></li>
			</ul>
			<div id="config-document" class="tab-content">
				<div id="page-site" class="tab-pane active">
					<div class="row-fluid">
						<div class="span6">
							<?php echo $this->loadTemplate('site'); ?>
							<?php echo $this->loadTemplate('metadata'); ?>
						</div>
						<div class="span6">
							<?php echo $this->loadTemplate('seo'); ?>
							<?php echo $this->loadTemplate('cookie'); ?>
						</div>
					</div>
				</div>
				<div id="page-system" class="tab-pane">
					<div class="row-fluid">
						<div class="span12">
							<?php echo $this->loadTemplate('system'); ?>
							<?php echo $this->loadTemplate('debug'); ?>
							<?php echo $this->loadTemplate('cache'); ?>
							<?php echo $this->loadTemplate('session'); ?>
						</div>
					</div>
				</div>
				<div id="page-server" class="tab-pane">
					<div class="row-fluid">
						<div class="span6">
							<?php echo $this->loadTemplate('server'); ?>
							<?php echo $this->loadTemplate('locale'); ?>
							<?php echo $this->loadTemplate('ftp'); ?>
							<?php echo $this->loadTemplate('proxy'); ?>
						</div>
						<div class="span6">
							<?php echo $this->loadTemplate('database'); ?>
							<?php echo $this->loadTemplate('mail'); ?>
						</div>
					</div>
				</div>
				<div id="page-filters" class="tab-pane">
					<div class="row-fluid">
						<?php echo $this->loadTemplate('filters'); ?>
					</div>
				</div>
				<?php if ($this->ftp) : ?>
					<div id="page-ftp" class="tab-pane">
						<?php echo $this->loadTemplate('ftplogin'); ?>
					</div>
				<?php endif; ?>
				<div id="page-permissions" class="tab-pane">
					<div class="row-fluid">
						<?php echo $this->loadTemplate('permissions'); ?>
					</div>
				</div>
				<input type="hidden" name="task" value="" />
				<?php echo JHtml::_('form.token'); ?>
			</div>
		</div>
		<!-- End Content -->
	</div>
</form>
components/com_config/view/application/json.php000060400000002654152453623450016007 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View for the component configuration
 *
 * @since  3.2
 */
class ConfigViewApplicationJson extends ConfigViewCmsJson
{
	public $state;

	public $data;

	/**
	 * Display the view
	 *
	 * @return  string  The rendered view.
	 *
	 * @since   3.2
	 */
	public function render()
	{
		try
		{
			$this->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);
	}
}
components/com_config/view/component/tmpl/default_navigation.php000060400000001777152453623450021361 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<ul class="nav nav-list">
	<?php if ($this->userIsSuperAdmin) : ?>
		<li class="nav-header"><?php echo JText::_('COM_CONFIG_SYSTEM'); ?></li>
		<li><a href="index.php?option=com_config"><?php echo JText::_('COM_CONFIG_GLOBAL_CONFIGURATION'); ?></a></li>
		<li class="divider"></li>
	<?php endif; ?>
	<li class="nav-header"><?php echo JText::_('COM_CONFIG_COMPONENT_FIELDSET_LABEL'); ?></li>
	<?php foreach ($this->components as $component) : ?>
		<?php
		$active = '';
		if ($this->currentComponent === $component)
		{
			$active = ' class="active"';
		}
		?>
		<li<?php echo $active; ?>>
			<a href="index.php?option=com_config&view=component&component=<?php echo $component; ?>"><?php echo JText::_($component); ?></a>
		</li>
	<?php endforeach; ?>
</ul>
components/com_config/view/component/tmpl/default.php000060400000011103152453623450017122 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$app = JFactory::getApplication();
$template = $app->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");
	});'
);
?>

<form action="<?php echo JRoute::_('index.php?option=com_config'); ?>" id="component-form" method="post" name="adminForm" autocomplete="off" class="form-validate form-horizontal">
	<div class="row-fluid">

		<!-- Begin Sidebar -->
		<div class="span2" id="sidebar">
			<div class="sidebar-nav">
				<?php echo $this->loadTemplate('navigation'); ?>
			</div>
		</div><!-- End Sidebar -->

		<div class="span10" id="config">

			<?php if ($this->fieldsets): ?>
			<ul class="nav nav-tabs" id="configTabs">
				<?php foreach ($this->fieldsets as $name => $fieldSet) : ?>
					<?php $dataShowOn = ''; ?>
					<?php if (!empty($fieldSet->showon)) : ?>
						<?php JHtml::_('jquery.framework'); ?>
						<?php JHtml::_('script', 'jui/cms.js', array('version' => 'auto', 'relative' => true)); ?>
						<?php $dataShowOn = ' data-showon=\'' . json_encode(JFormHelper::parseShowOnConditions($fieldSet->showon, $this->formControl)) . '\''; ?>
					<?php endif; ?>
					<?php $label = empty($fieldSet->label) ? 'COM_CONFIG_' . $name . '_FIELDSET_LABEL' : $fieldSet->label; ?>
					<li<?php echo $dataShowOn; ?>><a data-toggle="tab" href="#<?php echo $name; ?>"><?php echo JText::_($label); ?></a></li>
				<?php endforeach; ?>
			</ul><!-- /configTabs -->

			<div class="tab-content" id="configContent">
				<?php foreach ($this->fieldsets as $name => $fieldSet) : ?>
					<div class="tab-pane" id="<?php echo $name; ?>">
						<?php if (isset($fieldSet->description) && !empty($fieldSet->description)) : ?>
							<div class="tab-description alert alert-info">
								<span class="icon-info" aria-hidden="true"></span> <?php echo JText::_($fieldSet->description); ?>
							</div>
						<?php endif; ?>
						<?php foreach ($this->form->getFieldset($name) as $field) : ?>
							<?php
								$dataShowOn = '';
								$groupClass = $field->type === 'Spacer' ? ' field-spacer' : '';
							?>
							<?php if ($field->showon) : ?>
								<?php JHtml::_('jquery.framework'); ?>
								<?php JHtml::_('script', 'jui/cms.js', array('version' => 'auto', 'relative' => true)); ?>
								<?php $dataShowOn = ' data-showon=\'' . json_encode(JFormHelper::parseShowOnConditions($field->showon, $field->formControl, $field->group)) . '\''; ?>
							<?php endif; ?>
							<?php if ($field->hidden) : ?>
								<?php echo $field->input; ?>
							<?php else : ?>
								<div class="control-group<?php echo $groupClass; ?>"<?php echo $dataShowOn; ?>>
									<?php if ($name != 'permissions') : ?>
										<div class="control-label">
											<?php echo $field->label; ?>
										</div>
									<?php endif; ?>
									<div class="<?php if ($name != 'permissions') : ?>controls<?php endif; ?>">
										<?php echo $field->input; ?>
									</div>
								</div>
							<?php endif; ?>
						<?php endforeach; ?>
					</div>
				<?php endforeach; ?>
			</div><!-- /configContent -->
			<?php else: ?>
				<div class="alert alert-info"><span class="icon-info" aria-hidden="true"></span> <?php echo JText::_('COM_CONFIG_COMPONENT_NO_CONFIG_FIELDS_MESSAGE'); ?></div>
			<?php endif; ?>

		</div><!-- /config -->

		<input type="hidden" name="id" value="<?php echo $this->component->id; ?>" />
		<input type="hidden" name="component" value="<?php echo $this->component->option; ?>" />
		<input type="hidden" name="return" value="<?php echo $this->return; ?>" />
		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_config/view/component/tmpl/default.xml000060400000001017152453623450017136 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_CONFIG_COMPONENT_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_CONFIG_COMPONENT_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
	<fields name="request">
		<fieldset name="request" addfieldpath="administrator/components/com_config/model/field">
			<field
				name="component"
				type="configComponents"
				label="JGLOBAL_CHOOSE_COMPONENT_LABEL"
				description="JGLOBAL_CHOOSE_COMPONENT_DESC"
				required="true"
			/>
		</fieldset>
	</fields>
</metadata>
components/com_config/view/component/html.php000060400000004740152453623450015477 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View for the component configuration
 *
 * @since  3.2
 */
class ConfigViewComponentHtml extends ConfigViewCmsHtml
{
	public $state;

	public $form;

	public $component;

	/**
	 * Display the view
	 *
	 * @return  string  The rendered view.
	 *
	 * @since   3.2
	 *
	 */
	public function render()
	{
		$form = null;
		$component = null;

		try
		{
			$component = $this->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();

		$helpUrl = $this->form->getData()->get('helpURL');
		$helpKey = (string) $this->form->getXml()->config->help['key'];
		$helpKey = $helpKey ?: 'JHELP_COMPONENTS_' . strtoupper($this->currentComponent) . '_OPTIONS';

		JToolbarHelper::help($helpKey, (boolean) $helpUrl, null, $this->currentComponent);
	}
}
components/com_config/models/component.php000060400000001111152453623450015031 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

try
{
	JLog::add(
		sprintf('ConfigModelComponent has moved from %1$s to %2$s', __FILE__, dirname(__DIR__) . '/model/component.php'),
		JLog::WARNING,
		'deprecated'
	);
}
catch (RuntimeException $exception)
{
	// Informational log only
}

include_once JPATH_ADMINISTRATOR . '/components/com_config/model/component.php';
components/com_config/models/application.php000060400000001117152453623450015340 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_config
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

try
{
	JLog::add(
		sprintf('ConfigModelApplication has moved from %1$s to %2$s', __FILE__, dirname(__DIR__) . '/model/application.php'),
		JLog::WARNING,
		'deprecated'
	);
}
catch (RuntimeException $exception)
{
	// Informational log only
}

include_once JPATH_ADMINISTRATOR . '/components/com_config/model/application.php';
components/com_joomlaupdate/helpers/joomlaupdate.php000060400000001666152453623450017130 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Joomla! update helper.
 *
 * @since  2.5.4
 */
class JoomlaupdateHelper
{
	/**
	 * Gets a list of the actions that can be performed.
	 *
	 * @return  JObject
	 *
	 * @since	2.5.4
	 * @deprecated  3.2  Use JHelperContent::getActions() instead
	 */
	public static function getActions()
	{
		// 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('com_joomlaupdate');
	}
}
components/com_joomlaupdate/helpers/select.php000060400000002326152453623450015715 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Joomla! update selection list helper.
 *
 * @since  2.5.4
 */
class JoomlaupdateHelperSelect
{
	/**
	 * Returns an HTML select element with the different extraction modes
	 *
	 * @param   string  $default  The default value of the select element
	 * @param   string  $name     The name of the form field
	 * @param   string  $id       The id of the select field
	 *
	 * @return  string
	 *
	 * @since   2.5.4
	 */
	public static function getMethods($default = 'hybrid', $name = 'method', $id = 'extraction_method')
	{
		$options = array();
		$options[] = JHtml::_('select.option', 'direct', JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_METHOD_DIRECT'));
		$options[] = JHtml::_('select.option', 'hybrid', JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_METHOD_HYBRID'));
		$options[] = JHtml::_('select.option', 'ftp', JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_METHOD_FTP'));

		return JHtml::_('select.genericlist', $options, $name, '', 'value', 'text', $default, $id);
	}
}
components/com_joomlaupdate/controllers/update.php000060400000041236152453623450016627 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * The Joomla! update controller for the Update view
 *
 * @since  2.5.4
 */
class JoomlaupdateControllerUpdate extends JControllerLegacy
{
	/**
	 * Performs the download of the update package
	 *
	 * @return  void
	 *
	 * @since   2.5.4
	 */
	public function download()
	{
		$this->checkToken();

		$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'));
		$user = JFactory::getUser();

		try
		{
			JLog::add(JText::sprintf('COM_JOOMLAUPDATE_UPDATE_LOG_START', $user->id, $user->name, JVERSION), JLog::INFO, 'Update');
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		$this->_applyCredentials();

		/** @var JoomlaupdateModelDefault $model */
		$model       = $this->getModel('Default');
		$result      = $model->download();
		$file        = $result['basename'];
		$message     = null;
		$messageType = null;

		// The validation was not successful for now just a warning.
		// TODO: In Joomla 4 this will abort the installation
		if ($result['check'] === false)
		{
			$message = JText::_('COM_JOOMLAUPDATE_VIEW_UPDATE_CHECKSUM_WRONG');
			$messageType = 'warning';

			try
			{
				JLog::add($message, JLog::INFO, 'Update');
			}
			catch (RuntimeException $exception)
			{
				// Informational log only
			}
		}

		if ($file)
		{
			JFactory::getApplication()->setUserState('com_joomlaupdate.file', $file);
			$url = 'index.php?option=com_joomlaupdate&task=update.install&' . JFactory::getSession()->getFormToken() . '=1';

			try
			{
				JLog::add(JText::sprintf('COM_JOOMLAUPDATE_UPDATE_LOG_FILE', $file), JLog::INFO, 'Update');
			}
			catch (RuntimeException $exception)
			{
				// Informational log only
			}
		}
		else
		{
			JFactory::getApplication()->setUserState('com_joomlaupdate.file', null);
			$url = 'index.php?option=com_joomlaupdate';
			$message = JText::_('COM_JOOMLAUPDATE_VIEW_UPDATE_DOWNLOADFAILED');
			$messageType = 'error';
		}

		$this->setRedirect($url, $message, $messageType);
	}

	/**
	 * Start the installation of the new Joomla! version
	 *
	 * @return  void
	 *
	 * @since   2.5.4
	 */
	public function install()
	{
		$this->checkToken('get');
		JFactory::getApplication()->setUserState('com_joomlaupdate.oldversion', JVERSION);

		$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_INSTALL'), JLog::INFO, 'Update');
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		$this->_applyCredentials();

		/** @var JoomlaupdateModelDefault $model */
		$model = $this->getModel('Default');

		$file = JFactory::getApplication()->getUserState('com_joomlaupdate.file', null);
		$model->createRestorationFile($file);

		$this->display();
	}

	/**
	 * Finalise the upgrade by running the necessary scripts
	 *
	 * @return  void
	 *
	 * @since   2.5.4
	 */
	public function finalise()
	{
		/*
		 * Finalize with login page. Used for pre-token check versions
		 * to allow updates without problems but with a maximum of security.
		 */
		if (!JSession::checkToken('get'))
		{
			$this->setRedirect('index.php?option=com_joomlaupdate&view=update&layout=finaliseconfirm');

			return false;
		}

		$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_FINALISE'), JLog::INFO, 'Update');
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		$this->_applyCredentials();

		/** @var JoomlaupdateModelDefault $model */
		$model = $this->getModel('Default');

		$model->finaliseUpgrade();

		$url = 'index.php?option=com_joomlaupdate&task=update.cleanup&' . JFactory::getSession()->getFormToken() . '=1';
		$this->setRedirect($url);
	}

	/**
	 * Clean up after ourselves
	 *
	 * @return  void
	 *
	 * @since   2.5.4
	 */
	public function cleanup()
	{
		/*
		 * Cleanup with login page. Used for pre-token check versions to be able to update
		 * from =< 3.2.7 to allow updates without problems but with a maximum of security.
		 */
		if (!JSession::checkToken('get'))
		{
			$this->setRedirect('index.php?option=com_joomlaupdate&view=update&layout=finaliseconfirm');

			return false;
		}

		$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_CLEANUP'), JLog::INFO, 'Update');
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		$this->_applyCredentials();

		/** @var JoomlaupdateModelDefault $model */
		$model = $this->getModel('Default');

		$model->cleanUp();

		$url = 'index.php?option=com_joomlaupdate&view=default&layout=complete';
		$this->setRedirect($url);

		try
		{
			JLog::add(JText::sprintf('COM_JOOMLAUPDATE_UPDATE_LOG_COMPLETE', JVERSION), JLog::INFO, 'Update');
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}
	}

	/**
	 * Purges updates.
	 *
	 * @return  void
	 *
	 * @since   3.0
	 */
	public function purge()
	{
		// Check for request forgeries
		$this->checkToken();

		// Purge updates
		/** @var JoomlaupdateModelDefault $model */
		$model = $this->getModel('Default');
		$model->purge();

		$url = 'index.php?option=com_joomlaupdate';
		$this->setRedirect($url, $model->_message);
	}

	/**
	 * Uploads an update package to the temporary directory, under a random name
	 *
	 * @return  void
	 *
	 * @since   3.6.0
	 */
	public function upload()
	{
		// Check for request forgeries
		$this->checkToken();

		// Did a non Super User tried to upload something (a.k.a. pathetic hacking attempt)?
		JFactory::getUser()->authorise('core.admin') or jexit(JText::_('JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN'));

		$this->_applyCredentials();

		/** @var JoomlaupdateModelDefault $model */
		$model = $this->getModel('Default');

		try
		{
			$model->upload();
		}
		catch (RuntimeException $e)
		{
			$url = 'index.php?option=com_joomlaupdate';
			$this->setRedirect($url, $e->getMessage(), 'error');

			return;
		}

		$token = JSession::getFormToken();
		$url = 'index.php?option=com_joomlaupdate&task=update.captive&' . $token . '=1';
		$this->setRedirect($url);
	}

	/**
	 * Checks there is a valid update package and redirects to the captive view for super admin authentication.
	 *
	 * @return  array
	 *
	 * @since   3.6.0
	 */
	public function captive()
	{
		// Check for request forgeries
		$this->checkToken('get');

		// Did a non Super User tried to upload something (a.k.a. pathetic hacking attempt)?
		if (!JFactory::getUser()->authorise('core.admin'))
		{
			throw new RuntimeException(JText::_('JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN'), 403);
		}

		// Do I really have an update package?
		$tempFile = JFactory::getApplication()->getUserState('com_joomlaupdate.temp_file', null);

		JLoader::import('joomla.filesystem.file');

		if (empty($tempFile) || !JFile::exists($tempFile))
		{
			throw new RuntimeException(JText::_('JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN'), 403);
		}

		$this->input->set('view', 'upload');
		$this->input->set('layout', 'captive');

		$this->display();
	}

	/**
	 * Checks the admin has super administrator privileges and then proceeds with the update.
	 *
	 * @return  array
	 *
	 * @since   3.6.0
	 */
	public function confirm()
	{
		// Check for request forgeries
		$this->checkToken();

		// Did a non Super User tried to upload something (a.k.a. pathetic hacking attempt)?
		if (!JFactory::getUser()->authorise('core.admin'))
		{
			throw new RuntimeException(JText::_('JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN'), 403);
		}

		// Get the model
		/** @var JoomlaupdateModelDefault $model */
		$model = $this->getModel('default');

		// Get the captive file before the session resets
		$tempFile = JFactory::getApplication()->getUserState('com_joomlaupdate.temp_file', null);

		// Do I really have an update package?
		if (!$model->captiveFileExists())
		{
			throw new RuntimeException(JText::_('JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN'), 403);
		}

		// Try to log in
		$credentials = array(
			'username'  => $this->input->post->get('username', '', 'username'),
			'password'  => $this->input->post->get('passwd', '', 'raw'),
			'secretkey' => $this->input->post->get('secretkey', '', 'raw'),
		);

		$result = $model->captiveLogin($credentials);

		if (!$result)
		{
			$model->removePackageFiles();

			throw new RuntimeException(JText::_('JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN'), 403);
		}

		// Set the update source in the session
		JFactory::getApplication()->setUserState('com_joomlaupdate.file', basename($tempFile));

		try
		{
			JLog::add(JText::sprintf('COM_JOOMLAUPDATE_UPDATE_LOG_FILE', $tempFile), JLog::INFO, 'Update');
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		// Redirect to the actual update page
		$url = 'index.php?option=com_joomlaupdate&task=update.install&' . JFactory::getSession()->getFormToken() . '=1';
		$this->setRedirect($url);
	}

	/**
	 * 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  JoomlaupdateControllerUpdate  This object to support chaining.
	 *
	 * @since   2.5.4
	 */
	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', 'update');
		$vFormat = $document->getType();
		$lName   = $this->input->get('layout', 'default', 'string');

		// Get and render the view.
		if ($view = $this->getView($vName, $vFormat))
		{
			// Get the model for the view.
			/** @var JoomlaupdateModelDefault $model */
			$model = $this->getModel('Default');

			// 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();
		}

		return $this;
	}

	/**
	 * Applies FTP credentials to Joomla! itself, when required
	 *
	 * @return  void
	 *
	 * @since   2.5.4
	 */
	protected function _applyCredentials()
	{
		JFactory::getApplication()->getUserStateFromRequest('com_joomlaupdate.method', 'method', 'direct', 'cmd');

		if (!JClientHelper::hasCredentials('ftp'))
		{
			$user = JFactory::getApplication()->getUserStateFromRequest('com_joomlaupdate.ftp_user', 'ftp_user', null, 'raw');
			$pass = JFactory::getApplication()->getUserStateFromRequest('com_joomlaupdate.ftp_pass', 'ftp_pass', null, 'raw');

			if ($user != '' && $pass != '')
			{
				// Add credentials to the session
				if (!JClientHelper::setCredentials('ftp', $user, $pass))
				{
					JError::raiseWarning(500, JText::_('JLIB_CLIENT_ERROR_HELPER_SETCREDENTIALSFROMREQUEST_FAILED'));
				}
			}
		}
	}

	/**
	 * Checks the admin has super administrator privileges and then proceeds with the final & cleanup steps.
	 *
	 * @return  array
	 *
	 * @since   3.6.3
	 */
	public function finaliseconfirm()
	{
		// Check for request forgeries
		$this->checkToken();

		// Did a non Super User try do this?
		if (!JFactory::getUser()->authorise('core.admin'))
		{
			throw new RuntimeException(JText::_('JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN'), 403);
		}

		// Get the model
		/** @var JoomlaupdateModelDefault $model */
		$model = $this->getModel('default');

		// Try to log in
		$credentials = array(
			'username'  => $this->input->post->get('username', '', 'username'),
			'password'  => $this->input->post->get('passwd', '', 'raw'),
			'secretkey' => $this->input->post->get('secretkey', '', 'raw'),
		);

		$result = $model->captiveLogin($credentials);

		// The login fails?
		if (!$result)
		{
			JFactory::getApplication()->enqueueMessage(JText::_('JGLOBAL_AUTH_INVALID_PASS'), 'warning');
			$this->setRedirect('index.php?option=com_joomlaupdate&view=update&layout=finaliseconfirm');

			return false;
		}

		// Redirect back to the actual finalise page
		$this->setRedirect('index.php?option=com_joomlaupdate&task=update.finalise&' . JFactory::getSession()->getFormToken() . '=1');
	}

	/**
	 * Fetch Extension update XML proxy. Used to prevent Access-Control-Allow-Origin errors.
	 * Prints a JSON string.
	 * Called from JS.
	 *
	 * @since   3.10.0
	 *
	 * @return void
	 */
	public function fetchExtensionCompatibility()
	{
		$extensionID = $this->input->get('extension-id', '', 'DEFAULT');
		$joomlaTargetVersion = $this->input->get('joomla-target-version', '', 'DEFAULT');
		$joomlaCurrentVersion = $this->input->get('joomla-current-version', '', JVERSION);
		$extensionVersion = $this->input->get('extension-version', '', 'DEFAULT');

		/** @var JoomlaupdateModelDefault $model */
		$model = $this->getModel('default');
		$upgradeCompatibilityStatus  = $model->fetchCompatibility($extensionID, $joomlaTargetVersion);
		$currentCompatibilityStatus  = $model->fetchCompatibility($extensionID, $joomlaCurrentVersion);
		$upgradeUpdateVersion        = false;
		$currentUpdateVersion        = false;

		$upgradeWarning = 0;

		if ($upgradeCompatibilityStatus->state == 1 && !empty($upgradeCompatibilityStatus->compatibleVersions))
		{
			$upgradeUpdateVersion = end($upgradeCompatibilityStatus->compatibleVersions);
		}

		if ($currentCompatibilityStatus->state == 1 && !empty($currentCompatibilityStatus->compatibleVersions))
		{
			$currentUpdateVersion = end($currentCompatibilityStatus->compatibleVersions);
		}

		if ($upgradeUpdateVersion !== false)
		{
			$upgradeOldestVersion = $upgradeCompatibilityStatus->compatibleVersions[0];

			if ($currentUpdateVersion !== false)
			{
				// If there are updates compatible with both CMS versions use these
				$bothCompatibleVersions = array_values(
					array_intersect($upgradeCompatibilityStatus->compatibleVersions, $currentCompatibilityStatus->compatibleVersions)
				);

				if (!empty($bothCompatibleVersions))
				{
					$upgradeOldestVersion = $bothCompatibleVersions[0];
					$upgradeUpdateVersion = end($bothCompatibleVersions);
				}
			}

			if (version_compare($upgradeOldestVersion, $extensionVersion, '>'))
			{
				// Installed version is empty or older than the oldest compatible update: Update required
				$resultGroup = 2;
			}
			else
			{
				// Current version is compatible
				$resultGroup = 3;
			}

			if ($currentUpdateVersion !== false && version_compare($upgradeUpdateVersion, $currentUpdateVersion, '<'))
			{
				// Special case warning when version compatible with target is lower than current
				$upgradeWarning = 2;
			}
		}
		elseif ($currentUpdateVersion !== false)
		{
			// No compatible version for target version but there is a compatible version for current version
			$resultGroup = 1;
		}
		else
		{
			// No update server available
			$resultGroup = 1;
		}

		// Do we need to capture
		$combinedCompatibilityStatus = array(
			'upgradeCompatibilityStatus' => (object) array(
				'state' => $upgradeCompatibilityStatus->state,
				'compatibleVersion' => $upgradeUpdateVersion
			),
			'currentCompatibilityStatus' => (object) array(
				'state' => $currentCompatibilityStatus->state,
				'compatibleVersion' => $currentUpdateVersion
			),
			'resultGroup' => $resultGroup,
			'upgradeWarning' => $upgradeWarning,
		);

		$this->app = JFactory::getApplication();
		$this->app->mimeType = 'application/json';
		$this->app->charSet = 'utf-8';
		$this->app->setHeader('Content-Type', $this->app->mimeType . '; charset=' . $this->app->charSet);
		$this->app->sendHeaders();

		try
		{
			echo new JResponseJson($combinedCompatibilityStatus);
		}
		catch (Exception $e)
		{
			echo $e;
		}

		$this->app->close();
	}

	/**
	 * Fetch and report updates in JSON format, for AJAX requests
	 *
	 * @return  void
	 *
	 * @since   3.10.10
	 */
	public function ajax()
	{
		$app = JFactory::getApplication();

		if (!JSession::checkToken('get'))
		{
			$app->setHeader('status', 403, true);
			$app->sendHeaders();
			echo JText::_('JINVALID_TOKEN_NOTICE');
			$app->close();
		}

		$model = $this->getModel('default');
		$updateInfo = $model->getUpdateInformation();

		$update   = array();
		$update[] = array('version' => $updateInfo['latest']);

		echo json_encode($update);

		$app->close();
	}
}
components/com_joomlaupdate/joomlaupdate.xml000060400000002552152453623450015472 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_joomlaupdate</name>
	<author>Joomla! Project</author>
	<creationDate>February 2012</creationDate>
	<copyright>(C) 2012 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.10.1</version>
	<description>COM_JOOMLAUPDATE_XML_DESCRIPTION</description>
	<media destination="com_joomlaupdate" folder="media">
		<folder>js</folder>
	</media>
	<administration>
		<menu img="class:joomlaupdate">com_joomlaupdate</menu>
		<files folder="admin">
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<filename>joomlaupdate.php</filename>
			<filename>restore.php</filename>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_joomlaupdate.ini</language>
			<language tag="en-GB">language/en-GB.com_joomlaupdate.sys.ini</language>
		</languages>
	</administration>
	<updateservers>
		<server type="extension" name="Joomla! Update Component Update Site">https://update.joomla.org/core/extensions/com_joomlaupdate.xml</server>
	</updateservers>
</extension>
components/com_joomlaupdate/controller.php000060400000004026152453623450015156 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Joomla! Update Controller
 *
 * @since  2.5.4
 */
class JoomlaupdateController extends JControllerLegacy
{
	/**
	 * 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  JController  This object to support chaining.
	 *
	 * @since   2.5.4
	 */
	public function display($cachable = false, $urlparams = false)
	{
		// Get the document object.
		$document = JFactory::getDocument();

		// Set the default view name and format from the Request.
		$vName   = $this->input->get('view', 'default');
		$vFormat = $document->getType();
		$lName   = $this->input->get('layout', 'default', 'string');

		// Get and render the view.
		if ($view = $this->getView($vName, $vFormat))
		{
			$ftp = JClientHelper::setCredentialsFromRequest('ftp');
			$view->ftp = &$ftp;

			// Get the model for the view.
			/** @var JoomlaupdateModelDefault $model */
			$model = $this->getModel('default');

			// Push the Installer Warnings model into the view, if we can load it
			static::addModelPath(JPATH_ADMINISTRATOR . '/components/com_installer/models', 'InstallerModel');

			$warningsModel = $this->getModel('warnings', 'InstallerModel');

			if (is_object($warningsModel))
			{
				$view->setModel($warningsModel, false);
			}

			// Perform update source preference check and refresh update information.
			$model->applyUpdateSite();
			$model->refreshUpdates();

			// 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();
		}

		return $this;
	}
}
components/com_joomlaupdate/joomlaupdate.php000060400000001061152453623450015453 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

if (!JFactory::getUser()->authorise('core.admin'))
{
	throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
}

$controller = JControllerLegacy::getInstance('Joomlaupdate');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
components/com_joomlaupdate/restore_finalisation.php000060400000010171152453623450017214 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// Require the restoration environment or fail cold. Prevents direct web access.
defined('_AKEEBA_RESTORATION') or die();

// Fake a miniature Joomla environment
if (!defined('_JEXEC'))
{
	define('_JEXEC', 1);
}

if (!function_exists('jimport'))
{
	/**
	 * We don't use it but the post-update script is using it anyway, so LET'S FAKE IT!
	 *
	 * @param   string  $path  A dot syntax path.
	 * @param   string  $base  Search this directory for the class.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   3.5.1
	 */
	function jimport($path, $base = null)
	{
		// Do nothing
	}
}

// Fake the JFile class, mapping it to Restore's post-processing class
if (!class_exists('JFile'))
{
	/**
	 * JFile mock class proxing behaviour in the post-upgrade script to that of either native PHP or restore.php
	 *
	 * @since  3.5.1
	 */
	abstract class JFile
	{
		/**
		 * Proxies checking a folder exists to the native php version
		 *
		 * @param   string  $fileName  The path to the file to be checked
		 *
		 * @return  boolean
		 *
		 * @since   3.5.1
		 */
		public static function exists($fileName)
		{
			return @file_exists($fileName);
		}

		/**
		 * Proxies deleting a file to the restore.php version
		 *
		 * @param   string  $fileName  The path to the file to be deleted
		 *
		 * @return  boolean
		 *
		 * @since   3.5.1
		 */
		public static function delete($fileName)
		{
			$postproc = AKFactory::getPostProc();
			$postproc->unlink($fileName);
		}
	}
}

// Fake the JFolder class, mapping it to Restore's post-processing class
if (!class_exists('JFolder'))
{
	/**
	 * JFolder mock class proxing behaviour in the post-upgrade script to that of either native PHP or restore.php
	 *
	 * @since  3.5.1
	 */
	abstract class JFolder
	{
		/**
		 * Proxies checking a folder exists to the native php version
		 *
		 * @param   string  $folderName  The path to the folder to be checked
		 *
		 * @return  boolean
		 *
		 * @since   3.5.1
		 */
		public static function exists($folderName)
		{
			return @is_dir($folderName);
		}

		/**
		 * Proxies deleting a folder to the restore.php version
		 *
		 * @param   string  $folderName  The path to the folder to be deleted
		 *
		 * @return  void
		 *
		 * @since   3.5.1
		 */
		public static function delete($folderName)
		{
			recursive_remove_directory($folderName);
		}
	}
}

// Fake the JText class - we aren't going to show errors to people anyhow
if (!class_exists('JText'))
{
	/**
	 * JText mock class proxing behaviour in the post-upgrade script to that of either native PHP or restore.php
	 *
	 * @since  3.5.1
	 */
	abstract class JText
	{
		/**
		 * No need for translations in a non-interactive script, so always return an empty string here
		 *
		 * @param   string  $text  A language constant
		 *
		 * @return  string
		 *
		 * @since   3.5.1
		 */
		public static function sprintf($text)
		{
			return '';
		}
	}
}

if (!function_exists('finalizeRestore'))
{
	/**
	 * Run part of the Joomla! finalisation script, namely the part that cleans up unused files/folders
	 *
	 * @param   string  $siteRoot     The root to the Joomla! site
	 * @param   string  $restorePath  The base path to restore.php
	 *
	 * @return  void
	 *
	 * @since   3.5.1
	 */
	function finalizeRestore($siteRoot, $restorePath)
	{
		if (!defined('JPATH_ROOT'))
		{
			define('JPATH_ROOT', $siteRoot);
		}

		$filePath = JPATH_ROOT . '/administrator/components/com_admin/script.php';

		if (file_exists($filePath))
		{
			require_once $filePath;
		}

		// Make sure Joomla!'s code can figure out which files exist and need be removed
		clearstatcache();

		// Remove obsolete files - prevents errors occurring in some system plugins
		if (class_exists('JoomlaInstallerScript'))
		{
			$script = new JoomlaInstallerScript;
			$script->deleteUnexistingFiles();
		}

		// Clear OPcache
		if (function_exists('opcache_reset'))
		{
			opcache_reset();
		}
		elseif (function_exists('apc_clear_cache'))
		{
			@apc_clear_cache();
		}
	}
}
components/com_joomlaupdate/models/default.php000060400000142237152453623450015711 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Extension\ExtensionHelper;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Http\HttpFactory;
use Joomla\Registry\Registry;

jimport('joomla.filesystem.folder');
jimport('joomla.filesystem.file');

/**
 * Joomla! update overview Model
 *
 * @since  2.5.4
 */
class JoomlaupdateModelDefault extends JModelLegacy
{
	/**
	 * @var   array  $updateInformation  null
	 * Holds the update information evaluated in getUpdateInformation.
	 *
	 * @since 3.10.0
	 */
	private $updateInformation = null;

	/**
	 * Detects if the Joomla! update site currently in use matches the one
	 * configured in this component. If they don't match, it changes it.
	 *
	 * @return  void
	 *
	 * @since    2.5.4
	 */
	public function applyUpdateSite()
	{
		// Determine the intended update URL.
		$params = JComponentHelper::getParams('com_joomlaupdate');

		switch ($params->get('updatesource', 'nochange'))
		{
			// "Minor & Patch Release for Current version AND Next Major Release".
			case 'next':
				$updateURL = 'https://update.joomla.org/core/sts/list_sts.xml';
				break;

			// "Testing"
			case 'testing':
				$updateURL = 'https://update.joomla.org/core/test/list_test.xml';
				break;

			// "Custom"
			// TODO: check if the customurl is valid and not just "not empty".
			case 'custom':
				if (trim($params->get('customurl', '')) != '')
				{
					$updateURL = trim($params->get('customurl', ''));
				}
				else
				{
					return JError::raiseWarning(403, JText::_('COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_CUSTOM_ERROR'));
				}
				break;

			/**
			 * "Minor & Patch Release for Current version (recommended and default)".
			 * The commented "case" below are for documenting where 'default' and legacy options falls
			 * case 'default':
			 * case 'lts':
			 * case 'sts': (It's shown as "Default" because that option does not exist any more)
			 * case 'nochange':
			 */
			default:
				$updateURL = 'https://update.joomla.org/core/list.xml';
		}

		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('us') . '.*')
			->from($db->quoteName('#__update_sites_extensions') . ' AS ' . $db->quoteName('map'))
			->join(
				'INNER', $db->quoteName('#__update_sites') . ' AS ' . $db->quoteName('us')
				. ' ON (' . 'us.update_site_id = map.update_site_id)'
			)
			->where('map.extension_id = ' . $db->quote(700));
		$db->setQuery($query);
		$update_site = $db->loadObject();

		if ($update_site->location != $updateURL)
		{
			// Modify the database record.
			$update_site->last_check_timestamp = 0;
			$update_site->location = $updateURL;
			$db->updateObject('#__update_sites', $update_site, 'update_site_id');

			// Remove cached updates.
			$query->clear()
				->delete($db->quoteName('#__updates'))
				->where($db->quoteName('extension_id') . ' = ' . $db->quote('700'));
			$db->setQuery($query);
			$db->execute();
		}
	}

	/**
	 * Makes sure that the Joomla! update cache is up-to-date.
	 *
	 * @param   boolean  $force  Force reload, ignoring the cache timeout.
	 *
	 * @return  void
	 *
	 * @since    2.5.4
	 */
	public function refreshUpdates($force = false)
	{
		if ($force)
		{
			$cache_timeout = 0;
		}
		else
		{
			$cache_timeout = 3600 * JComponentHelper::getParams('com_installer')->get('cachetimeout', 6, 'int');
		}

		$updater               = JUpdater::getInstance();
		$minimumStability      = JUpdater::STABILITY_STABLE;
		$comJoomlaupdateParams = JComponentHelper::getParams('com_joomlaupdate');

		if (in_array($comJoomlaupdateParams->get('updatesource', 'nochange'), array('testing', 'custom')))
		{
			$minimumStability = $comJoomlaupdateParams->get('minimum_stability', JUpdater::STABILITY_STABLE);
		}

		$reflection = new ReflectionObject($updater);
		$reflectionMethod = $reflection->getMethod('findUpdates');
		$methodParameters = $reflectionMethod->getParameters();

		if (count($methodParameters) >= 4)
		{
			// Reinstall support is available in JUpdater
			$updater->findUpdates(700, $cache_timeout, $minimumStability, true);
		}
		else
		{
			$updater->findUpdates(700, $cache_timeout, $minimumStability);
		}
	}

	/**
	 * Returns an array with the Joomla! update information.
	 *
	 * @return  array
	 *
	 * @since   2.5.4
	 */
	public function getUpdateInformation()
	{
		if ($this->updateInformation)
		{
			return $this->updateInformation;
		}

		// Initialise the return array.
		$this->updateInformation = array(
			'installed' => JVERSION,
			'latest'    => null,
			'object'    => null,
			'hasUpdate' => false,
			'current'   => JVERSION, // This is deprecated please use 'installed' or JVERSION directly
		);

		// Fetch the update information from the database.
		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->select('*')
			->from($db->quoteName('#__updates'))
			->where($db->quoteName('extension_id') . ' = ' . $db->quote(700));
		$db->setQuery($query);
		$updateObject = $db->loadObject();

		if (is_null($updateObject))
		{
			$this->updateInformation['latest'] = JVERSION;

			return $this->updateInformation;
		}

		// Check whether this is a valid update or not
		if (version_compare($updateObject->version, JVERSION, '<'))
		{
			// This update points to an outdated version we should not offer to update to this
			$this->updateInformation['latest'] = JVERSION;

			return $this->updateInformation;
		}

		$minimumStability      = JUpdater::STABILITY_STABLE;
		$comJoomlaupdateParams = JComponentHelper::getParams('com_joomlaupdate');

		if (in_array($comJoomlaupdateParams->get('updatesource', 'nochange'), array('testing', 'custom')))
		{
			$minimumStability = $comJoomlaupdateParams->get('minimum_stability', JUpdater::STABILITY_STABLE);
		}

		// Fetch the full update details from the update details URL.
		jimport('joomla.updater.update');
		$update = new JUpdate;
		$update->loadFromXML($updateObject->detailsurl, $minimumStability);

		// Make sure we use the current information we got from the detailsurl
		$this->updateInformation['object'] = $update;
		$this->updateInformation['latest'] = $updateObject->version;

		// Check whether we have got an update from the detailsurl or not.
		if (version_compare($this->updateInformation['latest'], JVERSION, '>'))
		{
			$this->updateInformation['hasUpdate'] = true;
		}

		return $this->updateInformation;
	}

	/**
	 * Returns an array with the configured FTP options.
	 *
	 * @return  array
	 *
	 * @since   2.5.4
	 */
	public function getFTPOptions()
	{
		$config = JFactory::getConfig();

		return array(
			'host'      => $config->get('ftp_host'),
			'port'      => $config->get('ftp_port'),
			'username'  => $config->get('ftp_user'),
			'password'  => $config->get('ftp_pass'),
			'directory' => $config->get('ftp_root'),
			'enabled'   => $config->get('ftp_enable'),
		);
	}

	/**
	 * Removes all of the updates from the table and enable all update streams.
	 *
	 * @return  boolean  Result of operation.
	 *
	 * @since   3.0
	 */
	public function purge()
	{
		$db = $this->getDbo();

		// Reset the last update check timestamp
		$query = $db->getQuery(true)
			->update($db->quoteName('#__update_sites'))
			->set($db->quoteName('last_check_timestamp') . ' = 0');
		$db->setQuery($query);
		$db->execute();

		// We should delete all core updates here
		$query = $db->getQuery(true)
			->delete($db->quoteName('#__updates'))
			->where($db->quoteName('element') . ' = ' . $db->quote('joomla'))
			->where($db->quoteName('type') . ' = ' . $db->quote('file'));
		$db->setQuery($query);

		if ($db->execute())
		{
			$this->_message = JText::_('COM_JOOMLAUPDATE_CHECKED_UPDATES');

			return true;
		}
		else
		{
			$this->_message = JText::_('COM_JOOMLAUPDATE_FAILED_TO_CHECK_UPDATES');

			return false;
		}
	}

	/**
	 * Downloads the update package to the site.
	 *
	 * @return  boolean|string  False on failure, basename of the file in any other case.
	 *
	 * @since   2.5.4
	 */
	public function download()
	{
		$updateInfo = $this->getUpdateInformation();
		$packageURL = trim($updateInfo['object']->downloadurl->_data);
		$sources    = $updateInfo['object']->get('downloadSources', array());

		// We have to manually follow the redirects here so we set the option to false.
		$httpOptions = new Registry;
		$httpOptions->set('follow_location', false);

		try
		{
			$head = HttpFactory::getHttp($httpOptions)->head($packageURL);
		}
		catch (RuntimeException $e)
		{
			// Passing false here -> download failed message
			$response['basename'] = false;

			return $response;
		}

		// Follow the Location headers until the actual download URL is known
		while (isset($head->headers['location']))
		{
			$packageURL = $head->headers['location'];

			try
			{
				$head = HttpFactory::getHttp($httpOptions)->head($packageURL);
			}
			catch (RuntimeException $e)
			{
				// Passing false here -> download failed message
				$response['basename'] = false;

				return $response;
			}
		}

		// Remove protocol, path and query string from URL
		$basename = basename($packageURL);

		if (strpos($basename, '?') !== false)
		{
			$basename = substr($basename, 0, strpos($basename, '?'));
		}

		// Find the path to the temp directory and the local package.
		$config   = JFactory::getConfig();
		$tempdir  = (string) InputFilter::getInstance(array(), array(), 1, 1)->clean($config->get('tmp_path'), 'path');
		$target   = $tempdir . '/' . $basename;
		$response = array();

		// Do we have a cached file?
		$exists = JFile::exists($target);

		if (!$exists)
		{
			// Not there, let's fetch it.
			$mirror = 0;

			while (!($download = $this->downloadPackage($packageURL, $target)) && isset($sources[$mirror]))
			{
				$name       = $sources[$mirror];
				$packageURL = trim($name->url);
				$mirror++;
			}

			$response['basename'] = $download;
		}
		else
		{
			// Is it a 0-byte file? If so, re-download please.
			$filesize = @filesize($target);

			if (empty($filesize))
			{
				$mirror = 0;

				while (!($download = $this->downloadPackage($packageURL, $target)) && isset($sources[$mirror]))
				{
					$name       = $sources[$mirror];
					$packageURL = trim($name->url);
					$mirror++;
				}

				$response['basename'] = $download;
			}

			// Yes, it's there, skip downloading.
			$response['basename'] = $basename;
		}

		$response['check'] = $this->isChecksumValid($target, $updateInfo['object']);

		return $response;
	}

	/**
	 * Return the result of the checksum of a package with the SHA256/SHA384/SHA512 tags in the update server manifest
	 *
	 * @param   string   $packagefile   Location of the package to be installed
	 * @param   JUpdate  $updateObject  The Update Object
	 *
	 * @return  boolean  False in case the validation did not work; true in any other case.
	 *
	 * @note    This method has been forked from (JInstallerHelper::isChecksumValid) so it
	 *          does not depend on an up-to-date InstallerHelper at the update time
	 *
	 * @since   3.9.0
	 */
	private function isChecksumValid($packagefile, $updateObject)
	{
		$hashes = array('sha256', 'sha384', 'sha512');

		foreach ($hashes as $hash)
		{
			if ($updateObject->get($hash, false))
			{
				$hashPackage = hash_file($hash, $packagefile);
				$hashRemote  = $updateObject->$hash->_data;

				if ($hashPackage !== $hashRemote)
				{
					// Return false in case the hash did not match
					return false;
				}
			}
		}

		// Well nothing was provided or all worked
		return true;
	}

	/**
	 * Downloads a package file to a specific directory
	 *
	 * @param   string  $url     The URL to download from
	 * @param   string  $target  The directory to store the file
	 *
	 * @return  boolean True on success
	 *
	 * @since   2.5.4
	 */
	protected function downloadPackage($url, $target)
	{
		JLoader::import('helpers.download', JPATH_COMPONENT_ADMINISTRATOR);

		try
		{
			JLog::add(JText::sprintf('COM_JOOMLAUPDATE_UPDATE_LOG_URL', $url), JLog::INFO, 'Update');
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		// Get the handler to download the package
		try
		{
			$http = JHttpFactory::getHttp(null, array('curl', 'stream'));
		}
		catch (RuntimeException $e)
		{
			return false;
		}

		jimport('joomla.filesystem.file');

		// Make sure the target does not exist.
		JFile::delete($target);

		// Download the package
		try
		{
			$result = $http->get($url);
		}
		catch (RuntimeException $e)
		{
			return false;
		}

		if (!$result || ($result->code != 200 && $result->code != 310))
		{
			return false;
		}

		// Write the file to disk
		JFile::write($target, $result->body);

		return basename($target);
	}

	/**
	 * Create restoration file.
	 *
	 * @param   string  $basename  Optional base path to the file.
	 *
	 * @return  boolean True if successful; false otherwise.
	 *
	 * @since  2.5.4
	 */
	public function createRestorationFile($basename = null)
	{
		// Get a password
		$password = JUserHelper::genRandomPassword(32);
		$app = JFactory::getApplication();
		$app->setUserState('com_joomlaupdate.password', $password);

		// Do we have to use FTP?
		$method = JFactory::getApplication()->getUserStateFromRequest('com_joomlaupdate.method', 'method', 'direct', 'cmd');

		// Get the absolute path to site's root.
		$siteroot = JPATH_SITE;

		// If the package name is not specified, get it from the update info.
		if (empty($basename))
		{
			$updateInfo = $this->getUpdateInformation();
			$packageURL = $updateInfo['object']->downloadurl->_data;
			$basename = basename($packageURL);
		}

		// Get the package name.
		$config  = JFactory::getConfig();
		$tempdir = $config->get('tmp_path');
		$file    = $tempdir . '/' . $basename;

		$filesize = @filesize($file);
		$app->setUserState('com_joomlaupdate.password', $password);
		$app->setUserState('com_joomlaupdate.filesize', $filesize);

		$data = "<?php\ndefined('_AKEEBA_RESTORATION') or die('Restricted access');\n";
		$data .= '$restoration_setup = array(' . "\n";
		$data .= <<<ENDDATA
	'kickstart.security.password' => '$password',
	'kickstart.tuning.max_exec_time' => '5',
	'kickstart.tuning.run_time_bias' => '75',
	'kickstart.tuning.min_exec_time' => '0',
	'kickstart.procengine' => '$method',
	'kickstart.setup.sourcefile' => '$file',
	'kickstart.setup.destdir' => '$siteroot',
	'kickstart.setup.restoreperms' => '0',
	'kickstart.setup.filetype' => 'zip',
	'kickstart.setup.dryrun' => '0',
	'kickstart.setup.renamefiles' => array(),
	'kickstart.setup.postrenamefiles' => false
ENDDATA;

		if ($method != 'direct')
		{
			/*
			 * Fetch the FTP parameters from the request. Note: The password should be
			 * allowed as raw mode, otherwise something like !@<sdf34>43H% would be
			 * sanitised to !@43H% which is just plain wrong.
			 */
			$ftp_host = $app->input->get('ftp_host', '');
			$ftp_port = $app->input->get('ftp_port', '21');
			$ftp_user = $app->input->get('ftp_user', '');
			$ftp_pass = addcslashes($app->input->get('ftp_pass', '', 'raw'), "'\\");
			$ftp_root = $app->input->get('ftp_root', '');

			// Is the tempdir really writable?
			$writable = @is_writeable($tempdir);

			if ($writable)
			{
				// Let's be REALLY sure.
				$fp = @fopen($tempdir . '/test.txt', 'w');

				if ($fp === false)
				{
					$writable = false;
				}
				else
				{
					fclose($fp);
					unlink($tempdir . '/test.txt');
				}
			}

			// If the tempdir is not writable, create a new writable subdirectory.
			if (!$writable)
			{
				$FTPOptions = JClientHelper::getCredentials('ftp');
				$ftp = JClientFtp::getInstance($FTPOptions['host'], $FTPOptions['port'], array(), $FTPOptions['user'], $FTPOptions['pass']);
				$dest = JPath::clean(str_replace(JPATH_ROOT, $FTPOptions['root'], $tempdir . '/admintools'), '/');

				if (!@mkdir($tempdir . '/admintools'))
				{
					$ftp->mkdir($dest);
				}

				if (!@chmod($tempdir . '/admintools', 511))
				{
					$ftp->chmod($dest, 511);
				}

				$tempdir .= '/admintools';
			}

			// Just in case the temp-directory was off-root, try using the default tmp directory.
			$writable = @is_writeable($tempdir);

			if (!$writable)
			{
				$tempdir = JPATH_ROOT . '/tmp';

				// Does the JPATH_ROOT/tmp directory exist?
				if (!is_dir($tempdir))
				{
					JFolder::create($tempdir, 511);
					$htaccessContents = "order deny,allow\ndeny from all\nallow from none\n";
					JFile::write($tempdir . '/.htaccess', $htaccessContents);
				}

				// If it exists and it is unwritable, try creating a writable admintools subdirectory.
				if (!is_writable($tempdir))
				{
					$FTPOptions = JClientHelper::getCredentials('ftp');
					$ftp = JClientFtp::getInstance($FTPOptions['host'], $FTPOptions['port'], array(), $FTPOptions['user'], $FTPOptions['pass']);
					$dest = JPath::clean(str_replace(JPATH_ROOT, $FTPOptions['root'], $tempdir . '/admintools'), '/');

					if (!@mkdir($tempdir . '/admintools'))
					{
						$ftp->mkdir($dest);
					}

					if (!@chmod($tempdir . '/admintools', 511))
					{
						$ftp->chmod($dest, 511);
					}

					$tempdir .= '/admintools';
				}
			}

			// If we still have no writable directory, we'll try /tmp and the system's temp-directory.
			$writable = @is_writeable($tempdir);

			if (!$writable)
			{
				if (@is_dir('/tmp') && @is_writable('/tmp'))
				{
					$tempdir = '/tmp';
				}
				else
				{
					// Try to find the system temp path.
					$tmpfile = @tempnam('dummy', '');
					$systemp = @dirname($tmpfile);
					@unlink($tmpfile);

					if (!empty($systemp))
					{
						if (@is_dir($systemp) && @is_writable($systemp))
						{
							$tempdir = $systemp;
						}
					}
				}
			}

			$data .= <<<ENDDATA
	,
	'kickstart.ftp.ssl' => '0',
	'kickstart.ftp.passive' => '1',
	'kickstart.ftp.host' => '$ftp_host',
	'kickstart.ftp.port' => '$ftp_port',
	'kickstart.ftp.user' => '$ftp_user',
	'kickstart.ftp.pass' => '$ftp_pass',
	'kickstart.ftp.dir' => '$ftp_root',
	'kickstart.ftp.tempdir' => '$tempdir'
ENDDATA;
		}

		$data .= ');';

		// Remove the old file, if it's there...
		$configpath = JPATH_COMPONENT_ADMINISTRATOR . '/restoration.php';

		if (JFile::exists($configpath))
		{
			JFile::delete($configpath);
		}

		// Write new file. First try with JFile.
		$result = JFile::write($configpath, $data);

		// In case JFile used FTP but direct access could help.
		if (!$result)
		{
			if (function_exists('file_put_contents'))
			{
				$result = @file_put_contents($configpath, $data);

				if ($result !== false)
				{
					$result = true;
				}
			}
			else
			{
				$fp = @fopen($configpath, 'wt');

				if ($fp !== false)
				{
					$result = @fwrite($fp, $data);

					if ($result !== false)
					{
						$result = true;
					}

					@fclose($fp);
				}
			}
		}

		return $result;
	}

	/**
	 * Runs the schema update SQL files, the PHP update script and updates the
	 * manifest cache and #__extensions entry. Essentially, it is identical to
	 * JInstallerFile::install() without the file copy.
	 *
	 * @return  boolean True on success.
	 *
	 * @since   2.5.4
	 */
	public function finaliseUpgrade()
	{
		$installer = JInstaller::getInstance();

		$manifest = $installer->isManifest(JPATH_MANIFESTS . '/files/joomla.xml');

		if ($manifest === false)
		{
			$installer->abort(JText::_('JLIB_INSTALLER_ABORT_DETECTMANIFEST'));

			return false;
		}

		$installer->manifest = $manifest;

		$installer->setUpgrade(true);
		$installer->setOverwrite(true);

		$installer->extension = JTable::getInstance('extension');
		$installer->extension->load(700);

		$installer->setAdapter($installer->extension->type);

		$installer->setPath('manifest', JPATH_MANIFESTS . '/files/joomla.xml');
		$installer->setPath('source', JPATH_MANIFESTS . '/files');
		$installer->setPath('extension_root', JPATH_ROOT);

		// Run the script file.
		JLoader::register('JoomlaInstallerScript', JPATH_ADMINISTRATOR . '/components/com_admin/script.php');

		$manifestClass = new JoomlaInstallerScript;

		ob_start();
		ob_implicit_flush(false);

		if ($manifestClass && method_exists($manifestClass, 'preflight'))
		{
			if ($manifestClass->preflight('update', $installer) === false)
			{
				$installer->abort(JText::_('JLIB_INSTALLER_ABORT_FILE_INSTALL_CUSTOM_INSTALL_FAILURE'));

				return false;
			}
		}

		// Create msg object; first use here.
		$msg = ob_get_contents();
		ob_end_clean();

		// Get a database connector object.
		$db = $this->getDbo();

		/*
		 * Check to see if a file extension by the same name is already installed.
		 * If it is, then update the table because if the files aren't there
		 * we can assume that it was (badly) uninstalled.
		 * If it isn't, add an entry to extensions.
		 */
		$query = $db->getQuery(true)
			->select($db->quoteName('extension_id'))
			->from($db->quoteName('#__extensions'))
			->where($db->quoteName('type') . ' = ' . $db->quote('file'))
			->where($db->quoteName('element') . ' = ' . $db->quote('joomla'));
		$db->setQuery($query);

		try
		{
			$db->execute();
		}
		catch (RuntimeException $e)
		{
			// Install failed, roll back changes.
			$installer->abort(
				JText::sprintf('JLIB_INSTALLER_ABORT_FILE_ROLLBACK', JText::_('JLIB_INSTALLER_UPDATE'), $e->getMessage())
			);

			return false;
		}

		$id = $db->loadResult();
		$row = JTable::getInstance('extension');

		if ($id)
		{
			// Load the entry and update the manifest_cache.
			$row->load($id);

			// Update name.
			$row->set('name', 'files_joomla');

			// Update manifest.
			$row->manifest_cache = $installer->generateManifestCache();

			if (!$row->store())
			{
				// Install failed, roll back changes.
				$installer->abort(
					JText::sprintf('JLIB_INSTALLER_ABORT_FILE_ROLLBACK', JText::_('JLIB_INSTALLER_UPDATE'), $row->getError())
				);

				return false;
			}
		}
		else
		{
			// Add an entry to the extension table with a whole heap of defaults.
			$row->set('name', 'files_joomla');
			$row->set('type', 'file');
			$row->set('element', 'joomla');

			// There is no folder for files so leave it blank.
			$row->set('folder', '');
			$row->set('enabled', 1);
			$row->set('protected', 0);
			$row->set('access', 0);
			$row->set('client_id', 0);
			$row->set('params', '');
			$row->set('system_data', '');
			$row->set('manifest_cache', $installer->generateManifestCache());

			if (!$row->store())
			{
				// Install failed, roll back changes.
				$installer->abort(JText::sprintf('JLIB_INSTALLER_ABORT_FILE_INSTALL_ROLLBACK', $row->getError()));

				return false;
			}

			// Set the insert id.
			$row->set('extension_id', $db->insertid());

			// Since we have created a module item, we add it to the installation step stack
			// so that if we have to rollback the changes we can undo it.
			$installer->pushStep(array('type' => 'extension', 'extension_id' => $row->extension_id));
		}

		$result = $installer->parseSchemaUpdates($manifest->update->schemas, $row->extension_id);

		if ($result === false)
		{
			// Install failed, rollback changes.
			$installer->abort(JText::sprintf('JLIB_INSTALLER_ABORT_FILE_UPDATE_SQL_ERROR', $db->stderr(true)));

			return false;
		}

		// Start Joomla! 1.6.
		ob_start();
		ob_implicit_flush(false);

		if ($manifestClass && method_exists($manifestClass, 'update'))
		{
			if ($manifestClass->update($installer) === false)
			{
				// Install failed, rollback changes.
				$installer->abort(JText::_('JLIB_INSTALLER_ABORT_FILE_INSTALL_CUSTOM_INSTALL_FAILURE'));

				return false;
			}
		}

		// Append messages.
		$msg .= ob_get_contents();
		ob_end_clean();

		// Clobber any possible pending updates.
		$update = JTable::getInstance('update');
		$uid = $update->find(
			array('element' => 'joomla', 'type' => 'file', 'client_id' => '0', 'folder' => '')
		);

		if ($uid)
		{
			$update->delete($uid);
		}

		// And now we run the postflight.
		ob_start();
		ob_implicit_flush(false);

		if ($manifestClass && method_exists($manifestClass, 'postflight'))
		{
			$manifestClass->postflight('update', $installer);
		}

		// Append messages.
		$msg .= ob_get_contents();
		ob_end_clean();

		if ($msg != '')
		{
			$installer->set('extension_message', $msg);
		}

		// Refresh versionable assets cache.
		JFactory::getApplication()->flushAssets();

		return true;
	}

	/**
	 * Removes the extracted package file.
	 *
	 * @return  void
	 *
	 * @since   2.5.4
	 */
	public function cleanUp()
	{
		// Remove the update package.
		$config = JFactory::getConfig();
		$tempdir = $config->get('tmp_path');

		$file = JFactory::getApplication()->getUserState('com_joomlaupdate.file', null);
		$target = $tempdir . '/' . $file;

		if (!@unlink($target))
		{
			JFile::delete($target);
		}

		// Remove the restoration.php file.
		$target = JPATH_COMPONENT_ADMINISTRATOR . '/restoration.php';

		if (!@unlink($target))
		{
			JFile::delete($target);
		}

		// Remove joomla.xml from the site's root.
		$target = JPATH_ROOT . '/joomla.xml';

		if (!@unlink($target))
		{
			JFile::delete($target);
		}

		// Unset the update filename from the session.
		JFactory::getApplication()->setUserState('com_joomlaupdate.file', null);
		$oldVersion = JFactory::getApplication()->getUserState('com_joomlaupdate.oldversion');

		// Trigger event after joomla update.
		JFactory::getApplication()->triggerEvent('onJoomlaAfterUpdate', array($oldVersion));
		JFactory::getApplication()->setUserState('com_joomlaupdate.oldversion', null);
	}

	/**
	 * Uploads what is presumably an update ZIP file under a mangled name in the temporary directory.
	 *
	 * @return  void
	 *
	 * @since   3.6.0
	 */
	public function upload()
	{
		// Get the uploaded file information.
		$input = JFactory::getApplication()->input;

		// Do not change the filter type 'raw'. We need this to let files containing PHP code to upload. See JInputFiles::get.
		$userfile = $input->files->get('install_package', null, 'raw');

		// Make sure that file uploads are enabled in php.
		if (!(bool) ini_get('file_uploads'))
		{
			throw new RuntimeException(JText::_('COM_INSTALLER_MSG_INSTALL_WARNINSTALLFILE'), 500);
		}

		// Make sure that zlib is loaded so that the package can be unpacked.
		if (!extension_loaded('zlib'))
		{
			throw new RuntimeException('COM_INSTALLER_MSG_INSTALL_WARNINSTALLZLIB', 500);
		}

		// If there is no uploaded file, we have a problem...
		if (!is_array($userfile))
		{
			throw new RuntimeException(JText::_('COM_INSTALLER_MSG_INSTALL_NO_FILE_SELECTED'), 500);
		}

		// Is the PHP tmp directory missing?
		if ($userfile['error'] && ($userfile['error'] == UPLOAD_ERR_NO_TMP_DIR))
		{
			throw new RuntimeException(
				JText::_('COM_INSTALLER_MSG_INSTALL_WARNINSTALLUPLOADERROR') . '<br />' .
				JText::_('COM_INSTALLER_MSG_WARNINGS_PHPUPLOADNOTSET'),
				500
			);
		}

		// Is the max upload size too small in php.ini?
		if ($userfile['error'] && ($userfile['error'] == UPLOAD_ERR_INI_SIZE))
		{
			throw new RuntimeException(
				JText::_('COM_INSTALLER_MSG_INSTALL_WARNINSTALLUPLOADERROR') . '<br />' . JText::_('COM_INSTALLER_MSG_WARNINGS_SMALLUPLOADSIZE'),
				500
			);
		}

		// Check if there was a different problem uploading the file.
		if ($userfile['error'] || $userfile['size'] < 1)
		{
			throw new RuntimeException(JText::_('COM_INSTALLER_MSG_INSTALL_WARNINSTALLUPLOADERROR'), 500);
		}

		// Build the appropriate paths.
		$config   = JFactory::getConfig();
		$tmp_dest = tempnam($config->get('tmp_path'), 'ju');
		$tmp_src  = $userfile['tmp_name'];

		// Move uploaded file.
		jimport('joomla.filesystem.file');

		if (version_compare(JVERSION, '3.4.0', 'ge'))
		{
			$result = JFile::upload($tmp_src, $tmp_dest, false, true);
		}
		else
		{
			// Old Joomla! versions didn't have UploadShield and don't need the fourth parameter to accept uploads
			$result = JFile::upload($tmp_src, $tmp_dest);
		}

		if (!$result)
		{
			throw new RuntimeException(JText::_('COM_INSTALLER_MSG_INSTALL_WARNINSTALLUPLOADERROR'), 500);
		}

		JFactory::getApplication()->setUserState('com_joomlaupdate.temp_file', $tmp_dest);
	}

	/**
	 * Checks the super admin credentials are valid for the currently logged in users
	 *
	 * @param   array  $credentials  The credentials to authenticate the user with
	 *
	 * @return  boolean
	 *
	 * @since   3.6.0
	 */
	public function captiveLogin($credentials)
	{
		// Make sure the username matches
		$username = isset($credentials['username']) ? $credentials['username'] : null;
		$user     = JFactory::getUser();

		if (strtolower($user->username) != strtolower($username))
		{
			return false;
		}

		// Make sure the user is authorised
		if (!$user->authorise('core.admin'))
		{
			return false;
		}

		// Get the global JAuthentication object.
		$authenticate = JAuthentication::getInstance();
		$response     = $authenticate->authenticate($credentials);

		if ($response->status !== JAuthentication::STATUS_SUCCESS)
		{
			return false;
		}

		return true;
	}

	/**
	 * Does the captive (temporary) file we uploaded before still exist?
	 *
	 * @return  boolean
	 *
	 * @since   3.6.0
	 */
	public function captiveFileExists()
	{
		$file = JFactory::getApplication()->getUserState('com_joomlaupdate.temp_file', null);

		JLoader::import('joomla.filesystem.file');

		if (empty($file) || !JFile::exists($file))
		{
			return false;
		}

		return true;
	}

	/**
	 * Remove the captive (temporary) file we uploaded before and the .
	 *
	 * @return  void
	 *
	 * @since   3.6.0
	 */
	public function removePackageFiles()
	{
		$files = array(
			JFactory::getApplication()->getUserState('com_joomlaupdate.temp_file', null),
			JFactory::getApplication()->getUserState('com_joomlaupdate.file', null),
		);

		JLoader::import('joomla.filesystem.file');

		foreach ($files as $file)
		{
			if (JFile::exists($file))
			{
				if (!@unlink($file))
				{
					JFile::delete($file);
				}
			}
		}
	}

	/**
	 * Gets PHP options.
	 * TODO: Outsource, build common code base for pre install and pre update check
	 *
	 * @return array Array of PHP config options
	 *
	 * @since   3.10.0
	 */
	public function getPhpOptions()
	{
		$options = array();

		/*
		 * Check the PHP Version. It is already checked in JUpdate.
		 * A Joomla! Update which is not supported by current PHP
		 * version is not shown. So this check is actually unnecessary.
		 */
		$option         = new stdClass;
		$option->label  = JText::sprintf('INSTL_PHP_VERSION_NEWER', $this->getTargetMinimumPHPVersion());
		$option->state  = $this->isPhpVersionSupported();
		$option->notice = null;
		$options[]      = $option;

		// Only check if required PHP version is less than 7.
		if (version_compare($this->getTargetMinimumPHPVersion(), '7', '<'))
		{
			// Check for magic quotes gpc.
			$option         = new stdClass;
			$option->label  = JText::_('INSTL_MAGIC_QUOTES_GPC');
			$option->state  = (ini_get('magic_quotes_gpc') == false);
			$option->notice = null;
			$options[]      = $option;

			// Check for register globals.
			$option         = new stdClass;
			$option->label  = JText::_('INSTL_REGISTER_GLOBALS');
			$option->state  = (ini_get('register_globals') == false);
			$option->notice = null;
			$options[]      = $option;
		}

		// Check for zlib support.
		$option         = new stdClass;
		$option->label  = JText::_('INSTL_ZLIB_COMPRESSION_SUPPORT');
		$option->state  = extension_loaded('zlib');
		$option->notice = null;
		$options[]      = $option;

		// Check for XML support.
		$option         = new stdClass;
		$option->label  = JText::_('INSTL_XML_SUPPORT');
		$option->state  = extension_loaded('xml');
		$option->notice = null;
		$options[]      = $option;

		// Check for mbstring options.
		if (extension_loaded('mbstring'))
		{
			// Check for default MB language.
			$option = new stdClass;
			$option->label  = JText::_('INSTL_MB_LANGUAGE_IS_DEFAULT');
			$option->state  = strtolower(ini_get('mbstring.language')) === 'neutral';
			$option->notice = $option->state ? null : JText::_('INSTL_NOTICEMBLANGNOTDEFAULT');
			$options[] = $option;

			// Check for MB function overload.
			$option = new stdClass;
			$option->label  = JText::_('INSTL_MB_STRING_OVERLOAD_OFF');
			$option->state  = ini_get('mbstring.func_overload') == 0;
			$option->notice = $option->state ? null : JText::_('INSTL_NOTICEMBSTRINGOVERLOAD');
			$options[] = $option;
		}

		// Check for a missing native parse_ini_file implementation.
		$option = new stdClass;
		$option->label  = JText::_('INSTL_PARSE_INI_FILE_AVAILABLE');
		$option->state  = $this->getIniParserAvailability();
		$option->notice = null;
		$options[] = $option;

		// Check for missing native json_encode / json_decode support.
		$option = new stdClass;
		$option->label  = JText::_('INSTL_JSON_SUPPORT_AVAILABLE');
		$option->state  = function_exists('json_encode') && function_exists('json_decode');
		$option->notice = null;
		$options[] = $option;

		$updateInformation = $this->getUpdateInformation();

		// Check if configured database is compatible with Joomla 4
		if (version_compare($updateInformation['latest'], '4', '>='))
		{
			$option = new stdClass;
			$option->label  = JText::sprintf('INSTL_DATABASE_SUPPORTED', $this->getConfiguredDatabaseType());
			$option->state  = $this->isDatabaseTypeSupported();
			$option->notice = null;
			$options[]      = $option;
		}

		// Check if database structure is up to date
		$option = new stdClass;
		$option->label  = JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_DATABASE_STRUCTURE_TITLE');
		$option->state  = $this->getDatabaseSchemaCheck();
		$option->notice = $option->state ? null : JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_DATABASE_STRUCTURE_NOTICE');
		$options[] = $option;

		return $options;
	}

	/**
	 * Gets PHP Settings.
	 * TODO: Outsource, build common code base for pre install and pre update check
	 *
	 * @return  array
	 *
	 * @since   3.10.0
	 */
	public function getPhpSettings()
	{
		$settings = array();

		// Check for display errors.
		$setting = new stdClass;
		$setting->label = JText::_('INSTL_DISPLAY_ERRORS');
		$setting->state = (bool) ini_get('display_errors');
		$setting->recommended = false;
		$settings[] = $setting;

		// Check for file uploads.
		$setting = new stdClass;
		$setting->label = JText::_('INSTL_FILE_UPLOADS');
		$setting->state = (bool) ini_get('file_uploads');
		$setting->recommended = true;
		$settings[] = $setting;

		// Only check if required PHP version is less than 7.
		if (version_compare($this->getTargetMinimumPHPVersion(), '7', '<'))
		{
			// Check for magic quotes runtimes.
			$setting = new stdClass;
			$setting->label = JText::_('INSTL_MAGIC_QUOTES_RUNTIME');
			$setting->state = (bool) ini_get('magic_quotes_runtime');
			$setting->recommended = false;
			$settings[] = $setting;

			// Check for safe mode.
			$setting = new stdClass;
			$setting->label = JText::_('INSTL_SAFE_MODE');
			$setting->state = (bool) ini_get('safe_mode');
			$setting->recommended = false;
			$settings[] = $setting;
		}

		// Check for output buffering.
		$setting = new stdClass;
		$setting->label = JText::_('INSTL_OUTPUT_BUFFERING');
		$setting->state = (int) ini_get('output_buffering') !== 0;
		$setting->recommended = false;
		$settings[] = $setting;

		// Check for session auto-start.
		$setting = new stdClass;
		$setting->label = JText::_('INSTL_SESSION_AUTO_START');
		$setting->state = (bool) ini_get('session.auto_start');
		$setting->recommended = false;
		$settings[] = $setting;

		// Check for native ZIP support.
		$setting = new stdClass;
		$setting->label = JText::_('INSTL_ZIP_SUPPORT_AVAILABLE');
		$setting->state = function_exists('zip_open') && function_exists('zip_read');
		$setting->recommended = true;
		$settings[] = $setting;

		return $settings;
	}

	/**
	 * Returns the configured database type id (mysqli or sqlsrv or ...)
	 *
	 * @return string
	 *
	 * @since 3.10.0
	 */
	private function getConfiguredDatabaseType()
	{
		return JFactory::getApplication()->get('dbtype');
	}

	/**
	 * Returns true, if J! version is < 4 or current configured
	 * database type is compatible with the update.
	 *
	 * @return boolean
	 *
	 * @since 3.10.0
	 */
	public function isDatabaseTypeSupported()
	{
		$updateInformation = $this->getUpdateInformation();

		// Check if configured database is compatible with Joomla 4
		if (version_compare($updateInformation['latest'], '4', '>='))
		{
			$unsupportedDatabaseTypes = array('sqlsrv', 'sqlazure');
			$currentDatabaseType = $this->getConfiguredDatabaseType();

			return !in_array($currentDatabaseType, $unsupportedDatabaseTypes);
		}

		return true;
	}


	/**
	 * Returns true, if current installed php version is compatible with the update.
	 *
	 * @return boolean
	 *
	 * @since 3.10.0
	 */
	public function isPhpVersionSupported()
	{
		return version_compare(PHP_VERSION, $this->getTargetMinimumPHPVersion(), '>=');
	}

	/**
	 * Returns the PHP minimum version for the update.
	 * Returns JOOMLA_MINIMUM_PHP, if there is no information given.
	 *
	 * @return string
	 *
	 * @since 3.10.0
	 */
	private function getTargetMinimumPHPVersion()
	{
		$updateInformation = $this->getUpdateInformation();

		return isset($updateInformation['object']->php_minimum) ?
			$updateInformation['object']->php_minimum->_data :
			JOOMLA_MINIMUM_PHP;
	}

	/**
	 * Checks the availability of the parse_ini_file and parse_ini_string functions.
	 * TODO: Outsource, build common code base for pre install and pre update check
	 *
	 * @return  boolean  True if the method exists.
	 *
	 * @since   3.10.0
	 */
	public function getIniParserAvailability()
	{
		$disabledFunctions = ini_get('disable_functions');

		if (!empty($disabledFunctions))
		{
			// Attempt to detect them in the disable_functions blacklist.
			$disabledFunctions = explode(',', trim($disabledFunctions));
			$numberOfDisabledFunctions = count($disabledFunctions);

			for ($i = 0; $i < $numberOfDisabledFunctions; $i++)
			{
				$disabledFunctions[$i] = trim($disabledFunctions[$i]);
			}

			$result = !in_array('parse_ini_string', $disabledFunctions);
		}
		else
		{
			// Attempt to detect their existence; even pure PHP implementations of them will trigger a positive response, though.
			$result = function_exists('parse_ini_string');
		}

		return $result;
	}


	/**
	 * Check if database structure is up to date
	 *
	 * @return  boolean  True if ok, false if not.
	 *
	 * @since   3.10.0
	 */
	private function getDatabaseSchemaCheck()
	{
		JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_installer/models', 'InstallerModel');

		// Get the database model
		$model = JModelLegacy::getInstance('Database', 'InstallerModel');

		// Check if no default text filters found
		if (!$model->getDefaultTextFilters())
		{
			return false;
		}

		// Check if database update version does not match CMS version
		if (version_compare($model->getUpdateVersion(), JVERSION) != 0)
		{
			return false;
		}

		// Get the schema change set
		$changeSet = $model->getItems();

		$changeSetCheck = $changeSet->check();

		// Check if schema errors found
		if (!empty($changeSetCheck))
		{
			return false;
		}

		// Check if database schema version does not match CMS version
		if ($model->getSchemaVersion() != $changeSet->getSchema())
		{
			return false;
		}

		// No database problems found
		return true;
	}

	/**
	 * Gets an array containing all installed extensions, that are not core extensions.
	 *
	 * @return  array  name,version,updateserver
	 *
	 * @since   3.10.0
	 */
	public function getNonCoreExtensions()
	{
		$db = $this->getDbo();
		$query = $db->getQuery(true);

		$query->select(
			$db->qn('ex.name') . ', ' .
			$db->qn('ex.extension_id') . ', ' .
			$db->qn('ex.manifest_cache') . ', ' .
			$db->qn('ex.type') . ', ' .
			$db->qn('ex.folder') . ', ' .
			$db->qn('ex.element') . ', ' .
			$db->qn('ex.client_id')
		)->from(
			$db->qn('#__extensions', 'ex')
		)->where(
			$db->qn('ex.package_id') . ' = 0'
		);

		$db->setQuery($query);
		$rows = $db->loadObjectList();
		$rows = array_filter($rows, 'JoomlaupdateModelDefault::isNonCoreExtension');

		foreach ($rows as $extension)
		{
			$decode = json_decode($extension->manifest_cache);

			// Remove unused fields so they do not cause javascript errors during pre-update check
			unset($decode->description);
			unset($decode->copyright);
			unset($decode->creationDate);

			$this->translateExtensionName($extension);
			$extension->version = isset($decode->version)
				? $decode->version
				: JText::_('COM_JOOMLAUPDATE_PREUPDATE_UNKNOWN_EXTENSION_MANIFESTCACHE_VERSION');
			unset($extension->manifest_cache);
			$extension->manifest_cache = $decode;
		}

		return $rows;
	}

	/**
	 * Checks if extension is non core extension.
	 *
	 * @param   object  $extension  The extension to be checked
	 *
	 * @return  bool  true if extension is not a core extension
	 *
	 * @since   3.10.0
	 */
	private static function isNonCoreExtension($extension)
	{
		return !\JExtensionHelper::checkIfCoreExtension($extension->type, $extension->element, $extension->client_id, $extension->folder);
	}

	/**
	 * Gets an array containing all installed and enabled plugins, that are not core plugins.
	 *
	 * @param   array  $folderFilter  Limit the list of plugins to a specific set of folder values
	 *
	 * @return  array  name,version,updateserver
	 *
	 * @since   3.10.0
	 */
	public function getNonCorePlugins($folderFilter = array())
	{
		$db    = $this->getDbo();
		$query = $db->getQuery(true);

		$query->select(
			$db->qn('ex.name') . ', ' .
			$db->qn('ex.extension_id') . ', ' .
			$db->qn('ex.manifest_cache') . ', ' .
			$db->qn('ex.type') . ', ' .
			$db->qn('ex.folder') . ', ' .
			$db->qn('ex.element') . ', ' .
			$db->qn('ex.client_id') . ', ' .
			$db->qn('ex.package_id')
		)->from(
			$db->qn('#__extensions', 'ex')
		)->where(
			$db->qn('ex.type') . ' = ' . $db->quote('plugin')
		)->where(
			$db->qn('ex.enabled') . ' = 1'
		);

		if (count($folderFilter) > 0)
		{
			$folderFilter = array_map(array($db, 'quote'), $folderFilter);

			$query->where($db->qn('folder') . ' IN (' . implode(',', $folderFilter) . ')');
		}

		$db->setQuery($query);
		$rows = $db->loadObjectList();
		$rows = array_filter($rows, 'JoomlaupdateModelDefault::isNonCoreExtension');

		foreach ($rows as $plugin)
		{
			$decode = json_decode($plugin->manifest_cache);

			// Remove unused fields so they do not cause javascript errors during pre-update check
			unset($decode->description);
			unset($decode->copyright);
			unset($decode->creationDate);

			$this->translateExtensionName($plugin);
			$plugin->version = isset($decode->version)
				? $decode->version
				: JText::_('COM_JOOMLAUPDATE_PREUPDATE_UNKNOWN_EXTENSION_MANIFESTCACHE_VERSION');
			unset($plugin->manifest_cache);
			$plugin->manifest_cache = $decode;
		}

		return $rows;
	}

	/**
	 * Called by controller's fetchExtensionCompatibility, which is called via AJAX.
	 *
	 * @param   string  $extensionID          The ID of the checked extension
	 * @param   string  $joomlaTargetVersion  Target version of Joomla
	 *
	 * @return object
	 *
	 * @since 3.10.0
	 */
	public function fetchCompatibility($extensionID, $joomlaTargetVersion)
	{
		$updateSites = $this->getUpdateSitesInfo($extensionID);

		if (empty($updateSites))
		{
			return (object) array('state' => 2);
		}

		foreach ($updateSites as $updateSite)
		{
			if ($updateSite['type'] === 'collection')
			{
				$updateFileUrls = $this->getCollectionDetailsUrls($updateSite, $joomlaTargetVersion);

				foreach ($updateFileUrls as $updateFileUrl)
				{
					$compatibleVersions = $this->checkCompatibility($updateFileUrl, $joomlaTargetVersion);

					// Return the compatible versions
					return (object) array('state' => 1, 'compatibleVersions' => $compatibleVersions);
				}
			}
			else
			{
				$compatibleVersions = $this->checkCompatibility($updateSite['location'], $joomlaTargetVersion);

				// Return the compatible versions
				return (object) array('state' => 1, 'compatibleVersions' => $compatibleVersions);
			}
		}

		// In any other case we mark this extension as not compatible
		return (object) array('state' => 0);
	}

	/**
	 * Returns records with update sites and extension information for a given extension ID.
	 *
	 * @param   int  $extensionID  The extension ID
	 *
	 * @return  array
	 *
	 * @since 3.10.0
	 */
	private function getUpdateSitesInfo($extensionID)
	{
		$db = $this->getDbo();
		$query = $db->getQuery(true);

		$query->select(
			$db->qn('us.type') . ', ' .
			$db->qn('us.location') . ', ' .
			$db->qn('e.element') . ' AS ' . $db->qn('ext_element') . ', ' .
			$db->qn('e.type') . ' AS ' . $db->qn('ext_type') . ', ' .
			$db->qn('e.folder') . ' AS ' . $db->qn('ext_folder')
		)->from(
			$db->qn('#__update_sites', 'us')
		)->leftJoin(
				$db->qn('#__update_sites_extensions', 'ue')
				. ' ON ' . $db->qn('ue.update_site_id') . ' = ' . $db->qn('us.update_site_id')
		)->leftJoin(
				$db->qn('#__extensions', 'e')
				. ' ON ' . $db->qn('e.extension_id') . ' = ' . $db->qn('ue.extension_id')
		)->where($db->qn('e.extension_id') . ' = ' . (int) $extensionID);

		$db->setQuery($query);

		$result = $db->loadAssocList();

		if (!is_array($result))
		{
			return array();
		}

		return $result;
	}

	/**
	 * Method to get details URLs from a colletion update site for given extension and Joomla target version.
	 *
	 * @param   array   $updateSiteInfo       The update site and extension information record to process
	 * @param   string  $joomlaTargetVersion  The Joomla! version to test against,
	 *
	 * @return  array  An array of URLs.
	 *
	 * @since   3.10.0
	 */
	private function getCollectionDetailsUrls($updateSiteInfo, $joomlaTargetVersion)
	{
		$return = array();

		$http = new JHttp;

		try
		{
			$response = $http->get($updateSiteInfo['location']);
		}
		catch (RuntimeException $e)
		{
			$response = null;
		}

		if ($response === null || $response->code !== 200)
		{
			return $return;
		}

		$updateSiteXML = simplexml_load_string($response->body);

		foreach ($updateSiteXML->extension as $extension)
		{
			$attribs = new stdClass;

			$attribs->element               = '';
			$attribs->type                  = '';
			$attribs->folder                = '';
			$attribs->targetplatformversion = '';

			foreach ($extension->attributes() as $key => $value)
			{
				$attribs->$key = (string) $value;
			}

			if ($attribs->element === $updateSiteInfo['ext_element']
				&& $attribs->type === $updateSiteInfo['ext_type']
				&& $attribs->folder === $updateSiteInfo['ext_folder']
				&& preg_match('/^' . $attribs->targetplatformversion . '/', $joomlaTargetVersion))
			{
				$return[] = (string) $extension['detailsurl'];
			}
		}

		return $return;
	}

	/**
	 * Method to check non core extensions for compatibility.
	 *
	 * @param   string  $updateFileUrl        The items update XML url.
	 * @param   string  $joomlaTargetVersion  The Joomla! version to test against
	 *
	 * @return  array  An array of strings with compatible version numbers
	 *
	 * @since   3.10.0
	 */
	private function checkCompatibility($updateFileUrl, $joomlaTargetVersion)
	{
		// Get the minimum stability information from com_installer
		$minimumStability = JComponentHelper::getParams('com_installer')->get('minimum_stability', JUpdater::STABILITY_STABLE);

		$update = new JUpdate;
		$update->set('jversion.full', $joomlaTargetVersion);
		$update->loadFromXML($updateFileUrl, $minimumStability);

		$compatibleVersions = $update->get('compatibleVersions');

		// Check if old version of the updater library
		if (!isset($compatibleVersions))
		{
			$downloadUrl = $update->get('downloadurl');
			$updateVersion = $update->get('version');

			return empty($downloadUrl) || empty($downloadUrl->_data) || empty($updateVersion) ? array() : array($updateVersion->_data);
		}

		usort($compatibleVersions, 'version_compare');

		return $compatibleVersions;
	}

	/**
	 * Translates an extension name
	 *
	 * @param   object  &$item  The extension of which the name needs to be translated
	 *
	 * @return  void
	 *
	 * @since   3.10.0
	 */
	protected function translateExtensionName(&$item)
	{
		// ToDo: Cleanup duplicated code. from com_installer/models/extension.php
		$lang = JFactory::getLanguage();
		$path = $item->client_id ? JPATH_ADMINISTRATOR : JPATH_SITE;

		$extension = $item->element;
		$source = JPATH_SITE;

		switch ($item->type)
		{
			case 'component':
				$extension = $item->element;
				$source = $path . '/components/' . $extension;
				break;
			case 'module':
				$extension = $item->element;
				$source = $path . '/modules/' . $extension;
				break;
			case 'file':
				$extension = 'files_' . $item->element;
				break;
			case 'library':
				$extension = 'lib_' . $item->element;
				break;
			case 'plugin':
				$extension = 'plg_' . $item->folder . '_' . $item->element;
				$source = JPATH_PLUGINS . '/' . $item->folder . '/' . $item->element;
				break;
			case 'template':
				$extension = 'tpl_' . $item->element;
				$source = $path . '/templates/' . $item->element;
		}

		$lang->load("$extension.sys", JPATH_ADMINISTRATOR, null, false, true)
		|| $lang->load("$extension.sys", $source, null, false, true);
		$lang->load($extension, JPATH_ADMINISTRATOR, null, false, true)
		|| $lang->load($extension, $source, null, false, true);

		// Translate the extension name if possible
		$item->name = strip_tags(JText::_($item->name));
	}

	/**
	 * Checks whether a given template is active
	 *
	 * @param   string  $template  The template name to be checked
	 *
	 * @return  boolean
	 *
	 * @since   3.10.4
	 */
	public function isTemplateActive($template)
	{
		$db = $this->getDbo();
		$query = $db->getQuery(true);

		$query->select(
			$db->qn(
				array(
					'id',
					'home'
				)
			)
		)->from(
			$db->qn('#__template_styles')
		)->where(
			$db->qn('template') . ' = ' . $db->q($template)
		);

		$templates = $db->setQuery($query)->loadObjectList();

		$home = array_filter(
			$templates,
			function($value)
			{
				return $value->home > 0;
			}
		);

		$ids = JArrayHelper::getColumn($templates, 'id');

		$menu = false;

		if (count($ids))
		{
			$query = $db->getQuery(true);

			$query->select(
				'COUNT(*)'
			)->from(
				$db->qn('#__menu')
			)->where(
				$db->qn('template_style_id') . ' IN(' . implode(',', $ids) . ')'
			);

			$menu = $db->setQuery($query)->loadResult() > 0;
		}

		return $home || $menu;
	}
}
components/com_joomlaupdate/config.xml000060400000003356152453623450014256 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset
		name="sources"
		label="COM_JOOMLAUPDATE_CONFIG_SOURCES_LABEL"
		description="COM_JOOMLAUPDATE_CONFIG_SOURCES_DESC"
		>

		<field
			name="updatesource"
			type="list"
			label="COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_LABEL"
			description="COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_DESC"
			default="default"
			>
			<!-- Note: Changed the values lts to default and sts to next with 3.4.0 -->
			<!--       Eliminated the 'nochange' option with 3.4.0 -->
			<!--       All invalid/unsupported/obsolete options equated to default in code with 3.4.0 -->
			<option value="default">COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_DEFAULT</option>
			<option value="next">COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_NEXT</option>
			<option value="testing">COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_TESTING</option>
			<option value="custom">COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_CUSTOM</option>
		</field>

		<field
			name="minimum_stability"
			type="list"
			label="COM_JOOMLAUPDATE_MINIMUM_STABILITY_LABEL"
			description="COM_JOOMLAUPDATE_MINIMUM_STABILITY_DESC"
			default="4"
			showon="updatesource:testing[OR]updatesource:custom"
			>
			<option value="0">COM_JOOMLAUPDATE_MINIMUM_STABILITY_DEV</option>
			<option value="1">COM_JOOMLAUPDATE_MINIMUM_STABILITY_ALPHA</option>
			<option value="2">COM_JOOMLAUPDATE_MINIMUM_STABILITY_BETA</option>
			<option value="3">COM_JOOMLAUPDATE_MINIMUM_STABILITY_RC</option>
			<option value="4">COM_JOOMLAUPDATE_MINIMUM_STABILITY_STABLE</option>
		</field>

		<field
			name="customurl"
			type="text"
			label="COM_JOOMLAUPDATE_CONFIG_CUSTOMURL_LABEL"
			description="COM_JOOMLAUPDATE_CONFIG_CUSTOMURL_DESC"
			default=""
			length="50"
			showon="updatesource:custom"
		/>

	</fieldset>
</config>
components/com_joomlaupdate/restore.php000060400000375347152453623450014477 0ustar00<?php
/**
 * Akeeba Restore
 *
 * An archive extraction engine for ZIP, JPA and JPS archives.
 *
 * @copyright   2008-2017 Nicholas K. Dionysopoulos / Akeeba Ltd.
 * @license     GNU GPL v2 or - at your option - any later version
 * @note        This file has been modified by the Joomla! Project and no longer reflects the original work of its author.
 */

define('_AKEEBA_RESTORATION', 1);
defined('DS') or define('DS', DIRECTORY_SEPARATOR);

// Unarchiver run states
define('AK_STATE_NOFILE', 0); // File header not read yet
define('AK_STATE_HEADER', 1); // File header read; ready to process data
define('AK_STATE_DATA', 2); // Processing file data
define('AK_STATE_DATAREAD', 3); // Finished processing file data; ready to post-process
define('AK_STATE_POSTPROC', 4); // Post-processing
define('AK_STATE_DONE', 5); // Done with post-processing

/* Windows system detection */
if (!defined('_AKEEBA_IS_WINDOWS'))
{
	if (function_exists('php_uname'))
	{
		define('_AKEEBA_IS_WINDOWS', stristr(php_uname(), 'windows'));
	}
	else
	{
		define('_AKEEBA_IS_WINDOWS', DIRECTORY_SEPARATOR == '\\');
	}
}

// Get the file's root
if (!defined('KSROOTDIR'))
{
	define('KSROOTDIR', dirname(__FILE__));
}
if (!defined('KSLANGDIR'))
{
	define('KSLANGDIR', KSROOTDIR);
}

// Make sure the locale is correct for basename() to work
if (function_exists('setlocale'))
{
	@setlocale(LC_ALL, 'en_US.UTF8');
}

// fnmatch not available on non-POSIX systems
// Thanks to soywiz@php.net for this useful alternative function [http://gr2.php.net/fnmatch]
if (!function_exists('fnmatch'))
{
	function fnmatch($pattern, $string)
	{
		return @preg_match(
			'/^' . strtr(addcslashes($pattern, '/\\.+^$(){}=!<>|'),
				array('*' => '.*', '?' => '.?')) . '$/i', $string
		);
	}
}

// Unicode-safe binary data length function
if (!function_exists('akstringlen'))
{
	if (function_exists('mb_strlen'))
	{
		function akstringlen($string)
		{
			return mb_strlen($string, '8bit');
		}
	}
	else
	{
		function akstringlen($string)
		{
			return strlen($string);
		}
	}
}

if (!function_exists('aksubstr'))
{
	if (function_exists('mb_strlen'))
	{
		function aksubstr($string, $start, $length = null)
		{
			return mb_substr($string, $start, $length, '8bit');
		}
	}
	else
	{
		function aksubstr($string, $start, $length = null)
		{
			return substr($string, $start, $length);
		}
	}
}

/**
 * Gets a query parameter from GET or POST data
 *
 * @param $key
 * @param $default
 */
function getQueryParam($key, $default = null)
{
	$value = $default;

	if (array_key_exists($key, $_REQUEST))
	{
		$value = $_REQUEST[$key];

		if (PHP_VERSION_ID < 50400 && get_magic_quotes_gpc() && !is_null($value))
		{
			$value = stripslashes($value);
		}
	}

	return $value;
}

// Debugging function
function debugMsg($msg)
{
	if (!defined('KSDEBUG'))
	{
		return;
	}

	$fp = fopen('debug.txt', 'at');

	fwrite($fp, $msg . "\n");
	fclose($fp);

	// Echo to stdout if KSDEBUGCLI is defined
	if (defined('KSDEBUGCLI'))
	{
		echo $msg . "\n";
	}
}

/**
 * The base class of Akeeba Engine objects. Allows for error and warnings logging
 * and propagation. Largely based on the Joomla! 1.5 JObject class.
 */
abstract class AKAbstractObject
{
	/** @var    array    The queue size of the $_errors array. Set to 0 for infinite size. */
	protected $_errors_queue_size = 0;
	/** @var    array    The queue size of the $_warnings array. Set to 0 for infinite size. */
	protected $_warnings_queue_size = 0;
	/** @var    array    An array of errors */
	private $_errors = array();
	/** @var    array    An array of warnings */
	private $_warnings = array();

	/**
	 * Get the most recent error message
	 *
	 * @param    integer $i Optional error index
	 *
	 * @return    string    Error message
	 */
	public function getError($i = null)
	{
		return $this->getItemFromArray($this->_errors, $i);
	}

	/**
	 * Returns the last item of a LIFO string message queue, or a specific item
	 * if so specified.
	 *
	 * @param array $array An array of strings, holding messages
	 * @param int   $i     Optional message index
	 *
	 * @return mixed The message string, or false if the key doesn't exist
	 */
	private function getItemFromArray($array, $i = null)
	{
		// Find the item
		if ($i === null)
		{
			// Default, return the last item
			$item = end($array);
		}
		else if (!array_key_exists($i, $array))
		{
			// If $i has been specified but does not exist, return false
			return false;
		}
		else
		{
			$item = $array[$i];
		}

		return $item;
	}

	/**
	 * Return all errors, if any
	 *
	 * @return    array    Array of error messages
	 */
	public function getErrors()
	{
		return $this->_errors;
	}

	/**
	 * Resets all error messages
	 */
	public function resetErrors()
	{
		$this->_errors = array();
	}

	/**
	 * Get the most recent warning message
	 *
	 * @param    integer $i Optional warning index
	 *
	 * @return    string    Error message
	 */
	public function getWarning($i = null)
	{
		return $this->getItemFromArray($this->_warnings, $i);
	}

	/**
	 * Return all warnings, if any
	 *
	 * @return    array    Array of error messages
	 */
	public function getWarnings()
	{
		return $this->_warnings;
	}

	/**
	 * Resets all warning messages
	 */
	public function resetWarnings()
	{
		$this->_warnings = array();
	}

	/**
	 * Propagates errors and warnings to a foreign object. The foreign object SHOULD
	 * implement the setError() and/or setWarning() methods but DOESN'T HAVE TO be of
	 * AKAbstractObject type. For example, this can even be used to propagate to a
	 * JObject instance in Joomla!. Propagated items will be removed from ourselves.
	 *
	 * @param object $object The object to propagate errors and warnings to.
	 */
	public function propagateToObject(&$object)
	{
		// Skip non-objects
		if (!is_object($object))
		{
			return;
		}

		if (method_exists($object, 'setError'))
		{
			if (!empty($this->_errors))
			{
				foreach ($this->_errors as $error)
				{
					$object->setError($error);
				}
				$this->_errors = array();
			}
		}

		if (method_exists($object, 'setWarning'))
		{
			if (!empty($this->_warnings))
			{
				foreach ($this->_warnings as $warning)
				{
					$object->setWarning($warning);
				}
				$this->_warnings = array();
			}
		}
	}

	/**
	 * Propagates errors and warnings from a foreign object. Each propagated list is
	 * then cleared on the foreign object, as long as it implements resetErrors() and/or
	 * resetWarnings() methods.
	 *
	 * @param object $object The object to propagate errors and warnings from
	 */
	public function propagateFromObject(&$object)
	{
		if (method_exists($object, 'getErrors'))
		{
			$errors = $object->getErrors();
			if (!empty($errors))
			{
				foreach ($errors as $error)
				{
					$this->setError($error);
				}
			}
			if (method_exists($object, 'resetErrors'))
			{
				$object->resetErrors();
			}
		}

		if (method_exists($object, 'getWarnings'))
		{
			$warnings = $object->getWarnings();
			if (!empty($warnings))
			{
				foreach ($warnings as $warning)
				{
					$this->setWarning($warning);
				}
			}
			if (method_exists($object, 'resetWarnings'))
			{
				$object->resetWarnings();
			}
		}
	}

	/**
	 * Add an error message
	 *
	 * @param    string $error Error message
	 */
	public function setError($error)
	{
		if ($this->_errors_queue_size > 0)
		{
			if (count($this->_errors) >= $this->_errors_queue_size)
			{
				array_shift($this->_errors);
			}
		}

		$this->_errors[] = $error;
	}

	/**
	 * Add an error message
	 *
	 * @param    string $error Error message
	 */
	public function setWarning($warning)
	{
		if ($this->_warnings_queue_size > 0)
		{
			if (count($this->_warnings) >= $this->_warnings_queue_size)
			{
				array_shift($this->_warnings);
			}
		}

		$this->_warnings[] = $warning;
	}

	/**
	 * Sets the size of the error queue (acts like a LIFO buffer)
	 *
	 * @param int $newSize The new queue size. Set to 0 for infinite length.
	 */
	protected function setErrorsQueueSize($newSize = 0)
	{
		$this->_errors_queue_size = (int) $newSize;
	}

	/**
	 * Sets the size of the warnings queue (acts like a LIFO buffer)
	 *
	 * @param int $newSize The new queue size. Set to 0 for infinite length.
	 */
	protected function setWarningsQueueSize($newSize = 0)
	{
		$this->_warnings_queue_size = (int) $newSize;
	}

}

/**
 * The superclass of all Akeeba Kickstart parts. The "parts" are intelligent stateful
 * classes which perform a single procedure and have preparation, running and
 * finalization phases. The transition between phases is handled automatically by
 * this superclass' tick() final public method, which should be the ONLY public API
 * exposed to the rest of the Akeeba Engine.
 */
abstract class AKAbstractPart extends AKAbstractObject
{
	/**
	 * Indicates whether this part has finished its initialisation cycle
	 *
	 * @var boolean
	 */
	protected $isPrepared = false;

	/**
	 * Indicates whether this part has more work to do (it's in running state)
	 *
	 * @var boolean
	 */
	protected $isRunning = false;

	/**
	 * Indicates whether this part has finished its finalization cycle
	 *
	 * @var boolean
	 */
	protected $isFinished = false;

	/**
	 * Indicates whether this part has finished its run cycle
	 *
	 * @var boolean
	 */
	protected $hasRan = false;

	/**
	 * The name of the engine part (a.k.a. Domain), used in return table
	 * generation.
	 *
	 * @var string
	 */
	protected $active_domain = "";

	/**
	 * The step this engine part is in. Used verbatim in return table and
	 * should be set by the code in the _run() method.
	 *
	 * @var string
	 */
	protected $active_step = "";

	/**
	 * A more detailed description of the step this engine part is in. Used
	 * verbatim in return table and should be set by the code in the _run()
	 * method.
	 *
	 * @var string
	 */
	protected $active_substep = "";

	/**
	 * Any configuration variables, in the form of an array.
	 *
	 * @var array
	 */
	protected $_parametersArray = array();

	/** @var string The database root key */
	protected $databaseRoot = array();
	/** @var array An array of observers */
	protected $observers = array();
	/** @var int Last reported warnings's position in array */
	private $warnings_pointer = -1;

	/**
	 * The public interface to an engine part. This method takes care for
	 * calling the correct method in order to perform the initialisation -
	 * run - finalisation cycle of operation and return a proper response array.
	 *
	 * @return    array    A Response Array
	 */
	final public function tick()
	{
		// Call the right action method, depending on engine part state
		switch ($this->getState())
		{
			case "init":
				$this->_prepare();
				break;
			case "prepared":
			case "running":
				$this->_run();
				break;
			case "postrun":
				$this->_finalize();
				break;
		}

		// Send a Return Table back to the caller
		$out = $this->_makeReturnTable();

		return $out;
	}

	/**
	 * Returns the state of this engine part.
	 *
	 * @return string The state of this engine part. It can be one of
	 * error, init, prepared, running, postrun, finished.
	 */
	final public function getState()
	{
		if ($this->getError())
		{
			return "error";
		}

		if (!($this->isPrepared))
		{
			return "init";
		}

		if (!($this->isFinished) && !($this->isRunning) && !($this->hasRun) && ($this->isPrepared))
		{
			return "prepared";
		}

		if (!($this->isFinished) && $this->isRunning && !($this->hasRun))
		{
			return "running";
		}

		if (!($this->isFinished) && !($this->isRunning) && $this->hasRun)
		{
			return "postrun";
		}

		if ($this->isFinished)
		{
			return "finished";
		}

		// Unknown internal state. This should never happen.
		return "error";
	}

	/**
	 * Runs the preparation for this part. Should set _isPrepared
	 * to true
	 */
	abstract protected function _prepare();

	/**
	 * Runs the main functionality loop for this part. Upon calling,
	 * should set the _isRunning to true. When it finished, should set
	 * the _hasRan to true. If an error is encountered, setError should
	 * be used.
	 */
	abstract protected function _run();

	/**
	 * Runs the finalisation process for this part. Should set
	 * _isFinished to true.
	 */
	abstract protected function _finalize();

	/**
	 * Constructs a Response Array based on the engine part's state.
	 *
	 * @return array The Response Array for the current state
	 */
	final protected function _makeReturnTable()
	{
		// Get a list of warnings
		$warnings = $this->getWarnings();
		// Report only new warnings if there is no warnings queue size
		if ($this->_warnings_queue_size == 0)
		{
			if (($this->warnings_pointer > 0) && ($this->warnings_pointer < (count($warnings))))
			{
				$warnings = array_slice($warnings, $this->warnings_pointer + 1);
				$this->warnings_pointer += count($warnings);
			}
			else
			{
				$this->warnings_pointer = count($warnings);
			}
		}

		$out = array(
			'HasRun'   => (!($this->isFinished)),
			'Domain'   => $this->active_domain,
			'Step'     => $this->active_step,
			'Substep'  => $this->active_substep,
			'Error'    => $this->getError(),
			'Warnings' => $warnings
		);

		return $out;
	}

	/**
	 * Returns a copy of the class's status array
	 *
	 * @return array
	 */
	public function getStatusArray()
	{
		return $this->_makeReturnTable();
	}

	/**
	 * Sends any kind of setup information to the engine part. Using this,
	 * we avoid passing parameters to the constructor of the class. These
	 * parameters should be passed as an indexed array and should be taken
	 * into account during the preparation process only. This function will
	 * set the error flag if it's called after the engine part is prepared.
	 *
	 * @param array $parametersArray The parameters to be passed to the
	 *                               engine part.
	 */
	final public function setup($parametersArray)
	{
		if ($this->isPrepared)
		{
			$this->setState('error', "Can't modify configuration after the preparation of " . $this->active_domain);
		}
		else
		{
			$this->_parametersArray = $parametersArray;
			if (array_key_exists('root', $parametersArray))
			{
				$this->databaseRoot = $parametersArray['root'];
			}
		}
	}

	/**
	 * Sets the engine part's internal state, in an easy to use manner
	 *
	 * @param    string $state        One of init, prepared, running, postrun, finished, error
	 * @param    string $errorMessage The reported error message, should the state be set to error
	 */
	protected function setState($state = 'init', $errorMessage = 'Invalid setState argument')
	{
		switch ($state)
		{
			case 'init':
				$this->isPrepared = false;
				$this->isRunning  = false;
				$this->isFinished = false;
				$this->hasRun     = false;
				break;

			case 'prepared':
				$this->isPrepared = true;
				$this->isRunning  = false;
				$this->isFinished = false;
				$this->hasRun     = false;
				break;

			case 'running':
				$this->isPrepared = true;
				$this->isRunning  = true;
				$this->isFinished = false;
				$this->hasRun     = false;
				break;

			case 'postrun':
				$this->isPrepared = true;
				$this->isRunning  = false;
				$this->isFinished = false;
				$this->hasRun     = true;
				break;

			case 'finished':
				$this->isPrepared = true;
				$this->isRunning  = false;
				$this->isFinished = true;
				$this->hasRun     = false;
				break;

			case 'error':
			default:
				$this->setError($errorMessage);
				break;
		}
	}

	final public function getDomain()
	{
		return $this->active_domain;
	}

	final public function getStep()
	{
		return $this->active_step;
	}

	final public function getSubstep()
	{
		return $this->active_substep;
	}

	/**
	 * Attaches an observer object
	 *
	 * @param AKAbstractPartObserver $obs
	 */
	function attach(AKAbstractPartObserver $obs)
	{
		$this->observers["$obs"] = $obs;
	}

	/**
	 * Detaches an observer object
	 *
	 * @param AKAbstractPartObserver $obs
	 */
	function detach(AKAbstractPartObserver $obs)
	{
		unset($this->observers["$obs"]);
	}

	/**
	 * Sets the BREAKFLAG, which instructs this engine part that the current step must break immediately,
	 * in fear of timing out.
	 */
	protected function setBreakFlag()
	{
		AKFactory::set('volatile.breakflag', true);
	}

	final protected function setDomain($new_domain)
	{
		$this->active_domain = $new_domain;
	}

	final protected function setStep($new_step)
	{
		$this->active_step = $new_step;
	}

	final protected function setSubstep($new_substep)
	{
		$this->active_substep = $new_substep;
	}

	/**
	 * Notifies observers each time something interesting happened to the part
	 *
	 * @param mixed $message The event object
	 */
	protected function notify($message)
	{
		foreach ($this->observers as $obs)
		{
			$obs->update($this, $message);
		}
	}
}

/**
 * The base class of unarchiver classes
 */
abstract class AKAbstractUnarchiver extends AKAbstractPart
{
	/** @var array List of the names of all archive parts */
	public $archiveList = array();
	/** @var int The total size of all archive parts */
	public $totalSize = array();
	/** @var array Which files to rename */
	public $renameFiles = array();
	/** @var array Which directories to rename */
	public $renameDirs = array();
	/** @var array Which files to skip */
	public $skipFiles = array();
	/** @var string Archive filename */
	protected $filename = null;
	/** @var integer Current archive part number */
	protected $currentPartNumber = -1;
	/** @var integer The offset inside the current part */
	protected $currentPartOffset = 0;
	/** @var bool Should I restore permissions? */
	protected $flagRestorePermissions = false;
	/** @var AKAbstractPostproc Post processing class */
	protected $postProcEngine = null;
	/** @var string Absolute path to prepend to extracted files */
	protected $addPath = '';
	/** @var string Absolute path to remove from extracted files */
	protected $removePath = '';
	/** @var integer Chunk size for processing */
	protected $chunkSize = 524288;

	/** @var resource File pointer to the current archive part file */
	protected $fp = null;

	/** @var int Run state when processing the current archive file */
	protected $runState = null;

	/** @var stdClass File header data, as read by the readFileHeader() method */
	protected $fileHeader = null;

	/** @var int How much of the uncompressed data we've read so far */
	protected $dataReadLength = 0;

	/** @var array Unwriteable files in these directories are always ignored and do not cause errors when not extracted */
	protected $ignoreDirectories = array();

	/**
	 * Wakeup function, called whenever the class is unserialized
	 */
	public function __wakeup()
	{
		if ($this->currentPartNumber >= 0 && !empty($this->archiveList[$this->currentPartNumber]))
		{
			$this->fp = @fopen($this->archiveList[$this->currentPartNumber], 'rb');
			if ((is_resource($this->fp)) && ($this->currentPartOffset > 0))
			{
				@fseek($this->fp, $this->currentPartOffset);
			}
		}
	}

	/**
	 * Sleep function, called whenever the class is serialized
	 */
	public function shutdown()
	{
		if (is_resource($this->fp))
		{
			$this->currentPartOffset = @ftell($this->fp);
			@fclose($this->fp);
		}
	}

	/**
	 * Is this file or directory contained in a directory we've decided to ignore
	 * write errors for? This is useful to let the extraction work despite write
	 * errors in the log, logs and tmp directories which MIGHT be used by the system
	 * on some low quality hosts and Plesk-powered hosts.
	 *
	 * @param   string $shortFilename The relative path of the file/directory in the package
	 *
	 * @return  boolean  True if it belongs in an ignored directory
	 */
	public function isIgnoredDirectory($shortFilename)
	{
		// return false;

		if (substr($shortFilename, -1) == '/')
		{
			$check = rtrim($shortFilename, '/');
		}
		else
		{
			$check = dirname($shortFilename);
		}

		return in_array($check, $this->ignoreDirectories);
	}

	/**
	 * Implements the abstract _prepare() method
	 */
	final protected function _prepare()
	{
		if (count($this->_parametersArray) > 0)
		{
			foreach ($this->_parametersArray as $key => $value)
			{
				switch ($key)
				{
					// Archive's absolute filename
					case 'filename':
						$this->filename = $value;

						// Sanity check
						if (!empty($value))
						{
							$value = strtolower($value);

							if (strlen($value) > 6)
							{
								if (
									(substr($value, 0, 7) == 'http://')
									|| (substr($value, 0, 8) == 'https://')
									|| (substr($value, 0, 6) == 'ftp://')
									|| (substr($value, 0, 7) == 'ssh2://')
									|| (substr($value, 0, 6) == 'ssl://')
								)
								{
									$this->setState('error', 'Invalid archive location');
								}
							}
						}


						break;

					// Should I restore permissions?
					case 'restore_permissions':
						$this->flagRestorePermissions = $value;
						break;

					// Should I use FTP?
					case 'post_proc':
						$this->postProcEngine = AKFactory::getPostProc($value);
						break;

					// Path to add in the beginning
					case 'add_path':
						$this->addPath = $value;
						$this->addPath = str_replace('\\', '/', $this->addPath);
						$this->addPath = rtrim($this->addPath, '/');
						if (!empty($this->addPath))
						{
							$this->addPath .= '/';
						}
						break;

					// Path to remove from the beginning
					case 'remove_path':
						$this->removePath = $value;
						$this->removePath = str_replace('\\', '/', $this->removePath);
						$this->removePath = rtrim($this->removePath, '/');
						if (!empty($this->removePath))
						{
							$this->removePath .= '/';
						}
						break;

					// Which files to rename (hash array)
					case 'rename_files':
						$this->renameFiles = $value;
						break;

					// Which files to rename (hash array)
					case 'rename_dirs':
						$this->renameDirs = $value;
						break;

					// Which files to skip (indexed array)
					case 'skip_files':
						$this->skipFiles = $value;
						break;

					// Which directories to ignore when we can't write files in them (indexed array)
					case 'ignoredirectories':
						$this->ignoreDirectories = $value;
						break;
				}
			}
		}

		$this->scanArchives();

		$this->readArchiveHeader();
		$errMessage = $this->getError();
		if (!empty($errMessage))
		{
			$this->setState('error', $errMessage);
		}
		else
		{
			$this->runState = AK_STATE_NOFILE;
			$this->setState('prepared');
		}
	}

	/**
	 * Scans for archive parts
	 */
	private function scanArchives()
	{
		if (defined('KSDEBUG'))
		{
			@unlink('debug.txt');
		}
		debugMsg('Preparing to scan archives');

		$privateArchiveList = array();

		// Get the components of the archive filename
		$dirname         = dirname($this->filename);
		$base_extension  = $this->getBaseExtension();
		$basename        = basename($this->filename, $base_extension);
		$this->totalSize = 0;

		// Scan for multiple parts until we don't find any more of them
		$count             = 0;
		$found             = true;
		$this->archiveList = array();
		while ($found)
		{
			++$count;
			$extension = substr($base_extension, 0, 2) . sprintf('%02d', $count);
			$filename  = $dirname . DIRECTORY_SEPARATOR . $basename . $extension;
			$found     = file_exists($filename);
			if ($found)
			{
				debugMsg('- Found archive ' . $filename);
				// Add yet another part, with a numeric-appended filename
				$this->archiveList[] = $filename;

				$filesize = @filesize($filename);
				$this->totalSize += $filesize;

				$privateArchiveList[] = array($filename, $filesize);
			}
			else
			{
				debugMsg('- Found archive ' . $this->filename);
				// Add the last part, with the regular extension
				$this->archiveList[] = $this->filename;

				$filename = $this->filename;
				$filesize = @filesize($filename);
				$this->totalSize += $filesize;

				$privateArchiveList[] = array($filename, $filesize);
			}
		}
		debugMsg('Total archive parts: ' . $count);

		$this->currentPartNumber = -1;
		$this->currentPartOffset = 0;
		$this->runState          = AK_STATE_NOFILE;

		// Send start of file notification
		$message                     = new stdClass;
		$message->type               = 'totalsize';
		$message->content            = new stdClass;
		$message->content->totalsize = $this->totalSize;
		$message->content->filelist  = $privateArchiveList;
		$this->notify($message);
	}

	/**
	 * Returns the base extension of the file, e.g. '.jpa'
	 *
	 * @return string
	 */
	private function getBaseExtension()
	{
		static $baseextension;

		if (empty($baseextension))
		{
			$basename      = basename($this->filename);
			$lastdot       = strrpos($basename, '.');
			$baseextension = substr($basename, $lastdot);
		}

		return $baseextension;
	}

	/**
	 * Concrete classes are supposed to use this method in order to read the archive's header and
	 * prepare themselves to the point of being ready to extract the first file.
	 */
	protected abstract function readArchiveHeader();

	protected function _run()
	{
		if ($this->getState() == 'postrun')
		{
			return;
		}

		$this->setState('running');

		$timer = AKFactory::getTimer();

		$status = true;
		while ($status && ($timer->getTimeLeft() > 0))
		{
			switch ($this->runState)
			{
				case AK_STATE_NOFILE:
					debugMsg(__CLASS__ . '::_run() - Reading file header');
					$status = $this->readFileHeader();
					if ($status)
					{
						// Send start of file notification
						$message                        = new stdClass;
						$message->type                  = 'startfile';
						$message->content               = new stdClass;
						$message->content->realfile     = $this->fileHeader->file;
						$message->content->file         = $this->fileHeader->file;
						$message->content->uncompressed = $this->fileHeader->uncompressed;

						if (array_key_exists('realfile', get_object_vars($this->fileHeader)))
						{
							$message->content->realfile = $this->fileHeader->realFile;
						}

						if (array_key_exists('compressed', get_object_vars($this->fileHeader)))
						{
							$message->content->compressed = $this->fileHeader->compressed;
						}
						else
						{
							$message->content->compressed = 0;
						}

						debugMsg(__CLASS__ . '::_run() - Preparing to extract ' . $message->content->realfile);

						$this->notify($message);
					}
					else
					{
						debugMsg(__CLASS__ . '::_run() - Could not read file header');
					}
					break;

				case AK_STATE_HEADER:
				case AK_STATE_DATA:
					debugMsg(__CLASS__ . '::_run() - Processing file data');
					$status = $this->processFileData();
					break;

				case AK_STATE_DATAREAD:
				case AK_STATE_POSTPROC:
					debugMsg(__CLASS__ . '::_run() - Calling post-processing class');
					$this->postProcEngine->timestamp = $this->fileHeader->timestamp;
					$status                          = $this->postProcEngine->process();
					$this->propagateFromObject($this->postProcEngine);
					$this->runState = AK_STATE_DONE;
					break;

				case AK_STATE_DONE:
				default:
					if ($status)
					{
						debugMsg(__CLASS__ . '::_run() - Finished extracting file');
						// Send end of file notification
						$message          = new stdClass;
						$message->type    = 'endfile';
						$message->content = new stdClass;
						if (array_key_exists('realfile', get_object_vars($this->fileHeader)))
						{
							$message->content->realfile = $this->fileHeader->realFile;
						}
						else
						{
							$message->content->realfile = $this->fileHeader->file;
						}
						$message->content->file = $this->fileHeader->file;
						if (array_key_exists('compressed', get_object_vars($this->fileHeader)))
						{
							$message->content->compressed = $this->fileHeader->compressed;
						}
						else
						{
							$message->content->compressed = 0;
						}
						$message->content->uncompressed = $this->fileHeader->uncompressed;
						$this->notify($message);
					}
					$this->runState = AK_STATE_NOFILE;
					break;
			}
		}

		$error = $this->getError();
		if (!$status && ($this->runState == AK_STATE_NOFILE) && empty($error))
		{
			debugMsg(__CLASS__ . '::_run() - Just finished');
			// We just finished
			$this->setState('postrun');
		}
		elseif (!empty($error))
		{
			debugMsg(__CLASS__ . '::_run() - Halted with an error:');
			debugMsg($error);
			$this->setState('error', $error);
		}
	}

	/**
	 * Concrete classes must use this method to read the file header
	 *
	 * @return bool True if reading the file was successful, false if an error occurred or we reached end of archive
	 */
	protected abstract function readFileHeader();

	/**
	 * Concrete classes must use this method to process file data. It must set $runState to AK_STATE_DATAREAD when
	 * it's finished processing the file data.
	 *
	 * @return bool True if processing the file data was successful, false if an error occurred
	 */
	protected abstract function processFileData();

	protected function _finalize()
	{
		// Nothing to do
		$this->setState('finished');
	}

	/**
	 * Opens the next part file for reading
	 */
	protected function nextFile()
	{
		debugMsg('Current part is ' . $this->currentPartNumber . '; opening the next part');
		++$this->currentPartNumber;

		if ($this->currentPartNumber > (count($this->archiveList) - 1))
		{
			$this->setState('postrun');

			return false;
		}
		else
		{
			if (is_resource($this->fp))
			{
				@fclose($this->fp);
			}
			debugMsg('Opening file ' . $this->archiveList[$this->currentPartNumber]);
			$this->fp = @fopen($this->archiveList[$this->currentPartNumber], 'rb');
			if ($this->fp === false)
			{
				debugMsg('Could not open file - crash imminent');
				$this->setError(AKText::sprintf('ERR_COULD_NOT_OPEN_ARCHIVE_PART', $this->archiveList[$this->currentPartNumber]));
			}
			fseek($this->fp, 0);
			$this->currentPartOffset = 0;

			return true;
		}
	}

	/**
	 * Returns true if we have reached the end of file
	 *
	 * @param $local bool True to return EOF of the local file, false (default) to return if we have reached the end of
	 *               the archive set
	 *
	 * @return bool True if we have reached End Of File
	 */
	protected function isEOF($local = false)
	{
		$eof = @feof($this->fp);

		if (!$eof)
		{
			// Border case: right at the part's end (eeeek!!!). For the life of me, I don't understand why
			// feof() doesn't report true. It expects the fp to be positioned *beyond* the EOF to report
			// true. Incredible! :(
			$position = @ftell($this->fp);
			$filesize = @filesize($this->archiveList[$this->currentPartNumber]);
			if ($filesize <= 0)
			{
				// 2Gb or more files on a 32 bit version of PHP tend to get screwed up. Meh.
				$eof = false;
			}
			elseif ($position >= $filesize)
			{
				$eof = true;
			}
		}

		if ($local)
		{
			return $eof;
		}
		else
		{
			return $eof && ($this->currentPartNumber >= (count($this->archiveList) - 1));
		}
	}

	/**
	 * Tries to make a directory user-writable so that we can write a file to it
	 *
	 * @param $path string A path to a file
	 */
	protected function setCorrectPermissions($path)
	{
		static $rootDir = null;

		if (is_null($rootDir))
		{
			$rootDir = rtrim(AKFactory::get('kickstart.setup.destdir', ''), '/\\');
		}

		$directory = rtrim(dirname($path), '/\\');
		if ($directory != $rootDir)
		{
			// Is this an unwritable directory?
			if (!is_writable($directory))
			{
				$this->postProcEngine->chmod($directory, 0755);
			}
		}
		$this->postProcEngine->chmod($path, 0644);
	}

	/**
	 * Reads data from the archive and notifies the observer with the 'reading' message
	 *
	 * @param $fp
	 * @param $length
	 */
	protected function fread($fp, $length = null)
	{
		if (is_numeric($length))
		{
			if ($length > 0)
			{
				$data = fread($fp, $length);
			}
			else
			{
				$data = fread($fp, PHP_INT_MAX);
			}
		}
		else
		{
			$data = fread($fp, PHP_INT_MAX);
		}
		if ($data === false)
		{
			$data = '';
		}

		// Send start of file notification
		$message                  = new stdClass;
		$message->type            = 'reading';
		$message->content         = new stdClass;
		$message->content->length = strlen($data);
		$this->notify($message);

		return $data;
	}

	/**
	 * Removes the configured $removePath from the path $path
	 *
	 * @param   string $path The path to reduce
	 *
	 * @return  string  The reduced path
	 */
	protected function removePath($path)
	{
		if (empty($this->removePath))
		{
			return $path;
		}

		if (strpos($path, $this->removePath) === 0)
		{
			$path = substr($path, strlen($this->removePath));
			$path = ltrim($path, '/\\');
		}

		return $path;
	}
}

/**
 * File post processor engines base class
 */
abstract class AKAbstractPostproc extends AKAbstractObject
{
	/** @var int The UNIX timestamp of the file's desired modification date */
	public $timestamp = 0;
	/** @var string The current (real) file path we'll have to process */
	protected $filename = null;
	/** @var int The requested permissions */
	protected $perms = 0755;
	/** @var string The temporary file path we gave to the unarchiver engine */
	protected $tempFilename = null;

	/**
	 * Processes the current file, e.g. moves it from temp to final location by FTP
	 */
	abstract public function process();

	/**
	 * The unarchiver tells us the path to the filename it wants to extract and we give it
	 * a different path instead.
	 *
	 * @param string $filename The path to the real file
	 * @param int    $perms    The permissions we need the file to have
	 *
	 * @return string The path to the temporary file
	 */
	abstract public function processFilename($filename, $perms = 0755);

	/**
	 * Recursively creates a directory if it doesn't exist
	 *
	 * @param string $dirName The directory to create
	 * @param int    $perms   The permissions to give to that directory
	 */
	abstract public function createDirRecursive($dirName, $perms);

	abstract public function chmod($file, $perms);

	abstract public function unlink($file);

	abstract public function rmdir($directory);

	abstract public function rename($from, $to);
}

/**
 * Descendants of this class can be used in the unarchiver's observer methods (attach, detach and notify)
 *
 * @author Nicholas
 *
 */
abstract class AKAbstractPartObserver
{
	abstract public function update($object, $message);
}

/**
 * Direct file writer
 */
class AKPostprocDirect extends AKAbstractPostproc
{
	public function process()
	{
		$restorePerms = AKFactory::get('kickstart.setup.restoreperms', false);
		if ($restorePerms)
		{
			@chmod($this->filename, $this->perms);
		}
		else
		{
			if (@is_file($this->filename))
			{
				@chmod($this->filename, 0644);
			}
			else
			{
				@chmod($this->filename, 0755);
			}
		}
		if ($this->timestamp > 0)
		{
			@touch($this->filename, $this->timestamp);
		}

		if (substr($this->filename, -4) === '.php')
		{
			$this->clearFileInOPCache($this->filename);
		}

		return true;
	}

	public function processFilename($filename, $perms = 0755)
	{
		$this->perms    = $perms;
		$this->filename = $filename;

		return $filename;
	}

	public function createDirRecursive($dirName, $perms)
	{
		if (AKFactory::get('kickstart.setup.dryrun', '0'))
		{
			return true;
		}
		if (@mkdir($dirName, 0755, true))
		{
			@chmod($dirName, 0755);

			return true;
		}

		$root = AKFactory::get('kickstart.setup.destdir');
		$root = rtrim(str_replace('\\', '/', $root), '/');
		$dir  = rtrim(str_replace('\\', '/', $dirName), '/');
		if (strpos($dir, $root) === 0)
		{
			$dir = ltrim(substr($dir, strlen($root)), '/');
			$root .= '/';
		}
		else
		{
			$root = '';
		}

		if (empty($dir))
		{
			return true;
		}

		$dirArray = explode('/', $dir);
		$path     = '';
		foreach ($dirArray as $dir)
		{
			$path .= $dir . '/';
			$ret = is_dir($root . $path) ? true : @mkdir($root . $path);
			if (!$ret)
			{
				// Is this a file instead of a directory?
				if (is_file($root . $path))
				{
					$this->clearFileInOPCache($root . $path);
					@unlink($root . $path);
					$ret = @mkdir($root . $path);
				}
				if (!$ret)
				{
					$this->setError(AKText::sprintf('COULDNT_CREATE_DIR', $path));

					return false;
				}
			}
			// Try to set new directory permissions to 0755
			@chmod($root . $path, $perms);
		}

		return true;
	}

	public function chmod($file, $perms)
	{
		if (AKFactory::get('kickstart.setup.dryrun', '0'))
		{
			return true;
		}

		return @chmod($file, $perms);
	}

	public function unlink($file)
	{
		$this->clearFileInOPCache($file);

		return @unlink($file);
	}

	public function rmdir($directory)
	{
		return @rmdir($directory);
	}

	public function rename($from, $to)
	{
		$this->clearFileInOPCache($from);
		$ret = @rename($from, $to);
		$this->clearFileInOPCache($to);

		return $ret;
	}

	public function clearFileInOPCache($file){
		if (ini_get('opcache.enable')
			&& function_exists('opcache_invalidate')
			&& (!ini_get('opcache.restrict_api') || stripos(realpath($_SERVER['SCRIPT_FILENAME']), ini_get('opcache.restrict_api')) === 0))
		{
			\opcache_invalidate($file, true);
		}
	}

}

/**
 * JPA archive extraction class
 */
class AKUnarchiverJPA extends AKAbstractUnarchiver
{
	protected $archiveHeaderData = array();

	protected function readArchiveHeader()
	{
		debugMsg('Preparing to read archive header');
		// Initialize header data array
		$this->archiveHeaderData = new stdClass();

		// Open the first part
		debugMsg('Opening the first part');
		$this->nextFile();

		// Fail for unreadable files
		if ($this->fp === false)
		{
			debugMsg('Could not open the first part');

			return false;
		}

		// Read the signature
		$sig = fread($this->fp, 3);

		if ($sig != 'JPA')
		{
			// Not a JPA file
			debugMsg('Invalid archive signature');
			$this->setError(AKText::_('ERR_NOT_A_JPA_FILE'));

			return false;
		}

		// Read and parse header length
		$header_length_array = unpack('v', fread($this->fp, 2));
		$header_length       = $header_length_array[1];

		// Read and parse the known portion of header data (14 bytes)
		$bin_data    = fread($this->fp, 14);
		$header_data = unpack('Cmajor/Cminor/Vcount/Vuncsize/Vcsize', $bin_data);

		// Load any remaining header data (forward compatibility)
		$rest_length = $header_length - 19;

		if ($rest_length > 0)
		{
			$junk = fread($this->fp, $rest_length);
		}
		else
		{
			$junk = '';
		}

		// Temporary array with all the data we read
		$temp = array(
			'signature'        => $sig,
			'length'           => $header_length,
			'major'            => $header_data['major'],
			'minor'            => $header_data['minor'],
			'filecount'        => $header_data['count'],
			'uncompressedsize' => $header_data['uncsize'],
			'compressedsize'   => $header_data['csize'],
			'unknowndata'      => $junk
		);

		// Array-to-object conversion
		foreach ($temp as $key => $value)
		{
			$this->archiveHeaderData->{$key} = $value;
		}

		debugMsg('Header data:');
		debugMsg('Length              : ' . $header_length);
		debugMsg('Major               : ' . $header_data['major']);
		debugMsg('Minor               : ' . $header_data['minor']);
		debugMsg('File count          : ' . $header_data['count']);
		debugMsg('Uncompressed size   : ' . $header_data['uncsize']);
		debugMsg('Compressed size	  : ' . $header_data['csize']);

		$this->currentPartOffset = @ftell($this->fp);

		$this->dataReadLength = 0;

		return true;
	}

	/**
	 * Concrete classes must use this method to read the file header
	 *
	 * @return bool True if reading the file was successful, false if an error occurred or we reached end of archive
	 */
	protected function readFileHeader()
	{
		// If the current part is over, proceed to the next part please
		if ($this->isEOF(true))
		{
			debugMsg('Archive part EOF; moving to next file');
			$this->nextFile();
		}

		$this->currentPartOffset = ftell($this->fp);

		debugMsg("Reading file signature; part $this->currentPartNumber, offset $this->currentPartOffset");
		// Get and decode Entity Description Block
		$signature = fread($this->fp, 3);

		$this->fileHeader            = new stdClass();
		$this->fileHeader->timestamp = 0;

		// Check signature
		if ($signature != 'JPF')
		{
			if ($this->isEOF(true))
			{
				// This file is finished; make sure it's the last one
				$this->nextFile();

				if (!$this->isEOF(false))
				{
					debugMsg('Invalid file signature before end of archive encountered');
					$this->setError(AKText::sprintf('INVALID_FILE_HEADER', $this->currentPartNumber, $this->currentPartOffset));

					return false;
				}

				// We're just finished
				return false;
			}
			else
			{
				$screwed = true;

				if (AKFactory::get('kickstart.setup.ignoreerrors', false))
				{
					debugMsg('Invalid file block signature; launching heuristic file block signature scanner');
					$screwed = !$this->heuristicFileHeaderLocator();

					if (!$screwed)
					{
						$signature = 'JPF';
					}
					else
					{
						debugMsg('Heuristics failed. Brace yourself for the imminent crash.');
					}
				}

				if ($screwed)
				{
					debugMsg('Invalid file block signature');
					// This is not a file block! The archive is corrupt.
					$this->setError(AKText::sprintf('INVALID_FILE_HEADER', $this->currentPartNumber, $this->currentPartOffset));

					return false;
				}
			}
		}
		// This a JPA Entity Block. Process the header.

		$isBannedFile = false;

		// Read length of EDB and of the Entity Path Data
		$length_array = unpack('vblocksize/vpathsize', fread($this->fp, 4));
		// Read the path data
		if ($length_array['pathsize'] > 0)
		{
			$file = fread($this->fp, $length_array['pathsize']);
		}
		else
		{
			$file = '';
		}

		// Handle file renaming
		$isRenamed = false;
		if (is_array($this->renameFiles) && (count($this->renameFiles) > 0))
		{
			if (array_key_exists($file, $this->renameFiles))
			{
				$file      = $this->renameFiles[$file];
				$isRenamed = true;
			}
		}

		// Handle directory renaming
		$isDirRenamed = false;
		if (is_array($this->renameDirs) && (count($this->renameDirs) > 0))
		{
			if (array_key_exists(dirname($file), $this->renameDirs))
			{
				$file         = rtrim($this->renameDirs[dirname($file)], '/') . '/' . basename($file);
				$isRenamed    = true;
				$isDirRenamed = true;
			}
		}

		// Read and parse the known data portion
		$bin_data    = fread($this->fp, 14);
		$header_data = unpack('Ctype/Ccompression/Vcompsize/Vuncompsize/Vperms', $bin_data);
		// Read any unknown data
		$restBytes = $length_array['blocksize'] - (21 + $length_array['pathsize']);

		if ($restBytes > 0)
		{
			// Start reading the extra fields
			while ($restBytes >= 4)
			{
				$extra_header_data = fread($this->fp, 4);
				$extra_header      = unpack('vsignature/vlength', $extra_header_data);
				$restBytes -= 4;
				$extra_header['length'] -= 4;

				switch ($extra_header['signature'])
				{
					case 256:
						// File modified timestamp
						if ($extra_header['length'] > 0)
						{
							$bindata = fread($this->fp, $extra_header['length']);
							$restBytes -= $extra_header['length'];
							$timestamps                  = unpack('Vmodified', substr($bindata, 0, 4));
							$filectime                   = $timestamps['modified'];
							$this->fileHeader->timestamp = $filectime;
						}
						break;

					default:
						// Unknown field
						if ($extra_header['length'] > 0)
						{
							$junk = fread($this->fp, $extra_header['length']);
							$restBytes -= $extra_header['length'];
						}
						break;
				}
			}

			if ($restBytes > 0)
			{
				$junk = fread($this->fp, $restBytes);
			}
		}

		$compressionType = $header_data['compression'];

		// Populate the return array
		$this->fileHeader->file         = $file;
		$this->fileHeader->compressed   = $header_data['compsize'];
		$this->fileHeader->uncompressed = $header_data['uncompsize'];

		switch ($header_data['type'])
		{
			case 0:
				$this->fileHeader->type = 'dir';
				break;

			case 1:
				$this->fileHeader->type = 'file';
				break;

			case 2:
				$this->fileHeader->type = 'link';
				break;
		}

		switch ($compressionType)
		{
			case 0:
				$this->fileHeader->compression = 'none';
				break;
			case 1:
				$this->fileHeader->compression = 'gzip';
				break;
			case 2:
				$this->fileHeader->compression = 'bzip2';
				break;
		}

		$this->fileHeader->permissions = $header_data['perms'];

		// Find hard-coded banned files
		if ((basename($this->fileHeader->file) == ".") || (basename($this->fileHeader->file) == ".."))
		{
			$isBannedFile = true;
		}

		// Also try to find banned files passed in class configuration
		if ((count($this->skipFiles) > 0) && (!$isRenamed))
		{
			if (in_array($this->fileHeader->file, $this->skipFiles))
			{
				$isBannedFile = true;
			}
		}

		// If we have a banned file, let's skip it
		if ($isBannedFile)
		{
			debugMsg('Skipping file ' . $this->fileHeader->file);
			// Advance the file pointer, skipping exactly the size of the compressed data
			$seekleft = $this->fileHeader->compressed;
			while ($seekleft > 0)
			{
				// Ensure that we can seek past archive part boundaries
				$curSize = @filesize($this->archiveList[$this->currentPartNumber]);
				$curPos  = @ftell($this->fp);
				$canSeek = $curSize - $curPos;
				if ($canSeek > $seekleft)
				{
					$canSeek = $seekleft;
				}
				@fseek($this->fp, $canSeek, SEEK_CUR);
				$seekleft -= $canSeek;
				if ($seekleft)
				{
					$this->nextFile();
				}
			}

			$this->currentPartOffset = @ftell($this->fp);
			$this->runState          = AK_STATE_DONE;

			return true;
		}

		// Remove the removePath, if any
		$this->fileHeader->file = $this->removePath($this->fileHeader->file);

		// Last chance to prepend a path to the filename
		if (!empty($this->addPath) && !$isDirRenamed)
		{
			$this->fileHeader->file = $this->addPath . $this->fileHeader->file;
		}

		// Get the translated path name
		$restorePerms = AKFactory::get('kickstart.setup.restoreperms', false);
		if ($this->fileHeader->type == 'file')
		{
			// Regular file; ask the postproc engine to process its filename
			if ($restorePerms)
			{
				$this->fileHeader->realFile =
					$this->postProcEngine->processFilename($this->fileHeader->file, $this->fileHeader->permissions);
			}
			else
			{
				$this->fileHeader->realFile = $this->postProcEngine->processFilename($this->fileHeader->file);
			}
		}
		elseif ($this->fileHeader->type == 'dir')
		{
			$dir = $this->fileHeader->file;

			// Directory; just create it
			if ($restorePerms)
			{
				$this->postProcEngine->createDirRecursive($this->fileHeader->file, $this->fileHeader->permissions);
			}
			else
			{
				$this->postProcEngine->createDirRecursive($this->fileHeader->file, 0755);
			}
			$this->postProcEngine->processFilename(null);
		}
		else
		{
			// Symlink; do not post-process
			$this->postProcEngine->processFilename(null);
		}

		$this->createDirectory();

		// Header is read
		$this->runState = AK_STATE_HEADER;

		$this->dataReadLength = 0;

		return true;
	}

	protected function heuristicFileHeaderLocator()
	{
		$ret     = false;
		$fullEOF = false;

		while (!$ret && !$fullEOF)
		{
			$this->currentPartOffset = @ftell($this->fp);

			if ($this->isEOF(true))
			{
				$this->nextFile();
			}

			if ($this->isEOF(false))
			{
				$fullEOF = true;
				continue;
			}

			// Read 512Kb
			$chunk     = fread($this->fp, 524288);
			$size_read = mb_strlen($chunk, '8bit');
			//$pos = strpos($chunk, 'JPF');
			$pos = mb_strpos($chunk, 'JPF', 0, '8bit');

			if ($pos !== false)
			{
				// We found it!
				$this->currentPartOffset += $pos + 3;
				@fseek($this->fp, $this->currentPartOffset, SEEK_SET);
				$ret = true;
			}
			else
			{
				// Not yet found :(
				$this->currentPartOffset = @ftell($this->fp);
			}
		}

		return $ret;
	}

	/**
	 * Creates the directory this file points to
	 */
	protected function createDirectory()
	{
		if (AKFactory::get('kickstart.setup.dryrun', '0'))
		{
			return true;
		}

		// Do we need to create a directory?
		if (empty($this->fileHeader->realFile))
		{
			$this->fileHeader->realFile = $this->fileHeader->file;
		}

		$lastSlash = strrpos($this->fileHeader->realFile, '/');
		$dirName   = substr($this->fileHeader->realFile, 0, $lastSlash);
		$perms     = $this->flagRestorePermissions ? $this->fileHeader->permissions : 0755;
		$ignore    = AKFactory::get('kickstart.setup.ignoreerrors', false) || $this->isIgnoredDirectory($dirName);

		if (($this->postProcEngine->createDirRecursive($dirName, $perms) == false) && (!$ignore))
		{
			$this->setError(AKText::sprintf('COULDNT_CREATE_DIR', $dirName));

			return false;
		}
		else
		{
			return true;
		}
	}

	/**
	 * Concrete classes must use this method to process file data. It must set $runState to AK_STATE_DATAREAD when
	 * it's finished processing the file data.
	 *
	 * @return bool True if processing the file data was successful, false if an error occurred
	 */
	protected function processFileData()
	{
		switch ($this->fileHeader->type)
		{
			case 'dir':
				return $this->processTypeDir();
				break;

			case 'link':
				return $this->processTypeLink();
				break;

			case 'file':
				switch ($this->fileHeader->compression)
				{
					case 'none':
						return $this->processTypeFileUncompressed();
						break;

					case 'gzip':
					case 'bzip2':
						return $this->processTypeFileCompressedSimple();
						break;

				}
				break;

			default:
				debugMsg('Unknown file type ' . $this->fileHeader->type);
				break;
		}

		// Unknown file type. Play dumb.
		return true;
	}

	/**
	 * Process the file data of a directory entry
	 *
	 * @return bool
	 */
	private function processTypeDir()
	{
		// Directory entries in the JPA do not have file data, therefore we're done processing the entry
		$this->runState = AK_STATE_DATAREAD;

		return true;
	}

	/**
	 * Process the file data of a link entry
	 *
	 * @return bool
	 */
	private function processTypeLink()
	{
		$readBytes   = 0;
		$toReadBytes = 0;
		$leftBytes   = $this->fileHeader->compressed;
		$data        = '';

		while ($leftBytes > 0)
		{
			$toReadBytes     = ($leftBytes > $this->chunkSize) ? $this->chunkSize : $leftBytes;
			$mydata          = $this->fread($this->fp, $toReadBytes);
			$reallyReadBytes = akstringlen($mydata);
			$data .= $mydata;
			$leftBytes -= $reallyReadBytes;

			if ($reallyReadBytes < $toReadBytes)
			{
				// We read less than requested! Why? Did we hit local EOF?
				if ($this->isEOF(true) && !$this->isEOF(false))
				{
					// Yeap. Let's go to the next file
					$this->nextFile();
				}
				else
				{
					debugMsg('End of local file before reading all data with no more parts left. The archive is corrupt or truncated.');
					// Nope. The archive is corrupt
					$this->setError(AKText::_('ERR_CORRUPT_ARCHIVE'));

					return false;
				}
			}
		}

		$filename = isset($this->fileHeader->realFile) ? $this->fileHeader->realFile : $this->fileHeader->file;

		if (!AKFactory::get('kickstart.setup.dryrun', '0'))
		{
			// Try to remove an existing file or directory by the same name
			if (file_exists($filename))
			{
				@unlink($filename);
				@rmdir($filename);
			}

			// Remove any trailing slash
			if (substr($filename, -1) == '/')
			{
				$filename = substr($filename, 0, -1);
			}
			// Create the symlink - only possible within PHP context. There's no support built in the FTP protocol, so no postproc use is possible here :(
			@symlink($data, $filename);
		}

		$this->runState = AK_STATE_DATAREAD;

		return true; // No matter if the link was created!
	}

	private function processTypeFileUncompressed()
	{
		// Uncompressed files are being processed in small chunks, to avoid timeouts
		if (($this->dataReadLength == 0) && !AKFactory::get('kickstart.setup.dryrun', '0'))
		{
			// Before processing file data, ensure permissions are adequate
			$this->setCorrectPermissions($this->fileHeader->file);
		}

		// Open the output file
		if (!AKFactory::get('kickstart.setup.dryrun', '0'))
		{
			$ignore =
				AKFactory::get('kickstart.setup.ignoreerrors', false) || $this->isIgnoredDirectory($this->fileHeader->file);

			if ($this->dataReadLength == 0)
			{
				$outfp = @fopen($this->fileHeader->realFile, 'wb');
			}
			else
			{
				$outfp = @fopen($this->fileHeader->realFile, 'ab');
			}

			// Can we write to the file?
			if (($outfp === false) && (!$ignore))
			{
				// An error occurred
				debugMsg('Could not write to output file');
				$this->setError(AKText::sprintf('COULDNT_WRITE_FILE', $this->fileHeader->realFile));

				return false;
			}
		}

		// Does the file have any data, at all?
		if ($this->fileHeader->compressed == 0)
		{
			// No file data!
			if (!AKFactory::get('kickstart.setup.dryrun', '0') && is_resource($outfp))
			{
				@fclose($outfp);
			}

			$this->runState = AK_STATE_DATAREAD;

			return true;
		}

		// Reference to the global timer
		$timer = AKFactory::getTimer();

		$toReadBytes = 0;
		$leftBytes   = $this->fileHeader->compressed - $this->dataReadLength;

		// Loop while there's data to read and enough time to do it
		while (($leftBytes > 0) && ($timer->getTimeLeft() > 0))
		{
			$toReadBytes     = ($leftBytes > $this->chunkSize) ? $this->chunkSize : $leftBytes;
			$data            = $this->fread($this->fp, $toReadBytes);
			$reallyReadBytes = akstringlen($data);
			$leftBytes -= $reallyReadBytes;
			$this->dataReadLength += $reallyReadBytes;

			if ($reallyReadBytes < $toReadBytes)
			{
				// We read less than requested! Why? Did we hit local EOF?
				if ($this->isEOF(true) && !$this->isEOF(false))
				{
					// Yeap. Let's go to the next file
					$this->nextFile();
				}
				else
				{
					// Nope. The archive is corrupt
					debugMsg('Not enough data in file. The archive is truncated or corrupt.');
					$this->setError(AKText::_('ERR_CORRUPT_ARCHIVE'));

					return false;
				}
			}

			if (!AKFactory::get('kickstart.setup.dryrun', '0'))
			{
				if (is_resource($outfp))
				{
					@fwrite($outfp, $data);
				}
			}
		}

		// Close the file pointer
		if (!AKFactory::get('kickstart.setup.dryrun', '0'))
		{
			if (is_resource($outfp))
			{
				@fclose($outfp);
			}
		}

		// Was this a pre-timeout bail out?
		if ($leftBytes > 0)
		{
			$this->runState = AK_STATE_DATA;
		}
		else
		{
			// Oh! We just finished!
			$this->runState       = AK_STATE_DATAREAD;
			$this->dataReadLength = 0;
		}

		return true;
	}

	private function processTypeFileCompressedSimple()
	{
		if (!AKFactory::get('kickstart.setup.dryrun', '0'))
		{
			// Before processing file data, ensure permissions are adequate
			$this->setCorrectPermissions($this->fileHeader->file);

			// Open the output file
			$outfp = @fopen($this->fileHeader->realFile, 'wb');

			// Can we write to the file?
			$ignore =
				AKFactory::get('kickstart.setup.ignoreerrors', false) || $this->isIgnoredDirectory($this->fileHeader->file);

			if (($outfp === false) && (!$ignore))
			{
				// An error occurred
				debugMsg('Could not write to output file');
				$this->setError(AKText::sprintf('COULDNT_WRITE_FILE', $this->fileHeader->realFile));

				return false;
			}
		}

		// Does the file have any data, at all?
		if ($this->fileHeader->compressed == 0)
		{
			// No file data!
			if (!AKFactory::get('kickstart.setup.dryrun', '0'))
			{
				if (is_resource($outfp))
				{
					@fclose($outfp);
				}
			}
			$this->runState = AK_STATE_DATAREAD;

			return true;
		}

		// Simple compressed files are processed as a whole; we can't do chunk processing
		$zipData = $this->fread($this->fp, $this->fileHeader->compressed);
		while (akstringlen($zipData) < $this->fileHeader->compressed)
		{
			// End of local file before reading all data, but have more archive parts?
			if ($this->isEOF(true) && !$this->isEOF(false))
			{
				// Yeap. Read from the next file
				$this->nextFile();
				$bytes_left = $this->fileHeader->compressed - akstringlen($zipData);
				$zipData .= $this->fread($this->fp, $bytes_left);
			}
			else
			{
				debugMsg('End of local file before reading all data with no more parts left. The archive is corrupt or truncated.');
				$this->setError(AKText::_('ERR_CORRUPT_ARCHIVE'));

				return false;
			}
		}

		if ($this->fileHeader->compression == 'gzip')
		{
			$unzipData = gzinflate($zipData);
		}
		elseif ($this->fileHeader->compression == 'bzip2')
		{
			$unzipData = bzdecompress($zipData);
		}
		unset($zipData);

		// Write to the file.
		if (!AKFactory::get('kickstart.setup.dryrun', '0') && is_resource($outfp))
		{
			@fwrite($outfp, $unzipData, $this->fileHeader->uncompressed);
			@fclose($outfp);
		}
		unset($unzipData);

		$this->runState = AK_STATE_DATAREAD;

		return true;
	}
}

/**
 * ZIP archive extraction class
 *
 * Since the file data portion of ZIP and JPA are similarly structured (it's empty for dirs,
 * linked node name for symlinks, dumped binary data for no compressions and dumped gzipped
 * binary data for gzip compression) we just have to subclass AKUnarchiverJPA and change the
 * header reading bits. Reusable code ;)
 */
class AKUnarchiverZIP extends AKUnarchiverJPA
{
	var $expectDataDescriptor = false;

	protected function readArchiveHeader()
	{
		debugMsg('Preparing to read archive header');
		// Initialize header data array
		$this->archiveHeaderData = new stdClass();

		// Open the first part
		debugMsg('Opening the first part');
		$this->nextFile();

		// Fail for unreadable files
		if ($this->fp === false)
		{
			debugMsg('The first part is not readable');

			return false;
		}

		// Read a possible multipart signature
		$sigBinary  = fread($this->fp, 4);
		$headerData = unpack('Vsig', $sigBinary);

		// Roll back if it's not a multipart archive
		if ($headerData['sig'] == 0x04034b50)
		{
			debugMsg('The archive is not multipart');
			fseek($this->fp, -4, SEEK_CUR);
		}
		else
		{
			debugMsg('The archive is multipart');
		}

		$multiPartSigs = array(
			0x08074b50,        // Multi-part ZIP
			0x30304b50,        // Multi-part ZIP (alternate)
			0x04034b50        // Single file
		);
		if (!in_array($headerData['sig'], $multiPartSigs))
		{
			debugMsg('Invalid header signature ' . dechex($headerData['sig']));
			$this->setError(AKText::_('ERR_CORRUPT_ARCHIVE'));

			return false;
		}

		$this->currentPartOffset = @ftell($this->fp);
		debugMsg('Current part offset after reading header: ' . $this->currentPartOffset);

		$this->dataReadLength = 0;

		return true;
	}

	/**
	 * Concrete classes must use this method to read the file header
	 *
	 * @return bool True if reading the file was successful, false if an error occurred or we reached end of archive
	 */
	protected function readFileHeader()
	{
		// If the current part is over, proceed to the next part please
		if ($this->isEOF(true))
		{
			debugMsg('Opening next archive part');
			$this->nextFile();
		}

		$this->currentPartOffset = ftell($this->fp);

		if ($this->expectDataDescriptor)
		{
			// The last file had bit 3 of the general purpose bit flag set. This means that we have a
			// 12 byte data descriptor we need to skip. To make things worse, there might also be a 4
			// byte optional data descriptor header (0x08074b50).
			$junk = @fread($this->fp, 4);
			$junk = unpack('Vsig', $junk);
			if ($junk['sig'] == 0x08074b50)
			{
				// Yes, there was a signature
				$junk = @fread($this->fp, 12);
				debugMsg('Data descriptor (w/ header) skipped at ' . (ftell($this->fp) - 12));
			}
			else
			{
				// No, there was no signature, just read another 8 bytes
				$junk = @fread($this->fp, 8);
				debugMsg('Data descriptor (w/out header) skipped at ' . (ftell($this->fp) - 8));
			}

			// And check for EOF, too
			if ($this->isEOF(true))
			{
				debugMsg('EOF before reading header');

				$this->nextFile();
			}
		}

		// Get and decode Local File Header
		$headerBinary = fread($this->fp, 30);
		$headerData   =
			unpack('Vsig/C2ver/vbitflag/vcompmethod/vlastmodtime/vlastmoddate/Vcrc/Vcompsize/Vuncomp/vfnamelen/veflen', $headerBinary);

		// Check signature
		if (!($headerData['sig'] == 0x04034b50))
		{
			debugMsg('Not a file signature at ' . (ftell($this->fp) - 4));

			// The signature is not the one used for files. Is this a central directory record (i.e. we're done)?
			if ($headerData['sig'] == 0x02014b50)
			{
				debugMsg('EOCD signature at ' . (ftell($this->fp) - 4));
				// End of ZIP file detected. We'll just skip to the end of file...
				while ($this->nextFile())
				{
				}
				@fseek($this->fp, 0, SEEK_END); // Go to EOF
				return false;
			}
			else
			{
				debugMsg('Invalid signature ' . dechex($headerData['sig']) . ' at ' . ftell($this->fp));
				$this->setError(AKText::_('ERR_CORRUPT_ARCHIVE'));

				return false;
			}
		}

		// If bit 3 of the bitflag is set, expectDataDescriptor is true
		$this->expectDataDescriptor = ($headerData['bitflag'] & 4) == 4;

		$this->fileHeader            = new stdClass();
		$this->fileHeader->timestamp = 0;

		// Read the last modified data and time
		$lastmodtime = $headerData['lastmodtime'];
		$lastmoddate = $headerData['lastmoddate'];

		if ($lastmoddate && $lastmodtime)
		{
			// ----- Extract time
			$v_hour    = ($lastmodtime & 0xF800) >> 11;
			$v_minute  = ($lastmodtime & 0x07E0) >> 5;
			$v_seconde = ($lastmodtime & 0x001F) * 2;

			// ----- Extract date
			$v_year  = (($lastmoddate & 0xFE00) >> 9) + 1980;
			$v_month = ($lastmoddate & 0x01E0) >> 5;
			$v_day   = $lastmoddate & 0x001F;

			// ----- Get UNIX date format
			$this->fileHeader->timestamp = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);
		}

		$isBannedFile = false;

		$this->fileHeader->compressed   = $headerData['compsize'];
		$this->fileHeader->uncompressed = $headerData['uncomp'];
		$nameFieldLength                = $headerData['fnamelen'];
		$extraFieldLength               = $headerData['eflen'];

		// Read filename field
		$this->fileHeader->file = fread($this->fp, $nameFieldLength);

		// Handle file renaming
		$isRenamed = false;
		if (is_array($this->renameFiles) && (count($this->renameFiles) > 0))
		{
			if (array_key_exists($this->fileHeader->file, $this->renameFiles))
			{
				$this->fileHeader->file = $this->renameFiles[$this->fileHeader->file];
				$isRenamed              = true;
			}
		}

		// Handle directory renaming
		$isDirRenamed = false;
		if (is_array($this->renameDirs) && (count($this->renameDirs) > 0))
		{
			if (array_key_exists(dirname($this->fileHeader->file), $this->renameDirs))
			{
				$file         =
					rtrim($this->renameDirs[dirname($this->fileHeader->file)], '/') . '/' . basename($this->fileHeader->file);
				$isRenamed    = true;
				$isDirRenamed = true;
			}
		}

		// Read extra field if present
		if ($extraFieldLength > 0)
		{
			$extrafield = fread($this->fp, $extraFieldLength);
		}

		debugMsg('*' . ftell($this->fp) . ' IS START OF ' . $this->fileHeader->file . ' (' . $this->fileHeader->compressed . ' bytes)');


		// Decide filetype -- Check for directories
		$this->fileHeader->type = 'file';
		if (strrpos($this->fileHeader->file, '/') == strlen($this->fileHeader->file) - 1)
		{
			$this->fileHeader->type = 'dir';
		}
		// Decide filetype -- Check for symbolic links
		if (($headerData['ver1'] == 10) && ($headerData['ver2'] == 3))
		{
			$this->fileHeader->type = 'link';
		}

		switch ($headerData['compmethod'])
		{
			case 0:
				$this->fileHeader->compression = 'none';
				break;
			case 8:
				$this->fileHeader->compression = 'gzip';
				break;
		}

		// Find hard-coded banned files
		if ((basename($this->fileHeader->file) == ".") || (basename($this->fileHeader->file) == ".."))
		{
			$isBannedFile = true;
		}

		// Also try to find banned files passed in class configuration
		if ((count($this->skipFiles) > 0) && (!$isRenamed))
		{
			if (in_array($this->fileHeader->file, $this->skipFiles))
			{
				$isBannedFile = true;
			}
		}

		// If we have a banned file, let's skip it
		if ($isBannedFile)
		{
			// Advance the file pointer, skipping exactly the size of the compressed data
			$seekleft = $this->fileHeader->compressed;
			while ($seekleft > 0)
			{
				// Ensure that we can seek past archive part boundaries
				$curSize = @filesize($this->archiveList[$this->currentPartNumber]);
				$curPos  = @ftell($this->fp);
				$canSeek = $curSize - $curPos;
				if ($canSeek > $seekleft)
				{
					$canSeek = $seekleft;
				}
				@fseek($this->fp, $canSeek, SEEK_CUR);
				$seekleft -= $canSeek;
				if ($seekleft)
				{
					$this->nextFile();
				}
			}

			$this->currentPartOffset = @ftell($this->fp);
			$this->runState          = AK_STATE_DONE;

			return true;
		}

		// Remove the removePath, if any
		$this->fileHeader->file = $this->removePath($this->fileHeader->file);

		// Last chance to prepend a path to the filename
		if (!empty($this->addPath) && !$isDirRenamed)
		{
			$this->fileHeader->file = $this->addPath . $this->fileHeader->file;
		}

		// Get the translated path name
		if ($this->fileHeader->type == 'file')
		{
			$this->fileHeader->realFile = $this->postProcEngine->processFilename($this->fileHeader->file);
		}
		elseif ($this->fileHeader->type == 'dir')
		{
			$this->fileHeader->timestamp = 0;

			$dir = $this->fileHeader->file;

			$this->postProcEngine->createDirRecursive($this->fileHeader->file, 0755);
			$this->postProcEngine->processFilename(null);
		}
		else
		{
			// Symlink; do not post-process
			$this->fileHeader->timestamp = 0;
			$this->postProcEngine->processFilename(null);
		}

		$this->createDirectory();

		// Header is read
		$this->runState = AK_STATE_HEADER;

		return true;
	}

}

/**
 * Timer class
 */
class AKCoreTimer extends AKAbstractObject
{
	/** @var int Maximum execution time allowance per step */
	private $max_exec_time = null;

	/** @var int Timestamp of execution start */
	private $start_time = null;

	/**
	 * Public constructor, creates the timer object and calculates the execution time limits
	 */
	public function __construct()
	{
		// Initialize start time
		$this->start_time = $this->microtime_float();

		// Get configured max time per step and bias
		$config_max_exec_time = AKFactory::get('kickstart.tuning.max_exec_time', 14);
		$bias                 = AKFactory::get('kickstart.tuning.run_time_bias', 75) / 100;

		// Get PHP's maximum execution time (our upper limit)
		if (@function_exists('ini_get'))
		{
			$php_max_exec_time = @ini_get("maximum_execution_time");
			if ((!is_numeric($php_max_exec_time)) || ($php_max_exec_time == 0))
			{
				// If we have no time limit, set a hard limit of about 10 seconds
				// (safe for Apache and IIS timeouts, verbose enough for users)
				$php_max_exec_time = 14;
			}
		}
		else
		{
			// If ini_get is not available, use a rough default
			$php_max_exec_time = 14;
		}

		// Apply an arbitrary correction to counter CMS load time
		$php_max_exec_time--;

		// Apply bias
		$php_max_exec_time    = $php_max_exec_time * $bias;
		$config_max_exec_time = $config_max_exec_time * $bias;

		// Use the most appropriate time limit value
		if ($config_max_exec_time > $php_max_exec_time)
		{
			$this->max_exec_time = $php_max_exec_time;
		}
		else
		{
			$this->max_exec_time = $config_max_exec_time;
		}
	}

	/**
	 * Returns the current timestampt in decimal seconds
	 */
	private function microtime_float()
	{
		list($usec, $sec) = explode(" ", microtime());

		return ((float) $usec + (float) $sec);
	}

	/**
	 * Wake-up function to reset internal timer when we get unserialized
	 */
	public function __wakeup()
	{
		// Re-initialize start time on wake-up
		$this->start_time = $this->microtime_float();
	}

	/**
	 * Gets the number of seconds left, before we hit the "must break" threshold
	 *
	 * @return float
	 */
	public function getTimeLeft()
	{
		return $this->max_exec_time - $this->getRunningTime();
	}

	/**
	 * Gets the time elapsed since object creation/unserialization, effectively how
	 * long Akeeba Engine has been processing data
	 *
	 * @return float
	 */
	public function getRunningTime()
	{
		return $this->microtime_float() - $this->start_time;
	}

	/**
	 * Enforce the minimum execution time
	 */
	public function enforce_min_exec_time()
	{
		// Try to get a sane value for PHP's maximum_execution_time INI parameter
		if (@function_exists('ini_get'))
		{
			$php_max_exec = @ini_get("maximum_execution_time");
		}
		else
		{
			$php_max_exec = 10;
		}
		if (($php_max_exec == "") || ($php_max_exec == 0))
		{
			$php_max_exec = 10;
		}
		// Decrease $php_max_exec time by 500 msec we need (approx.) to tear down
		// the application, as well as another 500msec added for rounding
		// error purposes. Also make sure this is never gonna be less than 0.
		$php_max_exec = max($php_max_exec * 1000 - 1000, 0);

		// Get the "minimum execution time per step" Akeeba Backup configuration variable
		$minexectime = AKFactory::get('kickstart.tuning.min_exec_time', 0);
		if (!is_numeric($minexectime))
		{
			$minexectime = 0;
		}

		// Make sure we are not over PHP's time limit!
		if ($minexectime > $php_max_exec)
		{
			$minexectime = $php_max_exec;
		}

		// Get current running time
		$elapsed_time = $this->getRunningTime() * 1000;

		// Only run a sleep delay if we haven't reached the minexectime execution time
		if (($minexectime > $elapsed_time) && ($elapsed_time > 0))
		{
			$sleep_msec = $minexectime - $elapsed_time;
			if (function_exists('usleep'))
			{
				usleep(1000 * $sleep_msec);
			}
			elseif (function_exists('time_nanosleep'))
			{
				$sleep_sec  = floor($sleep_msec / 1000);
				$sleep_nsec = 1000000 * ($sleep_msec - ($sleep_sec * 1000));
				time_nanosleep($sleep_sec, $sleep_nsec);
			}
			elseif (function_exists('time_sleep_until'))
			{
				$until_timestamp = time() + $sleep_msec / 1000;
				time_sleep_until($until_timestamp);
			}
			elseif (function_exists('sleep'))
			{
				$sleep_sec = ceil($sleep_msec / 1000);
				sleep($sleep_sec);
			}
		}
		elseif ($elapsed_time > 0)
		{
			// No sleep required, even if user configured us to be able to do so.
		}
	}

	/**
	 * Reset the timer. It should only be used in CLI mode!
	 */
	public function resetTime()
	{
		$this->start_time = $this->microtime_float();
	}

	/**
	 * @param int $max_exec_time
	 */
	public function setMaxExecTime($max_exec_time)
	{
		$this->max_exec_time = $max_exec_time;
	}
}

/**
 * A filesystem scanner which uses opendir()
 */
class AKUtilsLister extends AKAbstractObject
{
	public function &getFiles($folder, $pattern = '*')
	{
		// Initialize variables
		$arr   = array();
		$false = false;

		if (!is_dir($folder))
		{
			return $false;
		}

		$handle = @opendir($folder);
		// If directory is not accessible, just return FALSE
		if ($handle === false)
		{
			$this->setWarning('Unreadable directory ' . $folder);

			return $false;
		}

		while (($file = @readdir($handle)) !== false)
		{
			if (!fnmatch($pattern, $file))
			{
				continue;
			}

			if (($file != '.') && ($file != '..'))
			{
				$ds    =
					($folder == '') || ($folder == '/') || (@substr($folder, -1) == '/') || (@substr($folder, -1) == DIRECTORY_SEPARATOR) ?
						'' : DIRECTORY_SEPARATOR;
				$dir   = $folder . $ds . $file;
				$isDir = is_dir($dir);
				if (!$isDir)
				{
					$arr[] = $dir;
				}
			}
		}
		@closedir($handle);

		return $arr;
	}

	public function &getFolders($folder, $pattern = '*')
	{
		// Initialize variables
		$arr   = array();
		$false = false;

		if (!is_dir($folder))
		{
			return $false;
		}

		$handle = @opendir($folder);
		// If directory is not accessible, just return FALSE
		if ($handle === false)
		{
			$this->setWarning('Unreadable directory ' . $folder);

			return $false;
		}

		while (($file = @readdir($handle)) !== false)
		{
			if (!fnmatch($pattern, $file))
			{
				continue;
			}

			if (($file != '.') && ($file != '..'))
			{
				$ds    =
					($folder == '') || ($folder == '/') || (@substr($folder, -1) == '/') || (@substr($folder, -1) == DIRECTORY_SEPARATOR) ?
						'' : DIRECTORY_SEPARATOR;
				$dir   = $folder . $ds . $file;
				$isDir = is_dir($dir);
				if ($isDir)
				{
					$arr[] = $dir;
				}
			}
		}
		@closedir($handle);

		return $arr;
	}
}

/**
 * A simple INI-based i18n engine
 */
class AKText extends AKAbstractObject
{
	/**
	 * The default (en_GB) translation used when no other translation is available
	 *
	 * @var array
	 */
	private $default_translation = array(
		'ERR_NOT_A_JPA_FILE'              => 'The file is not a JPA archive',
		'ERR_CORRUPT_ARCHIVE'             => 'The archive file is corrupt, truncated or archive parts are missing',
		'ERR_INVALID_LOGIN'               => 'Invalid login',
		'COULDNT_CREATE_DIR'              => 'Could not create %s folder',
		'COULDNT_WRITE_FILE'              => 'Could not open %s for writing.',
		'INVALID_FILE_HEADER'             => 'Invalid header in archive file, part %s, offset %s',
		'ERR_COULD_NOT_OPEN_ARCHIVE_PART' => 'Could not open archive part file %s for reading. Check that the file exists, is readable by the web server and is not in a directory made out of reach by chroot, open_basedir restrictions or any other restriction put in place by your host.',
	);

	/**
	 * The array holding the translation keys
	 *
	 * @var array
	 */
	private $strings;

	/**
	 * The currently detected language (ISO code)
	 *
	 * @var string
	 */
	private $language;

	/*
	 * Initializes the translation engine
	 * @return AKText
	 */
	public function __construct()
	{
		// Start with the default translation
		$this->strings = $this->default_translation;
		// Try loading the translation file in English, if it exists
		$this->loadTranslation('en-GB');
		// Try loading the translation file in the browser's preferred language, if it exists
		$this->getBrowserLanguage();
		if (!is_null($this->language))
		{
			$this->loadTranslation();
		}
	}

	private function loadTranslation($lang = null)
	{
		if (defined('KSLANGDIR'))
		{
			$dirname = KSLANGDIR;
		}
		else
		{
			$dirname = KSROOTDIR;
		}
		$basename = basename(__FILE__, '.php') . '.ini';
		if (empty($lang))
		{
			$lang = $this->language;
		}

		$translationFilename = $dirname . DIRECTORY_SEPARATOR . $lang . '.' . $basename;
		if (!@file_exists($translationFilename) && ($basename != 'kickstart.ini'))
		{
			$basename            = 'kickstart.ini';
			$translationFilename = $dirname . DIRECTORY_SEPARATOR . $lang . '.' . $basename;
		}
		if (!@file_exists($translationFilename))
		{
			return;
		}
		$temp = self::parse_ini_file($translationFilename, false);

		if (!is_array($this->strings))
		{
			$this->strings = array();
		}
		if (empty($temp))
		{
			$this->strings = array_merge($this->default_translation, $this->strings);
		}
		else
		{
			$this->strings = array_merge($this->strings, $temp);
		}
	}

	/**
	 * A PHP based INI file parser.
	 *
	 * Thanks to asohn ~at~ aircanopy ~dot~ net for posting this handy function on
	 * the parse_ini_file page on http://gr.php.net/parse_ini_file
	 *
	 * @param string $file             Filename to process
	 * @param bool   $process_sections True to also process INI sections
	 *
	 * @return array An associative array of sections, keys and values
	 * @access private
	 */
	public static function parse_ini_file($file, $process_sections = false, $raw_data = false)
	{
		$process_sections = ($process_sections !== true) ? false : true;

		if (!$raw_data)
		{
			$ini = @file($file);
		}
		else
		{
			$ini = $file;
		}
		if (count($ini) == 0)
		{
			return array();
		}

		$sections = array();
		$values   = array();
		$result   = array();
		$globals  = array();
		$i        = 0;
		if (!empty($ini))
		{
			foreach ($ini as $line)
			{
				$line = trim($line);
				$line = str_replace("\t", " ", $line);

				// Comments
				if (!preg_match('/^[a-zA-Z0-9[]/', $line))
				{
					continue;
				}

				// Sections
				if ($line[0] == '[')
				{
					$tmp        = explode(']', $line);
					$sections[] = trim(substr($tmp[0], 1));
					$i++;
					continue;
				}

				// Key-value pair
				list($key, $value) = explode('=', $line, 2);
				$key   = trim($key);
				$value = trim($value);
				if (strstr($value, ";"))
				{
					$tmp = explode(';', $value);
					if (count($tmp) == 2)
					{
						if ((($value[0] != '"') && ($value[0] != "'")) ||
							preg_match('/^".*"\s*;/', $value) || preg_match('/^".*;[^"]*$/', $value) ||
							preg_match("/^'.*'\s*;/", $value) || preg_match("/^'.*;[^']*$/", $value)
						)
						{
							$value = $tmp[0];
						}
					}
					else
					{
						if ($value[0] == '"')
						{
							$value = preg_replace('/^"(.*)".*/', '$1', $value);
						}
						elseif ($value[0] == "'")
						{
							$value = preg_replace("/^'(.*)'.*/", '$1', $value);
						}
						else
						{
							$value = $tmp[0];
						}
					}
				}
				$value = trim($value);
				$value = trim($value, "'\"");

				if ($i == 0)
				{
					if (substr($line, -1, 2) == '[]')
					{
						$globals[$key][] = $value;
					}
					else
					{
						$globals[$key] = $value;
					}
				}
				else
				{
					if (substr($line, -1, 2) == '[]')
					{
						$values[$i - 1][$key][] = $value;
					}
					else
					{
						$values[$i - 1][$key] = $value;
					}
				}
			}
		}

		for ($j = 0; $j < $i; $j++)
		{
			if ($process_sections === true)
			{
				$result[$sections[$j]] = $values[$j];
			}
			else
			{
				$result[] = $values[$j];
			}
		}

		return $result + $globals;
	}

	public function getBrowserLanguage()
	{
		// Detection code from Full Operating system language detection, by Harald Hope
		// Retrieved from http://techpatterns.com/downloads/php_language_detection.php
		$user_languages = array();
		//check to see if language is set
		if (isset($_SERVER["HTTP_ACCEPT_LANGUAGE"]))
		{
			$languages = strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"]);
			// $languages = ' fr-ch;q=0.3, da, en-us;q=0.8, en;q=0.5, fr;q=0.3';
			// need to remove spaces from strings to avoid error
			$languages = str_replace(' ', '', $languages);
			$languages = explode(",", $languages);

			foreach ($languages as $language_list)
			{
				// pull out the language, place languages into array of full and primary
				// string structure:
				$temp_array = array();
				// slice out the part before ; on first step, the part before - on second, place into array
				$temp_array[0] = substr($language_list, 0, strcspn($language_list, ';'));//full language
				$temp_array[1] = substr($language_list, 0, 2);// cut out primary language
				if ((strlen($temp_array[0]) == 5) && ((substr($temp_array[0], 2, 1) == '-') || (substr($temp_array[0], 2, 1) == '_')))
				{
					$langLocation  = strtoupper(substr($temp_array[0], 3, 2));
					$temp_array[0] = $temp_array[1] . '-' . $langLocation;
				}
				//place this array into main $user_languages language array
				$user_languages[] = $temp_array;
			}
		}
		else// if no languages found
		{
			$user_languages[0] = array('', ''); //return blank array.
		}

		$this->language = null;
		$basename       = basename(__FILE__, '.php') . '.ini';

		// Try to match main language part of the filename, irrespective of the location, e.g. de_DE will do if de_CH doesn't exist.
		if (class_exists('AKUtilsLister'))
		{
			$fs       = new AKUtilsLister();
			$iniFiles = $fs->getFiles(KSROOTDIR, '*.' . $basename);
			if (empty($iniFiles) && ($basename != 'kickstart.ini'))
			{
				$basename = 'kickstart.ini';
				$iniFiles = $fs->getFiles(KSROOTDIR, '*.' . $basename);
			}
		}
		else
		{
			$iniFiles = null;
		}

		if (is_array($iniFiles))
		{
			foreach ($user_languages as $languageStruct)
			{
				if (is_null($this->language))
				{
					// Get files matching the main lang part
					$iniFiles = $fs->getFiles(KSROOTDIR, $languageStruct[1] . '-??.' . $basename);
					if (count($iniFiles) > 0)
					{
						$filename       = $iniFiles[0];
						$filename       = substr($filename, strlen(KSROOTDIR) + 1);
						$this->language = substr($filename, 0, 5);
					}
					else
					{
						$this->language = null;
					}
				}
			}
		}

		if (is_null($this->language))
		{
			// Try to find a full language match
			foreach ($user_languages as $languageStruct)
			{
				if (@file_exists($languageStruct[0] . '.' . $basename) && is_null($this->language))
				{
					$this->language = $languageStruct[0];
				}
			}
		}
		else
		{
			// Do we have an exact match?
			foreach ($user_languages as $languageStruct)
			{
				if (substr($this->language, 0, strlen($languageStruct[1])) == $languageStruct[1])
				{
					if (file_exists($languageStruct[0] . '.' . $basename))
					{
						$this->language = $languageStruct[0];
					}
				}
			}
		}

		// Now, scan for full language based on the partial match

	}

	public static function sprintf($key)
	{
		$text = self::getInstance();
		$args = func_get_args();
		if (count($args) > 0)
		{
			$args[0] = $text->_($args[0]);

			return @call_user_func_array('sprintf', $args);
		}

		return '';
	}

	/**
	 * Singleton pattern for Language
	 *
	 * @return AKText The global AKText instance
	 */
	public static function &getInstance()
	{
		static $instance;

		if (!is_object($instance))
		{
			$instance = new AKText();
		}

		return $instance;
	}

	public static function _($string)
	{
		$text = self::getInstance();

		$key = strtoupper($string);
		$key = substr($key, 0, 1) == '_' ? substr($key, 1) : $key;

		if (isset ($text->strings[$key]))
		{
			$string = $text->strings[$key];
		}
		else
		{
			if (defined($string))
			{
				$string = constant($string);
			}
		}

		return $string;
	}

	public function dumpLanguage()
	{
		$out = '';
		foreach ($this->strings as $key => $value)
		{
			$out .= "$key=$value\n";
		}

		return $out;
	}

	public function asJavascript()
	{
		$out = '';
		foreach ($this->strings as $key => $value)
		{
			$key   = addcslashes($key, '\\\'"');
			$value = addcslashes($value, '\\\'"');
			if (!empty($out))
			{
				$out .= ",\n";
			}
			$out .= "'$key':\t'$value'";
		}

		return $out;
	}

	public function resetTranslation()
	{
		$this->strings = $this->default_translation;
	}

	public function addDefaultLanguageStrings($stringList = array())
	{
		if (!is_array($stringList))
		{
			return;
		}
		if (empty($stringList))
		{
			return;
		}

		$this->strings = array_merge($stringList, $this->strings);
	}
}

/**
 * The Akeeba Kickstart Factory class
 * This class is reponssible for instanciating all Akeeba Kicsktart classes
 */
class AKFactory
{
	/** @var   array  A list of instantiated objects */
	private $objectlist = array();

	/** @var   array  Simple hash data storage */
	private $varlist = array();

	/** @var   self   Static instance */
	private static $instance = null;

	/** Private constructor makes sure we can't directly instantiate the class */
	private function __construct()
	{
	}

	/**
	 * Gets a serialized snapshot of the Factory for safekeeping (hibernate)
	 *
	 * @return string The serialized snapshot of the Factory
	 */
	public static function serialize()
	{
		$engine = self::getUnarchiver();
		$engine->shutdown();
		$serialized = serialize(self::getInstance());

		if (function_exists('base64_encode') && function_exists('base64_decode'))
		{
			$serialized = base64_encode($serialized);
		}

		return $serialized;
	}

	/**
	 * Gets the unarchiver engine
	 */
	public static function &getUnarchiver($configOverride = null)
	{
		static $class_name;

		if (!empty($configOverride))
		{
			if ($configOverride['reset'])
			{
				$class_name = null;
			}
		}

		if (empty($class_name))
		{
			$filetype = self::get('kickstart.setup.filetype', null);

			if (empty($filetype))
			{
				$filename      = self::get('kickstart.setup.sourcefile', null);
				$basename      = basename($filename);
				$baseextension = strtoupper(substr($basename, -3));
				switch ($baseextension)
				{
					case 'JPA':
						$filetype = 'JPA';
						break;

					case 'JPS':
						$filetype = 'JPS';
						break;

					case 'ZIP':
						$filetype = 'ZIP';
						break;

					default:
						die('Invalid archive type or extension in file ' . $filename);
						break;
				}
			}

			$class_name = 'AKUnarchiver' . ucfirst($filetype);
		}

		$destdir = self::get('kickstart.setup.destdir', null);
		if (empty($destdir))
		{
			$destdir = KSROOTDIR;
		}

		$object = self::getClassInstance($class_name);
		if ($object->getState() == 'init')
		{
			$sourcePath = self::get('kickstart.setup.sourcepath', '');
			$sourceFile = self::get('kickstart.setup.sourcefile', '');

			if (!empty($sourcePath))
			{
				$sourceFile = rtrim($sourcePath, '/\\') . '/' . $sourceFile;
			}

			// Initialize the object –– Any change here MUST be reflected to echoHeadJavascript (default values)
			$config = array(
				'filename'            => $sourceFile,
				'restore_permissions' => self::get('kickstart.setup.restoreperms', 0),
				'post_proc'           => self::get('kickstart.procengine', 'direct'),
				'add_path'            => self::get('kickstart.setup.targetpath', $destdir),
				'remove_path'         => self::get('kickstart.setup.removepath', ''),
				'rename_files'        => self::get('kickstart.setup.renamefiles', array(
					'.htaccess' => 'htaccess.bak', 'php.ini' => 'php.ini.bak', 'web.config' => 'web.config.bak',
					'.user.ini' => '.user.ini.bak'
				)),
				'skip_files'          => self::get('kickstart.setup.skipfiles', array(
					basename(__FILE__), 'kickstart.php', 'abiautomation.ini', 'htaccess.bak', 'php.ini.bak',
					'cacert.pem'
				)),
				'ignoredirectories'   => self::get('kickstart.setup.ignoredirectories', array(
					'tmp', 'log', 'logs'
				)),
			);

			if (!defined('KICKSTART'))
			{
				// In restore.php mode we have to exclude the restoration.php files
				$moreSkippedFiles     = array(
					// Akeeba Backup for Joomla!
					'administrator/components/com_akeeba/restoration.php',
					// Joomla! Update
					'administrator/components/com_joomlaupdate/restoration.php',
					// Akeeba Backup for WordPress
					'wp-content/plugins/akeebabackupwp/app/restoration.php',
					'wp-content/plugins/akeebabackupcorewp/app/restoration.php',
					'wp-content/plugins/akeebabackup/app/restoration.php',
					'wp-content/plugins/akeebabackupwpcore/app/restoration.php',
					// Akeeba Solo
					'app/restoration.php',
				);
				$config['skip_files'] = array_merge($config['skip_files'], $moreSkippedFiles);
			}

			if (!empty($configOverride))
			{
				$config = array_merge($config, $configOverride);
			}

			$object->setup($config);
		}

		return $object;
	}

	// ========================================================================
	// Public factory interface
	// ========================================================================

	public static function get($key, $default = null)
	{
		$self = self::getInstance();

		if (array_key_exists($key, $self->varlist))
		{
			return $self->varlist[$key];
		}
		else
		{
			return $default;
		}
	}

	/**
	 * Gets a single, internally used instance of the Factory
	 *
	 * @param string $serialized_data [optional] Serialized data to spawn the instance from
	 *
	 * @return AKFactory A reference to the unique Factory object instance
	 */
	protected static function &getInstance($serialized_data = null)
	{
		if (!is_object(self::$instance) || !is_null($serialized_data))
		{
			if (!is_null($serialized_data))
			{
				self::$instance = unserialize($serialized_data);
			}
			else
			{
				self::$instance = new self();
			}
		}

		return self::$instance;
	}

	/**
	 * Internal function which instanciates a class named $class_name.
	 * The autoloader
	 *
	 * @param string $class_name
	 *
	 * @return object
	 */
	protected static function &getClassInstance($class_name)
	{
		$self = self::getInstance();

		if (!isset($self->objectlist[$class_name]))
		{
			$self->objectlist[$class_name] = new $class_name;
		}

		return $self->objectlist[$class_name];
	}

	// ========================================================================
	// Public hash data storage interface
	// ========================================================================

	/**
	 * Regenerates the full Factory state from a serialized snapshot (resume)
	 *
	 * @param string $serialized_data The serialized snapshot to resume from
	 */
	public static function unserialize($serialized_data)
	{
		if (function_exists('base64_encode') && function_exists('base64_decode'))
		{
			$serialized_data = base64_decode($serialized_data);
		}
		self::getInstance($serialized_data);
	}

	/**
	 * Reset the internal factory state, freeing all previously created objects
	 */
	public static function nuke()
	{
		self::$instance = null;
	}

	// ========================================================================
	// Akeeba Kickstart classes
	// ========================================================================

	public static function set($key, $value)
	{
		$self                = self::getInstance();
		$self->varlist[$key] = $value;
	}

	/**
	 * Gets the post processing engine
	 *
	 * @param string $proc_engine
	 */
	public static function &getPostProc($proc_engine = null)
	{
		static $class_name;
		if (empty($class_name))
		{
			if (empty($proc_engine))
			{
				$proc_engine = self::get('kickstart.procengine', 'direct');
			}
			$class_name = 'AKPostproc' . ucfirst($proc_engine);
		}

		return self::getClassInstance($class_name);
	}

	/**
	 * Get the a reference to the Akeeba Engine's timer
	 *
	 * @return AKCoreTimer
	 */
	public static function &getTimer()
	{
		/** @noinspection PhpIncompatibleReturnTypeInspection */
		return self::getClassInstance('AKCoreTimer');
	}

}

/**
 * Interface for AES encryption adapters
 */
interface AKEncryptionAESAdapterInterface
{
	/**
	 * Decrypts a string. Returns the raw binary ciphertext, zero-padded.
	 *
	 * @param   string       $plainText  The plaintext to encrypt
	 * @param   string       $key        The raw binary key (will be zero-padded or chopped if its size is different than the block size)
	 *
	 * @return  string  The raw encrypted binary string.
	 */
	public function decrypt($plainText, $key);

	/**
	 * Returns the encryption block size in bytes
	 *
	 * @return  int
	 */
	public function getBlockSize();

	/**
	 * Is this adapter supported?
	 *
	 * @return  bool
	 */
	public function isSupported();
}

/**
 * Abstract AES encryption class
 */
abstract class AKEncryptionAESAdapterAbstract
{
	/**
	 * Trims or zero-pads a key / IV
	 *
	 * @param   string $key  The key or IV to treat
	 * @param   int    $size The block size of the currently used algorithm
	 *
	 * @return  null|string  Null if $key is null, treated string of $size byte length otherwise
	 */
	public function resizeKey($key, $size)
	{
		if (empty($key))
		{
			return null;
		}

		$keyLength = strlen($key);

		if (function_exists('mb_strlen'))
		{
			$keyLength = mb_strlen($key, 'ASCII');
		}

		if ($keyLength == $size)
		{
			return $key;
		}

		if ($keyLength > $size)
		{
			if (function_exists('mb_substr'))
			{
				return mb_substr($key, 0, $size, 'ASCII');
			}

			return substr($key, 0, $size);
		}

		return $key . str_repeat("\0", ($size - $keyLength));
	}

	/**
	 * Returns null bytes to append to the string so that it's zero padded to the specified block size
	 *
	 * @param   string $string    The binary string which will be zero padded
	 * @param   int    $blockSize The block size
	 *
	 * @return  string  The zero bytes to append to the string to zero pad it to $blockSize
	 */
	protected function getZeroPadding($string, $blockSize)
	{
		$stringSize = strlen($string);

		if (function_exists('mb_strlen'))
		{
			$stringSize = mb_strlen($string, 'ASCII');
		}

		if ($stringSize == $blockSize)
		{
			return '';
		}

		if ($stringSize < $blockSize)
		{
			return str_repeat("\0", $blockSize - $stringSize);
		}

		$paddingBytes = $stringSize % $blockSize;

		return str_repeat("\0", $blockSize - $paddingBytes);
	}
}

class Mcrypt extends AKEncryptionAESAdapterAbstract implements AKEncryptionAESAdapterInterface
{
	protected $cipherType = MCRYPT_RIJNDAEL_128;

	protected $cipherMode = MCRYPT_MODE_CBC;

	public function decrypt($cipherText, $key)
	{
		$iv_size    = $this->getBlockSize();
		$key        = $this->resizeKey($key, $iv_size);
		$iv         = substr($cipherText, 0, $iv_size);
		$cipherText = substr($cipherText, $iv_size);
		$plainText  = mcrypt_decrypt($this->cipherType, $key, $cipherText, $this->cipherMode, $iv);

		return $plainText;
	}

	public function isSupported()
	{
		if (!function_exists('mcrypt_get_key_size'))
		{
			return false;
		}

		if (!function_exists('mcrypt_get_iv_size'))
		{
			return false;
		}

		if (!function_exists('mcrypt_create_iv'))
		{
			return false;
		}

		if (!function_exists('mcrypt_encrypt'))
		{
			return false;
		}

		if (!function_exists('mcrypt_decrypt'))
		{
			return false;
		}

		if (!function_exists('mcrypt_list_algorithms'))
		{
			return false;
		}

		if (!function_exists('hash'))
		{
			return false;
		}

		if (!function_exists('hash_algos'))
		{
			return false;
		}

		$algorightms = mcrypt_list_algorithms();

		if (!in_array('rijndael-128', $algorightms))
		{
			return false;
		}

		if (!in_array('rijndael-192', $algorightms))
		{
			return false;
		}

		if (!in_array('rijndael-256', $algorightms))
		{
			return false;
		}

		$algorightms = hash_algos();

		if (!in_array('sha256', $algorightms))
		{
			return false;
		}

		return true;
	}

	public function getBlockSize()
	{
		return mcrypt_get_iv_size($this->cipherType, $this->cipherMode);
	}
}

class OpenSSL extends AKEncryptionAESAdapterAbstract implements AKEncryptionAESAdapterInterface
{
	/**
	 * The OpenSSL options for encryption / decryption
	 *
	 * @var  int
	 */
	protected $openSSLOptions = 0;

	/**
	 * The encryption method to use
	 *
	 * @var  string
	 */
	protected $method = 'aes-128-cbc';

	public function __construct()
	{
		$this->openSSLOptions = OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING;
	}

	public function decrypt($cipherText, $key)
	{
		$iv_size    = $this->getBlockSize();
		$key        = $this->resizeKey($key, $iv_size);
		$iv         = substr($cipherText, 0, $iv_size);
		$cipherText = substr($cipherText, $iv_size);
		$plainText  = openssl_decrypt($cipherText, $this->method, $key, $this->openSSLOptions, $iv);

		return $plainText;
	}

	public function isSupported()
	{
		if (!function_exists('openssl_get_cipher_methods'))
		{
			return false;
		}

		if (!function_exists('openssl_random_pseudo_bytes'))
		{
			return false;
		}

		if (!function_exists('openssl_cipher_iv_length'))
		{
			return false;
		}

		if (!function_exists('openssl_encrypt'))
		{
			return false;
		}

		if (!function_exists('openssl_decrypt'))
		{
			return false;
		}

		if (!function_exists('hash'))
		{
			return false;
		}

		if (!function_exists('hash_algos'))
		{
			return false;
		}

		$algorightms = openssl_get_cipher_methods();

		if (!in_array('aes-128-cbc', $algorightms))
		{
			return false;
		}

		$algorightms = hash_algos();

		if (!in_array('sha256', $algorightms))
		{
			return false;
		}

		return true;
	}

	/**
	 * @return int
	 */
	public function getBlockSize()
	{
		return openssl_cipher_iv_length($this->method);
	}
}

/**
 * AES implementation in PHP (c) Chris Veness 2005-2016.
 * Right to use and adapt is granted for under a simple creative commons attribution
 * licence. No warranty of any form is offered.
 *
 * Heavily modified for Akeeba Backup by Nicholas K. Dionysopoulos
 * Also added AES-128 CBC mode (with mcrypt and OpenSSL) on top of AES CTR
 */
class AKEncryptionAES
{
	// Sbox is pre-computed multiplicative inverse in GF(2^8) used in SubBytes and KeyExpansion [�5.1.1]
	protected static $Sbox =
		array(0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
			0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
			0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
			0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
			0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
			0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
			0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
			0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
			0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
			0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
			0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
			0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
			0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
			0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
			0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
			0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16);

	// Rcon is Round Constant used for the Key Expansion [1st col is 2^(r-1) in GF(2^8)] [�5.2]
	protected static $Rcon = array(
		array(0x00, 0x00, 0x00, 0x00),
		array(0x01, 0x00, 0x00, 0x00),
		array(0x02, 0x00, 0x00, 0x00),
		array(0x04, 0x00, 0x00, 0x00),
		array(0x08, 0x00, 0x00, 0x00),
		array(0x10, 0x00, 0x00, 0x00),
		array(0x20, 0x00, 0x00, 0x00),
		array(0x40, 0x00, 0x00, 0x00),
		array(0x80, 0x00, 0x00, 0x00),
		array(0x1b, 0x00, 0x00, 0x00),
		array(0x36, 0x00, 0x00, 0x00));

	protected static $passwords = array();

	/**
	 * The algorithm to use for PBKDF2. Must be a supported hash_hmac algorithm. Default: sha1
	 *
	 * @var  string
	 */
	private static $pbkdf2Algorithm = 'sha1';

	/**
	 * Number of iterations to use for PBKDF2
	 *
	 * @var  int
	 */
	private static $pbkdf2Iterations = 1000;

	/**
	 * Should we use a static salt for PBKDF2?
	 *
	 * @var  int
	 */
	private static $pbkdf2UseStaticSalt = 0;

	/**
	 * The static salt to use for PBKDF2
	 *
	 * @var  string
	 */
	private static $pbkdf2StaticSalt = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";

	/**
	 * Encrypt a text using AES encryption in Counter mode of operation
	 *  - see http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
	 *
	 * Unicode multi-byte character safe
	 *
	 * @param   string $plaintext Source text to be encrypted
	 * @param   string $password  The password to use to generate a key
	 * @param   int    $nBits     Number of bits to be used in the key (128, 192, or 256)
	 *
	 * @return  string  Encrypted text
	 */
	public static function AESEncryptCtr($plaintext, $password, $nBits)
	{
		$blockSize = 16;  // block size fixed at 16 bytes / 128 bits (Nb=4) for AES
		if (!($nBits == 128 || $nBits == 192 || $nBits == 256))
		{
			return '';
		}  // standard allows 128/192/256 bit keys
		// note PHP (5) gives us plaintext and password in UTF8 encoding!

		// use AES itself to encrypt password to get cipher key (using plain password as source for
		// key expansion) - gives us well encrypted key
		$nBytes  = $nBits / 8;  // no bytes in key
		$pwBytes = array();
		for ($i = 0; $i < $nBytes; $i++)
		{
			$pwBytes[$i] = ord(substr($password, $i, 1)) & 0xff;
		}
		$key = self::Cipher($pwBytes, self::KeyExpansion($pwBytes));
		$key = array_merge($key, array_slice($key, 0, $nBytes - 16));  // expand key to 16/24/32 bytes long

		// initialise counter block (NIST SP800-38A �B.2): millisecond time-stamp for nonce in
		// 1st 8 bytes, block counter in 2nd 8 bytes
		$counterBlock = array();
		$nonce        = floor(microtime(true) * 1000);   // timestamp: milliseconds since 1-Jan-1970
		$nonceSec     = floor($nonce / 1000);
		$nonceMs      = $nonce % 1000;
		// encode nonce with seconds in 1st 4 bytes, and (repeated) ms part filling 2nd 4 bytes
		for ($i = 0; $i < 4; $i++)
		{
			$counterBlock[$i] = self::urs($nonceSec, $i * 8) & 0xff;
		}
		for ($i = 0; $i < 4; $i++)
		{
			$counterBlock[$i + 4] = $nonceMs & 0xff;
		}
		// and convert it to a string to go on the front of the ciphertext
		$ctrTxt = '';
		for ($i = 0; $i < 8; $i++)
		{
			$ctrTxt .= chr($counterBlock[$i]);
		}

		// generate key schedule - an expansion of the key into distinct Key Rounds for each round
		$keySchedule = self::KeyExpansion($key);

		$blockCount = ceil(strlen($plaintext) / $blockSize);
		$ciphertxt  = array();  // ciphertext as array of strings

		for ($b = 0; $b < $blockCount; $b++)
		{
			// set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
			// done in two stages for 32-bit ops: using two words allows us to go past 2^32 blocks (68GB)
			for ($c = 0; $c < 4; $c++)
			{
				$counterBlock[15 - $c] = self::urs($b, $c * 8) & 0xff;
			}
			for ($c = 0; $c < 4; $c++)
			{
				$counterBlock[15 - $c - 4] = self::urs($b / 0x100000000, $c * 8);
			}

			$cipherCntr = self::Cipher($counterBlock, $keySchedule);  // -- encrypt counter block --

			// block size is reduced on final block
			$blockLength = $b < $blockCount - 1 ? $blockSize : (strlen($plaintext) - 1) % $blockSize + 1;
			$cipherByte  = array();

			for ($i = 0; $i < $blockLength; $i++)
			{  // -- xor plaintext with ciphered counter byte-by-byte --
				$cipherByte[$i] = $cipherCntr[$i] ^ ord(substr($plaintext, $b * $blockSize + $i, 1));
				$cipherByte[$i] = chr($cipherByte[$i]);
			}
			$ciphertxt[$b] = implode('', $cipherByte);  // escape troublesome characters in ciphertext
		}

		// implode is more efficient than repeated string concatenation
		$ciphertext = $ctrTxt . implode('', $ciphertxt);
		$ciphertext = base64_encode($ciphertext);

		return $ciphertext;
	}

	/**
	 * AES Cipher function: encrypt 'input' with Rijndael algorithm
	 *
	 * @param   array $input    Message as byte-array (16 bytes)
	 * @param   array $w        key schedule as 2D byte-array (Nr+1 x Nb bytes) -
	 *                          generated from the cipher key by KeyExpansion()
	 *
	 * @return  string  Ciphertext as byte-array (16 bytes)
	 */
	protected static function Cipher($input, $w)
	{    // main Cipher function [�5.1]
		$Nb = 4;                 // block size (in words): no of columns in state (fixed at 4 for AES)
		$Nr = count($w) / $Nb - 1; // no of rounds: 10/12/14 for 128/192/256-bit keys

		$state = array();  // initialise 4xNb byte-array 'state' with input [�3.4]
		for ($i = 0; $i < 4 * $Nb; $i++)
		{
			$state[$i % 4][floor($i / 4)] = $input[$i];
		}

		$state = self::AddRoundKey($state, $w, 0, $Nb);

		for ($round = 1; $round < $Nr; $round++)
		{  // apply Nr rounds
			$state = self::SubBytes($state, $Nb);
			$state = self::ShiftRows($state, $Nb);
			$state = self::MixColumns($state);
			$state = self::AddRoundKey($state, $w, $round, $Nb);
		}

		$state = self::SubBytes($state, $Nb);
		$state = self::ShiftRows($state, $Nb);
		$state = self::AddRoundKey($state, $w, $Nr, $Nb);

		$output = array(4 * $Nb);  // convert state to 1-d array before returning [�3.4]
		for ($i = 0; $i < 4 * $Nb; $i++)
		{
			$output[$i] = $state[$i % 4][floor($i / 4)];
		}

		return $output;
	}

	protected static function AddRoundKey($state, $w, $rnd, $Nb)
	{  // xor Round Key into state S [�5.1.4]
		for ($r = 0; $r < 4; $r++)
		{
			for ($c = 0; $c < $Nb; $c++)
			{
				$state[$r][$c] ^= $w[$rnd * 4 + $c][$r];
			}
		}

		return $state;
	}

	protected static function SubBytes($s, $Nb)
	{    // apply SBox to state S [�5.1.1]
		for ($r = 0; $r < 4; $r++)
		{
			for ($c = 0; $c < $Nb; $c++)
			{
				$s[$r][$c] = self::$Sbox[$s[$r][$c]];
			}
		}

		return $s;
	}

	protected static function ShiftRows($s, $Nb)
	{    // shift row r of state S left by r bytes [�5.1.2]
		$t = array(4);
		for ($r = 1; $r < 4; $r++)
		{
			for ($c = 0; $c < 4; $c++)
			{
				$t[$c] = $s[$r][($c + $r) % $Nb];
			}  // shift into temp copy
			for ($c = 0; $c < 4; $c++)
			{
				$s[$r][$c] = $t[$c];
			}         // and copy back
		}          // note that this will work for Nb=4,5,6, but not 7,8 (always 4 for AES):
		return $s;  // see fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.311.pdf
	}

	protected static function MixColumns($s)
	{
		// combine bytes of each col of state S [�5.1.3]
		for ($c = 0; $c < 4; $c++)
		{
			$a = array(4);  // 'a' is a copy of the current column from 's'
			$b = array(4);  // 'b' is a�{02} in GF(2^8)

			for ($i = 0; $i < 4; $i++)
			{
				$a[$i] = $s[$i][$c];
				$b[$i] = $s[$i][$c] & 0x80 ? $s[$i][$c] << 1 ^ 0x011b : $s[$i][$c] << 1;
			}

			// a[n] ^ b[n] is a�{03} in GF(2^8)
			$s[0][$c] = $b[0] ^ $a[1] ^ $b[1] ^ $a[2] ^ $a[3]; // 2*a0 + 3*a1 + a2 + a3
			$s[1][$c] = $a[0] ^ $b[1] ^ $a[2] ^ $b[2] ^ $a[3]; // a0 * 2*a1 + 3*a2 + a3
			$s[2][$c] = $a[0] ^ $a[1] ^ $b[2] ^ $a[3] ^ $b[3]; // a0 + a1 + 2*a2 + 3*a3
			$s[3][$c] = $a[0] ^ $b[0] ^ $a[1] ^ $a[2] ^ $b[3]; // 3*a0 + a1 + a2 + 2*a3
		}

		return $s;
	}

	/**
	 * Key expansion for Rijndael Cipher(): performs key expansion on cipher key
	 * to generate a key schedule
	 *
	 * @param   array $key Cipher key byte-array (16 bytes)
	 *
	 * @return  array  Key schedule as 2D byte-array (Nr+1 x Nb bytes)
	 */
	protected static function KeyExpansion($key)
	{
		// generate Key Schedule from Cipher Key [�5.2]

		// block size (in words): no of columns in state (fixed at 4 for AES)
		$Nb = 4;
		// key length (in words): 4/6/8 for 128/192/256-bit keys
		$Nk = (int) (count($key) / 4);
		// no of rounds: 10/12/14 for 128/192/256-bit keys
		$Nr = $Nk + 6;

		$w    = array();
		$temp = array();

		for ($i = 0; $i < $Nk; $i++)
		{
			$r     = array($key[4 * $i], $key[4 * $i + 1], $key[4 * $i + 2], $key[4 * $i + 3]);
			$w[$i] = $r;
		}

		for ($i = $Nk; $i < ($Nb * ($Nr + 1)); $i++)
		{
			$w[$i] = array();
			for ($t = 0; $t < 4; $t++)
			{
				$temp[$t] = $w[$i - 1][$t];
			}
			if ($i % $Nk == 0)
			{
				$temp = self::SubWord(self::RotWord($temp));
				for ($t = 0; $t < 4; $t++)
				{
					$rConIndex = (int) ($i / $Nk);
					$temp[$t] ^= self::$Rcon[$rConIndex][$t];
				}
			}
			else if ($Nk > 6 && $i % $Nk == 4)
			{
				$temp = self::SubWord($temp);
			}
			for ($t = 0; $t < 4; $t++)
			{
				$w[$i][$t] = $w[$i - $Nk][$t] ^ $temp[$t];
			}
		}

		return $w;
	}

	protected static function SubWord($w)
	{    // apply SBox to 4-byte word w
		for ($i = 0; $i < 4; $i++)
		{
			$w[$i] = self::$Sbox[$w[$i]];
		}

		return $w;
	}

	/*
	 * Unsigned right shift function, since PHP has neither >>> operator nor unsigned ints
	 *
	 * @param a  number to be shifted (32-bit integer)
	 * @param b  number of bits to shift a to the right (0..31)
	 * @return   a right-shifted and zero-filled by b bits
	 */

	protected static function RotWord($w)
	{    // rotate 4-byte word w left by one byte
		$tmp = $w[0];
		for ($i = 0; $i < 3; $i++)
		{
			$w[$i] = $w[$i + 1];
		}
		$w[3] = $tmp;

		return $w;
	}

	protected static function urs($a, $b)
	{
		$a &= 0xffffffff;
		$b &= 0x1f;  // (bounds check)
		if ($a & 0x80000000 && $b > 0)
		{   // if left-most bit set
			$a = ($a >> 1) & 0x7fffffff;   //   right-shift one bit & clear left-most bit
			$a = $a >> ($b - 1);           //   remaining right-shifts
		}
		else
		{                       // otherwise
			$a = ($a >> $b);               //   use normal right-shift
		}

		return $a;
	}

	/**
	 * Decrypt a text encrypted by AES in counter mode of operation
	 *
	 * @param   string  $ciphertext  Source text to be decrypted
	 * @param   string  $password    The password to use to generate a key
	 * @param   int     $nBits       Number of bits to be used in the key (128, 192, or 256)
	 *
	 * @return  string  Decrypted text
	 */
	public static function AESDecryptCtr($ciphertext, $password, $nBits)
	{
		$blockSize = 16;  // block size fixed at 16 bytes / 128 bits (Nb=4) for AES

		if (!($nBits == 128 || $nBits == 192 || $nBits == 256))
		{
			return '';
		}

		// standard allows 128/192/256 bit keys
		$ciphertext = base64_decode($ciphertext);

		// use AES to encrypt password (mirroring encrypt routine)
		$nBytes  = $nBits / 8;  // no bytes in key
		$pwBytes = array();

		for ($i = 0; $i < $nBytes; $i++)
		{
			$pwBytes[$i] = ord(substr($password, $i, 1)) & 0xff;
		}

		$key = self::Cipher($pwBytes, self::KeyExpansion($pwBytes));
		$key = array_merge($key, array_slice($key, 0, $nBytes - 16));  // expand key to 16/24/32 bytes long

		// recover nonce from 1st element of ciphertext
		$counterBlock = array();
		$ctrTxt       = substr($ciphertext, 0, 8);

		for ($i = 0; $i < 8; $i++)
		{
			$counterBlock[$i] = ord(substr($ctrTxt, $i, 1));
		}

		// generate key schedule
		$keySchedule = self::KeyExpansion($key);

		// separate ciphertext into blocks (skipping past initial 8 bytes)
		$nBlocks = ceil((strlen($ciphertext) - 8) / $blockSize);
		$ct      = array();

		for ($b = 0; $b < $nBlocks; $b++)
		{
			$ct[$b] = substr($ciphertext, 8 + $b * $blockSize, 16);
		}

		$ciphertext = $ct;  // ciphertext is now array of block-length strings

		// plaintext will get generated block-by-block into array of block-length strings
		$plaintxt = array();

		for ($b = 0; $b < $nBlocks; $b++)
		{
			// set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
			for ($c = 0; $c < 4; $c++)
			{
				$counterBlock[15 - $c] = self::urs($b, $c * 8) & 0xff;
			}

			for ($c = 0; $c < 4; $c++)
			{
				$counterBlock[15 - $c - 4] = self::urs(($b + 1) / 0x100000000 - 1, $c * 8) & 0xff;
			}

			$cipherCntr = self::Cipher($counterBlock, $keySchedule);  // encrypt counter block

			$plaintxtByte = array();

			for ($i = 0; $i < strlen($ciphertext[$b]); $i++)
			{
				// -- xor plaintext with ciphered counter byte-by-byte --
				$plaintxtByte[$i] = $cipherCntr[$i] ^ ord(substr($ciphertext[$b], $i, 1));
				$plaintxtByte[$i] = chr($plaintxtByte[$i]);

			}

			$plaintxt[$b] = implode('', $plaintxtByte);
		}

		// join array of blocks into single plaintext string
		$plaintext = implode('', $plaintxt);

		return $plaintext;
	}

	/**
	 * AES decryption in CBC mode. This is the standard mode (the CTR methods
	 * actually use Rijndael-128 in CTR mode, which - technically - isn't AES).
	 *
	 * It supports AES-128 only. It assumes that the last 4 bytes
	 * contain a little-endian unsigned long integer representing the unpadded
	 * data length.
	 *
	 * @since  3.0.1
	 * @author Nicholas K. Dionysopoulos
	 *
	 * @param   string $ciphertext The data to encrypt
	 * @param   string $password   Encryption password
	 *
	 * @return  string  The plaintext
	 */
	public static function AESDecryptCBC($ciphertext, $password)
	{
		$adapter = self::getAdapter();

		if (!$adapter->isSupported())
		{
			return false;
		}

		// Read the data size
		$data_size = unpack('V', substr($ciphertext, -4));

		// Do I have a PBKDF2 salt?
		$salt             = substr($ciphertext, -92, 68);
		$rightStringLimit = -4;

		$params        = self::getKeyDerivationParameters();
		$keySizeBytes  = $params['keySize'];
		$algorithm     = $params['algorithm'];
		$iterations    = $params['iterations'];
		$useStaticSalt = $params['useStaticSalt'];

		if (substr($salt, 0, 4) == 'JPST')
		{
			// We have a stored salt. Retrieve it and tell decrypt to process the string minus the last 44 bytes
			// (4 bytes for JPST, 16 bytes for the salt, 4 bytes for JPIV, 16 bytes for the IV, 4 bytes for the
			// uncompressed string length - note that using PBKDF2 means we're also using a randomized IV per the
			// format specification).
			$salt             = substr($salt, 4);
			$rightStringLimit -= 68;

			$key          = self::pbkdf2($password, $salt, $algorithm, $iterations, $keySizeBytes);
		}
		elseif ($useStaticSalt)
		{
			// We have a static salt. Use it for PBKDF2.
			$key = self::getStaticSaltExpandedKey($password);
		}
		else
		{
			// Get the expanded key from the password. THIS USES THE OLD, INSECURE METHOD.
			$key = self::expandKey($password);
		}

		// Try to get the IV from the data
		$iv               = substr($ciphertext, -24, 20);

		if (substr($iv, 0, 4) == 'JPIV')
		{
			// We have a stored IV. Retrieve it and tell mdecrypt to process the string minus the last 24 bytes
			// (4 bytes for JPIV, 16 bytes for the IV, 4 bytes for the uncompressed string length)
			$iv               = substr($iv, 4);
			$rightStringLimit -= 20;
		}
		else
		{
			// No stored IV. Do it the dumb way.
			$iv = self::createTheWrongIV($password);
		}

		// Decrypt
		$plaintext = $adapter->decrypt($iv . substr($ciphertext, 0, $rightStringLimit), $key);

		// Trim padding, if necessary
		if (strlen($plaintext) > $data_size)
		{
			$plaintext = substr($plaintext, 0, $data_size);
		}

		return $plaintext;
	}

	/**
	 * That's the old way of creating an IV that's definitely not cryptographically sound.
	 *
	 * DO NOT USE, EVER, UNLESS YOU WANT TO DECRYPT LEGACY DATA
	 *
	 * @param   string $password The raw password from which we create an IV in a super bozo way
	 *
	 * @return  string  A 16-byte IV string
	 */
	public static function createTheWrongIV($password)
	{
		static $ivs = array();

		$key = md5($password);

		if (!isset($ivs[$key]))
		{
			$nBytes  = 16;  // AES uses a 128 -bit (16 byte) block size, hence the IV size is always 16 bytes
			$pwBytes = array();
			for ($i = 0; $i < $nBytes; $i++)
			{
				$pwBytes[$i] = ord(substr($password, $i, 1)) & 0xff;
			}
			$iv    = self::Cipher($pwBytes, self::KeyExpansion($pwBytes));
			$newIV = '';
			foreach ($iv as $int)
			{
				$newIV .= chr($int);
			}

			$ivs[$key] = $newIV;
		}

		return $ivs[$key];
	}

	/**
	 * Expand the password to an appropriate 128-bit encryption key
	 *
	 * @param   string $password
	 *
	 * @return  string
	 *
	 * @since   5.2.0
	 * @author  Nicholas K. Dionysopoulos
	 */
	public static function expandKey($password)
	{
		// Try to fetch cached key or create it if it doesn't exist
		$nBits     = 128;
		$lookupKey = md5($password . '-' . $nBits);

		if (array_key_exists($lookupKey, self::$passwords))
		{
			$key = self::$passwords[$lookupKey];

			return $key;
		}

		// use AES itself to encrypt password to get cipher key (using plain password as source for
		// key expansion) - gives us well encrypted key.
		$nBytes  = $nBits / 8; // Number of bytes in key
		$pwBytes = array();

		for ($i = 0; $i < $nBytes; $i++)
		{
			$pwBytes[$i] = ord(substr($password, $i, 1)) & 0xff;
		}

		$key    = self::Cipher($pwBytes, self::KeyExpansion($pwBytes));
		$key    = array_merge($key, array_slice($key, 0, $nBytes - 16)); // expand key to 16/24/32 bytes long
		$newKey = '';

		foreach ($key as $int)
		{
			$newKey .= chr($int);
		}

		$key = $newKey;

		self::$passwords[$lookupKey] = $key;

		return $key;
	}

	/**
	 * Returns the correct AES-128 CBC encryption adapter
	 *
	 * @return  AKEncryptionAESAdapterInterface
	 *
	 * @since   5.2.0
	 * @author  Nicholas K. Dionysopoulos
	 */
	public static function getAdapter()
	{
		static $adapter = null;

		if (is_object($adapter) && ($adapter instanceof AKEncryptionAESAdapterInterface))
		{
			return $adapter;
		}

		$adapter = new OpenSSL();

		if (!$adapter->isSupported())
		{
			$adapter = new Mcrypt();
		}

		return $adapter;
	}

	/**
	 * @return string
	 */
	public static function getPbkdf2Algorithm()
	{
		return self::$pbkdf2Algorithm;
	}

	/**
	 * @param string $pbkdf2Algorithm
	 * @return void
	 */
	public static function setPbkdf2Algorithm($pbkdf2Algorithm)
	{
		self::$pbkdf2Algorithm = $pbkdf2Algorithm;
	}

	/**
	 * @return int
	 */
	public static function getPbkdf2Iterations()
	{
		return self::$pbkdf2Iterations;
	}

	/**
	 * @param int $pbkdf2Iterations
	 * @return void
	 */
	public static function setPbkdf2Iterations($pbkdf2Iterations)
	{
		self::$pbkdf2Iterations = $pbkdf2Iterations;
	}

	/**
	 * @return int
	 */
	public static function getPbkdf2UseStaticSalt()
	{
		return self::$pbkdf2UseStaticSalt;
	}

	/**
	 * @param int $pbkdf2UseStaticSalt
	 * @return void
	 */
	public static function setPbkdf2UseStaticSalt($pbkdf2UseStaticSalt)
	{
		self::$pbkdf2UseStaticSalt = $pbkdf2UseStaticSalt;
	}

	/**
	 * @return string
	 */
	public static function getPbkdf2StaticSalt()
	{
		return self::$pbkdf2StaticSalt;
	}

	/**
	 * @param string $pbkdf2StaticSalt
	 * @return void
	 */
	public static function setPbkdf2StaticSalt($pbkdf2StaticSalt)
	{
		self::$pbkdf2StaticSalt = $pbkdf2StaticSalt;
	}

	/**
	 * Get the parameters fed into PBKDF2 to expand the user password into an encryption key. These are the static
	 * parameters (key size, hashing algorithm and number of iterations). A new salt is used for each encryption block
	 * to minimize the risk of attacks against the password.
	 *
	 * @return  array
	 */
	public static function getKeyDerivationParameters()
	{
		return array(
			'keySize'       => 16,
			'algorithm'     => self::$pbkdf2Algorithm,
			'iterations'    => self::$pbkdf2Iterations,
			'useStaticSalt' => self::$pbkdf2UseStaticSalt,
			'staticSalt'    => self::$pbkdf2StaticSalt,
		);
	}

	/**
	 * PBKDF2 key derivation function as defined by RSA's PKCS #5: https://www.ietf.org/rfc/rfc2898.txt
	 *
	 * Test vectors can be found here: https://www.ietf.org/rfc/rfc6070.txt
	 *
	 * This implementation of PBKDF2 was originally created by https://defuse.ca
	 * With improvements by http://www.variations-of-shadow.com
	 * Modified for Akeeba Engine by Akeeba Ltd (removed unnecessary checks to make it faster)
	 *
	 * @param   string  $password    The password.
	 * @param   string  $salt        A salt that is unique to the password.
	 * @param   string  $algorithm   The hash algorithm to use. Default is sha1.
	 * @param   int     $count       Iteration count. Higher is better, but slower. Default: 1000.
	 * @param   int     $key_length  The length of the derived key in bytes.
	 *
	 * @return  string  A string of $key_length bytes
	 */
	public static function pbkdf2($password, $salt, $algorithm = 'sha1', $count = 1000, $key_length = 16)
	{
		if (function_exists("hash_pbkdf2"))
		{
			return hash_pbkdf2($algorithm, $password, $salt, $count, $key_length, true);
		}

		$hash_length = akstringlen(hash($algorithm, "", true));
		$block_count = ceil($key_length / $hash_length);

		$output = "";

		for ($i = 1; $i <= $block_count; $i++)
		{
			// $i encoded as 4 bytes, big endian.
			$last = $salt . pack("N", $i);

			// First iteration
			$xorResult = hash_hmac($algorithm, $last, $password, true);
			$last      = $xorResult;

			// Perform the other $count - 1 iterations
			for ($j = 1; $j < $count; $j++)
			{
				$last = hash_hmac($algorithm, $last, $password, true);
				$xorResult ^= $last;
			}

			$output .= $xorResult;
		}

		return aksubstr($output, 0, $key_length);
	}

	/**
	 * Get the expanded key from the user supplied password using a static salt. The results are cached for performance
	 * reasons.
	 *
	 * @param   string  $password  The user-supplied password, UTF-8 encoded.
	 *
	 * @return  string  The expanded key
	 */
	private static function getStaticSaltExpandedKey($password)
	{
		$params        = self::getKeyDerivationParameters();
		$keySizeBytes  = $params['keySize'];
		$algorithm     = $params['algorithm'];
		$iterations    = $params['iterations'];
		$staticSalt    = $params['staticSalt'];

		$lookupKey = "PBKDF2-$algorithm-$iterations-" . md5($password . $staticSalt);

		if (!array_key_exists($lookupKey, self::$passwords))
		{
			self::$passwords[$lookupKey] = self::pbkdf2($password, $staticSalt, $algorithm, $iterations, $keySizeBytes);
		}

		return self::$passwords[$lookupKey];
	}

}

/**
 * The Master Setup will read the configuration parameters from restoration.php or
 * the JSON-encoded "configuration" input variable and return the status.
 *
 * @return bool True if the master configuration was applied to the Factory object
 */
function masterSetup()
{
	// ------------------------------------------------------------
	// 1. Import basic setup parameters
	// ------------------------------------------------------------

	$ini_data = null;

	// Require restoration.php or fail
	$setupFile = 'restoration.php';

	if (!file_exists($setupFile))
	{
		AKFactory::set('kickstart.enabled', false);

		return false;
	}

	// Load restoration.php. It creates a global variable named $restoration_setup
	require_once $setupFile;

	/** @var array $restoration_setup This is defined in the restoration.php file */
	$ini_data = $restoration_setup;

	if (empty($ini_data))
	{
		// No parameters fetched. Darn, how am I supposed to work like that?!
		AKFactory::set('kickstart.enabled', false);

		return false;
	}

	AKFactory::set('kickstart.enabled', true);

	// Import any data from the $restoration_setup array read from restoration.php
	if (!empty($ini_data))
	{
		foreach ($ini_data as $key => $value)
		{
			AKFactory::set($key, $value);
		}
		AKFactory::set('kickstart.enabled', true);
	}

	// Reinitialize $ini_data
	$ini_data = null;

	// ------------------------------------------------------------
	// 2. Explode JSON parameters into $_REQUEST scope
	// ------------------------------------------------------------

	// Detect a JSON string in the request variable and store it.
	$json = getQueryParam('json', null);

	// Remove everything from the request, post and get arrays
	if (!empty($_REQUEST))
	{
		foreach ($_REQUEST as $key => $value)
		{
			unset($_REQUEST[$key]);
		}
	}

	if (!empty($_POST))
	{
		foreach ($_POST as $key => $value)
		{
			unset($_POST[$key]);
		}
	}

	if (!empty($_GET))
	{
		foreach ($_GET as $key => $value)
		{
			unset($_GET[$key]);
		}
	}

	// Decrypt a possibly encrypted JSON string
	$password = AKFactory::get('kickstart.security.password', null);

	if (!empty($json))
	{
		if (!empty($password))
		{
			$json = AKEncryptionAES::AESDecryptCtr($json, $password, 128);

			if (empty($json))
			{
				die('###{"status":false,"message":"Invalid login"}###');
			}
		}

		// Get the raw data
		$raw = json_decode($json, true);

		if (!empty($password) && (empty($raw)))
		{
			die('###{"status":false,"message":"Invalid login"}###');
		}

		// Pass all JSON data to the request array
		if (!empty($raw))
		{
			foreach ($raw as $key => $value)
			{
				$_REQUEST[$key] = $value;
			}
		}
	}
	elseif (!empty($password))
	{
		die('###{"status":false,"message":"Invalid login"}###');
	}

	// ------------------------------------------------------------
	// 3. Try the "factory" variable
	// ------------------------------------------------------------
	// A "factory" variable will override all other settings.
	$serialized = getQueryParam('factory', null);

	if (!is_null($serialized))
	{
		// Get the serialized factory
		AKFactory::unserialize($serialized);
		AKFactory::set('kickstart.enabled', true);

		return true;
	}

	return AKFactory::get('kickstart.enabled', false);
}

// Mini-controller for restore.php
if (!defined('KICKSTART'))
{
	// The observer class, used to report number of files and bytes processed
	class RestorationObserver extends AKAbstractPartObserver
	{
		public $compressedTotal = 0;
		public $uncompressedTotal = 0;
		public $filesProcessed = 0;

		public function update($object, $message)
		{
			if (!is_object($message))
			{
				return;
			}

			if (!array_key_exists('type', get_object_vars($message)))
			{
				return;
			}

			if ($message->type == 'startfile')
			{
				$this->filesProcessed++;
				$this->compressedTotal += $message->content->compressed;
				$this->uncompressedTotal += $message->content->uncompressed;
			}
		}

		public function __toString()
		{
			return __CLASS__;
		}

	}

	// Import configuration
	masterSetup();

	$retArray = array(
		'status'  => true,
		'message' => null
	);

	$enabled = AKFactory::get('kickstart.enabled', false);

	if ($enabled)
	{
		$task = getQueryParam('task');

		switch ($task)
		{
			case 'ping':
				// ping task - really does nothing!
				$timer = AKFactory::getTimer();
				$timer->enforce_min_exec_time();
				break;

			/**
			 * There are two separate steps here since we were using an inefficient restoration intialization method in
			 * the past. Now both startRestore and stepRestore are identical. The difference in behavior depends
			 * exclusively on the calling Javascript. If no serialized factory was passed in the request then we start a
			 * new restoration. If a serialized factory was passed in the request then the restoration is resumed. For
			 * this reason we should NEVER call AKFactory::nuke() in startRestore anymore: that would simply reset the
			 * extraction engine configuration which was done in masterSetup() leading to an error about the file being
			 * invalid (since no file is found).
			 */
			case 'startRestore':
			case 'stepRestore':
				$engine   = AKFactory::getUnarchiver(); // Get the engine
				$observer = new RestorationObserver(); // Create a new observer
				$engine->attach($observer); // Attach the observer
				$engine->tick();
				$ret = $engine->getStatusArray();

				if ($ret['Error'] != '')
				{
					$retArray['status']  = false;
					$retArray['done']    = true;
					$retArray['message'] = $ret['Error'];
				}
				elseif (!$ret['HasRun'])
				{
					$retArray['files']    = $observer->filesProcessed;
					$retArray['bytesIn']  = $observer->compressedTotal;
					$retArray['bytesOut'] = $observer->uncompressedTotal;
					$retArray['status']   = true;
					$retArray['done']     = true;
				}
				else
				{
					$retArray['files']    = $observer->filesProcessed;
					$retArray['bytesIn']  = $observer->compressedTotal;
					$retArray['bytesOut'] = $observer->uncompressedTotal;
					$retArray['status']   = true;
					$retArray['done']     = false;
					$retArray['factory']  = AKFactory::serialize();
				}
				break;

			case 'finalizeRestore':
				$root = AKFactory::get('kickstart.setup.destdir');
				// Remove the installation directory
				recursive_remove_directory($root . '/installation');

				$postproc = AKFactory::getPostProc();

				/**
				 * Should I rename the htaccess.bak and web.config.bak files back to their live filenames...?
				 */
				$renameFiles = AKFactory::get('kickstart.setup.postrenamefiles', true);

				if ($renameFiles)
				{
					// Rename htaccess.bak to .htaccess
					if (file_exists($root . '/htaccess.bak'))
					{
						if (file_exists($root . '/.htaccess'))
						{
							$postproc->unlink($root . '/.htaccess');
						}
						$postproc->rename($root . '/htaccess.bak', $root . '/.htaccess');
					}

					// Rename htaccess.bak to .htaccess
					if (file_exists($root . '/web.config.bak'))
					{
						if (file_exists($root . '/web.config'))
						{
							$postproc->unlink($root . '/web.config');
						}
						$postproc->rename($root . '/web.config.bak', $root . '/web.config');
					}
				}

				// Remove restoration.php
				$basepath = KSROOTDIR;
				$basepath = rtrim(str_replace('\\', '/', $basepath), '/');
				if (!empty($basepath))
				{
					$basepath .= '/';
				}
				$postproc->unlink($basepath . 'restoration.php');

				// Import a custom finalisation file
				$filename = dirname(__FILE__) . '/restore_finalisation.php';
				if (file_exists($filename))
				{
					// We cannot use the Filesystem API here.
					if (ini_get('opcache.enable')
						&& function_exists('opcache_invalidate')
						&& (!ini_get('opcache.restrict_api') || stripos(realpath($_SERVER['SCRIPT_FILENAME']), ini_get('opcache.restrict_api')) === 0)
					)
					{
						\opcache_invalidate($filename, true);
					}
					if (function_exists('apc_compile_file'))
					{
						\apc_compile_file($filename);
					}
					if (function_exists('wincache_refresh_if_changed'))
					{
						\wincache_refresh_if_changed(array($filename));
					}
					if (function_exists('xcache_asm'))
					{
						xcache_asm($filename);
					}
					include_once $filename;
				}

				// Run a custom finalisation script
				if (function_exists('finalizeRestore'))
				{
					finalizeRestore($root, $basepath);
				}
				break;

			default:
				// Invalid task!
				$enabled = false;
				break;
		}
	}

	// Maybe we weren't authorized or the task was invalid?
	if (!$enabled)
	{
		// Maybe the user failed to enter any information
		$retArray['status']  = false;
		$retArray['message'] = AKText::_('ERR_INVALID_LOGIN');
	}

	// JSON encode the message
	$json = json_encode($retArray);
	// Do I have to encrypt?
	$password = AKFactory::get('kickstart.security.password', null);
	if (!empty($password))
	{
		$json = AKEncryptionAES::AESEncryptCtr($json, $password, 128);
	}

	// Return the message
	echo "###$json###";

}

// ------------ lixlpixel recursive PHP functions -------------
// recursive_remove_directory( directory to delete, empty )
// expects path to directory and optional TRUE / FALSE to empty
// of course PHP has to have the rights to delete the directory
// you specify and all files and folders inside the directory
// ------------------------------------------------------------
function recursive_remove_directory($directory)
{
	// if the path has a slash at the end we remove it here
	if (substr($directory, -1) == '/')
	{
		$directory = substr($directory, 0, -1);
	}
	// if the path is not valid or is not a directory ...
	if (!file_exists($directory) || !is_dir($directory))
	{
		// ... we return false and exit the function
		return false;
		// ... if the path is not readable
	}
	elseif (!is_readable($directory))
	{
		// ... we return false and exit the function
		return false;
		// ... else if the path is readable
	}
	else
	{
		// we open the directory
		$handle   = opendir($directory);
		$postproc = AKFactory::getPostProc();
		// and scan through the items inside
		while (false !== ($item = readdir($handle)))
		{
			// if the filepointer is not the current directory
			// or the parent directory
			if ($item != '.' && $item != '..')
			{
				// we build the new path to delete
				$path = $directory . '/' . $item;
				// if the new path is a directory
				if (is_dir($path))
				{
					// we call this function with the new path
					recursive_remove_directory($path);
					// if the new path is a file
				}
				else
				{
					// we remove the file
					$postproc->unlink($path);
				}
			}
		}
		// close the directory
		closedir($handle);
		// try to delete the now empty directory
		if (!$postproc->rmdir($directory))
		{
			// return false if not possible
			return false;
		}

		// return success
		return true;
	}
}
components/com_joomlaupdate/views/update/view.html.php000060400000001565152453623450017334 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Joomla! Update's Update View
 *
 * @since  2.5.4
 */
class JoomlaupdateViewUpdate extends JViewLegacy
{
	/**
	 * Renders the view.
	 *
	 * @param   string  $tpl  Template name.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		JFactory::getApplication()->input->set('hidemainmenu', true);

		// Set the toolbar information.
		JToolbarHelper::title(JText::_('COM_JOOMLAUPDATE_OVERVIEW'), 'loop install');

		// Import com_login's model
		JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_login/models', 'LoginModel');

		// Render the view.
		parent::display($tpl);
	}
}
components/com_joomlaupdate/views/update/tmpl/finaliseconfirm.php000060400000007177152453623450021550 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.keepalive');
JHtml::_('bootstrap.tooltip');

$twofactormethods = JAuthenticationHelper::getTwoFactorMethods();

?>

<div class="alert alert-warning">
	<h4 class="alert-heading">
		<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_UPDATE_FINALISE_HEAD'); ?>
	</h4>
	<p>
		<?php echo JText::sprintf('COM_JOOMLAUPDATE_VIEW_UPDATE_FINALISE_HEAD_DESC', JFactory::getConfig()->get('sitename')); ?>
	</p>
</div>

<hr/>

<form action="<?php echo JRoute::_('index.php', true); ?>" method="post" id="form-login" class="form-inline center">
	<fieldset class="loginform">
		<div class="control-group">
			<div class="controls">
				<div class="input-prepend input-append">
					<span class="add-on">
						<span class="icon-user hasTooltip" title="<?php echo JText::_('JGLOBAL_USERNAME'); ?>" aria-hidden="true"></span>
						<label for="mod-login-username" class="element-invisible">
							<?php echo JText::_('JGLOBAL_USERNAME'); ?>
						</label>
					</span>
					<input name="username" tabindex="1" id="mod-login-username" type="text" class="input-medium" placeholder="<?php echo JText::_('JGLOBAL_USERNAME'); ?>" size="15" autofocus="true" />
				</div>
			</div>
		</div>
		<div class="control-group">
			<div class="controls">
				<div class="input-prepend input-append">
					<span class="add-on">
						<span class="icon-lock hasTooltip" title="<?php echo JText::_('JGLOBAL_PASSWORD'); ?>" aria-hidden="true"></span>
						<label for="mod-login-password" class="element-invisible">
							<?php echo JText::_('JGLOBAL_PASSWORD'); ?>
						</label>
					</span>
					<input name="passwd" tabindex="2" id="mod-login-password" type="password" class="input-medium" placeholder="<?php echo JText::_('JGLOBAL_PASSWORD'); ?>" size="15"/>
				</div>
			</div>
		</div>
		<?php if (count($twofactormethods) > 1) : ?>
			<div class="control-group">
				<div class="controls">
					<div class="input-prepend input-append">
						<span class="add-on">
							<span class="icon-star hasTooltip" title="<?php echo JText::_('JGLOBAL_SECRETKEY'); ?>" aria-hidden="true"></span>
							<label for="mod-login-secretkey" class="element-invisible">
								<?php echo JText::_('JGLOBAL_SECRETKEY'); ?>
							</label>
						</span>
						<input name="secretkey" autocomplete="one-time-code" tabindex="3" id="mod-login-secretkey" type="text" class="input-medium" placeholder="<?php echo JText::_('JGLOBAL_SECRETKEY'); ?>" size="15"/>
						<span class="btn width-auto hasTooltip" title="<?php echo JText::_('JGLOBAL_SECRETKEY_HELP'); ?>">
							<span class="icon-help" aria-hidden="true"></span>
						</span>
					</div>
				</div>
			</div>
		<?php endif; ?>
		<div class="control-group">
			<div class="controls">
				<div class="btn-group">
					<a tabindex="4" class="btn btn-danger btn-small" href="index.php?option=com_joomlaupdate">
						<span class="icon-cancel icon-white" aria-hidden="true"></span> <?php echo JText::_('JCANCEL'); ?>
					</a>
				</div>
				<div class="btn-group">
					<button tabindex="5" class="btn btn-primary btn-large">
						<span class="icon-play icon-white" aria-hidden="true"></span> <?php echo JText::_('COM_JOOMLAUPDATE_VIEW_UPDATE_FINALISE_CONFIRM_AND_CONTINUE'); ?>
					</button>
				</div>
			</div>
		</div>

		<input type="hidden" name="option" value="com_joomlaupdate"/>
		<input type="hidden" name="task" value="update.finaliseconfirm" />
		<?php echo JHtml::_('form.token'); ?>
	</fieldset>
</form>
components/com_joomlaupdate/views/update/tmpl/default.php000060400000004533152453623450020015 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include jQuery.
JHtml::_('jquery.framework');

// Load the scripts
JHtml::_('script', 'com_joomlaupdate/json2.js', array('version' => 'auto', 'relative' => true));
JHtml::_('script', 'com_joomlaupdate/encryption.js', array('version' => 'auto', 'relative' => true));
JHtml::_('script', 'com_joomlaupdate/update.js', array('version' => 'auto', 'relative' => true));

$password = JFactory::getApplication()->getUserState('com_joomlaupdate.password', null);
$filesize = JFactory::getApplication()->getUserState('com_joomlaupdate.filesize', null);
$ajaxUrl = JUri::base() . 'components/com_joomlaupdate/restore.php';
$returnUrl = 'index.php?option=com_joomlaupdate&task=update.finalise&' . JFactory::getSession()->getFormToken() . '=1';

JFactory::getDocument()->addScriptDeclaration(
	"
	var joomlaupdate_password = '$password';
	var joomlaupdate_totalsize = '$filesize';
	var joomlaupdate_ajax_url = '$ajaxUrl';
	var joomlaupdate_return_url = '$returnUrl';

	jQuery(document).ready(function(){
		window.pingExtract();
		});
	"
);
?>

<p class="nowarning"><?php echo JText::_('COM_JOOMLAUPDATE_VIEW_UPDATE_INPROGRESS'); ?></p>

<div id="update-progress">
	<div id="extprogress">
		<div id="progress" class="progress progress-striped active">
			<div id="progress-bar" class="bar bar-success" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div>
		</div>
		<div class="extprogrow">
			<span class="extlabel"><?php echo JText::_('COM_JOOMLAUPDATE_VIEW_UPDATE_PERCENT'); ?></span>
			<span class="extvalue" id="extpercent"></span>
		</div>
		<div class="extprogrow">
			<span class="extlabel"><?php echo JText::_('COM_JOOMLAUPDATE_VIEW_UPDATE_BYTESREAD'); ?></span>
			<span class="extvalue" id="extbytesin"></span>
		</div>
		<div class="extprogrow">
			<span class="extlabel"><?php echo JText::_('COM_JOOMLAUPDATE_VIEW_UPDATE_BYTESEXTRACTED'); ?></span>
			<span class="extvalue" id="extbytesout"></span>
		</div>
		<div class="extprogrow">
			<span class="extlabel"><?php echo JText::_('COM_JOOMLAUPDATE_VIEW_UPDATE_FILESEXTRACTED'); ?></span>
			<span class="extvalue" id="extfiles"></span>
		</div>
	</div>
</div>
components/com_joomlaupdate/views/upload/tmpl/captive.php000060400000007110152453623450020020 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.keepalive');
JHtml::_('bootstrap.tooltip');

$twofactormethods = JAuthenticationHelper::getTwoFactorMethods();

?>
<div class="alert alert-warning">
	<h4 class="alert-heading">
		<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_UPLOAD_CAPTIVE_INTRO_HEAD'); ?>
	</h4>
	<p>
		<?php echo JText::sprintf('COM_JOOMLAUPDATE_VIEW_UPLOAD_CAPTIVE_INTRO_BODY', JFactory::getConfig()->get('sitename')); ?>
	</p>
</div>

<hr/>

<form action="<?php echo JRoute::_('index.php', true); ?>" method="post" id="form-login" class="form-inline center">
	<fieldset class="loginform">
		<div class="control-group">
			<div class="controls">
				<div class="input-prepend input-append">
					<span class="add-on">
						<span class="icon-user hasTooltip" title="<?php echo JText::_('JGLOBAL_USERNAME'); ?>" aria-hidden="true"></span>
						<label for="mod-login-username" class="element-invisible">
							<?php echo JText::_('JGLOBAL_USERNAME'); ?>
						</label>
					</span>
					<input name="username" tabindex="1" id="mod-login-username" type="text" class="input-medium" placeholder="<?php echo JText::_('JGLOBAL_USERNAME'); ?>" size="15" autofocus="true" />
				</div>
			</div>
		</div>
		<div class="control-group">
			<div class="controls">
				<div class="input-prepend input-append">
					<span class="add-on">
						<span class="icon-lock hasTooltip" title="<?php echo JText::_('JGLOBAL_PASSWORD'); ?>" aria-hidden="true"></span>
						<label for="mod-login-password" class="element-invisible">
							<?php echo JText::_('JGLOBAL_PASSWORD'); ?>
						</label>
					</span>
					<input name="passwd" tabindex="2" id="mod-login-password" type="password" class="input-medium" placeholder="<?php echo JText::_('JGLOBAL_PASSWORD'); ?>" size="15"/>
				</div>
			</div>
		</div>
		<?php if (count($twofactormethods) > 1) : ?>
			<div class="control-group">
				<div class="controls">
					<div class="input-prepend input-append">
						<span class="add-on">
							<span class="icon-star hasTooltip" title="<?php echo JText::_('JGLOBAL_SECRETKEY'); ?>" aria-hidden="true"></span>
							<label for="mod-login-secretkey" class="element-invisible">
								<?php echo JText::_('JGLOBAL_SECRETKEY'); ?>
							</label>
						</span>
						<input name="secretkey" autocomplete="one-time-code" tabindex="3" id="mod-login-secretkey" type="text" class="input-medium" placeholder="<?php echo JText::_('JGLOBAL_SECRETKEY'); ?>" size="15"/>
						<span class="btn width-auto hasTooltip" title="<?php echo JText::_('JGLOBAL_SECRETKEY_HELP'); ?>">
							<span class="icon-help" aria-hidden="true"></span>
						</span>
					</div>
				</div>
			</div>
		<?php endif; ?>
		<div class="control-group">
			<div class="controls">
				<div class="btn-group">
					<a tabindex="4" class="btn btn-danger" href="index.php?option=com_joomlaupdate">
						<span class="icon-cancel icon-white" aria-hidden="true"></span> <?php echo JText::_('JCANCEL'); ?>
					</a>
				</div>
				<div class="btn-group">
					<button tabindex="5" class="btn btn-primary">
						<span class="icon-play icon-white" aria-hidden="true"></span> <?php echo JText::_('COM_INSTALLER_INSTALL_BUTTON'); ?>
					</button>
				</div>
			</div>
		</div>

		<input type="hidden" name="option" value="com_joomlaupdate"/>
		<input type="hidden" name="task" value="update.confirm"/>
		<?php echo JHtml::_('form.token'); ?>
	</fieldset>
</form>
components/com_joomlaupdate/views/upload/view.html.php000060400000002201152453623450017322 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Joomla! Update's Update View
 *
 * @since  3.6.0
 */
class JoomlaupdateViewUpload extends JViewLegacy
{
	/**
	 * Renders the view.
	 *
	 * @param   string  $tpl  Template name.
	 *
	 * @return  void
	 *
	 * @since   3.6.0
	 */
	public function display($tpl = null)
	{
		// Set the toolbar information.
		JToolbarHelper::title(JText::_('COM_JOOMLAUPDATE_OVERVIEW'), 'loop install');
		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_COMPONENTS_JOOMLA_UPDATE');

		// Load com_installer's language
		$language = JFactory::getLanguage();
		$language->load('com_installer', JPATH_ADMINISTRATOR, 'en-GB', false, true);
		$language->load('com_installer', JPATH_ADMINISTRATOR, null, true);

		// Import com_login's model
		JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_login/models', 'LoginModel');

		// Render the view.
		parent::display($tpl);
	}
}
components/com_joomlaupdate/views/default/view.html.php000060400000017227152453623450017500 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Joomla! Update's Default View
 *
 * @since  2.5.4
 */
class JoomlaupdateViewDefault extends JViewLegacy
{
	/**
	 * An array with the Joomla! update information.
	 *
	 * @var    array
	 *
	 * @since  3.6.0
	 */
	protected $updateInfo = null;

	/**
	 * The form field for the extraction select
	 *
	 * @var    string
	 *
	 * @since  3.6.0
	 */
	protected $methodSelect = null;

	/**
	 * The form field for the upload select
	 *
	 * @var   string
	 *
	 * @since  3.6.0
	 */
	protected $methodSelectUpload = null;

	/**
	 * PHP options.
	 *
	 * @var   array  Array of PHP config options
	 *
	 * @since 3.10.0
	 */
	protected $phpOptions = null;

	/**
	 * PHP settings.
	 *
	 * @var   array  Array of PHP settings
	 *
	 * @since 3.10.0
	 */
	protected $phpSettings = null;

	/**
	 * Non Core Extensions.
	 *
	 * @var   array  Array of Non-Core-Extensions
	 *
	 * @since 3.10.0
	 */
	protected $nonCoreExtensions = null;

	/**
	 * Renders the view
	 *
	 * @param   string  $tpl  Template name
	 *
	 * @return void
	 *
	 * @since  2.5.4
	 */
	public function display($tpl = null)
	{
		// Get data from the model.
		$this->state = $this->get('State');

		// Load useful classes.
		/** @var JoomlaupdateModelDefault $model */
		$model = $this->getModel();
		$this->loadHelper('select');

		// Assign view variables.
		$this->ftp     = $model->getFTPOptions();
		$defaultMethod = $this->ftp['enabled'] ? 'hybrid' : 'direct';

		$this->updateInfo         = $model->getUpdateInformation();
		$this->methodSelect       = JoomlaupdateHelperSelect::getMethods($defaultMethod);
		$this->methodSelectUpload = JoomlaupdateHelperSelect::getMethods($defaultMethod, 'method', 'upload_method');

		// Get results of pre update check evaluations
		$this->phpOptions             = $model->getPhpOptions();
		$this->phpSettings            = $model->getPhpSettings();
		$this->nonCoreExtensions      = $model->getNonCoreExtensions();
		$this->isBackendTemplateIsis  = (bool) $model->isTemplateActive('isis');

		// Disable the critical plugins check for non-major updates.
		$this->nonCoreCriticalPlugins = array();

		if (version_compare($this->updateInfo['latest'], '4', '>='))
		{
			$this->nonCoreCriticalPlugins = $model->getNonCorePlugins(array('system','user','authentication','actionlog','twofactorauth'));
		}

		// Set the toolbar information.
		JToolbarHelper::title(JText::_('COM_JOOMLAUPDATE_OVERVIEW'), 'loop install');
		JToolbarHelper::custom('update.purge', 'loop', 'loop', 'COM_JOOMLAUPDATE_TOOLBAR_CHECK', false);

		// Add toolbar buttons.
		if (JFactory::getUser()->authorise('core.admin'))
		{
			JToolbarHelper::preferences('com_joomlaupdate');
		}

		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_COMPONENTS_JOOMLA_UPDATE');

		if (!is_null($this->updateInfo['object']))
		{
			// Show the message if an update is found.
			JFactory::getApplication()->enqueueMessage(JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_UPDATE_NOTICE'), 'warning');
		}

		$this->ftpFieldsDisplay = $this->ftp['enabled'] ? '' : 'style = "display: none"';
		$params                 = JComponentHelper::getParams('com_joomlaupdate');

		switch ($params->get('updatesource', 'default'))
		{
			// "Minor & Patch Release for Current version AND Next Major Release".
			case 'next':
				$this->langKey         = 'COM_JOOMLAUPDATE_VIEW_DEFAULT_UPDATES_INFO_NEXT';
				$this->updateSourceKey = JText::_('COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_NEXT');
				break;

			// "Testing"
			case 'testing':
				$this->langKey         = 'COM_JOOMLAUPDATE_VIEW_DEFAULT_UPDATES_INFO_TESTING';
				$this->updateSourceKey = JText::_('COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_TESTING');
				break;

			// "Custom"
			case 'custom':
				$this->langKey         = 'COM_JOOMLAUPDATE_VIEW_DEFAULT_UPDATES_INFO_CUSTOM';
				$this->updateSourceKey = JText::_('COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_CUSTOM');
				break;

			/**
			 * "Minor & Patch Release for Current version (recommended and default)".
			 * The commented "case" below are for documenting where 'default' and legacy options falls
			 * case 'default':
			 * case 'lts':
			 * case 'sts':
			 * case 'nochange':
			 */
			default:
				$this->langKey         = 'COM_JOOMLAUPDATE_VIEW_DEFAULT_UPDATES_INFO_DEFAULT';
				$this->updateSourceKey = JText::_('COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_DEFAULT');
		}

		$this->warnings = array();
		/** @var InstallerModelWarnings $warningsModel */
		$warningsModel = $this->getModel('warnings');

		if (is_object($warningsModel) && $warningsModel instanceof JModelLegacy)
		{
			$language = JFactory::getLanguage();
			$language->load('com_installer', JPATH_ADMINISTRATOR, 'en-GB', false, true);
			$language->load('com_installer', JPATH_ADMINISTRATOR, null, true);

			$this->warnings = $warningsModel->getItems();
		}

		$this->selfUpdate = $this->checkForSelfUpdate();

		// Only Super Users have access to the Update & Install for obvious security reasons
		$this->showUploadAndUpdate = JFactory::getUser()->authorise('core.admin');

		// Remove temporary files
		$model->removePackageFiles();

		// Render the view.
		parent::display($tpl);
	}

	/**
	 * Makes sure that the Joomla! Update Component Update is in the database and check if there is a new version.
	 *
	 * @return  boolean  True if there is an update else false
	 *
	 * @since   3.6.3
	 */
	private function checkForSelfUpdate()
	{
		$db = JFactory::getDbo();

		$query = $db->getQuery(true)
			->select($db->quoteName('extension_id'))
			->from($db->quoteName('#__extensions'))
			->where($db->quoteName('element') . ' = ' . $db->quote('com_joomlaupdate'));
		$db->setQuery($query);

		try
		{
			// Get the component extension ID
			$joomlaUpdateComponentId = $db->loadResult();
		}
		catch (RuntimeException $e)
		{
			// Something is wrong here!
			$joomlaUpdateComponentId = 0;
			JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
		}

		// Try the update only if we have an extension id
		if ($joomlaUpdateComponentId != 0)
		{
			// Always force to check for an update!
			$cache_timeout = 0;

			$updater = JUpdater::getInstance();
			$updater->findUpdates($joomlaUpdateComponentId, $cache_timeout, JUpdater::STABILITY_STABLE);

			// Fetch the update information from the database.
			$query = $db->getQuery(true)
				->select('*')
				->from($db->quoteName('#__updates'))
				->where($db->quoteName('extension_id') . ' = ' . $db->quote($joomlaUpdateComponentId));
			$db->setQuery($query);

			try
			{
				$joomlaUpdateComponentObject = $db->loadObject();
			}
			catch (RuntimeException $e)
			{
				// Something is wrong here!
				$joomlaUpdateComponentObject = null;
				JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
			}

			if (is_null($joomlaUpdateComponentObject))
			{
				// No Update great!
				return false;
			}

			return true;
		}
	}

	/**
	 * Returns true, if the pre update check should be displayed.
	 * This logic is not hardcoded in tmpl files, because it is
	 * used by the Hathor tmpl too.
	 *
	 * @return boolean
	 *
	 * @since 3.10.0
	 */
	public function shouldDisplayPreUpdateCheck()
	{
		// When the download URL is not found there is no core upgrade path
		if (!isset($this->updateInfo['object']->downloadurl->_data))
		{
			return false;
		}

		$nextMinor = JVersion::MAJOR_VERSION . '.' . (JVersion::MINOR_VERSION + 1);

		// Show only when we found a download URL, we have an update and when we update to the next minor or greater.
		return $this->updateInfo['hasUpdate']
				&& version_compare($this->updateInfo['latest'], $nextMinor, '>=');
	}
}

components/com_joomlaupdate/views/default/tmpl/default_update.php000060400000020075152453623450021520 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var JoomlaupdateViewDefault $this */
?>
<fieldset>
	<legend>
		<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_UPDATEFOUND'); ?>
	</legend>
	<p>
		<?php echo JText::sprintf($this->langKey, $this->updateSourceKey); ?>
	</p>

	<table class="table table-striped">
		<tbody>
		<tr>
			<td>
				<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_INSTALLED'); ?>
			</td>
			<td>
				<?php echo '&#x200E;' . $this->updateInfo['installed']; ?>
			</td>
		</tr>
		<tr>
			<td>
				<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_LATEST'); ?>
			</td>
			<td>
				<?php echo '&#x200E;' . $this->updateInfo['latest']; ?>
			</td>
		</tr>
		<tr>
			<td>
				<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_PACKAGE'); ?>
			</td>
			<td>
				<a href="<?php echo $this->updateInfo['object']->downloadurl->_data; ?>" target="_blank" rel="noopener noreferrer">
					<?php echo $this->updateInfo['object']->downloadurl->_data; ?>
					<span class="icon-out-2" aria-hidden="true"></span>
					<span class="element-invisible"><?php echo JText::_('JBROWSERTARGET_NEW'); ?></span>
				</a>
			</td>
		</tr>
		<?php if (isset($this->updateInfo['object']->get('infourl')->_data)
			&& isset($this->updateInfo['object']->get('infourl')->title)) : ?>
			<tr>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_INFOURL'); ?>
				</td>
				<td>
					<a href="<?php echo $this->updateInfo['object']->get('infourl')->_data; ?>" target="_blank" rel="noopener noreferrer">
						<?php echo $this->updateInfo['object']->get('infourl')->title; ?>
						<span class="icon-out-2" aria-hidden="true"></span>
						<span class="element-invisible"><?php echo JText::_('JBROWSERTARGET_NEW'); ?></span>
					</a>
				</td>
			</tr>
		<?php endif; ?>
		<?php // Hide FTP settings when updating to Joomla 4 given that the supporting code has been dropped there ?>
		<?php if (version_compare($this->updateInfo['latest'], '4', '<')) : ?>
			<tr>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_METHOD'); ?>
				</td>
				<td>
					<?php echo $this->methodSelect; ?>
				</td>
			</tr>
			<tr id="row_ftp_hostname" <?php echo $this->ftpFieldsDisplay; ?>>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_HOSTNAME'); ?>
				</td>
				<td>
					<input type="text" name="ftp_host" value="<?php echo $this->ftp['host']; ?>" />
				</td>
			</tr>
			<tr id="row_ftp_port" <?php echo $this->ftpFieldsDisplay; ?>>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_PORT'); ?>
				</td>
				<td>
					<input type="text" name="ftp_port" value="<?php echo $this->ftp['port']; ?>" />
				</td>
			</tr>
			<tr id="row_ftp_username" <?php echo $this->ftpFieldsDisplay; ?>>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_USERNAME'); ?>
				</td>
				<td>
					<input type="text" name="ftp_user" value="<?php echo $this->ftp['username']; ?>" />
				</td>
			</tr>
			<tr id="row_ftp_password" <?php echo $this->ftpFieldsDisplay; ?>>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_PASSWORD'); ?>
				</td>
				<td>
					<input type="password" name="ftp_pass" value="<?php echo $this->ftp['password']; ?>" />
				</td>
			</tr>
			<tr id="row_ftp_directory" <?php echo $this->ftpFieldsDisplay; ?>>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_DIRECTORY'); ?>
				</td>
				<td>
					<input type="text" name="ftp_root" value="<?php echo $this->ftp['directory']; ?>" />
				</td>
			</tr>
		<?php endif; ?>
		</tbody>
		<tfoot>
		<tr id="preupdateCheckWarning">
			<td colspan="2">
				<div class="alert">
					<h4 class="alert-heading">
						<?php echo JText::_('WARNING'); ?>
					</h4>
					<div class="alert-message">
						<div class="preupdateCheckIncomplete">
							<?php echo JText::_('COM_JOOMLAUPDATE_PREUPDATE_CHECK_NOT_COMPLETE'); ?>
						</div>
					</div>
				</div>
			</td>
		</tr>
		<tr id="preupdateCheckCompleteProblems" class="hidden">
			<td colspan="2">
				<div class="alert">
					<h4 class="alert-heading">
						<?php echo JText::_('WARNING'); ?>
					</h4>
					<div class="alert-message">
						<div class="preupdateCheckComplete">
							<?php echo JText::_('COM_JOOMLAUPDATE_PREUPDATE_CHECK_COMPLETED_YOU_HAVE_DANGEROUS_PLUGINS'); ?>
						</div>
					</div>
				</div>
			</td>
		</tr>
		<tr id="preupdateconfirmation" >
			<td colspan="2">
				<label  class="preupdateconfirmation_label label label-warning span12">
					<h3>
						<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_NON_CORE_PLUGIN_BEING_CHECKED'); ?>
					</h3>
				</label>
			</td>
		</tr>
		<tr id="preupdatecheckheadings">
			<td colspan="2">
				<table class="table table-striped">
					<thead>
						<th>
							<?php echo JText::_('COM_INSTALLER_TYPE_PLUGIN'); ?>
						</th>
						<th>
							<?php echo JText::_('COM_INSTALLER_TYPE_PACKAGE'); ?>
						</th>
						<th>
							<?php echo JText::_('COM_INSTALLER_AUTHOR_INFORMATION'); ?>
						</th>
						<th>
							<?php echo JText::_('COM_JOOMLAUPDATE_PREUPDATE_CHECK_EXTENSION_AUTHOR_URL'); ?>
						</th>
					</thead>
					<tbody>
						<?php foreach ($this->nonCoreCriticalPlugins as $nonCoreCriticalPlugin) : ?>
							<tr id='plg_<?php echo $nonCoreCriticalPlugin->extension_id ?>'>
								<td>
									<?php echo JText::_($nonCoreCriticalPlugin->name); ?>
								</td>
								<?php if ($nonCoreCriticalPlugin->package_id > 0) : ?>
									<?php foreach ($this->nonCoreExtensions as $nonCoreExtension) : ?>
										<?php if ($nonCoreCriticalPlugin->package_id == $nonCoreExtension->extension_id) : ?>
											<td>
												<?php echo $nonCoreExtension->name; ?>
											</td>
										<?php endif; ?>
									<?php endforeach; ?>
								<?php else : ?>
									<td/>
								<?php endif; ?>
								<td>
									<?php if (isset($nonCoreCriticalPlugin->manifest_cache->author)) : ?>
									<?php echo JText::_($nonCoreCriticalPlugin->manifest_cache->author); ?>
									<?php elseif ($nonCoreCriticalPlugin->package_id > 0) : ?>
									<?php foreach ($this->nonCoreExtensions as $nonCoreExtension) : ?>
										<?php if ($nonCoreCriticalPlugin->package_id == $nonCoreExtension->extension_id) : ?>
										<td>
											<?php echo $nonCoreExtension->name; ?>
										</td>
										<?php endif; ?>
									<?php endforeach; ?>
									<?php endif; ?>
								</td>
								<td>
									<?php $authorURL = ''; ?>
									<?php if (isset($nonCoreCriticalPlugin->manifest_cache->authorUrl)) : ?>
										<?php $authorURL = $nonCoreCriticalPlugin->manifest_cache->authorUrl; ?>
									<?php elseif ($nonCoreCriticalPlugin->package_id > 0) : ?>
										<?php foreach ($this->nonCoreExtensions as $nonCoreExtension) : ?>
											<?php if ($nonCoreCriticalPlugin->package_id == $nonCoreExtension->extension_id) : ?>
												<?php $authorURL = $nonCoreExtension->manifest_cache->authorUrl; ?>
											<?php endif; ?>
										<?php endforeach; ?>
									<?php endif; ?>
									<?php if (!empty($authorURL)) : ?>
										<a href="<?php echo $authorURL; ?>" target="_blank">
											<?php echo $authorURL; ?>
											<span class="icon-out-2" aria-hidden="true"></span>
											<span class="element-invisible">
												<?php echo JText::_('JBROWSERTARGET_NEW'); ?>
											</span>
										</a>
									<?php endif;?>
								</td>
							</tr>
						<?php endforeach; ?>
					</tbody>
				</table>
			</td>
		</tr>
		<tr id="preupdatecheckbox">
			<td>
				<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_NON_CORE_PLUGIN_CONFIRMATION'); ?>
			</td>
			<td>
				<input type="checkbox" id="noncoreplugins" name="noncoreplugins" value="1" required aria-required="true" />
			</td>
		</tr>

		<tr>
			<td>
				&nbsp;
			</td>
			<td>
				<button class="btn btn-primary disabled submitupdate" type="submit" disabled>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_INSTALLUPDATE'); ?>
				</button>
			</td>
		</tr>
		</tfoot>
	</table>
</fieldset>
components/com_joomlaupdate/views/default/tmpl/default_reinstall.php000060400000007272152453623450022237 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var JoomlaupdateViewDefault $this */
?>
<fieldset>
	<legend>
		<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_NOUPDATES'); ?>
	</legend>
	<p>
		<?php echo JText::sprintf($this->langKey, $this->updateSourceKey); ?>
	</p>

	<div class="alert alert-success">
		<?php echo JText::sprintf('COM_JOOMLAUPDATE_VIEW_DEFAULT_NOUPDATESNOTICE', JVERSION); ?>
	</div>

	<?php if (is_object($this->updateInfo['object']) && ($this->updateInfo['object'] instanceof JUpdate)) : ?>
		<table class="table table-striped">
			<tbody>
			<tr>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_PACKAGE_REINSTALL'); ?>
				</td>
				<td>
					<a href="<?php echo $this->updateInfo['object']->downloadurl->_data; ?>" target="_blank" rel="noopener noreferrer">
						<?php echo $this->updateInfo['object']->downloadurl->_data; ?>
						<span class="icon-out-2" aria-hidden="true"></span>
						<span class="element-invisible"><?php echo JText::_('JBROWSERTARGET_NEW'); ?></span>
					</a>
				</td>
			</tr>
			<?php if (isset($this->updateInfo['object']->get('infourl')->_data)
				&& isset($this->updateInfo['object']->get('infourl')->title)) : ?>
				<tr>
					<td>
						<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_INFOURL'); ?>
					</td>
					<td>
						<a href="<?php echo $this->updateInfo['object']->get('infourl')->_data; ?>" target="_blank" rel="noopener noreferrer">
							<?php echo $this->updateInfo['object']->get('infourl')->title; ?>
							<span class="icon-out-2" aria-hidden="true"></span>
							<span class="element-invisible"><?php echo JText::_('JBROWSERTARGET_NEW'); ?></span>
						</a>
					</td>
				</tr>
			<?php endif; ?>
			<tr>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_METHOD'); ?>
				</td>
				<td>
					<?php echo $this->methodSelect; ?>
				</td>
			</tr>
			<tr id="row_ftp_hostname" <?php echo $this->ftpFieldsDisplay; ?>>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_HOSTNAME'); ?>
				</td>
				<td>
					<input type="text" name="ftp_host" value="<?php echo $this->ftp['host']; ?>" />
				</td>
			</tr>
			<tr id="row_ftp_port" <?php echo $this->ftpFieldsDisplay; ?>>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_PORT'); ?>
				</td>
				<td>
					<input type="text" name="ftp_port" value="<?php echo $this->ftp['port']; ?>" />
				</td>
			</tr>
			<tr id="row_ftp_username" <?php echo $this->ftpFieldsDisplay; ?>>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_USERNAME'); ?>
				</td>
				<td>
					<input type="text" name="ftp_user" value="<?php echo $this->ftp['username']; ?>" />
				</td>
			</tr>
			<tr id="row_ftp_password" <?php echo $this->ftpFieldsDisplay; ?>>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_PASSWORD'); ?>
				</td>
				<td>
					<input type="password" name="ftp_pass" value="<?php echo $this->ftp['password']; ?>" />
				</td>
			</tr>
			<tr id="row_ftp_directory" <?php echo $this->ftpFieldsDisplay; ?>>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_DIRECTORY'); ?>
				</td>
				<td>
					<input type="text" name="ftp_root" value="<?php echo $this->ftp['directory']; ?>" />
				</td>
			</tr>
			</tbody>
			<tfoot>
			<tr>
				<td>
					&nbsp;
				</td>
				<td>
					<button class="btn btn-warning" type="submit">
						<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_INSTALLAGAIN'); ?>
					</button>
				</td>
			</tr>
			</tfoot>
		</table>
	<?php endif; ?>

</fieldset>
components/com_joomlaupdate/views/default/tmpl/default_updatemefirst.php000060400000001021152453623450023100 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

/** @var JoomlaupdateViewDefault $this */
?>

<fieldset>
	<legend>
		<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_NO_LIVE_UPDATE'); ?>
	</legend>
	<p>
		<?php echo JText::sprintf('COM_JOOMLAUPDATE_VIEW_DEFAULT_NO_LIVE_UPDATE_DESC'); ?>
	</p>
</fieldset>
components/com_joomlaupdate/views/default/tmpl/complete.php000060400000001304152453623450020334 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>

<fieldset>
	<legend>
		<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_COMPLETE_HEADING'); ?>
	</legend>
	<p class="alert alert-success">
		<?php echo JText::sprintf('COM_JOOMLAUPDATE_VIEW_COMPLETE_MESSAGE', JVERSION); ?>
	</p>
</fieldset>
<form action="<?php echo JRoute::_('index.php?option=com_joomlaupdate'); ?>" method="post" id="adminForm">
	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>
</form>
components/com_joomlaupdate/views/default/tmpl/default_noupdate.php000060400000001205152453623450022047 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var JoomlaupdateViewDefault $this */
?>
<fieldset>
	<legend>
		<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_NOUPDATES'); ?>
	</legend>
	<p>
		<?php echo JText::sprintf($this->langKey, $this->updateSourceKey); ?>
	</p>
	<div class="alert alert-success">
		<?php echo JText::sprintf('COM_JOOMLAUPDATE_VIEW_DEFAULT_NOUPDATESNOTICE', JVERSION); ?>
	</div>
</fieldset>
components/com_joomlaupdate/views/default/tmpl/default_nodownload.php000060400000002654152453623450022405 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

/** @var JoomlaupdateViewDefault $this */
?>

<fieldset>
	<?php if (!$this->getModel()->isDatabaseTypeSupported()) : ?>
		<legend>
			<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_DB_NOT_SUPPORTED'); ?>
		</legend>
		<p>
			<?php echo JText::sprintf('COM_JOOMLAUPDATE_VIEW_DEFAULT_DB_NOT_SUPPORTED_DESC', $this->updateInfo['latest']); ?>
		</p>
	<?php endif; ?>
	<?php if (!$this->getModel()->isPhpVersionSupported()) : ?>
		<legend>
			<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_PHP_VERSION_NOT_SUPPORTED'); ?>
		</legend>
		<p>
			<?php echo JText::sprintf('COM_JOOMLAUPDATE_VIEW_DEFAULT_PHP_VERSION_NOT_SUPPORTED_DESC', $this->updateInfo['latest']); ?>
		</p>
	<?php endif; ?>
	<?php if (!isset($this->updateInfo['object']->downloadurl->_data) && $this->updateInfo['installed'] < $this->updateInfo['latest'] && $this->getModel()->isPhpVersionSupported() && $this->getModel()->isDatabaseTypeSupported()) : ?>
		<legend>
			<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_NO_DOWNLOAD_URL'); ?>
		</legend>
		<p>
			<?php echo JText::sprintf('COM_JOOMLAUPDATE_VIEW_DEFAULT_NO_DOWNLOAD_URL_DESC', $this->updateInfo['latest']); ?>
		</p>
	<?php endif; ?>


</fieldset>
components/com_joomlaupdate/views/default/tmpl/default_upload.php000060400000016115152453623450021522 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var JoomlaupdateViewDefault $this */

$errSelectPackage = JText::_('COM_INSTALLER_MSG_INSTALL_PLEASE_SELECT_A_PACKAGE', true);
$errPackageTooBig = JText::_('COM_INSTALLER_MSG_WARNINGS_UPLOADFILETOOBIG', true);
$txtPackageSize   = JText::_('JGLOBAL_SELECTED_UPLOAD_FILE_SIZE', true);
$js               = <<< JS
	Joomla.submitbuttonUpload = function() {
		var form = document.getElementById("uploadForm");

		// do field validation
		if (form.install_package.value == "") {
			alert("$errSelectPackage");
		}
		else if (form.install_package.files[0].size > form.max_upload_size.value) {
			alert("$errPackageTooBig");
		}
		else
		{
			jQuery("#loading").css("display", "block");

			form.submit();
		}
	};

	Joomla.installpackageChange = function() {
		var form = document.getElementById('uploadForm');
		var fileSize = form.install_package.files[0].size;
		var fileSizeMB = fileSize * 1.0 / 1024.0 / 1024.0;
		var fileSizeText = "$txtPackageSize";
		var fileSizeElement = document.getElementById('file_size');
		var warningElement  = document.getElementById('max_upload_size_warn');

		if (form.install_package.value == '') {
			fileSizeElement.classList.add('hidden');
			warningElement .classList.add('hidden');
		}
		else if (fileSize) {
			fileSizeElement.classList.remove('hidden');
			fileSizeElement.innerHTML = fileSizeText.replace('%s', fileSizeMB.toFixed(2) + ' MB');

			if (fileSize > form.max_upload_size.value) {
				warningElement .classList.remove('hidden');
			} else {
				warningElement .classList.add('hidden');
			}
		}
	};

	// Add spindle-wheel for installations:
	jQuery(document).ready(function($) {
		var outerDiv = $("#joomlaupdate-wrapper");

		$("#loading")
		.css("top", outerDiv.position().top - $(window).scrollTop())
		.css("left", "0")
		.css("width", "100%")
		.css("height", "100%")
		.css("display", "none")
		.css("margin-top", "-10px");
	});

JS;

JFactory::getDocument()->addScriptDeclaration($js);

$ajaxLoaderImage = JHtml::_('image', 'jui/ajax-loader.gif', '', null, true, true);
$css             = <<< CSS
	#loading {
		background: rgba(255, 255, 255, .8) url('$ajaxLoaderImage') 50% 15% no-repeat;
		position: fixed;
		opacity: 1;
		-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity = 80);
		filter: alpha(opacity = 80);
		overflow: hidden;
	}
CSS;
JFactory::getDocument()->addStyleDeclaration($css);
?>

<div class="alert alert-info">
	<p>
		<span class="icon icon-info" aria-hidden="true"></span>
		<?php echo JText::sprintf('COM_JOOMLAUPDATE_VIEW_DEFAULT_UPLOAD_INTRO', 'https://downloads.joomla.org/latest'); ?>
	</p>
</div>

<?php if (count($this->warnings)) : ?>
<fieldset>
	<legend>
		<?php echo JText::_('COM_INSTALLER_SUBMENU_WARNINGS'); ?>
	</legend>

	<?php $i = 0; ?>
	<?php echo JHtml::_('bootstrap.startAccordion', 'warnings', array('active' => 'warning' . $i)); ?>
	<?php foreach ($this->warnings as $message) : ?>
		<?php echo JHtml::_('bootstrap.addSlide', 'warnings', $message['message'], 'warning' . ($i++)); ?>
		<?php echo $message['description']; ?>
		<?php echo JHtml::_('bootstrap.endSlide'); ?>
	<?php endforeach; ?>
	<?php echo JHtml::_('bootstrap.addSlide', 'warnings', JText::_('COM_INSTALLER_MSG_WARNINGFURTHERINFO'), 'furtherinfo'); ?>
	<?php echo JText::_('COM_INSTALLER_MSG_WARNINGFURTHERINFODESC'); ?>
	<?php echo JHtml::_('bootstrap.endSlide'); ?>
	<?php echo JHtml::_('bootstrap.endAccordion'); ?>
</fieldset>
<?php endif; ?>

<form enctype="multipart/form-data" action="index.php" method="post" id="uploadForm" class="form-horizontal">
	<fieldset class="uploadform">
		<legend><?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_TAB_UPLOAD'); ?></legend>
		<table class="table table-striped">
			<tbody>
			<tr>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_UPLOAD_PACKAGE_FILE'); ?>
				</td>
				<td>
					<input class="input_box" id="install_package" name="install_package" type="file" size="57" accept=".zip,application/zip" onchange="Joomla.installpackageChange()" /><br>
					<?php $maxSizeBytes = JUtility::getMaxUploadSize(); ?>
					<?php $maxSize = JHtml::_('number.bytes', $maxSizeBytes); ?>
					<input id="max_upload_size" name="max_upload_size" type="hidden" value="<?php echo $maxSizeBytes; ?>" />
					<div class="small"><?php echo JText::sprintf('JGLOBAL_MAXIMUM_UPLOAD_SIZE_LIMIT', '&#x200E;' . $maxSize); ?></div>
					<div class="small hidden" id="file_size" name="file_size"><?php echo JText::sprintf('JGLOBAL_SELECTED_UPLOAD_FILE_SIZE', '&#x200E;' . ''); ?></div>
					<div class="alert alert-warning hidden" id="max_upload_size_warn">
						<?php echo JText::_('COM_INSTALLER_MSG_WARNINGS_UPLOADFILETOOBIG'); ?>
					</div>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_METHOD'); ?>
				</td>
				<td>
					<?php echo $this->methodSelectUpload; ?>
				</td>
			</tr>
			<tr id="upload_ftp_notice" <?php echo $this->ftpFieldsDisplay; ?>>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_NOTICE'); ?>
				</td>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_NOTICE_MESSAGE'); ?>
				</td>
			</tr>
			<tr id="upload_ftp_hostname" <?php echo $this->ftpFieldsDisplay; ?>>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_HOSTNAME'); ?>
				</td>
				<td>
					<input type="text" name="ftp_host" value="<?php echo $this->ftp['host']; ?>" />
				</td>
			</tr>
			<tr id="upload_ftp_port" <?php echo $this->ftpFieldsDisplay; ?>>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_PORT'); ?>
				</td>
				<td>
					<input type="text" name="ftp_port" value="<?php echo $this->ftp['port']; ?>" />
				</td>
			</tr>
			<tr id="upload_ftp_username" <?php echo $this->ftpFieldsDisplay; ?>>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_USERNAME'); ?>
				</td>
				<td>
					<input type="text" name="ftp_user" value="<?php echo $this->ftp['username']; ?>" />
				</td>
			</tr>
			<tr id="upload_ftp_password" <?php echo $this->ftpFieldsDisplay; ?>>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_PASSWORD'); ?>
				</td>
				<td>
					<input type="password" name="ftp_pass" value="<?php echo $this->ftp['password']; ?>" />
				</td>
			</tr>
			<tr id="upload_ftp_directory" <?php echo $this->ftpFieldsDisplay; ?>>
				<td>
					<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_FTP_DIRECTORY'); ?>
				</td>
				<td>
					<input type="text" name="ftp_root" value="<?php echo $this->ftp['directory']; ?>" />
				</td>
			</tr>
			</tbody>
			<tfoot>
			<tr>
				<td>
					&nbsp;
				</td>
				<td>
					<button class="btn btn-primary" type="button" onclick="Joomla.submitbuttonUpload()"><?php echo JText::_('COM_INSTALLER_UPLOAD_AND_INSTALL'); ?></button>
				</td>
			</tr>
			</tfoot>
		</table>
	</fieldset>

	<input type="hidden" name="task" value="update.upload" />
	<input type="hidden" name="option" value="com_joomlaupdate" />
	<?php echo JHtml::_('form.token'); ?>

</form>
components/com_joomlaupdate/views/default/tmpl/default_preupdatecheck.php000060400000023310152453623450023220 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var JoomlaupdateViewDefault $this */

// JText::script doesn't have a sprintf equivalent so work around this
JFactory::getDocument()->addScriptDeclaration("var COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_SHOW_MORE_COMPATIBILITY_INFORMATION = '" . JText::sprintf('COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_SHOW_MORE_COMPATIBILITY_INFORMATION', '<span class="icon-chevron-right small"></span>', true) . "';");
JFactory::getDocument()->addScriptDeclaration("var COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_SHOW_LESS_COMPATIBILITY_INFORMATION = '" . JText::sprintf('COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_SHOW_LESS_COMPATIBILITY_INFORMATION', '<span class="icon-chevron-up small"></span>', true) . "';");
JFactory::getDocument()->addScriptOptions('nonCoreCriticalPlugins', array_values($this->nonCoreCriticalPlugins));

$compatibilityTypes = array(
	'COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_RUNNING_PRE_UPDATE_CHECKS' => array(
		'class' => 'label-default',
		'notes' => 'COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_RUNNING_PRE_UPDATE_CHECKS_NOTES',
		'group' => 0
	),
	'COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_PRE_UPDATE_CHECKS_FAILED' => array(
		'class' => 'label-important',
		'notes' => 'COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_PRE_UPDATE_CHECKS_FAILED_NOTES',
		'group' => 4
	),
	'COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_UPDATE_SERVER_OFFERS_NO_COMPATIBLE_VERSION' => array(
		'class' => 'label-important',
		'notes' => 'COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_UPDATE_SERVER_OFFERS_NO_COMPATIBLE_VERSION_NOTES',
		'group' => 1
	),
	'COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_REQUIRING_UPDATES_TO_BE_COMPATIBLE' => array(
		'class' => 'label-warning',
		'notes' => 'COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_REQUIRING_UPDATES_TO_BE_COMPATIBLE_NOTES',
		'group' => 2
	),
	'COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_PROBABLY_COMPATIBLE' => array(
		'class' => 'label-success',
		'notes' => 'COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_PROBABLY_COMPATIBLE_NOTES',
		'group' => 3
	)
);

if (version_compare($this->updateInfo['latest'], '4', '>=') && $this->isBackendTemplateIsis === false)
{
	JFactory::getApplication()->enqueueMessage(
		JText::_(
			'COM_JOOMLAUPDATE_VIEW_DEFAULT_NON_CORE_BACKEND_TEMPLATE_USED_NOTICE'
		),
		'info'
	);
}

?>
<h2>
	<?php echo JText::sprintf('COM_JOOMLAUPDATE_VIEW_DEFAULT_PREUPDATE_CHECK', $this->updateInfo['latest']); ?>
</h2>
<p>
	<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_EXPLANATION_AND_LINK_TO_DOCS'); ?>
</p>
<div class="row-fluid">
	<fieldset class="span6 ">
		<?php $labelClass = 'success'; ?>
		<?php foreach ($this->phpOptions as $option) : ?>
			<?php if (!$option->state) : ?>
				<?php $labelClass = 'important'; ?>
				<?php break; ?>
			<?php endif; ?>
		<?php endforeach; ?>
		<legend class="label label-<?php echo $labelClass;?>">
			<h3>
				<?php echo $labelClass === 'important' ? JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_REQUIRED_SETTINGS_WARNING') : JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_REQUIRED_SETTINGS_PASSED'); ?>
				<div class="settingstoggle" data-state="closed">
					<?php echo JText::sprintf(
						'COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_SHOW_MORE_COMPATIBILITY_INFORMATION',
						'<span class="icon-chevron-right small"></span>'
					); ?>
				</div>
			</h3>
		</legend>
		<div class="settingsInfo hidden" >
			<table class="table">
				<thead>
					<tr>
						<th>
							<?php echo JText::_('COM_JOOMLAUPDATE_PREUPDATE_HEADING_REQUIREMENT'); ?>
						</th>
						<th>
							<?php echo JText::_('COM_JOOMLAUPDATE_PREUPDATE_HEADING_CHECKED'); ?>
						</th>
					</tr>
				</thead>
				<tbody>
					<?php foreach ($this->phpOptions as $option) : ?>
						<tr>
							<td>
								<?php echo $option->label; ?>
							</td>
							<td>
								<span class="label label-<?php echo $option->state ? 'success' : 'important'; ?>">
									<?php echo JText::_($option->state ? 'JYES' : 'JNO'); ?>
									<?php if ($option->notice) : ?>
										<span class="icon-info icon-white hasTooltip" title="<?php echo $option->notice; ?>"></span>
									<?php endif; ?>
								</span>
							</td>
						</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
		</div>
	</fieldset>
	<fieldset class="span6">
		<?php $labelClass = 'success'; ?>
		<?php foreach ($this->phpSettings as $setting) : ?>
			<?php if ($setting->state !== $setting->recommended) : ?>
				<?php $labelClass = 'warning'; ?>
				<?php break; ?>
			<?php endif; ?>
		<?php endforeach; ?>
		<legend class="label label-<?php echo $labelClass; ?>">
			<h3>
				<?php echo $labelClass === 'warning' ? JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_RECOMMENDED_SETTINGS_WARNING') : JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_RECOMMENDED_SETTINGS_PASSED'); ?>
				<div class="settingstoggle" data-state="closed">
					<?php echo JText::sprintf(
						'COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_SHOW_MORE_COMPATIBILITY_INFORMATION',
						'<span class="icon-chevron-right small"></span>'
					); ?>
				</div>
			</h3>
		</legend>
		<div class="settingsInfo hidden" >
			<p>
				<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_RECOMMENDED_SETTINGS_DESC'); ?>
			</p>
			<table class="table">
				<thead>
					<tr>
						<th>
							<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_DIRECTIVE'); ?>
						</th>
						<th>
							<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_RECOMMENDED'); ?>
						</th>
						<th>
							<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_ACTUAL'); ?>
						</th>
					</tr>
				</thead>
				<tbody>
					<?php foreach ($this->phpSettings as $setting) : ?>
						<tr>
							<td>
								<?php echo $setting->label; ?>
							</td>
							<td>
								<?php echo JText::_($setting->recommended ? 'JON' : 'JOFF'); ?>
							</td>
							<td>
								<span class="label label-<?php echo ($setting->state === $setting->recommended) ? 'success' : 'warning'; ?>">
									<?php echo JText::_($setting->state ? 'JON' : 'JOFF'); ?>
								</span>
							</td>
						</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
		</div>
	</fieldset>
</div>
<?php if (!empty($this->nonCoreExtensions)) : ?>
	<div>
		<h3>
			<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS'); ?>
		</h3>
		<?php foreach ($compatibilityTypes as $compatibilityType => $compatibilityData) : ?>
			<?php $compatibilityDisplayClass = $compatibilityData['class']; ?>
			<?php $compatibilityDisplayNotes = $compatibilityData['notes']; ?>
			<?php $compatibilityTypeGroup    = $compatibilityData['group']; ?>
			<fieldset id="compatibilitytype<?php echo $compatibilityTypeGroup;?>" class="span12 compatibilitytypes">
				<legend class="label <?php echo $compatibilityDisplayClass; ?>">
					<h3>
						<?php if ($compatibilityType !== "COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_RUNNING_PRE_UPDATE_CHECKS") : ?>
							<div class="compatibilitytoggle" data-state="closed">
								<?php echo JText::sprintf(
									'COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_SHOW_MORE_COMPATIBILITY_INFORMATION',
									'<span class="icon-chevron-right small"></span>'
								); ?>
							</div>
						<?php endif; ?>
						<?php echo JText::_($compatibilityType); ?>
					</h3>
				</legend>
				<div class="compatibilityNotes">
					<?php echo JText::_($compatibilityDisplayNotes); ?>
				</div>
				<table class="table">
					<thead class="row-fluid">
						<tr>
							<th class="exname span8">
								<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_NAME'); ?>
							</th>
							<th class="extype span4">
								<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_TYPE'); ?>
							</th>
							<th class="instver hidden">
								<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_INSTALLED_VERSION'); ?>
							</th>
							<th class="upcomp hidden">
								<?php echo JText::sprintf('COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_COMPATIBLE_WITH_JOOMLA_VERSION', isset($this->updateInfo['installed']) ? $this->updateInfo['installed'] : JVERSION); ?>
							</th>
							<th class="currcomp hidden">
								<?php echo JText::sprintf('COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_COMPATIBLE_WITH_JOOMLA_VERSION', $this->updateInfo['latest']); ?>
							</th>
						</tr>
					</thead>
					<tbody class="row-fluid">
						<?php // Only include this row once since the javascript moves the results into the right place ?>
						<?php if ($compatibilityType == "COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_RUNNING_PRE_UPDATE_CHECKS") : ?>
							<?php foreach ($this->nonCoreExtensions as $extension) : ?>
								<tr>
									<td class="exname span8">
										<?php echo JText::_($extension->name); ?>
									</td>
									<td class="extype span4">
										<?php echo JText::_('COM_INSTALLER_TYPE_' . strtoupper($extension->type)); ?>
									</td>
									<td class="instver hidden">
										<?php echo $extension->version; ?>
									</td>
									<td id="available-version-<?php echo $extension->extension_id; ?>" class="currcomp hidden"/>
									<td
										class="extension-check upcomp hidden"
										data-extension-id="<?php echo $extension->extension_id; ?>"
										data-extension-current-version="<?php echo $extension->version; ?>"
									>
										<img src="../media/jui/images/ajax-loader.gif" />
									</td>
								</tr>
							<?php endforeach; ?>
						<?php endif; ?>
					</tbody>
				</table>
			</fieldset>
		<?php endforeach; ?>
	</div>
<?php else: ?>
	<div class="row-fluid">
		<div class="span6">
			<h3>
				<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS'); ?>
			</h3>
			<div class="alert alert-no-items">
				<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSIONS_NONE'); ?>
			</div>
		</div>
	</div>
<?php endif; ?>
components/com_joomlaupdate/views/default/tmpl/default.php000060400000011336152453623450020156 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_joomlaupdate
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var JoomlaupdateViewDefault $this */

JHtml::_('jquery.framework');
JHtml::_('bootstrap.tooltip');
JHtml::_('bootstrap.popover');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('script', 'com_joomlaupdate/default.js', array('version' => 'auto', 'relative' => true));

JText::script('JYES');
JText::script('JNO');
JText::script('COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_NO_COMPATIBILITY_INFORMATION');
JText::script('COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_WARNING_UNKNOWN');
JText::script('COM_JOOMLAUPDATE_VIEW_DEFAULT_EXTENSION_SERVER_ERROR');
JText::script('COM_JOOMLAUPDATE_VIEW_DEFAULT_POTENTIALLY_DANGEROUS_PLUGIN');
JText::script('COM_JOOMLAUPDATE_VIEW_DEFAULT_POTENTIALLY_DANGEROUS_PLUGIN_DESC');
JText::script('COM_JOOMLAUPDATE_VIEW_DEFAULT_POTENTIALLY_DANGEROUS_PLUGIN_LIST');
JText::script('COM_JOOMLAUPDATE_VIEW_DEFAULT_POTENTIALLY_DANGEROUS_PLUGIN_CONFIRM_MESSAGE');
JText::script('COM_JOOMLAUPDATE_VIEW_DEFAULT_HELP');

$latestJoomlaVersion = $this->updateInfo['latest'];
$currentJoomlaVersion = isset($this->updateInfo['installed']) ? $this->updateInfo['installed'] : JVERSION;

JFactory::getDocument()->addScriptDeclaration(
<<<JS
jQuery(document).ready(function($) {
	$('#extraction_method').change(function(e){
		extractionMethodHandler('#extraction_method', 'row_ftp');
	});
	$('#upload_method').change(function(e){
		extractionMethodHandler('#upload_method', 'upload_ftp');
	});

	$('button.submit').on('click', function() {
		$('div.download_message').show();
	});
});

var joomlaTargetVersion = '$latestJoomlaVersion';
var joomlaCurrentVersion = '$currentJoomlaVersion';
JS
);

?>

<div id="joomlaupdate-wrapper">
	<?php if ($this->showUploadAndUpdate) : ?>
		<?php echo JHtml::_('bootstrap.startTabSet', 'joomlaupdate-tabs', array('active' => $this->shouldDisplayPreUpdateCheck() ? 'pre-update-check' : 'online-update')); ?>
		<?php if ($this->shouldDisplayPreUpdateCheck()) : ?>
			<?php echo JHtml::_('bootstrap.addTab', 'joomlaupdate-tabs', 'pre-update-check', JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_TAB_PRE_UPDATE_CHECK')); ?>
			<?php echo $this->loadTemplate('preupdatecheck'); ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php endif; ?>
		<?php echo JHtml::_('bootstrap.addTab', 'joomlaupdate-tabs', 'online-update', JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_TAB_ONLINE')); ?>
	<?php endif; ?>

	<form enctype="multipart/form-data" action="index.php" method="post" id="adminForm" class="form-horizontal">

		<?php if ($this->selfUpdate) : ?>
			<?php // If we have a self update notice to install it first! ?>
			<?php JFactory::getApplication()->enqueueMessage(JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_INSTALL_SELF_UPDATE_FIRST'), 'error'); ?>
			<?php echo $this->loadTemplate('updatemefirst'); ?>
		<?php else : ?>
			<?php if ((!isset($this->updateInfo['object']->downloadurl->_data)
				&& !$this->updateInfo['hasUpdate'])
				|| !$this->getModel()->isDatabaseTypeSupported()
				|| !$this->getModel()->isPhpVersionSupported()) : ?>
		<?php // If we have no download URL or our PHP version or our DB type is not supported we can't reinstall or update ?>
				<?php echo $this->loadTemplate('noupdate'); ?>
			<?php elseif (!isset($this->updateInfo['object']->downloadurl->_data)) : ?>
				<?php echo $this->loadTemplate('nodownload'); ?>
			<?php elseif (!$this->updateInfo['hasUpdate']) : ?>
				<?php // If we have no update but we have a downloadurl we can reinstall the core ?>
				<?php echo $this->loadTemplate('reinstall'); ?>
			<?php else : ?>
				<?php // Ok let's show the update template ?>
				<?php echo $this->loadTemplate('update'); ?>
			<?php endif; ?>
		<?php endif; ?>

		<input type="hidden" name="task" value="update.download" />
		<input type="hidden" name="option" value="com_joomlaupdate" />

		<?php echo JHtml::_('form.token'); ?>
	</form>

	<?php // Only Super Users have access to the Update & Install for obvious security reasons ?>
	<?php if ($this->showUploadAndUpdate) : ?>
		<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php echo JHtml::_('bootstrap.addTab', 'joomlaupdate-tabs', 'upload-update', JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_TAB_UPLOAD')); ?>
		<?php echo $this->loadTemplate('upload'); ?>
		<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php echo JHtml::_('bootstrap.endTabSet'); ?>
	<?php endif; ?>

	<div class="download_message" style="display: none">
		<p></p>
		<p class="nowarning">
			<?php echo JText::_('COM_JOOMLAUPDATE_VIEW_DEFAULT_DOWNLOAD_IN_PROGRESS'); ?>
		</p>
		<div class="joomlaupdate_spinner"></div>
	</div>
	<div id="loading"></div>
</div>
components/com_joomlaupdate/views/default/tmpl/default.xml000060400000000332152453623450020161 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_JOOMLAUPDATE_DEFAULT_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_JOOMLAUPDATE_DEFAULT_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_icagenda/index.html000060400000000032152453623450013317 0ustar00<html><body></body></html>components/com_icagenda/assets/index.html000060400000000032152453623450014621 0ustar00<html><body></body></html>components/com_icagenda/assets/elements/titleimg.php000060400000004232152453623450016775 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.4 2015-04-02
 * @since       1.2.3
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('JPATH_BASE') or die;

jimport('joomla.form.formfield');

// Test if translation is missing, set to en-GB by default
$language = JFactory::getLanguage();
$language->load('com_icagenda', JPATH_ADMINISTRATOR, 'en-GB', true);
$language->load('com_icagenda', JPATH_ADMINISTRATOR, null, true);

JHtml::stylesheet('com_icagenda/icagenda-back.css', false, true);

class JFormFieldTitleImg extends JFormField
{
	protected $type = 'TitleImg';

	protected function getInput()
	{
		return ' ';
	}

	protected function getLabel()
	{
		$html = array();

		// Affichage texte

		$label = $this->element['label'];
		$label = $this->translateLabel ? JText::_($label) : $label;

		$style = $this->element['style'];
		$style = $this->translateLabel ? JText::_($style) : $style;

		$class = $this->element['class'];
		$class = $this->translateLabel ? JText::_($class) : $class;

		$icimage = $this->element['icimage'];
		$image = '../media/com_icagenda/images/'. $icimage .'';

		$icicon = $this->element['icicon'];

		// Contruction
		$html[] = '<div class="';
		$html[] = $class;
		$html[] = '" ';
		$html[] = 'style="';
		$html[] = $style;
		$html[] = 'display:block;clear:both;">';

		if ($icimage)
		{
			$html[] = '<img src="';
			$html[] = $image;
			$html[] = '" style="float:left; padding: 6px 10px 10px 0px;" />';
		}
		elseif ($icicon)
		{
			$html[] = '<span class="iCicon-';
			$html[] = $icicon;
			$html[] = '"></span> ';
		}

		$html[] = $label;
		$html[] = '</div>';

		return implode('',$html);
	}
}
components/com_icagenda/assets/elements/index.html000060400000000054152453623450016441 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_icagenda/assets/elements/titleheader.php000060400000002113152453623450017445 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.4 2015-04-13
 * @since       3.5.4
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('JPATH_BASE') or die;

jimport('joomla.form.formfield');


class JFormFieldTitleHeader extends JFormField
{
	protected $type = 'TitleHeader';

	protected function getInput()
	{
		return ' ';
	}

	protected function getLabel()
	{
    	$label = $this->element['label'];
		$label = $this->translateLabel ? JText::_($label) : $label;

    	$html = '<h3>' . $label . '</h3>';

    	return $html;
	}
}
components/com_icagenda/assets/elements/desc.php000060400000006167152453623450016106 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.4 2015-04-02
 * @since       3.2.0.3
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('JPATH_BASE') or die;

jimport('joomla.form.formfield');

// Test if translation is missing, set to en-GB by default
$language = JFactory::getLanguage();
$language->load('com_icagenda', JPATH_ADMINISTRATOR, 'en-GB', true);
$language->load('com_icagenda', JPATH_ADMINISTRATOR, null, true);


class JFormFieldDesc extends JFormField
{
	protected $type = 'Desc';

	protected function getLabel()
	{
		return ' ';
	}

	protected function getInput()
	{
		$html = array();

		$document = JFactory::getDocument();

		// Joomla 2.5
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			JHtml::stylesheet('com_icagenda/template.j25.css', false, true);
			JHtml::stylesheet('com_icagenda/icagenda-back.j25.css', false, true);

			JHTML::_('behavior.framework');

			// load jQuery, if not loaded before
			$scripts = array_keys($document->_scripts);
			$scriptFound = false;
			$scriptuiFound = false;

			for ($i = 0; $i < count($scripts); $i++)
			{
				if (stripos($scripts[$i], 'jquery.min.js') !== false)
				{
					$scriptFound = true;
				}
				// load jQuery, if not loaded before as jquery
				if (stripos($scripts[$i], 'jquery.js') !== false)
				{
					$scriptFound = true;
				}
				if (stripos($scripts[$i], 'jquery-ui.min.js') !== false)
				{
					$scriptuiFound = true;
				}
			}

			// jQuery Library Loader
			if (!$scriptFound)
			{
				// load jQuery, if not loaded before
				if (!JFactory::getApplication()->get('jquery'))
				{
					JFactory::getApplication()->set('jquery', true);
					// add jQuery
					$document->addScript('https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js');
					$document->addScript( JURI::root( true ) . '/media/com_icagenda/js/jquery.noconflict.js' );
				}
			}

			if (!$scriptuiFound)
			{
				$document->addScript('https://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js');
			}

			$document->addScript( JURI::root( true ) . '/media/com_icagenda/js/template.js' );
		}

		$label = $this->element['label'];
		$label = $this->translateLabel ? JText::_($label) : $label;

		$style = $this->element['style'];
		$style = $this->translateLabel ? JText::_($style) : $style;

		$class = $this->element['class'];
		$class = $this->translateLabel ? JText::_($class) : $class;


		// Contruction
		$html[] = "<div class='";
		$html[] = $class;
		$html[] = "' ";
		$html[] = "style='";
		$html[] = $style;
		$html[] = "display:block;clear:both;'>";
		$html[] = $label;
		$html[] = "</div>";

		return implode('',$html);

	}
}
components/com_icagenda/assets/elements/title.php000060400000006471152453623450016307 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.4 2015-04-02
 * @since       1.2.3
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('JPATH_BASE') or die;

jimport('joomla.form.formfield');

// Test if translation is missing, set to en-GB by default
$language = JFactory::getLanguage();
$language->load('com_icagenda', JPATH_ADMINISTRATOR, 'en-GB', true);
$language->load('com_icagenda', JPATH_ADMINISTRATOR, null, true);

JHtml::stylesheet('com_icagenda/icagenda-back.css', false, true);


class JFormFieldTitle extends JFormField
{
	protected $type = 'Title';

	protected function getInput()
	{
		return ' ';
	}

	protected function getLabel()
	{
		$html = array();

		$document = JFactory::getDocument();
		$document->addStyleSheet( JURI::root( true ) . '/media/com_icagenda/icicons/style.css' );

		// Joomla 2.5
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			JHtml::stylesheet('com_icagenda/template.j25.css', false, true);
			JHtml::stylesheet('com_icagenda/icagenda-back.j25.css', false, true);

			JHTML::_('behavior.framework');

			// load jQuery, if not loaded before
			$scripts = array_keys($document->_scripts);
			$scriptFound = false;
			$scriptuiFound = false;

			for ($i = 0; $i < count($scripts); $i++)
			{
				if (stripos($scripts[$i], 'jquery.min.js') !== false)
				{
					$scriptFound = true;
				}
				// load jQuery, if not loaded before as jquery
				if (stripos($scripts[$i], 'jquery.js') !== false)
				{
					$scriptFound = true;
				}
				if (stripos($scripts[$i], 'jquery-ui.min.js') !== false)
				{
					$scriptuiFound = true;
				}
			}

			// jQuery Library Loader
			if (!$scriptFound)
			{
				// load jQuery, if not loaded before
				if (!JFactory::getApplication()->get('jquery'))
				{
					JFactory::getApplication()->set('jquery', true);
					// add jQuery
					$document->addScript('https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js');
					$document->addScript( JURI::root( true ) . '/media/com_icagenda/js/jquery.noconflict.js' );
				}
			}

			if (!$scriptuiFound)
			{
				$document->addScript('https://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js');
			}

			$document->addScript( JURI::root( true ) . '/media/com_icagenda/js/template.js' );
		}

    	$label = $this->element['label'];
		$label = $this->translateLabel ? JText::_($label) : $label;

    	$style = $this->element['style'];
		$style = $this->translateLabel ? JText::_($style) : $style;

    	$class = $this->element['class'];
		$class = $this->translateLabel ? JText::_($class) : $class;


		// Contruction
    	$html[] = "<div class='";
    	$html[] = $class;
    	$html[] = "' ";
    	$html[] = "style='";
    	$html[] = $style;
    	$html[] = "display:block;clear:both;'>";
    	$html[] = $label;
    	$html[] = "</div>";

    	return implode('',$html);
	}
}
components/com_icagenda/assets/jcms/info.php000060400000004333152453623450015234 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Adapted from Nicholas K. Dionysopoulos - www.akeebabackup.com
 * @link        http://www.joomlic.com
 *
 * @version     3.5.6 2015-06-24
 * @since       3.5.6
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

class iCagendaSystemInfo
{
	/** @var string Unique identifier for the site, created from server variables */
	private $siteId;
	/** @var array Associative array of data being sent */
	private $data = array();
	/** @var string Remote url to upload the stats */
	private $remoteUrl = 'http://stats.joomlic.com/index.php';

	public function setSiteId($siteId)
	{
		$this->siteId = $siteId;
	}

	/**
	 * Sets the value of a collected variable. Use NULL as value to unset it
	 *
	 * @param   string  $key        Variable name
	 * @param   string  $value      Variable value
	 */
	public function setValue($key, $value)
	{
		if (is_null($value) && isset($this->data[$key]))
		{
			unset($this->data[$key]);
		}
		else
		{
			$this->data[$key] = $value;
		}
	}

	/**
	 * Uploads collected data to the remote server
	 *
	 * @param   bool    $useIframe  Should I create an iframe to upload data or should I use cURL/fopen?
	 *
	 * @return  string|bool     The HTML code if an iframe is requested or a boolean if we're using cURL/fopen
	 */
	public function sendInfo()
	{
		// No site ID? Well, simply do nothing
		if ( ! $this->siteId)
		{
			return '';
		}

		// First of all let's add the siteId
		$this->setValue('sid', $this->siteId);

		// Then let's create the url
		$url = array();

		foreach ($this->data as $param => $value)
		{
			$url[] .= $param . '=' . $value;
		}

		$url = $this->remoteUrl . '?' . implode('&', $url);

		return '<iframe style="display: none" src="' . $url . '"></iframe>';
	}
}
components/com_icagenda/models/category.php000060400000010321152453623450015135 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rez�, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rez� (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-12-04
 * @since		1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.modeladmin');


/**
 * iCagenda model.
 */
class iCagendaModelCategory extends JModelAdmin
{
	/**
	 * @var		string	The prefix to use with controller messages.
	 * @since	1.6
	 */
	protected $text_prefix = 'COM_ICAGENDA';


	/**
	 * Returns a reference to the a Table object, always creating it.
	 *
	 * @param	type	The table type to instantiate
	 * @param	string	A prefix for the table class name. Optional.
	 * @param	array	Configuration array for model. Optional.
	 * @return	JTable	A database object
	 * @since	1.6
	 */
	public function getTable($type = 'Category', $prefix = 'iCagendaTable', $config = array())
	{
		return JTable::getInstance($type, $prefix, $config);
	}

	/**
	 * Method to get the record form.
	 *
	 * @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)
	{
		// Initialise variables.
		$app	= JFactory::getApplication();

		// Get the form.
		$form = $this->loadForm('com_icagenda.category', 'category', 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_icagenda.edit.category.data', array());

		if (empty($data)) {
			$data = $this->getItem();
		}

		return $data;
	}

	/**
	 * Method to get a single record.
	 *
	 * @param	integer	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)) {

			//Do any procesing on fields here if needed

		}

		return $item;
	}

	/**
	 * Prepare and sanitise the table prior to saving.
	 *
	 * @since	1.0
	 */

	protected function prepareTable( $table )
	{
		if (empty($table->id)) {

			// Set ordering to the last item if not set
			if (@$table->ordering === '') {
				$db = JFactory::getDbo();
				$db->setQuery('SELECT MAX(ordering) FROM #__icagenda_category');
				$max = $db->loadResult();
				$table->ordering = $max+1;
			}

		}
	}

	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   3.4.0
	 */
	public function save($data)
	{
		$date = JFactory::getDate();

		// Fix version before 3.4.0 to set a created date (will use last modified date if exists, or current date)
		if (empty($data['created']))
		{
			$data['created'] = !empty($data['modified']) ? $data['modified'] : $date->toSql();
		}

		// Generates Alias if empty
		// Alias is not generated if non-latin characters, so we fix it by using created date, or title if unicode is activated, as alias
		if ($data['alias'] == null || empty($data['alias']))
		{
			$data['alias'] = JFilterOutput::stringURLSafe($data['title']);

			if ($data['alias'] == null || empty($data['alias']))
			{
				if (JFactory::getConfig()->get('unicodeslugs') == 1)
				{
					$data['alias'] = JFilterOutput::stringURLUnicodeSlug($data['title']);
				}
				else
				{
					$data['alias'] = JFilterOutput::stringURLSafe($data['created']);
				}
			}
		}

		$return = parent::save($data);

		return $return;
	}
}
components/com_icagenda/models/fields/index.html000060400000000032152453623450016050 0ustar00<html><body></body></html>components/com_icagenda/models/fields/iclist/index.html000060400000000032152453623450017337 0ustar00<html><body></body></html>components/com_icagenda/models/fields/iclist/globalization.php000060400000021467152453623450020730 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.7 2015-07-12
 * @since       2.1.7
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldiClist_globalization extends JFormField
{
	protected $type='iclist_globalization';

	protected function getInput()
	{
		$lang		= JFactory::getLanguage();
		$langTag	= $lang->getTag();
		$langName	= $lang->getName();

		if ( ! file_exists(JPATH_LIBRARIES . '/ic_library/globalize/culture/' . $langTag . '.php'))
		{
			$langTag = 'en-GB';
			$currentText = JTEXT::_('COM_ICAGENDA_DATE_FORMAT_DEFAULT') . ' [' . $langTag . '] :';

		}
		else
		{
			$currentText = JTEXT::_('COM_ICAGENDA_DATE_FORMAT_CURRENT') . ' [' . $langTag . '] :';
		}

		$globalize		= JPATH_LIBRARIES . '/ic_library/globalize/culture/' . $langTag . '.php';
		$iso			= JPATH_LIBRARIES . '/ic_library/globalize/culture/iso.php';

		require_once $globalize;
		require_once $iso;

		$class		= isset($class) ? ' class="' . $class . '"' : '';
		$selected	= ' selected="selected" style="background:#D4D4D4;"';

		// Start Select List of Date Formats
		$html = '<select id="' . $this->id . '_id"' . $class . ' name="' . $this->name . '" style="width:250px;" >';

		if ($this->name != 'jform[format]' && $this->name != 'format')
		{
			$html.= '<option value="" style="text-align:center;">- ' . JTEXT::_('COM_ICAGENDA_SELECT_FORMAT') . ' -</option>';
		}

		// Date Formats in Current Language of User (admin)
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			$html.= '<optgroup label="&nbsp;"></optgroup>';
			$html.= '<optgroup label="' . $currentText . '" style="font-style:normal; color:#333333;"></optgroup>';
		}
		else
		{
			$html.= '<optgroup label="' . $currentText . '">';
		}

		$dateglobalize_array[] = array();
		$dateglobalize_array[] = $dateglobalize_1;
		$dateglobalize_array[] = $dateglobalize_2;
		$dateglobalize_array[] = $dateglobalize_3;
		$dateglobalize_array[] = $dateglobalize_4;
		$dateglobalize_array[] = isset($dateglobalize_5) ? $dateglobalize_5 : ''; // en-GB, en-US
		$dateglobalize_array[] = $dateglobalize_6;
		$dateglobalize_array[] = $dateglobalize_7;
		$dateglobalize_array[] = $dateglobalize_8;
		$dateglobalize_array[] = isset($dateglobalize_9) ? $dateglobalize_9 : ''; // en-GB
		$dateglobalize_array[] = isset($dateglobalize_10) ? $dateglobalize_10 : ''; // en-GB
		$dateglobalize_array[] = $dateglobalize_11;
		$dateglobalize_array[] = $dateglobalize_12;

		foreach ($dateglobalize_array as $format => $label)
		{
			if (isset($label) && $label)
			{
				$html.= '<option value="' . $format . '"';
				$html.= ($this->value == $format) ? $selected : '';
				$html.= '>' . $label . '</option>';
			}
		}

		if (version_compare(JVERSION, '3.0', 'ge'))
		{
			$html.= '</optgroup>';
		}


		// Other date format in English (if 'en-GB' is current language)
		if ($langTag == 'en-GB')
		{
			// Extra en-US
			if (version_compare(JVERSION, '3.0', 'lt'))
			{
				$html.= '<optgroup label="&nbsp;"></optgroup>';
				$html.= '<optgroup label="Other date format in English" style="font-style:normal; color:#333333;"></optgroup>';
				$html.= '<optgroup label="en-US (more formats if current language) :" style="font-weight:normal; color:#777777;"></optgroup>';
			}
			else
			{
				$html.= '<optgroup label="en-US (more formats if current language) :">';
			}

			$extra_array = array(
					$extravalue_1 => $extra_1,
					$extravalue_2 => $extra_2,
					$extravalue_3 => $extra_3,
					$extravalue_4 => $extra_4,
					$extravalue_5 => $extra_5,
				);

			foreach ($extra_array as $format => $label)
			{
				$html.= '<option value="' . $format . '"';
				$html.= ($this->value == $format) ? $selected : '';
				$html.= '>' . $label . '</option>';
			}

			if (version_compare(JVERSION, '3.0', 'ge'))
			{
				$html.= '</optgroup>';
			}

			// Extra en-CA
			if (version_compare(JVERSION, '3.0', 'lt'))
			{
				$html.= '<optgroup label="en-CA :" style="font-weight:normal; color:#777777;"></optgroup>';
			}
			else
			{
				$html.= '<optgroup label="en-CA :">';
			}

			$html.= '<option value="' . $extravalue_6 . '"';
			$html.= ($this->value == $extravalue_6) ? $selected : '';
			$html.= '>' . $extra_6 . '</option>';

			if (version_compare(JVERSION, '3.0', 'ge'))
			{
				$html.= '</optgroup>';
			}

			// Extra en-SG
			if (version_compare(JVERSION, '3.0', 'lt'))
			{
				$html.= '<optgroup label="en-SG :" style="font-weight:normal; color:#777777;"></optgroup>';
			}
			else
			{
				$html.= '<optgroup label="en-SG :">';
			}

			$html.= '<option value="' . $extravalue_7 . '"';
			$html.= ($this->value == $extravalue_7) ? $selected : '';
			$html.= '>' . $extra_7 . '</option>';

			if (version_compare(JVERSION, '3.0', 'ge'))
			{
				$html.= '</optgroup>';
			}
		}


		// International Date Format (ISO)
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			$html.= '<optgroup label="&nbsp;"></optgroup>';
			$html.= '<optgroup label="' . JTEXT::_('COM_ICAGENDA_DATE_FORMAT_ISO') . '" style="font-style:normal; color:#333333;"></optgroup>';
		}
		else
		{
			$html.= '<optgroup label="' . JTEXT::_('COM_ICAGENDA_DATE_FORMAT_ISO') . '">';
		}

		$html.= '<option value="' . $iso . '"';
		$html.= ($this->value == $iso) ? $selected : '';
		$html.= '>1993-04-30</option>';

		if (version_compare(JVERSION, '3.0', 'ge'))
		{
			$html.= '</optgroup>';
		}


		// Global date formats with separator
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			$html.= '<optgroup label="&nbsp;"></optgroup>';
			$html.= '<optgroup label="' . JTEXT::_('COM_ICAGENDA_DATE_FORMAT_SEPARATOR') . '" style="font-style:normal; color:#333333;"></optgroup>';
		}


		// DMY Little-endian (day, month, year), e.g. 22.04.96 or 22/04/96
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			$html.= '<optgroup label="' . JTEXT::_('COM_ICAGENDA_DATE_FORMAT_DMY') . ' :" style="font-weight:normal; color:#777777;"></optgroup>';
		}
		else
		{
			$html.= '<optgroup label="' . JTEXT::_('COM_ICAGENDA_DATE_FORMAT_DMY') . '">';
		}

		$dmy_array = array(
				$dmy_1 => '30␣04␣1993',
				$dmy_2 => '30␣04␣93',
				$dmy_3 => '30␣04',
				$dmy_4 => '04␣93',
				$dmy_5 => isset($dmy_text_5) ? $dmy_text_5 : '',
				$dmy_6 => isset($dmy_text_6) ? $dmy_text_6 : ''
			);

		foreach ($dmy_array as $format => $label)
		{
			if ($label)
			{
				$html.= '<option value="' . $format . '"';
				$html.= ($this->value == $format) ? $selected : '';
				$html.= '>' . $label . '</option>';
			}
		}

		if (version_compare(JVERSION, '3.0', 'ge'))
		{
			$html.= '</optgroup>';
		}


		// MDY Middle-endian (month, day, year), e.g. 04/22/96
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			$html.= '<optgroup label="' . JTEXT::_('COM_ICAGENDA_DATE_FORMAT_MDY') . ' :" style="font-weight:normal; color:#777777;"></optgroup>';
		}
		else
		{
			$html.= '<optgroup label="' . JTEXT::_('COM_ICAGENDA_DATE_FORMAT_MDY') . '">';
		}

		$mdy_array = array(
				$mdy_1 => '04␣30␣1993',
				$mdy_2 => '04␣30␣93',
				$mdy_3 => '04␣30',
				$mdy_4 => '04␣93',
				$mdy_5 => isset($mdy_text_5) ? $mdy_text_5 : '',
				$mdy_6 => isset($mdy_text_6) ? $mdy_text_6 : ''
			);

		foreach ($mdy_array as $format => $label)
		{
			if ($label)
			{
				$html.= '<option value="' . $format . '"';
				$html.= ($this->value == $format) ? $selected : '';
				$html.= '>' . $label . '</option>';
			}
		}

		if (version_compare(JVERSION, '3.0', 'ge'))
		{
			$html.= '</optgroup>';
		}


		// YMD Big-endian (year, month, day), e.g. 1996-04-22
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			$html.= '<optgroup label="' . JTEXT::_('COM_ICAGENDA_DATE_FORMAT_YMD') . ' :" style="font-weight:normal; color:#777777;"></optgroup>';
		}
		else
		{
			$html.= '<optgroup label="' . JTEXT::_('COM_ICAGENDA_DATE_FORMAT_YMD') . '">';
		}

		$ymd_array = array(
				$ymd_1 => '1993␣04␣30',
				$ymd_2 => '93␣04␣30',
				$ymd_3 => '04␣30',
				$ymd_4 => '93␣04',
				$ymd_5 => isset($ymd_text_5) ? $ymd_text_5 : '',
				$ymd_6 => isset($ymd_text_6) ? $ymd_text_6 : ''
			);

		foreach ($ymd_array as $format => $label)
		{
			if ($label)
			{
				$html.= '<option value="' . $format . '"';
				$html.= ($this->value == $format) ? $selected : '';
				$html.= '>' . $label . '</option>';
			}
		}

		if (version_compare(JVERSION, '3.0', 'ge'))
		{
			$html.= '</optgroup>';
		}

		$html.= '</select>';

		return $html;
	}
}
components/com_icagenda/models/fields/icmap/lat.php000060400000004112152453623450016440 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rez�, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rez� (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.0 2015-02-15
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

/**
 * Returns Latitude from Google Maps address auto-complete field.
 */
class JFormFieldiCmap_lat extends JFormField
{
	protected $type='icmap_lat';

	protected function getInput()
	{
		// Check if coords set (deprecated)
		$id = JRequest::getVar('id');

		$class = isset($this->class) ? ' class="' . $this->class . '"' : '';

		if (isset($id))
		{
			$db	= JFactory::getDBO();
			$db->setQuery(
				'SELECT a.coordinate' .
				' FROM #__icagenda_events AS a' .
				' WHERE a.id = '.(int) $id
			);

			$coords = $db->loadResult();
		}
		else
		{
			$coords = NULL;
		}

		$session = JFactory::getSession();
		$ic_submit_lat = $session->get('ic_submit_lat', '');

		$lat_value = $ic_submit_lat ? $ic_submit_lat : $this->value;

		if ($coords != NULL
			&& $lat_value == '0.0000000000000000')
		{
			$ex			= explode(', ', $coords);
			$lat_value	= $ex[0];
		}
		elseif ($lat_value != '0.0000000000000000')
		{
			$lat_value	= $lat_value;
		}
		else
		{
			$lat_value	= NULL;
		}

		$html= '<div class="clr"></div>';
		$html.= '<label class="icmap-label">' . JText::_('COM_ICAGENDA_GOOGLE_MAPS_LATITUDE_LBL') . '</label> <input name="' . $this->name . '" id="lat" type="text"' . $class . ' value="' . $lat_value . '"/>';

		// clear the data so we don't process it again
		$session->clear('ic_submit_lat');

		return $html;
	}
}

components/com_icagenda/models/fields/icmap/city.php000060400000003031152453623450016627 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rez�, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rez� (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.0 2015-02-25
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

/**
 * Returns City from Google Maps address auto-complete field.
 */
class JFormFieldiCmap_city extends JFormField
{
	protected $type='icmap_city';

	protected function getInput()
	{
		$session = JFactory::getSession();
		$ic_submit_city = $session->get('ic_submit_city', '');

		$city_value = $ic_submit_city ? $ic_submit_city : $this->value;

		$class = isset($this->class) ? ' class="' . $this->class . '"' : '';

		$html = '<div class="clr"></div>';
		$html.= '<label class="icmap-label">' . JText::_('COM_ICAGENDA_FORM_LBL_EVENT_CITY') . '</label> <input name="' . $this->name . '" id="locality" type="text"' . $class . ' value="' . $city_value . '"/>';

		// clear the data so we don't process it again
		$session->clear('ic_submit_city');

		return $html;
	}
}
components/com_icagenda/models/fields/icmap/index.html000060400000000032152453623450017141 0ustar00<html><body></body></html>components/com_icagenda/models/fields/icmap/lng.php000060400000004112152453623450016440 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rez�, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rez� (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.0 2015-02-15
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

/**
 * Returns Latitude from Google Maps address auto-complete field.
 */
class JFormFieldiCmap_lng extends JFormField
{
	protected $type='icmap_lng';

	protected function getInput()
	{
		// Check if coords set (deprecated)
		$id = JRequest::getVar('id');

		$class = isset($this->class) ? ' class="' . $this->class . '"' : '';

		if (isset($id))
		{
			$db	= JFactory::getDBO();
			$db->setQuery(
				'SELECT a.coordinate' .
				' FROM #__icagenda_events AS a' .
				' WHERE a.id = '.(int) $id
			);

			$coords = $db->loadResult();
		}
		else
		{
			$coords = NULL;
		}

		$session = JFactory::getSession();
		$ic_submit_lng = $session->get('ic_submit_lng', '');

		$lng_value = $ic_submit_lng ? $ic_submit_lng : $this->value;

		if ($coords != NULL
			&& $lng_value == '0.0000000000000000')
		{
			$ex			= explode(', ', $coords);
			$lng_value	= $ex[1];
		}
		elseif ($lng_value != '0.0000000000000000')
		{
			$lng_value	= $lng_value;
		}
		else
		{
			$lng_value	= NULL;
		}

		$html= '<div class="clr"></div>';
		$html.= '<label class="icmap-label">' . JText::_('COM_ICAGENDA_GOOGLE_MAPS_LONGITUDE_LBL') . '</label> <input name="' . $this->name . '" id="lng" type="text"' . $class . ' value="' . $lng_value . '"/>';

		// clear the data so we don't process it again
		$session->clear('ic_submit_lng');

		return $html;
	}
}
components/com_icagenda/models/fields/icmap/country.php000060400000003072152453623450017367 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rez�, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rez� (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.0 2015-02-25
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

/**
 * Returns Country from Google Maps address auto-complete field.
 */
class JFormFieldiCmap_country extends JFormField
{
	protected $type='icmap_country';

	protected function getInput()
	{
		$session = JFactory::getSession();
		$ic_submit_country = $session->get('ic_submit_country', '');

		$country_value = $ic_submit_country ? $ic_submit_country : $this->value;

		$class = isset($this->class) ? ' class="' . $this->class . '"' : '';

		$html = '<div class="clr"></div>';
		$html.= '<label class="icmap-label">' . JText::_('COM_ICAGENDA_FORM_LBL_EVENT_COUNTRY') . '</label> <input name="' . $this->name . '" id="country" type="text"' . $class . ' value="' . $country_value . '" />';

		// clear the data so we don't process it again
		$session->clear('ic_submit_country');

		return $html;
	}
}
components/com_icagenda/models/fields/modal/tos_article.php000060400000015034152453623450020200 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.2.0 2013-09-18
 * @since       3.2.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * Supports a modal article picker.
 */
class JFormFieldModal_tos_article extends JFormField
{
	/**
	 * The form field type.
	 */
	protected $type = 'modal_tos_article';

//	protected function getLabel()
//	{
//	   return ' ';
//	}

	/**
	 * Method to get the field input markup.
	 */
	protected function getInput()
	{
		$icagendaParams = JComponentHelper::getParams('com_icagenda');
		$tos_Type = $icagendaParams->get('tos_Type', '1');

		$allowEdit		= ((string) $this->element['edit'] == 'true') ? true : false;
		$allowClear		= ((string) $this->element['clear'] != 'false') ? true : false;

		// Load language
		JFactory::getLanguage()->load('com_content', JPATH_ADMINISTRATOR);

		// Load the modal behavior script.
		JHtml::_('behavior.modal', 'a.modal');

		// Build the script.
		$script = array();

		// Select button script
		$script[] = '	function jSelectArticle_'.$this->id.'(id, title, catid, object) {';
		$script[] = '		document.getElementById("'.$this->id.'_id").value = id;';
		$script[] = '		document.getElementById("'.$this->id.'_name").value = title;';

		if ($allowEdit)
		{
			$script[] = '		jQuery("#'.$this->id.'_edit").removeClass("hidden");';
		}

		if ($allowClear)
		{
			$script[] = '		jQuery("#'.$this->id.'_clear").removeClass("hidden");';
		}

		$script[] = '		SqueezeBox.close();';
		$script[] = '	}';

		// Clear button script
		static $scriptClear;

		if ($allowClear && !$scriptClear)
		{
			$scriptClear = true;

			$script[] = '	function jClearArticle(id) {';
			$script[] = '		document.getElementById(id + "_id").value = "";';
			$script[] = '		document.getElementById(id + "_name").value = "'.htmlspecialchars(JText::_('COM_CONTENT_SELECT_AN_ARTICLE', true), ENT_COMPAT, 'UTF-8').'";';
			$script[] = '		jQuery("#"+id + "_clear").addClass("hidden");';
			$script[] = '		if (document.getElementById(id + "_edit")) {';
			$script[] = '			jQuery("#"+id + "_edit").addClass("hidden");';
			$script[] = '		}';
			$script[] = '		return false;';
			$script[] = '	}';
		}

		// Add the script to the document head.
		JFactory::getDocument()->addScriptDeclaration(implode("\n", $script));

		// Setup variables for display.
		$html	= array();
		$link	= 'index.php?option=com_content&amp;view=articles&amp;layout=modal&amp;tmpl=component&amp;function=jSelectArticle_'.$this->id;

		if (isset($this->element['language']))
		{
			$link .= '&amp;forcedLanguage='.$this->element['language'];
		}

		$db	= JFactory::getDbo();
		$db->setQuery(
			'SELECT title' .
			' FROM #__content' .
			' WHERE id = '.(int) $this->value
		);

		try
		{
			$title = $db->loadResult();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $e->getMessage());
		}

		if (empty($title))
		{
			$title = JText::_('COM_CONTENT_SELECT_AN_ARTICLE');
		}
		$title = htmlspecialchars($title, ENT_QUOTES, 'UTF-8');

		// The active article id field.
		if (0 == (int) $this->value)
		{
			$value = '';
		}
		else
		{
			$value = (int) $this->value;
		}

		// The current article display field.
		$html[] = '<div id="ic_article"><fieldset class="span9 iCleft"><div>&nbsp;</div><span class="input-append">';
		$html[] = '<input type="text" class="input-medium" style="margin:0px" id="'.$this->id.'_name" value="'.$title.'" disabled="disabled" size="35" />';

		if(version_compare(JVERSION, '3.0', 'lt')) {
			$html[] = '<a class="modal btn hasTooltip" title="'.JText::_('COM_CONTENT_CHANGE_ARTICLE').'"  href="'.$link.'&amp;'.JSession::getFormToken().'=1" rel="{handler: \'iframe\', size: {x: 800, y: 450}}">'.JText::_('JSELECT').'</a>';
		} else {
			$html[] = '<a class="modal btn hasTooltip" title="'.JHtml::tooltipText('COM_CONTENT_CHANGE_ARTICLE').'"  href="'.$link.'&amp;'.JSession::getFormToken().'=1" rel="{handler: \'iframe\', size: {x: 800, y: 450}}"><i class="icon-file"></i> '.JText::_('JSELECT').'</a>';
		}

		// Edit article button
		if ($allowEdit)
		{
			if(version_compare(JVERSION, '3.0', 'lt')) {
				$html[] = '<a class="btn hasTooltip'.($value ? '' : ' hidden').'" href="index.php?option=com_content&view=article&layout=edit&id=' . $value. '" target="_blank" title="'.JText::_('COM_CONTENT_EDIT_ARTICLE').'" alt="'.JText::_('COM_CONTENT_EDIT_ARTICLE').'" >' . JText::_('JACTION_EDIT') . '</a>';
			} else {
				$html[] = '<a class="btn hasTooltip'.($value ? '' : ' hidden').'" href="index.php?option=com_content&layout=modal&tmpl=component&task=article.edit&id=' . $value. '" target="_blank" title="'.JHtml::tooltipText('COM_CONTENT_EDIT_ARTICLE').'" ><span class="icon-edit"></span> ' . JText::_('JACTION_EDIT') . '</a>';
			}
		}

		// Clear article button
		if ($allowClear)
		{
			if(version_compare(JVERSION, '3.0', 'lt')) {
				$html[] = '<a id="'.$this->id.'_clear" class="btn'.($value ? '' : ' hidden').'" onclick="return jClearArticle(\''.$this->id.'\')">' . JText::_('JCLEAR') . '</a>';
			} else {
				$html[] = '<button id="'.$this->id.'_clear" class="btn'.($value ? '' : ' hidden').'" onclick="return jClearArticle(\''.$this->id.'\')"><span class="icon-remove"></span> ' . JText::_('JCLEAR') . '</button>';
			}
		}

		$html[] = '</span>';

		// class='required' for client side validation
		$class = '';
		if ($this->required)
		{
			$class = ' class="required modal-value"';
		}


		$html[] = '<input type="hidden" id="'.$this->id.'_id"'.$class.' name="'.$this->name.'" value="'.$value.'" /></fieldset></div>';

//		if ($tos_Type == 'on') {
//			$tos_Type = '1';
//		}
		if ($tos_Type == '1') {
			$html[] = '<script type="text/javascript">';
			$html[] = 'document.getElementById("ic_default").style.display = "none";';
			$html[] = 'document.getElementById("ic_article").style.display = "block";';
			$html[] = 'document.getElementById("tos_custom").style.display = "none";';
			$html[] = '</script>';
		} else {
			$html[] = '<script type="text/javascript">';
			$html[] = 'document.getElementById("ic_article").style.display = "none";';
			$html[] = '</script>';
		}


		return implode("\n", $html);
	}
}
components/com_icagenda/models/fields/modal/evt_date.php000060400000007245152453623450017470 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.9 2015-07-30
 * @since       3.3.3
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_evt_date extends JFormField
{
	protected $type = 'modal_evt_date';

	protected function getInput()
	{
		$jinput	= JFactory::getApplication()->input;
		$view	= $jinput->get('view');

		$id		= ($view == 'mail') ? $jinput->get('eventid', '0') : $jinput->get('id', '0');

		if ($id != 0)
		{
			$db		= JFactory::getDbo();
			$query	= $db->getQuery(true);
			$query->select('r.id as reg_id, r.date AS reg_date, r.period AS reg_period, r.eventid AS reg_eventid, sum(r.people) AS reg_count')
				->from('`#__icagenda_registration` AS r');

			if ($view == 'mail')
			{
				$query->where('r.state = 1');
				$query->group('r.date');
			}

			$query->where('r.eventid = ' . (int) $id);

			$db->setQuery($query);

			if ($view == 'mail')
			{
				$result = $db->loadObjectList();
			}
			else
			{
				$result = $db->loadObject();
				$event_id	= $result->reg_eventid;
				$saveddate	= $result->reg_date;
			}
		}
		elseif ($view == 'registration')
		{
			$event_id	= '';
			$saveddate	= '';
		}

		if ($view == 'registration')
		{
			// Test if date saved in in datetime data format
			$date_is_datetime_sql	= false;
			$array_ex_date			= array('-', ' ', ':');
			$d_ex					= str_replace($array_ex_date, '-', $saveddate);
			$d_ex					= explode('-', $d_ex);

			if (count($d_ex) > 4)
			{
				if (   strlen($d_ex[0]) == 4
					&& strlen($d_ex[1]) == 2
					&& strlen($d_ex[2]) == 2
					&& strlen($d_ex[3]) == 2
					&& strlen($d_ex[4]) == 2   )
				{
					$date_is_datetime_sql = true;
				}
			}

			// Test if registered date before 3.3.3 could be converted
			// Control if new date format (Y-m-d H:i:s)
			$input		= trim($saveddate);
			$is_valid	= date('Y-m-d H:i:s', strtotime($input)) == $input;

			if ($is_valid
				&& strtotime($saveddate))
			{
				$date_get		= explode (' ', $saveddate);
				$saved_date		= $date_get['0'];
				$saved_time		= date('H:i:s', strtotime($date_get['1']));
			}
			else
			{
				// Explode to test if stored in old format in database
				$ex_saveddate	= explode (' - ', $saveddate);
				$saved_date		= isset($ex_saveddate['0']) ? trim($ex_saveddate['0']) : '';
				$saved_time		= isset($ex_saveddate['1']) ? trim(date('H:i:s', strtotime($ex_saveddate['1']))) : '';
			}

			$data_eventid = $event_id;

			$eventid_url = JRequest::getVar('eventid', '');

			if ( ! $date_is_datetime_sql && $saveddate )
			{
				$saveddate_text = '"<b>' . $saveddate . '</b>"';
				echo '<div class="ic-alert ic-alert-note"><span class="iCicon-info"></span> <strong>' . JText::_('NOTICE') . '</strong><br />'
					. JText::sprintf('COM_ICAGENDA_REGISTRATION_ERROR_DATE_CONTROL', $saveddate_text) . '</div>';
			}

			$event_id = isset($event_id) ? $eventid_url : '';

			$html = '<select name="' . $this->name . '" id="' . $this->id . '_id" data-chosen="true"></select>';
		}
		else
		{
			$html = '<select name="' . $this->name . '" id="' . $this->id . '_id" data-chosen="true"></select>';
		}

		return $html;
	}
}
components/com_icagenda/models/fields/modal/ph_regbt.php000060400000002610152453623450017456 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.1.3 2013-08-08
 * @since       3.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_ph_regbt extends JFormField
{
	protected $type='modal_ph_regbt';

	protected function getInput()
	{
		$class = JRequest::getVar('class');

		jimport('joomla.application.component.helper');
		$icagendaParams = JComponentHelper::getParams('com_icagenda');
		$extRegButtonText = $icagendaParams->get('RegButtonText');

		if (!isset($extRegButtonText)) { $extRegButtonText = JText::_( 'COM_ICAGENDA_REGISTRATION_REGISTER'); }

		$html ='<input type="text" id="'.$this->id.'" class="'.$class.'" name="'.$this->name.'" value="'.$this->value.'" placeholder="'.$extRegButtonText.'"/>';

		return $html;
	}
}
components/com_icagenda/models/fields/modal/icvalue_field.php000060400000003350152453623450020461 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.2.3 2013-10-17
 * @since       3.2.3
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_icvalue_field extends JFormField
{
	protected $type='modal_icvalue_field';

	protected function getInput()
	{

		$Explode = explode('_', $this->name);
		$TypeName = $Explode[0].']';

		$replace = array("jform", "[params]", "[", "]");
		$name = str_replace($replace, "", $TypeName);

		$Type_default = $name.'_default';
		$Type_content = $name.'_custom';

		$html	= array();

		$html[] = '<div id="'.$Type_content.'"><fieldset class="span9 iCleft">';
		$html[] = '<input type="text" value="'.$this->value.'" name="'.$this->name.'"/>';
		$html[] = '</fieldset></div>';

		$html[] = '<script type="text/javascript">';
		$html[] = 'if (typeset == 1) {';
		$html[] = 'document.getElementById("'.$Type_content.'").style.display = "block";';
		$html[] = '}';
		$html[] = 'if (typeset == 0) {';
		$html[] = 'document.getElementById("'.$Type_content.'").style.display = "none";';
		$html[] = '}';
		$html[] = '</script>';

		return implode("\n", $html);
	}
}
components/com_icagenda/models/fields/modal/ictextarea_counter.php000060400000013220152453623450021553 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.0 2015-02-14
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

/**
 * Textarea with a counter. Short Description and Meta Description
 *
 * @package		iCagenda
 * @subpackage	com_icagenda
 * @since		3.4.0
 */
class JFormFieldModal_ictextarea_counter extends JFormField
{
	protected $type = 'modal_ictextarea_counter';

	protected function getInput()
	{
		$app		= JFactory::getApplication();
		$replace	= array("jform", "[", "]");
		$name		= str_replace($replace, "", $this->name);
		$nb_chars	= strlen(trim(utf8_decode($this->value)));
		$class		= !empty($this->class) ? ' class="' . $this->class . '"' : '';

		if ($app->isAdmin())
		{
			$params	= JComponentHelper::getParams('com_icagenda');
			$iCparams	= JComponentHelper::getParams('com_icagenda');
		}
		else
		{
			$params	= $app->getParams();
			$iCparams	= JComponentHelper::getParams('com_icagenda');
		}

		$session = JFactory::getSession();
		$ic_submit_shortdesc = $session->get('ic_submit_shortdesc', '');
		$ic_submit_metadesc = $session->get('ic_submit_metadesc', '');

		$event_shortdesc = $ic_submit_shortdesc ? $ic_submit_shortdesc : $this->value;
		$event_metadesc = $ic_submit_metadesc ? $ic_submit_metadesc : $this->value;

		if ($name == 'shortdesc')
		{
			$ic_max_component	= $iCparams->get('char_limit_short_description', '100');
			$ic_max				= $params->get('char_limit_short_description', '100');
			$ic_max				= ($ic_max_component >= $ic_max) ? $ic_max : $ic_max_component;
		}
		elseif ($name == 'metadesc')
		{
			$ic_max_component	= $iCparams->get('char_limit_meta_description', '160');
			$ic_max				= $params->get('char_limit_meta_description', '160');
			$ic_max				= ($ic_max_component >= $ic_max) ? $ic_max : $ic_max_component;
		}
		else
		{
			$ic_max = $params->get('ShortDescLimit', '100');
		}

		// Alert if text stored in the database exceeds the character limit currently set.
		$display_alert	= ($nb_chars > $ic_max) ? true : false;

		$count_value = $nb_chars ? ($ic_max-$nb_chars) : $ic_max;
		$ic_size = (strlen($ic_max))-1;
		$ic_size = $ic_size ? $ic_size : '1';

		$counter_input = '<input id="' . $name . '-counter"';
//		$counter_input.= ' onblur="iCtextCounter(this.form.' . $this->name . ', this, ' . $ic_max . ');"';
		$counter_input.= ' class="valid"';
//		$counter_input.= ' onfocus="this.blur();"';
//		$counter_input.= ' tabindex="999" maxlength="' . $ic_size . '" size="' . $ic_size . '"';
		$counter_input.= ' size="' . $ic_size . '"';
		$counter_input.= ' value="' . $count_value . '"';
		$counter_input.= ' name="counter_' . $name . '">';

		$html = '<div>';

		if ($display_alert)
		{
			$html.= '<div class="alert alert-danger"><h3>Warning</h3><strong>'
					. JText::sprintf('COM_ICAGENDA_ALERT_S_TEXT_S_EXCEEDS_CHARACTER_LIMIT', $this->title) . '</strong><br />'
					. JText::_('COM_ICAGENDA_ALERT_EDIT_TEXT_TO_FIT_CHAR_LIMIT') . '<br /><br /><u>'
					. JText::sprintf('COM_ICAGENDA_ALERT_S_TEXT_S_CURRENTLY_STORED_IN_DATABASE', $this->title) . '</u> :<br/><i>'
					. $this->value . '</i></div>';
		}
		$html.= '<textarea';
		$html.= ' onKeyPress="iCtextCounter(this, this.form.counter_' . $name.', ' . $ic_max . ');"';
		$html.= ' onKeyUp="iCtextCounter(' . $name . ', counter_' . $name . ', ' . $ic_max . ');"';
		$html.= ' onkeydown="iCtextCounter(' . $name . ', counter_' . $name . ', ' . $ic_max . ');"';
		$html.= ' onmouseout="iCtextCounter(' . $name . ', counter_' . $name . ', ' . $ic_max . ');"';
//		$html.= ' onpaste="' . $name . 'useractions();"';
		$html.= $class . ' name="' . $this->name . '" id="' . $name . '">';

		if ($name == 'shortdesc')
		{
			$html.= $event_shortdesc;

			// clear the data so we don't process it again
			$session->clear('ic_submit_shortdesc');
		}
		elseif ($name == 'metadesc')
		{
			$html.= $event_metadesc;

			// clear the data so we don't process it again
			$session->clear('ic_submit_metadesc');
		}
		else
		{
			$html.= $this->value;
		}

		$html.= '</textarea>';

		$html.= '</div>';
		$html.= '<div id="'.$name.'-counter-container" class="ic-counter-container">';
		$html.= '<div class="ic-counter">';
		$html.= JText::sprintf('COM_ICAGENDA_MAXIMUM_N_CHARACTERS', $ic_max);
		$html.= '</div> ';
		$html.= '<div class="ic-counter">';
		$html.= JText::sprintf('COM_ICAGENDA_N_REMAINING', $counter_input);
		$html.= '</div>';
		$html.= '</div>';
		$html.= '<div>&nbsp;</div>';

//		$html.= '<textarea';
//		$html.= ' onMouseOut="CheckFieldLength(this.' . $name . ', \'' . $name . '_charcount\', \'' . $name . '_remaining\', 140);"';
//		$html.= ' onKeyDown="CheckFieldLength(this.' . $name . ', \'' . $name . '_charcount\', \'' . $name . '_remaining\', 140);"';
//		$html.= ' onkeyup="CheckFieldLength(this.' . $name . ', \'' . $name . '_charcount\', \'' . $name . '_remaining\', 140);"';
//		$html.= $class . ' name="' . $this->name . '" id ="' . $name . '">';
//		$html.= '</textarea>';
//		$html.= '<h2><span id="' . $name . '_charcount">0</span> characters entered   | <span id="' . $name . '_remaining">140</span> characters remaining</h2>';

		return $html;
	}
}
components/com_icagenda/models/fields/modal/thumbs.php000060400000011033152453623450017165 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.2 2015-03-13
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_thumbs extends JFormField
{
	protected $type='modal_thumbs';

	protected function getInput()
	{
		$replace = array("jform", "params", "[", "]");
		$name_input = str_replace($replace, "", $this->name);

		jimport('joomla.application.component.helper');
		$iCparams = JComponentHelper::getParams('com_icagenda');

		if ($name_input == 'thumb_large')
		{
			$thumbOptions = $iCparams->get('thumb_large');
			$width = is_numeric($thumbOptions[0]) ? $thumbOptions[0] : '900';
			$height = is_numeric($thumbOptions[1]) ? $thumbOptions[1] : '600';
			$quality = is_numeric($thumbOptions[2]) ? $thumbOptions[2] : '100';
			$crop = $thumbOptions[3] ? $thumbOptions[3] : false;
			$default_width = '900';
			$default_height = '600';
			$default_quality = '100';
			$default_crop = '0';
		}
		elseif ($name_input == 'thumb_medium')
		{
			$thumbOptions = $iCparams->get('thumb_medium');
			$width = is_numeric($thumbOptions[0]) ? $thumbOptions[0] : '300';
			$height = is_numeric($thumbOptions[1]) ? $thumbOptions[1] : '300';
			$quality = is_numeric($thumbOptions[2]) ? $thumbOptions[2] : '100';
			$crop = $thumbOptions[3] ? $thumbOptions[3] : false;
			$default_width = '300';
			$default_height = '300';
			$default_quality = '100';
			$default_crop = '0';
		}
		elseif ($name_input == 'thumb_small')
		{
			$thumbOptions = $iCparams->get('thumb_small');
			$width = is_numeric($thumbOptions[0]) ? $thumbOptions[0] : '100';
			$height = is_numeric($thumbOptions[1]) ? $thumbOptions[1] : '100';
			$quality = is_numeric($thumbOptions[2]) ? $thumbOptions[2] : '100';
			$crop = $thumbOptions[3] ? $thumbOptions[3] : false;
			$default_width = '100';
			$default_height = '100';
			$default_quality = '100';
			$default_crop = '0';
		}
		elseif ($name_input == 'thumb_xsmall')
		{
			$thumbOptions = $iCparams->get('thumb_xsmall');
			$width = is_numeric($thumbOptions[0]) ? $thumbOptions[0] : '48';
			$height = is_numeric($thumbOptions[1]) ? $thumbOptions[1] : '48';
			$quality = is_numeric($thumbOptions[2]) ? $thumbOptions[2] : '80';
			$crop = $thumbOptions[3] ? $thumbOptions[3] : true;
			$default_width = '48';
			$default_height = '48';
			$default_quality = '80';
			$default_crop = '1';
		}

		$crop_false = $crop_true = '';

		if (!empty($crop))
		{
			$crop_true = ' selected="selected"';
		}
		else
		{
			$crop_false = ' selected="selected"';
		}

		$quality_80 = '';

		if ($quality == '80')
		{
			$quality_80 =  ' selected="selected"';
		}

		$quality_values = array('100', '95', '90', '85', '80', '75', '70', '60', '50');

		$html = array();

		$html[] = '<div class="span2">' . JText::_('IC_WIDTH') . '<br />';
		$html[] = '<input type="text" class="input-mini" name="'.$this->name.'[]" value="'.$width.'" default="'.$default_width.'"/></div>';

		$html[] = '<div class="span2">' . JText::_('IC_HEIGHT') . '<br />';
		$html[] = '<input type="text" class="input-mini" name="'.$this->name.'[]" value="'.$height.'" default="'.$default_height.'"/></div>';

		$html[] = '<div class="span2">' . JText::_('IC_QUALITY') . '<br />';
		$html[] = '<select id="ThumbMedium_quality" class="input-small" name="'.$this->name.'[]" value="'.$quality.'">';

		foreach ($quality_values AS $qv)
		{
			$html[] = '<option value="'.$qv.'"';

			if ($qv == $quality)
			{
				$html[] = ' selected="selected"';
			}

			$html[] = '>' . JText::_('IC'.$qv.'') . '</option>';
		}

		$html[] = '</select></div>';

		$html[] = '<div class="span2">' . JText::_('IC_CROPPED') . '<br />';
		$html[] = '<select id="ThumbMedium_crop" class="input-small" name="' . $this->name . '[]" value="' . $crop . '">';
		$html[] = '<option value="0" ' . $crop_false . '>'.JText::_('JNO').'</option>';
		$html[] = '<option value="1" ' . $crop_true . '>'.JText::_('JYES').'</option>';
		$html[] = '</select></div>';

		return implode("\n", $html);
	}
}
components/com_icagenda/models/fields/modal/startdate.php000060400000003111152453623450017654 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.10 2015-08-13
 * @since       2.0.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.filesystem.path');
jimport('joomla.form.formfield');

/**
 * Form Field to load a startdate datetime picker input
 *
 * @since	2.0.0
 */
class JFormFieldModal_startdate extends JFormField
{
	protected $type = 'modal_startdate';

	protected function getInput()
	{
		$class = ! empty($this->class) ? ' class="' . $this->class . '"' : '';

		$lang = JFactory::getLanguage();

		if ($lang->getTag() == 'fa-IR')
		{
			// Including fallback code for HTML5 non supported browsers.
			JHtml::_('jquery.framework');
			JHtml::_('script', 'system/html5fallback.js', false, true);

			$attributes = '';

			$html = JHtml::_('calendar', $this->value, $this->name, 'startdate_jalali', '%Y-%m-%d %H:%M:%S', $attributes);
		}
		else
		{
			$html ='<input type="text" id="startdate"' . $class . ' name="' . $this->name . '" value="' . $this->value . '"/>';
		}

		return $html;
	}
}
components/com_icagenda/models/fields/modal/ictxt_content.php000060400000003772152453623450020563 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.2.5 2013-11-10
 * @since       3.2.5
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_ictxt_content extends JFormField
{
	/**
	 * The form field type.
	 */
	protected $type = 'modal_ictxt_content';

	/**
	 * Method to get the field input markup.
	 */
	protected function getInput()
	{
		jimport('joomla.application.component.helper');
		$icagendaParams = JComponentHelper::getParams('com_icagenda');

		$replace = array("jform", "[", "]", "Content");
		$name = str_replace($replace, "", $this->name);

		$tosContent = $icagendaParams->get($name.'Content', '');
		$tos_Type = $icagendaParams->get($name.'_Type', '');

		$editor = JFactory::getEditor();

		$html	= array();

		$html[] = '<div id="'.$name.'_custom"><fieldset class="span9 iCleft">';
		$html[] = $editor->display($this->name, $tosContent, "100%", "300", "300", "20", 1, null, null, null, array('mode' => 'advanced'));
		$html[] = '</fieldset></div>';

		if ($tos_Type == '2') {
			$html[] = '<script type="text/javascript">';
			$html[] = 'document.getElementById("'.$name.'_custom").style.display = "block";';
			$html[] = '</script>';
		} else {
			$html[] = '<script type="text/javascript">';
			$html[] = 'document.getElementById("'.$name.'_custom").style.display = "none";';
			$html[] = '</script>';
		}

		return implode("\n", $html);
	}
}
components/com_icagenda/models/fields/modal/coordinate.php000060400000002731152453623450020017 0ustar00<?php
/** 
 *	iCagenda
 *----------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright	Copyright (C) 2012 JOOMLIC - All rights reserved.
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Jooml!C - http://www.joomlic.com
 * 
 * @update		2013-04-18
 * @version		2.1.7
 *----------------------------------------------------------------------------
*/

// No direct access to this file
defined( '_JEXEC' ) or die( 'Restricted access' );

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');


class JFormFieldModal_coordinate extends JFormField
{
	protected $type='modal_coordinate';
	
	protected function getInput()
	{	
		$def=JRequest::getVar('def');
		if ($def=='')$def=$this->value;
	
	
	
		$html= '
			<!--div class="clr"></div>
			<div id="map_canvas" style="width:100%; height:300px"></div><br/>
			<label>'.JText::_('COM_ICAGENDA_FORM_LBL_EVENT_GPS').'</label>&nbsp;<input name="'.$this->name.'" id="jform_coordinate" type="text" size="41" value="'.$def.'"/-->
			<div class="clr"></div>
			<!--input name="latitude" id="lat" type="text"/>
			<input name="longitude" id="lng" type="text"/-->';

		
			$html.= '<input name="'.$this->name.'" id="lat" type="text" size="41" value="'.$this->value.'"/>
		<!--script>
			document.getElementById("coords").value=document.getElementById("lat").value+", "+document.getElementById("lng").value;
		</script-->';

		return $html;
	}
}components/com_icagenda/models/fields/modal/checkdnsrr.php000060400000003055152453623450020016 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.1.7 2013-08-28
 * @since       3.1.7
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_checkdnsrr extends JFormField
{
	protected $type='modal_checkdnsrr';

	protected function getInput()
	{
		$test='0';
		if (function_exists('checkdnsrr')) {
			$test='1';
		}
		if ($test!=1) {
			if(version_compare(JVERSION, '3.0', 'lt')) {
				$html='<label style="color:red"><b> '.JText::_('COM_ICAGENDA_REGISTRATION_EMAIL_CHECKDNSRR_NOT_PRESENT_1').'</b><br/>'.JText::_('COM_ICAGENDA_REGISTRATION_EMAIL_CHECKDNSRR_NOT_PRESENT_2').'</label><br/>';
			} else {
				$html='<div class="alert alert-error"><span class="icon-warning"></span><b> '.JText::_('COM_ICAGENDA_REGISTRATION_EMAIL_CHECKDNSRR_NOT_PRESENT_1').'</b><br/>'.JText::_('COM_ICAGENDA_REGISTRATION_EMAIL_CHECKDNSRR_NOT_PRESENT_2').'</div>';
			}
			return $html;
		} else {
			return false;
		}

	}
}
components/com_icagenda/models/fields/modal/period.php000060400000002542152453623450017152 0ustar00<?php
/** 
 *	iCagenda
 *----------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright	Copyright (C) 2012 JOOMLIC - All rights reserved.
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Jooml!C - http://www.joomlic.com
 * 
 * @since		1.3
 *----------------------------------------------------------------------------
*/

// No direct access to this file
defined( '_JEXEC' ) or die( 'Restricted access' );

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');


JText::script('COM_ICAGENDA_TP_CURRENT');
JText::script('COM_ICAGENDA_TP_CLOSE');
JText::script('COM_ICAGENDA_TP_TITLE');
JText::script('COM_ICAGENDA_TP_TIME');
JText::script('COM_ICAGENDA_TP_HOUR');
JText::script('COM_ICAGENDA_TP_MINUTE');


class JFormFieldModal_period extends JFormField
{
	protected $type='modal_period';
	
	protected function getInput()
	{
		$html ='<script>
		$(function(){
			$(\'#jform_period\').datetimepicker({
				dateFormat: \'yy-mm-dd\',
				hourGrid: 4,
				minuteGrid: 10
			});
		})

		</script>
		<input type="text" id="'.$this->id.'" class="'.$this->class.'" name="'.$this->name.'" value="'.$this->value.'"/>';
		$html ='<input type="text" id="'.$this->id.'" class="'.$this->class.'" name="'.$this->name.'" value="'.$this->value.'"/>';
			
		return $html;
	}
}components/com_icagenda/models/fields/modal/ictxt_article.php000060400000014612152453623450020527 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.2.5 2013-11-10
 * @since       3.2.5
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * Supports a modal article picker.
 */
class JFormFieldModal_ictxt_article extends JFormField
{
	/**
	 * The form field type.
	 */
	protected $type = 'modal_ictxt_article';

	/**
	 * Method to get the field input markup.
	 */
	protected function getInput()
	{
		$icagendaParams = JComponentHelper::getParams('com_icagenda');

		$replace = array("jform", "[", "]", "Article");
		$name = str_replace($replace, "", $this->name);

		$tos_Type = $icagendaParams->get($name.'_Type', '');

		$allowEdit		= ((string) $this->element['edit'] == 'true') ? true : false;
		$allowClear		= ((string) $this->element['clear'] != 'false') ? true : false;

		// Load language
		JFactory::getLanguage()->load('com_content', JPATH_ADMINISTRATOR);

		// Load the modal behavior script.
		JHtml::_('behavior.modal', 'a.modal');

		// Build the script.
		$script = array();

		// Select button script
		$script[] = '	function jSelectArticle_'.$this->id.'(id, title, catid, object) {';
		$script[] = '		document.getElementById("'.$this->id.'_id").value = id;';
		$script[] = '		document.getElementById("'.$this->id.'_name").value = title;';

		if ($allowEdit)
		{
			$script[] = '		jQuery("#'.$this->id.'_edit").removeClass("hidden");';
		}

		if ($allowClear)
		{
			$script[] = '		jQuery("#'.$this->id.'_clear").removeClass("hidden");';
		}

		$script[] = '		SqueezeBox.close();';
		$script[] = '	}';

		// Clear button script
		static $scriptClear;

		if ($allowClear && !$scriptClear)
		{
			$scriptClear = true;

			$script[] = '	function jClearArticle(id) {';
			$script[] = '		document.getElementById(id + "_id").value = "";';
			$script[] = '		document.getElementById(id + "_name").value = "'.htmlspecialchars(JText::_('COM_CONTENT_SELECT_AN_ARTICLE', true), ENT_COMPAT, 'UTF-8').'";';
			$script[] = '		jQuery("#"+id + "_clear").addClass("hidden");';
			$script[] = '		if (document.getElementById(id + "_edit")) {';
			$script[] = '			jQuery("#"+id + "_edit").addClass("hidden");';
			$script[] = '		}';
			$script[] = '		return false;';
			$script[] = '	}';
		}

		// Add the script to the document head.
		JFactory::getDocument()->addScriptDeclaration(implode("\n", $script));

		// Setup variables for display.
		$html	= array();
		$link	= 'index.php?option=com_content&amp;view=articles&amp;layout=modal&amp;tmpl=component&amp;function=jSelectArticle_'.$this->id;

		if (isset($this->element['language']))
		{
			$link .= '&amp;forcedLanguage='.$this->element['language'];
		}

		$db	= JFactory::getDbo();
		$db->setQuery(
			'SELECT title' .
			' FROM #__content' .
			' WHERE id = '.(int) $this->value
		);

		try
		{
			$title = $db->loadResult();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $e->getMessage());
		}

		if (empty($title))
		{
			$title = JText::_('COM_CONTENT_SELECT_AN_ARTICLE');
		}
		$title = htmlspecialchars($title, ENT_QUOTES, 'UTF-8');

		// The active article id field.
		if (0 == (int) $this->value)
		{
			$value = '';
		}
		else
		{
			$value = (int) $this->value;
		}

		// The current article display field.
		$html[] = '<div id="'.$name.'_article"><fieldset class="span9 iCleft"><div>&nbsp;</div><span class="input-append">';
		$html[] = '<input type="text" class="input-medium" style="margin:0px" id="'.$this->id.'_name" value="'.$title.'" disabled="disabled" size="35" />';

		if(version_compare(JVERSION, '3.0', 'lt')) {
			$html[] = '<a class="modal btn hasTooltip" title="'.JText::_('COM_CONTENT_CHANGE_ARTICLE').'"  href="'.$link.'&amp;'.JSession::getFormToken().'=1" rel="{handler: \'iframe\', size: {x: 800, y: 450}}">'.JText::_('JSELECT').'</a>';
		} else {
			$html[] = '<a class="modal btn hasTooltip" title="'.JHtml::tooltipText('COM_CONTENT_CHANGE_ARTICLE').'"  href="'.$link.'&amp;'.JSession::getFormToken().'=1" rel="{handler: \'iframe\', size: {x: 800, y: 450}}"><i class="icon-file"></i> '.JText::_('JSELECT').'</a>';
		}

		// Edit article button
		if ($allowEdit)
		{
			if(version_compare(JVERSION, '3.0', 'lt')) {
				$html[] = '<a class="btn hasTooltip'.($value ? '' : ' hidden').'" href="index.php?option=com_content&view=article&layout=edit&id=' . $value. '" target="_blank" title="'.JText::_('COM_CONTENT_EDIT_ARTICLE').'" alt="'.JText::_('COM_CONTENT_EDIT_ARTICLE').'" >' . JText::_('JACTION_EDIT') . '</a>';
			} else {
				$html[] = '<a class="btn hasTooltip'.($value ? '' : ' hidden').'" href="index.php?option=com_content&layout=modal&tmpl=component&task=article.edit&id=' . $value. '" target="_blank" title="'.JHtml::tooltipText('COM_CONTENT_EDIT_ARTICLE').'" ><span class="icon-edit"></span> ' . JText::_('JACTION_EDIT') . '</a>';
			}
		}

		// Clear article button
		if ($allowClear)
		{
			if(version_compare(JVERSION, '3.0', 'lt')) {
				$html[] = '<a id="'.$this->id.'_clear" class="btn'.($value ? '' : ' hidden').'" onclick="return jClearArticle(\''.$this->id.'\')">' . JText::_('JCLEAR') . '</a>';
			} else {
				$html[] = '<button id="'.$this->id.'_clear" class="btn'.($value ? '' : ' hidden').'" onclick="return jClearArticle(\''.$this->id.'\')"><span class="icon-remove"></span> ' . JText::_('JCLEAR') . '</button>';
			}
		}

		$html[] = '</span>';

		// class='required' for client side validation
		$class = '';
		if ($this->required)
		{
			$class = ' class="required modal-value"';
		}


		$html[] = '<input type="hidden" id="'.$this->id.'_id"'.$class.' name="'.$this->name.'" value="'.$value.'" /></fieldset></div>';

		if ($tos_Type == '1') {
			$html[] = '<script type="text/javascript">';
			$html[] = 'document.getElementById("'.$name.'_article").style.display = "block";';
			$html[] = '</script>';
		} else {
			$html[] = '<script type="text/javascript">';
			$html[] = 'document.getElementById("'.$name.'_article").style.display = "none";';
			$html[] = '</script>';
		}


		return implode("\n", $html);
	}
}
components/com_icagenda/models/fields/modal/icmulti_checkbox.php000060400000005042152453623450021202 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.2.6 2013-11-21
 * @since       3.2.6
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_icmulti_checkbox extends JFormField
{
	protected $type='modal_icmulti_checkbox';

	protected function getLabel()
	{
	   return ' ';
	}

	protected function getInput()
	{

		$Explode = explode('_', $this->name);
		$TypeName = $Explode[0].']';

		$replace = array("jform", "[params]", "[", "]");
		$name = str_replace($replace, "", $TypeName);

		$selected = $this->value;
		if (!is_array($selected)) $selected = array();

		$check_1 = ' checked="checked"';
		$check_2 = ' checked="checked"';

		if (in_array('1', $selected)) {
			$check_1 = ' checked="checked"';
		} else {
			$check_1 = '';
		}
		if (in_array('2', $selected)) {
			$check_2 = ' checked="checked"';
		} else {
			$check_2 = '';
		}

		$Type_none = $name.'_none';
		$Type_checkbox = $name.'_checkbox';

		$html	= array();

		$html[] = '<div id="'.$Type_checkbox.'"><fieldset class="span9 iCleft">';
//		$html[] = '<input type="text" value="'.$this->value.'" name="'.$this->name.'"/>';
		$html[] = '<div style="display: inline-block"><input type="checkbox" value="1" name="'.$this->name.'[]"'.$check_1.'/>&nbsp;'.JText::_( 'ICTITLE' ).'</div>';
		$html[] = '<div style="display: inline-block"><input type="checkbox" value="2" name="'.$this->name.'[]"'.$check_2.'/>&nbsp;'.JText::_( 'ICDESC' ).'</div>';
		$html[] = '</fieldset></div>';

		$html[] = '<script type="text/javascript">';
		$html[] = 'document.getElementById("'.$Type_checkbox.'").style.display = "none";';
		$html[] = 'if (typeset == 1) {';
		$html[] = 'document.getElementById("'.$Type_checkbox.'").style.display = "block";';
		$html[] = '}';
//		$html[] = 'if (typeset == 0) {';
//		$html[] = 'document.getElementById("'.$Type_checkbox.'").style.display = "none";';
//		$html[] = '}';
		$html[] = '</script>';

		return implode("\n", $html);
	}
}
components/com_icagenda/models/fields/modal/icvalue_opt.php000060400000005524152453623450020205 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.2.9 2013-12-22
 * @since       3.2.3
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_icvalue_opt extends JFormField
{
	protected $type='modal_icvalue_opt';

	protected function getInput()
	{

		$replace = array("jform", "params", "[", "]");
		$name = str_replace($replace, "", $this->name);

		$Type = $this->value;

		if ($name == 'calendarclosebtn') {
			$default_text = JText::_( 'JTOOLBAR_DEFAULT' );
		} else {
			$default_text = JText::_( 'JGLOBAL_USE_GLOBAL' );
		}

		$Type_default = $name.'_default';
		$Type_content = $name.'_custom';

		$class_default = '';
		$class_custom = '';
		$checked_default = ' checked="checked"';
		$checked_custom = '';
		if ($Type == '0') {
			$class_default = 'btn-primary';
			$checked_default = ' checked="checked"';
			$checked_custom = '';
		}
		elseif ($Type == '1') {
			$class_custom = 'btn-success';
			$checked_default = '';
			$checked_custom = ' checked="checked"';
		} else {
			$class_default = 'btn-primary';
			$checked_default = ' checked="checked"';
			$checked_custom = '';
		}

		$html	= array();


		$html[]	= '<fieldset class="radio btn-group">';
		$html[]	= '<label class="'.$class_default.'">'.$default_text.'<input type="radio"  id="'.$name.'_0" name="'.$this->name.'" value="0"  onClick="icdefault_'.$name.'();"'.$checked_default.' /></label>';
		$html[]	= '<label class="'.$class_custom.'">'.JText::_( 'COM_ICAGENDA_LBL_CUSTOM_VALUE' ).'<input type="radio"  id="'.$name.'_1" name="'.$this->name.'" value="1"  onClick="iccustom_'.$name.'();"'.$checked_custom.' /></label>';
		$html[]	= '</fieldset>';


		$html[]	= '<script type="text/javascript">';
		$html[]	= 'var typeset = '.$Type.';';
		$html[]	= 'function icdefault_'.$name.'()';
		$html[]	= '{';
		$html[]	= 'document.getElementById("'.$Type_content.'").style.display = "none";';
		$html[]	= '$("#'.$name.'_0").attr("checked", "checked");';
		$html[]	= '}';
		$html[]	= 'function iccustom_'.$name.'()';
		$html[]	= '{';
		$html[]	= 'document.getElementById("'.$Type_content.'").style.display = "block";';
		$html[]	= '$("#'.$name.'_1").attr("checked", "checked");';
		$html[]	= '}';
		$html[]	= '</script>';

		return implode("\n", $html);
	}
}
components/com_icagenda/models/fields/modal/tos_type.php000060400000010641152453623450017535 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.2.0 2013-09-18
 * @since       3.2.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_tos_type extends JFormField
{
	protected $type='modal_tos_type';

	protected function getInput()
	{
		jimport('joomla.application.component.helper');

		$icagendaParams = JComponentHelper::getParams('com_icagenda');
		$tos_Type = $icagendaParams->get('tos_Type', '');
		$class_default = '';
		$class_article = '';
		$class_custom = '';
		$checked_default = '';
		$checked_article = '';
		$checked_custom = '';
		if ($tos_Type == '') {
			$class_default = 'btn-success';
			$checked_default = ' checked="checked"';
			$checked_article = '';
			$checked_custom = '';
		}
		elseif ($tos_Type == '1') {
			$class_article = 'btn-success';
			$checked_default = '';
			$checked_article = ' checked="checked"';
			$checked_custom = '';
		}
		elseif ($tos_Type == '2') {
			$class_custom = 'btn-success';
			$checked_default = '';
			$checked_article = '';
			$checked_custom = ' checked="checked"';
		} else {
			$class_default = 'btn-success';
			$checked_default = ' checked="checked"';
			$checked_article = '';
			$checked_custom = '';
		}

		$html	= array();
		$html[]	= '<fieldset class="radio btn-group">';
		$html[]	= '<label class="'.$class_default.'">'.JText::_( 'IC_DEFAULT' ).'<input type="radio"  id="tos_Type0" name="'.$this->name.'" value=""  onClick="tosdefault();"'.$checked_default.' /></label>';
		$html[]	= '<label class="'.$class_article.'">'.JText::_( 'IC_ARTICLE' ).'<input type="radio"  id="tos_Type1" name="'.$this->name.'" value="1"  onClick="tosarticle();"'.$checked_article.' /></label>';
		$html[]	= '<label class="'.$class_custom.'">'.JText::_( 'IC_CUSTOM_TEXT' ).'<input type="radio"  id="tos_Type2" name="'.$this->name.'" value="2"  onClick="toscustom();"'.$checked_custom.' /></label>';
		$html[]	= '</fieldset>';



		$html[]	= '<script type="text/javascript">';
//		$html[]	= 'var tos_Type0 = document.getElementById("tos_Type0").checked;';
//		$html[]	= 'var tos_Type1 = document.getElementById("tos_Type1").checked;';
//		$html[]	= 'var tos_Type2 = document.getElementById("tos_Type2").checked;';
//		$html[]	= 'if(tos_Type0==true)';
//		$html[]	= '{';
//		$html[]	= 'document.getElementByName("tos_Type").value = "";';
//		$html[]	= '$("#tos_Type1").attr("checked", "checked");';
//		$html[]	= '}';
//		$html[]	= 'if(tos_Type1==true)';
//		$html[]	= '{';
//		$html[]	= 'document.getElementByName("tos_Type").value = 1;';
//		$html[]	= '}';
//		$html[]	= 'if(tos_Type2==true)';
//		$html[]	= '{';
//		$html[]	= 'document.getElementByName("tos_Type").value = 2;';
//		$html[]	= '}';
//		$html[]	= '';
//		$html[]	= '';
		$html[]	= 'function tosdefault()';
		$html[]	= '{';
		$html[]	= 'document.getElementById("ic_default").style.display = "block";';
		$html[]	= 'document.getElementById("ic_article").style.display = "none";';
		$html[]	= 'document.getElementById("tos_custom").style.display = "none";';
		$html[]	= '$("#tos_Type0").attr("checked", "checked");';
		$html[]	= '}';
		$html[]	= 'function tosarticle()';
		$html[]	= '{';
		$html[]	= 'document.getElementById("ic_default").style.display = "none";';
		$html[]	= 'document.getElementById("ic_article").style.display = "block";';
		$html[]	= 'document.getElementById("tos_custom").style.display = "none";';
		$html[]	= '$("#tos_Type1").attr("checked", "checked");';
		$html[]	= '}';
		$html[]	= 'function toscustom()';
		$html[]	= '{';
		$html[]	= 'document.getElementById("ic_default").style.display = "none";';
		$html[]	= 'document.getElementById("ic_article").style.display = "none";';
		$html[]	= 'document.getElementById("tos_custom").style.display = "block";';
		$html[]	= '$("#tos_Type2").attr("checked", "checked");';
		$html[]	= '}';
		$html[]	= '</script>';

		return implode("\n", $html);
	}
}
components/com_icagenda/models/fields/modal/cat.php000060400000007206152453623450016441 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.4.1 2015-01-03
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_cat extends JFormField
{
	protected $type='modal_cat';

	protected function getInput()
	{
		$app		= JFactory::getApplication();
		$session	= JFactory::getSession();

		// Initialize some field attributes.
		$class		= !empty($this->class) ? ' class="' . $this->class . '"' : '';

		if ($app->isAdmin())
		{
			$iCparams = JComponentHelper::getParams('com_icagenda');
		}
		else
		{
			$iCparams	= $app->getParams();
		}

		$orderby_catlist		= $iCparams->get('orderby_catlist', 'alpha');
		$default_catlist		= $iCparams->get('default_catlist', '');

		$admin_status_catlist	= $iCparams->get('admin_status_catlist', '1');
		$site_status_catlist	= $iCparams->get('site_status_catlist', '1');

		$admin_status_array		= is_array($admin_status_catlist) ? $admin_status_catlist : array($admin_status_catlist);
		$site_status_array		= is_array($site_status_catlist) ? $site_status_catlist : array($site_status_catlist);

		$admin_status			= implode(',', $admin_status_array);
		$site_status			= implode(',', $site_status_array);

		$catid = $session->get('ic_submit_catid', '');

		// Query List of Categories
		$db		= JFactory::getDbo();
		$query	= $db->getQuery(true);
		$query->select('c.ordering, c.title, c.state, c.id')
			->from('`#__icagenda_category` AS c');

		// Not display Trashed Categories
		$query->where('c.state <> -2');

		if ($app->isAdmin())
		{
			$query->where($db->qn('c.state') . ' IN (' . $admin_status . ') ');
		}
		else
		{
			$query->where($db->qn('c.state') . ' IN (' . $site_status . ') ');
		}

		if ($orderby_catlist == 'alpha')
		{
			$query->order('c.title ASC');
		}
		elseif ($orderby_catlist == 'ralpha')
		{
			$query->order('c.title DESC');
		}
		elseif ($orderby_catlist == 'order')
		{
			$query->order('c.ordering ASC');
		}

		$db->setQuery($query);
		$categories = $db->loadObjectList();

		$html = '<select id="' . $this->id . '" name="' . $this->name . '"' . $class . '>';

		$html.= ' <option value="">' . JTEXT::_('JOPTION_SELECT_CATEGORY') . '</option>';

		foreach ($categories as $c)
		{
			$html.= '<option value="' . $c->id . '"';

			if ($c->state == '0')
			{
				$html.= ' style="color:red"';
//				$c->title = '[' . $c->title . '] (' . JTEXT::_('JUNPUBLISHED') . ')';
				$c->title = '[' . $c->title . ']';
			}
			elseif ($c->state == '2')
			{
				$html.= ' style="color:orange"';
//				$c->title = $c->title . ' (' . JTEXT::_('JARCHIVED') . ')';
				$c->title = '[' . $c->title . ']';
			}

			if ($this->value == $c->id)
			{
				$html.= ' selected="selected"';
			}

			if ($catid == $c->id)
			{
				$html.= ' selected="selected"';
			}

			if (empty($this->value) && empty($catid)
				&& ($c->id == $default_catlist))
			{
				$html.= ' selected="selected"';
			}

			$html.= '>' . $c->title . '</option>';
		}

		$html.= '</select>';

		// clear the data so we don't process it again
		$session->clear('ic_submit_catid');

		return $html;
	}
}
components/com_icagenda/models/fields/modal/enddate.php000060400000003130152453623450017266 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.10 2015-08-13
 * @since       2.0.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined( '_JEXEC' ) or die( 'Restricted access' );

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

/**
 * Form Field to load a enddate datetime picker input
 *
 * @since	2.0.0
 */
class JFormFieldModal_enddate extends JFormField
{
	protected $type = 'modal_enddate';

	protected function getInput()
	{
		$class = ! empty($this->class) ? ' class="' . $this->class . '"' : '';

		$lang = JFactory::getLanguage();

		if ($lang->getTag() == 'fa-IR')
		{
			// Including fallback code for HTML5 non supported browsers.
			JHtml::_('jquery.framework');
			JHtml::_('script', 'system/html5fallback.js', false, true);

			$attributes = '';

			$html = JHtml::_('calendar', $this->value, $this->name, 'enddate_jalali', '%Y-%m-%d %H:%M:%S', $attributes);
		}
		else
		{
			$html ='<input type="text" id="enddate"' . $class . ' name="' . $this->name . '" value="' . $this->value . '"/>';
		}

		return $html;
	}
}
components/com_icagenda/models/fields/modal/icalert_msg.php000060400000012410152453623450020154 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.3.3 2014-04-12
 * @since       3.2.8
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_icalert_msg extends JFormField
{
	protected $type='modal_icalert_msg';

	protected function getLabel()
	{
		return ' ';
	}

	protected function getInput()
	{
		$replace = array("jform", "params", "[", "]");
		$name_input = str_replace($replace, "", $this->name);
		$get_error = explode('_', $name_input);
		$error = $get_error['1'];
		$name = $get_error['0'];

		$url=JPATH_SITE.'/components/com_icagenda/themes/packs';

		// Set Function to condition to be checked
		$events_php=$this->getList($url);
		$cal_date=$this->getCalDate($url);

		if ($name == 'eventsfile')
		{
			$list = $events_php;
			$doc_url = 'http://www.icagenda.com/theme-pack-upgrade/3-2-8-new-option-all-dates';
			$parent_field = 'datesDisplay';
			$action_value = '1';
		}
		elseif ($name == 'caldate')
		{
			$list = $cal_date;
			$doc_url = 'http://www.icagenda.com/theme-pack-upgrade/3-3-3-change-cal-date-to-data-cal-date';
			$parent_field = 'setTodayTimezone';
			$action_value = '';
		}

		$span_style	= 'input-xlarge';

		if (version_compare(JVERSION, '3.0', 'lt')) {
			$listP		= implode('<br /> - ', $list);
			$setlist	= ' - '.$listP.' ';
		} else {
			$listP		= implode('</li><li>', $list);
			$setlist	= '<ul><li>'.$listP.'</li></ul>';
//			$span_style	= 'span8';
		}

		$html	= array();

		if (count($list) >= 1)
		{
			$html[]	= '<div id="icalert_'.$this->id.'" class="'.$span_style.' alert alert-error" style="clear:both">';
			$html[]	=  '<b>'.JText::_( $this->title ).'</b>';
			$html[]	= '<p>';
			$html[]	=  JText::_( $this->description ) . ' <a class="modal" rel="{size: {x: 700, y: 500}, handler:\'iframe\'}" href="'.$doc_url.'">' .JText::_( 'IC_MORE_INFORMATION' ). '</a>';
			$html[]	= '</p>';

			if ($this->id == 'jform_params_'.$name.'_error')
			{
				$html[]	= '<p>';
				$html[]	= '<b><i>'.JText::_( 'COM_ICAGENDA_EVENTS_PHPFILE_MISSING_PACKS_LIST' ).'</i></b><br />';
				$html[]	= $setlist;
				$html[]	= '</p>';
			}
			$html[]	= '</div>';

			$html[] = '<script type="text/javascript">';
			$html[]	= '		var icdisplay = document.getElementById("jform_params_'.$parent_field.'").value;';
			$html[] = '		document.getElementById("icalert_'.$this->id.'").style.display = "none";';
			$html[] = '		if (icdisplay == "'.$action_value.'") {';
			$html[] = '			document.getElementById("icalert_'.$this->id.'").style.display = "block";';
			$html[] = '		}';
			$html[]	= '	function icalert()';
			$html[]	= '	{';
			$html[]	= '		var icdisplay = document.getElementById("jform_params_'.$parent_field.'").value;';
			$html[] = '		document.getElementById("icalert_'.$this->id.'").style.display = "none";';
			$html[] = '		if (icdisplay == "'.$action_value.'") {';
			$html[] = '			document.getElementById("icalert_'.$this->id.'").style.display = "block";';
			$html[] = '		}';
			$html[]	= '	}';
			$html[] = '</script>';
		}

		return implode("\n", $html);
	}

	/**
	 * Function to check if the file 'THEME_events.php' exists in each Theme Pack
	 */
	function getList($dirname)
	{
		$arrayfiles = Array();

		if(file_exists($dirname))
		{
			$handle = opendir($dirname);

			while (false !== ($file = readdir($handle)))
			{
				if ( !is_file($dirname.$file)
					&& $file!= '.'
					&& $file!='..'
					&& $file!='index.php'
					&& $file!='index.html'
					&& $file!='.DS_Store'
					&& $file!='.thumbs' )
				{
					if (!file_exists($dirname.'/'.$file.'/'.$file.'_events.php'))
					{
						array_push($arrayfiles,$file);
					}
				}
			}
			$handle = closedir($handle);
		}
		sort($arrayfiles);

		return $arrayfiles;
	}

	/**
	 * Function to check if 'data-cal-date' is defined inside the file 'THEME_day.php' for each Theme Pack.
	 * Returns an alert if deprecated 'cal_date' found.
	 */
	function getCalDate($dirname)
	{
		$arrayfiles = Array();

		if (ini_get('allow_url_fopen'))
		{
			if (file_exists($dirname))
			{
				$handle = opendir($dirname);

				while (false !== ($file = readdir($handle)))
				{
					if ( !is_file($dirname.$file)
						&& $file!= '.'
						&& $file!='..'
						&& $file!='index.php'
						&& $file!='index.html'
						&& $file!='.DS_Store'
						&& $file!='.thumbs' )
					{
						$t_day = $dirname.'/'.$file.'/'.$file.'_day.php';
						$file_t_day = file_get_contents($t_day);

						if (!strpos($file_t_day, "cal_date")
							&& !strpos($file_t_day, "data-cal-date"))
						{
							array_push($arrayfiles,$file);
						}
						elseif (strpos($file_t_day, "cal_date"))
						{
							array_push($arrayfiles,$file);
						}
					}
				}
			}
			$handle = closedir($handle);
		}
		sort($arrayfiles);

		return $arrayfiles;
	}

}
components/com_icagenda/models/fields/modal/ictext_content.php000060400000004165152453623450020725 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.2.0.1 2013-09-22
 * @since       3.2.0.1
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_ictext_content extends JFormField
{
	protected $type='modal_ictext_content';

	protected function getInput()
	{

		jimport('joomla.application.component.helper');
		$icagendaParams = JComponentHelper::getParams('com_icagenda');

		$Explode = explode('_', $this->name);
		$TypeName = $Explode[0].']';

		$replace = array("jform", "[", "]");
		$name = str_replace($replace, "", $TypeName);
		$icContent = $icagendaParams->get($name.'_Content', '');

		$Type = $icagendaParams->get($name, '');

		$Type_default = $name.'_default';
		$Type_content = $name.'_custom';


		$editor = JFactory::getEditor();

		$html	= array();

		$html[] = '<div id="'.$Type_content.'"><fieldset class="span9 iCleft">';
		$html[] = $editor->display($this->name, $icContent, "100%", "300", "300", "20", 1, null, null, null, array('mode' => 'advanced'));
		$html[] = '</fieldset></div>';

		if ($Type == '2') {
			$html[] = '<script type="text/javascript">';
//			$html[] = 'document.getElementById("'.$Type_default.'").style.display = "none";';
			$html[] = 'document.getElementById("'.$Type_content.'").style.display = "block";';
			$html[] = '</script>';
		} else {
			$html[] = '<script type="text/javascript">';
			$html[] = 'document.getElementById("'.$Type_content.'").style.display = "none";';
			$html[] = '</script>';
		}

		return implode("\n", $html);
	}
}
components/com_icagenda/models/fields/modal/iclink_type.php000060400000010042152453623450020174 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.1 2015-02-27
 * @since       3.3.3
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_iclink_type extends JFormField
{
	protected $type='modal_iclink_type';

	protected function getInput()
	{
		jimport('joomla.application.component.helper');

		$location = JRequest::getVar('option', 'com_config');

		if ($location != 'com_config')
		{
			$default_text	= JText::_('JGLOBAL_USE_GLOBAL');
		}
		else
		{
			$default_text = JText::_("IC_DEFAULT");
		}

		// Get Type value
		$Type			= isset($this->value) ? $this->value : '';

		// Clean jform name
		$replace		= array("jform", "params", "[", "]");
		$name			= str_replace($replace, "", $this->name);

		$Type_default	= $name . '_default';
		$Type_article	= $name . '_article';
		$Type_url		= $name . '_url';

		// Set Var type, to get selected option
		JRequest::setVar('type', $Type);

		// Article
		if ($Type == '1')
		{
			$class_default		= '';
			$class_article		= 'btn-success';
			$class_url			= '';
			$checked_default	= '';
			$checked_article	= ' checked="checked"';
			$checked_url		= '';
		}

		// URL
		elseif ($Type == '2')
		{
			$class_default		= '';
			$class_article		= '';
			$class_url			= 'btn-success';
			$checked_default	= '';
			$checked_article	= '';
			$checked_url		= ' checked="checked"';
		}

		// iCagenda default
		else
		{
			$class_default		= 'btn-primary';
			$class_article		= '';
			$class_url			= '';
			$checked_default	= ' checked="checked"';
			$checked_article	= '';
			$checked_url		= '';
		}

		$html	= array();
		$html[]	= '<fieldset class="radio btn-group">';
		$html[]	= '<label class="' . $class_default . '">' . $default_text . '<input type="radio"  id="' . $name . '_0" name="' . $this->name . '" value=""  onClick="icdefault_' . $name . '();"' . $checked_default . ' /></label>';
		$html[]	= '<label class="' . $class_article . '">' . JText::_( 'COM_ICAGENDA_REGISTRATION_LINK_ARTICLE' ) . '<input type="radio"  id="' . $name . '_1" name="' . $this->name . '" value="1"  onClick="icarticle_' . $name . '();"' . $checked_article . ' /></label>';
		$html[]	= '<label class="' . $class_url . '">' . JText::_( 'COM_ICAGENDA_REGISTRATION_LINK_URL' ) . '<input type="radio"  id="' . $name . '_2" name="' . $this->name . '" value="2"  onClick="icurl_' . $name . '();"' . $checked_url . ' /></label>';
		$html[]	= '</fieldset>';

		// Script
		$html[]	= '<script type="text/javascript">';
		$html[]	= 'function icdefault_' . $name . '()';
		$html[]	= '{';
		$html[]	= 'document.getElementById("' . $Type_article . '").style.display = "none";';
		$html[]	= 'document.getElementById("' . $Type_url . '").style.display = "none";';
//		$html[]	= '$("#'.$name.'_0").attr("checked", "checked");';
		$html[]	= '}';
		$html[]	= 'function icarticle_' . $name . '()';
		$html[]	= '{';
		$html[]	= 'document.getElementById("' . $Type_article . '").style.display = "block";';
		$html[]	= 'document.getElementById("' . $Type_url . '").style.display = "none";';
//		$html[]	= '$("#'.$name.'_1").attr("checked", "checked");';
		$html[]	= '}';
		$html[]	= 'function icurl_' . $name . '()';
		$html[]	= '{';
		$html[]	= 'document.getElementById("' . $Type_article . '").style.display = "none";';
		$html[]	= 'document.getElementById("' . $Type_url . '").style.display = "block";';
//		$html[]	= '$("#'.$name.'_2").attr("checked", "checked");';
		$html[]	= '}';
		$html[]	= '</script>';

		return implode("\n", $html);
	}
}
components/com_icagenda/models/fields/modal/index.html000060400000000032152453623450017144 0ustar00<html><body></body></html>components/com_icagenda/models/fields/modal/iclink_article.php000060400000016067152453623450020653 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.1 2015-02-27
 * @since       3.3.3
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

/**
 * Supports a modal article picker.
 */
class JFormFieldModal_iclink_article extends JFormField
{
	/**
	 * The form field type.
	 */
	protected $type = 'modal_iclink_article';

	/**
	 * Method to get the field input markup.
	 */
	protected function getInput()
	{
		jimport('joomla.application.component.helper');
		$icagendaParams	= JComponentHelper::getParams('com_icagenda');

		$Explode		= explode('_', $this->name);
		$TypeName		= $Explode[0] . ']';

		$replace		= array("jform", "params", "[", "]");
		$name			= str_replace($replace, "", $TypeName);

//		$Type = JRequest::getVar('type');

		$allowEdit		= ((string) $this->element['edit'] == 'true') ? true : false;
		$allowClear		= ((string) $this->element['clear'] != 'false') ? true : false;

		// Load language
		JFactory::getLanguage()->load('com_content', JPATH_ADMINISTRATOR);

		// Load the modal behavior script.
		JHtml::_('behavior.modal', 'a.modal');

		// Build the script.
		$script = array();

		// Select button script
		$script[] = '	function jSelectArticle_'.$this->id.'(id, title, catid, object) {';
		$script[] = '		document.getElementById("'.$this->id.'_id").value = id;';
		$script[] = '		document.getElementById("'.$this->id.'_name").value = title;';

		if ($allowEdit)
		{
			$script[] = '		jQuery("#'.$this->id.'_edit").removeClass("hidden");';
		}

		if ($allowClear)
		{
			$script[] = '		jQuery("#'.$this->id.'_clear").removeClass("hidden");';
		}

		$script[] = '		SqueezeBox.close();';
		$script[] = '	}';

		// Clear button script
		static $scriptClear;

		if ($allowClear && !$scriptClear)
		{
			$scriptClear = true;

			$script[] = '	function jClearArticle(id) {';
			$script[] = '		document.getElementById(id + "_id").value = "";';
			$script[] = '		document.getElementById(id + "_name").value = "'.htmlspecialchars(JText::_('COM_CONTENT_SELECT_AN_ARTICLE', true), ENT_COMPAT, 'UTF-8').'";';
			$script[] = '		jQuery("#"+id + "_clear").addClass("hidden");';
			$script[] = '		if (document.getElementById(id + "_edit")) {';
			$script[] = '			jQuery("#"+id + "_edit").addClass("hidden");';
			$script[] = '		}';
			$script[] = '		return false;';
			$script[] = '	}';
		}

		// Add the script to the document head.
		JFactory::getDocument()->addScriptDeclaration(implode("\n", $script));

		// Setup variables for display.
		$html	= array();
		$link	= 'index.php?option=com_content&amp;view=articles&amp;layout=modal&amp;tmpl=component&amp;function=jSelectArticle_'.$this->id;

		if (isset($this->element['language']))
		{
			$link .= '&amp;forcedLanguage='.$this->element['language'];
		}

		$db	= JFactory::getDbo();
		$db->setQuery(
			'SELECT title' .
			' FROM #__content' .
			' WHERE id = '.(int) $this->value
		);

		try
		{
			$title = $db->loadResult();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $e->getMessage());
		}

		if (empty($title))
		{
			$title = JText::_('COM_CONTENT_SELECT_AN_ARTICLE');
		}
		$title = htmlspecialchars($title, ENT_QUOTES, 'UTF-8');

		// The active article id field.
		if (0 == (int) $this->value)
		{
			$value = '';
		}
		else
		{
			$value = (int) $this->value;
		}

		// The current article display field.
		$html[] = '<div id="'.$name.'_article"><fieldset class="span9 iCleft"><div>&nbsp;</div><span class="input-append">';
		$html[] = '<input type="text" class="input-medium" style="margin:0px" id="'.$this->id.'_name" value="'.$title.'" disabled="disabled" size="35" />';

		if(version_compare(JVERSION, '3.0', 'lt'))
		{
			$html[] = '<a class="modal btn hasTooltip" title="'.JText::_('COM_CONTENT_CHANGE_ARTICLE').'"  href="'.$link.'&amp;'.JSession::getFormToken().'=1" rel="{handler: \'iframe\', size: {x: 800, y: 450}}">'.JText::_('JSELECT').'</a>';
		}
		else
		{
			$html[] = '<a class="modal btn hasTooltip" title="'.JHtml::tooltipText('COM_CONTENT_CHANGE_ARTICLE').'"  href="'.$link.'&amp;'.JSession::getFormToken().'=1" rel="{handler: \'iframe\', size: {x: 800, y: 450}}"><i class="icon-file"></i> '.JText::_('JSELECT').'</a>';
		}

		// Edit article button
		if ($allowEdit)
		{
			if(version_compare(JVERSION, '3.0', 'lt'))
			{
				$html[] = '<a class="btn hasTooltip'.($value ? '' : ' hidden').'" href="index.php?option=com_content&view=article&layout=edit&id=' . $value. '" target="_blank" title="'.JText::_('COM_CONTENT_EDIT_ARTICLE').'" alt="'.JText::_('COM_CONTENT_EDIT_ARTICLE').'" >' . JText::_('JACTION_EDIT') . '</a>';
			}
			else
			{
				$html[] = '<a class="btn hasTooltip'.($value ? '' : ' hidden').'" href="index.php?option=com_content&layout=modal&tmpl=component&task=article.edit&id=' . $value. '" target="_blank" title="'.JHtml::tooltipText('COM_CONTENT_EDIT_ARTICLE').'" ><span class="icon-edit"></span> ' . JText::_('JACTION_EDIT') . '</a>';
			}
		}

		// Clear article button
		if ($allowClear)
		{
			if(version_compare(JVERSION, '3.0', 'lt'))
			{
				$html[] = '<a id="'.$this->id.'_clear" class="btn'.($value ? '' : ' hidden').'" onclick="return jClearArticle(\''.$this->id.'\')">' . JText::_('JCLEAR') . '</a>';
			}
			else
			{
				$html[] = '<button id="'.$this->id.'_clear" class="btn'.($value ? '' : ' hidden').'" onclick="return jClearArticle(\''.$this->id.'\')"><span class="icon-remove"></span> ' . JText::_('JCLEAR') . '</button>';
			}
		}

		$html[] = '</span>';

		// class='required' for client side validation
		$class = '';
		if ($this->required)
		{
			$class = ' class="required modal-value"';
		}


		$html[] = '<input type="hidden" id="'.$this->id.'_id"'.$class.' name="'.$this->name.'" value="'.$value.'" /></fieldset></div>';

//		if ($Type == '1')
//		{
//			$html[] = '<script type="text/javascript">';
//			$html[] = 'document.getElementById("'.$name.'_article").style.display = "block";';
//			$html[] = 'document.getElementById("'.$name.'_url").style.display = "none";';
//			$html[] = '</script>';
//		}
//		elseif ($Type == '2')
//		{
//			$html[] = '<script type="text/javascript">';
//			$html[] = 'document.getElementById("'.$name.'_article").style.display = "none";';
//			$html[] = 'document.getElementById("'.$name.'_url").style.display = "block";';
//			$html[] = '</script>';
//		}
//		else
//		{
//			$html[] = '<script type="text/javascript">';
//			$html[] = 'document.getElementById("'.$name.'_article").style.display = "none";';
//			$html[] = 'document.getElementById("'.$name.'_url").style.display = "none";';
//			$html[] = '</script>';
//		}

		return implode("\n", $html);
	}
}
components/com_icagenda/models/fields/modal/tos_content.php000060400000004037152453623450020230 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.2.0 2013-09-18
 * @since       3.2.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_tos_content extends JFormField
{
	protected $type='modal_tos_content';

//	protected function getLabel()
//	{
//	   return ' ';
//	}

	protected function getInput()
	{

		jimport('joomla.application.component.helper');
		$icagendaParams = JComponentHelper::getParams('com_icagenda');
		$tosContent = $icagendaParams->get('tosContent', '');
		$tos_Type = $icagendaParams->get('tos_Type', '');


		$editor = JFactory::getEditor();
//		$editor = JEditor::getEditor();

		$html	= array();

		$html[] = '<div id="tos_custom"><fieldset class="span9 iCleft">';
		$html[] = $editor->display($this->name, $tosContent, "100%", "300", "300", "20", 1, null, null, null, array('mode' => 'advanced'));
		$html[] = '</fieldset></div>';

		if ($tos_Type == '2') {
			$html[] = '<script type="text/javascript">';
			$html[] = 'document.getElementById("ic_default").style.display = "none";';
			$html[] = 'document.getElementById("ic_article").style.display = "none";';
			$html[] = 'document.getElementById("tos_custom").style.display = "block";';
			$html[] = '</script>';
		} else {
			$html[] = '<script type="text/javascript">';
			$html[] = 'document.getElementById("tos_custom").style.display = "none";';
			$html[] = '</script>';
		}

		return implode("\n", $html);
	}
}
components/com_icagenda/models/fields/modal/evt.php000060400000030331152453623450016463 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.9 2015-08-01
 * @since       3.3.3
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_evt extends JFormField
{
	protected $type = 'modal_evt';

	protected function getInput()
	{
		$jinput		= JFactory::getApplication()->input;
		$view		= $jinput->get('view');
		$id			= $jinput->get('id', null);
		$eventid	= $jinput->get('eventid', $this->value);

		$class		= isset($this->class) ? ' class="' . $this->class . '"' : '';

		$typeReg = $db_date = $db_period = $db_date_is_valid = '';

		$db		= JFactory::getDbo();
		$query	= $db->getQuery(true);
		$query->select('e.title, e.state, e.id, e.weekdays, e.params')
			->from('`#__icagenda_events` AS e');

		if ($view == 'mail')
		{
			// Join Total of registrations
			$query->select('r.count AS registered');
			$sub_query = $db->getQuery(true);
			$sub_query->select('r.state, r.date AS reg_date, r.period AS reg_period, r.eventid, sum(r.people) AS count');
			$sub_query->from('`#__icagenda_registration` AS r');
			$sub_query->where('r.state = 1');
			$sub_query->where('r.email <> ""');
			$sub_query->group('r.eventid');
			$query->leftJoin('(' . (string) $sub_query . ') AS r ON (e.id = r.eventid)');
			$query->where('r.count > 0');
		}

		$query->order('e.title ASC');

		$db->setQuery($query);
		$events	= $db->loadObjectList();

		if ($eventid != 0 && $view == 'registration')
		{
			$query	= $db->getQuery(true);
			$query->select('r.date AS reg_date, r.period AS reg_period')
				->from('`#__icagenda_registration` AS r');
			$query->where('r.eventid = ' . (int) $eventid);
			$query->where('r.id = ' . (int) $id);
			$db->setQuery($query);
			$reg	= $db->loadObject();
			$db_date			= $reg->reg_date;
			$db_date_is_valid	= iCDate::isDate($db_date);
			$db_period			= $reg->reg_period;
		}

		// User state used in Newsletter
		$data				= JFactory::getApplication()->getUserState('com_icagenda.mail.data', array());
		$session_eventid	= isset($data['eventid']) ? $data['eventid'] : $eventid;
		$session_date		= isset($data['date']) ? $data['date'] : '';

		$html = '<div style="margin-bottom: 10px">';
		$html.= '<select id="' . $this->id . '_id"' . $class . ' name="' .
			$this->name . '">';

		$value = isset($this->value) ? $this->value : '';

		$html.= '<option value=""';

		if ( ! $id || ! $this->value)
		{
			$html.= ' selected="selected"';
		}

		$html.= '>' . JText::_('COM_ICAGENDA_SELECT_EVENT') . '</option>';

		foreach ($events as $e)
		{
			if ($e->state == '1')
			{
				$html.= '<option value="' . $e->id . '"';

				if ($eventid == $e->id)
				{
					$eventparam			= new JRegistry($e->params);
					$typeReg			= $eventparam->get('typeReg', 1);
					$weekdays			= $e->weekdays;

					$html.= ' selected="selected"';
				}

				if ($view == 'registration')
				{
					$html.= '>' . $e->title . ' (id:' . $e->id . ')</option>';
				}
				else
				{
					$html.= '>' . $e->title . ' (&#10003;' . $e->registered . ' - id:' . $e->id . ')</option>';
				}
			}
			elseif ($eventid == $e->id)
			{
				$html.= '<option value="' . $value . '"';
				$html.= ' selected="selected"';
				$html.= '>' . JText::_('COM_ICAGENDA_REGISTRATION_EVENT_NOT_PUBLISHED') . '</option>';
			}
		}

		$html.= '</select>';
		$html.= '</div>';

		$id_display = $id ? '&id=' . (int) $id : '';

		if ($view == 'registration')
		{
			// Info message with 'Registration Type' option setting, if the saved date is not in the list of dates for selected event.
			if ($typeReg == 1)
			{
				$reg_type = JText::_('COM_ICAGENDA_REG_BY_INDIVIDUAL_DATE');
			}
			elseif ($typeReg == 2)
			{
				$reg_type = JText::_('COM_ICAGENDA_REG_FOR_ALL_DATES');
			}
			else
			{
				$reg_type = JText::_('COM_ICAGENDA_REG_BY_DATE_OR_PERIOD');
			}

			$registration_type = '<strong>' . $reg_type . '</strong>';

			$alert_reg_type = '<div class="alert alert-info">';
			$alert_reg_type.= '<small>' . JText::sprintf('COM_ICAGENDA_REGISTRATION_TYPE_FOR_THIS_EVENT', $registration_type) . '</small>';
			$alert_reg_type.= '</div>';
			$alert_reg_type = addslashes($alert_reg_type);

			// Alert message for a date saved with a version before 3.3.3 (date not formatted as expected in sql format)
			$date_no_longer_exists = '<strong>"' . $db_date . '"</strong>';
			$alert_date_format = '<div class="ic-alert ic-alert-note"><span class="iCicon-info"></span> <strong>' . JText::_('NOTICE') . '</strong><br />' . JText::sprintf('COM_ICAGENDA_REGISTRATION_ERROR_DATE_CONTROL', $date_no_longer_exists) . '</div>';
			$alert_date_format = addslashes($alert_date_format);

			// Alert message if a date does not exist anymore for the selected event
			$alert_date_no_longer_exists = '<div class="alert alert-error"><strong>' . JText::_('COM_ICAGENDA_FORM_WARNING') . '</strong><br /><small>' . JText::sprintf('COM_ICAGENDA_REGISTRATION_DATE_NO_LONGER_EXISTS', $date_no_longer_exists) . '</small></div>';
			$alert_date_no_longer_exists = addslashes($alert_date_no_longer_exists);

			// Alert message if a date does not exist anymore for the selected event
			$alert_full_period_no_longer_exists = '<div class="alert alert-error"><strong>' . JText::_('COM_ICAGENDA_FORM_WARNING') . '</strong><br /><small>' . JText::sprintf('COM_ICAGENDA_REGISTRATION_PERIOD_NO_LONGER_EXISTS', $date_no_longer_exists) . '</small></div>';
			$alert_full_period_no_longer_exists = addslashes($alert_full_period_no_longer_exists);

			// Alert message if a date or period is set for the registration, but event registration type is now 'for all dates of the event'
			$for_all_dates = '<strong>' . JText::_('COM_ICAGENDA_ADMIN_REGISTRATION_FOR_ALL_DATES') . '</strong>';
			$alert_by_date_no_longer_possible = '<div class="alert alert-error"><strong>' . JText::_('COM_ICAGENDA_FORM_WARNING') . '</strong><br /><small>' . JText::sprintf('COM_ICAGENDA_REGISTRATION_BY_DATE_NO_LONGER_POSSIBLE', $for_all_dates, $for_all_dates) . '</small></div>';
			$alert_by_date_no_longer_possible = addslashes($alert_by_date_no_longer_possible);

			// Alert message if registration for all dates of the event, but event registration type is now 'select list of dates'
			$by_date = '<strong>' . JText::_('COM_ICAGENDA_ADMIN_REGISTRATION_BY_INDIVIDUAL_DATE') . '</strong>';
			$alert_for_all_dates_no_longer_possible = '<div class="alert alert-error"><strong>' . JText::_('COM_ICAGENDA_FORM_WARNING') . '</strong><br /><small>' . JText::sprintf('COM_ICAGENDA_REGISTRATION_FOR_ALL_DATES_NO_LONGER_POSSIBLE', $by_date) . '</small></div>';
			$alert_for_all_dates_no_longer_possible = addslashes($alert_for_all_dates_no_longer_possible);

			$html.= '<div id="date-alert">';
			$html.= '</div>';

			if ($typeReg == '1')
			{
				?>
				<script type="text/javascript">
					jQuery(document).ready(function($) {
						var value = $('#jform_date_id').val(),
							db_date = '<?php echo $db_date; ?>',
							db_period = '<?php echo $db_period; ?>',
							db_weekdays = '<?php echo $weekdays; ?>',
							db_date_is_valid = '<?php echo $db_date_is_valid; ?>',
							alert_reg_type = '<?php echo $alert_reg_type; ?>',
							alert_date_format = '<?php echo $alert_date_format; ?>',
							alert_date_no_longer_exists = '<?php echo $alert_date_no_longer_exists; ?>',
							alert_full_period_no_longer_exists = '<?php echo $alert_full_period_no_longer_exists; ?>',
							alert_for_all_dates_no_longer_possible = '<?php echo $alert_for_all_dates_no_longer_possible; ?>';

						if ( db_date == '' && db_period == '1' ) {
							// Registration for all dates, not possible if registration type is per date
							$('#date-alert').html(alert_reg_type+alert_for_all_dates_no_longer_possible);
						}
						else if ( !db_date_is_valid && db_date !== '' ) {
							// Date is not empty, but not a valid sql format (registration before release 3.3.3)
							$('#date-alert').html(alert_reg_type+alert_date_format);
						}
						else if ( db_date !== value && db_period !== '0') {
							// Date is not empty, but date is not anymore set for this event
							$('#date-alert').html(alert_date_no_longer_exists);
						}
						else if ( db_date == '' && db_period == '0' &&
							db_weekdays !== '' && db_weekdays !== '0') {
							// Date is not empty, but date is not anymore set for this event
							$('#date-alert').html(alert_full_period_no_longer_exists);
						}

						$('#jform_date_id').change(function(e) {
							$('#jform_period').val('0');
							$('#date-alert').html('');
						});
					});
				</script>
				<?php
			}
			elseif ($typeReg == '2')
			{
				?>
				<script type="text/javascript">
					jQuery(document).ready(function($) {
						var value = $('#jform_date_id').val(),
							db_date = '<?php echo $db_date; ?>',
							db_period = '<?php echo $db_period; ?>',
							alert_reg_type = '<?php echo $alert_reg_type; ?>',
							alert_by_date_no_longer_possible = '<?php echo $alert_by_date_no_longer_possible; ?>';

						$('#date-alert').html(alert_reg_type);

						if ( db_period !== '1' ) {
							// Date is empty, not possible if registration type is per date
							$('#date-alert').html(alert_reg_type+alert_by_date_no_longer_possible);
						}

						$('#jform_date_id').change(function(e) {
//							if ( value == 'update' ) {
								$('#jform_period').val('1');
								$('#date-alert').html('');
//							}
						});
					});
				</script>
			<?php
			}
		}
		?>
		<script type="text/javascript">
		jQuery(document).ready(function($) {
			var view = '<?php echo $view; ?>',
				regid = '<?php echo $id; ?>',
				eventid = '<?php echo $session_eventid; ?>',
				date = '<?php echo $session_date; ?>',
				list_target_id = 'jform_date_id',
				list_select_id = '<?php echo $this->id; ?>_id',
				initial_target_html = '<option value=""><?php echo JText::_("COM_ICAGENDA_SELECT_NO_EVENT_SELECTED"); ?>...</option>',
				loading = '<?php echo JText::_("IC_LOADING"); ?>';

			if (eventid) {
				$('#'+list_target_id).removeAttr('readonly');
				$('#'+list_target_id).val(date);

				$.ajax({url: 'index.php?option=com_icagenda&task='+view+'.dates&eventid='+eventid+'&regid='+regid,
					success: function(output) {
							$('#'+list_target_id).html(output);
					},
					error: function (xhr, ajaxOptions, thrownError) {
							alert(xhr.status + " "+ thrownError);
					}
				});

				$('#'+list_select_id).change(function(e) {
					$('#'+list_target_id).removeAttr('readonly');

					var selectvalue = $(this).val();

					$('#'+list_target_id).html('<option value="">'+loading+'</option>');

					if (selectvalue == "") {
						$('#'+list_target_id).attr('readonly', 'true');
						$('#'+list_target_id).html(initial_target_html);
					} else {
						$.ajax({url: 'index.php?option=com_icagenda&task='+view+'.dates&eventid='+selectvalue+'&regid='+regid,
							success: function(output) {
									$('#'+list_target_id).html(output);
							},
							error: function (xhr, ajaxOptions, thrownError) {
									alert(xhr.status + " "+ thrownError);
							}
						});
					}
				});
			} else {
				$('#'+list_target_id).attr('readonly', 'true');
				$('#'+list_target_id).html(initial_target_html);

				$('#'+list_select_id).change(function(e) {
					$('#'+list_target_id).removeAttr('readonly');

					var selectvalue = $(this).val();

					$('#'+list_target_id).html('<option value="">'+loading+'</option>');

					if (selectvalue == "") {
						$('#'+list_target_id).attr('readonly', 'true');
						$('#'+list_target_id).html(initial_target_html);
					} else {
						$.ajax({url: 'index.php?option=com_icagenda&task='+view+'.dates&eventid='+selectvalue+'&regid='+regid,
							success: function(output) {
									$('#'+list_target_id).html(output);
							},
							error: function (xhr, ajaxOptions, thrownError) {
									alert(xhr.status + " "+ thrownError);
							}
						});
					}
				});
			}
		});
		</script>
		<?php

		return $html;
	}
}
components/com_icagenda/models/fields/modal/param_place.php000060400000002643152453623450020136 0ustar00<?php
/** 
 *	iCagenda
 *----------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright	Copyright (C) 2012 JOOMLIC - All rights reserved.
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Jooml!C - http://www.joomlic.com
 * 
 * @since		1.0
 *----------------------------------------------------------------------------
*/

// No direct access to this file
defined( '_JEXEC' ) or die( 'Restricted access' );

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

JHTML::_('stylesheet', 'style.css', 'administrator/components/com_icagenda/add/css/');

class JFormFieldModal_param_place extends JFormField
{
	protected $type='modal_param_place';
	
	protected function getInput()
	{
		
		$db		= JFactory::getDbo();
		$query	= $db->getQuery(true);
		$query->select('a.place, a.id, a.coordinate')
			->from('`#__icagenda_events` AS a');
		$db->setQuery($query);
		$loc = $db->loadObjectList();
	
		$html= '
			<select id="'.$this->id.'_id"'.$class.' place="'.$this->place.'">
			<option value="NULL">-</option>';
		foreach ($loc as $l){
			$html.='<option value="'.$l->id.'"';
			if ($this->value == $l->id){
				$html.='selected="selected"';
			}
			$html.='>'.$l->place.'</option>';
			$span.='<span id="coord'.$l->id.'" style="display:none;">'.$l->coordinate.'</span>';
		}
		$html.='</select>'.$span;
			
		return $html;
	}
}components/com_icagenda/models/fields/modal/ictext_placeholder.php000060400000003074152453623450021533 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.3 2014-03-24
 * @since       3.2.10
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_ictext_Placeholder extends JFormField
{
	protected $type='modal_ictext_Placeholder';

	protected function getInput()
	{
		$class = JRequest::getVar('class');

		jimport('joomla.application.component.helper');
		$icagendaParams = JComponentHelper::getParams('com_icagenda');

		$replace = array("jform", "[", "]", "_Placeholder");
		$name = str_replace($replace, "", $this->name);

		$Type = $name . '_Placeholder';
		$tos_Type = $icagendaParams->get($Type);

		$placeholder = ( ! isset($tos_Type)) ? JText::_( 'COM_ICAGENDA_' . strtoupper($name) . '_PLACEHOLDER') : '';

		$html ='<input type="text" id="' . $this->id . '" class="' . $class . ' input-xxlarge" name="' . $this->name . '" value="' . $this->value . '" placeholder="' . $placeholder . '"/>';

		return $html;
	}
}
components/com_icagenda/models/fields/modal/template.php000060400000003665152453623450017512 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.4.1 2015-01-30
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_Template extends JFormField
{
	protected $type = 'modal_template';

	protected function getInput()
	{
		$url	= JPATH_SITE.'/components/com_icagenda/themes/packs';
		$list	= $this->getList($url);
		$class 	= !empty($this->class) ? ' class="' . $this->class . '"' : '';
		$html	= '<select id="' . $this->id . '_id"' . $class . ' name="' . $this->name . '">';

		foreach ($list as $l)
		{
			$html.= '<option value="' . $l . '"';

			if ($this->value == $l)
			{
				$html.= ' selected="selected"';
			}

			$html.= '>' . $l . '</option>';
		}

		$html.= '</select>';

		return $html;
	}

	function getList($dirname)
	{
		$arrayfiles = Array();

		if (file_exists($dirname))
		{
			$handle = opendir($dirname);

			while (false !== ($file = readdir($handle)))
			{
				if (!is_file($dirname.$file)
					&& $file != '.'
					&& $file != '..'
					&& $file != '.DS_Store'
					&& $file != '.htaccess'
					&& $file != '.thumbs'
					&& $file != 'index.php'
					&& $file != 'index.html'
					&& $file != 'php.ini'
					)
				{
					array_push($arrayfiles, $file);
				}
			}

			$handle = closedir($handle);
		}

		sort($arrayfiles);

		return $arrayfiles;
	}
}
components/com_icagenda/models/fields/modal/ictxt_type.php000060400000010034152453623450020057 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.2.5 2013-11-10
 * @since       3.2.5
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_ictxt_type extends JFormField
{
	/**
	 * The form field type.
	 */
	protected $type = 'modal_ictxt_type';

	/**
	 * Method to get the field input markup.
	 */
	protected function getInput()
	{
		jimport('joomla.application.component.helper');
		$icagendaParams = JComponentHelper::getParams('com_icagenda');

		$replace = array("jform", "[", "]", "_Type");
		$name = str_replace($replace, "", $this->name);

		$Type = $name.'_Type';
		$tos_Type = $icagendaParams->get($Type, '');

		$class_default = '';
		$class_article = '';
		$class_custom = '';
		$checked_default = '';
		$checked_article = '';
		$checked_custom = '';
		if ($tos_Type == '') {
			$class_default = 'btn-success';
			$checked_default = ' checked="checked"';
			$checked_article = '';
			$checked_custom = '';
		}
		elseif ($tos_Type == '1') {
			$class_article = 'btn-success';
			$checked_default = '';
			$checked_article = ' checked="checked"';
			$checked_custom = '';
		}
		elseif ($tos_Type == '2') {
			$class_custom = 'btn-success';
			$checked_default = '';
			$checked_article = '';
			$checked_custom = ' checked="checked"';
		} else {
			$class_default = 'btn-success';
			$checked_default = ' checked="checked"';
			$checked_article = '';
			$checked_custom = '';
		}

		$html	= array();
		$html[]	= '<fieldset class="radio btn-group">';
		$html[]	= '<label class="'.$class_default.'">'.JText::_( 'IC_DEFAULT' ).'<input type="radio"  id="'.$name.'_Type0" name="'.$this->name.'" value=""  onClick="tosdefault_'.$name.'();"'.$checked_default.' /></label>';
		$html[]	= '<label class="'.$class_article.'">'.JText::_( 'IC_ARTICLE' ).'<input type="radio"  id="'.$name.'_Type1" name="'.$this->name.'" value="1"  onClick="tosarticle_'.$name.'();"'.$checked_article.' /></label>';
		$html[]	= '<label class="'.$class_custom.'">'.JText::_( 'IC_CUSTOM_TEXT' ).'<input type="radio"  id="'.$name.'_Type2" name="'.$this->name.'" value="2"  onClick="toscustom_'.$name.'();"'.$checked_custom.' /></label>';
		$html[]	= '</fieldset>';



		$html[]	= '<script type="text/javascript">';
		$html[]	= 'function tosdefault_'.$name.'()';
		$html[]	= '{';
		$html[]	= 'document.getElementById("'.$name.'_default").style.display = "block";';
		$html[]	= 'document.getElementById("'.$name.'_article").style.display = "none";';
		$html[]	= 'document.getElementById("'.$name.'_custom").style.display = "none";';
		$html[]	= '$("#'.$name.'_Type0").attr("checked", "checked");';
		$html[]	= '}';
		$html[]	= 'function tosarticle_'.$name.'()';
		$html[]	= '{';
		$html[]	= 'document.getElementById("'.$name.'_default").style.display = "none";';
		$html[]	= 'document.getElementById("'.$name.'_article").style.display = "block";';
		$html[]	= 'document.getElementById("'.$name.'_custom").style.display = "none";';
		$html[]	= '$("#'.$name.'_Type1").attr("checked", "checked");';
		$html[]	= '}';
		$html[]	= 'function toscustom_'.$name.'()';
		$html[]	= '{';
		$html[]	= 'document.getElementById("'.$name.'_default").style.display = "none";';
		$html[]	= 'document.getElementById("'.$name.'_article").style.display = "none";';
		$html[]	= 'document.getElementById("'.$name.'_custom").style.display = "block";';
		$html[]	= '$("#'.$name.'_Type2").attr("checked", "checked");';
		$html[]	= '}';
		$html[]	= '</script>';

		return implode("\n", $html);
	}
}
components/com_icagenda/models/fields/modal/menulink.php000060400000003272152453623450017513 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rez�, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rez� (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.3.6 2014-04-29
 * @since       2.1.4
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_Menulink extends JFormField
{
	protected $type='modal_menulink';

	protected function getInput()
	{

		$db		= JFactory::getDbo();
		$query	= $db->getQuery(true);
		$query->select('a.title, a.published, a.id, a.path')
			->from('`#__menu` AS a')
			->where( "(link = 'index.php?option=com_icagenda&view=list') AND (published > 0)" );
		$db->setQuery($query);
		$link = $db->loadObjectList();
		$class = JRequest::getVar('class');

		$html= '
			<select id="'.$this->id.'_id"'.$class.' name="'.$this->name.'">';
		if ($this->name!='jform[catid]' && $this->name!='catid') $html.='<option value="">- '.JTEXT::_('JGLOBAL_AUTO').' -</option>';
		foreach ($link as $l){
		if ($l->published == '1') {
			$html.='<option value="'.$l->id.'"';
			if ($this->value == $l->id){
				$html.='selected="selected"';
			}
			$html.='>['.$l->id.'] '.$l->title.'</option>';
		}
		}
		$html.='</select>';
		return $html;

	}
}
components/com_icagenda/models/fields/modal/tos_default.php000060400000003740152453623450020202 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.2.0 2013-09-18
 * @since       3.2.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_tos_default extends JFormField
{
	protected $type='modal_tos_default';

//	protected function getLabel()
//	{
//	   return ' ';
//	}

	protected function getInput()
	{
		jimport('joomla.application.component.helper');
		$icagendaParams = JComponentHelper::getParams('com_icagenda');
		$tosContent = $icagendaParams->get('tosContent');
		$tos_Type = $icagendaParams->get('tos_Type', '');

		$html	= array();

		$html[] = '<div id="ic_default"><fieldset class="span9 iCleft">';
		$html[] = ''.JText::_( 'COM_ICAGENDA_SUBMIT_TOS_TYPE_DEFAULT_LBL' ).'<br /><div class="alert alert-info">'.JText::_( 'COM_ICAGENDA_TOS' ).'</div>';
		$html[] = '</fieldset></div>';

		if ($tos_Type == '') {
			$html[] = '<script type="text/javascript">';
			$html[] = 'document.getElementById("ic_default").style.display = "block";';
			$html[] = 'document.getElementById("ic_article").style.display = "none";';
			$html[] = 'document.getElementById("tos_custom").style.display = "none";';
			$html[] = '</script>';
		} else {
			$html[] = '<script type="text/javascript">';
			$html[] = 'document.getElementById("ic_default").style.display = "none";';
			$html[] = '</script>';
		}

		return implode("\n", $html);
	}
}
components/com_icagenda/models/fields/modal/media.php000060400000010700152453623450016742 0ustar00<?php
/**
 *	iCagenda
 *----------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright	Copyright (C) 2012 JOOMLIC - All rights reserved.

 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Jooml!C - http://www.joomlic.com
 *
 * @update		2013-04-04
 * @version		2.1.4
 *----------------------------------------------------------------------------
*/

// No direct access to this file
defined( '_JEXEC' ) or die( 'Restricted access' );

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_media extends JFormField
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  11.1
	 */
	protected $type = 'modal_media';

	/**
	 * The initialised state of the document object.
	 *
	 * @var    boolean
	 * @since  11.1
	 */
	protected static $initialised = false;

	/**
	 * Method to get the field input markup for a media selector.
	 * Use attributes to identify specific created_by and asset_id fields
	 *
	 * @return  string  The field input markup.
	 *
	 * @since   11.1
	 */
	protected function getInput()
	{
		$assetField = $this->element['asset_field'] ? (string) $this->element['asset_field'] : 'asset_id';
		$authorField = $this->element['created_by_field'] ? (string) $this->element['created_by_field'] : 'created_by';
		$asset = $this->form->getValue($assetField) ? $this->form->getValue($assetField) : (string) $this->element['asset_id'];
		if ($asset == '')
		{
			$asset = JRequest::getCmd('option');
		}

		$link = (string) $this->element['link'];
		if (!self::$initialised)
		{

			// Load the modal behavior script.
			JHtml::_('behavior.modal');

			// Build the script.
			$script = array();
			$script[] = '	function jInsertFieldValue(value, id) {';
			$script[] = '		var old_id = document.id(id).value;';
			$script[] = '		if (old_id != id) {';
			$script[] = '			var elem = document.id(id)';
			$script[] = '			elem.value = value;';
			$script[] = '			elem.fireEvent("change");';
			$script[] = '		}';
			$script[] = '	}';

			// Add the script to the document head.
			JFactory::getDocument()->addScriptDeclaration(implode("\n", $script));

			self::$initialised = true;
		}

		// Initialize variables.
		$html = array();
		$attr = '';

		// Initialize some field attributes.
		$attr .= $this->element['class'] ? ' class="' . (string) $this->element['class'] . '"' : '';
		$attr .= $this->element['size'] ? ' size="' . (int) $this->element['size'] . '"' : '';

		// Initialize JavaScript field attributes.
		$attr .= $this->element['onchange'] ? ' onchange="' . (string) $this->element['onchange'] . '"' : '';

		// The text field.
		$html[] = '<span class="media_field">';
		$html[] = '	<input type="text" name="' . $this->name . '" id="' . $this->id . '"' . ' value="'
			. htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8') . '"' . ' readonly="readonly"' . $attr . ' />';
		$html[] = '</span>';

		$directory = (string) $this->element['directory'];
		if ($this->value && file_exists(JPATH_ROOT . '/' . $this->value))
		{
			$folder = explode('/', $this->value);
			array_shift($folder);
			array_pop($folder);
			$folder = implode('/', $folder);
		}
		elseif (file_exists(JPATH_ROOT . '/' . JComponentHelper::getParams('com_media')->get('image_path', 'images') . '/' . $directory))
		{
			$folder = $directory;
		}
		else
		{
			$folder = '';
		}
		// The button.
		$html[] = '<span class="ic_button">';
		$html[] = '	<span class="blank">';
		$html[] = '		<a class="modal" title="' . JText::_('JLIB_FORM_BUTTON_SELECT') . '"' . ' href="'
			. ($this->element['readonly'] ? ''
			: ($link ? $link
				: 'index.php?option=com_media&amp;view=images&amp;tmpl=component&amp;asset=' . $asset . '&amp;author='
				. $this->form->getValue($authorField)) . '&amp;fieldid=' . $this->id . '&amp;folder=' . $folder) . '"'
			. ' rel="{handler: \'iframe\', size: {x: 800, y: 500}}">';
		$html[] = JText::_('JLIB_FORM_BUTTON_SELECT') . '</a>';
		$html[] = '	</span>';
		$html[] = '</span>';

		$html[] = '<span class="ic_button">';
		$html[] = '	<span class="blank">';
		$html[] = '		<a title="' . JText::_('JLIB_FORM_BUTTON_CLEAR') . '"' . ' href="#" onclick="';
		$html[] = 'document.id(\'' . $this->id . '\').value=\'\';';
		$html[] = 'document.id(\'' . $this->id . '\').fireEvent(\'change\');';
		$html[] = 'return false;';
		$html[] = '">';
		$html[] = JText::_('JLIB_FORM_BUTTON_CLEAR') . '</a>';
		$html[] = '	</span>';
		$html[] = '</span>';

		return implode("\n", $html);
	}
}
components/com_icagenda/models/fields/modal/icfile.php000060400000011750152453623450017124 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.2.13 2014-01-23
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.form.formfield');

class JFormFieldModal_icfile extends JFormField
{
	public $type = 'modal_icfile';


	protected static $initialised = false;

	/**
	 * Method to get the field input markup for a media selector.
	 * Use attributes to identify specific created_by and asset_id fields
	 *
	 * @return  string  The field input markup.
	 *
	 * @since   11.1
	 */
	protected function getInput()
	{
		$assetField = $this->element['asset_field'] ? (string) $this->element['asset_field'] : 'asset_id';
		$authorField = $this->element['created_by_field'] ? (string) $this->element['created_by_field'] : 'created_by';
		$asset = $this->form->getValue($assetField) ? $this->form->getValue($assetField) : (string) $this->element['asset_id'];
		if ($asset == '')
		{
			$asset = JRequest::getCmd('option');
		}

		$link = (string) $this->element['link'];
		if (!self::$initialised)
		{

			// Load the modal behavior script.
			JHtml::_('behavior.modal');

			// Build the script.
			$script = array();
			$script[] = '	function jInsertFieldValue(value, id) {';
			$script[] = '		var old_id = document.id(id).value;';
			$script[] = '		if (old_id != id) {';
			$script[] = '			var elem = document.id(id)';
			$script[] = '			elem.value = value;';
			$script[] = '			elem.fireEvent("change");';
			$script[] = '		}';
			$script[] = '	}';

			// Add the script to the document head.
			JFactory::getDocument()->addScriptDeclaration(implode("\n", $script));

			self::$initialised = true;
		}

		// Initialize variables.
		$html = array();
		$attr = '';

		// Initialize some field attributes.
		$attr .= $this->element['class'] ? ' class="' . (string) $this->element['class'] . '"' : '';
		$attr .= $this->element['size'] ? ' size="' . (int) $this->element['size'] . '"' : '';
		$attr .= $this->element['accept'] ? ' accept="' . (string) $this->element['accept'] . '"' : '';
		$attr .= ((string) $this->element['disabled'] == 'true') ? ' disabled="disabled"' : '';

		// Initialize JavaScript field attributes.
		$attr .= $this->element['onchange'] ? ' onchange="' . (string) $this->element['onchange'] . '"' : '';

		// The text field.
		if ($this->value == NULL) {
			$html[] = '<span>';
			$html[] = '	<input type="file" style="cursor: pointer" name="' . $this->name . '" id="' . $this->id . '"' . ' value="'
				. htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8') . '"' . ' ' . $attr . ' />';
			$html[] = '</span>';
		} else {
			$html[] = '<span>';
			$html[] = '	<input type="text" name="' . $this->name . '" id="' . $this->id . '"' . ' value="'
				. htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8') . '"' . ' readonly="readonly"' . $attr . ' />';
			$html[] = '</span>';
		}


		$folder = 'icagenda_doc';
		// The button.
//		$html[] = '<div class="button2-left">';
//		$html[] = '	<div class="blank">';
//		$html[] = '		<a class="modal" title="' . JText::_('JLIB_FORM_BUTTON_SELECT') . '"' . ' href="'
//			. ($this->element['readonly'] ? ''
//			: ($link ? $link
//				: 'index.php?option=com_media&amp;view=images&amp;tmpl=component&amp;asset=' . $asset . '&amp;author='
//				. $this->form->getValue($authorField)) . '&amp;fieldid=' . $this->id . '&amp;folder=' . $folder) . '"'
//			. ' rel="{handler: \'iframe\', size: {x: 800, y: 500}}">';
//		$html[] = JText::_('JLIB_FORM_BUTTON_SELECT') . '</a>';
//		$html[] = '	</div>';
//		$html[] = '</div>';

		if ($this->value == NULL) {
		$html[] = '<div class="button2-left">';
		$html[] = '	<div class="blank">';
		$html[] = '		<a title="' . JText::_('JLIB_FORM_BUTTON_CLEAR') . '"' . ' href="#" onclick="';
		$html[] = 'document.id(\'' . $this->id . '\').value=\'\';';
		$html[] = 'document.id(\'' . $this->id . '\').fireEvent(\'change\');';
		$html[] = 'return false;';
		$html[] = '">';
		$html[] = JText::_('JLIB_FORM_BUTTON_CLEAR') . '</a>';
		$html[] = '</div>';
		$html[] = '</div>';
		} else {
		$html[] = '<div class="button2-left">';
		$html[] = '	<div class="blank">';
		$html[] = '		<a title="' . JText::_('JLIB_FORM_BUTTON_CLEAR') . '"' . ' href="#" onclick="';
		$html[] = 'document.id(\'' . $this->id . '\').value=\'\';';
		$html[] = 'document.id(\'' . $this->id . '\').fireEvent(\'change\');';
		$html[] = 'return false;';
		$html[] = '">';
		$html[] = JText::_('JLIB_FORM_BUTTON_CLEAR') . '</a>';
		$html[] = '</div>';
		$html[] = '</div>';
		}

		return implode("\n", $html);







	}
}
components/com_icagenda/models/fields/modal/ic_editor.php000060400000003774152453623450017641 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.3.7 2014-05-18
 * @since       3.3.7
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_iC_editor extends JFormField
{
	/**
	 * The form field type.
	 */
	protected $type = 'modal_iC_editor';

	/**
	 * Method to get the field input markup.
	 */
	protected function getInput()
	{
		$icName = $this->name;
		$icDefault = $this->default;
		$icValue = $this->value;

		if (strpos($icValue,'\n') !== false)
		{
			$array_newline = array('\\n', '\n');
			$icValue = str_replace($array_newline, '<br />', $icValue);
		}

		$get_period_string = JText::_('COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_DEFAULT_BODY');
		$get_date_string = JText::_('COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_DEFAULT_BODY');

		if  ($icValue == 'COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_DEFAULT_BODY')
		{
			$icBody = $get_period_string;
		}
		elseif ($icValue == 'COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_DEFAULT_BODY')
		{
			$icBody = $get_date_string;
		}
		else
		{
			$icBody = $icValue;
		}

		$editor = JFactory::getEditor();

		$html	= array();

		$html[] = '<div id="'.$this->name.'_ic_editor"><fieldset class="span9 iCleft">';
		$html[] = $editor->display($this->name, $icBody, "100%", "300", "300", "20", 1, null, null, null, array('mode' => 'advanced'));
		$html[] = '</fieldset></div>';

		return implode("\n", $html);
	}
}
components/com_icagenda/models/fields/modal/date.php000060400000010726152453623450016610 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.10 2015-08-13
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

/**
 * Supports unlimited modal datetime picker (add / delete).
 *
 * @package		iCagenda
 * @subpackage	com_icagenda
 * @since		1.0
 */
class JFormFieldModal_date extends JFormField
{
	protected $type = 'modal_date';

	protected function getInput()
	{
		$lang = JFactory::getLanguage();

		$id_suffix = ($lang->getTag() == 'fa-IR') ? '_jalali' : '';

		if ($lang->getTag() == 'fa-IR')
		{
			// Including fallback code for HTML5 non supported browsers.
			JHtml::_('jquery.framework');
			JHtml::_('script', 'system/html5fallback.js', false, true);
		}

		$id = JRequest::getInt('id');
		$class = !empty($this->class) ? ' ' . $this->class : '';

		$session = JFactory::getSession();
		$datesDB = $session->get('ic_submit_dates', '');

		if ($id && empty($datesDB))
		{
			$db	= JFactory::getDBO();
			$db->setQuery(
				'SELECT a.dates' .
				' FROM #__icagenda_events AS a' .
				' WHERE a.id = '.(int) $id
			);
			$datesDB = $db->loadResult();
		}

		$dates = iCString::isSerialized($datesDB) ? unserialize($datesDB) : false;

//		if ($lang->getTag() == 'fa-IR'
//			&& $dates
//			&& $dates != array('0000-00-00 00:00'))
//		{
//			$dates_to_sql = array();

//			foreach ($dates AS $date)
//			{
//				if (iCDate::isDate($date))
//				{
//					$year		= date('Y', strtotime($date));
//					$month		= date('m', strtotime($date));
//					$day		= date('d', strtotime($date));
//					$time		= date('H:i', strtotime($date));

//					$dates_to_sql[] = iCGlobalizeConvert::gregorianToJalali($year, $month, $day, true) . ' ' . $time;
//				}
//			}

//			$dates = $dates_to_sql;
//		}

		$html = '<table id="dTable' . $id_suffix . '" style="border:0px">';

		$html.= '<thead>';
		$html.= '<tr>';
		$html.= '<th width="70%">';
		$html.= JText::_('COM_ICAGENDA_TB_DATE');
		$html.= '</th>';
		$html.= '<th width="30%">';
//		$html.= JText::_('COM_ICAGENDA_TB_ACT');
		$html.= '</th>';
		$html.= '</tr>';
		$html.= '</thead>';

		$add_counter = 0;

		if ($dates
			&& $dates != array('0000-00-00 00:00'))
		{
			foreach ($dates as $date)
			{
				$html.= '<tr>';
				$html.= '<td>';

				if ($lang->getTag() == 'fa-IR')
				{
					$add_counter = $add_counter+1;
//					$this_number = $add_counter ? $add_counter : '';
					$html.= JHtml::_('calendar', $date, 'd', 'date_jalali' . $add_counter, '%Y-%m-%d %H:%M', ' class="ic-date-input' . $id_suffix . '"');
				}
				else
				{
					$html.= '<input class="ic-date-input' . $id_suffix . '" type="text" name="d" value="' . $date . '" />';
				}

				$html.= '</td>';
				$html.= '<td>';
				$html.= '<a class="del btn btn-danger btn-mini" href="#">' . JText::_('COM_ICAGENDA_DELETE_DATE') . '</a>';
				$html.= '</td>';
				$html.= '</tr>';
			}

			// clear the data so we don't process it again
			$session->clear('ic_submit_dates');
		}
		else
		{
			$html.= '<tr>';
			$html.= '<td>';

			if ($lang->getTag() == 'fa-IR')
			{
				$html.= JHtml::_('calendar', '0000-00-00 00:00', 'd', 'date_jalali', '%Y-%m-%d %H:%M', ' class="ic-date-input' . $id_suffix . '"');
			}
			else
			{
				$html.= '<input class="ic-date-input' . $id_suffix . '" type="text" name="d" value="0000-00-00 00:00" />';
			}
			$html.= '</td>';
			$html.= '<td>';
			$html.= '<a class="del btn btn-danger btn-mini" href="#">' . JText::_('COM_ICAGENDA_DELETE_DATE') . '</a>';
			$html.= '</td>';
			$html.= '</tr>';
		}

		$html.= '</table>';

		$html.= '<a id="add" href="#"><span class="btn btn-success btn-small input-medium" style="float:left"><strong>' . JText::_('COM_ICAGENDA_ADD_DATE') . '</strong></span></a><br/>';

		$html.= '<input type="hidden"';
		$html.= ' class="date' . $class . '"';
		$html.= ' id="' . $this->id . '_id"';
		$html.= ' name="' . $this->name . '"';
		$html.= ' value=\''.$datesDB.'\'';
		$html.= '/>';

		return $html;
	}
}
components/com_icagenda/models/fields/modal/ictext_type.php000060400000005643152453623450020236 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.2.0.1 2013-09-22
 * @since       3.2.0.1
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_ictext_type extends JFormField
{
	protected $type='modal_ictext_type';

	protected function getInput()
	{
		jimport('joomla.application.component.helper');

		$icagendaParams = JComponentHelper::getParams('com_icagenda');

		$replace = array("jform", "[", "]");
		$name = str_replace($replace, "", $this->name);
		$Type = $icagendaParams->get($name, '');

		$Type_default = $name.'_default';
		$Type_content = $name.'_custom';

		$class_default = '';
		$class_custom = '';
		$checked_default = '';
		$checked_custom = '';
		if ($Type == '') {
			$class_default = 'btn-success';
			$checked_default = ' checked="checked"';
			$checked_custom = '';
		}
		elseif ($Type == '2') {
			$class_custom = 'btn-success';
			$checked_default = '';
			$checked_custom = ' checked="checked"';
		} else {
			$class_default = 'btn-success';
			$checked_default = ' checked="checked"';
			$checked_custom = '';
		}

		$html	= array();
		$html[]	= '<fieldset class="radio btn-group">';
		$html[]	= '<label class="'.$class_default.'">'.JText::_( 'IC_DEFAULT' ).'<input type="radio"  id="'.$name.'_0" name="'.$this->name.'" value=""  onClick="icdefault_'.$name.'();"'.$checked_default.' /></label>';
		$html[]	= '<label class="'.$class_custom.'">'.JText::_( 'IC_CUSTOM_TEXT' ).'<input type="radio"  id="'.$name.'_2" name="'.$this->name.'" value="2"  onClick="iccustom_'.$name.'();"'.$checked_custom.' /></label>';
		$html[]	= '</fieldset>';



		$html[]	= '<script type="text/javascript">';
		$html[]	= 'function icdefault_'.$name.'()';
		$html[]	= '{';
//		$html[]	= 'document.getElementById("'.$Type_default.'").style.display = "block";';
		$html[]	= 'document.getElementById("'.$Type_content.'").style.display = "none";';
		$html[]	= '$("#'.$name.'_0").attr("checked", "checked");';
		$html[]	= '}';
		$html[]	= 'function iccustom_'.$name.'()';
		$html[]	= '{';
//		$html[]	= 'document.getElementById("'.$Type_default.'").style.display = "none";';
		$html[]	= 'document.getElementById("'.$Type_content.'").style.display = "block";';
		$html[]	= '$("#'.$name.'_2").attr("checked", "checked");';
		$html[]	= '}';
		$html[]	= '</script>';

		return implode("\n", $html);
	}
}
components/com_icagenda/models/fields/modal/color.php000060400000001725152453623450017010 0ustar00<?php
/** 
 *	iCagenda
 *----------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright	Copyright (C) 2012 JOOMLIC - All rights reserved.
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Jooml!C - http://www.joomlic.com
 * 
 * @update		2.0.4
 *----------------------------------------------------------------------------
*/

// No direct access to this file
defined( '_JEXEC' ) or die( 'Restricted access' );

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');


class JFormFieldModal_color extends JFormField
{
	protected $type='modal_color';
	
	protected function getInput()
	{
		$html= '
		<div class="color">
			<div class="form-item">
				<input type="text" id="'.$this->id.'" name="'.$this->name.'" value="'.$this->value.'" />
			</div>
			<div id="picker"></div>
			<div class="clr"></div>
		</div>
		<div class="clr"></div>
		';

		return $html;
	}
}components/com_icagenda/models/fields/modal/icmulti_opt.php000060400000007047152453623450020225 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.2.6 2013-11-20
 * @since       3.2.6
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_icmulti_opt extends JFormField
{
	protected $type='modal_icmulti_opt';

	protected function getInput()
	{

		$replace = array("jform", "params", "[", "]");
		$name_input = str_replace($replace, "", $this->name);
		$get_location = explode('_', $name_input);
		$location = $get_location['1'];
		$name = $get_location['0'];

		$Type = $this->value;

		$Type_none = $name.'_none';
		$Type_checkbox = $name.'_checkbox';

		$class_global = 'btn-primary';
		$class_none = 'btn-danger';
		$class_checkbox = 'btn-success';
		$checked_none = ' checked="checked"';
		$checked_checkbox = '';
		if ($Type == '0') {
			$class_global = '';
			$class_none = 'btn-danger';
			$class_checkbox = '';
			$checked_global = '';
			$checked_none = ' checked="checked"';
			$checked_checkbox = '';
		}
		elseif ($Type == '1') {
			$class_global = '';
			$class_none = '';
			$class_checkbox = 'btn-success';
			$checked_global = '';
			$checked_none = '';
			$checked_checkbox = ' checked="checked"';
		}
		else {
			$class_global = 'btn-primary';
			$class_none = '';
			$class_checkbox = '';
			$checked_global = ' checked="checked"';
			$checked_none = '';
			$checked_checkbox = '';
		}

		$html	= array();


		$html[]	= '<fieldset class="radio btn-group">';
		if ($location == 'menu') {
			$html[]	= '<label class="'.$class_global.'">'.JText::_( 'JGLOBAL_USE_GLOBAL' ).'<input type="radio"  id="'.$name.'_global" name="'.$this->name.'" value="global"  onClick="icglobal_'.$name.'();"'.$checked_global.' /></label>';
		}
		$html[]	= '<label class="'.$class_none.'">'.JText::_( 'JNO' ).'<input type="radio"  id="'.$name.'_0" name="'.$this->name.'" value="0"  onClick="icnone_'.$name.'();"'.$checked_none.' /></label>';
		$html[]	= '<label class="'.$class_checkbox.'">'.JText::_( 'JYES' ).'<input type="radio"  id="'.$name.'_1" name="'.$this->name.'" value="1"  onClick="iccheckbox_'.$name.'();"'.$checked_checkbox.' /></label>';
		$html[]	= '</fieldset>';


		$html[]	= '<script type="text/javascript">';
		$html[]	= 'var typeset = '.$Type.';';
		if ($location == 'menu') {
			$html[]	= 'function icglobal_'.$name.'()';
			$html[]	= '{';
			$html[]	= 'document.getElementById("'.$Type_checkbox.'").style.display = "none";';
			$html[]	= '$("#'.$name.'_global").attr("checked", "checked");';
			$html[]	= '}';
		}
		$html[]	= 'function icnone_'.$name.'()';
		$html[]	= '{';
		$html[]	= 'document.getElementById("'.$Type_checkbox.'").style.display = "none";';
		$html[]	= '$("#'.$name.'_0").attr("checked", "checked");';
		$html[]	= '}';
		$html[]	= 'function iccheckbox_'.$name.'()';
		$html[]	= '{';
		$html[]	= 'document.getElementById("'.$Type_checkbox.'").style.display = "block";';
		$html[]	= '$("#'.$name.'_1").attr("checked", "checked");';
		$html[]	= '}';
		$html[]	= '</script>';

		return implode("\n", $html);
	}
}
components/com_icagenda/models/fields/modal/iclink_url.php000060400000005123152453623450020021 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.1 2015-02-27
 * @since       3.3.3
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

/**
 * Supports a url type field.
 */
class JFormFieldModal_iclink_url extends JFormField
{
	/**
	 * The form field type.
	 */
	protected $type='modal_iclink_url';

	/**
	 * Method to get the field input markup.
	 */
	protected function getInput()
	{
		jimport('joomla.application.component.helper');
		$icagendaParams	= JComponentHelper::getParams('com_icagenda');

		$Explode		= explode('_', $this->name);
		$TypeName		= $Explode[0] . ']';

		$replace		= array("jform", "params", "[", "]");
		$name			= str_replace($replace, "", $TypeName);

		$Type			= JRequest::getVar('type');

		$Type_default	= $name.'_default';
		$Type_article	= $name.'_article';
		$Type_url		= $name.'_url';


		$editor = JFactory::getEditor();

		$html	= array();

		$html[] = '<div id="' . $Type_url . '"><fieldset class="span9 iCleft">';
		$html[] = '<input type="url" name="' . $this->name . '" value="' . $this->value . '" />';
		$html[] = '</fieldset></div>';

		// Article
		if ($Type == '1')
		{
			$html[] = '<script type="text/javascript">';
			$html[] = 'document.getElementById("' . $Type_article . '").style.display = "block";';
			$html[] = 'document.getElementById("' . $Type_url . '").style.display = "none";';
			$html[] = '</script>';
		}

		// URL
		elseif ($Type == '2')
		{
			$html[] = '<script type="text/javascript">';
			$html[] = 'document.getElementById("' . $Type_article . '").style.display = "none";';
			$html[] = 'document.getElementById("' . $Type_url . '").style.display = "block";';
			$html[] = '</script>';
		}

		// iCagenda default
		else
		{
			$html[] = '<script type="text/javascript">';
			$html[] = 'document.getElementById("' . $Type_article . '").style.display = "none";';
			$html[] = 'document.getElementById("' . $Type_url . '").style.display = "none";';
			$html[] = '</script>';
		}

		return implode("\n", $html);
	}
}
components/com_icagenda/models/fields/modal/ictxt_default.php000060400000005000152453623450020517 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.2.5 2013-11-10
 * @since       3.2.5
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_ictxt_default extends JFormField
{
	/**
	 * The form field type.
	 */
	protected $type = 'modal_ictxt_default';

	/**
	 * Method to create a blank label.
	 */
	protected function getLabel()
	{
	   return ' ';
	}

	/**
	 * Method to get the field input markup.
	 */
	protected function getInput()
	{
		jimport('joomla.application.component.helper');
		$icagendaParams = JComponentHelper::getParams('com_icagenda');

		$replace = array("jform", "[", "]", "Default");
		$name = str_replace($replace, "", $this->name);

		$tos_Type = $icagendaParams->get($name.'_Type', '');

		$Type_default = $name.'_default';
		$Type_article = $name.'_article';
		$Type_content = $name.'_custom';

		$html	= array();

		$html[] = '<div id="'.$name.'_default"><fieldset class="span9 iCleft">';
		$html[] = '<div class="alert alert-error">';
		if(version_compare(JVERSION, '3.0', 'ge')) {
			$html[] = '<i class="icon-warning-2"></i>';
		}
		$html[] = ' '.JText::sprintf( 'COM_ICAGENDA_TERMS_IMPORTANT_INFOS', $this->description ).'</div><div>'.JText::_( 'COM_ICAGENDA_SUBMIT_TOS_TYPE_DEFAULT_LBL' ).'<br /><small>'.$this->description.'</small></div><div class="alert alert-info">'.JText::_( $this->description ).'</div>';
		$html[] = '<input type="hidden" id="'.$this->id.'_id" name="'.$this->name.'" value="'.$this->value.'" />';
		$html[] = '</fieldset></div>';

		if ($tos_Type == '') {
			$html[] = '<script type="text/javascript">';
			$html[] = 'document.getElementById("'.$name.'_default").style.display = "block";';
			$html[] = '</script>';
		} else {
			$html[] = '<script type="text/javascript">';
			$html[] = 'document.getElementById("'.$name.'_default").style.display = "none";';
			$html[] = '</script>';
		}

		return implode("\n", $html);
	}
}
components/com_icagenda/models/fields/modal/ic_password.php000060400000002352152453623450020204 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-12-21
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_ic_password extends JFormField
{
	protected $type='modal_ic_password';

	protected function getInput()
	{
		$_pass = str_replace('/', '.', $this->value);
		$pass_ex = explode('.', $_pass);

		if (isset($pass_ex[1]))
		{
			$value = base64_decode($pass_ex[1]);
		}
		else
		{
			$value = $this->value;
		}

		$html = '<input type="password" id="' . $this->id . '" name="' . $this->name . '" value="' . $value . '" />';

		return $html;
	}
}
components/com_icagenda/models/fields/modal/multicat.php000060400000004063152453623450017512 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-12-06
 * @since       3.2.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );
jimport('joomla.form.formfield');

class JFormFieldModal_multicat extends JFormField
{
	protected $type='modal_multicat';

	protected function getInput()
	{
		// Initialize some field attributes.
		$class	= !empty($this->class) ? ' class="' . $this->class . '"' : '';

		// Query List of Categories
		$db		= JFactory::getDbo();
		$query	= $db->getQuery(true);
		$query->select('a.title, a.state, a.id')
			->from('`#__icagenda_category` AS a');
		$db->setQuery($query);
		$cat	= $db->loadObjectList();

		if (!is_array($this->value))
		{
			$this->value = array($this->value);
		}

		$html = ' <select multiple id="' . $this->id . '_id" name="' . $this->name . '"' . $class . '>';

		if (version_compare(JVERSION, '3.0', 'lt'))
		 {
			if ($this->name != 'jform[catid]' && $this->name != 'catid')
			{
				$html.= '<option value="0"';

				if (in_array('0', $this->value))
				{
					$html.= ' selected="selected"';
				}

				$html.= '>-- '.JTEXT::_('COM_ICAGENDA_ALL_CATEGORIES').' --</option>';
			}
		}

		foreach ($cat as $c)
		{
			if ($c->state == '1')
			{
				$html.= '<option value="' . $c->id . '"';

				if ( (in_array($c->id, $this->value)) && (!in_array('0', $this->value)) )
				{
					$html.= ' selected="selected"';
				}

				$html.= '>' . $c->title . '</option>';
			}
		}

		$html.= '</select>';

		return $html;
	}
}
components/com_icagenda/models/themes.php000060400000034351152453623450014616 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.0 2013-06-04
 * @since       2.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.modellist');
jimport( 'joomla.html.parameter' );

if(version_compare(JVERSION, '3.0', 'ge')) {
	jimport( 'joomla.installer.installer' );
	jimport( 'joomla.installer.helper' );
	jimport( 'joomla.filesystem.folder' );
}

/**
 * Model Admin - Theme Manager - iCagenda
 */
class iCagendaModelthemes extends JModelList
{

	protected 	$_paths 	= array();
	protected 	$_manifest 	= null;
	protected	$option 		= 'com_icagenda';
	protected 	$text_prefix	= 'com_icagenda';

	function __construct(){
		parent::__construct();
	}

	public function getForm($data = array(), $loadData = true) {

		$app	= JFactory::getApplication();
		$form 	= $this->loadForm('com_icagenda.template', 'themes', array('control' => 'jform', 'load_data' => $loadData));
		if (empty($form)) {
			return false;
		}
		return $form;
	}

	function install($theme) {
		$app		= JFactory::getApplication();
		$db 		= JFactory::getDBO();
		$package 	= $this->_getPackageFromUpload();

		if (!$package) {
			JError::raiseWarning(1, JText::_('COM_ICAGENDA_ERROR_FIND_INSTALL_PACKAGE'));
			$this->deleteTempFiles();
			return false;
		}

		if ($package['dir'] && JFolder::exists($package['dir'])) {
			$this->setPath('source', $package['dir']);
		} else {
			JError::raiseWarning(1, JText::_('COM_ICAGENDA_ERROR_INSTALL_PATH_NOT_EXISTS'));
			$this->deleteTempFiles();
			return false;
		}

		// We need to find the installation manifest file
		if (!$this->_findManifest()) {
			JError::raiseWarning(1, JText::_('COM_ICAGENDA_ERROR_FIND_INFO_INSTALL_PACKAGE'));
			$this->deleteTempFiles();
			return false;
		}

		// Files - copy files in manifest
		foreach ($this->_manifest->children() as $child)
		{
			if (is_a($child, 'JXMLElement') && $child->name() == 'files') {
				if ($this->parseFiles($child) === false) {
					JError::raiseWarning(1, JText::_('COM_ICAGENDA_ERROR_FIND_INFO_INSTALL_PACKAGE'));
					$this->deleteTempFiles();
					return false;
				}
			}
		}

		// File - copy the xml file
		$copyFile 		= array();
		$path['src']	= $this->getPath( 'manifest' ); // XML file will be copied too
		$path['dest']	= JPATH_SITE.DS.'components'.DS.'com_icagenda'.DS.'themes'.DS. basename($this->getPath('manifest'));
		$copyFile[] 	= $path;
		$this->copyFiles($copyFile, array());
		$this->deleteTempFiles();

		// -------------------
		// Themes
		// -------------------
		// Params -  Get new themes params
		$paramsThemes = $this->getParamsThemes();


		// -------------------
		// Component
		// -------------------
		if (isset($theme['component']) && $theme['component'] == 1 ) {

			$component			= 'com_icagenda';
			$paramsC			= JComponentHelper::getParams($component) ;

			foreach($paramsThemes as $keyT => $valueT) {
if(version_compare(JVERSION, '3.0', 'lt')) {
				$paramsC->setValue($valueT['name'], $valueT['value']);
} else {
				$paramsC->set($valueT['name'], $valueT['value']);
}
			}

			$data['params'] 	= $paramsC->toArray();
			$table 				= JTable::getInstance('extension');

			$idCom				= $table->find( array('element' => $component ));
			$table->load($idCom);

			if (!$table->bind($data)) {
				JError::raiseWarning( 500, 'Not a valid component' );
				return false;
			}

			// pre-save checks
			if (!$table->check()) {
				JError::raiseWarning( 500, $table->getError('Check Problem') );
				return false;
			}

			// save the changes
			if (!$table->store()) {
				JError::raiseWarning( 500, $table->getError('Store Problem') );
				return false;
			}
		}

		return true;
	}

	function _getPackageFromUpload()
	{
		// Get the uploaded file information
		$userfile = JRequest::getVar('Filedata', null, 'files', 'array' );
// 2.5		$userfile = JRequest::getVar('install_package', null, 'files', 'array' );

		// Make sure that file uploads are enabled in php
		if (!(bool) ini_get('file_uploads')) {
			JError::raiseWarning('SOME_ERROR_CODE', JText::_('COM_ICAGENDA_ERROR_INSTALL_FILE_UPLOAD'));
			return false;
		}

		// Make sure that zlib is loaded so that the package can be unpacked
		if (!extension_loaded('zlib')) {
			JError::raiseWarning('SOME_ERROR_CODE', JText::_('COM_ICAGENDA_ERROR_INSTALL_ZLIB'));
			return false;
		}

		// If there is no uploaded file, we have a problem...
		if (!is_array($userfile) ) {
			JError::raiseWarning('SOME_ERROR_CODE', JText::_('COM_ICAGENDA_ERROR_NO_FILE_SELECTED'));
			return false;
		}

		// Check if there was a problem uploading the file.
		if ( $userfile['error'] || $userfile['size'] < 1 ) {
			JError::raiseWarning('SOME_ERROR_CODE', JText::_('COM_ICAGENDA_ERROR_UPLOAD_FILE'));
			return false;
		}

		// Build the appropriate paths
if(version_compare(JVERSION, '3.0', 'lt')) {
		$config 	=& JFactory::getConfig();
		$tmp_dest 	= $config->getValue('config.tmp_path').DS.$userfile['name'];
} else {
		$config 	=& JFactory::getConfig();
		$tmp_dest 	= $config->get('tmp_path') . '/' . $userfile['name'];
}

		$tmp_src	= $userfile['tmp_name'];

		// Move uploaded file
		jimport('joomla.filesystem.file');
		$uploaded = JFile::upload($tmp_src, $tmp_dest);

		// Unpack the downloaded package file
if(version_compare(JVERSION, '3.0', 'lt')) {
		$package = JInstallerHelper::unpack($tmp_dest);
} else {
		$package = self::unpack($tmp_dest);
}

		$this->_manifest =& $manifest;

		$this->setPath('packagefile', $package['packagefile']);
		$this->setPath('extractdir', $package['extractdir']);

		return $package;
	}

	function getPath($name, $Default=null) {
		return (!empty($this->_paths[$name])) ? $this->_paths[$name] : $Default;
	}

	function setPath($name, $value) {
		$this->_paths[$name] = $value;
	}

	function _findManifest() {
		// Get an array of all the xml files from teh installation directory
		$xmlfiles = JFolder::files($this->getPath('source'), '.xml$', 1, true);

		// If at least one xml file exists
		if (count($xmlfiles) > 0) {
			foreach ($xmlfiles as $file)
			{
				// Is it a valid joomla installation manifest file?
				$manifest = $this->_isManifest($file);
				if (!is_null($manifest)) {

					$attr = $manifest->attributes();
					if ((string)$attr['method'] != 'icthemes') {
						JError::raiseWarning(1, JText::_('COM_ICAGENDA_ERROR_NO_THEME_FILE'));
						return false;
					}

					// Set the manifest object and path
					$this->_manifest =& $manifest;
					$this->setPath('manifest', $file);

					// Set the installation source path to that of the manifest file
					$this->setPath('source', dirname($file));

					return true;
				}
			}

			// None of the xml files found were valid install files
			JError::raiseWarning(1, JText::_('COM_ICAGENDA_ERROR_XML_INSTALL_ICAGENDA'));
			return false;
		} else {
			// No xml files were found in the install folder
			JError::raiseWarning(1, JText::_('COM_ICAGENDA_ERROR_XML_INSTALL'));
			return false;
		}
	}

	function _isManifest($file) {
		$xml	= JFactory::getXML($file, true);
		if (!$xml) {
			unset ($xml);
			return null;
		}
		if (!is_object($xml) || ($xml->name() != 'install' )) {
			unset ($xml);
			return null;
		}
		return $xml;
	}


	function parseFiles($element, $cid=0) {
		$copyfiles 		= array();
		$copyfolders 	= array();

		if (!is_a($element, 'JXMLElement') || !count($element->children())) {
			return 0;// Either the tag does not exist or has no children therefore we return zero files processed.
		}

		$files = $element->children();// Get the array of file nodes to process

		if (count($files) == 0) {
			return 0;// No files to process
		}

		$source 	 	= $this->getPath('source');
		$destination 	= JPATH_SITE.DS.'components'.DS.'com_icagenda'.DS.'themes';
		$destination2 	= JPATH_SITE.DS.'components'.DS.'com_icagenda'.DS.'themes'.DS.'packs';

if(version_compare(JVERSION, '3.0', 'lt')) {
		foreach ($files as $file) {
			if ($file->name() == 'folder') {
				$path['src']	= $source.DS.$file->data();
				$path['dest']	= $destination2.DS.$file->data();
				$copyfolders[] = $path;
			} else {
				$path['src']	= $source.DS.$file->data();
				$path['dest']	= $destination.DS.$file->data();
				$copyfiles[] = $path;
			}
		}
} else {
		if(!empty($files->folder)){
			foreach ($files->folder as $fk => $fv) {
				$path['src']	= $source . '/' . $fv;
				$path['dest']	= $destination2 . '/' . $fv;
				$copyfolders[] = $path;
			}
		}
		if (!empty($files->filename)) {
			foreach($files->filename as $fik => $fiv) {
				$path['src']	= $source . '/' . $fiv;
				$path['dest']	= $destination . '/' . $fiv;
				$copyfiles[] = $path;
			}
		}
}

		return $this->copyFiles($copyfiles, $copyfolders);
	}

	function copyFiles($files, $folders) {

		$i = 0;
		$fileIncluded = $folderIncluded = 0;
		if (is_array($folders) && count($folders) > 0)
		{
			foreach ($folders as $folder)
			{
				// Get the source and destination paths
				$foldersource	= JPath::clean($folder['src']);
				$folderdest		= JPath::clean($folder['dest']);

				if (!JFolder::exists($foldersource)) {
					JError::raiseWarning(1, JText::sprintf('COM_ICAGENDA_FOLDER_NOT_EXISTS', $foldersource));
					return false;
				} else {
					if (!(JFolder::copy($foldersource, $folderdest, '', true))) {
						JError::raiseWarning(1, JText::sprintf('COM_ICAGENDA_ERROR_COPY_FOLDER_TO', $foldersource, $folderdest));
						return false;
					} else {
						$i++;
					}
				}
			}
			$folderIncluded = 1;
		}

		if (is_array($files) && count($files) > 0)
		{
			foreach ($files as $file)
			{
				// Get the source and destination paths
				$filesource	= JPath::clean($file['src']);
				$filedest	= JPath::clean($file['dest']);

				if (!file_exists($filesource)) {
					JError::raiseWarning(1, JText::sprintf('COM_ICAGENDA_FILE_NOT_EXISTS', $filesource));
					return false;
				} else {
					if (!(JFile::copy($filesource, $filedest))) {
						JError::raiseWarning(1, JText::sprintf('COM_ICAGENDA_ERROR_COPY_FILE_TO', $filesource, $filedest));
						return false;
					} else {
						$i++;
					}
				}
			}
			$fileIncluded = 1;
		}

		if ($fileIncluded == 0 && $folderIncluded ==0) {
			JError::raiseWarning(1, JText::sprintf('COM_ICAGENDA_ERROR_INSTALL_FILE'));
			return false;
		}

		return $i;// Possible TO DO, now it returns count folders and files togeter, //return count($files);
	}

	protected function getParamsThemes() {

		$element = $this->_manifest->children()->params;

		if (!is_a($element, 'JXMLElement') || !count($element->children())) {
			return null;// Either the tag does not exist or has no children therefore we return zero files processed.
		}

		$params = $element->children();
		if (count($params) == 0) {
			return null;// No params to process
		}

		// Process each parameter in the $params array.
		$paramsArray = array();
		$i=0;
		foreach ($params as $param) {
			if (!$name = $param['name']) {
				continue;
			}
			if (!$value = $param['default']) {
				continue;
			}

			$paramsArray[$i]['name'] = (string)$name;
			$paramsArray[$i]['value'] = (string)$value;
			$i++;
		}
		return $paramsArray;
	}

	function deleteTempFiles() {
		$path = $this->getPath('source');
		if (is_dir($path)) {
			$val = JFolder::delete($path);
		} else if (is_file($path)) {
			$val = JFile::delete($path);
		}
		$packageFile = $this->getPath('packagefile');
		if (is_file($packageFile)) {
			$val = JFile::delete($packageFile);
		}
		$extractDir = $this->getPath('extractdir');
		if (is_dir($extractDir)) {
			$val = JFolder::delete($extractDir);
		}
	}


	/*
	 * Added @since 3.0.
	 */
	public static function unpack($p_filename)
	{
		// Path to the archive
		$archivename = $p_filename;

		// Temporary folder to extract the archive into
		$tmpdir = uniqid('install_');

		// Clean the paths to use for archive extraction
		$extractdir = JPath::clean(dirname($p_filename) . '/' . $tmpdir);
		$archivename = JPath::clean($archivename);

		// Do the unpacking of the archive
		try
		{
			JArchive::extract($archivename, $extractdir);
		}
		catch (Exception $e)
		{
			return false;
		}

		/*
		 * Let's set the extraction directory and package file in the result array so we can
		 * cleanup everything properly later on.
		 */
		$retval['extractdir'] = $extractdir;
		$retval['packagefile'] = $archivename;

		/*
		 * Try to find the correct install directory.  In case the package is inside a
		 * subdirectory detect this and set the install directory to the correct path.
		 *
		 * List all the items in the installation directory.  If there is only one, and
		 * it is a folder, then we will set that folder to be the installation folder.
		 */
		$dirList = array_merge(JFolder::files($extractdir, ''), JFolder::folders($extractdir, ''));

		if (count($dirList) == 1)
		{
			if (JFolder::exists($extractdir . '/' . $dirList[0]))
			{
				$extractdir = JPath::clean($extractdir . '/' . $dirList[0]);
			}
		}

		/*
		 * We have found the install directory so lets set it and then move on
		 * to detecting the extension type.
		 */
		$retval['dir'] = $extractdir;

		/*
		 * Get the extension type and return the directory/type array on success or
		 * false on fail.
		 */
		$retval['type'] = self::detectType($extractdir);
		if ($retval['type'])
		{
			return $retval;
		}
		else
		{
			return false;
		}
	}

	/*
	 * Added @since 3.0.
	 */
	public static function detectType($p_dir)
	{
		// Search the install dir for an XML file
		$files = JFolder::files($p_dir, '\.xml$', 1, true);

		if (!count($files))
		{
			JLog::add(JText::_('JLIB_INSTALLER_ERROR_NOTFINDXMLSETUPFILE'), JLog::WARNING, 'jerror');
			return false;
		}

		foreach ($files as $file)
		{
			$xml = simplexml_load_file($file);

			if (!$xml)
			{
				continue;
			}

			if ($xml->getName() != 'install')
			{
				unset($xml);
				continue;
			}

			$type = (string) $xml->attributes()->type;

			// Free up memory
			unset($xml);
			return $type;
		}

		JLog::add(JText::_('JLIB_INSTALLER_ERROR_NOTFINDJOOMLAXMLSETUPFILE'), JLog::WARNING, 'jerror');

		// Free up memory.
		unset($xml);
		return false;
	}

}
?>
components/com_icagenda/models/feature.php000060400000010215152453623450014755 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      doorknob
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-12-05
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.modeladmin');

/**
 * iCagenda model.
 */
class iCagendaModelfeature extends JModelAdmin
{
	/**
	 * @var		string	The prefix to use with controller messages.
	 * @since	3.4.0
	 */
	protected $text_prefix = 'COM_ICAGENDA';

	/**
	 * Returns a reference to the a Table object, always creating it.
	 *
	 * @param	type	The table type to instantiate
	 * @param	string	A prefix for the table class name. Optional.
	 * @param	array	Configuration array for model. Optional.
	 * @return	JTable	A database object
	 * @since	3.4.0
	 */
	public function getTable($type = 'Feature', $prefix = 'iCagendaTable', $config = array())
	{
		return JTable::getInstance($type, $prefix, $config);
	}

	/**
	 * Method to get the record form.
	 *
	 * @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	3.4.0
	 */
	public function getForm($data = array(), $loadData = true)
	{
		// Initialise variables.
		$app	= JFactory::getApplication();

		// Get the form.
		$form = $this->loadForm('com_icagenda.feature', 'feature', 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	3.4.0
	 */
	protected function loadFormData()
	{
		// Check the session for previously entered form data.
		$data = JFactory::getApplication()->getUserState('com_icagenda.edit.feature.data', array());

		if (empty($data))
		{
			$data = $this->getItem();
		}

		return $data;
	}

	/**
	 * Method to get a single record.
	 *
	 * @param	integer	The id of the primary key.
	 *
	 * @return	mixed	Object on success, false on failure.
	 * @since	3.4.0
	 */
	public function getItem($pk = null)
	{
		if ($item = parent::getItem($pk))
		{
			//Do any procesing on fields here if needed
		}

		return $item;
	}

	/**
	 * Prepare and sanitise the table prior to saving.
	 *
	 * @since	3.4.0
	 */
	protected function prepareTable($table)
	{
		jimport('joomla.filter.output');

		if (empty($table->id))
		{
			// Set ordering to the last item if not set
			if (@$table->ordering === '')
			{
				$db = JFactory::getDbo();
				$db->setQuery('SELECT MAX(ordering) FROM #__icagenda_feature');
				$max = $db->loadResult();
				$table->ordering = $max+1;
			}
		}
	}

	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   3.4.0
	 */
	public function save($data)
	{
		$date = JFactory::getDate();

		if (empty($data['created']))
		{
			$data['created'] = !empty($data['created']) ? $data['created'] : $date->toSql();
		}

		// Generates Alias if empty
		// Alias is not generated if non-latin characters, so we fix it by using created date, or title if unicode is activated, as alias
		if ($data['alias'] == null || empty($data['alias']))
		{
			$data['alias'] = JFilterOutput::stringURLSafe($data['title']);

			if ($data['alias'] == null || empty($data['alias']))
			{
				if (JFactory::getConfig()->get('unicodeslugs') == 1)
				{
					$data['alias'] = JFilterOutput::stringURLUnicodeSlug($data['title']);
				}
				else
				{
					$data['alias'] = JFilterOutput::stringURLSafe($data['created']);
				}
			}
		}

		$return = parent::save($data);

		return $return;
	}
}
components/com_icagenda/models/registration.php000060400000013331152453623450016036 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.7 2015-07-16
 * @since       3.3.3
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.modeladmin');


/**
 * iCagenda model.
 */
class iCagendaModelregistration extends JModelAdmin
{
	/**
	 * @var		string	The prefix to use with controller messages.
	 * @since	3.3.3
	 */
	protected $text_prefix = 'COM_ICAGENDA';

	/**
	 * 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   3.5.6
	 */
	protected function canDelete($record)
	{
		if ( ! empty($record->id))
		{
			if ($record->state != -2)
			{
				return false;
			}

			$user = JFactory::getUser();

			if ($user->authorise('core.delete'))
			{
				icagendaCustomfields::deleteData($record->id, 1);
				icagendaCustomfields::cleanData(1);

				return true;
			}
		}

		return false;
	}

	/**
	 * Returns a reference to the a Table object, always creating it.
	 *
	 * @param	type	The table type to instantiate
	 * @param	string	A prefix for the table class name. Optional.
	 * @param	array	Configuration array for model. Optional.
	 * @return	JTable	A database object
	 * @since	3.3.3
	 */
	public function getTable($type = 'Registration', $prefix = 'iCagendaTable', $config = array())
	{
		return JTable::getInstance($type, $prefix, $config);
	}

	/**
	 * Method to get the record form.
	 *
	 * @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	3.3.3
	 */
	public function getForm($data = array(), $loadData = true)
	{
		// Get the form.
		$form = $this->loadForm('com_icagenda.registration', 'registration',
								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	3.3.3
	 */
	protected function loadFormData()
	{
		// Check the session for previously entered form data.
		$data_array = JFactory::getApplication()->getUserState('com_icagenda.edit.registration.data', array());

		if (empty($data_array))
		{
			$data = $this->getItem();
		}
		else
		{
			$data = new JObject;
			$data->setProperties($data_array);
		}

		return $data;
	}

	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since	3.5.6
	 */
	public function save($data)
	{
		$app	= JFactory::getApplication();
		$input	= $app->input;
		$date	= JFactory::getDate();
		$user	= JFactory::getUser();

//		if (empty($data['created'])) // not to be used, to leave created empty if before update to 3.5.7
//		{
//			$data['created'] = ( ! empty($data['modified'])) ? $data['modified'] : $date->toSql();
//		}

		// Set registration creator
		if (empty($data['created_by']))
		{
			$data['created_by'] = (int) $data['userid'];
		}

		// Set Params
		if (isset($data['params']) && is_array($data['params']))
		{
			// Convert the params field to a string.
			$parameter = new JRegistry;
			$parameter->loadArray($data['params']);
			$data['params'] = (string)$parameter;
		}

		if ($input->get('task') == 'delete')
		{
			icagendaCustomfields::deleteData($data['custom_fields'], $data['id'], 1);
			$app->enqueueMessage('Test', 'warning');
		}

		// Get Registration ID from the result back to the Table after saving.
		$table = $this->getTable();

		if ($table->save($data) === true)
		{
			$data['id'] = $table->id;
		}
		else
		{
			$data['id'] = null;
		}

		if (parent::save($data))
		{
			// Save Custom Fields to database
			if (isset($data['custom_fields']) && is_array($data['custom_fields']))
			{
				icagendaCustomfields::saveToData($data['custom_fields'], $data['id'], 1);
			}

			return true;
		}

		return false;
	}

	/**
	 * Method to get a single record.
	 *
	 * @param	integer	The id of the primary key.
	 *
	 * @return	mixed	Object on success, false on failure.
	 * @since	3.3.3
	 */
	public function getItem($pk = null)
	{
		if ($item = parent::getItem($pk))
		{
			// Do any procesing on fields here if needed
		}

		return $item;
	}

	/**
	 * Prepare and sanitise the table prior to saving.
	 *
	 * @since	3.3.3
	 */

	protected function prepareTable($table)
	{
		$date = JFactory::getDate();
		$user = JFactory::getUser();

		$table->name = htmlspecialchars_decode($table->name, ENT_QUOTES);

		if (empty($table->id))
		{
			// Set the values
			$table->created		= $date->toSql();
			$table->created_by	= $user->get('id');

			// Set ordering to the last item if not set
			if (empty($table->ordering))
			{
				$db = JFactory::getDbo();
				$query = $db->getQuery(true)
					->select('MAX(ordering)')
					->from($db->quoteName('#__icagenda_registration'));
				$db->setQuery($query);
				$max = $db->loadResult();

				$table->ordering = $max + 1;
			}
		}
		else
		{
			// Set the values
			$table->modified	= $date->toSql();
			$table->modified_by	= $user->get('id');
		}
	}
}
components/com_icagenda/models/forms/event.xml000060400000032151152453623450015605 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset addfieldpath="/administrator/components/com_icagenda/models/fields" >
		<field
			name="id"
			type="text"
			label="JGLOBAL_FIELD_ID_LABEL"
			description ="JGLOBAL_FIELD_ID_DESC"
			class="readonly"
			size="10"
			readonly="true"
			default="0"
			/>
		<field
			name="title"
			type="text"
			label="COM_ICAGENDA_FORM_LBL_EVENT_TITLE"
			description="COM_ICAGENDA_FORM_DESC_EVENT_TITLE"
			class="input-xlarge"
			size="30"
			required="true"
			/>
		<field
			name="alias"
			type="text"
			label="JFIELD_ALIAS_LABEL"
			description="JFIELD_ALIAS_DESC"
			/>
		<field
			name="state"
			type="list"
			label="JSTATUS"
			description="JFIELD_PUBLISHED_DESC"
			class="span12 small"
			filter="intval"
			size="1"
			default="1"
			>
			<option value="1">JPUBLISHED</option>
			<option value="0">JUNPUBLISHED</option>
			<option value="2">JARCHIVED</option>
			<option value="-2">JTRASHED</option>
		</field>
		<field
			name="approval"
			type="list"
			label="COM_ICAGENDA_EVENTS_APPROVAL"
			description="COM_ICAGENDA_EVENTS_APPROVAL_DESC"
			class="span12 small"
			filter="intval"
			size="1"
			default="0"
			>
			<option value="0">COM_ICAGENDA_APPROVED</option>
			<option value="1">COM_ICAGENDA_UNAPPROVED</option>
		</field>
		<field
			name="site_itemid"
			type="test"
			label="COM_ICAGENDA_FORM_FRONTEND_SUBMIT_ITEMID_LBL"
			description="COM_ICAGENDA_FORM_FRONTEND_SUBMIT_ITEMID_DESC"
			size="3"
			class="inputbox"
			readonly="true"
			default="0"
			/>
		<field
			name="access"
			type="accesslevel"
			label="JFIELD_ACCESS_LABEL"
			description="COM_ICAGENDA_ACCESS_DESC"
			class="span12 small"
			size="1"
			default="1"
		/>
		<field
			name="language"
			type="contentlanguage"
			label="JFIELD_LANGUAGE_LABEL"
			description="COM_ICAGENDA_FORM_DESC_LANGUAGE"
			class="span12 small"
			>
			<option value="*">JALL</option>
		</field>
		<field
			name="created"
			type="calendar"
			label="JGLOBAL_FIELD_CREATED_LABEL"
			format="%Y-%m-%d %H:%M:%S"
			filter="user_utc"
			/>
		<field
			name="created_by"
			type="user"
			label="JGLOBAL_FIELD_CREATED_BY_LABEL"
			description="JGLOBAL_FIELD_CREATED_BY_DESC"
			/>
		<field
			name="created_by_alias"
			type="text"
			label="JGLOBAL_FIELD_CREATED_BY_ALIAS_LABEL"
			description="JGLOBAL_FIELD_CREATED_BY_ALIAS_DESC"
			class="inputbox"
			size="20"
			/>
		<field
			name="username"
			type="text"
			label="COM_ICAGENDA_FORM_LBL_EVENT_USERNAME"
			description="COM_ICAGENDA_FORM_DESC_EVENT_USERNAME"
			size="40"
			class="inputbox"
			filter="safehtml"
			/>
		<field
			name="modified"
			type="calendar"
			label="JGLOBAL_FIELD_MODIFIED_LABEL"
			class="readonly"
			size="22"
			readonly="true"
			format="%Y-%m-%d %H:%M:%S"
			filter="user_utc"
			/>
		<field
			name="modified_by"
			type="user"
			label="JGLOBAL_FIELD_MODIFIED_BY_LABEL"
			description="JGLOBAL_FIELD_MODIFIED_BY_DESC"
			class="readonly"
			readonly="true"
			filter="unset"
			/>
		<field name="checked_out" type="hidden" filter="unset" />
		<field name="checked_out_time" type="hidden" filter="unset" />
		<field
			name="catid"
			type="modal_cat"
			label="COM_ICAGENDA_FORM_LBL_EVENT_CATID"
			description="COM_ICAGENDA_FORM_DESC_EVENT_CATID"
			class="inputbox"
			required="true"
			/>
		<field
			name="image"
			type="media"
			label="COM_ICAGENDA_FORM_LBL_EVENT_IMAGE"
			description="COM_ICAGENDA_FORM_DESC_EVENT_IMAGE"
			filter="safehtml"
			/>
		<field
			name="file"
			type="modal_icfile"
			class="inputbox"
			id="upload_file"
			label="COM_ICAGENDA_FORM_LBL_EVENT_FILE"
			description="COM_ICAGENDA_FORM_DESC_EVENT_FILE"
			/>
		<field
			name="displaytime"
			type="radio"
			class="btn-group"
			label="COM_ICAGENDA_DISPLAY_TIME_LABEL"
			description="COM_ICAGENDA_DISPLAY_TIME_DESC"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="dates"
			type="modal_date"
			class="inputbox"
			label="COM_ICAGENDA_FORM_LBL_EVENT_DATES"
			description="COM_ICAGENDA_FORM_DESC_EVENT_DATES"
			default="0000-00-00 00:00"
			/>
		<!--field
			name="eventDates"
			type="modal_ic_singledates"
			label="COM_ICAGENDA_FORM_LBL_EVENT_DATES"
			description="COM_ICAGENDA_FORM_DESC_EVENT_DATES"
			class="inputbox"
			/-->
		<field
			name="startdate"
			type="modal_startdate"
			size="40"
			class="inputbox"
			label="COM_ICAGENDA_FORM_LBL_EVENTPERIOD_START"
			description="COM_ICAGENDA_FORM_DESC_EVENTPERIOD_START"
			/>
		<field
			name="enddate"
			type="modal_enddate"
			size="40"
			class="inputbox"
			label="COM_ICAGENDA_FORM_LBL_EVENTPERIOD_END"
			description="COM_ICAGENDA_FORM_DESC_EVENTPERIOD_END"
			/>
		<field
			name="weekdays"
			type="list"
			label="COM_ICAGENDA_FORM_LBL_WEEK_DAYS"
			description="COM_ICAGENDA_FORM_WEEK_DAYS_INFO_DESC"
			multiple="true"
			default=""
			>
			<option value="0">SUNDAY</option>
			<option value="1">MONDAY</option>
			<option value="2">TUESDAY</option>
			<option value="3">WEDNESDAY</option>
			<option value="4">THURSDAY</option>
			<option value="5">FRIDAY</option>
			<option value="6">SATURDAY</option>
		</field>
		<!--field
			name="weekdays_filter"
			type="modal_icfilter_weekdays"
			label="COM_ICAGENDA_FORM_LBL_WEEK_DAYS"
			description="COM_ICAGENDA_FORM_DESC_WEEK_DAYS"
			multiple="true"
			default=""
			/-->
		<field
			name="next"
			type="hidden"
			class="inputbox"
			default="0000-00-00 00:00:00"
			/>
		<field
			name="email"
			type="email"
			label="COM_ICAGENDA_FORM_LBL_EVENT_EMAIL"
			description="COM_ICAGENDA_FORM_DESC_EVENT_EMAIL"
			size="30"
			class="inputbox"
			filter="safehtml"
			/>
		<field
			name="phone"
			type="text"
			label="COM_ICAGENDA_FORM_LBL_EVENT_PHONE"
			description="COM_ICAGENDA_FORM_DESC_EVENT_PHONE"
			size="30"
			class="inputbox"
			filter="safehtml"
			/>
		<field
			name="website"
			type="text"
			label="COM_ICAGENDA_FORM_LBL_EVENT_WEBSITE"
			description="COM_ICAGENDA_FORM_DESC_EVENT_WEBSITE"
			size="30"
			class="inputbox"
			filter="safehtml"
			/>
		<field
			name="features"
			type="sql"
			label="COM_ICAGENDA_FORM_LBL_EVENT_FEATURES"
			description="COM_ICAGENDA_FORM_DESC_EVENT_FEATURES"
			query="SELECT id AS value, title AS features FROM #__icagenda_feature WHERE state=1 AND icon IS NOT NULL AND icon!='' ORDER BY features"
			multiple="true"
			class="inputbox"
			/>
		<!--field
			name="features"
			type="modal_features"
			label="COM_ICAGENDA_FORM_LBL_EVENT_FEATURES"
			description="COM_ICAGENDA_FORM_DESC_EVENT_FEATURES"
			multiple="true"
			class="inputbox"
			/-->
		<field
			name="custom_fields"
			type="hidden"
			class="inputbox"
			default=""
			/>
		<field
			name="place"
			type="text"
			label="COM_ICAGENDA_FORM_LBL_EVENT_VENUE"
			description="COM_ICAGENDA_FORM_DESC_EVENT_VENUE"
			size="30"
			class="inputbox"
			filter="safehtml"
			/>
		<field
			name="coordinate"
			type="modal_coordinate"
			label="COM_ICAGENDA_FORM_LBL_EVENT_MAP"
			description="COM_ICAGENDA_FORM_DESC_EVENT_MAP"
			class="inputbox"
			/>
		<field
			name="address"
			type="text"
			label="COM_ICAGENDA_GOOGLE_MAPS_ADDRESS_LBL"
			description="COM_ICAGENDA_FORM_DESC_EVENT_LOCATION"
			class="inputbox"
			filter="safehtml"
			/>
		<field
			name="city"
			type="icmap_city"
			label="COM_ICAGENDA_FORM_LBL_EVENT_CITY"
			description="COM_ICAGENDA_FORM_DESC_EVENT_CITY"
			class="inputbox"
			filter="safehtml"
			/>
		<field
			name="country"
			type="icmap_country"
			label="COM_ICAGENDA_FORM_LBL_EVENT_COUNTRY"
			description="COM_ICAGENDA_FORM_DESC_EVENT_COUNTRY"
			class="inputbox"
			filter="safehtml"
			labelclass="control-label"
			/>
		<field
			name="lat"
			type="icmap_lat"
			label="LATITUDE"
			description="COM_ICAGENDA_FORM_DESC_EVENT_MAP"
			class="inputbox"
			/>
		<field
			name="lng"
			type="icmap_lng"
			label="LONGITUDE"
			description="COM_ICAGENDA_FORM_DESC_EVENT_MAP"
			class="inputbox"
			/>
		<field
			name="shortdesc"
			type="modal_ictextarea_counter"
			label="COM_ICAGENDA_FORM_EVENT_SHORT_DESCRIPTION_LBL"
			description="COM_ICAGENDA_FORM_EVENT_SHORT_DESCRIPTION_DESC"
			class="span-12"
			row="3"
			cols="80"
			/>
		<field
			name="desc"
			type="editor"
			label="COM_ICAGENDA_FORM_LBL_EVENT_DESC"
			description="COM_ICAGENDA_FORM_DESC_EVENT_DESC"
			buttons="true"
			hide="readmore,pagebreak,helix_shortcode"
			class="inputbox"
			filter="JComponentHelper::filterText"
			/>
		<field
			name="metadesc"
			type="modal_ictextarea_counter"
			label="COM_ICAGENDA_FORM_EVENT_METADESC_LBL"
			description="COM_ICAGENDA_FORM_EVENT_METADESC_DESC"
			class="span-12"
			row="3"
			cols="80"
			/>
	</fieldset>
	<fields name="params">

		<!-- Registrations Tab - Individual Params -->
		<fieldset name="registrations"
			addfieldpath="/administrator/components/com_icagenda/assets/elements"
			>
			<field type="TitleHeader" label="COM_ICAGENDA_REGISTRATION_LABEL" />
			<field
				name="statutReg"
				type="radio"
				label="COM_ICAGENDA_REGISTRATION_LABEL"
				description="COM_ICAGENDA_REGISTRATION_DESC"
				labelclass="control-label"
				class="btn-group"
				default=""
				>
				<option value="">JGLOBAL_USE_GLOBAL</option>
				<option value="0">JOFF</option>
				<option value="1">JON</option>
			</field>
			<field
				name="accessReg"
				type="accesslevel"
				label="JFIELD_ACCESS_LABEL"
				description="JFIELD_ACCESS_DESC"
				class="inputbox"
				size="1"
				default=""
				>
				<option value="">JGLOBAL_USE_GLOBAL</option>
			</field>
			<field type="TitleHeader" label="COM_ICAGENDA_REGISTRATION_FORM_OPTIONS_LABEL" />
			<field
				name="typeReg"
				type="list"
				label="COM_ICAGENDA_TYPE_REG_LABEL"
				description="COM_ICAGENDA_TYPE_REG_DESC"
				default="1"
				>
				<option value="1">COM_ICAGENDA_ADMIN_REGISTRATION_BY_INDIVIDUAL_DATE</option>
				<option value="2">COM_ICAGENDA_ADMIN_REGISTRATION_FOR_ALL_DATES</option>
			</field>
			<!--field type="Title" label="COM_ICAGENDA_MAX_REGISTRATIONS_DESC"
				class="styleblanck"/-->
			<!--field
				name="maxRegGlobal"
				type="radio"
				label="JGLOBAL_USE_GLOBAL"
				description="JGLOBAL_USE_GLOBAL"
				default="1"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field-->
			<field
				name="maxReg"
				type="text"
				label="COM_ICAGENDA_MAX_REGISTRATIONS_LABEL"
				description="COM_ICAGENDA_MAX_REGISTRATIONS_DESC"
				size="3"
				default=""
				/>
			<field
				name="maxRlistGlobal"
				type="radio"
				label="COM_ICAGENDA_MAX_PER_REGISTRATION_LABEL"
				description="COM_ICAGENDA_MAX_PER_REGISTRATION_DESC"
				labelclass="control-label"
				class="btn-group"
				default=""
				>
				<option value="">JGLOBAL_USE_GLOBAL</option>
				<option value="2">COM_ICAGENDA_LBL_CUSTOM_VALUE</option>
			</field>
			<field
				name="maxRlist"
				type="text"
				label="COM_ICAGENDA_LBL_CUSTOM_VALUE"
				description="COM_ICAGENDA_DESC_CUSTOM_VALUE"
				size="2"
				default=""
				/>
			<field type="TitleHeader" label="COM_ICAGENDA_REGISTRATION_BUTTON" />
			<!--field
				name="maxRlistGlobal"
				type="radio"
				label="COM_ICAGENDA_MAX_PER_REGISTRATION_LABEL"
				description="COM_ICAGENDA_MAX_PER_REGISTRATION_DESC"
				labelclass="control-label"
				class="btn-group"
				default=""
				>
				<option value="">JGLOBAL_USE_GLOBAL</option>
				<option value="2">COM_ICAGENDA_LBL_CUSTOM_VALUE</option>
			</field-->
			<field
				name="RegButtonText"
				type="modal_ph_regbt"
				label="COM_ICAGENDA_REGISTRATION_BUTTON_TEXT"
				description="COM_ICAGENDA_REGISTRATION_BUTTON_TEXT_DESC"
				size="40"
				class="inputbox"
				default=""
				/>
			<field
				name="RegButtonLink"
				type="modal_iclink_type"
				label="COM_ICAGENDA_REGISTRATION_LINK_LBL"
				description="COM_ICAGENDA_REGISTRATION_LINK_DESC"
				labelclass="control-label"
				default=""
				/>
			<field
				name="RegButtonLink_Article"
				type="modal_iclink_article"
				label=" "
				class="inputbox"
				/>
			<field
				name="RegButtonLink_Url"
				type="modal_iclink_url"
				label=" "
				class="inputbox"
				/>
			<field
				name="RegButtonTarget"
				type="list"
				label="COM_ICAGENDA_BROWSER_TARGET"
				description="COM_ICAGENDA_REGISTRATION_LINK_BROWSER_TARGET_DESC"
				default="0"
				filter="options"
				class="inputbox"
				>
				<option value="0">JBROWSERTARGET_PARENT</option>
				<option value="1">JBROWSERTARGET_NEW</option>
			</field>
			<field type="Title" label=" "
				class="styleblanck"/>
		</fieldset>

		<!-- Registrations Tab - Actions -->
		<fieldset name="registration_actions">
		</fieldset>

		<!-- Option Tab - Options -->
		<fieldset name="options">
			<field type="Title" label="COM_ICAGENDA_ADDTHIS"
				class="styleblanck"/>
			<field
				name="atevent"
				type="radio"
				label="COM_ICAGENDA_ADDTHIS_DISPLAY_SHARING"
				description="COM_ICAGENDA_ADDTHIS_EVENT_DESC"
				class="btn-group"
				default=""
				>
				<option value="">JGLOBAL_USE_GLOBAL</option>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>
			<!--field
				name="mapTypeId"
				type="list"
				label="mapTypeId"
				description="mapTypeId"
				filter="safehtml"
				default="ROADMAP"
				>
				<option value="ROADMAP">ROADMAP</option>
				<option value="TERRAIN">TERRAIN</option>
				<option value="SATELLITE">SATELLITE</option>
				<option value="HYBRID">HYBRID</option>
			</field-->
		</fieldset>
	</fields>
</form>
components/com_icagenda/models/forms/download.xml000060400000006150152453623450016273 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset name="details" addfieldpath="/administrator/components/com_icagenda/assets/elements">
		<field
			type="TitleImg"
			label="JOPTIONS"
			class="stylebox lead input-xxlarge"
			icicon="options"
			/>
		<field
			name="event_title"
			type="radio"
			class="btn-group btn-group-yesno"
			label="COM_ICAGENDA_REGISTRATION_EVENTID"
			default="1"
		>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>
		<field
			name="date"
			type="radio"
			class="btn-group btn-group-yesno"
			label="COM_ICAGENDA_REGISTRATION_DATE"
			default="1"
		>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>
		<field
			name="tickets"
			type="radio"
			class="btn-group btn-group-yesno"
			label="COM_ICAGENDA_REGISTRATION_TICKETS"
			default="1"
		>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>
		<field
			name="name"
			type="radio"
			class="btn-group btn-group-yesno"
			label="IC_NAME"
			default="1"
		>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>
		<field
			name="email"
			type="radio"
			class="btn-group btn-group-yesno"
			label="COM_ICAGENDA_REGISTRATION_EMAIL"
			default="1"
		>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>
		<field
			name="phone"
			type="radio"
			class="btn-group btn-group-yesno"
			label="COM_ICAGENDA_REGISTRATION_PHONE"
			default="1"
		>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>
		<field
			name="customfields"
			type="radio"
			class="btn-group btn-group-yesno"
			label="COM_ICAGENDA_CUSTOMFIELDS"
			default="1"
		>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>
		<field
			name="notes"
			type="radio"
			class="btn-group btn-group-yesno"
			label="COM_ICAGENDA_REGISTRATION_NOTES_DISPLAY_LABEL"
			default="0"
		>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>
		<field
			name="status"
			type="radio"
			class="btn-group btn-group-yesno"
			label="JSTATUS"
			default="0"
		>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>
		<field
			type="TitleImg"
			label="COM_ICAGENDA_REGISTRATIONS_EXPORT"
			class="stylebox lead input-xxlarge"
			icicon="logo"
			/>
		<field
			name="basename"
			type="text"
			size="40"
			label="COM_ICAGENDA_EXPORT_BASENAME_LABEL"
			description="COM_ICAGENDA_EXPORT_BASENAME_DESC"
			class="inputbox"
			/>
		<field
			name="separator"
			type="radio"
			class="btn-group btn-group-yesno"
			label="COM_ICAGENDA_EXPORT_SEPARATOR_LABEL"
			description="COM_ICAGENDA_EXPORT_SEPARATOR_DESC"
			default="1"
		>
			<option value="1">IC_COMMA</option>
			<option value="2">IC_SEMICOLON</option>
		</field>
		<field
			name="compressed"
			type="radio"
			class="btn-group btn-group-yesno"
			label="COM_ICAGENDA_EXPORT_COMPRESSED_LABEL"
			description="COM_ICAGENDA_EXPORT_COMPRESSED_DESC"
			default="0"
		>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>
		<field type="Title" label=" " class="stylenote"/>
	</fieldset>
</form>
components/com_icagenda/models/forms/customfield.xml000060400000010221152453623450016774 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset addfieldpath="/administrator/components/com_icagenda/models/fields">
		<field
			name="id"
			type="text"
			class="readonly"
			label="JGLOBAL_FIELD_ID_LABEL"
			description ="JGLOBAL_FIELD_ID_DESC"
			size="10"
			default="0"
			readonly="true"
			/>
		<field
			name="state"
			type="list"
			label="JSTATUS"
			description="JFIELD_PUBLISHED_DESC"
			class="span12 small"
			filter="intval"
			size="1"
			default="1"
			>
				<option value="1">JPUBLISHED</option>
				<option value="0">JUNPUBLISHED</option>
		</field>
		<field
			name="title"
			type="text"
			label="COM_ICAGENDA_CUSTOMFIELD_TITLE_LBL"
			description="COM_ICAGENDA_CUSTOMFIELD_TITLE_DESC"
			size="30"
			required="true"
			/>
		<field
			name="alias"
			type="text"
			label="JFIELD_ALIAS_LABEL"
			description="JFIELD_ALIAS_DESC"
			/>
		<field
			name="slug"
			type="text"
			label="COM_ICAGENDA_CUSTOMFIELD_SLUG_LBL"
			description="COM_ICAGENDA_CUSTOMFIELD_SLUG_DESC"
			/>
		<field
			name="description"
			type="editor"
			buttons="readmore,pagebreak"
			class="inputbox"
			filter="JComponentHelper::filterText"
			label="COM_ICAGENDA_CUSTOMFIELD_DESCRIPTION_LBL"
			description="COM_ICAGENDA_CUSTOMFIELD_DESCRIPTION_DESC"
			/>
		<field
			name="parent_form"
			type="list"
			filter="intval"
			required="true"
			label="COM_ICAGENDA_CUSTOMFIELD_PARENT_FORM_LBL"
			description="COM_ICAGENDA_CUSTOMFIELD_PARENT_FORM_DESC"
			default=""
			>
				<option value="">COM_ICAGENDA_CUSTOMFIELD_PARENT_SELECT</option>
				<option value="1">COM_ICAGENDA_CUSTOMFIELD_PARENT_REGISTRATION_FORM</option>
				<option value="2">COM_ICAGENDA_CUSTOMFIELD_PARENT_EVENT_EDIT</option>
		</field>
		<field
			name="type"
			type="list"
			required="true"
			label="COM_ICAGENDA_CUSTOMFIELD_TYPE_LBL"
			description="COM_ICAGENDA_CUSTOMFIELD_TYPE_DESC"
			default=""
			>
				<option value="">COM_ICAGENDA_CUSTOMFIELD_TYPE_SELECT</option>
				<option value="text">COM_ICAGENDA_CUSTOMFIELD_TYPE_TEXT</option>
				<option value="list">COM_ICAGENDA_CUSTOMFIELD_TYPE_LIST</option>
				<option value="radio">COM_ICAGENDA_CUSTOMFIELD_TYPE_RADIO</option>
		</field>
		<field
			name="options"
			type="textarea"
			label="COM_ICAGENDA_CUSTOMFIELD_OPTIONS_LBL"
			description="COM_ICAGENDA_CUSTOMFIELD_OPTIONS_DESC"
			/>
		<field
			name="default"
			type="text"
			label="COM_ICAGENDA_CUSTOMFIELD_DEFAULT_LBL"
			description="COM_ICAGENDA_CUSTOMFIELD_DEFAULT_DESC"
			/>
		<field
			name="required"
			type="radio"
			label="COM_ICAGENDA_CUSTOMFIELD_REQUIRED_LBL"
			description="COM_ICAGENDA_CUSTOMFIELD_REQUIRED_DESC"
			labelclass="control-label"
			class="btn-group"
			default="0"
			>
				<option value="0">JNO</option>
				<option value="1">JYES</option>
		</field>
		<field
			name="language"
			type="contentlanguage"
			label="JFIELD_LANGUAGE_LABEL"
			description="COM_ICAGENDA_CUSTOMFIELD_LANGUAGE_DESC"
			class="span12 small"
			>
				<option value="*">JALL</option>
		</field>
		<field
			name="created"
			type="calendar"
			label="JGLOBAL_FIELD_CREATED_LABEL"
			format="%Y-%m-%d %H:%M:%S"
			filter="user_utc"
			labelclass="control-label"
			/>
		<field
			name="created_by"
			type="user"
			label="JGLOBAL_FIELD_CREATED_BY_LABEL"
			description="JGLOBAL_FIELD_CREATED_BY_DESC"
			labelclass="control-label"
			/>
		<!-- created_by_alias to be removed ? Not really needed there... -->
		<field
			name="created_by_alias"
			type="text"
			label="JGLOBAL_FIELD_CREATED_BY_ALIAS_LABEL"
			description="JGLOBAL_FIELD_CREATED_BY_ALIAS_DESC"
			class="inputbox"
			size="20"
			labelclass="control-label"
			/>
		<field
			name="modified"
			type="calendar"
			class="readonly"
			label="JGLOBAL_FIELD_MODIFIED_LABEL"
			size="22"
			readonly="true"
			format="%Y-%m-%d %H:%M:%S"
			filter="user_utc"
			labelclass="control-label"
			/>
		<field
			name="modified_by"
			type="user"
			label="JGLOBAL_FIELD_MODIFIED_BY_LABEL"
			description="JGLOBAL_FIELD_MODIFIED_BY_DESC"
			class="readonly"
			readonly="true"
			filter="unset"
			labelclass="control-label"
			/>
		<field name="checked_out" type="hidden" filter="unset" />
		<field name="checked_out_time" type="hidden" filter="unset" />
	</fieldset>
</form>
components/com_icagenda/models/forms/index.html000060400000000032152453623450015730 0ustar00<html><body></body></html>components/com_icagenda/models/forms/feature.xml000060400000004256152453623450016124 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset addfieldpath="/administrator/components/com_icagenda/models/fields">

		<field
			name="id"
			type="text"
			class="readonly"
			label="JGLOBAL_FIELD_ID_LABEL"
			description ="JGLOBAL_FIELD_ID_DESC"
			size="10"
			default="0"
			readonly="true"
		/>

		<field
			name="title"
			type="text"
			label="COM_ICAGENDA_FORM_FEATURE_TITLE_LABEL"
			description="COM_ICAGENDA_FORM_FEATURE_TITLE_DESC"
			size="30"
			required="true"
		/>

		<field
			name="alias"
			type="text"
			label="JFIELD_ALIAS_LABEL"
			description="JFIELD_ALIAS_DESC"
		/>

		<field
			name="icon"
			type="imagelist"
			directory="images/icagenda/feature_icons/16_bit"
			exclude="\.(?:html|htm)$"
			hide_none="false"
			hide_default="true"
			label="COM_ICAGENDA_FORM_FEATURE_ICON_LABEL"
			description="COM_ICAGENDA_FORM_FEATURE_ICON_DESC"
			required="false"
		/>

		<field
			name="new_icon"
			type="media"
			label="COM_ICAGENDA_FORM_FEATURE_NEW_ICON_LABEL"
			description="COM_ICAGENDA_FORM_FEATURE_NEW_ICON_LABEL"
			filter="safehtml"
		/>

		<field
			name="icon_alt"
			type="text"
			label="COM_ICAGENDA_FORM_FEATURE_ICON_ALT_LABEL"
			description="COM_ICAGENDA_FORM_FEATURE_ICON_ALT_DESC"
			size="30"
			required="false"
		/>

		<field
			name="show_filter"
			type="radio"
			class="btn-group"
			default="1"
			label="COM_ICAGENDA_FORM_FEATURE_SHOW_FILTER_LABEL"
			description="COM_ICAGENDA_FORM_FEATURE_SHOW_FILTER_DESC">
				<option value="0">JNO</option>
				<option value="1">JYES</option>
		</field>

		<field
			name="desc"
			type="editor"
			buttons="readmore,pagebreak"
			class="inputbox"
			filter="JComponentHelper::filterText"
			label="COM_ICAGENDA_FORM_FEATURE_DESCRIPTION_LABEL"
			description="COM_ICAGENDA_FORM_FEATURE_DESCRIPTION_DESC"
		/>

		<field
			name="state"
			type="list"
			label="JSTATUS"
			description="JFIELD_PUBLISHED_DESC"
			class="span12 small"
			filter="intval"
			size="1"
			default="1">
				<option value="1">JPUBLISHED</option>
				<option value="0">JUNPUBLISHED</option>
		</field>

		<field name="checked_out" type="hidden" filter="unset" />
		<field name="checked_out_time" type="hidden" filter="unset" />

	</fieldset>
</form>
components/com_icagenda/models/forms/registration.xml000060400000006614152453623450017203 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset addfieldpath="/administrator/components/com_icagenda/models/fields">
		<field
			name="id"
			type="text"
			class="readonly"
			label="JGLOBAL_FIELD_ID_LABEL"
			description ="JGLOBAL_FIELD_ID_DESC"
			size="10"
			default="0"
			readonly="true"
			/>
		<field
			name="state"
			type="list"
			label="JSTATUS"
			description="JFIELD_PUBLISHED_DESC"
			class="span12 small"
			filter="intval"
			size="1"
			default="1"
			>
				<option value="1">JPUBLISHED</option>
				<option value="0">JUNPUBLISHED</option>
				<option value="2">JARCHIVED</option>
				<option value="-2">JTRASHED</option>
		</field>
		<field
			name="userid"
			type="user"
			label="COM_ICAGENDA_REGISTRATION_USERID"
			description =" "
			size="10"
			default="0"
			/>
		<!--field
			name="itemid"
			type="text"
			label="ITEMID"
			description =" "
			size="10"
			default="0"
			readonly="true"
			/-->
		<field
			name="eventid"
			type="modal_evt"
			label="ICEVENT"
			description =" "
			size="10"
			default="0"
			readonly="true"
			/>
		<field
			name="date"
			type="modal_evt_date"
			size="30"
			class="inputbox"
			label="COM_ICAGENDA_REGISTRATION_DATE"
			description=" "
			filter="safehtml"
			/>
		<field
 			name="name"
 			type="text"
 			label="COM_ICAGENDA_REGISTRATION_USER"
			description=" "
			size="30"
			required="true"
			/>
		<field
			name="email"
			type="email"
			size="30"
			class="inputbox"
			label="COM_ICAGENDA_REGISTRATION_EMAIL"
			description=" "
			filter="safehtml"
			/>
		<field
			name="phone"
			type="text"
			size="30"
			class="inputbox"
			label="COM_ICAGENDA_REGISTRATION_PHONE"
			description=" "
			filter="safehtml"
			/>
		<!--field
			name="period"
			type="radio"
			class="btn-group"
			default="0"
			label="COM_ICAGENDA_REGISTRATION_ALL_DATES"
			description=" "
			labelclass="control-label"
			>
				<option value="0">JNO</option>
				<option value="1">JYES</option>
		</field-->
		<field
			name="period"
			type="hidden"
			default="0"
			label="COM_ICAGENDA_REGISTRATION_ALL_DATES"
			description=" "
			labelclass="control-label"
			/>
		<field
			name="people"
			type="text"
			size="30"
			class="inputbox input-mini"
			label="COM_ICAGENDA_REGISTRATION_NUMBER_PLACES"
			default="1"
			description=" "
			filter="safehtml"
			/>
		<field
			name="notes"
			type="editor"
			buttons="readmore,pagebreak"
			class="inputbox"
			filter="JComponentHelper::filterText"
			label="COM_ICAGENDA_REGISTRATION_NOTES_DISPLAY_LABEL"
			description=" "
			/>
		<field
			name="custom_fields"
			type="hidden"
			class="inputbox"
			default=""
			/>
		<field
			name="created"
			type="calendar"
			label="JGLOBAL_FIELD_CREATED_LABEL"
			format="%Y-%m-%d %H:%M:%S"
			filter="user_utc"
			/>
		<field
			name="created_by"
			type="user"
			label="JGLOBAL_FIELD_CREATED_BY_LABEL"
			description="JGLOBAL_FIELD_CREATED_BY_DESC"
			/>
		<field
			name="modified"
			type="calendar"
			label="JGLOBAL_FIELD_MODIFIED_LABEL"
			class="readonly"
			size="22"
			readonly="true"
			format="%Y-%m-%d %H:%M:%S"
			filter="user_utc"
			/>
		<field
			name="modified_by"
			type="user"
			label="JGLOBAL_FIELD_MODIFIED_BY_LABEL"
			description="JGLOBAL_FIELD_MODIFIED_BY_DESC"
			class="readonly"
			readonly="true"
			filter="unset"
			/>
		<field name="checked_out" type="hidden" filter="unset" />
		<field name="checked_out_time" type="hidden" filter="unset" />

	</fieldset>
</form>
components/com_icagenda/models/forms/mail.xml000060400000001511152453623450015402 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<field
			name="eventid"
			type="modal_evt"
			label="ICEVENT"
			description =" "
			class="inputbox"
			size="10"
			default="0"
			/>
		<field
			name="date"
			type="modal_evt_date"
			size="30"
			class="inputbox"
			label="COM_ICAGENDA_REGISTRATION_DATE"
			description=" "
			filter="safehtml"
			/>
		<field
			name="subject"
			type="text"
			size="40"
			class="inputbox input-xxlarge"
			label="COM_ICAGENDA_FORM_LBL_NEWSLETTER_OBJ"
			description="COM_ICAGENDA_FORM_DESC_NEWSLETTER_OBJ"
			/>
		<field
			name="message"
			type="editor"
			class="inputbox"
			buttons="readmore,pagebreak"
			label="COM_ICAGENDA_FORM_LBL_NEWSLETTER_BODY"
			description="COM_ICAGENDA_FORM_DESC_NEWSLETTER_BODY"
			cols="70"
			rows="20"
			filter="safehtml"
			/>
	</fieldset>
</form>
components/com_icagenda/models/forms/category.xml000060400000003005152453623450016275 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<!--fields addfieldpath="/administrator/components/com_icagenda/models/fields"-->
	<fieldset addfieldpath="/administrator/components/com_icagenda/models/fields">
		<field
			name="id"
			type="text"
			class="readonly"
			label="JGLOBAL_FIELD_ID_LABEL"
			description ="JGLOBAL_FIELD_ID_DESC"
			size="10"
			default="0"
			readonly="true"
		/>

		<field
 			name="title"
 			type="text"
 			label="COM_ICAGENDA_FORM_LBL_CATEGORY_TITLE"
			description="COM_ICAGENDA_FORM_DESC_CATEGORY_TITLE"
			size="30"
			required="true"
		/>

		<field
			name="alias"
			type="text"
			label="JFIELD_ALIAS_LABEL"
			description="JFIELD_ALIAS_DESC"
		/>

		<field
			name="color"
			type="color"
			size="40"
			class="inputbox"
			label="COM_ICAGENDA_FORM_LBL_CATEGORY_COLOR"
			description="COM_ICAGENDA_FORM_DESC_CATEGORY_COLOR"
			default="#bdbdbd"
		/>

		<field
			name="desc"
			type="editor"
			buttons="readmore,pagebreak"
			class="inputbox"
			filter="JComponentHelper::filterText"
			label="COM_ICAGENDA_FORM_LBL_EVENT_DESC"
			description="COM_ICAGENDA_FORM_DESC_EVENT_DESC"
		/>

		<field
			name="state"
			type="list"
			label="JSTATUS"
			description="JFIELD_PUBLISHED_DESC"
			class="span12 small"
			filter="intval"
			size="1"
			default="1">
				<option value="1">JPUBLISHED</option>
				<option value="0">JUNPUBLISHED</option>
		</field>

		<field name="checked_out" type="hidden" filter="unset" />
		<field name="checked_out_time" type="hidden" filter="unset" />

	</fieldset>
</form>
components/com_icagenda/models/registrations.php000060400000051150152453623450016222 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.12 2015-09-22
 * @since		2.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.modellist');

/**
 * Methods supporting a list of iCagenda records.
 */
class iCagendaModelregistrations extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param	array			An optional associative array of configuration settings.
	 * @see		JController
	 * @since	1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'ordering', 'a.ordering',
				'userid', 'userid',
				'name', 'name',
				'username', 'username',
				'email', 'email',
				'phone', 'phone',
				'event', 'event',
				'date', 'a.date',
				'startdate', 'e.startdate',
				'people', 'a.people',
				'notes', 'a.notes',
				'evt_created_by', 'a.evt_created_by'
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 */
	protected function populateState($ordering = null, $direction = null)
	{
		// Initialise variables.
		$app = JFactory::getApplication('administrator');

		// Load the filter search.
		$search = $app->getUserStateFromRequest($this->context.'.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		// Filter (dropdown) state.
		$published = $app->getUserStateFromRequest($this->context.'.filter.state', 'filter_published', '', 'string');
		$this->setState('filter.state', $published);

		// Filter (dropdown) categories
		$categories = $this->getUserStateFromRequest($this->context.'.filter.categories', 'filter_categories', '', 'string');
		$this->setState('filter.categories', $categories);

		// Filter (dropdown) events
		$events = $this->getUserStateFromRequest($this->context.'.filter.events', 'filter_events', '', 'string');
		$this->setState('filter.events', $events);

		// Filter (dropdown) dates
		$dates = $this->getUserStateFromRequest($this->context.'.filter.dates', 'filter_dates', '', 'string');
		$this->setState('filter.dates', $dates);

		// Load the parameters.
		$params = JComponentHelper::getParams('com_icagenda');
		$this->setState('params', $params);

		// List state information.
		parent::populateState('a.id', 'desc');
	}

	/**
	 * 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.state');

		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);

		// Select the required fields from the table.
		$query->select(
			$this->getState(
				'list.select',
				'a.*'
			)
		);
		$query->from('`#__icagenda_registration` AS a');

		// Join over the events.
		$query->select('e.title AS event, e.created_by AS evt_created_by, e.state AS evt_state,
						e.startdate AS startdate, e.enddate AS enddate, e.displaytime AS displaytime');
		$query->join('LEFT', '#__icagenda_events AS e ON e.id=a.eventid');

		// Join over the categories.
		$query->select('c.id AS cat_id, c.title AS cat_title');
		$query->join('LEFT', '#__icagenda_category AS c ON c.id=e.catid');

		// Join over the users for the checked out user.
		$query->select('u.username AS username, u.name AS fullname');
		$query->join('LEFT', '#__users AS u ON u.id=a.userid');

		// Join over the users for the author.
		$query->select('ua.name AS author_name, ua.username AS author_username')
			->join('LEFT', '#__users AS ua ON ua.id = a.created_by');

		// 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))');
		}

		// Filter by edit access
		if ( ! JFactory::getUser()->authorise('core.edit', 'com_icagenda')
			&& JFactory::getUser()->authorise('core.edit.own', 'com_icagenda'))
		{
			$userID = JFactory::getUser()->get('id');
			$query->where('a.userid = ' . (int) $userID);
		}

		// Filter by search in content
		$search = $this->getState('filter.search');

		if (!empty($search))
		{
			if (stripos($search, 'id:') === 0)
			{
				$query->where('a.id = '.(int) substr($search, 3));
			}
			else
			{
				if(version_compare(JVERSION, '3.0', 'lt'))
				{
					$search = $db->Quote('%'.$db->getEscaped($search, true).'%');
				}
				else
				{
					$search = $db->Quote('%'.$db->escape($search, true).'%');
				}
				$query->where('(u.username LIKE '.$search.'  OR  a.name LIKE '.$search.'  OR  a.userid LIKE '.$search.'  OR  a.email LIKE '.$search.'  OR  a.phone LIKE '.$search.'  OR  a.date LIKE '.$search.'  OR  a.period LIKE '.$search.'  OR  a.people LIKE '.$search.'  OR  a.notes LIKE '.$search.'  OR  e.title LIKE '.$search.' )');
			}
		}

		// Filter categories
		$category = $db->escape($this->getState('filter.categories'));

		if (!empty($category))
		{
			$query->where('(c.id=' . $db->q($category) . ')');
		}

		// Filter events
		$event = $db->escape($this->getState('filter.events'));

		if (!empty($event))
		{
			$query->where('(a.eventid=' . $db->q($event) . ')');
		}

		// Filter dates
		$date = $db->escape($this->getState('filter.dates'));

		if (!empty($date) && ! in_array($date, array('1', '2')))
		{
			$query->where($db->qn('a.date') . ' = ' . $db->q($date));
		}
		elseif ($date == 1)
		{
			$query->where($db->qn('a.date') . ' = ""');
			$query->where($db->qn('a.period') . ' = "0"');
		}
		elseif ($date == 2)
		{
			$query->where($db->qn('a.date') . ' = ""');
			$query->where($db->qn('a.period') . ' = "1"');
		}

		// Add the list ordering clause.
		$orderCol	= $this->state->get('list.ordering');
		$orderDirn	= $this->state->get('list.direction');

		if ($orderCol && $orderDirn)
		{
			if (version_compare(JVERSION, '3.0', 'lt'))
			{
				if ($orderCol == 'a.date')
				{
					$query->order($db->getEscaped($db->qn('a.period') . ' ' . $orderDirn));
				}

				$query->order($db->getEscaped($orderCol . ' ' . $orderDirn));
			}
			else
			{
				if ($orderCol == 'a.date')
				{
					$query->order($db->escape($db->qn('a.period') . ' ' . $orderDirn));
				}

				$query->order($db->escape($orderCol . ' ' . $orderDirn));
			}
		}

		return $query;
	}

	/**
	 * Gets a list of categories.
	 */
	function getCategories()
	{
		// Create a new query object.
		$db		= JFactory::getDbo();
		$query	= $db->getQuery(true);

		// Select the required fields from the table.
		$query->select('c.id AS cat_id, c.title AS cat_title');
		$query->from('`#__icagenda_category` AS c');

		// Join over the events.
		$query->select('e.id AS id');
		$query->join('LEFT', '#__icagenda_events AS e ON e.catid=c.id');

		// Join over the registrations.
		$query->select('r.eventid AS event_id');
		$query->join('LEFT', '#__icagenda_registration AS r ON r.eventid=e.id');
		$query->where('(e.id = r.eventid)');
		$query->order('c.ordering ASC');

		$db->setQuery($query);
		$categories = $db->loadObjectList();

		$list = array();

		foreach ($categories as $c)
		{
			$list[$c->cat_id] = $c->cat_title . ' [' . $c->cat_id . ']';
		}

		return $list;
	}

	/**
	 * Gets a list of all events.
	 */
	function getEvents()
	{
		// Create a new query object.
		$db		= JFactory::getDBO();
		$query	= $db->getQuery(true);

		// Select the required fields from the table.
		$query->select('e.id AS event, e.title AS title');
		$query->from('`#__icagenda_events` AS e');

		// Join over the categories.
		$query->select('c.id AS cat_id, c.title AS cat_title');
		$query->join('LEFT', '#__icagenda_category AS c ON c.id=e.catid');

		// Join over the registrations.
		$query->select('r.eventid AS eventid');
		$query->join('LEFT', '#__icagenda_registration AS r ON r.eventid=e.id');
		$query->where('(e.id = r.eventid)');
		$query->order('e.title ASC');

		// Filter by published state
//		$query->where('(e.state IN (0, 1))');

		$db->setQuery($query);
		$events = $db->loadObjectList();

		$list = array();

		$catId = $db->escape($this->getState('filter.categories'));

		foreach ($events as $e)
		{
			if ( ! empty($catId) && $catId == $e->cat_id)
			{
				$list[$e->event] = $e->title . ' [' . $e->event . ']';
			}
			elseif (empty($catId))
			{
				$list[$e->event] = $e->title . ' [' . $e->event . ']';
			}
//			$list[$e->event] = $e->title . ' [' . $e->event . ']';
		}

		return $list;
	}

	/**
	 * Gets a list of dates.
	 */
	function getDates()
	{
		$params			= $this->getState('params');
		$dateFormat		= $params->get('date_format_global', 'Y - m - d');
		$dateSeparator	= $params->get('date_separator', ' ');
		$timeFormat		= ($params->get('timeformat', '1') == 1) ? 'H:i' : 'h:i A';

		// Create a new query object.
		$db		= JFactory::getDBO();
		$query	= $db->getQuery(true);

		// Select the required fields from the table.
		$query->select('r.date AS date, r.period AS period, r.eventid AS eventid');
		$query->from('`#__icagenda_registration` AS r');

		// Join over the events (period).
		$query->select('e.startdate AS startdate, e.enddate AS enddate, e.displaytime AS displaytime');
		$query->join('LEFT', '#__icagenda_events AS e ON e.id=r.eventid');

		$db->setQuery($query);
		$dates = $db->loadObjectList();

		$list = array();

		$eventId = $db->escape($this->getState('filter.events'));

		$p = $e = 0;

		// Add to select dropdown the filters 'For all dates of the event' and/or 'For all the period',
		// depending of registrations in data, and selected event
		foreach ($dates as $d)
		{
//			$date	= (empty($d->date) && $d->period == 0)
//					? '[ ' . ucfirst(JText::_('COM_ICAGENDA_ADMIN_REGISTRATION_FOR_ALL_PERIOD')) . ' ]'
//					: '';
			$period	= (empty($d->date) && $d->period == 1)
					? '[ ' . ucfirst(JText::_('COM_ICAGENDA_ADMIN_REGISTRATION_FOR_ALL_DATES')) . ' ]'
					: '';

			if (empty($d->date)
				&& $d->period == 1
				&& $e == 0
				)
			{
				if ( ! empty($eventId) && $eventId == $d->eventid)
				{
					$e = $e+1;
					$list[2] = $period;
				}
				elseif (empty($eventId))
				{
					$e = $e+1;
					$list[2] = $period;
				}
			}
		}

		// Add to select dropdown the list of dates,
		// depending of registrations in data, and selected event
		foreach ($dates as $d)
		{
			$date = '';

			if (empty($d->date) && $d->period == 0)
			{
				if ( ! empty($eventId) && $eventId == $d->eventid)
				{
					if (iCDate::isDate($d->startdate))
					{
						$date = iCGlobalize::dateFormat($d->startdate, $dateFormat, $dateSeparator);

						if ($d->displaytime)
						{
							$date.= ' - ' . date($timeFormat, strtotime($d->startdate));
						}
					}
					if (iCDate::isDate($d->enddate))
					{
						$date.= ' > ' . iCGlobalize::dateFormat($d->enddate, $dateFormat, $dateSeparator);

						if ($d->displaytime)
						{
							$date.= ' - ' . date($timeFormat, strtotime($d->enddate));
						}
					}
				}
				else
				{
					$date = '[ ' . ucfirst(JText::_('COM_ICAGENDA_ADMIN_REGISTRATION_FOR_ALL_PERIOD')) . ' ]';
				}
			}
			else
			{
				$date	= iCDate::isDate($d->date)
						? JHtml::date($d->date, JText::_('DATE_FORMAT_LC3'), null) . ' - ' . date('H:i', strtotime($d->date))
						: $d->date;
			}

			$display_date = ($date != '0000-00-00 00:00:00' && $d->date) ? true : false;

			if ($display_date
				&& ! empty($eventId)
				&& $eventId == $d->eventid
				)
			{
				$list[$d->date] = $date;
			}
			elseif ($display_date
				&& empty($eventId)
				)
			{
				$list[$d->date] = $date;
			}

			if (empty($d->date)
				&& $d->period == 0
				&& $p == 0
				)
			{
				if ( ! empty($eventId) && $eventId == $d->eventid)
				{
					$p = $p+1;
					$list[1] = $date;
				}
				elseif (empty($eventId))
				{
					$p = $p+1;
					$list[1] = $date;
				}
			}
		}

		return $list;
	}
	/**
	 * Get file name
	 *
	 * @return  string    The file name
	 *
	 * @since   1.6
	 */
	public function getBaseName()
	{
		if (!isset($this->basename))
		{
			$app = JFactory::getApplication();
			$basename = $this->getState('basename');
			$basename = str_replace('__SITE__', $app->getCfg('sitename'), $basename);

			$eventId = $this->getState('filter.events');

			if (is_numeric($eventId))
			{
				$basename = str_replace('__EVENTID__', $eventId, $basename);
				$basename = str_replace('__EVENT__', $this->getEventTitle($eventId), $basename);
			}
			else
			{
				$basename = str_replace('__EVENTID__', '', $basename);
				$basename = str_replace('__EVENT__', '', $basename);
			}

			$date = $this->getState('filter.dates');

			if (!empty($date))
			{
				if (iCDate::isDate($date))
				{
					$basename = str_replace('__DATE__', JHtml::date($date, JText::_('DATE_FORMAT_LC3'), null)
											. ' - ' . date('H:i', strtotime($date)),
											$basename);
				}
				else
				{
					$basename = str_replace('__DATE__', $date, $basename);
				}
			}
			else
			{
				$basename = str_replace('__DATE__', '', $basename);
			}

			$this->basename = $basename;
		}

		return $this->basename;
	}

	/**
	 * Get the event title.
	 *
	 * @return  string    The event title
	 *
	 * @since   3.5.0
	 */
	protected function getEventTitle()
	{
		$eventId = $this->getState('filter.events');

		if ($eventId)
		{
			$db = $this->getDbo();
			$query = $db->getQuery(true)
				->select('title')
				->from($db->quoteName('#__icagenda_events'))
				->where($db->quoteName('id') . '=' . $db->quote($eventId));
			$db->setQuery($query);

			try
			{
				$title = $db->loadResult();
			}
			catch (RuntimeException $e)
			{
				$this->setError($e->getMessage());

				return false;
			}
		}
		else
		{
			$title = JText::_('COM_ICAGENDA_NO_EVENT_TITLE');
		}

		return $title;
	}

	/**
	 * Get the status name.
	 *
	 * @return  string    The status name
	 *
	 * @since   3.5.0
	 */
	protected function getStatusName($status)
	{
		$status_array = JHtml::_('jgrid.publishedOptions');

		foreach ($status_array AS $key => $name)
		{
			if ($status == $name->value)
			{
				$status_name = $name->text;
			}
		}

		return JText::_($status_name);
	}

	/**
	 * Get the file type.
	 *
	 * @return  string    The file type
	 *
	 * @since   3.5.0
	 */
	public function getFileType()
	{
		return $this->getState('compressed') ? 'zip' : 'csv';
	}

	/**
	 * Get the mime type.
	 *
	 * @return  string    The mime type.
	 *
	 * @since   3.5.0
	 */
	public function getMimeType()
	{
		return $this->getState('compressed') ? 'application/zip' : 'text/csv';
	}

	/**
	 * Get the separator for values.
	 *
	 * @return  string    The separator.
	 *
	 * @since   3.5.9
	 */
	public function getSeparator()
	{
		return ($this->getState('separator') == 1) ? "," : ";";
	}

	/**
	 * Get the content
	 *
	 * @return  string    The content.
	 *
	 * @since   3.5.0
	 */
	public function getContent()
	{
		if (!isset($this->content))
		{
			$separator = $this->getSeparator();

			foreach ($this->getItems() as $item)
			{
				// Adds filled custom fields
				$customfields = icagendaCustomfields::getList($item->id, 1);

 				$header_cfs	= array();

				if ($customfields)
				{
					foreach ($customfields AS $customfield)
					{
						$header_cfs[]= $customfield->cf_title;
					}
				}
			}

			// Add BOM UTF-8 to csv content
			$this->content	= chr(239) . chr(187) . chr(191);

			$this->content .= '"';

			if ($this->getState('event_title'))
			{
				$this->content .= str_replace('"', '""', JText::_('COM_ICAGENDA_REGISTRATION_EVENTID')) . '"';
			}
			else
			{
				$this->content .= '#' . '"';
			}

			if ($this->getState('date'))
			{
				$this->content .= $separator . '"' . str_replace('"', '""', JText::_('COM_ICAGENDA_REGISTRATION_DATE')) . '"';
			}

			if ($this->getState('tickets'))
			{
				$this->content .= $separator . '"' . str_replace('"', '""', JText::_('COM_ICAGENDA_REGISTRATION_TICKETS')) . '"';
			}

			if ($this->getState('name'))
			{
				$this->content .= $separator . '"' . str_replace('"', '""', JText::_('IC_NAME')) . '"';
			}

			if ($this->getState('email'))
			{
				$this->content .= $separator . '"' . str_replace('"', '""', JText::_('COM_ICAGENDA_REGISTRATION_EMAIL')) . '"';
			}

			if ($this->getState('phone'))
			{
				$this->content .= $separator . '"' . str_replace('"', '""', JText::_('COM_ICAGENDA_REGISTRATION_PHONE')) . '"';
			}

			if ($this->getState('customfields'))
			{
				foreach ($header_cfs AS $header)
				{
					$this->content .= $separator . '"' . str_replace('"', '""', $header) . '"';
				}
			}

			if ($this->getState('notes'))
			{
				$this->content .= $separator . '"' . str_replace('"', '""', JText::_('COM_ICAGENDA_REGISTRATION_NOTES_DISPLAY_LABEL')) . '"';
			}

			if ($this->getState('status'))
			{
				$this->content .= $separator . '"' . str_replace('"', '""', JText::_('JSTATUS')) . '"';
			}

			$this->content .= "\n";

			// Data Rows
			$n = 0;

			foreach ($this->getItems() as $item)
			{
				// Adds filled custom fields
				$customfields = icagendaCustomfields::getList($item->id, 1);

 				$values_cfs	= array();

				if ($customfields)
				{
					foreach ($customfields AS $customfield)
					{
						$cf_value = isset($customfield->cf_value) ? $customfield->cf_value : JText::_('IC_NOT_SPECIFIED');
						$values_cfs[]= $cf_value;
					}
				}

				$this->content .= '"';

				if ($this->getState('event_title'))
				{
					$this->content .= str_replace('"', '""', $item->event) . '"';
				}
				else
				{
					$n = $n + 1;
					$this->content .= $n . '"';
				}

				if ($this->getState('date'))
				{
					$this->content .= $separator . '"' .
						str_replace('"', '""', ($item->period == 1 ? JText::_('COM_ICAGENDA_REGISTRATION_ALL_DATES') : $item->date)) . '"';
				}

				if ($this->getState('tickets'))
				{
					$this->content .= $separator . '"' . str_replace('"', '""', $item->people) . '"';
				}

				if ($this->getState('name'))
				{
					$this->content .= $separator . '"' . str_replace('"', '""', $item->name) . '"';
				}

				if ($this->getState('email'))
				{
					$this->content .= $separator . '"' . str_replace('"', '""', $item->email) . '"';
				}

				if ($this->getState('phone'))
				{
					$this->content .= $separator . '"' . str_replace('"', '""', $item->phone) . '"';
				}

				if ($this->getState('customfields'))
				{
					foreach ($values_cfs AS $value)
					{
						$this->content .= $separator . '"' . str_replace('"', '""', $value) . '"';
					}
				}

				if ($this->getState('notes'))
				{
					$this->content .= $separator . '"' . str_replace('"', '""', $item->notes) . '"';
				}

				if ($this->getState('status'))
				{
					$this->content .= $separator . '"' . str_replace('"', '""', $this->getStatusName($item->state)) . '"';
				}

				$this->content .= "\n";
			}

			if ($this->getState('compressed'))
			{
				$app = JFactory::getApplication('administrator');

				$this->content = str_replace(CHR(13).CHR(10), " ", $this->content);

				$files = array();
				$files['registrations'] = array();
				$files['registrations']['name'] = $this->getBasename() . '.csv';
				$files['registrations']['data'] = $this->content;
				$files['registrations']['time'] = time();
				$ziproot = $app->get('tmp_path') . '/' . uniqid('icagenda_registrations_') . '.zip';

				// Run the packager
				jimport('joomla.filesystem.folder');
				jimport('joomla.filesystem.file');
				$delete = JFolder::files($app->get('tmp_path') . '/', uniqid('icagenda_registrations_'), false, true);

				if (!empty($delete))
				{
					if (!JFile::delete($delete))
					{
						// JFile::delete throws an error
						$this->setError(JText::_('COM_ICAGENDA_EXPORT_ERR_ZIP_DELETE_FAILURE'));

						return false;
					}
				}

				if (!$packager = JArchive::getAdapter('zip'))
				{
					$this->setError(JText::_('COM_ICAGENDA_EXPORT_ERR_ZIP_ADAPTER_FAILURE'));

					return false;
				}
				elseif (!$packager->create($ziproot, $files))
				{
					$this->setError(JText::_('COM_ICAGENDA_EXPORT_ERR_ZIP_CREATE_FAILURE'));

					return false;
				}

				$this->content = file_get_contents($ziproot);
			}
		}

		return $this->content;
	}
}
components/com_icagenda/models/index.html000060400000000032152453623450014602 0ustar00<html><body></body></html>components/com_icagenda/models/categories.php000060400000010576152453623450015461 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.0 2013-07-03
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.modellist');

/**
 * Methods supporting a list of iCagenda records.
 */
class iCagendaModelcategories extends JModelList
{

    /**
     * Constructor.
     *
     * @param    array    An optional associative array of configuration settings.
     * @see        JController
     * @since    1.6
     */
    public function __construct($config = array())
    {
        if (empty($config['filter_fields'])) {
            $config['filter_fields'] = array(
                'id', 'a.id',
                'ordering', 'a.ordering',
                'state', 'a.state',
                'title', 'a.title',
                'color', 'a.color',
                'desc', 'a.desc',

            );
        }

        parent::__construct($config);
    }


	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 */
	protected function populateState($ordering = null, $direction = null)
	{
		// Initialise variables.
		$app = JFactory::getApplication('administrator');

		// Load the filter state.
		$search = $app->getUserStateFromRequest($this->context.'.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		$published = $app->getUserStateFromRequest($this->context.'.filter.state', 'filter_published', '', 'string');
		$this->setState('filter.state', $published);

		// Load the parameters.
		$params = JComponentHelper::getParams('com_icagenda');
		$this->setState('params', $params);

		// List state information.
		parent::populateState('a.title', 'asc');
	}

	/**
	 * 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.state');

		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);

		// Select the required fields from the table.
		$query->select(
			$this->getState(
				'list.select',
				'a.*'
			)
		);
		$query->from('`#__icagenda_category` AS a');


                // Join over the users for the checked out user.
               $query->select('uc.name AS editor');
               $query->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);
                } else if ($published === '') {
                    $query->where('(a.state 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('%'.$db->escape($search, true).'%');
                $query->where('( a.title LIKE '.$search.'  OR  a.color LIKE '.$search.'  OR  a.desc LIKE '.$search.' )');
			}
		}

		// Add the list ordering clause.
		$orderCol	= $this->state->get('list.ordering');
		$orderDirn	= $this->state->get('list.direction');
        if ($orderCol && $orderDirn) {
		    $query->order($db->escape($orderCol.' '.$orderDirn));
        }

		return $query;
	}
}
components/com_icagenda/models/icagenda.php000060400000001657152453623450015067 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-07-03
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.modellist');

/**
 * Methods supporting a list of iCagenda records.
 */
// J2.5 : class iCagendaModelicagenda extends JModelList
class iCagendaModelicagenda extends JModelLegacy
{

}
components/com_icagenda/models/events.php000060400000022716152453623450014637 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.6 2015-06-16
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.modellist');

/**
 * Methods supporting a list of iCagenda records.
 */
class iCagendaModelEvents extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param	array		An optional associative array of configuration settings.
	 * @see		JController
	 * @since	1.0
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'ordering', 'a.ordering',
				'state', 'a.state',
				'approval', 'a.approval',
				'created', 'a.created',
				'title', 'a.title',
				'username', 'a.username',
				'email', 'a.email',
				'category', 'category',
				'image', 'a.image',
				'file', 'a.file',
				'next', 'a.next',
				'place', 'a.place',
				'city', 'a.city',
				'country', 'a.country',
				'desc', 'a.desc',
				'params', 'a.params',
				'location', 'a.location',
				'category_id',
				'site_itemid', 'a.site_itemid',
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 * @since	1.0
	 */
	protected function populateState($ordering = null, $direction = null)
	{
		// Initialise variables.
		$app = JFactory::getApplication('administrator');

		// Load the filter search.
		$search = $app->getUserStateFromRequest($this->context.'.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		// Load the filter state.
		$published = $app->getUserStateFromRequest($this->context.'.filter.state', 'filter_published', '', 'string');
		$this->setState('filter.state', $published);

		// Filter (dropdown) category
		$category = $this->getUserStateFromRequest($this->context.'.filter.category', 'filter_category');
		$this->setState('filter.category', $category);

		// Filter categoryId
		$categoryId = $this->getUserStateFromRequest($this->context . '.filter.category_id', 'filter_category_id');
		$this->setState('filter.category_id', $categoryId);

		// Filter (dropdown) upcoming
		$upcoming = $this->getUserStateFromRequest($this->context.'.filter.upcoming', 'filter_upcoming', '', 'string');
		$this->setState('filter.upcoming', $upcoming);

		// Filter (dropdown) Frontend Menu Itemid
		$site_itemid = $this->getUserStateFromRequest($this->context.'.filter.site_itemid', 'filter_site_itemid', '', 'string');
		$this->setState('filter.site_itemid', $site_itemid);

		// Load the parameters.
		$params = JComponentHelper::getParams('com_icagenda');
		$this->setState('params', $params);

		// List state information.
		parent::populateState('a.id', 'desc');
	}

	/**
	 * 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.0
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id.= ':' . $this->getState('filter.search');
		$id.= ':' . $this->getState('filter.state');
		$id.= ':' . $this->getState('filter.category_id');
		$id.= ':' . $this->getState('filter.site_itemid');

		return parent::getStoreId($id);
	}

	/**
	 * Build an SQL query to load the list data.
	 *
	 * @return	JDatabaseQuery
	 * @since	1.0
	 */
	protected function getListQuery()
	{
		// 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.*'
			)
		);
		$query->from('`#__icagenda_events` AS a');

		// Join over the language
		$query->select('l.title AS language_title')
			->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');
		$query->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 the category
		$query->select('c.title AS category');
		$query->join('LEFT', '#__icagenda_category AS c ON c.id=a.catid');

		// Join over the users for the author.
		$query->select('ua.name AS author_name, ua.username AS author_username')
			->join('LEFT', '#__users AS ua ON ua.id = a.created_by');

		// 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))');
		}

		// 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('%'.$db->escape($search, true).'%');
				$query->where('( a.title LIKE '.$search.' OR a.username LIKE '.$search.' OR a.id LIKE '.$search.' OR a.email LIKE '.$search.' OR a.file LIKE '.$search.' OR a.place LIKE '.$search.' OR a.city LIKE '.$search.' OR a.country LIKE '.$search.' OR a.desc LIKE '.$search.' OR c.title LIKE '.$search.')');
			}
		}

		// Filter category (admin)
		$category = $db->escape($this->getState('filter.category'));

		if (!empty($category))
		{
			$query->where('(a.catid='.$category.')');
		}

		// Filter Frontend Menu Itemid (admin)
		$site_itemid = $db->escape($this->getState('filter.site_itemid'));

		if ($site_itemid == '0')
		{
			$query->where('(a.site_itemid = "0")');
		}
		elseif ($site_itemid)
		{
			$query->where('(a.site_itemid = ' . $site_itemid . ')');
		}

		// Filter by categories. (NOT USED (multiple-categories filter))
		$categoryId = $this->getState('filter.category_id');

		if (is_numeric($categoryId) && !empty($categoryId))
		{
			$query->where('a.catid = ' . $categoryId . '');
		}
		elseif (is_array($categoryId) && !empty($categoryId))
		{
			JArrayHelper::toInteger($categoryId);
			$categoryId = implode(',', $categoryId);
			$query->where('a.catid IN (' . $categoryId . ')');
		}


		// Filter Upcoming Dates
		$upcoming = $db->escape($this->getState('filter.upcoming'));

		if (!empty($upcoming))
		{
			if ($upcoming == '1')
			{
				$query->where(' a.next >= CURDATE()');
			}
			elseif ($upcoming == '2')
			{
				$query->where(' a.next < CURDATE() ');
			}
			elseif ($upcoming == '3')
			{
				$query->where(' a.next >= NOW() ');
			}
			elseif ($upcoming == '4')
			{
				$query->where(' a.next >= CURDATE() AND a.next < ( CURDATE() + INTERVAL 1 DAY ) ');
			}
		}

		// Add the list ordering clause.
		$orderCol	= $this->state->get('list.ordering');
		$orderDirn	= $this->state->get('list.direction');

		if ($orderCol && $orderDirn)
		{
			$query->order($db->escape($orderCol.' '.$orderDirn));
		}

		return $query;
	}


	/**
	 * Build an SQL query to load the list of all categories.
	 *
	 * @return	JDatabaseQuery
	 * @since	3.3.0
	 */
	function getCategories()
	{
		// Create a new query object.
		$db		= JFactory::getDBO();
		$query	= $db->getQuery(true);

		// Select the required fields from the table.
		$query->select('c.id AS catid, c.title AS category');
		$query->from('`#__icagenda_category` AS c');

		// Filter by published state
		$query->where('(c.state IN (0,1))');

		// Order Ordering ASC
		$query->order('c.ordering ASC');

		$db->setQuery($query);
		$categories = $db->loadObjectList();

		if (count($categories) > 0)
		{
			foreach ($categories as $cat)
			{
				$list[$cat->catid] = $cat->category;
			}

			return $list;
		}
		else
		{
			return array();
		}
	}

	/**
	 * Build an SQL query to load the list of menu item itemid.
	 *
	 * @return	JDatabaseQuery
	 * @since	3.3.0
	 */
	function getMenuItemID()
	{
		// Create a new query object.
		$db		= JFactory::getDBO();
		$query	= $db->getQuery(true);

		// Select the required fields from the table.
		$query->select('m.id AS itemid, m.link AS menu_link, m.title AS menu_title');
		$query->from('`#__menu` AS m');

		// Filter by published state
		$query->where('(m.link = "index.php?option=com_icagenda&view=submit")');
		$query->where('(m.published IN (0,1))');

		$db->setQuery($query);
		$itemids = $db->loadObjectList();

		$list['0'] = 'Created in admin';

		if (count($itemids) > 0)
		{
			foreach ($itemids as $itemid)
			{
				$list[$itemid->itemid] = $itemid->itemid . ' - ' . $itemid->menu_title;
			}

			return $list;
		}
		else
		{
			return array();
		}
	}

	/**
	 * Gets a list of options for Upcoming (Events) Filter.
	 *
	 * @since	3.3.0
	 */
	function getUpcoming()
	{
		$list['1'] = JText::_('COM_ICAGENDA_OPTION_TODAY_AND_UPCOMING');
		$list['2'] = JText::_('COM_ICAGENDA_OPTION_PAST_EVENTS');
		$list['3'] = JText::_('COM_ICAGENDA_OPTION_UPCOMING_EVENTS');
		$list['4'] = JText::_('COM_ICAGENDA_OPTION_TODAY');

		return $list;
	}
}
components/com_icagenda/models/customfields.php000060400000013062152453623450016026 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-07-16
 * @since		3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.modellist');

/**
 * Methods supporting a list of iCagenda custom fields.
 */
class iCagendaModelcustomfields extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param	array		An optional associative array of configuration settings.
	 * @see		JController
	 * @since	3.4.0
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'cf.id',
				'ordering', 'cf.ordering',
				'state', 'cf.state',
				'title', 'cf.title',
				'slug', 'cf.slug',
				'parent_form', 'cf.parent_form',
				'type', 'cf.type',
				'required', 'cf.required',
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @since	3.4.0
	 */
	protected function populateState($ordering = null, $direction = null)
	{
		// Initialise variables.
		$app = JFactory::getApplication('administrator');

		// Load the filter state.
		$search = $app->getUserStateFromRequest($this->context.'.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		$published = $app->getUserStateFromRequest($this->context.'.filter.state', 'filter_published', '', 'string');
		$this->setState('filter.state', $published);

		// Filter (dropdown) parent form
		$parent_form = $this->getUserStateFromRequest($this->context.'.filter.parent_form', 'filter_parent_form', '', 'string');
		$this->setState('filter.parent_form', $parent_form);

		// Filter (dropdown) field type
		$type = $this->getUserStateFromRequest($this->context.'.filter.type', 'filter_type', '', 'string');
		$this->setState('filter.type', $type);

		// Load the parameters.
		$params = JComponentHelper::getParams('com_icagenda');
		$this->setState('params', $params);

		// List state information.
		parent::populateState('cf.title', 'asc');
	}

	/**
	 * 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.4.0
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id.= ':' . $this->getState('filter.search');
		$id.= ':' . $this->getState('filter.state');

		return parent::getStoreId($id);
	}

	/**
	 * Build an SQL query to load the list data.
	 *
	 * @return	JDatabaseQuery
	 * @since	3.4.0
	 */
	protected function getListQuery()
	{
		// 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',
				'cf.*'
			)
		);
		$query->from('`#__icagenda_customfields` AS cf');

		// Join over the users for the checked out user.
		$query->select('uc.name AS editor');
		$query->join('LEFT', '#__users AS uc ON uc.id=cf.checked_out');

		// Filter by published state
		$published = $this->getState('filter.state');

		if (is_numeric($published))
		{
			$query->where($db->qn('cf.state') . ' = ' . (int) $published);
		}
		elseif ($published === '')
		{
			$query->where($db->qn('cf.state') . ' IN (0, 1)');
		}

		// Filter by Parent Form
		$parent_form = $db->escape($this->getState('filter.parent_form'));

		if (!empty($parent_form))
		{
			$query->where($db->qn('cf.parent_form') . ' = ' . (int) $parent_form);
		}

		// Filter by Field Type
		$type = $db->escape($this->getState('filter.type'));

		if (!empty($type))
		{
			$query->where($db->qn('cf.type') . ' = ' . (string) $db->q($type));
		}

		// Search Filters
		$search = $this->getState('filter.search');

		if (!empty($search))
		{
			if (stripos($search, 'id:') === 0)
			{
				$query->where($db->qn('cf.id') . ' = ' . (int) substr($search, 3));
			}
			else
			{
				$search = $db->Quote('%'.$db->escape($search, true).'%');
				$query->where('( cf.title LIKE '.$search.'  OR  cf.slug LIKE '.$search.'  OR  cf.type LIKE '.$search.' )');
			}
		}

		// Add the list ordering clause.
		$orderCol	= $this->state->get('list.ordering');
		$orderDirn	= $this->state->get('list.direction');

		if ($orderCol && $orderDirn)
		{
			$query->order($db->escape($orderCol.' '.$orderDirn));
		}

		return $query;
	}

	/**
	 * Gets a list of Parent Forms.
	 *
	 * @since	3.4.0
	 */
	function getParentForm()
	{
		$list['1'] = JText::_('COM_ICAGENDA_CUSTOMFIELD_PARENT_REGISTRATION_FORM');
		$list['2'] = JText::_('COM_ICAGENDA_CUSTOMFIELD_PARENT_EVENT_EDIT');

		return $list;
	}

	/**
	 * Gets a list of Field Types.
	 *
	 * @since	3.4.0
	 */
	function getFieldTypes()
	{
		$type['text'] = JText::_('COM_ICAGENDA_CUSTOMFIELD_TYPE_TEXT');
		$type['list'] = JText::_('COM_ICAGENDA_CUSTOMFIELD_TYPE_LIST');
		$type['radio'] = JText::_('COM_ICAGENDA_CUSTOMFIELD_TYPE_RADIO');

		return $type;
	}
}
components/com_icagenda/models/mail.php000060400000016364152453623450014257 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.9 2015-07-30
 * @since       2.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.modeladmin');
jimport('joomla.mail.mail');


/**
 * iCagenda model.
 */
class iCagendaModelMail extends JModelAdmin
{
	/**
	 * @var		string	The prefix to use with controller messages.
	 * @since	1.6
	 */
	protected $text_prefix = 'COM_ICAGENDA';

	/**
	 * Method to get the row form.
	 *
	 * @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_icagenda.mail', 'mail', 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.
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			$data = JFactory::getApplication()->getUserState('com_icagenda.display.mail.data', array());

			if (empty($data))
			{
//				$data = $this->getItem();
				$data = JFactory::getApplication()->getUserState('com_icagenda.mail.data', array());
			}
		}
		else
		{
			$data = JFactory::getApplication()->getUserState('com_icagenda.display.mail.data', array());

			if (empty($data))
			{
				$data = JFactory::getApplication()->getUserState('com_icagenda.mail.data', array());
			}

			$this->preprocessData('com_icagenda.mail', $data);
		}

		return $data;
	}

	/**
	 * Method to preprocess the form
	 *
	 * @param   JForm   $form   A form 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 loading the form.
	 */
	protected function preprocessForm(JForm $form, $data, $group = 'user')
	{
		parent::preprocessForm($form, $data, $group);
	}

	/**
	 * Send the email
	 *
	 * @return  boolean
	 */
	public function send()
	{
		$app    = JFactory::getApplication();
		$data   = $app->input->post->get('jform', array(), 'array');
		$user   = JFactory::getUser();
		$access = new JAccess;

		// Set Form Data to Session
		$session = JFactory::getSession();
		$session->set('ic_newsletter', $data);

		$mailer = JFactory::getMailer();
		$config = JFactory::getConfig();

		$send	= '';

		$sender = array(
		    $app->getCfg( 'mailfrom' ),
		    $app->getCfg( 'fromname' )
		    );

		$mailer->setSender($sender);

//		$list		= array_key_exists('list', $data) ? $data['list'] : ''; // DEPRECATED
		$eventid	= array_key_exists('eventid', $data) ? $data['eventid'] : '';
		$date		= array_key_exists('date', $data) ? $data['date'] : '';

		$db     = $this->getDbo();
		$query	= $db->getQuery(true);
		$query->select('r.email, r.eventid, r.state, r.date, r.people')
			->from('`#__icagenda_registration` AS r');
		$query->where('r.state = 1');
		$query->where('r.email <> ""');
		$query->where('r.eventid = ' . (int) $eventid);

		if ($date != 'all')
		{
			if (iCDate::isDate($date))
			{
				$query->where('r.date = ' . $db->q($date));
			}
			elseif ($date == 1)
			{
				$query->where('r.period = 1');
			}
			elseif ($date)
			{
				// Fix for old date saving data
				$query->where('r.date = ' . $db->q($date));
			}
			else
			{
				$query->where('r.period = 0');
			}
		}

		$db->setQuery($query);

		$result	= $db->loadObjectList();

		$list	= '';
		$people	= 0;

		foreach ($result as $v)
		{
			$list.= $v->email . ', ';
			$people = ($people + $v->people);
		}

		$subject	= array_key_exists('subject', $data) ? $data['subject'] : '';
		$messageget	= array_key_exists('message', $data) ? $data['message'] : '';

		$list_emails	= explode(', ', $list);

		// Remove dupplicated email addresses
		$recipient			= array_unique($list_emails);
		$dupplicated_emails	= count($list_emails) - count($recipient);

		$obj		= $subject;
		$message	= $messageget;

		$recipient	= array_filter($recipient);
//		$mailer->addRecipient($recipient);
//		$mailer->addRecipient($sender);
		$mailer->addBCC($recipient);

		$content	= stripcslashes($message);
		$body		= str_replace('src="images/', 'src="' . JURI::root() . '/images/', $content);

//		$mailer->setSender(array( $mailfrom, $fromname ));
		$mailer->setSubject($obj);
		$mailer->isHTML(true);
		$mailer->Encoding = 'base64';
		$mailer->setBody($body);

		if ($obj && $body && $eventid && ($date || $date == '0'))
		{
			$send = $mailer->Send();
		}

		if ($send !== true)
		{
		    $app->enqueueMessage(JText::_('COM_ICAGENDA_NEWSLETTER_ERROR_ALERT'), 'error');

		    if ( ! $obj)
		    {
		    	$app->enqueueMessage('- ' . JText::_('COM_ICAGENDA_NEWSLETTER_NO_OBJ_ALERT'), 'error');
		    }
		    if ( ! $body)
		    {
		    	$app->enqueueMessage('- ' . JText::_('COM_ICAGENDA_NEWSLETTER_NO_BODY_ALERT'), 'error');
		    }
		    if ( ! $eventid && ( ! $date && $date != '0'))
		    {
		    	$app->enqueueMessage('- ' . JText::_('COM_ICAGENDA_NEWSLETTER_NO_EVENT_SELECTED'), 'error');
		    }
		    elseif ( $eventid && ( ! $date && $date != '0'))
		    {
		    	$app->enqueueMessage('- ' . JText::_('COM_ICAGENDA_NEWSLETTER_NO_DATE_SELECTED'), 'error');
		    }

		    return false;
		}
		else
		{
		    $app->enqueueMessage('<h2>' . JText::_('COM_ICAGENDA_NEWSLETTER_SUCCESS') . '</h2>', 'message');

			$app->enqueueMessage($this->listSend($recipient, 0, $people), 'message');

			if ($dupplicated_emails)
			{
				$app->enqueueMessage('<i>' . JText::sprintf('COM_ICAGENDA_NEWSLETTER_NB_EMAIL_NOT_SEND', $dupplicated_emails) . '</i>', 'message');
			}

//			$app->setUserState('com_icagenda.mail.data', null);
//			echo '<pre>'.print_r($recipient, true).'</pre>';

		    return true;
		}
	}

	public function listSend($recipient, $level = 0, $people = null)
	{
		$number		= 0;
		$list_send	= '';

		foreach($recipient AS $key => $value)
		{
			if (is_array($value) | is_object($value))
			{
				parent::listArray($value, $level+=1);
			}
			else
			{
//				$number = ($key + 1);
				$number = ($number + 1);

				$list_send.= str_repeat("&nbsp;", $level*3);
				$list_send.= $number . " : " . $value . "<br>";
			}
		}

//		$list_send.= '<div>&nbsp;</div>';
		$list_send.= '<h4>' . JText::_('COM_ICAGENDA_NEWSLETTER_NB_EMAIL_SEND').' = ' . $number . '';
		$list_send.= '<small> (' . JText::_('COM_ICAGENDA_REGISTRATION_TICKETS').': ' . $people . ')</small></h4>';

		return $list_send;
	}
}
components/com_icagenda/models/customfield.php000060400000007401152453623450015643 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-06-13
 * @since		3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.modeladmin');


/**
 * iCagenda model.
 */
class iCagendaModelCustomfield extends JModelAdmin
{
	/**
	 * @var		string	The prefix to use with controller messages.
	 * @since	3.4.0
	 */
	protected $text_prefix = 'COM_ICAGENDA';

	/**
	 * Returns a reference to the a Table object, always creating it.
	 *
	 * @param	type	The table type to instantiate
	 * @param	string	A prefix for the table class name. Optional.
	 * @param	array	Configuration array for model. Optional.
	 * @return	JTable	A database object
	 * @since	3.4.0
	 */
	public function getTable($type = 'Customfield', $prefix = 'iCagendaTable', $config = array())
	{
		return JTable::getInstance($type, $prefix, $config);
	}

	/**
	 * Method to get the record form.
	 *
	 * @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	3.4.0
	 */
	public function getForm($data = array(), $loadData = true)
	{
		// Get the form.
		$form = $this->loadForm('com_icagenda.customfield', 'customfield',
								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	3.4.0
	 */
	protected function loadFormData()
	{
		// Check the session for previously entered form data.
		$data = JFactory::getApplication()->getUserState('com_icagenda.edit.customfield.data', array());

		if (empty($data))
		{
			$data = $this->getItem();
		}

		return $data;
	}

	/**
	 * Method to get a single record.
	 *
	 * @param	integer	The id of the primary key.
	 *
	 * @return	mixed	Object on success, false on failure.
	 * @since	3.4.0
	 */
	public function getItem($pk = null)
	{
		if ($item = parent::getItem($pk))
		{
			//Do any procesing on fields here if needed
		}

		return $item;
	}

	/**
	 * Prepare and sanitise the table prior to saving.
	 *
	 * @since	3.4.0
	 */
	protected function prepareTable( $table )
	{
		$app = JFactory::getApplication();

		$date = JFactory::getDate();
		$user = JFactory::getUser();

		if (empty($table->id))
		{
			// Set the values
			$table->created = $date->toSql();

			// Set ordering to the last item if not set
			if (empty($table->ordering))
			{
				$db = JFactory::getDbo();
				$query = $db->getQuery(true)
					->select('MAX(ordering)')
					->from($db->quoteName('#__icagenda_customfields'));
				$db->setQuery($query);
				$max = $db->loadResult();

				$table->ordering = $max + 1;
			}
		}
		else
		{
			// Set the values
			$table->modified = $date->toSql();
			$table->modified_by = $user->get('id');
		}

		// Alter the title for save as copy
		if ($app->input->get('task') == 'save2copy')
		{
			$table->title = iCString::increment($table->title);
			$table->alias = iCString::increment($table->alias, 'dash');
			$table->slug = iCString::increment($table->slug, 'underscore');
			$table->state = '0';
		}
	}
}
components/com_icagenda/models/features.php000060400000010142152453623450015137 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      doorknob & Cyril Rezé
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-07-02
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.modellist');

/**
 * Methods supporting a list of iCagenda records.
 */
class iCagendaModelfeatures extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param	array		An optional associative array of configuration settings.
	 * @see		JController
	 * @since	3.4.0
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'ordering', 'a.ordering',
				'state', 'a.state',
				'desc', 'a.desc',
				'icon', 'a.icon',
				'icon_alt', 'a.icon_alt',
				'show_filter', 'a.show_filter',
			);
		}

		parent::__construct($config);
	}


	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @since	3.4.0
	 */
	protected function populateState($ordering = null, $direction = null)
	{
		// Initialise variables.
		$app = JFactory::getApplication('administrator');

		// Load the filter state.
		$search = $app->getUserStateFromRequest($this->context.'.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		$published = $app->getUserStateFromRequest($this->context.'.filter.state', 'filter_published', '', 'string');
		$this->setState('filter.state', $published);

		// Load the parameters.
		$params = JComponentHelper::getParams('com_icagenda');
		$this->setState('params', $params);

		// List state information.
		parent::populateState('a.title', 'asc');
	}

	/**
	 * 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.4.0
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id.= ':' . $this->getState('filter.search');
		$id.= ':' . $this->getState('filter.state');

		return parent::getStoreId($id);
	}

	/**
	 * Build an SQL query to load the list data.
	 *
	 * @return	JDatabaseQuery
	 * @since	3.4.0
	 */
	protected function getListQuery()
	{
		// 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.*'
			)
		);
		$query->from('#__icagenda_feature AS a');

		// Join over the users for the checked out user.
		$query->select('uc.name AS editor');
		$query->leftJoin('#__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))');
		}

		// 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('%'.$db->escape($search, true).'%');
				$query->where("(a.title LIKE $search OR a.desc LIKE $search)");
			}
		}

		// Add the list ordering clause.
		$orderCol	= $this->state->get('list.ordering');
		$orderDirn	= $this->state->get('list.direction');

		if ($orderCol && $orderDirn)
		{
			$query->order($db->escape("$orderCol $orderDirn"));
		}

		return $query;
	}
}
components/com_icagenda/models/download.php000060400000005556152453623450015145 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.0 2015-02-05
 * @since       3.5.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

// Joomla 2.5 import
jimport('joomla.application.component.modelform');

/**
 * Download model.
 *
 * @since	3.5.0
 */
class icagendaModelDownload extends JModelForm
{
	protected $_context = 'com_icagenda.registrations';

	/**
	 * Auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @return  void
	 *
	 * @since   3.5.0
	 */
	protected function populateState()
	{
		// Joomla 3
		if (version_compare(JVERSION, '3.0', 'ge'))
		{
			$input = JFactory::getApplication()->input;

			$basename = $input->cookie->getString(JApplicationHelper::getHash($this->_context . '.basename'), '__SITE__');
			$this->setState('basename', $basename);

			$compressed = $input->cookie->getInt(JApplicationHelper::getHash($this->_context . '.compressed'), 1);
			$this->setState('compressed', $compressed);
		}

		// Joomla 2.5
		else
		{
			$basename = JRequest::getString(JApplication::getHash($this->_context.'.basename'), '__SITE__', 'cookie');
			$this->setState('basename', $basename);

			$compressed = JRequest::getInt(JApplication::getHash($this->_context.'.compressed'), 1, 'cookie');
			$this->setState('compressed', $compressed);
		}
	}

	/**
	 * 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  mixed  A JForm object on success, false on failure
	 *
	 * @since   3.5.0
	 */
	public function getForm($data = array(), $loadData = true)
	{
		// Get the form.
		$form = $this->loadForm('com_icagenda.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   3.5.0
	 */
	protected function loadFormData()
	{
		$data = array(
			'basename'		=> $this->getState('basename'),
			'compressed'	=> $this->getState('compressed')
		);

		// Joomla 3
		if (version_compare(JVERSION, '3.0', 'ge'))
		{
			$this->preprocessData('com_icagenda.download', $data);
		}

		return $data;
	}
}
components/com_icagenda/models/info.php000060400000001240152453623450014253 0ustar00<?php
/** 
 *	iCagenda
 *----------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright	Copyright (C) 2012 JOOMLIC - All rights reserved.
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Jooml!C - http://www.joomlic.com
 * 
 * @since		1.2.6
 *----------------------------------------------------------------------------
*/

// No direct access to this file
defined( '_JEXEC' ) or die( 'Restricted access' );

jimport('joomla.application.component.modellist');

/**
 * Methods supporting a list of iCagenda records.
 */
class iCagendaModelinfo extends JModelList
{
	

}
components/com_icagenda/models/fields.php000060400000001242152453623450014570 0ustar00<?php
/** 
 *	iCagenda
 *----------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright	Copyright (C) 2012 JOOMLIC - All rights reserved.
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Jooml!C - http://www.joomlic.com
 * 
 * @since		1.2.6
 *----------------------------------------------------------------------------
*/

// No direct access to this file
defined( '_JEXEC' ) or die( 'Restricted access' );

jimport('joomla.application.component.modellist');

/**
 * Methods supporting a list of iCagenda records.
 */
class iCagendaModelfields extends JModelList
{
	

}
components/com_icagenda/models/event.php000060400000034177152453623450014460 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.12 2015-09-25
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.modeladmin');


/**
 * iCagenda model.
 */
class iCagendaModelEvent extends JModelAdmin
{
	/**
	 * @var		string	The prefix to use with controller messages.
	 * @since	1.0
	 */
	protected $text_prefix = 'COM_ICAGENDA';

	/**
	 * 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   3.5.6
	 */
	protected function canDelete($record)
	{
		if ( ! empty($record->id))
		{
			if ($record->state != -2)
			{
				return false;
			}

			$user = JFactory::getUser();

			if ($user->authorise('core.delete'))
			{
				icagendaCustomfields::deleteData($record->id, 2);
				icagendaCustomfields::cleanData(2);

				return true;
			}
		}

		return false;
	}

	/**
	 * Prepare and sanitise the table prior to saving.
	 *
	 * @param   JTable  $table  A JTable object.
	 *
	 * @return  void
	 *
	 * @since	1.0
	 */
	protected function prepareTable( $table )
	{
		$date = JFactory::getDate();
		$user = JFactory::getUser();

		$table->name = htmlspecialchars_decode($table->name, ENT_QUOTES);

		if (empty($table->id))
		{
			// Set the values
			$table->created = $date->toSql();

			// Set ordering to the last item if not set
			if (empty($table->ordering))
			{
				$db = JFactory::getDbo();
				$query = $db->getQuery(true)
					->select('MAX(ordering)')
					->from($db->quoteName('#__icagenda_events'));
				$db->setQuery($query);
				$max = $db->loadResult();

				$table->ordering = $max + 1;
			}
		}
		else
		{
			// Set the values
			$table->modified = $date->toSql();
			$table->modified_by = $user->get('id');
		}
	}

	/**
	 * 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.0
	 */
	public function getTable($type = 'Event', $prefix = 'iCagendaTable', $config = array())
	{
		return JTable::getInstance($type, $prefix, $config);
	}

	/**
	 * 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.0
	 */
	public function getItem($pk = null)
	{
		if ($item = parent::getItem($pk))
		{
			// Do any procesing on fields here if needed
		}

		return $item;
	}

	/**
	 * 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  mixed  A JForm object on success, false on failure
	 *
	 * @since	1.0
	 */
	public function getForm($data = array(), $loadData = true)
	{
		// Get the form.
		$form = $this->loadForm('com_icagenda.event', 'event',
								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.0
	 */
	protected function loadFormData()
	{
		// Check the session for previously entered form data.
		$app = JFactory::getApplication();
		$data_array = $app->getUserState('com_icagenda.edit.event.data', array());

		if (empty($data_array))
		{
			$data = $this->getItem();
		}
		else
		{
			$data = new JObject;
			$data->setProperties($data_array);
		}

		// If not array, creates array with week days data
		if ( ! is_array($data->weekdays))
		{
			$data->weekdays = explode(',', $data->weekdays);
		}

		// Retrieves data, to display selected week days
		$arrayWeekDays = $data->weekdays;

		foreach ($arrayWeekDays as $allTest)
		{
			if ($allTest == '')
			{
				$data->weekdays = '0,1,2,3,4,5,6';
			}
		}

		// Set displaytime default value
		if ( ! isset($data->displaytime))
		{
			$data->displaytime = JComponentHelper::getParams('com_icagenda')->get('displaytime', '1');
		}

		// Set Features
		$data->features = $this->getFeatures($data->id);

		// Convert features into an array so that the form control can be set
		if ( ! isset($data->features))
		{
			$data->features = array();
		}

		if ( ! is_array($data->features))
		{
			$data->features = explode(',', $data->features);
		}

		return $data;
	}

	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since	3.4.0
	 */
	public function save($data)
	{
		$input	= JFactory::getApplication()->input;
		$date	= JFactory::getDate();
		$user	= JFactory::getUser();

		// Fix version before 3.4.0 to set a created date (will use last modified date if exists, or current date)
		if (empty($data['created']))
		{
			$data['created'] = ( ! empty($data['modified'])) ? $data['modified'] : $date->toSql();
		}

		// 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['catid'], $data['alias'], $data['title']);
				$data['title'] = $title;
				$data['alias'] = $alias;
			}
			else
			{
				if ($data['alias'] == $origTable->alias)
				{
					$data['alias'] = '';
				}
			}
			$data['state'] = 0;
		}

		// Automatic handling of alias for empty fields
		if (in_array($input->get('task'), array('apply', 'save', 'save2new')) && (int) $input->get('id') == 0)
		{
			if ($data['alias'] == null)
			{
				if (JFactory::getConfig()->get('unicodeslugs') == 1)
				{
					$data['alias'] = JFilterOutput::stringURLUnicodeSlug($data['title']);
				}
				else
				{
					$data['alias'] = JFilterOutput::stringURLSafe($data['title']);
				}

				$table = JTable::getInstance('Event', 'iCagendaTable');

				if ($table->load(array('alias' => $data['alias'], 'catid' => $data['catid'])))
				{
					$msg = JText::_('COM_ICAGENDA_ALERT_EVENT_SAVE_WARNING');
				}

				list($title, $alias) = $this->generateNewTitle($data['catid'], $data['alias'], $data['title']);
				$data['alias'] = $alias;

				if (isset($msg))
				{
					JFactory::getApplication()->enqueueMessage($msg, 'warning');
				}
			}
		}

		// Generates Alias if empty
		if ($data['alias'] == null || empty($data['alias']))
		{
			$data['alias'] = JFilterOutput::stringURLSafe($data['title']);

			if ($data['alias'] == null || empty($data['alias']))
			{
				if (JFactory::getConfig()->get('unicodeslugs') == 1)
				{
					$data['alias'] = JFilterOutput::stringURLUnicodeSlug($data['title']);
				}
				else
				{
					$data['alias'] = JFilterOutput::stringURLSafe($data['created']);
				}
			}
		}

		// Set File Uploaded
		if ( ! isset($data['file']))
		{
			$file = JRequest::getVar('jform', null, 'files', 'array');
			$fileUrl = $this->upload($file);
			$data['file'] = $fileUrl;
		}

		// Set Creator infos
		$userId	= $user->get('id');
		$userName = $user->get('name');

		if (empty($data['created_by']))
		{
			$data['created_by'] = (int) $userId;
		}

		$data['username'] = $userName;

		// Set Params
		if (isset($data['params']) && is_array($data['params']))
		{
			// Convert the params field to a string.
			$parameter = new JRegistry;
			$parameter->loadArray($data['params']);
			$data['params'] = (string)$parameter;
		}

		// Get Event ID from the result back to the Table after saving.
		$table = $this->getTable();

		if ($table->save($data) === true)
		{
			$data['id'] = $table->id;
		}
		else
		{
			$data['id'] = null;
		}

		if (parent::save($data))
		{
			// Save Features to database
			$this->maintainFeatures($data);

			// Save Custom Fields to database
			if (isset($data['custom_fields']) && is_array($data['custom_fields']))
			{
				icagendaCustomfields::saveToData($data['custom_fields'], $data['id'], 2);
			}

			return true;
		}

		return false;
	}

	/**
	 * Upload
	 *
	 * @since	3.5.3
	 */
	function upload($file)
	{
		jimport('joomla.filesystem.file');
		jimport('joomla.filesystem.folder');

		$filename = JFile::makeSafe($file['name']['file']);

		// Get media path
		$params_media	= JComponentHelper::getParams('com_media');
		$image_path		= $params_media->get('image_path', 'images');

		// Paths to thumbs folder
		$thumbsPath		= $image_path . '/icagenda/thumbs';

		if ($filename != '')
		{
			$src = $file['tmp_name']['file'];
			$dest =  JPATH_SITE . '/' . $image_path . '/icagenda/files/' . $filename;

			if ( ! is_dir($dest))
			{
				mkdir($intDir, 0755);
			}

			if (JFile::upload($src, $dest, false))
			{
				echo 'upload';
				return $image_path . '/icagenda/files/' . $filename;
			}

			return $image_path . '/icagenda/files/' . $filename;
		}
	}

	/**
	 * Maintain features to data
	 *
	 * @since	3.4.0
	 */
	protected function maintainFeatures($data)
	{
		// Get the list of feature ids to be linked to the event
		$features = isset($data['features']) && is_array($data['features']) ? implode(',', $data['features']) : '';

		$db = JFactory::getDbo();

		// Write any new feature records to the icagenda_feature_xref table
		if ( ! empty($features))
		{
			// Get a list of the valid features already present for this event
			$query = $db->getQuery(true);

			$query->select('feature_id')
				->from($db->qn('#__icagenda_feature_xref'));

			$query->where('event_id = ' . (int) $data['id']);
			$query->where('feature_id IN (' . $features . ')');

			$db->setQuery($query);

			$existing_features = $db->loadColumn(0);

			// Identify the insert list
			if (empty($existing_features))
			{
				$new_features = $data['features'];
			}
			else
			{
				$new_features = array();

				foreach ($data['features'] as $feature)
				{
					if ( ! in_array($feature, $existing_features))
					{
						$new_features[] = $feature;
					}
				}
			}
			// Write the needed xref records
			if ( ! empty($new_features))
			{
				$xref = new JObject;
				$xref->set('event_id', $data['id']);

				foreach ($new_features as $feature)
				{
					$xref->set('feature_id', $feature);
					$db->insertObject('#__icagenda_feature_xref', $xref);
					$db->setQuery($query);

					if ( ! $db->execute())
					{
						return false;
					}
				}
			}
		}

		// Delete any unwanted feature records from the icagenda_feature_xref table
		$query = $db->getQuery(true);
		$query->delete($db->qn('#__icagenda_feature_xref'));
		$query->where('event_id = ' . (int) $data['id']);

		if ( ! empty($features))
		{
			// Delete only unwanted features
			$query->where('feature_id NOT IN (' . $features . ')');
		}

		$db->setQuery($query);
		$db->execute($query);

		if ( ! $db->execute())
		{
			return false;
		}

		return true;
	}

	/**
	 * Extracts the list of Feature IDs linked to the event and returns an array
	 *
	 * @param	integer  $event_id
	 *
	 * @return	array/integer  Set of Feature IDs
	 *
	 * @since	3.5.3
	 */
	protected function getFeatures($event_id)
	{
		// Write any new feature records to the icagenda_feature_xref table
		if (empty($event_id))
		{
			return '';
		}
		else
		{
			$db = JFactory::getDbo();

			// Get a comma separated list of the ids of features present for this event
			// Note: Direct extraction of a comma separated list is avoided because each db type uses proprietary syntax
			$query = $db->getQuery(true);
			$query->select('fx.feature_id')
				->from($db->qn('#__icagenda_events', 'e'))
				->innerJoin('#__icagenda_feature_xref AS fx ON e.id=fx.event_id')
				->innerJoin('#__icagenda_feature AS f ON fx.feature_id=f.id AND f.state=1');
			$query->where('e.id = ' . (int) $event_id);
			$db->setQuery($query);
			$features = $db->loadColumn(0);

			// Return a comma separated list
			return implode(',', $features);
		}
	}

	/**
	 * Approve Function.
	 *
	 * @since   3.2.0
	 */
	function approve($cid, $publish)
	{
		if (count($cid))
		{
			JArrayHelper::toInteger($cid);
			$cids = implode( ',', $cid );
			$query = 'UPDATE #__icagenda_events'
					. ' SET approval = '.(int) $publish
					. ' WHERE id IN ( '.$cids.' )';
					$this->_db->setQuery( $query );

			if ( ! $this->_db->query())
			{
				$this->setError($this->_db->getErrorMsg());

				return false;
			}
		}

		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   3.6.0
	 */
//	protected function canDelete($record)
//	{
//		if ( ! empty($record->id))
//		{
//			if ($record->state != -2)
//			{
//				return false;
//			}

//			$user = JFactory::getUser();

//			return $user->authorise('core.delete', 'com_icagenda.event.' . (int) $record->id);
//		}

//		return false;
//	}

	/**
	 * 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   3.6.0
	 */
//	protected function canEditState($record)
//	{
//		$user = JFactory::getUser();

		// Check for existing event.
//		if (!empty($record->id))
//		{
//			return $user->authorise('core.edit.state', 'com_icagenda.event.' . (int) $record->id);
//		}
		// New event, so check against the category.
//		elseif (!empty($record->catid))
//		{
//			return $user->authorise('core.edit.state', 'com_icagenda.event.' . (int) $record->catid);
//		}
		// Default to component settings if neither event nor category known.
//		else
//		{
//			return parent::canEditState('com_icagenda');
//		}
//	}
}
components/com_icagenda/access.xml000060400000005277152453623450013325 0ustar00<?xml version="1.0" encoding="utf-8"?>
<access component="com_icagenda">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
		<action name="core.edit.own" title="JACTION_EDITOWN" description="JACTION_EDITOWN_COMPONENT_DESC" />
		<action name="icagenda.access.categories" title="COM_ICAGENDA_ACCESS_VIEW_CATEGORIES"
			description="COM_ICAGENDA_ACCESS_VIEW_CATEGORIES_DESC" />
		<action name="icagenda.access.events" title="COM_ICAGENDA_ACCESS_VIEW_EVENTS"
			description="COM_ICAGENDA_ACCESS_VIEW_EVENTS_DESC" />
		<action name="icagenda.access.registrations" title="COM_ICAGENDA_ACCESS_VIEW_REGISTRATIONS"
			description="COM_ICAGENDA_ACCESS_VIEW_REGISTRATIONS_DESC" />
		<action name="icagenda.access.newsletter" title="COM_ICAGENDA_ACCESS_VIEW_NEWSLETTER"
			description="COM_ICAGENDA_ACCESS_VIEW_NEWSLETTER_DESC" />
		<action name="icagenda.access.customfields" title="COM_ICAGENDA_ACCESS_VIEW_CUSTOMFIELDS"
			description="COM_ICAGENDA_ACCESS_VIEW_CUSTOMFIELDS_DESC" />
		<action name="icagenda.access.features" title="COM_ICAGENDA_ACCESS_VIEW_FEATURES"
			description="COM_ICAGENDA_ACCESS_VIEW_FEATURES_DESC" />
		<action name="icagenda.access.themes" title="COM_ICAGENDA_ACCESS_VIEW_THEMES"
			description="COM_ICAGENDA_ACCESS_VIEW_THEMES_DESC" />
	</section>
	<section name="category">
		<action name="core.create" title="JACTION_CREATE" description="COM_CATEGORIES_ACCESS_CREATE_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="COM_CATEGORIES_ACCESS_DELETE_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="COM_CATEGORIES_ACCESS_EDIT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_CATEGORIES_ACCESS_EDITSTATE_DESC" />
		<action name="core.edit.own" title="JACTION_EDITOWN" description="COM_CATEGORIES_ACCESS_EDITOWN_DESC" />
	</section>
	<section name="event">
		<action name="core.delete" title="JACTION_DELETE" description="COM_CONTENT_ACCESS_DELETE_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="COM_CONTENT_ACCESS_EDIT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_CONTENT_ACCESS_EDITSTATE_DESC" />
	</section>
</access>
components/com_icagenda/helpers/icagenda.php000060400000021155152453623450015241 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-07-02
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

// Access check.
if (!JFactory::getUser()->authorise('core.manage', 'com_icagenda')) {
	return JError::raiseWarning(404, JText::_('JERROR_ALERTNOAUTHOR'));
}

/**
 * iCagenda helper.
 */
class iCagendaHelper
{
	/**
	 * Configure the Linkbar.
	 */
	public static function addSubmenu($submenu)
	{
		if(version_compare(JVERSION, '3.0', 'lt'))
		{
			JSubMenuHelper::addEntry(
				JText::_('COM_ICAGENDA_TITLE_ICAGENDA'),
				'index.php?option=com_icagenda&view=icagenda',
				$submenu == 'icagenda'
			);
			if (JFactory::getUser()->authorise('icagenda.access.categories', 'com_icagenda'))
			{
				JSubMenuHelper::addEntry(
					JText::_('COM_ICAGENDA_TITLE_CATEGORIES'),
					'index.php?option=com_icagenda&view=categories',
					$submenu == 'categories'
				);
			}
			if (JFactory::getUser()->authorise('icagenda.access.events', 'com_icagenda'))
			{
				JSubMenuHelper::addEntry(
					JText::_('COM_ICAGENDA_TITLE_EVENTS'),
					'index.php?option=com_icagenda&view=events',
					$submenu == 'events'
				);
			}
			if (JFactory::getUser()->authorise('icagenda.access.registrations', 'com_icagenda'))
			{
				JSubMenuHelper::addEntry(
					JText::_('COM_ICAGENDA_TITLE_REGISTRATION'),
					'index.php?option=com_icagenda&view=registrations',
					$submenu == 'registrations'
				);
			}
			if (JFactory::getUser()->authorise('icagenda.access.newsletter', 'com_icagenda'))
			{
				JSubMenuHelper::addEntry(
					JText::_('COM_ICAGENDA_TITLE_NEWSLETTER'),
					'index.php?option=com_icagenda&view=mail&layout=edit',
					$submenu == 'newsletter'
				);
			}
			if (JFactory::getUser()->authorise('icagenda.access.customfields', 'com_icagenda'))
			{
				JSubMenuHelper::addEntry(
					JText::_('COM_ICAGENDA_TITLE_CUSTOMFIELDS'),
					'index.php?option=com_icagenda&view=customfields',
					$submenu == 'customfields'
				);
			}
			if (JFactory::getUser()->authorise('icagenda.access.features', 'com_icagenda'))
			{
				JSubMenuHelper::addEntry(
					JText::_('COM_ICAGENDA_TITLE_FEATURES'),
					'index.php?option=com_icagenda&view=features',
					$submenu == 'features'
				);
			}
			if (JFactory::getUser()->authorise('icagenda.access.themes', 'com_icagenda'))
			{
				JSubMenuHelper::addEntry(
					JText::_('COM_ICAGENDA_THEMES'),
					'index.php?option=com_icagenda&view=themes',
					$submenu == 'themes'
				);
			}
			JSubMenuHelper::addEntry(
				JText::_('COM_ICAGENDA_INFO'),
				'index.php?option=com_icagenda&view=info',
				$submenu == 'info'
			);

			$document = JFactory::getDocument();

			/**
			 * Set Titles iCagenda
			 */
			if ($submenu == 'icagenda')
			{
				$document->setTitle(JText::_('COM_ICAGENDA'));
			}
			if ($submenu == 'categories')
			{
				$document->setTitle(JText::_('COM_ICAGENDA') . ' | ' . JText::_('COM_ICAGENDA_TITLE_CATEGORIES'));
			}
			if ($submenu == 'events')
			{
				$document->setTitle(JText::_('COM_ICAGENDA') . ' | ' . JText::_('COM_ICAGENDA_TITLE_EVENTS'));
			}
			if ($submenu == 'registrations')
			{
				$document->setTitle(JText::_('COM_ICAGENDA') . ' | ' . JText::_('COM_ICAGENDA_TITLE_REGISTRATION'));
			}
			if ($submenu == 'newsletter')
			{
				$document->setTitle(JText::_('COM_ICAGENDA') . ' | ' . JText::_('COM_ICAGENDA_TITLE_NEWSLETTER'));
			}
			if ($submenu == 'customfields')
			{
				$document->setTitle(JText::_('COM_ICAGENDA') . ' | ' . JText::_('COM_ICAGENDA_TITLE_CUSTOMFIELDS'));
			}
			if ($submenu == 'features')
			{
				$document->setTitle(JText::_('COM_ICAGENDA') . ' | ' . JText::_('COM_ICAGENDA_TITLE_FEATURES'));
			}
			if ($submenu == 'themes')
			{
				$document->setTitle(JText::_('COM_ICAGENDA') . ' | ' . JText::_('COM_ICAGENDA_THEMES'));
			}
			if ($submenu == 'info')
			{
				$document->setTitle(JText::_('COM_ICAGENDA') . ' | ' . JText::_('COM_ICAGENDA_INFO'));
			}

			$document->addStyleDeclaration('
				.icon48icagenda{background: url(../media/com_icagenda/images/XXX.png);}
				.icon-48-events {background: url(../media/com_icagenda/images/all_events-48.png) no-repeat;}
				.icon-48-event {background: url(../media/com_icagenda/images/new_event-48.png) no-repeat;}
				.icon-48-registration {background: url(../media/com_icagenda/images/registration-48.png) no-repeat;}
				.icon-48-categories {background: url(../media/com_icagenda/images/all_cats-48.png) no-repeat;}
				.icon-48-category {background: url(../media/com_icagenda/images/new_cat-48.png) no-repeat;}
				.icon-48-generic {background: url(../media/com_icagenda/images/iconicagenda48.png) no-repeat;}
				.icon-48-mail {background: url(../media/com_icagenda/images/newsletter-48.png) no-repeat;}
				.icon-48-themes {background: url(../media/com_icagenda/images/themes-48.png) no-repeat;}
				.icon-48-customfields {background: url(../media/com_icagenda/images/customfields-48.png) no-repeat;}
				.icon-48-info {background: url(../media/com_icagenda/images/info-48.png) no-repeat;}
			');
		}
		else
		{
			JHtmlSidebar::addEntry(
				JText::_('COM_ICAGENDA_TITLE_ICAGENDA'),
				'index.php?option=com_icagenda&view=icagenda',
				$submenu == 'icagenda'
			);
			if (JFactory::getUser()->authorise('icagenda.access.categories', 'com_icagenda'))
			{
				JHtmlSidebar::addEntry(
					JText::_('COM_ICAGENDA_TITLE_CATEGORIES'),
					'index.php?option=com_icagenda&view=categories',
					$submenu == 'categories'
				);
			}
			if (JFactory::getUser()->authorise('icagenda.access.events', 'com_icagenda'))
			{
				JHtmlSidebar::addEntry(
					JText::_('COM_ICAGENDA_TITLE_EVENTS'),
					'index.php?option=com_icagenda&view=events',
					$submenu == 'events'
				);
			}
			if (JFactory::getUser()->authorise('icagenda.access.registrations', 'com_icagenda'))
			{
				JHtmlSidebar::addEntry(
					JText::_('COM_ICAGENDA_TITLE_REGISTRATION'),
					'index.php?option=com_icagenda&view=registrations',
					$submenu == 'registrations'
				);
			}
			if (JFactory::getUser()->authorise('icagenda.access.newsletter', 'com_icagenda'))
			{
				JHtmlSidebar::addEntry(
					JText::_('COM_ICAGENDA_TITLE_NEWSLETTER'),
					'index.php?option=com_icagenda&view=mail&layout=edit',
					$submenu == 'newsletter'
				);
			}
			if (JFactory::getUser()->authorise('icagenda.access.customfields', 'com_icagenda'))
			{
				JHtmlSidebar::addEntry(
					JText::_('COM_ICAGENDA_TITLE_CUSTOMFIELDS'),
					'index.php?option=com_icagenda&view=customfields',
					$submenu == 'customfields'
				);
			}
			if (JFactory::getUser()->authorise('icagenda.access.features', 'com_icagenda'))
			{
				JHtmlSidebar::addEntry(
					JText::_('COM_ICAGENDA_TITLE_FEATURES'),
					'index.php?option=com_icagenda&view=features',
					$submenu == 'features'
				);
			}
			if (JFactory::getUser()->authorise('icagenda.access.themes', 'com_icagenda'))
			{
				JHtmlSidebar::addEntry(
					JText::_('COM_ICAGENDA_THEMES'),
					'index.php?option=com_icagenda&view=themes',
					$submenu == 'themes'
				);
			}
			JHtmlSidebar::addEntry(
				JText::_('COM_ICAGENDA_INFO'),
				'index.php?option=com_icagenda&view=info',
				$submenu == 'info'
			);
		}
	}

	/**
	 * Gets a list of the actions that can be performed.
	 */
	public static function getActions($messageId = 0)
	{
		$user   = JFactory::getUser();
		$result = new JObject;

		if (empty($messageId))
		{
			$assetName = 'com_icagenda';
		}
		else
		{
			$assetName = 'com_icagenda.message.'.(int) $messageId;
		}

		$actions = array(
			'core.admin',
			'core.manage',
			'core.create',
			'core.edit',
			'core.delete',
			'core.edit.state',
			'core.edit.own',
			'icagenda.access.categories',
			'icagenda.access.events',
			'icagenda.access.registrations',
			'icagenda.access.newsletter',
			'icagenda.access.customfields',
			'icagenda.access.features',
			'icagenda.access.themes'
		);

		foreach ($actions as $action)
		{
			$result->set($action, $user->authorise($action, $assetName));
		}

		return $result;
	}

	/**
	 * Tests whether a string is serialized before attempting to unserialize it
	 *
	 * ( TO BE REMOVED WHEN ALL CALLS FROM IC LIBRARY !!! )
	 */
	public static function isSerialized($str)
	{
		return ($str == serialize(false) || @unserialize($str) !== false);
	}
}
components/com_icagenda/helpers/html/events.php000060400000002761152453623450015760 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.1.10 2013-09-11
 * @since       3.2
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * Extended Utility class for the iCagenda component.
 *
 * @package     Joomla.Administrator
 * @subpackage  com_iCagenda
 * @since       3.2
 */
class JHtmlEvents
{

	public static function approveEvents()
	{
		$states = array(
			1	=> array(
				'img'				=> 'tick.png',
				'task'				=> 'approve',
				'text'				=> '',
				'active_title'		=> 'COM_ICAGENDA_TOOLBAR_APPROVE',
				'inactive_title'	=> '',
				'tip'				=> true,
				'active_class'		=> 'unpublish',
				'inactive_class'	=> 'unpublish'
			),
			0	=> array(
				'img'				=> 'publish_x.png',
				'task'				=> '',
				'text'				=> '',
				'active_title'		=> '',
				'inactive_title'	=> 'COM_ICAGENDA_APPROVED',
				'tip'				=> true,
				'active_class'		=> 'publish',
				'inactive_class'	=> 'publish'
			)
		);
		return $states;
	}
}
components/com_icagenda/helpers/html/index.html000060400000000037152453623450015732 0ustar00<!DOCTYPE html><title></title>
components/com_icagenda/helpers/index.html000060400000000032152453623450014761 0ustar00<html><body></body></html>components/com_icagenda/controller.php000060400000003353152453623450014227 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.6 2015-06-23
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * Controller class - iCagenda.
 */
class iCagendaController extends JControllerLegacy
{
	/**
	 * 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	JController		This object to support chaining.
	 * @since	1.5
	 */
	public function display($cachable = false, $urlparams = false)
	{
		require_once JPATH_COMPONENT . '/helpers/icagenda.php';

		// Set Input J3
		$jinput = JFactory::getApplication()->input;

		// Load the submenu.
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			iCagendaHelper::addSubmenu(JRequest::getCmd('view', 'icagenda'));
			$view = JRequest::getCmd('view', 'icagenda');
			JRequest::setVar('view', $view);
		}
		else
		{
			iCagendaHelper::addSubmenu($jinput->get('view', 'icagenda'));
			$view = $jinput->get('view', 'icagenda');
			$jinput->set('view', $view);
		}

		parent::display();

		return $this;
	}
}
components/com_icagenda/tables/category.php000060400000011261152453623450015130 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rez�, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rez� (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-12-04
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * category Table class
 */
class iCagendaTablecategory extends JTable
{
	/**
	 * Constructor
	 *
	 * @param JDatabase A database connector object
	 */
	public function __construct(&$_db)
	{
		parent::__construct('#__icagenda_category', 'id', $_db);
	}

	/**
	 * Overloaded bind function to pre-process the params.
	 *
	 * @param	array		Named array
	 * @return	null|string	null is operation was satisfactory, otherwise returns an error
	 * @see		JTable:bind
	 * @since	1.5
	 */
	public function bind($array, $ignore = '')
	{
		if (isset($array['params']) && is_array($array['params'])) {
			$registry = new JRegistry();
			$registry->loadArray($array['params']);
			$array['params'] = (string)$registry;
		}

		if (isset($array['metadata']) && is_array($array['metadata'])) {
			$registry = new JRegistry();
			$registry->loadArray($array['metadata']);
			$array['metadata'] = (string)$registry;
		}
		return parent::bind($array, $ignore);
	}

    /**
    * Overloaded check function
    */
    public function check()
    {
		// If there is an ordering column and this is a new row then get the next ordering value
        if (property_exists($this, 'ordering') && $this->id == 0)
        {
            $this->ordering = self::getNextOrder();
        }

        return parent::check();
    }


    /**
     * 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    An optional array of primary key values to update.  If not
     *                    set the instance property value is used.
     * @param    integer The publishing state. eg. [0 = unpublished, 1 = published]
     * @param    integer 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)
    {
        // Initialise variables.
        $k = $this->_tbl_key;

        // Sanitize input.
        JArrayHelper::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->_tbl.'`' .
            ' SET `state` = '.(int) $state .
            ' WHERE ('.$where.')' .
            $checkin
        );
        $this->_db->query();

        // Check for a database error.
        if ($this->_db->getErrorNum()) {
            $this->setError($this->_db->getErrorMsg());
            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;
    }
}
components/com_icagenda/tables/event.php000060400000046062152453623450014443 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.10 2015-08-14
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * event Table class
 */
class iCagendaTableEvent extends JTable
{
	/**
	 * @var array $custom_fields  Property for the array of custom fields.
	 * This needs to be specified because there is no column for features in the events table
	 */
	protected $custom_fields = array();

	/**
	 * Constructor
	 *
	 * @param JDatabase A database connector object
	 */
	public function __construct(&$_db)
	{
		parent::__construct('#__icagenda_events', 'id', $_db);
	}

	/**
	 * Overloaded bind function to pre-process the params.
	 *
	 * @param	array		Named array
	 * @return	null|string	null is operation was satisfactory, otherwise returns an error
	 * @see		JTable:bind
	 * @since	1.3
	 */
	public function bind($array, $ignore = '')
	{
		$lang	= JFactory::getLanguage();

		// Serialize Single Dates
		$dev_option = '0';

		// Set Vars
		$eventTimeZone	= null;
		$nodate			= '0000-00-00 00:00:00';
		$date_today		= JHtml::date('now', 'Y-m-d'); // Joomla Time Zone

        if (iCString::isSerialized($array['dates']))
		{
			$dates = unserialize($array['dates']);
		}
		elseif ($dev_option == '1') // DEV.
		{
			$dates = $this->setDatesOptions($array['dates']);
		}
		else
		{
			$dates = $this->getDates($array['dates']);

			if ($lang->getTag() == 'fa-IR'
				&& $dates != array('0000-00-00 00:00')
				&& $dates != array('')
				)
			{
				$dates_to_sql = array();

				foreach ($dates AS $date)
				{
					if (iCDate::isDate($date))
					{
						$year		= date('Y', strtotime($date));
						$month		= date('m', strtotime($date));
						$day		= date('d', strtotime($date));
						$time		= date('H:i', strtotime($date));

						$converted_date = iCGlobalizeConvert::jalaliToGregorian($year, $month, $day, true) . ' ' . $time;
						$dates_to_sql[] = date('Y-m-d H:i', strtotime($converted_date));
					}
				}

				$dates = $dates_to_sql;
			}
		}

		$dates = ($dates == array('')) ? array('0000-00-00 00:00') : $dates;

		rsort($dates);

		if ($dev_option == '1') // DEV.
		{
			$array['dates']	= $array['dates'];
		}
		else
		{
			$array['dates']	= serialize($dates);
		}


		/**
		 * Set Week Days
		 */
		if (!isset($array['weekdays']))
		{
			$array['weekdays'] = '';
		}
		elseif (is_array($array['weekdays']))
		{
			$array['weekdays'] = implode(',', $array['weekdays']);
		}

		// Return the dates of the period.
		$startdate	= ($array['startdate'] == NULL) ? $nodate : $array['startdate'];
		$enddate	= ($array['enddate'] == NULL) ? $nodate : $array['enddate'];

		if (($startdate == $nodate) && ($enddate != $nodate))
		{
			$enddate = $nodate;
		}

		if (strtotime($startdate) > strtotime($enddate))
		{
			$errorperiod = '1';
		}
		else
		{
			$errorperiod = '';

			$period_all_dates_array	= iCDatePeriod::listDates($startdate, $enddate, $eventTimeZone);
			$WeeksDays				= iCDatePeriod::weekdaysToArray($array['weekdays']);

			$period_array = array();

			foreach ($period_all_dates_array AS $date_in_weekdays)
			{
				$datetime_period_date = JHtml::date($date_in_weekdays, 'Y-m-d H:i', $eventTimeZone);

				if (in_array(date('w', strtotime($datetime_period_date)), $WeeksDays))
				{
					array_push($period_array, $datetime_period_date);
				}
			}
		}

		// Serialize Period Dates
		if (($startdate != $nodate) && ($enddate != $nodate))
		{
			if ($errorperiod != '1')
			{
				$array['period'] = serialize($period_array);

				$period = (iCString::isSerialized($array['period'])) ? unserialize($array['period']) : array();

				if ($lang->getTag() == 'fa-IR')
				{
					$period_to_sql = array();

					foreach ($period AS $date)
					{
						if (iCDate::isDate($date))
						{
							$year		= date('Y', strtotime($date));
							$month		= date('m', strtotime($date));
							$day		= date('d', strtotime($date));
							$time		= date('H:i', strtotime($date));

							$converted_date = iCGlobalizeConvert::jalaliToGregorian($year, $month, $day, true) . ' ' . $time;
							$period_to_sql[] = date('Y-m-d H:i', strtotime($converted_date));
						}
					}

					$period = $period_to_sql;
				}

				rsort($period);

				$array['period'] = serialize($period);
			}
			else
			{
				$array['period'] = '';
			}
		}
		else
		{
			$array['period'] = '';
		}

		// Set Next Date
		$NextDates	= $this->getNextDates($dates);
		$NextPeriod	= isset($period)
					? $this->getNextPeriod($period, $array['weekdays'])
					: $this->getNextDates($dates);

		$date_NextDates		= JHtml::date($NextDates, 'Y-m-d', $eventTimeZone);
		$date_NextPeriod	= JHtml::date($NextPeriod, 'Y-m-d', $eventTimeZone);
		$time_NextDates		= JHtml::date($NextDates, 'H:i', $eventTimeZone);
		$time_NextPeriod	= JHtml::date($NextPeriod, 'H:i', $eventTimeZone);
//		$date_NextDates		= date('Y-m-d', strtotime($NextDates));
//		$date_NextPeriod	= date('Y-m-d', strtotime($NextPeriod));
//		$time_NextDates		= date('H:i', strtotime($NextDates));
//		$time_NextPeriod	= date('H:i', strtotime($NextPeriod));

		// Control the next date
		if ((strtotime($date_NextDates) >= strtotime($date_today)) && (strtotime($date_NextPeriod) >= strtotime($date_today)))
		{
			if (strtotime($date_NextDates) < strtotime($date_NextPeriod))
			{
				$array['next'] = $this->getNextDates($dates);
			}
			if (strtotime($date_NextDates) > strtotime($date_NextPeriod))
			{
				$array['next'] = $this->getNextPeriod($period, $array['weekdays']);
			}
			if (strtotime($date_NextDates) == strtotime($date_NextPeriod))
			{
				if (strtotime($time_NextDates) >= strtotime($time_NextPeriod))
				{
					if (isset($period))
					{
						$array['next'] = $this->getNextPeriod($period, $array['weekdays']);
					}
					else
					{
						$array['next'] = $this->getNextDates($dates);
					}
				}
				else
				{
					$array['next'] = $this->getNextDates($dates);
				}
			}
		}
		elseif ((strtotime($date_NextDates) < strtotime($date_today)) && (strtotime($date_NextPeriod) >= strtotime($date_today)))
		{
			$array['next'] = $this->getNextPeriod($period, $array['weekdays']);
		}
		elseif ((strtotime($date_NextDates) >= strtotime($date_today)) && (strtotime($date_NextPeriod) < strtotime($date_today)))
		{
			$array['next'] = $this->getNextDates($dates);
		}
		elseif ((strtotime($date_NextDates) < strtotime($date_today)) && (strtotime($date_NextPeriod) < strtotime($date_today)))
		{
			if (strtotime($date_NextDates) < strtotime($date_NextPeriod))
			{
				$array['next'] = $this->getNextPeriod($period, $array['weekdays']);
			}
			else
			{
				$array['next'] = $this->getNextDates($dates);
			}
		}

		// Control of dates if valid (EDIT SINCE VERSION 3.0 - update 3.1.4)
		if (((strtotime($NextDates) >= '943916400')
			&& (strtotime($NextDates) <= '944002800'))
			&& ($errorperiod == '1'))
		{
			$array['next'] = '-3600';
		}
		if (((strtotime($NextDates)=='943916400') || (strtotime($NextDates)=='943920000'))
			&& ((strtotime($NextPeriod)=='943916400') || (strtotime($NextPeriod)=='943920000')))
		{
			$array['next'] = '-3600';
		}

		if ($array['next'] == '-3600')
		{
			$state = 0;
			$this->_db->setQuery(
			'UPDATE `#__icagenda_events`' .
			' SET `state` = '.(int) $state .
			' WHERE `id` = '. (int) $array['id']
			);
			if(version_compare(JVERSION, '3.0', 'lt'))
			{
				$this->_db->query();
			}
			else
			{
				$this->_db->execute();
			}
		}

		$return[] = parent::bind($array, $ignore);


		// ====================================
		// START : HACK FOR A FEW PRO USERS !!!
		// ====================================

		$mail_new_event = JComponentHelper::getParams('com_icagenda')->get('mail_new_event', '0');
		if ($mail_new_event == 1)
		{
			$title = $array['title'];
			$id_event = $array['id'];
			$db = JFactory::getDbo();
			$query	= $db->getQuery(true);
			$query->select('id AS eventID')
					->from('#__icagenda_events')
					->order('id DESC');
			$db->setQuery($query);
			$eventID = $db->loadResult();
			$new_event = JRequest::getVar('new_event');
			$title = $array['title'];
			$description = $array['desc'];
			$venue = '';
			if ($array['place']) $venue.= $array['place'].' - ';
			if ($array['city']) $venue.= $array['city'];
			if ($array['city'] && $array['country']) $venue.= ', ';
			if ($array['country']) $venue.= $array['country'];
			if (strtotime($array['startdate']))
			{
				$date = 'Du '.$array['startdate'].' au '.$array['startdate'];
			}
			else
			{
				$date = $array['next'];
			}
			$baseURL = JURI::base();
			$baseURL = str_replace('/administrator', '', $baseURL);
			$baseURL = ltrim($baseURL, '/');
			if ($array['image']) $image = '<img src="'.$baseURL.'/'.$array['image'].'" />';
			if ($new_event == '1' && $eventID && $array['state'] == '1' && $array['approval'] == '0')
			{
					$return[] = self::notificationNewEvent(($eventID+1), $title, $description, $venue, $date, $image, $new_event);
			}
		}

		// ====================================
		// END : HACK FOR A FEW PRO USERS !!!
		// ====================================


		return $return;

	}

	/**
	 * DEV.
	 */
	function setDatesOptions($dates) // DEV.
	{
		$dates	= str_replace('day=', '', $dates);
		$dates	= str_replace('start=', '', $dates);
		$dates	= str_replace('end=', '', $dates);
//		$dates	= str_replace('+', ' ', $dates);
		$dates	= str_replace('%3A', ':', $dates);
		$dates	= str_replace('&', ',', $dates);

		$ex_dates = explode(',stop=stop', $dates);

		$singles_dates = array();

		foreach ($ex_dates AS $sd)
		{
			if ($sd != '')
			{
				array_push($singles_dates, $sd);
			}
		}

		return $singles_dates;
	}

	/**
	 * Get Dates for Single Dates Script Input
	 */
	function getDates($dates)
	{
		$dates		= str_replace('d=', '', $dates);
		$dates		= str_replace('+', ' ', $dates);
		$dates		= str_replace('%3A', ':', $dates);
		$ex_dates	= explode('&', $dates);

		return $ex_dates;
	}

	/**
	 * Get Next Date from Single Dates
	 */
	function getNextDates($dates)
	{
		// Set Vars
		$eventTimeZone	= null;
		$date_today		= JHtml::date('now', 'Y-m-d'); // Joomla Time Zone

		// Get Next
		$next			= JRequest::getVar('next');

		if (count($dates))
		{
			while (strtotime($next) <= strtotime($date_today))
			{
				$nextDate = $dates[0];

				foreach ($dates as $d)
				{
					if (strtotime($d) >= strtotime($date_today))
					{
						$nextDate = $d;
					}
				}

//				return JHtml::date($nextDate, 'Y-m-d H:i', $eventTimeZone);
				return date('Y-m-d H:i', strtotime($nextDate));
			}
		}
	}

	/**
	 * Get Next Date from Period
	 */
	function getNextPeriod($period, $i_weekdays)
	{
		// Set Vars
		$eventTimeZone	= null;
		$date_today		= JHtml::date('now', 'Y-m-d'); // Joomla Time Zone

		$WeeksDays = iCDatePeriod::weekdaysToArray($i_weekdays);

		// Set Next Date for Period, if dates exist in Period
		if (count($period))
		{
			$nextPeriod	= $period[0];

			foreach ($period as $e)
			{
				if (in_array(date('w', strtotime($e)), $WeeksDays))
				{
					if (strtotime($e) >= strtotime($date_today)) // if datetime in period >= date today
					{
						$nextPeriod = $e;
					}
				}
			}

//			return JHtml::date($nextPeriod, 'Y-m-d H:i', $eventTimeZone);
			return date('Y-m-d H:i', strtotime($nextPeriod));
		}
	}

	/**
	* Overloaded check function
	*/
	public function check()
	{
		// If there is an ordering column and this is a new row then get the next ordering value
		if (property_exists($this, 'ordering') && $this->id == 0)
		{
			$this->ordering = self::getNextOrder();
		}

		return parent::check();
	}


	/**
	* 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	An optional array of primary key values to update.  If not
	*					set the instance property value is used.
	* @param    integer The publishing state. eg. [0 = unpublished, 1 = published]
	* @param    integer 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)
	{
		// Initialise variables.
		$k = $this->_tbl_key;

		// Sanitize input.
		JArrayHelper::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->_tbl.'`' .
			' SET `state` = '.(int) $state .
			' WHERE ('.$where.')' .
			$checkin
		);
		$this->_db->query();

		// Check for a database error.
		if ($this->_db->getErrorNum())
		{
			$this->setError($this->_db->getErrorMsg());
			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;
	}


	/**
	 * HACK FOR A FEW PRO USERS !!!
	 *
	 * Will be removed when creation of a notification plugin
	 *
	 */
	function notificationNewEvent ($eventid, $title, $description, $venue, $date, $image, $new_event)
	{
		// Load iCagenda Global Options
		$iCparams = JComponentHelper::getParams('com_icagenda');

		// Load Joomla Config
		$config = JFactory::getConfig();

		// Switch Joomla 3.x / 2.5
		if (version_compare(JVERSION, '3.0', 'ge'))
		{
			// Get the site name
			$sitename = $config->get('sitename');

			// Get Global Joomla Contact Infos
			$mailfrom = $config->get('mailfrom');
			$fromname = $config->get('fromname');

			// Get default language
			$langdefault = $config->get('language');
		}
		else
		{
			// Get the site name
			$sitename = $config->getValue('config.sitename');

			// Get Global Joomla Contact Infos
			$mailfrom = $config->getValue('config.mailfrom');
			$fromname = $config->getValue('config.fromname');

			// Get default language
			$langdefault = $config->getValue('config.language');
		}

		$siteURL = JURI::base();
		$siteURL = rtrim($siteURL,'/');

		$iCmenuitem = false;

		// Itemid Request (automatic detection of the first iCagenda menu-link, by menuID, and depending of current language)

		$langFrontend = $langdefault;
		$db = JFactory::getDbo();
		$query	= $db->getQuery(true);
		$query->select('id AS idm')
				->from('#__menu')
				->where( "(link = 'index.php?option=com_icagenda&view=list') AND (published > 0) AND (language = '$langFrontend')" );
		$db->setQuery($query);
		$idm = $db->loadResult();
		$mItemid = $idm;

		if ($mItemid == NULL)
		{
				$db = JFactory::getDbo();
				$query	= $db->getQuery(true);
				$query->select('id AS noidm')
						->from('#__menu')
						->where( "(link = 'index.php?option=com_icagenda&view=list') AND (published > 0) AND (language = '*')" );
				$db->setQuery($query);
				$noidm = $db->loadResult();
		}

		$nolink = '';

		if ($noidm == NULL && $mItemid == NULL)
		{
				$nolink = 1;
		}

		if (is_numeric($iCmenuitem))
		{
				$lien = $iCmenuitem;
		}
		else
		{
			if ($mItemid == NULL)
			{
					$lien = $noidm;
			}
			else
			{
					$lien = $mItemid;
			}
		}

		// Set Notification Email to each User groups allowed to receive a notification email when a new event created
		$groupid = $iCparams->get('newevent_Groups', array("8"));

		jimport( 'joomla.access.access' );
		$newevent_Groups_Array = array();
		foreach ($groupid AS $gp) {
			$GroupUsers = JAccess::getUsersByGroup($gp, False);
			$newevent_Groups_Array = array_merge($newevent_Groups_Array, $GroupUsers);
		}

		$db = JFactory::getDbo();
		$query	= $db->getQuery(true);

		$matches = implode(',', $newevent_Groups_Array);
		$query->select('ui.username AS username, ui.email AS email, ui.password AS passw, ui.block AS block, ui.activation AS activation')
			->from('#__users AS ui')
			->where( "ui.id IN ($matches) ");
		$db->setQuery($query);
		$users = $db->loadObjectList();

		foreach ($users AS $user)
		{
			// Create Notification Mailer
			$new_mailer = JFactory::getMailer();

			// Set Sender of Notification Email
			$new_mailer->setSender(array( $mailfrom, $fromname ));

        	$username = $user->username;
        	$passw = $user->passw;
        	$email = $user->email;

			// Set Recipient of Notification Email
			$new_recipient = $email;
			$new_mailer->addRecipient($email);

			// Set Subject of New Event Notification Email
			$new_subject = 'Nouvel évènement, '.$sitename;
			$new_mailer->setSubject($new_subject);

			// Set Url to preview new event
			$baseURL = JURI::base();
			$baseURL = str_replace('/administrator', '', $baseURL);

			$urlpreview = str_replace('&amp;','&', JRoute::_($baseURL.'index.php?option=com_icagenda&view=list&layout=event&id='.(int)$eventid.'&Itemid='.(int)$lien));

			// Set Body of User Notification Email
			$new_body_hello = 'Bonjour,';
			$new_bodycontent = $new_body_hello.'<br /><br />';
			$new_body_text = $sitename.' vous propose un nouvel évènement :';
			$new_bodycontent.= $new_body_text.'<br /><br />';

			// Event Details
			$new_bodycontent.= $title ? 'Titre: '.$title.'<br />' : '';
			$new_bodycontent.= $description ? 'Description: '.$description.'<br />' : '';
			$new_bodycontent.= $venue ? 'Lieu: '.$venue.'<br />' : '';
			$new_bodycontent.= $date ? 'Date: '.$date.'<br /><br />' : '';
			$new_bodycontent.= $image.'<br /><br />';

			// Link to event details view
			$new_bodycontent.= '<a href="'.$urlpreview.'">'.$urlpreview.'</a><br /><br />';

			// Footer
			$new_body_footer = 'Do not answer to this e-mail notification as it is a generated e-mail. You are receiving this email message because you are registered at '.$sitename.'.';
			$new_bodycontent.= '<hr><small>'.$new_body_footer.'<small>';

			// Removes spaces (leading, ending) from Body
			$new_body = rtrim($new_bodycontent);

			// Authorizes HTML
			$new_mailer->isHTML(true);
			$new_mailer->Encoding = 'base64';

			// Set Body
			$new_mailer->setBody($new_body);

			// Send User Notification Email
			if (isset($email)) {
				if($user->block == '0' && empty($user->activation)){
					$send = $new_mailer->Send();
				}
			}
		}
	}
}
components/com_icagenda/tables/icagenda.php000060400000004357152453623450015056 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-06-29
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

// import Joomla table library
jimport('joomla.database.table');

/**
 * iCagenda Table class
 */
class iCagendaTableiCagenda extends JTable
{
	/**
	 * Constructor
	 *
	 * @param object Database connector object
	 */
	function __construct(&$db)
	{
		parent::__construct('#__icagenda_events', 'id', $db);
	}
	/**
	 * Overloaded bind function
	 *
	 * @param       array           named array
	 * @return      null|string     null is operation was satisfactory, otherwise returns an error
	 * @see JTable:bind
	 * @since 1.5
	 */
	public function bind($array, $ignore = '')
	{
		if (isset($array['params']) && is_array($array['params']))
		{
			// Convert the params field to a string.
			$parameter = new JRegistry;
			$parameter->loadArray($array['params']);
			$array['params'] = (string)$parameter;
		}
		return parent::bind($array, $ignore);
	}

	/**
	 * Overloaded load function
	 *
	 * @param       int $pk primary key
	 * @param       boolean $reset reset data
	 * @return      boolean
	 * @see JTable:load
	 */
	public function load($pk = null, $reset = true)
	{
		if (parent::load($pk, $reset))
		{
			// Convert the params field to a registry.
			$params = new JRegistry;
                       // loadJSON is @deprecated    12.1  Use loadString passing JSON as the format instead.
                       // $params->loadString($this->item->params, 'JSON');
                       // "item" should not be present.
                       $params->loadJSON($this->params);

			$this->params = $params;
			return true;
		}
		else
		{
			return false;
		}
	}
}
components/com_icagenda/tables/customfield.php000060400000014075152453623450015637 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-12-03
 * @since		3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * Custom Field Table class
 */
class iCagendaTablecustomfield extends JTable
{
	/**
	 * Constructor
	 *
	 * @param	JDatabase A database connector object
	 * @since	3.4.0
	 */
	public function __construct(&$_db)
	{
		parent::__construct('#__icagenda_customfields', 'id', $_db);
	}

	/**
	 * Overloaded bind function.
	 *
	 * @param	array		Named array
	 * @return	null|string	null is operation was satisfactory, otherwise returns an error
	 * @see		JTable:bind
	 * @since	3.4.0
	 */
	public function bind($array, $ignore = '')
	{
		// Set Creator infos
		$user = JFactory::getUser();
		$userId	= $user->get('id');

		if ($array['created_by']=='0')
		{
			$array['created_by'] = (int)$userId;
		}

		// Set Params
		if (isset($array['params']) && is_array($array['params']))
		{
			$registry = new JRegistry();
			$registry->loadArray($array['params']);
			$array['params'] = (string)$registry;
		}

		return parent::bind($array, $ignore);
	}

    /**
    * Overloaded check function
	* @since	3.4.0
    */
    public function check()
    {
		// Import Joomla 2.5
		jimport( 'joomla.filter.output' );

		// If there is an ordering column and this is a new row then get the next ordering value
		if (property_exists($this, 'ordering')
			&& $this->id == 0)
		{
			$this->ordering = self::getNextOrder();
		}

		// URL alias
		if (empty($this->alias))
		{
			$this->alias = $this->title;
		}

		$this->alias = JFilterOutput::stringURLSafe($this->alias);

		// Alias is not generated if non-latin characters, so we fix it by using created date, or title if unicode is activated, as alias
		if ($this->alias == null || empty($this->alias))
		{
			if (JFactory::getConfig()->get('unicodeslugs') == 1)
			{
				$this->alias = JFilterOutput::stringURLUnicodeSlug($this->title);
			}
			else
			{
				$this->alias = JFilterOutput::stringURLSafe($this->created);
			}
		}

		// Slug auto-create
		$slug_empty = empty($this->slug) ? true : false;

		if ($slug_empty)
		{
			$this->slug = $this->title;
		}
		$this->slug = iCFilterOutput::stringToSlug($this->slug);

		// Slug is not generated if non-latin characters, so we fix it by using created date as a slug
		if ($this->slug == null)
		{
			$this->slug = iCFilterOutput::stringToSlug($this->created);
		}

		// Check if Slug already exists
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('slug')
			->from($db->qn('#__icagenda_customfields'))
			->where($db->qn('slug') . ' = ' . $db->q($this->slug));

		if (!empty($this->id))
		{
			$query->where('id <> ' . (int) $this->id);
		}

		$db->setQuery($query);
		$slug_exists = $db->loadResult();

		if ($slug_exists)
		{
			$error_slug = $slug_empty
						? JText::sprintf('COM_ICAGENDA_CUSTOMFIELD_DATABASE_ERROR_AUTO_SLUG',
										'<strong>' . $this->title . '</strong>', '<strong>' . $this->slug . '</strong>')
						: '<strong>' . JText::_('COM_ICAGENDA_CUSTOMFIELD_DATABASE_ERROR_UNIQUE_SLUG') . '</strong>';

			$this->setError($error_slug . '<br /><br /><span class="iCicon-info-circle"></span> <i>'
							. JTEXT::_('COM_ICAGENDA_CUSTOMFIELD_SLUG_DESC').'</i>');

			return false;
		}

		return parent::check();
	}


    /**
     * 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		An optional array of primary key values to update.  If not
     *						set the instance property value is used.
     * @param	integer		The publishing state. eg. [0 = unpublished, 1 = published]
     * @param	integer		The user id of the user performing the operation.
     * @return	boolean		True on success.
	 * @since	3.4.0
     */
	public function publish($pks = null, $state = 1, $userId = 0)
	{
		// Initialise variables.
		$k = $this->_tbl_key;

		// Sanitize input.
		JArrayHelper::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->_tbl.'`' .
			' SET `state` = '.(int) $state .
			' WHERE ('.$where.')' .
			$checkin
		);
		$this->_db->query();

		// Check for a database error.
		if ($this->_db->getErrorNum())
		{
			$this->setError($this->_db->getErrorMsg());
			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;
	}
}
components/com_icagenda/tables/registration.php000060400000010001152453623450016014 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.6 2015-06-27
 * @since       3.3.3
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * category Table class
 */
class iCagendaTableregistration extends JTable
{
	/**
	 * Constructor
	 *
	 * @param JDatabase A database connector object
	 */
	public function __construct(&$_db)
	{
		parent::__construct('#__icagenda_registration', 'id', $_db);
	}

	/**
	 * Overloaded bind function to pre-process the params.
	 *
	 * @param	array		Named array
	 * @return	null|string	null is operation was satisfactory, otherwise returns an error
	 * @see		JTable:bind
	 * @since	3.3.3
	 */
	public function bind($array, $ignore = '')
	{
		if ($array['date'] == 'update')
		{
			$array['date'] = '';
		}

		return parent::bind($array, $ignore);
	}

    /**
    * Overloaded check function
    */
    public function check()
    {
		// If there is an ordering column and this is a new row then get the next ordering value
		if (property_exists($this, 'ordering') && $this->id == 0)
		{
			$this->ordering = self::getNextOrder();
		}

		return parent::check();
    }


    /**
     * 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    An optional array of primary key values to update.  If not
     *                    set the instance property value is used.
     * @param    integer The publishing state. eg. [0 = unpublished, 1 = published]
     * @param    integer The user id of the user performing the operation.
     * @return    boolean    True on success.
	 * @since	3.3.3
     */
	public function publish($pks = null, $state = 1, $userId = 0)
	{
		// Initialise variables.
		$k = $this->_tbl_key;

		// Sanitize input.
		JArrayHelper::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->_tbl.'`' .
			' SET `state` = '.(int) $state .
			' WHERE ('.$where.')' .
			$checkin
		);
		$this->_db->query();

        // Check for a database error.
        if ($this->_db->getErrorNum())
        {
			$this->setError($this->_db->getErrorMsg());

			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;
	}
}
components/com_icagenda/tables/feature.php000060400000013566152453623450014760 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      doorknob
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-12-05
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * feature Table class
 */
class iCagendaTablefeature extends JTable
{
	protected $new_icon = null;

	/**
	 * Constructor
	 *
	 * @param JDatabase A database connector object
	 * @since	3.4.0
	 */
	public function __construct(&$_db)
	{
		parent::__construct('#__icagenda_feature', 'id', $_db);
	}

	/**
	 * Overloaded bind function to pre-process the params.
	 *
	 * @param	array		Named array
	 * @return	null|string	null is operation was satisfactory, otherwise returns an error
	 * @see		JTable:bind
	 * @since	3.4.0
	 */
	public function bind($array, $ignore = '')
	{
		if (isset($array['new_icon']))
		{
			// Get media path
			$params_media	= JComponentHelper::getParams('com_media');
			$image_path		= $params_media->get('image_path', 'images');

			// Paths to feature icons folder
			$thumbsPath		= $image_path . '/icagenda/feature_icons';

			// Get Image File Infos
			$link_image		= $array['new_icon'];
			$decomposition	= explode( '/' , $link_image );

			// in each parent
			$i = 0;

			while ( isset($decomposition[$i]) )
				$i++;
			$i--;

			$imgname		= $decomposition[$i];
			$fichier		= explode( '.', $decomposition[$i] );
			$imgtitle		= $fichier[0];
			$imgextension	= strtolower($fichier[1]);

			// Check file type if authorized to be generated as feature icon
			$authorized_types = array('jpg', 'jpeg', 'png', 'gif');

			if (!in_array($imgextension, $authorized_types) && $imgextension)
			{
				$this->setError('<strong>' . JText::_('COM_ICAGENDA_NOT_AUTHORIZED_IMAGE_TYPE') . '</strong><br />'
								. JText::_('COM_ICAGENDA_FORM_FEATURE_MIMETYPE_ERROR'));

				return false;
			}
			elseif ($imgextension)
			{
				// Clean icon name
				jimport( 'joomla.filter.output' );
				$icon_name = JFilterOutput::stringURLSafe($imgtitle) . '.' . $imgextension;

				// Generate 16_bit if not exist
				iCThumbGet::thumbnail($array['new_icon'], $thumbsPath, '16_bit', '16', '16', '100', false, '', '', '', $icon_name);

				// Generate 24_bit if not exist
				iCThumbGet::thumbnail($array['new_icon'], $thumbsPath, '24_bit', '24', '24', '100', false, '', '', '', $icon_name);

				// Generate 32_bit if not exist
				iCThumbGet::thumbnail($array['new_icon'], $thumbsPath, '32_bit', '32', '32', '100', false, '', '', '', $icon_name);

				// Generate 48_bit if not exist
				iCThumbGet::thumbnail($array['new_icon'], $thumbsPath, '48_bit', '48', '48', '100', false, '', '', '', $icon_name);

				// Generate 64_bit if not exist
				iCThumbGet::thumbnail($array['new_icon'], $thumbsPath, '64_bit', '64', '64', '100', false, '', '', '', $icon_name);

				$array['icon'] = $icon_name;
			}
		}

		return parent::bind($array, $ignore);
	}

	/**
	 * Overloaded check function
	 * @since	3.4.0
	*/
	public function check()
	{
		// If there is an ordering column and this is a new row then get the next ordering value
		if (property_exists($this, 'ordering') && $this->id == 0)
		{
			$this->ordering = self::getNextOrder();
		}

		return parent::check();
	}

	/**
	 * 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    An optional array of primary key values to update.  If not
	 *                    set the instance property value is used.
	 * @param	integer The publishing state. eg. [0 = unpublished, 1 = published]
	 * @param	integer The user id of the user performing the operation.
	 * @return	boolean    True on success.
	 * @since	3.4.0
	 */
	public function publish($pks = null, $state = 1, $userId = 0)
	{
		// Initialise variables.
		$k = $this->_tbl_key;

		// Sanitize input.
		JArrayHelper::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->_tbl.'`' .
			' SET `state` = '.(int) $state .
			' WHERE ('.$where.')' .
			$checkin
		);
		$this->_db->query();

		// Check for a database error.
		if ($this->_db->getErrorNum())
		{
			$this->setError($this->_db->getErrorMsg());

			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;
	}
}
components/com_icagenda/tables/index.html000060400000000032152453623450014571 0ustar00<html><body></body></html>components/com_icagenda/CHANGELOG.php000060400000436351152453623450013343 0ustar00<?php defined('_JEXEC') or die(); ?>

<div style="text-align:center"><img src='../media/com_icagenda/images/iconicagenda48.png' alt='iCagenda' /><br/><big style="color:#555">ChangeLog</big></div>
================================================================================
? <center><strong><big>Welcome to iCagenda 3.5.12 release!</big></strong></center><br />This is a maintenance release. See the release notes for details.<br />We recommend every user to update, to keep your iCagenda updated.<br />
================================================================================
: <span class="ic-box-important ic-box-12">!</span><span class="ic-important">important</span>&nbsp;<span class="ic-box-added ic-box-12">+</span><span class="ic-added">added</span>&nbsp;<span class="ic-box-removed ic-box-12">-</span><span class="ic-removed">removed</span>&nbsp;<span class="ic-box-changed ic-box-12">~</span><span class="ic-changed">changed</span>&nbsp;<span class="ic-box-fixed ic-box-12">#</span><span class="ic-fixed">fixed</span><br/><i>Info: access to the beta versions and pre-releases are reserved to users with a valid pro subscription.</i><br/>iCagenda™ is distributed under the terms of the GNU General Public License version 3 or later; see LICENSE.txt.
================================================================================


iCagenda 3.5.12 <small style="font-weight:normal;">(2015.10.12)</small>
================================================================================
+ Added : option field 'Time display' in 'Submit an event' form.
+ Added : global option to Select if 'Time Display' option is set by default on 'Show' or 'hide' when creating a new event ('General Settings' tab of the Global Options of the component).
+ Added : missing separator option in global options for date format.
+ [MODULE iC calendar] Added : option to set custom limit for auto-intro description.
+ [MODULE iC Event List][PRO] Added : option to set HTML filtering for auto-intro description.
~ Changed : use global date format option in registrations list, and display start and end date when registration for a period.
# [MODULE iC calendar][LOW] Fixed : display of "booking closed" when events only singles dates, and all upcoming, but registration type option for this event is set to "for all dates of the event".
# [MODULE iC calendar][LOW] Fixed : in "auto" mode for option "Link to Menu Item", the global option for filter by dates was not defined, if not on a list of events page ("auto" not working properly in this case, in a few cases, depending of your settings, if one at least of the menu item(s) to a list of events was set to use global options for Filter by dates).
# [MODULE iC calendar][LOW] Fixed : option for filtering HTML tags of intro-text not working in tooltip if not on list of events page.
# [LOW] Fixed : not displaying full address if country and/or city included in the place name.
# [LOW] Fixed : display of long content in registrations admin list (overlap in data display).

* Changed files in 3.5.12
~ admin/config.xml
~ admin/models/event.php
~ admin/models/forms/event.xml
~ admin/models/registrations.php
~ admin/utilities/events/events.php
~ admin/utilities/menus/menus.php
~ admin/views/registrations/tmpl/default.php
~ [MODULE][PRO] modules/mod_ic_event_list/helper.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.xml
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/default.php
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/icrounded.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.xml
~ script.icagenda.php
~ site/add/elements/icsetvar.php
~ site/helpers/icmodel.php
~ site/models/forms/submit.xml
~ site/views/submit/tmpl/default.php
~ site/views/submit/tmpl/default.xml
~ site/views/submit/view.html.php


iCagenda 3.5.11 <small style="font-weight:normal;">(2015.09.05)</small>
================================================================================
# [LOW] Fixed : date format with short month broken (in 3.5.10).
# [LOW] Fixed : date format with separator broken (since 3.5.6).
# [MODULE iC calendar][LOW] Fixed : display of current month, whereas option 'Loading on Date' is set on a day of the previous month.

* Changed files in 3.5.11
~ [LIBRARY] libraries/ic_library/globalize/culture/en-GB.php
~ [LIBRARY] libraries/ic_library/globalize/culture/en-US.php
~ [LIBRARY] libraries/ic_library/globalize/culture/fa-IR.php
~ [LIBRARY] libraries/ic_library/globalize/globalize.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.php
~ site/helpers/ichelper.php
~ site/helpers/icmodel.php


iCagenda 3.5.10 <small style="font-weight:normal;">(2015.09.01)</small>
================================================================================
+ Added : Compatible with Jalali/Persian calendar in admin (use of Joomla calendar for datetime picker).
+ Added : missing field to select 'Registration type' in the 'Submit an event' form, if registration options displayed.
+ Added : function to disable the submit button in frontend forms, after first click (to prevent multiple clicks during data process).
~ Changed : Asynchronous Loading of the AddThis widget script
~ Changed : auto-detect if https/ssl server for loading the AddThis widget script.
~ [MODULE iC calendar] Changed : you can now select one of the seven days of the week, as the first day of the calendar.
~ [THEME PACK] Changed : registration header is simplified, and use now its own css classes (ic-reg + suffix)
~ [THEME PACK] Changed : new ic-current-period class used to replace inline css when for the overline when period started and current (box date in list of events)
# [LOW] Fixed : a few issues with Jalali calendar in frontend (day 31 of a period not dislayed in calendar, possible datetime contruct error if no single dates in event details view).
# [LOW] Fixed : if only single dates with no period, and registration type option set to "for all dates of event", the date in registration email notifications was wrong.
# [LOW] Fixed : loading of event custom fields in registrations list if same id (missing parent_form control).
# [LOW] Fixed : date could include non-breaking space (&nbsp;) in notification email.
# [MODULE iC Event List][LOW] Fixed : display of month in the date box, on last day of a month (eg. 31 August) was next month, and not current month.

* Changed files in 3.5.10
~ admin/models/fields/modal/date.php
~ admin/models/fields/modal/enddate.php
~ admin/models/fields/modal/startdate.php
~ admin/tables/event.php
~ admin/utilities/customfields/customfields.php
~ admin/utilities/events/events.php
~ admin/utilities/form/form.php
~ admin/views/icagenda/tmpl/default.php
~ admin/views/registrations/tmpl/default.php
+ [LIBRARY] libraries/ic_library/globalize/convert.php
~ [LIBRARY] libraries/ic_library/globalize/globalize.php
+ [MEDIA] media/images/loader.gif
~ [MEDIA] media/js/icdates.js
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.xml
~ site/add/elements/icsetvar.php
~ site/helpers/icmodel.php
~ site/models/forms/submit.xml
~ site/models/submit.php
~ [THEME PACK] site/themes/packs/default/css/default_component.css
~ [THEME PACK] site/themes/packs/default/default_registration.php
~ [THEME PACK] site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ [THEME PACK] site/themes/packs/ic_rounded/ic_rounded_events.php
~ [THEME PACK] site/themes/packs/ic_rounded/ic_rounded_registration.php
~ site/views/list/tmpl/registration.php
~ site/views/submit/tmpl/default.php


iCagenda 3.5.9 <small style="font-weight:normal;">(2015.08.01)</small>
================================================================================
! Added options for export in csv of a list of registrations (select info to be exported, and select between comma or semicolon as separator for values)
! You can now send a newsletter for all users registered for an event (all dates), or only for users registered to only one date (or period) of the event.
~ Changed : dropdowns for event and date in registration form, as well as for newsletter now use ajax for updating the date depending of the selected event, without reloading the page.
~ Changed : set 'All Events' as default value for 'Filter by Dates' global option (on new install).
~ [THEME PACK] Changed : ic_rounded module calendar css for table, by addition of class ic-table (minor change to prevent some possible css conflict with site template).
~ Changed : minimum joomla 3 release is now 3.2.3 (for websites using iCagenda on Joomla 3).
# [MEDIUM] Fixed : when trying to change state of a registration (broken since 3.5.7) the event state was sometimes changed in the same time (but not removed from database). Sorry for any inconvenience.
# [LOW] Fixed : change state not working in admin registrations list (not possible to trash or unpublished a registration entry).
# [LOW] Fixed : lost of changes if changing event in registration admin edition (fixed by using ajax to generate the date list).
# [MODULES][LOW] Fixed : 'Filter by dates' could be broken for modules, if set in all menus to 'Use Global', and set to 'All Events' in global options.
# [MODULE iC Event List][LOW] Fixed : notice error if no events to be displayed (undefined variable).

* Changed files in 3.5.9
~ admin/config.xml
~ admin/controllers/mail.php
~ admin/controllers/registration.php
~ admin/controllers/registrations.php
~ admin/controllers/registrations.raw.php
~ admin/models/fields/modal/evt.php
~ admin/models/fields/modal/evt_date.php
- admin/models/fields/modal/mailinglist.php
~ admin/models/forms/download.xml
~ admin/models/forms/mail.xml
~ admin/models/forms/registration.xml
~ admin/models/mail.php
~ admin/models/registration.php
~ admin/models/registrations.php
- admin/tables/mail.php
~ admin/tables/registration.php
+ admin/utilities/ajax/ajax.php
~ admin/utilities/events/events.php
~ admin/utilities/menus/menus.php
~ admin/views/mail/tmpl/edit.php
~ admin/views/mail/view.html.php
~ admin/views/registration/tmpl/edit.php
~ admin/views/registrations/tmpl/default.php
~ admin/views/registrations/view.html.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ script.icagenda.php
~ [THEME PACK] site/themes/packs/ic_rounded/css/ic_rounded_module.css


iCagenda 3.5.8 <small style="font-weight:normal;">(2015.07.17)</small>
================================================================================
# [MODULE iC Calendar][LOW] Fixed : no events displayed in the calendar if menus option 'Filter by dates' is set to 'Use Global' (Sorry for any inconvenience).

* Changed files in 3.5.8
~ admin/utilities/menus/menus.php


iCagenda 3.5.7 <small style="font-weight:normal;">(2015.07.16)</small>
================================================================================
+ Added : publishing info for registrations; Created date/by (null if registration processed before update to 3.5.7 or later) and Modified date/by.
+ [MODULES] Added: alert message with number of events not displayed, when a user with admin permissions is logged-in in frontend (see current fix in modules for events with no menu link to allow the display.).
~ Changed : end time for single dates is now assumed to be midnight, when filtering today's events.
~ [THEME PACK] Changed : remove inline css used before to display Terms of Service, and use new names for the css classes.
# [MODULES][LOW] Fixed : no display of events if no menu link allows the display.
# [MODULE iC Calendar][LOW] Fixed : possible script conflict if joomla timezone or server timezone selected (highlightToday issue).
# [MODULE iC Calendar][LOW] Fixed : no display of December events.
# [LOW] Fixed : filtering of space for dates in notification emails if mail received in plain text.
# [LOW] Fixed : possible notice 'Undefined variable: dateglobalize_#' in backend, related to date format option (depends on your admin language).
# [LOW] Fixed : wrong place of a closing div in list of events (3.5.6).
# [LOW] Fixed : edit own access for registrations (user with only edit own access permissions, will see only its own registrations in the list).
# [LOW] Fixed : JS notice empty value if Terms of Services not displayed in registration form.

* Changed files in 3.5.7
~ admin/controllers/registration.php
~ admin/controllers/registrations.php
~ admin/models/fields/iclist/globalization.php
~ admin/models/forms/customfield.xml
~ admin/models/forms/event.xml
~ admin/models/forms/registration.xml
~ admin/models/registration.php
~ admin/models/registrations.php
~ admin/sql/install/mysql/icagenda.install.sql
~ admin/utilities/events/data.php
~ admin/utilities/events/events.php
~ admin/utilities/form/form.php
~ admin/utilities/menus/menus.php
~ admin/views/event/tmpl/edit.php
~ admin/views/registration/tmpl/edit.php
~ admin/views/registrations/tmpl/default.php
~ [LIBRARY] libraries/ic_library/globalize/globalize.php
~ [MODULE][PRO] modules/mod_ic_event_list/css/default_style.css
~ [MODULE][PRO] modules/mod_ic_event_list/css/icrounded_style.css
~ [MODULE][PRO] modules/mod_ic_event_list/helper.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.php
~ site/helpers/icmodel.php
~ site/models/events.php
~ site/models/submit.php
~ [THEME PACK] site/themes/packs/default/css/default_component.css
~ [THEME PACK] site/themes/packs/default/css/default_module.css
~ [THEME PACK] site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ [THEME PACK] site/themes/packs/ic_rounded/css/ic_rounded_module.css
~ site/views/list/tmpl/default.php
~ site/views/list/tmpl/registration.php
~ site/views/submit/tmpl/default.php


iCagenda 3.5.6 <small style="font-weight:normal;">(2015.06.29)</small>
================================================================================
+ Added : Compatible with Jalali/Persian calendar in frontend.
~ Changed : Update of Info page (addition of credits: languages and external libraries).
~ Changed : Improvement of add to cal function for a better export to external calendars.
~ Changed : Improvement of valid dates control in frontend submit an event form.
~ Changed : migration of globalize date format function to the iC Library, and improvement.
# [MEDIUM] Fixed : delete custom fields data of an event if this one is deleted.
# [LOW] Fixed : add to cal issue when hide time selected.
# [LOW] Fixed : date/dates display in event details depending of number of dates for a period.
# [LOW] Fixed : registration button was not active when event with a past period, but upcoming single dates.
# [LOW] Fixed : line return in Notes field, when exporting list of registrations to csv.
# [LOW] Fixed : confirmed email field (registration form) was not removed from the session.
# [LOW] Fixed : no display of a few dates in today's events filtering (when period with weekdays, and event running).

* Changed files in 3.5.6
~ admin/add/ renamed admin/assets/
+ admin/assets/jcms/info.php
~ admin/config.xml
~ admin/controller.php
- [FOLDER] admin/globalization/
~ admin/icagenda.php
~ admin/models/event.php
~ admin/models/events.php
~ admin/models/fields/iclist/globalization.php
~ admin/models/fields/modal/date.php
~ admin/models/fields/modal/evt_date.php
~ admin/models/forms/event.xml
~ admin/models/registration.php
~ admin/models/registrations.php
~ admin/sql/install/mysql/icagenda.install.sql
~ admin/tables/registration.php
~ admin/utilities/customfields/customfields.php
~ admin/utilities/events/data.php
~ admin/utilities/events/events.php
+ admin/utilities/info/info.php
~ admin/views/category/tmpl/edit.php
~ admin/views/customfield/tmpl/edit.php
~ admin/views/event/tmpl/edit.php
~ admin/views/event/view.html.php
~ admin/views/events/tmpl/default.php
~ admin/views/events/view.html.php
~ admin/views/feature/tmpl/edit.php
~ admin/views/icagenda/tmpl/default.php
~ admin/views/icagenda/view.html.php
~ admin/views/info/tmpl/default.php
~ admin/views/info/view.html.php
~ admin/views/mail/tmpl/edit.php
~ admin/views/registration/tmpl/edit.php
~ admin/views/registration/view.html.php
~ admin/views/registrations/view.html.php
~ admin/views/themes/tmpl/default.php
~ icagenda.xml
~ [LIBRARY] libraries/ic_library/date/date.php
+ [LIBRARY][FOLDER] libraries/ic_library/globalize/
+ [LIBRARY] libraries/ic_library/globalize/culture/fa-IR.php
+ [LIBRARY] libraries/ic_library/globalize/globalize.php
~ [LIBRARY] libraries/ic_library/lib_ic_library.xml
~ [LIBRARY] libraries/ic_library/library/library.php
~ [LIBRARY] libraries/ic_library/string/string.php
~ [MEDIA] media/css/icagenda-back.css
~ [MEDIA] media/css/icagenda-front.css
~ [MEDIA] media/css/icagenda-front.j25.css
~ [MEDIA] media/js/icdates.js
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.xml
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.xml
~ script.icagenda.php
~ site/helpers/ichelper.php
~ site/helpers/icmodel.php
~ site/models/events.php
~ site/models/forms/submit.xml
~ site/models/list.php
~ site/models/submit.php
~ [THEME PACK] site/themes/packs/default/css/default_component.css
~ [THEME PACK] site/themes/packs/default/css/default_module.css
~ [THEME PACK] site/themes/packs/default/default_calendar.php
~ [THEME PACK] site/themes/packs/default/default_day.php
~ [THEME PACK] site/themes/packs/default/default_event.php
~ [THEME PACK] site/themes/packs/default/default_events.php
~ [THEME PACK] site/themes/packs/default/default_registration.php
~ [THEME PACK] site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ [THEME PACK] site/themes/packs/ic_rounded/css/ic_rounded_module.css
~ [THEME PACK] site/themes/packs/ic_rounded/ic_rounded_calendar.php
~ [THEME PACK] site/themes/packs/ic_rounded/ic_rounded_day.php
~ [THEME PACK] site/themes/packs/ic_rounded/ic_rounded_event.php
~ [THEME PACK] site/themes/packs/ic_rounded/ic_rounded_events.php
~ [THEME PACK] site/themes/packs/ic_rounded/ic_rounded_registration.php
~ site/views/list/tmpl/actions.php
~ site/views/list/tmpl/default.php
~ site/views/list/tmpl/default.xml
~ site/views/list/tmpl/default_vcal.php
~ site/views/list/tmpl/event.php
~ site/views/list/tmpl/registration.php
~ site/views/list/view.html.php
~ site/views/submit/tmpl/default.php
~ site/views/submit/tmpl/default.xml
~ site/views/submit/tmpl/send.php
~ site/views/submit/view.html.php


iCagenda 3.5.5 <small style="font-weight:normal;">(2015.04.27)</small>
================================================================================
~ Changed : removal of v1 and v2 release notes (link to online change log for these versions).
# [MEDIUM] Fixed : issue with admin event edition on IE (script error only on Internet Explorer).
# [LOW] Fixed : wrong file jquery.tipTip.js was included in 3.5.4. This version includes the correct new one with tooltip position fix (as announced in previous release).

* Changed files in 3.5.5
~ admin/CHANGELOG.php
~ [MEDIA] media/js/icdates.js
~ [MEDIA] media/js/jquery.tipTip.js


iCagenda 3.5.4 <small style="font-weight:normal;">(2015.04.24)</small>
================================================================================
! JComments ready : You can download the free iC JComments plugin to enable comments on events (http://icagenda.joomlic.com/resources/addons).
+ [GLOBALIZATION] Added : fa-IR Persan (Iran) date formats.
+ Added : global option to set text transformation of the event title (Global Options > General Settings tab).
+ Added : check image name in frontend 'Submit an Event form', and if file extension is missing, add the correct one.
~ Changed : location of css and js core files (removed from admin and site folder, and moved to media).
~ Changed : improve datetime picker validation (no need to click on validate button to be sure date entered is saved).
# [MEDIUM] Fixed : missing 404 error page, when SEF is enabled, and event alias in url doesn't exist (was returning the first event found).
# [MEDIUM] Fixed : Persan language issue, fixed date construct fatal error.
# [LOW] Fixed : possible iCtip position issue (add to cal, print... tooltip) if another script is changing window top offset().
# [LOW] Fixed : broken url to event details view in registration form header.
# [LOW] Fixed : broken approval icon function in admin list of events.
# [LOW] Fixed : special characters in breadcrumbs.
# [LOW] Fixed : Nb of registered user, if only one single date, and registration type is changed after a few registrations occured.

* Changed files in 3.5.4
- [FOLDER] admin/add/css/
~ admin/add/elements/desc.php
~ admin/add/elements/title.php
+ admin/add/elements/titleheader.php
~ admin/add/elements/titleimg.php
- [FOLDER] admin/add/image/
~ admin/config.xml
+ admin/globalization/fa-IR.php
~ admin/models/event.php
~ admin/models/forms/event.xml
~ admin/tables/feature.php
~ admin/utilities/customfields/customfields.php
~ admin/utilities/events/data.php
~ admin/utilities/events/events.php
~ admin/utilities/form/form.php
~ admin/views/categories/view.html.php
~ admin/views/category/tmpl/edit.php
~ admin/views/customfield/tmpl/edit.php
~ admin/views/customfields/view.html.php
~ admin/views/event/tmpl/edit.php
~ admin/views/events/tmpl/default.php
~ admin/views/events/view.html.php
~ admin/views/feature/tmpl/edit.php
~ admin/views/feature/view.html.php
~ admin/views/features/view.html.php
~ admin/views/icagenda/tmpl/default.php
~ admin/views/icagenda/view.html.php
~ admin/views/info/tmpl/default.php
~ admin/views/info/view.html.php
~ admin/views/mail/view.html.php
~ admin/views/registration/tmpl/edit.php
~ admin/views/registrations/view.html.php
~ admin/views/themes/tmpl/default.php
~ icagenda.xml
~ [LIBRARY] libraries/ic_library/date/period.php
~ [LIBRARY] libraries/ic_library/thumb/get.php
~ [MEDIA] media/css/icagenda-back.css
+ [MEDIA] media/css/icagenda-back.j25.css
~ [MEDIA] media/css/icagenda-front.css
+ [MEDIA] media/css/icagenda-front.j25.css
~ [MEDIA] media/css/icagenda.css
+ [MEDIA][FOLDER] media/css/images/
+ [MEDIA] media/css/jquery-ui-1.8.17.custom.css
+ [MEDIA] media/css/template.j25.css
~ [MEDIA][ICICONS][UPDATE] media/icicons/
~ [MEDIA][IMAGES][UPDATE] media/images/
~ [MEDIA] media/js/icdates.js
+ [MEDIA] media/js/icmap-front.js
~ [MEDIA] media/js/jquery.tipTip.js
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.php
~ script.icagenda.pro.php
- [FOLDER] site/add/css/
~ site/add/elements/icsetvar.php
- [FOLDER] site/add/image/
~ site/controller.php
~ site/helpers/ichelper.php
~ site/helpers/icmodel.php
- [FOLDER] site/js/
~ site/models/forms/submit.xml
~ site/models/list.php
~ site/models/submit.php
~ site/router.php
~ [THEME PACK] site/themes/packs/default/css/default_component.css
~ [THEME PACK] site/themes/packs/default/default_events.php
~ [THEME PACK] site/themes/packs/default/default_registration.php
~ [THEME PACK] site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ [THEME PACK] site/themes/packs/ic_rounded/ic_rounded_events.php
~ [THEME PACK] site/themes/packs/ic_rounded/ic_rounded_registration.php
+ site/views/list/tmpl/actions.php
~ site/views/list/tmpl/default.php
~ site/views/list/tmpl/default_categories.php
~ site/views/list/tmpl/event.php
~ site/views/list/tmpl/registration.php
~ site/views/list/view.html.php
~ site/views/submit/tmpl/default.php
~ site/views/submit/tmpl/send.php
~ site/views/submit/view.html.php


iCagenda 3.5.3 <small style="font-weight:normal;">(2015.03.25)</small>
================================================================================
+ Added : Confirm Email field in frontend Registration form, for not logged-in user.
+ Added : BOM utf-8 to csv export file (special characters).
~ Changed : improvement of the model for admin event edition.
~ Changed : postal code is now displayed (if available) in frontend address field.
# [MEDIUM] Fixed : saving of custom fields and features when new event (with not yet an ID) was broken (no data saved).
# [THEME PACKS][LOW] Fixed : display of empty participants list when registration not enabled.
# [LOW] Fixed : display of information details in event details view, was not always displayed depending of options and data filled.
# [LOW] Fixed : register button when only a single date, and the list display type is not set to display all dates.
# [LOW] Fixed : added back the alert message on Joomla 2.5 about the impossibility of trashing frontend submitted events if not edited (the issue with trash and empty asset_id is fixed in latest version of Joomla 3).

* Changed files in 3.5.3
~ admin/config.xml
~ admin/models/event.php
~ admin/models/fields/modal/ictext_placeholder.php
~ admin/models/forms/event.xml
~ admin/models/registrations.php
~ admin/tables/event.php
~ admin/utilities/events/data.php
~ admin/views/events/tmpl/default.php
~ admin/views/registrations/view.raw.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ site/add/elements/icsetvar.php
~ site/helpers/ichelper.php
~ site/helpers/icmodel.php
~ site/models/list.php
~ [THEME PACKS] site/themes/packs/default/default_event.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_event.php
~ site/views/list/tmpl/event.php
~ site/views/list/tmpl/registration.php
~ site/views/list/view.html.php


iCagenda 3.5.2 <small style="font-weight:normal;">(2015.03.13)</small>
================================================================================
~ Changed : name/username allows now numeric characters (server-side iCagenda validator), and addition of joomla client-side username validation.
~ Changed : minor re-ordering of period options in admin edition of an event, with info text for weekdays.
# [MEDIUM] Fixed : function to generate small icons in Features was broken.
# [LOW] Fixed : Custom fields data broken in csv export of registrations.
# [LOW] Fixed : Number of registered users, for events over a period with no weekdays selected.
# [LOW] Fixed : List of participants was broken if 'Avatar' and/or 'Username' list display option was selected (option 'Full' was working as expected).
# [LOW] Fixed : Url to event details view could return a wrong number of registered user if a period with no weekdays selected (component list of events).
# [LOW] Fixed : notice error when php function dateInterval does not exist on your server.
# [LOW] Fixed : improvement of the function to get the current layout.
# [LOW] Fixed : a few date format buggy depending of your settings, and the current language used.
# [LOW] Fixed : notice error $translator not defined in control panel (language issue) only on free version.
# [LOW] Fixed : filters display issue in registration admin list on Joomla 2.5 when event title length too high.
# [MODULE iC Event List][LOW] Fixed : blur x-small thumbs when created in admin.

* Changed files in 3.5.2
~ admin/add/css/icagenda.j25.css
~ admin/models/fields/modal/thumbs.php
~ admin/models/forms/event.xml
~ admin/models/registrations.php
~ admin/tables/feature.php
~ admin/views/event/tmpl/edit.php
~ admin/views/events/tmpl/default.php
~ admin/views/icagenda/tmpl/default.php
~ admin/views/registrations/tmpl/default.php
~ [LIBRARY] libraries/ic_library/date/period.php
~ [LIBRARY] libraries/ic_library/thumb/get.php
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/icrounded.php
~ site/add/elements/icsetvar.php
~ site/helpers/ichelper.php
~ site/helpers/icmodel.php
~ site/models/forms/submit.xml
~ site/models/list.php
~ [THEME PACKS] site/themes/packs/default/css/default_component.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ site/views/list/tmpl/registration.php
~ site/views/list/view.html.php
~ site/views/submit/tmpl/default.php
~ site/views/submit/view.html.php


iCagenda 3.5.1 <small style="font-weight:normal;">(2015.03.01)</small>
================================================================================
~ [MODULE iC calendar] Cleaned : not needed data attributs in arrows navigation.
# [MEDIUM] Fixed : no display of events if access registered, and user logged-in is not a Super User.
# [LOW] Fixed : possible issue with Joomla 3.4.0 (not saving event due to a script conflict), if admin module 'Multilanguage status' published (change of the modal for this module, using now Bootstrap).
# [LOW] Fixed : minor error issue in script used in edit form (admin) for link option on register button.
# [LOW] Fixed : 'No tickets are available for this date' displayed if no registration done for an event.
# [LOW] Fixed : incorrect count of available and booked tickets when Registration Type is set to 'all dates of the period'.
# [LOW] Fixed : link to view event after registration, not linking to registered date event view.

* Changed files in 3.5.1
~ admin/models/event.php
~ admin/models/fields/modal/iclink_article.php
~ admin/models/fields/modal/iclink_type.php
~ admin/models/fields/modal/iclink_url.php
~ admin/utilities/events/data.php
~ admin/utilities/form/form.php
~ admin/views/event/tmpl/edit.php
~ admin/views/events/view.html.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ site/add/elements/icsetvar.php
~ site/helpers/icmodel.php
~ site/models/events.php
~ site/views/list/tmpl/registration.php


iCagenda 3.5.0 <small style="font-weight:normal;">(2015.02.25)</small>
================================================================================
! [EXPORT CSV][Registrations] : integration of CSV exportation for a list of registrations. Use the filter dropdowns to select state, event and/or date, and export the list of registered users by clicking on the 'Export' button in the toolbar.
! [Registrations] : the max number of tickets is now applied to each individual date of an event, if registration per date is selected.
! [MODULES] Added : event url goes directly to the date selected in the event details view.
! [FORMS] Improvement in Form Validation. By default, the form validation is process first client-side, using now the joomla core form-validate, and in second validation is server-side, processed by iCagenda. You have option both for the 'Registration' and 'Submit an Event' forms, to select default (2 controls) or only server-side form validation (the most advanced and secured one. The client-side validation adds a more user-friendly way which is faster for user (page not reloaded) to know when a field or more are invalid).
+ Added : Admin filter by registered date in registrations list.
+ Added : Admin filter by category in registrations list.
+ [RSS] Added : get current menu options to filter the RSS feeds (Filter by date, ordering...).
+ [MODULE iC calendar] Added : option to close automatically the tooltip on Mouseout.
+ [PLUGIN Search] Added : Search in shortdesc and metadesc text.
~ [MODULE iC calendar] Changed : improvement of the tool tip design, and addition of auto vertical scrolling inside tooltip.
~ [MODULE iC calendar] Changed : All mktime php function changed to be standardized with component refactory.
~ Many code improvements and minor bugs fixed.
# [MEDIUM] Fixed : Possible blank page in frontend, or very slow loading of iCagenda. The issue was not identified (seems to be related to php 5.4.37), but the new release 3.5.0 fixes this problem.
# [MEDIUM] Fixed : Slow loading in frontend, when using distant images, the parent image to generate thumbnails was always controlled, and should not if thumb already existed.
# [LOW] Fixed : W3C validation.
# [LOW] Fixed : issue in checking menu item if published (could return a 404 error page if menu item not published).
# [LOW] Fixed : missing displaytime checking in list of dates rendering (could not display an event over a period, with week days selected, if time not set).
# [LOW] Fixed : when only single dates filled in 'Submit an Event' form, the event was unpublished.
# [LOW] Fixed : "Notice: Undefined index:" if some fields are not filled when captcha solution was incorrect in registration form.
# [LOW] Fixed : issue if captcha plugin option is not set correctly, and set to be shown in form options.
# [LOW] Fixed : do not display event not approved in RSS feeds.
# [LOW] Fixed : no display of toolbar in list of events (admin) if no category created (display issue hiding page header).
# [LOW] Fixed : infotips in registration form not working on Joomla 2.5 (bug introduced in 3.4.1).
# [LOW][PRO MODULE iC Event List] Fixed : wrong date if period has a start date before today, and end date after today (was displaying tomorrow).
# [LOW][PRO MODULE iC Event List] Fixed : missing ic- prefix for columns classes in default layout, and rtl files.
# [SQL] Fixed : possible issue when update from an old version of iCagenda (before 3.2.14 and 3.2.0), with sql updating using the joomla core sql updates system.

* Changed files in 3.5.0
- admin/add/css/icmap.css
~ admin/config.xml
+ admin/controllers/registrations.raw.php
~ admin/globalization/en-GB.php
+ admin/models/download.php
~ admin/models/events.php
~ admin/models/fields/icmap/city.php
~ admin/models/fields/icmap/country.php
~ admin/models/fields/icmap/lat.php
~ admin/models/fields/icmap/lng.php
~ admin/models/fields/modal/date.php
~ admin/models/fields/modal/ictextarea_counter.php
~ admin/models/fields/modal/thumbs.php
+ admin/models/forms/download.xml
~ admin/models/forms/event.xml
~ admin/models/registrations.php
~ admin/sql/updates/3.2.0.sql
~ admin/sql/updates/3.2.14.sql
~ admin/sql/updates/3.2.sql
~ admin/utilities/customfields/customfields.php
+ admin/utilities/events/data.php
~ admin/utilities/events/events.php
~ admin/utilities/form/form.php
~ admin/utilities/menus/menus.php
~ admin/utilities/thumb/thumb.php
~ admin/views/categories/view.html.php
+ admin/views/download/tmpl/default.php
+ admin/views/download/view.html.php
~ admin/views/event/tmpl/edit.php
~ admin/views/event/view.html.php
~ admin/views/events/tmpl/default.php
~ admin/views/events/view.html.php
~ admin/views/registrations/tmpl/default.php
~ admin/views/registrations/view.html.php
+ admin/views/registrations/view.raw.php
~ [LIBRARY] libraries/ic_library/date/date.php
~ [LIBRARY] libraries/ic_library/thumb/create.php
~ [LIBRARY] libraries/ic_library/thumb/get.php
~ [MEDIA] media/css/icagenda-back.css
~ [MEDIA] media/css/icagenda-front.css
+ [MEDIA] media/css/icagenda.css
~ [MEDIA] media/icicons/style.css
~ [MEDIA] media/js/icdates.js
~ [MEDIA] media/js/icform.js
~ [MODULE][PRO] modules/mod_ic_event_list/css/default_style-rtl.css
~ [MODULE][PRO] modules/mod_ic_event_list/css/default_style.css
~ [MODULE][PRO] modules/mod_ic_event_list/css/icrounded_style-rtl.css
~ [MODULE][PRO] modules/mod_ic_event_list/css/icrounded_style.css
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/default.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.xml
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.xml
~ [PLUGIN] plugins/search/icagenda/icagenda.php
~ script.icagenda.php
- site/add/css/icmap.css
~ site/add/elements/icsetvar.php
~ site/helpers/ichelper.php
~ site/helpers/icmodel.php
~ site/models/events.php
~ site/models/forms/submit.xml
~ site/models/list.php
~ site/models/submit.php
~ [THEME PACKS] site/themes/packs/default/css/default_component.css
~ [THEME PACKS] site/themes/packs/default/css/default_component_xsmall.css
~ [THEME PACKS] site/themes/packs/default/css/default_module.css
~ [THEME PACKS] site/themes/packs/default/default_day.php
~ [THEME PACKS] site/themes/packs/default/default_event.php
~ [THEME PACKS] site/themes/packs/default/default_events.php
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component_xsmall.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module.css
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_day.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_event.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_events.php
~ site/views/list/tmpl/default.php
~ site/views/list/tmpl/default_categories.php
~ site/views/list/tmpl/event.php
~ site/views/list/tmpl/registration.php
~ site/views/submit/tmpl/default.php
~ site/views/submit/view.html.php

iCagenda 3.4.1 <small style="font-weight:normal;">(2015.01.30)</small>
================================================================================
! Changed : To fix an issue when using a custom captcha plugin (not joomla core reCaptcha plugin), the options has been changed. Now, there's only one place where you can set the captcha plugin used in iCagenda: 'General Settings' tab of the Global Options of the component. And you have individual option to show/hide captcha in 'Registration' and 'Submit an Event' forms. The update script will try to migrate your settings, but it's possible that you will have to set again this option in the menu options of 'Submit en Event' menu item type.
! Fixed : the 404 error page on multi-language site (when clicking on a module link).
+ Added : Get menu id and title of an event submitted in frontend (notification email, and filter in admin list of events).
+ Added : Options to show/hide period, weekdays and single dates in 'Submit an Event' form.
+ Added : Filter RSS feeds by category filter set in the menu options.
+ Added : Tooltip legends to pagination.
+ Added : Option to show/hide time in date box (list of events).
+ Added : Global Option to set access level to registration form.
+ [Plugin Search] Added : Next date added in search result (after title of the event).
~ Changed : You can now enter date before 1970/1/1 and after 2038/1/19 (no more unix limitation due to mktime php function, removed from date functions).
~ Changed : pageclass_sfx moved from id icagenda to a class (ic-list, ic-event, ic-registration, ic-submit, ic-send) to follow joomla standard.
~ Changed : Google Maps script checking (if api not loaded, iCagenda will load it).
~ Changed : Main list of events filter by date is improved (full recoding of the dates filtering functions).
~ Changed : The option 'list of all dates/only next/last date' is changed into 'Display All Dates' yes/no option.
~ [PRO MODULE iC Event List] Changed : ic- prefix added to section, group and col class names (to prevent class names CSS conflict).
~ Changed : Many code improvements.
# [MEDIUM] Fixed : 'auto' mode for menu link in modules was not well filtering language when joomla multi-language enabled. Improvement of the language detection for the menu items to retrieve the correct url.
# [LOW] Fixed : do not send user notification email after an event submission in frontend, if user has permissions to approve an event.
# [LOW] Fixed : no thumbnails were generated when '.' found in the image filename (eg. image.name.jpg).
# [LOW] Fixed : detects if an image file is too large, depending of server memory_limit setting, to prevent a blank page in admin when thumbnails cannot be generated (alert message displayed when a file is too large).
# [LOW] Fixed : filtering by category in events admin list was broken.
# [LOW] Fixed : Minor warning message in admin 'Themes manager' page (don't worry, nothing is broken!), 'Error loading component: COM_ICAGENDA, Component not found'.
# [LOW] Fixed : a few minor issue in admin list of events (date in current language, notice error $list var, ...).
# [LOW] Fixed : no display of events if category is unpublished.
# [LOW] Fixed : Keep in session Terms and Conditions checked, when reCaptcha is not correct.
# [LOW] Fixed : alias not generated when latin and non-latin characters in title (no datetime url safe alias, depending of unicode slug joomla global config setting).
# [LOW] Fixed : wrong display of menu option 'Features' on Joomla 2.5.
# [LOW] Fixed : if click on cancel on registration form, and when back to event details view, the back arrow was returning to registration form (now returns to parent list of events).

* Changed files in 3.4.1
~ admin/add/css/jquery-ui-1.8.17.custom.css
~ admin/config.xml
~ admin/globalization/uk-UA.php
~ admin/models/events.php
~ admin/models/fields/modal/cat.php
~ admin/models/fields/modal/date.php
~ admin/models/fields/modal/enddate.php
~ admin/models/fields/modal/ictextarea_counter.php
~ admin/models/fields/modal/startdate.php
~ admin/models/fields/modal/template.php
~ admin/models/forms/event.xml
~ admin/tables/event.php
~ admin/utilities/events/events.php
~ admin/utilities/form/form.php
~ admin/utilities/menus/menus.php
~ admin/views/event/tmpl/edit.php
~ admin/views/event/view.html.php
~ admin/views/events/tmpl/default.php
~ admin/views/events/view.html.php
~ admin/views/themes/tmpl/default.php
~ admin/views/themes/view.html.php
~ [LIBRARY] libraries/ic_library/date/date.php
~ [LIBRARY] libraries/ic_library/date/period.php
~ [LIBRARY] libraries/ic_library/thumb/create.php
~ [LIBRARY] libraries/ic_library/thumb/get.php
~ [MEDIA] media/css/icagenda-front.css
~ [MEDIA] media/js/icdates.js
~ [MODULE][PRO] modules/mod_ic_event_list/css/default_style.css
~ [MODULE][PRO] modules/mod_ic_event_list/css/icrounded_style.css
~ [MODULE][PRO] modules/mod_ic_event_list/helper.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.xml
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/default.php
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/icrounded.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ [PLUGIN] plugins/search/icagenda/icagenda.php
~ script.icagenda.php
~ site/add/css/jquery-ui-1.8.17.custom.css
~ site/helpers/ichelper.php
~ site/helpers/icmodel.php
~ site/models/events.php
+ site/models/forms/registration.xml
~ site/models/forms/submit.xml
~ site/models/list.php
~ site/models/submit.php
~ [THEME PACKS] site/themes/packs/default/css/default_component.css
~ [THEME PACKS] site/themes/packs/default/default_event.php
~ [THEME PACKS] site/themes/packs/default/default_events.php
~ [THEME PACKS] site/themes/packs/default/default_registration.php
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module.css
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_day.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_event.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_events.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_registration.php
~ site/views/list/tmpl/default.php
~ site/views/list/tmpl/default.xml
+ site/views/list/tmpl/default_categories.php
~ site/views/list/tmpl/default_vcal.php
~ site/views/list/tmpl/event.php
~ site/views/list/tmpl/registration.php
~ site/views/list/view.feed.php
~ site/views/list/view.html.php
~ site/views/submit/tmpl/default.php
~ site/views/submit/tmpl/default.xml
~ site/views/submit/tmpl/send.php
~ site/views/submit/view.html.php


iCagenda 3.4.0 <small style="font-weight:normal;">(2014.12.22)</small>
================================================================================
! New : Custom fields.
1 - Available in registration and event edition forms.
1 - Field types : text, list, radio buttons.
! New : Feature Icons.
1 - Create icons for each feature.
1 - Attribute one or more features individually for each event.
1 - Feature can be for example: Parking, Refreshments, Restaurant, Hotel, Free, TV, Toilets, Swimming, Airport... (no limit of usage!).
! New : Librairies
1 - iC Library : standalone library (loaded by a plugin).
1 - iCagenda Utilities : integrated library of iCagenda.
! New : Full Thumbnails generator
1 - Options for 4 predetermined sizes : large, medium, small, xsmall.
1 - For each thumbnail size, individual options : width, height, quality, crop.
! Improvement and new options:
1 - Captcha option added in 'Registration' and 'Submit an event' forms.
1 - RTL integration (component and modules)
1 - SQL requests improvement (faster process of database queries)
1 - Link to event details from modules and search plugin now detect the category filter setting from each menu items.
1 - Notification email to user who has submitted an event in frontend, with an Event Reference Number.
1 - ...
! Please check all release notes since 3.4.0-alpha1 to review all the changes and new options added since 3.3.8

* Release Notes 3.4.0
~ Changed : 'btn' class renamed in 'ic-btn' for frontend (mainly used for buttons).
~ Changed : a few css improvement (ic_rounded theme, liveupdate design...), and new classes added for a few core functions (date time display...).
# [LOW] Fixed : minor issues with 3.4.0-rc.

* Changed files in 3.4.0
~ admin/config.xml
~ admin/icagenda.php
~ admin/liveupdate/assets/liveupdate.css
~ admin/liveupdate/classes/abstractconfig.php
~ admin/liveupdate/classes/tmpl/nagscreen.php
~ admin/liveupdate/classes/tmpl/overview.php
~ admin/liveupdate/classes/updatefetch.php
~ admin/utilities/customfields/customfields.php
~ admin/utilities/events/events.php
+ admin/utilities/params/params.php
~ admin/views/icagenda/tmpl/default.php
~ admin/views/info/tmpl/default.php
~ [LIBRARY] libraries/ic_library/date/date.php
+ [LIBRARY] libraries/ic_library/date/period.php
~ [MEDIA] media/css/icagenda-front.css
+ [MEDIA] media/js/icagenda.js
~ [MODULE][PRO] modules/mod_ic_event_list/helper.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.php
~ [PLUGIN] plugins/system/ic_library/ic_library.php
~ script.icagenda.php
~ site/helpers/ichelper.php
~ site/helpers/icmodel.php
~ site/helpers/media_css.class.php
~ site/models/events.php
~ [THEME PACKS] site/themes/packs/default/css/default_component.css
~ [THEME PACKS] site/themes/packs/default/css/default_component_xsmall.css
~ [THEME PACKS] site/themes/packs/default/default_event.php
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component_medium.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component_small.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component_xsmall.css
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_event.php
~ site/views/list/tmpl/default.php
~ site/views/list/tmpl/event.php
~ site/views/list/tmpl/registration.php
~ site/views/list/view.html.php
~ site/views/submit/tmpl/default.php
~ site/views/submit/tmpl/send.php
~ site/views/submit/view.html.php


$ iCagenda 3.4.0-rc <small style="font-weight:normal;">(2014.12.14)</small>
================================================================================
! RTL integration (component and modules)
! SQL requests improvement (faster process of database queries)
! [MODULES & PLUGIN] Link to event details from modules and search plugin now detect the category filter setting from each menu items.
! Notification email to user who has submitted an event in frontend, with an Event Reference Number (of type YYYYMMDDID where YYYY is year, MM is month, DD is day and ID is event id).
+ Added : form fields saved to session to keep data after submission of the form if a wrong captcha value was entered.
+ Added : nofollow for 'registration' and 'submit an event' form links (to not been read by search engine).
+ Added : option to set ordering of categories in drop-down field.
+ Added : option to set a category as default in drop-down field.
~ Changed : auto-generation of alias improved.
~ Changed : default order of categories in drop-down field by title (previously by id).
# [LOW] Fixed : issue with single date before 1999-11-30.
# [LOW] Fixed : tooltip not working in 'Submit an Event' form on Joomla 3.3.6 (fixed since alpha-1).
# [LOW] Fixed : pixelated event image in details view, if original image is too small.
# [LOW] Fixed : notice error 'DS' in admin and frontend after Joomla upgrade from 2.5 to 3.3.
# [LOW] Fixed : text counter bug in frontend 'Submit an Event' form on IE11.

* Changed files in 3.4.0-rc
~ admin/config.xml
~ admin/icagenda.php
~ admin/models/category.php
~ admin/models/event.php
~ admin/models/events.php
~ admin/models/feature.php
~ admin/models/fields/icmap/city.php
~ admin/models/fields/icmap/country.php
~ admin/models/fields/icmap/lat.php
~ admin/models/fields/icmap/lng.php
~ admin/models/fields/modal/cat.php
~ admin/models/fields/modal/date.php
~ admin/models/fields/modal/iclink_type.php
~ admin/models/fields/modal/ictextarea_counter.php
~ admin/models/fields/modal/multicat.php
~ admin/models/forms/feature.xml
~ admin/tables/category.php
~ admin/tables/customfield.php
~ admin/tables/event.php
~ admin/tables/feature.php
~ admin/tables/registration.php
~ admin/utilities/customfields/customfields.php
~ admin/utilities/events/events.php
~ admin/utilities/form/form.php
+ admin/utilities/menus/menus.php
~ admin/utilities/thumb/thumb.php
~ libraries/ic_library/filter/output.php
~ libraries/ic_library/url/url.php
~ media/css/icagenda-front.css
~ media/js/icform.js
+ [MODULE][PRO] modules/mod_ic_event_list/css/default_style-rtl.css
~ [MODULE][PRO] modules/mod_ic_event_list/css/default_style.css
+ [MODULE][PRO] modules/mod_ic_event_list/css/icrounded_style-rtl.css
~ [MODULE][PRO] modules/mod_ic_event_list/css/icrounded_style.css
~ [MODULE][PRO] modules/mod_ic_event_list/helper.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.xml
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/default.php
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/icrounded.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.php
~ site/add/css/style.css
~ site/add/elements/icsetvar.php
~ site/helpers/ichelper.php
~ site/helpers/icmodel.php
~ site/icagenda.php
+ site/models/events.php
~ site/models/forms/submit.xml
~ site/models/list.php
~ site/models/submit.php
+ [THEME PACKS] site/themes/packs/default/css/default_component-rtl.css
~ [THEME PACKS] site/themes/packs/default/css/default_component.css
+ [THEME PACKS] site/themes/packs/default/css/default_module-rtl.css
~ [THEME PACKS] site/themes/packs/default/default_day.php
~ [THEME PACKS] site/themes/packs/default/default_registration.php
+ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component-rtl.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component.css
+ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module-rtl.css
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_day.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_event.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_events.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_registration.php
~ site/views/list/tmpl/default.php
~ site/views/list/tmpl/default.xml
~ site/views/list/tmpl/event.php
~ site/views/list/tmpl/registration.php
~ site/views/list/view.html.php
~ site/views/submit/tmpl/default.php
~ site/views/submit/tmpl/default.xml
~ site/views/submit/tmpl/send.php
~ site/views/submit/view.html.php


$ iCagenda 3.4.0-beta2 <small style="font-weight:normal;">(2014.11.09)</small>
================================================================================
+ Captcha option added in 'Registration' and 'Submit an event' forms. You can select the joomla captcha plugin that will be used in the form.
+ Added : Custom fields filled added in the registration notification emails.
+ Added : 3 tags in registration notification emails : [CUSTOMFIELDS] (list of custom fields), [DATE] (only date) and [TIME] (only time).
+ Added : Option to redirect after validation of the frontend 'Submit an Event' form (default, article or url).
+ Added : Option to set a characters limit for Title in List of Events.
+ Added : Option to create custom CSS stylesheets to add to the iCagenda styles or to override existing CSS styles and classes (Global Options).
+ [PRO MODULE iC Event List] Added : Options to set a header and/or footer custom text.
+ [MODULE iC Calendar] Added : Option to select the date on which the calendar will load (month and year).
+ [MODULE iC Calendar] Added : Option to show/hide Month and/or Year navigation.
~ Changed : display of "LiveUpdate" button only to user with component global options permissions.
~ [MODULE iC Calendar] Changed : navigation routing improved in calendar (now compatible with Advanced Module Manager by NoNumber).
~ [Theme Packs] Changed : load animated png is replaced by a animated gif (to prevent not working on not compatible browsers).
# [LOW] Fixed : 'view event' redirect link, after registration submission.
# [LOW] Fixed : nofollow for 'print' and 'add to cal' icons links.
# [LOW] Fixed : issue with custom field type 'list' if set to 'required'. Field was not checked properly if 'alias' and 'slug' identical.
# [LOW] Fixed : Add to iCal if SEF not activated (wrong url).
# [LOW] Fixed : displays users registered depending on the date (when 'All dates of each event' option is selected in menu options).
# [LOW] Fixed : possibility to edit or removed a registered user when the event is not published.
# [LOW] Fixed : changed 'all period' to 'all dates' in registration option, and fix an issue in data saved when no period for an event.
# [LOW] Fixed : possible issues with "edit own" permission for event edition.
# [LOW] Fixed : auto-increment of image name in frontend submit an event form, if image name already exists.
# [LOW] Fixed : error when searching in event with special characters (ą ę ć ś ź ł ż ó ż ń).
# [PRO MODULE iC Event List] [LOW] Fixed : wrong date depending of the time zone (only if datetime or date display is selected).

* Changed files in 3.4.0-beta2
~ admin/config.xml
~ admin/models/events.php
~ admin/models/fields/modal/evt.php
~ admin/models/fields/modal/evt_date.php
~ admin/models/fields/modal/iclink_type.php
~ admin/models/fields/modal/thumbs.php
~ admin/models/forms/event.xml
~ admin/models/forms/registration.xml
~ admin/utilities/customfields/customfields.php
+ admin/utilities/events/events.php
~ admin/utilities/form/form.php
~ admin/views/events/tmpl/default.php
~ admin/views/events/view.html.php
~ admin/views/icagenda/tmpl/default.php
~ admin/views/registrations/tmpl/default.php
+ libraries/ic_library/date/date.php
~ libraries/ic_library/lib_ic_library.xml
~ libraries/ic_library/thumb/create.php
~ libraries/ic_library/url/url.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.xml
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/default.php
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/icrounded.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.xml
~ [PLUGIN] plugins/system/ic_library/ic_library.php
~ site/add/elements/icsetvar.php
~ site/helpers/iCicons.class.php
~ site/helpers/icmodel.php
~ site/helpers/media_css.class.php
~ site/models/list.php
~ site/models/submit.php
~ [THEME PACKS] site/themes/packs/default/css/default_component.css
~ [THEME PACKS] site/themes/packs/default/css/default_module.css
+ [THEME PACKS] site/themes/packs/default/images/ic_load.gif
- [THEME PACKS] site/themes/packs/default/images/ic_load.png
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module.css
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_event.php
+ [THEME PACKS] site/themes/packs/ic_rounded/images/ic_load.gif
- [THEME PACKS] site/themes/packs/ic_rounded/images/ic_load.png
~ site/views/list/tmpl/default.php
~ site/views/list/tmpl/default_vcal.php
~ site/views/list/tmpl/event.php
~ site/views/list/tmpl/registration.php
~ site/views/list/view.html.php
~ site/views/submit/tmpl/default.php
~ site/views/submit/tmpl/default.xml
~ site/views/submit/view.html.php


$ iCagenda 3.4.0-beta1 <small style="font-weight:normal;">(2014.07.23)</small>
================================================================================
+ Added : Short Description field (you can now enter a special short description, to be used in the list of events as Intro Text).
+ Added : Limit options for Short Description, Auto-Introtext and Meta Description. Addition of a live counter of remaining characters both in admin event edit and submit an event forms.
+ Added : Option for maximum size of the uploaded image in frontend 'submit an event' form. This new function controls the file before upload, check the size and file type, and display a preview if the file is conformed.
+ Added : image added to rss feeds
+ [SQL] Added : 'shortdesc' in '#__icagenda_events' table
~ Changed : 'Meta' is replaced by 'Auto-Introtext' in Intro Text option (global component and modules options).
~ [THEME PACKS] Changed : Begin of renaming of existing CSS classes of ic_rounded theme pack (to use standardized naming, and prevent CSS conflicts with site templates and other third party extensions. Don't forget to update your custom theme pack if needed!)
~ Changed : a few code improvements, and control alert messages added.
# [LOW] Fixed : possible issue on a fresh install, with a wrong installation of the iC Library.
# [LOW] Fixed : wrong display in frontend of radio buttons, when using a Gantry Template.

* Changed files in 3.4.0-beta1
~ admin/add/css/icagenda.j25.css
~ admin/config.xml
+ admin/models/fields/modal/ictextarea_counter.php
~ admin/models/forms/event.xml
~ admin/views/event/tmpl/edit.php
~ admin/views/event/view.html.php
~ admin/views/icagenda/tmpl/color.php
~ icagenda.xml
~ libraries/ic_library/lib_ic_library.xml
~ media/css/icagenda-back.css
~ media/css/icagenda-front.css
+ media/js/icform.js
~ [MODULE][PRO] modules/mod_ic_event_list/css/default_style.css
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.xml
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.xml
~ script.icagenda.pro.php
~ site/add/css/icagenda.j25.css
~ site/add/elements/icsetvar.php
~ site/helpers/icmodel.php
~ site/icagenda.php
~ site/models/forms/submit.xml
~ site/models/list.php
~ site/models/submit.php
~ [THEME PACKS] site/themes/packs/default/css/default_component.css
~ [THEME PACKS] site/themes/packs/default/default_event.php
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_event.php
~ site/views/list/tmpl/default.php
~ site/views/list/tmpl/default.xml
~ site/views/list/view.html.php
~ site/views/submit/tmpl/default.php
~ site/views/submit/tmpl/default.xml
~ site/views/submit/view.html.php


$ iCagenda 3.4.0-alpha2 <small style="font-weight:normal;">(2014.07.16)</small>
================================================================================
+ Added : Alert message with list of custom theme packs not updated to be compatible with custom fields and feature icons.
+ Added : Check if at least 1 category is published before adding/editing an event.
+ Added : Option to show/hide custom fields in frontend 'Submit an event' form (Menu Item params and Global Options).
+ Added : Own server for Testing Updates (alpha & beta).
# [MEDIUM] Fixed : SQL error 1064 in event edit if no custom fields exists.
# [LOW] Fixed : bug in checking if a slug already exists (custom fields) (could display multiple times the custom field in event details view).
# [LOW] Fixed : bug in display of information option in Event Details view.
# [LOW] Fixed : bug in fields display options in the form to submit an event in frontend.
# [LOW][PRO][MODULE iC Event List] Fixed : today date was not always properly set depending on your hosting location (now uses Joomla config offset).

* Changed files in 3.4.0-alpha2
~ admin/config.xml
~ admin/liveupdate/classes/abstractconfig.php
~ admin/liveupdate/config.php
~ admin/models/customfields.php
+ admin/sql/install/mysql/icagenda.install.sql
- admin/sql/install.mysql.utf8.sql
+ admin/sql/uninstall/mysql/icagenda.uninstall.sql
- admin/sql/uninstall.mysql.utf8.sql
~ admin/tables/customfield.php
~ admin/utilities/categories/categories.php
~ admin/utilities/customfields/customfields.php
+ admin/utilities/theme/theme.php
~ admin/views/customfields/tmpl/default.php
~ admin/views/event/tmpl/edit.php
~ admin/views/event/view.html.php
~ admin/views/events/view.html.php
~ admin/views/features/tmpl/default.php
~ admin/views/icagenda/tmpl/color.php
~ admin/views/icagenda/tmpl/default.php
~ admin/views/info/tmpl/default.php
~ admin/views/themes/tmpl/default.php
~ icagenda.xml
+ [iC Library] libraries/ic_library/file/file.php
~ [iC Library] libraries/ic_library/lib_ic_library.xml
~ [MODULE][PRO] modules/mod_ic_event_list/css/icrounded_style.css
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [PLUGIN][iC Library] plugins/system/ic_library/ic_library.php
~ script.icagenda.pro.php
~ site/add/elements/icsetvar.php
~ site/helpers/icmodel.php
~ [THEME PACKS] site/themes/packs/default/default_event.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_event.php
~ site/views/submit/tmpl/default.php
~ site/views/submit/tmpl/default.xml
~ site/views/submit/view.html.php


$ iCagenda 3.4.0-alpha1 <small style="font-weight:normal;">(2014.07.11)</small>
================================================================================
! New : Custom fields.
1 Available in registration and event edition forms.
1 Field types : text, list, radio buttons.
! New : Feature Icons.
1 Create icons for each feature.
1 Attribute one or more features individually for each event.
1 Feature can be for example: Parking, Refreshments, Restaurant, Hotel, Free, TV, Toilets, Swimming, Airport... (no limit of usage!).
! New : Librairies
1 iC Library : standalone library (loaded by a plugin).
1 iCagenda Utilities : integrated library of iCagenda.
! New : Full Thumbnails generator
1 Options for 4 predetermined sizes : large, medium, small, xsmall.
1 For each thumbnail size, individual options : width, height, quality, crop.
! Many code lines cleaned up, and global improvement. (zip is now 0,4 mb lighter!)
+ Added : Modified Date and Modified By fields in admin event edit form.
+ [PRO][MODULE iC Event List] Added : Detection of the categor(y)ies set in the menu items to generate link of an event.
+ [PRO][MODULE iC Event List] Added : Show/Hide venue name
~ [PRO][MODULE iC Event List] Changed : Improved design of icrounded layout.
~ Changed : default ordering of admin list of events is now ID descendant (latest created event in first position).
~ Changed : default ordering of admin list of registered users is now ID descendant (latest registered user in first position).
~ Changed : option to set 'Intro Text'; auto, hide, short desc or meta (global options and modules params).
# [LOW] Fixed : created date was missing in old versions of iCagenda (before 3.1.5). This version update database to set a valid created date for events created with versions of iCagenda < 3.1.5, and set in this order : modified date if valid or next/last date if valid or, at the end, will use current date. (this fix is to prevent wrong 'Created on 30 November -0001' in search results)

* Changed files in 3.4.0-alpha1
~ admin/access.xml
~ admin/add/elements/title.php
~ admin/add/elements/titleimg.php
~ admin/config.xml
+ admin/controllers/customfield.php
+ admin/controllers/customfields.php
~ admin/controllers/event.php
+ admin/controllers/feature.php
+ admin/controllers/features.php
~ admin/helpers/icagenda.php
~ admin/icagenda.php
+ admin/models/customfield.php
+ admin/models/customfields.php
~ admin/models/event.php
~ admin/models/events.php
+ admin/models/feature.php
+ admin/models/features.php
~ admin/models/fields/modal/date.php
+ admin/models/fields/modal/thumbs.php
+ admin/models/forms/customfield.xml
~ admin/models/forms/event.xml
+ admin/models/forms/feature.xml
~ admin/models/forms/registration.xml
~ admin/models/icagenda.php
~ admin/models/registration.php
~ admin/models/registrations.php
+ admin/tables/customfield.php
~ admin/tables/event.php
+ admin/tables/feature.php
~ admin/tables/icagenda.php
~ admin/tables/registration.php
+ admin/utilities/categories/categories.php
+ admin/utilities/class/class.php
+ admin/utilities/customfields/customfields.php
+ admin/utilities/form/form.php
+ admin/utilities/thumb/thumb.php
~ admin/views/category/tmpl/edit.php
+ admin/views/customfield/tmpl/edit.php
+ admin/views/customfield/view.html.php
+ admin/views/customfields/tmpl/default.php
+ admin/views/customfields/view.html.php
~ admin/views/event/tmpl/edit.php
~ admin/views/events/tmpl/default.php
~ admin/views/events/view.html.php
+ admin/views/feature/tmpl/edit.php
+ admin/views/feature/view.html.php
+ admin/views/features/tmpl/default.php
+ admin/views/features/view.html.php
~ admin/views/icagenda/tmpl/default.php
~ admin/views/icagenda/view.html.php
~ admin/views/info/tmpl/default.php
~ admin/views/registration/tmpl/edit.php
~ admin/views/registrations/tmpl/default.php
~ icagenda.xml
+ media/css/icagenda-back.css
+ media/css/icagenda-front.css
~ [iCicons][New icons] media/icicons/
+ media/images/customfields-16.png
+ media/images/customfields-48.png
+ media/images/features-16.png
+ media/images/features-48.png
+ media/images/panel_denied/customfields-48.png
+ media/images/panel_denied/features-48.png
~ [IMAGES][All png optimized] media/images/
~ media/js/icdates.js
- [FOLDER] media/scripts/
~ [MODULE][PRO] modules/mod_ic_event_list/css/default_style.css
~ [MODULE][PRO] modules/mod_ic_event_list/css/icrounded_style.css
~ [MODULE][PRO] modules/mod_ic_event_list/helper.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.xml
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/default.php
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/icrounded.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.xml
- [FOLDER] plugins/search/plg_icagenda/
+ [FOLDER] plugins/search/icagenda/
- [FOLDER] plugins/system/plg_ic_autologin/
+ [FOLDER] plugins/system/ic_autologin/
+ plugins/system/ic_library/ic_library.php
+ plugins/system/ic_library/ic_library.xml
~ script.icagenda.pro.php
~ site/add/elements/icsetvar.php
~ site/helpers/ichelper.php
~ site/helpers/iCicons.class.php
~ site/helpers/icmodel.php
~ site/icagenda.php
~ site/js/icmap.js
~ site/models/forms/submit.xml
~ site/models/list.php
~ site/models/submit.php
~ site/router.php
~ [THEME PACKS] site/themes/packs/default/css/default_component.css
~ [THEME PACKS] site/themes/packs/default/css/default_module.css
~ [THEME PACKS] site/themes/packs/default/default_day.php
~ [THEME PACKS] site/themes/packs/default/default_event.php
~ [THEME PACKS] site/themes/packs/default/default_events.php
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component_small.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component_xsmall.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module.css
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_day.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_event.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_events.php
~ site/views/list/tmpl/default.php
~ site/views/list/tmpl/default.xml
~ site/views/list/tmpl/event.php
~ site/views/list/tmpl/registration.php
~ site/views/list/view.feed.php
~ site/views/list/view.html.php
~ site/views/submit/tmpl/default.php
+ [iC Library] libraries/ic_library/color/color.php
+ [iC Library] libraries/ic_library/filter/output.php
+ [iC Library] libraries/ic_library/lib_ic_library.xml
+ [iC Library] libraries/ic_library/library/library.php
+ [iC Library] libraries/ic_library/string/string.php
+ [iC Library] libraries/ic_library/thumb/create.php
+ [iC Library] libraries/ic_library/thumb/get.php
+ [iC Library] libraries/ic_library/thumb/image.php
+ [iC Library] libraries/ic_library/url/url.php
+ [SQL] #__icagenda_customfields_data
+ [SQL] #__icagenda_feature
+ [SQL] #__icagenda_feature_xref


iCagenda 3.3.8 <small style="font-weight:normal;">(2014.07.04)</small>
================================================================================
+ Added : Events RSS feeds integrated to Joomla (This is a partial integration, displaying all events. An advanced integration with options, and events image in the RSS feed, will be added in 3.4.0 version, thanks to the new iC Library not yet implemented).
~ Changed : ChangeLog design
# [HIGH] Fixed : did not save the date selected during registration in datetime database format , depending on date format settings (was not working properly with name of the day of the week display displayed, eg. Saturday, 21 June 2014, or if AM/PM selected).
# [LOW] Fixed : quote issue in short description when sharing on facebook.

* Changed files in 3.3.8
~ admin/add/css/icagenda.css
+ admin/CHANGELOG.php
- admin/UPDATELOGS.php
~ admin/models/fields/modal/evt_date.php
~ admin/views/icagenda/tmpl/color.php
~ admin/views/icagenda/tmpl/default.php
~ admin/views/icagenda/view.html.php
~ icagenda.xml
~ script.icagenda.php
~ site/helpers/icmodel.php
~ site/models/list.php
~ site/views/list/tmpl/default.php
~ site/views/list/tmpl/event.php
~ site/views/list/tmpl/registration.php
+ site/views/list/view.feed.php


iCagenda 3.3.7 <small style="font-weight:normal;">(2014.05.29)</small>
================================================================================
! New : Custom notification emails to a user after registration to an event can be edit in html using your favorite editor.
+ Added : individual options for the display of fields in menu "Submit an event".
~ Changed : New registration button (uses icons, colors, and a redirect to login with return page, if user has no permission).
# [MEDIUM] Fixed : link to past event if "only next/last date" selected in the menu option, returned a view with no data, depending of value set in option 'Selection of events'.
# [LOW] Fixed : bug if 'today' and 'all dates' selected, could display no events (missing offset in date controls).
# [LOW] Fixed : in iCagenda 3.3.6, the notification emails to a user after registration to an event, do not account for newlines.
# [LOW] Fixed : Print popup view, if SEF disabled.

* Changed files in 3.3.7
~ admin/add/css/icagenda.j25.css
~ admin/config.xml
+ admin/models/fields/modal/ic_editor.php
~ [iCicons][Update] media/icicons/
~ site/helpers/icmodel.php
~ site/models/forms/submit.xml
~ site/models/list.php
~ site/models/submit.php
~ [THEME PACKS] site/themes/packs/default/css/default_component.css
~ [THEME PACKS] site/themes/packs/default/css/default_module.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module.css
~ site/views/list/tmpl/event.php
~ site/views/list/tmpl/registration.php
~ site/views/submit/tmpl/default.php
~ site/views/submit/tmpl/default.xml
~ site/views/submit/view.html.php


iCagenda 3.3.6 <small style="font-weight:normal;">(2014.05.16)</small>
================================================================================
+ Added : Option for Intro Text : hide, the short description (generated from full description) or the meta description (Global Options of the component, and options of the modules).
+ [GLOBALIZATION] Added : tr-TR Turkish (Turkey) date formats.
+ [MODULE Calendar] Added : ID is added next to title of the menu, in option to select 'link to menu'.
+ [PRO] Added : Option to set minimum release stability for update notifications. (PRO OPTIONS tab in global options of iCagenda Pro)
~ [Optimization] : SQL request filtering improved in order to fix an issue, and speed up loading (more optimization to come concerning speed of page loading).
~ Changed : Division of the events tab in the global configuration into 2 tabs : Events (list of events options) and Event (details view options).
~ Changed : Updated addthis script (v300).
# [Optimization] Fixed : the list model was running the loading of data twice, and with this issue fixed the execution time for displaying a list is now halved (Thanks doorknob!).
# [HIGH]Fixed : Access to registration form if registration not activated in options.
# [LOW] Fixed : (only on Joomla 2.5) wrong display of print page if 'All Dates for each event' is selected in menu option.
# [LOW][MODULE Calendar][JS] Fixed : It was correctly deleting and adding the class style_Today but not the reverse for style_Day (by doorknob).
# [LOW]Fixed : Issue with Turkish language in admin events list (due to setlocale function, not used anymore).
# [LOW]Fixed : wrong closing select tags in 2 fields of the registration form.
# [LOW]Fixed : missing div tag in registration form.

* Changed files in 3.3.6
~ admin/config.xml
~ admin/globalization/iso.php
+ admin/globalization/tr-TR.php
~ admin/models/fields/modal/menulink.php
~ admin/views/events/tmpl/default.php
~ admin/views/events/view.html.php
~ media/scripts/icthumb.php
~ [MODULE][PRO] modules/mod_ic_event_list/helper.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/js/jQuery.highlightToday.js
~ [MODULE] modules/mod_iccalendar/js/jQuery.highlightToday.min.js
~ site/add/elements/icsetvar.php
~ site/helpers/ichelper.php
~ site/helpers/icmodel.php
~ site/models/list.php
~ site/views/list/tmpl/default.php
~ site/views/list/tmpl/event.php
~ site/views/list/tmpl/registration.php
~ site/views/list/view.html.php


iCagenda 3.3.5-1 (patch) <small style="font-weight:normal;">(2014.04.29)</small>
================================================================================
# Fixed : possible issue with uploaded files (image and/or file) not attached correctly in frontend submission form.

* Changed files in 3.3.5-1
~ site/views/submit/tmpl/default.php


iCagenda 3.3.5 <small style="font-weight:normal;">(2014.04.27)</small>
================================================================================
+ Added : Control if event is published before editing a user registered for an event. (prevent error if user is registered to an unpublished event)
+ Added : Control if registered date still exists when editing a user registered for an event.
~ Changed : can convert date format depending on the option setting for date format (menu or global), when registration saved since version 3.3.3.
# [MEDIUM] Fixed : Date selection in Registration edition.
# [LOW] Fixed : missing loading of template.js on registration edition (Joomla 2.5).
# [LOW] Fixed : wrong css styling of pagination (Joomla 2.5).

* Changed files in 3.3.5
~ admin/add/css/template.css
~ admin/models/fields/modal/evt_date.php
~ admin/models/fields/modal/evt.php
~ admin/models/registrations.php
~ admin/views/registration/tmpl/edit.php
~ admin/views/registrations/tmpl/default.php
~ site/helpers/icmodel.php


iCagenda 3.3.4 <small style="font-weight:normal;">(2014.04.25)</small>
================================================================================
! Joomla 3.3 Ready! This version has been tested on 3.3.0 rc, and a few improvements has been done to run well on the new Joomla 3.3 available soon !
+ Added : Displays 'Home Page' and 'Submit a New Event' buttons, after validation of the event submission form, if user is logged in (was only displayed when user not logged in).
+ Added : Show 'Registration Options' in frontend submission form, only if registration is activated in global options.
~ Changed : Hide User ID when logged-in in registration form (was visible only for registered user).
~ Changed : no more 'onload' to initialize Google Maps (could prevent onload conflict with other extensions).
# [MEDIUM][Joomla 3.2.x & 3.3-beta] Fixed : in the frontend submission form, when user logged-in, 'disabled' changed to 'readonly' for user name and email, as it will not be submitted on a Joomla 3.3 website, and was giving the bug of double-click-needed on the submit button on J3.2.
# [MEDIUM][Joomla 2.5] Fixed : Global Options BUG with options not accessible -> Not correct path for js files in admin (after change of location for the scripts files in 3.3.3), on Joomla 2.5.
# [LOW] Fixed : Possible missing close div in submission form, if registration not displayed.
# [LOW][MODULE Calendar] Fixed : time was displayed even if the option to show time in event edition was disabled. Control missing in default theme pack.

* Changed files in 3.3.4
~ admin/add/elements/desc.php
~ admin/add/elements/title.php
~ admin/icagenda.php
- admin/models/fields/modal/time.php
~ admin/models/forms/event.xml
~ admin/views/event/tmpl/edit.php
~ admin/views/icagenda/tmpl/default.php
~ admin/views/icagenda/view.html.php
~ script.icagenda.php
~ site/helpers/icmodel.php
~ site/models/submit.php
~ [THEME PACKS] site/themes/packs/default/default_day.php
~ site/views/list/tmpl/registration.php
~ site/views/submit/tmpl/default.php
~ site/views/submit/tmpl/send.php
~ site/views/submit/view.html.php
+ media/js/jquery.noconflict.js


iCagenda 3.3.3 <small style="font-weight:normal;">(2014.04.20)</small>
================================================================================
! New : Edition in admin of a user registered for an event, and possibility to create a new registered user.
! New : Advanced options for Registration Button. You can now replace individually for each event, the link on the button by an external url or an article ('Options' tab, in admin event edition). Another option is added for browser target of the registration button.
+ Added : Global option to set a default date format (general settings tab).
+ [MODULE Calendar] Added : Option to display a custom text in header of calendar. (Thanks doorknob)
+ [MODULE Calendar] Added : Option to set a padding for the tooltip, on mobile devices. (Thanks doorknob)
~ Changed : Date selected during a registration will be saved in database without formatting.
~ Changed : IcoMoon replaced by iCicon font (iCagenda vector icons font), for print and calendar icons on Joomla 3.
~ Changed : forms (Submission and Registration): uses iCtip script to generate information tooltips (replaces css3 tooltips, and adds responsive behaviour to detect screen border).
~ Changed : folder 'add/js' moved from admin and site folders to media folder.
~ [THEME PACKS] Changed : in THEME_day.php file, 'cal_date' changed to 'data-cal-date' (to avoid possible future conflicts as html5 is developed).
~ [ROUTER SEF] Changed : "event_registration" to "registration" at the end of url to registration form (when SEF enabled).
~ Code : many code cleaned and/or improved (Thank you Doorknob for your precious contribution!).
- [ROUTER SEF] Removed : "event_details" at the end of url to event details view (when SEF enabled) and provides a better SEO score.
- [MODULE] Removed : br tags after date/close header in calendar tooltip.
# [MEDIUM] Fixed : error in a php function which changes event time (winter/summer time) when event over a period starting before daylight saving, and finishing after daylight saving.
# [MEDIUM] Fixed : displaying of today, and/or upcoming, or past events are now using Joomla config time zone, to prevent issue with server timezone.
# [LOW] Fixed : ordering of categories (admin).
# [LOW] Fixed : possibility of a PHP Warning: Invalid argument supplied for foreach() in /components/com_icagenda/views/list/tmpl/event.php on line 48, in your site error log.
# [LOW] Fixed : Not sending notification to the user who registers for an event, if email is not set as required.
# [LOW] Fixed : Error if no events, with Addthis button.
# [LOW] Fixed : Bug in All Dates, when only sunday for period (wrong display : "Sunday & Sunday").
# [LOW] Fixed : It was not loading Google Maps script if only coordinates were indicated (empty address).
# [LOW][PLUGIN Search] Fixed : Display of events not filtered by current language.
# [LOW][PRO][MODULE iC Event List] Fixed : Possible missing thumbnail, if no leading "/" in image url.

* Changed files in 3.3.3
~ admin/add/css/icagenda.css
~ admin/add/image/joomlic_iCagenda.png
~ admin/add/image/logo_icagenda.png
- [FOLDER] admin/add/js/
~ admin/config.xml
~ admin/controllers/categories.php
~ admin/controllers/event.php
+ admin/controllers/registration.php
~ admin/helpers/icagenda.php
~ admin/liveupdate/liveupdate.php
~ admin/models/event.php
~ admin/models/events.php
~ admin/models/fields/modal/date.php
+ admin/models/fields/modal/evt.php
+ admin/models/fields/modal/evt_date.php
~ admin/models/fields/modal/icalert_msg.php
+ admin/models/fields/modal/iclink_article.php
+ admin/models/fields/modal/iclink_type.php
+ admin/models/fields/modal/iclink_url.php
~ admin/models/forms/event.xml
+ admin/models/forms/registration.xml
+ admin/models/registration.php
~ admin/tables/category.php
~ admin/tables/event.php
+ admin/tables/registration.php
~ admin/views/categories/tmpl/default.php
~ admin/views/event/tmpl/edit.php
~ admin/views/events/tmpl/default.php
~ admin/views/icagenda/tmpl/default.php
~ admin/views/info/tmpl/default.php
+ admin/views/registration/tmpl/edit.php
+ admin/views/registration/tmpl/index.html
+ admin/views/registration/view.html.php
~ admin/views/registrations/tmpl/default.php
~ admin/views/registrations/view.html.php
~ admin/views/themes/tmpl/default.php
~ media/scripts/icthumb.php
~ [MODULE][PRO] modules/mod_ic_event_list/css/default_style.css
~ [MODULE][PRO] modules/mod_ic_event_list/css/icrounded_style.css
~ [MODULE][PRO] modules/mod_ic_event_list/helper.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/js/jQuery.highlightToday.js
~ [MODULE] modules/mod_iccalendar/js/jQuery.highlightToday.min.js
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.xml
~ [PLUGIN] plugins/search/plg_icagenda/icagenda.php
~ script.icagenda.php
~ site/add/css/icagenda.css
~ site/add/css/style.css
~ site/add/elements/icsetvar.php
- [FOLDER] site/add/js/
~ site/helpers/ichelper.php
~ site/helpers/iCicons.class.php
~ site/helpers/icmodel.php
~ site/router.php
~ [THEME PACKS] site/themes/packs/default/css/default_component.css
~ [THEME PACKS] site/themes/packs/default/css/default_component_xsmall.css
~ [THEME PACKS] site/themes/packs/default/css/default_module.css
~ [THEME PACKS] site/themes/packs/default/default_day.php
~ [THEME PACKS] site/themes/packs/default/default_registration.php
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component_xsmall.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module_small.css
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_day.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_event.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_registration.php
~ site/views/list/tmpl/default.php
~ site/views/list/tmpl/event.php
~ site/views/list/tmpl/registration.php
~ site/views/submit/tmpl/default.php


iCagenda 3.3.2 <small style="font-weight:normal;">(2014.03.17)</small>
================================================================================
! [PLUGIN] New plugin iCagenda search, enables searching in events.
- Removed : option 'All options' (by individual date and for all period) in 'Registration type' (not logical).
# [MEDIUM] Fixed : Not displaying singles dates in registration form.
# [LOW] Fixed : Not setting default value correctly for new global options: show/hide venue's name, city, country and short description.
# [LOW][THEME PACKS] Fixed : Missing ic-box-date class in ic_rounded xsmall media css file.
# [LOW][MODULE] Fixed : possibility of a notice message related to the jquery checking.

* Changed files in 3.3.2
~ admin/models/forms/event.xml
~ admin/tables/event.php
~ icagenda.xml
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.php
+ [PLUGIN] plugins/search/plg_icagenda/icagenda.php
+ [PLUGIN] plugins/search/plg_icagenda/icagenda.xml
+ [PLUGIN] plugins/search/plg_icagenda/index.html
+ [PLUGIN][FOLDER] language
~ script.icagenda.php
~ site/add/elements/icsetvar.php
~ site/helpers/icmodel.php
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component_xsmall.css
~ site/views/list/view.html.php


iCagenda 3.3.1 <small style="font-weight:normal;">(2014.03.14)</small>
================================================================================
+ Added : Global options to show/hide information in list of events (venue's name, city, country, short description).
+ Added : Global options to show/hide day, month and/or year in date box of the list of events.
+ Added : Global option to set HTML filtering in Short Description (All italicized, No HTML or Authorized tags: <br />, <b>, <strong>, <i>, <em>, <u>).
+ Added : Global option to set first day of the week (used when list of weekdays is displayed).
+ [MODULE iC Calendar] Added : Options to select a background color for days with only one event or more than one event.
+ [MODULE iC Calendar] Added : HTML Filtering Option for Short Description in tooltip.
~ Changed : redirect to login page if user has no access to submission form or is not logged-in.
~ [THEME PACKS] Changed : display order of Venue's name, city and country in tooltip of the calendar (now on the same line).
~ [THEME PACKS][ic_rounded] Changed class names for day, month and year in date box.
- [THEME PACKS] Removed, module iC calendar : <i> tags for short description in tooltip.
# [MEDIUM] Fixed : Duplicate display of alert message, and not display of event details, if event not approved, and user logged-in with approval permissions.
# [MODULE iC Calendar][LOW] Fixed : Not displaying events in module calendar on Joomla 2.5, if all categories selected.

* Changed files in 3.3.1
~ admin/config.xml
~ admin/models/registrations.php
~ admin/views/icagenda/tmpl/default.php
~ admin/views/info/tmpl/default.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.xml
~ site/add/elements/icsetvar.php
~ site/helpers/icmodel.php
~ [THEME PACKS] site/themes/packs/default/css/default_component.css
~ [THEME PACKS] site/themes/packs/default/css/default_module.css
~ [THEME PACKS] site/themes/packs/default/default_day.php
~ [THEME PACKS] site/themes/packs/default/default_events.php
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module.css
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_day.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_events.php
~ site/views/list/tmpl/default.php
~ site/views/list/tmpl/event.php
~ site/views/list/view.html.php
~ site/views/submit/tmpl/default.php


iCagenda 3.3.0 <small style="font-weight:normal;">(2014.03.06)</small>
================================================================================
! [Theme Packs] Added media css files for Responsive Design.
! [SQL] Creates table #__icagenda_customfields database to prepare future Custom Fields System.
+ Added : Options to show/hide the fields in Event Submission Form.
+ Added : Option "Contact's email" in Admin notification mailing list for registrations.
+ Added : Filter by Upcoming/Past/Today events (Admin Events List).
+ Added : Filter by event (Admin Registrations List).
+ [MODULE iC Calendar] Added : Multi-selection of categories.
+ [MODULE iC Calendar] Added : Option to select a default font color for calendar.
+ [SQL] Added : 'metadesc' field to store an event meta-description (if not set, uses the new function to generate a short meta-description based on full description (limited to 160 characters to give the best SEO performance).
+ [SQL] Added : 'custom_fields' field to store data from custom fields (not yet available).
~ [Theme Pack] DEFAULT : major changes in event details view (default_event.php) and list view (default_events.php) by removing table tags, and using div to display content. Many class names changed with a leading prefix 'ic-' added to prevent possible conflict of naming with site templates css files.
~ Updated : iCalcreator updated from v2.16.12 to v2.18 (Add to iCal and Outlook).
~ Changed : limited length for url when adding an event to Yahoo and Google calendar (to prevent errors).
~ Changed : Updating preview of event image in edit admin when mouseover preview link.
~ Changed : Removal of the 404 block in order to prevent double display of an error page (depending of the site template used).
~ [SEO] Changed and enhanced : meta title and description are improved, better filtering, and give the best possible SEO performance.
~ [PRO][MODULE iC Event List] Changed : Using user timezone or if not set, Joomla server time zone, to set today time.
# [HIGH] Security : Fixed access to registration form when an event is unpublished or finished (prevents spamming).
# [MEDIUM] Fixed : conflict with module login, when a user log-in or log-out on the event details view, if 'add to cal' activated (loading iCal/outlook .ics file).
# [MEDIUM] Fixed : redirect to login page if user has no access to registration form and event details page (if direct visit to this page).
# [LOW] Fixed : not sending if missing space after comma, in custom list of emails for notification email.
# [LOW] Fixed : add to outlook calendar if no end date.
# [LOW] Fixed : Error introduced in a previous version with 'add to cal' function, concerning Windows live and yahoo calendars (url broken).
# [LOW] Fixed : Error to get show_page_heading from menu, when not set.
# [LOW] Fixed : conflict of 'date' variable between event details view and calendar (renamed 'iccaldate' in calendar).
# [LOW] Fixed : Error in setting next date if only one date (and/or only sunday) selected as weekday (period events).
#  Many minor bugs fixed, and many code improvement.

* Changed files in 3.3.0
~ admin/config.xml
~ admin/models/category.php
~ admin/models/event.php
~ admin/models/events.php
~ admin/models/forms/event.xml
~ admin/models/mail.php
~ admin/models/registrations.php
~ admin/sql/install.mysql.utf8.sql
~ admin/sql/uninstall.mysql.utf8.sql
~ admin/tables/event.php
~ admin/views/categories/tmpl/default.php
~ admin/views/event/tmpl/edit.php
~ admin/views/events/tmpl/default.php
~ admin/views/events/view.html.php
~ admin/views/icagenda/tmpl/default.php
~ admin/views/info/tmpl/default.php
~ admin/views/registrations/tmpl/default.php
~ admin/views/registrations/view.html.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.xml
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.xml
~ script.icagenda.php
~ site/add/css/icagenda.css
~ site/add/css/style.css
~ site/add/elements/icsetvar.php
~ site/helpers/iCalcreator.class.php
~ site/helpers/ichelper.php
~ site/helpers/iCicons.class.php
~ site/helpers/icmodel.php
+ site/helpers/media_css.class.php
~ site/models/list.php
~ site/models/submit.php
~ [THEME PACKS] site/themes/packs/default/css/default_component.css
+ [THEME PACKS] site/themes/packs/default/css/default_component_large.css
+ [THEME PACKS] site/themes/packs/default/css/default_component_medium.css
+ [THEME PACKS] site/themes/packs/default/css/default_component_small.css
+ [THEME PACKS] site/themes/packs/default/css/default_component_xsmall.css
~ [THEME PACKS] site/themes/packs/default/css/default_module.css
+ [THEME PACKS] site/themes/packs/default/css/default_module_large.css
+ [THEME PACKS] site/themes/packs/default/css/default_module_medium.css
+ [THEME PACKS] site/themes/packs/default/css/default_module_small.css
+ [THEME PACKS] site/themes/packs/default/css/default_module_xsmall.css
~ [THEME PACKS] site/themes/packs/default/default_event.php
~ [THEME PACKS] site/themes/packs/default/default_events.php
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component.css
+ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component_large.css
+ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component_medium.css
+ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component_small.css
+ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component_xsmall.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module.css
+ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module_large.css
+ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module_medium.css
+ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module_small.css
+ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module_xsmall.css
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_event.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_events.php
~ site/views/list/tmpl/default.php
~ site/views/list/tmpl/default.xml
~ site/views/list/tmpl/default_vcal.php
~ site/views/list/tmpl/event.php
~ site/views/list/tmpl/registration.php
~ site/views/submit/tmpl/default.php
~ site/views/submit/view.html.php
+ SQL : Adding 'metadesc' column to table #__icagenda_events
+ SQL : Adding 'custom_fields' column to table #__icagenda_registration
+ SQL : Create table #__icagenda_customfields



iCagenda 3.2.13 <small style="font-weight:normal;">(2014.02.01)</small>
================================================================================
! [COMPONENT] Advanced Admin ACL (manage access permissions in iCagenda Backend).
! [MODULE iC Calendar] Enhancement of tooltip display on mobile device. Addition of new options in params of the module. (Thanks doorknob!)
! [MODULE iC Calendar] Beta timezone options removed. A new script, developped by doorknob, is now setting "today" highlight according to visitor local time. You keep option to use Joomla Server Time Zone, and you can set highlight on UTC time zone.
! [GNU/GLP License] Update license to version 3 (or later).
+ Added : Category filtering in administration list of events.
+ Added : Category ordering in administration list of events.
~ [Source Language] Fixed of a few errors in english (en-GB British) source translations files (centre, information...). (Thanks Phil Winsor!)
# [LOW] Fixed : limited length to 2068 bytes of the url to add an event to Google Calendar, to prevent 404 error (url length limitation).
# [LOW] Fixed : missing [...] for short description, in default Theme Pack.
# [LOW] Fixed : attachment field in event form (mouseover).
# [LOW] Fixed : Some global styling error in main css files, and some other needed replacements.
# [LOW] Fixed : Conflict Bootstrap/Google Maps, on Zoom Control and street view button (Joomla 3.2).
# [LOW][THEME PACKS] Fixed : Email cloacking click in 'Default' Theme Pack.
# [LOW][MODULE iC Calendar] Fixed : Missing <tr> tags in week days thead.
# [MEDIUM][MODULE iC Calendar] Fixed : Removed limit of sql request.

* Changed files in 3.2.13
! [GNU/GLP License v3] LICENSE.txt
~ admin/access.xml
~ admin/add/css/icagenda.css
~ admin/helpers/icagenda.php
~ admin/icagenda.php
~ admin/liveupdate/classes/tmpl/nagscreen.php
~ admin/models/events.php
~ admin/models/fields/modal/icalert_msg.php
~ admin/models/fields/modal/icfile.php
~ admin/tables/event.php
~ admin/views/categories/tmpl/default.php
~ admin/views/category/tmpl/edit.php
~ admin/views/event/tmpl/edit.php
~ admin/views/events/tmpl/default.php
~ admin/views/events/view.html.php
~ admin/views/icagenda/tmpl/default.php
~ admin/views/info/tmpl/default.php
~ admin/views/mail/tmpl/edit.php
~ admin/views/registrations/tmpl/default.php
~ admin/views/themes/tmpl/default.php
+ media/images/global_options-48.png
+ [Folder] media/images/panel_denied/
+ [MODULE][PRO] modules/mod_ic_event_list/LICENSE.txt
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.xml
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/icrounded.php
~ [MODULE] modules/mod_iccalendar/helper.php
- [MODULE] modules/mod_iccalendar/js/function.js
- [MODULE] modules/mod_iccalendar/js/function_312.js
- [MODULE] modules/mod_iccalendar/js/function_316.js
- [MODULE] modules/mod_iccalendar/js/ictip.js
+ [MODULE] modules/mod_iccalendar/js/jQuery.highlightToday.js
+ [MODULE] modules/mod_iccalendar/js/jQuery.highlightToday.min.js
+ [MODULE] modules/mod_iccalendar/LICENSE.txt
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.xml
~ [PLUGIN] plugins/plg_ic_autologin/ic_autologin.php
+ [PLUGIN] plugins/plg_ic_autologin/LICENSE.txt
~ script.icagenda.php
~ site/add/css/icagenda.css
~ site/add/css/style.css
~ site/helpers/ichelper.php
~ site/helpers/icmodel.php
~ site/icagenda.php
~ site/js/icmap.js
- site/js/map.js
~ [THEME PACKS] site/themes/packs/default/css/default_module.css
~ [THEME PACKS] site/themes/packs/default/default_day.php
~ [THEME PACKS] site/themes/packs/default/default_event.php
~ [THEME PACKS] site/themes/packs/default/default_events.php
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module.css
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_day.php
~ site/views/list/tmpl/event.php


iCagenda 3.2.12 <small style="font-weight:normal;">(2014.01.08)</small>
================================================================================
! [MODULE iC Calendar] Disabling by default the function detecting the visitor time zone in module calendar, in order to highlight 'today'. This script function was giving some issue depending of your server, settings, and joomla version. You can now find an option in parameters of the module calendar, where you can use the visitor time zone to set 'today' highlight. If option 'Beta 1 - Visitor Time Zone' selected, when a new visitor comes to your website, it sets a variable containing his time zone in session cookies (so could slow a little when first visit of this user, as it reloads the page one time). And it keeps this information in browser cookies. If option 'Beta 2 - Visitor Time Zone' selected, retrieves the time zone of the visitor each time a page with a calendar module is loaded. If you encounter an error or problem during loading of a page where a module calendar is displayed, select 'Joomla - Server Time Zone' to use the global configuration Time Zone set for your website, and clean your cookies. A better and more advanced solution will be developped to set the detection of visitor time zone.
~ Minor enhancements and corrections in code.
~ [iCicons] Update of iCagenda iCicons font.
# [LOW][MODULE iC Event List][PRO] Fixed : Issue on joomla 2.5 with option 'All' in multi-select of categories resulting in an empty list.
# [LOW] Fixed : missing strip_tags in event.php tmpl view file.

* Changed files in 3.2.12
~ [FOLDER][iCicons] media/icicons
+ media/js/detect_timezone.js
+ media/js/jquery.detect_timezone.js
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.xml
~ script.icagenda.php
~ site/helpers/icmodel.php
~ site/models/forms/submit.xml
~ [THEME PACKS] site/themes/packs/default/css/default_component.css
~ [THEME PACKS] site/themes/packs/default/default_registration.php
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component.css


iCagenda 3.2.11 FIX for 3.2.10 <small style="font-weight:normal;">(2014.01.04)</small>
================================================================================
! The function detecting the visitor time zone, in order to highlight 'today', and introduced in version 3.2.10, is now disabled on Joomla 2.5 website due to a possible alert message (no error on Joomla 3). This feature needs more developpement and testing before being introduced again for Joomla 2.5 sites, because of all possible script conflicts that happen on this platform (Joomla 3.2.1 is much more fluid!).
# [HIGH][MODULE iC Calendar] Fixed : Possible issue with calendar (redirecting to home page if script for setting visitor time zone failed).
# [MEDIUM] Fixed : Issue when 'All Dates' selected, and SEF not activated, in opening event details (error 404).

* Changed files in 3.2.11
~ [MODULE] modules/mod_iccalendar/helper.php
~ site/views/list/tmpl/default.php


iCagenda 3.2.10 <small style="font-weight:normal;">(2014.01.03)</small>
================================================================================
+ Added : Options for emails of notification and confirmation - Registration form.
+ [MODULE iC Event List][PRO] Added : 'Upcoming & Today' and 'Today' filter options.
+ [MODULE iC Event List][PRO] Added : Multi-selection of categories.
+ [MODULE iC Calendar] Added : Option to display 'country'.
~ Updated : Translation Credits and Contributors informations.
~ [MODULE iC Calendar] Enhancement : get visitor timezone and set it to session using javascript (client side) to highlight correctly 'today'.
~ [MODULE iC Calendar] Changed : get option 'display time' and global setting 'time format', in tooltip.
# [LOW] Fixed : Filtering of html content of the tip related to 'Add to Cal' button.
# [LOW][MODULE iC Calendar] Fixed : Error on a php 5.2 server, because of the new function to order events per hour in the tooltip (We really recommend switching to minimum php 5.3).
# [LOW][THEME PACKS] Fixed : Link on title in default theme pack.

* Changed files in 3.2.10
~ admin/config.xml
+ admin/models/fields/modal/ictext_placeholder.php
~ admin/views/icagenda/tmpl/default.php
~ admin/views/info/tmpl/default.php
~ [MODULE][PRO] modules/mod_ic_event_list/helper.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.xml
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.xml
~ script.icagenda.php
~ site/helpers/iCicons.class.php
~ site/helpers/icmodel.php
~ [THEME PACKS] site/themes/packs/default/default_day.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_day.php


iCagenda 3.2.9 <small style="font-weight:normal;">(2013.12.28)</small>
================================================================================
+ Added : Add to calendar icon (iCal, Google, Yahoo, Windows Live and Outlook calendars) in event details view.
+ Added : Print icon in event details view.
+ [MODULE Calendar] Added : Time for each event, in infotip.
+ [MODULE Calendar] Added : Option to used the text 'Close' in the infotip, translated in your current language, or use of a custom value.
+ [MODULE iC Event List][PRO] Added : Option to display list in columns (1 to 4 columns per row).
~ [THEME PACKS] Changed : style class 'content' renamed in 'ic-content'.
~ [THEME PACKS] Removed : Back button from Theme Packs, and added it in view file (to add future options for this button).
# [LOW] Fixed : Missing date in url, when clicking on [...] in short description, if 'All Dates' option selected for the list of events page view.
# [MEDIUM] Fixed : Change og tag description to full description, for sharing on social networks (remove html tags).
# [MEDIUM][MODULES] Fixed : Date display in Event details view after click on module links, was wrong if 'All Dates' option selected for the list of events page view.
# [MEDIUM][MODULE CALENDAR] Fixed : missing closing div in loading html (may in a rare cases give an error in displaying script code).

* Changed files in 3.2.9
~ admin/config.xml
~ admin/models/fields/modal/ictxt_default.php
~ admin/models/fields/modal/icvalue_opt.php
~ admin/views/info/tmpl/default.php
+ [FOLDER] media/images/cal/
~ [MODULE][PRO] modules/mod_ic_event_list/css/default_style.css
~ [MODULE][PRO] modules/mod_ic_event_list/css/icrounded_style.css
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.xml
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/default.php
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/icrounded.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.xml
~ site/add/css/style.css
~ site/add/elements/icsetvar.php
~ site/controller.php
+ site/helpers/iCalcreator.class.php
~ site/helpers/ichelper.php
+ site/helpers/iCicons.class.php
~ site/helpers/icmodel.php
~ site/models/list.php
~ [THEME PACKS] site/themes/packs/default/css/default_component.css
~ [THEME PACKS] site/themes/packs/default/css/default_module.css
~ [THEME PACKS] site/themes/packs/default/default_day.php
~ [THEME PACKS] site/themes/packs/default/default_event.php
~ [THEME PACKS] site/themes/packs/default/default_events.php
~ [THEME PACKS] site/themes/packs/default/default_registration.php
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module.css
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_day.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_event.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_events.php
~ site/views/list/tmpl/default.php
+ site/views/list/tmpl/default_vcal.php
~ site/views/list/tmpl/event.php
~ site/views/list/view.html.php


iCagenda 3.2.8 <small style="font-weight:normal;">(2013.12.15)</small>
================================================================================
! New : Option to display All Dates for each event (or Next/last date of each event as it was before this release).
! [THEME PACKS] Important : New file THEME_events.php to replace THEME_list.php, and new names of data variables.
+ Added : Globalization Date Format file for Ukrainian uk-UA
+ Added : Localization of Google-maps based on the current language of the site. (Thanks SLV!)
~ [MODULE iC Event List][PRO] Changed : Enhancement of Date and Time option.
~ Changed : Enhancement of css of Submission form on J2.5 websites.
# [LOW] Fixed : alone div tag, which can give problem of display of submission form page.
# [LOW] Fixed : issue in style display of category title.
# [LOW] Fixed : category title and description in header of list of events sometimes in double.
# [THEME PACKS][LOW] Fixed : css missing style for category name in header of the list of events.
# [MODULE iC Event List][PRO][LOW] Fixed : Possible issue with module display.
# [MODULE Calendar][MEDIUM] Fixed : Possible issue with module changing months, due to a bug in text "loading...".

* Changed files in 3.2.8
~ admin/add/css/icagenda.css
~ admin/config.xml
+ admin/globalization/uk-UA.php
+ admin/models/fields/modal/icalert_msg.php
~ admin/views/event/tmpl/edit.php
~ [MODULE][PRO] modules/mod_ic_event_list/css/icrounded_style.css
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.xml
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/default.php
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/icrounded.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.php
~ script.icagenda.php
~ site/add/css/icagenda.j25.css
- site/add/css/template.css
+ site/add/elements/icsetvar.php
~ site/helpers/ichelper.php
~ site/helpers/icmodel.php
~ site/models/list.php
~ [THEME PACKS] site/themes/packs/default/css/default_component.css
~ [THEME PACKS] site/themes/packs/default/css/default_module.css
~ [THEME PACKS] site/themes/packs/default/default_event.php
+ [THEME PACKS] site/themes/packs/default/default_events.php
- [THEME PACKS] site/themes/packs/default/default_list.php
~ [THEME PACKS] site/themes/packs/default/default_registration.php
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module.css
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_event.php
+ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_events.php
- [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_list.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_registration.php
~ site/views/list/tmpl/default.php
~ site/views/list/tmpl/default.xml
~ site/views/list/tmpl/event.php
~ site/views/list/tmpl/registration.php
~ site/views/list/view.html.php
~ site/views/submit/tmpl/default.php
~ site/views/submit/tmpl/send.php


iCagenda 3.2.7 <small style="font-weight:normal;">(2013.11.23)</small>
================================================================================
~ [MODULE iC calendar] Changed : minor edit in sql request of module iC calendar
# [LOW] Fixed : bug in breadcrumbs event details view.
# [THEME PACKS][LOW] Fixed : possible issue of display break when using ic_rounded theme (depending of your site template).

* Changed files in 3.2.7
~ [MODULE] modules/mod_iccalendar/helper.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_list.php
~ site/views/list/tmpl/event.php


iCagenda 3.2.6 <small style="font-weight:normal;">(2013.11.21)</small>
================================================================================
! New : Option (menu and global) to display Category informations; title and/or description (in header of list of events).
+ Added : Event Details view added to Breadcrumbs.
+ Added : Option Top & Bottom for navigation arrows (list of events).
# [MODULE iC Event List][PRO] Fixed : time not displayed correctly in module iC Event List.
# [MODULE iC Event List][PRO] Fixed : clic to event details views was not working on IE 9 (and under) with icrounded layout.

* Changed files in 3.2.6
~ admin/config.xml
+ admin/models/fields/modal/icmulti_checkbox.php
+ admin/models/fields/modal/icmulti_opt.php
~ admin/models/forms/category.xml
~ admin/views/icagenda/tmpl/default.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/default.php
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/icrounded.php
~ site/helpers/icmodel.php
~ site/models/list.php
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ site/views/list/tmpl/default.php
~ site/views/list/tmpl/default.xml
~ site/views/list/tmpl/event.php
~ site/views/list/view.html.php


iCagenda 3.2.5 <small style="font-weight:normal;">(2013.11.11)</small>
================================================================================
! Terms and Conditions Option added to registration form.
! Design compatibility with Joomla 3.2.0 (admin header html) and enhancements in admin display.
+ [THEME PACKS] Added css and php integration of registration infos in calendar tooltip.
+ [MODULE iC Calendar] Added : Options to display city, name of venue, short description, and registration infos (number of seats, seats available and already registered).
~ [MODULE iC Calendar] Changed : 'today' day is now using joomla timezone (was server timezone before).

* Changed files in 3.2.5
~ admin/add/css/icagenda.css
~ admin/add/css/icagenda.j25.css
~ admin/config.xml
- admin/models/fields/eventtitle.php
+ admin/models/fields/modal/ictxt_article.php
+ admin/models/fields/modal/ictxt_content.php
+ admin/models/fields/modal/ictxt_default.php
+ admin/models/fields/modal/ictxt_type.php
~ admin/models/forms/category.xml
~ admin/models/forms/event.xml
~ admin/views/categories/view.html.php
~ admin/views/category/tmpl/edit.php
~ admin/views/category/view.html.php
~ admin/views/event/tmpl/edit.php
~ admin/views/event/view.html.php
~ admin/views/events/view.html.php
~ admin/views/icagenda/view.html.php
~ admin/views/info/view.html.php
~ admin/views/mail/view.html.php
~ admin/views/registrations/view.html.php
~ admin/views/themes/view.html.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.xml
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.xml
~ script.icagenda.php
- site/add/js/address.js
- site/add/js/dates.js
~ [THEME PACKS] site/themes/packs/default/css/default_module.css
~ [THEME PACKS] site/themes/packs/default/default_day.php
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module.css
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_day.php
~ site/views/list/tmpl/registration.php


iCagenda 3.2.4 <small style="font-weight:normal;">(2013.10.29)</small>
================================================================================
+ [MODULE iC Event List][PRO] Added : category color as background of the date, in 'default' layout.
~ [MODULE iC Calendar] Changed : authorizes <br /> and <br> html tags in Short Description.
# Fixed : Issue when only sunday selected for period events, all days of the week were displayed.
# Fixed : Not display of Google Maps (blank) after update to last release 3.2.3, when Google Maps Global Options were not set before.
# Fixed : safehtml filter from joomla not working in frontend (skipping html tags, as should not). Filter set now to raw to not skip tags.
# Fixed : issue when access levels to Event Submission Form set to multiple levels (was not filtering access levels as expected).
# [THEME PACKS] Fixed : Issue Alignement of editor buttons in submission form.
# [MODULE iC Event List][PRO] Fixed : wrong display of events in column, due to a conflict in some site templates.

* Changed files in 3.2.4
~ admin/views/event/tmpl/edit.php
~ [MODULE][PRO] modules/mod_ic_event_list/css/default_style.css
~ [MODULE][PRO] modules/mod_ic_event_list/css/icrounded_style.css
~ [MODULE][PRO] modules/mod_ic_event_list/helper.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.xml
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/default.php
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/icrounded.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ site/helpers/icmodel.php
~ site/models/forms/submit.xml
~ site/models/submit.php
~ [THEME PACKS] site/themes/packs/default/css/default_component.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ site/views/list/tmpl/default.php
~ site/views/list/view.html.php
~ site/views/submit/tmpl/default.php
~ site/views/submit/view.html.php


iCagenda 3.2.3 <small style="font-weight:normal;">(2013.10.20)</small>
================================================================================
! [THEME PACKS] Updated : enhancements of ic_rounded theme pack, to give a better responsive experience. All table tags have been removed, and replace with div tags, and with addition of @media css styling depending of the device (mobile, tablet, desktop). This new version of ic_rounded theme pack will now have version number respectively to the component version. (to improve tracking updates by users creating their own theme. For your information, a website page is in preparation for you to get more information and documentation about creating and updating a personal Theme Pack, and new features for Theme Pack manager are in brainstorming!).
! No loading of Google Maps scripts, if no address is set, or if global option is set on Hide (to speed up loading when this files are not needed).
+ Added : missing Options Week Days in Frontend Submission Form.
+ [MODULE iC Event List][PRO] Added : Options to display date and time, city, short description, and registration infos (number of seats, seats available and already booked).
~ [THEME PACKS] Changed : enhancements of the back arrow to detect if a previous page has been visited. Code in themes php file is now simplified.
~ Changed : enhancements of Open Graph tags (title, type, image, url, description, sitename).
~ Changed : enhancements and changes in <hn> tags used in iCagenda, to able a better structural hierarchy of list of events. (auto-detect if page heading is displayed in content or not, to set properly the Hn tag).
~ Changed : views php files to speed up loading of iCagenda (list of events, event details and event registration).
# Fixed : Calendar Issue; Bug in some countries about the time change. If a date of an event over a period was the day of the time change, it was generated 2 times. The new feature integrates this setting to not double this day.


* Changed files in 3.2.3
+ admin/models/fields/modal/icvalue_field.php
+ admin/models/fields/modal/icvalue_opt.php
~ [MODULE][PRO] modules/mod_ic_event_list/css/default_style.css
~ [MODULE][PRO] modules/mod_ic_event_list/css/icrounded_style.css
~ [MODULE][PRO] modules/mod_ic_event_list/helper.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE][PRO] modules/mod_ic_event_list/mod_ic_event_list.xml
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/default.php
~ [MODULE][PRO] modules/mod_ic_event_list/tmpl/icrounded.php
~ [MODULE] modules/mod_iccalendar/helper.php
+ site/helpers/ichelper.php
~ site/helpers/icmodel.php
~ site/models/forms/submit.xml
~ site/models/list.php
~ site/models/submit.php
~ [THEME PACKS] site/themes/packs/default/css/default_component.css
~ [THEME PACKS] site/themes/packs/default/css/default_module.css
~ [THEME PACKS] site/themes/packs/default/default_calendar.php
~ [THEME PACKS] site/themes/packs/default/default_day.php
~ [THEME PACKS] site/themes/packs/default/default_event.php
~ [THEME PACKS] site/themes/packs/default/default_list.php
~ [THEME PACKS] site/themes/packs/default/default_registration.php
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module.css
+ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_alldates.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_calendar.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_day.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_event.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_list.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_registration.php
~ site/views/list/tmpl/default.php
~ site/views/list/tmpl/event.php
~ site/views/list/tmpl/registration.php
~ site/views/list/view.html.php
~ site/views/submit/tmpl/default.php
~ site/views/submit/tmpl/send.php


iCagenda 3.2.2 <small style="font-weight:normal;">(2013.10.10)</small>
================================================================================
! [iCicons] Use of integrated vector icons 'iCicons' designed for iCagenda (will evolve!).
# Fixed : List of dates in registration form (was not filtering by weekdays).
# [iCicons] Fixed : Android not display of arrows in ascii code (calendar, back button, back/next navigation).
# [iCicons] Fixed : Iphone/Ipad, arrows were not clickable (calendar, back button, back/next navigation).
# Fixed : ACL access levels filtering for events in front-end.
# Fixed : Request of Itemid in submit form.
~ Changed : better filtering of Approval access.
~ Changed : clean-up of some php functions, and sql request in frontend.
~ [THEME PACKS] Changed : enhancements of module css, and adding vector icon for back button.

* Changed files in 3.2.2
~ admin/views/events/tmpl/default.php
~ icagenda.xml
~ [MODULE] modules/mod_iccalendar/helper.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.php
~ [MODULE] modules/mod_iccalendar/mod_iccalendar.xml
~ site/helpers/icmodel.php
~ site/models/submit.php
~ [THEME PACKS] site/themes/default.xml
~ [THEME PACKS] site/themes/ic_rounded.xml
~ [THEME PACKS] site/themes/packs/default/css/default_module.css
~ [THEME PACKS] site/themes/packs/default/default_event.php
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module.css
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_event.php
~ site/views/list/view.html.php
~ site/views/submit/tmpl/default.php
+ [FOLDER] media/icicons/
+ [FOLDER] media/icicons/fonts/
+ media/icicons/fonts/iCicons.eot
+ media/icicons/fonts/iCicons.svg
+ media/icicons/fonts/iCicons.ttf
+ media/icicons/fonts/iCicons.woff
+ media/icicons/lte-ie7.js
+ media/icicons/style.css


iCagenda 3.2.1 <small style="font-weight:normal;">(2013.10.07)</small>
================================================================================
! First Stable release with 'Submit an Event' feature. For Users of the free version, see all the Release Notes of previous RC versions (available for Pro).
~ Changed : Use of DATE_FORMAT_LC3 in list of events, admin (to get date in Russian on windows server).
# Fixed : Remove nowrap css class attribute, to prevent not wrapping to the next line for long title (this is solved in iCagenda, but you may have the same problem in Joomla 3 articles. Proposal of modification added on Joomla core Github).
# Fixed : Error message when updating from an older version, if category filter was set to one category (new option multiple-categories filtering).

* Changed files in 3.2.1
~ admin/views/events/tmpl/default.php
~ site/helpers/icmodel.php
~ site/models/list.php


iCagenda 3.2.0 RC4 <small style="font-weight:normal;">(2013.10.04)</small>
================================================================================
! Added : New option, Multi-selection of categories, in parameters of the menu link to list of events.
! Changed : Updated Google Maps API to V3 https
+ Added : Notification email to a user when his event submitted has been approved by a manager.
+ Added : Redirect to login page if Approval Manager is not connected on event details page (replacing 404 page).
+ Added : New icons for 'Approve this event' (J2.5 using icons, and J3 using icomoon).
+ Added : New tooltip script for manager icons.
+ Added : Router SEF for Submit an Event.
# [LOW] Bug : inserting an extra number data at the end of the footer text line, in notification email send to Approval managers.
# [LOW] Bug : Number of events in header was not well set, when an Approval Manager is logged-in.
# [LOW] Display : Display of info tooltip when Phone Field not shown in registration form.
# [MEDIUM] Bug : display of 'sunday', when no days of the week selected for a period event, in event details view.
~ [THEME PACKS] Changed : Manager Icons are removed from theme packs (to prevent not display in personal theme pack) and added in event.php file.
~ Changed : Attachment opens now in a new window (target blank).

* Changed files in 3.2.0 RC4
~ admin/config.xml
~ admin/models/fields/modal/cat.php
+ admin/models/fields/modal/multicat.php
~ admin/models/forms/event.xml
~ admin/views/event/tmpl/edit.php
~ admin/views/events/tmpl/default.php
~ admin/views/icagenda/tmpl/default.php
~ admin/views/info/tmpl/default.php
~ icagenda.xml
~ site/add/css/style.css
~ site/helpers/icmodel.php
~ site/models/forms/submit.xml
~ site/models/list.php
~ site/models/submit.php
~ site/router.php
~ [THEME PACKS] site/themes/default.xml
~ [THEME PACKS] site/themes/ic_rounded.xml
~ [THEME PACKS] site/themes/packs/default/css/default_component.css
~ [THEME PACKS] site/themes/packs/default/default_event.php
~ [THEME PACKS] site/themes/packs/default/default_list.php
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_event.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_list.php
~ site/views/list/tmpl/default.xml
~ site/views/list/tmpl/event.php
~ site/views/list/tmpl/registration.php
~ site/views/list/view.html.php
~ site/views/submit/tmpl/default.php
~ site/views/submit/tmpl/send.php
~ site/views/submit/view.html.php
+ [FOLDER] media/css/
+ media/css/tipTip.css
+ [FOLDER] media/css/manager/
+ media/images/manager/approval_16.png
+ [FOLDER] media/js/
+ media/js/jquery.tipTip.js



iCagenda 3.2.0 RC3 <small style="font-weight:normal;">(2013.09.26)</small>
================================================================================
! Changes in the display of Global Options (added General Settings Tab)
! Fixed : important issue in notification emails send to managers authorized to approve events (due to a bug if user is depending of more than one user groups)
! Changed : Approval can be processed directly in Frontend, at event preview page.
+ Added : Check if managers with Approval permissions are Enabled and Activated.
+ Added : Option to select Template in menu-item link 'Submit an Event'.
+ Added : Global option to enable or disable auto login in url links included in notification emails.
+ Added : implemented Page Header and page class suffix in 'Submit an Event' page.
~ Changed : Events submitted in Frontend by a user (manager) belonging to an authorized group will be automatically approved.
~ Changed : Back button in event details view return to list of events ( replace history.go(-1) ).

* Changed files in 3.2.0 RC3
+ admin/add/elements/desc.php
~ admin/config.xml
~ admin/models/forms/event.xml
~ script.icagenda.pro.php
~ site/helpers/icmodel.php
~ site/models/forms/submit.xml
~ site/models/list.php
~ site/models/submit.php
~ [THEME PACKS] site/themes/packs/default/default_event.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_event.php
~ site/views/list/tmpl/registration.php
~ site/views/submit/tmpl/default.php
~ site/views/submit/tmpl/default.xml
~ site/views/submit/tmpl/send.php
~ site/views/submit/view.html.php


iCagenda 3.2.0 RC2 <small style="font-weight:normal;">(2013.09.22)</small>
================================================================================
# Fixed : Access Permissions to 'Submit an Event' form (missing global option).
+ Added : Options to customize the content when a user access to the 'Submit an Event' page, and this user is not connected, or connected but does not have sufficient rights.

* Changed files in 3.2.0 RC2
~ admin/config.xml
+ admin/models/fields/modal/ictext_content.php
+ admin/models/fields/modal/ictext_type.php
~ site/helpers/icmodel.php
~ site/models/list.php
~ site/views/submit/tmpl/default.php


iCagenda 3.2.0 RC <small style="font-weight:normal;">(2013.09.20)</small>
================================================================================
! NEW : Menu Type to 'Submit an Event' in frontend.
! NEW : Selection of days of the week for period events (additional options to come for dates settings!).
! NEW : Plugin iCagenda Autologin.

* Changed files in 3.2.0 RC
~ admin/config.xml
~ admin/models/event.php
~ admin/models/events.php
+ admin/models/fields/modal/tos_article.php
~ admin/models/fields/modal/tos_content.php
+ admin/models/fields/modal/tos_default.php
+ admin/models/fields/modal/tos_type.php
~ admin/tables/event.php
~ admin/views/event/tmpl/edit.php
~ [MODULE PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [MODULE] modules/mod_iccalendar/helper.php
~ script.icagenda.php
~ site/helpers/icmodel.php
~ site/models/list.php
~ site/models/submit.php
~ [THEME PACKS] site/themes/default.xml
~ [THEME PACKS] site/themes/packs/default/default_event.php
~ [THEME PACKS] site/themes/packs/default/default_list.php
~ [THEME PACKS] site/themes/ic_rounded.xml
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_event.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_list.php
+ site/views/submit/tmpl/default.php
+ site/views/submit/tmpl/default.xml
+ site/views/submit/tmpl/send.php
+ site/views/submit/view.html.php
+ [PLUGIN] plugins/plg_ic_autologin/ic_autologin.php
+ [PLUGIN] plugins/plg_ic_autologin/ic_autologin.xml
+ SQL : Adding 'daystime' column to table icagenda_events


iCagenda 3.1.13 <small style="font-weight:normal;">(2013.09.20)</small>
================================================================================
# Fixed : display in frontend of the fake date 30 november 1999, if no single date is set.

* Changed files in 3.1.13
~ site/helpers/icmodel.php


iCagenda 3.1.12 <small style="font-weight:normal;">(2013.09.17)</small>
================================================================================
# Fixed : A problem with the control of the upcoming date for events over a period (unpublished event and message 'no valid date'). This bug is present since version 3.1.5, and rarely appeared.
# Fixed : conflict CSS days font color in calendar module with some Shape5 templates.

* Changed files in 3.1.12
~ site/helpers/icmodel.php
~ [THEME PACKS] site/themes/default.xml
~ [THEME PACKS] site/themes/ic_rounded.xml
~ [THEME PACKS] site/themes/packs/default/css/default_module.css
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module.css


iCagenda 3.1.11 <small style="font-weight:normal;">(2013.09.13)</small>
================================================================================
# Fixed : Italian bug in translation files, responsible of missing features in event edit (admin).
# Fixed : Error mktime when saving a new event (due to no filling of single dates). A fix should update in the same way events with this issue in the frontend.

* Changed files in 3.1.11
~ admin/models/fields/modal/date.php
~ admin/views/event/tmpl/edit.php
~ site/helpers/icmodel.php


iCagenda 3.1.10 <small style="font-weight:normal;">(2013.09.12)</small>
================================================================================
+ added : control if allow_url_fopen and GD are enabled (thumbnails generator)
+ added : files to prepare the next release with Submit an Event feature!
+ added : Approval option in event edit (will be operating in release 3.2!).
~ Changed : new dates control when saving an event, display now an alert message for new event, and block saving of a new event if no valid date.
~ Changed : enhancement of period datepicker (not possible now to have end date before start date)
# Fixed : not generation of thumbs when extension of a file in caps.
# MODULE iC calendar : Fixed possible conflicts due to div tags enclosed within scripts (rare conflict, manifested by the appearance of a part of the script on the page, and the non-functioning of the calendar).
# THEME IC_ROUNDED : display of next date (Time 2 times), list of events.

* Changed files in 3.1.10
~ admin/add/js/icdates.js
~ admin/config.xml
~ admin/controllers/events.php
+ admin/helpers/html/events.php
~ admin/models/event.php
~ admin/models/fields/modal/date.php
~ admin/models/fields/modal/enddate.php
~ admin/models/fields/modal/startdate.php
+ admin/models/fields/modal/tos_content.php
~ admin/models/forms/event.xml
~ admin/tables/event.php
~ admin/views/event/tmpl/edit.php
~ admin/views/events/tmpl/default.php
~ [PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ modules/mod_iccalendar/helper.php
~ modules/mod_iccalendar/mod_iccalendar.php
~ site/add/js/icdates.js
~ site/helpers/icmodel.php
+ site/models/forms/submit.xml
~ site/models/list.php
+ site/models/submit.php
~ [THEME PACKS] site/themes/ic_rounded.xml
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_list.php
+ SQL : Adding 'approval' column to table icagenda_events


iCagenda 3.1.9 <small style="font-weight:normal;">(2013.09.06)</small>
================================================================================
! MODULE iC calendar : possibility now to publish many calendars on a single page.
+ Added : Extra-control if mime-type of the event's image is correct (in order to process thumbnails creation).
+ Added : Complete or not form fields 'Name' and 'Email' with the profile information of a Joomla user connected, in registration form.
+ Added : Option to enable or disable the thumbnail generator.
+ Added : 'Notes' field text area in Registration form (set disabled as default).
+ Added : Option Show/Hide 'Notes' in registration form.
+ Added : Option Show/Hide 'Phone' in registration form.
+ Added : Information and control of folder creation used by iCagenda (thumbnails, attachments).
~ THEME PACKS : version 2.0 (default and ic_rounded).
~ Changed : period of dates with start date the same day than end date is now displayed as 'date start time - end time' (eg. 23 April 2013 10:00-19:00)
~ Changed : list of date formats was without <optgroup> infos in Joomla 3
# MODULE iC calendar : Fixed, Tooltip Close X button was not working on Apple mobile devices.
# Fixed : bugs in thumbnails generator if ROOT/images folder doesn't exist. Solve an issue if path to images is not 'images'.

* Changed files in 3.1.9
~ admin/config.xml
~ admin/models/event.php
~ admin/models/fields/iclist/globalization.php
~ admin/models/fields/modal/enddate.php
~ admin/models/fields/modal/startdate.php
~ admin/models/forms/event.xml
~ admin/models/registrations.php
~ admin/tables/event.php
~ admin/views/event/tmpl/edit.php
~ admin/views/events/tmpl/default.php
~ admin/views/registrations/tmpl/default.php
~ media/scripts/icthumb.php
~ [PRO] modules/mod_ic_event_list/mod_ic_event_list.php
~ [PRO] modules/mod_ic_event_list/mod_ic_event_list.xml
+ modules/mod_iccalendar/helper.php
~ modules/mod_iccalendar/mod_iccalendar.php
~ modules/mod_iccalendar/mod_iccalendar.xml
~ script.icagenda.php
- site/helpers/icmodcalendar.php
~ site/helpers/icmodel.php
~ site/models/list.php
~ [THEME PACKS] site/themes/default.xml
~ [THEME PACKS] site/themes/ic_rounded.xml
~ [THEME PACKS] site/themes/packs/default/default_event.php
~ [THEME PACKS] site/themes/packs/ic_rounded/css/ic_rounded_module.css
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_day.php
~ [THEME PACKS] site/themes/packs/ic_rounded/ic_rounded_event.php
~ site/views/list/tmpl/registration.php
~ site/views/list/view.html.php
+ SQL : Adding 'created_by_email' column to table icagenda_events
+ SQL : Adding 'weekdays' column to table icagenda_events
+ SQL : Adding 'notes' column to table icagenda_registration


iCagenda 3.1.8 <small style="font-weight:normal;">(2013.08.30)</small>
================================================================================
# Fixed : Error message in liveupdate (developped by Nicholas from Akeeba) to work under php 5.2. I've added a php control to be able to load storage.php file. But, we truly recommend every user to upgrade their php version to a minimum of 5.3, as recommended by Joomla core, and as minimum to be able to install Joomla 3. In the future, you can encounter other such issue, or error message, if you're still in a PHP version lower than 5.3.
+ Added : Alert Message in control panel of the component, if PHP version is lower than 5.3.

* Changed files in 3.1.8
~ admin/liveupdate/classes/storage/storage.php
~ admin/views/icagenda/tmpl/default.php


iCagenda 3.1.7 <small style="font-weight:normal;">(2013.08.29)</small>
================================================================================
+ Added : Created_by filter in list of registered users (admin).
+ Added : Option to use php function checkdnsrr in registration form, to check if email provider is valid (this option is now disabled by default).
+ Added : Options for event details view: show/hide dates, Google Maps, information... and set access level for some.
+ Added : Options to order by dates list of single dates, and display a vertical or horizontal list.
+ Added : Option for registration form : auto-filled name or username, in name's form field (was only name before).
+ MODULE iC calendar : Option to display only start date in the calendar, in case of an event over a period.
~ MODULE iC calendar : Changes in script code of function.js file to prevent some conflict.
~ Changed : Search in registrations list extended: username, name, email, date, phone, people... (only search in Title before this release)
~ Changed : Default value is now set to "by individual date" in 'Registration Type' field.
~ Changed : Upgraded files of LiveUpdate by Akeeba, updates system integrated in iCagenda.
# Fixed : sending notification email to author of an event, when new registration. Fixed of [AUTHOREMAIL] tag.
# Fixed : Error Debug of Google Maps (icmap.js).

* Changed files in 3.1.7
~ admin/config.xml
~ admin/liveupdate/ (All php files of this folder updated)
+ admin/models/fields/modal/checkdnsrr.php
~ admin/models/forms/event.xml
~ admin/models/registrations.php
~ admin/views/icagenda/tmpl/default.php
~ admin/views/registrations/tmpl/default.php
~ modules/mod_iccalendar/js/function.js
~ modules/mod_iccalendar/mod_iccalendar.xml
~ site/helpers/icmodcalendar.php
~ site/helpers/icmodel.php
~ site/js/icmap.js
~ site/themes/packs/default/default_event.php
~ site/views/list/tmpl/registration.php


iCagenda 3.1.6 <small style="font-weight:normal;">(2013.08.20)</small>
================================================================================
# Fixed : NextDate control when event set on a period in the future.
+ Added : Control of time when event with a date in a period the same as a single date.
+ Added : On windows server and php version < 5.3, disable check function if provider of an email address during registration is valid, as checkdnsrr is implemented on windows server only since php 5.3.0

* Changed files in 3.1.6
~ site/helpers/icmodel.php


iCagenda 3.1.5 Security Release and enhancements! <small style="font-weight:normal;">(2013.08.19)</small>
================================================================================
! Security Release : fixed a XSS vulnerability discovered by Stefan Horlacher from Compass Security AG (www.csnc.ch) (many thanks Stefan to keep the web clean and secured!). Another issue was resolved, discovered by Giusebos, which allowed sending spam to the administrator and the creator of the event, using cookies via registration form. And that's not all! As we always want to add much more security, some filtering enhancements have been added to the registration form (see below).
! Change : Now, when an event over a period with an end date and its time set to 00:00:00, this end date is displayed in frontend (list of events, and modules).
+ Added : New options in filtering events in menuitem. Now you can display all events, upcoming events, past events, events of the day and upcoming, or today's events.
+ Added : Page 404 when event not found.
+ Added : Enhancement of Email control during registration. Test if provider is valid.
+ Added : Test of the Name during registration. Now, a name cannot start with a number and cannot contain any of the following characters: / \ < > "_QQ_" [ ] ( ) " ; = + &.
+ Added : Control in front-end if dates of events are valid (control was before only in admin edit)
# Fixed : was counted archived events in header of list of events, and should not.
# Fixed : if end time is lower or equal to start time of an event over a period, end date is displayed.
# Fixed : Author name and username were not correctly displayed in admin events list, and now display correctly the user selected in 'created by'.

* Changed files in 3.1.5
~ admin/models/events.php
~ admin/tables/event.php
~ admin/views/events/tmpl/default.php
~ site/helpers/icmodcalendar.php
~ site/helpers/icmodel.php
~ site/views/list/tmpl/default.xml
~ site/views/list/tmpl/event.php
~ site/views/list/tmpl/registration.php


iCagenda 3.1.4 <small style="font-weight:normal;">(2013.08.13)</small>
================================================================================
# Fixed : bug in function for detecting wrong dates entered by user, which was not always working as expected, depending of time setting in joomla config
# Fixed : change in function for globalized date format of month and of day, to prevent some errors due to locale (Russian...)
# Fixed : Not sending notification email to the registered user (if his email address is entered and required)
+ Added : Control of event ID to prevent spamming emails to administrator by a robot (notification email admin)
~ Changed : Translation of Date in current language (admin - list of events)

* Changed files in 3.1.4
~ admin/tables/event.php
~ admin/views/events/tmpl/default.php
~ site/helpers/icmodcalendar.php
~ site/helpers/icmodel.php
~ site/themes/packs/default/css/default_module.css
~ site/themes/packs/ic_rounded/css/ic_rounded_module.css


iCagenda 3.1.3 <small style="font-weight:normal;">(2013.08.09)</small>
================================================================================
# Fixed : global option to hide the participants list not working properly
# Fixed : notice message above registration option field, in event edit
~ MODULE iC calendar : changed, access levels control, to speed up loading of pages with calendar
+ MODULE iC calendar : loading picture when charging a new month

* Changed files in 3.1.3
~ admin/models/fields/modal/ph_regbt.php
~ modules/mod_iccalendar/js/function.js
~ modules/mod_iccalendar/mod_iccalendar.php
~ site/helpers/icmodcalendar.php
~ site/helpers/icmodel.php
~ site/themes/packs/default/css/default_module.css
~ site/themes/packs/ic_rounded/css/ic_rounded_module.css
~ (added) site/themes/packs/default/images/ic_load.png
~ (added) site/themes/packs/ic_rounded/images/ic_load.png


iCagenda 3.1.2 <small style="font-weight:normal;">(2013.08.05)</small>
================================================================================
! Important editing of thumbnails generator (List of events in admin, Calendar module, and Event List module). Now, file renaming for thumbnails (remove all special caracters to get a clean url for image), and copy of distant pictures (to prevent broken link). Accepted as image extensions (File Types) for event image : jpg, jpeg, png, gif, bmp
# Fixed : Slow change of month of the calendar (thumbnail generator error function)
# Fixed : Slow display of events in module iC Event List (Pro Version)
~ changed : [J3 issue] jQuery UI version in admin, from 1.9.2 to 1.8.23 to prevent a conflict with description tooltip (appeared since joomla 3.1.4)

* Changed files in 3.1.2
~ admin/views/event/tmpl/edit.php
~ admin/views/events/tmpl/default.php
~ media/scripts/icthumb.php
~ script.icagenda.php
~ site/helpers/icmodcalendar.php


iCagenda 3.1.1 <small style="font-weight:normal;">(2013.07.29)</small>
================================================================================
# Fixed : Wrong filtering of Viewing Access Levels in list of events page
# Fixed : error in modules (front-end), when url to image is broken or invalid
~ changed : url of image when sharing on facebook (other enhancements planned)

* Changed files in 3.1.1
~ admin/views/icagenda/view.html.php
~ script.icagenda.php
~ site/helpers/icmodcalendar.php
~ site/helpers/icmodel.php
~ site/views/list/tmpl/event.php


iCagenda 3.1.0 <small style="font-weight:normal;">(2013.07.26)</small>
================================================================================
! New : Automatic thumbnails generator in modules (some options, and enhancements will be added later in theme packs)
# Fixed : Issues with J3 after upgrade from joomla 3.1.x to 3.1.4 (error 500 default layout missing, and JFile not found)
# Fixed : not sending admin notification email (error in 3.0.1 and 3.0 pre-releases)
# Fixed : No updating of Next Date when menu set to Upcoming Events
# Fixed : participant slide effect and display options not working
+ Added : Global Option for email field in frontend registration (required or not)
~ many code review

* Changed files in 3.1.0
~ admin/config.xml
~ admin/models/categories.php
~ admin/models/fields/modal/ph_regbt.php
~ admin/tables/event.php
~ admin/views/events/tmpl/default.php
~ admin/views/icagenda/view.html.php
~ media/scripts/icthumb.php
~ script.icagenda.php
~ site/helpers/icmodcalendar.php
~ site/helpers/icmodel.php
~ site/models/list.php
~ site/themes/packs/default/default_event.php
~ site/themes/packs/default/css/default_component.css
~ site/themes/packs/ic_rounded/ic_rounded_event.php
~ site/themes/packs/ic_rounded/css/ic_rounded_component.css
~ site/views/list/tmpl/registration.php


iCagenda 3.0.1 <small style="font-weight:normal;">(2013.07.04)</small>
================================================================================
# Fixed : auto-play of the tutorial video on Chrome and Safari (the video should not autoplay)
# Fixed : missing admin pagination in categories list
# Fixed : buttons display over the datepicker (time show/hide button activated)

* Changed files in 3.0.1
~ admin/add/css/jquery-ui-1.8.17.custom.css
~ admin/views/categories/tmpl/default.php
~ admin/views/categories/view.html.php
~ admin/views/event/tmpl/edit.php
~ admin/views/event/view.html.php


iCagenda 3.0 RC <small style="font-weight:normal;">(2013.06.30)</small>
================================================================================
# Fixed : Thumbnail generator in events list admin : error when using a distant url
# Fixed : Position and zooming in admin, in events created before update
# Fixed : Colors of options buttons in event admin edit : not always visible, in events created before update
# Fixed : Theme ic_rounded : problem of display with long title
+ Added : Custom text option for registration button
+ Added : Control if link to event picture is valid, in admin
~ updated : display in Global Options of the component and modules


iCagenda 3.0 beta 1 <small style="font-weight:normal;">(2013.06.09)</small>
================================================================================
! First beta version compatible with Joomla 3 and Joomla 2.5

* Changed files in 3.0
! Given that this new version brings compatibility with Joomla 3, all php files were reviewed to allow dual Joomla 2.5 / 3.x compatibility. Other files were also reviewed, with a major overhaul of logic and graphic structure of iCagenda. The list of modified files is reset with this new version 3.0 of iCagenda and the list of modified files will be detailed again from future release 3.0.1


iCagenda v2 ChangeLog <small style="font-weight:normal;">(2012.12.31 > 2013.05.29)</small>
? <a href="http://icagenda.joomlic.com/docs/changelog/87-v2-changelog" target="_blank" style="color:#fff">http://icagenda.joomlic.com/docs/changelog/87-v2-changelog</a>

iCagenda v1 ChangeLog <small style="font-weight:normal;">(2012.08.07 > 2012.08.29)</small>
? <a href="http://icagenda.joomlic.com/docs/changelog/89-v1-changelog" target="_blank" style="color:#fff">http://icagenda.joomlic.com/docs/changelog/89-v1-changelog</a>

;
components/com_icagenda/utilities/theme/theme.php000060400000010616152453623450016263 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     iCagenda
 * @subpackage  utilities
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-07-13
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * class icagendaTheme
 */
class icagendaTheme
{
	/**
	 * Function to Check Theme Packs Compatibility
	 *
	 * @return	list of Incompatible Theme Packs
	 *
	 * @since	3.4.0
	 */
	static public function checkThemePacks()
	{
		// Check Theme Packs Compatibility
		icagendaTheme::checkIncompatibleThemePacks('CUSTOM_FIELDS',
													'event',
													'COM_ICAGENDA_TITLE_CUSTOMFIELDS',
													'http://www.icagenda.com/theme-pack-upgrade/3-4-0-add-custom-fields');

		icagendaTheme::checkIncompatibleThemePacks('FEATURES_ICONS',
													'events',
													'COM_ICAGENDA_TITLE_FEATURES',
													'http://www.icagenda.com/theme-pack-upgrade/3-4-0-add-feature-icons');
	}
	/**
	 * Function to set an alert message if a string is missing in a theme pack
	 *
	 * @params	$string				string to be checked
	 * 			$file_name			file to be tested
	 * 			$functionnality		functionnality not usable with theme pack
	 *
	 * @return	list of Incompatible Theme Packs
	 *
	 * @since	3.4.0
	 */
	static public function checkIncompatibleThemePacks($string, $file_name, $functionnality, $info_url = null)
	{
		$app = JFactory::getApplication();

		// Render list of incompatible Theme Packs
		$list = self::incompatibleList($string, $file_name);

		if ($list)
		{
			if (version_compare(JVERSION, '3.0', 'lt'))
			{
				$im_list	= implode('<br /> - ', $list);
				$setlist	= ' - '.$im_list.' ';
			}
			else
			{
				$im_list	= implode('</li><li>', $list);
				$setlist	= '<ul><li>'.$im_list.'</li></ul>';
			}

			$title = 'COM_ICAGENDA_THEME_PACKS_COMPATIBILITY';
			$description = 'COM_ICAGENDA_THEME_PACKS_INCOMPATIBLE_ALERT';

			// Set Alert Message
			$alert	= array();

			if (count($list) >= 1)
			{
				$alert[]	= '<div style="clear:both">';
				$alert[]	=  '<b>'.JText::_( $title ).'</b>';
				$alert[]	= '<p>';
				$alert[]	=  JText::sprintf( $description, '<strong>' . JText::_($functionnality) . '</strong>' );
				if ($info_url) $alert[]	=  ' <a class="modal" rel="{size: {x: 700, y: 500}, handler:\'iframe\'}" href="'.$info_url.'">' .JText::_( 'IC_MORE_INFORMATION' ). '</a>';
				$alert[]	= '</p>';

				$alert[]	= '<p>';
				$alert[]	= $setlist;
				$alert[]	= '</p>';

				$alert[]	= '</div>';
			}

			$alert_message = implode("\n", $alert);

			$app->enqueueMessage($alert_message, 'warning');
		}
	}

	/*
	 * Function to check if 'string' is defined inside the file THEME_$file.php for each Theme Pack.
	 *
	 * @return	list of incompatible Theme Packs.
	 *
	 * @since	3.4.0
	 */
	static public function incompatibleList($string, $file_name)
	{
		$array_themes = Array();

		$dirname = JPATH_SITE.'/components/com_icagenda/themes/packs';

		if (ini_get('allow_url_fopen') && file_exists($dirname))
		{
			$handle = opendir($dirname);

			while (false !== ($theme = readdir($handle)))
			{
				if ( !is_file($dirname.$theme)
					&& $theme!= '.'
					&& $theme!='..'
					&& $theme!='index.php'
					&& $theme!='index.html'
					&& $theme!='.DS_Store'
					&& $theme!='.thumbs' )
				{
					$day_php = $dirname.'/'.$theme.'/'.$theme.'_day.php';
					$event_php = $dirname.'/'.$theme.'/'.$theme.'_event.php';
					$events_php = $dirname.'/'.$theme.'/'.$theme.'_events.php';
					$registration_php = $dirname.'/'.$theme.'/'.$theme.'_registration.php';

					$array_files_php = array($day_php, $event_php, $events_php, $registration_php);

					$count = 0;

					foreach ($array_files_php AS $file_php)
					{
						if (iCFile::hasString($string, $file_php))
						{
							$count = $count+1;
						}
					}

					if ($count < 1)
					{
						array_push($array_themes, $theme);
					}
				}
			}

			$handle = closedir($handle);
		}

		sort($array_themes);

		if ($array_themes) return $array_themes;

		return false;
	}
}
components/com_icagenda/utilities/theme/index.html000060400000000037152453623450016441 0ustar00<!DOCTYPE html><title></title>
components/com_icagenda/utilities/info/info.php000060400000002430152453623450015740 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     iCagenda
 * @subpackage  utilities
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.6 2015-05-17
 * @since       3.5.6
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * class icagendaInfo
 */
class icagendaInfo
{
	/**
	 * Function to add comment with iCagenda version (used for faster support)
	 *
	 * @since	3.4.0
	 */
	static public function commentVersion()
	{
		$params		= JComponentHelper::getParams('com_icagenda');
		$release	= $params->get('release', '');
		$icsys		= $params->get('icsys', 'core');

		$icagenda	= 'iCagenda ' . strtoupper($icsys) . ' ' . $release;

		if ($icsys == 'core')
		{
			$icagenda.= ' by Jooml!C - http://www.joomlic.com';
		}

		echo "<!-- " . $icagenda . " -->";

		return true;
	}
}
components/com_icagenda/utilities/info/index.html000060400000000037152453623450016272 0ustar00<!DOCTYPE html><title></title>
components/com_icagenda/utilities/ajax/ajax.php000060400000023371152453623450015727 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     iCagenda
 * @subpackage  utilities
 * @copyright   Copyright (c)2014-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.9 2015-07-30
 * @since       3.5.9
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * class icagendaAjax
 */
class icagendaAjax
{
	/**
	 * Function to return options for date select, depending of event
	 *
	 * @since	3.5.9
	 */
	static public function getOptionsEventDates($view = null, $id = null)
	{
		$jinput		= JFactory::getApplication()->input;
		$regid		= $jinput->get('regid', '0');
		$eventid	= $jinput->get('eventid', '0');

		$data	= JFactory::getApplication()->getUserState('com_icagenda.' . $view . '.data', array());
		$date	= isset($data['date']) ? $data['date'] : '';

		$date_format_global	= JComponentHelper::getParams('com_icagenda')->get('date_format_global', 'Y - m - d');
		$separator			= JComponentHelper::getParams('com_icagenda')->get('date_separator', ' ');

		if ($eventid != 0 && $view == 'mail')
		{
			$db		= JFactory::getDbo();
			$query	= $db->getQuery(true);
			$query->select('r.id as reg_id, r.date AS reg_date, r.period AS reg_period, r.eventid AS reg_eventid, sum(r.people) AS reg_count')
				->from('`#__icagenda_registration` AS r');
			$query->select('e.startdate AS startdate, e.enddate AS enddate, e.weekdays AS weekdays')
				->join('LEFT', $db->quoteName('#__icagenda_events') . ' AS e ON e.id = r.eventid');
			$query->where('r.state = 1');
			$query->where('r.email <> ""');
			$query->group('r.date');
			$query->where('r.eventid = ' . (int) $eventid);
			$db->setQuery($query);

			$result = $db->loadObjectList();
		}
		elseif ($view == 'registration')
		{
			$db	= JFactory::getDbo();

			$query = $db->getQuery(true);
			$query->select('next AS next, dates AS dates,
							startdate AS startdate, enddate AS enddate, weekdays AS weekdays,
							id AS id, state AS state, access AS access, params AS params');
			$query->from('`#__icagenda_events` AS e');
			$query->where(' e.id = ' . $eventid);

			$db->setQuery($query);

			$i = $db->loadObject();

			if ($regid != 0)
			{
				$reg_query	= $db->getQuery(true);
				$reg_query->select('r.id as reg_id, r.date AS reg_date, r.period AS reg_period, r.eventid AS reg_eventid')
					->from('`#__icagenda_registration` AS r');
				$reg_query->where('r.id = ' . (int) $regid);
				$db->setQuery($reg_query);

				$obj = $db->loadObject();

				$reg_date	= $obj->reg_date;
				$reg_period	= $obj->reg_period;
			}
			else
			{
				$reg_date	= '';
				$reg_period	= '';
			}
		}

		$options = '';

		if ($view == 'mail')
		{
			$options.= '<option value="">' . JText::_('COM_ICAGENDA_SELECT_DATE') . '</option>';
			$options.= '<option value="all"';
			$options.= ($date == 'all') ? ' selected="selected"' : '';
			$options.= '>' . strtoupper(JText::_('COM_ICAGENDA_REGISTRATION_ALL_DATES')) . '</option>';
		}
		elseif ($i && $view == 'registration')
		{
			$options.= self::getOptionsAllDates($i, 'registration', $reg_date, $reg_period);
		}

		if (isset($result) && $view == 'mail')
		{
			foreach($result as $r)
			{
				// Full period (no single date selected, supposes registration for full period)
				if ( ! $r->reg_date && $r->reg_period == 0)
				{
					// Check the period if is separated into individual dates
					$is_full_period = ($r->weekdays || $r->weekdays == '0') ? false : true;

					if ($is_full_period
						&& iCDate::isDate($r->startdate)
						&& iCDate::isDate($r->enddate))
					{
						$option_value = '0';
						$option_date = self::formatDate($r->startdate) . ' &#x279c; ' . self::formatDate($r->startdate);
					}
					else
					{
						$option_value	= '0';
						$option_date	= JText::_( 'COM_ICAGENDA_ADMIN_REGISTRATION_FOR_ALL_PERIOD' );
					}
				}

				// All dates of the event (single dates + period)
				elseif ( ! $r->reg_date && $r->reg_period == 1)
				{
					$option_value	= '1';
					$option_date	= JText::_( 'COM_ICAGENDA_ADMIN_REGISTRATION_FOR_ALL_DATES' );
				}

				// One date selected (from single dates or split period into single dates)
				else
				{
					if (iCDate::isDate($r->reg_date))
					{
						$regDate		= iCGlobalize::dateFormat($r->reg_date, $date_format_global, $separator);
						$time			= date('H:i', strtotime($r->reg_date));
						$regTime		= ($time && $time != '00:00') ? ' - ' . $time : '';
					}

					$option_value	= $r->reg_date;

					// Date format (global option).
					// NOTE: Date saved in database with versions before 3.3.8 can not be formatted
					//       Will return a string (date in old format) with double quote.
					$option_date	= iCDate::isDate($r->reg_date) ? $regDate . $regTime : '"' . $r->reg_date . '"';
				}

				$options.= '<option value="' . $option_value . '"';
				$options.= ($date == $option_value) ? ' selected="selected"' : '';
				$options.= '>' . $option_date . ' (&#10003;' . $r->reg_count . ')</option>';
			}
		}

		echo $options;

		Jexit();
	}

	static public function getOptionsAllDates($i, $view = null, $reg_date = null, $reg_period = null)
	{
		$options = '';

		if ($i)
		{
			// Set Event Params
			$eventparam		= new JRegistry($i->params);

			$typeReg		= $eventparam->get('typeReg');

			// Registration type for event is set to "All dates of the event"
			if ($typeReg == '2')
			{
				if ( $reg_period != 1 )
				{
					$options.= '<option value="' . $reg_date . '" selected="selected">' . JText::_('COM_ICAGENDA_SELECT_DATE') . '</option>';
					$options.= '<option value="update"';
					$options.= '>' . JText::_('COM_ICAGENDA_ADMIN_REGISTRATION_FOR_ALL_DATES') . '</option>';
				}
				else
				{
					$options.= '<option value=""';
					$options.= ' selected="selected"';
					$options.= '>' . JText::_('COM_ICAGENDA_ADMIN_REGISTRATION_FOR_ALL_DATES') . '</option>';
				}
			}
			else
			{
				if ( ( ! $reg_date && $reg_period == 1)
					|| ($reg_date && ! iCDate::isDate($reg_date))
					|| ( ! $reg_date && $reg_period == 0)
					|| ( iCDate::isDate($reg_date) && $reg_period == 1) )
				{
					$options.= '<option value="' . $reg_date . '"';
					$options.= ' selected="selected"';
					$options.= '>' . JText::_('COM_ICAGENDA_SELECT_DATE') . '</option>';
				}

				// Declare AllDates array
				$AllDates		= array();

				// Get WeekDays setting
				$WeeksDays		= iCDatePeriod::weekdaysToArray($i->weekdays);

				// If Single Dates, added each one to All Dates for this event
				$singledates	= iCString::isSerialized($i->dates) ? unserialize($i->dates) : array();

				foreach($singledates as $sd)
				{
					if (iCDate::isDate($sd))
					{
						array_push($AllDates, $sd);
					}
				}

				// If Period Dates, added each one to All Dates for this event (filter week Days, and if date not null)
				$perioddates = iCDatePeriod::listDates($i->startdate, $i->enddate);

				if (isset($perioddates)
					&& is_array($perioddates))
				{
					// Check the period if is separated into individual dates
					$is_full_period = ($i->weekdays || $i->weekdays == '0') ? false : true;

					if ($is_full_period
						&& iCDate::isDate($i->startdate)
						&& iCDate::isDate($i->enddate))
					{
						$value_datetime = '';

						$options.= '<option value="' . $value_datetime . '"';

						if ($reg_date == '' && $reg_period != 1)
						{
							$date_exist = true;
							$options.= ' selected="selected"';
						}

						$options.= '>' . self::formatDate($i->startdate) . ' &#x279c; ' . self::formatDate($i->startdate) . '</option>';
					}
					else
					{
						foreach ($perioddates as $Dat)
						{
							if (in_array(date('w', strtotime($Dat)), $WeeksDays))
							{
								// May not work in php < 5.2.3 (should return false if date null since 5.2.4)
								$isValid = iCDate::isDate($Dat);

								if ($isValid)
								{
									$SingleDate = date('Y-m-d H:i', strtotime($Dat));
									array_push($AllDates, $SingleDate);
								}
							}
						}
					}
				}

				// get Time Format
				$timeformat = JComponentHelper::getParams('com_icagenda')->get('timeformat', '1');

				$lang_time = ($timeformat == 1) ? 'H:i' : 'h:i A';

				if ( ! empty($AllDates))
				{
					sort($AllDates);
				}

				foreach($AllDates as $date)
				{
					if (iCDate::isDate($date))
					{
						$value_datetime = date('Y-m-d H:i:s', strtotime($date));

						$options.= '<option value="' . $value_datetime . '"';

						if ($reg_date == $value_datetime)
						{
							$date_exist = true;
							$options.= ' selected="selected"';
						}

						$options.= '>' . self::formatDate($date) . ' - ' . date($lang_time, strtotime($date)) . '</option>';
					}
				}
			}

			return $options;
		}

		return false;
	}


	// Function to get Format Date (using option format, and translation)
	static public function formatDate($date)
	{
		// Date Format Option (Global Component Option)
		$date_format_global	= JComponentHelper::getParams('com_icagenda')->get('date_format_global', 'Y - m - d');
		$format				= ($date_format_global != 0) ? $date_format_global : 'Y - m - d'; // Previous 3.5.6 setting

		// Separator Option
		$separator			= JComponentHelper::getParams('com_icagenda')->get('date_separator', ' ');

		if ( ! is_numeric($format))
		{
			// Update old Date Format options of versions before 2.1.7
			$format = str_replace(array('nosep', 'nosep', 'sepb', 'sepa'), '', $format);
			$format = str_replace('.', ' .', $format);
			$format = str_replace(',', ' ,', $format);
		}

		$dateFormatted = iCGlobalize::dateFormat($date, $format, $separator);

		return $dateFormatted;
	}
}
components/com_icagenda/utilities/ajax/index.html000060400000000037152453623450016262 0ustar00<!DOCTYPE html><title></title>
components/com_icagenda/utilities/categories/index.html000060400000000037152453623450017464 0ustar00<!DOCTYPE html><title></title>
components/com_icagenda/utilities/categories/categories.php000060400000002671152453623450020333 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     iCagenda
 * @subpackage  utilities
 * @copyright   Copyright (c)2014-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-05-12
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * class icagendaCategories
 */
class icagendaCategories
{
	/**
	 * Function to return list of categories
	 *
	 * @access	public static
	 * @param	$state (if not defined, state is published ('1'))
	 * @return	list array of categories
	 *
	 * @since   1.0.0
	 */
	static public function getList($state = null)
	{
		// Preparing connection to db
		$db		= JFactory::getDbo();

		// Preparing the query
		$query	= $db->getQuery(true);
		$query->select('c.color AS color, c.title AS title')
			->from('#__icagenda_category AS c');

		if ($state) $query->where("(c.state = '$state')");

		$db->setQuery($query);
		$list = $db->loadObjectList();

		if ($list)
		{
			return $list;
		}
		else
		{
			return false;
		}
	}
}
components/com_icagenda/utilities/params/index.html000060400000000037152453623450016622 0ustar00<!DOCTYPE html><title></title>
components/com_icagenda/utilities/params/params.php000060400000005135152453623450016625 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     iCagenda
 * @subpackage  utilities
 * @copyright   Copyright (c)2014-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-12-21
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * class icagendaParams
 */
class icagendaParams
{
	/**
	 * Function to encrypt user pro password
	 *
	 * @access	public static
	 * @param	$id - id of the event
	 * @return	list array of access levels, approval and event access status
	 *
	 * @since	3.4.0
	 */
	static public function encryptPassword()
	{
		$params = JComponentHelper::getParams( 'com_icagenda' );
		$icsys = $params->get('icsys', 'core');

		if ($icsys == 'pro')
		{
			jimport('joomla.user.helper');

			$crypt1 = JUserHelper::genRandomPassword(2);
			$crypt2 = JUserHelper::genRandomPassword(2);
			$salt_8 = JUserHelper::genRandomPassword(8);
			$salt_16 = JUserHelper::genRandomPassword(16);
			$salt_32 = JUserHelper::genRandomPassword(32);
			$password = $params->get('password', '');

			$is_crypted = substr_count($password, '$');

			if ($is_crypted != 3 && strlen($password) != 0)
			{
				$encoded = base64_encode($password);

				if (strlen($encoded) > 32)
				{
					$salt1 = $salt_16;
					$salt2 = $salt_8;
				}
				elseif (strlen($encoded) < 32 && strlen($encoded) > 16)
				{
					$salt1 = $salt_16;
					$salt2 = $salt_8;
				}
				else
				{
					$salt1 = $salt_32;
					$salt2 = $salt_16;
				}

				$pass_encoded = '$' . $crypt1 . '$' . $crypt2 . '$' . $salt1 . '.' . $encoded . '/' . $salt2;
//				$_pass = str_replace('/', '.', $pass_encoded);
//				$pass_ex = explode('.', $_pass);
//				$decoded = base64_decode($encoded);
				$password = $pass_encoded;

				// Get the params and set the new values
				$params->set('password', $password);

				// Get a new database query instance
				$db = JFactory::getDBO();
				$query = $db->getQuery(true);

				// Build the query
				$query->update('#__extensions AS a');
				$query->set('a.params = ' . $db->quote((string)$params));
				$query->where('a.element = "com_icagenda"');

				// Execute the query
				$db->setQuery($query);
				$db->query();
			}
		}
	}
}
components/com_icagenda/utilities/customfields/customfields.php000060400000040407152453623450021262 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     iCagenda
 * @subpackage  utilities
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.10 2015-08-25
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * class icagendaCustomfields
 */
class icagendaCustomfields
{
	/**
	 * Function to return list of custom fields depending on the parent form
	 *
	 * @access	public static
	 * @param	$parent_form (1 registration, 2 event edit)
	 * 			$state (if not defined, state is published ('1'))
	 * @return	object list array of custom fields depending on the item ID
	 *
	 * @since   3.4.0
	 */
	static public function getListCustomFields($parent_form, $state = null)
	{
		$filter_state = isset($state) ? $state : 1;

		// Create a new query object.
		$db		= JFactory::getDbo();
		$query	= $db->getQuery(true);
		$query->select('cf.slug AS cf_slug, cf.type AS cf_type, cf.options AS cf_options,
						cf.title AS cf_title, cf.type AS cf_type, cf.required AS cf_required')
			->from('#__icagenda_customfields AS cf')
			->where($db->qn('cf.state') . ' = ' . $db->q($filter_state))
			->where($db->qn('cf.parent_form') . ' = ' . $db->q($parent_form))
			->order('cf.ordering ASC');
		$db->setQuery($query);
		$list = $db->loadObjectList();

		if ($list) return $list;

		return false;
	}

	/**
	 * Function to return list of custom fields depending on the item ID
	 *
	 * @access	public static
	 * @param	$id item ID
	 * 			$parent_form (1 registration, 2 event edit)
	 * 			$state (if not defined, state is published ('1'))
	 * @return	object list array of custom fields depending on the item ID
	 *
	 * @since   3.4.0
	 */
	static public function getList($id, $parent_form = null, $state = null)
	{
		$filter_state = isset($state) ? $state : 1;

		// Create a new query object.
		$db		= JFactory::getDbo();
		$query	= $db->getQuery(true);
		$query->select('cf.slug AS cf_slug, cfd.value AS cf_value, cfd.parent_id AS cf_parent_id, cf.title AS cf_title, cf.required AS cf_required')
			->from('#__icagenda_customfields AS cf')
			->leftJoin($db->qn('#__icagenda_customfields_data') . ' AS cfd'
				. ' ON ' . $db->qn('cfd.parent_id') .' = ' . (int)$id
				. ' AND ' . $db->qn('cf.slug') .' = ' . $db->qn('cfd.slug'))
			->where($db->qn('cf.state') . ' = ' . $db->q($filter_state))
			->where($db->qn('cf.parent_form') . ' = ' . $db->q($parent_form))
			->order('cf.ordering ASC');
		$db->setQuery($query);
		$list = $db->loadObjectList();

		if ($list) return $list;

		return false;
	}

	/**
	 * Function to return a list of filled custom fields depending on the item ID
	 *
	 * @access	public static
	 * @param	$id item ID
	 * 			$parent_form (1 registration, 2 event edit)
	 * 			$state (if not defined, state is published ('1'))
	 * @return	object list array of custom fields not empty depending on the item ID
	 *
	 * @since   3.4.0
	 */
	static public function getListNotEmpty($id, $parent_form = null, $state = null)
	{
		$filter_state = isset($state) ? $state : 1;

		// Create a new query object.
		$db		= JFactory::getDbo();
		$query	= $db->getQuery(true);
		$query->select('cfd.slug AS cf_slug, cfd.value AS cf_value, cfd.parent_id AS cf_parent_id, cf.title AS cf_title')
			->from('#__icagenda_customfields_data AS cfd')
			->leftJoin($db->qn('#__icagenda_customfields') . ' AS cf'
				. ' ON ' . $db->qn('cf.slug') .' = ' . $db->qn('cfd.slug'))
			->where($db->qn('cf.state') . ' = ' . $db->q($filter_state));

		if ($parent_form)
		{
			$query->where($db->qn('cfd.parent_form') . ' = ' . $db->q($parent_form));
		}

		$query->where($db->qn('cfd.parent_id') . ' = ' . (int)$id);
		$query->order('cf.ordering ASC');
		$db->setQuery($query);
		$list = $db->loadObjectList();

		if ($list) return $list;

		return false;
	}

	/**
	 * Return the HTML body of Custom fields for this parent form (parent_id)
	 *
	 * @return HTML fields
	 *
	 * @since	3.4.0
	 */
	static public function loader($parent_form)
	{
		$app = JFactory::getApplication();
		$session = JFactory::getSession();
		$custom_fields = $session->get('custom_fields');

		$customfields = icagendaCustomfields::getCustomfields($parent_form);

		$cf_display = '';

		if ( $customfields )
		{
			foreach ($customfields as $icf)
			{
				if (empty($icf->value)) $icf->value = '';

//				if ($custom_fields) $icf->value = $custom_fields[$icf->slug];
				if ( $app->isSite() )
				{
					$icf->value = isset($custom_fields[$icf->slug]) ? $custom_fields[$icf->slug] : '';
				}

				$options_required = array('list', 'radio');

				// If type is list or radio, should have options
				if ((in_array($icf->type, $options_required) && $icf->options)
					|| ! in_array($icf->type, $options_required))
				{
					$cf_display.= icagendaCustomfields::displayField(
						$icf->type,
						$icf->title,
						$icf->alias,
						$icf->slug,
						$icf->description,
						$icf->value,
						$icf->options,
						$icf->required
					);
				}
			}

			if ($app->isAdmin()) $cf_display.= '<hr>';
		}
		elseif ( $app->isAdmin() )
		{
			$cf_display.= '<div class="alert alert-info">';
			$cf_display.= JText::_('COM_ICAGENDA_CUSTOMFIELDS_NONE');
			$cf_display.= '</div>';
		}
		elseif ( $app->isSite() )
		{
			return false;
		}

		return $cf_display;
	}

	/**
	 * Gets the custom fields for this form
	 *
	 * @return object list
	 *
	 * @since	3.4.0
	 */
	static public function getCustomfields($parent_form)
	{
		$app = JFactory::getApplication();
		$id = $app->input->getInt('id');

		// Get the database connector.
		$db = JFactory::getDbo();

		$list_slugs = array();

		if ($id)
		{
			// Get the query from the database connector.
			$query = $db->getQuery(true);

			// Build the query
			$query->select('id, slug')
				->from($db->qn('#__icagenda_customfields').' AS cf');
			$query->where($db->qn('cf.parent_form').' = ' .$db->q($parent_form));

			// Run Query
			$db->setQuery($query);

			// Invoke the Query
			$all_slugs = $db->loadObjectList();

			// Create array of custom fields slugs for this event
			foreach ($all_slugs as $s)
			{
				$list_slugs[] = '"' . $s->slug . '"';
			}

			$list_slugs = implode(',', $list_slugs);
		}

		// Get the query from the database connector.
		$query = $db->getQuery(true);

		// Build the query
		$query->select('cf.*')
			->from($db->qn('#__icagenda_customfields').' AS cf');

		if ($id && $list_slugs)
		{
			// Build the query
			$query->select('cfd.value AS value')
				->leftJoin($db->qn('#__icagenda_customfields_data') . ' AS cfd'
					. ' ON (' . $db->qn('cfd.parent_id') . ' = ' . (int)$id
					. ' AND ' . $db->qn('cfd.slug') . ' = ' .$db->qn('cf.slug') . ')')
				->where($db->qn('cf.slug').' IN ('.$list_slugs.')');
		}

		$query->where($db->qn('cf.parent_form').' = ' .$db->q($parent_form));
		$query->where($db->qn('cf.state').' = 1');

		$query->order('cf.ordering ASC');

		// Tell the database connector what query to run.
		$db->setQuery($query);

		// Invoke the query.
		if ($db->loadObjectList()) return $db->loadObjectList();

		return false;
	}

	/**
	 * Create the HTML body of the custom fields
	 *
	 * @return object list
	 *
	 * @since	3.4.0
	 */
	static public function displayField($type, $title, $alias, $slug, $description, $value, $options, $required)
	{
		$options_required = array('list', 'radio');

		// If type is list or radio, should have options
		if (in_array($type, $options_required) && ! $options) return false;

		$app = JFactory::getApplication();
		$view = $app->input->get('view');

		$ic_prefix = $app->isSite() ? 'ic-' : '';
		$ic_data = ($app->isSite() && $view != 'registration') ? 'custom_fields' : 'jform[custom_fields]';

		if (empty($value)) $value = '';
// Remove to get session value frontend		$value = $app->isAdmin() ? $value : '';

		$text_required	= $required ? ' required="true"' : '';
		$list_required	= $required ? ' required' : '';
		$radio_required	= $required ? ' required' : '';

		// Required, '*' after label
		$required_icon = $required ? ' *' : '';

		$class_label = ($type == 'radio') ? $ic_prefix . 'control-label' : '';
		$icTip_custom = $description
			? htmlspecialchars('<strong>' . $title . '</strong><br />' . $description . '')
			: '';
		if ($type == 'list' || $type == 'radio') { $is_list = ' ic-select'; } else { $is_list = ''; }

		$cf_fields = '<div class="' . $ic_prefix . 'control-group clearfix" id="' . $alias . '_alias">';
		$cf_fields.= '<div id="' . $alias . '_message"></div>';
		$cf_fields.= '<div class="' . $ic_prefix . 'control-label">';

		// Label
		$label = '<label';

		if ($app->isAdmin())
		{
			if ($class_label || $icTip_custom)
			{
				if ($icTip_custom) $label.= ' title="" data-original-title="'.$icTip_custom.'"';
				$label.= ' class="';
				if ($icTip_custom) $label.= 'hasTooltip';
				if ($icTip_custom && $class_label) $label.= ' ';
				if ($class_label) $label.= $class_label;
				$label.= '"';
			}
		}

		if ($type != 'radio')
		{
			$label.= ' for="' . $slug . '_slug"';
		}

		$label.= '>';
		$label.= $title;

//		if ($type != 'radio')
//		{
			$label.= $required_icon;
//		}

		$label.= '</label>';

		$cf_fields.= $label;
		$cf_fields.= '</div>';

		$cf_fields.= '<div class="' . $ic_prefix . 'controls' . $is_list . '">';

		// Field Type TEXT
		if ($type == 'text')
		{
			$cf_fields.= '<input type="'.$type.'"';
			$cf_fields.= ' class="input-large"';
			$cf_fields.= ' id="' . $slug . '_slug"';
			$cf_fields.= ' name="' . $ic_data . '['.$slug.']"';
			$cf_fields.= ' value="' . $value . '"';
			$cf_fields.= ' placeholder="' . $options . '"';
			$cf_fields.= $text_required;
			$cf_fields.= ' />';
		}

		// Field Type LIST
		elseif ($type == 'list')
		{
//			$cf_fields.= '<select'.$list_required.' id="' . $slug . '" name="' . $ic_data . '['.$slug.']">';
			$cf_fields.= '<select'.$list_required.' type="list" class="select-large" id="' . $slug . '_slug" name="' . $ic_data . '['.$slug.']">';

			$empty_selected = empty($value) ? ' selected="selected"' : '';

//			$cf_fields.= '<option value=""'.$empty_selected.'>- ' . JText::_('IC_SELECT_AN_OPTION') . ' -</option>';
			$cf_fields.= '<option value="">- ' . JText::_('IC_SELECT_AN_OPTION') . ' -</option>';

			$opts_list = str_replace("\n", "##BREAK##", $options);
			$opts_list = explode("##BREAK##", $opts_list);

			foreach ($opts_list as $opts)
			{
				$opt = explode("=", $opts);

				if ($opt[0] && $opt[1])
				{
					if (empty($value))
					{
						$selected = isset($opt[2]) ? ' selected="selected"' : '';
					}
						else
					{
						$selected = '';
					}

					$cf_fields.= '<option value="'.$opt[0].'"';

					if ($value == $opt[0])
					{
						$cf_fields.= ' selected="selected"';
					}

					$cf_fields.= ''.$selected.'>';
					$cf_fields.= $opt[1].'</option>';
				}
			}
			$cf_fields.= '</select>';
		}

		// Field Type RADIO
		elseif ($type == 'radio')
		{
			$cf_fields.= '<fieldset class="' . $ic_prefix . 'radio ' . $ic_prefix . 'btn-group">';

			$opts_list = str_replace("\n", "##BREAK##", $options);
			$opts_list = explode("##BREAK##", $opts_list);

			foreach ($opts_list as $opts)
			{
				$opt = explode("=", $opts);

				if (($opt[0] || $opt[0] == 0) && $opt[1])
				{
					if (empty($value))
					{
						$checked = isset($opt[2]) ? ' checked="checked"' : '';
						$default = $checked ? $ic_prefix . 'btn-success' : '';
					}
					elseif ($value == $opt[0])
					{
						$checked = '';
						$default = $ic_prefix . 'btn-success';
					}
					else
					{
						$checked = '';
						$default = '';
					}

					$class_btn = $app->isSite() ? 'ic-btn ' : '';

					$cf_fields.= '<label class="' . $class_btn . $default . '">';
					$cf_fields.= '<input type="radio"';
					$cf_fields.= ' id="' . $slug . '_slug"';
					$cf_fields.= ' name="' . $ic_data . '[';
					$cf_fields.= $slug;
					$cf_fields.= ']"';
					$cf_fields.= ' value="'.$opt[0].'"';

					if ($value == $opt[0])
					{
						$cf_fields.= ' checked="checked"';
					}

					$cf_fields.= $checked.'/>';
					$cf_fields.= $opt[1].'</label>';
				}
			}

			$cf_fields.= '</fieldset>';
		}

		if ($icTip_custom && $app->isSite())
		{
			$cf_fields.= ' <span class="iCFormTip iCicon-info-circle" title="' . $icTip_custom . '"></span>';
		}

		$cf_fields.= '</div>';
		$cf_fields.= '</div>';

		return $cf_fields;
	}


	/**
	 * Save Custom Fields to the database if at least one is filled
	 * or update existing data from custom fields.
	 *
	 * @since	3.4.0
	 */
	static public function saveToData($custom_fields, $parent_id, $parent_form, $state = 1, $language = '*')
	{
		// Get the database connector.
		$db = JFactory::getDBO();

		if (isset($custom_fields) && is_array($custom_fields))
		{
			foreach ( $custom_fields as $name => $value )
			{
				$customfields_data = new stdClass();
				$customfields_data->slug = $name;
				$customfields_data->value = $value;
				$customfields_data->state = $state;
				$customfields_data->parent_form = $parent_form;
				$customfields_data->parent_id = $parent_id;
				$customfields_data->language = $language;

				$query = $db->getQuery(true)
					->select('id')
					->from($db->qn('#__icagenda_customfields_data'))
					->where($db->qn('slug') . ' = ' . $db->q($customfields_data->slug))
					->where($db->qn('parent_form') . ' = ' . $db->q($customfields_data->parent_form))
					->where($db->qn('parent_id') . ' = ' . $db->q($customfields_data->parent_id));
				$db->setQuery($query);
				$id_exists = $db->loadResult();

				if ( ! $id_exists && $customfields_data->value)
				{
					$db->insertObject( '#__icagenda_customfields_data', $customfields_data, 'id' );
				}
				elseif (empty($customfields_data->value))
				{
					$query = $db->getQuery(true);

					// Delete any empty slug records from the __icagenda_customfields_data table if exists
					$conditions = array(
    					$db->quoteName('parent_id') . ' = ' . $db->quote($customfields_data->parent_id),
    					$db->quoteName('slug') . ' = ' . $db->quote($customfields_data->slug)
					);

					$query->delete($db->quoteName('#__icagenda_customfields_data'));
					$query->where($conditions);

					$db->setQuery($query);
					$db->execute($query);

					if ( ! $db->execute())
					{
						return false;
					}
				}
				else
				{
					$customfields_data->id = $id_exists;
					$db->updateObject('#__icagenda_customfields_data', $customfields_data, 'id');
				}
			}
		}
	}

	/**
	 * Delete Custom Fields from the database
	 * or update existing data from custom fields.
	 *
	 * @since	3.5.6
	 */
	static public function deleteData($parent_id, $parent_form)
	{
		// Get the database connector.
		$db = JFactory::getDbo();

		// Delete any unwanted customfields records from the __icagenda_customfields_data table
		$query = $db->getQuery(true);
		$query->delete($db->qn('#__icagenda_customfields_data'));
		$query->where('parent_id = ' . (int) $parent_id);
		$query->where('parent_form = ' . (int) $parent_form);

		$db->setQuery($query);
		$db->execute($query);

		if ( ! $db->execute())
		{
			return false;
		}

		return true;
	}

	/**
	 * Clean Custom Fields from the database (fix for previous versions)
	 *
	 * @since	3.5.6
	 */
	static public function cleanData($parent_form)
	{
		// Get the database connector.
		$db = JFactory::getDbo();

		// Get Registrations ids
		if ($parent_form == 1)
		{
			$query = $db->getQuery(true)
				->select('id')
				->from($db->qn('#__icagenda_registration'));
			$db->setQuery($query);
			$list = $db->loadColumn();
		}

		// Get Events ids
		elseif ($parent_form == 2)
		{
			// Get Registrations ids
			$query = $db->getQuery(true)
				->select('id')
				->from($db->qn('#__icagenda_events'));
			$db->setQuery($query);
			$list = $db->loadColumn();
		}

		$parent_ids = isset($list) && is_array($list) ? implode(',', $list) : '';

		// Delete any unwanted customfields records from the __icagenda_customfields_data table
		$query = $db->getQuery(true);
		$query->delete($db->qn('#__icagenda_customfields_data'));
		$query->where('parent_form = ' . (int) $parent_form);
		$query->where('parent_id NOT IN (' . $parent_ids . ')');

		$db->setQuery($query);
		$db->execute($query);

		if ( ! $db->execute())
		{
			return false;
		}

		return true;
	}
}
components/com_icagenda/utilities/customfields/index.html000060400000000037152453623450020040 0ustar00<!DOCTYPE html><title></title>
components/com_icagenda/utilities/class/class.php000060400000003322152453623450016265 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     iCagenda
 * @subpackage  utilities
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-06-29
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * class icagendaClass
 */
class icagendaClass
{
	/**
	 * Function to set an alert message if a class from Utilities is not loaded
	 *
	 * @since	3.4.0
	 */
	static public function isLoaded($class = null)
	{
		if (!class_exists($class) && $class)
		{
			$app = JFactory::getApplication();

			$alert_message = JText::sprintf('ICAGENDA_CLASS_NOT_FOUND', '<strong>' . $class . '</strong>') . '<br />'
							. JText::_('ICAGENDA_IS_NOT_CORRECTLY_INSTALLED');

			// Get the message queue
			$messages = $app->getMessageQueue();

			$display_alert_message = false;

			// If we have messages
			if (is_array($messages) && count($messages))
			{
				// Check each message for the one we want
				foreach ($messages as $key => $value)
				{
					if ($value['message'] == $alert_message)
					{
						$display_alert_message = true;
					}
				}
			}

			if (!$display_alert_message)
			{
				$app->enqueueMessage($alert_message, 'error');
			}

			return false;
		}
		else
		{
			return true;
		}
	}
}
components/com_icagenda/utilities/class/index.html000060400000000037152453623450016444 0ustar00<!DOCTYPE html><title></title>
components/com_icagenda/utilities/form/index.html000060400000000037152453623450016302 0ustar00<!DOCTYPE html><title></title>
components/com_icagenda/utilities/form/form.php000060400000032521152453623450015764 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     iCagenda
 * @subpackage  utilities
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.10 2015-08-14
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * class icagendaForm
 */
class icagendaForm
{
	/**
	 * Function to return script validation for a form used in iCagenda
	 *
	 * @access	public static
	 * @param	$parent_form form type ID ('1' registration, '2' event edit or new)
	 * 			// $form_location ('site' or 'admin')
	 * @return	script
	 *
	 * @since   3.4.0
	 */
	static public function submit($parent_form = null)
	{
		if (!$parent_form) return false;
		if ($parent_form == 1) $parent_name = 'registration';
		if ($parent_form == 2) $parent_name = 'event';

		$app	= JFactory::getApplication();
		$lang	= JFactory::getLanguage();

		$id_suffix = ($lang->getTag() == 'fa-IR') ? '_jalali' : '';

		if ($app->isAdmin())
		{
			$params		= JComponentHelper::getParams('com_icagenda');
		}
		elseif ($app->isSite())
		{
			$params		= $app->getParams();
		}

		$submit_periodDisplay = $params->get('submit_periodDisplay', 1);
		$submit_datesDisplay = $params->get('submit_datesDisplay', 1);

		JText::script('COM_ICAGENDA_REGISTRATION_NO_EVENT_SELECTED_ALERT');
		JText::script('COM_ICAGENDA_FORM_NC');
		JText::script('COM_ICAGENDA_FORM_NO_DATES_ALERT');
		JText::script('COM_ICAGENDA_TERMS_AND_CONDITIONS_NOT_CHECKED_REGISTRATION');
		JText::script('COM_ICAGENDA_ALERT_TEXT_EXCEEDS_CHARACTER_LIMIT');

		$prefix_id = $app->isAdmin() ? 'jform_' : '';

		// Copyleft function strpos
		// +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
		// +   improved by: Onno Marsman
		// +   bugfixed by: Daniel Esteban
		// +   improved by: Brett Zamir (http://brett-zamir.me)
		// +     edited by: Cyril Rezé (http://www.joomlic.com)
		// *     example 1: strpos('Kevin van Zonneveld', 'e', 5);
		// *     returns 1: 14

		$ic_script = array();

		if ( $app->isSite() )
		{
			$ic_script[] = '	function iCheckForm() {';
			$ic_script[] = '		var agree = document.getElementById("formAgree");';

			if ($parent_form == 2)
			{
				$ic_script[] = '		if (agree.checked) {';
				$ic_script[] = '			document.getElementById("tos").value = "checked";';
				$ic_script[] = '		}';
			}
		}
		elseif ( $app->isAdmin() )
		{
			$ic_script[] = 'jQuery(document).ready(function() {';
			$ic_script[] = '	Joomla.submitbutton = function(task) {';
		}

		if ($parent_form == 1 && $app->isAdmin())
		{
			$ic_script[] = '		var eventid = document.getElementById("' . $prefix_id . 'eventid_id");';
			$ic_script[] = '		if ((eventid.value == "") && (task != "' . $parent_name . '.cancel")) {';
			$ic_script[] = '			alert(Joomla.JText._("COM_ICAGENDA_REGISTRATION_NO_EVENT_SELECTED_ALERT"));';
			$ic_script[] = '			return false;';
			$ic_script[] = '		}';
		}

		if ($parent_form == 2)
		{
			$ic_script[] = '		function strpos (haystack, needle, offset) {';
			$ic_script[] = '			var i = (haystack + "").indexOf(needle, (offset || 0));';
			$ic_script[] = '			return i === -1 ? false : i;';
			$ic_script[] = '		}';

			$ic_script[] = '		var nodate = "0";';
			$ic_script[] = '		var noserialdate = \'a:1:{i:0;s:19:"0000-00-00 00:00:00";}\';';
			$ic_script[] = '		var noserialdate2 = \'a:1:{i:0;s:16:"0000-00-00 00:00";}\';';
			$ic_script[] = '		var emptydatetime = "0000-00-00 00:00:00";';

			if ($submit_periodDisplay && $app->isSite())
			{
				$ic_script[] = '		var startDate = document.getElementById("startdate' . $id_suffix . '");';
				$ic_script[] = '		var endDate = document.getElementById("enddate' . $id_suffix . '");';
				$ic_script[] = '		var isValidStartDate = strpos(startDate.value, nodate, 0);';
				$ic_script[] = '		var isValidEndDate = strpos(endDate.value, nodate, 0);';
			}
			elseif ($app->isAdmin())
			{
				$ic_script[] = '		var startDate = document.getElementById("startdate' . $id_suffix . '");';
				$ic_script[] = '		var endDate = document.getElementById("enddate' . $id_suffix . '");';
				$ic_script[] = '		var isValidStartDate = strpos(startDate.value, nodate, 0);';
				$ic_script[] = '		var isValidEndDate = strpos(endDate.value, nodate, 0);';
			}
			if ($submit_datesDisplay && $app->isSite())
			{
				$ic_script[] = '		var Dates = document.getElementById("' . $prefix_id . 'dates_id");';
				$ic_script[] = '		var isValidSingleDate = strpos(Dates.value, nodate, 2);';
			}
			elseif ($app->isAdmin())
			{
				$ic_script[] = '		var Dates = document.getElementById("' . $prefix_id . 'dates_id");';
				$ic_script[] = '		var isValidSingleDate = strpos(Dates.value, nodate, 2);';
			}

			$ic_script[] = '		if (';

			if ($submit_datesDisplay && $app->isSite())
			{
				$ic_script[] = '			( !isValidSingleDate';
				$ic_script[] = '			|| (Dates.value == noserialdate && isValidSingleDate)';
				$ic_script[] = '			|| (Dates.value == noserialdate2 && isValidSingleDate)';
				$ic_script[] = '			|| Dates.value == "" )';
			}
			elseif ($app->isAdmin())
			{
				$ic_script[] = '			( !isValidSingleDate';
				$ic_script[] = '			|| (Dates.value == noserialdate && isValidSingleDate)';
				$ic_script[] = '			|| (Dates.value == noserialdate2 && isValidSingleDate)';
				$ic_script[] = '			|| Dates.value == "" )';
			}

			if ($submit_periodDisplay && $submit_datesDisplay && $app->isSite())
			{
				$ic_script[] = '			&& ';
			}

			if ($submit_periodDisplay && $app->isSite())
			{
				$ic_script[] = '			( (!isValidStartDate || (startDate.value == emptydatetime)) )';
			}
			elseif ($app->isAdmin())
			{
				$ic_script[] = '			&& ( (!isValidStartDate || (startDate.value == emptydatetime)) )';
			}

			if ($app->isAdmin()) $ic_script[] = '			&& ( task != "' . $parent_name . '.cancel" ) ';

			$ic_script[] = '		) {';
			$ic_script[] = '			alert(Joomla.JText._("COM_ICAGENDA_FORM_NO_DATES_ALERT"));';
			$ic_script[] = '			document.getElementById("message_error").innerHTML = "'
											. JText::_("COM_ICAGENDA_FORM_NO_DATES_ALERT") . '";';
			$ic_script[] = '			document.getElementById("form_errors").style.display = "block";';

			if ($submit_periodDisplay && $app->isSite())
			{
				$ic_script[] = '			document.getElementById("startdate' . $id_suffix . '").value = emptydatetime;';
				$ic_script[] = '			document.getElementById("enddate' . $id_suffix . '").value = emptydatetime;';
				$ic_script[] = '			document.getElementById("startdate' . $id_suffix . '").addClass("ic-date-invalid");';
				$ic_script[] = '			document.getElementById("enddate' . $id_suffix . '").addClass("ic-date-invalid");';
			}
			elseif ($app->isAdmin())
			{
				$ic_script[] = '			document.getElementById("startdate' . $id_suffix . '").value = emptydatetime;';
				$ic_script[] = '			document.getElementById("enddate' . $id_suffix . '").value = emptydatetime;';
				$ic_script[] = '			document.getElementById("startdate' . $id_suffix . '").addClass("ic-date-invalid");';
				$ic_script[] = '			document.getElementById("enddate' . $id_suffix . '").addClass("ic-date-invalid");';
			}

			if ($submit_datesDisplay && $app->isSite())
			{
				$ic_script[] = '			document.getElementById("dTable' . $id_suffix . '").addClass("ic-date-invalid");';
			}
			elseif ($app->isAdmin())
			{
				$ic_script[] = '			document.getElementById("dTable' . $id_suffix . '").addClass("ic-date-invalid");';
			}

			$ic_script[] = '			scroll_to = document.getElementById("ic-dates-fieldset");';
			$ic_script[] = '			scroll_to.scrollIntoView();';
			$ic_script[] = '			return false;';
			$ic_script[] = '		}';
			$ic_script[] = '		else {';
			$ic_script[] = '			document.getElementById("form_errors").style.display = "none";';

			if ($submit_periodDisplay && $app->isSite())
			{
				$ic_script[] = '			document.getElementById("startdate' . $id_suffix . '").removeClass("ic-date-invalid");';
				$ic_script[] = '			document.getElementById("enddate' . $id_suffix . '").removeClass("ic-date-invalid");';
			}
			elseif ($app->isAdmin())
			{
				$ic_script[] = '			document.getElementById("startdate' . $id_suffix . '").removeClass("ic-date-invalid");';
				$ic_script[] = '			document.getElementById("enddate' . $id_suffix . '").removeClass("ic-date-invalid");';
			}

			if ($submit_datesDisplay && $app->isSite())
			{
				$ic_script[] = '			document.getElementById("dTable' . $id_suffix . '").removeClass("ic-date-invalid");';
			}
			elseif ($app->isAdmin())
			{
				$ic_script[] = '			document.getElementById("dTable' . $id_suffix . '").removeClass("ic-date-invalid");';
			}

			$ic_script[] = '		}';

			if ($submit_periodDisplay && $app->isSite())
			{
				$ic_script[] = '		if (isValidStartDate && !isValidEndDate) {';
				$ic_script[] = '			document.getElementById("enddate' . $id_suffix . '").value = startDate.value;';
				$ic_script[] = '		}';
			}
			elseif ($app->isAdmin())
			{
				$ic_script[] = '		if (isValidStartDate && !isValidEndDate) {';
				$ic_script[] = '			document.getElementById("enddate' . $id_suffix . '").value = startDate.value;';
				$ic_script[] = '		}';
			}
		}

		$customfields = icagendaCustomfields::getCustomfields($parent_form);

		if ($customfields && $app->isAdmin())
		{
			$options_required = array('list', 'radio');

			foreach ($customfields as $icf)
			{
				// If type is list or radio, should have options. All, field required.
				if (((in_array($icf->type, $options_required) && $icf->options)
					|| ! in_array($icf->type, $options_required))
					&& $icf->required)
				{
					$ic_script[] = '		var ' . $icf->slug . '_slug = document.getElementById("' . $icf->slug . '_slug");';
					$ic_script[] = '		if ( ( ' . $icf->slug . '_slug.value == "" ) ';

					if ($app->isAdmin()) $ic_script[] = '			&& ( task != "' . $parent_name . '.cancel" ) ';

					$ic_script[] = '		) {';
					$ic_script[] = '			alert(Joomla.JText._("COM_ICAGENDA_FORM_NC"));';
					$ic_script[] = '			document.getElementById("message_error").innerHTML = "'
												. JText::sprintf("COM_ICAGENDA_FORM_VALIDATE_FIELD_REQUIRED_NAME", $icf->title) . '";';
					$ic_script[] = '			document.getElementById("form_errors").style.display = "block";';
					$ic_script[] = '			document.getElementById("' . $icf->alias . '_alias").addClass("ic-field-invalid");';
					$ic_script[] = '			document.getElementById("' . $icf->slug . '_slug").addClass("ic-field-invalid");';
					$ic_script[] = '			scroll_to = document.getElementById("' . $icf->alias . '_alias");';
					$ic_script[] = '			scroll_to.scrollIntoView();';
					$ic_script[] = '			return false;';
					$ic_script[] = '		}';
					$ic_script[] = '		else {';
					$ic_script[] = '			document.getElementById("form_errors").style.display = "none";';
					$ic_script[] = '			document.getElementById("' . $icf->alias . '_alias").removeClass("ic-field-invalid");';
					$ic_script[] = '			document.getElementById("' . $icf->slug . '_slug").removeClass("ic-field-invalid");';
					$ic_script[] = '		}';
				}
			}
		}

		if ($app->isAdmin())
		{
			$ic_script[] = '		if (task == "' . $parent_name . '.cancel"';
			$ic_script[] = '			|| document.formvalidator.isValid(document.id("' . $parent_name . '-form")))';
			$ic_script[] = '		{';
			$ic_script[] = '			// do field validation';
			$ic_script[] = '			Joomla.submitform(task, document.getElementById("' . $parent_name . '-form"));';
			$ic_script[] = '		}';
			$ic_script[] = '		else {';
			$ic_script[] = '			alert("' . JText::_("JGLOBAL_VALIDATION_FORM_FAILED") . '");';
			$ic_script[] = '		}';
		}

		if ($app->isSite())
		{
			$ic_script[] = '		if (!agree.checked) {';
			if ($parent_form == 1) $ic_script[] = '			alert(Joomla.JText._("COM_ICAGENDA_TERMS_AND_CONDITIONS_NOT_CHECKED_REGISTRATION"));';
			if ($parent_form == 2) $ic_script[] = '			alert(Joomla.JText._("COM_ICAGENDA_TERMS_OF_SERVICE_NOT_CHECKED_SUBMIT_EVENT"));';
			$ic_script[] = '			scroll_to = document.getElementById("content");';
			$ic_script[] = '			scroll_to.scrollIntoView();';
			$ic_script[] = '			return false;';
			$ic_script[] = '		}';
		}

		$ic_script[] = '	}';

		if ($app->isAdmin())
		{
			$ic_script[] = '});';
		}

		return implode("\n", $ic_script);
	}

	/**
	 * Function to set timepicker.js and date function strings of translation
	 *
	 * @access	public static
	 *
	 * @since   3.4.1
	 */
	static public function loadDateTimePickerJSLanguage()
	{
		// icdates.js Strings of Translation
		JText::script('COM_ICAGENDA_DELETE_DATE');

		// timepicker.js Strings of Translation
		JText::script('JANUARY');
		JText::script('FEBRUARY');
		JText::script('MARCH');
		JText::script('APRIL');
		JText::script('MAY');
		JText::script('JUNE');
		JText::script('JULY');
		JText::script('AUGUST');
		JText::script('SEPTEMBER');
		JText::script('OCTOBER');
		JText::script('NOVEMBER');
		JText::script('DECEMBER');

		JText::script('SA');
		JText::script('SU');
		JText::script('MO');
		JText::script('TU');
		JText::script('WE');
		JText::script('TH');
		JText::script('FR');

		JText::script('COM_ICAGENDA_TP_CURRENT');
		JText::script('COM_ICAGENDA_TP_CLOSE');
		JText::script('COM_ICAGENDA_TP_TITLE');
		JText::script('COM_ICAGENDA_TP_TIME');
		JText::script('COM_ICAGENDA_TP_HOUR');
		JText::script('COM_ICAGENDA_TP_MINUTE');
	}
}
components/com_icagenda/utilities/events/events.php000060400000037135152453623450016674 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     iCagenda
 * @subpackage  utilities
 * @copyright   Copyright (c)2014-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.12 2015-10-01
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * class icagendaEvents
 */
class icagendaEvents
{
	/**
	 * Function to return event access (access levels, approval and event access status)
	 *
	 * @access	public static
	 * @param	$id - id of the event
	 * @return	list array of access levels, approval and event access status
	 *
	 * @since	3.4.0
	 */
	static public function eventAccess($id = null)
	{
		// Preparing connection to db
		$db = Jfactory::getDbo();

		// Preparing the query
		$query = $db->getQuery(true);
		$query->select('e.state AS evtState, e.approval AS evtApproval, e.access AS evtAccess')
			->from($db->qn('#__icagenda_events').' AS e')
			->where($db->qn('e.id').' = '.$db->q($id));
		$query->select('v.title AS accessName')
			->join('LEFT', $db->quoteName('#__viewlevels') . ' AS v ON v.id = e.access');
		$db->setQuery($query);
		$eventAccess = $db->loadObject();

		if ($eventAccess)
		{
			return $eventAccess;
		}
		else
		{
			return false;
		}
	}

	/**
	 * Function to return feature Icons for an event
	 *
	 * @access	public static
	 * @param	$id - id of the event
	 * @return	list array of feature icons
	 *
	 * @since	3.4.0
	 */
	public static function featureIcons($id = null)
	{
		$db = JFactory::getDbo();
		$query = $db->getQuery(true);
		$query->select('DISTINCT f.icon, f.icon_alt');
		$query->from('`#__icagenda_feature_xref` AS fx');
		$query->innerJoin("`#__icagenda_feature` AS f ON fx.feature_id=f.id AND f.state=1 AND f.icon<>'-1'");
		$query->where('fx.event_id=' . $id);
		$query->order('f.ordering DESC'); // Order descending because the icons are floated right
		$db->setQuery($query);
		$feature_icons = $db->loadObjectList();

		return $feature_icons;
	}

	/**
	 * Function to return footer list of events
	 *
	 * @since	3.4.0
	 */
	public static function isListOfEvents()
	{
		$app = JFactory::getApplication();
		$params = $app->getParams();
		$list_of_events = $params->get('copy', '');
		$core = $params->get('icsys');
		$string = '<a href="ht';
		$string.= 'tp://icag';
		$string.= 'enda.jooml';
		$string.= 'ic.com" target="_blank" style="font-weight: bold; text-decoration: none !important;">';
		$string.= 'iCagenda';
		$string.= '</a>';
		$icagenda = JText::sprintf('ICAGENDA_THANK_YOU_NOT_TO_REMOVE', $string);
		$default = '&#80;&#111;&#119;&#101;&#114;&#101;&#100;&nbsp;&#98;&#121;&nbsp;';
		$footer = '<div style="text-align: center; font-size: 10px; text-decoration: none"><p>';
		$footer.= preg_match('/iCagenda/',$icagenda) ? $icagenda : $default . $string;
		$footer.= '</p></div>';

		if ($list_of_events || $core == 'core')
		{
			echo $footer;
		}
	}

	/**
	 * DAY in Date Box (list of events)
	 *
	 * @since 3.5.0
	 */
	public static function day($date, $item = null)
	{
		$eventTimeZone	= null;

		$this_date		= JHtml::date($date, 'Y-m-d H:i', $eventTimeZone);
		$day_date		= JHtml::date($date, 'd', $eventTimeZone);
		$day_today		= JHtml::date('now', 'd');
		$date_today		= JHtml::date('now', 'Y-m-d');

		if ($item)
		{
			$weekdays		= $item->weekdays;
			$period			= unserialize($item->period);
			$period			= is_array($period) ? $period : array();
			$is_in_period	= (in_array($this_date, $period)) ? true : false;
			$startdate		= $item->startdatetime;
			$day_startdate	= JHtml::date($startdate, 'd', $eventTimeZone);
			$enddate		= $item->enddatetime;
			$day_enddate	= JHtml::date($enddate, 'd', $eventTimeZone);
		}

		if ($item && $is_in_period
			&& $weekdays == ''
			&& strtotime($startdate) <= strtotime($date_today)
			&& strtotime($enddate) >= strtotime($date_today)
			)
		{
			$day = '';

			if ($day_today > $day_startdate)
			{
//				$day.= '<span style="font-size: 14px; vertical-align: middle">' . $day_startdate . '&nbsp;</span>';
//				$day.= '<span style="font-size: 16px; vertical-align: middle">&#8676;</span>';
			}
			else
			{
//				$day.= '<span style="font-size: 14px; vertical-align: middle; color: transparent; text-shadow: none; text-decoration: none;">' . $day_startdate . '&nbsp;</span>';
//				$day.= '<span style="font-size: 16px; vertical-align: middle; color: transparent; text-shadow: none; text-decoration: none;">&#8676;</span>';
			}

//			$day.= '<span style="border-radius: 10px; padding: 0 5px; border: 2px dotted gray;">' . $day_today . '</span>';
			$day.= '<span class="ic-current-period">' . $day_today . '</span>';
//			$day.= $day_today;

			if ($day_today < $day_enddate)
			{
//				$day.= '<span style="font-size: 16px; vertical-align: middle">&#8677;</span>';
//				$day.= '<span style="font-size: 14px; vertical-align: middle">&nbsp;' . $day_enddate . '</span>';
			}
			else
			{
//				$day.= '<span style="font-size: 16px; vertical-align: middle; color: transparent; text-shadow: none; text-decoration: none;">&#8677;</span>';
//				$day.= '<span style="font-size: 14px; vertical-align: middle; color: transparent; text-shadow: none; text-decoration: none;">' . $day_enddate . '&nbsp;</span>';
			}

			return $day;
		}
		else
		{
			return $day_date;
		}
	}

	/**
	 * MONTH SHORT in Date Box (list of events)
	 *
	 * @since 3.5.0
	 */
	public static function dateBox($date, $type, $ongoing = null)
	{
		$datetime_today		= JHtml::date('now', 'Y-m-d H:i');

		$monthshort_date	= iCDate::monthShortJoomla($date);
		$monthshort_today	= iCDate::monthShortJoomla($datetime_today);
		$year_date			= JHtml::date($date, 'Y', null);
//		$year_date			= date('Y', strtotime($date));
		$year_today			= JHtml::date('now', 'Y');

		if ($ongoing)
		{
			switch($type)
			{
				case 'monthshort': $value = $monthshort_today; break;
				case 'year': $value = $year_today; break;
			}
		}
		else
		{
			switch($type)
			{
				case 'monthshort': $value = $monthshort_date; break;
				case 'year': $value = $year_date; break;
			}
		}

		return $value;
	}

// DEPRECATED 3.6
	/**
	 * Function to return time formated depending on AM/PM option
	 * Format Time (eg. 00:00 (AM/PM))
	 * $oldtime to be removed (not used since 2.0.0)
	 *
	 * @since 3.4.1
	 */
	public static function dateToTimeFormat($evt, $oldtime = null)
	{
		$app			= JFactory::getApplication();
		$params			= $app->getParams();
		$timeformat		= $params->get('timeformat', 1);
		$eventTimeZone	= null;

		$date_time		= strtotime(JHtml::date($evt, 'Y-m-d H:i', $eventTimeZone));
 		$t_time			= date('H:i', $date_time);

		$time_format	= ($timeformat == 1) ? '%H:%M' : '%I:%M %p';
		$lang_time		= strftime($time_format, strtotime($t_time));

		$time = ($oldtime != NULL && $t_time == '00:00') ? $oldtime : JText::_($lang_time);

		return $time;
	}

	/**
	 * Function to return Auto Short Description (Full Description > Short)
	 *
	 * @since 3.5.6
	 */
	public static function shortDescription($text, $isModule = null, $option = null, $limit = null)
	{
		$descdata		= $text;
		$desc_full		= self::deleteAllBetween('{', '}', $descdata);

		// Menu Options
		$app			= JFactory::getApplication();
		$params			= $app->getParams();

//		$limitGlobal	= ! $isModule ? $params->get('limitGlobal', 0) : 1;
//		$customlimit	= ! $isModule ? $params->get('limit', '100') : false;
		$limitGlobal	= ! $isModule ? $params->get('limitGlobal', 0) : 0;
		$customlimit	= ! $isModule ? $params->get('limit', '100') : $limit;

		// Global Options Component iCagenda
		$iCparams		= JComponentHelper::getParams('com_icagenda');

		if ($limitGlobal == 1)
		{
			$limit = $params->get('ShortDescLimit', '100');
		}
		else
		{
			$limit_global_option = $iCparams->get('ShortDescLimit', '100');
			$limit = is_numeric($customlimit) ? $customlimit : $limit_global_option;
		}

		// Html tags removal Global Option (component iCagenda) - Short Description
		$Filtering_ShortDesc_Global	= $iCparams->get('Filtering_ShortDesc_Global', '');
		$HTMLTags_ShortDesc_Global	= $iCparams->get('HTMLTags_ShortDesc_Global', array());

		// Get Module Option
		$Filtering_ShortDesc_Module	= $isModule ? $option : '';

		/**
		 * START Filtering HTML method
		 */
		$limit				= is_numeric($limit) ? $limit : false;

		// Gets length of the short desc, when not filtered
		$limit_not_filtered	= substr($desc_full, 0, $limit);
		$text_length		= strlen($limit_not_filtered);

		// Gets length of the short desc, after html filtering
		$limit_filtered		= preg_replace('/[\p{Z}\s]{2,}/u', ' ', $limit_not_filtered);
		$limit_filtered		= strip_tags($limit_filtered);
		$text_short_length	= strlen($limit_filtered);

		// Sets Limit + special tags authorized
		$limit_short		= $limit + ($text_length - $text_short_length);

		// Replaces all authorized html tags with tag strings
		if (empty($Filtering_ShortDesc_Module)
			&& ($Filtering_ShortDesc_Global == '1') )
		{
			$desc_full = str_replace('+', '@@', $desc_full);
			$desc_full = in_array('1', $HTMLTags_ShortDesc_Global) ? str_replace('<br>', '+@br@', $desc_full) : $desc_full;
			$desc_full = in_array('1', $HTMLTags_ShortDesc_Global) ? str_replace('<br/>', '+@br@', $desc_full) : $desc_full;
			$desc_full = in_array('1', $HTMLTags_ShortDesc_Global) ? str_replace('<br />', '+@br@', $desc_full) : $desc_full;
			$desc_full = in_array('2', $HTMLTags_ShortDesc_Global) ? str_replace('<b>', '+@b@', $desc_full) : $desc_full;
			$desc_full = in_array('2', $HTMLTags_ShortDesc_Global) ? str_replace('</b>', '@bc@', $desc_full) : $desc_full;
			$desc_full = in_array('3', $HTMLTags_ShortDesc_Global) ? str_replace('<strong>', '@strong@', $desc_full) : $desc_full;
			$desc_full = in_array('3', $HTMLTags_ShortDesc_Global) ? str_replace('</strong>', '@strongc@', $desc_full) : $desc_full;
			$desc_full = in_array('4', $HTMLTags_ShortDesc_Global) ? str_replace('<i>', '@i@', $desc_full) : $desc_full;
			$desc_full = in_array('4', $HTMLTags_ShortDesc_Global) ? str_replace('</i>', '@ic@', $desc_full) : $desc_full;
			$desc_full = in_array('5', $HTMLTags_ShortDesc_Global) ? str_replace('<em>', '@em@', $desc_full) : $desc_full;
			$desc_full = in_array('5', $HTMLTags_ShortDesc_Global) ? str_replace('</em>', '@emc@', $desc_full) : $desc_full;
			$desc_full = in_array('6', $HTMLTags_ShortDesc_Global) ? str_replace('<u>', '@u@', $desc_full) : $desc_full;
			$desc_full = in_array('6', $HTMLTags_ShortDesc_Global) ? str_replace('</u>', '@uc@', $desc_full) : $desc_full;
		}
		elseif ( $Filtering_ShortDesc_Module == '2'
			|| (($Filtering_ShortDesc_Global == '') && empty($Filtering_ShortDesc_Module)) )
		{
			$desc_full		= '@i@'.$desc_full.'@ic@';
			$limit_short	= $limit_short + 7;
		}
		else
		{
			$desc_full		= $desc_full;
		}

		// Removes HTML tags
		$desc_nohtml	= strip_tags($desc_full);

		// Replaces all sequences of two or more spaces, tabs, and/or line breaks with a single space
		$desc_nohtml	= preg_replace('/[\p{Z}\s]{2,}/u', ' ', $desc_nohtml);

		// Replaces all spaces with a single +
		$desc_nohtml	= str_replace(' ', '+', $desc_nohtml);

		if (strlen($desc_nohtml) > $limit_short)
		{
			// Cuts full description, to get short description
			$string_cut	= substr($desc_nohtml, 0, $limit_short);

			// Detects last space of the short description
			$last_space	= strrpos($string_cut, '+');

			// Cuts the short description after last space
			$string_ok	= substr($string_cut, 0, $last_space);

			// Counts number of tags converted to string, and returns lenght
			$nb_br			= substr_count($string_ok, '+@br@');
			$nb_plus		= substr_count($string_ok, '@@');
			$nb_bopen		= substr_count($string_ok, '@b@');
			$nb_bclose		= substr_count($string_ok, '@bc@');
			$nb_strongopen	= substr_count($string_ok, '@strong@');
			$nb_strongclose	= substr_count($string_ok, '@strongc@');
			$nb_iopen		= substr_count($string_ok, '@i@');
			$nb_iclose		= substr_count($string_ok, '@ic@');
			$nb_emopen		= substr_count($string_ok, '@em@');
			$nb_emclose		= substr_count($string_ok, '@emc@');
			$nb_uopen		= substr_count($string_ok, '@u@');
			$nb_uclose		= substr_count($string_ok, '@uc@');

			// Replaces tag strings with html tags
			$string_ok	= str_replace('@br@', '<br />', $string_ok);
			$string_ok	= str_replace('@b@', '<b>', $string_ok);
			$string_ok	= str_replace('@bc@', '</b>', $string_ok);
			$string_ok	= str_replace('@strong@', '<strong>', $string_ok);
			$string_ok	= str_replace('@strongc@', '</strong>', $string_ok);
			$string_ok	= str_replace('@i@', '<i>', $string_ok);
			$string_ok	= str_replace('@ic@', '</i>', $string_ok);
			$string_ok	= str_replace('@em@', '<em>', $string_ok);
			$string_ok	= str_replace('@emc@', '</em>', $string_ok);
			$string_ok	= str_replace('@u@', '<u>', $string_ok);
			$string_ok	= str_replace('@uc@', '</u>', $string_ok);
			$string_ok	= str_replace('+', ' ', $string_ok);
			$string_ok	= str_replace('@@', '+', $string_ok);

			$text = $string_ok;

			// Close html tags if not closed
			if ($nb_bclose < $nb_bopen) $text = $string_ok.'</b>';
			if ($nb_strongclose < $nb_strongopen) $text = $string_ok.'</strong>';
			if ($nb_iclose < $nb_iopen) $text = $string_ok.'</i>';
			if ($nb_emclose < $nb_emopen) $text = $string_ok.'</em>';
			if ($nb_uclose < $nb_uopen) $text = $string_ok.'</u>';

			$return_text = $text.' ';

			$descShort	= $limit ? $return_text : '';
		}
		else
		{
			$desc_full	= $desc_nohtml;
			$desc_full	= str_replace('@br@', '<br />', $desc_full);
			$desc_full	= str_replace('@b@', '<b>', $desc_full);
			$desc_full	= str_replace('@bc@', '</b>', $desc_full);
			$desc_full	= str_replace('@strong@', '<strong>', $desc_full);
			$desc_full	= str_replace('@strongc@', '</strong>', $desc_full);
			$desc_full	= str_replace('@i@', '<i>', $desc_full);
			$desc_full	= str_replace('@ic@', '</i>', $desc_full);
			$desc_full	= str_replace('@em@', '<em>', $desc_full);
			$desc_full	= str_replace('@emc@', '</em>', $desc_full);
			$desc_full	= str_replace('@u@', '<u>', $desc_full);
			$desc_full	= str_replace('@uc@', '</u>', $desc_full);
			$desc_full	= str_replace('+', ' ', $desc_full);
			$desc_full	= str_replace('@@', '+', $desc_full);

			$descShort	= $limit ? $desc_full : '';
		}
		/** END Filtering HTML function */

		return $descShort;
	}

	/**
	 * Function to check if user has access rights to defined access
	 *
	 * $accessLevel		Access level of the item to check User Permissions
	 *
	 * If in super user group, always allowed
	 */
	static public function accessLevels($accessLevel)
	{
		// Get User Access Levels
		$user		= JFactory::getUser();
		$userLevels	= $user->getAuthorisedViewLevels();
		$userGroups = version_compare(JVERSION, '3.0', 'ge') ? $user->groups : $user->getAuthorisedGroups();

		// Control: if access level, or Super User
		if (in_array($accessLevel, $userLevels)
			|| in_array('8', $userGroups))
		{
			return true;
		}

		return false;
	}

	/**
	 * Process a string in a JOOMLA_TRANSLATION_STRING standard.
	 * This method processes a string and replaces all accented UTF-8 characters by unaccented
	 * ASCII-7 "equivalents" and the string is uppercase. Spaces replaced by underscore.
	 *
	 * @param   string  $string  String to process
	 *
	 * @return  string  Processed string
	 *
	 * @since   3.3.3
	 */
	public static function deleteAllBetween($start, $end, $string)
	{
		$startPos = strpos($string, $start);
		$endPos = strpos($string, $end);

		if (!$startPos || !$endPos)
		{
			return $string;
		}

		$textToDelete = substr($string, $startPos, ($endPos + strlen($end)) - $startPos);

		return str_replace($textToDelete, '', $string);
	}
}
components/com_icagenda/utilities/events/data.php000060400000106353152453623450016300 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     iCagenda
 * @subpackage  utilities
 * @copyright   Copyright (c)2014-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version 	3.5.7 2015-07-14
 * @since       3.5.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * class icagendaEventsData
 * Transitional class and functions
 *
 * DEPRECATED and TO BE REMOVED in 3.7.x
 */
class icagendaEventsData
{
	/**
	 * ALL DATES
	 *
	 * @since 3.5.0
	 */
	public static function getAllDates($filterTime = null, $datesDisplay = null, $orderby = null, $mcatid = null, $module = null)
	{
		$app	= JFactory::getApplication();
		$jinput = $app->input;
		$params = $app->getParams();

		// Get Settings
		$filterTime		= ($filterTime == 'no') ? '0' : $filterTime;
		$filterTime		= (isset($filterTime) || $filterTime == '0') ? $filterTime : $params->get('time', 1);
		$datesDisplay	= $datesDisplay ? $datesDisplay : $params->get('datesDisplay', 1);
		$orderby		= $orderby ? $orderby : $params->get('orderby', 2);
		$mcatid			= ($mcatid == 'no') ? array() : $params->get('mcatid');
//		$module			= ($module == 'calendar') ? $module : false;

		// Set vars
		$nodate 		= '0000-00-00 00:00:00';
		$ic_nodate		= '0000-00-00 00:00';
		$eventTimeZone	= null;
		$datetime_today	= JHtml::date('now', 'Y-m-d H:i'); // Joomla Time Zone
		$date_today		= JHtml::date('now', 'Y-m-d'); // Joomla Time Zone
//		$datetime_today	= date('Y-m-d H:i');
//		$date_today		= date('Y-m-d');


		// Get Data
		$db		= Jfactory::getDbo();
		$query	= $db->getQuery(true);
        $query->select('e.next, e.dates, e.startdate, e.enddate, e.period, e.weekdays, e.displaytime, e.id, e.catid');
        $query->from('#__icagenda_events AS e');
		$query->leftJoin('`#__icagenda_category` AS c ON c.id = e.catid');

		// CATEGORY STATE Filtering
		$query->where('c.state = 1');

		// EVENT STATE Filtering
		$query->where('e.state = 1');

		// CATEGORY Filtering
//		$mcatid = is_array($mcatid) ? $mcatid : array();
//		$selcat = implode(', ', $mcatid);

//		if ( ! in_array('0', $mcatid)
//			&& count($mcatid)
//			)
//		{
//			$query->where('e.catid IN (' . $selcat . ')');
//		}
		// Filter by categories.
		$categoryId = $mcatid;

		if (is_numeric($categoryId) && ! empty($categoryId))
		{
			$query->where('e.catid = ' . $categoryId . '');
		}
		elseif (is_array($categoryId) && ! empty($categoryId)
			&& ! in_array('0', $categoryId))
		{
			JArrayHelper::toInteger($categoryId);
			$categoryId = implode(',', $categoryId);
			$query->where('e.catid IN (' . $categoryId . ')');
		}

		// FRONTEND FILTERS

		// Filter by published state
		$published = $jinput->get('filter_state');
//		$published = $this->state->get('filter.state');

		if (is_numeric($published))
		{
			$query->where('e.state = '.(int) $published);
		}
		elseif ($published === '')
		{
			$query->where('(e.state IN (0, 1))');
		}

		// Filter by category
		$category = $jinput->get('filter_category');
//		$category = $this->state->get('filter.category');

		if (is_numeric($category))
		{
			$query->where('e.catid = '.(int) $category);
		}

		$filter_startdate	= $jinput->get('filter_startdate');
		$filter_enddate		= $jinput->get('filter_enddate');
		$filter_year		= $jinput->get('filter_year');

		// FEATURES Filtering
		$query->where(self::getFeaturesFilter());

		// LANGUAGE Filtering
		$query->where('e.language IN (' . $db->q(JFactory::getLanguage()->getTag()) . ',' . $db->q('*') . ')');

		// ACCESS Filtering
		$user		= JFactory::getUser();
		$userID		= $user->id;
		$userLevels	= $user->getAuthorisedViewLevels();
		$userGroups	= $user->groups;
		$groupid	= JComponentHelper::getParams('com_icagenda')->get('approvalGroups', array("8"));
		$groupid	= is_array($groupid) ? $groupid : array($groupid);

		if (!in_array('8', $userGroups) )
		{
			$useraccess	= implode(', ', $userLevels);
			$query->where('e.access IN (' . $useraccess . ')');
		}

		// APPROVAL RIGHTS Filtering
		if (!array_intersect($userGroups, $groupid)
			&& !in_array('8', $userGroups))
		{
			$query->where('e.approval <> 1');
		}
		else
		{
			$query->where('e.approval < 2');
		}

		$db->setQuery($query);
		$list = $db->loadObjectList();

		$list_all_dates = array();

		foreach ($list AS $i)
		{
			$i_id			= $i->id;
			$i_startdate	= $i->startdate;
			$i_enddate		= $i->enddate;
			$i_weekdays		= $i->weekdays;
			$i_dates		= $i->dates;
			$i_displaytime	= $i->displaytime;

			// Declare AllDates array
			$AllDatesDisplay	= array();

			// Get WeekDays Array
			$WeeksDays			= iCDatePeriod::weekdaysToArray($i_weekdays);

			// If Single Dates, added each one to All Dates for this event
			$singledates 		= iCString::isSerialized($i_dates) ? unserialize($i_dates) : array();
			$singleDatesArray	= array();

			$no_filtering		= '0';

			foreach ($singledates as $sd)
			{
				$isValid = iCDate::isDate($sd);

				if ($isValid)
				{
					$date_Dat			= JHtml::date($sd, 'Y-m-d', $eventTimeZone);
					$SingleDate			= JHtml::date($sd, 'Y-m-d H:i', $eventTimeZone);

					$data_SingleDate	= date('Y-m-d H:i', strtotime($sd));

					// Frontend Filtering
					if ( ! empty($filter_year))
					{
						if (date('Y', strtotime($date_Dat)) == $filter_year)
						{
							$singleDatesArray[] = $data_SingleDate . '_' . $i_id;
						}
					}
					elseif ( ! empty($filter_startdate) && ! empty($filter_enddate))
					{
						if (strtotime($date_Dat) >= strtotime($filter_startdate)
							&& strtotime($date_Dat) <= strtotime($filter_enddate)
							)
						{
							$singleDatesArray[] = $data_SingleDate . '_' . $i_id;
						}
					}

					// All Dates for each event
					elseif ($datesDisplay == 1)
					{
						$singleDatesArray[] = $data_SingleDate . '_' . $i_id;
					}

					// Current Today
					elseif ($filterTime == 4
						&& strtotime($SingleDate) >= strtotime($date_today)
						)
					{
						$singleDatesArray[] = $data_SingleDate . '_' . $i_id;
					}

					// Upcoming Events
					elseif ($filterTime == 3
						&& strtotime($SingleDate) > strtotime($datetime_today)
						)
					{
						$singleDatesArray[] = $data_SingleDate . '_' . $i_id;
					}

					// Past event
					elseif ($filterTime == 2
						&& strtotime($SingleDate) < strtotime($datetime_today)
						)
					{
						$singleDatesArray[] = $data_SingleDate . '_' . $i_id;
					}

					// Current and Upcoming Events
					elseif ($filterTime == 1
						&& strtotime($SingleDate) > strtotime($datetime_today)
						)
					{
						$singleDatesArray[] = $data_SingleDate . '_' . $i_id;
					}

					// All Dates
					elseif (!$filterTime)
					{
						// All Upcoming dates
						if (strtotime($SingleDate) >= strtotime($datetime_today))
						{
							$no_filtering = $no_filtering + 1;

							$singleDatesArray[] = $data_SingleDate . '_' . $i_id;
						}

						// If no Upcoming dates, get the last date
						elseif ($no_filtering == 0
							&& strtotime($SingleDate) < strtotime($datetime_today))
						{
							$no_filtering = $no_filtering + 1;

							$singleDatesArray[] = $data_SingleDate . '_' . $i_id;
						}
					}
				}
			}

			if ($datesDisplay == 2
				&& $filterTime == 2
				&& count($singleDatesArray) > 0) // Past Events
			{
				$AllDatesDisplay[] = max($singleDatesArray);
			}
			elseif ($datesDisplay == 2
				&& count($singleDatesArray) > 0)
			{
				$AllDatesDisplay[] = min($singleDatesArray);
			}
			else
			{
				$AllDatesDisplay = array_merge($AllDatesDisplay, $singleDatesArray);
			}

			// If Period Dates, added each one to All Dates for this event (filter week Days, and if date not null)
//			$perioddates = iCDatePeriod::listDates($i_startdate, $i_enddate, $eventTimeZone);

			$perioddates = iCDatePeriod::listDates($i_startdate, $i_enddate);

			$period_array = array();

			foreach ($perioddates AS $date_in_weekdays)
			{
//				$datetime_period_date = JHtml::date($date_in_weekdays, 'Y-m-d H:i', $eventTimeZone);
//				$datetime_period_date = date('Y-m-d H:i', strtotime($date_in_weekdays));
//				$datetime_period_date = $date_in_weekdays;

				if (in_array(date('w', strtotime($date_in_weekdays)), $WeeksDays)
					&& iCDate::isDate($date_in_weekdays))
				{
					$period_array[] = $date_in_weekdays;
				}
			}

			$only_startdate = ($i_weekdays || $i_weekdays == '0') ? false : true;
//			$only_startdate = ! $module ? $only_startdate : false;

			$StDate = JHtml::date($i_startdate, 'Y-m-d H:i', $eventTimeZone);
			$EnDate = JHtml::date($i_enddate, 'Y-m-d H:i', $eventTimeZone);

			$date_startdate	= JHtml::date($i_startdate, 'Y-m-d', $eventTimeZone);
			$date_enddate	= JHtml::date($i_enddate, 'Y-m-d', $eventTimeZone);
			$time_startdate	= JHtml::date($i_startdate, 'H:i', $eventTimeZone);
			$time_enddate	= JHtml::date($i_enddate, 'H:i', $eventTimeZone);

			$data_StDate = date('Y-m-d H:i', strtotime($i_startdate));
			$data_time_startdate	= date('H:i', strtotime($i_startdate));

//			$StDate = date('Y-m-d H:i', strtotime($i_startdate));
//			$EnDate = date('Y-m-d H:i', strtotime($i_enddate));

//			$date_startdate	= date('Y-m-d', strtotime($i_startdate));
//			$date_enddate	= date('Y-m-d', strtotime($i_enddate));
//			$time_startdate	= date('H:i', strtotime($i_startdate));
//			$time_enddate	= date('H:i', strtotime($i_enddate));

			if (isset($period_array)
				&& ($period_array != NULL && $period_array)
				)
			{
				if ($only_startdate)
				{
					$AllDatesDisplay[] = $data_StDate . '_' . $i_id;
				}
				else
				{
					$dp = 0;
					$count_period = count($period_array);
					$cp = 0;
					$no_filtering = 0;

					foreach ($period_array as $Dat)
					{
						$date_Dat	= JHtml::date($Dat, 'Y-m-d', $eventTimeZone);
						$SingleDate	= JHtml::date($Dat, 'Y-m-d H:i', $eventTimeZone);

						$data_date_Dat	= date('Y-m-d', strtotime($Dat));
						$data_SingleDate	= date('Y-m-d H:i', strtotime($Dat));

//						$date_Dat	= date('Y-m-d', strtotime($Dat));
//						$SingleDate	= date('Y-m-d H:i', strtotime($Dat));

						if (in_array(date('w', strtotime($Dat)), $WeeksDays)
							&& $dp == 0
							)
						{
							// Frontend Filtering
							if ( ! empty($filter_year))
							{
								if (date('Y', strtotime($date_Dat)) == $filter_year)
								{
									$AllDatesDisplay[] = $data_SingleDate . '_' . $i_id;
								}
							}
							elseif ( ! empty($filter_startdate) && ! empty($filter_enddate))
							{
								if (strtotime($date_Dat) >= strtotime($filter_startdate)
									&& strtotime($date_Dat) <= strtotime($filter_enddate)
									)
								{
									$AllDatesDisplay[] = $data_SingleDate . '_' . $i_id;
								}
							}

							// Current Today and Upcoming Today
							elseif ($filterTime == 4
								&& strtotime($date_Dat) == strtotime($date_today))
							{
								if ($i_displaytime == 1
									&& strtotime($date_Dat . ' ' . $time_enddate) >= strtotime($datetime_today))
								{
									$dp = ($datesDisplay == 2) ? $dp+1 : 0;

									$AllDatesDisplay[] = $data_SingleDate . '_' . $i_id;
								}
								else
								{
									$dp = ($datesDisplay == 2) ? $dp+1 : 0;

									$AllDatesDisplay[] = $data_SingleDate . '_' . $i_id;
								}
							}

							// Upcoming
							elseif ($filterTime == 3
								&& strtotime($SingleDate) > strtotime($datetime_today))
							{
								$dp = ($datesDisplay == 2) ? $dp+1 : 0;

								$AllDatesDisplay[] = $data_SingleDate . '_' . $i_id;
							}

							// Past
							elseif ($filterTime == 2
								&& strtotime($date_Dat) < strtotime($date_today))
							{
								$dp = ($datesDisplay == 2) ? $dp+1 : 0;

								$AllDatesDisplay[] = $data_SingleDate . '_' . $i_id;
							}

							// Current Today and Upcoming
							elseif ($filterTime == 1)
							{
								if ($i_displaytime == 1
									&& strtotime($date_Dat . ' ' . $time_enddate) >= strtotime($datetime_today))
								{
									$dp = ($datesDisplay == 2) ? $dp+1 : 0;

									$AllDatesDisplay[] = $data_SingleDate . '_' . $i_id;
								}
								elseif ($i_displaytime != 1
									&& strtotime($date_Dat) >= strtotime($date_today))
								{
									$dp = ($datesDisplay == 2) ? $dp+1 : 0;

									$AllDatesDisplay[] = $data_SingleDate . '_' . $i_id;
								}
							}

							// No Filtering
							elseif ( ! $filterTime)
							{
								// All Upcoming dates
								if (strtotime($SingleDate) >= strtotime($datetime_today))
								{
									$dp = ($datesDisplay == 2) ? $dp+1 : 0;
									$no_filtering = ($datesDisplay == 2) ? $no_filtering+1 : 0;

									$AllDatesDisplay[] = $data_SingleDate . '_' . $i_id;
								}

								// If no Upcoming dates, get the last date
								elseif ($no_filtering == 0 && $datesDisplay == 2
									&& strtotime($SingleDate) < strtotime($datetime_today))
								{
									$dp = $dp+1;

									$AllDatesDisplay[] = $data_SingleDate . '_' . $i_id;
								}

								// If display All Dates, get the last dates
								elseif ( $datesDisplay == 1
									&& strtotime($SingleDate) < strtotime($datetime_today))
								{
									$dp = 0;

									$AllDatesDisplay[] = $data_SingleDate . '_' . $i_id;
								}
							}
						}
					}
				}
			}

			// If not All Dates display (select only one date for each event)
			if ( $datesDisplay == 2
				&& count($AllDatesDisplay) > 0 )
			{
				$ex_min 	= explode('_', min($AllDatesDisplay));
//				$min_date	= $ex_min[0];
				$min_date	= JHtml::date($ex_min[0], 'Y-m-d H:i', null);
				$ex_max 	= explode('_', max($AllDatesDisplay));
//				$max_date	= $ex_max[0];
				$max_date	= JHtml::date($ex_max[0], 'Y-m-d H:i', null);

				if ($filterTime != '4')
				{
					// min date is upcoming
					if ( $min_date >= $datetime_today )
					{
						$AllDatesDisplay = array(min($AllDatesDisplay));
					}

					// All events
					elseif ($filterTime == '0')
					{
						// min date in Period and upcoming
						if (in_array($min_date, $period_array)
							&& $min_date >= $datetime_today )
						{
							$AllDatesDisplay = array(min($AllDatesDisplay));
						}

						// min date is Single date and not past
						elseif ( ! in_array($min_date, $period_array)
							&& ($min_date > $datetime_today) )
						{
							$AllDatesDisplay = array(min($AllDatesDisplay));
						}

						// min date is Single date and past
						else
						{
							$AllDatesDisplay = array(max($AllDatesDisplay));
						}
					}
					else
					{
						$AllDatesDisplay = array(max($AllDatesDisplay));
					}
				}
				else
				{
					$AllDatesDisplay = array(min($AllDatesDisplay));
				}
			}

			$AllDatesFilterTime = array();

			foreach ($AllDatesDisplay as $fD)
			{
				$ex_date		= explode('_', $fD);
				$get_date		= $ex_date['0'];
				$date_get_date	= JHtml::date($get_date, 'Y-m-d', $eventTimeZone);
				$data_date_get_date	= date('Y-m-d', strtotime($get_date));

				// Frontend Filtering
				if ( ! empty($filter_year))
				{
					if (date('Y', strtotime($get_date)) == $filter_year)
					{
						$AllDatesFilterTime[] = $fD;
					}
				}
				elseif ( ! empty($filter_startdate) && ! empty($filter_enddate))
				{
					if (strtotime($get_date) >= strtotime($filter_startdate)
						&& strtotime($get_date) <= strtotime($filter_enddate)
						)
					{
						$AllDatesFilterTime[] = $fD;
					}
				}

				// (0) Filter Dates : All Dates
				elseif ($filterTime == 0)
				{
					// Period with no weekdays selected
					if ( in_array($get_date, $perioddates)
						&& $only_startdate
						&& ! in_array($StDate . '_' . $i_id, $AllDatesFilterTime)
						)
					{
						$AllDatesFilterTime[] = $data_StDate . '_' . $i_id;
					}

					// Period with weekdays selected
					elseif ( in_array($get_date, $perioddates)
						&& ! $only_startdate
						)
					{
						$AllDatesFilterTime[] = $fD;
					}

					// Single Dates
					elseif ( ! in_array($get_date, $perioddates) )
					{
						$AllDatesFilterTime[] = $fD;
					}
				}

				// (1) Filter Dates : Ongoing and Upcoming
				elseif ($filterTime == 1)
				{
					// Period with no weekdays selected
					if (in_array($get_date, $perioddates)
						&& $only_startdate
						&& strtotime($EnDate) >= strtotime($datetime_today)
						&& !in_array($StDate . '_' . $i_id, $AllDatesFilterTime)
						)
					{
						$AllDatesFilterTime[] = $data_StDate . '_' . $i_id;
					}

					// Period with weekdays selected
					elseif (in_array($get_date, $perioddates)
						&& !$only_startdate
						)
					{
						// If display time, control end time of the day
						if ($i_displaytime == 1
							&& strtotime($date_get_date . ' ' . $time_enddate) >= strtotime($datetime_today))
						{
							$AllDatesFilterTime[] = $fD;
						}

						// If do not display time, control start time of the day
						elseif ($i_displaytime != 1
							&& strtotime($date_get_date) >= strtotime($date_today))
						{
							$AllDatesFilterTime[] = $fD;
						}
					}

					// Single Dates
					elseif (!in_array($get_date, $perioddates)
//						&& strtotime($get_date) >= strtotime($datetime_today)
						// Changed because single dates have no end time, so admitted end time is midnight.
						&& strtotime($get_date) >= strtotime($date_today)
						)
					{
						$AllDatesFilterTime[] = $fD;
					}
				}

				// (2) Filter Dates : Past Dates
				elseif ($filterTime == 2)
				{
					// Period with no weekdays selected
					if ( in_array($get_date, $perioddates)
						&& $only_startdate
						&& (strtotime($EnDate) < strtotime($datetime_today))
						 )
					{
						$AllDatesFilterTime[] = $fD;
					}

					// Period with weekdays selected
					elseif ( in_array($get_date, $perioddates)
						&& !$only_startdate
						&&  strtotime($get_date) < strtotime($datetime_today)
						&&  strtotime($date_get_date . ' ' . $time_enddate) < strtotime($datetime_today)
						 )
					{
						$AllDatesFilterTime[] = $fD;
					}

					// Single Dates
					elseif ( !in_array($get_date, $perioddates)
						&& strtotime($get_date) < strtotime($datetime_today)
						 )
					{
						$AllDatesFilterTime[] = $fD;
					}
				}

				// (3) Filter Dates : Upcoming
				elseif ($filterTime == 3)
				{
					// Period with no weekdays selected
					if (in_array($get_date, $perioddates)
						&& $only_startdate
						&& (strtotime($StDate) > strtotime($datetime_today))
						)
					{
						$AllDatesFilterTime[] = $fD;
					}

					// Period with weekdays selected
					elseif (in_array($get_date, $perioddates)
						&& ! $only_startdate
						&&  strtotime($get_date) > strtotime($datetime_today)
						&&  strtotime($date_get_date . ' ' . $time_startdate) > strtotime($datetime_today)
						)
					{
						$AllDatesFilterTime[] = $fD;
					}

					// Single Dates
					elseif ( ! in_array($get_date, $perioddates)
						&& strtotime($get_date) > strtotime($datetime_today)
						)
					{
						$AllDatesFilterTime[] = $fD;
					}
				}

				// (4) Filter Dates : Ongoing Events today
				elseif ($filterTime == 4)
				{
					// Period with no weekdays selected
					if (in_array($get_date, $perioddates)
						&& $only_startdate
						&& strtotime($EnDate) > strtotime($datetime_today)
						&& strtotime($StDate) < (strtotime($date_today) + 86400)
						)
					{
						$AllDatesFilterTime[] = $data_date_get_date . ' ' . $data_time_startdate . '_' . $i_id;
					}

					// Period with weekdays selected
					elseif ( in_array($get_date, $perioddates)
						&& ! $only_startdate
						&& ( strtotime($date_get_date) == strtotime($date_today)
						&& strtotime($date_get_date . ' ' . $time_enddate) < (strtotime($date_today) + 86400) )
						 )
					{
						$AllDatesFilterTime[] = $fD;
					}

					// Single Dates
					elseif ( !in_array($get_date, $perioddates)
//						&& ( strtotime($get_date) >= strtotime($datetime_today)
						// Changed because single dates have no end time, so admitted end time is midnight.
						&& ( strtotime($get_date) >= strtotime($date_today)
						&& strtotime($get_date) < (strtotime($date_today) + 86400) )
						 )
					{
						$AllDatesFilterTime[] = $fD;
					}
				}
			}

			$list_all_dates = array_merge($list_all_dates, $AllDatesFilterTime);
		}

		if ($orderby == 2)
		{
			sort($list_all_dates);
		}
		else
		{
			rsort($list_all_dates);
		}

		return $list_all_dates;
	}

	/**
	 * Get and update NEXT DATE
	 *
	 * @since 3.5.4
	 */

	public static function getNext()
	{
		$app = JFactory::getApplication();
		$params = $app->getParams();

		// Get Settings
		$filterTime		= $params->get('time', 1);

		// Set vars
		$nodate			= '0000-00-00 00:00:00';
		$eventTimeZone	= null;
		$datetime_today	= JHtml::date('now', 'Y-m-d H:i:s'); // Joomla Time Zone
		$date_today		= JHtml::date('now', 'Y-m-d'); // Joomla Time Zone
		$time_today		= JHtml::date('now', 'H:i:s'); // Joomla Time Zone
//		$datetime_today	= date('Y-m-d H:i:s');
//		$date_today		= date('Y-m-d');
//		$time_today		= date('H:i:s');

		// Preparing connection to db
		$db	= Jfactory::getDbo();

		// Preparing the query
		$query = $db->getQuery(true);

		$query->select('next AS tNext, dates AS tDates, startdate AS tStartdate, enddate AS tEnddate,
						weekdays AS tWeekdays, id AS tId, state AS tState, access AS tAccess');
		$query->from('`#__icagenda_events` AS e');
		$query->where(' e.state = 1 OR e.state = 0 ');
		$db->setQuery($query);

		$all_next_dates = $db->loadObjectList();

		foreach ($all_next_dates as $nd)
		{
			$nd_next		= $nd->tNext;
			$nd_id			= $nd->tId;
			$nd_state		= $nd->tState;
			$nd_dates		= $nd->tDates;
			$nd_startdate	= $nd->tStartdate;
			$nd_enddate		= $nd->tEnddate;
			$nd_weekdays	= $nd->tWeekdays;

			// If Single Dates, added to all dates for this event
			$singleDates	= iCString::isSerialized($nd_dates) ? unserialize($nd_dates) : array();

			$AllDates = array();

			// Get WeekDays Array
			$WeeksDays = iCDatePeriod::weekdaysToArray($nd_weekdays);

			if (isset ($singleDates)
				&& $singleDates != NULL
				&& !in_array($nodate, $singleDates)
				&& !in_array('', $singleDates)
				)
			{
				$AllDates = array_merge($AllDates, $singleDates);
			}
			elseif (in_array('', $singleDates))
			{
				$datesarray		= array();
				$nodate			= array('0000-00-00 00:00');
				$datesmerger	= array_push($datesarray, $nodate);
				$DatesUpdate	= serialize($nodate);

				$query	= $db->getQuery(true);
				$query->update('#__icagenda_events');
				$query->set("`dates`='" . (string)$DatesUpdate . "'");
				$query->where('`id`=' . (int)$nd_id);
				$db->setQuery($query);
				$db->query($query);

				$nosingledates	= unserialize($DatesUpdate);
				$AllDates		= array_merge($AllDates, $nosingledates);
			}

//			$StDate			= JHtml::date($nd_startdate, 'Y-m-d H:i', $eventTimeZone);
//			$EnDate			= JHtml::date($nd_enddate, 'Y-m-d H:i', $eventTimeZone);

//			$date_enddate	= JHtml::date($nd_enddate, 'Y-m-d', $eventTimeZone);
//			$time_enddate	= JHtml::date($nd_enddate, 'H:i', $eventTimeZone);
//			$date_startdate = JHtml::date($nd_startdate, 'Y-m-d', $eventTimeZone);
//			$time_startdate = JHtml::date($nd_startdate, 'H:i', $eventTimeZone);

			$StDate			= date('Y-m-d H:i', strtotime($nd_startdate));
			$EnDate			= date('Y-m-d H:i', strtotime($nd_enddate));

			$date_enddate	= date('Y-m-d', strtotime($nd_enddate));
			$time_enddate	= date('H:i', strtotime($nd_enddate));
			$date_startdate = date('Y-m-d', strtotime($nd_startdate));
			$time_startdate = date('H:i', strtotime($nd_startdate));

//			$perioddates	= iCDatePeriod::listDates($nd_startdate, $nd_enddate, $eventTimeZone);
			$perioddates	= iCDatePeriod::listDates($nd_startdate, $nd_enddate);

			$only_startdate	= ($nd_weekdays || $nd_weekdays == '0') ? false : true;

			if (isset($perioddates)
				&& $perioddates != NULL
				)
			{
				// Period with no weekdays in Upcoming and Past options
				if ($only_startdate
					&& ($filterTime == '3' || $filterTime == '2')
					)
				{
					array_push($AllDates, $StDate);
				}
				else
				{
					foreach ($perioddates as $Dat)
					{
						if (in_array(date('w', strtotime($Dat)), $WeeksDays))
						{
							$date_Dat	= date('Y-m-d', strtotime($Dat));
							$SingleDate	= date('Y-m-d H:i', strtotime($Dat));

							if ( $date_Dat == $date_today && $filterTime != 3 )
							{
								// Next in Period is today, so set end time
								array_push($AllDates, $date_Dat . ' ' .$time_startdate);
							}
							else
							{
								array_push($AllDates, $SingleDate);
							}
						}
					}
				}
			}

			rsort($AllDates);

			if ($AllDates == NULL)
			{
				$next ='0000-00-00 00:00:00';
			}
			else
			{
				$date_lastdate		= date('Y-m-d', strtotime($AllDates[0]));
				$datetime_lastdate	= date('Y-m-d H:i:s', strtotime($AllDates[0]));

				$date_startdate		= date('Y-m-d', strtotime($nd_startdate));
				$date_enddate		= date('Y-m-d', strtotime($nd_enddate));

				$time_startdate		= date('H:i:s', strtotime($nd_startdate));
				$time_enddate		= date('H:i:s', strtotime($nd_enddate));

				$returnNext			= $nd_next;

				$next_is_set		= '0';

//				$today_SD	= '0';
				$today_upcoming_SD	= '0';
				$upcoming_SD		= '0';

				foreach ($AllDates as $a)
				{
					$tsdate_a = date('Y-m-d', strtotime($a));

					if ($tsdate_a == $date_today)
					{
						// All single dates today
//						$today_SD = $today_SD + 1;
						// All single dates today and not yet started
						$today_upcoming_SD	= (strtotime($a) > strtotime($datetime_today)) ? ($today_upcoming_SD + 1) : $today_upcoming_SD;
					}

					if ($tsdate_a >= $datetime_today)
					{
						// All upcoming single dates
						$upcoming_SD	= $upcoming_SD + 1;
					}
				}

				$total_today_SD = $today_upcoming_SD;

				foreach ($AllDates as $a)
				{
					$tsdatetime_a	= date('Y-m-d H:i:s', strtotime($a));
					$tsdate_a		= date('Y-m-d', strtotime($a));

					// Only past single dates
					if ($datetime_lastdate < $datetime_today
						&& $date_lastdate != $date_today
						&& $next_is_set == '0')
					{
						$returnNext = date('Y-m-d H:i:s', strtotime($AllDates[0]));
						$next_is_set = $next_is_set + 1;
					}

					// The last date is today
					elseif ($date_lastdate == $date_today
						&& $next_is_set == '0'
						&& $total_today_SD == 1)
					{
						// Period divided into days
						if ($nd_startdate != $nodate
							&& $nd_enddate != $nodate
							&& in_array($a, $perioddates)
							&& !$only_startdate
							)
						{
							$returnNext = date('Y-m-d', strtotime($nd_enddate)) . ' ' . $time_startdate;
							$next_is_set = $next_is_set + 1;
						}

						// Full period (from ... to ...)
						elseif ($nd_startdate != $nodate
							&& $nd_enddate != $nodate
							&& in_array($a, $perioddates)
							&& $only_startdate
							)
						{
							$returnNext = date('Y-m-d', strtotime($nd_startdate)) . ' ' . $time_startdate;
							$next_is_set = $next_is_set + 1;
						}

						// Single date
						else
						{
							if ($datetime_lastdate > $datetime_today)
							{
								$today_upcoming_SD = $today_upcoming_SD - 1;
							}

							if ($datetime_lastdate > $datetime_today
								&& $today_upcoming_SD == '0')
							{
								$returnNext = date('Y-m-d H:i:s', strtotime($AllDates[0]));
								$next_is_set = $next_is_set + 1;
							}
						}
					}

					// Multiple upcoming single dates
//					elseif ($tsdatetime_a > $datetime_today)
					// Changed because single dates have no end time, so admitted end time is midnight.
					elseif ($tsdatetime_a > $date_today
						&& $next_is_set == '0')
					{
						// Remaining Today's upcoming dates
						if ($tsdate_a == $date_today)
						{
							if ($tsdatetime_a > $datetime_today)
							{
								$today_upcoming_SD = $today_upcoming_SD - 1;
							}
						}

						// Remaining Upcoming dates
						if ($tsdate_a >= $datetime_today)
						{
							$upcoming_SD = $upcoming_SD - 1;
						}

						if ($today_upcoming_SD == '0'
							&& $upcoming_SD == '0')
						{
							$returnNext = date('Y-m-d H:i:s', strtotime($a));
							$next_is_set = $next_is_set + 1;
						}
					}
				}

				// Test End Date if Next Date or Last Date (3.1.5)
				$date_returnNext	= date('Y-m-d', strtotime($returnNext));
				$time_returnNext	= date('H:i:s', strtotime($returnNext));

				if ( ($date_enddate != '0000-00-00')
					&& ( $date_today == $date_enddate || $date_today == $date_returnNext) )
				{
					$time_LastTime = $time_startdate;
				}
				else
				{
					$time_LastTime = $time_returnNext;
				}

				// Fix 3.1.12 (removed isset($tPeriod))
				if ( ($nd_enddate != $nodate)
					&& ($date_startdate < $date_today)
					&& ($date_enddate == $date_today)
					&& ($time_LastTime >= $time_today) )
				{
//					$returnNextPediod = JHtml::date($nd_enddate, 'Y-m-d', $eventTimeZone) . ' ' . $time_startdate;
					$returnNextPediod = date('Y-m-d', strtotime($nd_enddate)) . ' ' . $time_startdate;
				}
				else
				{
					$returnNextPediod = $returnNext;
				}

				// Set next var
				if ( ($date_returnNext == $date_enddate)
					&& ($date_enddate == $date_today) )
				{
					$next = $returnNextPediod;
				}
				elseif (strtotime($date_startdate) < strtotime($date_today)
					&& strtotime($date_enddate) >= strtotime($date_today)
					&& strtotime($time_enddate) != strtotime($time_returnNext)
					&& strtotime($time_LastTime) > strtotime($time_today)
					)
				{
					$next = $date_returnNext . ' ' . date('H:i:s', strtotime($time_LastTime));
				}
				else
				{
					$next = $returnNext;
				}
			}
			// 3.1.12 Fixed and update events with bug
			if ($nd_next == $nodate
				&& $nd_state == 0
				&& $nd_startdate != $nodate
				&& $nd_enddate != $nodate
				&& strtotime($nd_enddate) >= strtotime($nd_startdate)
				)
			{
				$next = $returnNext;

				$query	= $db->getQuery(true);
				$query->update('#__icagenda_events');
				$query->set('`state`=1');
				$query->where('`id`='.(int)$nd_id);
				$db->setQuery($query);
				$db->query($query);
			}

			if ($next != $nd_next)
			{
				$query	= $db->getQuery(true);
				$query->update('#__icagenda_events');
				$query->set("`next`='".$next."'");
				$query->where('`id`='.(int)$nd_id);
				$db->setQuery($query);
				$db->query($query);
			}
		}
	}

	/**
	 * Returns the element of a SQL query WHERE clause to support filtering the selection of Events using Event Features
	 *
	 * Controlled by menu parameters:
	 *  features_filter - array of Feature IDs
	 *  features_incl_excl - indicates whether the Feature IDs are to be used to include or exclude Events
	 *  features_any_all - indicates whether any Feature ID or all Feature IDs required to include or exclude an Event
	 *
	 * One or more sub-queries is referenced in a WHERE clause with IN() or NOT IN() to include or exclude Events.
	 *
	 * If any Feature ID in isolation is to include or exclude Event records then a single sub-query is used that
	 * uses a simple inner join between the feature and feature_xref tables to identify the distinct set of Event IDs
	 * linked to any one of the spacific Feature IDs.
	 *
	 * If all Feature IDs combined are required to include or exclude Events then separate sub-queries are used for
	 * each of the spacific Feature IDs. For this case, a more efficient option is available involving a direct join
	 * with either an inner or outer join, according to whether records are being included or excluded but this
	 * puts an unreasonable constraint on the overall syntax of the query.
	 */
	public static function getFeaturesFilter()
	{
		// get the application object
		$app = JFactory::getApplication();
		$params = $app->getParams();

		// Initialise a return value that can be included harmlessly in a WHERE clause, if necessary
		$filter = ' TRUE ';
		$featureids = $params->get('features_filter', '');

		if (is_array($featureids) && !empty($featureids))
		{
			$db = Jfactory::getDbo();
			$incl_excl = $params->get('features_incl_excl', '1') == '1' ? '' : 'NOT';

			if ($params->get('features_any_all', '1') == '1')
			{
				// Any single Feature ID will include or exclude events
				// Create comma separated list of Feature IDs
				$featureids = implode(',', $featureids);
				// Create a single sub-query
				$sub_query = $db->getQuery(true);
				$sub_query->select('fx.event_id')
					->from('#__icagenda_feature_xref AS fx')
					->innerJoin("#__icagenda_feature AS f ON fx.feature_id=f.id AND f.state=1 AND f.show_filter=1 AND f.id IN($featureids)");
				// Join the sub-query to the main query
				$filter = "(e.id $incl_excl IN(" . (string) $sub_query . '))';
			}
			else
			{
				// All Feature IDs combined will include or exclude events
				// Create a separate sub-query for each of the Feature IDs
				$sub_queries = array();

				foreach ($featureids as $featureid)
				{
					$sub_query = $db->getQuery(true);
					$sub_query->select('fx.event_id')
						->from('#__icagenda_feature_xref AS fx')
						->innerJoin("#__icagenda_feature AS f ON fx.feature_id=f.id AND f.state=1 AND f.show_filter=1 AND f.id=$featureid");
					$sub_queries[] = "e.id $incl_excl IN(" . (string) $sub_query . ')';
				}

				// Combine the sub-queries depending on inclusion or exclusion of events
				$filter = "(" . implode($incl_excl == 'NOT' ? " \nOR " : " \nAND ", $sub_queries) . ')';
			}
		}

		return $filter;
	}

	/**
	 * Return Array of all registrations from an event (date@@people)
	 * date : registered date
	 * people : nb of tickets for this registration
	 *
	 * @since	3.5.0
	 */
	public static function registeredList($id = null)
	{
		// Registrations total
		$db		= Jfactory::getDbo();
		$query	= $db->getQuery(true);
		$query->select('r.date AS date, r.eventid AS eventid, r.people AS people');
		$query->from('`#__icagenda_registration` AS r');
		$query->where('r.state = 1');

		if ($id)
		{
			$query->where('r.eventid = ' . $db->q($id));
		}

		$db->setQuery($query);
		$result = $db->loadObjectList();

		$registeredList = array();

		foreach ($result AS $r)
		{
			$reg_date = $r->date ? $r->date : 'period';
			$registeredList[] = $r->eventid . '@@' . $reg_date . '@@' . $r->people;
		}

		return $registeredList;
	}

	/**
	 * Return list of all dates (singles and period) from an event
	 *
	 * @since	3.5.0 (Not Yet Used)
	 */
	public static function thisEventDates($id)
	{
		// Set vars
		$nodate			= '0000-00-00 00:00:00';
		$ic_nodate		= '0000-00-00 00:00';
		$eventTimeZone	= null;

		// Get Data
		$db		= Jfactory::getDbo();
		$query	= $db->getQuery(true);
        $query->select('e.next, e.dates, e.startdate, e.enddate, e.period, e.weekdays, e.displaytime, e.id');
        $query->from('#__icagenda_events AS e');
		$query->leftJoin('`#__icagenda_category` AS c ON c.id = e.catid');
		$query->where('c.state = 1');
		$query->where('e.id = ' . $db->q($id));
		$db->setQuery($query);
		$result = $db->loadObjectList();

		// Get Data
		$tId			= $id;
		$tDates			= $result->dates;
		$tStartdate		= $result->startdate;
		$tEnddate		= $result->enddate;
		$tWeekdays		= $result->weekdays;

		// Declare AllDates array
		$thisEventDates = array();

		// Get WeekDays Array
		$WeeksDays = iCDatePeriod::weekdaysToArray($tWeekdays);

		// If Single Dates, added each one to All Dates for this event
		$singledates = unserialize($tDates);

		foreach ($singledates as $sd)
		{
			$isValid = iCDate::isDate($sd);

			if ($isValid)
			{
				array_push($thisEventDates, $sd);
			}
		}

		$perioddates = iCDatePeriod::listDates($tStartdate, $tEnddate, $eventTimeZone);

		if (isset ($perioddates)
			&& $perioddates != NULL)
		{
			foreach ($perioddates as $Dat)
			{
				if (in_array(date('w', strtotime($Dat)), $WeeksDays))
				{
					$isValid = iCDate::isDate($Dat);

					if ($isValid)
					{
//						$SingleDate = JHtml::date($Dat, 'Y-m-d H:i:s', $eventTimeZone);
						$SingleDate = date('Y-m-d H:i:s', strtotime($Dat));

						array_push($thisEventDates, $SingleDate);
					}
				}
			}
		}

		return $thisEventDates;
	}
}
components/com_icagenda/utilities/events/index.html000060400000000037152453623450016643 0ustar00<!DOCTYPE html><title></title>
components/com_icagenda/utilities/menus/menus.php000060400000016174152453623450016342 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     iCagenda
 * @subpackage  utilities
 * @copyright   Copyright (c)2014-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.12 2015-09-10
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * class icagendaCategories
 */
class icagendaMenus
{
	/**
	 * Function to return all published 'List of Events' menu items
	 *
	 * @access	public static
	 * @param	none
	 * @return	array of menu item info this way : Itemid-mcatid-lang
	 *
	 * @since	3.4.0
	 */
	static public function iClistMenuItemsInfo()
	{
		$app = JFactory::getApplication();
//		$params		= $app->getParams();
		$iCparams	= JComponentHelper::getParams('com_icagenda');

		// List all menu items linking to list of events
		$db		= JFactory::getDbo();
		$query	= $db->getQuery(true);
		$query->select('m.title, m.published, m.id, m.params, m.language')
			->from('`#__menu` AS m')
			->where( "(m.link = 'index.php?option=com_icagenda&view=list') AND (m.published = 1)" );

		if (JLanguageMultilang::isEnabled())
		{
			$query->where('m.language in (' . $db->quote(JFactory::getLanguage()->getTag()) . ',' . $db->quote('*') . ')');
		}

		$db->setQuery($query);
		$link = $db->loadObjectList();

		$iC_list_menus = array();

		foreach ($link as $iClistMenu)
		{
			$menuitemid	= $iClistMenu->id;
//			$menulang	= $iClistMenu->language;

			if ($menuitemid)
			{
				$menu		= $app->getMenu();
				$menuparams	= $menu->getParams($menuitemid);
			}

			$mcatid		= $menuparams->get('mcatid');
			$menufilter	= $menuparams->get('time') ? $menuparams->get('time') : $iCparams->get('time', '0');

			if (is_array($mcatid))
			{
				$mcatid	= implode(',', $mcatid);
			}

//			array_push($iC_list_menus, $menuitemid . '_' . $mcatid . '_' . $menulang . '_' . $menufilter);
			array_push($iC_list_menus, $menuitemid . '_' . $mcatid . '_' . $menufilter);
		}

		return $iC_list_menus;
	}

	/**
	 * Function to return all published 'List of Events' menu items
	 *
	 * @access	public static
	 * @param	none
	 * @return	array of menu item info this way : Itemid-mcatid-lang
	 *
	 * @since	3.4.0
	 */
	static public function iClistMenuItems()
	{
		$app = JFactory::getApplication();

		// List all menu items linking to list of events
		$db		= JFactory::getDbo();
		$query	= $db->getQuery(true);
		$query->select('m.title, m.published, m.id, m.params, m.language')
			->from('`#__menu` AS m')
			->where( "(m.link = 'index.php?option=com_icagenda&view=list') AND (m.published = 1)" );

		if (JLanguageMultilang::isEnabled())
		{
			$query->where('m.language in (' . $db->quote(JFactory::getLanguage()->getTag()) . ',' . $db->quote('*') . ')');
		}

		$query->order('m.id ASC');

		$db->setQuery($query);
		$iC_list_menu_items = $db->loadObjectList();

		if ($iC_list_menu_items)
		{
			return $iC_list_menu_items;
		}
		else
		{
			return array();
		}
	}

	/**
	 * Function to return menu Itemid to display an event
	 *
	 * @access	public static
	 * @return	menu Itemid
	 *
	 * @since	3.5.7
	 */
	static public function thisEventItemid($date, $category, $array_menuitems = null)
	{
		$iC_list_menus = $array_menuitems ? $array_menuitems : self::iClistMenuItemsInfo();

		$datetime_today	= JHtml::date('now', 'Y-m-d H:i');
		$date_today		= JHtml::date('now', 'Y-m-d');

		// set menu link for each event (itemID) depending of category and/or language
		$onecat		= $multicat		= '0';
		$link_one	= $link_multi	= '';

		$menu_IDs_category	= array();
		$menu_IDs_all		= array();
		$itemID_is_set		= 0;

		foreach ($iC_list_menus AS $iCm)
		{
			$value			= explode('_', $iCm);
			$iCmenu_id		= $value['0'];
			$iCmenu_mcatid	= $value['1'];
			$iCmenu_filter	= $value['2'];

			$iCmenu_mcatid_array = ! is_array($iCmenu_mcatid) ? explode(',', $iCmenu_mcatid) : array();

			// Menu can display past events
			if ($iCmenu_filter == 2
				&& strtotime($date) < strtotime($datetime_today)
				&& ! $itemID_is_set)
			{
				// If menu category filter is set, and item category is in filtered categories
				if (in_array($category, $iCmenu_mcatid_array))
				{
					$menu_IDs_category[] = $iCmenu_id;
					$itemID_is_set = $itemID_is_set + 1;
				}
				elseif ( ! $iCmenu_mcatid)
				{
					$menu_IDs_all[] = $iCmenu_id;
				}
			}

			// Menu can display today's events
			elseif ($iCmenu_filter == 4
				&& strtotime($date) > strtotime($date_today)
				&& strtotime($date) < strtotime("+1 DAY", strtotime($date_today))
				&& ! $itemID_is_set)
			{
				// If menu category filter is set, and item category is in filtered categories
				if (in_array($category, $iCmenu_mcatid_array))
				{
					$menu_IDs_category[] = $iCmenu_id;
					$itemID_is_set = $itemID_is_set + 1;
				}
				elseif ( ! $iCmenu_mcatid)
				{
					$menu_IDs_all[] = $iCmenu_id;
				}
			}

			// Menu can display today's events and upcoming events
			elseif ($iCmenu_filter == 1
				&& strtotime($date) > strtotime($date_today)
				&& ! $itemID_is_set)
			{
				// If menu category filter is set, and item category is in filtered categories
				if (in_array($category, $iCmenu_mcatid_array))
				{
					$menu_IDs_category[] = $iCmenu_id;
					$itemID_is_set = $itemID_is_set + 1;
				}
				elseif ( ! $iCmenu_mcatid)
				{
					$menu_IDs_all[] = $iCmenu_id;
				}
			}

			// Menu can display upcoming events
			elseif ($iCmenu_filter == 3
				&& strtotime($date) > strtotime($datetime_today)
				&& ! $itemID_is_set)
			{
				// If menu category filter is set, and item category is in filtered categories
				if (in_array($category, $iCmenu_mcatid_array))
				{
					$menu_IDs_category[] = $iCmenu_id;
					$itemID_is_set = $itemID_is_set + 1;
				}
				elseif ( ! $iCmenu_mcatid)
				{
					$menu_IDs_all[] = $iCmenu_id;
				}
			}

			// Menu can display all events
			elseif ($iCmenu_filter == '0'
				&&  ! $itemID_is_set)
			{
				// If menu category filter is set, and item category is in filtered categories
				if (in_array($category, $iCmenu_mcatid_array))
				{
					$menu_IDs_category[] = $iCmenu_id;
					$itemID_is_set = $itemID_is_set + 1;
				}
				elseif ( ! $iCmenu_mcatid)
				{
					$menu_IDs_all[] = $iCmenu_id;
				}
			}

			if ($iCmenu_mcatid)
			{
				$nb_cat_filter = count($iCmenu_mcatid_array);

				for ($i = $category; in_array($i, $iCmenu_mcatid_array); $i++)
				{
					if ($nb_cat_filter == 1)
					{
						$link_one = $iCmenu_id;
					}
					elseif ($nb_cat_filter > 1)
					{
						$link_multi = $iCmenu_id;
					}
				}
			}
		}

		if (count($menu_IDs_category))
		{
			if ($link_one)
			{
				$linkid = $link_one;
			}
			elseif ($link_multi)
			{
				$linkid = $link_multi;
			}
			else
			{
				$linkid = $menu_IDs_category[0];
			}
		}
		elseif (count($menu_IDs_all))
		{
			$linkid = $menu_IDs_all[0];
		}
		else
		{
//			$linkid = '#';
			$linkid = null;
		}

		return $linkid;
	}
}
components/com_icagenda/utilities/menus/index.html000060400000000037152453623450016466 0ustar00<!DOCTYPE html><title></title>
components/com_icagenda/utilities/index.html000060400000000037152453623450015337 0ustar00<!DOCTYPE html><title></title>
components/com_icagenda/utilities/thumb/thumb.php000060400000010541152453623450016312 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iC Library - Library by Jooml!C, for Joomla!
 *------------------------------------------------------------------------------
 * @package     iCagenda
 * @subpackage  utilities
 * @copyright   Copyright (c)2014-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.0 2015-02-20
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * class icagendaThumb
 */
class icagendaThumb
{
	/**
	 * Return the LARGE thumbnail from an image
	 * Generated by iCagenda with Global Options settings
	 *
	 * @since       3.4.0
	 */
	static public function sizeLarge($image, $type = null, $checksize = null)
	{
		$thumbsPath = self::iCagendaImagesPath();

		// Options Large Size
		$thumbOptions = JComponentHelper::getParams('com_icagenda')->get('thumb_large');
		$width = is_numeric($thumbOptions[0]) ? $thumbOptions[0] : '900';
		$height = is_numeric($thumbOptions[1]) ? $thumbOptions[1] : '600';
		$quality = is_numeric($thumbOptions[2]) ? $thumbOptions[2] : '100';
		$crop = !empty($thumbOptions[3]) ? true : false;

		// Generate large thumb if not exist
		$sizeLarge = iCThumbGet::thumbnail($image, $thumbsPath, 'themes', $width, $height, $quality, $crop, 'ic_large', $type, $checksize);

		return $sizeLarge;
	}

	/**
	 * Return the MEDIUM thumbnail from an image
	 * Generated by iCagenda with Global Options settings
	 *
	 * @since       3.4.0
	 */
	static public function sizeMedium($image, $type = null, $checksize = null)
	{
		$thumbsPath = self::iCagendaImagesPath();

		// Options Medium Size
		$thumbOptions = JComponentHelper::getParams('com_icagenda')->get('thumb_medium');
		$width = is_numeric($thumbOptions[0]) ? $thumbOptions[0] : '300';
		$height = is_numeric($thumbOptions[1]) ? $thumbOptions[1] : '300';
		$quality = is_numeric($thumbOptions[2]) ? $thumbOptions[2] : '100';
		$crop = !empty($thumbOptions[3]) ? true : false;

		// Generate medium thumb if not exist
		$sizeMedium = iCThumbGet::thumbnail($image, $thumbsPath, 'themes', $width, $height, $quality, $crop, 'ic_medium', $type, $checksize);

		return $sizeMedium;
	}

	/**
	 * Return the SMALL thumbnail from an image
	 * Generated by iCagenda with Global Options settings
	 *
	 * @since       3.4.0
	 */
	static public function sizeSmall($image, $type = null, $checksize = null)
	{
		$thumbsPath = self::iCagendaImagesPath();

		// Options Small Size
		$thumbOptions = JComponentHelper::getParams('com_icagenda')->get('thumb_small');
		$width = is_numeric($thumbOptions[0]) ? $thumbOptions[0] : '100';
		$height = is_numeric($thumbOptions[1]) ? $thumbOptions[1] : '100';
		$quality = is_numeric($thumbOptions[2]) ? $thumbOptions[2] : '100';
		$crop = !empty($thumbOptions[3]) ? true : false;

		// Generate small thumb if not exist
		$sizeSmall = iCThumbGet::thumbnail($image, $thumbsPath, 'themes', $width, $height, $quality, $crop, 'ic_small', $type, $checksize);

		return $sizeSmall;
	}

	/**
	 * Return the SMALL thumbnail from an image
	 * Generated by iCagenda with Global Options settings
	 *
	 * @since       3.4.0
	 */
	static public function sizeXSmall($image, $type = null, $checksize = null)
	{
		$thumbsPath = self::iCagendaImagesPath();

		// Options XSmall Size
		$thumbOptions = JComponentHelper::getParams('com_icagenda')->get('thumb_xsmall');
		$width = is_numeric($thumbOptions[0]) ? $thumbOptions[0] : '48';
		$height = is_numeric($thumbOptions[1]) ? $thumbOptions[1] : '48';
		$quality = is_numeric($thumbOptions[2]) ? $thumbOptions[2] : '80';
		$crop = !empty($thumbOptions[3]) ? true : false;

		// Generate xsmall thumb if not exist
		$sizeXSmall = iCThumbGet::thumbnail($image, $thumbsPath, 'themes', $width, $height, $quality, $crop, 'ic_xsmall', $type, $checksize);

		return $sizeXSmall;
	}

	/**
	 * Return the iCagenda images path
	 *
	 * @since       3.4.0
	 */
	static public function iCagendaImagesPath()
	{
		// Get media path
		$params_media = JComponentHelper::getParams('com_media');
		$image_path = $params_media->get('image_path', 'images');

		// Paths to thumbs folder
		$thumbsPath = $image_path . '/icagenda/thumbs';

		return $thumbsPath;
	}
}
components/com_icagenda/utilities/thumb/index.html000060400000000037152453623450016456 0ustar00<!DOCTYPE html><title></title>
components/com_icagenda/config.xml000060400000151244152453623450013325 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset name="component"
		label="COM_ICAGENDA_COMPONENT_LABEL"
		addfieldpath="/administrator/components/com_icagenda/assets/elements"
		>
		<field
			type="TitleImg"
			label="COM_ICAGENDA_DESC"
			class="styleblanck"
			icimage="joomlic_iCagenda.png"
			/>
		<field name="version" type="hidden" class="inputbox" />
		<field name="release" type="hidden" class="inputbox" />
		<field name="icsys" type="hidden" class="inputbox" />
		<field name="author" type="hidden" class="inputbox" />
		<field name="bootstrapType" type="hidden" class="inputbox" default="1"/>
	</fieldset>

	<fieldset name="list"
		label="ICLIST" description="COM_ICAGENDA_LIST_PARAMS_DESC"
		addfieldpath="/administrator/components/com_icagenda/models/fields"
		>
		<field
			type="TitleImg"
			label="COM_ICAGENDA_LIST_FILTERS"
			class="stylebox lead input-xxlarge"
			icicon="filter"
			/>
		<!--field
			name="datesDisplay"
			type="list"
			label="COM_ICAGENDA_LIST_TYPE_LBL"
			description="COM_ICAGENDA_LIST_TYPE_DESC"
			class="inputbox"
			default="2"
			>
			<option value="1">COM_ICAGENDA_LIST_ALL_DATES</option>
			<option value="2">COM_ICAGENDA_LIST_ALL_EVENTS</option>
		</field-->
		<field
			name="time"
			type="list"
			class="inputbox"
			label="COM_ICAGENDA_TIME_LBL"
			description="COM_ICAGENDA_TIME_DESC"
			default="0">
			<option value="2">COM_ICAGENDA_OPTION_PAST_EVENTS</option>
			<option value="4">COM_ICAGENDA_OPTION_CURRENT_EVENTS_TODAY_EVENTS</option>
			<option value="1">COM_ICAGENDA_OPTION_CURRENT_EVENTS_TODAY_AND_UPCOMING_EVENTS</option>
			<option value="3">COM_ICAGENDA_OPTION_UPCOMING_EVENTS</option>
			<option value="0">COM_ICAGENDA_OPTION_ALL_EVENTS</option>
		</field>
		<field
			name="orderby"
			type="list"
			label="COM_ICAGENDA_LBL_DATE"
			description="COM_ICAGENDA_DESC_DATE"
			default="2">
				<option value="1">COM_ICAGENDA_DATE_DESC</option>
				<option value="2">COM_ICAGENDA_DATE_ASC</option>
		</field>
		<field
			name="datesDisplay"
			type="radio"
			label="COM_ICAGENDA_LIST_TYPE_LBL"
			description="COM_ICAGENDA_LIST_TYPE_DESC"
			class="btn-group"
			labelclass="control-label"
			onchange="icalert()"
			default="1">
				<option value="1">JYES</option>
				<option value="2">JNO</option>
		</field>
		<field
			type="TitleImg"
			label="COM_ICAGENDA_LIST_HEADER"
			class="stylebox lead input-xxlarge"
			icicon="bi-color-header"
			/>
		<field
			name="headerList"
			type="list"
			default="1"
			label="COM_ICAGENDA_LIST_HEADER_LABEL"
			description="COM_ICAGENDA_LIST_HEADER_DESC"
			>
			<option value="1">JALL</option>
			<option value="2">COM_ICAGENDA_LIST_HEADER_ONLY_TITLE</option>
			<option value="3">COM_ICAGENDA_LIST_HEADER_ONLY_SUBTITLE</option>
			<option value="4">JNONE</option>
		</field>
		<field
			name="CatDesc_global"
			type="modal_icmulti_opt"
			label="COM_ICAGENDA_DISPLAY_CATINFOS_LABEL"
			description="COM_ICAGENDA_DISPLAY_CATINFOS_DESC"
			default="0"
			labelclass="control-label"
			/>
		<field
			name="CatDesc_checkbox"
			type="modal_icmulti_checkbox"
			label=" "
			class="checkbox"
			labelclass="control-label"
			/>
		<field
			type="TitleImg"
			label="COM_ICAGENDA_LIST_NAVIGATOR"
			class="stylebox lead input-xxlarge"
			icicon="navigation"
			/>
		<field
			name="navposition"
			type="list"
			label="COM_ICAGENDA_LIST_NAVIGATOR_POSITION_LABEL"
			description="COM_ICAGENDA_LIST_NAVIGATOR_POSITION_DESC"
			default="1"
			>
			<option value="0">COM_ICAGENDA_TOP</option>
			<option value="1">COM_ICAGENDA_BOTTOM</option>
			<option value="2">COM_ICAGENDA_TOP_AND_BOTTOM</option>
		</field>
		<field
			name="arrowtext"
			type="radio"
			label="COM_ICAGENDA_LIST_ARROWS_TEXT_LABEL"
			description="COM_ICAGENDA_LIST_ARROWS_TEXT_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="pagination"
			type="radio"
			label="COM_ICAGENDA_LIST_PAGINATION_LABEL"
			description="COM_ICAGENDA_LIST_PAGINATION_TEXT_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			type="TitleImg"
			label="COM_ICAGENDA_LIST_DATEBOX"
			class="stylebox lead input-xxlarge"
			icicon="calendar-2"
			/>
		<field
			name="day_display_global"
			type="radio"
			label="COM_ICAGENDA_LIST_DATEBOX_DAY_DISPLAY_LABEL"
			description="COM_ICAGENDA_LIST_DATEBOX_DAY_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			filter="options"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="month_display_global"
			type="radio"
			label="COM_ICAGENDA_LIST_DATEBOX_MONTH_DISPLAY_LABEL"
			description="COM_ICAGENDA_LIST_DATEBOX_MONTH_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			filter="options"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="year_display_global"
			type="radio"
			label="COM_ICAGENDA_LIST_DATEBOX_YEAR_DISPLAY_LABEL"
			description="COM_ICAGENDA_LIST_DATEBOX_YEAR_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			filter="options"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="time_display_global"
			type="radio"
			label="COM_ICAGENDA_LIST_DATEBOX_TIME_DISPLAY_LABEL"
			description="COM_ICAGENDA_LIST_DATEBOX_TIME_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			filter="options"
			default="0"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			type="TitleImg"
			label="COM_ICAGENDA_LIST_INFORMATION"
			class="stylebox lead input-xxlarge"
			icicon="info"
			/>
		<field
			name="list_title_length"
			type="text"
			class="input-mini"
			label="COM_ICAGENDA_LIST_TITLE_LENGTH_LABEL"
			description="COM_ICAGENDA_LIST_TITLE_LENGTH_DESC"
			default=""
			/>
		<field
			name="venue_display_global"
			type="radio"
			label="COM_ICAGENDA_LIST_VENUE_DISPLAY_LABEL"
			description="COM_ICAGENDA_LIST_VENUE_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			filter="options"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="city_display_global"
			type="radio"
			label="COM_ICAGENDA_LIST_CITY_DISPLAY_LABEL"
			description="COM_ICAGENDA_LIST_CITY_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			filter="options"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="country_display_global"
			type="radio"
			label="COM_ICAGENDA_LIST_COUNTRY_DISPLAY_LABEL"
			description="COM_ICAGENDA_LIST_COUNTRY_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			filter="options"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="shortdesc_display_global"
			type="radio"
			label="COM_ICAGENDA_LIST_INTROTEXT_DISPLAY_LABEL"
			description="COM_ICAGENDA_LIST_INTROTEXT_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			filter="options"
			default=""
			>
			<option value="">IC_AUTO</option>
			<option value="0">JHIDE</option>
			<option value="1">IC_SHORTDESC</option>
			<option value="2">IC_AUTO_INTROTEXT</option>
		</field>
	</fieldset>

	<fieldset name="details"
		label="ICEVENT"
		description="COM_ICAGENDA_EVENT_PARAMS_DESC"
		>
		<field
			type="TitleImg"
			label="ICDESC"
			class="stylebox lead input-xxlarge"
			icicon="iclogo"
			/>
		<field
			name="desc_display_event"
			type="list"
			label="COM_ICAGENDA_EVENT_DESCRIPTION_DISPLAY_LABEL"
			description="COM_ICAGENDA_EVENT_DESCRIPTION_DISPLAY_DESC"
			filter="options"
			default=""
			>
			<option value="">IC_AUTO</option>
			<option value="1">IC_FULLDESC</option>
			<option value="2">IC_SHORTDESCRIPTION</option>
			<option value="3">IC_SHORT_AND_FULL_DESCRIPTION</option>
			<option value="0">JHIDE</option>
		</field>
		<field
			type="TitleImg"
			label="COM_ICAGENDA_LEGEND_INFORMATION"
			class="stylebox lead input-xxlarge"
			icicon="info"
			/>
		<field
			name="infoDetails"
			type="radio"
			label="COM_ICAGENDA_INFORMATION_LABEL"
			description="COM_ICAGENDA_INFORMATION_DESC"
			class="btn-group"
			labelclass="control-label"
			filter="options"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="accessInfoDetails"
			type="accesslevel"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			class="inputbox"
			size="1"
			default="1"
			/>
		<field
			name="targetLink"
			type="list"
			label="COM_ICAGENDA_TARGET_LINK_LABEL"
			description="COM_ICAGENDA_TARGET_LINK_DESC"
			class="inputbox"
			filter="options"
			default="1"
			>
			<option value="0">JBROWSERTARGET_PARENT</option>
			<option value="1">JBROWSERTARGET_NEW</option>
		</field>
		<field
			type="TitleImg"
			label="COM_ICAGENDA_LEGEND_GOOGLE_MAPS"
			class="stylebox lead input-xxlarge"
			icicon="location"
			/>
		<field
			name="GoogleMaps"
			type="radio"
			label="COM_ICAGENDA_LEGEND_GOOGLE_MAPS"
			description="COM_ICAGENDA_GOOGLE_MAPS_DESC"
			class="btn-group"
			labelclass="control-label"
			filter="options"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="accessGoogleMaps"
			type="accesslevel"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			class="inputbox"
			size="1"
			default="1"
			/>
		<field
			type="TitleImg"
			label="COM_ICAGENDA_EVENT_ALL_DATES"
			class="stylebox lead input-xxlarge"
			icicon="calendar"
			/>
		<field
			type="TitleImg"
			label="COM_ICAGENDA_EVENT_ALL_DATES_DESC"
			class="stylenote alert alert-info input-xxlarge"
			icicon="info-circle"
			/>
		<field
			name="SingleDates"
			type="radio"
			label="COM_ICAGENDA_EVENT_SINGLE_DATES_LABEL"
			description="COM_ICAGENDA_EVENT_SINGLE_DATES_DESC"
			class="btn-group"
			labelclass="control-label"
			filter="options"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<!--field
			name="accessSingleDates"
			type="accesslevel"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			class="inputbox"
			size="1"
		/-->
		<field
			name="SingleDatesOrder"
			type="list"
			label="COM_ICAGENDA_LBL_DATE"
			description="COM_ICAGENDA_DESC_DATE"
			class="inputbox"
			default="1"
			>
			<option value="1">COM_ICAGENDA_DATE_DESC</option>
			<option value="2">COM_ICAGENDA_DATE_ASC</option>
		</field>
		<field
			name="SingleDatesListModel"
			type="list"
			label="COM_ICAGENDA_EVENT_SINGLE_DATES_LIST_LABEL"
			description="COM_ICAGENDA_EVENT_SINGLE_DATES_LIST_DESC"
			class="inputbox"
			default="1"
			>
			<option value="1">COM_ICAGENDA_EVENT_SINGLE_DATES_VERTICAL</option>
			<option value="2">COM_ICAGENDA_EVENT_SINGLE_DATES_HORIZONTAL</option>
		</field>
		<field type="Title" label=" " class="stylenote" />
		<field
			name="PeriodDates"
			type="radio"
			label="COM_ICAGENDA_EVENT_PERIOD_LABEL"
			description="COM_ICAGENDA_EVENT_PERIOD_DESC"
			class="btn-group"
			labelclass="control-label"
			filter="options"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<!--field
			name="accessPeriodDates"
			type="accesslevel"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			class="inputbox"
			size="1"
		/-->
		<field
			type="TitleImg"
			label="COM_ICAGENDA_LIST_OF_PARTICIPANTS_LABEL"
			class="stylebox lead input-xxlarge"
			icicon="people"
			/>
		<field
			name="participantList"
			type="radio"
			label="COM_ICAGENDA_LIST_OF_PARTICIPANTS_LABEL"
			description="COM_ICAGENDA_LIST_OF_PARTICIPANTS_DESC"
			class="btn-group"
			labelclass="control-label"
			filter="options"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="accessParticipantList"
			type="accesslevel"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			class="inputbox"
			size="1"
			default="1"
			/>
		<field
			name="participantSlide"
			type="radio"
			label="COM_ICAGENDA_LIST_OF_PARTICIPANTS_SLIDE_LABEL"
			description="COM_ICAGENDA_LIST_OF_PARTICIPANTS_SLIDE_DESC"
			class="btn-group"
			labelclass="control-label"
			filter="options"
			default="1"
			>
			<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>
		<field
			name="participantDisplay"
			type="list"
			label="COM_ICAGENDA_LIST_OF_PARTICIPANTS_DISPLAY_LABEL"
			description="COM_ICAGENDA_LIST_OF_PARTICIPANTS_DISPLAY_DESC"
			class="inputbox"
			filter="options"
			default="1"
			>
			<option value="1">COM_ICAGENDA_LIST_OF_PARTICIPANTS_DISPLAY_FULL</option>
			<option value="2">COM_ICAGENDA_LIST_OF_PARTICIPANTS_DISPLAY_AVATAR</option>
			<option value="3">COM_ICAGENDA_LIST_OF_PARTICIPANTS_DISPLAY_NAMES</option>
		</field>
		<field
			name="fullListColumns"
			type="radio"
			label="COM_ICAGENDA_LIST_DISPLAY_FULL_COLUMN_LABEL"
			description="COM_ICAGENDA_LIST_DISPLAY_FULL_COLUMN_DESC"
			class="btn-group"
			labelclass="control-label"
			filter="options"
			default="tiers"
			>
			<option value="total">1</option>
			<option value="demi">2</option>
			<option value="tiers">3</option>
			<option value="quart">4</option>
		</field>
	</fieldset>

	<fieldset name="register"
		label="COM_ICAGENDA_REGISTRATION_LABEL"
		description="COM_ICAGENDA_REGISTRATION_TO_EVENT_DESC"
		>
		<field
			type="TitleImg"
			label="COM_ICAGENDA_TITLE_REGISTRATION"
			class="stylebox lead input-xxlarge"
			icicon="register"
			/>
		<field
			name="statutReg"
			type="radio"
			label="COM_ICAGENDA_REGISTRATIONS_LABEL"
			description="COM_ICAGENDA_REGISTRATIONS_DESC"
			class="btn-group"
			labelclass="control-label"
			default="0"
			>
			<option value="0">JOFF</option>
			<option value="1">JON</option>
		</field>
		<field
			name="reg_form_access"
			type="accesslevel"
			label="JFIELD_ACCESS_LABEL"
			description="COM_ICAGENDA_REGISTRATION_ACCESS_LEVEL_DESC"
			class="inputbox"
			size="1"
			default="1"
			/>
		<field
			name="maxRlist"
			type="text"
			label="COM_ICAGENDA_MAX_PER_REGISTRATION_LABEL"
			description="COM_ICAGENDA_MAX_PER_REGISTRATION_DESC"
			class="inputbox input-mini"
			size="2"
			default="5"
			/>
		<field
			type="TitleImg"
			label="COM_ICAGENDA_FORM_LABEL"
			class="stylebox lead input-xxlarge"
			icicon="form"
			/>
		<field
			name="RegButtonText"
			type="modal_ph_regbt"
			label="COM_ICAGENDA_REGISTRATION_BUTTON_TEXT"
			description="COM_ICAGENDA_OVERRIDE_BUTTON_TEXT_DESC"
			default=""
			/>
		<!-- Hidden Control Field for Checkdnsrr -->
		<field
			name="Checkdnsrr"
			type="modal_checkdnsrr"
			label=" "
			description=" "
			/>
		<field type="Title" label="COM_ICAGENDA_REGISTRATION_EMAIL_FIELD" class="stylesub" />
		<field
			name="emailRequired"
			type="radio"
			label="COM_ICAGENDA_REGISTRATION_EMAIL_REQUIRED_LABEL"
			description="COM_ICAGENDA_REGISTRATION_EMAIL_REQUIRED_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>
		<field
			name="limitRegEmail"
			type="radio"
			label="COM_ICAGENDA_REGISTRATION_LIMIT_EMAIL_LABEL"
			description="COM_ICAGENDA_REGISTRATION_LIMIT_EMAIL_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>
		<field
			name="limitRegDate"
			type="radio"
			label="COM_ICAGENDA_REGISTRATION_LIMIT_DATE_LABEL"
			description="COM_ICAGENDA_REGISTRATION_LIMIT_DATE_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>
		<field
			name="emailCheckdnsrr"
			type="radio"
			label="COM_ICAGENDA_REGISTRATION_EMAIL_CHECKDNSRR_LABEL"
			description="COM_ICAGENDA_REGISTRATION_EMAIL_CHECKDNSRR_DESC"
			class="btn-group"
			labelclass="control-label"
			default="0"
			>
			<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>
		<field type="Title" label="COM_ICAGENDA_REGISTRATION_EMAIL_CONFIRM_FIELD" class="stylesub" />
		<field
			name="emailConfirm"
			type="radio"
			label="COM_ICAGENDA_REGISTRATION_EMAIL_CONFIRM_DISPLAY_LABEL"
			description="COM_ICAGENDA_REGISTRATION_EMAIL_CONFIRM_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field type="Title" label="COM_ICAGENDA_REGISTRATION_PHONE_FIELD" class="stylesub" />
		<field
			name="phoneDisplay"
			type="radio"
			label="COM_ICAGENDA_REGISTRATION_PHONE_DISPLAY_LABEL"
			description="COM_ICAGENDA_REGISTRATION_PHONE_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="phoneRequired"
			type="radio"
			label="COM_ICAGENDA_REGISTRATION_PHONE_REQUIRED_LABEL"
			description="COM_ICAGENDA_REGISTRATION_PHONE_REQUIRED_DESC"
			class="btn-group"
			labelclass="control-label"
			default="0"
			>
			<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>
		<field type="Title" label="COM_ICAGENDA_REGISTRATION_NOTES_FIELD" class="stylesub" />
		<field
			name="notesDisplay"
			type="radio"
			label="COM_ICAGENDA_REGISTRATION_NOTES_DISPLAY_LABEL"
			description="COM_ICAGENDA_REGISTRATION_NOTES_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			default="0"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field type="Title" label="COM_ICAGENDA_CAPTCHA" class="stylesub" />
		<field
			name="reg_captcha"
			type="radio"
			label="COM_ICAGENDA_CAPTCHA"
			description="COM_ICAGENDA_REGISTRATION_CAPTCHA_DESC"
			class="btn-group"
			labelclass="control-label"
			default="0"
			>
			<option
				value="0">JHIDE</option>
			<option
				value="1">JSHOW</option>
		</field>
		<field type="Title" label="COM_ICAGENDA_FORM_VALIDATE_LBL" class="stylesub" />
		<field
			name="reg_form_validation"
			type="radio"
			label="COM_ICAGENDA_FORM_VALIDATE_LBL"
			description="COM_ICAGENDA_FORM_VALIDATE_DESC"
			class="btn-group"
			labelclass="control-label"
			default=""
			>
			<option
				value="">COM_ICAGENDA_FORM_SERVER_CLIENT_VALIDATION</option>
			<option
				value="1">COM_ICAGENDA_FORM_SERVER_VALIDATION</option>
		</field>
		<!--field
			name="reg_captcha"
			type="plugins"
			folder="captcha"
			default=""
			label="COM_ICAGENDA_CAPTCHA_LABEL"
			description="COM_ICAGENDA_REGISTRATION_CAPTCHA_DESC"
			filter="cmd" >
			<option
				value="">JOPTION_USE_DEFAULT</option>
			<option
				value="0">COM_ICAGENDA_NONE_SELECTED</option>
		</field-->
		<field
			type="TitleImg"
			label="COM_ICAGENDA_REGISTRATION_TERMS_LABEL"
			class="stylebox lead input-xxlarge"
			icicon="iclogo"
			/>
		<field
			name="terms"
			type="radio"
			label="COM_ICAGENDA_REGISTRATION_TERMS_LABEL"
			description="COM_ICAGENDA_REGISTRATION_TERMS_DESC"
			class="btn-group"
			labelclass="control-label"
			default="0"
			>
			<option value="0">JDISABLED</option>
			<option value="1">JENABLED</option>
		</field>
		<field
			name="terms_Type"
			type="modal_ictxt_type"
			label="COM_ICAGENDA_REGISTRATION_TERMS_TEXTTYPE_LABEL"
			description="COM_ICAGENDA_REGISTRATION_TERMS_TEXTTYPE_DESC"
			class="btn-group"
			labelclass="control-label"
			default=""
			/>
		<field
			name="termsArticle"
			type="modal_ictxt_article"
			label=" "
			description="COM_ICAGENDA_FIELD_SELECT_ARTICLE_DESC"
			edit="true"
			clear="true"
			default=""
			/>
		<field
			name="termsContent"
			type="modal_ictxt_content"
			label=" "
			buttons="readmore,pagebreak"
			class="inputbox"
			placeholder="text"
			filter="JComponentHelper::filterText"
			labelclass="control-label"
			/>
		<field
			name="termsDefault"
			type="modal_ictxt_default"
			label=" "
			description="COM_ICAGENDA_REGISTRATION_TERMS"
			/>
		<field
			type="TitleImg"
			label="COM_ICAGENDA_TITLE_REGISTRATION_NOTIFICATIONS"
			class="stylebox lead input-xxlarge"
			icicon="iclogo"
			/>
		<field type="Title" label="COM_ICAGENDA_NOTIFICATION_BY_EMAIL_ADMIN" class="stylesub" />
		<field
			name="emailAdminSend"
			type="radio"
			label="COM_ICAGENDA_NOTIFICATION_BY_EMAIL_ADMIN_LBL"
			description="COM_ICAGENDA_NOTIFICATION_BY_EMAIL_ADMIN_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JDISABLED</option>
			<option value="1">JENABLED</option>
		</field>
		<field type="Title" label="COM_ICAGENDA_NOTIFICATION_BY_EMAIL_ADMIN_SELECTION_INFO"
			class="stylenote alert alert-info" />
		<field
			name="emailAdminSend_select"
			type="list"
			label=" "
			description="COM_ICAGENDA_NOTIFICATION_BY_EMAIL_ADMIN_SELECTION_INFO"
			labelclass="control-label"
			multiple="true"
			default="0"
			>
			<option value="0">COM_ICAGENDA_EMAIL_SITE</option>
			<option value="1">COM_ICAGENDA_EMAIL_CREATOR</option>
			<option value="3">COM_ICAGENDA_EMAIL_EVENT_CONTACT</option>
			<option value="2">COM_ICAGENDA_EMAIL_CUSTOM_LIST</option>
		</field>
		<field
			name="emailAdminSend_Placeholder"
			type="modal_ictext_Placeholder"
			label="COM_ICAGENDA_EMAIL_CUSTOM_LIST"
			description="COM_ICAGENDA_REGISTRATION_EMAIL_ADMIN_CUSTOM_LIST_DESC"
			/>
		<field type="Title" label="COM_ICAGENDA_REGISTRATION_EMAIL_USER" class="stylesub" />
		<field
			name="emailUserSend"
			type="radio"
			label="COM_ICAGENDA_CONFIRMATION_BY_EMAIL_USER_LBL"
			description="COM_ICAGENDA_CONFIRMATION_BY_EMAIL_USER_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JDISABLED</option>
			<option value="1">JENABLED</option>
		</field>
		<field
			name="regEmailUser"
			type="radio"
			label="COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_DEFAULT_LABEL"
			description="COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_DEFAULT_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">COM_ICAGENDA_CUSTOM_EMAILS</option>
			<option value="1">JDEFAULT</option>
		</field>
		<field type="Title" label=" " class="stylenote" />
		<field
			type="TitleImg"
			label="COM_ICAGENDA_CUSTOM_EMAILS"
			class="stylebox lead input-xxlarge"
			icicon="iclogo"
			/>
		<field
			type="TitleImg"
			label="COM_ICAGENDA_REGISTRATION_EMAIL_USER_NOTICE"
			class="stylenote alert alert-info"
			icimage="info.png"
			/>
		<field
			type="Title"
			label="COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD"
			class="stylesub"
			/>
		<field
			name="emailUserSubjectPeriod"
			type="modal_ictext_Placeholder"
			label="COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_CUSTOM_SUBJECT_LBL"
			description="COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_CUSTOM_SUBJECT_DESC"
			class="input-xxlarge"
			/>
		<field
			name="emailUserBodyPeriod"
			type="modal_iC_editor"
			label="COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_CUSTOM_BODY_LBL"
			description="COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_CUSTOM_BODY_DESC"
			rows="10"
			cols="80"
			class="input-xxlarge"
			filter="JComponentHelper::filterText"
			default="COM_ICAGENDA_REGISTRATION_EMAIL_USER_PERIOD_DEFAULT_BODY"
			/>
		<field type="Title" label="COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE" class="stylesub" />
		<field
			name="emailUserSubjectDate"
			type="modal_ictext_Placeholder"
			label="COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_CUSTOM_SUBJECT_LBL"
			description="COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_CUSTOM_SUBJECT_DESC"
			class="input-xxlarge"
			/>
		<field
			name="emailUserBodyDate"
			type="modal_iC_editor"
			label="COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_CUSTOM_BODY_LBL"
			description="COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_CUSTOM_BODY_DESC"
			rows="10"
			cols="80"
			class="input-xxlarge"
			filter="JComponentHelper::filterText"
			default="COM_ICAGENDA_REGISTRATION_EMAIL_USER_DATE_DEFAULT_BODY"
			/>
	</fieldset>

	<fieldset name="submit"
		label="COM_ICAGENDA_SUBMIT_AN_EVENT_LABEL"
		description="COM_ICAGENDA_SUBMIT_AN_EVENT_DESC"
		addfieldpath="/administrator/components/com_content/models/fields"
		>
		<field
			type="TitleImg"
			label="COM_ICAGENDA_SUBMIT_PERMISSIONS_LABEL"
			class="stylebox lead input-xxlarge"
			icicon="private"
			/>
		<field type="Title" label="COM_ICAGENDA_SUBMIT_FRONTEND_ACCESS_LABEL" class="stylesub" />
		<field
			name="submitAccess"
			type="accesslevel"
			label="JFIELD_ACCESS_LABEL"
			description="COM_ICAGENDA_SUBMIT_FRONTEND_ACCESS_DESC"
			multiple="true"
			default="2"
			/>
		<field
			name="submitNotLogin"
			type="modal_ictext_type"
			label="COM_ICAGENDA_SUBMIT_NOT_LOGIN_LBL"
			description="COM_ICAGENDA_SUBMIT_NOT_LOGIN_DESC"
			labelclass="control-label"
			default=""
			/>
		<field
			name="submitNotLogin_Content"
			type="modal_ictext_content"
			label=" "
			class="inputbox"
			labelclass="control-label"
			buttons="readmore,pagebreak"
			placeholder="text"
			filter="JComponentHelper::filterText"
			/>
		<field
			name="submitNoRights"
			type="modal_ictext_type"
			label="COM_ICAGENDA_SUBMIT_NO_RIGHTS_LBL"
			description="COM_ICAGENDA_SUBMIT_NO_RIGHTS_DESC"
			labelclass="control-label"
			default=""
			/>
		<field
			name="submitNoRights_Content"
			type="modal_ictext_content"
			label=" "
			class="inputbox"
			labelclass="control-label"
			buttons="readmore,pagebreak"
			placeholder="text"
			filter="JComponentHelper::filterText"
			/>
		<field type="Title" label="COM_ICAGENDA_SUBMIT_APPROVAL_LABEL" class="stylesub" />
		<field
			name="approvalGroups"
			type="usergroup"
			label="IC_MANAGERS"
			description="COM_ICAGENDA_SUBMIT_APPROVAL_GROUPS_DESC"
			multiple="true"
			default="8"
			/>
		<field
			type="TitleImg"
			label="COM_ICAGENDA_SUBMIT_MANAGERS_NOTE"
			class="stylenote alert alert-info input-xxlarge"
			icicon="info-circle"
			/>
		<!--field
			name="managers_note"
			type="Desc"
			label="COM_ICAGENDA_SUBMIT_MANAGERS_NOTE"
			description="COM_ICAGENDA_SUBMIT_APPROVAL_GROUPS_DESC"
			class="alert span9"
			labelclass="control-label"
			/-->
		<field
			type="TitleImg"
			label="COM_ICAGENDA_FORM_LABEL"
			class="stylebox lead input-xxlarge"
			icicon="form"
			/>
		<field
			name="submit_imageDisplay"
			type="radio"
			label="COM_ICAGENDA_SUBMIT_EVENT_IMAGE_DISPLAY_LABEL"
			description="COM_ICAGENDA_SUBMIT_EVENT_IMAGE_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="submit_imageMaxSize"
			type="text"
			label="COM_ICAGENDA_SUBMIT_EVENT_IMAGE_MAX_SIZE_LABEL"
			description="COM_ICAGENDA_SUBMIT_EVENT_IMAGE_MAX_SIZE_DESC"
			class="inputbox input-mini"
			default="800"
			/>
		<field
			name="submit_periodDisplay"
			type="radio"
			label="COM_ICAGENDA_SUBMIT_PERIOD_DISPLAY_LABEL"
			description="COM_ICAGENDA_SUBMIT_PERIOD_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="submit_weekdaysDisplay"
			type="radio"
			label="COM_ICAGENDA_SUBMIT_WEEKDAYS_DISPLAY_LABEL"
			description="COM_ICAGENDA_SUBMIT_WEEKDAYS_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="submit_datesDisplay"
			type="radio"
			label="COM_ICAGENDA_SUBMIT_DATES_DISPLAY_LABEL"
			description="COM_ICAGENDA_SUBMIT_DATES_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="submit_displaytimeDisplay"
			type="radio"
			class="btn-group"
			default="0"
			label="COM_ICAGENDA_SUBMIT_DISPLAYTIME_DISPLAY_LABEL"
			description="COM_ICAGENDA_SUBMIT_DISPLAYTIME_DISPLAY_DESC"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="submit_shortdescDisplay"
			type="radio"
			label="COM_ICAGENDA_SUBMIT_SHORTDESC_DISPLAY_LABEL"
			description="COM_ICAGENDA_SUBMIT_SHORTDESC_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="submit_descDisplay"
			type="radio"
			label="COM_ICAGENDA_SUBMIT_DESCRIPTION_DISPLAY_LABEL"
			description="COM_ICAGENDA_SUBMIT_DESCRIPTION_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="submit_metadescDisplay"
			type="radio"
			label="COM_ICAGENDA_SUBMIT_METADESCRIPTION_DISPLAY_LABEL"
			description="COM_ICAGENDA_SUBMIT_METADESCRIPTION_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			default="0"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="submit_venueDisplay"
			type="radio"
			label="COM_ICAGENDA_SUBMIT_VENUE_DISPLAY_LABEL"
			description="COM_ICAGENDA_SUBMIT_VENUE_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="submit_emailDisplay"
			type="radio"
			label="COM_ICAGENDA_SUBMIT_EMAIL_DISPLAY_LABEL"
			description="COM_ICAGENDA_SUBMIT_EMAIL_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="submit_phoneDisplay"
			type="radio"
			label="COM_ICAGENDA_SUBMIT_PHONE_DISPLAY_LABEL"
			description="COM_ICAGENDA_SUBMIT_PHONE_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="submit_websiteDisplay"
			type="radio"
			label="COM_ICAGENDA_SUBMIT_WEBSITE_DISPLAY_LABEL"
			description="COM_ICAGENDA_SUBMIT_WEBSITE_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="submit_customfieldsDisplay"
			type="radio"
			label="COM_ICAGENDA_CUSTOMFIELDS"
			description="COM_ICAGENDA_SUBMIT_CUSTOMFIELDS_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="submit_fileDisplay"
			type="radio"
			label="COM_ICAGENDA_SUBMIT_ATTACHMENT_DISPLAY_LABEL"
			description="COM_ICAGENDA_SUBMIT_ATTACHMENT_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="submit_gmapDisplay"
			type="radio"
			label="COM_ICAGENDA_SUBMIT_GMAP_DISPLAY_LABEL"
			description="COM_ICAGENDA_SUBMIT_GMAP_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="submit_regoptionsDisplay"
			type="radio"
			label="COM_ICAGENDA_SUBMIT_REGISTRATION_OPTIONS_DISPLAY_LABEL"
			description="COM_ICAGENDA_SUBMIT_REGISTRATION_OPTIONS_DISPLAY_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<!--field
			name="submit_captcha"
			type="plugins"
			folder="captcha"
			default=""
			label="COM_ICAGENDA_CAPTCHA_LABEL"
			description="COM_ICAGENDA_SUBMIT_CAPTCHA_DESC"
			filter="cmd" >
			<option
				value="">JOPTION_USE_DEFAULT</option>
			<option
				value="0">COM_ICAGENDA_NONE_SELECTED</option>
		</field-->
		<field
			name="submit_captcha"
			type="radio"
			label="COM_ICAGENDA_CAPTCHA"
			description="COM_ICAGENDA_SUBMIT_CAPTCHA_DESC"
			class="btn-group"
			labelclass="control-label"
			default="0"
			>
			<option
				value="0">JHIDE</option>
			<option
				value="1">JSHOW</option>
		</field>
		<field type="Title" label="COM_ICAGENDA_FORM_VALIDATE_LBL" class="stylesub" />
		<field
			name="submit_form_validation"
			type="radio"
			label="COM_ICAGENDA_FORM_VALIDATE_LBL"
			description="COM_ICAGENDA_FORM_VALIDATE_DESC"
			class="btn-group"
			labelclass="control-label"
			default=""
			>
			<option
				value="">COM_ICAGENDA_FORM_SERVER_CLIENT_VALIDATION</option>
			<option
				value="1">COM_ICAGENDA_FORM_SERVER_VALIDATION</option>
		</field>
		<!--field
			type="TitleImg"
			label="COM_ICAGENDA_SUBMIT_REDIRECT_LABEL"
			class="stylebox lead input-xxlarge"
			icicon="iclogo"
			/-->
		<!--field
			name="submit_redirectUrl"
			type="url"
			label="COM_ICAGENDA_SUBMIT_REDIRECT_URL_LABEL"
			description="COM_ICAGENDA_SUBMIT_REDIRECT_URL_DESC"
			default=""
			hint="http://www.example.com"
			/-->
		<field
			name="submitReturn"
			type="modal_iclink_type"
			label="COM_ICAGENDA_SUBMIT_RETURN_LBL"
			description="COM_ICAGENDA_SUBMIT_RETURN_DESC"
			labelclass="control-label"
			default=""
			/>
		<field
			name="submitReturn_Article"
			type="modal_iclink_article"
			label=" "
			class="inputbox"
			/>
		<field
			name="submitReturn_Url"
			type="modal_iclink_url"
			label=" "
			class="inputbox"
			hint="http://www.example.com"
			/>
		<field
			type="TitleImg"
			label="COM_ICAGENDA_SUBMIT_TOS_LABEL"
			class="stylebox lead input-xxlarge"
			icicon="iclogo"
			/>
		<field
			name="tos"
			type="radio"
			label="COM_ICAGENDA_SUBMIT_TOS_LABEL"
			description="COM_ICAGENDA_SUBMIT_TOS_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JDISABLED</option>
			<option value="1">JENABLED</option>
		</field>
		<field
			name="tos_Type"
			type="modal_ictxt_type"
			label="COM_ICAGENDA_SUBMIT_TOS_TEXTTYPE_LABEL"
			description="COM_ICAGENDA_SUBMIT_TOS_TEXTTYPE_DESC"
			class="btn-group"
			labelclass="control-label"
			default=""
			/>
		<field
			name="tosArticle"
			type="modal_ictxt_article"
			label=" "
			description="COM_ICAGENDA_FIELD_SELECT_ARTICLE_DESC"
			edit="true"
			clear="true"
			default=""
			/>
		<field
			name="tosContent"
			type="modal_ictxt_content"
			label=" "
			class="inputbox"
			labelclass="control-label"
			buttons="readmore,pagebreak"
			placeholder="text"
			filter="JComponentHelper::filterText"
			/>
		<field
			name="tosDefault"
			type="modal_ictxt_default"
			label=" "
			description="COM_ICAGENDA_TOS"
			/>
	</fieldset>

	<fieldset name="global"
		label="COM_ICAGENDA_GLOBAL_PARAMS_LABEL"
		description="COM_ICAGENDA_GLOBAL_PARAMS_INFO"
		>
		<!-- Captcha plugin -->
		<field
			type="TitleImg"
			label="COM_ICAGENDA_CAPTCHA_LABEL"
			class="stylebox lead input-xxlarge"
			icicon="iclogo"
			/>
		<field
			name="captcha"
			type="plugins"
			folder="captcha"
			default=""
			label="COM_ICAGENDA_CAPTCHA_LABEL"
			description="COM_ICAGENDA_CAPTCHA_DESC"
			filter="cmd" >
			<option
				value="">JOPTION_USE_DEFAULT</option>
			<!--option
				value="0">COM_ICAGENDA_NONE_SELECTED</option-->
		</field>
		<!-- Screen Width Thresholds -->
		<field
			type="TitleImg"
			label="COM_ICAGENDA_SCREEN_WIDTH_THRESHOLDS_LABEL"
			class="stylebox lead input-xxlarge"
			icicon="screen"
			/>
		<field
			name="largewidththreshold"
			type="text"
			label="COM_ICAGENDA_LARGE_WIDTH_THRESHOLD_LABEL"
			description="COM_ICAGENDA_LARGE_WIDTH_THRESHOLD_DESC"
			size="30"
			class="inputbox"
			default="1201"
			/>
		<field
			name="mediumwidththreshold"
			type="text"
			label="COM_ICAGENDA_MEDIUM_WIDTH_THRESHOLD_LABEL"
			description="COM_ICAGENDA_MEDIUM_WIDTH_THRESHOLD_DESC"
			size="30"
			class="inputbox"
			default="769"
			/>
		<field
			name="smallwidththreshold"
			type="text"
			label="COM_ICAGENDA_SMALL_WIDTH_THRESHOLD_LABEL"
			description="COM_ICAGENDA_SMALL_WIDTH_THRESHOLD_DESC"
			size="30"
			class="inputbox"
			default="481"
			/>
		<!-- Thumbnails -->
		<field
			type="TitleImg"
			label="COM_ICAGENDA_THUMBNAILS_LABEL"
			class="stylebox lead input-xxlarge"
			icicon="thumbs"
			/>
		<field
			name="thumb_generator"
			type="radio"
			label="COM_ICAGENDA_ICTHUMB_LABEL"
			description="COM_ICAGENDA_ICTHUMB_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>
		<field
			name="thumb_large"
			type="modal_thumbs"
			label="COM_ICAGENDA_THUMB_LARGE_LBL"
			description="COM_ICAGENDA_THUMB_LARGE_DESC"
			class="input-small"
			labelclass="control-label"
			/>
		<field
			name="thumb_medium"
			type="modal_thumbs"
			label="COM_ICAGENDA_THUMB_MEDIUM_LBL"
			description="COM_ICAGENDA_THUMB_MEDIUM_DESC"
			class="input-small"
			labelclass="control-label"
			/>
		<field
			name="thumb_small"
			type="modal_thumbs"
			label="COM_ICAGENDA_THUMB_SMALL_LBL"
			description="COM_ICAGENDA_THUMB_SMALL_DESC"
			class="input-small"
			labelclass="control-label"
			/>
		<field
			name="thumb_xsmall"
			type="modal_thumbs"
			label="COM_ICAGENDA_THUMB_XSMALL_LBL"
			description="COM_ICAGENDA_THUMB_XSMALL_DESC"
			class="input-small"
			labelclass="control-label"
			/>
		<!-- Icons -->
		<field
			type="TitleImg"
			label="COM_ICAGENDA_ICONS"
			class="stylebox lead input-xxlarge"
			icicon="icons"
			/>
		<field
			name="iconPrint_global"
			type="list"
			label="COM_ICAGENDA_ICON_PRINT_LABEL"
			description="COM_ICAGENDA_ICON_PRINT_DESC"
			default="0"
			>
			<option value="0">JHIDE</option>
			<!--option value="1">IC_ONLY_EVENTS_LIST</option-->
			<option value="2">IC_ONLY_EVENT_DETAILS</option>
			<!--option value="3">JALL</option-->
		</field>
		<field
			name="iconAddToCal_global"
			type="list"
			label="COM_ICAGENDA_ICON_ADDTOCAL_LABEL"
			description="COM_ICAGENDA_ICON_ADDTOCAL_DESC"
			default="0"
			>
			<option value="0">JHIDE</option>
			<!--option value="1">IC_ONLY_EVENTS_LIST</option-->
			<option value="2">IC_ONLY_EVENT_DETAILS</option>
			<!--option value="3">JALL</option-->
		</field>
		<field
			name="iconAddToCal_size"
			type="radio"
			label="COM_ICAGENDA_ICON_ADDTOCAL_SIZE_LABEL"
			description="COM_ICAGENDA_ICON_ADDTOCAL_SIZE_DESC"
			class="btn-group"
			labelclass="control-label"
			default="16"
			>
			<option value="16">16 px</option>
			<option value="24">24 px</option>
			<option value="32">32 px</option>
		</field>
		<field
			name="iconAddToCal_options"
			type="list"
			label="COM_ICAGENDA_ICON_ADDTOCAL_OPTIONS_LABEL"
			description="COM_ICAGENDA_ICON_ADDTOCAL_OPTIONS_DESC"
			multiple="true"
			>
			<option value="1">COM_ICAGENDA_GCALENDAR_LABEL</option>
			<option value="2">COM_ICAGENDA_VCAL_ICAL_LABEL</option>
			<option value="3">COM_ICAGENDA_OUTLOOK_LABEL</option>
			<option value="4">COM_ICAGENDA_LIVE_CALENDAR_LABEL</option>
			<option value="5">COM_ICAGENDA_YAHOO_CALENDAR_LABEL</option>
		</field>
		<field
			name="features_icon_size_list"
			type="list"
			label="COM_ICAGENDA_FEATURES_ICONSIZE_LIST_LABEL"
			description="COM_ICAGENDA_FEATURES_ICONSIZE_LIST_DESC"
			class="inputbox"
			filter="options"
			default=""
			>
			<option value="">COM_ICAGENDA_FEATURES_ICONSIZE_NONE</option>
			<option value="16_bit">COM_ICAGENDA_FEATURES_ICONSIZE_16</option>
			<option value="24_bit">COM_ICAGENDA_FEATURES_ICONSIZE_24</option>
			<option value="32_bit">COM_ICAGENDA_FEATURES_ICONSIZE_32</option>
			<option value="48_bit">COM_ICAGENDA_FEATURES_ICONSIZE_48</option>
			<option value="64_bit">COM_ICAGENDA_FEATURES_ICONSIZE_64</option>
		</field>
		<field
			name="features_icon_size_event"
			type="list"
			label="COM_ICAGENDA_FEATURES_ICONSIZE_EVENT_LABEL"
			description="COM_ICAGENDA_FEATURES_ICONSIZE_EVENT_DESC"
			class="inputbox"
			filter="options"
			default=""
			>
			<option value="">COM_ICAGENDA_FEATURES_ICONSIZE_NONE</option>
			<option value="16_bit">COM_ICAGENDA_FEATURES_ICONSIZE_16</option>
			<option value="24_bit">COM_ICAGENDA_FEATURES_ICONSIZE_24</option>
			<option value="32_bit">COM_ICAGENDA_FEATURES_ICONSIZE_32</option>
			<option value="48_bit">COM_ICAGENDA_FEATURES_ICONSIZE_48</option>
			<option value="64_bit">COM_ICAGENDA_FEATURES_ICONSIZE_64</option>
		</field>
		<field
			name="show_icon_title"
			type="radio"
			label="COM_ICAGENDA_SHOW_FEATURE_ICON_TITLE_LABEL"
			description="COM_ICAGENDA_SHOW_FEATURE_ICON_TITLE_DESC"
			class="btn-group"
			labelclass="control-label"
			filter="options"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<!-- AddThis -->
		<field
			type="TitleImg"
			label="COM_ICAGENDA_ADDTHIS"
			class="stylebox lead input-xxlarge"
			icimage="addthis_16.png"
			/>
		<field type="Title" label="COM_ICAGENDA_ADDTHIS_DESC" class="stylered input-xxlarge" />
		<field
			name="atlist"
			type="radio"
			label="COM_ICAGENDA_ADDTHIS_LIST_LABEL"
			description="COM_ICAGENDA_ADDTHIS_LIST_DESC"
			class="btn-group"
			labelclass="control-label"
			default="0"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="atevent"
			type="radio"
			label="COM_ICAGENDA_ADDTHIS_EVENT_LABEL"
			description="COM_ICAGENDA_ADDTHIS_EVENT_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="atfloat"
			type="radio"
			label="COM_ICAGENDA_ADDTHIS_FLOAT_LABEL"
			description="COM_ICAGENDA_ADDTHIS_FLOAT_DESC"
			class="btn-group"
			labelclass="control-label"
			default="2"
			>
			<option value="0">JNO</option>
			<option value="1">JGLOBAL_LEFT</option>
			<option value="2">JGLOBAL_RIGHT</option>
		</field>
		<field
			name="aticon"
			type="radio"
			label="COM_ICAGENDA_ADDTHIS_ICON_LABEL"
			description="COM_ICAGENDA_ADDTHIS_ICON_DESC"
			class="btn-group"
			labelclass="control-label"
			default="2"
			>
			<option value="1">COM_ICAGENDA_ADDTHIS_16</option>
			<option value="2">COM_ICAGENDA_ADDTHIS_32</option>
		</field>
		<field
			name="addthis"
			type="text"
			label="COM_ICAGENDA_ADDTHIS_ID_LABEL"
			description="COM_ICAGENDA_ADDTHIS_ID_DESC"
			/>
		<field
			type="TitleImg"
			label="COM_ICAGENDA_ADDTHIS_NOTE"
			class="stylenote alert alert-info input-xxlarge"
			icimage="info.png"
			/>
		<!-- Date and Time -->
		<field
			type="TitleImg"
			label="COM_ICAGENDA_DATETIME_LABEL"
			class="stylebox lead input-xxlarge"
			icicon="clock"
			/>
		<field
			name="date_format_global"
			type="iclist_globalization"
			label="COM_ICAGENDA_LBL_FORMAT"
			description="COM_ICAGENDA_LBL_FORMAT"
			class="inputbox"
			default=""
			/>
		<field
			name="date_separator"
			type="text"
			label="COM_ICAGENDA_LBL_DATE_SEPARATOR"
			description="COM_ICAGENDA_DESC_DATE_COMPONENTS_SEPARATOR"
			size="5"
			class="inputbox"
			default=""
			/>
		<field
			name="displaytime"
			type="radio"
			label="COM_ICAGENDA_TIMEDISPLAY_DEFAULT_LABEL"
			description="COM_ICAGENDA_TIMEDISPLAY_DEFAULT_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="timeformat"
			type="radio"
			label="COM_ICAGENDA_TIME_FORMAT_LABEL"
			description="COM_ICAGENDA_TIME_FORMAT_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="1">COM_ICAGENDA_24</option>
			<option value="2">COM_ICAGENDA_12</option>
		</field>
		<field
			name="firstday_week_global"
			type="list"
			label="COM_ICAGENDA_FIRSTDAY_WEEK_LABEL"
			description="COM_ICAGENDA_FIRSTDAY_WEEK_DESC"
			default="1"
			>
			<option value="1">MONDAY</option>
			<option value="0">SUNDAY</option>
		</field>
		<!-- Categories -->
		<field
			type="TitleImg"
			label="COM_ICAGENDA_CATEGORY_SELECT_LIST"
			class="stylebox lead input-xxlarge"
			icicon="iclogo"
			/>
		<field name="orderby_catlist"
			type="list"
			default="alpha"
			label="COM_ICAGENDA_CATEGORY_ORDER_LABEL"
			description="COM_ICAGENDA_CATEGORY_SELECT_LIST_ORDER_DESC">
			<option
				value="none">JGLOBAL_NO_ORDER</option>
			<option
				value="alpha">JGLOBAL_TITLE_ALPHABETICAL</option>
			<option
				value="ralpha">JGLOBAL_TITLE_REVERSE_ALPHABETICAL</option>
			<option
				value="order">JGLOBAL_CATEGORY_MANAGER_ORDER</option>
		</field>
		<field
			name="default_catlist"
			type="modal_cat"
			label="COM_ICAGENDA_CATEGORY_SELECT_LIST_DEFAULT_LABEL"
			description="COM_ICAGENDA_CATEGORY_SELECT_LIST_DEFAULT_DESC"
			class="inputbox"
			/>
		<field name="admin_status_catlist"
			type="list"
			label="COM_ICAGENDA_CATEGORY_SELECT_LIST_STATUS_ADMIN_LABEL"
			description="COM_ICAGENDA_CATEGORY_SELECT_LIST_STATUS_ADMIN_DESC"
			default="1"
			multiple="true"
			>
			<option
				value="1">JPUBLISHED</option>
			<option
				value="0">JUNPUBLISHED</option>
			<option
				value="2">JARCHIVED</option>
		</field>
		<field name="site_status_catlist"
			type="list"
			label="COM_ICAGENDA_CATEGORY_SELECT_LIST_STATUS_SITE_LABEL"
			description="COM_ICAGENDA_CATEGORY_SELECT_LIST_STATUS_SITE_DESC"
			default="1"
			multiple="true"
			>
			<option
				value="1">JPUBLISHED</option>
			<option
				value="0">JUNPUBLISHED</option>
			<option
				value="2">JARCHIVED</option>
		</field>
		<!-- Users -->
		<field
			type="TitleImg"
			label="IC_USERS"
			class="stylebox lead input-xxlarge"
			icicon="people"
			/>
		<field type="Title" label="COM_ICAGENDA_JOOMLA_USER_LABEL" class="stylesub" />
		<field
			name="autofilluser"
			type="radio"
			label="COM_ICAGENDA_REGISTRATION_JOOMLA_USER_AUTOFILL_LABEL"
			description="COM_ICAGENDA_REGISTRATION_JOOMLA_USER_AUTOFILL_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>
		<field
			name="nameJoomlaUser"
			type="radio"
			label="COM_ICAGENDA_REGISTRATION_JOOMLA_USER_NAME_LABEL"
			description="COM_ICAGENDA_REGISTRATION_JOOMLA_USER_NAME_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="1">IC_NAME</option>
			<option value="2">IC_USERNAME</option>
		</field>
		<field type="Title" label="COM_ICAGENDA_SENDING_EMAIL_LABEL" class="stylesub" />
		<field
			name="auto_login"
			type="radio"
			label="COM_ICAGENDA_AUTOLOGIN_LABEL"
			description="COM_ICAGENDA_AUTOLOGIN_DESC"
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>
		<!-- Miscellaneous -->
		<field
			type="TitleImg"
			label="COM_ICAGENDA_MISCELLANEOUS_LABEL"
			class="stylebox lead input-xxlarge"
			icicon="options"
			/>
		<field type="Title" label="COM_ICAGENDA_EVENT_TITLE_LBL" class="stylesub" />
		<field
			name="titleTransform"
			type="list"
			label="COM_ICAGENDA_TEXT_TRANSFORM_LBL"
			description="COM_ICAGENDA_TEXT_TRANSFORM_DESC"
			class="btn-group"
			default=""
			>
			<option value="">JNONE</option>
			<option value="1">IC_FIRST_UPPERCASE</option>
			<option value="2">IC_CAPITALIZE</option>
			<option value="3">IC_UPPERCASE</option>
			<option value="4">IC_LOWERCASE</option>
		</field>
		<field type="Title" label="COM_ICAGENDA_SHORT_DESCRIPTION_LBL" class="stylesub" />
		<field
			name="char_limit_short_description"
			type="text"
			label="COM_ICAGENDA_LBL_LIMIT"
			description="COM_ICAGENDA_SHORT_DESCRIPTION_LIMIT_DESC"
			class="inputbox input-mini"
			size="5"
			default="100"
			/>
		<field type="Title" label="COM_ICAGENDA_META_DESCRIPTION_LBL" class="stylesub" />
		<field
			name="char_limit_meta_description"
			type="text"
			label="COM_ICAGENDA_LBL_LIMIT"
			description="COM_ICAGENDA_META_DESCRIPTION_LIMIT_DESC"
			class="inputbox input-mini"
			size="5"
			default="160"
			/>
		<field type="Title" label="COM_ICAGENDA_AUTO_SHORT_DESCRIPTION_LBL" class="stylesub" />
		<field
			name="ShortDescLimit"
			type="text"
			label="COM_ICAGENDA_LBL_LIMIT"
			description="COM_ICAGENDA_AUTO_INTROTEXT_LIMIT_DESC"
			class="inputbox input-mini"
			size="5"
			default="100"
			/>
		<field
			name="Filtering_ShortDesc_Global"
			type="list"
			label="COM_ICAGENDA_HTML_FILTERING_LABEL"
			description="COM_ICAGENDA_FILTERING_SHORTDESC_DESC"
			class="btn-group"
			default=""
			>
			<option value="">COM_ICAGENDA_ALL_ITALIC</option>
			<option value="0">COM_ICAGENDA_NO_HTML</option>
			<option value="1">COM_ICAGENDA_AUTHORIZED_HTML_TAGS</option>
		</field>
		<field
			name="HTMLTags_ShortDesc_Global"
			type="list"
			label="COM_ICAGENDA_AUTHORIZED_HTML_TAGS"
			description="COM_ICAGENDA_FILTERING_SHORTDESC_AUTHORIZED_HTML_TAGS_DESC"
			class="btn-group"
			multiple="true"
			>
			<option value="1">&lt;br &#47;&gt;</option>
			<option value="2">&lt;b&gt;</option>
			<option value="3">&lt;strong&gt;</option>
			<option value="4">&lt;i&gt;</option>
			<option value="5">&lt;em&gt;</option>
			<option value="6">&lt;u&gt;</option>
		</field>
		<field type="Title" label="COM_ICAGENDA_CUSTOMIZATION" class="stylesub" />
		<field
			name="customCSS_activation"
			type="radio"
			label="COM_ICAGENDA_CUSTOM_CSS_ACTIVATION_LBL"
			description="COM_ICAGENDA_CUSTOM_CSS_ACTIVATION_DESC"
			class="btn-group"
			labelclass="control-label"
			default="0"
			>
			<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>
		<field type="Title" label=" " class="stylenote"/>
		<field
			name="customCSS"
			type="textarea"
			label="COM_ICAGENDA_CUSTOM_CSS_LBL"
			description="COM_ICAGENDA_CUSTOM_CSS_DESC"
			rows="5"
			cols="50"
			class="input-xxlarge"
			hint="COM_ICAGENDA_CUSTOM_CSS_HINT"
			default=""
			/>
	</fieldset>

	<fieldset name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
		>
		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			class="inputbox"
			validate="rules"
			filter="rules"
			component="com_icagenda"
			section="component"
			/>
	</fieldset>

	<fieldset name="pro"
		label="COM_ICAGENDA_PRO_LABEL"
		description=""
		>
		<field
			type="Title"
			label="COM_ICAGENDA_PRO_ACCOUNT_INFO"
			class="stylenote alert alert-info"
			/>
		<field
			name="copy"
			type="radio"
			label="COM_ICAGENDA_PRO_COPY_LABEL"
			description="COM_ICAGENDA_PRO_COPY_DESC"
			class="btn-group"
			labelclass="control-label"
			default=""
			>
			<option value="">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			type="TitleImg"
			label="PRO_JOOMLIC_UPDATES_INFORMATION"
			class="stylebox lead input-xxlarge"
			icicon="iclogo"
			/>
		<field
			name="downloadid"
			type="password"
			label="COM_ICAGENDA_PRO_ID_LABEL"
			description ="COM_ICAGENDA_PRO_ID_DESC"
			labelclass="control-label"
			default=""
			/>
		<field type="Title" label="&#8597;" />
		<field
			name="username"
			type="text"
			label="PRO_JOOMLIC_USERNAME_LBL"
			description="PRO_JOOMLIC_USERNAME_DESC"
			size="30"
			default=""
			/>
		<field
			name="password"
			type="modal_ic_password"
			label="PRO_JOOMLIC_PASSWORD"
			description="PRO_JOOMLIC_PASSWORD_DESC"
			size="30"
			default=""
			/>
		<field type="Title" label="COM_ICAGENDA_PRO_CONFIG_LIVEUPDATE_MINSTABILITY_LABEL" class="stylesub" />
		<field
			name="min_stability"
			type="list"
			label="COM_ICAGENDA_PRO_UPDATE_SERVER"
			description="COM_ICAGENDA_PRO_CONFIG_LIVEUPDATE_MINSTABILITY_DESC"
			default="stable"
			>
			<option value="alpha">ICAGENDA_STABILITY_TESTING</option>
			<!--option value="beta">ICAGENDA_STABILITY_BETA</option-->
			<option value="rc">ICAGENDA_STABILITY_RC</option>
			<option value="stable">ICAGENDA_STABILITY_STABLE</option>
		</field>
		<field
			name="time_loading"
			type="hidden"
			label="COM_ICAGENDA_PRO_TIME_LOADING_LABEL"
			description="COM_ICAGENDA_PRO_TIME_LOADING_DESC"
			class="btn-group"
			labelclass="control-label"
			default="0"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
		</field>
		<field
			name="reg_end_period"
			type="hidden"
			label="Registration until end datetime (period)"
			description=""
			class="btn-group"
			labelclass="control-label"
			default="0"
			>
			<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>
		<field
			name="system_info"
			type="hidden"
			label="Anonymous usage statistics"
			description="Usage statistics or 'Telemetry' is a feature in iCagenda that sends anonymously and automatically your system info (PHP, MySQL, Joomla! and iCagenda versions). Usage statistics are collected during the update, and help us improve future versions of iCagenda. We do NOT collect any of your personal info, including your IP address, site name, other than the anonymous system info you voluntarily provide."
			class="btn-group"
			labelclass="control-label"
			default="1"
			>
			<option value="0">JDISABLED</option>
			<option value="1">JENABLED</option>
		</field>
		<!--field name="Title5" type="TitleImg" label="BETA" class="stylebox lead input-xxlarge" icimage="iconicagenda16.png"/>
		<field name="mail_new_event" type="radio" default="0" label="BETA - Notification New Event" description="COM_ICAGENDA_MAIL_NEW_EVENT_DESC" class="btn-group" labelclass="control-label">
			<option value="0">JNO</option>
			<option value="1">JYES</option>
		</field>
		<field name="newevent_Groups" type="usergroup" multiple="true" default="8" label="Notified Groups" description="COM_ICAGENDA_MAIL_NEW_EVENT_GROUPS_DESC" labelclass="control-label" /-->
	</fieldset>
</config>
components/com_icagenda/views/index.html000060400000000032152453623450014454 0ustar00<html><body></body></html>components/com_icagenda/views/customfields/index.html000060400000000032152453623450017155 0ustar00<html><body></body></html>components/com_icagenda/views/customfields/tmpl/index.html000060400000000032152453623450020131 0ustar00<html><body></body></html>components/com_icagenda/views/customfields/tmpl/default.php000060400000040017152453623450020300 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-07-16
 * @since		3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

$app = JFactory::getApplication();

// Access Administration Customfields check.
if (JFactory::getUser()->authorise('icagenda.access.customfields', 'com_icagenda'))
{
	// Check Theme Packs Compatibility
	if (class_exists('icagendaTheme')) icagendaTheme::checkThemePacks();

	$user		= JFactory::getUser();
	$userId		= $user->get('id');
	$listOrder	= $this->escape($this->state->get('list.ordering'));
	$listDirn	= $this->escape($this->state->get('list.direction'));
	$canOrder	= $user->authorise('core.edit.state', 'com_icagenda');

	$saveOrder	= $listOrder == 'cf.ordering';

	if (version_compare(JVERSION, '3.0', 'lt'))
	{
		JHtml::_('behavior.tooltip');
		JHtml::_('script','system/multiselect.js',false,true);
	}
	else
	{
		// Include the component HTML helpers.
		JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');
		JHtml::_('bootstrap.tooltip');
		JHtml::_('behavior.multiselect');
		JHtml::_('formbehavior.chosen', 'select');
		JHtml::_('dropdown.init');

		$extension	= $this->escape($this->state->get('filter.extension'));
		$archived	= $this->state->get('filter.published') == 2 ? true : false;
		$trashed	= $this->state->get('filter.published') == -2 ? true : false;

		if ($saveOrder)
		{
			$saveOrderingUrl = 'index.php?option=com_icagenda&task=customfields.saveOrderAjax&tmpl=component';
			JHtml::_('sortablelist.sortable', 'customfieldsList', 'adminForm', strtolower($listDirn), $saveOrderingUrl, false, true);
		}
		$sortFields = array();
		?>
		<script type="text/javascript">
			Joomla.orderTable = function()
			{
				table = document.getElementById("sortTable");
				direction = document.getElementById("directionTable");
				order = table.options[table.selectedIndex].value;
				if (order != '<?php echo $listOrder; ?>')
				{
					dirn = 'asc';
				}
				else
				{
					dirn = direction.options[direction.selectedIndex].value;
				}
				Joomla.tableOrdering(order, dirn, '');
			}
		</script>
		<?php
	}
	?>

	<form action="<?php echo JRoute::_('index.php?option=com_icagenda&view=customfields'); ?>" method="post" name="adminForm" id="adminForm">
	<?php if (!empty( $this->sidebar)) : ?>
		<div id="j-sidebar-container" class="span2">
			<?php echo $this->sidebar; ?>
		</div>
		<div id="j-main-container" class="span10">
	<?php else : ?>
		<div id="j-main-container">
	<?php endif;?>

		<?php if(version_compare(JVERSION, '3.0', 'lt')) : ?>
			<fieldset id="filter-bar">

				<div class="filter-search fltlft">
					<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
					<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('Search'); ?>" />
					<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
					<button type="button" onclick="document.id('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
				</div>

				<div class="filter-select fltrt">
					<select name="filter_published" class="inputbox" onchange="this.form.submit()">
						<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED');?></option>
						<?php echo JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), "value", "text", $this->state->get('filter.state'), true);?>
					</select>
				</div>

				<div class="filter-select fltrt">
					<select name="filter_parent_form" class="inputbox" onchange="this.form.submit()">
						<option value=""><?php echo JText::_('COM_ICAGENDA_CUSTOMFIELDS_FILTER_OPTION_SELECT_PARENT_FORM');?></option>
						<?php echo JHtml::_('select.options', $this->get('ParentForm'), "value", "text", $this->state->get('filter.parent_form'), true);?>
					</select>
				</div>

				<div class="filter-select fltrt">
					<select name="filter_type" class="inputbox" onchange="this.form.submit()">
						<option value=""><?php echo JText::_('COM_ICAGENDA_CUSTOMFIELDS_FILTER_OPTION_SELECT_TYPE');?></option>
						<?php echo JHtml::_('select.options', $this->get('FieldTypes'), "value", "text", $this->state->get('filter.type'), true);?>
					</select>
				</div>

			</fieldset>
			<div class="clr"> </div>

		<?php else : ?>

			<div id="filter-bar" class="btn-toolbar">

				<div class="filter-search btn-group pull-left">
					<label for="filter_search" class="element-invisible"><?php echo JText::_('COM_ICAGENDA_CUSTOMFIELDS_FILTER_SEARCH_DESC'); ?></label>
					<input type="text" name="filter_search" placeholder="<?php echo JText::_('COM_ICAGENDA_CUSTOMFIELDS_FILTER_SEARCH_DESC'); ?>" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_ICAGENDA_CUSTOMFIELDS_FILTER_SEARCH_DESC'); ?>" />
				</div>

				<div class="btn-group pull-left">
					<button class="btn tip hasTooltip" type="submit" title="<?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?>"><i class="icon-search"></i></button>
					<button class="btn tip hasTooltip" type="button" onclick="document.id('filter_search').value='';this.form.submit();" title="<?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?>"><i class="icon-remove"></i></button>
				</div>

				<div class="btn-group pull-right hidden-phone">
					<label for="limit" class="element-invisible"><?php echo JText::_('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC'); ?></label>
					<?php echo $this->pagination->getLimitBox(); ?>
				</div>

			</div>
			<div class="clearfix"> </div>

		<?php endif;?>

		<?php if(version_compare(JVERSION, '3.0', 'lt')) : ?>
			<table class="adminlist">
		<?php else : ?>
			<table class="table table-striped" id="customfieldsList">
		<?php endif; ?>

				<thead>
					<tr>
					<?php // JOOMLA 3.x ?>
					<?php if(version_compare(JVERSION, '3.0', 'ge')) : ?>

						<?php // Ordering HEADER Joomla 3.x ?>
 						<th width="1%" class="nowrap center hidden-phone">
							<?php echo JHtml::_('grid.sort', '<i class="icon-menu-2"></i>', 'cf.ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING'); ?>
						</th>

					<?php endif; ?>
					<?php // END JOOMLA 3.x ?>

						<?php // CheckBox HEADER ?>
						<th width="1%" class="hidden-phone">
							<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
						</th>

						<?php // Status HEADER ?>
						<th width="1%" style="min-width:55px" class="nowrap center">
							<?php echo JHtml::_('grid.sort', 'JSTATUS', 'cf.state', $listDirn, $listOrder); ?>
						</th>

						<?php // Title HEADER ?>
						<th>
							<?php echo JHtml::_('grid.sort',  'COM_ICAGENDA_CUSTOMFIELD_TITLE_LBL', 'cf.title', $listDirn, $listOrder); ?>
						</th>

						<?php // Slug HEADER ?>
						<th>
							<?php echo JHtml::_('grid.sort',  'COM_ICAGENDA_CUSTOMFIELD_SLUG_LBL', 'cf.slug', $listDirn, $listOrder); ?>
						</th>

						<?php // Parent Form HEADER ?>
						<th>
							<?php echo JHtml::_('grid.sort',  'COM_ICAGENDA_CUSTOMFIELD_PARENT_FORM_LBL', 'cf.parent_form', $listDirn, $listOrder); ?>
						</th>

						<?php // Field Type HEADER ?>
						<th>
							<?php echo JHtml::_('grid.sort',  'COM_ICAGENDA_CUSTOMFIELD_TYPE_LBL', 'cf.type', $listDirn, $listOrder); ?>
						</th>

						<?php // Required HEADER ?>
						<th>
							<?php echo JHtml::_('grid.sort',  'COM_ICAGENDA_CUSTOMFIELD_REQUIRED_LBL', 'cf.required', $listDirn, $listOrder); ?>
						</th>

				<?php // JOOMLA 2.5 ?>
				<?php if(version_compare(JVERSION, '3.0', 'lt')) : ?>

						<?php // Ordering HEADER Joomla 2.5 ?>
					<?php if (isset($this->items[0]->ordering)) { ?>
						<th width="10%">
							<?php echo JHtml::_('grid.sort',  'JGRID_HEADING_ORDERING', 'cf.ordering', $listDirn, $listOrder); ?>
							<?php if ($canOrder && $saveOrder) :?>
								<?php echo JHtml::_('grid.order',  $this->items, 'filesave.png', 'customfields.saveorder'); ?>
							<?php endif; ?>
						</th>
					<?php } ?>

				<?php // END JOOMLA 2.5 ?>
				<?php endif; ?>

						<?php // ID HEADER ?>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'cf.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="10">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
			<?php foreach ($this->items as $i => $item) :
				$ordering	= ($listOrder == 'cf.ordering');
				$canCreate	= $user->authorise('core.create',		'com_icagenda');
				$canEdit	= $user->authorise('core.edit',			'com_icagenda');
				$canCheckin	= $user->authorise('core.manage',		'com_icagenda');
				$canChange	= $user->authorise('core.edit.state',	'com_icagenda');
				$canEditOwn	= $user->authorise('core.edit.own',		'com_icagenda');
				?>

					<tr class="row<?php echo $i % 2; ?>">

					<?php // JOOMLA 3.x ?>
					<?php if(version_compare(JVERSION, '3.0', 'ge')) : ?>

						<?php // Ordering Joomla 3.x ?>
						<td class="order nowrap center hidden-phone">
							<?php if ($canChange) :
								$disableClassName = '';
								$disabledLabel	  = '';

								if (!$saveOrder) :
									$disabledLabel    = JText::_('JORDERINGDISABLED');
									$disableClassName = 'inactive tip-top';
								endif;
								?>
								<span class="sortable-handler hasTooltip <?php echo $disableClassName; ?>" title="<?php echo $disabledLabel; ?>">
									<i class="icon-menu"></i>
								</span>
								<input type="text" style="display:none" name="order[]" size="5" value="<?php echo $item->ordering; ?>" class="width-20 text-area-order " />
							<?php else : ?>
								<span class="sortable-handler inactive" >
									<i class="icon-menu"></i>
								</span>
							<?php endif; ?>
						</td>

					<?php endif; ?>
					<?php // END JOOMLA 3.x ?>

						<?php // Ordering Joomla 3.x ?>
						<td class="center hidden-phone">
							<?php echo JHtml::_('grid.id', $i, $item->id); ?>
						</td>

						<?php // Status ?>
					<?php if (isset($this->items[0]->state)) { ?>
						<td class="center">
							<?php echo JHtml::_('jgrid.published', $item->state, $i, 'customfields.', $canChange, 'cb'); ?>
						</td>
					<?php } ?>

						<?php // Title ?>
						<td class="nowrap has-context">
							<div class="pull-left">
								<?php if ($item->checked_out) : ?>
									<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'customfields.', $canCheckin); ?>
								<?php endif; ?>
								<?php //if ($item->language == '*'):?>
									<?php //$language = JText::alt('JALL', 'language'); ?>
								<?php //else:?>
									<?php //$language = $item->language ? $this->escape($item->language) : JText::_('JUNDEFINED'); ?>
								<?php //endif;?>
								<?php if ($canEdit) : ?>
									<a href="<?php echo JRoute::_('index.php?option=com_icagenda&task=customfield.edit&id=' . $item->id); ?>" title="<?php echo JText::_('JACTION_EDIT'); ?>">
									<?php echo $this->escape($item->title); ?></a>
								<?php else : ?>
									<span title="<?php echo JText::sprintf('JFIELD_ALIAS_LABEL', $this->escape($item->alias)); ?>"><?php echo $this->escape($item->title); ?></span>
								<?php endif; ?>
							</div>

							<?php // DropDown Edit Joomla 3 ?>
						<?php if(version_compare(JVERSION, '3.0', 'ge')) : ?>
							<div class="pull-left">
								<?php
								// Create dropdown items
								JHtml::_('dropdown.edit', $item->id, 'customfield.');
								JHtml::_('dropdown.divider');

								if ($item->state) :
									JHtml::_('dropdown.unpublish', 'cb' . $i, 'customfields.');
								else :
									JHtml::_('dropdown.publish', 'cb' . $i, 'customfields.');
								endif;

								JHtml::_('dropdown.divider');

								if ($archived) :
									JHtml::_('dropdown.unarchive', 'cb' . $i, 'customfields.');
								else :
									JHtml::_('dropdown.archive', 'cb' . $i, 'customfields.');
								endif;

								if ($item->checked_out) :
									JHtml::_('dropdown.checkin', 'cb' . $i, 'customfields.');
								endif;

								if ($trashed) :
									JHtml::_('dropdown.untrash', 'cb' . $i, 'customfields.');
								else :
									JHtml::_('dropdown.trash', 'cb' . $i, 'customfields.');
								endif;

								// Render dropdown list
								echo JHtml::_('dropdown.render');
								?>
							</div>
						<?php endif; ?>
						</td>

						<?php // Slug ?>
						<td class="hidden-phone">
							<?php if ($item->slug) : ?>
								<?php echo $this->escape($item->slug); ?>
							<?php endif; ?>
						</td>

						<?php // Parent Form ?>
						<td class="hidden-phone">
							<?php if ($item->parent_form == 1) : ?>
								<?php echo JText::_('COM_ICAGENDA_CUSTOMFIELD_PARENT_REGISTRATION_FORM'); ?>
							<?php elseif ($item->parent_form == 2) : ?>
								<?php echo JText::_('COM_ICAGENDA_CUSTOMFIELD_PARENT_EVENT_EDIT'); ?>
							<?php endif; ?>
						</td>

						<?php // Field Type ?>
						<td class="hidden-phone">
							<?php if ($item->type) : ?>
								<?php echo $this->escape($item->type); ?>
							<?php endif; ?>
						</td>

						<?php // Required ?>
						<td class="hidden-phone">
							<?php if ($item->required == 1) : ?>
								<?php //echo '<div class="btn btn-mini btn-success">' . JText::_('JYES') . '</div>'; ?>
								<?php echo JText::_('JYES'); ?>
							<?php else : ?>
								<?php //echo '<div class="btn btn-mini">' . JText::_('JNO') . '</div>'; ?>
								<?php echo JText::_('JNO'); ?>
							<?php endif; ?>
						</td>

				<?php // JOOMLA 2.5 ?>
				<?php if(version_compare(JVERSION, '3.0', 'lt')) : ?>

						<?php // Ordering Joomla 2.5 ?>
					<?php if (isset($this->items[0]->ordering)) { ?>
						<td class="order">
							<?php if ($canChange) : ?>
								<?php if ($saveOrder) :?>
									<?php if ($listDirn == 'asc') : ?>
										<span><?php echo $this->pagination->orderUpIcon($i, true, 'customfields.orderup', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
										<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, true, 'customfields.orderdown', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
									<?php elseif ($listDirn == 'desc') : ?>
										<span><?php echo $this->pagination->orderUpIcon($i, true, 'customfields.orderdown', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
										<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, true, 'customfields.orderup', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
									<?php endif; ?>
								<?php endif; ?>
								<?php $disabled = $saveOrder ?  '' : 'disabled="disabled"'; ?>
								<?php echo '<input type="text" name="order[]" size="5" value="'
											. $item->ordering . '" ' . $disabled . ' class="text-area-order" />'; ?>
							<?php else : ?>
								<?php echo $item->ordering; ?>
							<?php endif; ?>
						</td>
					<?php } ?>

				<?php endif; ?>
				<?php // END JOOMLA 2.5 ?>

						<?php // ID ?>
					<?php if (isset($this->items[0]->id)) { ?>
						<td class="center hidden-phone">
							<?php echo (int) $item->id; ?>
						</td>
					<?php } ?>

					</tr>
				<?php endforeach; ?>
				</tbody>
			</table>

			<div>
				<input type="hidden" name="task" value="" />
				<input type="hidden" name="boxchecked" value="0" />
				<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
				<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
				<?php echo JHtml::_('form.token'); ?>
			</div>
		</div>
	</form>
<?php
}
else
{
	$app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'warning');
	$app->redirect(htmlspecialchars_decode('index.php?option=com_icagenda&view=icagenda'));
}
components/com_icagenda/views/customfields/view.html.php000060400000012624152453623450017620 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.4 2015-04-02
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * View class Admin - List of Custom Fields - iCagenda.
 */
class iCagendaViewCustomfields extends JViewLegacy
{
	protected $items;
	protected $pagination;
	protected $state;

	/**
	 * Display the view
	 *
	 * @since	3.4.0
	 */
	public function display($tpl = null)
	{
		// Joomla 2.5
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			jimport( 'joomla.environment.request' );

			JHtml::stylesheet( 'com_icagenda/icagenda-back.j25.css', false, true );
		}

		$this->state		= $this->get('State');
		$this->items		= $this->get('Items');
		$this->pagination	= $this->get('Pagination');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			JError::raiseError(500, implode("\n", $errors));

			return false;
		}

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();

			if (version_compare(JVERSION, '3.0', 'ge'))
			{
				$this->sidebar = JHtmlSidebar::render();
			}
		}

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @since	3.4.0
	 */
	protected function addToolbar()
	{
		require_once JPATH_COMPONENT.DS.'helpers'.DS.'icagenda.php';

		$state		= $this->get('State');
		$user		= JFactory::getUser();
		$userId		= $user->get('id');
        $canDo		= iCagendaHelper::getActions();

		// Set Title
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			JToolBarHelper::title('iCagenda - ' . JText::_('COM_ICAGENDA_CUSTOMFIELDS'), 'customfields.png');
		}
		else
		{
			JToolBarHelper::title('iCagenda <span style="font-size:14px;">- ' . JText::_('COM_ICAGENDA_CUSTOMFIELDS') . '</span>', 'list-2');
		}

		$icTitle = JText::_('COM_ICAGENDA_CUSTOMFIELDS');

		$document	= JFactory::getDocument();
		$app		= JFactory::getApplication();
		$sitename = $app->getCfg('sitename');
		$title = $app->getCfg('sitename') . ' - ' . JText::_('JADMINISTRATION') . ' - iCagenda: ' . $icTitle;
		$document->setTitle($title);

		//Check if the form exists before showing the add/edit buttons
		$formPath = JPATH_COMPONENT_ADMINISTRATOR.'/views/customfield';

		if (file_exists($formPath))
		{
			if ($canDo->get('core.create'))
			{
				JToolBarHelper::addNew('customfield.add','JTOOLBAR_NEW');
			}

			if ($canDo->get('core.edit'))
			{
				JToolBarHelper::editList('customfield.edit','JTOOLBAR_EDIT');
			}
		}

		if ($canDo->get('core.edit.state'))
		{
            if (isset($this->items[0]->state))
            {
			    JToolBarHelper::divider();
			    JToolBarHelper::custom('customfields.publish', 'publish.png', 'publish_f2.png','JTOOLBAR_PUBLISH', true);
			    JToolBarHelper::custom('customfields.unpublish', 'unpublish.png', 'unpublish_f2.png', 'JTOOLBAR_UNPUBLISH', true);
            }
            else
            {
                //If this component does not use state then show a direct delete button as we can not trash
                JToolBarHelper::deleteList('', 'customfields.delete','JTOOLBAR_DELETE');
            }

            if (isset($this->items[0]->state))
            {
			    JToolBarHelper::divider();
			    JToolBarHelper::archiveList('customfields.archive','JTOOLBAR_ARCHIVE');
            }

            if (isset($this->items[0]->checked_out))
            {
            	JToolBarHelper::custom('customfields.checkin', 'checkin.png', 'checkin_f2.png', 'JTOOLBAR_CHECKIN', true);
            }
		}

        // Show trash and delete for components that uses the state field
        if (isset($this->items[0]->state))
        {
		    if ($state->get('filter.state') == -2 && $canDo->get('core.delete'))
		    {
			    JToolBarHelper::deleteList('', 'customfields.delete','JTOOLBAR_EMPTY_TRASH');
			    JToolBarHelper::divider();
		    }
		    elseif ($canDo->get('core.edit.state'))
		    {
			    JToolBarHelper::trash('customfields.trash','JTOOLBAR_TRASH');
			    JToolBarHelper::divider();
		    }
        }

		if ($canDo->get('core.admin'))
		{
			JToolBarHelper::preferences('com_icagenda');
		}

		if (version_compare(JVERSION, '3.0', 'ge'))
		{
			JHtmlSidebar::setAction('index.php?option=com_icagenda&view=customfields');

			JHtmlSidebar::addFilter(
				JText::_('JOPTION_SELECT_PUBLISHED'),
				'filter_published',
				JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.state'), true)
			);

			JHtmlSidebar::addFilter(
				JText::_('COM_ICAGENDA_CUSTOMFIELDS_FILTER_OPTION_SELECT_PARENT_FORM'),
				'filter_parent_form',
				JHtml::_('select.options', $this->get('ParentForm'), 'value', 'text', $this->state->get('filter.parent_form'), true)
			);

			JHtmlSidebar::addFilter(
				JText::_('COM_ICAGENDA_CUSTOMFIELDS_FILTER_OPTION_SELECT_TYPE'),
				'filter_type',
				JHtml::_('select.options', $this->get('FieldTypes'), 'value', 'text', $this->state->get('filter.type'), true)
			);
		}
	}
}
components/com_icagenda/views/categories/view.html.php000060400000011242152453623450017237 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.4 2015-04-02
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * View class Admin - List of Categories - iCagenda.
 */
class iCagendaViewCategories extends JViewLegacy
{
	protected $items;
	protected $pagination;
	protected $state;

	/**
	 * Display the view
	 */
	public function display($tpl = null)
	{
		// Joomla 2.5
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			jimport( 'joomla.environment.request' );

			JHtml::stylesheet( 'com_icagenda/icagenda-back.j25.css', false, true );
		}

		$this->state		= $this->get('State');
		$this->items		= $this->get('Items');
		$this->pagination	= $this->get('Pagination');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			JError::raiseError(500, implode("\n", $errors));
			return false;
		}

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();

			if (version_compare(JVERSION, '3.0', 'ge'))
			{
				$this->sidebar = JHtmlSidebar::render();
			}
		}

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @since	1.6
	 */
	protected function addToolbar()
	{
		require_once JPATH_COMPONENT . '/helpers/icagenda.php';

		$state		= $this->get('State');
		$user		= JFactory::getUser();
		$userId		= $user->get('id');
		$canDo		= iCagendaHelper::getActions();

		// Set Title
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			JToolBarHelper::title('iCagenda - ' . JText::_('COM_ICAGENDA_TITLE_CATEGORIES'), 'categories.png');
		}
		else
		{
			JToolBarHelper::title('iCagenda <span style="font-size:14px;">- ' . JText::_('COM_ICAGENDA_TITLE_CATEGORIES') . '</span>', 'folder');
		}

		$icTitle	= JText::_('COM_ICAGENDA_TITLE_CATEGORIES');

		$document	= JFactory::getDocument();
		$app		= JFactory::getApplication();
		$sitename	= $app->getCfg('sitename');
		$title		= $app->getCfg('sitename') . ' - ' . JText::_('JADMINISTRATION') . ' - iCagenda: ' . $icTitle;

		$document->setTitle($title);

		//Check if the form exists before showing the add/edit buttons
		$formPath = JPATH_COMPONENT_ADMINISTRATOR.'/views/category';

		if (file_exists($formPath))
		{
			if ($canDo->get('core.create'))
			{
				JToolBarHelper::addNew('category.add', 'JTOOLBAR_NEW');
			}

			if ($canDo->get('core.edit'))
			{
				JToolBarHelper::editList('category.edit', 'JTOOLBAR_EDIT');
			}
		}

		if ($canDo->get('core.edit.state'))
		{
			if (isset($this->items[0]->state))
			{
				JToolBarHelper::divider();
				JToolBarHelper::custom('categories.publish', 'publish.png', 'publish_f2.png', 'JTOOLBAR_PUBLISH', true);
				JToolBarHelper::custom('categories.unpublish', 'unpublish.png', 'unpublish_f2.png', 'JTOOLBAR_UNPUBLISH', true);
			}
			else
			{
				// If this component does not use state then show a direct delete button as we can not trash
				JToolBarHelper::deleteList('', 'categories.delete', 'JTOOLBAR_DELETE');
			}

			if (isset($this->items[0]->state))
			{
				JToolBarHelper::divider();
				JToolBarHelper::archiveList('categories.archive', 'JTOOLBAR_ARCHIVE');
			}

			if (isset($this->items[0]->checked_out))
			{
				JToolBarHelper::custom('categories.checkin', 'checkin.png', 'checkin_f2.png', 'JTOOLBAR_CHECKIN', true);
			}
		}

		// Show trash and delete for components that uses the state field
		if (isset($this->items[0]->state))
		{
			if ($state->get('filter.state') == -2 && $canDo->get('core.delete'))
			{
				JToolBarHelper::deleteList('', 'categories.delete','JTOOLBAR_EMPTY_TRASH');
				JToolBarHelper::divider();
			}
			elseif ($canDo->get('core.edit.state'))
			{
				JToolBarHelper::trash('categories.trash','JTOOLBAR_TRASH');
				JToolBarHelper::divider();
			}
		}

		if ($canDo->get('core.admin'))
		{
			JToolBarHelper::preferences('com_icagenda');
		}

		if (version_compare(JVERSION, '3.0', 'ge'))
		{
			JHtmlSidebar::setAction('index.php?option=com_icagenda&view=categories');

			JHtmlSidebar::addFilter(
				JText::_('JOPTION_SELECT_PUBLISHED'),
				'filter_published',
				JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.state'), true)
			);
		}
	}
}
components/com_icagenda/views/categories/tmpl/index.html000060400000000032152453623450017555 0ustar00<html><body></body></html>components/com_icagenda/views/categories/tmpl/default.php000060400000040523152453623450017726 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.3.3 2014-04-12
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

$app = JFactory::getApplication();

// Access Administration Categories check.
if (JFactory::getUser()->authorise('icagenda.access.categories', 'com_icagenda'))
{
	$user		= JFactory::getUser();
	$userId		= $user->get('id');
	$listOrder	= $this->escape($this->state->get('list.ordering'));
	$listDirn	= $this->escape($this->state->get('list.direction'));
	$canOrder	= $user->authorise('core.edit.state', 'com_icagenda');

	$saveOrder	= $listOrder == 'a.ordering';

	if (version_compare(JVERSION, '3.0', 'lt'))
	{
		JHtml::_('behavior.tooltip');
		JHtml::_('script','system/multiselect.js',false,true);
	}
	else
	{
		// Include the component HTML helpers.
		JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');
		JHtml::_('bootstrap.tooltip');
		JHtml::_('behavior.multiselect');
		JHtml::_('formbehavior.chosen', 'select');
		JHtml::_('dropdown.init');

		$extension	= $this->escape($this->state->get('filter.extension'));

		$archived	= $this->state->get('filter.published') == 2 ? true : false;
		$trashed	= $this->state->get('filter.published') == -2 ? true : false;

		if ($saveOrder)
		{
			$saveOrderingUrl = 'index.php?option=com_icagenda&task=categories.saveOrderAjax&tmpl=component';
			JHtml::_('sortablelist.sortable', 'categoriesList', 'adminForm', strtolower($listDirn), $saveOrderingUrl, false, true);
		}
		//$sortFields = $this->getSortFields();
		$sortFields = array(); // Alchemy - tmp bug fix
		?>
		<script type="text/javascript">
			Joomla.orderTable = function()
			{
				table = document.getElementById("sortTable");
				direction = document.getElementById("directionTable");
				order = table.options[table.selectedIndex].value;
				if (order != '<?php echo $listOrder; ?>')
				{
					dirn = 'asc';
				}
				else
				{
					dirn = direction.options[direction.selectedIndex].value;
				}
				Joomla.tableOrdering(order, dirn, '');
			}
		</script>
		<?php
	}
	?>

	<form action="<?php echo JRoute::_('index.php?option=com_icagenda&view=categories'); ?>" method="post" name="adminForm" id="adminForm">
	<?php if (!empty( $this->sidebar)) : ?>
		<div id="j-sidebar-container" class="span2">
			<?php echo $this->sidebar; ?>
		</div>
		<div id="j-main-container" class="span10">
	<?php else : ?>
		<div id="j-main-container">
	<?php endif;?>

		<?php if(version_compare(JVERSION, '3.0', 'lt')) : ?>
			<fieldset id="filter-bar">
				<div class="filter-search fltlft">
					<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
					<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('Search'); ?>" />
					<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
					<button type="button" onclick="document.id('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
				</div>
				<div class="filter-select fltrt">
					<select name="filter_published" class="inputbox" onchange="this.form.submit()">
						<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED');?></option>
						<?php echo JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), "value", "text", $this->state->get('filter.state'), true);?>
					</select>
				</div>
			</fieldset>
			<div class="clr"> </div>

		<?php else : ?>

			<div id="filter-bar" class="btn-toolbar">
				<div class="filter-search btn-group pull-left">
					<label for="filter_search" class="element-invisible"><?php echo JText::_('COM_ICAGENDA_FILTER_SEARCH_CATEGORIES_DESC'); ?></label>
					<input type="text" name="filter_search" placeholder="<?php echo JText::_('COM_ICAGENDA_FILTER_SEARCH_CATEGORIES_DESC'); ?>" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_ICAGENDA_FILTER_SEARCH_CATEGORIES_DESC'); ?>" />
				</div>
				<div class="btn-group pull-left">
					<button class="btn tip hasTooltip" type="submit" title="<?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?>"><i class="icon-search"></i></button>
					<button class="btn tip hasTooltip" type="button" onclick="document.id('filter_search').value='';this.form.submit();" title="<?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?>"><i class="icon-remove"></i></button>
				</div>
				<div class="btn-group pull-right hidden-phone">
					<label for="limit" class="element-invisible"><?php echo JText::_('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC'); ?></label>
					<?php echo $this->pagination->getLimitBox(); ?>
				</div>
				<!--div class="btn-group pull-right hidden-phone">
					<label for="directionTable" class="element-invisible"><?php echo JText::_('JFIELD_ORDERING_DESC'); ?></label>
					<select name="directionTable" id="directionTable" class="input-medium" onchange="Joomla.orderTable()">
						<option value=""><?php echo JText::_('JFIELD_ORDERING_DESC'); ?></option>
						<option value="asc" <?php if ($listDirn == 'asc') echo 'selected="selected"'; ?>><?php echo JText::_('JGLOBAL_ORDER_ASCENDING'); ?></option>
						<option value="desc" <?php if ($listDirn == 'desc') echo 'selected="selected"'; ?>><?php echo JText::_('JGLOBAL_ORDER_DESCENDING');  ?></option>
					</select>
				</div-->
				<!--div class="btn-group pull-right">
					<label for="sortTable" class="element-invisible"><?php echo JText::_('JGLOBAL_SORT_BY'); ?></label>
					<select name="sortTable" id="sortTable" class="input-medium" onchange="Joomla.orderTable()">
						<option value=""><?php echo JText::_('JGLOBAL_SORT_BY');?></option>
						<?php echo JHtml::_('select.options', $sortFields, 'value', 'text', $listOrder); ?>
					</select>
				</div-->
			</div>
			<div class="clearfix"> </div>

		<?php endif;?>


		<?php if(version_compare(JVERSION, '3.0', 'lt')) : ?>
			<table class="adminlist">
		<?php else : ?>
			<table class="table table-striped" id="categoriesList">
		<?php endif; ?>

				<thead>
					<tr>
	<!-- Ordering HEADER Joomla 3.x (Test) -->
						<?php if(version_compare(JVERSION, '3.0', 'ge')) : ?>
 						<th width="1%" class="nowrap center hidden-phone">
							<?php echo JHtml::_('grid.sort', '<i class="icon-menu-2"></i>', 'a.ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING'); ?>
						</th>
						<?php endif; ?>

	<!-- CheckBox HEADER -->
						<th width="1%" class="hidden-phone">
							<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
						</th>

	<!-- Status HEADER -->
						<th width="1%" style="min-width:55px" class="nowrap center">
							<?php echo JHtml::_('grid.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
						</th>

	<!-- Color HEADER -->
						<th width="5%" class="nowrap hidden-phone">
							<?php echo JHtml::_('grid.sort',  'COM_ICAGENDA_CATEGORIES_COLOR', 'a.color', $listDirn, $listOrder); ?>
						</th>

	<!-- Title HEADER -->
						<th>
							<?php echo JHtml::_('grid.sort',  'COM_ICAGENDA_CATEGORIES_TITLE', 'a.title', $listDirn, $listOrder); ?>
						</th>


	<!-- Ordering HEADER Joomla 2.5 -->
					<?php if(version_compare(JVERSION, '3.0', 'lt')) : ?>
						<?php if (isset($this->items[0]->ordering)) { ?>
						<th width="10%">
							<?php echo JHtml::_('grid.sort',  'JGRID_HEADING_ORDERING', 'a.ordering', $listDirn, $listOrder); ?>
							<?php if ($canOrder && $saveOrder) :?>
								<?php echo JHtml::_('grid.order',  $this->items, 'filesave.png', 'categories.saveorder'); ?>
							<?php endif; ?>
						</th>
	                	<?php } ?>
					<?php endif; ?>

	<!-- ID HEADER -->
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>


				</tr>
			</thead>
			<tfoot>
				<tr>
					<td colspan="10">
						<?php echo $this->pagination->getListFooter(); ?>
					</td>
				</tr>
			</tfoot>
			<tbody>
			<?php foreach ($this->items as $i => $item) :
				$ordering	= ($listOrder == 'a.ordering');
				$canCreate	= $user->authorise('core.create',		'com_icagenda');
				$canEdit	= $user->authorise('core.edit',			'com_icagenda');
				$canCheckin	= $user->authorise('core.manage',		'com_icagenda');
				$canChange	= $user->authorise('core.edit.state',	'com_icagenda');
//				$canEditOwn	= $user->authorise('core.edit.own',		'com_icagenda') && $item->created_by == $userId;
				$canEditOwn	= $user->authorise('core.edit.own',		'com_icagenda');
				?>
				<?php
	/* (Not in used currently)
				$originalOrders = array();
				foreach ($this->items as $i => $item) :
					$orderkey   = array_search($item->id, $this->ordering[$item->parent_id]);
					$canEdit    = $user->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 = "";
					}
*/
					?>

			<!--tr class="row<?php echo $i % 2; ?>" sortable-group-id="<?php //echo $item->parent_id // invalid ?>" item-id="<?php echo $item->id ?>" parents="<?php //echo $parentsStr // invalid ?>" level="<?php //echo $item->level // invalid ?>"-->
				<tr class="row<?php echo $i % 2; ?>">

	<!-- Ordering Joomla 3.x (Test 3.3.3) -->
	<?php if(version_compare(JVERSION, '3.0', 'ge')) : ?>
					<td class="order nowrap center hidden-phone">
					<?php if ($canChange) :
						$disableClassName = '';
						$disabledLabel	  = '';

						if (!$saveOrder) :
							$disabledLabel    = JText::_('JORDERINGDISABLED');
							$disableClassName = 'inactive tip-top';
						endif; ?>
						<span class="sortable-handler hasTooltip <?php echo $disableClassName; ?>" title="<?php echo $disabledLabel; ?>">
							<i class="icon-menu"></i>
						</span>
						<input type="text" style="display:none" name="order[]" size="5" value="<?php echo $item->ordering; ?>" class="width-20 text-area-order " />
					<?php else : ?>
						<span class="sortable-handler inactive" >
							<i class="icon-menu"></i>
						</span>
					<?php endif; ?>
					</td>
	<?php endif; ?>


	<!-- CheckBox -->
						<td class="center hidden-phone">
							<?php echo JHtml::_('grid.id', $i, $item->id); ?>
						</td>

	<!-- Status -->
 	              <?php if (isset($this->items[0]->state)) { ?>
					    <td class="center">
						    <?php echo JHtml::_('jgrid.published', $item->state, $i, 'categories.', $canChange, 'cb'); ?>
					    </td>
  	              <?php } ?>

	<!-- Color -->
						<td class="small hidden-phone">
							<div style="display:block; width:50px; height:40px; border-radius:5px; background:<?php echo $item->color; ?>;"></div>
						</td>

	<!-- Title -->
						<td class="nowrap has-context">
							<div class="pull-left">
								<?php if ($item->checked_out) : ?>
									<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'categories.', $canCheckin); ?>
								<?php endif; ?>
								<?php //if ($item->language == '*'):?>
									<?php //$language = JText::alt('JALL', 'language'); ?>
								<?php //else:?>
									<?php //$language = $item->language ? $this->escape($item->language) : JText::_('JUNDEFINED'); ?>
								<?php //endif;?>
								<?php if ($canEdit) : ?>
									<a href="<?php echo JRoute::_('index.php?option=com_icagenda&task=category.edit&id=' . $item->id); ?>" title="<?php echo JText::_('JACTION_EDIT'); ?>">
										<?php echo $this->escape($item->title); ?></a>
								<?php else : ?>
									<span title="<?php echo JText::sprintf('JFIELD_ALIAS_LABEL', $this->escape($item->alias)); ?>"><?php echo $this->escape($item->title); ?></span>
								<?php endif; ?>
							</div>

	<!-- DropDown Edit Joomla 3 -->
	<?php if(version_compare(JVERSION, '3.0', 'ge')) : ?>
							<div class="pull-left">
								<?php
									// Create dropdown items
									JHtml::_('dropdown.edit', $item->id, 'category.');
									JHtml::_('dropdown.divider');
									if ($item->state) :
										JHtml::_('dropdown.unpublish', 'cb' . $i, 'categories.');
									else :
										JHtml::_('dropdown.publish', 'cb' . $i, 'categories.');
									endif;

//									if ($item->featured) :
//										JHtml::_('dropdown.unfeatured', 'cb' . $i, 'categories.');
//									else :
//										JHtml::_('dropdown.featured', 'cb' . $i, 'categories.');
//									endif;

									JHtml::_('dropdown.divider');

									if ($archived) :
										JHtml::_('dropdown.unarchive', 'cb' . $i, 'categories.');
									else :
										JHtml::_('dropdown.archive', 'cb' . $i, 'categories.');
									endif;

									if ($item->checked_out) :
										JHtml::_('dropdown.checkin', 'cb' . $i, 'categories.');
									endif;

									if ($trashed) :
										JHtml::_('dropdown.untrash', 'cb' . $i, 'categories.');
									else :
										JHtml::_('dropdown.trash', 'cb' . $i, 'categories.');
									endif;

									// Render dropdown list
									echo JHtml::_('dropdown.render');
									?>
							</div>
		<?php endif; ?>


						</td>

	<!-- Ordering Joomla 2.5 -->
	<?php if(version_compare(JVERSION, '3.0', 'lt')) : ?>
             	   <?php if (isset($this->items[0]->ordering)) { ?>
					    <td class="order">
						    <?php if ($canChange) : ?>
							    <?php if ($saveOrder) :?>
								    <?php if ($listDirn == 'asc') : ?>
									    <span><?php echo $this->pagination->orderUpIcon($i, true, 'categories.orderup', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
									    <span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, true, 'categories.orderdown', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
								    <?php elseif ($listDirn == 'desc') : ?>
									    <span><?php echo $this->pagination->orderUpIcon($i, true, 'categories.orderdown', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
									    <span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, true, 'categories.orderup', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
								    <?php endif; ?>
							    <?php endif; ?>
							    <?php $disabled = $saveOrder ?  '' : 'disabled="disabled"'; ?>
							    <input type="text" name="order[]" size="5" value="<?php echo $item->ordering;?>" <?php echo $disabled ?> class="text-area-order" />
						    <?php else : ?>
							    <?php echo $item->ordering; ?>
						    <?php endif; ?>
					    </td>
             	   <?php } ?>
		<?php endif; ?>


	<!-- ID -->
						<?php if (isset($this->items[0]->id)) { ?>
						<td class="center hidden-phone">
							<?php echo (int) $item->id; ?>
						</td>
        	        	<?php } ?>
					</tr>
					<?php endforeach; ?>
				</tbody>
			</table>

			<div>
				<input type="hidden" name="task" value="" />
				<input type="hidden" name="boxchecked" value="0" />
				<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
				<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
				<?php echo JHtml::_('form.token'); ?>
			</div>
		</div>
	</form>
	<?php
}
else
{
	$app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'warning');
	$app->redirect(htmlspecialchars_decode('index.php?option=com_icagenda&view=icagenda'));
}
components/com_icagenda/views/categories/index.html000060400000000032152453623450016601 0ustar00<html><body></body></html>components/com_icagenda/views/themes/index.html000060400000000032152453623450015741 0ustar00<html><body></body></html>components/com_icagenda/views/themes/view.html.php000060400000004304152453623450016400 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.4.1 2014-12-29
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

// Access check.
if (JFactory::getUser()->authorise('core.admin', 'com_icagenda'))
{
	JToolBarHelper::preferences('com_icagenda');
}

/**
 * View class Admin - Theme Manager - iCagenda
 */
class iCagendaViewthemes extends JViewLegacy
{
	/**
	 * Display the view
	 */
	public function display($tpl = null)
	{
		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			JError::raiseError(500, implode("\n", $errors));
			return false;
		}

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();
			if(version_compare(JVERSION, '3.0', 'ge'))
			{
				$this->sidebar = JHtmlSidebar::render();
			}
		}

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @since	1.6
	 */
	protected function addToolbar()
	{
		require_once JPATH_COMPONENT . '/helpers/icagenda.php';

		$state	= $this->get('State');

		// Set Title
		if(version_compare(JVERSION, '3.0', 'lt'))
		{
			JToolBarHelper::title('iCagenda - ' . JText::_('COM_ICAGENDA_THEME_MANAGER'), 'themes.png');
		}
		else
		{
			JToolBarHelper::title('iCagenda <span style="font-size:14px;">- ' . JText::_('COM_ICAGENDA_THEME_MANAGER') . '</span>', 'palette');
		}

		$icTitle = JText::_('COM_ICAGENDA_THEME_MANAGER');

		$document	= JFactory::getDocument();
		$app		= JFactory::getApplication();
		$sitename = $app->getCfg('sitename');
		$title = $app->getCfg('sitename') . ' - ' . JText::_('JADMINISTRATION') . ' - iCagenda: ' . $icTitle;
		$document->setTitle($title);
	}
}
components/com_icagenda/views/themes/tmpl/index.html000060400000000032152453623450016715 0ustar00<html><body></body></html>components/com_icagenda/views/themes/tmpl/default.php000060400000030144152453623450017064 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.6 2015-06-23
 * @since       2.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );

JHtml::_('behavior.framework');
JHtml::_('behavior.modal');

$app = JFactory::getApplication();
$document = JFactory::getDocument();

// Access Administration Registrations check.
if (JFactory::getUser()->authorise('icagenda.access.themes', 'com_icagenda'))
{
	// Check Theme Packs Compatibility
	if (class_exists('icagendaTheme')) icagendaTheme::checkThemePacks();

	$user	= JFactory::getUser();
	$userId	= $user->get('id');

	$params = JComponentHelper::getParams( 'com_icagenda' );
	$version = $params->get('version');
	?>

<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>

		<!-- Begin Content -->
		<div class="row-fluid">
			<div class="span12">
				<div class="span6">
					<div style="background-color:#FFFFFF; border: 1px solid #D4D4D4; padding:30px; border-radius: 10px;">
						<form enctype="multipart/form-data" action="index.php" method="post" name="adminForm" id="themes-form" class="form-validate">
							<?php
							if (isset($this->require_ftp)) {
							echo iCagendaFileUpload::renderFTPaccess();
							}
							?>
							<div class="control-group">
								<label for="install_package"><b><?php echo JText::_( 'COM_ICAGENDA_UPLOAD_THEME_PACKAGE_FILE' ); ?></b></label>
								<div class="controls">
									<input type="file" id="sfile-upload" class="input" name="Filedata" />
									<button onclick="submitbutton()" class="btn btn-primary" id="upload-submit">
	<?php if(version_compare(JVERSION, '3.0', 'lt')) : ?>
										<?php echo JText::_( 'COM_ICAGENDA_UPLOAD_AND_INSTALL' ); ?>
	<?php else : ?>
										<i class="icon-upload icon-white"></i> <?php echo JText::_( 'COM_ICAGENDA_UPLOAD_AND_INSTALL' ); ?>
	<?php endif; ?>
									</button>
								</div>
							</div>
							<input type="hidden" name="type" value="" />
							<input type="hidden" name="option" value="com_icagenda" />
							<input type="hidden" name="task" value="themes.themeinstall" />
							<?php echo JHTML::_( 'form.token' ); ?>
						</form>
					</div>
				</div>
				<div class="span1">
				</div>
				<div class="span5">
					<div style="float:right; padding:0px 0px 0px 20px;">
						<img src="../media/com_icagenda/images/logo_icagenda.png" alt="logo_icagenda" />
					</div>
					<div>
						<h2 style="font-size:2em;">
							<b style="color:#cc0000;">iC</b><b style="color: #666666;">agenda<sup style="font-size:0.6em">&trade;</sup></b><?php echo $version ;?>
						</h2>
					</div>
					<div>
						<h4>
							<?php echo JText::_('COM_ICAGENDA_THEME_MANAGER') ?> v1
						</h4>
					</div>
					<br/>
				</div>
			</div>
		</div>
		<div class="clearfix"> </div>

		<div class="row-fluid">
			<h2><?php echo JText::_('COM_ICAGENDA_THEMES_LIST_TITLE'); ?></h2>
			<div class="span12 small" style="margin-left: 0px">
				<?php

				$url=JPATH_SITE.DS.'components'.DS.'com_icagenda'.DS.'themes'.DS.'packs';
				$urlxml=JPATH_SITE.DS.'components'.DS.'com_icagenda'.DS.'themes/';

				$nb_themes = 0;

				function url_exists($url) {
					$a_url = parse_url($url);
					if (!isset($a_url['port'])) $a_url['port'] = 80;
					$errno = 0;
					$errstr = '';
					$timeout = 30;
					if(isset($a_url['host']) && $a_url['host']!=gethostbyname($a_url['host'])){
						$fid = fsockopen($a_url['host'], $a_url['port'], $errno, $errstr, $timeout);
						if (!$fid) return false;
						$page = isset($a_url['path']) ?$a_url['path']:'';
						$page .= isset($a_url['query'])?'?'.$a_url['query']:'';
						fputs($fid, 'HEAD '.$page.' HTTP/1.0'."\r\n".'Host: '.$a_url['host']."\r\n\r\n");
						$head = fread($fid, 4096);
						fclose($fid);
						return preg_match('#^HTTP/.*\s+[200|302]+\s#i', $head);
					} else {
						return false;
					}
				}

				if($dossier = opendir($url)) {
					while(false !== ($pack = readdir($dossier))) {
						if($pack != '.' && $pack != '..' && $pack != 'index.php' && $pack != 'index.html' && $pack != '.DS_Store' && $pack!='.thumbs') {
							$nb_themes++; // On incrémente le compteur de 1
							$xml = '.xml';
							$themeurl = $urlxml.$pack.$xml;

							$dom = new DomDocument;
							$dom->load($themeurl);

							$getthemeUpdate = $dom->getElementsByTagName('themeUpdate');
							foreach ($getthemeUpdate AS $themeUpdate)
							$themeUpdate = $themeUpdate->firstChild->nodeValue;
							$urltheme = $themeUpdate.'/'.$pack.'/update.xml';
							$unknown = JText::_('COM_ICAGENDA_THEME_UNKNOWN');

							// Test si fichier de mise à jour
							$urlex = $urltheme;

							if (url_exists($urlex))
							{
								// Récupération données fichier distant de MàJ
								$update = new DomDocument;
								$update->load($urltheme);

								$getUpdateversion = $update->getElementsByTagName('version');
								$getUpdatedownload = $update->getElementsByTagName('download');
								foreach ($getUpdateversion AS $Updatevers)
								foreach ($getUpdatedownload AS $download)
								$updateVersion = $Updatevers->firstChild->nodeValue;
								$updateDownload = $download->firstChild->nodeValue;
							}
							else
							{
								$updateVersion = $unknown;
								$updateDownload = '#';
							}


//							$getUpdatestatus = $dom->getElementsByTagName('status');

							// Récupération données fichier manifest install
							$getthemename = $dom->getElementsByTagName('name');
							$getversion = $dom->getElementsByTagName('version');
							$getcreationDate = $dom->getElementsByTagName('creationDate');
							$getauthor = $dom->getElementsByTagName('author');
							$getauthorEmail = $dom->getElementsByTagName('authorEmail');
							$getauthorWebsite = $dom->getElementsByTagName('authorWebsite');
							$getauthorUrl = $dom->getElementsByTagName('authorUrl');
							$getdescription = $dom->getElementsByTagName('description');

							// Conversion des données
							foreach ($getthemename AS $name)
//							foreach ($getUpdatestatus AS $status)
							foreach ($getversion AS $version)
							foreach ($getcreationDate AS $creationDate)
							foreach ($getauthor AS $author)
							foreach ($getauthorEmail AS $authorEmail)
							foreach ($getauthorWebsite AS $authorWebsite)
							foreach ($getauthorUrl AS $authorUrl)
							foreach ($getdescription AS $description)

							$authorWebsitetest = $authorWebsite->firstChild->nodeValue;

							// Affichage fiches Themes
							echo '<div class="span3" style="padding: 10px; margin:10px 20px 10px 0px; background: #D9D9D9; border-radius:10px;">';

								// Affichage Titre et Nom
								echo '<div style="text-align:center"><h4>' . $name->firstChild->nodeValue . ' <br><small>[&nbsp;<span style="color:grey">' . $pack . '</span>&nbsp;]</small></h4></div>';

								//Image Theme
								$urlimg		= '../components/com_icagenda/themes/packs';
								$thumb		= $urlimg.'/'.$pack.'/images/'.$pack.'_thumbnail.png';
								$preview	= $urlimg.'/'.$pack.'/images/'.$pack.'_preview.png';
								if (file_exists($thumb))
								{
									$img	= '<img width=280px height=160px src="'.$thumb.'" alt="">';
									if (file_exists($preview))
									{
										$imgtheme	= '<div style="text-align:center; max-width=280px"><a href="'.$preview.'" class="modal" title="'.JText::_('COM_ICAGENDA_CLICK_TO_ENLARGE').'">'.$img.'</a></div>';
									}
								} else {
									$imgtheme ='<div style="text-align:center; max-width=280px">'.JText::_('COM_ICAGENDA_THEME_NO_PREVIEW').'</div>';
								}

								echo $imgtheme;

								// Affichage Description
								echo '<p><div style="text-align:justify;"><i>' . $description->firstChild->nodeValue . '</i></div>';

								// Affichage Auteur
								echo '<div>'.JText::_('COM_ICAGENDA_THEME_AUTHOR').' : <a href="mailto:'.$authorEmail->firstChild->nodeValue.'">' . $author->firstChild->nodeValue . '</a></div>';

								// Affichage Site Auteur
								$authorWebsite = $authorWebsite->firstChild->nodeValue;
								if ($authorWebsite != NULL) {
									echo '<div>'.JText::_('COM_ICAGENDA_THEME_AUTHOR_WEBSITE').' : <a href="'.$authorUrl->firstChild->nodeValue.'" target="_blank">' . $authorWebsite . '</a></div>';
								}

								// Affichage Version installée
								echo '<div>'.JText::_('COM_ICAGENDA_THEME_INSTALLED_VERSION').' : ' . $version->firstChild->nodeValue . '</div>';

								// Affichage Dernière version publiée
								if (($updateVersion > $version->firstChild->nodeValue) && ($updateVersion != $unknown)) {
									echo '<div>'.JText::_('COM_ICAGENDA_THEME_LATEST_VERSION').' : ' . $updateVersion . '</div></p>';
								}

								echo '<p></p><div style="display:block; margin-left:auto; margin-right: auto;">';

									if (($updateVersion > $version->firstChild->nodeValue) && ($updateVersion != $unknown)) {
										echo '<a href="'.$updateDownload.'" target="_blank"><div class="btn_update">'.JText::_('COM_ICAGENDA_THEME_UPDATE').' ' . $updateVersion . ' !</div></a>';
									} elseif ($updateVersion == $unknown) {
										echo '<div style="text-align:center; background:#333333; padding:5px; border-radius:5px; color:#FFFFFF;">'.JText::_('COM_ICAGENDA_THEME_AUTHOR_CONTACT').'</div>';
									} else {
										echo '<div style="text-align:center; background:#FFFFFF; padding:5px; border-radius:5px;">'.JText::_('COM_ICAGENDA_THEME_LATEST').'</div>';
									}

								echo '</div>';
							echo '</div>';
							} // On ferme le if (qui permet de ne pas afficher index.php, etc.)

						} // On termine la boucle

						echo '<div style="clear: both;"></div>';

						echo '<div>&nbsp;</div>';

						echo '<div>' . JText::_('COM_ICAGENDA_THEME_NB_THEMES_1') . '<strong> ' . $nb_themes . ' </strong>' . JText::_('COM_ICAGENDA_THEME_NB_THEMES_2') .'</div>';
						echo '<div>&nbsp;</div>';

						closedir($dossier);

						} else {
							echo 'ERROR: Folder not opened!';
						}
						?>

			</div>

			<div class="span12" style="margin-left: 0px">
				<div class="span6">
					<div>
						<a href="http://icagenda.joomlic.com/resources/translations" target="_blank" class="btn"><?php echo JText::_('COM_ICAGENDA_PANEL_TRANSLATION_PACKS_DONWLOAD');?></a>
						<a href='http://www.joomlic.com/forum/icagenda'  target="_blank" class="btn"><?php echo JText::_('COM_ICAGENDA_PANEL_HELP_FORUM'); ?></a>
					</div>
				</div>
				<div class="span6">
				</div>
			</div>
		</div>
		<div class="clearfix"> </div>
	</div>


	<div class="row-fluid">
		<div class="span12">
		<hr>
			<div class="span9">
				Copyright ©2012-<?php echo date("Y"); ?> joomlic.com -&nbsp;
				<?php echo JText::_('COM_ICAGENDA_PANEL_COPYRIGHT');?>&nbsp;<a href="http://extensions.joomla.org/extensions/calendars-a-events/events/events-management/22013" target="_blank">Joomla! Extensions Directory</a>.
				<br />
				<br />
			</div>
			<div class="span3" style="text-align: right">
				<a href='http://www.joomlic.com' target='_blank'><img src="../media/com_icagenda/images/logo_joomlic.png" alt="JoomliC" border="0"/></a>
				<br />
				<i><b><?php echo JText::_('COM_ICAGENDA_PANEL_SITE_VISIT');?>&nbsp;<a href='http://www.joomlic.com' target='_blank'>www.joomlic.com</a></b></i>
			</div>
		</div>
	</div>

	<div class="clearfix"> </div>

	<?php
	// Joomla 2.5 CSS
	if (version_compare(JVERSION, '3.0', 'lt'))
	{
		JHtml::stylesheet('com_icagenda/template.j25.css', false, true);
		JHtml::stylesheet('com_icagenda/icagenda-back.j25.css', false, true);
	}
}
else
{
	$app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'warning');
	$app->redirect(htmlspecialchars_decode('index.php?option=com_icagenda&view=icagenda'));
}
components/com_icagenda/views/category/index.html000060400000000032152453623450016271 0ustar00<html><body></body></html>components/com_icagenda/views/category/view.html.php000060400000007330152453623450016732 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.2.5 2013-11-09
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

// iCagenda Class control (Joomla 2.5/3.x)
if(!class_exists('iCJView')) {
   if(version_compare(JVERSION,'3.0.0','ge')) {
      class iCJView extends JViewLegacy {
      };
   } else {
      jimport('joomla.application.component.view');
      class iCJView extends JView {};
   }
}

/**
 * View class Admin - Edit a Category - iCagenda
 */
class iCagendaViewCategory extends iCJView
{
	protected $state;
	protected $item;
	protected $form;

	/**
	 * Display the view
	 */
	public function display($tpl = null)
	{
		$this->state	= $this->get('State');
		$this->item		= $this->get('Item');
		$this->form		= $this->get('Form');


		// Check for errors.
		if (count($errors = $this->get('Errors'))) {
			JError::raiseError(500, implode("\n", $errors));
			return false;
		}

		$this->addToolbar();
		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 */
	protected function addToolbar()
	{
		JRequest::setVar('hidemainmenu', true);

		$user		= JFactory::getUser();
		$isNew		= ($this->item->id == 0);
        if (isset($this->item->checked_out)) {
		    $checkedOut	= !($this->item->checked_out == 0 || $this->item->checked_out == $user->get('id'));
        } else {
            $checkedOut = false;
        }
		$canDo		= iCagendaHelper::getActions();

		//JToolBarHelper::title(JText::_('COM_ICAGENDA_TITLE_CATEGORY'), 'category.png');
		// Set Title
		if(version_compare(JVERSION, '3.0', 'lt')) {
			JToolBarHelper::title($isNew ? 'iCagenda - ' . JText::_('COM_ICAGENDA_LEGEND_NEW_CATEGORY') : 'iCagenda - ' . JText::_('COM_ICAGENDA_LEGEND_EDIT_CATEGORY'), 'category.png');
		} else {
			JToolBarHelper::title($isNew ? 'iCagenda <span style="font-size:14px;">- ' . JText::_('COM_ICAGENDA_LEGEND_NEW_CATEGORY') . '</span>'  : 'iCagenda <span style="font-size:14px;">- ' . JText::_('COM_ICAGENDA_LEGEND_EDIT_CATEGORY') . '</span>' , $isNew ? 'new' : 'pencil-2');
		}

		$icTitle = $isNew ? JText::_('COM_ICAGENDA_LEGEND_NEW_CATEGORY') : JText::_('COM_ICAGENDA_LEGEND_EDIT_CATEGORY');

		$document	= JFactory::getDocument();
		$app		= JFactory::getApplication();
		$sitename = $app->getCfg('sitename');
		$title = $app->getCfg('sitename') . ' - ' . JText::_('JADMINISTRATION') . ' - iCagenda: ' . $icTitle;
		$document->setTitle($title);

		// If not checked out, can save the item.
		if (!$checkedOut && ($canDo->get('core.edit')||($canDo->get('core.create'))))
		{

			JToolBarHelper::apply('category.apply', 'JTOOLBAR_APPLY');
			JToolBarHelper::save('category.save', 'JTOOLBAR_SAVE');
		}
		if (!$checkedOut && ($canDo->get('core.create'))){
			JToolBarHelper::custom('category.save2new', 'save-new.png', 'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false);
		}
		// If an existing item, can save to a copy.
		if (!$isNew && $canDo->get('core.create')) {
			JToolBarHelper::custom('category.save2copy', 'save-copy.png', 'save-copy_f2.png', 'JTOOLBAR_SAVE_AS_COPY', false);
		}
		if (empty($this->item->id)) {
			JToolBarHelper::cancel('category.cancel', 'JTOOLBAR_CANCEL');
		}
		else {
			JToolBarHelper::cancel('category.cancel', 'JTOOLBAR_CLOSE');
		}

	}
}
components/com_icagenda/views/category/tmpl/edit.php000060400000023173152453623450016721 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.6 2015-05-06
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');

$app = JFactory::getApplication();

// Access Administration Categories check.
if (JFactory::getUser()->authorise('icagenda.access.categories', 'com_icagenda'))
{
	$document			= JFactory::getDocument();
	$bootstrapType		= '1';
	$CategoryTag		='category';
	$CategoryTitle		= JText::_('COM_ICAGENDA_TITLE_CATEGORY', true);
	$DescTag			= 'desc';
	$DescTitle			= JText::_('COM_ICAGENDA_LEGEND_DESC', true);
	$PublishingTag		= 'publishing';
	$PublishingTitle	= JText::_('JGLOBAL_FIELDSET_PUBLISHING', true);

	// Joomla 2.5
	if (version_compare(JVERSION, '3.0', 'lt'))
	{
		jimport('joomla.html.html.tabs');

		$iCmapDisplay		= '3';

		$icPanCategory		= JText::_('COM_ICAGENDA_TITLE_CATEGORY');
		$icPanDesc			= JText::_('COM_ICAGENDA_LEGEND_DESC');
		$icPanPublishing	= JText::_('JGLOBAL_FIELDSET_PUBLISHING');
		$startPane			= 'tabs.start';
		$addPanel			= 'tabs.panel';
		$endPanel			= 'tabs.end';
		$endPane			= 'tabs.end';
		$CategoryTag1		= $CategoryTag;
		$CategoryTag2		= $CategoryTitle;
		$DescTag1			= $DescTag;
		$DescTag2			= $DescTitle;
		$PublishingTag1		= $PublishingTag;
		$PublishingTag2		= $PublishingTitle;
	}

	// Joomla 3
	else
	{
		JHtml::_('formbehavior.chosen', 'select');
		jimport('joomla.html.html.bootstrap');

		$icPanCategory		= 'icTab';
		$icPanDesc			= 'icTab';
		$icPanPublishing	= 'icTab';

		if ($bootstrapType == '1')
		{
			$iCmapDisplay	= '1';
			$startPane		= 'bootstrap.startTabSet';
			$addPanel		= 'bootstrap.addTab';
			$endPanel		= 'bootstrap.endTab';
			$endPane		= 'bootstrap.endTabSet';
			$CategoryTag1	= $CategoryTag;
			$CategoryTag2	= $CategoryTitle;
			$DescTag1		= $DescTag;
			$DescTag2		= $DescTitle;
			$PublishingTag1	= $PublishingTag;
			$PublishingTag2	= $PublishingTitle;
		}
		elseif ($bootstrapType == '2')
		{
			$iCmapDisplay	= '2';
			$startPane		= 'bootstrap.startAccordion';
			$addPanel		= 'bootstrap.addSlide';
			$endPanel		= 'bootstrap.endSlide';
			$endPane		= 'bootstrap.endAccordion';
			$CategoryTag1	= $CategoryTitle;
			$CategoryTag2	= $CategoryTag;
			$DescTag1		= $DescTitle;
			$DescTag2		= $DescTag;
			$PublishingTag1	= $PublishingTitle;
			$PublishingTag2	= $PublishingTag;
		}
	}
	?>

	<script type="text/javascript">
		Joomla.submitbutton = function(task)
		{
			if (task == 'category.cancel' || document.formvalidator.isValid(document.id('category-form'))) {
				Joomla.submitform(task, document.getElementById('category-form'));
			}
			else {
				alert('<?php echo $this->escape(JText::_('JGLOBAL_VALIDATION_FORM_FAILED'));?>');
			}
		}
	</script>

<form action="<?php echo JRoute::_('index.php?option=com_icagenda&layout=edit&id='.(int) $this->item->id); ?>" method="post" name="adminForm" id="category-form" class="form-validate">
	<div class="container">

		<!-- iCheader top bar -->
		<!--div class="iCheader-top">
			<a href="#">
				<strong>&laquo; Previous </strong>event
			</a>
			<span class="right">
				<a href="#">
					<strong>Next</strong> event <strong>&raquo;</strong>
				</a>
			</span>
			<div class="clr"></div>
		</div-->
		<!--/ iCheader top bar -->


		<!-- iCagenda Header -->
		<header>
			<h1>
				<?php echo empty($this->item->id) ? JText::_('COM_ICAGENDA_LEGEND_NEW_CATEGORY') : JText::sprintf('COM_ICAGENDA_LEGEND_EDIT_CATEGORY', $this->item->id); ?>&nbsp;<span>iCagenda</span>
			</h1>
			<h2>
				<?php echo JText::_('COM_ICAGENDA_COMPONENT_DESC'); ?>
				<!--nav class="iCheader-videos">
					<span style="font-variant:small-caps">Tutorial Videos</span>
					<a href="#">Add a event</a>
					<a href="#">Video 2</a>
					<a href="#">Video 3</a>
				</nav-->
			</h2>
		</header>

		<div>&nbsp;</div>



		<!-- Begin Content -->
		<div class="row-fluid">
			<div class="span10 form-horizontal">

				<!-- Open Panel Set -->
				<?php echo JHtml::_($startPane, 'icTab', array('active' => 'category')); ?>

					<!-- Panel Event -->
					<?php echo JHtml::_($addPanel, $icPanCategory, $CategoryTag1, $CategoryTag2); ?>

						<div class="icpanel iCleft">
							<h1><?php echo empty($this->item->id) ? JText::_('COM_ICAGENDA_LEGEND_NEW_CATEGORY') : JText::sprintf('COM_ICAGENDA_LEGEND_EDIT_CATEGORY', $this->item->id); ?></h1>
							<hr>
							<div class="row-fluid">
								<div class="span6 iCleft">
									<div class="control-group">
										<div class="control-label">
											<?php echo $this->form->getLabel('title'); ?>
										</div>
										<div class="controls">
											<?php echo $this->form->getInput('title'); ?>
										</div>
									</div>
								</div>
								<div class="span6 iCleft">
									<div class="control-group">
										<div class="control-label">
											<?php echo $this->form->getLabel('color'); ?>
										</div>
										<div class="controls">
											<?php echo $this->form->getInput('color'); ?>
										</div>
									</div>
								</div>
							</div>
						</div>


					<?php
					if(version_compare(JVERSION, '3.0', 'ge')) {
						echo JHtml::_($endPanel);
					}
					?>


					<!-- Panel Description -->
					<?php echo JHtml::_($addPanel, $icPanDesc, $DescTag1, $DescTag2); ?>

						<div class="icpanel iCleft">
							<h1><?php echo JText::_('COM_ICAGENDA_LEGEND_DESC'); ?></h1>
							<hr>
							<div class="row-fluid">
								<div class="span12 iCleft">
									<h3><?php echo JText::_('COM_ICAGENDA_FORM_DESC_CATEGORY_DESC'); ?></h3>
									<?php echo $this->form->getInput('desc'); ?>
								</div>
							</div>
						</div>


				<?php
				if(version_compare(JVERSION, '3.0', 'ge')) {
					echo JHtml::_($endPanel);
				}
				?>

				<?php
				echo JHtml::_($addPanel, $icPanPublishing, $PublishingTag1, $PublishingTag2);
				?>
				<div class="icpanel iCleft">
					<h1><?php echo JText::_('JGLOBAL_FIELDSET_PUBLISHING'); ?></h1>
					<hr>
					<div class="row-fluid">
						<div class="span6 iCleft">
							<div class="control-group">
								<div class="control-label">
									<?php echo $this->form->getLabel('alias'); ?>
								</div>
								<div class="controls">
									<?php echo $this->form->getInput('alias'); ?>
								</div>
							</div>
							<div class="control-group">
								<div class="control-label">
									<?php echo $this->form->getLabel('id'); ?>
								</div>
								<div class="controls">
									<?php echo $this->form->getInput('id'); ?>
								</div>
							</div>
							<!--div class="control-group">
								<?php echo $this->form->getLabel('created_by'); ?>
								<div class="controls">
									<?php echo $this->form->getInput('created_by'); ?>
								</div>
							</div>
							<div class="control-group">
								<?php echo $this->form->getLabel('created_by_alias'); ?>
								<div class="controls">
									<?php echo $this->form->getInput('created_by_alias'); ?>
								</div>
							</div>
							<div class="control-group">
								<?php echo $this->form->getLabel('created'); ?>
								<div class="controls">
									<?php echo $this->form->getInput('created'); ?>
								</div>
							</div-->
							<div class="control-group">
								<div class="control-label">
									<?php echo $this->form->getLabel('checked_out'); ?>
								</div>
								<div class="controls">
									<?php echo $this->form->getInput('checked_out'); ?>
								</div>
							</div>
							<div class="control-group">
								<div class="control-label">
									<?php echo $this->form->getLabel('checked_out_time'); ?>
								</div>
								<div class="controls">
									<?php echo $this->form->getInput('checked_out_time'); ?>
								</div>
							</div>
						</div>
					</div>
				</div>


				<?php echo JHtml::_($endPanel); ?>

				<?php echo JHtml::_($endPane, 'icTab'); ?>
			</div>

		<!-- Begin Sidebar -->
			<div class="span2 iCleft">
						<h4><?php echo JText::_('COM_ICAGENDA_TITLE_SIDEBAR_DETAILS'); ?></h4>
						<hr>
							<div class="control-group">
								<div class="control-label">
									<?php echo $this->form->getLabel('state'); ?>
								</div>
								<div class="controls">
									<?php echo $this->form->getInput('state'); ?>
								</div>
							</div>
							<!--div class="control-group">
								<?php echo $this->form->getLabel('access'); ?>
								<div class="controls">
									<?php echo $this->form->getInput('access'); ?>
								</div>
							</div>
							<div class="control-group">
								<?php echo $this->form->getLabel('language'); ?>
								<div class="controls">
									<?php echo $this->form->getInput('language'); ?>
								</div>
							</div-->
			</div>
		<!-- End Sidebar -->
		</div>

		<div class="clr"></div>

	</div>

	</div>

	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>
	<div class="clr"></div>
</form>

	<?php
	// Joomla 2.5
	if (version_compare(JVERSION, '3.0', 'lt'))
	{
		JHtml::stylesheet('com_icagenda/template.j25.css', false, true);
		JHtml::stylesheet('com_icagenda/icagenda-back.j25.css', false, true);
	}
}
else
{
	$app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'warning');
	$app->redirect(htmlspecialchars_decode('index.php?option=com_icagenda&view=icagenda'));
}
components/com_icagenda/views/category/tmpl/index.html000060400000000032152453623450017245 0ustar00<html><body></body></html>components/com_icagenda/views/customfield/tmpl/index.html000060400000000032152453623450017746 0ustar00<html><body></body></html>components/com_icagenda/views/customfield/tmpl/edit.php000060400000030725152453623450017423 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.6 2015-05-06
 * @since		3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');

$app = JFactory::getApplication();
$document = JFactory::getDocument();

// Access Administration Categories check.
if (JFactory::getUser()->authorise('icagenda.access.customfields', 'com_icagenda'))
{
	$bootstrapType		= '1';
	$PanelOne_Tag		= 'customfield';
	$PanelOne_Title		= JText::_('COM_ICAGENDA_CUSTOMFIELD_PANEL_TITLE', true);
	$PanelTwo_Tag		= 'desc';
	$PanelTwo_Title		= JText::_('COM_ICAGENDA_LEGEND_DESC', true);
	$PublishingTag		= 'publishing';
	$PublishingTitle	= JText::_('JGLOBAL_FIELDSET_PUBLISHING', true);

	// Joomla 2.5
	if (version_compare(JVERSION, '3.0', 'lt'))
	{
		jimport( 'joomla.html.html.tabs' );

		$iCmapDisplay		= '3';

		$icPanFirst			= JText::_('COM_ICAGENDA_CUSTOMFIELD_PANEL_TITLE');
		$icPanDesc			= JText::_('COM_ICAGENDA_LEGEND_DESC');
		$icPanPublishing	= JText::_('JGLOBAL_FIELDSET_PUBLISHING');
		$startPane			= 'tabs.start';
		$addPanel			= 'tabs.panel';
		$endPanel			= 'tabs.end';
		$endPane			= 'tabs.end';
		$PanelOne_Tag1		= $PanelOne_Tag;
		$PanelOne_Tag2		= $PanelOne_Title;
		$PanelTwo_Tag1		= $PanelTwo_Tag;
		$PanelTwo_Tag2		= $PanelTwo_Title;
		$PublishingTag1		= $PublishingTag;
		$PublishingTag2		= $PublishingTitle;
	}

	// Joomla 3
	else
	{
		JHtml::_('formbehavior.chosen', 'select');
		jimport('joomla.html.html.bootstrap');

		$icPanFirst			= 'icTab';
		$icPanDesc			= 'icTab';
		$icPanPublishing	= 'icTab';

		if ($bootstrapType == '1')
		{
			$iCmapDisplay	= '1';
			$startPane		= 'bootstrap.startTabSet';
			$addPanel		= 'bootstrap.addTab';
			$endPanel		= 'bootstrap.endTab';
			$endPane		= 'bootstrap.endTabSet';
			$PanelOne_Tag1	= $PanelOne_Tag;
			$PanelOne_Tag2	= $PanelOne_Title;
			$PanelTwo_Tag1	= $PanelTwo_Tag;
			$PanelTwo_Tag2	= $PanelTwo_Title;
			$PublishingTag1	= $PublishingTag;
			$PublishingTag2	= $PublishingTitle;
		}
		elseif ($bootstrapType == '2')
		{
			$iCmapDisplay	= '2';
			$startPane		= 'bootstrap.startAccordion';
			$addPanel		= 'bootstrap.addSlide';
			$endPanel		= 'bootstrap.endSlide';
			$endPane		= 'bootstrap.endAccordion';
			$PanelOne_Tag1	= $PanelOne_Title;
			$PanelOne_Tag2	= $PanelOne_Tag;
			$PanelTwo_Tag1	= $PanelTwo_Title;
			$PanelTwo_Tag2	= $PanelTwo_Tag;
			$PublishingTag1	= $PublishingTitle;
			$PublishingTag2	= $PublishingTag;
		}
	}
	?>

<script type="text/javascript">
	Joomla.submitbutton = function(task)
	{
		if (task == 'customfield.cancel' || document.formvalidator.isValid(document.id('customfield-form'))) {
			Joomla.submitform(task, document.getElementById('customfield-form'));
		}
		else {
			alert('<?php echo $this->escape(JText::_('JGLOBAL_VALIDATION_FORM_FAILED'));?>');
		}
	}
</script>

<form action="<?php echo JRoute::_('index.php?option=com_icagenda&layout=edit&id='.(int) $this->item->id); ?>" method="post" name="adminForm" id="customfield-form" class="form-validate">

	<div class="container">

		<!-- iCheader top bar -->
		<!--div class="iCheader-top">
			<a href="#">
				<strong>&laquo; Previous </strong>event
			</a>
			<span class="right">
				<a href="#">
					<strong>Next</strong> event <strong>&raquo;</strong>
				</a>
			</span>
			<div class="clr"></div>
		</div-->
		<!--/ iCheader top bar -->


		<!-- iCagenda Header -->
		<header>
			<h1>
				<?php echo empty($this->item->id) ? JText::_('COM_ICAGENDA_CUSTOMFIELD_LEGEND_NEW') : JText::sprintf('COM_ICAGENDA_CUSTOMFIELD_LEGEND_EDIT', $this->item->id); ?>&nbsp;<span>iCagenda</span>
			</h1>
			<h2>
				<?php echo JText::_('COM_ICAGENDA_COMPONENT_DESC'); ?>
				<!--nav class="iCheader-videos">
					<span style="font-variant:small-caps">Tutorial Videos</span>
					<a href="#">Add a event</a>
					<a href="#">Video 2</a>
					<a href="#">Video 3</a>
				</nav-->
			</h2>
		</header>

		<div>&nbsp;</div>



		<!-- Begin Content -->
		<div class="row-fluid">
			<div class="span10 form-horizontal">

				<!-- Open Panel Set -->
				<?php echo JHtml::_($startPane, 'icTab', array('active' => 'customfield')); ?>

					<!-- Panel Event -->
					<?php echo JHtml::_($addPanel, $icPanFirst, $PanelOne_Tag1, $PanelOne_Tag2); ?>

						<div class="icpanel iCleft">
							<h1><?php echo empty($this->item->id) ? JText::_('COM_ICAGENDA_CUSTOMFIELD_LEGEND_NEW') : JText::sprintf('COM_ICAGENDA_CUSTOMFIELD_LEGEND_EDIT', $this->item->id); ?></h1>
							<hr>
							<div class="row-fluid">
								<div class="span6 iCleft">
									<div class="control-group">
										<div class="control-label">
											<?php echo $this->form->getLabel('title'); ?>
										</div>
										<div class="controls">
											<?php echo $this->form->getInput('title'); ?>
										</div>
									</div>
									<div class="control-group">
										<div class="control-label">
											<?php echo $this->form->getLabel('slug'); ?>
										</div>
										<div class="controls">
											<?php echo $this->form->getInput('slug'); ?>
										</div>
									</div>
									<div class="control-group">
										<div class="control-label">
											<?php echo $this->form->getLabel('parent_form'); ?>
										</div>
										<div class="controls">
											<?php echo $this->form->getInput('parent_form'); ?>
										</div>
									</div>
								</div>
								<div class="span6 iCleft">
									<div class="control-group">
										<div class="control-label">
											<?php echo $this->form->getLabel('type'); ?>
										</div>
										<div class="controls">
											<?php echo $this->form->getInput('type'); ?>
										</div>
									</div>
									<div class="control-group">
										<div class="control-label">
											<?php echo $this->form->getLabel('options'); ?>
										</div>
										<div class="controls">
											<?php echo $this->form->getInput('options'); ?>
										</div>
									</div>
									<div class="control-group">
										<div class="control-label">
											<?php echo $this->form->getLabel('required'); ?>
										</div>
										<div class="controls">
											<?php echo $this->form->getInput('required'); ?>
										</div>
									</div>
								</div>
							</div>
							<hr>
						</div>


					<?php
					if(version_compare(JVERSION, '3.0', 'ge')) {
						echo JHtml::_($endPanel);
					}
					?>


					<!-- Panel Description -->
					<?php echo JHtml::_($addPanel, $icPanDesc, $PanelTwo_Tag1, $PanelTwo_Tag2); ?>

						<div class="icpanel iCleft">
							<h1><?php echo JText::_('COM_ICAGENDA_LEGEND_DESC'); ?></h1>
							<hr>
							<div class="row-fluid">
								<div class="span12 iCleft">
									<h3><?php echo JText::_('COM_ICAGENDA_CUSTOMFIELD_DESCRIPTION_DESC'); ?></h3>
									<?php echo $this->form->getInput('description'); ?>
								</div>
							</div>
						</div>


				<?php
				if(version_compare(JVERSION, '3.0', 'ge')) {
					echo JHtml::_($endPanel);
				}
				?>

				<?php
				echo JHtml::_($addPanel, $icPanPublishing, $PublishingTag1, $PublishingTag2);
				?>
				<div class="icpanel iCleft">
					<h1><?php echo JText::_('JGLOBAL_FIELDSET_PUBLISHING'); ?></h1>
					<hr>
					<div class="row-fluid">
						<div class="span6 iCleft">
							<div class="control-group">
								<div class="control-label">
									<?php echo $this->form->getLabel('id'); ?>
								</div>
								<div class="controls">
									<?php echo $this->form->getInput('id'); ?>
								</div>
							</div>
							<div class="control-group">
								<div class="control-label">
									<?php echo $this->form->getLabel('alias'); ?>
								</div>
								<div class="controls">
									<?php echo $this->form->getInput('alias'); ?>
								</div>
							</div>
							<div class="control-group">
								<?php echo $this->form->getLabel('created'); ?>
								<div class="controls">
									<?php echo $this->form->getInput('created'); ?>
								</div>
							</div>
							<div class="control-group">
								<?php echo $this->form->getLabel('created_by'); ?>
								<div class="controls">
									<?php echo $this->form->getInput('created_by'); ?>
								</div>
							</div>
							<div class="control-group">
								<?php echo $this->form->getLabel('created_by_alias'); ?>
								<div class="controls">
									<?php echo $this->form->getInput('created_by_alias'); ?>
								</div>
							</div>
							<div class="control-group">
								<?php echo $this->form->getLabel('modified'); ?>
								<div class="controls">
									<?php echo $this->form->getInput('modified'); ?>
								</div>
							</div>
							<div class="control-group">
								<?php echo $this->form->getLabel('modified_by'); ?>
								<div class="controls">
									<?php echo $this->form->getInput('modified_by'); ?>
								</div>
							</div>
							<div class="control-group">
								<div class="control-label">
									<?php echo $this->form->getLabel('checked_out'); ?>
								</div>
								<div class="controls">
									<?php echo $this->form->getInput('checked_out'); ?>
								</div>
							</div>
							<div class="control-group">
								<div class="control-label">
									<?php echo $this->form->getLabel('checked_out_time'); ?>
								</div>
								<div class="controls">
									<?php echo $this->form->getInput('checked_out_time'); ?>
								</div>
							</div>
						</div>
					</div>
				</div>


				<?php echo JHtml::_($endPanel); ?>

				<?php echo JHtml::_($endPane, 'icTab'); ?>
			</div>

		<!-- Begin Sidebar -->
			<div class="span2 iCleft">
						<h4><?php echo JText::_('COM_ICAGENDA_TITLE_SIDEBAR_DETAILS'); ?></h4>
						<hr>
							<div class="control-group">
								<div class="control-label">
									<?php echo $this->form->getLabel('state'); ?>
								</div>
								<div class="controls">
									<?php echo $this->form->getInput('state'); ?>
								</div>
							</div>
							<!--div class="control-group">
								<?php echo $this->form->getLabel('access'); ?>
								<div class="controls">
									<?php echo $this->form->getInput('access'); ?>
								</div>
							</div-->
							<!--div class="control-group">
								<?php echo $this->form->getLabel('language'); ?>
								<div class="controls">
									<?php echo $this->form->getInput('language'); ?>
								</div>
							</div-->
							<input type="hidden" name="language" value="*" />
			</div>
		<!-- End Sidebar -->
		</div>

		<div class="clr"></div>

	</div>




	</div>


	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>
	<div class="clr"></div>
</form>

	<?php
	// Joomla 2.5
	if (version_compare(JVERSION, '3.0', 'lt'))
	{
		JHtml::stylesheet('com_icagenda/template.j25.css', false, true);
		JHtml::stylesheet('com_icagenda/icagenda-back.j25.css', false, true);

		JHtml::_('behavior.framework');

		// load jQuery, if not loaded before
		$scripts = array_keys($document->_scripts);
		$scriptFound = false;
		$scriptuiFound = false;

		for ($i = 0; $i < count($scripts); $i++)
		{
			if (stripos($scripts[$i], 'jquery.min.js') !== false)
			{
				$scriptFound = true;
			}
			if (stripos($scripts[$i], 'jquery.js') !== false)
			{
				$scriptFound = true;
			}
			if (stripos($scripts[$i], 'jquery-ui.min.js') !== false)
			{
				$scriptuiFound = true;
			}
		}

		// jQuery Library Loader
		if (!$scriptFound)
		{
			// load jQuery, if not loaded before
			if (!$app->get('jquery'))
			{
				$app->set('jquery', true);
				// add jQuery
				$document->addScript('https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js');
				$document->addScript( JURI::root( true ) . '/media/com_icagenda/js/jquery.noconflict.js' );
			}
		}

		if (!$scriptuiFound)
		{
			$document->addScript('https://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js');
		}

		$document->addScript( JURI::root( true ) . '/media/com_icagenda/js/template.js' );
	}
	else
	{
		JHtml::_('bootstrap.framework');
		JHtml::_('jquery.framework');
	}

}
else
{
	$app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'warning');
	$app->redirect(htmlspecialchars_decode('index.php?option=com_icagenda&view=icagenda'));
}
components/com_icagenda/views/customfield/view.html.php000060400000007307152453623450017437 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-07-02
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

// iCagenda Class control (Joomla 2.5/3.x)
if (!class_exists('iCJView')) {
	if (version_compare(JVERSION,'3.0.0','ge')) {
		class iCJView extends JViewLegacy {};
	} else {
		jimport('joomla.application.component.view');
		class iCJView extends JView {};
	}
}

/**
 * View class Admin - Edit a Custom Field - iCagenda
 */
class iCagendaViewCustomfield extends iCJView
{
	protected $state;
	protected $item;
	protected $form;

	/**
	 * Display the view
	 */
	public function display($tpl = null)
	{
		$this->state	= $this->get('State');
		$this->item		= $this->get('Item');
		$this->form		= $this->get('Form');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			JError::raiseError(500, implode("\n", $errors));
			return false;
		}

		$this->addToolbar();

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 */
	protected function addToolbar()
	{
		JRequest::setVar('hidemainmenu', true);

		$user		= JFactory::getUser();
		$isNew		= ($this->item->id == 0);

        if (isset($this->item->checked_out))
        {
		    $checkedOut	= !($this->item->checked_out == 0 || $this->item->checked_out == $user->get('id'));
        }
        else
        {
            $checkedOut = false;
        }

		$canDo		= iCagendaHelper::getActions();

		// Set Title
		if(version_compare(JVERSION, '3.0', 'lt'))
		{
			JToolBarHelper::title($isNew ? 'iCagenda - ' . JText::_('COM_ICAGENDA_CUSTOMFIELD_LEGEND_NEW') : 'iCagenda - ' . JText::_('COM_ICAGENDA_CUSTOMFIELD_LEGEND_EDIT'), 'category.png');
		}
		else
		{
			JToolBarHelper::title($isNew ? 'iCagenda <span style="font-size:14px;">- ' . JText::_('COM_ICAGENDA_CUSTOMFIELD_LEGEND_NEW') . '</span>'  : 'iCagenda <span style="font-size:14px;">- ' . JText::_('COM_ICAGENDA_CUSTOMFIELD_LEGEND_EDIT') . '</span>' , $isNew ? 'new' : 'pencil-2');
		}

		$icTitle = $isNew ? JText::_('COM_ICAGENDA_CUSTOMFIELD_LEGEND_NEW') : JText::_('COM_ICAGENDA_CUSTOMFIELD_LEGEND_EDIT');

		$document	= JFactory::getDocument();
		$app		= JFactory::getApplication();
		$sitename	= $app->getCfg('sitename');
		$title		= $app->getCfg('sitename') . ' - ' . JText::_('JADMINISTRATION') . ' - iCagenda: ' . $icTitle;
		$document->setTitle($title);

		// If not checked out, can save the item.
		if (!$checkedOut && ($canDo->get('core.edit')||($canDo->get('core.create'))))
		{
			JToolBarHelper::apply('customfield.apply', 'JTOOLBAR_APPLY');
			JToolBarHelper::save('customfield.save', 'JTOOLBAR_SAVE');
		}

		if (!$checkedOut && ($canDo->get('core.create')))
		{
			JToolBarHelper::custom('customfield.save2new', 'save-new.png', 'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false);
		}

		// If an existing item, can save to a copy.
		if (!$isNew && $canDo->get('core.create'))
		{
			JToolBarHelper::custom('customfield.save2copy', 'save-copy.png', 'save-copy_f2.png', 'JTOOLBAR_SAVE_AS_COPY', false);
		}

		if (empty($this->item->id))
		{
			JToolBarHelper::cancel('customfield.cancel', 'JTOOLBAR_CANCEL');
		}
		else
		{
			JToolBarHelper::cancel('customfield.cancel', 'JTOOLBAR_CLOSE');
		}
	}
}
components/com_icagenda/views/customfield/index.html000060400000000032152453623450016772 0ustar00<html><body></body></html>components/com_icagenda/views/registration/view.html.php000060400000007157152453623450017636 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.6 2015-06-10
 * @since       3.3.3
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * View class Admin - Registration Edit - iCagenda
 */
class iCagendaViewRegistration extends JViewLegacy
{
	protected $state;
	protected $item;
	protected $form;

	/**
	 * Display the view
	 */
	public function display($tpl = null)
	{
		// Initialiase variables.
		$this->state	= $this->get('State');
		$this->item		= $this->get('Item');
		$this->form		= $this->get('Form');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			JError::raiseError(500, implode("\n", $errors));
			return false;
		}

		$this->addToolbar();

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 */
	protected function addToolbar()
	{
		JRequest::setVar('hidemainmenu', true);

		$user		= JFactory::getUser();
		$isNew		= ($this->item->id == 0);

        if (isset($this->item->checked_out))
        {
		    $checkedOut	= ! ($this->item->checked_out == 0 || $this->item->checked_out == $user->get('id'));
        }
        else
        {
            $checkedOut = false;
        }

		$canDo		= iCagendaHelper::getActions();

		//JToolBarHelper::title(JText::_('COM_ICAGENDA_TITLE_CATEGORY'), 'category.png');
		// Set Title
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			JToolBarHelper::title($isNew ? 'iCagenda - ' . JText::_('COM_ICAGENDA_LEGEND_NEW_REGISTRATION') : 'iCagenda - ' . JText::_('COM_ICAGENDA_LEGEND_EDIT_REGISTRATION'), 'registration.png');
		}
		else
		{
			JToolBarHelper::title($isNew ? 'iCagenda <span style="font-size:14px;">- ' . JText::_('COM_ICAGENDA_LEGEND_NEW_REGISTRATION') . '</span>'  : 'iCagenda <span style="font-size:14px;">- ' . JText::_('COM_ICAGENDA_LEGEND_EDIT_REGISTRATION') . '</span>' , $isNew ? 'new' : 'pencil-2');
		}

		$icTitle	= $isNew ? JText::_('COM_ICAGENDA_LEGEND_NEW_REGISTRATION') : JText::_('COM_ICAGENDA_LEGEND_EDIT_REGISTRATION');

		$document	= JFactory::getDocument();
		$app		= JFactory::getApplication();
		$sitename	= $app->getCfg('sitename');
		$title		= $app->getCfg('sitename') . ' - ' . JText::_('JADMINISTRATION') . ' - iCagenda: ' . $icTitle;

		$document->setTitle($title);

		// If not checked out, can save the item.
		if ( ! $checkedOut && ($canDo->get('core.edit') || $canDo->get('core.edit.own') || $canDo->get('core.create')))
		{
			JToolBarHelper::apply('registration.apply', 'JTOOLBAR_APPLY');
			JToolBarHelper::save('registration.save', 'JTOOLBAR_SAVE');
		}

		if ( ! $checkedOut && ($canDo->get('core.create')))
		{
			JToolBarHelper::custom('registration.save2new', 'save-new.png', 'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false);
		}

		// If an existing item, can save to a copy.
		if ( ! $isNew && $canDo->get('core.create'))
		{
			JToolBarHelper::custom('registration.save2copy', 'save-copy.png', 'save-copy_f2.png', 'JTOOLBAR_SAVE_AS_COPY', false);
		}

		if (empty($this->item->id))
		{
			JToolBarHelper::cancel('registration.cancel', 'JTOOLBAR_CANCEL');
		}
		else
		{
			JToolBarHelper::cancel('registration.cancel', 'JTOOLBAR_CLOSE');
		}
	}
}
components/com_icagenda/views/registration/index.html000060400000000032152453623450017166 0ustar00<html><body></body></html>components/com_icagenda/views/registration/tmpl/index.html000060400000000032152453623450020142 0ustar00<html><body></body></html>components/com_icagenda/views/registration/tmpl/edit.php000060400000031060152453623450017610 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.9 2015-07-31
 * @since       3.3.3
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

JHtml::_('behavior.tooltip');
JHtml::_('behavior.keepalive');
JHtml::_('behavior.formvalidation');

$app = JFactory::getApplication();

// Access Administration Categories check.
if (JFactory::getUser()->authorise('icagenda.access.registrations', 'com_icagenda'))
{
	$document			= JFactory::getDocument();
	$bootstrapType		= '1';
	$RegistrationTag	= 'Registration';
	$RegistrationTitle	= JText::_('COM_ICAGENDA_REGISTRATION_INFORMATION', true);
	$DescTag			= 'desc';
	$DescTitle			= JText::_('COM_ICAGENDA_REGISTRATION_NOTES_DISPLAY_LABEL', true);
	$PublishingTag		= 'publishing';
	$PublishingTitle	= JText::_('JGLOBAL_FIELDSET_PUBLISHING', true);

	// Joomla 2.5
	if (version_compare(JVERSION, '3.0', 'lt'))
	{
		jimport( 'joomla.html.html.tabs' );

		$iCmapDisplay		= '3';

		$icPanRegistration	= JText::_('COM_ICAGENDA_TITLE_REGISTRATION');
		$icPanDesc			= JText::_('COM_ICAGENDA_REGISTRATION_NOTES_DISPLAY_LABEL');
		$icPanPublishing	= JText::_('JGLOBAL_FIELDSET_PUBLISHING');
		$startPane			= 'tabs.start';
		$addPanel			= 'tabs.panel';
		$endPanel			= 'tabs.end';
		$endPane			= 'tabs.end';
		$RegistrationTag1	= $RegistrationTag;
		$RegistrationTag2	= $RegistrationTitle;
		$DescTag1			= $DescTag;
		$DescTag2			= $DescTitle;
		$PublishingTag1		= $PublishingTag;
		$PublishingTag2		= $PublishingTitle;
	}

	// Joomla 3
	else
	{
		JHtml::_('formbehavior.chosen', 'select');
		jimport('joomla.html.html.bootstrap');

		$icPanRegistration	= 'icTab';
		$icPanDesc			= 'icTab';
		$icPanPublishing	= 'icTab';

		if ($bootstrapType == '1')
		{
			$iCmapDisplay		= '1';
			$startPane			= 'bootstrap.startTabSet';
			$addPanel			= 'bootstrap.addTab';
			$endPanel			= 'bootstrap.endTab';
			$endPane			= 'bootstrap.endTabSet';
			$RegistrationTag1	= $RegistrationTag;
			$RegistrationTag2	= $RegistrationTitle;
			$DescTag1			= $DescTag;
			$DescTag2			= $DescTitle;
			$PublishingTag1		= $PublishingTag;
			$PublishingTag2		= $PublishingTitle;
		}
		if ($bootstrapType == '2')
		{
			$iCmapDisplay		= '2';
			$startPane			= 'bootstrap.startAccordion';
			$addPanel			= 'bootstrap.addSlide';
			$endPanel			= 'bootstrap.endSlide';
			$endPane			= 'bootstrap.endAccordion';
			$RegistrationTag1	= $RegistrationTitle;
			$RegistrationTag2	= $RegistrationTag;
			$DescTag1			= $DescTitle;
			$DescTag2			= $DescTag;
			$PublishingTag1		= $PublishingTitle;
			$PublishingTag2		= $PublishingTag;
		}
	}
	?>

	<?php // ERROR ALERT ?>
	<div id="form_errors" class="alert alert-danger" style="display:none">
		<strong><?php echo JText::_('JGLOBAL_VALIDATION_FORM_FAILED'); ?></strong>
		<div id="message_error">
		</div>
	</div>

	<form action="<?php echo JRoute::_('index.php?option=com_icagenda&layout=edit&id='.(int) $this->item->id); ?>" method="post" name="adminForm" id="registration-form" class="form-validate" enctype="multipart/form-data">
		<div class="container">

			<!-- iCagenda Header -->
			<header>
				<h1>
					<?php echo empty($this->item->id) ? JText::_('COM_ICAGENDA_LEGEND_NEW_REGISTRATION') : JText::sprintf('COM_ICAGENDA_LEGEND_EDIT_REGISTRATION', $this->item->id); ?>&nbsp;<span>iCagenda</span>
				</h1>
				<h2>
					<?php echo JText::_('COM_ICAGENDA_COMPONENT_DESC'); ?>
				</h2>
			</header>

			<div>&nbsp;</div>

			<!-- Begin Content -->
			<div class="row-fluid">
				<div class="span10 form-horizontal">

					<!-- Open Panel Set -->
					<?php echo JHtml::_($startPane, 'icTab', array('active' => 'Registration')); ?>

						<!-- Panel Event -->
						<?php echo JHtml::_($addPanel, $icPanRegistration, $RegistrationTag1, $RegistrationTag2); ?>

							<div class="icpanel iCleft">
								<h1>
									<?php echo empty($this->item->id) ? JText::_('COM_ICAGENDA_LEGEND_NEW_REGISTRATION') : JText::sprintf('COM_ICAGENDA_LEGEND_EDIT_REGISTRATION', $this->item->id); ?>
								</h1>
								<hr>
								<div class="row-fluid">
									<div class="span6 iCleft">
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('name'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('name'); ?>
											</div>
										</div>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('email'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('email'); ?>
											</div>
										</div>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('phone'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('phone'); ?>
											</div>
										</div>
										<h3><?php echo JText::_('COM_ICAGENDA_CUSTOMFIELDS'); ?></h3>
										<?php
										// Load Custom fields - Registration form (1)
										echo icagendaCustomfields::loader(1);
										?>
									</div>
									<div class="span6 iCleft">
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('eventid'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('eventid'); ?>
											</div>
										</div>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('date'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('date'); ?>
											</div>
										</div>
										<?php //if ($this->item->period) : ?>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('period'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('period'); ?>
											</div>
										</div>
										<?php //endif; ?>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('people'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('people'); ?>
											</div>
										</div>
									</div>
								</div>
							</div>


						<?php
						if(version_compare(JVERSION, '3.0', 'ge')) {
							echo JHtml::_($endPanel);
						}
						?>


						<!-- Panel Description -->
						<?php echo JHtml::_($addPanel, $icPanDesc, $DescTag1, $DescTag2); ?>

							<div class="icpanel iCleft">
								<h1><?php echo JText::_('COM_ICAGENDA_REGISTRATION_NOTES_DISPLAY_LABEL'); ?></h1>
								<hr>
								<div class="row-fluid">
									<div class="span12 iCleft">
										<!--h3><?php echo JText::_('COM_ICAGENDA_FORM_DESC_REGISTRATION_DESC'); ?></h3-->
										<?php echo $this->form->getInput('notes'); ?>
									</div>
								</div>
							</div>


						<?php
						if(version_compare(JVERSION, '3.0', 'ge')) {
							echo JHtml::_($endPanel);
						}
						?>

						<?php
						echo JHtml::_($addPanel, $icPanPublishing, $PublishingTag1, $PublishingTag2);
						?>
							<div class="icpanel iCleft">
								<h1><?php echo JText::_('JGLOBAL_FIELDSET_PUBLISHING'); ?></h1>
								<hr>
								<div class="row-fluid">
									<div class="span6 iCleft">
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('id'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('id'); ?>
											</div>
										</div>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('userid'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('userid'); ?>
											</div>
										</div>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('created'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('created'); ?>
											</div>
										</div>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('created_by'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('created_by'); ?>
											</div>
										</div>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('modified'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('modified'); ?>
											</div>
										</div>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('modified_by'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('modified_by'); ?>
											</div>
										</div>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('checked_out'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('checked_out'); ?>
											</div>
										</div>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('checked_out_time'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('checked_out_time'); ?>
											</div>
										</div>
									</div>
								</div>
							</div>

						<?php echo JHtml::_($endPanel); ?>

					<?php echo JHtml::_($endPane, 'icTab'); ?>
				</div>

				<!-- Begin Sidebar -->
				<div class="span2 iCleft">
					<h4><?php echo JText::_('COM_ICAGENDA_TITLE_SIDEBAR_DETAILS'); ?></h4>
					<hr>
					<div class="control-group">
						<div class="control-label">
							<?php echo $this->form->getLabel('state'); ?>
						</div>
						<div class="controls">
							<?php echo $this->form->getInput('state'); ?>
						</div>
					</div>
				</div>
				<!-- End Sidebar -->

			</div>
			<div class="clr"></div>
		</div>

		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</form>

	<?php
	// Script validation for Registration form (1)
	$iCheckForm = icagendaForm::submit(1);
	$document->addScriptDeclaration($iCheckForm);

	// Joomla 2.5
	if (version_compare(JVERSION, '3.0', 'lt'))
	{
		JHtml::stylesheet('com_icagenda/template.j25.css', false, true);
		JHtml::stylesheet('com_icagenda/icagenda-back.j25.css', false, true);

		// load jQuery, if not loaded before (NEW VERSION IN 1.2.6)
		$scripts = array_keys($document->_scripts);
		$scriptFound = false;
		$scriptuiFound = false;
		$mapsgooglescriptFound = false;
		for ($i = 0; $i < count($scripts); $i++)
		{
			if (stripos($scripts[$i], 'jquery.min.js') !== false)
			{
				$scriptFound = true;
			}
			// load jQuery, if not loaded before as jquery - added in 1.2.7
			if (stripos($scripts[$i], 'jquery.js') !== false)
			{
				$scriptFound = true;
			}
			if (stripos($scripts[$i], 'jquery-ui.min.js') !== false)
			{
				$scriptuiFound = true;
			}
			if (stripos($scripts[$i], 'maps.google') !== false)
			{
				$mapsgooglescriptFound = true;
			}
		}

		// jQuery Library Loader
		if (!$scriptFound)
		{
			// load jQuery, if not loaded before
			if (!JFactory::getApplication()->get('jquery'))
			{
				JFactory::getApplication()->set('jquery', true);
				// add jQuery
				$document->addScript('https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js');
				$document->addScript( JURI::root( true ) . '/media/com_icagenda/js/jquery.noconflict.js' );
			}
		}

		if (!$scriptuiFound)
		{
			$document->addScript('https://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js');
		}

		$document->addScript( JURI::root( true ) . '/media/com_icagenda/js/template.js' );
	}
}
else
{
	$app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'warning');
	$app->redirect(htmlspecialchars_decode('index.php?option=com_icagenda&view=icagenda'));
}
components/com_icagenda/views/info/index.html000060400000000032152453623450015407 0ustar00<html><body></body></html>components/com_icagenda/views/info/view.html.php000060400000004613152453623450016051 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.6 2015-06-23
 * @since       1.2.6
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

// Access check.
if (JFactory::getUser()->authorise('core.admin', 'com_icagenda'))
{
	JToolBarHelper::preferences('com_icagenda');
}

/**
 * View class for a list of iCagenda.
 */
class iCagendaViewinfo extends JViewLegacy
{
	/**
	 * Display the view
	 */
	public function display($tpl = null)
	{
		// Joomla 2.5
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			JHtml::stylesheet('com_icagenda/template.j25.css', false, true);

			JHtml::_('behavior.tooltip');
			jimport( 'joomla.filesystem.path' );
		}

		JHtml::_('behavior.modal');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			JError::raiseError(500, implode("\n", $errors));

			return false;
		}

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();

			if (version_compare(JVERSION, '3.0', 'ge'))
			{
				$this->sidebar = JHtmlSidebar::render();
			}
		}

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @since	1.6
	 */
	protected function addToolbar()
	{
		require_once JPATH_COMPONENT . '/helpers/icagenda.php';

		$state		= $this->get('State');

		// Set Title
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			JToolBarHelper::title(JText::_('COM_ICAGENDA_TITLE_ICAGENDA_IMAGE'));
		}
		else
		{
			JToolBarHelper::title('iCagenda <span style="font-size:14px;">- ' . JText::_('COM_ICAGENDA_INFO') . '</span>', 'info-2');
		}

		$icTitle	= JText::_('COM_ICAGENDA_INFO');

		$document	= JFactory::getDocument();
		$app		= JFactory::getApplication();
		$sitename	= $app->getCfg('sitename');
		$title		= $app->getCfg('sitename') . ' - ' . JText::_('JADMINISTRATION') . ' - iCagenda: ' . $icTitle;
		$document->setTitle($title);
	}
}
components/com_icagenda/views/info/tmpl/index.html000060400000000032152453623450016363 0ustar00<html><body></body></html>components/com_icagenda/views/info/tmpl/default.php000060400000032501152453623450016531 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.6 2015-06-23
 * @since       2.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

$user		= JFactory::getUser();
$userId		= $user->get('id');

$db			= JFactory::getDbo();
$query		= $db->getQuery(true);
$query->select('version AS icv, releasedate AS icd')->from('#__icagenda')->where('id = 3');
$db->setQuery($query);
$version	= $db->loadObject()->icv;
$date		= $db->loadObject()->icd;
?>

<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
		<!-- Begin Content -->
		<div class="row-fluid">
			<div class="span12">
				<div class="row-fluid">
					<div class="span6">
						<div class="icpanel" style="background-color:#FFFFFF; border: 1px solid #D4D4D4; padding:10px; border-radius: 10px;">
							<h2 style="font-size:2em; color: Gray; text-align: center">
								<?php echo JText::_('COM_ICAGENDA_PANEL_CONTRIBUTORS');?>
							</h2>
							<div>&nbsp;</div>
							<p style="margin:10px 30px; text-align:center; color: grey;">
								<i>&ldquo; <?php echo JText::_('COM_ICAGENDA_PANEL_THANKS_TEXT'); ?> &rdquo;</i>
							</p>
							<p class="small" style="margin:20px 0px; text-align:justify; color: DimGray;">
								Ervin Bizjak, Bong, Giuseppe Bosco, Carosouza, Davor Čolić, doorknob, Reinhard Ekker, elirezo, jedi, jowe3, JonxDuo, KISweb, kredo9, macedorl, Kai Metsävainio, mussool, NicoDeluxe, Rickard Norberg, Andrzej Opejda, Régis, Tom-Henning, Rikard Tømte Reitan, Vlad Shuh, Leland Vandervort, Wilfred van Dijk, Roland van Wanrooy, David White ...
							</p>
							<h3><?php echo JText::_('COM_ICAGENDA_PANEL_TRANSLATION');?></h3>
							<div style="margin-left: 20px; padding:0px; color: DimGray;">
	<img src='../media/mod_languages/images/ar.gif' alt="ar" class='iCflag' /> &nbsp;<b>Arabic (Unitag) :</b> haneen2013, fkinanah <br />
	<img src='../media/mod_languages/images/eu_es.gif' alt="eu_es" class='iCflag' /> &nbsp;<b>Basque (Spain) :</b> Bizkaitarra <br />
	<img src='../media/mod_languages/images/bg.gif' alt="bg-BG" class='iCflag' /> &nbsp;<b>Bulgarian (Bulgaria) :</b> bimbongr <br />
	<img src='../media/mod_languages/images/ca.gif' alt="ca" class='iCflag' /> &nbsp;<b>Catalan (Spain) :</b> Mussool, Figuerolero, riquib <br />
	<img src='../media/mod_languages/images/zh.gif' alt="zh-CN" class='iCflag' /> &nbsp;<b>Chinese (China) :</b> Foxyman <br />
	<img src='../media/mod_languages/images/tw.gif' alt="zh-TW" class='iCflag' /> &nbsp;<b>Chinese (Taiwan) :</b> jedi, hkce, rowdytang <br />
	<img src='../media/mod_languages/images/hr.gif' alt="hr" class='iCflag' /> &nbsp;<b>Croatian (Croatia) :</b> Davor Čolić, komir <br />
	<img src='../media/mod_languages/images/cz.gif' alt="cz" class='iCflag' /> &nbsp;<b>Czech (Czech Republic) :</b> Bong <br />
	<img src='../media/mod_languages/images/dk.gif' alt="dk" class='iCflag' /> &nbsp;<b>Danish (Denmark) :</b> olewolf.dk, hvitnov, torbenspetersen, poulfrom, AhmadHamid <br />
	<img src='../media/mod_languages/images/nl.gif' alt="nl-NL" class='iCflag' /> &nbsp;<b>Dutch (Netherlands) :</b> Molenwal1, AnneM, Mario Guagliardo, wfvdijk, Walldorff <br />
	<img src='../media/mod_languages/images/en.gif' alt="en-GB" class='iCflag' /> &nbsp;<b>English (United Kingdom) :</b> Lyr!C <br />
	<img src='../media/mod_languages/images/us.gif' alt="en-US" class='iCflag' /> &nbsp;<b>English (United States) :</b> Lyr!C <br />
	<img src='../media/mod_languages/images/eo.gif' alt="eo" class='iCflag' /> &nbsp;<b>Esperanto :</b> Anita_Dagmarsdotter, Amema <br />
	<img src='../media/mod_languages/images/et.gif' alt="et" class='iCflag' /> &nbsp;<b>Estonian (Estonia) :</b> Eraser, Reijo <br />
	<img src='../media/mod_languages/images/fi.gif' alt="fi-FI" class='iCflag' /> &nbsp;<b>Finnish (Finland) :</b> Kai Metsävainio <br />
	<img src='../media/mod_languages/images/fr.gif' alt="fr-FR" class='iCflag' /> &nbsp;<b>French (France) :</b> Lyr!C <br />
	<img src='../media/mod_languages/images/de.gif' alt="de-DE" class='iCflag' /> &nbsp;<b>German (Germany) :</b> grisuu, mPino, Wasilis, bmbsbr, chuerner, Proton_11, keraM <br />
	<img src='../media/mod_languages/images/el.gif' alt="el-GR" class='iCflag' /> &nbsp;<b>Greek (Greece) :</b> E.Gkana-D.Kontogeorgis (elinag), rinenweb, kost36, mbini, Wasilis <br />
	<img src='../media/mod_languages/images/hu.gif' alt="hu-HU" class='iCflag' /> &nbsp;<b>Hungarian (Hungary) :</b> Halilaci, magicf, Cerbo, mester93 <br />
	<img src='../media/mod_languages/images/it.gif' alt="it-IT" class='iCflag' /> &nbsp;<b>Italian (Italy) :</b> Giuseppe Bosco (giusebos) <br />
	<img src='../media/mod_languages/images/ja.gif' alt="ja-JP" class='iCflag' /> &nbsp;<b>Japanese (Japan) :</b> nagata, taimai908 <br />
	<img src='../media/mod_languages/images/lv.gif' alt="lv-LV" class='iCflag' /> &nbsp;<b>Latvian (Latvia) :</b> kredo9 <br />
	<img src='../media/mod_languages/images/lt.gif' alt="lt-LT" class='iCflag' /> &nbsp;<b>Lithuanian (Lithuania) :</b> ahxoohx <br />
	<img src='../media/mod_languages/images/icon-16-language.png' alt="lb-LU" class='iCflag' /> &nbsp;<b>Luxembourgish (Luxembourg) :</b> Superjhemp <br />
	<img src='../media/mod_languages/images/no.gif' alt="nb-NO" class='iCflag' /> &nbsp;<b>Norwegian Bokmål (Norway) :</b> Rikard Tømte Reitan (Rikrei) <br />
	<img src='../media/mod_languages/images/fa_ir.gif' alt="fa-IR" class='iCflag' /> &nbsp;<b>Persian (Iran) :</b> Arash Rezvani (al3n.nvy) <br />
	<img src='../media/mod_languages/images/pl.gif' alt="pl-PL" class='iCflag' /> &nbsp;<b>Polish (Poland) :</b> mbsrz, KISweb, gienio22, traktor, niewidzialny <br />
	<img src='../media/mod_languages/images/pt_br.gif' alt="pt-BR" class='iCflag' /> &nbsp;<b>Portuguese (Brazil) :</b> Carosouza, alxaraujo <br />
	<img src='../media/mod_languages/images/pt.gif' alt="pt-PT" class='iCflag' /> &nbsp;<b>Portuguese (Portugal) :</b> LFGM, macedorl, horus68, helfer <br />
	<img src='../media/mod_languages/images/ro.gif' alt="ro-RO" class='iCflag' /> &nbsp;<b>Romanian (Romania) :</b> hat, mester93 <br />
	<img src='../media/mod_languages/images/ru.gif' alt="ru-RU" class='iCflag' /> &nbsp;<b>Russian (Russia) :</b> nshash, MSV <br />
	<img src='../media/mod_languages/images/sr.gif' alt="sr-YU" class='iCflag' /> &nbsp;<b>Serbian (latin) :</b> Nenad Mihajlović <br />
	<img src='../media/mod_languages/images/sk.gif' alt="sk-SK" class='iCflag' /> &nbsp;<b>Slovak (Slovakia) :</b> ischindl, J.Ribarszki <br />
	<img src='../media/mod_languages/images/sl.gif' alt="sl-SI" class='iCflag' /> &nbsp;<b>Slovenian (Slovenia) :</b> erbi (Ervin Bizjak) <br />
	<img src='../media/mod_languages/images/es.gif' alt="es-ES" class='iCflag' /> &nbsp;<b>Spanish (Spain) :</b> elerizo, mPino, albertodg, adolf64, Goncatín, virem1, leoxordonez, claugardia, sterroso <br />
	<img src='../media/mod_languages/images/sv.gif' alt="sv-SE" class='iCflag' /> &nbsp;<b>Swedish (Sweden) :</b> Rickard Norberg (metska), Amema, kricke <br />
	<img src='../media/mod_languages/images/th.gif' alt="th-TH" class='iCflag' /> &nbsp;<b>Thai (Thailand) :</b> rattanachai.ha <br />
	<img src='../media/mod_languages/images/tr.gif' alt="tr-TR" class='iCflag' /> &nbsp;<b>Turkish (Turkey) :</b> harikalarkutusu, farukzeynep, kemalokmen <br />
	<img src='../media/mod_languages/images/uk.gif' alt="uk" class='iCflag' /> &nbsp;<b>Ukrainian (Ukraine) :</b> Vlad Shuh (slv54) <br />
							</div>
							<br />
						</div>
					</div>
					<div class="span1">
					</div>
					<div class="span5">
						<div style="float:right; padding:0px 0px 0px 20px;">
							<img src="../media/com_icagenda/images/logo_icagenda.png" alt="logo_icagenda" />
						</div>
						<div>
							<h2 style="font-size:2em;">
								<b style="color:#cc0000;">iC</b><b style="color: #666666;">agenda<sup style="font-size:0.6em">&trade;</sup></b>&nbsp;<b style="font-size:0.5em;"></b>
							</h2>
						</div>
						<div>
							<h4>
								<?php echo JText::_('COM_ICAGENDA_INFORMATION') ?>
							</h4>
						</div>
						<div>&nbsp;</div>
						<div>&nbsp;</div>
						<div>&nbsp;</div>
						<div>&nbsp;</div>
						<div>&nbsp;</div>
						<div>&nbsp;</div>

						<h3><?php echo JText::_('iCagenda Team');?></h3>
						<p>
							<strong><?php echo JText::_('COM_ICAGENDA_PANEL_LEAD_DEVELOPER');?></strong><br />
							Cyril Rezé (Lyr!C) | <a href="http://www.joomlic.com" target="_blank">www.joomlic.com</a>
						</p>
						<p>
							<strong><?php echo JText::_('COM_ICAGENDA_PANEL_TEAM_1');?></strong><br>
							Giuseppe Bosco (giusebos) | <a href="http://www.newideasproject.com/" target="_blank">www.newideasproject.com</a>
						</p>
						<p>
							<strong><?php echo JText::_('COM_ICAGENDA_PANEL_TEAM_CODE_CONTRIBUTORS');?></strong>
							<div class="span12">
							Doorknob :
								<ul>
									<small>
									<li>Features</li>
									<li>Responsive Screen Threshold Widths (media css)</li>
									<li>jQuery.highlightToday.js (module calendar)</li>
									</small>
								</ul>
							</div>
							<div class="span12">
							Tom-Henning (MaW) :
								<ul>
									<small>
									<li>iCalcreator integration (Add to iCal/Outlook)</li>
									</small>
								</ul>
							</div>
						</p>
						<h3><?php echo JText::_('COM_ICAGENDA_VERSION');?></h3>
						<p>
							<?php echo $version ;?>
						</p>
						<h3><?php echo JText::_('COM_ICAGENDA_COPYRIGHT');?></h3>
						<p>
							© 2012 - <?php echo date("Y"); ?> Cyril Rezé / Jooml!C<br/>
							<a href="http://www.joomlic.com" target="_blank">www.Jooml!C.com</a>
						</p>
						<h3><?php echo JText::_('COM_ICAGENDA_LICENSE');?></h3>
						<p>
							<a href="http://www.gnu.org/licenses/gpl.html" target="_blank">GPLv3 or later</a>
						</p>
						<hr>
						<h3><?php echo JText::_('COM_ICAGENDA_LIBRARIES');?></h3>
						<p>
							<strong>Akeeba Live Update (ARS)</strong><br/>
							© Nicholas K. Dionysopoulos | <a href="https://www.akeebabackup.com" target="_blank">www.akeebabackup.com</a><br/>
							<small>Licensed under <a href="http://www.gnu.org/copyleft/lesser.html" target="_blank">GNU LGPLv3</a> or later.</small><br/>
						</p>
						<p>
							<strong>Timepicker jQuery addon</strong><br/>
							© Trent Richardson | <a href="http://trentrichardson.com" target="_blank">trentrichardson.com</a><br/>
							<small>Project licensed under the <a href="http://trentrichardson.com/Impromptu/MIT-LICENSE.txt" target="_blank">MIT</a> or <a href="http://trentrichardson.com/Impromptu/GPL-LICENSE.txt" target="_blank">GPL</a> licenses.</small><br/>
						</p>
						<p>
							<strong>TipTip jQuery plugin</strong><br/>
							© Drew Wilson | <a href="http://www.drewwilson.com" target="_blank">www.drewwilson.com</a><br/>
							<small>Dual licensed under the <a href="http://www.opensource.org/licenses/mit-license.php" target="_blank">MIT</a> and <a href="http://www.gnu.org/licenses/gpl.html" target="_blank">GPL</a> licenses.</small><br/>
						</p>
						<p>
							<strong>Google Maps™</strong><br/>
							© Google Inc. | <a href="https://developers.google.com/maps/terms" target="_blank">Google Maps/Google Earth APIs Terms of Service</a><br/>
							<small>Google™ and Google Maps™ are registered trademarks of Google Inc.</small><br/>
						</p>
						<p>
							<strong>and of course... Joomla!</strong><br/>
							<a href="http://www.joomla.org" target="_blank">www.joomla.org</a><br/>
						</p>

					</div>
				</div>
			</div>
		</div>

		<div class="row-fluid">
			<div class="span12">
				<tbody>
					<table style="border: 0px;">
						<tr>
							<td>
								<a href="http://icagenda.joomlic.com/resources/translations" target="_blank" class="btn">
									<?php echo JText::_('COM_ICAGENDA_PANEL_TRANSLATION_PACKS_DONWLOAD');?>
								</a>
							</td>
							<td>
								<a href='http://www.joomlic.com/forum/icagenda'  target="_blank" class="btn">
									<?php echo JText::_('COM_ICAGENDA_PANEL_HELP_FORUM'); ?>
								</a>
							</td>
						</tr>
					</table>
				</tbody>
			</div>
		</div>
	</div>

	<!-- footer -->
	<div>
		<div class="row-fluid">
			<div class="span12">
				<hr>
				<div class="row-fluid">
					<div class="span9">
						Copyright ©2012-<?php echo date("Y"); ?> joomlic.com -&nbsp;
						<?php echo JText::_('COM_ICAGENDA_PANEL_COPYRIGHT');?>&nbsp;<a href="http://extensions.joomla.org/extensions/calendars-a-events/events/events-management/22013" target="_blank">Joomla! Extensions Directory</a>.
						<br />
						<br />
					</div>
					<div class="span3" style="text-align: right">
						<a href='http://www.joomlic.com' target='_blank'>
							<img src="../media/com_icagenda/images/logo_joomlic.png" alt="JoomliC" border="0"/>
						</a>
						<br />
						<i><b><?php echo JText::_('COM_ICAGENDA_PANEL_SITE_VISIT');?>&nbsp;<a href='http://www.joomlic.com' target='_blank'>www.joomlic.com</a></b></i>
					</div>
				</div>
			</div>
		</div>
	</div>
components/com_icagenda/views/feature/index.html000060400000000037152453623450016114 0ustar00<!DOCTYPE html><title></title>
components/com_icagenda/views/feature/tmpl/index.html000060400000000037152453623450017070 0ustar00<!DOCTYPE html><title></title>
components/com_icagenda/views/feature/tmpl/edit.php000060400000025615152453623450016542 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      doorknob & Cyril Rezé
 * @link        http://www.joomlic.com
 *
 * @version     3.5.6 2015-05-06
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');

$app = JFactory::getApplication();
$document = JFactory::getDocument();

// Access Administration Features check.
if (JFactory::getUser()->authorise('icagenda.access.features', 'com_icagenda'))
{
	$bootstrapType		= '1';
	$PanelOne_Tag		= 'feature';
	$PanelOne_Title		= JText::_('COM_ICAGENDA_TITLE_FEATURE', true);
	$PanelTwo_Tag		= 'desc';
	$PanelTwo_Title		= JText::_('COM_ICAGENDA_LEGEND_DESC', true);
	$PublishingTag		= 'publishing';
	$PublishingTitle	= JText::_('JGLOBAL_FIELDSET_PUBLISHING', true);

	// Joomla 2.5
	if (version_compare(JVERSION, '3.0', 'lt'))
	{
		jimport( 'joomla.html.html.tabs' );

		$iCmapDisplay		= '3';

		$icPanOne			= JText::_('COM_ICAGENDA_TITLE_EVENT');
		$icPanTwo			= JText::_('COM_ICAGENDA_LEGEND_DESC');
		$icPanPublishing	= JText::_('JGLOBAL_FIELDSET_PUBLISHING');
		$startPane			= 'tabs.start';
		$addPanel			= 'tabs.panel';
		$endPanel			= 'tabs.end';
		$endPane			= 'tabs.end';
		$PanelOne_Tag1		= $PanelOne_Tag;
		$PanelOne_Tag2		= $PanelOne_Title;
		$PanelTwo_Tag1		= $PanelTwo_Tag;
		$PanelTwo_Tag2		= $PanelTwo_Title;
		$PublishingTag1		= $PublishingTag;
		$PublishingTag2		= $PublishingTitle;
	}

	// Joomla 3
	else
	{
		JHtml::_('formbehavior.chosen', 'select');
		jimport('joomla.html.html.bootstrap');

		$icPanOne			= 'icTab';
		$icPanTwo			= 'icTab';
		$icPanPublishing	= 'icTab';

		if ($bootstrapType == '1')
		{
			$iCmapDisplay	= '1';
			$startPane		= 'bootstrap.startTabSet';
			$addPanel		= 'bootstrap.addTab';
			$endPanel		= 'bootstrap.endTab';
			$endPane		= 'bootstrap.endTabSet';
			$PanelOne_Tag1	= $PanelOne_Tag;
			$PanelOne_Tag2	= $PanelOne_Title;
			$PanelTwo_Tag1	= $PanelTwo_Tag;
			$PanelTwo_Tag2	= $PanelTwo_Title;
			$PublishingTag1	= $PublishingTag;
			$PublishingTag2	= $PublishingTitle;
		}
		if ($bootstrapType == '2')
		{
			$iCmapDisplay	= '2';
			$startPane		= 'bootstrap.startAccordion';
			$addPanel		= 'bootstrap.addSlide';
			$endPanel		= 'bootstrap.endSlide';
			$endPane		= 'bootstrap.endAccordion';
			$PanelOne_Tag1	= $PanelOne_Title;
			$PanelOne_Tag2	= $PanelOne_Tag;
			$PanelTwo_Tag1	= $PanelTwo_Title;
			$PanelTwo_Tag2	= $PanelTwo_Tag;
			$PublishingTag1	= $PublishingTitle;
			$PublishingTag2	= $PublishingTag;
		}
	}
	?>

	<script type="text/javascript">
		Joomla.submitbutton = function(task)
		{
			if (task == 'feature.cancel' || document.formvalidator.isValid(document.id('feature-form'))) {
				Joomla.submitform(task, document.getElementById('feature-form'));
			}
			else {
				alert('<?php echo $this->escape(JText::_('JGLOBAL_VALIDATION_FORM_FAILED'));?>');
			}
		}
	</script>

	<form action="<?php echo JRoute::_('index.php?option=com_icagenda&layout=edit&id='.(int) $this->item->id); ?>" method="post" name="adminForm" id="feature-form" class="form-validate">
		<div class="container">
			<?php // iCagenda Header ?>
			<header>
				<h1>
					<?php echo empty($this->item->id) ? JText::_('COM_ICAGENDA_LEGEND_NEW_FEATURE') : JText::sprintf('COM_ICAGENDA_LEGEND_EDIT_FEATURE', $this->item->id); ?>&nbsp;<span>iCagenda</span>
				</h1>
				<h2>
					<?php echo JText::_('COM_ICAGENDA_COMPONENT_DESC'); ?>
				</h2>
			</header>
			<div>&nbsp;</div>

			<?php // Begin Content ?>
			<div class="row-fluid">
				<div class="span10 form-horizontal">

					<?php // Open Panel Set ?>
					<?php echo JHtml::_($startPane, 'icTab', array('active' => 'feature')); ?>

						<?php // Panel Feature ?>
						<?php echo JHtml::_($addPanel, $icPanOne, $PanelOne_Tag1, $PanelOne_Tag2); ?>

							<div class="icpanel iCleft">
								<h1>
									<?php echo empty($this->item->id) ? JText::_('COM_ICAGENDA_LEGEND_NEW_FEATURE') : JText::sprintf('COM_ICAGENDA_LEGEND_EDIT_FEATURE', $this->item->id); ?>
								</h1>
								<hr>
								<div class="row-fluid">
									<div class="span12 iCleft">
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('title'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('title'); ?>
											</div>
										</div>
									</div>
								</div>
								<div class="row-fluid">
									<div class="span12 iCleft">
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('icon'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('icon'); ?>
											</div>
										</div>
									</div>
								</div>
								<div class="row-fluid">
									<div class="span12 iCleft">
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('new_icon'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('new_icon'); ?>
											</div>
										</div>
									</div>
								</div>
								<div class="row-fluid">
									<div class="span12 iCleft">
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('icon_alt'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('icon_alt'); ?>
											</div>
										</div>
									</div>
								</div>
								<div class="row-fluid">
									<div class="span12 iCleft">
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('show_filter'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('show_filter'); ?>
											</div>
										</div>
									</div>
								</div>
							</div>

							<?php // End Panel Feature ?>
							<?php if(version_compare(JVERSION, '3.0', 'ge')) echo JHtml::_($endPanel); ?>


							<?php // Panel Description ?>
							<?php //echo JHtml::_($addPanel, $icPanTwo, $PanelTwo_Tag1, $PanelTwo_Tag2); ?>

								<!--div class="icpanel iCleft">
								<h1>
								<?php //echo JText::_('COM_ICAGENDA_FORM_FEATURE_DESCRIPTION_LABEL'); ?>
								</h1>
								<hr>
								<div class="row-fluid">
									<div class="span12 iCleft">
										<h3>
											<?php //echo JText::_('COM_ICAGENDA_FORM_FEATURE_DESCRIPTION_DESC'); ?>
										</h3>
										<?php //echo $this->form->getInput('desc'); ?>
									</div>
								</div>
							</div-->

						<?php // End Panel Description ?>
						<?php //if(version_compare(JVERSION, '3.0', 'ge')) echo JHtml::_($endPanel); ?>


						<?php // Panel Publishing ?>
						<?php echo JHtml::_($addPanel, $icPanPublishing, $PublishingTag1, $PublishingTag2); ?>

							<div class="icpanel iCleft">
								<h1>
									<?php echo JText::_('JGLOBAL_FIELDSET_PUBLISHING'); ?>
								</h1>
								<hr>
								<div class="row-fluid">
									<div class="span6 iCleft">
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('alias'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('alias'); ?>
											</div>
										</div>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('id'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('id'); ?>
											</div>
										</div>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('checked_out'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('checked_out'); ?>
											</div>
										</div>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('checked_out_time'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('checked_out_time'); ?>
											</div>
										</div>
									</div>
								</div>
							</div>

						<?php // End Panel Publishing ?>
						<?php echo JHtml::_($endPanel); ?>

					<?php // End Panel Set ?>
					<?php echo JHtml::_($endPane, 'icTab'); ?>

				</div>


				<?php // Begin Sidebar ?>
				<div class="span2 iCleft">

					<h4>
						<?php echo JText::_('COM_ICAGENDA_TITLE_SIDEBAR_DETAILS'); ?>
					</h4>
					<hr>
					<div class="control-group">
						<div class="control-label">
							<?php echo $this->form->getLabel('state'); ?>
						</div>
						<div class="controls">
							<?php echo $this->form->getInput('state'); ?>
						</div>
					</div>

				<?php // End Sidebar ?>
				</div>

				<div class="clr"></div>
			</div>
		</div>
		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
		<div class="clr"></div>
	</form>

	<?php
	// Joomla 2.5
	if (version_compare(JVERSION, '3.0', 'lt'))
	{
		JHtml::stylesheet('com_icagenda/template.j25.css', false, true);
		JHtml::stylesheet('com_icagenda/icagenda-back.j25.css', false, true);

		JHtml::_('behavior.framework');

		// load jQuery, if not loaded before
		$scripts = array_keys($document->_scripts);
		$scriptFound = false;
		$scriptuiFound = false;

		for ($i = 0; $i < count($scripts); $i++)
		{
			if (stripos($scripts[$i], 'jquery.min.js') !== false)
			{
				$scriptFound = true;
			}
			if (stripos($scripts[$i], 'jquery.js') !== false)
			{
				$scriptFound = true;
			}
			if (stripos($scripts[$i], 'jquery-ui.min.js') !== false)
			{
				$scriptuiFound = true;
			}
		}

		// jQuery Library Loader
		if (!$scriptFound)
		{
			// load jQuery, if not loaded before
			if (!$app->get('jquery'))
			{
				$app->set('jquery', true);
				// add jQuery
				$document->addScript('https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js');
				$document->addScript( JURI::root( true ) . '/media/com_icagenda/js/jquery.noconflict.js' );
			}
		}

		if (!$scriptuiFound)
		{
			$document->addScript('https://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js');
		}

		$document->addScript( JURI::root( true ) . '/media/com_icagenda/js/template.js' );
	}
	else
	{
		JHtml::_('bootstrap.framework');
		JHtml::_('jquery.framework');
	}

	}
else
{
	$app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'warning');
	$app->redirect(htmlspecialchars_decode('index.php?option=com_icagenda&view=icagenda'));
}
components/com_icagenda/views/feature/view.html.php000060400000006523152453623450016553 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      doorknob
 * @link        http://www.joomlic.com
 *
 * @version     3.5.4 2015-04-09
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * View class Admin - Edit a Feature - iCagenda
 */
class iCagendaViewFeature extends JViewLegacy
{
	protected $state;
	protected $item;
	protected $form;

	/**
	 * Display the view
	 */
	public function display($tpl = null)
	{
		$this->state	= $this->get('State');
		$this->item		= $this->get('Item');
		$this->form		= $this->get('Form');


		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			JError::raiseError(500, implode("\n", $errors));
			return false;
		}

		$this->addToolbar();

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 */
	protected function addToolbar()
	{
		JRequest::setVar('hidemainmenu', true);

		$user		= JFactory::getUser();
		$isNew		= ($this->item->id == 0);

		if (isset($this->item->checked_out))
		{
			$checkedOut	= !($this->item->checked_out == 0 || $this->item->checked_out == $user->get('id'));
		}
		else
		{
			$checkedOut = false;
		}

		$canDo		= iCagendaHelper::getActions();

		// Set Title
		if(version_compare(JVERSION, '3.0', 'lt'))
		{
			JToolBarHelper::title($isNew ? 'iCagenda - ' . JText::_('COM_ICAGENDA_LEGEND_NEW_FEATURE') : 'iCagenda - ' . JText::_('COM_ICAGENDA_LEGEND_EDIT_FEATURE'), 'feature.png');
		}
		else
		{
			JToolBarHelper::title($isNew ? 'iCagenda <span style="font-size:14px;">- ' . JText::_('COM_ICAGENDA_LEGEND_NEW_FEATURE') . '</span>'  : 'iCagenda <span style="font-size:14px;">- ' . JText::_('COM_ICAGENDA_LEGEND_EDIT_FEATURE') . '</span>' , $isNew ? 'new' : 'pencil-2');
		}

		$icTitle = $isNew ? JText::_('COM_ICAGENDA_LEGEND_NEW_FEATURE') : JText::_('COM_ICAGENDA_LEGEND_EDIT_FEATURE');

		$document	= JFactory::getDocument();
		$app		= JFactory::getApplication();
		$sitename	= $app->getCfg('sitename');
		$title		= $app->getCfg('sitename') . ' - ' . JText::_('JADMINISTRATION') . ' - iCagenda: ' . $icTitle;
		$document->setTitle($title);

		// If not checked out, can save the item.
		if (!$checkedOut && ($canDo->get('core.edit')||($canDo->get('core.create'))))
		{
			JToolBarHelper::apply('feature.apply', 'JTOOLBAR_APPLY');
			JToolBarHelper::save('feature.save', 'JTOOLBAR_SAVE');
		}

		if (!$checkedOut && ($canDo->get('core.create')))
		{
			JToolBarHelper::custom('feature.save2new', 'save-new.png', 'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false);
		}

		// If an existing item, can save to a copy.
		if (!$isNew && $canDo->get('core.create'))
		{
			JToolBarHelper::custom('feature.save2copy', 'save-copy.png', 'save-copy_f2.png', 'JTOOLBAR_SAVE_AS_COPY', false);
		}

		if (empty($this->item->id))
		{
			JToolBarHelper::cancel('feature.cancel', 'JTOOLBAR_CANCEL');
		}
		else
		{
			JToolBarHelper::cancel('feature.cancel', 'JTOOLBAR_CLOSE');
		}
	}
}
components/com_icagenda/views/features/tmpl/index.html000060400000000037152453623450017253 0ustar00<!DOCTYPE html><title></title>
components/com_icagenda/views/features/tmpl/default.php000060400000036003152453623450017415 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      doorknob
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-07-14
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

$app = JFactory::getApplication();

// Access Administration Features check.
if (JFactory::getUser()->authorise('icagenda.access.features', 'com_icagenda'))
{
	// Check Theme Packs Compatibility
	if (class_exists('icagendaTheme')) icagendaTheme::checkThemePacks();

	$user		= JFactory::getUser();
	$userId		= $user->get('id');
	$listOrder	= $this->escape($this->state->get('list.ordering'));
	$listDirn	= $this->escape($this->state->get('list.direction'));
	$canOrder	= $user->authorise('core.edit.state', 'com_icagenda');
	$saveOrder	= $listOrder == 'a.ordering';

	if(version_compare(JVERSION, '3.0', 'lt'))
	{
		JHtml::_('behavior.tooltip');
		JHtml::_('script','system/multiselect.js',false,true);
	}
	else
	{
		// Include the component HTML helpers.
		JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');
		JHtml::_('bootstrap.tooltip');
		JHtml::_('behavior.multiselect');
		JHtml::_('formbehavior.chosen', 'select');
		JHtml::_('dropdown.init');

		$extension	= $this->escape($this->state->get('filter.extension'));

		$archived	= $this->state->get('filter.published') == 2 ? true : false;
		$trashed	= $this->state->get('filter.published') == -2 ? true : false;

		if ($saveOrder)
		{
			$saveOrderingUrl = 'index.php?option=com_icagenda&task=features.saveOrderAjax&tmpl=component';
			JHtml::_('sortablelist.sortable', 'featuresList', 'adminForm', strtolower($listDirn), $saveOrderingUrl, false, true);
		}

		$sortFields = array();
		?>

		<script type="text/javascript">
		Joomla.orderTable = function()
		{
			table = document.getElementById("sortTable");
			direction = document.getElementById("directionTable");
			order = table.options[table.selectedIndex].value;

			if (order != '<?php echo $listOrder; ?>')
			{
				dirn = 'asc';
			}
			else
			{
				dirn = direction.options[direction.selectedIndex].value;
			}
			Joomla.tableOrdering(order, dirn, '');
		}
		</script>
	<?php
	}

	// Get media path
	$params_media = JComponentHelper::getParams('com_media');
	$image_path = $params_media->get('image_path', 'images');
	?>

	<form action="<?php echo JRoute::_('index.php?option=com_icagenda&view=features'); ?>" method="post" name="adminForm" id="adminForm">
	<?php if (!empty( $this->sidebar)) : ?>
		<div id="j-sidebar-container" class="span2">
			<?php echo $this->sidebar; ?>
		</div>
		<div id="j-main-container" class="span10">
	<?php else : ?>
		<div id="j-main-container">
	<?php endif;?>

		<?php if(version_compare(JVERSION, '3.0', 'lt')) : ?>
			<fieldset id="filter-bar">
				<div class="filter-search fltlft">
					<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
					<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('Search'); ?>" />
					<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
					<button type="button" onclick="document.id('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
				</div>
				<div class="filter-select fltrt">
					<select name="filter_published" class="inputbox" onchange="this.form.submit()">
						<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED');?></option>
						<?php echo JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), "value", "text", $this->state->get('filter.state'), true);?>
					</select>
				</div>
			</fieldset>
			<div class="clr"> </div>

		<?php else : ?>

			<div id="filter-bar" class="btn-toolbar">
				<div class="filter-search btn-group pull-left">
					<label for="filter_search" class="element-invisible"><?php echo JText::_('COM_ICAGENDA_FILTER_SEARCH_FEATURES_DESC'); ?></label>
					<input type="text" name="filter_search" placeholder="<?php echo JText::_('COM_ICAGENDA_FILTER_SEARCH_FEATURES_DESC'); ?>" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_ICAGENDA_FILTER_SEARCH_FEATURES_DESC'); ?>" />
				</div>
				<div class="btn-group pull-left hidden-phone">
					<button class="btn tip hasTooltip" type="submit" title="<?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?>"><i class="icon-search"></i></button>
					<button class="btn tip hasTooltip" type="button" onclick="document.id('filter_search').value='';this.form.submit();" title="<?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?>"><i class="icon-remove"></i></button>
				</div>
				<div class="btn-group pull-right hidden-phone">
					<label for="limit" class="element-invisible"><?php echo JText::_('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC'); ?></label>
					<?php echo $this->pagination->getLimitBox(); ?>
				</div>
			</div>
			<div class="clearfix"> </div>

		<?php endif;?>


		<?php if(version_compare(JVERSION, '3.0', 'lt')) : ?>
			<table class="adminlist">
		<?php else : ?>
			<table class="table table-striped" id="featuresList">
		<?php endif; ?>

				<thead>
					<tr>

					<?php // START Joomla 3.x ?>
					<?php if(version_compare(JVERSION, '3.0', 'ge')) : ?>

						<?php // Ordering HEADER Joomla 3.x ?>
						<th width="1%" class="nowrap center hidden-phone">
							<?php echo JHtml::_('grid.sort', '<i class="icon-menu-2"></i>', 'a.ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING'); ?>
						</th>

					<?php // END Joomla 3.x ?>
					<?php endif; ?>

						<?php // CheckBox HEADER ?>
						<th width="1%" class="hidden-phone">
							<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
						</th>

						<?php // Status HEADER ?>
						<th width="1%" style="min-width:55px" class="nowrap center">
							<?php echo JHtml::_('grid.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
						</th>

						<?php // Title HEADER ?>
						<th>
							<?php echo JHtml::_('grid.sort', 'COM_ICAGENDA_FEATURES_TITLE', 'a.title', $listDirn, $listOrder); ?>
						</th>

						<?php // Icon HEADER ?>
						<th width="30%" class="nowrap">
							<?php echo JHtml::_('grid.sort', 'COM_ICAGENDA_FEATURES_ICON', 'a.icon', $listDirn, $listOrder); ?>
						</th>

						<?php // Icon ALT HEADER ?>
						<th width="30%" class="nowrap">
							<?php echo JHtml::_('grid.sort', 'COM_ICAGENDA_FORM_FEATURE_ICON_ALT_LABEL', 'a.icon_alt', $listDirn, $listOrder); ?>
						</th>

						<?php // Show Filter HEADER ?>
						<th width="5%" class="center nowrap">
							<?php echo JHtml::_('grid.sort', 'COM_ICAGENDA_FEATURES_SHOW_FILTER', 'a.show_filter', $listDirn, $listOrder); ?>
						</th>

					<?php // START Joomla 2.5 ?>
					<?php if(version_compare(JVERSION, '3.0', 'lt')) : ?>

						<?php // Ordering HEADER Joomla 2.5 ?>
						<?php if (isset($this->items[0]->ordering)) { ?>
						<th width="10%">
							<?php echo JHtml::_('grid.sort',  'JGRID_HEADING_ORDERING', 'a.ordering', $listDirn, $listOrder); ?>
							<?php if ($canOrder && $saveOrder) :?>
								<?php echo JHtml::_('grid.order',  $this->items, 'filesave.png', 'features.saveorder'); ?>
							<?php endif; ?>
						</th>
						<?php } ?>

					<?php // END Joomla 2.5 ?>
					<?php endif; ?>

						<?php // ID HEADER ?>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>

				<?php // FOOTER ?>
				<tfoot>
					<tr>
						<td colspan="10">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>

				<?php // BODY ?>
				<tbody>

					<?php foreach ($this->items as $i => $item) :
						$ordering	= ($listOrder == 'a.ordering');
						$canCreate	= $user->authorise('core.create',		'com_icagenda');
						$canEdit	= $user->authorise('core.edit',			'com_icagenda');
						$canCheckin	= $user->authorise('core.manage',		'com_icagenda');
						$canChange	= $user->authorise('core.edit.state',	'com_icagenda');
						$canEditOwn	= $user->authorise('core.edit.own',		'com_icagenda');
						?>

						<tr class="row<?php echo $i % 2; ?>">

						<?php // START Joomla 3.x ?>
						<?php if(version_compare(JVERSION, '3.0', 'ge')) : ?>

							<?php // Ordering Joomla 3.x ?>
							<td class="order nowrap center hidden-phone">
								<?php if ($canChange) :
									$disableClassName = '';
									$disabledLabel	  = '';

									if (!$saveOrder) :
										$disabledLabel    = JText::_('JORDERINGDISABLED');
										$disableClassName = 'inactive tip-top';
									endif; ?>
									<span class="sortable-handler hasTooltip <?php echo $disableClassName; ?>" title="<?php echo $disabledLabel; ?>">
										<i class="icon-menu"></i>
									</span>
									<input type="text" style="display:none" name="order[]" size="5" value="<?php echo $item->ordering; ?>" class="width-20 text-area-order " />
								<?php else : ?>
									<span class="sortable-handler inactive" >
										<i class="icon-menu"></i>
									</span>
								<?php endif; ?>
							</td>

						<?php // END Joomla 3.x ?>
						<?php endif; ?>

							<?php // CheckBox ?>
							<td class="center hidden-phone">
								<?php echo JHtml::_('grid.id', $i, $item->id); ?>
							</td>

							<?php // Status ?>
						<?php if (isset($this->items[0]->state)) { ?>
							<td class="center">
								<?php echo JHtml::_('jgrid.published', $item->state, $i, 'features.', $canChange, 'cb'); ?>
							</td>
						<?php } ?>

							<?php // Title ?>
							<td class="nowrap has-context">
								<div class="pull-left">
									<?php if ($item->checked_out) : ?>
										<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'features.', $canCheckin); ?>
									<?php endif; ?>
									<?php //if ($item->language == '*'):?>
										<?php //$language = JText::alt('JALL', 'language'); ?>
									<?php //else:?>
										<?php //$language = $item->language ? $this->escape($item->language) : JText::_('JUNDEFINED'); ?>
									<?php //endif;?>
									<?php if ($canEdit) : ?>
										<a href="<?php echo JRoute::_('index.php?option=com_icagenda&task=feature.edit&id=' . $item->id); ?>" title="<?php echo JText::_('JACTION_EDIT'); ?>">
											<?php echo $this->escape($item->title); ?></a>
									<?php else : ?>
										<span title="<?php echo JText::sprintf('JFIELD_ALIAS_LABEL', $this->escape($item->alias)); ?>"><?php echo $this->escape($item->title); ?></span>
									<?php endif; ?>
								</div>

							<?php // START DropDown Edit Joomla 3.x ?>
							<?php if(version_compare(JVERSION, '3.0', 'ge')) : ?>

								<?php // Show Filter ?>
								<div class="pull-left">
									<?php
									// Create dropdown items
									JHtml::_('dropdown.edit', $item->id, 'feature.');
									JHtml::_('dropdown.divider');
									if ($item->state) :
										JHtml::_('dropdown.unpublish', 'cb' . $i, 'features.');
									else :
										JHtml::_('dropdown.publish', 'cb' . $i, 'features.');
									endif;

									JHtml::_('dropdown.divider');

									if ($archived) :
										JHtml::_('dropdown.unarchive', 'cb' . $i, 'features.');
									else :
										JHtml::_('dropdown.archive', 'cb' . $i, 'features.');
									endif;

									if ($item->checked_out) :
										JHtml::_('dropdown.checkin', 'cb' . $i, 'features.');
									endif;

									if ($trashed) :
										JHtml::_('dropdown.untrash', 'cb' . $i, 'features.');
									else :
										JHtml::_('dropdown.trash', 'cb' . $i, 'features.');
									endif;

									// Render dropdown list
									echo JHtml::_('dropdown.render');
									?>
								</div>

							<?php // END DropDown Edit Joomla 3.x ?>
							<?php endif; ?>
							</td>

							<?php // Icon ?>
							<td>
								<div>
									<?php echo '<img src="../' . $image_path . '/icagenda/feature_icons/24_bit/' . $item->icon . '" alt="[' . $item->icon . ']" />'; ?>
									<?php echo $item->icon == -1 ? JText::_('JOPTION_DO_NOT_USE') : $item->icon; ?>
								</div>
							</td>

							<?php // Icon ALT Value ?>
							<td>
								<div>
									<?php echo $this->escape($item->icon_alt) ?>
								</div>
							</td>

							<?php // Show Filter ?>
							<td class="center">
								<div>
									<i class="icon-<?php echo $item->show_filter ? 'publish' : 'unpublish';// Note:'publish/unpublish' preferred to 'checkmark/cancel' because of colour ?>"></i>
								</div>
							</td>

						<?php // START Joomla 2.5 ?>
						<?php if(version_compare(JVERSION, '3.0', 'lt')) : ?>

							<?php // Ordering Joomla 2.5 ?>
						<?php if (isset($this->items[0]->ordering)) { ?>
							<td class="order">
								<?php if ($canChange) : ?>
									<?php if ($saveOrder) :?>
										<?php if ($listDirn == 'asc') : ?>
											<span><?php echo $this->pagination->orderUpIcon($i, true, 'features.orderup', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
											<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, true, 'features.orderdown', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
										<?php elseif ($listDirn == 'desc') : ?>
											<span><?php echo $this->pagination->orderUpIcon($i, true, 'features.orderdown', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
											<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, true, 'features.orderup', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
										<?php endif; ?>
									<?php endif; ?>
									<?php $disabled = $saveOrder ?  '' : 'disabled="disabled"'; ?>
									<input type="text" name="order[]" size="5" value="<?php echo $item->ordering;?>" <?php echo $disabled ?> class="text-area-order" />
								<?php else : ?>
									<?php echo $item->ordering; ?>
								<?php endif; ?>
							</td>
						<?php } ?>

						<?php // END Joomla 2.5 ?>
						<?php endif; ?>

							<?php // ID ?>
						<?php if (isset($this->items[0]->id)) { ?>
							<td class="center hidden-phone">
								<?php echo (int) $item->id; ?>
							</td>
						<?php } ?>

						</tr>

					<?php endforeach; ?>

				</tbody>
			</table>
			<div>
				<input type="hidden" name="task" value="" />
				<input type="hidden" name="boxchecked" value="0" />
				<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
				<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
				<?php echo JHtml::_('form.token'); ?>
			</div>
		</div>
	</form>
<?php
}
else
{
	$app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'warning');
	$app->redirect(htmlspecialchars_decode('index.php?option=com_icagenda&view=icagenda'));
}
components/com_icagenda/views/features/index.html000060400000000037152453623450016277 0ustar00<!DOCTYPE html><title></title>
components/com_icagenda/views/features/view.html.php000060400000011212152453623450016725 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      doorknob
 * @link        http://www.joomlic.com
 *
 * @version     3.5.4 2015-04-02
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * View class Admin - List of Features - iCagenda.
 */
class iCagendaViewFeatures extends JViewLegacy
{
	protected $items;
	protected $pagination;
	protected $state;

	/**
	 * Display the view
	 *
	 * @since	3.4.0
	 */
	public function display($tpl = null)
	{
		// Joomla 2.5
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			jimport( 'joomla.environment.request' );

			JHtml::stylesheet( 'com_icagenda/icagenda-back.j25.css', false, true );
		}

		$this->state		= $this->get('State');
		$this->items		= $this->get('Items');
		$this->pagination	= $this->get('Pagination');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			JError::raiseError(500, implode("\n", $errors));

			return false;
		}

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();

			if(version_compare(JVERSION, '3.0', 'ge'))
			{
				$this->sidebar = JHtmlSidebar::render();
			}
		}

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @since	3.4.0
	 */
	protected function addToolbar()
	{
		require_once JPATH_COMPONENT.DS.'helpers'.DS.'icagenda.php';

		$state	= $this->get('State');
		$user		= JFactory::getUser();
		$userId		= $user->get('id');
		$canDo		= iCagendaHelper::getActions();

		// Set Title
		if(version_compare(JVERSION, '3.0', 'lt'))
		{
			JToolBarHelper::title('iCagenda - ' . JText::_('COM_ICAGENDA_TITLE_FEATURES'), 'features.png');
		}
		else
		{
			JToolBarHelper::title('iCagenda <span style="font-size:14px;">- ' . JText::_('COM_ICAGENDA_TITLE_FEATURES') . '</span>', 'folder');
		}

		$icTitle = JText::_('COM_ICAGENDA_TITLE_FEATURES');

		$document	= JFactory::getDocument();
		$app		= JFactory::getApplication();
		$sitename = $app->getCfg('sitename');
		$title = $app->getCfg('sitename') . ' - ' . JText::_('JADMINISTRATION') . ' - iCagenda: ' . $icTitle;
		$document->setTitle($title);

		//Check if the form exists before showing the add/edit buttons
		$formPath = JPATH_COMPONENT_ADMINISTRATOR.'/views/feature';

		if (file_exists($formPath))
		{
			if ($canDo->get('core.create'))
			{
				JToolBarHelper::addNew('feature.add','JTOOLBAR_NEW');
			}

			if ($canDo->get('core.edit'))
			{
				JToolBarHelper::editList('feature.edit','JTOOLBAR_EDIT');
			}
		}

		if ($canDo->get('core.edit.state'))
		{
			if (isset($this->items[0]->state))
			{
				JToolBarHelper::divider();
				JToolBarHelper::custom('features.publish', 'publish.png', 'publish_f2.png','JTOOLBAR_PUBLISH', true);
				JToolBarHelper::custom('features.unpublish', 'unpublish.png', 'unpublish_f2.png', 'JTOOLBAR_UNPUBLISH', true);
			}
			else
			{
				//If this component does not use state then show a direct delete button as we can not trash
				JToolBarHelper::deleteList('', 'features.delete','JTOOLBAR_DELETE');
			}

			if (isset($this->items[0]->state))
			{
				JToolBarHelper::divider();
				JToolBarHelper::archiveList('features.archive','JTOOLBAR_ARCHIVE');
			}

			if (isset($this->items[0]->checked_out))
			{
				JToolBarHelper::custom('features.checkin', 'checkin.png', 'checkin_f2.png', 'JTOOLBAR_CHECKIN', true);
			}
		}

		//Show trash and delete for components that uses the state field
		if (isset($this->items[0]->state))
		{
			if ($state->get('filter.state') == -2 && $canDo->get('core.delete'))
			{
				JToolBarHelper::deleteList('', 'features.delete','JTOOLBAR_EMPTY_TRASH');
				JToolBarHelper::divider();
			}
			elseif ($canDo->get('core.edit.state'))
			{
				JToolBarHelper::trash('features.trash','JTOOLBAR_TRASH');
				JToolBarHelper::divider();
			}
		}

		if ($canDo->get('core.admin'))
		{
			JToolBarHelper::preferences('com_icagenda');
		}

		if(version_compare(JVERSION, '3.0', 'ge'))
		{
			JHtmlSidebar::setAction('index.php?option=com_icagenda&view=features');

			JHtmlSidebar::addFilter(
				JText::_('JOPTION_SELECT_PUBLISHED'),
				'filter_published',
				JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.state'), true)
			);
		}
	}
}
components/com_icagenda/views/event/view.html.php000060400000011706152453623450016240 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.6 2015-06-10
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * View class Admin - Edit an Event - iCagenda
 */
class iCagendaViewEvent extends JViewLegacy
{
	protected $state;
	protected $item;
	protected $form;

	/**
	 * Display the view
	 *
	 * @since	1.0
	 */
	public function display($tpl = null)
	{
		// Initialiase variables.
		$this->state	= $this->get('State');
		$this->item		= $this->get('Item');
		$this->form		= $this->get('Form');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			JError::raiseError(500, implode("\n", $errors));
			return false;
		}

		$icagenda_categories = class_exists('icagendaCategories') ? icagendaCategories::getList('1') : false;

		if ($icagenda_categories)
		{
			$this->addToolbar();
		}
		else
		{
			$app = JFactory::getApplication();
			$app->enqueueMessage(JText::_('COM_ICAGENDA_ALERT_NO_CATEGORY_PUBLISHED')
								. '<br /><br /><a class="btn btn-success" href="index.php?option=com_icagenda&view=category&layout=edit" >'
								. JText::_('COM_ICAGENDA_LEGEND_NEW_CATEGORY') . '</a>'
								. ' <a class="btn btn-inverse btn-mini" href="index.php?option=com_icagenda&view=categories" >'
								. JText::_('ICCATEGORIES')
								. '</a>', 'warning');
			$app->redirect(htmlspecialchars_decode('index.php?option=com_icagenda&view=events'));
		}

		parent::display($tpl);

		icagendaForm::loadDateTimePickerJSLanguage();

		JHtml::stylesheet( 'com_icagenda/icagenda.css', false, true );
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @since	1.0
	 */
	protected function addToolbar()
	{
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			JRequest::setVar('hidemainmenu', true);
		}
		else
		{
			JFactory::getApplication()->input->set('hidemainmenu', true);
		}

		$user		= JFactory::getUser();
		$userId		= $user->get('id');
		$isNew		= ($this->item->id == 0);
		$checkedOut	= !($this->item->checked_out == 0 || $this->item->checked_out == $userId);
		$canDo		= iCagendaHelper::getActions();

		// Set Title
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			JToolBarHelper::title($isNew	? 'iCagenda - ' . JText::_('COM_ICAGENDA_LEGEND_NEW_EVENT')
											: 'iCagenda - ' . JText::_('COM_ICAGENDA_LEGEND_EDIT_EVENT'),
											'event');
		}
		else
		{
			JToolBarHelper::title($isNew	? 'iCagenda <span style="font-size:14px;">- ' . JText::_('COM_ICAGENDA_LEGEND_NEW_EVENT') . '</span>'
											: 'iCagenda <span style="font-size:14px;">- ' . JText::_('COM_ICAGENDA_LEGEND_EDIT_EVENT') . '</span>',
											$isNew ? 'new' : 'pencil-2');
		}

		$icTitle	= $isNew ? JText::_('COM_ICAGENDA_LEGEND_NEW_EVENT') : JText::_('COM_ICAGENDA_LEGEND_EDIT_EVENT');

		$document	= JFactory::getDocument();
		$app		= JFactory::getApplication();
		$sitename	= $app->getCfg('sitename');
		$title		= $app->getCfg('sitename') . ' - ' . JText::_('JADMINISTRATION') . ' - iCagenda: ' . $icTitle;

		$document->setTitle($title);

		// Build the actions for new and existing records.
		if ($isNew)
		{
			// For new records, check the create permission.
			if ($canDo->get('core.create'))
			{
				JToolBarHelper::apply('event.apply', 'JTOOLBAR_APPLY');
				JToolBarHelper::save('event.save', 'JTOOLBAR_SAVE');
				JToolBarHelper::custom('event.save2new', 'save-new.png', 'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false);
			}

			JToolBarHelper::cancel('event.cancel', 'JTOOLBAR_CANCEL');
		}
		else
		{
			// Can't save the record if it's checked out.
			if ( ! $checkedOut)
			{
				// Since it's an existing record, check the edit permission, or fall back to edit own if the owner.
				if ($canDo->get('core.edit') || ($canDo->get('core.edit.own') && $this->item->created_by == $userId))
				{
					// We can save the new record
					JToolBarHelper::apply('event.apply', 'JTOOLBAR_APPLY');
					JToolBarHelper::save('event.save', 'JTOOLBAR_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::custom('event.save2new', 'save-new.png', 'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false);
					}
				}
			}

			// If checked out, we can still save
			if ($canDo->get('core.create'))
			{
				JToolBarHelper::custom('event.save2copy', 'save-copy.png', 'save-copy_f2.png', 'JTOOLBAR_SAVE_AS_COPY', false);
			}

			JToolBarHelper::cancel('event.cancel', 'JTOOLBAR_CLOSE');
		}
	}
}
components/com_icagenda/views/event/tmpl/edit.php000060400000111447152453623450016227 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.7 2015-07-16
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

JHtml::_('behavior.formvalidation');
//JHtml::_('behavior.formvalidator'); // j!3.4.0 ?
JHtml::_('behavior.keepalive');

$app = JFactory::getApplication();
$document = JFactory::getDocument();

// Access Administration Events check.
if (JFactory::getUser()->authorise('icagenda.access.events', 'com_icagenda')
	&& defined('IC_LIBRARY'))
{
	$bootstrapType		= '1';

	$EventTag			= 'event';
	$EventTitle			= JText::_('COM_ICAGENDA_TITLE_EVENT', true);

	$DatesTag			= 'dates';
	$DatesTitle			= JText::_('COM_ICAGENDA_LEGEND_DATES', true);

	$DescTag			= 'desc';
	$DescTitle			= JText::_('COM_ICAGENDA_LEGEND_DESC', true);

	$InfosTag			= 'infos';
	$InfosTitle			= JText::_('COM_ICAGENDA_LEGEND_INFORMATION', true);

	$GooglemapTag		= 'googlemap';
	$GooglemapTitle		= JText::_('COM_ICAGENDA_LEGEND_GOOGLE_MAPS', true);

	$RegistrationsTag	= 'registrations';
	$RegistrationsTitle	= JText::_('COM_ICAGENDA_REGISTRATIONS_LABEL', true);

	$OptionsTag			= 'options';
	$OptionsTitle		= JText::_('JOPTIONS', true);

	$PublishingTag		= 'publishing';
	$PublishingTitle	= JText::_('JGLOBAL_FIELDSET_PUBLISHING', true);

	// Joomla 2.5
	if (version_compare(JVERSION, '3.0', 'lt'))
	{
		jimport( 'joomla.html.html.tabs' );

		$iCmapDisplay		= '3';

		$icPanEvent			= JText::_('COM_ICAGENDA_TITLE_EVENT', true);
		$icPanDates			= JText::_('COM_ICAGENDA_LEGEND_DATES', true);
		$icPanDesc			= JText::_('COM_ICAGENDA_LEGEND_DESC', true);
		$icPanInfos			= JText::_('COM_ICAGENDA_LEGEND_INFORMATION', true);
		$icPanGooglemap		= JText::_('COM_ICAGENDA_LEGEND_GOOGLE_MAPS', true);
		$icPanRegistrations	= JText::_('COM_ICAGENDA_REGISTRATIONS_LABEL', true);
		$icPanOptions		= JText::_('JOPTIONS', true);
		$icPanPublishing	= JText::_('JGLOBAL_FIELDSET_PUBLISHING', true);
		$startPane			= 'tabs.start';
		$addPanel			= 'tabs.panel';
		$endPanel			= 'tabs.end';
		$endPane			= 'tabs.end';
		$EventTag1			= $EventTag;
		$EventTag2			= $EventTitle;
		$DatesTag1			= $DatesTag;
		$DatesTag2			= $DatesTitle;
		$DescTag1			= $DescTag;
		$DescTag2			= $DescTitle;
		$InfosTag1			= $InfosTag;
		$InfosTag2			= $InfosTitle;
		$GooglemapTag1		= $GooglemapTag;
		$GooglemapTag2		= $GooglemapTitle;
		$RegistrationsTag1	= $RegistrationsTag;
		$RegistrationsTag2	= $RegistrationsTitle;
		$OptionsTag1		= $OptionsTag;
		$OptionsTag2		= $OptionsTitle;
		$PublishingTag1		= $PublishingTag;
		$PublishingTag2		= $PublishingTitle;
	}

	// Joomla 3
	else
	{
		JHtml::_('formbehavior.chosen', 'select');
		jimport('joomla.html.html.bootstrap');

		$icPanEvent			= 'icTab';
		$icPanDates			= 'icTab';
		$icPanDesc			= 'icTab';
		$icPanInfos			= 'icTab';
		$icPanGooglemap		= 'icTab';
		$icPanRegistrations	= 'icTab';
		$icPanOptions		= 'icTab';
		$icPanPublishing	= 'icTab';

		if ($bootstrapType == '1')
		{
			$iCmapDisplay		= '1';
			$startPane			= 'bootstrap.startTabSet';
			$addPanel			= 'bootstrap.addTab';
			$endPanel			= 'bootstrap.endTab';
			$endPane			= 'bootstrap.endTabSet';
			$EventTag1			= $EventTag;
			$EventTag2			= $EventTitle;
			$DatesTag1			= $DatesTag;
			$DatesTag2			= $DatesTitle;
			$DescTag1			= $DescTag;
			$DescTag2			= $DescTitle;
			$InfosTag1			= $InfosTag;
			$InfosTag2			= $InfosTitle;
			$GooglemapTag1		= $GooglemapTag;
			$GooglemapTag2		= $GooglemapTitle;
			$RegistrationsTag1	= $RegistrationsTag;
			$RegistrationsTag2	= $RegistrationsTitle;
			$OptionsTag1		= $OptionsTag;
			$OptionsTag2		= $OptionsTitle;
			$PublishingTag1		= $PublishingTag;
			$PublishingTag2		= $PublishingTitle;
		}
		elseif ($bootstrapType == '2')
		{
			$iCmapDisplay		= '2';
			$startPane			= 'bootstrap.startAccordion';
			$addPanel			= 'bootstrap.addSlide';
			$endPanel			= 'bootstrap.endSlide';
			$endPane			= 'bootstrap.endAccordion';
			$EventTag1			= $EventTitle;
			$EventTag2			= $EventTag;
			$DatesTag1			= $DatesTitle;
			$DatesTag2			= $DatesTag;
			$DescTag1			= $DescTitle;
			$DescTag2			= $DescTag;
			$InfosTag1			= $InfosTitle;
			$InfosTag2			= $InfosTag;
			$GooglemapTag1		= $GooglemapTitle;
			$GooglemapTag2		= $GooglemapTag;
			$RegistrationsTag1	= $RegistrationsTitle;
			$RegistrationsTag2	= $RegistrationsTag;
			$OptionsTag1		= $OptionsTitle;
			$OptionsTag2		= $OptionsTag;
			$PublishingTag1		= $PublishingTitle;
			$PublishingTag2		= $PublishingTag;
		}
	}

	$params = $this->form->getFieldsets('params');

	// ZOOM
	$zoom		= '1';
	// HYBRID, ROADMAP, SATELLITE, TERRAIN
	$mapTypeId	= 'ROADMAP';

	$coords		= '0, 0';
	$oldcoordinate = $this->item->coordinate;
	$lat		= $this->item->lat;
	$lng		= $this->item->lng;

	if (($oldcoordinate == NULL) && ($lat == '0') && ($lng == '0'))
	{
		$zoom = '1';
	}
	// Notes: 	zoomControl: false, mapTypeControl: false

	// Control of dates if valid (Alert Messages)
	$messagealert	= '';
	$alert			= '';
	$nodate			= '0000-00-00 00:00:00';
	$nextget		= $this->item->next;

	if ($nextget == '-3600'
		|| $nextget == $nodate)
	{
		$messagealert = '<div><h4><b>' . JText::_('COM_ICAGENDA_FORM_ALERT_UNPUBLISHED') . '</b></h4></div>';

		if (($this->item->startdate == $nodate) && ($this->item->enddate != $nodate))
		{
			$messagealert.= '<p>' . JText::_('COM_ICAGENDA_FORM_ERROR_NO_STARTDATE') . '</p><br>';
		}
		if (($this->item->enddate == $nodate) && ($this->item->startdate != $nodate))
		{
			$messagealert.= '<p>' . JText::_('COM_ICAGENDA_FORM_ERROR_NO_ENDDATE') . '</p><br>';
		}
		if (($this->item->enddate < $this->item->startdate)
			&& (($this->item->next != '-3600') || ($this->item->next != $nodate)))
		{
			$messagealert.= '<p>' . JText::_('COM_ICAGENDA_FORM_ERROR_INVALID_PERIOD') . '</p><br>';
		}
	}
	else
	{
		if (($this->item->startdate == $nodate) && ($this->item->enddate != $nodate))
		{
			$alert.= '<p>' . JText::_('COM_ICAGENDA_FORM_ERROR_NO_STARTDATE') . '</p><br>';
		}
		if (($this->item->enddate == $nodate) && ($this->item->startdate != $nodate))
		{
			$alert.= '<p>' . JText::_('COM_ICAGENDA_FORM_ERROR_NO_ENDDATE') . '</p><br>';
		}
		if (($this->item->enddate < $this->item->startdate)
			&& (($this->item->next != '-3600') || ($this->item->next != $nodate)))
		{
			$alert.= '<p>' . JText::_('COM_ICAGENDA_FORM_ERROR_INVALID_PERIOD') . '</p><br>';
		}
	}
	?>

	<?php // ERROR ALERT ?>
	<div id="form_errors" class="alert alert-danger" style="display:none">
		<strong><?php echo JText::_('JGLOBAL_VALIDATION_FORM_FAILED'); ?></strong>
		<div id="message_error">
		</div>
	</div>

	<div class="alert alert-danger" id="error_dates" style="display:none">
		<?php echo '<strong>' . JText::_('COM_ICAGENDA_FORM_WARNING') . '</strong><br />' . JText::_('COM_ICAGENDA_FORM_NO_DATES_ALERT'); ?>
	</div>

	<form action="<?php echo JRoute::_('index.php?option=com_icagenda&layout=edit&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="event-form" class="form-validate" enctype="multipart/form-data">
		<div class="container">

			<!-- iCheader top bar -->
			<!--div class="iCheader-top">
				<a href="#">
					<strong>&laquo; Previous </strong>event
				</a>
				<span class="right">
					<a href="#">
						<strong>Next</strong> event <strong>&raquo;</strong>
					</a>
				</span>
				<div class="clr"></div>
			</div-->
			<!--/ iCheader top bar -->

			<!-- iCagenda Header -->
			<?php
			$new_event_value = empty($this->item->id) ? '1' : '0';
			?>
			<header>
				<h1>
					<?php echo '<input type="hidden" value="' . $new_event_value . '" name="new_event" />'; ?>
					<?php echo empty($this->item->id) ? JText::_('COM_ICAGENDA_LEGEND_NEW_EVENT') : JText::sprintf('COM_ICAGENDA_LEGEND_EDIT_EVENT', $this->item->id); ?>&nbsp;<span>iCagenda</span>
				</h1>
				<h2>
					<?php echo JText::_('COM_ICAGENDA_COMPONENT_DESC'); ?>
					<!--nav class="iCheader-videos">
						<span style="font-variant:small-caps">Tutorial Videos</span>
						<a href="#">Add a event</a>
						<a href="#">Video 2</a>
						<a href="#">Video 3</a>
					</nav-->
				</h2>
			</header>

			<div>&nbsp;</div>

			<!-- Alert Messages -->
			<div>
				<?php if ($messagealert) :?>
				<div style="background: #990000; color: #FFFFFF; border-radius: 10px; border: 1px solid #D4D4D4; padding: 20px; margin-bottom:20px;">
					<?php echo '<h2>' . JText::_('COM_ICAGENDA_FORM_WARNING') . '</h2>' . $messagealert; ?>
				</div>
				<?php endif; ?>
				<?php if ($alert && ! $messagealert) : ?>
				<div style="background: #FFFFFF; color: red; border-radius: 10px; border: 1px solid #D4D4D4; padding: 10px; margin-bottom:20px;">
					<strong><?php echo $alert; ?></strong>
				</div>
				<?php endif; ?>
			</div>

			<!-- Begin Content -->
			<div class="row-fluid">
				<div class="span10 form-horizontal">

					<!-- Open Panel Set -->
					<?php echo JHtml::_($startPane, 'icTab', array('active' => 'event')); ?>

						<!-- Panel Event -->
						<?php echo JHtml::_($addPanel, $icPanEvent, $EventTag1, $EventTag2); ?>

							<div class="icpanel iCleft">
								<h1>
									<?php echo empty($this->item->id) ? JText::_('COM_ICAGENDA_LEGEND_NEW_EVENT') : JText::sprintf('COM_ICAGENDA_LEGEND_EDIT_EVENT', $this->item->id); ?>
								</h1>
								<hr>
								<div class="row-fluid">
									<div class="span6 iCleft">
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('title'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('title'); ?>
											</div>
										</div>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('catid'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('catid'); ?>
											</div>
										</div>
									</div>
									<div class="span6 iCleft">
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('image'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('image'); ?>
											</div>
										</div>
										<div class="control-group">
											<div>
												<img src="../<?php echo $this->item->image; ?>" alt="" id="jform_image_preview" class="media-preview" style="float:right; max-width:100%; max-height:350px;">
											</div>
										</div>
									</div>
								</div>
							</div>


						<?php
						if (version_compare(JVERSION, '3.0', 'ge'))
						{
							echo JHtml::_($endPanel);
						}
						?>

						<!-- Panel Dates -->
						<?php echo JHtml::_($addPanel, $icPanDates, $DatesTag1, $DatesTag2); ?>

							<div class="icpanel iCleft">
								<h1><?php echo JText::_('COM_ICAGENDA_LEGEND_DATES'); ?></h1>
								<!--div class="row-fluid">
									<div class="span12 iCleft">
										<h3><?php echo JText::_('COM_ICAGENDA_LEGEND_SINGLE_DATES'); ?></h3>
										<div class="control-group">
											<?php echo $this->form->getInput('eventDates'); ?>
										</div>
									</div>
								</div-->
								<hr>
								<div class="row-fluid">
									<div class="span6 iCleft">
										<h3><?php echo JText::_('COM_ICAGENDA_LEGEND_PERIOD_DATES'); ?></h3>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('startdate'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('startdate'); ?>
											</div>
										</div>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('enddate'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('enddate'); ?>
											</div>
										</div>
										<!--div class="control-group">
										</div-->
									</div>
									<div class="span6 iCleft">
										<h3>&nbsp;</h3>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('weekdays'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('weekdays'); ?>
											</div>
										</div>
										<!--div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('weekdays_filter'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('weekdays_filter'); ?>
											</div>
										</div-->
										<div class="control-group">
											<div class="alert alert-info">
												<h4><?php echo JText::_('COM_ICAGENDA_FORM_WEEK_DAYS_INFO_TITLE'); ?></h4>
												<?php echo JText::_('COM_ICAGENDA_FORM_WEEK_DAYS_INFO_DESC'); ?>
											</div>
										</div>
										<!--div class="control-group">
										</div-->
									</div>
								</div>
								<hr>
								<div class="row-fluid">
									<div class="span6 iCleft">
										<h3><?php echo JText::_('COM_ICAGENDA_LEGEND_SINGLE_DATES'); ?></h3>
										<div class="control-group">
											<?php echo $this->form->getInput('dates'); ?>
										</div>
									</div>
								</div>
								<hr>
								<div class="row-fluid">
									<div class="span6 iCleft">
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('displaytime'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('displaytime'); ?>
											</div>
										</div>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('next'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('next'); ?>
											</div>
										</div>
									</div>
								</div>
								<hr>

								<?php
								echo '<fieldset style="margin:0">'
									.JHtml::_('sliders.start', 'info-slider', array('useCookie'=>0, 'startOffset'=>-1, 'startTransition'=>1))
									.JHtml::_('sliders.panel', JText::_('COM_ICAGENDA_DATES_HELP'), 'slide1')
									.'<fieldset class="panelform" >'
									.'<ul class="adminformlist" style="color:#555555;">'
									.'<div>'. JText::_('COM_ICAGENDA_DATES_HELP_INTRO').'</div><br>'
									.'<div style="text-transform:uppercase;"><b>'. JText::_('COM_ICAGENDA_LEGEND_SINGLE_DATES').'</b></div>'
									.'<div><b>&#9658; '. JText::_('COM_ICAGENDA_DATES_HELP_LINE1').'</b></div>'
									.'<div><i>'. JText::_('COM_ICAGENDA_DATES_HELP_EXAMPLE1').'</i></div><br>'
									.'<div><b>&#9658; '. JText::_('COM_ICAGENDA_DATES_HELP_LINE2').'</b></div>'
									.'<div><i>'. JText::_('COM_ICAGENDA_DATES_HELP_EXAMPLE2').'</i></div><br>'
									.'<div style="text-transform:uppercase;"><b>'. JText::_('COM_ICAGENDA_LEGEND_PERIOD_DATES').'</b></div>'
									.'<div><b>&#9658; '. JText::_('COM_ICAGENDA_DATES_HELP_LINE3').'</b></div>'
									.'<div><i>'. JText::_('COM_ICAGENDA_DATES_HELP_EXAMPLE3').'</i></div><br>'
									.'<div style="text-transform:uppercase;"><b>'. JText::_('COM_ICAGENDA_LEGEND_PERIOD_DATES').' & '. JText::_('COM_ICAGENDA_LEGEND_SINGLE_DATES').'</b></div>'
									.'<div><b>&#9658; '. JText::_('COM_ICAGENDA_DATES_HELP_LINE4').'</b></div>'
									.'<div><i>'. JText::_('COM_ICAGENDA_DATES_HELP_EXAMPLE4').'</i></div><br>'
									.'<div><b>&#9658; '. JText::_('COM_ICAGENDA_DATES_HELP_LINE5').'</b></div>'
									.'<div><i>'. JText::_('COM_ICAGENDA_DATES_HELP_EXAMPLE5').'</i></div><br>'
									.'</ul>'
									.'</fieldset>'
									.JHtml::_('sliders.end')
									.'<br />';
								?>
							</div>

						<?php
						if(version_compare(JVERSION, '3.0', 'ge'))
						{
							echo JHtml::_($endPanel);
						}
						?>

						<!-- Panel Description -->
						<?php echo JHtml::_($addPanel, $icPanDesc, $DescTag1, $DescTag2); ?>

							<div class="icpanel iCleft">
								<h1><?php echo JText::_('COM_ICAGENDA_LEGEND_DESC'); ?></h1>
								<hr>
								<div class="row-fluid">
									<h3><?php echo JText::_('COM_ICAGENDA_FORM_EVENT_SHORT_DESCRIPTION_LBL'); ?></h3>
									<div class="alert alert-info"><?php echo JText::_('COM_ICAGENDA_FORM_EVENT_SHORT_DESCRIPTION_DESC'); ?></div>
									<?php echo $this->form->getInput('shortdesc'); ?>
								</div>
								<hr>
								<div class="row-fluid">
									<h3><?php echo JText::_('COM_ICAGENDA_FORM_DESC_EVENT_DESC'); ?></h3>
									<?php echo $this->form->getInput('desc'); ?>
								</div>
								<hr>
								<div class="row-fluid">
									<h3><?php echo JText::_('COM_ICAGENDA_FORM_EVENT_METADESC_LBL'); ?></h3>
									<div class="alert alert-info"><?php echo JText::_('COM_ICAGENDA_FORM_EVENT_METADESC_DESC'); ?></div>
									<?php echo $this->form->getInput('metadesc'); ?>
								</div>
							</div>

						<?php
						if (version_compare(JVERSION, '3.0', 'ge'))
						{
							echo JHtml::_($endPanel);
						}
						?>

						<!-- Panel Information -->
						<?php echo JHtml::_($addPanel, $icPanInfos, $InfosTag1, $InfosTag2); ?>

							<div class="icpanel iCleft">
								<h1><?php echo JText::_('COM_ICAGENDA_LEGEND_INFORMATION'); ?></h1>
								<hr>
								<div class="row-fluid">
									<div class="span6 iCleft">
										<h3><?php echo JText::_('COM_ICAGENDA_LEGEND_VENUE'); ?></h3>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('place'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('place'); ?>
											</div>
										</div>
										<hr>
										<h3><?php echo JText::_('COM_ICAGENDA_LEGEND_CONTACT'); ?></h3>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('email'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('email'); ?>
											</div>
										</div>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('phone'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('phone'); ?>
											</div>
										</div>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('website'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('website'); ?>
											</div>
										</div>
										<hr>
										<h3><?php echo JText::_('COM_ICAGENDA_LEGEND_ALLEG'); ?></h3>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('file'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('file'); ?>
											</div>
										</div>
										<hr>
									</div>
									<div class="span6 iCleft">
										<h3><?php echo JText::_('COM_ICAGENDA_LEGEND_FEATURES'); ?></h3>
										<div class="control-group">
											<div class="control-label">
												<?php echo $this->form->getLabel('features'); ?>
											</div>
											<div class="controls">
												<?php echo $this->form->getInput('features'); ?>
											</div>
										</div>
										<hr>
										<h3><?php echo JText::_('COM_ICAGENDA_CUSTOMFIELDS'); ?></h3>
										<?php
										// Load Custom fields - Event form (2)
										echo icagendaCustomfields::loader(2);
										?>
									</div>
								</div>
							</div>

						<?php
						if (version_compare(JVERSION, '3.0', 'ge'))
						{
							echo JHtml::_($endPanel);
						}
						?>

						<!-- Panel Google Maps -->
						<?php echo JHtml::_($addPanel, $icPanGooglemap, $GooglemapTag1, $GooglemapTag2); ?>

					<div class="icpanel iCleft" id="googlemap">
						<h1><?php echo JText::_('COM_ICAGENDA_LEGEND_GOOGLE_MAPS'); ?></h1>
						<hr>
						<div class="row-fluid">
							<div class="span6 iCleft">

							<h3><?php echo JText::_('COM_ICAGENDA_GOOGLE_MAPS_SUBTITLE_LBL'); ?></h3>
							<div>
								<?php echo JText::_('COM_ICAGENDA_GOOGLE_MAPS_NOTE1'); ?>
								<br/>
								<?php echo JText::_('COM_ICAGENDA_GOOGLE_MAPS_NOTE2'); ?><br/>
							</div>
							<!--div class='clearfix'-->
							<div class="icmap-box">

								<div class="control-group">
									<div class="control-label">
										<?php echo $this->form->getLabel('address'); ?>
									</div>
									<div class="controls">
										<?php echo $this->form->getInput('address'); ?>
									</div>
								</div>
								<div class="icmap-field">
									<?php echo $this->form->getInput('city'); ?>
								</div>
								<div class="icmap-field">
									<?php echo $this->form->getInput('country'); ?>
								</div>
								<div class="icmap-field">
									<?php echo $this->form->getInput('lat'); ?>
								</div>
								<div class="icmap-field">
									<?php echo $this->form->getInput('lng'); ?>
								</div>
								<!--label>District: </label> <input id="administrative_area_level_2" disabled=disabled> <br/>
								<label>State/Province: </label> <input id="administrative_area_level_1" disabled=disabled> <br/-->
								<!--label>route: </label> <input id="route"> <br/>
								<label>Postal Code: </label> <input id="postal_code" disabled=disabled> <br/>
								<label>type: </label> <input id="type" disabled=disabled> <br/-->

							</div>
						</div>
						<div class="span6 iCleft">
							<div class='map-wrapper'>
								<h3>Map</h3>
								<label id="geo_label" for="reverseGeocode"><?php echo JText::_('COM_ICAGENDA_GOOGLE_MAPS_REVERSE'); ?></label>
								<select id="reverseGeocode">
									<option value="false" selected><?php echo JText::_('JNO'); ?></option>
									<option value="true"><?php echo JText::_('JYES'); ?></option>
								</select><br/>

								<div id="map"></div>
								<div id="legend"><?php echo JText::_('COM_ICAGENDA_GOOGLE_MAPS_LEGEND'); ?></div>
							</div>
						</div>

						<!--div class='input-positioned'>
							<label>Callback: </label>
							<textarea id='callback_result' rows="15"></textarea>
						</div-->
					</div>
				</div>

				<?php
				if (version_compare(JVERSION, '3.0', 'ge'))
				{
					echo JHtml::_($endPanel);
				}
				?>

				<?php
				echo JHtml::_($addPanel, $icPanRegistrations, $RegistrationsTag1, $RegistrationsTag2);
				?>
				<div class="icpanel iCleft">
					<h1><?php echo JText::_('COM_ICAGENDA_REGISTRATIONS_LABEL'); ?></h1>
					<hr>
					<div class="row-fluid">
					<?php foreach ($params as $name => $fieldSet) : ?>
						<?php if ( ! in_array($name, array('frontend', 'options'))) : ?>
							<?php if (isset($fieldSet->description) && trim($fieldSet->description)) : ?>
								<p class="tip"><?php echo $this->escape(JText::_($fieldSet->description));?></p>
							<?php endif; ?>
							<div class="span6 iCleft">
								<h3><?php echo $this->escape(JText::_($fieldSet->label)); ?></h3>
								<?php foreach ($this->form->getFieldset($name) as $field) : ?>
									<div class="control-group">
										<div class="control-label">
											<?php echo $field->label; ?>
										</div>
										<div class="controls">
											<?php
											$language = JFactory::getLanguage();
											$language->load('com_icagenda', JPATH_SITE, 'en-GB', true);
											$language->load('com_icagenda', JPATH_SITE, null, true);

											if (($field->name == 'jform[params][statutReg]') && ($field->value == '2'))
											{
												echo '<select name="jform[params][statutReg]">';
												echo '<option value="">' . JText::_('JGLOBAL_USE_GLOBAL') . '</option>';
												echo '<option value="0" selected>' . JText::_('JOFF') . '</option>';
												echo '<option value="1">' . JText::_('JON') . '</option>';
												echo '</select>';
											}
											elseif ($field->name == 'jform[params][maxRlistGlobal]')
											{
												 if ($field->value == '1')
												 {
													echo '<select name="jform[params][maxRlistGlobal]">';
													echo '<option value="" selected>' . JText::_('JGLOBAL_USE_GLOBAL') . '</option>';
													echo '<option value="2">' . JText::_('COM_ICAGENDA_LBL_CUSTOM_VALUE') . '</option>';
													echo '</select>';
												}
												 elseif ($field->value == '0')
												 {
													echo '<select name="jform[params][maxRlistGlobal]">';
													echo '<option value="">' . JText::_('JGLOBAL_USE_GLOBAL') . '</option>';
													echo '<option value="2" selected>' . JText::_('COM_ICAGENDA_LBL_CUSTOM_VALUE') . '</option>';
													echo '</select>';
												}
												else
												{
													echo $field->input;
												}
											}
											else
											{
												echo $field->input;
											}
											?>
										</div>
									</div>
								<?php endforeach; ?>
							</div>
						<?php endif; ?>
					<?php endforeach; ?>
					</div>
				</div>


				<?php
				if (version_compare(JVERSION, '3.0', 'ge'))
				{
					echo JHtml::_($endPanel);
				}
				?>

				<?php
				echo JHtml::_($addPanel, $icPanOptions, $OptionsTag1, $OptionsTag2);
				?>
				<div class="icpanel iCleft">
					<h1><?php echo JText::_('JOPTIONS'); ?></h1>
					<hr>
					<div class="row-fluid">
					<?php foreach ($params as $name => $fieldSet) : ?>
						<?php if ($name == 'options') : ?>
							<?php if (isset($fieldSet->description) && trim($fieldSet->description)) : ?>
								<p class="tip"><?php echo $this->escape(JText::_($fieldSet->description));?></p>
							<?php endif; ?>
							<div class="span6 iCleft">
								<h3><?php echo $this->escape(JText::_($fieldSet->label)); ?></h3>
								<?php foreach ($this->form->getFieldset($name) as $field) : ?>
									<div class="control-group">
										<div class="control-label">
											<?php echo $field->label; ?>
										</div>
										<div class="controls">
											<?php
											$language = JFactory::getLanguage();
											$language->load('com_icagenda', JPATH_SITE, 'en-GB', true);
											$language->load('com_icagenda', JPATH_SITE, null, true);
											echo $field->input;
											?>
										</div>
									</div>
								<?php endforeach; ?>
							</div>
						<?php endif; ?>
					<?php endforeach; ?>
					</div>
				</div>


				<?php
				if (version_compare(JVERSION, '3.0', 'ge'))
				{
					echo JHtml::_($endPanel);
				}
				?>

				<?php
				echo JHtml::_($addPanel, $icPanPublishing, $PublishingTag1, $PublishingTag2);
				?>
				<div class="icpanel iCleft">
					<h1><?php echo JText::_('JGLOBAL_FIELDSET_PUBLISHING'); ?></h1>
					<hr>
					<div class="row-fluid">
						<div class="span6 iCleft">
							<div class="control-group">
								<div class="control-label">
									<?php echo $this->form->getLabel('alias'); ?>
								</div>
								<div class="controls">
									<?php echo $this->form->getInput('alias'); ?>
								</div>
							</div>
							<div class="control-group">
								<div class="control-label">
									<?php echo $this->form->getLabel('id'); ?>
								</div>
								<div class="controls">
									<?php echo $this->form->getInput('id'); ?>
								</div>
							</div>
							<div class="control-group">
								<div class="control-label">
									<?php echo $this->form->getLabel('created'); ?>
								</div>
								<div class="controls">
									<?php echo $this->form->getInput('created'); ?>
								</div>
							</div>
							<div class="control-group">
								<div class="control-label">
									<?php echo $this->form->getLabel('created_by'); ?>
								</div>
								<div class="controls">
									<?php echo $this->form->getInput('created_by'); ?>
								</div>
							</div>
							<div class="control-group">
								<div class="control-label">
									<?php echo $this->form->getLabel('created_by_alias'); ?>
								</div>
								<div class="controls">
									<?php echo $this->form->getInput('created_by_alias'); ?>
								</div>
							</div>
							<div class="control-group">
								<div class="control-label">
									<?php echo $this->form->getLabel('modified'); ?>
								</div>
								<div class="controls">
									<?php echo $this->form->getInput('modified'); ?>
								</div>
							</div>
							<div class="control-group">
								<div class="control-label">
									<?php echo $this->form->getLabel('modified_by'); ?>
								</div>
								<div class="controls">
									<?php echo $this->form->getInput('modified_by'); ?>
								</div>
							</div>
							<div class="control-group">
								<div class="control-label">
									<?php echo $this->form->getLabel('checked_out'); ?>
								</div>
								<div class="controls">
									<?php echo $this->form->getInput('checked_out'); ?>
								</div>
							</div>
							<div class="control-group">
								<div class="control-label">
									<?php echo $this->form->getLabel('checked_out_time'); ?>
								</div>
								<div class="controls">
									<?php echo $this->form->getInput('checked_out_time'); ?>
								</div>
							</div>
							<?php if (!empty($this->item->site_itemid)) : ?>
							<h2><?php echo $this->escape(JText::_('COM_ICAGENDA_FORM_FRONTEND_OPTIONS'));?></h2>
							<hr>
							<div class="control-group">
								<div class="control-label">
									<?php echo $this->form->getLabel('site_itemid'); ?>
								</div>
								<div class="controls">
									<?php echo $this->form->getInput('site_itemid'); ?>
								</div>
							</div>
							<?php endif; ?>
							<!--
							<?php foreach ($params as $name => $fieldSet) : ?>
								<?php if ($name == 'publishing') : ?>
									<?php foreach ($this->form->getFieldset($name) as $field) : ?>
										<?php if (($field->name == 'jform[params][start_publishing]')
													&& ($field->value != '') && ($field->value != '0')) : ?>
											<?php if (isset($fieldSet->label) && trim($fieldSet->label)) : ?>
												<h2><?php echo $this->escape(JText::_($fieldSet->label));?></h2>
												<hr>
											<?php endif; ?>
											<div class="control-group">
												<div class="control-label">
													<?php echo $field->label; ?>
												</div>
												<div class="controls">
													<?php echo $field->input; ?>
												</div>
											</div>
										<?php endif; ?>
									<?php endforeach; ?>
								<?php endif; ?>
							<?php endforeach; ?>
							-->
						</div>
					</div>
				</div>



				<?php echo JHtml::_($endPanel); ?>

				<?php echo JHtml::_($endPane, 'icTab'); ?>
			</div>

		<!-- Begin Sidebar -->
			<div class="span2 iCleft">
			<h4><?php echo JText::_('COM_ICAGENDA_TITLE_SIDEBAR_DETAILS'); ?></h4>
			<hr>
				<div class="control-group">
					<div class="control-label">
						<?php echo $this->form->getLabel('state'); ?>
					</div>
					<div class="controls">
						<?php echo $this->form->getInput('state'); ?>
					</div>
				</div>
				<div class="control-group">
					<div class="control-label">
						<?php echo $this->form->getLabel('approval'); ?>
					</div>
					<div class="controls">
						<?php echo $this->form->getInput('approval'); ?>
					</div>
				</div>
				<div class="control-group">
					<div class="control-label">
						<?php echo $this->form->getLabel('access'); ?>
					</div>
					<div class="controls">
						<?php echo $this->form->getInput('access'); ?>
					</div>
				</div>
				<div class="control-group">
					<div class="control-label">
						<?php echo $this->form->getLabel('language'); ?>
					</div>
					<div class="controls">
						<?php echo $this->form->getInput('language'); ?>
					</div>
				</div>


			</div>
		<!-- End Sidebar -->
		</div>

		<div class="clr"></div>
		</div>
		<?php
		if ($messagealert)
		{
			$this->item->state=='0';
		}
		?>
		<div>
			<input type="hidden" name="task" value="" />
			<?php echo JHtml::_('form.token'); ?>
		</div>
	</form>

	<script type="text/javascript">
		//<![CDATA[
		var iCmapDisplay = '<?php echo $iCmapDisplay; ?>';

		jQuery(function($) {
			// Tabs
			if (iCmapDisplay=='1') {
				$iCgvar='a[href="#googlemap"]';
				$iCmapShow='shown';
			}
			if (iCmapDisplay=='3') {
				$iCgvar='.googlemap';
				$iCmapShow='click';
			}
			// Slides
			if (iCmapDisplay=='2') {
				$iCgvar='#googlemap';
				$iCmapShow='shown';
			}

			$(''+$iCgvar+'').on(''+$iCmapShow+'', function() {   // When tab is displayed...
//			$('.googlemap').on('click', function (e) {

				var addresspicker = $( "#addresspicker" ).addresspicker();
				var addresspickerMap = $( '#jform_address' ).addresspicker({
					regionBias: "fr",
					updateCallback: showCallback,
					mapOptions: {
						zoom: <?php echo $zoom; ?>,
						center: new google.maps.LatLng(<?php echo $coords; ?>),
						scrollwheel: false,
						mapTypeId: google.maps.MapTypeId.<?php echo $mapTypeId; ?>,
						streetViewControl: false
					},
					elements: {
						map: "#map",
						lat: "#lat",
						lng: "#lng",
						street_number: '#street_number',
						route: '#route',
						locality: '#locality',
						administrative_area_level_2: '#administrative_area_level_2',
						administrative_area_level_1: '#administrative_area_level_1',
						country: '#country',
						postal_code: '#postal_code',
						type: '#type',
					}
				});

				var gmarker = addresspickerMap.addresspicker( "marker");
				gmarker.setVisible(true);
				addresspickerMap.addresspicker( "updatePosition");

				$('#reverseGeocode').change(function(){
					$("#jform_address").addresspicker("option", "reverseGeocode", ($(this).val() === 'true'));
				});

				function showCallback(geocodeResult, parsedGeocodeResult){
					$('#callback_result').text(JSON.stringify(parsedGeocodeResult, null, 4));
				}
			});
		});
		//]]>
	</script>

	<?php

	// Script validation for Event Edit form (2)
	$iCheckForm = icagendaForm::submit(2);
	$document->addScriptDeclaration($iCheckForm);

	// CSS files which could be overridden into your site template. (eg. /templates/my_template/css/com_icagenda/icagenda-back.css)
	JHtml::stylesheet( 'com_icagenda/icagenda.css', false, true );
	JHtml::stylesheet( 'com_icagenda/jquery-ui-1.8.17.custom.css', false, true );

	$ic_style = 'div.tip img.media-preview {display:none}';
	$document->addStyleDeclaration($ic_style);

	// Joomla 2.5
	if (version_compare(JVERSION, '3.0', 'lt'))
	{
		JHtml::stylesheet('com_icagenda/template.j25.css', false, true);
		JHtml::stylesheet('com_icagenda/icagenda-back.j25.css', false, true);

		JHtml::_('behavior.framework');

		// load jQuery, if not loaded before (NEW VERSION IN 1.2.6)
		$scripts = array_keys($document->_scripts);
		$scriptFound = false;
		$scriptuiFound = false;
		$mapsgooglescriptFound = false;
		for ($i = 0; $i < count($scripts); $i++)
		{
			if (stripos($scripts[$i], 'jquery.min.js') !== false)
			{
				$scriptFound = true;
			}
			// load jQuery, if not loaded before as jquery - added in 1.2.7
			if (stripos($scripts[$i], 'jquery.js') !== false)
			{
				$scriptFound = true;
			}
			if (stripos($scripts[$i], 'jquery-ui.min.js') !== false)
			{
				$scriptuiFound = true;
			}
			if (stripos($scripts[$i], 'maps.google') !== false)
			{
				$mapsgooglescriptFound = true;
			}
		}

		// jQuery Library Loader
		if (!$scriptFound)
		{
			// load jQuery, if not loaded before
			if (!$app->get('jquery'))
			{
				$app->set('jquery', true);
				// add jQuery
				$document->addScript('https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js');
				$document->addScript( JURI::root( true ) . '/media/com_icagenda/js/jquery.noconflict.js' );
			}
		}

		if (!$scriptuiFound)
		{
			$document->addScript('https://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js');
		}

		$document->addScript( JURI::root( true ) . '/media/com_icagenda/js/template.js' );
	}
	else
	{
		JHtml::_('bootstrap.framework');
		JHtml::_('jquery.framework');

		// Change jQuery UI version from 1.9.2 to 1.8.23 to prevent a conflict in tooltip that appeared since Joomla 3.1.4
//		$document->addScript('https://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js');
		$document->addScript('https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js');
	}

	/**
	 * Google Maps api V3
	 */
	$curlang	= $document->language;
	$lang		= substr($curlang,0,2);
	$document->addScript('https://maps.googleapis.com/maps/api/js?sensor=false&language='.$lang);

	/**
	 * Script files which could be overridden into your site template.
	 * (eg. /templates/my_template/js/com_icagenda/FILE_NAME.js)
	 */
	JHtml::script( 'com_icagenda/timepicker.js', false, true );
	JHtml::script( 'com_icagenda/icdates.js', false, true );
	JHtml::script( 'com_icagenda/icmap.js', false, true );
	JHtml::script( 'com_icagenda/icform.js', false, true );
}
else
{
	if (defined('IC_LIBRARY')) $app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'warning');
	$app->redirect(htmlspecialchars_decode('index.php?option=com_icagenda&view=icagenda'));
}
components/com_icagenda/views/event/tmpl/index.html000060400000000032152453623450016551 0ustar00<html><body></body></html>components/com_icagenda/views/event/index.html000060400000000032152453623450015575 0ustar00<html><body></body></html>components/com_icagenda/views/mail/view.html.php000060400000006515152453623450016043 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.9 2015-07-30
 * @since       2.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * View class Admin - Mail Newsletter - iCagenda
 */
class iCagendaViewMail extends JViewLegacy
{
	protected $data;

	protected $state;

	protected $item;

	protected $form;

	/**
	 * Display the view
	 */
	public function display($tpl = null)
	{
		// Joomla 2.5
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			jimport( 'joomla.environment.request' );

			JHtml::stylesheet('com_icagenda/template.j25.css', false, true);
			JHtml::stylesheet('com_icagenda/icagenda-back.j25.css', false, true);

			JHtml::_('behavior.mootools');

			$app		= JFactory::getApplication();
			$document	= JFactory::getDocument();

			// load jQuery, if not loaded before
			$scripts = array_keys($document->_scripts);
			$scriptFound = false;

			for ($i = 0; $i < count($scripts); $i++)
			{
				if (stripos($scripts[$i], 'jquery.min.js') !== false
					|| stripos($scripts[$i], 'jquery.js') !== false)
				{
					$scriptFound = true;
				}
			}

			// jQuery Library Loader
			if (!$scriptFound)
			{
				// load jQuery, if not loaded before
				if (!$app->get('jquery'))
				{
					$app->set('jquery', true);

					// Add jQuery Library
					$document->addScript('https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js');
					JHtml::script('com_icagenda/jquery.noconflict.js', false, true);
				}
			}
		}

		$this->form		= $this->get('Form');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			JError::raiseError(500, implode("\n", $errors));

			return false;
		}

		$this->addToolbar();

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 */
	protected function addToolbar()
	{
		JRequest::setVar('hidemainmenu', true);

		$user	= JFactory::getUser();

		$canDo	= iCagendaHelper::getActions();

		// Set Title
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			JToolBarHelper::title(JText::_('COM_ICAGENDA_TITLE_MAIL'), 'mail.png');
		}
		else
		{
			JToolBarHelper::title('iCagenda <span style="font-size:14px;">- ' . JText::_('COM_ICAGENDA_TITLE_MAIL') . '</span>', 'mail');
		}

		$icTitle = JText::_('COM_ICAGENDA_TITLE_MAIL');

		$document	= JFactory::getDocument();
		$app		= JFactory::getApplication();
		$sitename	= $app->getCfg('sitename');
		$title		= $app->getCfg('sitename') . ' - ' . JText::_('JADMINISTRATION') . ' - iCagenda: ' . $icTitle;
		$document->setTitle($title);


		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			JToolBarHelper::custom('mail.send', 'forward.png', 'forward.png', 'ICAGENDA_JTOOLBAR_SEND', false );
		}
		else
		{
			JToolbarHelper::custom('mail.send', 'envelope.png', 'send_f2.png', 'ICAGENDA_JTOOLBAR_SEND', false);
		}

		JToolBarHelper::cancel('mail.cancel', 'JTOOLBAR_CLOSE');
	}
}
components/com_icagenda/views/mail/tmpl/edit.php000060400000012016152453623450016020 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.9 2015-07-30
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

JHtml::_('behavior.tooltip');
JHtml::_('behavior.keepalive');
JHtml::_('behavior.formvalidation');

if (version_compare(JVERSION, '3.0', 'ge'))
{
	JHtml::_('formbehavior.chosen', 'select');
}

$app = JFactory::getApplication();

//$session		= JFactory::getSession();
//$ic_newsletter	= $session->get('ic_newsletter', array());

$script = "\t" . 'Joomla.submitbutton = function(pressbutton) {' . "\n";
$script .= "\t\t" . 'var form = document.adminForm;' . "\n";
$script .= "\t\t" . 'if (pressbutton == \'mail.cancel\') {' . "\n";
$script .= "\t\t\t" . 'Joomla.submitform(pressbutton);' . "\n";
$script .= "\t\t\t" . 'return;' . "\n";
$script .= "\t\t" . '}' . "\n";
$script .= "\t\t" . '// do field validation' . "\n";
$script .= "\t\t" . 'if (form.jform_subject.value == ""){' . "\n";
$script .= "\t\t\t" . 'alert("' . JText::_('COM_ICAGENDA_NEWSLETTER_NO_OBJ_ALERT', true) . '");' . "\n";
$script .= "\t\t" . '} else if (getSelectedValue(\'adminForm\',\'jform[eventid]\') == ""){' . "\n";
$script .= "\t\t\t" . 'alert("' . JText::_('COM_ICAGENDA_NEWSLETTER_NO_EVENT_SELECTED', true) . '");' . "\n";
$script .= "\t\t" . '} else if (getSelectedValue(\'adminForm\',\'jform[date]\') == ""){' . "\n";
$script .= "\t\t\t" . 'alert("' . JText::_('COM_ICAGENDA_NEWSLETTER_NO_DATE_SELECTED', true) . '");' . "\n";
//$script .= "\t\t" . '} else if (form.jform_message.value == ""){' . "\n";
//$script .= "\t\t\t" . 'alert("' . JText::_('COM_ICAGENDA_NEWSLETTER_NO_BODY_ALERT', true) . '");' . "\n";
$script .= "\t\t" . '} else {' . "\n";
$script .= "\t\t\t" . 'Joomla.submitform(pressbutton);' . "\n";
$script .= "\t\t" . '}' . "\n";
$script .= "\t\t" . '}' . "\n";

//JFactory::getDocument()->addScriptDeclaration($script);

// Access Administration Newsletter check.
if (JFactory::getUser()->authorise('icagenda.access.newsletter', 'com_icagenda'))
{
	?>
	<!--script type="text/javascript">
		Joomla.submitbutton = function(task)
		{
			if (task == 'event.cancel' || document.formvalidator.isValid(document.id('event-form'))) {
				Joomla.submitform(task, document.getElementById('event-form'));
			}
			else {
				alert('<?php echo $this->escape(JText::_('JGLOBAL_VALIDATION_FORM_FAILED'));?>');
			}
		}
	</script-->

	<form action="<?php echo JRoute::_('index.php?option=com_icagenda&view=mail&layout=edit') ?>" method="post" name="adminForm" id="adminForm" class="form-validate" enctype="multipart/form-data">
		<div class="container">
			<!-- iCagenda Header -->
			<header>
				<h1>
					<?php echo JText::_('COM_ICAGENDA_TITLE_MAIL'); ?>&nbsp;<span>iCagenda</span>
				</h1>
				<h2>
					<?php echo JText::_('COM_ICAGENDA_COMPONENT_DESC'); ?>
					<!--nav class="iCheader-videos">
						<span style="font-variant:small-caps">Tutorial Videos</span>
						<a href="#">Video</a>
					</nav-->
				</h2>
			</header>

			<div>&nbsp;</div>

			<!-- Begin Content -->
			<h4><?php echo JText::_('COM_ICAGENDA_FORM_LBL_NEWSLETTER_LIST'); ?></h4>
			<div class="row-fluid">
				<div class="span12">
					<div class="span4 iCleft">
						<div class="control-group">
							<?php echo $this->form->getLabel('eventid'); ?>
							<div class="controls">
								<?php echo $this->form->getInput('eventid'); ?>
							</div>
						</div>
					</div>
					<div class="span4 iCleft">
						<div class="control-group">
							<?php echo $this->form->getLabel('date'); ?>
							<div class="controls">
								<?php echo $this->form->getInput('date'); ?>
							</div>
						</div>
					</div>
				</div>
			</div>
			<hr>
			<h4><?php echo JText::_('COM_ICAGENDA_TITLE_NEWSLETTER'); ?></h4>
			<div class="row-fluid">
				<div class="span12">
					<div class="control-group">
						<?php echo $this->form->getLabel('subject'); ?>
						<div class="controls">
							<?php echo $this->form->getInput('subject'); ?>
						</div>
					</div>
					<div class="control-group">
						<?php echo $this->form->getLabel('message'); ?>
						<div class="controls">
							<?php echo $this->form->getInput('message'); ?>
						</div>
					</div>
				</div>
			</div>
			<input type="hidden" name="option" value="com_icagenda" />
			<input type="hidden" name="task" value="" />
			<?php echo JHtml::_('form.token'); ?>
		</div>
		<div class="clr"></div>
	</form>
	<?php
}
else
{
	$app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'warning');
	$app->redirect(htmlspecialchars_decode('index.php?option=com_icagenda&view=icagenda'));
}
components/com_icagenda/views/mail/tmpl/index.html000060400000000032152453623450016352 0ustar00<html><body></body></html>components/com_icagenda/views/mail/index.html000060400000000032152453623450015376 0ustar00<html><body></body></html>components/com_icagenda/views/events/view.html.php000060400000016450152453623450016424 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.6 2015-06-22
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * View class Admin - List of Events - iCagenda.
 */
class iCagendaViewEvents extends JViewLegacy
{
	protected $params;
	protected $state;
	protected $items;
	protected $pagination;
	protected $categories;
	protected $upcoming;

	/**
	 * Display the view
	 */
	public function display($tpl = null)
	{
		$app = JFactory::getApplication();

		// Joomla 2.5
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			jimport( 'joomla.environment.request' );

			JHtml::stylesheet( 'com_icagenda/icagenda-back.j25.css', false, true );
		}

		$this->params		= JComponentHelper::getParams('com_icagenda');
		$this->state		= $this->get('State');
		$this->items		= $this->get('Items');
		$this->pagination	= $this->get('Pagination');

		$this->categories	= $this->get('Categories');
		$this->upcoming		= $this->get('Upcoming');
		$this->itemids		= $this->get('MenuItemID');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			JError::raiseError(500, implode("\n", $errors));
			return false;
		}

		$icagenda_categories = class_exists('icagendaCategories') ? icagendaCategories::getList('1') : false;

		if ( ! $icagenda_categories)
		{
			$app->enqueueMessage( JText::_('COM_ICAGENDA_ALERT_NO_CATEGORY_PUBLISHED')
								. '<br /><br /><a class="btn btn-success" href="index.php?option=com_icagenda&view=category&layout=edit" >'
								. JText::_('COM_ICAGENDA_LEGEND_NEW_CATEGORY') . '</a>'
								. ' <a class="btn btn-inverse btn-mini" href="index.php?option=com_icagenda&view=categories" >'
								. JText::_('ICCATEGORIES')
								. '</a>', 'warning' );
		}

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();

			if (version_compare(JVERSION, '3.0', 'ge'))
			{
				$this->sidebar = JHtmlSidebar::render();
			}
		}

		$canDo = iCagendaHelper::getActions();

		if (defined('IC_LIBRARY')
			&& $canDo->get('icagenda.access.events'))
		{
			parent::display($tpl);
		}
		else
		{
			if (defined('IC_LIBRARY')) $app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'warning');
			$app->redirect(htmlspecialchars_decode('index.php?option=com_icagenda&view=icagenda'));
		}
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @since	1.6
	 */
	protected function addToolbar()
	{
		require_once JPATH_COMPONENT . '/helpers/icagenda.php';

		$state					= $this->get('State');
		$user					= JFactory::getUser();
		$userId					= $user->get('id');
		$canDo					= iCagendaHelper::getActions();
		$icagenda_categories	= class_exists('icagendaCategories') ? icagendaCategories::getList() : false;

		// Set Title
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			JToolBarHelper::title('iCagenda - ' . JText::_('COM_ICAGENDA_TITLE_EVENTS'), 'events.png');
		}
		else
		{
			JToolBarHelper::title('iCagenda <span style="font-size:14px;">- ' . JText::_('COM_ICAGENDA_TITLE_EVENTS') . '</span>', 'calendar');
		}

		$icTitle = JText::_('COM_ICAGENDA_TITLE_EVENTS');

		$document		= JFactory::getDocument();
		$app			= JFactory::getApplication();
		$sitename		= $app->getCfg('sitename');
		$title			= $app->getCfg('sitename') . ' - ' . JText::_('JADMINISTRATION') . ' - iCagenda: ' . $icTitle;

		$document->setTitle($title);

		//Check if the form exists before showing the add/edit buttons
		$formPath = JPATH_COMPONENT_ADMINISTRATOR . '/views/event';

		if (file_exists($formPath)
			&& $icagenda_categories
			)
		{
			if ($canDo->get('core.create'))
			{
				JToolBarHelper::addNew('event.add','JTOOLBAR_NEW');
			}

			if ($canDo->get('core.edit') || $canDo->get('core.edit.own'))
			{
				JToolBarHelper::editList('event.edit');
			}

		}

		if ($canDo->get('core.edit.state')
			&& $icagenda_categories
			)
		{
			if (isset($this->items[0]->state))
			{
				JToolBarHelper::divider();
				JToolBarHelper::custom('events.publish', 'publish.png', 'publish_f2.png','JTOOLBAR_PUBLISH', true);
				JToolBarHelper::custom('events.unpublish', 'unpublish.png', 'unpublish_f2.png', 'JTOOLBAR_UNPUBLISH', true);
			}
			else
			{
				// If this component does not use state then show a direct delete button as we can not trash
				JToolBarHelper::deleteList('', 'events.delete','JTOOLBAR_DELETE');
			}

			if (isset($this->items[0]->state))
			{
				JToolBarHelper::divider();
				JToolBarHelper::archiveList('events.archive','JTOOLBAR_ARCHIVE');
			}

			if (isset($this->items[0]->checked_out))
			{
				JToolBarHelper::custom('events.checkin', 'checkin.png', 'checkin_f2.png', 'JTOOLBAR_CHECKIN', true);
			}
		}

		// Show trash and delete for components that uses the state field
		if (isset($this->items[0]->state)
			&& $icagenda_categories
			)
		{
			if ($state->get('filter.state') == -2 && $canDo->get('core.delete'))
			{
				JToolBarHelper::deleteList('', 'events.delete','JTOOLBAR_EMPTY_TRASH');
				JToolBarHelper::divider();
			}
			elseif ($canDo->get('core.edit.state'))
			{
				JToolBarHelper::trash('events.trash','JTOOLBAR_TRASH');
				JToolBarHelper::divider();
			}
		}

		if ($canDo->get('core.admin'))
		{
			JToolBarHelper::preferences('com_icagenda');
		}

		if (version_compare(JVERSION, '3.0', 'ge'))
		{
			JHtmlSidebar::setAction('index.php?option=com_icagenda&view=events');

			JHtmlSidebar::addFilter(
				JText::_('COM_ICAGENDA_SELECT_STATE'),
				'filter_published',
				JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.state'), true)
			);
			JHtmlSidebar::addFilter(
				JText::_('COM_ICAGENDA_SELECT_CATEGORY'),
				'filter_category',
				JHtml::_('select.options', $this->get('Categories'), 'value', 'text', $this->state->get('filter.category'), true)
			);
			JHtmlSidebar::addFilter(
				JText::_('COM_ICAGENDA_SELECT_DATES'),
				'filter_upcoming',
				JHtml::_('select.options', $this->get('Upcoming'), 'value', 'text', $this->state->get('filter.upcoming'), true)
			);
			JHtmlSidebar::addFilter(
				JText::_('COM_ICAGENDA_SELECT_SITE_ITEMID'),
				'filter_site_itemid',
				JHtml::_('select.options', $this->get('MenuItemID'), 'value', 'text', $this->state->get('filter.site_itemid'), true)
			);
		}
	}

	/**
	 * Method to save the submitted ordering values for records via AJAX.
	 *
	 * @return    void
	 *
	 * @since   3.0
	 */
	public function saveOrderAjax()
	{
		// Get the input
		$input	= JFactory::getApplication()->input;
		$pks	= $input->post->get('cid', array(), 'array');
		$order	= $input->post->get('order', array(), 'array');

		// Sanitize the input
		JArrayHelper::toInteger($pks);
		JArrayHelper::toInteger($order);

		// Get the model
		$model	= $this->getModel();

		// Save the ordering
		$return	= $model->saveorder($pks, $order);

		if ($return)
		{
			echo "1";
		}

		// Close the application
		JFactory::getApplication()->close();
	}
}
components/com_icagenda/views/events/tmpl/default.php000060400000064400152453623450017105 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.6 2015-06-29
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

JHtml::_('behavior.modal');
JHtml::_('behavior.multiselect');

$app		= JFactory::getApplication();
$user		= JFactory::getUser();
$userId		= $user->get('id');
$listOrder	= $this->state->get('list.ordering');
$listDirn	= $this->state->get('list.direction');
$canOrder	= $user->authorise('core.edit.state', 'com_icagenda');
$saveOrder	= $listOrder == 'a.ordering';

// Switch Joomla 2.5 / 3.x
if (version_compare(JVERSION, '3.0', 'lt'))
{
	JHtml::_('behavior.tooltip');
}
else
{
	// Include the component HTML helpers.
	JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');
	JHtml::_('bootstrap.tooltip');
	JHtml::_('formbehavior.chosen', 'select');
	JHtml::_('dropdown.init');

	$archived	= $this->state->get('filter.published') == 2 ? true : false;
	$trashed	= $this->state->get('filter.published') == -2 ? true : false;

	if ($saveOrder)
	{
		$saveOrderingUrl = 'index.php?option=com_icagenda&task=events.saveOrderAjax&tmpl=component';
		JHtml::_('sortablelist.sortable', 'eventsList', 'adminForm', strtolower($listDirn), $saveOrderingUrl);
	}
}

// Check if GD is enabled
if (extension_loaded('gd') && function_exists('gd_info'))
{
	$thumb_generator = $this->params->get('thumb_generator', 1);
//	echo "It looks like GD is installed";
}
else
{
	$thumb_generator = 0;
	JError::raiseWarning('101', JText::_('COM_ICAGENDA_PHP_ERROR_GD'));
}

// Check if fopen is allowed
$fopen = true;
$result = ini_get('allow_url_fopen');

if (empty($result))
{
	JError::raiseWarning('101', JText::_('COM_ICAGENDA_PHP_ERROR_FOPEN'));
	$fopen = false;
}

// 3.3.3
$sortFields = array();
?>
<form action="<?php echo JRoute::_('index.php?option=com_icagenda&view=events'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty($this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>

	<!-- Filters Joomla 2.5 (DEPRECATED iCagenda 3.7.x and after) -->
	<?php if (version_compare(JVERSION, '3.0', 'lt')) : ?>

		<fieldset id="filter-bar">
			<div class="filter-search fltlft">
				<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
				<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('Search'); ?>" />
				<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
				<button type="button" onclick="document.id('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
			</div>
			<div class="filter-select fltrt">
				<select name="filter_published" class="inputbox" onchange="this.form.submit()">
					<option value=""><?php echo JText::_('COM_ICAGENDA_SELECT_STATE');?></option>
					<?php echo JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), "value", "text", $this->state->get('filter.state'), true);?>
				</select>

				<select name="filter_category" class="inputbox" onchange="this.form.submit()">
					<option value=""><?php echo JText::_('COM_ICAGENDA_SELECT_CATEGORY');?></option>
					<?php echo JHtml::_('select.options', $this->categories, 'value', 'text', $this->state->get('filter.category'));?>
				</select>

				<select name="filter_upcoming" class="inputbox" onchange="this.form.submit()">
					<option value=""><?php echo JText::_('COM_ICAGENDA_SELECT_DATES');?></option>
					<?php echo JHtml::_('select.options', $this->upcoming, 'value', 'text', $this->state->get('filter.upcoming'));?>
				</select>

				<select name="filter_site_itemid" class="inputbox" onchange="this.form.submit()">
					<option value=""><?php echo JText::_('COM_ICAGENDA_SELECT_SITE_ITEMID');?></option>
					<?php echo JHtml::_('select.options', $this->itemids, 'value', 'text', $this->state->get('filter.site_itemid'));?>
				</select>
			</div>
		</fieldset>
		<div class="clr"> </div>

	<!-- Search Tools Joomla 3 -->
	<?php else : ?>

		<div id="filter-bar" class="btn-toolbar">
			<div class="filter-search btn-group pull-left">
				<label for="filter_search" class="element-invisible"><?php echo JText::_('COM_ICAGENDA_FILTER_SEARCH_EVENTS_DESC'); ?></label>
				<input type="text" name="filter_search" placeholder="<?php echo JText::_('COM_ICAGENDA_FILTER_SEARCH_EVENTS_DESC'); ?>" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('COM_ICAGENDA_FILTER_SEARCH_EVENTS_DESC'); ?>" />
			</div>
			<div class="btn-group pull-left">
				<button class="btn tip hasTooltip" type="submit" title="<?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?>"><i class="icon-search"></i></button>
				<button class="btn tip hasTooltip" type="button" onclick="document.id('filter_search').value='';this.form.submit();" title="<?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?>"><i class="icon-remove"></i></button>
			</div>
			<div class="btn-group pull-right hidden-phone">
				<label for="limit" class="element-invisible"><?php echo JText::_('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC'); ?></label>
				<?php echo $this->pagination->getLimitBox(); ?>
			</div>
		</div>
		<div class="clearfix"> </div>

	<?php endif;?>

	<?php if(version_compare(JVERSION, '3.0', 'lt')) : ?>
		<table class="adminlist">
	<?php else : ?>
		<table class="table table-striped" id="eventsList">
	<?php endif; ?>
			<!-- START HEAD -->
			<thead>
				<tr>

				<?php if(version_compare(JVERSION, '3.0', 'ge')) : ?>
					<!-- Ordering HEADER Joomla 3.x -->
					<th width="1%" class="nowrap center hidden-phone">
						<?php echo JHtml::_('grid.sort', '<i class="icon-menu-2"></i>', 'a.ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING'); ?>
					</th>
				<?php endif; ?>

					<!-- CheckBox HEADER -->
					<th width="1%" class="hidden-phone">
						<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
					</th>

					<!-- Status HEADER -->
					<th width="1%" style="min-width:55px" class="nowrap center">
						<?php echo JHtml::_('grid.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
					</th>

					<!-- Approval HEADER -->
					<th width="1%" style="min-width:55px" class="nowrap center">
						<?php echo JHtml::_('grid.sort', 'COM_ICAGENDA_EVENTS_APPROVAL', 'a.approval', $listDirn, $listOrder); ?>
					</th>

					<!-- Image HEADER -->
					<th width="130px" class="nowrap center hidden-phone">
						<?php echo JHtml::_('grid.sort', 'COM_ICAGENDA_EVENTS_IMAGE', 'a.image', $listDirn, $listOrder); ?>
					</th>

					<!-- Title HEADER -->
					<th>
						<?php echo JHtml::_('grid.sort', 'COM_ICAGENDA_EVENTS_TITLE', 'a.title', $listDirn, $listOrder); ?> |
						<?php echo JHtml::_('grid.sort', 'COM_ICAGENDA_TITLE_CATEGORY', 'category', $listDirn, $listOrder); ?>
						<?php //echo JHtml::_('grid.sort', 'COM_ICAGENDA_FORM_FRONTEND_SUBMIT_ITEMID_LBL', 'a.site_itemid', $listDirn, $listOrder); ?>
					</th>

					<!-- Image HEADER -->
					<th width="15%" class="nowrap hidden-phone">
						<?php echo JHtml::_('grid.sort',  'COM_ICAGENDA_EVENTS_NEXT', 'a.next', $listDirn, $listOrder); ?>
					</th>

				<?php if(version_compare(JVERSION, '3.0', 'lt')) : ?>
					<!-- Ordering HEADER Joomla 2.5 -->
					<?php if (isset($this->items[0]->ordering)) { ?>
					<th width="10%">
						<?php echo JHtml::_('grid.sort',  'JGRID_HEADING_ORDERING', 'a.ordering', $listDirn, $listOrder); ?>
						<?php if ($canOrder && $saveOrder) :?>
							<?php echo JHtml::_('grid.order',  $this->items, 'filesave.png', 'events.saveorder'); ?>
						<?php endif; ?>
					</th>
					<?php } ?>
				<?php endif; ?>

					<!-- Access HEADER -->
					<th width="10%" class="nowrap hidden-phone">
						<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ACCESS', 'access', $listDirn, $listOrder); ?>
					</th>

					<!-- Author HEADER -->
					<th width="10%" class="nowrap hidden-phone">
						<?php echo JHtml::_('grid.sort',  'JAUTHOR', 'a.username', $listDirn, $listOrder); ?>
					</th>

					<!-- Language HEADER -->
					<th width="5%" class="nowrap hidden-phone">
						<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_LANGUAGE', 'language', $listDirn, $listOrder); ?>
					</th>

					<!-- ID HEADER -->
					<th width="1%" class="nowrap hidden-phone">
						<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
					</th>

				</tr>
			</thead>
			<!-- END HEAD -->

			<!-- START FOOT -->
			<tfoot>
				<tr>
					<td colspan="12">
						<?php echo $this->pagination->getListFooter(); ?>
					</td>
				</tr>
			</tfoot>
			<!-- END FOOT -->

			<!-- START BODY -->
			<tbody valign="top">
			<?php foreach ($this->items as $i => $item) : ?>
				<?php
				$ordering	= ($listOrder == 'a.ordering');
				$canCreate	= $user->authorise('core.create', 'com_icagenda');
				$canEdit	= $user->authorise('core.edit', 'com_icagenda');
				$canCheckin	= $user->authorise('core.manage', 'com_icagenda') || $item->checked_out == $userId || $item->checked_out == 0;
				$canChange	= $user->authorise('core.edit.state', 'com_icagenda') && $canCheckin;
				$canEditOwn	= $user->authorise('core.edit.own', 'com_icagenda') && $item->created_by == $userId;
//				$canEditOwn = $user->authorise('core.edit.own', 'com_icagenda.events.'.$item->id) && $item->created_by == $userId;

				// Get Access Names
				$db = JFactory::getDBO();
				$db->setQuery(
					'SELECT `title`' .
					' FROM `#__viewlevels`' .
					' WHERE `id` = '. (int) $item->access
				);
				$access_title = $db->loadObject()->title;

				// Get Today and Next Date (Y-m-d)
				$eventTimeZone	= null;
				$today			= JHtml::date('now', 'Y-m-d');
				$nextdate		= JHtml::date($item->next, 'Y-m-d', $eventTimeZone);
				$isDate			= iCDate::isDate($item->next);
				?>
				<tr class="row<?php echo $i % 2; ?>" sortable-group-id="<?php echo $item->catid?>">

					<!-- Ordering Joomla 3.x -->
				<?php if(version_compare(JVERSION, '3.0', 'ge')) : ?>
					<td class="order nowrap center hidden-phone">
					<?php if ($canChange) :
						$disableClassName = '';
						$disabledLabel	  = '';

						if ( ! $saveOrder) :
							$disabledLabel    = JText::_('JORDERINGDISABLED');
							$disableClassName = 'inactive tip-top';
						endif; ?>
						<span class="sortable-handler hasTooltip <?php echo $disableClassName; ?>" title="<?php echo $disabledLabel; ?>">
							<i class="icon-menu"></i>
						</span>
						<input type="text" style="display:none" name="order[]" size="5" value="<?php echo $item->ordering; ?>" class="width-20 text-area-order " />
					<?php else : ?>
						<span class="sortable-handler inactive" >
							<i class="icon-menu"></i>
						</span>
					<?php endif; ?>
					</td>
				<?php endif; ?>

					<!-- CheckBox Joomla -->
					<td class="center hidden-phone">
						<?php echo JHtml::_('grid.id', $i, $item->id); ?>
					</td>

					<!-- Status Joomla -->
				<?php if (isset($this->items[0]->state)) : ?>
					<td class="center">
						<?php
						// Control of dates if valid (EDIT SINCE VERSION 3.0)
						if ( ! $isDate)
						{
							echo '<br/><i class="icon-warning"></i><br/>';
							echo '<span style="color:red;"><strong>' . JText::_('COM_ICAGENDA_NO_VALID_DATE') . '</strong></span>';
							if ($item->state == '1')
							{
								//$state = 0;
								$db		= Jfactory::getDbo();
								$query	= $db->getQuery(true);
								$query->clear();
								$query->update(' #__icagenda_events ');
								$query->set(' state = 0 ' );
								$query->where(' id = ' . (int) $item->id );
								$db->setQuery((string)$query);
								$db->query($query);
 							}
						}
						else
						{
							echo JHtml::_('jgrid.published', $item->state, $i, 'events.', $canChange, 'cb');
						}
						?>
					</td>
					<td class="center">
						<?php
						require_once JPATH_COMPONENT .'/helpers/html/events.php';
						$approved = empty( $item->approval ) ? 0 : 1;
						echo JHtml::_('jgrid.state', JHtmlEvents::approveEvents(), $approved, $i, 'events.', (boolean) $approved);
						?>
						<?php
						//require_once JPATH_COMPONENT .'/helpers/approved.php';
						//echo JHtml::_('approved.approved', $item->approval, $i, 'events.'); ?>
						<?php //echo JHtml::_('approved.approved', $item->approval, $i); ?>
						<?php //echo icHtmlHelper::approveEvent($item->approval, $i, 'events', $canChange, 'cb'); ?>
					</td>
				<?php endif; ?>

					<!-- Image Joomla -->
					<td class="small hidden-phone">
						<div style="background:#F4F4F4; padding:5px; width:120px; text-align:center; overflow:hidden;">
							<?php
							// Set if run iCthumb
							if (($item->image) && ($thumb_generator == 1))
							{
								// Get media path
								$params_media = JComponentHelper::getParams('com_media');
								$image_path = $params_media->get('image_path', 'images');

								// Paths to thumbs folder
								$thumbsPath 			= $image_path.'/icagenda/thumbs';

								// Large Size Options
								$l_thumbOptions		= $this->params->get('thumb_large');
								$l_width			= is_numeric($l_thumbOptions[0]) ? $l_thumbOptions[0] : '900';
								$l_height			= is_numeric($l_thumbOptions[1]) ? $l_thumbOptions[1] : '600';
								$l_quality			= is_numeric($l_thumbOptions[2]) ? $l_thumbOptions[2] : '100';
								$l_crop				= ! empty($l_thumbOptions[3]) ? true : false;

								// Medium Size Options
								$m_thumbOptions		= $this->params->get('thumb_medium');
								$m_width			= is_numeric($m_thumbOptions[0]) ? $l_thumbOptions[0] : '300';
								$m_height			= is_numeric($m_thumbOptions[1]) ? $l_thumbOptions[1] : '300';
								$m_quality			= is_numeric($m_thumbOptions[2]) ? $l_thumbOptions[2] : '100';
								$m_crop				= ! empty($m_thumbOptions[3]) ? true : false;

								// Small Size Options
								$s_thumbOptions		= $this->params->get('thumb_small');
								$s_width			= is_numeric($s_thumbOptions[0]) ? $s_thumbOptions[0] : '100';
								$s_height			= is_numeric($s_thumbOptions[1]) ? $s_thumbOptions[1] : '100';
								$s_quality			= is_numeric($s_thumbOptions[2]) ? $s_thumbOptions[2] : '100';
								$s_crop				= ! empty($s_thumbOptions[3]) ? true : false;

								// XSmall Size Options
								$xs_thumbOptions	= $this->params->get('thumb_xsmall');
								$xs_width			= is_numeric($xs_thumbOptions[0]) ? $xs_thumbOptions[0] : '48';
								$xs_height			= is_numeric($xs_thumbOptions[1]) ? $xs_thumbOptions[1] : '48';
								$xs_quality			= is_numeric($xs_thumbOptions[2]) ? $xs_thumbOptions[2] : '80';
								$xs_crop			= ! empty($xs_thumbOptions[3]) ? true : false;

								// Generate large thumb if not exist
								iCThumbGet::thumbnail($item->image, $thumbsPath, 'themes',
									$l_width, $l_height, $l_quality, $l_crop, 'ic_large', null, true);

								// Generate medium thumb if not exist
								iCThumbGet::thumbnail($item->image, $thumbsPath, 'themes',
									$m_width, $m_height, $m_quality, $m_crop, 'ic_medium');

								// Generate small thumb if not exist
								iCThumbGet::thumbnail($item->image, $thumbsPath, 'themes',
									$s_width, $s_height, $s_quality, $s_crop, 'ic_small');

								// Generate x-small thumb if not exist
								iCThumbGet::thumbnail($item->image, $thumbsPath, 'themes',
									$xs_width, $xs_height, $xs_quality, $xs_crop, 'ic_xsmall');

								// Sub-folder Destination ($thumbsPath / 'subfolder' /)
								$subFolder = 'system';

								// Display thumbnail in admin events list
								echo iCThumbGet::thumbnailImgTagLinkModal($item->image, $thumbsPath, $subFolder, '120', '100', '100', false);
							}
							elseif ($item->image
								&& $thumb_generator == 0)
							{
								if (filter_var($item->image, FILTER_VALIDATE_URL))
								{
									echo '<a href="' . $item->image . '" class="modal">';
									echo '<img src="' . $item->image . '" alt="" /></a>';
								}
								else
								{
									echo '<a href="../' . $item->image . '" class="modal">';
									echo '<img src="../' . $item->image . '" alt="" /></a>';
								}
							}
							else
							{
								echo '<img style="max-width:120px; max-height:100px;" src="../media/com_icagenda/images/nophoto.jpg" alt="" />';
							}
							// END iCthumb
							?>
						</div>
					</td>

					<!-- Title & Category -->
					<td class="has-context">
						<div class="pull-left">
							<?php if ($item->checked_out) : ?>
								<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'events.', $canCheckin); ?>
							<?php endif; ?>
							<?php if ($item->language == '*'):?>
								<?php $language = JText::alt('JALL', 'language'); ?>
							<?php else:?>
								<?php $language = $item->language ? $this->escape($item->language) : JText::_('JUNDEFINED'); ?>
							<?php endif;?>
							<?php if ($canEdit || $canEditOwn) : ?>
								<a href="<?php echo JRoute::_('index.php?option=com_icagenda&task=event.edit&id=' . $item->id); ?>" title="<?php echo JText::_('JACTION_EDIT'); ?>">
									<?php echo $this->escape($item->title); ?></a>
							<?php else : ?>
								<span title="<?php echo JText::sprintf('JFIELD_ALIAS_LABEL', $this->escape($item->alias)); ?>"><?php echo $this->escape($item->title); ?></span>
							<?php endif; ?>
							<div class="small">
								<?php echo JText::_('JCATEGORY') . ": " . $this->escape($item->category); ?>
							</div>
							<?php if (($item->place) OR ($item->city) OR ($item->country)) : ?>
							<p>
								<?php if ($item->place) : ?>
								<div class="small iC-italic-grey">
									<?php echo JText::_('COM_ICAGENDA_TITLE_LOCATION') . ": " . $this->escape($item->place); ?>
								</div>
								<?php endif; ?>
								<?php if ($item->city) : ?>
								<div class="small iC-italic-grey">
									<?php echo JText::_('COM_ICAGENDA_FORM_LBL_EVENT_CITY') . ": " . $this->escape($item->city); ?>
								</div>
								<?php endif; ?>
								<?php if ($item->country) : ?>
								<div class="small iC-italic-grey">
									<?php echo JText::_('COM_ICAGENDA_FORM_LBL_EVENT_COUNTRY') . ": " . $this->escape($item->country); ?>
								</div>
							</p>
							<?php endif; ?>
							<?php endif; ?>
							<?php if (!empty($item->site_itemid)) : ?>
							<a class="hasTooltip" href="<?php echo JURI::root() . 'index.php?option=com_icagenda&view=submit&Itemid=' . $item->site_itemid; ?>" title="<?php echo JText::_('COM_ICAGENDA_FORM_FRONTEND_SUBMIT_ITEMID_DESC'); ?>" target="_blank">
								<div class="btn btn-primary btn-mini">
									<?php echo JText::_('COM_ICAGENDA_FORM_FRONTEND_SUBMIT_ITEMID_LBL') . ": " . $this->escape($item->site_itemid); ?>
								</div>
							</a>
							<?php endif; ?>
						</div>

					<?php if(version_compare(JVERSION, '3.0', 'ge')) : ?>

						<!-- DropDown Edit Joomla 3 -->
						<div class="pull-left">
							<?php
							if ($canChange || $canEditOwn)
							{
								// Create dropdown items
								JHtml::_('dropdown.edit', $item->id, 'event.');
								JHtml::_('dropdown.divider');

								if ($item->state) :
									JHtml::_('dropdown.unpublish', 'cb' . $i, 'events.');
								else :
									JHtml::_('dropdown.publish', 'cb' . $i, 'events.');
								endif;

//								if ($item->featured) :
//									JHtml::_('dropdown.unfeatured', 'cb' . $i, 'events.');
//								else :
//									JHtml::_('dropdown.featured', 'cb' . $i, 'events.');
//								endif;

								JHtml::_('dropdown.divider');

								if ($archived) :
									JHtml::_('dropdown.unarchive', 'cb' . $i, 'events.');
								else :
									JHtml::_('dropdown.archive', 'cb' . $i, 'events.');
								endif;

								if ($item->checked_out) :
									JHtml::_('dropdown.checkin', 'cb' . $i, 'events.');
								endif;

								if ($trashed) :
									JHtml::_('dropdown.untrash', 'cb' . $i, 'events.');
								else :
									JHtml::_('dropdown.trash', 'cb' . $i, 'events.');
								endif;

								// Render dropdown list
								echo JHtml::_('dropdown.render');
							}
							?>
						</div>

					<?php endif; ?>

					</td>

					<!-- Dates -->
					<td class="small hidden-phone">
						<?php
						$date_format_global	= $this->params->get('date_format_global', 'Y - m - d');
						$separator			= $this->params->get('date_separator', ' ');
						$eventDate			= iCGlobalize::dateFormat($item->next, $date_format_global, $separator);
						$eventTime			= $item->displaytime ? ' - ' . JHtml::date($item->next, 'H:i', null) : '';
						$eventDate			= $eventDate ? $eventDate : date('Y-m-d', strtotime($item->next));
						$dateshow			= $eventDate . $eventTime;

						// Upcoming Next Date
						if (iCDate::isDate($item->next))
						{
							if ($nextdate > $today)
							{
								echo '<div class="ic-nextdate ic-upcoming">';
								echo JText::_('COM_ICAGENDA_EVENTS_NEXT_FUTUR') . '<br />';
								echo '<center>' . $dateshow . '</center>';
								echo '</div>';
							}
							// Next Date is today
							elseif ($nextdate == $today)
							{
								echo '<div class="ic-nextdate ic-today">';
								echo JText::_('COM_ICAGENDA_EVENTS_NEXT_TODAY') . '<br />';
								echo '<center>' . $dateshow . '</center>';
								echo '</div>';
							}
							elseif ($nextdate < $today)
							{
								echo '<div class="ic-nextdate ic-past">';
								echo JText::_('COM_ICAGENDA_EVENTS_NEXT_PAST') . '<br />';
								echo '<center>' . $dateshow . '</center>';
								echo '</div>';
							}
						}
						else
						{
							echo '<div class="ic-nextdate ic-no-date">';
							echo JText::_('COM_ICAGENDA_EVENTS_NEXT_ALERT');
							echo '</div>';
						}
						?>
					</td>


				<?php if(version_compare(JVERSION, '3.0', 'lt')) : ?>

					<!-- Ordering Joomla 2.5 -->
				<?php if (isset($this->items[0]->ordering)) : ?>
					<td class="order">
						<?php if ($canChange) : ?>
							<?php if ($saveOrder) :?>
								<?php if ($listDirn == 'asc') : ?>
									<span><?php echo $this->pagination->orderUpIcon($i, true, 'events.orderup', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
									<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, true, 'events.orderdown', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
								<?php elseif ($listDirn == 'desc') : ?>
									<span><?php echo $this->pagination->orderUpIcon($i, true, 'events.orderdown', 'JLIB_HTML_MOVE_UP', $ordering); ?></span>
									<span><?php echo $this->pagination->orderDownIcon($i, $this->pagination->total, true, 'events.orderup', 'JLIB_HTML_MOVE_DOWN', $ordering); ?></span>
								<?php endif; ?>
							<?php endif; ?>
							<?php $disabled = $saveOrder ?  '' : 'disabled="disabled"'; ?>
							<input type="text" name="order[]" size="5" value="<?php echo $item->ordering;?>" <?php echo $disabled ?> class="text-area-order" />
						<?php else : ?>
							<?php echo $item->ordering; ?>
						<?php endif; ?>
					</td>
				<?php endif; ?>

				<?php endif; ?>

					<!-- Access -->
					<td class="small hidden-phone">
						<?php echo $this->escape($access_title); ?>
					</td>

					<!-- Username -->
					<td class="small hidden-phone">
						<?php
						if ($item->username == '' && ! $item->created_by)
						{
							$undefined = '<i>' . JText::_('JUNDEFINED') . '</i>';
							echo $undefined;
						}
						elseif ( ! $item->created_by || ! $item->author_name)
						{
							echo $this->escape($item->username);
						}
						else
						{
							echo $this->escape($item->author_name);
							echo ' [' . $this->escape($item->author_username) . ']';
						}
						?>
						<?php //echo JText::_('JGLOBAL_USERNAME').': '.$this->escape($username); ?>
						<?php if ($item->created_by_alias) : ?>
						<p class="smallsub">
							<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->created_by_alias)); ?>
						</p>
						<?php endif; ?>
					</td>

					<!-- Language -->
					<td class="small hidden-phone">
						<?php if ($item->language == '*'):?>
							<?php echo JText::alt('JALL', 'language'); ?>
						<?php else:?>
							<?php echo $item->language ? $this->escape($item->language) : JText::_('JUNDEFINED'); ?>
						<?php endif; ?>
					</td>

					<!-- ID -->
					<?php if (isset($this->items[0]->id)) : ?>
					<td class="center hidden-phone">
						<?php echo (int) $item->id; ?>
					</td>
					<?php endif; ?>

				</tr>
			<?php endforeach;

			// Old Joomla versions asset_id issue. (all Joomla 2.5.x versions, and Joomla 3 NOT updated!)
			$asset_issue = version_compare(JVERSION, '3.0', 'lt') ? true : false;

			if ($asset_issue)
			{
				$ia = '0';
				unset($msg);
				unset($type);
				$msg = $type = $front_submit = '';
				$edittx = '<b>' . JText::_( 'JACTION_EDIT' ) . '</b>';
				$savetx = '<b>' . JText::_( 'JSAVE' ) . '</b>';

				foreach ($this->items as $i => $item)
				{
					if (($item->asset_id == '0') && ($item->state == '-2'))
					{
						$ia = $ia+1;
						$front_submit = '1';
					}
				}

				if ($front_submit == 1 && $ia == 1)
				{
					$app->enqueueMessage(JText::sprintf( 'COM_ICAGENDA_TRASH_FRONTEND_SUBMITTED_1', $edittx, $savetx ), 'notice');
				}
				elseif ($front_submit == 1 && $ia > 1)
				{
					$app->enqueueMessage(JText::sprintf( 'COM_ICAGENDA_TRASH_FRONTEND_SUBMITTED', $edittx, $savetx ), 'notice');
				}

				foreach ($this->items as $i => $item)
				{
					if ($item->asset_id == '0' && $item->state == '-2')
					{
						$editLink = 'index.php?option=com_icagenda&task=event.edit&id=' . $item->id;
						$msg	= '- ' . $item->title . ' [' . $item->id . '] : <a href="' . $editLink . '"><b>'.JText::_( 'JACTION_EDIT' ).'</b></a>';
						$type	= JText::_( 'JGLOBAL_LIST' ).' :';
					}
					if ( ! empty($msg))
					{
						$app->enqueueMessage($msg, $type);
					}
				}
			}
			?>
			</tbody>
			<!-- END BODY -->

		</table>
		<div>
			<input type="hidden" name="task" value="" />
			<input type="hidden" name="boxchecked" value="0" />
			<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
			<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
			<?php echo JHtml::_('form.token'); ?>
		</div>
	</div>
</form>
components/com_icagenda/views/events/tmpl/index.html000060400000000122152453623450016734 0ustar00<html><body>

<img src="thumb.php?src=nophoto.jpg&x=50&y=50&f=0">

</body></html>
components/com_icagenda/views/events/index.html000060400000000032152453623450015760 0ustar00<html><body></body></html>components/com_icagenda/views/icagenda/view.html.php000060400000007474152453623450016661 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.6 2015-06-27
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport( 'joomla.filesystem.path' );

// Access check.
if (JFactory::getUser()->authorise('core.admin', 'com_icagenda'))
{
	JToolBarHelper::preferences('com_icagenda');
}

/**
 * View class for a list of iCagenda.
 */
class iCagendaViewicagenda extends JViewLegacy
{
	/**
	 * Display the view
	 * @since	1.0
	 */
	public function display($tpl = null)
	{
		$document = JFactory::getDocument();

		// Joomla 2.5
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			JHtml::stylesheet('com_icagenda/template.j25.css', false, true);
			JHtml::stylesheet('com_icagenda/icagenda-back.j25.css', false, true);

			JHTML::_('behavior.tooltip');
			JHTML::_('behavior.modal');
			$document->addScript( JURI::root( true ) . '/media/com_icagenda/js/template.js' );
			jimport( 'joomla.filesystem.path' );
		}
		// Joomla 3
		else
		{
 			JHtml::_('behavior.modal');
		}

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			JError::raiseError(500, implode("\n", $errors));
			return false;
		}

		$this->addToolbar();

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @since	1.0
	 */
	protected function addToolbar()
	{
		require_once JPATH_COMPONENT . '/helpers/icagenda.php';

		$document	= JFactory::getDocument();
		$app		= JFactory::getApplication();

		$state	= $this->get('State');
		$canDo	= iCagendaHelper::getActions($state->get('filter.category_id'));

		//JToolBarHelper::title(JText::_('COM_ICAGENDA_TITLE_ICAGENDA_IMAGE'));
		// Set Title
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			JToolBarHelper::title(JText::_('COM_ICAGENDA_TITLE_ICAGENDA_IMAGE'));
		}
		else
		{
			$logo_icagenda_url = '../media/com_icagenda/images/iconicagenda36.png';

			if (file_exists($logo_icagenda_url))
			{
				$logo_icagenda = '<img src="' . $logo_icagenda_url . '" height="36px" alt="iCagenda" />';
			}
			else
			{
				$logo_icagenda = 'iCagenda :: ' . JText::_('COM_ICAGENDA_TITLE_ICAGENDA') . '';
			}

			JToolBarHelper::title($logo_icagenda, 'icagenda');
		}

		$icTitle = JText::_('COM_ICAGENDA_TITLE_ICAGENDA');

		$sitename = $app->getCfg('sitename');
		$title = $app->getCfg('sitename') . ' - ' . JText::_('JADMINISTRATION') . ' - iCagenda: ' . $icTitle;
		$document->setTitle($title);
	}

	/**
	 * Save iCagenda Params
	 *
	 * Update Database
	 *
	 * @since   3.3.8
	 */
	public function saveDefault($var, $name, $value)
	{
		if ($var)
		{
			$params[$name] = $value;

			$this->updateParams( $params );
		}
	}

	/**
	 * Update iCagenda Params
	 *
	 * Update Database
	 *
	 * @since   3.3.8
	 */
	protected function updateParams($params_array)
	{
		// read the existing component value(s)
		$db = JFactory::getDbo();
		$db->setQuery('SELECT params FROM #__icagenda WHERE id = "3"');
		$params = json_decode( $db->loadResult(), true );

		// add the new variable(s) to the existing one(s)
		foreach ( $params_array as $name => $value )
		{
			$params[ (string) $name ] = $value;
		}

		// store the combined new and existing values back as a JSON string
		$paramsString = json_encode( $params );
		$db->setQuery('UPDATE #__icagenda SET params = ' .
		$db->quote( $paramsString ) . ' WHERE id = "3"' );
		$db->query();
	}
}
components/com_icagenda/views/icagenda/index.html000060400000000032152453623450016207 0ustar00<html><body></body></html>components/com_icagenda/views/icagenda/tmpl/default.php000060400000113412152453623450017332 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.10 2015-08-15
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

// Check Theme Packs Compatibility (to be changed to a little note button with modal)
//if (class_exists('icagendaTheme')) icagendaTheme::checkThemePacks();

$user		= JFactory::getUser();
$userId		= $user->get('id');

$params		= JComponentHelper::getParams( 'com_icagenda' );
$version	= $params->get('version');
$icsys		= $params->get('icsys');
$translator	= JText::_('COM_ICAGENDA_TRANSLATOR');

if (version_compare(phpversion(), '5.3.10', '<'))
{
	$JoomlaRecommended = '5.4 +';

	// Get Application
	$app = JFactory::getApplication();

	$icon_warning = (version_compare(JVERSION, '3.0', 'lt')) ? '' : '<span class="icon-warning"></span>';

	$php_warning_msg = '<strong> ' . JText::sprintf('COM_ICAGENDA_YOUR_PHP_VERSION_IS', phpversion()) . '</strong><br />';
	$php_warning_msg.= JText::sprintf('COM_ICAGENDA_PHP_VERSION_JOOMLA_RECOMMENDED', $JoomlaRecommended);
	$php_warning_msg.= ' ( ' . JText::_('IC_READMORE') . ': ';
	$php_warning_msg.= '<a href="http://www.joomla.org/technical-requirements.html"';
	$php_warning_msg.= ' target="_blank">http://www.joomla.org/technical-requirements.html</a> )<br />';
	$php_warning_msg.= JText::_('COM_ICAGENDA_PHP_VERSION_ICAGENDA_RECOMMENDATION');

	$app->enqueueMessage( $icon_warning . $php_warning_msg, 'error' );
}
?>
<div id="j-main-container">
	<?php JHtml::_('behavior.modal'); ?>
	<!-- Start Content -->
	<div class="row-fluid icpanel">
		<div class="span12">
			<div class="row-fluid">
				<div class="span6">
					<div class="row-fluid">
						<?php if ( $user->authorise('icagenda.access.categories', 'com_icagenda') ) : ?>
						<div class="span6" style="text-align: center">
							<table>
								<tbody>
									<tr>
										<td colspan="2">
											<h3><?php echo JText::_('COM_ICAGENDA_TITLE_CATEGORIES'); ?></h3>
										</td>
									</tr>
									<tr>
										<td>
											<div class="icon right">
												<a href="index.php?option=com_icagenda&view=categories">
													<?php if ($user->authorise('icagenda.access.categories', 'com_icagenda')) : ?>
														<img alt=""
															src="../media/com_icagenda/images/all_cats-48.png">
														<span class="iconText">
															<?php echo JText::_( 'COM_ICAGENDA_PANEL_CATEGORY' ); ?>
														</span>
													<?php else : ?>
														<img alt="<?php echo JText::_( 'JERROR_ALERTNOAUTHOR' ); ?>"
															src="../media/com_icagenda/images/panel_denied/all_cats-48.png">
														<span class="iconText denied">
															<?php echo JText::_( 'COM_ICAGENDA_PANEL_CATEGORY' ); ?>
														</span>
													<?php endif; ?>
												</a>
											</div>
										</td>
										<td>
											<div class="icon left">
												<a href="index.php?option=com_icagenda&view=category&layout=edit">
													<?php if ($user->authorise('icagenda.access.categories', 'com_icagenda')) : ?>
														<img alt=""
															src="../media/com_icagenda/images/new_cat-48.png">
														<span class="iconText">
															<?php echo JText::_( 'COM_ICAGENDA_PANEL_NEW_CATEGORY' ); ?>
														</span>
													<?php else : ?>
														<img alt="<?php echo JText::_( 'JERROR_ALERTNOAUTHOR' ); ?>"
															src="../media/com_icagenda/images/panel_denied/new_cat-48.png">
														<span class="iconText denied">
															<?php echo JText::_( 'COM_ICAGENDA_PANEL_NEW_CATEGORY' ); ?>
														</span>
													<?php endif; ?>
												</a>
											</div>
										</td>
									</tr>
								</tbody>
							</table>
						</div>
						<?php endif; ?>
						<?php if ( $user->authorise('icagenda.access.events', 'com_icagenda') ) : ?>
						<div class="span6" style="text-align: center">
				    		<table>
				    			<tbody>
				    				<tr>
				    					<td colspan="2">
											<h3><?php echo JText::_('COM_ICAGENDA_TITLE_EVENTS'); ?></h3>
										</td>
									</tr>
				    				<tr>
	 				   					<td>
											<div class="icon right">
												<a href="index.php?option=com_icagenda&view=events">
													<?php if ($user->authorise('icagenda.access.events', 'com_icagenda')) : ?>
														<img alt=""
															src="../media/com_icagenda/images/all_events-48.png">
														<span class="iconText">
															<?php echo JText::_( 'COM_ICAGENDA_PANEL_EVENTS' ); ?>
														</span>
													<?php else : ?>
														<img alt="<?php echo JText::_( 'JERROR_ALERTNOAUTHOR' ); ?>"
															src="../media/com_icagenda/images/panel_denied/all_events-48.png">
														<span class="iconText denied">
															<?php echo JText::_( 'COM_ICAGENDA_PANEL_EVENTS' ); ?>
														</span>
													<?php endif; ?>
												</a>
											</div>
										</td>
	 				   					<td>
											<div class="icon left">
												<a href="index.php?option=com_icagenda&view=event&layout=edit">
													<?php if ($user->authorise('icagenda.access.events', 'com_icagenda')) : ?>
														<img alt=""
															src="../media/com_icagenda/images/new_event-48.png">
														<span class="iconText">
															<?php echo JText::_( 'COM_ICAGENDA_PANEL_NEW_EVENT' ); ?>
														</span>
													<?php else : ?>
														<img alt="<?php echo JText::_( 'JERROR_ALERTNOAUTHOR' ); ?>"
															src="../media/com_icagenda/images/panel_denied/new_event-48.png">
														<span class="iconText denied">
															<?php echo JText::_( 'COM_ICAGENDA_PANEL_NEW_EVENT' ); ?>
														</span>
													<?php endif; ?>
												</a>
											</div>
										</td>
									</tr>
								</tbody>
							</table>
						</div>
						<?php endif; ?>
					</div>

					<div class="row-fluid">
						<?php if ( $user->authorise('icagenda.access.registrations', 'com_icagenda')
								|| $user->authorise('icagenda.access.newsletter', 'com_icagenda') ) : ?>
						<div class="span6" style="text-align: center">
			    			<table>
					    		<tbody>
				    				<tr>
				    					<td colspan="2">
											<h3><?php echo JText::_('COM_ICAGENDA_TITLE_REGISTRATION'); ?></h3>
										</td>
									</tr>
				    				<tr>
	 				   					<td>
											<div class="icon right">
												<a href="index.php?option=com_icagenda&view=registrations">
													<?php if ($user->authorise('icagenda.access.registrations', 'com_icagenda')) : ?>
														<img alt=""
															src="../media/com_icagenda/images/registration-48.png">
														<span class="iconText">
															<?php echo JText::_( 'COM_ICAGENDA_PANEL_REGISTRATION' ); ?>
														</span>
													<?php else : ?>
														<img alt="<?php echo JText::_( 'JERROR_ALERTNOAUTHOR' ); ?>"
															src="../media/com_icagenda/images/panel_denied/registration-48.png">
														<span class="iconText denied">
															<?php echo JText::_( 'COM_ICAGENDA_PANEL_REGISTRATION' ); ?>
														</span>
													<?php endif; ?>
												</a>
											</div>
										</td>
	 				   					<td>
											<div class="icon left">
												<a href="index.php?option=com_icagenda&view=mail&layout=edit">
													<?php if ($user->authorise('icagenda.access.newsletter', 'com_icagenda')) : ?>
														<img alt=""
															src="../media/com_icagenda/images/newsletter-48.png">
														<span class="iconText">
															<?php echo JText::_( 'COM_ICAGENDA_PANEL_NEWSLETTER' ); ?>
														</span>
													<?php else : ?>
														<img alt="<?php echo JText::_( 'JERROR_ALERTNOAUTHOR' ); ?>"
															src="../media/com_icagenda/images/panel_denied/newsletter-48.png">
														<span class="iconText denied">
															<?php echo JText::_( 'COM_ICAGENDA_PANEL_NEWSLETTER' ); ?>
														</span>
													<?php endif; ?>
												</a>
											</div>
										</td>
									</tr>
								</tbody>
							</table>
						</div>
						<?php endif; ?>
						<?php if ( $user->authorise('icagenda.access.customfields', 'com_icagenda')
								|| $user->authorise('icagenda.access.features', 'com_icagenda') ) : ?>
						<div class="span6" style="text-align: center">
				    		<table>
				    			<tbody>
				    				<tr>
				    					<td colspan="2">
											<h3><?php echo JText::_('COM_ICAGENDA_ADDITIONALS_LABEL'); ?></h3>
										</td>
									</tr>
				    				<tr>
	 				   					<td>
											<div class="icon right">
												<a href="index.php?option=com_icagenda&view=customfields">
													<?php if ($user->authorise('icagenda.access.customfields', 'com_icagenda')) : ?>
														<img alt=""
															src="../media/com_icagenda/images/customfields-48.png" />
														<span class="iconText">
															<?php echo JText::_( 'COM_ICAGENDA_PANEL_CUSTOMFIELDS' ); ?>
														</span>
													<?php else : ?>
														<img alt="<?php echo JText::_( 'JERROR_ALERTNOAUTHOR' ); ?>"
															src="../media/com_icagenda/images/panel_denied/customfields-48.png" />
														<span class="iconText denied">
															<?php echo JText::_( 'COM_ICAGENDA_PANEL_CUSTOMFIELDS' ); ?>
														</span>
													<?php endif; ?>
												</a>
											</div>
										</td>
	 				   					<td>
											<div class="icon left">
												<a href="index.php?option=com_icagenda&view=features">
													<?php if ($user->authorise('icagenda.access.features', 'com_icagenda')) : ?>
														<img alt=""
															src="../media/com_icagenda/images/features-48.png">
														<span class="iconText">
															<?php echo JText::_( 'COM_ICAGENDA_PANEL_FEATURES' ); ?>
														</span>
													<?php else : ?>
														<img alt="<?php echo JText::_( 'JERROR_ALERTNOAUTHOR' ); ?>"
															src="../media/com_icagenda/images/panel_denied/features-48.png">
														<span class="iconText denied">
															<?php echo JText::_( 'COM_ICAGENDA_PANEL_FEATURES' ); ?>
														</span>
													<?php endif; ?>
												</a>
											</div>
										</td>
									</tr>
								</tbody>
							</table>
						</div>
						<?php endif; ?>
					</div>

					<div class="row-fluid">
						<?php if ( $user->authorise('core.admin', 'com_icagenda')
								|| $user->authorise('icagenda.access.themes', 'com_icagenda') ) : ?>
						<div class="span6" style="text-align: center">
			    			<table>
					    		<tbody>
				    				<tr>
				    					<td colspan="2">
											<h3><?php echo JText::_('COM_ICAGENDA_GLOBAL_PARAMS_LABEL'); ?></h3>
										</td>
									</tr>
				    				<tr>
	 				   					<td>
											<div class="icon right">
												<?php if(version_compare(JVERSION, '3.0', 'ge')) : ?>
													<a href="index.php?option=com_config&view=component&component=com_icagenda&path=&return=<?php echo base64_encode(JURI::getInstance()->toString()) ?>">
												<?php else : ?>
													<a href="index.php?option=com_config&view=component&component=com_icagenda&path=&tmpl=component"
														class="modal"
														rel="{handler: 'iframe', size: {x: 870, y: 550}}">
												<?php endif; ?>
													<?php if ($user->authorise('core.admin', 'com_icagenda')) : ?>
														<img alt=""
															src="../media/com_icagenda/images/global_options-48.png">
														<span class="iconText">
															<?php echo JText::_( 'JTOOLBAR_OPTIONS' ); ?>
														</span>
													<?php else : ?>
														<img alt="<?php echo JText::_( 'JERROR_ALERTNOAUTHOR' ); ?>"
															src="../media/com_icagenda/images/panel_denied/global_options-48.png">
														<span class="iconText denied">
															<?php echo JText::_( 'JTOOLBAR_OPTIONS' ); ?>
														</span>
													<?php endif; ?>
												</a>
											</div>
										</td>
	 				   					<td>
											<div class="icon left">
												<a href="index.php?option=com_icagenda&view=themes">
													<?php if ($user->authorise('icagenda.access.themes', 'com_icagenda')) : ?>
														<img alt=""
															src="../media/com_icagenda/images/themes-48.png">
														<span class="iconText">
															<?php echo JText::_( 'COM_ICAGENDA_PANEL_THEMES' ); ?>
														</span>
													<?php else : ?>
														<img alt="<?php echo JText::_( 'JERROR_ALERTNOAUTHOR' ); ?>"
															src="../media/com_icagenda/images/panel_denied/themes-48.png">
														<span class="iconText denied">
															<?php echo JText::_( 'COM_ICAGENDA_PANEL_THEMES' ); ?>
														</span>
													<?php endif; ?>
												</a>
											</div>
										</td>
									</tr>
								</tbody>
							</table>
						</div>
						<?php endif; ?>
						<?php if ( $user->authorise('core.admin', 'com_icagenda') ) : ?>
						<div class="span6" style="text-align: center">
			    			<table>
					    		<tbody>
				    				<tr>
				    					<td colspan="2">
											<h3><?php echo JText::_('COM_ICAGENDA_PANEL_UPDATE_AND_INFOS'); ?></h3>
										</td>
									</tr>
				    				<tr>
	 				   					<td>
											<div class="icon right">
												<a href="index.php?option=com_icagenda&view=info">
													<img src="../media/com_icagenda/images/info-48.png">
													<span class="iconText"><?php echo JText::_( 'COM_ICAGENDA_INFO' ); ?></span>
												</a>
											</div>
										</td>
	 				   					<td class="left">
											<?php echo LiveUpdate::getIcon(); ?>
										</td>
									</tr>
								</tbody>
							</table>
						</div>
						<?php endif; ?>
					</div>

					<?php if ($icsys == 'core') : ?>
					<div class="row-fluid">

						<div class="span12">
							<div class="alert alert-block alert-info">
							<?php if(version_compare(JVERSION, '3.0', 'ge')) : ?>
								<button type="button" class="close" data-dismiss="alert">×</button>
							<?php endif; ?>
								<p>&nbsp;</p>
								<div style="font-weight: bold; color: #555555;">
									<p>
										<?php echo JText::_('COM_ICAGENDA_PANEL_FREE_VERSION') ?><br/>
										<?php echo JText::_('COM_ICAGENDA_PANEL_PRO_VERSION') ?>:
										<?php echo JText::_('COM_ICAGENDA_PANEL_PRO_MODULE_IC_EVENT_LIST') ?>
									</p>
								</div>
								<div style="display:none;">
									<div id="loadDiv" style="background-color:#F4F4F4;">
										<table style="width:600px; height:350px;" cellpadding="0" cellspacing="0">
											<tbody>
												<tr>
													<td style="text-align: center; height:140px;" rowspan="1" colspan="3">
														&nbsp;&nbsp;&nbsp;<img src="../media/com_icagenda/images/iconicagenda48.png" alt="" />
													</td>
												</tr>
												<tr>
													<td style="text-align: right; width: 280px; height:60px;">
														<form action="https://secure.shareit.com/shareit/checkout.html?PRODUCT[300582128]=1&stylefrom=300582128" method="post" target="_blank">
															<input type="submit" class="btn" width="120px" value="<?php echo JText::_( 'COM_ICAGENDA_PURCHASE_1_YEAR' ); ?>" />
														</form>
													</td>
													<td style="width: 40px; height:60px;">
													</td>
													<td style="width: 280px; height:60px;">
														<form action="https://secure.shareit.com/shareit/checkout.html?PRODUCT[300579672]=1&stylefrom=300579672" method="post" target="_blank">
															<input type="submit" class="btn" value="<?php echo JText::_( 'COM_ICAGENDA_PURCHASE_UNLIMITED' ); ?>" />
														</form>
													</td>
												</tr>
												<tr>
													<td style="text-align: center; height:50px;" colspan="3">
														<a href="http://www.joomlic.com/extensions/icagenda" alt ="<?php echo JText::_( 'COM_ICAGENDA_INFO' ); ?>" target="_blank"><?php echo JText::_( 'COM_ICAGENDA_VERSIONS_COMPARISON' ); ?></a>
													</td>
												</tr>
												<tr>
													<td style="text-align: center;" rowspan="1" colspan="3">
														<div>
															<p>
																<img src="../media/com_icagenda/images/payment/icon_cca.gif" alt="" border="0"/>
																<img src="../media/com_icagenda/images/payment/icon_pal.gif" alt="" border="0"/>
																<img src="../media/com_icagenda/images/payment/icon_wtr.gif" alt="" border="0"/>
																<img src="../media/com_icagenda/images/payment/icon_chk.gif" alt="" border="0"/>
															</p>
														</div>
														<div>
															<img src="../media/com_icagenda/images/payment/shareit_ani.gif" alt="" border="0"/>
														</div>
													</td>
												</tr>
											</tbody>
										</table>
									</div>
								</div>

								<p>
									&nbsp;
								</p>
								<div>
									<p style="text-align: center;">
										<a href="#loadDiv" class="modal" rel="{size: {x: 600, y: 350}}">
											<input type="submit" class="btn" value="<?php echo JText::_( 'COM_ICAGENDA_PURCHASE' ); ?>" />
										</a>
										<!--a href="http://www.joomlic.com/extensions/icagenda" alt ="<?php echo JText::_( 'COM_ICAGENDA_INFO' ); ?>" target="_blank">
											<?php echo JText::_( 'COM_ICAGENDA_INFO' ); ?>
										</a-->
									</p>
									<p style="text-align: center; font-size:11px;">
										<a href="http://www.joomlic.com/extensions/icagenda" alt ="<?php echo JText::_( 'COM_ICAGENDA_INFO' ); ?>" target="_blank"><?php echo JText::_( 'COM_ICAGENDA_VERSIONS_COMPARISON' ); ?></a>
									</p>
								</div>

							</div>

						</div><!--end span12-->

					</div><!--end row-->
					<?php endif; ?>

				</div><!--end span 6-->
				<div class="span1">
				</div><!--end span 1-->
				<div class="span5">
					<div class="span12">

						<?php
						$db = JFactory::getDbo();
						$query	= $db->getQuery(true);
						//$query->select('version AS icv, releasedate AS icd')->from('#__icagenda')->where('id = 1');
						//$query->select('version AS icv, releasedate AS icd')->from('#__icagenda')->where('id = 2');
						$query->select('version AS icv, releasedate AS icd, params AS icp')->from('#__icagenda')->where('id = 3');
						$db->setQuery($query);
						$release	= $db->loadObject()->icv;
						$date		= $db->loadObject()->icd;
						$icp		= json_decode( $db->loadObject()->icp, true );

						if ($icsys == 'pro')
						{
							$app = JFactory::getApplication();
							$welcome_pro =  $app->input->get('welcome', '');

							// Get Current URL
							$thisURL = JURI::getInstance()->toString();

							$return_cp = 'index.php?option=com_icagenda';

							if ($welcome_pro == -1)
							{
								$this->saveDefault($welcome_pro, 'msg_procp', '-1');
								$app->enqueueMessage(JText::_('COM_ICAGENDA_WELCOME_HIDE_SUCCESS'), 'message');
								$app->redirect($return_cp);
							}
							elseif ($welcome_pro == 1)
							{
								$this->saveDefault($welcome_pro, 'msg_procp', '1');
//								$app->enqueueMessage(JText::_('COM_ICAGENDA_WELCOME_SHOW_SUCCESS'), 'message');
								$app->redirect($return_cp);
							}

							$options_link = version_compare(JVERSION, '3.0', 'ge')
											? ' : <a href="index.php?option=com_config&view=component&component=com_icagenda&path=&return='
												.  base64_encode(JURI::getInstance()->toString()) . '#pro">'
												. JText::_('JTOOLBAR_OPTIONS') . '</a>'
											: '.';
							?>
							<?php if ($icp['msg_procp'] == -1) : ?>
								<a class="hasTooltip" href="<?php echo JRoute::_($thisURL.'&welcome=1') ?>" data-original-title="Clear" data-toggle="tooltip" title="<?php echo JText::_('COM_ICAGENDA_WELCOME_RELOAD_DESC') ?>">
									<div class="btn btn-mini"><?php echo JText::_('COM_ICAGENDA_WELCOME_RELOAD'); ?></div>
								</a>
							<?php else : ?>
							<?php
			$app->enqueueMessage('<h2>' . JText::sprintf('COM_ICAGENDA_PRO_WELCOME', 'iCagenda PRO') . '</h2>'
								. '<p>' . JText::sprintf('COM_ICAGENDA_PRO_WELCOME_PRO_ACCOUNT_INFO', 'iCagenda PRO', '<a href="http://pro.joomlic.com" target="_blank">pro.joomlic.com</a>') . '</p>'
								. '<p>' . JText::sprintf('COM_ICAGENDA_PRO_WELCOME_PRO_NOTIFICATION_EMAILS', 'info(at)joomlic.com') . '</p>'
								. '<p>' . JText::sprintf('COM_ICAGENDA_PRO_WELCOME_PRO_NOTIFICATION_EMAILS_FIRST', 'Pro JoomliC') . '<br />'
								. JText::_('COM_ICAGENDA_PRO_WELCOME_PRO_NOTIFICATION_EMAILS_SECOND') . '<br />'
								. JText::_('COM_ICAGENDA_PRO_WELCOME_PRO_CHECK_YOUR_EMAIL') . '</p>'
								. '<p>' . JText::sprintf('COM_ICAGENDA_PRO_WELCOME_PRO_FIRST_LOGIN_1', '<a href="http://pro.joomlic.com" target="_blank">pro.joomlic.com</a>') . '<br />'
								. JText::sprintf('COM_ICAGENDA_PRO_WELCOME_PRO_FIRST_LOGIN_2', '<a href="http://pro.joomlic.com" target="_blank">pro.joomlic.com</a>') . '<br />'
								. JText::sprintf('COM_ICAGENDA_PRO_WELCOME_PRO_OPTIONS', $options_link) . '</p>'
								. '<p>' . JText::sprintf('COM_ICAGENDA_PRO_WELCOME_PRO_ID_1', 'iCagenda PRO') . '</p>'
								. '<p>' . JText::_('COM_ICAGENDA_PRO_WELCOME_CONTACT') . '<br />'
								. JText::sprintf('COM_ICAGENDA_PRO_WELCOME_SUPPORT', '<a href="http://pro.joomlic.com/support" target="_blank">Pro Ticket System</a>') . '</p>'
								. '<p><small><strong>' . JText::_('COM_ICAGENDA_PRO_WELCOME_NOTE') . '</strong></small></p>'
								. '<div style="text-align:center">'
								. '<a class="hasTooltip" href="' . JRoute::_($thisURL.'&welcome=-1') . '" data-original-title="Clear" data-toggle="tooltip" title="' . JText::_('COM_ICAGENDA_WELCOME_SHOW_SUCCESS_DESC') . '">'
								. '<div class="btn btn-inverse btn-small">' . JText::_('IC_HIDE_THIS_MESSAGE') . '</div>'
								. '</a>'
								. '</div>'
								, 'message');
								?>
							<?php endif; ?>
						<?php } ?>

						<div style="float:right; padding:0px 0px 0px 20px;">
							<img src="../media/com_icagenda/images/logo_icagenda.png" alt="logo_icagenda" />
						</div>
						<div>
							<h2 style="font-size:2em;">
								<b style="color:#cc0000;">iC</b><b style="color: #666666;">agenda<sup style="font-size:0.6em">&trade;</sup></b><?php echo $version;?>
							</h2>
						</div>
						<div>
							<h4>
								<?php echo JText::_('COM_ICAGENDA_COMPONENT_DESC') ?>
							</h4>
						</div>

						<div class="small">
							<?php echo JText::_('COM_ICAGENDA_FEATURES_BACKEND') ?><br />
							<?php echo JText::_('COM_ICAGENDA_FEATURES_FRONTEND') ?>
						</div>

						<div>&nbsp;</div>

						<div style="font-size:0.9em" class="blockbtn">
							<?php echo JText::_('COM_ICAGENDA_PANEL_VERSION');?>:&nbsp;<b><?php echo $release ;?></b> | <?php echo JText::_('COM_ICAGENDA_PANEL_DATE');?>:&nbsp;<b><?php echo $date ;?></b>&nbsp;&nbsp;

							<?php JHtml::_('behavior.modal'); ?>
							<div style="display:none;">
								<div id="icagenda-changelog">
									<?php
										require_once dirname(__FILE__).'/color.php';
										echo iCagendaUpdateLogsColoriser::colorise(JPATH_COMPONENT_ADMINISTRATOR.'/CHANGELOG.php');
									?>
								</div>
							</div>
							<a href="#icagenda-changelog" class="btn modal"><?php echo JText::_('COM_ICAGENDA_PANEL_UPDATE_LOGS') ?></a>
							<?php //  rel="{size: {x: 800, y: 350}}" ?>
						</div>

						<br/>
						<?php
							$urlposter = '../media/com_icagenda/images/video_poster_icagenda.jpg';
						?>

						<div>&nbsp;</div>
						<div>&nbsp;</div>

						<div onclick="thevid=document.getElementById('thevideo'); thevid.style.display='block'; this.style.display='none'">
							<img style="cursor: pointer;" src="<?php echo $urlposter; ?>" alt="" width="100%" />
						</div>

						<div id="thevideo" style="display: none;">
							<?php
								jimport('joomla.application.component.helper'); // Import component helper library
								$icagendaParams = JComponentHelper::getParams('com_icagenda');
								$icfolder = $icagendaParams->get('icsys');
							?>
							<iframe src="http://www.joomlic.com/_icagenda/<?php echo $icfolder; ?>/tutorial_video_cp.html" frameborder="0" width="100%" height="340" scrolling="no"></iframe>
						</div>

						<div style="color:#333; margin-top: 5px; font-size: 0.8em;">
							© <?php echo date("Y"); ?> <?php echo JText::_('COM_ICAGENDA_VIDEO_TUTORIALS');?> - Giuseppe Bosco (giusebos) | <a href="http://www.newideasproject.com/" target="_blank">www.newideasproject.com</a>
						</div>

						<div style="color:#333; margin-top: 5px; font-size: 0.8em; line-height:14px; height:30px;">
							<a href="http://www.youtube.com/user/iCagenda" target="_blank"><img src="../media/com_icagenda/images/youtube_iCagenda.png" alt="" style="vertical-align:bottom;" /></a> : <a href="http://www.youtube.com/user/iCagenda" target="_blank"><?php echo JText::_('COM_ICAGENDA_VIDEO_TUTORIALS');?></a>
						</div>

						<div>&nbsp;</div>
					</div>
				</div>
			</div>
		</div>
	</div>

	<div class="row-fluid">
		<div class="span12">
			<div class="row-fluid">
				<div class="span12">
					<h3>40&nbsp;<?php echo JText::_('COM_ICAGENDA_PANEL_TRANSLATION_PACKS');?></h3>
					<p>
						<?php
							if(version_compare(JVERSION, '3.0', 'lt')) {
								$iCtag = '::';
							} else {
								$iCtag = '<br>';
							}
						?>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Arabic (Unitag)
							<?php echo $iCtag;?><?php echo $translator;?>: haneen2013, fkinanah " >
							<img src="../media/mod_languages/images/ar.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Basque (Spain)
							<?php echo $iCtag;?><?php echo $translator;?>: Bizkaitarra " >
							<img src="../media/mod_languages/images/eu_es.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Bulgarian (Bulgaria)
							<?php echo $iCtag;?><?php echo $translator;?>: bimbongr " >
							<img src="../media/mod_languages/images/bg.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Catalan (Spain)
							<?php echo $iCtag;?><?php echo $translator;?>: Mussool, Figuerolero, riquib " >
							<img src="../media/mod_languages/images/ca.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Chinese (China)
							<?php echo $iCtag;?><?php echo $translator;?>: Foxyman " >
							<img src="../media/mod_languages/images/zh.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Chinese (Taiwan)
							<?php echo $iCtag;?><?php echo $translator;?>: jedi, hkce, rowdytang " >
							<img src="../media/mod_languages/images/tw.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Croatian (Croatia)
							<?php echo $iCtag;?><?php echo $translator;?>: Davor Čolić, komir " >
							<img src="../media/mod_languages/images/hr.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Czech (Czech Republic)
							<?php echo $iCtag;?><?php echo $translator;?>: Bong " >
							<img src="../media/mod_languages/images/cz.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Danish (Denmark)
							<?php echo $iCtag;?><?php echo $translator;?>: olewolf.dk, hvitnov, torbenspetersen, poulfrom, AhmadHamid " >
							<img src="../media/mod_languages/images/dk.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Dutch (Netherlands)
							<?php echo $iCtag;?><?php echo $translator;?>: Molenwal1, AnneM, Mario Guagliardo, wfvdijk, Walldorff " >
							<img src="../media/mod_languages/images/nl.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" English (United Kingdom)
							<?php echo $iCtag;?><?php echo $translator;?>: Lyr!C " >
							<img src="../media/mod_languages/images/en.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" English (United States)
							<?php echo $iCtag;?><?php echo $translator;?>: Lyr!C " >
							<img src="../media/mod_languages/images/us.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Esperanto
							<?php echo $iCtag;?><?php echo $translator;?>: Anita_Dagmarsdotter, Amema " >
							<img src="../media/mod_languages/images/eo.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Estonian (Estonia)
							<?php echo $iCtag;?><?php echo $translator;?>: Eraser, Reijo " >
							<img src="../media/mod_languages/images/et.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Finnish (Finland)
							<?php echo $iCtag;?><?php echo $translator;?>: Kai Metsävainio " >
							<img src="../media/mod_languages/images/fi.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" French (France)
							<?php echo $iCtag;?><?php echo $translator;?>: Lyr!C " >
							<img src="../media/mod_languages/images/fr.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" German (Germany)
							<?php echo $iCtag;?><?php echo $translator;?>: grisuu, mPino, Wasilis, bmbsbr, chuerner, Proton_11, keraM " >
							<img src="../media/mod_languages/images/de.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Greek (Greece)
							<?php echo $iCtag;?><?php echo $translator;?>: E.Gkana-D.Kontogeorgis (elinag), rinenweb, kost36, mbini, Wasilis " >
							<img src="../media/mod_languages/images/el.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Hungarian (Hungary)
							<?php echo $iCtag;?><?php echo $translator;?>: Halilaci, magicf, Cerbo, mester93 " >
							<img src="../media/mod_languages/images/it.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Italian (Italy)
							<?php echo $iCtag;?><?php echo $translator;?>: Giuseppe Bosco (giusebos) " >
							<img src="../media/mod_languages/images/it.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Japanese (Japan)
							<?php echo $iCtag;?><?php echo $translator;?>: nagata, taimai908 " >
							<img src="../media/mod_languages/images/ja.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Latvian (Latvia)
							<?php echo $iCtag;?><?php echo $translator;?>: kredo9 " >
							<img src="../media/mod_languages/images/lv.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Lithuanian (Lithuania)
							<?php echo $iCtag;?><?php echo $translator;?>: ahxoohx " >
							<img src="../media/mod_languages/images/lt.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Luxembourgish (Luxembourg)
							<?php echo $iCtag;?><?php echo $translator;?>: Superjhemp " >
							<img src="../media/mod_languages/images/icon-16-language.png" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Macedonian (Macedonia)
							<?php echo $iCtag;?><?php echo $translator;?>: Strumjan (Ilija Iliev) " >
							<img src="../media/mod_languages/images/mk.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Norwegian Bokmål (Norway)
							<?php echo $iCtag;?><?php echo $translator;?>: Rikard Tømte Reitan " >
							<img src="../media/mod_languages/images/no.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Persian (Iran)
							<?php echo $iCtag;?><?php echo $translator;?>: Arash Rezvani (al3n.nvy) " >
							<img src="../media/mod_languages/images/fa_ir.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Polish (Poland)
							<?php echo $iCtag;?><?php echo $translator;?>: mbsrz, KISweb, gienio22, traktor, niewidzialny " >
							<img src="../media/mod_languages/images/pl.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Portuguese (Brazil)
							<?php echo $iCtag;?><?php echo $translator;?>: Carosouza, alxaraujo " >
							<img src="../media/mod_languages/images/pt_br.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Portuguese (Portugal)
							<?php echo $iCtag;?><?php echo $translator;?>: LFGM, macedorl, horus68, helfer " >
							<img src="../media/mod_languages/images/pt.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Romanian (Romania)
							<?php echo $iCtag;?><?php echo $translator;?>: hat, mester93 " >
							<img src="../media/mod_languages/images/ro.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Russian (Russia)
							<?php echo $iCtag;?><?php echo $translator;?>: nshash, MSV " >
							<img src="../media/mod_languages/images/ru.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Serbian (latin)
							<?php echo $iCtag;?><?php echo $translator;?>: Nenad Mihajlović " >
							<img src="../media/mod_languages/images/sr.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Slovak (Slovakia)
							<?php echo $iCtag;?><?php echo $translator;?>: ischindl, J.Ribarszki " >
							<img src="../media/mod_languages/images/sk.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Slovenian (Slovenia)
							<?php echo $iCtag;?><?php echo $translator;?>: erbi (Ervin Bizjak) " >
							<img src="../media/mod_languages/images/sl.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Spanish (Spain)
							<?php echo $iCtag;?><?php echo $translator;?>: elerizo, mPino, albertodg, adolf64, Goncatín, virem1, leoxordonez, claugardia, sterroso " >
							<img src="../media/mod_languages/images/es.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Swedish (Sweden)
							<?php echo $iCtag;?><?php echo $translator;?>: Rickard Norberg (metska), Amema, kricke " >
							<img src="../media/mod_languages/images/sv.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Thai (Thailand)
							<?php echo $iCtag;?><?php echo $translator;?>: rattanachai.ha " >
							<img src="../media/mod_languages/images/th.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Turkish (Turkey)
							<?php echo $iCtag;?><?php echo $translator;?>: harikalarkutusu, farukzeynep, kemalokmen " >
							<img src="../media/mod_languages/images/tr.gif" border="0" alt="Tooltip"/>
						</span>
						<span rel="tooltip" data-placement="right" class="editlinktip hasTip" title=" Ukrainian (Ukraine)
							<?php echo $iCtag;?><?php echo $translator;?>: Vlad Shuh (slv54) " >
							<img src="../media/mod_languages/images/uk.gif" border="0" alt="Tooltip"/>
						</span>
					</p>
				</div>
			</div>
		</div>
	</div>

	<div class="row-fluid">
		<div class="span12">
			<table style="width: 100%; border: 0px;">
				<tbody>
					<tr>
						<td>
							<a href="http://icagenda.joomlic.com/resources/translations" target="_blank" class="btn">
								<?php echo JText::_('COM_ICAGENDA_PANEL_TRANSLATION_PACKS_DONWLOAD');?>
							</a>
						</td>
						<td style="text-align:right; vertical-align: bottom;">
							<a href='http://www.joomlic.com/forum/icagenda'  target="_blank" class="btn">
								<?php echo JText::_('COM_ICAGENDA_PANEL_HELP_FORUM'); ?>
							</a>
						</td>
					</tr>
				</tbody>
			</table>
		</div>
	</div>

	<hr>

	<div class="row-fluid">
		<div class="span12">
			<div class="row-fluid">
				<div class="span9">
					Copyright ©2012-<?php echo date("Y"); ?> joomlic.com -&nbsp;
					<?php echo JText::_('COM_ICAGENDA_PANEL_COPYRIGHT');?>&nbsp;<a href="http://extensions.joomla.org/extensions/calendars-a-events/events/events-management/22013" target="_blank">Joomla! Extensions Directory</a>.
					<br />
					<br />
				</div>
				<div class="span3" style="text-align: right">
					<a href='http://www.joomlic.com' target='_blank'>
						<img src="../media/com_icagenda/images/logo_joomlic.png" alt="" border="0"/>
					</a>
					<br />
					<i><b><?php echo JText::_('COM_ICAGENDA_PANEL_SITE_VISIT');?>&nbsp;<a href='http://www.joomlic.com' target='_blank'>www.joomlic.com</a></b></i>
				</div>
			</div>
		</div>
	</div>
</div>
components/com_icagenda/views/icagenda/tmpl/index.html000060400000000032152453623450017163 0ustar00<html><body></body></html>components/com_icagenda/views/icagenda/tmpl/color.php000060400000006220152453623450017022 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.3.8 2014-07-04
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();


class iCagendaUpdateLogsColoriser
{
	public static function colorise($file, $onlyLast = false)
	{
		$ret = '';

		$lines = @file($file);

		if(empty($lines)) return $ret;

		array_shift($lines);

		foreach($lines as $line)
		{
			$line = trim($line);

			if(empty($line)) continue;

			$type = substr($line,0,1);

			switch($type)
			{
				case '=':
					continue;
					break;

				case ':':
					$ret .= "\t".'<div style="font-size:8pt;">Legend'.$line."</div>\n";
					break;

				case '?':
					$ret .= "<div class=\"ic-message-info\">".trim(substr($line,2))."</div>\n";
					break;

				case '!':
					$ret .= "\t".'<li class="ic-bold ic-important"><div class="ic-box-16 ic-box-important">!</div>'
							. htmlentities(trim(substr($line,2))) . "</li>\n";
					break;

				case '1':
					$ret .= "\t".'<li class="ic-changelog-important-sub"><span></span> '.trim(substr($line,2))."</li>\n";
					break;

				case '+':
					$ret .= "\t".'<li class="ic-added"><div class="ic-box-16 ic-box-added">+</div>'
							. htmlentities(trim(substr($line,2))) . "</li>\n";
					break;

				case '-':
					$ret .= "\t".'<li class="ic-removed"><div class="ic-box-16 ic-box-removed">-</div>'
							. htmlentities(trim(substr($line,2))) . "</li>\n";
					break;

				case '~':
					$ret .= "\t".'<li class="ic-changed"><div class="ic-box-16 ic-box-changed">~</div>'
							. htmlentities(trim(substr($line,2))) . "</li>\n";
					break;

				case '#':
					$ret .= "\t".'<li class="ic-fixed"><div class="ic-box-16 ic-box-fixed">#</div>'
							. htmlentities(trim(substr($line,2))) . "</li>\n";
					break;

//				case 'H':
//					$ret .= "\t".'<li class="ic-fixed"><div class="ic-box-16 ic-box-fixed">#</div><div class="ic-box ic-box-removed">HIGH</div> '
//							. htmlentities(trim(substr($line,2))) . "</li>\n";
//					break;

				case '*':
					$ret .= "\t".'<h4 class="ic-changelog">' . htmlentities(trim(substr($line,2))) . "</h4>\n";
					break;

				case '$':
					$ret .= "</ul>";
					$ret .= "<h3 class=\"ic-changelog-pro\">&nbsp;&nbsp;" . substr($line,2) . " <SUP>[ PRO Testing ]</SUP></h3>\n";
					$ret .= "<ul class=\"ic-changelog\">\n";
					break;

				// End
				case ';':
					$ret .= "</ul>";
					break;

				default:

					if(!empty($ret))
					{
						$ret .= "</ul>";
						if($onlyLast) return $ret;
					}

					if(!$onlyLast) $ret .= "<h3 class=\"ic-changelog\">&nbsp;&nbsp;$line</h3>\n";

					$ret .= "<ul class=\"ic-changelog\">\n";
					break;
			}
		}

		return $ret;
	}
}
components/com_icagenda/views/registrations/index.html000060400000000032152453623450017351 0ustar00<html><body></body></html>components/com_icagenda/views/registrations/view.html.php000060400000014046152453623450020014 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.9 2015-07-22
 * @since       2.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * View class Admin - List of Registrations - iCagenda
 */
class iCagendaViewRegistrations extends JViewLegacy
{
	protected $params;
	protected $state;
	protected $items;
	protected $pagination;
	protected $events;
	protected $dates;

	/**
	 * Display the view
	 */
	public function display($tpl = null)
	{
		// Joomla 2.5
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			jimport( 'joomla.environment.request' );

			JHtml::stylesheet('com_icagenda/template.j25.css', false, true);
			JHtml::stylesheet('com_icagenda/icagenda-back.j25.css', false, true);
		}

		$this->params		= JComponentHelper::getParams('com_icagenda');
		$this->state		= $this->get('State');
		$this->items		= $this->get('Items');
		$this->pagination	= $this->get('Pagination');

		$this->events		= $this->get('Events');
		$this->dates		= $this->get('Dates');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			JError::raiseError(500, implode("\n", $errors));
			return false;
		}

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();

			if (version_compare(JVERSION, '3.0', 'ge'))
			{
				$this->sidebar = JHtmlSidebar::render();
			}
		}

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @since	1.6
	 */
	protected function addToolbar()
	{
		require_once JPATH_COMPONENT . '/helpers/icagenda.php';

		$state	= $this->get('State');
//		$canDo	= iCagendaHelper::getActions($state->get('filter.registration_id'));
		$canDo	= iCagendaHelper::getActions();

		// Set Title
		if (version_compare(JVERSION, '3.0', 'lt'))
		{
			JToolBarHelper::title('iCagenda - ' . JText::_('COM_ICAGENDA_TITLE_REGISTRATION'), 'registration.png');
		}
		else
		{
			JToolBarHelper::title('iCagenda <span style="font-size:14px;">- ' . JText::_('COM_ICAGENDA_TITLE_REGISTRATION') . '</span>', 'users');
		}

		$icTitle = JText::_('COM_ICAGENDA_TITLE_REGISTRATION');

		$document	= JFactory::getDocument();
		$app		= JFactory::getApplication();
		$sitename	= $app->getCfg('sitename');
		$title		= $app->getCfg('sitename') . ' - ' . JText::_('JADMINISTRATION') . ' - iCagenda: ' . $icTitle;

		$document->setTitle($title);

		//Check if the form exists before showing the add/edit buttons
		$formPath = JPATH_COMPONENT_ADMINISTRATOR . '/views/registration';

		if (file_exists($formPath))
		{
			// Add Export Button to the ToolBar
			$bar = JToolBar::getInstance('toolbar');
			$export_icon = version_compare(JVERSION, '3.0', 'ge') ? 'download' : 'export';
			$bar->appendButton('Popup', $export_icon, 'JTOOLBAR_EXPORT', 'index.php?option=com_icagenda&amp;view=download&amp;tmpl=component', 600, 300);

			JToolBarHelper::divider();

			if ($canDo->get('core.create'))
			{
				JToolBarHelper::addNew('registration.add', 'JTOOLBAR_NEW');
			}

			if ($canDo->get('core.edit') || $canDo->get('core.edit.own'))
			{
				JToolBarHelper::editList('registration.edit', 'JTOOLBAR_EDIT');
			}

		}

		if ($canDo->get('core.edit.state'))
		{
			if (isset($this->items[0]->state))
			{
//				JToolBarHelper::divider();
				JToolBarHelper::custom('registrations.publish', 'publish.png', 'publish_f2.png','JTOOLBAR_PUBLISH', true);
				JToolBarHelper::custom('registrations.unpublish', 'unpublish.png', 'unpublish_f2.png', 'JTOOLBAR_UNPUBLISH', true);
			}
			else
			{
				// If this component does not use state then show a direct delete button as we can not trash
				JToolBarHelper::deleteList('', 'registrations.delete', 'JTOOLBAR_DELETE');
			}

			if (isset($this->items[0]->state))
			{
				JToolBarHelper::divider();
				JToolBarHelper::archiveList('registrations.archive', 'JTOOLBAR_ARCHIVE');
			}

			if (isset($this->items[0]->checked_out))
			{
				JToolBarHelper::custom('registrations.checkin', 'checkin.png', 'checkin_f2.png', 'JTOOLBAR_CHECKIN', true);
			}
		}

		// Show trash and delete for components that uses the state field
		if (isset($this->items[0]->state))
		{
			if ($state->get('filter.state') == -2 && $canDo->get('core.delete'))
			{
				JToolBarHelper::deleteList('', 'registrations.delete', 'JTOOLBAR_EMPTY_TRASH');
				JToolBarHelper::divider();
			}
			elseif ($canDo->get('core.edit.state'))
			{
				JToolBarHelper::trash('registrations.trash', 'JTOOLBAR_TRASH');
				JToolBarHelper::divider();
			}
		}

		if ($canDo->get('core.admin'))
		{
			JToolBarHelper::preferences('com_icagenda');
		}

		if (version_compare(JVERSION, '3.0', 'ge'))
		{
			JHtmlSidebar::setAction('index.php?option=com_icagenda&view=registrations');

			JHtmlSidebar::addFilter(
				JText::_('COM_ICAGENDA_REGISTRATIONS_SELECT_STATUS'),
				'filter_published',
				JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.state'), true)
			);
			JHtmlSidebar::addFilter(
				JText::_('COM_ICAGENDA_REGISTRATIONS_SELECT_CATEGORY'),
				'filter_categories',
				JHtml::_('select.options', $this->get('Categories'), 'value', 'text', $this->state->get('filter.categories'), true)
			);
			JHtmlSidebar::addFilter(
				JText::_('COM_ICAGENDA_REGISTRATIONS_SELECT_EVENT'),
				'filter_events',
				JHtml::_('select.options', $this->get('Events'), 'value', 'text', $this->state->get('filter.events'), true)
			);
			JHtmlSidebar::addFilter(
				JText::_('COM_ICAGENDA_REGISTRATIONS_SELECT_DATE'),
				'filter_dates',
				JHtml::_('select.options', $this->get('Dates'), 'value', 'text', $this->state->get('filter.dates'), true)
			);
		}
	}
}
components/com_icagenda/views/registrations/view.raw.php000060400000004254152453623450017641 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.3 2015-03-23
 * @since       3.5.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * View class for a list of registrations.
 *
 * @since	3.5.0
 */
class icagendaViewRegistrations extends JViewLegacy
{
	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		$basename		= $this->get('BaseName');
		$filetype		= $this->get('FileType');
		$mimetype		= $this->get('MimeType');
		$content		= $this->get('Content');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			JError::raiseError(500, implode("\n", $errors));

			return false;
		}

		$document = JFactory::getDocument();
		$document->setMimeEncoding($mimetype);

		// Joomla 3
		if (version_compare(JVERSION, '3.0', 'ge'))
		{
			JFactory::getApplication()
				->setHeader(
					'Content-disposition',
					'attachment; filename="' . $basename . '.' . $filetype . '"; creation-date="' . JFactory::getDate()->toRFC822() . '"',
					true
				);
		}
		// Joomla 2.5
		else
		{
			JResponse::setHeader('Content-disposition', 'attachment; filename="' . $basename . '.' . $filetype . '"; creation-date="' . JFactory::getDate()->toRFC822() . '"', true);
		}

		// Open file pointer to standard output
//		$fp = fopen('php://output', 'w');

		// Add BOM to fix UTF-8 in Excel
//		fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));

//		fclose($fp);

//$content = mb_convert_encoding($content, 'UTF-16LE', 'UTF-8');

		echo $content;
	}
}
components/com_icagenda/views/registrations/tmpl/default.php000060400000051045152453623450020477 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.12 2015-09-21
 * @since		2.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

JHtml::_('behavior.modal');
JHtml::_('behavior.multiselect');

$app = JFactory::getApplication();

// Access Administration Registrations check.
if (JFactory::getUser()->authorise('icagenda.access.registrations', 'com_icagenda'))
{
	$user			= JFactory::getUser();
	$userId			= $user->get('id');
	$listOrder		= $this->state->get('list.ordering');
	$listDirn		= $this->state->get('list.direction');
	$canOrder		= $user->authorise('core.edit.state', 'com_icagenda');
	$saveOrder		= $listOrder == 'a.ordering';
	$dateFormat		= $this->params->get('date_format_global', 'Y - m - d');
	$dateSeparator	= $this->params->get('date_separator', ' ');
	$timeFormat		= ($this->params->get('timeformat', '1') == 1) ? 'H:i' : 'h:i A';

	if (version_compare(JVERSION, '3.0', 'lt'))
	{
		JHtml::_('behavior.tooltip');
	}
	else
	{
		// Include the component HTML helpers.
		JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');
		JHtml::_('bootstrap.tooltip');
		JHtml::_('formbehavior.chosen', 'select');
		JHtml::_('dropdown.init');

//		$archived	= $this->state->get('filter.published') == 2 ? true : false;
//		$trashed	= $this->state->get('filter.published') == -2 ? true : false;

		if ($saveOrder)
		{
	    	$saveOrderingUrl = 'index.php?option=com_icagenda&task=registrations.saveOrderAjax&tmpl=component';
	    	JHtml::_('sortablelist.sortable', 'registrationsList', 'adminForm', strtolower($listDirn), $saveOrderingUrl);
		}
	}

	?>

	<form action="<?php echo JRoute::_('index.php?option=com_icagenda&view=registrations'); ?>" method="post" name="adminForm" id="adminForm">
	<?php if (!empty( $this->sidebar)) : ?>
		<div id="j-sidebar-container" class="span2">
			<?php echo $this->sidebar; ?>
		</div>
		<div id="j-main-container" class="span10">
	<?php else : ?>
		<div id="j-main-container">
	<?php endif;?>

		<?php if(version_compare(JVERSION, '3.0', 'lt')) : ?>
			<fieldset id="filter-bar">
				<div class="filter-search fltlft">
					<label class="filter-search-lbl" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
					<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('Search'); ?>" />
					<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
					<button type="button" onclick="document.id('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
				</div>
				<div class="filter-select fltrt">

					<select name="filter_published" class="inputbox" onchange="this.form.submit()">
						<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED');?></option>
						<?php echo JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), "value", "text", $this->state->get('filter.state'), true);?>
					</select>

					<select name="filter_categories" class="inputbox" onchange="this.form.submit()">
						<option value=""><?php echo JText::_('COM_ICAGENDA_REGISTRATIONS_SELECT_CATEGORY');?></option>
						<?php echo JHtml::_('select.options', $this->categories, 'value', 'text', $this->state->get('filter.categories'));?>
					</select>

					<select name="filter_events" class="inputbox" onchange="this.form.submit()">
						<option value=""><?php echo JText::_('COM_ICAGENDA_REGISTRATIONS_SELECT_EVENT');?></option>
						<?php echo JHtml::_('select.options', $this->events, 'value', 'text', $this->state->get('filter.events'));?>
					</select>

					<select name="filter_dates" class="inputbox" onchange="this.form.submit()">
						<option value=""><?php echo JText::_('COM_ICAGENDA_REGISTRATIONS_SELECT_DATE');?></option>
						<?php echo JHtml::_('select.options', $this->dates, 'value', 'text', $this->state->get('filter.dates'));?>
					</select>

				</div>
			</fieldset>
			<div class="clr"> </div>

		<?php else : ?>

			<div id="filter-bar" class="btn-toolbar">
				<div class="filter-search btn-group pull-left">
					<label for="filter_search" class="element-invisible"><?php echo JText::_('JSEARCH_FILTER'); ?></label>
					<input type="text" name="filter_search" placeholder="<?php echo JText::_('JSEARCH_FILTER'); ?>" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" title="<?php echo JText::_('JSEARCH_FILTER'); ?>" />
				</div>
				<div class="btn-group pull-left">
					<button class="btn tip hasTooltip" type="submit" title="<?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?>"><i class="icon-search"></i></button>
					<button class="btn tip hasTooltip" type="button" onclick="document.id('filter_search').value='';this.form.submit();" title="<?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?>"><i class="icon-remove"></i></button>
				</div>
				<div class="btn-group pull-right hidden-phone">
					<label for="limit" class="element-invisible"><?php echo JText::_('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC'); ?></label>
					<?php echo $this->pagination->getLimitBox(); ?>
				</div>
			</div>
			<div class="clearfix"> </div>

		<?php endif;?>


		<?php if(version_compare(JVERSION, '3.0', 'lt')) : ?>
			<table class="adminlist">
		<?php else : ?>
			<table class="table table-striped" id="registrationsList">
		<?php endif; ?>

				<thead>
					<tr>
						<?php // *** Ordering HEADER (Joomla 3.x) *** ?>
						<?php if(version_compare(JVERSION, '3.0', 'ge')) : ?>
 						<th width="1%" class="nowrap center hidden-phone">
							<?php echo JHtml::_('grid.sort', '<i class="icon-menu-2"></i>', 'a.ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING'); ?>
						</th>
						<?php endif; ?>

						<?php // *** CheckBox HEADER *** ?>
						<th width="1%" class="hidden-phone">
							<input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="Joomla.checkAll(this)" />
						</th>

						<?php // *** Status HEADER *** ?>
						<th width="1%" style="min-width:55px" class="nowrap center hidden-phone">
							<?php echo JHtml::_('grid.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
						</th>

						<?php // *** User HEADER *** ?>
						<th>
							<?php echo JText::_('COM_ICAGENDA_REGISTRATION_INFORMATION'); ?><span class="hidden-phone">:</span><span class="visible-phone"></span>
							<?php echo JHtml::_('grid.sort',  'IC_NAME', 'name', $listDirn, $listOrder); ?>&nbsp;|
							<?php echo JHtml::_('grid.sort',  'COM_ICAGENDA_REGISTRATION_USER_ID', 'userid', $listDirn, $listOrder); ?>&nbsp;|
							<?php echo JHtml::_('grid.sort',  'COM_ICAGENDA_REGISTRATION_EMAIL', 'email', $listDirn, $listOrder); ?>&nbsp;|
							<?php echo JHtml::_('grid.sort',  'COM_ICAGENDA_REGISTRATION_PHONE', 'phone', $listDirn, $listOrder); ?>&nbsp;|
							<?php //echo JText::_('COM_ICAGENDA_REGISTRATION_LABEL'); ?><!--span class="hidden-phone">:</span><span class="visible-phone"></span-->
							<?php echo JHtml::_('grid.sort',  'COM_ICAGENDA_REGISTRATION_NUMBER_PLACES', 'a.people', $listDirn, $listOrder); ?>&nbsp;-
							<?php echo JHtml::_('grid.sort',  'COM_ICAGENDA_REGISTRATION_EVENTID', 'event', $listDirn, $listOrder); ?>&nbsp;|
							<?php echo JHtml::_('grid.sort',  'ICDATE', 'a.date', $listDirn, $listOrder); ?>&nbsp;|
							<?php echo JHtml::_('grid.sort',  'JGLOBAL_FIELD_CREATED_BY_LABEL', 'evt_created_by', $listDirn, $listOrder); ?>
						</th>

						<?php // *** ID HEADER *** ?>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>

					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="5">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody valign="top">
				<?php foreach ($this->items as $i => $item) :
					$ordering		= ($listOrder == 'a.ordering');
					$canCreate		= $user->authorise('core.create', 'com_icagenda');
					$canEdit		= $user->authorise('core.edit', 'com_icagenda');
					$canCheckin		= $user->authorise('core.manage', 'com_icagenda') || $item->checked_out == $userId || $item->checked_out == 0;
					$canChange		= $user->authorise('core.edit.state', 'com_icagenda') && $canCheckin;
					$canEditOwn		= $user->authorise('core.edit.own', 'com_icagenda') && $item->userid == $userId;

					// Get avatar of the registered user
					$avatar			= md5(strtolower(trim($item->email)));

					// Get Username and name
					$data_name		= ($item->userid) ? $item->fullname : $item->name;
					$data_username	= ($item->userid) ? $item->username : false;

					// Load Custom fields DATA
					$customfields	= icagendaCustomfields::getListNotEmpty($item->id, 1);
					?>
					<tr class="row<?php echo $i % 2; ?>">

						<?php // START J3 CODE ?>
						<?php if(version_compare(JVERSION, '3.0', 'ge')) : ?>

						<?php // *** Ordering (Joomla 3.x) *** ?>
						<td class="order nowrap center hidden-phone">
						<?php if ($canChange) :
							$disableClassName = '';
							$disabledLabel	  = '';

							if (!$saveOrder) :
								$disabledLabel    = JText::_('JORDERINGDISABLED');
								$disableClassName = 'inactive tip-top';
							endif; ?>
							<span class="sortable-handler hasTooltip <?php echo $disableClassName; ?>" title="<?php echo $disabledLabel; ?>">
								<i class="icon-menu"></i>
							</span>
							<input type="text" style="display:none" name="order[]" size="5" value="<?php echo $item->ordering; ?>" class="width-20 text-area-order " />
						<?php else : ?>
							<span class="sortable-handler inactive" >
								<i class="icon-menu"></i>
							</span>
						<?php endif; ?>
						</td>

						<?php // END J3 CODE ?>
						<?php endif; ?>

						<?php // *** CheckBox *** ?>
						<td class="center hidden-phone">
							<?php //if ( $item->evt_state == 1) : ?>
								<?php echo JHtml::_('grid.id', $i, $item->id); ?>
							<?php //else : ?>
								<?php //echo ''; ?>
							<?php //endif; ?>
						</td>

 						<?php // *** Status *** ?>
				    	<td class="center hidden-phone">
               				<?php if (isset($this->items[0]->state)) : ?>
					    		<?php echo JHtml::_('jgrid.published', $item->state, $i, 'registrations.', $canChange, 'cb'); ?>
                			<?php endif; ?>
				    	</td>

 						<?php // *** User Information *** ?>
						<td class="has-context">
							<div class="pull-left hidden-phone" style="margin-right:10px;">
								<img alt="<?php echo $item->name; ?>" src="http://www.gravatar.com/avatar/<?php echo $avatar; ?>?s=36&d=mm"/>
							</div>
							<div class="pull-left" style="width:45%">
								<?php if ($item->checked_out) : ?>
									<?php echo JHtml::_('jgrid.checkedout', $i, $item->username, $item->checked_out_time, 'registrations.', $canCheckin); ?>
								<?php endif; ?>
								<?php //if ($item->language == '*'):?>
									<?php //$language = JText::alt('JALL', 'language'); ?>
								<?php //else:?>
									<?php //$language = $item->language ? $this->escape($item->language) : JText::_('JUNDEFINED'); ?>
								<?php //endif;?>
								<?php //if ($canEdit || $canEditOwn) : ?>
								<!--a href="<?php //echo JRoute::_('index.php?option=com_icagenda&task=registration.edit&id=' . $item->id); ?>" title="<?php //echo JText::_('JACTION_EDIT'); ?>"-->


								<?php if ($data_name) : ?>
									<p class="smallsub">
										<?php echo JText::_('IC_NAME') . ': '; ?>
										<?php //if ($canEdit && $item->evt_state == 1) : ?>
										<?php if ($canEdit || $canEditOwn) : ?>
											<a href="<?php echo JRoute::_('index.php?option=com_icagenda&task=registration.edit&id=' . $item->id); ?>" title="<?php echo JText::_('JACTION_EDIT'); ?>">
												<?php echo '<strong>' . $this->escape($item->name). '</strong>'; ?>
											</a>
										<?php else : ?>
												<?php echo '<strong>' . $this->escape($item->name). '</strong>'; ?>
										<?php endif; ?>
									</p>
									<?php if ($data_username) : ?>
										<?php echo '<strong>' . $this->escape($data_username) . '</strong>'; ?>
										<?php echo '<small>[' . $this->escape($data_name) . ']</small>'; ?>
									<?php endif; ?>

									<!--/a-->
									<?php //else : ?>
										<!--span title="<?php //echo JText::sprintf('JFIELD_ALIAS_LABEL', $this->escape($item->alias)); ?>"--><?php //echo $this->escape($item->name); ?><!--/span-->
									<?php //endif; ?>
									<?php if ($item->userid != '0') : ?>
										<p class="smallsub">
											<?php echo JText::_('COM_ICAGENDA_REGISTRATION_USER_ID') . ": " . $this->escape($item->userid); ?>
										</p>
									<?php else:?>
										<p class="smallsub">
											<?php echo JText::_('COM_ICAGENDA_REGISTRATION_NO_USER_ID'); ?>
										</p>
									<?php endif; ?>
									<?php if (($item->email) OR ($item->phone)) : ?>
										<!--div class="small" style="height:5px; border-bottom: solid 1px #D4D4D4">
										</div-->
										<p>
										<?php if ($item->email) : ?>
											<div class="small iC-italic-grey">
												<?php echo JText::_('COM_ICAGENDA_REGISTRATION_EMAIL') . ": <b>" . $this->escape($item->email) . "</b>"; ?>
											</div>
										<?php endif; ?>
										<?php if ($item->phone) : ?>
											<div class="small iC-italic-grey">
												<?php echo JText::_('COM_ICAGENDA_REGISTRATION_PHONE') . ": <b>" . $this->escape($item->phone) . "</b>"; ?>
											</div>
										<?php endif; ?>
										</p>
									<?php endif; ?>
								<?php endif; ?>

								<?php if ($item->notes) : ?>
									<br />
									<a href="#loadDiv<?php echo $item->id; ?>" class="modal" rel="{size: {x: 600, y: 350}}">
										<input type="submit" class="btn" value="<?php echo JText::_( 'COM_ICAGENDA_REGISTRATION_NOTES_DISPLAY_LABEL' ); ?>" />
									</a>
									<div style="display:none;">
										<div id="loadDiv<?php echo $item->id; ?>">
											<?php echo "<h3>".JText::_('COM_ICAGENDA_REGISTRATION_NOTES_DISPLAY_LABEL') . ": </h3><hr>" . nl2br(html_entity_decode($item->notes)); ?>
										</div>
									</div>
								<?php endif; ?>

 								<?php // Custom Fields ?>
 								<?php if ($customfields) : ?>
									<?php foreach ($customfields AS $customfield) : ?>
										<?php $cf_value = isset($customfield->cf_value) ? $customfield->cf_value : JText::_('IC_NOT_SPECIFIED'); ?>
										<div class="small iC-italic-grey">
											<?php echo $customfield->cf_title . ': <strong>' . $cf_value . '</strong>'; ?>
										</div>
									<?php endforeach; ?>
								<?php endif; ?>

							</div>
							<div class="pull-right visible-phone" style="margin-right:5%;">
								<img alt="<?php echo $item->name; ?>" src="http://www.gravatar.com/avatar/<?php echo $avatar; ?>?s=36&d=mm"/>
							</div>
							<div class="pull-left" style="width:50%">
								<?php if ( $item->evt_state != 1) : ?>
									<div class="small">
										<div style="font-weight:bold; background:#c30000; color:#FFFFFF; padding: 2px 5px; border-radius: 5px;">
											<?php echo JText::_( 'COM_ICAGENDA_REGISTRATION_EVENT_NOT_PUBLISHED' ); ?>
										</div>
									</div>
								<?php endif; ?>
								<div class="small">
									<?php echo JText::_('ICEVENT'); ?>
								</div>
								<div class="small iC-italic-grey">
									<?php echo JText::_('ICTITLE') . ': <strong>' . $this->escape($item->event) . '</strong>'; ?>
								</div>
								<div class="small iC-italic-grey">
									<?php if (( ! $item->date && $item->period == 0) || ($item->period == 1)) : ?>
										<?php echo JText::_('ICDATES') . ': '; ?>
									<?php else : ?>
										<?php echo JText::_('ICDATE') . ': '; ?>
									<?php endif; ?>
									<strong>
									<?php if ( ! $item->date && $item->period == 0) : ?>
										<?php // echo JText::_( 'COM_ICAGENDA_ADMIN_REGISTRATION_FOR_ALL_PERIOD' ); ?>
										<?php if (iCDate::isDate($item->startdate)) : ?>
											<?php echo iCGlobalize::dateFormat($item->startdate, $dateFormat, $dateSeparator); ?>
											<?php if ($item->displaytime) : ?>
												<?php echo ' - ' . date($timeFormat, strtotime($item->startdate)); ?>
											<?php endif; ?>
										<?php else : ?>
											<?php echo $item->startdate; ?>
										<?php endif; ?>
										<?php if ($item->enddate) echo ' > '; ?>
										<?php if (iCDate::isDate($item->enddate)) : ?>
											<?php echo iCGlobalize::dateFormat($item->enddate, $dateFormat, $dateSeparator); ?>
											<?php if ($item->displaytime) : ?>
												<?php echo ' - ' . date($timeFormat, strtotime($item->enddate)); ?>
											<?php endif; ?>
										<?php else : ?>
											<?php echo $item->enddate; ?>
										<?php endif; ?>
									<?php elseif ( ! $item->date && $item->period == 1) : ?>
										<?php echo JText::_( 'COM_ICAGENDA_ADMIN_REGISTRATION_FOR_ALL_DATES' ); ?>
									<?php else : ?>
										<?php if (iCDate::isDate($item->date)) : ?>
											<?php echo iCGlobalize::dateFormat($item->date, $dateFormat, $dateSeparator); ?>
											<?php if ($item->displaytime) : ?>
												<?php echo ' - ' . date($timeFormat, strtotime($item->date)); ?>
											<?php endif; ?>
										<?php else : ?>
											<?php echo $item->date; ?>
										<?php endif; ?>
									<?php endif; ?>
									</strong>
								</div>
								<?php if ($item->evt_created_by) :
									// Get Author Name
									$db = JFactory::getDBO();
									$db->setQuery(
										'SELECT `name`' .
										' FROM `#__users`' .
										' WHERE `id` = '. (int) $item->evt_created_by
									);
									$authorname = $db->loadObject()->name;
 								?>
								<div class="small iC-italic-grey">
									<?php echo JText::_('JGLOBAL_FIELD_CREATED_BY_LABEL') . ': <strong>' . $this->escape($authorname) . '</strong>'; ?>
								</div>
								<?php endif; ?>
								<p>
								<div class="small">
									<?php echo JText::_('ICINFORMATION'); ?>
								</div>
								<div class="small iC-italic-grey">
									<?php echo JText::_('COM_ICAGENDA_REGISTRATION_NUMBER_PLACES') . ': <strong>' . $item->people . '</strong>'; ?>
								</div>
								</p>
							</div>
						</td>

						<?php // *** ID *** ?>
						<td class="center hidden-phone">
							<?php if (isset($this->items[0]->id)) : ?>
								<?php echo (int) $item->id; ?>
							<?php endif; ?>
						</td>

					</tr>
				<?php endforeach; ?>

			<?php
			// Old Joomla versions asset_id issue. (all Joomla 2.5.x versions, and Joomla 3 NOT updated!)
			$asset_issue = version_compare(JVERSION, '3.0', 'lt') ? true : false;

			if ($asset_issue)
			{
				$ia = '0';
				unset($msg);
				unset($type);
				$msg = $type = $front_submit = '';
				$edittx = '<b>' . JText::_( 'JACTION_EDIT' ) . '</b>';
				$savetx = '<b>' . JText::_( 'JSAVE' ) . '</b>';

				foreach ($this->items as $i => $item)
				{
					if (($item->asset_id == '0') && ($item->state == '-2'))
					{
						$ia = $ia+1;
						$front_submit = '1';
					}
				}

				if ($front_submit == 1 && $ia == 1)
				{
					$app->enqueueMessage(JText::sprintf( 'COM_ICAGENDA_TRASH_FRONTEND_REGISTRATION_1', $edittx, $savetx ), 'notice');
				}
				elseif ($front_submit == 1 && $ia > 1)
				{
					$app->enqueueMessage(JText::sprintf( 'COM_ICAGENDA_TRASH_FRONTEND_REGISTRATION', $edittx, $savetx ), 'notice');
				}

				foreach ($this->items as $i => $item)
				{
					if ($item->asset_id == '0' && $item->state == '-2')
					{
						$editLink = 'index.php?option=com_icagenda&task=registration.edit&id=' . $item->id;
						$msg	= '- ' . $item->name . ' [' . $item->id . '] : <a href="' . $editLink . '"><b>'.JText::_( 'JACTION_EDIT' ).'</b></a>';
						$type	= JText::_( 'JGLOBAL_LIST' ).' :';
					}
					if ( ! empty($msg))
					{
						$app->enqueueMessage($msg, $type);
					}
				}
			}
			?>

				</tbody>
			</table>

			<div>
				<input type="hidden" name="task" value="" />
				<input type="hidden" name="boxchecked" value="0" />
				<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
				<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
				<?php echo JHtml::_('form.token'); ?>
			</div>
		</div>
	</form>
	<?php
}
else
{
	$app->enqueueMessage(JText::_('JERROR_ALERTNOAUTHOR'), 'warning');
	$app->redirect(htmlspecialchars_decode('index.php?option=com_icagenda&view=icagenda'));
}
components/com_icagenda/views/registrations/tmpl/index.html000060400000000032152453623450020325 0ustar00<html><body></body></html>components/com_icagenda/views/download/view.html.php000060400000002430152453623450016720 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.0 2015-02-05
 * @since       3.5.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * View class for download a list of registered users.
 *
 * @since	3.5.0
 */
class icagendaViewdownload extends JViewLegacy
{
	protected $form;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		$this->form = $this->get('Form');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			JError::raiseError(500, implode("\n", $errors));

			return false;
		}

		parent::display($tpl);
	}
}
components/com_icagenda/views/download/index.html000060400000000037152453623450016270 0ustar00<!DOCTYPE html><title></title>
components/com_icagenda/views/download/tmpl/index.html000060400000000037152453623450017244 0ustar00<!DOCTYPE html><title></title>
components/com_icagenda/views/download/tmpl/default.php000060400000003267152453623450017414 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version 	3.5.0 2015-02-05
 * @since       3.5.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();
?>
<form
	action="<?php echo JRoute::_('index.php?option=com_icagenda&task=registrations.display&format=raw'); ?>"
	method="post"
	name="adminForm"
	id="download-form"
	class="form-validate">
	<fieldset class="adminform">
		<legend><?php echo JText::_('COM_ICAGENDA_REGISTRATIONS_DOWNLOAD'); ?></legend>
		<?php foreach ($this->form->getFieldset() as $field) : ?>
		<div class="control-group">
			<?php if (!$field->hidden) : ?>
			<div class="control-label">
				<?php echo $field->label; ?>
			</div>
			<?php endif; ?>
			<div class="controls">
				<?php echo $field->input; ?>
			</div>
		</div>
		<?php endforeach; ?>
		<div class="clr"></div>
		<button type="button" class="btn" onclick="this.form.submit();window.top.setTimeout('window.parent.jModalClose()', 700);"><?php echo JText::_('COM_ICAGENDA_REGISTRATIONS_EXPORT'); ?></button>
		<!--button type="button" class="btn" onclick="window.parent.jModalClose()"><?php echo JText::_('COM_ICAGENDA_CANCEL'); ?></button-->
	</fieldset>
</form>
components/com_icagenda/icagenda.xml000060400000013227152453623450013611 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="2.5.6" method="upgrade">
	<name>iCagenda</name>
	<creationDate>2015-10-12</creationDate>
	<copyright>Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved</copyright>
	<license>GNU General Public License version 3 or later; see LICENSE.txt</license>
	<author>Jooml!C</author>
	<authorEmail>info@joomlic.com</authorEmail>
	<authorUrl>www.joomlic.com</authorUrl>
	<version>3.5.12</version>
	<description>COM_ICAGENDA_DESC</description>

	<scriptfile>script.icagenda.pro.php</scriptfile>

	<install> <!-- Runs on install -->
		<sql>
			<file driver="mysql" charset="utf8">sql/install/mysql/icagenda.install.sql</file>
			<file driver="mysql">sql/install/mysql/icagenda.install.sql</file>
			<file driver="mysqli" charset="utf8">sql/install/mysql/icagenda.install.sql</file>
			<file driver="mysqli">sql/install/mysql/icagenda.install.sql</file>
		</sql>
	</install>

	<uninstall> <!-- Runs on uninstall -->
		<sql>
			<file driver="mysql" charset="utf8">sql/uninstall/mysql/icagenda.uninstall.sql</file>
			<file driver="mysql">sql/uninstall/mysql/icagenda.uninstall.sql</file>
			<file driver="mysqli" charset="utf8">sql/uninstall/mysql/icagenda.uninstall.sql</file>
			<file driver="mysqli">sql/uninstall/mysql/icagenda.uninstall.sql</file>
		</sql>
	</uninstall>

	<update> <!-- Runs on update -->
		<schemas>
			<schemapath type="mysql">sql/updates</schemapath>
		</schemas>
	</update>

	<libraries>
		<library folder="libraries" library="ic_library" name="iC Library" element="lib_ic_library" />
	</libraries>

	<modules>
		<module folder="modules" module="mod_iccalendar" name="iCagenda - Calendar" />
		<module folder="modules" module="mod_ic_event_list" name="iCagenda - Event List" />
	</modules>

	<plugins>
		<plugin folder="plugins" plugin="ic_library" name="System - iC Library" group="system" element="ic_library" />
		<plugin folder="plugins" plugin="icagenda" name="Search - iCagenda" group="search" element="ic_search" />
		<plugin folder="plugins" plugin="ic_autologin" name="System - iCagenda :: Autologin" group="system" element="ic_autologin" />
	</plugins>

	<files folder="site">
		<!-- FILE -->
		<filename>index.html</filename>
		<filename>icagenda.php</filename>
		<filename>controller.php</filename>
		<filename>router.php</filename>
		<!-- FOLDER -->
		<folder>add</folder>
		<folder>helpers</folder>
		<folder>models</folder>
		<folder>themes</folder>
		<folder>views</folder>
	</files>

	<languages folder="site">
		<language tag="en-GB">language/en-GB/en-GB.com_icagenda.ini</language>
		<language tag="fr-FR">language/fr-FR/fr-FR.com_icagenda.ini</language>
		<language tag="it-IT">language/it-IT/it-IT.com_icagenda.ini</language>
	</languages>

	<media destination="com_icagenda" folder="media">
		<filename>index.html</filename>
		<folder>css</folder>
		<folder>icicons</folder>
		<folder>images</folder>
		<folder>js</folder>
	</media>

	<administration>

		<menu link="option=com_icagenda&amp;view=icagenda" img='../media/com_icagenda/images/iconicagenda16.png'>COM_ICAGENDA_MENU</menu>
		<submenu>
			<menu link="option=com_icagenda&amp;view=icagenda" view="icagenda" img='../media/com_icagenda/images/iconicagenda16.png' alt="iCagenda/Home">COM_ICAGENDA_TITLE_ICAGENDA</menu>
			<menu link="option=com_icagenda&amp;view=categories" view="categories" img='../media/com_icagenda/images/all_cats-16.png' alt="iCagenda/Categories">COM_ICAGENDA_MENU_CATEGORIES</menu>
			<menu link="option=com_icagenda&amp;view=events" view="events" img='../media/com_icagenda/images/all_events-16.png' alt="iCagenda/Events">COM_ICAGENDA_EVENTS</menu>
			<menu link="option=com_icagenda&amp;view=registrations" view="registrations" img='../media/com_icagenda/images/registration-16.png' alt="iCagenda/Registrations">COM_ICAGENDA_REGISTRATION</menu>
			<menu link="option=com_icagenda&amp;view=mail&amp;layout=edit" view="mail" img='../media/com_icagenda/images/newsletter-16.png' alt="iCagenda/Newsletter">COM_ICAGENDA_MAIL</menu>
			<menu link="option=com_icagenda&amp;view=customfields" view="customfields" img='../media/com_icagenda/images/customfields-16.png' alt="iCagenda/Newsletter">COM_ICAGENDA_MENU_CUSTOMFIELDS</menu>
			<menu link="option=com_icagenda&amp;view=features" view="features" img='../media/com_icagenda/images/features-16.png' alt="iCagenda/Newsletter">COM_ICAGENDA_MENU_FEATURES</menu>
			<menu link="option=com_icagenda&amp;view=themes" view="themes" img='../media/com_icagenda/images/themes-16.png' alt="iCagenda/themes">COM_ICAGENDA_THEMES</menu>
			<menu link="option=com_icagenda&amp;view=info" view="info" img='../media/com_icagenda/images/info-16.png' alt="iCagenda/info">COM_ICAGENDA_INFO</menu>
		</submenu>

		<files folder="admin">
			<filename>access.xml</filename>
			<filename>CHANGELOG.php</filename>
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<filename>index.html</filename>
			<filename>icagenda.php</filename>
			<folder>assets</folder>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>liveupdate</folder>
			<folder>models</folder>
			<folder>sql</folder>
			<folder>tables</folder>
			<folder>utilities</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB/en-GB.com_icagenda.ini</language>
			<language tag="en-GB">language/en-GB/en-GB.com_icagenda.sys.ini</language>
			<language tag="fr-FR">language/fr-FR/fr-FR.com_icagenda.ini</language>
			<language tag="fr-FR">language/fr-FR/fr-FR.com_icagenda.sys.ini</language>
			<language tag="it-IT">language/it-IT/it-IT.com_icagenda.ini</language>
			<language tag="it-IT">language/it-IT/it-IT.com_icagenda.sys.ini</language>
		</languages>
	</administration>

</extension>
components/com_icagenda/icagenda.php000060400000012537152453623450013603 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.6 2015-06-23
 * @since       1.0
 *
 *  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 3 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, see <http://www.gnu.org/licenses/>.
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

// J3 DS Define :
if ( ! defined('DS')) define('DS', DIRECTORY_SEPARATOR);

// Get Application
$app = JFactory::getApplication();

// Check Errors: iC Library & iCagenda Utilities
$UTILITIES_DIR = is_dir(JPATH_ADMINISTRATOR . '/components/com_icagenda/utilities');

if ( (!$UTILITIES_DIR)
	|| (!class_exists('iCLibrary')) )
{
	$alert_message = JText::_('ICAGENDA_CAN_NOT_LOAD') . '<br />';
	$alert_message.= '<ul>';
	if (!class_exists('iCLibrary')) $alert_message.= '<li>' . JText::_('IC_LIBRARY_NOT_LOADED') . '</li>';
	if (!$UTILITIES_DIR) $alert_message.= '<li>' . JText::_('ICAGENDA_A_FOLDER_IS_MISSING') . '</li>';
	$alert_message.= '</ul>';
	if (!$UTILITIES_DIR) $alert_message.= JText::_('ICAGENDA_IS_NOT_CORRECTLY_INSTALLED') . ' ';
	if (!$UTILITIES_DIR) $alert_message.= JText::_('ICAGENDA_INSTALL_AGAIN') . '<br />';
	if (!$UTILITIES_DIR) $alert_message.= JText::_('IC_ALTERNATIVELY') . ':<br /><ul>';
	if ($UTILITIES_DIR) $alert_message.= JText::_('IC_PLEASE') . ', ';
	if (!class_exists('iCLibrary'))
	{
		if (!$UTILITIES_DIR) $alert_message.= '<li>';
		$alert_message.= JText::_('IC_LIBRARY_CHECK_PLUGIN_AND_LIBRARY');
		if (!$UTILITIES_DIR) $alert_message.= '</li>';
	}
	if (!$UTILITIES_DIR)
	{
		$alert_message.= '<li>' . JText::Sprintf('ICAGENDA_UTILITIES_FIX_MANUAL'
						, '<strong>admin/utilities</strong>'
						, '<strong>administrator/components/com_icagenda/</strong>');
		$alert_message.= '</li></ul>';
	}

	// Get the message queue
	$messages = $app->getMessageQueue();

	$display_alert_message = false;

	// If we have messages
	if (is_array($messages) && count($messages))
	{
		// Check each message for the one we want
		foreach ($messages as $key => $value)
		{
			if ($value['message'] == $alert_message)
			{
				$display_alert_message = true;
			}
		}
	}

	if (!$display_alert_message)
	{
		$app->enqueueMessage($alert_message, 'error');
	}
}
else
{
	// Loads Utilities
	JLoader::registerPrefix('icagenda', JPATH_ADMINISTRATOR . '/components/com_icagenda/utilities');

	if ( ! defined('IC_LIBRARY'))
	{
		define('IC_LIBRARY', '1.3.0');
	}
}

// Set Input J3
$jinput = JFactory::getApplication()->input;

// Load Live Update & Joomla import
// Joomla 3.x / 2.5 SWITCH
if (version_compare(JVERSION, '3.0', 'ge'))
{
	require_once JPATH_ADMINISTRATOR . '/components/com_icagenda/liveupdate/liveupdate.php';

	if ($jinput->get('view') == 'liveupdate')
	{
		LiveUpdate::handleRequest(); return;
	}
}
else
{
	require_once JPATH_COMPONENT_ADMINISTRATOR.DS.'/liveupdate'.DS.'liveupdate.php'; if (JRequest::getCmd('view','') == 'liveupdate')
	{
		LiveUpdate::handleRequest(); return;
	}
	jimport('joomla.application.component.controller');
}

// Set some global property
$document = JFactory::getDocument();
$document->addStyleDeclaration('.icon-48-icagenda {background-image: none);}');

// Load Vector iCicons Font
JHtml::stylesheet( 'media/com_icagenda/icicons/style.css' );

// CSS files which could be overridden into your site template. (eg. /templates/my_template/css/com_icagenda/icagenda-back.css)
JHtml::stylesheet( 'com_icagenda/icagenda-back.css', false, true );

// Load translations
$language = JFactory::getLanguage();
$language->load('com_icagenda', JPATH_ADMINISTRATOR, 'en-GB', true);
$language->load('com_icagenda', JPATH_ADMINISTRATOR, null, true);

// Access check.
if ( ! JFactory::getUser()->authorise('core.manage', 'com_icagenda'))
{
	return JError::raiseWarning(404, JText::_('JERROR_ALERTNOAUTHOR'));
}

// Require helper file
JLoader::register('iCagendaHelper', dirname(__FILE__) . '/helpers/icagenda.php');

// Check config params
icagendaParams::encryptPassword();

// Get an instance of the controller prefixed by iCagenda
// Joomla 3.x / 2.5 SWITCH
if (version_compare(JVERSION, '3.0', 'ge'))
{
	$controller = JControllerLegacy::getInstance('iCagenda');

	// Perform the Request task
	$controller->execute($jinput->get('task'));
}
else
{
	$controller = JController::getInstance('iCagenda');

	// Perform the Request task
	$controller->execute(JRequest::getCmd('task'));
}

// Redirect if set by the controller
$controller->redirect();
components/com_icagenda/controllers/categories.php000060400000002132152453623450016531 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.3.3 2014-04-12
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.controlleradmin');

/**
 * Categories list controller class.
 */
class iCagendaControllerCategories extends JControllerAdmin
{
	/**
	 * Proxy for getModel.
	 * @since	1.0
	 */
	public function getModel($name = 'category', $prefix = 'iCagendaModel')
	{
		$model = parent::getModel($name, $prefix, array('ignore_request' => true));

		return $model;
	}

}
components/com_icagenda/controllers/customfield.php000060400000001742152453623450016730 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rez�, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rez� (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-05-01
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.controllerform');

/**
 * Category controller class.
 */
class iCagendaControllerCustomfield extends JControllerForm
{
    function __construct()
    {
        $this->view_list = 'customfields';
        parent::__construct();
    }
}
components/com_icagenda/controllers/events.php000060400000005355152453623450015722 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.1.10 2013-09-12
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.controlleradmin');

/**
 * Events list controller class.
 */
class iCagendaControllerEvents extends JControllerAdmin
{
	/**
	 * Proxy for getModel.
	 * @since	1.6
	 */
	public function getModel($name = 'event', $prefix = 'iCagendaModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	/**
     * Method to save the submitted ordering values for records via AJAX.
     *
     * @return    void
     *
     * @since   3.0
     */

    public function saveOrderAjax()
    {
        // Get the input
        $input = JFactory::getApplication()->input;
        $pks = $input->post->get('cid', array(), 'array');
		$order = $input->post->get('order', array(), 'array');

        // Sanitize the input
		JArrayHelper::toInteger($pks);
        JArrayHelper::toInteger($order);

        // Get the model
		$model = $this->getModel();

        // Save the ordering
        $return = $model->saveorder($pks, $order);

        if ($return)
        {
            echo "1";
        }

        // Close the application
        JFactory::getApplication()->close();
	}

	public function __construct($config = array())
	{
		parent::__construct($config);

		$this->registerTask('unapprove', 'approve');
    }

	/**
	 * Method to approve an event.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function approve()
	{
		// Check for request forgeries.
		JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

        $input = JFactory::getApplication()->input;
		$ids = $input->post->get('cid', array(), 'array');

		if (empty($ids))
		{
			JError::raiseWarning(500, JText::_('JERROR_NO_ITEMS_SELECTED'));
		}
		else
		{
			// Get the model.
			$model = $this->getModel();

			// Change the state of the records.
			if (!$model->approve($ids))
			{
				JError::raiseWarning(500, $model->getError());
			}
			else
			{
				$this->setMessage(JText::plural('COM_ICAGENDA_N_EVENTS_APPROVED', count($ids)));
			}
		}

		$this->setRedirect('index.php?option=com_icagenda&view=events');
	}
}
components/com_icagenda/controllers/category.php000060400000001732152453623450016226 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rez�, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rez� (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.2.13 2014-01-26
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.controllerform');

/**
 * Category controller class.
 */
class iCagendaControllerCategory extends JControllerForm
{

    function __construct() {
        $this->view_list = 'categories';
        parent::__construct();
    }

}
components/com_icagenda/controllers/registration.php000060400000005017152453623450017123 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.9 2015-07-22
 * @since       3.3.3
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.controllerform');

/**
 * Registration controller class.
 */
class iCagendaControllerRegistration extends JControllerForm
{
    function __construct()
    {
        $this->view_list = 'registrations';
        parent::__construct();
    }

	/**
	 * Return Ajax to load date select options
	 *
	 * @since 3.5.9
	 */
	function dates()
	{
		icagendaAjax::getOptionsEventDates('registration');

		// Cut the execution short
//		JFactory::getApplication()->close();
	}

	/**
	 * 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   3.3.3
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// Initialise variables.
		$recordId	= (int) isset($data[$key]) ? $data[$key] : 0;
		$user		= JFactory::getUser();
		$userId		= $user->get('id');

		// Check general edit permission first.
		if ($user->authorise('core.edit', 'com_icagenda.registration.' . $recordId))
		{
			return true;
		}

		// Fallback on edit.own.
		// First test if the permission is available.
		if ($user->authorise('core.edit.own', 'com_icagenda.registration.' . $recordId))
		{
			// Now test the owner is the user.
			$ownerId = (int) isset($data['created_by']) ? $data['created_by'] : 0;
			if (empty($ownerId) && $recordId)
			{
				// Need to do a lookup from the model.
				$record = $this->getModel()->getItem($recordId);

				if (empty($record))
				{
					return false;
				}

				$ownerId = $record->created_by;
			}

			// If the owner matches 'me' then do the test.
			if ($ownerId == $userId)
			{
				return true;
			}
		}

		// Since there is no asset tracking, revert to the component permissions.
		return parent::allowEdit($data, $key);
	}
}
components/com_icagenda/controllers/features.php000060400000002133152453623450016223 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      doorknob & Cyril Rezé
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-07-02
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.controlleradmin');

/**
 * Features list controller class.
 */
class iCagendaControllerFeatures extends JControllerAdmin
{
	/**
	 * Proxy for getModel.
	 * @since	3.4.0
	 */
	public function getModel($name = 'feature', $prefix = 'iCagendaModel')
	{
		$model = parent::getModel($name, $prefix, array('ignore_request' => true));

		return $model;
	}
}
components/com_icagenda/controllers/mail.php000060400000005703152453623450015335 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rez�, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rez� (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.9 2015-07-30
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.controllerform');

/**
 * Event controller class.
 */
class iCagendaControllerMail extends JControllerForm
{
	function __construct()
	{
		$this->view_list = 'icagenda';
		parent::__construct();
	}

	/**
	 * Return Ajax to load date select options
	 *
	 * @since 3.5.9
	 */
	function dates()
	{
		icagendaAjax::getOptionsEventDates('mail');

		// Cut the execution short
//		JFactory::getApplication()->close();
	}

	/**
	 * Send the mail
	 *
	 * @return void
	 *
	 * @since 3.5.9
	 */
	public function send()
	{
		// Check for request forgeries.
		JSession::checkToken('request') or jexit(JText::_('JINVALID_TOKEN'));

		$app	= JFactory::getApplication();
		$jinput	= $app->input;
		$model	= $this->getModel('Mail');

		if ( ! $model->send())
		{
//			$msg = 'ok';
//			$type = 'message';
//		}
//		else
//		{
//			$msg = 'NOT ok';
//			$type = 'error';

			// Get the user data.
			if (version_compare(JVERSION, '3.0', 'lt'))
			{
				$requestData = JRequest::getVar('jform', array(), 'post');
			}
			else
			{
				$requestData = $this->input->post->get('jform', array(), 'array');
			}

			// Save the data in the session.
			$app->setUserState('com_icagenda.mail.data', $requestData);

			// Redirect back to the newsletter screen.
			$this->setRedirect(JRoute::_('index.php?option=com_icagenda&view=mail&layout=edit', false));
//			$this->setredirect('index.php?option=com_icagenda&view=mail&layout=edit', $msg, $type);

			return false;
		}

		// Flush the data from the session.
		$app->setUserState('com_icagenda.mail.data', null);

//		$msg = $model->getError();

		// Redirect back to the newsletter screen.
		$this->setRedirect(JRoute::_('index.php?option=com_icagenda&view=mail&layout=edit', false));
//		$this->setredirect('index.php?option=com_icagenda&view=mail&layout=edit', $msg, $type);

		return true;
	}

	/**
	 * Cancel the mail
	 *
	 * @return void
	 *
	 * @since 3.5.9
	 */
	public function cancel($key = null)
	{
		// Check for request forgeries.
		JSession::checkToken('request') or jexit(JText::_('JINVALID_TOKEN'));

		$app	= JFactory::getApplication();

		// Flush the data from the session.
		$app->setUserState('com_icagenda.mail.data', null);

		$this->setRedirect(JRoute::_('index.php?option=com_icagenda', false));
	}
}
components/com_icagenda/controllers/customfields.php000060400000002140152453623450017104 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-05-01
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.controlleradmin');

/**
 * Categories list controller class.
 */
class iCagendaControllerCustomfields extends JControllerAdmin
{
	/**
	 * Proxy for getModel.
	 * @since	1.0
	 */
	public function getModel($name = 'customfield', $prefix = 'iCagendaModel')
	{
		$model = parent::getModel($name, $prefix, array('ignore_request' => true));

		return $model;
	}
}
components/com_icagenda/controllers/registrations.raw.php000060400000013565152453623450020105 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.9 2015-07-23
 * @since       3.5.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

/**
 * Registrations list controller class.
 *
 * @since	3.5.0
 */
class icagendaControllerRegistrations extends JControllerLegacy
{
	/**
	 * @var    string  The context for persistent state.
	 *
	 * @since  3.5.0
	 */
	protected $context = 'com_icagenda.registrations';

	/**
	 * Proxy for getModel.
	 *
	 * @param   string  $name    The name of the model.
	 * @param   string  $prefix  The prefix for the model class name.
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return  JModel
	 *
	 * @since   3.5.0
	 */
	public function getModel($name = 'Registrations', $prefix = 'iCagendaModel', $config = array())
	{
		$model = parent::getModel($name, $prefix, array('ignore_request' => true));

		return $model;
	}

	/**
	 * 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  JController  This object to support chaining.
	 *
	 * @since   3.5.0
	 * @todo    This should be done as a view, not here!
	 */
	public function display($cachable = false, $urlparams = false)
	{
		// Get the document object.
		$document	= JFactory::getDocument();
		$vName		= 'registrations';
		$vFormat	= 'raw';

		// Get and render the view.
		if ($view = $this->getView($vName, $vFormat))
		{
			// Get the model for the view.
			$model = $this->getModel($vName);

			// Load the filter state.
			$app = JFactory::getApplication();

			$published = $app->getUserState($this->context . '.filter.state');
			$model->setState('filter.state', $published);

			$eventId = $app->getUserState($this->context . '.filter.events');
			$model->setState('filter.events', $eventId);

			$date = $app->getUserState($this->context . '.filter.dates');
			$model->setState('filter.dates', $date);

			$model->setState('list.limit', 0);
			$model->setState('list.start', 0);

			$input = JFactory::getApplication()->input;
			$form  = $input->get('jform', array(), 'array');

			$model->setState('event_title', $form['event_title']);
			$model->setState('date', $form['date']);
			$model->setState('tickets', $form['tickets']);
			$model->setState('name', $form['name']);
			$model->setState('email', $form['email']);
			$model->setState('phone', $form['phone']);
			$model->setState('customfields', $form['customfields']);
			$model->setState('notes', $form['notes']);
			$model->setState('status', $form['status']);

			$model->setState('basename', $form['basename']);
			$model->setState('separator', $form['separator']);
			$model->setState('compressed', $form['compressed']);

			$config = JFactory::getConfig();
			$cookie_domain = $config->get('cookie_domain', '');
			$cookie_path = $config->get('cookie_path', '/');

			// Joomla 3
			if (version_compare(JVERSION, '3.0', 'ge'))
			{
				setcookie(JApplicationHelper::getHash($this->context . '.event_title'), $form['event_title'], time() + 365 * 86400, $cookie_path, $cookie_domain);
				setcookie(JApplicationHelper::getHash($this->context . '.date'), $form['date'], time() + 365 * 86400, $cookie_path, $cookie_domain);
				setcookie(JApplicationHelper::getHash($this->context . '.tickets'), $form['tickets'], time() + 365 * 86400, $cookie_path, $cookie_domain);
				setcookie(JApplicationHelper::getHash($this->context . '.name'), $form['name'], time() + 365 * 86400, $cookie_path, $cookie_domain);
				setcookie(JApplicationHelper::getHash($this->context . '.email'), $form['email'], time() + 365 * 86400, $cookie_path, $cookie_domain);
				setcookie(JApplicationHelper::getHash($this->context . '.phone'), $form['phone'], time() + 365 * 86400, $cookie_path, $cookie_domain);
				setcookie(JApplicationHelper::getHash($this->context . '.customfields'), $form['customfields'], time() + 365 * 86400, $cookie_path, $cookie_domain);
				setcookie(JApplicationHelper::getHash($this->context . '.notes'), $form['notes'], time() + 365 * 86400, $cookie_path, $cookie_domain);
				setcookie(JApplicationHelper::getHash($this->context . '.status'), $form['status'], time() + 365 * 86400, $cookie_path, $cookie_domain);

				setcookie(JApplicationHelper::getHash($this->context . '.basename'), $form['basename'], time() + 365 * 86400, $cookie_path, $cookie_domain);
				setcookie(JApplicationHelper::getHash($this->context . '.separator'), $form['separator'], time() + 365 * 86400, $cookie_path, $cookie_domain);
				setcookie(JApplicationHelper::getHash($this->context . '.compressed'), $form['compressed'], time() + 365 * 86400, $cookie_path, $cookie_domain);
			}
			// Joomla 2.5
			else
			{
				setcookie(JApplication::getHash($this->context.'.basename'), $form['basename'], time() + 365 * 86400, $cookie_path, $cookie_domain);
				setcookie(JApplication::getHash($this->context.'.separator'), $form['separator'], time() + 365 * 86400, $cookie_path, $cookie_domain);
				setcookie(JApplication::getHash($this->context.'.compressed'), $form['compressed'], time() + 365 * 86400, $cookie_path, $cookie_domain);
			}

			// Push the model into the view (as default).
			$view->setModel($model, true);

			// Push document object into the view.
			$view->document = $document;

			$view->display();
		}
	}
}
components/com_icagenda/controllers/themes.php000060400000003354152453623450015700 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.0 2013-06-03
 * @since       2.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.controllerform');
jimport('joomla.client.helper');

class iCagendaControllerthemes extends JControllerForm
{
	protected	$option 		= 'com_icagenda';

	function __construct() {
		parent::__construct();
		$this->registerTask( 'themeinstall'  , 	'themeinstall' );
	}

	function themeinstall() {

		JRequest::checkToken() or die( 'Invalid Token' );
		$post	= JRequest::get('post');
		$theme = array();

		if (isset($post['theme_component'])) {
			$theme['component'] = 1;
		}

		if (empty($theme)) {

			$ftp =& JClientHelper::setCredentialsFromRequest('ftp');

			$model	= &$this->getModel( 'themes' );

			if ($model->install($theme)) {
				$cache = &JFactory::getCache('mod_menu');
				$cache->clean();
				$msg = JText::_('COM_ICAGENDA_SUCCESS_THEME_INSTALLED');
			}
		} else {
			$msg = JText::_('COM_ICAGENDA_ERROR_THEME_APPLICATION_AREA');
		}

		$this->setRedirect( 'index.php?option=com_icagenda&view=themes', $msg );
	}

	function cancel() {
		$this->setRedirect( 'index.php?option=com_icagenda' );
	}

}
?>
components/com_icagenda/controllers/event.php000060400000007044152453623450015534 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     2.1 2013-02-17
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.controllerform');

/**
 * Event controller class.
 */
class iCagendaControllerEvent extends JControllerForm
{
    function __construct()
    {
        $this->view_list = 'events';
        parent::__construct();
    }

	/**
	 * 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())
	{
		// Initialise variables.
		$user = JFactory::getUser();
		$categoryId = JArrayHelper::getValue($data, 'catid', JRequest::getInt('filter_category_id'), 'int');
		$allow = null;

		if ($categoryId)
		{
			// If the category has been passed in the data or URL check it.
			$allow = $user->authorise('core.create', 'com_icagenda.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.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// Initialise variables.
		$recordId = (int) isset($data[$key]) ? $data[$key] : 0;
		$user = JFactory::getUser();
		$userId = $user->get('id');

		// Check general edit permission first.
		if ($user->authorise('core.edit', 'com_icagenda.event.' . $recordId))
		{
			return true;
		}

		// Fallback on edit.own.
		// First test if the permission is available.
		if ($user->authorise('core.edit.own', 'com_icagenda.event.' . $recordId))
		{
			// Now test the owner is the user.
			$ownerId = (int) isset($data['created_by']) ? $data['created_by'] : 0;
			if (empty($ownerId) && $recordId)
			{
				// Need to do a lookup from the model.
				$record = $this->getModel()->getItem($recordId);

				if (empty($record))
				{
					return false;
				}

				$ownerId = $record->created_by;
			}

			// If the owner matches 'me' then do the test.
			if ($ownerId == $userId)
			{
				return true;
			}
		}

		// Since there is no asset tracking, revert to the component permissions.
		return parent::allowEdit($data, $key);
	}

	/**
	 * 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)
	{
		JRequest::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

		// Set the model
		$model = $this->getModel('Event', '', array());

		// Preset the redirect
		$this->setRedirect(JRoute::_('index.php?option=com_icagenda&view=events' . $this->getRedirectToListAppend(), false));

		return parent::batch($model);
	}
}
components/com_icagenda/controllers/icagenda.php000060400000002235152453623450016143 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rez�, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rez� (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.0 2013-05-05
 * @since       1.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.controlleradmin');

/**
 * Categories list controller class.
 */
// J2.5 : class iCagendaControlleriCagenda extends JControllerAdmin
class iCagendaControlleriCagenda extends JControllerLegacyAdmin
{
	/**
	 * Proxy for getModel.
	 * @since	1.6
	 */
	public function &getModel($name = 'icagenda', $prefix = 'iCagendaModel')
	{
		$model = parent::getModel($name, $prefix, array('ignore_request' => true));
		return $model;
	}
}
components/com_icagenda/controllers/registrations.php000060400000002144152453623450017304 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rez�, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rez� (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.9 2015-07-22
 * @since       2.0.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.controlleradmin');

/**
 * Registrations list controller class.
 */
class iCagendaControllerRegistrations extends JControllerAdmin
{
	/**
	 * Proxy for getModel.
	 * @since	2.0.0
	 */
	public function getModel($name = 'registration', $prefix = 'iCagendaModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}
}
components/com_icagenda/controllers/feature.php000060400000001674152453623450016051 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      doorknob
 * @link        http://www.joomlic.com
 *
 * @version     3.4.0 2014-07-02
 * @since       3.4.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

jimport('joomla.application.component.controllerform');

/**
 * Feature controller class.
 */
class iCagendaControllerFeature extends JControllerForm
{
	function __construct()
	{
		$this->view_list = 'features';

		parent::__construct();
	}
}
components/com_icagenda/controllers/index.html000060400000000032152453623450015665 0ustar00<html><body></body></html>components/com_icagenda/script.icagenda.pro.php000060400000125416152453623450015706 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda PRO v3 by Jooml!C - Events Management Extension - Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 * @package     com_icagenda
 * @copyright   Copyright (c)2012-2015 Cyril Rezé, Jooml!C - All rights reserved
 *
 * @license     GNU General Public License version 3 or later; see LICENSE.txt
 * @author      Cyril Rezé (Lyr!C)
 * @link        http://www.joomlic.com
 *
 * @version     3.5.12 2015-10-12
 * @since       2.0
 *------------------------------------------------------------------------------
*/

// No direct access to this file
defined('_JEXEC') or die();

//Système Installation/Mises à jour, composant iCagenda http://www.joomlic.com
jimport('joomla.filesystem.folder');
jimport('joomla.filesystem.file');


class com_icagendaInstallerScript
{
	/*
	 * $parent is the class calling this method.
	 * $type is the type of change (install, update or discover_install, not uninstall).
	 * preflight runs before anything else and while the extracted files are in the uploaded temp folder.
	 * If preflight returns false, Joomla will abort the update and undo everything already done.
	 */
	private $ictype = 'pro';

	/** @var array The list of extra modules and plugins to install */
	private $installation_queue = array(
		// modules => { (folder) => { (module) => { (position), (published) } }* }*
		'modules' => array(
			'admin' => array(
			),
			'site' => array(
				'mod_iccalendar'	=> array('', 0),
			)
		),
		// plugins => { (folder) => { (element) => (published) }* }*
		// plugins => { (folder) => { (element) => { (name), (published) } }* }*
		'plugins' => array(
			'system' => array(
				'ic_autologin'		=> array('System - iCagenda :: Autologin', 1),
				'ic_library'		=> array('System - iC Library', 1),
			),
			'search' => array(
				'icagenda'			=> array('Search - iCagenda', 1),
			)
		)
	);

	/** @var array Obsolete files and folders to remove from the iCagenda oldest releases*/
	private $icagendaRemoveFiles = array(
		'files'	=> array(
			'components/com_icagenda/views/list/tmpl/search.php',
			'components/com_icagenda/views/list/tmpl/search.xml',
			'modules/mod_iccalendar/js/bottomcenter_function.js',
			'modules/mod_iccalendar/js/center_function.js',
			'modules/mod_iccalendar/js/left_function.js',
			'modules/mod_iccalendar/js/right_function.js',
			'modules/mod_iccalendar/js/topcenter_function.js',
			'components/com_icagenda/helpers/icmodcalendar.php',
			'administrator/components/com_icagenda/models/fields/eventtitle.php',
			'components/com_icagenda/themes/packs/ic_rounded/ic_rounded_alldates.php',
			'media/com_icagenda/icicons/lte-ie7.js',
			'media/com_icagenda/icicons/fonts/iCicons.dev.svg',
			'media/com_icagenda/icicons/selection.json',
			'modules/mod_iccalendar/js/function.js',
			'modules/mod_iccalendar/js/function_312.js',
			'modules/mod_iccalendar/js/function_316.js',
			'modules/mod_iccalendar/js/ictip.js',
			'components/com_icagenda/themes/packs/default/default_list.php',
			'components/com_icagenda/themes/packs/ic_rounded/ic_rounded_list.php',
			'media/com_icagenda/images/iconicagenda48 - copie.png',
			'administrator/components/com_icagenda/views/event/tmpl/ajaxfile.php',
			'administrator/components/com_icagenda/views/registration/tmpl/default.php',
			'administrator/components/com_icagenda/models/fields/modal/time.php',
			'administrator/components/com_icagenda/UPDATELOGS.php',
			'administrator/components/com_icagenda/sql/install.mysql.utf8.sql',
			'administrator/components/com_icagenda/sql/uninstall.mysql.utf8.sql',
			'administrator/components/com_icagenda/models/fields/custom_field.php',
//			'modules/mod_ic_event_list/css/icrounded-full_style.css', // dev. PRO
//			'modules/mod_ic_event_list/tmpl/icrounded-full.php', // dev. PRO
			'administrator/components/com_icagenda/tables/mail.php',
			'administrator/components/com_icagenda/models/fields/modal/mailinglist.php',
		),
		'folders' => array(
			'modules/mod_iccalendar/tmpl',
			'components/com_icagenda/views/event',
			'components/com_icagenda/css',
			'modules/mod_ic_event_list/language',
			'modules/mod_iccalendar/language',
			'administrator/components/com_icagenda/add/js',
			'components/com_icagenda/add/js',
			'media/com_icagenda/scripts',
			'components/com_icagenda/js',
			'administrator/components/com_icagenda/add/css',
			'components/com_icagenda/add/css',
			'administrator/components/com_icagenda/add/image',
			'components/com_icagenda/add/image',
			'administrator/components/com_icagenda/globalization',
			'administrator/components/com_icagenda/add',
			'components/com_icagenda/views/events',
		)
	);


	private function _removeObsoleteFilesAndFolders($icagendaRemoveFiles)
	{
		// Remove files
		jimport('joomla.filesystem.file');
		if(!empty($icagendaRemoveFiles['files'])) foreach($icagendaRemoveFiles['files'] as $file) {
			$f = JPATH_ROOT.'/'.$file;
			if(!JFile::exists($f)) continue;
			JFile::delete($f);
		}

		// Remove folders
		jimport('joomla.filesystem.file');
		if(!empty($icagendaRemoveFiles['folders'])) foreach($icagendaRemoveFiles['folders'] as $folder) {
			$f = JPATH_ROOT.'/'.$folder;
			if(!JFolder::exists($f)) continue;
			JFolder::delete($f);
		}
	}

	function preflight( $type, $parent )
	{
		$jversion = new JVersion();

		// Installing component manifest file version
		$this->release = $parent->get( "manifest" )->version;

		// Manifest file minimum Joomla version
		$this->minimum_joomla_release = $parent->get( "manifest" )->attributes()->version;

		// Load translations
		$language = JFactory::getLanguage();
		$language->load('com_icagenda.sys', JPATH_ADMINISTRATOR, 'en-GB', true);
		$language->load('com_icagenda.sys', JPATH_ADMINISTRATOR, null, true);

//		if (version_compare(phpversion(), '5.3.0', '<')) {
//			JError::raiseWarning( 100, '<span class="icon-warning"></span><b> '.JText::sprintf('COM_ICAGENDA_YOUR_PHP_VERSION_IS', phpversion()).'</b><br />'.JText::_('COM_ICAGENDA_PHP_VERSION_JOOMLA_RECOMMENDED').' ( '.JText::_('IC_READMORE').': <a href="http://www.joomla.org/technical-requirements.html" target="_blanck">http://www.joomla.org/technical-requirements.html</a> )<br />'.JText::_('COM_ICAGENDA_PHP_VERSION_ICAGENDA_RECOMMENDATION').'' );
//		}

		echo '<table><tr><td><img src="../media/com_icagenda/images/logo_icagenda.png" /></td><td width="10px"></td><td style="font-size: 20px"><b>' . JText::_('COM_ICAGENDA') . '&trade; PRO<span style="font-size: 11px"> v '.$this->release.' </span></b><br /><span style="font-size: 16px; color:#555555;">' . JText::_('COM_ICAGENDA_XML_DESCRIPTION') . '</span><br /><br /><span style="font-size: 13px">&#8226; <b>' . JText::_('COM_ICAGENDA_FEATURES_LANGUAGES') . '</b> English <img src="../media/mod_languages/images/en.gif" height="10px"/> - French <img src="../media/mod_languages/images/fr.gif" height="10px"/> - Italian <img src="../media/mod_languages/images/it.gif" height="10px"/><br />'
		.'&#8226; <b>' . JText::_('COM_ICAGENDA_FEATURES_TRANSLATION_PACKS') . '</b> '
		.'Arabic (Unitag) <img src="../media/mod_languages/images/ar.gif" alt="" height="10px"/> - '
		.'Basque <img src="../media/mod_languages/images/eu_es.gif" alt="" height="10px"/> - '
		.'Catalan <img src="../media/mod_languages/images/ca.gif" alt="" height="10px"/> - '
		.'Chinese (Taiwan) <img src="../media/mod_languages/images/tw.gif" alt="" height="10px"/> - '
		.'Croatian <img src="../media/mod_languages/images/hr.gif" alt="" height="10px"/> - '
		.'Czech <img src="../media/mod_languages/images/cz.gif" alt="" height="10px"/> - '
		.'Danish <img src="../media/mod_languages/images/dk.gif" alt="" height="10px"/> - '
		.'Dutch <img src="../media/mod_languages/images/nl.gif" alt="" height="10px"/> - '
		.'English (USA) <img src="../media/mod_languages/images/us.gif" alt="" height="10px"/> - '
		.'Esperanto <img src="../media/mod_languages/images/eo.gif" alt="" height="10px"/> - '
		.'Estonian <img src="../media/mod_languages/images/et.gif" alt="" height="10px"/> - '
		.'Finnish <img src="../media/mod_languages/images/fi.gif" alt="" height="10px"/> - '
		.'German <img src="../media/mod_languages/images/de.gif" alt="" height="10px"/> - '
		.'Greek <img src="../media/mod_languages/images/el.gif" alt="" height="10px"/> - '
		.'Hungarian <img src="../media/mod_languages/images/hu.gif" alt="" height="10px"/> - '
		.'Japanese <img src="../media/mod_languages/images/ja.gif" alt="" height="10px"/> - '
		.'Latvian <img src="../media/mod_languages/images/lv.gif" alt="" height="10px"/> - '
		.'Lithuanian <img src="../media/mod_languages/images/lt.gif" alt="" height="10px"/> - '
		.'Luxembourgish <img src="../media/mod_languages/images/icon-16-language.png" alt="" height="10px"/> - '
		.'Norwegian <img src="../media/mod_languages/images/no.gif" alt="" height="10px"/> - '
		.'Polish <img src="../media/mod_languages/images/pl.gif" alt="" height="10px"/> - '
		.'Portuguese (Brasil) <img src="../media/mod_languages/images/pt_br.gif" alt="" height="10px"/> - '
		.'Portuguese <img src="../media/mod_languages/images/pt.gif" alt="" height="10px"/> - '
		.'Romanian <img src="../media/mod_languages/images/ro.gif" alt="" height="10px"/> - '
		.'Russian <img src="../media/mod_languages/images/ru.gif" alt="" height="10px"/> - '
		.'Serbian (latin) <img src="../media/mod_languages/images/sr.gif" alt="" height="10px"/> - '
		.'Slovak <img src="../media/mod_languages/images/sk.gif" alt="" height="10px"/> - '
		.'Slovenian <img src="../media/mod_languages/images/sl.gif" alt="" height="10px"/> - '
		.'Spanish <img src="../media/mod_languages/images/es.gif" alt="" height="10px"/> - '
		.'Swedish <img src="../media/mod_languages/images/sv.gif" alt="" height="10px"/> - '
		.'Ukrainian <img src="../media/mod_languages/images/uk.gif" alt="" height="10px"/>'
		.'<br />&#8226; ' . JText::_('COM_ICAGENDA_FEATURES_BACKEND') . '<br />&#8226; ' . JText::_('COM_ICAGENDA_FEATURES_FRONTEND') . '<br /></span></td></tr></table><br /><br />';


		if ( $type != 'install' )
		{
			echo '<span style="text-transform:uppercase; font-size: 14px"><b>' . JText::_('COM_ICAGENDA_WELCOME_1') . $this->release . '</span>';
			echo '<span style="text-transform:uppercase; font-size: 14px">' . JText::_('COM_ICAGENDA_WELCOME_2') . '</b></span>';
			echo '<span style="text-transform:uppercase; letter-spacing: 3px; font-size: 14px">' . JText::_('COM_ICAGENDA_WELCOME_3') . '</span><br /><br />';
			echo '<div style="margin-left:10px"><span style="font-size: 16px; color:#555555;">'.JText::_('COM_ICAGENDA_VIDEO_GETTING_STARTED') . '</span>';
			$urlposter = '../media/com_icagenda/images/video_poster_icagenda.jpg';
			?>

			<div onclick="thevid=document.getElementById('thevideo'); thevid.style.display='block'; this.style.display='none'">
				<img style="cursor: pointer;" src="<?php echo $urlposter; ?>" alt=""  width="500px" />
			</div>

			<div id="thevideo" style="display: none;">
				<iframe src="http://www.joomlic.com/_icagenda/<?php echo $this->ictype; ?>/tutorial_video_install.html" frameborder="0" width="500px" height="340" scrolling="no"></iframe>
			</div>

			<div style="color:#333; margin-top: 5px; font-size: 0.8em;">
				© <?php echo date("Y"); ?> <?php echo JText::_('COM_ICAGENDA_VIDEO_TUTORIALS');?> - Giuseppe Bosco (giusebos) | <a href="http://www.newideasproject.com/" target="_blanck">www.newideasproject.com</a>
			</div>

			<div style="color:#333; margin-top: 5px; font-size: 0.8em; line-height:14px; height:30px;">
				<a href="http://www.youtube.com/user/iCagenda" target="_blank"><img src='../media/com_icagenda/images/youtube_iCagenda.png' style='vertical-align:bottom;' /></a> : <a href="http://www.youtube.com/user/iCagenda" target="_blanck"><?php echo JText::_('COM_ICAGENDA_VIDEO_TUTORIALS');?></a>
			</div>
			<br />
			</div>
			<?php
		}

		// Show the essential information at the install/update back-end
		echo '<br /><p style="font-size: 10px">' . JText::_('COM_ICAGENDA_INSTALL_THIS_RELEASE') . '<b> '.$this->release.'</b>';
		if ( $type == 'update' ) {
			echo '<br />'.JText::_('COM_ICAGENDA_INSTALL_CACHE_VERSION') . '<b> '.$this->getParam('version').'</b>';
		}
		echo '<br />'.JText::_('COM_ICAGENDA_INSTALL_MINIMUM_JOOMLA_VERSION') . '<b> '.$this->minimum_joomla_release.'</b>';
		echo '<br />'.JText::_('COM_ICAGENDA_INSTALL_CURRENT_JOOMLA_VERSION') . '<b> '.$jversion->getShortVersion().'</b><br /><br />';

		// Abort if the current Joomla release is older
		if (version_compare($jversion->getShortVersion(), $this->minimum_joomla_release, 'lt'))
		{
			Jerror::raiseWarning(null, ' ' . JText::_('COM_ICAGENDA_INSTALL_ERROR_JOOMLA_VERSION') . ' ' . $this->minimum_joomla_release);

			return false;
		}

		// Abort if Joomla 3 release is prior to 3.2.3
		if (version_compare(JVERSION, '3.0.0', 'ge')
			&& version_compare(JVERSION, '3.2.3', 'lt'))
		{
			JFactory::getApplication()->enqueueMessage(JText::_('COM_ICAGENDA_INSTALL_ERROR_JOOMLA_VERSION') . ' ' . '3.2.3', 'error');

			return false;
		}


		// Abort if the component being installed is not newer than the currently installed version
		if ($type == 'update')
		{
			echo '<span style="text-transform:uppercase; font-size: 14px"><b>' . JText::_('COM_ICAGENDA') . ' : ' . JText::_('COM_ICAGENDA_UPDATE') . ' ' . $this->release . ' !</b></span><br><br>';
			$oldRelease = $this->getParam('version');
			$rel = ' ' . $oldRelease . ' to ' . $this->release;
//			if ( version_compare( $this->release, $oldRelease, 'le' ) ) {
//				Jerror::raiseWarning(null, ' ' . JText::_('COM_ICAGENDA_INSTALL_INCORRECT_VERSION') . ' ' . $rel);
//				return false;
//			}

		}
		else
		{
			$rel = $this->release;
		}

//		echo '<span style="text-transform:uppercase; font-size: 8px">' . JText::_('COM_ICAGENDA_PREFLIGHT_') . ': ' . $type . $rel . ' | </span>';
	}

	/*
	 * $parent is the class calling this method.
	 * install runs after the database scripts are executed.
	 * If the extension is new, the install method is run.
	 * If install returns false, Joomla will abort the install and undo everything already done.
	 */
	function install( $parent )
	{
		// Load language
		JFactory::getLanguage()->load('com_installer', JPATH_ADMINISTRATOR);
		$module_type = JText::_( 'COM_INSTALLER_TYPE_TYPE_MODULE' );
		$plugin_type = JText::_( 'COM_INSTALLER_TYPE_TYPE_PLUGIN' );
		$library_type = JText::_( 'COM_INSTALLER_TYPE_TYPE_LIBRARY' );

		// Addons install (library, modules, plugins)
		$db = JFactory::getDbo();
		$manifest = $parent->get("manifest");
		$parent = $parent->getParent();
		$source = $parent->getPath("source");
		$installer = new JInstaller();
		$installLibraries = array();
		$installModules = array();
		$installPlugins = array();
		echo '<div><i>'.JText::_('JTOOLBAR_INSTALL').'</i></div>';

        // Proceed Libraries Install
		if (is_object($manifest->libraries) && isset($manifest->libraries->library))
		{
			foreach($manifest->libraries->library as $library)
			{
				$attributes = $library->attributes();
				$lib = $source.'/'.$attributes['folder'].'/'.$attributes['library'];
				$installer->install($lib);
				$installLibraries[] =  $attributes['library'];
				$installed_lib = '<b>'.$attributes['name'].'</b>';
				echo '<div><span style="color:blue">['.$library_type.']</span> '.JText::sprintf( 'COM_INSTALLER_INSTALL_SUCCESS', $installed_lib ).' &#8680; <span style="color:green"><b>'.JText::_( 'JPUBLISHED' ).'</b></span></div>';
			}
		}

        // Proceed Modules Install
		if (is_object($manifest->modules) && isset($manifest->modules->module))
		{
         foreach($manifest->modules->module as $module)
			{
				$attributes = $module->attributes();
				$mod = $source.'/'.$attributes['folder'].'/'.$attributes['module'];
				$installer->install($mod);
				$installed_mod = '<b>'.$attributes['name'].'</b>';
				echo '<div><span style="color:blue">['.$module_type.']</span> '.JText::sprintf( 'COM_INSTALLER_INSTALL_SUCCESS', $installed_mod ).' &#8680; <span style="color:red"><b>'.JText::_( 'JUNPUBLISHED' ).'</b></span></div>';
            }
        }

        // Proceed Plugins Install
		$this->_installAddons($parent, $source);

		echo '<br /><br />';

//		echo '<span style="text-transform:uppercase; font-size: 8px"><b>' . JText::_('COM_ICAGENDA_INSTALL') . $this->release . '</b> | </span>';
		// You can have the backend jump directly to the newly installed component configuration page
		// $parent->getParent()->setRedirectURL('index.php?option=com_democompupdate');


		// Get Joomla Images PATH setting
		$params = JComponentHelper::getParams('com_media');
		$image_path = $params->get('image_path');

		// Create Folder iCagenda in ROOT/IMAGES_PATH/icagenda
		$folder[0][0]	=	'icagenda/' ;
		$folder[0][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folder[0][0];
		$folder[1][0]	=	'icagenda/files/';
		$folder[1][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folder[1][0];
		$folder[2][0]	=	'icagenda/thumbs/';
		$folder[2][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folder[2][0];
		$folder[3][0]	=	'icagenda/thumbs/system/';
		$folder[3][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folder[3][0];
		$folder[4][0]	=	'icagenda/thumbs/themes/';
		$folder[4][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folder[4][0];
		$folder[5][0]	=	'icagenda/thumbs/copy/';
		$folder[5][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folder[5][0];
		$folder[6][0]	=	'icagenda/feature_icons/';
		$folder[6][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folder[6][0];
		$folder[7][0]	=	'icagenda/feature_icons/16_bit';
		$folder[7][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folder[7][0];
		$folder[8][0]	=	'icagenda/feature_icons/24_bit';
		$folder[8][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folder[8][0];
		$folder[9][0]	=	'icagenda/feature_icons/32_bit';
		$folder[9][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folder[9][0];
		$folder[10][0]	=	'icagenda/feature_icons/48_bit';
		$folder[10][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folder[10][0];
		$folder[11][0]	=	'icagenda/feature_icons/64_bit';
		$folder[11][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folder[11][0];


		$message = '<div><i>'.JText::_('COM_ICAGENDA_FOLDER_CREATION').'</i></div>';
		$error	 = array();
		foreach ($folder as $key => $value)
		{
			if (!JFolder::exists( $value[1]))
			{
				if (JFolder::create( $value[1], 0755 ))
				{

					$data = "<html>\n<body bgcolor=\"#FFFFFF\">\n</body>\n</html>";
					JFile::write($value[1]."/index.html", $data);
					$message .= '<div><b><span style="color:#009933">'.JText::_('COM_ICAGENDA_FOLDER').'</span> ' . $image_path.'/'.$value[0]
							   .' <span style="color:#009933">'.JText::_('COM_ICAGENDA_CREATED').'</span></b></div>';
					$error[] = 0;
				}
				else
				{
					$message .= '<div><b><span style="color:#CC0033">'.JText::_('COM_ICAGENDA_FOLDER').'</span> ' . $image_path.'/'.$value[0]
							   .' <span style="color:#CC0033">'.JText::_('COM_ICAGENDA_CREATION_FAILED').'</span></b> '.JText::_('COM_ICAGENDA_PLEASE_CREATE_MANUALLY').'</div>';
					$error[] = 1;
				}
			}
			else//Folder exist
			{
				$message .= '<div><b><span style="color:#009933">'.JText::_('COM_ICAGENDA_FOLDER').'</span> ' . $image_path.'/'.$value[0]
							   .' <span style="color:#009933">'.JText::_('COM_ICAGENDA_EXISTS').'</span></b></div>';
				$error[] = 0;
			}
		}

		$message.= '<br /><br />';
		echo $message;


	}

	/*
	 * $parent is the class calling this method.
	 * update runs after the database scripts are executed.
	 * If the extension exists, then the update method is run.
	 * If this returns false, Joomla will abort the update and undo everything already done.
	 */
	function update( $parent )
	{
		// Load language
		JFactory::getLanguage()->load('com_installer', JPATH_ADMINISTRATOR);
		$module_type = JText::_( 'COM_INSTALLER_TYPE_TYPE_MODULE' );
		$plugin_type = JText::_( 'COM_INSTALLER_TYPE_TYPE_PLUGIN' );
		$library_type = JText::_( 'COM_INSTALLER_TYPE_TYPE_LIBRARY' );

		// Addons update (library, modules, plugins)
		$db = JFactory::getDbo();
		$manifest = $parent->get("manifest");
		$parent = $parent->getParent();
		$source = $parent->getPath("source");
		$installer = new JInstaller();
		$installLibraries = array();
		$installModules = array();
		$installPlugins = array();
		echo '<div><i>'.JText::_('COM_INSTALLER_TOOLBAR_UPDATE').'</i></div>';

		// Pre-test iC Library
		$query	= $db->getQuery(true);
		$query->select('p.enabled')
			->from('`#__extensions` AS p')
			->where($db->qn('type').' = '.$db->q('library'))
			->where($db->qn('element').' = '.$db->q('lib_ic_library'));
		$db->setQuery($query);
		$ic_library_ok = $db->loadResult();

		// Proceed Libraries Update
		if (is_object($manifest->libraries) && isset($manifest->libraries->library))
		{
			foreach($manifest->libraries->library as $library)
			{
				$attributes = $library->attributes();
				$lib = $source.'/'.$attributes['folder'].'/'.$attributes['library'];
				$installer->install($lib);
				$element = $attributes['element'];
				$installLibraries[] =  $attributes['library'];
				$installed_lib = '<b>'.$attributes['name'].'</b>';
				if (($ic_library_ok == '1') AND ($element == 'lib_ic_library'))
				{
					echo '<div><span style="color:orange">['.$library_type.']</span> '.JText::sprintf( 'COM_INSTALLER_MSG_UPDATE_SUCCESS', $installed_lib ).' </div>';
				}
				else
				{
					echo '<div><span style="color:orange">['.$library_type.']</span> '.JText::sprintf( 'COM_INSTALLER_INSTALL_SUCCESS', $installed_lib ).' &#8680; <span style="color:green"><b>'.JText::_( 'JPUBLISHED' ).'</b></span></div>';
				}
			}
		}

        // Proceed Modules Update
		if (is_object($manifest->modules) && isset($manifest->modules->module))
		{
         foreach($manifest->modules->module as $module)
			{
				$attributes = $module->attributes();
				$mod = $source.'/'.$attributes['folder'].'/'.$attributes['module'];
				$installer->install($mod);
				$installModules[] =  $attributes['module'];
				$installed_mod = '<b>'.$attributes['name'].'</b>';

				echo '<div><span style="color:red">['.$module_type.']</span> '.JText::sprintf( 'COM_INSTALLER_MSG_UPDATE_SUCCESS', $installed_mod ).' </div>';
            }
        }

        // Proceed Plugins Update
		$this->_installAddons($parent, $source);

		echo '<br /><br />';

//		echo '<span style="text-transform:uppercase; font-size: 8px">' . JText::_('COM_ICAGENDA_UPDATE') . $this->release . ' | </span>';
		// You can have the backend jump directly to the newly updated component configuration page
		// $parent->getParent()->setRedirectURL('index.php?option=com_democompupdate');


		// Get Joomla Images PATH setting
		$params = JComponentHelper::getParams('com_media');
		$image_path = $params->get('image_path');

		// Create Folder iCagenda in ROOT/IMAGES_PATH/icagenda
		$folderimg[0][0]	=	'icagenda/' ;
		$folderimg[0][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folderimg[0][0];
		$folderimg[1][0]	=	'icagenda/files/';
		$folderimg[1][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folderimg[1][0];
		$folderimg[2][0]	=	'icagenda/thumbs/';
		$folderimg[2][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folderimg[2][0];
		$folderimg[3][0]	=	'icagenda/thumbs/system/';
		$folderimg[3][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folderimg[3][0];
		$folderimg[4][0]	=	'icagenda/thumbs/themes/';
		$folderimg[4][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folderimg[4][0];
		$folderimg[5][0]	=	'icagenda/thumbs/copy/';
		$folderimg[5][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folderimg[5][0];
		$folderimg[6][0]	=	'icagenda/feature_icons/';
		$folderimg[6][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folderimg[6][0];
		$folderimg[7][0]	=	'icagenda/feature_icons/16_bit';
		$folderimg[7][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folderimg[7][0];
		$folderimg[8][0]	=	'icagenda/feature_icons/24_bit';
		$folderimg[8][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folderimg[8][0];
		$folderimg[9][0]	=	'icagenda/feature_icons/32_bit';
		$folderimg[9][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folderimg[9][0];
		$folderimg[10][0]	=	'icagenda/feature_icons/48_bit';
		$folderimg[10][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folderimg[10][0];
		$folderimg[11][0]	=	'icagenda/feature_icons/64_bit';
		$folderimg[11][1]	= 	JPATH_ROOT.'/'.$image_path.'/'.$folderimg[11][0];


		$message = '<div><i>'.JText::_('COM_ICAGENDA_FOLDER_CREATION').'</i></div>';
		$error	 = array();
		foreach ($folderimg as $key => $value)
		{
			if (!JFolder::exists( $value[1]))
			{
				if (JFolder::create( $value[1], 0755 ))
				{

					$data = "<html>\n<body bgcolor=\"#FFFFFF\">\n</body>\n</html>";
					JFile::write($value[1]."/index.html", $data);
					$message .= '<div><b><span style="color:#009933">'.JText::_('COM_ICAGENDA_FOLDER').'</span> ' . $image_path.'/'.$value[0]
							   .' <span style="color:#009933">'.JText::_('COM_ICAGENDA_CREATED').'</span></b></div>';
					$error[] = 0;
				}
				else
				{
					$message .= '<div><b><span style="color:#CC0033">'.JText::_('COM_ICAGENDA_FOLDER').'</span> ' . $image_path.'/'.$value[0]
							   .' <span style="color:#CC0033">'.JText::_('COM_ICAGENDA_CREATION_FAILED').'</span></b> '.JText::_('COM_ICAGENDA_PLEASE_CREATE_MANUALLY').'</div>';
					$error[] = 1;
				}
			}
			else//Folder exist
			{
				$message .= '<div><b><span style="color:#009933">'.JText::_('COM_ICAGENDA_FOLDER').'</span> ' . $image_path.'/'.$value[0]
							   .' <span style="color:#009933">'.JText::_('COM_ICAGENDA_EXISTS').'</span></b></div>';
				$error[] = 0;
			}
		}

		$message.= '<br /><br />';

		echo $message;
	}


	/**
	 * Installs subextensions (modules, plugins) bundled with the main extension
	 * NOTE: Currently installing only plugins (3.4.0-alpha). Modules install to be added later.
	 *
	 * @param JInstaller $parent
	 *
	 * @return JObject The subextension installation status
	 */
	private function _installAddons($parent, $source)
	{
		// Load language
		JFactory::getLanguage()->load('com_installer', JPATH_ADMINISTRATOR);
		$module_type = JText::_( 'COM_INSTALLER_TYPE_TYPE_MODULE' );
		$plugin_type = JText::_( 'COM_INSTALLER_TYPE_TYPE_PLUGIN' );
		$library_type = JText::_( 'COM_INSTALLER_TYPE_TYPE_LIBRARY' );

		$db = JFactory::getDbo();

		/*
		 * PLUGINS UPDATE
		 */

		// Pre-test if AutoLogin plugin is already installed
		$db->setQuery('SELECT `extension_id` FROM #__extensions WHERE `type` = "plugin" AND `element` = "ic_autologin" AND `folder` = "system"');
		$ic_autologin_ok = $db->loadResult();

		// Pre-test if iCagenda search plugin is already installed
		$db->setQuery('SELECT `extension_id` FROM #__extensions WHERE `type` = "plugin" AND `element` = "icagenda" AND `folder` = "search"');
		$search_ok = $db->loadResult();

		// Pre-test if iC Library plugin is already installed
		$db->setQuery('SELECT `extension_id` FROM #__extensions WHERE `type` = "plugin" AND `element` = "ic_library" AND `folder` = "system"');
		$plg_ic_library_ok = $db->loadResult();

		$status = new JObject();
		$status->plugins = array();


		// Plugins installation
		if (count($this->installation_queue['plugins']))
		{
			foreach ($this->installation_queue['plugins'] as $folder => $plugins)
			{
				if (count($plugins))
				{
					foreach ($plugins as $plugin => $pluginPreferences)
					{
						$path = "$source/plugins/$folder/$plugin";

						if (!is_dir($path))
						{
							$path = "$source/plugins/$folder/plg_$plugin";
						}

						if (!is_dir($path))
						{
							$path = "$source/plugins/$plugin";
						}

						if (!is_dir($path))
						{
							$path = "$source/plugins/plg_$plugin";
						}

						if (!is_dir($path))
						{
							continue;
						}

						// Was the plugin already installed?
						$query = $db->getQuery(true)
							->select('COUNT(*)')
							->from($db->qn('#__extensions'))
							->where($db->qn('element') . ' = ' . $db->q($plugin))
							->where($db->qn('folder') . ' = ' . $db->q($folder));
						$db->setQuery($query);

						try
						{
							$count = $db->loadResult();
						}
						catch (Exception $exc)
						{
							$count = 0;
						}

						$installer = new JInstaller;
						$result = $installer->install($path);

						$status->plugins[] = array('name' => 'plg_' . $plugin, 'group' => $folder, 'result' => $result);

						list($pluginName, $pluginPublished) = $pluginPreferences;

						if ($pluginPublished && !$count)
						{
							$query = $db->getQuery(true)
								->update($db->qn('#__extensions'))
								->set($db->qn('enabled') . ' = ' . $db->q('1'))
								->where($db->qn('element') . ' = ' . $db->q($plugin))
								->where($db->qn('folder') . ' = ' . $db->q($folder));
							$db->setQuery($query);

							try
							{
								$db->execute();
							}
							catch (Exception $exc)
							{
								// Nothing
							}
						}

						$pluginName = '<strong>'.$pluginName.'</strong>';

						if ($ic_autologin_ok && ($plugin == 'ic_autologin'))
						{
							echo '<div><span style="color:blue">['.$plugin_type.']</span> '.JText::sprintf( 'COM_INSTALLER_MSG_UPDATE_SUCCESS', $pluginName ).' </div>';
						}
						elseif ($search_ok && ($plugin == 'icagenda'))
						{
							echo '<div><span style="color:blue">['.$plugin_type.']</span> '.JText::sprintf( 'COM_INSTALLER_MSG_UPDATE_SUCCESS', $pluginName ).' </div>';
						}
						elseif ($plg_ic_library_ok && ($plugin == 'ic_library'))
						{
							echo '<div><span style="color:blue">['.$plugin_type.']</span> '.JText::sprintf( 'COM_INSTALLER_MSG_UPDATE_SUCCESS', $pluginName ).' </div>';
						}
						else
						{
							echo '<div><span style="color:blue">['.$plugin_type.']</span> '.JText::sprintf( 'COM_INSTALLER_INSTALL_SUCCESS', $pluginName ).' &#8680; <span style="color:green"><b>'.JText::_( 'JPUBLISHED' ).'</b></span></div>';
						}
					}
				}
			}
		}

		return $status;
	}


	/*
	 * $parent is the class calling this method.
	 * $type is the type of change (install, update or discover_install, not uninstall).
	 * postflight is run after the extension is registered in the database.
	 */
	function postflight( $type, $parent )
	{
		$this->release = $parent->get( "manifest" )->version;
		$oldRelease = $this->getParam('version');
		$icparams = JComponentHelper::getParams('com_icagenda');
		$oldSys = $icparams->get('icsys');

		// Fix old versions created date missing (runs if version previously installed is before 3.3.7)
		// update database to set a valid created date for events created with versions of iCagenda < 3.1.5,
		// and set in this order : modified date if valid or next/last date if valid or, at the end, will use current date.
		// (this fix is to prevent wrong 'Created on 30 November -0001' in search results)
		if ( version_compare( $oldRelease, '3.3.7', 'le' ) )
		{
			$db = JFactory::getDbo();
			$date = JFactory::getDate();
			$null_created = '0000-00-00 00:00:00';

			$query = $db->getQuery(true);
			$query->select('e.id, e.created, e.modified, e.next')
				->from('`#__icagenda_events` AS e')
				->where($db->qn('e.created').' = '.$db->q($null_created));
			$db->setQuery($query);
			$list_created_null = $db->loadObjectList();

			foreach ($list_created_null AS $cn)
			{
				if ($cn->modified != $null_created)
				{
					$new_created = $cn->modified;
				}
				elseif ($cn->next != $null_created)
				{
					$new_created = $cn->next;
				}
				else
				{
					$new_created = $date->toSql();
				}
				$query = $db->getQuery(true)
					->update($db->qn('#__icagenda_events'))
					->set($db->qn('created').' = '.$db->q($new_created))
					->where($db->qn('id').' = '.intval($cn->id));
				$db->setQuery($query);
				$db->execute();
			}
		}

		// Remove obsolete files and folders
		$icagendaRemoveFiles = $this->icagendaRemoveFiles;

		$this->_removeObsoleteFilesAndFolders($icagendaRemoveFiles);

		// always create or modify these parameters
		$params['version'] = ' PRO <b style="font-size:0.5em;">v ' . $this->release . '</b>';
		$params['release'] = $this->release;
		$params['author'] = 'JoomliC';
		$params['icsys'] = 'pro';
		if ($oldSys == 'core') $params['copy'] = NULL;

		// define the following parameters only if it is an original install
		if ( $type == 'install' ) {
			$params['copy'] = NULL;
			$params['atlist'] = '1';
			$params['atevent'] = '1';
			$params['atfloat'] = '2';
			$params['aticon'] = '2';
			$params['arrowtext'] = '1';
			$params['statutReg'] = '1';
			$params['maxRlist'] = '5';
			$params['navposition'] = '0';
			$params['targetLink'] = '1';
			$params['participantList'] = '1';
			$params['participantSlide'] = '1';
			$params['participantDisplay'] = '1';
			$params['fullListColumns'] = 'tiers';
			$params['regEmailUser'] = '1';
			$params['timeformat'] = '1';
			$params['ShortDescLimit'] = '100';
			$params['limitRegEmail'] = '1';
			$params['limitRegDate'] = '1';
			$params['phoneRequired'] = '2';
			$params['headerList'] = '1';
		}

		if ( version_compare( $oldRelease, '1.2.9', 'le' ) ) {
			$params['statutReg'] = '1';
			$params['maxRlist'] = '5';
			$params['navposition'] = '0';
			$params['targetLink'] = '1';
			$params['participantList'] = '1';
			$params['participantSlide'] = '1';
			$params['participantDisplay'] = '1';
			$params['fullListColumns'] = 'tiers';
			$params['regEmailUser'] = '1';
			$params['timeformat'] = '1';
		}

		if ( version_compare( $oldRelease, '2.0.6', 'le' ) ) {
			$params['navposition'] = '0';
			$params['targetLink'] = '1';
			$params['participantList'] = '1';
			$params['participantSlide'] = '1';
			$params['participantDisplay'] = '1';
			$params['fullListColumns'] = 'tiers';
			$params['regEmailUser'] = '1';
			$params['timeformat'] = '1';
		}

		if ( version_compare( $oldRelease, '2.1.1', 'le' ) ) {
			$params['limitRegEmail'] = '1';
			$params['limitRegDate'] = '1';
			$params['phoneRequired'] = '2';
			$params['headerList'] = '1';
		}

		if ( version_compare( $oldRelease, '3.0', 'le' ) ) {
			$params['bootstrapType'] = '1';
		}

		if ( version_compare( $oldRelease, '3.1.0', 'lt' ) ) {
			$params['emailRequired'] = '1';
		}

		// Updating Params to ensure a correct value
		jimport('joomla.application.component.helper'); // Import component helper library
		$icagendaParams = JComponentHelper::getParams('com_icagenda');

		$extparticipantList		= $icagendaParams->get('participantList');
		$extparticipantSlide	= $icagendaParams->get('participantSlide');
		$extstatutReg			= $icagendaParams->get('statutReg');
		$extlimitRegEmail		= $icagendaParams->get('limitRegEmail');
		$extlimitRegDate		= $icagendaParams->get('limitRegDate');
		$extphoneRequired		= $icagendaParams->get('phoneRequired');
		$extregEmailUser		= $icagendaParams->get('regEmailUser');
		$largewidththreshold	= $icagendaParams->get('largewidththreshold', '1201');
		$mediumwidththreshold	= $icagendaParams->get('mediumwidththreshold', '769');
		$smallwidththreshold	= $icagendaParams->get('smallwidththreshold', '481');

		$params['largewidththreshold']	= $largewidththreshold;
		$params['mediumwidththreshold']	= $mediumwidththreshold;
		$params['smallwidththreshold']	= $smallwidththreshold;

		if ($extparticipantList == '2') {
			$params['participantList'] = '0';
		}
		if ($extparticipantSlide == '2') {
			$params['participantSlide'] = '0';
		}
		if ($extstatutReg == '2') {
			$params['statutReg'] = '0';
		}
		if ($extlimitRegEmail == '2') {
			$params['limitRegEmail'] = '0';
		}
		if ($extlimitRegDate == '2') {
			$params['limitRegDate'] = '0';
		}
		if ($extphoneRequired == '2') {
			$params['phoneRequired'] = '0';
		}
		if ($extregEmailUser == '2') {
			$params['regEmailUser'] = '0';
		}

		// Update 3.1.1
		$emailRequired = $icagendaParams->get('emailRequired');

		if ($emailRequired == '')
		{
			$params['emailRequired'] = '1';
		}

		// Update 3.4.1
		$datesDisplay_global	= $icagendaParams->get('datesDisplay_global');
		$reg_captcha			= $icagendaParams->get('reg_captcha', '');
		$submit_captcha			= $icagendaParams->get('submit_captcha', '');
		$captcha				= $icagendaParams->get('captcha', '');

		if ($datesDisplay_global)
		{
			$params['datesDisplay'] = $datesDisplay_global;
		}

		if (in_array($reg_captcha, array('', '0'))
			&& in_array($submit_captcha, array('', '0'))
			)
		{
			$params['captcha'] = $captcha;
//			$params['captcha'] = JFactory::getApplication()->getCfg('captcha');
		}
		elseif (!in_array($reg_captcha, array('', '0', '1')))
		{
			$params['captcha'] = $reg_captcha;
		}
		elseif (!in_array($submit_captcha, array('', '0', '1')))
		{
			$params['captcha'] = $submit_captcha;
		}
		else
		{
			$params['captcha'] = $captcha;
		}

		$params['reg_captcha']		= (in_array($reg_captcha, array('', '0'))) ? '0' : '1';
		$params['submit_captcha']	= (in_array($submit_captcha, array('', '0'))) ? '0' : '1';

		// UPDATE PARAMS
		$this->setParams( $params );

		// Set default Access Permissions for iCagenda component
		$rules['core.manage']					= array('6' => 1);
		$rules['icagenda.access.categories']	= array('7' => 1);
		$rules['icagenda.access.events']		= array('6' => 1);
		$rules['icagenda.access.registrations']	= array('7' => 1);
		$rules['icagenda.access.newsletter']	= array('7' => 1);
		$rules['icagenda.access.themes']		= array('7' => 1);
		$rules['icagenda.access.customfields']	= array('7' => 1);
		$rules['icagenda.access.features']		= array('7' => 1);

		// UPDATE RULES
		$this->setRules( $rules );

		$this->clean();

		$sendSystemInfo = $this->getSystemInfo( $type, $parent );

		if ($sendSystemInfo)
		{
			echo $sendSystemInfo;
		}
	}


	/*
	 * $parent is the class calling this method
	 * uninstall runs before any other action is taken (file removal or database processing).
	 */
	function uninstall( $parent )
	{
		echo '<p>' . JText::_('COM_ICAGENDA_UNINSTALL') . '</p>';
	}


	/*
	 * get a variable from the manifest file (actually, from the manifest cache).
	 */
	function getParam( $name )
	{
		$db = JFactory::getDbo();
		$db->setQuery('SELECT manifest_cache FROM #__extensions WHERE element = "com_icagenda"');
		$manifest = json_decode( $db->loadResult(), true );
		return $manifest[ $name ];
	}


	/*
	 * sets parameter values in the component's row of the extension table
	 */
	function setParams( $param_array )
	{
		if ( count($param_array) > 0 )
		{
			// read the existing component value(s)
			$db = JFactory::getDbo();
			$db->setQuery('SELECT params FROM #__extensions WHERE element = "com_icagenda"');
			$params = json_decode( $db->loadResult(), true );
			// add the new variable(s) to the existing one(s)
			foreach ( $param_array as $name => $value )
			{
				$params[ (string) $name ] = (string) $value;
			}
			// store the combined new and existing values back as a JSON string
			$paramsString = json_encode( $params );
			$db->setQuery('UPDATE #__extensions SET params = ' .
				$db->quote( $paramsString ) .
				' WHERE element = "com_icagenda"' );
				$db->query();
		}
	}


	/*
	 * sets access permissions values (rules) in the component's row of the assets table
	 */
	function setRules( $rule_array )
	{
		if ( count($rule_array) > 0 )
		{
			// read the existing rules values
			$db = JFactory::getDbo();
			$db->setQuery('SELECT rules FROM #__assets WHERE name = "com_icagenda"');
			$rules = json_decode( $db->loadResult(), true );
			// add the new variable(s) to the existing one(s)
			foreach ( $rule_array as $name => $value )
			{
				if (!array_key_exists($name, $rules))
				{
					$rules[ (string) $name ] = (array) $value;
				}
			}
			// store the combined new and existing values back as a JSON string
			$rulesString = json_encode( $rules );
			$db->setQuery('UPDATE #__assets SET rules = ' .
				$db->quote( stripslashes($rulesString) ) .
				' WHERE name = "com_icagenda"' );
				$db->query();
		}
	}

	/**
	 * Purge the cache.
	 *
	 * @return  void
	 */
	public function purgeCache()
	{
		$app = JFactory::getApplication();

		$ret = $this->clean();

		$msg = JText::_('COM_ICAGENDA_CACHE_EXPIRED_ITEMS_HAVE_BEEN_PURGED');
		$msgType = 'message';

		if ($ret === false)
		{
			$msg = JText::_('COM_ICAGENDA_CACHE_EXPIRED_ITEMS_PURGING_ERROR');
			$msgType = 'error';
		}

		$app->redirect('index.php?option=com_icagenda&view=icagenda', $msg, $msgType);
	}

	/**
	 * 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  void
	 */
	public function clean($group = '')
	{
		$cache = JFactory::getCache('');
		$cache->clean($group);
	}

	/**
	 * Send site system information
	 * Adapted from Nicholas K. Dionysopoulos's code (Akeeba - www.akeebabackup.com).
	 */
	public function getSystemInfo($type, $parent)
	{
		$this->release = $parent->get( "manifest" )->version;

		// Do not system info on localhost
		if ((strpos(JUri::root(), 'localhost') !== false)
			|| (strpos(JUri::root(), '127.0.0.1') !== false))
		{
			return false;
		}

		// Set site ID
		$siteId = md5(JUri::base());

		// If info file is missing, stop it!
		if ( ! file_exists(JPATH_ROOT . '/administrator/components/com_icagenda/assets/jcms/info.php'))
		{
			return false;
		}

		if ( ! class_exists('iCagendaSystemInfo', false))
		{
			require_once JPATH_ROOT . '/administrator/components/com_icagenda/assets/jcms/info.php';
		}

		if ( ! class_exists('iCagendaSystemInfo', false))
		{
			return false;
		}

		$params = JComponentHelper::getParams('com_icagenda');

		// Get system info is turned off
		if ( ! $params->get('system_info', 1))
		{
			return false;
		}

		$db = JFactory::getDbo();
		$stats = new iCagendaSystemInfo();

		$stats->setSiteId($siteId);

		// Get iCagenda release
		$ic_parts = explode('.', $this->release);
		$ic_major = $ic_parts[0];
		$ic_minor = isset($ic_parts[1]) ? $ic_parts[1] : '';
		$ic_revision = isset($ic_parts[2]) ? $ic_parts[2] : '';

		// Get PHP version
		list($php_major, $php_minor, $php_revision) = explode('.', phpversion());
		$php_qualifier = strpos($php_revision, '~') !== false ? substr($php_revision, strpos($php_revision, '~')) : '';

		// Get Joomla version
		list($cms_major, $cms_minor, $cms_revision) = explode('.', JVERSION);

		// Get Database version
		list($db_major, $db_minor, $db_revision) = explode('.', $db->getVersion());
		$db_qualifier = strpos($db_revision, '~') !== false ? substr($db_revision, strpos($db_revision, '~')) : '';

		// Get Database type
		$db_driver = get_class($db);

        if (stripos($db_driver, 'mysql') !== false)
        {
            $db_type = '1';
        }
        elseif (stripos($db_driver, 'sqlsrv') !== false || stripos($db_driver, 'sqlazure'))
        {
            $db_type = '2';
        }
        elseif (stripos($db_driver, 'postgresql') !== false)
        {
            $db_type = '3';
        }
        else
        {
            $db_type = '0';
        }

		$installtype	= ($type == 'install') ? '1' : '2';
		$ictype			= $this->ictype;

		$stats->setValue('ins', $installtype); // software_install

		// Version : major(x).minor(y).revision/patch(z)

		$stats->setValue('swn', 'iCagenda'); // software_name
		$stats->setValue('swt', $ictype); // software_type
		$stats->setValue('swx', $ic_major); // software_major
		$stats->setValue('swy', $ic_minor); // software_minor
		$stats->setValue('swz', $ic_revision); // software_revision

		$stats->setValue('cmst', 1); // cms_type
		$stats->setValue('cmsx', $cms_major); // cms_major
		$stats->setValue('cmsy', $cms_minor); // cms_minor
		$stats->setValue('cmsz', $cms_revision); // cms_revision

		$stats->setValue('phpx', $php_major); // php_major
		$stats->setValue('phpy', $php_minor); // php_minor
		$stats->setValue('phpz', $php_revision); // php_revision
		$stats->setValue('phpq', $php_qualifier); // php_qualifiers

		$stats->setValue('dbt', $db_type); // db_type
		$stats->setValue('dbx', $db_major); // db_major
		$stats->setValue('dby', $db_minor); // db_minor
		$stats->setValue('dbz', $db_revision); // db_revision
		$stats->setValue('dbq', $db_qualifier); // db_qualifiers

		$return = $stats->sendInfo();

		return $return;
	}
}
components/com_icagenda/sql/index.html000060400000000055152453623450014123 0ustar00<html><body bgcolor="#FFFFFF"></body></html>
components/com_icagenda/sql/install/mysql/icagenda.install.sql000060400000015706152453623450020673 0ustar00--
-- iCagenda: Install Database `icagenda`
--

-- --------------------------------------------------------

--
-- Table structure for table `#__icagenda`
--

CREATE TABLE IF NOT EXISTS `#__icagenda` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `version` varchar(255) DEFAULT NULL,
  `releasedate` varchar(255) DEFAULT NULL,
  `params` text NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

--
-- Dumping data for table `#__icagenda`
--

INSERT IGNORE INTO `#__icagenda` (`id`, `version`, `releasedate`, `params`) VALUES
(3,'3.5.12','2015-10-12','');

-- --------------------------------------------------------

--
-- Table structure for table `#__icagenda_category`
--

CREATE TABLE IF NOT EXISTS `#__icagenda_category` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `ordering` int(11) NOT NULL,
  `state` tinyint(1) NOT NULL DEFAULT '1',
  `checked_out` int(11) NOT NULL,
  `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `title` varchar(255) NOT NULL,
  `alias` varchar(255) NOT NULL,
  `color` varchar(255) NOT NULL,
  `desc` text(65535) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;

-- --------------------------------------------------------

--
-- Table structure for table `#__icagenda_events`
--

CREATE TABLE IF NOT EXISTS `#__icagenda_events` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `asset_id` int(10) NOT NULL DEFAULT '0',
  `ordering` int(11) NOT NULL,
  `state` tinyint(1) NOT NULL DEFAULT '1',
  `approval` int(11) NOT NULL DEFAULT '0',
  `site_itemid` int(10) NOT NULL DEFAULT '0',
  `checked_out` int(11) NOT NULL,
  `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `title` varchar(255) NOT NULL,
  `alias` varchar(255) NOT NULL,
  `access` int(10) unsigned NOT NULL DEFAULT '0',
  `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,
  `created_by_email` varchar(100) NOT NULL,
  `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `modified_by` int(10) unsigned NOT NULL DEFAULT '0',
  `username` varchar(255) NOT NULL,
  `catid` int(11) NOT NULL,
  `image` varchar(255) NOT NULL,
  `file` varchar(255) NOT NULL,
  `displaytime` int(10) NOT NULL DEFAULT '1',
  `weekdays` varchar(255) NOT NULL,
  `daystime` varchar(255) NOT NULL,
  `startdate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `enddate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `period` text(65535) NOT NULL,
  `dates` text(65535) NOT NULL,
  `next` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `time` varchar(255) NOT NULL,
  `place` varchar(255) NOT NULL,
  `website` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `phone` varchar(255) NOT NULL,
  `name` varchar(255) NOT NULL,
  `city` varchar(255) NOT NULL,
  `country` varchar(255) NOT NULL,
  `address` varchar(255) NOT NULL,
  `coordinate` varchar(255) NOT NULL,
  `lat` float( 20, 16 ) NOT NULL,
  `lng` FLOAT( 20, 16 ) NOT NULL,
  `shortdesc` text NOT NULL,
  `desc` text(65535) NOT NULL ,
  `metadesc` text NOT NULL,
  `params` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;

-- --------------------------------------------------------

--
-- Table structure for table `#__icagenda_registration`
--

CREATE TABLE IF NOT EXISTS `#__icagenda_registration` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `asset_id` int(10) NOT NULL DEFAULT '0',
  `ordering` int(11) NOT NULL,
  `state` tinyint(1) NOT NULL DEFAULT '1',
  `checked_out` int(11) NOT NULL,
  `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `userid` int(11) NOT NULL,
  `itemid` int(11) NOT NULL,
  `eventid` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `phone` varchar(255) NOT NULL,
  `date` text(65535) NOT NULL,
  `period` tinyint(1) NOT NULL DEFAULT '0',
  `people` int(2) NOT NULL,
  `notes` text(65535) NOT NULL ,
  `params` text NOT NULL ,
  `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',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;

-- --------------------------------------------------------

--
-- Table structure for table `#__icagenda_customfields`
--

CREATE TABLE IF NOT EXISTS `#__icagenda_customfields` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `ordering` int(11) NOT NULL,
  `state` tinyint(1) NOT NULL DEFAULT '1',
  `checked_out` int(11) NOT NULL,
  `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `title` varchar(255) NOT NULL,
  `alias` varchar(255) NOT NULL,
  `slug` varchar(255) NOT NULL,
  `description` mediumtext NOT NULL,
  `parent_form` int(11) NOT NULL DEFAULT '0',
  `type` varchar(255) NOT NULL,
  `options` mediumtext,
  `default` varchar(255) NOT NULL,
  `required` tinyint(3) NOT NULL DEFAULT '0',
  `language` varchar(10) NOT NULL DEFAULT '*',
  `params` mediumtext,
  `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',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Table structure for table `#__icagenda_customfields_data`
--

CREATE TABLE IF NOT EXISTS `#__icagenda_customfields_data` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `state` tinyint(1) NOT NULL DEFAULT '1',
  `slug` varchar(255) NOT NULL,
  `parent_form` int(11) NOT NULL DEFAULT '0',
  `parent_id` int(11) NOT NULL DEFAULT '0',
  `value` varchar(255) NOT NULL,
  `language` varchar(10) NOT NULL DEFAULT '*',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Table structure for table `#__icagenda_feature`
--

CREATE TABLE IF NOT EXISTS  `#__icagenda_feature` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `ordering` int(11) NOT NULL,
  `state` tinyint(1) NOT NULL DEFAULT '1',
  `checked_out` int(11) NOT NULL,
  `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `title` varchar(255) NOT NULL,
  `alias` varchar(255) NOT NULL,
  `desc` mediumtext NOT NULL,
  `icon` varchar(255) NOT NULL,
  `icon_alt` varchar(255) NOT NULL,
  `show_filter` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;

-- --------------------------------------------------------

--
-- Table structure for table `#__icagenda_feature_xref`
--

CREATE TABLE IF NOT EXISTS  `#__icagenda_feature_xref` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `event_id` int(11) NOT NULL,
  `feature_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;
components/com_icagenda/sql/updates/1.3.0.1.4.sql000060400000000220152453623450015246 0ustar00UPDATE `#__icagenda` SET version='1.3 beta1', releasedate='2012-12-11' WHERE id=1;

ALTER TABLE `#__icagenda_events` DROP COLUMN `registration`;components/com_icagenda/sql/updates/1.0.sql000060400000000000152453623450014600 0ustar00components/com_icagenda/sql/updates/1.3.0.1.3.sql000060400000000246152453623450015255 0ustar00UPDATE `#__icagenda` SET version='1.3 beta1', releasedate='2012-12-10' WHERE id=1;

ALTER TABLE `#__icagenda_events` MODIFY COLUMN `params` TEXT NOT NULL DEFAULT '';
components/com_icagenda/sql/updates/1.1.1.sql000060400000000065152453623450014753 0ustar00UPDATE `#__icagenda` SET version='1.1.1' WHERE id=1;
components/com_icagenda/sql/updates/3.5.7.sql000060400000001232152453623450014764 0ustar00UPDATE `#__icagenda` SET version='3.5.7', releasedate='2015-07-16' WHERE id=3;

ALTER TABLE `#__icagenda_registration` ADD COLUMN `asset_id` int(10) NOT NULL DEFAULT '0' AFTER `id`;
ALTER TABLE `#__icagenda_registration` ADD COLUMN `modified_by` int(10) unsigned NOT NULL DEFAULT '0' AFTER `params`;
ALTER TABLE `#__icagenda_registration` ADD COLUMN `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `params`;
ALTER TABLE `#__icagenda_registration` ADD COLUMN `created_by` int(10) unsigned NOT NULL DEFAULT '0' AFTER `params`;
ALTER TABLE `#__icagenda_registration` ADD COLUMN `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `params`;
components/com_icagenda/sql/updates/3.5.0.sql000060400000000117152453623450014756 0ustar00UPDATE `#__icagenda` SET version='3.5.0', releasedate='2015-02-25' WHERE id=3;
components/com_icagenda/sql/updates/3.2.4.sql000060400000000117152453623450014757 0ustar00UPDATE `#__icagenda` SET version='3.2.4', releasedate='2013-10-29' WHERE id=2;
components/com_icagenda/sql/updates/2.1.4.sql000060400000000117152453623450014755 0ustar00UPDATE `#__icagenda` SET version='2.1.4', releasedate='2013-04-05' WHERE id=1;
components/com_icagenda/sql/updates/2.1.3.sql000060400000000117152453623450014754 0ustar00UPDATE `#__icagenda` SET version='2.1.3', releasedate='2013-04-01' WHERE id=1;
components/com_icagenda/sql/updates/3.5.9.sql000060400000000117152453623450014767 0ustar00UPDATE `#__icagenda` SET version='3.5.9', releasedate='2015-08-01' WHERE id=3;
components/com_icagenda/sql/updates/3.2.3.sql000060400000000117152453623450014756 0ustar00UPDATE `#__icagenda` SET version='3.2.3', releasedate='2013-10-20' WHERE id=2;
components/com_icagenda/sql/updates/1.3.0.1.sql000060400000002206152453623450015112 0ustar00UPDATE `#__icagenda` SET version='1.3 beta1', releasedate='2012-10-28' WHERE id=1;

ALTER TABLE `#__icagenda_events` ADD `period` TEXT(65535) NOT NULL AFTER `file`;
ALTER TABLE `#__icagenda_events` ADD `enddate` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `file`;
ALTER TABLE `#__icagenda_events` ADD `startdate` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `file`;
ALTER TABLE `#__icagenda_events` MODIFY `next` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00';
ALTER TABLE `#__icagenda_events` ADD `website` VARCHAR(255) NOT NULL AFTER `place`;

DROP TABLE IF EXISTS `#__icagenda_registration`;

CREATE TABLE `#__icagenda_registration` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`ordering` INT(11)  NOT NULL ,
`state` TINYINT(11)  NOT NULL DEFAULT '1',
`checked_out` INT(11)  NOT NULL ,
`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
`userid` INT(11)  NOT NULL ,
`eventid` INT(11)  NOT NULL ,
`name` VARCHAR(255)  NOT NULL ,
`email` VARCHAR(255)  NOT NULL ,
`phone` VARCHAR(255)  NOT NULL ,
`date` DATE NOT NULL ,
`people` INT(2)  NOT NULL ,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;

components/com_icagenda/sql/updates/2.1.11.sql000060400000000120152453623450015025 0ustar00UPDATE `#__icagenda` SET version='2.1.11', releasedate='2013-05-13' WHERE id=1;
components/com_icagenda/sql/updates/3.1.5.sql000060400000000117152453623450014757 0ustar00UPDATE `#__icagenda` SET version='3.1.5', releasedate='2013-08-19' WHERE id=2;
components/com_icagenda/sql/updates/3.1.2.sql000060400000000117152453623450014754 0ustar00UPDATE `#__icagenda` SET version='3.1.2', releasedate='2013-08-05' WHERE id=2;
components/com_icagenda/sql/updates/3.1.10.sql000060400000000265152453623450015037 0ustar00UPDATE `#__icagenda` SET version='3.1.10', releasedate='2013-09-12' WHERE id=2;

ALTER TABLE `#__icagenda_events` ADD COLUMN `approval` INT(11)  NOT NULL DEFAULT '0' AFTER `state`;
components/com_icagenda/sql/updates/3.2.14.sql000060400000002707152453623450015047 0ustar00ALTER TABLE `#__icagenda` ADD COLUMN `params` TEXT NOT NULL DEFAULT '' AFTER `releasedate`;
INSERT INTO `#__icagenda` (id,version,releasedate,params) VALUES (3,'3.2.14','2014-03-01','');

ALTER TABLE `#__icagenda_events` ADD COLUMN `metadesc` TEXT NOT NULL DEFAULT '' AFTER `desc`;

ALTER TABLE `#__icagenda_registration` ADD COLUMN `custom_fields` TEXT NOT NULL DEFAULT '' AFTER `notes`;

-- --------------------------------------------------------

--
-- Table structure for table `#__icagenda_customfields`
--

CREATE TABLE IF NOT EXISTS `#__icagenda_customfields` (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `ordering` INT(11) NOT NULL,
  `state` TINYINT(1) NOT NULL DEFAULT '1',
  `checked_out` INT(11) NOT NULL,
  `checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
  `title` VARCHAR(255) NOT NULL,
  `alias` VARCHAR(255) NOT NULL,
  `parent_form` INT(11) NOT NULL DEFAULT '0',
  `type` VARCHAR(255) NOT NULL,
  `options` mediumtext,
  `default` VARCHAR(255) NOT NULL,
  `required` tinyint(3) NOT NULL DEFAULT '0',
  `language` varchar(10) NOT NULL DEFAULT '*',
  `params` mediumtext,
  `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',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
components/com_icagenda/sql/updates/1.2.6.3.sql000060400000000127152453623450015121 0ustar00UPDATE `#__icagenda` SET version='1.2.6 beta3', releasedate='2012-10-13' WHERE id=1;


components/com_icagenda/sql/updates/3.2.13.sql000060400000000120152453623450015031 0ustar00UPDATE `#__icagenda` SET version='3.2.13', releasedate='2014-02-01' WHERE id=2;
components/com_icagenda/sql/updates/3.4.0.sql000060400000000117152453623450014755 0ustar00UPDATE `#__icagenda` SET version='3.4.0', releasedate='2014-12-22' WHERE id=3;
components/com_icagenda/sql/updates/1.2.6.4.sql000060400000000121152453623450015114 0ustar00UPDATE `#__icagenda` SET version='1.2.6', releasedate='2012-10-15' WHERE id=1;


components/com_icagenda/sql/updates/1.2.7.sql000060400000000121152453623450014753 0ustar00UPDATE `#__icagenda` SET version='1.2.7', releasedate='2012-10-18' WHERE id=1;


components/com_icagenda/sql/updates/2.1.sql000060400000000115152453623450014611 0ustar00UPDATE `#__icagenda` SET version='2.1', releasedate='2013-03-11' WHERE id=1;
components/com_icagenda/sql/updates/2.0.4.sql000060400000000117152453623450014754 0ustar00UPDATE `#__icagenda` SET version='2.0.4', releasedate='2013-01-23' WHERE id=1;
components/com_icagenda/sql/updates/3.3.5-1.sql000060400000000121152453623450015112 0ustar00UPDATE `#__icagenda` SET version='3.3.5-1', releasedate='2014-04-29' WHERE id=3;
components/com_icagenda/sql/updates/1.2.9.sql000060400000000121152453623450014755 0ustar00UPDATE `#__icagenda` SET version='1.2.9', releasedate='2012-10-28' WHERE id=1;


components/com_icagenda/sql/updates/3.3.4.sql000060400000000117152453623450014760 0ustar00UPDATE `#__icagenda` SET version='3.3.4', releasedate='2014-04-25' WHERE id=3;
components/com_icagenda/sql/updates/3.3.3.sql000060400000000117152453623450014757 0ustar00UPDATE `#__icagenda` SET version='3.3.3', releasedate='2014-04-20' WHERE id=3;
components/com_icagenda/sql/updates/3.5.11.sql000060400000000120152453623450015032 0ustar00UPDATE `#__icagenda` SET version='3.5.11', releasedate='2015-09-05' WHERE id=3;
components/com_icagenda/sql/updates/2.0.3.sql000060400000000117152453623450014753 0ustar00UPDATE `#__icagenda` SET version='2.0.3', releasedate='2013-01-10' WHERE id=1;
components/com_icagenda/sql/updates/2.1.2.sql000060400000000117152453623450014753 0ustar00UPDATE `#__icagenda` SET version='2.1.2', releasedate='2013-03-21' WHERE id=1;
components/com_icagenda/sql/updates/3.5.8.sql000060400000000117152453623450014766 0ustar00UPDATE `#__icagenda` SET version='3.5.8', releasedate='2015-07-17' WHERE id=3;
components/com_icagenda/sql/updates/3.2.2.sql000060400000000117152453623450014755 0ustar00UPDATE `#__icagenda` SET version='3.2.2', releasedate='2013-10-10' WHERE id=2;
components/com_icagenda/sql/updates/3.2.5.sql000060400000000117152453623450014760 0ustar00UPDATE `#__icagenda` SET version='3.2.5', releasedate='2013-11-11' WHERE id=2;
components/com_icagenda/sql/updates/2.1.5.sql000060400000000117152453623450014756 0ustar00UPDATE `#__icagenda` SET version='2.1.5', releasedate='2013-04-10' WHERE id=1;
components/com_icagenda/sql/updates/3.0.sql000060400000000122152453623450014607 0ustar00INSERT INTO `#__icagenda` (id,version,releasedate) VALUES (2,'3.0','2013-06-04');
components/com_icagenda/sql/updates/3.5.1.sql000060400000000117152453623450014757 0ustar00UPDATE `#__icagenda` SET version='3.5.1', releasedate='2015-03-01' WHERE id=3;
components/com_icagenda/sql/updates/3.5.6.sql000060400000000354152453623450014767 0ustar00UPDATE `#__icagenda` SET version='3.5.6', releasedate='2015-06-29' WHERE id=3;

ALTER TABLE `#__icagenda_registration` DROP COLUMN `custom_fields`;
ALTER TABLE `#__icagenda_registration` ADD COLUMN `params` text NOT NULL AFTER `notes`;
components/com_icagenda/sql/updates/2.1.2.2.sql000060400000000121152453623450015106 0ustar00UPDATE `#__icagenda` SET version='2.1.2.2', releasedate='2013-03-27' WHERE id=1;
components/com_icagenda/sql/updates/3.2.0.1.sql000060400000000123152453623450015107 0ustar00UPDATE `#__icagenda` SET version='3.2.0 RC2', releasedate='2013-09-22' WHERE id=2;
components/com_icagenda/sql/updates/2.0.6.1.sql000060400000001513152453623450015116 0ustar00UPDATE `#__icagenda` SET version='2.1 beta', releasedate='2013-02-21' WHERE id=1;

ALTER TABLE `#__icagenda_events` ADD COLUMN `asset_id` INT(10) NOT NULL DEFAULT '0' AFTER `id`;


ALTER TABLE `#__icagenda_events` ADD COLUMN `modified_by` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `alias`;
ALTER TABLE `#__icagenda_events` ADD COLUMN `modified` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `alias`;
ALTER TABLE `#__icagenda_events` ADD COLUMN `created_by_alias` VARCHAR(255) NOT NULL AFTER `alias`;
ALTER TABLE `#__icagenda_events` ADD COLUMN `created_by` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `alias`;
ALTER TABLE `#__icagenda_events` ADD COLUMN `created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `alias`;
ALTER TABLE `#__icagenda_events` ADD COLUMN `access` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `alias`;
components/com_icagenda/sql/updates/1.3.0.1.2.sql000060400000000301152453623450015244 0ustar00UPDATE `#__icagenda` SET version='1.3 beta1', releasedate='2012-12-03' WHERE id=1;

ALTER TABLE `#__icagenda_registration` MODIFY COLUMN `date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00';
components/com_icagenda/sql/updates/1.3.0.1.5.sql000060400000000275152453623450015261 0ustar00UPDATE `#__icagenda` SET version='1.3 beta1', releasedate='2012-12-11' WHERE id=1;

ALTER TABLE `#__icagenda_registration` ADD COLUMN `period` TINYINT(1) NOT NULL DEFAULT '0' AFTER `date`;
components/com_icagenda/sql/updates/1.1.sql000060400000000063152453623450014612 0ustar00UPDATE `#__icagenda` SET version='1.1' WHERE id=1;
components/com_icagenda/sql/updates/3.3.2.sql000060400000000117152453623450014756 0ustar00UPDATE `#__icagenda` SET version='3.3.2', releasedate='2014-03-17' WHERE id=3;
components/com_icagenda/sql/updates/3.5.10.sql000060400000000120152453623450015031 0ustar00UPDATE `#__icagenda` SET version='3.5.10', releasedate='2015-09-01' WHERE id=3;
components/com_icagenda/sql/updates/2.0.2.sql000060400000000122152453623450014746 0ustar00UPDATE `#__icagenda` SET version='2.0.2 RC', releasedate='2013-01-04' WHERE id=1;
components/com_icagenda/sql/updates/2.0.sql000060400000000122152453623450014606 0ustar00UPDATE `#__icagenda` SET version='2.0.0 RC', releasedate='2012-12-31' WHERE id=1;
components/com_icagenda/sql/updates/2.0.5.sql000060400000000117152453623450014755 0ustar00UPDATE `#__icagenda` SET version='2.0.5', releasedate='2013-02-01' WHERE id=1;
components/com_icagenda/sql/updates/1.2.8.sql000060400000000121152453623450014754 0ustar00UPDATE `#__icagenda` SET version='1.2.8', releasedate='2012-10-22' WHERE id=1;


components/com_icagenda/sql/updates/3.3.5.sql000060400000000117152453623450014761 0ustar00UPDATE `#__icagenda` SET version='3.3.5', releasedate='2014-04-27' WHERE id=3;
components/com_icagenda/sql/updates/3.2.12.sql000060400000000120152453623450015030 0ustar00UPDATE `#__icagenda` SET version='3.2.12', releasedate='2014-01-08' WHERE id=2;
components/com_icagenda/sql/updates/3.4.1.sql000060400000000117152453623450014756 0ustar00UPDATE `#__icagenda` SET version='3.4.1', releasedate='2015-01-30' WHERE id=3;
components/com_icagenda/sql/updates/1.2.6.sql000060400000001317152453623450014762 0ustar00ALTER TABLE `#__icagenda` ADD COLUMN `releasedate` TEXT(65535)  NOT NULL AFTER `version`;
UPDATE `#__icagenda` SET version='1.2.6', releasedate='2012-10-06' WHERE id=1;

DROP TABLE IF EXISTS `#__icagenda_registration`;

CREATE TABLE `#__icagenda_registration` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`ordering` INT(11)  NOT NULL ,
`checked_out` INT(11)  NOT NULL ,
`checked_out_time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
`userid` INT(11)  NOT NULL ,
`eventid` INT(11)  NOT NULL ,
`name` VARCHAR(255)  NOT NULL ,
`email` VARCHAR(255)  NOT NULL ,
`phone` VARCHAR(255)  NOT NULL ,
`date` DATE NOT NULL ,
`people` INT(2)  NOT NULL ,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;

components/com_icagenda/sql/updates/1.2.6.2.sql000060400000000127152453623450015120 0ustar00UPDATE `#__icagenda` SET version='1.2.6 beta2', releasedate='2012-10-11' WHERE id=1;


components/com_icagenda/sql/updates/1.2.1.sql000060400000000223152453623450014750 0ustar00UPDATE `#__icagenda` SET version='1.2.1' WHERE id=1;
DROP TABLE IF EXISTS `#__icagenda_registration`;
DROP TABLE IF EXISTS `#__icagenda_location`;
components/com_icagenda/sql/updates/3.1.11.sql000060400000000120152453623450015026 0ustar00UPDATE `#__icagenda` SET version='3.1.11', releasedate='2013-09-13' WHERE id=2;
components/com_icagenda/sql/updates/3.4.1-alpha1.sql000060400000000300152453623450016114 0ustar00UPDATE `#__icagenda` SET version='3.4.1-alpha1', releasedate='2015-01-24' WHERE id=3;

ALTER TABLE `#__icagenda_events` ADD COLUMN `site_itemid` INT(10) NOT NULL DEFAULT '0' AFTER `approval`;
components/com_icagenda/sql/updates/3.1.3.sql000060400000000117152453623450014755 0ustar00UPDATE `#__icagenda` SET version='3.1.3', releasedate='2013-08-09' WHERE id=2;
components/com_icagenda/sql/updates/3.4.0-beta1.sql000060400000000264152453623450015752 0ustar00UPDATE `#__icagenda` SET version='3.4.0-beta1', releasedate='2014-07-23' WHERE id=3;

ALTER TABLE `#__icagenda_events` ADD COLUMN `shortdesc` TEXT NOT NULL DEFAULT '' AFTER `lng`;
components/com_icagenda/sql/updates/3.4.0-alpha2.sql000060400000000126152453623450016122 0ustar00UPDATE `#__icagenda` SET version='3.4.0-alpha2', releasedate='2014-07-16' WHERE id=3;
components/com_icagenda/sql/updates/2.1.10.sql000060400000000120152453623450015024 0ustar00UPDATE `#__icagenda` SET version='2.1.10', releasedate='2013-05-07' WHERE id=1;
components/com_icagenda/sql/updates/3.1.4.sql000060400000000117152453623450014756 0ustar00UPDATE `#__icagenda` SET version='3.1.4', releasedate='2013-08-13' WHERE id=2;
components/com_icagenda/sql/updates/2.0.6.sql000060400000000117152453623450014756 0ustar00UPDATE `#__icagenda` SET version='2.0.6', releasedate='2013-02-07' WHERE id=1;
components/com_icagenda/sql/updates/index.html000060400000000055152453623450015570 0ustar00<html><body bgcolor="#FFFFFF"></body></html>
components/com_icagenda/sql/updates/3.3.6.sql000060400000000271152453623450014763 0ustar00UPDATE `#__icagenda` SET version='3.3.6', releasedate='2014-05-16' WHERE id=3;

ALTER TABLE `#__icagenda_customfields` ADD COLUMN `slug` VARCHAR(255) NOT NULL DEFAULT '' AFTER `alias`;
components/com_icagenda/sql/updates/3.3.1.sql000060400000000117152453623450014755 0ustar00UPDATE `#__icagenda` SET version='3.3.1', releasedate='2014-03-14' WHERE id=3;
components/com_icagenda/sql/updates/2.0.1.sql000060400000000122152453623450014745 0ustar00UPDATE `#__icagenda` SET version='2.0.1 RC', releasedate='2013-01-01' WHERE id=1;
components/com_icagenda/sql/updates/1.2.2.sql000060400000000223152453623450014751 0ustar00UPDATE `#__icagenda` SET version='1.2.2' WHERE id=1;
DROP TABLE IF EXISTS `#__icagenda_registration`;
DROP TABLE IF EXISTS `#__icagenda_location`;
components/com_icagenda/sql/updates/1.2.6.1.sql000060400000000127152453623450015117 0ustar00UPDATE `#__icagenda` SET version='1.2.6 beta1', releasedate='2012-10-09' WHERE id=1;


components/com_icagenda/sql/updates/3.2.11.sql000060400000000120152453623450015027 0ustar00UPDATE `#__icagenda` SET version='3.2.11', releasedate='2014-01-04' WHERE id=2;
components/com_icagenda/sql/updates/1.2.5.sql000060400000000067152453623450014762 0ustar00UPDATE `#__icagenda` SET version='1.2.5' WHERE id=1;


components/com_icagenda/sql/updates/3.3.8.sql000060400000000117152453623450014764 0ustar00UPDATE `#__icagenda` SET version='3.3.8', releasedate='2014-07-04' WHERE id=3;
components/com_icagenda/sql/updates/3.1.12.sql000060400000000120152453623450015027 0ustar00UPDATE `#__icagenda` SET version='3.1.12', releasedate='2013-09-17' WHERE id=2;
components/com_icagenda/sql/updates/3.1.9.sql000060400000000641152453623450014765 0ustar00UPDATE `#__icagenda` SET version='3.1.9', releasedate='2013-09-06' WHERE id=2;

ALTER TABLE `#__icagenda_registration` ADD COLUMN `notes` TEXT(65535) NOT NULL DEFAULT '' AFTER `people`;
ALTER TABLE `#__icagenda_events` ADD COLUMN `created_by_email` VARCHAR(100) NOT NULL DEFAULT '' AFTER `created_by_alias`;
ALTER TABLE `#__icagenda_events` ADD COLUMN `weekdays` VARCHAR(255) NOT NULL DEFAULT '' AFTER `displaytime`;
components/com_icagenda/sql/updates/3.1.7.sql000060400000000117152453623450014761 0ustar00UPDATE `#__icagenda` SET version='3.1.7', releasedate='2013-08-29' WHERE id=2;
components/com_icagenda/sql/updates/2.1.13.sql000060400000000120152453623450015027 0ustar00UPDATE `#__icagenda` SET version='2.1.13', releasedate='2013-05-23' WHERE id=1;
components/com_icagenda/sql/updates/3.1.0.sql000060400000000117152453623450014752 0ustar00UPDATE `#__icagenda` SET version='3.1.0', releasedate='2013-07-26' WHERE id=2;
components/com_icagenda/sql/updates/2.1.14.sql000060400000000355152453623450015042 0ustar00UPDATE `#__icagenda` SET version='2.1.14', releasedate='2013-05-29' WHERE id=1;
UPDATE `#__icagenda_events` SET language='*' WHERE language='';

ALTER TABLE `#__icagenda_registration` ADD COLUMN `itemid` INT(11) NOT NULL AFTER `userid`;
components/com_icagenda/sql/updates/3.4.0-beta2.sql000060400000000125152453623450015747 0ustar00UPDATE `#__icagenda` SET version='3.4.0-beta2', releasedate='2014-11-09' WHERE id=3;
components/com_icagenda/sql/updates/3.4.0-alpha1.sql000060400000000126152453623450016121 0ustar00UPDATE `#__icagenda` SET version='3.4.0-alpha1', releasedate='2014-07-11' WHERE id=3;
components/com_icagenda/sql/updates/3.4.0-rc.sql000060400000000122152453623450015353 0ustar00UPDATE `#__icagenda` SET version='3.4.0-rc', releasedate='2014-12-14' WHERE id=3;
components/com_icagenda/sql/updates/3.2.6.sql000060400000000117152453623450014761 0ustar00UPDATE `#__icagenda` SET version='3.2.6', releasedate='2013-11-21' WHERE id=2;
components/com_icagenda/sql/updates/3.3.sql000060400000000117152453623450014616 0ustar00UPDATE `#__icagenda` SET version='3.3.0', releasedate='2014-03-06' WHERE id=3;
components/com_icagenda/sql/updates/2.1.6.sql000060400000000117152453623450014757 0ustar00UPDATE `#__icagenda` SET version='2.1.6', releasedate='2013-04-12' WHERE id=1;
components/com_icagenda/sql/updates/3.4.sql000060400000003405152453623450014622 0ustar00UPDATE `#__icagenda` SET version='3.4', releasedate='2014-07-03' WHERE id=3;

ALTER TABLE `#__icagenda_customfields` ADD COLUMN `description` VARCHAR(255) NOT NULL DEFAULT '' AFTER `slug`;

-- --------------------------------------------------------

--
-- Table structure for table `#__icagenda_customfields_data`
--

CREATE TABLE IF NOT EXISTS `#__icagenda_customfields_data` (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `state` TINYINT(1) NOT NULL DEFAULT '1',
  `slug` VARCHAR(255) NOT NULL,
  `parent_form` INT(11) NOT NULL DEFAULT '0',
  `parent_id` INT(11) NOT NULL DEFAULT '0',
  `value` VARCHAR(255) NOT NULL,
  `language` varchar(10) NOT NULL DEFAULT '*',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Table structure for table `#__icagenda_feature`
--

CREATE TABLE IF NOT EXISTS  `#__icagenda_feature` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `ordering` int(11) NOT NULL,
  `state` tinyint(1) NOT NULL DEFAULT '1',
  `checked_out` int(11) NOT NULL,
  `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `title` varchar(255) NOT NULL,
  `alias` varchar(255) NOT NULL,
  `desc` mediumtext NOT NULL,
  `icon` varchar(255) NOT NULL,
  `icon_alt` varchar(255) NOT NULL,
  `show_filter` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;

-- --------------------------------------------------------

--
-- Table structure for table `#__icagenda_feature_xref`
--

CREATE TABLE IF NOT EXISTS  `#__icagenda_feature_xref` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `event_id` int(11) NOT NULL,
  `feature_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;
components/com_icagenda/sql/updates/2.1.1.sql000060400000000117152453623450014752 0ustar00UPDATE `#__icagenda` SET version='2.1.1', releasedate='2013-03-14' WHERE id=1;
components/com_icagenda/sql/updates/3.2.1.sql000060400000000117152453623450014754 0ustar00UPDATE `#__icagenda` SET version='3.2.1', releasedate='2013-10-07' WHERE id=2;
components/com_icagenda/sql/updates/3.5.5.sql000060400000000117152453623450014763 0ustar00UPDATE `#__icagenda` SET version='3.5.5', releasedate='2015-04-27' WHERE id=3;
components/com_icagenda/sql/updates/3.2.8.sql000060400000000117152453623450014763 0ustar00UPDATE `#__icagenda` SET version='3.2.8', releasedate='2013-12-15' WHERE id=2;
components/com_icagenda/sql/updates/2.1.8.sql000060400000000117152453623450014761 0ustar00UPDATE `#__icagenda` SET version='2.1.8', releasedate='2013-04-30' WHERE id=1;
components/com_icagenda/sql/updates/3.5.2.sql000060400000000117152453623450014760 0ustar00UPDATE `#__icagenda` SET version='3.5.2', releasedate='2015-03-13' WHERE id=3;
components/com_icagenda/sql/updates/1.1.3.sql000060400000000065152453623450014755 0ustar00UPDATE `#__icagenda` SET version='1.1.3' WHERE id=1;
components/com_icagenda/sql/updates/3.2.0.2.sql000060400000000123152453623450015110 0ustar00UPDATE `#__icagenda` SET version='3.2.0 RC2', releasedate='2013-09-22' WHERE id=2;
components/com_icagenda/sql/updates/1.3.0.1.8.sql000060400000000256152453623450015263 0ustar00UPDATE `#__icagenda` SET version='1.3 beta4', releasedate='2012-12-24' WHERE id=1;

ALTER TABLE `#__icagenda_events` ADD COLUMN `country` VARCHAR(255) NOT NULL AFTER `city`;
components/com_icagenda/sql/updates/1.1.4.sql000060400000000065152453623450014756 0ustar00UPDATE `#__icagenda` SET version='1.1.4' WHERE id=1;
components/com_icagenda/sql/updates/1.3.0.1.6.sql000060400000000123152453623450015252 0ustar00UPDATE `#__icagenda` SET version='1.3 beta2', releasedate='2012-12-15' WHERE id=1;
components/com_icagenda/sql/updates/1.2.sql000060400000000063152453623450014613 0ustar00UPDATE `#__icagenda` SET version='1.2' WHERE id=1;
components/com_icagenda/sql/updates/2.0.6.2.sql000060400000000270152453623450015116 0ustar00UPDATE `#__icagenda` SET version='2.1 beta', releasedate='2013-02-22' WHERE id=1;

ALTER TABLE `#__icagenda_events` ADD COLUMN `displaytime` INT(10) NOT NULL DEFAULT '1' AFTER `file`;
components/com_icagenda/sql/updates/1.3.0.1.1.sql000060400000000262152453623450015251 0ustar00UPDATE `#__icagenda` SET version='1.3 beta1', releasedate='2012-10-28' WHERE id=1;

ALTER TABLE `#__icagenda_events` ADD COLUMN `registration` TINYINT(1)  NOT NULL DEFAULT '1';

components/com_icagenda/sql/updates/3.1.1.sql000060400000000117152453623450014753 0ustar00UPDATE `#__icagenda` SET version='3.1.1', releasedate='2013-07-29' WHERE id=2;
components/com_icagenda/sql/updates/3.1.6.sql000060400000000117152453623450014760 0ustar00UPDATE `#__icagenda` SET version='3.1.6', releasedate='2013-08-20' WHERE id=2;
components/com_icagenda/sql/updates/2.1.12.sql000060400000000120152453623450015026 0ustar00UPDATE `#__icagenda` SET version='2.1.12', releasedate='2013-05-21' WHERE id=1;
components/com_icagenda/sql/updates/3.1.13.sql000060400000000120152453623450015030 0ustar00UPDATE `#__icagenda` SET version='3.1.13', releasedate='2013-09-20' WHERE id=2;
components/com_icagenda/sql/updates/3.1.8.sql000060400000000117152453623450014762 0ustar00UPDATE `#__icagenda` SET version='3.1.8', releasedate='2013-08-30' WHERE id=2;
components/com_icagenda/sql/updates/3.2.10.sql000060400000000120152453623450015026 0ustar00UPDATE `#__icagenda` SET version='3.2.10', releasedate='2014-01-03' WHERE id=2;
components/com_icagenda/sql/updates/1.2.4.sql000060400000000065152453623450014757 0ustar00UPDATE `#__icagenda` SET version='1.2.4' WHERE id=1;
components/com_icagenda/sql/updates/1.2.3.sql000060400000000065152453623450014756 0ustar00UPDATE `#__icagenda` SET version='1.2.3' WHERE id=1;
components/com_icagenda/sql/updates/3.5.12.sql000060400000000120152453623450015033 0ustar00UPDATE `#__icagenda` SET version='3.5.12', releasedate='2015-10-12' WHERE id=3;
components/com_icagenda/sql/updates/3.3.7.sql000060400000000117152453623450014763 0ustar00UPDATE `#__icagenda` SET version='3.3.7', releasedate='2014-05-29' WHERE id=3;
components/com_icagenda/sql/updates/3.0.1.sql000060400000000117152453623450014752 0ustar00UPDATE `#__icagenda` SET version='3.0.1', releasedate='2013-07-04' WHERE id=2;
components/com_icagenda/sql/updates/1.3.0.1.7.sql000060400000000123152453623450015253 0ustar00UPDATE `#__icagenda` SET version='1.3 beta3', releasedate='2012-12-16' WHERE id=1;
components/com_icagenda/sql/updates/1.3.sql000060400000000115152453623450014612 0ustar00UPDATE `#__icagenda` SET version='1.3', releasedate='2012-10-19' WHERE id=1;
components/com_icagenda/sql/updates/1.3.0.1.9.sql000060400000000247152453623450015264 0ustar00UPDATE `#__icagenda` SET version='1.3 beta4', releasedate='2012-12-28' WHERE id=1;

ALTER TABLE `#__icagenda_registration` MODIFY COLUMN `date` TEXT(65535)  NOT NULL;
components/com_icagenda/sql/updates/3.2.0.4.sql000060400000000123152453623450015112 0ustar00UPDATE `#__icagenda` SET version='3.2.0 RC4', releasedate='2013-10-04' WHERE id=2;
components/com_icagenda/sql/updates/1.1.2.sql000060400000000065152453623450014754 0ustar00UPDATE `#__icagenda` SET version='1.1.2' WHERE id=1;
components/com_icagenda/sql/updates/3.2.0.3.sql000060400000000123152453623450015111 0ustar00UPDATE `#__icagenda` SET version='3.2.0 RC3', releasedate='2013-09-26' WHERE id=2;
components/com_icagenda/sql/updates/3.2.9.sql000060400000000117152453623450014764 0ustar00UPDATE `#__icagenda` SET version='3.2.9', releasedate='2013-12-28' WHERE id=2;
components/com_icagenda/sql/updates/2.1.9.sql000060400000000117152453623450014762 0ustar00UPDATE `#__icagenda` SET version='2.1.9', releasedate='2013-05-03' WHERE id=1;
components/com_icagenda/sql/updates/3.5.3.sql000060400000000117152453623450014761 0ustar00UPDATE `#__icagenda` SET version='3.5.3', releasedate='2015-03-25' WHERE id=3;
components/com_icagenda/sql/updates/3.5.4.sql000060400000000117152453623450014762 0ustar00UPDATE `#__icagenda` SET version='3.5.4', releasedate='2015-04-24' WHERE id=3;
components/com_icagenda/sql/updates/3.2.0.sql000060400000000272152453623450014755 0ustar00UPDATE `#__icagenda` SET version='3.2.0', releasedate='2013-09-20' WHERE id=2;

ALTER TABLE `#__icagenda_events` ADD COLUMN `daystime` VARCHAR(255) NOT NULL DEFAULT '' AFTER `weekdays`;
components/com_icagenda/sql/updates/3.2.7.sql000060400000000117152453623450014762 0ustar00UPDATE `#__icagenda` SET version='3.2.7', releasedate='2013-11-23' WHERE id=2;
components/com_icagenda/sql/updates/3.2.sql000060400000000115152453623450014613 0ustar00UPDATE `#__icagenda` SET version='3.2', releasedate='2013-09-20' WHERE id=2;
components/com_icagenda/sql/updates/2.1.7.sql000060400000000547152453623450014767 0ustar00UPDATE `#__icagenda` SET version='2.1.7', releasedate='2013-04-29' WHERE id=1;

ALTER TABLE `#__icagenda_events` ADD COLUMN `language` CHAR(7) NOT NULL AFTER `access`;

ALTER TABLE `#__icagenda_events` ADD COLUMN `lng` FLOAT( 20, 16 ) NOT NULL AFTER `coordinate`;
ALTER TABLE `#__icagenda_events` ADD COLUMN `lat` FLOAT( 20, 16 ) NOT NULL AFTER `coordinate`;
components/com_icagenda/sql/uninstall/mysql/icagenda.uninstall.sql000060400000001015152453623450021565 0ustar00--
-- iCagenda: Uninstall Database `icagenda`
--

-- --------------------------------------------------------

DROP TABLE IF EXISTS `#__icagenda`;
DROP TABLE IF EXISTS `#__icagenda_category`;
DROP TABLE IF EXISTS `#__icagenda_events`;
DROP TABLE IF EXISTS `#__icagenda_registration`;
DROP TABLE IF EXISTS `#__icagenda_customfields`;
DROP TABLE IF EXISTS `#__icagenda_customfields_data`;
DROP TABLE IF EXISTS `#__icagenda_feature`;
DROP TABLE IF EXISTS `#__icagenda_feature_xref`;
DROP TABLE IF EXISTS `#__icagenda_location`;
components/com_icagenda/liveupdate/config.php000060400000002657152453623450015461 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 *
 * @package LiveUpdate 2.1.5
 * @copyright Copyright ©2011-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>
 *
 * @version     3.4.0 2014-07-16
 * @since       1.2.6
 *
 * CHANGED (3.3.6) : _versionStrategy set to 'vcompare'
 * CHANGED (3.4.0) : Removal of updateURL (set with getUpdateURL depending on getMinimumStability)
 */

defined('_JEXEC') or die();

/**
 * Configuration class for your extension's updates.
 */
class LiveUpdateConfig extends LiveUpdateAbstractConfig
{
	var $_extensionName			= 'com_icagenda';
	var $_extensionTitle		= 'iCagenda PRO Release System';
//	var $_updateURL				= 'http://pro.joomlic.com/index.php?option=com_ars&view=update&format=ini&id=1';
	var $_requiresAuthorization	= true;
	var $_versionStrategy		= 'vcompare';
	var $_storageAdapter		= 'file';
	var $_storageConfig = array('path' => JPATH_CACHE);

	public function __construct()
	{
		JLoader::import('joomla.filesystem.file');

		// Should I use our private CA store?
		if (@file_exists(dirname(__FILE__).'/../assets/cacert.pem'))
		{
			$this->_cacerts = dirname(__FILE__).'/../assets/cacert.pem';
		}

		parent::__construct();
	}
}
components/com_icagenda/liveupdate/language/cs-CZ/cs-CZ.liveupdate.ini000060400000010142152453623450021752 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="Aktualizace"

LIVEUPDATE_NOTSUPPORTED_HEAD="Tento server nepodporuje kontrolu aktualizací"
LIVEUPDATE_NOTSUPPORTED_INFO="Nastavení Vašeho serveru nedovoluje spustit aktualizaci. Kontaktujte prosím provozovatele serveru a požádejte ho o zprovoznění PHP rozšíření cUrl nebo o povolení možnosti allow_url_fopen. Pokud je jedna z těchto možností již povolena, požádejte o prověření nastavení firewall, zda je povolena komunikace s následující adresou URL:"
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Aktualizaci rozšíření <var>%s</var> můžete provést ručně, stažením nejnovější verze z našich stránek a instalací ve správci rozšíření."

LIVEUPDATE_STUCK_HEAD="Poslední pokus o získání aktualizace se nezdařil"
LIVEUPDATE_STUCK_INFO="Poslední pokus o komunikaci se serverem aktualizací se nezdařil. Obvykle je to způsobeno nastavením serveru, které neumožňuje komunikaci s jinými servery. Pro opětovný pokus získání informací o aktualizacích stiskněte tlačítko "_QQ_"Aktualizovat informace"_QQ_". Pokud se Vám po stisknutí tohoto tlačítka zobrazí prázdná bílá stránka, kontaktujte prosím provozovatele serveru."

LIVEUPDATE_ERROR_NEEDSAUTH="Tato aktualizace vyžaduje vyplněné Přihlašovací jméno a Heslo, nebo Klientské ID (Download ID) v nastavení komponenty. Po vyplnění potřebných informací bude povoleno tlačítko Aktualizovat."
LIVEUPDATE_HASUPDATES_HEAD="Je k dispozici nová verze"
LIVEUPDATE_NOUPDATES_HEAD="Instalovaná verze je aktuální"
LIVEUPDATE_CURRENTVERSION="Instalovaná verze"
LIVEUPDATE_LATESTVERSION="Nejnovější verze"
LIVEUPDATE_LATESTRELEASED="Datum nejnovější verze"
LIVEUPDATE_DOWNLOADURL="Adresa pro ruční stažení"

LIVEUPDATE_REFRESH_INFO="Najít aktualizace"
LIVEUPDATE_DO_UPDATE="Aktualizovat"

LIVEUPDATE_FTP_REQUIRED="Pro dokončení instalace na Vašem serveru je nutné využít vrstvu FTP, v globálním nastavení Joomla! však nejsou vyplněny všechna potřebná nastavení.<br/><br/>Vyplňte prosím informace pro připojení k serveru FTP níže."
LIVEUPDATE_FTP="Nastavení FTP"
LIVEUPDATE_FTPUSERNAME="FTP Přihlašovací jméno"
LIVEUPDATE_FTPPASSWORD="FTP Heslo"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="Stáhnout a nainstalovat aktualizaci"

LIVEUPDATE_DOWNLOAD_FAILED="Nepodařilo se stáhnout aktualizační balíček. Ověřte prosím, zda je Vaše dočasná složka zapisovatelná, nebo zda máte povolenu Vrstvu FTP v globálním nastavení Joomla!."
LIVEUPDATE_EXTRACT_FAILED="Nepodařilo se rozbalit aktualizační balíček. Zkuste prosím rozšíření aktualizovat ručně."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Nebyl rozpoznán formát aktualizačního balíčku. V aktualizaci nelze pokračovat."
LIVEUPDATE_INSTALLEXT="Instalovat %s %s"
LIVEUPDATE_ERROR="Chyba"
LIVEUPDATE_SUCCESS="Dokončeno"

LIVEUPDATE_ICON_UNSUPPORTED="Aktualizace není podporována"
LIVEUPDATE_ICON_CRASHED="Aktualizace skončila chybou"
LIVEUPDATE_ICON_CURRENT="Vaše verze je aktuální"
LIVEUPDATE_ICON_UPDATES="NALEZENA NOVÁ VERZE! AKTUALIZOVAT"

LIVEUPDATE_RELEASEINFO="Informace"
LIVEUPDATE_RELEASENOTES="Poznámky k verzi"
LIVEUPDATE_READMOREINFO="Podrobnosti"

LIVEUPDATE_NAGSCREEN_HEAD="UPOZORNĚNÍ! Chystáte se instalovat nestabilní verzi."
LIVEUPDATE_NAGSCREEN_BODY="Chystáte se instalovat nestabilní verzi (%s - %s). Nestabilní verze jsou minimálně, nebo nejsou vůbec testovány a mohou obsahovat chyby, ovlivňující stabilitu a funkčnost Vašich stránek. Pokud si nejste jisti tím co děláte, uzavřete prosím okno prohlížeče. Pokud jste si naprosto jisti a rozumíte rizikům spojeným s instalací nestabilní verze, klikněte na tlačítko níže pro pokračování v instalaci této nestabilní verze."
LIVEUPDATE_NAGSCREEN_BUTTON="Rozumím rizikům. Pokračovat v instalaci."

LIVEUPDATE_STABILITY_ALPHA="Alfa"
LIVEUPDATE_STABILITY_BETA="Beta"
LIVEUPDATE_STABILITY_RC="RC"
LIVEUPDATE_STABILITY_STABLE="Stable"
LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/ru-RU/ru-RU.liveupdate.ini000060400000014026152453623450022045 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="Автоматическое обновление"

LIVEUPDATE_NOTSUPPORTED_HEAD="Автоматическое обновление не поддерживается на этом сервере"
LIVEUPDATE_NOTSUPPORTED_INFO="Ваш сервер сообщает, что автоматическое обновление не поддерживается. Пожалуйста, обратитесь к Вашему хостеру и попросите его разрешить CURL расширение для PHP или включить функцию URL FOPEN(). Если они уже включены, пожалуйста, попросите его настроить их сетевой экран так, чтобы она позволяла получить доступ к следующему адресу:"_QQ_""
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Вы всегда сможете обновить <var>%s</var> посетив наш сайт, вручную, загрузив последнюю версию и установив ее с помощью Joomla!."

LIVEUPDATE_STUCK_HEAD="Автоматическое обновление обнаружило ошибку"
LIVEUPDATE_STUCK_INFO="Автоматическое обновление обнаружило, что произошла ошибка при последнем сеансе связи с сервером обновлений. Обычно это означает, что хост блокирует связи с внешними сайтами. Если Вы желаете снова получить информацию об обновлении, пожалуйста, нажмите кнопку "_QQ_"Освежить информацию об обновлении"_QQ_" , расположенную ниже. Если это приводит к появлению пустой страницы, пожалуйста, свяжитесь с Вашим хостером и сообщите об этой проблеме."

LIVEUPDATE_ERROR_NEEDSAUTH="Перед попыткой обновления до последней версии, Вы должны ввести Ваше имя пользователя/пароль или ID загрузки в параметры компонента. Кнопка обновления будет оставаться неактивной, пока Вы этого не сделаете."
LIVEUPDATE_HASUPDATES_HEAD="Доступна новая версия"
LIVEUPDATE_NOUPDATES_HEAD="У Вас уже установлена последняя версия"
LIVEUPDATE_CURRENTVERSION="Установленная версия"
LIVEUPDATE_LATESTVERSION="Последняя версия"
LIVEUPDATE_LATESTRELEASED="Дата выхода последней версии"
LIVEUPDATE_DOWNLOADURL="Ссылка для прямой загрузки"

LIVEUPDATE_REFRESH_INFO="Освежить информацию об обновлении"
LIVEUPDATE_DO_UPDATE="Обновить до последней версии"

LIVEUPDATE_FTP_REQUIRED="Автоматическое обновление определило, что необходимо использовать FTP для загрузки и установки обновления, но Вы не сохранили данные для авторизации на FTP в общих настройках Joomla!.<br/><br/>Просьба ввести свое имя пользователя и пароль FTP для продолжения обновления."
LIVEUPDATE_FTP="Информация FTP"
LIVEUPDATE_FTPUSERNAME="Имя пользователя FTP"
LIVEUPDATE_FTPPASSWORD="Пароль пользователя FTP"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="Загрузить и установить обновление"

LIVEUPDATE_DOWNLOAD_FAILED="Загрузка пакета обновления не удалась. Убедитесь, что временный каталог доступен для записи или что Вы включили и настроили FTP в общих настройках Joomla!."
LIVEUPDATE_EXTRACT_FAILED="Извлечение пакета обновления не удалось. Пожалуйста, попробуйте обновить компонент вручную."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Неверный тип пакета. Обновление не может продолжаться."
LIVEUPDATE_INSTALLEXT="Установлено %s %s"
LIVEUPDATE_ERROR="Ошибка"
LIVEUPDATE_SUCCESS="Успешно"

LIVEUPDATE_ICON_UNSUPPORTED="Автоматическое обновление не поддерживается"
LIVEUPDATE_ICON_CRASHED="Автоматическое обновление не удалось!"
LIVEUPDATE_ICON_CURRENT="У Вас последняя версия"
LIVEUPDATE_ICON_UPDATES="НАЙДЕНА НОВАЯ ВЕРСИЯ! НАЖМИТЕ ДЛЯ ОБНОВЛЕНИЯ."

; LIVEUPDATE_RELEASEINFO="Information"
; LIVEUPDATE_RELEASENOTES="Release notes"
; LIVEUPDATE_READMOREINFO="Read more"

; LIVEUPDATE_NAGSCREEN_HEAD="WARNING! You are about to install an unstable version."
; LIVEUPDATE_NAGSCREEN_BODY="You are about to install an unstable version (%s - %s). Unstable versions may have undergone minimal or no testing and contain bugs which may have an serious adverse to the stability and functionality of your web site. If you are not sure about what you are about to do, please close this browser window. If you are absolutely certain you understand the risks involved with the installation of unstable releases, please click the button below to continue the installation of this unstable release."
; LIVEUPDATE_NAGSCREEN_BUTTON="I understand the risks. Continue with the installation."

; LIVEUPDATE_STABILITY_ALPHA="Alpha"
; LIVEUPDATE_STABILITY_BETA="Beta"
; LIVEUPDATE_STABILITY_RC="RC"
; LIVEUPDATE_STABILITY_STABLE="Stable"
; LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/es-ES/es-ES.liveupdate.ini000060400000011337152453623450021753 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="Actualización automática"

LIVEUPDATE_NOTSUPPORTED_HEAD="Este servidor no soporta la Actualización automática"
LIVEUPDATE_NOTSUPPORTED_INFO="Su servidor indica que no soporta la Actualización automática. Por favor, contacte con su proveedor de hosting y pídale que active la función cURL de PHP, o bien que active los wrappers de URL fopen(). Si alguna de las opciones anteriores ya está activada, por favor pídale que que configure su cortafuegos de manera que permita el acceso a la siguiente URL:"_QQ_""
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Siempre puede actualizar <var>%s</var> manualmente visitando nuestro sitio, descargando la última versión e instalándola mediante el instalador del gestor de extensiones de Joomla!"_QQ_""

LIVEUPDATE_STUCK_HEAD="La actualización automática informa de un fallo"
LIVEUPDATE_STUCK_INFO="La actualización automática determinó que hubo un fallo la última vez que intentó contactar con el servidor de actualizaciones. Esto habitualmente ocurre cuando un host bloquea activamente las comunicaciones con sitios externos. Si desea trata de obtener de nuevo la información sobre nuevas actualizaciones, por favor haga clic en el botón "_QQ_"Refrescar la información sobre actualizaciones"_QQ_" que hay a continuación. Si tras hacerlo obtiene una página en blanco, por favor contacte con su proveedor de hosting y coméntele el problema."

LIVEUPDATE_ERROR_NEEDSAUTH="Debe introducir su nombre de usuario/contraseña su ID de Descarga (Download ID) en los parámetros de configuración del componente antes de intentar actualizar a la última versión. El botón de actualización permanecerá deshabilitado hasta que lo haga."
LIVEUPDATE_HASUPDATES_HEAD="Hay disponible una nueva versión"
LIVEUPDATE_NOUPDATES_HEAD="Ya tiene instalada la última vesión"
LIVEUPDATE_CURRENTVERSION="Versión instalada"
LIVEUPDATE_LATESTVERSION="Última versión"
LIVEUPDATE_LATESTRELEASED="Fecha de la última versión"
LIVEUPDATE_DOWNLOADURL="URL de descarga directa"

LIVEUPDATE_REFRESH_INFO="Refrescar la información de actualización"
LIVEUPDATE_DO_UPDATE="Actualizar a la última versión"

LIVEUPDATE_FTP_REQUIRED="La actualización automática determinó que es necesario usar FTP para poder descargar e instalar su actualización, pero usted aún no ha guardado la información de inicio de sesión FTP en la configuración global de Joomla!.<br/><br/>Por favor introduzca el nombre de usuario y la contraseña de su cuenta FTP a continuación para proceder con la actualización."
LIVEUPDATE_FTP="Información FTP"
LIVEUPDATE_FTPUSERNAME="Usuario FTP"
LIVEUPDATE_FTPPASSWORD="Contraseña FTP"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="Descargar e instalar la actualización"

LIVEUPDATE_DOWNLOAD_FAILED="La descarga del paquete de actualización no se pudo completar. Asegúrese de que su directorio temporal (temp) tiene permisos de escritura o de que ha habilitado la configuración de FTP en la configuración global de su sitio."
LIVEUPDATE_EXTRACT_FAILED="La extracción de los archivos del paquete de actualización falló. Por favor, trate de actualizar la extensión manualmente."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Tipo de paquete erróneo. No se puede proceder con la actualización."
LIVEUPDATE_INSTALLEXT="Instalando %s %s"
LIVEUPDATE_ERROR="Error"
LIVEUPDATE_SUCCESS="Éxito"

LIVEUPDATE_ICON_UNSUPPORTED="La actualización automática no está soportada"
LIVEUPDATE_ICON_CRASHED="La actualización automática falló"
LIVEUPDATE_ICON_CURRENT="Ya tiene la última versión"
LIVEUPDATE_ICON_UPDATES="¡ACTUALIZACIÓN DISPONIBLE! CLIC PARA INSTALAR."

LIVEUPDATE_RELEASEINFO="Información"
LIVEUPDATE_RELEASENOTES="Notas de la versión"
LIVEUPDATE_READMOREINFO="Leer más"

LIVEUPDATE_NAGSCREEN_HEAD="ATENCIÓN! Usted está a punto de instalar una versión inestable."
LIVEUPDATE_NAGSCREEN_BODY="Usted está a punto de instalar una versión inestable (%s - %s). Las versiones inestables pueden tener mínimos o ningún test y contener errores que pueden causar serios problemas a la estabilidad y funcionalidad de su sitio web. Si usted no está seguro sobre qué hacer, por favor cierre esta ventana del explorador. Si usted está totalmente seguro de entender los riesgos involucrados con la instalación de versiones inestables, por favor pulse el botón de abajo para continuar con la instalación de esta versión inestable."
LIVEUPDATE_NAGSCREEN_BUTTON="Entiendo los riesgos. Continuar con la instalación"

LIVEUPDATE_STABILITY_ALPHA="Alfa"
LIVEUPDATE_STABILITY_BETA="Beta"
LIVEUPDATE_STABILITY_RC="RC"
LIVEUPDATE_STABILITY_STABLE="Estable"
LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/bg-BG/bg-BG.liveupdate.ini000060400000011123152453623450021650 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

; LIVEUPDATE_TASK_OVERVIEW="Live Update"

; LIVEUPDATE_NOTSUPPORTED_HEAD="Live Update is not supported on this server"
; LIVEUPDATE_NOTSUPPORTED_INFO="Your server indicates that Live Update is not supported. Please contact your host and ask them to enable the cURL PHP extension or activate the URL fopen() wrappers. If these are already enabled, please ask them to configure their firewall so that it allows access to the following URL:"
; LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="You can always update <var>%s</var> by visiting our site manually, downloading the latest release and installing it using Joomla!'s extension installer."

; LIVEUPDATE_STUCK_HEAD="Live Update has marked itself as crashed"
; LIVEUPDATE_STUCK_INFO="Live Update determined that it crashed the last time it tried to contact the update server. This usually indicates a host which actively blocks communications with external sites. If you would like to retry fetching the update information, please click the "_QQ_"Refresh update information"_QQ_" button below. If that results to a blank page, please contact your host and report this issue."

; LIVEUPDATE_ERROR_NEEDSAUTH="You have to supply your username/password or Download ID to the component's parameters before trying to upgrade to the latest release. The upgrade button will remain disabled until you do that."
; LIVEUPDATE_HASUPDATES_HEAD="A new version is available"
; LIVEUPDATE_NOUPDATES_HEAD="You already have the latest version"
LIVEUPDATE_CURRENTVERSION="инсталирана версия"
LIVEUPDATE_LATESTVERSION="последна налична версия"
; LIVEUPDATE_LATESTRELEASED="Latest release date"
LIVEUPDATE_DOWNLOADURL="директно сваляне от URL адрес"

LIVEUPDATE_REFRESH_INFO="актуализиране на информация за актуализацията"
LIVEUPDATE_DO_UPDATE="актуализиране към последната налична версия"

; LIVEUPDATE_FTP_REQUIRED="Live Update determined that it needs to use FTP in order to download and install your update, but you have not saved your FTP login information in your Joomla! Global Configuration.<br/><br/>Please provide the FTP username and password below to proceed with the update."
LIVEUPDATE_FTP="FTP информация"
LIVEUPDATE_FTPUSERNAME="FTP потребителско име"
LIVEUPDATE_FTPPASSWORD="FTP парола"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="изтегли и инсталирай актуализацията"

; LIVEUPDATE_DOWNLOAD_FAILED="Downloading the update package failed. Make sure that your temp-directory is writable or that you have enabled Joomla!'s FTP options in your site's Global Configuration."
; LIVEUPDATE_EXTRACT_FAILED="Extracting the update package failed. Please try updating the extension manually."

; LIVEUPDATE_INVALID_PACKAGE_TYPE="Invalid package type. The update can not proceed."
LIVEUPDATE_INSTALLEXT="инсталирайте %s %s"
LIVEUPDATE_ERROR="грешка"
LIVEUPDATE_SUCCESS="успех"

; LIVEUPDATE_ICON_UNSUPPORTED="Live Update not supported"
; LIVEUPDATE_ICON_CRASHED="Live Update crashed"
LIVEUPDATE_ICON_CURRENT="Вие имате последната версия"
LIVEUPDATE_ICON_UPDATES="НАМЕРЕНА Е АКТУАЛИЗАЦИЯ! ЩРАКНЕТЕ, ЗА ДА АКТУАЛИЗИРАТЕ."

LIVEUPDATE_RELEASEINFO="информация"
; LIVEUPDATE_RELEASENOTES="Release notes"
LIVEUPDATE_READMOREINFO="прочети още"

LIVEUPDATE_NAGSCREEN_HEAD="ПРЕДУПРЕЖДЕНИЕ! Вие се опитвате да инсталирате нестабилна версия."
; LIVEUPDATE_NAGSCREEN_BODY="You are about to install an unstable version (%s - %s). Unstable versions may have undergone minimal or no testing and contain bugs which may have an serious adverse to the stability and functionality of your web site. If you are not sure about what you are about to do, please close this browser window. If you are absolutely certain you understand the risks involved with the installation of unstable releases, please click the button below to continue the installation of this unstable release."
LIVEUPDATE_NAGSCREEN_BUTTON="разбирам какви са възможните рискове. Продължи с инсталацията."

LIVEUPDATE_STABILITY_ALPHA="алфа версия"
LIVEUPDATE_STABILITY_BETA="бета версия"
; LIVEUPDATE_STABILITY_RC="RC"
LIVEUPDATE_STABILITY_STABLE="стабилна версия"
; LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/it-IT/it-IT.liveupdate.ini000060400000011004152453623450021766 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="Live Update"

LIVEUPDATE_NOTSUPPORTED_HEAD="La funzionalità di Live Update non è supportata su questo server"
LIVEUPDATE_NOTSUPPORTED_INFO="Il vostro server indica che la funzionalità di Live Update non è supportata. Contattate il fornitore e chiedete di abilitare l'estensione PHP cURL oppure attivare le funzionalità di URL fopen(). Se queste opzioni sono già attive, fate verificare la configurazione del firewall per permettere l'accesso al seguente URL:"_QQ_""
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="E' sempre possibile aggiornare <var>%s</var> visitando il nostro sito, scaricando l'ultima versione disponibile ed installandola in Joomla usando i normali comando di installazione delle estensioni."

LIVEUPDATE_STUCK_HEAD="Live Update ha rilevato un precedente crash"
LIVEUPDATE_STUCK_INFO="Live Update ha determinato che, nell'ultimo tentativo di contattare il server di aggiornamento, l'operazione è fallita con un crash. Generalmente questo indica la presenza di un servizio che blocca la comunicazione con siti esterni. Se volete riprovare a recuperare le informazioni di aggiornamento utilizzate il pulsante "_QQ_"Verifica disponibilità aggiornamenti"_QQ_" più sotto. Se il risultato è una pagina vuota, contattate il vostro fornitore per segnalare il problema."

LIVEUPDATE_ERROR_NEEDSAUTH="E' necessario inserire Username e Password oppure il proprio Download ID tra i parametri di configurazione del componente prima di tentare l'aggiornamento all'ultima versione. Il pulsante di aggiornamento sarà attivato solamente dopo l'inserimento di tali informazioni."
LIVEUPDATE_HASUPDATES_HEAD="E' disponibile una nuova versione"
LIVEUPDATE_NOUPDATES_HEAD="Non sono disponibili nuovi aggiornamenti"
LIVEUPDATE_CURRENTVERSION="Versione installata"
LIVEUPDATE_LATESTVERSION="Ultima versione"
LIVEUPDATE_LATESTRELEASED="Data rilascio ultima versione"
LIVEUPDATE_DOWNLOADURL="URL di scaricamento diretto"

LIVEUPDATE_REFRESH_INFO="Verifica disponibilità aggiornamenti"
LIVEUPDATE_DO_UPDATE="Aggiorna all'ultima versione"

LIVEUPDATE_FTP_REQUIRED="Live Update ha determinato che è necessario l'utilizzo di FTP per scaricamente ed installare l'aggiornamento, tuttavia non sono state impostate correttamente le informazioni di configurazione in Joomla. Inserite qui sotto Username e Password per il servizio FTP per proseguire con l'aggiornamento."
LIVEUPDATE_FTP="Informazioni FTP"
LIVEUPDATE_FTPUSERNAME="Username FTP"
LIVEUPDATE_FTPPASSWORD="Password FTP"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="Scarica ed installa aggiornamento"

LIVEUPDATE_DOWNLOAD_FAILED="Lo scaricamento dell'aggiornamento è fallito. Verificate che la cartella temporanea sia scrivibile e che siano abilitate le opzioni FTP di Joomla all'interno della sezione di Configurazione Globale del sito."
LIVEUPDATE_EXTRACT_FAILED="L'estrazione del pacchetto di aggiornamento è fallita. Sarà necessario effettuare l'aggiornamento tramite procedura manuale."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Formato del pacchetto di aggiornamento non riconosciuto. L'aggiornamento non può essere effettuato."
LIVEUPDATE_INSTALLEXT="Installazione %s %s"
LIVEUPDATE_ERROR="Errore"
LIVEUPDATE_SUCCESS="Completato"

LIVEUPDATE_ICON_UNSUPPORTED="Live Update non supportato"
LIVEUPDATE_ICON_CRASHED="Live Update non funziona correttamente"
LIVEUPDATE_ICON_CURRENT="Non sono disponibili nuovi aggiornamenti"
LIVEUPDATE_ICON_UPDATES="INSTALLA NUOVO AGGIORNAMENTO!"

; LIVEUPDATE_RELEASEINFO="Information"
; LIVEUPDATE_RELEASENOTES="Release notes"
; LIVEUPDATE_READMOREINFO="Read more"

; LIVEUPDATE_NAGSCREEN_HEAD="WARNING! You are about to install an unstable version."
; LIVEUPDATE_NAGSCREEN_BODY="You are about to install an unstable version (%s - %s). Unstable versions may have undergone minimal or no testing and contain bugs which may have an serious adverse to the stability and functionality of your web site. If you are not sure about what you are about to do, please close this browser window. If you are absolutely certain you understand the risks involved with the installation of unstable releases, please click the button below to continue the installation of this unstable release."
; LIVEUPDATE_NAGSCREEN_BUTTON="I understand the risks. Continue with the installation."

; LIVEUPDATE_STABILITY_ALPHA="Alpha"
; LIVEUPDATE_STABILITY_BETA="Beta"
; LIVEUPDATE_STABILITY_RC="RC"
; LIVEUPDATE_STABILITY_STABLE="Stable"
; LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/nl-NL/nl-NL.liveupdate.ini000060400000007773152453623450021774 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="Live Update"

LIVEUPDATE_NOTSUPPORTED_HEAD="Live Update wordt op deze server niet ondersteund"
LIVEUPDATE_NOTSUPPORTED_INFO="De server geeft aan dat Live Update niet wordt ondersteund. Neem contact op met de hoster en vraag de cURL PHP extensie of om de URL fopen() wrappers te activeren. Vraag, als ze al geactiveerd zijn, de firewall zo in te stellen dat er toegang tot de volgende URL is:"_QQ_""
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="U kunt <var>%s</var> altijd updaten door onze site te bezoeken, de laatste versie te downloaden en doormiddel van Joomla!'s extensiebeheer te installeren."

LIVEUPDATE_STUCK_HEAD="Live Update is gecrasht"
LIVEUPDATE_STUCK_INFO="Live Update stelt vast dat het, de laatste keer dat het de update-server trachtte te bereiken, gecrasht is. Dit betekent meestal dat de host actief de communicatie met externe sites blokkeert. Klik, als u de update informatie opnieuw wilt ophalen, op de "_QQ_"Ververs update informatie"_QQ_" knop hieronder. Als dat leidt tot een blanco pagina, neem dan contact op met uw hoster en meld dit."

LIVEUPDATE_ERROR_NEEDSAUTH="U moet uw gebruikersnaam / wachtwoord of download ID opgegeven in de parameters van de component om naar de laatste release te upgraden. De upgrade knop zal geblokkeerd blijven tot dit gedaan is."
LIVEUPDATE_HASUPDATES_HEAD="Er is een nieuwe versie beschikbaar"
LIVEUPDATE_NOUPDATES_HEAD="U heeft de laatste versie al"
LIVEUPDATE_CURRENTVERSION="Geïnstalleerde versie"
LIVEUPDATE_LATESTVERSION="Nieuwste versie"
LIVEUPDATE_LATESTRELEASED="Datum laatste release"
LIVEUPDATE_DOWNLOADURL="URL voor directe download"

LIVEUPDATE_REFRESH_INFO="Ververs update-informatie"
LIVEUPDATE_DO_UPDATE="Update naar de laatste versie"

LIVEUPDATE_FTP_REQUIRED="Live Update stelt vast dat het FTP moet gebruiken om de updates te downloaden en installeren, maar uw FTP logingegevens zijn bij de Joomla algemene instellingen niet opgeslagen.<br/><br/>Vul a.u.b. hieronder de FTP gebruikersnaam en het wachtwoord in om verder te gaan met updaten."
LIVEUPDATE_FTP="FTP informatie"
LIVEUPDATE_FTPUSERNAME="FTP gebruikersnaam"
LIVEUPDATE_FTPPASSWORD="FTP wachtwoord"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="Download en installeer de update"

LIVEUPDATE_DOWNLOAD_FAILED="Het downloaden van het updatepakket is mislukt. Zorg dat de temp map beschrijfbaar is of dat de FTP opties bij de algemene instellingen goed ingevuld zijn."
LIVEUPDATE_EXTRACT_FAILED="Uitpakken van het pakket mislukt. Probeer de extensie handmatig bij te werken."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Verkeerd pakkettype. Updaten kan niet verder gaan."
LIVEUPDATE_INSTALLEXT="Installeer %s %s"
LIVEUPDATE_ERROR="Fout"
LIVEUPDATE_SUCCESS="Succesvol"

LIVEUPDATE_ICON_UNSUPPORTED="Live Update niet ondersteund"
LIVEUPDATE_ICON_CRASHED="Live Update gecrasht"
LIVEUPDATE_ICON_CURRENT="U heeft de laatste versie"
LIVEUPDATE_ICON_UPDATES="UPDATE GEVONDEN! KLIK OM TE UPDATEN."

; LIVEUPDATE_RELEASEINFO="Information"
; LIVEUPDATE_RELEASENOTES="Release notes"
; LIVEUPDATE_READMOREINFO="Read more"

; LIVEUPDATE_NAGSCREEN_HEAD="WARNING! You are about to install an unstable version."
; LIVEUPDATE_NAGSCREEN_BODY="You are about to install an unstable version (%s - %s). Unstable versions may have undergone minimal or no testing and contain bugs which may have an serious adverse to the stability and functionality of your web site. If you are not sure about what you are about to do, please close this browser window. If you are absolutely certain you understand the risks involved with the installation of unstable releases, please click the button below to continue the installation of this unstable release."
; LIVEUPDATE_NAGSCREEN_BUTTON="I understand the risks. Continue with the installation."

; LIVEUPDATE_STABILITY_ALPHA="Alpha"
; LIVEUPDATE_STABILITY_BETA="Beta"
; LIVEUPDATE_STABILITY_RC="RC"
; LIVEUPDATE_STABILITY_STABLE="Stable"
; LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/lt-LT/lt-LT.liveupdate.ini000060400000010626152453623450022013 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="Automatinis atnaujinimas"

LIVEUPDATE_NOTSUPPORTED_HEAD="Šiame serveryje automatinis atnaujinimas negalimas"
LIVEUPDATE_NOTSUPPORTED_INFO="Jūsų serveris rodo, kad automatinis atnaujinimas yra negalimas. Prašome susisiekti su savo tinklapio talpintojais ir paprašyti įgalinti cURL PHP plėtinį arba aktyvuoti URL fopen(). Jei šie plėtiniai jau yra įgalinti, paprašykite jų sukonfigūruoti savo ugniasienę taip, kad ji leistų prieigą prie šios URL:"
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Jūs visada galite atnaujinti <var>%s</var> rankiniu būdu, aplankydami mūsų tinklapį, parsisiųsdami naujausią programos laidą ir įdiegdami standartiniu Joomla! Būdu."

LIVEUPDATE_STUCK_HEAD="Automatinis atnaujinimas nurodė, kad įvyko programinė klaida"
LIVEUPDATE_STUCK_INFO="Automatinis atnaujinimas nurodė, kad bandant susisiekti su atnaujinimų serveriu įvyko programinė klaida. Paprastai tai rodo, kad tinklapio talpintojas aktyviai blokuoja ryšius su išorinėmis svetainėmis. Jei norite pabandyti iš naujo parsisiųsti atnaujinimo informaciją, prašome spragtelėti žemiau esantį mygtuką "_QQ_"Atnaujinti informaciją"_QQ_". Jei parodomas tuščias puslapis, norint išspręsti šią problemą turėsite kreiptis į savo tinklapio talpintoją."

LIVEUPDATE_ERROR_NEEDSAUTH="Norėdami atsinaujinti į naujausią programos versiją, turite nurodyti savo prisijungimo vardą/slaptažodį arba Parsisiuntimo ID komponento parametruose. Kol to nepadarysite, atnaujinimo mygtukas išliks neaktyvus."
LIVEUPDATE_HASUPDATES_HEAD="Yra nauja versija"
LIVEUPDATE_NOUPDATES_HEAD="Jūs turite naujausią programos versiją."
LIVEUPDATE_CURRENTVERSION="Įdiegta versija"
LIVEUPDATE_LATESTVERSION="Naujausia versija"
LIVEUPDATE_LATESTRELEASED="Naujausios versijos išleidimo data"
LIVEUPDATE_DOWNLOADURL="Tiesioginė parsisiuntimo nuoroda"

LIVEUPDATE_REFRESH_INFO="Atnaujinti informaciją"
LIVEUPDATE_DO_UPDATE="Atnaujinti į naujausią versiją"

LIVEUPDATE_FTP_REQUIRED="Automatinis atnaujinimas nustatė, kad norint atsisiųsti ir įdiegti atnaujinimą turi būti naudojamas FTP sluoksnis, tačiau Jūs nenurodėte savo FTP prisijungimo duomenų globaliose savo tinklapio Joomla! nuostatose.<br/><br/>Jei norite įdiegti naujinimą, nurodykite FTP prisijungimo duomenis."
LIVEUPDATE_FTP="FTP informacija"
LIVEUPDATE_FTPUSERNAME="FTP naudotojo vardas"
LIVEUPDATE_FTPPASSWORD="FTP slaptažodis"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="Atsisiųsti ir įdiegti naujinimą"

LIVEUPDATE_DOWNLOAD_FAILED="Nepavyko atsisiųsti atnaujinimo paketo. Įsitikinkite, kad į tinklapio laikinąjį aplanką leidžiama rašyti ir tai, kad Jūsų tinklapio globaliose Joomla! nuostatose įgalintas FTP naudojimas."
LIVEUPDATE_EXTRACT_FAILED="Nepavyko išpakuoti atnaujinimo paketo. Prašome bandyti atsinaujinti rankiniu būdu."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Neteisingas paketo tipas. Atnaujinimas negalimas"
LIVEUPDATE_INSTALLEXT="Įdiegti %s %s"
LIVEUPDATE_ERROR="Klaida"
LIVEUPDATE_SUCCESS="Pavyko"

LIVEUPDATE_ICON_UNSUPPORTED="Automatinis atnaujinimas nepalaikomas"
LIVEUPDATE_ICON_CRASHED="Įvyko automatinio atnaujinimo programinis lūžis"
LIVEUPDATE_ICON_CURRENT="Jūs turite naujausią programos versiją."
LIVEUPDATE_ICON_UPDATES="GALIMAS ATNAUJINIMAS! NORĖDAMI ATSINAUJINTI SPRAGTELĖKITE ČIA"

; LIVEUPDATE_RELEASEINFO="Information"
; LIVEUPDATE_RELEASENOTES="Release notes"
; LIVEUPDATE_READMOREINFO="Read more"

; LIVEUPDATE_NAGSCREEN_HEAD="WARNING! You are about to install an unstable version."
; LIVEUPDATE_NAGSCREEN_BODY="You are about to install an unstable version (%s - %s). Unstable versions may have undergone minimal or no testing and contain bugs which may have an serious adverse to the stability and functionality of your web site. If you are not sure about what you are about to do, please close this browser window. If you are absolutely certain you understand the risks involved with the installation of unstable releases, please click the button below to continue the installation of this unstable release."
; LIVEUPDATE_NAGSCREEN_BUTTON="I understand the risks. Continue with the installation."

; LIVEUPDATE_STABILITY_ALPHA="Alpha"
; LIVEUPDATE_STABILITY_BETA="Beta"
; LIVEUPDATE_STABILITY_RC="RC"
; LIVEUPDATE_STABILITY_STABLE="Stable"
; LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/sv-SE/sv-SE.liveupdate.ini000060400000010141152453623450022005 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="Live Update"

LIVEUPDATE_NOTSUPPORTED_HEAD="Live Update stöds inte på denna server"
LIVEUPDATE_NOTSUPPORTED_INFO="Din server indikerar att Live Update inte stöds. Kontakta ditt webbhotell och be dem aktivera PHP-tillägget cURL och att aktivera URL fopen() wrappers. Om detta redan är aktiverat skall du be dem konfiurera brandväggen så att den accepterar anslutningar från följande URL:"_QQ_""
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Du kan alltid uppdatera <var>%s</var> manuellt genom att vår webbplats och ladda ned senaste utgåvan och installera via Joomla som vanligt."

LIVEUPDATE_STUCK_HEAD="Live Update har markerat sig själv som krashad"
LIVEUPDATE_STUCK_INFO="Live Update har indikerat att den kraschade förra gången den försökte kontakta uppdateringsservern. Detta händer vanligen om kommunikationen med externa webbplatser aktivt har blockerats. Om du vill fortsätta hämta uppdateringsinformation, klicka på knappen "_QQ_"Hämta uppdateringsinfo på nytt"_QQ_" här nedan. Om detta resluterar i en blank sida skall du kontakta ditt webbhotell och rapportera ärendet."

LIVEUPDATE_ERROR_NEEDSAUTH="Du måste ange användarnamn/lösenord eller Nedladdnings-ID i komponentens Inställningar innan du försöker uppdatera till senaste version. Uppgraderingsknappen kommer att vara inaktiv till dess detta är gjort."
LIVEUPDATE_HASUPDATES_HEAD="Det finns en ny version tillgänglig"
LIVEUPDATE_NOUPDATES_HEAD="Du har den senatste versionen"
LIVEUPDATE_CURRENTVERSION="Installerad version"
LIVEUPDATE_LATESTVERSION="Senaste version"
LIVEUPDATE_LATESTRELEASED="Senaste utgåvodatum"
LIVEUPDATE_DOWNLOADURL="Direkt nedladdnings-URL"

LIVEUPDATE_REFRESH_INFO="Hämta uppdateringsinformation"
LIVEUPDATE_DO_UPDATE="Uppdatera till senaste version"

LIVEUPDATE_FTP_REQUIRED="Live Update har upptäckt att den behöver använda FTP för att kunna ladda ned och installera uppdateringen. Du har inte sparat din FTP-inloggningsinfo i Joomlas globala inställningar.<br/><br/>Ange ditt FTP användarnamn och lösenord nedan för att fortsätta med uppdateringen."
LIVEUPDATE_FTP="FTP-Information"
LIVEUPDATE_FTPUSERNAME="FTP användarnamn"
LIVEUPDATE_FTPPASSWORD="FTP Lösenord"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="Ladda ned och installera uppdateringen"

LIVEUPDATE_DOWNLOAD_FAILED="Nedladdningen av uppdateringen misslyckades. Kontrollera att temp-mappen är skrivbar och att du aktiverat Joomla!s FTP-lager i de globala inställningarna för din webbplats."
LIVEUPDATE_EXTRACT_FAILED="Uppackningen av uppdaterinspaketet misslyckades. Försök att uppdatera tillägget manuellt."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Ogiltig pakettyp. Uppdateringen kan inte fortsätta."
LIVEUPDATE_INSTALLEXT="Installera %s %s"
LIVEUPDATE_ERROR="FEL!"
LIVEUPDATE_SUCCESS="Klart"

LIVEUPDATE_ICON_UNSUPPORTED="Live Update stöds inte"
LIVEUPDATE_ICON_CRASHED="Live Update krashade"
LIVEUPDATE_ICON_CURRENT="Du har den senaste versionen"
LIVEUPDATE_ICON_UPDATES="UPPDATERING HITTAD! KLICKA FÖR ATT UPPDATERA."

LIVEUPDATE_RELEASEINFO="Information"
LIVEUPDATE_RELEASENOTES="Release notes"
LIVEUPDATE_READMOREINFO="Läs mer"

; LIVEUPDATE_NAGSCREEN_HEAD="WARNING! You are about to install an unstable version."
; LIVEUPDATE_NAGSCREEN_BODY="You are about to install an unstable version (%s - %s). Unstable versions may have undergone minimal or no testing and contain bugs which may have an serious adverse to the stability and functionality of your web site. If you are not sure about what you are about to do, please close this browser window. If you are absolutely certain you understand the risks involved with the installation of unstable releases, please click the button below to continue the installation of this unstable release."
; LIVEUPDATE_NAGSCREEN_BUTTON="I understand the risks. Continue with the installation."

; LIVEUPDATE_STABILITY_ALPHA="Alpha"
; LIVEUPDATE_STABILITY_BETA="Beta"
; LIVEUPDATE_STABILITY_RC="RC"
; LIVEUPDATE_STABILITY_STABLE="Stable"
; LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/tr-TR/tr-TR.liveupdate.ini000060400000010010152453623450022026 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="Canlı Güncelleme"

LIVEUPDATE_NOTSUPPORTED_HEAD="Canlı Güncelleme bu sunucu üzerinde desteklenmiyor"
LIVEUPDATE_NOTSUPPORTED_INFO="Sunucunuz Canlı Güncellemeyi desteklemiyor. Lütfen sunucu yöneticinizle görüşerek cURL PHP ekini ya da URL fopen() sarıcılarını etkinleştirmelerini isteyin. Bu ekler zaten etkinleştirilmişse, güvenlik duvarını şu İnternet adresine izin verecek şekilde ayarlamalarını isteyin:"
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="<var>%s</var> güncellemelerini istediğiniz zaman el ile kurmak için, sitemizden en son sürümü indirip Joomla! bileşen kurucusu ile yükleyebilirsiniz."

LIVEUPDATE_STUCK_HEAD="Canlı güncellemede bir sorun çıkmış"
LIVEUPDATE_STUCK_INFO="Canlı Güncelleme, güncelleme sunucusuna son kez bağlanmaya çalıştığında bir sorun çıkmış. Bu duruma genellikle dışarıdaki sunuculara yapılan bağlantıları engelleyen bir ayar yol açar. Güncelleme bilgisini yeniden almak isterseniz lütfen aşağıdaki "_QQ_"Güncelleme bilgisini alın"_QQ_" düğmesine tıklayın. Boş beyaz bir sayfa ile karşılaşırsanız bu durumu sunucu yöneticinize iletin."

LIVEUPDATE_ERROR_NEEDSAUTH="Son sürüme güncellemeyi denemeden önce, bileşen ayarları bölümüne kullanıcı adınızı/parolanızı ya da indirme kodunuzu yazmalısınız. Bu bilgileri yazana kadar Güncelleyin düğmesi devre dışı kalır."
LIVEUPDATE_HASUPDATES_HEAD="Yeni bir sürüm var"
LIVEUPDATE_NOUPDATES_HEAD="Son sürümü kullanıyorsunuz"
LIVEUPDATE_CURRENTVERSION="Kullandığınız sürüm"
LIVEUPDATE_LATESTVERSION="Son sürüm"
LIVEUPDATE_LATESTRELEASED="Son yayın tarihi"
LIVEUPDATE_DOWNLOADURL="Doğrudan indirme adresi"

LIVEUPDATE_REFRESH_INFO="Güncelleme bilgisini alın"
LIVEUPDATE_DO_UPDATE="Son sürüme güncelleyin"

LIVEUPDATE_FTP_REQUIRED="Canlı Güncelleme, güncellemeyi indirip kurmak yerine FTP kullanmaya gerek duyuyor, ancak FTP bilgilerinizi Joomla! Genel Ayarlarına kaydetmemişsiniz.<br/><br/>Bu güncellemeyi yapabilmek için FTP kullanıcı adı ve parolanızı aşağıya yazın."
LIVEUPDATE_FTP="FTP Bilgileri"
LIVEUPDATE_FTPUSERNAME="FTP Kullanıcı Adı"
LIVEUPDATE_FTPPASSWORD="FTP Parolası"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="Güncellemeyi indirin ve yükleyin"

LIVEUPDATE_DOWNLOAD_FAILED="Güncelleme paketi indirilemedi. Geçici klasörünüzün yazılabilir olduğundan ya da Joomla! Genel Ayarlarından FTP seçeneğini etkinleştirdiğinizden emin olun."
LIVEUPDATE_EXTRACT_FAILED="Güncelleme paketi ayıklanamadı. Lütfen bileşeni el ile güncellemeyi deneyin."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Geçersiz paket tipi. Güncelleme yapılamıyor."
LIVEUPDATE_INSTALLEXT="%s %s yükleyin"
LIVEUPDATE_ERROR="Hata"
LIVEUPDATE_SUCCESS="Başarılı"

LIVEUPDATE_ICON_UNSUPPORTED="Canlı Güncelleme desteklenmiyor"
LIVEUPDATE_ICON_CRASHED="Canlı Güncelleme hata verdi"
LIVEUPDATE_ICON_CURRENT="Son sürümü kullanıyorsunuz"
LIVEUPDATE_ICON_UPDATES="GÜNCELLEME VAR! YÜKLEMEK İÇİN TIKLAYIN."

LIVEUPDATE_RELEASEINFO="Bilgiler"
LIVEUPDATE_RELEASENOTES="Yayın Notları"
LIVEUPDATE_READMOREINFO="Devamını okuyun"

LIVEUPDATE_NAGSCREEN_HEAD="DİKKAT! Kararsız bir sürüm yüklemek üzeresiniz."
LIVEUPDATE_NAGSCREEN_BODY="Kararsız bir sürüm yüklemek üzeresiniz (%s - %s). Kararsız sürümler çok az denendiği ya da hiç denenmediği için hatalar içerir ve web sitenizin düzgün çalışmasını engelleyebilir. Ne yaptığınızdan emin değilseniz bu tarayıcı penceresini kapatın. Kararsız sürümleri yüklemekle alacağınız risklerin farkındaysanız, yüklemeye devam etmek için aşağıdaki düğmeye tıklayın."
LIVEUPDATE_NAGSCREEN_BUTTON="Riskleri anladım. Yüklemeye devam edeceğim."

LIVEUPDATE_STABILITY_ALPHA="Alfa"
LIVEUPDATE_STABILITY_BETA="Beta"
LIVEUPDATE_STABILITY_RC="Yayın adayı"
LIVEUPDATE_STABILITY_STABLE="Kararlı"
LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/sl-SI/sl-SI.liveupdate.ini000060400000010165152453623450021777 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="Posodobljanje v živo"

LIVEUPDATE_NOTSUPPORTED_HEAD="Posodabljanje v živo ni podprto na tem strežniku"
LIVEUPDATE_NOTSUPPORTED_INFO="Vaš server ne podpira Live Posodobitev. Obrnite se na svojega gostitelja in ga prosite, da se omogoči razširitev CURL PHP ali aktivira URL fopen () ovoje. Če so ti že omogočeno, ga prosite, naj svoje požarni zid konfigurirate tako, da omogoča dostop do naslednjih URL:"
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Vedno lahko posodobite <var>%s</var> tako, da obiščete našo spletno stran, ročno prenesete najnovejše sprostitve in jih namestite z Joomla! 's namestitev razširitve."

LIVEUPDATE_STUCK_HEAD="Posodobitev v živo je označena kot spodletelo"
LIVEUPDATE_STUCK_INFO="Posodobitev v živo je določila, da se je zrušila v zadnjem času, ko je poskušala stopiti v stik strežnika za posodabljanje. To ponavadi pomeni, gostitelja, ki aktivno blokira komunikacijo z zunanjimi spletnimi stranmi. Če želite ponoviti ljubek posodabljanje informacij, prosimo, kliknite "_QQ_"Osvežite informacije posodabljanja"_QQ_" spodnji gumb. Če bo rezultat prazna stran, prosimo, obrnite se na gostitelja, in poročajte o tej zadevi."

LIVEUPDATE_ERROR_NEEDSAUTH="Morate predloži svoje uporabniško ime / geslo ali ID Prenosa s parametri sestavnega dela, preden poskušate nadgraditi na najnovejšo različico. Gumb Nadgradnja bo ostal onemogočen."
LIVEUPDATE_HASUPDATES_HEAD="Nova različica je na voljo"
LIVEUPDATE_NOUPDATES_HEAD="Že imate zadnjo verzijo"
LIVEUPDATE_CURRENTVERSION="Nameščena različica"
LIVEUPDATE_LATESTVERSION="Zadnja različica"
LIVEUPDATE_LATESTRELEASED="Zadnji Datum izdaje"
LIVEUPDATE_DOWNLOADURL="Direktni prenos URL"

LIVEUPDATE_REFRESH_INFO="Osveži informacij posodobitev"
LIVEUPDATE_DO_UPDATE="Posodobitev na najnovejšo različico"

LIVEUPDATE_FTP_REQUIRED="Posodobitev v živo določa, da morate uporabiti FTP, da prenesete in namestite posodobitev, vendar niste shranili FTP podatke za prijavo v vaši Joomla! Globalne Konfiguracije.<br/><br/>Prosimo, za FTP uporabniško ime in geslo za nadaljevanje posodobitve."
LIVEUPDATE_FTP="FTP Informacije"
LIVEUPDATE_FTPUSERNAME="FTP Uporabniško ime"
LIVEUPDATE_FTPPASSWORD="FTP Geslo"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="Prenesite in namestite posodobitev"

LIVEUPDATE_DOWNLOAD_FAILED="Nalaganje posodobitvenega paketa ni uspela. Prepričajte se, da je vaš temp-imenik zapisljiv ali da ste omogočili Joomla! 'S FTP možnosti v vaše strani Globalne Konfiguracije."
LIVEUPDATE_EXTRACT_FAILED="Pridobivanja posodobitvenega paketa ni uspela. Poskusite posodabljanje razširitve ročno."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Neveljavna vrsta paketa.Posodobitev ne morem nadaljevati."
LIVEUPDATE_INSTALLEXT="Nameščeno %s %s"
LIVEUPDATE_ERROR="Napaka"
LIVEUPDATE_SUCCESS="Uspešno"

LIVEUPDATE_ICON_UNSUPPORTED="Posodabljanje v živo ni podprto"
LIVEUPDATE_ICON_CRASHED="Posodabljanje v živo je spodletelo"
LIVEUPDATE_ICON_CURRENT="Imate najnovejšo različico"
LIVEUPDATE_ICON_UPDATES="POSODOBITEV NA VOLJO! KLIKNITE ZA POSODOBITEV."

LIVEUPDATE_RELEASEINFO="Informacije"
LIVEUPDATE_RELEASENOTES="Opombe ob izdaji"
LIVEUPDATE_READMOREINFO="Preberite več"

LIVEUPDATE_NAGSCREEN_HEAD="OPOZORILO! Ste pred tem namestiti nestabilno različico."
LIVEUPDATE_NAGSCREEN_BODY="Ste pred tem namestili nestabilno različico (%s - %s). Nestabilne različice so lahko opravili minimalno ali brez testiranja in vsebujejo napake, ki imajo lahko resno škodljivost za stabilnost in funkcionalnost vaše spletne strani. Če niste prepričani o tem, kaj si o tem narediti, zaprite to okno brskalnika. Če ste popolnoma prepričani, da razumete tveganja, povezana z namestitvijo nestabilnih izdaj, kliknite na spodnji gumb, da nadaljujte z namestitvijo te nestabilne izdaje."
LIVEUPDATE_NAGSCREEN_BUTTON="Razumem tveganja. Nadaljujte z namestitvijo."

LIVEUPDATE_STABILITY_ALPHA="Alfa"
LIVEUPDATE_STABILITY_BETA="Beta"
LIVEUPDATE_STABILITY_RC="RC"
LIVEUPDATE_STABILITY_STABLE="Stabilna"
LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/pt-PT/pt-PT.liveupdate.ini000060400000010631152453623450022027 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="Atualizações"

LIVEUPDATE_NOTSUPPORTED_HEAD="Atualizações diretas não são suportadas neste servidor"
LIVEUPDATE_NOTSUPPORTED_INFO="O seu servidor indica que a atualização direta não é suportada. Por favor contate o seu alojamento e peça-lhes para ativar a extensão cURL do PHP ou ativar a função fopen(). Se estas já estiverem ativadas, por favor peça-lhes para configurar o firewall para permitir o acesso à seguinte URL:"
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Pode sempre atualizar pelo processo normal <var>%s</var> visita o nosso sítio, descarrega a última versão e instala pelo instalador de extensões do Joomla."

LIVEUPDATE_STUCK_HEAD="O atualizador direto marcou-se a si mesmo como defeituoso"
LIVEUPDATE_STUCK_INFO="O atualizador direto indica que bloqueou na última vez que tentou entrar em contato com o servidor de atualização. Isso geralmente indica um alojamento que bloqueia ativamente as comunicações com sites externos. Se quiser tentar novamente obter as informações de atualização, por favor clique no botão ATUALIZAR INFORMAÇÕES DE ATUALIZAÇÃO. Se isto resultar numa página em branco, carrtegue no botão voltar e depois contate seu gestor de alojamento e relate este problema."

LIVEUPDATE_ERROR_NEEDSAUTH="Deve indicar um nome de utilizador/senha ou Download ID para os parâmetros do componente antes de tentar fazer a atualização para a última versão. O botão de atualização continuará desativado até que faça isso."
LIVEUPDATE_HASUPDATES_HEAD="Está disponível uma nova versão"
LIVEUPDATE_NOUPDATES_HEAD="Existe uma nova versão disponível"
LIVEUPDATE_CURRENTVERSION="Versão instalada"
LIVEUPDATE_LATESTVERSION="Última versão"
LIVEUPDATE_LATESTRELEASED="Data da última versão"
LIVEUPDATE_DOWNLOADURL="URL de transferência direta"

LIVEUPDATE_REFRESH_INFO="Atualizar as informações de atualização"
LIVEUPDATE_DO_UPDATE="Atualizar para versão mais recente"

LIVEUPDATE_FTP_REQUIRED="O atualizador direto indica necessitar de utilizar o FTP para descarregar e instalar a sua atualização, mas você não indicou as suas informações de autenticação FTP na Configuração Global do Joomla!.<br/><br/>Por favor, indique abaixo o nome de utilizador e senha FTP para prosseguir com a atualização."
LIVEUPDATE_FTP="Informação de FTP"
LIVEUPDATE_FTPUSERNAME="Nome de utilizador FTP"
LIVEUPDATE_FTPPASSWORD="Senha FTP"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="Transferir e instalar atualização"

LIVEUPDATE_DOWNLOAD_FAILED="A transferência do pacote de atualização falhou. Certifique-se de que a pasta TEMP é editável ou que ativou as opções de FTP do Joomla nas configurações globais de seu sítio."
LIVEUPDATE_EXTRACT_FAILED="A extração do pacote de atualização falhou. Por favor tente atualizar a extensão manualmente."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Tipo de pacote inválido. A atualização não pode continuar."
LIVEUPDATE_INSTALLEXT="Instalar %s %s"
LIVEUPDATE_ERROR="Erro"
LIVEUPDATE_SUCCESS="Sucesso"

LIVEUPDATE_ICON_UNSUPPORTED="Atualização direta não suportada"
LIVEUPDATE_ICON_CRASHED="Atualização direta bloqueou"
LIVEUPDATE_ICON_CURRENT="Tem a versão mais recente"
LIVEUPDATE_ICON_UPDATES="ATUALIZAÇÃO ENCONTRADA! Clique para atualizar."

LIVEUPDATE_RELEASEINFO="Informação"
LIVEUPDATE_RELEASENOTES="Notas da versão"
LIVEUPDATE_READMOREINFO="Ver mais"

LIVEUPDATE_NAGSCREEN_HEAD="ATENÇÃO: Está prestes a instalar uma versão não estável!"
LIVEUPDATE_NAGSCREEN_BODY="Está prestes a instalar uma versão instável (%s - %s). Versões instáveis destinam-se a programadores avançados já que podem ​​podem ter sofrido testes mínimos ou mesmo nenhuns e conter falhas desconhecidas que podem ter um efeito adverso grave à estabilidade e funcionalidade do seu sítio. Se não tiver a certeza sobre o que está prestes a fazer, por favor, feche esta janela. Se estiver certo dos riscos envolvidos com a instalação de versões instáveis​​, então clique no botão abaixo para continuar a instalação desta versão instável."
LIVEUPDATE_NAGSCREEN_BUTTON="Compreendo os riscos. Continuar com a instalação."

LIVEUPDATE_STABILITY_ALPHA="Alfa"
LIVEUPDATE_STABILITY_BETA="Beta"
LIVEUPDATE_STABILITY_RC="RC"
LIVEUPDATE_STABILITY_STABLE="Estável"
LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/pt-BR/pt-BR.liveupdate.ini000060400000010467152453623450021776 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="Actualização ao vivo"

LIVEUPDATE_NOTSUPPORTED_HEAD="A atualização ao vivo não esta suportada neste servidor"
LIVEUPDATE_NOTSUPPORTED_INFO="O servidor indica que Atualização ao Vivo não é compatível. Entre em contato com seu Hosting e solicite que permitam a extensão  cURL PHP ou desativem o URL fopen(). Se estão já desabilitadas, por favor, solicite que configurem seu firewall para que permita o acesso do seguinte endereço URL:"_QQ_""
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Sempre é possível atualizar <var>%s</var>, visite nosso site manualmente, baixe a última versão e instale usando o instalador de extensões Joomla!."

LIVEUPDATE_STUCK_HEAD="Actualização ao Vivo marcou como se danificou"
LIVEUPDATE_STUCK_INFO="Live Update determinou que foi danificado a última vez que tratou de contatar com o servidor de atualizações. Isto d emodo geral indica uma série de bloqueios ativos de comunicação com sites externos. Se deseja voltar a tentar buscar a informação de atualização, por favor clique em 'Atualizar informação de atualização' no botão abaixo. Em caso de ontér uma página em branco como resultado, por favor contate com seu Hosting e informe sobre este tema."

LIVEUPDATE_ERROR_NEEDSAUTH="Tem que facilitar seu nome de usuário/senha ou ID de download nos parâmetros do componente antes de tentar atualizar a última versão. O botão de atualização permanecerá desativado até que não realize esta ação."
LIVEUPDATE_HASUPDATES_HEAD="Existe uma versão nova disponível"
LIVEUPDATE_NOUPDATES_HEAD="Você já tem a última versão"
LIVEUPDATE_CURRENTVERSION="Versão instalada"
LIVEUPDATE_LATESTVERSION="Última versão"
LIVEUPDATE_LATESTRELEASED="Data do último lançamento"
LIVEUPDATE_DOWNLOADURL="URL de download direto"

LIVEUPDATE_REFRESH_INFO="Refrescar a informação de atualização"
LIVEUPDATE_DO_UPDATE="Atualizar a última versão"

LIVEUPDATE_FTP_REQUIRED="Live Update determina que é necessário o uso de FTP para baixar e instalar a atualização, mas não guardou sua informação de acesso FTP em seu site Joomla!, em Configuração Global. <br/><br/> Indique o nome de usuário FTP e senha para continuar com a atualização."
LIVEUPDATE_FTP="Informação FTP"
LIVEUPDATE_FTPUSERNAME="Usuário FTP"
LIVEUPDATE_FTPPASSWORD="Senha FTP"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="Baixar e instalar a atualização"

LIVEUPDATE_DOWNLOAD_FAILED="O download do pacote de atualização falhou. Assegure-se que seu diretório  /tmp pode escrever ou que habilitou as opções de FTP na Configuração Global do seu site Joomla!"
LIVEUPDATE_EXTRACT_FAILED="Falhou a descompressão do pacote de atualização. Por favor, tente atualizar a extensão manualmente."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Tipo de pacote não é válido. A atualização não pode continuar."
LIVEUPDATE_INSTALLEXT="Instale %s %s"
LIVEUPDATE_ERROR="Erro"
LIVEUPDATE_SUCCESS="Êxito"

LIVEUPDATE_ICON_UNSUPPORTED="Atualização ao Vivo não suportadactualización en Vivo no soportada"
LIVEUPDATE_ICON_CRASHED="Atualização ao Vivo foi danificada"
LIVEUPDATE_ICON_CURRENT="Você tem a última versão"
LIVEUPDATE_ICON_UPDATES="ATUALIZAÇÃO ENCONTRADA! CLIQUE PARA ATUALIZAR."

LIVEUPDATE_RELEASEINFO="Informações"
LIVEUPDATE_RELEASENOTES="Notas de lançamento"
LIVEUPDATE_READMOREINFO="Leia mais"

; LIVEUPDATE_NAGSCREEN_HEAD="WARNING! You are about to install an unstable version."
; LIVEUPDATE_NAGSCREEN_BODY="You are about to install an unstable version (%s - %s). Unstable versions may have undergone minimal or no testing and contain bugs which may have an serious adverse to the stability and functionality of your web site. If you are not sure about what you are about to do, please close this browser window. If you are absolutely certain you understand the risks involved with the installation of unstable releases, please click the button below to continue the installation of this unstable release."
; LIVEUPDATE_NAGSCREEN_BUTTON="I understand the risks. Continue with the installation."

; LIVEUPDATE_STABILITY_ALPHA="Alpha"
; LIVEUPDATE_STABILITY_BETA="Beta"
; LIVEUPDATE_STABILITY_RC="RC"
; LIVEUPDATE_STABILITY_STABLE="Stable"
; LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/pl-PL/pl-PL.liveupdate.ini000060400000010403152453623450021764 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="Aktualizacja"

LIVEUPDATE_NOTSUPPORTED_HEAD="Aktualizacja nie jest obsługiwana na tym serwerze"
LIVEUPDATE_NOTSUPPORTED_INFO="Twój serwer sygnalizuje, że Aktualizacja nie jest obsługiwana. Proszę skontaktować się administratorem hosta i poprosić o włączenie rozszerzenia cURL PHP albo aktywowanie URL fopen() wrappers. Jeżeli te są już włączone, poproś o skonfigurowanie firewalla tak, by umożliwił dostęp do następującego adresu URL:"_QQ_""
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Zawsze można zaktualizować <var>%s</var> odwiedzając naszeą witrynę ręcznie, pobranie najnowszej wersji i instalacji za pomocą instalatora rozszerzeń Joomla!."

LIVEUPDATE_STUCK_HEAD="Aktualizacja oznaczona jako niepowodzenie"
LIVEUPDATE_STUCK_INFO="Aktualizacja zaznacza o niepowodzeniu podczas ostatniej próby kontaktu z serwerem aktualizacji. To zwykle wskazuje na hosta, który aktywnie blokuje komunikacje z zewnętrznymi stronami. Jeśli chcesz ponowić próbę pobierania informacje o aktualizacji, kliknij przycisk "_QQ_"Odśwież informacje o aktualizacji"_QQ_" poniżej. Jeśli wynikiem jest pusta strona, proszę skontaktować się z administracją hosta i zgłosić ten problem."

LIVEUPDATE_ERROR_NEEDSAUTH="Musisz podać swój login/hasło lub Download ID w parametrach komponentu przed próbą aktualizacji do najnowszej wersji. Przycisk aktualizacji pozostanie wyłączony do czasu aż to zrobisz."
LIVEUPDATE_HASUPDATES_HEAD="Nowa wersja jest dostępna"
LIVEUPDATE_NOUPDATES_HEAD="Masz już najnowszą wersję"
LIVEUPDATE_CURRENTVERSION="Zainstalowana wersja"
LIVEUPDATE_LATESTVERSION="Najnowsza wersja"
LIVEUPDATE_LATESTRELEASED="Data najnowszej wersji"
LIVEUPDATE_DOWNLOADURL="URL bezpośredniego pobierania"

LIVEUPDATE_REFRESH_INFO="Odśwież informacje o aktualizacji"
LIVEUPDATE_DO_UPDATE="Aktualizacja do najnowszej wersji"

LIVEUPDATE_FTP_REQUIRED="Aktualizacja zaznacza, że musi korzystać z protokołu FTP w celu pobrania i zainstalowania aktualizacji, ale nie zostały wcześniej zapisane dane logowania FTP w twojej Konfiguracji Globalnej Joomla!.<br/><br/>Prosimy o podanie nazwy użytkownika i hasła FTP poniżej, aby kontynuować aktualizację."
LIVEUPDATE_FTP="Informacje FTP"
LIVEUPDATE_FTPUSERNAME="Login FTP"
LIVEUPDATE_FTPPASSWORD="Hasło FTP"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="Pobierz i zainstaluj aktualizację"

LIVEUPDATE_DOWNLOAD_FAILED="Pobranie pakietu aktualizacji nie powiodło się. Upewnij się, że katalog tymczasowy jest zapisywalny lub, że masz włączoną opcję FTP Joomla! w Konfiguracji Globalnej twojej witryny."
LIVEUPDATE_EXTRACT_FAILED="Rozpakowanie pakietu aktualizacji nie powiodło się. Proszę spróbować aktualizacji rozszerzenia ręcznie."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Nieprawidłowy typ pakietu. Aktualizacja nie może być kontynuowana."
LIVEUPDATE_INSTALLEXT="Instalacja %s %s"
LIVEUPDATE_ERROR="Błąd"
LIVEUPDATE_SUCCESS="Powodzenie"

LIVEUPDATE_ICON_UNSUPPORTED="Aktualizacja nie jest obsługiwana"
LIVEUPDATE_ICON_CRASHED="Aktualizacja nie powiodła się"
LIVEUPDATE_ICON_CURRENT="Masz najnowszą wersję"
LIVEUPDATE_ICON_UPDATES="ZNALEZIONO AKTUALIZACJĘ! Kliknij!."

; LIVEUPDATE_RELEASEINFO="Information"
; LIVEUPDATE_RELEASENOTES="Release notes"
; LIVEUPDATE_READMOREINFO="Read more"

; LIVEUPDATE_NAGSCREEN_HEAD="WARNING! You are about to install an unstable version."
; LIVEUPDATE_NAGSCREEN_BODY="You are about to install an unstable version (%s - %s). Unstable versions may have undergone minimal or no testing and contain bugs which may have an serious adverse to the stability and functionality of your web site. If you are not sure about what you are about to do, please close this browser window. If you are absolutely certain you understand the risks involved with the installation of unstable releases, please click the button below to continue the installation of this unstable release."
; LIVEUPDATE_NAGSCREEN_BUTTON="I understand the risks. Continue with the installation."

; LIVEUPDATE_STABILITY_ALPHA="Alpha"
; LIVEUPDATE_STABILITY_BETA="Beta"
; LIVEUPDATE_STABILITY_RC="RC"
; LIVEUPDATE_STABILITY_STABLE="Stable"
; LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/el-GR/el-GR.liveupdate.ini000060400000016556152453623450021747 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="Απευθείας Ενημέρωση"

LIVEUPDATE_NOTSUPPORTED_HEAD="Η Απευθείας Ενημέρωση δεν υποστηρίζεται από αυτόν τον διακομιστή"
LIVEUPDATE_NOTSUPPORTED_INFO="Ο διακομιστής σας δείχνει ότι η Απευθείας Ενημέρωση δεν υποστηρίζεται. Παρακαλώ επικοινωνήστε με τον πάροχο φιλοξενίας σας και ζητήστε του να ενεργοποιήσει την επέκταση cURL της PHP ή τους URL fopen() wrappers. Εάν είναι ήδη ενεργοποιημένα, παρακαλώ ζητήστε του να ανοίξει το τείχος ασφαλείας ώστε να επιτρέπει την πρόσβαση στην παρακάτω διεύθυνση URL:"_QQ_""
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Μπορείτε πάντα να ενημερώστε το λογισμικό <var>%s</var> επισκεπτόμενοι τον ιστότοπό μας, κατεβάζοντας την τελευταία έκδοση και εγκαθιστόντας την με την εγκατάσταση εφαρμογών του Joomla!."

LIVEUPDATE_STUCK_HEAD="Η Απευθείας Ενημέρωση ανίχνευσε αποτυχία λειτουργίας"
LIVEUPDATE_STUCK_INFO="Η Απευθείας Ενημέρωση εντόπισε ότι η τελευταία απόπειρα επικοινωνίας με τον διακομιστή ενημερώσεων κατέληξε σε κόλλημα. Αυτό συνήθως υποδυκνείει έναν πάροχο φιλοξενίας που μπλοκάρει ενεργά τις προσπάθειες επικοινωνίας με εξωετρικούς ιστοχώρους. Εάν θα θέλατε να δοκιμάσετε να ξαναπροσπαθήσουμε να λάβουμε τις πληροφορίες ενημέρωσεις, παρακαλώ κάντε κλικ στο κουμπί "_QQ_"Ανανέωση πληροφοριών ενημερώσεων"_QQ_" πιο κάτω. Εάν αυτό οδηγήσει σε λευκή σελίδα, παρακαλώ επικοινωνήστε με τον πάροχο φιλοξενίας και αναφέρετε αυτό το πρόβλημα."

LIVEUPDATE_ERROR_NEEDSAUTH="Πρέπει να εισάγετε το όνομα χρήστη και συνθηματικό ή το Αναγνωριστικό Μεταφόρτωσης στις παραμέτρους της εφαρμογής πριν προσπαθήσετε να αναβαθμίσετε στην τελευταία έκδοση. Το κουμπί ενημέρωσης θα παραμείνει ανενεργό έως ότου το κάνετε."
LIVEUPDATE_HASUPDATES_HEAD="Μια νέα έκδοση είναι διαθέσιμη"
LIVEUPDATE_NOUPDATES_HEAD="Έχετε ήδη την τελευταία έκδοση"
LIVEUPDATE_CURRENTVERSION="Εγκατεστημένη έκδοση"
LIVEUPDATE_LATESTVERSION="Τελευταία έκδοση"
LIVEUPDATE_LATESTRELEASED="Ημερομηνία έκδοσης"
LIVEUPDATE_DOWNLOADURL="Διεύθυνση απευθείας μεταφόρτωσης"

LIVEUPDATE_REFRESH_INFO="Ανανέωση πληροφοριών ενημερώσεων"
LIVEUPDATE_DO_UPDATE="Ενημέρωση στην τελευταία έκδοση"

LIVEUPDATE_FTP_REQUIRED="Η Απευθείας Ενημέρωση εντόπισε ότι απαιτείται η χρήση FTP για να μεταφορτώσει και να εγκαταστήσει την ενημέρωσή σας, αλλά δεν έχετε σώσει τις πληροφορίες εισόδου στο FTP στις Γενικές Ρυθμίσεις του Joomla!.<br/><br/>Παρακαλώ εισάγετε το όνομα χρήστη και το συνθηματικό για το FTP προκειμένου να προχωρήσετε με την ενημέρωση."
LIVEUPDATE_FTP="Πληροφορίες FTP"
LIVEUPDATE_FTPUSERNAME="Όνομα Χρήστη FTP"
LIVEUPDATE_FTPPASSWORD="Συνθηματικό FTP"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="Μεταφόρτωση και εγκατάσταση ενημέρωσης"

LIVEUPDATE_DOWNLOAD_FAILED="Η μεταφόρτωση του πακέτου ενημέρωσης απέτυχε. Παρακαλώ βεβαιωθείτε ότι ο κάταλογος προσωρινής αποθήκευσης είναι εγγράψιμος ή ότι έχετε ενεργοποιήσει τις επιλογές FTP στις Γενικές Ρυθμίσεις του ιστοχώρου σας."
LIVEUPDATE_EXTRACT_FAILED="Η αποσυμπίεση του πακέτου αναβάθμισης απέτυχε. Παρακαλώ δοκιμάστε να εγκαταστήσετε την επέκταση χειροκίνητα."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Ο τύπος του πακέτου δεν είναι έγκυρος. Η αναβάθμιση δεν μπορεί να συνεχίσει."
LIVEUPDATE_INSTALLEXT="Εγκατάσταση %s %s"
LIVEUPDATE_ERROR="Σφάλμα"
LIVEUPDATE_SUCCESS="Επιτυχία"

LIVEUPDATE_ICON_UNSUPPORTED="Η Απευθείας Ενημέρωση δεν υποστηρίζεται"
LIVEUPDATE_ICON_CRASHED="Η Απευθείας Ενημέρωση κόλλησε"
LIVEUPDATE_ICON_CURRENT="Έχετε την τελευταία έκδοση"
LIVEUPDATE_ICON_UPDATES="ΒΡΕΘΗΚΕ ΕΝΗΜΕΡΩΣΗ! ΚΑΝΤΕ ΚΛΙΚ ΓΙΑ ΑΝΑΒΑΘΜΙΣΗ."

LIVEUPDATE_RELEASEINFO="Πληροφορίες"
LIVEUPDATE_RELEASENOTES="Σημειώσεις έκδοσης"
LIVEUPDATE_READMOREINFO="Διαβάστε περισσότερα"

LIVEUPDATE_NAGSCREEN_HEAD="ΠΡΟΣΟΧΗ! Πρόκειται να εγκαταστήσετε μια ασταθή έκδοση."
LIVEUPDATE_NAGSCREEN_BODY="Πρόκειται να εγκαταστήσετε μια ασταθή έκδοση (%s - %s). Οι ασταθείς εκδόσεις μπορεί να έχουν υποβληθεί σε ελάχιστο ή περιορισμένο ποιοτικό έλεγχο και να περιέχουν σφάλματα που μπορεί να έχουν σοβαρές παρενέργειες στην σταθερότητα και λειτουργία τουιστοχώρου σας. Εάν δεν είστε βέβαιος για αυτό που πρόκειται να κάνετε, παρακαλώ κλείστε αυτό το παράθυρο του περιηγητή σας. Εάν κατανοείτε πλήρως τους κινδύνους που συνοδεύουν την εγκατάσταση ασταθών εκδόσεων παρακαλώ κάντε κλικ στο παρακάτω κουμπί για να συνεχίσετε την εγκατάσταση αυτής της ασταθούς έκδοσης."
LIVEUPDATE_NAGSCREEN_BUTTON="Καταννοώ τους κινδύνους. Συνέχισε την εγκατάσταση."

LIVEUPDATE_STABILITY_ALPHA="Άλφα"
LIVEUPDATE_STABILITY_BETA="Βήτα"
LIVEUPDATE_STABILITY_RC="Υποψήφια Έκδοσης"
LIVEUPDATE_STABILITY_STABLE="Σταθερή"
LIVEUPDATE_STABILITY_SVN="Έκδοση Προγραμματιστή"components/com_icagenda/liveupdate/language/fa-IR/fa-IR.liveupdate.ini000060400000013745152453623450021724 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="به روز رسانی آنلاین"

LIVEUPDATE_NOTSUPPORTED_HEAD="به روز رسانی آنلاین در این سرور پشتیبانی نمی شود"
LIVEUPDATE_NOTSUPPORTED_INFO="سرور شما نشان می دهد که به روز رسانی آنلاین پشتیبانی نمی شود. لطفا با میزبان خود تماس بگیرید و از آن ها بخواهید که افزونه cURL یا URL fopen() wrapper را در PHP فعال نمایند. اگر این در حال حاضر فعال است، لطفا از آن ها بخواهید که پیکربندی فایروال خود را به طوری که اجازه دسترسی به این آدرس را بدهد تنظیم نمایند:"
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="شما همچنین می توانید با مراجعه به سایت ما و دانلود آخرین نسخه و نصب آن از طریق نصب کننده جوملا اقدام به به روز رسانی <var>%s</var> نمایید."

LIVEUPDATE_STUCK_HEAD="به روز رسانی آنلاین با مشکل مواجه شد."
LIVEUPDATE_STUCK_INFO="به روز رسانی آنلاین در آخرین باری که تلاش برای ارتباط با سرور به روز رسانی نموده است، با مشکل مواجه شد. این معمولا در مورد میزبان هایی به وجود می آید که ارتباط با سایت های دیگر را مسدود می نمایند. در صورتی که می خواهید اطلاعات به روز رسانی را مجددا دریافت نمایید، روی دکمه "_QQ_"بازیابی مجدد اطلاعات به روز رسانی"_QQ_" در زیر کلیک نمایید. در صورتی که با صفحه ی خالی مواجه شدید، با میزبان خود تماس حاصل نموده و مشکل را گزارش دهید."

LIVEUPDATE_ERROR_NEEDSAUTH="شما می بایستی نام کاربری/رمز عبور یا شناسه دانلود خود را قبل از تلاش برای به روز رسانی به نسخه نهایی در تنظیمات کامپوننت وارد نمایید. دکمه به روز رسانی تا وقتی که شما این کار را انجام دهید غیرفعال خواهد ماند."
LIVEUPDATE_HASUPDATES_HEAD="نسخه جدیدی موجود می باشد"
LIVEUPDATE_NOUPDATES_HEAD="نسخه شما به روز می باشد"
LIVEUPDATE_CURRENTVERSION="نسخه نصب شده"
LIVEUPDATE_LATESTVERSION="آخرین نسخه"
LIVEUPDATE_LATESTRELEASED="تاریخ آخرین نسخه"
LIVEUPDATE_DOWNLOADURL="آدرس دانلود مستقیم"

LIVEUPDATE_REFRESH_INFO="بارگزاری مجدد اطلاعات به روز رسانی"
LIVEUPDATE_DO_UPDATE="به روز رسانی به آخرین نسخه"

LIVEUPDATE_FTP_REQUIRED="به روز رسانی آنلاین تشخیص داده است که شما برای دانلود و نصب به روز رسانی، می بایستی از FTP استفاده نمایید، ولی شما اطلاعات ورود FTP را در تنظیمات سراسری جوملا وارد نکرده اید.<br/><br/>لطفا نام کاربری و رمز عبور FTP را جهت اجرای عملیات به روز رسانی در قسمت های زیر وارد نمایید."
LIVEUPDATE_FTP="اطلاعات FTP"
LIVEUPDATE_FTPUSERNAME="نام کاربری FTP"
LIVEUPDATE_FTPPASSWORD="رمز عبور FTP"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="دانلود و نصب به روز رسانی"

LIVEUPDATE_DOWNLOAD_FAILED="دانلود فایل به روز رسانی با شکست مواجه شد. جهت رفع این مشکل بررسی نمایید که پوشه موقت سایتتان (temp) قابل نوشتن بوده و یا تنظیمات FTP جوملا را در تنظیمات سراسری سایت فعال کرده باشید."
LIVEUPDATE_EXTRACT_FAILED="استخراج فایل به روز رسانی از حالت فشرده با شکست مواجه شد. لطفا افزونه را به طور دستی به روز رسانی نمایید."

LIVEUPDATE_INVALID_PACKAGE_TYPE="نوع فایل نامعتبر می باشد. عملیات به روز رسانی قابل اجرا نمی باشد."
LIVEUPDATE_INSTALLEXT="نصب %s %s"
LIVEUPDATE_ERROR="خطا"
LIVEUPDATE_SUCCESS="انجام شد"

LIVEUPDATE_ICON_UNSUPPORTED="به روز رسانی آنلاین پشتیبانی نمی شود"
LIVEUPDATE_ICON_CRASHED="به روز رسانی آنلاین به خطا مواجه شد"
LIVEUPDATE_ICON_CURRENT="نسخه شما به روز می باشد"
LIVEUPDATE_ICON_UPDATES="به روز رسانی جدیدی یافت شد! جهت به روز رسانی کلیک نمایید."

LIVEUPDATE_RELEASEINFO="اطلاعات"
LIVEUPDATE_RELEASENOTES="اطلاعات نسخه"
LIVEUPDATE_READMOREINFO="مطالعه بیشتر"

LIVEUPDATE_NAGSCREEN_HEAD="اخطار! شما در حال نصب نسخه ای ناپایدار هستید."
LIVEUPDATE_NAGSCREEN_BODY="شما در حال نصب نسخه ای ناپایدار هستید (%s - %s). نسخه های ناپایدار ممکن است تحت آزمایش کم و یا هیچ بوده باشند و عوارض جانبی جدی برای پایداری سایت شما داشته باشند. در صورتی که اطلاعاتی در این مورد ندارید، لطفا این صفحه را ببندید. و در صورتی که از ریسک این موضوع مطلع هستید و می خواهید ادامه دهید، روی دکمه زیر جهت ادامه نصب این نسخه ناپایدار کلیک نمایید."
LIVEUPDATE_NAGSCREEN_BUTTON="از خطرات این عمل آگاه هستم. عملیات نصب را ادامه بده."

LIVEUPDATE_STABILITY_ALPHA="آلفا"
LIVEUPDATE_STABILITY_BETA="بتا"
LIVEUPDATE_STABILITY_RC="کاندید"
LIVEUPDATE_STABILITY_STABLE="پایدار"
LIVEUPDATE_STABILITY_SVN="svn"components/com_icagenda/liveupdate/language/da-DK/da-DK.liveupdate.ini000060400000010201152453623450021650 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="Live Opdatering"

LIVEUPDATE_NOTSUPPORTED_HEAD="Live opdatering understøttes ikke af denne server"
LIVEUPDATE_NOTSUPPORTED_INFO="Din server indikerer at Live opdatering ikke er understøttet. Kontakt venligst din udbyder og spørg dem om at aktivere cURL PHP udvidelsen eller aktivere URL fopen() wrappers. Hvis disse allerede er aktive, så spørg dem venligst om at konfigurere deres firewall, således at den tillader adgang til følgende :"
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Du kan altid opdatere <var>%s</var> ved at besøge vores hjemmeside manuelt og hente den seneste udgivelse og derefter installere den ved at bruge Joomla!'s udvidelsesinstalleren."

LIVEUPDATE_STUCK_HEAD="Live opdatering melder at den gik ned"
LIVEUPDATE_STUCK_INFO="Live opdatering opdagede at den gik ned sidste gang den prøvede at kontakte opdateringsserveren. Dette indikerer nomalt en udbyder der aktivt blokerer kommunikation med eksterne sider. Hvis du vil forsøge at hente opdateringsinformationen igen, klik da venligst på "_QQ_"Opdatér opdateringsinformation"_QQ_" herunder. Hvis det resulterer i en blank side, så kontakt venligst din udbyder og rapportér dette problem."

LIVEUPDATE_ERROR_NEEDSAUTH="Du skal angive dit brugernavn/adgangskode eller Overførsel's ID i komponenten's indstillinger, før du kan opdatere til den seneste version. Opdateringsknappen vil forblive inaktiv indtil da."
LIVEUPDATE_HASUPDATES_HEAD="En ny version er tilgængelig"
LIVEUPDATE_NOUPDATES_HEAD="Du har allerede den seneste version"
LIVEUPDATE_CURRENTVERSION="Installeret version"
LIVEUPDATE_LATESTVERSION="Seneste version"
LIVEUPDATE_LATESTRELEASED="Seneste udgivelsesdato"
LIVEUPDATE_DOWNLOADURL="Direkte link"

LIVEUPDATE_REFRESH_INFO="Opdatér opdateringsinformation"
LIVEUPDATE_DO_UPDATE="Opdatér til seneste version"

LIVEUPDATE_FTP_REQUIRED="Live opdatering har opdaget at den skal bruge FTP for at kunne overføre og installere din opdatering, men du har ikke gemt en FTP log ind information i din Joomla!'s konfiguration.<br/><br/>Angiv venligst FTP brugernavn og adgangskode herunder for at fortsætte med opdateringen."
LIVEUPDATE_FTP="FTP information"
LIVEUPDATE_FTPUSERNAME="FTP Brugernavn"
LIVEUPDATE_FTPPASSWORD="FTP Adgangskode"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="Overfør og installér opdatering"

LIVEUPDATE_DOWNLOAD_FAILED="Overførsel af opdateringspakken fejlede. Vær venligst sikker på der kan skrives til din midlertidige mappe og at du har aktiveret Joomla!'s FTP mulighed i Joomla!'s konfiguration."
LIVEUPDATE_EXTRACT_FAILED="Udpakning af opdateringspakken fejlede. Opdatér venligst udvidelsen manuelt."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Ugyldig pakketype. Opdateringen kan ikke fortsætte."
LIVEUPDATE_INSTALLEXT="Installér %s %s"
LIVEUPDATE_ERROR="Fejl"
LIVEUPDATE_SUCCESS="Korrekt"

LIVEUPDATE_ICON_UNSUPPORTED="Live opdatering er ikke understøttet"
LIVEUPDATE_ICON_CRASHED="Live opdatering gik ned"
LIVEUPDATE_ICON_CURRENT="Du har den seneste version"
LIVEUPDATE_ICON_UPDATES="OPDATERING FUNDET! OPDATER NU."

; LIVEUPDATE_RELEASEINFO="Information"
; LIVEUPDATE_RELEASENOTES="Release notes"
; LIVEUPDATE_READMOREINFO="Read more"

; LIVEUPDATE_NAGSCREEN_HEAD="WARNING! You are about to install an unstable version."
; LIVEUPDATE_NAGSCREEN_BODY="You are about to install an unstable version (%s - %s). Unstable versions may have undergone minimal or no testing and contain bugs which may have an serious adverse to the stability and functionality of your web site. If you are not sure about what you are about to do, please close this browser window. If you are absolutely certain you understand the risks involved with the installation of unstable releases, please click the button below to continue the installation of this unstable release."
; LIVEUPDATE_NAGSCREEN_BUTTON="I understand the risks. Continue with the installation."

; LIVEUPDATE_STABILITY_ALPHA="Alpha"
; LIVEUPDATE_STABILITY_BETA="Beta"
; LIVEUPDATE_STABILITY_RC="RC"
; LIVEUPDATE_STABILITY_STABLE="Stable"
; LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/de-DE/de-DE.liveupdate.ini000060400000010750152453623450021655 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="Echtzeitaktualisierung"

LIVEUPDATE_NOTSUPPORTED_HEAD="Die Echtzeitaktualisierung wird auf diesem Server nicht unterstützt"
LIVEUPDATE_NOTSUPPORTED_INFO="Ihr Server zeigt an, dass die Echtzeitaktualisierung nicht unterstützt wird. Bitte kontaktieren Sie Ihren Anbieter und bitten ihn, die cURL-PHP-Erweiterung zu aktivieren oder die URL fopen() Wrapper. Sollten diese schon aktviert sein, bitten Sie ihn, die Firewall so zu konfigurieren, dass sie den Zugriff auf folgende URL zulässt:"_QQ_""
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Sie können immer aktualisieren <var>%s</var> indem Sie unsere Internetseite besuchen, die neueste Version herunterladen und ganz normal installieren."

LIVEUPDATE_STUCK_HEAD="Die Echtzeitaktualisierung hat sich selbst als abgestürzt gemeldet"
LIVEUPDATE_STUCK_INFO="Die Echtzeitaktualisierung hat festgestellt, dass sie beim letzten Versuch den Aktualisierungsserver zu erreichen abgestürzt ist. Dies deutet meist auf einen Anbieter hin, der die Kommunikation mit externen Servern blockiert. Sollten Sie die Aktulalisierungsinformationen nochmals abrufen wollen, klicken Sie bitte auf den Knopf "_QQ_"Aktualisierungsinformationen abrufen"_QQ_". Sollte dieser Versuch auf einer weißen Seite enden, melden Sie diesen Fehler ihrem Anbieter."

LIVEUPDATE_ERROR_NEEDSAUTH="Bevor Sie eine Echtzeitaktualisierung durchführen können, müssen Sie Ihren Benutzernamen, das Passwort bzw. die Download-ID angeben. Der Aktualisierungsknopf wird solange ohne Funktion bleiben."
LIVEUPDATE_HASUPDATES_HEAD="Es gibt eine neue Version"
LIVEUPDATE_NOUPDATES_HEAD="Sie haben die aktuelle Version"
LIVEUPDATE_CURRENTVERSION="Installierte Version"
LIVEUPDATE_LATESTVERSION="Neueste Version"
LIVEUPDATE_LATESTRELEASED="Neuestes Veröffentlichungsdatum"
LIVEUPDATE_DOWNLOADURL="Direkte Download-URL"

LIVEUPDATE_REFRESH_INFO="Aktualisierungsinformationen abrufen"
LIVEUPDATE_DO_UPDATE="Auf die neueste Version aktualisieren"

LIVEUPDATE_FTP_REQUIRED="Die Echtzeitaktualisierung hat festgestellt, dass FTP für die Aktualisierung und Installation verwednet werden muss. Sie haben aber noch keine FTP-Daten in der Joomla!-Konfiguraton angegeben.<br/><br/>BItte geben Sie Ihre FTP-Daten ein, bevor Sie mit der Aktualisierung fortfahren."
LIVEUPDATE_FTP="FTP Informationen"
LIVEUPDATE_FTPUSERNAME="FTP Benutzername"
LIVEUPDATE_FTPPASSWORD="FTP Passwort"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="Aktualisierung herunterladen und installieren"

LIVEUPDATE_DOWNLOAD_FAILED="Das Herunterladen des Aktualisierungspakets ist fehlgeschlagen. Bitte stellen Sie sicher, dass Ihr temp-Verzeichnis Schreibrechte besitzt und Sie Ihre FTP-Nutzerdaten in der Joomla!-Konfiguration angegeben haben."
LIVEUPDATE_EXTRACT_FAILED="Das Auspacken des Aktualisierungspakets ist fehlgeschlagen. Bitte aktualisieren Sie die Erweiterung manuell."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Falscher Aktualisierungspakettyp. Die Aktualisierung kann nicht durchgeführt werden."
LIVEUPDATE_INSTALLEXT="Installiere %s %s"
LIVEUPDATE_ERROR="Fehler"
LIVEUPDATE_SUCCESS="Erfolg"

LIVEUPDATE_ICON_UNSUPPORTED="Echtzeitaktualisierung nicht unterstützt"
LIVEUPDATE_ICON_CRASHED="Live Update abgestürzt"
LIVEUPDATE_ICON_CURRENT="Sie haben die aktuelle Version"
LIVEUPDATE_ICON_UPDATES="AKTUALISIERUNG GEFUNDEN! JETZT AKTUALISIEREN."

LIVEUPDATE_RELEASEINFO="Information"
LIVEUPDATE_RELEASENOTES="Infos zur Veröffentlichung"
LIVEUPDATE_READMOREINFO="Weiterlesen"

LIVEUPDATE_NAGSCREEN_HEAD="ACHTUNG! Sie sind dabei, eine instabile Version zu installieren."
LIVEUPDATE_NAGSCREEN_BODY="Sie sind dabei, eine instabile Version zu installieren (%s - %s). Instabile Versionen sind noch in Entwicklung oder nicht final getestet und können Bugs enthalten, die die Stabilität und Funktionalität Ihrer Webseite beeinträchtigen können. Wenn Sie nicht sicher sind, was Sie tun sollen, dann schließen Sie dieses Browserfenster. Sollten Sie absolut sicher sein, dass Sie das Risiko eingehen und die möglichen Folgen einer unfertigen Version auf eigene Gefahr in Kauf nehmen wollen,  klicken Sie auf den unten stehenden Button um die instabile Version zu installieren."
LIVEUPDATE_NAGSCREEN_BUTTON="Ich kenne die Risiken. Mit der Installation fortfahren."

; LIVEUPDATE_STABILITY_ALPHA="Alpha"
; LIVEUPDATE_STABILITY_BETA="Beta"
; LIVEUPDATE_STABILITY_RC="RC"
; LIVEUPDATE_STABILITY_STABLE="Stable"
; LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/nb-NO/nb-NO.liveupdate.ini000060400000010260152453623450021737 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="Direkteoppdatering"

LIVEUPDATE_NOTSUPPORTED_HEAD="Direkteoppdatering støttes ikke på denne serveren."
LIVEUPDATE_NOTSUPPORTED_INFO="Din server indikerer at direkteoppdatering ikke støttes. Kontakt din leverandør og spør om de kan aktivere cURL PHP eller aktivere URL fopen(). Dersom disse allerede er aktivert kan du spørre om de kan konfigurere sin brannmur slik at den gir tilgang til følgende URL:"
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Du kan alltid oppdatere <var>%s</var> manuelt ved å besøke vår side. Laste ned og installer den nyeste versjonen ved hjelp av Joomlas installasjonsfunksjon."

LIVEUPDATE_STUCK_HEAD="Direkteoppdateringen har merket seg selv som krasjet."
LIVEUPDATE_STUCK_INFO="Direkteoppdatering avdekket at den krasjet forrige gang den forsøkte å kontakte oppdateringsserveren. Dette betyr vanligvis at du benytter en leverandør av netthotell som aktivt blokkerer kommunikasjon med eksterne nettsteder. Hvis du ønsker å forsøke på nytt å hente oppdateringsinformasjonen, klikk på knappen "_QQ_"Oppdater informasjon"_QQ_" nedenfor. Dersom dette resulterer i en blank side bør du kontakte din leverandør av netthotell for å melde fra om dette problemet."

LIVEUPDATE_ERROR_NEEDSAUTH="Du må oppgi ditt brukernavn/passord eller nedlastnings-id i komponentens innstillinger før du forsøker å oppdatere til siste versjon. Oppdateringsknappen vil forbli deaktivert inntil du gjøre dette."
LIVEUPDATE_HASUPDATES_HEAD="En ny versjon er tilgjengelig"
LIVEUPDATE_NOUPDATES_HEAD="Du har allerede den nyeste versjonen"
LIVEUPDATE_CURRENTVERSION="Installert versjon"
LIVEUPDATE_LATESTVERSION="Nyeste versjon"
LIVEUPDATE_LATESTRELEASED="Siste utgivelsesdato"
LIVEUPDATE_DOWNLOADURL="Nedlastingsadresse"

LIVEUPDATE_REFRESH_INFO="Oppdater informasjon"
LIVEUPDATE_DO_UPDATE="Oppdater til siste versjon"

LIVEUPDATE_FTP_REQUIRED="Direkteoppdatering har avdekket at den må bruke FTP, for å laste ned og installere oppdateringen, men du har ikke angitt og lagret FTP-informasjonen under nettstedets globale konfigurasjon .<br /><br />Du må oppgi FTP-brukernavn og passord nedenfor for å kunne fortsette med oppdateringen."
LIVEUPDATE_FTP="FTP-informasjon"
LIVEUPDATE_FTPUSERNAME="FTP-brukernavn"
LIVEUPDATE_FTPPASSWORD="FTP-passord"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="Last ned og installer oppdateringen"

LIVEUPDATE_DOWNLOAD_FAILED="Nedlasting av oppdateringspakke mislyktes. Påse at temp-mappen er skrivbar, eller at du har aktivert Joomlas FTP-innstillinger under nettstedets globale konfigurasjon."
LIVEUPDATE_EXTRACT_FAILED="Utpakking av oppdateringspakken mislyktes. Forsøk å oppdatere utvidelsen manuelt."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Ugyldig pakketype. Oppdateringen kan ikke fortsette."
LIVEUPDATE_INSTALLEXT="Installer %s %s"
LIVEUPDATE_ERROR="Feil"
LIVEUPDATE_SUCCESS="Vellykket"

LIVEUPDATE_ICON_UNSUPPORTED="Direkteoppdatering støttes ikke."
LIVEUPDATE_ICON_CRASHED="Direkteoppdatering krasjet."
LIVEUPDATE_ICON_CURRENT="Du har den nyeste versjonen."
LIVEUPDATE_ICON_UPDATES="OPPDATERING FUNNET! KLIKK FOR Å OPPDATERE."

; LIVEUPDATE_RELEASEINFO="Information"
; LIVEUPDATE_RELEASENOTES="Release notes"
; LIVEUPDATE_READMOREINFO="Read more"

; LIVEUPDATE_NAGSCREEN_HEAD="WARNING! You are about to install an unstable version."
; LIVEUPDATE_NAGSCREEN_BODY="You are about to install an unstable version (%s - %s). Unstable versions may have undergone minimal or no testing and contain bugs which may have an serious adverse to the stability and functionality of your web site. If you are not sure about what you are about to do, please close this browser window. If you are absolutely certain you understand the risks involved with the installation of unstable releases, please click the button below to continue the installation of this unstable release."
; LIVEUPDATE_NAGSCREEN_BUTTON="I understand the risks. Continue with the installation."

; LIVEUPDATE_STABILITY_ALPHA="Alpha"
; LIVEUPDATE_STABILITY_BETA="Beta"
; LIVEUPDATE_STABILITY_RC="RC"
; LIVEUPDATE_STABILITY_STABLE="Stable"
; LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/fi-FI/fi-FI.liveupdate.ini000060400000007520152453623450021706 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="Live Update"

LIVEUPDATE_NOTSUPPORTED_HEAD="Live Update ei ole tuettu tällä palvelimella"
LIVEUPDATE_NOTSUPPORTED_INFO="Palvelimesi mukaan Live Update ei ole tuettu. Ota yhteyttä palveluntarjoajaasi ja pyydä heitä ottamaan cURL PHP laajennus tai URL fopen() lisätoiminnot käyttöön. Jos nämä ovat jo käytössä, pyydä heitä muuttamaan palomuurinsa asetuksia niin, että se sallii yhteydet seuraavaan osoitteeseen:"_QQ_""
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Voit aina päivittää <var>%s</var> lisäosan käymällä sivustollamme, lataamalla viimeisimmän version ja asentamalla sen Joomla! lisäosien asennuksella."

LIVEUPDATE_STUCK_HEAD="Live Update on havainnut kaatuneensa"
LIVEUPDATE_STUCK_INFO="Live Update on havainnut, että se kaatui edellisellä kerralla päivitystä hakiessaan. Yleensä tämä johtuu palvelimestä, joka pyrkii estämään yhteydet muille palvelimille. Jos haluat yrittää päivitystietojen hakemista uudelleen, napsauta "_QQ_"Päivitä päivitystiedot"_QQ_" painiketta. Jos tästä seuraa tyhjä sivu, ota yhteyttä palveluntarjoajaasi ja ilmoita ongelmasta."

LIVEUPDATE_ERROR_NEEDSAUTH="Sinun täytyy syöttää pyydetty käyttäjätunniste komponentin asetuksissa ennenkuin voit päivittää viimeisimpään versioon. Päivityspainike pysyy estettynä siihen asti."
LIVEUPDATE_HASUPDATES_HEAD="Uusi versio on saatavilla"
LIVEUPDATE_NOUPDATES_HEAD="Sinulla on jo uusin versio"
LIVEUPDATE_CURRENTVERSION="Asennettu versio"
LIVEUPDATE_LATESTVERSION="Uusin versio"
LIVEUPDATE_LATESTRELEASED="Uusimman julkaisupäivä"
LIVEUPDATE_DOWNLOADURL="Suora latauslinkki"

LIVEUPDATE_REFRESH_INFO="Päivitä päivitystiedot"
LIVEUPDATE_DO_UPDATE="Päivitä uusimpaan versioon"

LIVEUPDATE_FTP_REQUIRED="Live Update havaitsi, että se tarvitsee FTP yhteyden ladatakseen päivityksesi, mutta FTP tietoja ei ole asetettu Joomla! asetuksissa.<br/><br/>Syötä FTP tunnus ja salasana päivittääksesi."
LIVEUPDATE_FTP="FTP tiedot"
LIVEUPDATE_FTPUSERNAME="FTP käyttäjänimi"
LIVEUPDATE_FTPPASSWORD="FTP salasana"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="Lataa ja asenna päivitys"

LIVEUPDATE_DOWNLOAD_FAILED="Päivityspaketin lataaminen epäonnistui. Varmista, että temp-kansioom voi kirjoittaa tai Joomla! FTP toiminnot on sallittu sivuston asetuksissa."
LIVEUPDATE_EXTRACT_FAILED="Päivityspaketin purkaminen epäonnistui. Yritä päivittää lisäosa manuaalisesti."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Paketin tyyppi ei kelpaa. Päivitystä ei voida tehdä."
LIVEUPDATE_INSTALLEXT="Asenna %s %s"
LIVEUPDATE_ERROR="Virhe"
LIVEUPDATE_SUCCESS="Onnistui"

LIVEUPDATE_ICON_UNSUPPORTED="Live Update ei tuettu"
LIVEUPDATE_ICON_CRASHED="Live Update kaatui"
LIVEUPDATE_ICON_CURRENT="Sinulla on uusin versio"
LIVEUPDATE_ICON_UPDATES="Päivitys löydetty! Napsauta päivittääksesi."

LIVEUPDATE_RELEASEINFO="Tietoja"
LIVEUPDATE_RELEASENOTES="Julkaisutiedot"
LIVEUPDATE_READMOREINFO="Lue lisää"

LIVEUPDATE_NAGSCREEN_HEAD="Varoitus. Olet asentamassa mahdollisesti epävakaata versiota."
LIVEUPDATE_NAGSCREEN_BODY="Olet asentamassa epävakaata versiota (%s - %s). Epävakaita versiota ei ole testattu riittävästi ja ne voivat sisältää ohjelmointivirheitä jotka voivat vahingoittaa sivustosi vakautta ja toimintaa. Jos et ole varma siitä mitä olet tekemässä, sulje tämä selain ikkuna. Jos olet aivan varma, että ymmärrät epävakaiden versioiden asentamiseen liittyvät riskit, napsauta alla olevaa painiketta jatkaaksesi asennusta."
; LIVEUPDATE_NAGSCREEN_BUTTON="I understand the risks. Continue with the installation."

LIVEUPDATE_STABILITY_ALPHA="Alpha"
LIVEUPDATE_STABILITY_BETA="Beta"
LIVEUPDATE_STABILITY_RC="RC"
; LIVEUPDATE_STABILITY_STABLE="Stable"
LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/sk-SK/sk-SK.liveupdate.ini000060400000010047152453623450022000 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

; LIVEUPDATE_TASK_OVERVIEW="Live Update"

; LIVEUPDATE_NOTSUPPORTED_HEAD="Live Update is not supported on this server"
; LIVEUPDATE_NOTSUPPORTED_INFO="Your server indicates that Live Update is not supported. Please contact your host and ask them to enable the cURL PHP extension or activate the URL fopen() wrappers. If these are already enabled, please ask them to configure their firewall so that it allows access to the following URL:"
; LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="You can always update <var>%s</var> by visiting our site manually, downloading the latest release and installing it using Joomla!'s extension installer."

; LIVEUPDATE_STUCK_HEAD="Live Update has marked itself as crashed"
; LIVEUPDATE_STUCK_INFO="Live Update determined that it crashed the last time it tried to contact the update server. This usually indicates a host which actively blocks communications with external sites. If you would like to retry fetching the update information, please click the "_QQ_"Refresh update information"_QQ_" button below. If that results to a blank page, please contact your host and report this issue."

; LIVEUPDATE_ERROR_NEEDSAUTH="You have to supply your username/password or Download ID to the component's parameters before trying to upgrade to the latest release. The upgrade button will remain disabled until you do that."
; LIVEUPDATE_HASUPDATES_HEAD="A new version is available"
; LIVEUPDATE_NOUPDATES_HEAD="You already have the latest version"
; LIVEUPDATE_CURRENTVERSION="Installed version"
; LIVEUPDATE_LATESTVERSION="Latest version"
; LIVEUPDATE_LATESTRELEASED="Latest release date"
; LIVEUPDATE_DOWNLOADURL="Direct download URL"

; LIVEUPDATE_REFRESH_INFO="Refresh update information"
; LIVEUPDATE_DO_UPDATE="Update to the latest version"

; LIVEUPDATE_FTP_REQUIRED="Live Update determined that it needs to use FTP in order to download and install your update, but you have not saved your FTP login information in your Joomla! Global Configuration.<br/><br/>Please provide the FTP username and password below to proceed with the update."
; LIVEUPDATE_FTP="FTP Information"
; LIVEUPDATE_FTPUSERNAME="FTP Username"
; LIVEUPDATE_FTPPASSWORD="FTP Password"
; LIVEUPDATE_DOWNLOAD_AND_INSTALL="Download and install update"

; LIVEUPDATE_DOWNLOAD_FAILED="Downloading the update package failed. Make sure that your temp-directory is writable or that you have enabled Joomla!'s FTP options in your site's Global Configuration."
; LIVEUPDATE_EXTRACT_FAILED="Extracting the update package failed. Please try updating the extension manually."

; LIVEUPDATE_INVALID_PACKAGE_TYPE="Invalid package type. The update can not proceed."
; LIVEUPDATE_INSTALLEXT="Install %s %s"
; LIVEUPDATE_ERROR="Error"
; LIVEUPDATE_SUCCESS="Success"

; LIVEUPDATE_ICON_UNSUPPORTED="Live Update not supported"
; LIVEUPDATE_ICON_CRASHED="Live Update crashed"
; LIVEUPDATE_ICON_CURRENT="You have the latest version"
; LIVEUPDATE_ICON_UPDATES="UPDATE FOUND! CLICK TO UPDATE."

; LIVEUPDATE_RELEASEINFO="Information"
; LIVEUPDATE_RELEASENOTES="Release notes"
; LIVEUPDATE_READMOREINFO="Read more"

; LIVEUPDATE_NAGSCREEN_HEAD="WARNING! You are about to install an unstable version."
; LIVEUPDATE_NAGSCREEN_BODY="You are about to install an unstable version (%s - %s). Unstable versions may have undergone minimal or no testing and contain bugs which may have an serious adverse to the stability and functionality of your web site. If you are not sure about what you are about to do, please close this browser window. If you are absolutely certain you understand the risks involved with the installation of unstable releases, please click the button below to continue the installation of this unstable release."
; LIVEUPDATE_NAGSCREEN_BUTTON="I understand the risks. Continue with the installation."

; LIVEUPDATE_STABILITY_ALPHA="Alpha"
; LIVEUPDATE_STABILITY_BETA="Beta"
; LIVEUPDATE_STABILITY_RC="RC"
; LIVEUPDATE_STABILITY_STABLE="Stable"
; LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/et-EE/et-EE.liveupdate.ini000060400000010047152453623450021716 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

; LIVEUPDATE_TASK_OVERVIEW="Live Update"

; LIVEUPDATE_NOTSUPPORTED_HEAD="Live Update is not supported on this server"
; LIVEUPDATE_NOTSUPPORTED_INFO="Your server indicates that Live Update is not supported. Please contact your host and ask them to enable the cURL PHP extension or activate the URL fopen() wrappers. If these are already enabled, please ask them to configure their firewall so that it allows access to the following URL:"
; LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="You can always update <var>%s</var> by visiting our site manually, downloading the latest release and installing it using Joomla!'s extension installer."

; LIVEUPDATE_STUCK_HEAD="Live Update has marked itself as crashed"
; LIVEUPDATE_STUCK_INFO="Live Update determined that it crashed the last time it tried to contact the update server. This usually indicates a host which actively blocks communications with external sites. If you would like to retry fetching the update information, please click the "_QQ_"Refresh update information"_QQ_" button below. If that results to a blank page, please contact your host and report this issue."

; LIVEUPDATE_ERROR_NEEDSAUTH="You have to supply your username/password or Download ID to the component's parameters before trying to upgrade to the latest release. The upgrade button will remain disabled until you do that."
; LIVEUPDATE_HASUPDATES_HEAD="A new version is available"
; LIVEUPDATE_NOUPDATES_HEAD="You already have the latest version"
; LIVEUPDATE_CURRENTVERSION="Installed version"
; LIVEUPDATE_LATESTVERSION="Latest version"
; LIVEUPDATE_LATESTRELEASED="Latest release date"
; LIVEUPDATE_DOWNLOADURL="Direct download URL"

; LIVEUPDATE_REFRESH_INFO="Refresh update information"
; LIVEUPDATE_DO_UPDATE="Update to the latest version"

; LIVEUPDATE_FTP_REQUIRED="Live Update determined that it needs to use FTP in order to download and install your update, but you have not saved your FTP login information in your Joomla! Global Configuration.<br/><br/>Please provide the FTP username and password below to proceed with the update."
; LIVEUPDATE_FTP="FTP Information"
; LIVEUPDATE_FTPUSERNAME="FTP Username"
; LIVEUPDATE_FTPPASSWORD="FTP Password"
; LIVEUPDATE_DOWNLOAD_AND_INSTALL="Download and install update"

; LIVEUPDATE_DOWNLOAD_FAILED="Downloading the update package failed. Make sure that your temp-directory is writable or that you have enabled Joomla!'s FTP options in your site's Global Configuration."
; LIVEUPDATE_EXTRACT_FAILED="Extracting the update package failed. Please try updating the extension manually."

; LIVEUPDATE_INVALID_PACKAGE_TYPE="Invalid package type. The update can not proceed."
; LIVEUPDATE_INSTALLEXT="Install %s %s"
; LIVEUPDATE_ERROR="Error"
; LIVEUPDATE_SUCCESS="Success"

; LIVEUPDATE_ICON_UNSUPPORTED="Live Update not supported"
; LIVEUPDATE_ICON_CRASHED="Live Update crashed"
; LIVEUPDATE_ICON_CURRENT="You have the latest version"
; LIVEUPDATE_ICON_UPDATES="UPDATE FOUND! CLICK TO UPDATE."

; LIVEUPDATE_RELEASEINFO="Information"
; LIVEUPDATE_RELEASENOTES="Release notes"
; LIVEUPDATE_READMOREINFO="Read more"

; LIVEUPDATE_NAGSCREEN_HEAD="WARNING! You are about to install an unstable version."
; LIVEUPDATE_NAGSCREEN_BODY="You are about to install an unstable version (%s - %s). Unstable versions may have undergone minimal or no testing and contain bugs which may have an serious adverse to the stability and functionality of your web site. If you are not sure about what you are about to do, please close this browser window. If you are absolutely certain you understand the risks involved with the installation of unstable releases, please click the button below to continue the installation of this unstable release."
; LIVEUPDATE_NAGSCREEN_BUTTON="I understand the risks. Continue with the installation."

; LIVEUPDATE_STABILITY_ALPHA="Alpha"
; LIVEUPDATE_STABILITY_BETA="Beta"
; LIVEUPDATE_STABILITY_RC="RC"
; LIVEUPDATE_STABILITY_STABLE="Stable"
; LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/uk-UA/uk-UA.liveupdate.ini000060400000013750152453623450021770 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="Live Update"

LIVEUPDATE_NOTSUPPORTED_HEAD="Live Update не підтримується на цьому сервері"
LIVEUPDATE_NOTSUPPORTED_INFO="Ваш сервер сигналізує, що Live Update не підтримується. Будь ласка, зв’яжіться з вашим постачальником послуг хостингу і попросіть його ввімкнути розширення PHP cURL або активувати пакувальники URL fopen(). Якщо вони вже ввімкнені, будь ласка, попросіть його сконфігурувати  мережеві екрани так, щоб вони дозволяли доступ до цих URL:"_QQ_""
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Ви можете завжди оновити <var>%s</var> відвідавши наш сайт персонально, завантажити останній випуск та встановити його, використовуючи інсталятор розширень Joomla!."

LIVEUPDATE_STUCK_HEAD="Live Update позначив себе таким, що зазнав краху"
LIVEUPDATE_STUCK_INFO="Live Update визначив, що він зазнав краху останнього разу, коли намагався зв’язатися з сервером оновлень. Це зазвичай означає, що хост активно блокує комунікацію з зовнішніми сайтами. Якщо ви ви захочете спробувати знову отримати інформацію про оновлення, будь ласка, натисніть на кнопку "_QQ_"Оновити інформацію "_QQ_" нижче. Якщо це видасть пусту сторінку, будь ласка, зв’яжіться з постачальником послуг хостингу і опишіть цю проблему."

LIVEUPDATE_ERROR_NEEDSAUTH="Ви повинні надати ваше ім’я користувача/пароль або ID завантаження в параметрах компоненту перед тим, як намагатися оновитися до останнього випуску. Кнопка оновлення буде залишатися неактивною, доки ви цього не зробите."
LIVEUPDATE_HASUPDATES_HEAD="Доступна нова версія"
LIVEUPDATE_NOUPDATES_HEAD="У вас уже встановлена остання версія"
LIVEUPDATE_CURRENTVERSION="Встановлена версія"
LIVEUPDATE_LATESTVERSION="Остання версія"
LIVEUPDATE_LATESTRELEASED="Дата останнього випуску"
LIVEUPDATE_DOWNLOADURL="URL для безпосереднього завантаження"

LIVEUPDATE_REFRESH_INFO="Оновити інформацію"
LIVEUPDATE_DO_UPDATE="Оновити до останньої версії"

LIVEUPDATE_FTP_REQUIRED="Live Update визначив, що йому потрібно використовувати FTP для завантаження та встановлення вашого оновлення, але ви не зберегли  інформацію вашого логіну FTP на сторінці Загальної Конфігурації Joomla! .<br/><br/>Будь ласка, надайте ім’я користувача і пароль FTP нижче, щоб продовжити процес оновлення."
LIVEUPDATE_FTP="Інформація FTP"
LIVEUPDATE_FTPUSERNAME="Ім’я користувача FTP"
LIVEUPDATE_FTPPASSWORD="Пароль FTP"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="Завантажити і встановити оновлення"

LIVEUPDATE_DOWNLOAD_FAILED="Завантаження пакету оновлень не вдалося. Переконайтесь, що ваш тимчасовий каталог доступний для запису або що ви ввімкнули налаштування FTP в Загальній Конфігурації Joomla!."
LIVEUPDATE_EXTRACT_FAILED="Видобування пакету оновлень не вдалося. Будь ласка, спробуйте оновити розширення вручну."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Неправильний тип пакету. Оновлення не може бути продовжено."
LIVEUPDATE_INSTALLEXT="Встановлення %s %s"
LIVEUPDATE_ERROR="Помилка"
LIVEUPDATE_SUCCESS="Успішно"

LIVEUPDATE_ICON_UNSUPPORTED="Live Update не підтримується"
LIVEUPDATE_ICON_CRASHED="Live Update зазнало краху"
LIVEUPDATE_ICON_CURRENT="У вас остання версія"
LIVEUPDATE_ICON_UPDATES="ЗНАЙДЕНО ОНОВЛЕННЯ! НАТИСНІТЬ ДЛЯ ЗАПУСКУ ОНОВЛЕННЯ."

; LIVEUPDATE_RELEASEINFO="Information"
; LIVEUPDATE_RELEASENOTES="Release notes"
; LIVEUPDATE_READMOREINFO="Read more"

; LIVEUPDATE_NAGSCREEN_HEAD="WARNING! You are about to install an unstable version."
; LIVEUPDATE_NAGSCREEN_BODY="You are about to install an unstable version (%s - %s). Unstable versions may have undergone minimal or no testing and contain bugs which may have an serious adverse to the stability and functionality of your web site. If you are not sure about what you are about to do, please close this browser window. If you are absolutely certain you understand the risks involved with the installation of unstable releases, please click the button below to continue the installation of this unstable release."
; LIVEUPDATE_NAGSCREEN_BUTTON="I understand the risks. Continue with the installation."

; LIVEUPDATE_STABILITY_ALPHA="Alpha"
; LIVEUPDATE_STABILITY_BETA="Beta"
; LIVEUPDATE_STABILITY_RC="RC"
; LIVEUPDATE_STABILITY_STABLE="Stable"
; LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/hu-HU/hu-HU.liveupdate.ini000060400000010533152453623450021774 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="Live Update"

LIVEUPDATE_NOTSUPPORTED_HEAD="Ez a szerver nem támogatja a Live Update-ot"
LIVEUPDATE_NOTSUPPORTED_INFO="A szerver nem támogatja a Live Update-et. Lépj kapcsolatba a szolgáltatóddal és kérd a cURL PHP bővítmény vagy az URL fopen() aktiválását. Ha ezek már engedélyezve vannak, akkor kérd meg őket, hogy úgy állítsák be a tűzfalukat, hogy hozzáférhető legyen a következő URL:"_QQ_""
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Bármikor frissítheted a(z) <var>%s</var> úgy, hogy meglátogatod a webhelyünket, letöltöd a legfrissebb verziót és a Joomla! bővítmény telepítőjével felrakod."

LIVEUPDATE_STUCK_HEAD="A saját jelzése szerint a Live Update összeomlott"
LIVEUPDATE_STUCK_INFO="Az utolsó használat során a Live Update összeomlott amikor kapcsolatot próbált létesíteni a frissítő szerverrel. Ez általában azt jelzi, hogy a szolgáltató aktívan blokkolja a külső webhelyekkel való kommunikációt. Ha meg akarod ismételni a frissítési információk lekérését, akkor kattints alul a "_QQ_"Frissítési információk újra letöltése"_QQ_" gombra. Ha ez üres oldalt eredményez, akkor lépj kapcsolatba a szolgáltatóddal és jelezd nekik ezt a problémát"

LIVEUPDATE_ERROR_NEEDSAUTH="Mielőtt frissíteni szeretnél, meg kell adnod a felhasználói neved/jelszavad vagy a letöltési AZ-t a komponens paraméterekben. A frissítés gomb addig nem lesz aktív, amíg ezeket nem adod meg."
LIVEUPDATE_HASUPDATES_HEAD="Elérhető az új verzió"
LIVEUPDATE_NOUPDATES_HEAD="Már a legújabb verzióval rendelkezel"
LIVEUPDATE_CURRENTVERSION="Telepített verzió"
LIVEUPDATE_LATESTVERSION="Legújabb verzió"
LIVEUPDATE_LATESTRELEASED="A legújabb verzió kiadási időpontja"
LIVEUPDATE_DOWNLOADURL="Direkt letöltési URL"

LIVEUPDATE_REFRESH_INFO="Frissítési információk újratöltése"
LIVEUPDATE_DO_UPDATE="Frissítés a legújabb verzióra"

LIVEUPDATE_FTP_REQUIRED="A Live Update-nek szüksége van az FTP használatára, hogy le tudja tölteni és feltelepíteni a frissítést, de te nem adtál meg FTP elérési adatokat a Joomla! globális beállításaiban.<br/><br/>Kérjük, hogy add meg az FTP felhasználói nevet és jelszót, hogy folytatni lehessen a frissítést."
LIVEUPDATE_FTP="FTP információk"
LIVEUPDATE_FTPUSERNAME="FTP felhasználói név"
LIVEUPDATE_FTPPASSWORD="FTP jelszó"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="A frissítés letöltése és telepítése"

LIVEUPDATE_DOWNLOAD_FAILED="A frissítési csomag letöltése sikertelen. Ellenőrizd az átmeneti (temp) könyvtár írhatóságát vagy a globális beállításoknál engedélyezd a Joomla! FTP feltöltést."
LIVEUPDATE_EXTRACT_FAILED="A frissítési csomag kitömörítése sikertelen. Kérjük, hogy a frissítést próbáld meg manuális módban."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Hibás csomagtípus. A frissítés nem folytatható."
LIVEUPDATE_INSTALLEXT="Telepítés %s %s"
LIVEUPDATE_ERROR="Hiba"
LIVEUPDATE_SUCCESS="Sikeres"

LIVEUPDATE_ICON_UNSUPPORTED="A Live Update nem támogatott"
LIVEUPDATE_ICON_CRASHED="A Live Update összeomlott"
LIVEUPDATE_ICON_CURRENT="A legfrissebb verzióval rendelkezel"
LIVEUPDATE_ICON_UPDATES="FRISSÍTÉST TALÁLTAM! KATTINTS IDE."

LIVEUPDATE_RELEASEINFO="Információk"
LIVEUPDATE_RELEASENOTES="Kiadási megjegyzések"
LIVEUPDATE_READMOREINFO="Bővebben"

; LIVEUPDATE_NAGSCREEN_HEAD="WARNING! You are about to install an unstable version."
; LIVEUPDATE_NAGSCREEN_BODY="You are about to install an unstable version (%s - %s). Unstable versions may have undergone minimal or no testing and contain bugs which may have an serious adverse to the stability and functionality of your web site. If you are not sure about what you are about to do, please close this browser window. If you are absolutely certain you understand the risks involved with the installation of unstable releases, please click the button below to continue the installation of this unstable release."
; LIVEUPDATE_NAGSCREEN_BUTTON="I understand the risks. Continue with the installation."

; LIVEUPDATE_STABILITY_ALPHA="Alpha"
; LIVEUPDATE_STABILITY_BETA="Beta"
; LIVEUPDATE_STABILITY_RC="RC"
; LIVEUPDATE_STABILITY_STABLE="Stable"
; LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/en-GB/en-GB.liveupdate.ini000060400000007724152453623450021710 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="Live Update"

LIVEUPDATE_NOTSUPPORTED_HEAD="Live Update is not supported on this server"
LIVEUPDATE_NOTSUPPORTED_INFO="Your server indicates that Live Update is not supported. Please contact your host and ask them to enable the cURL PHP extension or activate the URL fopen() wrappers. If these are already enabled, please ask them to configure their firewall so that it allows access to the following URL:"
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="You can always update <var>%s</var> by visiting our site manually, downloading the latest release and installing it using Joomla!'s extension installer."

LIVEUPDATE_STUCK_HEAD="Live Update has marked itself as crashed"
LIVEUPDATE_STUCK_INFO="Live Update determined that it crashed the last time it tried to contact the update server. This usually indicates a host which actively blocks communications with external sites. If you would like to retry fetching the update information, please click the "_QQ_"Refresh update information"_QQ_" button below. If that results to a blank page, please contact your host and report this issue."

LIVEUPDATE_ERROR_NEEDSAUTH="You have to supply your username/password or Download ID to the component's parameters before trying to upgrade to the latest release. The upgrade button will remain disabled until you do that."
LIVEUPDATE_HASUPDATES_HEAD="A new version is available"
LIVEUPDATE_NOUPDATES_HEAD="You already have the latest version"
LIVEUPDATE_CURRENTVERSION="Installed version"
LIVEUPDATE_LATESTVERSION="Latest version"
LIVEUPDATE_LATESTRELEASED="Latest release date"
LIVEUPDATE_DOWNLOADURL="Direct download URL"

LIVEUPDATE_REFRESH_INFO="Refresh update information"
LIVEUPDATE_DO_UPDATE="Update to the latest version"

LIVEUPDATE_FTP_REQUIRED="Live Update determined that it needs to use FTP in order to download and install your update, but you have not saved your FTP login information in your Joomla! Global Configuration.<br/><br/>Please provide the FTP username and password below to proceed with the update."
LIVEUPDATE_FTP="FTP Information"
LIVEUPDATE_FTPUSERNAME="FTP Username"
LIVEUPDATE_FTPPASSWORD="FTP Password"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="Download and install update"

LIVEUPDATE_DOWNLOAD_FAILED="Downloading the update package failed. Make sure that your temp-directory is writable or that you have enabled Joomla!'s FTP options in your site's Global Configuration."
LIVEUPDATE_EXTRACT_FAILED="Extracting the update package failed. Please try updating the extension manually."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Invalid package type. The update can not proceed."
LIVEUPDATE_INSTALLEXT="Install %s %s"
LIVEUPDATE_ERROR="Error"
LIVEUPDATE_SUCCESS="Success"

LIVEUPDATE_ICON_UNSUPPORTED="Live Update not supported"
LIVEUPDATE_ICON_CRASHED="Live Update crashed"
LIVEUPDATE_ICON_CURRENT="You have the latest version"
LIVEUPDATE_ICON_UPDATES="UPDATE FOUND! CLICK TO UPDATE."

LIVEUPDATE_RELEASEINFO="Information"
LIVEUPDATE_RELEASENOTES="Release notes"
LIVEUPDATE_READMOREINFO="Read more"

LIVEUPDATE_NAGSCREEN_HEAD="WARNING! You are about to install an unstable version."
LIVEUPDATE_NAGSCREEN_BODY="You are about to install an unstable version (%s - %s). Unstable versions may have undergone minimal or no testing and contain bugs which may have an adverse effect to the stability and functionality of your web site. If you are not sure about what you are about to do, please close this browser window. If you are absolutely certain you understand the risks involved with the installation of unstable releases, please click the button below to continue the installation of this unstable release."
LIVEUPDATE_NAGSCREEN_BUTTON="I understand the risks. Continue with the installation."

LIVEUPDATE_STABILITY_ALPHA="Alpha"
LIVEUPDATE_STABILITY_BETA="Beta"
LIVEUPDATE_STABILITY_RC="RC"
LIVEUPDATE_STABILITY_STABLE="Stable"
LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/bs-BA/bs-BA.liveupdate.ini000060400000010270152453623450021666 0ustar00; Akeeba Live Update
; Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>

LIVEUPDATE_TASK_OVERVIEW="Nadogradnja uživo"

LIVEUPDATE_NOTSUPPORTED_HEAD="Nadogradnaj uživo nije podržana na ovo serveru"
LIVEUPDATE_NOTSUPPORTED_INFO="Vaš server ukazuje da Nadogradnja uživo nije podržana. Molimo kontaktirajte vaš host i pitajte da omoguće cURL PHP ekstenziju ili aktiviraju URL fopen() omotače. Ako su ove već omogućene, molimo da ih pitate da podese vatreni zid kako bi dozvolio pristup sljedećem URL-u:"
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Možete uvijek nadograditi <var>%s</var> tako što će te ručno posjetiti našu stanicu, gdje možete preuzeti posljednje izdanje i instalirati upotrebom Joomla! instalera za ekstenzije."

LIVEUPDATE_STUCK_HEAD="Nadogradnja uživo se označila kao srušena"
LIVEUPDATE_STUCK_INFO="Nadogradnja uživo je odredila da se srušila posljednji put pri pokušaju da kontaktira server za nadogradnu. Ovo pretežno ukazuje na host koji aktivno blokira komunikaciju sa eksternim stranicama. Ako želite pokušati povući informacije o nadogradnji, molimo kliknite na "_QQ_"Osvježi informacije o nadogradnji"_QQ_" dugme ispod. Ako to rezultira sa praznom stranicom, molimo kontaktirajte svoj host i prijavite ovaj problem."

LIVEUPDATE_ERROR_NEEDSAUTH="Morate obezbijediti vaše korisničko ime/šifru ili ID za preuzimanje na parametre komponente prije pokušavanja nadogradnej na zadnje izdanje. Dugme za nadogradnju će ostati isključeno sve dok to ne učinite."
LIVEUPDATE_HASUPDATES_HEAD="Dostupna je nova verzija"
LIVEUPDATE_NOUPDATES_HEAD="Već posjedujete posljednju verziju"
LIVEUPDATE_CURRENTVERSION="Instalirana verzija"
LIVEUPDATE_LATESTVERSION="Posljednja verzija"
LIVEUPDATE_LATESTRELEASED="Datum posljednjeg izdanja"
LIVEUPDATE_DOWNLOADURL="Direktan URL za preuzimanje"

LIVEUPDATE_REFRESH_INFO="Osvježi informacije o nadogradnji"
LIVEUPDATE_DO_UPDATE="Nadogradi na posljednju verziju"

LIVEUPDATE_FTP_REQUIRED="Nadogradnja uživo je odredila da je potrebna upotreba FTP-a kako bi se preuzela i instalirala vaša nadogradnja, ali niste snimili vaše FTP informacije za prijavu u Joomla! globalnoj konfiguraciji.<br/><br/>Molimo da obezbjedite FTP korisničko ime i šifru ispod kako bi nastavili sa nadogradnjom."
LIVEUPDATE_FTP="FTP informacija"
LIVEUPDATE_FTPUSERNAME="FTP korisničko ime"
LIVEUPDATE_FTPPASSWORD="FTP šifra"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="Preuzmi i instaliraj nadogradnju"

LIVEUPDATE_DOWNLOAD_FAILED="Preuzimanje paketa nadogradnje je neuspješno. Provjerite da li je vaš privremeni direktorij zapisiv ili da li imate uključene Joomla! FTP opcije na vašoj globalnoj konfiguraciji za stranicu."
LIVEUPDATE_EXTRACT_FAILED="Otpakivanje paketa nadogradnje neuspješno. Molimo da pokušate ručno nadograditi ekstenziju."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Nevažeći tip paketa. Nadogradnja se ne može nastaviti."
LIVEUPDATE_INSTALLEXT="Instaliraj %s %s"
LIVEUPDATE_ERROR="Greška"
LIVEUPDATE_SUCCESS="Uspjeh"

LIVEUPDATE_ICON_UNSUPPORTED="Nadogradnja uživo nije podržana"
LIVEUPDATE_ICON_CRASHED="Nadogradnja uživo se srušila"
LIVEUPDATE_ICON_CURRENT="Posjedujete posljednju verziju"
LIVEUPDATE_ICON_UPDATES="NADOGRADNJA PRONAĐENA! KLIKNITE ZA NADOGRADNJU."

LIVEUPDATE_RELEASEINFO="Informacije"
LIVEUPDATE_RELEASENOTES="Obavijesti o izdanju"
LIVEUPDATE_READMOREINFO="Pročitaj više"

LIVEUPDATE_NAGSCREEN_HEAD="UPOZORENJE! Upravo će te instalirati nestabilnu verziju."
LIVEUPDATE_NAGSCREEN_BODY="Upravo će te instalirati nestabilnu verziju (%s - %s). Nestabilne verzije su prošle minimalno ili nikakvo testiranje i sadrže greške koje štete stabilnosti i funkcionalnosti vaše web-stranice. Ako niste sigurno šta će te raditi, molimo da zatvorite prozor preglednika. Ako se potpuno sigurni da razumijete rizike uključene za instalacijom nestabilnih izdanja, molimo da kliknete dugme ispod kako bi nastavili instalaciju ovog nestabilnog izdanja."
LIVEUPDATE_NAGSCREEN_BUTTON="Razumijem rizike. Nastavi sa instalacijom."

LIVEUPDATE_STABILITY_ALPHA="Alfa"
LIVEUPDATE_STABILITY_BETA="Beta"
LIVEUPDATE_STABILITY_RC="RC"
LIVEUPDATE_STABILITY_STABLE="Stabilna"
LIVEUPDATE_STABILITY_SVN="SVN"components/com_icagenda/liveupdate/language/fr-FR/fr-FR.liveupdate.ini000060400000015002152453623450021744 0ustar00; Akeeba Live Update
; Copyright (c)2010-2012 Nicholas K. Dionysopoulos / AkeebaBackup.com
; Licensed under the GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>
;
; ADMIN [com_icagenda/liveupdate]	: liveupdate.ini
; Translation on Transifex			: https://www.transifex.com/projects/p/icagenda/
; iCagenda Version					: Copyright (c) 2013 JoomliC.com


LIVEUPDATE_TASK_OVERVIEW="Live Update"

LIVEUPDATE_NOTSUPPORTED_HEAD="Live Update n'est pas pris en charge sur ce serveur"
LIVEUPDATE_NOTSUPPORTED_INFO="Votre serveur indique que Live Update n'est pas supporté. Veuillez contactez votre hébergeur et lui demander d'activer l'extension PHP cURL ou activer la fonction fopen URL (). Si ceux-ci sont déjà activés, veuillez lui demander d'adapter le pare-feu pour qu'il autorise l'accès à l'URL suivante:";
LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Vous pouvez toujours mettre à jour <var>%s</ var> à partir de notre site internet, après avoir télécharger la dernière version et effectuer son installation via la gestion des extensions de Joomla!"

LIVEUPDATE_STUCK_HEAD="Live Update a échoué !"
LIVEUPDATE_STUCK_INFO="Live Update a échoué la dernière fois qu'il a essayé de se connecter au serveur de mise à jour. Cela signifie généralement que votre hébergeur bloque activement les communications avec des sites externes. Si vous souhaitez réessayer de récupérer les informations de mise à jour, cliquez sur le bouton " Rafraichir les informations de mise à jour ". S'il en résulte une page blanche, veuillez contactez votre hébergeur et lui signaler ce problème."

LIVEUPDATE_ERROR_NEEDSAUTH="Pour activer le bouton de mise à jour, vous devez indiquer vos identifiant/mot de passe ou votre Download ID dans les paramètres du composant. Le bouton de mise à niveau restera désactivé jusqu'à ce que vous le faites."
LIVEUPDATE_HASUPDATES_HEAD="Une nouvelle version est disponible"
LIVEUPDATE_NOUPDATES_HEAD="Vous avez la dernière version"
LIVEUPDATE_CURRENTVERSION="Version installée"
LIVEUPDATE_LATESTVERSION="Dernière version"
LIVEUPDATE_LATESTRELEASED="Date de la dernière version "
LIVEUPDATE_DOWNLOADURL="URL de téléchargement direct"

LIVEUPDATE_REFRESH_INFO="Rafraîchir les informations de mise à jour"
LIVEUPDATE_DO_UPDATE="Mettre à jour vers la dernière version"

LIVEUPDATE_FTP_REQUIRED="Live Update a besoin d'utiliser la couche FTP pour télécharger et installer la mise à jour, mais vous n'avez pas sauvegardé vos informations de connexion FTP dans la 'Configuration' de Joomla!<br/><br/>Veuillez fournir ci-dessous votre nom d'utilisateur et votre mot de passe FTP afin de procéder à la mise à jour."
LIVEUPDATE_FTP="Informations FTP"
LIVEUPDATE_FTPUSERNAME="Nom d'utilisateur FTP"
LIVEUPDATE_FTPPASSWORD="Mot de passe FTP"
LIVEUPDATE_DOWNLOAD_AND_INSTALL="Télécharger et installer la mise à jour"

LIVEUPDATE_DOWNLOAD_FAILED="Le téléchargement du package de mise à jour a échoué. Assurez-vous que votre répertoire temporaire (tmp) est accessible en écriture et que vous avez activé les options FTP dans la configuration globale de Joomla!."
LIVEUPDATE_EXTRACT_FAILED="L'extraction du package de mise à jour a échoué. Veuillez mettre à jour l'extension manuellement."

LIVEUPDATE_INVALID_PACKAGE_TYPE="Le type du package n'est pas valide. La mise à jour ne peut pas être effectuée."
LIVEUPDATE_INSTALLEXT="Installation %s %s"
LIVEUPDATE_ERROR="Erreur"
LIVEUPDATE_SUCCESS="effectuée avec succès"

; Added iCagenda
LIVEUPDATE_INSTALL_ERROR="Erreur à l'installation %s"
LIVEUPDATE_INSTALL_SUCCESS="Installation %s effectuée avec succès."
LIVEUPDATE_INSTALL_TYPE_COMPONENT="du composant iCagenda"
LIVEUPDATE_INSTALL_TYPE_FILE="du fichier"
LIVEUPDATE_INSTALL_TYPE_LANGUAGE="de la langue"
LIVEUPDATE_INSTALL_TYPE_LIBRARY="de la bibliothèque"
LIVEUPDATE_INSTALL_TYPE_MODULE="du module"
LIVEUPDATE_INSTALL_TYPE_PACKAGE="du paquet"
LIVEUPDATE_INSTALL_TYPE_PLUGIN="du plug-in"
LIVEUPDATE_INSTALL_TYPE_TEMPLATE="du template"

LIVEUPDATE_ICON_UNSUPPORTED="Live Update n'est pas pris en charge"
LIVEUPDATE_ICON_CRASHED="Live Update a échoué!"
LIVEUPDATE_ICON_CURRENT="Vous avez la dernière version"
LIVEUPDATE_ICON_UPDATES="Mise à jour disponible! Cliquez pour mettre à jour."

LIVEUPDATE_RELEASEINFO="Informations"
LIVEUPDATE_RELEASENOTES="Notes de version"
LIVEUPDATE_READMOREINFO="Plus d'infos"

LIVEUPDATE_NAGSCREEN_HEAD="ATTENTION! Vous êtes sur le point d'installer une version instable."
LIVEUPDATE_NAGSCREEN_BODY="Vous êtes sur le point d'installer une version dite instable (%s - %s). Les versions instables sont des versions ayant subi peu de tests, voir aucun, et qui peuvent contenir des bugs avec une conséquence importante sur la stabilité et la fonctionnalité de votre site internet. Si vous n'êtes pas sûr de ce que vous êtes sur le point de faire, merci de fermer cette fenêtre et de revenir en arrière. Si vous comprenez parfaitement les risques liés à l'utilisation d'une version instable, vous pouvez cliquer sur le bouton ci-dessous pour continuer l'installation de cette version."
LIVEUPDATE_NAGSCREEN_BUTTON="Je comprends les risques. Poursuivre l'installation."

LIVEUPDATE_STABILITY_ALPHA="Alpha"
LIVEUPDATE_STABILITY_BETA="Bêta"
LIVEUPDATE_STABILITY_RC="RC"
LIVEUPDATE_STABILITY_STABLE="Stable"

; Added iCagenda
LIVEUPDATE_ERROR_NEEDS_PRO_ID="Pour activer le bouton de mise à jour, vous devez indiquer dans les paramètres d'iCagenda votre licence Pro ID de mise à jour."
LIVEUPDATE_NAGSCREEN_HEAD_ICAGENDA = "ATTENTION! Vous êtes sur le point d'installer une version beta-test d'iCagenda."
LIVEUPDATE_NAGSCREEN_VERSION_ICAGENDA = "Version de test et de développement(iCagenda %s - %s)."
LIVEUPDATE_NAGSCREEN_BODY_ICAGENDA = "Le cycle de vie d'une version d'un logiciel est la somme des phases de développement, de tests et de maturité.<br/><b>Alpha :</b>peut être instable et peut causer des accidents ou des pertes de données.<br/><b>Beta :</b>a généralement plus de bugs que le logiciel terminée, cette version est destinée aux sites de tests uniquement.<br/><b>RC (Release Candidate) :</b> version bêta avec le potentiel pour être un produit final, qui est prête à être libérée à moins que des bugs importants émergent.<br/>Si vous n'êtes pas sûr de ce que vous êtes sur le point de faire, merci de fermer cette fenêtre et de revenir en arrière. Si vous êtes absolument certain que vous comprenez les risques liés à l'installation des versions instables, vous pouvez cliquer sur le bouton ci-dessous pour continuer l'installation de cette version.<br/>"
LIVEUPDATE_NAGSCREEN_FOOTER_ICAGENDA = "info:"
components/com_icagenda/liveupdate/LICENSE.txt000060400000020215152453623450015314 0ustar00==============================================================================
Akeeba Live Update - One-click updates for Joomla! extensions
Copyright ©2011 Nicholas K. Dionysopoulos / AkeebaBackup.com

Live Update is a sub-component to assist you in providing one-click updates
for your Joomla! 1.5 and Joomla! 1.6 extensions. It is licensed under the
GNU Lesser General Public License version 3 or, at your option, any later
version published by the Free Software Foundation. You can use it royalty-
free in any Joomla! extension, Free or Proprietary. The full text of its
license is provided below.
==============================================================================

                   GNU LESSER GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.


  This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.

  0. Additional Definitions.

  As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.

  "The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.

  An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.

  A "Combined Work" is a work produced by combining or linking an
Application with the Library.  The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".

  The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.

  The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.

  1. Exception to Section 3 of the GNU GPL.

  You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.

  2. Conveying Modified Versions.

  If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:

   a) under this License, provided that you make a good faith effort to
   ensure that, in the event an Application does not supply the
   function or data, the facility still operates, and performs
   whatever part of its purpose remains meaningful, or

   b) under the GNU GPL, with none of the additional permissions of
   this License applicable to that copy.

  3. Object Code Incorporating Material from Library Header Files.

  The object code form of an Application may incorporate material from
a header file that is part of the Library.  You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:

   a) Give prominent notice with each copy of the object code that the
   Library is used in it and that the Library and its use are
   covered by this License.

   b) Accompany the object code with a copy of the GNU GPL and this license
   document.

  4. Combined Works.

  You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:

   a) Give prominent notice with each copy of the Combined Work that
   the Library is used in it and that the Library and its use are
   covered by this License.

   b) Accompany the Combined Work with a copy of the GNU GPL and this license
   document.

   c) For a Combined Work that displays copyright notices during
   execution, include the copyright notice for the Library among
   these notices, as well as a reference directing the user to the
   copies of the GNU GPL and this license document.

   d) Do one of the following:

       0) Convey the Minimal Corresponding Source under the terms of this
       License, and the Corresponding Application Code in a form
       suitable for, and under terms that permit, the user to
       recombine or relink the Application with a modified version of
       the Linked Version to produce a modified Combined Work, in the
       manner specified by section 6 of the GNU GPL for conveying
       Corresponding Source.

       1) Use a suitable shared library mechanism for linking with the
       Library.  A suitable mechanism is one that (a) uses at run time
       a copy of the Library already present on the user's computer
       system, and (b) will operate properly with a modified version
       of the Library that is interface-compatible with the Linked
       Version.

   e) Provide Installation Information, but only if you would otherwise
   be required to provide such information under section 6 of the
   GNU GPL, and only to the extent that such information is
   necessary to install and execute a modified version of the
   Combined Work produced by recombining or relinking the
   Application with a modified version of the Linked Version. (If
   you use option 4d0, the Installation Information must accompany
   the Minimal Corresponding Source and Corresponding Application
   Code. If you use option 4d1, you must provide the Installation
   Information in the manner specified by section 6 of the GNU GPL
   for conveying Corresponding Source.)

  5. Combined Libraries.

  You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:

   a) Accompany the combined library with a copy of the same work based
   on the Library, uncombined with any other library facilities,
   conveyed under the terms of this License.

   b) Give prominent notice with the combined library that part of it
   is a work based on the Library, and explaining where to find the
   accompanying uncombined form of the same work.

  6. Revised Versions of the GNU Lesser General Public License.

  The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser 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
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.

  If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.components/com_icagenda/liveupdate/classes/abstractconfig.php000060400000022555152453623450020641 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 *
 * @package LiveUpdate 2.1.5 - 2.2.1
 * @copyright Copyright (c)2010-2012 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>
 *
 * @version     3.4.0.1 2014-12-25
 * @since       1.2.6
 *
 * ADDED (3.3.6)			: option for min_stability in getMinimumStability()
 * CHANGED (3.4.0-alpha2)	: option for updateURL in getUpdateURL() (set updateURL depending on getMinimumStability())
 * ADDED (3.4.0-alpha2)		: Own server for Testing Updates (Alpha & Beta)
 * ADDED (3.4.0)			: filter getAuthorization()
 */

defined('_JEXEC') or die();

/**
 * This is the base class inherited by the config.php file in LiveUpdate's root.
 * You may override it non-final members to customise its behaviour.
 * @author Nicholas K. Dionysopoulos <nicholas@akeebabackup.com>
 *
 */
abstract class LiveUpdateAbstractConfig extends JObject
{
	/** @var string The extension name, e.g. com_foobar, plg_foobar, mod_foobar, tpl_foobar etc */
	protected $_extensionName = 'com_icagenda';
	/** @var string The human-readable name of your extension */
	protected $_extensionTitle = 'iCagenda - Events Management Extension for Joomla!';
	/**
	 * The filename of the XML manifest of your extension. Leave blank to use extensionname.xml. For example,
	 * if the extension is com_foobar, it will look for com_foobar.xml and foobar.xml in the component's
	 * directory.
	 * @var string
	 * */
	protected $_xmlFilename = '';

	/** @var string The information storage adapter to use. Can be 'file' or 'component' */
	protected $_storageAdapter = 'file';
	/** @var array The configuration options for the storage adapter used */
	protected $_storageConfig = array('path' => JPATH_CACHE);
	/**
	 * How to determine if a new version is available. 'different' = if the version number is different,
	 * the remote version is newer, 'vcompare' = use version compare between the two versions, 'newest' =
	 * compare the release dates to find the newest. I suggest using 'different' on most cases.
	 * @var string
	 */
	protected $_versionStrategy = 'different';

	/** @var The current version of your extension. Populated automatically from the XML manifest. */
	protected $_currentVersion = '';
	/** @var The current release date of your extension. Populated automatically from the XML manifest. */
	protected $_currentReleaseDate = '';

	/** @var string The URL to the INI update stream of this extension */
	protected $_updateURL = '';
	/** @var bool Does the download URL require authorization to download the package? */
	protected $_requiresAuthorization = false;

	/** @var string The username to authorize a download on your site */
	protected $_username = '';
	/** @var string The password to authorize a download on your site */
	protected $_password = '';
	/** @var string The Download ID to authorize a download on your site; use it instead of the username/password pair */
	protected $_downloadID = '';

	/** @var string The path to a local copy of cacert.pem, required if you plan on using HTTPS URLs to fetch live udpate information or download files from */
	protected $_cacerts = null;

	/** @var string The minimum stability level to report as available update. One of alpha, beta, rc and stable. */
	protected $_minStability = 'stable';

	/**
	 * Singleton implementation
	 * @return LiveUpdateConfig An instance of the Live Update configuration class
	 */
	public static function &getInstance()
	{
		static $instance = null;

		if(!is_object($instance)) {
			$instance = new LiveUpdateConfig();
		}

		return $instance;
	}

	/**
	 * Public constructor. It populates all extension-specific fields. Override to your liking if necessary.
	 */
	public function __construct()
	{
		parent::__construct();
		$this->populateExtensionInfo();
		$this->populateAuthorization();
	}

	/**
	 * Returns the URL to the update INI stream. By default it returns the value to
	 * the protected $_updateURL property of the class. Override with your implementation
	 * if you want to modify its logic.
	 */
	public function getUpdateURL()
	{
		$minStability = self::getMinimumStability();

		switch($minStability) {
			case 'alpha':
			default:
				// Reports any stability level as an available update
				$ic_updateURL = 'http://pro.joomlic.com/index.php?option=com_ars&view=update&format=ini&id=2';
				break;

//			case 'beta':
				// Do not report alphas as available updates
//				if(in_array($stability, array('alpha'))) return 0;
//				break;

			case 'rc':
				// Do not report alphas and betas as available updates
				$ic_updateURL = 'http://pro.joomlic.com/index.php?option=com_ars&view=update&format=ini&id=1';
				break;

			case 'stable':
				// Do not report alphas, betas and rcs as available updates
				$ic_updateURL = 'http://pro.joomlic.com/index.php?option=com_ars&view=update&format=ini&id=1';
				break;
		}


		return $ic_updateURL;
//		return $this->_updateURL;
	}

	/**
	 * Override this ethod to load customized CSS and media files instead of the stock
	 * CSS and media provided by Live Update. If you override this class it MUST return
	 * true, otherwise LiveUpdate's CSS will be loaded after yours and will override your
	 * settings.
	 *
	 * @return bool Return true to stop Live Update from loading its own CSS files.
	 */
	public function addMedia()
	{
		return false;
	}

	/**
	 * Gets the authorization string to append to the download URL. It returns either the
	 * download ID or username/password pair. Please override the class constructor, not
	 * this method, if you want to fetch these values.
	 */
	public final function getAuthorization()
	{
		if (!empty($this->_downloadID))
		{
			return "dlid=".urlencode($this->_downloadID);
		}
		elseif (!empty($this->_username) && !empty($this->_password))
		{
			$_pass = str_replace('/', '.', $this->_password);
			$pass_ex = explode('.', $_pass);

			if (isset($pass_ex[1]))
			{
				$password = base64_decode($pass_ex[1]);
			}
			else
			{
				$password = $this->_password;
			}

			return "username=".urlencode($this->_username)."&password=".urlencode($password);
		}

		return "";
	}

	public final function requiresAuthorization()
	{
		return $this->_requiresAuthorization;
	}

	/**
	 * Returns all the information we have about the extension and its update preferences
	 * @return array The extension information
	 */
	public final function getExtensionInformation()
	{
		return array(
			'name'			=> $this->_extensionName,
			'title'			=> $this->_extensionTitle,
			'version'		=> $this->_currentVersion,
			'date'			=> $this->_currentReleaseDate,
//			'updateurl'		=> $this->_updateURL,
			'updateurl'		=> self::getUpdateURL(),
			'requireauth'	=> $this->_requiresAuthorization
		);
	}

	/**
	 * Returns the information regarding the storage adapter
	 * @return array
	 */
	public final function getStorageAdapterPreferences()
	{
		$config = $this->_storageConfig;
		$config['extensionName'] = $this->_extensionName;

		return array(
			'adapter'		=> $this->_storageAdapter,
			'config'		=> $config
		);
	}

	public final function getVersionStrategy()
	{
		return $this->_versionStrategy;
	}

	/**
	 * Get the current version from the XML manifest of the extension and
	 * populate the class' properties.
	 */
	private function populateExtensionInfo()
	{
		require_once dirname(__FILE__).'/xmlslurp.php';
		$xmlslurp = new LiveUpdateXMLSlurp();
		$data = $xmlslurp->getInfo($this->_extensionName, $this->_xmlFilename);
		if(empty($this->_currentVersion)) $this->_currentVersion = $data['version'];
		if(empty($this->_currentReleaseDate)) $this->_currentReleaseDate = $data['date'];
	}

	/**
	 * Fetch username/password and Download ID from the component's configuration.
	 */
	protected function populateAuthorization()
	{
		if(!$this->_requiresAuthorization) return;

		// Do we already have authorizaton information?
		if( (!empty($this->_username) && !empty($this->_password)) || !empty($this->_downloadID) ) {
			return;
		}

		if(substr($this->_extensionName,0,3) != 'com') return;

		// Not using JComponentHelper to avoid conflicts ;)
		$db = JFactory::getDbo();
		$sql = $db->getQuery(true)
			->select($db->qn('params'))
			->from($db->qn('#__extensions'))
			->where($db->qn('type').' = '.$db->q('component'))
			->where($db->qn('element').' = '.$db->q($this->_extensionName));
		$db->setQuery($sql);
		$rawparams = $db->loadResult();
		$params = new JRegistry();
		$params->loadString($rawparams, 'JSON');

		$this->_username	= $params->get('username','');
		$this->_password	= $params->get('password','');
		$this->_downloadID	= $params->get('downloadid','');
	}

	public function applyCACert(&$ch)
	{
		if(!empty($this->_cacerts)) {
			if(file_exists($this->_cacerts)) {
				@curl_setopt($ch, CURLOPT_CAINFO, $this->_cacerts);
			}
		}
	}

	public function getMinimumStability()
	{
		// Not using JComponentHelper to avoid conflicts ;)
		$db = JFactory::getDbo();
		$sql = $db->getQuery(true)
			->select($db->qn('params'))
			->from($db->qn('#__extensions'))
			->where($db->qn('type').' = '.$db->q('component'))
			->where($db->qn('element').' = '.$db->q('com_icagenda'));
		$db->setQuery($sql);
		$rawparams = $db->loadResult();
		$params = new JRegistry();
		$params->loadString($rawparams, 'JSON');

		$ic_minStability	= $params->get('min_stability','stable');

		return $ic_minStability;
	}
}
components/com_icagenda/liveupdate/classes/updatefetch.php000060400000025330152453623450020136 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 *
 * @package LiveUpdate 2.1.5 - 2.2.1
 * @copyright Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>
 *
 * @version     3.4.0.1 2014-12-25
 * @since       1.2.6
 *
 * CHANGED (3.4.0)	: Remove Duplicated Auth info at end of url
 */

defined('_JEXEC') or die();

/**
 * Fetches the update information from the server or the cache, depending on
 * whether the cache is fresh or not.
 */
class LiveUpdateFetch extends JObject
{
	private $cacheTTL = 24;

	private $storage = null;

	/**
	 * One-stop-shop function which fetches update information and tells you
	 * if there are updates available or not, or if updates are not supported.
	 *
	 * @return int 0 = no updates, 1 = updates available, -1 = updates not supported, -2 = fetching updates crashes the server
	 */
	public function hasUpdates($force = false)
	{
		$updateInfo = $this->getUpdateInformation($force);

		if($updateInfo->stuck) return -2;

		if(!$updateInfo->supported) return -1;

		$config = LiveUpdateConfig::getInstance();
		$extInfo = $config->getExtensionInformation();

		// Filter by stability level
		$minStability = $config->getMinimumStability();
		$stability = strtolower($updateInfo->stability);

		switch($minStability) {
			case 'alpha':
			default:
				// Reports any stability level as an available update
				break;

			case 'beta':
				// Do not report alphas as available updates
				if(in_array($stability, array('alpha'))) return 0;
				break;

			case 'rc':
				// Do not report alphas and betas as available updates
				if(in_array($stability, array('alpha','beta'))) return 0;
				break;

			case 'stable':
				// Do not report alphas, betas and rcs as available updates
				if(in_array($stability, array('alpha','beta','rc'))) return 0;
				break;
		}

		if(empty($updateInfo->version) && empty($updateInfo->date)) return 0;

		// Use the version strategy to determine the availability of an update
		switch($config->getVersionStrategy()) {
			case 'newest':
				JLoader::import('joomla.utilities.date');
				if(empty($extInfo)) {
					$mine = new JDate('2000-01-01 00:00:00');
				} else {
					try {
						$mine = new JDate($extInfo['date']);
					} catch(Exception $e) {
						$mine = new JDate('2000-01-01 00:00:00');
					}
				}

				$theirs = new JDate($updateInfo->date);

				return ($theirs->toUnix() > $mine->toUnix()) ? 1 : 0;
				break;

			case 'vcompare':
				$mine = $extInfo['version'];
				if(empty($mine)) $mine = '0.0.0';
				$theirs = $updateInfo->version;
				if(empty($theirs)) $theirs = '0.0.0';

				return (version_compare($theirs, $mine, 'gt')) ? 1 : 0;
				break;

			case 'different':
				$mine = $extInfo['version'];
				if(empty($mine)) $mine = '0.0.0';
				$theirs = $updateInfo->version;
				if(empty($theirs)) $theirs = '0.0.0';

				return ($theirs != $mine) ? 1 : 0;
				break;
		}
	}

	/**
	 * Get the latest version (update) information, either from the cache or
	 * from the update server.
	 *
	 * @param $force bool Set to true to force fetching fresh data from the server
	 *
	 * @return stdClass The update information, in object format
	 */
	public function getUpdateInformation($force = false)
	{
		// Get the Live Update configuration
		$config = LiveUpdateConfig::getInstance();

		// Get an instance of the storage class
		$storageOptions = $config->getStorageAdapterPreferences();
		require_once dirname(__FILE__).'/storage/storage.php';
		$this->storage = LiveUpdateStorage::getInstance($storageOptions['adapter'], $storageOptions['config']);

		// If we are requested to forcibly reload the information, clear old data first
		if($force) {
			$this->storage->set('lastcheck', null);
			$this->storage->set('updatedata', null);
			$this->storage->save();
		}

		// Fetch information from the cache
		$lastCheck = $this->storage->get('lastcheck', 0);
		$cachedData = $this->storage->get('updatedata', null);

		if (!is_object($cachedData))
		{
			$cachedData = null;
		}

		if(empty($cachedData)) {
			$lastCheck = 0;
		}

		// Check if the cache is at most $cacheTTL hours old
		$now = time();
		$maxDifference = $this->cacheTTL * 3600;
		$difference = abs($now - $lastCheck);

		if(!($force) && ($difference <= $maxDifference)) {
			// The cache is fresh enough; return cached data
			return $cachedData;
		} else {
			// The cache is stale; fetch new data, cache it and return it to the caller
			$data = $this->getUpdateData($force);
			$this->storage->set('lastcheck', $now);
			$this->storage->set('updatedata', $data);
			$this->storage->save();
			return $data;
		}
	}

	/**
	 * Retrieves the update data from the server, unless previous runs indicate
	 * that the download process gets stuck and ends up in a WSOD.
	 *
	 * @param bool $force Set to true to force fetching new data no matter if the process is marked as stuck
	 * @return stdClass
	 */
	private function getUpdateData($force = false)
	{
		$ret = array(
			'supported'		=> false,
			'stuck'			=> true,
			'version'		=> '',
			'date'			=> '',
			'stability'		=> '',
			'downloadURL'	=> '',
			'infoURL'		=> '',
			'releasenotes'	=> ''
		);

		// If the process is marked as "stuck", we won't bother fetching data again; well,
		// unless you really force me to, by setting $force = true.
		if( ($this->storage->get('stuck',0) != 0) && !$force) return (object)$ret;

		$ret['stuck'] = false;

		require_once dirname(__FILE__).'/download.php';

		// First we mark Live Updates as getting stuck. This way, if fetching the update
		// fails with a server error, reloading the page will not result to a White Screen
		// of Death again. Hey, Joomla! core team, are you listening? Some hosts PRETEND to
		// support cURL or URL fopen() wrappers but using them throws an immediate WSOD.
		$this->storage->set('stuck', 1);
		$this->storage->save();

		$config = LiveUpdateConfig::getInstance();
		$extInfo = $config->getExtensionInformation();
		$url = $extInfo['updateurl'];
		$rawData = LiveUpdateDownloadHelper::downloadAndReturn($url);

		// Now that we have some data returned, let's unmark the process as being stuck ;)
		$this->storage->set('stuck', 0);
		$this->storage->save();

		// If we didn't get anything, assume Live Update is not supported (communication error)
		if(empty($rawData) || ($rawData == false)) return (object)$ret;

		// TODO Detect the content type of the returned update stream. For now, I will pretend it's an INI file.

		$data = $this->parseINI($rawData);
		$ret['supported'] = true;

		return (object)array_merge($ret, $data);
	}

	/**
	 * Fetches update information from the server using cURL
	 * @return string The raw server data
	 */
	private function fetchCURL()
	{
		$config = LiveUpdateConfig::getInstance();
		$extInfo = $config->getExtensionInformation();
		$url = $extInfo['updateurl'];

		$process = curl_init($url);
		$config = new LiveUpdateConfig();
		$config->applyCACert($process);
		curl_setopt($process, CURLOPT_HEADER, 0);
		// Pretend we are Firefox, so that webservers play nice with us
		curl_setopt($process, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.14) Gecko/20110105 Firefox/3.6.14');
		curl_setopt($process, CURLOPT_ENCODING, 'gzip');
		curl_setopt($process, CURLOPT_TIMEOUT, 10);
		curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);
		// The @ sign allows the next line to fail if open_basedir is set or if safe mode is enabled
		@curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);
		@curl_setopt($process, CURLOPT_MAXREDIRS, 20);
		$inidata = curl_exec($process);
		curl_close($process);
		return $inidata;
	}

	/**
	 * Fetches update information from the server using file_get_contents, which internally
	 * uses URL fopen() wrappers.
	 * @return string The raw server data
	 */
	private function fetchFOPEN()
	{
		$config = LiveUpdateConfig::getInstance();
		$extInfo = $config->getExtensionInformation();
		$url = $extInfo['updateurl'];

		return @file_get_contents($url);
	}

	/**
	 * Parses the raw INI data into an array of update information
	 * @param string $rawData The raw INI data
	 * @return array The parsed data
	 */
	private function parseINI($rawData)
	{
		$ret = array(
			'version'		=> '',
			'date'			=> '',
			'stability'		=> '',
			'downloadURL'	=> '',
			'infoURL'		=> '',
			'releasenotes'	=> ''
		);

		// Get the magic string
		$magicPos = strpos($rawData, '; Live Update provision file');

		if($magicPos === false) {
			// That's not an INI file :(
			return $ret;
		}

		if($magicPos !== 0) {
			$rawData = substr($rawData, $magicPos);
		}

		require_once dirname(__FILE__).'/inihelper.php';
		$iniData = LiveUpdateINIHelper::parse_ini_file($rawData, false, true);

		// Get the supported platforms
		$supportedPlatform = false;
		$versionParts = explode('.',JVERSION);
		$currentPlatform = $versionParts[0].'.'.$versionParts[1];

		if(array_key_exists('platforms', $iniData)) {
			$rawPlatforms = explode(',', $iniData['platforms']);
			foreach($rawPlatforms as $platform) {
				$platform = trim($platform);
				if(substr($platform,0,7) != 'joomla/') {
					continue;
				}
				$platform = substr($platform, 7);
				if($currentPlatform == $platform) {
					$supportedPlatform = true;
				}
			}
		} else {
			// Lies, damn lies
			$supportedPlatform = true;
		}

		if(!$supportedPlatform) {
			return $ret;
		}

		$ret['version'] = array_key_exists('version', $iniData) ? $iniData['version'] : '';
		$ret['date'] = array_key_exists('date', $iniData) ? $iniData['date'] : '';
		$config = LiveUpdateConfig::getInstance();
		$auth = $config->getAuthorization();
		if(!array_key_exists('link', $iniData)) $iniData['link'] = '';
		$glue = strpos($iniData['link'],'?') === false ? '?' : '&';
		$ret['downloadURL'] = $iniData['link'] . (empty($auth) ? '' : $glue.$auth);
//		$ret['downloadURL'] = $iniData['link'];
		if(array_key_exists('stability', $iniData)) {
			$stability = $iniData['stability'];
		} else {
			// Stability not defined; guesswork mode enabled
			$version = $ret['version'];
			if( preg_match('#^[0-9\.]*a[0-9\.]*#', $version) == 1 ) {
				$stability = 'alpha';
			} elseif( preg_match('#^[0-9\.]*b[0-9\.]*#', $version) == 1 ) {
				$stability = 'beta';
			} elseif( preg_match('#^[0-9\.]*rc[0-9\.]*#', $version) == 1 ) {
				$stability = 'rc';
			} elseif( preg_match('#^[0-9\.]*$#', $version) == 1 ) {
				$stability = 'stable';
			} else {
				$stability = 'svn';
			}
		}
		$ret['stability'] = $stability;

		if(array_key_exists('releasenotes', $iniData)) {
			$ret['releasenotes'] = $iniData['releasenotes'];
		}

		if(array_key_exists('infourl', $iniData)) {
			$ret['infoURL'] = $iniData['infourl'];
		}

		return $ret;
	}
}
components/com_icagenda/liveupdate/classes/model.php000060400000014112152453623450016736 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 *
 * @package LiveUpdate 2.1.5 - 2.2.1
 * @copyright Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>
 *
 * @version     3.1.7 2013-08-28
 * @since       1.2.6
 */
/**
 * Specific error message update - iCagenda
 */

defined('_JEXEC') or die();

JLoader::import('joomla.application.component.model');

if(!class_exists('JoomlaCompatModel')) {
	if(interface_exists('JModel')) {
		abstract class JoomlaCompatModel extends JModelLegacy {}
	} else {
		class JoomlaCompatModel extends JModel {}
	}
}

/**
 * The Live Update MVC model
 */
class LiveUpdateModel extends JoomlaCompatModel
{
	public function download()
	{
		// Get the path to Joomla!'s temporary directory
		$jreg = JFactory::getConfig();
		$tmpdir = $jreg->get('tmp_path');

		JLoader::import('joomla.filesystem.folder');
		// Make sure the user doesn't use the system-wide tmp directory. You know, the one that's
		// being erased periodically and will cause a real mess while installing extensions (Grrr!)
		if(realpath($tmpdir) == '/tmp') {
			// Someone inform the user that what he's doing is insecure and stupid, please. In the
			// meantime, I will fix what is broken.
			$tmpdir = JPATH_SITE.'/tmp';
		} // Make sure that folder exists (users do stupid things too often; you'd be surprised)
		elseif(!JFolder::exists($tmpdir)) {
			// Darn it, user! WTF where you thinking? OK, let's use a directory I know it's there...
			$tmpdir = JPATH_SITE.'/tmp';
		}

		// Oki. Let's get the URL of the package
		$updateInfo = LiveUpdate::getUpdateInformation();
		$config = LiveUpdateConfig::getInstance();
		$auth = $config->getAuthorization();
		$url = $updateInfo->downloadURL;

		// Sniff the package type. If sniffing is impossible, I'll assume a ZIP package
		$basename = basename($url);
		if(strstr($basename,'?')) {
			$basename = substr($basename, strstr($basename,'?')+1);
		}
		if(substr($basename,-4) == '.zip') {
			$type = 'zip';
		} elseif(substr($basename,-4) == '.tar') {
			$type = 'tar';
		} elseif(substr($basename,-4) == '.tgz') {
			$type = 'tar.gz';
		} elseif(substr($basename,-7) == '.tar.gz') {
			$type = 'tar.gz';
		} else {
			$type = 'zip';
		}

		// Cache the path to the package file and the temp installation directory in the session
		$target = $tmpdir.'/'.$updateInfo->extInfo->name.'.update.'.$type;
		$tempdir = $tmpdir.'/'.$updateInfo->extInfo->name.'_update';

		$session = JFactory::getSession();
		$session->set('target', $target, 'liveupdate');
		$session->set('tempdir', $tempdir, 'liveupdate');

		// Let's download!
		require_once dirname(__FILE__).'/download.php';
		return LiveUpdateDownloadHelper::download($url, $target);
	}

	public function extract()
	{
		$session = JFactory::getSession();
		$target = $session->get('target', '', 'liveupdate');
		$tempdir = $session->get('tempdir', '', 'liveupdate');

		JLoader::import('joomla.filesystem.archive');
		return JArchive::extract( $target, $tempdir);
	}

	public function install()
	{
		$session = JFactory::getSession();
		$tempdir = $session->get('tempdir', '', 'liveupdate');

		JLoader::import('joomla.installer.installer');
		JLoader::import('joomla.installer.helper');
		$installer = JInstaller::getInstance();
		$packageType = JInstallerHelper::detectType($tempdir);

		if(!$packageType) {
			$msg = JText::_('LIVEUPDATE_INVALID_PACKAGE_TYPE');
			$result = false;
		} elseif (!$installer->install($tempdir)) {
			// There was an error installing the package
//			$msg = JText::sprintf('LIVEUPDATE_INSTALLEXT', JText::_($packageType), JText::_('LIVEUPDATE_Error'));
			$msg = JText::sprintf('LIVEUPDATE_INSTALL_ERROR', JText::_('LIVEUPDATE_INSTALL_TYPE_'.strtoupper($packageType)));
			$result = false;
		} else {
			// Package installed sucessfully
//			$msg = JText::sprintf('LIVEUPDATE_INSTALLEXT', JText::_($packageType), JText::_('LIVEUPDATE_Success'));
			$msg = JText::sprintf('LIVEUPDATE_INSTALL_SUCCESS', JText::_('LIVEUPDATE_INSTALL_TYPE_'.strtoupper($packageType)));
			$result = true;
		}

		$app = JFactory::getApplication();
		$app->enqueueMessage($msg);
		$this->setState('result', $result);
		$this->setState('packageType', $packageType);
		if($packageType) {
			$this->setState('name', $installer->get('name'));
			$this->setState('message', $installer->message);
			$this->setState('extmessage', $installer->get('extension_message'));
		}

		return $result;
	}

	public function cleanup()
	{
		$session = JFactory::getSession();
		$target = $session->get('target', '', 'liveupdate');
		$tempdir = $session->get('tempdir', '', 'liveupdate');

		JLoader::import('joomla.installer.helper');
		JInstallerHelper::cleanupInstall($target, $tempdir);

		$session->clear('target','liveupdate');
		$session->clear('tempdir','liveupdate');
	}

	public function getSRPURL($return = '')
	{
		$session = JFactory::getSession();
		$tempdir = $session->get('tempdir', '', 'liveupdate');

		JLoader::import('joomla.installer.installer');
		JLoader::import('joomla.installer.helper');
		JLoader::import('joomla.filesystem.file');

		$instModelFile = JPATH_ADMINISTRATOR.'/components/com_akeeba/models/installer.php';
		if(!JFile::exists($instModelFile)) {
			$instModelFile = JPATH_ADMINISTRATOR.'/components/com_akeeba/plugins/models/installer.php';
		};
		if(!JFile::exists($instModelFile)) return false;

		require_once $instModelFile;
		$model	= JoomlaCompatModel::getInstance('Installer', 'AkeebaModel');
		$packageType = JInstallerHelper::detectType($tempdir);
		$name = $model->getExtensionName($tempdir);

		$url = 'index.php?option=com_akeeba&view=backup&tag=restorepoint&type='.$packageType.'&name='.urlencode($name['name']);
		switch($packageType) {
			case 'module':
			case 'template':
				$url .= '&group='.$name['client'];
				break;
			case 'plugin':
				$url .= '&group='.$name['group'];
				break;
		}

		if(!empty($return)) $url .= '&returnurl='.urlencode($return);

		return $url;
	}
}
components/com_icagenda/liveupdate/classes/download.php000060400000024051152453623450017450 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 *
 * @package LiveUpdate 2.1.5 - 2.2.1
 * @copyright  Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license    GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>
 *
 * @version     3.1.7 2013-08-28
 * @since       1.2.6
 */

defined('_JEXEC') or die();

/**
 * Allows downloading packages over the web to your server
 */
class LiveUpdateDownloadHelper
{
	/**
	 * Downloads from a URL and saves the result as a local file
	 *
	 * @param   string  $url     The URL to fetch
	 * @param   string  $target  Where to save the file
	 *
	 * @return  boolean  True on success
	 */
	public static function download($url, $target)
	{
		// Import Joomla! libraries
		JLoader::import('joomla.filesystem.file');

		/** @var bool Did we try to force permissions? */
		$hackPermissions = false;

		// Make sure the target does not exist
		if (JFile::exists($target))
		{
			if (!@unlink($target))
			{
				JFile::delete($target);
			}
		}

		// Try to open the output file for writing
		$fp = @fopen($target, 'wb');

		if ($fp === false)
		{
			// The file can not be opened for writing. Let's try a hack.
			$empty = '';
			if (JFile::write($target, $empty))
			{
				if (self::chmod($target, 511))
				{
					$fp				 = @fopen($target, 'wb');
					$hackPermissions = true;
				}
			}
		}

		$result = false;

		if ($fp !== false)
		{
			// First try to download directly to file if $fp !== false
			$adapters	 = self::getAdapters();
			$result		 = false;

			while (!empty($adapters) && ($result === false))
			{
				// Run the current download method
				$method	 = 'get' . strtoupper(array_shift($adapters));
				$result	 = self::$method($url, $fp);

				// Check if we have a download
				if ($result === true)
				{
					// The download is complete, close the file pointer
					@fclose($fp);

					// If the filesize is not at least 1 byte, we consider it failed.
					clearstatcache();
					$filesize = @filesize($target);

					if ($filesize <= 0)
					{
						$result	 = false;
						$fp		 = @fopen($target, 'wb');
					}
				}
			}

			// If we have no download, close the file pointer
			if ($result === false)
			{
				@fclose($fp);
			}
		}

		if ($result === false)
		{
			// Delete the target file if it exists
			if (file_exists($target))
			{
				if (!@unlink($target))
				{
					JFile::delete($target);
				}
			}
			// Download and write using JFile::write();
			$result = JFile::write($target, self::downloadAndReturn($url));
		}

		return $result;
	}

	/**
	 * Downloads from a URL and returns the result as a string
	 *
	 * @param   string  $url  The URL to download from
	 *
	 * @return  mixed  Result string on success, false on failure
	 */
	public static function downloadAndReturn($url)
	{
		$adapters	 = self::getAdapters();
		$result		 = false;

		while (!empty($adapters) && ($result === false))
		{
			// Run the current download method
			$method	 = 'get' . strtoupper(array_shift($adapters));
			$result	 = self::$method($url, null);
		}

		return $result;
	}

	/**
	 * Does the server support PHP's cURL extension?
	 *
	 * @return   boolean  True if it is supported
	 */
	private static function hasCURL()
	{
		static $result = null;

		if (is_null($result))
		{
			$result = function_exists('curl_init');
		}

		return $result;
	}

	/**
	 * Downloads the contents of a URL and writes them to disk (if $fp is not null)
	 * or returns them as a string (if $fp is null) using cURL
	 *
	 * @param   string    $url  The URL to download from
	 * @param   resource  $fp   The file pointer to download to. Omit to return the contents.
	 *
	 * @return  boolean|string  False on failure, true on success ($fp not null) or the URL contents (if $fp is null)
	 */
	private static function &getCURL($url, $fp = null, $nofollow = false)
	{
		$result = false;

		$ch		 = curl_init($url);
		$config	 = new LiveUpdateConfig();
		$config->applyCACert($ch);

		if (!@curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1) && !$nofollow)
		{
			// Safe Mode is enabled. We have to fetch the headers and
			// parse any redirections present in there.
			curl_setopt($ch, CURLOPT_AUTOREFERER, true);
			curl_setopt($ch, CURLOPT_FAILONERROR, true);
			curl_setopt($ch, CURLOPT_HEADER, true);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
			curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
			curl_setopt($ch, CURLOPT_TIMEOUT, 30);

			// Get the headers
			$data = curl_exec($ch);
			curl_close($ch);

			// Init
			$newURL = $url;

			// Parse the headers
			$lines = explode("\n", $data);

			foreach ($lines as $line)
			{
				if (substr($line, 0, 9) == "Location:")
				{
					$newURL = trim(substr($line, 9));
				}
			}

			// Download from the new URL
			if ($url != $newURL)
			{
				return self::getCURL($newURL, $fp);
			}
			else
			{
				return self::getCURL($newURL, $fp, true);
			}
		}
		else
		{
			@curl_setopt($ch, CURLOPT_MAXREDIRS, 20);
		}

		curl_setopt($ch, CURLOPT_AUTOREFERER, true);
		curl_setopt($ch, CURLOPT_FAILONERROR, true);
		curl_setopt($ch, CURLOPT_HEADER, false);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
		curl_setopt($ch, CURLOPT_TIMEOUT, 30);
		// Pretend we are IE7, so that webservers play nice with us
		curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)');

		if (is_resource($fp))
		{
			curl_setopt($ch, CURLOPT_FILE, $fp);
		}

		$result = curl_exec($ch);
		curl_close($ch);

		return $result;
	}

	/**
	 * Does the server support URL fopen() wrappers?
	 *
	 * @return  boolean
	 */
	private static function hasFOPEN()
	{
		static $result = null;

		if (is_null($result))
		{
			// If we are not allowed to use ini_get, we assume that URL fopen is
			// disabled.
			if (!function_exists('ini_get'))
			{
				$result = false;
			}
			else
			{
				$result = ini_get('allow_url_fopen');
			}
		}

		return $result;
	}

	/**
	 * Downloads the contents of a URL and writes them to disk (if $fp is not null)
	 * or returns them as a string (if $fp is null) using fopen() URL wrappers
	 *
	 * @param   string    $url  The URL to download from
	 * @param   resource  $fp   The file pointer to download to. Omit to return the contents.
	 *
	 * @return  boolean|string  False on failure, true on success ($fp not null) or the URL contents (if $fp is null)
	 */
	private static function &getFOPEN($url, $fp = null)
	{
		$result = false;

		// Track errors
		if (function_exists('ini_set'))
		{
			$track_errors = ini_set('track_errors', true);
		}

		// Open the URL for reading
		if (function_exists('stream_context_create'))
		{
			// PHP 5+ way (best)
			$httpopts	 = array(
				'user_agent' => 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)',
				'timeout'	 => 10.0,
			);
			$context	 = stream_context_create(array('http' => $httpopts));
			$ih			 = @fopen($url, 'r', false, $context);
		}
		else
		{
			// PHP 4 way (actually, it's just a fallback as we can't run this code in PHP4)
			if (function_exists('ini_set'))
			{
				ini_set('user_agent', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)');
			}
			$ih = @fopen($url, 'r');
		}

		// If fopen() fails, abort
		if (!is_resource($ih))
		{
			return $result;
		}

		// Try to download
		$bytes	 = 0;
		$result	 = true;
		$return	 = '';
		while (!feof($ih) && $result)
		{
			$contents = fread($ih, 4096);
			if ($contents === false)
			{
				@fclose($ih);
				$result = false;
				return $result;
			}
			else
			{
				$bytes += strlen($contents);
				if (is_resource($fp))
				{
					$result = @fwrite($fp, $contents);
				}
				else
				{
					$return .= $contents;
					unset($contents);
				}
			}
		}

		@fclose($ih);

		if (is_resource($fp))
		{
			return $result;
		}
		elseif ($result === true)
		{
			return $return;
		}
		else
		{
			return $result;
		}
	}

	/**
	 * Detect and return available download methods
	 *
	 * @return  array
	 */
	private static function getAdapters()
	{
		// Detect available adapters
		$adapters	 = array();
		if (self::hasCURL())
			$adapters[]	 = 'curl';
		if (self::hasFOPEN())
			$adapters[]	 = 'fopen';
		return $adapters;
	}

	/**
	 * Change the permissions of a file, optionally using FTP
	 *
	 * @param   string  $file  Absolute path to file
	 * @param   int     $mode  Permissions, e.g. 0755
	 *
	 * @return  boolean  Ture if successful
	 */
	private static function chmod($path, $mode)
	{
		if (is_string($mode))
		{
			$mode	 = octdec($mode);
			if (($mode < 0600) || ($mode > 0777))
				$mode	 = 0755;
		}

		// Initialize variables
		JLoader::import('joomla.client.helper');
		$ftpOptions = JClientHelper::getCredentials('ftp');

		// Check to make sure the path valid and clean
		$path = JPath::clean($path);

		if ($ftpOptions['enabled'] == 1)
		{
			// Connect the FTP client
			JLoader::import('joomla.client.ftp');
			if (version_compare(JVERSION, '3.0', 'ge'))
			{
				$ftp = JClientFTP::getInstance(
						$ftpOptions['host'], $ftpOptions['port'], array(), $ftpOptions['user'], $ftpOptions['pass']
				);
			}
			else
			{
				if (version_compare(JVERSION, '3.0', 'ge'))
				{
					$ftp = JClientFTP::getInstance(
							$ftpOptions['host'], $ftpOptions['port'], array(), $ftpOptions['user'], $ftpOptions['pass']
					);
				}
				else
				{
					$ftp = JFTP::getInstance(
							$ftpOptions['host'], $ftpOptions['port'], array(), $ftpOptions['user'], $ftpOptions['pass']
					);
				}
			}
		}

		if (@chmod($path, $mode))
		{
			$ret = true;
		}
		elseif ($ftpOptions['enabled'] == 1)
		{
			// Translate path and delete
			JLoader::import('joomla.client.ftp');
			$path	 = JPath::clean(str_replace(JPATH_ROOT, $ftpOptions['root'], $path), '/');
			// FTP connector throws an error
			$ret	 = $ftp->chmod($path, $mode);
		}
		else
		{
			return false;
		}
	}

}
components/com_icagenda/liveupdate/classes/tmpl/startupdate.php000060400000003636152453623450021163 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 *
 * @package LiveUpdate 2.1.5 - 2.2.1
 * @copyright Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>
 *
 * @version     3.1.7 2013-08-28
 * @since       1.2.6
 */

defined('_JEXEC') or die();
?>

<div class="liveupdate">
	<div class="liveupdate-ftp">
		<p><?php echo JText::_('LIVEUPDATE_FTP_REQUIRED')?></p>
		<form name="adminForm" id="adminForm" action="index.php" method="get">
			<input name="option" value="<?php echo JRequest::getCmd('option','')?>" type="hidden" />
			<input name="view" value="<?php echo JRequest::getCmd('view','liveupdate')?>" type="hidden" />
			<input name="task" value="download" type="hidden" />
			<fieldset>
				<legend><?php echo JText::_('LIVEUPDATE_FTP') ?></legend>

				<table class="adminform">
					<tbody>
						<tr>
							<td width="120">
								<label for="username"><?php echo JText::_('LIVEUPDATE_FTPUSERNAME'); ?></label>
							</td>
							<td>
								<input type="text" id="username" name="username" class="input_box" size="70" value="" />
							</td>
						</tr>
						<tr>
							<td width="120">
								<label for="password"><?php echo JText::_('LIVEUPDATE_FTPPASSWORD'); ?></label>
							</td>
							<td>
								<input type="password" id="password" name="password" class="input_box" size="70" value="" />
							</td>
						</tr>
					</tbody>
				</table>
				<input type="submit" value="<?php echo JText::_('LIVEUPDATE_DOWNLOAD_AND_INSTALL'); ?>" />
			</fieldset>
		</form>
	</div>

	<p class="liveupdate-poweredby">
		Powered by <a href="https://www.akeebabackup.com/software/akeeba-live-update.html">Akeeba Live Update</a>
	</p>

</div>
components/com_icagenda/liveupdate/classes/tmpl/install.php000060400000002446152453623450020267 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 *
 * @package LiveUpdate 2.1.5 - 2.2.1
 * @copyright Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>
 *
 * @version     3.1.7 2013-08-28
 * @since       1.2.6
 */

defined( '_JEXEC' ) or die();

$state			= $this->get('State');
$message1		= $state->get('message');
$message2		= $state->get('extmessage');
?>
<table class="adminform">
	<tbody>
		<?php if($message1) : ?>
		<tr>
			<th><?php echo JText::_($message1) ?></th>
		</tr>
		<?php endif; ?>
		<?php if($message2) : ?>
		<tr>
			<td><?php echo $message2; ?></td>
		</tr>
		<?php endif; ?>
	</tbody>
</table>

<p class="liveupdate-poweredby">
	Powered by <a href="https://www.akeebabackup.com/software/akeeba-live-update.html">Akeeba Live Update</a>
</p>

<iframe style="width: 0px; height: 0px; border: none;" frameborder="0" marginheight="0" marginwidth="0" height="0" width="0"
	src="index.php?option=<?php echo JRequest::getCmd('option','')?>&view=<?php echo JRequest::getCmd('view','')?>&task=cleanup"></iframe>
components/com_icagenda/liveupdate/classes/tmpl/overview.php000060400000013736152453623450020473 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 *
 * @package LiveUpdate 2.1.5 - 2.2.1
 * @copyright Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>
 *
 * @version     3.4.0 2014-12-21
 * @since       1.2.6
 */
/**
 * Specific strings iCagenda
 */

defined('_JEXEC') or die();

JHtml::_('behavior.framework');
JHtml::_('behavior.modal');
?>

<div class="liveupdate">

	<?php if($this->updateInfo->releasenotes): ?>
	<div style="display:none;">
		<div id="liveupdate-releasenotes">
			<div class="liveupdate-releasenotes-text">
			<?php echo $this->updateInfo->releasenotes ?>
			</div>
		</div>
	</div>
	<?php endif; ?>

	<?php if(!$this->updateInfo->supported): ?>
	<div class="liveupdate-notsupported">
		<h3><?php echo JText::_('LIVEUPDATE_NOTSUPPORTED_HEAD') ?></h3>

		<p><?php echo JText::_('LIVEUPDATE_NOTSUPPORTED_INFO'); ?></p>
		<p class="liveupdate-url">
			<?php echo $this->escape($this->updateInfo->extInfo->updateurl) ?>
		</p>
		<p><?php echo JText::sprintf('LIVEUPDATE_NOTSUPPORTED_ALTMETHOD', $this->escape($this->updateInfo->extInfo->title)); ?></p>
		<p class="liveupdate-buttons">
			<button onclick="window.location='<?php echo $this->requeryURL ?>'" ><?php echo JText::_('LIVEUPDATE_REFRESH_INFO') ?></button>
		</p>
	</div>

	<?php elseif($this->updateInfo->stuck):?>
	<div class="liveupdate-stuck">
		<h3><?php echo JText::_('LIVEUPDATE_STUCK_HEAD') ?></h3>

		<p><?php echo JText::_('LIVEUPDATE_STUCK_INFO'); ?></p>
		<p><?php echo JText::sprintf('LIVEUPDATE_NOTSUPPORTED_ALTMETHOD', $this->escape($this->updateInfo->extInfo->title)); ?></p>

		<p class="liveupdate-buttons">
			<button onclick="window.location='<?php echo $this->requeryURL ?>'" ><?php echo JText::_('LIVEUPDATE_REFRESH_INFO') ?></button>
		</p>
	</div>

	<?php else: ?>
	<?php
		$class = $this->updateInfo->hasUpdates ? 'hasupdates' : 'noupdates';
		$auth = $this->config->getAuthorization();
		$auth = empty($auth) ? '' : '?'.$auth;
	?>
	<?php if($this->needsAuth): ?>
	<p class="liveupdate-error-needsauth">
		<?php echo JText::_('LIVEUPDATE_ERROR_NEEDS_PRO_ID'); ?>
	</p>
	<?php endif; ?>
	<div class="liveupdate-<?php echo $class?>">
		<h3><?php echo JText::_('LIVEUPDATE_'.strtoupper($class).'_HEAD') ?><?php if ($class == 'hasupdates') : ?>!<?php endif; ?></h3>
		<div class="liveupdate-infotable">
			<div class="liveupdate-row row0">
				<span class="liveupdate-label"><?php echo JText::_('LIVEUPDATE_CURRENTVERSION') ?></span>
				<span class="liveupdate-data"><?php echo $this->updateInfo->extInfo->version ?></span>
			</div>
			<div class="liveupdate-row row1">
				<span class="liveupdate-label"><?php echo JText::_('LIVEUPDATE_LATESTVERSION') ?></span>
				<span class="liveupdate-data"><?php echo $this->updateInfo->version ?></span>
			</div>
			<div class="liveupdate-row row0">
				<span class="liveupdate-label"><?php echo JText::_('LIVEUPDATE_LATESTRELEASED') ?></span>
				<span class="liveupdate-data"><?php echo $this->updateInfo->date ?></span>
			</div>
			<div class="liveupdate-row row1">
				<span class="liveupdate-label"><?php echo JText::_('LIVEUPDATE_DOWNLOADURL') ?></span>
				<span class="liveupdate-data"><a href="<?php echo $this->updateInfo->downloadURL.$auth?>"><?php echo $this->escape($this->updateInfo->downloadURL)?></a></span>
			</div>
			<?php if(!empty($this->updateInfo->releasenotes) || !empty($this->updateInfo->infoURL)): ?>
			<div class="liveupdate-row row0">
				<span class="liveupdate-label"><?php echo JText::_('LIVEUPDATE_RELEASEINFO') ?></span>
				<span class="liveupdate-data">
					<?php if($this->updateInfo->releasenotes): ?>
					<a href="#" id="btnLiveUpdateReleaseNotes" class="btn btn-warning btn-small"><i class="icon-file"></i> <?php echo JText::_('LIVEUPDATE_RELEASENOTES') ?></a>
					<?php
					JHTML::_('behavior.framework');
					JHTML::_('behavior.modal');

					$script = <<<ENDSCRIPT
					window.addEvent( 'domready' ,  function() {
						$('btnLiveUpdateReleaseNotes').addEvent('click', showLiveUpdateReleaseNotes);
					});

					function showLiveUpdateReleaseNotes()
					{
						var liveupdateReleasenotes = $('liveupdate-releasenotes').clone();

						SqueezeBox.fromElement(
							liveupdateReleasenotes, {
								handler: 'adopt',
								size: {
									x: 450,
									y: 350
								}
							}
						);
					}
ENDSCRIPT;
					$document = JFactory::getDocument();
					$document->addScriptDeclaration($script,'text/javascript');
					?>
					<?php endif; ?>
					<?php if($this->updateInfo->releasenotes && $this->updateInfo->infoURL): ?>
					<!-- &nbsp;&bull;&nbsp; -->
					<?php endif; ?>
					<?php if($this->updateInfo->infoURL): ?>
					<!-- a class="btn btn-small" href="http://icagenda.joomlic.com" target="_blank"><?php echo JText::_('LIVEUPDATE_READMOREINFO') ?></a -->
					<?php endif; ?>
					<button class="btn btn-info btn-small" onclick="window.location='<?php echo $this->requeryURL ?>'" ><i class="icon-refresh"></i> <?php echo JText::_('LIVEUPDATE_REFRESH_INFO') ?></button>
				</span>
			</div>
			<?php endif; ?>
		</div>

		<p class="liveupdate-buttons">
			<?php if($this->updateInfo->hasUpdates):?>
			<?php $disabled = $this->needsAuth ? 'disabled="disabled"' : ''?>
			<button class="btn btn-success btn-large" <?php echo $disabled?> onclick="window.location='<?php echo $this->runUpdateURL ?>'" ><i class="icon-download"></i>&nbsp;&nbsp;<?php echo JText::_('LIVEUPDATE_DO_UPDATE') ?></button>
			<?php endif;?>
			<!--button class="btn btn-info btn-small" onclick="window.location='<?php echo $this->requeryURL ?>'" ><i class="icon-refresh"></i> <?php echo JText::_('LIVEUPDATE_REFRESH_INFO') ?></button-->
		</p>
	</div>

	<?php endif; ?>

	<p class="liveupdate-poweredby">
		Powered by <a href="https://www.akeebabackup.com/software/akeeba-live-update.html">Akeeba Live Update</a>
	</p>

</div>
components/com_icagenda/liveupdate/classes/tmpl/nagscreen.php000060400000005113152453623450020560 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 *
 * @package LiveUpdate 2.1.5 - 2.2.1
 * @copyright Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>
 *
 * @version     3.4.0 2014-12-21
 * @since       1.2.6
 */
/**
 * Specific strings iCagenda
 */

defined('_JEXEC') or die();

$stability = JText::_('LIVEUPDATE_STABILITY_'.$this->updateInfo->stability);
?>

<div class="liveupdate">

	<div id="nagscreen">
		<h2><?php echo JText::_('LIVEUPDATE_NAGSCREEN_HEAD_ICAGENDA') ?></h2>

		<p class="nagversioninfo">
			<?php echo JText::sprintf('LIVEUPDATE_NAGSCREEN_VERSION_ICAGENDA', $this->updateInfo->version, $stability) ?>
		</p>
		<?php if (JText::_('LIVEUPDATE_NAGSCREEN_BODY_ICAGENDA') != 'LIVEUPDATE_NAGSCREEN_BODY_ICAGENDA') : ?>
			<p class="nagtext">
				<?php echo JText::_('LIVEUPDATE_NAGSCREEN_BODY_ICAGENDA') ?>
			</p>
		<?php else : ?>
			<p class="nagtext">
				<?php echo JText::_('LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ALERT_TOP') ?>
			</p>
			<p class="nagstability alert alert-danger">
				<strong><?php echo JText::_('LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ICAGENDA_ALPHA') ?></strong>:
				<?php echo JText::_('LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ALERT_ALPHA') ?>
			</p>
			<p class="nagstability alert alert-warning">
				<strong><?php echo JText::_('LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ICAGENDA_BETA') ?></strong>:
				<?php echo JText::_('LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ALERT_BETA') ?>
			</p>
			<p class="nagstability alert alert-info">
				<strong><?php echo JText::_('LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ICAGENDA_RC') ?></strong>:
				<?php echo JText::_('LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ALERT_RC') ?>
			</p>
			<p class="nagtext">
				<?php echo JText::_('LIVEUPDATE_NAGSCREEN_BODY_PRE_RELEASES_ALERT_BOTTOM') ?>
			</p>
		<?php endif; ?>
		<!--p>
			<small><?php echo JText::_('LIVEUPDATE_NAGSCREEN_FOOTER_ICAGENDA') ?>
			<a href="http://www.joomlic.com" target="_blank">www.joomlic.com</a></small>
		</p-->
	</div>
	<p class="liveupdate-buttons">
		<button class="btn btn-danger btn-large" onclick="window.location='<?php echo $this->runUpdateURL ?>'" ><?php echo JText::_('LIVEUPDATE_NAGSCREEN_BUTTON') ?></button>
	</p>

	<p class="liveupdate-poweredby">
		Powered by <a href="https://www.akeebabackup.com/software/akeeba-live-update.html">Akeeba Live Update</a>
	</p>

</div>
components/com_icagenda/liveupdate/classes/view.php000060400000006717152453623450016624 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 *
 * @package LiveUpdate 2.1.5 - 2.2.1
 * @copyright Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>
 *
 * @version     3.1.7 2013-08-28
 * @since       1.2.6
 */

defined('_JEXEC') or die();

JLoader::import('joomla.application.component.view');

if(!class_exists('JoomlaCompatView')) {
	if(interface_exists('JView')) {
		abstract class JoomlaCompatView extends JViewLegacy {}
	} else {
		class JoomlaCompatView extends JView {}
	}
}

/**
 * The Live Update MVC view
 */
class LiveUpdateView extends JoomlaCompatView
{
	public function display($tpl = null)
	{
		// Load the CSS
		$config = LiveUpdateConfig::getInstance();
		$this->assign('config', $config);
		if(!$config->addMedia()) {
			// No custom CSS overrides were set; include our own
			$document = JFactory::getDocument();
			$url = JURI::base().'/components/'.JRequest::getCmd('option','').'/liveupdate/assets/liveupdate.css';
			$document->addStyleSheet($url, 'text/css');
		}

		$requeryURL = rtrim(JURI::base(),'/').'/index.php?option='.JRequest::getCmd('option','').'&view='.JRequest::getCmd('view','liveupdate').'&force=1';
		$this->assign('requeryURL', $requeryURL);

		$model = $this->getModel();

		$extInfo = (object)$config->getExtensionInformation();
		JToolBarHelper::title($extInfo->title.' &ndash; '.JText::_('LIVEUPDATE_TASK_OVERVIEW'),'liveupdate');
		JToolBarHelper::back('JTOOLBAR_BACK', 'index.php?option='.JRequest::getCmd('option',''));

		if(version_compare(JVERSION, '3.0', 'ge')) {
			$j3css = <<<ENDCSS
div#toolbar div#toolbar-back button.btn span.icon-back::before {
	content: "";
}
ENDCSS;
			JFactory::getDocument()->addStyleDeclaration($j3css);
		}

		switch(JRequest::getCmd('task','default'))
		{
			case 'startupdate':
				$this->setLayout('startupdate');
				$this->assign('url','index.php?option='.JRequest::getCmd('option','').'&view='.JRequest::getCmd('view','liveupdate').'&task=download');
				break;

			case 'install':
				$this->setLayout('install');

				// Get data from the model
				$state		= $this->get('State');

				// Are there messages to display ?
				$showMessage	= false;
				if ( is_object($state) )
				{
					$message1		= $state->get('message');
					$message2		= $state->get('extension.message');
					$showMessage	= ( $message1 || $message2 );
				}

				$this->assign('showMessage',	$showMessage);
				$this->assignRef('state',		$state);

				break;

			case 'nagscreen':
				$this->setLayout('nagscreen');
				$this->assign('updateInfo', LiveUpdate::getUpdateInformation());
				$this->assign('runUpdateURL','index.php?option='.JRequest::getCmd('option','').'&view='.JRequest::getCmd('view','liveupdate').'&task=startupdate&skipnag=1');
				break;

			case 'overview':
			default:
				$this->setLayout('overview');

				$force = JRequest::getInt('force',0);
				$this->assign('updateInfo', LiveUpdate::getUpdateInformation($force));
				$this->assign('runUpdateURL','index.php?option='.JRequest::getCmd('option','').'&view='.JRequest::getCmd('view','liveupdate').'&task=startupdate');

				$needsAuth = !($config->getAuthorization()) && ($config->requiresAuthorization());
				$this->assign('needsAuth', $needsAuth);
				break;
		}

		parent::display($tpl);
	}
}
components/com_icagenda/liveupdate/classes/storage/file.php000060400000004114152453623450020222 0ustar00<?php

/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 *
 * @package LiveUpdate 2.1.5 - 2.2.1
 * @copyright Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>
 *
 * @version     3.1.7 2013-08-28
 * @since       1.2.6
 */
defined('_JEXEC') or die();

/**
 * Live Update File Storage Class
 * Allows to store the update data to files on disk. Its configuration options are:
 * path			string	The absolute path to the directory where the update data will be stored as INI files
 *
 */
class LiveUpdateStorageFile extends LiveUpdateStorage
{
	private $filename = null;
	private $extname = null;

	public function __construct()
	{
	}

	public function load($config)
	{
		JLoader::import('joomla.registry.registry');
		JLoader::import('joomla.filesystem.file');

		if (array_key_exists('path', $config))
		{
			$path	= $config['path'];
		}
		else
		{
			$path	= JPATH_CACHE;
		}
		$extname	= $config['extensionName'];
		$filename	= "$path/$extname.updates.php";

		// Kill old files
		$filenameKill = "$path/$extname.updates.ini";
		if (JFile::exists($filenameKill))
		{
			JFile::delete($filenameKill);
		}

		$this->filename	 = $filename;
		$this->extname	 = $extname;

		$this->registry = new JRegistry('update');

		if (JFile::exists($this->filename))
		{
			// Workaround for broken JRegistryFormatPHP API...
			@include_once $this->filename;

			$className = 'LiveUpdate' . ucwords($extname) . 'Cache';

			if (class_exists($className))
			{
				$object = new $className;
				$this->registry->loadObject($object);
			}
		}
	}

	public function save()
	{
		JLoader::import('joomla.registry.registry');
		JLoader::import('joomla.filesystem.file');

		$options = array(
			'class' => 'LiveUpdate' . ucwords($this->extname) . 'Cache'
		);
		$data	 = $this->registry->toString('PHP', $options);
		JFile::write($this->filename, $data);
	}

}
components/com_icagenda/liveupdate/classes/storage/component.php000060400000006357152453623450021320 0ustar00<?php

/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 *
 * @package LiveUpdate 2.1.5 - 2.2.1
 * @copyright Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>
 *
 * @version     3.1.7 2013-08-28
 * @since       1.2.6
 */
defined('_JEXEC') or die();

/**
 * Live Update Component Storage Class
 * Allows to store the update data to a component's parameters. This is the most reliable method.
 * Its configuration options are:
 * component	string	The name of the component which will store our data. If not specified the extension name will be used.
 * key			string	The name of the component parameter where the serialized data will be stored. If not specified "liveupdate" will be used.
 */
class LiveUpdateStorageComponent extends LiveUpdateStorage
{
	private $component = null;

	private $key = null;

	public function __construct()
	{
		$this->keyPrefix = '';
	}

	public function load($config)
	{
		if (!array_key_exists('component', $config))
		{
			$this->component = $config['extensionName'];
		}
		else
		{
			$this->component = $config['component'];
		}

		if (!array_key_exists('key', $config))
		{
			$this->key = 'liveupdate';
		}
		else
		{
			$this->key = $config['key'];
		}

		// Not using JComponentHelper to avoid conflicts ;)
		$db			 = JFactory::getDbo();
		$sql		 = $db->getQuery(true)
			->select($db->qn('params'))
			->from($db->qn('#__extensions'))
			->where($db->qn('type') . ' = ' . $db->q('component'))
			->where($db->qn('element') . ' = ' . $db->q($this->component));
		$db->setQuery($sql);
		$rawparams	 = $db->loadResult();
		$params		 = new JRegistry();
		$params->loadString($rawparams, 'JSON');

		$data = $params->get($this->key, '');

		JLoader::import('joomla.registry.registry');
		$this->registry = new JRegistry('update');

		$this->registry->loadString($data, 'INI');
	}

	public function save()
	{
		$data = $this->registry->toString('INI');

		$db = JFactory::getDBO();

		// An interesting discovery: if your component is manually updating its
		// component parameters before Live Update is called, then calling Live
		// Update will reset the modified component parameters because
		// JComponentHelper::getComponent() returns the old, cached version of
		// them. So, we have to forget the following code and shoot ourselves in
		// the feet. Dammit!!!
		$sql = $db->getQuery(true)
			->select($db->qn('params'))
			->from($db->qn('#__extensions'))
			->where($db->qn('type') . ' = ' . $db->q('component'))
			->where($db->qn('element') . ' = ' . $db->q($this->component));
		$db->setQuery($sql);
		$rawparams	 = $db->loadResult();
		$params		 = new JRegistry();
		$params->loadString($rawparams, 'JSON');

		$params->set($this->key, $data);

		$data	 = $params->toString('JSON');
		$sql	 = $db->getQuery(true)
			->update($db->qn('#__extensions'))
			->set($db->qn('params') . ' = ' . $db->q($data))
			->where($db->qn('type') . ' = ' . $db->q('component'))
			->where($db->qn('element') . ' = ' . $db->q($this->component));

		$db->setQuery($sql);
		$db->execute();
	}

}
components/com_icagenda/liveupdate/classes/storage/storage.php000060400000006055152453623450020755 0ustar00<?php

/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 *
 * @package LiveUpdate 2.1.5 - 2.2.1
 * @copyright Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>
 *
 * @version     3.1.8 2013-08-30
 * @since       1.2.6
 */
/**
 * Specific PHP 5.3 min control - iCagenda
 */
defined('_JEXEC') or die();

/**
 * Abstract class for the update parameters storage
 * @author nicholas
 *
 */
abstract class LiveUpdateStorage
{
	/**
	 * @var  JRegistry  The update data registry
	 */
	protected $registry = null;

	/**
	 * @var  string  The key prefix for the registry data
	 */
	protected $keyPrefix = 'update.';

	/**
	 * Singleton implementation
	 *
	 * @param   string  $type    Storage tyme (file, component)
	 * @param   array   $config  Configuration array
	 *
	 * @return  LiveUpdateStorage
	 */
	public static function getInstance($type, $config)
	{
		static $instances = array();

		$sig = md5($type, serialize($config));
		if (!array_key_exists($sig, $instances))
		{
			$className = 'LiveUpdateStorage' . ucfirst($type);

			if (!class_exists($className))
			{
				if (version_compare(phpversion(), '5.3.0', '<')) {
					require_once dirname(__FILE__).'/'.strtolower($type).'.php';
				} else {
					require_once __DIR__ . '/' . strtolower($type) . '.php';
				}
			}

			$object	= new $className($config);
			$object->load($config);

			$instances[$sig] = $object;
		}

		return $instances[$sig];
	}

	/**
	 * Set a value to the storage registry. Automatically encodes updatedata.
	 *
	 * @param   string  $key    The key to set
	 * @param   mixed   $value  The value of the key to set
	 *
	 * @return  void
	 */
	public final function set($key, $value)
	{
		if ($key == 'updatedata')
		{
			if (function_exists('base64_encode') && function_exists('base64_decode'))
			{
				$value = base64_encode(serialize($value));
			}
			else
			{
				$value = serialize($value);
			}
		}

		$this->registry->set($this->keyPrefix . $key, $value);
	}

	/**
	 * Read a value from the storage registry
	 *
	 * @param   string  $key      The key to read
	 * @param   mixed   $default  The default value of the key, if the key is not present
	 *
	 * @return  mixed  The value of the key
	 */
	public final function get($key, $default)
	{
		$value = $this->registry->get($this->keyPrefix . $key, $default);

		if ($key == 'updatedata')
		{
			if (function_exists('base64_encode') && function_exists('base64_decode'))
			{
				$value = unserialize(base64_decode($value));
			}
			else
			{
				$value = unserialize($value);
			}
		}

		return $value;
	}

	/**
	 * Save the contents of the registry to the appropriate storage
	 *
	 * @return  void
	 */
	abstract public function save();

	/**
	 * Load data from the storage
	 *
	 * @param   array  The configuration options
	 *
	 * @return  void
	 */
	abstract public function load($config);
}
components/com_icagenda/liveupdate/classes/xmlslurp.php000060400000027100152453623450017525 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 *
 * @package LiveUpdate 2.1.5 - 2.2.1
 * @copyright Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>
 *
 * @version     3.1.7 2013-08-28
 * @since       1.2.6
 */

defined('_JEXEC') or die();

class LiveUpdateXMLSlurp extends JObject
{
	private $_info = array();

	public function getInfo($extensionName, $xmlName)
	{
		if(!array_key_exists($extensionName, $this->_info)) {
			$this->_info[$extensionName] = $this->fetchInfo($extensionName, $xmlName);
		}

		return $this->_info[$extensionName];
	}

	/**
	 * Gets the version information of an extension by reading its XML file
	 * @param string $extensionName The name of the extension, e.g. com_foobar, mod_foobar, plg_foobar or tpl_foobar.
	 * @param string $xmlName The name of the XML manifest filename. If empty uses $extensionName.xml
	 */
	private function fetchInfo($extensionName, $xmlName)
	{
		$type = strtolower(substr($extensionName,0,3));
		switch($type) {
			case 'com':
				return $this->getComponentData($extensionName, $xmlName);
				break;
			case 'mod':
				return $this->getModuleData($extensionName, $xmlName);
				break;
			case 'plg':
				return $this->getPluginData($extensionName, $xmlName);
				break;
			case 'tpl':
				return $this->getTemplateData($extensionName, $xmlName);
				break;
			case 'pkg':
				return $this->getPackageData($extensionName, $xmlName);
				break;
			case 'lib':
				return $this->getPackageData($extensionName, $xmlName);
				break;
			default:
				if(strtolower(substr($extensionName, 0, 4)) == 'file') {
					return $this->getPackageData($extensionName, $xmlName);
				} else {
					return array('version'=>'', 'date'=>'');
				}
		}
	}

	/**
	 * Gets the version information of a component by reading its XML file
	 * @param string $extensionName The name of the extension, e.g. com_foobar
	 * @param string $xmlName The name of the XML manifest filename. If empty uses $extensionName.xml
	 */
	private function getComponentData($extensionName, $xmlName)
	{
		$extensionName = strtolower($extensionName);
		$path = JPATH_ADMINISTRATOR.'/components/'.$extensionName;
		$altExtensionName = substr($extensionName,4);

		JLoader::import('joomla.filesystem.file');
		if(JFile::exists("$path/$xmlName")) {
			$filename = "$path/$xmlName";
		} elseif(JFile::exists("$path/$extensionName.xml")) {
			$filename = "$path/$extensionName.xml";
		} elseif(JFile::exists("$path/$altExtensionName.xml")) {
			$filename = "$path/$altExtensionName.xml";
		} elseif(JFile::exists("$path/manifest.xml")) {
			$filename = "$path/manifest.xml";
		} else {
			$filename = $this->searchForManifest($path);
			if($filename === false)	$filename = null;
		}

		if(empty($filename)) {
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		try {
			$xml = new SimpleXMLElement($filename, LIBXML_NONET, true);
		} catch(Exception $e) {
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		// Need to check for extension (since 1.6) and install (supported through 2.5)
		if ($xml->getName() != 'extension' && $xml->getName() != 'install') {
			unset($xml);
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		$data['version'] = $xml->version ? (string) $xml->version : '';
		$data['date'] = $xml->creationDate ? (string) $xml->creationDate : '';
		$data['xmlfile'] = $filename;

		return $data;
	}

	/**
	 * Gets the version information of a module by reading its XML file
	 * @param string $extensionName The name of the extension, e.g. mod_foobar
	 * @param string $xmlName The name of the XML manifest filename. If empty uses $extensionName.xml
	 */
	private function getModuleData($extensionName, $xmlName)
	{
		$extensionName = strtolower($extensionName);
		$altExtensionName = substr($extensionName,4);

		JLoader::import('joomla.filesystem.folder');
		JLoader::import('joomla.filesystem.file');
		$path = JPATH_SITE.'/modules/'.$extensionName;
		if(!JFolder::exists($path)) {
			$path = JPATH_ADMINISTRATOR.'/modules/'.$extensionName;
		}
		if(!JFolder::exists($path)) {
			// Joomla! 1.5
			// 1. Check front-end
			$path = JPATH_ADMINISTRATOR.'/modules';
			$filename = "$path/$xmlName";
			if(!JFile::exists($filename)) {
				$filename = "$path/$extensionName.xml";
			}
			if(!JFile::exists($filename)) {
				$filename = "$path/$altExtensionName.xml";
			}
			// 2. Check front-end
			if(!JFile::exists($filename)) {
				$path = JPATH_SITE.'/modules';
				$filename = "$path/$xmlName";
				if(!JFile::exists($filename)) {
					$filename = "$path/$extensionName.xml";
				}
				if(!JFile::exists($filename)) {
					$filename = "$path/$altExtensionName.xml";
				}
				if(!JFile::exists($filename)) {
					return array('version' => '', 'date' => '');
				}
			}
		} else {
			// Joomla! 1.6
			$filename = "$path/$xmlName";
			if(!JFile::exists($filename)) {
				$filename = "$path/$extensionName.xml";
			}
			if(!JFile::exists($filename)) {
				$filename = "$path/$altExtensionName.xml";
			}
			if(!JFile::exists($filename)) {
				return array('version' => '', 'date' => '');
			}
		}

		if(empty($filename)) {
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		try {
			$xml = new SimpleXMLElement($filename, LIBXML_NONET, true);
		} catch(Exception $e) {
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		// Need to check for extension (since 1.6) and install (supported through 2.5)
		if ($xml->getName() != 'extension' && $xml->getName() != 'install') {
			unset($xml);
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		$data['version'] = $xml->version ? (string) $xml->version : '';
		$data['date'] = $xml->creationDate ? (string) $xml->creationDate : '';
		$data['xmlfile'] = $filename;

		return $data;
	}

	/**
	 * Gets the version information of a plugin by reading its XML file
	 * @param string $extensionName The name of the plugin, e.g. plg_foobar
	 * @param string $xmlName The name of the XML manifest filename. If empty uses $extensionName.xml
	 */
	private function getPluginData($extensionName, $xmlName)
	{
		$extensionName = strtolower($extensionName);
		$altExtensionName = substr($extensionName,4);

		JLoader::import('joomla.filesystem.folder');
		JLoader::import('joomla.filesystem.file');

		$base = JPATH_PLUGINS;

		// Get a list of directories
		$stack = JFolder::folders($base,'.',true,true);
		foreach($stack as $path)
		{
			$filename = "$path/$xmlName";
			if(JFile::exists($filename)) break;
			$filename = "$path/$extensionName.xml";
			if(JFile::exists($filename)) break;
			$filename = "$path/$altExtensionName.xml";
			if(JFile::exists($filename)) break;
		}

		if(!JFile::exists($filename)) {
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		try {
			$xml = new SimpleXMLElement($filename, LIBXML_NONET, true);
		} catch(Exception $e) {
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		// Need to check for extension (since 1.6) and install (supported through 2.5)
		if ($xml->getName() != 'extension' && $xml->getName() != 'install') {
			unset($xml);
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		$data['version'] = $xml->version ? (string) $xml->version : '';
		$data['date'] = $xml->creationDate ? (string) $xml->creationDate : '';
		$data['xmlfile'] = $filename;

		return $data;
	}

	/**
	 * Gets the version information of a template by reading its XML file
	 * @param string $extensionName The name of the template, e.g. tpl_foobar
	 * @param string $xmlName The name of the XML manifest filename. If empty uses $extensionName.xml or templateDetails.xml
	 */
	private function getTemplateData($extensionName, $xmlName)
	{
		$extensionName = strtolower($extensionName);
		$altExtensionName = substr($extensionName,4);

		JLoader::import('joomla.filesystem.folder');
		JLoader::import('joomla.filesystem.file');

		// First look for administrator templates
		$path = JPATH_THEMES.'/'.$altExtensionName;
		if(!JFolder::exists($path)) {
			// Then look for front-end templates
			$path = JPATH_SITE.'/templates/'.$altExtensionName;
			if(!JFolder::exists($path)) return array('version' => '', 'date' => '');
		}

		$filename = "$path/$xmlName";
		if(!JFile::exists($filename)) {
			$filename = "$path/templateDetails.xml";
		}
		if(!JFile::exists($filename)) {
			$filename = "$path/$extensionName.xml";
		}
		if(!JFile::exists($filename)) {
			$filename = "$path/$altExtensionName.xml";
		}
		if(!JFile::exists($filename)) {
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		try {
			$xml = new SimpleXMLElement($filename, LIBXML_NONET, true);
		} catch(Exception $e) {
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		// Need to check for extension (since 1.6) and install (supported through 2.5)
		if ($xml->getName() != 'extension' && $xml->getName() != 'install') {
			unset($xml);
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		$data['version'] = $xml->version ? (string) $xml->version : '';
		$data['date'] = $xml->creationDate ? (string) $xml->creationDate : '';
		$data['xmlfile'] = $filename;

		return $data;
	}

	/**
	 * This method parses the manifest information of package, library and file
	 * extensions. All of those extensions do not store their manifests in the
	 * extension's directory, but in administrator/manifests. Kudos to @mbabker
	 * for sharing this method!
	 *
	 * @param string $extensionName
	 * @param string $xmlName
	 * @return type
	 */
	private function getPackageData($extensionName, $xmlName)
	{
		$extensionName = strtolower($extensionName);
		$altExtensionName = substr($extensionName,4);

		JLoader::import('joomla.filesystem.folder');
		JLoader::import('joomla.filesystem.file');
		$path = JPATH_ADMINISTRATOR.'/manifests/packages';

		$filename = "$path/$xmlName";
		if(!JFile::exists($filename)) {
			$filename = "$path/$extensionName.xml";
		}
		if(!JFile::exists($filename)) {
			$filename = "$path/$altExtensionName.xml";
		}
		if(!JFile::exists($filename)) {
			return array('version' => '', 'date' => '');
		}

		if(empty($filename)) {
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		try {
			$xml = new SimpleXMLElement($filename, LIBXML_NONET, true);
		} catch(Exception $e) {
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		// Need to check for extension (since 1.6) and install (supported through 2.5)
		if ($xml->getName() != 'extension') {
			unset($xml);
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		$data['version'] = $xml->version ? (string) $xml->version : '';
		$data['date'] = $xml->creationDate ? (string) $xml->creationDate : '';
		$data['xmlfile'] = $filename;

		return $data;
	}

	/**
	 * Scans a directory for XML manifest files. The first XML file to be a
	 * manifest wins.
	 *
	 * @var $path string The path to look into
	 *
	 * @return string|bool The full path to a manifest file or false if not found
	 */
	private function searchForManifest($path)
	{
		JLoader::import('joomla.filesystem.folder');
		$files = JFolder::files($path, '\.xml$', false, true);
		if(!empty($files)) foreach($files as $filename) {
			try {
				$xml = new SimpleXMLElement($filename, LIBXML_NONET, true);
			} catch(Exception $e) {
				continue;
			}

			// Check for extension (since 1.6) and install (supported through 2.5)
			if(($xml->getName() != 'extension' && $xml->getName() != 'install')) continue;
			unset($xml);
			return $filename;
		}

		return false;
	}
}
components/com_icagenda/liveupdate/classes/inihelper.php000060400000010031152453623450017611 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 *
 * @package LiveUpdate 2.1.5 - 2.2.1
 * @copyright Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>
 *
 * @version     3.1.7 2013-08-28
 * @since       1.2.6
 */

defined('_JEXEC') or die();

/**
 * A smart INI file parser with reproducible behaviour among different PHP versions
 */
class LiveUpdateINIHelper
{
	/**
	 * Parse an INI file and return an associative array. Since PHP versions before
	 * 5.1 are bitches with regards to INI parsing, I use a PHP-only solution to
	 * overcome this obstacle.
	 * @param	string	$file	The file to process
	 * @param	bool	$process_sections	True to also process INI sections
	 * @return	array	An associative array of sections, keys and values
	 */
	public static function parse_ini_file( $file, $process_sections, $rawdata = false )
	{
		if($rawdata)
		{
			return self::parse_ini_file_php($file, $process_sections, $rawdata);
		}
		else
		{
			if( version_compare(PHP_VERSION, '5.1.0', '>=') && (!$rawdata) )
			{
				if( function_exists('parse_ini_file') )
				{
					return parse_ini_file($file, $process_sections);
				}
				else
				{
					return self::parse_ini_file_php($file, $process_sections);
				}
			} else {
				return self::parse_ini_file_php($file, $process_sections, $rawdata);
			}
		}
	}

	/**
	 * A PHP based INI file parser.
	 * Thanks to asohn ~at~ aircanopy ~dot~ net for posting this handy function on
	 * the parse_ini_file page on http://gr.php.net/parse_ini_file
	 * @param	string	$file	Filename to process
	 * @param	bool	$process_sections	True to also process INI sections
	 * @param	bool	$rawdata	If true, the $file contains raw INI data, not a filename
	 * @return	array	An associative array of sections, keys and values
	 */
	static function parse_ini_file_php($file, $process_sections = false, $rawdata = false)
	{
		$process_sections = ($process_sections !== true) ? false : true;

		if(!$rawdata)
		{
			$ini = file($file);
		}
		else
		{
			$file = str_replace("\r","",$file);
			$ini = explode("\n", $file);
		}

		if (count($ini) == 0) {return array();}

		$sections = array();
		$values = array();
		$result = array();
		$globals = array();
		$i = 0;
		foreach ($ini as $line) {
			$line = trim($line);
			$line = str_replace("\t", " ", $line);

			// Comments
			if (!preg_match('/^[a-zA-Z0-9[]/', $line)) {continue;}

			// Sections
			if ($line{0} == '[') {
				$tmp = explode(']', $line);
				$sections[] = trim(substr($tmp[0], 1));
				$i++;
				continue;
			}

			// Key-value pair
			list($key, $value) = explode('=', $line, 2);
			$key = trim($key);
			$value = trim($value);
			if (strstr($value, ";")) {
				$tmp = explode(';', $value);
				if (count($tmp) == 2) {
					if ((($value{0} != '"') && ($value{0} != "'")) ||
					preg_match('/^".*"\s*;/', $value) || preg_match('/^".*;[^"]*$/', $value) ||
					preg_match("/^'.*'\\s*;/", $value) || preg_match("/^'.*;[^']*$/", $value) ){
						$value = $tmp[0];
					}
				} else {
					if ($value{0} == '"') {
						$value = preg_replace('/^"(.*)".*/', '$1', $value);
					} elseif ($value{0} == "'") {
						$value = preg_replace("/^'(.*)'.*/", '$1', $value);
					} else {
						$value = $tmp[0];
					}
				}
			}
			$value = trim($value);
			$value = trim($value, "'\"");

			if ($i == 0) {
				if (substr($line, -1, 2) == '[]') {
					$globals[$key][] = $value;
				} else {
					$globals[$key] = $value;
				}
			} else {
				if (substr($line, -1, 2) == '[]') {
					$values[$i-1][$key][] = $value;
				} else {
					$values[$i-1][$key] = $value;
				}
			}
		}

		for($j = 0; $j < $i; $j++) {
			if ($process_sections === true) {
				if( isset($sections[$j]) && isset($values[$j]) )	$result[$sections[$j]] = $values[$j];
			} else {
				if( isset($values[$j]) ) $result[] = $values[$j];
			}
		}

		return $result + $globals;
	}
}
components/com_icagenda/liveupdate/classes/controller.php000060400000016345152453623450020033 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 *
 * @package LiveUpdate 2.1.5 - 2.2.1
 * @copyright Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>
 *
 * @version     3.1.7 2013-08-28
 * @since       1.2.6
 */

defined('_JEXEC') or die();

JLoader::import('joomla.application.component.controller');

if(!class_exists('JoomlaCompatController')) {
	if(interface_exists('JController')) {
		abstract class JoomlaCompatController extends JControllerLegacy {}
	} else {
		class JoomlaCompatController extends JController {}
	}
}

/**
 * The Live Update MVC controller
 */
class LiveUpdateController extends JoomlaCompatController
{
	/**
	 * Object contructor
	 * @param array $config
	 *
	 * @return LiveUpdateController
	 */
	public function __construct($config = array())
	{
		parent::__construct();

		$this->registerDefaultTask('overview');
	}

	/**
	 * Runs the overview page task
	 */
	public function overview()
	{
		$this->display();
	}

	/**
	 * Starts the update procedure. If the FTP credentials are required, it asks for them.
	 */
	public function startupdate()
	{
		$updateInfo = LiveUpdate::getUpdateInformation();
		if($updateInfo->stability != 'stable') {
			$skipNag = JRequest::getBool('skipnag', false);
			if(!$skipNag) {
				$this->setRedirect('index.php?option='.JRequest::getCmd('option','').'&view='.JRequest::getCmd('view','liveupdate').'&task=nagscreen');
				$this->redirect();
			}
		}

		$ftp = $this->setCredentialsFromRequest('ftp');
		if($ftp === true) {
			// The user needs to supply the FTP credentials
			$this->display();
		} else {
			// No FTP credentials required; proceed with the download
			$this->setRedirect('index.php?option='.JRequest::getCmd('option','').'&view='.JRequest::getCmd('view','liveupdate').'&task=download');
			$this->redirect();
		}
	}

	/**
	 * Download the update package
	 */
	public function download()
	{
		$ftp = $this->setCredentialsFromRequest('ftp');
		$model = $this->getThisModel();
		$result = $model->download();
		if(!$result) {
			// Download failed
			$msg = JText::_('LIVEUPDATE_DOWNLOAD_FAILED');
			$this->setRedirect('index.php?option='.JRequest::getCmd('option','').'&view='.JRequest::getCmd('view','liveupdate').'&task=overview', $msg, 'error');
		} else {
			// Download successful. Let's extract the package.
			$url = 'index.php?option='.JRequest::getCmd('option','').'&view='.JRequest::getCmd('view','liveupdate').'&task=extract';
			$user = JRequest::getString('username', null, 'GET', JREQUEST_ALLOWRAW);
			$pass = JRequest::getString('password', null, 'GET', JREQUEST_ALLOWRAW);
			if($user) {
				$url .= '&username='.urlencode($user).'&password='.urlencode($pass);
			}
			$this->setRedirect($url);
		}
		$this->redirect();
	}

	public function extract()
	{
		$ftp = $this->setCredentialsFromRequest('ftp');
		$model = $this->getThisModel();
		$result = $model->extract();
		if(!$result) {
			// Download failed
			$msg = JText::_('LIVEUPDATE_EXTRACT_FAILED');
			$this->setRedirect('index.php?option='.JRequest::getCmd('option','').'&view='.JRequest::getCmd('view','liveupdate').'&task=overview', $msg, 'error');
		} else {
			// Extract successful. Let's install the package.
			$url = 'index.php?option='.JRequest::getCmd('option','').'&view='.JRequest::getCmd('view','liveupdate').'&task=install';
			$user = JRequest::getString('username', null, 'GET', JREQUEST_ALLOWRAW);
			$pass = JRequest::getString('password', null, 'GET', JREQUEST_ALLOWRAW);
			if($user) {
				$url .= '&username='.urlencode($user).'&password='.urlencode($pass);
			}

			// Do we have SRP installed yet?
			$app = JFactory::getApplication();
			$jResponse = $app->triggerEvent('onSRPEnabled');
			$status = false;
			if(!empty($jResponse)) {
				$status = false;
				foreach($jResponse as $response)
				{
					$status = $status || $response;
				}
			}

			// SRP enabled, use it
			if($status) {
				$return = $url;
				$url = $model->getSRPURL($return);
				if(!$url) {
					$url = $return;
				}
			}

			$this->setRedirect($url);
		}
		$this->redirect();
	}

	public function install()
	{
		$ftp = $this->setCredentialsFromRequest('ftp');
		$model = $this->getThisModel();
		$result = $model->install();
		if(!$result) {
			// Installation failed
			$model->cleanup();
			$this->setRedirect('index.php?option='.JRequest::getCmd('option','').'&view='.JRequest::getCmd('view','liveupdate').'&task=overview');
			$this->redirect();
		} else {
			// Installation successful. Show the installation message.
			$cache = JFactory::getCache('mod_menu');
			$cache->clean();

			$this->display();
		}
	}

	public function cleanup()
	{
		// Perform the cleanup
		$ftp = $this->setCredentialsFromRequest('ftp');
		$model = $this->getThisModel();
		$model->cleanup();

		// Force reload update information
		$dummy = LiveUpdate::getUpdateInformation(true);

		die('OK');
	}

	/**
	 * Displays the current view
	 * @param bool $cachable Ignored!
	 */
	public final function display($cachable = false, $urlparams = false)
	{
		$viewLayout	= JRequest::getCmd( 'layout', 'default' );

		$view = $this->getThisView();

		// Get/Create the model
		$model = $this->getThisModel();
		$view->setModel($model, true);

		// Assign the FTP credentials from the request, or return TRUE if they are required
		JLoader::import('joomla.client.helper');
		$ftp	= $this->setCredentialsFromRequest('ftp');
		$view->assignRef('ftp', $ftp);

		// Set the layout
		$view->setLayout($viewLayout);

		// Display the view
		$view->display();
	}

	public final function getThisView()
	{
		static $view = null;

		if(is_null($view))
		{
			$basePath = $this->basePath;
			$tPath = dirname(__FILE__).'/tmpl';

			require_once('view.php');
			$view = new LiveUpdateView(array('base_path'=>$basePath, 'template_path'=>$tPath));
		}

		return $view;
	}

	public final function getThisModel()
	{
		static $model = null;

		if(is_null($model))
		{
			require_once('model.php');
			$model = new LiveUpdateModel();
			$task = $this->task;

			$model->setState( 'task', $task );

			$app	= JFactory::getApplication();
			$menu	= $app->getMenu();
			if (is_object( $menu ))
			{
				$item = $menu->getActive();
				if ($item)
				{
					$params	= $menu->getParams($item->id);
					// Set Default State Data
					$model->setState( 'parameters.menu', $params );
				}
			}

		}

		return $model;
	}

	private function setCredentialsFromRequest($client)
	{
		// Determine wether FTP credentials have been passed along with the current request
		JLoader::import('joomla.client.helper');
		$user = JRequest::getString('username', null, 'GET', JREQUEST_ALLOWRAW);
		$pass = JRequest::getString('password', null, 'GET', JREQUEST_ALLOWRAW);
		if ($user != '' && $pass != '')
		{
			// Add credentials to the session
			if (JClientHelper::setCredentials($client, $user, $pass)) {
				$return = false;
			} else {
				$return = JError::raiseWarning('SOME_ERROR_CODE', 'JClientHelper::setCredentialsFromRequest failed');
			}
		}
		else
		{
			// Just determine if the FTP input fields need to be shown
			$return = !JClientHelper::hasCredentials('ftp');
		}

		return $return;
	}
}
components/com_icagenda/liveupdate/index.html000060400000000165152453623450015470 0ustar00<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title></title></head><body></body></html>components/com_icagenda/liveupdate/liveupdate.php000060400000011762152453623450016353 0ustar00<?php
/**
 *------------------------------------------------------------------------------
 *  iCagenda v3 by Jooml!C - Events Management Extension for Joomla! 2.5 / 3.x
 *------------------------------------------------------------------------------
 *
 * @package LiveUpdate 2.1.5 - 2.2.1
 * @copyright Copyright (c)2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>
 *
 * One-click updater for Joomla! extensions
 * Copyright (C) 2011-2013  Nicholas K. Dionysopoulos / AkeebaBackup.com
 *
 * 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 3 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, see <http://www.gnu.org/licenses/>.
 *
 * @version     3.3.3 2014-04-12
 * @since       1.2.6
 */

defined('_JEXEC') or die();

require_once dirname(__FILE__).'/classes/abstractconfig.php';
require_once dirname(__FILE__).'/config.php';

class LiveUpdate
{
	/** @var string The current version of Akeeba Live Update */
	public static $version = '1.1';

	/**
	 * Loads the translation strings -- this is an internal function, called automatically
	 */
	private static function loadLanguage()
	{
		// Load translations
		$basePath = dirname(__FILE__);
		$jlang = JFactory::getLanguage();
		$jlang->load('liveupdate', $basePath, 'en-GB', true); // Load English (British)
		$jlang->load('liveupdate', $basePath, $jlang->getDefault(), true); // Load the site's default language
		$jlang->load('liveupdate', $basePath, null, true); // Load the currently selected language
	}

	/**
	 * Handles requests to the "liveupdate" view which is used to display
	 * update information and perform the live updates
	 */
	public static function handleRequest()
	{
		// Load language strings
		self::loadLanguage();

		// Load the controller and let it run the show
		require_once dirname(__FILE__).'/classes/controller.php';
		$controller = new LiveUpdateController();
		$controller->execute(JRequest::getCmd('task','overview'));
		$controller->redirect();
	}

	/**
	 * Returns update information about your extension, based on your configuration settings
	 * @return stdClass
	 */
	public static function getUpdateInformation($force = false)
	{
		require_once dirname(__FILE__).'/classes/updatefetch.php';
		$update = new LiveUpdateFetch();
		$info = $update->getUpdateInformation($force);
		$hasUpdates = $update->hasUpdates($force);
		$info->hasUpdates = $hasUpdates;

		$config = LiveUpdateConfig::getInstance();
		$extInfo = $config->getExtensionInformation();

		$info->extInfo = (object)$extInfo;

		return $info;
	}

	public static function getIcon($config=array())
	{
		// Load language strings
		self::loadLanguage();

		// Initialize the array of button options
		$button = array();

		$defaultConfig = array(
			'option'			=> JRequest::getCmd('option',''),
			'view'				=> 'liveupdate',
			'mediaurl'			=> JURI::base().'components/'.JRequest::getCmd('option','').'/liveupdate/assets/'
		);
		$c = array_merge($defaultConfig, $config);

		$button['link'] = 'index.php?option='.$c['option'].'&view='.$c['view'];
		$button['image'] = $c['mediaurl'];

		$updateInfo = self::getUpdateInformation();
		if(!$updateInfo->supported) {
			// Unsupported
			$button['class'] = 'liveupdate-icon-notsupported';
			$button['image'] .= 'nosupport-32.png';
			$button['text'] = JText::_('LIVEUPDATE_ICON_UNSUPPORTED');
		} elseif($updateInfo->stuck) {
			// Stuck
			$button['class'] = 'liveupdate-icon-crashed';
			$button['image'] .= 'nosupport-32.png';
			$button['text'] = JText::_('LIVEUPDATE_ICON_CRASHED');
		} elseif($updateInfo->hasUpdates) {
			// Has updates
			$button['class'] = 'liveupdate-icon-updates';
			$button['image'] .= 'update-32.png';
			$button['text'] = JText::_('LIVEUPDATE_ICON_UPDATES');
		} else {
			// Already in the latest release
			$button['class'] = 'liveupdate-icon-noupdates';
			$button['image'] .= 'current-32.png';
			$button['text'] = JText::_('LIVEUPDATE_ICON_CURRENT');
		}
		if(version_compare(JVERSION, '2.5', 'ge')) {
			return '<div class="icon"><a href="'.$button['link'].'">'.
			'<div style="text-align: center;"><img src="'.$button['image'].'" alt="" width="32" height="32" border="0" align="middle" style="float: none" /></div>'.
			'<span class="'.$button['class'].'">'.$button['text'].'</span></a></div>';
		} else {
			return '<div class="icon"><a href="'.$button['link'].'">'.
			'<div><img src="'.$button['image'].'" alt="" width="32" height="32" border="0" align="middle" style="float: none" /></div>'.
			'<span class="'.$button['class'].'">'.$button['text'].'</span></a></div>';
		}
	}
}
components/com_icagenda/liveupdate/assets/liveupdate.css000060400000010174152453623450017652 0ustar00/**
 * @package LiveUpdate
 * @copyright Copyright (c)2010-2012 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>
 */
@CHARSET "UTF-8";

.icon-48-liveupdate { background-image: url(liveupdate-48.png) }

var { font-style: italic; font-weight: bold; }
p.liveupdate-url { font-family: "Lucida Sans Mono", "Courier New", Courier, monospace; }

div.liveupdate-notsupported,
div.liveupdate-stuck {
	border: thin solid #990000;
	background: #fff0f0;
	padding: 1em;
	color: #330000;
	-moz-border-radius: 10px;
	-webkit-border-radius: 10px;
	-o-border-radius: 10px;
	border-radius: 10px;
	-moz-box-shadow: 5px 5px 5px #f9f9f9;
	-webkit-box-shadow: 5px 5px 5px #f9f9f9;
	box-shadow: 5px 5px 5px #f9f9f9;
}
div.liveupdate-notsupported h3,
div.liveupdate-stuck h3 {
/*	background: transparent url("fail-24.png") top left no-repeat; */
	text-align: center;
	min-height: 24px;
	padding: 2px 0 0 28px;
	font-size: x-large;
	color: red;
	text-shadow: 1px 1px 6px #333;
}

div.liveupdate-hasupdates {
	border: thin solid #999900;
	background: #2F96B4;
	padding: 1em;
	color: #333300;
	-moz-border-radius: 10px;
	-webkit-border-radius: 10px;
	-o-border-radius: 10px;
	border-radius: 10px;
	-moz-box-shadow: 5px 5px 5px #f9f9f9;
	-webkit-box-shadow: 5px 5px 5px #f9f9f9;
	box-shadow: 5px 5px 5px #f9f9f9;
}

div.liveupdate-hasupdates h3 {
/*	background: transparent url("warn-24.png") top left no-repeat; */
	text-align: center;
	min-height: 24px;
	padding: 2px 0 12px 0;
	font-size: x-large;
	color: #fff;
	text-shadow: 1px 1px 6px #333;
}

div.liveupdate-noupdates {
	border: thin solid #009900;
	background: #51A351;
	padding: 1em;
	color: #003300;
	-moz-border-radius: 10px;
	-webkit-border-radius: 10px;
	-o-border-radius: 10px;
	border-radius: 10px;
	-moz-box-shadow: 5px 5px 5px #d4d4d4;
	-webkit-box-shadow: 5px 5px 5px #d4d4d4;
	box-shadow: 5px 5px 5px #d4d4d4;
}

div.liveupdate-noupdates h3 {
/*	background: transparent url("ok-24.png") top left no-repeat; */
	text-align: center;
	min-height: 24px;
	padding: 2px 0 12px 0;
	font-size: x-large;
	color: #fff;
	text-shadow: 1px 1px 6px #333;
}

div.liveupdate-infotable {
	width: 600px;
	margin: auto auto;
	padding: 10px;
	border: thin solid #333;
	background: #fefefe;
	-moz-border-radius: 5px;
	-webkit-border-radius: 5px;
	-o-border-radius: 5px;
	border-radius: 5px;
}
div.liveupdate-infotable .row0 { background: #fcfcfc }
div.liveupdate-infotable .row1 { background: #f0f0f0 }
div.liveupdate-row { padding: 5px; }
span.liveupdate-label { display: inline-block; vertical-align: top; width: 160px; font-weight: bold; }
span.liveupdate-data { display: inline-block; vertical-align: top; max-width: 420px; overflow: none }

p.liveupdate-buttons { text-align: center; margin: 1em; }

p.liveupdate-error-needsauth {
	margin: 1em;
	background: #ffcccc;
	border: medium solid #ff0000;
	color: #660000;
	font-size: large;
	font-weight: bold;
	padding: 1em;
	text-align: center;
	text-shadow: 1px 1px 2px white;
	-moz-border-radius: 10px;
	-webkit-border-radius: 10px;
	-o-border-radius: 10px;
	border-radius: 10px;
	-moz-box-shadow: 5px 5px 5px #d4d4d4;
	-webkit-box-shadow: 5px 5px 5px #d4d4d4;
	box-shadow: 5px 5px 5px #d4d4d4;
}

p.liveupdate-poweredby { font-size: 8pt; color: silver; margin: 1em 0 0.5em 0 }
p.liveupdate-poweredby a { color: silver; }
div.liveupdate-ftp p { margin: 1em 2em; line-height: 140%; border: thin solid #00c; padding: 0.5em; color: #006; background-color: #f0f0ff; font-size: 12pt; text-shadow: 1px 1px 3px silver }

#nagscreen {
	margin: 1em;
	background: #BD362F;
	color: #fff;
	font-size: 14px;
	font-weight: bold;
	padding: 1em;
	text-align: center;
	text-shadow: 1px 1px 2px #333;
	-moz-border-radius: 10px;
	-webkit-border-radius: 10px;
	-o-border-radius: 10px;
	border-radius: 10px;
	-moz-box-shadow: 5px 5px 5px #d4d4d4;
	-webkit-box-shadow: 5px 5px 5px #d4d4d4;
	box-shadow: 5px 5px 5px #d4d4d4;
}
.nagversioninfo {
	font-size: 1em;
	text-align: center;
	margin: 20px 15% 30px 15%;
}
.nagtext {
	font-weight: normal;
	font-size: 1.2em;
	text-align: center;
	margin: 20px 15%;
}
.nagstability {
	font-weight: normal;
	font-size: 1em;
	text-align: left;
	margin: 10px 20%
}
components/com_icagenda/liveupdate/assets/fail-24.png000060400000003534152453623450016644 0ustar00�PNG


IHDR�w=�	pHYs��IDATH
mVmlS�~ι��c;q� $1��	�#F�Ơ�&Ԋ�
jGº��ǴN�U'��X;m	մ�`C�Z������ʀB)]��n�I k�hY������~�{�P*�Z�^�s�y��>�ǹ����|��N"��qh��@
)&0��\>I4��CO����a�%�J���XL�K�|FzJ���G�m-=�ֶ��
5X�Wf.��71;4tm���'.��/]�1�t����K�^b��۾�j�ݱ�����Ex�҃�&@���\�ܸ���]���_���.&���u��)o
�~pW�UuQ(��L�6L�-`�<���������p��??:[x���;$����>^�/�K�n�ή�{�k�x����v���`&��|6+X��ʺe�)T��ܼO�	tm��v���>�|�|U�>���~Y�͏}s]jU
t�+B!q�̐ǯ~�φ��e&�Y�8,L,������M-m�}�e���Ν��P��__z֤WNoܨ�Q&�NS�%zd3Q�����;ܹ�^��M}�a��
.n�J<�>��ljR�<Z�H�����A�)�
��T�o?3��Ț6�x�ǻtfZ�zcl���辵�:;U�?��0��zʭOQ>����6/�ȃ�
H"C����je�w�ܒ�k��+ғ�hj���#���dlv�q�3���؇�����I�vF�7��F13��1�ʊ%E��^63��#c�7�.��>5)Ē�6.Y{un�b�T������}6��ˈ�~\�P��3��j�Hzũ�k�#-��gο�1mˎ�~��0��#��OX-7DѨ�T��i#��%sf��ͣy����/�G��Lc��C�C�p����3ł��+�ဪ^w\G匪ֵU25>+���S���mX�S��l�ٵ�\)ϡ�+:aC�7By$3s�x�|������ӎ���-�P����mv�%�[�TQ���S����j�{�
�MljhR���|o2{�脳�
-��6�R�s"�IU�m��g��<nP$T��<Su���k���ڞ)����X��YUU>�)��քÕ�
��S��I"6b9(H��ìKYyi�YE�'�?�l�C��vӎ������l'K.dTU�Y�īw+�7
�v.�,U�H$�9#f�v��i��p�A9O4zӲ.V�����f�B���kCC�k��yD\ǭR�Ҭ��v���$|YL.*�A���)�C�D"^�t�j��X��5v�������Ft_
dr�����Ҫ�b���>�4?�L�}}g�ɱ�~�����E�����*Ր�+f�$od�N��=\M,��+�0ɻ
��[+��7��ǵ�~���R������L�}k�DY�=��������������:�Y~��k���WU��̤;�A	�4����i��xy��to�SHS�e�M�M[W�@�p�W�[bme�=+H�;����,#{���	��E�&v?^S�Bi&�qn9Pu���2B>�#=�C������)���l��ztM}cf���"=Đ�>A��>�뾔�K�k���ifi9ѠS0�C!Ţ�*�R�D�[��I�g�谬�a�V�;��[��|n�X,��?���Ϯ��[���hF����CM
���%7ř�ŕ�8�������\�8A���s��¹|����7�w� %DS��-�Ȗ{��MK�����4d�tŵ���@v��Eo���>�bp���Ҁ�͓ww D�:`5���0P�.\^��|�_.�������
���4Ʒ��$�;�G�IEND�B`�components/com_icagenda/liveupdate/assets/nosupport-32.png000060400000005250152453623450017776 0ustar00�PNG


IHDR  szz�	pHYs��
ZIDATX	uWkl��3��O��x�k0�P��3�ƴȩ��I("-�h�R�Vi�?H-D�!
$���!@B	Dv��)�cH(�#,ػ�玽ρ�]�|sϹ�>��B&��']-uu���fm�֭�U�o�ȱ�TA���B�O����Q��jF�4�s���߽�ƭ�������D`φ
�ݻ�W�-�|ᩧZ�L�(V��#�� II`�!���d���~uݸ�<�qaɖÇO_�5K��ޮ>
O�X{��z��q�ڊ&]o�m����*�SI6��&�
PP0�E�',�͠x�r��ϵ��D���[�>&����5MM�M�qv�O{�dJ˄"��5�7�aH��Q�8�ۭ��f���I�8Hl;r�$ ���F��>[єɴ����+��E����>.��`L�8zG:����C7�v�S_jG���]�͏�!���…/B��E�^g4�Q,f1l6aY�x?�
�?7/IB&�
&a���%}z�~4��[{{�A��g8W�/m��ݸ1mڴ�u�xv�����hT3�h����P���F�C��:D`�|
�Θ��$�ݽK��B2@@G:J�@��'�Hݑ��[��B-�9��~<fLE�$�����u�b���%�{x��
j�ͥ�H���K�t�@'��3!t���.�����0-�2���B	��g�i�}�֡�DG;U΋�ښ��
��6XR`oË�/\�kO?M����7ߤ}׮����v�Bd�%��T�s�ȷe���1�,]J����i��H�}��:���#�M��r�/rs/�\ZZ�O&U5�m��e����Q�V�؁.C�!�� t�������L�ɹ1ݼI�o���<cJ/�2�x�-J��͞<�P��%Ғ$�uK�4��!�"���UUǥR��~�XV,
�(�|9-۶�M�ـ_i)9�̡/>���c-��O��r����$�s�L�;��L����|
��b1�*��d�XO_�zE���w�
��R/�i�%�h��E&�	y�c��1����G�Q�((�ܵ�f64����_�jkM��HW"�|�C!q��tZ��D�Ӽ�_B�L"��`�i{"�sWV�mŕ/˜DAI	٦O��z�β#:&�� � z�2]~�EJ�F� � &��F\Q�+��Q������xI���N�����Q�޽4z��Ri��ق�VΛg�w&�{���d��(z�u�\I
�5̐4��N�g���[���x�p���s�r@-B_�^M��bȜL$��_0�b�	�C�g���Aj�'�N�����a�Jc���*n�@�b���di8�q���׬��ÇMPv�J�H�s6b��V:�bE��4���:`�gQ�K	�,�Z*��#�5J��E�)6,ʁ#��]K���^KB	��#�vw�	ͻs��(��cu���D����NE�|��X�T�D��Y.�Z<q<�\����:�b���(��앁.��YXsDm?���5�e��g֢��q��8�_��`4����{N�k�}�]*_TO���E���Kp�\`Pӎ�����)��a��ŧ'.:�������Iㆁ_ЎT����X��-�g[SC�ޞ!p��0�m9
(28h�[�6��}�&Q
'�LF��y�f�0���J�A�0	��f��q;FP�3��'*E��z����H��9��H��$”��	M%T�	����c��d�o7|��7���#��zFDɹ��l�ԁ��@A��d�_�cw����Gqy{z������\��)�l�	��cK�_F
��n��le�v�F�Nԋ�tZ�<���vG<UTdɗe�O�N��A~Ͽ/Sq��b(Py�(�؄�`7�|�9�X��MכV�k�&L�0�@SA�Q���o�%fGRɁ�%��~k��E�����s�z��Ӳ�瓝�2u�V���(�n�L"���i*���*����ICZ�
�_���9��n_�)P��t��WI@�]׍��+~���g#� �i,��y<��ا7Z�AcBr�q&��M�H|�u�a��0UD'�Pb>�+���{�{���Ν��kD���NFƠ�'�)�:m$��U@	��뭞.ͯY�������J�瓂=_��2ƭ��y��yב&��n�b(��{�я�w#�g���F�nb�J�7�JJ�')J�JJ�PHO��u�$d8��]�d�Æ�$l��L�&�OA	����H���k`��,���(e|��(+��H&����Z'��:&�IBb�ȹ4�p��;�����a��剿�h��Ʈ@�p��W��ĉ�}�h�_Ǎ�N��qðXlF�`<AG.�3l|�@a=n����^�Q�w}}#����/#)x��p~J&O��[�/�HEo�
�M�,x��>(N�,[Ww�P�(4���?p����
�g�Y��_kڗ���
v�����*b x	H�~mjŐ���M*و������0	nѳ�V���ۋk�A���f���@#��R^�;gmҴNX�IUU���se3�W�{��?	�3�wb9IEND�B`�components/com_icagenda/liveupdate/assets/warn-24.png000060400000002234152453623450016674 0ustar00�PNG


IHDR�w=�	pHYs��NIDATH
�U�kU���v�[kX����`P�M���.	�>��Pė�}RD((�m!-�
FPb� 6`c-5��M��nw�M�i�?f���f���x؝;s����s�(c��ԇ*ܾ6��l՚��,�ޓ(� v3pE�>�ː
�BF.����>T�nbש��4u��X4���a8�M`��߃R�hL�<���CP��
��
]$��>U�`���~`�卌�Ϥi�R�H�M�NF�e(�o��.9\��Ь���
X
1�=	��Vp%z��;�g��TŁ��PtCm��Q[Ϋ*���YǦg�Ug��vKƇ�,��=��s0�_���Y��6��Us��Fe��1�rKP�2K ;�Q[ɿ2�n�M3�A
�]�%X�g���hp��g���/!�j�	��A2=K�_ZU��(��jW�74��)6U4�#d��p@)'�@4lv�U�)���i+]Ś�m�4�L�@��Q�s��s���j6n�v�Z+�_�ձ�i�%����*��d`�b8�֏7g����@Y6�U���NL�5S�;*�f�#;�u[���;�-3�"96�o9�ޓ9T�a�t�����t��Q�#��I6Bﱁ�d�F�����nvy.�B���n��ͣ�f�$Z��
q.�]f YX�A8A���&�2��}S@~#�q|�E�����R�{�9����|�;z��ܸ���m 5,�U0�������Ġo�
�~�=�t�0���"��Gκs�ѿr�*!�h���"�x9��p���@�~�1��>�)�6��s�W���W?E�_t���5a�K`�K�)8އB�m:C���b���|����M�z���9����cv�>3�x��O��=G(z�~b'#�� -v���H�5�k.�jPӱ�5�Af�+o����x��	a	��>�ۋ�GY��{ǰ�\km‹i��)e?u�Ld�7}�W�<�ij���q��cX�痢K���i(tq<,��d�,J�ޅ��E�|�
����0R�H�����l
��]|��ĵf�����A͚���q������
�Y�ڛ�!�IEND�B`�components/com_icagenda/liveupdate/assets/liveupdate-48.png000060400000011536152453623450020102 0ustar00�PNG


IHDR00W��	pHYs��IDATh�Z	p\ř���1����}K6���Ɩ���m"A�.��%���d�@��@�%�Y6��V�Eq�2+�����!˧�oɺl3:�~G����1�1�ð=��͌��}�W����̨B���I,k�3�ݧ��敃�Np.T�Z$�\L�:('�1����L�����TW\�o?����T��xf�Z�����8_�W}�A����
�����/�\����zVۉc�Ku���J�����d!Q.�*��p<�
z�H�&��o��g�+�|�~�����"@�		��zn��'���V�{|�q�iB4���25�"���$ ���n�L�u`�T�=A)<A�=�s/����$�H����s?o�M�%r[kŝN��O��HKh02�F�P�RER�,� IHTJ�EA<\�0M4]��T:�d��Q3O���-M�-��"�i��d��I�(4�TiC�!�~���T�s	��?[i@]�j�RI�s.�s-G͏E��R��
Ъ��M���($4|���- �D�	��!�� �Db�D",���P�\Z0>�?��ڦ{��<5�z�zt�QM����ʙ�/=W�������'��l���t������ZP�,��	�0�v�3��c~�N�E\�R&gx_�'If�bE��pQ#
\�T�m8�l�)Pqݍ�c7�B��wy
��XQ�-��W9%�??����������,��"J��>��P�;$7u���f�8GiJDJ^�v6�1������"jwةAH�IHĒ�Y�NIr���=���bf�ka�v-�M��g��n&�������%�/]4w4�����$Z����L�q�s�l*i�d�O�A��rnL����|/S�G���L��Q�����dy����dr�d:h��h��^�{ẄK�x�X�>Pr�kUj��:�.9ʼO��t��x��K���T{�l�H� ���|�-+���6�h�~&9�ڲ�É:czN�++��o#<
y�؃��}^�1�4np��'u�C� �HB��kJ�r?h��T��������J�H�r�[�ܲ�T��6�"g�
��N��Q��a���	��-�j^���)�?�
�~-ȉdJ���
�
<#�@��[��|�
�VU��I�I�/�T�s���G{���6Dn�[2`�����ף��Cv����[/R9ԗף�}b������?\�=%x6�9nB����p���S�E<:
�B})���:��>�O��,���]\&/�~a�\°~5k�P��U�,��YC�-�ίzW�Od�w{)���F��*�/.��Hǿw<���֋�fT����Ⲣ����m�a����3ch|
zg�r������\����!~̀�y��$7%F�lw.ާ���_Xz��� ;R��HV�_	`��e�Q�
��>�pW��LnZ\S�m�c��=ONv3��KeY�����g�op��0	)��/)�1�K�q�V��նΩN���I��n�� R!p&�`�3��S�J�H]b�c��%�P�/^��"ֈ��ӑ���� �����!/7V�Z����g �F����nq&��J2w�;�H$�d�:g>����1i��,07��w}[^�����a��'�lM�%ߪj�����˾?7t�+f�d�dTI�2E^(T�B��ͳ����s�&)!2����G~��(ږ%}#�\��g#��B�Qp�n3�8Gn�w��_?�0��I|M𣹞?��(g,x��t�o
-�1���w��P!�Wk&�yY����)�G�gosP�����Hb��!�	X�Y��:
�@���)>��9t�詿������Xꡍ�/=��im�&�c��;�%��!���7����mo��T�Dt_!XFX��XZd���M���A@Bfp\��Ѹ�����B�����/��'�n�|+T��阛c���1`��+�{��WO���$�]Y��TB��<����M��e�H�<���=���Z�G\���J
!aSe+�$aԿ���0�x����gY뭦�]gS�
=E�e`����=�E��j	0��+y�����U�|�w� �i.L��+�6�C�BH
T�f(%�a��3x�-T�Z�?��`�fGعj]�?̟z��˺ǃ��'s�CBiЀ76�M,7�:T��`���Vbn�
�մ�k�L
B��*R�й���$�m����Pӌ��3�f������f�IS�O�IF��o�ۼ)�
3
��~����­�,��!�lkCCqe���L]x��¢8x�m��Y@l��C^u�!qh���Ԉɿ�q������[Fhu}݀��|�O�Β]dgC�>[h|�Lzb���[��پ���y�{���������~Е�,$�֪XS�*X/|�
60^^wq:�YD��:���,<���Xlњ���f�_�,�y�����Y��~�IqAnCJQ�,�k.D���|/���-�����_���u�e��s3�U%k�~xd{8K������C���!~G=yx�0bK=���zLK���Z����/%ˎ�]��.�5t�u�ɦ��*Há�!�_�Į
wTx|�d��
�S���l�۲h�K���N���C�M&6��p�g7\K�+�x��Uw޿�G��葖	�[�Cg_FUP%�bd����� ��C�&��9>�c��H�)���SG�t[�i�*U��G�<��3���o�����Ykz{�C�{ޕUiSr��@M8Cfxe��7I��/���� 	9���ۄ��Ġ("+&O������͡C���[P�q�#҄�$	#0�A����ն��m
���x����d�]�sf�x����s��M��D?X�f�A(�U��L��c]���&��I����Z�^�O��K�R�++Ww�׆�wmw���׶�o�izS�ك���J���CjG*
o���d�j[��������ƺ*�������#�u�Gc���Q�<>��n�D�҃ro��v�w�����s�1ɉ���{����l�,|u��b�-�+2����w~:5UB"ረg�D*}}�����������
dz�|��0��
�p��¼rHhq�c��0�S����Ԡ�z�"[۱g�	Хٖ�_��UU��bZ����ʹZ��q;�I�ʘ�Co$Si������/Y,GN\UU��ޒ�a�k���ͥ��av�<H�u�(�b]�azM�j�fcq�Z�2=�.0�
,�~))��{fq�qO#*;v���~�
{�A�w���v6�dQ[�
���	F)�8�l�	�X
fd_	#�����p��cpr�Aq�~}�f���ٺE�/��&���I�ǥ\?pc�p�Q#q{���i�dCE���K�	|�����ܚuK/��$�d�A8=��`�iڍ�Q�	 �x�X���^^پ`����t� ,�|Q"�ZQ����%3&BA�RmE���c���%K9\H㠌].�^Dl��al[�L1�\��Y-eQ0��HX�����X(�څ�1�`��]t�I���P��0�vQ����̵�>�Л]�$���⏂H��ʃW����:>�ᇻ��D��t8!n� ����$v���Ȁ$�f�?�<k�"�5���L�׳\�����v�Il��`�z��1te�pUA	8�v@1�ك�`QRF���>��+h��K��+���S��<i�?M\SJ�x�V�_�Hv��<�]��3�oɏ�E��꿟�[m�̤�+0R�ͩ�M����>��Y8!G*�}M8zY�Ƅ)!8�r>er���l*�QC<;�&�gv�X����%�IH7Cf���j�e^�[�s�M�M�!8�r���u;��QI����B׹8�,��q����� �/��C��-�7�ޜ���m0w񜞜�ܜ�N���&��B�j�}U��3�o���wJ�ά�l<��n�ΰ<���p�U���W��ch�eG����y�c� XW�.'^N)
=��W)��O[v���kv3����B?������V�st��-���6v�~�%�O9�lҮӍ�['�4�� ������G|<dϡc���D�ά��X�L
����X'�&�(^>��ص�S��:v8%#���e���}�Nn��e��V@|Ɍe�rc)u��z���VP�H�-/Z�K1�'��i�+�R�׍+��'^����z���\�%���]8G�bCJO
ln���MCeA�i<�Txf�6��;e=�����]���q�mc�)b�pŭe��ܤ���ԭ�3�sdܚ�7o����:��3���XG�n���K�
I`G	�.{V�#�A�
���!�ޘ�ٰ�vyd�)At z�q��N�Q��
!���&^�?E@�("sm�UL���nv/߽辉��OR'�������.L��N�*�P��/���I�D!lbQV4]�N�(U��:�D���ך�w����HG|��qY����G��d3	���݇���݊C-��D�A��	�:'
v�D�"a@��Ə"�B�Ɨ����M!6ԁ�����?Ը���g��尌��7	}�P_.����.q����,�SnwJ�Pm&�n�&�4~P���@���7��f[�z[�'�,QsXm��.�%�?*pY�;��׍���?�5q9
u���ߌ�C�wŁ�I�zn_�,��{���C�����9ُ�o��pL�5vB[�&؉avx��bB�}�@��O��s8�<�x�.IEND�B`�components/com_icagenda/liveupdate/assets/current-32.png000060400000003416152453623450017411 0ustar00�PNG


IHDR  szz�	pHYs���IDATX	ŖPT���}����쏷��n�!AM�a�C�$m"t��&hLm"�2��)���d���4�i���)�G�8qL�?�Ѡ�
��rY�Dx�xwo�}�dA4��zw��w�;s?�s��]D)�{ٸ{	g�.�V�0�t�-�ݺ������������
������u�u+�XwE܀���op��O�=�_����f��<P
��h�^o�+�*�g7��`sH��9�Dk(ay�'a,|�\�T���*����{��*ti��_����P�jI�`v~χ7�S�p�*(�~//bZ�����R~dJ�G�/���3ჴy�%Д���!>yU�2�̹��+ޠ��m�f85���?a*�:�A�rv�����_���l�^M�[��Y��M����3�RF^�����pj�tE�Z�Xo��?w<�Z�s��&Sq��г�Ϩ��[d�[�Y��p~��,c�3۔�x9�s���Vp�;��ȁ�,�9�����]9���ӯ�o���-{�h��e��Rli���;
���4�EF�"�Z��h�O2x�g�i�2R��$�k���@��@/������γ�~A���2�4��P-ږb��5��cCz��d�����\4�+"j���}Sc�[�7;s��/4��8s�.���f��MO�'~��Q�t;m�_E�#Z��PllX�M��u�̪D���s�(�?
��[<���^�N�����n�JInc�}40\�)c�s��:\�D8;}��ݠ�tgՓ�0v�Aq�c��o=�¨���{������J-FrX&��GDA�^Ψ"X|w��ڪXB�V�A�9�$ÿJ�+s��W+�a��y�|�#�`5Z���O��p�
�w3���5�kLzE|���,G���P�-KP̀a�0
�U�:)�
?�0ы�z��?\����lC�2I'xQ���~��`M�ȕc�|ח�n}1l��\�	#D2�S|��t.�e<8�	I3.�� UDE89R��\��w�靅��t���0�|P�#�`�h%�Z&qGS���S���E�Ů9��6��|�[k+2,Y����0q�Jqa�Phf�vr�J�� B	GB��`H	`�Ld�����i��1�r�l�p&$Z�r"�R�Po��]�$M'L�e8?��Q0b#�T֪�E'ѱ�%��s0L�"��b1+�#�7�9�N.���U42��b=��R�%�lB���Mzþ�-u�	�x������
�ȋ��H�"���L��a����^Q�Ty4��;=�
�F`��4����#��v}Y�d��Y��e�4H2@T���a���p��t������.*ȭ�,���LĬm�&뙈�sG*`XW��ɞO�MMaI��[�*���9�	V��?�Ow�qor�Xg>p|~�d�ݮ��YƲ����~�V��=��SZ�"��a����T��(��
����.���o�|���p��VB��i��G��D����r��/l�r��'�ď�A�}�]�θ]���W`��5(���N��j��|~S�s���U=;�R^�1�<}��}���źy�߅�ճ�Q�J����|αw��oz_�����s�~�?ï��EnA�5�;O�;�:}�:�FGm錄m�O�@p��Íc���w2�i����`Αl1<m�,�p�6�<�
]@w׼��IEND�B`�components/com_icagenda/liveupdate/assets/update-32.png000060400000003120152453623450017201 0ustar00�PNG


IHDR  szz�	pHYs��IDATX	�W[lU�Μ��K�Q�o�R"�b0��& �/ĤM|��'�>h�t��4���BbL4��'i����(!1�z#U
�Жnﻳ3��?��������̜�}����9����Z������Xu�9
Ӿ	%�L�Č�.���6';��DV6l@�p0
@~Hr��4�����Vo�PJ�Rml@2l��M�8�A	��Ri����c �TTA�T�P����B:�`#Ќ��~؋�	�%�"�\���F�<�-!c��f�Ad��Ԉ���p eY�(�����S�$���-�@�
a�+�$�bZ��5^�TgyM5�5)���NK���
l"	Y�-� R�f�R�00k8����D@��!2	k	����I� !]��Q�9P�(�EU~k"۰nk��������I���b#?��j?uc����p�<0=�l�m)�UC��xmI�h�%��N�~�	��#��U��P��n�:)=RO�H�<��Ⱦ;iu+`Aj&$�܆�E޳�B��ŝ �5R�2�Տo빼:�tv�
R��#��v9FD��`���2��@qGTm�@Ŷr��}Q
�G�<Պ�-}�Z��|�hM���"�<�'�(eR(�w	LE[���n!��^��+�1��U��u�=Mk��T��Gv)}��r�QBX⏂���X�kd��S�]�T�-�&��|`�Q���.�������`�S[v��7ٛwΘ�
�W��ptE��׌��1
	���%S�Jq޼��]�:V��҉r;K�	�˰�������P����s�^|����ܝHQn��e��"���f�i��q�Œ�t�K�x`+OE��Yքp� �D?F�	�VS�����E�`$a>6f�n?�s�=��[:�d�H0�H���ˎOt� g�8w���"�dO(�@Iج|v�S�K��(������1$��Z����PZ��$�>p�6�i�H��!	z1��F/C��6£/
<� �I���y㐴����п�XP���Lҁ�����(�$E_��~�mz]gU�$�I���yC�V����4к>�QA�T��!���l>��"�E�w/���[H�b�H�+�h{u��wX�z��2$s��B��U�qVPP���a]�x���9��B�I��/�/�3���N�4|[�\5r#�ZSꑱH�y�����2��J�c�
��$^�o;���'�BǞ�����M�s�Dg�Gϋ�y�1�>�.�D�o.X�$a��'f�R^�'��C�T�$1�e*M2LJ��oI�?��p����x��=�1�A<(�X�nc�_�a�|cN�w�[�_������p��F�@�DŽ��p�_U�$-V��J�|P^�$�a����	��i���=��C� �R�,,�[U�xY�D�J|��3xƜp�H�yzΘ���5+��@��.��o/����$>L6�XX�籽�	؅��c[±m'�:+0�j���D�DZ��wF��^-ʷ��k
xS�m��4�‚IEND�B`�components/com_icagenda/liveupdate/assets/ok-24.png000060400000002367152453623450016345 0ustar00�PNG


IHDR�w=�	pHYs���IDATH
��mLSW���mo�@h�ka����P4$(ʋ���ɾ��܊K�d#�`�lֲ����1gt&��e��0�`A	hGA���!Ph������K[/l��q�{�9���?��B�X�qü@z=�06†���_��#`��q��^8Nh��%B�G�9�����OGTd\a��~]�'@Myk��G�>D���sx'���y��;��lax����R��d��ٹŹ*+�`6<�\(�(WX�,��i(��*�V�?�5%��-�q�˲�ՉNٯ�N>NoN(T��01%n\�!�P��D8�D~֖$��i�0�p�X�I_�\�l8ה6��3ql
A����w@%<�ϠQ��X�@�i����Zve�fBR�D��,�g��R枦;;5���%�֦��݁�h�Wٗ��D���ӂ"��sP��b����z��o����D)mJd�^�e�NB�5�nPr�Z|ᴴ#�D����Lu��{�M/��d1�a#L�;�e@���_�ڲ�m����Z*��Q�N`h
	������ޘu-ա~�4��d��4��4�6Vm�{(�6����*P�C�<�5�ۏ^Ene;4����i(c�$7��7/�C��p�����.�;4��Iz)��l�?��xd>�e��d�lx&ɒ���qb�Upq�KMUfuSnZ�J�d�?F��N���B�vv�8�0p}��b���m�p�y��{f��:�C9�R�4��$Z�i�:��ް��P(��?n�.��8�u�t������t�!�|p9r'����N�{;���&����&��"JJˀ��al�dy³hZ2��F���H9~�w,�g,��"p�.�B�&U=��14+ӥ	�D.�ʧdZ�$a4��Q~��Jnv�K�v�;(E�nh���i"�܄��b3:52>Q?~e����j�875���@>	�:���[�n�&o�Zւ�X��Q��D��n�05��X,�*h>̅)���|n����a�L�|k��7CőG��_��}��?5��ozC�a=�����k�����[� �8Ru…+X�����Yj-�P�y�AU��{Ρ�B�F�?��q�X<I0>"���鍊����|2���b��/iG�2ar�3�1�����b��}�� ���GO�Z����]4��q�cIEND�B`�components/com_cache/helpers/cache.php000060400000002542152453623450014060 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_cache
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Cache component helper.
 *
 * @since  1.6
 */
class CacheHelper
{
	/**
	 * Get a list of filter options for the application clients.
	 *
	 * @return  array  An array of JHtmlOption elements.
	 *
	 * @deprecated  4.0  No replacement.
	 */
	public static function getClientOptions()
	{
		// Build the filter options.
		$options   = array();
		$options[] = JHtml::_('select.option', '0', JText::_('JSITE'));
		$options[] = JHtml::_('select.option', '1', JText::_('JADMINISTRATOR'));

		return $options;
	}

	/**
	 * Configure the Linkbar.
	 *
	 * @param   string  $vName  The name of the active view.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public static 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'
		);
	}
}
components/com_cache/views/purge/view.html.php000060400000002605152453623450015547 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_cache
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * HTML View class for the Cache component
 *
 * @since  1.6
 */
class CacheViewPurge extends JViewLegacy
{
	/**
	 * Display a view.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		JFactory::getApplication()->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');
	}
}
components/com_cache/views/purge/tmpl/default.xml000060400000000310152453623450016232 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_CACHE_PURGE_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_CACHE_PURGE_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_cache/views/purge/tmpl/default.php000060400000001261152453623450016227 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_cache
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>

<form action="<?php echo JRoute::_('index.php?option=com_cache&view=purge'); ?>" method="post" name="adminForm" id="adminForm">
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
	<p><?php echo JText::_('COM_CACHE_PURGE_INSTRUCTIONS'); ?></p>
	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_cache/views/cache/view.html.php000060400000004235152453623450015471 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_cache
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * HTML View class for the Cache component
 *
 * @since  1.6
 */
class CacheViewCache extends JViewLegacy
{
	/**
	 * @var object client object.
	 * @deprecated 4.0
	 */
	protected $client;

	protected $data;

	protected $pagination;

	protected $state;

	/**
	 * Display a view.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		$this->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');
	}
}
components/com_cache/views/cache/tmpl/default.xml000060400000000310152453623450016153 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_CACHE_CACHE_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_CACHE_CACHE_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_cache/views/cache/tmpl/default.php000060400000004766152453623450016165 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_cache
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('formbehavior.chosen', 'select');
JHtml::_('bootstrap.tooltip');

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>
<form action="<?php echo JRoute::_('index.php?option=com_cache'); ?>" method="post" name="adminForm" id="adminForm">
	<?php if (!empty($this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
	<?php else : ?>
	<div id="j-main-container">
	<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<?php if ($this->total > 0) : ?>
		<table class="table table-striped">
			<thead>
				<tr>
					<th width="1%" class="nowrap center">
						<?php echo JHtml::_('grid.checkall'); ?>
					</th>
					<th class="title nowrap">
						<?php echo JHtml::_('searchtools.sort', 'COM_CACHE_GROUP', 'group', $listDirn, $listOrder); ?>
					</th>
					<th width="5%" class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'COM_CACHE_NUMBER_OF_FILES', 'count', $listDirn, $listOrder); ?>
					</th>
					<th width="10%" class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'COM_CACHE_SIZE', 'size', $listDirn, $listOrder); ?>
					</th>
				</tr>
			</thead>
			<tfoot>
				<tr>
					<td colspan="4">
					<?php echo $this->pagination->getListFooter(); ?>
					</td>
				</tr>
			</tfoot>
			<tbody>
				<?php
				$i = 0;
				foreach ($this->data as $folder => $item) : ?>
					<tr class="row<?php echo $i % 2; ?>">
						<td>
							<input type="checkbox" id="cb<?php echo $i; ?>" name="cid[]" value="<?php echo $this->escape($item->group); ?>" onclick="Joomla.isChecked(this.checked);" />
						</td>
						<td>
							<label for="cb<?php echo $i; ?>">
								<strong><?php echo $this->escape($item->group); ?></strong>
							</label>
						</td>
						<td>
							<?php echo $item->count; ?>
						</td>
						<td>
							<?php echo JHtml::_('number.bytes', $item->size); ?>
						</td>
					</tr>
				<?php $i++; endforeach; ?>
			</tbody>
		</table>
		<?php endif; ?>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_cache/models/cache.php000060400000014544152453623450013706 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_cache
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\Utilities\ArrayHelper;

/**
 * Cache Model
 *
 * @since  1.6
 */
class CacheModelCache extends JModelList
{
	/**
	 * An Array of CacheItems indexed by cache group ID
	 *
	 * @var Array
	 */
	protected $_data = array();

	/**
	 * Group total
	 *
	 * @var integer
	 */
	protected $_total = null;

	/**
	 * Pagination object
	 *
	 * @var object
	 */
	protected $_pagination = null;

	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @since   3.5
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'group',
				'count',
				'size',
				'client_id',
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @param   string  $ordering   Field for ordering.
	 * @param   string  $direction  Direction of ordering.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function populateState($ordering = 'group', $direction = 'asc')
	{
		// Load the filter state.
		$this->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
		{
			$this->getCache()->clean($group);
		}
		catch (JCacheExceptionConnecting $exception)
		{
			return false;
		}
		catch (JCacheExceptionUnsupported $exception)
		{
			return false;
		}

		Factory::getApplication()->triggerEvent('onAfterPurge', array($group));

		return true;
	}

	/**
	 * 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
		{
			JFactory::getCache('')->gc();
		}
		catch (JCacheExceptionConnecting $exception)
		{
			return false;
		}
		catch (JCacheExceptionUnsupported $exception)
		{
			return false;
		}

		Factory::getApplication()->triggerEvent('onAfterPurge', array());

		return true;
	}
}
components/com_cache/models/forms/filter_cache.xml000060400000002630152453623450016403 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<field
		name="client_id"
		type="list"
		onchange="jQuery('#filter_search, select[id^=filter_], #list_fullordering').val('');this.form.submit();"
		filtermode="selector"
		>
		<option value="0">JSITE</option>
		<option value="1">JADMINISTRATOR</option>
	</field>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_CACHE_FILTER_SEARCH_LABEL"
			description="COM_CACHE_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
			noresults="JGLOBAL_NO_MATCHING_RESULTS"
		/>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="group ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="group ASC">COM_CACHE_HEADING_GROUP_ASC</option>
			<option value="group DESC">COM_CACHE_HEADING_GROUP_DESC</option>
			<option value="count ASC">COM_CACHE_HEADING_COUNT_ASC</option>
			<option value="count DESC">COM_CACHE_HEADING_COUNT_DESC</option>
			<option value="size ASC">COM_CACHE_HEADING_SIZE_ASC</option>
			<option value="size DESC">COM_CACHE_HEADING_SIZE_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			label="JGLOBAL_LIMIT"
			description="JGLOBAL_LIMIT"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_cache/controller.php000060400000007607152453623450013545 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_cache
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Cache Controller
 *
 * @since  1.6
 */
class CacheController extends JControllerLegacy
{
	/**
	 * 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  JController  This object to support chaining.
	 *
	 * @since   1.5
	 */
	public function display($cachable = false, $urlparams = false)
	{
		JLoader::register('CacheHelper', JPATH_ADMINISTRATOR . '/components/com_cache/helpers/cache.php');

		// Get the document object.
		$document = JFactory::getDocument();

		// Set the default view name and format from the Request.
		$vName   = $this->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
		$this->checkToken();

		$cid = (array) $this->input->post->get('cid', array(), 'string');

		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
		$this->checkToken();

		$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');
		}

		$app->triggerEvent('onAfterPurge', array());
		$this->setRedirect('index.php?option=com_cache&view=cache');
	}

	/**
	 * Purge the cache.
	 *
	 * @return  void
	 */
	public function purge()
	{
		// Check for request forgeries
		$this->checkToken();

		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');
	}
}
components/com_cache/cache.xml000060400000001642152453623450012427 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_cache</name>
	<author>Joomla! Project</author>
	<creationDate>April 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_CACHE_XML_DESCRIPTION</description>
	<administration>
		<files folder="admin">
			<filename>cache.php</filename>
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<folder>models</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_cache.ini</language>
			<language tag="en-GB">language/en-GB.com_cache.sys.ini</language>
		</languages>
	</administration>
</extension>

components/com_cache/cache.php000060400000001061152453623450012411 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_cache
 *
 * @copyright   (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

if (!JFactory::getUser()->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();
components/com_cache/config.xml000060400000000537152453623450012633 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
		>
		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			filter="rules"
			validate="rules"
			component="com_cache"
			section="component" />
	</fieldset>
</config>
components/com_cache/access.xml000060400000000474152453623450012627 0ustar00<?xml version="1.0" encoding="utf-8" ?>
<access component="com_cache">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
	</section>
</access>
components/com_acymailing/index.html000060400000000054152453623450013705 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/controllers/file.php000060400000017372152453623450015721 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class FileController extends acymailingController{
	
	function language(){
		acymailing_setVar('layout', 'language');
		return parent::display();
	}

	function save(){
		acymailing_checkToken();

		$this->_savelanguage();
		return $this->language();
	}

	function savecss(){
		if(!$this->isAllowed('configuration', 'manage')) return;
		acymailing_checkToken();

		$file = acymailing_getVar('cmd', 'file');
		if(!preg_match('#^([-a-z0-9]*)_([-_a-z0-9]*)$#i', $file, $result)){
			acymailing_display('Could not load the file '.$file.' properly');
			exit;
		}
		$type = $result[1];
		$fileName = $result[2];

		

		$path = ACYMAILING_MEDIA.'css'.DS.$type.'_'.$fileName.'.css';
		$csscontent = acymailing_getVar('string', 'csscontent');

		$alreadyExists = file_exists($path);

		if(acymailing_writeFile($path, $csscontent)){
			acymailing_enqueueMessage(acymailing_translation('JOOMEXT_SUCC_SAVED'), 'success');
			$varName = acymailing_getVar('cmd', 'var');
			if(!$alreadyExists){
				$js = "var optn = document.createElement(\"OPTION\");
						optn.text = '$fileName'; optn.value = '$fileName';
						mydrop = window.top.document.getElementById('".$varName."_choice');
						mydrop.options.add(optn);
						lastid = 0; while(mydrop.options[lastid+1]){lastid = lastid+1;} mydrop.selectedIndex = lastid;
						window.top.updateCSSLink('".$varName."','$type','$fileName');";
				acymailing_addScript(true, $js);
			}
			$config = acymailing_config();
			$newConfig = new stdClass();
			$newConfig->$varName = $fileName;
			$config->save($newConfig);
		}else{
			acymailing_enqueueMessage(acymailing_translation_sprintf('FAIL_SAVE', $path), 'error');
		}

		return $this->css();
	}

	function css(){
		acymailing_setVar('layout', 'css');
		return parent::display();
	}

	function latest(){
		return $this->language();
	}

	function send(){
		if(!$this->isAllowed('configuration', 'manage')) return;
		acymailing_checkToken();

		$bodyEmail = acymailing_getVar('string', 'mailbody');
		$code = acymailing_getVar('cmd', 'code');
		acymailing_setVar('code', $code);

		if(empty($code)) return;

		

		$config = acymailing_config();
		$mailer = acymailing_get('helper.mailer');
		$mailer->Subject = '[ACYMAILING LANGUAGE FILE] '.$code;
		$mailer->Body = 'The website '.ACYMAILING_LIVE.' using AcyMailing '.$config->get('level').' '.$config->get('version').' sent a language file : '.$code;
		$mailer->Body .= "\n"."\n"."\n".$bodyEmail;

		$extrafile = acymailing_getLanguagePath(ACYMAILING_ROOT, $code).DS.$code.'.com_acymailing_custom.ini';

		if(file_exists($extrafile)){
			$mailer->Body .= "\n"."\n"."\n".'Custom content:'."\n".file_get_contents($extrafile);
		}
		$mailer->AddAddress(acymailing_currentUserEmail(), acymailing_currentUserName());
		$mailer->AddAddress('translate@acyba.com', 'Acyba Translation Team');
		$mailer->report = false;

		$path = acymailing_cleanPath(acymailing_getLanguagePath(ACYMAILING_ROOT, $code).DS.$code.'.com_acymailing.ini');
		$mailer->AddAttachment($path);

		$result = $mailer->Send();
		if($result){
			acymailing_display(acymailing_translation('THANK_YOU_SHARING'), 'success');
			acymailing_display($mailer->reportMessage, 'success');
		}else{
			acymailing_display($mailer->reportMessage, 'error');
		}
	}

	function share(){
		if(!$this->isAllowed('configuration', 'manage')) return;
		acymailing_checkToken();

		if($this->_savelanguage()){
			acymailing_setVar('layout', 'share');
			return parent::display();
		}else{
			return $this->language();
		}
	}

	function _savelanguage(){
		if(!$this->isAllowed('configuration', 'manage')) return;
		acymailing_checkToken();
		
		$code = acymailing_getVar('cmd', 'code');
		acymailing_setVar('code', $code);
		$content = acymailing_getVar('string', 'content', '', '', ACY_ALLOWHTML);
		$content = str_replace('</textarea>', '', $content);

		if(empty($code) || empty($content)) return;

		$path = acymailing_getLanguagePath(ACYMAILING_ROOT, $code).DS.$code.'.com_acymailing.ini';
		$result = acymailing_writeFile($path, $content);
		if($result){
			acymailing_enqueueMessage(acymailing_translation('JOOMEXT_SUCC_SAVED'), 'success');
			$js = "window.top.document.getElementById('image$code').className = 'acyicon-edit'";
			acymailing_addScript(true, $js);

			$updateHelper = acymailing_get('helper.update');
			$updateHelper->installMenu($code);
		}else{
			acymailing_enqueueMessage(acymailing_translation_sprintf('FAIL_SAVE', $path), 'error');
		}

		$customcontent = acymailing_getVar('string', 'customcontent', '', '', ACY_ALLOWHTML);
		$customcontent = str_replace('</textarea>', '', $customcontent);
		$custompath = acymailing_getLanguagePath(ACYMAILING_ROOT, $code).DS.$code.'.com_acymailing_custom.ini';
		$customresult = acymailing_writeFile($custompath, $customcontent);
		if(!$customresult) acymailing_enqueueMessage(acymailing_translation_sprintf('FAIL_SAVE', $custompath), 'error');

		if($code == acymailing_getLanguageTag()) acymailing_loadLanguage();

		return $result;
	}

	function installLanguages($ajax = true){
		$messagesMethod = $ajax ? 'acymailing_display' : 'acymailing_enqueueMessage';

		$languages = acymailing_getVar('string', 'languages');
		ob_start();
		$languagesContent = acymailing_fileGetContent(ACYMAILING_UPDATEURL.'loadLanguages&json=1&codes='.$languages);
		$warnings = ob_get_clean();
		if(!empty($warnings) && acymailing_isDebug()) echo $warnings;

		if(empty($languagesContent)){
			$messagesMethod('Could not load the language files from our server, you can update them in the AcyMailing configuration page, tab "Languages" or start your own translation and share it', 'error');
			if($ajax) exit;
			else return;
		}

		$decodedLanguages = json_decode($languagesContent, true);

		$updateHelper = acymailing_get('helper.update');
		$success = array();
		$error = array();

		foreach($decodedLanguages as $code => $content){
			if(empty($content)){
				$error[] = 'The language '.$code.' was not found on our server, you can start your own translation in the AcyMailing configuration page, tab "Languages" then share it';
				continue;
			}

			if(acymailing_writeFile(acymailing_getLanguagePath(ACYMAILING_ROOT, $code).DS.$code.'.com_acymailing.ini', $content)){
				$updateHelper->installMenu($code);
				$success[] = 'Successfully installed language: '.$code;
			}else{
				$error[] = acymailing_translation_sprintf('FAIL_SAVE', $code.'.com_acymailing.ini');
			}
		}

		if(!empty($success)) $messagesMethod($success, 'success');
		if(!empty($error)) $messagesMethod($error, 'error');
		if($ajax) exit;
	}

	function select(){
		acymailing_setVar('layout', 'select');
		return parent::display();
	}

	function downloadAcySMS(){
		$headers = get_headers('https://www.acyba.com/download-area/download/component-acysms/level-express.html',1);
		$package = acymailing_fileGetContent('https://www.acyba.com/download-area/download/component-acysms/level-express.html');
		if(empty($headers['Content-Disposition']) || empty($package)) exit;

		$fileName = strpos($headers['Content-Disposition'], '.zip') === false ? 'com_acysms.tar.gz' : 'com_acysms.zip';
		if(acymailing_writeFile(ACYMAILING_ROOT.'tmp'.DS.'acysms'.DS.$fileName, $package) && acymailing_extractArchive(ACYMAILING_ROOT.'tmp'.DS.'acysms'.DS.$fileName, ACYMAILING_ROOT.'tmp'.DS.'acysms')) echo 'success';

		exit;
	}

	function installPackage(){
		if(!ACYMAILING_J16) include_once(ACYMAILING_ROOT.'libraries'.DS.'joomla'.DS.'installer'.DS.'installer.php');
		
		$installer = JInstaller::getInstance();

		if($installer->install(ACYMAILING_ROOT.'tmp'.DS.'acysms')){
			acymailing_deleteFolder(ACYMAILING_ROOT.'tmp'.DS.'acysms');
			echo 'success';
		}

		exit;
	}
}
components/com_acymailing/controllers/toggle.php000060400000031321152453623450016251 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class ToggleController extends acymailingController{

	var $allowedTablesColumn = array();
	var $deleteColumns = array();

	function __construct($config = array()){
		parent::__construct($config);
		$this->registerDefaultTask('toggle');
		$this->allowedTablesColumn['list'] = array('published' => 'listid', 'visible' => 'listid');
		$this->allowedTablesColumn['action'] = array('published' => 'action_id');
		$this->allowedTablesColumn['subscriber'] = array('confirmed' => 'subid', 'html' => 'subid', 'enabled' => 'subid');
		$this->allowedTablesColumn['template'] = array('published' => 'tempid', 'premium' => 'tempid');
		$this->allowedTablesColumn['mail'] = array('published' => 'mailid', 'visible' => 'mailid');
		$this->allowedTablesColumn['listsub'] = array('status' => 'listid,subid');
		$this->allowedTablesColumn['plugins'] = array('published' => 'id');
		$this->allowedTablesColumn['followup'] = array('add' => 'mailid', 'addall' => 'mailid', 'update' => 'mailid');
		$this->allowedTablesColumn['rules'] = array('published' => 'ruleid');
		$this->allowedTablesColumn['filter'] = array('published' => 'filid');
		$this->allowedTablesColumn['fields'] = array('published' => 'fieldid', 'required' => 'fieldid', 'frontcomp' => 'fieldid', 'backend' => 'fieldid', 'listing' => 'fieldid', 'frontlisting' => 'fieldid', 'frontjoomlaregistration' => 'fieldid', 'frontjoomlaprofile' => 'fieldid', 'joomlaprofile' => 'fieldid', 'frontform' => 'fieldid');
		$this->allowedTablesColumn['config'] = array('addindex' => 'namekey', 'guessport' => 'port');
		$this->deleteColumns['queue'] = array('subid', 'mailid');
		$this->deleteColumns['filter'] = array('filid', 'filid');
		$this->deleteColumns['rules'] = array('ruleid', 'ruleid');
		header('Cache-Control: no-store, no-cache, must-revalidate');
		header('Cache-Control: post-check=0, pre-check=0', false);
		header('Pragma: no-cache');
	}

	function toggle(){
		acymailing_checkToken();

		$completeTask = acymailing_getVar('cmd', 'task');
		$task = substr($completeTask, 0, strpos($completeTask, '_'));
		$elementId = substr($completeTask, strpos($completeTask, '_') + 1);

		$value = acymailing_getVar('int', 'value', '0', '');
		$table = acymailing_getVar('word', 'table', '', '');

		if(empty($this->allowedTablesColumn[$table]) || empty($this->allowedTablesColumn[$table][$task])) exit;
		$pkey = $this->allowedTablesColumn[$table][$task];
		if(empty($pkey)) exit;

		$function = $table.$task;
		if(method_exists($this, $function)){
			$this->$function($elementId, $value);
		}else{
			acymailing_query('UPDATE '.acymailing_table($table).' SET '.$task.' = '.$value.' WHERE '.$pkey.' = '.intval($elementId).' LIMIT 1');
		}

		$toggleClass = acymailing_get('helper.toggle');
		$extra = acymailing_getVar('array', 'extra', array(), '');
		if(!empty($extra)){
			foreach($extra as $key => $val){
				$extra[$key] = urldecode($val);
			}
		}
		echo $toggleClass->toggle(acymailing_getVar('cmd', 'task', ''), $value, $table, $extra);
		exit;
	}

	function configguessport($port, $value){
		if(!function_exists('fsockopen')){
			echo '<span style="color:red">fsockopen is not enabled, please contact your hosting company to enable it</span>';
			exit;
		}

		$tests = array(25 => 'smtp.sendgrid.com', 2525 => 'smtp.sendgrid.com', 587 => 'smtp.sendgrid.com', 465 => 'ssl://smtp.sendgrid.com');
		$total = 0;
		foreach($tests as $port => $server){
			$fp = @fsockopen($server, $port, $errno, $errstr, 5);
			if($fp){
				echo '<br /><span style="color:green" >Port <b>'.$port.'</b> OK</span>';
				fclose($fp);
				$total++;
			}else{
				echo '<br /><span style="color:red" >Port <b>'.$port.'</b> not opened on your server ';
				echo " errornum: ".$errno.' : '.$errstr;
				echo '</span>';
			}
		}
		if(empty($total)){
		}

		exit;
	}

	function testApiKey(){
		$apiKey = acymailing_getVar('string', 'value', '');
		if(empty($apiKey)){
			echo '<span style="color:red">No API key</span><br />';
			exit;
		}

		$classGeoloc = acymailing_get('class.geolocation');
		$test = $classGeoloc->testApiKey($apiKey);

		if(!empty($test) && $test->statusCode == 'OK'){ // Works fine
			echo '<span style="color:green" >API key OK : '.$test->countryName.' - '.$test->cityName.'</span>';
		}else if(!empty($test) && $test->statusCode == 'noReturn'){ // No return from the API, displaying the IP used for test and errors if there are any
			echo '<span style="color:red" >Error calling IPInfoDB API with IP : '.$test->ip.'</span><br />';
			if(!empty($test->errorAPI)) echo '<span style="color:red" >Details : '.$test->errorAPI.'</span>';
		}else{ // There is a return from the API but with an error status: display the content received to identify the pb
			echo '<span style="color:red" >Error returned from the API:<br /><br />';
			foreach($test as $key => $value){
				echo $key.' : '.$value.'<br />';
			}
			echo '</span>';
		}
		exit;
	}

	function configaddindex($table, $value){
		$queries = array();
		$queries['listsub'] = array('ALTER TABLE `#__acymailing_listsub` ADD INDEX `subidindex` ( `subid` )');
		$queries['listsub'][] = 'ALTER TABLE `#__acymailing_listsub` ADD INDEX `listidstatusindex` ( `listid` , `status` )';

		$queries['stats'] = array('ALTER TABLE `#__acymailing_stats` ADD INDEX `senddateindex` ( `senddate` )');

		$queries['list'] = array('ALTER TABLE `#__acymailing_list` ADD INDEX `typeorderingindex` ( `type` , `ordering` ) ');
		$queries['list'][] = 'ALTER TABLE `#__acymailing_list` ADD INDEX `useridindex` ( `userid` ) ';
		$queries['list'][] = 'ALTER TABLE `#__acymailing_list` ADD INDEX `typeuseridindex` ( `type` , `userid` ) ';

		$queries['mail'] = array('ALTER TABLE `#__acymailing_mail` ADD INDEX `typemailidindex` ( `type` , `mailid` )');
		$queries['mail'][] = 'ALTER TABLE `#__acymailing_mail` ADD INDEX `useridindex` ( `userid` )';

		$queries['userstats'] = array('ALTER TABLE `#__acymailing_userstats` ADD INDEX `senddateindex` ( `senddate` )');
		$queries['userstats'][] = 'ALTER TABLE `#__acymailing_userstats` ADD INDEX `subidindex` ( `subid` )';

		$queries['urlclick'] = array('ALTER TABLE `#__acymailing_urlclick` ADD INDEX `dateindex` ( `date` )');
		$queries['urlclick'][] = 'ALTER TABLE `#__acymailing_urlclick` ADD INDEX `mailidindex` ( `mailid` )';
		$queries['urlclick'][] = 'ALTER TABLE `#__acymailing_urlclick` ADD INDEX `subidindex` ( `subid` ) ';

		$queries['history'] = array('ALTER TABLE `#__acymailing_history` ADD INDEX `dateindex` ( `date` )');
		$queries['history'][] = 'ALTER TABLE `#__acymailing_history` ADD INDEX `actionindex` ( `action` , `mailid` ) ';

		$queries['template'] = array('ALTER TABLE `#__acymailing_template` ADD INDEX `orderingindex` ( `ordering` )');

		$queries['queue'] = array('ALTER TABLE `#__acymailing_queue` ADD INDEX `orderingindex` ( `priority` , `senddate` , `subid` )');
		$queries['queue'][] = 'ALTER TABLE `#__acymailing_queue` ADD INDEX `listingindex` ( `senddate` , `subid` )';
		$queries['queue'][] = 'ALTER TABLE `#__acymailing_queue` ADD INDEX `mailidindex` ( `mailid` )';

		$queries['subscriber'] = array('ALTER TABLE `#__acymailing_subscriber` ADD INDEX `queueindex` ( `enabled` , `accept` , `confirmed` )');

		if(empty($queries[$table])){
			echo 'No optimization found...';
			exit;
		}

		$indexOk = 0;
		echo '<span style="color:purple">| ';
		foreach($queries[$table] as $oneQuery){
			try{
				$isError = acymailing_query($oneQuery);
			}catch(Exception $e){
				$isError = null;
			}
			if($isError === null){
				echo isset($e) ? $e->getMessage() : substr(strip_tags(acymailing_getDBError()), 0, 200).'...';
			}else{
				$indexOk++;
			}
		}
		if(!empty($indexOk)) echo $indexOk.' indexes added | ';
		echo '</span>';

		$config = acymailing_config();
		$newConfig = new stdClass();
		$val = 'optimize_'.$table;
		$newConfig->$val = 1;
		$config->save($newConfig);

		exit;
	}

	function followupaddall($mailid, $value){
		$mailClass = acymailing_get('class.mail');
		$nbinserted = $mailClass->addFollowUpQueue($mailid, true);
		if($nbinserted !== false){
			echo acymailing_translation_sprintf('ADDED_QUEUE', $nbinserted);
		}else{
			echo implode(',', $mailClass->errors);
		}
		exit;
	}

	function followupadd($mailid, $value){
		$mailClass = acymailing_get('class.mail');
		$nbinserted = $mailClass->addFollowUpQueue($mailid, false);
		if($nbinserted !== false){
			echo acymailing_translation_sprintf('ADDED_QUEUE', $nbinserted);
		}else{
			echo implode(',', $mailClass->errors);
		}
		exit;
	}

	function followupupdate($mailid, $value){
		$mailClass = acymailing_get('class.mail');
		$followup = $mailClass->get($mailid);
		if(empty($followup->mailid)){
			echo 'Could not load mailid '.$mailid;
			exit;
		}

		$listmailClass = acymailing_get('class.listmail');
		$mycampaign = $listmailClass->getCampaign($followup->mailid);
		if(empty($mycampaign->listid)){
			echo 'Could not get the attached campaign';
			exit;
		}

		$query = 'UPDATE #__acymailing_queue as a ';
		$query .= 'LEFT JOIN #__acymailing_listsub as b ON a.subid = b.subid AND b.listid = '.$mycampaign->listid;
		$query .= ' SET a.`senddate` = b.`subdate` + '.$followup->senddate;
		$query .= ' WHERE a.mailid = '.$followup->mailid;
		$nbupdated = acymailing_query($query);

		if(!empty($nbupdated)){
			$campaignHelper = acymailing_get('helper.campaign');
			$campaignHelper->updateUnsubdate($mycampaign->listid, $followup->senddate);
		}

		echo acymailing_translation_sprintf('NB_EMAILS_UPDATED', $nbupdated);
		exit;
	}

	function delete(){
		$value = acymailing_getVar('cmd', 'value');
		if(strpos($value, '_') === false) exit;
		list($value1, $value2) = explode('_', $value);
		$table = acymailing_getVar('word', 'table', '', '');
		if(empty($table)) exit;

		$function = 'delete'.$table;
		if(method_exists($this, $function)){
			$this->$function($value1, $value2);
			exit;
		}

		if(empty($this->deleteColumns[$table])) exit;

		list($key1, $key2) = $this->deleteColumns[$table];

		if(empty($key1) || empty($key2) || empty($value1) || empty($value2)) exit;

		acymailing_query('DELETE FROM '.acymailing_table($table).' WHERE '.$key1.' = '.intval($value1).' AND '.$key2.' = '.intval($value2));

		exit;
	}

	function deleteconfig($namekey, $val){
		$config = acymailing_config();
		$newConfig = new stdClass();
		$newConfig->$namekey = $val;
		$config->save($newConfig);
	}

	function deletefollowup($campaignid, $mailid){
		acymailing_checkToken();

		$mailClass = acymailing_get('class.mail');
		$mailClass->delete((int)$mailid);
	}

	function deleteMail($mailid, $attachid){
		acymailing_checkToken();

		$mailid = intval($mailid);
		if(empty($mailid)) return false;

		$attachment = acymailing_loadResult('SELECT attach FROM '.acymailing_table('mail').' WHERE mailid = '.$mailid.' LIMIT 1');
		if(empty($attachment)) return;
		$attach = unserialize($attachment);

		unset($attach[$attachid]);
		$attachdb = serialize($attach);

		return acymailing_query('UPDATE '.acymailing_table('mail').' SET attach = '.acymailing_escapeDB($attachdb).' WHERE mailid = '.$mailid.' LIMIT 1');
	}

	function deleteFavicon($mailid, $favicon){
		acymailing_checkToken();

		if($favicon != 'favicon') return;

		$mailid = intval($mailid);
		if(empty($mailid)) return false;

		return acymailing_query('UPDATE '.acymailing_table('mail').' SET favicon = "" WHERE mailid = '.$mailid.' LIMIT 1');
	}

	function subscriberconfirmed($subid, $value){
		if(!empty($value)){
			$subscriberClass = acymailing_get('class.subscriber');
			$subscriberClass->confirmSubscription($subid);
		}else{
			acymailing_query('UPDATE '.acymailing_table('subscriber').' SET confirmed = '.$value.' WHERE subid = '.intval($subid).' LIMIT 1');
		}
	}

	function listsubstatus($ids, $status){

		list($listid, $subid) = explode('_', $ids);
		$listid = (int)$listid;
		$subid = (int)$subid;

		if(empty($subid) OR empty($listid)) exit;
		$listSubClass = acymailing_get('class.listsub');
		$lists = array();
		$lists[$status] = array($listid);
		if($listSubClass->updateSubscription($subid, $lists)) return;

		echo 'error while updating the subscription';
	}

	function pluginspublished($id, $publish){
		acymailing_checkToken();

		if(!ACYMAILING_J16){
			acymailing_query('UPDATE '.acymailing_table('plugins', false).' SET `published` = '.intval($publish).' WHERE `id` = '.intval($id).' AND (`folder` = \'acymailing\' OR `name` LIKE \'%acymailing%\' OR `element` LIKE \'%acymailing%\') LIMIT 1');
		}else{
			acymailing_query('UPDATE `#__extensions` SET `enabled` = '.intval($publish).' WHERE `extension_id` = '.intval($id).' AND (`folder` = \'acymailing\' OR `name` LIKE \'%acymailing%\' OR `element` LIKE \'%acymailing%\') LIMIT 1');
		}

		$updateHelper = acymailing_get('helper.update');
		$updateHelper->cleanPluginCache();
	}
}
components/com_acymailing/controllers/stats.php000060400000030413152453623450016127 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class StatsController extends acymailingController{

	var $aclCat = 'statistics';

	function detaillisting(){
		if(!$this->isAllowed('statistics','manage')) return;
		acymailing_setVar( 'layout', 'detaillisting'  );
		return parent::display();
	}

	function unsubscribed(){
		if(!$this->isAllowed('statistics','manage')) return;
		acymailing_setVar( 'layout', 'unsubscribed'  );
		return parent::display();
	}

	function forward(){
		if(!$this->isAllowed('statistics','manage')) return;
		acymailing_setVar( 'layout', 'forward'  );
		return parent::display();
	}

	function unsubchart(){
		if(!$this->isAllowed('statistics','manage')) return;
		acymailing_setVar( 'layout', 'unsubchart'  );
		return parent::display();
	}

	function mailinglist(){
		if(!$this->isAllowed('statistics','manage')) return;
		acymailing_setVar( 'layout', 'mailinglist'  );
		return parent::display();
	}

	function remove(){
		if(!$this->isAllowed('statistics','delete')) return;
		acymailing_checkToken();

		$cids = acymailing_getVar('array',  'cid', array(), '');

		$class = acymailing_get('class.stats');
		$num = $class->delete($cids);

		acymailing_enqueueMessage(acymailing_translation_sprintf('SUCC_DELETE_ELEMENTS',$num), 'message');

		return $this->listing();
	}

	function export(){
		$selectedMail = acymailing_getVar('int', 'filter_mail', 0);
		$selectedStatus = acymailing_getVar('string', 'filter_status', '');
		$selectedBounce = acymailing_getVar('string', 'filter_bounce', '');

		$filters = array();
		if(!empty($selectedMail)) $filters[] = 'userstats.mailid = '.$selectedMail;
		if(!empty($selectedStatus)){
			if($selectedStatus == 'bounce') $filters[] = 'userstats.bounce > 0';
			elseif($selectedStatus == 'open') $filters[] = 'userstats.open > 0';
			elseif($selectedStatus == 'notopen') $filters[] = 'userstats.open < 1';
			elseif($selectedStatus == 'failed') $filters[] = 'userstats.fail > 0';
		}
		if(!empty($selectedStatus) && $selectedStatus == 'bounce' && !empty($selectedBounce)) $filters[] = "userstats.bouncerule = ".acymailing_escapeDB($selectedBounce);

		$query = 'FROM `#__acymailing_userstats` as userstats JOIN `#__acymailing_subscriber` as s ON s.subid = userstats.subid';
		if(!empty($filters)) $query .= ' WHERE ('.implode(') AND (',$filters).')';

		acymailing_session();
		$_SESSION['acymailing']['acyexportquery'] = $query;

		acymailing_redirect(acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'data&task=export&sessionquery=1', acymailing_isNoTemplate(),true));
	}

	public function exportUnsubscribed(){
		return $this->exportData('unsubscribed');
	}


	public function exportForward(){
		return $this->exportData('forward');
	}

	private function exportData($action){
		$selectedMail = acymailing_getVar('int', 'filter_mail', 0);
		$filters = array();
		$filters[] = "hist.action = ".acymailing_escapeDB($action);
		if(!empty($selectedMail)) $filters[] = 'hist.mailid = '.intval($selectedMail);

		$query = 'FROM #__acymailing_history as hist JOIN #__acymailing_mail as b on hist.mailid = b.mailid JOIN #__acymailing_subscriber as s on hist.subid = s.subid';
		if(!empty($filters)) $query .= ' WHERE ('.implode(') AND (',$filters).')';

		acymailing_session();
		$_SESSION['acymailing']['acyexportquery'] = $query;
		
		acymailing_redirect(acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'data&task=export&sessionquery=1',true,true));
	}

	function exportglobal(){
		$extraJoin = '';
		$nlCondition = array();
		$cids = acymailing_getVar('none', 'cid');
		acymailing_arrayToInteger($cids);
		if(!empty($cids)){
			$nlCondition[] = 'a.mailid IN (' . implode(', ', $cids) . ')';
		}elseif (!acymailing_isAdmin()) {
			$listClass = acymailing_get('class.list');
			$lists = $listClass->getFrontendLists('listid');

			$frontListsIds = array_keys($lists);
			$extraJoin = " JOIN #__acymailing_listmail AS lm ON a.mailid = lm.mailid";
			$filters[] = 'lm.listid IN (' . implode(',', $frontListsIds) . ')';
		}

		$query = 'SELECT b.subject, a.senddate, a.* , a.bouncedetails 
					FROM #__acymailing_stats AS a 
					JOIN #__acymailing_mail AS b ON a.mailid = b.mailid '.$extraJoin;
		if(!empty($nlCondition)) $query .= ' WHERE '.implode(' AND ', $nlCondition);
		$query .= ' ORDER BY a.senddate DESC';
		
		$mydata = acymailing_loadObjectList($query);

		$exportHelper = acymailing_get('helper.export');
		$config = acymailing_config();
		$encodingClass = acymailing_get('helper.encoding');
		$exportHelper->addHeaders('globalStatistics_' . date('m_d_y'));

		$eol= "\r\n";
		$before = '"';
		$separator = '"'.str_replace(array('semicolon','comma'),array(';',','), $config->get('export_separator',';')).'"';
		$exportFormat = $config->get('export_format','UTF-8');
		$after = '"';

		$forwardEnabled = $config->get('forward', 0);
		$titles = array(acymailing_translation( 'JOOMEXT_SUBJECT'), acymailing_translation( 'SEND_DATE' ), acymailing_translation( 'OPEN_UNIQUE' ), acymailing_translation('OPEN_TOTAL'), acymailing_translation('OPEN').' (%)');
		if(acymailing_level(1)) array_push($titles, acymailing_translation('UNIQUE_HITS'), acymailing_translation('TOTAL_HITS'), acymailing_translation( 'CLICKED_LINK' ).' (%)');
		array_push($titles, acymailing_translation( 'UNSUBSCRIBE' ), acymailing_translation( 'UNSUBSCRIBE' ).' (%)');
		if(acymailing_level(1) && $forwardEnabled == 1) array_push($titles, acymailing_translation( 'FORWARDED' ));
		array_push($titles, acymailing_translation( 'SENT_HTML' ), acymailing_translation( 'SENT_TEXT' ));
		if(acymailing_level(3))  array_push($titles,acymailing_translation( 'BOUNCES' ), acymailing_translation( 'BOUNCES' ).' (%)');
		array_push($titles, acymailing_translation( 'FAILED' ), acymailing_translation( 'ACY_ID' ));

		$titleLine = $before.implode($separator, $titles).$after.$eol;
		echo $titleLine;

		foreach($mydata as $nl){
			$line = $nl->subject . $separator;
			$line.= acymailing_getDate($nl->senddate) . $separator;
			$line.= $nl->openunique . $separator;
			$line.= $nl->opentotal . $separator;
			$cleanSent = $nl->senthtml + $nl->senttext;
			if(acymailing_level(3)) $cleanSent = $cleanSent - $nl->bounceunique;
			$prct = (!empty($cleanSent)? round($nl->openunique/$cleanSent*100,2):'-');
			$line.= $prct . '%' . $separator;
			if(acymailing_level(1)){
				$line.= $nl->clickunique . $separator;
				$line.= $nl->clicktotal . $separator;
				$prct = (!empty($cleanSent)? round($nl->clickunique/$cleanSent*100,2):'-');
				$line.= $prct . '%' . $separator;
			}
			$line.= $nl->unsub . $separator;
			$prct = (!empty($cleanSent)? round($nl->unsub/$cleanSent*100,2):'-');
			$line.= $prct . '%' . $separator;
			if(acymailing_level(1) && $forwardEnabled == 1){
				$line.= $nl->forward . $separator;
			}
			$line.= $nl->senthtml . $separator;
			$line.= $nl->senttext . $separator;
			if(acymailing_level(3)){
				$line.= $nl->bounceunique . $separator;
				$prct = (!empty($nl->senthtml)? round($nl->bounceunique/($nl->senthtml+$nl->senttext)*100,2):'-');
				$line.= $prct . '%' . $separator;
			}
			$line.= $nl->fail . $separator;
			$line.= $nl->mailid;

			$line = $before.$encodingClass->change($line, 'UTF-8', $exportFormat).$after.$eol;
			echo $line;
		}
		exit;
	}

	function compare(){
		if(!$this->isAllowed('statistics','manage')) return;

		$ids = acymailing_getVar('array', 'cid', array(), '');
		acymailing_arrayToInteger($ids);

		if(empty($_SESSION['acycomparison'])){
			$_SESSION['acycomparison'] = $ids;
		}else{
			$_SESSION['acycomparison'] = array_unique(array_merge($_SESSION['acycomparison'], $ids));
		}

		if(count($_SESSION['acycomparison']) > 5){
			acymailing_enqueueMessage(acymailing_translation('ACY_MAX_COMPARE'), 'warning');
			$_SESSION['acycomparison'] = array_slice($_SESSION['acycomparison'], 0, 5);
		}elseif(count($_SESSION['acycomparison']) < 2){
			acymailing_enqueueMessage(acymailing_translation('ACY_MIN_COMPARE'), 'info');
			acymailing_setVar( 'layout', 'listing'  );
			return parent::display();
		}

		acymailing_setVar( 'layout', 'compare'  );
		return parent::display();
	}

	function addcompare(){
		if(!$this->isAllowed('statistics','manage')) return;

		$ids = acymailing_getVar('array', 'cid', array(), '');
		acymailing_arrayToInteger($ids);

		if(empty($_SESSION['acycomparison'])){
			$_SESSION['acycomparison'] = $ids;
		}else{
			$_SESSION['acycomparison'] = array_unique(array_merge($_SESSION['acycomparison'], $ids));
		}

		if(count($_SESSION['acycomparison']) > 5){
			acymailing_enqueueMessage(acymailing_translation('ACY_MAX_COMPARE'), 'warning');
			$_SESSION['acycomparison'] = array_slice($_SESSION['acycomparison'], 0, 5);
		}elseif(count($_SESSION['acycomparison']) < 2){
			acymailing_enqueueMessage(acymailing_translation('ACY_MIN_COMPARE'), 'info');
		}

		acymailing_setVar( 'layout', 'listing'  );
		return parent::display();
	}

	function resetcompare(){
		if(!$this->isAllowed('statistics','manage')) return;

		$_SESSION['acycomparison'] = array();

		acymailing_setVar( 'layout', 'listing'  );
		return parent::display();
	}

	function opendays(){
		$tags = acymailing_getVar('string', 'tags', '');
		if(empty($tags)){
			$intoQuery = 'SELECT opendate FROM ' . acymailing_table('userstats') . ' WHERE opendate > 0 LIMIT 5000';
			$statsDays = acymailing_loadObjectList('SELECT COUNT(*) AS nb, FROM_UNIXTIME(opendate,\'%w\') AS day FROM ('.$intoQuery.') AS a GROUP BY day', 'day');
		}else{
			$tags = explode(',', $tags);
			acymailing_arrayToInteger($tags);

			$tagsData = acymailing_loadObjectList('SELECT * FROM ' . acymailing_table('tagmail') . ' WHERE tagid IN ('.implode(',', $tags).')');

			$mails = array();
			foreach($tagsData as $oneData){
				$mails[$oneData->mailid][] = $oneData->tagid;
			}

			foreach($mails as $i => $oneMail){
				foreach($tags as $oneTag) {
					if(!in_array($oneTag, $oneMail)){
						unset($mails[$i]);
						break;
					}
				}
			}

			$eligibleMails = array_keys($mails);
			if(empty($eligibleMails)){
				$statsDays = array();
			}else {
				$intoQuery = 'SELECT opendate 
						  FROM ' . acymailing_table('userstats') . '
						  WHERE opendate > 0 AND mailid IN (' . implode(',', $eligibleMails) . ') 
						  LIMIT 5000';

				$statsDays = acymailing_loadObjectList('SELECT COUNT(*) AS nb, FROM_UNIXTIME(opendate,\'%w\') AS day FROM ('.$intoQuery.') AS a GROUP BY day', 'day');
			}
		}

		$total = 0;
		foreach ($statsDays as $oneDay) {
			$total += $oneDay->nb;
		}

		if(!empty($statsDays[0])){
			$statsDays[7] = $statsDays[0];
			unset($statsDays[0]);
		}

		$days = array('ACY_MONDAY', 'ACY_TUESDAY', 'ACY_WEDNESDAY', 'ACY_THURSDAY', 'ACY_FRIDAY', 'ACY_SATURDAY', 'ACY_SUNDAY');
		foreach($days as $i => &$text){
			$text = "['".acymailing_translation($text, true)."', ".(empty($statsDays[$i+1]) ? 0 : intval($statsDays[$i+1]->nb * 100 / $total))."]";
		}
		?>
		<div id="chart"></div>
		<script language="JavaScript" type="text/javascript">
			function drawChart(){
				var dataTable = new google.visualization.DataTable();

				dataTable.addColumn('string', '');
				dataTable.addColumn('number', '');
				dataTable.addRows([<?php echo implode(',', $days); ?>]);

				var options = {
					height: 300,
					legend: 'none',
					legendTextStyle: {
						color: '#333333'
					},
					legend: {position: 'none'},
					axes: {
						x: {
							0: {side: 'top'}
						}
					},
					vAxis: {
						format: '#\'%\''
					}
				};

				var chart = new google.charts.Bar(document.getElementById('chart'));
				chart.draw(dataTable, google.charts.Bar.convertOptions(options));
			}
			drawChart();
		</script>
<?php
		exit;
	}

	function detecttimeout(){
		$config = acymailing_config();
		if($config->get('security_key') != acymailing_getVar('string', 'seckey')) die('wrong key');
		acymailing_query("REPLACE INTO `#__acymailing_config` (`namekey`,`value`) VALUES ('max_execution_time','5'), ('last_maxexec_check','".time()."')");
		@ini_set('max_execution_time',600);
		@ignore_user_abort(true);
		$i = 0;
		while($i < 480){
			sleep(8);
			$i += 10;
			acymailing_query("UPDATE `#__acymailing_config` SET `value` = '".intval($i)."' WHERE `namekey` = 'max_execution_time'");
			acymailing_query("UPDATE `#__acymailing_config` SET `value` = '".time()."' WHERE `namekey` = 'last_maxexec_check'");
			sleep(2);
		}
		exit;
	}
}
components/com_acymailing/controllers/queue.php000060400000003633152453623450016121 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class QueueController extends acymailingController{

	var $aclCat = 'queue';

	function remove(){
		if(!$this->isAllowed($this->aclCat, 'delete')) return;
		acymailing_checkToken();
		$mailid = acymailing_getVar('int', 'filter_mail', 0, 'post');

		$queueClass = acymailing_get('class.queue');
		$search = acymailing_getVar('string', 'search');
		$filters = array();
		if(!empty($search)){
			$searchVal = '\'%'.acymailing_getEscaped($search, true).'%\'';
			$searchFields = array('b.name', 'b.email', 'c.subject', 'a.mailid', 'a.subid');
			$filters[] = implode(" LIKE $searchVal OR ", $searchFields)." LIKE $searchVal";
		}
		if(!empty($mailid)){
			$filters[] = 'a.mailid = '.intval($mailid);
		}

		$total = $queueClass->delete($filters);
		acymailing_enqueueMessage(acymailing_translation_sprintf('SUCC_DELETE_ELEMENTS', $total), 'message');
		acymailing_setVar('filter_mail', 0, 'post');
		acymailing_setVar('search', '', 'post');

		return $this->listing();
	}

	function process(){
		if(!$this->isAllowed($this->aclCat, 'process')) return;
		acymailing_setVar('layout', 'process');
		return parent::display();
	}

	function preview(){
		acymailing_setVar('layout', 'preview');
		return parent::display();
	}

	function cancelNewsletter(){
		if(!$this->isAllowed($this->aclCat, 'delete')) return;
		acymailing_checkToken();
		$mailid = acymailing_getVar('int', 'mailid', 0);
		if(empty($mailid)){
			acymailing_enqueueMessage('Mail id not found', 'error');
			return;
		}
		$queueClass = acymailing_get('class.queue');
		acymailing_enqueueMessage(acymailing_translation_sprintf('SUCC_DELETE_ELEMENTS', $queueClass->delete(array('a.mailid = '.$mailid))), 'info');
	}
}
components/com_acymailing/controllers/subscriber.php000060400000010101152453623450017124 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class SubscriberController extends acymailingController{

	var $pkey = 'subid';
	var $allowedInfo = array();
	var $aclCat = 'subscriber';

	function choose(){
		if(!$this->isAllowed('subscriber', 'view')) return;
		acymailing_setVar('layout', 'choose');
		return parent::display();
	}

	function export(){
		if(!$this->isAllowed('subscriber', 'export')) return;
		$cids = acymailing_getVar('none', 'cid');
		$selectedList = acymailing_getVar('int', 'filter_lists');
		$_SESSION['acymailing'] = array();
		$redirection = (acymailing_isAdmin() ? '' : 'front').'data&task=export';
		if(!empty($cids) || !empty($selectedList)){
			if(!empty($cids)){
				$_SESSION['acymailing']['exportusers'] = $cids;
			}else{
				$_SESSION['acymailing']['exportlist'] = $selectedList;
				$_SESSION['acymailing']['exportliststatus'] = acymailing_getVar('int', 'filter_statuslist');
			}
			$redirection .= '&sessionvalues=1';
		}


		acymailing_redirect(acymailing_completeLink($redirection, false, true));
	}

	function store(){
		if(!$this->isAllowed('subscriber', 'manage')) return;
		acymailing_checkToken();

		$subscriberClass = acymailing_get('class.subscriber');
		$subscriberClass->sendConf = false;
		$subscriberClass->sendNotif = false;
		$subscriberClass->sendWelcome = false;
		$subscriberClass->allowModif = true;
		$subscriberClass->checkAccess = false;
		$subscriberClass->triggerFilterBE = true;
		$subscriberClass->checkVisitor = false;

		$status = $subscriberClass->saveForm();
		if($status){
			acymailing_enqueueMessage(acymailing_translation('JOOMEXT_SUCC_SAVED'), 'message');
		}else{
			acymailing_enqueueMessage(acymailing_translation('ERROR_SAVING'), 'error');
			if(!empty($subscriberClass->errors)){
				foreach($subscriberClass->errors as $oneError){
					acymailing_enqueueMessage($oneError, 'error');
				}
			}
		}
	}

	function remove(){
		acymailing_checkToken();
		$config = acymailing_config();
		$deleteBehaviour = $config->get('frontend_delete_button', 'delete');
		$subscriberIds = acymailing_getVar('array', 'cid', array(), '');
		if(acymailing_isAdmin() || $deleteBehaviour == 'delete'){
			if(!$this->isAllowed('subscriber', 'delete')) return;

			$subscriberObject = acymailing_get('class.subscriber');
			$num = $subscriberObject->delete($subscriberIds);

			acymailing_enqueueMessage(acymailing_translation_sprintf('SUCC_DELETE_ELEMENTS', $num), 'message');
		}else{
			if(!$this->isAllowed('subscriber', 'manage')) return;

			$listId = acymailing_getVar('int', 'filter_lists', 0);
			if(empty($listId)){
				acymailing_enqueueMessage('List not found', 'error');
			}else{
				$listsubClass = acymailing_get('class.listsub');
				foreach($subscriberIds as $subid){
					$listsubClass->removeSubscription($subid, array($listId));
				}

				$listClass = acymailing_get('class.list');
				$list = $listClass->get($listId);

				acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_REMOVE', count($subscriberIds), $list->name), 'message');
			}
		}

		acymailing_setVar('layout', 'listing');
		return parent::display();
	}

	function getSubscribersByEmail(){
		$NameSearched = acymailing_getVar('string', 'search', '');
		if(empty($NameSearched) || !acymailing_isAdmin() || !$this->isAllowed('subscriber', 'view')) exit;

		$NameSearched = '\'%'.acymailing_getEscaped($NameSearched, true).'%\'';
		$users = acymailing_loadObjectList('SELECT name, email FROM #__acymailing_subscriber WHERE email LIKE '.$NameSearched.' OR name LIKE '.$NameSearched.' ORDER BY email ASC LIMIT 30');
		if(empty($users)) exit;

		echo '<table style="width:100%;">';
		foreach($users as $oneUser){
			echo '<tr class="row_user" onclick="setUser(\''.str_replace("'", "\'", $oneUser->email).'\');"><td>'.htmlspecialchars($oneUser->name, ENT_COMPAT, 'UTF-8').'</td><td>'.htmlspecialchars($oneUser->email, ENT_COMPAT, 'UTF-8').'</td></tr>';
		}
		echo '</table>';
		exit;
	}
}
components/com_acymailing/controllers/fields.php000060400000002122152453623450016233 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class FieldsController extends acymailingController{
	var $pkey = 'fieldid';
	var $table = 'fields';
	var $groupMap = '';
	var $groupVal = '';

	function listing(){
		if(!acymailing_level(3)){
			$acyToolbar = acymailing_get('helper.toolbar');
			$acyToolbar->setTitle(acymailing_translation('EXTRA_FIELDS'), 'fields');
			$acyToolbar->help('customfields');
			$acyToolbar->display();
			$config = acymailing_config();

			$level = $config->get('level');
			$url = ACYMAILING_HELPURL.'fields-paidversion&utm_source=acymailing-'.$level.'&utm_medium=back-end&utm_content=customfields-display&utm_campaign=upgrade';
			$iFrame = "<iframe class='paidversion' frameborder='0' src='$url' width='100%' height='100%' scrolling='auto'></iframe>";
			echo $iFrame.'<div id="iframedoc"></div>';
			return;
		}

		return parent::listing();
	}

}
components/com_acymailing/controllers/data.php000060400000035503152453623450015707 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class DataController extends acymailingController{

	function listing(){
		$importHelper = acymailing_get('helper.import');
		$importHelper->_cleanImportFolder();
		return $this->import();
	}

	function import(){
		if(!$this->isAllowed('subscriber', 'import')) return;
		acymailing_setVar('layout', 'import');
		return parent::display();
	}

	function export(){
		if(!$this->isAllowed('subscriber', 'export')) return;
		acymailing_setVar('layout', 'export');
		return parent::display();
	}

	function loadZohoFields(){
		$zohoHelper = acymailing_get('helper.zoho');
		$zohoHelper->authtoken = acymailing_getVar('none', 'zoho_apikey');
		$list = acymailing_getVar('none', 'zoho_list');
		acymailing_setVar('layout', 'import');
		$zohoFields = $zohoHelper->getFieldsRaw($list);
		if(!empty($zohoHelper->error)){
			acymailing_enqueueMessage($zohoHelper->error, 'error');
			return parent::display();
		}
		$zohoFieldsParsed = $zohoHelper->parseXMLFields($zohoFields);
		if(!empty($zohoHelper->error)){
			acymailing_enqueueMessage($zohoHelper->error, 'error');
			return parent::display();
		}
		$config = acymailing_config();
		$newconfig = new stdClass();
		$newconfig->zoho_fieldsname = implode(',', $zohoFieldsParsed);
		$newconfig->zoho_list = $list;
		$newconfig->zoho_apikey = $zohoHelper->authtoken;
		$config->save($newconfig);
		acymailing_enqueueMessage(acymailing_translation('ACY_FIELDSLOADED'));
		return parent::display();
	}

	function doimport(){
		if(!$this->isAllowed('subscriber', 'import')) return;
		acymailing_checkToken();

		$function = acymailing_getVar('cmd', 'importfrom');

		$importHelper = acymailing_get('helper.import');
		if(!$importHelper->$function()){
			return $this->import();
		}

		if($function == 'textarea' || $function == 'file'){
			if(file_exists(ACYMAILING_MEDIA.'import'.DS.acymailing_getVar('cmd', 'filename'))) $importContent = file_get_contents(ACYMAILING_MEDIA.'import'.DS.acymailing_getVar('cmd', 'filename'));
			if(empty($importContent)){
				acymailing_enqueueMessage(acymailing_translation('ACY_IMPORT_NO_CONTENT'), 'error');
				acymailing_redirect(acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'data&task=import', false, true));
			}else{
				acymailing_setVar('layout', 'genericimport');
				return parent::display();
			}
		}else{
			acymailing_redirect(acymailing_completeLink(acymailing_isAdmin() ? 'subscriber' : 'frontsubscriber', false, true));
		}
	}

	function finalizeimport(){
		$importHelper = acymailing_get('helper.import');
		$importHelper->finalizeImport();
		acymailing_redirect(acymailing_completeLink(acymailing_isAdmin() ? 'subscriber' : 'frontsubscriber', false, true));
	}

	function downloadimport(){
		$filename = acymailing_getVar('cmd', 'filename');
		if(!file_exists(ACYMAILING_MEDIA.'import'.DS.$filename.'.csv')) return;
		$exportHelper = acymailing_get('helper.export');
		$exportHelper->addHeaders($filename);
		echo file_get_contents(ACYMAILING_MEDIA.'import'.DS.$filename.'.csv');
		exit;
	}

	function ajaxencoding(){
		acymailing_setVar('layout', 'ajaxencoding');
		parent::display();
		exit;
	}

	function ajaxload(){
		if(!$this->isAllowed('subscriber', 'import')) return;

		$function = acymailing_getVar('cmd', 'importfrom').'_ajax';

		$importHelper = acymailing_get('helper.import');
		$importHelper->$function();
		exit;
	}

    function exportError($message){
        if(!acymailing_isAdmin()) die($message);

        acymailing_enqueueMessage($message, 'error');

		if(!ACYMAILING_J40){
			$menuHelper = acymailing_get('helper.acymenu');
			echo '<div id="acyallcontent" class="acyallcontent">';
			echo $menuHelper->display('data');
			echo '<div id="acymainarea" class="acymaincontent_data">';
		}

        acymailing_setVar('layout', 'export');
        parent::display();

		if(!ACYMAILING_J40) echo '</div></div>';
        return false;
    }

	function doexport(){
		$assocField = 'subid';
		if(!$this->isAllowed('subscriber', 'export')) return;
		acymailing_checkToken();

		acymailing_increasePerf();

		$filtersExport = acymailing_getVar('array', 'exportfilter', array(), '');
		$listsToExport = acymailing_getVar('none', 'exportlists');

		$fieldsToExport = acymailing_getVar('none', 'exportdata');
		if(!in_array('1', array_values($fieldsToExport))) return $this->exportError('Please select at least one field to export');
		$tableFields = acymailing_getColumns('#__acymailing_subscriber');
		$notAllowedFields = array_diff_key($fieldsToExport, $tableFields);
		if(!empty($notAllowedFields)) return $this->exportError('The field '.implode(', ', array_keys($notAllowedFields)).' is not in the allowed fields: '.implode(', ', array_keys($tableFields)));

		$fieldsToExportList = acymailing_getVar('none', 'exportdatalist');
		$notAllowedFields = array_diff(array_keys($fieldsToExportList), array('listid', 'listname'));
		if(!empty($notAllowedFields)) return $this->exportError('The field '.implode(', ', $notAllowedFields).' is not in the allowed fields: listid, listname');

		$fieldsToExportOthers = acymailing_getVar('none', 'exportdataother');

		$fieldsToExportGeoloc = acymailing_getVar('none', 'exportdatageoloc');
		$tableFields = acymailing_getColumns('#__acymailing_geolocation');
		$notAllowedFields = array_diff_key($fieldsToExportGeoloc, $tableFields);
		if(!empty($notAllowedFields)) return $this->exportError('The field '.implode(', ', array_keys($notAllowedFields)).' is not in the allowed fields: '.implode(', ', array_keys($tableFields)));

		$inseparator = acymailing_getVar('string', 'exportseparator');
		$inseparator = str_replace(array('semicolon', 'colon', 'comma'), array(';', ',', ','), $inseparator);
		$exportFormat = acymailing_getVar('string', 'exportformat');
		if(!in_array($inseparator, array(',', ';'))) $inseparator = ';';

		$exportUnsubLists = array();
		$exportWaitLists = array();
		$exportLists = array();
		if(!empty($filtersExport['subscribed'])){
			foreach($listsToExport as $listid => $status){
				if($status == -1){
					$exportUnsubLists[] = (int)$listid;
				}elseif($status == 2) $exportWaitLists[] = (int)$listid;
				elseif(!empty($status)) $exportLists[] = (int)$listid;
			}
		}

		if(!acymailing_isAdmin() && (empty($filtersExport['subscribed']) || (empty($exportLists) && empty($exportUnsubLists) && empty($exportWaitLists)))){
			$listClass = acymailing_get('class.list');
			$frontLists = $listClass->getFrontendLists();
			foreach($frontLists as $frontList){
				$exportLists[] = (int)$frontList->listid;
			}
		}

		$exportFields = array();
		$exportFieldsList = array();
		$exportFieldsOthers = array();
		$exportFieldsGeoloc = array();
		foreach($fieldsToExport as $fieldName => $checked){
			if(!empty($checked)) $exportFields[] = acymailing_secureField($fieldName);
		}
		foreach($fieldsToExportList as $fieldName => $checked){
			if(!empty($checked)) $exportFieldsList[] = acymailing_secureField($fieldName);
		}
		if(!empty($fieldsToExportOthers)){
			foreach($fieldsToExportOthers as $fieldName => $checked){
				if(!empty($checked)) $exportFieldsOthers[] = acymailing_secureField($fieldName);
			}
		}
		if(!empty($fieldsToExportGeoloc)){
			foreach($fieldsToExportGeoloc as $fieldName => $checked){
				if(!empty($checked)) $exportFieldsGeoloc[] = acymailing_secureField($fieldName);
			}
		}

		$selectFields = 's.`'.implode('`, s.`', $exportFields).'`';

		$config = acymailing_config();
		$newConfig = new stdClass();
		$newConfig->export_fields = implode(',', array_merge($exportFields, $exportFieldsOthers, $exportFieldsList, $exportFieldsGeoloc));
		$newConfig->export_lists = implode(',', $exportLists);
		$newConfig->export_separator = acymailing_getVar('string', 'exportseparator');
		$newConfig->export_excelsecurity = acymailing_getVar('int', 'export_excelsecurity', 0);
		$newConfig->export_format = $exportFormat;
		$filterActive = array();
		foreach($filtersExport as $filterKey => $value){
			if($value == 1) $filterActive[] = $filterKey;
		}
		$newConfig->export_filters = implode(',', $filterActive);
		$config->save($newConfig);

		$where = array();
		if(empty($exportLists) && empty($exportUnsubLists) && empty($exportWaitLists)){
			$querySelect = 'SELECT s.`subid`, '.$selectFields.' FROM '.acymailing_table('subscriber').' as s';
		}else{
			$querySelect = 'SELECT DISTINCT s.`subid`, '.$selectFields.' FROM '.acymailing_table('listsub').' as a JOIN '.acymailing_table('subscriber').' as s on a.subid = s.subid';
			if(!empty($exportLists)) $conditions[] = 'a.status = 1 AND a.listid IN ('.implode(',', $exportLists).')';
			if(!empty($exportUnsubLists)) $conditions[] = 'a.status = -1 AND a.listid IN ('.implode(',', $exportUnsubLists).')';
			if(!empty($exportWaitLists)) $conditions[] = 'a.status = 2 AND a.listid IN ('.implode(',', $exportWaitLists).')';

			if(count($conditions) == 1){
				$where[] = $conditions[0];
			}else $where[] = '('.implode(') OR (', $conditions).')';
		}

		if(!empty($filtersExport['confirmed'])) $where[] = 's.confirmed = 1';
		if(!empty($filtersExport['registered'])) $where[] = 's.userid > 0';
		if(!empty($filtersExport['enabled'])) $where[] = 's.enabled = 1';
		
		if(acymailing_getVar('int', 'sessionvalues') AND !empty($_SESSION['acymailing']['exportusers'])){
			$where[] = 's.subid IN ('.implode(',', $_SESSION['acymailing']['exportusers']).')';
		}

		if(acymailing_getVar('int', 'fieldfilters')){
			foreach($_SESSION['acymailing']['fieldfilter'] as $field => $value){
				$where[] = 's.'.acymailing_secureField($field).' LIKE "%'.acymailing_getEscaped($value, true).'%"';
			}
		}

		$query = $querySelect;
		if(!empty($where)) $query .= ' WHERE ('.implode(') AND (', $where).')';
		if(acymailing_getVar('int', 'sessionquery')){
			$selectOthers = '';
			if(!empty($exportFieldsOthers)){
				foreach($exportFieldsOthers as $oneField){
					$selectOthers .= ' , '.$oneField.' AS '.str_replace('.', '_', $oneField);
				}
			}
			acymailing_session();
			$acyExportQuery = $_SESSION['acymailing']['acyexportquery'];
			if(strpos($acyExportQuery, 'urlclick') !== false) {
				$query = 'SELECT s.`subid`, '.$selectFields.$selectOthers.' '.$acyExportQuery;
				$assocField = '';
			} else {
				$query = 'SELECT DISTINCT s.`subid`, '.$selectFields.$selectOthers.' '.$acyExportQuery;
			}
		}
		$query .= ' ORDER BY s.subid';

		$encodingClass = acymailing_get('helper.encoding');
		$exportHelper = acymailing_get('helper.export');

		$fileName = 'export_'.date('Y-m-d');
		if(!empty($exportLists) && !empty($filtersExport['subscribed'])){
			$fileName = '';
			$allExportedLists = acymailing_loadObjectList('SELECT name FROM #__acymailing_list WHERE listid IN ('.implode(',', $exportLists).')');
			foreach($allExportedLists as $oneList){
				$fileName .= '__'.$oneList->name;
			}
			$fileName = trim($fileName, '__');
		}

		$exportHelper->addHeaders($fileName);
		acymailing_displayErrors();

		$eol = "\r\n";
		$before = '"';
		$separator = '"'.$inseparator.'"';
		$after = '"';

		$allFields = array_merge($exportFields, $exportFieldsOthers);
		if(!empty($exportFieldsList)){
			$allFields = array_merge($allFields, $exportFieldsList);
			$selectFields = 'l.`'.implode('`, l.`', $exportFieldsList).'`';
			$selectFields = str_replace('listname', 'name', $selectFields);
		}
		if(!empty($exportFieldsGeoloc)){
			$allFields = array_merge($allFields, $exportFieldsGeoloc);
		}

		$titleLine = $before.implode($separator, $allFields).$after.$eol;
		$titleLine = str_replace('listid', 'listids', $titleLine);
		echo $titleLine;

		if(acymailing_bytes(ini_get('memory_limit')) > 150000000){
			$nbExport = 50000;
		}elseif(acymailing_bytes(ini_get('memory_limit')) > 80000000){
			$nbExport = 15000;
		}else{
			$nbExport = 5000;
		}

		if(!empty($exportFieldsList)) $nbExport = 500;

		$valDep = 0;
		$dateFields = array('created', 'confirmed_date', 'lastopen_date', 'lastclick_date', 'lastsent_date', 'userstats_opendate', 'userstats_senddate', 'urlclick_date', 'hist_date');
		do{
			$allData = acymailing_loadObjectList($query.' LIMIT '.$valDep.', '.$nbExport, $assocField);
			$valDep += $nbExport;
			if($allData === false){
				echo $eol.$eol.'Error : '.acymailing_getDBError();
			}
			if(empty($allData)) break;

			foreach($allData as $subid => &$oneUser){
				if(!in_array('subid', $exportFields)) unset($allData[$subid]->subid);

				foreach($dateFields as &$fieldName){
					if(isset($allData[$subid]->$fieldName)) $allData[$subid]->$fieldName = acymailing_getDate($allData[$subid]->$fieldName, '%Y-%m-%d %H:%M:%S');
				}
			}

			if(!empty($exportFieldsList) && !empty($allData)){
				$queryList = 'SELECT '.$selectFields.', s.subid
								FROM #__acymailing_subscriber AS s
								LEFT JOIN #__acymailing_listsub AS ls ON ls.subid = s.subid AND ls.status = 1 ';
				if(!empty($exportLists)) $queryList .= 'AND ls.listid IN ('.implode(',', $exportLists).') ';
				$queryList .= 'LEFT JOIN #__acymailing_list AS l ON ls.listid = l.listid
								WHERE s.subid IN ('.implode(',', array_keys($allData)).')';
				$resList = acymailing_loadObjectList($queryList);
				foreach($resList as &$listsub){
					if(in_array('listid', $exportFieldsList)) $allData[$listsub->subid]->listid = empty($allData[$listsub->subid]->listid) ? $listsub->listid : $allData[$listsub->subid]->listid.' - '.$listsub->listid;
					if(in_array('listname', $exportFieldsList)) $allData[$listsub->subid]->listname = empty($allData[$listsub->subid]->listname) ? $listsub->name : $allData[$listsub->subid]->listname.' - '.$listsub->name;
				}
				unset($resList);
			}

			if(!empty($exportFieldsGeoloc) && !empty($allData)){
				$orderGeoloc = acymailing_getVar('cmd', 'exportgeolocorder');
				if(strtolower($orderGeoloc) !== 'desc') $orderGeoloc = 'asc';
				$resGeol = acymailing_loadObjectList('SELECT geolocation_subid,'.implode(', ', $exportFieldsGeoloc).' FROM (SELECT * FROM #__acymailing_geolocation WHERE geolocation_subid IN ('.implode(',', array_keys($allData)).') ORDER BY geolocation_id '.$orderGeoloc.') as geoloc GROUP BY geolocation_subid', 'geolocation_subid');
				foreach($allData as $subid => $oneSubscriber){
					foreach($exportFieldsGeoloc as $geolField){
						$value = empty($resGeol[$subid]) ? '' : $resGeol[$subid]->$geolField;
						$allData[$subid]->$geolField = ($geolField == 'geolocation_created' ? acymailing_getDate($value, '%Y-%m-%d %H:%M:%S') : $value);
					}
				}
				unset($resGeol);
			}


			foreach($allData as $subid => &$oneUser){
				$data = get_object_vars($oneUser);

				if($newConfig->export_excelsecurity == 1){
					foreach ($data as &$oneData){
						$firstcharacter = substr($oneData, 0, 1);
						if(in_array($firstcharacter, array('=', '+', '-', '@'))){
							$oneData = '	'.$oneData;
						}
					}
				}

				$dataexport = implode($separator, $data);
				echo $before.$encodingClass->change($dataexport, 'UTF-8', $exportFormat).$after.$eol;
			}

			unset($allData);
		}while(true);
		exit;
	}
}
components/com_acymailing/controllers/cpanel.php000060400000035701152453623450016240 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class CpanelController extends acymailingController{


	function __construct($config = array()){
		parent::__construct($config);
		$this->registerDefaultTask('display');
	}

	function save(){
		$this->store();
		return $this->cancel();
	}

	function apply(){
		$this->store();
		return $this->display();
	}

	function listing(){
		if(!$this->isAllowed('configuration', 'manage')) return;
		return $this->display();
	}

	function store(){
		if(!$this->isAllowed('configuration', 'manage')) return;
		acymailing_checkToken();

		$config = acymailing_config();

		$source = is_array($_POST['config']) ? 'POST' : 'REQUEST';
		$formData = acymailing_getVar('array', 'config', array(), $source);

		$aclcats = acymailing_getVar('array', 'aclcat', array(), 'POST');

		if(!empty($aclcats)){

			if(acymailing_getVar('string', 'acl_configuration', 'all') != 'all' && !acymailing_isAllowed($formData['acl_configuration_manage'])){
				acymailing_enqueueMessage(acymailing_translation('ACL_WRONG_CONFIG'), 'notice');
				unset($formData['acl_configuration_manage']);
			}

			$deleteAclCats = array();
			$unsetVars = array('save', 'create', 'manage', 'modify', 'delete', 'fields', 'export', 'import', 'view', 'send', 'schedule', 'bounce', 'test');
			foreach($aclcats as $oneCat){
				if(acymailing_getVar('string', 'acl_'.$oneCat) == 'all'){
					foreach($unsetVars as $oneVar){
						unset($formData['acl_'.$oneCat.'_'.$oneVar]);
					}
					$deleteAclCats[] = $oneCat;
				}
			}
		}


		if(!empty($formData['hostname'])){
			$formData['hostname'] = preg_replace('#https?://#i', '', $formData['hostname']);
			$formData['hostname'] = preg_replace('#[^a-z0-9_.-]#i', '', $formData['hostname']);
		}

		$reasons = acymailing_getVar('array', 'unsub_reasons', array(), 'POST');
		$unsub_reasons = array();
		foreach($reasons as $oneReason){
			if(empty($oneReason)) continue;
			$unsub_reasons[] = strip_tags($oneReason);
		}
		$formData['unsub_reasons'] = serialize($unsub_reasons);

		if(!empty($formData['smtp_username'])) $formData['smtp_username'] = acymailing_punycode($formData['smtp_username']);

		$status = $config->save($formData);

		if(!empty($deleteAclCats)){
			acymailing_query("DELETE FROM `#__acymailing_config` WHERE `namekey` LIKE 'acl_".implode("%' OR `namekey` LIKE 'acl_", $deleteAclCats)."%'");
		}

		if($status){
			acymailing_enqueueMessage(acymailing_translation('JOOMEXT_SUCC_SAVED'), 'message');
		}else{
			acymailing_enqueueMessage(acymailing_translation('ERROR_SAVING'), 'error');
		}

		$config->load();
	}

	function test(){
		if(!$this->isAllowed('configuration', 'manage')) return;
		$this->store();

		acymailing_displayErrors();

		$config = acymailing_config();

		$mailClass = acymailing_get('helper.mailer');
		$addedName = $config->get('add_names', true) ? $mailClass->cleanText(acymailing_currentUserName()) : '';
		$mailClass->AddAddress(acymailing_currentUserEmail(), $addedName);
		$mailClass->Subject = 'Test e-mail from '.ACYMAILING_LIVE;
		$mailClass->Body = acymailing_translation('TEST_EMAIL');
		$mailClass->SMTPDebug = 1;
		if(acymailing_isDebug()) $mailClass->SMTPDebug = 2;
		$result = $mailClass->send();

		if(!$result){
			$bounce = $config->get('bounce_email');
			if($config->get('mailer_method') == 'smtp' && $config->get('smtp_secured') == 'ssl' && !function_exists('openssl_sign')){
				acymailing_enqueueMessage('The PHP Extension openssl is not enabled on your server, this extension is required to use an SSL connection, please enable it', 'notice');
			}elseif(!empty($bounce) AND !in_array($config->get('mailer_method'), array('smtp', 'elasticemail'))){
				acymailing_enqueueMessage(acymailing_translation_sprintf('ADVICE_BOUNCE', '<b><i>'.$bounce.'</i></b>'), 'notice');
			}elseif($config->get('mailer_method') == 'smtp' AND !$config->get('smtp_auth') AND strlen($config->get('smtp_password')) > 1){
				acymailing_enqueueMessage(acymailing_translation('ADVICE_SMTP_AUTH'), 'notice');
			}elseif((strpos(ACYMAILING_LIVE, 'localhost') OR strpos(ACYMAILING_LIVE, '127.0.0.1')) AND in_array($config->get('mailer_method'), array('sendmail', 'qmail', 'mail'))){
				acymailing_enqueueMessage(acymailing_translation('ADVICE_LOCALHOST'), 'notice');
			}elseif($config->get('mailer_method') == 'smtp' AND $config->get('smtp_port') AND !in_array($config->get('smtp_port'), array(25, 2525, 465, 587))){
				acymailing_enqueueMessage(acymailing_translation_sprintf('ADVICE_PORT', $config->get('smtp_port')), 'notice');
			}
		}

		return $this->display();
	}

	function plgtrigger(){
		$pluginToTrigger = acymailing_getVar('cmd', 'plg');
		$pluginType = acymailing_getVar('cmd', 'plgtype', 'acymailing');
		$fctName = 'onAcy'.acymailing_getVar('cmd', 'fctName', 'TestPlugin');
		$methodParam = acymailing_getVar('cmd', 'param', 'NoParam');

		if(!ACYMAILING_J16){
			$path = JPATH_PLUGINS.DS.$pluginType.DS.$pluginToTrigger.'.php';
		}else{
			$path = JPATH_PLUGINS.DS.$pluginType.DS.$pluginToTrigger.DS.$pluginToTrigger.'.php';
		}

		if(!file_exists($path)){
			acymailing_display('Plugin not found: '.$path, 'error');
			return;
		}

		require_once($path);
		$className = 'plg'.$pluginType.$pluginToTrigger;
		if(!class_exists($className)){
			acymailing_display('Class not found: '.$className, 'error');
			return;
		}

		$dispatcher = ACYMAILING_J40 ? \JFactory::getApplication()->getDispatcher() : JDispatcher::getInstance();
		$instance = new $className($dispatcher, array('name' => $pluginToTrigger, 'type' => $pluginType));

		$fctName = ($fctName == 'onAcyTestPlugin') ? 'onTestPlugin' : $fctName;
		if(!method_exists($instance, $fctName)){
			acymailing_display('Method "'.$fctName.'" not found in: '.$className, 'error');
			return;
		}

		if($methodParam == 'NoParam'){
			$instance->$fctName();
		}else $instance->$fctName($methodParam);
		return;
	}

	function seereport(){
		if(!$this->isAllowed('configuration', 'manage')) return;
		$config = acymailing_config();

		$path = trim(html_entity_decode($config->get('cron_savepath')));
		if(!preg_match('#^[a-z0-9/_\-{}]*\.log$#i', $path)){
			acymailing_display('The log file must only contain alphanumeric characters and end with .log', 'error');
			return;
		}

		$path = str_replace(array('{year}', '{month}'), array(date('Y'), date('m')), $config->get('cron_savepath'));

		$reportPath = acymailing_cleanPath(ACYMAILING_ROOT.$path);

		if(file_exists($reportPath)){
			try{
				$lines = 10000;
				$f = fopen($reportPath, "rb");
				fseek($f, -1, SEEK_END);
				if(fread($f, 1) != "\n") $lines -= 1;

				$logFile = '';
				while(ftell($f) > 0 && $lines >= 0){
					$seek = min(ftell($f), 4096); // Figure out how far back we should jump
					fseek($f, -$seek, SEEK_CUR);
					$logFile = ($chunk = fread($f, $seek)).$logFile; // Get the line
					fseek($f, -mb_strlen($chunk, '8bit'), SEEK_CUR);
					$lines -= substr_count($chunk, "\n"); // Move to previous line
				}

				while($lines++ < 0){
					$logFile = substr($logFile, strpos($logFile, "\n") + 1);
				}
				fclose($f);
			}catch(Exception $e){
				$logFile = '';
			}
		}

		if(empty($logFile)){
			acymailing_display(acymailing_translation('EMPTY_LOG'), 'info');
		}else{
			echo nl2br($logFile);
		}
	}

	function cleanreport(){
		if(!$this->isAllowed('configuration', 'manage')) return;

		$config = acymailing_config();
		$path = trim(html_entity_decode($config->get('cron_savepath')));
		if(!preg_match('#^[a-z0-9/_\-{}]*\.log$#i', $path)){
			acymailing_display('The log file must only contain alphanumeric characters and end with .log', 'error');
			return;
		}

		$path = str_replace(array('{year}', '{month}'), array(date('Y'), date('m')), $config->get('cron_savepath'));

		$reportPath = acymailing_cleanPath(ACYMAILING_ROOT.$path);
		if(is_file($reportPath)){
			$result = acymailing_deleteFile($reportPath);
			if($result){
				acymailing_display(acymailing_translation('SUCC_DELETE_LOG'), 'success');
			}else{
				acymailing_display(acymailing_translation('ERROR_DELETE_LOG'), 'error');
			}
		}else{
			acymailing_display(acymailing_translation('EXIST_LOG'), 'info');
		}
	}

	function cancel(){
		acymailing_redirect(acymailing_completeLink('dashboard', false, true));
	}

	function checkDB(){
		$queries = file_get_contents(ACYMAILING_BACK.'tables.sql');
		$tables = explode("CREATE TABLE IF NOT EXISTS", $queries);
		$structure = array();
		$createTable = array();
		$indexes = array();
		foreach($tables as $oneTable){
			$fields = explode("\n\t", $oneTable);
			$tableNameTmp = substr($oneTable, strpos($oneTable, '`') + 1, strlen($oneTable) - 1);
			$tableName = substr($tableNameTmp, 0, strpos($tableNameTmp, '`'));
			if(empty($tableName)) continue;
			foreach($fields as $oneField){
				if(strpos($oneField, '#__')) continue;

				if(substr($oneField, 0, 1) == '`'){
					$fieldNameTmp = substr($oneField, strpos($oneField, '`') + 1, strlen($oneField) - 1);
					$fieldName = substr($fieldNameTmp, 0, strpos($fieldNameTmp, '`'));
					$structure[$tableName][$fieldName] = trim($oneField, ",");
					continue;
				}


				$oneField = trim(str_replace("\n) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;", '', $oneField));
        		$oneField = rtrim($oneField, ',');

				if(strpos($oneField, 'PRIMARY KEY') !== false){
					$indexes[$tableName]['PRIMARY'] = $oneField;
				}else if(strpos($oneField, 'KEY') !== false){
					$firstBackquotePos = strpos($oneField, '`');
					$indexName = substr($oneField, $firstBackquotePos+1, strpos($oneField, '`', $firstBackquotePos+1)-$firstBackquotePos-1);
					$indexes[$tableName][$indexName] = $oneField;
				}
			}
			$createTable[$tableName] = "CREATE TABLE IF NOT EXISTS ".$oneTable;
		}

		$tableNames = array_keys($structure);
		$structureDB = array();
		foreach($tableNames as $oneTableName){
			try{
				$fields2 = acymailing_loadObjectList("SHOW COLUMNS FROM ".$oneTableName);
			}catch(Exception $e){
				$fields2 = null;
			}
			if($fields2 == null){
				$errorMessage = (isset($e) ? $e->getMessage() : substr(strip_tags(acymailing_getDBError()), 0, 200));
				echo "<span style=\"color:blue\">Could not load columns from the table : ".$oneTableName." : ".$errorMessage."</span><br />";

				if(strpos($errorMessage, 'marked as crashed')){
					$repairQuery = 'REPAIR TABLE '.$oneTableName;

					try{
						$isError = acymailing_query($repairQuery);
					}catch(Exception $e){
						$isError = null;
					}
					if($isError === null){
						echo "<span style=\"color:red\">[ERROR]Could not repair the table ".$oneTableName." </span><br />";
						acymailing_display(isset($e) ? $e->getMessage() : substr(strip_tags(acymailing_getDBError()), 0, 200).'...', 'error');
					}else{
						echo "<span style=\"color:green\">[OK]Problem solved : Table ".$oneTableName." repaired</span><br />";
					}
					continue;
				}

				try{
					$isError = acymailing_query($createTable[$oneTableName]);
				}catch(Exception $e){
					$isError = null;
				}
				if($isError === null){
					echo "<span style=\"color:red\">[ERROR]Could not create the table ".$oneTableName." </span><br />";
					acymailing_display(isset($e) ? $e->getMessage() : substr(strip_tags(acymailing_getDBError()), 0, 200).'...', 'error');
				}else{
					echo "<span style=\"color:green\">[OK]Problem solved : Table ".$oneTableName." created</span><br />";
				}
				continue;
			}
			foreach($fields2 as $oneField){
				$structureDB[$oneTableName][$oneField->Field] = $oneField->Field;
			}
		}

		foreach($tableNames as $oneTableName){
			if(empty($structureDB[$oneTableName])) continue;
			$resultCompare[$oneTableName] = array_diff(array_keys($structure[$oneTableName]), $structureDB[$oneTableName]);
			if(empty($resultCompare[$oneTableName])){
				echo "<span style=\"color:green\">Table ".$oneTableName." OK</span><br />";
				continue;
			}
			foreach($resultCompare[$oneTableName] as $oneField){
				echo "<span style=\"color:blue\">Field ".$oneField." missing in ".$oneTableName."</span><br />";
				try{
					$isError = acymailing_query("ALTER TABLE ".$oneTableName." ADD ".$structure[$oneTableName][$oneField]);
				}catch(Exception $e){
					$isError = null;
				}
				if($isError === null){
					echo "<span style=\"color:red\">[ERROR]Could not add the field ".$oneField." on the table : ".$oneTableName."</span><br />";
					acymailing_display(isset($e) ? $e->getMessage() : substr(strip_tags(acymailing_getDBError()), 0, 200).'...', 'error');
					continue;
				}else{
					echo "<span style=\"color:green\">[OK]Problem solved : Add ".$oneField." in ".$oneTableName."</span><br />";
				}
			}
		}

		foreach($tableNames as $oneTableName){
			if(empty($structureDB[$oneTableName])) continue;

			$results = acymailing_loadObjectList('SHOW INDEX FROM '.$oneTableName, 'Key_name');
			if(empty($results)) continue;

			foreach($indexes[$oneTableName] as $name => $query){
				if(in_array($name, array_keys($results))) continue;

				$keyName = $name == 'PRIMARY' ? 'primary key' : 'index '.$name;

				echo "<span style=\"color:blue\">".$keyName." missing in ".$oneTableName."</span><br />";
				try{
					$isError = acymailing_query('ALTER TABLE '.$oneTableName.' ADD '.$query);
				}catch(Exception $e){
					$isError = null;
				}

				if($isError === null){
					echo "<span style=\"color:red\">[ERROR]Could not add the ".$keyName." on the table : ".$oneTableName."</span><br />";
					acymailing_display(substr(strip_tags(acymailing_getDBError()), 0, 200).'...', 'error');
				}else{
					echo "<span style=\"color:green\">[OK]Problem solved : Added ".$keyName." in ".$oneTableName."</span><br />";
				}
			}
		}

		$nbdeleted = acymailing_query("DELETE listsub.* FROM #__acymailing_listsub as listsub LEFT JOIN #__acymailing_subscriber as sub ON sub.subid = listsub.subid WHERE sub.subid IS NULL");
		if(!empty($nbdeleted)){
			echo "<span style=\"color:blue\">".$nbdeleted." lost subscriber entries fixed</span><br />";
		}

		$nbdeleted = acymailing_query("DELETE listsub.* FROM #__acymailing_listsub AS listsub LEFT JOIN #__acymailing_list AS b ON listsub.listid = b.listid WHERE b.listid IS NULL");
		if(!empty($nbdeleted)){
			echo "<span style=\"color:blue\">".$nbdeleted." lost list entries fixed</span><br />";
		}

		$customFields = array_keys(acymailing_loadObjectList('SELECT namekey FROM #__acymailing_fields WHERE type NOT IN (\'category\',\'customtext\')', 'namekey'));
		$subFields = acymailing_loadObjectList("SHOW COLUMNS FROM #__acymailing_subscriber");
		$subFieldsName = array();
		foreach($subFields as $oneField){
			$subFieldsName[] = $oneField->Field;
		}
		$fieldsDiff = array_diff($customFields, $subFieldsName);
		if(!empty($fieldsDiff)){
			echo '<span style="color:red;">At least one field is missing in the subscriber table or has not the same case between fields and subscriber table (they should all be lower case): <span style="font-weight: bold">'.implode(', ', $fieldsDiff).'</span>. You should only create fields using the custom fields interface.</span>';
		}else{
			echo '<span style="color:green;">Custom fields OK</span>';
		}
	}
}
components/com_acymailing/controllers/filter.php000060400000005344152453623450016263 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class FilterController extends acymailingController{
	var $pkey = 'filid';
	var $table = 'filter';

	function listing(){
		return $this->add();
	}

	function countresults(){
		$num = acymailing_getVar('int', 'num');
		$filters = acymailing_getVar('none', 'filter');

		foreach($filters['type'] as $block => $oneType){
			if(!empty($oneType[$num])){
				$currentType = $oneType[$num];
				break;
			}
		}
		if(empty($currentType)) die('No filter type found for the num '.intval($num));
		if(empty($filters[$num][$currentType])) die('No filter parameters found for the num '.intval($num));

		$filterClass = acymailing_get('class.filter'); // Keep it, it loads the acyQuery class
		$query = new acyQuery();

		$currentFilterData = $filters[$num][$currentType];
		acymailing_importPlugin('acymailing');
		$messages = acymailing_trigger('onAcyProcessFilterCount_'.$currentType, array(&$query,$currentFilterData,$num));
		echo implode(' | ',$messages);
		exit;
	}

	function displayCondFilter(){
		acymailing_importPlugin('acymailing');
		$fct = acymailing_getVar('none', 'fct');

		$message = acymailing_trigger('onAcyTriggerFct_'.$fct);
		echo implode(' | ',$message);
		exit;
	}

	function process(){
		if(!$this->isAllowed('lists','filter')) return;
		acymailing_checkToken();

		$filid = acymailing_getVar('int', 'filid');
		if(!empty($filid)){
			$this->store();
		}

		$filterClass = acymailing_get('class.filter');
		$filterClass->subid = acymailing_getVar('string', 'subid');
		$filterClass->execute(acymailing_getVar('none', 'filter'),acymailing_getVar('none', 'action'), 100000);

		if(!empty($filterClass->report)){
			if(acymailing_isNoTemplate()){
				acymailing_display($filterClass->report,'info');
				return;
			}else{
				foreach($filterClass->report as $oneReport){
					acymailing_enqueueMessage($oneReport);
				}
			}
		}
		return $this->edit();
	}

	function filterDisplayUsers(){
		if(!$this->isAllowed('lists','filter')) return;
		acymailing_checkToken();
		return $this->edit();
	}

	function store(){
		if(!$this->isAllowed('lists','filter')) return;
		acymailing_checkToken();

		$class = acymailing_get('class.filter');
		$status = $class->saveForm();
		if($status){
			acymailing_enqueueMessage(acymailing_translation( 'JOOMEXT_SUCC_SAVED' ), 'message');
		}else{
			acymailing_enqueueMessage(acymailing_translation( 'ERROR_SAVING' ), 'error');
			if(!empty($class->errors)){
				foreach($class->errors as $oneError){
					acymailing_enqueueMessage($oneError, 'error');
				}
			}
		}
	}
}
components/com_acymailing/controllers/template.php000060400000020074152453623450016606 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class TemplateController extends acymailingController{

	var $pkey = 'tempid';
	var $table = 'template';
	var $aclCat = 'templates';

	function load(){
		$class = acymailing_get('class.template');
		$tempid = acymailing_getVar('int', 'tempid');
		if(empty($tempid)) exit;
		$template = $class->get($tempid);

		header("Content-type: text/css");
		echo $class->buildCSS($template->styles, $template->stylesheet);
		exit;
	}

	function applyareas(){
		if(!$this->isAllowed($this->aclCat, 'manage')) return;

		$class = acymailing_get('class.template');
		$tempid = acymailing_getVar('int', 'tempid');
		if(empty($tempid)) exit;
		$template = $class->get($tempid);
		$class->applyAreas($template->body);
		$class->save($template);

		$class->createTemplateFile($tempid);

		acymailing_enqueueMessage(acymailing_translation('ACYEDITOR_ADDAREAS_DONE'));

		if(acymailing_isNoTemplate()){
			$js = "setTimeout('redirect()',2000); function redirect(){window.top.location.href = '".acymailing_completeLink('template')."'; }";
			acymailing_addScript(true, $js);
		}else{
			return $this->listing();
		}
	}

	function remove(){
		if(!$this->isAllowed($this->aclCat, 'delete')) return;
		acymailing_checkToken();
		acymailing_isAdmin() or die('Only from the back-end');

		$cids = acymailing_getVar('array', 'cid', array(), '');

		$class = acymailing_get('class.template');
		$num = $class->delete($cids);

		acymailing_enqueueMessage(acymailing_translation_sprintf('SUCC_DELETE_ELEMENTS', $num), 'message');

		return $this->listing();
	}

	function copy(){
		if(!$this->isAllowed($this->aclCat, 'manage')) return;
		acymailing_checkToken();

		$cids = acymailing_getVar('array', 'cid', array(), '');
		$time = time();

		acymailing_arrayToInteger($cids);

		$query = 'INSERT IGNORE INTO `#__acymailing_template` (`name`, `description`, `body`, `altbody`, `created`, `published`, `premium`, `ordering`, `namekey`, `styles`, `subject`,`stylesheet`,`fromname`,`fromemail`,`replyname`,`replyemail`,`thumb`,`readmore`,`category`)';
		$query .= " SELECT CONCAT('copy_',`name`), `description`, `body`, `altbody`, $time, `published`, 0, `ordering`, CONCAT('$time',`tempid`,`namekey`), `styles`, `subject`,`stylesheet`,`fromname`,`fromemail`,`replyname`,`replyemail`,`thumb`,`readmore`,`category` FROM `#__acymailing_template` WHERE `tempid` IN (".implode(',', $cids).')';
		acymailing_query($query);

		$orderClass = acymailing_get('helper.order');
		$orderClass->pkey = 'tempid';
		$orderClass->table = 'template';
		$orderClass->reOrder();

		return $this->listing();
	}

	function store(){
		if(!$this->isAllowed($this->aclCat, 'manage')) return;
		acymailing_checkToken();

		acymailing_isAdmin() or die('Only from the back-end');

		$templateClass = acymailing_get('class.template');
		$status = $templateClass->saveForm();
		if($status){
			acymailing_enqueueMessage(acymailing_translation('JOOMEXT_SUCC_SAVED'), 'message');
			$templateClass->proposeApplyAreas(acymailing_getVar('int', 'tempid'));
		}else{
			acymailing_enqueueMessage(acymailing_translation('ERROR_SAVING'), 'error');
			if(!empty($templateClass->errors)){
				foreach($templateClass->errors as $oneError){
					acymailing_enqueueMessage($oneError, 'error');
				}
			}
		}
	}

	function theme(){
		if(!$this->isAllowed($this->aclCat, 'view')) return;
		acymailing_setVar('layout', 'theme');
		return parent::display();
	}

	function upload(){
		if(!$this->isAllowed($this->aclCat, 'manage')) return;
		acymailing_setVar('layout', 'upload');
		return parent::display();
	}

	function doupload(){
		if(!$this->isAllowed($this->aclCat, 'manage')) return;
		acymailing_checkToken();

		$templateClass = acymailing_get('class.template');
		$statusUpload = $templateClass->doupload();

		if($statusUpload){
			if(!$templateClass->proposedAreas){
				acymailing_setNoTemplate(false);
				$js = "setTimeout('redirect()',2000); function redirect(){window.top.location.href = '".acymailing_completeLink('template', false, true)."'; }";
				acymailing_addScript(true, $js);
			}
			return;
		}else{
			return $this->upload();
		}
	}

	function export(){
		if(!$this->isAllowed($this->aclCat, 'manage')) return;
		acymailing_checkToken();

		$cids = acymailing_getVar('array', 'cid', array(), '');

		acymailing_arrayToInteger($cids);
		$templateClass = acymailing_get('class.template');
		$resExport = $templateClass->export($cids[0]);

		if(!empty($resExport)) acymailing_enqueueMessage(acymailing_translation_sprintf('ACYTEMPLATE_EXPORTED', '<a href="'.$resExport.'">', '</a>'), 'success');
		return $this->listing();
	}

	function test(){
		if(!$this->isAllowed($this->aclCat, 'manage')) return;
		$this->store();

		$tempid = acymailing_getCID('tempid');
		$test_selection = acymailing_getVar('string', 'test_selection', '', '');
		if(empty($tempid) OR empty($test_selection)) return;

		$mailer = acymailing_get('helper.mailer');
		$mailer->report = true;
		$config = acymailing_config();
		$subscriberClass = acymailing_get('class.subscriber');
		$userHelper = acymailing_get('helper.user');
		acymailing_importPlugin('acymailing');

		$receivers = array();
		if($test_selection == 'users'){
			$receiverEntry = acymailing_getVar('string', 'test_emails', '', '');
			if(!empty($receiverEntry)){
				if(substr_count($receiverEntry, '@') > 1){
					$receivers = explode(',', trim(preg_replace('# +#', '', $receiverEntry)));
				}else{
					$receivers[] = trim($receiverEntry);
				}
			}
		}else{
			$gid = acymailing_getVar('int', 'test_group', '-1');
			if($gid == -1) return false;
			if(!ACYMAILING_J16){
				$receivers = acymailing_loadResultArray('SELECT '.$this->cmsUserVars->email.' AS email FROM '.acymailing_table($this->cmsUserVars->table, false).' WHERE gid = '.intval($gid));
			}else{
				$receivers = acymailing_loadResultArray('SELECT u.'.$this->cmsUserVars->email.' AS email FROM '.acymailing_table($this->cmsUserVars->table, false).' AS u JOIN '.acymailing_table('user_usergroup_map', false).' AS ugm ON u.'.$this->cmsUserVars->id.' = ugm.user_id WHERE ugm.group_id = '.intval($gid));
			}
		}

		if(empty($receivers)){
			acymailing_enqueueMessage(acymailing_translation('NO_SUBSCRIBER'), 'notice');
			return $this->edit();
		}

		$classTemplate = acymailing_get('class.template');
		$myTemplate = $classTemplate->get($tempid);
		$myTemplate->sendHTML = 1;
		$myTemplate->mailid = 0;
		$myTemplate->template = $myTemplate;
		if(empty($myTemplate->subject)) $myTemplate->subject = $myTemplate->name;
		if(empty($myTemplate->altBody)) $myTemplate->altbody = $mailer->textVersion($myTemplate->body);
		acymailing_trigger('acymailing_replacetags', array(&$myTemplate, true));

		$myTemplate->body = acymailing_absoluteURL($myTemplate->body);

		$result = true;
		foreach($receivers as $receiveremail){
			$copy = $myTemplate;
			$mailer->clearAll();
			$mailer->setFrom($copy->fromemail, $copy->fromname);
			if(!empty($copy->replyemail)){
				$replyToName = $config->get('add_names', true) ? $mailer->cleanText($copy->replyname) : '';
				$mailer->AddReplyTo($mailer->cleanText($copy->replyemail), $replyToName);
			}

			$receiver = $subscriberClass->get($receiveremail);
			if(empty($receiver->subid)){
				if($userHelper->validEmail($receiveremail)){
					$newUser = new stdClass();
					$newUser->email = $receiveremail;
					$subscriberClass->sendConf = false;
					$subid = $subscriberClass->save($newUser);
					$receiver = $subscriberClass->get($subid);
				}
				if(empty($receiver->subid)) continue;
			}

			$addedName = $config->get('add_names', true) ? $mailer->cleanText($receiver->name) : '';
			$mailer->AddAddress($mailer->cleanText($receiver->email), $addedName);

			acymailing_trigger('acymailing_replaceusertags', array(&$copy, &$receiver, true));
			$mailer->isHTML(true);
			$mailer->Body = $copy->body;
			$mailer->Subject = $copy->subject;
			if($config->get('multiple_part', false)){
				$mailer->AltBody = $copy->altbody;
			}

			$mailer->send();
		}

		return $this->edit();
	}
}
components/com_acymailing/controllers/chooselist.php000060400000000667152453623450017155 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class ChooselistController extends acymailingController{

	function customfields(){
		acymailing_setVar( 'layout', 'customfields'  );
		return parent::display();
	}
}
components/com_acymailing/controllers/bounces.php000060400000002111152453623450016421 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class BouncesController extends acymailingController{
	var $pkey = 'ruleid';
	var $table = 'rules';
	var $groupMap = '';
	var $groupVal = '';

	function listing(){
		if(!acymailing_level(3)){
			$acyToolbar = acymailing_get('helper.toolbar');
			$acyToolbar->setTitle(acymailing_translation('BOUNCE_HANDLING'), 'bounces');
			$acyToolbar->help('bounce');
			$acyToolbar->display();
			$config = acymailing_config();
			$level = $config->get('level');
			$url = ACYMAILING_HELPURL.'bounce-paidversion&utm_source=acymailing-'.$level.'&utm_medium=back-end&utm_content=bounces-display&utm_campaign=upgrade';
			$iFrame = "<iframe class='paidversion' frameborder='0' src='$url' width='100%' height='100%' scrolling='auto'></iframe>";
			echo $iFrame.'<div id="iframedoc"></div>';
			return;
		}

		return parent::listing();
	}

}
components/com_acymailing/controllers/list.php000060400000003213152453623450015742 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class ListController extends acymailingController{

	var $pkey = 'listid';
	var $table = 'list';
	var $groupMap = 'type';
	var $groupVal = 'list';
	var $aclCat = 'lists';

	function store(){
		if(!$this->isAllowed($this->aclCat, 'manage')) return;
		acymailing_checkToken();

		$listClass = acymailing_get('class.list');
		$status = $listClass->saveForm();
		if($status){
			acymailing_enqueueMessage(acymailing_translation('JOOMEXT_SUCC_SAVED'), 'message');
			if($listClass->newlist && acymailing_isAdmin()){
				$listid = acymailing_getVar('int', 'listid');
				acymailing_enqueueMessage('<a href="'.acymailing_completeLink('filter&listid='.$listid).'">'.acymailing_translation_sprintf('SUBSCRIBE_LIST').'</a>', 'message');
			}
		}else{
			acymailing_enqueueMessage(acymailing_translation('ERROR_SAVING'), 'error');
			if(!empty($listClass->errors)){
				foreach($listClass->errors as $oneError){
					acymailing_enqueueMessage($oneError, 'error');
				}
			}
		}
	}

	function remove(){
		if(!$this->isAllowed($this->aclCat, 'delete')) return;

		acymailing_checkToken();

		$listIds = acymailing_getVar('array', 'cid', array(), '');

		$listClass = acymailing_get('class.list');
		$num = $listClass->delete($listIds);

		acymailing_enqueueMessage(acymailing_translation_sprintf('SUCC_DELETE_ELEMENTS', $num), 'message');

		acymailing_setVar('layout', 'listing');
		return parent::display();
	}
}
components/com_acymailing/controllers/dashboard.php000060400000001317152453623450016721 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class DashboardController extends acymailingController{

	var $aclCat = 'dashboard';

	function __construct($config = array()){
		parent::__construct($config);

		$this->registerTask('listing', 'display');

		$this->registerDefaultTask('listing');
	}

	function display($cachable = false, $urlparams = false){
		if(!empty($this->aclCat) AND !$this->isAllowed($this->aclCat, 'manage')) return;
		return parent::display($cachable, $urlparams);
	}
}
components/com_acymailing/controllers/send.php000060400000011134152453623450015721 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class SendController extends acymailingController{

	function sendready(){
		if(!$this->isAllowed('newsletters', 'send')) return;
		acymailing_setVar('layout', 'sendconfirm');
		return parent::display();
	}

	function send(){
		if(!$this->isAllowed('newsletters', 'send')) return;
		acymailing_checkToken();

		acymailing_setNoTemplate();
		$mailid = acymailing_getCID('mailid');
		if(empty($mailid)) exit;

		$time = time();
		$queueClass = acymailing_get('class.queue');
		$queueClass->onlynew = acymailing_getVar('int', 'onlynew');
		$queueClass->mindelay = acymailing_getVar('int', 'mindelay');
		$totalSub = $queueClass->queue($mailid, $time);

		if(empty($totalSub)){
			acymailing_display(acymailing_translation('NO_RECEIVER'), 'warning');
			return;
		}

		$mailObject = new stdClass();
		$mailObject->senddate = $time;
		$mailObject->published = 1;
		$mailObject->mailid = $mailid;
		$mailObject->sentby = acymailing_currentUserId();
		acymailing_updateObject(acymailing_table('mail'), $mailObject, 'mailid');

		$config = acymailing_config();
		$queueType = $config->get('queue_type');
		if($queueType == 'onlyauto'){
			$messages = array();
			$messages[] = acymailing_translation_sprintf('ADDED_QUEUE', $totalSub);
			$messages[] = acymailing_translation('AUTOSEND_CONFIRMATION');
			acymailing_display($messages, 'success');
			return;
		}else{
			acymailing_setVar('totalsend', $totalSub);
			acymailing_redirect(acymailing_completeLink('send&task=continuesend&mailid='.$mailid.'&totalsend='.$totalSub, true, true));
			exit;
		}
	}

	function continuesend(){
		$config = acymailing_config();

		if(acymailing_level(1) && $config->get('queue_type') == 'onlyauto'){
			acymailing_setNoTemplate();
			acymailing_display(acymailing_translation('ACY_ONLYAUTOPROCESS'), 'warning');
			return;
		}


		$newcrontime = time() + 120;
		if($config->get('cron_next') < $newcrontime){
			$newValue = new stdClass();
			$newValue->cron_next = $newcrontime;
			$config->save($newValue);
		}

		$mailid = acymailing_getCID('mailid');

		$totalSend = acymailing_getVar('int', 'totalsend', 0, '');
		$alreadySent = acymailing_getVar('int', 'alreadysent', 0, '');

		$helperQueue = acymailing_get('helper.queue');
		$helperQueue->mailid = $mailid;
		$helperQueue->report = true;
		$helperQueue->total = $totalSend;
		$helperQueue->start = $alreadySent;
		$helperQueue->pause = $config->get('queue_pause');
		$helperQueue->process();

		acymailing_setNoTemplate();



	}


	function spamtest(){
		$mailid = acymailing_getVar('int', 'mailid');
		if(empty($mailid)) return;

		$config = acymailing_config();
		ob_start();
		$urlSite = trim(base64_encode(preg_replace('#https?://(www\.)?#i', '', ACYMAILING_LIVE)), '=/');
		$url = ACYMAILING_SPAMURL.'spamTestSystem&component=acymailing&level='.strtolower($config->get('level', 'starter')).'&urlsite='.$urlSite;
		$spamtestSystem = acymailing_fileGetContent($url, 30);

		$warnings = ob_get_clean();

		if(empty($spamtestSystem) || $spamtestSystem === false || !empty($warnings)){
			acymailing_display('Could not load your information from our server'.((!empty($warnings) && acymailing_isDebug()) ? $warnings : ''), 'error');
			return;
		}
		$decodedInformation = json_decode($spamtestSystem, true);
		if(!empty($decodedInformation['messages']) || !empty($decodedInformation['error'])){
			$msgError = (!empty($decodedInformation['messages'])) ? $decodedInformation['messages'].'<br />' : '';
			$msgError .= (!empty($decodedInformation['error'])) ? $decodedInformation['error'] : '';
			acymailing_display($msgError, 'error');
			return;
		}
		if(empty($decodedInformation['email'])){
			acymailing_display('Missing test mail address', 'error');
			return;
		}

		$receiver = new stdClass();
		$receiver->subid = 0;
		$receiver->email = $decodedInformation['email'];
		$receiver->name = $decodedInformation['name'];
		$receiver->html = 1;
		$receiver->confirmed = 1;
		$receiver->enabled = 1;

		$mailerHelper = acymailing_get('helper.mailer');
		$mailerHelper->checkConfirmField = false;
		$mailerHelper->checkEnabled = false;
		$mailerHelper->checkPublished = false;
		$mailerHelper->checkAccept = false;
		$mailerHelper->loadedToSend = true;
		$mailerHelper->report = false;

		if(!$mailerHelper->sendOne($mailid, $receiver)){
			acymailing_display($mailerHelper->reportMessage, 'error');
			return;
		}
		
		acymailing_redirect($decodedInformation['displayURL']);
		return;
	}
}
components/com_acymailing/controllers/update.php000060400000012632152453623450016256 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class UpdateController extends acymailingController{

	function __construct($config = array()){
		parent::__construct($config);
		$this->registerDefaultTask('update');
	}

	function listing(){
		return $this->update();
	}

	function install(){
		acymailing_increasePerf();

		$newConfig = new stdClass();
		$newConfig->installcomplete = 1;
		$config = acymailing_config();

		$updateHelper = acymailing_get('helper.update');

		if(!$config->save($newConfig)){
			$updateHelper->installTables();
			return;
		}

		$updateHelper->installLanguages();
		$updateHelper->initList();
		$updateHelper->installTemplates();
		$updateHelper->installNotifications();
		$updateHelper->installFields();
		$updateHelper->installMenu();
		$updateHelper->installExtensions();
		$updateHelper->installBounceRules();
		$updateHelper->fixDoubleExtension();
		$updateHelper->addUpdateSite();
		$updateHelper->fixMenu();

		if(ACYMAILING_J30) acymailing_moveFile(ACYMAILING_BACK.'acymailing_j3.xml', ACYMAILING_BACK.'acymailing.xml');

		$acyToolbar = acymailing_get('helper.toolbar');
		$acyToolbar->setTitle('AcyMailing', 'dashboard');
		$acyToolbar->display();

		$this->_iframe(ACYMAILING_UPDATEURL.'install&fromversion='.acymailing_getVar('cmd', 'fromversion').'&fromlevel='.acymailing_getVar('cmd', 'fromlevel'));
	}

	function update(){

		$config = acymailing_config();
		if(!acymailing_isAllowed($config->get('acl_config_manage', 'all'))){
			acymailing_display(acymailing_translation('ACY_NOTALLOWED'), 'error');
			return false;
		}

		$acyToolbar = acymailing_get('helper.toolbar');
		$acyToolbar->setTitle(acymailing_translation('UPDATE_ABOUT'), 'update');
		$acyToolbar->link(acymailing_completeLink('dashboard'), acymailing_translation('ACY_CLOSE'), 'cancel');
		$acyToolbar->display();

		return $this->_iframe(ACYMAILING_UPDATEURL.'update');
	}

	function _iframe($url){

		$config = acymailing_config();
		$url .= '&version='.$config->get('version').'&level='.$config->get('level').'&component=acymailing';
		?>
		<div id="acymailing_div">
			<iframe allowtransparency="true" scrolling="auto" height="700px" frameborder="0" width="100%" name="acymailing_frame" id="acymailing_frame" src="<?php echo $url; ?>">
			</iframe>
		</div>
	<?php
	}

	function checkForNewVersion(){

		$config = acymailing_config();
		ob_start();
		$url = ACYMAILING_UPDATEURL.'loadUserInformation&component=acymailing&level='.strtolower($config->get('level', 'starter'));
		$userInformation = acymailing_fileGetContent($url, 30);
		$warnings = ob_get_clean();
		$result = (!empty($warnings) && acymailing_isDebug()) ? $warnings : '';

		if(empty($userInformation) || $userInformation === false){
			echo json_encode(array('content' => '<br/><span style="color:#C10000;">Could not load your information from our server</span><br/>'.$result));
			exit;
		}

		$decodedInformation = json_decode($userInformation, true);

		$newConfig = new stdClass();

		$listPluginNeedToUpDate = array();

		if(!ACYMAILING_J16) {
			$query = "SELECT element, id, folder
					FROM `#__plugins` 
					WHERE `folder` = 'acymailing' OR `element` LIKE '%acymailing%' OR `name` LIKE '%acymailing%'";
		}else{
			$query = "SELECT element, folder, manifest_cache AS mc, extension_id AS id 
					FROM `#__extensions` 
					WHERE `state` <> -1 AND `type`= 'plugin' AND (`folder` = 'acymailing' OR `element` LIKE '%acymailing%' OR `name` LIKE '%acymailing%')";
		}

		$plugins = acymailing_loadObjectList($query);
		if(!empty($plugins)){
			foreach($plugins as $plugin){
				if(ACYMAILING_J16) {
					$manifest = json_decode($plugin->mc);
					if(empty($manifest->version)) $manifest = simplexml_load_file(JURI::root().'/plugins/'.$plugin->folder.'/'.$plugin->element.'/'.$plugin->element.'.xml');
				}else{
					$manifest = simplexml_load_file(JURI::root().'/plugins/'.$plugin->folder.'/'.$plugin->element.'.xml');
				}
				$actualVersion = (string)$manifest->version;

				$pluginOnServer = @simplexml_load_file(ACYMAILING_PLUGINURL.$plugin->element.'.xml');
				if(empty($pluginOnServer) || $actualVersion >= (string)$pluginOnServer->update[0]->version) continue;
				$listPluginNeedToUpDate[] = $plugin->id;
			}
		}

		$newConfig->pluginNeedUpdate = empty($listPluginNeedToUpDate) ? '' : json_encode($listPluginNeedToUpDate);

		$newConfig->latestversion = $decodedInformation['latestversion'];
		$newConfig->expirationdate = $decodedInformation['expiration'];
		$newConfig->lastlicensecheck = time();
		$config->save($newConfig);

		$menuHelper = acymailing_get('helper.acymenu');
		$myAcyArea = $menuHelper->myacymailingarea();

		echo json_encode(array('content' => $myAcyArea));
		exit;
	}

	function acysms(){
		$config = acymailing_config();
		if(!acymailing_isAllowed($config->get('acl_configuration_manage', 'all'))){
			acymailing_display(acymailing_translation('ACY_NOTALLOWED'), 'error');
			return false;
		}
		if(file_exists(ACYMAILING_ROOT.'components'.DS.'com_acysms')) {
			if(!JComponentHelper::isEnabled('com_acysms')){
				acymailing_query('UPDATE #__extensions SET `enabled` = 1 WHERE `element` = "com_acysms" AND `type` = "component"');
			}
			acymailing_redirect('index.php?option=com_acysms');
		}else{
			acymailing_setVar('layout', 'acysms');
			return parent::display();
		}
	}
}
components/com_acymailing/controllers/notification.php000060400000000612152453623450017455 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
include(ACYMAILING_BACK.'controllers'.DS.'newsletter.php');

class NotificationController extends NewsletterController{

}
components/com_acymailing/controllers/newsletter.php000060400000023250152453623450017166 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class NewsletterController extends acymailingController{

	var $aclCat = 'newsletters';

	function replacetags(){
		if(!$this->isAllowed($this->aclCat, 'manage')) return;
		$this->store();
		return $this->edit();
	}

	function copy(){
		if(!$this->isAllowed($this->aclCat, 'manage')) return;
		acymailing_checkToken();

		$cids = acymailing_getVar('array', 'cid', array(), '');
		$time = time();

		$creatorId = intval(acymailing_currentUserId());

		$addSendDate = '';
		if(!empty($this->copySendDate)) $addSendDate = ', `senddate`';

		foreach($cids as $oneMailid){
			$query = 'INSERT INTO `#__acymailing_mail` (`subject`, `body`, `altbody`, `published`'.$addSendDate.', `created`, `fromname`, `fromemail`, `replyname`, `replyemail`, `bccaddresses`, `type`, `visible`, `userid`, `alias`, `attach`, `html`, `tempid`, `key`, `frequency`, `params`,`filter`,`metakey`,`metadesc`)';
			$query .= " SELECT CONCAT('copy_',`subject`), `body`, `altbody`, 0".$addSendDate.", '.$time.', `fromname`, `fromemail`, `replyname`, `replyemail`, `bccaddresses`, `type`, `visible`, '.$creatorId.', `alias`, `attach`, `html`, `tempid`, ".acymailing_escapeDB(acymailing_generateKey(8)).', `frequency`, `params`,`filter`,`metakey`,`metadesc` FROM `#__acymailing_mail` WHERE `mailid` = '.(int)$oneMailid;
			acymailing_query($query);
			$newMailid = acymailing_insertID();
			acymailing_query('INSERT IGNORE INTO `#__acymailing_listmail` (`listid`,`mailid`) SELECT `listid`,'.$newMailid.' FROM `#__acymailing_listmail` WHERE `mailid` = '.(int)$oneMailid);
			acymailing_query('INSERT IGNORE INTO `#__acymailing_tagmail` (`tagid`,`mailid`) SELECT `tagid`,'.$newMailid.' FROM `#__acymailing_tagmail` WHERE `mailid` = '.(int)$oneMailid);
		}

		return $this->listing();
	}

	function store(){
			if(!$this->isAllowed($this->aclCat, 'manage')) return;
			acymailing_checkToken();
			header('X-XSS-Protection:0');

			$mailClass = acymailing_get('class.mail');
			$status = $mailClass->saveForm();
			if($status){
				acymailing_enqueueMessage(acymailing_translation('JOOMEXT_SUCC_SAVED'), 'message');
			}else{
				acymailing_enqueueMessage(acymailing_translation('ERROR_SAVING'), 'error');
				if(!empty($mailClass->errors)){
					foreach($mailClass->errors as $oneError){
						acymailing_enqueueMessage($oneError, 'error');
					}
				}
			}
	}

	function unschedule(){
		if(!$this->isAllowed($this->aclCat, 'schedule')) return;
		acymailing_checkToken();
		$mailid = acymailing_getCID('mailid');

		if(empty($mailid)) die('Missing mail ID');
		$mail = new stdClass();
		$mail->mailid = $mailid;
		$mail->senddate = 0;
		$mail->published = 0;

		$mailClass = acymailing_get('class.mail');
		$mailClass->save($mail);

		acymailing_enqueueMessage(acymailing_translation('SUCC_UNSCHED'));

		return $this->preview();
	}

	function remove(){
		if(!$this->isAllowed($this->aclCat, 'delete')) return;
		acymailing_checkToken();

		$cids = acymailing_getVar('array', 'cid', array(), '');

		$class = acymailing_get('class.mail');
		$num = $class->delete($cids);

		acymailing_arrayToInteger($cids);
		acymailing_query('DELETE FROM `#__acymailing_listmail` WHERE `mailid` IN ('.implode(',', $cids).')');

		acymailing_enqueueMessage(acymailing_translation_sprintf('SUCC_DELETE_ELEMENTS', $num), 'message');

		return $this->listing();
	}

	function savepreview(){
		$this->store();
		return $this->preview();
	}


	function saveastmpl(){
		$this->store();
		$mailclass = acymailing_get('class.mail');
		$mailclass->saveastmpl();
		return $this->edit();
	}

	function preview(){
		acymailing_setVar('layout', 'preview');
		return parent::display();
	}

	function sendtest(){
		$this->_sendtest();
		return $this->preview();
	}

	function _sendtest(){
		acymailing_checkToken();

		$mailid = acymailing_getCID('mailid');
		$test_selection = acymailing_getVar('string', 'test_selection', '', '');

		if(empty($mailid) OR empty($test_selection)) return false;

		$mailer = acymailing_get('helper.mailer');
		$mailer->forceVersion = acymailing_getVar('int', 'test_html', 1, '');
		$mailer->autoAddUser = true;
		if(acymailing_isAdmin()) $mailer->SMTPDebug = 1;
		$mailer->checkConfirmField = false;
		$comment = acymailing_getVar('string', 'commentTest', '');
		if(!empty($comment)) $mailer->introtext = '<div align="center" style="max-width:600px;margin:auto;margin-top:10px;margin-bottom:10px;padding:10px;border:1px solid #cccccc;background-color:#f6f6f6;color:#333333;">'.nl2br($comment).'</div>';

		$receivers = array();
		if($test_selection == 'users'){
			$receiverEntry = acymailing_getVar('string', 'test_emails', '', '');
			if(!empty($receiverEntry)){
				if(substr_count($receiverEntry, '@') > 1){
					$receivers = explode(',', trim(preg_replace('# +#', '', $receiverEntry)));
				}else{
					$receivers[] = trim($receiverEntry);
				}
			}
		}else{
			$gid = acymailing_getVar('int', 'test_group', '-1');
			if($gid == -1) return false;
			if(!ACYMAILING_J16){
				$receivers = acymailing_loadResultArray('SELECT '.$this->cmsUserVars->email.' AS email FROM '.acymailing_table($this->cmsUserVars->table, false).' WHERE gid = '.intval($gid));
			}else{
				$receivers = acymailing_loadResultArray('SELECT u.'.$this->cmsUserVars->email.' AS email FROM '.acymailing_table($this->cmsUserVars->table, false).' AS u JOIN '.acymailing_table('user_usergroup_map', false).' AS ugm ON u.'.$this->cmsUserVars->id.' = ugm.user_id WHERE ugm.group_id = '.intval($gid));
			}
		}

		if(empty($receivers)){
			acymailing_enqueueMessage(acymailing_translation('NO_SUBSCRIBER'), 'notice');
			return false;
		}

		$result = true;
		foreach($receivers as $receiver){
			$result = $mailer->sendOne($mailid, $receiver) && $result;
		}

		return $result;
	}

	function upload(){
		if(!$this->isAllowed($this->aclCat, 'manage')) return;
		acymailing_setVar('layout', 'upload');
		return parent::display();
	}

	function abtesting(){
		acymailing_setVar('layout', 'abtesting');
		return parent::display();
	}

	function abtest(){
		$nbTotalReceivers = acymailing_getVar('int', 'nbTotalReceivers');
		$mailids = acymailing_getVar('string', 'mailid');
		$mailsArray = explode(',', $mailids);
		acymailing_arrayToInteger($mailsArray);


		$abTesting_prct = acymailing_getVar('int', 'abTesting_prct');
		$abTesting_delay = acymailing_getVar('int', 'abTesting_delay');
		$abTesting_action = acymailing_getVar('string', 'abTesting_action');

		if(empty($abTesting_prct)){
			acymailing_display(acymailing_translation('ABTESTING_NEEDVALUE'), 'warning');
			$this->abtesting();
			return;
		}

		$newAbTestDetail = array();
		$newAbTestDetail['mailids'] = implode(',', $mailsArray);
		$newAbTestDetail['prct'] = (!empty($abTesting_prct) ? $abTesting_prct : '');
		$newAbTestDetail['delay'] = (isset($abTesting_delay) && strlen($abTesting_delay) > 0 ? $abTesting_delay : '2');
		$newAbTestDetail['action'] = (!empty($abTesting_action) ? $abTesting_action : 'manual');
		$newAbTestDetail['time'] = time();
		$newAbTestDetail['status'] = 'inProgress';
		$mailClass = acymailing_get('class.mail');
		$nbReceiversTest = $mailClass->ab_test($newAbTestDetail, $mailsArray, $nbTotalReceivers);

		acymailing_enqueueMessage(acymailing_translation_sprintf('ABTESTING_SUCCESSADD', $nbReceiversTest), 'info');
		acymailing_setVar('validationStatus', 'abTestAdd');
		$this->abtesting();
	}

	function complete_abtest(){
		$mailid = acymailing_getVar('int', 'mailToSend');
		$mailClass = acymailing_get('class.mail');
		$newMailid = $mailClass->complete_abtest('manual', $mailid);

		$finalMail = $mailClass->get($newMailid);
		acymailing_enqueueMessage(acymailing_translation_sprintf('ABTESTING_FINALSEND', $finalMail->subject), 'info');
		acymailing_setVar('validationStatus', 'abTestFinalSend');
		$this->abtesting();
	}

	function douploadnewsletter(){
		if(!$this->isAllowed($this->aclCat, 'manage')) return;
		acymailing_checkToken();

		$templateClass = acymailing_get('class.template');
		$templateClass->checkAreas = false;
		$statusUpload = $templateClass->doupload();

		if($statusUpload){
			$mailClass = acymailing_get('class.mail');
			$mail = new stdClass();
			$newTemplate = $templateClass->get($templateClass->templateId);
			$mail->subject = $newTemplate->name;
			$mail->body = $newTemplate->body;
			$mail->tempid = $templateClass->templateId;

			$idMailCreated = $mailClass->save($mail);
			if($idMailCreated){
				acymailing_enqueueMessage(acymailing_translation('NEWSLETTER_INSTALLED'), 'success');
				acymailing_setNoTemplate(false);
				$js = "setTimeout('redirect()',2000); function redirect(){window.top.location.href = '".acymailing_completeLink('newsletter&task=edit&mailid='.$idMailCreated, false, true)."'; }";
				acymailing_addScript(true, $js);
				return;
			}else{
				acymailing_enqueueMessage(acymailing_translation('ERROR_SAVING'), 'error');
				return $this->upload();
			}
		}else{
			return $this->upload();
		}
	}

	function cancelNewsletter(){
		$queueController = acymailing_get('controller.queue');
		$queueController->cancelNewsletter();
		return $this->listing();
	}

	function checkifedited(){
		if(empty($_SESSION['timeOnModification'])) exit;

		$mailClass = acymailing_get('class.mail');
		$mailId = acymailing_getVar('int', 'mailId');
		$mail = $mailClass->get($mailId);

		if(!empty($mail->lastupdate) && $_SESSION['timeOnModification'] < $mail->lastupdate){
			$userId = acymailing_loadResult('SELECT userlastupdate FROM #__acymailing_mail WHERE mailid = '.intval($mailId));
			echo $userId.'|'.acymailing_currentUserName($userId);
		}
		exit;
	}

	function cancel(){
		header('X-XSS-Protection:0');
		return $this->listing();
	}
}
components/com_acymailing/controllers/index.html000060400000000054152453623450016253 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/controllers/editor.php000060400000154554152453623450016274 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class EditorController extends acymailingController{

	function __construct($config = array()){
		parent::__construct($config);
		acymailing_setNoTemplate();
		
		
		if(!acymailing_isAdmin()){
			acymailing_addStyle(false, ACYMAILING_CSS.'acyicon.css?v='.filemtime(ACYMAILING_MEDIA.'css'.DS.'acyicon.css'));
		}
		$this->registerDefaultTask('browse');
	}

	function browse(){
		$this->_setCss();
		$this->_setJs();
		$this->_displayHTML();
	}

	private function _setCss(){
		if(acymailing_getVar('none', 'inpopup', '') == 'true'){
			$height_acy_media_browser_table = 420;
			$height_acy_media_browser_list = 310;
			$width_acy_media_browser_actions = 393;
			$width_acy_media_browser_hidden_elements = 395;
			$height_acy_media_browser_image_details = 415;
			$width_acy_media_browser_buttons_block = 365;
			$width_acy_media_browser_url_input = 60;
		}else{
			$height_acy_media_browser_table = 540;
			$height_acy_media_browser_list = 450;
			$width_acy_media_browser_actions = 522;
			$width_acy_media_browser_hidden_elements = 522;
			$height_acy_media_browser_image_details = 550;
			$width_acy_media_browser_buttons_block = 492;
			$width_acy_media_browser_url_input = 70;
		}

		$css = "
			#import_from_url, #upload_image {
				display: none;
			}

			#acy_media_browser_hidden_elements, #acy_media_browser_buttons_block, #acy_media_browser_buttons_block {
				transition: all 0.3s ease;
			}

			#acy_media_browser_table{
				height:".$height_acy_media_browser_table."px;
				width:100%;
				margin: 0px;
				border: 1px solid rgb(233, 233, 233);
				box-shadow: 4px 4px 4px -4px rgba(0, 0, 0, 0.1);
			}

			#acy_media_browser_path_dropdown{
				float:left;
				margin-left:15px;
				margin-top:15px;
				width:60%;
			}

			#acy_media_browser_global_create_folder{
				width:28%;
				float:right;
				margin-top:15px;
				margin-right:10px;
			}

			#acy_media_browser_create_folder{
				width:100%;
			}

			#create_folder_btn{
				margin-top:0px;
			}

			#acy_media_browser_area_create_folder{
				position:absolute;
				z-index:10;
				margin-top:5px;
				border:1px solid #e9e9e9;
				height:0px;
				width:150px;
				background-color:#f6f6f6;
			}

			#subFolderName{
				width:80%;
				margin-left:7px;
				margin-top:5px;
			}

			#acy_media_browser_area_create_folder .btn{
				float:right;
				margin-right:5px
			}

			#acy_media_browser_message{
				height:450px;
				overflow:auto;
				margin:0px;
				padding:5px;
				border-bottom: 1px solid rgb(233, 233, 233);
			}

			#acy_media_browser_list{
				height:".$height_acy_media_browser_list."px;
				overflow-x:hidden;
				margin:0px;
				padding:0px;
				border-bottom: 1px solid rgb(233, 233, 233);
			}

			.acy_media_browser_image_size{
				color: #AAAAAA;
			}

			#acy_media_browser_actions{
				text-align:center;
				box-shadow: 0px -4px 4px -4px rgba(0, 0, 0, 0.3);
				width:".$width_acy_media_browser_actions."px;
				overflow:hidden;
				height: 100px;
			}

			#acy_media_browser_containing_block{
				height: 70px;
				width:522px;
			}

			#acy_media_browser_buttons_block{
				padding:22px 15px 0px;
				width: ".$width_acy_media_browser_buttons_block."px;
				float:left;
				display:inline-block;
			}

			#acy_media_browser_hidden_elements{
					width:".$width_acy_media_browser_hidden_elements."px;
			}

			#acy_media_browser_url_input{
				width:".$width_acy_media_browser_url_input."%;
				margin:0px;
			}

			#acy_media_browser_insert_message{
				margin-top:5px;
			}

			#acy_media_browser_image_details_row{
				width:35%;
				vertical-align:top;
				background-color: rgb(246, 246, 246);
				border: 1px solid rgb(233, 233, 233);
				font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif;
				font-size: 13px;
				line-height: 18px;
				color: rgb(102, 102, 102);
			}

			#acy_media_browser_image_details{
				position: relative;
				width: 85%;
				overflow-x:hidden;
				height: ".$height_acy_media_browser_image_details."px;
				padding: 15px;
			}

			#acy_media_browser_image_selected_info{
				width:230px;
				float:left;
				margin-bottom:10px;
			}

			#acy_media_browser_image_selected_details label{
				font-weight: bold;
			}

			#acy_media_browser_image_selected_details input {
				margin-bottom: 7px;
				}

			#acy_media_browser_image_selected_details select {
				margin-bottom: 7px;
				}

			.alert{
					padding: 8px 35px 8px 14px;
					margin-bottom: 18px;
					text-shadow: 0px 1px 0px rgba(255, 255, 255, 0.5);
					background-color: rgb(252, 248, 227);
					border: 1px solid rgb(251, 238, 213);
					border-radius: 4px;
			}

			.alert-error{
				background-color: rgb(242, 222, 222);
				border-color: rgb(238, 211, 215);
				color: rgb(185, 74, 72);
			}

			.alert-success {
					background-color: rgb(223, 240, 216);
					border-color: rgb(214, 233, 198);
					color: rgb(70, 136, 71);
			}

			li.acy_media_browser_images {position: relative; height: 135px; width:135px; display:inline-block; margin:14px; margin-top:7px; text-align:center; border: 1px solid #eee;}
			.acy_media_browser_images img{max-height:135px; width:auto; max-width:135px; vertical-align:top;}

			.acy_media_browser_images img.acy_media_browser_delete{height:24px; width:24px; vertical-align:top; position:absolute; right:0px; top:0px; z-index:990; cursor: pointer;}
			#acy_media_browser_list .acy_media_browser_image_size{color: #666; text-shadow:1px 1px 1px #ffffff; font-weight:normal}

			#confirmBoxMM{
				width: 370px;
				background: rgba(255, 255, 255, 0.8);
				border: 1px solid #d6d6d6;
				padding: 5px;
				border-radius: 5px;
				box-shadow: 1px 1px 5px #dddddd;
				-moz-box-shadow: 1px 1px 5px #dddddd;
				-webkit-box-shadow: 1px 1px 5px #dddddd;
				position: absolute;
				left: 234px;
				top: 150px;
				z-index: 999;
			}

			#acy_popup_content{
				background-color: #fff;
				padding: 20px;
				text-align: center;
				color: #706f6f;
			}

			.acy_folder_name{
				color: #5e93c0
			}

		";
		if(!ACYMAILING_J30){
			$css = $css."#acy_media_browser_area_create_folder .btn{
					margin-top:30px;
					margin-right:20px;
				}
				#subFolderName{
					margin-left:13px;
				}
			";
		}
		echo '<style>'.$css.'</style>';
	}

	private function _setJs(){
		$websiteurl = rtrim(acymailing_rootURI(), '/').'/';

		acymailing_addScript(false, $websiteurl.ACYMAILING_MEDIA_FOLDER.'/js/jquery/jquery-1.9.1.min.js?v='.@filemtime(ACYMAILING_ROOT.str_replace('/', DS, ACYMAILING_MEDIA_FOLDER).DS.'js'.DS.'jquery'.DS.'jquery-1.9.1.min.js'));

		$imageZone = acymailing_getVar('array', 'image_zone', array(), '');
		if(empty($imageZone)){
			$getAdditionalTags = "
					var selectedImageWidth = document.getElementById('acy_media_browser_image_width').value;
					var selectedImageHeight = document.getElementById('acy_media_browser_image_height').value;
					var selectedImageAlign = document.getElementById('acy_media_browser_image_align').value;
					var selectedImageBorder = document.getElementById('acy_media_browser_image_border').value;
					var selectedImageMargin = document.getElementById('acy_media_browser_image_margin').value;

					var width = ''; var height =''; var align=''; var border = ''; var margin = '';
					if(selectedImageWidth>0) width =  ' width:' + selectedImageWidth + 'px; ';
					if(selectedImageHeight>0) height = ' height:' +  selectedImageHeight + 'px; ';
					if(selectedImageAlign) align = 'float:' + selectedImageAlign + ';';
					if(selectedImageWidth>0 && selectedImageAlign.trim()=='center') align = 'margin:auto;';
					if(selectedImageBorder) border = ' border:' +  selectedImageBorder + '; ';
					if(selectedImageBorder>0 ) border = ' border: solid ' +  selectedImageBorder + 'px; ';
					if(selectedImageMargin>0) margin = ' margin:' +  selectedImageMargin + 'px; ';
					else if(selectedImageMargin) margin = ' margin:' +  selectedImageMargin + '; ';
					var imgSize = ' height =\"' + selectedImageHeight + '\" width = \"' + selectedImageWidth + '\"';
							";
			$sizeAndAlignTags = " style=\"' + height + width + align + border + margin +'\" ";

			$insertImage = "window.parent.insertImageTag(tag, previousSelection);";
		}else{
			$getAdditionalTags = "var selectedImageRef = document.getElementById('acy_media_browser_image_target').value; ";
			$sizeAndAlignTags = "";
			$insertImage = "window.parent.jInsertEditorText(tag, this.editor);";
		}

		if(acymailing_getVar('none', 'inpopup', '') == 'true'){
			$imgMaxHeight = 150;
			$slideValue = -395;
		}else{
			$imgMaxHeight = 190;
			$slideValue = -522;
		}
		
		$js = "
				var previousSelection = window.parent.getPreviousSelection();

				function checkSelected(imageZone) {

					if(imageZone){
						var editor = window.parent.CKEDITOR.editor;

						o = this._getUriObject(window.self.location.href);
						q = this._getQueryObject(o.query);
						zone = decodeURIComponent(q.e_name);

						var html = window.parent.getSelectedHTML(zone);
						var parsedSelection = jQuery.parseHTML(html);

						if(!parsedSelection)
							return false;

						if(parsedSelection[0].tagName == 'A'){
							var parsedImage = jQuery.parseHTML(parsedSelection[0].innerHTML);
							parsedImage = parsedImage[0];

							if(parsedSelection[0].href)
									document.getElementById('acy_media_browser_image_target').value =  parsedSelection[0].href;
						}else if(parsedSelection[0].tagName == 'IMG'){
							var parsedImage = parsedSelection[0];
						}

						if(!parsedImage) return false;

						var name = parsedImage.src.substr(parsedImage.src.lastIndexOf('/') + 1);
						if(parsedImage.src.substring(0,4)=='http'){
							var imageUrl =  parsedImage.src;
						}else{
							var imageUrl =  '".ACYMAILING_LIVE."' + parsedImage.src;
						}
						var width = parsedImage.width;
						var height = parsedImage.height;
						displayImageFromUrl(imageUrl, 'success', name, width, height);
						if(parsedImage.alt)
							document.getElementById('acy_media_browser_image_title').value =  parsedImage.alt;
					}else{
						var editor =  window.parent.editor;
						var sel = editor.getSelection();
						var ranges = sel.getRanges();
						var el = new window.parent.CKEDITOR.dom.element('div');
						for (var i = 0, len = ranges.length; i < len; ++i) {
								el.append(ranges[i].cloneContents());
						}

						if(el.getFirst() && el.getFirst().getName() == 'a'){
							var selection = el.getFirst().getHtml();
							var selectedImageRef = el.getFirst().getAttribute('href');
						} else{
							var selection = el.getHtml();
						}

						var parsedSelection = jQuery.parseHTML(selection);

						if(!parsedSelection)
							return false;
							
						if(parsedSelection[0].tagName == 'IMG'){
							var name = parsedSelection[0].src.substr(parsedSelection[0].src.lastIndexOf('/') + 1);
							var width = parsedSelection[0].width;
							var height = parsedSelection[0].height;
							if($(selection).attr('src').substring(0,4) == 'http'){
								var imageUrl =  $(selection).attr('src');
							}else{
								var imageUrl =  '".ACYMAILING_LIVE."' + $(selection).attr('src');
							}
							displayImageFromUrl(imageUrl, 'success', name, width, height);

							if(parsedSelection[0].alt)
								document.getElementById('acy_media_browser_image_title').value =  parsedSelection[0].alt;
							if(parsedSelection[0].style.width)
								document.getElementById('acy_media_browser_image_width').value =  parsedSelection[0].style.width.slice(0,-2);
							if(parsedSelection[0].style.height)
								document.getElementById('acy_media_browser_image_height').value =  parsedSelection[0].style.height.slice(0,-2);
							if(parsedSelection[0].style.cssFloat)
								document.getElementById('acy_media_browser_image_align').value =  parsedSelection[0].style.cssFloat;
							if(parsedSelection[0].style.margin)
								document.getElementById('acy_media_browser_image_margin').value =  parsedSelection[0].style.margin;
							if(parsedSelection[0].style.border)
								document.getElementById('acy_media_browser_image_border').value =  parsedSelection[0].style.border;
							if(parsedSelection[0].className)
								document.getElementById('acy_media_browser_image_class').value =  parsedSelection[0].className;
							if(selectedImageRef)
								document.getElementById('acy_media_browser_image_linkhref').value = selectedImageRef;
						}
					}
				}

				function removeAllListener(el) {
					var elClone = el.cloneNode(true);
					el.parentNode.replaceChild(elClone, el);
					return elClone;
				}

				function addResizeDragListener(src) {
					var elements = document.getElementsByClassName('drag-resize');
					for(var i = 0; i < elements.length; i++) {
						var element = elements[i];
						element = removeAllListener(element);
						
						if(navigator.userAgent.indexOf('Firefox') > 0) {
							var currentlyDrag = false;
							element.addEventListener('mousedown', function(event) {
								currentlyDrag = true;
							});
	
							element.addEventListener('mousemove', function(event) {
								if(!currentlyDrag) return;
								var scaleValue = event.offsetX;
								if(scaleValue < 0) return false;
								preloadCanvas(src, scaleValue+50);
							});
							
							document.addEventListener('mouseup', function(event) {
								currentlyDrag = false;
							});
						}else{
							element.addEventListener('drag', function(event) {
								var scaleValue = event.offsetX;
								if(scaleValue < 0) return false;
								preloadCanvas(src, scaleValue);
							});
	
							element.addEventListener('dragstart', function(event) {
								if(typeof event.dataTransfer.setDragImage === 'function'){
									var dragIcon = document.createElement('img');
									event.dataTransfer.setDragImage(dragIcon, 0, 0);
								}
							});
						}
					}
				}

				function addCropDragListener(src) {
					var elements = document.getElementsByClassName('drag-resize');
					for(var i = 0; i < elements.length; i++) {
						var element = elements[i];
						element = removeAllListener(element);

						if(navigator.userAgent.indexOf('Firefox') > 0) {
							var currentlyCrop = false;
							element.addEventListener('mousedown', function(event) {
								currentlyCrop = true;
								var coords = {x: event.offsetX, y: event.offsetY, screenX: event.screenX, screenY: event.screenY};
								this.setAttribute('initial-click', JSON.stringify(coords));
							});
	
							element.addEventListener('mousemove', function(event) {
								if(!currentlyCrop) return;
								var coords = JSON.parse(this.getAttribute('initial-click'));
								var width = (event.screenX - coords.screenX);
								var height = (event.screenY - coords.screenY);
								drawRectangle(src, coords.x, coords.y, width, height);
							});
							
							document.addEventListener('mouseup', function(event) {
								if(!currentlyCrop) return;
								currentlyCrop = false;
								
								var coords = JSON.parse(element.getAttribute('initial-click'));
								element.removeAttribute('initial-click');
								var width = (event.screenX - coords.screenX);
								var height = (event.screenY - coords.screenY);
								if(width < 0) {
									width = Math.abs(width);
									coords.x = coords.x - width;
								}
								if (height < 0) {
									height = Math.abs(height);
									coords.y = coords.y - height;
								}
	
								cropImage(src, coords.x, coords.y, width, height)
							});
						}else{
							element.addEventListener('dragend', function(event) {
								var coords = JSON.parse(this.getAttribute('initial-click'));
								this.removeAttribute('initial-click');
								var width = (event.screenX - coords.screenX);
								var height = (event.screenY - coords.screenY);
								if(width < 0) {
									width = Math.abs(width);
									coords.x = coords.x - width;
								}
								if (height < 0) {
									height = Math.abs(height);
									coords.y = coords.y - height;
								}
	
								cropImage(src, coords.x, coords.y, width, height)
							});
	
							element.addEventListener('dragstart', function(event) {
								var coords = {x: event.offsetX, y: event.offsetY, screenX: event.screenX, screenY: event.screenY};
								this.setAttribute('initial-click', JSON.stringify(coords));
								
								if(typeof event.dataTransfer.setDragImage === 'function'){
									var dragIcon = document.createElement('img');
									event.dataTransfer.setDragImage(dragIcon, 0, 0);
								}
							});
	
							element.addEventListener('drag', function(event) {
								var coords = JSON.parse(this.getAttribute('initial-click'));
								var width = (event.screenX - coords.screenX);
								var height = (event.screenY - coords.screenY);
								drawRectangle(src, coords.x, coords.y, width, height);
							});
						}
					}
				}

				function roundedCorner() {
					var selectedImage = document.getElementById('acy_media_browser_selected_image');
					if(typeof selectedImage == 'undefined') return false;

					var canvas = document.getElementById('edition-canvas');
					var ctx = canvas.getContext('2d');

					ctx.clearRect(0, 0, canvas.width, canvas.height);

					var image = new Image();
					image.src = selectedImage.src;

					canvas.width = image.width;
					canvas.height = image.height;

					image.onload = function(event) {
						var radius = document.getElementById('radius-image').value;
						roundedRectangle(0, 0, this.width, this.height, radius, ctx);
						ctx.clip();
						ctx.drawImage(this, 0, 0, this.width, this.height);
					}
				}

				function roundedRectangle(x, y, width, height, radius, ctx) {
				    ctx.beginPath();
				    ctx.moveTo(x + radius, y);
				    ctx.lineTo(x + width - radius, y);
				    ctx.quadraticCurveTo(x + width, y, x + width, y + radius);
				    ctx.lineTo(x + width, y + height - radius);
				    ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
				    ctx.lineTo(x + radius, y + height);
				    ctx.quadraticCurveTo(x, y + height, x, y + height - radius);
				    ctx.lineTo(x, y + radius);
				    ctx.quadraticCurveTo(x, y, x + radius, y);
				    ctx.closePath();
				}

				function cancelModification() {
					var selectedImage = document.getElementById('acy_media_browser_selected_image');
					var imageWidth = document.getElementById('acy_media_browser_image_width').value;
						
					if(typeof selectedImage == 'undefined') return false;
					preloadCanvas(selectedImage.src, imageWidth);
				}

				function changeToCrop() {
					var selectedImage = document.getElementById('acy_media_browser_selected_image');
					var imageWidth = document.getElementById('acy_media_browser_image_width').value;

					if(typeof selectedImage == 'undefined') return false;

					addCropDragListener(selectedImage.src);
					preloadCanvas(selectedImage.src, imageWidth);
				}

				function changeToScale() {
					var selectedImage = document.getElementById('acy_media_browser_selected_image');
					var imageWidth = document.getElementById('acy_media_browser_image_width').value;

					if(typeof selectedImage == 'undefined') return false;

					addResizeDragListener(selectedImage.src);
					preloadCanvas(selectedImage.src, imageWidth);
				}

				function validateImageModification() {
					var canvas = document.getElementById('edition-canvas');
					var dataURL = canvas.toDataURL('image/png');
					document.getElementById('imagedata').value = dataURL;
					
					var form = document.getElementById('form-edition');
					var queryString = form.action;
					var dataString = form.toQueryString();
					
					var xhr = new XMLHttpRequest();
					xhr.open('POST', queryString);
					xhr.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");
					xhr.onload = function(){
						closePanel();
						window.location.href = window.location.href;
					};
					xhr.send(dataString);
					
					return false;
				}

				function closePanel() {
					document.getElementById('image-edition').classList.add('hidden-edition');
				}

				function drawRectangle(src, sx, sy, sw, sh) {
					var canvas = document.createElement('canvas');
					canvas.id = 'edition-canvas';
					var machin = document.getElementById('edition-canvas');
					var parent = machin.parentElement;
					parent.removeChild(machin);
					parent.appendChild(canvas);
					
					canvas = document.getElementById('edition-canvas');
					
					
					var ctx = canvas.getContext('2d');
					var image = new Image();
					image.src = src;

					canvas.width = image.width;
					canvas.height = image.height;

					ctx.drawImage(image, 0, 0, image.width, image.height);
					ctx.rect(sx, sy, sw, sh);
					ctx.strokeStyle='red';
					ctx.stroke();
				}

				function cropImage(src, sx, sy, sw, sh) {
					var canvas = document.getElementById('edition-canvas');
					var ctx = canvas.getContext('2d');
					var image = new Image();
					image.src = src;

					ctx.clearRect(0, 0, canvas.width, canvas.height);

					canvas.width = sw;
					canvas.height = sh;

					ctx.drawImage(image, sx, sy, sw, sh, 0, 0, sw, sh);
				}

				function preloadCanvas(src, width) {
					var canvas = document.getElementById('edition-canvas');
					var ctx = canvas.getContext('2d');
					var image = new Image();
					image.src = src;

					ctx.clearRect(0, 0, canvas.width, canvas.height);

					var ratio = image.width / image.height;

					canvas.width = width;
					canvas.height = (width / ratio);

					ctx.drawImage(image, 0, 0, width, (width / ratio));
				}

				function displayImageEdition() {
					var selectedImage = document.getElementById('acy_media_browser_selected_image');
					var imageWidth = document.getElementById('acy_media_browser_image_width').value;

					if(selectedImage == null) return false;
					addResizeDragListener(selectedImage.src);
					preloadCanvas(selectedImage.src, imageWidth);
					document.getElementById('pathtosave').value = document.getElementById('currentPath').value;

					document.getElementById('image-edition').classList.toggle('hidden-edition');
				}

				function displayImageFromUrl(url, result, name, width, height, fromUrl){
					if(result=='success'){
							var infos = '<div style=\"width:100%; display:block: height:1px; float:left; margin-top:10px;\"></div>';
							document.getElementById('acy_media_browser_image_selected').innerHTML='<img id=\"acy_media_browser_selected_image\" src=\"' + url + '\"  style=\"border: 1px solid rgb(233, 233, 233); float:left; margin-right:15px; max-width: 230px; max-height:".$imgMaxHeight."px;\"></img>'+infos;
							document.getElementById('acy_media_browser_image_selected').style.display=\"\";
							if(!name){ var name = url.substr(url.lastIndexOf('/') + 1); }
							if(width){
								document.getElementById('acy_media_browser_image_selected_info').innerHTML='<div><span id=\"acy_media_browser_image_selected_name\" style=\"font-weight:bold;\"> '+name+'</span><br />'+width+'x'+height+'<br />';
								var widthField = document.getElementById('acy_media_browser_image_width');
								var heightField = document.getElementById('acy_media_browser_image_height');
								if(widthField) widthField.value = width;
								if(heightField) heightField.value = height;
							}
							document.getElementById('acy_media_browser_image_selected_info').style.display=\"\";
							if(fromUrl){
								document.getElementById('acy_media_browser_insert_message').innerHTML='<span style=\"color:green;\">".str_replace("'", "\'", acymailing_translation('IMAGE_FOUND'))."</span>';
							}
					}else{
							document.getElementById('acy_media_browser_image_selected').innerHTML=\"\";
							document.getElementById('acy_media_browser_image_selected').style.display=\"none\";
							document.getElementById('acy_media_browser_image_selected_info').innerHTML=\"\";
							if(fromUrl){
								if(result='error'){
									document.getElementById('acy_media_browser_insert_message').innerHTML='<span style=\"color:red;\">".str_replace("'", "\'", acymailing_translation('IMAGE_NOT_FOUND'))."</span>';
								}else if(result='timeout'){
									document.getElementById('acy_media_browser_insert_message').innerHTML='<span style=\"color:red;\">".str_replace("'", "\'", acymailing_translation('IMAGE_TIMEOUT'))."</span>';
								}
							}
					}
				}


				function calculateSize(newHeight, newWidth){
					if((newHeight == '' && newWidth == '') || (newHeight == '' && newWidth == 0) || (newHeight == 0 && newWidth == '')) return;
					var img = document.getElementById('acy_media_browser_selected_image');
					if(!img) return;

					if(newHeight == 0)
						document.getElementById('acy_media_browser_image_height').value =  parseInt(img.naturalHeight * (newWidth / img.naturalWidth));

					if(newWidth == 0)
						document.getElementById('acy_media_browser_image_width').value =  parseInt(img.naturalWidth * (newHeight / img.naturalHeight));
				}


				function testImage(url, callback, timeout) {
					timeout = timeout || 5000;
						var timedOut = false, timer;
						var img = new Image();
						img.onerror = img.onabort = function() {
								if (!timedOut) {
										clearTimeout(timer);
										callback(url, \"error\", '', '', '',true);
								}
						};
						img.onload = function() {
								if (!timedOut) {
										clearTimeout(timer);
										callback(url, \"success\",'','', '',true);
								}
						};
						img.src = url;
						timer = setTimeout(function() {
								timedOut = true;
								callback(url, \"timeout\", '', '', '', true);
						}, timeout);
				}

				function displayAppropriateField(id){
					if(id==\"import_from_url_btn\"){
							document.getElementById('upload_image').style.display=\"none\";
							document.getElementById('import_from_url').style.display=\"block\";

							jQuery('#acy_media_browser_buttons_block').css('width', '0');
							jQuery('#acy_media_browser_buttons_block').css('opacity', '0');
							jQuery('#acy_media_browser_hidden_elements').css('width', '522px');
							jQuery('#acy_media_browser_hidden_elements').css('opacity', '1');

					}else if(id==\"upload_image_btn\"){
							document.getElementById('upload_image').style.display=\"block\";
							document.getElementById('import_from_url').style.display=\"none\";

							jQuery('#acy_media_browser_buttons_block').css('width', '0');
							jQuery('#acy_media_browser_buttons_block').css('opacity', '0');
							jQuery('#acy_media_browser_hidden_elements').css('width', '522px');
							jQuery('#acy_media_browser_hidden_elements').css('opacity', '1');

					}else if(id == \"create_folder_btn\"){
						if(document.getElementById('acy_media_browser_area_create_folder').style.display == \"none\"){
							document.getElementById('acy_media_browser_area_create_folder').style.display = \"\";
							jQuery('#acy_media_browser_area_create_folder').stop().animate({height: '85px'},400);
						}else{
							document.getElementById('acy_media_browser_area_create_folder').style.display = \"none\";
							jQuery('#acy_media_browser_area_create_folder').stop().animate({height: '0px'},400);
						}
					}else{
							jQuery('#acy_media_browser_hidden_elements').css('width', '0');
							jQuery('#acy_media_browser_hidden_elements').css('opacity', '0');
							jQuery('#acy_media_browser_buttons_block').css('width', '522px');
							jQuery('#acy_media_browser_buttons_block').css('opacity', '1');

					}
				}

				function toggleImageInfo(id, action){
					if(action==\"display\"){
							document.getElementById('acy_media_browser_image_info_'+id+'').style.display = \"\";
					}else{
							document.getElementById('acy_media_browser_image_info_'+id+'').style.display = \"none\";
					}
				}

				function _getQueryObject(q) {
					var vars = q.split(/[&;]/);
					var rs = {};
					if (vars.length){
						for(var i = 0 ; i<vars.length ; i++){
							var val = vars[i];
							var keys = val.split('=');
							if (keys.length && keys.length == 2) rs[encodeURIComponent(keys[0])] = encodeURIComponent(keys[1]);
						}
					}
					return rs;
				}

				function _getUriObject(u){
					var bits = u.match(/^(?:([^:\/?#.]+):)?(?:\/\/)?(([^:\/?#]*)(?::(\d*))?)((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[\?#]|$)))*\/?)?([^?#\/]*))?(?:\?([^#]*))?(?:#(.*))?/);
					
					return (bits)
						? {uri: bits[0], scheme: bits[1], authority: bits[2], domain: bits[3], port: bits[4], path: bits[5], directory: bits[6], file: bits[7], query: bits[8], fragment: bits[9]}
						: null;
				}

				function validateImage(){
					var urlInput = document.getElementById('acy_media_browser_url_input').value;
					var urlImageName = urlInput.substr(urlInput.lastIndexOf('/') + 1);
					var selectedImageName = '';
					if(document.getElementById('acy_media_browser_image_selected_name'))
					var selectedImageName = document.getElementById('acy_media_browser_image_selected_name').innerHTML;

					var selectedImageAlt = document.getElementById('acy_media_browser_image_title').value;
					var selectedImageRef = '';
					if(document.getElementById('acy_media_browser_image_linkhref'))
						var selectedImageRef = document.getElementById('acy_media_browser_image_linkhref').value;
					var selectedImageUrl = document.getElementById('acy_media_browser_selected_image').src;
					var imgSize = '';
					var selectedImageClass = '';
					if(document.getElementById('acy_media_browser_image_class'))
						var selectedImageClass = document.getElementById('acy_media_browser_image_class').value;

					".$getAdditionalTags."

					o = this._getUriObject(window.self.location.href);
					q = this._getQueryObject(o.query);
					this.editor = decodeURIComponent(q.e_name);

					var dropdown = document.getElementById('acy_media_browser_files_path');
					var path = dropdown.value;
					var base = ' ".ACYMAILING_LIVE." ';

					if(urlInput!='http://' && selectedImageName.trim()==urlImageName.trim()){
							var tag = '<img ' + imgSize + ' src=\"' + urlInput + '\" alt=\"' + selectedImageAlt + '\" ".$sizeAndAlignTags." class=\"' + selectedImageClass + '\" />';
					}else{
							var tag = '<img ' + imgSize + ' src=\"' + selectedImageUrl + '\" alt=\"' + selectedImageAlt + '\" ".$sizeAndAlignTags." class=\"' + selectedImageClass + '\" />';
					}

					if(selectedImageRef){
							tag = '<a href=\"' + selectedImageRef + '\">' + tag + '</a>';
					}

					".$insertImage."
					return false;
				}

				function changeFolder(folderName){
					var url = window.location.href;
					if (url.indexOf('?') > -1){
							var lastParam = url.substring(url.lastIndexOf('&') + 1);
							if(url.indexOf('pictName') > -1){
								var temp = url.split('&');
								for(var i=0;i<temp.length;i++){
									if(temp[i].indexOf('pictName') > -1){
										temp.splice(i, 1);
										i--;
									}
								}
								url = temp.join('&');
								lastParam = url.substring(url.lastIndexOf('&') + 1);
							}
							if(lastParam == 'task=createFolder')url = url.replace(lastParam,'task=browse&e_name=ACY_NAME_AREA');
							lastParam = lastParam.split('=');
							if(lastParam=='selected_folder')
								url = url.replace(lastParam, 'selected_folder='+folderName);
							else
								url += '&selected_folder='+folderName;
					}else{
							 url += '?selected_folder='+folderName;
					}
					window.location.href = url;
				}

				function confirmBox(type, pictName, originalName){
					if(type == 'delete'){
						document.getElementById('confirmTxtMM').innerHTML = '".acymailing_translation('ACY_VALIDDELETEITEMS')."<br /><span class=\"acy_folder_name\">('+pictName+')</span><br />';
						document.getElementById('textBtnAction').innerHTML = '".acymailing_translation('ACY_DELETE')."';
						document.getElementById('confirmOkMM').className = 'acymailing_button acymailing_button_delete';
						document.getElementById('iconAction').className = 'acyicon-delete';
					}else{
						document.getElementById('confirmTxtMM').innerHTML =  '".acymailing_translation('ACY_REPLACE_FILE_TEXT')."<br />';
						document.getElementById('textBtnAction').innerHTML = '".acymailing_translation('ACY_REPLACE_FILE')."';
						document.getElementById('confirmOkMM').className = 'acymailing_button';
						document.getElementById('iconAction').className = 'acyicon-edit';
					}

					var divDelete = document.getElementById('confirmOkMM');
					divDelete.onclick = function(){
						if(type == 'delete'){
							reloadAndAction(type, pictName);
						}else{
							reloadAndAction(type, pictName, originalName);
						}
					}
					var divConfirm = document.getElementById('confirmBoxMM');
					divConfirm.style.display = 'inline';
				}

				function reloadAndAction(type, pictName, originalName){
					var urlPict = window.location.href;
					var lastParam = urlPict.substring(urlPict.lastIndexOf('&') + 1);
					if(lastParam.indexOf('pictName=') > -1){
						urlPict = urlPict.substring(0, urlPict.indexOf('pictName=')-1);
					}
					if(lastParam.indexOf('pictRename=') > -1){
						urlPict = urlPict.substring(0, urlPict.indexOf('pictRename=')-1);
						lastParam = urlPict.substring(urlPict.lastIndexOf('&') + 1);
						if(lastParam.indexOf('originalName=') > -1){
							urlPict = urlPict.substring(0, urlPict.indexOf('originalName=')-1);
						}
					}

					if(urlPict.indexOf('?') > -1){
						if(type == 'delete'){
							window.location.href = urlPict + '&pictName=' + pictName;
						}else{
							window.location.href = urlPict + '&originalName=' + originalName + '&pictRename=' + pictName;
						}
					} else{
						if(type == 'delete'){
							window.location.href = urlPict + '?pictName=' + pictName;
						}else{
							window.location.href = urlPict + '?originalName=' + originalName + '&pictRename=' + pictName;
						}
					}
				}
				function changeDisplay(event){
					if(document.getElementById('displayPict').style.display == ''){
						display('list');
					}else{
						display('icons');
					}
				}
				function display(type){
					if(type == 'list'){
						document.getElementById('displayPict').style.display = 'none';
						document.getElementById('displayLine').style.display = '';
						document.getElementById('btn_change_display').title = '".acymailing_translation('ACY_DISPLAY_ICON')."';
						document.getElementById('iconTypeDisplay').className = 'acyicon-image_view';
					}else{
						document.getElementById('displayPict').style.display = '';
						document.getElementById('displayLine').style.display = 'none';
						document.getElementById('btn_change_display').title = '".acymailing_translation('ACY_DISPLAY_NOICON')."';
						document.getElementById('iconTypeDisplay').className = 'acyicon-list_view';
					}
				}
			";

		acymailing_addScript(true, $js);
	}

	private function _displayHTML(){

		$mediaFolders = acymailing_getFilesFolder('media', true);

		$receivedFolder = acymailing_getUserVar(ACYMAILING_COMPONENT.".acyeditor.selected_folder", 'selected_folder', '', 'string');
		$defaultFolder = reset($mediaFolders);

		if(!empty($receivedFolder)){
			$allowed = false;
			foreach($mediaFolders as $oneMedia){
				if(preg_match('#^'.preg_quote(rtrim($oneMedia, '/')).'[a-z_0-9\-/]*$#i', $receivedFolder)){
					$allowed = true;
					break;
				}
			}
			if($allowed){
				$defaultFolder = $receivedFolder;
			}else{
				acymailing_display('You are not allowed to access this folder', 'error');
			}
		}

		$uploadPath = acymailing_cleanPath(ACYMAILING_ROOT.trim(str_replace('/', DS, trim($defaultFolder)), DS));

		$uploadedImage = acymailing_getVar('array', 'uploadedImage', array(), 'files');
		if(!empty($uploadedImage)){
			if(!empty($uploadedImage['name'])){
				$this->imageName = acymailing_importFile($uploadedImage, $uploadPath, true);
				if(!empty($this->imageName)){
					$uploadMessage = 'success';
				}else $uploadMessage = 'error';
			}else{
				$uploadMessage = 'error';
				$this->message = acymailing_translation('BROWSE_FILE');
			}
		}

		if(empty($uploadedImage)){
			$pictToDelete = acymailing_getVar('string', 'pictName', '');
			$originalName = acymailing_getVar('string', 'originalName', '');
			$pictToRename = acymailing_getVar('string', 'pictRename', '');
			if(!empty($originalName) && !empty($pictToRename)){
				$pictToDelete = $originalName;
			}
			if(!empty($pictToDelete) && file_exists($uploadPath.DS.$pictToDelete)){
				$checkPictNews = acymailing_loadResultArray('SELECT mailid FROM #__acymailing_mail WHERE body LIKE \'%src="'.ACYMAILING_LIVE.$defaultFolder.'/'.$pictToDelete.'"%\'');
				$checkPictTemplate = acymailing_loadResultArray('SELECT tempid FROM #__acymailing_template WHERE body LIKE \'%src="'.ACYMAILING_LIVE.$defaultFolder.'/'.$pictToDelete.'"%\'');

				if(!empty($checkPictNews) || !empty($checkPictTemplate)){
					foreach($checkPictNews as $k => $oneNews){
						$checkPictNews[$k] = '<a href="" onclick="window.parent.document.location.href=\''.acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'newsletter&task=edit&mailid='.$oneNews).'\'">'.$oneNews.'</a>';
					}
					if(acymailing_isAdmin()){
						foreach($checkPictTemplate as $k => $oneTmpl){
							$checkPictTemplate[$k] = '<a href="" onclick="window.parent.document.location.href=\''.acymailing_completeLink('template&task=edit&tempid='.$oneTmpl).'\'">'.$oneTmpl.'</a>';
						}
					}
					acymailing_display(acymailing_translation_sprintf('ACY_CANT_DELETE', (!empty($checkPictNews) ? implode($checkPictNews, ', ') : '-'), (!empty($checkPictTemplate) ? implode($checkPictTemplate, ', ') : '-')), 'error');
				}else{
					if(acymailing_deleteFile($uploadPath.DS.$pictToDelete)){
						acymailing_display(acymailing_translation('ACY_DELETED_PICT_SUCCESS'), 'success');
					}else{
						acymailing_display(acymailing_translation('ACY_DELETED_PICT_ERROR'), 'error');
					}
				}
			}
			if(!empty($originalName) && !empty($pictToRename)){
				if(acymailing_moveFile($uploadPath.DS.$pictToRename, $uploadPath.DS.$originalName)){
					acymailing_display(acymailing_translation('ACY_REPLACED_PICT_SUCCESS'), 'success');
				}else{
					acymailing_display(acymailing_translation('ACY_REPLACED_PICT_ERROR'), 'error');
				}
			}
		}
		?>

		<div id="acy_media_browser">
			<!-- <br style="font-size:1px"/> -->
			<table id="acy_media_browser_table" style="height:420px;">
				<tr>
					<td style="width:65%; vertical-align:top;">
						<?php

						$folders = acymailing_generateArborescence($mediaFolders);
						$filetreeType = acymailing_get('type.filetree');

						echo '<div style="display:inline-block;width:100%;">';
						echo '<form method="post" action="'.acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'editor&task=createFolder').'" style="margin: 0;">';
						echo '<div id="acy_media_browser_path_dropdown" >';
						$filetreeType->display($folders, $defaultFolder, 'acy_media_browser_files_path', 'changeFolder(path)');
						echo '</div>';

						echo '<div id="acy_media_browser_global_create_folder" >';

						echo '<div id="acy_media_browser_create_folder" >';
						echo '<button id="create_folder_btn" class="btn" onclick="displayAppropriateField(this.id)" type="button" style="width:100%; min-height: 24px;" >'.acymailing_translation('CREATE_FOLDER').'</button>';
						echo '</div>';

						echo '<div id="acy_media_browser_area_create_folder" style=\'display:none;\'>';
						echo '<input id="subFolderName" name="subFolderName" type="text" placeholder="'.acymailing_translation('FOLDER_NAME').'" name="text" required="required" />';
						echo '<input type="submit" class="acymailing_button" style="position: absolute;bottom: 9px;right: 9px;" value="'.acymailing_translation('ACY_APPLY').'" />';
						echo '</div>';

						echo '</div>';
						echo acymailing_formToken();
						echo '</form>';

						echo '<div style="margin-top: 15px; display: inline-block;"><button style="float: right;" class="btn" onclick="changeDisplay(event);" id="btn_change_display" title="'.acymailing_translation('ACY_DISPLAY_NOICON').'"><i id="iconTypeDisplay" class="acyicon-list_view"></i></button></div>';

						echo '</div>';


						acymailing_createDir($uploadPath);
						
						$files = acymailing_getFiles($uploadPath);

						echo '<div id="displayPict"><ul id="acy_media_browser_list">';

						if(!empty($uploadMessage) && !empty($this->message)){
							if($uploadMessage == 'success'){
								acymailing_display($this->message);
							}elseif($uploadMessage == 'error'){
								acymailing_display($this->message, 'error');
							}
						}

						$images = array();
						$imagesFound = false;

						$lineDisplay = '<table class="acymailing_smalltable" style="margin: 0;">';
						foreach($files as $k => $file){
							if(strrpos($file, '.') === false) continue;

							$ext = strtolower(substr($file, strrpos($file, '.') + 1));
							$extensions = array('jpg', 'jpeg', 'png', 'gif');
							if(!in_array($ext, $extensions)) continue;

							$imagesFound = true;
							$images[] = $file;
							$imageSize = getimagesize($uploadPath.DS.$file);
							?>
							<li class="acy_media_browser_images" id="acy_media_browser_images_<?php echo $k; ?>" onmouseover="toggleImageInfo(<?php echo $k; ?>, 'display')" onmouseout="toggleImageInfo(<?php echo $k; ?>, 'hide')">
								<img class="acy_media_browser_image" id="acy_media_browser_image_<?php echo $k; ?>" src="<?php echo ACYMAILING_LIVE.$defaultFolder.'/'.$file.'?v='.@filemtime(ACYMAILING_ROOT.$defaultFolder.'/'.$file); ?>"/>
								<a href="#" onclick="displayImageFromUrl('<?php echo ACYMAILING_LIVE.$defaultFolder.'/'.$file; ?>', 'success', '<?php echo $file; ?>', <?php echo empty($imageSize[0]) ? "null,null" : "'".$imageSize[0]."', '".$imageSize[1]."'"; ?>); return false;">
									<div id="acy_media_browser_image_info_<?php echo $k; ?>"
										 style="box-shadow: 1px 1px 2px 1px rgba(0, 0, 0, 0.2); text-shadow:1px 1px 1px #ffffff; border:2px solid #fff; padding-top:40px; text-align:center; vertical-align:middle; color:#333; font-weight:bold; position:absolute; top:0px; left:0px; bottom:0px; right:0px; display:none; background-color: rgba(255,255,255,0.8);">
										<img class="acy_media_browser_delete" id="acy_media_browser_delete_<?php echo $k; ?>" src="<?php echo ACYMAILING_LIVE.ACYMAILING_MEDIA_FOLDER.DS.'images'.DS.'editor'.DS.'delete.png'; ?>" onclick="confirmBox('delete', '<?php echo $file; ?>')"/>
										<?php echo $file; ?><br/>
										<span class="acy_media_browser_image_size"><?php echo empty($imageSize[0]) ? 0 : $imageSize[0].'x'.$imageSize[1]; ?> - <?php echo round((filesize($uploadPath.DS.$file) * 0.0009765625), 2).' ko'; ?><br/></span>
									</div>
								</a>
							</li>
							<?php
							$lineDisplay .= '<tr>';
							$lineDisplay .= '<td width="30" style="padding-left: 10px;"><a href="#" onclick="displayImageFromUrl(\''.ACYMAILING_LIVE.$defaultFolder.'/'.$file.'\', \'success\', \''.$file.'\', '.(empty($imageSize[0]) ? "null,null" : $imageSize[0].",".$imageSize[1]).'); return false;"><img src="'.ACYMAILING_LIVE.$defaultFolder.'/'.$file.'?v='.@filemtime(ACYMAILING_ROOT.$defaultFolder.'/'.$file).'" style="max-width: 24px" /></a></td>';
							$lineDisplay .= '<td><a href="#" onclick="displayImageFromUrl(\''.ACYMAILING_LIVE.$defaultFolder.'/'.$file.'\', \'success\', \''.$file.'\', '.(empty($imageSize[0]) ? "null,null" : $imageSize[0].",".$imageSize[1]).'); return false;">'.$file.'</a></td>';
							$lineDisplay .= '<td><img class="acy_attachment_delete" id="acy_media_browser_delete_'.$k.'" src="'.ACYMAILING_LIVE.'media'.DS.ACYMAILING_COMPONENT.DS.'images'.DS.'editor'.DS.'delete.png" onclick="confirmBox(\'delete\', \''.$file.'\')"/></td>';


							$lineDisplay .= '</tr>';
						}
						$lineDisplay .= '</table>';
						if(!$imagesFound){
							acymailing_display(acymailing_translation('NO_FILE_FOUND'), 'warning');
						}
						echo '</ul></div>';
						?>
						<div id="displayLine" style="display: none; text-align: left; height: 450px; overflow-x: hidden;">
							<?php
							if(!$imagesFound){
								acymailing_display(acymailing_translation('NO_FILE_FOUND'), 'warning');
							}else{
								echo $lineDisplay;
							} ?>
						</div>
						<!-- Here we give the possibility to import a file or specify and url -->
						<div id="acy_media_browser_actions">
							<div id="acy_media_browser_containing_block">
								<div id="acy_media_browser_buttons_block">
									<button type="button" class="acymailing_button_grey" id="button_editimage" onclick="displayImageEdition();"><?php echo acymailing_translation('IMAGE_EDIT') ?></button>
									<button type="button" class="acymailing_button_grey" id="upload_image_btn" onclick="displayAppropriateField(this.id)"> <?php echo acymailing_translation('UPLOAD_NEW_IMAGE'); ?></button>
									<?php echo acymailing_translation('ACY_OR'); ?>
									<button type="button" class="acymailing_button_grey" id="import_from_url_btn" onclick="displayAppropriateField(this.id)"> <?php echo acymailing_translation('INSERT_IMAGE_FROM_URL'); ?> </button>
								</div>
								<div id="acy_media_browser_hidden_elements">
									<div id="upload_image" style="position: relative; padding-top:5px;	display:none; text-align: center;">
										<form method="post" name="adminForm" id="adminForm" enctype="multipart/form-data" style="margin:0px; margin-top:3px;">
											<input type="file" style="width:auto;" name="uploadedImage"/><br/>
											<input type="hidden" name="task" value="browse"/>
											<input type="hidden" name="selected_folder" value="<?php echo htmlspecialchars($defaultFolder, ENT_COMPAT, 'UTF-8'); ?>"/>
											<?php echo acymailing_formToken(); ?>
										</form>
										<button class="acymailing_button" type="button" onclick="acymailing.submitbutton();"> <?php echo acymailing_translation('IMPORT'); ?> </button>
										<span style="position:absolute; top:5px; left:5px;" id="acy_back_from_upload" onclick="displayAppropriateField(this.id)"><a href="javascript:void(0);">&#8592 <?php echo acymailing_translation('MEDIA_BACK'); ?></a></span>
									</div>
									<div id="import_from_url" style="padding-top:9px; position:relative; ">
										<input type="text" id="acy_media_browser_url_input" class="inputbox" oninput="testImage(this.value, displayImageFromUrl)" value="http://"/>
										<div id="acy_media_browser_insert_message"></div>
										<span style="position:absolute; top:5px; left:5px;" id="acy_back_from_url" onclick="displayAppropriateField(this.id)"><a href="javascript:void(0);">&#8592 <?php echo acymailing_translation('MEDIA_BACK'); ?></a></span>
									</div>
								</div>
							</div>
						</div>
					</td>
					<!-- IMAGE INFORMATION -->
					<td id="acy_media_browser_image_details_row">
						<div id="acy_media_browser_image_details">
							<div id="acy_media_browser_image_selected" style=" max-width:230px; max-height:190px; display:none;	margin:auto; margin-bottom:10px;"></div>
							<div id="acy_media_browser_image_selected_info" style=""></div>
							<div id="acy_media_browser_image_selected_details">
								<label for="acy_media_browser_image_title" style="float:left;"><?php echo acymailing_translation('ACY_TITLE'); ?></label>
								<input type="text" id="acy_media_browser_image_title" class="inputbox" style="width:100%" value=""/>
								<?php $imageZone = acymailing_getVar('array', 'image_zone', array(), '');
								if(!empty($imageZone)){ ?>
									<input type="hidden" id="acy_media_browser_image_width" value=""/>
									<label for="acy_media_browser_image_target"><?php echo acymailing_translation('ACY_LINK'); ?></label>
									<input type="text" id="acy_media_browser_image_target" placeholder="<?php echo ACYMAILING_LIVE; ?>..." class="inputbox" style="width:100%" value=""/>
								<?php }else{ ?>
									<label for="acy_media_browser_image_width" style="display:inline;"><?php echo acymailing_translation('CAPTCHA_WIDTH'); ?></label>    <input type="text" id="acy_media_browser_image_width" style="width:23%;" value="" oninput="calculateSize(0, this.value)"/>
									<br/><label for="acy_media_browser_image_height" style="display:inline;"><?php echo acymailing_translation('CAPTCHA_HEIGHT'); ?></label>    <input type="text" id="acy_media_browser_image_height" style="width:22%;" value="" oninput="calculateSize(this.value, 0)"/>
									<br/><label for="acy_media_browser_image_align" style="display:inline;"><?php echo acymailing_translation('ALIGNMENT'); ?></label>
									<select id="acy_media_browser_image_align" class="chzn-done" style="width:50%">
										<option value=""><?php echo acymailing_translation('NOT_SET'); ?></option>
										<option value="left"><?php echo acymailing_translation('ACY_LEFT'); ?></option>
										<option value="right"><?php echo acymailing_translation('ACY_RIGHT'); ?></option>
									</select><br/>
									<label for="acy_media_browser_image_margin" style="display:inline;"><?php echo acymailing_translation('ACY_MARGIN'); ?></label>    <input type="text" style="width:23%;" id="acy_media_browser_image_margin" value=""/><br/>
									<label for="acy_media_browser_image_border" style="display:inline;"><?php echo acymailing_translation('ACY_BORDER'); ?></label>    <input type="text" style="width:23%;" id="acy_media_browser_image_border" value=""/><br/>
									<label for="acy_media_browser_image_class" style="display:inline;"><?php echo acymailing_translation('ACY_CLASS'); ?></label>    <input type="text" style="width:50%;" id="acy_media_browser_image_class" value=""/>
									<input type="hidden" id="acy_media_browser_image_linkhref" value=""/>
								<?php } ?>
							</div>
							<button class="acymailing_button" type="button" onclick="validateImage();parent.acymailing.closeBox();" style=" position:absolute; bottom:6px; right:6px; "><?php echo acymailing_translation('INSERT'); ?> </button>
						</div>
					</td>
				</tr>
			</table>
			<div class="hidden-edition" id="image-edition">
				<div id="image-edition-content">
					<div class="drag-resize" draggable="true">
						<canvas id="edition-canvas"></canvas>
					</div>
				</div>
				<div class="image-edition-toolbar">
					<br />
					<?php echo acymailing_translation('ACY_IMAGE_EFFECTS') ?><br/>
					<button style="display: inline-block;width:127px;vertical-align: bottom;" type="button" class="acymailing_button_grey" onclick="roundedCorner()"><?php echo acymailing_translation('ACY_EFFECT_ROUNDED') ?></button>
					<input style="font-size:18px;display: inline-block;width:<?php echo ACYMAILING_J30 ? '45' : '58'; ?>px;" type="number" id="radius-image" min="0" max="100" value="50"/>
					<button style="width:100%;" type="button" class="acymailing_button_grey" onclick="changeToCrop()"><?php echo acymailing_translation('ACY_EFFECT_CROP') ?></button>
					<button style="width:100%;" type="button" class="acymailing_button_grey" onclick="changeToScale()"><?php echo acymailing_translation('ACY_EFFECT_SCALE') ?></button>
					<button style="width:100%;" type="button" class="acymailing_button_grey" onclick="cancelModification()"><?php echo acymailing_translation('ACY_CANCEL') ?></button>
					<br/><br/>
					<?php $formAction = acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'editor&task=saveImage'); ?>
					<form style="text-align: center;" id="form-edition" method="post" action="<?php echo $formAction ?>" onsubmit="return false;">
						<input style="width:176px;padding:5px;border-radius:4px;" type="text" name="imagename" id="imagename" value="" placeholder="<?php echo acymailing_translation('ACY_IMAGE_NAME') ?>">
						<input type="hidden" name="imagedata" id="imagedata" value="">
						<input type="hidden" name="pathtosave" id="pathtosave" value="">
						<button style="width:48%;display:inline-block" type="button" class="acymailing_button_grey" onclick="if(document.getElementById('imagename').value == ''){alert('<?php echo str_replace("'", "\'", acymailing_translation('FILL_ALL')); ?>');return false;}validateImageModification()"><?php echo acymailing_translation('ACY_SAVE') ?></button>
						<button style="width:48%;display:inline-block" type="button" class="acymailing_button_grey" onclick="closePanel()"><?php echo acymailing_translation('ACY_CANCEL') ?></button>
						<?php echo acymailing_formToken(); ?>
					</form>
				</div>
			</div>
			<div class="confirmBoxMM" id="confirmBoxMM" style="display: none;">
				<div id="acy_popup_content">
					<span class="confirmTxtMM" id="confirmTxtMM"></span><br/>
					<button class="acymailing_button" id="confirmCancelMM" onclick="document.getElementById('confirmBoxMM').style.display='none';" style="padding: 6px 15px 6px 10px;">
						<i class="acyicon-cancel" style="margin-right: 5px; font-size: 16px;top: 2px; position: relative;"></i><?php echo acymailing_translation('ACY_CANCEL'); ?>
					</button>
					<button class="acymailing_button acymailing_button_delete" id="confirmOkMM" style="padding: 8px 15px 6px 10px;">
						<i class="acyicon-delete" id="iconAction" style="margin-right: 5px; font-size: 12px;"></i><span id="textBtnAction"><?php echo acymailing_translation('ACY_DELETE'); ?></span>
					</button>
				</div>
			</div>
		</div>
		<?php

		$imageZone = acymailing_getVar('array', 'image_zone', array(), '');
		if($imageZone){
			echo '<script>checkSelected(true);</script>';
		}else{
			echo '<script>checkSelected();</script>';
		}

		if(isset($uploadMessage) && $uploadMessage == 'success' && file_exists(ACYMAILING_ROOT.rtrim($defaultFolder, '/').'/'.$this->imageName)){
			$imageSize = getimagesize(ACYMAILING_LIVE.rtrim($defaultFolder, '/').'/'.$this->imageName);
			echo '<script> displayImageFromUrl(\''.ACYMAILING_LIVE.rtrim($defaultFolder, '/').'/'.$this->imageName.'\',\'success\', \''.$this->imageName.'\', '.(empty($imageSize[0]) ? "null,null" : $imageSize[0].",".$imageSize[1]).');</script>';
		}
	}

	public function saveImage(){
		acymailing_checkToken();
		$data = $_POST['imagedata'];
		$name = acymailing_getVar('string', 'imagename', '');
		$pathtosave = acymailing_getVar('path', 'pathtosave', '', 'post');

		$uri = substr($data, strpos($data, ",") + 1);
		file_put_contents(ACYMAILING_ROOT.$pathtosave.DS.$name.'.png', base64_decode($uri));
	}

	public function createFolder(){
		acymailing_checkToken();
		$folderName = str_replace(array('.', '-'), array('', '_'), strtolower(acymailing_getVar('cmd', 'subFolderName')));
		if(empty($folderName)){
			$this->browse();
			return false;
		}

		$directoryPath = acymailing_getVar('string', 'acy_media_browser_files_path').'/'.$folderName;

		$mediaFolders = acymailing_getFilesFolder('media', true);
		$allowed = false;
		foreach($mediaFolders as $oneMedia){
			if(preg_match('#^'.preg_quote($oneMedia).'[a-z_0-9\-/]*$#i', $directoryPath)){
				$allowed = true;
				break;
			}
		}
		if(!$allowed){
			acymailing_enqueueMessage('You are not allowed to create this folder', 'error');
			$this->browse();
			return false;
		}

		$directoryPath = str_replace('/', DS, $directoryPath);
		if(is_dir(ACYMAILING_ROOT.$directoryPath)){
			acymailing_enqueueMessage(acymailing_translation('FOLDER_ALREADY_EXISTS'), 'warning');
			$this->browse();
			return false;
		}
		if(!acymailing_createFolder(ACYMAILING_ROOT.$directoryPath)){
			acymailing_enqueueMessage(acymailing_translation_sprintf('WRITABLE_FOLDER', substr(ACYMAILING_ROOT.$directoryPath, 0, strrpos(ACYMAILING_ROOT.$directoryPath, DS)), 'error'));
			$this->browse();
			return false;
		}
		acymailing_setVar('selected_folder', acymailing_getVar('string', 'acy_media_browser_files_path').'/'.$folderName);
		$this->browse();
	}
}
components/com_acymailing/controllers/action.php000060400000003144152453623450016247 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class ActionController extends acymailingController{

	var $pkey = 'action_id';
	var $table = 'action';
	var $aclCat = 'distribution';

	function listing(){
		$actionColumns = acymailing_getColumns('#__acymailing_action');
		if(empty($actionColumns['senderfrom'])){
			acymailing_query("ALTER TABLE #__acymailing_action ADD `senderfrom` tinyint NOT NULL DEFAULT 0");
		}
		if(empty($actionColumns['senderto'])){
			acymailing_query("ALTER TABLE #__acymailing_action ADD `senderto` tinyint NOT NULL DEFAULT 0");
		}
		if(empty($actionColumns['delete_wrong_emails'])){
			acymailing_query("ALTER TABLE #__acymailing_action ADD `delete_wrong_emails` tinyint NOT NULL DEFAULT 0");
		}

		if(!acymailing_level(3)){
			$acyToolbar = acymailing_get('helper.toolbar');
			$acyToolbar->setTitle(acymailing_translation('ACY_DISTRIBUTION'), 'action');
			$acyToolbar->help('distributionlists#listing');
			$acyToolbar->display();
			$config = acymailing_config();
			$level = $config->get('level');
			$url = ACYMAILING_HELPURL.'paidversion&utm_source=acymailing-'.$level.'&utm_medium=back-end&utm_content=distributionlist-display&utm_campaign=upgrade';
			$iFrame = "<iframe class='paidversion' frameborder='0' src='$url' width='100%' height='100%' scrolling='auto'></iframe>";
			echo $iFrame.'<div id="iframedoc"></div>';
			return;
		}

		return parent::listing();
	}

}
components/com_acymailing/controllers/email.php000060400000006571152453623450016070 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class EmailController extends acymailingController{
	
	function test(){

		$this->store();

		$mailHelper = acymailing_get('helper.mailer');

		$receiver = acymailing_currentUserEmail();
		$mailid = acymailing_getCID('mailid');

		$mailHelper->report = false;
		$result = $mailHelper->sendOne($mailid, $receiver);
		acymailing_enqueueMessage($mailHelper->reportMessage, $result ? 'success' : 'error');

		return $this->edit();
	}

	function store(){
		acymailing_checkToken();

		$oldMailid = acymailing_getCID('mailid');
		$mailClass = acymailing_get('class.mail');

		if($mailClass->saveForm()){
			$data = acymailing_getVar('none', 'data');
			$type = @$data['mail']['type'];
			if(!empty($type) AND in_array($type, array('unsub', 'welcome'))){
				$subject = addslashes($data['mail']['subject']);
				$mailid = acymailing_getVar('int', 'mailid');
				if($type == 'unsub'){
					$js = "var mydrop = window.top.document.getElementById('datalistunsubmailid'); ";
					$js .= "var type = 'unsub';";
				}else{ //type=welcome
					$js = "var mydrop = window.top.document.getElementById('datalistwelmailid'); ";
					$js .= "var type = 'welcome';";
				}
				if(empty($oldMailid)){
					$js .= 'var optn = document.createElement("OPTION");';
					$js .= "optn.text = '[$mailid] $subject'; optn.value = '$mailid';";
					$js .= 'mydrop.options.add(optn);';
					$js .= 'lastid = 0; while(mydrop.options[lastid+1]){lastid = lastid+1;} mydrop.selectedIndex = lastid;';
					$js .= 'window.top.changeMessage(type,'.$mailid.');';
				}else{
					$js .= "lastid = 0; notfound = true; while(notfound && mydrop.options[lastid]){if(mydrop.options[lastid].value == $mailid){mydrop.options[lastid].text = '[$mailid] $subject';notfound = false;} lastid = lastid+1;}";
				}
				if(ACYMAILING_J30) $js .= 'window.top.jQuery("#datalist'.($type == 'unsub' ? 'unsub' : 'wel').'mailid").trigger("liszt:updated");';
				acymailing_addScript(true, $js);
			}
			acymailing_enqueueMessage(acymailing_translation('JOOMEXT_SUCC_SAVED'), 'success');
		}else{
			acymailing_enqueueMessage(acymailing_translation('ERROR_SAVING'), 'error');
		}
	}//endfct store

	function chooseListBeforeSend(){
		return $this->listing();
	}

	function sendArticle(){
		$mailClass = acymailing_get('class.mail');
		$listmailClass = acymailing_get('class.listmail');
		$mailerHelper = acymailing_get('helper.mailer');

		$query = 'SELECT * FROM #__acymailing_mail WHERE type = \'article\'';
		$mail = acymailing_loadObject($query);

		$listsids = acymailing_getVar('array', 'cid', array(), '');
		acymailing_arrayToInteger($listsids);

		$newMailId = $mailClass->copyOneNewsletter($mail->mailid);
		$newMail = $mailClass->get($newMailId);
		$newMail->alias = '';
		$newMail->senddate = time();
		$newMail->published = 2;
		$newMail->type = 'news';
		$mailerHelper->triggerTagsWithRightLanguage($newMail, false); //We replace the tags in the mail
		$mailid = $mailClass->save($newMail);

		$listmailClass->save($mailid, $listsids);

		$schedHelper = acymailing_get('helper.schedule');
		$schedHelper->queueScheduled();
		if(!empty($schedHelper->messages)) acymailing_enqueueMessage($schedHelper->messages);
	}
}//endclass
components/com_acymailing/controllers/tag.php000060400000003343152453623450015546 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class TagController extends acymailingController
{
	var $aclCat = 'tags';

	function __construct($config = array()){
		parent::__construct($config);
		acymailing_setNoTemplate();

		$this->registerDefaultTask('tag');
	}

	function tag(){
		if(!$this->isAllowed($this->aclCat,'view')) return;
		acymailing_setVar( 'layout', 'tag'  );
		return parent::display();
	}

	function plgtrigger(){
		if(!require_once(ACYMAILING_BACK.DS.'controllers'.DS.'cpanel.php')) return;
		$cPanelController = acymailing_get('controller.cpanel');
		$cPanelController->plgtrigger();
		return;
	}

	function customtemplate(){
		acymailing_setVar('layout', 'form');
		return parent::display();
	}

	function store(){
		acymailing_checkToken();

		$plugin = acymailing_getVar('string', 'plugin');
		$plugin = preg_replace('#[^a-zA-Z0-9]#Uis', '', $plugin);
		$body = acymailing_getVar('string', 'templatebody', '', '', ACY_ALLOWRAW);

		if(empty($body)){ acymailing_enqueueMessage(acymailing_translation('FILL_ALL'),'error'); return; }

		$pluginsFolder = ACYMAILING_MEDIA.'plugins';
		if(!file_exists($pluginsFolder)) acymailing_createDir($pluginsFolder);

		try{
			
			$status = acymailing_writeFile($pluginsFolder.DS.$plugin.'.php',$body);
		}catch(Exception $e){
			$status = false;
		}

		if($status) acymailing_enqueueMessage(acymailing_translation('JOOMEXT_SUCC_SAVED'),'success');
		else acymailing_enqueueMessage(acymailing_translation_sprintf('FAIL_SAVE', $pluginsFolder.DS.$plugin.'.php'),'error');
	}
}
components/com_acymailing/views/subscriber/view.html.php000060400000042653152453623450017651 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class SubscriberViewSubscriber extends acymailingView{

	var $searchFields = array('a.name', 'a.email', 'a.subid', 'a.userid');
	var $selectedFields = array('a.*');
	var $ctrl = 'subscriber';

	function __construct($config = array()){
		parent::__construct($config);

		$this->searchFields[] = 'b.'.$this->cmsUserVars->username;
		$this->selectedFields[] = 'b.'.$this->cmsUserVars->username.' AS username';
	}

	function display($tpl = null){
		$function = $this->getLayout();
		if(method_exists($this, $function)) $this->$function();

		parent::display($tpl);
	}

	function listing(){
		$pageInfo = new stdClass();
		$pageInfo->elements = new stdClass();
		$config = acymailing_config();

		$paramBase = ACYMAILING_COMPONENT.'.'.$this->getName();
		$pageInfo->filter = new stdClass();
		$pageInfo->filter->order = new stdClass();
		$pageInfo->filter->order->value = acymailing_getUserVar($paramBase.".filter_order", 'filter_order', 'a.subid', 'cmd');
		$pageInfo->filter->order->dir = acymailing_getUserVar($paramBase.".filter_order_Dir", 'filter_order_Dir', 'desc', 'word');
		if(strtolower($pageInfo->filter->order->dir) !== 'desc') $pageInfo->filter->order->dir = 'asc';
		$selectedList = acymailing_getUserVar($paramBase."filter_lists", 'filter_lists', 0, 'string');
		$selectedStatus = acymailing_getUserVar($paramBase."filter_status", 'filter_status', 0, 'int');
		$selectedStatusList = acymailing_getUserVar($paramBase."filter_statuslist", 'filter_statuslist', 0, 'int');
		$pageInfo->search = acymailing_getUserVar($paramBase.".search", 'search', '', 'string');
		$pageInfo->search = strtolower(trim($pageInfo->search));

		$pageInfo->limit = new stdClass();
		$pageInfo->limit->value = acymailing_getUserVar($paramBase.'.list_limit', 'limit', acymailing_getCMSConfig('list_limit'), 'int');
		$pageInfo->limit->start = acymailing_getUserVar($paramBase.'.limitstart', 'limitstart', 0, 'int');

		$filters = array();
		$customFields = acymailing_get('class.fields');

		$displayFields = array();
		$displayFields['name'] = new stdClass();
		$displayFields['name']->fieldname = 'JOOMEXT_NAME';
		$displayFields['name']->type = 'text';
		$displayFields['email'] = new stdClass();
		$displayFields['email']->fieldname = 'JOOMEXT_EMAIL';
		$displayFields['email']->type = 'text';
		$displayFields['html'] = new stdClass();
		$displayFields['html']->fieldname = 'RECEIVE_HTML';
		$displayFields['html']->type = 'radio';


		if(!empty($pageInfo->search)){
			foreach($displayFields as $fieldname => $onefield){
				if($fieldname == 'html' OR in_array('a.'.$fieldname, $this->searchFields) OR $onefield->type == 'customtext') continue;
				$this->searchFields[] = 'a.`'.$fieldname.'`';
			}
			if(!is_numeric($pageInfo->search)){
				$this->searchFields = array_diff($this->searchFields, array('a.subid', 'a.userid'));
			}

			if(strpos($pageInfo->search, '@') !== false){
				$this->searchFields = array_diff($this->searchFields, array('a.name', 'b.username'));
			}

			$searchVal = '\'%'.acymailing_getEscaped($pageInfo->search, true).'%\'';
			$filters[] = implode(" LIKE $searchVal OR ", $this->searchFields)." LIKE $searchVal";
		}

		$leftJoinQuery = array();
		$joinQuery = array();

		if(strpos($selectedList, ',') !== false){
			$lists = explode(',', rtrim($selectedList, ','));
			acymailing_arrayToInteger($lists);
			$selection = implode(',', $lists);
		}else{
			$selection = intval($selectedList);
		}

		if(empty($selectedList) || ($selectedStatusList == -2 && acymailing_isAdmin())){
			if(empty($selectedList) && $selectedStatusList == -2) $selectedStatusList = 0;
			$fromQuery = ' FROM '.acymailing_table('subscriber').' as a ';
			$leftJoinQuery[] = acymailing_table($this->cmsUserVars->table, false).' as b ON a.userid = b.'.$this->cmsUserVars->id;

			if($selectedStatusList == -2){
				$leftJoinQuery[] = acymailing_table('listsub').' AS c on a.subid = c.subid AND listid IN ('.$selection.')';
				$filters[] = 'c.listid IS NULL';
			}
			$countField = "a.subid";
		}else{
			$fromQuery = ' FROM '.acymailing_table('listsub').' as c';
			$countField = "c.subid";
			$joinQuery[] = acymailing_table('subscriber').' as a ON a.subid = c.subid';
			$leftJoinQuery[] = acymailing_table($this->cmsUserVars->table, false).' as b ON a.userid = b.'.$this->cmsUserVars->id;
			$filters[] = 'c.listid IN ('.$selection.')';

			if(!in_array($selectedStatusList, array(-1, 1, 2))) $selectedStatusList = 1;
			$filters[] = 'c.status = '.intval($selectedStatusList);
		}

		if($selectedStatus == 1){
			$filters[] = 'a.accept > 0';
		}elseif($selectedStatus == -1){
			$filters[] = 'a.accept < 1';
		}elseif($selectedStatus == 2){
			$filters[] = 'a.confirmed < 1';
		}elseif($selectedStatus == 3){
			$filters[] = 'a.enabled > 0';
		}elseif($selectedStatus == -3){
			$filters[] = 'a.enabled < 1';
		}

		$query = 'SELECT '.implode(',', $this->selectedFields).$fromQuery;
		if(!empty($joinQuery)) $query .= ' JOIN '.implode(' JOIN ', $joinQuery);
		if(!empty($leftJoinQuery)) $query .= ' LEFT JOIN '.implode(' LEFT JOIN ', $leftJoinQuery);

		if(!empty($filters)){
			$query .= ' WHERE ('.implode(') AND (', $filters).')';
		}
		$query .= ' GROUP BY a.subid';
		if(!empty($pageInfo->filter->order->value)){
			$query .= ' ORDER BY '.$pageInfo->filter->order->value.' '.$pageInfo->filter->order->dir;
		}

		$rows = acymailing_loadObjectList($query, 'subid', $pageInfo->limit->start, empty($pageInfo->limit->value) ? 500 : $pageInfo->limit->value);

		$pageInfo->elements->page = count($rows);

		if($pageInfo->limit->value > $pageInfo->elements->page){
			$pageInfo->elements->total = $pageInfo->limit->start + $pageInfo->elements->page;
		}else{
			$queryCount = 'SELECT COUNT(DISTINCT '.$countField.') '.$fromQuery;
			if(!empty($pageInfo->search) || !empty($selectedStatus) || $selectedStatusList == -2 || !empty($fieldfilter)){
				if(!empty($joinQuery)) $queryCount .= ' JOIN '.implode(' JOIN ', $joinQuery);
				if(!empty($leftJoinQuery)) $queryCount .= ' LEFT JOIN '.implode(' LEFT JOIN ', $leftJoinQuery);
			}
			if(!empty($filters)) $queryCount .= ' WHERE ('.implode(') AND (', $filters).')';
			$pageInfo->elements->total = acymailing_loadResult($queryCount);
		}


		if(!empty($rows)){
			$subscriptions = acymailing_loadObjectList('SELECT * FROM `#__acymailing_listsub` WHERE `subid` IN (\''.implode('\',\'', array_keys($rows)).'\')');
			if(!empty($subscriptions)){
				foreach($subscriptions as $onesub){
					$sublistid = $onesub->listid;
					if(empty($rows[$onesub->subid]->subscription)) $rows[$onesub->subid]->subscription = new stdClass();
					$rows[$onesub->subid]->subscription->$sublistid = $onesub;
				}
			}
		}

		if(empty($pageInfo->limit->value)){
			if($pageInfo->elements->total > 500){
				acymailing_enqueueMessage('We do not want you to crash your server so we displayed only the first 500 users', 'warning');
			}
			$pageInfo->limit->value = 100;
		}

		$pagination = new acyPagination($pageInfo->elements->total, $pageInfo->limit->start, $pageInfo->limit->value);

		$filters = new stdClass();
		$statusType = acymailing_get('type.statusfilter');
		if(!empty($selectedList)){
			$statusList = acymailing_get('type.statusfilterlist');
			if(!acymailing_isAdmin()) array_pop($statusList->values);
			$filters->statuslist = $statusList->display('filter_statuslist', $selectedStatusList);
		}

		$listsType = acymailing_get('type.lists');
		if(acymailing_isAdmin()){
			$filters->lists = $listsType->display('filter_lists', $selectedList, true, true);
			$filters->status = $statusType->display('filter_status', $selectedStatus);
		}else{
			$listClass = acymailing_get('class.list');
			$allLists = $listClass->getFrontendLists();
			if(count($allLists) > 1){
				$filters->lists = acymailing_select($allLists, "filter_lists", 'class="inputbox" size="1" onchange="document.adminForm.limitstart.value=0;document.adminForm.submit();"', 'listid', 'name', (int)$selectedList, "filter_lists");
			}else{
				$filters->lists = '<input type="hidden" name="filter_lists" value="'.$selectedList.'"/>';
			}
			$filters->status = '<input type="hidden" name="filter_status" value="0"/>';
		}

		if(acymailing_isAdmin()){
			$acyToolbar = acymailing_get('helper.toolbar');
			if(acymailing_isAllowed($config->get('acl_lists_filter', 'all'))) $acyToolbar->popup('action', acymailing_translation('ACTIONS'), acymailing_completeLink('filter', true), 700, 500);
			if(acymailing_isAllowed($config->get('acl_subscriber_import', 'all'))) $acyToolbar->link(acymailing_completeLink('data&task=import&filter_lists='.$selectedList), acymailing_translation('IMPORT'), 'import');
			if(acymailing_isAllowed($config->get('acl_lists_filter', 'all')) || acymailing_isAllowed($config->get('acl_subscriber_import', 'all')) || acymailing_isAllowed($config->get('acl_subscriber_export', 'all'))) $acyToolbar->custom('export', acymailing_translation('ACY_EXPORT'), 'export', false);
			if(acymailing_isAllowed($config->get('acl_subscriber_export', 'all'))) $acyToolbar->divider();
			if(acymailing_isAllowed($config->get('acl_subscriber_manage', 'all'))) $acyToolbar->add();
			if(acymailing_isAllowed($config->get('acl_subscriber_manage', 'all'))) $acyToolbar->edit();
			if(acymailing_isAllowed($config->get('acl_subscriber_delete', 'all'))) $acyToolbar->delete();

			$acyToolbar->divider();
			$acyToolbar->help('subscriber-listing');
			$acyToolbar->setTitle(acymailing_translation('USERS'), 'subscriber');
			$acyToolbar->display();
		}

		$lists = $listsType->getData();
		$this->lists = $lists;
		$toggleClass = acymailing_get('helper.toggle');
		$this->toggleClass = $toggleClass;
		$this->rows = $rows;
		$this->filters = $filters;
		$this->pageInfo = $pageInfo;
		$this->pagination = $pagination;
		$this->config = $config;
		$this->displayFields = $displayFields;
		$this->customFields = $customFields;
	}

	function choose(){
		$pageInfo = new stdClass();

		$paramBase = ACYMAILING_COMPONENT.'.'.$this->getName().'_'.$this->getLayout().acymailing_getVar('int', 'onlyreg', 0);
		$pageInfo->filter = new stdClass();
		$pageInfo->filter->order = new stdClass();
		$pageInfo->limit = new stdClass();
		$pageInfo->elements = new stdClass();
		$pageInfo->filter->order->value = acymailing_getUserVar($paramBase.".filter_order", 'filter_order', 'a.name', 'cmd');
		$pageInfo->filter->order->dir = acymailing_getUserVar($paramBase.".filter_order_Dir", 'filter_order_Dir', 'asc', 'word');
		if(strtolower($pageInfo->filter->order->dir) !== 'desc') $pageInfo->filter->order->dir = 'asc';
		$pageInfo->search = acymailing_getUserVar($paramBase.".search", 'search', '', 'string');
		$pageInfo->search = strtolower(trim($pageInfo->search));

		$pageInfo->limit->value = acymailing_getUserVar($paramBase.'.list_limit', 'limit', acymailing_getCMSConfig('list_limit'), 'int');
		$pageInfo->limit->start = acymailing_getUserVar($paramBase.'.limitstart', 'limitstart', 0, 'int');

		if(empty($pageInfo->limit->value)) $pageInfo->limit->value = 100;

		$filters = array();
		if(!empty($pageInfo->search)){
			$searchVal = '\'%'.acymailing_getEscaped($pageInfo->search, true).'%\'';
			$filters[] = implode(" LIKE $searchVal OR ", $this->searchFields)." LIKE $searchVal";
		}

		if(acymailing_getVar('int', 'onlyreg')){
			$filters[] = 'a.userid > 0';
		}

		$query = 'SELECT '.implode(',', $this->selectedFields).' FROM #__acymailing_subscriber as a';
		$query .= ' LEFT JOIN #__'.$this->cmsUserVars->table.' as b on a.userid = b.'.$this->cmsUserVars->id;
		if(!empty($filters)){
			$query .= ' WHERE ('.implode(') AND (', $filters).')';
		}
		if(!empty($pageInfo->filter->order->value)){
			$query .= ' ORDER BY '.$pageInfo->filter->order->value.' '.$pageInfo->filter->order->dir;
		}
		$rows = acymailing_loadObjectList($query, '', $pageInfo->limit->start, $pageInfo->limit->value);

		$queryWhere = 'SELECT COUNT(a.subid) FROM #__acymailing_subscriber as a';
		if(!empty($filters)){
			$queryWhere .= ' LEFT JOIN #__'.$this->cmsUserVars->table.' as b on a.userid = b.'.$this->cmsUserVars->id;
			$queryWhere .= ' WHERE ('.implode(') AND (', $filters).')';
		}

		$pageInfo->elements->total = acymailing_loadResult($queryWhere);
		$pageInfo->elements->page = count($rows);

		$pagination = new acyPagination($pageInfo->elements->total, $pageInfo->limit->start, $pageInfo->limit->value);

		$this->rows = $rows;
		$this->pageInfo = $pageInfo;
		$this->pagination = $pagination;
	}

	function form(){
		$subid = acymailing_getCID('subid');
		$config = acymailing_config();

		if(!empty($subid)){
			$subscriberClass = acymailing_get('class.subscriber');
			$subscriber = $subscriberClass->getFull($subid);
			$subscription = acymailing_isAdmin() ? $subscriberClass->getSubscription($subid) : $subscriberClass->getFrontendSubscription($subid);
			if(empty($subscriber->subid)){
				acymailing_display('User '.$subid.' not found', 'error');
				$subid = 0;
			}
		}

		if(empty($subid)){
			$listType = acymailing_get('class.list');
			$subscription = acymailing_isAdmin() ? $listType->getLists() : $listType->getFrontendLists();

			$subscriber = new stdClass();
			$subscriber->email = '';
			$subscriber->created = time();
			$subscriber->html = 1;
			$subscriber->confirmed = 1;
			$subscriber->blocked = 0;
			$subscriber->accept = 1;
			$subscriber->enabled = 1;
			$iphelper = acymailing_get('helper.user');
			$subscriber->ip = $iphelper->getIP();
		}

		if(acymailing_isAdmin()){
			$acyToolbar = acymailing_get('helper.toolbar');
			$acyToolbar->setTitle(acymailing_translation('ACY_USER'), 'subscriber&task=edit&subid='.$subid);
		}



		if(!empty($subid)){
			$query = 'SELECT a.`mailid`, a.`html`, a.`sent`, a.`senddate`,a.`open`, a.`opendate`, a.`bounce`, a.`fail`,b.`subject`,b.`alias`';
			$query .= ' FROM `#__acymailing_userstats` as a';
			$query .= ' JOIN '.acymailing_table('mail').' as b on a.mailid = b.mailid';
			$query .= ' WHERE a.subid = '.intval($subid).' ORDER BY a.senddate DESC LIMIT 30';
			$open = acymailing_loadObjectList($query);
			$this->open = $open;

			if(acymailing_level(3)){
				$clickedNews = acymailing_loadObjectList('SELECT DISTINCT `mailid` FROM `#__acymailing_urlclick` WHERE `subid` = '.intval($subid), 'mailid');
				$this->clickedNews = $clickedNews;
			}

			$query = 'SELECT a.*,b.`subject`,b.`alias`';
			$query .= ' FROM `#__acymailing_queue` as a';
			$query .= ' JOIN '.acymailing_table('mail').' as b on a.mailid = b.mailid';
			$query .= ' WHERE a.subid = '.intval($subid).' ORDER BY a.senddate ASC LIMIT 60';
			$queue = acymailing_loadObjectList($query);
			$this->queue = $queue;

			$query = 'SELECT h.*,m.subject FROM #__acymailing_history as h LEFT JOIN #__acymailing_mail as m ON h.mailid = m.mailid WHERE h.subid = '.intval($subid).' ORDER BY h.`date` DESC LIMIT 30';
			$history = acymailing_loadObjectList($query);
			$this->history = $history;

			$query = 'SELECT * FROM #__acymailing_geolocation WHERE geolocation_subid='.intval($subid).' ORDER BY geolocation_created DESC LIMIT 100';
			$geoloc = acymailing_loadObjectList($query);
			if(!empty($geoloc)){
				$markCities = array();
				$diffCountries = false;
				$dataDetails = array();
				foreach($geoloc as $mark){
					$indexCity = array_search($mark->geolocation_city, $markCities);
					if($indexCity === false){
						array_push($markCities, $mark->geolocation_city);
						$addressTmp = $mark->geolocation_city.' '.$mark->geolocation_state.' '.$mark->geolocation_country;
						array_push($dataDetails, array('nbInCity' => 1, 'actions' => $mark->geolocation_type, 'address' => $addressTmp));
					}else{
						$dataDetails[$indexCity]['nbInCity'] += 1;
						$dataDetails[$indexCity]['actions'] .= ", ".$mark->geolocation_type;
					}

					if(!$diffCountries){
						if(!empty($region) && $region != $mark->geolocation_country_code){
							$region = 'world';
							$diffCountries = true;
						}else{
							$region = $mark->geolocation_country_code;
						}
					}
				}
				$this->geoloc_region = $region;
				$this->geoloc_city = $markCities;
				$this->geoloc = $geoloc;
				$this->geoloc_details = $dataDetails;
			}

			if(!empty($subscriber->ip)){
				$query = 'SELECT * FROM #__acymailing_subscriber WHERE ip='.acymailing_escapeDB($subscriber->ip).' AND subid != '.intval($subid).' LIMIT 30';
				$neighbours = acymailing_loadObjectList($query);
				if(!empty($neighbours)){
					$this->neighbours = $neighbours;
				}
			}
		}

		$isAdmin = false;
		if(acymailing_isAdmin()){
			$isAdmin = true;

			$acyToolbar->addButtonOption('apply', acymailing_translation('ACY_APPLY'), 'apply', false);
			$acyToolbar->addButtonOption('save2new', acymailing_translation('ACY_SAVEANDNEW'), 'new', false);
			$acyToolbar->save();

			if(!empty($subscriber->userid)){
				$acyToolbar->link(acymailing_userEditLink().$subscriber->userid, acymailing_translation('EDIT_JOOMLA_USER'), 'edit');
			}
			$acyToolbar->cancel();
			$acyToolbar->divider();
			$acyToolbar->help('subscriber-form');
			$acyToolbar->display();
		}


		$filters = new stdClass();
		$quickstatusType = acymailing_get('type.statusquick');
		$filters->statusquick = $quickstatusType->display('statusquick');

		$this->config = $config;
		if(!empty($subscriber->email)) $subscriber->email = acymailing_punycode($subscriber->email, 'emailToUTF8');
		$this->subscriber = $subscriber;
		$toggleClass = acymailing_get('helper.toggle');
		$this->toggleClass = $toggleClass;
		$this->subscription = $subscription;
		$this->filters = $filters;
		$statusType = acymailing_get('type.status');
		$this->statusType = $statusType;
		$this->isAdmin = $isAdmin;
	}
}

components/com_acymailing/views/subscriber/index.html000060400000000054152453623450017205 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/subscriber/tmpl/choose.php000060400000007043152453623450020162 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<div id="iframedoc"></div>

	<form action="<?php echo acymailing_completeLink('subscriber', true); ?>" method="post" name="adminForm" id="adminForm">
		<table class="acymailing_table_options">
			<tr>
				<td width="100%">
					<?php acymailing_listingsearch($this->pageInfo->search); ?>
				</td>
				<td nowrap="nowrap">
				</td>
			</tr>
		</table>

		<table class="acymailing_table" cellpadding="1">
			<thead>
			<tr>
				<th class="title titlenum">
					<?php echo acymailing_translation('ACY_NUM'); ?>
				</th>
				<th class="title">
				</th>
				<th class="title">
					<?php echo acymailing_gridSort(acymailing_translation('JOOMEXT_NAME'), 'a.name', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
				</th>
				<th class="title">
					<?php echo acymailing_gridSort(acymailing_translation('JOOMEXT_EMAIL'), 'a.email', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
				</th>
				<th class="title titleid">
					<?php echo acymailing_gridSort(acymailing_translation('USER_ID'), 'a.userid', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
				</th>
				<th class="title titleid">
					<?php echo acymailing_gridSort(acymailing_translation('ACY_ID'), 'a.subid', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
				</th>
			</tr>
			</thead>
			<tfoot>
			<tr>
				<td colspan="6">
					<?php echo $this->pagination->getListFooter();
					echo $this->pagination->getResultsCounter(); ?>
				</td>
			</tr>
			</tfoot>
			<tbody>
			<?php
			$k = 0;

			for($i = 0, $a = count($this->rows); $i < $a; $i++){
				$row =& $this->rows[$i];

				?>
				<tr class="<?php echo "row$k"; ?>" style="cursor:pointer" onclick="window.top.affectUser(<?php echo strip_tags(intval($row->userid));?>,'<?php echo addslashes(strip_tags($row->name)); ?>','<?php echo addslashes(strip_tags($row->email)); ?>'); acymailing.closeBox(true);">
					<td align="center" style="text-align:center">
						<?php echo $this->pagination->getRowOffset($i); ?>
					</td>
					<td class="acytdcheckbox"></td>
					<td>
						<?php echo acymailing_dispSearch($row->name, $this->pageInfo->search); ?>
					</td>
					<td>
						<?php echo acymailing_dispSearch($row->email, $this->pageInfo->search); ?>
					</td>
					<td align="center" style="text-align:center">
						<?php if(!empty($row->userid)){
							$text = acymailing_translation('ACY_USERNAME').' : <b>'.acymailing_dispSearch($row->username, $this->pageInfo->search);
							$text .= '</b><br />'.acymailing_translation('USER_ID').' : <b>'.acymailing_dispSearch($row->userid, $this->pageInfo->search).'</b>';
							echo acymailing_tooltip($text, acymailing_dispSearch($row->username, $this->pageInfo->search), '', acymailing_dispSearch($row->userid, $this->pageInfo->search));
						} ?>
					</td>
					<td align="center" style="text-align:center">
						<?php echo acymailing_dispSearch($row->subid, $this->pageInfo->search); ?>
					</td>
				</tr>
				<?php
				$k = 1 - $k;
			}
			?>
			</tbody>
		</table>

		<input type="hidden" name="defaulttask" value="choose"/>
		<?php if(acymailing_getVar('int', 'onlyreg')){ ?><input type="hidden" name="onlyreg" value="1"/><?php } ?>
		<?php acymailing_formOptions($this->pageInfo->filter->order); ?>
	</form>
</div>
components/com_acymailing/views/subscriber/tmpl/form.php000060400000066071152453623450017653 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
$config = acymailing_config();
$backend = acymailing_isAdmin(); ?>
<style type="text/css">
	.respuserinfo{
		float: left;
		display: inline-table;
	<?php if(!$backend){ ?> max-width: 900px;
		min-width: 60%;
		width: 100%;
	<?php } else{ ?> max-width: 600px;
		min-width: 30%;
	<?php } ?>
	}

	.respuserinfo50{
		min-width: 50%;
	}

	.respuserinfogeneral{
		display: inline-table;
		float: left;
		min-width: 60%;
		width: 100%;
		max-width: 900px;
	}

	#acysubscriberinfo{
		clear: both;
	<?php if(!$backend){
		echo "overflow:auto;
			max-width:750px;
			min-width:80%";
	} ?>
	}

	<?php if(!$backend){
		echo "#acy_content .current {
				display: table;
			}			";
	} ?>

</style>
<script language="javascript" type="text/javascript">
	document.addEventListener("DOMContentLoaded", function(){
		acymailing.submitbutton = function(pressbutton){
			var form = document.adminForm;
			if(pressbutton != 'cancel' && form.email){
				form.email.value = form.email.value.replace(/ /g, "");
				var filter = /^<?php echo acymailing_getEmailRegex(true); ?>$/i;'
				if(!filter.test(form.email.value)){
					alert("<?php echo acymailing_translation('VALID_EMAIL', true); ?>");
					return false;
				}
			}
			acymailing.submitform(pressbutton, form);
		};
	});
</script>
<?php
$config = acymailing_config();
$google_map_api_key = $config->get('google_map_api_key');
if(empty($google_map_api_key) && acymailing_isAdmin()){
	acymailing_display('<a href="'.acymailing_completeLink('cpanel').'" onclick="localStorage.setItem(\'acyconfig_tab\', \'config_subscription\');">'.acymailing_translation('ACY_NEED_GOOGLE_MAP_API_KEY').'</a>', 'info');
}

if(!empty($this->geoloc) && !empty($google_map_api_key)){ ?>
	<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
	<script language="javascript" type="text/javascript">
		google.charts.load('current', {
			packages: ['geochart', 'corechart'],
			mapsApiKey: '<?php echo $google_map_api_key; ?>'
		});
		google.charts.setOnLoadCallback(drawMarkersMap);

		var chart;
		var data;

		var mapOptions = {
			legend: 'none', displayMode: 'markers', sizeAxis: {minSize: 6, maxSize: 24, minValue: 1, maxValue: 10}, enableRegionInteractivity: 'true', region: '<?php echo $this->geoloc_region; ?>'
		};
		function drawMarkersMap(){
			data = new google.visualization.DataTable();
			data.addColumn('string', 'Address');
			data.addColumn('number', 'Color');
			data.addColumn('number', 'Size');
			data.addColumn({type: 'string', role: 'tooltip'});
			<?php
			$myData = array();
			foreach($this->geoloc_city as $key => $city){
				$toolTipTxt = str_replace("'", "\'", acymailing_translation('GEOLOC_NB_ACTIONS')).': '.$this->geoloc_details[$key]['nbInCity'];
				$lineData = "['".str_replace("'", "\'", $this->geoloc_details[$key]['address'])."', 1, ".$this->geoloc_details[$key]['nbInCity'].", '".$toolTipTxt."']";
				array_push($myData, $lineData);
			}
			echo "data.addRows([".implode(", ", $myData)."]);";
			?>

			chart = new google.visualization.GeoChart(document.getElementById('mapGeoloc_div'));
		}
	</script>
<?php } ?>
<div id="acy_content">
	<div id="iframedoc"></div>

	<form action="<?php echo acymailing_completeLink(acymailing_getVar('cmd', 'ctrl')); ?>" method="post" name="adminForm" id="adminForm" autocomplete="off" <?php if(!empty($this->fieldsClass->formoption)) echo $this->fieldsClass->formoption; ?> >
		<input type="hidden" name="cid[]" value="<?php echo @$this->subscriber->subid; ?>"/>
		<input type="hidden" name="acy_source" value="<?php echo acymailing_isAdmin() ? 'management_back' : 'management_front'; ?>"/>
		<?php $selectedList = acymailing_getVar('int', 'filter_lists');
		if(!empty($selectedList)){ ?>
			<input type="hidden" name="filter_lists" value="<?php echo $selectedList; ?>"/>
		<?php }
		if(!empty($this->Itemid)) echo '<input type="hidden" name="Itemid" value="'.$this->Itemid.'" />';
		acymailing_formOptions(); ?>
		<div class="<?php echo $this->isAdmin ? 'acyblockoptions' : 'onelineblockoptions'; ?>">
			<span class="acyblocktitle"><?php echo acymailing_translation('USER_INFORMATIONS'); ?></span>

			<div>
				<?php if(!acymailing_level(3) || empty($this->extraFields)){
					echo '<div class="acytable_userinfo">';
				} ?>
				<table class="acymailing_table" cellspacing="1">
					<tr id="trname">
						<td width="150" class="acykey">
							<label for="name">
								<?php echo acymailing_translation('JOOMEXT_NAME'); ?>
							</label>
						</td>
						<td>
							<?php
							if(empty($this->subscriber->userid)){
								echo '<input type="text" name="data[subscriber][name]" id="name" class="inputbox" style="width:200px" value="'.$this->escape(@$this->subscriber->name).'" />';
							}else{
								echo $this->escape($this->subscriber->name);
							}
							?>
						</td>
					</tr>
					<tr id="tremail">
						<td class="acykey">
							<label for="email">
								<?php echo acymailing_translation('JOOMEXT_EMAIL'); ?>
							</label>
						</td>
						<td>
							<?php
							if(empty($this->subscriber->userid)){
								echo '<input class="inputbox required" type="text" name="data[subscriber][email]" id="email" style="width:200px" value="'.$this->escape($this->subscriber->email).'" />';
							}else{
								echo $this->escape($this->subscriber->email);
							}
							?>
						</td>
					</tr>
					<tr id="trcreated">
						<td class="acykey">
							<label for="created">
								<?php echo acymailing_translation('CREATED_DATE'); ?>
							</label>
						</td>
						<td>
							<?php echo acymailing_getDate($this->subscriber->created); ?>
						</td>
					</tr>
					<tr id="trip">
						<td class="acykey">
							<label for="ip">
								<?php echo acymailing_translation('IP'); ?>
							</label>
						</td>
						<td>
							<?php echo $this->escape($this->subscriber->ip); ?>
						</td>
					</tr>

					<?php
					if(!empty($this->subscriber->userid)){
						?>
						<tr id="trusername">
							<td class="acykey">
								<label for="username">
									<?php echo acymailing_translation('ACY_USERNAME'); ?>
								</label>
							</td>
							<td>
								<?php echo $this->escape($this->subscriber->username); ?>
							</td>
						</tr>
						<tr id="truserid">
							<td class="acykey">
								<label for="userid">
									<?php echo acymailing_translation('USER_ID'); ?>
								</label>
							</td>
							<td>
								<?php echo $this->subscriber->userid; ?>
							</td>
						</tr>
						<?php
					}
					if(!acymailing_level(3) || empty($this->extraFields)){
						echo '</table></div><div class="acytable_userinfo"><table class="acymailing_table" cellspacing="1">';
					} ?>
					<tr id="trhtml">
						<td class="acykey">
							<label for="html">
								<?php echo acymailing_translation('RECEIVE'); ?>
							</label>
						</td>
						<td nowrap="nowrap">
							<?php echo acymailing_boolean("data[subscriber][html]", '', $this->subscriber->html, acymailing_translation('HTML'), acymailing_translation('JOOMEXT_TEXT')); ?>
						</td>
					</tr>
					<tr id="trconfirmed">
						<td class="acykey">
							<label for="confirmed">
								<?php echo acymailing_translation('CONFIRMED'); ?>
							</label>
						</td>
						<td>
							<?php echo acymailing_boolean("data[subscriber][confirmed]", '', $this->subscriber->confirmed, acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO')); ?>
						</td>
					</tr>
					<tr id="trenabled">
						<td class="acykey">
							<label for="block">
								<?php echo acymailing_translation('ENABLED'); ?>
							</label>
						</td>
						<td>
							<?php echo acymailing_boolean("data[subscriber][enabled]", '', $this->subscriber->enabled, acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO')); ?>
						</td>
					</tr>
					<tr id="traccept">
						<td class="acykey">
							<label for="accept">
								<?php echo acymailing_translation('ACCEPT_EMAIL'); ?>
							</label>
						</td>
						<td>
							<?php echo acymailing_boolean("data[subscriber][accept]", '', $this->subscriber->accept, acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO')); ?>
						</td>
					</tr>
				</table>
				<?php if(!acymailing_level(3) || empty($this->extraFields)){
					echo '</div>';
				} ?>
			</div>
		</div>
		<?php
		if(!empty($this->extraFields)){
			$this->fieldsClass->currentUser = $this->subscriber;
			include(dirname(__FILE__).DS.'extrafields.'.basename(__FILE__));
		} ?>
		<div class="onelineblockoptions" style="clear:both;<?php echo $this->isAdmin ? '' : 'max-width:700px;'; ?>">
			<div id="acysubscriberinfo">
				<?php $tabs = acymailing_get('helper.acytabs');

				echo $tabs->startPane('user_tabs');
				echo $tabs->startPanel(acymailing_translation('SUBSCRIPTION'), 'user_subscription');

				if(count($this->subscription) > 10){ ?>
					<script language="javascript" type="text/javascript">
						<!--
						function acymailing_searchAList(){
							var filter = document.getElementById("acymailing_searchList").value.toLowerCase();
							for(var i = 0; i <<?php echo count($this->subscription); ?>; i++){
								var itemName = document.getElementById("listName_" + i).innerHTML.toLowerCase();
								if(itemName.indexOf(filter) > -1){
									document.getElementById("acylistrow_" + i).style.display = "table-row";
								}else{
									document.getElementById("acylistrow_" + i).style.display = "none";
								}
							}
						}
						//-->
					</script>
				<?php } ?>
				<div>
					<table class="acymailing_table">
						<thead>
						<tr>
							<th class="title titlenum">
								<?php echo acymailing_translation('ACY_NUM'); ?>
							</th>
							<th class="title titlecolor">
							</th>
							<th class="title" nowrap="nowrap">
								<?php echo acymailing_translation('LIST_NAME');
								if(count($this->subscription) > 10){ ?>
									<input onkeyup="acymailing_searchAList();" type="text" style="width:170px;max-width:100%;margin-left:50px;margin-top:5px;" placeholder="<?php echo acymailing_translation('ACY_SEARCH'); ?>" id="acymailing_searchList">
								<?php } ?>
							</th>
							<th class="title" nowrap="nowrap">
								<?php echo acymailing_translation('STATUS'); ?>
								<span class="quickstatuschange" style="display:inline-block;font-style:italic;margin-left:50px"><?php echo $this->filters->statusquick; ?></span>
							</th>
							<th class="title titledate">
								<?php echo acymailing_translation('SUBSCRIPTION_DATE'); ?>
							</th>
							<th class="title titledate">
								<?php echo acymailing_translation('UNSUBSCRIPTION_DATE'); ?>
							</th>
							<th class="title titleid">
								<?php echo acymailing_translation('ACY_ID'); ?>
							</th>
						</tr>
						</thead>
						<tbody>
						<?php
						$k = 0;
						$i = 0;
						foreach($this->subscription as $j => $row){
							$listClass = 'acy_list_status_'.str_replace('-', 'm', (int)@$row->status); ?>
							<tr class="<?php echo "row$k $listClass"; ?>" id="acylistrow_<?php echo $i; ?>">
								<td align="center" style="text-align:center">
									<?php echo $i + 1; ?>
								</td>
								<td width="12">
									<?php echo '<div class="roundsubscrib rounddisp" style="background-color:'.$row->color.'"></div>'; ?>
								</td>
								<td>
									<span style="display:none;" id="listName_<?php echo $i; ?>"><?php echo $row->name; ?></span>
									<?php echo acymailing_tooltip($row->description, $row->name, 'tooltip.png', $row->name); ?>
								</td>
								<td align="center" style="text-align:center" nowrap="nowrap">
									<?php echo $this->statusType->display('data[listsub]['.$row->listid.'][status]', (empty($this->subscriber->subid) && acymailing_getVar('int', 'filter_lists') == $row->listid) ? 1 : @$row->status); ?>
								</td>
								<td align="center" style="text-align:center">
									<?php if(!empty($row->subdate)) echo acymailing_getDate($row->subdate); ?>
								</td>
								<td align="center" style="text-align:center">
									<?php if(!empty($row->unsubdate)) echo acymailing_getDate($row->unsubdate); ?>
								</td>
								<td align="center" style="text-align:center">
									<?php echo $row->listid; ?>
								</td>
							</tr>
							<?php
							$k = 1 - $k;
							$i++;
						} ?>
						</tbody>
					</table>
				</div>
				<?php echo $tabs->endPanel();
				if(!empty($this->open)){
					echo $tabs->startPanel(acymailing_translation('ACY_SENT_EMAILS'), 'user_open');
					?>

					<div>
						<table class="acymailing_table">
							<thead>
							<tr>
								<th class="title titlenum">
									<?php echo acymailing_translation('ACY_NUM'); ?>
								</th>
								<th class="title titledate">
									<?php echo acymailing_translation('SEND_DATE'); ?>
								</th>
								<th class="title">
									<?php echo acymailing_translation('JOOMEXT_SUBJECT'); ?>
								</th>
								<th class="title titletoggle">
									<?php echo acymailing_translation('RECEIVED_VERSION'); ?>
								</th>
								<th class="title titletoggle">
									<?php echo acymailing_translation('OPEN'); ?>
								</th>
								<th class="title titledate">
									<?php echo acymailing_translation('OPEN_DATE'); ?>
								</th>
								<?php if(acymailing_level(3)){ ?>
									<th class="title titletoggle">
										<?php echo acymailing_translation('CLICKED_LINK'); ?>
									</th>
									<th class="title titletoggle">
										<?php echo acymailing_translation('BOUNCES'); ?>
									</th>
								<?php } ?>
								<th class="title titletoggle">
									<?php echo acymailing_translation('ACY_SENT'); ?>
								</th>
							</tr>
							</thead>
							<tbody>
							<?php
							$width = intval($this->config->get('popup_width', 750));
							$height = intval($this->config->get('popup_height', 550));
							$k = 0;

							for($i = 0, $a = count($this->open); $i < $a; $i++){
								$row =& $this->open[$i];
								$row->subject = acyEmoji::Decode($row->subject);
								?>
								<tr class="<?php echo "row$k"; ?>">
									<td align="center" style="text-align:center">
										<?php echo $i + 1; ?>
									</td>
									<td>
										<?php echo acymailing_getDate($row->senddate); ?>
									</td>
									<td>
										<?php
										if(acymailing_isAdmin()){
											$link = acymailing_completeLink('queue&task=preview&mailid='.$row->mailid.'&subid='.$this->subscriber->subid, true);
											echo acymailing_popup($link, $row->subject, '', $width, $height);
										}else{
											$text = '<b>'.acymailing_translation('ACY_ID').' : </b>'.$row->mailid;
											echo acymailing_tooltip($text, $row->subject, '', $row->subject);
										}
										?>
									</td>
									<td align="center" style="text-align:center">
										<?php echo $row->html ? acymailing_translation('HTML') : acymailing_translation('JOOMEXT_TEXT'); ?>
									</td>
									<td align="center" style="text-align:center">
										<?php echo $row->open; ?>
									</td>
									<td align="center" style="text-align:center">
										<?php if(!empty($row->opendate)) echo acymailing_getDate($row->opendate); ?>
									</td>
									<?php if(acymailing_level(3)){ ?>
										<td align="center" style="text-align:center">
											<?php echo $this->toggleClass->display('visible', empty($this->clickedNews[$row->mailid]) ? false : true); ?>
										</td>
										<td align="center" style="text-align:center">
											<?php echo $row->bounce; ?>
										</td>
									<?php } ?>
									<td align="center" style="text-align:center">
										<?php echo $this->toggleClass->display('visible', empty($row->fail) ? true : false); ?>
									</td>
								</tr>
								<?php
								$k = 1 - $k;
							}
							?>
							</tbody>
						</table>
					</div>

					<?php
					echo $tabs->endPanel();
				}

				if(!empty($this->clicks)){
					echo $tabs->startPanel(acymailing_translation('CLICK_STATISTICS'), 'user_clicks'); ?>

					<div>
						<table class="acymailing_table">
							<thead>
							<tr>
								<th class="title titlenum">
									<?php echo acymailing_translation('ACY_NUM'); ?>
								</th>
								<th class="title titledate">
									<?php echo acymailing_translation('CLICK_DATE'); ?>
								</th>
								<th class="title">
									<?php echo acymailing_translation('JOOMEXT_SUBJECT'); ?>
								</th>
								<th class="title">
									<?php echo acymailing_translation('URL'); ?>
								</th>
								<th class="title titletoggle">
									<?php echo acymailing_translation('TOTAL_HITS'); ?>
								</th>
							</tr>
							</thead>
							<tbody>
							<?php
							$k = 0;

							for($i = 0, $a = count($this->clicks); $i < $a; $i++){
								$row =& $this->clicks[$i];
								$row->subject = acyEmoji::Decode($row->subject);
								$id = 'urlclick'.$i;
								?>
								<tr class="<?php echo "row$k"; ?>" id="<?php echo $id; ?>">
									<td align="center" style="text-align:center">
										<?php echo $i + 1; ?>
									</td>
									<td>
										<?php echo acymailing_getDate($row->date); ?>
									</td>
									<td>
										<?php
										$text = '<b>'.acymailing_translation('ACY_ID').' : </b>'.$row->mailid;
										echo acymailing_tooltip($text, $row->subject, '', $row->subject);
										?>
									</td>
									<td>
										<a target="_blank" href="<?php echo strip_tags($row->url); ?>"><?php echo $row->urlname; ?></a>
									</td>
									<td align="center" style="text-align:center">
										<?php echo $row->click; ?>
									</td>
								</tr>
								<?php
								$k = 1 - $k;
							}
							?>
							</tbody>
						</table>
					</div>

					<?php echo $tabs->endPanel();
				}

				if(!empty($this->queue)){
					echo $tabs->startPanel(acymailing_translation('QUEUE'), 'user_queue'); ?>

					<div>
						<table class="acymailing_table">
							<thead>
							<tr>
								<th class="title titlenum">
									<?php echo acymailing_translation('ACY_NUM'); ?>
								</th>
								<th class="title titledate">
									<?php echo acymailing_translation('SEND_DATE'); ?>
								</th>
								<th class="title">
									<?php echo acymailing_translation('JOOMEXT_SUBJECT'); ?>
								</th>
								<th class="title titlenum">
									<?php echo acymailing_translation('PRIORITY'); ?>
								</th>
								<th class="title titlenum">
									<?php echo acymailing_translation('TRY'); ?>
								</th>
								<th class="title titletoggle">
									<?php echo acymailing_translation('ACY_DELETE'); ?>
								</th>
							</tr>
							</thead>
							<tbody>
							<?php
							$k = 0;

							for($i = 0, $a = count($this->queue); $i < $a; $i++){
								$row =& $this->queue[$i];
								$row->subject = acyEmoji::Decode($row->subject);
								$id = 'queue'.$i;
								?>
								<tr class="<?php echo "row$k"; ?>" id="<?php echo $id; ?>">
									<td align="center" style="text-align:center">
										<?php echo $i + 1; ?>
									</td>
									<td>
										<?php echo acymailing_getDate($row->senddate); ?>
									</td>
									<td>
										<?php
										$text = '<b>'.acymailing_translation('ACY_ID').' : </b>'.$row->mailid;
										echo acymailing_tooltip($text, $row->subject, '', $row->subject);
										?>
									</td>
									<td align="center" style="text-align:center">
										<?php echo $row->priority; ?>
									</td>
									<td align="center" style="text-align:center">
										<?php echo $row->try; ?>
									</td>
									<td align="center" style="text-align:center">
										<?php echo $this->toggleClass->delete($id, $row->subid.'_'.$row->mailid, 'queue'); ?>
									</td>
								</tr>
								<?php
								$k = 1 - $k;
							}
							?>
							</tbody>
						</table>
					</div>

					<?php echo $tabs->endPanel();
				}

				if(!empty($this->history)){
					echo $tabs->startPanel(acymailing_translation('ACY_HISTORY'), 'user_history');
					?>

					<div>
						<table class="acymailing_table">
							<thead>
							<tr>
								<th class="title titlenum">
									<?php echo acymailing_translation('ACY_NUM'); ?>
								</th>
								<th class="title titledate">
									<?php echo acymailing_translation('FIELD_DATE'); ?>
								</th>
								<th class="title">
									<?php echo acymailing_translation('ACY_ACTION'); ?>
								</th>
								<th class="title">
									<?php echo acymailing_translation('ACY_DETAILS'); ?>
								</th>
								<th class="title">
									<?php echo acymailing_translation('IP'); ?>
								</th>
								<th class="title" width="30%">
									<?php echo acymailing_translation('ACY_SOURCE'); ?>
								</th>
							</tr>
							</thead>
							<tbody>
							<?php
							$k = 0;

							for($i = 0, $a = count($this->history); $i < $a; $i++){
								$row =& $this->history[$i];
								?>
								<tr class="<?php echo "row$k"; ?>">
									<td align="center" style="text-align:center" valign="top">
										<?php echo $i + 1; ?>
									</td>
									<td align="center" style="text-align:center">
										<?php echo acymailing_getDate($row->date); ?>
									</td>
									<td valign="top">
										<?php echo acymailing_translation('ACTION_'.strtoupper($row->action)); ?>
									</td>
									<td valign="top">
										<?php
										if(!empty($row->data)){
											$data = explode("\n", $row->data);
											$id = 'history_details'.$i;
											echo '<div style="cursor:pointer;text-align:center" onclick="if(document.getElementById(\''.$id.'\').style.display == \'none\'){document.getElementById(\''.$id.'\').style.display = \'block\'}else{document.getElementById(\''.$id.'\').style.display = \'none\'}">'.acymailing_translation('VIEW_DETAILS').'</div>';
											echo '<div id="'.$id.'" style="display:none">';
											if(!empty($row->mailid)) echo '<b>'.acymailing_translation('NEWSLETTER').' : </b>'.$this->escape($row->subject).' ( '.acymailing_translation('ACY_ID').' : '.$row->mailid.' )<br />';
											foreach($data as $value){
												if(!strpos($value, '::')){
													echo $value;
													continue;
												}
												list($part1, $part2) = explode("::", $value);
												if(preg_match('#^[A-Z_]*$#', $part2)) $part2 = acymailing_translation($part2);
												echo '<b>'.$this->escape(acymailing_translation($part1)).' : </b>'.$this->escape($part2).'<br />';
											}
											echo '</div>';
										}
										?>
									</td>
									<td valign="top">
										<?php echo $row->ip ?>
									</td>
									<td valign="top">
										<?php
										if(!empty($row->source)){
											$id = 'history_source'.$i;
											$source = explode("\n", $row->source);
											echo '<div style="cursor:pointer;text-align:center" onclick="if(document.getElementById(\''.$id.'\').style.display == \'none\'){document.getElementById(\''.$id.'\').style.display = \'block\'}else{document.getElementById(\''.$id.'\').style.display = \'none\'}">'.acymailing_translation('VIEW_DETAILS').'</div>';
											echo '<div id="'.$id.'" style="display:none">';
											foreach($source as $value){
												if(!strpos($value, '::')) continue;
												list($part1, $part2) = explode("::", $value);
												echo '<b>'.$this->escape($part1).' : </b>'.$this->escape($part2).'<br />';
											}
											echo '</div>';
										}
										?>
									</td>
								</tr>
								<?php
								$k = 1 - $k;
							}
							?>
							</tbody>
						</table>
					</div>
					<?php
					echo $tabs->endPanel();
				}

				if(!empty($this->geoloc) && !empty($google_map_api_key)){
					echo $tabs->startPanel('<span onclick="setTimeout(function(){chart.draw(data, mapOptions)},100);">'.acymailing_translation('GEOLOCATION').'</span>', 'geoloc');
					?>
					<div>
						<div id="mapGeoloc_div" style="width:900px; max-width:100%; float:left; padding-right:20px;"></div>
						<div style="float:left; min-width:400px; max-width:800px;">
							<table class="acymailing_table">
								<thead>
								<tr>
									<th class="title titledate">
										<?php echo acymailing_translation('FIELD_DATE'); ?>
									</th>
									<th class="title">
										<?php echo acymailing_translation('ACY_ACTION'); ?>
									</th>
									<th class="title">
										<?php echo acymailing_translation('COUNTRYCAPTION'); ?>
									</th>
									<th class="title">
										<?php echo acymailing_translation('STATECAPTION'); ?>
									</th>
									<th class="title">
										<?php echo acymailing_translation('CITYCAPTION'); ?>
									</th>
									<th class="title">
										<?php echo acymailing_translation('IP'); ?>
									</th>
								</tr>
								</thead>
								<tbody>
								<?php
								$k = 0;
								foreach($this->geoloc as $action){
									?>
									<tr class="<?php echo "row$k"; ?>">
										<td align="center" style="text-align:center" valign="top">
											<?php echo acymailing_getDate($action->geolocation_created); ?>
										</td>
										<td valign="top">
											<?php echo $this->escape($action->geolocation_type); ?>
										</td>
										<td valign="top">
											<?php echo $this->escape($action->geolocation_country); ?>
										</td>
										<td valign="top">
											<?php echo $this->escape($action->geolocation_state); ?>
										</td>
										<td valign="top">
											<?php echo $this->escape($action->geolocation_city); ?>
										</td>
										<td valign="top">
											<?php echo $this->escape($action->geolocation_ip); ?>
										</td>
									</tr>
									<?php
									$k = 1 - $k;
								}
								?>
								<tbody>
							</table>
						</div>
						<div style="clear: both"></div>
					</div>
					<?php
					echo $tabs->endPanel();
				}

				if(!empty($this->neighbours)){
					echo $tabs->startPanel(acymailing_translation('ACY_NEIGHBOUR'), 'user_neighbour');
					?>

					<div>
						<table class="acymailing_table">
							<thead>
							<tr>
								<th class="title titlenum">
									<?php echo acymailing_translation('ACY_NUM'); ?>
								</th>
								<th class="title">
									<?php echo acymailing_translation('JOOMEXT_NAME'); ?>
								</th>
								<th class="title">
									<?php echo acymailing_translation('JOOMEXT_EMAIL'); ?>
								</th>
								<th class="title titleid">
									<?php echo acymailing_translation('ACY_ID'); ?>
								</th>
							</tr>
							</thead>
							<tbody>
							<?php
							$k = 0;
							foreach($this->neighbours as $num => $oneNeighbour){
								?>
								<tr class="<?php echo "row$k"; ?>">
									<td align="center" style="text-align:center" valign="top">
										<?php echo($num + 1) ?>
									</td>
									<td valign="top">
										<?php echo $this->escape($oneNeighbour->name); ?>
									</td>
									<td valign="top">
										<?php echo '<a href="'.acymailing_completeLink('subscriber&task=edit&subid='.$oneNeighbour->subid).'" target="_blank">'.$this->escape($oneNeighbour->email).'</a>'; ?>
									</td>
									<td align="center" style="text-align:center" valign="top">
										<?php echo $oneNeighbour->subid; ?>
									</td>
								</tr>
								<?php
								$k = 1 - $k;
							} ?>
							</tbody>
						</table>
					</div>
					<?php
					echo $tabs->endPanel();
				}
				echo $tabs->endPane(); ?>
			</div>
		</div>
		<div class="clr"></div>
	</form>
</div>
components/com_acymailing/views/subscriber/tmpl/listing.php000060400000021434152453623450020353 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content" class="acysubscriberlisting">
	<div id="iframedoc"></div>
	<form action="<?php echo acymailing_completeLink(acymailing_getVar('cmd', 'ctrl')); ?>" method="post" name="adminForm" id="adminForm">
		<table width="100%" class="acymailing_table_options">
			<tr>
				<td id="subscriberfilter" style="min-width:325px;">
					<?php acymailing_listingsearch($this->pageInfo->search); ?>
				</td>
				<td align="right">
					<?php
					if(!empty($this->filterFields)){
						foreach($this->filterFields as $oneField){
							echo '<span class="subscriber_filter">'.$oneField.'</span> ';
						}
					}
					?>
					<span class="subscriber_filter" id="subscriberfilterstatus"><?php echo $this->filters->status; ?></span>
					<span class="subscriber_filter" id="subscriberfilterlists"><?php echo $this->filters->lists; ?></span>
					<?php if(!empty($this->filters->statuslist)){ ?><span class="subscriber_filter" id="subscriberfilterlistsstatus"><?php echo $this->filters->statuslist; ?></span><?php } ?>
				</td>
			</tr>
		</table>
		<table class="acymailing_table">
			<thead>
			<tr>
				<th class="title titlenum">
					<?php echo acymailing_translation('ACY_NUM'); ?>
				</th>
				<th class="title titlebox">
					<input type="checkbox" name="toggle" value="" onclick="acymailing.checkAll(this);"/>
				</th>
				<?php
				foreach($this->displayFields as $map => $oneField){
					if($map == 'html') continue; ?>
					<th class="title" style="text-align: left;<?php echo $map == 'name' ? 'width: 200px;' : ''; ?>">
						<?php echo acymailing_gridSort($this->customFields->trans($oneField->fieldname), 'a.'.$map, $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
					</th>
				<?php } ?>
				<?php
				if(acymailing_isAdmin()){ ?>
					<th class="title" style="text-align: left;">
						<?php echo acymailing_translation('SUBSCRIPTION'); ?>
					</th>
				<?php } ?>
				<th class="title titledate">
					<?php echo acymailing_gridSort(acymailing_translation('CREATED_DATE'), 'a.created', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
				</th>
				<?php
				if(acymailing_isAdmin()){
					if(!empty($this->displayFields['html'])){ ?>
						<th class="title titletoggle">
							<?php echo acymailing_gridSort(acymailing_translation('RECEIVE_HTML'), 'a.html', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
						</th>
					<?php } ?>
					<?php if($this->config->get('require_confirmation', 1)){ ?>
						<th class="title titletoggle">
							<?php echo acymailing_gridSort(acymailing_translation('CONFIRMED'), 'a.confirmed', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
						</th>
					<?php } ?>
					<th class="title titletoggle">
						<?php echo acymailing_gridSort(acymailing_translation('ENABLED'), 'a.enabled', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
					</th>
					<th class="title titleid">
						<?php echo acymailing_gridSort(acymailing_translation('USER_ID'), 'a.userid', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
					</th>
					<th class="title titleid">
						<?php echo acymailing_gridSort(acymailing_translation('ACY_ID'), 'a.subid', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
					</th>
				<?php } ?>
			</tr>
			</thead>
			<tfoot>
			<tr>
				<td colspan="<?php echo acymailing_isAdmin() ? count($this->displayFields) + 9 : count($this->displayFields) + 3; ?>">
					<?php echo $this->pagination->getListFooter();
					echo $this->pagination->getResultsCounter(); ?>
				</td>
			</tr>
			</tfoot>
			<tbody>
			<?php
			$k = 0;
			$i = 0;
			foreach($this->rows as $row){
				$confirmedid = 'confirmed_'.$row->subid;
				$htmlid = 'html_'.$row->subid;
				$enabledid = 'enabled_'.$row->subid;
				?>
				<tr class="<?php echo "row$k"; ?>">
					<td align="center" style="text-align:center">
						<?php echo $this->pagination->getRowOffset($i); ?>
					</td>
					<td align="center" style="text-align:center">
						<?php echo acymailing_gridID($i, $row->subid); ?>
					</td>
					<?php
					$this->customFields->currentUser = $row;
					foreach($this->displayFields as $map => $oneField){
						if($map == 'html') continue; ?>
						<td class="columnclass<?php echo $map; ?>">
							<?php
							if($map == 'email'){
								echo '<a href="'.acymailing_completeLink(acymailing_getVar('cmd', 'ctrl').'&task=edit&subid='.$row->subid).'">';
								echo acymailing_punycode($this->customFields->listing($oneField, @$row->$map, $this->pageInfo->search), 'emailToUTF8');
								echo '</a>';
							}else {
								echo $this->customFields->listing($oneField, @$row->$map, $this->pageInfo->search);
							}
							?>
						</td>
					<?php }
					if(acymailing_isAdmin()){
						?>
						<td align="right">

							<?php
							if(empty($row->accept)){
								echo '<div class="icon-16-refuse" >'.acymailing_tooltip(acymailing_translation('USER_REFUSE', true), '', '', '&nbsp;&nbsp;&nbsp;&nbsp;').'</div>';
							}

							foreach($this->lists as $listid => $list){
								if(empty($row->subscription->$listid)) continue;
								$statuslistid = 'status_'.$listid.'_'.$row->subid;
								echo '<div id="'.$statuslistid.'" class="loading"  onclick="hideTooltip()">';
								$extra = array();
								$extra['color'] = $this->lists[$listid]->color;
								$extra['tooltiptitle'] = $this->lists[$listid]->name;
								$extra['tooltip'] = '<b>'.acymailing_translation('LIST_NAME').' : </b>'.$this->lists[$listid]->name.'<br />';
								if($row->subscription->$listid->status > 0){
									$extra['tooltip'] .= '<b>'.acymailing_translation('STATUS').' : </b>';
									$extra['tooltip'] .= ($row->subscription->$listid->status == '1') ? acymailing_translation('SUBSCRIBED') : acymailing_translation('PENDING_SUBSCRIPTION');
									$extra['tooltip'] .= '<br /><b>'.acymailing_translation('SUBSCRIPTION_DATE').' : </b>'.acymailing_getDate($row->subscription->$listid->subdate);
								}else{
									$extra['tooltip'] .= '<b>'.acymailing_translation('STATUS').' : </b>'.acymailing_translation('UNSUBSCRIBED').'<br />';
									$extra['tooltip'] .= '<b>'.acymailing_translation('UNSUBSCRIPTION_DATE').' : </b>'.acymailing_getDate($row->subscription->$listid->unsubdate);
								}

								echo $this->toggleClass->toggle($statuslistid, $row->subscription->$listid->status, 'listsub', $extra);
								echo '</div>';
							}

							?>
						</td>
					<?php } ?>
					<td align="center" style="text-align:center" class="valuedate">
						<?php echo acymailing_getDate($row->created); ?>
					</td>

					<?php if(acymailing_isAdmin()){
						if(!empty($this->displayFields['html'])){ ?>
							<td align="center" style="text-align:center">
								<span id="<?php echo $htmlid ?>" class="loading"><?php echo $this->toggleClass->toggle($htmlid, $row->html, 'subscriber') ?></span>
							</td>
						<?php } ?>
						<?php if($this->config->get('require_confirmation', 1)){ ?>
							<td align="center" style="text-align:center">
								<span id="<?php echo $confirmedid ?>" class="loading"><?php echo $this->toggleClass->toggle($confirmedid, $row->confirmed, 'subscriber') ?></span>
							</td>
						<?php } ?>
						<td align="center" style="text-align:center">
							<span id="<?php echo $enabledid ?>" class="loading"><?php echo $this->toggleClass->toggle($enabledid, $row->enabled, 'subscriber') ?></span>
						</td>
						<td align="center">
							<?php
							if(!empty($row->userid)){
								$text = acymailing_translation('ACY_USERNAME').' : <b>'.acymailing_dispSearch($row->username, $this->pageInfo->search);
								$text .= '</b><br />'.acymailing_translation('USER_ID').' : <b>'.acymailing_dispSearch($row->userid, $this->pageInfo->search).'</b>';
								echo acymailing_tooltip($text, acymailing_dispSearch($row->username, $this->pageInfo->search), '', acymailing_dispSearch($row->userid, $this->pageInfo->search), acymailing_userEditLink().$row->userid);
							} ?>
						</td>
						<td align="center">
							<?php echo acymailing_dispSearch($row->subid, $this->pageInfo->search); ?>
						</td>
					<?php } ?>
				</tr>
				<?php
				$k = 1 - $k;
				$i++;
			}
			?>
			</tbody>
		</table>

		<?php if(!empty($this->Itemid)) echo '<input type="hidden" name="Itemid" value="'.$this->Itemid.'" />';
		acymailing_formOptions($this->pageInfo->filter->order); ?>
	</form>
	<script type="text/javascript">
		function hideTooltip(){
			var nodes = document.getElementsByClassName('tooltip');
			for(var i = 0; i < nodes.length; i++){
				nodes[i].style.display = 'none';
			}
		}
	</script>
</div>
components/com_acymailing/views/subscriber/tmpl/index.html000060400000000054152453623450020161 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/list/index.html000060400000000054152453623450016015 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/list/tmpl/listing.php000060400000016431152453623450017164 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content" class="acylistlisting">
	<div id="iframedoc"></div>
	<?php $saveOrder = $this->pageInfo->filter->order->value == 'a.ordering' && strtolower($this->pageInfo->filter->order->dir) == 'asc'; ?>
	<form action="<?php echo acymailing_completeLink(acymailing_getVar('cmd', 'ctrl')); ?>" method="post" name="adminForm" id="adminForm">
		<table class="acymailing_table_options">
			<?php if(acymailing_isAdmin()){ ?>
				<tr>
					<td width="100%">
						<?php acymailing_listingsearch($this->pageInfo->search); ?>
					</td>
					<td nowrap="nowrap">
						<?php echo $this->filters->category; ?>
						<?php echo $this->filters->creator; ?>
					</td>
				</tr>
			<?php }else{ ?>
				<tr>
					<td nowrap="nowrap" width="100%">
						<?php acymailing_listingsearch($this->pageInfo->search); ?>
					</td>
					<td>
						<?php echo $this->filters->category; ?>
					</td>
				</tr>
				<tr>
					<td></td>
					<td>
						<?php echo $this->filters->creator; ?>
					</td>
				</tr>
			<?php } ?>
		</table>

		<table class="acymailing_table" cellpadding="1" id="listListing">
			<thead>
				<tr>
					<th class="title titlenum">
						<?php echo acymailing_translation('ACY_NUM'); ?>
					</th>
					<?php if(acymailing_isAdmin()){ ?>
						<th class="title titleorder" style="width:32px !important; padding-left:1px; padding-right:1px;">
							<?php echo acymailing_gridSort('<i class="icon-menu-2"></i>', 'a.ordering', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value, null, 'asc', 'JGRID_HEADING_ORDERING'); ?>
						</th>
					<?php } ?>
					<th class="title titlebox">
						<input type="checkbox" name="toggle" value="" onclick="acymailing.checkAll(this);"/>
					</th>
					<th class="title titlecolor">

					</th>
					<th class="title">
						<?php echo acymailing_gridSort(acymailing_translation('LIST_NAME'), 'a.name', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
					</th>
					<th class="title titlelink">
						<?php echo acymailing_translation('SUBSCRIBERS'); ?>
					</th>
					<th class="title titlelink">
						<?php echo acymailing_translation('UNSUBSCRIBERS'); ?>
					</th>
					<th class="title titlesender">
						<?php echo acymailing_gridSort(acymailing_translation('CREATOR'), 'd.name', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
					</th>
					<?php if(acymailing_isAdmin()){ ?>
					<th class="title titletoggle">
						<?php echo acymailing_gridSort(acymailing_translation('JOOMEXT_VISIBLE'), 'a.visible', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
					</th>
					<th class="title titletoggle">
						<?php echo acymailing_gridSort(acymailing_translation('ENABLED'), 'a.published', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
					</th>
					<?php } ?>
					<th class="title titleid">
						<?php echo acymailing_gridSort(acymailing_translation('ACY_ID'), 'a.listid', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
					</th>
				</tr>
			</thead>
			<tfoot>
			<tr>
				<td colspan="12">
					<?php echo $this->pagination->getListFooter();
					echo $this->pagination->getResultsCounter(); ?>
				</td>
			</tr>
			</tfoot>
			<tbody id="acymailing_sortable_listing">
				<?php
				$k = 0;
				$ordering = '';
				for($i = 0 ; $i < count($this->rows); $i++){
					$row =& $this->rows[$i];
					$ordering .= ',"order['.$i.']='.$row->ordering.'"';

					$publishedid = 'published_'.$row->listid;
					$visibleid = 'visible_'.$row->listid;
					?>
					<tr class="<?php echo "row$k"; ?>" acyorderid="<?php echo $row->listid; ?>">
						<td align="center" style="text-align:center">
							<?php echo $this->pagination->getRowOffset($i); ?>
						</td>
						<?php if(acymailing_isAdmin()){ ?>
							<?php $iconClass = 'acyicon-draghandle';
							if(!$saveOrder) $iconClass .= ' acyinactive-handler" title="Sort the listing by ordering first'; ?>
							<td class="<?php echo $iconClass; ?>"><img alt="" src="<?php echo ACYMAILING_IMAGES; ?>icons/drag.png" /></td>
						<?php } ?>
						<td align="center" style="text-align:center">
							<?php echo acymailing_gridID($i, $row->listid); ?>
						</td>
						<td width="12">
							<?php echo '<div class="roundsubscrib rounddisp" style="background-color:'.$this->escape($row->color).'"></div>'; ?>
						</td>
						<td>
							<?php
							echo acymailing_tooltip($row->description, $row->name, 'tooltip.png', $row->name, acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'list&task=edit&listid='.$row->listid));
							?>
						</td>
						<td align="center" style="text-align:center">
							<a href="<?php echo acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'subscriber&filter_status=0&filter_statuslist=1&filter_lists='.$row->listid); ?>">
								<?php echo $row->nbsub; ?>
							</a>
							<?php if(!empty($row->nbwait)){
								echo '&nbsp;&nbsp;'; ?>
								<?php $title = '(+'.$row->nbwait.')';
								echo acymailing_tooltip(acymailing_translation('NB_PENDING'), ' ', 'tooltip.png', $title, acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'subscriber&filter_status=0&filter_statuslist=2&filter_lists='.$row->listid)); ?>
							<?php } ?>
						</td>
						<td align="center" style="text-align:center">
							<a href="<?php echo acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'subscriber&filter_status=0&filter_statuslist=-1&filter_lists='.$row->listid); ?>">
								<?php echo $row->nbunsub; ?>
							</a>
						</td>
						<td align="center" style="text-align:center">
							<?php
							if(!empty($row->userid)){
								$text = '<b>'.acymailing_translation('JOOMEXT_NAME').' : </b>'.$row->creatorname;
								$text .= '<br /><b>'.acymailing_translation('ACY_USERNAME').' : </b>'.$row->username;
								$text .= '<br /><b>'.acymailing_translation('JOOMEXT_EMAIL').' : </b>'.$row->email;
								$text .= '<br /><b>'.acymailing_translation('ACY_ID').' : </b>'.$row->userid;
								echo acymailing_tooltip($text, $row->creatorname, 'tooltip.png', $row->creatorname, acymailing_isAdmin() ? acymailing_userEditLink().$row->userid : '');
							}
							?>
						</td>
						<?php if(acymailing_isAdmin()){ ?>
						<td align="center" style="text-align:center">
							<span id="<?php echo $visibleid ?>" class="spanloading"><?php echo $this->toggleClass->toggle($visibleid, $row->visible, 'list') ?></span>
						</td>
						<td align="center" style="text-align:center">
							<span id="<?php echo $publishedid ?>" class="spanloading"><?php echo $this->toggleClass->toggle($publishedid, $row->published, 'list') ?></span>
						</td>
						<?php } ?>
						<td align="center" style="text-align:center">
							<?php echo $row->listid; ?>
						</td>
					</tr>
					<?php
					$k = 1 - $k;
				}
				?>
			</tbody>
		</table>

		<?php if(!empty($this->Itemid)) echo '<input type="hidden" name="Itemid" value="'.$this->Itemid.'" />'; ?>
		<?php acymailing_formOptions($this->pageInfo->filter->order); ?>
	</form>
</div>

<?php if($saveOrder) acymailing_sortablelist('list', ltrim($ordering, ',')); ?>
components/com_acymailing/views/list/tmpl/index.html000060400000000054152453623450016771 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/list/tmpl/filter.lists.php000060400000020662152453623450020136 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php if(count($this->lists) > 10){ ?>
	<script language="javascript" type="text/javascript">
		<!--
		function acymailing_searchAList(){
			var filter = document.getElementById("acymailing_searchList").value.toLowerCase();
			for(var i = 0; i <<?php echo count($this->lists); ?>; i++){
				var itemName = document.getElementById("listName_" + i).innerHTML.toLowerCase();
				if(itemName.indexOf(filter) > -1){
					document.getElementById("acylistrow_" + i).style.display = "table-row";
				}else{
					document.getElementById("acylistrow_" + i).style.display = "none";
				}
			}
		}
		//-->
	</script>
	<div style="margin-bottom:10px;"><input onkeyup="acymailing_searchAList();" type="text" style="width: 200px;max-width:100%;margin-bottom:5px;" placeholder="<?php echo acymailing_translation('ACY_SEARCH'); ?>" id="acymailing_searchList"></div>
<?php }

$k = 0;
$i = 0;

$orderedList = array();
$listsPerCategory = array();
$languages = array();
foreach($this->lists as $row){
	$orderedList[$row->category][$row->listid] = $row;
	$listsPerCategory[$row->category][$row->listid] = $row->listid;
	if(count($this->lists) < 4) continue;

	$languages['all'][$row->listid] = $row->listid;
	if($row->languages == 'all') continue;
	$lang = explode(',', trim($row->languages, ','));
	foreach($lang as $oneLang){
		$languages[strtolower($oneLang)][$row->listid] = $row->listid;
	}
}
ksort($orderedList);
$allCats = array_keys($orderedList);
$this->lists = array();
foreach($orderedList as $oneCategory){
	$this->lists = array_merge($this->lists, $oneCategory);
}

if($currentPage == 'export'){
	$possibleStatuses = array();
	$possibleStatuses[] = acymailing_selectOption("0", acymailing_translation('ACY_DONT_EXPORT'));
	$possibleStatuses[] = acymailing_selectOption("-1", acymailing_translation('ACTION_UNSUBSCRIBED'));
	$possibleStatuses[] = acymailing_selectOption("2", acymailing_translation('PENDING_SUBSCRIPTION'));
	$possibleStatuses[] = acymailing_selectOption("1", acymailing_translation('SUBSCRIBED'));

	if(!acymailing_isAdmin()){
		$possibleStatuses[0]->class = 'btn-danger';
		$possibleStatuses[1]->class = 'btn-success';
		$possibleStatuses[2]->class = 'btn-success';
		$possibleStatuses[3]->class = 'btn-success';
	}
}

echo '<table class="acymailing_table" id="lists_choice"><tbody>';

foreach($this->lists as $row){
	if(empty($row->category)) $row->category = acymailing_translation('ACY_NO_CATEGORY');
	if(count($allCats) > 1 && (empty($currentCatgeory) || $row->category != $currentCatgeory)){
		$currentCatgeory = $row->category; ?>
		<tr class="<?php echo "row$k"; ?>">
			<td colspan="2">
				<a href="#" onclick="checkCats('<?php echo htmlspecialchars(str_replace("'", "\'", $row->category == acymailing_translation('ACY_NO_CATEGORY') ? -1 : $row->category), ENT_QUOTES, "UTF-8"); ?>'); return false;"><strong><?php echo htmlspecialchars($row->category, ENT_QUOTES, "UTF-8"); ?></strong></a>
			</td>
		</tr>
	<?php }
	if($currentPage == 'export'){
		$checked = (empty($this->exportlist) && in_array($row->listid, $this->selectedlists)) ? 1 : 0;
	}elseif($currentPage == 'import'){
		$filter_lists = explode(',', rtrim(acymailing_getVar('string', 'filter_lists'), ','));
		if(!empty($row->campaign)){
			$checked = acymailing_getVar('cmd', 'importlists['.$row->listid.']', in_array($row->listid, $filter_lists) ? 2 : 0);
		}else{
			$checked = !empty($currentValues[$row->listid]) || in_array($row->listid, $filter_lists) || $listid == $row->listid ? 1 : 0;
		}
	}

	$classList = $checked ? 'acy_list_checked' : 'acy_list_unchecked';
	?>
	<tr id="acylistrow_<?php echo $i; ?>" class="<?php echo "row$k $classList"; ?>">
		<td style="display:none;" id="listId_<?php echo $i; ?>"><?php echo $row->listid; ?></td>
		<td style="display:none;" id="listName_<?php echo $i; ?>"><?php echo $row->name; ?></td>
		<td>
			<?php
			echo '<div class="roundsubscrib rounddisp" style="background-color:'.$row->color.'"></div>';
			$text = '<b>'.acymailing_translation('ACY_ID').' : </b>'.$row->listid;
			$text .= '<br />'.$row->description;
			echo acymailing_tooltip($text, $row->name, 'tooltip.png', $row->name);
			?>
		</td>
		<td nowrap="nowrap">
			<?php
			if($currentPage == 'export'){
				if(!empty($this->exportlist) && $this->exportlist == $row->listid){
					$checked = $this->exportliststatus;
					if($this->exportliststatus == -2) $checked = 0;
				}
				echo acymailing_radio($possibleStatuses, "exportlists[".$row->listid."]", '', 'value', 'text', $checked, $row->listid.'listmail');
			}elseif($currentPage == 'import'){
				if(!empty($row->campaign)){
					echo acymailing_radio($this->campaignValues, "importlists[".$row->listid."]", '', 'value', 'text', $checked, $row->listid.'listmail');
				}else{
					echo acymailing_radio($this->subscribeOptions, "importlists[".$row->listid."]", '', 'value', 'text', $checked, $row->listid.'listmail');
				}
			}
			?>
		</td>
	</tr>
	<?php
	$k = 1 - $k;
	$i++;
}
if(count($this->lists) > 3){ ?>
	<tr>
		<td></td>
		<td nowrap="nowrap">
			<script language="javascript" type="text/javascript">
				<!--
				var selectedLists = new Array();
				<?php
				foreach($languages as $val => $listids){
					echo "selectedLists['$val'] = new Array('".implode("','", $listids)."'); ";
				}
				?>
				function updateStatus(selection){
					<?php
					$listidAll = "selectedLists['all'][i]+'listmail";
					$listidSelection = "selectedLists[selection][i]+'listmail";
					?>
					for(var i = 0; i < selectedLists['all'].length; i++){
						if(searchParent(window.document.getElementById(<?php echo $listidAll; ?>0'), 'tr').style.display == 'none') continue;
						<?php if(ACYMAILING_J30) echo "jQuery('label[for='+".$listidAll."0]').click();"; ?>
						window.document.getElementById(<?php echo $listidAll; ?>0').checked = true;
					}
					if(!selectedLists[selection]) return;
					for(i = 0; i < selectedLists[selection].length; i++){
						if(searchParent(window.document.getElementById(<?php echo $listidSelection; ?>1'), 'tr').style.display == 'none') continue;
						<?php if(ACYMAILING_J30) echo "jQuery('label[for='+".$listidSelection."1]').click();"; ?>
						window.document.getElementById(<?php echo $listidSelection; ?>1').checked = true;
					}
				}
				-->
			</script>
			<?php
			$selectList = array();
			$selectList[] = acymailing_selectOption('none', acymailing_translation('ACY_NONE'));
			foreach($languages as $oneLang => $values){
				if($oneLang == 'all') continue;
				$selectList[] = acymailing_selectOption($oneLang, ucfirst($oneLang));
			}
			$selectList[] = acymailing_selectOption('all', acymailing_translation('ACY_ALL'));
			echo acymailing_radio($selectList, "selectlists", 'onclick="updateStatus(this.value);"', 'value', 'text');
			?>
		</td>
	</tr>
<?php } ?>
	</tbody>
	</table>

	<script language="javascript" type="text/javascript">
		<!--
		function searchParent(elem, tag){
			tag = tag.toUpperCase();
			do{
				if(elem.nodeName === tag){
					return elem;
				}
			}while(elem = elem.parentNode);
			return null;
		}

		var listsCats = new Array();

		<?php
		foreach($listsPerCategory as $val => $listids){
			if(empty($val)) $val = '-1';
			echo "listsCats['".str_replace("'", "\'", $val)."'] = new Array('".implode("','", $listids)."'); ";
		}

		$listCatsSelection = 'listsCats[selection][i]+"listmail';

		?>
		function checkCats(selection){
			if(!listsCats[selection]) return;
			var unselect = true;
			for(var i = 0; i < listsCats[selection].length; i++){
				if(searchParent(window.document.getElementById(<?php echo $listCatsSelection; ?>0"), 'tr').style.display == 'none') continue;
				if(window.document.getElementById(<?php echo $listCatsSelection; ?>1").checked == true) continue;
				unselect = false;
				break;
			}
			for(i = 0; i < listsCats[selection].length; i++){
				if(searchParent(window.document.getElementById(<?php echo $listCatsSelection; ?>0"), 'tr').style.display == 'none') continue;
				if(unselect){
					<?php if(ACYMAILING_J30) echo 'jQuery("label[for="+'.$listCatsSelection.'0]").click();'; ?>
					window.document.getElementById(<?php echo $listCatsSelection; ?>0").checked = true;
				}else{
					<?php if(ACYMAILING_J30) echo 'jQuery("label[for="+'.$listCatsSelection.'1]").click();'; ?>
					window.document.getElementById(<?php echo $listCatsSelection; ?>1").checked = true;
				}
			}
		}
		-->
	</script>
<?php
components/com_acymailing/views/list/tmpl/form.php000060400000010757152453623450016463 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<div id="iframedoc"></div>
	<form action="<?php echo acymailing_completeLink(acymailing_getVar('cmd', 'ctrl')); ?>" method="post" name="adminForm" id="adminForm" autocomplete="off">
		<div class="<?php echo acymailing_isAdmin() ? 'acyblockoptions' : 'onelineblockoptions'; ?>" style="display:block; float:none;">
			<span class="acyblocktitle" style="display:block; float:none;"><?php echo acymailing_translation('ACY_LIST_INFORMATIONS'); ?></span>
			<table cellspacing="1" width="100%">
				<tr>
					<td class="acykey">
						<label for="name">
							<?php echo acymailing_translation('LIST_NAME'); ?>
						</label>
					</td>
					<td>
						<input type="text" name="data[list][name]" id="name" class="inputbox" style="width:200px" value="<?php echo $this->escape(@$this->list->name); ?>"/>
					</td>
					<td class="acykey">
						<label for="enabled">
							<?php echo acymailing_translation('ENABLED'); ?>
						</label>
					</td>
					<td>
						<?php echo acymailing_boolean("data[list][published]", '', $this->list->published); ?>
					</td>
				</tr>
				<tr>
					<td class="acykey">
						<label for="alias">
							<?php echo acymailing_translation('JOOMEXT_ALIAS'); ?>
						</label>
					</td>
					<td>
						<input type="text" name="data[list][alias]" id="alias" class="inputbox" style="width:200px" value="<?php echo $this->escape(@$this->list->alias); ?>"/>
					</td>
					<td class="acykey">
						<label for="visible">
							<?php echo acymailing_translation('JOOMEXT_VISIBLE'); ?>
						</label>
					</td>
					<td>
						<?php echo acymailing_boolean("data[list][visible]", '', $this->list->visible); ?>
					</td>
				</tr>
				<tr>
					<td class="acykey">
						<label for="datalistcategory">
							<?php echo acymailing_translation('ACY_CATEGORY'); ?>
						</label>
					</td>
					<td>
						<?php $catType = acymailing_get('type.categoryfield');
						echo $catType->display('list', 'data[list][category]', $this->list->category); ?>
					</td>
					<td class="acykey">
						<label for="colorexample">
							<?php echo acymailing_translation('COLOUR'); ?>
						</label>
					</td>
					<td>
						<?php echo $this->colorBox->displayAll('', 'data[list][color]', @$this->list->color); ?>
					</td>
				</tr>
				<tr>
					<td class="acykey">
						<label for="datalistunsubmailid">
							<?php echo acymailing_translation('MSG_UNSUB'); ?>
						</label>
					</td>
					<td>
						<?php echo $this->unsubMsg->display(@$this->list->unsubmailid); ?>
					</td>
					<td class="acykey">
						<?php if(acymailing_isAdmin()){ ?>
							<label for="creator">
								<?php echo acymailing_translation('CREATOR'); ?>
							</label>
						<?php } ?>
					</td>
					<td>
						<?php if(acymailing_isAdmin()) { ?>
							<input type="hidden" id="listcreator" name="data[list][userid]"
								   value="<?php echo @$this->list->userid; ?>"/>
							<?php echo '<span id="creatorname">' . @$this->list->creatorname . '</span>';
							echo ' '.acymailing_popup(acymailing_completeLink('subscriber&amp;task=choose&amp;onlyreg=1', true), '<img src="' . ACYMAILING_IMAGES . 'icons/icon-16-edit.png" alt="' . acymailing_translation('ACY_EDIT', true) . '"/>');
						} ?>
					</td>
				</tr>
				<tr>
					<td class="acykey">
						<label for="datalistwelmailid">
							<?php echo acymailing_translation('MSG_WELCOME'); ?>
						</label>
					</td>
					<td colspan="3">
						<?php if(acymailing_level(1)){
							echo $this->welcomeMsg->display(@$this->list->welmailid);
						}elseif(acymailing_isAdmin()){
							echo acymailing_getUpgradeLink('essential');
						} ?>
					</td>
				</tr>
			</table>
		</div>

		<div class="<?php echo acymailing_isAdmin() ? 'acyblockoptions' : 'onelineblockoptions'; ?>" style="float:none;display:block;">
			<span class="acyblocktitle"><?php echo acymailing_translation('ACY_DESCRIPTION'); ?></span>
			<?php echo $this->editor->display(); ?>
		</div>
		<?php
		if(acymailing_level(1)){
			if($this->languages->multipleLang){
				include(dirname(__FILE__).DS.'languages.php');
			}
			if(acymailing_level(3)){
				include(dirname(__FILE__).DS.'acl.php');
			}
		} ?>
		<div class="clr"></div>

		<input type="hidden" name="cid[]" value="<?php echo @$this->list->listid; ?>"/>
		<?php acymailing_formOptions(); ?>
	</form>
</div>
components/com_acymailing/views/list/view.html.php000060400000020574152453623450016457 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php


class ListViewList extends acymailingView{
	
	function display($tpl = null){
		$function = $this->getLayout();
		if(method_exists($this, $function)) $this->$function();

		parent::display($tpl);
	}

	function listing(){
		$config = acymailing_config();
		$pageInfo = new stdClass();
		$pageInfo->filter = new stdClass();
		$pageInfo->filter->order = new stdClass();
		$pageInfo->limit = new stdClass();
		$pageInfo->elements = new stdClass();

		$paramBase = ACYMAILING_COMPONENT.'.'.$this->getName();

		$pageInfo->filter->order->value = acymailing_getUserVar($paramBase.".filter_order", 'filter_order', 'a.ordering', 'cmd');
		$pageInfo->filter->order->dir = acymailing_getUserVar($paramBase.".filter_order_Dir", 'filter_order_Dir', 'asc', 'word');
		if(strtolower($pageInfo->filter->order->dir) !== 'desc') $pageInfo->filter->order->dir = 'asc';
		$pageInfo->search = acymailing_getUserVar($paramBase.".search", 'search', '', 'string');
		$pageInfo->search = strtolower(trim($pageInfo->search));
		$selectedCreator = acymailing_getUserVar($paramBase."filter_creator", 'filter_creator', 0, 'int');
		$selectedCategory = acymailing_getUserVar($paramBase."filter_category", 'filter_category', 0, 'string');

		$pageInfo->limit->value = acymailing_getUserVar($paramBase.'.list_limit', 'limit', acymailing_getCMSConfig('list_limit'), 'int');
		$pageInfo->limit->start = acymailing_getUserVar($paramBase.'.limitstart', 'limitstart', 0, 'int');

		$filters = array();
		if(!empty($pageInfo->search)){
			$searchVal = '\'%'.acymailing_getEscaped($pageInfo->search, true).'%\'';
			$filters[] = "a.name LIKE $searchVal OR a.description LIKE $searchVal OR a.listid LIKE $searchVal";
		}
		$filters[] = "a.type = 'list'";
		if(!empty($selectedCreator)) $filters[] = 'a.userid = '.$selectedCreator;
		if(!empty($selectedCategory)) $filters[] = 'a.category = '.acymailing_escapeDB($selectedCategory);

		if(!acymailing_isAdmin()) {
			$listClass = acymailing_get('class.list');
			$lists = $listClass->getFrontendLists('listid');

			$filters[] = 'listid IN ('.implode(',', array_keys($lists)).')';
		}

		$query = 'SELECT a.*, d.'.$this->cmsUserVars->name.' as creatorname, d.'.$this->cmsUserVars->username.' AS username, d.'.$this->cmsUserVars->email.' AS email';
		$query .= ' FROM '.acymailing_table('list').' as a';
		$query .= ' LEFT JOIN '.acymailing_table($this->cmsUserVars->table, false).' as d on a.userid = d.'.$this->cmsUserVars->id;
		$query .= ' WHERE ('.implode(') AND (', $filters).')';
		if(!empty($pageInfo->filter->order->value)){
			$query .= ' ORDER BY '.$pageInfo->filter->order->value.' '.$pageInfo->filter->order->dir;
		}

		$rows = acymailing_loadObjectList($query, '', $pageInfo->limit->start, $pageInfo->limit->value);

		$queryCount = 'SELECT COUNT(a.listid) FROM  '.acymailing_table('list').' as a';
		$queryCount .= ' WHERE ('.implode(') AND (', $filters).')';

		$pageInfo->elements->total = acymailing_loadResult($queryCount);

		$listids = array();
		foreach($rows as $oneRow){
			$listids[] = $oneRow->listid;
		}

		$subscriptionresults = array();
		if(!empty($listids)){
			$querySubscription = 'SELECT count(subid) as total,listid,status FROM '.acymailing_table('listsub').' WHERE listid IN ('.implode(',', $listids).') GROUP BY listid, status';
			$countresults = acymailing_loadObjectList($querySubscription);
			foreach($countresults as $oneResult){
				$subscriptionresults[$oneResult->listid][intval($oneResult->status)] = $oneResult->total;
			}
		}

		foreach($rows as $i => $oneRow){
			$rows[$i]->nbsub = intval(@$subscriptionresults[$oneRow->listid][1]);
			$rows[$i]->nbunsub = intval(@$subscriptionresults[$oneRow->listid][-1]);
			$rows[$i]->nbwait = intval(@$subscriptionresults[$oneRow->listid][2]);
		}

		$pageInfo->elements->page = count($rows);

		$pagination = new acyPagination($pageInfo->elements->total, $pageInfo->limit->start, $pageInfo->limit->value);

		if(acymailing_isAdmin()) {
			$acyToolbar = acymailing_get('helper.toolbar');
			if (acymailing_isAllowed($config->get('acl_lists_filter', 'all'))) {
				$acyToolbar->link(acymailing_completeLink('filter'), acymailing_translation('ACY_FILTERS'), 'filter');
				$acyToolbar->divider();
			}

			if (acymailing_isAllowed($config->get('acl_lists_manage', 'all'))) $acyToolbar->add();
			if (acymailing_isAllowed($config->get('acl_lists_manage', 'all'))) $acyToolbar->edit();
			if (acymailing_isAllowed($config->get('acl_lists_delete', 'all'))) $acyToolbar->delete();
			if (acymailing_isAllowed($config->get('acl_lists_manage', 'all')) || acymailing_isAllowed($config->get('acl_lists_manage', 'all')) || acymailing_isAllowed($config->get('acl_lists_delete', 'all'))) $acyToolbar->divider();
			$acyToolbar->help('list-listing');
			$acyToolbar->setTitle(acymailing_translation('LISTS'), 'list');
			$acyToolbar->display();
		}

		$order = new stdClass();
		$order->ordering = false;
		$order->orderUp = 'orderup';
		$order->orderDown = 'orderdown';
		$order->reverse = false;
		if($pageInfo->filter->order->value == 'a.ordering'){
			$order->ordering = true;
			if($pageInfo->filter->order->dir == 'desc'){
				$order->orderUp = 'orderdown';
				$order->orderDown = 'orderup';
				$order->reverse = true;
			}
		}

		$filters = new stdClass();
		$creatorfilterType = acymailing_get('type.creatorfilter');
		$creatorfilterType->type = 'list';
		$filters->creator = $creatorfilterType->display('filter_creator', $selectedCreator, 'list');
		$listcategoryType = acymailing_get('type.categoryfield');
		$filters->category = $listcategoryType->getFilter('list', 'filter_category', $selectedCategory, ' onchange="document.adminForm.submit();"');

		$this->config = $config;
		$this->filters = $filters;
		$this->order = $order;
		$toggleClass = acymailing_get('helper.toggle');
		$this->toggleClass = $toggleClass;
		$this->rows = $rows;
		$this->pageInfo = $pageInfo;
		$this->pagination = $pagination;
	}

	function form(){
		$listClass = acymailing_get('class.list');
		$listid = acymailing_getCID('listid');

		if(!empty($listid)){
			$list = $listClass->get($listid);

			if(empty($list->listid)){
				acymailing_display('List '.$listid.' not found', 'error');
				$listid = 0;
			}
		}

		if(empty($listid)){
			$list = new stdClass();
			$list->visible = 1;
			$list->description = '';
			$list->category = '';
			$list->published = 1;
			$list->creatorname = acymailing_currentUserName();
			$list->access_manage = 'none';
			$list->access_sub = 'all';
			$list->languages = 'all';
			$colors = array('#3366ff', '#7240A4', '#7A157D', '#157D69', '#ECE649');
			$list->color = $colors[rand(0, count($colors) - 1)];
		}

		$editor = acymailing_get('helper.editor');
		$editor->name = 'editor_description';
		$editor->content = $list->description;
		$editor->setDescription();

		$script = '
			document.addEventListener("DOMContentLoaded", function(){
				acymailing.submitbutton = function(pressbutton) {
					if (pressbutton == \'cancel\') {
						acymailing.submitform(pressbutton,document.adminForm);
						return;
					}
					if(window.document.getElementById("name").value.length < 2){alert(\''.acymailing_translation('ENTER_TITLE', true).'\'); return false;}';
		$script .= $editor->jsCode();
		$script .= 'acymailing.submitform(pressbutton,document.adminForm);
				};
			 }); ';
		$script .= 'function affectUser(idcreator,name,email){
			window.document.getElementById("creatorname").innerHTML = name;
			window.document.getElementById("listcreator").value = idcreator;
		}';


		acymailing_addScript(true, $script);

		if(acymailing_isAdmin()) {
			$acyToolbar = acymailing_get('helper.toolbar');
			$acyToolbar->addButtonOption('apply', acymailing_translation('ACY_APPLY'), 'apply', false);
			$acyToolbar->save();
			$acyToolbar->cancel();
			$acyToolbar->divider();
			$acyToolbar->help('list-form');
			$acyToolbar->setTitle(acymailing_translation('LIST'), 'list&task=edit&listid=' . $listid);
			$acyToolbar->display();
		}

		$colorBox = acymailing_get('type.color');
		$this->colorBox = $colorBox;
		if(acymailing_level(1)){
			$this->welcomeMsg = acymailing_get('type.welcome');
			$this->languages = acymailing_get('type.listslanguages');
		}
		$unsubMsg = acymailing_get('type.unsub');
		$this->unsubMsg = $unsubMsg;
		$this->list = $list;
		$this->editor = $editor;
	}
}
components/com_acymailing/views/data/index.html000060400000000054152453623450015753 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/data/view.html.php000060400000024442152453623450016413 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php


class dataViewdata extends acymailingView{
	
	function display($tpl = null){
		$function = $this->getLayout();
		if(method_exists($this, $function)) $this->$function();

		parent::display($tpl);
	}

	function genericimport(){
		$this->chosen = false;

		$isAdmin = false;
		if(acymailing_isAdmin()){
			$isAdmin = true;

			$acyToolbar = acymailing_get('helper.toolbar');
			$acyToolbar->custom('finalizeimport', acymailing_translation('IMPORT'), 'import', false, '');
			$acyToolbar->link(acymailing_completeLink('subscriber'), acymailing_translation('ACY_CANCEL'), 'cancel');
			$acyToolbar->divider();
			$acyToolbar->help('data-import', 'secondpage');
			$acyToolbar->setTitle(acymailing_translation('IMPORT'), 'data&task=import');
			$acyToolbar->display();
		}

		$config = acymailing_config();
		$this->config = $config;

		$selectedParams = array();
		$selectedParams = explode(',', $config->get('import_params', 'import_confirmed,generatename'));

		$this->selectedParams = $selectedParams;

		$lists = acymailing_getVar('array', 'importlists', array());
		$listClass = acymailing_get('class.list');
		$allLists = acymailing_isAdmin() ? $listClass->getLists() : $listClass->getFrontendLists();

		$listsName = array();
		$unsubListsName = array();
		foreach($allLists as $oneList){
			if($lists[$oneList->listid] == -1) $unsubListsName[] = $oneList->name;
			if($lists[$oneList->listid] == 1) $listsName[] = $oneList->name;
			if($lists[$oneList->listid] == 2) $listsName[] = $oneList->name.' + '.acymailing_translation('CAMPAIGN');
		}
		$createList = acymailing_getVar('string', 'createlist');
		if(!empty($createList)) $listsName[] = $createList;
		if(!empty($listsName)) $this->lists = implode(', ', $listsName);
		if(!empty($unsubListsName)) $this->unsublists = implode(', ', $unsubListsName);

		$importFrom = acymailing_getVar('cmd', 'importfrom');
		$this->type = $importFrom;
		$this->isAdmin = $isAdmin;
	}

	function import(){

		$listClass = acymailing_get('class.list');
		$config = acymailing_config();

		$isAdmin = false;
		if(acymailing_isAdmin()){
			$isAdmin = true;

			$acyToolbar = acymailing_get('helper.toolbar');
			$acyToolbar->custom('doimport', acymailing_translation('IMPORT'), 'import', false, '');
			$acyToolbar->link(acymailing_completeLink('subscriber'), acymailing_translation('ACY_CANCEL'), 'cancel');
			$acyToolbar->divider();
			$acyToolbar->help('data-import');
			$acyToolbar->setTitle(acymailing_translation('IMPORT'), 'data&task=import');
			$acyToolbar->display();
		}

		$importData = array();
		$importData['textarea'] = acymailing_translation('IMPORT_TEXTAREA');
		$importData['file'] = acymailing_translation('ACY_FILE');
		if(acymailing_isAllowed($config->get('acl_subscriber_zohoimport', 'all'))) $importData['zohocrm'] = 'ZohoCRM';


		$isAdmin = false;
		if(acymailing_isAdmin()){
			$isAdmin = true;
			$importData['joomla'] = acymailing_translation('IMPORT_JOOMLA');
			$importData['contact'] = 'com_contact';
			$importData['database'] = acymailing_translation('DATABASE');
			$importData['ldap'] = 'LDAP';
			$importData['zohocrm'] = 'ZohoCRM';
			if(acymailing_level(3)) $importData['fbleads'] = 'Facebook Leads';


			$possibleImport = array();
			$possibleImport[acymailing_getPrefix().'acajoom_subscribers'] = array('acajoom', 'Acajoom');
			$possibleImport[acymailing_getPrefix().'ccnewsletter_subscribers'] = array('ccnewsletter', 'ccNewsletter');
			$possibleImport[acymailing_getPrefix().'letterman_subscribers'] = array('letterman', 'Letterman');
			$possibleImport[acymailing_getPrefix().'communicator_subscribers'] = array('communicator', 'Communicator');
			$possibleImport[acymailing_getPrefix().'yanc_subscribers'] = array('yanc', 'Yanc');
			$possibleImport[acymailing_getPrefix().'vemod_news_mailer_users'] = array('vemod', 'Vemod News Mailer');
			$possibleImport[acymailing_getPrefix().'jnews_subscribers'] = array('jnews', 'jNews');
			$possibleImport['civicrm_email'] = array('civi', 'CiviCRM');
			$possibleImport[acymailing_getPrefix().'sobipro_field'] = array('sobipro', 'SobiPro');
			$possibleImport[acymailing_getPrefix().'nspro_subs'] = array('nspro', 'NS Pro');

			$tables = acymailing_getTableList();
			foreach($tables as $mytable){
				if(isset($possibleImport[$mytable])){
					$importData[$possibleImport[$mytable][0]] = $possibleImport[$mytable][1];
				}
			}

			$this->tables = $tables;

			$civifile = ACYMAILING_ROOT.'administrator'.DS.'components'.DS.'com_civicrm'.DS.'civicrm.settings.php';
			if(empty($importData['civicrm_email']) && file_exists($civifile)){
				$importData['civi'] = 'CiviCRM';
			}
		}


		$importvalues = array();
		foreach($importData as $div => $name){
			$importvalues[] = acymailing_selectOption($div, $name);
		}
		$js = 'var currentoption = \'textarea\';
		function updateImport(newoption){document.getElementById(currentoption).style.display = "none";document.getElementById(newoption).style.display = \'block\';currentoption = newoption;}';

		$function = acymailing_getVar('cmd', 'importfrom');
		if(!empty($function)){
			$js .= 'window.addEventListener("load", function(){ updateImport(\''.$function.'\'); });';
		}
		if($config->get('ldap_host') && acymailing_isAdmin()){
			$js .= 'window.addEventListener("load", function(){ updateldap(); });';
		}
		acymailing_addScript(true, $js);

		$this->importvalues = $importvalues;
		$this->importdata = $importData;

		$lists = acymailing_isAdmin() ? $listClass->getLists() : $listClass->getFrontendLists();

		$subscribeOptions = array();
		$subscribeOptions[] = acymailing_selectOption(0, acymailing_translation('JOOMEXT_NO'));
		$subscribeOptions[] = acymailing_selectOption(-1, acymailing_translation('UNSUBSCRIBE'));
		$subscribeOptions[] = acymailing_selectOption(1, acymailing_translation('SUBSCRIBE'));
		$campaignValues = $subscribeOptions;
		$campaignValues[] = acymailing_selectOption(2, acymailing_translation('JOOMEXT_YES_CAMPAIGN'));
		if(acymailing_level(3)){
			$listsOfId = array();
			foreach($lists as $oneList){
				$listsOfId[] = $oneList->listid;
			}
			$listCampaign = $listClass->getCampaigns($listsOfId);
			foreach($lists as $key => $oneList){
				if(!empty($listCampaign[$oneList->listid])){
					$lists[$key]->campaign = implode(',', $listCampaign[$oneList->listid]);
				}
			}
		}

		$this->lists = $lists;
		$this->subscribeOptions = $subscribeOptions;
		$this->campaignValues = $campaignValues;
		$this->config = $config;
		$this->isAdmin = $isAdmin;
	}

	function export(){
		$listClass = acymailing_get('class.list');
		$fields = acymailing_getColumns('#__acymailing_subscriber');
		$fieldsList = array();
		$fieldsList['listid'] = 'smallint unsigned';
		$fieldsList['listname'] = 'varchar';

		$config = acymailing_config();
		$selectedFields = explode(',', $config->get('export_fields', 'email,name'));
		$selectedLists = explode(',', $config->get('export_lists'));
		$selectedFilters = explode(',', $config->get('export_filters', 'subscribed'));

		$isAdmin = false;
		if(acymailing_isAdmin()){
			$isAdmin = true;

			$acyToolbar = acymailing_get('helper.toolbar');
			if(acymailing_isNoTemplate()){
				$acyToolbar->custom('doexport', acymailing_translation('ACY_EXPORT'), 'export', false, '');
				$acyToolbar->setTitle(acymailing_translation('ACY_EXPORT'));
				$acyToolbar->topfixed = false;
			}else{
				$acyToolbar->custom('doexport', acymailing_translation('ACY_EXPORT'), 'export', false, '');
				$acyToolbar->link(acymailing_completeLink('subscriber'), acymailing_translation('ACY_CANCEL'), 'cancel');
				$acyToolbar->divider();
				$acyToolbar->help('data-export');
				$acyToolbar->setTitle(acymailing_translation('ACY_EXPORT'), 'data&task=export');
			}
			$acyToolbar->display();
		}

		$charsetType = acymailing_get('type.charset');
		$this->charset = $charsetType;

		if(acymailing_isAdmin()){
			$lists = $listClass->getLists();
		}else $lists = $listClass->getFrontendLists();

		$this->lists = $lists;
		$this->fields = $fields;
		$this->fieldsList = $fieldsList;
		$this->selectedfields = $selectedFields;
		$this->selectedlists = $selectedLists;
		$this->selectedFilters = $selectedFilters;
		$this->config = $config;
		$this->isAdmin = $isAdmin;

		if(acymailing_getVar('int', 'sessionvalues')){
			if(!empty($_SESSION['acymailing']['exportusers'])){
				$i = 1;
				$subids = array();
				foreach($_SESSION['acymailing']['exportusers'] as $subid){
					$subids[] = (int)$subid;
					$i++;
					if($i > 10) break;
				}

				if(!empty($subids)){
					$users = acymailing_loadObjectList('SELECT DISTINCT `name`,`email` FROM `#__acymailing_subscriber` WHERE `subid` IN ('.implode(',', $subids).') LIMIT 10');
					$this->users = $users;
				}
			}elseif(!empty($_SESSION['acymailing']['exportlist'])){
				$filterList = $_SESSION['acymailing']['exportlist'];
				$this->exportlist = $filterList;
				$filterListStatus = $_SESSION['acymailing']['exportliststatus'];
				$this->exportliststatus = $filterListStatus;
			}
		}

		if(acymailing_getVar('int', 'fieldfilters')) $this->fieldfilters = true;

		if(acymailing_getVar('int', 'sessionquery')){
			acymailing_session();
			$exportQuery = $_SESSION['acymailing']['acyexportquery'];
			if(!empty($exportQuery)){
				$users = acymailing_loadObjectList('SELECT DISTINCT s.`name`,s.`email` '.$exportQuery.' LIMIT 10');
				$this->users = $users;

				if(strpos($exportQuery, 'userstats')){
					$otherFields = array('userstats.mailid','userstats.senddate', 'userstats.open', 'userstats.opendate', 'userstats.bounce', 'userstats.bouncerule', 'userstats.ip', 'userstats.html', 'userstats.fail', 'userstats.sent', 'userstats.browser', 'userstats.browser_version', 'userstats.is_mobile', 'userstats.mobile_os', 'userstats.user_agent');
					$this->otherfields = $otherFields;
				}
				if(strpos($exportQuery, 'urlclick')){
					$otherFields = array('url.name', 'url.url', 'urlclick.date', 'urlclick.ip', 'urlclick.click');
					$this->otherfields = $otherFields;
				}
				if(strpos($exportQuery, 'history')){
					$otherFields = array('hist.data', 'hist.date');
					$this->otherfields = $otherFields;
				}
			}
		}

		if(acymailing_level(3)){
			$geolocFields = acymailing_getColumns('#__acymailing_geolocation');
			$this->geolocfields = $geolocFields;
		}
	}
}
components/com_acymailing/views/data/tmpl/file.php000060400000001335152453623450016365 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><table class="acymailing_table">
	<tr id="trfileupload">
		<td class="acykey">
			<?php echo acymailing_translation('UPLOAD_FILE'); ?>
		</td>
		<td>
			<input type="file" style="width:auto;" name="importfile"/>
			<?php echo '<br />'.(acymailing_translation_sprintf('MAX_UPLOAD', (acymailing_bytes(ini_get('upload_max_filesize')) > acymailing_bytes(ini_get('post_max_size'))) ? ini_get('post_max_size') : ini_get('upload_max_filesize'))); ?>
		</td>
	</tr>
</table>

components/com_acymailing/views/data/tmpl/jnews.php000060400000002446152453623450016600 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
$resultUsers = acymailing_loadResult('SELECT count(id) FROM '.acymailing_table('jnews_subscribers', false));
$resultLists = acymailing_loadResult('SELECT count(id) FROM '.acymailing_table('jnews_lists', false));
$resultNews = acymailing_loadResult('SELECT count(id) FROM '.acymailing_table('jnews_mailings', false));

echo acymailing_translation_sprintf('USERS_IN_COMP', $resultUsers, 'jNews');
if(!empty($resultLists)){
	echo '<div class="acyblockoptions"><span class="acyblocktitle">'.acymailing_translation_sprintf('LISTS_IN_COMP', $resultLists, 'jNews').'</span>';
	echo acymailing_translation_sprintf('IMPORT_X_LISTS', $resultLists).'<br />';
	echo acymailing_translation_sprintf('IMPORT_LIST_TOO', 'jNews').acymailing_boolean("jnews_lists");
	echo '</div>';
}
if(!empty($resultNews)){
	echo '<div class="acyblockoptions"><span class="acyblocktitle">'.acymailing_translation_sprintf('LISTS_IN_COMP', $resultLists, 'jNews').'</span>';
	echo acymailing_translation_sprintf('IMPORT_NEWSLETTERS_TOO', 'jNews').acymailing_boolean("jnews_news");
}
components/com_acymailing/views/data/tmpl/import.php000060400000005002152453623450016753 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php $config = acymailing_config(); ?>
<div id="acy_content">
	<div id="iframedoc"></div>
	<form action="<?php echo acymailing_completeLink(acymailing_getVar('cmd', 'ctrl')); ?>" method="post" name="adminForm" enctype="multipart/form-data" id="adminForm">
		<?php if(!empty($this->Itemid)) echo '<input type="hidden" name="Itemid" value="'.$this->Itemid.'" />';
		acymailing_formOptions(); ?>
		<div style="width:100%;">
			<div id="import_mode_container">
				<div id="import_mode" class="<?php echo $this->isAdmin ? 'acyblockoptions' : 'onelineblockoptions'; ?>">
					<span class="acyblocktitle"><?php echo acymailing_translation('IMPORT_FROM'); ?></span>
					<?php echo acymailing_radio($this->importvalues, 'importfrom', 'class="inputbox" size="1" onclick="updateImport(this.value);"', 'value', 'text', acymailing_getVar('cmd', 'importfrom', 'textarea')); ?>
				</div>
			</div>
			<div id="import_options" class="<?php echo $this->isAdmin ? 'acyblockoptions' : 'onelineblockoptions'; ?>">
				<?php foreach($this->importdata as $div => $name){
					echo '<div id="'.$div.'"';
					if($div != acymailing_getVar('cmd', 'importfrom', 'textarea')) echo ' style="display:none"';
					echo '>';
					echo '<span class="acyblocktitle">'.$name.'</span>';
					include(dirname(__FILE__).DS.$div.'.php');
					echo '</div>';
				} ?>
			</div>
			<div class="<?php echo $this->isAdmin ? 'acyblockoptions' : 'onelineblockoptions'; ?>" id="importlists">
				<span class="acyblocktitle"><?php echo acymailing_translation('SUBSCRIPTION'); ?></span>
				<?php if(acymailing_isAllowed($this->config->get('acl_lists_manage', 'all'))){ ?>
					<table class="acymailing_table" cellpadding="1">
						<tr class="<?php echo "row1"; ?>" id="importcreatelist">
							<td colspan="2">
								<?php echo acymailing_translation('IMPORT_SUBSCRIBE_CREATE').' : <input type="text" name="createlist" placeholder="'.acymailing_translation('LIST_NAME').'" />'; ?>
							</td>
						</tr>
					</table>
				<?php }
				$currentPage = 'import';
				$currentValues = acymailing_getVar('none', 'importlists');
				$listid = acymailing_getVar('int', 'listid');
				include_once(ACYMAILING_BACK.'views'.DS.'list'.DS.'tmpl'.DS.'filter.lists.php');
				?>
			</div>
		</div>
	</form>
	<div style="clear: both;"></div>
</div>
components/com_acymailing/views/data/tmpl/vemod.php000060400000000706152453623450016561 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
	$resultUsers = acymailing_loadResult('SELECT count(*) FROM `#__vemod_news_mailer_users`');
	
	echo acymailing_translation_sprintf('USERS_IN_COMP',$resultUsers,'Vemod News Mailer');

components/com_acymailing/views/data/tmpl/database.php000060400000003176152453623450017217 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
$subfields = acymailing_getColumns('#__acymailing_subscriber');

$config = acymailing_config();
$postFields = (array)@unserialize($config->get('import_db_fields', ''));
?>
<table <?php echo $this->isAdmin ? '' : 'class="admintable table" cellspacing="1"' ?>>
	<tr>
		<td class="acykey"><?php echo acymailing_translation('TABLENAME'); ?></td>
		<td><input type="text" name="tablename" style="width:200px" size="80" value="<?php echo $this->escape($config->get('import_db_table', '')); ?>"/></td>
	</tr>
	<?php
	if(!empty($subfields)){
		foreach($subfields as $oneField => $type){
			if(in_array($oneField, array('subid', 'confirmed', 'confirmed_date', 'confirmed_ip', 'lastopen_date', 'lastsent_date', 'lastclick_date', 'enabled', 'key', 'userid', 'accept', 'html', 'created'))) continue;
			echo '<tr><td class="acykey">'.$oneField.'</td><td><input style="width:200px" type="text" name="fields['.$oneField.']" value="'.@$postFields[$oneField].'" /></td></tr>';
		}
	}
	if($this->config->get('require_confirmation')){ ?>
		<tr id="trdbconfirm">
			<td class="acykey">
				<?php echo acymailing_translation('IMPORT_CONFIRMED'); ?>
			</td>
			<td>
				<?php echo acymailing_boolean("import_confirmed_database", '', acymailing_getVar('int', 'import_confirmed_database', 1), acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO')); ?>
			</td>
		</tr>
	<?php }
	?>
</table>
components/com_acymailing/views/data/tmpl/contact.php000060400000001070152453623450017075 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
	try{
		$resultUsers = acymailing_loadResult("SELECT count(*) FROM `#__contact_details` WHERE `email_to` LIKE '%@%'");
	}catch(Exception $e){
		$resultUsers = 0;
		acymailing_display($e->getMessage(),'error');
	}


	echo acymailing_translation_sprintf('USERS_IN_COMP',$resultUsers,'com_contact');
components/com_acymailing/views/data/tmpl/zohocrm.php000060400000013044152453623450017127 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
$listClass = acymailing_get('class.list');
$this->data = $listClass->getLists('listid');
$this->values = array();
$this->values[] = acymailing_selectOption('0', '- - -');
foreach($this->data as $onelist){
	$this->values[] = acymailing_selectOption($onelist->listid, $onelist->name);
}
$zohoFields = $this->config->get('zoho_fields');
$value['zoho_fields'] = empty($zohoFields) ? array() : unserialize($zohoFields);
$zohoList = $this->config->get('zoho_list');
$value['zoho_list'] = empty($zohoList) ? 'Leads' : $zohoList;

if(empty($value['zoho_fields'])) $value['zoho_fields'] = array('First Name' => 'name');
?>
<span class="acyblocktitle"><?php echo acymailing_translation('Options'); ?></span>
<table <?php echo $this->isAdmin ? 'class="acymailing_table"' : 'class="admintable table" cellspacing="1"' ?>>
	<?php if($this->config->get('require_confirmation')){ ?>
		<tr id="trfileconfirm">
			<td class="acykey">
				<?php echo acymailing_translation('IMPORT_CONFIRMED'); ?>
			</td>
			<td>
				<?php
				echo acymailing_boolean("zoho_confirmed", '', $this->config->get('zoho_confirmed'), acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO'));
				?>
			</td>
		</tr>
	<?php } ?>
	<tr id="trfileoverwrite">
		<td class="acykey">
			<?php echo acymailing_translation('OVERWRITE_EXISTING'); ?>
		</td>
		<td>
			<?php
			echo acymailing_boolean("zoho_overwrite", '', $this->config->get('zoho_overwrite'), acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO')); ?>
		</td>
	</tr>
	<tr id="trzohodelete">
		<td class="acykey">
			<?php echo acymailing_translation('DELETE_USERS'); ?>
		</td>
		<td>
			<?php
			echo acymailing_boolean("zoho_delete", '', $this->config->get('zoho_delete'), acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO')); ?>
		</td>
	</tr>
	<tr id="trzohoimportnew">
		<td class="acykey">
			<?php echo acymailing_translation('ACY_ZOHO_IMPORT_NEW'); ?>
		</td>
		<td>
			<?php
			echo acymailing_boolean("zoho_importnew", '', $this->config->get('zoho_importnew'), acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO').' : '.acymailing_translation('ALL_USERS')); ?>
		</td>
	</tr>
	<tr id="trzohogeneratename">
		<td class="acykey">
			<?php echo acymailing_tooltip(acymailing_translation('ACY_ZOHO_GENERATE_NAME_DESC'), acymailing_translation('ACY_ZOHO_GENERATE_NAME'), '', acymailing_translation('ACY_ZOHO_GENERATE_NAME')); ?>
		</td>
		<td>
			<?php $generateFrom = array();
			$generateFrom[] = acymailing_selectOption('fromemail', acymailing_translation('ACY_ZOHO_GENERATE_NAME_FROM_EMAIL'));
			$generateFrom[] = acymailing_selectOption('fromconcat', acymailing_translation('ACY_ZOHO_GENERATE_NAME_FROM_FIELDS'));
			echo acymailing_radio($generateFrom, "zoho_generate_name", 'class="inputbox" size="1"', 'value', 'text', $this->config->get('zoho_generate_name', 'fromemail')); ?>
		</td>
	</tr>
	<tr id="trzohoapikey">
		<td class="acykey">
			<?php echo 'Auth Token'; ?>
		</td>
		<td>
			<input class="inputbox" type="text" name="zoho_apikey" size="35" value="<?php echo $this->escape($this->config->get('zoho_apikey')); ?>">
		</td>
	</tr>
	<tr id="trzoholist">
		<td class="acykey">
			<?php echo acymailing_translation('ACY_ZOHOLIST'); ?>
		</td>
		<td>
			<?php $lists = array();
			$lists[] = acymailing_selectOption('Leads', 'Leads');
			$lists[] = acymailing_selectOption('Contacts', 'Contacts');
			$lists[] = acymailing_selectOption('Vendors', 'Vendors');
			echo acymailing_select($lists, "zoho_list", 'class="inputbox" size="1"', 'value', 'text', $value['zoho_list']); ?>
		</td>
	</tr>
	<tr id="trzohocv">
		<td class="acykey">
			<?php echo acymailing_tooltip(acymailing_translation('CUSTOM_VIEW_DESC'), acymailing_translation('CUSTOM_VIEW'), '', acymailing_translation('CUSTOM_VIEW')); ?>
		</td>
		<td>
			<input class="inputbox" type="text" name="zoho_cv" size="35" value="<?php echo $this->escape($this->config->get('zoho_cv')); ?>">
		</td>
	</tr>
</table>


<span class="acyblocktitle" style="margin-top: 20px;"><?php echo acymailing_translation('FIELD'); ?></span>
<?php
$subfields = acymailing_getColumns('#__acymailing_subscriber');
$acyfields = array();
$acyfields[] = acymailing_selectOption('', ' - - - ');
if(!empty($subfields)){
	foreach($subfields as $oneField => $typefield){
		if(in_array($oneField, array('subid', 'confirmed', 'enabled', 'key', 'userid', 'accept', 'html', 'created', 'zohoid', 'zoholist', 'email'))) continue;
		$acyfields[] = acymailing_selectOption($oneField, $oneField);
	}
}
?>
<table <?php echo $this->isAdmin ? 'class="acymailing_table"' : 'class="admintable table" cellspacing="1"' ?>>
	<?php
	echo '<tr><td class="acykey">'.acymailing_translation('ACY_LOADZOHOFIELDS').'</td><td>';
	echo '<input type="submit" class="btn" onclick="acymailing.submitbutton(\'loadZohoFields\')" value="'.acymailing_translation('ACY_LOADFIELDS').'"></td></tr>';

	$fields = explode(',', $config->get('zoho_fieldsname', 'First Name,Last Name,Date of Birth'));

	foreach($fields as $oneField){
		$fieldValue = '';
		if(!empty($value['zoho_fields'][$oneField])) $fieldValue = $value['zoho_fields'][$oneField];
		echo '<tr><td class="acykey">'.$oneField.'</td><td><div id="zoho_fields">'.acymailing_select($acyfields, "zoho_fields[".$oneField."]", 'class="inputbox" size="1"', 'value', 'text', $fieldValue).'</div></td></tr>';
	}
	?>
</table>


components/com_acymailing/views/data/tmpl/index.html000060400000000054152453623450016727 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/data/tmpl/letterman.php000060400000000721152453623450017437 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
	$resultUsers = acymailing_loadResult('SELECT count(*) FROM '.acymailing_table('letterman_subscribers',false));
	
	echo acymailing_translation_sprintf('USERS_IN_COMP',$resultUsers,'Letterman');
components/com_acymailing/views/data/tmpl/joomla.php000060400000002073152453623450016727 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
$resultUsers = acymailing_loadResult('SELECT count('.$this->cmsUserVars->id.') FROM '.acymailing_table($this->cmsUserVars->table, false));

$resultAcymailing = acymailing_loadResult('SELECT count(subid) FROM '.acymailing_table('subscriber').' WHERE userid > 0');

echo acymailing_translation_sprintf('ACY_IMPORT_NB_J_USERS', $resultUsers).'<br />';
echo acymailing_translation_sprintf('ACY_IMPORT_NB_ACY_USERS', $resultAcymailing).'<br />';
?>
<br/>
<br/>
<?php echo acymailing_translation('ACY_IMPORT_JOOMLA_1'); ?>
<ol>
	<li><?php echo acymailing_translation('ACY_IMPORT_JOOMLA_2'); ?></li>
	<li><?php echo acymailing_translation('ACY_IMPORT_JOOMLA_3'); ?></li>
	<li><?php echo acymailing_translation('ACY_IMPORT_JOOMLA_4'); ?></li>
	<li><?php echo acymailing_translation('ACY_IMPORT_JOOMLA_5'); ?></li>
</ol>
components/com_acymailing/views/data/tmpl/textarea.php000060400000001016152453623450017257 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><textarea style="width:99%;height:180px;" rows="10" name="textareaentries">
<?php $text = acymailing_getVar('string', "textareaentries");
if(empty($text)){ ?>
name,email
Adrien,adrien@example.com
John,john@example.com
<?php }else{
	echo $text;
} ?>
</textarea>
components/com_acymailing/views/data/tmpl/acajoom.php000060400000001661152453623450017061 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
$resultUsers = acymailing_loadResult('SELECT count(id) FROM '.acymailing_table('acajoom_subscribers', false));
$resultLists = acymailing_loadResult('SELECT count(id) FROM '.acymailing_table('acajoom_lists', false));

echo acymailing_translation_sprintf('USERS_IN_COMP', $resultUsers, 'Acajoom');

if(!empty($resultLists)){
	echo '<div class="acyblockoptions"><span class="acyblocktitle">'.acymailing_translation_sprintf('LISTS_IN_COMP', $resultLists, 'Acajoom').'</span>';
	echo acymailing_translation_sprintf('IMPORT_X_LISTS', $resultLists).'<br />';
	echo acymailing_translation_sprintf('IMPORT_LIST_TOO', 'Acajoom').acymailing_boolean("acajoom_lists");
	echo '</div>';
}
components/com_acymailing/views/data/tmpl/ccnewsletter.php000060400000002761152453623450020154 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
$resultUsers = acymailing_loadResult('SELECT count(*) FROM '.acymailing_table('ccnewsletter_subscribers', false));

$resultLists = array();
$resultNews = array();

if(in_array(acymailing_getPrefix().'ccnewsletter_groups', $this->tables)){
	$resultLists = acymailing_loadResult('SELECT count(id) FROM '.acymailing_table('ccnewsletter_groups', false));

	$resultNews = acymailing_loadResult('SELECT count(id) FROM '.acymailing_table('ccnewsletter_newsletters', false));
}

echo acymailing_translation_sprintf('USERS_IN_COMP', $resultUsers, 'ccNewsletter');

if(!empty($resultLists)){
	echo '<div class="acyblockoptions"><span class="acyblocktitle">'.acymailing_translation_sprintf('LISTS_IN_COMP', $resultLists, 'ccNewsletter').'</span>';
	echo acymailing_translation_sprintf('IMPORT_X_LISTS', $resultLists).'<br />';
	echo acymailing_translation_sprintf('IMPORT_LIST_TOO', 'ccNewsletter').acymailing_boolean("ccNewsletter_lists");
	echo '</div>';
}
if(!empty($resultNews)){
	echo '<div class="acyblockoptions"><span class="acyblocktitle">'.acymailing_translation_sprintf('LISTS_IN_COMP', $resultLists, 'ccNewsletter').'</span>';
	echo acymailing_translation_sprintf('IMPORT_NEWSLETTERS_TOO', 'ccNewsletter').acymailing_boolean("ccNewsletter_news");
}
components/com_acymailing/views/data/tmpl/civi.php000060400000001231152453623450016373 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
$importHelper = acymailing_get('helper.import');
$importHelper->setciviprefix();
try{
	$resultUsers = acymailing_loadResult('SELECT count(*) FROM '.$importHelper->civiprefix.'email WHERE is_primary = 1');
	echo acymailing_translation_sprintf('USERS_IN_COMP', $resultUsers, 'CiviCRM');
}catch(Exception $e){
	echo("Error counting users from CiviCRM. CiviCRM table probably doesn't exists");
}


components/com_acymailing/views/data/tmpl/yanc.php000060400000001561152453623450016401 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
$resultUsers = acymailing_loadResult('SELECT count(*) FROM `#__yanc_subscribers`');
$resultLists = acymailing_loadResult('SELECT count(*) FROM `#__yanc_letters`');

echo acymailing_translation_sprintf('USERS_IN_COMP', $resultUsers, 'Yanc');

if(!empty($resultLists)){
	echo '<div class="acyblockoptions"><span class="acyblocktitle">'.acymailing_translation_sprintf('LISTS_IN_COMP', $resultLists, 'Yanc').'</span>';
	echo acymailing_translation_sprintf('IMPORT_X_LISTS', $resultLists).'<br />';
	echo acymailing_translation_sprintf('IMPORT_LIST_TOO', 'Yanc').acymailing_boolean("yanc_lists");
	echo '</div>';
}
components/com_acymailing/views/data/tmpl/communicator.php000060400000000727152453623450020152 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
	$resultUsers = acymailing_loadResult('SELECT count(*) FROM '.acymailing_table('communicator_subscribers',false));
	
	echo acymailing_translation_sprintf('USERS_IN_COMP',$resultUsers,'Communicator');
components/com_acymailing/views/data/tmpl/export.php000060400000021731152453623450016771 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<div id="iframedoc"></div>
	<form action="<?php echo acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'data', true); ?>" method="post" name="adminForm" id="adminForm">
		<style>
			#acy_content .oneBlock{
			<?php if(acymailing_isAdmin()){ ?> float: left;
				width: 49%;
				padding: 5px;
				min-width: 500px;
			<?php }else{ ?> width: 100%;
			<?php } ?>
			}
		</style>
		<div style="width:100%;">
			<div class="<?php echo $this->isAdmin ? 'acyblockoptions' : 'onelineblockoptions'; ?>">
				<span class="acyblocktitle"><?php echo acymailing_translation('FIELD_EXPORT'); ?></span>
				<table class="acymailing_smalltable">
					<?php
					$k = 0;
					if(!empty($this->fields)){
						foreach($this->fields as $fieldName => $fieldType){
							?>
							<tr class="<?php echo "row$k"; ?>" id="userField_<?php echo $fieldName; ?>">
								<td>
									<?php echo $fieldName ?>
								</td>
								<td align="center" style="text-align:center">
									<?php echo acymailing_boolean("exportdata[".$fieldName."]", '', in_array($fieldName, $this->selectedfields) ? 1 : 0); ?>
								</td>
							</tr>
							<?php
							$k = 1 - $k;
						}
					}
					if(!empty($this->otherfields)){

						foreach($this->otherfields as $fieldName){
							?>
							<tr class="<?php echo "row$k"; ?>" id="userField_<?php echo $fieldName; ?>">
								<td>
									<?php echo $fieldName ?>
								</td>
								<td align="center" style="text-align:center">
									<?php echo acymailing_boolean("exportdataother[".$fieldName."]", '', in_array($fieldName, $this->selectedfields) ? 1 : 0, acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO'), str_replace('.', '_', $fieldName)); ?>
								</td>
							</tr>
							<?php
							$k = 1 - $k;
						}
					}
					if(!empty($this->fieldsList)){
						foreach($this->fieldsList as $fieldName => $fieldType){
							?>
							<tr class="<?php echo "row$k"; ?>" id="userField_<?php echo $fieldName; ?>">
								<td>
									<?php echo $fieldName ?>
								</td>
								<td align="center" style="text-align:center">
									<?php echo acymailing_boolean("exportdatalist[".$fieldName."]", '', in_array($fieldName, $this->selectedfields) ? 1 : 0); ?>
								</td>
							</tr>
							<?php
							$k = 1 - $k;
						}
					}
					if(!empty($this->geolocfields)){
						?>
						<tr class="<?php echo "row$k"; ?>" id="userField_<?php echo $fieldName; ?>">
							<td>
								<?php echo acymailing_translation('ACYEXPORT_GEOLOC_VALUE'); ?>
							</td>
							<td align="center" style="text-align:center">
								<?php
								$values = array(acymailing_selectOption('asc', acymailing_translation('SEPARATOR_FIRST_GEOL_SAVED')), acymailing_selectOption('desc', acymailing_translation('ACYEXPORT_LAST_GEOL_SAVED')));
								echo acymailing_select($values, 'exportgeolocorder', '', 'value', 'text', $this->config->get('exportgeolocorder', 'asc')); ?>
							</td>
						</tr>
						<?php
						$k = 1 - $k;

						foreach($this->geolocfields as $fieldName => $fieldType){
							if(in_array($fieldName, array('geolocation_id', 'geolocation_subid'))) continue;
							?>
							<tr class="<?php echo "row$k"; ?>" id="userField_<?php echo $fieldName; ?>">
								<td>
									<?php echo $fieldName ?>
								</td>
								<td align="center" style="text-align:center">
									<?php echo acymailing_boolean("exportdatageoloc[".$fieldName."]", '', in_array($fieldName, $this->selectedfields) ? 1 : 0); ?>
								</td>
							</tr>
							<?php
							$k = 1 - $k;
						}
					}
					?>
					<tr class="<?php echo "row$k";
					$k = 1 - $k; ?>" id="userField_exportFormat">
						<td>
							<?php echo acymailing_translation('EXPORT_FORMAT'); ?>
						</td>
						<td align="center" style="text-align:center">
							<?php echo $this->charset->display('exportformat', $this->config->get('export_format', 'UTF-8')); ?>
						</td>
					</tr>
					<tr class="<?php echo "row$k"; $k = 1 - $k; ?>" id="userField_separator">
						<td>
							<?php echo acymailing_translation('ACY_SEPARATOR'); ?>
						</td>
						<td align="center" nowrap="nowrap">
							<?php
							$values = array(acymailing_selectOption('semicolon', acymailing_translation('SEPARATOR_SEMICOLON')), acymailing_selectOption('comma', acymailing_translation('SEPARATOR_COMMA')));
							$data = str_replace(array(';', ','), array('semicolon', 'comma'), $this->config->get('export_separator', ';'));
							if($data == 'colon') $data = 'comma';
							echo acymailing_radio($values, 'exportseparator', '', 'value', 'text', $data);
							?>
						</td>
					</tr>
					<tr class="<?php echo "row$k"; ?>" id="userField_excel">
						<td>
							<?php echo acymailing_tooltip(acymailing_translation('ACY_EXCEL_SECURITY_DESC'), acymailing_translation('ACY_EXCEL_SECURITY'), '', acymailing_translation('ACY_EXCEL_SECURITY')); ?>
						</td>
						<td align="center" style="text-align:center">
							<?php echo acymailing_boolean("export_excelsecurity", '', $this->config->get('export_excelsecurity', 0) == 1 ? 1 : 0); ?>
						</td>
					</tr>
				</table>
			</div>
			<?php if (empty($this->users)){ ?>
			<div class="<?php echo $this->isAdmin ? 'acyblockoptions' : 'onelineblockoptions'; ?>">
				<span class="acyblocktitle"><?php echo acymailing_translation('ACY_FILTERS'); ?></span>
				<table class="acymailing_smalltable">
					<tr class="row0">
						<td>
							<?php echo acymailing_translation('EXPORT_SUB_LIST'); ?>
						</td>
						<td align="center" nowrap="nowrap">
							<?php echo acymailing_boolean("exportfilter[subscribed]", 'onchange="if(this.value == 1){document.getElementById(\'exportlists\').style.display = \'block\'; }else{document.getElementById(\'exportlists\').style.display = \'none\'; }"', (in_array('subscribed', $this->selectedFilters) || !empty($this->exportlist)) ? 1 : 0, acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO').' : '.acymailing_translation('ALL_USERS')); ?>
						</td>
					</tr>
					<tr class="row1">
						<td>
							<?php echo acymailing_translation('EXPORT_REGISTERED'); ?>
						</td>
						<td align="center" style="text-align:center">
							<?php echo acymailing_boolean("exportfilter[registered]", '', in_array('registered', $this->selectedFilters) ? 1 : 0, acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO').' : '.acymailing_translation('ALL_USERS')); ?>
						</td>
					</tr>
					<tr class="row0">
						<td>
							<?php echo acymailing_translation('EXPORT_CONFIRMED'); ?>
						</td>
						<td align="center" style="text-align:center">
							<?php echo acymailing_boolean("exportfilter[confirmed]", '', in_array('confirmed', $this->selectedFilters) ? 1 : 0, acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO').' : '.acymailing_translation('ALL_USERS')); ?>
						</td>
					</tr>
					<tr class="row1">
						<td>
							<?php echo acymailing_translation('EXPORT_ENABLED'); ?>
						</td>
						<td align="center" style="text-align:center">
							<?php echo acymailing_boolean("exportfilter[enabled]", '', in_array('enabled', $this->selectedFilters) ? 1 : 0, acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO').' : '.acymailing_translation('ALL_USERS')); ?>
						</td>
					</tr>
				</table>
				</id>
				<?php } ?>
			</div>
			<div class="<?php echo $this->isAdmin ? 'acyblockoptions' : 'onelineblockoptions'; ?>" id="exportlists" <?php echo (in_array('subscribed', $this->selectedFilters) || !empty($this->exportlist) || !empty($this->users)) ? '' : 'style="display:none"' ?> >
				<?php
				if(empty($this->users)){ ?>
					<span class="acyblocktitle"><?php echo acymailing_translation('LISTS'); ?></span>
					<?php
					$currentPage = 'export';
					include_once(ACYMAILING_BACK.'views'.DS.'list'.DS.'tmpl'.DS.'filter.lists.php');
				}else{ ?>
					<span class="acyblocktitle"><?php echo acymailing_translation('USERS'); ?></span>
					<table class="acymailing_table" cellpadding="1">
						<?php
						$k = 0;
						foreach($this->users as $row){
							?>
							<tr class="<?php echo "row$k"; ?>">
								<td><?php echo htmlspecialchars($row->name, ENT_QUOTES, 'UTF-8'); ?></td>
								<td><?php echo htmlspecialchars($row->email, ENT_QUOTES, 'UTF-8'); ?></td>
							</tr>
							<?php $k = 1 - $k;
						}

						if(count($this->users) >= 10){
							?>
							<tr class="<?php echo "row$k"; ?>">
								<td>...</td>
								<td>...</td>
							</tr>
						<?php } ?>
					</table>
				<?php } ?>
			</div>
			<input type="hidden" name="sessionvalues" value="<?php echo empty($this->users) ? 0 : acymailing_getVar('int', 'sessionvalues'); ?>"/>
			<input type="hidden" name="sessionquery" value="<?php echo empty($this->users) ? 0 : acymailing_getVar('int', 'sessionquery'); ?>"/>
			<?php acymailing_formOptions(); ?>
	</form>
	<div class="clr"></div>
</div>
components/com_acymailing/views/data/tmpl/fbleads.php000060400000005402152453623450017045 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><table class="acymailing_table">
	<tr>
		<td class="acykey">
			<label for="fbleads_token"><?php echo acymailing_tooltip(acymailing_translation('ACY_FBLEADS_TOKEN_DESC'), acymailing_translation('ACY_FBLEADS_TOKEN'), '', acymailing_translation('ACY_FBLEADS_TOKEN')); ?></label>
		</td>
		<td>
			<input type="text" style="width:160px" name="fbleads_token" id="fbleads_token" value="<?php echo $this->escape($this->config->get('fbleads_token')); ?>"/>
		</td>
	</tr>
	<tr>
		<td class="acykey">
			<label for="fbleads_adid"><?php echo acymailing_tooltip(acymailing_translation('ACY_FBLEADS_AD_FORM_ID_DESC'), 'Ad ID', '', 'Ad ID'); ?></label>
		</td>
		<td>
			<input type="text" style="width:160px" name="fbleads_adid" id="fbleads_adid" value="<?php echo $this->escape($this->config->get('fbleads_adid')); ?>"/>
		</td>
	</tr>
	<tr>
		<td class="acykey">
			<label for="fbleads_formid"><?php echo acymailing_tooltip(acymailing_translation('ACY_FBLEADS_AD_FORM_ID_DESC'), 'Form ID', '', 'Form ID'); ?></label>
		</td>
		<td>
			<input type="text" style="width:160px" name="fbleads_formid" id="fbleads_formid" value="<?php echo $this->escape($this->config->get('fbleads_formid')); ?>"/>
		</td>
	</tr>
	<tr>
		<td class="acykey">
			<label for="fbleads_mincreated"><?php echo acymailing_translation('ACY_FBLEADS_MINCREATED'); ?></label>
		</td>
		<td>
			<?php echo acymailing_calendar($this->config->get('fbleads_mincreated'), 'fbleads_mincreated', 'fbleads_mincreated', '%Y-%m-%d', array('style' => 'width:100px')); ?>
		</td>
	</tr>
	<tr>
		<td class="acykey">
			<label for="fbleads_maxcreated"><?php echo acymailing_translation('ACY_FBLEADS_MAXCREATED'); ?></label>
		</td>
		<td>
			<?php echo acymailing_calendar($this->config->get('fbleads_maxcreated'), 'fbleads_maxcreated', 'fbleads_maxcreated', '%Y-%m-%d', array('style' => 'width:100px')); ?>
		</td>
	</tr>
	<tr>
		<td class="acykey">
			<label for="fbleads_email"><?php echo acymailing_translation('EMAILCAPTION'); ?></label>
		</td>
		<td>
			<input type="text" style="width:160px" placeholder="email" name="fbleads_email" id="fbleads_email" value="<?php echo $this->escape($this->config->get('fbleads_email', 'email')); ?>"/>
		</td>
	</tr>
	<tr>
		<td class="acykey">
			<label for="fbleads_name"><?php echo acymailing_translation('NAMECAPTION'); ?></label>
		</td>
		<td>
			<input type="text" style="width:160px" placeholder="full_name" name="fbleads_name" id="fbleads_name" value="<?php echo $this->escape($this->config->get('fbleads_name', 'full_name')); ?>"/>
		</td>
	</tr>
</table>
components/com_acymailing/views/data/tmpl/ajaxencoding.php000060400000015066152453623450020106 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><span class="acyblocktitle"><?php echo acymailing_translation('ACY_MATCH_DATA'); ?></span>
<?php
$config = acymailing_config();
$encodingHelper = acymailing_get('helper.encoding');
$filename = strtolower(acymailing_getVar('cmd', 'filename'));
$encoding = acymailing_getVar('cmd', 'encoding');

$extension = '.'.acymailing_fileGetExt($filename);
$uploadPath = ACYMAILING_MEDIA.'import'.DS.str_replace(array('.', ' '), '_', substr($filename, 0, strpos($filename, $extension))).$extension;

if(!file_exists($uploadPath)){
	acymailing_display(acymailing_translation_sprintf('FAIL_OPEN', '<b><i>'.htmlspecialchars($uploadPath, ENT_COMPAT, 'UTF-8').'</i></b>'), 'error');
	return;
}
$this->config = acymailing_config();
$this->content = file_get_contents($uploadPath);
if(empty($encoding)){
	$encoding = $encodingHelper->detectEncoding($this->content);
}
$content = $encodingHelper->change($this->content, $encoding, 'UTF-8');

$content = str_replace(array("\r\n", "\r"), "\n", $content);
$this->lines = explode("\n", $content);

$this->separator = ',';
$listSeparators = array("\t", ';', ',');
foreach($listSeparators as $sep){
	if(strpos($this->lines[0], $sep) !== false){
		$this->separator = $sep;
		break;
	}
}

$nbPreviewLines = 0;
$i = 0;

while(isset($this->lines[$i])){
	if(empty($this->lines[$i])){
		unset($this->lines[$i]);
		continue;
	}else $nbPreviewLines++;

	if(strpos($this->lines[$i], '"') !== false){
		$j = $i + 1;
		$position = -1;

		while($j < ($i + 30)){
			$quoteOpened = substr($this->lines[$i], $position + 1, 1) == '"';

			if($quoteOpened){
				$nextQuotePosition = strpos($this->lines[$i], '"', $position + 2);
				if($nextQuotePosition === false){
					if(!isset($this->lines[$j])) break;

					$this->lines[$i] .= "\n".rtrim($this->lines[$j], $this->separator);
					unset($this->lines[$j]);
					$j++;
					continue;
				}else{
					$quoteOpened = false;

					if(strlen($this->lines[$i]) - 1 == $nextQuotePosition){
						break;
					}

					$position = $nextQuotePosition + 1;
				}
			}else{
				$nextSeparatorPosition = strpos($this->lines[$i], $this->separator, $position + 1);
				if($nextSeparatorPosition === false){
					break;
				}else{ // If found the next separator, add the value in $data and change the position
					$position = $nextSeparatorPosition;
				}
			}
		}

		$this->lines = array_merge($this->lines);
	}

	if($nbPreviewLines == 10) break;

	if($nbPreviewLines != 1){
		$i++;
		continue;
	}

	if(strpos($this->lines[$i], '@')){
		$noHeader = 1;
	}else $noHeader = 0;

	$columnNames = explode($this->separator, $this->lines[$i]);
	$nbColumns = count($columnNames);
	if(!empty($i)) unset($this->lines[$i]);
	ksort($this->lines);
}
$this->lines = array_values($this->lines);
$nbLines = count($this->lines);

?>
<table <?php echo acymailing_isAdmin() ? 'class="acymailing_table"' : 'class="adminlist"'; ?> cellspacing="10" cellpadding="10" align="center" id="importdata">
	<?php
	if($noHeader || !isset($this->lines[1])){
		$firstValueLine = $columnNames;
	}else{
		$firstValueLine = explode($this->separator, $this->lines[1]);
		foreach($firstValueLine as &$oneValue){
			$oneValue = trim($oneValue, '\'" ');
		}
	}

	$fieldAssignment = array();
	$fieldAssignment[] = acymailing_selectOption("0", '- - -');
	$fieldAssignment[] = acymailing_selectOption("1", acymailing_translation('ACY_IGNORE'));
	if(acymailing_isAllowed($this->config->get('acl_extra_fields_import', 'all'))){
		$createField = acymailing_selectOption("2", acymailing_translation('ACY_CREATE_FIELD'));
		if(!acymailing_level(3)){
			$createField->disable = true;
			$createField->text .= ' ('.acymailing_translation('ONLY_FROM_ENTERPRISE').')';
		}
		$fieldAssignment[] = $createField;
	}
	$separator = acymailing_selectOption("3", '-------------------------------------');
	$separator->disable = true;
	$fieldAssignment[] = $separator;

	$fields = array_keys(acymailing_getColumns('#__acymailing_subscriber'));
	$fields[] = 'listids';
	$fields[] = 'listname';

	foreach($fields as $oneField){
		$fieldAssignment[] = acymailing_selectOption($oneField, $oneField);
	}

	$fields[] = '1';

	echo '<tr class="row0"><td align="center" valign="top"><strong>'.acymailing_tooltip(acymailing_translation('ACY_ASSIGN_COLUMNS_DESC'), null, null, acymailing_translation('ACY_ASSIGN_COLUMNS')).'</strong>'.($nbColumns > 5 ? '<br/><a style="text-decoration:none;" href="#" onclick="ignoreAllOthers();">'.acymailing_translation('ACY_IGNORE_UNASSIGNED').'</a>' : '').'</td>';

	$alreadyFound = array();
	foreach($columnNames as $key => &$oneColumn){
		$oneColumn = strtolower(trim($oneColumn, '\'" '));
		$customValue = '';
		$default = acymailing_getVar('cmd', 'fieldAssignment'.$key);
		if(empty($default) && $default !== 0){
			$default = (in_array($oneColumn, $fields) ? $oneColumn : '0');

			if(!$default && !empty($firstValueLine)){
				if(isset($firstValueLine[$key]) && strpos($firstValueLine[$key], '@')){
					$default = 'email';
				}elseif($nbColumns == 2) $default = 'name';
			}
			if(in_array($default, $alreadyFound)) $default = '0';
			$alreadyFound[] = $default;
		}elseif($default == 2){
			$customValue = acymailing_getVar('cmd', 'newcustom'.$key);
		}

		echo '<td align="center" valign="top">'.acymailing_select($fieldAssignment, 'fieldAssignment'.$key, 'size="1" onchange="checkNewCustom('.$key.')" style="width:180px;"', 'value', 'text', $default).'<br />';

		echo '<input style="width:170px;'.(empty($customValue) ? 'display:none;"' : '" value="'.$customValue.'" required').' type="text" id="newcustom'.$key.'" name="newcustom" placeholder="'.acymailing_translation('FIELD_COLUMN').'..."/></td>';
	}
	echo '</tr>';

	if(!$noHeader){
		foreach($columnNames as &$oneColumn){
			$oneColumn = htmlspecialchars($oneColumn, ENT_COMPAT | ENT_IGNORE, 'UTF-8');
		}
		echo '<tr class="row1"><td align="center"><strong>'.acymailing_translation('ACY_IGNORE_LINE').'</strong></td><td align="center">['.implode(']</td><td align="center">[', $columnNames).']</td></tr>';
	}

	for($i = 1 - $noHeader; $i < 11 - $noHeader && $i < $nbLines; $i++){
		$values = explode($this->separator, $this->lines[$i]);

		foreach($values as &$oneValue){
			$oneValue = htmlspecialchars(trim($oneValue, '\'" '), ENT_COMPAT | ENT_IGNORE, 'UTF-8');
		}
		echo '<tr class="row'.(1 - $i % 2).'"><td align="center"><strong>'.($i + $noHeader).'</strong></td><td align="center">'.implode('</td><td align="center">', $values).'</td></tr>';
	}
	?>
</table>
components/com_acymailing/views/data/tmpl/ldap.php000060400000011003152453623450016357 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
if(!function_exists('ldap_connect')){
	acymailing_display('LDAP Extension not loaded on your server.<br />Please enable the LDAP php extension.', 'warning');
	return;
}

$js = 'function updateldap(){
		document.getElementById("ldap_fields").innerHTML = "<span class=\"onload\"></span>";
		queryString = "'.acymailing_prepareAjaxURL('data').'&task=ajaxload&importfrom=ldap";
		queryString += "&ldap_host="+document.getElementById("ldap_host").value;
		queryString += "&ldap_port="+document.getElementById("ldap_port").value;
		queryString += "&ldap_basedn="+document.getElementById("ldap_basedn").value;
		queryString += "&ldap_username="+document.getElementById("ldap_username").value;
		queryString += "&ldap_password="+document.getElementById("ldap_password").value;

		var xhr = new XMLHttpRequest();
		xhr.open("GET", queryString);
		xhr.onload = function(){
			document.getElementById("ldap_fields").innerHTML = xhr.responseText;
		}
		xhr.send();
	}';
acymailing_addScript(true, $js);
?>
<div class="onelineblockoptions">
	<span class="acyblocktitle"><?php echo acymailing_translation('ACY_CONFIGURATION'); ?></span>
	<table <?php echo $this->isAdmin ? 'class="acymailing_table"' : 'class="admintable table" cellspacing="1"' ?>>
		<?php if($this->config->get('require_confirmation')){ ?>
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation('IMPORT_CONFIRMED'); ?>
				</td>
				<td>
					<?php echo acymailing_boolean("ldap_import_confirm", '', $this->config->get('ldap_import_confirm', 1), acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO')); ?>
				</td>
			</tr>
		<?php } ?>
		<tr>
			<td class="acykey">
				<?php echo acymailing_translation('GENERATE_NAME'); ?>
			</td>
			<td>
				<?php echo acymailing_boolean("ldap_generatename", '', $this->config->get('ldap_generatename', 1), acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO')); ?>
			</td>
		</tr>
		<tr>
			<td class="acykey">
				<?php echo acymailing_translation('OVERWRITE_EXISTING'); ?>
			</td>
			<td>
				<?php echo acymailing_boolean("ldap_overwriteexisting", '', $this->config->get('ldap_overwriteexisting', 0), acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO')); ?>
			</td>
		</tr>
		<tr>
			<td class="acykey">
				<?php echo 'Delete AcyMailing user if it does not exists in LDAP'; ?>
			</td>
			<td>
				<?php echo acymailing_boolean("ldap_deletenotexists", '', $this->config->get('ldap_deletenotexists', 0), acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO')); ?>
			</td>
		</tr>
	</table>
</div>

<div class="onelineblockoptions">
	<span class="acyblocktitle" style="margin-top: 20px;">Server</span>
	<table <?php echo $this->isAdmin ? 'class="acymailing_table"' : 'class="admintable table" cellspacing="1"' ?>>
		<tr>
			<td class="acykey">
				<label for="ldap_host">Host</label>
			</td>
			<td>
				<input onchange="updateldap();" type="text" style="width:160px" name="ldap_host" id="ldap_host" value="<?php echo $this->escape($this->config->get('ldap_host')); ?>"/>
			</td>
		</tr>
		<tr>
			<td class="acykey">
				<label for="ldap_port">Port</label>
			</td>
			<td>
				<input onchange="updateldap();" type="text" style="width:50px" name="ldap_port" id="ldap_port" value="<?php echo $this->escape($this->config->get('ldap_port')); ?>"/>
			</td>
		</tr>
		<tr>
			<td class="acykey">
				<label for="ldap_username">RDN</label>
			</td>
			<td>
				<input onchange="updateldap();" type="text" style="width:160px" name="ldap_username" id="ldap_username" value="<?php echo $this->escape($this->config->get('ldap_username')); ?>"/>
			</td>
		</tr>
		<tr>
			<td class="acykey">
				<label for="ldap_password"><?php echo acymailing_translation('SMTP_PASSWORD'); ?></label>
			</td>
			<td>
				<input onchange="updateldap();" type="password" style="width:160px" name="ldap_password" id="ldap_password" value="<?php echo $this->escape($this->config->get('ldap_password')); ?>"/>
			</td>
		</tr>
		<tr>
			<td class="acykey">
				<label for="ldap_basedn">Base DN</label>
			</td>
			<td>
				<input onchange="updateldap();" type="text" style="width:200px" name="ldap_basedn" id="ldap_basedn" value="<?php echo $this->escape($this->config->get('ldap_basedn')); ?>"/>
			</td>
		</tr>
	</table>
</div>
<div id="ldap_fields"></div>
components/com_acymailing/views/data/tmpl/sobipro.php000060400000004740152453623450017126 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
	$config = acymailing_config();
	$sobiproInfo = unserialize($config->get('sobipro_import'));

	$query='SELECT a.fid, a.nid, fieldType, section, b.name, filter FROM #__sobipro_field as a JOIN #__sobipro_object as b ON a.section = b.id  WHERE (fieldType = "inbox" AND ( filter = "title" OR filter = "0" OR filter = "")) OR (fieldType = "inbox" AND filter = "email") ORDER BY `section`';
	$nidResult = acymailing_loadObjectList($query);

	$section = array();

	foreach($nidResult as $oneResult){
		if(!isset($section[$oneResult->section])) {
			$section[$oneResult->section] = array();
			$section[$oneResult->section]['sectionName'] = $oneResult->name;
			$section[$oneResult->section]['sectionID'] = $oneResult->section;
			$section[$oneResult->section]['email'] = array(acymailing_selectOption('', '- - -'));
			$section[$oneResult->section]['name'] = array(acymailing_selectOption('', '- - -'));
		}
		if(($oneResult->fieldType=='inbox' && $oneResult->filter=='email')){
			$section[$oneResult->section]['email'][] = acymailing_selectOption($oneResult->fid, $oneResult->nid);
		}
		if(($oneResult->fieldType == 'inbox' && (($oneResult->filter == "title") || ($oneResult->filter == "0") || ($oneResult->filter == "")))){
			$section[$oneResult->section]['name'][] = acymailing_selectOption($oneResult->fid, $oneResult->nid);
		}
	}
	?>
	<table>
	<thead>
	<tr>
		<th><?php echo acymailing_translation('TAG_CATEGORIES');?></th><th><?php echo acymailing_translation('JOOMEXT_EMAIL'); ?></th><th><?php echo acymailing_translation('JOOMEXT_NAME'); ?></th>
	</tr>
	</thead>
	<tbody>
	<?php
	foreach($section as $oneSection){
	?>
		<tr>
			<td><?php echo $oneSection['sectionName']; ?></td>
			<td><?php echo acymailing_select($oneSection['email'], 'config['.$oneSection['sectionID'].'][sobiEmail]' , 'size="1"', 'value', 'text', isset($sobiproInfo[$oneSection['sectionID']]['sobiEmail']) ? $sobiproInfo[$oneSection['sectionID']]['sobiEmail'] : ''); ?></td>
			<td><?php echo acymailing_select($oneSection['name'], 'config['.$oneSection['sectionID'].'][sobiName]' , 'size="1"', 'value', 'text', isset($sobiproInfo[$oneSection['sectionID']]['sobiName']) ? $sobiproInfo[$oneSection['sectionID']]['sobiName'] : '' ); ?></td>
		</tr>
	<?php
	}
	?>
	</tbody>
	</table>
components/com_acymailing/views/data/tmpl/nspro.php000060400000002123152453623450016603 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
$resultUsers = acymailing_loadResult('SELECT count(id) FROM '.acymailing_table('nspro_subs', false));
$resultLists = acymailing_loadResult('SELECT count(id) FROM '.acymailing_table('nspro_lists', false));
?>

<table <?php echo $this->isAdmin ? 'class="acymailing_table"' : 'class="admintable table" cellspacing="1"' ?>>
	<tr>
		<td colspan="2">
			<?php echo acymailing_translation_sprintf('USERS_IN_COMP', $resultUsers, 'NS Pro'); ?>
			<br/>
			<?php echo acymailing_translation_sprintf('LISTS_IN_COMP', $resultLists, 'NS Pro'); ?>
			<br/>
			<?php echo acymailing_translation_sprintf('IMPORT_X_LISTS', $resultLists); ?>
		</td>
	</tr>
	<tr>
		<td class="acykey">
			<?php echo acymailing_translation_sprintf('IMPORT_LIST_TOO', 'NS Pro'); ?>
		</td>
		<td>
			<?php echo acymailing_boolean("nspro_lists"); ?>
		</td>
	</tr>
</table>
components/com_acymailing/views/data/tmpl/genericimport.php000060400000021255152453623450020320 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<div id="iframedoc"></div>
	<form action="<?php echo acymailing_completeLink(acymailing_getVar('cmd', 'ctrl')); ?>" method="post" name="adminForm" enctype="multipart/form-data" id="adminForm">
		<input type="hidden" name="import_type" id="import_type" value="<?php echo $this->type; ?>"/>
		<input type="hidden" name="filename" id="filename" value="<?php echo acymailing_getVar('cmd', 'filename'); ?>"/>
		<input type="hidden" name="import_columns" id="import_columns" value=""/>
		<input type="hidden" name="createlist" id="createlist" value="<?php echo acymailing_getVar('string', 'createlist'); ?>"/>
		<?php
		$checkedLists = acymailing_getVar('array', 'importlists', array(), '');
		foreach($checkedLists as $key => $oneList){
			echo '<input type="hidden" name="importlists['.intval($key).']" id="importlists'.intval($key).'-'.intval($oneList).'" value="'.intval($oneList).'"/>';
		}

		if(!empty($this->Itemid)) echo '<input type="hidden" name="Itemid" value="'.$this->Itemid.'" />';
		acymailing_formOptions(); ?>

		<div class="onelineblockoptions" id="matchdata">
			<?php include_once(ACYMAILING_BACK.'views'.DS.'data'.DS.'tmpl'.DS.'ajaxencoding.php'); ?>
			<div class="loading" align="center"><?php echo acymailing_translation_sprintf('ACY_FIRST_LINES', ($nbLines < 11 - $noHeader ? ($nbLines - 1 + $noHeader) : 10)); ?></div>
		</div>

		<div class="onelineblockoptions">
			<span class="acyblocktitle">Parameters</span>
			<table class="acymailing_table" cellspacing="1">
				<tr id="trfilecharset">
					<td class="acykey">
						<?php echo acymailing_translation('CHARSET_FILE'); ?>
					</td>
					<td>
						<?php
						$charsetType = acymailing_get('type.charset');
						$charsetType->addinfo = 'onchange="changeCharset();"';
						$this->type = empty($this->type) ? '' : $this->type;
						if($this->type == 'textarea'){
							$default = 'UTF-8';
						}elseif($this->type == 'file'){
							$default = $encodingHelper->detectEncoding($this->content);
						}
						echo $charsetType->display('charsetconvert', $default);
						?>
						<span id="loadingEncoding"></span>
					</td>
				</tr>
				<?php if($this->config->get('require_confirmation')){ ?>
					<tr id="trfileconfirm">
						<td class="acykey">
							<?php echo acymailing_translation('IMPORT_CONFIRMED'); ?>
						</td>
						<td>
							<?php echo acymailing_boolean("import_confirmed", '', in_array('import_confirmed', $this->selectedParams) ? 1 : 0, acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO')); ?>
						</td>
					</tr>
				<?php } ?>
				<tr id="trfilegenerate">
					<td class="acykey">
						<?php echo acymailing_translation('GENERATE_NAME'); ?>
					</td>
					<td>
						<?php echo acymailing_boolean("generatename", '', in_array('generatename', $this->selectedParams) ? 1 : 0, acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO')); ?>
					</td>
				</tr>
				<tr id="trfileblock">
					<td class="acykey">
						<?php echo acymailing_translation('IMPORT_BLOCKED'); ?>
					</td>
					<td>
						<?php echo acymailing_boolean("importblocked", '', in_array('importblocked', $this->selectedParams) ? 1 : 0, acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO')); ?>
					</td>
				</tr>
				<tr id="trfileoverwrite">
					<td class="acykey">
						<?php echo acymailing_translation('OVERWRITE_EXISTING'); ?>
					</td>
					<td>
						<?php echo acymailing_boolean("overwriteexisting", '', in_array('overwriteexisting', $this->selectedParams) ? 1 : 0, acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO')); ?>
					</td>
				</tr>
			</table>
		</div>
		<div class="onelineblockoptions">
			<span class="acyblocktitle"><?php echo acymailing_translation('SUBSCRIPTION'); ?></span>
			<table class="acymailing_table" cellspacing="1">
				<tr id="trsumup">
					<td>
						<?php
						echo acymailing_translation('ACY_IMPORT_LISTS').' : '.(empty($this->lists) ? acymailing_translation('ACY_NONE') : htmlspecialchars($this->lists, ENT_COMPAT, 'UTF-8'));
						echo '<br />'.acymailing_translation('ACY_IMPORT_UNSUB_LISTS').' : '.(empty($this->unsublists) ? acymailing_translation('ACY_NONE') : htmlspecialchars($this->unsublists, ENT_COMPAT, 'UTF-8'));
						?>
					</td>
				</tr>
			</table>
		</div>
	</form>
	<script language="javascript" type="text/javascript">
		<!--
		document.addEventListener("DOMContentLoaded", function(){
			acymailing.submitbutton = function(pressbutton){
				if(pressbutton == 'finalizeimport'){
					var subval = true;
					var errors = "";
					var string = "";
					var emailField = false;
					var columns = "";
					var selectedFields = Array();
					var fieldNb = <?php echo $nbColumns; ?>;
					if(isNaN(fieldNb)) fieldNb = 1;

					for(var i = 0; i < fieldNb; i++){
						if(document.getElementById("newcustom" + i).required){
							string = document.getElementById("newcustom" + i).value;
							if(string == ""){
								subval = false;
								errors += "\nNew custom field's name (column " + (i + 1) + ")";
							}else{
								if(!string.match(/^[A-Za-z][A-Za-z0-9_]+$/)){
									subval = false;
									errors += "\nPlease enter a valid field name for the column n°" + (i + 1) + ": spaces, uppercase and special characters are not allowed";
								}else{
									if(string != 1 && selectedFields.indexOf(string) != -1){
										subval = false;
										errors += "\nDuplicate field \"" + string + "\" for the column n°" + (i + 1);
									}else{
										if(string != 0){
											selectedFields.push(string);
										}
									}
									columns += "," + string;
								}
							}
						}else{
							string = document.getElementById("fieldAssignment" + i).value;
							if(string == 0){
								subval = false;
								errors += "\nAssign the column " + (i + 1) + " to a field";
							}

							if(string == 'email'){
								emailField = true;
							}

							if(string != 1 && selectedFields.indexOf(string) != -1){
								subval = false;
								errors += "\nDuplicate field \"" + string + "\" for the column " + (i + 1);
							}else{
								selectedFields.push(string);
							}

							columns += "," + string;
						}
					}

					if(!emailField){
						subval = false;
						errors += "\nPlease assign a column for the e-mail field";
					}

					if(subval == false){
						alert("<?php echo acymailing_translation('FILL_ALL'); ?>:\n" + errors);
						return false;
					}

					if(columns.substr(0, 1) == ","){
						columns = columns.substring(1);
					}

					document.getElementById("import_columns").value = columns;
				}

				acymailing.submitform(pressbutton, document.adminForm);
			}
		});

		function checkNewCustom(key){
			if(document.getElementById("fieldAssignment" + key).value == 2){
				document.getElementById("newcustom" + key).style.display = "";
				document.getElementById("newcustom" + key).required = true;
			}else{
				document.getElementById("newcustom" + key).style.display = "none";
				document.getElementById("newcustom" + key).required = false;
			}
		}

		function changeCharset(){
			var URL = "<?php echo acymailing_prepareAjaxURL((acymailing_isAdmin() ? 'front' : '').'data'); ?>&encoding=" + document.getElementById("charsetconvert").value + "&task=ajaxencoding&filename=<?php echo urlencode($filename); ?>";
			var selectedDropdowns = "";
			var fieldNb = <?php echo $nbColumns; ?>;
			if(isNaN(fieldNb)) fieldNb = 1;

			for(var i = 0; i < fieldNb; i++){
				selectedDropdowns += "&fieldAssignment" + i + "=" + document.getElementById("fieldAssignment" + i).value;
				if(document.getElementById("newcustom" + i).required){
					selectedDropdowns += "&newcustom" + i + "=" + document.getElementById("newcustom" + i).value;
				}
			}

			URL += selectedDropdowns;


			document.getElementById("loadingEncoding").innerHTML = '<span class=\"onload\"></span>';
			document.getElementById("importdata").style.opacity = "0.5";
			document.getElementById("importdata").style.filter = 'alpha(opacity=50)';

			var xhr = new XMLHttpRequest();
			xhr.open("GET", URL);
			xhr.onload = function(){
				document.getElementById("matchdata").innerHTML = xhr.responseText;
				document.getElementById("loadingEncoding").innerHTML = '';
			}
			xhr.send();
		}

		function ignoreAllOthers(){
			var fieldNb = document.adminForm.newcustom.length;
			if(isNaN(fieldNb)) fieldNb = 1;

			for(var i = 0; i < fieldNb; i++){
				if(document.getElementById("fieldAssignment" + i).value == 0){
					document.getElementById("fieldAssignment" + i).value = 1;
				}
			}
		}
		-->
	</script>
</div>
components/com_acymailing/views/file/index.html000060400000000054152453623450015761 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/file/view.html.php000060400000015004152453623450016413 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php


class FileViewFile extends acymailingView{
	
	function display($tpl = null){
		acymailing_addStyle(false, ACYMAILING_CSS.'frontendedition.css?v='.filemtime(ACYMAILING_MEDIA.'css'.DS.'frontendedition.css'));

		acymailing_setNoTemplate();

		$function = $this->getLayout();
		if(method_exists($this, $function)) $this->$function();

		parent::display($tpl);
	}

	function css(){
		$file = acymailing_getVar('cmd', 'file');
		if(!preg_match('#^([-A-Z0-9]*)_([-_A-Z0-9]*)$#i', $file, $result)){
			acymailing_display('Could not load the file '.$file.' properly');
			exit;
		}
		$type = $result[1];
		$fileName = $result[2];

		$content = acymailing_getVar('string', 'csscontent');
		if(empty($content) && file_exists(ACYMAILING_MEDIA.'css'.DS.$type.'_'.$fileName.'.css')) $content = file_get_contents(ACYMAILING_MEDIA.'css'.DS.$type.'_'.$fileName.'.css');

		if(strpos($fileName, 'default') !== false){
			$fileName = 'custom'.str_replace('default', '', $fileName);
			$i = 1;
			while(file_exists(ACYMAILING_MEDIA.'css'.DS.$type.'_'.$fileName.'.css')){
				$fileName = 'custom'.$i;
				$i++;
			}
		}

		if(acymailing_isNoTemplate()){
			$acyToolbar = acymailing_get('helper.toolbar');
			$acyToolbar->custom('savecss', acymailing_translation('ACY_SAVE'), 'save', false);
			$acyToolbar->setTitle($type.'_'.$fileName.'.css');
			$acyToolbar->topfixed = false;
			$acyToolbar->display();
		}

		$this->content = $content;
		$this->fileName = $fileName;
		$this->type = $type;
	}


	function language(){

		$this->setLayout('default');

		$code = acymailing_getVar('cmd', 'code');
		if(empty($code)){
			acymailing_display('Code not specified', 'error');
			return;
		}

		$file = new stdClass();
		$file->name = $code;
		$path = acymailing_getLanguagePath(ACYMAILING_ROOT, $code).DS.$code.'.com_acymailing.ini';
		$file->path = $path;

		
		$showLatest = true;
		$loadLatest = false;

		if(file_exists($path)){
			$file->content = acymailing_fileGetContent($path);
			if(empty($file->content)){
				acymailing_display('File not found : '.$path, 'error');
			}
		}else{
			$loadLatest = true;
			acymailing_enqueueMessage(acymailing_translation('LOAD_ENGLISH_1').'<br />'.acymailing_translation('LOAD_ENGLISH_2').'<br />'.acymailing_translation('LOAD_ENGLISH_3'), 'info');
			$file->content = acymailing_fileGetContent(acymailing_getLanguagePath(ACYMAILING_ROOT, ACYMAILING_DEFAULT_LANGUAGE).DS.ACYMAILING_DEFAULT_LANGUAGE.'.com_acymailing.ini');
		}

		$custompath = acymailing_getLanguagePath(ACYMAILING_ROOT, $code).DS.$code.'.com_acymailing_custom.ini';
		if(file_exists($custompath)){
			$file->customcontent = acymailing_fileGetContent($custompath);
		}

		if($loadLatest || acymailing_getVar('cmd', 'task') == 'latest'){
			if(file_exists(acymailing_getLanguagePath(ACYMAILING_ROOT, $code))){
				acymailing_addScript(false, ACYMAILING_UPDATEURL.'languageload&code='.acymailing_getVar('cmd', 'code'));
			}else{
				acymailing_enqueueMessage('The specified language "'.htmlspecialchars($code, ENT_COMPAT, 'UTF-8').'" is not installed on your site', 'warning');
			}
			$showLatest = false;
		}elseif(acymailing_getVar('cmd', 'task') == 'save'){
			$showLatest = false;
		}

		if(acymailing_isNoTemplate()){
			$acyToolbar = acymailing_get('helper.toolbar');
			$acyToolbar->save();
			$acyToolbar->custom('share', acymailing_translation('SHARE'), 'share', false);
			$acyToolbar->setTitle(acymailing_translation('ACY_FILE').' : '.$this->escape($file->name));
			$acyToolbar->topfixed = false;
			$acyToolbar->display();
		}

		$this->showLatest = $showLatest;
		$this->file = $file;
	}

	function share(){
		$file = new stdClass();
		$file->name = acymailing_getVar('cmd', 'code');

		$acyToolbar = acymailing_get('helper.toolbar');
		$acyToolbar->custom('share', acymailing_translation('SHARE'), 'share', false, "if(confirm('".acymailing_translation('CONFIRM_SHARE_TRANS', true)."')){ acymailing.submitbutton('send');} return false;");
		$acyToolbar->setTitle(acymailing_translation('SHARE').' : '.$this->escape($file->name));
		$acyToolbar->topfixed = false;
		$acyToolbar->display();

		$this->file = $file;
	}

	function select(){
		$config = acymailing_config();
		$uploadFolders = acymailing_getFilesFolder('upload', true);
		$uploadFolder = acymailing_getVar('string', 'currentFolder', $uploadFolders[0]);
		$uploadPath = acymailing_cleanPath(ACYMAILING_ROOT.trim(str_replace('/', DS, trim($uploadFolder)), DS));
		$map = acymailing_getVar('string', 'id');

		$uploadedFile = acymailing_getVar('array', 'uploadedFile', array(), 'files');
		if(!empty($uploadedFile) && !empty($uploadedFile['name'])){
			$uploaded = acymailing_importFile($uploadedFile, $uploadPath, in_array($map, array('thumb', 'readmore')));
			if($uploaded){
				$script = 'parent.document.getElementById("'.$map.'").value = "'.str_replace(DS, '/', $uploadFolder).'/'.$uploaded.'";';
				if(in_array($map, array('thumb', 'readmore'))){
					$script .= 'parent.document.getElementById("'.$map.'preview").src = "'.acymailing_rootURI().str_replace(DS, '/', $uploadFolder).'/'.$uploaded.'";';
				}else{
					$script .= 'parent.document.getElementById("'.$map.'selection").innerHTML = "'.$uploaded.'";';
					$script .= "parent.document.getElementById('".$map."suppr').style.display = 'inline';";
				}
				$script .= 'window.parent.acymailing.closeBox();';
				acymailing_addScript(true, $script);
			}
		}

		$fileToDelete = acymailing_getVar('string', 'filename', '');
		if(!empty($fileToDelete) && file_exists($uploadPath.DS.$fileToDelete) && empty($uploadedFile)){
			$checkAttach = acymailing_loadResultArray('SELECT mailid FROM #__acymailing_mail WHERE attach LIKE \'%"'.$uploadFolder.'/'.$fileToDelete.'"%\'');

			if(!empty($checkAttach)){
				acymailing_display(acymailing_translation_sprintf('ACY_CANT_DELETEFILE', implode($checkAttach, ', ')), 'error');
			}else{
				if(acymailing_deleteFile($uploadPath.DS.$fileToDelete)){
					acymailing_display(acymailing_translation('ACY_DELETED_FILE_SUCCESS'), 'success');
				}else{
					acymailing_display(acymailing_translation('ACY_DELETED_FILE_ERROR'), 'error');
				}
			}
		}

		$displayType = acymailing_getVar('string', 'displayType', 'icons');
		$this->config = $config;
		$this->uploadFolder = $uploadFolder;
		$this->uploadFolders = $uploadFolders;
		$this->uploadPath = $uploadPath;
		$this->map = $map;
		$this->displayType = $displayType;
	}
}
components/com_acymailing/views/file/tmpl/default.php000060400000003031152453623450017073 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<form action="<?php echo acymailing_completeLink('file', true); ?>" method="post" name="adminForm" id="adminForm" autocomplete="off">
		<div class="onelineblockoptions">
			<div class="acyblocktitle"><?php echo acymailing_translation('ACY_FILE').' : '.@$this->escape($this->file->name); ?>
				<?php if(!empty($this->showLatest)){ ?>
					<button type="button" class="acymailing_button" onclick="acymailing.submitbutton('latest')" style="margin-left: 15px !important;"> <?php echo acymailing_translation('LOAD_LATEST_LANGUAGE'); ?> <i class="acyicon-import" style="margin-left: 10px;"></i></button>
				<?php } ?>
			</div>
			<textarea style="width:660px;height:200px;" rows="18" name="content" id="translation"><?php echo @$this->file->content; ?></textarea>
		</div>

		<div class="onelineblockoptions">
			<div class="acyblocktitle"><?php echo acymailing_translation('CUSTOM_TRANS'); ?></div>
			<?php echo acymailing_translation('CUSTOM_TRANS_DESC'); ?>
			<textarea style="width:660px;height:50px;" rows="5" name="customcontent"><?php echo @$this->file->customcontent; ?></textarea>
		</div>

		<div class="clr"></div>
		<input type="hidden" name="code" value="<?php echo @$this->escape($this->file->name); ?>"/>
		<?php acymailing_formOptions(); ?>
	</form>
</div>
components/com_acymailing/views/file/tmpl/share.php000060400000001753152453623450016562 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<form action="<?php echo acymailing_completeLink('file', true); ?>" method="post" name="adminForm" id="adminForm" autocomplete="off">
		<div class="acyblockoptions">
			<?php acymailing_display(acymailing_translation('SHARE_CONFIRMATION_1').'<br />'.acymailing_translation('SHARE_CONFIRMATION_2').'<br />'.acymailing_translation('SHARE_CONFIRMATION_3'), 'info'); ?><br/>
			<textarea rows="8" name="mailbody" style="width:620px;height: 100px;">Hi Acyba team,
Here is a new version of the language file, I translated few more strings...</textarea>
		</div>
		<div class="clr"></div>

		<input type="hidden" name="code" value="<?php echo $this->file->name; ?>"/>
		<?php acymailing_formOptions(); ?>
	</form>
</div>
components/com_acymailing/views/file/tmpl/select.php000060400000023735152453623450016743 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="maincontent" style="border: 1px solid rgb(233, 233, 233);">
	<form action="<?php echo acymailing_completeLink('file', true); ?>" method="post" name="adminForm" id="adminForm" enctype="multipart/form-data" style="margin:0px;">
		<div id="folderarea" style="box-shadow: 0px 4px 4px -4px rgba(0, 0, 0, 0.3);padding:15px;">
			<button style="float: right;" class="btn" onclick="changeDisplay(event);" id="btn_change_display" title="<?php echo acymailing_translation('ACY_DISPLAY_NOICON'); ?>"><i id="iconTypeDisplay" class="acyicon-list_view"></i></button>
			<?php
			$folders = acymailing_generateArborescence($this->uploadFolders);
			$filetreeType = acymailing_get('type.filetree');
			$filetreeType->display($folders, $this->uploadFolder, 'currentFolder', 'changeFolder(path)');
			?>
		</div>
		<script type="text/javascript">
			var clickedDel = false;
			document.addEventListener("DOMContentLoaded", function(){
				display(document.getElementById('displayType').value);
			});
			function changeFolder(folderName){
				var url = window.location.href;
				if (url.indexOf('?') > -1){
					var lastParam = url.substring(url.lastIndexOf('&') + 1);
					if(url.indexOf('pictName') > -1){
						var temp = url.split('&');
						for(var i=0;i<temp.length;i++){
							if(temp[i].indexOf('pictName') > -1){
							temp.splice(i, 1);
								i--;
							}
						}
						url = temp.join('&');
						lastParam = url.substring(url.lastIndexOf('&') + 1);
					}
					if(lastParam == 'task=createFolder')url = url.replace(lastParam,'task=browse&e_name=ACY_NAME_AREA');
					lastParam = lastParam.split('=');
					if(lastParam=='selected_folder')
					url = url.replace(lastParam, 'selected_folder='+folderName);
					else

					url += '&currentFolder='+folderName;
				}else{
					url += '?currentFolder='+folderName;
				}
				window.location.href = url;
			}

			function changeDisplay(event){
				event.preventDefault();
				if(document.getElementById('displayPict').style.display == ''){
					display('list');
				}else{
					display('icons');
				}
			}
			function display(type){
				if(type == 'list'){
					document.getElementById('displayPict').style.display = 'none';
					document.getElementById('displayLine').style.display = '';
					document.getElementById('btn_change_display').title = '<?php echo acymailing_translation('ACY_DISPLAY_ICON'); ?>';
					document.getElementById('iconTypeDisplay').className = 'acyicon-image_view';
					document.getElementById('displayType').value = 'list';
				}else{
					document.getElementById('displayPict').style.display = '';
					document.getElementById('displayLine').style.display = 'none';
					document.getElementById('btn_change_display').title = '<?php echo acymailing_translation('ACY_DISPLAY_NOICON'); ?>';
					document.getElementById('iconTypeDisplay').className = 'acyicon-list_view';
					document.getElementById('displayType').value = 'icons';
				}
			}
			function diplayDeleteBtn(id, action){
				if(action == 'display'){
					document.getElementById('acy_attachment_delete_' + id + '').style.display = '';
				}else{
					document.getElementById('acy_attachment_delete_' + id + '').style.display = 'none';
				}
			}
			function confirmDeleteFile(event, fileName){
				event.preventDefault();
				clickedDel = true;
				var divText = document.getElementById('confirmTxtAttach');
				divText.innerHTML = '<?php echo acymailing_translation('ACY_VALIDDELETEITEMS'); ?>' + '<br /><span class="acy_folder_name">(' + fileName + ')</span><br />';
				var divDelete = document.getElementById('confirmOkAttach');
				divDelete.onclick = function(event){
					event.preventDefault();
					deleteFile(fileName);
				};

				var divConfirm = document.getElementById('confirmBoxAttach');
				divConfirm.style.display = 'inline';
			}
			function deleteFile(fileName){
				var urlFile = window.location.href;
				if(urlFile.lastIndexOf('#') == urlFile.length - 1){
					urlFile = urlFile.substr(0, urlFile.length - 1);
				}
				var lastParam = urlFile.substring(urlFile.lastIndexOf('&') + 1);
				if(lastParam.indexOf('filename=') > -1){
					urlFile = urlFile.substring(0, urlFile.indexOf('filename=') - 1);
				}
				if(urlFile.indexOf('?') > -1){
					window.location.href = urlFile + '&task=<?php echo acymailing_getVar('cmd', 'task', ''); ?>&id=<?php echo acymailing_getVar('cmd', 'id', ''); ?>&filename=' + fileName;
				}else{
					window.location.href = urlFile + '?task=<?php echo acymailing_getVar('cmd', 'task', ''); ?>&id=<?php echo acymailing_getVar('cmd', 'id', ''); ?>&filename=' + fileName;
				}
			}
		</script>
		<div id="filesarea" style="width:100%;height:460px;overflow-x: hidden;text-align: center;">
			<?php
			if(file_exists($this->uploadPath)) $files = acymailing_getFiles($this->uploadPath);
			$imageExtensions = array('jpg', 'jpeg', 'png', 'gif', 'ico', 'bmp');

			if(in_array($this->map, array('thumb', 'readmore'))){
				$allowedExtensions = $imageExtensions;
			}else{
				$allowedExtensions = explode(',', $this->config->get('allowedfiles'));
				$allowedExtensions = array_merge($allowedExtensions, $imageExtensions);
			}

			$displayList = '<div id="displayLine" style="display: none; text-align: left;">';
			echo '<div id="displayPict">';
			if(!empty($files)){
				$k = 0;
				$displayList .= '<table class="acymailing_smalltable">';
				foreach($files as $file){
					if(strrpos($file, '.') === false) continue;

					$ext = strtolower(substr($file, strrpos($file, '.') + 1));
					if(!in_array($ext, $allowedExtensions)) continue;

					$filesFound = true;

					echo '<div style="float: left; text-align: center; position: relative;">';

					$linkStart = '<a href="#" style="text-decoration:none;" onclick="if(clickedDel == false){';
					$linkStart .= "parent.document.getElementById('".$this->map."').value = '".str_replace(DS, '/', $this->uploadFolder)."/$file';";
					if(in_array($this->map, array('thumb', 'readmore'))){
						$linkStart .= "parent.document.getElementById('".$this->map."preview').src = '".acymailing_rootURI().str_replace(DS, '/', $this->uploadFolder)."/$file'; ";
					}else{
						$linkStart .= "parent.document.getElementById('".$this->map."selection').innerHTML = '$file'; ";
						$linkStart .= "parent.document.getElementById('".$this->map."suppr').style.display = 'inline';";
					}
					$linkStart .= 'window.parent.acymailing.closeBox();}">';

					echo $linkStart;

					$structPict = '<div onmouseover="diplayDeleteBtn('.$k.', \'display\');" onmouseout="diplayDeleteBtn('.$k.', \'hide\');">';
					$structPict .= '<div style="width: 160px;height: 160px;margin: 14px;border: 1px solid rgb(233, 233, 233);border-radius:4px;overflow: hidden;" onmouseover="this.style.opacity = 0.5;" onmouseout="this.style.opacity = 1;" title="'.$file.'">';
					if(strlen($file) > 20){
						$structPict .= '<span title="'.str_replace('"', '', $file).'">'.substr(rtrim($file, $ext), 0, 17).'...'.$ext.'</span>';
					}else{
						$structPict .= $file;
					}

					if(in_array($ext, $imageExtensions)){
						$imgPath = ACYMAILING_LIVE.$this->uploadFolder.'/'.$file;
					}else{
						$imgPath = ACYMAILING_LIVE.ACYMAILING_MEDIA_FOLDER.'/images/file.png';
					}
					$structPict .= '<br /><img src="'.$imgPath.'" style="margin-top:5px;max-width:150px;"/>';
					$structPict .= '</div>';
					$structPict .= '<img class="acy_attachment_delete" id="acy_attachment_delete_'.$k.'" src="'.ACYMAILING_LIVE.ACYMAILING_MEDIA_FOLDER.DS.'images'.DS.'editor'.DS.'delete.png" onclick="confirmDeleteFile(event, \''.$file.'\')" style="display: none;"/>';
					$structPict .= '</div>';

					echo $structPict;
					echo '</a></div>';


					$displayList .= '<tr><td width="30" style="padding-left: 10px;">'.$linkStart.'<img src="'.$imgPath.'" style="max-width:24px;"/></a></td>';
					$displayList .= '<td>'.$linkStart.$file.'</a></td>';
					$displayList .= '<td><img class="acy_attachment_delete" src="'.ACYMAILING_LIVE.ACYMAILING_MEDIA_FOLDER.DS.'images'.DS.'editor'.DS.'delete.png" onclick="confirmDeleteFile(event, \''.$file.'\')"/></td></tr>';
					$k++;
				}
				$displayList .= '</table>';
			}
			echo '</div>';
			$displayList .= '</div>';
			echo $displayList;

			if(empty($filesFound)) acymailing_display(acymailing_translation('NO_FILE_FOUND'), 'warning');
			?>
			<div class="confirmBoxAttach" id="confirmBoxAttach" style="display: none;">
				<div id="acy_popup_content">
					<span class="confirmTxtAttach" id="confirmTxtAttach"></span><br/>
					<button class="acymailing_button" id="confirmCancelAttach" onclick="event.preventDefault(); clickedDel=false;  document.getElementById('confirmBoxAttach').style.display='none';" style="padding: 6px 15px 6px 10px;">
						<i class="acyicon-cancel" style="margin-right: 5px; font-size: 16px;top: 2px; position: relative;"></i><?php echo acymailing_translation('ACY_CANCEL'); ?>
					</button>
					<button class="acymailing_button acymailing_button_delete" id="confirmOkAttach" style="padding: 8px 15px 6px 10px;">
						<i class="acyicon-delete" style="margin-right: 5px; font-size: 12px;"></i><?php echo acymailing_translation('ACY_DELETE'); ?>
					</button>
				</div>
			</div>
		</div>

		<div id="uploadarea" style="text-align: center;box-shadow: 0px -4px 4px -4px rgba(0, 0, 0, 0.3);padding: 10px 0px 10px 0px;">
			<input type="file" style="width:auto;" name="uploadedFile"/><br/>
			<input type="hidden" id="displayType" name="displayType" value="<?php echo $this->displayType; ?>"/>
			<input type="hidden" name="currentFolder" value="<?php echo htmlspecialchars($this->uploadFolder, ENT_COMPAT, 'UTF-8'); ?>"/>
			<input type="hidden" name="id" value="<?php echo htmlspecialchars($this->map, ENT_COMPAT, 'UTF-8'); ?>"/>
			<?php acymailing_formOptions(); ?>
			<button class="acymailing_button_grey" type="button" onclick="document.adminForm.task.value='select';submit();"> <?php echo acymailing_translation('IMPORT'); ?> </button>
		</div>
	</form>
</div>
components/com_acymailing/views/file/tmpl/index.html000060400000000054152453623450016735 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/file/tmpl/css.php000060400000001441152453623450016242 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<div id="iframedoc"></div>
	<form action="<?php echo acymailing_completeLink('file', true); ?>" method="post" name="adminForm" id="adminForm" autocomplete="off">
		<textarea style="width:98%;height:350px;" rows="20" name="csscontent"><?php echo $this->content; ?></textarea>

		<input type="hidden" name="file" value="<?php echo $this->type.'_'.$this->fileName; ?>"/>
		<input type="hidden" name="var" value="<?php echo acymailing_getVar('cmd', 'var'); ?>"/>
		<?php acymailing_formOptions(); ?>
	</form>
</div>
components/com_acymailing/views/stats/view.html.php000060400000074352152453623450016645 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php


class StatsViewStats extends acymailingView{

	var $searchFields = array('b.subject', 'b.alias', 'a.mailid');
	var $selectFields = array('b.subject', 'b.alias', 'b.type', 'a.*', 'a.bouncedetails');
	var $searchHistory = array('b.subject', 'c.email', 'c.name');
	var $historyFields = array('a.*', 'b.subject', 'c.email', 'c.name');
	var $detailSearchFields = array('b.subject', 'b.alias', 'a.mailid', 'c.name', 'c.email', 'a.subid');
	var $detailSelectFields = array('b.subject', 'b.alias', 'c.name', 'c.email', 'b.type', 'a.ip', 'a.*');


	function display($tpl = null){
		$function = $this->getLayout();
		if(method_exists($this, $function)) $this->$function();

		parent::display($tpl);
	}

	function unsubchart(){
		$mailid = acymailing_getVar('int', 'mailid');
		if(empty($mailid)) return;

		acymailing_addStyle(false, ACYMAILING_CSS.'acyprint.css?v='.filemtime(ACYMAILING_MEDIA.'css'.DS.'acyprint.css'), 'text/css', 'print');

		$entries = acymailing_loadObjectList('SELECT * FROM #__acymailing_history WHERE mailid = '.intval($mailid).' AND action="unsubscribed" LIMIT 10000');

		if(empty($entries)){
			acymailing_display("No data recorded for that Newsletter", 'warning');
			return;
		}

		$acyToolbar = acymailing_get('helper.toolbar');
		$acyToolbar->link(acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'stats&task=unsubchart&export=1&mailid='.acymailing_getVar('int', 'mailid'), true), acymailing_translation('ACY_EXPORT'), 'export');
		$acyToolbar->directPrint();
		$acyToolbar->setTitle(acymailing_translation('ACTION_UNSUBSCRIBED'));
		$acyToolbar->display();

		$unsubreasons = array();
		$unsubreasons['NO_REASON'] = 0;
		foreach($entries as $oneEntry){
			if(empty($oneEntry->data)){
				$unsubreasons['NO_REASON']++;
				continue;
			}

			$allReasons = explode("\n", $oneEntry->data);
			$added = false;
			foreach($allReasons as $oneReason){
				list($reason, $value) = explode('::', $oneReason);
				if(empty($value) || $reason != 'REASON') continue;
				$unsubreasons[$value] = @$unsubreasons[$value] + 1;
				$added = true;
			}
			if(!$added) $unsubreasons['NO_REASON']++;
		}

		$finalReasons = array();
		foreach($unsubreasons as $oneReason => $total){
			$name = $oneReason;
			if(preg_match('#^[A-Z_]*$#', $name)) $name = acymailing_translation($name);
			$finalReasons[$name] = $total;
		}

		arsort($finalReasons);

		acymailing_addScript(false, "https://www.google.com/jsapi");

		$this->unsubreasons = $finalReasons;

		if(acymailing_getVar('cmd', 'export')){
			$exportHelper = acymailing_get('helper.export');
			$exportHelper->exportOneData($finalReasons, 'unsub_'.acymailing_getVar('int', 'mailid'));
		}
	}

	function forward(){
		$this->unsubscribed();
	}

	function unsubscribed(){

		$pageInfo = new stdClass();
		$pageInfo->filter = new stdClass();
		$pageInfo->filter->order = new stdClass();
		$pageInfo->limit = new stdClass();
		$pageInfo->elements = new stdClass();

		$paramBase = ACYMAILING_COMPONENT.'.'.$this->getName().$this->getLayout();
		$pageInfo->filter->order->value = acymailing_getUserVar($paramBase.".filter_order", 'filter_order', 'a.date', 'cmd');
		$pageInfo->filter->order->dir = acymailing_getUserVar($paramBase.".filter_order_Dir", 'filter_order_Dir', 'desc', 'word');
		if(strtolower($pageInfo->filter->order->dir) !== 'desc') $pageInfo->filter->order->dir = 'asc';
		$pageInfo->search = acymailing_getUserVar($paramBase.".search", 'search', '', 'string');
		$pageInfo->search = strtolower(trim($pageInfo->search));
		$selectedMail = acymailing_getUserVar($paramBase."filter_mail", 'filter_mail', 0, 'int');
		$pageInfo->limit->value = acymailing_getUserVar($paramBase.'.list_limit', 'limit', acymailing_getCMSConfig('list_limit'), 'int');
		$pageInfo->limit->start = acymailing_getVar('int', 'start', acymailing_getUserVar($paramBase.'.limitstart', 'limitstart', 0, 'int'));

		$filters = array();
		$filters[] = "a.action = ".acymailing_escapeDB($this->getLayout());

		if(!empty($pageInfo->search)){
			$searchVal = '\'%'.acymailing_getEscaped($pageInfo->search).'%\'';
			$filters[] = implode(" LIKE $searchVal OR ", $this->searchHistory)." LIKE $searchVal";
		}

		if(!empty($selectedMail)){
			$filters[] = 'a.mailid = '.$selectedMail;
		}

		$query = 'SELECT '.implode(' , ', $this->historyFields).' FROM '.acymailing_table('history').' as a';
		$query .= ' JOIN '.acymailing_table('mail').' as b on a.mailid = b.mailid';
		$query .= ' JOIN '.acymailing_table('subscriber').' as c on a.subid = c.subid';
		$query .= ' WHERE ('.implode(') AND (', $filters).')';
		if(!empty($pageInfo->filter->order->value)) $query .= ' ORDER BY '.$pageInfo->filter->order->value.' '.$pageInfo->filter->order->dir;

		if(empty($pageInfo->limit->value)) $pageInfo->limit->value = 100;

		$rows = acymailing_loadObjectList($query, '', $pageInfo->limit->start, $pageInfo->limit->value);

		$queryCount = 'SELECT COUNT(*) FROM #__acymailing_history as a';
		if(!empty($pageInfo->search)){
			$queryCount .= ' JOIN '.acymailing_table('mail').' as b on a.mailid = b.mailid';
			$queryCount .= ' JOIN '.acymailing_table('subscriber').' as c on a.subid = c.subid';
		}
		$queryCount .= ' WHERE ('.implode(') AND (', $filters).')';
		
		$pageInfo->elements->total = acymailing_loadResult($queryCount);
		$pageInfo->elements->page = count($rows);

		$pagination = new acyPagination($pageInfo->elements->total, $pageInfo->limit->start, $pageInfo->limit->value);

		$query = 'SELECT DISTINCT a.mailid FROM `#__acymailing_history` as a WHERE a.action = '.acymailing_escapeDB($this->getLayout()).' AND a.mailid > 0';
		$allMailids = acymailing_loadResultArray($query);

		$emails = array();
		if(!empty($allMailids)){
			if(!empty($selectedMail) && !in_array($selectedMail, $allMailids)) array_unshift($allMailids, $selectedMail);
			$query = 'SELECT subject, mailid FROM `#__acymailing_mail` WHERE mailid IN ('.implode(',', $allMailids).') ORDER BY mailid DESC';
			$emails = acymailing_loadObjectList($query);
		}


		$newsletters = array();
		$newsletters[] = acymailing_selectOption('0', acymailing_translation('ALL_EMAILS'));
		foreach($emails as $oneMail){
			if(!empty($oneMail->subject)) $oneMail->subject = acyEmoji::Decode($oneMail->subject);
			$newsletters[] = acymailing_selectOption($oneMail->mailid, $oneMail->subject);
		}
		$filterMail = acymailing_select($newsletters, 'filter_mail', 'class="inputbox" size="1" onchange="document.adminForm.submit( );"', 'value', 'text', (int)$selectedMail);

		if(acymailing_isAdmin() && acymailing_isNoTemplate()){
			$acyToolbar = acymailing_get('helper.toolbar');
			if(!empty($rows)) $acyToolbar->custom('export'.ucfirst(acymailing_getVar('cmd', 'task')), acymailing_translation('ACY_EXPORT'), 'export', false, '');
			$acyToolbar->custom('', acymailing_translation('ACY_CANCEL'), 'cancel', false, 'location.href=\''.acymailing_completeLink('diagram&task=mailing&mailid='.acymailing_getVar('int', 'filter_mail'), true).'\';');
			$acyToolbar->setTitle(acymailing_translation($this->getLayout() == 'forward' ? 'FORWARDED' : 'UNSUBSCRIBECAPTION'));
			$acyToolbar->topfixed = false;
			$acyToolbar->display();
		}elseif(acymailing_isNoTemplate()){
			$filterMail = '<input type="hidden" value="'.acymailing_getVar('int', 'mailid').'" name="mailid" />';
			$filterMail .= '<input type="hidden" value="'.acymailing_getVar('int', 'filter_mail').'" name="filter_mail" />';
		}

		$this->filterMail = $filterMail;
		$this->rows = $rows;
		$this->pageInfo = $pageInfo;
		$this->pagination = $pagination;

		$this->setLayout('unsubscribed');
	}

	function detaillisting(){

		$pageInfo = new stdClass();
		$pageInfo->filter = new stdClass();
		$pageInfo->filter->order = new stdClass();
		$pageInfo->limit = new stdClass();
		$pageInfo->elements = new stdClass();
		$config = acymailing_config();

		$paramBase = ACYMAILING_COMPONENT.'.'.$this->getName().$this->getLayout();
		$pageInfo->filter->order->value = acymailing_getUserVar($paramBase.".filter_order", 'filter_order', 'a.senddate', 'cmd');
		$pageInfo->filter->order->dir = acymailing_getUserVar($paramBase.".filter_order_Dir", 'filter_order_Dir', 'desc', 'word');
		if(strtolower($pageInfo->filter->order->dir) !== 'desc') $pageInfo->filter->order->dir = 'asc';
		$pageInfo->search = acymailing_getUserVar($paramBase.".search", 'search', '', 'string');
		$pageInfo->search = strtolower(trim($pageInfo->search));
		$selectedMail = acymailing_getUserVar($paramBase."filter_mail", 'filter_mail', 0, 'int');
		$selectedStatus = acymailing_getUserVar($paramBase."filter_status", 'filter_status', 0, 'string');
		$selectedBounce = acymailing_getUserVar($paramBase."filter_bounce", 'filter_bounce', 0, 'string');

		$pageInfo->limit->value = acymailing_getUserVar($paramBase.'.list_limit', 'limit', acymailing_getCMSConfig('list_limit'), 'int');
		$pageInfo->limit->start = acymailing_getUserVar($paramBase.'.limitstart', 'limitstart', 0, 'int');

		$filters = array();
		if(!empty($pageInfo->search)){
			$searchVal = '\'%'.acymailing_getEscaped($pageInfo->search).'%\'';
			$filters[] = implode(" LIKE $searchVal OR ", $this->detailSearchFields)." LIKE $searchVal";
		}

		if(!empty($selectedMail)) $filters[] = 'a.mailid = '.$selectedMail;
		if(!empty($selectedStatus)){
			if($selectedStatus == 'bounce'){
				$filters[] = 'a.bounce > 0';
			}elseif($selectedStatus == 'open') $filters[] = 'a.open > 0';
			elseif($selectedStatus == 'notopen') $filters[] = 'a.open < 1';
			elseif($selectedStatus == 'failed') $filters[] = 'a.fail > 0';
		}
		if(!empty($selectedStatus) && $selectedStatus == 'bounce' && !empty($selectedBounce)) $filters[] = 'a.bouncerule='.acymailing_escapeDB($selectedBounce);

		$extrajoin = '';

		$query = 'SELECT '.implode(' , ', $this->detailSelectFields);
		$query .= ' FROM '.acymailing_table('userstats').' as a';
		$query .= ' JOIN '.acymailing_table('mail').' as b on a.mailid = b.mailid';
		$query .= ' JOIN '.acymailing_table('subscriber').' as c on a.subid = c.subid';
		$query .= $extrajoin;
		if(!empty($filters)) $query .= ' WHERE ('.implode(') AND (', $filters).')';
		if(!empty($pageInfo->filter->order->value)) $query .= ' ORDER BY '.$pageInfo->filter->order->value.' '.$pageInfo->filter->order->dir;

		if(empty($pageInfo->limit->value)) $pageInfo->limit->value = 100;

		$rows = acymailing_loadObjectList($query, '', $pageInfo->limit->start, $pageInfo->limit->value);

		if($rows === null){
			acymailing_display(substr(strip_tags(acymailing_getDBError()), 0, 200).'...', 'error');
			if(file_exists(ACYMAILING_BACK.'install.joomla.php')){
				include_once(ACYMAILING_BACK.'install.joomla.php');
				$installClass = new acymailingInstall();
				$installClass->fromVersion = '3.7.0';
				$installClass->update = true;
				$installClass->updateSQL();
			}
		}

		$queryCount = 'SELECT COUNT(a.subid) FROM #__acymailing_userstats as a';
		$queryCount .= ' JOIN '.acymailing_table('mail').' as b on a.mailid = b.mailid';
		if(!empty($pageInfo->search)){
			$queryCount .= ' JOIN '.acymailing_table('subscriber').' as c on a.subid = c.subid';
		}
		$queryCount .= $extrajoin;
		if(!empty($filters)) $queryCount .= ' WHERE ('.implode(') AND (', $filters).')';
		
		$pageInfo->elements->total = acymailing_loadResult($queryCount);
		$pageInfo->elements->page = count($rows);

		$pagination = new acyPagination($pageInfo->elements->total, $pageInfo->limit->start, $pageInfo->limit->value);

		$toggleClass = acymailing_get('helper.toggle');

		$maildetailstatstype = acymailing_get('type.detailstatsmail');
		$deliverstatus = acymailing_get('type.deliverstatus');
		$filtersType = new stdClass();
		if(!acymailing_isAdmin()){
			$filtersType->mail = '<input type="hidden" value="'.$selectedMail.'" name="filter_mail" />';
			$mailClass = acymailing_get('class.mail');
			$this->mailing = $mailClass->get($selectedMail);
		}else{
			$filtersType->mail = $maildetailstatstype->display('filter_mail', $selectedMail);
		}
		$filtersType->status = $deliverstatus->display('filter_status', $selectedStatus);

		$detailstatsbouncetype = acymailing_get('type.detailstatsbounce');
		if(!empty($selectedStatus) && $selectedStatus == 'bounce'){
			$filtersType->bounce = $detailstatsbouncetype->display('filter_bounce', $selectedBounce);
		}else $filtersType->bounce = '';

		if(acymailing_isAdmin()){
			$acyToolbar = acymailing_get('helper.toolbar');
			if(acymailing_isNoTemplate()){
				if(acymailing_isAllowed($config->get('acl_subscriber_export', 'all'))) $acyToolbar->custom('export', acymailing_translation('ACY_EXPORT'), 'export', false);
				$acyToolbar->custom('', acymailing_translation('ACY_CANCEL'), 'cancel', false, 'location.href=\''.acymailing_completeLink('diagram&task=mailing&mailid='.acymailing_getVar('int', 'filter_mail'), true).'\';');
				$acyToolbar->setTitle(acymailing_translation('DETAILED_STATISTICS'));
				$acyToolbar->topfixed = false;
			}else{
				if(acymailing_isAllowed($config->get('acl_subscriber_export', 'all'))){
					$acyToolbar->custom('export', acymailing_translation('ACY_EXPORT'), 'export', false);
				}
				$acyToolbar->link(acymailing_completeLink('stats'), acymailing_translation('GLOBAL_STATISTICS'), 'cancel');
				$acyToolbar->divider();
				$acyToolbar->help('statistics');
				$acyToolbar->setTitle(acymailing_translation('DETAILED_STATISTICS'), 'stats&task=detaillisting');
			}
			$acyToolbar->display();
		}
		
		if(acymailing_isNoTemplate()){
			$filtersType->mail = '<input type="hidden" value="'.acymailing_getVar('int', 'mailid').'" name="mailid" />';
			$filtersType->mail .= '<input type="hidden" value="'.acymailing_getVar('int', 'filter_mail').'" name="filter_mail" />';
		}

		$this->filters = $filtersType;
		$this->toggleClass = $toggleClass;
		$this->rows = $rows;
		$this->pageInfo = $pageInfo;
		$this->pagination = $pagination;
	}

	function listing(){
		$pageInfo = new stdClass();
		$pageInfo->filter = new stdClass();
		$pageInfo->filter->order = new stdClass();
		$pageInfo->limit = new stdClass();
		$pageInfo->elements = new stdClass();
		$config = acymailing_config();

		$paramBase = ACYMAILING_COMPONENT.'.'.$this->getName().$this->getLayout();
		$pageInfo->filter->order->value = acymailing_getUserVar($paramBase.".filter_order", 'filter_order', 'a.senddate', 'cmd');
		$pageInfo->filter->order->dir = acymailing_getUserVar($paramBase.".filter_order_Dir", 'filter_order_Dir', 'desc', 'word');
		if(strtolower($pageInfo->filter->order->dir) !== 'desc') $pageInfo->filter->order->dir = 'asc';
		$pageInfo->search = acymailing_getUserVar($paramBase.".search", 'search', '', 'string');
		$pageInfo->search = strtolower(trim($pageInfo->search));
		$selectedTags = acymailing_getUserVar($paramBase."filter_tags", 'filter_tags', array(), 'array');

		$pageInfo->limit->value = acymailing_getUserVar($paramBase.'.list_limit', 'limit', acymailing_getCMSConfig('list_limit'), 'int');
		$pageInfo->limit->start = acymailing_getUserVar($paramBase.'.limitstart', 'limitstart', 0, 'int');

		$filters = array();
		if(!empty($pageInfo->search)){
			$searchVal = '\'%'.acymailing_getEscaped($pageInfo->search, true).'%\'';
			$filters[] = implode(" LIKE $searchVal OR ", $this->searchFields)." LIKE $searchVal";
		}

		$listClass = acymailing_get('class.list');
		if(acymailing_isAdmin()) {
			$lists = $listClass->getLists();
		}else {
			$lists = $listClass->getFrontendLists();
		}
		$msgType = array();
		$msgType[] = acymailing_selectOption('0', acymailing_translation('ALL_EMAILS'));
		$msgType[] = acymailing_selectOption('<OPTGROUP>', acymailing_translation('NEWSLETTER'));
		if(acymailing_isAdmin()) $msgType[] = acymailing_selectOption('news', acymailing_translation('ALL_LISTS'));
		foreach($lists as $oneList){
			$msgType[] = acymailing_selectOption('list_'.$oneList->listid, $oneList->name);
		}
		$msgType[] = acymailing_selectOption('</OPTGROUP>');

		if(acymailing_isAdmin()) {
			$msgType[] = acymailing_selectOption('notification', acymailing_translation('NOTIFICATIONS'));
			if (acymailing_level(1)) {
				$msgType[] = acymailing_selectOption('autonews', acymailing_translation('AUTONEW'));
				$msgType[] = acymailing_selectOption('joomlanotification', acymailing_translation('JOOMLA_NOTIFICATIONS'));
			}
			if (acymailing_level(3)) {
				$listCampaign = acymailing_get('class.list');
				$listCampaign->type = 'campaign';
				$campaigns = $listCampaign->getLists();
				$msgType[] = acymailing_selectOption('<OPTGROUP>', acymailing_translation('FOLLOWUP'));
				$msgType[] = acymailing_selectOption('followup', acymailing_translation('ACY_ALL_CAMPAIGNS'));
				foreach ($campaigns as $oneCamp) {
					$msgType[] = acymailing_selectOption('camp_' . $oneCamp->listid, $oneCamp->name);
				}
				$msgType[] = acymailing_selectOption('</OPTGROUP>');
			}
			$msgType[] = acymailing_selectOption('welcome', acymailing_translation('MSG_WELCOME'));
			$msgType[] = acymailing_selectOption('unsub', acymailing_translation('MSG_UNSUB'));
			if (acymailing_level(3)) {
				$msgType[] = acymailing_selectOption('action', acymailing_translation('ACY_DISTRIBUTION'));
			}
		}

		$selectedMsgType = acymailing_getUserVar($paramBase."filter_msg", 'filter_msg', 0, 'string');
		$msgTypeChoice = acymailing_select($msgType, "filter_msg", 'class="inputbox" style="max-width: 200px;" onchange="document.adminForm.limitstart.value=0;document.adminForm.submit( );"', 'value', 'text', $selectedMsgType);
		$extraJoin = '';

		if(!empty($selectedMsgType)){
			$subfilter = substr($selectedMsgType, 0, 5);
			if($subfilter == 'camp_' || $subfilter == 'list_'){
				$filters[] = " b.type = '".($subfilter == 'camp_' ? 'followup' : 'news')."'";
				$filters[] = " lm.listid = ".substr($selectedMsgType, 5);
				$extraJoin .= " JOIN #__acymailing_listmail AS lm ON a.mailid = lm.mailid";
			}else{
				$filters[] = " b.type = '".$selectedMsgType."'";
			}
		}elseif (!acymailing_isAdmin()) {
			if (!empty($lists)) {
				$frontListsIds = array();
				foreach ($lists as $oneList) {
					$frontListsIds[] = $oneList->listid;
				}
				$extraJoin .= " JOIN #__acymailing_listmail AS lm ON a.mailid = lm.mailid";
				$filters[] = 'lm.listid IN (' . implode(',', $frontListsIds) . ')';
			}
		}

		if(!empty($selectedTags) && count($selectedTags) > 1){
			$tagCondition = array();
			foreach($selectedTags as $oneTag){
				if(strpos($oneTag, '|') === false) continue;
				$tag = explode('|', $oneTag);
				$tagCondition[] = intval($tag[0]);
			}
			$extraJoin .= ' JOIN #__acymailing_tagmail AS tm ON b.mailid = tm.mailid AND tagid IN ('.implode(',', $tagCondition).') ';
		}

		$query = 'SELECT '.implode(' , ', $this->selectFields);
		$query .= ', CASE WHEN (a.senthtml+a.senttext) <= a.bounceunique THEN 0 ELSE (a.openunique/(a.senthtml+a.senttext-a.bounceunique)) END AS openprct';
		$query .= ', CASE WHEN (a.senthtml+a.senttext) <= a.bounceunique THEN 0 ELSE (a.clickunique/(a.senthtml+a.senttext-a.bounceunique)) END AS clickprct';
		$query .= ', CASE WHEN a.openunique = 0 THEN 0 ELSE (a.clickunique/a.openunique) END AS efficiencyprct';
		$query .= ', CASE WHEN (a.senthtml+a.senttext) <= a.bounceunique THEN 0 ELSE (a.unsub/(a.senthtml+a.senttext-a.bounceunique)) END AS unsubprct';
		$query .= ', (a.senthtml+a.senttext) as totalsent';
		$query .= ', CASE WHEN (a.senthtml+a.senttext) = 0 THEN 0 ELSE (a.bounceunique/(a.senthtml+a.senttext)) END AS bounceprct';
		$query .= ' FROM '.acymailing_table('stats').' as a';
		$query .= ' JOIN '.acymailing_table('mail').' as b on a.mailid = b.mailid';
		if(!empty($extraJoin)) $query .= $extraJoin;
		if(!empty($filters)) $query .= ' WHERE ('.implode(') AND (', $filters).')';
		if(!empty($pageInfo->filter->order->value)){
			$query .= ' GROUP BY b.mailid ORDER BY '.$pageInfo->filter->order->value.' '.$pageInfo->filter->order->dir;
		}

		$rows = acymailing_loadObjectList($query, '', $pageInfo->limit->start, $pageInfo->limit->value);

		if($rows === null){
			acymailing_display(substr(strip_tags(acymailing_getDBError()), 0, 200).'...', 'error');
			if(file_exists(ACYMAILING_BACK.'install.joomla.php')){
				include_once(ACYMAILING_BACK.'install.joomla.php');
				$installClass = new acymailingInstall();
				$installClass->fromVersion = '3.6.0';
				$installClass->update = true;
				$installClass->updateSQL();
			}
		}

		$queryCount = 'SELECT COUNT(a.mailid) FROM '.acymailing_table('stats').' as a';
		if(!empty($pageInfo->search) || !empty($filters) || !empty($extraJoin)){
			$queryCount .= ' JOIN '.acymailing_table('mail').' as b on a.mailid = b.mailid';
			if(!empty($extraJoin)) $queryCount .= $extraJoin;
		}
		if(!empty($filters)) $queryCount .= ' WHERE ('.implode(') AND (', $filters).')';

		$pageInfo->elements->total = acymailing_loadResult($queryCount);
		$pageInfo->elements->page = count($rows);

		$pagination = new acyPagination($pageInfo->elements->total, $pageInfo->limit->start, $pageInfo->limit->value);

		if(acymailing_level(3)) {
			$tagfieldtype = acymailing_get('type.tagfield');
			$tagfieldtype->onclick = 'document.adminForm.submit();';
			$tagChoice = $tagfieldtype->display('filter_tags', 'listing', $selectedTags);
			$this->filterTag = $tagChoice;
		}

		$menuparams = new acyParameter();

		if(acymailing_isAdmin()) {
			$acyToolbar = acymailing_get('helper.toolbar');

			$acyToolbar->divider();
			$acyToolbar->custom('compare', trim(acymailing_translation('ACY_COMPARE'), '.') . (empty($_SESSION['acycomparison']) ? '' : ' (' . count($_SESSION['acycomparison']) . ')'), 'detailed-stat', false);
			$acyToolbar->custom('addcompare', acymailing_translation('ACY_ADD'), 'addcompare', true, '', acymailing_translation('ACY_ADD_COMPARE'));
			$acyToolbar->custom('resetcompare', acymailing_translation('JOOMEXT_RESET'), 'resetcompare', false);
			$acyToolbar->divider();
			$acyToolbar->custom('exportglobal', acymailing_translation('ACY_EXPORT'), 'export', false);
			if (acymailing_isAllowed($config->get('acl_statistics_delete', 'all'))) $acyToolbar->delete();
			$acyToolbar->divider();
			$acyToolbar->help('statistics');
			$acyToolbar->setTitle(acymailing_translation('GLOBAL_STATISTICS'), 'stats');
			$acyToolbar->display();
		}else {
			$menuparams = new acyParameter(array(
				'number' => 1,
				'opens' => 1,
				'clicks' => 1,
				'efficiency' => 0,
				'unsubscribe' => 1,
				'forward' => 0,
				'sent' => 1,
				'bounces' => 0,
				'failed' => 0,
				'id' => 1
			));

			$menu = acymailing_getMenu();

			if(is_object($menu)){
				$menuparams = new acyParameter($menu->params);
			}
		}

		$this->menuparams = $menuparams;
		$this->config = $config;
		$this->rows = $rows;
		$this->pageInfo = $pageInfo;
		$this->pagination = $pagination;
		$this->filterMsg = $msgTypeChoice;
	}

	function mailinglist($export = 0){
		$mailid = acymailing_getVar('int', 'mailid');
		if(empty($mailid)) return;

		acymailing_addStyle(false, ACYMAILING_CSS.'acyprint.css?v='.filemtime(ACYMAILING_MEDIA.'css'.DS.'acyprint.css'), 'text/css', 'print');

		$mailClass = acymailing_get('class.mail');
		$mailing = $mailClass->get($mailid);

		$mydata = array();
		$isData = true;

		if($mailing->type == 'followup'){
			$query = 'SELECT l.listid, l.name, l.color FROM #__acymailing_list l';
			$query .= ' JOIN #__acymailing_listcampaign lc ON l.listid = lc.listid';
			$query .= ' JOIN #__acymailing_listmail lm ON lc.campaignid = lm.listid';
			$query .= ' WHERE lm.mailid = '.intval($mailid).' ORDER BY l.ordering';
			$sqlRes = acymailing_loadObjectList($query);
		}else{
			$query = 'SELECT lm.listid, l.name, l.color FROM #__acymailing_list l';
			$query .= ' JOIN #__acymailing_listmail lm ON l.listid=lm.listid';
			$query .= ' WHERE lm.mailid='.intval($mailid).' ORDER BY l.ordering';
			$sqlRes = acymailing_loadObjectList($query);
		}

		if(empty($sqlRes)){
			$query = 'SELECT listid, name, color FROM #__acymailing_list';
			$query .= ' WHERE welmailid='.intval($mailid).' OR unsubmailid='.intval($mailid).' GROUP BY listid';
			$sqlRes = acymailing_loadObjectList($query);
			if(empty($sqlRes)){
				acymailing_display("This newsletter is not assigned to any list", 'warning');
				$isData = false;
				return;
			}
		}

		$arrayColors = array();
		$arrayList = array();
		foreach($sqlRes as $list){
			$mydata[$list->listid] = array();
			$mydata[$list->listid]['listid'] = $list->listid;
			$mydata[$list->listid]['listname'] = $list->name;
			$mydata[$list->listid]['nbMailSent'] = 0;
			$mydata[$list->listid]['nbHtml'] = 0;
			$mydata[$list->listid]['nbOpen'] = 0;
			$mydata[$list->listid]['nbOpenRatio'] = 0;
			$mydata[$list->listid]['nbClic'] = 0;
			$mydata[$list->listid]['nbClicRatio'] = 0;
			$mydata[$list->listid]['nbForward'] = 0;
			$mydata[$list->listid]['nbBounce'] = 0;
			$mydata[$list->listid]['nbBounceRatio'] = 0;
			$mydata[$list->listid]['nbUnsub'] = 0;
			$mydata[$list->listid]['nbUnsubRatio'] = 0;

			$mydata[$list->listid]['color'] = (!empty($list->color) ? $list->color : '#162955');
			array_push($arrayColors, (!empty($list->color) ? $list->color : '#162955'));
			array_push($arrayList, $list->listid);
		}
		$listColors = "'".implode("', '", $arrayColors)."'";
		$listListes = implode(',', $arrayList);

		$query = 'SELECT ls.listid, COUNT(*) as nbSent, SUM(IF(html=1, 1, 0)) as nbHtml, SUM(IF(open<>0, 1, 0)) as nbOpen, SUM(IF(bounce<>0, 1, 0)) as nbBounce ';
		$query .= ' FROM #__acymailing_userstats us JOIN #__acymailing_listsub ls ON us.subid = ls.subid';
		$query .= ' WHERE ls.listid IN ('.$listListes.') AND us.mailid='.intval($mailid).' GROUP BY ls.listid';
		$sqlRes = acymailing_loadObjectList($query);
		$totalSent = 0;
		if(!empty($sqlRes)){
			foreach($sqlRes as $lineRes){
				$mydata[$lineRes->listid]['nbMailSent'] = $lineRes->nbSent;
				$mydata[$lineRes->listid]['nbHtml'] = $lineRes->nbHtml;
				$mydata[$lineRes->listid]['nbOpen'] = $lineRes->nbOpen;
				$mydata[$lineRes->listid]['nbOpenRatio'] = number_format($lineRes->nbOpen / $mydata[$lineRes->listid]['nbHtml'] * 100, 1);
				$mydata[$lineRes->listid]['nbBounce'] = $lineRes->nbBounce;
				$mydata[$lineRes->listid]['nbBounceRatio'] = number_format($lineRes->nbBounce / $mydata[$lineRes->listid]['nbMailSent'] * 100, 1);
				$totalSent += $lineRes->nbSent;
			}
		}else{
			acymailing_display("No statistics recorded", 'warning');
			$isData = false;
			return;
		}

		$query = 'SELECT ls.listid, COUNT(DISTINCT(uc.subid)) AS nbClic FROM #__acymailing_urlclick as uc JOIN #__acymailing_listsub as ls ON uc.subid=ls.subid';
		$query .= ' WHERE ls.listid IN ('.$listListes.') AND uc.mailid='.intval($mailid).' GROUP BY ls.listid';
		$sqlRes = acymailing_loadObjectList($query);
		if(!empty($sqlRes)){
			foreach($sqlRes as $lineRes){
				$mydata[$lineRes->listid]['nbClic'] = $lineRes->nbClic;
				$mydata[$lineRes->listid]['nbClicRatio'] = number_format($lineRes->nbClic / $mydata[$lineRes->listid]['nbHtml'] * 100, 1);
			}
		}

		$query = 'SELECT ls.listid, SUM(IF(h.action=\'forward\', 1, 0)) as nbForward, SUM(IF(h.action=\'unsubscribed\', 1, 0)) as nbUnsub';
		$query .= ' FROM #__acymailing_history as h JOIN #__acymailing_listsub ls ON h.subid=ls.subid';
		$query .= ' WHERE ls.listid IN ('.$listListes.') AND h.mailid='.intval($mailid).' GROUP BY ls.listid';
		$sqlRes = acymailing_loadObjectList($query);
		if(!empty($sqlRes)){
			foreach($sqlRes as $lineRes){
				$mydata[$lineRes->listid]['nbForward'] = $lineRes->nbForward;
				$mydata[$lineRes->listid]['nbUnsub'] = $lineRes->nbUnsub;
				$mydata[$lineRes->listid]['nbUnsubRatio'] = number_format($lineRes->nbUnsub / $mydata[$lineRes->listid]['nbMailSent'] * 100, 1);
			}
		}

		if(acymailing_isAdmin() && acymailing_isNoTemplate()){
			$acyToolbar = acymailing_get('helper.toolbar');
			$acyToolbar->custom('', acymailing_translation('ACY_EXPORT'), 'export', false, 'location.href=\''.acymailing_completeLink('stats&task=mailinglist&export=1&mailid='.acymailing_getVar('int', 'mailid'), true).'\';');
			$acyToolbar->directPrint();
			$acyToolbar->setTitle($mailing->subject);
			$acyToolbar->topfixed = false;
			$acyToolbar->display();
		}
		$this->mydata = $mydata;
		$this->mailing = $mailing;
		$this->listColors = $listColors;
		$this->isData = $isData;
		$this->totalSent = $totalSent;

		if(acymailing_getVar('cmd', 'export')){
			$exportHelper = acymailing_get('helper.export');
			$config = acymailing_config();
			$encodingClass = acymailing_get('helper.encoding');

			$exportHelper->addHeaders('mailingList_'.acymailing_getVar('int', 'mailid'));

			$eol = "\r\n";
			$before = '"';
			$separator = '"'.str_replace(array('semicolon', 'comma'), array(';', ','), $config->get('export_separator', ';')).'"';
			$exportFormat = $config->get('export_format', 'UTF-8');
			$after = '"';

			$titles = array(acymailing_translation('LIST'), acymailing_translation('LIST_NAME'), acymailing_translation('ACY_SENT_EMAILS'), acymailing_translation('SENT_HTML'), acymailing_translation('OPEN'), acymailing_translation('OPEN').' (%)', acymailing_translation('CLICKED_LINK'), acymailing_translation('CLICKED_LINK').' (%)', acymailing_translation('FORWARDED'), acymailing_translation('BOUNCES'), acymailing_translation('BOUNCES').' (%)', acymailing_translation('UNSUBSCRIBED'), acymailing_translation('UNSUBSCRIBED').' (%)', acymailing_translation('COLOUR'));
			$titleLine = $before.implode($separator, $titles).$after.$eol;
			echo $titleLine;

			foreach($mydata as $listid => $listDetails){
				$line = '';
				foreach($listDetails as $name => $value){
					$line .= $value.$separator;
				}
				$line = substr($line, 0, strlen($line) - strlen($separator));
				$line = $before.$encodingClass->change($line, 'UTF-8', $exportFormat).$after.$eol;
				echo $line;
			}
			exit;
		}
	}

	function compare(){
		if(empty($_SESSION['acycomparison'])){
			acymailing_enqueueMessage(acymailing_translation('ACY_MIN_COMPARE'), 'info');
			acymailing_redirect(acymailing_completeLink('stats', false, true));
			return;
		}

		acymailing_arrayToInteger($_SESSION['acycomparison']);

		$rows = acymailing_loadObjectList('SELECT stats.*, mail.subject, mail.alias 
							FROM '.acymailing_table('stats').' AS stats 
							JOIN '.acymailing_table('mail').' AS mail 
								ON stats.mailid = mail.mailid 
							WHERE stats.mailid IN ('.implode(',', $_SESSION['acycomparison']).')');

		$acyToolbar = acymailing_get('helper.toolbar');
		$acyToolbar->custom('exportglobal', acymailing_translation('ACY_EXPORT'), 'export', false);
		$acyToolbar->custom('resetcompare', acymailing_translation('JOOMEXT_RESET'), 'resetcompare', false);
		$acyToolbar->cancel();
		$acyToolbar->divider();
		$acyToolbar->help('compare');
		$acyToolbar->setTitle(acymailing_translation('ACY_COMPARE_PAGE'), 'stats&task=compare');
		$acyToolbar->display();

		$this->rows = $rows;
	}
}
components/com_acymailing/views/stats/index.html000060400000000054152453623450016200 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/stats/tmpl/unsubchart.php000060400000003172152453623450020052 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php if(empty($this->unsubreasons)) return; ?>
<script language="JavaScript" type="text/javascript">
	function drawChart(){
		var dataTable = new google.visualization.DataTable();
		dataTable.addColumn('string');
		dataTable.addColumn('number');

		<?php
		$i = 0;
		$numberReasons = count($this->unsubreasons);
		foreach($this->unsubreasons as $oneRule => $total ){
				if($total < 2 && $numberReasons > 10) continue;
			?>
		dataTable.addRows(1);
		dataTable.setValue(<?php echo $i ?>, 0, '<?php echo addslashes($oneRule); ?>');
		dataTable.setValue(<?php echo $i ?>, 1, <?php echo intval($total); ?>);
		<?php 	$i++;
		} ?>

		var vis = new google.visualization.ColumnChart(document.getElementById('unsubchart'));
		var options = {
			width: '100%', height: 400, is3D: true, legendTextStyle: {color: '#333333'}, legend: 'none'
		};
		vis.draw(dataTable, options);
	}
	google.load("visualization", "1", {packages: ["corechart"]});
	google.setOnLoadCallback(drawChart);
</script>
<div id="acy_content">
	<div id="iframedoc"></div>
	<div id="unsubchart"></div>
	<table id="unsublist" class="adminlist table table-striped">
		<?php

		arsort($this->unsubreasons);
		foreach($this->unsubreasons as $oneRule => $total){
			if(preg_match('#^[A-Z_]*$#', $oneRule)) $oneRule = acymailing_translation($oneRule);
			echo '<tr><td>'.$total.'</td><td>'.$oneRule.'</td></tr>';
		}
		?>
	</table>
</div>
components/com_acymailing/views/stats/tmpl/detaillisting.php000060400000014512152453623450020530 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<?php if(!acymailing_isAdmin()) include(dirname(__FILE__).DS.'menu.detaillisting.php') ?>
	<div id="iframedoc"></div>
	<form action="<?php echo acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'stats', acymailing_isNoTemplate()); ?>" method="post" name="adminForm" id="adminForm">
		<table class="acymailing_table_options">
			<tr>
				<td>
					<?php acymailing_listingsearch($this->pageInfo->search); ?>
				</td>
				<td class="tablegroup_options">
					<?php echo $this->filters->status; ?>
					<?php echo $this->filters->mail; ?>
					<?php echo $this->filters->bounce; ?>
				</td>
			</tr>
		</table>

		<table class="acymailing_table" cellpadding="1">
			<thead>
			<tr>
				<th class="title titlenum">
					<?php echo acymailing_translation('ACY_NUM'); ?>
				</th>
				<th class="title titledate">
					<?php echo acymailing_gridSort(acymailing_translation('SEND_DATE'), 'a.senddate', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value, acymailing_getVar('cmd', 'task')); ?>
				</th>
				<?php $selectedMail = acymailing_getVar('int', 'filter_mail');
				if(empty($selectedMail)){ ?>
					<th class="title">
						<?php echo acymailing_gridSort(acymailing_translation('JOOMEXT_SUBJECT'), 'b.subject', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value, acymailing_getVar('cmd', 'task')); ?>
					</th>
				<?php } ?>
				<th class="title">
					<?php echo acymailing_gridSort(acymailing_translation('ACY_USER'), 'c.email', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value, acymailing_getVar('cmd', 'task')); ?>
				</th>
				<th class="title titletoggle">
					<?php echo acymailing_gridSort(acymailing_translation('RECEIVED_VERSION'), 'a.html', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value, acymailing_getVar('cmd', 'task')); ?>
				</th>
				<th class="title titletoggle">
					<?php echo acymailing_gridSort(acymailing_translation('OPEN'), 'a.open', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value, acymailing_getVar('cmd', 'task')); ?>
				</th>
				<th class="title titledate">
					<?php echo acymailing_gridSort(acymailing_translation('OPEN_DATE'), 'a.opendate', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value, acymailing_getVar('cmd', 'task')); ?>
				</th>
				<?php if(acymailing_level(3)){ ?>
					<th class="title titletoggle">
						<?php echo acymailing_gridSort(acymailing_translation('BOUNCES'), 'a.bounce', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value, acymailing_getVar('cmd', 'task')); ?>
					</th>
				<?php } ?>
				<th class="title titletoggle">
					<?php echo acymailing_gridSort(acymailing_translation('ACY_SENT'), 'a.sent', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value, acymailing_getVar('cmd', 'task')); ?>
				</th>
			</tr>
			</thead>
			<tfoot>
			<tr>
				<td colspan="10">
					<?php echo $this->pagination->getListFooter();
					echo $this->pagination->getResultsCounter(); ?>
				</td>
			</tr>
			</tfoot>
			<tbody>
			<?php
			$k = 0;
			for($i = 0, $a = count($this->rows); $i < $a; $i++){
				$row =& $this->rows[$i];
				$row->subject = acyEmoji::Decode($row->subject);
				?>
				<tr class="<?php echo "row$k"; ?>">
					<td align="center" style="text-align:center">
						<?php echo $this->pagination->getRowOffset($i); ?>
					</td>
					<td align="center" style="text-align:center">
						<?php echo acymailing_getDate($row->senddate); ?>
					</td>
					<?php if(empty($selectedMail)){ ?>
						<td>
							<?php
							$text = '<b>'.acymailing_translation('ACY_ID').' : </b>'.$row->mailid;
							$text .= '<br /><b>'.acymailing_translation('JOOMEXT_ALIAS').' : </b>'.$row->alias;

							if($row->type == 'followup'){
								$ctrl = 'followup';
							}else{
								$ctrl = 'newsletter';
							}
							echo acymailing_tooltip($text, $row->subject, '', $row->subject, acymailing_completeLink($ctrl.'&task=preview&mailid='.$row->mailid));
							?>
						</td>
					<?php } ?>
					<td>
						<?php
						$text = '<b>'.acymailing_translation('ACY_NAME').' : </b>'.$row->name;
						$text .= '<br /><b>'.acymailing_translation('ACY_ID').' : </b>'.$row->subid;
						$link = acymailing_isNoTemplate() ? '' : acymailing_completeLink('subscriber&task=edit&subid='.$row->subid);
						echo acymailing_tooltip($text, $row->email, '', $row->name.' ( '.$row->email.' )', $link);
						?>
					</td>
					<td align="center" style="text-align:center">
						<?php echo $row->html ? acymailing_translation('HTML') : acymailing_translation('JOOMEXT_TEXT'); ?>
					</td>
					<td align="center" style="text-align:center">
						<?php echo $row->open; ?>
					</td>
					<td align="center" style="text-align:center">
						<?php if(!empty($row->opendate)) echo acymailing_getDate($row->opendate); ?>
					</td>
					<?php if(acymailing_level(3)){ ?>
						<td align="center" style="text-align:center">
							<?php
							if($row->bounce == 0){
								echo $row->bounce;
							}else{
								if(empty($row->bouncerule)){
									$text = acymailing_translation('NO_RULE_SAVED');
								}else{
									$found = preg_match('#^([A-Z0-9_]*) \[#Uis', $row->bouncerule, $match);
									$text = $found ? str_replace($match[1], acymailing_translation($match[1]), $row->bouncerule) : $row->bouncerule;
								}
								echo acymailing_tooltip($text, acymailing_translation('ACY_RULE'), '', $row->bounce);
							} ?>
						</td>
					<?php } ?>
					<td align="center" style="text-align:center" title="<?php echo acymailing_translation('ACY_SENT').': '.$row->sent.' - '.acymailing_translation('FAILED').': '.$row->fail; ?>">
						<?php echo $this->toggleClass->display('visible', empty($row->fail) ? true : false); ?>
					</td>
				</tr>
				<?php
				$k = 1 - $k;
			}
			?>
			</tbody>
		</table>

		<input type="hidden" name="defaulttask" value="detaillisting"/>

		<?php acymailing_formOptions($this->pageInfo->filter->order);
		if(acymailing_getVar('int', 'listid')){ ?>
			<input type="hidden" name="listid" value="<?php echo acymailing_getVar('int', 'listid'); ?>"/>
		<?php } ?>
	</form>
</div>
components/com_acymailing/views/stats/tmpl/index.html000060400000000054152453623450017154 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/stats/tmpl/compare.php000060400000015046152453623450017325 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
    <div id="iframedoc"></div>
    <form action="<?php echo acymailing_completeLink('stats'); ?>" method="post" name="adminForm" id="adminForm" style="text-align: center;">
        <div class="onelineblockoptions">
            <table class="acymailing_table">

            <?php
            $properties = array('JOOMEXT_SUBJECT','SEND_DATE','ACY_SENT','OPEN','CLICKED_LINK','ACY_CLICK_EFFICIENCY','UNSUBSCRIBE','FORWARDED','BOUNCES','FAILED');

            foreach($properties as $oneProp){
                echo '<tr><td>'.acymailing_translation($oneProp).'</td>';
                for($i = 0, $a = count($this->rows); $i < $a; $i++) {
                    $row =& $this->rows[$i];
                    $cleanSent = $row->senthtml + $row->senttext - $row->bounceunique;

                    if($oneProp != 'JOOMEXT_SUBJECT') echo '<td>';

                    if($oneProp == 'JOOMEXT_SUBJECT'){
                        echo '<td style="width: '.(100/(count($this->rows)+1)).'%;">';
                        $row->subject = acyEmoji::Decode($row->subject); ?>
                        <input type="hidden" name="cid[]" value="<?php echo $row->mailid; ?>">
                        <?php echo acymailing_popup(acymailing_completeLink('diagram&task=mailing&mailid='.$row->mailid, true), strlen($row->subject) > 30 ? acymailing_tooltip($row->subject, '', '', substr($row->subject, 0, 30).'...') : $row->subject, '', 800, 590); ?>
                    <?php }elseif($oneProp == 'SEND_DATE'){ ?>
                        <span style="font-size: 10px;"><?php echo acymailing_getDate($row->senddate); ?></span>
                    <?php }elseif($oneProp == 'ACY_SENT'){ ?>
                        <?php $text = '<b>'.acymailing_translation('HTML').' : </b>'.$row->senthtml;
                        $text .= '<br /><b>'.acymailing_translation('JOOMEXT_TEXT').' : </b>'.$row->senttext;
                        $title = acymailing_translation('ACY_SENT');
                        echo acymailing_tooltip($text, $title, '', $row->senthtml + $row->senttext, acymailing_completeLink('stats&task=detaillisting&filter_status=0&filter_mail='.$row->mailid)); ?>
                    <?php }elseif($oneProp == 'OPEN'){
                        if(!empty($row->senthtml)){
                            $text = '<b>'.acymailing_translation('OPEN_UNIQUE').' : </b>'.$row->openunique.' / '.$cleanSent;
                            $text .= '<br /><b>'.acymailing_translation('OPEN_TOTAL').' : </b>'.$row->opentotal;
                            $pourcent = ($cleanSent == 0 ? '0%' : (substr($row->openunique / $cleanSent * 100, 0, 5)).'%');
                            $title = acymailing_translation_sprintf('PERCENT_OPEN', $pourcent);
                            echo acymailing_tooltip($text, $title, '', $pourcent, acymailing_completeLink('stats&task=detaillisting&filter_status=open&filter_mail='.$row->mailid));
                        }
                    }elseif($oneProp == 'CLICKED_LINK'){
                        $text = '<b>'.acymailing_translation('UNIQUE_HITS').' : </b>'.$row->clickunique.' / '.$cleanSent;
                        $text .= '<br /><b>'.acymailing_translation('TOTAL_HITS').' : </b>'.$row->clicktotal;
                        $pourcent = ($cleanSent == 0 ? '0%' : (substr($row->clickunique / $cleanSent * 100, 0, 5)).'%');
                        $title = acymailing_translation_sprintf('PERCENT_CLICK', $pourcent);
                        echo acymailing_tooltip($text, $title, '', $pourcent, acymailing_completeLink('statsurl&filter_mail='.$row->mailid));
                    }elseif($oneProp == 'ACY_CLICK_EFFICIENCY'){
                        $text = '<b>'.acymailing_translation('UNIQUE_HITS').' : </b>'.$row->clickunique.' / '.$row->openunique;
                        $text .= '<br /><b>'.acymailing_translation('OPEN_UNIQUE').' : </b>'.$row->openunique;
                        $pourcentEfficiency = ($row->openunique == 0 ? '0%' : (substr($row->clickunique / $row->openunique * 100, 0, 5)).'%');
                        $title = acymailing_translation_sprintf('ACY_CLICK_EFFICIENCY_DESC', $pourcentEfficiency);
                        echo acymailing_tooltip($text, $title, '', $pourcentEfficiency, acymailing_completeLink('statsurl&filter_mail='.$row->mailid));
                    }elseif($oneProp == 'UNSUBSCRIBE'){
                        echo acymailing_popup(acymailing_completeLink('stats&task=unsubchart&mailid='.$row->mailid, true), '<i class="acyicon-statistic"></i>', '', 800, 590);
                        $pourcent = ($cleanSent == 0) ? '0%' : (substr($row->unsub / $cleanSent * 100, 0, 5)).'%';
                        $text = $row->unsub.' / '.$cleanSent;
                        $title = acymailing_translation('UNSUBSCRIBE');
                        echo acymailing_popup(acymailing_completeLink('stats&start=0&task=unsubscribed&filter_mail='.$row->mailid, true), acymailing_tooltip($text, $title, '', $pourcent), '', 800, 590);
                    }elseif($oneProp == 'FORWARDED'){
                        echo acymailing_popup(acymailing_completeLink('stats&start=0&task=forward&filter_mail='.$row->mailid, true), $row->forward, '', 800, 590);
                    }elseif($oneProp == 'BOUNCES'){
                        echo acymailing_popup(acymailing_completeLink('bounces&task=chart&mailid='.$row->mailid, true), '<i class="acyicon-statistic"></i>', '', 800, 590);
                        $text = $row->bounceunique.' / '.($row->senthtml + $row->senttext);
                        $title = acymailing_translation('BOUNCES');
                        $pourcent = (empty($row->senthtml) AND empty($row->senttext)) ? '0%' : (substr($row->bounceunique / ($row->senthtml + $row->senttext) * 100, 0, 5)).'%';
                        echo acymailing_tooltip($text, $title, '', $pourcent, acymailing_completeLink('stats&task=detaillisting&filter_status=bounce&filter_mail='.$row->mailid));
                    }else{ ?>
                        <a href="<?php echo acymailing_completeLink('stats&task=detaillisting&filter_status=failed&filter_mail='.$row->mailid); ?>">
                            <?php echo $row->fail; ?>
                        </a>
                    <?php }

                    echo '</td>';
                }
                echo '</tr>';
            }
            ?>
            </table>
        </div>
        <?php acymailing_formOptions(); ?>
    </form>
</div>
components/com_acymailing/views/stats/tmpl/unsubscribed.php000060400000010432152453623450020361 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<div id="iframedoc"></div>
	<form action="<?php echo acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'stats', true); ?>" method="post" name="adminForm" id="adminForm">
		<?php if(!acymailing_isAdmin()){ ?>
			<fieldset class="acyheaderarea">
				<?php if(!empty($this->rows[0]->subject)) $this->rows[0]->subject = acyEmoji::Decode($this->rows[0]->subject); ?>
				<div class="acyheader icon-48-stats" style="float: left;"><?php echo(!empty($this->rows) ? $this->rows[0]->subject : acymailing_translation('UNSUBSCRIBECAPTION')); ?></div>
				<div class="toolbar" id="toolbar" style="float: right;">
					<table>
						<tr>
							<?php if(acymailing_isNoTemplate() && !empty($this->rows)){ ?>
								<td><a onclick="acymailing.submitbutton('export<?php echo ucfirst(acymailing_getVar('cmd', 'task')); ?>'); return false;" href="#"><span class="icon-32-acyexport" title="<?php echo acymailing_translation('ACY_EXPORT', true); ?>"></span><?php echo acymailing_translation('ACY_EXPORT'); ?></a></td>
								<td>
								</td>
							<?php } ?>
							<?php if(acymailing_getVar('int', 'fromdetail') == 1){ ?>
								<td><a href="<?php echo acymailing_completeLink('frontdiagram&task=mailing&mailid='.acymailing_getVar('int', 'filter_mail'), true); ?>"><span class="icon-32-cancel" title="<?php echo acymailing_translation('ACY_CANCEL', true); ?>"></span><?php echo acymailing_translation('ACY_CANCEL'); ?></a></td>
							<?php } ?>
						</tr>
					</table>
				</div>
			</fieldset>
		<?php } ?>


		<table class="acymailing_table_options ">
			<tr>
				<td width="100%">
					<?php acymailing_listingsearch($this->pageInfo->search); ?>
				</td>
				<td style="padding-left: 15px;">
					<?php echo $this->filterMail; ?>
				</td>
			</tr>
		</table>

		<table class="acymailing_table" cellspacing="1" align="center">
			<thead>
			<tr>
				<th class="title titlenum">
					<?php echo acymailing_translation('ACY_NUM'); ?>
				</th>
				<th class="title titledate">
					<?php echo acymailing_gridSort(acymailing_translation('FIELD_DATE'), 'a.date', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
				</th>
				<th class="title">
					<?php echo acymailing_gridSort(acymailing_translation('ACY_USER'), 'c.email', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
				</th>
				<th class="title">
					<?php echo acymailing_translation('ACY_DETAILS'); ?>
				</th>
			</tr>
			</thead>
			<tfoot>
			<tr>
				<td colspan="4">
					<?php echo $this->pagination->getListFooter();
					echo $this->pagination->getResultsCounter(); ?>
				</td>
			</tr>
			</tfoot>
			<tbody>
			<?php
			$k = 0;
			$i = 0;
			foreach($this->rows as $row){
				?>
				<tr class="<?php echo "row$k"; ?>">
					<td align="center" valign="top">
						<?php echo $i + 1; ?>
					</td>
					<td align="center" valign="top">
						<?php echo acymailing_getDate($row->date); ?>
					</td>
					<td align="center" style="text-align:center">
						<?php
						$text = '<b>'.acymailing_translation('ACY_NAME').' : </b>'.$row->name;
						$text .= '<br /><b>'.acymailing_translation('ACY_ID').' : </b>'.$row->subid;
						echo acymailing_tooltip($text, $row->email, '', $row->email);
						?>
					</td>
					<td valign="top">
						<?php
						$data = explode("\n", $row->data);
						foreach($data as $value){
							if(!strpos($value, '::')){
								echo $value;
								continue;
							}
							list($part1, $part2) = explode("::", $value);
							if(empty($part2)) continue;
							if(preg_match('#^[A-Z_]*$#', $part2)) $part2 = acymailing_translation($part2);
							echo '<b>'.acymailing_translation($part1).' : </b>'.$part2.'<br />';
						}
						?>
					</td>
				</tr>
				<?php
				$k = 1 - $k;
				$i++;
			}
			?>
			</tbody>
		</table>

		<input type="hidden" name="defaulttask" value="<?php echo acymailing_getVar('cmd', 'task'); ?>"/>
		<input type="hidden" name="fromdetail" value="<?php echo acymailing_getVar('int', 'fromdetail'); ?>"/>
		<?php acymailing_formOptions($this->pageInfo->filter->order); ?>
	</form>
</div>
components/com_acymailing/views/stats/tmpl/menu.mailinglist.php000060400000002064152453623450021152 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><fieldset class="acyheaderarea">
	<div class="acyheader icon-48-stats" style="float: left;"><?php echo $this->mailing->subject; ?></div>
	<div class="toolbar" id="toolbar" style="float: right;">
		<table>
			<tr>
				<td><a href="<?php echo acymailing_completeLink(acymailing_getVar('cmd', 'ctrl').'&task=mailinglist&export=1&mailid='.acymailing_getVar('int', 'mailid'), true); ?>"><span class="icon-32-acyexport" title="<?php echo acymailing_translation('ACY_EXPORT', true); ?>"></span><?php echo acymailing_translation('ACY_EXPORT'); ?></a></td>
				<td><a onclick="window.print(); return false;" href="#"><span class="icon-32-acyprint" title="<?php echo acymailing_translation('ACY_PRINT', true); ?>"></span><?php echo acymailing_translation('ACY_PRINT'); ?></a></td>
			</tr>
		</table>
	</div>
</fieldset>
components/com_acymailing/views/stats/tmpl/listing.php000060400000033042152453623450017344 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<div id="iframedoc"></div>
	<?php if(!acymailing_isAdmin()){ ?>
	<fieldset>
		<div class="acyheader icon-48-stats" style="float: left;"><?php echo acymailing_translation('GLOBAL_STATISTICS'); ?></div>
		<div class="toolbar" id="acytoolbar" style="float: right;">
			<table>
				<tr>
					<td id="acybutton_stats_exportglobal"><a onclick="acymailing.submitbutton('exportglobal'); return false;" href="#" ><span class="icon-32-acyexport" title="<?php echo acymailing_translation('ACY_EXPORT'); ?>"></span><?php echo acymailing_translation('ACY_EXPORT'); ?></a></td>
					<?php if(acymailing_isAllowed($this->config->get('acl_statistics_delete','all'))){ ?><td id="acybutton_stats_delete"><a onclick="javascript:if(document.adminForm.boxchecked.value==0){alert('<?php echo acymailing_translation('PLEASE_SELECT',true);?>');}else{if(confirm('<?php echo acymailing_translation('ACY_VALIDDELETEITEMS',true); ?>')){acymailing.submitbutton('remove');}} return false;" href="#" ><span class="icon-32-delete" title="<?php echo acymailing_translation('ACY_DELETE'); ?>"></span><?php echo acymailing_translation('ACY_DELETE'); ?></a></td><?php } ?>
				</tr>
			</table>
		</div>
	</fieldset>
	<?php } ?>
	<form action="<?php echo acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'stats'); ?>" method="post" name="adminForm" id="adminForm">
		<table class="acymailing_table_options">
			<tr>
				<td>
					<?php acymailing_listingsearch($this->pageInfo->search); ?>
				</td>
				<td class="tablegroup_options">
					<span class="statistics_filter" id="statfilter" align="left"><?php echo $this->filterMsg; ?></span>
					<?php if(!empty($this->filterTag)){ ?><span class="statistics_filter" id="statfilter" align="left"><?php echo $this->filterTag; ?></span><?php } ?>
				</td>
			</tr>
		</table>
		<?php if(!acymailing_isAdmin()) echo '<div class="acyslide">'; ?>
		<table class="acymailing_table" cellpadding="1">
			<thead>
			<tr>
				<?php if($this->menuparams->get('number', '1') == 1){ ?>
					<th class="title titlenum">
						<?php echo acymailing_translation('ACY_NUM'); ?>
					</th>
				<?php } ?>
				<th class="title titlebox">
					<input type="checkbox" name="toggle" value="" onclick="acymailing.checkAll(this);"/>
				</th>
				<th class="title statsubjectsenddate">
					<?php echo acymailing_gridSort(acymailing_translation('JOOMEXT_SUBJECT'), 'b.subject', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value, 'listing').' - '.acymailing_gridSort(acymailing_translation('SEND_DATE'), 'a.senddate', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value, 'listing'); ?>
				</th>
				<?php if($this->menuparams->get('opens', '1') == 1){ ?>
					<th class="title titletoggle">
						<?php echo acymailing_gridSort(acymailing_translation('OPEN'), 'openprct', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value, 'listing'); ?>
					</th>
				<?php } ?>
				<?php if(acymailing_level(1)){ ?>
					<?php if($this->menuparams->get('clicks', '1') == 1){ ?>
						<th class="title titletoggle">
							<?php echo acymailing_gridSort(acymailing_translation('CLICKED_LINK'), 'clickprct', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value, 'listing'); ?>
						</th>
					<?php } ?>
					<?php if($this->menuparams->get('efficiency', '1') == 1){ ?>
						<th class="title titletoggle">
							<?php echo acymailing_gridSort(acymailing_translation('ACY_CLICK_EFFICIENCY'), 'efficiencyprct', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value, 'listing'); ?>
						</th>
					<?php } ?>
				<?php } ?>
				<?php if($this->menuparams->get('unsubscribe', '1') == 1){ ?>
					<th class="title titletoggle">
						<?php echo acymailing_gridSort(acymailing_translation('UNSUBSCRIBE'), 'unsubprct', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value, 'listing'); ?>
					</th>
				<?php } ?>
				<?php if(acymailing_level(1) && $this->menuparams->get('forward', '1') == 1){ ?>
					<th class="title titletoggle">
						<?php echo acymailing_gridSort(acymailing_translation('FORWARDED'), 'a.forward', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value, 'listing'); ?>
					</th>
				<?php } ?>
				<?php if($this->menuparams->get('sent', '1') == 1){ ?>
					<th class="title titletoggle">
						<?php echo acymailing_gridSort(acymailing_translation('ACY_SENT'), 'totalsent', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value, 'listing'); ?>
					</th>
				<?php } ?>
				<?php if(acymailing_level(3) && $this->menuparams->get('bounces', '1') == 1){ ?>
					<th class="title titletoggle">
						<?php echo acymailing_gridSort(acymailing_translation('BOUNCES'), 'bounceprct', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value, 'listing'); ?>
					</th>
				<?php } ?>
				<?php if($this->menuparams->get('failed', '1') == 1){ ?>
					<th class="title titletoggle">
						<?php echo acymailing_gridSort(acymailing_translation('FAILED'), 'a.fail', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value, 'listing'); ?>
					</th>
				<?php } ?>
				<?php if(acymailing_level(3) && acymailing_isAdmin()){ ?>
					<th class="title titletoggle" style="font-size: 12px;">
						<?php echo acymailing_translation('STATS_PER_LIST'); ?>
					</th>
				<?php } ?>
				<?php if($this->menuparams->get('id', '1') == 1){ ?>
					<th class="title titleid titletoggle">
						<?php echo acymailing_gridSort(acymailing_translation('ACY_ID'), 'a.mailid', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value, 'listing'); ?>
					</th>
				<?php } ?>
			</tr>
			</thead>
			<tfoot>
			<tr>
				<td colspan="14">
					<?php echo $this->pagination->getListFooter();
					echo $this->pagination->getResultsCounter(); ?>
				</td>
			</tr>
			</tfoot>
			<tbody>
			<?php
			$k = 0;

			for($i = 0, $a = count($this->rows); $i < $a; $i++){
				$row =& $this->rows[$i];
				$row->subject = acyEmoji::Decode($row->subject);
				if(acymailing_level(3)){
					$cleanSent = $row->senthtml + $row->senttext - $row->bounceunique;
				}else{
					$cleanSent = $row->senthtml + $row->senttext;
				}
				?>
				<tr class="<?php echo "row$k"; ?>">
					<?php if($this->menuparams->get('number', '1') == 1){ ?>
						<td align="center" style="text-align:center">
							<?php echo $this->pagination->getRowOffset($i); ?>
						</td>
					<?php } ?>
					<td align="center" style="text-align:center">
						<?php echo acymailing_gridID($i, $row->mailid); ?>
					</td>
					<td>
						<?php
						if(acymailing_level(2)) {
							echo acymailing_popup(acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'diagram&task=mailing&mailid='.$row->mailid, true), '<i class="acyicon-statistic"></i><span class="acy_stat_subject">'.acymailing_tooltip('<b>'.acymailing_translation('JOOMEXT_ALIAS').' : </b>'.$row->alias, '', '', $row->subject).'</span>', '', 800, 590);
						}else{
							echo '<span class="acy_stat_subject">'.acymailing_tooltip('<b>'.acymailing_translation('JOOMEXT_ALIAS').' : </b>'.$row->alias, ' ', '', $row->subject).'</span>';
						}
						echo '<br /><span class="acy_stat_date"><b>'.acymailing_translation('SEND_DATE').' : </b>'.acymailing_getDate($row->senddate).'</span>'; ?>
					</td>
					<?php if($this->menuparams->get('opens', '1') == 1){ ?>
						<td align="center" style="text-align:center">
							<?php
							if(!empty($row->senthtml)){
								$text = '<b>'.acymailing_translation('OPEN_UNIQUE').' : </b>'.$row->openunique.' / '.$cleanSent;
								$text .= '<br /><b>'.acymailing_translation('OPEN_TOTAL').' : </b>'.$row->opentotal;
								$pourcent = ($cleanSent == 0 ? '0%' : (substr($row->openunique / $cleanSent * 100, 0, 5)).'%');
								$title = acymailing_translation_sprintf('PERCENT_OPEN', $pourcent);
								echo acymailing_tooltip($text, $title, '', $pourcent, acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'stats&task=detaillisting&filter_status=open&filter_mail='.$row->mailid));
							}
							?>
						</td>
					<?php } ?>
					<?php if(acymailing_level(1)){ ?>
						<?php if($this->menuparams->get('clicks', '1') == 1){ ?>
							<td align="center" style="text-align:center">
								<?php
								if(!empty($row->senthtml)){
									$text = '<b>'.acymailing_translation('UNIQUE_HITS').' : </b>'.$row->clickunique.' / '.$cleanSent;
									$text .= '<br /><b>'.acymailing_translation('TOTAL_HITS').' : </b>'.$row->clicktotal;
									$pourcent = ($cleanSent == 0 ? '0%' : (substr($row->clickunique / $cleanSent * 100, 0, 5)).'%');
									$title = acymailing_translation_sprintf('PERCENT_CLICK', $pourcent);
									echo acymailing_tooltip($text, $title, '', $pourcent, acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'statsurl&filter_mail='.$row->mailid));
								}
								?>
							</td>
						<?php } ?>
						<?php if($this->menuparams->get('efficiency', '1') == 1){ ?>
							<td align="center" style="text-align:center">
								<?php
								if(!empty($row->senthtml)){
									$text = '<b>'.acymailing_translation('UNIQUE_HITS').' : </b>'.$row->clickunique.' / '.$row->openunique;
									$text .= '<br /><b>'.acymailing_translation('OPEN_UNIQUE').' : </b>'.$row->openunique;
									$pourcentEfficiency = ($row->openunique == 0 ? '0%' : (substr($row->clickunique / $row->openunique * 100, 0, 5)).'%');
									$title = acymailing_translation_sprintf('ACY_CLICK_EFFICIENCY_DESC', $pourcentEfficiency);
									echo acymailing_tooltip($text, $title, '', $pourcentEfficiency, acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'statsurl&filter_mail='.$row->mailid));
								}
								?>
							</td>
						<?php } ?>
					<?php } ?>
					<?php if($this->menuparams->get('unsubscribe', '1') == 1){ ?>
						<td align="center" style="text-align:center">
							<?php
							echo acymailing_popup(acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'stats&task=unsubchart&mailid='.$row->mailid, true), '<i class="acyicon-statistic"></i>', '', 800, 590);
							$pourcent = ($cleanSent == 0) ? '0%' : (substr($row->unsub / $cleanSent * 100, 0, 5)).'%';
							$text = $row->unsub.' / '.$cleanSent;
							$title = acymailing_translation('UNSUBSCRIBE');
							echo acymailing_popup(acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'stats&start=0&task=unsubscribed&filter_mail='.$row->mailid, true), acymailing_tooltip($text, $title, '', $pourcent), '', 800, 590);
							?>
						</td>
					<?php } ?>
					<?php if(acymailing_level(1) && $this->menuparams->get('forward', '1') == 1){ ?>
						<td align="center" style="text-align:center">
							<?php echo acymailing_popup(acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'stats&start=0&task=forward&filter_mail='.$row->mailid, true), $row->forward, '', 800, 590); ?>
						</td>
					<?php } ?>
					<?php if($this->menuparams->get('sent', '1') == 1){ ?>
						<td align="center" style="text-align:center">
							<?php $text = '<b>'.acymailing_translation('HTML').' : </b>'.$row->senthtml;
							$text .= '<br /><b>'.acymailing_translation('JOOMEXT_TEXT').' : </b>'.$row->senttext;
							$title = acymailing_translation('ACY_SENT');
							echo acymailing_tooltip($text, $title, '', $row->senthtml + $row->senttext, acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'stats&task=detaillisting&filter_status=0&filter_mail='.$row->mailid)); ?>
						</td>
					<?php } ?>
					<?php if(acymailing_level(3) && $this->menuparams->get('bounces', '1') == 1){ ?>
						<td align="center" style="text-align:center" nowrap="nowrap">
							<?php echo acymailing_popup(acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'bounces&task=chart&mailid='.$row->mailid, true), '<i class="acyicon-statistic"></i>', '', 800, 590);
							$text = $row->bounceunique.' / '.($row->senthtml + $row->senttext);
							$title = acymailing_translation('BOUNCES');
							$pourcent = (empty($row->senthtml) AND empty($row->senttext)) ? '0%' : (substr($row->bounceunique / ($row->senthtml + $row->senttext) * 100, 0, 5)).'%';
							echo acymailing_tooltip($text, $title, '', $pourcent, acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'stats&task=detaillisting&filter_status=bounce&filter_mail='.$row->mailid)); ?>
						</td>
					<?php } ?>
					<?php if($this->menuparams->get('failed', '1') == 1){ ?>
						<td align="center" style="text-align:center">
							<a href="<?php echo acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'stats&task=detaillisting&filter_status=failed&filter_mail='.$row->mailid); ?>">
								<?php echo $row->fail; ?>
							</a>
						</td>
					<?php } ?>
					<?php if(acymailing_level(3) && acymailing_isAdmin()){ ?>
						<td align="center" style="text-align:center">
							<?php echo acymailing_popup(acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'stats&task=mailinglist&mailid='.$row->mailid, true), '<i class="acyicon-statistic"></i>', '', 800, 590); ?>
						</td>
					<?php } ?>
					<?php if($this->menuparams->get('id', '1') == 1){ ?>
						<td align="center" style="text-align:center">
							<?php echo $row->mailid; ?>
						</td>
					<?php } ?>
				</tr>
				<?php
				$k = 1 - $k;
			}
			?>
			</tbody>
		</table>
		<?php
		if(!acymailing_isAdmin()) echo '</div>';
		if(!empty($this->Itemid)) echo '<input type="hidden" name="Itemid" value="'.$this->Itemid.'" />';
		acymailing_formOptions($this->pageInfo->filter->order);
		?>
	</form>
</div>
components/com_acymailing/views/stats/tmpl/menu.detaillisting.php000060400000002732152453623450021474 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><fieldset>
	<div class="acyheader icon-48-stats" style="float: left;"><?php echo $this->mailing->subject; ?></div>
	<div class="toolbar" id="toolbar" style="float: right;">
		<table>
			<tr>
				<?php
				$config = acymailing_config();
				if(acymailing_isAllowed($config->get('acl_subscriber_export', 'all'))){ ?>
					<td><a onclick="acymailing.submitbutton('export'); return false;" href="#"><span class="icon-32-acyexport" title="<?php echo acymailing_translation('ACY_EXPORT', true); ?>"></span><?php echo acymailing_translation('ACY_EXPORT'); ?></a></td>
				<?php }

				if(acymailing_isNoTemplate()){
					$link = 'frontdiagram&task=mailing&mailid='.acymailing_getVar('cmd', 'mailid').'&listid='.acymailing_getVar('cmd', 'listid');
				}else{
					$link = 'frontstats&listid='.acymailing_getVar('int', 'listid').'&filter_msg='.acymailing_getVar('int', 'filter_msg').'&mailid='.acymailing_getVar('int', 'filter_mail');
				}
				?>
				<td><a href="<?php echo acymailing_completeLink($link, acymailing_isNoTemplate()); ?>"><span class="icon-32-cancel" title="<?php echo acymailing_translation('ACY_CANCEL', true); ?>"></span><?php echo acymailing_translation('ACY_CANCEL'); ?></a></td>
			</tr>
		</table>
	</div>
</fieldset>
components/com_acymailing/views/stats/tmpl/mailinglist.php000060400000031102152453623450020202 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<?php
	if(empty($this->isData)) return;
	if(!acymailing_isAdmin() && acymailing_isNoTemplate()) include(dirname(__FILE__).DS.'menu.mailinglist.php'); ?>
	<style type="text/css">
		.mailingListChart{
			float: left;
			margin: 2px;
		}

		.noDataChart{
			display: none;
		}
	</style>
	<script type="text/javascript" src="https://www.google.com/jsapi"></script>
	<script language="JavaScript" type="text/javascript">
		function getDataMailSent(){
			var data = new google.visualization.DataTable();
			data.addColumn('string', 'Name');
			data.addColumn('number', 'Value');
			data.addRows(<?php echo count($this->mydata); ?>);
			<?php
			$array_detail = array();
			$i = 0;
			foreach($this->mydata as $list){
				echo 'data.setValue('. $i .', 0, \''. str_replace("'", "\'", $list['listname']) .'\'); ';
				echo 'data.setValue('. $i .', 1, '. $list['nbMailSent'] .'); ';
				$i++;
				$nbSentRatio = number_format($list['nbMailSent'] / $this->totalSent * 100, 1);
				array_push($array_detail, $list['listname'] .': '. $list['nbMailSent'] . ' ('. $nbSentRatio .'%)');
			}
			$detailSent = implode("\n", $array_detail); ?>
			return data;
		}

		function drawMailSent(){
			var vis = new google.visualization.PieChart(document.getElementById('chartMailSent'));
			var options = {
				width: 350, height: 350, colors: [<?php echo $this->listColors; ?>], legend: 'right', title: '<?php echo str_replace("'", "\'", acymailing_translation('ACY_SENT_EMAILS')); ?>', legendTextStyle: {color: '#333333'}, pieSliceText: 'value', is3D: true
			};
			vis.draw(getDataMailSent(), options);
		}

		var optionsColumnChart = {
			width: 350, height: 350, colors: [<?php echo $this->listColors; ?>], legend: 'none', vAxis: {minValue: 0, maxValue: 100}
		};

		function getDataOpen(){
			var data = new google.visualization.DataTable();
			data.addColumn('string', 'Columns');
			<?php foreach($this->mydata as $list){
				echo 'data.addColumn(\'number\', \''. str_replace("'", "\'", $list['listname']) .'\'); ';
			} ?>
			data.addRows(1);
			data.setValue(0, 0, '');
			<?php $i = 1;
			$array_detail = array();
			$dataOpen = false;
			foreach($this->mydata as $list){
				if(!$dataOpen && $list['nbOpenRatio'] > 0) $dataOpen = true;
				echo 'data.setValue(0,'. $i .', '. $list['nbOpenRatio'] .'); ';
				array_push($array_detail, $list['listname'] .': '. $list['nbOpen'] .' ('. $list['nbOpenRatio'] .'%)');
				$i++;
			}
			$detailOpen = implode("\n", $array_detail); ?>
			return data;
		}
		function drawOpen(){
			var vis = new google.visualization.ColumnChart(document.getElementById('chartMailOpen'));
			optionsColumnChart['title'] = '<?php echo str_replace("'", "\'", acymailing_translation('OPEN')); ?> (%)';
			<?php if(!$dataOpen) {echo	"optionsColumnChart['vAxis'] = {minValue:0, maxValue:100};";}
			else echo	"optionsColumnChart['vAxis'] = {minValue:0};"; ?>
			vis.draw(getDataOpen(), optionsColumnChart);
		}

		function getDataBounce(){
			var data = new google.visualization.DataTable();
			data.addColumn('string', 'Columns');
			<?php foreach($this->mydata as $list){
				echo 'data.addColumn(\'number\', \''. str_replace("'", "\'", $list['listname']) .'\'); ';
			} ?>
			data.addRows(1);
			data.setValue(0, 0, '');
			<?php $i = 1;
			$array_detail = array();
			$dataBounce = false;
			foreach($this->mydata as $list){
				if(!$dataBounce && $list['nbBounceRatio'] > 0) $dataBounce = true;
				echo 'data.setValue(0,'. $i .', '. $list['nbBounceRatio'] .'); ';
				array_push($array_detail, $list['listname'] .': '. $list['nbBounce'] .' ('. $list['nbBounceRatio'] .'%)');
				$i++;
			}
			$detailBounce = implode("\n", $array_detail); ?>
			return data;
		}
		function drawBounce(){
			var vis = new google.visualization.ColumnChart(document.getElementById('chartBounce'));
			optionsColumnChart['title'] = '<?php echo str_replace("'", "\'", acymailing_translation('BOUNCES')); ?> (%)';
			<?php if(!$dataBounce) {echo	"optionsColumnChart['vAxis'] = {minValue:0, maxValue:100};";}
			else echo	"optionsColumnChart['vAxis'] = {minValue:0};"; ?>
			vis.draw(getDataBounce(), optionsColumnChart);
		}

		function getDataClic(){
			var data = new google.visualization.DataTable();
			data.addColumn('string', 'Columns');
			<?php foreach($this->mydata as $list){
				echo 'data.addColumn(\'number\', \''. str_replace("'", "\'", $list['listname']) .'\'); ';
			} ?>
			data.addRows(1);
			data.setValue(0, 0, '');
			<?php $i = 1;
			$array_detail = array();
			$dataClic = false;
			foreach($this->mydata as $list){
				if(!$dataClic && $list['nbClicRatio'] > 0) $dataClic = true;
				echo 'data.setValue(0,'. $i .', '. $list['nbClicRatio'] .'); ';
				array_push($array_detail, $list['listname'] .': '. $list['nbClic'] .' ('. $list['nbClicRatio'] .'%)');
				$i++;
			}
			$detailClic = implode("\n", $array_detail); ?>
			return data;
		}
		function drawClic(){
			var vis = new google.visualization.ColumnChart(document.getElementById('chartClic'));
			optionsColumnChart['title'] = '<?php echo str_replace("'", "\'", acymailing_translation('CLICKED_LINK')); ?> (%)';
			<?php if(!$dataClic) {echo	"optionsColumnChart['vAxis'] = {minValue:0, maxValue:100};";}
			else echo	"optionsColumnChart['vAxis'] = {minValue:0};"; ?>
			vis.draw(getDataClic(), optionsColumnChart);
		}

		function getDataUnsub(){
			var data = new google.visualization.DataTable();
			data.addColumn('string', 'Columns');
			<?php foreach($this->mydata as $list){
				echo 'data.addColumn(\'number\', \''. str_replace("'", "\'", $list['listname']) .'\'); ';
			} ?>
			data.addRows(1);
			data.setValue(0, 0, '');
			<?php $i = 1;
			$array_detail = array();
			$dataUnsub = false;
			foreach($this->mydata as $list){
				if(!$dataUnsub && $list['nbUnsubRatio'] > 0) $dataUnsub = true;
				echo 'data.setValue(0,'. $i .', '. $list['nbUnsubRatio'] .'); ';
				array_push($array_detail, $list['listname'] .': '. $list['nbUnsub'] .' ('. $list['nbUnsubRatio'] .'%)');
				$i++;
			}
			$detailUnsub = implode("\n", $array_detail); ?>
			return data;
		}
		function drawUnsub(){
			var vis = new google.visualization.ColumnChart(document.getElementById('chartUnsubscribed'));
			optionsColumnChart['title'] = '<?php echo str_replace("'", "\'", acymailing_translation('UNSUBSCRIBED')); ?> (%)';
			<?php if(!$dataUnsub) {echo	"optionsColumnChart['vAxis'] = {minValue:0, maxValue:100};";}
			else echo	"optionsColumnChart['vAxis'] = {minValue:0};"; ?>
			vis.draw(getDataUnsub(), optionsColumnChart);
		}

		function getDataForward(){
			var data = new google.visualization.DataTable();
			data.addColumn('string', 'Columns');
			<?php foreach($this->mydata as $list){
				echo 'data.addColumn(\'number\', \''. str_replace("'", "\'", $list['listname']) .'\'); ';
			} ?>
			data.addRows(1);
			data.setValue(0, 0, '');
			<?php $i = 1;
			$array_detail = array();
			$dataForward = false;
			foreach($this->mydata as $list){
				echo 'data.setValue(0,'. $i .', '. $list['nbForward'] .'); ';
				if(!$dataForward && $list['nbForward'] != 0) $dataForward = true;
				array_push($array_detail, $list['listname'] .': '. $list['nbForward']);
				$i++;
			}
			$detailForward = implode("\n", $array_detail); ?>
			return data;
		}
		function drawForward(){
			var vis = new google.visualization.ColumnChart(document.getElementById('chartForward'));
			optionsColumnChart['title'] = '<?php echo str_replace("'", "\'", acymailing_translation('FORWARDED')); ?>';
			<?php if(!$dataForward) {echo	"optionsColumnChart['vAxis'] = {minValue:0, maxValue:100};";}
			else echo	"optionsColumnChart['vAxis'] = {minValue:0};"; ?>
			vis.draw(getDataForward(), optionsColumnChart);
		}

		google.load("visualization", "1", {packages: ["corechart"]});
		google.setOnLoadCallback(drawMailSent);
		google.setOnLoadCallback(drawOpen);
		google.setOnLoadCallback(drawBounce);
		google.setOnLoadCallback(drawClic);
		google.setOnLoadCallback(drawUnsub);
		google.setOnLoadCallback(drawForward);

		function showData(typeGraph){
			if(document.getElementById('exporteddata_' + typeGraph).style.display == 'none'){
				document.getElementById('exporteddata_' + typeGraph).style.display = '';
			}else{
				document.getElementById('exporteddata_' + typeGraph).style.display = 'none';
			}
		}
	</script>

	<div id="iframedoc"></div>
	<?php echo acymailing_translation('SEND_DATE').' : <span class="statnumber">'.acymailing_getDate($this->mailing->senddate); ?></span><br/>

	<div class="acychart mailingListChart" width="350px" height="350px">
		<div id="chartMailSent"></div>
		<img style="position:relative;cursor:pointer;margin-top:-30px;" onclick="showData('sent');" class="donotprint" src="<?php echo ACYMAILING_IMAGES.'smallexport.png'; ?>" alt="<?php echo acymailing_translation('VIEW_DETAILS', true) ?>" title="<?php echo acymailing_translation('VIEW_DETAILS', true) ?>" width="30px"/>
		<textarea cols="25" rows="9" id="exporteddata_sent" style="display:none;position:absolute;margin-top:-160px;z-index:2;width:300px;" class="donotprint"><?php echo $detailSent; ?></textarea>
	</div>
	<div class="acychart mailingListChart" width="350px" height="350px">
		<div id="chartMailOpen"></div>
		<img style="position:relative;cursor:pointer;margin-top:-30px;" onclick="showData('open');" class="donotprint" src="<?php echo ACYMAILING_IMAGES.'smallexport.png'; ?>" alt="<?php echo acymailing_translation('VIEW_DETAILS', true) ?>" title="<?php echo acymailing_translation('VIEW_DETAILS', true) ?>" width="30px"/>
		<textarea cols="35" rows="9" id="exporteddata_open" style="display:none;position:absolute;margin-top:-160px;z-index:2;width:300px;" class="donotprint"><?php echo $detailOpen; ?></textarea>
	</div>

	<!--[if !IE]><!-->
	<div style="page-break-after: always;">&nbsp;</div>
	<!--<![endif]-->
	<div class="acychart mailingListChart" width="350px" height="350px">
		<div id="chartClic"></div>
		<img style="position:relative;cursor:pointer;margin-top:-30px;" onclick="showData('clic');" class="donotprint" src="<?php echo ACYMAILING_IMAGES.'smallexport.png'; ?>" alt="<?php echo acymailing_translation('VIEW_DETAILS', true) ?>" title="<?php echo acymailing_translation('VIEW_DETAILS', true) ?>" width="30px"/>
		<textarea cols="35" rows="9" id="exporteddata_clic" style="display:none;position:absolute;margin-top:-160px;z-index:2;width:300px;" class="donotprint"><?php echo $detailClic; ?></textarea>
	</div>
	<div class="acychart mailingListChart <?php echo($dataForward == false ? 'noDataChart' : ''); ?>" width="350px" height="350px">
		<div id="chartForward"></div>
		<img style="position:relative;cursor:pointer;margin-top:-30px;" onclick="showData('forward');" class="donotprint" src="<?php echo ACYMAILING_IMAGES.'smallexport.png'; ?>" alt="<?php echo acymailing_translation('VIEW_DETAILS', true) ?>" title="<?php echo acymailing_translation('VIEW_DETAILS', true) ?>" width="30px"/>
		<textarea cols="35" rows="9" id="exporteddata_forward" style="display:none;position:absolute;margin-top:-160px;z-index:2;width:300px;" class="donotprint"><?php echo $detailClic; ?></textarea>
	</div>

	<?php echo($dataForward != false ? '<!--[if !IE]><!--><div style="page-break-after: always">&nbsp;</div><!--<![endif]-->' : ''); ?>
	<div class="acychart mailingListChart" width="350px" height="350px">
		<div id="chartBounce"></div>
		<img style="position:relative;cursor:pointer;margin-top:-30px;" onclick="showData('bounce');" class="donotprint" src="<?php echo ACYMAILING_IMAGES.'smallexport.png'; ?>" alt="<?php echo acymailing_translation('VIEW_DETAILS', true) ?>" title="<?php echo acymailing_translation('VIEW_DETAILS', true) ?>" width="30px"/>
		<textarea cols="35" rows="9" id="exporteddata_bounce" style="display:none;position:absolute;margin-top:-160px;z-index:2;width:300px;" class="donotprint"><?php echo $detailBounce; ?></textarea>
	</div>
	<?php echo($dataForward == false ? '<!--[if !IE]><!--><div style="page-break-after: always">&nbsp;</div><!--<![endif]-->' : ''); ?>
	<div class="acychart mailingListChart" width="350px" height="350px">
		<div id="chartUnsubscribed"></div>
		<img style="position:relative;cursor:pointer;margin-top:-30px;" onclick="showData('unsub');" class="donotprint" src="<?php echo ACYMAILING_IMAGES.'smallexport.png'; ?>" alt="<?php echo acymailing_translation('VIEW_DETAILS', true) ?>" title="<?php echo acymailing_translation('VIEW_DETAILS', true) ?>" width="30px"/>
		<textarea cols="35" rows="9" id="exporteddata_unsub" style="display:none;position:absolute;margin-top:-160px;z-index:2;width:300px;" class="donotprint"><?php echo $detailUnsub; ?></textarea>
	</div>
</div>
components/com_acymailing/views/update/view.html.php000060400000006134152453623450016762 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class UpdateViewUpdate extends acymailingView{

    function display($tpl = null){

        $function = $this->getLayout();
        if(method_exists($this, $function)) $this->$function();

        parent::display($tpl);
    }

    function acysms(){
        $acyToolbar = acymailing_get('helper.toolbar');
        $acyToolbar->setTitle('AcySMS');
        $acyToolbar->display();

        $js = '
        function installAcySMS(){
            var progressbar = document.getElementById("progressbar");
            var information = document.getElementById("information");
            progressbar.style.width = "10%";
            information.innerHTML = "'.htmlspecialchars(acymailing_translation('ACY_DOWNLOADING'), ENT_QUOTES, 'UTF-8').'";
					
            var xhr = new XMLHttpRequest();
            xhr.open("GET", "'.acymailing_prepareAjaxURL('file').'&task=downloadAcySMS");
            xhr.onload = function(){
                if(xhr.responseText == "success") {
                    progressbar.style.width = "40%";
                    document.getElementById("information").innerHTML = "'.htmlspecialchars(acymailing_translation('ACY_INSTALLING'), ENT_QUOTES, 'UTF-8').'";
                    installPackage();
                }else{
                    document.getElementById("information").innerHTML = "'.str_replace('"', '\"', acymailing_translation_sprintf('ACY_FAILED_INSTALL', '<a href="https://www.acyba.com/download-area/download/component-acysms/level-express.html" target="_blank">', '</a>')).'";
                }
            };
            xhr.send();
        }

        function installPackage(){
            var progress = 40;
            var interval = setInterval(function(){
                if(progress >= 70) clearInterval(interval);
                if(progressbar.style.width != "100%") {
                    progress += 10;
                    progressbar.style.width = progress + "%";
                }
            }, 4000);
					
            var xhr = new XMLHttpRequest();
            xhr.open("GET", "'.acymailing_prepareAjaxURL('file').'&task=installPackage");
            xhr.onload = function(){
                if(xhr.responseText == "success") {
                    progressbar.style.width = "100%";
                    setTimeout(function(){ 
                        document.getElementById("meter").style.display = "none"; 
                        document.getElementById("postinstall").style.display = ""; 
                    }, 2000);
                }else{
                    document.getElementById("information").innerHTML = "'.str_replace('"', '\"', acymailing_translation_sprintf('ACY_FAILED_INSTALL', '<a href="https://www.acyba.com/download-area/download/component-acysms/level-express.html" target="_blank">', '</a>')).'";
                }
            };
            xhr.send();
        }';

        acymailing_addScript(true, $js);
    }
}
components/com_acymailing/views/update/index.html000060400000000054152453623450016324 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/update/tmpl/acysms.php000060400000015527152453623450017326 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content" class="installacysms">
    <div id="iframedoc"></div>
    <span style="font-weight: bold;"><i class="acyicon-statistic" style="margin-right: 10px;vertical-align:middle;"></i><?php echo acymailing_translation('ACY_SMS_PRESENTATION'); ?></span>
    <div id="startbutton" class="myacymailingarea"><button onclick="document.getElementById('meter').style.display = '';document.getElementById('startbutton').style.display = 'none';installAcySMS();"><?php echo acymailing_translation('ACY_TRY_IT'); ?></button></div>
    <div id="meter" style="display:none;">
        <div>
            <span id="progressbar"></span>
            <div id="information"></div>
        </div>
    </div>
    <div id="postinstall" style="display:none;font-weight: bold;margin-top: 15px;">
        <?php echo acymailing_translation_sprintf('ACY_INSTALLED', '<a href="https://www.acyba.com/member-area/your-subscription.html#acysms-uexpress" target="_blank">', '</a>'); ?>
        <div class="myacymailingarea"><a href="index.php?option=com_acysms" ><button><?php echo acymailing_translation('ACY_TRY_IT'); ?></button></a></div>
    </div>

    <div id="acy_main_features" style="max-width: 980px;margin:auto;margin-top:50px;">
        <div class="contentsize shadowleft" style="padding-top: 0px;">
            <div class="row-fluid">
                <div class="span8">
                    <h4>Send personalized messages</h4>
                    <ul>
                        <li><strong>Filter your users</strong> for targeted communication. Revive the customers who bought a product or the attenders of an event...</li>
                        <li>Create <strong>marketing campaigns</strong> with follow-up messages. <strong>Automatically send a SMS</strong> to your contact X days after his subscription.</li>
                        <li><strong>Personalize your communication</strong> using information from the user profile (ex: Happy birthday "John"!)</li>
                    </ul>
                </div>
                <div class="span4"><img style="margin-top: 40px;" src="https://www.acyba.com/images/main_features_acysms/acysms1.png" alt=""></div>
            </div>
        </div>
        <div class="greybg">
            <div class="contentsize shadowright">
                <div class="row-fluid">
                    <div class="span4"><img src="https://www.acyba.com/images/main_features_acysms/acysms2.png" alt=""></div>
                    <div class="span8">
                        <h4>Increase your sales thanks to sms</h4>
                        <ul>
                            <li>Send <strong>coupons and special offers</strong> via SMS to your customers.</li>
                            <li>Generate automatic messages for their orders ("Your order is shipped today"). <strong>Send reminders</strong> when the order is confirmed or shipped.</li>
                            <li>Combine AcySMS with <strong>your online store</strong>. AcySMS is integrated with the main e-commerce solutions for Joomla (Virtuemart, HikaShop, RedShop, MijoShop).</li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>
        <div class="contentsize shadowleft">
            <div class="row-fluid">
                <div class="span8">
                    <h4>GET STATISTICS ON EACH CAMPAIGN</h4>
                    <ul>
                        <li>Analyze the success of your campaigns, thanks to <strong>powerful statistics</strong>.&nbsp;</li>
                        <li>Check <strong>how many messages were sent</strong> and how many have failed. Get a detailed error if your message has not been sent.</li>
                        <li>AcySMS handles <strong>delivery reports</strong>, so that you can check who has received your message.</li>
                    </ul>
                </div>
                <div class="span4"><img src="https://www.acyba.com/images/main_features_acysms/acysms3.png" alt=""></div>
            </div>
        </div>
        <div class="greybg">
            <div class="contentsize shadowright">
                <div class="row-fluid">
                    <div class="span4"><img src="https://www.acyba.com/images/main_features_acysms/acysms4.png" alt=""></div>
                    <div class="span8">
                        <h4>PERFORM ACTIONS DEPENDING ON THE ANSWERS</h4>
                        <ul>
                            <li><strong>Unsubscribe users</strong> automatically from your lists ("STOP" word).</li>
                            <li>Send a specific message <strong>depending on the answer</strong> you received on your first SMS/Text Message.</li>
                            <li>As an option, you can even <strong>forward the SMS answer</strong> to the administrator.</li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>
        <div class="contentsize shadowleft">
            <div class="row-fluid">
                <div class="span8">
                    <h4>MANAGE AND ORGANIZE YOUR CONTACTS</h4>
                    <ul>
                        <li>Create new <strong>contacts</strong> or complete the current ones by adding <strong>custom fields</strong> to their profile.</li>
                        <li><strong>Add users</strong> directly inside AcySMS or <strong>use a user list</strong> that you already have in another component.</li>
                        <li>AcySMS is <strong>integrated with the main user management and e-commerce </strong><strong>extensions </strong> (AcyMailing, CB, JoomSocial, VM, HikaShop, RedShop, MijoShop)</li>
                    </ul>
                </div>
                <div class="span4"><img src="https://www.acyba.com/images/main_features_acysms/acysms5.png" alt=""></div>
            </div>
        </div>
        <div class="greybg">
            <div class="contentsize shadowright">
                <div class="row-fluid">
                    <div class="span4"><img src="https://www.acyba.com/images/main_features_acysms/acysms6.png" alt=""></div>
                    <div class="span8">
                        <h4>CHOOSE AMONG MANY GATEWAYS</h4>
                        <ul>
                            <li>More than 40 SMS providers available, so that you can find the <strong>best price</strong>.</li>
                            <li>Choose your favorite gateway and send <strong>SMS/</strong><strong>Text Messaging campaigns worldwide</strong>.</li>
                            <li><strong>No commitment</strong>. You only pay for what you use.</li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
components/com_acymailing/views/update/tmpl/index.html000060400000000054152453623450017300 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/cpanel/tmpl/interface.php000060400000045506152453623450017747 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="config_interface">
	<div class="onelineblockoptions">
		<span class="acyblocktitle"><?php echo acymailing_translation('MESSAGES'); ?></span>
		<table class="acymailing_table" cellspacing="1">
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('DISPLAY_MSG_SUBSCRIPTION_DESC').'<br /><br /><i>'.($this->config->get('require_confirmation', 0) ? acymailing_translation('CONFIRMATION_SENT') : acymailing_translation('SUBSCRIPTION_OK')).'</i>', acymailing_translation('DISPLAY_MSG_SUBSCRIPTION'), '', acymailing_translation('DISPLAY_MSG_SUBSCRIPTION')); ?>
				</td>
				<td>
					<?php echo $this->elements->subscription_message; ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('DISPLAY_MSG_CONFIRM_DESC').'<br /><br /><i>'.acymailing_translation('SUBSCRIPTION_CONFIRMED').'</i>', acymailing_translation('DISPLAY_MSG_CONFIRM'), '', acymailing_translation('DISPLAY_MSG_CONFIRM')); ?>
				</td>
				<td>
					<?php echo $this->elements->confirmation_message; ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('DISPLAY_MSG_UNSUBSCRIPTION_DESC'), acymailing_translation('DISPLAY_MSG_UNSUBSCRIPTION'), '', acymailing_translation('DISPLAY_MSG_UNSUBSCRIPTION')); ?>
				</td>
				<td>
					<?php echo $this->elements->unsubscription_message; ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('DISPLAY_MSG_CONFIRMATION_DESC'), acymailing_translation('DISPLAY_MSG_CONFIRMATION'), '', acymailing_translation('DISPLAY_MSG_CONFIRMATION')); ?>
				</td>
				<td>
					<?php echo $this->elements->confirm_message; ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('DISPLAY_MSG_WELCOME_DESC'), acymailing_translation('DISPLAY_MSG_WELCOME'), '', acymailing_translation('DISPLAY_MSG_WELCOME')); ?>
				</td>
				<td>
					<?php echo $this->elements->welcome_message; ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('DISPLAY_MSG_UNSUB_DESC'), acymailing_translation('DISPLAY_MSG_UNSUB'), '', acymailing_translation('DISPLAY_MSG_UNSUB')); ?>
				</td>
				<td>
					<?php echo $this->elements->unsub_message; ?>
				</td>
			</tr>
		</table>
	</div>
	<div class="onelineblockoptions">
		<span class="acyblocktitle">CSS</span>
		<table class="acymailing_table" cellspacing="1">
			<?php if(!empty($this->elements->css_module)){ ?>
			<tr>
				<td class="acykey">
					<?php
					if('joomla' == 'wordpress'){
						echo acymailing_translation('ACY_CSS_WIDGET');
					}else{
						echo acymailing_tooltip(acymailing_translation('CSS_MODULE_DESC'), acymailing_translation('CSS_MODULE'), '', acymailing_translation('CSS_MODULE'));
					}
					?>
				</td>
				<td>
					<?php echo $this->elements->css_module; ?>
				</td>
			</tr>
			<?php } ?>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('CSS_FRONTEND_DESC'), acymailing_translation('CSS_FRONTEND'), '', acymailing_translation('CSS_FRONTEND')); ?>
				</td>
				<td>
					<?php echo $this->elements->css_frontend; ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('ACY_CSS_BACKEND_DESC'), acymailing_translation('ACY_CSS_BACKEND'), '', acymailing_translation('ACY_CSS_BACKEND')); ?>
				</td>
				<td>
					<?php echo $this->elements->css_backend; ?>
				</td>
			</tr>
			<?php if(ACYMAILING_J30 && !empty($this->elements->bootstrap_frontend)){ ?>
				<tr>
					<td class="acykey">
						<?php echo acymailing_translation('USE_BOOTSTRAP_FRONTEND'); ?>
					</td>
					<td>
						<?php echo $this->elements->bootstrap_frontend; ?>
					</td>
				</tr>
			<?php } ?>
		</table>
	</div>
	<?php if(!empty($this->elements->use_sef)){ ?>
	<div class="onelineblockoptions">
		<span class="acyblocktitle"><?php echo acymailing_translation('FEATURES'); ?></span>
		<table class="acymailing_table" cellspacing="1">
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('FORWARD_DESC'), acymailing_translation('FORWARD_FEATURE'), '', acymailing_translation('FORWARD_FEATURE')); ?>
				</td>
				<td>
					<?php echo $this->elements->forward; ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('USE_SEF_DESC'), acymailing_translation('USE_SEF'), '', acymailing_translation('USE_SEF')); ?>
				</td>
				<td>
					<?php echo $this->elements->use_sef; ?>
				</td>
			</tr>
			<?php
			if(acymailing_level(3)){
				?>
				<tr>
					<td class="acykey">
						<?php echo acymailing_tooltip(acymailing_translation('ACY_FEATURE_SEND_IN_ARTICLE_DESC'), acymailing_translation('ACY_FEATURE_SEND_IN_ARTICLE'), '', acymailing_translation('ACY_FEATURE_SEND_IN_ARTICLE')); ?>
					</td>
					<td class="acykey">
						<?php echo $this->elements->edit_send_in_article ?>
					</td>
				</tr>
				<?php
			}
			?>
		</table>
	</div>
	<?php } ?>
	<div class="onelineblockoptions">
		<span class="acyblocktitle"><?php echo acymailing_translation('TRACKING'); ?></span>
		<table class="acymailing_table" cellspacing="1">
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation('TRACKINGSYSTEM'); ?>
				</td>
				<td>
					<?php echo $this->elements->tracking_system; ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation('ACY_TRACKINGSYSTEM_EXTERNAL_LINKS'); ?>
				</td>
				<td>
					<?php echo $this->elements->tracking_system_external_website; ?>
				</td>
			</tr>
		</table>
	</div>
	<?php if(!empty($this->elements->acymailing_menu)) { ?>
		<div class="onelineblockoptions">
			<span class="acyblocktitle"><?php echo acymailing_translation('MENU'); ?></span>
			<table class="acymailing_table" cellspacing="1">
				<tr>
					<td class="acykey">
						<?php echo acymailing_tooltip(acymailing_translation('ACYMAILING_MENU_DESC'), acymailing_translation('ACYMAILING_MENU'), '', acymailing_translation('ACYMAILING_MENU')); ?>
					</td>
					<td>
						<?php echo $this->elements->acymailing_menu; ?>
					</td>
				</tr>
			</table>
		</div>
	<?php
		}
		if(!empty($this->elements->editor)){
	?>
	<div class="onelineblockoptions">
		<span class="acyblocktitle"><?php echo acymailing_translation('ACY_EDITOR'); ?></span>
		<table class="acymailing_table" cellspacing="1">
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('EDITOR_DESC'), acymailing_translation('ACY_EDITOR'), '', acymailing_translation('ACY_EDITOR')); ?>
				</td>
				<td>
					<?php echo $this->elements->editor; ?>
				</td>
			</tr>
		</table>
	</div>
	<?php
		}
		if(!empty($this->elements->indexFollow)){
	?>
	<div class="onelineblockoptions">
		<span class="acyblocktitle"><?php echo acymailing_translation('ARCHIVE_SECTION'); ?></span>
		<table class="acymailing_table" cellspacing="1">
			<?php
			if(file_exists(ACYMAILING_ROOT.'components'.DS.'com_jcomments'.DS.'jcomments.php')){
				$jcomments = ($this->config->get('comments_feature') == 'jcomments') ? 'checked="checked"' : '';
			}else{
				$jcomments = 'disabled="disabled"';
			}
			if(file_exists(ACYMAILING_ROOT.'components'.DS.'com_rscomments')){
				$rscomments = ($this->config->get('comments_feature') == 'rscomments') ? 'checked="checked"' : '';
			}else{
				$rscomments = 'disabled="disabled"';
			}
			if(file_exists(ACYMAILING_ROOT.'components'.DS.'com_komento')){
				$komento = ($this->config->get('comments_feature') == 'komento') ? 'checked="checked"' : '';
			}else{
				$komento = 'disabled="disabled"';
			}
			if(file_exists(ACYMAILING_ROOT.'plugins'.DS.'content'.DS.'jom_comment_bot.php')){
				$jomcomment = ($this->config->get('comments_feature') == 'jomcomment') ? 'checked="checked"' : '';
			}else{
				$jomcomment = 'disabled="disabled"';
			}
			if($this->config->get('comments_feature') == 'disqus'){
				$disqus = 'checked="checked"';
			}else{
				$disqus = '';
			}
			$no_checked = $this->config->get('comments_feature') ? '' : 'checked="checked"';

			?>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('COMMENTS_ENABLED_DESC'), acymailing_translation('COMMENTS_ENABLED'), '', acymailing_translation('COMMENTS_ENABLED')); ?>
				</td>
				<td>
					<div class="controls">
						<input onclick="updateCommentsOption();" name="config[comments_feature]" id="config_comments_feature" value="" <?php echo $no_checked; ?> size="1" type="radio"/>
						<label for="config_comments_feature"><?php echo acymailing_translation('JOOMEXT_NO'); ?></label>
						<?php if('joomla' == 'joomla') { ?>
						<input onclick="updateCommentsOption();" name="config[comments_feature]" id="config_comments_feature_rscomments" value="rscomments" <?php echo $rscomments; ?> size="1" type="radio"/>
						<label for="config_comments_feature_rscomments">RSComments</label>
						<input onclick="updateCommentsOption();" name="config[comments_feature]" id="config_comments_feature_komento" value="komento" <?php echo $komento; ?> size="1" type="radio"/>
						<label for="config_comments_feature_komento">Komento</label>
						<input onclick="updateCommentsOption();" name="config[comments_feature]" id="config_comments_feature_jcomments" value="jcomments" <?php echo $jcomments; ?> size="1" type="radio"/>
						<label for="config_comments_feature_jcomments">jComments</label>
						<input onclick="updateCommentsOption();" name="config[comments_feature]" id="config_comments_feature_jomcomment" value="jomcomment" <?php echo $jomcomment; ?> size="1" type="radio"/>
						<label for="config_comments_feature_jomcomment">jomComment</label>
						<?php } ?>
						<input onclick="updateCommentsOption();" name="config[comments_feature]" id="config_comments_feature_disqus" value="disqus" <?php echo $disqus; ?> size="1" type="radio"/>
						<label for="config_comments_feature_disqus">Disqus</label>
					</div>
					<label for="config_disqus_shortname" style="display:<?php echo empty($disqus) ? "none" : "inline-block"; ?>;" id="config_disqus_shortname_label">Shortname : </label>
					<input type="text" name="config[disqus_shortname]" id="config_disqus_shortname" value="<?php echo $this->config->get('disqus_shortname'); ?>" size="1" style="width:100px;float:none;<?php if(empty($disqus)) echo "display:none;"; ?>"/>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('SUBJECT_DISPLAY_DESC'), acymailing_translation('SUBJECT_DISPLAY'), '', acymailing_translation('SUBJECT_DISPLAY')); ?>
				</td>
				<td>
					<?php echo acymailing_boolean("config[frontend_subject]", '', $this->config->get('frontend_subject', 1)); ?>
				</td>
			</tr>
			<?php if(!ACYMAILING_J16){ ?>
				<tr>
					<td class="acykey">
						<?php echo acymailing_tooltip(acymailing_translation('FRONTEND_PDF_DESC'), acymailing_translation('FRONTEND_PDF'), '', acymailing_translation('FRONTEND_PDF')); ?>
					</td>
					<td>
						<?php echo acymailing_boolean("config[frontend_pdf]", '', $this->config->get('frontend_pdf', 0)); ?>
					</td>
				</tr>
			<?php } ?>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('FRONTEND_PRINT_DESC'), acymailing_translation('FRONTEND_PRINT'), '', acymailing_translation('FRONTEND_PRINT')); ?>
				</td>
				<td>
					<?php echo acymailing_boolean("config[frontend_print]", '', $this->config->get('frontend_print', 0)); ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('SHOW_DESCRIPTION_DESC'), acymailing_translation('SHOW_DESCRIPTION'), '', acymailing_translation('SHOW_DESCRIPTION')); ?>
				</td>
				<td>
					<?php echo acymailing_boolean("config[show_description]", '', $this->config->get('show_description', 1)); ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('SHOW_FILTER_DESC'), acymailing_translation('SHOW_FILTER'), '', acymailing_translation('SHOW_FILTER')); ?>
				</td>
				<td>
					<?php echo acymailing_boolean("config[show_filter]", '', $this->config->get('show_filter', 1)); ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation('ACY_ORDER'); ?>
				</td>
				<td>
					<?php echo acymailing_boolean("config[show_order]", '', $this->config->get('show_order', 1)); ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('SHOW_SENDDATE_DESC'), acymailing_translation('SHOW_SENDDATE'), '', acymailing_translation('SHOW_SENDDATE')); ?>
				</td>
				<td>
					<?php echo acymailing_boolean("config[show_senddate]", '', $this->config->get('show_senddate', 1)); ?>
				</td>
			</tr>
			<?php if(acymailing_level(1)){ ?>
				<tr>
					<td class="acykey">
						<?php echo acymailing_translation_sprintf('SHOW_COLUMN_X', '<b><i>'.acymailing_translation('RECEIVE_VIA_EMAIL').'</i></b>'); ?>
					</td>
					<td>
						<?php echo acymailing_boolean("config[show_receiveemail]", '', $this->config->get('show_receiveemail', 0)); ?>
					</td>
				</tr>
			<?php } ?>
			<tr>
				<td class="acykey" valign="top">
					<?php echo acymailing_tooltip(acymailing_translation('OPEN_POPUP_DESC'), acymailing_translation('OPEN_POPUP'), '', acymailing_translation('OPEN_POPUP')); ?>
				</td>
				<td>
					<?php echo acymailing_boolean("config[open_popup]", '', $this->config->get('open_popup', 1)); ?>
					<div style="margin-top:10px;">
						<?php echo acymailing_translation('CAPTCHA_WIDTH'); ?> <input type="text" name="config[popup_width]" style="float:none;width:40px" value="<?php echo intval($this->config->get('popup_width', 750)); ?>"/> x <?php echo acymailing_translation('CAPTCHA_HEIGHT'); ?> <input type="text" name="config[popup_height]" style="float:none;width:40px"
																																																																		value="<?php echo intval($this->config->get('popup_height', 550)); ?>"/>
					</div>
				</td>
			</tr>
			<tr id="indexfollow">
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('ARCHIVE_INDEX_FOLLOW_DESC'), acymailing_translation('ARCHIVE_INDEX_FOLLOW'), '', acymailing_translation('ARCHIVE_INDEX_FOLLOW')); ?>
				</td>
				<td>
					<?php echo $this->elements->indexFollow; ?>
				</td>
			</tr>
		</table>
	</div>
	<?php } ?>
	<div class="onelineblockoptions">
		<span class="acyblocktitle"><?php echo acymailing_translation('UNSUB_PAGE'); ?></span>
		<table class="acymailing_table" cellspacing="1">
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(str_replace('UNSUB_INTRO', acymailing_translation('UNSUB_INTRO'), $this->config->get('unsub_intro', 'UNSUB_INTRO')), acymailing_translation('UNSUB_INTRODUCTION'), '', acymailing_translation('UNSUB_INTRODUCTION')); ?>
				</td>
				<td>
					<textarea style="width:300px;" rows="5" name="config[unsub_intro]"><?php echo $this->config->get('unsub_intro', 'UNSUB_INTRO'); ?></textarea>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation('UNSUB_DISP_CHOICE'); ?>
				</td>
				<td>
					<?php echo acymailing_boolean("config[unsub_dispoptions]", '', $this->config->get('unsub_dispoptions', 1)); ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation('ACY_UNSUB_DISP_OTHER_SUBS'); ?>
				</td>
				<td>
					<?php echo acymailing_boolean("config[unsub_dispothersubs]", '', $this->config->get('unsub_dispothersubs', 0)); ?>
				</td>
			</tr>
			<tr>
				<td valign="top" class="acykey">
					<?php echo acymailing_translation('UNSUB_DISP_SURVEY'); ?>
				</td>
				<td>
					<?php echo acymailing_boolean("config[unsub_survey]", 'onclick="displaySurvey(this.value)"', $this->config->get('unsub_survey', 1));
					$reasons = unserialize($this->config->get('unsub_reasons'));
					?>
					<div id="unsub_reasons_area" class="acymailing_deploy" <?php if(!$this->config->get('unsub_survey', 1)) echo 'style="display:none"'; ?> >
						<div id="unsub_reasons">
							<?php
							foreach($reasons as $i => $oneReason){
								if(preg_match('#^[A-Z_]*$#', $oneReason)){
									$trans = acymailing_translation($oneReason);
								}else{
									$trans = $oneReason;
								}
								echo '<span style="font-size:8px">'.$trans.'</span><br /><input type="text" style="width:300px;margin-bottom: 3px;" value="'.$this->escape($oneReason).'" name="unsub_reasons[]" /><br />';
							} ?>
						</div>
						<a onclick="addUnsubReason();return false;" href='#' title="<?php echo $this->escape(acymailing_translation('FIELD_ADDVALUE')); ?>">
							<button class="acymailing_button_grey" onclick="return false">
								<?php echo acymailing_translation('FIELD_ADDVALUE'); ?>
							</button>
						</a>
					</div>
				</td>
			</tr>
		</table>
	</div>
	<?php if(!empty($this->elements->acyrss_format)){ ?>
	<div class="onelineblockoptions">
		<span class="acyblocktitle">RSS</span>
		<table class="acymailing_table" cellspacing="1">
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation('ACY_TYPE'); ?>
				</td>
				<td>
					<?php echo $this->elements->acyrss_format; ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation('ACY_NAME'); ?>
				</td>
				<td>
					<input type="text" style="width:200px" name="config[acyrss_name]" value="<?php echo $this->escape($this->config->get('acyrss_name', '')); ?>"/>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation('ACY_DESCRIPTION'); ?>
				</td>
				<td>
					<textarea style="width:300px;" rows="5" name="config[acyrss_description]"><?php echo $this->config->get('acyrss_description', ''); ?></textarea>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation('MAX_ARTICLE'); ?>
				</td>
				<td>
					<input type="text" style="width:50px" name="config[acyrss_element]" value="<?php echo intval($this->config->get('acyrss_element', 20)); ?>"/>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation('ACY_ORDER'); ?>
				</td>
				<td>
					<?php echo $this->elements->acyrss_order; ?>
				</td>
			</tr>
		</table>
	</div>
	<?php }
	if(acymailing_level(3) && 'joomla' == 'joomla') include(dirname(__FILE__).DS.'interface_enterprise.php'); ?>
	<script language="javascript" type="text/javascript">
		<!--
		function updateCommentsOption(){
			if(document.getElementById("config_comments_feature_disqus").checked){
				document.getElementById('config_disqus_shortname_label').style.display = 'inline-block';
				document.getElementById('config_disqus_shortname').style.display = '';
			}else{
				document.getElementById('config_disqus_shortname_label').style.display = 'none';
				document.getElementById('config_disqus_shortname').style.display = 'none';
			}
		}
		//-->
	</script>
</div>
components/com_acymailing/views/cpanel/tmpl/subscription.php000060400000025670152453623450020533 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="page-subscription">
	<div class="onelineblockoptions">
		<span class="acyblocktitle"><?php echo acymailing_translation('SUBSCRIPTION'); ?></span>
		<table class="acymailing_table" cellspacing="1">
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('ALLOW_VISITOR_DESC'), acymailing_translation('ALLOW_VISITOR'), '', acymailing_translation('ALLOW_VISITOR')); ?>
				</td>
				<td>
					<?php echo $this->elements->allow_visitor; ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('REQUIRE_CONFIRM_DESC'), acymailing_translation('REQUIRE_CONFIRM'), '', acymailing_translation('REQUIRE_CONFIRM')); ?>
				</td>
				<td>
					<?php echo $this->elements->require_confirmation; ?>
					<?php echo $this->elements->editConfEmail; ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('AUTO_SUBSCRIBE_DESC'), acymailing_translation('AUTO_SUBSCRIBE'), '', acymailing_translation('AUTO_SUBSCRIBE')); ?>
				</td>
				<td>
					<input class="inputbox" id="configautosub" name="config[autosub]" type="text" style="width:100px" value="<?php echo $this->escape($this->config->get('autosub', 'None')); ?>">
					<?php echo acymailing_popup(acymailing_completeLink('chooselist', true).'&amp;task=autosub&amp;values='.$this->config->get('autosub', 'None').'&amp;control=config', '<button class="acymailing_button_grey" onclick="return false">'.acymailing_translation('SELECT').'</button>', '', 650, 375, 'linkconfigautosub'); ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('ALLOW_MODIFICATION_DESC'), acymailing_translation('ALLOW_MODIFICATION'), '', acymailing_translation('ALLOW_MODIFICATION')); ?>
				</td>
				<td>
					<?php echo $this->elements->allow_modif; ?>
					<?php echo $this->elements->editModifEmail; ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation('GENERATE_NAME'); ?>
				</td>
				<td>
					<?php echo acymailing_boolean("config[generate_name]", '', $this->config->get('generate_name', 1)); ?>
				</td>
			</tr>
		</table>
	</div>
	<div class="onelineblockoptions">
		<span class="acyblocktitle"><?php echo acymailing_translation('NOTIFICATIONS'); ?></span>
		<table class="acymailing_table" cellspacing="1">
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('NOTIF_CREATE_DESC'), acymailing_translation('NOTIF_CREATE'), '', acymailing_translation('NOTIF_CREATE')); ?>
				</td>
				<td>
					<input class="inputbox" type="text" name="config[notification_created]" style="width:200px" value="<?php echo $this->escape($this->config->get('notification_created')); ?>">
					<?php echo $this->elements->edit_notification_created; ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('NOTIF_UNSUB_DESC'), acymailing_translation('NOTIF_UNSUB'), '', acymailing_translation('NOTIF_UNSUB')); ?>
				</td>
				<td>
					<input class="inputbox" type="text" name="config[notification_unsub]" style="width:200px" value="<?php echo $this->escape($this->config->get('notification_unsub')); ?>">
					<?php echo $this->elements->edit_notification_unsub; ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('NOTIF_UNSUBALL_DESC'), acymailing_translation('NOTIF_UNSUBALL'), '', acymailing_translation('NOTIF_UNSUBALL')); ?>
				</td>
				<td>
					<input class="inputbox" type="text" name="config[notification_unsuball]" style="width:200px" value="<?php echo $this->escape($this->config->get('notification_unsuball')); ?>">
					<?php echo $this->elements->edit_notification_unsuball; ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('NOTIF_REFUSE_DESC'), acymailing_translation('NOTIF_REFUSE'), '', acymailing_translation('NOTIF_REFUSE')); ?>
				</td>
				<td>
					<input class="inputbox" type="text" name="config[notification_refuse]" style="width:200px" value="<?php echo $this->escape($this->config->get('notification_refuse')); ?>">
					<?php echo $this->elements->edit_notification_refuse; ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('NOTIF_CONTACT_DESC'), acymailing_translation('NOTIF_CONTACT'), '', acymailing_translation('NOTIF_CONTACT')); ?>
				</td>
				<td>
					<input class="inputbox" type="text" name="config[notification_contact]" style="width:200px" value="<?php echo $this->escape($this->config->get('notification_contact')); ?>">
					<?php echo $this->elements->edit_notification_contact; ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('NOTIF_CONTACT_MENU_DESC'), acymailing_translation('NOTIF_CONTACT_MENU'), '', acymailing_translation('NOTIF_CONTACT_MENU')); ?>
				</td>
				<td>
					<input class="inputbox" type="text" name="config[notification_contact_menu]" style="width:200px" value="<?php echo $this->escape($this->config->get('notification_contact_menu')); ?>">
					<?php echo $this->elements->edit_notification_contact_menu; ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('NOTIF_CONFIRM_DESC'), acymailing_translation('NOTIF_CONFIRM'), '', acymailing_translation('NOTIF_CONFIRM')); ?>
				</td>
				<td>
					<input class="inputbox" type="text" name="config[notification_confirm]" style="width:200px" value="<?php echo $this->escape($this->config->get('notification_confirm')); ?>">
					<?php echo $this->elements->edit_notification_confirm; ?>
				</td>
			</tr>
		</table>
	</div>
	<div class="onelineblockoptions">
		<span class="acyblocktitle"><?php echo acymailing_translation('REDIRECTIONS'); ?></span>
		<table class="acymailing_table" cellspacing="1">
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('REDIRECTION_CONFIRM_DESC'), acymailing_translation('REDIRECTION_CONFIRM'), '', acymailing_translation('REDIRECTION_CONFIRM')); ?>
				</td>
				<td>
					<input class="inputbox" type="text" id="confirm_redirect" name="config[confirm_redirect]" style="width:250px" value="<?php echo $this->escape($this->config->get('confirm_redirect')); ?>">
				</td>
			</tr>
			<?php $redirectMessageModule = 'joomla' == 'joomla' ? '<br /><br /><i>'.acymailing_translation('REDIRECTION_NOT_MODULE').'</i>' : ''; ?>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('REDIRECTION_SUB_DESC').$redirectMessageModule, acymailing_translation('REDIRECTION_SUB'), '', acymailing_translation('REDIRECTION_SUB')); ?>
				</td>
				<td>
					<input class="inputbox" type="text" id="sub_redirect" name="config[sub_redirect]" style="width:250px" value="<?php echo $this->escape($this->config->get('sub_redirect')); ?>">
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('REDIRECTION_MODIF_DESC').$redirectMessageModule, acymailing_translation('REDIRECTION_MODIF'), '', acymailing_translation('REDIRECTION_MODIF')); ?>
				</td>
				<td>
					<input class="inputbox" type="text" id="modif_redirect" name="config[modif_redirect]" style="width:250px" value="<?php echo $this->escape($this->config->get('modif_redirect')); ?>">
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('REDIRECTION_UNSUB_DESC').$redirectMessageModule, acymailing_translation('REDIRECTION_UNSUB'), '', acymailing_translation('REDIRECTION_UNSUB')); ?>
				</td>
				<td>
					<input class="inputbox" type="text" id="unsub_redirect" name="config[unsub_redirect]" style="width:250px" value="<?php echo $this->escape($this->config->get('unsub_redirect')); ?>">
				</td>
			</tr>
			<?php if('joomla' == 'joomla') { ?>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('REDIRECTION_MODULE_DESC'), acymailing_translation('REDIRECTION_MODULE'), '', acymailing_translation('REDIRECTION_MODULE')); ?>
				</td>
				<td>
					<input class="inputbox" type="text" id="module_redirect" name="config[module_redirect]" style="width:250px" value="<?php echo $this->escape($this->config->get('module_redirect')); ?>">
				</td>
			</tr>
			<?php } ?>
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation('ACY_REDIRECT_TAGS'); ?>
				</td>
				<td>
					<?php echo acymailing_boolean("config[redirect_tags]", '', $this->config->get('redirect_tags', 0)); ?>
				</td>
			</tr>
		</table>
	</div>
	<div class="onelineblockoptions">
		<span class="acyblocktitle"><?php echo acymailing_translation('GEOLOCATION'); ?></span>
		<script language="JavaScript" type="text/javascript">
			function testAPI(id, newvalue){
				window.document.getElementById(id).className = 'onload';

				var xhr = new XMLHttpRequest();
				xhr.open('GET', '<?php echo acymailing_prepareAjaxURL('toggle'); ?>&task=' + id + '&value=' + newvalue);
				xhr.onload = function(){
					window.document.getElementById(id).innerHTML = xhr.responseText;
					window.document.getElementById(id).className = 'loading';
				};
				xhr.send();
			}
		</script>
		<table class="acymailing_table" cellspacing="1">
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('GEOLOCATION_TYPE_DESC'), acymailing_translation('GEOLOCATION_TYPE'), '', acymailing_translation('GEOLOCATION_TYPE')); ?>
				</td>
				<td>
					<?php echo $this->elements->geolocation; ?>
				</td>
			</tr>
			<?php if($this->elements->geoloc_api_key){ ?>
				<tr>
					<td class="acykey">
						<a href="http://ipinfodb.com/register.php" target="_blank"><?php echo acymailing_tooltip(acymailing_translation('GEOLOCATION_API_KEY_DESC'), 'IPInfoDB API key', '', 'IPInfoDB API key'); ?></a>
					</td>
					<td>
						<?php echo $this->elements->geoloc_api_key; ?>
					</td>
				</tr>
				<tr>
					<td colspan="2">

						<span id="testApiKey" class="acymailing_button_grey">
							<i class="acyicon-location"></i>
							<a style="color:#666;text-decoration:none;" href="javascript:void(0);" onclick="testAPI('testApiKey',window.document.getElementById('geoloc_api_key').value)"><?php echo acymailing_translation('GEOLOC_TEST_API_KEY'); ?></a>
						</span>
					</td>
				</tr>
				<tr>
					<td class="acykey">
						<a href="https://www.acyba.com/acymailing/350-acymailing-geolocation.html#accountsetup" target="_blank"><?php echo acymailing_tooltip(acymailing_translation('ACY_GOOGLE_MAP_KEY_DESC'), acymailing_translation('ACY_GOOGLE_MAP_KEY'), '', acymailing_translation('ACY_GOOGLE_MAP_KEY')) ?></a>
					</td>
					<td>
						<?php echo $this->elements->google_map_api_key; ?>
					</td>
				</tr>
			<?php } ?>
		</table>
	</div>
</div>
components/com_acymailing/views/cpanel/tmpl/queue.php000060400000013201152453623450017116 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="page-queue">
	<div class="onelineblockoptions">
		<span class="acyblocktitle"><?php echo acymailing_translation('QUEUE_PROCESS'); ?></span>
		<table class="acymailing_table" cellspacing="1">
			<?php if(acymailing_level(1)){ ?>
				<tr>
					<td class="acykey">
						<?php echo acymailing_tooltip(acymailing_translation('QUEUE_PROCESSING_DESC'), acymailing_translation('QUEUE_PROCESSING'), '', acymailing_translation('QUEUE_PROCESSING')); ?>
					</td>
					<td>
						<?php echo $this->elements->queue_type; ?>
					</td>
				</tr>
				<tr id="method_auto" <?php echo ($this->config->get('queue_type', 'auto') == 'onlyauto' || $this->config->get('queue_type', 'auto') == 'auto') ? '' : 'style="display:none"'; ?>>
					<td class="acykey">
						<?php echo acymailing_translation('AUTO_SEND_PROCESS'); ?>
					</td>
					<td>
						<?php echo acymailing_translation_sprintf('SEND_X_EVERY_Y', '<input class="inputbox" type="text" name="config[queue_nbmail_auto]" style="width:50px" value="'.intval($this->config->get('queue_nbmail_auto')).'" />', $this->elements->cron_frequency); ?>
					</td>
				</tr>
			<?php } ?>
			<tr id="method_manual" <?php echo ($this->config->get('queue_type', 'auto') == 'onlyauto') ? 'style="display:none"' : ''; ?>>
				<td class="acykey">
					<?php echo acymailing_translation('MANUAL_SEND_PROCESS'); ?>
				</td>
				<td>
					<?php echo acymailing_translation_sprintf('SEND_X_WAIT_Y', '<input class="inputbox" type="text" name="config[queue_nbmail]" style="width:50px" value="'.intval($this->config->get('queue_nbmail')).'" />', $this->elements->queue_pause); ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('MAX_NB_TRY_DESC'), acymailing_translation('MAX_NB_TRY'), '', acymailing_translation('MAX_NB_TRY')); ?>
				</td>
				<td>
					<?php echo acymailing_translation_sprintf('CONFIG_TRY', '<input class="inputbox" type="text" name="config[queue_try]" style="width:50px" value="'.intval($this->config->get('queue_try')).'">');
					echo ' '.acymailing_translation_sprintf('CONFIG_TRY_ACTION', $this->bounceaction->display('maxtry', $this->config->get('bounce_action_maxtry'))); ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation('ACY_MAX_EXECUTION_TIME'); ?>
				</td>
				<td>
					<?php
					echo acymailing_translation_sprintf('ACY_TIMEOUT_SERVER', ini_get('max_execution_time')).'<br />';
					$maxexecutiontime = intval($this->config->get('max_execution_time'));
					if(intval($this->config->get('last_maxexec_check')) > (time() - 20)){
						echo acymailing_translation_sprintf('ACY_TIMEOUT_CURRENT', $maxexecutiontime);
					}else{
						if(!empty($maxexecutiontime)){
							echo acymailing_translation_sprintf('ACY_MAX_RUN', $maxexecutiontime).'<br />';
						}
						echo '<span id="timeoutcheck" ><a href="javascript:void(0);" onclick="detectTimeout(\'timeoutcheck\')">'.acymailing_translation('ACY_TIMEOUT_AGAIN').'</a></span>';
					}
					?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation('ACY_ORDER_SEND_QUEUE'); ?>
				</td>
				<td>
					<?php
					$ordering = array();
					$ordering[] = acymailing_selectOption("subid, ASC", 'subid ASC');
					$ordering[] = acymailing_selectOption("subid, DESC", 'subid DESC');
					$ordering[] = acymailing_selectOption("rand", acymailing_translation('ACY_RANDOM'));
					echo acymailing_select($ordering, 'config[sendorder]', 'size="1" style="width:150px;" onchange="if(this.value == \'rand\'){alert(\''.acymailing_translation('ACY_NO_RAND_FOR_MULTQUEUE').'\')}"', 'value', 'text', $this->config->get('sendorder', 'subid,ASC'));
					?>
				</td>
			</tr>
		</table>
	</div>
	<?php if(acymailing_level(1)){
		include(dirname(__FILE__).DS.'cron.php');
	}
	if(acymailing_level(3)){ ?>
		<div class="onelineblockoptions">
			<span class="acyblocktitle"><?php echo acymailing_translation('PRIORITY'); ?></span>
			<table class="acymailing_table" cellspacing="1">
				<tr>
					<td class="acykey">
						<?php echo acymailing_tooltip(acymailing_translation('NEWS_PRIORITY_DESC'), acymailing_translation('NEWS_PRIORITY'), '', acymailing_translation('NEWS_PRIORITY')); ?>
					</td>
					<td>
						<input class="inputbox" type="text" name="config[priority_newsletter]" style="width:50px" value="<?php echo intval($this->config->get('priority_newsletter', 3)); ?>">
					</td>
				</tr>
				<tr>
					<td class="acykey">
						<?php echo acymailing_tooltip(acymailing_translation('FOLLOW_PRIORITY_DESC'), acymailing_translation('FOLLOW_PRIORITY'), '', acymailing_translation('FOLLOW_PRIORITY')); ?>
					</td>
					<td>
						<input class="inputbox" type="text" name="config[priority_followup]" style="width:50px" value="<?php echo intval($this->config->get('priority_followup', 2)); ?>">
					</td>
				</tr>
			</table>
		</div>
	<?php }
	if(acymailing_level(1) && !empty($this->elements->cron_plugins)){ ?>
		<div class="onelineblockoptions">
			<span class="acyblocktitle"><?php echo acymailing_translation('PLUGINS'); ?></span>
			<table class="acymailing_table" cellspacing="1">
				<tr>
					<td class="acykey">
						<?php echo acymailing_tooltip(acymailing_translation('ACY_DAILY_HOUR_PLUGINS_DESC'), acymailing_translation('ACY_DAILY_HOUR_PLUGINS'), '', acymailing_translation('ACY_DAILY_HOUR_PLUGINS')); ?>
					</td>
					<td>
						<?php echo $this->elements->cron_plugins; ?>
					</td>
				</tr>
			</table>
		</div>
	<?php } ?>
</div>
components/com_acymailing/views/cpanel/tmpl/acl.php000060400000004203152453623450016533 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="page-acl">
	<?php echo acymailing_cmsACL(); ?>
	<div class="onelineblockoptions">
		<span class="acyblocktitle"><?php echo acymailing_translation('ACY_ACL'); ?></span>
		<?php
		if(!acymailing_level(3)){
			echo '<a target="_blank" href="'.ACYMAILING_REDIRECT.'acymailing-features#mail">'.acymailing_translation('ONLY_FROM_ENTERPRISE').'</a>';
		}else{ ?>
			<table class="acymailing_table" cellspacing="1">
				<?php
				$acltable = acymailing_get('type.acltable');
				$aclcats['campaign'] = array('manage', 'delete', 'copy');
				$aclcats['configuration'] = array('manage');
				$aclcats['extra_fields'] = array('import');
				$aclcats['cpanel'] = array('manage');
				$aclcats['distribution'] = array('manage', 'copy', 'delete');
				$aclcats['lists'] = array('manage', 'delete', 'filter');
				$aclcats['newsletters'] = array('manage', 'delete', 'send', 'schedule', 'spam_test', 'copy', 'lists', 'attachments', 'sender_informations', 'meta_data', 'abtesting', 'inbox_actions');
				$aclcats['queue'] = array('manage', 'delete', 'process');
				$aclcats['simple_sending'] = array('manage');
				$aclcats['autonewsletters'] = array('manage', 'delete');
				$aclcats['tags'] = array('view');
				$aclcats['templates'] = array('view', 'manage', 'delete', 'copy');
				$aclcats['statistics'] = array('manage', 'delete');
				$aclcats['subscriber'] = array('view', 'manage', 'delete', 'export', 'import', 'zohoimport');
				foreach($aclcats as $category => $actions){ ?>
					<tr>
						<td width="185" class="acykey" valign="top">
							<?php $trans = acymailing_translation('ACY_'.strtoupper($category));
							if($trans == 'ACY_'.strtoupper($category)) $trans = acymailing_translation(strtoupper($category));
							echo $trans;
							?>
						</td>
						<td>
							<?php echo $acltable->display($category, $actions) ?>
						</td>
					</tr>
				<?php } ?>
			</table>
		<?php } ?>
	</div>
</div>
components/com_acymailing/views/cpanel/tmpl/default.php000060400000004321152453623450017421 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<div id="iframedoc"></div>
	<form action="<?php echo acymailing_completeLink('cpanel'); ?>" method="post" name="adminForm" autocomplete="off" id="adminForm">
		<?php acymailing_formOptions();

		echo $this->tabs->startPane('config_tab');

		echo $this->tabs->startPanel(acymailing_translation('MAIL_CONFIG'), 'config_mail');
		include(dirname(__FILE__).DS.'mail.php');
		echo $this->tabs->endPanel();

		echo $this->tabs->startPanel(acymailing_translation('QUEUE_PROCESS'), 'config_queue');
		include(dirname(__FILE__).DS.'queue.php');
		echo $this->tabs->endPanel();

		echo $this->tabs->startPanel(acymailing_translation('SUBSCRIPTION'), 'config_subscription');
		include(dirname(__FILE__).DS.'subscription.php');
		echo $this->tabs->endPanel();

		echo $this->tabs->startPanel(acymailing_translation('INTERFACE'), 'config_interface');
		include(dirname(__FILE__).DS.'interface.php');
		echo $this->tabs->endPanel();

		echo $this->tabs->startPanel(acymailing_translation('SECURITY'), 'config_security');
		include(dirname(__FILE__).DS.'security.php');
		echo $this->tabs->endPanel();

		if(file_exists(dirname(__FILE__).DS.'others.php')){
			echo $this->tabs->startPanel(acymailing_translation('OTHERS'), 'config_others');
			include(dirname(__FILE__).DS.'others.php');
			echo $this->tabs->endPanel();
		}

		echo $this->tabs->startPanel(acymailing_translation('ACCESS_LEVEL'), 'config_acl');
		include(dirname(__FILE__).DS.'acl.php');
		echo $this->tabs->endPanel();

		if(!empty($this->plugins) || !empty($this->integrationplugins)) {
			echo $this->tabs->startPanel(acymailing_translation('PLUGINS'), 'config_plugins');
			include(dirname(__FILE__) . DS . 'plugins.php');
			echo $this->tabs->endPanel();
		}

		echo $this->tabs->startPanel(acymailing_translation('LANGUAGES'), 'config_languages');
		include(dirname(__FILE__).DS.'languages.php');
		echo $this->tabs->endPanel();

		echo $this->tabs->endPane();
		?>

		<div class="clr"></div>

	</form>
</div>
components/com_acymailing/views/cpanel/tmpl/index.html000060400000000054152453623450017260 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/cpanel/tmpl/languages.php000060400000002713152453623450017746 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="config_languages">
	<div class="onelineblockoptions">
		<span class="acyblocktitle"><?php echo acymailing_translation('LANGUAGES') ?></span>
		<table class="acymailing_table" cellpadding="1">
			<thead>
			<tr>
				<th class="title titlenum">
					<?php echo acymailing_translation('ACY_NUM'); ?>
				</th>
				<th class="title titletoggle">
					<?php echo acymailing_translation('ACY_EDIT'); ?>
				</th>
				<th class="title">
					<?php echo acymailing_translation('ACY_NAME'); ?>
				</th>
				<th class="title titletoggle">
					<?php echo acymailing_translation('ACY_ID'); ?>
				</th>
			</tr>
			</thead>
			<tbody>
			<?php
			$k = 0;

			for($i = 0, $a = count($this->languages); $i < $a; $i++){
				$row =& $this->languages[$i];
				?>
				<tr class="<?php echo "row$k"; ?>">
					<td align="center" style="text-align:center">
						<?php echo $i + 1; ?>
					</td>
					<td align="center" style="text-align:center">
						<?php echo $row->edit; ?>
					</td>
					<td>
						<?php echo $row->name; ?>
					</td>
					<td align="center" style="text-align:center">
						<?php echo $row->language; ?>
					</td>
				</tr>
				<?php
				$k = 1 - $k;
			}
			?>
			</tbody>
		</table>
	</div>
</div>
components/com_acymailing/views/cpanel/tmpl/security.php000060400000013061152453623450017645 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="page-security">
	<?php if(acymailing_level(1)){
	}else{ ?>
		<div class="onelineblockoptions">
			<span class="acyblocktitle"><?php echo acymailing_translation('CAPTCHA'); ?></span>
			<table class="acymailing_table" cellspacing="1">
				<tr>
					<td class="acykey">
						<?php echo acymailing_translation('ENABLE_CATCHA'); ?>
					</td>
					<td>
						<?php echo acymailing_getUpgradeLink('essential'); ?>
					</td>
				</tr>
			</table>
		</div>
	<?php } ?>

	<div class="onelineblockoptions">
		<span class="acyblocktitle"><?php echo acymailing_translation('ADVANCED_EMAIL_VERIFICATION'); ?></span>
		<table class="acymailing_table" cellspacing="1">
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation('CHECK_DOMAIN_EXISTS'); ?>
				</td>
				<td>
					<?php
					if(function_exists('getmxrr')){
						echo acymailing_boolean("config[email_checkdomain]", '', $this->config->get('email_checkdomain', 0));
					}else{
						echo 'Function getmxrr not enabled';
					}
					?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation_sprintf('X_INTEGRATION', 'BotScout'); ?>
				</td>
				<td>
					<?php echo acymailing_boolean("config[email_botscout]", '', $this->config->get('email_botscout', 0)); ?>
					<br/>API Key: <input class="inputbox" type="text" name="config[email_botscout_key]" style="width:100px;float:none;" value="<?php echo $this->escape($this->config->get('email_botscout_key')) ?>"/>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation_sprintf('X_INTEGRATION', 'StopForumSpam'); ?>
				</td>
				<td>
					<?php echo acymailing_boolean("config[email_stopforumspam]", '', $this->config->get('email_stopforumspam', 0)); ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('IPTIMECHECK_DESC'), acymailing_translation('IPTIMECHECK'), '', acymailing_translation('IPTIMECHECK')); ?>
				</td>
				<td>
					<?php echo acymailing_boolean("config[email_iptimecheck]", '', $this->config->get('email_iptimecheck', 0)); ?>
				</td>
			</tr>
		</table>
	</div>

	<div class="onelineblockoptions">
		<span class="acyblocktitle"><?php echo acymailing_translation('ACY_FILES'); ?></span>
		<table class="acymailing_table" cellspacing="1">
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('ALLOWED_FILES_DESC'), acymailing_translation('ALLOWED_FILES'), '', acymailing_translation('ALLOWED_FILES')); ?>
				</td>
				<td>
					<input class="inputbox" type="text" name="config[allowedfiles]" style="width:250px" value="<?php echo $this->escape(strtolower(str_replace(' ', '', $this->config->get('allowedfiles')))); ?>"/>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('UPLOAD_FOLDER_DESC'), acymailing_translation('UPLOAD_FOLDER'), '', acymailing_translation('UPLOAD_FOLDER')); ?>
				</td>
				<td>
					<?php $uploadfolder = $this->config->get('uploadfolder');
					if(empty($uploadfolder)) $uploadfolder = ACYMAILING_MEDIA_FOLDER.'/upload'; ?>
					<input class="inputbox" type="text" name="config[uploadfolder]" style="width:250px" value="<?php echo $this->escape($uploadfolder); ?>"/>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('MEDIA_FOLDER_DESC'), acymailing_translation('MEDIA_FOLDER'), '', acymailing_translation('MEDIA_FOLDER')); ?>
				</td>
				<td>
					<?php $mediafolder = $this->config->get('mediafolder', ACYMAILING_MEDIA_FOLDER.'/upload');
					if(empty($mediafolder)) $mediafolder = ACYMAILING_MEDIA_FOLDER.'/upload'; ?>
					<input class="inputbox" type="text" name="config[mediafolder]" style="width:250px" value="<?php echo $this->escape($mediafolder); ?>"/>
				</td>
			</tr>
		</table>
	</div>
	<div class="onelineblockoptions">
		<span class="acyblocktitle"><?php echo acymailing_translation('DATABASE_MAINTENANCE'); ?></span>
		<table class="acymailing_table" cellspacing="1">
			<?php if(acymailing_level(1)){ ?>
				<tr>
					<td class="acykey">
						<?php echo acymailing_tooltip(acymailing_translation('DATABASE_MAINTENANCE_DESC').'<br />'.acymailing_translation('DATABASE_MAINTENANCE_DESC2'), acymailing_translation('DELETE_DETAILED_STATS'), '', acymailing_translation('DELETE_DETAILED_STATS')); ?>
					</td>
					<td>
						<?php echo $this->elements->delete_stats; ?>
					</td>
				</tr>
				<tr>
					<td class="acykey">
						<?php echo acymailing_tooltip(acymailing_translation('DATABASE_MAINTENANCE_DESC').'<br />'.acymailing_translation('DATABASE_MAINTENANCE_DESC2'), acymailing_translation('DELETE_HISTORY'), '', acymailing_translation('DELETE_HISTORY')); ?>
					</td>
					<td>
						<?php echo $this->elements->delete_history; ?>
					</td>
				</tr>
			<?php } ?>
			<?php if(acymailing_level(3)){ ?>
				<tr>
					<td class="acykey">
						<?php echo acymailing_tooltip(acymailing_translation('ACY_DELETE_CHARTS_DESC'), acymailing_translation('ACY_DELETE_CHARTS'), '', acymailing_translation('ACY_DELETE_CHARTS')); ?>
					</td>
					<td>
						<?php echo $this->elements->delete_charts; ?>
					</td>
				</tr>
			<?php } ?>
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation('DATABASE_INTEGRITY'); ?>
				</td>
				<td>
					<?php echo $this->elements->checkDB; ?>
				</td>
			</tr>
		</table>
	</div>
</div>
components/com_acymailing/views/cpanel/tmpl/plugins.php000060400000011052152453623450017455 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="config_plugins">

	<div class="acyblockoptions" style="width: 42%;min-width: 480px;">
		<span class="acyblocktitle"><?php echo acymailing_translation('PLUG_TAG') ?></span>
		<table class="acymailing_table" cellpadding="1">
			<thead>
			<tr>
				<th class="title titlenum">
					<?php echo acymailing_translation('ACY_NUM'); ?>
				</th>
				<th class="title">
					<?php echo acymailing_translation('ACY_NAME'); ?>
				</th>
				<th class="title titleid">
					<?php echo acymailing_translation('ACY_IS_UPDATE') ?>
				</th>
				<th class="title titletoggle">
					<?php echo acymailing_translation('ENABLED'); ?>
				</th>
				<th class="title titleid">
					<?php echo acymailing_translation('ACY_ID'); ?>
				</th>
			</tr>
			</thead>
			<tbody>
			<?php
			$k = 0;

			for($i = 0, $a = count($this->plugins); $i < $a; $i++){
				$row =& $this->plugins[$i];

				$publishedid = 'published_'.$row->id;
				?>
				<tr class="<?php echo "row$k"; ?>">
					<td align="center" style="text-align:center">
						<?php echo $i + 1 ?>
					</td>
					<td>
						<a target="_blank" href="<?php echo !ACYMAILING_J16 ? 'index.php?option=com_plugins&amp;view=plugin&amp;client=site&amp;task=edit&amp;cid[]=' : 'index.php?option=com_plugins&amp;task=plugin.edit&amp;extension_id=';
						echo $row->id ?>"><?php echo $row->name; ?></a>
					</td>
					<td style="text-align: center">
						<?php if(empty($row->needUpDate)){
							echo '<a href="#" class="acyicon-apply" onclick="return false;"></a>';
						}else{
							echo '<a href="https://www.acyba.com/acymailing/plugins.html#'.$row->element.'" class="acyicon-cancel" target="_blank"></a>';
						} ?>
					</td>
					<td align="center" style="text-align:center">
						<span id="<?php echo $publishedid ?>" class="loading"><?php echo $this->toggleClass->toggle($publishedid, $row->published, 'plugins') ?></span>
					</td>
					<td align="center" style="text-align:center">
						<?php echo $row->id; ?>
					</td>
				</tr>
				<?php
				$k = 1 - $k;
			}
			?>
			</tbody>
		</table>
	</div>
	<div class="acyblockoptions" style="width: 42%;min-width: 480px;">
		<span class="acyblocktitle"><?php echo acymailing_translation('PLUG_INTE') ?></span>
		<table class="acymailing_table" cellpadding="1">
			<thead>
			<tr>
				<th class="title titlenum">
					<?php echo acymailing_translation('ACY_NUM'); ?>
				</th>
				<th class="title">
					<?php echo acymailing_translation('ACY_NAME'); ?>
				</th>
				<th class="title">
					<?php echo acymailing_translation('ACY_IS_UPDATE') ?>
				</th>
				<th class="title titletoggle">
					<?php echo acymailing_translation('ENABLED'); ?>
				</th>
				<th class="title titleid">
					<?php echo acymailing_translation('ACY_ID'); ?>
				</th>
			</tr>
			</thead>
			<tbody>
			<?php
			$k = 0;

			for($i = 0, $a = count($this->integrationplugins); $i < $a; $i++){
				$row =& $this->integrationplugins[$i];

				$publishedid = 'published_'.$row->id;
				?>
				<tr class="<?php echo "row$k"; ?>">
					<td align="center" style="text-align:center">
						<?php echo $i + 1 ?>
					</td>
					<td>
						<a target="_blank" href="<?php echo !ACYMAILING_J16 ? 'index.php?option=com_plugins&amp;view=plugin&amp;client=site&amp;task=edit&amp;cid[]=' : 'index.php?option=com_plugins&amp;task=plugin.edit&amp;extension_id=';
						echo $row->id ?>"><?php echo $row->name; ?></a>
					</td>
					<td style="text-align: center">
						<?php if(empty($row->needUpDate)){
							echo '<a href="#" class="acyicon-apply" target="blank"></a>';
						}else{
							echo '<a href="https://www.acyba.com/acymailing/plugins.html#'.$row->element.'" class="acyicon-cancel" target="_blank"></a>';
						} ?>
					</td>
					<td align="center" style="text-align:center">
						<span id="<?php echo $publishedid ?>" class="spanloading"><?php echo $this->toggleClass->toggle($publishedid, $row->published, 'plugins') ?></span>
					</td>
					<td align="center" style="text-align:center">
						<?php echo $row->id; ?>
					</td>
				</tr>
				<?php
				$k = 1 - $k;
			}
			?>
			</tbody>
		</table>
	</div>
	<span class="acymailing_button" style="margin:15px;">
		<i class="acyicon-import"></i>
		<a style="margin-left:5px;color:#fff;text-decoration: none;" href="https://www.acyba.com/acymailing/plugins.html" target="_blank"><?php echo acymailing_translation('MORE_PLUGINS'); ?></a>
	</span>
</div>
components/com_acymailing/views/cpanel/tmpl/mail.php000060400000047423152453623450016731 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="page-mail">
	<div class="onelineblockoptions">
		<span class="acyblocktitle"><?php echo acymailing_translation('SENDER_INFORMATIONS'); ?></span>
		<table class="acymailing_table" cellspacing="1">
			<tr>
				<td width="185" class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('FROM_NAME_DESC'), acymailing_translation('FROM_NAME'), '', acymailing_translation('FROM_NAME')); ?>
				</td>
				<td>
					<input class="inputbox" type="text" name="config[from_name]" style="width:200px" value="<?php echo $this->escape($this->config->get('from_name')); ?>">
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('FROM_ADDRESS_DESC'), acymailing_translation('FROM_ADDRESS'), '', acymailing_translation('FROM_ADDRESS')); ?>
				</td>
				<td>
					<input class="inputbox" type="text" onchange="if(this.value.indexOf('@') == -1){ alert('Wrong email address supplied for the <?php echo addslashes(acymailing_translation('FROM_ADDRESS')); ?> field: '+this.value); return false; }" id="fromemail" name="config[from_email]" style="width:200px" value="<?php echo $this->escape($this->config->get('from_email')); ?>">
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('REPLYTO_NAME_DESC'), acymailing_translation('REPLYTO_NAME'), '', acymailing_translation('REPLYTO_NAME')); ?>
				</td>
				<td>
					<input class="inputbox" type="text" name="config[reply_name]" style="width:200px" value="<?php echo $this->escape($this->config->get('reply_name')); ?>">
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('REPLYTO_ADDRESS_DESC'), acymailing_translation('REPLYTO_ADDRESS'), '', acymailing_translation('REPLYTO_ADDRESS')); ?>
				</td>
				<td>
					<input class="inputbox" type="text" onchange="if(this.value.indexOf('@') == -1){ alert('Wrong email address supplied for the <?php echo addslashes(acymailing_translation('REPLYTO_ADDRESS')); ?> field: '+this.value); return false; }" id="replyemail" name="config[reply_email]" style="width:200px" value="<?php echo $this->escape($this->config->get('reply_email')); ?>">
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('BOUNCE_ADDRESS_DESC'), acymailing_translation('BOUNCE_ADDRESS'), '', acymailing_translation('BOUNCE_ADDRESS')); ?>
				</td>
				<td>
					<input class="inputbox" type="text" onchange="if(this.value.indexOf('@') == -1){ alert('Wrong email address supplied for the <?php echo addslashes(acymailing_translation('BOUNCE_ADDRESS')); ?> field: '+this.value); return false; }" id="bounceemail" name="config[bounce_email]" style="width:200px" value="<?php echo $this->escape($this->config->get('bounce_email')); ?>">
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_tooltip(acymailing_translation('ADD_NAMES_DESC'), acymailing_translation('ADD_NAMES'), '', acymailing_translation('ADD_NAMES')); ?>
				</td>
				<td>
					<?php echo $this->elements->add_names; ?>
				</td>
			</tr>
		</table>
	</div>

	<div class="onelineblockoptions">
		<span class="acyblocktitle"><?php echo acymailing_translation('MAIL_CONFIG'); ?></span>

		<div id="mailer_method">
			<?php $mailerMethod = $this->config->get('mailer_method', 'phpmail');
			if(!in_array($mailerMethod, array('elasticemail', 'smtp', 'qmail', 'sendmail', 'phpmail'))) $mailerMethod = 'phpmail';
			?>
			<?php
			if(!ACYMAILING_J30 || ACYMAILING_J40 || 'joomla' == 'wordpress'){
				?>
				<div class="acyblockoptions" style="float: left;">
					<span class="acyblocktitle" style="font-size:13px;"><?php echo acymailing_translation('SEND_SERVER'); ?></span>
					<span><input type="radio" name="config[mailer_method]" onclick="updateMailer('phpmail')" value="phpmail" <?php if($mailerMethod == 'phpmail') echo 'checked="checked"'; ?> id="mailer_phpmail"/><label for="mailer_phpmail"> PHP Mail Function</label></span>
					<span><input type="radio" name="config[mailer_method]" onclick="updateMailer('sendmail')" value="sendmail" <?php if($mailerMethod == 'sendmail') echo 'checked="checked"'; ?> id="mailer_sendmail"/><label for="mailer_sendmail"> SendMail</label></span>
					<span><input type="radio" name="config[mailer_method]" onclick="updateMailer('qmail')" value="qmail" <?php if($mailerMethod == 'qmail') echo 'checked="checked"'; ?> id="mailer_qmail"/><label for="mailer_qmail"> QMail</label></span>
				</div>
				<div class="acyblockoptions" style="float: left; margin-left: 20px;">
					<span class="acyblocktitle" style="font-size:13px;"><?php echo acymailing_translation('SEND_EXTERNAL'); ?></span>
					<span><input type="radio" name="config[mailer_method]" onclick="updateMailer('smtp')" value="smtp" <?php if($mailerMethod == 'smtp') echo 'checked="checked"'; ?> id="mailer_smtp"/><label for="mailer_smtp"> SMTP Server</label></span>
					<span><input type="radio" name="config[mailer_method]" onclick="updateMailer('elasticemail')" value="elasticemail" <?php if($mailerMethod == 'elasticemail') echo 'checked="checked"'; ?> id="mailer_elasticemail"/><label for="mailer_elasticemail"> Elastic Email</label></span>
				</div>
				<?php
			}else{
				$values = array('<div class="acyblockoptions" style="padding:10px;"><span class="acyblocktitle" style="font-size:13px;">'.acymailing_translation('SEND_SERVER').'</span>',
					acymailing_selectOption('phpmail', 'PHP Mail Function'),
					acymailing_selectOption('sendmail', 'SendMail'),
					acymailing_selectOption('qmail', 'QMail'),
					'</div><div class="acyblockoptions" style="padding:10px;"><span class="acyblocktitle" style="font-size:13px;">'.acymailing_translation('SEND_EXTERNAL').'</span>',
					acymailing_selectOption('smtp', 'SMTP Server'),
					acymailing_selectOption('elasticemail', 'Elastic Email'),
					'</div>');
				echo acymailing_radio($values, 'config[mailer_method]', 'onchange="updateMailer(this.value)"', 'value', 'text', $mailerMethod);
			}
			?>
		</div>
		<div style="clear: both;"></div>
		<div id="mailer_method_config">
			<div id="sendmail_config" style="display:none" class="acymailing_deploy">
				<span class="acyblocktitle">SendMail</span>
				<table class="acymailing_table" cellspacing="1">
					<tr>
						<td width="185" class="acykey">
							<?php echo acymailing_tooltip(acymailing_translation('SENDMAIL_PATH_DESC'), acymailing_translation('SENDMAIL_PATH'), '', acymailing_translation('SENDMAIL_PATH')); ?>
						</td>
						<td>
							<input class="inputbox" type="text" name="config[sendmail_path]" style="width:160px" value="<?php echo $this->config->get('sendmail_path', '/usr/sbin/sendmail') ?>"/>
						</td>
					</tr>
				</table>
			</div>
			<div id="smtp_config" style="display:none" class="acymailing_deploy">
				<span class="acyblocktitle"><?php echo acymailing_translation('SMTP_CONFIG'); ?></span>
				<table class="acymailing_table" cellspacing="1">
					<tr>
						<td width="185" class="acykey">
							<?php echo acymailing_tooltip(acymailing_translation('SMTP_SERVER_DESC'), acymailing_translation('SMTP_SERVER'), '', acymailing_translation('SMTP_SERVER')); ?>
						</td>
						<td>
							<input class="inputbox" type="text" name="config[smtp_host]" style="width:160px" value="<?php echo $this->escape($this->config->get('smtp_host')); ?>"/>
						</td>
					</tr>
					<tr>
						<td class="acykey">
							<?php echo acymailing_tooltip(acymailing_translation('SMTP_PORT_DESC'), acymailing_translation('SMTP_PORT'), '', acymailing_translation('SMTP_PORT')); ?>
						</td>
						<td>
							<input class="inputbox" type="text" name="config[smtp_port]" style="width:50px" value="<?php echo $this->escape($this->config->get('smtp_port')); ?>"/>
						</td>
					</tr>
					<tr>
						<td class="acykey">
							<?php echo acymailing_tooltip(acymailing_translation('SMTP_SECURE_DESC'), acymailing_translation('SMTP_SECURE'), '', acymailing_translation('SMTP_SECURE')); ?>
						</td>
						<td>
							<?php echo $this->elements->smtp_secured; ?>
						</td>
					</tr>
					<tr>
						<td class="acykey">
							<?php echo acymailing_tooltip(acymailing_translation('SMTP_ALIVE_DESC'), acymailing_translation('SMTP_ALIVE'), '', acymailing_translation('SMTP_ALIVE')); ?>
						</td>
						<td>
							<?php echo $this->elements->smtp_keepalive; ?>
						</td>
					</tr>
					<tr>
						<td class="acykey">
							<?php echo acymailing_tooltip(acymailing_translation('SMTP_AUTHENT_DESC'), acymailing_translation('SMTP_AUTHENT'), '', acymailing_translation('SMTP_AUTHENT')); ?>
						</td>
						<td>
							<?php echo $this->elements->smtp_auth; ?>
						</td>
					</tr>
					<tr>
						<td class="acykey">
							<?php echo acymailing_tooltip(acymailing_translation('USERNAME_DESC'), acymailing_translation('ACY_USERNAME'), '', acymailing_translation('ACY_USERNAME')); ?>
						</td>
						<td>
							<input class="inputbox" autocomplete="off" type="text" name="config[smtp_username]" style="width:200px" value="<?php echo $this->escape(acymailing_punycode($this->config->get('smtp_username'), 'emailToUTF8')); ?>"/>
						</td>
					</tr>
					<tr>
						<td class="acykey">
							<?php echo acymailing_tooltip(acymailing_translation('SMTP_PASSWORD_DESC'), acymailing_translation('SMTP_PASSWORD'), '', acymailing_translation('SMTP_PASSWORD')); ?>
						</td>
						<td>
							<input class="inputbox" autocomplete="off" type="text" name="config[smtp_password]" style="width:200px" value="<?php echo str_repeat('*', strlen($this->config->get('smtp_password'))); ?>"/>
						</td>
					</tr>
				</table>
				<?php echo $this->toggleClass->toggleText('guessport', '', 'config', acymailing_translation('ACY_GUESSPORT')); ?>
			</div>
			<div id="elasticemail_config" style="display:none" class="acymailing_deploy">
				<span class="acyblocktitle">Elastic Email</span>
				<?php echo acymailing_translation_sprintf('SMTP_DESC', 'Elastic Email'); ?>

				<table class="acymailing_table" cellspacing="1">
					<tr>
						<td width="185" class="acykey">
							<?php echo acymailing_translation('ACY_USERNAME'); ?>
						</td>
						<td>
							<input class="inputbox" autocomplete="off" type="text" name="config[elasticemail_username]" style="width:160px" value="<?php echo $this->config->get('elasticemail_username', '') ?>"/>
						</td>
					</tr>
					<tr>
						<td width="185" class="acykey">
							API Key
						</td>
						<td>
							<input class="inputbox" autocomplete="off" type="text" name="config[elasticemail_password]" style="width:160px" value="<?php echo str_repeat('*', strlen($this->config->get('elasticemail_password'))); ?>"/>
						</td>
					</tr>
					<tr>
						<td width="185" class="acykey">
							<?php echo acymailing_translation('SMTP_PORT'); ?>
						</td>
						<td>
							<?php
							$elasticPort = array();
							$elasticPort[] = acymailing_selectOption('25', 25);
							$elasticPort[] = acymailing_selectOption('2525', 2525);
							$elasticPort[] = acymailing_selectOption('rest', 'REST API');
							echo acymailing_radio($elasticPort, 'config[elasticemail_port]', 'size="1" ', 'value', 'text', $this->config->get('elasticemail_port', 'rest'));
							?>
						</td>
					</tr>
				</table>
				<?php echo acymailing_translation('NO_ACCOUNT_YET').' <a href="'.ACYMAILING_REDIRECT.'elasticemail" target="_blank" >'.acymailing_translation('CREATE_ACCOUNT').'</a>'; ?>
				<?php echo '<br /><a href="'.ACYMAILING_REDIRECT.'smtp_services" target="_blank">'.acymailing_translation('TELL_ME_MORE').'</a>'; ?>
			</div>
		</div>
	</div>
	<div class="onelineblockoptions">
		<span class="acyblocktitle"><?php echo acymailing_translation('ACY_SERVER_CONFIGURATION'); ?></span>
		<table width="100%">
			<tr>
				<td width="50%" valign="top">
					<table class="acymailing_table" cellspacing="1">
						<?php if(!empty($this->elements->special_chars)){ ?>
						<tr>
							<td class="acykey">
								<?php echo acymailing_tooltip(acymailing_translation('ACY_SPECIAL_CHARS_DESC'), acymailing_translation('ACY_SPECIAL_CHARS'), '', acymailing_translation('ACY_SPECIAL_CHARS')); ?>
							</td>
							<td>
								<?php echo $this->elements->special_chars; ?>
							</td>
						</tr>
						<?php } ?>
						<tr>
							<td class="acykey">
								<?php echo acymailing_tooltip(acymailing_translation('ENCODING_FORMAT_DESC'), acymailing_translation('ENCODING_FORMAT'), '', acymailing_translation('ENCODING_FORMAT')); ?>
							</td>
							<td>
								<?php echo $this->elements->encoding_format; ?>
							</td>
						</tr>
						<tr>
							<td class="acykey">
								<?php echo acymailing_tooltip(acymailing_translation('CHARSET_DESC'), acymailing_translation('CHARSET'), '', acymailing_translation('CHARSET')); ?>
							</td>
							<td>
								<?php echo $this->elements->charset; ?>
							</td>
						</tr>
						<tr>
							<td class="acykey">
								<?php echo acymailing_tooltip(acymailing_translation('WORD_WRAPPING_DESC'), acymailing_translation('WORD_WRAPPING'), '', acymailing_translation('WORD_WRAPPING')); ?>
							</td>
							<td>
								<input class="inputbox" type="text" name="config[word_wrapping]" style="width:50px" value="<?php echo $this->config->get('word_wrapping', 0) ?>">
							</td>
						</tr>
						<tr>
							<td class="acykey">
								<?php echo acymailing_tooltip(acymailing_translation('ACY_SSLCHOICE_DESC'), acymailing_translation('ACY_SSLCHOICE'), '', acymailing_translation('ACY_SSLCHOICE')); ?>
							</td>
							<td>
								<?php echo $this->elements->ssl_links; ?>
							</td>
						</tr>
						<tr>
							<td class="acykey">
								<?php echo acymailing_tooltip(acymailing_translation('EMBED_IMAGES_DESC'), acymailing_translation('EMBED_IMAGES'), '', acymailing_translation('EMBED_IMAGES')); ?>
							</td>
							<td>
								<?php echo $this->elements->embed_images; ?>
							</td>
						</tr>
						<tr>
							<td class="acykey">
								<?php echo acymailing_tooltip(acymailing_translation('EMBED_ATTACHMENTS_DESC'), acymailing_translation('EMBED_ATTACHMENTS'), '', acymailing_translation('EMBED_ATTACHMENTS')); ?>
							</td>
							<td>
								<?php echo $this->elements->embed_files; ?>
							</td>
						</tr>
						<tr>
							<td class="acykey">
								<?php echo acymailing_tooltip(acymailing_translation('MULTIPLE_PART_DESC'), acymailing_translation('MULTIPLE_PART'), '', acymailing_translation('MULTIPLE_PART')); ?>
							</td>
							<td>
								<?php echo $this->elements->multiple_part; ?>
							</td>
						</tr>
						<tr>
							<td class="acykey">
								<?php echo acymailing_tooltip(acymailing_translation('ACY_DKIM_DESC'), acymailing_translation('ACY_DKIM'), '', acymailing_translation('ACY_DKIM')); ?>
							</td>
							<td>
								<?php echo $this->elements->dkim; ?>
							</td>
						</tr>
					</table>
				</td>
			</tr>
			<tr>
				<td valign="top">

					<?php
					if(acymailing_level(1)){
						?>
						<div class="acyblockoptions acymailing_deploy" id="dkim_config" <?php echo ($this->config->get('dkim', 0) == 1) ? 'style="display:block"' : 'style="display:none"' ?> >
							<span class="acyblocktitle"><?php echo acymailing_translation('ACY_DKIM'); ?></span>
							<?php
							$domain = $this->config->get('dkim_domain', '');
							if(empty($domain)){
								$domain = preg_replace(array('#^https?://(www\.)*#i', '#^www\.#'), '', ACYMAILING_LIVE);
								$domain = substr($domain, 0, strpos($domain, '/'));
							}

							if(($this->config->get('dkim_selector', 'acy') != 'acy' && $this->config->get('dkim_selector', 'acy') != '') || $this->config->get('dkim_passphrase', '') != '' || acymailing_getVar('int', 'dkimletme')){
								?>
								<table class="acymailing_table" cellspacing="1">
									<tr>
										<td width="185" class="acykey">
											<?php echo acymailing_translation('DKIM_DOMAIN'); ?>
										</td>
										<td>
											<input class="inputbox" type="text" id="dkim_domain" name="config[dkim_domain]" style="width:160px" value="<?php echo $this->escape($domain); ?>"/> *
										</td>
									</tr>
									<tr>
										<td width="185" class="acykey">
											<?php echo acymailing_translation('DKIM_SELECTOR'); ?>
										</td>
										<td>
											<input class="inputbox" type="text" id="dkim_selector" name="config[dkim_selector]" style="width:160px" value="<?php echo $this->escape($this->config->get('dkim_selector', 'acy')); ?>"/> *
										</td>
									</tr>
									<tr>
										<td width="185" class="acykey">
											<?php echo acymailing_translation('DKIM_PRIVATE'); ?>
										</td>
										<td>
											<textarea cols="65" rows="16" id="dkim_private" style="width:460px;font-size:10px;" name="config[dkim_private]"><?php echo $this->config->get('dkim_private', ''); ?></textarea> *
										</td>
									</tr>
									<tr>
										<td width="185" class="acykey">
											<?php echo acymailing_translation('DKIM_PASSPHRASE'); ?>
										</td>
										<td>
											<input class="inputbox" type="text" id="dkim_passphrase" name="config[dkim_passphrase]" style="width:160px" value="<?php echo $this->escape($this->config->get('dkim_passphrase', '')); ?>"/>
										</td>
									</tr>
									<tr>
										<td width="185" class="acykey">
											<?php echo acymailing_translation('DKIM_IDENTITY'); ?>
										</td>
										<td>
											<input class="inputbox" type="text" id="dkim_identity" name="config[dkim_identity]" style="width:160px" value="<?php echo $this->escape($this->config->get('dkim_identity', '')); ?>"/>
										</td>
									</tr>
									<tr>
										<td width="185" class="acykey">
											<?php echo acymailing_translation('DKIM_PUBLIC'); ?>
										</td>
										<td>
											<textarea cols="65" rows="5" id="dkim_public" style="width:460px;font-size:10px;" name="config[dkim_public]"><?php echo $this->config->get('dkim_public', ''); ?></textarea>
										</td>
									</tr>
								</table>
							<?php }else{
								if($this->config->get('dkim_private', '') == '' || $this->config->get('dkim_public', '') == ''){
									echo 'Please save your AcyMailing configuration page first';
									acymailing_addScript(false, 'https://www.acyba.com/index.php?option=com_updateme&ctrl=generatedkim');
									?>
									<input type="hidden" id="dkim_private" name="config[dkim_private]"/>
									<input type="hidden" id="dkim_public" name="config[dkim_public]"/>

									<?php
								}else{
									$publicKey = trim(str_replace(array('acy._domainkey	IN	TXT	"', 'v=DKIM1;k=rsa;g=*;s=email;h=sha1;t=s;p=', '-----BEGIN PUBLIC KEY-----', '-----END PUBLIC KEY-----', "\n"), '', $this->config->get('dkim_public', '')), '"');

									echo acymailing_translation_sprintf('DKIM_CONFIGURE', '<input class="inputbox" type="text" id="dkim_domain" name="config[dkim_domain]" style="width:120px;" value="'.$this->escape($domain).'" />'); ?><br/>
									<?php echo acymailing_translation('DKIM_KEY') ?> <input type="text" readonly="readonly" onclick="select();" style="width:80px;font-size:10px;" value="acy._domainkey"/>
									<br/><?php echo acymailing_translation('DKIM_VALUE') ?> <input type="text" readonly="readonly" onclick="select();" style="width:220px;font-size:10px;" value="v=DKIM1;s=email;t=s;p=<?php echo $this->escape($publicKey); ?>"/>
									<br/><input type="checkbox" value="1" id="dkimletme" name="dkimletme"/> <label for="dkimletme"><?php echo acymailing_translation('DKIM_LET_ME'); ?></label>
									<?php
								}
								echo '<br />';
							} ?>
							<span class="acymailing_button_grey">
								<i class="acyicon-help"></i>
								<a style="color:#666;text-decoration: none;" href="https://www.acyba.com/acymailing/156-acymailing-dkim.html" target="_blank"><?php echo acymailing_translation('ACY_HELP'); ?></a>
							</span>
						</div>
						<?php
					}
					?>
				</td>
			</tr>
		</table>
	</div>
</div>
components/com_acymailing/views/cpanel/index.html000060400000000054152453623450016304 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/cpanel/view.html.php000060400000074551152453623450016752 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class CpanelViewCpanel extends acymailingView{
	
	function display($tpl = null){
		$toggleClass = acymailing_get('helper.toggle');
		$config = acymailing_config();

		$language = acymailing_getLanguageTag();

		$styleRemind = 'float:right;margin-right:30px;position:relative;';
		$loadLink = acymailing_popup(acymailing_completeLink('file', true).'&amp;task=latest&amp;code='.$language, acymailing_translation('LOAD_LATEST_LANGUAGE'), '', 800, 500, '', ' onclick="window.document.getElementById(\'acymailing_messages_warning\').style.display = \'none\';return true;" ');
		if(!file_exists(acymailing_getLanguagePath(ACYMAILING_ROOT, $language).DS.$language.'.com_acymailing.ini')){
			if($config->get('errorlanguagemissing', 1)){
				$notremind = '<small style="'.$styleRemind.'">'.$toggleClass->delete('acymailing_messages_warning', 'errorlanguagemissing_0', 'config', false, acymailing_translation('DONT_REMIND')).'</small>';
				acymailing_enqueueMessage(acymailing_translation('MISSING_LANGUAGE').' '.$loadLink.' '.$notremind, 'warning');
			}
		}elseif(version_compare(acymailing_translation('ACY_LANG_VERSION'), $config->get('version'), '<')){
			if($config->get('errorlanguageupdate', 1)){
				$notremind = '<small style="'.$styleRemind.'">'.$toggleClass->delete('acymailing_messages_warning', 'errorlanguageupdate_0', 'config', false, acymailing_translation('DONT_REMIND')).'</small>';
				acymailing_enqueueMessage(acymailing_translation('UPDATE_LANGUAGE').' '.$loadLink.' '.$notremind, 'warning');
			}
		}

		if($config->get('wronghttpsoption', 1) && $config->get('ssl_links', 1) == 0){
			if((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443) {
				$notremind = '<small style="'.$styleRemind.'">'.$toggleClass->delete('acymailing_messages_error', 'wronghttpsoption_0', 'config', false, acymailing_translation('DONT_REMIND')).'</small>';
				acymailing_enqueueMessage('If your site uses HTTPS on front-end, please make sure to turn On the "'.acymailing_translation('ACY_SSLCHOICE').'" option otherwise the links in your newsletters may not work properly (the unsubscribe link for instance).'.$notremind, 'error');
			}
		}

		$indexes = array('listsub', 'stats', 'list', 'mail', 'userstats', 'urlclick', 'history', 'template', 'queue', 'subscriber');
		$addIndexes = array('We recently optimized our database...');
		foreach($indexes as $oneTable){
			if($config->get('optimize_'.$oneTable, 1)) continue;
			$addIndexes[] = 'Please '.$toggleClass->toggleText('addindex', $oneTable, 'config', 'click here').' to add indexes on the '.$oneTable.' table';
		}
		if(count($addIndexes) > 1) acymailing_enqueueMessage($addIndexes, 'warning');



		$acyToolbar = acymailing_get('helper.toolbar');
		$acyToolbar->custom('test', acymailing_translation('SEND_TEST'), 'send', false);
		$acyToolbar->divider();
		$acyToolbar->addButtonOption('apply', acymailing_translation('ACY_APPLY'), 'apply', false);
		$acyToolbar->save();
		$acyToolbar->cancel();
		$acyToolbar->divider();
		$acyToolbar->help('config');
		$acyToolbar->setTitle(acymailing_translation('ACY_CONFIGURATION'), 'cpanel');
		$acyToolbar->display();

		$elements = new stdClass();
		$elements->add_names = acymailing_boolean("config[add_names]", '', $config->get('add_names', true));
		$elements->embed_images = acymailing_boolean("config[embed_images]", '', $config->get('embed_images', 0));
		$elements->embed_files = acymailing_boolean("config[embed_files]", '', $config->get('embed_files', 1));
		$elements->multiple_part = acymailing_boolean("config[multiple_part]", '', $config->get('multiple_part', 0));

		$mailerMethods = array('elasticemail', 'smtp', 'sendmail');
		$js = "function updateMailer(mailermethod){"."\n";
		foreach($mailerMethods as $oneMethod){
			$js .= " window.document.getElementById('".$oneMethod."_config').style.display = 'none'; "."\n";
		}
		$js .= "if(window.document.getElementById(mailermethod+'_config')) {window.document.getElementById(mailermethod+'_config').style.display = 'block';} }";
		$js .= 'document.addEventListener("DOMContentLoaded", function(){ updateMailer(\''.$config->get('mailer_method', 'phpmail').'\'); });';
		acymailing_addScript(true, $js);

		$encodingval = array();
		$encodingval[] = acymailing_selectOption('binary', 'Binary');
		$encodingval[] = acymailing_selectOption('quoted-printable', 'Quoted-printable');
		$encodingval[] = acymailing_selectOption('7bit', '7 Bit');
		$encodingval[] = acymailing_selectOption('8bit', '8 Bit');
		$encodingval[] = acymailing_selectOption('base64', 'Base 64');
		$elements->encoding_format = acymailing_select($encodingval, "config[encoding_format]", 'size="1" style="width:150px;"', 'value', 'text', $config->get('encoding_format', 'base64'));

		$charset = acymailing_get('type.charset');
		$elements->charset = $charset->display("config[charset]", $config->get('charset', 'UTF-8'));

		$securedVals = array();
		$securedVals[] = acymailing_selectOption('', '- - -');
		$securedVals[] = acymailing_selectOption('ssl', 'SSL');
		$securedVals[] = acymailing_selectOption('tls', 'TLS');
		$elements->smtp_secured = acymailing_select($securedVals, "config[smtp_secured]", 'size="1" style="width:100px;"', 'value', 'text', $config->get('smtp_secured'));

		$elements->smtp_auth = acymailing_boolean("config[smtp_auth]", '', $config->get('smtp_auth', 0));
		$elements->smtp_keepalive = acymailing_boolean("config[smtp_keepalive]", '', $config->get('smtp_keepalive', 1));

		$elements->allow_visitor = acymailing_boolean("config[allow_visitor]", '', $config->get('allow_visitor', 1));

		$elements->subscription_message = acymailing_boolean("config[subscription_message]", '', $config->get('subscription_message', 1));
		$elements->confirmation_message = acymailing_boolean("config[confirmation_message]", '', $config->get('confirmation_message', 1));
		$elements->unsubscription_message = acymailing_boolean("config[unsubscription_message]", '', $config->get('unsubscription_message', 1));
		$elements->welcome_message = acymailing_boolean("config[welcome_message]", '', $config->get('welcome_message', 1));
		$elements->unsub_message = acymailing_boolean("config[unsub_message]", '', $config->get('unsub_message', 1));
		$elements->confirm_message = acymailing_boolean("config[confirm_message]", '', $config->get('confirm_message', 0));

		if(acymailing_level(1)){
			$js = "function updateDKIM(dkimval){
						if(dkimval == 1){document.getElementById('dkim_config').style.display = 'block';}
						else{document.getElementById('dkim_config').style.display = 'none';}
						};";
			acymailing_addScript(true, $js);
			if(function_exists('openssl_sign')){
				$elements->dkim = acymailing_boolean("config[dkim]", 'onclick="updateDKIM(this.value)"', $config->get('dkim', 0));
			}else{
				$elements->dkim = '<input type="hidden" name="config[dkim]" value="0" />PHP Extension openssl not enabled';
			}

			$js = "function updateQueueProcess(newvalue){";
			$js .= "if(newvalue == 'onlyauto') {window.document.getElementById('method_auto').style.display = ''; window.document.getElementById('method_manual').style.display = 'none';}";
			$js .= "if(newvalue == 'auto') {window.document.getElementById('method_auto').style.display = ''; window.document.getElementById('method_manual').style.display = '';}";
			$js .= "if(newvalue == 'manual') {window.document.getElementById('method_auto').style.display = 'none'; window.document.getElementById('method_manual').style.display = '';}";
			$js .= '};';

			acymailing_addScript(true, $js);

			$queueType = array();
			$queueType[] = acymailing_selectOption('onlyauto', acymailing_translation('AUTO_ONLY'));
			$queueType[] = acymailing_selectOption('auto', acymailing_translation('AUTO_MAN'));
			$queueType[] = acymailing_selectOption('manual', acymailing_translation('MANUAL_ONLY'));
			$elements->queue_type = acymailing_radio($queueType, "config[queue_type]", 'onclick="updateQueueProcess(this.value);"', 'value', 'text', $config->get('queue_type', 'auto'));
		}else{
			$elements->dkim = acymailing_getUpgradeLink('essential');
		}

		$js = 'var selectedHTTPS = '.($config->get('ssl_links', 0) == 0 ? 'false;' : 'true;').'
		function confirmHTTPS(element){
			var clickedHTTPS = (element == 1);
			if(clickedHTTPS == selectedHTTPS) return true;
			if(clickedHTTPS){
				var cnfrm = confirm(\''.str_replace("'", "\'", acymailing_translation('ACY_SSLCHOICE_CONFIRMATION')).'\');
				if(!cnfrm){';
		if(ACYMAILING_J30){
			$js .= 'var labels = document.getElementById(\'config_ssl_linksfieldset\').getElementsByTagName(\'label\');
					if(labels[0].hasClass(\'btn-success\')){
						labels[1].click();
						return true;
					}else{
						labels[0].click();
						return true;
					}';
		}else{
			$js .= 'return false;';
		}
		$js .= '}
			}
			selectedHTTPS = clickedHTTPS;
			return true;
		}';
		acymailing_addScript(true, $js);
		$elements->ssl_links = acymailing_boolean("config[ssl_links]", 'onclick="return confirmHTTPS(this.value);"', $config->get('ssl_links', 0));

		$delayTypeManual = acymailing_get('type.delay');
		$elements->queue_pause = $delayTypeManual->display('config[queue_pause]', $config->get('queue_pause'), 0);
		$delayTypeAuto = acymailing_get('type.delay');
		$delayTypeAuto->onChange = "window.document.getElementById('autoFrequencyWarning').style.display='inline';";
		$onChangeMsg = '<span style="display:none;color:red;" id="autoFrequencyWarning">'.acymailing_translation('ACY_CRON_CHANGE_FREQUENCY_WARNING').'</span>';
		$elements->cron_frequency = $delayTypeAuto->display('config[cron_frequency]', $config->get('cron_frequency'), 2).$onChangeMsg;

		$js = "function detectTimeout(id){
				try{
					window.document.getElementById(id).className = 'onload';
					window.document.getElementById(id).innerHTML = '".str_replace("'", "\'", acymailing_translation('ACY_CLOSE_TIMEOUT'))."';

					var xhr = new XMLHttpRequest();
					xhr.open('GET', '".acymailing_prepareAjaxURL('stats')."&task=detecttimeout&seckey=".$config->get('security_key')."');
					xhr.onload = function(){
						document.getElementById(id).innerHTML = 'Done!';
						window.document.getElementById(id).className = 'loading';
					}
					xhr.send();
				}catch(err){
					alert('Could not load the max execution time value : '+err);
				}
				return;
		}";
		$maxexecutiontime = $config->get('max_execution_time');
		if(empty($maxexecutiontime) && (intval($config->get('last_maxexec_check')) < (time() - 60))){
			$js .= 'window.addEventListener("load", function() {detectTimeout(\'timeoutcheck\')});';
		}
		acymailing_addScript(true, $js);

		$script = '';

		$cssval = array('css_frontend' => 'component', 'css_module' => 'module', 'css_backend' => 'backend');
		foreach($cssval as $configval => $type){
			$myvals = array();
			$myvals[] = acymailing_selectOption('', acymailing_translation('ACY_NONE'));

			if($configval == 'css_backend'){
				$myvals[] = acymailing_selectOption('backend_custom', acymailing_translation('ACY_CUSTOM'));
				$editFileName = $config->get('css_backend', 'default');
			}else{
				$regex = '^'.$type.'_([-_a-z0-9]*)\.css$';
				$allCSSFiles = acymailing_getFiles(ACYMAILING_MEDIA.'css', $regex);

				$family = '';
				foreach($allCSSFiles as $oneFile){
					preg_match('#'.$regex.'#i', $oneFile, $results);
					$fileName = str_replace('default_', '', $results[1]);
					$fileNameArray = explode('_', $fileName);
					if(count($fileNameArray) == 2){
						if($fileNameArray[0] != $family){
							if(!empty($family)) $myvals[] = acymailing_selectOption('</OPTGROUP>');
							$family = $fileNameArray[0];
							$myvals[] = acymailing_selectOption('<OPTGROUP>', ucfirst($family));
						}
						unset($fileNameArray[0]);
						$fileName = implode('_', $fileNameArray);
					}

					$fileName = ucwords(str_replace('_', ' ', $fileName));
					$myvals[] = acymailing_selectOption($results[1], $fileName);
				}
				if(!empty($family)) $myvals[] = acymailing_selectOption('</OPTGROUP>');
				$editFileName = $type.'_'.$config->get($configval, 'default');
			}

			$currentVal = $config->get($configval, 'default');
			$aStyle = empty($currentVal) ? ' style="display:none" ' : '';
			$js = 'onchange="updateCSSLink(\''.$configval.'\',\''.$type.'\',this.value);"';

			$elements->$configval = acymailing_select($myvals, 'config['.$configval.']', 'class="inputbox" size="1" '.$js, 'value', 'text', $config->get($configval, 'default'), $configval.'_choice');
			$linkEdit = acymailing_completeLink("file", true)."&amp;task=css&amp;var=".$configval."&amp;file='+".$configval."+'";
			$elements->$configval .= ' '.acymailing_popup($linkEdit, '<i class="acyicon-edit" style="margin: 5px 5px 0px 5px; display: inline-block;"></i>', '', 800, 500, $configval.'_link', $aStyle);

			$script .= ' var '.$configval.' = "'.$editFileName.'"; ';
		}

		$script .= "
		function updateCSSLink(myid,type,newval){
			if(newval){
				document.getElementById(myid+'_link').style.display = '';
			}else{
				document.getElementById(myid+'_link').style.display = 'none';
			}
			
			if(myid == 'css_backend') filename = newval;
			else filename = type+'_'+newval;
			
			document.getElementById(myid+'_link').href = '".acymailing_completeLink('file&task=css', true)."&var='+myid+'&file='+filename;
			window[myid] = filename;
		}";
		acymailing_addScript(true, $script);

		$elements->colortype = acymailing_get('type.color');

		$link = 'index.php?option=com_acymailing&amp;tmpl=component&amp;ctrl=email&amp;task=edit&amp;mailid=send-in-article';
		$elements->edit_send_in_article = acymailing_popup($link, '<button class="acymailing_button_grey" onclick="return false">'.acymailing_translation('ACY_EDIT_ARTICLE_EMAIL').'</button>', '', 900, 700);

		if(acymailing_level(1)){
			$trackingMode = $config->get('trackingsystem', 'acymailing');
			$tracking_system = '<input type="checkbox" name="config[trackingsystem][]" id="trackingsystem[0]" value="acymailing" style="margin-left:10px" '.(stripos($trackingMode, 'acymailing') !== false ? 'checked="checked"' : '').'/> <label for="trackingsystem[0]">Acymailing</label>';
			$tracking_system .= '<input type="checkbox" name="config[trackingsystem][]" id="trackingsystem[1]" value="google" style="margin-left:10px;" '.(stripos($trackingMode, 'google') !== false ? 'checked="checked"' : '').'/> <label for="trackingsystem[1]">Google Analytics</label>';
			$tracking_system .= '<input type="hidden" name="config[trackingsystem][]" value="1"/>';
			$tracking_system_external_website = acymailing_boolean("config[trackingsystemexternalwebsite]", ' id="trackingsystemexternalwebsite"', $config->get('trackingsystemexternalwebsite', 1));
		}else{
			$tracking_system = acymailing_getUpgradeLink('essential');
			$tracking_system_external_website = acymailing_getUpgradeLink('essential');
		}
		$elements->tracking_system = $tracking_system;
		$elements->tracking_system_external_website = $tracking_system_external_website;

		if(acymailing_level(3)){
			$geolocAvailable = true;
			$geolocation = '<input type="hidden" name="config[geolocation]" value="0"/>';
			$geoloc_api_key = '';
			$google_map_api_key = '';
			if(!function_exists('curl_init')){
				$geolocAvailable = false;
				$geolocation .= 'The AcyMailing geolocation plugin needs the CURL library installed but it seems that it is not available on your server. Please contact your web hosting to set it up.';
			}
			if(!function_exists('json_decode')){
				if(!$geolocAvailable) $geolocation .= '<br />';
				$geolocAvailable = false;
				$geolocation .= 'The AcyMailing geolocation plugin can only work with PHP 5.2 at least. Please ask your web hosting to update your PHP version.';
			}

			if($geolocAvailable){
				$geoloc = $config->get('geolocation', '');
				$geolocation = '<span style="white-space:nowrap"><input type="checkbox" name="config[geolocation][]" id="geolocation_0" value="creation" style="margin-left:10px" '.(stripos($geoloc, 'creation') !== false ? 'checked="checked"' : '').'/> <label for="geolocation_0">'.acymailing_translation('ON_USER_CREATE').'</label></span>';
				$geolocation .= ' <span style="white-space:nowrap"><input type="checkbox" name="config[geolocation][]" id="geolocation_1" value="modify" style="margin-left:10px;" '.(stripos($geoloc, 'modify') !== false ? 'checked="checked"' : '').'/> <label for="geolocation_1">'.acymailing_translation('ON_USER_CHANGE').'</label></span>';
				$geolocation .= ' <span style="white-space:nowrap"><input type="checkbox" name="config[geolocation][]" id="geolocation_2" value="confirm" style="margin-left:10px;" '.(stripos($geoloc, 'confirm') !== false ? 'checked="checked"' : '').'/> <label for="geolocation_2">'.acymailing_translation('GEOLOC_CONFIRM_SUB').'</label></span>';
				$geolocation .= ' <span style="white-space:nowrap"><input type="checkbox" name="config[geolocation][]" id="geolocation_3" value="clic" style="margin-left:10px;" '.(stripos($geoloc, 'clic') !== false ? 'checked="checked"' : '').'/> <label for="geolocation_3">'.acymailing_translation('ON_USER_CLICK').'</label></span>';
				$geolocation .= ' <span style="white-space:nowrap"><input type="checkbox" name="config[geolocation][]" id="geolocation_4" value="open" style="margin-left:10px;" '.(stripos($geoloc, 'open') !== false ? 'checked="checked"' : '').'/> <label for="geolocation_4">'.acymailing_translation('ON_OPEN_NEWS').'</label></span>';
				$geolocation .= ' <span style="white-space:nowrap"><input type="checkbox" name="config[geolocation][]" id="geolocation_5" value="unsubscription" style="margin-left:10px;" '.(stripos($geoloc, 'unsubscription') !== false ? 'checked="checked"' : '').'/> <label for="geolocation_5">'.acymailing_translation('GEOLOC_UNSUB').'</label></span>';
				$geolocation .= '<input type="hidden" name="config[geolocation][]" value="1"/>';
				$geoloc_api_key = '<input class="inputbox" type="text" id="geoloc_api_key" name="config[geoloc_api_key]" style="width:450px" value="'.$this->escape($config->get('geoloc_api_key', '')).'">';
				$google_map_api_key = '<input class"inputbox" type="text" id="google_map_api_key" name="config[google_map_api_key]" style="width:450px" value="'.$this->escape($config->get('google_map_api_key', '')).'">';
			}
		}else{
			$geolocation = acymailing_getUpgradeLink('enterprise');
			$geoloc_api_key = false;
			$google_map_api_key = false;
		}
		$elements->geolocation = $geolocation;
		$elements->geoloc_api_key = $geoloc_api_key;
		$elements->google_map_api_key = $google_map_api_key;


		$link = acymailing_completeLink('email', true).'&amp;task=edit&amp;mailid=';
		$button = '<button class="acymailing_button_grey" onclick="return false">'.acymailing_translation('EDIT_NOTIFICATION_MAIL').'</button>';
		
		$elements->editConfEmail = acymailing_popup($link.'confirmation', '<button class="acymailing_button_grey" onclick="return false">'.acymailing_translation('EDIT_CONF_MAIL').'</button>', '', 800, 500, 'confirmemail');
		
		$elements->edit_notification_created = acymailing_popup($link.'notification_created', $button);
		$elements->edit_notification_refuse = acymailing_popup($link.'notification_refuse', $button);
		$elements->edit_notification_unsuball = acymailing_popup($link.'notification_unsuball', $button);
		$elements->edit_notification_unsub = acymailing_popup($link.'notification_unsub', $button);
		$elements->edit_notification_contact = acymailing_popup($link.'notification_contact', $button);
		$elements->edit_notification_contact_menu = acymailing_popup($link.'notification_contact_menu', $button);
		$elements->edit_notification_confirm = acymailing_popup($link.'notification_confirm', $button);
		$elements->editModifEmail = acymailing_popup($link.'modif', $button, '', 800, 500, 'modifemail');

		$link = acymailing_completeLink('cpanel', true).'&amp;task=checkDB';
		$elements->checkDB = acymailing_popup($link, '<button class="acymailing_button_grey" onclick="return false">'.acymailing_translation('DATABASE_INTEGRITY').'</button>');

		$js = "function addUnsubReason(){
			var input = document.createElement('input');
			input.name = 'unsub_reasons[]';
			input.style.width = '300px';
			input.style.margin = '3px 0px';
			input.type = 'text';
			document.getElementById('unsub_reasons').appendChild(input);
			var br = document.createElement('br');
			document.getElementById('unsub_reasons').appendChild(br);
		}
		function displaySurvey(surveyval){
			if(surveyval == 1){
				document.getElementById('unsub_reasons_area').style.display = 'block';
			}else{
				document.getElementById('unsub_reasons_area').style.display = 'none';
			}
		}
		";
		acymailing_addScript(true, $js);


		$langs = acymailing_getLanguages();
		$languages = array();

		foreach ($langs as $lang => $obj) {
			if (strlen($lang) != 5 || $lang == "xx-XX") continue;

			$oneLanguage = new stdClass();
			$oneLanguage->language = $lang;
			$oneLanguage->name = $obj->name;

			$linkEdit = acymailing_completeLink('file').'&task=language&code=' . $lang;
			$icon = $obj->exists ? 'edit' : 'new';
			$oneLanguage->edit = acymailing_popup($linkEdit, '<i class="acyicon-'.$icon.'" id="image' . $lang . '"></i>');

			$languages[] = $oneLanguage;
		}

		$js = "function updateConfirmation(newvalue){";
		$js .= "if(newvalue == 0) {window.document.getElementById('confirmemail').style.display = 'none'; window.document.getElementById('confirm_redirect').disabled = true;}else{window.document.getElementById('confirmemail').style.display = 'inline'; window.document.getElementById('confirm_redirect').disabled = false;}";
		$js .= '}';
		$js .= "function updateModification(newvalue){ if(newvalue != 'none') {window.document.getElementById('modifemail').style.display = 'none';}else{window.document.getElementById('modifemail').style.display = 'inline';}} ";
		$js .= 'window.addEventListener("load", function(){ updateModification(\''.$config->get('allow_modif', 'data').'\'); updateConfirmation('.$config->get('require_confirmation', 0).'); });';
		acymailing_addScript(true, $js);

		$elements->require_confirmation = acymailing_boolean("config[require_confirmation]", 'onclick="updateConfirmation(this.value)"', $config->get('require_confirmation', 0));

		$allowmodif = array();
		$allowmodif[] = acymailing_selectOption("none", acymailing_translation('JOOMEXT_NO'));
		$allowmodif[] = acymailing_selectOption("data", acymailing_translation('ONLY_SUBSCRIPTION'));
		$allowmodif[] = acymailing_selectOption("all", acymailing_translation('JOOMEXT_YES'));
		$elements->allow_modif = acymailing_radio($allowmodif, "config[allow_modif]", 'size="1" onclick="updateModification(this.value)"', 'value', 'text', $config->get('allow_modif', 'data'));

		if('joomla' == 'joomla') {
			$indexType = $config->get('indexFollow', '');
			$indexFollow = '<div style="float: left;"><input type="checkbox" name="config[indexFollow][]" id="indexFollow[0]" value="noindex" style="margin-left:10px" '.(stripos($indexType, 'noindex') !== false ? 'checked="checked"' : '').'/> <label for="indexFollow[0]">noindex</label></div>';
			$indexFollow .= '<div style="float: left;"><input type="checkbox" name="config[indexFollow][]" id="indexFollow[1]" value="nofollow" style="margin-left:10px" '.(stripos($indexType, 'nofollow') !== false ? 'checked="checked"' : '').'/> <label for="indexFollow[1]">nofollow</label></div>';
			$indexFollow .= '<input type="hidden" name="config[indexFollow][]" value="1"/>';
			$elements->indexFollow = $indexFollow;
			
			if(!ACYMAILING_J16){
				$query = 'SELECT a.name, a.id as itemid, b.title  FROM `#__menu` as a JOIN `#__menu_types` as b on a.menutype = b.menutype WHERE a.access = 0 ORDER BY b.title ASC,a.ordering ASC';
			}else{
				$orderby = ACYMAILING_J30 ? 'a.lft' : 'a.ordering';
				$query = 'SELECT a.alias as name, a.id as itemid, b.title  FROM `#__menu` as a JOIN `#__menu_types` as b on a.menutype = b.menutype WHERE a.access = 1 AND a.client_id=0 AND a.parent_id != 0 ORDER BY b.title ASC,'.$orderby.' ASC';
			}

			$joomMenus = acymailing_loadObjectList($query);

			$menuvalues = array();
			$menuvalues[] = acymailing_selectOption('0', acymailing_translation('ACY_NONE'));
			$lastGroup = '';
			foreach($joomMenus as $oneMenu){
				if($oneMenu->title != $lastGroup){
					if(!empty($lastGroup)) $menuvalues[] = acymailing_selectOption('</OPTGROUP>');
					$menuvalues[] = acymailing_selectOption('<OPTGROUP>', $oneMenu->title);
					$lastGroup = $oneMenu->title;
				}
				$menuvalues[] = acymailing_selectOption($oneMenu->itemid, $oneMenu->name);
			}

			$elements->acymailing_menu = acymailing_select($menuvalues, 'config[itemid]', 'size="1"', 'value', 'text', $config->get('itemid'));


			$acyrss_format = array();
			$acyrss_format[] = acymailing_selectOption('', acymailing_translation('ACY_NONE'));
			$acyrss_format[] = acymailing_selectOption('rss', 'RSS feed');
			$acyrss_format[] = acymailing_selectOption('atom', 'Atom feed');
			$acyrss_format[] = acymailing_selectOption('both', acymailing_translation('ACY_ALL'));
			$elements->acyrss_format = acymailing_select($acyrss_format, "config[acyrss_format]", 'size="1"', 'value', 'text', $config->get('acyrss_format', ''));

			$acyrss_order = array();
			$acyrss_order[] = acymailing_selectOption('senddate', acymailing_translation('SEND_DATE'));
			$acyrss_order[] = acymailing_selectOption('mailid', acymailing_translation('ACY_ID'));
			$acyrss_order[] = acymailing_selectOption('subject', acymailing_translation('ACY_TITLE'));
			$elements->acyrss_order = acymailing_select($acyrss_order, "config[acyrss_order]", 'size="1"', 'value', 'text', $config->get('acyrss_order', 'senddate'));
			
			if(version_compare(JVERSION, '3.1.2', '>=')) $elements->special_chars = acymailing_boolean("config[special_chars]", '', $config->get('special_chars', 0));

			$bootstrapFrontValues = array();
			$bootstrapFrontValues[] = acymailing_selectOption(0, acymailing_translation('JOOMEXT_NO'));
			$bootstrapFrontValues[] = acymailing_selectOption(1, 'Bootstrap 2');
			$bootstrapFrontValues[] = acymailing_selectOption(2, 'Bootstrap 3');
			$elements->bootstrap_frontend = acymailing_radio($bootstrapFrontValues, "config[bootstrap_frontend]", '', 'value', 'text', $config->get('bootstrap_frontend', 0));
			
			if(acymailing_level(1)){
				$js = 'var selectedForward = '.$config->get('forward', 0).'
					function confirmForward(clickedForward){
						if(clickedForward == selectedForward || clickedForward != 1) return true;

						var cnfrm = confirm(\''.str_replace("'", "\'", acymailing_translation('ACY_FORWARDCHOICE_CONFIRMATION')).'\');
						if(!cnfrm) return true;';

				if(ACYMAILING_J30){
					$js .= '
					var labels = document.getElementById("config_forwardfieldset").getElementsByTagName("label");
					for(oneLabel in labels){
						if(isNaN(oneLabel)) continue;
						if(labels[oneLabel].getAttribute("for") == "config_forward2"){
							labels[oneLabel].click();
						}
					}';
				}else{
					$js .= 'document.getElementById("config[forward]2").checked = true;';
				}

				$js .= '}';
				acymailing_addScript(true, $js);

				$forwardValues = array();
				$forwardValues[] = acymailing_selectOption(0, acymailing_translation('JOOMEXT_NO'));
				$forwardValues[] = acymailing_selectOption(1, acymailing_translation('JOOMEXT_YES'));
				$forwardValues[] = acymailing_selectOption(2, acymailing_translation('JOOMEXT_YES_FORWARD'));
				$elements->forward = acymailing_radio($forwardValues, "config[forward]", 'onclick="confirmForward(this.value);"', 'value', 'text', $config->get('forward', 0));

				$nextDate = $config->get('cron_plugins_next', time());

				$listHours = array();
				$listMinutess = array();
				for($i = 0; $i < 24; $i++){
					$value = $i < 10 ? '0'.$i : $i;
					$listHours[] = acymailing_selectOption($value, $value);
				}
				$hours = acymailing_select($listHours, 'cronplghours', 'class="inputbox" size="1" style="width:60px;"', 'value', 'text', acymailing_getDate($nextDate, 'H'));
				for($i = 0; $i < 60; $i += 5){
					$value = $i < 10 ? '0'.$i : $i;
					$listMinutess[] = acymailing_selectOption($value, $value);
				}
				$defaultMin = floor(acymailing_getDate($nextDate, 'i') / 5) * 5;
				$minutes = acymailing_select($listMinutess, 'cronplgminutes', 'class="inputbox" size="1" style="width:60px;"', 'value', 'text', $defaultMin);
				$elements->cron_plugins = $hours.' : '.$minutes;
			}else{
				$elements->forward = acymailing_getUpgradeLink('essential');
			}

			$elements->use_sef = acymailing_boolean("config[use_sef]", '', $config->get('use_sef', 0));
			
			$editorType = acymailing_get('type.editor');
			$elements->editor = $editorType->display('config[editor]', $config->get('editor'));

			if (!ACYMAILING_J16) {
				$plugins = acymailing_loadObjectList("SELECT name, element, published,id FROM `#__plugins` WHERE `folder` = 'acymailing' AND `element` NOT LIKE 'plg%' ORDER BY published DESC, name ASC");
			} else {
				$plugins = acymailing_loadObjectList("SELECT name, element, enabled as published,extension_id as id FROM `#__extensions` WHERE `state` <> -1 AND `folder` = 'acymailing' AND `type`= 'plugin' AND `element` NOT LIKE 'plg%' ORDER BY enabled DESC, name ASC");
			}

			if (!ACYMAILING_J16) {
				$integrationplugins = acymailing_loadObjectList("SELECT name, element, published,id FROM `#__plugins` WHERE (`folder` != 'acymailing' OR `element` LIKE 'plg%') AND (`name` LIKE '%acymailing%' OR `element` LIKE '%acymailing%') ORDER BY published DESC, name ASC");
			} else {
				$integrationplugins = acymailing_loadObjectList("SELECT name, element, enabled as published ,extension_id as id FROM `#__extensions` WHERE `state` <> -1 AND (`folder` != 'acymailing' OR `element` LIKE 'plg%') AND `type` = 'plugin' AND (`name` LIKE '%acymailing%' OR `element` LIKE '%acymailing%') ORDER BY enabled DESC, name ASC");
			}

			$pluginsNeedUpDate = json_decode($config->get('pluginNeedUpdate', ''));
			if(!empty($pluginsNeedUpDate)){
				foreach($plugins as $plugin){
					if(!in_array($plugin->id, $pluginsNeedUpDate)) continue;
					$plugin->needUpDate = true;
				}
				foreach($integrationplugins as $plugin){
					if(!in_array($plugin->id, $pluginsNeedUpDate)) continue;
					$plugin->needUpDate = true;
				}
			}

			$this->plugins = $plugins;
			$this->integrationplugins = $integrationplugins;

			if((!ACYMAILING_J16 AND !file_exists(ACYMAILING_ROOT.'plugins'.DS.'acymailing'.DS.'tagsubscriber.php')) OR (ACYMAILING_J16 AND !file_exists(ACYMAILING_ROOT.'plugins'.DS.'acymailing'.DS.'tagsubscriber'.DS.'tagsubscriber.php'))) acymailing_checkPluginsFolders();
		}

		$this->bounceaction = acymailing_get('type.bounceaction');
		$this->config = $config;
		$this->languages = $languages;
		$this->elements = $elements;

		$this->tabs = acymailing_get('helper.acytabs');
		$this->toggleClass = $toggleClass;

		return parent::display($tpl);
	}
}
components/com_acymailing/views/email/index.html000060400000000054152453623450016131 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/email/view.html.php000060400000037141152453623450016571 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php


class EmailViewEmail extends acymailingView{

	function display($tpl = null){
		$function = $this->getLayout();
		if(method_exists($this, $function)) $this->$function();


		parent::display($tpl);
	}

	function form(){
		$mailid = acymailing_getCID('mailid');
		if(empty($mailid)) $mailid = acymailing_getVar('string', 'mailid');

		$mailClass = acymailing_get('class.mail');
		$mail = $mailClass->get($mailid);

		if(empty($mail)){
			$config = acymailing_config();

			$mail = new stdClass();
			$mail->created = time();
			$mail->fromname = $config->get('from_name');
			$mail->fromemail = $config->get('from_email');
			$mail->replyname = $config->get('reply_name');
			$mail->replyemail = $config->get('reply_email');
			$mail->subject = '';
			$mail->type = acymailing_getVar('string', 'type');
			$mail->published = 1;
			$mail->visible = 0;
			$mail->html = 1;
			$mail->body = '';
			$mail->altbody = '';
			$mail->tempid = 0;
			$mail->alias = '';
		};

		$values = new stdClass();
		$values->maxupload = (acymailing_bytes(ini_get('upload_max_filesize')) > acymailing_bytes(ini_get('post_max_size'))) ? ini_get('post_max_size') : ini_get('upload_max_filesize');


		$toggleClass = acymailing_get('helper.toggle');

		if(acymailing_isAdmin()){
			$acyToolbar = acymailing_get('helper.toolbar');
			$acyToolbar->custom('', acymailing_translation('ACY_TEMPLATES'), 'template', false, 'displayTemplates(); return false;');
			$acyToolbar->custom('', acymailing_translation('TAGS'), 'tag', false, 'try{IeCursorFix();}catch(e){}; displayTags(); return false;');
			$acyToolbar->divider();
			$acyToolbar->custom('test', acymailing_translation('SEND_TEST'), 'send', false);
			$acyToolbar->custom('apply', acymailing_translation('ACY_APPLY'), 'apply', false);
			$acyToolbar->setTitle(acymailing_translation('ACY_EDIT'));
			$acyToolbar->topfixed = false;
			$acyToolbar->display();
		}

		$editor = acymailing_get('helper.editor');
		$editor->setTemplate($mail->tempid);
		$editor->name = 'editor_body';
		$editor->content = $mail->body;

		$js = "function updateAcyEditor(htmlvalue){";
		$js .= 'if(htmlvalue == \'0\'){window.document.getElementById("htmlfieldset").style.display = \'none\'}else{window.document.getElementById("htmlfieldset").style.display = \'block\'}';
		$js .= '}';

		$script = '
		var attachmentNb = 1;
		function addFileLoader(){
			if(attachmentNb > 9) return;
			window.document.getElementById("attachmentsdiv"+attachmentNb).style.display = "";
			attachmentNb++;
		}';

		$script .= "function deleteAttachment(i){
			document.getElementById('attachments'+i+'selection').innerHTML = '';
			document.getElementById('attachments'+i+'suppr').style.display = 'none';
			document.getElementById('attachments'+i).value = '';
			return;
		}";

		$script .= '
			document.addEventListener("DOMContentLoaded", function(){
				acymailing.submitbutton = function(pressbutton) {
					if (pressbutton == \'cancel\') {
						acymailing.submitform(pressbutton,document.adminForm);
						return;
					}';

		$url = acymailing_currentURL();
		if(strpos($url, 'send-in-article') !== false){
			$script .= '
						if(pressbutton == \'apply\' || pressbutton == \'test\'){
							var content = '.$editor->getContent().';
							var match = content.match(/{joomlacontent:current/);
							if(match == null){
								alert("'.acymailing_translation('ACY_TAG_ARTICLE').'");
								return false;
							}
						}';
		}

		$script .= 'if(window.document.getElementById("subject").value.length < 2){alert(\''.acymailing_translation('ENTER_SUBJECT', true).'\'); return false;}';
		$script .= $editor->jsCode();
		$script .= 'acymailing.submitform(pressbutton,document.adminForm);
				};
			 }); ';

		$script .= "var zoneToTag = 'editor';
		function insertTag(tag){
			if(zoneToTag == 'editor'){
				try{
					if(window.parent.tinymce){ parentTinymce = window.parent.tinymce; window.parent.tinymce = false; }
					jInsertEditorText(tag,'editor_body');
					if(typeof parentTinymce !== 'undefined'){ window.parent.tinymce = parentTinymce; }
					document.getElementById('iframetag').style.display = 'none';
					displayTags();
					return true;
				} catch(err){
					alert('Your editor does not enable AcyMailing to automatically insert the tag, please copy/paste it manually in your Newsletter');
					return false;
				}
			}else{
				try{
					simpleInsert(zoneToTag, tag);
					return true;
				} catch(err){
					alert('Error inserting the tag in the '+ zoneToTag + 'zone. Please copy/paste it manually in your Newsletter.');
					return false;
				}
			}
		}
		
		function simpleInsert(myField, myValue) {
			myField = document.getElementById(myField);
			if (document.selection) {
				myField.focus();
				sel = document.selection.createRange();
				sel.text = myValue;
			} else if (myField.selectionStart || myField.selectionStart == '0') {
				var startPos = myField.selectionStart;
				var endPos = myField.selectionEnd;
				myField.value = myField.value.substring(0, startPos)
					+ myValue
					+ myField.value.substring(endPos, myField.value.length);
			} else if (myField.tagName == 'DIV') {
				myField.innerHTML += myValue;
				document.getElementById('subject').value += myValue;
			} else {
				myField.value += myValue;
			}
		}
		
		document.addEventListener('DOMContentLoaded', function(){
			setTimeout(function() {
				document.getElementById('htmlfieldset').addEventListener('click', function(){
					zoneToTag = 'editor';
				});	
				
				var ediframe = document.getElementById('htmlfieldset').getElementsByTagName('iframe');
				if(ediframe && ediframe[0]){
					var children = ediframe[0].contentDocument.getElementsByTagName('*');
					for (var i = 0; i < children.length; i++) {
						children[i].addEventListener('click', function(){
							zoneToTag = 'editor';
						});			
					}
				}		
			}, 1000);
		});";

		$typeMail = 'news';
		if(strpos($mail->alias, 'notification') !== false){
			$typeMail = 'notification';
		}

		$iFrame = "'<iframe src=\'".acymailing_completeLink((acymailing_isAdmin() ? '' : 'front')."tag&task=tag&type=".$typeMail, true)."\' width=\'100%\' height=\'100%\' scrolling=\'auto\'></iframe>'";
		$script .= "var openTag = true;
					function displayTags(){
						var box = document.getElementById('iframetag');
						if(openTag){
							box.innerHTML = ".$iFrame.";
							box.style.display = 'block';
						}else{
							box.style.display = 'none';
						}
						
						if(openTag){
							box.className = 'slide_open';
						}else{
							box.className = box.className.replace('slide_open', '');
						}
						openTag = !openTag;
					}";

		$iFrame = "'<iframe src=\'".acymailing_completeLink((acymailing_isAdmin() ? '' : 'front')."template&task=theme", true)."\' width=\'100%\' height=\'100%\' scrolling=\'auto\'></iframe>'";
		$script .= "var openTemplate = true;
					function displayTemplates(){
						var box = document.getElementById('iframetemplate');
						if(openTemplate){
							box.innerHTML = ".$iFrame.";
							box.style.display = 'block';
						}else{
							box.style.display = 'none';
						}
						
						if(openTemplate){
							box.className = 'slide_open';
						}else{
							box.className = box.className.replace('slide_open', '');
						}
						openTemplate = !openTemplate;
					}";

		$script .= "function changeTemplate(newhtml,newtext,newsubject,stylesheet,fromname,fromemail,replyname,replyemail,tempid){
			if(newhtml.length>2){".$editor->setContent('newhtml')."}
			var vartextarea = document.getElementById('altbody');
			if(newtext.length>2) vartextarea.innerHTML = newtext;
			document.getElementById('tempid').value = tempid;
			
			if(fromname.length>1){document.getElementById('fromname').value = fromname;}
			if(fromemail.length>1){document.getElementById('fromemail').value = fromemail;}
			if(replyname.length>1){document.getElementById('replyname').value = replyname;}
			if(replyemail.length>1){document.getElementById('replyemail').value = replyemail;}
			if(newsubject.length>1){
				var subjectObj = document.getElementById('subject');
				if(subjectObj.tagName.toLowerCase() == 'input'){
					subjectObj.value = newsubject;
				}else{
				    subjectObj.innerHTML = newsubject;
				}
			}
			
			".$editor->setEditorStylesheet('tempid')."
			document.getElementById('iframetemplate').style.display = 'none';
			displayTemplates();
		}";

		$plugin = acymailing_getPlugin('acymailing', 'tagcontent');
		$this->params = new acyParameter($plugin->params);
		$this->acypluginsHelper = acymailing_get('helper.acyplugins');

		$contenttype = array();
		$contenttype[] = acymailing_selectOption("title", acymailing_translation('TITLE_ONLY'));
		$contenttype[] = acymailing_selectOption("intro", acymailing_translation('INTRO_ONLY'));
		$contenttype[] = acymailing_selectOption("text", acymailing_translation('FIELD_TEXT'));
		$contenttype[] = acymailing_selectOption("full", acymailing_translation('FULL_TEXT'));

		$titlelink = array();
		$titlelink[] = acymailing_selectOption("link", acymailing_translation('JOOMEXT_YES'));
		$titlelink[] = acymailing_selectOption("0", acymailing_translation('JOOMEXT_NO'));

		$authorname = array();
		$authorname[] = acymailing_selectOption("author", acymailing_translation('JOOMEXT_YES'));
		$authorname[] = acymailing_selectOption("0", acymailing_translation('JOOMEXT_NO'));

		$picts = array();
		$picts[] = acymailing_selectOption("1", acymailing_translation('JOOMEXT_YES'));
		$pictureHelper = acymailing_get('helper.acypict');
		if($pictureHelper->available()) $picts[] = acymailing_selectOption("resized", acymailing_translation('RESIZED'));
		$picts[] = acymailing_selectOption("0", acymailing_translation('JOOMEXT_NO'));

		if($mail->html == 1){
			$script .= "var zoneEditor = 'editor_body';";
		}else{
			$script .= "var zoneEditor = 'altbody';";
		}

		$script .= '
		
		var zoneToTag = \'altbody\';
		function initTagZone(html){ if(html == 0){ zoneEditor = \'altbody\'; }else{ zoneEditor = \'editor_body\'; }}
		
		var previousSelection = false;
		function insertTagCurrent(){
		var tag = \'{joomlacontent:current|\';
			var display = document.querySelector(\'input[name = "contenttype"]:checked\').value;
			var format = document.getElementById(\'contentformat\').value;
			var displayPict = document.querySelector(\'input[name = "pict"]:checked\').value;
			var clickTitle = document.querySelector(\'input[name = "titlelink"]:checked\').value;
			var author = document.querySelector(\'input[name = "author"]:checked\').value;
			var facebook = document.getElementById(\'facebook\').checked ;
			var linkedin = document.getElementById(\'linkedin\').checked;
			var twitter = document.getElementById(\'twitter\').checked;
			var google = document.getElementById(\'google\').checked;
			
			if(display == \'title\'){
				tag = tag + \' type:\'+display+\'|\';
			}else{
				tag = tag + \' type:\'+display+\'| format:\'+format+\'| pict:\'+displayPict+\'|\';
			}
			
			if(clickTitle == \'link\'){
				tag = tag + \' link|\';
			}
			if(author == \'author\'){
				tag = tag + \' author|\';
			}
			if(facebook || linkedin || twitter || google){
				tag = tag + \' share:\';
				if(facebook) tag = tag + \'facebook,\';
				if(linkedin) tag = tag + \'linkedin,\';
				if(twitter) tag = tag + \'twitter,\';
				if(google) tag = tag + \'google,\';
				tag = tag.slice(0, -1);
				tag = tag + \'|\';
			}
			tag = tag.slice(0, -1);
			tag = tag + \'}\';
			if(zoneEditor == \'editor_body\'){
				try{
					jInsertEditorText(tag,\'editor_body\',previousSelection);
					return true;
				} catch(err){
					alert(\'Your editor does not enable AcyMailing to automatically insert the tag, please copy / paste it manually in your Newsletter\');
					return false;
				}
			} else{
				try{
					simpleInsert(document.getElementById(zoneToTag), tag);
					return true;
				} catch(err){
					alert(\'Error inserting the tag in the \'+ zoneToTag + \'zone.Please copy / paste it manually in your Newsletter.\');
					return false;
				}
			}
		}
		
		function updateTag(){
			var display = document.querySelector(\'input[name = "contenttype"]:checked\').value;
			if(display == \'title\'){
				document.getElementById(\'format\').style.display = \'none\' ;
			}
			else if(display != \'title\'){
				document.getElementById(\'format\').style.display = \'table-row\' ;
			}
		}';

		acymailing_addScript(true, $js.$script);

		$this->picts = $picts;
		$this->titlelink = $titlelink;
		$this->authorname = $authorname;
		$this->contenttype = $contenttype;
		$this->toggleClass = $toggleClass;
		$this->editor = $editor;
		$this->values = $values;
		$this->mail = $mail;
		$tabs = acymailing_get('helper.acytabs');
		$this->tabs = $tabs;
	}

	function listing(){
		$article_id = acymailing_getVar('int', 'articleId');
		if(empty($article_id)) return;

		$pageInfo = new stdClass();
		$pageInfo->filter = new stdClass();
		$pageInfo->limit = new stdClass();
		$pageInfo->elements = new stdClass();

		$paramBase = ACYMAILING_COMPONENT.'.'.$this->getName();

		$pageInfo->search = acymailing_getUserVar($paramBase.".search", 'search', '', 'string');
		$pageInfo->search = strtolower(trim($pageInfo->search));
		$selectedCategory = acymailing_getUserVar($paramBase."filter_category", 'filter_category', 0, 'string');

		$pageInfo->limit->value = acymailing_getUserVar($paramBase.'.list_limit', 'limit', acymailing_getCMSConfig('list_limit'), 'int');
		$pageInfo->limit->start = acymailing_getUserVar($paramBase.'.limitstart', 'limitstart', 0, 'int');

		$filters = array();
		if(!empty($pageInfo->search)){
			$searchVal = '\'%'.acymailing_getEscaped($pageInfo->search, true).'%\'';
			$filters[] = "a.name LIKE $searchVal OR a.description LIKE $searchVal OR a.listid LIKE $searchVal";
		}
		$filters[] = "a.type = 'list'";
		if(!empty($selectedCategory)) $filters[] = 'a.category = '.acymailing_escapeDB($selectedCategory);

		if(!acymailing_isAdmin()){
			$listClass = acymailing_get('class.list');
			$lists = $listClass->getFrontendLists('listid');

			$filters[] = 'listid IN ('.implode(',', array_keys($lists)).')';
		}

		$query = 'SELECT a.*, d.name as creatorname, d.username, d.email';
		$query .= ' FROM '.acymailing_table('list').' as a';
		$query .= ' LEFT JOIN '.acymailing_table('users', false).' as d on a.userid = d.id';
		$query .= ' WHERE ('.implode(') AND (', $filters).')';
		$query .= ' ORDER BY a.name ASC';

		$rows = acymailing_loadObjectList($query, '', $pageInfo->limit->start, $pageInfo->limit->value);

		$queryCount = 'SELECT COUNT(a.listid) FROM  '.acymailing_table('list').' as a';
		if(!empty($pageInfo->search)) $queryCount .= ' LEFT JOIN '.acymailing_table('users', false).' as d on a.userid = d.id';
		$queryCount .= ' WHERE ('.implode(') AND (', $filters).')';

		$pageInfo->elements->total = acymailing_loadResult($queryCount);
		$pageInfo->elements->page = count($rows);

		$pagination = new acyPagination($pageInfo->elements->total, $pageInfo->limit->start, $pageInfo->limit->value);

		if(acymailing_isAdmin()){
			$acyToolbar = acymailing_get('helper.toolbar');
			$acyToolbar->custom('sendArticle', acymailing_translation('SEND'), 'send');
			$acyToolbar->setTitle(acymailing_translation('ACY_SELECT_LIST'), 'list');
			$acyToolbar->display();
		}

		$filters = new stdClass();
		$listcategoryType = acymailing_get('type.categoryfield');
		$filters->category = $listcategoryType->getFilter('list', 'filter_category', $selectedCategory, ' onchange="document.adminForm.submit();"');

		acymailing_addStyle(true, '.acyicon-send + span { display: inline-block !important; margin-left: 5px; }');

		$this->filters = $filters;
		$this->rows = $rows;
		$this->pageInfo = $pageInfo;
		$this->pagination = $pagination;
	}
}
components/com_acymailing/views/email/tmpl/param.form.php000060400000020542152453623450017667 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?>	<?php echo $this->tabs->startPane('mail_tab'); ?>
	<?php echo $this->tabs->startPanel(acymailing_translation('INFOS'), 'mail_infos'); ?>
	<br style="font-size:1px"/>

	<div class="onelineblockoptions">
		<table class="acymailing_smalltable" width="100%">
			<tr>
				<td class="paramlist_key">
					<label for="subject">
						<?php echo acymailing_translation('JOOMEXT_SUBJECT'); ?>
					</label>
				</td>
				<td class="paramlist_value">
					<input onClick="zoneToTag='subject';" type="text" name="data[mail][subject]" id="subject" class="inputbox" style="width:80%" value="<?php echo $this->escape(@$this->mail->subject); ?>"/>
				</td>
			</tr>
			<tr>
				<td class="paramlist_key">
					<?php echo acymailing_translation('SEND_HTML'); ?>
				</td>
				<td class="paramlist_value">
					<?php echo acymailing_boolean("data[mail][html]", 'onchange="updateAcyEditor(this.value)"', $this->mail->html); ?>
				</td>
			</tr>
			<?php
			$jflanguages = acymailing_get('type.jflanguages');
			if($jflanguages->multilingue){ ?>
				<tr>
					<td class="paramlist_key">
						<label for="jlang">
							<?php echo acymailing_translation('ACY_LANGUAGE'); ?>
						</label>
					</td>
					<td class="paramlist_value">
						<?php
						$jflanguages->sef = true;
						echo $jflanguages->displayJLanguages('data[mail][language]', empty($this->mail->language) ? '' : $this->mail->language);
						?>
					</td>
				</tr>
			<?php } ?>
		</table>
	</div>
	<?php if($this->mail->type == 'article'){ ?>
		<div class="onelineblockoptions">
			<span class="acyblocktitle"><?php echo acymailing_translation('ACY_INSERT_TAG_ARTICLE'); ?></span>
			<table class="acymailing_smalltable">
				<tr>
					<td>
						<?php echo acymailing_translation('DISPLAY'); ?>
					</td>
					<td colspan="2">
						<?php echo acymailing_radio($this->contenttype, 'contenttype', 'size="1" onclick="updateTag();"', 'value', 'text', 'intro'); ?>
					</td>
					<td>
						<?php $jflanguages = acymailing_get('type.jflanguages');
						$jflanguages->onclick = 'onchange="updateTag();"';
						echo $jflanguages->display('lang', ''); ?>
					</td>
				</tr>
				<tr id="format" class="acyplugformat">
					<td valign="top">
						<?php echo acymailing_translation('FORMAT'); ?>
					</td>
					<td valign="top">
						<?php echo $this->acypluginsHelper->getFormatOption('tagcontent'); ?>
					</td>
					<td valign="top"><?php echo acymailing_translation('DISPLAY_PICTURES'); ?></td>
					<td valign="top"><?php echo acymailing_radio($this->picts, 'pict', 'size="1" onclick="updateTag();"', 'value', 'text', '1'); ?>
						<span id="pictsize" style="display:none;"><br/><?php echo acymailing_translation('CAPTCHA_WIDTH') ?>
							<input name="pictwidth" type="text" onchange="updateTag();" value="150" style="width:30px;"/>
								x <?php echo acymailing_translation('CAPTCHA_HEIGHT') ?>
							<input name="pictheight" type="text" onchange="updateTag();" value="150" style="width:30px;"/>
						</span>
					</td>
				</tr>
				<tr>
					<td>
						<?php echo acymailing_translation('CLICKABLE_TITLE'); ?>
					</td>
					<td>
						<?php echo acymailing_radio($this->titlelink, 'titlelink', 'size="1" onclick="updateTag();"', 'value', 'text', 'link'); ?>
					</td>
					<td>
						<?php echo acymailing_translation('AUTHOR_NAME'); ?>
					</td>
					<td>
						<?php echo acymailing_radio($this->authorname, 'author', 'size="1" onclick="updateTag();"', 'value', 'text', '0'); ?>
					</td>
				</tr>
				<tr>
					<td>
						<?php echo acymailing_translation('SHARE'); ?>
					</td>
					<?php
					$socialMedias = array('facebook' => 'Facebook', 'linkedin' => 'LinkedIn', 'twitter' => 'Twitter', 'google' => 'Google+');

					$cpt = 1;
					foreach($socialMedias as $key => $oneSocial){
						if($cpt == 4){
							$cpt = 1;
							echo '</tr><tr><td/>';
						}
						echo '<td><input value="'.$key.'" name="socialshare" id="'.$key.'" type="checkbox" onclick="updateTag();" /> ';
						echo '<label for="'.$key.'">'.$oneSocial.'</label></td>';
						$cpt++;
					}
					while($cpt != 4){
						$cpt++;
						echo '<td/>';
					}
					?>
				</tr>
			</table>
			<a class="acymailing_button" style="width: 95%; text-align: center" onclick="insertTagCurrent(); return false;"><?php echo acymailing_translation('INSERT_TAG'); ?></a>
		</div>
	<?php } ?>
	<?php echo $this->tabs->endPanel(); ?>
	<?php echo $this->tabs->startPanel(acymailing_translation('ATTACHMENTS'), 'mail_attachments'); ?>
	<br style="font-size:1px"/>

	<div class="acyblockoptions" style="float:none;">
		<?php if(!empty($this->mail->attach)){
			echo '<div class="acyblockoptions" style="float:none;">
				<span class="acyblocktitle">'.acymailing_translation('ATTACHED_FILES').'</span>';
			foreach($this->mail->attach as $idAttach => $oneAttach){
				$idDiv = 'attach_'.$idAttach;
				echo '<div id="'.$idDiv.'">'.$oneAttach->filename.' ('.(round($oneAttach->size / 1000, 1)).' Ko)';
				echo $this->toggleClass->delete($idDiv, $this->mail->mailid.'_'.$idAttach, 'mail');
				echo '</div>';
			}

			echo '</div>';
		} ?>
		<div id="loadfile">
			<?php
			$uploadfileType = acymailing_get('type.uploadfile');
			for($i = 0; $i < 10; $i++){
				echo '<div'.($i == 0 ? '' : ' style="display:none;"').' id="attachmentsdiv'.$i.'">'.$uploadfileType->display(false, 'attachments', $i).'<a style="display:none" href="javascript:void(0);" id="attachments'.$i.'suppr" onclick="deleteAttachment('.$i.');"><span class="hasTooltip acyicon-delete" title="Delete" ></span></a></div>';
			}
			?>
		</div>
		<a href="javascript:void(0);" onclick='addFileLoader()'><?php echo acymailing_translation('ADD_ATTACHMENT'); ?></a>
		<?php echo acymailing_translation_sprintf('MAX_UPLOAD', $this->values->maxupload); ?>
	</div>
	<?php echo $this->tabs->endPanel();
	echo $this->tabs->startPanel(acymailing_translation('SENDER_INFORMATIONS'), 'mail_sender');
	$config = acymailing_config(); ?>
	<br style="font-size:1px"/>

	<div class="onelineblockoptions">
		<table width="100%" class="acymailing_smalltable">
			<tr>
				<td class="paramlist_key">
					<?php echo acymailing_translation('FROM_NAME'); ?>
				</td>
				<td class="paramlist_value">
					<input placeholder="<?php echo acymailing_translation('USE_DEFAULT_VALUE'); ?>" class="inputbox" type="text" id="fromname" name="data[mail][fromname]" style="width:200px" value="<?php echo $this->escape($this->mail->fromname); ?>"/>
				</td>
			</tr>
			<tr>
				<td class="paramlist_key">
					<?php echo acymailing_translation('FROM_ADDRESS'); ?>
				</td>
				<td class="paramlist_value">
					<input onchange="validateEmail(this.value, '<?php echo addslashes(acymailing_translation('FROM_ADDRESS')); ?>')" placeholder="<?php echo acymailing_translation('USE_DEFAULT_VALUE'); ?>" class="inputbox" type="text" id="fromemail" name="data[mail][fromemail]" style="width:200px" value="<?php echo $this->escape($this->mail->fromemail); ?>"/>
				</td>
			</tr>
			<tr>
				<td class="paramlist_key">
					<?php echo acymailing_translation('REPLYTO_NAME'); ?>
				</td>
				<td class="paramlist_value">
					<input placeholder="<?php echo acymailing_translation('USE_DEFAULT_VALUE'); ?>" class="inputbox" type="text" id="replyname" name="data[mail][replyname]" style="width:200px" value="<?php echo $this->escape($this->mail->replyname); ?>"/>
				</td>
			</tr>
			<tr>
				<td class="paramlist_key">
					<?php echo acymailing_translation('REPLYTO_ADDRESS'); ?>
				</td>
				<td class="paramlist_value">
					<input onchange="validateEmail(this.value, '<?php echo addslashes(acymailing_translation('REPLYTO_ADDRESS')); ?>')" placeholder="<?php echo acymailing_translation('USE_DEFAULT_VALUE'); ?>" class="inputbox" type="text" id="replyemail" name="data[mail][replyemail]" style="width:200px" value="<?php echo $this->escape($this->mail->replyemail); ?>"/>
				</td>
			</tr>
		</table>
	</div>
	<?php echo acymailing_getFunctionsEmailCheck();

	echo $this->tabs->endPanel();
	$this->config = acymailing_config();
	if(acymailing_level(3) && acymailing_isAllowed($this->config->get('acl_newsletters_inbox_actions', 'all')) && acymailing_isPluginEnabled('acymailing', 'plginboxactions')) include(ACYMAILING_BACK.'views'.DS.'newsletter'.DS.'tmpl'.DS.'inboxactions.php');
	echo $this->tabs->endPane(); ?>
components/com_acymailing/views/email/tmpl/listing.php000060400000005463152453623450017303 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><form action="<?php echo acymailing_completeLink(acymailing_getVar('cmd', 'ctrl')); ?>&tmpl=component" method="post" name="adminForm" id="adminForm">
	<table class="acymailing_table_options">
		<tr>
			<td width="100%">
				<?php acymailing_listingsearch($this->pageInfo->search); ?>
			</td>
			<td nowrap="nowrap">
				<?php echo $this->filters->category; ?>
			</td>
		</tr>
	</table>

	<table class="acymailing_table" cellpadding="1">
		<thead>
			<tr>
				<th class="title titlenum">
					<?php echo acymailing_translation('ACY_NUM'); ?>
				</th>
				<th class="title titlebox">
					<input type="checkbox" name="toggle" value="" onclick="acymailing.checkAll(this);"/>
				</th>
				<th class="title titlecolor">

				</th>
				<th class="title">
					<?php echo acymailing_translation('LIST_NAME'); ?>
				</th>
				<th class="title titlesender">
					<?php echo acymailing_translation('CREATOR'); ?>
				</th>
				<th class="title titleid">
					<?php echo acymailing_translation('ACY_ID'); ?>
				</th>
			</tr>
		</thead>
		<tfoot>
			<tr>
				<td colspan="12">
					<?php
					echo $this->pagination->getListFooter();
					echo $this->pagination->getResultsCounter();
					?>
				</td>
			</tr>
		</tfoot>
		<tbody id="acymailing_sortable_listing">
		<?php
		$k = 0;
		$ordering = '';
		for($i = 0; $i < count($this->rows); $i++){
			$row =& $this->rows[$i];
			$ordering .= ',"order['.$i.']='.$row->ordering.'"';

			$publishedid = 'published_'.$row->listid;
			$visibleid = 'visible_'.$row->listid;
			?>
			<tr class="<?php echo "row$k"; ?>">
				<td align="center" style="text-align:center">
					<?php echo $this->pagination->getRowOffset($i); ?>
				</td>
				<td align="center" style="text-align:center">
					<?php echo acymailing_gridID($i, $row->listid); ?>
				</td>
				<td width="12">
					<?php echo '<div class="roundsubscrib rounddisp" style="background-color:'.$this->escape($row->color).'"></div>'; ?>
				</td>
				<td>
					<?php
					echo acymailing_tooltip($row->description, $row->name, 'tooltip.png', $row->name);
					?>
				</td>
				<td align="center" style="text-align:center">
					<?php if(!empty($row->userid)) echo $row->creatorname; ?>
				</td>
				<td align="center" style="text-align:center">
					<?php echo $row->listid; ?>
				</td>
			</tr>
			<?php
			$k = 1 - $k;
		}
		?>
		</tbody>
	</table>

	<input type="hidden" name="articleId" value="<?php echo acymailing_getVar('int', 'articleId'); ?>">
	<?php
		$order = new stdClass();
		$order->value = 'name';
		$order->dir = 'asc';
		acymailing_formOptions($order, 'chooseListBeforeSend');
	?>
</form>
components/com_acymailing/views/email/tmpl/form.php000060400000003271152453623450016570 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<div id="iframedoc"></div>
	<form action="<?php echo acymailing_completeLink(acymailing_getVar('cmd', 'ctrl'), true); ?>" method="post" name="adminForm" id="adminForm" autocomplete="off" enctype="multipart/form-data">
		<div id="iframetemplate"></div>
		<div id="iframetag"></div>

		<?php include(dirname(__FILE__).DS.'param.'.basename(__FILE__)); ?>
		<br/>

		<div class="onelineblockoptions" id="htmlfieldset"<?php if(empty($this->mail->html)) echo ' style="display:none;"'; ?>>
			<span class="acyblocktitle"><?php echo acymailing_translation('HTML_VERSION'); ?></span>
			<?php echo $this->editor->display(); ?>
		</div>
		<div class="onelineblockoptions">
			<span class="acyblocktitle"><?php echo acymailing_translation('TEXT_VERSION'); ?></span>
			<textarea onClick="zoneToTag='altbody';" style="width:98%;min-height:150px;" rows="20" name="data[mail][altbody]" id="altbody" placeholder="<?php echo acymailing_translation('AUTO_GENERATED_HTML'); ?>"><?php echo @$this->mail->altbody; ?></textarea>
		</div>

		<div class="clr"></div>
		<input type="hidden" name="cid[]" value="<?php echo @$this->mail->mailid; ?>"/>
		<?php if(!empty($this->mail->type)){ ?>
			<input type="hidden" name="data[mail][type]" value="<?php echo $this->mail->type; ?>"/>
		<?php } ?>
		<input type="hidden" id="tempid" name="data[mail][tempid]" value="<?php echo @$this->mail->tempid; ?>"/>
		<?php acymailing_formOptions(); ?>
	</form>
</div>
components/com_acymailing/views/email/tmpl/index.html000060400000000054152453623450017105 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/newsletter/tmpl/param.form.php000060400000020653152453623450020777 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
if(acymailing_isAllowed($this->config->get('acl_newsletters_lists', 'all')) || acymailing_isAllowed($this->config->get('acl_newsletters_attachments', 'all')) || acymailing_isAllowed($this->config->get('acl_newsletters_sender_informations', 'all')) || acymailing_isAllowed($this->config->get('acl_newsletters_meta_data', 'all')) || (acymailing_isAllowed($this->config->get('acl_newsletters_inbox_actions', 'all')) && acymailing_isPluginEnabled('acymailing', 'plginboxactions'))){ ?>
	<div id="newsletterparams">

		<?php echo $this->tabs->startPane('news_tab');

		if(!acymailing_isAllowed($this->config->get('acl_newsletters_lists', 'all')) || $this->type == 'joomlanotification'){
			acymailing_addStyle(true, " .mail_receivers_acl{display:none;} ");
			echo '<div class="mail_receivers_acl">';
		}else{
			echo $this->tabs->startPanel(acymailing_translation('LISTS'), 'mail_receivers');
		} ?>
		<?php
		if(empty($this->lists)){
			echo '<span>'.acymailing_translation('LIST_CREATE').'</span>';
		}else{
			echo '<span>'.acymailing_translation('LIST_RECEIVERS').'</span>';
			include_once(ACYMAILING_BACK.'views'.DS.'newsletter'.DS.'tmpl'.DS.'filter.lists.php');

			if(acymailing_level(2) && acymailing_isAllowed($this->config->get('acl_lists_filter', 'all'))) include_once(dirname(__FILE__).DS.'filters.php');
		}
		if(!acymailing_isAllowed($this->config->get('acl_newsletters_lists', 'all')) || $this->type == 'joomlanotification'){
			echo '</div>';
		}else echo $this->tabs->endPanel();

		if(acymailing_isAllowed($this->config->get('acl_newsletters_attachments', 'all'))){
			echo $this->tabs->startPanel(acymailing_translation('ATTACHMENTS'), 'mail_attachments');
			if(!empty($this->mail->attach)){
				echo '<div class="onelineblockoptions">
					<span class="acyblocktitle">'.acymailing_translation('ATTACHED_FILES').'</span>';

				foreach($this->mail->attach as $idAttach => $oneAttach){
					$idDiv = 'attach_'.$idAttach;
					echo '<div id="'.$idDiv.'" style="text-overflow: ellipsis;overflow: hidden;" title="'.$oneAttach->filename.'">'.$oneAttach->filename.' ('.(round($oneAttach->size / 1000, 1)).' Ko)';
					echo $this->toggleClass->delete($idDiv, $this->mail->mailid.'_'.$idAttach, 'mail');
					echo '</div>';
				}

				echo '</div>';
			} ?>
			<div id="loadfile">
				<?php
				$uploadfileType = acymailing_get('type.uploadfile');
				for($i = 0; $i < 10; $i++){
					echo '<div'.($i == 0 ? '' : ' style="display:none;"').' id="attachmentsdiv'.$i.'">'.$uploadfileType->display(false, 'attachments', $i).'<a style="display:none" href="javascript:void(0);" id="attachments'.$i.'suppr" onclick="deleteAttachment('.$i.');"><span class="hasTooltip acyicon-delete" title="Delete" ></span></a></div>';
				}
				?>
			</div>
			<a href="javascript:void(0);" onclick='addFileLoader()'><?php echo acymailing_translation('ADD_ATTACHMENT'); ?></a>
			<?php echo acymailing_translation_sprintf('MAX_UPLOAD', $this->values->maxupload); ?>
			<?php echo $this->tabs->endPanel();
		}

		if(!acymailing_isAllowed($this->config->get('acl_newsletters_sender_informations', 'all'))){
			acymailing_addStyle(true, " .mail_sender_acl{display:none;} ");
			echo '<div id="mail_sender_acl" style="display:none" >';
		}else{
			echo $this->tabs->startPanel(acymailing_translation('SENDER_INFORMATIONS'), 'mail_sender');
		} ?>
		<table width="100%" class="acymailing_table" id="senderinformationfieldset">
			<tr>
				<td class="paramlist_key">
					<label for="fromname"><?php echo acymailing_translation('FROM_NAME'); ?></label>
				</td>
				<td class="paramlist_value">
					<input placeholder="<?php echo acymailing_translation('USE_DEFAULT_VALUE'); ?>" class="inputbox" id="fromname" type="text" name="data[mail][fromname]" style="width:200px; max-width:80%;" value="<?php echo $this->escape(@$this->mail->fromname); ?>"/>
				</td>
			</tr>
			<tr>
				<td class="paramlist_key">
					<label for="fromemail"><?php echo acymailing_translation('FROM_ADDRESS'); ?></label>
				</td>
				<td class="paramlist_value">
					<input onchange="validateEmail(this.value, '<?php echo addslashes(acymailing_translation('FROM_ADDRESS')); ?>')" placeholder="<?php echo acymailing_translation('USE_DEFAULT_VALUE'); ?>" class="inputbox" id="fromemail" type="text" name="data[mail][fromemail]" style="width:200px; max-width:80%;" value="<?php echo $this->escape(@$this->mail->fromemail); ?>"/>
				</td>
			</tr>
			<tr>
				<td class="paramlist_key">
					<label for="replyname"><?php echo acymailing_translation('REPLYTO_NAME'); ?></label>
				</td>
				<td class="paramlist_value">
					<input placeholder="<?php echo acymailing_translation('USE_DEFAULT_VALUE'); ?>" class="inputbox" id="replyname" type="text" name="data[mail][replyname]" style="width:200px; max-width:80%;" value="<?php echo $this->escape(@$this->mail->replyname); ?>"/>
				</td>
			</tr>
			<tr>
				<td class="paramlist_key">
					<label for="replyemail"><?php echo acymailing_translation('REPLYTO_ADDRESS'); ?></label>
				</td>
				<td class="paramlist_value">
					<input onchange="validateEmail(this.value, '<?php echo addslashes(acymailing_translation('REPLYTO_ADDRESS')); ?>')" placeholder="<?php echo acymailing_translation('USE_DEFAULT_VALUE'); ?>" class="inputbox" id="replyemail" type="text" name="data[mail][replyemail]" style="width:200px; max-width:80%;" value="<?php echo $this->escape(@$this->mail->replyemail); ?>"/>
				</td>
			</tr>
			<tr>
				<td class="paramlist_key">
					<label for="bccaddresses"><?php echo acymailing_translation('ACY_BCC_ADDRESS'); ?></label>
				</td>
				<td class="paramlist_value">
					<input placeholder="address@example.com" class="inputbox" id="bccaddresses" type="text" name="data[mail][bccaddresses]" style="width:200px; max-width:80%;" value="<?php echo $this->escape(@$this->mail->bccaddresses); ?>"/>
				</td>
			</tr>
			<?php
			if(acymailing_level(1)){
				echo '<tr>
					<td class="paramlist_key">'.acymailing_translation('FAVICON').'</td><td class="paramlist_value">';
				if(!empty($this->mail->favicon) && !empty($this->mail->favicon->filename)){
					echo '<div id="attach_favicon">'.$this->mail->favicon->filename.' ('.(round($this->mail->favicon->size / 1000, 1)).' Ko)';
					echo $this->toggleClass->delete('attach_favicon', $this->mail->mailid.'_favicon', 'favicon');
					echo '</div>';
				}
				?>
				<div id="loadfile">
					<?php
					echo '<div id="favicondiv">'.$uploadfileType->display(false, 'favicon', '').'</div>';
					?>
				</div>
				<?php echo acymailing_translation_sprintf('MAX_UPLOAD', $this->values->maxupload);
				echo '</td></tr>';
			} ?>
		</table>

		<?php echo acymailing_getFunctionsEmailCheck();

		if(!acymailing_isAllowed($this->config->get('acl_newsletters_sender_informations', 'all'))){
			echo '</div>';
		}else{
			echo $this->tabs->endPanel();
		}

		if($this->type == 'joomlanotification'){
			acymailing_addStyle(true, " .mail_metadata_jnotif{display:none;} ");
			echo '<div class="mail_metadata_jnotif">';
		}else{
			if(acymailing_isAllowed($this->config->get('acl_newsletters_meta_data', 'all'))){
				echo $this->tabs->startPanel(acymailing_translation('META_DATA'), 'mail_metadata'); ?>
				<table width="100%" class="acymailing_table" id="metadatatable">
					<tr>
						<td class="paramlist_key">
							<label for="metakey"><?php echo acymailing_translation('META_KEYWORDS'); ?></label>
						</td>
						<td class="paramlist_value">
							<textarea id="metakey" name="data[mail][metakey]" rows="5" style="width:200px; max-width:80%;"><?php echo @$this->mail->metakey; ?></textarea>
						</td>
					</tr>
					<tr>
						<td class="paramlist_key">
							<label for="metadesc"><?php echo acymailing_translation('META_DESC'); ?></label>
						</td>
						<td class="paramlist_value">
							<textarea id="metadesc" name="data[mail][metadesc]" rows="5" style="width:200px; max-width:80%;"><?php echo @$this->mail->metadesc; ?></textarea>
						</td>
					</tr>
				</table>
				<?php
				echo $this->tabs->endPanel();
			}
		}
		if($this->type == 'joomlanotification') echo '</div>';
		if(acymailing_level(3) && acymailing_isAllowed($this->config->get('acl_newsletters_inbox_actions', 'all')) && acymailing_isPluginEnabled('acymailing', 'plginboxactions')) include(dirname(__FILE__).DS.'inboxactions.php');
		echo $this->tabs->endPane(); ?>
	</div>
<?php } ?>
components/com_acymailing/views/newsletter/tmpl/upload.php000060400000001563152453623450020220 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<form action="<?php echo acymailing_completeLink('file', true); ?>" method="post" name="adminForm" id="adminForm" autocomplete="off" enctype="multipart/form-data">
		<div id="iframedoc"></div>
		<div style="text-align:center;padding-top:20px;"><input type="file" style="width:auto" name="uploadedfile"/><br />
			<?php echo (acymailing_translation_sprintf('MAX_UPLOAD', (acymailing_bytes(ini_get('upload_max_filesize')) > acymailing_bytes(ini_get('post_max_size'))) ? ini_get('post_max_size') : ini_get('upload_max_filesize'))); ?>
		</div>
		<?php acymailing_formOptions(); ?>
	</form>
</div>
components/com_acymailing/views/newsletter/tmpl/previewcontent.php000060400000006320152453623450022004 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php if($this->mail->html){ ?>
	<style type="text/css">
		.previewsize{
			background-image: url('<?php echo ACYMAILING_IMAGES?>preview_icons.png');
			background-repeat: no-repeat;
			cursor: pointer;
			height: 25px;
			display: block;
			float: left;
			margin-right: 5px;
		}

		.previewpict:hover, .previewpictenabled{
			background-position: -284px 0px;
		}

		.previewpict, .previewpictenabled:hover{
			background-position: -284px -33px;
		}

		.preview320{
			background-position: 0px 0px;
		}

		.preview320:hover, .preview320enabled{
			background-position: 0px -33px;
		}

		.preview480{
			background-position: -65px 0px;
		}

		.preview480:hover, .preview480enabled{
			background-position: -65px -33px;
		}

		.preview768{
			background-position: -136px 0px;
		}

		.preview768:hover, .preview768enabled{
			background-position: -136px -33px;
		}

		.previewmax{
			background-position: -211px 0px;
		}

		.previewmax:hover, .previewmaxenabled{
			background-position: -211px -33px;
		}
	</style>

	<div class="<?php echo acymailing_isAdmin() ? 'acyblockoptions' : 'onelineblockoptions'; ?> acyblock_newsletter" width="100%" id="htmlfieldset" style="clear:both;">
		<span class="acyblocktitle donotprint"> <?php echo acymailing_translation('HTML_VERSION'); ?></span>

		<div style="float:right;width:340px;clear:both" id="acypreview_resize">
			<span class="previewsize preview320" id="preview320" style="width:55px;" onclick="previewResize('342px','480px');previewSizeClick(this);"></span>
			<span class="previewsize preview480" id="preview480" style="width:61px;" onclick="previewResize('502px','320px');previewSizeClick(this);"></span>
			<span class="previewsize preview768" id="preview768" style="width:65px" onclick="previewResize('790px','1024px');previewSizeClick(this);"></span>
			<span class="previewsize previewmaxenabled" id="previewmax" style="width:63px;" onclick="previewResize('100%','100%');previewSizeClick(this);"></span>
			<span class="previewsize previewpictenabled" id="previewpict" style="width:46px;margin-left:20px;" onclick="switchPict();"></span>
		</div>

		<div class="newsletter_body" id="newsletter_preview_area"><?php echo $this->mail->body; ?></div>

	</div>
<?php
} ?>

<div class="<?php echo (acymailing_isAdmin() ? 'acyblockoptions' : 'onelineblockoptions'); ?> acyblock_newsletter donotprint" id="textfieldset">
	<span class="acyblocktitle donotprint"><?php echo acymailing_translation('TEXT_VERSION'); ?></span>
	<?php echo nl2br($this->escape($this->mail->altbody)); ?>
</div>
<?php
if(!empty($this->mail->attachments)){
	echo '<div class="'.(acymailing_isAdmin() ? 'acyblockoptions' : 'onelineblockoptions').' newsletter_attachments donotprint adminform">
		<span class="acyblocktitle">'.acymailing_translation('ATTACHMENTS').'</span>
		<table>';
	foreach($this->mail->attachments as $attachment){
		echo '<tr><td><a href="'.$attachment->url.'" target="_blank">'.$attachment->name.'</a></td></tr>';
	}
	echo '</table></div>';
}
?>

<div class="clr"></div>
components/com_acymailing/views/newsletter/tmpl/listing.php000060400000022263152453623450020405 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content" class="acynewsletterlisting">
	<div id="iframedoc"></div>
	<form action="<?php echo acymailing_completeLink(acymailing_getVar('cmd', 'ctrl')); ?>" method="post" name="adminForm" id="adminForm">
		<table class="acymailing_table_options">
			<?php if(acymailing_isAdmin()){ ?>
			<tr>
				<td nowrap="nowrap" width="100%">
					<?php acymailing_listingsearch($this->pageInfo->search); ?>
				</td>
				<td nowrap="nowrap">
					<?php echo $this->filters->list;
					echo $this->filters->creator;
					echo $this->filters->date;
					echo $this->filters->type;
					echo $this->filters->tags; ?>
				</td>
			</tr>
			<?php }else{ ?>
			<tr>
				<td nowrap="nowrap" width="100%">
					<?php acymailing_listingsearch($this->pageInfo->search); ?>
				</td>
				<td>
					<?php echo $this->filters->list; ?>
				</td>
			</tr>
			<tr>
				<td>
					<?php echo $this->filters->tags; ?>
				</td>
				<td valign="top">
					<?php echo $this->filters->date; ?>
				</td>
			</tr>
			<?php } ?>
		</table>

		<table class="acymailing_table">
			<thead>
			<tr>
				<th class="title titlenum">
					<?php echo acymailing_translation('ACY_NUM'); ?>
				</th>
				<th class="title titlebox">
					<input type="checkbox" name="toggle" value="" onclick="acymailing.checkAll(this);"/>
				</th>
				<th class="title" colspan="3">
					<?php echo acymailing_gridSort(acymailing_translation('JOOMEXT_SUBJECT'), 'a.subject', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
				</th>
				<?php if(acymailing_isAdmin()){ ?>
					<th class="title titlelist" style="text-align: left;">
						<?php echo acymailing_translation('LISTS'); ?>
					</th>
				<?php } ?>
				<th class="title titledate">
					<?php echo acymailing_gridSort(acymailing_translation('SEND_DATE'), 'a.senddate', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
				</th>
				<th class="title titlesender">
					<?php echo acymailing_gridSort(acymailing_translation('SENDER_INFORMATIONS'), 'a.fromname', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
				</th>
				<th class="title titlesender">
					<?php echo acymailing_gridSort(acymailing_translation('CREATOR'), 'b.name', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
				</th>
				<?php if(acymailing_isAdmin()){ ?>
					<th class="title titletoggle">
						<?php echo acymailing_gridSort(acymailing_translation('JOOMEXT_VISIBLE'), 'a.visible', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
					</th>
					<th class="title titletoggle">
						<?php echo acymailing_gridSort(acymailing_translation('ACY_PUBLISHED'), 'a.published', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
					</th>
				<?php } ?>
				<th class="title titleid">
					<?php echo acymailing_gridSort(acymailing_translation('ACY_ID'), 'a.mailid', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
				</th>
			</tr>
			</thead>
			<tfoot>
			<tr>
				<td colspan="11">
					<?php echo $this->pagination->getListFooter();
					echo $this->pagination->getResultsCounter(); ?>
				</td>
			</tr>
			</tfoot>
			<tbody>
			<?php
			$k = 0;
			$i = 0;
			foreach($this->rows as &$row){
				$publishedid = 'published_'.$row->mailid;
				$visibleid = 'visible_'.$row->mailid;
				?>
				<tr class="<?php echo "row$k"; ?>">
					<td align="center" style="text-align:center">
						<?php echo $this->pagination->getRowOffset($i); ?>
					</td>
					<td align="center" style="text-align:center">
						<?php echo acymailing_gridID($i, $row->mailid); ?>
					</td>
					<td align="center" style="text-align:center; width: 25px;">
						<?php
						if(acymailing_level(2)){
							if(acymailing_isAllowed($this->config->get('acl_statistics_manage', 'all')) && !empty($row->senddate)){
								if(acymailing_isAdmin()){
									$urlStat = acymailing_completeLink('diagram&task=mailing&mailid='.$row->mailid, true);
								}else{
									$urlStat = acymailing_completeLink('frontdiagram&task=mailing&mailid='.$row->mailid, true);
								} ?>
								<span class="acystatsbutton"><?php echo acymailing_popup($urlStat, acymailing_isAdmin() ? '<i class="acyicon-statistic"></i>' : '<img src="'.ACYMAILING_IMAGES.'icons/icon-16-stats.png" alt="'.acymailing_translation('STATISTICS', true).'"/>', '', 800, 590); ?></span>
							<?php }
						} ?>
					</td>
					<td align="center" style="text-align:center; width: 18px;">
						<?php
						if(acymailing_isAdmin()){
							if(acymailing_level(3) && acymailing_isAllowed($this->config->get('acl_'.$this->aclCat.'_abtesting', 'all')) && !empty($row->abtesting)){
								$abDetail = unserialize($row->abtesting);
								$urlAbTest = acymailing_completeLink('newsletter&task=abtesting&mailid='.$abDetail['mailids'], true);
								?>
								<span class="acyabtestbutton"><?php echo acymailing_popup($urlAbTest, acymailing_isAdmin() ? '<i class="acyicon-ABtesting"></i>' : '<img src="'.ACYMAILING_IMAGES.'icons/icon-16-acyabtesting.png" alt="'.acymailing_translation('ABTESTING', true).'"/>', '', 800, 590); ?></span>
							<?php }
						}
						?>
					</td>
					<td>
						<?php
						$row->subject = acyEmoji::Decode($row->subject);
						$subjectLine = acymailing_dispSearch($row->subject, $this->pageInfo->search);
						echo acymailing_tooltip('<b>'.acymailing_translation('JOOMEXT_ALIAS').' : </b>'.acymailing_dispSearch($row->alias, $this->pageInfo->search), '', '', $subjectLine, acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'newsletter&task=edit&mailid='.$row->mailid));
						?>
					</td>
					<?php if(acymailing_isAdmin()){ ?>
						<td>
							<?php
							if(!empty($this->mailToLists[$row->mailid])){
								foreach($this->mailToLists[$row->mailid] as $oneList){
									echo '<div class="roundsubscrib roundsub" style="background-color:'.htmlspecialchars($this->listColor[$oneList]->color, ENT_COMPAT, 'UTF-8').';">'.acymailing_tooltip('', $this->listColor[$oneList]->name, '', '&nbsp;&nbsp;&nbsp;&nbsp;').'</div>';
								}
							}
							?>
						</td>
					<?php } ?>
					<td align="center" style="text-align:center">
						<?php echo acymailing_getDate($row->senddate);
						if(!empty($row->countqueued) && acymailing_isAllowed($this->config->get('acl_queue_delete', 'all'))){ ?>
							<br/>
							<button class="acymailing_button"
									onclick="if(confirm('<?php echo str_replace("'", "\'", acymailing_translation_sprintf('ACY_VALID_DELETE_FROM_QUEUE', $row->countqueued)); ?>')){ window.location.href = '<?php echo acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'newsletter&task=cancelNewsletter&'.acymailing_getFormToken().'&mailid='.$row->mailid); ?>'; } return false;"><?php echo acymailing_translation('ACY_CANCEL'); ?></button>
						<?php } ?>
					</td>
					<td align="center" style="text-align:center">
						<?php
						if(empty($row->fromname)) $row->fromname = $this->config->get('from_name');
						if(empty($row->fromemail)) $row->fromemail = $this->config->get('from_email');
						if(empty($row->replyname)) $row->replyname = $this->config->get('reply_name');
						if(empty($row->replyemail)) $row->replyemail = $this->config->get('reply_email');
						if(!empty($row->fromname)){
							$text = '<b>'.acymailing_translation('FROM_NAME').' : </b>'.$row->fromname;
							$text .= '<br /><b>'.acymailing_translation('FROM_ADDRESS').' : </b>'.$row->fromemail;
							$text .= '<br /><br /><b>'.acymailing_translation('REPLYTO_NAME').' : </b>'.$row->replyname;
							$text .= '<br /><b>'.acymailing_translation('REPLYTO_ADDRESS').' : </b>'.$row->replyemail;
							echo acymailing_tooltip($text, '', '', $row->fromname);
						}
						?>
					</td>
					<td align="center" style="text-align:center">
						<?php
						if(!empty($row->name)){
							$text = '<b>'.acymailing_translation('JOOMEXT_NAME').' : </b>'.$row->name;
							$text .= '<br /><b>'.acymailing_translation('ACY_USERNAME').' : </b>'.$row->username;
							$text .= '<br /><b>'.acymailing_translation('JOOMEXT_EMAIL').' : </b>'.$row->email;
							$text .= '<br /><b>'.acymailing_translation('ACY_ID').' : </b>'.$row->userid;
							echo acymailing_tooltip($text, $row->name, '', $row->name, acymailing_isAdmin() ? acymailing_userEditLink().$row->userid : '');
						}
						?>
					</td>
					<?php if(acymailing_isAdmin()){ ?>
						<td align="center" style="text-align:center">
							<span id="<?php echo $visibleid ?>" class="loading"><?php echo $this->toggleClass->toggle($visibleid, (int)$row->visible, 'mail') ?></span>
						</td>
						<td align="center" style="text-align:center">
							<span id="<?php echo $publishedid ?>" class="loading"><?php echo $this->toggleClass->toggle($publishedid, (int)$row->published, 'mail') ?></span>
						</td>
					<?php } ?>
					<td width="1%" align="center">
						<?php echo $row->mailid; ?>
					</td>
				</tr>
				<?php
				$k = 1 - $k;
				$i++;
			}
			?>
			</tbody>
		</table>

		<?php acymailing_formOptions($this->pageInfo->filter->order); ?>
	</form>
</div>
components/com_acymailing/views/newsletter/tmpl/form.php000060400000006061152453623450017675 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<div id="iframedoc"></div>
	<form action="<?php echo acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'newsletter'); ?>" method="post" name="adminForm" id="adminForm" enctype="multipart/form-data">
		<input type="hidden" name="cid[]" value="<?php echo @$this->mail->mailid; ?>"/>
		<input type="hidden" id="tempid" name="data[mail][tempid]" value="<?php echo @$this->mail->tempid; ?>"/>
		<?php $type = empty($this->mail->type) ? 'news' : $this->mail->type; ?>
		<input type="hidden" name="data[mail][type]" value="<?php echo $type; ?>"/>
		<?php acymailing_formOptions(); ?>
		<div style="clear: both;">
			<div class="confirmBoxMM" id="confirmBoxMM" style="display: none;">
				<div id="acy_popup_content">
					<span class="confirmTxtMM" id="confirmTxtMM"></span><br/>
					<button class="acymailing_button" id="confirmCancelMM" onclick="document.getElementById('confirmBoxMM').style.display='none';document.getElementById('modal-background').style.display='none';return false;" style="padding: 6px 15px 6px 10px;">
						<i class="acyicon-cancel" id="cancelSave" style="margin-right: 5px; font-size: 16px;top: 2px; position: relative;"></i><?php echo acymailing_translation('ACY_CANCEL'); ?>
					</button>
					<button class="acymailing_button acymailing_button_delete" id="confirmOkMM" style="padding: 8px 15px 6px 10px;" onclick="acymailing.submitform(pressbutton,document.adminForm)">
						<i class="acyicon-save" id="iconAction" style="margin-right: 5px; font-size: 12px;"></i><span id="textBtnAction"><?php echo acymailing_translation('ACY_SAVE'); ?></span>
					</button>
				</div>
			</div>
			<div id="modal-background" style="display: none;"></div>
			<div id="newsletterLeftColumn">
				<div class="acyblockoptions acyblock_newsletter">
					<span class="acyblocktitle"><?php echo acymailing_translation('ACY_NEWSLETTER_INFORMATION'); ?></span>
					<?php include(dirname(__FILE__).DS.'info.'.basename(__FILE__)); ?>
				</div>
				<div class="acyblockoptions acyblock_newsletter" id="htmlfieldset">
					<span class="acyblocktitle"> <?php echo acymailing_translation('HTML_VERSION'); ?></span>
					<?php echo $this->editor->display(); ?>
				</div>
				<div class="acyblockoptions acyblock_newsletter" id="textfieldset">
					<span class="acyblocktitle"> <?php echo acymailing_translation('TEXT_VERSION'); ?></span>
					<textarea style="width:98%;min-height:250px;" rows="20" name="data[mail][altbody]" id="altbody" placeholder="<?php echo acymailing_translation('AUTO_GENERATED_HTML'); ?>" onClick="zoneToTag='altbody';"><?php echo $this->escape(@$this->mail->altbody); ?></textarea>
				</div>
			</div>
			<div id="newsletterRightColumn" class="acyblockoptions">
				<?php include(dirname(__FILE__).DS.'param.'.basename(__FILE__)); ?>
			</div>
		</div>
		<div class="clr"></div>
	</form>
</div>
components/com_acymailing/views/newsletter/tmpl/inboxactions.php000060400000006402152453623450021431 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
echo $this->tabs->startPanel(acymailing_translation('ACY_INBOX_ACTIONS'), 'mail_inboxactions'); ?>
<?php
if($this->config->get('inboxactionswhitelist', 1)){
	$toggleClass = acymailing_get('helper.toggle');
	$notremind = '<small style="float:right;margin-right:30px;position:relative;">'.$toggleClass->delete('acymailing_messages_warning', 'inboxactionswhitelist_0', 'config', false, acymailing_translation('DONT_REMIND')).'</small>';
	acymailing_display(acymailing_translation('ACY_INBOX_ACTIONS_WHITELIST').' <a target="_blank" href="'.ACYMAILING_REDIRECT.'inboxactions">'.acymailing_translation('TELL_ME_MORE').'</a>'.$notremind, 'warning');
}
?>
	<table width="100%" class="acymailing_smalltable" id="metadatatable">
		<tr>
			<td class="paramlist_key">
				<label for="datamailparamsaction">
					<?php echo acymailing_translation('ACY_ACTION'); ?>
				</label>
			</td>
			<td class="paramlist_value">
				<?php $ordering = array();
				$ordering[] = acymailing_selectOption("none", acymailing_translation('ACY_NONE'));
				$ordering[] = acymailing_selectOption("confirm", acymailing_translation('ACY_BUTTON_CONFIRM'));
				$ordering[] = acymailing_selectOption("save", acymailing_translation('ACY_BUTTON_SAVE'));
				$ordering[] = acymailing_selectOption("goto", acymailing_translation('ACY_GOTO'));
				echo acymailing_select($ordering, 'data[mail][params][action]', 'size="1" onchange="displayActionOptions(this.value);" style="width:150px;"', 'value', 'text', @$this->mail->params['action']); ?>
			</td>
		</tr>
		<tr class="action_option action_goto action_confirm action_save">
			<td class="paramlist_key">
				<label for="iba_actionbtntext">
					<?php echo acymailing_translation('ACY_BUTTON_TEXT'); ?>
				</label>
			</td>
			<td class="paramlist_value">
				<input id="iba_actionbtntext" type="text" name="data[mail][params][actionbtntext]" rows="5" cols="30" value="<?php echo @$this->mail->params['actionbtntext']; ?>"/>
			</td>
		</tr>
		<tr class="action_option action_goto action_confirm action_save">
			<td class="paramlist_key">
				<label for="iba_actionurl">
					<?php echo acymailing_translation('URL'); ?>
				</label>
			</td>
			<td class="paramlist_value">
				<input id="iba_actionurl" type="text" name="data[mail][params][actionurl]" placeholder="http://..." rows="5" cols="30" value="<?php echo @$this->mail->params['actionurl']; ?>"/>
			</td>
		</tr>
	</table>
	<script type="text/javascript">
		<!--
		function displayActionOptions(selected){
			var options = document.querySelectorAll(".action_option");
			for(var c = 0; c < options.length; c++){
				if(options[c].style){
					options[c].style.display = 'none';
				}
			}
			if(selected == "none") return;

			options = document.querySelectorAll(".action_" + selected);
			for(var c = 0; c < options.length; c++){
				if(options[c].style){
					options[c].style.display = '';
				}
			}
		}
		displayActionOptions('<?php echo empty($this->mail->params['action']) ? 'none' : $this->mail->params['action']; ?>');
		-->
	</script>
<?php echo $this->tabs->endPanel();
components/com_acymailing/views/newsletter/tmpl/preview.php000060400000005235152453623450020415 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<div id="iframedoc"></div>
	<?php include(dirname(__FILE__).DS.'test.php');
	if($this->type != 'joomlanotification'){ ?>
		<div <?php echo (acymailing_isAdmin()) ? 'class="acyblockoptions" style="width:42%;min-width:480px;"' : 'class="onelineblockoptions"'; ?> id="receiversinfo">
			<span class="acyblocktitle"><?php echo acymailing_translation('NEWSLETTER_SENT_TO'); ?></span>

			<table class="<?php echo (acymailing_isAdmin()) ? 'acymailing_table' : 'adminlist table table-striped'; ?>" cellspacing="1" align="center">
				<tbody>
				<?php if(!empty($this->lists)){
					$k = 0;
					$listids = array();
					foreach($this->lists as $row){
						$listids[] = $row->listid;
						?>
						<tr class="<?php echo "row$k"; ?>">
							<td>
								<?php
								if(!$row->published) echo '<a href="'.acymailing_completeLink('list&task=edit&listid='.$row->listid).'" title="'.acymailing_translation('LIST_PUBLISH', true).'"><img style="margin:0px;" src="'.ACYMAILING_IMAGES.'warning.png" alt="Warning" /></a> ';
								echo acymailing_tooltip($row->description, $row->name, '', $row->name);
								echo ' ( '.acymailing_translation_sprintf('ACY_SELECTED_USERS', $row->nbsub).' )';
								echo '<div class="roundsubscrib rounddisp" style="background-color:'.$row->color.'"></div>';
								?>
							</td>
						</tr>
						<?php $k = 1 - $k;
					}
				}else{ ?>
					<tr>
						<td>
							<?php echo acymailing_translation('EMAIL_AFFECT'); ?>
						</td>
					</tr>
				<?php } ?>
				</tbody>
			</table>
			<?php
			$filterClass = acymailing_get('class.filter');
			if(!empty($this->mail->filter)){
				$resultFilters = $filterClass->displayFilters($this->mail->filter);
				if(!empty($resultFilters)){
					echo '<br />'.acymailing_translation('RECEIVER_LISTS').'<br />'.acymailing_translation('FILTER_ONLY_IF');
					echo '<ul><li>'.implode('</li><li>', $resultFilters).'</li></ul>';
				}
			}

			if(!empty($this->lists)){
				?>
				<div style="text-align:center;font-size:14px;padding-top:10px;margin:10px 30px;border-top: 1px solid #ccc;">
					<?php
					$nbTotalReceivers = $filterClass->countReceivers($listids, $this->mail->filter, $this->mail->mailid);
					echo acymailing_translation_sprintf('SENT_TO_NUMBER', '<span style="font-weight:bold;" id="nbreceivers" >'.$nbTotalReceivers.'</span>');
					?>
				</div>
			<?php } ?>
		</div>
	<?php }
	include(dirname(__FILE__).DS.'previewcontent.php'); ?>
</div>
components/com_acymailing/views/newsletter/tmpl/index.html000060400000000054152453623450020212 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/newsletter/tmpl/info.form.php000060400000011156152453623450020630 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><table<?php if(!acymailing_isAdmin()){
	echo ' class="acymailing_table" style="margin: 10px 0px;"';
} ?> width="100%">
	<tr>
		<td class="acykey" id="subjectkey" valign="top">
			<label for="subject">
				<?php echo acymailing_translation('JOOMEXT_SUBJECT'); ?>
			</label>
		</td>
		<td id="subjectinput">
			<div>
				<input type="text" name="data[mail][subject]" id="subject" style="width:80%;" class="inputbox" value="<?php echo $this->escape(@$this->mail->subject); ?>" onClick="zoneToTag='subject';"/>
			</div>
		</td>
		<td class="acykey" id="publishedkey" valign="top">
			<label for="published">
				<?php echo acymailing_translation('ACY_PUBLISHED'); ?>
			</label>
		</td>
		<td id="publishedinput" valign="top">
			<?php echo ($this->mail->published == 2) ? acymailing_translation('SCHED_NEWS') : acymailing_boolean("data[mail][published]", '', $this->mail->published, acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO')); ?>
		</td>
	</tr>
	<tr>
		<td class="acykey" id="aliaskey">
			<label for="alias">
				<?php echo acymailing_translation('JOOMEXT_ALIAS'); ?>
			</label>
		</td>
		<td id="aliasinput">
			<input class="inputbox" type="text" name="data[mail][alias]" id="alias" style="width:80%;" value="<?php echo @$this->mail->alias; ?>" <?php echo($this->type == 'joomlanotification' ? 'readonly' : ''); ?>/>
		</td>
		<?php if ($this->type != 'joomlanotification'){ ?>
		<td class="acykey" id="visiblekey">
			<label for="visible">
				<?php echo acymailing_translation('JOOMEXT_VISIBLE'); ?>
			</label>
		</td>
		<td id="visibleinput">
			<?php echo acymailing_boolean("data[mail][visible]", '', $this->mail->visible, acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO')); ?>
		</td>
	</tr>
	<tr>
		<td class="acykey" id="createdkey" valign="top">
			<label for="createdinput">
				<?php echo acymailing_translation('CREATED_DATE'); ?>
			</label>
		</td>
		<td id="createdinput" valign="top">
			<?php echo acymailing_getDate(@$this->mail->created); ?>
		</td>
		<?php } ?>
		<td class="acykey" id="sendhtmlkey">
			<label for="data_mail_htmlfieldset">
				<?php echo acymailing_translation('SEND_HTML'); ?>
			</label>
		</td>
		<td id="sendhtmlinput">
			<?php echo acymailing_boolean("data[mail][html]", 'onclick="updateAcyEditor(this.value); initTagZone(this.value);"', $this->mail->html, acymailing_translation('JOOMEXT_YES'), acymailing_translation('JOOMEXT_NO')); ?>
		</td>
	</tr>
	<?php if($this->type != 'joomlanotification'){ ?>
		<tr class="hidewp">
			<td class="acykey" id="picturekey" valign="top">
				<label for="pictureinput">
					<?php echo acymailing_translation('ACY_THUMBNAIL'); ?>
				</label>
			</td>
			<td id="pictureinput" valign="top">
				<?php
				$uploadfileType = acymailing_get('type.uploadfile');
				echo $uploadfileType->display(true, 'thumb', $this->mail->thumb, 'data[mail][thumb]');
				?>
			</td>
			<td class="acykey" id="summarykey" valign="top">
				<label for="summaryfield">
					<?php echo acymailing_translation('ACY_SUMMARY'); ?>
				</label>
			</td>
			<td id="summaryinput" valign="top">
				<textarea placeholder="<?php echo acymailing_translation('ACY_SUMMARY_PLACEHOLDER') ?>" style="width:80%;height:60px;" id="summaryfield" name="data[mail][summary]"><?php echo $this->escape(@$this->mail->summary); ?></textarea>
			</td>
		</tr>
		<?php
		?>
		<?php if(!empty($this->mail->senddate)){ ?>
			<tr>
				<td class="acykey" id="senddatekey">
					<label for="senddateinput">
						<?php echo acymailing_translation('SEND_DATE'); ?>
					</label>
				</td>
				<td id="senddateinput">
					<?php echo acymailing_getDate(@$this->mail->senddate); ?>
				</td>
				<td class="acykey" id="sentbykey">
					<label for="sentbyinput">
						<?php if(!empty($this->mail->sentby)) echo acymailing_translation('SENT_BY'); ?>
					</label>
				</td>
				<td id="sentbyinput">
					<?php echo @$this->sentbyname; ?>
				</td>
			</tr>
		<?php }
	}
	$jflanguages = acymailing_get('type.jflanguages');
	if($jflanguages->multilingue){
		?>
		<tr>
			<td class="acykey" id="languagekey">
				<label for="jlang">
					<?php echo acymailing_translation('ACY_LANGUAGE'); ?>
				</label>
			</td>
			<td id="languageinput" colspan="3">
				<?php
				$jflanguages->sef = true;
				echo $jflanguages->displayJLanguages('data[mail][language]', empty($this->mail->language) ? '' : $this->mail->language);
				?>
			</td>
		</tr>
	<?php } ?>
</table>
components/com_acymailing/views/newsletter/tmpl/abtesting.php000060400000020262152453623450020711 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content" class="abTestingPage">
	<div id="iframedoc"></div>
	<?php
	if(empty($this->mailid) && empty($this->validationStatus)){
		acymailing_display(acymailing_translation('PLEASE_SELECT_NEWSLETTERS'), 'warning');
		return;
	}
	if(!empty($this->missingMail)) return;
	if($this->validationStatus == 'abTestFinalSend') return; ?>

	<script type="text/javascript">
		function updateReceivers(prct){
			newVal = Math.floor(prct.value *<?php echo $this->nbTotalReceivers; ?> / 100);
			document.getElementById('nbtestreceivers').innerHTML = newVal;
		}
	</script>
	<form action="<?php echo acymailing_completeLink('newsletter', true); ?>" method="post" name="adminForm" id="adminForm" autocomplete="off">
		<input type="hidden" name="mailid" value="<?php echo $this->mailid; ?>"/>

		<div class="onelineblockoptions">
			<?php echo acymailing_translation_sprintf('ABTESTING_PART_RECEIVER', '<input type="text" id="abTesting_prct" name="abTesting_prct" style="width:30px;" value="'.$this->abTestDetail['prct'].'" oninput="updateReceivers(this)">%'); ?>
			<div class="abtesting_mails">
				<table class="acymailing_smalltable">
					<?php
					echo '<thead><tr><th width="45%">'.acymailing_translation('NEWSLETTER').'</th>';
					if(!empty($this->savedValues)){
						echo '<th>'.acymailing_translation('OPEN').'</th><th>'.acymailing_translation('CLICKED_LINK').'</th><th>'.acymailing_translation('ACY_CLICK_EFFICIENCY').'</th><th>'.acymailing_translation('ACY_SENT_EMAILS').'</th>';
						if(!empty($this->abTestDetail['status']) && $this->abTestDetail['status'] == 'testSendOver' && $this->validationStatus != 'abTestAdd' && $this->abTestDetail['action'] == 'manual') echo '<th>'.acymailing_translation('SEND').'</th>';
					}
					echo '</tr></thead>';
					foreach($this->mailsdetails as $oneMail){
						echo '<tr><td>'.$oneMail->subject.'</td>';
						if(!empty($this->savedValues)){
							$open = (!empty($this->statMail[$oneMail->mailid]) ? $this->statMail[$oneMail->mailid]->openunique : '0');
							$click = (!empty($this->statMail[$oneMail->mailid]) ? $this->statMail[$oneMail->mailid]->clickunique : '0');
							$sent = (!empty($this->statMail[$oneMail->mailid]) ? $this->statMail[$oneMail->mailid]->senthtml + $this->statMail[$oneMail->mailid]->senttext : '0');
							if(acymailing_level(3)) $bounceunique = (!empty($this->statMail[$oneMail->mailid]) ? $this->statMail[$oneMail->mailid]->bounceunique : '0');
							if($sent != 0){
								if(acymailing_level(3)){
									$cleanSent = $sent - $bounceunique;
								}else $cleanSent = $sent;
								$openPrct = (!empty($this->statMail[$oneMail->mailid]) && !empty($cleanSent) ? round($this->statMail[$oneMail->mailid]->openunique / $cleanSent * 100) : '0');
								$clickPrct = (!empty($this->statMail[$oneMail->mailid]) && !empty($cleanSent) ? round($this->statMail[$oneMail->mailid]->clickunique / $cleanSent * 100) : '0');
								$efficiencyPrct = (!empty($this->statMail[$oneMail->mailid]) && !empty($open) ? round($click / $open * 100) : '0');
							}else{
								$openPrct = 0;
								$clickPrct = 0;
								$efficiencyPrct = 0;
							}
							$openTxt = (!empty($cleanSent) ? $open.' / '.$cleanSent.' ('.$openPrct.'%)' : $open);
							$clickTxt = (!empty($cleanSent) ? $click.' / '.$cleanSent.' ('.$clickPrct.'%)' : $click);
							echo '<td style="text-align:center">'.$openTxt.'</td>';
							echo '<td style="text-align:center">'.$clickTxt.'</td>';
							echo '<td style="text-align:center">'.$click.' / '.$open.' ('.$efficiencyPrct.'%)</td>';
							echo '<td style="text-align:center">'.$sent.'</td>';
						}
						if(!empty($this->abTestDetail['status']) && $this->abTestDetail['status'] == 'testSendOver' && $this->validationStatus != 'abTestAdd' && $this->abTestDetail['action'] == 'manual'){
							echo '<td><a class="acymailing_button" href="'.acymailing_completeLink('newsletter&task=complete_abtest&mailToSend='.$oneMail->mailid, true).'">'.acymailing_translation('SEND').'</a></td>';
						}
						echo '</tr>';
					} ?>
				</table>
			</div>
			<div>
				<div class="acyblocktitle"><?php echo acymailing_translation('NEWSLETTER_SENT_TO'); ?></div>
				<table class="acymailing_smalltable">
					<tbody>
					<?php if(!empty($this->lists)){
						$k = 0;
						$listids = array();
						foreach($this->lists as $row){
							?>
							<tr class="<?php echo "row$k"; ?>">
								<td>
									<?php
									if(!$row->published) echo '<a href="'.acymailing_completeLink('list&task=edit&listid='.$row->listid).'" title="'.acymailing_translation('LIST_PUBLISH', true).'"><img style="margin:0px;" src="'.ACYMAILING_IMAGES.'warning.png" alt="Warning" /></a> ';
									echo acymailing_tooltip($row->description, $row->name, '', $row->name);
									echo ' ( '.acymailing_translation_sprintf('ACY_SELECTED_USERS', $row->nbsub).' )';
									echo '<div class="roundsubscrib rounddisp" style="background-color:'.$row->color.'"></div>';
									?>
								</td>
							</tr>
							<?php $k = 1 - $k;
						}
					}else{ ?>
						<tr>
							<td>
								<?php echo acymailing_translation('EMAIL_AFFECT'); ?>
							</td>
						</tr>
					<?php } ?>
					</tbody>
				</table>
				<?php
				if(!empty($this->mailReceiver->filter)){
					$resultFilters = $this->filterClass->displayFilters($this->mailReceiver->filter);
					if(!empty($resultFilters)){
						echo '<br />'.acymailing_translation('RECEIVER_LISTS').'<br />'.acymailing_translation('FILTER_ONLY_IF');
						echo '<ul><li>'.implode('</li><li>', $resultFilters).'</li></ul>';
					}
				}

				if(!empty($this->lists)){
					?>
					<div style="text-align:center;font-size:14px;padding-top:10px;margin:10px 30px;border-top: 1px solid #ccc;">
						<?php

						echo acymailing_translation_sprintf('ABTESTING_SENTTO_NUMBER', '<span style="font-weight:bold;" id="nbtestreceivers" >'.$this->nbTestReceivers.'</span>', '<span style="font-weight:bold;" id="nbreceivers" >'.$this->nbTotalReceivers.'</span>');
						?>
					</div>
				<?php } ?>
			</div>
			<?php echo acymailing_translation_sprintf('ABTESTING_MODIFY_RECEIVERS', '<a target="_blank" href="'.acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'newsletter&task=edit&mailid='.$this->mailsdetails[0]->mailid).'">'.$this->mailsdetails[0]->subject.'</a>'); ?>
		</div>
		<div class="onelineblockoptions">
			<?php echo acymailing_translation_sprintf('ABTESTING_DELAY_ACTION', '<input type="text" id="abTesting_delay" name="abTesting_delay" style="width:30px;" value="'.$this->abTestDetail['delay'].'">'); ?>
			<div class="abtesting_actions">
				<div style="margin-bottom: 5px;"><input type="radio" name="abTesting_action" id="abTesting_action_manual" value="manual" <?php echo ($this->abTestDetail['action'] == 'manual') ? 'checked="checked"' : ''; ?>><label for="abTesting_action_manual" class="radiobtn"><?php echo acymailing_translation('DO_NOTHING'); ?></label></div>
				<div style="margin-bottom: 5px;"><input type="radio" name="abTesting_action" id="abTesting_action_open" value="open" <?php echo ($this->abTestDetail['action'] == 'open') ? 'checked="checked"' : ''; ?>><label for="abTesting_action_open" class="radiobtn"><?php echo acymailing_translation('ABTESTING_ACTION_GENERATE_OPEN'); ?></label></div>
				<div style="margin-bottom: 5px;"><input type="radio" name="abTesting_action" id="abTesting_action_click" value="click" <?php echo ($this->abTestDetail['action'] == 'click') ? 'checked="checked"' : ''; ?>><label for="abTesting_action_click" class="radiobtn"><?php echo acymailing_translation('ABTESTING_ACTION_GENERATE_CLICK'); ?></label></div>
				<div style="margin-bottom: 5px;"><input type="radio" name="abTesting_action" id="abTesting_action_mix" value="mix" <?php echo ($this->abTestDetail['action'] == 'mix') ? 'checked="checked"' : ''; ?>><label for="abTesting_action_mix" class="radiobtn"><?php echo acymailing_translation('ABTESTING_ACTION_GENERATE_MIX'); ?></label></div>
			</div>
		</div>
		<input type="hidden" name="nbTotalReceivers" value="<?php echo $this->nbTotalReceivers; ?>"/>
		<?php acymailing_formOptions(); ?>
	</form>
</div>
components/com_acymailing/views/newsletter/tmpl/filters.php000060400000006120152453623450020376 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

acymailing_importPlugin('acymailing');
$typesFilters = array();
$outputFilters = implode('', acymailing_trigger('onAcyDisplayFilters', array(&$typesFilters, 'mail')));

if(empty($typesFilters)) return;

$filterClass = acymailing_get('class.filter');
$filterClass->addJSFilterFunctions();

$js = '';
$datatype = "filter";
if(!empty($this->mail->$datatype)){
	foreach($this->mail->{$datatype}['type'] as $block => $oneFilter){
		$jsFunction = "if(!document.getElementById('addButton_$block')) addOrBlock();
					document.getElementById('addButton_$block').click();";

		foreach($oneFilter as $num => $oneType) {
			if (empty($oneType)) continue;
			$js .= "
				if(!document.getElementById('" . $datatype . "type$num')){
					" . $jsFunction . "
				}
				
				document.getElementById('" . $datatype . "type$num').value= '$oneType';
				update" . ucfirst($datatype) . "($num);";
			if (empty($this->mail->{$datatype}[$num][$oneType])) continue;

			foreach ($this->mail->{$datatype}[$num][$oneType] as $key => $value) {
				$js .= "
				try{
					document.adminForm.elements['" . $datatype . "[$num][$oneType][$key]'].value = '" . addslashes(str_replace(array("\n", "\r"), ' ', $value)) . "';
					if(document.adminForm.elements['" . $datatype . "[$num][$oneType][$key]'].type && document.adminForm.elements['" . $datatype . "[$num][$oneType][$key]'].type == 'checkbox'){
						document.adminForm.elements['" . $datatype . "[$num][$oneType][$key]'].checked = 'checked';
					}
				}catch(e){}";
			}

			if ($datatype == 'filter') $js .= " countresults($num);";
		}
	}
}

acymailing_addScript(true, "document.addEventListener(\"DOMContentLoaded\", function(){ $js });");

$typevaluesFilters = array();
$typevaluesFilters[] = acymailing_selectOption('', acymailing_translation('FILTER_SELECT'));
foreach($typesFilters as $oneType => $oneName){
	$typevaluesFilters[] = acymailing_selectOption($oneType, $oneName);
}

?>
<br/>
<div class="acy_filter_mail">
	<input type="hidden" name="data[mail][filter]" value=""/>

	<div id="acybase_filters" style="display:none">
		<div id="filters_original">
			<?php echo acymailing_select($typevaluesFilters, "filter[type][__block__][__num__]", 'class="inputbox" size="1" onchange="updateFilter(__num__);countresults(__num__);"', 'value', 'text', '', 'filtertype__num__'); ?>
			<span id="countresult___num__"></span>

			<div class="acyfilterarea" id="filterarea___num__"></div>
		</div>
		<?php echo $outputFilters; ?>
	</div>
	<?php echo acymailing_translation('RECEIVER_LISTS').' '.acymailing_translation('RECEIVER_FILTER'); ?>
	<div class="onelineblockoptions" id="filtersblock">
		<span class="acyblocktitle"><?php echo acymailing_translation('ACY_FILTERS'); ?></span>
		<button id="acyorbutton" class="acymailing_button" onclick="addOrBlock();return false;"><?php echo ucfirst(acymailing_translation('ACY_OR')); ?></button>
	</div>
</div>
components/com_acymailing/views/newsletter/tmpl/test.php000060400000005167152453623450017717 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><form action="<?php echo acymailing_completeLink($this->ctrl); ?>" method="post" name="adminForm" id="adminForm" autocomplete="off" <?php if(in_array($this->type, array('news', 'autonews'))){
	if(acymailing_isAdmin()) echo 'style="width:42%;min-width:480px;float:left;margin-right:15px;"';
} ?>>
	<div class="<?php if(acymailing_isAdmin()){
		echo 'acyblockoptions';
	}else{
		echo 'onelineblockoptions';
	} ?> acyblock_newsletter" id="sendatest">
		<span class="acyblocktitle"><?php echo acymailing_translation('SEND_TEST'); ?></span>

		<table width="100%">
			<tr>
				<td valign="top" width="100px;" nowrap="nowrap">
					<?php echo acymailing_translation('SEND_TEST_TO'); ?>
				</td>
				<td>
					<?php echo $this->testreceiverType->display($this->infos->test_selection, $this->infos->test_group, $this->infos->test_emails); ?>
				</td>
			</tr>
			<tr>
				<td nowrap="nowrap">
					<?php echo acymailing_translation('SEND_VERSION'); ?>
				</td>
				<td>
					<?php if($this->mail->html){
						echo acymailing_boolean('test_html', '', $this->infos->test_html, acymailing_translation('HTML'), acymailing_translation('JOOMEXT_TEXT'));
					}else{
						echo acymailing_translation('JOOMEXT_TEXT');
						echo '<input type="hidden" name="test_html" value="0" />';
					} ?>
				</td>
			</tr>
			<tr>
				<td valign="top"><?php echo acymailing_translation('SEND_COMMENT'); ?></td>
				<td>
					<div><textarea placeholder="<?php echo acymailing_translation('SEND_COMMENT_DESC'); ?>" name="commentTest" id="commentTest" style="width:90%;height:80px;"><?php echo acymailing_getVar('string', 'commentTest', ''); ?></textarea></div>
				</td>
			</tr>
			<tr>
				<td>

				</td>
				<td style="padding-top:10px;">
					<button type="submit" class="acymailing_button" onclick="document.adminForm.task.value='sendtest';var val = document.getElementById('message_receivers').value; if(val != ''){ setUser(val); }"><?php echo acymailing_translation('SEND_TEST') ?></button>
				</td>
			</tr>
		</table>
	</div>
	<input type="hidden" name="cid[]" value="<?php echo $this->mail->mailid; ?>"/>
	<?php if(!empty($this->lists)){
		$firstList = reset($this->lists);
		$myListId = $firstList->listid;
	}else{
		$myListId = acymailing_getVar('int', 'listid', 0);
	}
	if(!empty($myListId)){
		?> <input type="hidden" name="listid" value="<?php echo $myListId; ?>"/> <?php } ?>
	<?php acymailing_formOptions(); ?>
</form>
components/com_acymailing/views/newsletter/tmpl/filter.lists.php000060400000015753152453623450021364 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
if(empty($currentPage)) $currentPage = 'mail';

foreach($this->lists as $oneList){
	$listids[] = $oneList->listid;
}
if(count($this->lists) > 10){
	?>
	<script language="javascript" type="text/javascript">
		<!--
		var listids = new Array(<?php echo implode(',', $listids); ?>);
		function acymailing_searchAList(){
			var filter = document.getElementById("acymailing_searchList").value.toLowerCase();
			for(var i = 0; i < listids.length; i++){
				var itemName = document.getElementById("listName_" + listids[i]).innerHTML.toLowerCase();
				if(itemName.indexOf(filter) > -1){
					document.getElementById("acylistrow_" + listids[i]).style.display = "table-row";
				}else{
					document.getElementById("acylistrow_" + listids[i]).style.display = "none";
				}
			}
		}
		//-->
	</script>
	<div style="margin-bottom:10px;"><input onkeyup="acymailing_searchAList();" type="text" style="width: 200px;max-width:100%;margin-bottom:5px;" placeholder="<?php echo acymailing_translation('ACY_SEARCH'); ?>" id="acymailing_searchList"></div>
<?php }

$k = 0;
$i = 0;

$orderedList = array();
$listsPerCategory = array();
$languages = array();
foreach($this->lists as $row){
	$orderedList[$row->category][$row->listid] = $row;
	$listsPerCategory[$row->category][$row->listid] = $row->listid;
	if(count($this->lists) < 4) continue;

	$languages['all'][$row->listid] = $row->listid;
	if($row->languages == 'all') continue;
	$lang = explode(',', trim($row->languages, ','));
	foreach($lang as $oneLang){
		$languages[strtolower($oneLang)][$row->listid] = $row->listid;
	}
}
ksort($orderedList);
$allCats = array_keys($orderedList);
$categorizedLists = array();
foreach($orderedList as $oneCategory){
	$categorizedLists = array_merge($categorizedLists, $oneCategory);
}

echo '<table class="acymailing_table" id="lists_choice"><tbody>';

$filter_list = acymailing_getVar('int', 'filter_list');
if(empty($filter_list)) $filter_list = acymailing_getVar('int', 'listid');
$selectedLists = explode(',', acymailing_getVar('string', 'listids'));

foreach($categorizedLists as $row){
	if(empty($row->category)) $row->category = acymailing_translation('ACY_NO_CATEGORY');
	if(count($allCats) > 1 && (empty($currentCatgeory) || $row->category != $currentCatgeory)){
		$currentCatgeory = $row->category;
		?>
		<tr class="<?php echo "row$k"; ?>">
			<td colspan="2">
				<a href="#" onclick="checkCats('<?php echo htmlspecialchars(str_replace("'", "\'", $row->category == acymailing_translation('ACY_NO_CATEGORY') ? -1 : $row->category), ENT_QUOTES, "UTF-8"); ?>'); return false;"><strong><?php echo htmlspecialchars($row->category, ENT_QUOTES, "UTF-8"); ?></strong></a>
			</td>
		</tr>
		<?php
	}

	$checked = (bool)($row->{$currentPage.'id'} || // The list was selected before
					  (empty($row->mailid) && empty($this->mail->mailid) && $filter_list == $row->listid) || // When creating a new newsletter when filtering by list from the listing
					  (empty($this->mail->mailid) && count($this->lists) == 1) || // When creating a newsletter and only one list available
					  (in_array($row->listid, $selectedLists))); // Selected lists on the previous page

	$classList = $checked ? 'acy_list_checked' : 'acy_list_unchecked';
	echo '<tr id="acylistrow_'.$row->listid.'" class="row'.$k.' '.$classList.'" onclick="toggleList(\''.$row->listid.'\', null);">
		<td style="display:none;" id="listId_'.$row->listid.'">'.$row->listid.'</td>
		<td style="display:none;" id="listName_'.$row->listid.'">'.$row->name.'</td>
		<td class="acytdcheckbox"><input name="data[list'.$currentPage.']['.$row->listid.']" id="datalistmail'.$row->listid.'" type="hidden" value="'.(int)$checked.'" /></td>
		<td>
			<div class="roundsubscrib rounddisp" style="background-color:'.$row->color.'"></div>';
	$text = '<b>'.acymailing_translation('ACY_ID').' : </b>'.$row->listid;
	$text .= '<br />'.$row->description;
	echo acymailing_tooltip($text, $row->name, 'tooltip.png', $row->name).'
		</td>
	</tr>';

	$k = 1 - $k;
	$i++;
}

if(count($this->lists) > 3){ ?>
	<tr>
		<td></td>
		<td nowrap="nowrap">
			<script language="javascript" type="text/javascript">
				<!--
				var selectedLists = new Array();
				<?php
				foreach($languages as $val => $listids){
					echo "selectedLists['$val'] = new Array('".implode("','", $listids)."'); ";
				}
				?>
				function updateStatus(selection){
					<?php
					$listidAll = "selectedLists['all'][i]+'listmail";
					$listidSelection = "selectedLists[selection][i]+'listmail";
					?>
					for(var i = 0; i < selectedLists['all'].length; i++){
						if(document.getElementById('acylistrow_' + selectedLists['all'][i]).style.display == 'none') continue;
						toggleList(selectedLists['all'][i], 0);
					}
					if(!selectedLists[selection]) return;
					for(i = 0; i < selectedLists[selection].length; i++){
						if(document.getElementById('acylistrow_' + selectedLists[selection][i]).style.display == 'none') continue;
						toggleList(selectedLists[selection][i], 1);
					}
				}
				-->
			</script>
			<?php
			$selectList = array();
			$selectList[] = acymailing_selectOption('none', acymailing_translation('ACY_NONE'));
			foreach($languages as $oneLang => $values){
				if($oneLang == 'all') continue;
				$selectList[] = acymailing_selectOption($oneLang, ucfirst($oneLang));
			}
			$selectList[] = acymailing_selectOption('all', acymailing_translation('ACY_ALL'));
			echo acymailing_radio($selectList, "selectlists", 'onclick="updateStatus(this.value);"', 'value', 'text');
			?>
		</td>
	</tr>
<?php } ?>
</tbody>
</table>

<script language="javascript" type="text/javascript">
	<!--
	function toggleList(id, value){
		var valueField = document.getElementById('datalistmail' + id);
		var row = document.getElementById('acylistrow_' + id);

		if(value == 1 || (valueField.value == 0 && value != 0)){
			valueField.value = 1;
			row.className = row.className.replace('acy_list_unchecked', 'acy_list_checked');
		}else{
			valueField.value = 0;
			row.className = row.className.replace('acy_list_checked', 'acy_list_unchecked');
		}
	}

	var listsCats = new Array();

	<?php
	foreach($listsPerCategory as $val => $listids){
		if(empty($val)) $val = '-1';
		echo "listsCats['".str_replace("'", "\'", $val)."'] = new Array('".implode("','", $listids)."'); ";
	}

	?>
	function checkCats(selection){
		if(!listsCats[selection]) return;
		var select = 0;
		for(var i = 0; i < listsCats[selection].length; i++){
			if(document.getElementById('acylistrow_' + listsCats[selection][i]).style.display == 'none') continue;
			if(document.getElementById('datalistmail' + listsCats[selection][i]).value == 0){
				select = 1;
				break;
			}
		}

		for(i = 0; i < listsCats[selection].length; i++){
			if(document.getElementById('acylistrow_' + listsCats[selection][i]).style.display == 'none') continue;
			toggleList(listsCats[selection][i], select);
		}
	}
	-->
</script>
components/com_acymailing/views/newsletter/index.html000060400000000054152453623450017236 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/newsletter/view.html.php000060400000111111152453623450017664 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php


class NewsletterViewNewsletter extends acymailingView{
	var $type = 'news';
	var $ctrl = 'newsletter';
	var $nameListing = 'NEWSLETTERS';
	var $nameForm = 'NEWSLETTER';
	var $icon = 'newsletter';
	var $aclCat = 'newsletters';
	var $doc = 'newsletters';

	function display($tpl = null){
		$function = $this->getLayout();
		if(method_exists($this, $function)) $this->$function();

		parent::display($tpl);
	}

	function listing(){
		$pageInfo = new stdClass();
		$pageInfo->filter = new stdClass();
		$pageInfo->filter->order = new stdClass();
		$pageInfo->limit = new stdClass();
		$pageInfo->elements = new stdClass();

		$config = acymailing_config();

		$paramBase = ACYMAILING_COMPONENT.'.'.$this->getName();
		$pageInfo->filter->order->value = acymailing_getUserVar($paramBase.".filter_order", 'filter_order', 'a.mailid', 'cmd');
		$pageInfo->filter->order->dir = acymailing_getUserVar($paramBase.".filter_order_Dir", 'filter_order_Dir', 'desc', 'word');
		if(strtolower($pageInfo->filter->order->dir) !== 'desc') $pageInfo->filter->order->dir = 'asc';

		$pageInfo->search = acymailing_getUserVar($paramBase.".search", 'search', '', 'string');
		$pageInfo->search = strtolower(trim($pageInfo->search));
		$selectedList = acymailing_getUserVar($paramBase."filter_list", 'filter_list', 0, 'int');
		$selectedCreator = acymailing_getUserVar($paramBase."filter_creator", 'filter_creator', 0, 'int');
		$selectedTags = acymailing_getUserVar($paramBase."filter_tags", 'filter_tags', array(), 'array');
		
		$pageInfo->limit->value = acymailing_getUserVar($paramBase.'.list_limit', 'limit', acymailing_getCMSConfig('list_limit'), 'int');
		$pageInfo->limit->start = acymailing_getUserVar($paramBase.'.limitstart', 'limitstart', 0, 'int');

		$searchMap = array('a.mailid', 'a.alias', 'a.subject', 'a.fromname', 'a.fromemail', 'a.replyname', 'a.replyemail', 'a.userid', 'b.'.$this->cmsUserVars->name, 'b.'.$this->cmsUserVars->username, 'b.'.$this->cmsUserVars->email);
		$filters = array();
		if(!empty($pageInfo->search)){
			$searchVal = '\'%'.acymailing_getEscaped($pageInfo->search, true).'%\'';
			$filters[] = implode(" LIKE $searchVal OR ", $searchMap)." LIKE $searchVal";
		}

		if($this->type == 'news'){
			$actionExists = acymailing_loadResult('SELECT mailid FROM #__acymailing_mail WHERE type = "action" LIMIT 1');

			$selectedType = acymailing_getUserVar($paramBase."filter_type", 'filter_type', 'news', 'string');
			if(!empty($selectedType) && $actionExists){
				$filters[] = 'a.type = '.acymailing_escapeDB($selectedType);
			}else{
				$filters[] = 'a.type IN ("news","action")';
			}
		}else{
			$filters[] = 'a.type = \''.$this->type.'\'';
		}

		if(!empty($selectedList)) $filters[] = 'c.listid = '.$selectedList;
		if(!empty($selectedCreator)) $filters[] = 'a.userid = '.$selectedCreator;
		if($this->type == 'news'){
			$selectedDate = acymailing_getUserVar($paramBase."filter_date", 'filter_date', 0, 'string');
			if(!empty($selectedDate)){
				if(strlen($selectedDate) > 4){
					$filters[] = 'DATE_FORMAT(FROM_UNIXTIME(senddate),"%Y-%m") = '.acymailing_escapeDB($selectedDate);
				}else $filters[] = 'DATE_FORMAT(FROM_UNIXTIME(senddate),"%Y") = '.acymailing_escapeDB($selectedDate);
			}
		}

		$selection = array('a.mailid', 'a.alias', 'a.subject', 'a.fromname', 'a.fromemail', 'a.replyname', 'a.replyemail', 'a.userid', 'b.'.$this->cmsUserVars->name.' AS name', 'b.'.$this->cmsUserVars->username.' AS username', 'b.'.$this->cmsUserVars->email.' AS email', 'a.created', 'a.frequency', 'a.senddate', 'a.published', 'a.type', 'a.visible', 'a.abtesting');

		if(empty($selectedList)){
			if(acymailing_isAdmin()){
				$query = 'SELECT '.implode(',', $selection).' FROM '.acymailing_table('mail').' as a';
				$queryCount = 'SELECT COUNT(a.mailid) FROM '.acymailing_table('mail').' as a';
			}else{
				$query = 'SELECT '.implode(',', $selection).' FROM '.acymailing_table('listmail').' as c';
				$query .= ' JOIN '.acymailing_table('mail').' as a on a.mailid = c.mailid ';
				$queryCount = 'SELECT COUNT(DISTINCT c.mailid) FROM '.acymailing_table('listmail').' as c';
				$queryCount .= ' JOIN '.acymailing_table('mail').' as a on a.mailid = c.mailid ';
			}
		}else{
			$query = 'SELECT '.implode(',', $selection).' FROM '.acymailing_table('listmail').' as c';
			$query .= ' JOIN '.acymailing_table('mail').' as a on a.mailid = c.mailid ';
			$queryCount = 'SELECT COUNT(c.mailid) FROM '.acymailing_table('listmail').' as c';
			$queryCount .= ' JOIN '.acymailing_table('mail').' as a on a.mailid = c.mailid ';
		}

		$query .= ' LEFT JOIN '.acymailing_table($this->cmsUserVars->table, false).' as b on a.userid = b.'.$this->cmsUserVars->id;

		if(!empty($selectedTags) && count($selectedTags) > 1){
			$tagCondition = array();
			foreach($selectedTags as $oneTag){
				if(strpos($oneTag, '|') === false) continue;
				$tag = explode('|', $oneTag);
				$tagCondition[] = intval($tag[0]);
			}
			$query .= ' JOIN #__acymailing_tagmail AS tm ON a.mailid = tm.mailid AND tagid IN ('.implode(',', $tagCondition).') ';
			$queryCount .= ' JOIN #__acymailing_tagmail AS tm ON a.mailid = tm.mailid AND tagid IN ('.implode(',', $tagCondition).') ';
		}

		$query .= ' WHERE ('.implode(') AND (', $filters).')';

		if(!empty($pageInfo->search)) $queryCount .= ' LEFT JOIN '.acymailing_table($this->cmsUserVars->table, false).' as b on a.userid = b.'.$this->cmsUserVars->id;

		$queryCount .= ' WHERE ('.implode(') AND (', $filters).')';

		$listClass = acymailing_get('class.list');
		if(!acymailing_isAdmin()){
			$lists = $listClass->getFrontendLists();
			if(!empty($lists)){
				$frontListsIds = array();
				if(empty($selectedList)){
					foreach($lists as $oneList){
						$frontListsIds[] = $oneList->listid;
					}
					$query .= ' AND c.listid IN ('.implode(',', $frontListsIds).')';
					$queryCount .= ' AND c.listid IN ('.implode(',', $frontListsIds).')';
				}
			}
			$query .= ' GROUP BY a.mailid ';
		}

		if(!empty($pageInfo->filter->order->value) && !in_array($pageInfo->filter->order->value, array('a.date', 'c.email'))){
			$query .= ' ORDER BY '.$pageInfo->filter->order->value.' '.$pageInfo->filter->order->dir;
		}

		$rows = acymailing_loadObjectList($query, 'mailid', $pageInfo->limit->start, $pageInfo->limit->value);

		if(!empty($rows)){
			$queueCount = acymailing_loadObjectList('SELECT COUNT(*) AS countqueued, mailid FROM '.acymailing_table('queue').' WHERE mailid IN ('.implode(',', array_keys($rows)).') GROUP BY mailid');
			if(!empty($queueCount)){
				foreach($queueCount as $oneQueueCount){
					$rows[$oneQueueCount->mailid]->countqueued = $oneQueueCount->countqueued;
				}
			}
		}

		$pageInfo->elements->total = acymailing_loadResult($queryCount);
		$pageInfo->elements->page = count($rows);

		$pagination = new acyPagination($pageInfo->elements->total, $pageInfo->limit->start, $pageInfo->limit->value);

		$isAdmin = false;
		if(acymailing_isAdmin()){
			$isAdmin = true;

			$buttonPreview = acymailing_translation('ACY_PREVIEW');
			$acyToolbar = acymailing_get('helper.toolbar');
			if($this->type == 'autonews'){
				$acyToolbar->custom('generate', acymailing_translation('GENERATE'), 'process', false, '');
			}elseif($this->type == 'news'){
				$buttonPreview .= ' / '.acymailing_translation('SEND');
			}

			$acyToolbar->custom('preview', $buttonPreview, 'search', true);

			if(acymailing_level(3) && acymailing_isAllowed($config->get('acl_'.$this->aclCat.'_abtesting', 'all')) && $this->type == 'news') $acyToolbar->popup('ABtesting', acymailing_translation('ABTESTING'), acymailing_completeLink('newsletter&task=abtesting', true), 800, 600);

			if(acymailing_level(3)){
				$acyToolbar->popup('import', acymailing_translation('IMPORT'), acymailing_completeLink("newsletter&task=upload", true), 450, 200);
			}
			if(acymailing_level(3) || acymailing_isAllowed($config->get('acl_'.$this->aclCat.'_copy', 'all'))) $acyToolbar->divider();

			$acyToolbar->add();
			$acyToolbar->edit();
			if(acymailing_isAllowed($config->get('acl_'.$this->aclCat.'_copy', 'all'))) $acyToolbar->copy();
			if(acymailing_isAllowed($config->get('acl_'.$this->aclCat.'_delete', 'all'))) $acyToolbar->delete();
			$acyToolbar->divider();
			$acyToolbar->help($this->doc);
			$acyToolbar->setTitle(acymailing_translation($this->nameListing), $this->ctrl);
			$acyToolbar->display();
		}

		$filters = new stdClass();
		if(acymailing_isAdmin()){
			$listmailType = acymailing_get('type.listsmail');
			$listmailType->type = $this->type;
			$filters->list = $listmailType->display('filter_list', $selectedList);
		}else{
			$accessibleLists = array();
			$accessibleLists[] = acymailing_selectOption('0', acymailing_translation('ALL_LISTS'));
			foreach($lists as $oneList){
				$accessibleLists[] = acymailing_selectOption($oneList->listid, $oneList->name);
			}
			$filters->list = acymailing_select($accessibleLists, 'filter_list', 'class="inputbox" size="1" onchange="document.adminForm.submit( );"', 'value', 'text', (int)$selectedList);
		}
		$creatorfilterType = acymailing_get('type.creatorfilter');
		$creatorfilterType->type = $this->type;

		$filters->creator = $creatorfilterType->display('filter_creator', $selectedCreator, 'mail');

		if($this->type == 'news'){
			$senddates = acymailing_loadResultArray('SELECT DATE_FORMAT(FROM_UNIXTIME(senddate),"%Y-%m") AS date FROM #__acymailing_mail WHERE senddate IS NOT NULL AND senddate != 0 AND type = "news" GROUP BY date ORDER BY date DESC');
			$sendFilter = array();
			$sendFilter[] = acymailing_selectOption('0', acymailing_translation('SEND_DATE'));
			if(!empty($senddates)){
				$currentYear = '';
				foreach($senddates as $oneSenddate){
					list($year, $month) = explode('-', $oneSenddate);
					if($year != $currentYear){
						$sendFilter[] = acymailing_selectOption($year, '- '.$year.' -');
						$currentYear = $year;
					}
					$sendFilter[] = acymailing_selectOption($oneSenddate, acymailing_date(strtotime($oneSenddate.'-15'), ACYMAILING_J16 ? 'F' : '%B', false));
				}
			}
			$filters->date = acymailing_select($sendFilter, 'filter_date', 'class="inputbox" size="1" onchange="document.adminForm.submit();"', 'value', 'text', $selectedDate);

			if(empty($actionExists)){
				$filters->type = '';
			}else{
				$typeFilter = array();
				$typeFilter[] = acymailing_selectOption('', acymailing_translation('ACY_TYPE'));
				$typeFilter[] = acymailing_selectOption('news', acymailing_translation('NEWSLETTER'));
				$typeFilter[] = acymailing_selectOption('action', acymailing_translation('ACY_DISTRIBUTION'));
				$filters->type = acymailing_select($typeFilter, 'filter_type', 'class="inputbox" size="1" onchange="document.adminForm.submit();"', 'value', 'text', $selectedType);
			}
		}

		if(acymailing_level(3)){
			$tagfieldtype = acymailing_get('type.tagfield');
			$tagfieldtype->onclick = 'document.adminForm.submit();';
			$filters->tags = $tagfieldtype->display('filter_tags', 'listing', $selectedTags);
		}else{
			$filters->tags = '';
		}

		$mailToLists = array();
		foreach($rows as $row){
			$queryList = "SELECT listid FROM #__acymailing_listmail WHERE mailid=".$row->mailid;
			$listMail = acymailing_loadObjectList($queryList, 'listid');
			$mailToLists[$row->mailid] = array_keys($listMail);
		}
		$listColor = acymailing_loadObjectList("SELECT listid, color, name FROM #__acymailing_list", 'listid');
		$this->mailToLists = $mailToLists;
		$this->listColor = $listColor;


		$this->filters = $filters;
		$toggleClass = acymailing_get('helper.toggle');
		$this->toggleClass = $toggleClass;
		$this->rows = $rows;
		$this->pageInfo = $pageInfo;
		$this->pagination = $pagination;
		$delay = acymailing_get('type.delaydisp');
		$this->delay = $delay;
		$this->config = $config;
		$this->isAdmin = $isAdmin;

		if($this->type == 'autonews'){
			$frequency = acymailing_get('type.frequency');
			$this->frequencyType = $frequency;
		}
	}

	function form(){
		$_SESSION['timeOnModification'] = time();
		$this->chosen = false;
		$mailid = acymailing_getCID('mailid');
		$templateClass = acymailing_get('class.template');
		$config = acymailing_config();

		if(!empty($mailid)){
			$mailClass = acymailing_get('class.mail');
			$mail = $mailClass->get($mailid);

			if(empty($mail->mailid)){
				acymailing_display('Newsletter '.$mailid.' not found', 'error');
				$mailid = 0;
			}
		}

		if(empty($mailid)){
			$mail = new stdClass();
			$mail->created = time();
			$mail->published = 0;
			$mail->thumb = '';
			if($this->type == 'followup') $mail->published = 1;
			$mail->visible = 1;
			$mail->html = 1;
			$mail->body = '';
			$mail->altbody = '';
			$mail->tempid = 0;

			$templateid = acymailing_getVar('int', 'templateid');
			$email = acymailing_currentUserEmail();
			if(empty($templateid) AND !empty($email)){
				$subscriberClass = acymailing_get('class.subscriber');
				$currentSubscriber = $subscriberClass->get($email);
				if(!empty($currentSubscriber->template)) $templateid = $currentSubscriber->template;
			}

			if(empty($templateid)){
				$myTemplate = $templateClass->getDefault();
			}else{
				$myTemplate = $templateClass->get($templateid);
			}

			if(!empty($myTemplate->tempid)){
				$mail->body = acymailing_absoluteURL($myTemplate->body);
				$mail->altbody = $myTemplate->altbody;
				$mail->tempid = $myTemplate->tempid;
				$mail->subject = $myTemplate->subject;
				$mail->replyname = $myTemplate->replyname;
				$mail->replyemail = $myTemplate->replyemail;
				$mail->fromname = $myTemplate->fromname;
				$mail->fromemail = $myTemplate->fromemail;
			}

			if($this->type == 'autonews'){
				$mail->frequency = 2592000;
			}

			if(!acymailing_isAdmin()){
				if($config->get('frontend_sender', 0)){
					$mail->fromname = acymailing_currentUserName();
					$mail->fromemail = acymailing_currentUserEmail();
				}else{
					if(empty($mail->fromname)) $mail->fromname = $config->get('from_name');
					if(empty($mail->fromemail)) $mail->fromemail = $config->get('from_email');
				}

				if($config->get('frontend_reply', 0)){
					$mail->replyname = acymailing_currentUserName();
					$mail->replyemail = acymailing_currentUserEmail();
				}else{
					if(empty($mail->replyname)) $mail->replyname = $config->get('reply_name');
					if(empty($mail->replyemail)) $mail->replyemail = $config->get('reply_email');
				}
			}
		}

		$sentbyname = '';
		if(!empty($mail->sentby)){
			$sentbyname = acymailing_loadResult('SELECT `'.$this->cmsUserVars->name.'` AS name FROM '.acymailing_table($this->cmsUserVars->table, false).' WHERE `'.$this->cmsUserVars->id.'`= '.intval($mail->sentby).' LIMIT 1');
		}
		$this->sentbyname = $sentbyname;

		if(acymailing_getVar('none', 'task', '') == 'replacetags'){
			$mailerHelper = acymailing_get('helper.mailer');
			$templateClass = acymailing_get('class.template');
			$mail->template = $templateClass->get($mail->tempid);

			acymailing_importPlugin('acymailing');
			$mailerHelper->triggerTagsWithRightLanguage($mail, false);

			if(!empty($mail->altbody)) $mail->altbody = $mailerHelper->textVersion($mail->altbody, false);
		}

		$extraInfos = '';
		$lists = array();
		$values = new stdClass();
		if($this->type == 'followup'){
			$campaignid = acymailing_getVar('int', 'campaign', 0);
			$extraInfos .= '&campaign='.$campaignid;

			$values->delay = acymailing_get('type.delay');
			$this->campaignid = $campaignid;
		}else{
			$listmailClass = acymailing_get('class.listmail');
			$lists = $listmailClass->getLists($mailid);
		}

		if(acymailing_isAdmin()){


			$acyToolbar = acymailing_get('helper.toolbar');
			if(acymailing_isAllowed($config->get('acl_templates_view', 'all'))){
				$acyToolbar->popup('template', acymailing_translation('ACY_TEMPLATE'), acymailing_completeLink("template&task=theme", true));
			}

			if(acymailing_isAllowed($config->get('acl_tags_view', 'all'))) $acyToolbar->popup('tag', acymailing_translation('TAGS'), acymailing_completeLink("tag&task=tag&type=".$this->type, true));

			if(in_array($this->type, array('news', 'followup')) && acymailing_isAllowed($config->get('acl_tags_view', 'all'))){
				$acyToolbar->custom('replacetags', acymailing_translation('REPLACE_TAGS'), 'replacetag', false);
			}

			$buttonPreview = acymailing_translation('ACY_PREVIEW');
			if($this->type == 'news'){
				$buttonPreview .= ' / '.acymailing_translation('SEND');
			}
			$acyToolbar->custom('savepreview', $buttonPreview, 'search', false, '');
			$acyToolbar->divider();
			$acyToolbar->addButtonOption('apply', acymailing_translation('ACY_APPLY'), 'apply', false);
			if(acymailing_isAdmin() && acymailing_level(1)){
				$acyToolbar->addButtonOption('saveastmpl', acymailing_translation('ACY_SAVEASTMPL'), 'saveastmpl', false);
			}
			$acyToolbar->save();
			$acyToolbar->cancel();
			$acyToolbar->divider();
			$acyToolbar->help($this->doc, 'stepbystep');
			$acyToolbar->setTitle(acymailing_translation($this->nameForm), $this->ctrl.'&task=edit&mailid='.$mailid.$extraInfos);
			$acyToolbar->display();
		}

		$values->maxupload = (acymailing_bytes(ini_get('upload_max_filesize')) > acymailing_bytes(ini_get('post_max_size'))) ? ini_get('post_max_size') : ini_get('upload_max_filesize');


		$toggleClass = acymailing_get('helper.toggle');
		if(!acymailing_isAdmin()){
			$toggleClass->ctrl = 'frontnewsletter';
			$toggleClass->extra = '&listid='.acymailing_getVar('int', 'listid');

			$copyAllLists = $lists;
			$userid = acymailing_currentUserId();
			foreach($copyAllLists as $listid => $oneList){
				if(!$oneList->published || empty($userid)){
					unset($lists[$listid]);
					continue;
				}
				if($oneList->access_manage == 'all') continue;
				if($userid == (int)$oneList->userid) continue;
				if(!acymailing_isAllowed($oneList->access_manage)){
					unset($lists[$listid]);
					continue;
				}
			}

			if(empty($lists)){
				acymailing_enqueueMessage('You don\'t have the rights to add or edit an e-mail', 'error');
				acymailing_redirect(acymailing_completeLink('frontnewsletter', false, true));
			}
		}


		$editor = acymailing_get('helper.editor');
		$editor->setTemplate($mail->tempid);
		$editor->name = 'editor_body';
		$editor->content = $mail->body;
		$editor->prepareDisplay();

		$js = 'function updateAcyEditor(htmlvalue){
			if(htmlvalue == "0"){
				window.document.getElementById("htmlfieldset").style.display = "none";
			}else{
				window.document.getElementById("htmlfieldset").style.display = "block";
			}
		}';

		$script = '
		var attachmentNb = 1;
		function addFileLoader(){
			if(attachmentNb > 9) return;
			window.document.getElementById("attachmentsdiv"+attachmentNb).style.display = "";
			attachmentNb++;
		}';


		$script .= '
		document.addEventListener("DOMContentLoaded", function(){
			acymailing.submitbutton = function(pressbutton) {
				if (pressbutton == "cancel") {
					acymailing.submitform(pressbutton,document.adminForm);
					return;
				}
				';

		if(!acymailing_isAdmin()){
			$script .= '
				if(document.getElementsByClassName("acy_list_checked").length < 1){
					alert("'.acymailing_translation('SELECT_LISTS', true).'");
					return false;
				}
				';
		}

		$script .= '
			var subjectObj = window.document.getElementById("subject");
			if(subjectObj.tagName.toLowerCase() == "input"){
				subjectValue = subjectObj.value;
			}else{
				subjectValue = subjectObj.innerHTML;
			}
			
			if(subjectValue.length < 2){
				alert("'.acymailing_translation('ENTER_SUBJECT', true).'");
				return false;
			}
			
			subjectValue = subjectValue.replace(/<img[^>]+>/g,"");
			aliasValue = document.getElementById("alias").value;
			if(subjectValue.length < 2 && aliasValue < 2){
				alert("'.acymailing_translation('ACY_ENTER_SUBJECT_OR_ALIAS', true).'");
				return false;
			}
			'.$editor->jsCode().'
			
			if(pressbutton == "save" || pressbutton == "apply" || pressbutton == "savepreview" || pressbutton == "replacetags" || pressbutton == "saveastmpl"){
				var emailVars = ["fromemail", "replyemail"];
				var val = "";
				for(var key in emailVars){
					if(isNaN(key)) continue;
					val = document.getElementById(emailVars[key]).value;
					if(!validateEmail(val, emailVars[key])){
						return;
					}
				}
				';

		if(!empty($mail->mailid)){
			$urlCheckVersion = acymailing_prepareAjaxURL((acymailing_isAdmin() ? '' : 'front').'newsletter').'&task=checkifedited&mailId='.$mail->mailid;
			$script .= '
				var popup = false;
				var xhr = new XMLHttpRequest();
				xhr.open("GET", "'.$urlCheckVersion.'");
				xhr.onreadystatechange = function(){
					if (xhr.readyState === 4) {
						var response = xhr.responseText.toString();
						var responseSplit = response.split("|");
						
						if(xhr.status !== 200 || response.indexOf("|") == -1 || responseSplit[0] == '.acymailing_currentUserId().'){
							acymailing.submitform(pressbutton,document.adminForm);
							return false;
						}
						
						document.getElementById("confirmTxtMM").innerHTML = responseSplit[1] + " '.acymailing_translation('ACY_SAVE_ANYWAY_NAME', true).'";
						document.getElementById("confirmBoxMM").style.display="inline";
						document.getElementById("modal-background").style.display="inline";
					}
				}
				xhr.send();
				
				return false;
			}
		};
				';
		}else{
			$script .= '}
			acymailing.submitform(pressbutton,document.adminForm);
		};';
		}

		$script .= '});';


		$script .= $editor->jsMethods();

		$script .= "
		function changeTemplate(newhtml,newtext,newsubject,stylesheet,fromname,fromemail,replyname,replyemail,tempid){
			if(newhtml.length>2){".$editor->setContent('newhtml')."}
			var vartextarea = document.getElementById('altbody');
		    if(newtext.length>2) vartextarea.innerHTML = newtext;
			document.getElementById('tempid').value = tempid;
			if(fromname.length>1){
				fromname = fromname.replace('&amp;', '&');
				document.getElementById('fromname').value = fromname;
			}
			if(fromemail.length>1){document.getElementById('fromemail').value = fromemail;}
			if(replyname.length>1){
				replyname = replyname.replace('&amp;', '&');
				document.getElementById('replyname').value = replyname;
			}
			if(replyemail.length>1){document.getElementById('replyemail').value = replyemail;}
			if(newsubject.length>1){
				newsubject = newsubject.replace('&amp;', '&');
				var subjectObj = document.getElementById('subject');
				if(subjectObj.tagName.toLowerCase() == 'input'){
					subjectObj.value = newsubject;
				}else{
				    subjectObj.innerHTML = newsubject;
				}
			}
			".$editor->setEditorStylesheet('tempid')."
		}
		";

		if($mail->html == 1){
			$script .= "var zoneEditor = 'editor_body';";
		}else{
			$script .= "var zoneEditor = 'altbody';";
		}
		$script .= "
			document.addEventListener('DOMContentLoaded', function(){
				setTimeout(function() {
					document.getElementById('htmlfieldset').addEventListener('click', function(){
						zoneToTag = 'editor';
					});	
					
					var ediframe = document.getElementById('htmlfieldset').getElementsByTagName('iframe');
					if(ediframe && ediframe[0]){
						var children = ediframe[0].contentDocument.getElementsByTagName('*');
						for (var i = 0; i < children.length; i++) {
							children[i].addEventListener('click', function(){
								zoneToTag = 'editor';
							});			
						}
					}		
				}, 1000);
			});
		
			var zoneToTag = 'editor';
			function initTagZone(html){ if(html == 0){ zoneEditor = 'altbody'; }else{ zoneEditor = 'editor_body'; }}
		";

		$script .= "var previousSelection = false;
			function insertTag(tag){
				if(zoneEditor == 'editor_body' && zoneToTag == 'editor'){
					try{
						jInsertEditorText(tag,'editor_body',previousSelection);
						return true;
					} catch(err){
						alert('Your editor does not enable AcyMailing to automatically insert the tag, please copy/paste it manually in your Newsletter');
						return false;
					}
				} else{
					try{
						simpleInsert(zoneToTag, tag);
						return true;
					} catch(err){
						alert('Error inserting the tag in the '+ zoneToTag + 'zone. Please copy/paste it manually in your Newsletter.');
						return false;
					}
				}
			}
				
			function simpleInsert(myField, myValue) {
				myField = document.getElementById(myField);

				if (document.selection) {
					myField.focus();
					sel = document.selection.createRange();
					sel.text = myValue;
				} else if (myField.selectionStart || myField.selectionStart == '0') {
					var startPos = myField.selectionStart;
					var endPos = myField.selectionEnd;
					myField.value = myField.value.substring(0, startPos)
						+ myValue
						+ myField.value.substring(endPos, myField.value.length);
				} else if (myField.tagName == 'DIV') {
					myField.innerHTML += myValue;
					document.getElementById('subject').value += myValue;
				} else {
					myField.value += myValue;
				}
			}";

		$script .= "function deleteAttachment(i){
			document.getElementById('attachments'+i+'selection').innerHTML = '';
			document.getElementById('attachments'+i+'suppr').style.display = 'none';
			document.getElementById('attachments'+i).value = '';
			return;
		}";

		acymailing_addScript(true, $js.$script);

		$css = '#confirmBoxMM {
			width: 370px;
			background: rgba(255, 255, 255, 0.8);
			border: 1px solid #d6d6d6;
			padding: 5px;
			border-radius: 5px;
			box-shadow: 1px 1px 5px #dddddd;
			-moz-box-shadow: 1px 1px 5px #dddddd;
			-webkit-box-shadow: 1px 1px 5px #dddddd;
			position: fixed;
			left: 43%;
			top: 40%;
			z-index: 999;
		}
		
		#modal-background{
			position: fixed;
			top: 0px;
			right: 0px;
			left: 0px;
			bottom: 0px;
			z-index: 998;
			background-color: #000;
			opacity: 0.8;
		}
		
		#confirmOkMM:hover{
			-moz-transition: 0.3s;
		  	-o-transition: 0.3s;
		  	-webkit-transition: 0.3S
			transition: 0.3s;
			opacity: 0.7;
		}';

		if(!empty($mail->mailid)) acymailing_addStyle(true, $css);
		$installedPlugin = acymailing_getPlugin('acymailing', 'emojis');
		if(!empty($installedPlugin)){
			$params = new acyParameter($installedPlugin->params);
			if(acymailing_isPluginEnabled('acymailing', 'emojis') && $params->get('subject', 1) == 1){
				if(!ACYMAILING_J30){
					acymailing_addScript(false, ACYMAILING_JS.'jquery/jquery-1.9.1.min.js?v='.filemtime(ACYMAILING_ROOT.'media'.DS.'com_acymailing'.DS.'js'.DS.'jquery'.DS.'jquery-1.9.1.min.js'));
					acymailing_addScript(false, ACYMAILING_JS.'jquery/jquery-ui.min.js?v='.filemtime(ACYMAILING_ROOT.'media'.DS.'com_acymailing'.DS.'js'.DS.'jquery'.DS.'jquery-ui.min.js'));
				}

				acymailing_addScript(false, acymailing_rootURI().'plugins/editors/acyeditor/acyeditor/ckeditor/plugins/smiley/emojionearea.js?v='.filemtime(ACYMAILING_ROOT.'plugins'.DS.'editors'.DS.'acyeditor'.DS.'acyeditor'.DS.'ckeditor'.DS.'plugins'.DS.'smiley'.DS.'emojionearea.js'));
				acymailing_addScript(false, acymailing_rootURI().'plugins/editors/acyeditor/acyeditor/ckeditor/plugins/smiley/dialogs/emojimap.js?v='.filemtime(ACYMAILING_ROOT.'plugins'.DS.'editors'.DS.'acyeditor'.DS.'acyeditor'.DS.'ckeditor'.DS.'plugins'.DS.'smiley'.DS.'dialogs'.DS.'emojimap.js'));
				acymailing_addStyle(false, acymailing_rootURI().'plugins/editors/acyeditor/acyeditor/ckeditor/plugins/smiley/emojionearea.css?v='.filemtime(ACYMAILING_ROOT.'plugins'.DS.'editors'.DS.'acyeditor'.DS.'acyeditor'.DS.'ckeditor'.DS.'plugins'.DS.'smiley'.DS.'emojionearea.css'));
				acymailing_addScript(true, '
					document.addEventListener("DOMContentLoaded", function(){
						jQuery("#subject").emojioneArea({
							pickerPosition: "bottom",
							shortnames: true
						});
					});
				');
			}
		}

		if($this->type == 'autonews'){
			$this->frequencyType = acymailing_get('type.frequency');
			$this->generatingMode = acymailing_get('type.generatemode');
		}

		$this->toggleClass = $toggleClass;
		$this->lists = $lists;
		$this->editor = $editor;
		$this->mail = $mail;
		$tabs = acymailing_get('helper.acytabs');

		$this->tabs = $tabs;
		$this->values = $values;
		$this->config = $config;
	}

	function preview(){
		$mailid = acymailing_getCID('mailid');
		$config = acymailing_config();

		$mailerHelper = acymailing_get('helper.mailer');
		$mailerHelper->loadedToSend = false;
		$mail = $mailerHelper->load($mailid);

		$userClass = acymailing_get('class.subscriber');
		$receiver = $userClass->get(acymailing_currentUserEmail());
		$mail->sendHTML = true;
		acymailing_trigger('acymailing_replaceusertags', array(&$mail, &$receiver, false));
		if(!empty($mail->altbody)) $mail->altbody = $mailerHelper->textVersion($mail->altbody, false);

		$listmailClass = acymailing_get('class.listmail');
		$lists = $listmailClass->getReceivers($mail->mailid, true, false);

		$testreceiverType = acymailing_get('type.testreceiver');

		$paramBase = ACYMAILING_COMPONENT.'.'.$this->getName();
		$infos = new stdClass();
		$infos->test_selection = acymailing_getUserVar($paramBase.".test_selection", 'test_selection', '', 'string');
		$infos->test_group = acymailing_getUserVar($paramBase.".test_group", 'test_group', '', 'string');
		$infos->test_emails = acymailing_getUserVar($paramBase.".test_emails", 'test_emails', '', 'string');
		$infos->test_html = acymailing_getUserVar($paramBase.".test_html", 'test_html', 1, 'int');

		if(acymailing_isAdmin()){


			$acyToolbar = acymailing_get('helper.toolbar');
			if(acymailing_isAllowed($config->get('acl_'.$this->aclCat.'_spam_test', 'all'))){
				$acyToolbar->popup('spamtest', acymailing_translation('SPAM_TEST'), acymailing_completeLink("send&task=spamtest&mailid=".$mailid, true));
			}
			if($this->type == 'news'){
				if(acymailing_level(1) && acymailing_isAllowed($config->get('acl_newsletters_schedule', 'all'))){
					if($mail->published == 2){
						$acyToolbar->custom('unschedule', acymailing_translation('UNSCHEDULE'), 'schedule', false);
					}else{
						$acyToolbar->popup('schedule', acymailing_translation('SCHEDULE'), acymailing_completeLink("send&task=scheduleready&mailid=".$mailid, true));
					}
				}
				if(acymailing_isAllowed($config->get('acl_newsletters_send', 'all'))){
					$acyToolbar->popup('send', acymailing_translation('SEND'), acymailing_completeLink("send&task=sendready&mailid=".$mailid, true));
				}
			}


			$acyToolbar->divider();
			$acyToolbar->custom('edit', acymailing_translation('ACY_EDIT'), 'edit', false);
			$acyToolbar->cancel();
			$acyToolbar->divider();
			$acyToolbar->help($this->doc);
			$acyToolbar->setTitle(acymailing_translation('ACY_PREVIEW').' : '.$mail->subject, $this->ctrl.'&task=preview&mailid='.$mailid);
			$acyToolbar->display();
		}

		preg_match('@href="{unsubscribe:(.*)}"@', $mail->body, $match);//we get the tag unsubscribe
		if(!empty($match)){
			$mail->body = str_replace($match[0], 'href="'.$match[1].'"', $mail->body);
		}

		$this->lists = $lists;
		$this->infos = $infos;
		$this->testreceiverType = $testreceiverType;
		$this->mail = $mail;

		if($mail->html){
			$templateClass = acymailing_get('class.template');
			if(!empty($mail->tempid)) $templateClass->createTemplateFile($mail->tempid);
			$templateClass->displayPreview('newsletter_preview_area', $mail->tempid, $mail->subject);
		}
	}

	function upload(){
		$acyToolbar = acymailing_get('helper.toolbar');
		$acyToolbar->custom('douploadnewsletter', acymailing_translation('IMPORT'), 'import', false);
		$acyToolbar->setTitle(acymailing_translation('IMPORT'));
		$acyToolbar->topfixed = false;
		$acyToolbar->display();
	}

	function abtesting(){
		$mailids = acymailing_getVar('string', 'mailid');
		$validationStatus = acymailing_getVar('string', 'validationStatus');
		$noMsg = false;
		$noBtn = false;
		if((!empty($mailids) && strpos($mailids, ',') !== false)){
			$warningMsg = array();

			$mailsArray = explode(',', $mailids);
			acymailing_arrayToInteger($mailsArray);

			$mailids = implode(',', $mailsArray);
			$this->mailid = $mailids;
			$query = 'SELECT abtesting FROM #__acymailing_mail WHERE mailid IN ('.implode(',', $mailsArray).') AND abtesting IS NOT NULL';
			$resDetail = acymailing_loadResultArray($query);
			if(!empty($resDetail) && count($resDetail) != count($mailsArray)){
				$titlePage = acymailing_translation('ABTESTING');
				acymailing_display(acymailing_translation('ABTESTING_MISSINGEMAIL'), 'warning');
				$this->missingMail = true;
			}else{
				$abTestDetail = array();
				if(empty($resDetail)){
					$abTestDetail['mailids'] = $mailids;
					$abTestDetail['prct'] = 10;
					$abTestDetail['delay'] = 2;
					$abTestDetail['action'] = 'manual';
				}else{
					$abTestDetail = unserialize($resDetail[0]);
					$savedIds = explode(',', $abTestDetail['mailids']);
					sort($savedIds);
					sort($mailsArray);
					if(!empty($abTestDetail['status']) && in_array($abTestDetail['status'], array('inProgress', 'testSendOver', 'abTestFinalSend')) && $savedIds != $mailsArray){
						$warningMsg[] = acymailing_translation('ABTESTING_TESTEXIST');
						$mailsArray = $savedIds;
						$mailids = implode(',', $mailsArray);
					}
					$this->savedValues = true;
					if($abTestDetail['status'] == 'inProgress') $warningMsg[] = acymailing_translation('ABTESTING_INPROGRESS');
				}

				if($validationStatus == 'abTestAdd') $noMsg = true;

				if(!empty($abTestDetail['status']) && $abTestDetail['status'] == 'abTestFinalSend' && !empty($abTestDetail['newMail'])){
					$mailInQueueErrorMsg = acymailing_translation('ABTESTING_FINALMAILINQUEUE');
					$mailTocheck = '='.$abTestDetail['newMail'];
				}else{
					$mailInQueueErrorMsg = acymailing_translation('ABTESTING_TESTMAILINQUEUE');
					$mailTocheck = ' IN ('.implode(',', $mailsArray).')';
				}
				$query = "SELECT COUNT(*) FROM #__acymailing_queue WHERE mailid".$mailTocheck;
				$queueCheck = acymailing_loadResult($query);
				if(!empty($queueCheck) && $validationStatus != 'abTestAdd'){
					acymailing_enqueueMessage($mailInQueueErrorMsg, 'error');
					$noMsg = true;
				}

				if(!empty($resDetail) && empty($queueCheck) && in_array($abTestDetail['status'], array('inProgress', 'abTestFinalSend'))){
					if($abTestDetail['status'] == 'inProgress'){
						$abTestDetail['status'] = 'testSendOver';
					}else $abTestDetail['status'] = 'completed';
					$query = "UPDATE #__acymailing_mail SET abtesting=".acymailing_escapeDB(serialize($abTestDetail))." WHERE mailid IN (".implode(',', $mailsArray).")";
					acymailing_query($query);
				}

				if(!empty($abTestDetail['status']) && $abTestDetail['status'] == 'testSendOver') acymailing_enqueueMessage(acymailing_translation('ABTESTING_READYTOSEND'), 'info');
				if(!empty($abTestDetail['status']) && $abTestDetail['status'] == 'completed') acymailing_enqueueMessage(acymailing_translation('ABTESTING_COMPLETE'), 'info');

				$this->abTestDetail = $abTestDetail;

				$nbMails = count($mailsArray);
				$titleStr = "A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z";
				$titlePage = acymailing_translation_sprintf('ABTESTING_TITLE', substr($titleStr, 0, min($nbMails, 26) * 2 - 1));
				$mailClass = acymailing_get('class.mail');
				$mailsDetails = array();
				foreach($mailsArray as $mailid){
					$mailsDetails[] = $mailClass->get($mailid);
				}
				$this->mailsdetails = $mailsDetails;

				$mailerHelper = acymailing_get('helper.mailer');
				$mailerHelper->loadedToSend = false;
				$mailReceiver = $mailerHelper->load($mailsArray[0]);
				$listmailClass = acymailing_get('class.listmail');
				$lists = $listmailClass->getReceivers($mailReceiver->mailid, true, false);
				$this->lists = $lists;
				$this->mailReceiver = $mailReceiver;
				$filterClass = acymailing_get('class.filter');
				$this->filterClass = $filterClass;
				$listids = array();
				foreach($lists as $oneList){
					$listids[] = $oneList->listid;
				}
				$nbTotalReceivers = $filterClass->countReceivers($listids, $this->mailReceiver->filter, $this->mailReceiver->mailid);
				if($nbTotalReceivers < 50){
					$warningMsg[] = acymailing_translation_sprintf('ABTESTING_NOTENOUGHUSER', $nbTotalReceivers);
					$noBtn = true;
				}
				$this->nbTotalReceivers = $nbTotalReceivers;
				$this->nbTestReceivers = floor($nbTotalReceivers * $abTestDetail['prct'] / 100);

				if($noMsg || $noBtn) $noButton = true;

				$queryStat = 'SELECT mailid, openunique, clickunique, senthtml, senttext, bounceunique FROM #__acymailing_stats WHERE mailid IN ('.$mailids.')';
				$resStat = acymailing_loadObjectList($queryStat, 'mailid');
				if(!empty($resStat)){
					$this->statMail = $resStat;
					$warningMsg[] = acymailing_translation('ABTESTING_STAT_WARNING');
				}
				if(!empty($warningMsg) && $noMsg == false) acymailing_enqueueMessage(implode('<br />', $warningMsg), 'warning');
			}
		}else{
			$titlePage = acymailing_translation('ABTESTING');
		}

		$this->validationStatus = $validationStatus;
		$this->titlePage = $titlePage;

		$acyToolbar = acymailing_get('helper.toolbar');
		if(empty($noButton) && (!empty($this->mailid) || !empty($this->validationStatus))){
			$acyToolbar->custom('test', acymailing_translation('ABTESTING_TEST'), 'test', false, "if(confirm('".acymailing_translation('PROCESS_CONFIRMATION', true)."')){acymailing.submitbutton('abtest');} return false;");
		}
		$acyToolbar->help('a-b-testing');
		$acyToolbar->setTitle(acymailing_translation('ABTESTING'));
		$acyToolbar->topfixed = false;
		$acyToolbar->display();
	}
}
components/com_acymailing/views/dashboard/view.html.php000060400000016327152453623450017434 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class dashboardViewDashboard extends acymailingView{

	function display($tpl = null){
		$config = acymailing_config();

		$acyToolbar = acymailing_get('helper.toolbar');
		$acyToolbar->help('dashboard');
		$acyToolbar->setTitle(acymailing_translation('ACY_CPANEL'), 'dashboard');
		$acyToolbar->display();

		$userQuery = 'SELECT (confirmed + enabled) AS addition, COUNT(subid) AS total FROM #__acymailing_subscriber GROUP BY addition';
		$userResult = acymailing_loadObjectList($userQuery, 'addition');

		$userStats = new stdClass();
		$userStats->nbUnconfirmedAndDisabled = (empty($userResult[0]->total) ? 0 : $userResult[0]->total);
		$userStats->nbConfirmed = (empty($userResult[1]->total) ? 0 : $userResult[1]->total);
		$userStats->nbConfirmed += (empty($userResult[2]->total) ? 0 : $userResult[2]->total);
		$userStats->total = $userStats->nbConfirmed + $userStats->nbUnconfirmedAndDisabled;

		$userStats->confirmedPercent = (empty($userStats->total) ? 0 : round((($userStats->nbConfirmed * 100) / $userStats->total), 0));

		$listsQuery = "SELECT COUNT(DISTINCT(l.listid)) FROM #__acymailing_list as l LEFT JOIN #__acymailing_listsub as ls ON l.listid=ls.listid WHERE l.type='list' AND ls.status=1 AND ls.subid IS NOT NULL";
		$atLeastOneSub = acymailing_loadResult($listsQuery);

		$nbLists = acymailing_loadResult('SELECT COUNT(listid) FROM #__acymailing_list WHERE type = "list"');

		$listStats = new stdClass();
		$listStats->atLeastOneSub = $atLeastOneSub;
		$listStats->noSub = $nbLists - $atLeastOneSub;
		$listStats->total = $nbLists;

		$listStats->subscribedPercent = (empty($nbLists) ? 0 : round((($atLeastOneSub * 100) / $nbLists), 0));

		$nlQuery = 'SELECT count(mailid) AS total, published FROM #__acymailing_mail WHERE type = "news" GROUP BY published';
		$nlResult = acymailing_loadObjectList($nlQuery, 'published');

		$nlStats = new stdClass();
		$nlStats->nbUnpublished = (empty($nlResult[0]->total) ? 0 : $nlResult[0]->total);
		$nlStats->nbpublished = (empty($nlResult[1]->total) ? 0 : $nlResult[1]->total);
		$nlStats->total = $nlStats->nbpublished + $nlStats->nbUnpublished;

		$nlStats->publishedPercent = (empty($nlStats->total) ? 0 : round((($nlStats->nbpublished * 100) / $nlStats->total), 0));


		$this->nlStats = $nlStats;
		$this->userStats = $userStats;
		$this->listStats = $listStats;
		$this->config = $config;




		$geolocParam = $config->get('geolocation');
		if(!empty($geolocParam) && $geolocParam != 1){
			$condition = '';
			if(strpos($geolocParam, 'creation') !== false){
				$condition = " WHERE geolocation_type='creation'";
			}

			$nbUsersToGet = 100;
			$query = 'SELECT geolocation_type, geolocation_subid, geolocation_country_code, geolocation_city, geolocation_country, geolocation_state';
			$query .= ' FROM #__acymailing_geolocation'.$condition.' GROUP BY geolocation_subid ORDER BY geolocation_created DESC LIMIT '.$nbUsersToGet;
			$geoloc = acymailing_loadObjectList($query);

			if(!empty($geoloc)){
				$markCities = array();
				$diffCountries = false;
				$dataDetails = array();
				$addresses = array();
				foreach($geoloc as $mark){
					$indexCity = array_search($mark->geolocation_city, $markCities);
					if($indexCity === false){
						array_push($markCities, $mark->geolocation_city);
						array_push($dataDetails, 1);
						$addresses[] = $mark->geolocation_city.' '.$mark->geolocation_state.' '.$mark->geolocation_country;
					}else{
						$dataDetails[$indexCity] += 1;
					}

					if(!$diffCountries){
						if(!empty($region) && $region != $mark->geolocation_country_code){
							$region = 'world';
							$diffCountries = true;
						}else{
							$region = $mark->geolocation_country_code;
						}
					}
				}
				$this->geoloc_city = $markCities;
				$this->geoloc_details = $dataDetails;
				$this->geoloc_region = $region;
				$this->geoloc_addresses = $addresses;
				$this->nbUsersToGet = $nbUsersToGet;
			}
		}

		acymailing_addScript(false, "https://www.google.com/jsapi");
		$statsusers = acymailing_loadObjectList("SELECT count(`subid`) as total, DATE_FORMAT(FROM_UNIXTIME(`created`),'%Y-%m-%d') as subday FROM ".acymailing_table('subscriber')." WHERE `created` > 100000 GROUP BY subday ORDER BY subday DESC LIMIT 15");
		$this->statsusers = $statsusers;

		$users10 = acymailing_loadObjectList('SELECT name,email,html,confirmed,subid,created FROM '.acymailing_table('subscriber').' ORDER BY subid DESC LIMIT 10');
		$this->users = $users10;

		$toggleClass = acymailing_get('helper.toggle');
		$this->toggleClass = $toggleClass;


		$listStatusQuery = 'SELECT count(subid) AS total, list.name AS listname, list.listid, listsub.status FROM #__acymailing_list AS list JOIN #__acymailing_listsub AS listsub ON list.listid = listsub.listid GROUP BY listsub.listid, listsub.status';
		$listStatusResult = acymailing_loadObjectList($listStatusQuery);

		$listStatusData = array();
		foreach($listStatusResult as $oneResult){
			$listStatusData[$oneResult->listname][$oneResult->status] = $oneResult->total;
		}
		$this->listStatusData = $listStatusData;


		$newsletters = acymailing_loadObjectList("SELECT count(userstats.`mailid`) as total, DATE_FORMAT(FROM_UNIXTIME(`senddate`), '%Y-%m-%d') AS send_date,
						SUM(CASE WHEN fail>0 THEN 1 ELSE 0 END) AS nbFailed
						FROM ".acymailing_table('userstats')." AS userstats
						WHERE userstats.senddate > ".intval(time() - 2628000)."
						GROUP BY send_date
						ORDER BY send_date DESC");

		$this->newsletters = $newsletters;



		$progressBarSteps = new stdClass();
		$progressBarSteps->listCreated = (!empty($listStats->total) ? 1 : 0);
		$progressBarSteps->contactCreated = (!empty($userStats->total) ? 1 : 0);
		$progressBarSteps->newsletterCreated = (!empty($nlStats->total) ? 1 : 0);

		$result = acymailing_loadResult('SELECT subid FROM #__acymailing_userstats LIMIT 1');

		$progressBarSteps->newsletterSent = (!empty($result) ? 1 : 0);
		$this->progressBarSteps = $progressBarSteps;

		$news = @simplexml_load_file('https://www.acyba.com/acynews.xml');
		if(!empty($news->news)) {
			
			$currentLanguage = acymailing_getLanguageTag();

			$latestNews = null;
			foreach ($news->news as $oneNews) {
				if (!empty($latestNews) && strtotime($latestNews->date) > strtotime($oneNews->date)) break;

				if (empty($oneNews->published) || (strtolower($oneNews->language) != strtolower($currentLanguage) && (strtolower($oneNews->language) != 'default' || !empty($latestNews)))) continue;

				if (!empty($oneNews->extension) && strtolower($oneNews->extension) != 'acymailing') continue;

				if (!empty($oneNews->cms) && strtolower($oneNews->cms) != 'joomla') continue;

				if (!empty($oneNews->level) && strtolower($oneNews->level) != strtolower($config->get('level'))) continue;

				if (!empty($oneNews->version)) {
					list($version, $operator) = explode('_', $oneNews->version);
					if(!version_compare($config->get('version'), $version, $operator)) continue;
				}

				$latestNews = $oneNews;
			}

			if (!empty($latestNews)) {
				$this->contentToDisplay = $latestNews;
				$this->config = $config;
			}
		}

		parent::display($tpl);
	}
}
components/com_acymailing/views/dashboard/index.html000060400000000054152453623450016771 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/dashboard/tmpl/users.php000060400000004175152453623450017632 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><br style="font-size:1px;"/>
<div id="dash_users">

	<h1 class="acy_graphtitle"> <?php echo acymailing_translation('ACY_LAST_TEN_SUBSCRIBERS') ?> </h1>
	<table class="acymailing_table" cellpadding="1">
		<thead>
		<tr>
			<th class="title">
				<?php echo acymailing_translation('JOOMEXT_NAME'); ?>
			</th>
			<th class="title">
				<?php echo acymailing_translation('JOOMEXT_EMAIL'); ?>
			</th>
			<th class="title titledate">
				<?php echo acymailing_translation('CREATED_DATE'); ?>
			</th>
			<th class="title titletoggle">
				<?php echo acymailing_translation('RECEIVE_HTML'); ?>
			</th>
			<?php if($this->config->get('require_confirmation', 1)){ ?>
				<th class="title titletoggle">
					<?php echo acymailing_translation('CONFIRMED'); ?>
				</th>
			<?php } ?>
		</tr>
		</thead>
		<tbody>
		<?php
		$k = 0;
		foreach($this->users as $oneUser){
			$row =& $oneUser;

			$confirmedid = 'confirmed_'.$row->subid;
			$htmlid = 'html_'.$row->subid;

			?>
			<tr class="<?php echo "row$k"; ?>">
				<td>
					<?php echo $this->escape($row->name); ?>
				</td>
				<td>
					<a href="<?php echo acymailing_completeLink('subscriber&task=edit&subid='.$row->subid) ?>"><?php echo $this->escape($row->email); ?></a>
				</td>
				<td align="center" style="text-align:center">
					<?php echo acymailing_getDate($row->created); ?>
				</td>
				<td align="center" style="text-align:center">
					<span id="<?php echo $htmlid ?>" class="loading"><?php echo $this->toggleClass->toggle($htmlid, $row->html, 'subscriber') ?></span>
				</td>
				<?php if($this->config->get('require_confirmation', 1)){ ?>
					<td align="center" style="text-align:center">
						<span id="<?php echo $confirmedid ?>" class="loading"><?php echo $this->toggleClass->toggle($confirmedid, $row->confirmed, 'subscriber') ?></span>
					</td>
				<?php } ?>
			</tr>
			<?php
			$k = 1 - $k;
		}
		?>
		</tbody>
	</table>
</div>
components/com_acymailing/views/dashboard/tmpl/stats.php000060400000012232152453623450017620 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="dashboard_mainstat">
	<div class="acydashboard_content">
		<div class="acycircles">
			<div class="circle stat_subscribers" onclick="displayDetails('userStatisticDetails');">

				<!-- circle animation 1 -->
				<div class="progressdiv" data-percent="<?php echo $this->userStats->confirmedPercent; ?>" data-title="<?php echo $this->userStats->total; ?>">
					<svg class="acyprogress" width="178" height="178" viewport="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg">
						<circle r="80" cx="89" cy="89" fill="#fff" stroke-dasharray="502.4" stroke-dashoffset="0" stroke="#93bfeb"></circle>
						<circle class="bar" r="80" cx="89" cy="89" fill="transparent" stroke-dasharray="502.4" stroke-dashoffset="0"></circle>
					</svg>
				</div>
				<span class="circle_title"><?php echo acymailing_translation('ACY_DASHBOARD_USERS'); ?></span>
				<span class="circle_informations">
					<span class="stats_blue_point"></span> <?php echo acymailing_translation('ENABLED'); ?>
					<span class="stats_grey_point"></span> <?php echo acymailing_translation('DISABLED'); ?>
				</span>
				<br/>
				<button class="acymailing_button"><?php echo acymailing_translation_sprintf("ACY_MORE_USER_STATISTICS", acymailing_translation('USERS')) ?></button>
			</div>

			<div class="circle stat_lists" onclick="displayDetails('listStatisticDetails');">

				<!-- circle animation 2 -->
				<div class="progressdiv" data-percent="<?php echo $this->listStats->subscribedPercent; ?>" data-title="<?php echo $this->listStats->total; ?>">
					<svg class="acyprogress" width="178" height="178" viewport="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg">
						<circle r="80" cx="89" cy="89" fill="#fff" stroke-dasharray="502.4" stroke-dashoffset="0" stroke="#c9c472"></circle>
						<circle class="bar" r="80" cx="89" cy="89" fill="transparent" stroke-dasharray="502.4" stroke-dashoffset="0"></circle>
					</svg>
				</div>
				<span class="circle_title"><?php echo acymailing_translation('ACY_DASHBOARD_LISTS'); ?></span>
				<span class="circle_informations">
					<span class="stats_green_point"></span> <?php echo acymailing_translation('ACY_ATLEASTONE'); ?>
					<span class="stats_grey_point"></span> <?php echo acymailing_translation('ACY_NOSUB'); ?>
				</span>
				<br/>
				<button class="acymailing_button"><?php echo acymailing_translation_sprintf("ACY_MORE_LIST_STATISTICS", acymailing_translation('LISTS')) ?></button>

			</div>
			<div class="circle stat_newsletters" onclick="displayDetails('newsletterStatisticDetails');">
				<!-- circle animation 3 -->
				<div class="progressdiv" data-percent="<?php echo $this->nlStats->publishedPercent; ?>" data-title="<?php echo $this->nlStats->total; ?>">
					<svg class="acyprogress" width="178" height="178" viewport="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg">
						<circle r="80" cx="89" cy="89" fill="#fff" stroke-dasharray="502.4" stroke-dashoffset="0" stroke="#7c95ad"></circle>
						<circle class="bar" r="80" cx="89" cy="89" fill="transparent" stroke-dasharray="502.4" stroke-dashoffset="0"></circle>
					</svg>
				</div>
				<span class="circle_title"><?php echo acymailing_translation('ACY_DASHBOARD_NEWSLETTERS'); ?></span>
				<span class="circle_informations">
					<span class="stats_darkblue_point"></span> <?php echo acymailing_translation('ACY_PUBLISHED'); ?>
					<span class="stats_grey_point"></span> <?php echo acymailing_translation('ACY_UNPUBLISHED'); ?>
				</span>
				<br/>
				<button class="acymailing_button"><?php echo acymailing_translation_sprintf("ACY_MORE_NEWSLETTER_STATISTICS", acymailing_translation('NEWSLETTER')) ?></button>
			</div>
		</div>
		<div class="acygraph">
			<div id="userStatisticDetails" style="display: none;">
				<?php
				if(acymailing_isAllowed($this->config->get('acl_subscriber_manage', 'all'))){
					echo '<div id="userLocations">';
					include(dirname(__FILE__).DS.'userlocations.php');
					echo '</div>';
				}
				?>
				<?php
				if(acymailing_isAllowed($this->config->get('acl_subscriber_manage', 'all'))){
					echo '<div id="userStatsDiagram">';
					include(dirname(__FILE__).DS.'userstats.php');
					echo '</div>';
				}

				if(acymailing_isAllowed($this->config->get('acl_subscriber_manage', 'all'))){
					echo '<div id="recentUserListing">';
					include(dirname(__FILE__).DS.'users.php');
					echo '</div>';
				}
				?>
			</div>
			<div id="listStatisticDetails" style="display: none;">
				<?php
				if(acymailing_isAllowed($this->config->get('acl_lists_manage', 'all'))){
					echo '<div id="listStatsDiagram">';
					include(dirname(__FILE__).DS.'liststats.php');
					echo '</div>';
				}
				?>

			</div>
			<div id="newsletterStatisticDetails" style="display: none;">
				<?php
				if(acymailing_isAllowed($this->config->get('acl_queue_manage', 'all'))){
					echo '<div id="queueStatsDiagram">';
					include(dirname(__FILE__).DS.'queuestats.php');
					echo '</div>';
				}
				?>
			</div>
		</div>
	</div>
</div>


components/com_acymailing/views/dashboard/tmpl/index.html000060400000000054152453623450017745 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/dashboard/tmpl/userstats.php000060400000003434152453623450020523 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
if(empty($this->statsusers)) echo acymailing_translation("ACY_NO_STATISTICS");
else{ ?>

	<script language="JavaScript" type="text/javascript">
		function statsusers() {
			var dataTable = new google.visualization.DataTable();
			dataTable.addRows(<?php echo count($this->statsusers); ?>);

			dataTable.addColumn('date');
			dataTable.addColumn('number', '<?php echo acymailing_translation('USERS',true); ?>');

			<?php
			$i = count($this->statsusers)-1;
			foreach($this->statsusers as $oneResult){
				echo "dataTable.setValue($i, 0, new Date('".substr($oneResult->subday,0,4)."','".intval(substr($oneResult->subday,5,2) - 1)."','".substr($oneResult->subday,8,2)."')); ";
				echo "dataTable.setValue($i, 1, ".intval(@$oneResult->total)."); ";
				if($i-- == 0) break;
			}
			?>
			var container = document.getElementsByClassName('acygraph')[0];
			var width = container.getBoundingClientRect().width;

			var vis = new google.visualization.ColumnChart(document.getElementById('statsusers'));
			var options = {
				height: 300,
				legend: 'none',
				vAxis: {minValue: 0},
				hAxis: {format: 'dd MMM'},
				backgroundColor: 'transparent',
				colors: ['#adccea'],
				width: width
			};

			vis.draw(dataTable, options);
		}
		google.load("visualization", "1", {packages: ["corechart"]});
		google.setOnLoadCallback(statsusers);

	</script>
	<h1 class="acy_graphtitle"> <?php echo acymailing_translation('ACY_SUBSCRIPTION_CHRONOLOGY') ?> </h1>
	<div id="statsusers" style="width:100%;text-align:center;margin-bottom:20px"></div>
<?php } ?>
components/com_acymailing/views/dashboard/tmpl/default.php000060400000015517152453623450020117 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<div id="iframedoc"></div>

	<script type="text/javascript">
		function displayDetails(detailsDivID){

			var oldDisplay = document.getElementById(detailsDivID).style.display;

			document.getElementById('userStatisticDetails').style.display = "none";
			document.getElementById('newsletterStatisticDetails').style.display = "none";
			document.getElementById('listStatisticDetails').style.display = "none";

			if(oldDisplay == 'block'){
				document.getElementById(detailsDivID).style.display = 'none';
			}else{
				document.getElementById(detailsDivID).style.display = 'block';
			}
		}

		(function(){
			window.onload = function(){
				var circles = document.querySelectorAll('.acyprogress');
				for(var i = 0; i < 3; i++){
					var totalProgress = circles[i].querySelector('circle').getAttribute('stroke-dasharray');
					var progress = circles[i].parentNode.getAttribute('data-percent');
					circles[i].querySelector('.bar').style['stroke-dashoffset'] = totalProgress * progress / 100;
				}
			}
		})();
	</script>

	<div id="dashboard_mainview">

		<?php
		if(!empty($this->contentToDisplay) && $this->config->get('dashboardnews', 0) < strtotime($this->contentToDisplay->date)){
			$toggleHelper = acymailing_get('helper.toggle');
			$notremind = '<small style="float:right;margin-right:30px;position:relative;">' . $toggleHelper->delete('acydashboard_specialcontent', 'dashboardnews_'.strtotime($this->contentToDisplay->date), 'config', false, acymailing_translation('DONT_REMIND')) . '</small>';

			echo '<div class="acydashboard_specialcontent onelineblockoptions" id="acydashboard_specialcontent">'.$notremind;
			if(!empty($this->contentToDisplay->title)) echo '<span class="acyblocktitle">'.$this->contentToDisplay->title.'</span>';
			if (strtoupper($this->contentToDisplay->type) == 'URL') {
				$height = !empty($this->contentToDisplay->height) ? $this->contentToDisplay->height : 'auto';
				echo '<iframe frameborder="0" src="' . $this->contentToDisplay->content . '" width="100%" height="' . $height . '" scrolling="auto"></iframe>';
			} else {
				echo $this->contentToDisplay->content;
			}
			echo '</div>';
		}
		include(dirname(__FILE__).DS.'stats.php');
		?>

		<!-- dashboard progress bar -->
		<div id="dashboard_progress">
			<!-- progress bar -->
			<div class="acydashboard_progressbar">
				<table width="100%">

					<tr>
						<td width="25%" class="acydashboard_plane1 <?php echo(!empty($this->progressBarSteps->listCreated) ? 'acystepdone' : ''); ?>" height="36"></td>
						<td width="25%" class="acydashboard_plane2 <?php echo(!empty($this->progressBarSteps->contactCreated) ? 'acystepdone' : ''); ?>" height="36"></td>
						<td width="25%" class="acydashboard_plane3 <?php echo(!empty($this->progressBarSteps->newsletterCreated) ? 'acystepdone' : ''); ?>" height="36"></td>
						<td width="25%" class="acydashboard_plane4 <?php echo(!empty($this->progressBarSteps->newsletterSent) ? 'acystepdone' : ''); ?>" height="36"></td>

					</tr>
					<tr class="acydashboard_progressbar_colors">
						<td width="25%" height="3" class="acydashboard_progress1"><span class="<?php echo(!empty($this->progressBarSteps->listCreated) ? 'acystepdone' : ''); ?>"></span></td>
						<td width="25%" height="3" class="acydashboard_progress2"><span class="<?php echo(!empty($this->progressBarSteps->contactCreated) ? 'acystepdone' : ''); ?>"></span></td>
						<td width="25%" height="3" class="acydashboard_progress3"><span class="<?php echo(!empty($this->progressBarSteps->newsletterCreated) ? 'acystepdone' : ''); ?>"></span></td>
						<td width="25%" height="3" class="acydashboard_progress4"><span class="<?php echo(!empty($this->progressBarSteps->newsletterSent) ? 'acystepdone' : ''); ?>"></span></td>
					</tr>
				</table>
			</div>

			<!-- progress steps -->
			<div class="acydashboard_progress_steps">
				<a href="<?php echo acymailing_completeLink('list'); ?>">
					<div class="acydashboard_progress_block acydashboard_step1">
						<div class="step_image"></div>
						<div class="step_info"><span class="step_title"><?php echo acymailing_translation('MAILING_LISTS'); ?></span><?php echo acymailing_translation('ACY_MAILING_LIST_STEP_DESC'); ?></div>
					</div>
				</a>

				<a href="<?php echo acymailing_completeLink('subscriber'); ?>">
					<div class="acydashboard_progress_block acydashboard_step2">
						<div class="step_image"></div>
						<div class="step_info"><span class="step_title"><?php echo acymailing_translation('ACY_CONTACTS'); ?></span><?php echo acymailing_translation('ACY_MAILING_CONTACT_STEP_DESC'); ?>                        </div>
					</div>
				</a>

				<a href="<?php echo acymailing_completeLink('newsletter'); ?>">
					<div class="acydashboard_progress_block acydashboard_step3">
						<div class="step_image"></div>
						<div class="step_info"><span class="step_title"><?php echo acymailing_translation('NEWSLETTERS'); ?></span><?php echo acymailing_translation('ACY_MAILING_NEWSLETTER_STEP_DESC'); ?>                        </div>
					</div>
				</a>

				<a href="<?php echo acymailing_completeLink('queue'); ?>">
					<div class="acydashboard_progress_block acydashboard_step4">
						<div class="step_image"></div>
						<div class="step_info"><span class="step_title"><?php echo acymailing_translation('SEND_PROCESS'); ?></span><?php echo acymailing_translation('ACY_MAILING_SEND_PROCESS_STEP_DESC'); ?></div>
					</div>
				</a>
			</div>

			<div id="acy_stepbystep"><?php echo acymailing_translation('ACY_STEP_BY_STEP_DESC1').'<br />'.acymailing_translation('ACY_STEP_BY_STEP_DESC2').' '.acymailing_translation('ACY_STEP_BY_STEP_DESC3').'<br />'.acymailing_translation('ACY_STEP_BY_STEP_DESC4'); ?><br/>

				<form target="_blank" action="https://www.acyba.com/index.php?option=com_acymailing&ctrl=sub" method="post">
					<input id="user_name" type="text" name="user[name]" value="" placeholder="<?php echo acymailing_translation('NAMECAPTION'); ?>"/>
					<input id="user_email" type="text" name="user[email]" value="" placeholder="<?php echo acymailing_translation('EMAILCAPTION'); ?>"/>
					<br/>
					<input class="acymailing_button" type="submit" value="<?php echo acymailing_translation('SUBSCRIBE'); ?>" name="Submit"/>
					<input type="hidden" name="acyformname" value="formAcymailing1"/>
					<input type="hidden" name="ctrl" value="sub"/>
					<input type="hidden" name="task" value="optin"/>
					<input type="hidden" name="option" value="com_acymailing"/>
					<input type="hidden" name="visiblelists" value=""/>
					<input type="hidden" name="hiddenlists" value="23"/>
					<input type="hidden" name="redirect" value="https://www.acyba.com"/>
				</form>
			</div>
		</div>
	</div>
</div>
components/com_acymailing/views/dashboard/tmpl/liststats.php000060400000003415152453623450020517 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
if(empty($this->listStatusData)) echo acymailing_translation("ACY_NO_STATISTICS");
else{

	$data = "['List Name', '".acymailing_translation('UNSUBSCRIBED')."', '".acymailing_translation('PENDING_SUBSCRIPTION')."', '".acymailing_translation('SUBSCRIBED')."',],";
	foreach($this->listStatusData as $listName => $oneStat){
		$data .= "['".addslashes($listName)."', ".(empty($oneStat[-1]) ? 0 : $oneStat[-1]).", ".(empty($oneStat[2]) ? 0 : $oneStat[2]).", ".(empty($oneStat[1]) ? 0 : $oneStat[1]).",],";
	}
	?>

	<script language="JavaScript" type="text/javascript">
		google.load("visualization", "1", {packages: ["corechart"]});
		google.setOnLoadCallback(drawChart);

		function drawChart() {
			var data = google.visualization.arrayToDataTable([

				<?php echo rtrim($data, ','); ?>
			]);

			var container = document.getElementsByClassName('acygraph')[0];
			var width = container.getBoundingClientRect().width;

			var view = new google.visualization.DataView(data);
			var options = {
				height: 450,
				width: width,
				isStacked: true,
				backgroundColor: 'transparent',
				colors: ['#ed8585', '#adccea', '#dde281'],
				hAxis: {slantedText: true, slantedTextAngle: 40, textStyle: {fontSize: 13}}
			};
			var chart = new google.visualization.ColumnChart(document.getElementById("liststats"));
			chart.draw(view, options);
		}
	</script>
	<h1 class="acy_graphtitle"> <?php echo acymailing_translation('ACY_SUB_STATUS_PER_LIST') ?> </h1>
	<div id="liststats" style="text-align:center;margin-bottom:20px"></div>
<?php } ?>
components/com_acymailing/views/dashboard/tmpl/queuestats.php000060400000004467152453623450020700 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
if(empty($this->newsletters)) echo acymailing_translation("ACY_NO_STATISTICS");
else{ ?>

	<script language="JavaScript" type="text/javascript">
		function statsqueue() {
			var dataTable = new google.visualization.DataTable();

			dataTable.addColumn('date');
			dataTable.addColumn('number', '<?php echo acymailing_translation('ACY_SENT_EMAILS'); ?>');
			dataTable.addColumn('number', '<?php echo acymailing_translation('FAILED'); ?>');

			<?php
			$i = -1;
			$statsdetailsSentDate = '';
			$mindate = 0;
			$maxdate = 0;

			foreach($this->newsletters as $oneResult){
				$date = strtotime(substr($oneResult->send_date,0,4)."-".intval(substr($oneResult->send_date,5,2))."-".substr($oneResult->send_date,8,2));
				if(empty($mindate) || $date < $mindate) $mindate = $date;
				if(empty($maxdate) || $date > $maxdate) $maxdate = $date;



				if($statsdetailsSentDate != $oneResult->send_date){
					$i++;
					echo 'dataTable.addRow();';
					echo "dataTable.setValue($i, 0, new Date(".$date."*1000));";
					$statsdetailsSentDate = $oneResult->send_date;
				}
				echo "dataTable.setValue($i, 1, ".intval(@$oneResult->total)."); ";
				echo "dataTable.setValue($i, 2, ".intval(@$oneResult->nbFailed)."); ";
			}
			?>

			var container = document.getElementsByClassName('acygraph')[0];
			var width = container.getBoundingClientRect().width;

			var vis = new google.visualization.ColumnChart(document.getElementById('statsqueue'));
			var options = {
				height: 400,
				width: width,
				backgroundColor: 'transparent',
				hAxis: {
					format: ' MMM d, y',
					maxValue: new Date(<?php echo $maxdate+86400; ?> * 1000),
					minValue: new Date(<?php echo $mindate-86400; ?> * 1000)
				},
				colors: ['#adccea', '#ed8585']
			};

		vis.draw(dataTable, options);
		}
		google.load("visualization", "1", {packages: ["corechart"]});
		google.setOnLoadCallback(statsqueue);

	</script>
	<h1 class="acy_graphtitle"> <?php echo acymailing_translation('ACY_NEWSLETTER_STATUS') ?> </h1>
	<div id="statsqueue" style="text-align:center;width:100%,margin-bottom:20px"></div>
<?php } ?>
components/com_acymailing/views/dashboard/tmpl/userlocations.php000060400000004377152453623450021367 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php if(!empty($this->geoloc_details)){
	$config = acymailing_config();
	$google_map_api_key = $config->get('google_map_api_key');
	if(empty($google_map_api_key)){
		acymailing_display('<a href="'.acymailing_completeLink('cpanel').'" onclick="localStorage.setItem(\'acyconfig_tab\', \'config_subscription\');">'.acymailing_translation('ACY_NEED_GOOGLE_MAP_API_KEY').'</a>', 'info');
	}else{ ?>
		<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
		<script language="javascript" type="text/javascript">
			google.charts.load('current', {
				packages: ['geochart', 'corechart'],
				mapsApiKey: '<?php echo $google_map_api_key; ?>'
			});
			google.charts.setOnLoadCallback(drawMarkersMap);

			var chart;
			var data;

			var mapOptions = {
				legend: 'none', height: 400, displayMode: 'markers', colorAxis: {colors: ['', '#a8a12c']}, sizeAxis: {minSize: 2, maxSize: 10, minValue: 1, maxValue: 15}, enableRegionInteractivity: 'true', backgroundColor: 'transparent', region: '<?php echo $this->geoloc_region; ?>'
			};
			function drawMarkersMap(){
				data = new google.visualization.DataTable();
				data.addColumn('string', 'Address');
				data.addColumn('number', 'Color');
				data.addColumn('number', 'Size');
				data.addColumn({type: 'string', role: 'tooltip'});
				<?php
				$myData = array();
				foreach($this->geoloc_city as $key => $city){
					$toolTipTxt = str_replace("'", "\'", acymailing_translation('GEOLOC_NB_USERS')).': '.$this->geoloc_details[$key];
					$myData[] = "['".str_replace("'", "\'", $this->geoloc_addresses[$key])."', 1, ".$this->geoloc_details[$key].", '".$toolTipTxt."']";
				}
				echo "data.addRows([".implode(", ", $myData)."]);";
				?>

				chart = new google.visualization.GeoChart(document.getElementById('mapGeoloc_div'));
				chart.draw(data, mapOptions);
			}

		</script>
		<h1 class="acy_graphtitle"><?php echo acymailing_translation_sprintf('ACY_SUBSCRIBERS_LOCATIONS', $this->nbUsersToGet) ?></h1>
		<div id="mapGeoloc_div"></div>
		<?php
	}
} ?>
components/com_acymailing/views/notification/view.html.php000060400000010673152453623450020171 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
include(ACYMAILING_BACK.'views'.DS.'newsletter'.DS.'view.html.php');

class NotificationViewNotification extends NewsletterViewNewsletter{
	var $type = 'joomlanotification';
	var $ctrl = 'notification';
	var $nameListing = 'JOOMLA_NOTIFICATIONS';
	var $nameForm = 'JOOMLA_NOTIFICATIONS';
	var $doc = 'joomlanotification';
	var $icon = 'joomlanotification';
	var $filters = array();


	function listing(){
		$config = acymailing_config();

		if(!class_exists('plgSystemAcymailingClassMail')){
			$warning_msg = acymailing_translation('ACY_WARNINGOVERRIDE_DISABLED_1').' <a href="'.acymailing_completeLink('cpanel').'">'.acymailing_translation_sprintf('ACY_WARNINGOVERRIDE_DISABLED_2', ' acymailingclassmail (Override Joomla mailing system plugin)').'</a>';
			acymailing_enqueueMessage($warning_msg, 'notice');
		}

		$pageInfo = new stdClass();
		$pageInfo->filter = new stdClass();
		$pageInfo->filter->order = new stdClass();
		$pageInfo->elements = new stdClass();
		$pageInfo->limit = new stdClass();
		$this->filters[] = '`type` = '.acymailing_escapeDB($this->type);

		$paramBase = ACYMAILING_COMPONENT.'.'.$this->getName();
		$pageInfo->filter->order->value = acymailing_getUserVar($paramBase.".filter_order", 'filter_order', 'mailid', 'cmd');
		$pageInfo->filter->order->dir = acymailing_getUserVar($paramBase.".filter_order_Dir", 'filter_order_Dir', 'asc', 'word');
		if(strtolower($pageInfo->filter->order->dir) !== 'asc') $pageInfo->filter->order->dir = 'desc';

		$pageInfo->search = acymailing_getUserVar($paramBase.".search", 'search', '', 'string');
		$pageInfo->search = strtolower(trim($pageInfo->search));
		$pageInfo->limit->value = acymailing_getUserVar($paramBase.'.list_limit', 'limit', acymailing_getCMSConfig('list_limit'), 'int');
		$pageInfo->limit->start = acymailing_getUserVar($paramBase.'.limitstart', 'limitstart', 0, 'int');

		if(!empty($pageInfo->search)){
			$searchVal = '\'%'.acymailing_getEscaped($pageInfo->search, true).'%\'';
			$this->filters[] = "subject LIKE $searchVal OR body LIKE $searchVal";
		}

		$filters = new stdClass();
		if(ACYMAILING_J16){
			$pageInfo->category = acymailing_getUserVar($paramBase.".category", 'category', '0', 'string');
			if(!empty($pageInfo->category)){
				$this->filters[] = "alias LIKE '".acymailing_getEscaped($pageInfo->category, true)."-%'";
			}
			$catvalues = array();
			$catvalues[] = acymailing_selectOption('0', acymailing_translation('ACY_ALL'));
			$catvalues[] = acymailing_selectOption('joomla', 'Joomla!');
			$catvalues[] = acymailing_selectOption('jomsocial', 'JomSocial');
			$catvalues[] = acymailing_selectOption('seblod', 'SEBLOD');
			$filters->category = acymailing_select($catvalues, 'category', 'size="1" style="width:150px" onchange="acymailing.submitform();"', 'value', 'text', $pageInfo->category);
		}

		$query = 'SELECT mailid, subject, alias, fromname, published, fromname, fromemail, replyname, replyemail FROM #__acymailing_mail WHERE ('.implode(') AND (', $this->filters).')';

		if(!empty($pageInfo->filter->order->value)){
			$query .= ' ORDER BY '.$pageInfo->filter->order->value.' '.$pageInfo->filter->order->dir;
		}

		$rows = acymailing_loadObjectList($query, '', $pageInfo->limit->start, $pageInfo->limit->value);

		$queryCount = 'SELECT count(mailid) FROM #__acymailing_mail WHERE ('.implode(') AND (', $this->filters).')';
		$pageInfo->elements->total = acymailing_loadResult($queryCount);
		$pageInfo->elements->page = count($rows);
		$pagination = new acyPagination($pageInfo->elements->total, $pageInfo->limit->start, $pageInfo->limit->value);

		$acyToolbar = acymailing_get('helper.toolbar');
		$acyToolbar->custom('preview', acymailing_translation('ACY_PREVIEW'), 'search', true);
		$acyToolbar->edit();
		$acyToolbar->delete();

		$acyToolbar->divider();
		$acyToolbar->help($this->doc);
		$acyToolbar->setTitle(acymailing_translation($this->nameListing), $this->ctrl);
		$acyToolbar->display();

		$toggleClass = acymailing_get('helper.toggle');
		$this->toggleClass = $toggleClass;
		$this->pageInfo = $pageInfo;
		$this->config = $config;
		$this->rows = $rows;
		$this->pagination = $pagination;
		$this->filters = $filters;
	}

	function form(){
		return parent::form();
	}

	function preview(){
		return parent::preview();
	}

}
components/com_acymailing/views/notification/tmpl/preview.php000060400000000575152453623450020711 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
<?php include(ACYMAILING_BACK.'views'.DS.'newsletter'.DS.'tmpl'.DS.'preview.php'); ?>
</div>
components/com_acymailing/views/notification/tmpl/index.html000060400000000054152453623450020504 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/notification/tmpl/form.php000060400000006203152453623450020165 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<div id="iframedoc"></div>
	<div id="acymailing_edit">
		<form action="<?php echo acymailing_completeLink('notification'); ?>" method="post" name="adminForm" id="adminForm" autocomplete="off" enctype="multipart/form-data">

			<div style="float: left; width: 60%;">
				<div class="confirmBoxMM" id="confirmBoxMM" style="display: none;">
					<div id="acy_popup_content">
						<span class="confirmTxtMM" id="confirmTxtMM"></span><br/>
						<button class="acymailing_button" id="confirmCancelMM" onclick="document.getElementById('confirmBoxMM').style.display='none';document.getElementById('modal-background').style.display='none';return false;" style="padding: 6px 15px 6px 10px;">
							<i class="acyicon-cancel" id="cancelSave" style="margin-right: 5px; font-size: 16px;top: 2px; position: relative;"></i><?php echo acymailing_translation('ACY_CANCEL'); ?>
						</button>
						<button class="acymailing_button acymailing_button_delete" id="confirmOkMM" style="padding: 8px 15px 6px 10px;" onclick="acymailing.submitform(pressbutton,document.adminForm)">
							<i class="acyicon-save" id="iconAction" style="margin-right: 5px; font-size: 12px;"></i><span id="textBtnAction"><?php echo acymailing_translation('ACY_SAVE'); ?></span>
						</button>
					</div>
				</div>
				<div id="modal-background" style="display: none;"></div>
				<div class="acyblockoptions acyblock_newsletter">
					<span class="acyblocktitle"><?php echo acymailing_translation('ACY_NEWSLETTER_INFORMATION'); ?></span>
					<?php include(ACYMAILING_BACK.'views'.DS.'newsletter'.DS.'tmpl'.DS.'info.form.php'); ?>
				</div>
				<div class="acyblockoptions acyblock_newsletter" style="width:90%" id="htmlfieldset">
					<span class="acyblocktitle"><?php echo acymailing_translation('HTML_VERSION'); ?></span>
					<?php echo $this->editor->display(); ?>
				</div>
				<div class="acyblockoptions acyblock_newsletter" style="width:90%" id="textfieldset">
					<span class="acyblocktitle"><?php echo acymailing_translation('TEXT_VERSION'); ?></span>
					<textarea style="width:98%" rows="20" name="data[mail][altbody]" id="altbody" placeholder="<?php echo acymailing_translation('AUTO_GENERATED_HTML'); ?>" onClick="zoneToTag='altbody';"><?php echo @$this->mail->altbody; ?></textarea>
				</div>
			</div>

			<div class="acyblockoptions" style="float:left; width:30%">
				<?php include(ACYMAILING_BACK.'views'.DS.'newsletter'.DS.'tmpl'.DS.'param.form.php'); ?>
			</div>


			<div class="clr"></div>
			<input type="hidden" name="cid[]" value="<?php echo @$this->mail->mailid; ?>"/>
			<input type="hidden" id="tempid" name="data[mail][tempid]" value="<?php echo @$this->mail->tempid; ?>"/>
			<input type="hidden" name="data[mail][type]" value="joomlanotification"/>
			<?php if(!empty($this->Itemid)) echo '<input type="hidden" name="Itemid" value="'.$this->Itemid.'" />';
			acymailing_formOptions(); ?>
		</form>
	</div>
</div>
components/com_acymailing/views/notification/tmpl/listing.php000060400000010111152453623450020664 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<div id="iframedoc"></div>
	<form action="<?php echo acymailing_completeLink('notification'); ?>" method="post" name="adminForm" id="adminForm">
		<table class="acymailing_table_options">
			<tr>
				<td width="100%">
					<?php acymailing_listingsearch($this->pageInfo->search); ?>
				</td>
				<td nowrap="nowrap">
					<?php if(!empty($this->filters->category)) echo $this->filters->category; ?>
				</td>
			</tr>
		</table>
		<table class="acymailing_table" cellpadding="1">
			<thead>
			<tr>
				<th class="title titlebox">
					<input type="checkbox" name="toggle" value="" onclick="acymailing.checkAll(this);"/>
				</th>
				<th class="title">
					<?php echo acymailing_gridSort(acymailing_translation('JOOMEXT_SUBJECT'), 'subject', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
				</th>
				<th class="title">
					<?php echo acymailing_gridSort(acymailing_translation('JOOMEXT_ALIAS'), 'alias', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
				</th>
				<th class="title titlesender">
					<?php echo acymailing_gridSort(acymailing_translation('SENDER_INFORMATIONS'), 'fromname', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
				</th>
				<th class="title titletoggle">
					<?php echo acymailing_gridSort(acymailing_translation('ACY_PUBLISHED'), 'published', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
				</th>
				<th class="title titleid">
					<?php echo acymailing_gridSort(acymailing_translation('ACY_ID'), 'mailid', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
				</th>
			</tr>
			</thead>
			<tfoot>
			<tr>
				<td colspan="7">
					<?php echo $this->pagination->getListFooter();
					echo $this->pagination->getResultsCounter(); ?>
				</td>
			</tr>
			</tfoot>
			<tbody>
			<?php
			$k = 0;

			for($i = 0, $a = count($this->rows); $i < $a; $i++){
				$row =& $this->rows[$i];
				$publishedid = 'published_'.$row->mailid;
				?>
				<tr class="<?php echo "row$k"; ?>">
					<td align="center" style="text-align:center">
						<?php echo acymailing_gridID($i, $row->mailid); ?>
					</td>
					<td>
						<?php
						$subjectLine = str_replace('<ADV>', $this->escape('<ADV>'), $row->subject);
						echo acymailing_tooltip('<b>'.acymailing_translation('JOOMEXT_ALIAS').' : </b>'.$row->alias, ' ', '', $subjectLine, acymailing_completeLink('notification&task=edit&mailid='.$row->mailid)); ?>
					</td>
					<td><?php echo $row->alias; ?></td>
					<td align="center" style="text-align:center">
						<?php
						if(empty($row->fromname)) $row->fromname = $this->config->get('from_name');
						if(empty($row->fromemail)) $row->fromemail = $this->config->get('from_email');
						if(empty($row->replyname)) $row->replyname = $this->config->get('reply_name');
						if(empty($row->replyemail)) $row->replyemail = $this->config->get('reply_email');
						if(!empty($row->fromname)){
							$text = '<b>'.acymailing_translation('FROM_NAME').' : </b>'.$row->fromname;
							$text .= '<br /><b>'.acymailing_translation('FROM_ADDRESS').' : </b>'.$row->fromemail;
							$text .= '<br /><br /><b>'.acymailing_translation('REPLYTO_NAME').' : </b>'.$row->replyname;
							$text .= '<br /><b>'.acymailing_translation('REPLYTO_ADDRESS').' : </b>'.$row->replyemail;
							echo acymailing_tooltip($text, ' ', '', $row->fromname);
						}
						?>
					</td>
					<td align="center" style="text-align:center">
						<span id="<?php echo $publishedid ?>" class="loading"><?php echo $this->toggleClass->toggle($publishedid, (int)$row->published, 'mail') ?></span>
					</td>
					<td width="1%" align="center">
						<?php echo $row->mailid; ?>
					</td>
				</tr>
			<?php } ?>
			</tbody>
		</table>

		<?php acymailing_formOptions($this->pageInfo->filter->order); ?>
	</form>
</div>
components/com_acymailing/views/notification/index.html000060400000000054152453623450017530 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/send/view.html.php000060400000002125152453623450016425 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php


class SendViewSend extends acymailingView{

	function display($tpl = null){
		$function = $this->getLayout();
		if(method_exists($this, $function)) $this->$function();

		parent::display($tpl);
	}

	function sendconfirm(){

		$mailid = acymailing_getCID('mailid');
		$mailClass = acymailing_get('class.mail');
		$listmailClass = acymailing_get('class.listmail');
		$queueClass = acymailing_get('class.queue');
		$mail = $mailClass->get($mailid);

		$values = new stdClass();
		$values->nbqueue = $queueClass->nbQueue($mailid);

		if(empty($values->nbqueue)){
			$lists = $listmailClass->getReceivers($mailid);
			$this->lists = $lists;

			$values->alreadySent = acymailing_loadResult('SELECT count(subid) FROM `#__acymailing_userstats` WHERE `mailid` = '.intval($mailid));
		}

		$this->values = $values;
		$this->mail = $mail;
	}


}
components/com_acymailing/views/send/index.html000060400000000054152453623450015773 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/send/tmpl/sendconfirm.php000060400000011641152453623450017776 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<div id="iframedoc"></div>
	<form action="<?php echo acymailing_completeLink('send'); ?>" method="post" name="adminForm" id="adminForm" autocomplete="off">
		<div>
			<?php $displayWarning = false;
			$config = acymailing_config();
			$toggleClass = acymailing_get('helper.toggle');
			if(empty($this->values->nbqueue)){
				if(!empty($this->lists)){
					?>
					<div class="onelineblockoptions">
						<span class="acyblocktitle"><?php echo acymailing_translation('NEWSLETTER_SENT_TO'); ?></span>
						<table class="acymailing_table" cellspacing="1" align="center">
							<tbody>
							<?php
							$k = 0;
							$listids = array();
							foreach($this->lists as $row){
								$listids[] = $row->listid;
								if($row->nbsub > 100) $displayWarning = true;
								?>
								<tr class="<?php echo "row$k"; ?>">
									<td>
										<?php
										echo acymailing_tooltip($row->description, $row->name, 'tooltip.png', $row->name);
										echo ' ( '.acymailing_translation_sprintf('ACY_SELECTED_USERS', $row->nbsub).' )';
										?>
									</td>
								</tr>
								<?php
								$k = 1 - $k;
							} ?>
							</tbody>
						</table>
						<?php
						$filterClass = acymailing_get('class.filter');

						if(!empty($this->mail->filter)){
							$resultFilters = $filterClass->displayFilters($this->mail->filter);
							if(!empty($resultFilters)){
								echo '<br />'.acymailing_translation('RECEIVER_LISTS').'<br />'.acymailing_translation('FILTER_ONLY_IF');
								echo '<ul><li>'.implode('</li><li>', $resultFilters).'</li></ul>';
							}
						}

						$nbTotalReceivers = $nbTotalReceiversAll = $filterClass->countReceivers($listids, $this->mail->filter);
						?>
					</div>
					<?php if(!empty($this->values->alreadySent)){
						$filterClass->onlynew = true;
						$nbTotalReceivers = $nbTotalReceiversAlready = $filterClass->countReceivers($listids, $this->mail->filter, $this->mail->mailid);
						acymailing_display(acymailing_translation_sprintf('ALREADY_SENT', $this->values->alreadySent).'<br />'.acymailing_translation('REMOVE_ALREADY_SENT').'<br />'.acymailing_boolean("onlynew", 'onclick="if(this.value == 1){document.getElementById(\'nbreceivers\').innerHTML = \''.$nbTotalReceiversAlready.'\';}else{document.getElementById(\'nbreceivers\').innerHTML = \''.$nbTotalReceiversAll.'\'}"', 1, acymailing_translation('JOOMEXT_YES'), acymailing_translation('SEND_TO_ALL')), 'warning');
					}elseif($displayWarning){

						if($config->get('warninglimitation', 1)){
							$notremind = '<small style="float:right;margin-right:30px;position:relative;">'.$toggleClass->delete('acymailing_messages_warning', 'warninglimitation_0', 'config', false, acymailing_translation('DONT_REMIND')).'</small>';
							acymailing_display(acymailing_translation('WARNING_LIMITATION').'<br /><a target="_blank" href="'.ACYMAILING_HELPURL.'send-process">'.acymailing_translation('WARNING_LIMITATION_CONFIG').'</a>'.$notremind, 'warning');
						}
					}
				}else{
					acymailing_display(acymailing_translation('EMAIL_AFFECT'), 'warning');
				}
			}else{
				acymailing_display(acymailing_translation_sprintf('NB_PENDING_EMAIL', $this->values->nbqueue, '<b><i>'.$this->mail->subject.'</i></b>').'<br />'.acymailing_translation('SEND_CONTINUE'), 'info');
				?>
				<input type="hidden" name="totalsend" value="<?php echo $this->values->nbqueue; ?>"/>
			<?php
			}
			?>
			<?php if(!empty($this->mail->mailid) AND (!empty($this->lists) OR !empty($this->values->nbqueue))){
				if(!acymailing_level(1) && $config->get('warningautomaticprocess', 1)){
					$notremind = '<small style="float:right;margin-right:30px;position:relative;">'.$toggleClass->delete('acymailing_messages_warning', 'warningautomaticprocess_0', 'config', false, acymailing_translation('DONT_REMIND')).'</small>';
					acymailing_display(acymailing_translation('ACY_WARNING_FREESENDPROCESS').$notremind, 'warning');
				}

				?>
				<div style="text-align:center;font-size:14px;padding:20px;">
					<?php if(empty($this->values->nbqueue)) echo acymailing_translation_sprintf('SENT_TO_NUMBER', '<span style="font-weight:bold;" id="nbreceivers" >'.$nbTotalReceivers.'</span>').'<br />'; ?>
					<input onclick="document.adminForm.task.value='<?php echo empty($this->values->nbqueue) ? 'send' : 'continuesend'; ?>';" class="acymailing_button" style="padding:10px 30px;margin:5px;font-size:14px;cursor:pointer;" type="submit" value="<?php echo empty($this->values->nbqueue) ? acymailing_translation('SEND') : acymailing_translation('CONTINUE') ?>"/>
				</div>
			<?php } ?>
		</div>
		<div class="clr"></div>
		<input type="hidden" name="cid[]" value="<?php echo $this->mail->mailid; ?>"/>
		<?php acymailing_formOptions(); ?>
	</form>
</div>
components/com_acymailing/views/send/tmpl/index.html000060400000000054152453623450016747 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/send/tmpl/addqueue.php000060400000003150152453623450017260 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><form action="<?php echo acymailing_completeLink('send', true); ?>" method="post" name="adminForm" id="adminForm" autocomplete="off">
	<div class="onelineblockoptions">
		<table class="acymailing_table">
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation('ACY_USER'); ?>
				</td>
				<td>
					<?php echo acymailing_tooltip('Name : '.$this->subscriber->name.'<br />ID : '.$this->subscriber->subid, $this->subscriber->email, 'tooltip.png', $this->subscriber->email); ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation('NEWSLETTER'); ?>
				</td>
				<td>
					<?php echo $this->emaildrop; ?>
				</td>
			</tr>
			<tr>
				<td class="acykey">
					<?php echo acymailing_translation('SEND_DATE'); ?>
				</td>
				<td>
					<?php echo acymailing_calendar(acymailing_getDate(time(), '%Y-%m-%d'), 'senddate', 'senddate', '%Y-%m-%d', array('style' => 'width:100px'));
					echo '&nbsp; @ '.$this->hours.' : '.$this->minutes; ?>
				</td>
			</tr>
			<tr>
				<td>
				</td>
				<td>
					<button class="acymailing_button" onclick="document.adminForm.task.value='scheduleone';" type="submit"><?php echo acymailing_translation('SCHEDULE'); ?></button>
				</td>
			</tr>
		</table>
	</div>
	<input type="hidden" name="subid" value="<?php echo $this->subscriber->subid; ?>"/>
	<?php acymailing_formOptions(); ?>
</form>
components/com_acymailing/views/filter/index.html000060400000000054152453623450016327 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/filter/tmpl/index.html000060400000000054152453623450017303 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/filter/tmpl/form.php000060400000022745152453623450016775 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><style type="text/css">
	div.plugarea{
		padding: 5px;
	}
</style>
<div id="acy_content">
	<div id="iframedoc"></div>
	<div id="acybase_filters" style="display:none">
		<div id="filters_original">
			<?php echo acymailing_select($this->typevaluesFilters, "filter[type][__block__][__num__]", 'class="inputbox chzn-done" size="1" onchange="updateFilter(__num__);countresults(__num__);"', 'value', 'text', '', 'filtertype__num__'); ?>
			<span id="countresult___num__"></span>

			<div class="acyfilterarea" id="filterarea___num__"></div>
		</div>
		<?php echo $this->outputFilters; ?>
		<div id="actions_original">
			<?php echo acymailing_select($this->typevaluesActions, "action[type][0][__num__]", 'class="inputbox chzn-done" size="1" onchange="updateAction(__num__);"', 'value', 'text', '', 'actiontype__num__'); ?>
			<div class="acyfilterarea" id="actionarea___num__"></div>
		</div>
		<?php echo $this->outputActions; ?>
	</div>
	<?php if(!empty($this->filteredUsers)){ ?>
		<div class="acyblockoptions" id="filteredUsers">
			<span class="acyblocktitle"><?php
				$usersCount = $this->filteredUsers['countTotal'];
				echo acymailing_translation_sprintf('ACY_FILTEREDUSERS', count($this->filteredUsers['users']), $usersCount); ?>
			</span>

			<div id="acyFilteredUsers">
				<table class="acymailing_table" id="filteredUsersTable">
					<thead>
					<tr>
						<th class="title titlenum"><?php echo acymailing_translation('ACY_ID'); ?></th>
						<th class="title titlenum"><?php echo acymailing_translation('JOOMEXT_NAME'); ?></th>
						<th class="title titlenum"><?php echo acymailing_translation('JOOMEXT_EMAIL'); ?></th>
					</tr>
					</thead>
					<tbody>
					<?php
					$k = 0;
					foreach($this->filteredUsers['users'] as $user){
						?>
						<tr class="row<?php echo $k; ?>">
							<td align="center" style="text-align:center"><?php echo $user->subid; ?></td>
							<td align="center" style="text-align:center"><?php echo $user->name; ?></td>
							<td align="center" style="text-align:center"><?php echo '<a href="'.acymailing_completeLink('subscriber&task=edit&subid='.$user->subid).'" target="_blank">'.$user->email.'</a>'; ?></td>
						</tr>
						<?php
						$k = 1 - $k;
					} ?>
					</tbody>
				</table>
			</div>
		</div>
	<?php } ?>
	<form action="<?php echo acymailing_completeLink('filter', acymailing_isNoTemplate()); ?>" method="post" name="adminForm" id="adminForm" autocomplete="off">
		<?php if(acymailing_isNoTemplate()){
			if(empty($this->subid)){
				acymailing_display(acymailing_translation('PLEASE_SELECT_USERS'), 'warning');
				return;
			}
			$acyToolbar = acymailing_get('helper.toolbar');
			$acyToolbar->custom('process', acymailing_translation('PROCESS'), 'process', false);
			$acyToolbar->setTitle(acymailing_translation('ACTIONS'), '');
			$acyToolbar->topfixed = false;
			$acyToolbar->display();

			$subIds = explode(',', $this->subid);
			acymailing_arrayToInteger($subIds);
			$this->subid = implode(',', $subIds);
			?>

			<input type="hidden" name="subid" value="<?php echo $this->subid; ?>"/>
		<?php } ?>
		<div class="acyblockoptions" id="filterinfo" <?php if(empty($this->filter->filid)) echo 'style="display:none"'; ?> >
			<span class="acyblocktitle"><?php echo acymailing_translation('ACY_FILTER'); ?></span>
			<table width="100%" class="paramlist admintable">
				<tr>
					<td class="paramlist_key">
						<label for="title"><?php echo acymailing_translation('ACY_TITLE'); ?></label>
					</td>
					<td class="paramlist_value">
						<input class="inputbox" id="title" type="text" name="data[filter][name]" style="width:250px" value="<?php echo $this->escape(@$this->filter->name); ?>"/>
					</td>
					<td width="50%" rowspan="3" class="acyfiltertriggertitle">
						<span class="acyblocktitle"><?php echo acymailing_translation('AUTO_TRIGGER_FILTER'); ?></span>
						<?php foreach($this->triggers as $key => $triggerName){ ?>
							<?php if(is_object($triggerName)){
								echo $triggerName->name;
								foreach($triggerName->triggers as $subkey => $subTriggerName){ ?>
									<div class="acyautofiltertriggers">
										<input id="trigger_<?php echo $subkey; ?>" type="checkbox" name="trigger[<?php echo $subkey; ?>]" value="1" <?php if(isset($this->filter->trigger[$subkey])) echo 'checked="checked"'; ?> />
										<label for="trigger_<?php echo $subkey; ?>"><?php echo $subTriggerName; ?></label>
									</div>
								<?php }
							}else{ ?>
								<div class="acyautofiltertriggers">
									<input id="trigger_<?php echo $key; ?>" type="checkbox" name="trigger[<?php echo $key; ?>]" value="1" <?php if(isset($this->filter->trigger[$key])) echo 'checked="checked"'; ?> />
									<label for="trigger_<?php echo $key; ?>"><?php echo $triggerName; ?></label><?php echo ($key == 'daycron') ? ' '.$this->hours.' : '.$this->minutes.' '.$this->nextDate : ''; ?>
								</div>
							<?php } ?>
						<?php } ?>
					</td>
				</tr>
				<tr>
					<td class="paramlist_key" valign="top">
						<label for="description"><?php echo acymailing_translation('ACY_DESCRIPTION'); ?></label>
					</td>
					<td class="paramlist_value" valign="top">
						<textarea id="description" style="width:300px;" rows="5" name="data[filter][description]"><?php echo @$this->filter->description; ?></textarea>
					</td>
				</tr>
				<tr>
					<td class="paramlist_key">
						<label for="published"><?php echo acymailing_translation('ACY_PUBLISHED'); ?></label>
					</td>
					<td class="paramlist_value">
						<?php echo acymailing_boolean("data[filter][published]", '', @$this->filter->published); ?>
					</td>
				</tr>
			</table>
		</div>
		<?php if(empty($this->subid)){ ?>
			<div class="acyblockoptions" id="filters_block">
				<span class="acyblocktitle"><?php echo acymailing_translation('ACY_FILTERS'); ?></span>
				<button id="acyorbutton" class="acymailing_button" onclick="addOrBlock();return false;"><?php echo ucfirst(acymailing_translation('ACY_OR')); ?></button>
			</div>
		<?php } ?>
		<div class="acyblockoptions" id="actions_block">
			<span class="acyblocktitle"><?php echo acymailing_translation('ACTIONS'); ?></span>

			<div id="allactions"></div>
			<button class="acymailing_button" onclick="addAction();return false;"><?php echo acymailing_translation('ADD_ACTION'); ?></button>
		</div>

		<div class="clr"></div>

		<input type="hidden" name="filid" value="<?php echo @$this->filter->filid; ?>"/>
		<input type="hidden" name="limitstart" value="0">

		<?php acymailing_formOptions($this->pageInfo->filter->order); ?>
		<!--</form>-->
		<?php if(!empty($this->subid)){ ?>
			<div class="acyblockoptions" id="selectedUsers">
				<span class="acyblocktitle"><?php echo acymailing_translation('USERS'); ?></span>

				<div style="display:none"></div>
				<table class="acymailing_table" cellpadding="1">
					<?php
					$k = 0;
					foreach($this->users as $row){
						?>
						<tr class="<?php echo "row$k"; ?>">
							<td><?php echo $row->name; ?></td>
							<td><?php echo $row->email; ?></td>
						</tr>
						<?php $k = 1 - $k;
					}

					if(count($this->users) >= 10){
						?>
						<tr class="<?php echo "row$k"; ?>">
							<td>...</td>
							<td>...</td>
						</tr>
					<?php } ?>
				</table>
			</div>
		<?php } ?>
		<?php if(!(empty($this->filters) && $this->pageInfo->search == "")){ ?>
			<br/><br/>
			<div class="acyblockoptions" id="existing_filters">
				<span class="acyblocktitle"><?php echo acymailing_translation('EXISTING_FILTERS'); ?></span>
				<table class="acymailing_table_options">
					<tr>
						<td width="100%">
							<?php acymailing_listingsearch($this->pageInfo->search); ?>
						</td>
					</tr>
				</table>
				<table class="acymailing_table" cellpadding="1">
					<thead>
					<tr>
						<th class="title">
							<?php echo acymailing_gridSort(acymailing_translation('ACY_FILTER'), 'name', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
						</th>
						<th class="title titletoggle">
							<?php echo acymailing_translation('ACY_PUBLISHED'); ?>
						</th>
						<th class="title titletoggle">
							<?php echo acymailing_translation('ACY_DELETE'); ?>
						</th>
						<th class="title titleid">
							<?php echo acymailing_gridSort(acymailing_translation('ACY_ID'), 'filid', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
						</th>
					</tr>
					</thead>
					<tbody>
					<?php
					$k = 0;
					foreach($this->filters as $row){
						$publishedid = 'published_'.$row->filid;
						$id = 'filter_'.$row->filid;
						?>
						<tr class="<?php echo "row$k"; ?>" id="<?php echo $id; ?>">
							<td>
								<?php echo acymailing_tooltip($row->description, $row->name, '', $row->name, acymailing_completeLink('filter&task=edit&filid='.$row->filid)); ?>
							</td>
							<td align="center" style="text-align:center">
								<span id="<?php echo $publishedid ?>" class="loading"><?php echo $this->toggleClass->toggle($publishedid, (int)$row->published, 'filter') ?></span>
							</td>
							<td align="center" style="text-align:center">
								<?php echo $this->toggleClass->delete($id, $row->filid.'_'.$row->filid, 'filter', true); ?>
							</td>
							<td width="1%" align="center">
								<?php echo $row->filid; ?>
							</td>
						</tr>
						<?php
						$k = 1 - $k;
					}
					?>
					</tbody>
				</table>
			</div>
		<?php } ?>
		<div class="clr"></div>
	</form>
</div>
components/com_acymailing/views/filter/tmpl/load.php000060400000003552152453623450016744 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
acymailing_cmsLoaded();
?>
<table class="adminlist table table-striped table-hover" cellpadding="1">
	<thead>
		<tr>
			<th class="title">
				<?php echo acymailing_translation('ACY_FILTER'); ?>
			</th>
			<th class="title titletoggle">
				<?php echo acymailing_translation('PUBLISHED'); ?>
			</th>
			<th class="title titletoggle" >
				<?php echo acymailing_translation( 'DELETE' ); ?>
			</th>
			<th class="title titleid">
				<?php echo acymailing_translation( 'ACY_ID' ); ?>
			</th>
		</tr>
	</thead>
	<tbody>
		<?php
			$k = 0;
			foreach($this->filters as $row){
				$publishedid = 'published_'.$row->filid;
				$id = 'filter_'.$row->filid;
		?>
			<tr class="<?php echo "row$k"; ?>" id="<?php echo $id; ?>">
				<td style="cursor:pointer" onclick="window.top.location.href = '<?php echo acymailing_completeLink('filter&task=edit&filid='.$row->filid); ?>';">
					<?php
						echo acymailing_tooltip($row->description, $row->name, '', $row->name);
					?>
				</td>
				<td align="center" style="text-align:center" >
						<span id="<?php echo $publishedid ?>" class="loading"><?php echo $this->toggleClass->toggle($publishedid,(int) $row->published,'filter') ?></span>
				</td>
				<td align="center" style="text-align:center" >
					<?php echo $this->toggleClass->delete($id,$row->filid.'_'.$row->filid,'filter',true); ?>
				</td>
				<td width="1%" align="center" style="cursor:pointer" onclick="window.top.location.href = '<?php echo acymailing_completeLink('filter&task=edit&filid='.$row->filid); ?>';">
					<?php echo $row->filid; ?>
				</td>
			</tr>
		<?php
				$k = 1-$k;
			}
		?>
	</tbody>
</table>

components/com_acymailing/views/filter/view.html.php000060400000031521152453623450016763 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class FilterViewFilter extends acymailingView{

	var $chosen = false;

	function display($tpl = null){
		$function = $this->getLayout();
		if(method_exists($this, $function)) $this->$function();

		parent::display($tpl);
	}

	function form(){

		$config = acymailing_config();
		$pageInfo = new stdClass();
		$pageInfo->filter = new stdClass();
		$pageInfo->filter->order = new stdClass();
		$pageInfo->limit = new stdClass();
		$pageInfo->elements = new stdClass();

		$paramBase = ACYMAILING_COMPONENT.'.'.$this->getName();

		$pageInfo->filter->order->value = acymailing_getUserVar($paramBase.".filter_order", 'filter_order', 'name', 'cmd');
		$pageInfo->filter->order->dir = acymailing_getUserVar($paramBase.".filter_order_Dir", 'filter_order_Dir', 'asc', 'word');
		if(strtolower($pageInfo->filter->order->dir) !== 'desc') $pageInfo->filter->order->dir = 'asc';
		$pageInfo->search = acymailing_getUserVar($paramBase.".search", 'search', '', 'string');
		$pageInfo->search = strtolower(trim($pageInfo->search));


		$pageInfo->limit->value = acymailing_getUserVar($paramBase.'.list_limit', 'limit', acymailing_getCMSConfig('list_limit'), 'int');
		$pageInfo->limit->start = acymailing_getUserVar($paramBase.'.limitstart', 'limitstart', 0, 'int');

		if(acymailing_getVar('none', 'task') == 'filterDisplayUsers'){
			$action = array();
			$action['type'] = array(0 => array('displayUsers'));
			$action[] = array('displayUsers' => array());

			$filterClass = acymailing_get('class.filter');
			$filterClass->subid = acymailing_getVar('string', 'subid');
			$filterClass->execute(acymailing_getVar('none', 'filter'), $action, 200000);

			if(!empty($filterClass->report)){
				$this->filteredUsers = $filterClass->report[0];
			}
		}

		$filid = acymailing_getCID('filid');

		$filterClass = acymailing_get('class.filter');
		if(!empty($filid) && acymailing_getVar('cmd', 'task', '') != 'filterDisplayUsers'){
			$filter = $filterClass->get($filid);
		}else{
			$filter = new stdClass();
			$filter->action = acymailing_getVar('none', 'action');
			$filter->filter = acymailing_getVar('none', 'filter');
			$filter->published = 1;
		}

		acymailing_importPlugin('acymailing');

		$typesFilters = array();
		$typesActions = array();

		$outputFilters = implode('', acymailing_trigger('onAcyDisplayFilters', array(&$typesFilters, 'massactions')));
		$outputActions = implode('', acymailing_trigger('onAcyDisplayActions', array(&$typesActions)));

		$typevaluesFilters = array();
		$typevaluesActions = array();
		$typevaluesFilters[] = acymailing_selectOption('', acymailing_translation('FILTER_SELECT'));
		$typevaluesActions[] = acymailing_selectOption('', acymailing_translation('ACTION_SELECT'));
		foreach($typesFilters as $oneType => $oneName){
			$typevaluesFilters[] = acymailing_selectOption($oneType, $oneName);
		}
		foreach($typesActions as $oneType => $oneName){
			$typevaluesActions[] = acymailing_selectOption($oneType, $oneName);
		}

		$js = "function updateAction(actionNum){
				var actiontype = window.document.getElementById('actiontype'+actionNum);
				if(actiontype == 'undefined' || actiontype == null) return;
				currentActionType = actiontype.value;
				if(!currentActionType){
					window.document.getElementById('actionarea_'+actionNum).innerHTML = '';
					return;
				}
				actionArea = 'action__num__'+currentActionType;
				window.document.getElementById('actionarea_'+actionNum).innerHTML = window.document.getElementById(actionArea).innerHTML.replace(/__num__/g,actionNum);
				if(typeof(window['onAcyDisplayAction_'+currentActionType]) == 'function') {
					try{ window['onAcyDisplayAction_'+currentActionType](actionNum); }catch(e){alert('Error in the onAcyDisplayAction_'+currentActionType+' function : '+e); }
				}

			}";

		$js .= "var numActions = 0;
				function addAction(){
					var newdiv = document.createElement('div');
					newdiv.id = 'action'+numActions;
					newdiv.className = 'plugarea';
					newdiv.innerHTML = document.getElementById('actions_original').innerHTML.replace(/__num__/g, numActions);
					var allactions = document.getElementById('allactions');
					if(allactions != 'undefined' && allactions != null){
						allactions.appendChild(newdiv);
						updateAction(numActions);
						numActions++;
						
						if(numActions > 1){
							var del = document.createElement('i');
							del.setAttribute('class', 'acyicon-cancel deleteFilter');
							del.onclick = function(){
								this.parentNode.remove(); 
								return false;
							}
							var num = numActions - 1;
							var sp2 = document.getElementById('actiontype' + num.toString());
							var parentDiv = sp2.parentNode;
							parentDiv.insertBefore(del, sp2.nextSibling);
						}
					}
				}
				";

		$js .= "document.addEventListener(\"DOMContentLoaded\", function(){ addAction(); });";

		$js .= '
			document.addEventListener("DOMContentLoaded", function(){
				acymailing.submitbutton = function(pressbutton) {
					if (pressbutton != \'save\') {
						acymailing.submitform(pressbutton,document.adminForm);
						return;
					}';
		if(ACYMAILING_J30){
			$js .= "if(window.document.getElementById('filterinfo').style.display == 'none'){
						window.document.getElementById('filterinfo').style.display = 'block';
						return false;}
					if(window.document.getElementById('title').value.length < 2){alert('".acymailing_translation('ENTER_TITLE', true)."'); return false;}";
		}else{
			$js .= "if(window.document.getElementById('filterinfo').style.display == 'none'){
						window.document.getElementById('filterinfo').style.display = 'block';
						return false;}
					if(window.document.getElementById('title').value.length < 2){alert('".acymailing_translation('ENTER_TITLE', true)."'); return false;}";
		}
		
		$js .= "
					acymailing.submitform(pressbutton,document.adminForm);
				};
			 }); ";

		acymailing_addScript(true, $js);

		$filterClass->addJSFilterFunctions();

		$js = '';
		$data = array('action', 'filter');

		foreach($data as $datatype){
			if(empty($filter->$datatype)) continue;
			$blockNum = 0;
			$dataNum = 0;
			foreach($filter->{$datatype}['type'] as $block => $oneFilter){
				if($datatype == 'action'){
					$jsFunction = 'addAction();';
				}else{
					$jsFunction = '
						if(!document.getElementById(\'addButton_'.$blockNum.'\')) addOrBlock();
						document.getElementById(\'addButton_'.$blockNum.'\').click();';
				}

				foreach($oneFilter as $num => $oneType) {
					if(empty($oneType)) continue;

					$js .= "
						
						if(!document.getElementById('" . $datatype . "type$dataNum')){
							" . $jsFunction . "
						}
						
						document.getElementById('" . $datatype . "type$dataNum').value = '$oneType';
						update" . ucfirst($datatype) . "($dataNum);";
					if(empty($filter->{$datatype}[$num][$oneType])) continue;

					foreach($filter->{$datatype}[$num][$oneType] as $key => $value) {
						if (is_array($value)) {
							$js .= "try{\r\n";
							foreach ($value as $subkey => $subval) {
								$js .= "document.adminForm.elements['" . $datatype . "[$dataNum][$oneType][$key][$subkey]'].value = '" . addslashes(str_replace(array("\n", "\r"), ' ', $subval)) . "';\r\n";
								$js .= "if(document.adminForm.elements['" . $datatype . "[$dataNum][$oneType][$key][$subkey]'].type && document.adminForm.elements['" . $datatype . "[$dataNum][$oneType][$key][$subkey]'].type == 'checkbox'){
									document.adminForm.elements['" . $datatype . "[$dataNum][$oneType][$key][$subkey]'].checked = 'checked';
								}\r\n";
							}
							$js .= "}catch(e){}";
						}
						$myVal = is_array($value) ? implode(',', $value) : $value;
						$js .= "
						try{
							document.adminForm.elements['" . $datatype . "[$dataNum][$oneType][$key]'].value = '" . addslashes(str_replace(array("\n", "\r"), ' ', $myVal)) . "';
							if(document.adminForm.elements['" . $datatype . "[$dataNum][$oneType][$key]'].type && document.adminForm.elements['" . $datatype . "[$dataNum][$oneType][$key]'].type == 'checkbox'){
								document.adminForm.elements['" . $datatype . "[$dataNum][$oneType][$key]'].checked = 'checked';
							}
						}catch(e){}";
					}

					$js .= "
						if(typeof(onAcyDisplay" . ucfirst($datatype) . "_" . $oneType . ") == 'function'){
							try{
								onAcyDisplay" . ucfirst($datatype) . "_" . $oneType . "($dataNum);
							}catch(e){
								alert('Error in the onAcyDisplay" . ucfirst($datatype) . "_" . $oneType . " function : '+e);
							}
						}";

					if($datatype == 'filter') $js .= " countresults($dataNum);";
					$dataNum++;
				}
				$blockNum++;
			}
		}

		$listid = acymailing_getVar('int', 'listid');
		if(!empty($listid)){
			$js .= "
				document.getElementById('actiontype0').value = 'list';
				updateAction(0);
				document.adminForm.elements['action[0][list][selectedlist]'].value = '".$listid."';";
		}

		acymailing_addScript(true, "document.addEventListener(\"DOMContentLoaded\", function(){ $js });");

		$triggers = array();
		$triggers['daycron'] = acymailing_translation('AUTO_CRON_FILTER');

		if(empty($filter->daycron)){
			$nextDate = $config->get('cron_plugins_next', time());
		}else{
			$nextDate = $filter->daycron;
		}

		$listHours = array();
		$listMinutess = array();
		for($i = 0; $i < 24; $i++){              
			$value = $i < 10 ? '0'.$i : $i;
			$listHours[] = acymailing_selectOption($value, $value);
		}
		$hours = acymailing_select($listHours, 'triggerhours', 'class="inputbox" size="1" style="width:60px;"', 'value', 'text', acymailing_getDate($nextDate, 'H'));
		for($i = 0; $i < 60; $i += 5){          
			$value = $i < 10 ? '0'.$i : $i;
			$listMinutess[] = acymailing_selectOption($value, $value);
		}
		$defaultMin = floor(acymailing_getDate($nextDate, 'i') / 5) * 5;
		$minutes = acymailing_select($listMinutess, 'triggerminutes', 'class="inputbox" size="1" style="width:60px;"', 'value', 'text', $defaultMin);
		$this->hours = $hours;
		$this->minutes = $minutes;

		$this->nextDate = !empty($nextDate) ? ' ('.acymailing_translation('NEXT_RUN').' : '.acymailing_getDate($nextDate, '%d %B %Y  %H:%M').')' : '';

		$triggers['allcron'] = acymailing_translation('ACY_EACH_TIME');
		$triggers['subcreate'] = acymailing_translation('ON_USER_CREATE');
		$triggers['subchange'] = acymailing_translation('ON_USER_CHANGE');
		acymailing_trigger('onAcyDisplayTriggers', array(&$triggers));

		$name = empty($filter->name) ? '' : ' : '.$filter->name;

		if(!acymailing_isNoTemplate()){
			$acyToolbar = acymailing_get('helper.toolbar');
			$acyToolbar->custom('filterDisplayUsers', acymailing_translation('FILTER_VIEW_USERS'), 'user', false, '');
			$acyToolbar->custom('process', acymailing_translation('PROCESS'), 'process', false, '');
			$acyToolbar->divider();
			if(acymailing_level(3)){
				$acyToolbar->save();
				if(!empty($filter->filid)) $acyToolbar->link(acymailing_completeLink('filter&task=edit&filid=0'), acymailing_translation('ACY_NEW'), 'new');
			}
			$acyToolbar->link(acymailing_completeLink('dashboard'), acymailing_translation('ACY_CLOSE'), 'cancel');
			$acyToolbar->divider();
			$acyToolbar->help('filter');
			$acyToolbar->setTitle(acymailing_translation('ACY_MASS_ACTIONS').$name, 'filter&task=edit&filid='.$filid);
			$acyToolbar->display();
		}else{
			acymailing_setPageTitle(acymailing_translation('ACY_MASS_ACTIONS').$name);
		}

		$subid = acymailing_getVar('string', 'subid');
		if(!empty($subid)){
			$subArray = explode(',', trim($subid, ','));
			acymailing_arrayToInteger($subArray);

			$users = acymailing_loadObjectList('SELECT `name`,`email` FROM `#__acymailing_subscriber` WHERE `subid` IN ('.implode(',', $subArray).')');
			if(!empty($users)){
				$this->users = $users;
				$this->subid = $subid;
			}
		}

		$this->typevaluesFilters = $typevaluesFilters;
		$this->typevaluesActions = $typevaluesActions;
		$this->outputFilters = $outputFilters;
		$this->outputActions = $outputActions;
		$this->filter = $filter;
		$this->pageInfo = $pageInfo;

		$this->triggers = $triggers;
		if(acymailing_isNoTemplate()){
			acymailing_addStyle(false, ACYMAILING_CSS.'frontendedition.css?v='.filemtime(ACYMAILING_MEDIA.'css'.DS.'frontendedition.css'));
		}

		if(acymailing_level(3) && !acymailing_isNoTemplate()){
			$query = 'SELECT * FROM '.acymailing_table('filter');

			if(!empty($pageInfo->search)){
				$searchVal = '\'%'.acymailing_getEscaped($pageInfo->search, true).'%\'';
				$query .= ' WHERE LOWER(name) LIKE'.$searchVal;
			}

			if(!empty($pageInfo->filter->order->value) && (($pageInfo->filter->order->value === "name") || ($pageInfo->filter->order->value === "filid"))){
				$query .= ' ORDER BY '.$pageInfo->filter->order->value.' '.$pageInfo->filter->order->dir;
			}

			$filters = acymailing_loadObjectList($query);

			$toggleClass = acymailing_get('helper.toggle');
			$this->toggleClass = $toggleClass;
			$this->filters = $filters;
		}
	}
}
components/com_acymailing/views/template/index.html000060400000000054152453623450016655 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/template/tmpl/index.html000060400000000054152453623450017631 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/template/tmpl/listing.php000060400000011230152453623450020014 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<div id="iframedoc"></div>
	<?php $saveOrder = $this->pageInfo->filter->order->value == 'a.ordering' && strtolower($this->pageInfo->filter->order->dir) == 'asc';	?>
	<form action="<?php echo acymailing_completeLink('template'); ?>" method="post" name="adminForm" id="adminForm">
		<table class="acymailing_table_options">
			<tr>
				<td width="100%">
					<?php acymailing_listingsearch($this->pageInfo->search); ?>
				</td>
				<td nowrap="nowrap">
					<?php
					?>
				</td>
			</tr>
		</table>

		<table class="acymailing_table" cellpadding="1" id="templateListing">
			<thead>
			<tr>
				<th class="title titlenum">
					<?php echo acymailing_translation('ACY_NUM'); ?>
				</th>
				<th class="title titleorder" style="width:32px !important; padding-left:1px; padding-right:1px;">
					<?php echo acymailing_gridSort('<i class="icon-menu-2"></i>', 'a.ordering', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value, null, 'asc', 'JGRID_HEADING_ORDERING'); ?>
				</th>
				<th class="title titlebox">
					<input type="checkbox" name="toggle" value="" onclick="acymailing.checkAll(this);"/>
				</th>
				<th class="title">
					<?php echo acymailing_gridSort(acymailing_translation('ACY_TEMPLATE'), 'a.name', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
				</th>
				<th class="title titletoggle">
					<?php echo acymailing_gridSort(acymailing_translation('ACY_DEFAULT'), 'a.premium', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
				</th>
				<th class="title titletoggle">
					<?php echo acymailing_gridSort(acymailing_translation('ACY_PUBLISHED'), 'a.published', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
				</th>
				<th class="title titleid">
					<?php echo acymailing_gridSort(acymailing_translation('ACY_ID'), 'a.tempid', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
				</th>
			</tr>
			</thead>
			<tfoot>
			<tr>
				<td colspan="7">
					<?php echo $this->pagination->getListFooter();
					echo $this->pagination->getResultsCounter(); ?>
				</td>
			</tr>
			</tfoot>
			<tbody id="acymailing_sortable_listing">
			<?php
			$k = 0;
			$ordering = '';

			for($i = 0, $a = count($this->rows); $i < $a; $i++){
				$row =& $this->rows[$i];
				$ordering .= ',"order['.$i.']='.$row->ordering.'"';

				$publishedid = 'published_'.$row->tempid;
				$premiumid = 'premium_'.$row->tempid;
				?>
				<tr class="<?php echo "row$k"; ?>" acyorderid="<?php echo $row->tempid; ?>">
					<td align="center" style="text-align:center;">
						<?php echo $this->pagination->getRowOffset($i); ?>
					</td>
					<?php $iconClass = 'acyicon-draghandle';
					if(!$saveOrder) $iconClass .= ' acyinactive-handler" title="Sort the listing by ordering first'; ?>
					<td class="<?php echo $iconClass; ?>"><img alt="" src="<?php echo ACYMAILING_IMAGES; ?>icons/drag.png" /></td>
					<td align="center" style="text-align:center;">
						<?php echo acymailing_gridID($i, $row->tempid); ?>
					</td>
					<td>
						<?php if(!empty($row->thumb)){ ?>
							<a href="<?php echo acymailing_completeLink('template&task=edit&tempid='.$row->tempid); ?>">
								<img class="template_thumbnail" src="<?php echo rtrim(acymailing_rootURI(), '/').'/'.strip_tags($row->thumb) ?>" style="float:left;width:100px;margin-right:10px;"/>
							</a>
						<?php } ?>
						<a href="<?php echo acymailing_completeLink('template&task=edit&tempid='.$row->tempid); ?>"><?php echo acymailing_dispSearch($row->name, $this->pageInfo->search); ?></a><br/>
						<?php echo acymailing_absoluteURL(nl2br($row->description)); ?>
					</td>
					<td align="center" style="text-align:center;">
						<span id="<?php echo $premiumid ?>"><?php echo $this->toggleClass->toggle($premiumid, $row->premium, 'template') ?></span>
					</td>
					<td align="center" style="text-align:center;">
						<span id="<?php echo $publishedid ?>"><?php echo $this->toggleClass->toggle($publishedid, $row->published, 'template') ?></span>
					</td>
					<td width="1%" align="center" style="text-align:center;">
						<?php echo acymailing_dispSearch($row->tempid, $this->pageInfo->search); ?>
					</td>
				</tr>
				<?php
				$k = 1 - $k;
			}
			?>
			</tbody>
		</table>

		<?php acymailing_formOptions($this->pageInfo->filter->order); ?>
	</form>
</div>

<?php if($saveOrder) acymailing_sortablelist('template', ltrim($ordering, ',')); ?>
components/com_acymailing/views/template/tmpl/theme.php000060400000012362152453623450017454 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><style type="text/css">
	div.templatedescription{
		color: #819197;
		text-align: center;
	}

	div.templatedescription img{
		display: block;
		clear: both;
		margin: auto;
		margin-bottom: 10px;
		border: 1px solid #EEEEEE;
		padding: 5px;
		background-color: #fff;
		max-height: 200px;
		max-width: 190px;
	}

	div.templatearea{
		border: 1px solid #e5e5e5;
		background-color: #fff;
		margin: 9px 7px;
		padding: 2px;
		width: 205px;
		position: relative;
		display: inline-block;
		vertical-align: top;
		background: #fff;
		text-align: center;
		cursor: pointer;
		min-height: 260px;
	}

	div.templatearea:after, div.templatearea:before{
		content: " ";
		position: absolute;
		width: 50%;
		height: 100px;
		z-index: -10;
	}

	div.templatearea:before{
		bottom: 7px;
		left: 5px;
		transform: rotate(-3deg);
		box-shadow: 7px 6px 8px #333;
	}

	div.templatearea:after{
		bottom: 7px;
		right: 5px;
		transform: rotate(3deg);
		box-shadow: -7px 6px 8px #333;
	}

	div.templatearea:hover{
		background-color: #e9ecf3;
	}

	div.templatetitle{
		color: #4a7cac;
		text-align: center;
		font-family: cursive;
		font-style: normal;
		margin-bottom: 10px;
		text-shadow: 0 1px 0 #FFFFFF;
		font-size: 14px;
	}

	body{
		background-color: #f6f7f9 !important;
		min-width: 650px !important;
		height: auto;
	}

	html{
		overflow-y: auto;
	}

	.rt-container, .rt-block{
		width: auto !important;
		background-color: #f6f7f9 !important;
	}

	#adminForm{
		text-align: center;
	}

	ul{
		list-style-type: none;
	}

	ul li{
		display: inline-block;
	}

</style>
<form action="<?php echo acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'template', true); ?>" method="post" name="adminForm" id="adminForm">
	<?php if($this->pageInfo->elements->total > $this->pageInfo->elements->page || !empty($this->pageInfo->search) || !empty($this->pageInfo->category)){ ?>
		<table class="acymailing_table_options" cellpadding="1" style="width:100%;">
			<tr>
				<td>
					<?php acymailing_listingsearch($this->pageInfo->search); ?>
				</td>
				<td>
					<?php
					if(acymailing_level(3)){
						$listcategoryType = acymailing_get('type.categoryfield');
						echo $listcategoryType->getFilter('template', 'category', $this->pageInfo->category, ' onchange="document.adminForm.limitstart.value=0;this.form.submit();" style="width:150px;"');
					}
					?>
				</td>
			</tr>
		</table>
	<?php } ?>
	<?php $num = 0;
	if(empty($this->pageInfo->limit->start)){
		$num++;
		?>
		<div class="templatearea emptytemplate" onclick="applyTemplate(0);">
			<div class="templatetitle"><?php echo acymailing_translation('ACY_NONE'); ?></div>
			<div style="display:none" id="stylesheet_0"></div>
			<div style="display:none" id="htmlcontent_0"><br/></div>
			<div style="display:none" id="textcontent_0"></div>
			<div style="display:none" id="subject_0"></div>
			<div style="display:none" id="replyname_0"></div>
			<div style="display:none" id="replyemail_0"></div>
			<div style="display:none" id="fromname_0"></div>
			<div style="display:none" id="fromemail_0"></div>
		</div>
	<?php
	}
	for($i = 0, $a = count($this->rows); $i < $a; $i++){
		$row =& $this->rows[$i];
		$row->subject = acyEmoji::Decode($row->subject);
		$num++;
		?>
		<div class="templatearea" onclick="applyTemplate(<?php echo $row->tempid?>);">
			<div class="templatetitle"><?php echo acymailing_dispSearch($row->name, $this->pageInfo->search); ?></div>
			<div class="templatedescription">
				<?php if(!empty($row->thumb)){ ?>
					<img src="<?php echo ACYMAILING_LIVE.$row->thumb ?>"/>
				<?php } ?>
				<?php echo acymailing_absoluteURL(nl2br($row->description)); ?>
			</div>
			<div style="display:none" id="stylesheet_<?php echo $row->tempid;?>"><?php echo $row->stylesheet;?></div>
			<div style="display:none" id="htmlcontent_<?php echo $row->tempid;?>"><?php echo acymailing_absoluteURL($row->body);?></div>
			<div style="display:none" id="textcontent_<?php echo $row->tempid;?>"><?php echo $row->altbody;?></div>
			<div style="display:none" id="subject_<?php echo $row->tempid;?>"><?php echo $row->subject;?></div>
			<div style="display:none" id="replyname_<?php echo $row->tempid;?>"><?php echo $row->replyname;?></div>
			<div style="display:none" id="replyemail_<?php echo $row->tempid;?>"><?php echo $row->replyemail;?></div>
			<div style="display:none" id="fromname_<?php echo $row->tempid;?>"><?php echo $row->fromname;?></div>
			<div style="display:none" id="fromemail_<?php echo $row->tempid;?>"><?php echo $row->fromemail;?></div>
		</div>
	<?php } ?>
	<?php if($this->pageInfo->elements->total > $this->pageInfo->elements->page || !empty($this->pageInfo->search) || !empty($this->pageInfo->category)){ ?>
		<table style="width:100%;margin-top:20px;">
			<tfoot>
			<tr>
				<td style="text-align:center;" colspan="2">
					<?php echo $this->pagination->getListFooter();
					echo $this->pagination->getResultsCounter(); ?>
				</td>
			</tr>
			</tfoot>
		</table>
	<?php } ?>
	<input type="hidden" name="defaulttask" value="theme"/>
	<?php acymailing_formOptions($this->pageInfo->filter->order); ?>
</form>

components/com_acymailing/views/template/tmpl/upload.php000060400000002043152453623450017631 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<form action="<?php echo acymailing_completeLink('template', true); ?>" method="post" name="adminForm" id="adminForm" autocomplete="off" enctype="multipart/form-data">
		<div id="iframedoc"></div>
		<div style="text-align:center;padding-top:20px;"><input type="file" style="width:auto" name="uploadedfile"/>
			<?php echo '<br />'.(acymailing_translation_sprintf('MAX_UPLOAD', (acymailing_bytes(ini_get('upload_max_filesize')) > acymailing_bytes(ini_get('post_max_size'))) ? ini_get('post_max_size') : ini_get('upload_max_filesize'))); ?></div>
		<br/><br/><a class="downloadmore" href="https://www.acyba.com/acymailing/templates-pack.html" target="_blank"><?php echo acymailing_translation('MORE_TEMPLATES'); ?></a>
		<?php acymailing_formOptions(); ?>
	</form>
</div>
components/com_acymailing/views/template/tmpl/form.php000060400000030654152453623450017321 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<div id="iframedoc"></div>
	<form action="<?php echo acymailing_completeLink('template'); ?>" method="post" name="adminForm" id="adminForm" class="templateManagement" enctype="multipart/form-data">
		<div class="acyblockoptions" id="sendtest" style="float:none;<?php if(acymailing_getVar('cmd', 'task') != 'test') echo 'display:none;'; ?>">
			<span class="acyblocktitle"><?php echo acymailing_translation('SEND_TEST'); ?></span>
			<table>
				<tr>
					<td valign="top">
						<?php echo acymailing_translation('SEND_TEST_TO'); ?>
					</td>
					<td>
						<?php echo $this->testreceiverType->display($this->infos->test_selection, $this->infos->test_group, $this->infos->test_emails); ?>
					</td>
				</tr>
				<tr>
					<td/>
					<td>
						<button type="submit" class="acymailing_button" onclick="var val = document.getElementById('message_receivers').value; if(val != ''){ setUser(val); } acymailing.submitbutton('test');return false;"><?php echo acymailing_translation('SEND_TEST') ?></button>
					</td>
				</tr>
			</table>
		</div>

		<div class="acyblockoptions">
			<span class="acyblocktitle"><?php echo acymailing_translation('ACY_TEMPLATE_INFORMATIONS'); ?></span>
			<table>
				<tr>
					<td>
						<label for="name">
							<?php echo acymailing_translation('TEMPLATE_NAME'); ?>
						</label>
					</td>
					<td>
						<input type="text" name="data[template][name]" id="name" class="inputbox" style="width:200px" value="<?php echo $this->escape(@$this->template->name); ?>"/>
					</td>
				</tr>
				<tr>
					<td>
						<label for="published">
							<?php echo acymailing_translation('ACY_PUBLISHED'); ?>
						</label>
					</td>
					<td>
						<?php echo acymailing_boolean("data[template][published]", '', @$this->template->published); ?>
					</td>
				</tr>
				<tr>
					<td>
						<label for="default">
							<?php echo acymailing_translation('ACY_DEFAULT'); ?>
						</label>
					</td>
					<td>
						<?php echo acymailing_boolean("data[template][premium]", '', @$this->template->premium); ?>
					</td>
				</tr>
				<?php if(acymailing_level(3)){ ?>
					<tr>
						<td>
							<label for="datatemplatecategory">
								<?php echo acymailing_translation('ACY_CATEGORY'); ?>
							</label>
						</td>
						<td>
							<?php $catType = acymailing_get('type.categoryfield');
							echo $catType->display('template', 'data[template][category]', $this->template->category); ?>
						</td>
					</tr>
				<?php } ?>
				<tr>
					<td>
						<label for="thumb">
							<?php echo acymailing_translation('ACY_THUMBNAIL'); ?>
						</label>
					</td>
					<td>
						<?php
						$uploadfileType = acymailing_get('type.uploadfile');
						echo $uploadfileType->display(true, 'thumb', $this->template->thumb, 'data[template][thumb]');
						?>
					</td>
				</tr>
				<tr>
					<td valign="top">
						<label for="description">
							<?php echo acymailing_translation('ACY_DESCRIPTION'); ?>
						</label>
					</td>
					<td>
						<textarea id="description" name="editor_description" style="width:90%;height:80px;"><?php echo @$this->template->description; ?></textarea>
					</td>
				</tr>
				<tr>
					<td>
						<label for="subject">
							<?php echo acymailing_translation('JOOMEXT_SUBJECT'); ?>
						</label>
					</td>
					<td>
						<div>
							<input onClick="zoneToTag='subject';" type="text" id="subject" name="data[template][subject]" class="inputbox" style="width:80%" value="<?php echo $this->escape(@$this->template->subject); ?>"/>
						</div>
					</td>
				</tr>
				<tr>
					<td class="paramlist_key">
						<label for="fromname"><?php echo acymailing_translation('FROM_NAME'); ?></label>
					</td>
					<td class="paramlist_value">
						<input class="inputbox" id="fromname" type="text" name="data[template][fromname]" style="width:200px" value="<?php echo $this->escape(@$this->template->fromname); ?>"/>
					</td>
				</tr>
				<tr>
					<td class="paramlist_key">
						<label for="fromemail"><?php echo acymailing_translation('FROM_ADDRESS'); ?></label>
					</td>
					<td class="paramlist_value">
						<input onchange="validateEmail(this.value, '<?php echo addslashes(acymailing_translation('FROM_ADDRESS')); ?>')" class="inputbox" id="fromemail" type="text" name="data[template][fromemail]" style="width:200px" value="<?php echo $this->escape(@$this->template->fromemail); ?>"/>
					</td>
				</tr>
				<tr>
					<td class="paramlist_key">
						<label for="replyname"><?php echo acymailing_translation('REPLYTO_NAME'); ?></label>
					</td>
					<td class="paramlist_value">
						<input class="inputbox" id="replyname" type="text" name="data[template][replyname]" style="width:200px" value="<?php echo $this->escape(@$this->template->replyname); ?>"/>
					</td>
				</tr>
				<tr>
					<td class="paramlist_key">
						<label for="replyemail"><?php echo acymailing_translation('REPLYTO_ADDRESS'); ?></label>
					</td>
					<td class="paramlist_value">
						<input onchange="validateEmail(this.value, '<?php echo addslashes(acymailing_translation('REPLYTO_ADDRESS')); ?>')" class="inputbox" id="replyemail" type="text" name="data[template][replyemail]" style="width:200px" value="<?php echo $this->escape(@$this->template->replyemail); ?>"/>
					</td>
				</tr>
			</table>
		</div>
		<?php echo acymailing_getFunctionsEmailCheck(); ?>

		<div class="acyblockoptions">
			<span class="acyblocktitle"><?php echo acymailing_translation('ACY_STYLES'); ?></span>
			<?php
			echo $this->tabs->startPane('template_css');
			echo $this->tabs->startPanel(acymailing_translation('STYLE_IND'), 'template_css_classes'); ?>
			<br style="font-size:1px"/>

			<table width="100%">
				<tbody id="classtable">
				<tr>
					<td>
						<label for="bgcolor">
							<?php echo acymailing_translation('BACKGROUND_COLOUR'); ?>
						</label>
					</td>
					<td>
						<?php echo $this->colorBox->displayAll('', 'styles[color_bg]', @$this->template->styles['color_bg']); ?>
					</td>
				</tr>
				<?php $tagList = array('tag_h1' => 'Title h1', 'tag_h2' => 'Title h2', 'tag_h3' => 'Title h3', 'tag_h4' => 'Title h4', 'tag_h5' => 'Title h5', 'tag_h6' => 'Title h6', 'tag_a' => acymailing_translation('ACY_LINK_STYLE'), 'acymailing_unsub' => acymailing_translation('STYLE_UNSUB'), 'acymailing_content' => acymailing_translation('CONTENT_AREA'), 'acymailing_title' => acymailing_translation('CONTENT_HEADER'), 'acymailing_readmore' => acymailing_translation('CONTENT_READMORE'), 'acymailing_online' => acymailing_translation('STYLE_VIEW'));
				foreach($tagList as $value => $text){ ?>
					<tr>
						<td><span id="name_<?php echo $value; ?>" style="<?php echo str_replace('!important', '', $this->escape(@$this->template->styles[$value])); ?>"><?php echo $text; ?></span></td>
						<td><input id="style_<?php echo $value; ?>" type="text" style="width:200px" onclick="showthediv('<?php echo $value; ?>',event);" name="styles[<?php echo $value; ?>]" value="<?php echo $this->escape(@$this->template->styles[$value]); ?>"/></td>
					</tr>
					<?php
					if($value == 'acymailing_readmore'){
						?>
						<tr>
							<td><?php echo acymailing_translation('READMORE_PICTURE'); ?></span></td>
							<td>
								<?php echo $uploadfileType->display(true, 'readmore', $this->template->readmore, 'data[template][readmore]'); ?>
							</td>
						</tr>
					<?php
					}
				}
				?>
				<tr>
					<td>
						<ul id="name_tag_ul" style="<?php echo $this->escape(@$this->template->styles['tag_ul']); ?>">
							<li id="name_tag_li2" style="<?php echo $this->escape(@$this->template->styles['tag_li']); ?>">ul</li>
							<li id="name_tag_li" style="<?php echo $this->escape(@$this->template->styles['tag_li']); ?>">li</li>
						</ul>
					</td>
					<td><input type="text" id="style_tag_ul" onclick="showthediv('tag_ul',event);" style="width:200px" name="styles[tag_ul]" value="<?php echo $this->escape(@$this->template->styles['tag_ul']); ?>"/>
						<br/><input type="text" id="style_tag_li" onclick="showthediv('tag_li',event);" style="width:200px" name="styles[tag_li]" value="<?php echo $this->escape(@$this->template->styles['tag_li']); ?>"/></td>
				</tr>
				<?php
				unset($this->template->styles['color_bg']);
				unset($this->template->styles['tag_ul']);
				unset($this->template->styles['tag_li']);
				if(!empty($this->template->styles)){
					foreach($this->template->styles as $className => $style){
						if(isset($tagList[$className])) continue;
						?>
						<tr>
							<td><span id="name_<?php echo $className ?>" style="<?php echo $this->escape($style); ?>"><?php echo $className ?></span></td>
							<td><input id="style_<?php echo $className ?>" type="text" style="width:200px" onclick="showthediv('<?php echo $className; ?>',event);" name="styles[<?php echo $className; ?>]" value="<?php echo $this->escape($style); ?>"/></td>
						</tr>
					<?php
					} ?>

				<?php }
				?>
				</tbody>
			</table>

			<a onclick="addStyle();return false;" href="#"><?php echo acymailing_translation('ADD_STYLE'); ?></a>
			<?php echo $this->tabs->startPanel(acymailing_translation('TEMPLATE_STYLESHEET'), 'template_css_stylesheet'); ?>
			<br style="font-size:1px"/>
			<?php
			$messages = array();
			if(version_compare(PHP_VERSION, '5.0.0', '<')) $messages[] = 'Please make sure you use at least PHP 5.0.0';
			if(!class_exists('DOMDocument')){
				$messages[] = 'DOMDocument class not found';
			}else{
				$xmldoc = @ new DOMDocument;
				if(!is_object($xmldoc) || !method_exists($xmldoc, 'loadHTML')){
					$messages[] = 'Please make sure that php_domxml.dll on windows is removed before using the domdocument class as they cannot coexist.';
				}
			}
			if(!function_exists('mb_convert_encoding')) $messages[] = 'The php extension mbstring is not installed';
			if(!empty($messages)){
				$messages[] = 'The stylesheet can not be used';
				acymailing_display($messages, 'warning');
			}else{ ?>
				<textarea onmouseover="document.getElementById('wysija').style.display = 'none'" name="data[template][stylesheet]" style="width:98%; min-width: 300px; min-height: 300px;" rows="25" id="acystylesheettextarea"><?php echo @$this->template->stylesheet; ?></textarea>
			<?php }
			echo $this->tabs->endPanel();
			echo $this->tabs->startPanel(acymailing_translation('ACY_HEADER'), 'template_css_header'); ?>
			<textarea name="data[template][header]" id="headertags" cols="10" rows="24" style="width: 98%; margin-top: 30px; font-size: 15px;"><?php echo $this->template->header ?></textarea>
			<?php
			echo $this->tabs->endPanel();
			echo $this->tabs->endPane(); ?>
		</div>
		<?php if(acymailing_level(3)){
			$acltype = acymailing_get('type.acl'); ?>
			<div class="acyblockoptions">
				<span class="acyblocktitle"><?php echo acymailing_translation('ACCESS_LEVEL'); ?></span>
				<?php echo $acltype->display('data[template][access]', $this->template->access); ?>
			</div>
		<?php } ?>
		<div class="acyblockoptions" style="width:90%" id="htmlfieldset">
			<span class="acyblocktitle"><?php echo acymailing_translation('HTML_VERSION'); ?></span>
			<?php echo $this->editor->display(); ?>
		</div>
		<div class="acyblockoptions" style="width:90%;" id="textfieldset">
			<span class="acyblocktitle"><?php echo acymailing_translation('TEXT_VERSION'); ?></span>
			<textarea onClick="zoneToTag='altbody';" style="width:98%;min-height:250px;" rows="20" name="data[template][altbody]" id="altbody" placeholder="<?php echo acymailing_translation('AUTO_GENERATED_HTML'); ?>"><?php echo @$this->template->altbody; ?></textarea>
		</div>
		<div class="clr"></div>
		<input type="hidden" name="cid[]" value="<?php echo @$this->template->tempid; ?>"/>
		<?php acymailing_formOptions(); ?>
	</form>
	<div style="display:none;position:absolute;background-color:transparent;" id="wysija">
		<?php echo $this->colorBox->displayOne('wysijacolor', "", ""); ?>
		<select style="width:75px;height:17px;margin:0px;font-size:11px;" class="chzn-done" id="style_select_wysija" onchange="getValueSelect()">
			<?php $nbs = array('8', '10', '11', '12', '14', '16', '18', '20', '22', '24', '26', '36');
			echo "<option value=''>Font Size</option>";
			foreach($nbs as $nb){
				echo "<option value='".$nb."px'>$nb px.</option>";
			} ?>
		</select>

		<span id="B" onclick="spanChange('B')" class="belement"></span><span id="I" class="ielement" onclick="spanChange('I')"></span><span class="uelement" id="U" onclick="spanChange('U')"></span>
	</div>
</div>
components/com_acymailing/views/template/view.html.php000060400000047476152453623450017331 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php


class TemplateViewTemplate extends acymailingView{

	var $selection = array('a.tempid', 'a.name', 'a.description', 'a.created', 'a.published', 'a.premium', 'a.ordering', 'a.thumb');
	var $filters = array();
	var $button = true;
	var $chosen = false;

	function display($tpl = null){

		$function = $this->getLayout();
		if(method_exists($this, $function)) $this->$function();

		parent::display($tpl);
	}

	function listing(){
		$pageInfo = new stdClass();
		$pageInfo->filter = new stdClass();
		$pageInfo->filter->order = new stdClass();
		$pageInfo->limit = new stdClass();
		$pageInfo->elements = new stdClass();
		$config = acymailing_config();

		$paramBase = ACYMAILING_COMPONENT.'.'.$this->getName().$this->getLayout();
		$pageInfo->filter->order->value = acymailing_getUserVar($paramBase.".filter_order", 'filter_order', 'a.ordering', 'cmd');
		$pageInfo->filter->order->dir = acymailing_getUserVar($paramBase.".filter_order_Dir", 'filter_order_Dir', 'asc', 'word');
		if(strtolower($pageInfo->filter->order->dir) !== 'desc') $pageInfo->filter->order->dir = 'asc';
		$pageInfo->search = acymailing_getUserVar($paramBase.".search", 'search', '', 'string');
		$pageInfo->search = strtolower(trim($pageInfo->search));
		$pageInfo->category = acymailing_getUserVar($paramBase.".category", 'category', '0', 'string');

		$pageInfo->limit->value = acymailing_getUserVar($paramBase.'.list_limit', 'limit', acymailing_getCMSConfig('list_limit'), 'int');
		$pageInfo->limit->start = acymailing_getUserVar($paramBase.'.limitstart', 'limitstart', 0, 'int');

		if(!empty($pageInfo->search)){
			$searchVal = '\'%'.acymailing_getEscaped($pageInfo->search, true).'%\'';
			$this->filters[] = "a.name LIKE $searchVal OR a.description LIKE $searchVal OR a.tempid LIKE $searchVal";
		}

		if(!empty($pageInfo->category) && $pageInfo->category != acymailing_translation('ACY_ALL_CATEGORIES')){
			$this->filters[] = 'a.category LIKE '.acymailing_escapeDB($pageInfo->category);
		}

		$query = 'SELECT '.implode(',', $this->selection).' FROM '.acymailing_table('template').' as a';
		if(!empty($this->filters)){
			$query .= ' WHERE ('.implode(') AND (', $this->filters).')';
		}
		if(!empty($pageInfo->filter->order->value)){
			$query .= ' ORDER BY '.$pageInfo->filter->order->value.' '.$pageInfo->filter->order->dir;
		}

		try{
			$this->rows = acymailing_loadObjectList($query, '', $pageInfo->limit->start, $pageInfo->limit->value);
		}catch(Exception $e){
			$this->rows = null;
		}

		if($this->rows === null){
			acymailing_display(isset($e) ? $e->getMessage() : substr(strip_tags(acymailing_getDBError()), 0, 200).'...', 'error');
			if(file_exists(ACYMAILING_BACK.'install.joomla.php')){
				include_once(ACYMAILING_BACK.'install.joomla.php');
				$installClass = new acymailingInstall();
				$installClass->fromVersion = '4.1.0';
				$installClass->update = true;
				$installClass->updateSQL();
			}
		}

		$queryCount = 'SELECT COUNT(a.tempid) FROM '.acymailing_table('template').' as a';
		if(!empty($this->filters)){
			$queryCount .= ' WHERE ('.implode(') AND (', $this->filters).')';
		}
		
		$pageInfo->elements->total = acymailing_loadResult($queryCount);
		$pageInfo->elements->page = count($this->rows);

		$pagination = new acyPagination($pageInfo->elements->total, $pageInfo->limit->start, $pageInfo->limit->value);

		if($this->button){
			$acyToolbar = acymailing_get('helper.toolbar');
			$acyToolbar->popup('import', acymailing_translation('IMPORT'), acymailing_completeLink("template&task=upload", true), 450, 250);

			$acyToolbar->custom('export', acymailing_translation('ACY_EXPORT'), 'export', true);
			$acyToolbar->divider();
			$acyToolbar->add();
			$acyToolbar->edit();
			if(acymailing_isAllowed($config->get('acl_templates_copy', 'all'))){
				$acyToolbar->copy();
			}
			if(acymailing_isAllowed($config->get('acl_templates_delete', 'all'))) $acyToolbar->delete();

			$acyToolbar->divider();
			$acyToolbar->help('template', 'listing');
			$acyToolbar->setTitle(acymailing_translation('ACY_TEMPLATES'), 'template');
			$acyToolbar->display();
		}


		$toggleClass = acymailing_get('helper.toggle');

		$order = new stdClass();
		$order->ordering = false;
		$order->orderUp = 'orderup';
		$order->orderDown = 'orderdown';
		$order->reverse = false;
		if($pageInfo->filter->order->value == 'a.ordering'){
			$order->ordering = true;
			if($pageInfo->filter->order->dir == 'desc'){
				$order->orderUp = 'orderdown';
				$order->orderDown = 'orderup';
				$order->reverse = true;
			}
		}

		$filters = new stdClass();


		$this->filters = $filters;
		$this->order = $order;
		$this->toggleClass = $toggleClass;
		$this->rows = $this->rows;
		$this->pageInfo = $pageInfo;
		$this->pagination = $pagination;
	}

	function form(){
		$tempid = acymailing_getCID('tempid');
		$config = acymailing_config();

		if(!empty($tempid)){
			$templateClass = acymailing_get('class.template');
			$template = $templateClass->get($tempid);
			if(!empty($template->body)) $template->body = acymailing_absoluteURL($template->body);

			if(empty($template->tempid)){
				acymailing_display('Template '.$tempid.' not found', 'error');
				$tempid = 0;
			}
		}

		if(empty($tempid)){
			$template = new stdClass();
			$template->body = '';
			$template->tempid = 0;
			$template->published = 1;
			$template->access = 'all';
			$template->category = '';
			$template->thumb = '';
			$template->readmore = '';
			$template->header = '';
		}

		$editor = acymailing_get('helper.editor');
		$editor->setTemplate($template->tempid);
		$editor->name = 'editor_body';
		$editor->content = $template->body;
		$editor->prepareDisplay();

		$script = '
			document.addEventListener("DOMContentLoaded", function(){
				acymailing.submitbutton = function(pressbutton) {
					if (pressbutton == \'cancel\') {
						acymailing.submitform(pressbutton,document.adminForm);
						return;
					}
					
					if(pressbutton == \'save\' || pressbutton == \'test\' || pressbutton == \'apply\'){
						var emailVars = ["fromemail","replyemail"];
						var val = "";
						for(var key in emailVars){
							if(isNaN(key)) continue;
							val = document.getElementById(emailVars[key]).value;
							if(!validateEmail(val, emailVars[key])){
								return;
							}
						}
					}';
		$script .= 'if(window.document.getElementById("name").value.length < 2){alert(\''.acymailing_translation('ENTER_TITLE', true).'\'); return false;}';
		$script .= "if(pressbutton == 'test' && window.document.getElementById('sendtest') && window.document.getElementById('sendtest').style.display == 'none'){ window.document.getElementById('sendtest').style.display = 'block'; return false;}";
		$script .= $editor->jsCode();
		$script .= 'acymailing.submitform(pressbutton,document.adminForm);
				};
			 }); ';

		$script .= "var zoneToTag = 'editor';
			function insertTag(tag){
				if(zoneToTag == 'editor'){
					try{
						jInsertEditorText(tag,'editor_body');
						return true;
					} catch(err){
						alert('Your editor does not enable AcyMailing to automatically insert the tag, please copy/paste it manually in your Newsletter');
						return false;
					}
				}else{
					try{
						simpleInsert(zoneToTag, tag);
						return true;
					} catch(err){
						alert('Error inserting the tag in the '+ zoneToTag + 'zone. Please copy/paste it manually in your Newsletter.');
						return false;
					}
				}
			}
			function simpleInsert(myField, myValue) {
				myField = document.getElementById(myField);
				if (document.selection) {
					myField.focus();
					sel = document.selection.createRange();
					sel.text = myValue;
				} else if (myField.selectionStart || myField.selectionStart == '0') {
					var startPos = myField.selectionStart;
					var endPos = myField.selectionEnd;
					myField.value = myField.value.substring(0, startPos)
						+ myValue
						+ myField.value.substring(endPos, myField.value.length);
				} else if (myField.tagName == 'DIV') {
					myField.innerHTML += myValue;
					document.getElementById('subject').value += myValue;
				} else {
					myField.value += myValue;
				}
			}
			document.addEventListener('DOMContentLoaded', function(){
				setTimeout(function() {
					document.getElementById('htmlfieldset').addEventListener('click', function(){
						zoneToTag = 'editor';
					});	
					
					var ediframe = document.getElementById('htmlfieldset').getElementsByTagName('iframe');
					if(ediframe && ediframe[0]){
						var children = ediframe[0].contentDocument.getElementsByTagName('*');
						for (var i = 0; i < children.length; i++) {
							children[i].addEventListener('click', function(){
								zoneToTag = 'editor';
							});			
						}
					}		
				}, 1000);
			});";

		$script .= 'function addStyle(){
			var myTable=window.document.getElementById("classtable");
			var newline = document.createElement(\'tr\');
			var column = document.createElement(\'td\');
			var column2 = document.createElement(\'td\');
			var input = document.createElement(\'input\');
			var input2 = document.createElement(\'input\');
			input.type = \'text\';
			input2.type = \'text\';
			input.style.width = \'180px\';
			input2.style.width = \'200px\';
			input.name = \'otherstyles[classname][]\';
			input2.name = \'otherstyles[style][]\';
			input.placeholder = "'.str_replace('"', '\"', acymailing_translation('CLASS_NAME', true)).'";
			input2.placeholder = "'.str_replace('"', '\"', acymailing_translation('CSS_STYLE', true)).'";
			column.appendChild(input);
			column2.appendChild(input2);
			newline.appendChild(column);
			newline.appendChild(column2);
			myTable.appendChild(newline);
		}';

		$script .= 'var currentValueId = \'\';
				function showthediv(valueid, e){
					if(currentValueId != valueid){
						try{
							document.getElementById(\'wysija\').style.left = jQuery(e.target).position().left-50+"px";
							document.getElementById(\'wysija\').style.top = jQuery(e.target).position().top-40+"px";
						}catch(err){
							document.getElementById(\'wysija\').style.left = e.x-50+"px";
							document.getElementById(\'wysija\').style.top = e.y-40+"px";
						}
						currentValueId = valueid;
					}
					document.getElementById(\'wysija\').style.display = \'block\';
					initDiv();
				}

				function spanChange(span){
					input = currentValueId;
					if (document.getElementById(span).className == span.toLowerCase()+"elementselected"){
						document.getElementById(span).className = span.toLowerCase()+"element";
						if(span == "B"){
							document.getElementById("name_"+currentValueId).style.fontWeight = "";
							document.getElementById("style_"+currentValueId).value = document.getElementById("style_"+currentValueId).value.replace(/font-weight *: *bold(;)?/i, "");
						}
						if(span == "I"){
							document.getElementById("name_"+currentValueId).style.fontStyle = "";
							document.getElementById("style_"+currentValueId).value = document.getElementById("style_"+currentValueId).value.replace(/font-style *: *italic(;)?/i, "");
						}
						if(span == "U"){
							document.getElementById("name_"+currentValueId).style.textDecoration="";
							document.getElementById("style_"+currentValueId).value = document.getElementById("style_"+currentValueId).value.replace(/text-decoration *: *underline(;)?/i,"");
						}

					}else{
						 document.getElementById(span).className = span.toLowerCase()+"elementselected";
						if(span == "B"){
							document.getElementById("name_"+currentValueId).style.fontWeight = "bold";
							document.getElementById("style_"+currentValueId).value = document.getElementById("style_"+currentValueId).value + "font-weight:bold;";
						}
						if(span == "I"){
							document.getElementById("name_"+currentValueId).style.fontStyle = "italic";
							document.getElementById("style_"+currentValueId).value = document.getElementById("style_"+currentValueId).value + "font-style:italic;";
						}
						if(span == "U"){
							document.getElementById("name_"+currentValueId).style.textDecoration="underline";
							document.getElementById("style_"+currentValueId).value = document.getElementById("style_"+currentValueId).value + "text-decoration:underline;";
						}
					}
				}
				function getValueSelect(){
					selec = currentValueId;
					var myRegex2 = new RegExp(/font-size *:[^;]*;/i);
					var MyValue = document.getElementById("style_select_wysija").value;
					document.getElementById("name_"+currentValueId).style.fontSize = MyValue;
					if(document.getElementById("style_"+currentValueId).value.search(myRegex2) != -1){
						if(MyValue == ""){
							document.getElementById("style_"+currentValueId).value = document.getElementById("style_"+currentValueId).value.replace(myRegex2, "");
						}else{
							document.getElementById("style_"+currentValueId).value = document.getElementById("style_"+currentValueId).value.replace(myRegex2, "font-size:"+MyValue+";");
						}
					}else{
						document.getElementById("style_"+currentValueId).value = document.getElementById("style_"+currentValueId).value + "font-size:"+MyValue+";";
					}
				}

				function initDiv(){

					var RegexSize = new RegExp(/font-size *:[^;]*(;)?/gi);
					var RegexColor = new RegExp(/([^a-z-])color *:[^;]*(;)?/gi);


					document.getElementById("colorexamplewysijacolor").style.backgroundColor = "#000000";
					document.getElementById("colordivwysijacolor").style.display = "none";
					spaced = document.getElementById("style_"+currentValueId).value.substr(0,1);
					if(spaced != " "){
						stringToQuery = \' \' + document.getElementById("style_"+currentValueId).value;
					}else{
						stringToQuery = document.getElementById("style_"+currentValueId).value;
					}
					NewColor = stringToQuery.match(RegexColor);
					if(NewColor != null){
						NewColor = NewColor[0].match(/:[^;!]*/gi);
						NewColor = NewColor[0].replace(/(:| )/gi,"");
						document.getElementById("colorexamplewysijacolor").style.backgroundColor = NewColor;
					}


					document.getElementById("U").className = "uelement";
					document.getElementById("I").className = "ielement";
					document.getElementById("B").className = "belement";

					if(document.getElementById("style_"+currentValueId).value.search(/font-weight: *bold(;)?/i) != -1){
						document.getElementById("B").className += "selected";
					}
					if(document.getElementById("style_"+currentValueId).value.search(/font-style: *italic(;)?/i) != -1){
						document.getElementById("I").className += "selected";
					}
					if(document.getElementById("style_"+currentValueId).value.search(/text-decoration: *underline(;)?/i) != -1){
						document.getElementById("U").className += "selected";
					}


					NewSize = stringToQuery.match(RegexSize);
					document.getElementById("style_select_wysija").options[0].selected = true;
					if(NewSize != null){
						NewSize = NewSize[0].match(/:[^;]*/gi);
						NewSize = NewSize[0].replace(" ","");
						NewSize = NewSize.substr(1);
						for(var i = 0; i < document.getElementById("style_select_wysija").length; i++){
							if(document.getElementById("style_select_wysija").options[i].value == NewSize){
								document.getElementById("style_select_wysija").options[i].selected = true;
							}
						}
					}
				}';

		acymailing_addScript(true, $script);

		$installedPlugin = acymailing_getPlugin('acymailing', 'emojis');
		if(!empty($installedPlugin)){
			$params = new acyParameter($installedPlugin->params);
			if(acymailing_isPluginEnabled('acymailing', 'emojis') && $params->get('subject', 1) == 1) {
				if(!ACYMAILING_J30){
					acymailing_addScript(false, ACYMAILING_JS.'jquery/jquery-1.9.1.min.js?v='.filemtime(ACYMAILING_ROOT.'media'.DS.'com_acymailing'.DS.'js'.DS.'jquery'.DS.'jquery-1.9.1.min.js'));
					acymailing_addScript(false, ACYMAILING_JS.'jquery/jquery-ui.min.js?v='.filemtime(ACYMAILING_ROOT.'media'.DS.'com_acymailing'.DS.'js'.DS.'jquery'.DS.'jquery-ui.min.js'));
				}
				acymailing_addScript(false, acymailing_rootURI().'plugins/editors/acyeditor/acyeditor/ckeditor/plugins/smiley/emojionearea.js?v='.filemtime(ACYMAILING_ROOT.'plugins'.DS.'editors'.DS.'acyeditor'.DS.'acyeditor'.DS.'ckeditor'.DS.'plugins'.DS.'smiley'.DS.'emojionearea.js'));
				acymailing_addScript(false, acymailing_rootURI().'plugins/editors/acyeditor/acyeditor/ckeditor/plugins/smiley/dialogs/emojimap.js?v='.filemtime(ACYMAILING_ROOT.'plugins'.DS.'editors'.DS.'acyeditor'.DS.'acyeditor'.DS.'ckeditor'.DS.'plugins'.DS.'smiley'.DS.'dialogs'.DS.'emojimap.js'));
				acymailing_addStyle(false, acymailing_rootURI().'plugins/editors/acyeditor/acyeditor/ckeditor/plugins/smiley/emojionearea.css?v='.filemtime(ACYMAILING_ROOT.'plugins'.DS.'editors'.DS.'acyeditor'.DS.'acyeditor'.DS.'ckeditor'.DS.'plugins'.DS.'smiley'.DS.'emojionearea.css'));

				acymailing_addScript(true, '
					jQuery(document).ready(function() {
						jQuery("#subject").emojioneArea({
							pickerPosition: "bottom",
							shortnames: true
						});
					});
				');
			}
		}

		$paramBase = ACYMAILING_COMPONENT.'.'.$this->getName();
		$infos = new stdClass();
		$infos->test_selection = acymailing_getUserVar($paramBase.".test_selection", 'test_selection', '', 'string');
		$infos->test_group = acymailing_getUserVar($paramBase.".test_group", 'test_group', '', 'string');
		$infos->test_emails = acymailing_getUserVar($paramBase.".test_emails", 'test_emails', '', 'string');


		$acyToolbar = acymailing_get('helper.toolbar');
		if(acymailing_isAllowed($config->get('acl_tags_view', 'all'))) $acyToolbar->popup('tag', acymailing_translation('TAGS'), acymailing_completeLink("tag&task=tag&type=news", true), 780, 550);
		$acyToolbar->custom('test', acymailing_translation('SEND_TEST'), 'send', false);
		$acyToolbar->divider();
		$acyToolbar->addButtonOption('apply', acymailing_translation('ACY_APPLY'), 'apply', false);
		$acyToolbar->save();
		$acyToolbar->cancel();
		$acyToolbar->divider();
		$acyToolbar->help('template', 'templatecreation');
		$acyToolbar->setTitle(acymailing_translation('ACY_TEMPLATE'), 'template&task=edit&tempid='.$tempid);
		$acyToolbar->display();


		$this->editor = $editor;
		$testreceiverType = acymailing_get('type.testreceiver');
		$this->testreceiverType = $testreceiverType;
		$this->template = $template;
		$colorBox = acymailing_get('type.color');
		$this->colorBox = $colorBox;
		$this->infos = $infos;

		$tabs = acymailing_get('helper.acytabs');
		$this->tabs = $tabs;
	}

	function theme(){
		$this->selection[] = 'a.*';
		$this->filters[] = 'a.published = 1';

		if(acymailing_level(3)){
			$groups = acymailing_getGroupsByUser(acymailing_currentUserId(), false);
			$condGroup = '';
			foreach($groups as $group){
				$condGroup .= ' OR a.access LIKE (\'%,'.$group.',%\')';
			}
			$this->filters[] = 'a.access = \'all\''.$condGroup;
		}

		$this->button = false;
		acymailing_display(acymailing_translation('CHANGE_TEMPLATE'), 'warning', false);
		$this->listing();

		$js = "function applyTemplate(tempid){
			window.parent.changeTemplate(window.document.getElementById('htmlcontent_'+tempid).innerHTML,
										window.document.getElementById('textcontent_'+tempid).innerHTML,
										window.document.getElementById('subject_'+tempid).innerHTML,
										window.document.getElementById('stylesheet_'+tempid).innerHTML,
										window.document.getElementById('fromname_'+tempid).innerHTML,
										window.document.getElementById('fromemail_'+tempid).innerHTML,
										window.document.getElementById('replyname_'+tempid).innerHTML,
										window.document.getElementById('replyemail_'+tempid).innerHTML,
										tempid);
			acymailing.closeBox(true); }";
		acymailing_addScript(true, $js);
	}

	function upload(){
		if(acymailing_isNoTemplate()){
			$acyToolbar = acymailing_get('helper.toolbar');
			$acyToolbar->custom('doupload', acymailing_translation('IMPORT'), 'import', false);
			$acyToolbar->divider();
			$acyToolbar->help('template-upload');
			$acyToolbar->setTitle(acymailing_translation('ACY_TEMPLATE'));
			$acyToolbar->topfixed = false;
			$acyToolbar->display();
		}
	}
}
components/com_acymailing/views/chooselist/index.html000060400000000054152453623450017216 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/chooselist/view.html.php000060400000003530152453623450017651 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php


class chooselistViewchooselist extends acymailingView
{

	function display($tpl = null)
	{
		$function = $this->getLayout();
		if(method_exists($this,$function)) $this->$function();

		parent::display($tpl);
	}

	function listing(){

		$listClass = acymailing_get('class.list');
		$rows = $listClass->getLists();

		$selectedLists = acymailing_getVar('string', 'values', '', '');

		if(strtolower($selectedLists) == 'all'){
			foreach($rows as $id => $oneRow){
				$rows[$id]->selected = true;
			}
		}elseif(!empty($selectedLists)){
			$selectedLists = explode(',',$selectedLists);
			foreach($rows as $id => $oneRow){
				if(in_array($oneRow->listid,$selectedLists)){
					$rows[$id]->selected = true;
				}
			}
		}

		$fieldName = acymailing_getVar('string', 'task');
		$controlName = acymailing_getVar('string', 'control', 'params');
		$popup = acymailing_getVar('string', 'popup', '1');

		$this->rows = $rows;
		$this->selectedLists = $selectedLists;
		$this->fieldName = $fieldName;
		$this->controlName = $controlName;
		$this->popup = $popup;
	}


	function customfields(){

		$fieldsClass = acymailing_get('class.fields');
		$fake = null;
		$rows = $fieldsClass->getFields('module', $fake);

		$selected = acymailing_getVar('string', 'values', '', '');
		$selectedvalues = explode(',',$selected);
		foreach($rows as $id => $oneRow){
			if(in_array($oneRow->namekey,$selectedvalues)){
				$rows[$id]->selected = true;
			}
		}

		$this->fieldsClass = $fieldsClass;
		$this->rows = $rows;
		$controlName = acymailing_getVar('string', 'control', 'params');
		$this->controlName = $controlName;
	}
}
components/com_acymailing/views/chooselist/tmpl/customfields.php000060400000006573152453623450021423 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<script language="javascript" type="text/javascript">
	<!--
		var selectedContents = new Array();
		var allElements = <?php echo count($this->rows);?>;
		<?php
			foreach($this->rows as $oneRow){
				if(!empty($oneRow->selected)){
					echo "selectedContents['".$oneRow->namekey."'] = 'content';";
				}
			}
		?>
		function applyContent(contentid,rowClass){
			if(selectedContents[contentid]){
				window.document.getElementById('content'+contentid).className = rowClass;
				delete selectedContents[contentid];
			}else{
				window.document.getElementById('content'+contentid).className = 'selectedrow';
				selectedContents[contentid] = 'content';
			}
		}

		function insertTag(){
			var tag = '';
			for(var i in selectedContents){
				if(selectedContents[i] == 'content'){
					allElements--;
					if(tag != '') tag += ',';
					tag = tag + i;
				}
			}

			var textbox = window.top.document.getElementById('<?php echo $this->controlName; ?>customfields');
			textbox.value = tag;

			<?php if('joomla' == 'wordpress'){ ?>
				if(textbox.form && textbox.form.querySelector('input[type="submit"]')){
					textbox.form.querySelector('input[type="submit"]').removeAttribute('disabled');
					textbox.form.querySelector('input[type="submit"]').value = '<?php echo __('Save'); ?>';
				}
			<?php } ?>

			parent.acymailing.setOnclickPopup('link<?php echo $this->controlName; ?>customfields', '<?php echo acymailing_completeLink('chooselist&task=customfields&control='.$this->controlName); ?>&values='+tag, 650, 375);
			acymailing.closeBox(true);
		}
	//-->
	</script>
	<style type="text/css">
		table.acymailing_table tr.selectedrow td{
			background-color:#FDE2BA;
		}
	</style>
	<form action="<?php echo acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'chooselist') ?>" method="post" name="adminForm" id="adminForm">
		<div style="float:right;margin-bottom : 10px">
			<button class="acymailing_button_grey" id="insertButton" onclick="insertTag(); return false;"><?php echo acymailing_translation('ACY_APPLY'); ?></button>
		</div>
		<div style="clear:both"></div>
		<table class="acymailing_table" cellpadding="1">
			<thead>
				<tr>
					<th class="title">
					</th>
					<th class="title">
						<?php echo acymailing_translation('FIELD_COLUMN'); ?>
					</th>
					<th class="title">
						<?php echo acymailing_translation('FIELD_LABEL'); ?>
					</th>
					<th class="title titleid">
						<?php echo acymailing_translation('ACY_ID'); ?>
					</th>
				</tr>
			</thead>
			<tbody>
				<?php
					$k = 0;

					foreach($this->rows as $row){
				?>
					<tr class="<?php echo empty($row->selected) ? "row$k" : 'selectedrow'; ?>" id="content<?php echo $row->namekey; ?>" onclick="applyContent('<?php echo $row->namekey."','row$k'"?>);" style="cursor:pointer;">
						<td class="acytdcheckbox"></td>
						<td>
						<?php echo $row->namekey; ?>
						</td>
						<td>
						<?php echo $this->fieldsClass->trans($row->fieldname); ?>
						</td>
						<td align="center" style="text-align:center" >
							<?php echo $row->fieldid; ?>
						</td>
					</tr>
				<?php
						$k = 1-$k;
					}
				?>
			</tbody>
		</table>
	</form>
</div>
components/com_acymailing/views/chooselist/tmpl/index.html000060400000000054152453623450020172 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/chooselist/tmpl/listing.php000060400000007626152453623450020373 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<script language="javascript" type="text/javascript">
		<!--
		var selectedContents = new Array();
		var allElements = <?php echo count($this->rows);?>;
		<?php
			foreach($this->rows as $oneRow){
				if(!empty($oneRow->selected)){
					echo "selectedContents[".$oneRow->listid."] = 'content';";
				}
			}
		?>
		function applyContent(contentid, rowClass) {
			if (selectedContents[contentid]) {
				window.document.getElementById('content' + contentid).className = rowClass;
				delete selectedContents[contentid];
			} else {
				window.document.getElementById('content' + contentid).className = 'selectedrow';
				selectedContents[contentid] = 'content';
			}
		}

		function insertTag() {
			var tag = '';
			for (var i in selectedContents) {
				if (selectedContents[i] == 'content') {
					allElements--;
					if (tag != '') tag += ',';
					tag = tag + i;
				}
			}
			<?php if(acymailing_getVar('int', 'all', 1) == 1){ ?>if (allElements == 0) tag = 'All';<?php } ?>
			if (allElements == <?php echo count($this->rows);?>) tag = 'None';

			<?php if(empty($this->popup)){ ?>

				window.parent.document.getElementById('<?php echo $this->controlName.$this->fieldName; ?>').value = tag;
				window.parent.displayLists();

			<?php }else{ ?>

				var textbox = window.top.document.getElementById('<?php echo $this->controlName.$this->fieldName; ?>');
				textbox.value = tag;

				<?php if('joomla' == 'wordpress'){ ?>
					if(textbox.form && textbox.form.querySelector('input[type="submit"]')){
						textbox.form.querySelector('input[type="submit"]').removeAttribute('disabled');
						textbox.form.querySelector('input[type="submit"]').value = '<?php echo __('Save'); ?>';
					}
				<?php } ?>

				parent.acymailing.setOnclickPopup('link<?php echo $this->controlName.$this->fieldName; ?>', '<?php echo htmlspecialchars_decode(acymailing_completeLink('chooselist&task='.$this->fieldName.'&control='.$this->controlName)); ?>&values='+tag, 650, 375);
				acymailing.closeBox(true);

			<?php } ?>
		}
		//-->
	</script>
	<style type="text/css">
		table.acymailing_table tr.selectedrow td{
			background-color: #f3f7fc;
		}
	</style>
	<form action="<?php echo acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'chooselist'); ?>" method="post" name="adminForm" id="adminForm">
		<div style="float:right;margin-bottom : 10px">
			<button class="acymailing_button_grey" id="insertButton" onclick="insertTag(); return false;"><?php echo acymailing_translation('ACY_APPLY'); ?></button>
		</div>
		<div style="clear:both"/>
		<table class="acymailing_table" cellpadding="1">
			<thead>
			<tr>
				<th class="title">

				</th>
				<th class="title titlecolor">

				</th>
				<th class="title">
					<?php echo acymailing_translation('LIST_NAME'); ?>
				</th>
				<th class="title titleid">
					<?php echo acymailing_translation('ACY_ID'); ?>
				</th>
			</tr>
			</thead>
			<tbody>
			<?php
			$k = 0;

			for($i = 0, $a = count($this->rows); $i < $a; $i++){
				$row =& $this->rows[$i];
				?>
				<tr class="<?php echo empty($row->selected) ? "row$k" : 'selectedrow'; ?>" id="content<?php echo $row->listid ?>" onclick="applyContent(<?php echo $row->listid.",'row$k'" ?>);" style="cursor:pointer;">
					<td class="acytdcheckbox"></td>
					<td>
						<?php echo '<div class="roundsubscrib rounddisp" style="background-color:'.$row->color.'"></div>'; ?>
					</td>
					<td>
						<?php
						echo acymailing_tooltip($row->description, $row->name, 'tooltip.png', $row->name);
						?>
					</td>
					<td align="center" style="text-align:center">
						<?php echo $row->listid; ?>
					</td>
				</tr>
				<?php
				$k = 1 - $k;
			}
			?>
			</tbody>
		</table>
	</form>
</div>
components/com_acymailing/views/index.html000060400000000054152453623450015042 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/queue/view.html.php000060400000015463152453623450016631 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php


class QueueViewQueue extends acymailingView{
	var $searchFields = array('b.name', 'b.email', 'c.subject', 'a.mailid', 'a.subid');
	var $selectFields = array('b.name', 'b.email', 'c.subject', 'c.type', 'c.published', 'a.mailid', 'a.subid', 'a.senddate', 'a.priority', 'a.try');

	function display($tpl = null){
		$function = $this->getLayout();
		if(method_exists($this, $function)) $this->$function();

		parent::display($tpl);
	}

	function preview(){
		$mailid = acymailing_getVar('int', 'mailid');
		$subid = acymailing_getVar('int', 'subid');

		$mailerHelper = acymailing_get('helper.mailer');
		$mailerHelper->loadedToSend = false;
		$mail = $mailerHelper->load($mailid);

		$userClass = acymailing_get('class.subscriber');
		$receiver = $userClass->get($subid);
		if(empty($receiver)) die(acymailing_translation_sprintf('SEND_ERROR_USER', $subid));
		if(empty($mail)) die('Newsletter not found: '.$mailid);
		$mail->sendHTML = $mail->html && $receiver->html;

		$receiver->paramqueue = acymailing_loadResult('SELECT paramqueue FROM #__acymailing_queue WHERE mailid = '.intval($mailid).' AND subid = '.intval($subid));

		acymailing_trigger('acymailing_replaceusertags', array(&$mail, &$receiver, false));
		if(!empty($mail->altbody)) $mail->altbody = $mailerHelper->textVersion($mail->altbody, false);

		if($mail->html){
			$templateClass = acymailing_get('class.template');
			$templateClass->displayPreview('newsletter_preview_area', $mail->tempid, $mail->subject);
		}

		$this->mail = $mail;

		$acyToolbar = acymailing_get('helper.toolbar');
		$acyToolbar->setTitle($this->mail->subject);
		$acyToolbar->directPrint();
		$acyToolbar->topfixed = false;
		$acyToolbar->display();
	}

	function listing(){
		$pageInfo = new stdClass();
		$pageInfo->filter = new stdClass();
		$pageInfo->filter->order = new stdClass();
		$pageInfo->limit = new stdClass();
		$pageInfo->elements = new stdClass();

		$config = acymailing_config();

		$paramBase = ACYMAILING_COMPONENT.'.'.$this->getName();
		$pageInfo->filter->order->value = acymailing_getUserVar($paramBase.".filter_order", 'filter_order', 'a.senddate', 'cmd');
		$pageInfo->filter->order->dir = acymailing_getUserVar($paramBase.".filter_order_Dir", 'filter_order_Dir', 'asc', 'word');
		if(strtolower($pageInfo->filter->order->dir) !== 'desc') $pageInfo->filter->order->dir = 'asc';
		$pageInfo->search = acymailing_getUserVar($paramBase.".search", 'search', '', 'string');
		$pageInfo->search = strtolower(trim($pageInfo->search));

		$pageInfo->selectedMail = acymailing_getUserVar($paramBase."filter_mail", 'filter_mail', 0, 'int');

		$pageInfo->limit->value = acymailing_getUserVar($paramBase.'.list_limit', 'limit', acymailing_getCMSConfig('list_limit'), 'int');
		$pageInfo->limit->start = acymailing_getUserVar($paramBase.'.limitstart', 'limitstart', 0, 'int');

		$filters = array();
		if(!empty($pageInfo->search)){
			$searchVal = '\'%'.acymailing_getEscaped($pageInfo->search, true).'%\'';
			$filters[] = implode(" LIKE $searchVal OR ", $this->searchFields)." LIKE $searchVal";
		}

		if(!empty($pageInfo->selectedMail)) $filters[] = 'a.mailid = '.intval($pageInfo->selectedMail);

		$query = 'SELECT '.implode(' , ', $this->selectFields);
		$query .= ' FROM '.acymailing_table('queue').' as a';
		$query .= ' JOIN '.acymailing_table('subscriber').' as b on a.subid = b.subid';
		$query .= ' JOIN '.acymailing_table('mail').' as c on a.mailid = c.mailid';
		if(!empty($filters)) $query .= ' WHERE ('.implode(') AND (', $filters).')';
		if(!empty($pageInfo->filter->order->value)){
			$query .= ' ORDER BY '.$pageInfo->filter->order->value.' '.$pageInfo->filter->order->dir.', a.`subid` ASC';
		}

		if(empty($pageInfo->limit->value)) $pageInfo->limit->value = 100;
		$rows = acymailing_loadObjectList($query, '', $pageInfo->limit->start, $pageInfo->limit->value);
		if(empty($rows) && $pageInfo->limit->start != 0){
			$pageInfo->limit->start = 0;
			$rows = acymailing_loadObjectList($query, '', $pageInfo->limit->start, $pageInfo->limit->value);
		}

		$pageInfo->elements->page = count($rows);

		if($pageInfo->limit->value > $pageInfo->elements->page){
			$pageInfo->elements->total = $pageInfo->limit->start + $pageInfo->elements->page;
		}else{
			$queryCount = 'SELECT COUNT(a.mailid) FROM '.acymailing_table('queue').' as a';
			if(!empty($pageInfo->search)){
				$queryCount .= ' JOIN '.acymailing_table('subscriber').' as b on a.subid = b.subid';
				$queryCount .= ' JOIN '.acymailing_table('mail').' as c on a.mailid = c.mailid';
			}
			if(!empty($filters)) $queryCount .= ' WHERE ('.implode(') AND (', $filters).')';

			$pageInfo->elements->total = acymailing_loadResult($queryCount);
		}

		$pagination = new acyPagination($pageInfo->elements->total, $pageInfo->limit->start, $pageInfo->limit->value);

		$mailqueuetype = acymailing_get('type.queuemail');
		$filtersType = new stdClass();
		$filtersType->mail = $mailqueuetype->display('filter_mail', $pageInfo->selectedMail);


		$acyToolbar = acymailing_get('helper.toolbar');
		if(acymailing_isAllowed($config->get('acl_queue_process', 'all'))){
			$acyToolbar->popup('process', acymailing_translation('PROCESS'), acymailing_completeLink("queue&task=process&mailid=".$pageInfo->selectedMail, true));
		}
		if(!empty($pageInfo->elements->total) AND acymailing_isAllowed($config->get('acl_queue_delete', 'all'))){
			$onClick = "if (confirm('".str_replace("'", "\'", acymailing_translation_sprintf('CONFIRM_DELETE_QUEUE', $pageInfo->elements->total))."')){acymailing.submitbutton('remove');}";
			$acyToolbar->custom('remove', acymailing_translation('ACY_DELETE'), 'delete', false, $onClick);
		}

		$acyToolbar->divider();
		$acyToolbar->help('queue-listing');
		$acyToolbar->setTitle(acymailing_translation('QUEUE'), 'queue');
		$acyToolbar->display();

		$toggleClass = acymailing_get('helper.toggle');

		$this->toggleClass = $toggleClass;
		$this->filters = $filtersType;
		$this->rows = $rows;
		$this->pageInfo = $pageInfo;
		$this->pagination = $pagination;
	}

	function process(){

		$mailid = acymailing_getCID('mailid');
		$queueClass = acymailing_get('class.queue');
		$queueStatus = $queueClass->queueStatus($mailid);
		$nextqueue = $queueClass->queueStatus($mailid, true);
		if(acymailing_level(1)){
			$scheduleClass = acymailing_get('helper.schedule');
			$scheduleNewsletter = $scheduleClass->getScheduled();
			$this->schedNews = $scheduleNewsletter;
		}

		if(empty($queueStatus) AND empty($scheduleNewsletter)) acymailing_display(acymailing_translation('NO_PROCESS'), 'info');

		$infos = new stdClass();
		$infos->mailid = $mailid;
		$this->queue = $queueStatus;
		$this->nextqueue = $nextqueue;
		$this->infos = $infos;
	}
}
components/com_acymailing/views/queue/tmpl/preview.php000060400000000643152453623450017343 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div class="newsletter_body" id="newsletter_preview_area">
	<?php echo $this->mail->sendHTML ? $this->mail->body : nl2br($this->mail->altbody); ?>
</div>
components/com_acymailing/views/queue/tmpl/listing.php000060400000010451152453623450017331 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<div id="iframedoc"></div>

	<?php if(empty($this->pageInfo->search) && empty($this->rows) && empty($pageInfo->selectedMail)){
		acymailing_display(acymailing_translation('ACY_EMPTY_QUEUE'),'info');
		echo '</div>';
		return;
	}
		?>

		<form action="<?php echo acymailing_completeLink('queue'); ?>" method="post" name="adminForm" id="adminForm">
			<table class="acymailing_table_options">
				<tr>
					<td width="100%">
						<?php acymailing_listingsearch($this->pageInfo->search); ?>
					</td>
					<td nowrap="nowrap">
						<?php echo $this->filters->mail; ?>
					</td>
				</tr>
			</table>

			<table class="acymailing_table" cellpadding="1">
				<thead>
				<tr>
					<th class="title titlenum">
						<?php echo acymailing_translation('ACY_NUM'); ?>
					</th>
					<th class="title titledate">
						<?php echo acymailing_gridSort(acymailing_translation('SEND_DATE'), 'a.senddate', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
					</th>
					<th class="title">
						<?php echo acymailing_gridSort(acymailing_translation('JOOMEXT_SUBJECT'), 'c.subject', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
					</th>
					<th class="title">
						<?php echo acymailing_gridSort(acymailing_translation('ACY_USER'), 'b.email', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
					</th>
					<th class="title titletoggle">
						<?php echo acymailing_gridSort(acymailing_translation('PRIORITY'), 'a.priority', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
					</th>
					<th class="title titletoggle">
						<?php echo acymailing_gridSort(acymailing_translation('TRY'), 'a.try', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
					</th>
					<th class="title titletoggle">
						<?php echo acymailing_translation('ACY_DELETE'); ?>
					</th>
					<th class="title titletoggle" nowrap="nowrap">
						<?php echo acymailing_gridSort(acymailing_translation('ACY_PUBLISHED'), 'c.published', $this->pageInfo->filter->order->dir, $this->pageInfo->filter->order->value); ?>
					</th>
				</tr>
				</thead>
				<tfoot>
				<tr>
					<td colspan="10">
						<?php echo $this->pagination->getListFooter();
						echo $this->pagination->getResultsCounter(); ?>
					</td>
				</tr>
				</tfoot>
				<tbody>
				<?php
				$k = 0;

				for($i = 0, $a = count($this->rows); $i < $a; $i++){
					$row =& $this->rows[$i];
					$id = 'queue'.$i;
					?>
					<tr class="<?php echo "row$k"; ?>" id="<?php echo $id; ?>">
						<td align="center" style="text-align:center">
							<?php echo $this->pagination->getRowOffset($i); ?>
						</td>
						<td align="center" style="text-align:center">
							<?php echo acymailing_getDate($row->senddate); ?>
						</td>
						<td>
							<?php
							$row->subject = acyEmoji::Decode($row->subject);
							echo acymailing_popup(acymailing_completeLink('queue&task=preview&mailid='.$row->mailid.'&subid='.$row->subid, true), acymailing_dispSearch($row->subject, $this->pageInfo->search), '', 800, 590); ?>
						</td>
						<td>
							<?php
							echo acymailing_tooltip(acymailing_translation('ACY_NAME').' : '.$row->name.'<br />'.acymailing_translation('ACY_ID').' : '.$row->subid, $row->email, 'tooltip.png', $row->name.' ( '.$row->email.' )', acymailing_completeLink('subscriber&task=edit&subid='.$row->subid));
							?>
						</td>
						<td align="center" style="text-align:center">
							<?php echo $row->priority; ?>
						</td>
						<td align="center" style="text-align:center">
							<?php echo $row->try; ?>
						</td>
						<td align="center" style="text-align:center">
							<?php echo $this->toggleClass->delete($id, $row->subid.'_'.$row->mailid, 'queue'); ?>
						</td>
						<td align="center" style="text-align:center">
							<?php echo $this->toggleClass->display('published', $row->published); ?>
						</td>
					</tr>
					<?php
					$k = 1 - $k;
				}
				?>
				</tbody>
			</table>

			<?php acymailing_formOptions($this->pageInfo->filter->order); ?>
		</form>
</div>
components/com_acymailing/views/queue/tmpl/process.php000060400000006660152453623450017345 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php acymailing_display(acymailing_translation_sprintf('QUEUE_STATUS', acymailing_getDate(time())), 'info'); ?>
<form action="<?php echo acymailing_completeLink('queue', true); ?>" method="post" name="adminForm" id="adminForm" autocomplete="off">
	<div>
		<?php if(!empty($this->queue)){ ?>
			<div class="onelineblockoptions">
				<span class="acyblocktitle"><?php echo acymailing_translation('QUEUE_READY'); ?></span>
				<table class="acymailing_table" cellspacing="1" align="center">
					<tbody>
					<?php $k = 0;
					$total = 0;
					foreach($this->queue as $mailid => $row){
						$total += $row->nbsub;
						?>

						<tr class="<?php echo "row$k"; ?>">
							<td>
								<?php
								$row->subject = acyEmoji::Decode($row->subject);
								echo acymailing_translation_sprintf('EMAIL_READY', $row->mailid, $row->subject, $row->nbsub);
								?>
							</td>
						</tr>
						<?php
						$k = 1 - $k;
					} ?>
					</tbody>
				</table>
				<br/>
				<input type="hidden" name="totalsend" value="<?php echo $total; ?>"/>
				<input class="acymailing_button_grey" type="submit" onclick="document.adminForm.task.value='continuesend';" value="<?php echo acymailing_translation('SEND'); ?>">
			</div>
		<?php } ?>

		<?php if(!empty($this->schedNews)){ ?>
			<div class="onelineblockoptions">
				<span class="acyblocktitle"><?php echo acymailing_translation('SCHEDULE_NEWS'); ?></span>
				<table class="acymailing_table" cellspacing="1" align="center">
					<tbody>
					<?php $k = 0;
					$sendButton = false;
					foreach($this->schedNews as $row){
						if($row->senddate < time()) $sendButton = true; ?>
						<tr class="<?php echo "row$k"; ?>">
							<td>
								<?php
								$row->subject = acyEmoji::Decode($row->subject);
								echo acymailing_translation_sprintf('QUEUE_SCHED', $row->mailid, $row->subject, acymailing_getDate($row->senddate));
								?>
							</td>
						</tr>
						<?php
						$k = 1 - $k;
					} ?>
					</tbody>
				</table>
				<?php if($sendButton){ ?><br/><input class="acymailing_button" onclick="document.adminForm.task.value='genschedule';" type="submit" value="<?php echo acymailing_translation('GENERATE', true); ?>"><?php } ?>
			</div>
		<?php } ?>

		<?php if(!empty($this->nextqueue)){ ?>
			<div class="onelineblockoptions">
				<span class="acyblocktitle"><?php echo acymailing_translation_sprintf('QUEUE_STATUS', acymailing_getDate(time())); ?></span>
				<table class="acymailing_table" cellspacing="1" align="center">
					<tbody>
					<?php $k = 0;
					foreach($this->nextqueue as $mailid => $row){ ?>
						<tr class="<?php echo "row$k"; ?>">
							<td>
								<?php
								$row->subject = acyEmoji::Decode($row->subject);
								echo acymailing_translation_sprintf('EMAIL_READY', $row->mailid, $row->subject, $row->nbsub);
								echo '<br />'.acymailing_translation_sprintf('QUEUE_NEXT_SCHEDULE', acymailing_getDate($row->senddate));
								?>
							</td>
						</tr>
						<?php
						$k = 1 - $k;
					} ?>
					</tbody>
				</table>
			</div>
		<?php } ?>
	</div>
	<div class="clr"></div>
	<input type="hidden" name="mailid" value="<?php echo $this->infos->mailid; ?>"/>
	<?php
	acymailing_setVar('ctrl', 'send');
	acymailing_formOptions();
	?>
</form>
components/com_acymailing/views/queue/tmpl/index.html000060400000000054152453623450017142 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/queue/index.html000060400000000054152453623450016166 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/tag/index.html000060400000000054152453623450015615 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/tag/view.html.php000060400000004645152453623450016260 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php


class TagViewTag extends acymailingView{

	function display($tpl = null){
		$function = $this->getLayout();
		if(method_exists($this, $function)) $this->$function();

		parent::display($tpl);
	}

	function tag(){
		acymailing_addStyle(false, ACYMAILING_CSS.'frontendedition.css?v='.filemtime(ACYMAILING_MEDIA.'css'.DS.'frontendedition.css'));

		acymailing_importPlugin('acymailing');
		$tagsfamilies = acymailing_trigger('acymailing_getPluginType');

		$defaultFamily = reset($tagsfamilies);
		if(!is_object($defaultFamily)) $defaultFamily = end($tagsfamilies);
		$fctplug = acymailing_getUserVar(ACYMAILING_COMPONENT.".tag", 'fctplug', $defaultFamily->function, 'cmd');

		ob_start();
		$defaultContents = acymailing_trigger($fctplug);
		$defaultContent = ob_get_clean();

		$js = 'function insertTag(){if(window.parent.insertTag(window.document.getElementById(\'tagstring\').value)) {acymailing.closeBox(true);}}';
		$js .= 'function setTag(tagvalue){window.document.getElementById(\'tagstring\').value = tagvalue;}';
		$js .= 'function showTagButton(){window.document.getElementById(\'insertButton\').style.display = \'inline\'; window.document.getElementById(\'tagstring\').style.display=\'inline\';}';
		$js .= 'function hideTagButton(){}';
		$js .= 'try{window.parent.previousSelection = window.parent.getPreviousSelection(); }catch(err){window.parent.previousSelection=false; }';

		acymailing_addScript(true, $js);


		$this->fctplug = $fctplug;
		$type = acymailing_getVar('string', 'type', 'news');
		$this->type = $type;
		$this->defaultContent = $defaultContent;
		$this->tagsfamilies = $tagsfamilies;
		$ctrl = acymailing_getVar('string', 'ctrl');
		$this->ctrl = $ctrl;
	}

	function form(){
		$plugin = acymailing_getVar('string', 'plugin');
		$plugin = preg_replace('#[^a-zA-Z0-9_]#Uis', '', $plugin);
		$templatePath = ACYMAILING_MEDIA.'plugins'.DS.$plugin.'.php';
		$body = '';
		if(file_exists($templatePath)) $body = file_get_contents($templatePath);
		$help = acymailing_getVar('string', 'help');
		$help = preg_replace('#[^a-zA-Z0-9]#Uis', '', $help);
		$help = empty($help) ? $plugin : $help;

		$this->help = $help;
		$this->plugin = $plugin;
		$this->body = $body;
	}
}
components/com_acymailing/views/tag/tmpl/form.php000060400000003152152453623450016252 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div id="acy_content">
	<form action="<?php echo acymailing_completeLink(acymailing_getVar('cmd', 'ctrl')); ?>" method="post" name="adminForm" id="adminForm" autocomplete="off">
		<?php
		$toolbar = acymailing_get('helper.toolbar');
		$toolbar->help('plugin-'.$this->help);
		$toolbar->divider();
		$toolbar->custom('apply', acymailing_translation('ACY_SAVE', true), 'save', false);
		$toolbar->topfixed = false;
		$toolbar->setTitle(acymailing_translation('ACY_CUSTOMTEMPLATE'));
		$toolbar->display();
		?>
		<div id="iframedoc" style="clear:both;position:relative;"></div>
		<div class="onelineblockoptions">
			<table class="acymailing_table" width="100%">
				<tr>
					<td class="paramlist_key">
						<label for="subject">
							<?php echo acymailing_translation('TEMPLATE_NAME'); ?>
						</label>
					</td>
					<td class="paramlist_value">
						<?php echo $this->plugin; ?>.php
					</td>
				</tr>
			</table>
		</div>
		<fieldset class="adminform" style="width:95%;" id="textfieldset">
			<legend><?php echo acymailing_translation('ACY_TEMPLATE'); ?></legend>
			<textarea style="width:99%;height:250px;" rows="16" name="templatebody" id="templatebody"><?php echo $this->body; ?></textarea>
		</fieldset>

		<div class="clr"></div>

		<input type="hidden" name="plugin" value="<?php echo $this->plugin; ?>"/>
		<?php acymailing_formOptions(); ?>
	</form>
</div>
components/com_acymailing/views/tag/tmpl/index.html000060400000000054152453623450016571 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/views/tag/tmpl/tag.php000060400000005236152453623450016067 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><style type="text/css">
	body{
		height: auto;
		min-width: 650px !important;
	}

	html{
		overflow-y: auto;
	}

	.rt-container, .rt-block{
		width: auto !important;
		background-color: #f6f7f9 !important;
	}
</style>
<div id="acy_content">
	<div id="acymailing_edit" class="acytagpopup">
		<?php
		if(empty($this->tagsfamilies)) acymailing_checkPluginsFolders();
		?>
		<table width="100%">
			<tr>
				<td class="familymenu" valign="top">
					<?php
					foreach($this->tagsfamilies as $id => $oneFamily){
						if(empty($oneFamily)) continue;
						if($oneFamily->function == $this->fctplug){
							$help = empty($oneFamily->help) ? '' : $oneFamily->help;
							$class = ' class="selected" ';
						}else $class = '';
						echo '<a'.$class.' href="'.acymailing_completeLink($this->ctrl.'&task=tag&type='.$this->type.'&fctplug='.$oneFamily->function, true).'" >'.$oneFamily->name.'</a>';
					}
					?>
				</td>
				<?php if(!empty($help) AND acymailing_isAdmin()){ ?>
					<td valign="top">
						<div style="float:right;padding-right:5px;" class="toolbar">
							<?php
							$toolbar = acymailing_get('helper.toolbar');
							$toolbar->help($help);
							?>
							<button onclick="displayDoc();return false;" class="toolbar acymailing_button" style="margin-bottom: 5px;"><i class="acyicon-help" style="margin: 0px 5px;" title="<?php echo acymailing_translation('ACY_HELP'); ?>"></i><?php echo acymailing_translation('ACY_HELP'); ?></button>
						</div>
					</td>
				<?php } ?>
			</tr>
		</table>
		<div id="iframedoc" style="clear:both;position:relative;"></div>
		<div id="inserttagdiv">
			<input type="text" class="inputbox" style="width:300px;" id="tagstring" name="tagstring" value="" onclick="this.select();">
			<button class="acymailing_button" id="insertButton" onclick="insertTag();"><?php echo acymailing_translation('INSERT_TAG') ?></button>
		</div>
		<form action="<?php echo acymailing_completeLink(acymailing_getVar('cmd', 'ctrl')); ?>" method="post" name="adminForm" id="adminForm" autocomplete="off" enctype="multipart/form-data">
			<div id="plugarea">
				<?php echo $this->defaultContent; ?>
			</div>
			<div class="clr"></div>

			<input type="hidden" id="fctplug" name="fctplug" value="<?php echo $this->fctplug; ?>"/>
			<input type="hidden" name="type" value="<?php echo $this->type; ?>"/>
			<input type="hidden" name="defaulttask" value="tag"/>
			<?php acymailing_formOptions(); ?>
		</form>
	</div>
</div>
components/com_acymailing/helpers/import.php000060400000221407152453623450015404 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class acyimportHelper{

	var $importUserInLists = array();
	var $totalInserted = 0;
	var $totalTry = 0;
	var $totalValid = 0;
	var $allSubid = array();
	var $db;
	var $dispatcher;
	var $forceconfirm = false;
	var $charsetConvert;
	var $generatename = true;
	var $overwrite = false;
	var $importblocked = false;
	var $removeSep = 0;
	var $dispresults = true;

	var $tablename = '';
	var $equFields = array();
	var $dbwhere = array(); //handle where on import via filter to only import new users for example

	var $subscribedUsers = array();

	public function __construct(){
		acymailing_increasePerf();
		acymailing_importPlugin('acymailing');
		
		global $acymailingCmsUserVars;
		$this->cmsUserVars = $acymailingCmsUserVars;
	}

	private function getImportedLists(){
		$lists = acymailing_getVar('array', 'importlists', array());

		$newListName = acymailing_getVar('string', 'createlist');
		if(empty($newListName)) return $lists;

		$newList = new stdClass();
		$newList->name = $newListName;
		$newList->published = 1;
		$colors = array('#3366ff', '#7240A4', '#7A157D', '#157D69', '#ECE649');
		$newList->color = $colors[rand(0, count($colors) - 1)];

		$listClass = acymailing_get('class.list');
		$listid = $listClass->save($newList);

		if(!empty($listid)) $lists[$listid] = 1;

		return $lists;
	}

	function database($onlyimport = false){

		$this->forceconfirm = acymailing_getVar('int', 'import_confirmed_database');

		$table = empty($this->tablename) ? trim(acymailing_getVar('string', 'tablename')) : $this->tablename;

		if(empty($table)){
			$listTables = acymailing_getTableList();
			acymailing_enqueueMessage(acymailing_translation_sprintf('SPECIFYTABLE', implode(' | ', $listTables)), 'notice');
			return false;
		}

		if(empty($this->tablename)){
			$newConfig = new stdClass();
			$newConfig->import_db_table = trim(acymailing_getVar('string', 'tablename'));
			$newConfig->import_db_fields = serialize(acymailing_getVar('array', 'fields', array()));

			$config = acymailing_config();
			$config->save($newConfig);
		}

		$fields = acymailing_getColumns($table);
		if(empty($fields)){
			$listTables = acymailing_getTableList();
			acymailing_enqueueMessage(acymailing_translation_sprintf('SPECIFYTABLE', implode(' | ', $listTables)), 'notice');
			return false;
		}

		$fields = array_keys($fields);
		$equivalentFields = empty($this->equFields) ? acymailing_getVar('array', 'fields', array()) : $this->equFields;

		if(empty($equivalentFields['email'])){
			acymailing_enqueueMessage(acymailing_translation('SPECIFYFIELDEMAIL'), 'notice');
			return false;
		}

		$select = array();
		foreach($equivalentFields as $acyField => $tableField){
			$tableField = trim($tableField);
			if(empty($tableField)) continue;
			if(!in_array($tableField, $fields)){
				acymailing_enqueueMessage(acymailing_translation_sprintf('SPECIFYFIELD', $tableField, implode(' | ', $fields)), 'notice');
				return false;
			}
			$select['`'.$acyField.'`'] = '`'.$tableField.'`';
		}

		if(empty($select['`created`'])){
			$select['`created`'] = time();
		}
		if($this->forceconfirm && empty($select['`confirmed`'])){
			$select['`confirmed`'] = 1;
		}

		$query = 'INSERT IGNORE INTO `#__acymailing_subscriber` ('.implode(' , ', array_keys($select)).') SELECT '.implode(' , ', $select).' FROM '.$table.' WHERE '.$select['`email`'].' LIKE \'%@%\'';
		if(!empty($this->dbwhere)) $query .= ' AND ( '.implode(' ) AND (', $this->dbwhere).' )';

		$affectedRows = acymailing_query($query);

		acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_NEW', $affectedRows));

		if($onlyimport) return true;

		$query = 'SELECT b.subid FROM '.$table.' as a JOIN '.acymailing_table('subscriber').' as b on a.'.$select['`email`'].' = b.`email`';
		$this->allSubid = acymailing_loadResultArray($query);

		$this->_subscribeUsers();
		$this->_displaySubscribedResult();

		return true;
	}

	function textarea(){
		$content = acymailing_getVar('string', 'textareaentries');
		$path = $this->_createUploadFolder();
		$filename = uniqid('import_').'.csv';

		acymailing_writeFile($path.$filename, $content);
		acymailing_setVar('filename', $filename);

		return true;
	}

	private function _createUploadFolder(){
		$folderPath = acymailing_cleanPath(ACYMAILING_ROOT.trim(html_entity_decode(str_replace('/', DS, ACYMAILING_MEDIA_FOLDER).DS.'import'))).DS;
		if(!is_dir($folderPath)){
			acymailing_createDir($folderPath, true, true);
		}

		if(!is_writable($folderPath)){
			@chmod($folderPath, '0755');
			if(!is_writable($folderPath)){
				acymailing_enqueueMessage(acymailing_translation_sprintf('WRITABLE_FOLDER', $folderPath), 'notice');
			}
		}
		return $folderPath;
	}

	function file(){
		$importFile = acymailing_getVar('array', 'importfile', array(), 'files');

		if(empty($importFile['name'])){
			acymailing_enqueueMessage(acymailing_translation('BROWSE_FILE'), 'notice');
			return false;
		}

		$extension = strtolower(acymailing_fileGetExt($importFile['name']));
		if(in_array($extension, array('xls', 'xlsx'))){
			acymailing_display('Excel files are not supported.<br />Please convert your file into CSV :<ol><li>Open your file with Excel</li><li>Select File => Save as...</li><li>For the type, select "CSV (separator: semi-colon) (*.csv)"</li></ol>', 'error');
			return false;
		}

		$fileError = $_FILES['importfile']['error'];
		if($fileError > 0){
			switch($fileError){
				case 1:
					acymailing_display('The uploaded file exceeds the upload_max_filesize directive in php configuration.', 'error');
					return false;
				case 2:
					acymailing_display('The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.', 'error');
					return false;
				case 3:
					acymailing_display('The uploaded file was only partially uploaded.', 'error');
					return false;
				case 4:
					acymailing_display('No file was uploaded.', 'error');
					return false;
				default:
					acymailing_display('Error uploading the file on the server, unknown error '.$fileError, 'error');
					return false;
			}
		}

		$config = acymailing_config();

		$uploadPath = $this->_createUploadFolder();

		$attachment = new stdClass();
		$attachment->filename = uniqid('import_').'.csv';
		acymailing_setVar('filename', $attachment->filename);

		$attachment->size = $importFile['size'];

		if(!preg_match('#\.('.str_replace(array(',', '.'), array('|', '\.'), $config->get('allowedfiles')).')$#Ui', $attachment->filename, $extension) || preg_match('#\.(php.?|.?htm.?|pl|py|jsp|asp|sh|cgi)$#Ui', $attachment->filename)){
			acymailing_enqueueMessage(acymailing_translation_sprintf('ACCEPTED_TYPE', htmlspecialchars(substr($attachment->filename, strrpos($attachment->filename, '.') + 1), ENT_COMPAT, 'UTF-8'), $config->get('allowedfiles')), 'notice');
			return false;
		}

		if(!acymailing_uploadFile($importFile['tmp_name'], $uploadPath.$attachment->filename)){
			if(!move_uploaded_file($importFile['tmp_name'], $uploadPath.$attachment->filename)){
				acymailing_enqueueMessage(acymailing_translation_sprintf('FAIL_UPLOAD', '<b><i>'.htmlspecialchars($importFile['tmp_name'], ENT_COMPAT, 'UTF-8').'</i></b>', '<b><i>'.htmlspecialchars($uploadPath.$attachment->filename, ENT_COMPAT, 'UTF-8').'</i></b>'), 'error');
			}
		}
		return true;
	}

	function finalizeImport(){
		$config = acymailing_config();

		$this->forceconfirm = acymailing_getVar('int', 'import_confirmed');
		$this->generatename = acymailing_getVar('int', 'generatename');
		$this->importblocked = acymailing_getVar('int', 'importblocked');
		$this->overwrite = acymailing_getVar('int', 'overwriteexisting');

		$newConfig = new stdClass();
		$paramTmp = array();
		if($this->forceconfirm == 1) $paramTmp[] = 'import_confirmed';
		if($this->generatename == 1) $paramTmp[] = 'generatename';
		if($this->importblocked == 1) $paramTmp[] = 'importblocked';
		if($this->overwrite == 1) $paramTmp[] = 'overwriteexisting';

		$importParams = 'import_params';
		$newConfig->$importParams = implode(',', $paramTmp);
		$config->save($newConfig);

		$filename = strtolower(acymailing_getVar('cmd', 'filename'));
		$extension = '.'.acymailing_fileGetExt($filename);
		$filename = str_replace(array('.', ' '), '_', substr($filename, 0, strpos($filename, $extension))).$extension;
		$uploadPath = ACYMAILING_MEDIA.'import'.DS.$filename;

		if(!file_exists($uploadPath)){
			acymailing_enqueueMessage('Uploaded file not found: '.$uploadPath, 'error');
			return;
		}

		$importColumns = acymailing_getVar('string', 'import_columns');
		if(empty($importColumns)){
			acymailing_enqueueMessage('Columns not found', 'error');
			return false;
		}
		$columns = explode(',', $importColumns);
		$acyColumns = acymailing_getColumns('#__acymailing_subscriber');
		foreach($columns as $oneColumn){
			if($oneColumn == 1 || $oneColumn == 'listids' || $oneColumn == 'listname' || isset($acyColumns[$oneColumn])) continue; // Ignored or existing column
			$checkColumn = preg_replace('#[^A-Za-z0-9_]#Uis', '', $oneColumn);
			if(empty($checkColumn)){
				acymailing_enqueueMessage('Invalid field name: '.$oneColumn, 'error');
				return false;
			}
			$oneColumn = $checkColumn;

			if(!acymailing_level(3)){ // Make sure we can't create a custom field
				acymailing_enqueueMessage(acymailing_translation('EXTRA_FIELDS').' '.acymailing_translation('ONLY_FROM_ENTERPRISE'), 'error');
				return false;
			}

			if(empty($ordering)){
				$ordering = acymailing_loadResult('SELECT MAX(ordering) FROM #__acymailing_fields');
			}
			$ordering++;
			acymailing_query('ALTER TABLE `#__acymailing_subscriber` ADD `'.acymailing_secureField(strtolower($oneColumn)).'` TEXT NOT NULL DEFAULT ""');
			$query = "INSERT INTO `#__acymailing_fields` (`fieldname`, `namekey`, `type`, `value`, `published`, `ordering`, `options`, `core`, `required`, `backend`, `frontcomp`, `default`, `listing`, `frontlisting`, `frontform`) VALUES
			(".acymailing_escapeDB($oneColumn).", ".acymailing_escapeDB(strtolower($oneColumn)).", 'text', '', 1, ".intval($ordering).", '', 0, 0, 1, 0, '',0,0,1);";
			acymailing_query($query);
		}

		$contentFile = file_get_contents($uploadPath);

		if(acymailing_getVar('cmd', 'charsetconvert', '') != ''){
			$encodingHelper = acymailing_get('helper.encoding');
			$contentFile = $encodingHelper->change($contentFile, acymailing_getVar('cmd', 'charsetconvert'), 'UTF-8');
		}

		$cutContent = str_replace(array("\r\n", "\r"), "\n", $contentFile);
		$allLines = explode("\n", $cutContent);

		$listSeparators = array("\t", ';', ',');
		$separator = ',';
		foreach($listSeparators as $sep){
			if(strpos($allLines[0], $sep) !== false){
				$separator = $sep;
				break;
			}
		}
		$importColumns = str_replace(',', $separator, $importColumns);

		if(strpos($allLines[0], '@')){
			$contentFile = $importColumns."\n".$contentFile;
		}else{
			$allLines[0] = $importColumns;
			$contentFile = implode("\n", $allLines);
		}

		$this->_handleContent($contentFile);
		$this->_displaySubscribedResult();

		unlink($uploadPath);
		$this->_cleanImportFolder();
	}

	public function _cleanImportFolder(){
		
		$files = acymailing_getFiles(ACYMAILING_MEDIA.'import', '.', false, true, array());
		foreach($files as $oneFile){
			if(acymailing_fileGetExt($oneFile) != 'csv') continue;
			if(filectime($oneFile) < time() - 86400) unlink($oneFile);
		}
	}

	public function _handleContent(&$contentFile){
		$success = true;

		$contentFile = str_replace(array("\r\n", "\r"), "\n", $contentFile);
		$importLines = explode("\n", $contentFile);

		$i = 0;
		$this->header = '';
		$this->allSubid = array();
		while(empty($this->header) && $i < 10){
			$this->header = trim($importLines[$i]);
			$i++;
		}

		if(strpos($this->header, '@') && !strpos($this->header, ',') && !strpos($this->header, ';') && !strpos($this->header, "\t")){
			$this->header = 'email';
			$i--;
		}

		if(!$this->_autoDetectHeader()){
			acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_HEADER', htmlspecialchars($this->header, ENT_COMPAT, 'UTF-8')), 'error');
			acymailing_enqueueMessage(acymailing_translation('IMPORT_EMAIL'), 'error');
			acymailing_enqueueMessage(acymailing_translation('IMPORT_EXAMPLE'), 'error');
			return false;
		}

		$numberColumns = count($this->columns);

		$userHelper = acymailing_get('helper.user');

		$encodingHelper = acymailing_get('helper.encoding');

		$importUsers = array();

		$errorLines = array();

		$countUsersBeforeImport = acymailing_loadResult('SELECT COUNT(subid) FROM `#__acymailing_subscriber`');

		$listClass = acymailing_get('class.list');
		$allLists = $listClass->getLists('name');

		while(isset($importLines[$i])){
			if(strpos($importLines[$i], '"') !== false){
				$data = array();
				$j = $i + 1;
				$position = -1;

				while($j < ($i + 30)){

					$quoteOpened = substr($importLines[$i], $position + 1, 1) == '"';

					if($quoteOpened){
						$nextQuotePosition = strpos($importLines[$i], '"', $position + 2);
						while($nextQuotePosition !== false && $nextQuotePosition + 1 != strlen($importLines[$i]) && substr($importLines[$i], $nextQuotePosition + 1, 1) != $this->separator){
							$nextQuotePosition = strpos($importLines[$i], '"', $nextQuotePosition + 1);
						}
						if($nextQuotePosition === false){
							if(!isset($importLines[$j])) break;

							$importLines[$i] .= "\n".$importLines[$j];
							$importLines[$i] = rtrim($importLines[$i], $this->separator);
							unset($importLines[$j]);
							$j++;
							continue;
						}else{

							if(strlen($importLines[$i]) - 1 == $nextQuotePosition){
								$data[] = substr($importLines[$i], $position + 1);
								break;
							}
							$data[] = substr($importLines[$i], $position + 1, $nextQuotePosition + 1 - ($position + 1));
							$position = $nextQuotePosition + 1;
						}
					}else{
						$nextSeparatorPosition = strpos($importLines[$i], $this->separator, $position + 1);
						if($nextSeparatorPosition === false){
							$data[] = substr($importLines[$i], $position + 1);
							break;
						}else{ // If found the next separator, add the value in $data and change the position
							$data[] = substr($importLines[$i], $position + 1, $nextSeparatorPosition - ($position + 1));
							$position = $nextSeparatorPosition;
						}
					}
				}

				$importLines = array_merge($importLines);
			}else{
				$data = explode($this->separator, rtrim(trim($importLines[$i]), $this->separator));
			}

			if(!empty($this->removeSep)){
				for($b = $numberColumns + $this->removeSep - 1; $b >= $numberColumns; $b--){
					if(isset($data[$b]) AND (strlen($data[$b]) == 0 || $data[$b] == ' ')){
						unset($data[$b]);
					}
				}
			}

			$i++;
			if(empty($importLines[$i - 1])) continue;

			$this->totalTry++;
			if(count($data) > $numberColumns){
				$copy = $data;
				foreach($copy as $oneelem => $oneval){
					if(!empty($oneval[0]) AND $oneval[0] == '"' AND $oneval[strlen($oneval) - 1] != '"' AND isset($copy[$oneelem + 1]) AND $copy[$oneelem + 1][strlen($copy[$oneelem + 1]) - 1] == '"'){
						$data[$oneelem] = $copy[$oneelem].$this->separator.$copy[$oneelem + 1];
						unset($data[$oneelem + 1]);
					}
				}
				$data = array_values($data);
			}

			if(count($data) < $numberColumns){
				for($a = count($data); $a < $numberColumns; $a++){
					$data[$a] = '';
				}
			}

			if(count($data) != $numberColumns){
				$success = false;
				static $errorcount = 0;
				if(empty($errorcount)){
					acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_ARGUMENTS', $numberColumns), 'error');
				}
				$errorcount++;
				if($errorcount < 20){
					acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_ERRORLINE', '<b><i>'.htmlspecialchars($importLines[$i - 1], ENT_COMPAT, 'UTF-8').'</i></b>'), 'notice');
				}elseif($errorcount == 20){
					acymailing_enqueueMessage('...', 'notice');
				}

				if($this->totalTry == 1) return false;
				if(empty($errorLines)) $errorLines[] = $importLines[0];
				$errorLines[] = $importLines[$i - 1];
				continue;
			}

			$newUser = new stdClass();

			$emailKey = array_search('email', $this->columns);
			$newUser->email = trim(strip_tags($data[$emailKey]), '\'" ');
			if(!empty($newUser->email)) $newUser->email = acymailing_punycode($newUser->email);
			$newUser->email = trim(str_replace(array(' ', "\t"), '', $encodingHelper->change($newUser->email, 'UTF-8', 'ISO-8859-1')));
			if(!$userHelper->validEmail($newUser->email)){
				$success = false;
				static $errorcountfail = 0;
				$errorcountfail++;
				if($errorcountfail < 10){
					acymailing_enqueueMessage(acymailing_translation_sprintf('NOT_VALID_EMAIL', '<b><i>'.htmlspecialchars($newUser->email, ENT_COMPAT | ENT_IGNORE, 'UTF-8').'</i></b>').' | '.($i - 1).' : '.$importLines[$i - 1], 'notice');
				}elseif($errorcountfail == 10){
					acymailing_enqueueMessage('...', 'notice');
				}
				if(empty($errorLines)) $errorLines[] = $importLines[0];
				$errorLines[] = $importLines[$i - 1];
				continue;
			}

			foreach($data as $num => $value){
				if($num == $emailKey) continue;

				$field = $this->columns[$num];

				if($field == 1) continue;

				if($field == 'listids'){
					$liststosub = explode('-', trim($value, '\'" 	'));
					foreach($liststosub as $onelistid){
						$this->importUserInLists[intval(trim($onelistid))][] = acymailing_escapeDB($newUser->email);
					}
					continue;
				}

				if($field == 'listname'){
					$liststosub = explode('-', trim($value, '\'" 	'));
					foreach($liststosub as $onelistName){
						if(empty($onelistName)) continue;
						$onelistName = trim($onelistName);
						if(empty($allLists[$onelistName])){
							$newList = new stdClass();
							$newList->name = $onelistName;
							$newList->published = 1;
							$colors = array('#3366ff', '#7240A4', '#7A157D', '#157D69', '#ECE649');
							$newList->color = $colors[rand(0, count($colors) - 1)];
							$listid = $listClass->save($newList);
							$newList->listid = $listid;
							$allLists[$onelistName] = $newList;
						}
						$this->importUserInLists[intval($allLists[$onelistName]->listid)][] = acymailing_escapeDB($newUser->email);
					}
					continue;
				}

				if($value == 'null'){
					$newUser->$field = '';
				}else{
					$newUser->$field = trim(strip_tags($value), '\'" 	');
				}
			}

			unset($newUser->subid);
			unset($newUser->userid);

			$importUsers[] = $newUser;
			$this->totalValid++;

			if($this->totalValid % 50 == 0){
				$this->_insertUsers($importUsers);
				$importUsers = array();
			}
		}

		if(!empty($errorLines)){
			$filename = strtolower(acymailing_getVar('cmd', 'filename', ''));
			if(!empty($filename)){
				$extension = '.'.acymailing_fileGetExt($filename);
				$filename = str_replace(array('.', ' '), '_', substr($filename, 0, strpos($filename, $extension))).$extension;
				$errorFile = implode("\n", $errorLines);
				acymailing_writeFile(ACYMAILING_MEDIA.'import'.DS.'error_'.$filename, $errorFile);
				acymailing_enqueueMessage('<a target="_blank" href="'.acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'data&task=downloadimport').'&filename=error_'.preg_replace('#\.[^.]*$#', '', $filename).'" >'.acymailing_translation('ACY_DOWNLOAD_IMPORT_ERRORS').'</a>', 'notice');
			}
		}
		$this->_insertUsers($importUsers);

		$countUsersAfterImport = acymailing_loadResult('SELECT COUNT(subid) FROM `#__acymailing_subscriber`');
		$this->totalInserted = $countUsersAfterImport - $countUsersBeforeImport;

		if($this->dispresults){
			acymailing_enqueueMessage(acymailing_translation_sprintf('ACY_IMPORT_REPORT', $this->totalTry, $this->totalInserted, $this->totalTry - $this->totalValid, $this->totalValid - $this->totalInserted));
		}

		$this->_subscribeUsers();
		return $success;
	}

	function _subscribeUsers(){

		if(empty($this->allSubid)) return true;

		$subdate = time();

		$listClass = acymailing_get('class.list');

		if(empty($this->importUserInLists)){
			$lists = $this->getImportedLists();

			if(acymailing_level(3)){
				$campaignClass = acymailing_get('helper.campaign');
				$listCampaign = $listClass->getCampaigns(array_keys($lists));
			}else{
				$listCampaign = array();
			}

			foreach($lists as $listid => $val){
				if(empty($val)) continue;

				if($val == -1){
					$dateColumn = 'unsubdate';
					$status = -1;
				}else{
					$dateColumn = 'subdate';
					$status = 1;
				}

				$nbsubscribed = 0;
				$listid = (int)$listid;
				$query = 'INSERT IGNORE INTO '.acymailing_table('listsub').' (listid,subid,'.$dateColumn.',status) VALUES ';
				$b = 0;
				$currentSubids = array();
				foreach($this->allSubid as $subid){
					$currentSubids[] = $subid;
					$b++;

					if($b > 200){
						$query = rtrim($query, ',');
						if($val == -1){
							$query .= ' ON DUPLICATE KEY UPDATE status = -1';
							$nbsubscribed = -acymailing_loadResult('SELECT COUNT(*) FROM #__acymailing_listsub WHERE listid = '.$listid.' AND status != -1 AND subid IN ('.implode(',', $currentSubids).')');
						}
						$affected = acymailing_query($query);
						$nbsubscribed += intval($affected);
						$b = 0;
						$currentSubids = array();
						$query = 'INSERT IGNORE INTO '.acymailing_table('listsub').' (listid,subid,'.$dateColumn.',status) VALUES ';
					}

					$query .= "($listid,$subid,$subdate,$status),";
				}
				$query = rtrim($query, ',');
				if($val == -1){
					$query .= ' ON DUPLICATE KEY UPDATE status = -1';
					if(!empty($currentSubids)){
						$nbsubscribed = -acymailing_loadResult('SELECT COUNT(*) FROM #__acymailing_listsub WHERE listid = '.$listid.' AND status != -1 AND subid IN ('.implode(',', $currentSubids).')');
					}
				}
				$affected = acymailing_query($query);
				$nbsubscribed += intval($affected);

				if(isset($this->subscribedUsers[$listid])){
					$this->subscribedUsers[$listid]->nbusers += $nbsubscribed;
				}else{
					$myList = $listClass->get($listid);
					$myList->status = $val;
					$this->subscribedUsers[$listid] = $myList;
					$this->subscribedUsers[$listid]->nbusers = $nbsubscribed;
				}

				if(in_array($val, array(2, -1)) && !empty($listCampaign[$listid])){
					$function = $val == 2 ? 'autoSubCampaign' : 'unsubCampaign';
					foreach($listCampaign[$listid] as $campaignId){
						$campaignClass->$function($this->allSubid, $campaignId);
					}
				}
			}
		}else{
			foreach($this->importUserInLists as $listid => $arrayEmails){
				if(empty($listid)) continue;

				$listid = (int)$listid;
				$query = 'INSERT IGNORE INTO '.acymailing_table('listsub').' (listid,subid,subdate,status) ';
				$query .= "SELECT $listid,`subid`,$subdate,1 FROM ".acymailing_table('subscriber')." WHERE `email` IN (";
				$query .= implode(',', $arrayEmails).')';
				$nbsubscribed = acymailing_query($query);
				$nbsubscribed = intval($nbsubscribed);

				if(isset($this->subscribedUsers[$listid])){
					$this->subscribedUsers[$listid]->nbusers += $nbsubscribed;
				}else{
					$myList = $listClass->get($listid);
					$this->subscribedUsers[$listid] = $myList;
					$this->subscribedUsers[$listid]->nbusers = $nbsubscribed;
				}
			}
		}

		return true;
	}

	function _displaySubscribedResult(){
		foreach($this->subscribedUsers as $myList){
			if(empty($myList->status) || $myList->status != -1){
				acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_SUBSCRIBE_CONFIRMATION', $myList->nbusers, '<b><i>'.$myList->name.'</i></b>'));
			}else{
				acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_UNSUBSCRIBE_CONFIRMATION', $myList->nbusers, '<b><i>'.$myList->name.'</i></b>'));
			}
		}
	}

	function _insertUsers($users){
		if(empty($users)) return true;

		$importedCols = array_keys(get_object_vars($users[0]));
		if($this->forceconfirm) $importedCols[] = 'confirmed';
		if($this->importblocked) $importedCols[] = 'enabled';

		foreach($users as $a => $oneUser){
			$this->_checkData($users[$a]);
		}

		$columns = reset($users);
		$colNames = array_keys(get_object_vars($columns));

		acymailing_trigger('onAcyBeforeUserImport', array(&$users));

		$query = 'INSERT'.($this->overwrite ? '' : ' IGNORE').' INTO '.acymailing_table('subscriber').' (`'.implode('`,`', $colNames).'`) VALUES (';
		$values = array();
		$allemails = array();
		foreach($users as $a => $oneUser){
			$value = array();
			acymailing_trigger('onAcyBeforeUserImport', array(&$oneUser));
			foreach($oneUser as $map => $oneValue){
				if($map == 'enabled' && !empty($this->importblocked) && $this->importblocked == true){
					$value[] = 0;
				}elseif($map != 'subid'){
					$value[] = acymailing_escapeDB($oneValue);
				}else{
					$value[] = $oneValue;
				}
				if($map == 'email'){
					$allemails[] = acymailing_escapeDB($oneValue);
				}
			}
			$values[] = implode(',', $value);
		}
		$query .= implode('),(', $values).')';
		if($this->overwrite){
			$query .= ' ON DUPLICATE KEY UPDATE ';
			foreach($importedCols as &$oneColumn){
				$oneColumn = '`'.$oneColumn.'`=VALUES(`'.$oneColumn.'`)';
			}
			$query .= implode(',', $importedCols);
		}

		acymailing_query($query);

		acymailing_trigger('onAcyAfterUserImport', array(&$users));

		$this->allSubid = array_merge($this->allSubid, acymailing_loadResultArray('SELECT subid FROM '.acymailing_table('subscriber').' WHERE email IN ('.implode(',', $allemails).')'));

		return true;
	}


	function _checkData(&$user){
		if(empty($user->created)){
			$user->created = time();
		}elseif(!is_numeric($user->created)) $user->created = strtotime($user->created);

		if(!isset($user->accept) || strlen($user->accept) == 0) $user->accept = 1;
		if(!isset($user->enabled) || strlen($user->enabled) == 0) $user->enabled = 1;
		if(!isset($user->html) || strlen($user->html) == 0) $user->html = 1;
		if(empty($user->source)) $user->source = 'import';

		if(!empty($user->confirmed_date) && !is_numeric($user->confirmed_date)) $user->confirmed_date = strtotime($user->confirmed_date);
		if(!empty($user->lastclick_date) && !is_numeric($user->lastclick_date)) $user->lastclick_date = strtotime($user->lastclick_date);
		if(!empty($user->lastopen_date) && !is_numeric($user->lastopen_date)) $user->lastopen_date = strtotime($user->lastopen_date);
		if(!empty($user->lastsent_date) && !is_numeric($user->lastsent_date)) $user->lastsent_date = strtotime($user->lastsent_date);


		if(empty($user->name) AND $this->generatename) $user->name = ucwords(trim(str_replace(array('.', '_', '-', 1, 2, 3, 4, 5, 6, 7, 8, 9, 0), ' ', substr($user->email, 0, strpos($user->email, '@')))));

		if((!isset($user->confirmed) || strlen($user->confirmed) == 0) AND $this->forceconfirm) $user->confirmed = 1;

		if(empty($user->key)) $user->key = acymailing_generateKey(14);
	}


	function _autoDetectHeader(){
		$this->separator = ',';

		$this->header = str_replace("\xEF\xBB\xBF", "", $this->header);

		$listSeparators = array("\t", ';', ',');
		foreach($listSeparators as $sep){
			if(strpos($this->header, $sep) !== false){
				$this->separator = $sep;
				break;
			}
		}


		$this->columns = explode($this->separator, $this->header);

		for($i = count($this->columns) - 1; $i >= 0; $i--){
			if(strlen($this->columns[$i]) == 0){
				unset($this->columns[$i]);
				$this->removeSep++;
			}
		}

		$columns = acymailing_getColumns('#__acymailing_subscriber');
		foreach($columns as $i => $oneColumn){
			$columns[strtolower($i)] = $oneColumn;
		}

		foreach($this->columns as $i => $oneColumn){
			$this->columns[$i] = strtolower(trim($oneColumn, '\'" '));
			if(in_array($this->columns[$i], array('listids', 'listname'))) continue;
			if(!isset($columns[$this->columns[$i]]) && $this->columns[$i] != 1){
				acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_ERROR_FIELD', '<b><i>'.htmlspecialchars($this->columns[$i], ENT_COMPAT, 'UTF-8').'</i></b>', implode(' | ', array_diff(array_keys($columns), array('subid', 'userid', 'key')))), 'error');
				return false;
			}
		}

		if(!in_array('email', $this->columns)) return false;

		return true;
	}

	function joomla(){
		$query = 'UPDATE IGNORE '.acymailing_table($this->cmsUserVars->table, false).' as b, '.acymailing_table('subscriber').' as a SET a.email = b.'.$this->cmsUserVars->email.', a.name = b.'.$this->cmsUserVars->name.', a.enabled = 1 - b.block WHERE a.userid = b.'.$this->cmsUserVars->id.' AND a.userid > 0';
		$nbUpdated = acymailing_query($query);

		$query = 'UPDATE IGNORE '.acymailing_table($this->cmsUserVars->table, false).' as b, '.acymailing_table('subscriber').' as a SET a.userid = b.'.$this->cmsUserVars->id.' WHERE a.email = b.'.$this->cmsUserVars->email;
		$affected = acymailing_query($query);
		$nbUpdated += intval($affected);

		acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_UPDATE', $nbUpdated));

		$query = 'SELECT subid FROM '.acymailing_table('subscriber').' as a LEFT JOIN '.acymailing_table($this->cmsUserVars->table, false).' as b on a.userid = b.'.$this->cmsUserVars->id.' WHERE b.'.$this->cmsUserVars->id.' IS NULL AND a.userid > 0';
		$deletedSubid = acymailing_loadResultArray($query);

		$query = 'SELECT subid FROM '.acymailing_table('subscriber').' as a LEFT JOIN '.acymailing_table($this->cmsUserVars->table, false).' as b on a.email = b.'.$this->cmsUserVars->email.' WHERE b.'.$this->cmsUserVars->id.' IS NULL AND a.userid > 0';
		$deletedSubid = array_merge(acymailing_loadResultArray($query), $deletedSubid);

		if(!empty($deletedSubid)){
			$userClass = acymailing_get('class.subscriber');
			$deletedUsers = $userClass->delete($deletedSubid);
			acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_DELETE', $deletedUsers));
		}

		$time = time();
		$query = 'INSERT IGNORE INTO '.acymailing_table('subscriber').' (`email`,`name`,`confirmed`,`userid`,`created`,`enabled`,`accept`,`html`) SELECT `'.$this->cmsUserVars->email.'`,`'.$this->cmsUserVars->name.'`,1-`'.$this->cmsUserVars->blocked.'`,`'.$this->cmsUserVars->id.'`,UNIX_TIMESTAMP(`'.$this->cmsUserVars->registered.'`),1-`'.$this->cmsUserVars->blocked.'`,1,1 FROM '.acymailing_table($this->cmsUserVars->table, false);
		$insertedUsers = acymailing_query($query);

		acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_NEW', $insertedUsers));

		$lists = $this->getImportedLists();
		$listsSubscribe = array();
		foreach($lists as $listid => $val){
			if(!empty($val)) $listsSubscribe[] = (int)$listid;
		}

		if(empty($listsSubscribe)) return true;

		if(acymailing_level(3)){
			$listClass = acymailing_get('class.list');
			$campaignClass = acymailing_get('helper.campaign');
			$listCampaign = $listClass->getCampaigns(array_keys($lists));
			foreach($lists as $listid => $val){
				if($val == 2 && !empty($listCampaign[$listid])){
					$query = 'SELECT sub.subid FROM #__acymailing_subscriber sub LEFT JOIN #__acymailing_listsub list ON sub.subid=list.subid AND list.listid='.intval($listid).' WHERE list.subid IS NULL AND sub.userid > 0 ';
					$listSubidNotInList = acymailing_loadResultArray($query);
					if(empty($listSubidNotInList)) continue;
					foreach($listCampaign[$listid] as $campaignId){
						$campaignClass->autoSubCampaign($listSubidNotInList, $campaignId);
					}
				}
			}
		}

		$query = 'INSERT IGNORE INTO '.acymailing_table('listsub').' (`listid`,`subid`,`subdate`,`status`) ';
		$query .= 'SELECT a.`listid`, b.`subid` ,'.$time.',1 FROM '.acymailing_table('list').' as a, '.acymailing_table('subscriber').' as b  WHERE a.`listid` IN ('.implode(',', $listsSubscribe).') AND b.`userid` > 0';
		$nbsubscribed = acymailing_query($query);
		acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_SUBSCRIPTION', $nbsubscribed));

		return true;
	}

	function acajoom(){
		$query = 'INSERT IGNORE INTO '.acymailing_table('subscriber').' (email,name,confirmed,created,enabled,accept,html) SELECT email,name,confirmed,UNIX_TIMESTAMP(`subscribe_date`),1-blacklist,1,receive_html FROM '.acymailing_table('acajoom_subscribers', false);
		$insertedUsers = acymailing_query($query);

		acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_NEW', $insertedUsers));

		if(acymailing_getVar('int', 'acajoom_lists', 0) == 1) $this->_importAcajoomLists();

		$query = 'SELECT b.subid FROM '.acymailing_table('acajoom_subscribers', false).' as a JOIN '.acymailing_table('subscriber').' as b on a.email = b.email';
		$this->allSubid = acymailing_loadResultArray($query);
		$this->_subscribeUsers();
		$this->_displaySubscribedResult();

		return true;
	}

	function _importYancLists(){
		$query = 'SELECT `id`, `name`, `description`, `state` as `published` FROM `#__yanc_letters`';
		$yancLists = acymailing_loadObjectList($query, 'id');

		$query = 'SELECT `listid`, `alias` FROM '.acymailing_table('list').' WHERE `alias` IN (\'yanclist'.implode('\',\'yanclist', array_keys($yancLists)).'\')';
		$joomLists = acymailing_loadObjectList($query, 'alias');

		$listClass = acymailing_get('class.list');
		$time = time();

		foreach($yancLists as $oneList){
			$oneList->alias = 'yanclist'.$oneList->id;
			$oneList->userid = acymailing_currentUserId();

			$yancListId = $oneList->id;
			if(isset($joomLists[$oneList->alias])){
				$joomListId = $joomLists[$oneList->alias]->listid;
			}else{
				unset($oneList->id);
				$joomListId = $listClass->save($oneList);
				acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_LIST', '<b><i>'.$oneList->name.'</i></b>'));
			}

			$querySelect = 'SELECT DISTINCT c.subid,'.$joomListId.','.$time.',1 FROM `#__yanc_subscribers` as a ';
			$querySelect .= 'JOIN '.acymailing_table('subscriber').' as c on a.email = c.email ';
			$querySelect .= 'WHERE a.lid = '.$yancListId.' AND a.state = 1 AND c.subid > 0';
			$queryInsert = 'INSERT IGNORE INTO '.acymailing_table('listsub').' (subid,listid,subdate,status) ';

			$affected = acymailing_query($queryInsert.$querySelect);

			acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_SUBSCRIBE_CONFIRMATION', $affected, '<b><i>'.$oneList->name.'</i></b>'));
		}

		return true;
	}

	private function _importccNewsletterNews(){
		$replacements = array();
		$replacements['[unsubscribe link]'] = '{unsubscribe}'.acymailing_translation('UNSUBSCRIBE').'{/unsubscribe}';
		$replacements['[view online link]'] = '{readonline}'.acymailing_translation('VIEW_ONLINE').'{/readonline}';
		$replacements['[sitename]'] = '{config:sitename}';
		$replacements['[name]'] = '{subtag:name}';

		$fields = array();
		$fields['groupid'] = '`groupid`';

		$fields['subject'] = '`name`';
		$fields['body'] = '`body`';
		$fields['published'] = '`enabled`';
		$fields['senddate'] = 'UNIX_TIMESTAMP(`lastsentdate`)';
		$fields['type'] = '"news"';
		$fields['visible'] = '1';
		$fields['html'] = '1';


		$query = 'SELECT ';
		foreach($fields as $as => $select){
			$query .= $select.' as '.$as.',';
		}
		$query = rtrim($query, ',');
		$query .= ' FROM #__ccnewsletter_newsletters WHERE `enabled` >= 0';
		$ccNewsletters = acymailing_loadObjectList($query);

		if(empty($ccNewsletters)) return true;

		$mailClass = acymailing_get('class.mail');
		$lists = array();
		foreach($ccNewsletters as $oneNewsletter){
			$ccList = $oneNewsletter->groupid;
			unset($oneNewsletter->groupid);

			$oneNewsletter->subject = str_replace(array_keys($replacements), $replacements, $oneNewsletter->subject);
			$oneNewsletter->body = str_replace(array_keys($replacements), $replacements, $oneNewsletter->body);
			$acyId = $mailClass->save($oneNewsletter);
			$lists[$acyId] = 'ccnewsletterlist'.$ccList;
		}

		acymailing_enqueueMessage(acymailing_translation_sprintf('NB_IMPORT_NEWSLETTER', '<b>'.count($lists).'</b>'));

		$query = 'SELECT listid, alias FROM #__acymailing_list WHERE alias LIKE "ccnewsletterlist%"';
		$acylists = acymailing_loadObjectList($query, 'alias');

		$equ = array();
		foreach($lists as $mailid => $cclist){
			if(empty($acylists[$cclist])) continue;
			$equ[] = $mailid.','.$acylists[$cclist]->listid;
		}

		if(empty($equ)) return true;
		$query = 'INSERT IGNORE INTO #__acymailing_listmail (`mailid`, `listid`) VALUES ('.implode('),(', $equ).')';
		acymailing_query($query);

		return true;
	}

	private function _importccNewsletterLists(){
		$query = 'SELECT `id`, `group_name` as `name`, `public` as `visible`, `enabled` as `published` FROM '.acymailing_table('ccnewsletter_groups', false).' ORDER BY `ordering` ASC';
		$compLists = acymailing_loadObjectList($query, 'id');

		$query = 'SELECT `listid`, `alias` FROM '.acymailing_table('list').' WHERE `alias` IN (\'ccnewsletterlist'.implode('\',\'ccnewsletterlist', array_keys($compLists)).'\')';
		$joomLists = acymailing_loadObjectList($query, 'alias');

		$listClass = acymailing_get('class.list');

		foreach($compLists as $oneList){
			$oneList->alias = 'ccnewsletterlist'.$oneList->id;
			$compListId = $oneList->id;
			if(isset($joomLists[$oneList->alias])){
				$joomListId = $joomLists[$oneList->alias]->listid;
			}else{
				unset($oneList->id);
				$joomListId = $listClass->save($oneList);
				acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_LIST', '<b><i>'.$oneList->name.'</i></b>'));
			}

			$querySelect = 'SELECT DISTINCT c.subid,'.$joomListId.',UNIX_TIMESTAMP(b.`sdate`),1 FROM '.acymailing_table('ccnewsletter_g_to_s', false).' as a ';
			$querySelect .= 'JOIN '.acymailing_table('ccnewsletter_subscribers', false).' as b on a.subscriber_id = b.id ';
			$querySelect .= 'JOIN '.acymailing_table('subscriber').' as c on b.email = c.email ';
			$querySelect .= 'WHERE a.group_id = '.$compListId.' AND c.subid > 0';
			$queryInsert = 'INSERT IGNORE INTO '.acymailing_table('listsub').' (subid,listid,subdate,status) ';

			$affected = acymailing_query($queryInsert.$querySelect);

			acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_SUBSCRIBE_CONFIRMATION', $affected, '<b><i>'.$oneList->name.'</i></b>'));
		}

		return true;
	}

	private function _importjnewsNews(){
		$replacements = array();
		$replacements['#{tag:unsubscribe}#i'] = '{unsubscribe}'.acymailing_translation('UNSUBSCRIBE').'{/unsubscribe}';
		$replacements['#{tag:subscriptions}#i'] = '{modify}'.acymailing_translation('MODIFY_SUBSCRIPTION').'{/modify}';
		$replacements['#{tag:viewonline[^}]*}#i'] = '{readonline}'.acymailing_translation('VIEW_ONLINE').'{/readonline}';
		$replacements['#{tag:confirm}#i'] = '{confirm}'.acymailing_translation('CONFIRM_SUBSCRIPTION').'{/confirm}';
		$replacements['#{tag:firstname}#i'] = '{subtag:name|part:first}';
		$replacements['#{tag:name}#i'] = '{subtag:name}';
		$replacements['#{tag:email}#i'] = '{subtag:email}';
		$replacements['#{tag:title}#i'] = '{mail:subject}';
		$replacements['#{tag:issuenb}#i'] = '{mail:mailid}';

		$fields = array();
		$fields['id'] = '`id`';
		$fields['subject'] = '`subject`';
		$fields['body'] = '`htmlcontent`';
		$fields['altbody'] = '`textonly`';
		$fields['published'] = '`published`';
		$fields['senddate'] = '`send_date`';
		$fields['created'] = '`createdate`';
		$fields['userid'] = '`author_id`';
		$fields['type'] = '"news"';
		$fields['visible'] = '`visible`';
		$fields['html'] = '`html`';

		$query = 'SELECT ';
		foreach($fields as $as => $select){
			$query .= $select.' as '.$as.',';
		}
		$query = rtrim($query, ',');
		$query .= ' FROM #__jnews_mailings WHERE `mailing_type` = 1';
		$jnewsNewsletters = acymailing_loadObjectList($query);

		if(empty($jnewsNewsletters)) return true;

		$mailClass = acymailing_get('class.mail');
		$mailids = array();
		foreach($jnewsNewsletters as $oneNewsletter){
			$jnewsid = $oneNewsletter->id;
			unset($oneNewsletter->id);

			$oneNewsletter->published = min($oneNewsletter->published, 1);
			$oneNewsletter->subject = preg_replace(array_keys($replacements), $replacements, $oneNewsletter->subject);
			$oneNewsletter->body = preg_replace(array_keys($replacements), $replacements, $oneNewsletter->body);
			$mailids[$jnewsid] = $mailClass->save($oneNewsletter);
		}

		acymailing_enqueueMessage(acymailing_translation_sprintf('NB_IMPORT_NEWSLETTER', '<b>'.count($mailids).'</b>'));

		$query = 'SELECT listid, alias FROM #__acymailing_list WHERE alias LIKE "jnewslist%"';
		$acylists = acymailing_loadObjectList($query, 'alias');

		$query = 'SELECT list_id,mailing_id FROM #__jnews_listmailings WHERE mailing_id IN ('.implode(',', array_keys($mailids)).')';
		$jnewslistmailings = acymailing_loadObjectList($query);

		$equ = array();
		foreach($jnewslistmailings as $jnewsids){
			if(empty($acylists['jnewslist'.$jnewsids->list_id])) continue;
			if(empty($mailids[$jnewsids->mailing_id])) continue;
			$equ[] = $mailids[$jnewsids->mailing_id].','.$acylists['jnewslist'.$jnewsids->list_id]->listid;
		}

		if(empty($equ)) return true;
		$query = 'INSERT IGNORE INTO #__acymailing_listmail (`mailid`, `listid`) VALUES ('.implode('),(', $equ).')';
		acymailing_query($query);

		return true;
	}

	private function _importjnewsLists(){
		$query = 'SELECT `id`, `list_name` as `name`, `hidden` as `visible`, `list_desc` as `description`, `published`, `owner` as `userid` FROM '.acymailing_table('jnews_lists', false);
		$jnewsLists = acymailing_loadObjectList($query, 'id');

		$query = 'SELECT `listid`, `alias` FROM '.acymailing_table('list').' WHERE `alias` IN (\'jnewslist'.implode('\',\'jnewslist', array_keys($jnewsLists)).'\')';
		$joomLists = acymailing_loadObjectList($query, 'alias');

		$listClass = acymailing_get('class.list');

		foreach($jnewsLists as $oneList){
			$oneList->alias = 'jnewslist'.$oneList->id;
			$jnewsListId = $oneList->id;
			if(isset($joomLists[$oneList->alias])){
				$joomListId = $joomLists[$oneList->alias]->listid;
			}else{
				unset($oneList->id);
				$joomListId = $listClass->save($oneList);
				acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_LIST', '<b><i>'.$oneList->name.'</i></b>'));
			}

			$querySelect = 'SELECT DISTINCT c.subid,'.$joomListId.',a.subdate,a.unsubdate,1-(2*a.unsubscribe) FROM '.acymailing_table('jnews_listssubscribers', false).' as a ';
			$querySelect .= 'JOIN '.acymailing_table('jnews_subscribers', false).' as b on a.subscriber_id = b.id ';
			$querySelect .= 'JOIN '.acymailing_table('subscriber').' as c on b.email = c.email ';
			$querySelect .= 'WHERE a.list_id = '.$jnewsListId.' AND c.subid > 0';
			$queryInsert = 'INSERT IGNORE INTO '.acymailing_table('listsub').' (subid,listid,subdate,unsubdate,status) ';

			$affected = acymailing_query($queryInsert.$querySelect);

			acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_SUBSCRIBE_CONFIRMATION', $affected, '<b><i>'.$oneList->name.'</i></b>'));
		}

		return true;
	}

	private function _importAcajoomLists(){
		$query = 'SELECT `id`, `list_name` as `name`, `hidden` as `visible`, `list_desc` as `description`, `published`, `owner` as `userid` FROM '.acymailing_table('acajoom_lists', false);
		$acaLists = acymailing_loadObjectList($query, 'id');

		$query = 'SELECT `listid`, `alias` FROM '.acymailing_table('list').' WHERE `alias` IN (\'acajoomlist'.implode('\',\'acajoomlist', array_keys($acaLists)).'\')';
		$joomLists = acymailing_loadObjectList($query, 'alias');

		$listClass = acymailing_get('class.list');
		$time = time();

		foreach($acaLists as $oneList){
			$oneList->alias = 'acajoomlist'.$oneList->id;
			$acaListId = $oneList->id;
			if(isset($joomLists[$oneList->alias])){
				$joomListId = $joomLists[$oneList->alias]->listid;
			}else{
				unset($oneList->id);
				$joomListId = $listClass->save($oneList);
				acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_LIST', '<b><i>'.$oneList->name.'</i></b>'));
			}

			$querySelect = 'SELECT DISTINCT c.subid,'.$joomListId.','.$time.',1 FROM '.acymailing_table('acajoom_queue', false).' as a ';
			$querySelect .= 'JOIN '.acymailing_table('acajoom_subscribers', false).' as b on a.subscriber_id = b.id ';
			$querySelect .= 'JOIN '.acymailing_table('subscriber').' as c on b.email = c.email ';
			$querySelect .= 'WHERE a.list_id = '.$acaListId.' AND c.subid > 0';
			$queryInsert = 'INSERT IGNORE INTO '.acymailing_table('listsub').' (subid,listid,subdate,status) ';

			$affected = acymailing_query($queryInsert.$querySelect);

			acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_SUBSCRIBE_CONFIRMATION', $affected, '<b><i>'.$oneList->name.'</i></b>'));
		}

		return true;
	}

	function letterman(){
		$time = time();
		$query = 'INSERT IGNORE INTO '.acymailing_table('subscriber').' (`email`,`name`,`confirmed`,`created`,`enabled`,`accept`,`html`) SELECT `subscriber_email`,`subscriber_name`,`confirmed`,UNIX_TIMESTAMP(`subscribe_date`),1,1,1 FROM '.acymailing_table('letterman_subscribers', false);
		$insertedUsers = acymailing_query($query);

		if($insertedUsers == -1){
			$query = 'INSERT IGNORE INTO '.acymailing_table('subscriber').' (`email`,`name`,`confirmed`,`created`,`enabled`,`accept`,`html`) SELECT `email`,`name`,`confirmed`,'.$time.',1,1,1 FROM '.acymailing_table('letterman_subscribers', false);
			$insertedUsers = acymailing_query($query);
			$query = 'SELECT b.subid FROM '.acymailing_table('letterman_subscribers', false).' as a JOIN '.acymailing_table('subscriber').' as b on a.email = b.email';
		}else{
			$query = 'SELECT b.subid FROM '.acymailing_table('letterman_subscribers', false).' as a JOIN '.acymailing_table('subscriber').' as b on a.subscriber_email = b.email';
		}

		acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_NEW', $insertedUsers));

		$this->allSubid = acymailing_loadResultArray($query);
		$this->_subscribeUsers();
		$this->_displaySubscribedResult();

		return true;
	}

	function yanc(){
		$oneSubscriber = acymailing_loadObject('SELECT * FROM #__yanc_subscribers LIMIT 1');
		if(!isset($oneSubscriber->state)){
			acymailing_query("ALTER IGNORE TABLE `#__yanc_subscribers` ADD `state` INT NOT NULL DEFAULT '1'");
		}

		$query = 'INSERT IGNORE INTO '.acymailing_table('subscriber').' (`email`,`name`,`confirmed`,`created`,`enabled`,`accept`,`html`, `ip`) SELECT `email`,`name`,`confirmed`,UNIX_TIMESTAMP(`date`),`state`,1,`html`,`ip` FROM '.acymailing_table('yanc_subscribers', false)." WHERE email LIKE '%@%'";
		$insertedUsers = acymailing_query($query);

		acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_NEW', $insertedUsers));

		if(acymailing_getVar('int', 'yanc_lists', 0) == 1) $this->_importYancLists();

		$query = 'SELECT b.subid FROM '.acymailing_table('yanc_subscribers', false).' as a JOIN '.acymailing_table('subscriber').' as b on a.email = b.email';
		$this->allSubid = acymailing_loadResultArray($query);
		$this->_subscribeUsers();
		$this->_displaySubscribedResult();

		return true;
	}


	function vemod(){
		$time = time();
		$query = "INSERT IGNORE INTO ".acymailing_table('subscriber')." (`email`,`name`,`confirmed`,`created`,`enabled`,`accept`,`html`) SELECT `email`,`name`,1,'.$time.',1,1,`mailformat` FROM `#__vemod_news_mailer_users` WHERE `email` LIKE '%@%' ";
		$insertedUsers = acymailing_query($query);

		acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_NEW', $insertedUsers));

		$query = 'SELECT b.subid FROM `#__vemod_news_mailer_users` as a JOIN '.acymailing_table('subscriber').' as b on a.email = b.email';
		$this->allSubid = acymailing_loadResultArray($query);
		$this->_subscribeUsers();
		$this->_displaySubscribedResult();

		return true;
	}

	function contact(){
		$time = time();
		$query = 'INSERT IGNORE INTO '.acymailing_table('subscriber')." (`email`,`name`,`confirmed`,`created`,`enabled`,`accept`,`html`) SELECT `email_to`,`name`,1,'.$time.',1,1,1 FROM `#__contact_details` WHERE email_to LIKE '%@%'";
		$insertedUsers = acymailing_query($query);

		acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_NEW', $insertedUsers));

		$query = 'SELECT b.subid FROM `#__contact_details` as a JOIN '.acymailing_table('subscriber').' as b on a.email_to = b.email';
		$this->allSubid = acymailing_loadResultArray($query);
		$this->_subscribeUsers();
		$this->_displaySubscribedResult();

		return true;
	}

	function ccnewsletter(){
		$ccfields = acymailing_getColumns('#__ccnewsletter_subscribers');

		$fields = array();
		$fields['email'] = '`email`';
		$fields['name'] = '`name`';
		$fields['confirmed'] = '`enabled`';
		$fields['created'] = 'UNIX_TIMESTAMP(`sdate`)';
		$fields['enabled'] = '`enabled`';
		$fields['accept'] = 1;
		$fields['html'] = isset($ccfields['plainText']) ? '1-`plainText`' : 1;

		$query = 'INSERT IGNORE INTO '.acymailing_table('subscriber').' (`'.implode('`,`', array_keys($fields)).'`) SELECT '.implode(',', $fields).' FROM '.acymailing_table('ccnewsletter_subscribers', false);
		$insertedUsers = acymailing_query($query);

		acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_NEW', $insertedUsers));

		if(acymailing_getVar('int', 'ccNewsletter_lists', 0) == 1) $this->_importccNewsletterLists();
		if(acymailing_getVar('int', 'ccNewsletter_news', 0) == 1) $this->_importccNewsletterNews();


		$query = 'SELECT b.subid FROM '.acymailing_table('ccnewsletter_subscribers', false).' as a JOIN '.acymailing_table('subscriber').' as b on a.email = b.email WHERE b.subid > 0';
		$this->allSubid = acymailing_loadResultArray($query);
		$this->_subscribeUsers();
		$this->_displaySubscribedResult();

		return true;
	}

	function jnews(){
		$query = 'INSERT IGNORE INTO '.acymailing_table('subscriber').' (`email`,`name`,`confirmed`,`created`,`enabled`,`accept`,`html`) SELECT `email`,`name`,`confirmed`,`subscribe_date`, 1-`blacklist`,1,`receive_html` FROM '.acymailing_table('jnews_subscribers', false);
		$insertedUsers = acymailing_query($query);

		acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_NEW', $insertedUsers));

		if(acymailing_getVar('int', 'jnews_lists', 0) == 1) $this->_importjnewsLists();
		if(acymailing_getVar('int', 'jnews_news', 0) == 1) $this->_importjnewsNews();

		$query = 'SELECT b.subid FROM '.acymailing_table('jnews_subscribers', false).' as a JOIN '.acymailing_table('subscriber').' as b on a.email = b.email';
		$this->allSubid = acymailing_loadResultArray($query);
		$this->_subscribeUsers();
		$this->_displaySubscribedResult();

		return true;
	}

	function nspro(){
		$time = time();
		$query = 'INSERT IGNORE INTO '.acymailing_table('subscriber').' (`email`,`name`,`confirmed`,`created`,`enabled`,`accept`,`html`) SELECT `email`,`name`,`confirmed`,UNIX_TIMESTAMP(`datetime`), 1,1,1 FROM '.acymailing_table('nspro_subs', false);
		$insertedUsers = acymailing_query($query);

		acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_NEW', $insertedUsers));

		if(acymailing_getVar('int', 'nspro_lists', 0) == 1) $this->_importnsproLists();

		$query = 'SELECT b.subid FROM '.acymailing_table('nspro_subs', false).' as a JOIN '.acymailing_table('subscriber').' as b on a.email = b.email';
		$this->allSubid = acymailing_loadResultArray($query);
		$this->_subscribeUsers();
		$this->_displaySubscribedResult();

		return true;
	}

	private function _importnsproLists(){

		$query = 'SELECT `id`, `lname` as `name`, 1 as `visible`, `notes` as `description`, `published`, '.intval(acymailing_currentUserId()).' as `userid` FROM '.acymailing_table('nspro_lists', false);
		$nsprolists = acymailing_loadObjectList($query, 'id');

		$query = 'SELECT `listid`, `alias` FROM '.acymailing_table('list').' WHERE `alias` IN (\'nsprolist'.implode('\',\'nsprolist', array_keys($nsprolists)).'\')';
		$joomLists = acymailing_loadObjectList($query, 'alias');

		$listClass = acymailing_get('class.list');

		foreach($nsprolists as $oneList){
			$oneList->alias = 'nsprolist'.$oneList->id;
			$nsproListId = $oneList->id;
			if(isset($joomLists[$oneList->alias])){
				$joomListId = $joomLists[$oneList->alias]->listid;
			}else{
				unset($oneList->id);
				$joomListId = $listClass->save($oneList);
				acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_LIST', '<b><i>'.$oneList->name.'</i></b>'));
			}

			$querySelect = 'SELECT DISTINCT c.subid,'.$joomListId.',c.created,1 FROM '.acymailing_table('nspro_subs', false).' as a ';
			$querySelect .= 'JOIN '.acymailing_table('subscriber').' as c on a.email = c.email ';
			$querySelect .= 'WHERE a.mailing_lists LIKE "'.$nsproListId.'" OR a.mailing_lists LIKE "%,'.$nsproListId.',%" OR a.mailing_lists LIKE "'.$nsproListId.',%"  OR a.mailing_lists LIKE "%,'.$nsproListId.'"';
			$queryInsert = 'INSERT IGNORE INTO '.acymailing_table('listsub').' (subid,listid,subdate,status) ';

			$affected = acymailing_query($queryInsert.$querySelect);

			acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_SUBSCRIBE_CONFIRMATION', $affected, '<b><i>'.$oneList->name.'</i></b>'));
		}

		return true;
	}

	function communicator(){
		$time = time();
		$query = 'INSERT IGNORE INTO '.acymailing_table('subscriber').' (`email`,`name`,`confirmed`,`created`,`enabled`,`accept`,`html`) SELECT `subscriber_email`,`subscriber_name`,`confirmed`,'.$time.',1,1,1 FROM '.acymailing_table('communicator_subscribers', false);
		$insertedUsers = acymailing_query($query);

		acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_NEW', $insertedUsers));

		$query = 'SELECT b.subid FROM '.acymailing_table('communicator_subscribers', false).' as a JOIN '.acymailing_table('subscriber').' as b on a.subscriber_email = b.email';
		$this->allSubid = acymailing_loadResultArray($query);
		$this->_subscribeUsers();
		$this->_displaySubscribedResult();

		return true;
	}

	function civi_import(){
		$this->setciviprefix();
		$query = 'INSERT IGNORE INTO '.acymailing_table('subscriber').' (`email`,`name`,`confirmed`,`created`,`enabled`,`accept`,`html`) ';
		$query .= 'SELECT CONVERT(civiemail.email USING utf8),CONVERT(civicontact.`first_name` USING utf8),1,'.time().', 1-`do_not_email`,1 - civicontact.is_opt_out,1 ';
		$query .= 'FROM '.$this->civiprefix.'email as civiemail JOIN '.$this->civiprefix.'contact as civicontact ON civicontact.id = civiemail.contact_id ';
		$query .= 'WHERE civicontact.is_deleted = 0 AND civiemail.is_primary = 1 AND civiemail.email LIKE \'%@%\'';

		return acymailing_query($query);
	}

	function setciviprefix(){
		if(!empty($this->civiprefix)) return;
		$this->civiprefix = 'civicrm_';
		$civifile = ACYMAILING_ROOT.'administrator'.DS.'components'.DS.'com_civicrm'.DS.'civicrm.settings.php';
		if(!defined('CIVICRM_DSN') && file_exists($civifile)) include_once($civifile);
		if(defined('CIVICRM_DSN')){
			$infos = parse_url(CIVICRM_DSN);
			$db = trim($infos['path'], '/');
			if(!empty($db)) $this->civiprefix = '`'.$db.'`.civicrm_';
		}
	}

	function civi(){
		$this->setciviprefix();

		$insertedUsers = $this->civi_import();
		acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_NEW', $insertedUsers));

		$query = 'SELECT b.subid FROM '.$this->civiprefix.'email as a JOIN '.acymailing_table('subscriber').' as b on CONVERT(a.email USING utf8) = b.email';
		$this->allSubid = acymailing_loadResultArray($query);
		$this->_subscribeUsers();
		$this->_displaySubscribedResult();
	}

	function ldap(){
		$config = acymailing_config();

		acymailing_query("DELETE FROM #__acymailing_config WHERE namekey LIKE 'ldapfield_%'");

		if(!$this->ldap_init()) return false;

		$ldapfields = acymailing_getVar('none', 'ldapfield');
		if(empty($ldapfields)){
			acymailing_enqueueMessage(acymailing_translation('SPECIFYFIELDEMAIL'), 'notice');
			return false;
		}

		$newConfig = new stdClass();

		$this->dispresults = false;
		$newConfig->ldap_import_confirm = $this->forceconfirm = acymailing_getVar('int', 'ldap_import_confirm');
		$newConfig->ldap_generatename = $this->generatename = acymailing_getVar('int', 'ldap_generatename');
		$newConfig->ldap_overwriteexisting = $this->overwrite = acymailing_getVar('int', 'ldap_overwriteexisting');
		$newConfig->ldap_deletenotexists = $this->ldap_deletenotexists = acymailing_getVar('int', 'ldap_deletenotexists');
		if($this->ldap_deletenotexists){
			$subfields = array_keys(acymailing_getColumns('#__acymailing_subscriber'));
			if(!in_array('ldapentry', $subfields)){
				acymailing_query("ALTER TABLE #__acymailing_subscriber ADD COLUMN ldapentry TINYINT UNSIGNED DEFAULT 0");
			}else{
				acymailing_query("UPDATE #__acymailing_subscriber SET ldapentry = 0");
			}

			$this->overwrite = 1;
		}
		$newConfig->ldap_subfield = $this->ldap_subfield = acymailing_getVar('string', 'ldap_subfield');
		if(!empty($this->ldap_subfield)){
			$allValues = acymailing_getVar('none', 'ldap_subcond');
			$allLists = acymailing_getVar('none', 'ldap_sublists');
			$this->ldap_subscribe = array();
			foreach($allValues as $i => $oneValue){
				$oneValue = strtolower(trim($oneValue));
				if(strlen($oneValue) < 1) continue;
				if(isset($this->ldap_subscribe[$oneValue])){
					$this->ldap_subscribe[$oneValue] .= '-'.intval($allLists[$i]);
				}else{
					$this->ldap_subscribe[$oneValue] = intval($allLists[$i]);
				}
				$valcond = 'ldap_subcond_'.$i;
				$vallist = 'ldap_sublists_'.$i;
				$newConfig->$valcond = $allValues[$i];
				$newConfig->$vallist = $allLists[$i];
			}

			acymailing_query("DELETE FROM #__acymailing_config WHERE namekey LIKE 'ldap_subcond%' OR namekey LIKE 'ldap_sublists%'");
		}

		$this->ldap_equivalent = array();
		$this->ldap_selectedFields = array();
		foreach($ldapfields as $oneField => $acyField){
			if(empty($acyField)) continue;
			$configname = 'ldapfield_'.strtolower($oneField);
			$newConfig->$configname = $acyField;
			$this->ldap_equivalent[$acyField] = $oneField;
			$this->ldap_selectedFields[] = $oneField;
		}

		if(!empty($this->ldap_subfield) AND !in_array($this->ldap_subfield, $this->ldap_selectedFields)){
			$this->ldap_selectedFields[] = $this->ldap_subfield;
		}

		$config->save($newConfig);

		if(empty($this->ldap_equivalent['email'])){
			acymailing_enqueueMessage(acymailing_translation('SPECIFYFIELDEMAIL'), 'notice');
			return false;
		}

		$startChars = 'abcdefghijklmnopqrstuvwxyz0123456789_-+&.';

		$nbChars = strlen($startChars);
		$result = true;
		for($i = 0; $i < $nbChars; $i++){
			if(!$this->ldap_import($this->ldap_equivalent['email'].'='.$startChars[$i].'*@*')) $result = false;
		}

		acymailing_enqueueMessage(acymailing_translation_sprintf('ACY_IMPORT_REPORT', $this->totalTry, $this->totalInserted, $this->totalTry - $this->totalValid, $this->totalValid - $this->totalInserted));

		if($this->ldap_deletenotexists){
			$allSubids = acymailing_loadResultArray("SELECT subid FROM #__acymailing_subscriber WHERE ldapentry = 0");
			$subscriberClass = acymailing_get('class.subscriber');
			$nbAffected = $subscriberClass->delete($allSubids);
			acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_DELETE', $nbAffected));
			acymailing_query("ALTER TABLE #__acymailing_subscriber DROP COLUMN ldapentry");
		}

		$this->_displaySubscribedResult();

		return $result;
	}

	function ldap_import($search){
		$searchResult = ldap_search($this->ldap_conn, $this->ldap_basedn, $search, $this->ldap_selectedFields);
		if(!$searchResult){
			acymailing_display('Could not search for elements<br />'.ldap_error($this->ldap_conn), 'warning');
			return false;
		}
		$entries = ldap_get_entries($this->ldap_conn, $searchResult);

		if(empty($entries) || empty($entries['count'])) return true;

		$content = '"'.implode('","', array_keys($this->ldap_equivalent)).'"';
		if($this->ldap_deletenotexists) $content .= ',"ldapentry"';
		if(!empty($this->ldap_subfield)) $content .= ',"listids"';
		$content .= "\n";
		for($i = 0; $i < $entries['count']; $i++){
			foreach($this->ldap_equivalent as $ldapField){
				$fieldVal = isset($entries[$i][$ldapField][0]) ? $entries[$i][$ldapField][0] : '';
				$content .= '"'.$fieldVal.'",';
			}
			if($this->ldap_deletenotexists) $content .= '"1",';
			if(!empty($this->ldap_subfield)){
				static $errorsLists = array();
				if(isset($entries[$i][$this->ldap_subfield][0])){
					$condvalue = strtolower(trim($entries[$i][$this->ldap_subfield][0]));
					if(isset($this->ldap_subscribe[$condvalue])){
						$content .= $this->ldap_subscribe[$condvalue].',';
					}else{
						if(!isset($errorsLists[$condvalue]) AND count($errorsLists) < 5){
							$errorsLists[$condvalue] = true;
							acymailing_enqueueMessage('Could not find a list for the value "'.$condvalue.'" of the field '.$this->ldap_subfield, 'notice');
						}
						$content .= '"",';
					}
				}else{
					$content .= '"",';
				}
			}
			$content = rtrim($content, ',');
			$content .= "\n";
		}
		return $this->_handleContent($content);
	}


	function ldap_init(){
		$config = acymailing_config();
		$newConfig = new stdClass();
		$newConfig->ldap_host = trim(acymailing_getVar('string', 'ldap_host'));
		$newConfig->ldap_port = acymailing_getVar('int', 'ldap_port');
		if(empty($newConfig->ldap_port)) $newConfig->ldap_port = 389;
		$newConfig->ldap_basedn = trim(acymailing_getVar('string', 'ldap_basedn'));
		$this->ldap_basedn = $newConfig->ldap_basedn;
		$newConfig->ldap_username = trim(acymailing_getVar('string', 'ldap_username'));
		$newConfig->ldap_password = trim(acymailing_getVar('string', 'ldap_password'));

		$config->save($newConfig);

		if(empty($newConfig->ldap_host)) return false;

		acymailing_displayErrors();
		$this->ldap_conn = ldap_connect($newConfig->ldap_host, $newConfig->ldap_port);
		if(!$this->ldap_conn){
			acymailing_display('Could not connect to LDAP server : '.$newConfig->ldap_host.':'.$newConfig->ldap_port, 'warning');
			return false;
		}

		ldap_set_option($this->ldap_conn, LDAP_OPT_PROTOCOL_VERSION, 3);
		ldap_set_option($this->ldap_conn, LDAP_OPT_REFERRALS, 0);

		if(empty($newConfig->ldap_username)){
			$bindResult = ldap_bind($this->ldap_conn);
		}else{
			$bindResult = ldap_bind($this->ldap_conn, $newConfig->ldap_username, $newConfig->ldap_password);
		}

		if(!$bindResult){
			acymailing_display('Could not bind to the LDAP directory '.$newConfig->ldap_host.':'.$newConfig->ldap_port.' with specified username and password<br />'.ldap_error($this->ldap_conn), 'warning');
			return false;
		}

		acymailing_enqueueMessage('Successfully connected to '.$newConfig->ldap_host.':'.$newConfig->ldap_port, 'success');

		return true;
	}

	function ldap_ajax(){

		if(!$this->ldap_init()) return;

		$config = acymailing_config();

		$searchResult = @ldap_search($this->ldap_conn, trim(acymailing_getVar('string', 'ldap_basedn')), 'mail=*@*', array(), 0, 5);
		if(!$searchResult){
			acymailing_display('Could not search for elements<br />'.ldap_error($this->ldap_conn), 'warning');
			return false;
		}
		$entries = ldap_get_entries($this->ldap_conn, $searchResult);

		$fields = array();
		$dropdown = array();
		$object = new stdClass();
		$object->text = ' - - - ';
		$object->value = 0;
		$dropdown[] = $object;
		foreach($entries as $oneEntry){
			if(!is_array($oneEntry)) continue;
			foreach($oneEntry as $field => $value){
				if(!is_numeric($field)) continue;
				$value = strtolower($value);
				if($value == 'objectclass') continue;
				$fields[$value] = $value;
				$object = new stdClass();
				$object->text = $value;
				$object->value = $value;
				$dropdown[$value] = $object;
			}
		}

		if(empty($fields)){
			acymailing_display('Could not load elements<br />'.ldap_error($this->ldap_conn), 'warning');
			return false;
		}

		$subfields = acymailing_getColumns('#__acymailing_subscriber');

		$acyfields = array();
		$acyfields[] = acymailing_selectOption('', ' - - - ');
		foreach($subfields as $oneField => $typefield){
			if(in_array($oneField, array('subid', 'confirmed', 'enabled', 'key', 'userid', 'accept', 'html', 'created'))) continue;
			$acyfields[] = acymailing_selectOption($oneField, $oneField);
		}

		echo '<div class="onelineblockoptions"><span class="acyblocktitle">'.acymailing_translation('USER_FIELDS').'</span>
<table class="acymailing_table" cellspacing="1">';
		foreach($fields as $oneField){
			echo '<tr><td class="acykey" >'.$oneField.'</td><td>'.acymailing_select($acyfields, 'ldapfield['.$oneField.']', 'size="1"', 'value', 'text', $config->get('ldapfield_'.$oneField)).'</td></tr>';
		}
		echo '</table></div>';

		echo '<div class="onelineblockoptions"><span class="acyblocktitle">'.acymailing_translation('SUBSCRIPTION').'</span>';
		echo 'Subscribe the user based on the values of the field '.acymailing_select($dropdown, 'ldap_subfield', 'size="1"', 'value', 'text', $config->get('ldap_subfield')).':';
		$listClass = acymailing_get('class.list');
		$lists = $listClass->getLists('listid');

		for($i = 0; $i < 5; $i++){
			echo '<br />Subscribe to list '.acymailing_select($lists, 'ldap_sublists['.$i.']', 'class="inputbox" size="1" style="width: 150px;" ', 'listid', 'name', (int)$config->get('ldap_sublists_'.$i)).' if the value is <input style="width: 150px;" type="text" value="'.htmlspecialchars($config->get('ldap_subcond_'.$i), ENT_COMPAT, 'UTF-8').'" name="ldap_subcond['.$i.']" />';
		}
		echo '</div>';

	}

	function zohocrm($action = ''){
		$zohoHelper = acymailing_get('helper.zoho');
		$subscriberClass = acymailing_get('class.subscriber');
		$tableInfos = array_keys(acymailing_getColumns('#__acymailing_subscriber'));
		$config = acymailing_config();
		if(!in_array('zohoid', $tableInfos)){
			$query = 'ALTER TABLE #__acymailing_subscriber ADD COLUMN zohoid VARCHAR(255)';
			acymailing_query($query);
			$query = 'ALTER TABLE `#__acymailing_subscriber` ADD INDEX(`zohoid`)';
			acymailing_query($query);
		}
		if(!in_array('zoholist', $tableInfos)){
			$query = 'ALTER TABLE #__acymailing_subscriber ADD COLUMN zoholist CHAR(1)';
			acymailing_query($query);
		}

		if($action == 'update'){
			$list = $config->get('zoho_list');
			$zohoHelper->authtoken = $authtoken = $config->get('zoho_apikey');
			$zohoHelper->customView = $config->get('zoho_cv');
			$fields = unserialize($config->get('zoho_fields'));
			$confirmedUsers = $config->get('zoho_confirmed');
			$delete = $config->get('zoho_delete');
			$generateName = $config->get('zoho_generate_name', 'fromemail');
			$importnew = $config->get('zoho_importnew', 0);
		}else{
			$list = acymailing_getVar('none', 'zoho_list');
			$fields = acymailing_getVar('none', 'zoho_fields');
			$zohoHelper->authtoken = $authtoken = acymailing_getVar('none', 'zoho_apikey');
			$zohoHelper->customView = acymailing_getVar('none', 'zoho_cv');
			$overwrite = acymailing_getVar('none', 'zoho_overwrite');
			$confirmedUsers = acymailing_getVar('none', 'zoho_confirmed');
			$delete = acymailing_getVar('none', 'zoho_delete');
			$newConfig = new stdClass();
			$newConfig->zoho_fields = serialize($fields);
			$newConfig->zoho_list = $list;
			$newConfig->zoho_apikey = $zohoHelper->authtoken;
			$newConfig->zoho_cv = $zohoHelper->customView;
			$newConfig->zoho_overwrite = $overwrite;
			$newConfig->zoho_confirmed = $confirmedUsers;
			$newConfig->zoho_delete = $delete;
			$newConfig->zoho_generate_name = $generateName = acymailing_getVar('none', 'zoho_generate_name', 'fromemail');
			$newConfig->zoho_importnew = $importnew = acymailing_getVar('none', 'zoho_importnew', 0);
			$newConfig->zoho_importdate = date('Y-m-d H:i:s');
			$config->save($newConfig);
		}

		if($config->get('zoho_overwrite', false)) $this->overwrite = true;
		if(empty($authtoken)){
			acymailing_enqueueMessage('Pleaser enter a valid API key', 'notice');
			return false;
		}

		$this->allSubid = array();
		$indexDec = 200;
		$res = $zohoHelper->sendInfo($list);
		while(!empty($res)){
			$zohoUsers = $zohoHelper->parseXML($res, $list, $fields, $confirmedUsers, $generateName);
			if(empty($zohoUsers) && $zohoHelper->nbUserRead == 0) break;
			$this->_insertUsers($zohoUsers);
			if($zohoHelper->nbUserRead < 200) break; // No further iteration needed
			$zohoUsers = array();
			$zohoHelper->fromIndex = $zohoHelper->fromIndex + $indexDec;
			$zohoHelper->toIndex = $zohoHelper->toIndex + $indexDec;
			if(!empty($zohoHelper->conn)) $zohoHelper->close();
			$res = $zohoHelper->sendInfo($list);
		}
		$this->_subscribeUsers();
		if(acymailing_getVar('int', 'zoho_delete') == '1'){
			$zohoHelper->deleteAddress($this->allSubid, $list);
		}else{
			$query = 'SELECT DISTINCT b.subid FROM #__acymailing_subscriber AS a JOIN #__acymailing_subscriber AS b ON a.zohoid = b.zohoid WHERE a.zohoid IS NOT NULL AND b.subid < a.subid';
			$result = acymailing_loadResultArray($query);
			$subscriberClass->delete($result);
		}
		if(!empty($zohoHelper->conn)) $zohoHelper->close();

		$this->_displaySubscribedResult();
		if(!empty($zohoHelper->error) && acymailing_isDebug()) acymailing_enqueueMessage(acymailing_translation_sprintf($zohoHelper->error), 'notice');
	}

	function sobipro(){
		$config = acymailing_config();

		$sobiproImport = acymailing_getVar('array', 'config', array(), 'POST');
		$newConfig = new stdClass();
		$affectedRows = 0;
		$newConfig->sobipro_import = serialize($sobiproImport);
		$config->save($newConfig);

		foreach($sobiproImport as $oneImport => $oneValue){
			$query = 'SELECT fid, nid FROM #__sobipro_field WHERE fid="'.$oneValue['sobiEmail'].'" OR fid="'.$oneValue['sobiName'].'"';
			$nidResult = acymailing_loadObjectList($query, "fid");
			if(empty($nidResult[$oneValue['sobiEmail']]) OR empty($nidResult[$oneValue['sobiName']])) continue;
			$time = time();
			$query = 'INSERT IGNORE INTO '.acymailing_table('subscriber').' (`email`,`name`,`confirmed`,`created`,`enabled`,`accept`,`html`) SELECT b.baseData AS email, a.baseData AS name, 1 as confirmed, '.$time.' as created, 1 as enabled, 1 as accept, 1 as html FROM #__sobipro_field_data AS a LEFT JOIN #__sobipro_field_data AS b ON a.sid=b.sid WHERE a.`fid` = '.$nidResult[$oneValue["sobiName"]]->fid.' AND b.`fid` = '.$nidResult[$oneValue["sobiEmail"]]->fid.' AND b.baseData LIKE "%@%" AND b.baseData IS NOT NULL AND a.baseData IS NOT NULL ORDER by a.sid ';
			$affected = acymailing_query($query);
			$affectedRows += intval($affected);
		}
		acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_NEW', $affectedRows));
		$query = 'SELECT b.subid FROM `#__sobipro_field_data` as a JOIN '.acymailing_table('subscriber').' as b on a.baseData = b.email';
		$this->allSubid = acymailing_loadResultArray($query);
		$this->_subscribeUsers();
		$this->_displaySubscribedResult();
		return true;
	}

	function fbleads(){
		$config = acymailing_config();

		$token = acymailing_getVar('none', 'fbleads_token');
		$adid = acymailing_getVar('none', 'fbleads_adid');
		$formid = acymailing_getVar('none', 'fbleads_formid');
		$mincreated = acymailing_getVar('none', 'fbleads_mincreated');
		$maxcreated = acymailing_getVar('none', 'fbleads_maxcreated');
		$emailfield = acymailing_getVar('none', 'fbleads_email');
		$namefield = acymailing_getVar('none', 'fbleads_name');

		$newConfig = new stdClass();
		$newConfig->fbleads_token = $token;
		$newConfig->fbleads_adid = $adid;
		$newConfig->fbleads_formid = $formid;
		$newConfig->fbleads_mincreated = $mincreated;
		$newConfig->fbleads_maxcreated = $maxcreated;
		$newConfig->fbleads_email = $emailfield;
		$newConfig->fbleads_name = $namefield;

		$config->save($newConfig);

		if(!function_exists('curl_exec')){
			acymailing_enqueueMessage('The curl extension must be enabled on your server to be able to use this import option', 'notice');
			return false;
		}

		if(empty($token)){
			acymailing_enqueueMessage(acymailing_translation('ACY_FBLEADS_ENTER_TOKEN'), 'notice');
			return false;
		}

		if(empty($adid) && empty($formid)){
			acymailing_enqueueMessage(acymailing_translation('ACY_FBLEADS_ENTER_ID'), 'notice');
			return false;
		}

		if(empty($emailfield)){
			acymailing_enqueueMessage('You must at least specify the email field\'s code', 'notice');
			return false;
		}

		$filtering = array();

		if(!empty($mincreated)){
			$mincreated = strtotime($mincreated);
			if(empty($mincreated) || $mincreated == -1){
				acymailing_enqueueMessage(acymailing_translation_sprintf('FIELD_CONTENT_VALID', '"'.acymailing_translation('ACY_FBLEADS_MINCREATED').'"'), 'notice');
			}else{
				$filter = new stdClass();
				$filter->field = "time_created";
				$filter->operator = "GREATER_THAN";
				$filter->value = $mincreated;

				$filtering[] = $filter;
			}
		}

		if(!empty($maxcreated)){
			$maxcreated = strtotime($maxcreated);
			if(empty($maxcreated) || $maxcreated == -1){
				acymailing_enqueueMessage(acymailing_translation_sprintf('FIELD_CONTENT_VALID', '"'.acymailing_translation('ACY_FBLEADS_MAXCREATED').'"'), 'notice');
			}else{
				$filter = new stdClass();
				$filter->field = "time_created";
				$filter->operator = "LESS_THAN";
				$filter->value = $maxcreated;

				$filtering[] = $filter;
			}
		}

		if(empty($formid)) $formid = $adid;
		$url = 'https://graph.facebook.com/v2.8/'.$formid.'/leads?limit=1000000&access_token='.$token;
		if(!empty($filtering)) $url .= '&filtering='.urlencode(json_encode($filtering));

		$curl = curl_init();
		curl_setopt($curl, CURLOPT_URL,$url);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($curl, CURLOPT_COOKIESESSION, true);
		$return = curl_exec($curl);

		if(!$return){
			acymailing_enqueueMessage('An unkown error occurred: '.curl_error($curl), 'error');
			curl_close($curl);
			return true;
		}

		curl_close($curl);
		
		$return = json_decode($return, true);
		
		if(!empty($return['error']['message'])){
			acymailing_enqueueMessage($return['error']['message'], 'error');
			return true;
		}

		if(empty($return['data'])) {
			acymailing_enqueueMessage(acymailing_translation('ACY_FBLEADS_NONE'), 'info');
			return true;
		}

		$leads = '';
		$time = time();
		foreach($return['data'] as $oneLead){
			$email = '';
			$name = '';
			foreach($oneLead['field_data'] as $oneField){
				if($oneField['name'] == $emailfield) $email = $oneField['values'][0];
				if(!empty($namefield) && $oneField['name'] == $namefield) $name = $oneField['values'][0];
			}

			$leads .= '('.acymailing_escapeDB($email).(empty($namefield) ? '' : ','.acymailing_escapeDB($name)).','.$time.'),';
			$emails[] = acymailing_escapeDB($email);
		}
		$leads = rtrim($leads, ',');

		$affectedRows = acymailing_query('INSERT IGNORE INTO '.acymailing_table('subscriber').' (`email`'.(empty($namefield) ? '' : ',`name`').',`created`) VALUES '.$leads);

		acymailing_enqueueMessage(acymailing_translation_sprintf('IMPORT_NEW', $affectedRows));
		$this->allSubid = acymailing_loadResultArray('SELECT subid FROM '.acymailing_table('subscriber').' WHERE `created` = '.$time);
		$this->_subscribeUsers();
		$this->_displaySubscribedResult();
		return true;
	}
}
components/com_acymailing/helpers/encoding.php000060400000004644152453623450015662 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php


class acyencodingHelper{

	function change($data, $input, $output){

		$input = strtoupper(trim($input));
		$output = strtoupper(trim($output));

		$supportedEncodings = array("BIG5", "ISO-8859-1", "ISO-8859-2", "ISO-8859-3", "ISO-8859-4", "ISO-8859-5", "ISO-8859-6", "ISO-8859-7", "ISO-8859-8", "ISO-8859-9", "ISO-8859-10", "ISO-8859-13", "ISO-8859-14", "ISO-8859-15", "ISO-2022-JP", "US-ASCII", "UTF-7", "UTF-8", "UTF-16", "WINDOWS-1251", "WINDOWS-1252", "ARMSCII-8", "ISO-8859-16");
		if(!in_array($input, $supportedEncodings)){
			acymailing_enqueueMessage('Encoding not supported: '.$input, 'error');
		}elseif(!in_array($output, $supportedEncodings)){
			acymailing_enqueueMessage('Encoding not supported: '.$output, 'error');
		}

		if($input == $output) return $data;

		if($input == 'UTF-8' && $output == 'ISO-8859-1'){
			$data = str_replace(array('€', '„', '“'), array('EUR', '"', '"'), $data);
		}

		if(function_exists('iconv')){
			set_error_handler('acymailing_error_handler_encoding');
			$encodedData = iconv($input, $output."//IGNORE", $data);
			restore_error_handler();
			if(!empty($encodedData) && !acymailing_error_handler_encoding('result')){
				return $encodedData;
			}
		}

		if(function_exists('mb_convert_encoding')){
			return mb_convert_encoding($data, $output, $input);
		}

		if($input == 'UTF-8' && $output == 'ISO-8859-1'){
			return utf8_decode($data);
		}

		if($input == 'ISO-8859-1' && $output == 'UTF-8'){
			return utf8_encode($data);
		}

		return $data;
	}

	function detectEncoding(&$content){

		if(!function_exists('mb_check_encoding')) return '';

		$toTest = array('UTF-8');
		
		$tag = acymailing_getLanguageTag();

		if($tag == 'el-GR'){
			$toTest[] = 'ISO-8859-7';
		}
		$toTest[] = 'ISO-8859-1';
		$toTest[] = 'ISO-8859-2';
		$toTest[] = 'Windows-1252';

		foreach($toTest as $oneEncoding){
			if(mb_check_encoding($content, $oneEncoding)) return $oneEncoding;
		}

		return '';
	}

}//endclass

function acymailing_error_handler_encoding($errno, $errstr = ''){
	static $error = false;
	if(is_string($errno) && $errno == 'result'){
		$currentError = $error;
		$error = false;
		return $currentError;
	}
	$error = true;
	return true;
}
components/com_acymailing/helpers/acypict.php000060400000013323152453623450015522 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class acypictHelper{

	var $error;
	var $maxHeight;
	var $maxWidth;
	var $destination;

	function __construct(){
		
	}

	function removePictures($text){
		$return = preg_replace('#< *img[^>]*>#Ui','',$text);
		$return = preg_replace('#< *div[^>]*class="jce_caption"[^>]*>[^<]*(< *div[^>]*>[^<]*<\/div>)*[^<]*<\/div>#Ui','',$return);
		return $return;
	}

	function available(){
		if(!function_exists('gd_info')){
			$this->error = 'The GD library is not installed.';
			return false;
		}
		if(!function_exists('getimagesize')){
			$this->error = 'Cound not find getimagesize function';
			return false;
		}
		if(!function_exists('imagealphablending')){
			$this->error = "Please make sure you're using GD 2.0.1 or later version";
			return false;
		}
		return true;
	}

	function resizePictures($input){
		$this->destination = ACYMAILING_MEDIA.'resized'.DS;
		acymailing_createDir($this->destination);
		$content = acymailing_absoluteURL($input);

		preg_match_all('#<img([^>]*)>#Ui',$content,$results);
		if(empty($results[1])) return $input;

		$replace = array();

		foreach($results[1] as $onepicture){
			if(strpos($onepicture,'donotresize') !== false) continue;

			if(!preg_match('#src="([^"]*)"#Ui',$onepicture,$path)) continue;
			$imageUrl = $path[1];

			$base = str_replace(array('http://www.','https://www.','http://','https://'),'',ACYMAILING_LIVE);
			$replacements = array('https://www.'.$base,'http://www.'.$base,'https://'.$base,'http://'.$base);
			foreach($replacements as $oneReplacement){
				if(strpos($imageUrl,$oneReplacement) === false) continue;
				$imageUrl = str_replace(array($oneReplacement,'/'),array(ACYMAILING_ROOT,DS),urldecode($imageUrl));
				break;
			}

			$newPicture = $this->generateThumbnail($imageUrl);

			if(!$newPicture){
				$newDimension = 'max-width:'.$this->maxWidth.'px;max-height:'.$this->maxHeight.'px;';
				if(strpos($onepicture, 'style="') !== false){
					$replace[$onepicture] = preg_replace('#style="([^"]*)"#Uis', 'style="'.$newDimension.'$1"', $onepicture);
				}else{
					$replace[$onepicture] = ' style="'.$newDimension.'" '.$onepicture;
				}
				continue;
			}

			$newPicture['file'] = preg_replace('#^'.preg_quote(ACYMAILING_ROOT,'#').'#i',ACYMAILING_LIVE,$newPicture['file']);
			$newPicture['file'] = str_replace(DS,'/',$newPicture['file']);
			$replaceImage = array();
			$replaceImage[$path[1]] = $newPicture['file'];
			if(preg_match_all('#(width|height)(:|=) *"?([0-9]+)#i',$onepicture,$resultsSize)){
				foreach($resultsSize[0] as $i => $oneArg){
					$newVal = (strtolower($resultsSize[1][$i]) == 'width') ? $newPicture['width'] : $newPicture['height'];
					if($newVal > $resultsSize[3][$i]) continue;
					$replaceImage[$oneArg] = str_replace($resultsSize[3][$i],$newVal,$oneArg);
				}
			}

			$replace[$onepicture] = str_replace(array_keys($replaceImage),$replaceImage,$onepicture);

		}

		if(!empty($replace)){
			$input = str_replace(array_keys($replace),$replace,$content);
		}

		return $input;
	}

	function generateThumbnail($picturePath){

 		list($currentwidth, $currentheight) = getimagesize($picturePath);
 		if(empty($currentwidth) || empty($currentheight)) return false;
 		$factor = min($this->maxWidth/$currentwidth,$this->maxHeight/$currentheight);
		if($factor>=1) return false;
		$newWidth = round($currentwidth*$factor);
		$newHeight = round($currentheight*$factor);

		if(strpos($picturePath,'http') === 0){
			$filename = substr($picturePath,strrpos($picturePath,'/')+1);
		}else{
			$filename = basename($picturePath);
		}

		if(substr($picturePath,0,10) == 'data:image'){
			preg_match('#data:image/([^;]{1,5});#',$picturePath,$resultextension);
			if(empty($resultextension[1])) return false;
			$extension = $resultextension[1];
			$name = md5($picturePath);
		}else{
			$extension = strtolower(substr($filename,strrpos($filename,'.')+1));
			$name = strtolower(substr($filename,0,strrpos($filename,'.')));
			$name .= substr(@filemtime($picturePath),-4);
		}

		$newImage = md5($picturePath).'-'.$name.'thumb'.$this->maxWidth.'x'.$this->maxHeight.'.'.$extension;
		if(empty($this->destination)){
			$newFile = dirname($picturePath).DS.$newImage;
		}else{
			$newFile = $this->destination.$newImage;
		}

		if(file_exists($newFile)) return array('file' => $newFile,'width' => $newWidth,'height' => $newHeight);

		switch($extension){
			case 'gif':
				$img = ImageCreateFromGIF($picturePath);
				break;
			case 'jpg':
			case 'jpeg':
				$img = ImageCreateFromJPEG($picturePath);
				break;
			case 'png':
				$img = ImageCreateFromPNG($picturePath);
				break;
			default:
				return false;
		}

		$thumb = ImageCreateTrueColor($newWidth, $newHeight);

		if(in_array($extension,array('gif','png'))){
			imagealphablending($thumb, false);
			imagesavealpha($thumb,true);
		}

		if(function_exists("imagecopyresampled")){
			imagecopyresampled($thumb, $img, 0, 0, 0, 0, $newWidth, $newHeight,$currentwidth, $currentheight);
		}else{
			ImageCopyResized($thumb, $img, 0, 0, 0, 0, $newWidth, $newHeight,$currentwidth, $currentheight);
		}
		ob_start();
		switch($extension){
			case 'gif':
				$status = imagegif($thumb);
				break;
			case 'jpg':
			case 'jpeg':
				$status = imagejpeg($thumb,null,100);
				break;
			case 'png':
				$status = imagepng($thumb,null,0);
				break;
		}
		$imageContent = ob_get_clean();
		$status = $status && acymailing_writeFile($newFile,$imageContent);
		imagedestroy($thumb);
		imagedestroy($img);

		if(!$status) $newFile = $picturePath;

		return array('file' => $newFile,'width' => $newWidth,'height' => $newHeight);
	}
}

components/com_acymailing/helpers/update.php000060400000147045152453623450015361 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class acyupdateHelper{

	var $db;
	var $errors = array();
	var $bouncerulesversion = 13;

	function __construct(){
		global $acymailingCmsUserVars;
		$this->cmsUserVars = $acymailingCmsUserVars;
	}

	function fixDoubleExtension(){

		if(!ACYMAILING_J16) return;

		$results = acymailing_loadObjectList("SELECT extension_id FROM #__extensions WHERE type='component' AND element = 'com_acymailing' AND extension_id > 0 ORDER BY client_id ASC, extension_id ASC");
		if(empty($results) || count($results) == 1) return;

		$validExtension = reset($results)->extension_id;

		$toDelete = array();
		for($i = 1; $i < count($results); $i++){
			$toDelete[] = $results[$i]->extension_id;
		}


		$tablesToUpdate = array('#__menu' => 'component_id');
		foreach($tablesToUpdate as $table => $field){
			acymailing_query("UPDATE ".$table." SET ".$field." = ".intval($validExtension)." WHERE ".$field." IN (".implode(',', $toDelete).")");
		}
		$tablesToCheck = array('#__updates' => 'extension_id', '#__update_sites_extensions' => 'extension_id', '#__extensions' => 'extension_id');
		foreach($tablesToCheck as $table => $field){
			acymailing_query("DELETE FROM ".$table." WHERE ".$field." IN (".implode(',', $toDelete).")");
		}
	}

	function fixMenu(){
		if(!ACYMAILING_J16) return;

		$extensionid = acymailing_loadResult("SELECT extension_id FROM #__extensions WHERE type='component' AND element LIKE '%acymailing' LIMIT 1");
		if(empty($extensionid)) return;

		acymailing_query("UPDATE #__menu SET component_id = ".intval($extensionid).",published = 1 WHERE link LIKE '%com_acymailing%' AND component_id = 0 AND client_id = 1");
	}

	function installTables(){
		echo '<h2 style="color:red">The installation failed, some tables are missing, we will try to create them now...</h2>';

		$queries = file_get_contents(ACYMAILING_BACK.'tables.sql');
		$queriesTable = explode("CREATE TABLE", $queries);

		$success = true;
		foreach($queriesTable as $oneQuery){
			$oneQuery = trim($oneQuery);
			if(empty($oneQuery)) continue;
			$res = acymailing_query("CREATE TABLE ".$oneQuery);
			if($res === false){
				echo '<br /><br /><span style="color:red">Error creating table : '.acymailing_getDBError().'</span><br />';
				$success = false;
			}else{
				echo '<br /><span style="color:green">Table successfully created</span>';
			}
		}

		if($success){
			echo '<h2 style="color:orange">Please install again AcyMailing via the Joomla Extensions manager, the tables are now created so the installation will work</h2>';
		}else{
			echo '<h2 style="color:red">Some tables could not be created, please fix the above issues and then install again AcyMailing.</h2>';
		}
	}

	function addUpdateSite(){
		$config = acymailing_config();

		$newconfig = new stdClass();
		$newconfig->website = ACYMAILING_LIVE;
		$newconfig->max_execution_time = 0;

		$config->save($newconfig);

		if(!ACYMAILING_J16) return false;

		acymailing_query("DELETE FROM #__updates WHERE element = 'com_acymailing'");

		$query = "SELECT update_site_id FROM #__update_sites WHERE location LIKE '%acymailing%' AND type LIKE 'extension'";
		$update_site_id = acymailing_loadResult($query);

		$object = new stdClass();
		$object->name = 'AcyMailing';
		$object->type = 'extension';
		$object->location = 'http://www.acyba.com/component/updateme/updatexml/component-acymailing/level-'.$config->get('level').'/file-extension.xml';

		$object->enabled = 1;

		if(empty($update_site_id)){
			$update_site_id = acymailing_insertObject("#__update_sites", $object);
		}else{
			$object->update_site_id = $update_site_id;
			acymailing_updateObject("#__update_sites", $object, 'update_site_id');
		}

		$query = "SELECT extension_id FROM #__extensions WHERE `name` LIKE 'acymailing' AND type LIKE 'component'";
		$extension_id = acymailing_loadResult($query);
		if(empty($update_site_id) OR empty($extension_id)) return false;

		$query = 'INSERT IGNORE INTO #__update_sites_extensions (update_site_id, extension_id) values ('.$update_site_id.','.$extension_id.')';
		acymailing_query($query);
		return true;
	}

	function installFields(){
		$query = "INSERT IGNORE INTO `#__acymailing_fields` (`fieldname`, `namekey`, `type`, `value`, `published`, `ordering`, `options`, `core`, `required`, `backend`, `frontcomp`, `default`, `listing`, `frontlisting`, `frontform`) VALUES
		('NAMECAPTION', 'name', 'text', '', 1, 1, '', 1, 1, 1, 1, '',1,1,1),
		('EMAILCAPTION', 'email', 'text', '', 1, 2, '', 1, 1, 1, 1, '',1,1,1),
		('RECEIVE', 'html', 'radio', '0::JOOMEXT_TEXT\n1::HTML', 1, 3, '', 1, 1, 1, 1, '1',1,0,1);";
		acymailing_query($query);
	}

	function installNotifications(){
		$notifications = acymailing_loadResultArray('SELECT `alias` FROM `#__acymailing_mail` WHERE `type` = \'notification\' OR `type` = \'article\'');

		$data = array();

		if(!in_array('notification_created', $notifications)) $data[] = "('New Subscriber on your website : {user:email}', '<p>Hello {subtag:name},</p><p>A new user has been created in AcyMailing : </p><blockquote><p>Name : {user:name}</p><p>Email : {user:email}</p><p>IP : {user:ip} </p><p>Subscription : {user:subscription}</p></blockquote>', '', 1, 'notification', 0,'notification_created', 1,0,NULL,'')";
		if(!in_array('notification_unsuball', $notifications)) $data[] = "('A User unsubscribed from all your lists : {user:email}', '<p>Hello {subtag:name},</p><p>The user {user:name} : {user:email} unsubscribed from all your lists</p><p>Subscription : {user:subscription}</p><p>{survey}</p>', '', 1, 'notification', 0, 'notification_unsuball', 1,0,NULL,'')";
		if(!in_array('notification_unsub', $notifications)) $data[] = "('A User unsubscribed : {user:email}', '<p>Hello {subtag:name},</p><p>The user {user:name} : {user:email} unsubscribed from your list</p><p>Subscription : {user:subscription}</p><p>{survey}</p>', '', 1, 'notification', 0, 'notification_unsub', 1,0,NULL,'')";
		if(!in_array('notification_refuse', $notifications)) $data[] = "('A User refuses to receive e-mails from your website : {user:email}', '<p>The User {user:name} : {user:email} refuses to receive any e-mail anymore from your website.</p><p>Subscription : {user:subscription}</p><p>{survey}</p>', '', 1, 'notification',0,'notification_refuse', 1,0,NULL,'')";
		if(!in_array('notification_contact', $notifications)) $data[] = "('New contact from your website : {user:email}', '<p>Hello {subtag:name},</p><p>A user submitted the form : </p><blockquote><p>Name : {user:name}</p><p>Email : {user:email}</p><p>IP : {user:ip} </p><p>Subscription : {user:subscription}</p></blockquote>', '', 1, 'notification', 0,'notification_contact', 1,0,NULL,'')";
		if(!in_array('notification_contact_menu', $notifications)) $data[] = "('A user subscribed or modified his subscription : {user:email}', '<p>Hello {subtag:name},</p><p>A user submitted the form : </p><blockquote><p>Name : {user:name}</p><p>Email : {user:email}</p><p>IP : {user:ip} </p><p>Subscription : {user:subscription}</p></blockquote>', '', 1, 'notification', 0,'notification_contact_menu', 1,0,NULL,'')";
		if(!in_array('notification_confirm', $notifications)) $data[] = "('A user confirmed his subscription : {user:email}', '<p>Hello {subtag:name},</p><p>A user confirmed his subscription : </p><blockquote><p>Name : {user:name}</p><p>Email : {user:email}</p><p>IP : {user:ip} </p><p>Subscription : {user:subscription}</p></blockquote>', '', 1, 'notification', 0,'notification_confirm', 1,0,NULL,'')";

		$conftemplate = (int)acymailing_loadResult("SELECT tempid FROM #__acymailing_template WHERE namekey = 'newsletter-4'");

		if(!in_array('confirmation', $notifications)){
			$bodyNotif = $this->getFormatedNotification('{subtag:name|ucfirst}, {trans:PLEASE_CONFIRM_SUB}', '<h1>Hello {subtag:name|ucfirst},</h1>
			<p>{trans:CONFIRM_MSG}<br /><br />{trans:CONFIRM_MSG_ACTIVATE}</p>
			<br />
			<p style="text-align:center;"><strong>{confirm}{trans:CONFIRM_SUBSCRIPTION}{/confirm}</strong></p>');
			$data[] = "('{subtag:name|ucfirst}, {trans:PLEASE_CONFIRM_SUB}', ".acymailing_escapeDB($bodyNotif).", '',1, 'notification', 0, 'confirmation', 1,".$conftemplate.',\'a:3:{s:6:"action";s:7:"confirm";s:13:"actionbtntext";s:28:"{trans:CONFIRM_SUBSCRIPTION}";s:9:"actionurl";s:19:"{confirm}{/confirm}";}\',"")';
		}else{
			$confirmParams = acymailing_loadResult('SELECT `params` FROM `#__acymailing_mail` WHERE `alias` = \'confirmation\'');
			if(empty($confirmParams)){
				acymailing_query('UPDATE `#__acymailing_mail` SET `params` = \'a:3:{s:6:"action";s:7:"confirm";s:13:"actionbtntext";s:28:"{trans:CONFIRM_SUBSCRIPTION}";s:9:"actionurl";s:19:"{confirm}{/confirm}";}\' WHERE `alias` = \'confirmation\'');
			}
		}

		if(!in_array('report', $notifications)) $data[] = "('AcyMailing Cron Report {mainreport}', '<p>{report}</p><p>{detailreport}</p>', '',1, 'notification',0,  'report', 1,0,NULL,'')";
		if(!in_array('modif', $notifications)) $data[] = "('Modify your subscription', '<p>Hello {subtag:name}, </p><p>You requested some changes on your subscription,</p><p>Please {modify}click here{/modify} to be identified as the owner of this account and then modify your subscription.</p>', '',1, 'notification', 0, 'modif', 1,0,NULL,'')";

		if(!in_array('send-in-article', $notifications)){
			$body = $this->getFormatedNotification('{joomlacontent:current| type:title}', '{joomlacontent:current| type:intro| format:TOP_LEFT| pict:1| link}');
			$data[] = "('{joomlacontent:current| type:title}', ".acymailing_escapeDB($body).", '', 1, 'article', 0, 'send-in-article', 1, ".$conftemplate.", NULL, '')";
		}

		if('joomla' == 'joomla') $data = array_merge($data, $this->getJoomlaNotifications($conftemplate));

		if(!empty($data)){
			acymailing_query("INSERT INTO `#__acymailing_mail` (`subject`, `body`, `altbody`, `published`, `type`, `visible`, `alias`, `html`, `tempid`, `params`, `summary`) VALUES ".implode(',', $data));
		}
	}

	function getFormatedNotification($subject, $body){
		return '<div style="text-align: center; width: 100%; background-color:#ffffff;">
		<table align="center" border="0" cellpadding="0" cellspacing="0" class="w600" style="text-align: justify; margin: auto; width: 600px;">
			<tbody>
				<tr class="acyeditor_delete" style="line-height: 0px;" id="zone_2">
					<td class="w600" colspan="5" style="background-color: #69b4c0;" valign="bottom" width="600" id="zone_3"><img id="zone_29" alt=" - - - " border="0" src="'.ACYMAILING_MEDIA_URL.'templates/newsletter-4/images/top.png"></td>
				</tr>
				<tr class="acyeditor_delete" id="zone_4">
					<td class="w40" style="background-color: #ebebeb;" width="40" id="zone_5"></td>
					<td class="w520 acyeditor_text" colspan="3" height="80" style="text-align: left; background-color: #ebebeb;" width="520" id="zone_6"><strong>​</strong>​​​​​​​​<img alt="-" border="0" src="'.ACYMAILING_MEDIA_URL.'templates/newsletter-4/images/message_icon.png" style="float: left; margin-right: 10px;">
						<h3>'.$subject.'<span style="display: none;">&nbsp;</span></h3>
					</td>
					<td class="acyeditor_picture w40" style="background-color: #ebebeb;" width="40" id="zone_7"></td>
				</tr>
				<tr class="acyeditor_delete" id="zone_8">
					<td class="w40" style="background-color: #ebebeb;" width="40" id="zone_9"></td>
					<td class="w20" style="background-color: #fff;" width="20" id="zone_10"></td>
					<td class="w480" height="20" style="background-color: #fff;" width="480" id="zone_11"></td>
					<td class="w20" style="background-color: #fff;" width="20" id="zone_12"></td>
					<td class="w40" style="background-color: #ebebeb;" width="40" id="zone_13"></td>
				</tr>
				<tr class="acyeditor_delete" id="zone_14">
					<td class="w40" style="background-color: #ebebeb;" width="40" id="zone_15"></td>
					<td class="w20" style="background-color: #fff;" width="20" id="zone_16"></td>
					<td class="w480 pict acyeditor_text" style="background-color: #fff; text-align: left;" width="480" id="zone_17">'.$body.'</td>
					<td class="w20" style="background-color: #fff;" width="20" id="zone_18"></td>
					<td class="w40" style="background-color: #ebebeb;" width="40" id="zone_19"></td>
				</tr>
				<tr class="acyeditor_delete" id="zone_20">
					<td class="w40" style="background-color: #ebebeb;" width="40" id="zone_21"></td>
					<td class="w20" style="background-color: #fff;" width="20" id="zone_22"></td>
					<td class="w480" height="20" style="background-color: #fff;" width="480" id="zone_23"></td>
					<td class="w20" style="background-color: #fff;" width="20" id="zone_24"></td>
					<td class="w40" style="background-color: #ebebeb;" width="40" id="zone_25"></td>
				</tr>
				<tr class="acyeditor_delete" style="line-height: 0px;" id="zone_26">
					<td class="w600" colspan="5" style="background-color: #ebebeb;" width="600" id="zone_27"><img id="zone_31" alt=" - - - " border="0" src="'.ACYMAILING_MEDIA_URL.'templates/newsletter-4/images/bottom.png"></td>
				</tr>
			</tbody>
		</table>
		</div>';
	}

	function getJoomlaNotifications($conftemplate){
		$data = array();

		if(!acymailing_level(1)) return $data;

		$JNotifications = acymailing_loadResultArray('SELECT LCASE(`alias`) FROM `#__acymailing_mail` WHERE `type` = \'joomlanotification\'');

		if(ACYMAILING_J30){
			if(!in_array(strtolower('joomla-directRegNoPwd-j3'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_USERS_EMAIL_ACCOUNT_DETAILS|param1|param2}', '{trans:COM_USERS_EMAIL_REGISTERED_BODY_NOPW|param1|param2|param3}');
				$data[] = "('{trans:COM_USERS_EMAIL_ACCOUNT_DETAILS|param1|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'joomla-directRegNoPwd-j3', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('joomla-directReg-j3'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_USERS_EMAIL_ACCOUNT_DETAILS|param1|param2}', '{trans:COM_USERS_EMAIL_REGISTERED_BODY|param1|param2|param3|param4|param5}');
				$data[] = "('{trans:COM_USERS_EMAIL_ACCOUNT_DETAILS|param1|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'joomla-directReg-j3', 1, ".$conftemplate.",NULL,'')";
			}
		}elseif(ACYMAILING_J16){
			if(!in_array(strtolower('joomla-directReg'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_USERS_EMAIL_ACCOUNT_DETAILS|param1|param2}', '{trans:COM_USERS_EMAIL_REGISTERED_BODY|param1|param2|param3}');
				$data[] = "('{trans:COM_USERS_EMAIL_ACCOUNT_DETAILS|param1|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'joomla-directReg', 1, ".$conftemplate.",NULL,'')";
			}
		}
		if(ACYMAILING_J16){
			if(!in_array(strtolower('joomla-ownActivReg'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_USERS_EMAIL_ACCOUNT_DETAILS|param1|param2}', '{trans:COM_USERS_EMAIL_REGISTERED_WITH_ACTIVATION_BODY|param1|param2|param3|param4|param5|param6}');
				$data[] = "('{trans:COM_USERS_EMAIL_ACCOUNT_DETAILS|param1|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'joomla-ownActivReg', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('joomla-ownActivRegNoPwd'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_USERS_EMAIL_ACCOUNT_DETAILS|param1|param2}', '{trans:COM_USERS_EMAIL_REGISTERED_WITH_ACTIVATION_BODY_NOPW|param1|param2|param3|param4|param5}');
				$data[] = "('{trans:COM_USERS_EMAIL_ACCOUNT_DETAILS|param1|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'joomla-ownActivRegNoPwd', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('joomla-adminActivReg'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_USERS_EMAIL_ACCOUNT_DETAILS|param1|param2}', '{trans:COM_USERS_EMAIL_REGISTERED_WITH_ADMIN_ACTIVATION_BODY|param1|param2|param3|param4|param5|param6}');
				$data[] = "('{trans:COM_USERS_EMAIL_ACCOUNT_DETAILS|param1|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'joomla-adminActivReg', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('joomla-adminActivRegNoPwd'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_USERS_EMAIL_ACCOUNT_DETAILS|param1|param2}', '{trans:COM_USERS_EMAIL_REGISTERED_WITH_ADMIN_ACTIVATION_BODY_NOPW|param1|param2|param3|param4|param5}');
				$data[] = "('{trans:COM_USERS_EMAIL_ACCOUNT_DETAILS|param1|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'joomla-adminActivRegNoPwd', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('joomla-usernameReminder'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_USERS_EMAIL_USERNAME_REMINDER_SUBJECT|param1}', '{trans:COM_USERS_EMAIL_USERNAME_REMINDER_BODY|param1|param2|param3}');
				$data[] = "('{trans:COM_USERS_EMAIL_USERNAME_REMINDER_SUBJECT|param1}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'joomla-usernameReminder', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('joomla-confirmActiv'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_USERS_EMAIL_ACTIVATED_BY_ADMIN_ACTIVATION_SUBJECT|param1|param2}', '{trans:COM_USERS_EMAIL_ACTIVATED_BY_ADMIN_ACTIVATION_BODY|param1|param2|param3}');
				$data[] = "('{trans:COM_USERS_EMAIL_ACTIVATED_BY_ADMIN_ACTIVATION_SUBJECT|param1|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'joomla-confirmActiv', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('joomla-resetPwd'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_USERS_EMAIL_PASSWORD_RESET_SUBJECT|param1}', '{trans:COM_USERS_EMAIL_PASSWORD_RESET_BODY|param1|param2|param3}');
				$data[] = "('{trans:COM_USERS_EMAIL_PASSWORD_RESET_SUBJECT|param1}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'joomla-resetPwd', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('joomla-regByAdmin'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:PLG_USER_JOOMLA_NEW_USER_EMAIL_SUBJECT}', '{trans:PLG_USER_JOOMLA_NEW_USER_EMAIL_BODY|param1|param2|param3|param4|param5}');
				$data[] = "('{trans:PLG_USER_JOOMLA_NEW_USER_EMAIL_SUBJECT}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'joomla-regByAdmin', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('joomla-regNotifAdmin'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_USERS_EMAIL_ACCOUNT_DETAILS|param1|param2}', '{trans:COM_USERS_EMAIL_REGISTERED_NOTIFICATION_TO_ADMIN_BODY|param1|param2|param3}');
				$data[] = "('{trans:COM_USERS_EMAIL_ACCOUNT_DETAILS|param1|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'joomla-regNotifAdmin', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('joomla-regNotifAdminActiv'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_USERS_EMAIL_ACTIVATE_WITH_ADMIN_ACTIVATION_SUBJECT|param2|param1}', '{trans:COM_USERS_EMAIL_ACTIVATE_WITH_ADMIN_ACTIVATION_BODY|param1|param2|param3|param4|param5}');
				$data[] = "('{trans:COM_USERS_EMAIL_ACTIVATE_WITH_ADMIN_ACTIVATION_SUBJECT|param2|param1}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'joomla-regNotifAdminActiv', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('joomla-frontsendarticle'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{senderSubject}', '{trans:COM_MAILTO_EMAIL_MSG|param1|param2|param3|param4}');
				$data[] = "('{senderSubject}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'joomla-frontsendarticle', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('jomsocial-directreg'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_COMMUNITY_ACCOUNT_DETAILS_FOR_WELCOME|param2}', '{trans:COM_COMMUNITY_EMAIL_REGISTRATION_ACCOUNT_DETAILS|param1|param2|param3|param4}');
				$data[] = "('{trans:COM_COMMUNITY_ACCOUNT_DETAILS_FOR_WELCOME|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'jomsocial-directreg', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('jomsocial-ownactivreg'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_COMMUNITY_ACCOUNT_DETAILS_FOR|param1|param2}', '{trans:COM_COMMUNITY_EMAIL_REGISTRATION_COMPLETED_REQUIRES_ACTIVATION|param1|param2|param3|param5}');
				$data[] = "('{trans:COM_COMMUNITY_ACCOUNT_DETAILS_FOR|param1|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'jomsocial-ownactivreg', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('jomsocial-welcomeactiv'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_COMMUNITY_ACCOUNT_DETAILS_FOR_WELCOME|param2}', '{trans:COM_COMMUNITY_EMAIL_REGISTRATION_ACCOUNT_DETAILS_REQUIRES_ACTIVATION|param1|param2|param3|param4}');
				$data[] = "('{trans:COM_COMMUNITY_ACCOUNT_DETAILS_FOR_WELCOME|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'jomsocial-welcomeactiv', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('jomsocial-regactivadmin'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_COMMUNITY_ACCOUNT_DETAILS_FOR|param1|param2}', '{trans:COM_COMMUNITY_EMAIL_REGISTRATION_COMPLETED_REQUIRES_ADMIN_ACTIVATION|param1|param2|param3|param5}');
				$data[] = "('{trans:COM_COMMUNITY_ACCOUNT_DETAILS_FOR|param1|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'jomsocial-regactivadmin', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('jomsocial-notifadmin'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_COMMUNITY_ACCOUNT_DETAILS_FOR|param3|param2}', '{trans:COM_COMMUNITY_SEND_MSG_ADMIN|param1|param2|param3|param4|param5}');
				$data[] = "('{trans:COM_COMMUNITY_ACCOUNT_DETAILS_FOR|param3|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'jomsocial-notifadmin', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('jomsocial-notifadminactiv'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_COMMUNITY_ACCOUNT_DETAILS_FOR|param3|param2}', '{trans:COM_COMMUNITY_USER_REGISTERED_NEEDS_APPROVAL|param1|param2|param3|param4|param5}');
				$data[] = "('{trans:COM_COMMUNITY_ACCOUNT_DETAILS_FOR|param3|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'jomsocial-notifadminactiv', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('jomsocial-notifactivated'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_COMMUNITY_EMAIL_ACTIVATED_BY_ADMIN_ACTIVATION_SUBJECT|param1|param2}', '{trans:COM_COMMUNITY_EMAIL_ACTIVATED_BY_ADMIN_ACTIVATION_BODY|param1|param2|param3}');
				$data[] = "('{trans:COM_COMMUNITY_EMAIL_ACTIVATED_BY_ADMIN_ACTIVATION_SUBJECT|param1|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'jomsocial-notifactivated', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('jomsocial-notifaccountparameters'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_COMMUNITY_USER_REGISTERED_WAITING_APPROVAL_TITLE|param2}', '{trans:COM_COMMUNITY_EMAIL_REGISTRATION|param1|param2|param3|param4}');
				$data[] = "('{trans:COM_COMMUNITY_USER_REGISTERED_WAITING_APPROVAL_TITLE|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'jomsocial-notifaccountparameters', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('seblod-directreg'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_CCK_EMAIL_ACCOUNT_DETAILS|param1|param2}', '{trans:COM_CCK_EMAIL_REGISTERED_BODY|param1|param2|param3|param4|param5}');
				$data[] = "('{trans:COM_CCK_EMAIL_ACCOUNT_DETAILS|param1|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'seblod-directreg', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('seblod-directregnopwd'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_CCK_EMAIL_ACCOUNT_DETAILS|param1|param2}', '{trans:COM_CCK_EMAIL_REGISTERED_BODY_NOPW|param1|param2|param3}');
				$data[] = "('{trans:COM_CCK_EMAIL_ACCOUNT_DETAILS|param1|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'seblod-directregnopwd', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('seblod-notifadmin'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:ACY_DEFAULT_NOTIF_SUBJECT}', '{trans:COM_CCK_EMAIL_REGISTERED_NOTIFICATION_TO_ADMIN_BODY|param1|param2|param3}');
				$data[] = "('{trans:ACY_DEFAULT_NOTIF_SUBJECT}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'seblod-notifadmin', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('seblod-ownactivreg'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_CCK_EMAIL_ACCOUNT_DETAILS|param1|param2}', '{trans:COM_CCK_EMAIL_REGISTERED_WITH_ACTIVATION_BODY|param1|param2|param3|param4|param5|param6}');
				$data[] = "('{trans:COM_CCK_EMAIL_ACCOUNT_DETAILS|param1|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'seblod-ownactivreg', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('seblod-ownactivregnopwd'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_CCK_EMAIL_ACCOUNT_DETAILS|param1|param2}', '{trans:COM_CCK_EMAIL_REGISTERED_WITH_ACTIVATION_BODY_NOPW|param1|param2|param3|param4|param5}');
				$data[] = "('{trans:COM_CCK_EMAIL_ACCOUNT_DETAILS|param1|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'seblod-ownactivregnopwd', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('seblod-adminactivreg'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_CCK_EMAIL_ACCOUNT_DETAILS|param1|param2}', '{trans:COM_CCK_EMAIL_REGISTERED_WITH_ADMIN_ACTIVATION_BODY|param1|param2|param3|param4|param5|param6}');
				$data[] = "('{trans:COM_CCK_EMAIL_ACCOUNT_DETAILS|param1|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'seblod-adminactivreg', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('seblod-adminactivregnopwd'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:COM_CCK_EMAIL_ACCOUNT_DETAILS|param1|param2}', '{trans:COM_CCK_EMAIL_REGISTERED_WITH_ADMIN_ACTIVATION_BODY_NOPW|param1|param2|param3|param4|param5}');
				$data[] = "('{trans:COM_CCK_EMAIL_ACCOUNT_DETAILS|param1|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'seblod-adminactivregnopwd', 1, ".$conftemplate.",NULL,'')";
			}
		}else{
			if(!in_array(strtolower('joomla-directReg'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:ACCOUNT DETAILS FOR|param1|param2}', '{trans:SEND_MSG|param1|param2|param3}');
				$data[] = "('{trans:ACCOUNT DETAILS FOR|param1|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'joomla-directReg', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('joomla-ownActivReg'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:ACCOUNT DETAILS FOR|param1|param2}', '{trans:SEND_MSG_ACTIVATE|param1|param2|param3|param4|param5|param6}');
				$data[] = "('{trans:ACCOUNT DETAILS FOR|param1|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'joomla-ownActivReg', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('joomla-usernameReminder'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:USERNAME_REMINDER_EMAIL_TITLE|param1}', '{trans:USERNAME_REMINDER_EMAIL_TEXT|param1|param2|param3}');
				$data[] = "('{trans:USERNAME_REMINDER_EMAIL_TITLE|param1}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'joomla-usernameReminder', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('joomla-resetPwd'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:PASSWORD_RESET_CONFIRMATION_EMAIL_TITLE|param1}', '{trans:PASSWORD_RESET_CONFIRMATION_EMAIL_TEXT|param1|param2|param3}');
				$data[] = "('{trans:PASSWORD_RESET_CONFIRMATION_EMAIL_TITLE|param1}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'joomla-resetPwd', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('joomla-regByAdmin'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:NEW_USER_MESSAGE_SUBJECT}', '{trans:NEW_USER_MESSAGE|param1|param2|param3|param4|param5}');
				$data[] = "('{trans:NEW_USER_MESSAGE_SUBJECT}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'joomla-regByAdmin', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('joomla-regNotifAdmin'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{trans:ACCOUNT DETAILS FOR|param3|param2}', '{trans:SEND_MSG_ADMIN|param1|param2|param3|param4|param5}');
				$data[] = "('{trans:ACCOUNT DETAILS FOR|param3|param2}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'joomla-regNotifAdmin', 1, ".$conftemplate.",NULL,'')";
			}
			if(!in_array(strtolower('joomla-frontsendarticle'), $JNotifications)){
				$bodyNotif = $this->getFormatedNotification('{senderSubject}', '{trans:EMAIL_MSG|param1|param2|param3|param4}');
				$data[] = "('{senderSubject}', ".acymailing_escapeDB($bodyNotif).", '', 0, 'joomlanotification', 0, 'joomla-frontsendarticle', 1, ".$conftemplate.",NULL,'')";
			}
		}
		return $data;
	}

	function installMenu($code = ''){
		if(empty($code)) $code = acymailing_getLanguageTag();

		$path = acymailing_getLanguagePath(ACYMAILING_ROOT, $code).DS.$code.'.com_acymailing.ini';
		if(!file_exists($path) || strpos($path, $code.DS.$code) === false) return;
		$content = file_get_contents($path);
		if(empty($content)) return;

		$menuFileContent = 'COM_ACYMAILING="AcyMailing"'."\r\n";
		$menuFileContent .= 'ACYMAILING="AcyMailing"'."\r\n";
		$menuFileContent .= 'COM_ACYMAILING_CONFIGURATION="AcyMailing"'."\r\n";
		$menuStrings = array('USERS', 'LISTS', 'TEMPLATES', 'NEWSLETTERS', 'AUTONEWSLETTERS', 'CAMPAIGN', 'QUEUE', 'STATISTICS', 'CONFIGURATION', 'UPDATE_ABOUT', 'COM_ACYMAILING_ARCHIVE_VIEW_DEFAULT_TITLE', 'COM_ACYMAILING_FRONTSUBSCRIBER_VIEW_DEFAULT_TITLE', 'COM_ACYMAILING_LISTS_VIEW_DEFAULT_TITLE', 'COM_ACYMAILING_FRONTNEWSLETTER_VIEW_DEFAULT_TITLE', 'COM_ACYMAILING_USER_VIEW_DEFAULT_TITLE');
		foreach($menuStrings as $oneString){
			preg_match('#(\n|\r)(ACY_)?'.$oneString.'="(.*)"#i', $content, $matches);
			if(empty($matches[3])) continue;
			if(!ACYMAILING_J16){
				$menuFileContent .= 'COM_ACYMAILING.'.$oneString.'="'.$matches[3].'"'."\r\n";
			}else{
				$menuFileContent .= $oneString.'="'.$matches[3].'"'."\r\n";
			}
		}

		if(!ACYMAILING_J16){
			$menuPath = ACYMAILING_ROOT.'administrator'.DS.'language'.DS.$code.DS.$code.'.com_acymailing.menu.ini';
		}else{
			$menuPath = ACYMAILING_ROOT.'administrator'.DS.'language'.DS.$code.DS.$code.'.com_acymailing.sys.ini';
		}
		if(!acymailing_writeFile($menuPath, $menuFileContent)){
			acymailing_enqueueMessage(acymailing_translation_sprintf('FAIL_SAVE', $menuPath), 'error');
		}
	}

	function installTemplates(){
		$path = ACYMAILING_TEMPLATE;
		$dirs = acymailing_getFolders($path);

		$template = array();
		$order = 0;
		foreach($dirs as $oneTemplateDir){
			$order++;
			$description = '';
			$name = '';
			$body = '';
			$altbody = '';
			$readmore = '';
			$thumb = '';
			$premium = 0;
			$ordering = $order;
			$styles = array();
			$stylesheet = '';
			if(!@include($path.DS.$oneTemplateDir.DS.'install.php')) continue;
			$body = str_replace(array('src="./', 'src="../', 'src="images/'), array('src="'.ACYMAILING_MEDIA_URL.'templates/'.$oneTemplateDir.'/', 'src="'.ACYMAILING_MEDIA_URL.'templates/', 'src="'.ACYMAILING_MEDIA_URL.'templates/'.$oneTemplateDir.'/images/'), $body);

			$template[] = acymailing_escapeDB($oneTemplateDir).','.acymailing_escapeDB($name).','.acymailing_escapeDB($description).','.acymailing_escapeDB($body).','.acymailing_escapeDB($altbody).','.acymailing_escapeDB($premium).','.acymailing_escapeDB($ordering).','.acymailing_escapeDB(serialize($styles)).','.acymailing_escapeDB($stylesheet).','.acymailing_escapeDB($thumb).','.acymailing_escapeDB($readmore);
		}

		if(empty($template)) return true;

		try{
			$nbTemplates = acymailing_query("INSERT IGNORE INTO `#__acymailing_template` (`namekey`, `name`, `description`, `body`, `altbody`, `premium`, `ordering`, `styles`,`stylesheet`,`thumb`,`readmore`) VALUES (".implode('),(', $template).')');

			$lastId = acymailing_insertID();
		}catch(Exception $e){
			acymailing_enqueueMessage(substr(strip_tags($e->getMessage()), 0, 300).'...', 'error');
			$nbTemplates = null;
		}

		if(!empty($nbTemplates)){
			acymailing_enqueueMessage(acymailing_translation_sprintf('TEMPLATES_INSTALL', $nbTemplates), 'success');

			$templateClass = acymailing_get('class.template');
			for($i = $lastId; $i <= $lastId + count($template); $i++){
				$templateClass->createTemplateFile($i);
			}
		}
	}

	function initList(){

		$query = 'UPDATE IGNORE '.acymailing_table($this->cmsUserVars->table, false).' as b, '.acymailing_table('subscriber').' as a SET a.email = b.'.$this->cmsUserVars->email.', a.name = b.'.$this->cmsUserVars->name.' WHERE a.userid = b.'.$this->cmsUserVars->id.' AND a.userid > 0';
		acymailing_query($query);

		$query = 'INSERT IGNORE INTO `#__acymailing_subscriber` (`email`,`name`,`confirmed`,`userid`,`created`,`enabled`,`accept`,`html`) SELECT `'.$this->cmsUserVars->email.'`,`'.$this->cmsUserVars->name.'`,1-`'.$this->cmsUserVars->blocked.'`,`'.$this->cmsUserVars->id.'`,UNIX_TIMESTAMP(`'.$this->cmsUserVars->registered.'`),1-`'.$this->cmsUserVars->blocked.'`,1,1 FROM '.acymailing_table($this->cmsUserVars->table, false);
		acymailing_query($query);

		$nbLists = acymailing_loadResult('SELECT COUNT(*) FROM `#__acymailing_list`');

		if(!empty($nbLists)) return true;

		acymailing_query("INSERT INTO `#__acymailing_list` (`name`, `description`, `ordering`, `published`, `alias`, `color`, `visible`, `type`,`userid`) VALUES ('Newsletters','Receive our latest news','1','1','mailing_list','#3366ff','1','list',".(int)acymailing_currentUserId().")");
		$listid = acymailing_insertID();


		$time = time();
		acymailing_query('INSERT IGNORE INTO `#__acymailing_listsub` (`listid`, `subid`, `subdate`, `status`) SELECT '.$listid.', subid, '.$time.',1 FROM `#__acymailing_subscriber`');
	}


	function installBounceRules(){
		if(!acymailing_level(3)) return;

		if(acymailing_loadResult('SELECT COUNT(*) FROM #__acymailing_rules') > 0) return;


		$config = acymailing_config();
		if($config->get('reply_email') != $config->get('bounce_email')){
			$forwardEmail = strlen($config->get('reply_email')).':"'.$config->get('reply_email').'"';
		}else $forwardEmail = strlen($config->get('from_email')).':"'.$config->get('from_email').'"';

		$query = 'INSERT INTO `#__acymailing_rules` (`name`, `ordering`, `regex`, `executed_on`, `action_message`, `action_user`, `published`) VALUES ';
		$query .= '(\'ACY_RULE_ACTION\', 1, \'action *requ|verif\', \'a:1:{s:7:"subject";s:1:"1";}\', \'a:2:{s:6:"delete";s:1:"1";s:9:"forwardto";s:'.$forwardEmail.';}\', \'a:1:{s:3:"min";s:1:"0";}\', 1),';
		$query .= '(\'ACY_RULE_ACKNOWLEDGE\', 2, \'(out|away) *(of|from)|vacation|holiday|absen|congés|recept|acknowledg|thank you for\', \'a:1:{s:7:"subject";s:1:"1";}\', \'a:1:{s:6:"delete";s:1:"1";}\', \'a:1:{s:3:"min";s:1:"0";}\', 1),';
		$query .= '(\'ACY_RULE_LOOP\', 3, \'feedback|staff@hotmail.com|complaints@.{0,15}email-abuse.amazonses.com|complaint about message\', \'a:2:{s:10:"senderinfo";s:1:"1";s:7:"subject";s:1:"1";}\', \'a:3:{s:4:"save";s:1:"1";s:6:"delete";s:1:"1";s:9:"forwardto";s:0:"";}\', \'a:2:{s:3:"min";s:1:"0";s:5:"unsub";s:1:"1";}\', 1),';
		$query .= '(\'ACY_RULE_LOOP_BODY\', 4, \'Feedback-Type.{1,5}abuse\', \'a:1:{s:4:"body";s:1:"1";}\', \'a:3:{s:4:"save";s:1:"1";s:6:"delete";s:1:"1";s:9:"forwardto";s:0:"";}\', \'a:2:{s:3:"min";s:1:"0";s:5:"unsub";s:1:"1";}\', 1),';
		$query .= '(\'ACY_RULE_FULL\', 5, \'((mailbox|mailfolder|storage|quota|space|inbox) *(is)? *(over)? *(exceeded|size|storage|allocation|full|quota|maxi))|status(-code)? *(:|=)? *5\.2\.2|quota-issue|not *enough.{1,20}space|((over|exceeded|full|exhausted) *(allowed)? *(mail|storage|quota))\', \'a:2:{s:7:"subject";s:1:"1";s:4:"body";s:1:"1";}\', \'a:3:{s:4:"save";s:1:"1";s:6:"delete";s:1:"1";s:9:"forwardto";s:0:"";}\', \'a:3:{s:5:"stats";s:1:"1";s:3:"min";s:1:"3";s:5:"block";s:1:"1";}\', 1),';
		$query .= '(\'ACY_RULE_GOOGLE\', 6, \'message *rejected *by *Google *Groups\',  \'a:1:{s:4:"body";s:1:"1";}\', \'a:2:{s:6:"delete";s:1:"1";s:9:"forwardto";s:'.$forwardEmail.';}\', \'a:2:{s:5:"stats";s:1:"1";s:3:"min";s:1:"0";}\', 1),';
		$query .= '(\'ACY_RULE_EXIST1\', 7, \'(Invalid|no such|unknown|bad|des?activated|inactive|unrouteable) *(mail|destination|recipient|user|address|person)|bad-mailbox|inactive-mailbox|not listed in.{1,20}directory|RecipNotFound|(user|mailbox|address|recipients?|host|account|domain) *(is|has been)? *(error|disabled|failed|unknown|unavailable|not *(found|available)|.{1,30}inactiv)|no *mailbox *here|user does.?n.t have.{0,30}account\', \'a:2:{s:7:"subject";s:1:"1";s:4:"body";s:1:"1";}\', \'a:3:{s:4:"save";s:1:"1";s:6:"delete";s:1:"1";s:9:"forwardto";s:0:"";}\', \'a:3:{s:5:"stats";s:1:"1";s:3:"min";s:1:"0";s:5:"block";s:1:"1";}\', 1),';
		$query .= '(\'ACY_RULE_FILTERED\',8, \'blocked *by|block *list|look(ed)? *like *spam|spam-related|spam *detected| CXBL | CDRBL | IPBL | URLBL |(unacceptable|banned|offensive|filtered|blocked|unsolicited) *(content|message|e?-?mail)|service refused|(status(-code)?|554) *(:|=)? *5\.7\.1|administratively *denied|blacklisted *IP|policy *reasons|rejected.{1,10}spam|junkmail *rejected|throttling *constraints|exceeded.{1,10}max.{1,40}hour|comply with required standards|421 RP-00|550 SC-00|550 DY-00|550 OU-00\', \'a:1:{s:4:"body";s:1:"1";}\', \'a:2:{s:6:"delete";s:1:"1";s:9:"forwardto";s:'.$forwardEmail.';}\', \'a:2:{s:5:"stats";s:1:"1";s:3:"min";s:1:"0";}\', 1),';
		$query .= '(\'ACY_RULE_EXIST2\', 9, \'status(-code)? *(:|=)? *5\.(1\.[1-6]|0\.0|4\.[0123467])|recipient *address *rejected|does *not *like *recipient\', \'a:2:{s:7:"subject";s:1:"1";s:4:"body";s:1:"1";}\', \'a:3:{s:4:"save";s:1:"1";s:6:"delete";s:1:"1";s:9:"forwardto";s:0:"";}\', \'a:3:{s:5:"stats";s:1:"1";s:3:"min";s:1:"0";s:5:"block";s:1:"1";}\', 1),';
		$query .= '(\'ACY_RULE_DOMAIN\', 10, \'No.{1,10}MX *(record|host)|host *does *not *receive *any *mail|bad-domain|connection.{1,10}mail.{1,20}fail|domain.{1,10}not *exist|fail.{1,10}establish *connection\', \'a:2:{s:7:"subject";s:1:"1";s:4:"body";s:1:"1";}\', \'a:3:{s:4:"save";s:1:"1";s:6:"delete";s:1:"1";s:9:"forwardto";s:0:"";}\', \'a:3:{s:5:"stats";s:1:"1";s:3:"min";s:1:"0";s:5:"block";s:1:"1";}\', 1),';
		$query .= '(\'ACY_RULE_TEMPORAR\', 11, \'has.*been.*delayed|delayed *mail|message *delayed|message-expired|temporar(il)?y *(failure|unavailable|disable|offline|unable)|deferred|delayed *([0-9]*) *(hour|minut)|possible *mail *loop|too *many *hops|delivery *time *expired|Action: *delayed|status(-code)? *(:|=)? *4\.4\.6|will continue to be attempted\', \'a:2:{s:7:"subject";s:1:"1";s:4:"body";s:1:"1";}\', \'a:3:{s:4:"save";s:1:"1";s:6:"delete";s:1:"1";s:9:"forwardto";s:0:"";}\', \'a:3:{s:5:"stats";s:1:"1";s:3:"min";s:1:"3";s:5:"block";s:1:"1";}\', 1),';
		$query .= '(\'ACY_RULE_PERMANENT\', 12, \'failed *permanently|permanent.{1,20}(failure|error)|not *accepting *(any)? *mail|does *not *exist|no *valid *route|delivery *failure\', \'a:2:{s:7:"subject";s:1:"1";s:4:"body";s:1:"1";}\', \'a:3:{s:4:"save";s:1:"1";s:6:"delete";s:1:"1";s:9:"forwardto";s:0:"";}\', \'a:3:{s:5:"stats";s:1:"1";s:3:"min";s:1:"0";s:5:"block";s:1:"1";}\', 1),';
		$query .= '(\'ACY_RULE_ACKNOWLEDGE_BODY\', 13, \'vacances|holiday|vacation|absen|urlaub\', \'a:1:{s:4:"body";s:1:"1";}\', \'a:1:{s:6:"delete";s:1:"1";}\', \'a:1:{s:3:"min";s:1:"0";}\', 1),';
		$query .= '(\'ACY_RULE_FINAL\', 14, \'.\', \'a:2:{s:10:"senderinfo";s:1:"1";s:7:"subject";s:1:"1";}\', \'a:2:{s:6:"delete";s:1:"1";s:9:"forwardto";s:'.$forwardEmail.';}\', \'a:1:{s:3:"min";s:1:"0";}\', 1)';

		acymailing_query($query);

		$newConfig = new stdClass();
		$newConfig->bouncerulesversion = $this->bouncerulesversion;
		$config->save($newConfig);
	}


	function installExtensions(){
		$path = ACYMAILING_BACK.'extensions';
		$dirs = acymailing_getFolders($path);

		if(!ACYMAILING_J16){
			if(file_exists(ACYMAILING_BACK.'config.xml')) acymailing_deleteFile(ACYMAILING_BACK.'config.xml');

			$query = "SELECT CONCAT(`folder`,`element`) FROM #__plugins WHERE `folder` = 'acymailing' OR `element` LIKE '%acy%'";
			$query .= " UNION SELECT `module` FROM #__modules WHERE `module` LIKE '%acymailing%'";
			$existingExtensions = acymailing_loadResultArray($query);
		}else{

			$existingExtensions = acymailing_loadResultArray("SELECT CONCAT(`folder`,`element`) FROM #__extensions WHERE `folder` = 'acymailing' OR `element` LIKE '%acy%' OR `name` LIKE '%acy%'");
		}
		
		$plugins = array();
		$modules = array();
		$extensioninfo = array(); //array('name','ordering','required table or published')
		$extensioninfo['mod_acymailing'] = array('AcyMailing Module');
		$extensioninfo['plg_acymailing_share'] = array('AcyMailing : share on social networks', 20, 1);
		$extensioninfo['plg_acymailing_contentplugin'] = array('AcyMailing : trigger Joomla Content plugins', 15, 0);
		$extensioninfo['plg_acymailing_managetext'] = array('AcyMailing Manage text', 10, 1);
		$extensioninfo['plg_acymailing_tablecontents'] = array('AcyMailing table of contents generator', 5, 1);
		$extensioninfo['plg_acymailing_online'] = array('AcyMailing Tag : Website links', 6, 1);
		$extensioninfo['plg_acymailing_stats'] = array('AcyMailing : Statistics Plugin', 50, 1);
		$extensioninfo['plg_acymailing_tagcbuser'] = array('AcyMailing Tag : CB User information', 4, '#__comprofiler');
		$extensioninfo['plg_acymailing_tagcontent'] = array('AcyMailing Tag : content insertion', 11, 1);
		$extensioninfo['plg_acymailing_tagmodule'] = array('AcyMailing Tag : Insert a Module', 12, 1);
		$extensioninfo['plg_acymailing_tagsubscriber'] = array('AcyMailing Tag : Subscriber information', 2, 1);
		$extensioninfo['plg_acymailing_tagsubscription'] = array('AcyMailing Tag : Manage the Subscription', 1, 1);
		$extensioninfo['plg_acymailing_tagtime'] = array('AcyMailing Tag : Date / Time', 5, 1);
		$extensioninfo['plg_acymailing_taguser'] = array('AcyMailing Tag : Joomla User Information', 3, 1);
		$extensioninfo['plg_acymailing_template'] = array('AcyMailing Template Class Replacer', 52, 1);
		$extensioninfo['plg_acymailing_urltracker'] = array('AcyMailing : Handle Click tracking part1', 24, 1);
		$extensioninfo['plg_system_acymailingurltracker'] = array('AcyMailing : Handle Click tracking part2', 1, 1);
		$extensioninfo['plg_system_regacymailing'] = array('AcyMailing : (auto)Subscribe during Joomla registration', 0, 1);
		$extensioninfo['plg_editors_acyeditor'] = array('AcyMailing Editor', 5, 1);
		$extensioninfo['plg_acymailing_geolocation'] = array('AcyMailing Geolocation : Tag and filter', 10, 1);
		$extensioninfo['plg_acymailing_plginboxactions'] = array('AcyMailing : Inbox actions', 0, 1);
		$extensioninfo['plg_system_acymailingclassmail'] = array('Override Joomla mailing system', 1, 0);
		$extensioninfo['plg_acymailing_calltoaction'] = array('AcyMailing Tag : Call to action', 22, 1);
		$extensioninfo['plg_system_jceacymailing'] = array('AcyMailing JCE integration', 23, 1);
		$extensioninfo['plg_system_sendinarticle'] = array('AcyMailing : Send mail while editing an article', 10, 1);

		$listTables = acymailing_getTableList();
		$fromVersion = acymailing_getVar('cmd', 'fromversion');

		foreach($dirs as $oneDir){
			$arguments = explode('_', $oneDir);
			if(!isset($extensioninfo[$oneDir])) continue;

			$additionalInfo = new stdClass();
			if($arguments[0] == 'mod') $arguments[2] = $oneDir;
			if(ACYMAILING_J16 && !empty($arguments[2]) && file_exists($path.DS.$oneDir.DS.$arguments[2].'.xml')){
				$xmlFile = simplexml_load_file($path.DS.$oneDir.DS.$arguments[2].'.xml');
				$additionalInfo->version = (string)$xmlFile->version;
				$additionalInfo->author = (string)$xmlFile->author;
				$additionalInfo->creationDate = (string)$xmlFile->creationDate;

				$extension = $arguments[0] == 'mod' ? $oneDir : $arguments[1].$arguments[2];

				if(in_array($extension, $existingExtensions) && version_compare($fromVersion, '4.8.1', '<')){
					$query = "UPDATE `#__extensions` SET `manifest_cache` = ".acymailing_escapeDB(json_encode($additionalInfo))." WHERE (type = ";
					if($arguments[0] == 'mod'){
						$query .= "'module' AND `element` = ".acymailing_escapeDB($oneDir).")";
					}else{
						$query .= "'plugin' AND folder = ".acymailing_escapeDB($arguments[1])." AND `element` = ".acymailing_escapeDB($arguments[2]).")";
					}
					acymailing_query($query);
				}
			}

			if($arguments[0] == 'plg'){
				$newPlugin = new stdClass();
				if(!empty($additionalInfo)) $newPlugin->additionalInfo = json_encode($additionalInfo);
				$newPlugin->name = $oneDir;
				if(isset($extensioninfo[$oneDir][0])) $newPlugin->name = $extensioninfo[$oneDir][0];
				$newPlugin->type = 'plugin';
				$newPlugin->folder = $arguments[1];
				$newPlugin->element = $arguments[2];
				$newPlugin->enabled = 1;
				if(isset($extensioninfo[$oneDir][2])){
					if(is_numeric($extensioninfo[$oneDir][2])){
						$newPlugin->enabled = $extensioninfo[$oneDir][2];
					}elseif(!in_array(str_replace('#__', acymailing_getPrefix(), $extensioninfo[$oneDir][2]), $listTables)) $newPlugin->enabled = 0;
				}
				$newPlugin->params = '{}';
				$newPlugin->ordering = 0;
				if(isset($extensioninfo[$oneDir][1])) $newPlugin->ordering = $extensioninfo[$oneDir][1];

				if(!acymailing_createDir(ACYMAILING_ROOT.'plugins'.DS.$newPlugin->folder)) continue;

				if(!ACYMAILING_J16){
					$destinationFolder = ACYMAILING_ROOT.'plugins'.DS.$newPlugin->folder;
				}else{
					$destinationFolder = ACYMAILING_ROOT.'plugins'.DS.$newPlugin->folder.DS.$newPlugin->element;
					if(!acymailing_createDir($destinationFolder)) continue;
				}

				if(!$this->copyFolder($path.DS.$oneDir, $destinationFolder)) continue;

				if(in_array($newPlugin->folder.$newPlugin->element, $existingExtensions)) continue;

				$plugins[] = $newPlugin;
			}elseif($arguments[0] == 'mod'){
				$newModule = new stdClass();
				if(!empty($additionalInfo)) $newModule->additionalInfo = json_encode($additionalInfo);
				$newModule->name = $oneDir;
				if(isset($extensioninfo[$oneDir][0])) $newModule->name = $extensioninfo[$oneDir][0];
				$newModule->type = 'module';
				$newModule->folder = '';
				$newModule->element = $oneDir;
				$newModule->enabled = 1;
				$newModule->params = '{}';
				$newModule->ordering = 0;
				if(isset($extensioninfo[$oneDir][1])) $newModule->ordering = $extensioninfo[$oneDir][1];

				$destinationFolder = ACYMAILING_ROOT.'modules'.DS.$oneDir;

				if(!acymailing_createDir($destinationFolder)) continue;

				if(!$this->copyFolder($path.DS.$oneDir, $destinationFolder)) continue;

				if(in_array($newModule->element, $existingExtensions)) continue;

				$modules[] = $newModule;
			}else{
				acymailing_enqueueMessage('Could not handle : '.$oneDir, 'error');
			}
		}

		if(!empty($this->errors)) acymailing_enqueueMessage($this->errors, 'error');

		if(!ACYMAILING_J16){
			$extensions = $plugins;
		}else{
			$extensions = array_merge($plugins, $modules);
		}

		$success = array();
		if(!empty($extensions)){
			if(!ACYMAILING_J16){
				$queryExtensions = 'INSERT INTO `#__plugins` (`name`,`element`,`folder`,`published`,`ordering`) VALUES ';
			}else{
				$queryExtensions = 'INSERT INTO `#__extensions` (`name`,`element`,`folder`,`enabled`,`ordering`,`type`,`access`,`manifest_cache`,`client_id`,`params`) VALUES ';
			}

			foreach($extensions as $oneExt){
				$queryExtensions .= '('.acymailing_escapeDB($oneExt->name).','.acymailing_escapeDB($oneExt->element).','.acymailing_escapeDB($oneExt->folder).','.$oneExt->enabled.','.$oneExt->ordering;
				if(ACYMAILING_J16) $queryExtensions .= ','.acymailing_escapeDB($oneExt->type).',1,'.acymailing_escapeDB(!empty($oneExt->additionalInfo) ? $oneExt->additionalInfo : '').",0,'{}'";
				$queryExtensions .= '),';
				if($oneExt->type != 'module') $success[] = acymailing_translation_sprintf('PLUG_INSTALLED', $oneExt->name);
			}
			$queryExtensions = trim($queryExtensions, ',');

			acymailing_query($queryExtensions);
		}

		if(!empty($modules)){
			foreach($modules as $oneModule){
				if(!ACYMAILING_J16){
					$queryModule = 'INSERT INTO `#__modules` (`title`,`position`,`published`,`module`) VALUES ';
					$queryModule .= '('.acymailing_escapeDB($oneModule->name).",'left',0,".acymailing_escapeDB($oneModule->element).")";
				}else{
					$queryModule = 'INSERT INTO `#__modules` (`title`,`position`,`published`,`module`,`access`,`language`,`client_id`,`params`) VALUES ';
					$queryModule .= '('.acymailing_escapeDB($oneModule->name).",'position-7',0,".acymailing_escapeDB($oneModule->element).",1,'*',0,'{}')";
				}
				acymailing_query($queryModule);
				$moduleId = acymailing_insertID();

				acymailing_query('INSERT IGNORE INTO `#__modules_menu` (`moduleid`,`menuid`) VALUES ('.$moduleId.',0)');

				$success[] = acymailing_translation_sprintf('MODULE_INSTALLED', $oneModule->name);
			}
		}

		if(ACYMAILING_J16){
			acymailing_query("UPDATE `#__extensions` SET `access` = 1 WHERE ( `folder` = 'acymailing' OR `element` LIKE '%acymailing%' ) AND `type` = 'plugin'");
		}

		$this->cleanPluginCache();

		if(!empty($success)) acymailing_enqueueMessage($success, 'success');
	}

	function copyFolder($from, $to){
		$return = true;

		$allFiles = acymailing_getFiles($from);
		foreach($allFiles as $oneFile){
			if(file_exists($to.DS.'index.html') AND $oneFile == 'index.html') continue;
			if(acymailing_copyFile($from.DS.$oneFile, $to.DS.$oneFile) !== true){
				$this->errors[] = 'Could not copy the file from '.$from.DS.$oneFile.' to '.$to.DS.$oneFile;
				$return = false;
			}
			if(ACYMAILING_J30 && substr($oneFile, -4) == '.xml'){
				$data = file_get_contents($to.DS.$oneFile);
				if(strpos($data, '<install ') !== false){
					$data = str_replace(array('<install ', '</install>', 'version="1.5"', '<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/plugin-install.dtd">'), array('<extension ', '</extension>', 'version="2.5"', ''), $data);
					acymailing_writeFile($to.DS.$oneFile, $data);
				}
			}
		}
		$allFolders = acymailing_getFolders($from);
		if(!empty($allFolders)){
			foreach($allFolders as $oneFolder){
				if(!acymailing_createDir($to.DS.$oneFolder)) continue;
				if(!$this->copyFolder($from.DS.$oneFolder, $to.DS.$oneFolder)) $return = false;
			}
		}
		return $return;
	}

	public function cleanPluginCache(){
		if(!ACYMAILING_J16 || !class_exists('JCache')) return;

		$options = array('defaultgroup' => 'com_plugins', 'cachebase' => acymailing_getCMSConfig('cache_path', ACYMAILING_ROOT.'cache'));

		$cache = JCache::getInstance('callback', $options);
		$cache->clean();

		$resultsTrigger = acymailing_trigger('onContentCleanCache', $options);
	}

	function installLanguages($output = true){
		$siteLanguages = acymailing_getLanguages();
		if(!empty($siteLanguages[ACYMAILING_DEFAULT_LANGUAGE])) unset($siteLanguages[ACYMAILING_DEFAULT_LANGUAGE]);

		$installedLanguages = array_keys($siteLanguages);
		if(empty($installedLanguages)) return;

		if(!$output) {
			$newConfig = new stdClass();
			$newConfig->installlang = implode(',', $installedLanguages);
			$config = acymailing_config();
			$config->save($newConfig);
			return;
		}
		
		$js = '
			var xhr = new XMLHttpRequest();
			xhr.open("GET", "' . acymailing_prepareAjaxURL('file') . '&task=installLanguages&languages=' . implode(',', $installedLanguages) . '");
			xhr.onload = function(){
				container = document.getElementById("acymailing_div");
				container.innerHTML = xhr.responseText+container.innerHTML;
			};
			xhr.send();';
		acymailing_addScript(true, $js);
	}
}
components/com_acymailing/helpers/queue.php000060400000033770152453623450015222 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class acyqueueHelper{

	var $mailid = 0;
	var $report = true;
	var $send_limit = 0;
	var $finish = false;
	var $error = false;
	var $nbprocess = 0;
	var $start = 0;
	var $stoptime = 0;
	var $successSend = 0;
	var $errorSend = 0;
	var $consecutiveError = 0;
	var $messages = array();
	var $pause = 0;
	var $config;
	var $listsubClass;
	var $subClass;
	var $mod_security2 = false;
	var $obend = 0;
	var $emailtypes = array();

	public function __construct(){
		$this->config = acymailing_config();
		$this->subClass = acymailing_get('class.subscriber');
		$this->listsubClass = acymailing_get('class.listsub');
		$this->listsubClass->checkAccess = false;
		$this->listsubClass->sendNotif = false;
		$this->listsubClass->sendConf = false;

		$this->send_limit = (int)$this->config->get('queue_nbmail', 40);

		acymailing_increasePerf();

		@ini_set('default_socket_timeout', 10);

		@ignore_user_abort(true);

		$timelimit = intval(ini_get('max_execution_time'));
		if(empty($timelimit)) $timelimit = 600;

		$calculatedTimeout = $this->config->get('max_execution_time');
		if(!empty($calculatedTimeout)) $timelimit = $calculatedTimeout;

		if(!empty($timelimit)){
			$this->stoptime = time() + $timelimit - 4;
		}
	}

	public function process(){

		$queueClass = acymailing_get('class.queue');
		$queueClass->emailtypes = $this->emailtypes;
		$queueElements = $queueClass->getReady($this->send_limit, $this->mailid);

		if(empty($queueElements)){
			$this->finish = true;
			if($this->report){
				acymailing_display('<a href="'.acymailing_completeLink('queue').'" target="_blank">'.acymailing_translation('NO_PROCESS').'</a>', 'warning');
			}
			return true;
		}

		if($this->report){
			if(function_exists('apache_get_modules')){
				$modules = apache_get_modules();
				$this->mod_security2 = in_array('mod_security2', $modules);
			}

			@ini_set('output_buffering', 'off');
			@ini_set('zlib.output_compression', 0);

			if(!headers_sent()){
				while(ob_get_level() > 0 && $this->obend++ < 3){
					@ob_end_flush();
				}
			}

			$disp = '<html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8" />';
			$disp .= '<title>'.acymailing_translation('SEND_PROCESS').'</title>';
			$disp .= '<style>body{font-size:12px;font-family: Arial,Helvetica,sans-serif;}</style></head><body>';
			$disp .= '<div style="margin-bottom: 18px;padding: 8px !important; background-color: #fcf8e3; border: 1px solid #fbeed5; border-radius: 4px;"><p style="margin:0;">'.acymailing_translation('ACY_DONT_CLOSE').'</p></div>';
			$disp .= "<div style='display: inline;background-color : white;border : 1px solid grey; padding : 3px;font-size:14px'>";
			$disp .= "<span id='divpauseinfo' style='padding:10px;margin:5px;font-size:16px;font-weight:bold;display:none;background-color:black;color:white;'> </span>";
			$disp .= acymailing_translation('SEND_PROCESS').': <span id="counter" >'.$this->start.'</span> / '.$this->total;
			$disp .= '</div>';
			$disp .= "<div id='divinfo' style='display:none; position:fixed; bottom:3px;left:3px;background-color : white; border : 1px solid grey; padding : 3px;'> </div>";
			$disp .= '<br /><br />';
			$url = acymailing_completeLink('send&task=continuesend&mailid='.$this->mailid.'&totalsend='.$this->total, true, true).'&alreadysent=';
			$disp .= '<script type="text/javascript" language="javascript">';
			$disp .= 'var mycounter = document.getElementById("counter");';
			$disp .= 'var divinfo = document.getElementById("divinfo");
					var divpauseinfo = document.getElementById("divpauseinfo");
					function setInfo(message){ divinfo.style.display = \'block\';divinfo.innerHTML=message; }
					function setPauseInfo(nbpause){ divpauseinfo.style.display = \'\';divpauseinfo.innerHTML=nbpause;}
					function setCounter(val){ mycounter.innerHTML=val;}
					var scriptpause = '.intval($this->pause).';
					function handlePause(){
						setPauseInfo(scriptpause);
						if(scriptpause > 0){
							scriptpause = scriptpause - 1;
							setTimeout(\'handlePause()\',1000);
						}else{
							document.location.href=\''.$url.'\'+mycounter.innerHTML;
						}
					}
					</script>';
			echo $disp;
			if(function_exists('ob_flush')) @ob_flush();
			if(!$this->mod_security2) @flush();
		}//endifreport

		$mailHelper = acymailing_get('helper.mailer');
		$mailHelper->report = false;
		if($this->config->get('smtp_keepalive', 1) || in_array($this->config->get('mailer_method'), array('elasticemail'))) $mailHelper->SMTPKeepAlive = true;

		$queueDelete = array();
		$queueUpdate = array();
		$statsAdd = array();
		$actionSubscriber = array();

		$maxTry = (int)$this->config->get('queue_try', 0);

		$currentMail = $this->start;
		$this->nbprocess = 0;

		if(count($queueElements) < $this->send_limit){
			$this->finish = true;
		}

		foreach($queueElements as $oneQueue){
			$currentMail++;
			$this->nbprocess++;
			if($this->report){
				echo '<script type="text/javascript" language="javascript">setCounter('.$currentMail.')</script>';
				if(function_exists('ob_flush')) @ob_flush();
				if(!$this->mod_security2){
					@flush();
				}
			}

			$result = $mailHelper->sendOne($oneQueue->mailid, $oneQueue);

			$queueDeleteOk = true;
			$otherMessage = '';

			if($result){
				$this->successSend++;
				$this->consecutiveError = 0;
				$queueDelete[$oneQueue->mailid][] = $oneQueue->subid;
				$statsAdd[$oneQueue->mailid][1][(int)$mailHelper->sendHTML][] = $oneQueue->subid;

				$queueDeleteOk = $this->_deleteQueue($queueDelete);
				$queueDelete = array();

				if($this->nbprocess % 10 == 0){
					$this->statsAdd($statsAdd);
					$this->_queueUpdate($queueUpdate);
					$statsAdd = array();
					$queueUpdate = array();
				}
			}else{
				$this->errorSend++;

				$newtry = false;
				if(in_array($mailHelper->errorNumber, $mailHelper->errorNewTry)){
					if(empty($maxTry) OR $oneQueue->try < $maxTry - 1){
						$newtry = true;
						$otherMessage = acymailing_translation_sprintf('QUEUE_NEXT_TRY', 60);
					}
					if($mailHelper->errorNumber == 1) $this->consecutiveError++;
					if($this->consecutiveError == 2) sleep(1);
				}

				if(!$newtry){
					$queueDelete[$oneQueue->mailid][] = $oneQueue->subid;
					$statsAdd[$oneQueue->mailid][0][(int)@$mailHelper->sendHTML][] = $oneQueue->subid;
					if($mailHelper->errorNumber == 1 AND $this->config->get('bounce_action_maxtry')){
						$queueDeleteOk = $this->_deleteQueue($queueDelete);
						$queueDelete = array();
						$otherMessage .= $this->_subscriberAction($oneQueue->subid);
					}
				}else{
					$queueUpdate[$oneQueue->mailid][] = $oneQueue->subid;
				}
			}

			$messageOnScreen = '[ ID '.$oneQueue->mailid.'] '.$mailHelper->reportMessage;
			if(!empty($otherMessage)) $messageOnScreen .= ' => '.$otherMessage;
			$this->_display($messageOnScreen, $result, $currentMail);

			if(!$queueDeleteOk){
				$this->finish = true;
				break;
			}

			if(!empty($this->stoptime) AND $this->stoptime < time()){
				$this->_display(acymailing_translation('SEND_REFRESH_TIMEOUT'));
				if($this->nbprocess < count($queueElements)) $this->finish = false;
				break;
			}

			if($this->consecutiveError > 3 AND $this->successSend > 3){
				$this->_display(acymailing_translation('SEND_REFRESH_CONNECTION'));
				break;
			}

			if($this->consecutiveError > 5 OR connection_aborted()){
				$this->finish = true;
				break;
			}
		}

		$this->_deleteQueue($queueDelete);
		$this->statsAdd($statsAdd);
		$this->_queueUpdate($queueUpdate);

		if($mailHelper->SMTPKeepAlive) $mailHelper->smtpClose();

		if(!empty($this->total) AND $currentMail >= $this->total){
			$this->finish = true;
		}

		if($this->consecutiveError > 5){
			$this->_handleError();
			return false;
		}

		if($this->report && !$this->finish){
			echo '<script type="text/javascript" language="javascript">handlePause();</script>';
		}

		if($this->report){
			echo "</body></html>";
			while($this->obend-- > 0){
				ob_start();
			}
			exit;
		}

		return true;
	}

	private function _deleteQueue($queueDelete){
		if(empty($queueDelete)) return true;
		$status = true;

		foreach($queueDelete as $mailid => $subscribers){
			$nbsub = count($subscribers);
			$query = 'DELETE FROM '.acymailing_table('queue').' WHERE mailid = '.intval($mailid).' AND subid IN ('.implode(',', $subscribers).') LIMIT '.$nbsub;
			$res = acymailing_query($query);
			if($res === false){
				$status = false;
				$this->_display(acymailing_getDBError());
			}else{
				$nbdeleted = $res;
				if($nbdeleted != $nbsub){
					$status = false;
					$this->_display($nbdeleted < $nbsub ? acymailing_translation('QUEUE_DOUBLE') : $nbdeleted.' emails deleted from the queue whereas we only have '.$nbsub.' subscribers');
				}
			}
		}

		return $status;
	}


	public function statsAdd($statsAdd){

		if(empty($statsAdd)) return true;

		$time = time();


		$subids = array();

		foreach($statsAdd as $mailid => $infos){
			$mailid = intval($mailid);

			foreach($infos as $status => $infosSub){
				foreach($infosSub as $html => $subscribers){

					$query = 'INSERT INTO '.acymailing_table('userstats').' (mailid,subid,html,sent,fail,senddate) VALUES ';
					$query .= '('.$mailid.','.implode(','.$html.','.($status ? 1 : 0).','.($status ? 0 : 1).','.$time.'),('.$mailid.',', $subscribers).','.$html.','.($status ? 1 : 0).','.($status ? 0 : 1).','.$time.') ';
					$query .= 'ON DUPLICATE KEY UPDATE html = '.$html.',sent = sent + '.($status ? 1 : 0).', fail = '.($status ? '0' : 'fail + 1').', senddate = '.$time;
					acymailing_query($query);

					if($status){
						$subids = array_merge($subids, $subscribers);
					}
				}
			}

			$nbhtml = empty($infos[1][1]) ? 0 : count($infos[1][1]); //nbhtml sent
			$nbtext = empty($infos[1][0]) ? 0 : count($infos[1][0]); //nbtext sent
			$nbfail = 0;
			if(!empty($infos[0][0])) $nbfail += count($infos[0][0]); //fail text version
			if(!empty($infos[0][1])) $nbfail += count($infos[0][1]); //fail html version

			$query = 'INSERT INTO '.acymailing_table('stats').' (mailid,senthtml,senttext,fail,senddate) ';
			$query .= 'VALUES ('.$mailid.','.$nbhtml.', '.$nbtext.', '.$nbfail.', '.$time.') ';
			$query .= 'ON DUPLICATE KEY UPDATE senthtml = senthtml + '.$nbhtml.', senttext = senttext + '.$nbtext.', fail = fail + '.$nbfail.', senddate = '.$time;
			acymailing_query($query);
		}

		if(!empty($subids)){
			acymailing_query('UPDATE #__acymailing_subscriber SET `lastsent_date` = '.time().' WHERE `subid` IN ('.implode(',', $subids).')');
		}
	}

	private function _queueUpdate($queueUpdate){
		if(empty($queueUpdate)) return true;

		$delay = 3600;


		foreach($queueUpdate as $mailid => $subscribers){
			$query = 'UPDATE '.acymailing_table('queue').' SET senddate = senddate + '.$delay.', try = try +1 WHERE mailid = '.$mailid.' AND subid IN ('.implode(',', $subscribers).')';
			acymailing_query($query);
		}
	}

	private function _handleError(){
		$this->finish = true;
		$message = acymailing_translation('SEND_STOPED');
		$message .= '<br />';
		$message .= acymailing_translation('SEND_KEPT_ALL');
		$message .= '<br />';
		if($this->report){
			if(empty($this->successSend) AND empty($this->start)){
				$message .= acymailing_translation('SEND_CHECKONE');
				$message .= '<br />';
				$message .= acymailing_translation('SEND_ADVISE_LIMITATION');
			}else{
				$message .= acymailing_translation('SEND_REFUSE');
				$message .= '<br />';
				if(!acymailing_level(1)){
					$message .= acymailing_translation('SEND_CONTINUE_COMMERCIAL');
				}else{
					$message .= acymailing_translation('SEND_CONTINUE_AUTO');
				}
			}
		}

		$this->_display($message);
	}

	private function _display($message, $status = '', $num = ''){
		$this->messages[] = strip_tags($message);

		if(!$this->report) return;

		if(!empty($num)){
			$color = $status ? 'green' : 'red';
			echo '<br />'.$num.' : <span style="color:'.$color.';">'.$message.'</span>';
		}else{
			echo '<script type="text/javascript" language="javascript">setInfo(\''.addslashes($message).'\')</script>';
		}
		if(function_exists('ob_flush')) @ob_flush();
		if(!$this->mod_security2){
			@flush();
		}
	}

	private function _subscriberAction($subid){
		if($this->config->get('bounce_action_maxtry') == 'delete'){
			$this->subClass->delete($subid);
			return ' user '.$subid.' deleted';
		}
		$listId = 0;
		if(in_array($this->config->get('bounce_action_maxtry'), array('sub', 'remove', 'unsub'))){
			$status = $this->subClass->getSubscriptionStatus($subid);
		}
		$message = '';
		switch($this->config->get('bounce_action_maxtry')){
			case 'sub' :
				$listId = $this->config->get('bounce_action_lists_maxtry');
				if(!empty($listId)){
					$message .= ' user '.$subid.' subscribed to '.$listId;
					if(empty($status[$listId])){
						$this->listsubClass->addSubscription($subid, array('1' => array($listId)));
					}elseif($status[$listId]->status != 1){
						$this->listsubClass->updateSubscription($subid, array('1' => array($listId)));
					}
				}
			case 'remove' :
				$unsubLists = array_diff(array_keys($status), array($listId));
				if(!empty($unsubLists)){
					$message .= ' user '.$subid.' removed from lists '.implode(',', $unsubLists);
					$this->listsubClass->removeSubscription($subid, $unsubLists);
				}else{
					$message .= ' user '.$subid.' not subscribed';
				}
				break;
			case 'unsub' :
				$unsubLists = array_diff(array_keys($status), array($listId));
				if(!empty($unsubLists)){
					$message .= ' user '.$subid.' unsubscribed from lists '.implode(',', $unsubLists);
					$this->listsubClass->updateSubscription($subid, array('-1' => $unsubLists));
				}else{
					$message .= ' user '.$subid.' not subscribed';
				}
				break;
			case 'delete' :
				$message .= ' user '.$subid.' deleted';
				$this->subClass->delete($subid);
				break;
			case 'block' :
				$message .= ' user '.$subid.' blocked';
				acymailing_query('UPDATE `#__acymailing_subscriber` SET `enabled` = 0 WHERE `subid` = '.intval($subid));
				acymailing_query('DELETE FROM `#__acymailing_queue` WHERE `subid` = '.intval($subid));
				break;
		}
		return $message;
	}
}
components/com_acymailing/helpers/acyuser.php000060400000015724152453623450015550 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class acyuserHelper{

	function __construct($config = array()){
		global $acymailingCmsUserVars;
		$this->cmsUserVars = $acymailingCmsUserVars;
	}

	function getIP(){
		$ip = '';
		if(!empty($_SERVER['HTTP_X_FORWARDED_FOR']) && strlen($_SERVER['HTTP_X_FORWARDED_FOR']) > 6){
			$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
		}elseif(!empty($_SERVER['HTTP_CLIENT_IP']) && strlen($_SERVER['HTTP_CLIENT_IP']) > 6){
			$ip = $_SERVER['HTTP_CLIENT_IP'];
		}elseif(!empty($_SERVER['REMOTE_ADDR']) && strlen($_SERVER['REMOTE_ADDR']) > 6){
			$ip = $_SERVER['REMOTE_ADDR'];
		}//endif

		return strip_tags($ip);
	}

	function validEmail($email, $extended = false){
		if(empty($email) || !is_string($email)) return false;

		if(!preg_match('/^'.acymailing_getEmailRegex().'$/i', $email)) return false;

		if(!$extended) return true;


		$config = acymailing_config();
		if($config->get('email_checkpopmailclient', false)){
			if(preg_match('#^.{1,5}@(gmail|yahoo|aol|hotmail|msn|ymail)#i', $email)){
				return false;
			}
		}

		if($config->get('email_checkdomain', false) && function_exists('getmxrr')){
			$domain = substr($email, strrpos($email, '@') + 1);
			$mxhosts = array();
			$checkDomain = getmxrr($domain, $mxhosts);
			if(!empty($mxhosts) && strpos($mxhosts[0], 'hostnamedoesnotexist')){
				array_shift($mxhosts);
			}
			if(!$checkDomain || empty($mxhosts)){
				$dns = @dns_get_record($domain, DNS_A);
				$domainChanged = true;
				foreach($dns as $oneRes){
					if(strtolower($oneRes['host']) == strtolower($domain)){
						$domainChanged = false;
					}
				}
				if(empty($dns) || $domainChanged){
					return false;
				}
			}
		}
		$object = new stdClass();
		$object->IP = $this->getIP();
		$object->emailAddress = $email;

		if($config->get('email_botscout', false)){
			$botscoutClass = new acybotscout();
			$botscoutClass->apiKey = $config->get('email_botscout_key');
			if(!$botscoutClass->getInfo($object)){
				return false;
			}
		}

		if($config->get('email_stopforumspam', false)){
			$email_stopforumspam = new acystopforumspam();
			if(!$email_stopforumspam->getInfo($object)){
				return false;
			}
		}

		if($config->get('email_iptimecheck', 0)){
			$lapseTime = time() - 7200;
			$nbUsers = acymailing_loadResult('SELECT COUNT(*) FROM #__acymailing_subscriber WHERE created > '.intval($lapseTime).' AND ip = '.acymailing_escapeDB($object->IP));
			if($nbUsers >= 3){
				return false;
			}
		}

		return true;
	}

	function getUserGroups($userid){
		if(ACYMAILING_J16){
			$groups = acymailing_loadObjectList('SELECT ug.id, ug.title FROM #__usergroups AS ug JOIN #__user_usergroup_map AS ugm ON ug.id = ugm.group_id WHERE ugm.user_id = '.intval($userid));
		}else{
			$groups = acymailing_loadObjectList('SELECT gid AS id, userType AS title FROM '.acymailing_table($this->cmsUserVars->table, false).' WHERE '.$this->cmsUserVars->id.' = '.intval($userid));
		}
		return $groups;
	}
}

class acybotscout{

	var $apiKey = '';
	var $conn;
	var $error = '';


	function connect(){
		if(is_resource($this->conn)){
			return true;
		}

		$this->conn = fsockopen('www.botscout.com', 80, $errno, $errstr, 20);
		if(!$this->conn){
			$this->error = "Could not open connection ".$errstr;
			return false;
		}
		return true;
	}

	function getInfo(&$object){
		if(!$this->connect()){
			return true;
		}
		$result = true;

		if(!empty($object->IP) && $object->IP != '127.0.0.1'){
			$data = 'ip='.$object->IP;
			$resIP = $this->sendInfo($data);
			$result = $this->checkXML($resIP, $object) && $result;
		}
		if(!empty($object->emailAddress)){
			$data = 'mail='.$object->emailAddress;
			$resAddress = $this->sendInfo($data);
			$result = $this->checkXML($resAddress, $object) && $result;
		}

		if(is_resource($this->conn)){
			fclose($this->conn);
		}

		return $result;
	}

	function sendInfo($data){
		$res = '';
		if(!empty($this->apiKey)){
			$data .= '&key='.$this->apiKey;
		}
		$data .= '&format=xml';
		$header = "GET /test/?".$data." HTTP/1.1\r\n";
		$header .= "Host: www.botscout.com \r\n";
		$header .= "Connection: keep-alive\r\n\r\n";
		fwrite($this->conn, $header);
		while(!feof($this->conn)){
			$res .= fread($this->conn, 1024);
			if(strpos($res, "</response>")){
				break;
			}
		}
		return $res;
	}

	function checkXML($res, $object){

		if(!preg_match('#<response.*</response>#Uis', $res, $results)){
			$this->error = 'There is an error while trying to get the xml could not find "<reponse>"';
			return true;
		}

		$xml = new SimpleXMLElement($results[0]);
		if($xml->matched == "Y" && $xml->test == 'IP'){
			$this->error .= 'There is a problem with the IP : '.$object->IP.' you used to do the registration ( Spam test positive )</br>'; // Check failed. Result indicates dangerous.
			return false;
		}
		if($xml->matched == "Y" && $xml->test == 'MAIL'){
			$this->error .= 'There is a problem with the email : '.$object->emailAddress.' you entered in the form ( Spam test positive )</br>';
			return false;
		}
		return true;
	}
}


class acystopforumspam{

	var $conn;
	var $error = '';

	function connect(){
		$this->conn = fsockopen('www.stopforumspam.com', 80, $errno, $errstr, 20);
		if(!$this->conn){
			$this->error = "Could not open connection ".$errstr;
			return false;
		}
		return true;
	}

	function getInfo(&$object){
		if(!$this->connect()){
			return true;
		}

		$IP = '';
		$emailAddress = '';

		if(empty($object->IP) && empty($object->emailAddress)){
			return true;
		}
		if(!empty($object->IP)){
			$IP = 'ip='.$object->IP.'&';
		}
		if(!empty($object->emailAddress)){
			$emailAddress = 'email='.$object->emailAddress.'&';
		}

		$data = $IP.$emailAddress;
		$data = trim($data, '&');
		$res = '';

		$header = "GET /api?".$data." HTTP/1.1\r\n";
		$header .= "Host: www.stopforumspam.com \r\n";
		$header .= "Connection: Close\r\n\r\n";
		fwrite($this->conn, $header);
		while(!feof($this->conn)){
			$res .= fread($this->conn, 1024);
		}

		if(!preg_match('#<response.*</response>#Uis', $res, $results)){
			$this->error = 'There is an error while trying to get the xml could not find "<reponse>"';
			return true;
		}

		$xml = new SimpleXMLElement($results[0]);

		$number = 0;
		foreach($xml->appears as $oneTest){
			if($oneTest == "yes"){
				if(strtolower($xml->type[$number]) == 'ip'){
					$problemSource = $object->IP;
				}
				if(strtolower($xml->type[$number]) == 'email'){
					$problemSource = $object->emailAddress;
				}
				$this->error .= 'There is a problem with the '.$xml->type[$number].' : '.$problemSource.' you used ( Spam test positive ) </br>'; // Check failed. Result indicates dangerous.
				return false;
			}elseif($oneTest == "no"){
			}else{
				$this->error = 'There is a problem with the result. Service down ? '; // Test returned neither positive or negative result. Service might be down?
				continue;
			}
			$number++;
		}
		return true;
	}
}

components/com_acymailing/helpers/editor.php000060400000000450152453623450015351 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
acymailing_loadEditor();
components/com_acymailing/helpers/index.html000060400000000054152453623450015347 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/helpers/zoho.php000060400000015301152453623450015043 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class acyzohoHelper {
		var $conn;
		var $authtoken = '';
	var $error = '';
	var $customView = '';
	var $fromIndex = '1';
	var $toIndex = '200';
	var $nbUserRead = 'notParsed';

	function connect() {
		if (is_resource($this->conn))
				return true;
		$this->conn = fsockopen('ssl://crm.zoho.com', 443, $errno, $errstr, 20);
		if (!$this->conn) {
			$this->error = 'Could not open connection ( error '.$errno.' : '.$errstr.' )';
			return false;
		}
		return true;
	}

	function sendInfo($userList){
		if (!$this->connect())	return false;
		$res = '';
		$config = acymailing_config();
		if(empty($this->customView)){
			$apiMethod = "getRecords";
			$cvName = "";
		} else{
			$apiMethod = "getCVRecords";
			$cvName = "&cvName=" . urlencode($this->customView);
		}
		$importNew = $config->get("zoho_importnew", 0);
		$importdate = $config->get('zoho_importdate',0);
		$lastModifiedTime = (!empty($importNew) && !empty($importdate))?"&lastModifiedTime=".urlencode($importdate):"";

		$indexSelect = "";
		if(!empty($this->fromIndex)) $indexSelect = "&fromIndex=".$this->fromIndex;
		if(!empty($this->toIndex)) $indexSelect .= "&toIndex=".$this->toIndex;

		$header = "GET /crm/private/xml/". urlencode($userList) ."/". $apiMethod ."?newFormat=1&authtoken=". urlencode($this->authtoken) . $cvName ."&scope=crmapi".$lastModifiedTime.$indexSelect ." HTTP/1.0\r\n";
		$header .= "Host: crm.zoho.com\r\n";
		$header .= "Content-Type: text/xml\r\n";
		$header .= "Connection: close\r\n\r\n";
		fwrite($this->conn, $header);
		while (!feof($this->conn)) {
			$res .= fread($this->conn, 1024);
		}
		if (!empty($res) && preg_match('#error#', $res) == 1) {
			preg_match('#<message>(.*)</message>#Ui', $res, $explodedResults);
			$this->error = $explodedResults[1];
			return false;
		}

		return $res;
	}

	function parseXML($res,$userList,$selectedFields,$confirmedUsers, $generateName) {
		$xml = substr($res,strpos($res,'<?xml'));
		try{
			$xml = new SimpleXMLElement($xml);
		} catch(Exception $err){
			$this->error = $err;
			return false;
		}
		$emailArray= array();

		$config = acymailing_config();
		$importNew = $config->get("zoho_importnew", 0);
		if(!empty($importNew) && !empty($xml->nodata->code) && $xml->nodata->code == 4422){
			$this->error .= 'There is no new or modified email Address in the '.$userList.' list';
			return $emailArray;
		}

		if(empty($xml->result->$userList->row)){
			$this->error .= 'There is no email Address in the '.$userList.' list';
			return $emailArray;
		}

		$nbUserRead = 0;
		foreach($xml->result->$userList->row as $key=>$row){
			$informations = new stdClass();
			$informations->zoholist = strtolower($userList[0]);
			$informations->confirmed = $confirmedUsers;
			foreach($selectedFields as $oneField){
				if(empty($oneField)) continue;
				 $informations->$oneField = '';
			}
			$title = '';
			$fname = '';
			$lname = '';
			foreach($row->FL as $key => $value){
				if(!in_array('name',$selectedFields) && $generateName == 'fromconcat'){
					if($value['val'] == 'Salutation') $title = (string)$value;
					if($value['val'] == 'First Name') $fname = (string)$value;
					if($value['val'] == 'Last Name') $lname = (string)$value;
				}
				if($value['val'] == 'Vendor Name' && empty($informations->name)) $informations->name = (string)$value;
				if($value['val'] == 'CONTACTID' || $value['val'] == 'LEADID' ||$value['val'] == 'VENDORID' )	$informations->zohoid =(string)$value;
				elseif($value['val'] == 'Email Opt Out'){
					if ($value == 'false')	$informations->accept=1;
					else $informations->accept=0;
				}
				elseif(!empty($selectedFields[(string)$value['val']]))
					$informations->{$selectedFields[(string)$value['val']]} = (string)$value;
				elseif($value['val'] == 'Email')
					$informations->email = (string)$value;
			}

			if(!in_array('name',$selectedFields) && $generateName == 'fromconcat'){
				$informations->name = (!empty($title)?$title:'');
				$informations->name .= (!empty($informations->name) && !empty($fname)?' ':'').$fname;
				$informations->name .= (!empty($informations->name) && !empty($lname)?' ':'').$lname;
			}
			if(!empty($informations->email)){
				$emailArray[]=$informations;
			}
			$nbUserRead++;
		}
		$this->nbUserRead = $nbUserRead;
		if(empty($emailArray) && $nbUserRead == 0) $this->error .= 'There is no email Address in the '.$userList.' list';
		return $emailArray;
	}

	function getFieldsRaw($userList){
		if (!$this->connect())	return false;
		$res = '';
		if(empty($userList)) $userList = 'Contacts';

		$header = "GET /crm/private/xml/". urlencode($userList) ."/getFields?authtoken=". urlencode($this->authtoken) ."&scope=crmapi HTTP/1.0\r\n";
		$header .= "Host: crm.zoho.com\r\n";
		$header .= "Content-Type: text/xml\r\n";
		$header .= "Connection: close\r\n\r\n";
		fwrite($this->conn, $header);

		while (!feof($this->conn)) {
			$res .= fread($this->conn, 1024);
		}
		if (!empty($res) && preg_match('#error#', $res) == 1) {
			preg_match('#<message>(.*)</message>#Ui', $res, $explodedResults);
			$this->error = $explodedResults[1];
			return false;
		}

		return $res;
	}

	function parseXMLFields($xmlToParse){
		$xmlToParse = substr($xmlToParse,strpos($xmlToParse,'<?xml'));
		try{
			$xml = new SimpleXMLElement($xmlToParse);
		} catch(Exception $err){
			$this->error = $err;
			return false;
		}

		if(empty($xml->section)){
			$this->error = acymailing_translation('ACY_NOFIELD');
			return false;
		}

		$zohoFields = array();
		foreach($xml->section as $key=>$oneSection){
			foreach($oneSection as $key=>$oneField){
				if(empty($oneField['label']) || $oneField['label'] == 'Email') continue;
				$zohoFields[] = $oneField['label'];
			}
		}
		return $zohoFields;
	}

	function subscribe($acyList, $zohoList){
		if(empty($acyList) || empty($zohoList)) return 0;

		$query = 'INSERT IGNORE INTO #__acymailing_listsub (subid, listid, status, subdate) SELECT subid,'.$acyList.',1,'.time().' FROM #__acymailing_subscriber WHERE zoholist = "'.strtolower($zohoList[0]).'"';
		return acymailing_query($query) !== false;
	}

	function deleteAddress(&$allSubid, $userList) {
		$subscriberClass= acymailing_get('class.subscriber');
		$IdArray = array();
		foreach($allSubid as $oneID){
			$IdArray[] = acymailing_escapeDB($oneID);
		}
		$query = 'SELECT subid FROM  #__acymailing_subscriber WHERE zoholist LIKE "'.$userList[0].'" AND zohoid IS NOT NULL AND subid NOT IN ('.implode(',',$IdArray).')';
		$subidToDelete = acymailing_loadResultArray($query);
		$subscriberClass->delete($subidToDelete);
	}

	function close() {
		fclose($this->conn);
	}
}
components/com_acymailing/helpers/acymailer.php000060400000067061152453623450016044 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

require_once(ACYMAILING_INC.'phpmailer'.DS.'class.phpmailer.php');

class acymailerHelper extends acymailingPHPMailer{

	var $report = true;

	var $loadedToSend = true;

	var $checkConfirmField = true;

	var $checkEnabled = true;

	var $checkAccept = true;

	var $parameters = array();

	var $dispatcher;

	var $errorNumber = 0;

	var $reportMessage = '';

	var $autoAddUser = false;

	var $errorNewTry = array(1, 6);

	var $app;

	var $alreadyCheckedAddresses = false;

	var $checkPublished = true;

	var $introtext;

	var $trackEmail = false;

	public $From = '';

	public $FromName = '';

	function __construct(){

		static $loaded = false;
		if(!$loaded){
			$loaded = true;
			acymailing_importPlugin('acymailing');
		}

		$this->SMTPAutoTLS = false;

		$this->subscriberClass = acymailing_get('class.subscriber');
		$this->encodingHelper = acymailing_get('helper.encoding');
		$this->userHelper = acymailing_get('helper.user');


		$this->config = acymailing_config();
		$this->setFrom($this->config->get('from_email'), $this->config->get('from_name'));

		$this->Sender = $this->cleanText($this->config->get('bounce_email'));
		if(empty($this->Sender)) $this->Sender = '';

		switch($this->config->get('mailer_method', 'phpmail')){
			case 'smtp' :
				$this->isSMTP();
				$this->Host = trim($this->config->get('smtp_host'));
				$port = $this->config->get('smtp_port');
				if(empty($port) && $this->config->get('smtp_secured') == 'ssl') $port = 465;
				if(!empty($port)) $this->Host .= ':'.$port;
				$this->SMTPAuth = (bool)$this->config->get('smtp_auth', true);
				$this->Username = trim($this->config->get('smtp_username'));
				$this->Password = trim($this->config->get('smtp_password'));
				$this->SMTPSecure = trim((string)$this->config->get('smtp_secured'));

				if(empty($this->Sender)) $this->Sender = strpos($this->Username, '@') ? $this->Username : $this->config->get('from_email');
				break;
			case 'sendmail' :
				$this->isSendmail();
				$this->Sendmail = trim($this->config->get('sendmail_path'));
				if(empty($this->Sendmail)) $this->Sendmail = '/usr/sbin/sendmail';
				break;
			case 'qmail' :
				$this->isQmail();
				break;
			case 'elasticemail' :
				$port = $this->config->get('elasticemail_port', 'rest');
				if(is_numeric($port)){
					$this->isSMTP();
					if($port == '25'){
						$this->Host = 'smtp25.elasticemail.com:25';
					}else{
						$this->Host = 'smtp.elasticemail.com:2525';
					}
					$this->Username = trim($this->config->get('elasticemail_username'));
					$this->Password = trim($this->config->get('elasticemail_password'));
					$this->SMTPAuth = true;
				}else{
					include_once(ACYMAILING_INC.'phpmailer'.DS.'class.elasticemail.php');
					$this->Mailer = 'elasticemail';
					$this->{$this->Mailer} = new acymailingElasticemail();
					$this->{$this->Mailer}->Username = trim($this->config->get('elasticemail_username'));
					$this->{$this->Mailer}->Password = trim($this->config->get('elasticemail_password'));
				}

				break;
			default :
				$this->isMail();
				break;
		}//endswitch


		$this->PluginDir = dirname(__FILE__).DS;
		$this->CharSet = strtolower($this->config->get('charset'));
		if(empty($this->CharSet)) $this->CharSet = 'utf-8';

		$this->clearAll();

		$this->Encoding = $this->config->get('encoding_format');
		if(empty($this->Encoding)) $this->Encoding = '8bit';

		$this->WordWrap = intval($this->config->get('word_wrapping', 0));

		@ini_set('pcre.backtrack_limit', 1000000);

		$this->SMTPOptions = array("ssl" => array("verify_peer" => false, "verify_peer_name" => false, "allow_self_signed" => true));
	}//endfct

	public function send(){
		if(empty($this->ReplyTo) && empty($this->ReplyToQueue)){
			$this->_addReplyTo(empty($this->replyemail) ? $this->config->get('reply_email') : $this->replyemail, empty($this->replyname) ? $this->config->get('reply_name') : $this->replyname);
		}

		if((bool)$this->config->get('embed_images', 0) && $this->Mailer != 'elasticemail'){
			$this->embedImages();
		}

		if(empty($this->Subject) OR empty($this->Body)){
			$this->reportMessage = acymailing_translation('SEND_EMPTY');
			$this->errorNumber = 8;
			if($this->report){
				acymailing_enqueueMessage($this->reportMessage, 'error');
			}
			return false;
		}

		if(!$this->alreadyCheckedAddresses){
			$this->alreadyCheckedAddresses = true;

			$replyToTmp = '';
			if(!empty($this->ReplyTo)){
				$replyToTmp = reset($this->ReplyTo);
				$replyToTmp = $replyToTmp[0];
			}elseif(!empty($this->ReplyToQueue)){
				$replyToTmp = reset($this->ReplyToQueue);
				$replyToTmp = $replyToTmp[1];
			}

			if(empty($replyToTmp) || !$this->userHelper->validEmail($replyToTmp)){
				$this->reportMessage = acymailing_translation('VALID_EMAIL').' ( '.acymailing_translation('REPLYTO_ADDRESS').' : '.(empty($this->ReplyTo) ? '' : $replyToTmp).' ) ';
				$this->errorNumber = 9;
				if($this->report){
					acymailing_enqueueMessage($this->reportMessage, 'error');
				}
				return false;
			}

			if(empty($this->From) || !$this->userHelper->validEmail($this->From)){
				$this->reportMessage = acymailing_translation('VALID_EMAIL').' ( '.acymailing_translation('FROM_ADDRESS').' : '.$this->From.' ) ';
				$this->errorNumber = 9;
				if($this->report){
					acymailing_enqueueMessage($this->reportMessage, 'error');
				}
				return false;
			}

			if(!empty($this->Sender) && !$this->userHelper->validEmail($this->Sender)){
				$this->reportMessage = acymailing_translation('VALID_EMAIL').' ( '.acymailing_translation('BOUNCE_ADDRESS').' : '.$this->Sender.' ) ';
				$this->errorNumber = 9;
				if($this->report){
					acymailing_enqueueMessage($this->reportMessage, 'error');
				}
				return false;
			}
		}

		if(!empty($this->favicon)){
			$faviconHeader = '<link rel="shortcut icon" href="'.$this->favicon.'" type="image/x-icon" />';
			$this->Body = str_replace('</head>', $faviconHeader.'</head>', $this->Body);
		}

		if(function_exists('mb_convert_encoding') && !empty($this->sendHTML)){
			$this->Body = mb_convert_encoding($this->Body, 'HTML-ENTITIES', 'UTF-8');
			$this->Body = str_replace(array('&amp;', '&sigmaf;'), array('&', 'ς'), $this->Body);
		}

		if($this->CharSet != 'utf-8'){
			$this->Body = $this->encodingHelper->change($this->Body, 'UTF-8', $this->CharSet);
			$this->Subject = $this->encodingHelper->change($this->Subject, 'UTF-8', $this->CharSet);
			if(!empty($this->AltBody)) $this->AltBody = $this->encodingHelper->change($this->AltBody, 'UTF-8', $this->CharSet);
		}

		if(strpos($this->Host, 'elasticemail')){
			$this->addCustomHeader('referral:2f0447bb-173a-459d-ab1a-ab8cbebb9aab');
		}

		$this->Subject = str_replace(array('’', '“', '”', '–'), array("'", '"', '"', '-'), $this->Subject);

		$this->Body = str_replace(" ", ' ', $this->Body);

		ob_start();
		$result = parent::send();
		$warnings = ob_get_clean();

		if(!empty($warnings) && strpos($warnings, 'bloque')){
			$result = false;
		}
		
		$receivers = array();
		foreach($this->to as $oneReceiver){
			$receivers[] = $oneReceiver[0];
		}
		if(!$result){
			$this->reportMessage = acymailing_translation_sprintf('SEND_ERROR', '<b><i>'.$this->Subject.'</i></b>', '<b><i>'.implode(' , ', $receivers).'</i></b>');
			if(!empty($this->ErrorInfo)) $this->reportMessage .= ' | '.$this->ErrorInfo;
			if(!empty($warnings)) $this->reportMessage .= ' | '.$warnings;
			$this->errorNumber = 1;
			if($this->report){
				$this->reportMessage = str_replace('Could not instantiate mail function', '<a target="_blank" href="'.ACYMAILING_REDIRECT.'could-not-instantiate-mail-function" title="'.acymailing_translation('TELL_ME_MORE').'">Could not instantiate mail function</a>', $this->reportMessage);
				acymailing_enqueueMessage(nl2br($this->reportMessage), 'error');
			}
		}else{
			$this->reportMessage = acymailing_translation_sprintf('SEND_SUCCESS', '<b><i>'.$this->Subject.'</i></b>', '<b><i>'.implode(' , ', $receivers).'</i></b>');
			if(!empty($warnings)) $this->reportMessage .= ' | '.$warnings;
			if($this->report){
				acymailing_enqueueMessage(nl2br($this->reportMessage), 'message');
			}
		}

		return $result;
	}

	public function load($mailid){
		$mailClass = acymailing_get('class.mail');
		$this->defaultMail[$mailid] = $mailClass->get($mailid);

		if(empty($this->defaultMail[$mailid]->mailid)) return false;

		if(empty($this->defaultMail[$mailid]->altbody)) $this->defaultMail[$mailid]->altbody = $this->textVersion($this->defaultMail[$mailid]->body);

		if(!empty($this->defaultMail[$mailid]->attach)){
			$this->defaultMail[$mailid]->attachments = array();

			foreach($this->defaultMail[$mailid]->attach as $oneAttach){
				$attach = new stdClass();
				$attach->name = basename($oneAttach->filename);
				$attach->filename = str_replace(array('/', '\\'), DS, ACYMAILING_ROOT).$oneAttach->filename;
				$attach->url = ACYMAILING_LIVE.$oneAttach->filename;
				$this->defaultMail[$mailid]->attachments[] = $attach;
			}
		}

		if(!empty($this->defaultMail[$mailid]->favicon) && !empty($this->defaultMail[$mailid]->favicon->filename)){
			$this->defaultMail[$mailid]->favicon = ACYMAILING_LIVE.str_replace(DS, '/', $this->defaultMail[$mailid]->favicon->filename);
		}else{
			$this->defaultMail[$mailid]->favicon = '';
		}

		if(!empty($this->defaultMail[$mailid]->tempid)){
			$templateClass = acymailing_get('class.template');
			$this->defaultMail[$mailid]->template = $templateClass->get($this->defaultMail[$mailid]->tempid);
		}

		$this->triggerTagsWithRightLanguage($this->defaultMail[$mailid], $this->loadedToSend);

		$this->defaultMail[$mailid]->body = acymailing_absoluteURL($this->defaultMail[$mailid]->body);

		return $this->defaultMail[$mailid];
	}

	public function clearAll(){
		$this->Subject = '';
		$this->Body = '';
		$this->AltBody = '';
		$this->ClearAllRecipients();
		$this->ClearAttachments();
		$this->ClearCustomHeaders();
		$this->ClearReplyTos();
		$this->errorNumber = 0;
		$this->MessageID = '';
		$this->ErrorInfo = '';

		$this->setFrom($this->config->get('from_email'), $this->config->get('from_name'));


	}

	public function sendOne($mailid, $receiverid){
		$this->clearAll();

		if(!isset($this->defaultMail[$mailid])){
			$this->loadedToSend = true;
			if(!$this->load($mailid)){
				$this->reportMessage = 'Can not load the e-mail : '.htmlspecialchars($mailid, ENT_COMPAT, 'UTF-8');
				if($this->report){
					acymailing_enqueueMessage($this->reportMessage, 'error');
				}
				$this->errorNumber = 2;
				return false;
			}
		}


		if(!isset($this->forceVersion) AND $this->checkPublished AND empty($this->defaultMail[$mailid]->published)){
			$this->reportMessage = acymailing_translation_sprintf('SEND_ERROR_PUBLISHED', htmlspecialchars($mailid, ENT_COMPAT, 'UTF-8'));
			$this->errorNumber = 3;
			if($this->report){
				acymailing_enqueueMessage($this->reportMessage, 'error');
			}
			return false;
		}

		if(!is_object($receiverid)){
			$receiver = $this->subscriberClass->get($receiverid);
			if(empty($receiver->subid) AND is_string($receiverid) AND $this->autoAddUser){
				if($this->userHelper->validEmail($receiverid)){
					$newUser = new stdClass();
					$newUser->email = $receiverid;
					$this->subscriberClass->checkVisitor = false;
					$this->subscriberClass->sendConf = false;
					$subid = $this->subscriberClass->save($newUser);
					$receiver = $this->subscriberClass->get($subid);
				}
			}
		}else{
			$receiver = $receiverid;
		}

		if(empty($receiver->email)){
			$this->reportMessage = acymailing_translation_sprintf('SEND_ERROR_USER', '<b><i>'.(isset($receiver->subid) ? $receiver->subid : htmlspecialchars($receiverid, ENT_COMPAT, 'UTF-8')).'</i></b>');
			if($this->report){
				acymailing_enqueueMessage($this->reportMessage, 'error');
			}
			$this->errorNumber = 4;
			return false;
		}


		$this->MessageID = "<".preg_replace("|[^a-z0-9+_]|i", '', base64_encode(rand(0, 9999999))."AC".$receiver->subid."Y".$this->defaultMail[$mailid]->mailid."BA".base64_encode(time().rand(0, 99999)))."@".$this->serverHostname().">";

		if(strpos($this->Host, 'mailjet') !== false && !empty($this->defaultMail[$mailid]->alias)){
			$this->addCustomHeader('X-Mailjet-Campaign: '.$this->defaultMail[$mailid]->alias);
		}

		if(!isset($this->forceVersion)){
			if($this->checkConfirmField AND empty($receiver->confirmed) AND $this->config->get('require_confirmation', 0) AND strpos($this->defaultMail[$mailid]->alias, 'confirm') === false){
				$this->reportMessage = acymailing_translation_sprintf('SEND_ERROR_CONFIRMED', '<b><i>'.htmlspecialchars($receiver->email, ENT_COMPAT, 'UTF-8').'</i></b>');
				if($this->report){
					acymailing_enqueueMessage($this->reportMessage, 'error');
				}
				$this->errorNumber = 5;
				return false;
			}

			if($this->checkEnabled AND empty($receiver->enabled) AND strpos($this->defaultMail[$mailid]->alias, 'enable') === false){
				$this->reportMessage = acymailing_translation_sprintf('SEND_ERROR_APPROVED', '<b><i>'.htmlspecialchars($receiver->email, ENT_COMPAT, 'UTF-8').'</i></b>');
				if($this->report){
					acymailing_enqueueMessage($this->reportMessage, 'error');
				}
				$this->errorNumber = 6;
				return false;
			}
		}


		if($this->checkAccept AND empty($receiver->accept)){
			$this->reportMessage = acymailing_translation_sprintf('SEND_ERROR_ACCEPT', '<b><i>'.htmlspecialchars($receiver->email, ENT_COMPAT, 'UTF-8').'</i></b>');
			if($this->report){
				acymailing_enqueueMessage($this->reportMessage, 'error');
			}
			$this->errorNumber = 7;
			return false;
		}

		$addedName = '';
		if($this->config->get('add_names', true)){
			$nameTmp = acymailing_translation('ACY_TO_NAME');
			$testTag = preg_match_all('/\[(.*)\]/U', $nameTmp, $matches);
			if($testTag != 0){
				foreach($matches[0] as $i => $oneMatch){
					$replaceValue = '';
					if(!empty($receiver->{$matches[1][$i]})) $replaceValue = $receiver->{$matches[1][$i]};
					$nameTmp = str_replace($oneMatch, $replaceValue, $nameTmp);
				}
			}
			$addedName = $this->cleanText($nameTmp);
			if($addedName == $this->cleanText($receiver->email)) $addedName = '';
		}
		$this->addAddress($this->cleanText($receiver->email), $addedName);

		if(!isset($this->forceVersion)){
			$this->isHTML($receiver->html && $this->defaultMail[$mailid]->html);
		}else{
			$this->isHTML((bool)$this->forceVersion);
		}

		$this->Subject = $this->defaultMail[$mailid]->subject;

		if($this->sendHTML){
			$this->Body = $this->defaultMail[$mailid]->body;
			if($this->config->get('multiple_part', false)){
				$this->AltBody = $this->defaultMail[$mailid]->altbody;
			}
		}else{
			$this->Body = $this->defaultMail[$mailid]->altbody;
		}

		$this->setFrom($this->defaultMail[$mailid]->fromemail, $this->defaultMail[$mailid]->fromname);
		$this->_addReplyTo($this->defaultMail[$mailid]->replyemail, $this->defaultMail[$mailid]->replyname);

		$this->defaultMail[$mailid]->bccaddresses = isset($this->defaultMail[$mailid]->bccaddresses) ? $this->defaultMail[$mailid]->bccaddresses : '';
		$bcc = trim(str_replace(array(',', ' '), ';', $this->defaultMail[$mailid]->bccaddresses));
		if(!empty($bcc)){
			$allBcc = explode(';', $bcc);
			foreach($allBcc as $oneBcc){
				if(empty($oneBcc)) continue;
				$this->AddBCC($oneBcc);
			}
		}

		if(!empty($this->defaultMail[$mailid]->attachments)){
			if($this->config->get('embed_files')){
				foreach($this->defaultMail[$mailid]->attachments as $attachment){
					$this->addAttachment($attachment->filename);
				}
			}else{
				$attachStringHTML = '<br /><fieldset><legend>'.acymailing_translation('ATTACHMENTS').'</legend><table>';
				$attachStringText = "\n"."\n".'------- '.acymailing_translation('ATTACHMENTS').' -------';
				foreach($this->defaultMail[$mailid]->attachments as $attachment){
					$attachStringHTML .= '<tr><td><a href="'.$attachment->url.'" target="_blank">'.$attachment->name.'</a></td></tr>';
					$attachStringText .= "\n".'-- '.$attachment->name.' ( '.$attachment->url.' )';
				}
				$attachStringHTML .= '</table></fieldset>';

				if($this->sendHTML){
					$this->Body .= $attachStringHTML;
					if(!empty($this->AltBody)) $this->AltBody .= "\n".$attachStringText;
				}else{
					$this->Body .= $attachStringText;
				}
			}
		}

		if(!empty($this->parameters)){
			$this->generateAllParams();
			$keysparams = array_keys($this->parameters);
			$this->Subject = str_replace($keysparams, $this->parameters, $this->Subject);
			$this->Body = str_replace($keysparams, $this->parameters, $this->Body);
			if(!empty($this->AltBody)) $this->AltBody = str_replace($keysparams, $this->parameters, $this->AltBody);

			if(!empty($this->From)) str_replace($keysparams, $this->parameters, $this->From);
			if(!empty($this->FromName)) str_replace($keysparams, $this->parameters, $this->FromName);
			if(!empty($this->ReplyTo)){
				foreach($this->ReplyTo as $i => $replyto){
					foreach($replyto as $a => $oneval){
						$this->ReplyTo[$i][$a] = str_replace($keysparams, $this->parameters, $this->ReplyTo[$i][$a]);
					}
				}
			}
		}
		if(!empty($this->introtext)){
			$this->Body = $this->introtext.$this->Body;
			$this->AltBody = $this->textVersion($this->introtext).$this->AltBody;
		}


		$this->body = &$this->Body;
		$this->altbody = &$this->AltBody;
		$this->subject = &$this->Subject;
		$this->from = &$this->From;
		$this->fromName = &$this->FromName;
		$this->replyto = &$this->ReplyTo;
		$this->replyname = $this->defaultMail[$mailid]->replyname;
		$this->replyemail = $this->defaultMail[$mailid]->replyemail;
		$this->mailid = $this->defaultMail[$mailid]->mailid;
		$this->key = $this->defaultMail[$mailid]->key;
		$this->alias = $this->defaultMail[$mailid]->alias;
		$this->type = $this->defaultMail[$mailid]->type;
		$this->tempid = $this->defaultMail[$mailid]->tempid;
		$this->sentby = $this->defaultMail[$mailid]->sentby;
		$this->userid = $this->defaultMail[$mailid]->userid;
		$this->filter = $this->defaultMail[$mailid]->filter;
		$this->template = @$this->defaultMail[$mailid]->template;
		$this->language = @$this->defaultMail[$mailid]->language;
		$this->favicon = @$this->defaultMail[$mailid]->favicon;

		if(empty($receiver->key) && !empty($receiver->subid)){
			$receiver->key = acymailing_generateKey(14);
			acymailing_query('UPDATE '.acymailing_table('subscriber').' SET `key`= '.acymailing_escapeDB($receiver->key).' WHERE subid = '.(int)$receiver->subid.' LIMIT 1');
		}

		if(strpos($receiver->email, '@mail-tester.com') !== false){
			$currentUser = $this->subscriberClass->get(acymailing_currentUserEmail());
			if(empty($currentUser)) $currentUser = $receiver;
			acymailing_trigger('acymailing_replaceusertags', array(&$this, &$currentUser, true));
		}else{
			acymailing_trigger('acymailing_replaceusertags', array(&$this, &$receiver, true));
		}

		if($this->sendHTML){
			if(!empty($this->AltBody)) $this->AltBody = $this->textVersion($this->AltBody, false);
		}else{
			$this->Body = $this->textVersion($this->Body, false);
		}

		$status = $this->send();
		if($this->trackEmail){
			$helperQueue = acymailing_get('helper.queue');
			$statsAdd = array();
			$statsAdd[$this->mailid][$status][$this->sendHTML][] = $receiver->subid;
			$helperQueue->statsAdd($statsAdd);
			$this->trackEmail = false;
		}
		return $status;
	}

	protected function embedImages(){
		preg_match_all('/(src|background)=[\'|"]([^"\']*)[\'|"]/Ui', $this->Body, $images);
		$result = true;

		if(empty($images[2])) return $result;

		$mimetypes = array('bmp' => 'image/bmp', 'gif' => 'image/gif', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'jpe' => 'image/jpeg', 'png' => 'image/png', 'tiff' => 'image/tiff', 'tif' => 'image/tiff');

		$allimages = array();

		foreach($images[2] as $i => $url){
			if(isset($allimages[$url])) continue;
			$allimages[$url] = 1;

			$path = $url;
			$base = str_replace(array('http://www.', 'https://www.', 'http://', 'https://'), '', ACYMAILING_LIVE);
			$replacements = array('https://www.'.$base, 'http://www.'.$base, 'https://'.$base, 'http://'.$base);
			foreach($replacements as $oneReplacement){
				if(strpos($url, $oneReplacement) === false) continue;
				$path = str_replace(array($oneReplacement, '/'), array(ACYMAILING_ROOT, DS), urldecode($url));
				break;
			}

			$filename = str_replace(array('%', ' '), '_', basename($url));
			$md5 = md5($filename);
			$cid = 'cid:'.$md5;
			$fileParts = explode(".", $filename);
			if(empty($fileParts[1])) continue;
			$ext = strtolower($fileParts[1]);
			if(!isset($mimetypes[$ext])) continue;
			$mimeType = $mimetypes[$ext];
			if($this->addEmbeddedImage($path, $md5, $filename, 'base64', $mimeType)){
				$this->Body = preg_replace("/".preg_quote($images[0][$i], '/')."/Ui", $images[1][$i]."=\"".$cid."\"", $this->Body);
			}else{
				$result = false;
			}
		}
		return $result;
	}

	public function textVersion($html, $fullConvert = true){

		$html = acymailing_absoluteURL($html);

		if($fullConvert){
			$html = preg_replace('# +#', ' ', $html);
			$html = str_replace(array("\n", "\r", "\t"), '', $html);
		}


		$removepictureslinks = "#< *a[^>]*> *< *img[^>]*> *< *\/ *a *>#isU";
		$removeScript = "#< *script(?:(?!< */ *script *>).)*< */ *script *>#isU";
		$removeStyle = "#< *style(?:(?!< */ *style *>).)*< */ *style *>#isU";
		$removeStrikeTags = '#< *strike(?:(?!< */ *strike *>).)*< */ *strike *>#iU';
		$replaceByTwoReturnChar = '#< *(h1|h2)[^>]*>#Ui';
		$replaceByStars = '#< *li[^>]*>#Ui';
		$replaceByReturnChar1 = '#< */ *(li|td|dt|tr|div|p)[^>]*> *< *(li|td|dt|tr|div|p)[^>]*>#Ui';
		$replaceByReturnChar = '#< */? *(br|p|h1|h2|legend|h3|li|ul|dd|dt|h4|h5|h6|tr|td|div)[^>]*>#Ui';
		$replaceLinks = '/< *a[^>]*href *= *"([^#][^"]*)"[^>]*>(.+)< *\/ *a *>/Uis';

		$text = preg_replace(array($removepictureslinks, $removeScript, $removeStyle, $removeStrikeTags, $replaceByTwoReturnChar, $replaceByStars, $replaceByReturnChar1, $replaceByReturnChar, $replaceLinks), array('', '', '', '', "\n\n", "\n* ", "\n", "\n", '${2} ( ${1} )'), $html);

		$text = preg_replace('#(&lt;|&\#60;)([^ \n\r\t])#i', '&lt; ${2}', $text);

		$text = str_replace(array(" ", "&nbsp;"), ' ', strip_tags($text));

		$text = trim(@html_entity_decode($text, ENT_QUOTES, 'UTF-8'));

		if($fullConvert){
			$text = preg_replace('# +#', ' ', $text);
			$text = preg_replace('#\n *\n\s+#', "\n\n", $text);
		}

		return $text;
	}

	public function cleanText($text){
		return trim(preg_replace('/(%0A|%0D|\n+|\r+)/i', '', (string)$text));
	}

	public function setFrom($email, $name = '', $auto = false){

		if(!empty($email)){
			$this->From = $this->cleanText($email);
		}
		if(!empty($name) AND $this->config->get('add_names', true)){
			$this->FromName = $this->cleanText($name);
		}
	}

	private function generateAllParams(){
		$result = '<table style="border:1px solid;border-collapse:collapse;" border="1" cellpadding="10"><tr><td>Tag</td><td>Value</td></tr>';
		foreach($this->parameters as $name => $value){
			if(!is_string($value)) continue;
			$result .= '<tr><td>'.$name.'</td><td>'.$value.'</td></tr>';
		}
		$result .= '</table>';
		$this->addParam('alltags', $result);
	}

	public function addParamInfo(){
		if(!empty($_SERVER)){
			$serverinfo = array();
			foreach($_SERVER as $oneKey => $oneInfo){
				$serverinfo[] = $oneKey.' => '.strip_tags(print_r($oneInfo, true));
			}
			$this->addParam('serverinfo', implode('<br />', $serverinfo));
		}

		if(!empty($_REQUEST)){
			$postinfo = array();
			foreach($_REQUEST as $oneKey => $oneInfo){
				$postinfo[] = $oneKey.' => '.strip_tags(print_r($oneInfo, true));
			}
			$this->addParam('postinfo', implode('<br />', $postinfo));
		}
	}

	public function addParam($name, $value){
		$tagName = '{'.$name.'}';
		$this->parameters[$tagName] = $value;
	}

	protected function _addReplyTo($email, $name){
		if(empty($email)) return;
		$replyToName = $this->config->get('add_names', true) ? $this->cleanText(trim($name)) : '';
		$replyToEmail = trim($email);
		if(substr_count($replyToEmail, '@') > 1){
			$replyToEmailArray = explode(';', str_replace(array(';', ','), ';', $replyToEmail));
			$replyToNameArray = explode(';', str_replace(array(';', ','), ';', $replyToName));
			foreach($replyToEmailArray as $i => $oneReplyTo){
				$this->addReplyTo($this->cleanText($oneReplyTo), @$replyToNameArray[$i]);
			}
		}else{
			$this->addReplyTo($this->cleanText($replyToEmail), $replyToName);
		}
	}

	protected function ACY_DKIM_Sign($s){
		if(!empty($this->DKIM_passphrase)){
			$privKey = openssl_pkey_get_private($this->DKIM_private, $this->DKIM_passphrase);
		}else{
			$privKey = $this->DKIM_private;
		}
		$signature = '';
		if(openssl_sign($s, $signature, $privKey)){
			return base64_encode($signature);
		}
	}

	protected function ACY_DKIM_Add($body){
		$DKIMsignatureType = 'rsa-sha1'; // Signature & hash algorithms
		$DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
		$DKIMquery = 'dns/txt'; // Query method
		$DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)

		$subject = $this->encodeHeader($this->secureHeader($this->Subject));

		$subjecta_header = "Subject: $subject";
		$from = array();
		$from[0][0] = trim($this->From);
		$from[0][1] = $this->FromName;
		$fromc_header = $this->addrAppend('From', $from);
		$toy_header = $this->addrAppend('To', $this->to);

		$body = $this->DKIM_BodyC($body);
		$DKIMlen = strlen($body); // Length of body
		$DKIMb64 = base64_encode(pack("H*", sha1($body))); // Base64 of packed binary SHA-1 hash of body
		$ident = (empty($this->DKIM_identity)) ? '' : " i=".$this->DKIM_identity.";";
		$dkimhdrs = "DKIM-Signature: v=1; a=".$DKIMsignatureType."; q=".$DKIMquery."; l=".$DKIMlen."; s=".$this->DKIM_selector.";\r\n"."\tt=".$DKIMtime."; c=".$DKIMcanonicalization."; h=from:to:subject;\r\n"."\td=".$this->DKIM_domain.";".$ident." bh=".$DKIMb64.";\r\n"."\tb=";
		$toSign = $this->DKIM_HeaderC($fromc_header."\r\n".$toy_header."\r\n".$subjecta_header."\r\n".$dkimhdrs);
		$signed = wordwrap($this->ACY_DKIM_Sign($toSign), 60, "\r\n\t", true);
		if(empty($signed)) return '';
		return $dkimhdrs.$signed."\r\n";
	}

	protected function edebug($str){
		$this->ErrorInfo .= ' '.$str;
	}

	public function setWordWrap(){
		if($this->WordWrap < 1){
			return;
		}

		if(!empty($this->AltBody)) $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
		$this->Body = $this->wrapText($this->Body, $this->WordWrap);
	}

	public function isHTML($ishtml = true){
		parent::isHTML($ishtml);
		$this->sendHTML = $ishtml;
	}

	public function getMailMIME(){
		$result = parent::getMailMIME();

		$result = rtrim($result, $this->LE);

		if($this->Mailer != 'mail'){
			$result .= $this->LE.$this->LE;
		}

		return $result;
	}

	public static function validateAddress($address, $patternselect = 'auto'){
		return true;
	}

	function triggerTagsWithRightLanguage(&$mail, $loadedToSend){
		if(!empty($mail->language) && !in_array($mail->language, acymailing_getLanguageLocale())){
			$emaillangcode = '';

			$languages = acymailing_getLanguages();
			foreach($languages as $key => $oneLang){
				if($oneLang->sef != $mail->language) continue;
				$emaillangcode = $key;
				break;
			}

			if(!empty($emaillangcode)){
				$previousLanguage = acymailing_setLanguage($emaillangcode);
				acymailing_loadLanguageFile(ACYMAILING_COMPONENT, ACYMAILING_ROOT, $emaillangcode, true);
				acymailing_loadLanguageFile(ACYMAILING_COMPONENT.'_custom', ACYMAILING_ROOT, $emaillangcode, true);
				acymailing_loadLanguageFile('joomla', ACYMAILING_BASE, $emaillangcode, true);
			}
		}

		acymailing_trigger('acymailing_replacetags', array(&$mail, &$loadedToSend));

		if(empty($previousLanguage)) return;
		acymailing_setLanguage($previousLanguage);
		acymailing_loadLanguageFile(ACYMAILING_COMPONENT, ACYMAILING_ROOT, $previousLanguage, true);
		acymailing_loadLanguageFile(ACYMAILING_COMPONENT.'_custom', ACYMAILING_ROOT, $previousLanguage, true);
		acymailing_loadLanguageFile('joomla', ACYMAILING_BASE, $previousLanguage, true);
	}
}
components/com_acymailing/helpers/helper.php000060400000150545152453623450015355 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

define('ACYMAILING_NAME', 'AcyMailing');
define('ACYMAILING_DBPREFIX', '#__acymailing_');
define('ACYMAILING_UPDATEURL', 'https://www.acyba.com/index.php?option=com_updateme&ctrl=update&task=');
define('ACYMAILING_SPAMURL', 'https://www.acyba.com/index.php?option=com_updateme&ctrl=spamsystem&task=');
define('ACYMAILING_HELPURL', 'https://www.acyba.com/index.php?option=com_updateme&ctrl=doc&component='.ACYMAILING_NAME.'&page=');
define('ACYMAILING_REDIRECT', 'https://www.acyba.com/index.php?option=com_updateme&ctrl=redirect&page=');

if(!defined('DS')) define('DS', DIRECTORY_SEPARATOR);
include_once(rtrim(dirname(__DIR__),DS).DS.'compat'.DS.'joomla.php');

if(is_callable("date_default_timezone_set")) date_default_timezone_set(@date_default_timezone_get());

function acymailing_getEmailRegex($secureJS = false, $forceRegex = false){
	$config = acymailing_config();
	if($forceRegex || $config->get('special_chars', 0) == 0){
		$regex = '[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+)*\@([a-z0-9-]+\.)+[a-z0-9]{2,10}';
	}else{
		$regex = '.+\@(.+\.)+.{2,10}';
	}

	if($secureJS) $regex = str_replace(array('"', "'"), array('\"', "\'"), $regex);

	return $regex;
}

function acymailing_level($level){
    $config = acymailing_config();
    if($config->get($config->get('level'), 0) >= $level) return true;
    return false;
}

function acymailing_navigationTabs(){
    if(acymailing_isNoTemplate() || !acymailing_isAdmin() || !ACYMAILING_J40) return;

    $pages = array(
        'list' => array(
            'LISTS' => array('ctrl' => 'list', 'task' => ''),
            'ACY_DISTRIBUTION' => array('ctrl' => 'action', 'task' => '')
        ),
        'subscriber' => array(
            'ACY_SUBSCRIBER' => array('ctrl' => 'subscriber', 'task' => ''),
            'IMPORT' => array('ctrl' => 'data', 'task' => 'import'),
            'ACY_EXPORT' => array('ctrl' => 'data', 'task' => 'export'),
            'ACY_MASS_ACTIONS' => array('ctrl' => 'filter', 'task' => '')
        ),
        'newsletter' => array(
            'NEWSLETTERS' => array('ctrl' => 'newsletter', 'task' => ''),
            'AUTONEWSLETTERS' => array('ctrl' => 'autonews', 'task' => ''),
            'ACY_CAMPAIGNS' => array('ctrl' => 'campaign', 'task' => ''),
            'QUEUE' => array('ctrl' => 'queue', 'task' => ''),
            'SIMPLE_SENDING' => array('ctrl' => 'simplemail', 'task' => 'edit'),
            'ACY_TEMPLATES' => array('ctrl' => 'template', 'task' => '')
        ),
        'stats' => array(
            'STATISTICS' => array('ctrl' => 'stats', 'task' => 'listing'),
            'DETAILED_STATISTICS' => array('ctrl' => 'stats', 'task' => 'detaillisting'),
            'CLICK_STATISTICS' => array('ctrl' => 'statsurl', 'task' => ''),
            'CHARTS' => array('ctrl' => 'diagram', 'task' => '')
        ),
        'cpanel' => array(
            'ACY_CONFIGURATION' => array('ctrl' => 'cpanel', 'task' => ''),
            'EXTRA_FIELDS' => array('ctrl' => 'fields', 'task' => ''),
            'BOUNCE_HANDLING' => array('ctrl' => 'bounces', 'task' => '')
        )
    );

    $ctrl = acymailing_getVar('cmd', 'ctrl');
    $task = acymailing_getVar('cmd', 'task');

    $page = str_replace('acymailing_', '', acymailing_getVar('cmd', 'page', ''));

    if(empty($page)){
        foreach($pages as $mainCtrl => $siblings){
            foreach($siblings as $oneSibling){
                if($oneSibling['ctrl'] == $ctrl){
                    $page = $mainCtrl;
                    break;
                }
            }

            if(!empty($page)) break;
        }
    }
    if(empty($pages[$page])) return;

    $navigationTabs = array();
    foreach($pages[$page] as $text => $oneCtrl){
        $active = false;

        if($oneCtrl['ctrl'] == $ctrl && (empty($oneCtrl['task']) || $oneCtrl['task'] == $task || (empty($task) && $oneCtrl['task'] == 'listing'))) $active = true;

        $navigationTabs[] = '<li'.($active ? ' class="active"' : '').'><a href="' . acymailing_completeLink($oneCtrl['ctrl']). (empty($oneCtrl['task']) ? '' : '&task='.$oneCtrl['task']) . '">' . acymailing_translation($text) . '</a></li>';
    }

    echo '<div class="acytabsystem"><ul class="acynavigationtabs nav nav-tabs">'.implode('', $navigationTabs).'</ul></div>';
}

function acymailing_getDate($time = 0, $format = '%d %B %Y %H:%M'){
	if(empty($time)) return '';

	if(is_numeric($format)) $format = acymailing_translation('DATE_FORMAT_LC'.$format);
	if(ACYMAILING_J16){
		$format = str_replace(array('%A', '%d', '%B', '%m', '%Y', '%y', '%H', '%M', '%S', '%a', '%I', '%p', '%w'), array('l', 'd', 'F', 'm', 'Y', 'y', 'H', 'i', 's', 'D', 'h', 'a', 'w'), $format);
		try{
			return acymailing_date($time, $format, false);
		}catch(Exception $e){
			return date($format, $time);
		}
	}else{
		static $timeoffset = null;
		if($timeoffset === null){
			$timeoffset = acymailing_getCMSConfig('offset');
		}
		return acymailing_date($time - date('Z'), $format, $timeoffset);
	}
}

function acymailing_isRobot(){
	if(empty($_SERVER)) return false;
	if(!empty($_SERVER['HTTP_USER_AGENT']) && strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'spambayes') !== false) return true;
	if(!empty($_SERVER['REMOTE_ADDR']) && version_compare($_SERVER['REMOTE_ADDR'], '64.235.144.0', '>=') && version_compare($_SERVER['REMOTE_ADDR'], '64.235.159.255', '<=')) return true;

	return false;
}

function acymailing_isAllowed($allowedGroups, $groups = null){
	if($allowedGroups == 'all') return true;
	if($allowedGroups == 'none') return false;
	if(!is_array($allowedGroups)) $allowedGroups = explode(',', trim($allowedGroups, ','));

	$currentUserid = acymailing_currentUserId();
	if(empty($currentUserid) && empty($groups) && in_array('nonloggedin', $allowedGroups)) return true;

	if(empty($groups) && empty($currentUserid)) return false;
	if(empty($groups)) $groups = acymailing_getGroupsByUser($currentUserid, false);

	if(!is_array($groups)) $groups = array($groups);
	$inter = array_intersect($groups, $allowedGroups);
	if(empty($inter)) return false;
	return true;
}

function acymailing_getFunctionsEmailCheck($controllButtons = array(), $bounce = false){
	$addressCheck = '!emailAddress.match(/^'.acymailing_getEmailRegex(true).'((,|;)'.acymailing_getEmailRegex(true).')*$/i)';

	$return = '<script language="javascript" type="text/javascript">
				function validateEmail(emailAddress, fieldName){
					if(emailAddress.length > 0 && emailAddress.indexOf("{") == -1 && '.$addressCheck.'){
						alert("Wrong email address supplied for the " + fieldName + " field: " + emailAddress);
						return false;
					}
					return true;
				}';

	if(!empty($controllButtons)){
		foreach($controllButtons as &$oneField){
			$oneField = 'pressbutton == \''.$oneField.'\'';
		}

		$return .= '
		document.addEventListener("DOMContentLoaded", function(){
			acymailing.submitbutton = function(pressbutton){
				if('.implode(' || ', $controllButtons).'){
					var emailVars = ["fromemail","replyemail"'.($bounce ? ',"bounceemail"' : '').'];
					var val = "";
					for(var key in emailVars){
						if(isNaN(key)) continue;
						val = document.getElementById(emailVars[key]).value;
						if(!validateEmail(val, emailVars[key])){
							return;
						}
					}
				}
				acymailing.submitform(pressbutton,document.adminForm);
			};
		});';
	}

	$return .= '
				</script>';

	return $return;
}

function acymailing_loadLanguage(){
	acymailing_loadLanguageFile(ACYMAILING_COMPONENT, ACYMAILING_ROOT, null, true);
	acymailing_loadLanguageFile(ACYMAILING_COMPONENT.'_custom', ACYMAILING_ROOT, null, true);
}

function acymailing_createDir($dir, $report = true, $secured = false){
	if(is_dir($dir)) return true;

	$indexhtml = '<html><body bgcolor="#FFFFFF"></body></html>';

	try{
		$status = acymailing_createFolder($dir);
	}catch(Exception $e){
		$status = false;
	}

	if(!$status){
		if($report) acymailing_display('Could not create the directory '.$dir, 'error');
		return false;
	}

	try{
		$status = acymailing_writeFile($dir.DS.'index.html', $indexhtml);
	}catch(Exception $e){
		$status = false;
	}

	if(!$status){
		if($report) acymailing_display('Could not create the file '.$dir.DS.'index.html', 'error');
	}

	if($secured){
		try{
			$htaccess = 'Order deny,allow'."\r\n".'Deny from all';
			$status = acymailing_writeFile($dir.DS.'.htaccess', $htaccess);
		}catch(Exception $e){
			$status = false;
		}

		if(!$status){
			if($report) acymailing_display('Could not create the file '.$dir.DS.'.htaccess', 'error');
		}
	}

	return $status;
}

function acymailing_getUpgradeLink($tolevel){
	$config = acymailing_config();
	return ' <a class="acyupgradelink" href="'.ACYMAILING_REDIRECT.'upgrade-acymailing-'.$config->get('level').'-to-'.$tolevel.'" target="_blank">'.acymailing_translation('ONLY_FROM_'.strtoupper($tolevel)).'</a>';
}

function acymailing_replaceDate($mydate){

	if(strpos($mydate, '{time}') === false) return $mydate;

	$mydate = str_replace('{time}', time(), $mydate);
	$operators = array('+', '-');
	foreach($operators as $oneOperator){
		if(!strpos($mydate, $oneOperator)) continue;
		list($part1, $part2) = explode($oneOperator, $mydate);
		if($oneOperator == '+'){
			$mydate = trim($part1) + trim($part2);
		}elseif($oneOperator == '-'){
			$mydate = trim($part1) - trim($part2);
		}
	}

	return $mydate;
}

function acymailing_initJSStrings($includejs = 'header', $params = null){
	static $alreadyThere = false;
	if($alreadyThere && $includejs == 'header') return;
	$alreadyThere = true;

	if(method_exists($params, 'get')){
		$nameCaption = $params->get('nametext');
		$emailCaption = $params->get('emailtext');
	}
	if(empty($nameCaption)) $nameCaption = acymailing_translation('NAMECAPTION');
	if(empty($emailCaption)) $emailCaption = acymailing_translation('EMAILCAPTION');

	$js = "	if(typeof acymailingModule == 'undefined'){
				var acymailingModule = Array();
			}
			
			acymailingModule['emailRegex'] = /^".acymailing_getEmailRegex(true)."$/i;

			acymailingModule['NAMECAPTION'] = '".str_replace("'", "\'", $nameCaption)."';
			acymailingModule['NAME_MISSING'] = '".str_replace("'", "\'", acymailing_translation('NAME_MISSING'))."';
			acymailingModule['EMAILCAPTION'] = '".str_replace("'", "\'", $emailCaption)."';
			acymailingModule['VALID_EMAIL'] = '".str_replace("'", "\'", acymailing_translation('VALID_EMAIL'))."';
			acymailingModule['ACCEPT_TERMS'] = '".str_replace("'", "\'", acymailing_translation('ACCEPT_TERMS'))."';
			acymailingModule['CAPTCHA_MISSING'] = '".str_replace("'", "\'", acymailing_translation('ERROR_CAPTCHA'))."';
			acymailingModule['NO_LIST_SELECTED'] = '".str_replace("'", "\'", acymailing_translation('NO_LIST_SELECTED'))."';
		";
	if($includejs == 'header'){
		acymailing_addScript(true, $js);
	}else{
		echo "<script type=\"text/javascript\">
					<!--
					$js
					//-->
				</script>";
	}
}

function acymailing_generateKey($length){
	$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
	$randstring = '';
	$max = strlen($characters) - 1;
	for($i = 0; $i < $length; $i++){
		$randstring .= $characters[mt_rand(0, $max)];
	}
	return $randstring;
}

function acymailing_absoluteURL($text){
	static $mainurl = '';
	if(empty($mainurl)){
		$urls = parse_url(ACYMAILING_LIVE);
		if(!empty($urls['path'])){
			$mainurl = substr(ACYMAILING_LIVE, 0, strrpos(ACYMAILING_LIVE, $urls['path'])).'/';
		}else{
			$mainurl = ACYMAILING_LIVE;
		}
	}

	$text = str_replace(array('href="../undefined/', 'href="../../undefined/', 'href="../../../undefined//', 'href="undefined/', ACYMAILING_LIVE.'http://', ACYMAILING_LIVE.'https://'), array('href="'.$mainurl, 'href="'.$mainurl, 'href="'.$mainurl, 'href="'.ACYMAILING_LIVE, 'http://', 'https://'), $text);
	$text = preg_replace('#href="(/?administrator)?/({|%7B)#Ui', 'href="$2', $text);

	$text = preg_replace('#href="http:/([^/])#Ui', 'href="http://$1', $text);

	$text = preg_replace('#href="'.preg_quote(str_replace(array('http://', 'https://'), '', $mainurl), '#').'#Ui', 'href="'.$mainurl, $text);

	$replace = array();
	$replaceBy = array();
	if($mainurl !== ACYMAILING_LIVE){

		$replace[] = '#(href|src|action|background)[ ]*=[ ]*\"(?!(\{|%7B|\[|\#|\\\\|[a-z]{3,15}:|/))(?:\.\./)#i';
		$replaceBy[] = '$1="'.substr(ACYMAILING_LIVE, 0, strrpos(rtrim(ACYMAILING_LIVE, '/'), '/') + 1);


		$subfolder = substr(ACYMAILING_LIVE, strrpos(rtrim(ACYMAILING_LIVE, '/'), '/'));
		$replace[] = '#(href|src|action|background)[ ]*=[ ]*\"'.preg_quote($subfolder, '#').'(\{|%7B)#i';
		$replaceBy[] = '$1="$2';
	}
	$replace[] = '#(href|src|action|background)[ ]*=[ ]*\"(?!(\{|%7B|\[|\#|\\\\|[a-z]{3,15}:|/))(?:\.\./|\./)?#i';
	$replaceBy[] = '$1="'.ACYMAILING_LIVE;
	$replace[] = '#(href|src|action|background)[ ]*=[ ]*\"(?!(\{|%7B|\[|\#|\\\\|[a-z]{3,15}:))/#i';
	$replaceBy[] = '$1="'.$mainurl;

	$replace[] = '#((background-image|background)[ ]*:[ ]*url\(\'?"?(?!(\\\\|[a-z]{3,15}:|/|\'|"))(?:\.\./|\./)?)#i';
	$replaceBy[] = '$1'.ACYMAILING_LIVE;

	return preg_replace($replace, $replaceBy, $text);
}

function acymailing_mainURL(&$link){
    static $mainurl = '';
    static $otherarguments = false;
    if(empty($mainurl)){
        $urls = parse_url(ACYMAILING_LIVE);
        if(isset($urls['path']) AND strlen($urls['path']) > 0){
            $mainurl = substr(ACYMAILING_LIVE, 0, strrpos(ACYMAILING_LIVE, $urls['path'])).'/';
            $otherarguments = trim(str_replace($mainurl, '', ACYMAILING_LIVE), '/');
            if(strlen($otherarguments) > 0) $otherarguments .= '/';
        }else{
            $mainurl = ACYMAILING_LIVE;
        }
    }

    if($otherarguments && strpos($link, $otherarguments) === false) $link = $otherarguments.$link;

    return $mainurl;
}

function acymailing_bytes($val){
	$val = trim($val);
	if(empty($val)){
		return 0;
	}
	$last = strtolower($val[strlen($val) - 1]);
	switch($last){
		case 'g':
			$val = intval($val) * 1073741824;
		case 'm':
			$val = intval($val) * 1048576;
		case 'k':
			$val = intval($val) * 1024;
	}

	return (int)$val;
}

function acymailing_display($messages, $type = 'success', $close = false){
	if(empty($messages)) return;

	if(!is_array($messages)) $messages = array($messages);
	if(ACYMAILING_J30 || acymailing_isAdmin()){
		if(acymailing_isAdmin() && !acymailing_isNoTemplate()) echo '<div style="padding:1px;">';
		echo '<div id="acymailing_messages_'.$type.'" class="alert alert-'.$type.' alert-block">';
		if($close && ACYMAILING_J30) echo '<button type="button" class="close" data-dismiss="alert">×</button>';
		echo '<p>'.implode('</p><p>', $messages).'</p></div>';
		if(acymailing_isAdmin() && !acymailing_isNoTemplate()) echo '</div>';
	}else{
		echo '<div id="acymailing_messages_'.$type.'" class="acymailing_messages acymailing_'.$type.'"><ul><li>'.implode('</li><li>', $messages).'</li></ul></div>';
	}
}

function acymailing_table($name, $component = true){
	$prefix = $component ? ACYMAILING_DBPREFIX : '#__';
	return $prefix.$name;
}

function acymailing_secureField($fieldName){
	if(!is_string($fieldName) OR preg_match('|[^a-z0-9#_.-]|i', $fieldName) !== 0){
		die('field "'.htmlspecialchars($fieldName, ENT_COMPAT, 'UTF-8').'" not secured');
	}
	return $fieldName;
}

function acymailing_displayErrors(){
	error_reporting(E_ALL);
	@ini_set("display_errors", 1);
}

function acymailing_increasePerf(){
	@ini_set('max_execution_time', 600);
	@ini_set('pcre.backtrack_limit', 1000000);
}

function acymailing_config($reload = false){
	static $configClass = null;
	if($configClass === null || $reload){
		$configClass = acymailing_get('class.cpanel');
		$configClass->load();
	}
	return $configClass;
}

function acymailing_listingsearch($search){
	$searchBar = '<div class="filter-search">';
	$searchBar .= '<input placeholder="'.acymailing_translation('ACY_SEARCH').'" type="text" name="search" id="search" value="'.htmlspecialchars($search, ENT_COMPAT, 'UTF-8').'" class="text_area" title="'.acymailing_translation('ACY_SEARCH').'"/>';
	$searchBar .= '<button style="float:none;" onclick="document.adminForm.task.value=\'\';document.adminForm.limitstart.value=0;this.form.submit();" class="btn tip hasTooltip" type="submit" title="'.acymailing_translation('ACY_SEARCH').'"><i class="acyicon-search"></i></button>';
	$searchBar .= '<button style="float:none;margin-left:0px;" onclick="document.adminForm.task.value=\'\';document.adminForm.limitstart.value=0;document.getElementById(\'search\').value=\'\';this.form.submit();" class="btn tip hasTooltip" type="button" title="'.acymailing_translation('JOOMEXT_RESET').'"><i class="acyicon-cancel"></i></button>';
	$searchBar .= '</div>';
	echo $searchBar;
}

function acymailing_getModuleFormName(){
	static $i = 1;
	return 'formAcymailing'.rand(1000, 9999).$i++;
}

function acymailing_initModule($params){
	$includejs = 'header';
	if(method_exists($params, 'get')) $includejs = $params->get('includejs', 'header');

	static $alreadyThere = false;
	if($alreadyThere && $includejs == 'header') return;

	$alreadyThere = true;

	acymailing_initJSStrings($includejs, $params);
	$config = acymailing_config();
	if($includejs == 'header'){
		if(ACYMAILING_J16){
			acymailing_addScript(false, ACYMAILING_JS.'acymailing_module.js?v='.str_replace('.', '', $config->get('version')), 'text/javascript', false, true);
		}else{
			acymailing_addScript(false, ACYMAILING_JS.'acymailing_module.js?v='.str_replace('.', '', $config->get('version')));
		}
	}else{
		echo "\n".'<script type="text/javascript" src="'.ACYMAILING_JS.'acymailing_module.js?v='.str_replace('.', '', $config->get('version')).'" ></script>'."\n";
	}

	$moduleCSS = $config->get('css_module', 'default');
	if(!empty($moduleCSS)){
		if($includejs == 'header'){
			acymailing_addStyle(false, ACYMAILING_CSS.'module_'.$moduleCSS.'.css?v='.filemtime(ACYMAILING_MEDIA.'css'.DS.'module_'.$moduleCSS.'.css'));
		}else{
			echo "\n".'<link rel="stylesheet" property="stylesheet" href="'.ACYMAILING_CSS.'module_'.$moduleCSS.'.css?v='.filemtime(ACYMAILING_MEDIA.'css'.DS.'module_'.$moduleCSS.'.css').'" type="text/css" />'."\n";
		}
	}
}

function acymailing_footer(){
	$config = acymailing_config();
	$description = ACYMAILING_CMS.' E-mail Marketing';
	$text = '<!-- '.ACYMAILING_NAME.' Component powered by http://www.acyba.com -->
		<!-- version '.$config->get('level').' : '.$config->get('version').' -->';
	if(acymailing_level(1) && !acymailing_level(4)) return $text;
	$level = $config->get('level');
	$text .= '<div class="acymailing_footer" align="center" style="text-align:center"><a href="https://www.acyba.com/?utm_source=acymailing-'.$level.'&utm_medium=front-end&utm_content=txt&utm_campaign=powered-by" target="_blank" title="'.ACYMAILING_NAME.' : '.str_replace('TM ', ' ', strip_tags($description)).'">'.ACYMAILING_NAME;
	$text .= ' - '.$description.'</a></div>';
	return $text;
}

function acymailing_dispSearch($string, $searchString){
	$secString = htmlspecialchars($string, ENT_COMPAT, 'UTF-8');
	if(strlen($searchString) == 0) return $secString;
	return preg_replace('#('.preg_quote($searchString, '#').')#i', '<span class="searchtext">$1</span>', $secString);
}

function acymailing_perf($name){
	static $previoustime = 0;
	static $previousmemory = 0;
	static $file = '';

	if(empty($file)){
		$file = ACYMAILING_ROOT.'acydebug_'.rand().'.txt';
		$previoustime = microtime(true);
		$previousmemory = memory_get_usage();
		file_put_contents($file, "\r\n\r\n-- new test : ".$name." -- ".date('d M H:i:s')." from ".@$_SERVER['REMOTE_ADDR'], FILE_APPEND);
		return;
	}

	$nowtime = microtime(true);
	$totaltime = $nowtime - $previoustime;
	$previoustime = $nowtime;

	$nowmemory = memory_get_usage();
	$totalmemory = $nowmemory - $previousmemory;
	$previousmemory = $nowmemory;

	file_put_contents($file, "\r\n".$name.' : '.number_format($totaltime, 2).'s - '.$totalmemory.' / '.memory_get_usage(), FILE_APPEND);
}

function acymailing_search($searchString, $object){

	if(empty($object) || is_numeric($object)) return $object;

	if(is_string($object)){
		return preg_replace('#('.str_replace('#', '\#', $searchString).')#i', '<span class="searchtext">$1</span>', $object);
	}

	if(is_array($object)){
		foreach($object as $key => $element){
			$object[$key] = acymailing_search($searchString, $element);
		}
	}elseif(is_object($object)){
		foreach($object as $key => $element){
			$object->$key = acymailing_search($searchString, $element);
		}
	}

	return $object;
}

function acymailing_get($path){
	list($group, $class) = explode('.', $path);
	if($group == 'helper' && $class == 'user') $class = 'acyuser';
	if($group == 'helper' && $class == 'mailer') $class = 'acymailer';

	$className = $class.ucfirst(str_replace('_front', '', $group));
	if($group == 'helper' && strpos($className, 'acy') !== 0) $className = 'acy'.$className;

	if(substr($group, 0, 4) == 'view'){
		$className = $className.ucfirst($class);
		$class .= DS.'view.html';
	}

	if(!class_exists($className)) include(constant(strtoupper('ACYMAILING_'.$group)).$class.'.php');

	if(!class_exists($className)) return null;
	return new $className();
}

function acymailing_getCID($field = ''){
	$oneResult = acymailing_getVar('array', 'cid', array(), '');
	$oneResult = intval(reset($oneResult));
	if(!empty($oneResult) || empty($field)) return $oneResult;

	$oneResult = acymailing_getVar('int', $field, 0, '');
	return intval($oneResult);
}

function acymailing_checkRobots(){
	if(preg_match('#(libwww-perl|python|googlebot)#i', @$_SERVER['HTTP_USER_AGENT'])) die('Not allowed for robots. Please contact us if you are not a robot');
}

function acymailing_removeChzn($eltsToClean){
	if(!ACYMAILING_J30) return;

	$js = ' function removeChosen(){';
	foreach($eltsToClean as $elt){
		$js .= 'jQuery("#'.$elt.' .chzn-container").remove();
					jQuery("#'.$elt.' .chzn-done").removeClass("chzn-done").show();
					';
	}
	$js .= '}
		document.addEventListener("DOMContentLoaded", function(){removeChosen();
			setTimeout(function(){
				removeChosen();
		}, 100);});';
	acymailing_addScript(true, $js);
}

function acymailing_importFile($file, $uploadPath, $onlyPict, $maxwidth = ''){
	acymailing_checkToken();

	$config = acymailing_config();
	$additionalMsg = '';

	if($file["error"] > 0){
		$file["error"] = intval($file["error"]);
		if($file["error"] > 8) $file["error"] = 0;

		$phpFileUploadErrors = array(
			0 => 'Unknown error',
			1 => 'The uploaded file exceeds the upload_max_filesize directive in php.ini',
			2 => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
			3 => 'The uploaded file was only partially uploaded',
			4 => 'No file was uploaded',
			6 => 'Missing a temporary folder',
			7 => 'Failed to write file to disk',
			8 => 'A PHP extension stopped the file upload'
		);

		acymailing_display("Error Uploading file: ".$phpFileUploadErrors[$file["error"]], 'error');
		return false;
	}

	acymailing_createDir($uploadPath, true);

	if(!is_writable($uploadPath)){
		@chmod($uploadPath, '0755');
		if(!is_writable($uploadPath)){
			acymailing_display(acymailing_translation_sprintf('WRITABLE_FOLDER', $uploadPath), 'error');
			return false;
		}
	}

	if($onlyPict){
		$allowedExtensions = array('png', 'jpeg', 'jpg', 'gif', 'ico', 'bmp');
	}else{
		$allowedExtensions = explode(',', $config->get('allowedfiles'));
	}

	if(!preg_match('#\.('.implode('|', $allowedExtensions).')$#Ui', $file["name"], $extension)){
		$ext = substr($file["name"], strrpos($file["name"], '.') + 1);
		acymailing_display(acymailing_translation_sprintf('ACCEPTED_TYPE', htmlspecialchars($ext, ENT_COMPAT, 'UTF-8'), implode(', ', $allowedExtensions)), 'error');
		return false;
	}

	if(preg_match('#\.(php.?|.?htm.?|pl|py|jsp|asp|sh|cgi)#Ui', $file["name"])){
		acymailing_display('This extension name is blocked by the system regardless your configuration for security reasons', 'error');
		return false;
	}

	$file["name"] = preg_replace('#[^a-z0-9]#i', '_', strtolower(substr($file["name"], 0, strrpos($file["name"], '.')))).'.'.$extension[1];

	if($onlyPict){
		$imageSize = getimagesize($file['tmp_name']);
		if(empty($imageSize)){
			acymailing_display('Invalid image', 'error');
			return false;
		}
	}

	if(file_exists($uploadPath.DS.$file["name"])){
		$i = 1;
		$nameFile = preg_replace("/\\.[^.\\s]{3,4}$/", "", $file["name"]);
		$ext = substr($file["name"], strrpos($file["name"], '.') + 1);
		while(file_exists($uploadPath.DS.$nameFile.'_'.$i.'.'.$ext)){
			$i++;
		}

		$file["name"] = $nameFile.'_'.$i.'.'.$ext;
		$additionalMsg = '<br />'.acymailing_translation_sprintf('FILE_RENAMED', $file["name"]);
		if($onlyPict) $additionalMsg .= '<br /><a style="color: blue; cursor: pointer;" onclick="confirmBox(\'rename\', \''.$file['name'].'\', \''.$nameFile.'.'.$ext.'\')">'.acymailing_translation('ACY_RENAME_OR_REPLACE').'</a>';
	}

	if(!acymailing_uploadFile($file["tmp_name"], rtrim($uploadPath, DS).DS.$file["name"])){
		if(!move_uploaded_file($file["tmp_name"], rtrim($uploadPath, DS).DS.$file["name"])){
			acymailing_display(acymailing_translation_sprintf('FAIL_UPLOAD', '<b><i>'.htmlspecialchars($file["tmp_name"], ENT_COMPAT, 'UTF-8').'</i></b>', '<b><i>'.htmlspecialchars(rtrim($uploadPath, DS).DS.$file["name"], ENT_COMPAT, 'UTF-8').'</i></b>'), 'error');
			return false;
		}
	}

	if(!empty($maxwidth) || ($onlyPict && $imageSize[0] > 1000)){
		$pictureHelper = acymailing_get('helper.acypict');
		if($pictureHelper->available()){
			$pictureHelper->maxHeight = 9999;
			if(empty($maxwidth)){
				$pictureHelper->maxWidth = 700;
				$message = 'IMAGE_RESIZED';
			}else{
				$pictureHelper->maxWidth = $maxwidth;
				$message = 'ACY_IMAGE_RESIZED';
			}
			$pictureHelper->destination = $uploadPath;
			$thumb = $pictureHelper->generateThumbnail(rtrim($uploadPath, DS).DS.$file["name"], $file["name"]);
			$resize = acymailing_moveFile($thumb['file'], $uploadPath.DS.$file["name"]);
			if($thumb) $additionalMsg .= '<br />'.acymailing_translation($message);
		}
	}
	acymailing_display('<strong>'.acymailing_translation('SUCCESS_FILE_UPLOAD').'</strong>'.$additionalMsg, 'success');
	return $file["name"];
}

function acymailing_getFilesFolder($folder = 'upload', $multipleFolders = false){
	$listClass = acymailing_get('class.list');
	if(acymailing_isAdmin()){
		$allLists = $listClass->getLists('listid');
	}else{
		$allLists = $listClass->getFrontendLists('listid');
	}
	$newFolders = array();

	$config = acymailing_config();
	if($folder == 'upload'){
		$uploadFolder = $config->get('uploadfolder', ACYMAILING_MEDIA_FOLDER.'/upload');
	}else{
		$uploadFolder = $config->get('mediafolder', ACYMAILING_MEDIA_FOLDER.'/upload');
	}

	$folders = explode(',', $uploadFolder);

	foreach($folders as $k => $folder){
		$folders[$k] = trim($folder, '/');
		if(strpos($folder, '{userid}') !== false) $folders[$k] = str_replace('{userid}', acymailing_currentUserId(), $folders[$k]);

		if(strpos($folder, '{listalias}') !== false){
			if(empty($allLists)){
				$noList = new stdClass();
				$noList->alias = 'none';
				$allLists = array($noList);
			}

			foreach($allLists as $oneList){
				$newFolders[] = str_replace('{listalias}', strtolower(str_replace(array(' ', '-'), '_', $oneList->alias)), $folders[$k]);
			}

			$folders[$k] = '';
			continue;
		}

		if(strpos($folder, '{groupid}') !== false || strpos($folder, '{groupname}') !== false){
			$groups = acymailing_getGroupsByUser(acymailing_currentUserId(), false);
			acymailing_arrayToInteger($groups);

			if(ACYMAILING_J16){
				$completeGroups = acymailing_loadObjectList('SELECT id, title FROM #__usergroups WHERE id IN ('.implode(',', $groups).')');
			}else{
				$groupObject = new stdClass();
				$groupObject->id = $groups[0];
				$groupObject->title = acymailing_getGroupsByUser();
				$completeGroups = array($groupObject);
			}

			foreach($completeGroups as $group){
				$newFolders[] = str_replace(array('{groupid}', '{groupname}'), array($group->id, strtolower(str_replace(' ', '_', $group->title))), $folders[$k]);
			}

			$folders[$k] = '';
		}
	}

	$folders = array_merge($folders, $newFolders);
	$folders = array_filter($folders);
	sort($folders);
	if($multipleFolders){
		return $folders;
	}else{
		return array_shift($folders);
	}
}

function acymailing_generateArborescence($folders){
	$folderList = array();
	foreach($folders as $folder){
		$folderPath = acymailing_cleanPath(ACYMAILING_ROOT.trim(str_replace('/', DS, trim($folder)), DS));
		if(!file_exists($folderPath)) acymailing_createDir($folderPath);
		$subFolders = acymailing_listFolderTree($folderPath, '', 15);
		$folderList[$folder] = array();
		foreach($subFolders as $oneFolder){
			$subFolder = str_replace(ACYMAILING_ROOT, '', $oneFolder['relname']);
			$subFolder = str_replace(DS, '/', $subFolder);
			$folderList[$folder][$subFolder] = ltrim($subFolder, '/');
		}
		$folderList[$folder] = array_unique($folderList[$folder]);
	}
	return $folderList;
}

function acymailing_arrayToInteger(&$array){
	if(is_array($array)){
		$array = array_map('intval', $array);
	}else{
		$array = array();
	}
}

function acymailing_arrayToString($array, $inner_glue = '=', $outer_glue = ' ', $keepOuterKey = false){
	$output = array();

	foreach($array as $key => $item){
		if(is_array($item)){
			if($keepOuterKey) $output[] = $key;

			$output[] = acymailing_arrayToString($item, $inner_glue, $outer_glue, $keepOuterKey);
		}else{
			$output[] = $key.$inner_glue.'"'.$item.'"';
		}
	}

	return implode($outer_glue, $output);
}

function acymailing_makeSafeFile($file){
	$file = rtrim($file, '.');
	$regex = array('#(\.){2,}#', '#[^A-Za-z0-9\.\_\- ]#', '#^\.#');
	return trim(preg_replace($regex, '', $file));
}

function acymailing_sortablelist($table, $ordering){
	acymailing_addScript(false, ACYMAILING_JS.'sortable.js?v='.@filemtime(ACYMAILING_MEDIA.'js'.DS.'sortable.js'));

	$js = "
		document.addEventListener(\"DOMContentLoaded\", function(event) {
			Sortable.create(document.getElementById('acymailing_sortable_listing'), {
				handle: '.acyicon-draghandle',
				animation: 150,
				dataIdAttr: 'acyorderid',
				ghostClass: 'acysortable-ghost',
				store: {
					set: function (sortable) {
						var cid = sortable.toArray();
						var order = [".$ordering."];
						
						var xhr = new XMLHttpRequest();
						xhr.open('GET', '".acymailing_prepareAjaxURL($table)."&task=saveorder&'+cid.join('&')+'&'+order.join('&')+'&".acymailing_getFormToken()."');
						xhr.send();
					}
				}
			});
		});";

	acymailing_addScript(true, $js);
}

function acymailing_tooltip($desc, $title = '', $image = 'tooltip.png', $name = '', $href = '', $alt = ''){
	static $loaded = false;

	if(!$loaded) {
		acymailing_addScript(false, ACYMAILING_JS.'acymailing.js?v='.filemtime(ACYMAILING_MEDIA.'js'.DS.'acymailing.js'));
		acymailing_addStyle(false, ACYMAILING_CSS.'acytooltip.css?v='.filemtime(ACYMAILING_MEDIA.'css'.DS.'acytooltip.css'));
		$loaded = true;
	}

	$content = $desc;
	if(!empty($title)) $content = '<span style="font-weight: bold;">'.$title.'</span><br/>'.$content;
	if(empty($name)) $name = '<img alt="" src="'.ACYMAILING_IMAGES.$image.'"/>';
	if(!empty($href)) $name = '<a href="'.$href.'" alt="'.htmlspecialchars($alt, ENT_QUOTES, 'UTF-8').'"">'.$name.'</a>';

	return '<span class="acymailingtooltip"><span class="acymailingtooltiptext">'.$content.'</span>'.$name.'</span>';
}

function acymailing_deleteFolder($path){
	$path = acymailing_cleanPath($path);
	if(!is_dir($path)){
		acymailing_enqueueMessage($path.' is not a folder', 'error');
		return false;
	}
	$files = acymailing_getFiles($path);
	if(!empty($files)){
		foreach($files as $oneFile){
			if(!acymailing_deleteFile($path.DS.$oneFile)) return false;
		}
	}

	$folders = acymailing_getFolders($path);
	if(!empty($folders)){
		foreach($folders as $oneFolder){
			if(!acymailing_deleteFolder($path.DS.$oneFolder)) return false;
		}
	}

	if (@rmdir($path)){
		$ret = true;
	}else{
		acymailing_enqueueMessage('Could not delete folder '.$path, 'error');
		$ret = false;
	}

	return $ret;
}

function acymailing_createFolder($path = '', $mode = 0755){
	$path = acymailing_cleanPath($path);
	if(file_exists($path)) return true;

	$origmask = @umask(0);
	$ret = @mkdir($path, $mode, true);
	@umask($origmask);

	return $ret;
}

function acymailing_getFolders($path, $filter = '.', $recurse = false, $full = false, $exclude = array('.svn', 'CVS', '.DS_Store', '__MACOSX'), $excludefilter = array('^\..*')){
	$path = acymailing_cleanPath($path);

	if (!is_dir($path)){
		acymailing_enqueueMessage($path.' is not a folder', 'error');
		return false;
	}

	if (count($excludefilter)){
		$excludefilter_string = '/(' . implode('|', $excludefilter) . ')/';
	}else{
		$excludefilter_string = '';
	}

	$arr = acymailing_getItems($path, $filter, $recurse, $full, $exclude, $excludefilter_string, false);
	asort($arr);

	return array_values($arr);
}

function acymailing_getFiles($path, $filter = '.', $recurse = false, $full = false, $exclude = array('.svn', 'CVS', '.DS_Store', '__MACOSX'), $excludefilter = array('^\..*', '.*~'), $naturalSort = false){
	$path = acymailing_cleanPath($path);

	if (!is_dir($path)){
		acymailing_enqueueMessage($path.' is not a folder', 'error');
		return false;
	}

	if (count($excludefilter)){
		$excludefilter_string = '/(' . implode('|', $excludefilter) . ')/';
	}else{
		$excludefilter_string = '';
	}

	$arr = acymailing_getItems($path, $filter, $recurse, $full, $exclude, $excludefilter_string, true);

	if ($naturalSort){
		natsort($arr);
	}else{
		asort($arr);
	}

	return array_values($arr);
}

function acymailing_getItems($path, $filter, $recurse, $full, $exclude, $excludefilter_string, $findfiles){
	$arr = array();

	if(!($handle = @opendir($path))) return $arr;

	while(($file = readdir($handle)) !== false){
		if($file == '.' || $file == '..' || in_array($file, $exclude) || (!empty($excludefilter_string) && preg_match($excludefilter_string, $file))) continue;
		$fullpath = $path . '/' . $file;

		$isDir = is_dir($fullpath);

		if(($isDir xor $findfiles) && preg_match("/$filter/", $file)){
			if($full){
				$arr[] = $fullpath;
			}else{
				$arr[] = $file;
			}
		}

		if($isDir && $recurse){
			if(is_int($recurse)){
				$arr = array_merge($arr, acymailing_getItems($fullpath, $filter, $recurse - 1, $full, $exclude, $excludefilter_string, $findfiles));
			}else{
				$arr = array_merge($arr, acymailing_getItems($fullpath, $filter, $recurse, $full, $exclude, $excludefilter_string, $findfiles));
			}
		}
	}

	closedir($handle);

	return $arr;
}

function acymailing_copyFolder($src, $dest, $path = '', $force = false, $use_streams = false){

	if($path){
		$src  = acymailing_cleanPath($path . '/' . $src);
		$dest = acymailing_cleanPath($path . '/' . $dest);
	}

	$src = rtrim($src, DIRECTORY_SEPARATOR);
	$dest = rtrim($dest, DIRECTORY_SEPARATOR);

	if (!file_exists($src)){
		acymailing_enqueueMessage('Folder '.$src.' does not exist', 'error');
		return false;
	}

	if(file_exists($dest) && !$force){
		acymailing_enqueueMessage('Folder '.$dest.' already exists', 'error');
		return true;
	}

	if (!acymailing_createFolder($dest)){
		acymailing_enqueueMessage('Cannot create destination folder', 'error');
		return false;
	}

	if (!($dh = @opendir($src))){
		acymailing_enqueueMessage('Cannot open source folder', 'error');
		return false;
	}

	while(($file = readdir($dh)) !== false){
		$sfid = $src . '/' . $file;
		$dfid = $dest . '/' . $file;

		switch (filetype($sfid)){
			case 'dir':
				if ($file != '.' && $file != '..'){
					$ret = acymailing_copyFolder($sfid, $dfid, null, $force, $use_streams);

					if ($ret !== true)
					{
						return $ret;
					}
				}
				break;

			case 'file':
				if (!@copy($sfid, $dfid)){
					acymailing_enqueueMessage('Copy file '.$sfid.' failed, check permissions', 'error');
					return false;
				}
				break;
		}
	}

	return true;
}

function acymailing_moveFolder($src, $dest, $path = '', $use_streams = false){
	if($path){
		$src = acymailing_cleanPath($path . '/' . $src);
		$dest = acymailing_cleanPath($path . '/' . $dest);
	}

	if (!file_exists($src)){
		acymailing_enqueueMessage('Folder '.$src.' does not exist', 'error');
		return false;
	}

	if (!@rename($src, $dest)){
		acymailing_enqueueMessage('Could not move folder '.$src.' to '.$dest.', check permissions', 'error');
		return false;
	}

	return true;
}

function acymailing_listFolderTree($path, $filter, $maxLevel = 3, $level = 0, $parent = 0){
	$dirs = array();

	if($level == 0) $GLOBALS['acymailing_folder_tree_index'] = 0;

	if ($level < $maxLevel){
		$folders = acymailing_getFolders($path, $filter);

		foreach ($folders as $name){
			$id = ++$GLOBALS['acymailing_folder_tree_index'];
			$fullName = acymailing_cleanPath($path . '/' . $name);
			$dirs[] = array(
				'id' => $id,
				'parent' => $parent,
				'name' => $name,
				'fullname' => $fullName,
				'relname' => str_replace(ACYMAILING_ROOT, '', $fullName),
			);
			$dirs2 = acymailing_listFolderTree($fullName, $filter, $maxLevel, $level + 1, $id);
			$dirs = array_merge($dirs, $dirs2);
		}
	}

	return $dirs;
}

function acymailing_deleteFile($file){
	$file = acymailing_cleanPath($file);
	if(!is_file($file)){
		acymailing_enqueueMessage($file.' is not a file', 'error');
		return false;
	}

	@chmod($file, 0777);

	if (!@unlink($file)){
		$filename = basename($file);
		acymailing_enqueueMessage('Failed to delete '.$filename, 'error');
		return false;
	}

	return true;
}

function acymailing_writeFile($file, $buffer, $use_streams = false){
	if (!file_exists(dirname($file)) && acymailing_createFolder(dirname($file)) == false) return false;

	$file = acymailing_cleanPath($file);
	$ret = is_int(file_put_contents($file, $buffer));

	return $ret;
}

function acymailing_moveFile($src, $dest, $path = '', $use_streams = false){
	if ($path){
		$src = acymailing_cleanPath($path . '/' . $src);
		$dest = acymailing_cleanPath($path . '/' . $dest);
	}

	if (!is_readable($src)){
		acymailing_enqueueMessage('Could not find source file, check permissions: '.$src, 'error');
		return false;
	}

	if (!@rename($src, $dest)){
		acymailing_enqueueMessage('Could not move the file', 'error');
		return false;
	}

	return true;
}

function acymailing_uploadFile($src, $dest){
	$dest = acymailing_cleanPath($dest);

	$baseDir = dirname($dest);
	if(!file_exists($baseDir)) acymailing_createFolder($baseDir);

	if(is_writeable($baseDir) && move_uploaded_file($src, $dest)){
		if (@chmod($dest, octdec('0644'))){
			return true;
		}else{
			acymailing_enqueueMessage('The file has been rejected for safety reason', 'error');
		}
	}else{
		acymailing_enqueueMessage('Couldn\'t upload file, check permissions for the folder '.$baseDir, 'error');
	}

	return false;
}

function acymailing_copyFile($src, $dest, $path = null, $use_streams = false){
	if ($path){
		$src = acymailing_cleanPath($path . '/' . $src);
		$dest = acymailing_cleanPath($path . '/' . $dest);
	}

	if (!is_readable($src)){
		acymailing_enqueueMessage('Could not find source file, check permissions: '.$src, 'error');
		return false;
	}

	if (!@copy($src, $dest)){
		acymailing_enqueueMessage('Could not copy the file '.$src.' to '.$dest, 'error');
		return false;
	}

	return true;
}

function acymailing_fileGetExt($file){
	$dot = strrpos($file, '.');
	if($dot === false) return '';

	return substr($file, $dot + 1);
}

function acymailing_cleanPath($path, $ds = DIRECTORY_SEPARATOR){
	$path = trim($path);

	if(empty($path)){
		$path = ACYMAILING_ROOT;
	}elseif (($ds == '\\') && substr($path, 0, 2) == '\\\\'){
		$path = "\\" . preg_replace('#[/\\\\]+#', $ds, $path);
	}else{
		$path = preg_replace('#[/\\\\]+#', $ds, $path);
	}

	return $path;
}

function acymailing_popup($url, $text, $class = '', $width = 800, $height = 500, $id = '', $params = ''){
	static $loaded = false;

	if(!$loaded) {
		acymailing_addScript(false, ACYMAILING_JS . 'acymailing.js?v=' . filemtime(ACYMAILING_MEDIA . 'js' . DS . 'acymailing.js'));
		acymailing_addStyle(false, ACYMAILING_CSS . 'acypopup.css?v=' . filemtime(ACYMAILING_MEDIA . 'css' . DS . 'acypopup.css'));
		acymailing_addStyle(false, ACYMAILING_CSS.'acyicon.css?v='.filemtime(ACYMAILING_MEDIA.'css'.DS.'acyicon.css'));
		$loaded = true;
	}

	if(!empty($id)) $id = ' id="'.$id.'" ';
	$url .= '&'.acymailing_noTemplate();
	return '<a onclick="acymailing.openpopup(\''.$url.'\','.$width.','.$height.'); return false;" class="acymailingpopup '.$class.'" '.$id.$params.'>'.$text.'</a>';
}

function acymailing_createArchive($name, $files){
	$contents = array();
	$ctrldir = array();

	$timearray = getdate();
	$dostime = (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) | ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
	$dtime = dechex($dostime);
	$hexdtime = chr(hexdec($dtime[6] . $dtime[7])) . chr(hexdec($dtime[4] . $dtime[5])) . chr(hexdec($dtime[2] . $dtime[3])) . chr(hexdec($dtime[0] . $dtime[1]));

	foreach ($files as $file){
		$data = $file['data'];
		$filename = str_replace('\\', '/', $file['name']);

		$fr = "\x50\x4b\x03\x04\x14\x00\x00\x00\x08\x00".$hexdtime;

		$unc_len = strlen($data);
		$crc = crc32($data);
		$zdata = gzcompress($data);
		$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
		$c_len = strlen($zdata);

		$fr .= pack('V', $crc).pack('V', $c_len).pack('V', $unc_len).pack('v', strlen($filename)).pack('v', 0).$filename.$zdata;

		$old_offset = strlen(implode('', $contents));
		$contents[] = $fr;

		$cdrec = "\x50\x4b\x01\x02\x00\x00\x14\x00\x00\x00\x08\x00".$hexdtime;
		$cdrec .= pack('V', $crc).pack('V', $c_len).pack('V', $unc_len).pack('v', strlen($filename)).pack('v', 0).pack('v', 0).pack('v', 0).pack('v', 0).pack('V', 32).pack('V', $old_offset).$filename;

		$ctrldir[] = $cdrec;
	}

	$data = implode('', $contents);
	$dir = implode('', $ctrldir);
	$buffer = $data . $dir . "\x50\x4b\x05\x06\x00\x00\x00\x00" . pack('v', count($ctrldir)) . pack('v', count($ctrldir)) . pack('V', strlen($dir)) . pack('V', strlen($data)) . "\x00\x00";

	return acymailing_writeFile($name.'.zip', $buffer);
}

function acymailing_currentURL(){
	$url = isset($_SERVER['HTTPS']) ? 'https' : 'http';
	$url .= '://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
	return $url;
}

function acymailing_accessList(){
	$listid = acymailing_getVar('int', 'listid');
	if(empty($listid)) return false;

	$listClass = acymailing_get('class.list');
	$myList = $listClass->get($listid);
	if(empty($myList->listid)) die('Invalid List');

	$currentUserid = acymailing_currentUserId();
	if(!empty($currentUserid) && $currentUserid == (int)$myList->userid) return true;
	if(empty($currentUserid) || $myList->access_manage == 'none') return false;
	if($myList->access_manage != 'all' && !acymailing_isAllowed($myList->access_manage)) return false;
	
	return true;
}

function acymailing_gridSort($title, $order, $direction = 'asc', $selected = '', $task = null, $new_direction = 'asc', $tip = ''){
	$direction = strtolower($direction);
	if ($order != $selected){
		$direction = $new_direction;
	}else{
		$direction = $direction == 'desc' ? 'asc' : 'desc';
	}

	$icon = array('acyicon-up', 'acyicon-down');
	$index = (int) ($direction == 'desc');

	$result = '<a href="#" onclick="acymailing.tableOrdering(\''.$order.'\', \''.$direction.'\', \''.$task.'\');return false;">';
	$result .= acymailing_tooltip(acymailing_translation('ACY_ORDER_COLUMN'), '', '', acymailing_translation($title));
	if ($order == $selected) $result .= '<span class="' . $icon[$index] . '"></span>';
	$result .= '</a>';

	return $result;
}

function acymailing_session(){
	$sessionID = session_id();
	if(empty($sessionID)) @session_start();
}

class acymailingController extends acymailingBridgeController{

	var $pkey = '';
	var $table = '';
	var $groupMap = '';
	var $groupVal = '';
	var $aclCat = '';

	function __construct($config = array()){
		parent::__construct($config);

		$this->registerDefaultTask('listing');
	}

	function getModel($name = '', $prefix = '', $config = array()){
		return false;
	}

	function listing(){
		if(!empty($this->aclCat) && !$this->isAllowed($this->aclCat, 'manage')) return;
		acymailing_setVar('layout', 'listing');
		return parent::display();
	}

	function isAllowed($cat, $action){
		if(acymailing_level(3)){
			$config = acymailing_config();
			if(!acymailing_isAllowed($config->get('acl_'.$cat.'_'.$action, 'all'))){
				acymailing_display(acymailing_translation('ACY_NOTALLOWED'), 'error');
				return false;
			}
		}
		return true;
	}

	function edit(){
		if(!empty($this->aclCat) && !$this->isAllowed($this->aclCat, 'manage')) return;
		acymailing_setVar('layout', 'form');
		return parent::display();
	}


	function add(){
		if(!empty($this->aclCat) && !$this->isAllowed($this->aclCat, 'manage')) return;
		acymailing_setVar('cid', array());
		acymailing_setVar('layout', 'form');
		return parent::display();
	}

	function apply(){
		$this->store();
		return $this->edit();
	}

	function save(){
		$this->store();
		return $this->listing();
	}

	function save2new(){
		$this->store();
		acymailing_setVar('cid', array());
		acymailing_setVar('layout', 'form');
		acymailing_setVar($this->pkey, '');
		return parent::display();
	}

	function saveorder(){
		if(!empty($this->aclCat) && !$this->isAllowed($this->aclCat, 'manage')) return;
		acymailing_checkToken();

		$orderClass = acymailing_get('helper.order');
		$orderClass->pkey = $this->pkey;
		$orderClass->table = $this->table;
		$orderClass->groupMap = $this->groupMap;
		$orderClass->groupVal = $this->groupVal;
		$orderClass->save();

		return $this->listing();
	}
}


class acymailingClass{

	var $tables = array();

	var $pkey = '';

	var $namekey = '';

	var $errors = array();

	function __construct($config = array()){
		global $acymailingCmsUserVars;
		$this->cmsUserVars = $acymailingCmsUserVars;
	}

	function save($element){
		$pkey = $this->pkey;
		if(empty($element->$pkey)){
			$status = acymailing_insertObject(acymailing_table(end($this->tables)), $element);
		}else{
			if(count((array)$element) > 1){
				$status = acymailing_updateObject(acymailing_table(end($this->tables)), $element, $pkey);
			}else{
				$status = true;
			}
		}
		if(!$status){
			$this->errors[] = substr(strip_tags(acymailing_getDBError()), 0, 200).'...';
		}

		if($status) return empty($element->$pkey) ? $status : $element->$pkey;
		return false;
	}

	function delete($elements){
		if(!is_array($elements)){
			$elements = array($elements);
		}

		if(empty($elements)) return 0;

		$column = is_numeric(reset($elements)) ? $this->pkey : $this->namekey;

		foreach($elements as $key => $val){
			$elements[$key] = acymailing_escapeDB($val);
		}

		if(empty($column) || empty($this->pkey) || empty($this->tables) || empty($elements)) return false;

		$whereIn = ' WHERE '.acymailing_secureField($column).' IN ('.implode(',', $elements).')';
		$result = true;

		acymailing_importPlugin('acymailing');

		$affected = 0;
		foreach($this->tables as $oneTable){
			acymailing_trigger('onAcyBefore'.ucfirst($oneTable).'Delete', array(&$elements));
			$query = 'DELETE FROM '.acymailing_table($oneTable).$whereIn;
			$affected = acymailing_query($query);
			$result = $affected !== false && $result;
		}


		if(!$result) return false;

		return $affected;
	}
}

acymailing_loadLanguage();

$config = acymailing_config();
if(!$config->get('ssl_links', 0)){
	define('ACYMAILING_LIVE', rtrim(str_replace('https:', 'http:', acymailing_rootURI()), '/').'/');
}else{
	define('ACYMAILING_LIVE', rtrim(str_replace('http:', 'https:', acymailing_rootURI()), '/').'/');
}

class acyEmoji
{
	public static function Encode($text){
		return self::convertEmoji($text, "ENCODE");
	}

	public static function Decode($text){
		return self::convertEmoji($text, "DECODE");
	}
	private static function convertEmoji($text,$op) {
		if(empty($text) || !file_exists(ACYMAILING_ROOT.'plugins'.DS.'acymailing'.DS.'emojis')) return $text;
		if($op=="ENCODE"){
			return preg_replace_callback('/([0-9|#][\x{20E3}])|[\x{00ae}|\x{00a9}|\x{203C}|\x{2047}|\x{2048}|\x{2049}|\x{3030}|\x{303D}|\x{2139}|\x{2122}|\x{3297}|\x{3299}][\x{FE00}-\x{FEFF}]?|[\x{2190}-\x{21FF}][\x{FE00}-\x{FEFF}]?|[\x{2300}-\x{23FF}][\x{FE00}-\x{FEFF}]?|[\x{2460}-\x{24FF}][\x{FE00}-\x{FEFF}]?|[\x{25A0}-\x{25FF}][\x{FE00}-\x{FEFF}]?|[\x{2600}-\x{27BF}][\x{FE00}-\x{FEFF}]?|[\x{2600}-\x{27BF}][\x{1F000}-\x{1FEFF}]?|[\x{2900}-\x{297F}][\x{FE00}-\x{FEFF}]?|[\x{2B00}-\x{2BF0}][\x{FE00}-\x{FEFF}]?|[\x{1F000}-\x{1F9FF}][\x{FE00}-\x{FEFF}]?|[\x{1F000}-\x{1F9FF}][\x{1F000}-\x{1FEFF}]?/u',array('self',"encodeEmoji"),$text);
		}else{
			return preg_replace_callback('/(\\\u[0-9a-f]{4})+/i', array('self', "decodeEmoji"), $text);
		}
	}

	private static function encodeEmoji($match){
		return str_replace(array('[', ']', '"'), '', json_encode($match));
	}

	private static function decodeEmoji($text){
		if(!$text) return '';
		$text = $text[0];
		$decode = json_decode($text, true);
		if($decode) return $decode;
		$text = '["'.$text.'"]';
		$decode = json_decode($text);
		if(count($decode) == 1){
			return $decode[0];
		}
		return $text;
	}
}

class acyPagination {
	var $total;
	var $start;
	var $value;

	public function __construct($total, $start, $value) {
		$this->total = $total;
		$this->start = $start;
		$this->value = $value;
	}

	function getListFooter(){
		$pagination = '<input type="hidden" name="limitstart" value="'.$this->start.'">';
		$nbPages = ceil($this->total / $this->value);
		if($nbPages < 2) return $pagination;

		$pagination .= '<ul class="acypagination">';
		$onclick = $this->start > 0 ? '" onclick="document.adminForm.limitstart.value=0; acymailing.submitform();"' : ' acypaginactive"';
		$pagination .= '<li><span class="acyicon-first'.$onclick.'></span></li>';
		$onclick = $this->start-$this->value >= 0 ? '" onclick="document.adminForm.limitstart.value='.($this->start-$this->value).'; acymailing.submitform();"' : ' acypaginactive"';
		$pagination .= '<li><span class="acyicon-backward'.$onclick.'></span></li>';

		acymailing_addScript(true, 'document.addEventListener("DOMContentLoaded", function(){
			document.getElementById("acypagination").addEventListener("keyup", function(e){
				var code = e.which;
				if(code == 13 || code == 188 || code == 186){
					if(this.value > '.$nbPages.') this.value = '.$nbPages.';
					var selectedPage = this.value-1;
					document.adminForm.limitstart.value = selectedPage*'.$this->value.';
					acymailing.submitform();
				}
			});
		});');
		$input = '<input id="acypagination" type="text" value="'.($this->start/$this->value+1).'" onkeyup="" />';

		$pagination .= '<li class="selectedPage">'.acymailing_translation_sprintf('ACY_PAGINATION_PAGE', $input, $nbPages).'</li>';

		$lastPage = floor(($this->total-1)/$this->value)*$this->value;

		$onclick = $this->start < $lastPage ? '" onclick="document.adminForm.limitstart.value='.($this->start+$this->value).'; acymailing.submitform();"' : ' acypaginactive"';
		$pagination .= '<li><span class="acyicon-forward'.$onclick.'></span></li>';
		$onclick = $this->start < $lastPage ? '" onclick="document.adminForm.limitstart.value='.$lastPage.'; acymailing.submitform();"' : ' acypaginactive"';
		$pagination .= '<li><span class="acyicon-last'.$onclick.'></span></li></ul>';
		return $pagination;
	}

	function getResultsCounter(){
		if(empty($this->total)) return '<div class="acypagination_counter">'.acymailing_translation('ACY_PAGINATION_NONE').'</div>';
		$from = $this->start+1;
		$to = $this->start+$this->value;
		if($to > $this->total) $to = $this->total;

		$paginationNb = array();
		$paginationNb[] = acymailing_selectOption(5,5);
		$paginationNb[] = acymailing_selectOption(10,10);
		$paginationNb[] = acymailing_selectOption(15,15);
		$paginationNb[] = acymailing_selectOption(20,20);
		$paginationNb[] = acymailing_selectOption(25,25);
		$paginationNb[] = acymailing_selectOption(30,30);
		$paginationNb[] = acymailing_selectOption(50,50);
		$paginationNb[] = acymailing_selectOption(100,100);

		$result = '<div class="acypagination_counter">'.acymailing_translation('DISPLAY').' # ';
		$onChange = 'if(document.adminForm.limitstart){ document.adminForm.limitstart.value = 0;} document.getElementById(\'adminForm\').submit();';
		$result .= acymailing_select($paginationNb, 'limit' , 'size="1" style="width:60px" onchange="'.$onChange.'"', 'value', 'text', $this->value).'<br />';
		return $result.acymailing_translation_sprintf('ACY_PAGINATION', $from, $to, $this->total).'</div>';
	}

	function getRowOffset($i){
		return $this->start + 1 + $i;
	}
}

class acyParameter {
	function __construct($params = null){
		if(is_string($params)) {
			if (ACYMAILING_J16) {
				$this->params = json_decode($params);
			} else {
				$params = explode("\n", $params);
				foreach ($params as $oneParam) {
					if (empty($oneParam)) continue;
					list($key, $val) = explode('=', $oneParam, 2);
					$this->params->$key = $val;
				}
			}
		}elseif(is_object($params)){
			$this->paramObject = $params;
		}elseif(is_array($params)){
			$this->params = (object) $params;
		}
	}

	function get($path, $default = null){
		if(empty($this->paramObject)) {
			if (empty($this->params->$path)) return $default;
			return $this->params->$path;
		}else{
			$value = $this->paramObject->get($path, 'noval');
			if($value === 'noval') $value = $this->paramObject->get('data.'.$path, $default);
			return $value;
		}
	}
}
components/com_acymailing/helpers/acysliders.php000060400000006130152453623450016226 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.7.0
 * @author	acyba.com
 * @copyright	(C) 2009-2017 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */
defined('_JEXEC') or die('Restricted access');
?><?php
class acyslidersHelper {
	var $ctrl = 'sliders';
	var $tabs = null;
	var $openPanel = false;
	var $mode = null;
	var $count = 0;
	var $name = '';
	var $options = null;

	function __construct() {
		if(!ACYMAILING_J16) {
			$this->mode = 'pane';
		} elseif(!ACYMAILING_J30) {
			$this->mode = 'sliders';
		} else {
			$this->mode = 'bootstrap';
		}
	}

	function startPane($name) { return $this->start($name); }
	function startPanel($text, $id) { return $this->panel($text, $id); }
	function endPanel() { return ''; }
	function endPane() { return $this->end(); }

	function setOptions($options = array()) {
		if($this->options == null)
			$this->options = $options;
		else
			$this->options = array_merge($this->options, $options);
	}

	function start($name, $options = array()) {
		$ret = '';
		if($this->mode == 'pane') {
			jimport('joomla.html.pane');
			if(!empty($this->options))
				$options = array_merge($options, $this->options);
			$this->tabs = JPane::getInstance('sliders', $options);
			$ret .= $this->tabs->startPane($name);
		} elseif($this->mode == 'sliders') {
			if(!empty($this->options))
				$options = array_merge($options, $this->options);
			$ret .= JHtml::_('sliders.start', $name, $options);
		} else {
			if($this->options == null)
				$this->options = $options;
			else
				$this->options = array_merge($this->options, $options);
			$this->name = $name;
			$this->count = 0;
			$ret .= '<div class="accordion" id="'.$name.'">';
		}
		return $ret;
	}

	function panel($text, $id) {
		$ret = '';
		if($this->mode == 'pane') {
			if($this->openPanel)
				$ret .= $this->tabs->endPanel();
			$ret .= $this->tabs->startPanel($text, $id);
			$this->openPanel = true;
		} elseif($this->mode == 'sliders') {
			$ret .= JHtml::_('sliders.panel', acymailing_translation($text), $id);
		} else {
			if($this->openPanel)
				$ret .= $this->_closePanel();

			$open = '';
			if((isset($this->options['startOffset']) && $this->options['startOffset'] == $this->count) || $this->count == 0)
				$open = ' in';
			$this->count++;
			$ret .= '
<div class="accordion-group">
    <div class="accordion-heading">
      <a class="accordion-toggle" data-toggle="collapse" data-parent="#'.$this->name.'" href="#'.$id.'">
        '.$text.'
      </a>
    </div>
    <div id="'.$id.'" class="accordion-body collapse'.$open.'">
      <div class="accordion-inner">
';
			$this->openPanel = true;
		}
		return $ret;
	}

	function _closePanel() {
		if(!$this->openPanel)
			return '';
		$this->openPanel = false;
		return '</div></div></div>';
	}

	function end() {
		$ret = '';
		if($this->mode == 'pane') {
			if($this->openPanel)
				$ret .= $this->tabs->endPanel();
			$ret .= $this->tabs->endPane();
		} elseif($this->mode == 'sliders') {
			$ret .= JHtml::_('sliders.end');
		} else {
			if($this->openPanel)
				$ret .= $this->_closePanel();
			$ret .= '</div>';
		}
		return $ret;
	}
}
components/com_acymailing/helpers/export.php000060400000002616152453623450015412 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class acyexportHelper{

	function addHeaders($fileName = 'export'){
		$fileName = substr(preg_replace('#[^a-z0-9_-]#i','_',$fileName),0,50);
 		@ob_clean();

		header("Pragma: public");
		header("Expires: 0"); // set expiration time
		header("Cache-Control: must-revalidate, post-check=0, pre-check=0");

		header("Content-Type: application/force-download");
		header("Content-Type: application/octet-stream");
		header("Content-Type: application/download");

		header("Content-Disposition: attachment; filename=".$fileName.".csv");

		header("Content-Transfer-Encoding: binary");
	}

	function exportOneData(&$exportdata,$fileName='export'){

		$config = acymailing_config();
		$encodingClass = acymailing_get('helper.encoding');

		$this->addHeaders($fileName);

		$eol= "\r\n";
		$before = '"';
		$separator = '"'.str_replace(array('semicolon','comma'),array(';',','), $config->get('export_separator',';')).'"';
		$exportFormat = $config->get('export_format','UTF-8');
		$after = '"';

		foreach($exportdata as $name => $total ){
			echo $before.$encodingClass->change($name.$separator.$total,'UTF-8',$exportFormat).$after.$eol;
		}

		exit;
	}
}
components/com_acymailing/helpers/toolbar.php000060400000016424152453623450015535 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class acytoolbarHelper{
	var $buttons = array();
	var $buttonOptions = array();
	var $title = '';
	var $titleLink = '';

	var $topfixed = true;

	var $htmlclass = '';

	function setTitle($name, $link = ''){
		$this->title = $name;
		$this->titleLink = $link;
		acymailing_setPageTitle($name);
	}

	function custom($task, $text, $class, $listSelect = true, $onClick = '', $title = ''){

		$submit = "acymailing.submitbutton('".$task."')";
		$js = !empty($listSelect) ? "if(document.adminForm.boxchecked.value==0){alert('".str_replace(array("'", '"'), array("\'", '\"'), acymailing_translation('ACY_SELECT_ELEMENT'))."');return false;}else{".$submit."}" : $submit;

		$onClick = !empty($onClick) ? $onClick : $js;
		if(empty($title)) $title = $text;

		$button = '<button id="toolbar-'.$class.'" onclick="'.$onClick.'" class="acytoolbar_'.$class.'" title="'.$title.'"><i class="acyicon-'.$class.'"></i><span>'.$text.'</span></button>';
		if(empty($this->buttonOptions)){
			$this->buttons[] = $button;
			return;
		}

		$dropdownOptions = '<ul class="buttonOptions" style="margin: 0px; text-align: left;">';
		foreach($this->buttonOptions as $oneOption){
			$dropdownOptions .= '<li>'.$oneOption.'</li>';
		}
		$dropdownOptions .= '</ul>';

		$buttonArea = $button;


		$this->buttons[] = '<div style="display:inline;" class="subbuttonactions">'.$buttonArea.'<span class="acytoolbar_hover acybuttongroup_'.$class.'"><span style="vertical-align: top; display:inline-block; padding-top:10px;" class="acyicon-down"></span><span class="acytoolbar_hover_display">'.$dropdownOptions.'</span></span></div>';

		$this->buttonOptions = array();
	}

	function display(){
		acymailing_addScript(false, ACYMAILING_JS.'acytoolbar.js?v='.filemtime(ACYMAILING_MEDIA.'js'.DS.'acytoolbar.js'));
		acymailing_addStyle(true, '#system-message-container, #system-message{display:none;}');
		
		$classCtrl = acymailing_getVar('cmd', 'ctrl', '');
		echo '<div id="acymenu_top" class="acytoolbarmenu donotprint '.(empty($this->topfixed) ? '' : 'acyaffix-top ').(!empty($classCtrl) ? 'acytopmenu_'.$classCtrl.' ' : '').$this->htmlclass.'" >';
		echo '<table cellspacing="0" border="0" cellpadding="0" style="width: 100%;height: 40px;">
				<colgroup>
					<col width="100%" />
					<col width="0%" />
				</colgroup>
				<tr><td class="acytoolbartitle">';
		if(!empty($this->title)){
			$title = htmlspecialchars($this->title, ENT_COMPAT, 'UTF-8');
			if(!empty($this->titleLink)) $title = '<a style="color:white;" href="'.acymailing_completeLink($this->titleLink).'">'.$title.'</a>';
			echo $title;
		}
		echo '</td><td style="white-space: nowrap;" class="acytoolbarmenu_menu">';
		echo implode(' ', $this->buttons);
		echo '</td></tr></table></div>';

		acymailing_displayMessages();  
		if(!empty($this->topfixed)) acymailing_navigationTabs();
	}

	function add(){
		$this->custom('add', acymailing_translation('ACY_NEW'), 'new', false);
	}

	function edit(){
		$this->custom('edit', acymailing_translation('ACY_EDIT'), 'edit', true);
	}

	function delete(){
		$onClick = 'if(document.adminForm.boxchecked.value==0){
						alert(\''.str_replace("'", "\\'", acymailing_translation('ACY_SELECT_ELEMENT')).'\');
					}else{
						if(confirm(\''.str_replace("'", "\\'", acymailing_translation('ACY_VALIDDELETEITEMS', true)).'\')){
							acymailing.submitbutton(\'remove\');
						}
					}';
		$this->custom('remove', acymailing_translation('ACY_DELETE'), 'delete', true, $onClick);
	}

	function copy(){
		$this->custom('copy', acymailing_translation('ACY_COPY'), 'copy', true);
	}

	function link($link, $text, $class){
		$onClick = "location.href='".$link."';return false;";
		$this->custom('link', $text, $class, false, $onClick);
	}

	function help($helpname, $anchor = ''){
		$config = acymailing_config();
		$level = $config->get('level');

		$url = ACYMAILING_HELPURL.$helpname.'&level='.$level.(!empty($anchor) ? '#'.$anchor : '');
		$iFrame = "'<iframe frameborder=\"0\" src=\'$url\' width=\'100%\' height=\'100%\' scrolling=\'auto\'></iframe>'";

		$js = "var openHelp = true;
				function displayDoc(){
					var box=document.getElementById('iframedoc');
					if(openHelp){
						box.innerHTML = ".$iFrame.";
						box.className = 'slide_open';
					}else{
						box.className = 'slide_close';
					}
					openHelp = !openHelp;
				}";
		acymailing_addScript(true, $js);

		$onClick = 'displayDoc();return false;';

		$this->custom('help', acymailing_translation('ACY_HELP'), 'help', false, $onClick);
	}

	function divider(){
		$this->buttons[] = '<span class="acytoolbar_divider"></span>';
	}

	function cancel(){
		$this->custom('cancel', acymailing_translation('ACY_CANCEL'), 'cancel', false);
	}

	function save(){
		$this->custom('save', acymailing_translation('ACY_SAVE'), 'save', false);
	}

	function apply(){
		$this->custom('apply', acymailing_translation('ACY_APPLY'), 'apply', false);
	}

	function popup($name = '', $text = '', $url = '', $width = 0, $height = 480){
		$this->buttons[] = $this->_popup($name, $text, $url, $width, $height);
	}

	function directPrint(){
		$this->buttons[] = $this->_directPrint();
	}

	private function _popup($name = '', $text = '', $url = '', $width = 0, $height = 480){
		$ids = '';
		if(in_array($name, array('ABtesting', 'action'))){
			$js = "
			function getAcyPopupUrl(){
				i = 0;
				ids = '';
				while(window.document.getElementById('cb'+i)){
					if(window.document.getElementById('cb'+i).checked) ids += window.document.getElementById('cb'+i).value+',';
					i++;
				}
				return ids.slice(0,-1);
			}";
			acymailing_addScript(true, $js);

			if($name == 'ABtesting'){
				$ids = '&mailid=';
			}elseif($name == 'action'){
				$ids = '&subid=';
			}

			$ids .= "'+getAcyPopupUrl()+'";
		}

		return acymailing_popup($url.$ids, '<button id="toolbar-'.$name.'" class="acytoolbar_'.$name.'" title="'.$text.'"><i class="acyicon-'.$name.'"></i><span>'.$text.'</span></button>', '', $width, $height, 'a_'.$name);
	}

	private function _directPrint(){

		acymailing_addStyle(false, ACYMAILING_CSS.'acyprint.css?v='.filemtime(ACYMAILING_MEDIA.'css'.DS.'acyprint.css'), 'text/css', 'print');

		$function = "if(document.getElementById('iframepreview')){document.getElementById('iframepreview').contentWindow.focus();document.getElementById('iframepreview').contentWindow.print();}else{window.print();}return false;";

		return '<button class="acytoolbar_print" onclick="'.$function.'" title="'.acymailing_translation('ACY_PRINT', true).'"><i class="acyicon-print"></i><span>'.acymailing_translation('ACY_PRINT', true).'</span></button>';
	}

	function addButtonOption($task, $text, $class, $listSelect, $onClick = ''){

		$submit = "acymailing.submitbutton('".$task."')";
		$js = !empty($listSelect) ? "if(document.adminForm.boxchecked.value==0){alert('".str_replace(array("'", '"'), array("\'", '\"'), acymailing_translation('ACY_SELECT_ELEMENT'))."');return false;}else{".$submit."}" : $submit;

		$onClick = !empty($onClick) ? $onClick : $js;

		$this->buttonOptions[] = '<button onclick="'.$onClick.'" class="acytoolbar_'.$class.'" title="'.$text.'"><span class="acyicon-'.$class.'"></span><span>'.$text.'</span></button>';
	}
}
components/com_acymailing/helpers/list.php000060400000005510152453623450015040 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class acylistHelper{

	var $sendNotif = true;
	var $sendConf = true;
	var $forceConf = false;
	var $survey = '';
	var $campaigndelay = 0;
	var $skipedfollowups = 0;

	function subscribe($subid,$listids){


		acymailing_importPlugin('acymailing');
		$resultsTrigger = acymailing_trigger('onAcySubscribe', array($subid, $listids));

	}//endfct

	function unsubscribe($subid,$listids){

		if(acymailing_level(3)){
			$campaignClass = acymailing_get('helper.campaign');
			$campaignClass->stop($subid,$listids);
		}

		$config = acymailing_config();
		static $alreadySent = false;
		if($this->sendNotif AND !$alreadySent AND $config->get('notification_unsub') AND !acymailing_isAdmin()){
			$alreadySent = true;
			$mailer = acymailing_get('helper.mailer');
			$mailer->report = false;
			$mailer->autoAddUser = true;
			$mailer->checkConfirmField = false;
			$userClass = acymailing_get('class.subscriber');
			$subscriber = $userClass->get($subid);
			$ipClass = acymailing_get('helper.user');
			$mailer->addParam('survey',$this->survey);
			$listSubClass= acymailing_get('class.listsub');
			$mailer->addParam('user:subscription',$listSubClass->getSubscriptionString($subscriber->subid));
			$mailer->addParam('user:subscriptiondates',$listSubClass->getSubscriptionString($subscriber->subid, true));
			$mailer->addParamInfo();
			$subscriber->ip = $ipClass->getIP();
			foreach($subscriber as $fieldname => $value) $mailer->addParam('user:'.$fieldname,$value);
			$allUsers = explode(',',$config->get('notification_unsub'));
			foreach($allUsers as $oneUser){
				$mailer->sendOne('notification_unsub',$oneUser);
			}
		}

		if($this->forceConf || ($this->sendConf AND !acymailing_isAdmin())){
			$messages = acymailing_loadResultArray('SELECT DISTINCT `unsubmailid` FROM '.acymailing_table('list').' WHERE `listid` IN ('.implode(',',$listids).') AND `published` = 1  AND `unsubmailid` > 0');

			if(!empty($messages)){
				$config = acymailing_config();
				$mailHelper = acymailing_get('helper.mailer');
				$mailHelper->report = $config->get('unsub_message',true);
				$mailHelper->checkAccept = false;
				foreach($messages as $mailid){
					$mailHelper->trackEmail = true;
					$mailHelper->sendOne($mailid,$subid);
				}
			}
		}//end only frontend

		acymailing_query('DELETE  FROM '.acymailing_table('queue').' WHERE `subid` = '.(int) $subid.' AND `mailid` IN (SELECT `mailid` FROM '.acymailing_table('listmail').' WHERE `listid` IN ('.implode(',',$listids).'))');

		acymailing_importPlugin('acymailing');
		$resultsTrigger = acymailing_trigger('onAcyUnsubscribe', array($subid, $listids));
	}
}//endclass
components/com_acymailing/helpers/acypopup.php000060400000003116152453623450015725 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class acypopupHelper{

	function display($text, $title, $url, $id, $width, $height, $attr = '', $icon = '', $type = 'button', $dynamicUrl = false){
		static $loaded = false;

		if(!$loaded) {
			acymailing_addScript(false, ACYMAILING_JS . 'acymailing.js?v=' . filemtime(ACYMAILING_MEDIA . 'js' . DS . 'acymailing.js'));
			acymailing_addStyle(false, ACYMAILING_CSS . 'acypopup.css?v=' . filemtime(ACYMAILING_MEDIA . 'css' . DS . 'acypopup.css'));
			$loaded = true;
		}
		
		$params = ' id="'.$id.'" onclick="window.acymailing.openpopup(\''.$url.'\', '.intval($width).', '.intval($height).'); return false;"';
		if($type == 'button'){
			$html = '<button '.$this->getAttr($attr, 'btn btn-small').$params.'>';
		}else{
			$html = '<a '.$attr.' href="#"'.$params.'>';
		}

		if(!empty($icon)){
			$html .= '<i class="icon-16-'.$icon.'"></i> ';
		}
		$html .= $text.(($type == 'button') ? '</button>' : '</a>');

		return $html;
	}

	function getAttr($attr, $class){
		if(empty($attr)){
			return 'class="'.$class.'"';
		}
		$attr = ' '.$attr;
		if(strpos($attr, ' class="') !== false){
			$attr = str_replace(' class="', ' class="'.$class.' ', $attr);
		}elseif(strpos($attr, ' class=\'') !== false){
			$attr = str_replace(' class=\'', ' class=\''.$class.' ', $attr);
		}else{
			$attr .= ' class="'.$class.'"';
		}
		return trim($attr);
	}
}
components/com_acymailing/helpers/acytabs.php000060400000006123152453623450015514 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class acytabsHelper{
	var $openPanel = false;
	var $data = array();
	var $name = '';

	function __construct(){
	}

	function startPane($name){
		$this->name = $name;
	}

	function startPanel($text, $id){
		if($this->openPanel) $this->endPanel();

		$obj = new stdClass();
		$obj->text = $text;
		$obj->id = $id;
		$obj->data = '';
		$this->data[] = $obj;
		ob_start();
		$this->openPanel = true;
	}

	function endPanel(){
		if(!$this->openPanel) return;

		$panel = end($this->data);
		$panel->data .= ob_get_clean();
		$this->openPanel = false;
	}

	function endPane(){
		$ret = '';
		$content = '';

		if($this->openPanel) $this->endPanel();

		$ret .= '<div style="margin-left:10px;" class="acytabsystem"><ul class="nav nav-tabs" id="'.$this->name.'" style="width:100%;">'."\r\n";
		foreach($this->data as $k => $data){
			$ret .= '	<li'.($k == 0 ? ' class="active"' : '').' id="'.$data->id.'_tabli"><a href="#'.$data->id.'" id="'.$data->id.'_tablink" onclick="toggleTab(\''.$this->name.'\', \''.$data->id.'\');return false;">'.acymailing_translation($data->text).'</a></li>'."\r\n";

			$content .= '	<div class="tab-pane'.($k == 0 ? ' active' : '').'" id="'.$data->id.'">'."\r\n".$data->data."\r\n".'	</div>'."\r\n";
			unset($data->data);
		}
		$ret .= '</ul>'."\r\n".'<div class="tab-content" id="'.$this->name.'_content">'."\r\n";
		$ret .= $content.'</div></div>';
		unset($this->data);

		static $jsInit = false;
		if(!$jsInit){
			$jsInit = true;
			$js = '
			
			document.addEventListener("DOMContentLoaded", function(){
				var selectedTab = localStorage.getItem("acy'.$this->name.'");
				if(selectedTab && document.getElementById(selectedTab)){
					var selectedLi = document.getElementById("'.$this->name.'").querySelector("li.active");
					var selectedContent = document.getElementById("'.$this->name.'_content").querySelector("div.tab-pane.active");
					selectedLi.className = selectedLi.className.replace("active", "");
					selectedContent.className = selectedContent.className.replace("active", "");
					
					document.getElementById(selectedTab+"_tabli").className += " active";
					document.getElementById(selectedTab).className += " active";
				}
			});
				
			function toggleTab(group, id){
				localStorage.setItem("acy"+group, id);
			
				var contentTabs = document.querySelectorAll("#"+group+"_content > div");
				for (i = 0; i < contentTabs.length; i++) {
					contentTabs[i].className = contentTabs[i].className.replace("active", "");
				}
				document.getElementById(id).className += " active";
				var groupTabs = document.querySelectorAll("#"+group+" > li");
				for (i = 0; i < groupTabs.length; i++) {
					groupTabs[i].className = groupTabs[i].className.replace("active", "");
				}
				document.getElementById(id+"_tablink").parentElement.className += " active";
				
			}';
			acymailing_addScript(true, $js);
		}

		return $ret;
	}
}
components/com_acymailing/helpers/acymenu.php000060400000032524152453623450015533 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class acymenuHelper{
	function display($selected = ''){

		if(!ACYMAILING_J16){
			acymailing_addStyle(true, " #submenu-box{display:none !important;} ");
		}

		$js = "function acyToggleClass(id,myclass){
			elem = document.getElementById(id);
			if(elem.className.search(myclass) < 0){

				var elements = document.querySelectorAll('.mainelement');

				for(var i = 0; i < elements.length;i++){
					elements[i].className = elements[i].className.replace('opened','');
				}
				elem.className += ' '+myclass;
				if(myclass == 'iconsonly') sessionStorage.setItem('acyclosedmenu', '1');
			}else{
				elem.className = elem.className.replace(' '+myclass,'');
				if(myclass == 'iconsonly') sessionStorage.setItem('acyclosedmenu', '0');
			}
		}

		document.addEventListener(\"DOMContentLoaded\", function(){
			var isClosed = sessionStorage.getItem('acyclosedmenu');
			if(isClosed == 1) acyToggleClass('acyallcontent', 'iconsonly');
			setTimeout(function () {
				document.getElementById('acymainarea').style.transition = 'margin 0.4s cubic-bezier(0.00, 0.00, 1, 1.00)';
				document.getElementById('acymenu_leftside').style.transition = 'width 0.4s cubic-bezier(0.00, 0.00, 1, 1.00)';
			}, 1000);
		});

		function acyAddClass(id,myclass){
			elem = document.getElementById(id);
			if(elem.className.search(myclass)>=0) return;
			elem.className += ' '+myclass;
		}

		function acyRemoveClass(id,myclass){
			elem = document.getElementById(id);
			elem.className = elem.className.replace(' '+myclass,'');
		}
		
		function onButtonNewVersionPlugin(){
			localStorage.setItem('acyconfig_tab', 'config_plugins');
		}
		
		";

		if(acymailing_isAdmin()){
			acymailing_addScript(false, ACYMAILING_JS.'acytoolbar.js?v='.filemtime(ACYMAILING_MEDIA.'js'.DS.'acytoolbar.js'));
		}

		acymailing_addScript(true, $js);
		$selected = substr($selected, 0, 5);
		if($selected == 'data' || $selected == 'data&' || $selected == 'filte') $selected = 'subsc';
		if($selected == 'list' || $selected == 'actio') $selected = 'list';
		if($selected == 'campa' || $selected == 'templ' || $selected == 'auton' || $selected == 'notif' || $selected == 'simpl') $selected = 'newsl';
		if($selected == 'diagr') $selected = 'stats';
		if($selected == 'cpane' || $selected == 'field' || $selected == 'bounc') $selected = 'cpane';

		$config = acymailing_config();
		$mainmenu = array();
		$submenu = array();

		if(acymailing_isAllowed($config->get('acl_cpanel_manage', 'all'))){
			$mainmenu['dashboard'] = array(acymailing_translation('ACY_CPANEL'), acymailing_completeLink('dashboard'), 'acyicon-dashboard');
		}

		if(acymailing_isAllowed($config->get('acl_subscriber_manage', 'all'))){
			$mainmenu['subscriber'] = array(acymailing_translation('USERS'), acymailing_completeLink('subscriber'), 'acyicon-user');
			$submenu['subscriber'] = array();
			$submenu['subscriber'][] = array(acymailing_translation('USERS'), acymailing_completeLink('subscriber'), 'acyicon-user');
			if(acymailing_isAllowed($config->get('acl_subscriber_import', 'all'))) $submenu['subscriber'][] = array(acymailing_translation('IMPORT'), acymailing_completeLink('data&task=import'), 'acyicon-import');
			if(acymailing_isAllowed($config->get('acl_subscriber_export', 'all'))) $submenu['subscriber'][] = array(acymailing_translation('ACY_EXPORT'), acymailing_completeLink('data&task=export'), 'acyicon-export');
			if(acymailing_isAllowed($config->get('acl_lists_filter', 'all'))) $submenu['subscriber'][] = array(acymailing_translation('ACY_MASS_ACTIONS'), acymailing_completeLink('filter'), 'acyicon-filter');
		}

		if(acymailing_isAllowed($config->get('acl_lists_manage', 'all'))){
			$mainmenu['list'] = array(acymailing_translation('LISTS'), acymailing_completeLink('list'), 'acyicon-list');
			$submenu['list'] = array();
			$submenu['list'][] = array(acymailing_translation('LISTS'), acymailing_completeLink('list'), 'acyicon-list');
			if(acymailing_isAllowed($config->get('acl_distribution_manage', 'all'))){
				$submenu['list'][] = array(acymailing_translation('ACY_DISTRIBUTION'), acymailing_completeLink('action'), 'acyicon-distribution');
			}
		}

		if(acymailing_isAllowed($config->get('acl_newsletters_manage', 'all'))){
			$mainmenu['newsletter'] = array(acymailing_translation('NEWSLETTERS'), acymailing_completeLink('newsletter'), 'acyicon-newsletter');
			$submenu['newsletter'] = array();
			$submenu['newsletter'][] = array(acymailing_translation('NEWSLETTERS'), acymailing_completeLink('newsletter'), 'acyicon-newsletter');
			if(acymailing_level(2) && acymailing_isAllowed($config->get('acl_autonewsletters_manage', 'all'))){
				$submenu['newsletter'][] = array(acymailing_translation('AUTONEWSLETTERS'), acymailing_completeLink('autonews'), 'acyicon-autonewsletter');
			}
			if(acymailing_level(3) && acymailing_isAllowed($config->get('acl_campaign_manage', 'all'))){
				$submenu['newsletter'][] = array(acymailing_translation('CAMPAIGN'), acymailing_completeLink('campaign'), 'acyicon-campaign');
			}
			if(acymailing_level(1) && acymailing_isAllowed($config->get('acl_configuration_manage', 'all')) && (!ACYMAILING_J16 || acymailing_authorised('core.admin', 'com_acymailing'))){
				$submenu['newsletter'][] = array(acymailing_translation('JOOMLA_NOTIFICATIONS'), acymailing_completeLink('notification'), 'acyicon-joomla');
			}
			if(acymailing_level(3) && acymailing_isAllowed($config->get('acl_simple_sending_manage', 'all'))){
				$submenu['newsletter'][] = array(acymailing_translation('SIMPLE_SENDING'), acymailing_completeLink('simplemail&task=edit'), 'acyicon-send');
			}


			if(acymailing_isAllowed($config->get('acl_templates_manage', 'all'))) $submenu['newsletter'][] = array(acymailing_translation('ACY_TEMPLATES'), acymailing_completeLink('template'), 'acyicon-template');
		}

		if(acymailing_isAllowed($config->get('acl_queue_manage', 'all'))) $mainmenu['queue'] = array(acymailing_translation('QUEUE'), acymailing_completeLink('queue'), 'acyicon-queue');

		if(acymailing_isAllowed($config->get('acl_statistics_manage', 'all'))){
			$mainmenu['stats'] = array(acymailing_translation('STATISTICS'), acymailing_completeLink('stats'), 'acyicon-statistic');
			$submenu['stats'] = array();
			$submenu['stats'][] = array(acymailing_translation('STATISTICS'), acymailing_completeLink('stats'), 'acyicon-statistic');
			$submenu['stats'][] = array(acymailing_translation('DETAILED_STATISTICS'), acymailing_completeLink('stats&task=detaillisting'), 'acyicon-detailed-stat');
			if(acymailing_level(1)) $submenu['stats'][] = array(acymailing_translation('CLICK_STATISTICS'), acymailing_completeLink('statsurl'), 'acyicon-click');
			if(acymailing_level(1)) $submenu['stats'][] = array(acymailing_translation('CHARTS'), acymailing_completeLink('diagram'), 'acyicon-chart');
		}
		if(acymailing_isAllowed($config->get('acl_configuration_manage', 'all')) && (!ACYMAILING_J16 || acymailing_authorised('core.admin', 'com_acymailing'))){
			$mainmenu['cpanel'] = array(acymailing_translation('ACY_CONFIGURATION'), acymailing_completeLink('cpanel'), 'acyicon-configuration');
			$submenu['cpanel'] = array();
			$submenu['cpanel'][] = array(acymailing_translation('ACY_CONFIGURATION'), acymailing_completeLink('cpanel'), 'acyicon-configuration');
			$submenu['cpanel'][] = array(acymailing_translation('EXTRA_FIELDS'), acymailing_completeLink('fields'), 'acyicon-custom-field');
			$submenu['cpanel'][] = array(acymailing_translation('BOUNCE_HANDLING'), acymailing_completeLink('bounces'), 'acyicon-bounce');
		}
		
		acymailing_addStyle(false, ACYMAILING_CSS.'acymenu.css?v='.filemtime(ACYMAILING_MEDIA.'css'.DS.'acymenu.css'));

		$acysmsLink = '';
		if(acymailing_isAllowed($config->get('acl_configuration_manage', 'all'))) $acysmsLink = '<a class="sendother" href="index.php?option=com_acymailing&ctrl=update&task=acysms">'.acymailing_translation('ACY_SMS').'&nbsp;&nbsp;<i class="acyicon-message"></i></a>';

		$menu = '<div id="acymenu_leftside" class="donotprint acyaffix-top">';
		$menu .= '<div class="acymenu_slide"><span>'.$acysmsLink.'<i class="acyicon-open-close" onclick="acyToggleClass(\'acyallcontent\',\'iconsonly\');"></i></span></div>';
		$menu .= '<div class="acymenu_mainmenus">';
		$menu .= '<ul>';
		foreach($mainmenu as $id => $oneMenu){
			$sel = '';
			if($selected == substr($id, 0, 5)) $sel = ' sel opened';
			$menu .= '<li class="mainelement'.$sel.'" id="mainelement'.$id.'"><span onclick="acyToggleClass(\'mainelement'.$id.'\',\'opened\');"><a '.(!empty($submenu[$id]) ? 'href="#" onclick="return false;"' : 'href="'.$oneMenu[1].'"').' ><i class="'.$oneMenu[2].'"></i><span class="subtitle">'.$oneMenu[0].'</span>'.(!empty($submenu[$id]) ? '<i class="acyicon-down"></i>' : '').'</a></span>';
			if(!empty($submenu[$id])){
				$menu .= '<ul>';
				foreach($submenu[$id] as $subelement){
					$menu .= '<li class="acysubmenu" ><a class="acysubmenulink" href="'.$subelement[1].'" title="'.$subelement[0].'"><i class="'.$subelement[2].'"></i><span>'.$subelement[0].'</span></a></li>';
				}
				$menu .= '</ul>';
			}
			$menu .= '</li>';
		}
		$menu .= '<li class="mainelement" id="mainelementmyacymailing">';
		$menu .= '<div id="myacymailingarea" class="myacymailingarea">'; //DO NOT CHANGE THIS ID! we use it for ajax things...
		$menu .= $this->myacymailingarea();
		$menu .= '</div>'; //End of acymailing myacymailingarea

		$menu .= '</li>';
		$menu .= '</ul>';
		$menu .= '</div>'; //end of acymenu_mainmenus
		$menu .= '</div>'; //end of acymenu_leftside

		return $menu;
	}

	public function myacymailingarea(){
		$config = acymailing_config();
		if(!acymailing_isAllowed($config->get('acl_configuration_manage', 'all'))){
			return '';
		}
		$this->_addAjaxScript();


		$menu = '<div id="myacymailing_level">'.ACYMAILING_NAME.' '.$config->get('level').' : '.$config->get('version').'</div><div id="myacymailing_version">';

		$currentVersion = $config->get('version', '');
		$latestVersion = $config->get('latestversion', '');
		$versionPlugin = $config->get('pluginNeedUpdate', '');

		if(($currentVersion >= $latestVersion) && empty($versionPlugin)){
			$menu .= '<div class="acyversion_uptodate myacymailingbuttons">'.acymailing_translation('ACY_LATEST_VERSION_OK').'</div>';
		}elseif(!empty($versionPlugin) && $currentVersion >= $latestVersion){ // If there is a new plugin version
			$menu .= '<div class="acyversion_needtoupdate myacymailingbuttons"><a onclick="onButtonNewVersionPlugin()" class="acy_updateversion" href="'.acymailing_completeLink('cpanel#config_plugins').'" ><i class="acyicon-import"></i>'.acymailing_translation('ACY_PLUGIN_NEED_UPDATE').'</a></div>';
		}elseif(!empty($latestVersion)){
			$menu .= '<div class="acyversion_needtoupdate myacymailingbuttons"><a class="acy_updateversion" href="'.ACYMAILING_REDIRECT.'update-acymailing-'.$config->get('level').'" target="_blank"><i class="acyicon-import"></i>'.acymailing_translation_sprintf('ACY_UPDATE_NOW', $latestVersion).'</a></div>';
		}

		$menu .= '</div>';

		if(acymailing_level(1)){
			$expirationDate = $config->get('expirationdate', '');

			if(empty($expirationDate) || $expirationDate == -1){
				$menu .= '<div id="myacymailing_expiration"></div>';
			}elseif($expirationDate == -2){
				$menu .= '<div id="myacymailing_expiration"><div class="acylicence_expired"><span style="color:#c2d5f3; line-height: 16px;">'.acymailing_translation('ACY_ATTACH_LICENCE').' :</span><div><a class="acy_attachlicence myacymailingbuttons" href="'.ACYMAILING_REDIRECT.'acymailing-assign" target="_blank"><i class="acyicon-attach"></i>'.acymailing_translation('ACY_ATTACH_LICENCE_BUTTON').'</a></div></div></div>';
			}elseif($expirationDate < time()){
				$menu .= '<div id="myacymailing_expiration"><div class="acylicence_expired"><span class="acylicenceinfo">'.acymailing_translation('ACY_SUBSCRIPTION_EXPIRED').'</span><a class="acy_subscriptionexpired myacymailingbuttons" href="'.ACYMAILING_REDIRECT.'renew-acymailing-'.$config->get('level').'" target="_blank"><i class="acyicon-renew"></i>'.acymailing_translation('ACY_SUBSCRIPTION_EXPIRED_LINK').'</a></div></div>';
			}else{
				$menu .= '<div id="myacymailing_expiration"><div class="acylicence_valid myacymailingbuttons"><span class="acy_subscriptionok">'.acymailing_translation('ACY_VALID_UNTIL').' : '.acymailing_getDate($expirationDate, acymailing_translation('DATE_FORMAT_LC4')).'</span></div></div>';
			}
		}

		$menu .= '<div class="myacymailingbuttons"><button onclick="checkForNewVersion()"><i class="acyicon-search"></i>'.acymailing_translation('ACY_CHECK_MY_VERSION').'</button></div>';

		return $menu;
	}

	private function _addAjaxScript(){

		$script = "function checkForNewVersion(){
			document.getElementById('myacymailingarea').innerHTML = '<span class=\"onload spinner2\"></span>';
			
			var xhr = new XMLHttpRequest();
			xhr.open('POST', '".acymailing_prepareAjaxURL('update')."&task=checkForNewVersion');
			xhr.onload = function(){
				response = JSON.parse(xhr.responseText);
				document.getElementById('myacymailingarea').innerHTML = response.content;
			};
			xhr.send();
		}";

		$config = acymailing_config();
		$lastlicensecheck = $config->get('lastlicensecheck', '');
		if(empty($lastlicensecheck) || $lastlicensecheck < (time() - 604800)){
			$script .= 'window.addEventListener("load", function(){
				checkForNewVersion();
			});';
		}

		acymailing_addScript(true, $script);
	}
}

components/com_acymailing/helpers/acyplugins.php000060400000071467152453623450016261 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class acypluginsHelper{

	public $wraped = false;
	public $name = 'content';

	function getFormattedResult($elements, $parameter){
		if(count($elements) < 2) return implode('', $elements);

		$beforeAll = array();
		$beforeAll['table'] = '<table cellspacing="0" cellpadding="0" border="0" width="100%" class="elementstable">'."\n";
		$beforeAll['ul'] = '<ul class="elementsul">'."\n";
		$beforeAll['br'] = '';

		$beforeBlock = array();
		$beforeBlock['table'] = '<tr class="elementstable_tr numrow{rownum}">'."\n";
		$beforeBlock['ul'] = '';
		$beforeBlock['br'] = '';

		$beforeOne = array();
		$beforeOne['table'] = '<td valign="top" width="{equalwidth}" class="elementstable_td numcol{numcol}" >'."\n";
		$beforeOne['ul'] = '<li class="elementsul_li numrow{rownum}">'."\n";
		$beforeOne['br'] = '';

		$afterOne = array();
		$afterOne['table'] = '</td>'."\n";
		$afterOne['ul'] = '</li>'."\n";
		$afterOne['br'] = '<br />'."\n";

		$afterBlock = array();
		$afterBlock['table'] = '</tr>'."\n";
		$afterBlock['ul'] = '';
		$afterBlock['br'] = '';

		$afterAll = array();
		$afterAll['table'] = '</table>'."\n";
		$afterAll['ul'] = '</ul>'."\n";
		$afterAll['br'] = '';


		$type = 'table';
		$cols = 1;
		if(!empty($parameter->displaytype)) $type = $parameter->displaytype;
		if($type == 'none') return implode('', $elements);
		if(!empty($parameter->cols)) $cols = $parameter->cols;

		$string = $beforeAll[$type];
		$a = 0;
		$numrow = 1;
		foreach($elements as $oneElement){
			if($a == $cols){
				$string .= $afterBlock[$type];
				$a = 0;
			}
			if($a == 0){
				$string .= str_replace('{rownum}', $numrow, $beforeBlock[$type]);
				$numrow++;
			}
			$string .= str_replace('{numcol}', $a + 1, $beforeOne[$type]).$oneElement.$afterOne[$type];
			$a++;
		}
		while($cols > $a){
			$string .= str_replace('{numcol}', $a + 1, $beforeOne[$type]).$afterOne[$type];
			$a++;
		}

		$string .= $afterBlock[$type];
		$string .= $afterAll[$type];

		$equalwidth = intval(100 / $cols).'%';

		$string = str_replace(array('{equalwidth}'), array($equalwidth), $string);

		return $string;
	}

	function formatString(&$replaceme, $mytag){
		if(!empty($mytag->part)){
			$parts = explode(' ', $replaceme);
			if($mytag->part == 'last'){
				$replaceme = count($parts) > 1 ? end($parts) : '';
			}else{
				if(is_numeric($mytag->part) && count($parts) >= $mytag->part){
					$replaceme = $parts[$mytag->part - 1];
				}else{
					$replaceme = reset($parts);
				}
			}
		}

		if(!empty($mytag->type)){
			if(empty($mytag->format)) $mytag->format = acymailing_translation('DATE_FORMAT_LC3');
			if($mytag->type == 'date'){
				$replaceme = acymailing_getDate(acymailing_getTime($replaceme), $mytag->format);
			}elseif($mytag->type == 'time'){
				$replaceme = acymailing_getDate($replaceme, $mytag->format);
			}elseif($mytag->type == 'diff'){
				try{
					$date = $replaceme;
					if(is_numeric($date)) $date = acymailing_getDate($replaceme, '%Y-%m-%d %H:%M:%S');
					$dateObj = new DateTime($date);
					$nowObj = new DateTime();
					$diff = $dateObj->diff($nowObj);
					$replaceme = $diff->format($mytag->format);
				}catch(Exception $e){
					$replaceme = 'Error using the "diff" parameter in your tag. Please make sure the DateTime() and diff() functions are available on your server.';
				}
			}
		}

		if(!empty($mytag->lower) || !empty($mytag->lowercase)) $replaceme = function_exists('mb_strtolower') ? mb_strtolower($replaceme, 'UTF-8') : strtolower($replaceme);
		if(!empty($mytag->upper) || !empty($mytag->uppercase)) $replaceme = function_exists('mb_strtoupper') ? mb_strtoupper($replaceme, 'UTF-8') : strtoupper($replaceme);
		if(!empty($mytag->ucwords)) $replaceme = ucwords($replaceme);
		if(!empty($mytag->ucfirst)) $replaceme = ucfirst($replaceme);
		if(isset($mytag->rtrim)) $replaceme = empty($mytag->rtrim) ? rtrim($replaceme) : rtrim($replaceme, $mytag->rtrim);
		if(!empty($mytag->urlencode)) $replaceme = urlencode($replaceme);
		if(!empty($mytag->substr)){
			$args = explode(',', $mytag->substr);
			if(isset($args[1])){
				$replaceme = substr($replaceme, intval($args[0]), intval($args[1]));
			}else{
				$replaceme = substr($replaceme, intval($args[0]));
			}
		}


		if(!empty($mytag->maxheight) || !empty($mytag->maxwidth)){
			$pictureHelper = acymailing_get('helper.acypict');
			$pictureHelper->maxHeight = empty($mytag->maxheight) ? 999 : $mytag->maxheight;
			$pictureHelper->maxWidth = empty($mytag->maxwidth) ? 999 : $mytag->maxwidth;
			$replaceme = $pictureHelper->resizePictures($replaceme);
		}
	}

	function replaceVideos($text){
		$text = preg_replace('#\[embed=videolink][^}]*youtube[^=]*=([^"/}]*)[^}]*}\[/embed]#i', '<a target="_blank" href="http://www.youtube.com/watch?v=$1"><img src="http://img.youtube.com/vi/$1/0.jpg"/></a>', $text);
		$text = preg_replace('#<video[^>]*youtube\.com/embed/([^"/]*)[^>]*>[^>]*</video>#i', '<a target="_blank" href="http://www.youtube.com/watch?v=$1"><img src="http://img.youtube.com/vi/$1/0.jpg"/></a>', $text);
		$text = preg_replace('#{JoooidContent[^}]*youtube[^}]*id"[^"]*"([^}"]*)"[^}]*}#i', '<a target="_blank" href="http://www.youtube.com/watch?v=$1"><img src="http://img.youtube.com/vi/$1/0.jpg"/></a>', $text);
		$text = preg_replace('#<iframe[^>]*src="[^"]*youtube[^"]*embed/([^"?]*)(\?[^"]*)?"[^>]*>[^<]*</iframe>#Uis', '<a target="_blank" href="http://www.youtube.com/watch?v=$1"><img src="http://img.youtube.com/vi/$1/0.jpg"/></a>', $text);
		$text = preg_replace('#{vimeo}([^{]+){/vimeo}#Uis', '<iframe src="https://player.vimeo.com/video/$1"></iframe>', $text);

		if(preg_match_all('#<iframe[^>]*src="([^"]*vimeo[^"]*)"[^>]*>[^<]*</iframe>#Uis', $text, $matches)){
			foreach($matches[1] as $key => $match){
				if(substr($matches[1][0], 0, 2) == '//') $matches[1][0] = 'https:'.$matches[1][0];
				$xml = acymailing_fileGetContent('https://vimeo.com/api/oembed.json?url='.urlencode($matches[1][0]));
				if(empty($xml)) continue;

				$xml = json_decode($xml);
				if(strpos($matches[0][$key], ' width="') !== false){
					$extension = substr($xml->thumbnail_url, strrpos($xml->thumbnail_url, '.'));
					preg_match('#width="([^"]*)"#Uis', $matches[0][$key], $width);

					$replace = strpos($xml->thumbnail_url, '_') === false ? '.' : '_';
					$xml->thumbnail_url = substr($xml->thumbnail_url, 0, strrpos($xml->thumbnail_url, $replace)).'_'.$width[1].$extension;
					$xml->thumbnail_url_with_play_button = 'https://i.vimeocdn.com/filter/overlay?src='.$xml->thumbnail_url.'&src=http://f.vimeocdn.com/p/images/crawler_play.png';
				}
				$text = str_replace($matches[0][$key], '<a target="_blank" href="'.($matches[1][0]).'"><img class="donotresize" alt="" src="'.($xml->thumbnail_url_with_play_button).'" /></a>', $text);
			}
		}

		$text = preg_replace('#\[embed=videolink][^}]*video":"([^"]*)[^}]*}\[/embed]#i', '<a target="_blank" href="$1"><img src="'.ACYMAILING_IMAGES.'/video.png"/></a>', $text);
		$text = preg_replace('#<video[^>]*src="([^"]*)"[^>]*>[^>]*</video>#i', '<a target="_blank" href="$1"><img src="'.ACYMAILING_IMAGES.'/video.png"/></a>', $text);
		return $text;
	}

	function removeJS($text){
		$text = preg_replace("#(onmouseout|onmouseover|onclick|onfocus|onload|onblur) *= *\"(?:(?!\").)*\"#iU", '', $text);
		$text = preg_replace("#< *script(?:(?!< */ *script *>).)*< */ *script *>#isU", '', $text);
		return $text;
	}

	private function _convertbase64pictures(&$html){
		if(!preg_match_all('#<img[^>]*src=("data:image/([^;]{1,5});base64[^"]*")([^>]*)>#Uis', $html, $resultspictures)) return;

		

		$dest = ACYMAILING_MEDIA.'resized'.DS;
		acymailing_createDir($dest);
		foreach($resultspictures[2] as $i => $extension){
			$pictname = md5($resultspictures[1][$i]).'.'.$extension;
			$picturl = ACYMAILING_LIVE.ACYMAILING_MEDIA_FOLDER.'/resized/'.$pictname;
			$pictPath = $dest.$pictname;
			$pictCode = trim($resultspictures[1][$i], '"');
			if(file_exists($pictPath)){
				$html = str_replace($pictCode, $picturl, $html);
				continue;
			}

			$getfunction = '';
			switch($extension){
				case 'gif':
					$getfunction = 'ImageCreateFromGIF';
					break;
				case 'jpg':
				case 'jpeg':
					$getfunction = 'ImageCreateFromJPEG';
					break;
				case 'png':
					$getfunction = 'ImageCreateFromPNG';
					break;
			}

			if(empty($getfunction) || !function_exists($getfunction)) continue;

			$img = $getfunction($pictCode);

			if(in_array($extension, array('gif', 'png'))){
				imagealphablending($img, false);
				imagesavealpha($img, false);
			}

			ob_start();
			switch($extension){
				case 'gif':
					$status = imagegif($img);
					break;
				case 'jpg':
				case 'jpeg':
					$status = imagejpeg($img, null, 100);
					break;
				case 'png':
					$status = imagepng($img, null, 1);
					break;
			}
			$imageContent = ob_get_clean();
			$status = $status && acymailing_writeFile($pictPath, $imageContent);

			if(!$status) continue;
			$html = str_replace($pictCode, $picturl, $html);
		}
	}

	private function _lineheightfix(&$html){
		$pregreplace = array();
		$pregreplace['#<tr([^>"]*>([^<]*<td[^>]*>[ \n\s]*<img[^>]*>[ \n\s]*</ *td[^>]*>[ \n\s]*)*</ *tr)#Uis'] = '<tr style="line-height: 0px;" $1';
		$pregreplace['#<td(((?!style|>).)*>[ \n\s]*(<a[^>]*>)?[ \n\s]*<img[^>]*>[ \n\s]*(</a[^>]*>)?[ \n\s]*</ *td)#Uis'] = '<td style="line-height: 0px;" $1';

		$newbody = preg_replace(array_keys($pregreplace), $pregreplace, $html);
		if(!empty($newbody)) $html = $newbody;
	}

	private function _removecontenttags(&$html){
		$pregreplace = array();
		$pregreplace['#{tab[ =][^}]*}#is'] = '';
		$pregreplace['#{/tabs}#is'] = '';
		$pregreplace['#{jcomments\s+(on|off|lock)}#is'] = '';
		$newbody = preg_replace(array_keys($pregreplace), $pregreplace, $html);
		if(!empty($newbody)) $html = $newbody;
	}

	function cleanHtml(&$html){

		$this->_lineheightfix($html);
		$this->_removecontenttags($html);
		$this->_convertbase64pictures($html);
		$this->cleanEditorCode($html);
		$this->_removeEditorFromTemplate($html);
	}

	public function fixPictureDim(&$html){
		if(!preg_match_all('#(<img)([^>]*>)#i', $html, $results)) return;

		static $replace = array();
		foreach($results[0] as $num => $oneResult){
			if(isset($replace[$oneResult])) continue;

			if(strpos($oneResult, 'width=') || strpos($oneResult, 'height=')) continue;
			if(preg_match('#[^a-z_\-]width *:([0-9 ]{1,8})#i', $oneResult, $res) || preg_match('#[^a-z_\-]height *:([0-9 ]{1,8})#i', $oneResult, $res)) continue;

			if(!preg_match('#src="([^"]*)"#i', $oneResult, $url)) continue;

			$imageUrl = $url[1];

			$replace[$oneResult] = $oneResult;

			$base = str_replace(array('http://www.', 'https://www.', 'http://', 'https://'), '', ACYMAILING_LIVE);
			$replacements = array('https://www.'.$base, 'http://www.'.$base, 'https://'.$base, 'http://'.$base);
			$localpict = false;
			foreach($replacements as $oneReplacement){
				if(strpos($imageUrl, $oneReplacement) === false) continue;
				$imageUrl = str_replace(array($oneReplacement, '/'), array(ACYMAILING_ROOT, DS), urldecode($imageUrl));
				$localpict = true;
				break;
			}

			if(!$localpict) continue;

			$dim = @getimagesize($imageUrl);
			if(!$dim) continue;
			if(empty($dim[0]) || empty($dim[1])) continue;

			$replace[$oneResult] = str_replace('<img', '<img width="'.$dim[0].'" height="'.$dim[1].'"', $oneResult);
		}

		if(empty($replace)) return;

		$html = str_replace(array_keys($replace), $replace, $html);
	}

	private function cleanEditorCode(&$html){
		if(!strpos($html, 'cke_edition_en_cours')) return;

		$html = preg_replace('#<div[^>]*cke_edition_en_cours.*$#Uis', '', $html);
	}

	private function _removeEditorFromTemplate(&$html){
		if(strpos($html, 'acyeditor_sharedspace') == -1) return;
		$html = preg_replace('#<div .* class="acyeditor_sharedspace".*><\/div>#', '', $html);
	}

	function replaceTags(&$email, &$tags, $html = false){
		if(empty($tags)) return;

		$htmlVars = array('body');
		$textVars = array('altbody');
		$lineVars = array('subject', 'From', 'FromName', 'ReplyTo', 'ReplyName', 'bcc', 'cc', 'fromname', 'fromemail', 'replyname', 'replyemail', 'params');

		$variables = array_merge($htmlVars, $textVars, $lineVars);

		if($html){
			if(empty($this->mailerHelper)) $this->mailerHelper = acymailing_get('helper.mailer');

			$textreplace = array();
			$linereplace = array();
			foreach($tags as $i => &$params){
				if(isset($textreplace[$i])) continue;
				$textreplace[$i] = $this->mailerHelper->textVersion($params, true);
				$linereplace[$i] = strip_tags(preg_replace('#</tr>[^<]*<tr[^>]*>#Uis', ' | ', $params));
			}

			$htmlKeys = array_keys($tags);
			$lineKeys = array_keys($linereplace);
			$textKeys = array_keys($textreplace);
		}else{
			$textreplace = &$tags;
			$linereplace = &$tags;
			$htmlKeys = array_keys($tags);
			$lineKeys = &$htmlKeys;
			$textKeys = &$htmlKeys;
		}

		foreach($variables as &$var){
			if(empty($email->$var)) continue;

			if(is_array($email->$var)){
				foreach($email->$var as $i => &$arrayField){
					if(empty($arrayField)) continue;

					if(is_array($arrayField)){
						foreach($arrayField as $a => &$oneval){
							if(in_array($var, $htmlVars)){
								$oneval = str_replace($htmlKeys, $tags, $oneval);
							}elseif(in_array($var, $lineVars)){
								$oneval = str_replace($lineKeys, $linereplace, $oneval);
							}else{
								$oneval = str_replace($textKeys, $textreplace, $oneval);
							}
						}
					}else{
						if(in_array($var, $htmlVars)){
							$arrayField = str_replace($htmlKeys, $tags, $arrayField);
						}elseif(in_array($var, $lineVars)){
							$arrayField = str_replace($lineKeys, $linereplace, $arrayField);
						}else{
							$arrayField = str_replace($textKeys, $textreplace, $arrayField);
						}
					}
				}
			}else{
				if(in_array($var, $htmlVars)){
					$email->$var = str_replace($htmlKeys, $tags, $email->$var);
				}elseif(in_array($var, $lineVars)){
					$email->$var = str_replace($lineKeys, $linereplace, $email->$var);
				}else{
					$email->$var = str_replace($textKeys, $textreplace, $email->$var);
				}
			}
		}
	}

	function extractTags(&$email, $tagfamily){
		$results = array();

		$match = '#(?:{|%7B)'.$tagfamily.'(?:%3A|\\:)(.*)(?:}|%7D)#Ui';
		$variables = array('subject', 'body', 'altbody', 'From', 'FromName', 'ReplyTo', 'ReplyName', 'bcc', 'cc', 'fromname', 'fromemail', 'replyname', 'replyemail', 'params');
		$found = false;
		foreach($variables as &$var){
			if(empty($email->$var)) continue;
			if(is_array($email->$var)){
				foreach($email->$var as $i => &$arrayField){
					if(empty($arrayField)) continue;
					if(is_array($arrayField)){
						foreach($arrayField as $a => &$oneval){
							$found = preg_match_all($match, $oneval, $results[$var.$i.'-'.$a]) || $found;
							if(empty($results[$var.$i.'-'.$a][0])) unset($results[$var.$i.'-'.$a]);
						}
					}else{
						$found = preg_match_all($match, $arrayField, $results[$var.$i]) || $found;
						if(empty($results[$var.$i][0])) unset($results[$var.$i]);
					}
				}
			}else{
				$found = preg_match_all($match, $email->$var, $results[$var]) || $found;
				if(empty($results[$var][0])) unset($results[$var]);
			}
		}

		if(!$found) return array();

		$tags = array();
		foreach($results as $var => $allresults){
			foreach($allresults[0] as $i => $oneTag){
				if(isset($tags[$oneTag])) continue;
				$tags[$oneTag] = $this->extractTag($allresults[1][$i]);
			}
		}

		return $tags;
	}

	function extractTag($oneTag){
		$arguments = explode('|', strip_tags(urldecode($oneTag)));
		$tag = new stdClass();
		$tag->id = $arguments[0];
		$tag->default = '';
		for($i = 1, $a = count($arguments); $i < $a; $i++){
			$args = explode(':', $arguments[$i]);
			$arg0 = trim($args[0]);
			if(empty($arg0)) continue;
			if(isset($args[1])){
				$tag->$arg0 = $args[1];
				if(isset($args[2])) $tag->{$args[0]} .= ':'.$args[2];
			}else{
				$tag->$arg0 = true;
			}
		}
		return $tag;
	}

	function wrapText($text, $tag){

		$this->wraped = false;

		if(!empty($tag->wrap)) $tag->wrap = intval($tag->wrap);
		if(empty($tag->wrap)) return $text;

		$allowedTags = array();
		$allowedTags[] = 'b';
		$allowedTags[] = 'strong';
		$allowedTags[] = 'i';
		$allowedTags[] = 'em';
		$allowedTags[] = 'a';

		$aloneAllowedTags = array();
		$aloneAllowedTags[] = 'br';
		$aloneAllowedTags[] = 'img';

		$newText = preg_replace('/<p[^>]*>/i', '<br />', $text);
		$newText = preg_replace('/<div[^>]*>/i', '<br />', $newText);
		$newText = strip_tags($newText, '<'.implode('><', array_merge($allowedTags, $aloneAllowedTags)).'>');

		$newText = preg_replace('/^(\s|\n|(<br[^>]*>))+/i', '', trim($newText));
		$newText = preg_replace('/(\s|\n|(<br[^>]*>))+$/i', '', trim($newText));

		$newText = str_replace(array('&lt', '&gt'), array('<', '>'), $newText);

		$numChar = strlen($newText);

		$numCharStrip = strlen(strip_tags($newText));

		if($numCharStrip <= $tag->wrap) return $newText;

		$this->wraped = true;

		$open = array();

		$write = true;

		$countStripChar = 0;

		for($i = 0; $i < $numChar; $i++){
			if($newText[$i] == '<'){
				foreach($allowedTags as $oneAllowedTag){
					if($numChar >= ($i + strlen($oneAllowedTag) + 1) && substr($newText, $i, strlen($oneAllowedTag) + 1) == '<'.$oneAllowedTag && (in_array($newText[$i + strlen($oneAllowedTag) + 1], array(' ', '>')))){
						$write = false;
						$open[] = '</'.$oneAllowedTag.'>';
					}

					if($numChar >= ($i + strlen($oneAllowedTag) + 2) && substr($newText, $i, strlen($oneAllowedTag) + 2) == '</'.$oneAllowedTag){
						if(end($open) == '</'.$oneAllowedTag.'>') array_pop($open);
					}
				}

				foreach($aloneAllowedTags as $oneAllowedTag){
					if($numChar >= ($i + strlen($oneAllowedTag) + 1) && substr($newText, $i, strlen($oneAllowedTag) + 1) == '<'.$oneAllowedTag && (in_array($newText[$i + strlen($oneAllowedTag) + 1], array(' ', '/', '>')))){
						$write = false;
					}
				}
			}

			if($write) $countStripChar++;

			if($newText[$i] == ">") $write = true;

			if($newText[$i] == " " && $countStripChar >= $tag->wrap && $write){
				$newText = substr($newText, 0, $i).'...';

				$open = array_reverse($open);
				$newText = $newText.implode('', $open);

				break;
			}
		}

		$newText = preg_replace('/^(\s|\n|(<br[^>]*>))+/i', '', trim($newText));
		$newText = preg_replace('/(\s|\n|(<br[^>]*>))+$/i', '', trim($newText));

		return $newText;
	}

	function getStandardDisplay($format){
		if(empty($format->tag->format)) $format->tag->format = 'TOP_LEFT';
		if(!in_array($format->tag->format, array('TOP_LEFT', 'TOP_RIGHT', 'TITLE_IMG', 'TITLE_IMG_RIGHT', 'CENTER_IMG', 'TOP_IMG', 'COL_LEFT', 'COL_RIGHT'))) return 'Wrong format suppied: '.$format->tag->format;

		$invertValues = array('TOP_LEFT' => 'TOP_RIGHT', 'TITLE_IMG' => 'TITLE_IMG_RIGHT', 'COL_LEFT' => 'COL_RIGHT', 'TOP_RIGHT' => 'TOP_LEFT', 'TITLE_IMG_RIGHT' => 'TITLE_IMG', 'COL_RIGHT' => 'COL_LEFT');
		if(!empty($format->tag->invert) && !empty($invertValues[$format->tag->format])) $format->tag->format = $invertValues[$format->tag->format];

		$image = '';
		if(!empty($format->imagePath)){
			$style = '';
			if(in_array($format->tag->format, array('TOP_LEFT', 'TITLE_IMG'))){
				$style = ' style="float:left;"';
			}elseif(in_array($format->tag->format, array('TOP_RIGHT', 'TITLE_IMG_RIGHT'))){
				$style = ' style="float:right;"';
			}
			$image = '<img alt="" src="'.$format->imagePath.'"'.$style.' />';
		}

		$result = '';
		if($format->tag->format == 'TITLE_IMG' || $format->tag->format == 'TITLE_IMG_RIGHT'){
			$format->title = $image.$format->title;
			$image = '';
		}

		if(!empty($format->link) && !empty($image)) $image = '<a target="_blank" href="'.$format->link.'" '.$style.'>'.$image.'</a>';

		if($format->tag->format == 'TOP_IMG' && !empty($image)){
			$result = $image;
			$image = '';
		}

		if(in_array($format->tag->format, array('COL_LEFT', 'COL_RIGHT'))){
			if(empty($image)){
				$format->tag->format = 'TOP_LEFT';
			}else{
				$result = '<table><tr><td valign="top" class="acyleftcol">';
				if($format->tag->format == 'COL_LEFT') $result .= $image.'</td><td valign="top" class="acyrightcol">';
			}
		}

		if(!empty($format->title)){
			if(!empty($format->link)) $format->title = '<a'.(!empty($format->tag->type) && $format->tag->type == 'title' ? ' class="acymailing_title"' : '').' href="'.$format->link.'" target="_blank" name="'.$this->name.'-'.$format->tag->id.'">'.$format->title.'</a>';
			if(empty($format->tag->type) || $format->tag->type != 'title') $format->title = '<h2 class="acymailing_title">'.$format->title.'</h2>';
			$result .= $format->title;
		}

		if(!empty($format->afterTitle)) $result .= $format->afterTitle;
		if(!empty($format->description)) $format->description = $this->wrapText($format->description, $format->tag);


		$rowText = '<div class="acydescription">';
		$endRow = '</div><br />';
		if(in_array($format->tag->format, array('TOP_LEFT', 'TOP_RIGHT', 'TITLE_IMG', 'TITLE_IMG_RIGHT', 'TOP_IMG'))){
			if(!empty($image) || !empty($format->description)) $result .= $rowText.$image.$format->description.$endRow;
		}elseif($format->tag->format == 'CENTER_IMG'){
			if(!empty($image)) $result .= '<div class="acymainimage">'.$image.$endRow;
			if(!empty($format->description)) $result .= $rowText.$format->description.$endRow;
		}elseif(in_array($format->tag->format, array('COL_LEFT', 'COL_RIGHT'))){
			if(!empty($format->description)) $result .= $rowText.$format->description.$endRow;
			if($format->tag->format == 'COL_RIGHT') $result .= '</td><td valign="top" class="acyrightcol">'.$image;
			$result .= '</td></tr></table>';
		}

		if(!empty($format->customFields)){
			$result .= '<table style="width:100%;" class="customfieldsarea"><tr>';

			if(empty($format->cols)) $format->cols = 1;
			$i = 0;
			foreach($format->customFields as $oneField){
				if($i != 0 && $i % $format->cols == 0) $result .= '</tr><tr>';
				$result .= '<td nowrap="nowrap" class="';
				if(empty($oneField[0])){
					$result .= 'cfvalue" colspan="2">';
				}else{
					$result .= 'cflabel">'.$oneField[0].'</td><td class="cfvalue">';
				}
				$result .= $oneField[1].'</td>';
				$i++;
			}

			while($i % $format->cols != 0){
				$result .= '<td colspan="2"></td>';
				$i++;
			}

			$result .= '</tr></table>';
		}

		if(!empty($format->afterArticle)) $result .= $format->afterArticle;

		return $result;
	}

	function managePicts($tag, $result){
		if(!isset($tag->pict)) return $result;

		$pictureHelper = acymailing_get('helper.acypict');
		if($tag->pict === 'resized'){
			$pictureHelper->maxHeight = empty($tag->maxheight) ? 150 : $tag->maxheight;
			$pictureHelper->maxWidth = empty($tag->maxwidth) ? 150 : $tag->maxwidth;
			if($pictureHelper->available()){
				$result = $pictureHelper->resizePictures($result);
			}elseif(acymailing_isAdmin()){
				acymailing_enqueueMessage($pictureHelper->error, 'notice');
			}
		}elseif($tag->pict == '0'){
			$result = $pictureHelper->removePictures($result);
		}

		return $result;
	}

	function getOrderingField($values, $ordering, $direction, $function = 'updateTagAuto'){
		$orderingValues = array();
		foreach($values as $value => $title){
			$orderingValues[] = acymailing_selectOption($value, acymailing_translation($title));
		}
		$orderingValues[] = acymailing_selectOption("rand", acymailing_translation('ACY_RANDOM'));

		$orderingDirections = array();
		$orderingDirections[] = acymailing_selectOption("DESC", 'DESC');
		$orderingDirections[] = acymailing_selectOption("ASC", 'ASC');

		return acymailing_select($orderingValues, 'contentorder', 'size="1" onchange="'.$function.'();" style="width:100px;"', 'value', 'text', $ordering).' '.acymailing_select($orderingDirections, 'contentorderdir', 'size="1" onchange="'.$function.'();" style="width:80px;"', 'value', 'text', $direction);
	}

	function translateItem(&$item, &$tag, $referenceTable, $referenceId = 0){
		if(empty($tag->lang) || (!file_exists(ACYMAILING_ROOT.'components'.DS.'com_falang') && !file_exists(ACYMAILING_ROOT.'components'.DS.'com_joomfish'))) return;
		$langid = (int)substr($tag->lang, strpos($tag->lang, ',') + 1);

		if(empty($langid)) return;

		if(empty($referenceId)) $referenceId = $tag->id;
		$table = (ACYMAILING_J16 && file_exists(ACYMAILING_ROOT.'components'.DS.'com_falang')) ? '`#__falang_content`' : '`#__jf_content`';
		$query = "SELECT reference_field, value FROM ".$table." WHERE `published` = 1 AND `reference_table` = ".acymailing_escapeDB($referenceTable)." AND `language_id` = $langid AND `reference_id` = ".$referenceId;
		$translations = acymailing_loadObjectList($query);

		if(empty($translations)) return;

		foreach($translations as $oneTranslation){
			if(empty($oneTranslation->value)) continue;
			$translatedfield = $oneTranslation->reference_field;
			$item->$translatedfield = $oneTranslation->value;
		}
	}

	function getFormatOption($plugin, $default = 'TOP_LEFT', $singleElement = true, $function = 'updateTag'){
		$contentformat = array('TOP_LEFT' => '-208', 'TOP_RIGHT' => '-260', 'TITLE_IMG' => '0', 'TITLE_IMG_RIGHT' => '-52', 'CENTER_IMG' => '-104', 'TOP_IMG' => '-156', 'COL_LEFT' => '-312', 'COL_RIGHT' => '-364');

		$name = $singleElement ? 'contentformat' : 'contentformatauto';

		$result = '<input type="hidden" name="'.$name.'" id="'.$name.'" value="'.$default.'" size="1"/>';
		$result .= '<span id="'.$name.'button" class="btn acybuttonformat" style="margin: 0px 10px 0px 0px; background-position: '.$contentformat[$default].'px -6px;height:34px;" onclick="togglediv'.$name.'();"></span>';
		$result .= '<div id="'.$name.'div" class="formatbox" style="display:none;">';

		$reset = '';
		if(file_exists(ACYMAILING_MEDIA.'plugins')){

			

			$files = acymailing_getFiles(ACYMAILING_MEDIA.'plugins', '^'.$plugin);
			foreach($files as $oneFile){
				$reset .= "document.getElementById('".$name.$oneFile."').style.backgroundPosition = '-480px -5px';document.getElementById('".$name.$oneFile."').style.boxShadow = 'inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)';";
				$result .= '<span id="'.$name.$oneFile.'" class="btn acybuttonformat" style="background-position: -480px -5px;height:34px;" onclick="selectFormat'.$name.'(\''.$oneFile.'\',\''.$oneFile.'\',true);"></span>'.substr($oneFile, 0, strlen($oneFile) - 4).'<br/>';
			}
			$result .= '<br />';
		}

		foreach($contentformat as $value => $position){
			$reset .= "document.getElementById('".$name.$value."').style.backgroundPosition = '".$position."px -10px';document.getElementById('".$name.$value."').style.boxShadow = 'inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)';";
			$result .= '<span id="'.$name.$value.'" class="btn acybuttonformat" style="background-position: '.$position.'px '.($value == $default ? -64 : -10).'px;" onclick="selectFormat'.$name.'(\''.$value.'\',\''.$position.'\',false);"></span>';
		}

		$result .= '<br />';

		if(!$singleElement){
			$result .= '<br /><input type="hidden" id="'.$name.'invert" value="0"/>';
			$result .= '<span id="'.$name.'invertbutton" class="btn acybuttonformat" style="background-position:-415px -8px;width:58px;height:30px;" onclick="toggleInvert'.$name.'();"></span>'.acymailing_tooltip('Alternatively display the image on the left and right', 'Alternate', '', 'Alternate');
		}

		$result .= '<span class="btn acyokbutton acybuttonformat" onclick="togglediv'.$name.'();">'.acymailing_translation('ACY_CLOSE').'</span>';
		$result .= '</div>';
		ob_start();
		?>
		<script type="text/javascript">
			<!--
			function togglediv<?php echo $name; ?>(){
				var divelement = document.getElementById('<?php echo $name; ?>div');
				if(divelement.style.display == 'none'){
					divelement.style.display = '';
				}else{
					divelement.style.display = 'none';
				}
			}
			<?php if(!$singleElement){ ?>
			function toggleInvert<?php echo $name; ?>(){
				var invertElement = document.getElementById('<?php echo $name; ?>invert');
				var posy = '8';
				var shadow = 'inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)';
				if(invertElement.value == 0){
					posy = '60';
					shadow = 'inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)';
				}
				invertElement.value = 1 - invertElement.value;
				document.getElementById('<?php echo $name; ?>invertbutton').style.backgroundPosition = '-415px -' + posy + 'px';
				document.getElementById('<?php echo $name; ?>invertbutton').style.boxShadow = shadow;
				<?php echo $function; ?>();
			}
			<?php } ?>

			function selectFormat<?php echo $name; ?>(format, position, custom){
				<?php echo $reset; ?>
				var prosy = '64';
				var newVal = format;
				if(custom){
					position = '-480';
					prosy = '58';
					newVal = '<?php echo $default; ?>| template:' + format;
				}
				document.getElementById('<?php echo $name; ?>').value = newVal;
				document.getElementById('<?php echo $name; ?>button').style.backgroundPosition = position + 'px -5px';
				document.getElementById('<?php echo $name; ?>' + format).style.backgroundPosition = position + 'px -' + prosy + 'px';
				document.getElementById('<?php echo $name; ?>' + format).style.boxShadow = 'inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)';
				<?php echo $function; ?>();
			}
			-->
		</script>
		<?php
		$result .= ob_get_clean();
		return $result;
	}
}

components/com_acymailing/helpers/toggle.php000060400000015342152453623450015352 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class acytoggleHelper{

	var $ctrl = 'toggle';
	var $extra = '';

	private function _getToggle($column, $table = ''){

		$params = new stdClass();
		$params->mode = 'pictures';
		if($column == 'published' && !in_array($table, array('plugins', 'list'))){
			$params->aclass = array(0 => 'acyicon-cancel', 1 => 'acyicon-apply', 2 => 'acyicon-schedule');
			$params->description = array(0 => acymailing_translation('PUBLISH_CLICK'), 1 => acymailing_translation('UNPUBLISH_CLICK'), 2 => acymailing_translation('UNSCHEDULE_CLICK'));
			$params->values = array(0 => 1, 1 => 0, 2 => 0);
			return $params;
		}elseif($column == 'status'){
			$params->mode = 'class';
			$params->class = array(-1 => 'roundsubscrib roundunsub', 1 => 'roundsubscrib roundsub', 2 => 'roundsubscrib roundconf');
			$params->description = array(-1 => acymailing_translation('SUBSCRIBE_CLICK'), 1 => acymailing_translation('UNSUBSCRIBE_CLICK'), 2 => acymailing_translation('CONFIRMATION_CLICK'));
			$params->values = array(-1 => 1, 1 => -1, 2 => 1);
			return $params;
		}

		$params->aclass = array(0 => 'acyicon-cancel', 1 => 'acyicon-apply');
		$params->values = array(0 => 1, 1 => 0);
		return $params;
	}

	function toggleText($action = '', $value = '', $table = '', $text = ''){
		static $jsincluded = false;
		static $id = 0;
		$id++;
		if(!$jsincluded){
			$jsincluded = true;
			$js = "function joomToggleText(id,newvalue,table){
				window.document.getElementById(id).className = 'onload';
					
				var xhr = new XMLHttpRequest();
				xhr.open('GET', '".acymailing_prepareAjaxURL('toggle')."&task='+id+'&value='+newvalue+'&table='+table+'&".acymailing_getFormToken()."');
				xhr.onload = function(){
					document.getElementById(id).innerHTML = xhr.responseText;
					window.document.getElementById(id).className = 'loading';
				};
				xhr.send();
			}";
			acymailing_addScript(true, $js);
		}

		if(!$action) return;

		return '<span id="'.$action.'_'.$value.'" ><a href="javascript:void(0);" onclick="joomToggleText(\''.$action.'_'.$value.'\',\''.$value.'\',\''.$table.'\')">'.$text.'</a></span>';
	}

	function toggle($id, $value, $table, $extra = null){
		$column = substr($id, 0, strpos($id, '_'));
		$params = $this->_getToggle($column, $table);
		if(!isset($params->values[$value])) return;
		$newValue = $params->values[$value];
		if($params->mode == 'pictures'){
			static $pictureincluded = false;
			if(!$pictureincluded){
				$pictureincluded = true;
				$js = "function joomTogglePicture(id,newvalue,table){
					window.document.getElementById(id).className = 'onload';
					var xhr = new XMLHttpRequest();
					xhr.open('GET', '".acymailing_prepareAjaxURL('toggle')."&task='+id+'&value='+newvalue+'&table='+table+'&".acymailing_getFormToken()."');
					xhr.onload = function(){
						document.getElementById(id).innerHTML = xhr.responseText;
						window.document.getElementById(id).className = 'loading';
					};
					xhr.send();
				}";
				acymailing_addScript(true, $js);
			}

			$desc = empty($params->description[$value]) ? '' : $params->description[$value];

			if(empty($params->pictures)){
				$text = ' ';
				$class = 'class="'.$params->aclass[$value].'"';
			}else{
				$text = '<img src="'.$params->pictures[$value].'"/>';
				$class = '';
			}

			return '<a href="javascript:void(0);" style="font-style: normal;" '.$class.' onclick="joomTogglePicture(\''.$id.'\',\''.$newValue.'\',\''.$table.'\')" title="'.str_replace('"', '\"', $desc).'">'.$text.'</a>';
		}elseif($params->mode == 'class'){
			if(empty($extra)) return;
			static $classincluded = false;
			if(!$classincluded){
				$classincluded = true;
				$js = "function joomToggleClass(id,newvalue,table,extra){
					var mydiv = document.getElementById(id);
					mydiv.innerHTML = '';
					mydiv.className = 'onload';
					
					var xhr = new XMLHttpRequest();
					xhr.open('GET', '".acymailing_prepareAjaxURL('toggle')."&task='+id+'&value='+newvalue+'&table='+table+'&".acymailing_getFormToken()."&extra[color]='+extra);
					xhr.onload = function(){
						document.getElementById(id).innerHTML = xhr.responseText;
						window.document.getElementById(id).className = 'loading';
					};
					xhr.send();
				}";
				acymailing_addScript(true, $js);
			}
			
			$desc = empty($params->description[$value]) ? '' : $params->description[$value];
			$return = '<a href="javascript:void(0);" onclick="joomToggleClass(\''.$id.'\',\''.$newValue.'\',\''.$table.'\',\''.htmlspecialchars(urlencode($extra['color']), ENT_COMPAT, 'UTF-8').'\');" title="'.str_replace('"', '\"', $desc).'"><div class="'.$params->class[$value].'" style="background-color:'.htmlspecialchars($extra['color'], ENT_COMPAT, 'UTF-8').';border-color:'.htmlspecialchars($extra['color'], ENT_COMPAT, 'UTF-8').'">';
			if(!empty($extra['tooltip'])) $return .= acymailing_tooltip($extra['tooltip'], @$extra['tooltiptitle'], '', '&nbsp;&nbsp;&nbsp;&nbsp;');
			$return .= '</div></a>';

			return $return;
		}
	}

	function display($column, $value){
		$params = $this->_getToggle($column);

		$title = '';
		if($column == 'published') $title = 'title="'.($value == 1 ? acymailing_translation('ENABLED') : acymailing_translation('DISABLED')).'"';

		if(empty($params->pictures)){
			return '<a style="cursor:default;" class="'.$params->aclass[$value].'" '.$title.'></a>';
		}else{
			return '<img src="'.$params->pictures[$value].'"/>';
		}
	}

	function delete($lineId, $elementids, $table, $confirm = false, $text = '', $extraJsOnClick = ''){
		static $deleteJS = false;
		if(!$deleteJS){
			$deleteJS = true;
			$js = "function joomDelete(lineid,elementids,table,reqconfirm){
				if(reqconfirm){
					if(!confirm('".acymailing_translation('ACY_VALIDDELETEITEMS', true)."')) return false;
				}
					
				var xhr = new XMLHttpRequest();
				xhr.open('GET', '".acymailing_prepareAjaxURL($this->ctrl).$this->extra."&task=delete&value='+elementids+'&table='+table+'&".acymailing_getFormToken()."');
				xhr.onload = function(){
					window.document.getElementById(lineid).style.display = 'none';
				};
				xhr.send();
			}";

			acymailing_addScript(true, $js);
		}

		if(empty($text)){
			if(acymailing_isAdmin()){
				$text = '<span class="hasTooltip acyicon-delete" data-original-title="'.acymailing_translation('ACY_DELETE').'" title="'.acymailing_translation('ACY_DELETE').'"/>';
			}else{
				$text = '<img src="'.ACYMAILING_MEDIA_FOLDER.'/images/delete.png" title="Delete">';
			}
		}
		return '<a href="javascript:void(0);" onclick="joomDelete(\''.$lineId.'\',\''.$elementids.'\',\''.$table.'\','.($confirm ? 'true' : 'false').'); '.$extraJsOnClick.'">'.$text.'</a>';
	}
}

components/com_acymailing/helpers/order.php000060400000007420152453623450015202 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class acyorderHelper{

	var $table = '';
	var $pkey = '';
	var $groupMap = '';
	var $groupVal = '';

	function order($down = true){

		if($down){
			$sign = '>';
			$dir = 'ASC';
		}else{
			$sign = '<';
			$dir = 'DESC';
		}

		$ids = acymailing_getVar('array',  'cid', array(), '');
		$id = (int) $ids[0];

		$pkey = $this->pkey;

		$query = 'SELECT a.ordering,a.'.$pkey.' FROM '.acymailing_table($this->table).' as b, '.acymailing_table($this->table).' as a';
		$query .= ' WHERE a.ordering '.$sign.' b.ordering AND b.'.$pkey.' = '.$id;
		if(!empty($this->groupMap)) $query .= ' AND a.'.$this->groupMap.' = '.acymailing_escapeDB($this->groupVal);
		$query .= ' ORDER BY a.ordering '.$dir.' LIMIT 1';
		$secondElement = acymailing_loadObject($query);

		if(empty($secondElement)) return false;

		$firstElement = new stdClass();
		$firstElement->$pkey = $id;
		$firstElement->ordering = $secondElement->ordering;
		if($down)$secondElement->ordering--;
		else $secondElement->ordering++;


		$status1 = acymailing_updateObject(acymailing_table($this->table),$firstElement,$pkey);
		$status2 = acymailing_updateObject(acymailing_table($this->table),$secondElement,$pkey);

		$status = $status1 && $status2;
		if($status){
			acymailing_enqueueMessage(acymailing_translation( 'SUCC_MOVED' ), 'message');
		}

		return $status;
	}

	function save(){
		$pkey = $this->pkey;

		$cid	= acymailing_getVar('array',  'cid', array());
		$order	= acymailing_getVar('array',  'order', array());

		acymailing_arrayToInteger($cid);

		$query = 'SELECT `ordering`,`'.$pkey.'` FROM '.acymailing_table($this->table).' WHERE `'.$pkey.'` NOT IN ('.implode(',',$cid).') ';
		if(!empty($this->groupMap)) $query .= ' AND '.$this->groupMap.' = '.acymailing_escapeDB($this->groupVal);
		$query .= ' ORDER BY `ordering` ASC';
		$results = acymailing_loadObjectList($query, $pkey);

		$oldResults = $results;

		asort($order);

		$newOrder = array();
		while(!empty($order) OR !empty($results)){
			$dbElement = reset($results);
			if(empty($dbElement->ordering) OR (!empty($order) AND reset($order) <= $dbElement->ordering)){
				$newOrder[] = $cid[(int)key($order)];
				unset($order[key($order)]);
			}else{
				$newOrder[] = $dbElement->$pkey;
				unset($results[$dbElement->$pkey]);
			}
		}

		$i = 1;
		$status = true;
		$element = new stdClass();
		foreach($newOrder as $val){
			$element->$pkey = $val;
			$element->ordering = $i;
			if(!isset($oldResults[$val]) OR $oldResults[$val]->ordering != $i){
				$status = acymailing_updateObject(acymailing_table($this->table),$element,$pkey) && $status;
			}
			$i++;
		}

		if($status){
			acymailing_enqueueMessage(acymailing_translation( 'ACY_NEW_ORDERING_SAVED' ), 'message');
		}else{
			acymailing_enqueueMessage(acymailing_translation( 'ERROR_ORDERING' ), 'error');
		}
		return $status;
	}

	function reOrder(){
		$query = 'UPDATE '.acymailing_table($this->table).' SET `ordering` = `ordering`+1';
		if(!empty($this->groupMap)) $query .= ' WHERE '.$this->groupMap.' = '.acymailing_escapeDB($this->groupVal);

		acymailing_query($query);

		$query = 'SELECT `ordering`,`'.$this->pkey.'` FROM '.acymailing_table($this->table);
		if(!empty($this->groupMap)) $query .= ' WHERE '.$this->groupMap.' = '.acymailing_escapeDB($this->groupVal);
		$query .= ' ORDER BY `ordering` ASC';
		$results = acymailing_loadObjectList($query);

		$i = 1;
		foreach($results as $oneResult){
			if($oneResult->ordering != $i){
				$oneResult->ordering = $i;
				acymailing_updateObject( acymailing_table($this->table), $oneResult, $this->pkey);
			}
			$i++;
		}
	}

}
components/com_acymailing/classes/cpanel.php000060400000003361152453623450015324 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class cpanelClass extends acymailingClass{

	function load(){
		$query = 'SELECT * FROM '.acymailing_table('config');
		$this->values = acymailing_loadObjectList($query, 'namekey');
	}

	function get($namekey,$default = ''){
		if(isset($this->values[$namekey])) return $this->values[$namekey]->value;
		return $default;
	}

	function save($configObject){
		$query = 'REPLACE INTO '.acymailing_table('config').' (namekey,value) VALUES ';
		$params = array();
		$i = 0;
		foreach($configObject as $namekey => $value){
			if(strpos($namekey,'password') !== false && !empty($value) && trim($value,'*') == '') continue;
			$i++;
			if(is_array($value)) $value = implode(',', $value);
			if($i>100){
				$query .= implode(',',$params);
				$affected = acymailing_query($query);
				if($affected === false) return false;
				$i = 0;
				$query = 'REPLACE INTO '.acymailing_table('config').' (namekey,value) VALUES ';
				$params = array();
			}
			if (empty($this->values[$namekey])) $this->values[$namekey] = new stdClass();
			$this->values[$namekey]->value = $value;
			$params[] = '('.acymailing_escapeDB(strip_tags($namekey)).','.acymailing_escapeDB(strip_tags($value)).')';
		}
		if(empty($params)) return true;
		$query .= implode(',',$params);

		try{
			$status = acymailing_query($query);
		}catch(Exception $e){
			$status = false;
		}
		if($status === false) acymailing_display(isset($e) ? $e->getMessage() : substr(strip_tags(acymailing_getDBError()),0,200).'...','error');

		return $status;
	}

}
components/com_acymailing/classes/filter.php000060400000064310152453623450015350 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class filterClass extends acymailingClass{

	var $tables = array('filter');
	var $pkey = 'filid';
	var $report = array();
	var $subid;
	var $onlynew = false;
	var $didAnAction = false;

	function trigger($triggerName){
		if(!acymailing_level(3)) return;

		$config = acymailing_config();
		if($triggerName != 'daycron' && !$config->get('triggerfilter_'.$triggerName)) return;

		$filters = acymailing_loadObjectList("SELECT * FROM `#__acymailing_filter` WHERE `trigger` LIKE '%".acymailing_getEscaped($triggerName, true)."%' ORDER BY `filid` ASC");

		if(empty($filters) && $triggerName != 'daycron'){
			$newconfig = new stdClass();
			$name = 'triggerfilter_'.$triggerName;
			$newconfig->$name = 0;
			$config->save($newconfig);
			return;
		}
		foreach($filters as $oneFilter){
			if(empty($oneFilter->published)) continue;
			if($triggerName == 'daycron' && $oneFilter->daycron > time()) continue;
			if(!empty($oneFilter->filter)) $oneFilter->filter = unserialize($oneFilter->filter);
			if(!empty($oneFilter->action)) $oneFilter->action = unserialize($oneFilter->action);
			$this->execute($oneFilter->filter, $oneFilter->action, $oneFilter->filid);
			if($triggerName == 'daycron'){
				$newDaycron = $oneFilter->daycron+86400;
				while($newDaycron < time())	$newDaycron += 86400;
				acymailing_query('UPDATE #__acymailing_filter SET `daycron` = '.intval($newDaycron).' WHERE `filid` = '.intval($oneFilter->filid));
			}
		}
	}

	function displayFilters($filters){
		$resultFilters = array();
		if(empty($filters['type'])) return $resultFilters;
		acymailing_importPlugin('acymailing');
		foreach($filters['type'] as $block => $oneFilter) {
			if($block > 0) $resultFilters[] = ucfirst(acymailing_translation('ACY_OR'));
			foreach ($oneFilter as $num => $oneType) {
				if (empty($oneType)) continue;
				$resultFilters = array_merge($resultFilters, acymailing_trigger('onAcyDisplayFilter_' . $oneType, array($filters[$num][$oneType])));
			}
		}
		return $resultFilters;
	}

	function execute($filters, $actions, $filterID){
		if(empty($actions['type'][0])) return;

		acymailing_importPlugin('acymailing');
		$query = new acyQuery();

		$initialWhere = array();
		if(!empty($this->subid)){
			$subArray = explode(',', trim($this->subid, ','));
			acymailing_arrayToInteger($subArray);
			$initialWhere[] = 'sub.subid IN ('.implode(',', $subArray).')';
		}

		$query->removeFlag($filterID);
		if(empty($filters['type'])) {
			$query->where = $initialWhere;
		}else{
			foreach($filters['type'] as $block => $oneFilter) {
				$query->where = $initialWhere;
				foreach($oneFilter as $num => $oneType) {
					if (empty($oneType)) continue;
					$oldObject = (count($query->where) + count($query->leftjoin) + count($query->join)) . '_' . $query->limit . $query->orderBy;
					$res = acymailing_trigger('onAcyProcessFilter_' . $oneType, array(&$query, $filters[$num][$oneType], $num));
					$newObject = (count($query->where) + count($query->leftjoin) + count($query->join)) . '_' . $query->limit . $query->orderBy;
					if (count($res) == 0 && $newObject == $oldObject) {
						$query->where[] = '0 = 1';
						$this->report[] = 'Function onAcyProcessFilter_' . $oneType . ' did not add a condition, filter blocked. Maybe a plugin is missing ?';
					}
				}
				$query->addFlag($filterID);
			}
		}


		$this->didAnAction = $this->didAnAction || $query->count() > 0;
		foreach($actions['type'][0] as $num => $oneType){
			if(empty($oneType) || !isset($actions[$num][$oneType])) continue;
			$this->report = array_merge($this->report, acymailing_trigger('onAcyProcessAction_'.$oneType, array(&$query, $actions[$num][$oneType], $num)));
		}

		$query->removeFlag($filterID);
	}


	function saveForm(){
		$filter = new stdClass();
		$filter->filid = acymailing_getCID('filid');

		$formData = acymailing_getVar('array', 'data', array(), '');

		foreach($formData['filter'] as $column => $value){
			acymailing_secureField($column);
			$filter->$column = strip_tags($value);
		}

		$config = acymailing_config();
		$alltriggers = array_keys((array)acymailing_getVar('none', 'trigger'));
		$filter->trigger = implode(',', $alltriggers);
		$newConfig = new stdClass();
		foreach($alltriggers as $oneTrigger){
			$name = 'triggerfilter_'.$oneTrigger;
			if($config->get($name)) continue;
			$newConfig->$name = 1;
		}

		if(in_array('daycron', $alltriggers)){
			$newHours = acymailing_getVar('none', 'triggerhours');
			$newMinutes = acymailing_getVar('none', 'triggerminutes');
			$newTime = acymailing_getTime(date('Y').'-'.date('m').'-'.date('d').' '.$newHours.':'.$newMinutes);
			if($newTime < time()) $newTime += 86400;
			$filter->daycron = $newTime;
		}

		if(!empty($newConfig)) $config->save($newConfig);

		$data = array('action', 'filter');
		foreach($data as $oneData){
			$filter->$oneData = array();
			$formData = acymailing_getVar('none', $oneData);
			if(!empty($formData['type'])){
				$realNum = 0;
				$blockNum = 0;

				foreach($formData['type'] as $oneFilter){
					foreach($oneFilter as $num => $oneType) {
						if (empty($oneType)) continue;
						$filter->{$oneData}['type'][$blockNum][$realNum] = $oneType;
						$filter->{$oneData}[$realNum][$oneType] = $formData[$num][$oneType];
						$realNum++;
					}
					$blockNum++;
				}
			}
			$filter->$oneData = serialize($filter->$oneData);
		}

		$filid = $this->save($filter);
		if(!$filid) return false;

		acymailing_setVar('filid', $filid);
		return true;
	}

	function get($filid, $default = null){
		$query = 'SELECT a.* FROM #__acymailing_filter as a WHERE a.`filid` = '.intval($filid).' LIMIT 1';
		$filter = acymailing_loadObject($query);

		if(!empty($filter->filter)){
			$filter->filter = unserialize($filter->filter);
		}

		if(!empty($filter->action)){
			$filter->action = unserialize($filter->action);
		}

		if(!empty($filter->trigger)){
			$filter->trigger = array_flip(explode(',', $filter->trigger));
		}

		return $filter;
	}

	function countReceivers($listids, $filters, $mailid = 0){
		$result = 0;
		if(empty($listids)) return $result;

		acymailing_importPlugin('acymailing');
		acymailing_arrayToInteger($listids);

		$query = $this->initialQuery($listids, $mailid);

		if(empty($filters['type'])) return $query->count();

		foreach($filters['type'] as $block => $oneFilter) {
			$query = $this->initialQuery($listids, $mailid);
			foreach($oneFilter as $num => $oneType) {
				if (empty($oneType)) continue;
				acymailing_trigger('onAcyProcessFilter_' . $oneType, array(&$query, $filters[$num][$oneType], $num));
			}
			$result += $query->count();
		}
		return $result;
	}

	function initialQuery($listids, $mailid){
		$query = new acyQuery();

		$query->from = '#__acymailing_listsub as listsub';
		$query->join[] = '#__acymailing_subscriber as sub ON sub.subid = listsub.subid';
		$query->where[] = 'listsub.listid IN ('.implode(',', $listids).') AND listsub.status=1';
		$config = acymailing_config();
		if($config->get('require_confirmation')) $query->where[] = 'sub.confirmed = 1';
		$query->where[] = 'sub.enabled = 1 AND sub.accept = 1';

		if($this->onlynew && !empty($mailid)){
			$query->leftjoin[] = '#__acymailing_userstats as userstats ON sub.subid = userstats.subid AND userstats.mailid = '.intval($mailid);
			$query->where[] = 'userstats.subid IS NULL';
		}

		return $query;
	}

	function addJSFilterFunctions(){
		$js = "
				document.addEventListener('DOMContentLoaded', function(){ addOrBlock(); });
		 		var numBlocks = 0;
		 		var numFilters = 0;
				function addAcyFilter(addButton){
					var isNotFirst = addButton.parentNode.querySelector('.plugarea');
				
					var newdiv = document.createElement('div');
					newdiv.id = 'filter'+numFilters;
					newdiv.className = 'plugarea';
					newdiv.innerHTML = '';
					if(isNotFirst) newdiv.innerHTML += '".acymailing_translation('FILTER_AND')."';
					newdiv.innerHTML += document.getElementById('filters_original').innerHTML.replace(/__num__/g, numFilters).replace(/__block__/g, addButton.id.replace('addButton_', ''));
					
					addButton.parentNode.querySelector('.allfilters').appendChild(newdiv);
					updateFilter(numFilters);
					
					if(isNotFirst){
						var deleteCross = document.createElement('i');
						deleteCross.setAttribute('class', 'acyicon-cancel deleteFilter');
						deleteCross.onclick = function(){
							this.parentNode.remove(); 
							return false;
						}
						var sp2 = document.getElementById('filterarea_' + numFilters.toString());
						sp2.parentNode.insertBefore(deleteCross, sp2);
					}
					
					numFilters++;
				}
				
				function addOrBlock(){
					var container = document.createElement('div');
					container.className = 'onelineblockoptions';
					
					var filtersContainer = document.createElement('div');
					filtersContainer.className = 'allfilters';
					
					var addButton = document.createElement('button');
					addButton.className = 'acymailing_button';
					addButton.onclick = function(){ addAcyFilter(this);return false;};
					addButton.innerHTML = '".acymailing_translation('ADD_FILTER', true)."';
					addButton.id = 'addButton_' + numBlocks;
					
					if(numBlocks > 0){
						var deleteCross = document.createElement('i');
						deleteCross.setAttribute('class', 'acyicon-cancel deleteFilter');
						deleteCross.style.float = 'right';
						deleteCross.onclick = function(){
							this.parentNode.previousSibling.remove(); 
							this.parentNode.remove(); 
							return false;
						}
						container.appendChild(deleteCross);
					}
					
					container.appendChild(filtersContainer);
					container.appendChild(addButton);
					
					var orButton = document.getElementById('acyorbutton');
					
					if(numBlocks > 0){
						var separator = document.createElement('span');
						separator.innerHTML = '".ucfirst(acymailing_translation('ACY_OR', true))."';
						orButton.parentNode.insertBefore(separator, orButton);
					}
					orButton.parentNode.insertBefore(container, orButton);
					
					addButton.click();
					numBlocks++;
				}
				
				function countresults(num){ ";
		if(!acymailing_isAdmin()) $js .= " return; ";
		$js .= "
					if(document.getElementById('filtertype'+num).value == ''){
						document.getElementById('countresult_'+num).innerHTML = '';
						return;
					}
					document.getElementById('countresult_'+num).innerHTML = '<span class=\"onload\"></span>';
					
					var dataform = new FormData(document.getElementById('adminForm'));
					dataform.append('task', 'countresults');
					dataform.append('ctrl', 'filter');
					dataform.append('option', 'com_acymailing');
					dataform.append('num', num);
					
					dataform.append('tmpl', 'component');
					dataform.append('noheader', '1');
					
					dataform.append('page', 'acymailing_filter');
					dataform.append('action', 'acymailing_router');
					
					var xhr = new XMLHttpRequest();
					xhr.open('POST', '".acymailing_prepareAjaxURL('filter')."&task=countresults&num='+num);
					xhr.onload = function(){
						document.getElementById('countresult_'+num).innerHTML = xhr.responseText;
					};
					xhr.send(dataform);
				}

				function updateFilter(filterNum){
					currentFilterType = window.document.getElementById('filtertype'+filterNum).value;
					if(!currentFilterType){
						window.document.getElementById('filterarea_'+filterNum).innerHTML = '';
						document.getElementById('countresult_'+filterNum).innerHTML = '';
						return;
					}
					filterArea = 'filter__num__'+currentFilterType;
					window.document.getElementById('filterarea_'+filterNum).innerHTML = window.document.getElementById(filterArea).innerHTML.replace(/__num__/g,filterNum);
					if(typeof(window['onAcyDisplayFilter_'+currentFilterType]) == 'function') {
						try{ window['onAcyDisplayFilter_'+currentFilterType](filterNum); }catch(e){alert('Error in the onAcyDisplayFilter_'+currentFilterType+' function : '+e); }
					}
				}

				function displayCondFilter(fct, element, num, extra){";
		$ctrl = 'filter';
		if(!acymailing_isAdmin()) $ctrl = 'frontfilter';
		$js .= "
					var xhr = new XMLHttpRequest();
					xhr.open('GET', '".acymailing_prepareAjaxURL($ctrl)."&task=displayCondFilter&fct='+fct+'&num='+num+'&'+extra);
					xhr.onload = function(){
						document.getElementById(element).innerHTML = xhr.responseText;
						countresults(num);
					};
					xhr.send();
				}";
		acymailing_addScript(true, $js);

		$this->addDateDetailHandling();

		$eltsToClean = array('acybase_filters', 'filters_block', 'allactions', 'filtersblock');
		acymailing_removeChzn($eltsToClean);
	}

	protected function addDateDetailHandling(){
		$js = "var dateFieldSelected = null;
				function updateDateDetail(element){
					if(element.value=='relativedate'){
						document.getElementById('specificDate').style.display = 'none';
						document.getElementById('relativeDate').style.display = 'inline';
					} else if(element.value=='specificdate'){
						document.getElementById('specificDate').style.display = 'inline';
						document.getElementById('relativeDate').style.display = 'none';
					} else{
						document.getElementById('specificDate').style.display = 'none';
						document.getElementById('relativeDate').style.display = 'none';
					}
				}

				function hideDateDetail(){
					document.getElementById('dateDetails').style.display = 'none';
				}

				function validateDateField(){
					if(document.getElementById('dateDetail_typerelativedate').checked == true){
						dateVal = '{time}';
						if(document.getElementById('dateDetail_delay').value != 0){
							if(document.getElementById('dateDetail_operator').value == 'before'){
								dateVal += '-';
							} else{
								dateVal += '+';
							}
							if(document.getElementById('dateDetail_length').value == 'minutes'){
								dateVal += document.getElementById('dateDetail_delay').value * 60;
							} else if(document.getElementById('dateDetail_length').value == 'hours'){
								dateVal += document.getElementById('dateDetail_delay').value * 3600;
							} else{
								dateVal += document.getElementById('dateDetail_delay').value * 24 * 3600;
							}
						}
						dateFieldSelected.value = dateVal;
					} else{
						year = document.getElementById('dateDetail_year').value;
						month = document.getElementById('dateDetail_month').value;
						day = document.getElementById('dateDetail_day').value;
						dateFieldSelected.value = year+'-'+month+'-'+day;
					}
					hideDateDetail();
					if(dateFieldSelected.name.substr(0,6) == 'filter'){ dateFieldSelected.onchange(); }
				}

				function displayDatePicker(element,e){
					dateFieldSelected = element;
					try{
						currentVal = element.value;
						if(currentVal.substr(0,6) == '{time}'){
							toggleDateBtn('relative');
							if(currentVal == '{time}'){
								document.getElementById('dateDetail_delay').value = 0;
								document.getElementById('dateDetail_operator').value = 'before';
								document.getElementById('dateDetail_length').value = 'minutes';
							} else{
								currentOperator = currentVal.substr(6,1);
								currentNumber = currentVal.substr(7);
								if(currentNumber/86400 === parseInt(currentNumber/86400)){
									document.getElementById('dateDetail_delay').value = parseInt(currentNumber/86400);
									document.getElementById('dateDetail_length').value = 'days';
								} else if(currentNumber/3600 === parseInt(currentNumber/3600) ){
									document.getElementById('dateDetail_delay').value = parseInt(currentNumber/3600);
									document.getElementById('dateDetail_length').value = 'hours';
								} else{
									document.getElementById('dateDetail_delay').value = parseInt(currentNumber/60);
									document.getElementById('dateDetail_length').value = 'minutes';
								}
								if(currentOperator == '-'){
									document.getElementById('dateDetail_operator').value = 'before';
								} else{
									document.getElementById('dateDetail_operator').value = 'after'
								}
							}
							dateTmp = new Date();
							document.getElementById('dateDetail_year').value = dateTmp.getFullYear();
							month = dateTmp.getMonth() + 1;
							if(month < 10){ month = '0'+ month; }
							document.getElementById('dateDetail_month').value = month;
							if(dateTmp.getDate() < 10){ day = '0'+ dateTmp.getDate(); }
							else{ day = dateTmp.getDate();}
							document.getElementById('dateDetail_day').value = day;
						} else{
							toggleDateBtn('specific');
							if(currentVal == '' || currentVal == parseInt(currentVal)){
								if(currentVal == ''){ dateTmp = new Date();}
								else{ dateTmp = new Date(1000*currentVal); }
								document.getElementById('dateDetail_year').value = dateTmp.getFullYear();
								month = dateTmp.getMonth() + 1;
								if(month < 10){ month = '0'+ month; }
								document.getElementById('dateDetail_month').value = month;
								if(dateTmp.getDate() < 10){ day = '0'+ dateTmp.getDate(); }
								else{ day = dateTmp.getDate();}
								document.getElementById('dateDetail_day').value = day;
							} else{
								document.getElementById('dateDetail_year').value = currentVal.substr(0,4);
								document.getElementById('dateDetail_month').value = currentVal.substr(5,2);
								document.getElementById('dateDetail_day').value = currentVal.substr(8,2);
							}
						}

						document.getElementById('dateDetails').style.left = e.clientX + 'px';
						document.getElementById('dateDetails').style.top = e.clientY + 20 + 'px';
					}catch(err){
						document.getElementById('dateDetails').style.left = e.x+'px';
						document.getElementById('dateDetails').style.top = e.y+20+'px';
					}

					document.getElementById('dateDetails').style.display = 'block';
				}

				function toggleDateBtn(btnToActive){
					if(btnToActive == 'specific'){
						if(typeof jQuery != 'undefined'){
							jQuery('#dateDetail_typefieldset label[for=dateDetail_typespecificdate]').click();
							jQuery('#dateDetail_typespecificdate').click();
						}else{
							document.getElementById('dateDetail_typerelativedate').checked='';
							document.getElementById('dateDetail_typespecificdate').checked='checked';
						}
						document.getElementById('specificDate').style.display = 'inline';
						document.getElementById('relativeDate').style.display = 'none';
					} else{
						if(typeof jQuery != 'undefined'){
							jQuery('#dateDetail_type label[for=dateDetail_typerelativedate]').click();
							jQuery('#dateDetail_typerelativedate').click();
						}else{
							document.getElementById('dateDetail_typerelativedate').checked='checked';
							document.getElementById('dateDetail_typespecificdate').checked='';
						}
						document.getElementById('specificDate').style.display = 'none';
						document.getElementById('relativeDate').style.display = 'inline';
					}
				}";

		acymailing_addScript(true, $js);

		$dateDetails = '<div id="dateDetails" style="display:none;z-index: 60;">';
		$dateTypeData = array();
		$dateTypeData[] = acymailing_selectOption('relativedate', acymailing_translation('ACY_RELATIVE_DATE'));
		$dateTypeData[] = acymailing_selectOption('specificdate', acymailing_translation('ACY_SPECIFIC_DATE'));
		$dateDetails .= '<div class="dateDetailType">'.acymailing_radio($dateTypeData, 'dateDetail_type', 'onchange="updateDateDetail(this);"', 'value', 'text', 'relativedate', 'dateDetail_type').'</div>';
		$dateDetails .= '<div id="relativeDate">';
		$dateDetails .= '<input type="text" name="dateDetail_delay" id="dateDetail_delay" size="5" style="width:30px" value="0" pattern="[0-9]*"> ';
		$tempData = array();
		$tempData[] = acymailing_selectOption('minutes', acymailing_translation('ACY_MINUTES'));
		$tempData[] = acymailing_selectOption('hours', acymailing_translation('HOURS'));
		$tempData[] = acymailing_selectOption('days', acymailing_translation('DAYS'));
		$dateDetails .= acymailing_select($tempData, 'dateDetail_length', 'style="width:100px"', 'value', 'text');
		$tempData = array();
		$tempData[] = acymailing_selectOption('before', acymailing_translation('ACY_BEFORE'));
		$tempData[] = acymailing_selectOption('after', acymailing_translation('ACY_AFTER'));
		$dateDetails .= acymailing_select($tempData, 'dateDetail_operator', 'style="width:100px"', 'value', 'text');
		$dateDetails .= ' '.acymailing_translation('ACY_EXECUTION_TIME');
		$dateDetails .= '</div>';
		$dateDetails .= '<div id="specificDate" style="display:none;">';
		$tempData = array();
		$currentYear = (int)date('Y');
		for($i = 1970; $i <= $currentYear + 5; $i++){
			$tempData[] = acymailing_selectOption($i, $i);
		}
		$dateDetails .= acymailing_select($tempData, 'dateDetail_year', 'style="width:80px"', 'value', 'text');
		$tempData = array();
		for($i = 1; $i < 13; $i++){
			$monthVal = ($i < 10 ? '0'.$i : $i);
			$tempData[] = acymailing_selectOption($monthVal, $monthVal);
		}
		$dateDetails .= acymailing_select($tempData, 'dateDetail_month', 'style="width:60px"', 'value', 'text');
		$tempData = array();
		for($i = 1; $i < 32; $i++){
			$dayVal = ($i < 10 ? '0'.$i : $i);
			$tempData[] = acymailing_selectOption($dayVal, $dayVal);
		}
		$dateDetails .= acymailing_select($tempData, 'dateDetail_day', 'style="width:60px"', 'value', 'text');
		$dateDetails .= '</div>';
		$dateDetails .= '<div class="dateBtn"><input type="button" onClick="hideDateDetail();" class="btn btn-danger" value="'.acymailing_translation('ACY_CANCEL').'"> <input type="button" onClick="validateDateField();" class="btn btn-success" value="'.acymailing_translation('ACY_OK').'"></div>';
		$dateDetails .= '</div>';
		echo($dateDetails);
	}
}

class acyQuery{
	var $leftjoin = array();
	var $join = array();
	var $where = array();
	var $from = '#__acymailing_subscriber as sub';
	var $limit = '';
	var $orderBy = '';

	function __construct(){
		if('joomla' == 'joomla')	$this->db = JFactory::getDBO();
	}

	function count(){
		$myquery = $this->getQuery(array('COUNT(DISTINCT sub.subid)'));
		return acymailing_loadResult($myquery);
	}

	function getQuery($select = array()){
		$query = '';
		if(!empty($select)) $query .= ' SELECT DISTINCT '.implode(',', $select);
		if(!empty($this->from)) $query .= ' FROM '.$this->from;
		if(!empty($this->join)) $query .= ' JOIN '.implode(' JOIN ', $this->join);
		if(!empty($this->leftjoin)) $query .= ' LEFT JOIN '.implode(' LEFT JOIN ', $this->leftjoin);
		if(!empty($this->where)) $query .= ' WHERE ('.implode(') AND (', $this->where).')';
		if(!empty($this->orderBy)) $query .= ' ORDER BY '.$this->orderBy;
		if(!empty($this->limit)) $query .= ' LIMIT '.$this->limit;

		return $query;
	}

	function convertQuery($as, $column, $operator, $value, $type = ''){

		$operator = str_replace(array('&lt;', '&gt;'), array('<', '>'), $operator);

		if($operator == 'CONTAINS'){
			$operator = 'LIKE';
			$value = '%'.$value.'%';
		}elseif($operator == 'BEGINS'){
			$operator = 'LIKE';
			$value = $value.'%';
		}elseif($operator == 'END'){
			$operator = 'LIKE';
			$value = '%'.$value;
		}elseif($operator == 'NOTCONTAINS'){
			$operator = 'NOT LIKE';
			$value = '%'.$value.'%';
		}elseif($operator == 'REGEXP'){
			if($value === '') return '1 = 1';
		}elseif($operator == 'NOT REGEXP'){
			if($value === '') return '0 = 1';
		}elseif(!in_array($operator, array('IS NULL', 'IS NOT NULL', 'NOT LIKE', 'LIKE', '=', '!=', '>', '<', '>=', '<='))){
			die('Operator not safe : '.$operator);
		}

		if(strpos($value, '{time}') !== false){
			$value = acymailing_replaceDate($value);
			$value = strftime('%Y-%m-%d %H:%M:%S', $value);
		}

		$replace = array('{year}', '{month}', '{weekday}', '{day}');
		$replaceBy = array(date('Y'), date('m'), date('N'), date('d'));
		$value = str_replace($replace, $replaceBy, $value);

		if(preg_match_all('#{(year|month|weekday|day)\|(add|remove):([^}]*)}#Uis', $value, $results)){

			foreach($results[0] as $i => $oneMatch){
				$format = str_replace(array('year', 'month', 'weekday', 'day'), array('Y', 'm', 'N', 'd'), $results[1][$i]);
				$delay = str_replace(array('add', 'remove'), array('+', '-'), $results[2][$i]).intval($results[3][$i]).' '.str_replace('weekday', 'day', $results[1][$i]);
				$value = str_replace($oneMatch, date($format, strtotime($delay)), $value);
			}
		}

		if(!is_numeric($value) OR in_array($operator, array('REGEXP', 'NOT REGEXP', 'NOT LIKE', 'LIKE', '=', '!='))){
			$value = acymailing_escapeDB($value);
		}

		if(in_array($operator, array('IS NULL', 'IS NOT NULL'))){
			$value = '';
		}

		if($type == 'datetime' && in_array($operator, array('=', '!='))){
			return 'DATE_FORMAT('.$as.'.`'.acymailing_secureField($column).'`, "%Y-%m-%d") '.$operator.' '.'DATE_FORMAT('.$value.', "%Y-%m-%d")';
		}
		if($type == 'timestamp' && in_array($operator, array('=', '!='))){
			return 'FROM_UNIXTIME('.$as.'.`'.acymailing_secureField($column).'`, "%Y-%m-%d") '.$operator.' '.'FROM_UNIXTIME('.$value.', "%Y-%m-%d")';
		}
		return $as.'.`'.acymailing_secureField($column).'` '.$operator.' '.$value;
	}

	function addFlag($id){
		if(!empty($this->orderBy) || !empty($this->limit)) {
			$flagQuery = 'UPDATE ' . acymailing_table('subscriber');
			$flagQuery .= ' SET filterflags = CONCAT(filterflags, "f' . intval($id) . 'f")';
			$flagQuery .= ' WHERE subid IN (
			SELECT subid FROM (SELECT sub.subid FROM ' . acymailing_table('subscriber') . ' AS sub';
			if(!empty($this->join)) $flagQuery .= ' JOIN ' . implode(' JOIN ', $this->join);
			if(!empty($this->leftjoin)) $flagQuery .= ' LEFT JOIN ' . implode(' LEFT JOIN ', $this->leftjoin);
			if(!empty($this->where)) $flagQuery .= ' WHERE (' . implode(') AND (', $this->where) . ')';
			if(!empty($this->orderBy)) $flagQuery .= ' ORDER BY ' . $this->orderBy;
			if(!empty($this->limit)) $flagQuery .= ' LIMIT ' . $this->limit;
			$flagQuery .= ') tmp);';
		}else{
			$flagQuery = 'UPDATE ' . acymailing_table('subscriber') . ' AS sub ';
			if(!empty($this->join)) $flagQuery .= ' JOIN ' . implode(' JOIN ', $this->join);
			if(!empty($this->leftjoin)) $flagQuery .= ' LEFT JOIN ' . implode(' LEFT JOIN ', $this->leftjoin);
			$flagQuery .= ' SET sub.filterflags = CONCAT(sub.filterflags, "f' . intval($id) . 'f")';
			if(!empty($this->where)) $flagQuery .= ' WHERE (' . implode(') AND (', $this->where) . ')';
		}
		acymailing_query($flagQuery);

		$this->join = array();
		$this->leftjoin = array();
		$this->where = array('sub.filterflags LIKE "%f'.intval($id).'f%"');
		$this->orderBy = '';
		$this->limit = '';
	}

	function removeFlag($id){
		acymailing_query('UPDATE '.acymailing_table('subscriber').' SET filterflags = REPLACE(filterflags, "f'.intval($id).'f", "") WHERE filterflags LIKE "%f'.intval($id).'f%"');
	}
}
components/com_acymailing/classes/subscriber.php000060400000053147152453623450016234 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class subscriberClass extends acymailingClass{

	var $tables = array('listsub', 'userstats', 'queue', 'history', 'subscriber');
	var $pkey = 'subid';
	var $namekey = 'email';
	var $restrictedFields = array('subid', 'key', 'confirmed', 'enabled', 'ip', 'userid', 'created');
	var $errors = array();
	var $checkVisitor = true;
	var $checkAccess = true;
	var $sendConf = true;
	var $forceConf = false;
	var $requireId = false;
	var $newUser = null;
	var $confirmationSent = false;
	var $sendNotif = true;
	var $sendWelcome = true;
	var $recordHistory = false;
	var $allowModif = false;
	var $extendedEmailVerif = false;

	var $userForNotification;
	var $triggerFilterBE = false;

	var $geolocRight = false;
	var $geolocData = null;


	function save($subscriber){
		$config = acymailing_config();
		acymailing_importPlugin('acymailing');

		if(isset($subscriber->email)){
			$subscriber->email = strtolower($subscriber->email);
			$userHelper = acymailing_get('helper.user');
			if(!$userHelper->validEmail($subscriber->email, $this->extendedEmailVerif)){
				echo "<script>alert('".acymailing_translation('VALID_EMAIL', true)."'); window.history.go(-1);</script>";
				exit;
			}
		}
		if(empty($subscriber->subid)){
			$currentUserid = acymailing_currentUserId();
			$currentEmail = acymailing_currentUserEmail();
			if($this->checkVisitor && !acymailing_isAdmin() && (int)$config->get('allow_visitor', 1) != 1 && (empty($currentUserid) OR strtolower($currentEmail) != $subscriber->email)){
				echo "<script> alert('".acymailing_translation('ONLY_LOGGED', true)."'); window.history.go(-1);</script>\n";
				exit;
			}
			if(empty($subscriber->email)) return false;
			$subscriber->subid = $this->subid($subscriber->email);
		}

		if(empty($subscriber->subid)){
			if(empty($subscriber->created)) $subscriber->created = time();
			if(empty($subscriber->ip)){
				$ipClass = acymailing_get('helper.user');
				$subscriber->ip = $ipClass->getIP();
			}

			$source = acymailing_getVar('cmd', 'acy_source');
			if(empty($subscriber->source) && !empty($source)) $subscriber->source = $source;

			if(empty($subscriber->name) && $config->get('generate_name', 1)) $subscriber->name = ucwords(trim(str_replace(array('.', '_', ')', ',', '(', '-', 1, 2, 3, 4, 5, 6, 7, 8, 9, 0), ' ', substr($subscriber->email, 0, strpos($subscriber->email, '@')))));
			$subscriber->key = acymailing_generateKey(14);
			acymailing_trigger('onAcyBeforeUserCreate', array(&$subscriber));
			$status = acymailing_insertObject(acymailing_table('subscriber'), $subscriber);
		}else{
			if(count((array)$subscriber) > 1){
				acymailing_trigger('onAcyBeforeUserModify', array(&$subscriber));
				$status = acymailing_updateObject(acymailing_table('subscriber'), $subscriber, 'subid');
			}else{
				$status = true;
			}
		}

		if(!$status) return false;

		$subid = empty($subscriber->subid) ? $status : $subscriber->subid;

		if($this->triggerFilterBE || !acymailing_isAdmin()){
			$filterClass = acymailing_get('class.filter');
			$filterClass->subid = $subid;
			$filterClass->trigger((empty($subscriber->subid) ? 'subcreate' : 'subchange'));
		}

		$classGeoloc = acymailing_get('class.geolocation');
		if(empty($subscriber->subid)){
			$subscriber->subid = $subid;

			if($this->geolocRight){
				$this->geolocData = $classGeoloc->saveGeolocation('creation', $subscriber->subid);
			}

			$this->userForNotification = $subscriber;
			$resultsTrigger = acymailing_trigger('onAcyUserCreate', array(&$subscriber));
			$this->recordHistory = true;
			$action = 'created';
		}else{
			if($this->geolocRight){
				$this->geolocData = $classGeoloc->saveGeolocation('modify', $subscriber->subid);
			}

			$resultsTrigger = acymailing_trigger('onAcyUserModify', array($subscriber));
			$action = 'modified';
		}

		if($this->recordHistory){
			$historyClass = acymailing_get('class.acyhistory');
			$historyClass->insert($subscriber->subid, $action);
			$this->recordHistory = false;
		}

		if($this->forceConf || (!acymailing_isAdmin() AND $this->sendConf)){
			$this->sendConf($subid);
		}

		return $subid;
	}

	function sendNotification(){
		if(empty($this->userForNotification)) return;
		$subscriber = $this->userForNotification;
		unset($this->userForNotification);

		$config = acymailing_config();
		$notifyUsers = $config->get('notification_created');
		if(acymailing_isAdmin() || empty($notifyUsers)) return;

		$mailer = acymailing_get('helper.mailer');
		$mailer->report = false;
		$mailer->autoAddUser = true;
		$mailer->checkConfirmField = false;
		foreach($subscriber as $map => $value){
			$mailer->addParam('user:'.$map, $value);
		}

		$mailer->addParam('action', acymailing_translation('ACY_NEW'));

		if(!empty($subscriber->subid)){
			$listSubClass = acymailing_get('class.listsub');
			$mailer->addParam('user:subscription', $listSubClass->getSubscriptionString($subscriber->subid));
			$mailer->addParam('user:subscriptiondates', $listSubClass->getSubscriptionString($subscriber->subid, true));
		}

		if(!empty($this->geolocData)){
			foreach($this->geolocData as $map => $value){
				$mailer->addParam('geoloc:notif_'.$map, $value);
			}
		}

		$mailer->addParamInfo();

		$allUsers = explode(' ', trim(str_replace(array(';', ','), ' ', $notifyUsers)));
		foreach($allUsers as $oneUser){
			if(empty($oneUser)) continue;
			$mailer->sendOne('notification_created', $oneUser);
		}
	}

	function sendConf($subid){
		if($this->confirmationSent) return false;

		$myuser = $this->get($subid);
		$config = acymailing_config();
		if(!empty($myuser->confirmed)) return false;

		if(!$config->get('require_confirmation', false)) return false;

		$mailClass = acymailing_get('helper.mailer');
		$mailClass->checkConfirmField = false;
		$mailClass->checkEnabled = false;
		$mailClass->checkAccept = false;
		$mailClass->report = $config->get('confirm_message', 0);
		$alias = "confirmation";
		if(acymailing_getVar('cmd', 'acy_source')){
			$sourceparams = explode('_', acymailing_getVar('cmd', 'acy_source'));
			$alias = acymailing_loadResult('SELECT alias FROM #__acymailing_mail WHERE published = 1 AND alias IN ("confirmation",'.acymailing_escapeDB('confirmation-'.$sourceparams[0]).','.acymailing_escapeDB('confirmation-'.$sourceparams[0].'-'.@$sourceparams[1]).','.acymailing_escapeDB('confirmation-'.$sourceparams[0].'-'.@$sourceparams[1].'-'.@$sourceparams[2]).') ORDER BY alias DESC');
		}

		$this->confirmationSentSuccess = $mailClass->sendOne($alias, $myuser);
		$this->confirmationSentError = $mailClass->reportMessage;
		$this->confirmationSent = true;
		return true;
	}

	function subid($email){
		if(is_numeric($email)){
			$cond = ' userid = '.$email;
		}else{
			if(!empty($email)) $email = acymailing_punycode($email);
			$cond = 'email = '.acymailing_escapeDB(trim($email));
		}
		return acymailing_loadResult('SELECT subid FROM '.acymailing_table('subscriber').' WHERE '.$cond);
	}


	function get($subid, $default = null){
		if(is_numeric($subid)){
			$column = 'subid';
		}else{
			$column = 'email';
			if(!empty($subid)) $subid = acymailing_punycode($subid);
		}
		return acymailing_loadObject('SELECT * FROM '.acymailing_table('subscriber').' WHERE '.$column.' = '.acymailing_escapeDB(trim($subid)).' LIMIT 1');
	}

	function getFull($subid){
		if(is_numeric($subid)){
			$column = 'subid';
		}else{
			$column = 'email';
			if(!empty($subid)) $subid = acymailing_punycode($subid);
		}
		return acymailing_loadObject('SELECT b.'.$this->cmsUserVars->username.' AS username, a.* FROM '.acymailing_table('subscriber').' as a LEFT JOIN '.acymailing_table($this->cmsUserVars->table, false).' as b on a.userid = b.'.$this->cmsUserVars->id.' WHERE '.$column.' = '.acymailing_escapeDB(trim($subid)).' LIMIT 1');
	}

	function getFrontendSubscription($subid, $index = ''){
		$subscription = $this->getSubscription($subid, $index);
		$copyAllLists = $subscription;
		$currentUserid = acymailing_currentUserId();
		foreach($copyAllLists as $id => $oneList){
			if(!$oneList->published OR empty($currentUserid)){
				unset($subscription[$id]);
				continue;
			}
			if($currentUserid == (int)$oneList->userid) continue;
			if(!acymailing_isAllowed($oneList->access_manage)){
				unset($subscription[$id]);
				continue;
			}
		}

		return $subscription;
	}

	function getSubscription($subid, $index = ''){
		$query = 'SELECT a.*, b.* FROM '.acymailing_table('list').' as b ';
		$query .= 'LEFT JOIN '.acymailing_table('listsub').' as a on a.listid = b.listid AND a.subid = '.intval($subid);
		$query .= ' WHERE b.type = \'list\'';
		$query .= ' ORDER BY b.ordering ASC';
		return acymailing_loadObjectList($query, $index);
	}

	function getSubscriptionStatus($subid, $listids = null){
		$query = 'SELECT status,listid FROM '.acymailing_table('listsub').' WHERE subid = '.intval($subid);
		if(!empty($listids)){
			acymailing_arrayToInteger($listids);
			$query .= ' AND listid IN ('.implode(',', $listids).')';
		}
		return acymailing_loadObjectList($query, 'listid');
	}

	function checkFields(&$data, &$subscriber){

		foreach($data as $column => $value){
			$column = trim(strtolower($column));
			if($this->allowModif || !in_array($column, $this->restrictedFields)){
				acymailing_secureField($column);
				if(is_array($value)){
					if(isset($value['day']) || isset($value['month']) || isset($value['year'])){
						$value = (empty($value['year']) ? '0000' : intval($value['year'])).'-'.(empty($value['month']) ? '00' : $value['month']).'-'.(empty($value['day']) ? '00' : $value['day']);
					}else{
						$value = implode(',', $value);
					}
				}

				$subscriber->$column = trim(strip_tags($value));

				if(!is_numeric($subscriber->$column)){
					if(function_exists('mb_detect_encoding') && mb_detect_encoding($subscriber->$column, 'UTF-8', true) != 'UTF-8'){
						$subscriber->$column = utf8_encode($subscriber->$column);
					}elseif(!function_exists('mb_detect_encoding') && !preg_match('%^(?:[\x09\x0A\x0D\x20-\x7E]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})*$%xs', $subscriber->$column)){
						$subscriber->$column = utf8_encode($subscriber->$column);
					}
				}
			}
		}

		if(!acymailing_level(3) || empty($_FILES)) return;

		
		$config = acymailing_config();
		$uploadFolder = trim(acymailing_cleanPath(html_entity_decode(acymailing_getFilesFolder())), DS.' ').DS;
		$uploadPath = acymailing_cleanPath(ACYMAILING_ROOT.$uploadFolder.'userfiles'.DS);
		acymailing_createDir(acymailing_cleanPath(ACYMAILING_ROOT.$uploadFolder), true);
		acymailing_createDir($uploadPath, true);


		foreach($_FILES as $typename => $type){
			$type2 = isset($type['name']['subscriber']) ? $type['name']['subscriber'] : $type['name'];
			if(empty($type2) || !is_array($type2)) continue;
			foreach($type2 as $fieldname => $filename){
				if(empty($filename)) continue;
				acymailing_secureField($fieldname);
				$attachment = new stdClass();
				$filename = acymailing_makeSafeFile(strtolower(strip_tags($filename)));
				$attachment->filename = time().rand(1, 999).'_'.$filename;
				while(file_exists($uploadPath.$attachment->filename)){
					$attachment->filename = time().rand(1, 999).'_'.$filename;
				}

				if(!preg_match('#\.('.str_replace(array(',', '.'), array('|', '\.'), $config->get('allowedfiles')).')$#Ui', $attachment->filename, $extension) || preg_match('#\.(php.?|.?htm.?|pl|py|jsp|asp|sh|cgi)#Ui', $attachment->filename)){
					echo "<script>alert('".acymailing_translation_sprintf('ACCEPTED_TYPE', substr($attachment->filename, strrpos($attachment->filename, '.') + 1), $config->get('allowedfiles'))."');window.history.go(-1);</script>";
					exit;
				}
				$attachment->filename = str_replace(array('.', ' '), '_', substr($attachment->filename, 0, strpos($attachment->filename, $extension[0]))).$extension[0];

				$tmpFile = isset($type['name']['subscriber']) ? $_FILES[$typename]['tmp_name']['subscriber'][$fieldname] : $_FILES[$typename]['tmp_name'][$fieldname];
				if(!acymailing_uploadFile($tmpFile, $uploadPath.$attachment->filename)){
					echo "<script>alert('".acymailing_translation_sprintf('FAIL_UPLOAD', '<b><i>'.$tmpFile.'</i></b>', '<b><i>'.$uploadPath.$attachment->filename.'</i></b>')."');window.history.go(-1);</script>";
					exit;
				}

				$subscriber->$fieldname = $attachment->filename;
			}
		}
	}

	function saveForm(){
		$config = acymailing_config();
		$allowUserModifications = (bool)($config->get('allow_modif', 'data') == 'all') || $this->allowModif;
		$allowSubscriptionModifications = (bool)($config->get('allow_modif', 'data') != 'none') || $this->allowModif;

		$subscriber = new stdClass();
		$subscriber->subid = acymailing_getCID('subid');

		if(!$this->allowModif && !empty($subscriber->subid)){
			$user = $this->identify();
			$allowUserModifications = true;
			$allowSubscriptionModifications = true;
			if($user->subid != $subscriber->subid){
				die('You are not allowed to modify this user');
			}
		}

		$formData = acymailing_getVar('array', 'data', array(), '');
		if(!empty($formData['subscriber'])){
			$this->checkFields($formData['subscriber'], $subscriber);
		}

		if(!empty($subscriber->email)) $subscriber->email = acymailing_punycode($subscriber->email);

		if(empty($subscriber->subid)){
			if(empty($subscriber->email)){
				echo "<script>alert('".acymailing_translation('VALID_EMAIL', true)."'); window.history.go(-1);</script>";
				exit;
			}
		}

		if(!empty($subscriber->email)){
			$existSubscriber = acymailing_loadObject('SELECT * FROM #__acymailing_subscriber WHERE email = '.acymailing_escapeDB($subscriber->email).' AND subid != '.intval(@$subscriber->subid));
			if(!empty($existSubscriber->subid)){
				$overwritenow = true;
				if($this->allowModif){
					if(acymailing_isAdmin()){
						$overwritenow = false;
					}else{
						$listClass = acymailing_get('class.list');
						$allowedLists = $listClass->getFrontendLists('listid');
						if(empty($allowedLists)){
							$this->errors[] = "Not sure how you were able to edit this user if you don't own any list...";
							return false;
						}
						$allowedlistid = acymailing_loadResult('SELECT listid FROM #__acymailing_listsub WHERE subid = '.intval($existSubscriber->subid).' AND listid IN ('.implode(',', array_keys($allowedLists)).')');
						if(!empty($allowedlistid)) $overwritenow = false;
					}
				}

				if($overwritenow){
					$subscriber->subid = $existSubscriber->subid;
					$subscriber->confirmed = $existSubscriber->confirmed;
				}else{
					$this->errors[] = acymailing_translation_sprintf('USER_ALREADY_EXISTS', $subscriber->email);
					$this->errors[] = '<a href="'.acymailing_completeLink((acymailing_isAdmin() ? 'subscriber' : 'frontsubscriber&listid='.$allowedlistid).'&task=edit&subid='.$existSubscriber->subid).'" >'.acymailing_translation('CLICK_EDIT_USER').'</a>';
					return false;
				}
			}
		}

		if(!$this->allowModif && !empty($subscriber->subid) && !empty($subscriber->email)){
			$existSubscriber = $this->get($subscriber->subid);
			if(trim(strtolower($subscriber->email)) != strtolower($existSubscriber->email)){
				$subscriber->confirmed = 0;
			}
		}

		$this->recordHistory = true;
		$this->newUser = empty($subscriber->subid) ? true : false;
		if(empty($subscriber->subid) OR $allowUserModifications){
			if(isset($subscriber->html) && $subscriber->html != 1) $subscriber->html = 0;
			if(isset($subscriber->confirmed) && $subscriber->confirmed != 1) $subscriber->confirmed = 0;
			if(isset($subscriber->enabled) && $subscriber->enabled != 1) $subscriber->enabled = 0;
			if(isset($subscriber->accept) && $subscriber->accept != 1) $subscriber->accept = 0;
			$subid = $this->save($subscriber);
			$allowSubscriptionModifications = true;
		}else{
			$subid = $subscriber->subid;
			if(isset($subscriber->confirmed) && empty($subscriber->confirmed)) $this->sendConf($subid);
		}
		acymailing_setVar('subid', $subid);

		if(empty($subid)) return false;

		if(!$this->allowModif && isset($subscriber->accept) && $subscriber->accept == 0) $formData['masterunsub'] = 1;

		if(!acymailing_isAdmin()){
			$hiddenlistsString = acymailing_getVar('string', 'hiddenlists', '');
			if(!empty($hiddenlistsString)){
				$hiddenlists = explode(',', $hiddenlistsString);
				acymailing_arrayToInteger($hiddenlists);
				foreach($hiddenlists as $oneListId){
					$formData['listsub'][$oneListId] = array('status' => 1);
				}
			}
		}

		if(empty($formData['listsub'])) return true;

		if(!$allowSubscriptionModifications){
			$mailClass = acymailing_get('helper.mailer');
			$mailClass->checkConfirmField = false;
			$mailClass->checkEnabled = false;
			$mailClass->report = false;
			$mailClass->sendOne('modif', $subid);
			$this->requireId = true;
			return false;
		}
		$subscriptionSaved = $this->saveSubscription($subid, $formData['listsub']);

		$notifContact = $config->get('notification_contact_menu');
		if(!empty($notifContact) && !acymailing_isAdmin()){
			$userHelper = acymailing_get('helper.user');
			$mailer = acymailing_get('helper.mailer');
			$listsubClass = acymailing_get('class.listsub');
			$mailer->autoAddUser = true;
			$mailer->checkConfirmField = false;
			$mailer->report = false;
			foreach($subscriber as $field => $value) $mailer->addParam('user:'.$field, $value);
			if(empty($subscriber->email)){
				$myUser = $this->get($subscriber->subid);
				$mailer->addParam('user:name', $myUser->name);
				$mailer->addParam('user:email', $myUser->email);
			}
			$mailer->addParam('user:subscription', $listsubClass->getSubscriptionString($subscriber->subid));
			$mailer->addParam('user:subscriptiondates', $listsubClass->getSubscriptionString($subscriber->subid, true));
			$mailer->addParam('user:ip', $userHelper->getIP());
			if(!empty($this->geolocData)){
				foreach($this->geolocData as $map => $value){
					$mailer->addParam('geoloc:notif_'.$map, $value);
				}
			}
			$mailer->addParamInfo();
			$allUsers = explode(' ', trim(str_replace(array(';', ','), ' ', $notifContact)));
			foreach($allUsers as $oneUser){
				if(empty($oneUser)) continue;
				$mailer->sendOne('notification_contact_menu', $oneUser);
			}
		}
		return $subscriptionSaved;
	}

	function saveSubscription($subid, $formlists){

		$addlists = array();
		$removelists = array();
		$updatelists = array();

		$listids = array_keys($formlists);
		$currentSubscription = $this->getSubscriptionStatus($subid, $listids);

		foreach($formlists as $listid => $oneList){
			if(empty($oneList['status'])){
				if(isset($currentSubscription[$listid])) $removelists[] = $listid;
				continue;
			}

			if($this->confirmationSent && $oneList['status'] == 1) $oneList['status'] = 2;

			if(!isset($currentSubscription[$listid])){
				if($oneList['status'] != -1) $addlists[$oneList['status']][] = $listid;

				continue;
			}

			if($currentSubscription[$listid]->status == $oneList['status']) continue;

			if($currentSubscription[$listid]->status == 1 && $oneList['status'] == 2 && !$this->allowModif) continue;

			$updatelists[$oneList['status']][] = $listid;
		}

		$listsubClass = acymailing_get('class.listsub');
		$listsubClass->checkAccess = $this->checkAccess;
		$status = true;
		if(!empty($updatelists)) $status = $listsubClass->updateSubscription($subid, $updatelists) && $status;
		if(!empty($removelists)) $status = $listsubClass->removeSubscription($subid, $removelists) && $status;
		if(!empty($addlists)) $status = $listsubClass->addSubscription($subid, $addlists) && $status;

		return $status;
	}

	function confirmSubscription($subid){

		$historyClass = acymailing_get('class.acyhistory');
		$historyClass->insert($subid, 'confirmed');

		$userHelper = acymailing_get('helper.user');
		$ip = $userHelper->getIP();

		$res = acymailing_query('UPDATE '.acymailing_table('subscriber').' SET `confirmed` = 1, `confirmed_date` = '.time().', `confirmed_ip` = '.acymailing_escapeDB($ip).' WHERE `subid` = '.intval($subid).' LIMIT 1');
		if($res === false){
			acymailing_display('Please contact the admin of this website with the error message :<br />'.substr(strip_tags(acymailing_getDBError()), 0, 200).'...', 'error');
			exit;
		}

		$listids = acymailing_loadResultArray('SELECT `listid` FROM '.acymailing_table('listsub').' WHERE `status` = 2 AND `subid` = '.intval($subid));

		acymailing_importPlugin('acymailing');
		acymailing_trigger('onAcyConfirmUser', array($subid));

		if($this->geolocRight){
			$classGeoloc = acymailing_get('class.geolocation');
			$this->geolocData = $classGeoloc->saveGeolocation('confirm', $subid);
		}

		if(empty($listids)) return;

		$listsubClass = acymailing_get('class.listsub');
		$listsubClass->sendConf = $this->sendWelcome;
		$listsubClass->forceConf = $this->forceConf;
		$listsubClass->sendNotif = $this->sendNotif;
		$listsubClass->updateSubscription($subid, array(1 => $listids));
	}

	function identify($onlyvalue = false){
		$subid = acymailing_getVar('int', "subid", 0);
		$key = acymailing_getVar('string', "key", '');

		if(empty($subid) OR empty($key)){
			$currentUserid = acymailing_currentUserId();
			if(!empty($currentUserid)){
				$userIdentified = $this->get(acymailing_currentUserEmail());
				return $userIdentified;
			}
			if(!$onlyvalue){
				acymailing_enqueueMessage(acymailing_translation('ASK_LOG'), 'error');
			}
			return false;
		}

		$userIdentified = acymailing_loadObject('SELECT * FROM '.acymailing_table('subscriber').' WHERE `subid` = '.acymailing_escapeDB($subid).' AND `key` = '.acymailing_escapeDB($key).' LIMIT 1');
		if(!empty($userIdentified->email)) $userIdentified->email = acymailing_punycode($userIdentified->email, 'emailToUTF8');

		if(empty($userIdentified)){
			if(!$onlyvalue) acymailing_enqueueMessage(acymailing_translation('INVALID_KEY'), 'error');
			return false;
		}

		return $userIdentified;
	}

}
components/com_acymailing/classes/rules.php000060400000003471152453623450015216 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class rulesClass extends acymailingClass{

	var $tables = array('rules');
	var $pkey = 'ruleid';
	var $errors = array();

	function getRules($all = true){
		$rules = acymailing_loadObjectList('SELECT * FROM `#__acymailing_rules` '.($all ? '' : 'WHERE published = 1').' ORDER BY `ordering` ASC');

		foreach($rules as $id => $rule){
			$rules[$id] = $this->_prepareRule($rule);
		}
		return $rules;
	}

	function get($ruleid, $default = null){
		$query = 'SELECT * FROM '.acymailing_table('rules').' WHERE `ruleid` = '.intval($ruleid).' LIMIT 1';
		$rule = acymailing_loadObject($query);

		return $this->_prepareRule($rule);
	}

	function _prepareRule($rule){
		$vals = array('executed_on','action_message','action_user');
		foreach($vals as $oneVal){
			if(!empty($rule->$oneVal)) $rule->$oneVal = unserialize($rule->$oneVal);
		}

		return $rule;
	}

	function saveForm(){

		$rule = new stdClass();
		$rule->ruleid = acymailing_getCID('ruleid');
		if(empty( $rule->ruleid)){
			$rule->ordering = intval(acymailing_loadResult('SELECT max(ordering) FROM `#__acymailing_rules`')) + 1;
		}
		$rule->executed_on = '';
		$rule->action_message = '';
		$rule->action_user = '';

		$formData = acymailing_getVar('array',  'data', array(), '');

		foreach($formData['rule'] as $column => $value){
			acymailing_secureField($column);
			if(is_array($value)){
				$rule->$column = serialize($value);
			}else{
				$rule->$column = strip_tags($value);
			}
		}


		$ruleid = $this->save($rule);
		if(!$ruleid) return false;

		acymailing_setVar( 'ruleid', $ruleid);
		return true;

	}
}
components/com_acymailing/classes/listsub.php000060400000011225152453623450015545 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class listsubClass extends acymailingClass{

	var $type = 'list';
	var $gid;
	var $checkAccess = true;
	var $sendNotif = true;
	var $sendConf = true;
	var $forceConf = false;
	var $survey = '';
	var $campaigndelay = 0;
	var $skipedfollowups = 0;

	function updateSubscription($subid, $lists){

		$result = true;
		$time = time();

		$listHelper = acymailing_get('helper.list');
		$listHelper->sendNotif = $this->sendNotif;
		$listHelper->sendConf = $this->sendConf;
		$listHelper->forceConf = $this->forceConf;
		$listHelper->survey = $this->survey;
		$listHelper->campaigndelay = $this->campaigndelay;

		foreach($lists as $status => $listids){
			if(empty($listids)) continue;

			acymailing_arrayToInteger($listids);
			if($status == '-1'){
				$column = 'unsubdate';
			}else $column = 'subdate';

			$query = 'UPDATE '.acymailing_table('listsub').' SET `status` = '.intval($status).','.$column.'='.$time.' WHERE subid = '.intval($subid).' AND listid IN ('.implode(',', $listids).')';
			$affected = acymailing_query($query);
			$result = $affected !== false && $result;

			if($status == 1){
				$listHelper->subscribe($subid, $listids);
			}elseif($status == -1){
				$listHelper->unsubscribe($subid, $listids);
			}
		}

		return $result;
	}

	function removeSubscription($subid, $listids){

		acymailing_arrayToInteger($listids);
		$query = 'DELETE FROM '.acymailing_table('listsub').' WHERE subid = '.intval($subid).' AND listid IN ('.implode(',', $listids).')';
		acymailing_query($query);

		$listHelper = acymailing_get('helper.list');
		$listHelper->sendNotif = $this->sendNotif;
		$listHelper->sendConf = $this->sendConf;
		$listHelper->forceConf = $this->forceConf;
		$listHelper->unsubscribe($subid, $listids);

		return true;
	}

	function addSubscription($subid, $lists){

		$result = true;
		$time = time();
		$subid = intval($subid);

		$listHelper = acymailing_get('helper.list');
		$listHelper->campaigndelay = $this->campaigndelay;
		$listHelper->skipedfollowups = $this->skipedfollowups;
		$listHelper->sendNotif = $this->sendNotif;
		$listHelper->sendConf = $this->sendConf;
		$listHelper->forceConf = $this->forceConf;

		foreach($lists as $status => $listids){
			$status = intval($status);
			acymailing_arrayToInteger($listids);

			$allResults = acymailing_loadObjectList('SELECT `listid`,`access_sub` FROM '.acymailing_table('list').' WHERE `listid` IN ('.implode(',', $listids).') AND `type` = \'list\'', 'listid');
			$listids = array_keys($allResults);

			if($status == '-1'){
				$column = 'unsubdate';
			}else $column = 'subdate';

			$values = array();
			foreach($listids as $listid){
				if(empty($listid)) continue;
				if($status > 0 && acymailing_level(3)){
					if((!acymailing_isAdmin() || !empty($this->gid)) && $this->checkAccess && $allResults[$listid]->access_sub != 'all'){
						if(!acymailing_isAllowed($allResults[$listid]->access_sub, $this->gid)) continue;
					}
				}
				$values[] = intval($listid).','.$subid.','.$status.','.$time;
			}

			if(empty($values)) continue;

			$query = 'INSERT IGNORE INTO '.acymailing_table('listsub').' (listid,subid,`status`,'.$column.') VALUES ('.implode('),(', $values).')';
			$affected = acymailing_query($query);
			$result = $affected !== false && $result;

			if($status == 1){
				$listHelper->subscribe($subid, $listids);
			}
		}

		return $result;
	}

	function getSubscription($subid){
		$query = 'SELECT * FROM '.acymailing_table('listsub').' as a LEFT JOIN '.acymailing_table('list').' as b on a.listid = b.listid WHERE a.subid = '.intval($subid).' AND b.type = \''.$this->type.'\' ORDER BY b.ordering ASC';
		return acymailing_loadObjectList($query, 'listid');
	}

	function getSubscriptionString($subid, $dates = false){
		$usersubscription = $this->getSubscription($subid);
		$subscriptionString = '';
		if(!empty($usersubscription)){
			$subscriptionString = '<ul>';
			foreach($usersubscription as $onesub){
				$status = ($onesub->status == 1) ? acymailing_translation('SUBSCRIBED') : (($onesub->status == -1) ? acymailing_translation('UNSUBSCRIBED') : acymailing_translation('PENDING_SUBSCRIPTION'));
				$subscriptionString .= '<li>['.$onesub->listid.'] '.$onesub->name.' : '.$status;
				if($dates) $subscriptionString .= ' - '.acymailing_getDate($onesub->status == -1 ? $onesub->unsubdate : $onesub->subdate, acymailing_translation('DATE_FORMAT_LC'));
				$subscriptionString .= '</li>';
			}
			$subscriptionString .= '</ul>';
		}

		return $subscriptionString;
	}
}
components/com_acymailing/classes/template.php000060400000101566152453623450015703 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class templateClass extends acymailingClass{

	var $tables = array('template');
	var $pkey = 'tempid';
	var $namekey = 'alias';
	var $templateNames = array();
	var $archiveSection = false;
	var $proposedAreas = false;
	var $templateId = "";
	var $checkAreas = true;

	function get($tempid, $default = null){
		$column = is_numeric($tempid) ? 'tempid' : 'name';
		$template = acymailing_loadObject('SELECT * FROM '.acymailing_table('template').' WHERE '.$column.' = '.acymailing_escapeDB($tempid).' LIMIT 1');
		return $this->_prepareTemplate($template);
	}

	function getTemplates($key = null, $contains = null){
		$query = 'SELECT * FROM '.acymailing_table('template');
		if(!empty($contains)) $query .= ' WHERE body LIKE '.acymailing_escapeDB('%'.$contains.'%');
		$templates = acymailing_loadObjectList($query, $key);
		foreach($templates as &$template){
			$template = $this->_prepareTemplate($template);
		}
		return $templates;
	}

	function getDefault(){
		$queryDefaultTemp = 'SELECT * FROM '.acymailing_table('template').' WHERE premium = 1 AND published = 1 ORDER BY ordering ASC LIMIT 1';
		if(acymailing_level(3)){
			$groups = acymailing_getGroupsByUser(acymailing_currentUserId(), false);
			$condGroup = '';
			foreach($groups as $group){
				$condGroup .= ' OR access LIKE (\'%,'.$group.',%\')';
			}
			$queryDefaultTemp = 'SELECT * FROM '.acymailing_table('template').' WHERE premium = 1 AND published = 1  AND (access = \'all\' '.$condGroup.') ORDER BY ordering ASC LIMIT 1';
		}

		$template = acymailing_loadObject($queryDefaultTemp);
		if(!empty($template->subject)) $template->subject = acyEmoji::Decode($template->subject);
		return $this->_prepareTemplate($template);
	}

	private function _prepareTemplate($template){
		if(!isset($template->styles)) return $template;

		if(empty($template->styles)){
			$template->styles = array();
		}else{
			$template->styles = unserialize($template->styles);
		}

		$template->subject = acyEmoji::Decode($template->subject);

		return $template;
	}

	function saveForm(){

		$template = new stdClass();
		$template->tempid = acymailing_getCID('tempid');

		$formData = acymailing_getVar('array', 'data', array(), '');

		if(!empty($formData['template']['category']) && $formData['template']['category'] == -1){
			$formData['template']['category'] = acymailing_getVar('string', 'newcategory', '');
		}
		$formData['template']['subject'] = acyEmoji::Encode($formData['template']['subject']);

		foreach($formData['template'] as $column => $value){
			acymailing_secureField($column);
			if($column == 'header'){
				$template->$column = $value;
				continue;
			}
			$template->$column = strip_tags($value);
		}

		$styles = acymailing_getVar('array', 'styles', array(), '');
		foreach($styles as $class => $oneStyle){
			$styles[$class] = str_replace('"', "'", $oneStyle);
			if(empty($oneStyle)) unset($styles[$class]);
		}

		$newStyles = acymailing_getVar('array', 'otherstyles', array(), '');
		if(!empty($newStyles)){
			foreach($newStyles['classname'] as $id => $className){
				if(!empty($className) AND $className != acymailing_translation('CLASS_NAME') AND !empty($newStyles['style'][$id]) AND $newStyles['style'][$id] != acymailing_translation('CSS_STYLE')){
					$className = str_replace(array(',', ' ', ':', '.', '#'), '', $className);
					$styles[$className] = str_replace('"', "'", $newStyles['style'][$id]);
				}
			}
		}
		$template->styles = serialize($styles);

		if(empty($template->thumb)){
			unset($template->thumb);
		}elseif($template->thumb == 'delete'){
			$template->thumb = '';
		}

		if(empty($template->readmore)){
			unset($template->readmore);
		}elseif($template->readmore == 'delete'){
			$template->readmore = '';
		}

		$template->body = acymailing_getVar('string', 'editor_body', '', '', ACY_ALLOWRAW);
		$template->body = acymailing_filterText($template->body);

		if(!empty($styles['color_bg'])){
			$pat1 = '#^([^<]*<[^>]*background-color:)([^;">]{1,30})#i';
			$found = false;
			if(preg_match($pat1, $template->body)){
				$template->body = preg_replace($pat1, '$1'.$styles['color_bg'], $template->body);
				$found = true;
			}
			$pat2 = '#^([^<]*<[^>]*bgcolor=")([^;">]{1,10})#i';
			if(preg_match($pat2, $template->body)){
				$template->body = preg_replace($pat2, '$1'.$styles['color_bg'], $template->body);
				$found = true;
			}
			if(!$found){
				$template->body = '<div style="background-color:'.$styles['color_bg'].';" width="100%">'.$template->body.'</div>';
			}
		}

		$acypluginsHelper = acymailing_get('helper.acyplugins');
		$acypluginsHelper->cleanHtml($template->body);

		$template->description = acymailing_getVar('string', 'editor_description', '', '', ACY_ALLOWHTML);

		$tempid = $this->save($template);
		if(!$tempid) return false;

		if(empty($template->tempid)){
			$orderClass = acymailing_get('helper.order');
			$orderClass->pkey = 'tempid';
			$orderClass->table = 'template';
			$orderClass->reOrder();
		}

		$this->createTemplateFile($tempid);

		acymailing_setVar('tempid', $tempid);
		return true;
	}

	function save($element){
		if(empty($element->tempid)){
			if(empty($element->namekey)) $element->namekey = time().acymailing_cleanSlug($element->name);
		}else{
			if(file_exists(ACYMAILING_TEMPLATE.'css'.DS.'template_'.intval($element->tempid).'.css')){
				
				if(!acymailing_deleteFile(ACYMAILING_TEMPLATE.'css'.DS.'template_'.intval($element->tempid).'.css')){
					echo acymailing_display('Could not delete the file '.ACYMAILING_TEMPLATE.'css'.DS.'template_'.intval($element->tempid).'.css', 'error');
				}
			}
		}

		if(!empty($element->styles) AND !is_string($element->styles)) $element->styles = serialize($element->styles);

		if(!empty($element->stylesheet)){
			$element->stylesheet = preg_replace('#:(active|current|visited)#i', '', $element->stylesheet);
		}

		return parent::save($element);
	}

	function detecttemplates($folder){
		$allFiles = acymailing_getFiles($folder);
		if(!empty($allFiles)){
			foreach($allFiles as $oneFile){
				if(preg_match('#^.*(html|htm)$#i', $oneFile)){
					if($this->installtemplate($folder.DS.$oneFile)) return true;
				}
			}
		}

		$status = false;
		$allFolders = acymailing_getFolders($folder);
		if(!empty($allFolders)){
			foreach($allFolders as $oneFolder){
				$status = $this->detecttemplates($folder.DS.$oneFolder) || $status;
			}
		}

		return $status;
	}

	function buildCSS($styles, $stylesheet){
		$inline = '';

		if(preg_match_all('#@import[^;]*;#is', $stylesheet, $results)){
			foreach($results[0] as $oneResult){
				$inline .= trim($oneResult)."\n";
				$stylesheet = str_replace($oneResult, '', $stylesheet);
			}
		}

		if(!empty($styles)){
			foreach($styles as $class => $style){
				if(preg_match('#^tag_(.*)$#', $class, $result)){
					if(!empty($style)) $inline .= $result[1].' { '.$style.' } '."\n";
				}elseif($class != 'color_bg'){
					if(!empty($style)) $inline .= '.'.$class.' {'.$style.'} '."\n";
				}else{
					if(!empty($style)) $inline .= 'body{background-color:'.$style.';} '."\n";
				}
			}
		}

		if(version_compare(PHP_VERSION, '5.0.0', '>=') && class_exists('DOMDocument') && function_exists('mb_convert_encoding')){
			$inline .= 'a img{ border:0px; text-decoration:none;} '."\n";
			$inline .= $stylesheet;
		}

		return $inline;
	}

	function createTemplateFile($id){
		if(empty($id)) return '';
		$cssfile = ACYMAILING_TEMPLATE.'css'.DS.'template_'.$id.'.css';
		if(file_exists($cssfile)) return $cssfile;

		$template = $this->get($id);
		if(empty($template->tempid)) return '';
		$css = $this->buildCSS($template->styles, $template->stylesheet);

		if(empty($css)) return '';

		

		acymailing_createDir(ACYMAILING_TEMPLATE.'css');

		if(acymailing_writeFile($cssfile, $css)){
			return $cssfile;
		}else{
			acymailing_enqueueMessage('Could not create the file '.$cssfile, 'error');
			return '';
		}
	}

	function installtemplate($filepath){
		$fileContent = file_get_contents($filepath);

		$newTemplate = new stdClass();
		$newTemplate->name = trim(preg_replace('#[^a-z0-9]#i', ' ', substr(dirname($filepath), strpos($filepath, '_template'))));
		if(preg_match('#< *title[^>]*>(.*)< */ *title *>#Uis', $fileContent, $results) && !empty($results[1])) $newTemplate->name = $results[1];

		if(preg_match('#< *meta *name="description" *content="([^"]*)"#Uis', $fileContent, $results) && !empty($results[1])) $newTemplate->description = $results[1];
		if(preg_match('#< *meta *name="fromname" *content="([^"]*)"#Uis', $fileContent, $results) && !empty($results[1])) $newTemplate->fromname = $results[1];
		if(preg_match('#< *meta *name="fromemail" *content="([^"]*)"#Uis', $fileContent, $results) && !empty($results[1])) $newTemplate->fromemail = $results[1];
		if(preg_match('#< *meta *name="replyname" *content="([^"]*)"#Uis', $fileContent, $results) && !empty($results[1])) $newTemplate->replyname = $results[1];
		if(preg_match('#< *meta *name="replyemail" *content="([^"]*)"#Uis', $fileContent, $results) && !empty($results[1])) $newTemplate->replyemail = $results[1];

		$newFolder = preg_replace('#[^a-z0-9]#i', '_', strtolower($newTemplate->name));
		$newTemplateFolder = $newFolder;
		$i = 1;
		while(is_dir(ACYMAILING_TEMPLATE.$newTemplateFolder)){
			$newTemplateFolder = $newFolder.'_'.$i;
			$i++;
		}
		$newTemplate->namekey = rand(0, 10000).$newTemplateFolder;
		$moveResult = acymailing_copyFolder(dirname($filepath), ACYMAILING_TEMPLATE.$newTemplateFolder);
		if($moveResult !== true){
			acymailing_display(array('Error copying folder from '.dirname($filepath).' to '.ACYMAILING_TEMPLATE.$newTemplateFolder, $moveResult), 'error');
			return false;
		}

		if(!file_exists(ACYMAILING_TEMPLATE.$newTemplateFolder.DS.'index.html')){
			$indexFile = '<html><body bgcolor="#FFFFFF"></body></html>';
			acymailing_writeFile(ACYMAILING_TEMPLATE.$newTemplateFolder.DS.'index.html', $indexFile);
		}

		$fileContent = str_replace(
								array(
									'src="./',
									'src="../',
									'src="images/'),
								array(
									'src="'.ACYMAILING_MEDIA_URL.'templates/'.$newTemplateFolder.'/',
									'src="'.ACYMAILING_MEDIA_URL.'templates/',
									'src="'.ACYMAILING_MEDIA_URL.'templates/'.$newTemplateFolder.'/images/'),
								$fileContent);

		$fileContent = preg_replace('#(src|background)[ ]*=[ ]*\"(?!(https?://|/))(?:\.\./|\./)?#', '$1="'.ACYMAILING_MEDIA_FOLDER.'/templates/'.$newTemplateFolder.'/', $fileContent);

		if(preg_match('#< *body[^>]*>(.*)< */ *body *>#Uis', $fileContent, $results)){
			$newTemplate->body = $results[1];
		}else{
			$newTemplate->body = $fileContent;
		}

		$newTemplate->stylesheet = '';
		if(preg_match_all('#< *style[^>]*>(.*)< */ *style *>#Uis', $fileContent, $results)){
			$newTemplate->stylesheet .= preg_replace('#(<!--|-->)#s', '', implode("\n", $results[1]));
		}
		$cssFiles = array();
		$cssFiles[ACYMAILING_TEMPLATE.$newTemplateFolder] = acymailing_getFiles(ACYMAILING_TEMPLATE.$newTemplateFolder, '\.css$');
		$subFolders = acymailing_getFolders(ACYMAILING_TEMPLATE.$newTemplateFolder);
		foreach($subFolders as $oneFolder){
			$cssFiles[ACYMAILING_TEMPLATE.$newTemplateFolder.DS.$oneFolder] = acymailing_getFiles(ACYMAILING_TEMPLATE.$newTemplateFolder.DS.$oneFolder, '\.css$');
		}

		foreach($cssFiles as $cssFolder => $cssFile){
			if(empty($cssFile)) continue;
			$newTemplate->stylesheet .= "\n".file_get_contents($cssFolder.DS.reset($cssFile));
		}

		if(!empty($newTemplate->stylesheet)){
			if(preg_match('#body *\{[^\}]*background-color:([^;\}]*)[;\}]#Uis', $newTemplate->stylesheet, $backgroundresults)){
				$newTemplate->styles['color_bg'] = trim($backgroundresults[1]);
				$newTemplate->stylesheet = preg_replace('#(body *\{[^\}]*)background-color:[^;\}]*[;\}]#Uis', '$1', $newTemplate->stylesheet);
			}

			$quickstyle = array('tag_h1' => 'h1', 'tag_h2' => 'h2', 'tag_h3' => 'h3', 'tag_h4' => 'h4', 'tag_h5' => 'h5', 'tag_h6' => 'h6', 'tag_a' => 'a', 'tag_ul' => 'ul', 'tag_li' => 'li', 'acymailing_unsub' => '\.acymailing_unsub', 'acymailing_online' => '\.acymailing_online', 'acymailing_title' => '\.acymailing_title', 'acymailing_content' => '\.acymailing_content', 'acymailing_readmore' => '\.acymailing_readmore');
			foreach($quickstyle as $styledb => $oneStyle){
				if(preg_match('#[^a-z\. ,] *'.$oneStyle.' *{([^}]*)}#Uis', $newTemplate->stylesheet, $quickstyleresults)){
					$newTemplate->styles[$styledb] = trim(str_replace(array("\n", "\r", "\t", "\s"), ' ', $quickstyleresults[1]));
					$newTemplate->stylesheet = str_replace($quickstyleresults[0], '', $newTemplate->stylesheet);
				}
			}
		}

		if(!empty($newTemplate->styles['color_bg'])){
			$pat1 = '#^([^<]*<[^>]*background-color:)([^;">]{1,10})#i';
			$found = false;
			if(preg_match($pat1, $newTemplate->body)){
				$newTemplate->body = preg_replace($pat1, '$1'.$newTemplate->styles['color_bg'], $newTemplate->body);
				$found = true;
			}
			$pat2 = '#^([^<]*<[^>]*bgcolor=")([^;">]{1,10})#i';
			if(preg_match($pat2, $newTemplate->body)){
				$newTemplate->body = preg_replace($pat2, '$1'.$newTemplate->styles['color_bg'], $newTemplate->body);
				$found = true;
			}
			if(!$found){
				$newTemplate->body = '<div style="background-color:'.$newTemplate->styles['color_bg'].';" width="100%">'.$newTemplate->body.'</div>';
			}
		}

		$foldersForPicts = array($newTemplateFolder);
		$otherFolders = acymailing_getFolders(ACYMAILING_TEMPLATE.$newTemplateFolder);
		foreach($otherFolders as $oneFold){
			$foldersForPicts[] = $newTemplateFolder.DS.$oneFold;
		}
		$allPictures = array();
		foreach($foldersForPicts as $oneFolder){
			$allPictures[$oneFolder] = acymailing_getFiles(ACYMAILING_TEMPLATE.$oneFolder);
		}
		foreach($allPictures as $folder => $pictfolders){
			foreach($pictfolders as $onePict){
				if(!preg_match('#\.(jpg|gif|png|jpeg|ico|bmp)$#i', $onePict)) continue;
				if(preg_match('#(thumbnail|screenshot|muestra)#i', $onePict)){
					$newTemplate->thumb = ACYMAILING_MEDIA_FOLDER.'/templates/'.str_replace(DS, '/', $folder).'/'.$onePict;
				}elseif(preg_match('#(readmore|lirelasuite)#i', $onePict)){
					$newTemplate->readmore = ACYMAILING_MEDIA_FOLDER.'/templates/'.str_replace(DS, '/', $folder).'/'.$onePict;
				}
			}
		}

		$newTemplate->ordering = 0;

		$tempid = $this->save($newTemplate);
		$this->templateId = $tempid;
		if($this->checkAreas){
			$this->proposedAreas = $this->proposeApplyAreas($tempid, false) || $this->proposedAreas;
		}

		$this->createTemplateFile($tempid);

		$orderClass = acymailing_get('helper.order');
		$orderClass->pkey = 'tempid';
		$orderClass->table = 'template';
		$orderClass->reOrder();

		$this->templateNames[] = $newTemplate->name;

		return true;
	}

	function displayPreview($idArea, $tempid, $newslettersubject = ''){

		if(isset($_SERVER["REQUEST_URI"])){
			$requestUri = $_SERVER["REQUEST_URI"];
		}else{
			$requestUri = $_SERVER['PHP_SELF'];
			if(!empty($_SERVER['QUERY_STRING'])) $requestUri = rtrim($requestUri, '/').'?'.$_SERVER['QUERY_STRING'];
		}
		$currentURL = (((!empty($_SERVER['HTTPS']) AND strtolower($_SERVER['HTTPS']) == "on") || $_SERVER['SERVER_PORT'] == 443) ? 'https://' : 'http://').$_SERVER["HTTP_HOST"].$requestUri;

		$js = "var iframecreated = false;
				function acydisplayPreview(){
					var d = document, area = d.getElementById('$idArea');
					if(!area) return;
					if(iframecreated) return;
					iframecreated = true;
					var content = area.innerHTML;
					var myiframe = d.createElement(\"iframe\");
					myiframe.id = 'iframepreview';
					myiframe.style.width = '100%';
					myiframe.style.borderWidth = '0px';
					myiframe.allowtransparency = \"true\";
					myiframe.frameBorder = '0';
					area.innerHTML = '';
					area.appendChild(myiframe);
					myiframe.onload = function(){
						var iframeloaded = false;
						try{
							if(myiframe.contentDocument != null && initIframePreview(myiframe,content) && replaceAnchors(myiframe)){
								iframeloaded = true;
							}
						}catch(err){
							iframeloaded = false;
						}

						if(!iframeloaded){
							area.innerHTML = content;
						}
					}
					myiframe.src = '';

				}
				function resetIframeSize(myiframe){


					var innerDoc = (myiframe.contentDocument) ? myiframe.contentDocument : myiframe.contentWindow.document;
					var objToResize = (myiframe.style) ? myiframe.style : myiframe;
					if(objToResize.width != '100%') return;
					var newHeight = innerDoc.body.scrollHeight;
					if(!objToResize.height || parseInt(objToResize.height,10)+10 < newHeight || parseInt(objToResize.height,10)-10 > newHeight) objToResize.height = newHeight+'px';
					setTimeout(function(){resetIframeSize(myiframe);},1000);
				}
				function replaceAnchors(myiframe){
					var myiframedoc = myiframe.contentWindow.document;
					var myiframebody = myiframedoc.body;
					var el = myiframe;
					var myiframeOffset = el.offsetTop;
					while ( ( el = el.offsetParent ) != null )
					{
						myiframeOffset += el.offsetTop;
					}

					var elements = myiframebody.getElementsByTagName(\"a\");
					for( var i = elements.length - 1; i >= 0; i--){
						var aref = elements[i].getAttribute('href');
						if(!aref) continue;
						if(aref.indexOf(\"#\") != 0 && aref.indexOf(\"".addslashes($currentURL)."#\") != 0) continue;

						if(elements[i].onclick && elements[i].onclick != \"\") continue;

						var adest = aref.substring(aref.indexOf(\"#\")+1);
						if( adest.length < 1 ) continue;

						elements[i].dest = adest;
						elements[i].onclick = function(){
							elem = myiframedoc.getElementById(this.dest);
							if(!elem){
								elems = myiframedoc.getElementsByName(this.dest);
								if(!elems || !elems[0]) return false;
								elem = elems[0];
							}
							if( !elem ) return false;

							var el = elem;
							var elemOffset = el.offsetTop;
							while ( ( el = el.offsetParent ) != null )
							{
								elemOffset += el.offsetTop;
							}
							window.scrollTo(0,elemOffset+myiframeOffset-15);
							return false;
						};
					}
					return true;
				}
				function initIframePreview(myiframe,content){
					var d = document;

					var heads = myiframe.contentWindow.document.getElementsByTagName(\"head\");
					if(heads.length == 0){
						return false;
					}

					var head = heads[0];

					var myiframebodys = myiframe.contentWindow.document.getElementsByTagName('body');
					if(myiframebodys.length == 0){
						var myiframebody = d.createElement(\"body\");
						myiframe.appendChild(myiframebody);
					}else{
						var myiframebody = myiframebodys[0];
					}
					if(!myiframebody) return false;
					myiframebody.style.margin = '0px';
					myiframebody.style.padding = '0px';
					myiframebody.innerHTML = content;

					var title1 = d.createElement(\"title\");
					title1.innerHTML = '".addslashes($newslettersubject)."';


					var base1 = d.createElement(\"base\");
					base1.target = \"_blank\";

					head.appendChild(base1);

					var existingTitle = head.getElementsByTagName(\"title\");
					if(existingTitle.length == 0){
						head.appendChild(title1);
					}
					
					var meta1 = d.createElement('meta');
					meta1.name = 'viewport';
					meta1.content = 'width=device-width, initial-scale=1';

					head.appendChild(meta1);
				";
		if(!empty($tempid)){
			$js .= "var link1 = d.createElement(\"link\");
					link1.type = \"text/css\";
					link1.rel = \"stylesheet\";
					link1.href =  '".(rtrim(acymailing_rootURI(), '/').'/').ACYMAILING_MEDIA_FOLDER."/templates/css/template_".$tempid.".css?v=".@filemtime(ACYMAILING_MEDIA.'templates'.DS.'css'.DS.'template_'.$tempid.'.css')."';
					head.appendChild(link1);
				";
		}

		$js .= "var style1 = d.createElement(\"style\");
				style1.type = \"text/css\";
				style1.id = \"overflowstyle\";
				try{style1.innerHTML = 'html,body,iframe{overflow-y:hidden} ';}catch(err){style1.styleSheet.cssText = 'html,body,iframe{overflow-y:hidden} ';}
				";

		if($this->archiveSection){
			$js .= "try{style1.innerHTML += ' .hideonline{display:none;} ';}catch(err){style1.styleSheet.cssText += ' .hideonline{display:none;} ';}";
		}

		$js .= "
				head.appendChild(style1);
				resetIframeSize(myiframe);
				return true;
			}
			document.addEventListener(\"DOMContentLoaded\", function(){acydisplayPreview();});";

		acymailing_addScript(true, $js);

		$resize = "function previewResize(newWidth,newHeight){
			if(document.getElementById('iframepreview')){
				var myiframe = document.getElementById('iframepreview');
			}else{
				var myiframe = document.getElementById('newsletter_preview_area');
			}
			myiframe.style.width = newWidth;
			if(newHeight == '100%'){
				resetIframeSize(myiframe);
			}else{
				myiframe.style.height = newHeight;
				myiframe.contentWindow.document.getElementById('overflowstyle').media = \"print\";
			}
		}
		function previewSizeClick(elem){
			var ids = new Array('preview320','preview480','preview768','previewmax');
			for(var i=0;i<ids.length;i++){
				document.getElementById(ids[i]).className = 'previewsize '+ids[i];
			}
			elem.className += 'enabled';
		}";
		acymailing_addScript(true, $resize);
		$switchPict = "function switchPict(){
			var myiframe = document.getElementById('iframepreview');
			var myiframebody = myiframe.contentWindow.document.getElementsByTagName('body')[0];
			if(document.getElementById('previewpict').className == 'previewsize previewpictenabled'){
				remove = true;
				document.getElementById('previewpict').className = 'previewsize previewpict';
			}else{
				remove = false;
				document.getElementById('previewpict').className = 'previewsize previewpictenabled';
			}
			var elements = myiframebody.getElementsByTagName(\"img\");
			for( var i = elements.length - 1; i >= 0; i-- ) {
				if(remove){
					elements[i].src_temp = elements[i].src;
					elements[i].src = 'pictureremoved';
				}else{
					elements[i].src = elements[i].src_temp;
				}
			}
			if(myiframe.style.width == '100%'){
				resetIframeSize(myiframe);
			}
		}";
		acymailing_addScript(true, $switchPict);
	}

	function proposeApplyAreas($tempid, $addextrawarning = true){
		if(empty($tempid)) return false;

		$config = acymailing_config();
		if($config->get('editor') != 'acyeditor') return false;

		$template = $this->get($tempid);
		if(empty($template->body)) return false;
		if(strpos($template->body, 'acyeditor_')) return false;

		$messages = array('<a href="'.acymailing_completeLink('template&task=applyareas&tempid='.$tempid).'">'.acymailing_translation('ACYEDITOR_ADDAREAS').'</a>');
		if($addextrawarning) $messages[] = acymailing_translation('ACYEDITOR_ADDAREAS_ONLYFINISHED');
		acymailing_enqueueMessage($messages, 'warning');
		return true;
	}

	function applyAreas(&$html){

		if(strpos($html, 'acyeditor_')) return false;

		if(preg_match_all('#(<td[^>]*>) *(<img[^>]*> *</td>)#Uis', $html, $results)){
			foreach($results[0] as $i => $oneResult){
				if(preg_match('#class=("|\'])#Uis', $results[1][$i], $charused)){
					$newTag = str_replace('class='.$charused[1], 'class='.$charused[1].'acyeditor_picture ', $results[1][$i]);
				}else{
					$newTag = str_replace('<td', '<td class="acyeditor_picture"', $results[1][$i]);
				}
				$html = str_replace($results[0][$i], $newTag.$results[2][$i], $html);
			}
		}

		$textElements = array('td', 'div');
		$divhtml = $html;
		foreach($textElements as $starttag){
			if(!preg_match_all('#(<'.$starttag.'(?:(?!>|acyeditor_).)*>)((?:(?!<td|acyeditor_|<'.$starttag.').)*</'.$starttag.'>)#Uis', $divhtml, $results)) continue;

			$class = 'acyeditor_text';
			if($starttag == 'div') $class .= ' acyeditor_delete';

			foreach($results[0] as $i => $oneResult){

				$content = trim(str_replace(array(' ', '&nbsp;', "\n", "\r"), '', strip_tags($results[0][$i])));

				if(empty($content)) continue;

				if(preg_match('#class=("|\'])#Uis', $results[1][$i], $charused)){
					$newTag = str_replace('class='.$charused[1], 'class='.$charused[1].$class.' ', $results[1][$i]);
				}else{
					$newTag = str_replace('<'.$starttag, '<'.$starttag.' class="'.$class.'"', $results[1][$i]);
				}
				$html = str_replace($results[0][$i], $newTag.$results[2][$i], $html);
				$divhtml = str_replace($results[0][$i], '', $divhtml);
			}
		}

		if(preg_match_all('#(<tr[^>]*>)((?:(?!<tr|acyeditor_delete).)*</tr>)#Uis', $html, $results)){
			foreach($results[0] as $i => $oneResult){
				if(preg_match('#class=("|\'])#Uis', $results[1][$i], $charused)){
					$newTag = str_replace('class='.$charused[1], 'class='.$charused[1].'acyeditor_delete ', $results[1][$i]);
				}else{
					$newTag = str_replace('<tr', '<tr class="acyeditor_delete"', $results[1][$i]);
				}
				$html = str_replace($results[0][$i], $newTag.$results[2][$i], $html);
			}
		}

		if(preg_match_all('#(<table[^>]*>)((?:(?!<table).)*</table>)#Uis', $html, $results)){
			foreach($results[0] as $i => $newContent){
				if(strpos($newContent, '<tbody') === false){
					$newContent = preg_replace('#(<table[^>]*>)#Uis', '$1<tbody>', $newContent);
					$newContent = preg_replace('#(< */ *table *>)#Uis', '</tbody>$1', $newContent);
				}

				if(preg_match('#(<tbody[^>]*)class=("|\'])#Uis', $newContent, $charused)){
					$newContent = str_replace($charused[0], $charused[1].'class='.$charused[2].'acyeditor_sortable ', $newContent);
				}else{
					$newContent = str_replace('<tbody', '<tbody class="acyeditor_sortable"', $newContent);
				}

				$html = str_replace($results[0][$i], $newContent, $html);
			}
		}

		return true;
	}

	function doupload(){
		$importFile = acymailing_getVar('none', 'uploadedfile', '', 'files');

		$fileError = $_FILES['uploadedfile']['error'];
		if($fileError > 0){
			switch($fileError){
				case 1:
					acymailing_enqueueMessage('The uploaded file exceeds the upload_max_filesize directive in php configuration.', 'error');
					return false;
				case 2:
					acymailing_enqueueMessage('The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.', 'error');
					return false;
				case 3:
					acymailing_enqueueMessage('The uploaded file was only partially uploaded.', 'error');
					return false;
				case 4:
					acymailing_enqueueMessage('No file was uploaded.', 'error');
					return false;
				default:
					acymailing_enqueueMessage('Error uploading the file on the server, unknown error '.$fileError, 'error');
					return false;
			}
		}
		if(empty($importFile['name'])){
			acymailing_enqueueMessage(acymailing_translation('BROWSE_FILE'), 'error');
			return false;
		}
		
		$uploadPath = acymailing_cleanPath(ACYMAILING_ROOT.ACYMAILING_MEDIA_FOLDER.DS.'templates');

		if(!is_writable($uploadPath)){
			@chmod($uploadPath, '0755');
			if(!is_writable($uploadPath)){
				acymailing_enqueueMessage(acymailing_translation_sprintf('WRITABLE_FOLDER', $uploadPath), 'warning');
			}
		}

		if(!(bool)ini_get('file_uploads')){
			acymailing_enqueueMessage('Can not upload the file, please make sure file_uploads is enabled on your php.ini file', 'error');
			return false;
		}

		if(!extension_loaded('zlib')){
			acymailing_raiseError(E_WARNING, 'SOME_ERROR_CODE', acymailing_translation('WARNINSTALLZLIB'));
			return false;
		}

		$filename = strtolower(acymailing_makeSafeFile($importFile['name']));
		$extension = strtolower(substr($filename, strrpos($filename, '.') + 1));

		if(!in_array($extension, array('zip', 'tar.gz'))){
			acymailing_enqueueMessage(acymailing_translation_sprintf('ACCEPTED_TYPE', $extension, 'zip,tar.gz'), 'error');
			return false;
		}

		$jpath = acymailing_getCMSConfig('tmp_path', ACYMAILING_MEDIA.'tmp'.DS);
		$tmp_dest = acymailing_cleanPath($jpath.DS.$filename);
		$tmp_src = $importFile['tmp_name'];

		$uploaded = acymailing_uploadFile($tmp_src, $tmp_dest);
		if(!$uploaded){
			acymailing_enqueueMessage('Error uploading the file from '.$tmp_src.' to '.$tmp_dest, 'error');
			return false;
		}

		$tmpdir = uniqid().'_template';

		$extractdir = acymailing_cleanPath(dirname($tmp_dest).DS.$tmpdir);

		$result = acymailing_extractArchive($tmp_dest, $extractdir);
		acymailing_deleteFile($tmp_dest);

		$allFiles = acymailing_getFiles($extractdir, '.', true, true, array(), array());
		foreach($allFiles as $oneFile){
			if(preg_match('#\.(jpg|gif|png|jpeg|ico|bmp|html|htm|css)$#i', $oneFile)){
				continue;
			}
			if(acymailing_deleteFile($oneFile)){
				acymailing_enqueueMessage('File '.$oneFile.' deleted from the template pack', 'warning');
			}
		}

		if(!$result){
			acymailing_enqueueMessage('Error extracting the file '.$tmp_dest.' to '.$extractdir, 'error');
			return false;
		}

		if($this->detecttemplates($extractdir)){
			$messages = $this->templateNames;
			array_unshift($messages, acymailing_translation_sprintf('TEMPLATES_INSTALL', count($this->templateNames)));
			acymailing_enqueueMessage($messages, 'success');
			if(is_dir($extractdir)) acymailing_deleteFolder($extractdir);
			return true;
		}

		acymailing_enqueueMessage('Error installing template', 'error');
		if(is_dir($extractdir)) acymailing_deleteFolder($extractdir);
		return false;
	}

	function export($tempid){
		if(!extension_loaded('zlib')){
			acymailing_raiseError(E_WARNING, 'SOME_ERROR_CODE', acymailing_translation('WARNINSTALLZLIB'));
			return false;
		}
		
		$template = $this->get($tempid);
		$fileDeb = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
		if(!empty($template->description)){
			$fileDeb .= '
<meta name="description" content="'.str_replace('"', "'", $template->description).'" />';
		}
		if(!empty($template->fromname)){
			$fileDeb .= '
<meta name="fromname" content="'.$template->fromname.'" />';
		}
		if(!empty($template->fromemail)){
			$fileDeb .= '
<meta name="fromemail" content="'.$template->fromemail.'" />';
		}
		if(!empty($template->replyname)){
			$fileDeb .= '
<meta name="replyname" content="'.$template->replyname.'" />';
		}
		if(!empty($template->replyemail)){
			$fileDeb .= '
<meta name="replyemail" content="'.$template->replyemail.'" />';
		}
		$fileDeb .= '
<title>'.$template->name.'</title>';

		$css = '
<style type="text/css">
';
		$css .= file_get_contents(ACYMAILING_TEMPLATE.DS.'css'.DS.'template_'.$tempid.'.css');
		$css .= '
</style>';

		$indexFile = $fileDeb.$css.'
</head>
<body>
'.$template->body.'
</body>
</html>';

		$tmpdir = preg_replace('#[^a-z0-9]#i', '_', strtolower($template->name));
		$jpathURL = ACYMAILING_LIVE.ACYMAILING_MEDIA_FOLDER.'/tmp';
		$tmp_url_dest = $jpathURL.DS.$tmpdir;
		$jpath = ACYMAILING_MEDIA.'tmp';
		$tmp_dest = acymailing_cleanPath($jpath.DS.$tmpdir);
		acymailing_createDir($jpath, true);

		if(!acymailing_createFolder($tmp_dest)){
			acymailing_enqueueMessage('Error creating folder in temp directory: '.$tmp_dest, 'error');
			return false;
		}

		if(!empty($template->thumb)){
			$thumbPath = acymailing_cleanPath(ACYMAILING_ROOT.DS.$template->thumb);
			$thumbExt = acymailing_fileGetExt($thumbPath);
			$resCopyThumb = acymailing_copyFile($thumbPath, $tmp_dest.DS.'thumbnail.'.$thumbExt);
			if(!$resCopyThumb){
				acymailing_enqueueMessage('Error copying the thumb picture', 'warning');
			}
		}
		$resHandleImages = $this->handlepict($indexFile, $tmp_dest);
		if(!$resHandleImages){
			acymailing_deleteFolder($tmp_dest);
			return false;
		}

		$resCopyIndex = acymailing_writeFile($tmp_dest.DS.'index.html', $indexFile);
		if(!$resCopyIndex){
			acymailing_enqueueMessage('Error copying the file index.html to temp directory '.$tmp_dest, 'error');
			return false;
		}
		$zipFilesArray = array();
		$dirs = acymailing_getFolders($tmp_dest, '.', true, true);
		array_push($dirs, $tmp_dest);
		foreach($dirs as $dir){
			$files = acymailing_getFiles($dir, '.', false, true);
			foreach($files as $file){
				$posSlash = strrpos($file, '/');
				$posASlash = strrpos($file, '\\');
				$pos = ($posSlash < $posASlash) ? $posASlash : $posSlash;
				if(!empty($pos)) $file = substr_replace($file, DS, $pos, 1);
				$data = acymailing_fileGetContent($file);
				$zipFilesArray[] = array('name' => str_replace($tmp_dest.DS, '', $file), 'data' => $data);
			}
		}

		$created = acymailing_createArchive($tmp_dest, $zipFilesArray);
		acymailing_deleteFolder($tmp_dest);

		if($created === false) return false;
		return $tmp_url_dest.'.zip';
	}

	function handlepict(&$content, $templatepath){

		$content = acymailing_absoluteURL($content);

		if(!preg_match_all('#<img[^>]*src="([^"]*)"#i', $content, $pictures)) return true;

		$pictFolder = rtrim($templatepath, DS).DS.'images';
		if(!acymailing_createDir($pictFolder)){
			return false;
		}

		$replace = array();
		foreach($pictures[1] as $onePict){
			if(isset($replace[$onePict])) continue;

			$location = str_replace(array(ACYMAILING_LIVE, '/'), array(ACYMAILING_ROOT, DS), $onePict);
			if(strpos($location, 'http') === 0) continue;

			if(!file_exists($location)) continue;

			$filename = basename($location);
			while(file_exists($pictFolder.DS.$filename)){
				$filename = rand(0, 99).$filename;
			}

			if(acymailing_copyFile($location, $pictFolder.DS.$filename) !== true){
				acymailing_display('Could not copy the file from '.$location.' to '.$pictFolder.DS.$filename, 'error');
				return false;
			}

			$replace[$onePict] = 'images/'.$filename;
		}

		$content = str_replace(array_keys($replace), $replace, $content);

		return true;
	}
}
components/com_acymailing/classes/acyhistory.php000060400000002534152453623450016261 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class acyhistoryClass extends acymailingClass{

	function insert($subid,$action,$data = array(),$mailid = 0){
		$currentUserid = acymailing_currentUserId();
		if(!empty($currentUserid)){
			$data[] = acymailing_translation('EXECUTED_BY').'::'.$currentUserid.' ( '.acymailing_currentUserName().' )';
		}
		$history = new stdClass();
		$history->subid = intval($subid);
		$history->action = strip_tags($action);
		$history->data = implode("\n",$data);
		if(strlen($history->data) > 100000) $history->data = substr($history->data,0,10000);
		$history->date = time();
		$history->mailid = $mailid;
		$userHelper = acymailing_get('helper.user');
		$history->ip = $userHelper->getIP();
		if(!empty($_SERVER)){
			$source = array();
			$vars = array('HTTP_REFERER','HTTP_USER_AGENT','HTTP_HOST','SERVER_ADDR','REMOTE_ADDR','REQUEST_URI','QUERY_STRING');
			foreach($vars as $oneVar){
				if(!empty($_SERVER[$oneVar])) $source[] = $oneVar.'::'.strip_tags($_SERVER[$oneVar]);
			}
			$history->source = implode("\n",$source);
		}

		return acymailing_insertObject(acymailing_table('history'),$history);
	}

}
components/com_acymailing/classes/list.php000060400000016451152453623450015041 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class listClass extends acymailingClass{

	var $tables = array('listsub', 'listcampaign', 'listmail', 'list');
	var $pkey = 'listid';
	var $namekey = 'alias';
	var $type = 'list';
	var $newlist = false;
	var $allowedFields = array('name', 'description', 'listid', 'published', 'userid', 'alias', 'color', 'visible', 'welmailid', 'unsubmailid', 'type', 'access_sub', 'access_manage', 'languages', 'startrule', 'category', 'ordering');

	function getLists($index = '', $listids = 'all'){
		$onlyListids = array();
		if(strtolower($listids) != 'all'){
			$onlyListids = explode(',', $listids);
			acymailing_arrayToInteger($onlyListids);
		}

		$query = 'SELECT * FROM '.acymailing_table('list').' WHERE type = \''.$this->type.'\' '.(empty($onlyListids) ? '' : 'AND listid IN ('.implode(',', $onlyListids).')').' ORDER BY ordering ASC';
		return acymailing_loadObjectList($query, $index);
	}

	function getAllCampaigns($index = ''){
		$query = 'SELECT * FROM '.acymailing_table('list').' WHERE type = \'campaign\' ORDER BY ordering ASC';
		return acymailing_loadObjectList($query, $index);
	}

	function delete($elements){
		if(!is_array($elements)){
			$elements = array($elements);
		}

		acymailing_arrayToInteger($elements);

		if(empty($elements)) return 0;

		acymailing_query('DELETE FROM #__acymailing_listcampaign WHERE `campaignid` IN ('.implode(',', $elements).')');

		acymailing_query('DELETE #__acymailing_mail, #__acymailing_listmail FROM #__acymailing_mail INNER JOIN #__acymailing_listmail WHERE #__acymailing_mail.mailid=#__acymailing_listmail.mailid AND #__acymailing_mail.type=\'followup\' AND #__acymailing_listmail.listid IN ('.implode(',', $elements).')');

		return parent::delete($elements);
	}

	function getFrontendLists($index = ''){
		$userid = acymailing_currentUserId();
		if(empty($userid)) return array();

		$groups = acymailing_getGroupsByUser(acymailing_currentUserId(), false);

		$possibleValues = array();
		$possibleValues[] = 'access_manage = \'all\'';
		$possibleValues[] = 'userid = '.intval(acymailing_currentUserId());
		foreach($groups as $oneGroup){
			$possibleValues[] = 'access_manage LIKE \'%,'.intval($oneGroup).',%\'';
		}

		$query = 'SELECT * FROM '.acymailing_table('list').' WHERE published = 1 AND type = \''.$this->type.'\' AND ('.implode(' OR ', $possibleValues).') ORDER BY ordering ASC';
		return acymailing_loadObjectList($query, $index);
	}

	function getFrontendCampaigns($index = ''){
		$userid = acymailing_currentUserId();
		if(empty($userid)) return array();

		$groups = acymailing_getGroupsByUser($userid, false);

		$possibleValues = array();
		$possibleValues[] = 'access_manage = \'all\'';
		$possibleValues[] = 'userid = '.intval($userid);
		foreach($groups as $oneGroup){
			$possibleValues[] = 'access_manage LIKE \'%,'.intval($oneGroup).',%\'';
		}

		$query = 'SELECT DISTINCT l.* FROM '.acymailing_table('list').' AS l INNER JOIN '.acymailing_table('listcampaign').' AS lc ON l.listid = lc.campaignid WHERE lc.listid IN (SELECT DISTINCT il.listid FROM '.acymailing_table('listcampaign').' AS ilc INNER JOIN '.acymailing_table('list').' AS il ON ilc.listid = il.listid WHERE il.published = 1 AND il.type = \'list\' AND ('.implode(' OR ', $possibleValues).')) AND l.published = 1 ORDER BY ordering ASC';
		return acymailing_loadObjectList($query, $index);
	}

	function get($listid, $default = null){
		$query = 'SELECT a.*, b.'.$this->cmsUserVars->name.' as creatorname, b.'.$this->cmsUserVars->username.' AS username, b.'.$this->cmsUserVars->email.' AS email FROM '.acymailing_table('list').' as a LEFT JOIN '.acymailing_table($this->cmsUserVars->table, false).' as b on a.userid = b.'.$this->cmsUserVars->id.' WHERE listid = '.intval($listid).' LIMIT 1';
		return acymailing_loadObject($query);
	}

	function saveForm(){

		$list = new stdClass();
		$list->listid = acymailing_getCID('listid');

		$formData = acymailing_getVar('array', 'data', array(), '');

		if(!empty($formData['list']['category']) && $formData['list']['category'] == -1){
			$formData['list']['category'] = acymailing_getVar('string', 'newcategory', '');
		}

		foreach($formData['list'] as $column => $value){
			if(acymailing_isAdmin() || in_array($column, $this->allowedFields)){
				acymailing_secureField($column);
				$list->$column = strip_tags($value);
			}
		}

		$list->description = acymailing_getVar('string', 'editor_description', '', '', ACY_ALLOWHTML);
		if(isset($list->published) && $list->published != 1) $list->published = 0;
		$listid = $this->save($list);
		if(!$listid) return false;

		if(empty($list->listid)){
			$orderClass = acymailing_get('helper.order');
			$orderClass->pkey = 'listid';
			$orderClass->table = 'list';
			$orderClass->groupMap = 'type';
			$orderClass->groupVal = empty($list->type) ? $this->type : $list->type;
			$orderClass->reOrder();

			$this->newlist = true;
		}

		if(!empty($formData['listcampaign'])){
			$affectedLists = array();
			foreach($formData['listcampaign'] as $affectlistid => $receiveme){
				if(!empty($receiveme)){
					$affectedLists[] = $affectlistid;
				}
			}

			$listCampaignClass = acymailing_get('class.listcampaign');
			$listCampaignClass->save($listid, $affectedLists);
		}

		acymailing_setVar('listid', $listid);

		return true;
	}

	function save($list){
		if(empty($list->listid)){
			if(empty($list->userid)){
				$list->userid = acymailing_currentUserId();
			}
			if(empty($list->alias)) $list->alias = $list->name;
		}

		if(isset($list->alias)){
			if(empty($list->alias)) $list->alias = $list->name;
			$list->alias = acymailing_cleanSlug($list->alias);
		}

		acymailing_importPlugin('acymailing');
		if(empty($list->listid)){
			acymailing_trigger('onAcyBeforeListCreate', array(&$list));
			$status = acymailing_insertObject(acymailing_table('list'), $list);
		}else{
			acymailing_trigger('onAcyBeforeListModify', array(&$list));
			$status = acymailing_updateObject(acymailing_table('list'), $list, 'listid');
		}


		if($status) return empty($list->listid) ? $status : $list->listid;
		return false;
	}

	function onlyCurrentLanguage($lists){
		$currentLang = strtolower(acymailing_getLanguageTag());

		$newLists = array();
		foreach($lists as $id => $oneList){
			if($oneList->languages == 'all' OR in_array($currentLang, explode(',', $oneList->languages))){
				$newLists[$id] = $oneList;
			}
		}

		return $newLists;
	}

	function onlyAllowedLists($lists){
		$newLists = array();
		foreach($lists as $id => $oneList){
			if(!$oneList->published) continue;
			if(!acymailing_isAllowed($oneList->access_sub)) continue;
			$newLists[$id] = $oneList;
		}
		return $newLists;
	}

	function getCampaigns($listid){
		if(empty($listid)) return array();

		if(is_array($listid)) $listid = implode(',', $listid);
		$query = 'SELECT  b.listid, b.campaignid FROM '.acymailing_table('list').' as a LEFT JOIN '.acymailing_table('listcampaign').' as b on a.listid = b.listid WHERE a.type = \'list\' AND b.listid IN ( '.$listid.') ORDER BY b.listid';
		$resSql = acymailing_loadObjectList($query);
		$listCampaigns = array();
		foreach($resSql as $oneList){
			$listCampaigns[$oneList->listid][] = $oneList->campaignid;
		}
		return $listCampaigns;
	}

}
components/com_acymailing/classes/fields.php000060400000014013152453623450015324 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class fieldsClass extends acymailingClass{

	var $tables = array('fields');
	var $pkey = 'fieldid';
	var $errors = array();
	var $prefix = 'field_';
	var $suffix = '';
	var $excludeValue = array();
	var $formoption = '';

	var $labelClass = '';

	var $dispatcher;

	var $currentUserEmail;

	var $origin;

	function __construct($config = array()){
		acymailing_importPlugin('acymailing');
		return parent::__construct($config);
	}

	function getFields($area, &$user){

		if(empty($user)) $user = new stdClass();

		$where = array();
		$where[] = 'a.`published` = 1';
		if($area == 'backend'){
			$where[] = 'a.`backend` = 1';
			$where[] = 'a.`core` = 0';
		}elseif($area == 'backlisting'){
			$where[] = 'a.`listing` = 1';
			$where[] = 'a.`type` != \'category\'';
		}elseif($area == 'frontcomp'){
			$where[] = 'a.`frontcomp` = 1';
		}elseif($area == 'frontform'){
			$where[] = 'a.`frontform` = 1';
			$where[] = 'a.`core` = 0';
		}elseif($area == 'frontlisting'){
			$where[] = 'a.`frontlisting` = 1';
			$where[] = 'a.`type` != \'category\'';
		}elseif($area == 'frontjoomlaprofile'){
			$where[] = 'a.`frontjoomlaprofile` = 1';
			$where[] = 'a.`type` != \'category\'';
		}elseif($area == 'frontjoomlaregistration'){
			$where[] = 'a.`frontjoomlaregistration` = 1';
			$where[] = 'a.`type` != \'category\'';
		}elseif($area == 'joomlaprofile'){
			$where[] = 'a.`joomlaprofile` = 1';
			$where[] = 'a.`type` != \'category\'';
		}elseif($area == 'fieldcat'){
			$where[] = "a.`type`='category'";
		}elseif($area == 'module'){
		}elseif($area != 'all'){
			$area = acymailing_escapeDB($area);
			$namesField = str_replace(",", $area[0].",".$area[0], $area);
			$where[] = "a.`namekey` IN (".$namesField.")";
		}

		if(!acymailing_isAdmin() && acymailing_level(3)){
			$groups = acymailing_getGroupsByUser(acymailing_currentUserId(), false);
			$condGroup = '';
			foreach($groups as $group){
				$condGroup .= ' OR a.access LIKE (\'%,'.$group.',%\')';
			}
			$filterAccess = 'AND (a.access = \'all\''.$condGroup.')';
		}else{
			$filterAccess = '';
		}

		$fields = acymailing_loadObjectList('SELECT * FROM `#__acymailing_fields` as a WHERE '.implode(' AND ', $where).' '.$filterAccess.' ORDER BY a.`ordering` ASC', 'namekey');
		foreach($fields as $namekey => $field){
			if(!empty($fields[$namekey]->options)){
				$fields[$namekey]->options = unserialize($fields[$namekey]->options);
			}else{
				$fields[$namekey]->options = array();
			}

			if(!empty($field->value)){
				$fields[$namekey]->value = $this->explodeValues($fields[$namekey]->value);
			}
			if($field->type == 'file' || $field->type == 'gravatar') $this->formoption = 'enctype="multipart/form-data"';
			if(empty($user->subid)) $user->$namekey = $field->default;
		}
		if(acymailing_level(3)){
			$allFields = acymailing_loadObjectList('SELECT * FROM `#__acymailing_fields`', 'fieldid');

			$baseElem = array();
			$elemInCat = array();
			foreach($fields as $namekey => $field){
				if($field->fieldcat == 0){
					$baseElem[] = $field;
				} // root element
				else{
					$parentId = $this->getParentCat($field, $fields, $allFields);
					$field->fieldcat = $parentId;
					if($parentId == 0){
						$baseElem[] = $field;
					} // No parent
					else{
						if(empty($elemInCat[$field->fieldcat])) $elemInCat[$field->fieldcat] = array();
						$elemInCat[$field->fieldcat][] = $field;
					}
				}
			}
			$finalField = array();
			foreach($baseElem as $oneField){
				$finalField[$oneField->namekey] = $oneField;
				if($oneField->type == 'category' && !empty($elemInCat[$oneField->fieldid])){
					$childs = $this->getChildFields($oneField->fieldid, $elemInCat);
					$finalField = $finalField + $childs;
				}
			}
			$fields = $finalField;
		}
		return $fields;
	}

	private function getParentCat($elem, $fields, $allFields){
		$parent = $allFields[$elem->fieldcat];
		if(array_key_exists($parent->namekey, $fields)){
			return $parent->fieldid;
		}else{
			if($parent->fieldcat == 0){
				return 0;
			}else return $this->getParentCat($parent, $fields, $allFields);
		}
	}

	private function getChildFields($fieldcatid, $elemInCat){
		$childs = array();
		$childElems = $elemInCat[$fieldcatid];
		foreach($childElems as $oneField){
			$childs[$oneField->namekey] = $oneField;
			if($oneField->type == 'category' && !empty($elemInCat[$oneField->fieldid])){
				$subChilds = $this->getChildFields($oneField->fieldid, $elemInCat);
				$childs = $childs + $subChilds;
			}
		}
		return $childs;
	}

	function getFieldName($field){
		$addLabels = array('textarea', 'text', 'dropdown', 'multipledropdown', 'file');
		return '<label '.(empty($this->labelClass) ? '' : ' class="'.$this->labelClass.'" ').(in_array($field->type, $addLabels) ? ' for="'.$this->prefix.$field->namekey.$this->suffix.'" ' : '').'>'.$this->trans($field->fieldname).'</label>';
	}

	function trans($name){
		if(preg_match('#^[A-Z_]*$#', $name)){
			return acymailing_translation($name);
		}
		return $name;
	}

	function listing($field, $value, $search = ''){
		$functionType = '_listing'.ucfirst($field->type);

		if(method_exists($this, $functionType)) return $this->$functionType($field, $value);

		ob_start();
		$resultTrigger = acymailing_trigger('onAcyListingField_'.$field->type, array($field, $value));
		$pluginField = ob_get_clean();

		if(!empty($pluginField)){
			return $pluginField;
		}else return acymailing_dispSearch(nl2br($this->trans($value)), $search);
	}

	function explodeValues($values){
		$allValues = explode("\n", $values);
		$returnedValues = array();
		foreach($allValues as $id => $oneVal){
			$line = explode('::', trim($oneVal));
			$var = @$line[0];
			$val = @$line[1];
			if(strlen($val) < 1) continue;

			$obj = new stdClass();
			$obj->value = $val;
			for($i = 2; $i < count($line); $i++){
				$obj->{$line[$i]} = 1;
			}
			$returnedValues[$var] = $obj;
		}
		return $returnedValues;
	}

}
components/com_acymailing/classes/mail.php000060400000056701152453623450015012 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class mailClass extends acymailingClass{

	var $tables = array('queue', 'listmail', 'stats', 'userstats', 'urlclick', 'mail');
	var $pkey = 'mailid';
	var $namekey = 'alias';
	var $allowedFields = array('subject', 'published', 'fromname', 'fromemail', 'replyname', 'replyemail', 'type', 'visible', 'alias', 'html', 'tempid', 'altbody', 'filter', 'metakey', 'metadesc', 'language', 'summary', 'thumb', 'params');

	function get($id, $default = null){

		if(empty($id)) return null;

		$query = 'SELECT a.* FROM '.acymailing_table('mail').' as a WHERE ';
		$query .= is_numeric($id) ? 'a.mailid' : 'a.alias';
		$query .= ' = '.acymailing_escapeDB($id);
		$query .= ' LIMIT 1';

		$mail = acymailing_loadObject($query);

		if(empty($mail) || empty($mail->mailid)) return $default;

		if(!empty($mail->userid)){
			$author = acymailing_loadObject('SELECT b.'.$this->cmsUserVars->username.' AS username, b.'.$this->cmsUserVars->name.' AS name, b.'.$this->cmsUserVars->email.' AS email FROM '.acymailing_table('users', false).' as b WHERE b.'.$this->cmsUserVars->id.' = '.intval($mail->userid).' LIMIT 1');
			if(!empty($author)){
				foreach($author as $var => $value){
					$mail->$var = $value;
				}
			}
		}

		$mail->subject = acyEmoji::Decode($mail->subject);
		$mail->attach = empty($mail->attach) ? array() : unserialize($mail->attach);
		$mail->favicon = empty($mail->favicon) ? new stdClass() : unserialize($mail->favicon);
		$mail->params = empty($mail->params) ? array() : unserialize($mail->params);
		$mail->filter = empty($mail->filter) ? array() : unserialize($mail->filter);

		return $mail;
	}

	function getMails($types = null, $key = 'mailid'){
		$query = 'SELECT * FROM '.acymailing_table('mail');

		$allowedTypes = array('action', 'autonews', 'followup', 'joomlanotification', 'news', 'notification', 'unsub', 'welcome');
		if(!empty($types)){
			$notAllowed = array_diff($types, $allowedTypes);
			if(!empty($notAllowed)) die('Invalid type(s) '.implode(', ', $types));
			$query .= ' WHERE type = "'.implode('" OR type = "', $types).'"';
		}

		$query .= ' ORDER BY created DESC LIMIT 3000';

		$mails = acymailing_loadObjectList($query);

		$result = array();
		if(!empty($key) && !empty($mails) && !isset($mails[0]->$key)) die('Invalid key '.$key);
		foreach($mails as $oneMail){
			$oneMail->subject = acyEmoji::Decode($oneMail->subject);
			$oneMail->attach = empty($oneMail->attach) ? array() : unserialize($oneMail->attach);
			$oneMail->favicon = empty($oneMail->favicon) ? new stdClass() : unserialize($oneMail->favicon);
			$oneMail->params = empty($oneMail->params) ? array() : unserialize($oneMail->params);
			$oneMail->filter = empty($oneMail->filter) ? array() : unserialize($oneMail->filter);

			if(empty($key))	$result[$oneMail->type][] = $oneMail;
			else $result[$oneMail->type][$oneMail->$key] = $oneMail;
		}

		return $result;
	}

	function saveForm(){
		$config = acymailing_config();

		$mail = new stdClass();
		$mail->mailid = acymailing_getCID('mailid');

		$formData = acymailing_getVar('array', 'data', array(), '');
		if(!empty($formData['mail']['subject'])) $formData['mail']['subject'] = str_replace(chr(226).chr(128).chr(168), '', $formData['mail']['subject']);
		$formData['mail']['subject'] = acyEmoji::Encode($formData['mail']['subject']);

		$result = preg_match('/(\\\u[0-9a-f]{4})+/i', $formData['mail']['subject']);
		if($result){
			$toggleClass = acymailing_get('helper.toggle');
			if($config->get('emojiwarning', 1)){
				$notremind = acymailing_isAdmin() ? '<small style="float:right;margin-right:30px;position:relative;">'.$toggleClass->delete('acymailing_messages_warning', 'emojiwarning_0', 'config', false, acymailing_translation('DONT_REMIND')).'</small>' : '';
				acymailing_enqueueMessage(acymailing_translation_sprintf('ACY_EMOJI_CONFIRMATION', '<a target="_blank" href="'.ACYMAILING_HELPURL.'newsletters&level=Enterprise#infos">', '</a>').' '.$notremind, 'warning');
			}
		}

		foreach($formData['mail'] as $column => $value){
			if(!acymailing_isAdmin() && !in_array($column, $this->allowedFields)) continue;
			acymailing_secureField($column);
			if(in_array($column, array('params', 'summary'))){
				$mail->$column = $value;
			}else{
				$mail->$column = strip_tags($value, '<ADV>');
			}
		}

		$mail->lastupdate = time();
		$mail->userlastupdate = acymailing_currentUserId();

		$mail->body = acymailing_getVar('string', 'editor_body', '', '', ACY_ALLOWRAW);
		$mail->body = acymailing_filterText($mail->body);

		$acypluginsHelper = acymailing_get('helper.acyplugins');
		$acypluginsHelper->cleanHtml($mail->body);
		$mail->body = $acypluginsHelper->removeJS($mail->body);

		$mail->attach = array();
		$attachments = acymailing_getVar('array', 'attachments', array(), '');

		if(!empty($attachments)){
			foreach($attachments as $id => $filepath){
				if(empty($filepath)) continue;
				$attachment = new stdClass();
				$attachment->filename = $filepath;
				$attachment->size = filesize(ACYMAILING_ROOT.$filepath);
				$extension = substr($attachment->filename, strrpos($attachment->filename, '.'));

				if(preg_match('#\.(php.?|.?htm.?|pl|py|jsp|asp|sh|cgi)#Ui', $attachment->filename)){
					acymailing_enqueueMessage(acymailing_translation_sprintf('ACCEPTED_TYPE', substr($attachment->filename, strrpos($attachment->filename, '.') + 1), $config->get('allowedfiles')), 'notice');
					continue;
				}
				$attachment->filename = str_replace(array('.', ' '), '_', substr($attachment->filename, 0, strpos($attachment->filename, $extension))).$extension;

				$mail->attach[] = $attachment;
			}
		}

		$faviconRequest = acymailing_getVar('none', 'favicon', '');
		if(!empty($faviconRequest[0])){
			$faviconRequest = $faviconRequest[0];
			$favicon = new stdClass();
			$favicon->filename = $faviconRequest;
			$favicon->size = filesize(ACYMAILING_ROOT.$faviconRequest);
			$extension = substr($favicon->filename, strrpos($favicon->filename, '.'));
			if(preg_match('#\.(php.?|.?htm.?|pl|py|jsp|asp|sh|cgi)#Ui', $favicon->filename)){
				acymailing_enqueueMessage(acymailing_translation_sprintf('ACCEPTED_TYPE', substr($favicon->filename, strrpos($favicon->filename, '.') + 1), $config->get('allowedfiles')), 'notice');
			}

			$favicon->filename = str_replace(array('.', ' '), '_', substr($favicon->filename, 0, strpos($favicon->filename, $extension))).$extension;

			$mail->favicon = $favicon;
		}

		if(isset($mail->filter)){
			$mail->filter = array();
			$filterData = acymailing_getVar('none', 'filter');
			unset($filterData['type']['__block__']);
			unset($filterData['__num__']);
			$realNum = 0;
			$blockNum = 0;
			foreach ($filterData['type'] as $oneFilter){
				foreach($oneFilter as $num => $oneType) {
					if (empty($oneType)) continue;
					$mail->filter['type'][$blockNum][$realNum] = $oneType;
					$mail->filter[$realNum][$oneType] = $filterData[$num][$oneType];
					$realNum++;
				}
				$blockNum++;
			}
		}

		$toggleHelper = acymailing_get('helper.toggle');
		if(!empty($mail->type) && $mail->type == 'followup' && !empty($mail->mailid)){
			$oldMail = $this->get($mail->mailid);
			if(!empty($mail->published) AND !$oldMail->published){
				$this->_publishfollowup($mail);
			}
			if($oldMail->senddate != $mail->senddate){
				$text = acymailing_translation('FOLLOWUP_CHANGED_DELAY_INFORMED');
				$text .= ' '.$toggleHelper->toggleText('update', $mail->mailid, 'followup', acymailing_translation('FOLLOWUP_CHANGED_DELAY'));
				acymailing_enqueueMessage($text, 'notice');
			}
		}

		if(preg_match('#<a[^>]*subid=[0-9].*</a>#Uis', $mail->body, $pregResult)){
			acymailing_enqueueMessage(acymailing_translation_sprintf('ACY_PERSONAL_LINK', $pregResult[0]), 'warning');
		}

		if(empty($mail->thumb)){
			unset($mail->thumb);
		}elseif($mail->thumb == 'delete'){
			$mail->thumb = '';
		}
		if(isset($mail->published) && $mail->published != 1) $mail->published = 0;
		if(isset($mail->html) && $mail->html != 1) $mail->html = 0;
		if(isset($mail->visible) && $mail->visible != 1) $mail->visible = 0;
		$mailid = $this->save($mail);
		if(!$mailid) return false;
		acymailing_setVar('mailid', $mailid);

		$selectedTags = acymailing_getVar('array', 'tags', array(), '');
		
		acymailing_query('DELETE FROM #__acymailing_tagmail WHERE mailid = '.intval($mailid));

		if(!empty($selectedTags)){
			$securedTags = array();

			foreach($selectedTags as $oneTag){
				$securedTags[] = acymailing_escapeDB($oneTag);
			}

			$existingTags = acymailing_loadResultArray('SELECT name FROM #__acymailing_tag WHERE name = '.implode(' OR name = ', $securedTags));
			$nonExistingTags = array_diff($selectedTags, $existingTags);

			if(!empty($nonExistingTags)){
				$query = 'INSERT INTO #__acymailing_tag (name, userid) VALUES ';
				foreach($nonExistingTags as &$oneTag){
					$oneTag = '('.acymailing_escapeDB($oneTag).', '.intval(acymailing_currentUserId()).')';
				}
				acymailing_query($query.implode(',', $nonExistingTags));
			}

			$allTags = acymailing_loadResultArray('SELECT tagid FROM #__acymailing_tag WHERE name = '.implode(' OR name = ', $securedTags));

			acymailing_query('INSERT INTO #__acymailing_tagmail (tagid, mailid) VALUES ('.implode(','.intval($mailid).'),(', $allTags).','.intval($mailid).')');
		}

		$status = true;

		if(!empty($formData['listmail'])){
			$receivers = array();
			$remove = array();

			foreach($formData['listmail'] as $listid => $receiveme){
				if(!empty($receiveme)){
					$receivers[] = $listid;
				}else{
					$remove[] = $listid;
				}
			}

			$listMailClass = acymailing_get('class.listmail');
			$status = $listMailClass->save($mailid, $receivers, $remove);
		}

		if(!empty($mail->type) && $mail->type == 'followup' && empty($mail->mailid) && !empty($mail->published)){
			$mail->mailid = $mailid;
			$this->_publishfollowup($mail);
		}

		return $status;
	}

	function addFollowUpQueue($mailid, $all = false){
		$followup = $this->get($mailid);
		if(empty($followup->mailid)){
			$this->errors[] = 'Could not load mailid '.$mailid;
			return false;
		}

		$listmailClass = acymailing_get('class.listmail');
		$mycampaign = $listmailClass->getCampaign($followup->mailid);
		if(empty($mycampaign->listid)){
			$this->errors[] = 'Could not get the attached campaign';
			return false;
		}

		$config = acymailing_config();

		$query = 'INSERT IGNORE INTO `#__acymailing_queue` (`mailid`,`senddate`,`priority`,`subid`) ';
		$query .= 'SELECT '.$followup->mailid.', b.`subdate` + '.intval($followup->senddate).' , '.(int)$config->get('priority_followup', 2).', b.`subid` ';
		$query .= 'FROM `#__acymailing_listsub` as b';
		$query .= ' WHERE b.`status` = 1 AND b.`listid` = '.intval($mycampaign->listid);
		if(!$all) $query .= ' AND b.`subdate` > '.(time() - $followup->senddate);
		$nbinserted = acymailing_query($query);

		if(!empty($nbupdated)){
			$campaignHelper = acymailing_get('helper.campaign');
			$campaignHelper->updateUnsubdate($mycampaign->listid, $followup->senddate);
		}

		return $nbinserted;
	}

	private function _publishfollowup(&$mail){
		$listmailClass = acymailing_get('class.listmail');
		$mycampaign = $listmailClass->getCampaign($mail->mailid);

		if(empty($mycampaign->listid)){
			return;
		}

		$toggleHelper = acymailing_get('helper.toggle');
		$startdate = (time() - $mail->senddate);
		$total = acymailing_loadResult('SELECT COUNT(subid) as total FROM `#__acymailing_listsub` as b WHERE b.`status` = 1 AND b.`listid` = '.intval($mycampaign->listid).' AND b.`subdate` > '.intval($startdate));

		$totalall= acymailing_loadResult('SELECT COUNT(subid) as total FROM `#__acymailing_listsub` as b WHERE b.`status` = 1 AND b.`listid` = '.intval($mycampaign->listid));

		if(empty($total) && empty($totalall)) return;

		$text = acymailing_translation('FOLLOWUP_PUBLISHED_INFORMED');
		$text .= '<ul>';
		if(!empty($total)) $text .= '<li>'.$toggleHelper->toggleText('add', $mail->mailid, 'followup', acymailing_translation_sprintf('FOLLOWUP_ADDQUEUE_USERS', acymailing_getDate($startdate)).' ( '.acymailing_translation_sprintf('SELECTED_USERS', $total).' )').'</li>';
		if(!empty($totalall)) $text .= '<li>'.$toggleHelper->toggleText('addall', $mail->mailid, 'followup', acymailing_translation('FOLLOWUP_ADDQUEUE_ALLUSERS').' ( '.acymailing_translation_sprintf('SELECTED_USERS', $totalall).' )').'</li>';

		acymailing_enqueueMessage($text, 'notice');
	}

	function save($mail){
		if(isset($mail->alias) OR empty($mail->mailid)){
			if(empty($mail->alias)){
				$mail->alias = $mail->subject;
				$mail->alias = preg_replace('/(\\\u[0-9a-f]{4})+/i', '', $mail->alias);
			}
			$mail->alias = acymailing_cleanSlug($mail->alias);
		}

		if(empty($mail->mailid)){
			if(empty($mail->created)) $mail->created = time();
			if(empty($mail->userid)){
				$mail->userid = acymailing_currentUserId();
			}
			if(empty($mail->key)) $mail->key = acymailing_generateKey(8);
		}else{
			if(!empty($mail->attach)){
				$oldMailObject = $this->get($mail->mailid);
				if(!empty($oldMailObject) && is_array($oldMailObject->attach)){
					$mail->attach = array_merge($oldMailObject->attach, $mail->attach);
				}
			}
		}

		if(empty($mail->attach)) unset($mail->attach);
		if(empty($mail->favicon)) unset($mail->favicon);

		if(!empty($mail->attach) && !is_string($mail->attach)) $mail->attach = serialize($mail->attach);
		if(!empty($mail->favicon) && !is_string($mail->favicon)) $mail->favicon = serialize($mail->favicon);
		if(isset($mail->filter) && !is_string($mail->filter)) $mail->filter = serialize($mail->filter);

		if(!empty($mail->params)){
			if(!empty($mail->params['lastgenerateddate']) && !is_numeric($mail->params['lastgenerateddate'])){
				$mail->params['lastgenerateddate'] = acymailing_getTime($mail->params['lastgenerateddate']);
			}

			if(!empty($mail->mailid)) {
				$oldMail = $this->get($mail->mailid);
				if(!empty($oldMail->params)){
					foreach($oldMail->params as $key => $val){
						if(!isset($mail->params[$key])) $mail->params[$key] = $val;
					}
				}
			}

			$mail->params = serialize($mail->params);
		}

		if(!empty($mail->senddate) && !is_numeric($mail->senddate)){
			$mail->senddate = acymailing_getTime($mail->senddate);
		}

		acymailing_importPlugin('acymailing');

		if(empty($mail->mailid)){
			acymailing_trigger('onAcyBeforeMailCreate', array(&$mail));
			$status = acymailing_insertObject(acymailing_table('mail'), $mail);
		}else{
			acymailing_trigger('onAcyBeforeMailModify', array(&$mail));
			$status = acymailing_updateObject(acymailing_table('mail'), $mail, 'mailid');
		}

		if(!$status){
			$this->errors[] = substr(strip_tags(acymailing_getDBError()), 0, 200).'...';
		}

		if(!empty($mail->params) && is_string($mail->params)) $mail->params = unserialize($mail->params);
		if(!empty($mail->attach) && is_string($mail->attach)) $mail->attach = unserialize($mail->attach);
		if(!empty($mail->favicon) && is_string($mail->favicon)) $mail->favicon = unserialize($mail->favicon);

		if($status) return empty($mail->mailid) ? $status : $mail->mailid;
		return false;
	}

	function saveastmpl(){
		$tmplClass = acymailing_get('class.template');
		$newTmpl = new stdClass();

		$formData = acymailing_getVar('array', 'data', array(), '');
		if(!empty($formData['mail']['tempid'])){
			$template = $tmplClass->get($formData['mail']['tempid']);
			$newTmpl->styles = $template->styles;
			$newTmpl->stylesheet = $template->stylesheet;
			$newTmpl->category = $template->category;
		}
		if(!empty($formData['mail']['subject'])){
			$formData['mail']['subject'] = str_replace(chr(226).chr(128).chr(168), '', $formData['mail']['subject']);
			$newTmpl->subject = strip_tags($formData['mail']['subject']);
			$newTmpl->name = strip_tags($formData['mail']['subject']);
		}

		$newTmpl->body = acymailing_getVar('string', 'editor_body', '', '', ACY_ALLOWRAW);
		$newTmpl->body = acymailing_filterText($newTmpl->body);
		$acypluginsHelper = acymailing_get('helper.acyplugins');
		$acypluginsHelper->cleanHtml($newTmpl->body);

		if(!empty($formData['mail']['thumb']) && $formData['mail']['thumb'] == 'delete'){
			$newTmpl->thumb = null;
		}elseif(!empty($formData['mail']['thumb'])){
			$newTmpl->thumb = strip_tags($formData['mail']['thumb']);
		}else{
			$mailid = acymailing_getCID('mailid');
			if(!empty($mailid)){
				$mail = $this->get($mailid);
				$newTmpl->thumb = $mail->thumb;
			}
		}
		if(!empty($formData['mail']['altbody'])) $newTmpl->altbody = strip_tags($formData['mail']['altbody']);
		if(!empty($formData['mail']['fromname'])) $newTmpl->fromname = strip_tags($formData['mail']['fromname']);
		if(!empty($formData['mail']['fromemail'])) $newTmpl->fromemail = strip_tags($formData['mail']['fromemail']);
		if(!empty($formData['mail']['replyname'])) $newTmpl->replyname = strip_tags($formData['mail']['replyname']);
		if(!empty($formData['mail']['replyemail'])) $newTmpl->replyemail = strip_tags($formData['mail']['replyemail']);
		if(!empty($formData['mail']['summary'])) $newTmpl->description = strip_tags($formData['mail']['summary']);
		$newTmpl->ordering = 1;

		$tempid = $tmplClass->save($newTmpl);
		if(!empty($tempid)){
			$formData['mail']['tempid'] = $tempid;
			acymailing_enqueueMessage(acymailing_translation('ACY_SAVEASTMPL_VALID'), 'message');
		}else{
			acymailing_enqueueMessage(acymailing_translation('ERROR_SAVING'), 'error');
		}

		return true;
	}


	function ab_test($abTestDetail, $mailsArray, $nbTotalReceivers){
		$query = "UPDATE #__acymailing_mail SET abtesting=".acymailing_escapeDB(serialize($abTestDetail)).", published=1 WHERE mailid IN (".implode(',', $mailsArray).")";
		acymailing_query($query);

		if($abTestDetail['action'] != 'manual'){
			$config = acymailing_config();
			$currentAbTests = $config->get('currentABTests', '');
			if(!empty($currentAbTests)){
				$currentData = unserialize($currentAbTests);
			}else $currentData = array();
			$newTest = new stdClass();
			$newTest->sendDate = $abTestDetail['time'] + ($abTestDetail['delay'] * 86400);
			$newTest->ids = $abTestDetail['mailids'];
			$currentData[] = $newTest;
			$newconfig = new stdClass();
			$newconfig->currentABTests = serialize($currentData);
			$config->save($newconfig);
		}

		$statsClass = acymailing_get('class.stats');
		$statsClass->delete($mailsArray);

		$queueClass = acymailing_get('class.queue');
		$time = time();
		$nbReceiversTest = floor($nbTotalReceivers * $abTestDetail['prct'] / 100);
		$queueClass->limit = $nbReceiversTest;
		$queueClass->orderBy = 'RAND()';
		$queueClass->queue($mailsArray[0], $time);
		$nbReceiversPerMail = floor($nbReceiversTest / count($mailsArray));
		foreach($mailsArray as $oneMail){
			if($oneMail == $mailsArray[0]) continue;
			$query = "UPDATE #__acymailing_queue SET mailid=".intval($oneMail)." WHERE mailid=".intval($mailsArray[0])." LIMIT ".$nbReceiversPerMail;
			acymailing_query($query);
		}
		$query = "UPDATE #__acymailing_mail SET senddate=".$time." WHERE mailid IN (".implode(',', $mailsArray).")";
		acymailing_query($query);
		return $nbReceiversTest;
	}


	function complete_abtest($typeAction, $mailid){
		$resDetails = acymailing_loadResultArray("SELECT abtesting FROM #__acymailing_mail WHERE mailid=".(int)$mailid);
		$abTestDetail = unserialize($resDetails[0]);
		$dataForCopy = array('mailid' => $mailid, 'abTestDetail' => $abTestDetail);
		$newMailid = $this->abTest_createFinalNewletter($typeAction, $dataForCopy);

		$queueClass = acymailing_get('class.queue');
		$time = time();
		$queueClass->queue($newMailid, $time);

		$mailidsTest = $abTestDetail['mailids'];
		$resUsersFromTest = acymailing_loadResultArray("SELECT subid FROM #__acymailing_userstats WHERE mailid IN (".$mailidsTest.")");
		if(!empty($resUsersFromTest)){
			acymailing_query("DELETE FROM #__acymailing_queue WHERE subid IN (".implode(',', $resUsersFromTest).") AND mailid=".$newMailid);
		}

		$abTestDetail['status'] = 'abTestFinalSend';
		$abTestDetail['newMail'] = $newMailid;
		$query = "UPDATE #__acymailing_mail SET abtesting=".acymailing_escapeDB(serialize($abTestDetail))." WHERE mailid IN (".$mailidsTest.")";
		acymailing_query($query);

		return $newMailid;
	}

	function abTest_createFinalNewletter($typeAction, $dataForCopy){

		if($typeAction == 'manual'){
			$mailid = $dataForCopy['mailid'];
			$newMailid = $this->copyOneNewsletter($mailid);
			return $newMailid;
		}

		$queryStat = 'SELECT mailid, openunique, clickunique, senthtml, senttext FROM #__acymailing_stats WHERE mailid IN ('.$dataForCopy['abTestDetail']['mailids'].')';
		$resStat = acymailing_loadObjectList($queryStat, 'mailid');
		$betterClick = -1;
		$betterOpen = -1;
		if(empty($resStat)) return 0;
		foreach($resStat as $mailid => $statsMail){
			if($statsMail->openunique > $betterOpen){
				$idOpen = $mailid;
				$betterOpen = $statsMail->openunique;
			}
			if($statsMail->clickunique > $betterClick){
				$idClick = $mailid;
				$betterClick = $statsMail->clickunique;
			}
		}
		if($dataForCopy['abTestDetail']['action'] == 'open'){
			$newMailid = $this->copyOneNewsletter($idOpen);
		}elseif($dataForCopy['abTestDetail']['action'] == 'click') $newMailid = $this->copyOneNewsletter($idClick);
		elseif($dataForCopy['abTestDetail']['action'] == 'mix'){
			$newSubject = acymailing_loadObjectList("SELECT subject, fromname, fromemail, replyname, replyemail FROM #__acymailing_mail WHERE mailid=".$idOpen);
			$newMailid = $this->copyOneNewsletter($idClick, $newSubject[0]);
		}
		return $newMailid;
	}

	function copyOneNewsletter($mailid, $subject = ''){
		$time = time();
		$query = 'INSERT INTO `#__acymailing_mail` (`subject`, `fromname`, `fromemail`, `replyname`, `replyemail`, `body`, `altbody`, `published`, `created`, `type`, `visible`, `userid`, `alias`, `attach`, `html`, `tempid`, `key`, `frequency`, `params`,`filter`,`metakey`,`metadesc`,`summary`,`thumb`,`senddate`)';
		if(empty($subject)){
			$query .= " SELECT `subject`, `fromname`, `fromemail`, `replyname`, `replyemail`";
		}else{
			$query .= " SELECT ".acymailing_escapeDB($subject->subject).", ".acymailing_escapeDB($subject->fromname).", ".acymailing_escapeDB($subject->fromemail).", ".acymailing_escapeDB($subject->replyname).", ".acymailing_escapeDB($subject->replyemail);
		}
		$query .= ", `body`, `altbody`, `published`, '.$time.', `type`, `visible`, `userid`, `alias`, `attach`, `html`, `tempid`, ".acymailing_escapeDB(md5(rand(1000, 999999))).', `frequency`, `params`,`filter`,`metakey`,`metadesc`,`summary`,`thumb`,'.time().' FROM `#__acymailing_mail` WHERE `mailid` = '.(int)$mailid;
		acymailing_query($query);
		$newMailid = acymailing_insertID();
		acymailing_query('INSERT IGNORE INTO `#__acymailing_listmail` (`listid`,`mailid`) SELECT `listid`,'.$newMailid.' FROM `#__acymailing_listmail` WHERE `mailid` = '.(int)$mailid);
		acymailing_query('INSERT IGNORE INTO `#__acymailing_tagmail` (`tagid`,`mailid`) SELECT `tagid`,'.$newMailid.' FROM `#__acymailing_tagmail` WHERE `mailid` = '.(int)$mailid);
		return $newMailid;
	}

	function updateAbTest_auto($idsToSend){
		if(empty($idsToSend)) return;
		$resDetails = acymailing_loadObjectList("SELECT mailid, abtesting FROM #__acymailing_mail WHERE mailid IN (".$idsToSend.") AND abtesting IS NOT NULL", 'mailid');
		if(empty($resDetails)) return;

		$oneAbTest = current($resDetails);
		$oneMailid = $oneAbTest->mailid;
		$abTestDetail = unserialize($oneAbTest->abtesting);
		$mailsArray = explode(',', $abTestDetail['mailids']);

		$query = "SELECT COUNT(*) FROM #__acymailing_queue WHERE mailid IN (".$abTestDetail['mailids'].")";
		$queueCheck = acymailing_loadResult($query);

		if(empty($queueCheck)){
			if(($abTestDetail['time'] + ($abTestDetail['delay'] * 24 * 3600)) < time()){
				$newMailid = $this->complete_abtest($abTestDetail['action'], $oneMailid);
				return $newMailid;
			}
		}
	}
}
components/com_acymailing/classes/stats.php000060400000025645152453623450015231 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class statsClass extends acymailingClass{

	var $tables = array('urlclick', 'userstats', 'stats');
	var $pkey = 'mailid';

	var $countReturn = true;

	var $subid = 0;
	var $mailid = 0;


	function saveStats(){
		$subid = empty($this->subid) ? acymailing_getVar('int', 'subid') : $this->subid;
		$mailid = empty($this->mailid) ? acymailing_getVar('int', 'mailid') : $this->mailid;
		if(empty($subid) || empty($mailid)) return false;
		if(acymailing_isRobot()) return false;

		$actual = acymailing_loadObject('SELECT `open` FROM '.acymailing_table('userstats').' WHERE `mailid` = '.intval($mailid).' AND `subid` = '.intval($subid).' LIMIT 1');
		if(empty($actual)) return false;

		$userHelper = acymailing_get('helper.user');

		try{
			$results = acymailing_query('UPDATE #__acymailing_subscriber SET `lastopen_date` = '.time().', `lastopen_ip` = '.acymailing_escapeDB($userHelper->getIP()).' WHERE `subid` = '.intval($subid));
		}catch(Exception $e){
			$results = null;
		}
		if($results === null){
			acymailing_display(isset($e) ? $e->getMessage() : substr(strip_tags(acymailing_getDBError()), 0, 200).'...', 'error');
			exit;
		}

		$open = 0;

		if(empty($actual->open)){
			$open = 1;
			$unique = ',openunique = openunique +1';
		}elseif($this->countReturn){
			$open = $actual->open + 1;
			$unique = '';
		}
		if(empty($open)) return true;

		$ipClass = acymailing_get('helper.user');
		$ip = $ipClass->getIP();

		try{
			$results = acymailing_query('UPDATE '.acymailing_table('userstats').' SET open = '.$open.', opendate = '.time().', `ip`= '.acymailing_escapeDB($ip).' WHERE mailid = '.$mailid.' AND subid = '.$subid);
		}catch(Exception $e){
			$results = null;
		}
		if($results === null){
			acymailing_display(isset($e) ? $e->getMessage() : substr(strip_tags(acymailing_getDBError()), 0, 200).'...', 'error');
			exit;
		}

		$browsers = array(
			'Abrowse' => 'abrowse',
			'Abolimba' => 'abolimba',
			'3ds' => '3ds',
			'Acoo browser' => 'acoo browser',
			'Alienforce' => 'alienforce',
			'Amaya' => 'amaya',
			'Amigavoyager' => 'amigavoyager',
			'Antfresco' => 'antfresco',
			'Aol' => 'aol',
			'Arora' => 'arora',
			'Avant' => 'avant',
			'Baidubrowser' => 'baidubrowser',
			'Beamrise' => 'beamrise',
			'Beonex' => 'beonex',
			'Blackbird' => 'blackbird',
			'Blackhawk' => 'blackhawk',
			'Bolt' => 'bolt',
			'Browsex' => 'browsex',
			'Browzar' => 'browzar',
			'Bunjalloo' => 'bunjalloo',
			'Camino' => 'camino',
			'Charon' => 'charon',
			'Chromium' => 'chromium',
			'Columbus' => 'columbus',
			'Cometbird' => 'cometbird',
			'Dragon' => 'dragon',
			'Conkeror' => 'conkeror',
			'Coolnovo' => 'coolnovo',
			'Corom' => 'corom',
			'Deepnet explorer' => 'deepnet explorer',
			'Demeter' => 'demeter',
			'Deskbrowse' => 'deskbrowse',
			'Dillo' => 'dillo',
			'Dooble' => 'dooble',
			'Dplus' => 'dplus',
			'Edbrowse' => 'edbrowse',
			'Element browser' => 'element browser',
			'Elinks' => 'elinks',
			'Epic' => 'epic',
			'Epiphany' => 'epiphany',
			'Firebird' => 'firebird',
			'Flock' => 'flock',
			'Fluid' => 'fluid',
			'Galeon' => 'galeon',
			'Globalmojo' => 'globalmojo',
			'Greenbrowser' => 'greenbrowser',
			'Hotjava' => 'hotjava',
			'Hv3' => 'hv3',
			'Hydra' => 'hydra',
			'Ibrowse' => 'ibrowse',
			'Icab' => 'icab',
			'Icebrowser' => 'icebrowser',
			'Iceape' => 'iceape',
			'Icecat' => 'icecat',
			'Icedragon' => 'icedragon',
			'Iceweasel' => 'iceweasel',
			'Surfboard' => 'surfboard',
			'Irider' => 'irider',
			'Iron' => 'iron',
			'Meleon' => 'meleon',
			'Ninja' => 'ninja',
			'Kapiko' => 'kapiko',
			'Kazehakase' => 'kazehakase',
			'Strata' => 'strata',
			'Kkman' => 'kkman',
			'Konqueror' => 'konqueror',
			'Kylo' => 'kylo',
			'Lbrowser' => 'lbrowser',
			'Links' => 'links',
			'Lobo' => 'lobo',
			'Lolifox' => 'lolifox',
			'Lunascape' => 'lunascape',
			'Lynx' => 'lynx',
			'Maxthon' => 'maxthon',
			'Midori' => 'midori',
			'Minibrowser' => 'minibrowser',
			'Mosaic' => 'mosaic',
			'Multizilla' => 'multizilla',
			'Myibrow' => 'myibrow',
			'Netcaptor' => 'netcaptor',
			'Netpositive' => 'netpositive',
			'Netscape' => 'netscape',
			'Navigator' => 'navigator',
			'Netsurf' => 'netsurf',
			'Nintendobrowser' => 'nintendobrowser',
			'Offbyone' => 'offbyone',
			'Omniweb' => 'omniweb',
			'Orca' => 'orca',
			'Oregano' => 'oregano',
			'Otter' => 'otter',
			'Palemoon' => 'palemoon',
			'Patriott' => 'patriott',
			'Perk' => 'perk',
			'Phaseout' => 'phaseout',
			'Phoenix' => 'phoenix',
			'Polarity' => 'polarity',
			'Playstation 4' => 'playstation 4',
			'Qtweb internet browser' => 'qtweb internet browser',
			'Qupzilla' => 'qupzilla',
			'Rekonq' => 'rekonq',
			'Retawq' => 'retawq',
			'Roccat' => 'roccat',
			'Rockmelt' => 'rockmelt',
			'Ryouko' => 'ryouko',
			'Saayaa' => 'saayaa',
			'Seamonkey' => 'seamonkey',
			'Shiira' => 'shiira',
			'Sitekiosk' => 'sitekiosk',
			'Skipstone' => 'skipstone',
			'Sleipnir' => 'sleipnir',
			'Slimboat' => 'slimboat',
			'Slimbrowser' => 'slimbrowser',
			'Metasr' => 'metasr',
			'Stainless' => 'stainless',
			'Sundance' => 'sundance',
			'Sundial' => 'sundial',
			'Sunrise' => 'sunrise',
			'Superbird' => 'superbird',
			'Surf' => 'surf',
			'Swiftweasel' => 'swiftweasel',
			'Tenfourfox' => 'tenfourfox',
			'Theworld' => 'theworld',
			'Tjusig' => 'tjusig',
			'Tencenttraveler' => 'tencenttraveler',
			'Ultrabrowser' => 'ultrabrowser',
			'Usejump' => 'usejump',
			'Uzbl' => 'uzbl',
			'Vonkeror' => 'vonkeror',
			'V3m' => 'v3m',
			'Webianshell' => 'webianshell',
			'Webrender' => 'webrender',
			'Weltweitimnetzbrowser' => 'weltweitimnetzbrowser',
			'Whitehat aviator' => 'whitehat aviator',
			'Wkiosk' => 'wkiosk',
			'Worldwideweb' => 'worldwideweb',
			'Wyzo' => 'wyzo',
			'Smiles' => 'smiles',
			'Yabrowser' => 'yabrowser',
			'Yrcweblink' => 'yrcweblink',
			'Zbrowser' => 'zbrowser',
			'Zipzap' => 'zipzap',
			'Firefox' => 'firefox',
			'Internet Explorer' => 'msie|trident',
			'Opera' => 'opera',
			'Chrome' => 'chrome',
			'Safari' => 'safari',
			'Thunderbird' => 'thunderbird',
			'Outlook' => 'outlook',
			'Airmail' => 'airmail',
			'Barca' => 'barca',
			'Eudora' => 'eudora',
			'Gcmail' => 'gcmail',
			'Lotus' => 'lotus',
			'Pocomail' => 'pocomail',
			'Postbox' => 'postbox',
			'Shredder' => 'shredder',
			'Sparrow' => 'sparrow',
			'Spicebird' => 'spicebird',
			'Bat!' => 'bat!',
			'Tizenbrowser' => 'tizenbrowser',
			'Apple Mail' => 'applewebkit',
			'Mozilla' => 'mozilla',
			'Gecko' => 'gecko'
		);

		$name = "unknown";
		$version = "";

		if(isset($_SERVER['HTTP_USER_AGENT'])){
			$agent = strtolower($_SERVER['HTTP_USER_AGENT']);
		}else{
			$agent = "unknown";
		}
		foreach($browsers as $key => $oneBrowser){
			if(preg_match("#($oneBrowser)[/ ]?([0-9]*)#", $agent, $match)){
				$name = $key;
				$version = $this->_getRealBrowserVersion($match[2], $name, $agent);
				break;
			}
		}

		$isMobile = 0;
		$osName = '';
		if(preg_match('/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/', $agent) || preg_match('/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i', substr($agent, 0, 4))){
			$isMobile = 1;
			$osName = "unknown";
			$mobileOs = array("bada" => "Bada", "ubuntu; mobile" => "Ubuntu", "ubuntu; tablet" => "Ubuntu", "tizen" => "Tizen", "palm os" => "Palm", "meego" => "meeGo", "symbian" => "Symbian", "symbos" => "Symbian", "blackberry" => "BlackBerry", "windows ce" => "Windows Phone", "windows mobile" => "Windows Phone", "windows phone" => "Windows Phone", "iphone" => "iOS", "ipad" => "iOS", "ipod" => "iOS", "android" => "Android");
			$mobileOsKeys = array_keys($mobileOs);
			foreach($mobileOsKeys as $oneMobileOsKey){
				if(preg_match("/($oneMobileOsKey)/", $agent, $match2)){
					$osName = $mobileOs[$match2[1]];
					break;
				}
			}
		}

		try{
			$results = acymailing_query('UPDATE '.acymailing_table('userstats').' SET `is_mobile` = '.intval($isMobile).', `mobile_os` = '.acymailing_escapeDB($osName).', `browser` = '.acymailing_escapeDB($name).', browser_version = '.intval($version).', user_agent = '.acymailing_escapeDB($agent).' WHERE mailid = '.$mailid.' AND subid = '.$subid.' LIMIT 1');
		}catch(Exception $e){
			$results = null;
		}
		if($results === null){
			acymailing_display(isset($e) ? $e->getMessage() : substr(strip_tags(acymailing_getDBError()), 0, 200).'...', 'error');
			exit;
		}

		acymailing_query('UPDATE '.acymailing_table('stats').' SET opentotal = opentotal +1 '.$unique.' WHERE mailid = '.$mailid.' LIMIT 1');

		if(!empty($subid)){
			$filterClass = acymailing_get('class.filter');
			$filterClass->subid = $subid;
			$filterClass->trigger('opennews');
		}

		$classGeoloc = acymailing_get('class.geolocation');
		$classGeoloc->saveGeolocation('open', $subid);

		acymailing_importPlugin('acymailing');
		acymailing_trigger('onAcyOpenMail', array($subid, $mailid));

		return true;
	}

	private function _getRealBrowserVersion($versionUA, $browserUA, $userAgent){
		if($browserUA == 'Internet Explorer' && strpos($userAgent, 'trident') !== false){
			return '11';
		}

		return $versionUA;
	}

}
components/com_acymailing/classes/action.php000060400000005673152453623450015347 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class actionClass extends acymailingClass{

	var $tables = array('action');
	var $pkey = 'action_id';

	function getActions($index = '', $actionIds = 'all'){
		$onlyActionIds = array();
		if(strtolower($actionIds) != 'all'){
			$onlyActionIds = explode(',', $actionIds);
			acymailing_arrayToInteger($onlyActionIds);
		}

		return acymailing_loadObjectList('SELECT * FROM '.acymailing_table('action').(empty($onlyActionIds) ? '' : ' WHERE listid IN ('.implode(',', $onlyActionIds).')').' ORDER BY ordering ASC', $index);
	}

	function delete($elements){
		if(!is_array($elements)) $elements = array($elements);
		acymailing_arrayToInteger($elements);
		if(empty($elements)) return 0;

		return parent::delete($elements);
	}

	function get($actionid, $default = null){
		$query = 'SELECT a.*, b.'.$this->cmsUserVars->name.' AS creatorname, b.'.$this->cmsUserVars->username.' AS creatorusername, b.'.$this->cmsUserVars->email.' AS email FROM '.acymailing_table('action').' AS a LEFT JOIN '.acymailing_table($this->cmsUserVars->table, false).' AS b on a.userid = b.'.$this->cmsUserVars->id.' WHERE action_id = '.intval($actionid).' LIMIT 1';
		return acymailing_loadObject($query);
	}

	function saveForm(){
		$action = new stdClass();
		$action->action_id = acymailing_getCID('action_id');

		$formData = acymailing_getVar('array', 'data', array(), '');

		foreach($formData['action'] as $column => $value){
			if(acymailing_isAdmin()){
				acymailing_secureField($column);
				$action->$column = strip_tags($value);
			}
		}
		if(!empty($action->username)) $action->username = acymailing_punycode($action->username);

		if(empty($action->action_id)) $action->nextdate = time() + intval($action->frequency);
		if($action->password == '********') unset($action->password);

		$action->conditions = json_encode($formData['conditions']);
		$action->actions = json_encode($formData['actions']);

		if(isset($action->published) && $action->published != 1) $action->published = 0;
		$action_id = $this->save($action);
		if(!$action_id) return false;

		acymailing_setVar('action_id', $action_id);
		return true;
	}

	function save($action){
		if(empty($action->action_id) && empty($action->userid)){
			$action->userid = acymailing_currentUserId();
		}

		acymailing_importPlugin('acymailing');
		if(empty($action->action_id)){
			acymailing_trigger('onAcyBeforeActionCreate', array(&$action));
			$status = acymailing_insertObject(acymailing_table('action'), $action);
		}else{
			acymailing_trigger('onAcyBeforeActionModify', array(&$action));
			$status = acymailing_updateObject(acymailing_table('action'), $action, 'action_id');
		}

		if($status) return empty($action->action_id) ? $status : $action->action_id;
		return false;
	}
}
components/com_acymailing/classes/queue.php000060400000015134152453623450015207 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class queueClass extends acymailingClass{

	var $onlynew = false;
	var $mindelay = 0;
	var $limit = 0;
	var $orderBy = '';
	var $emailtypes = array();

	function delete($filters){

		if(!empty($filters)){
			$query = 'DELETE a.* FROM '.acymailing_table('queue').' as a';
			$query .= ' JOIN '.acymailing_table('subscriber').' as b on a.subid = b.subid';
			$query .= ' JOIN '.acymailing_table('mail').' as c on a.mailid = c.mailid';
			$query .= ' WHERE ('.implode(') AND (', $filters).')';
		}else{
			$nbRecords = acymailing_loadResult('SELECT COUNT(*) FROM #__acymailing_queue');

			$query = 'TRUNCATE TABLE '.acymailing_table('queue');
		}
		$affected = acymailing_query($query);
		if(empty($nbRecords)) $nbRecords = $affected;

		return $nbRecords;
	}

	function nbQueue($mailid){
		$mailid = (int)$mailid;
		return acymailing_loadResult('SELECT count(subid) FROM '.acymailing_table('queue').' WHERE mailid = '.$mailid.' GROUP BY mailid');
	}

	function queue($mailid, $time){
		$mailid = intval($mailid);
		if(empty($mailid)) return false;

		$classLists = acymailing_get('class.listmail');
		$lists = $classLists->getReceivers($mailid, false);
		if(empty($lists)) return 0;

		$config = acymailing_config();
		acymailing_importPlugin('acymailing');
		$filterClass = acymailing_get('class.filter'); // Keep it, it loads the acyQuery class

		$mailClass = acymailing_get('class.mail');
		$mail = $mailClass->get($mailid);

		if(empty($mail->filter['type'])){
			$cquery = $this->initialQuery($lists);
			$query = 'INSERT IGNORE INTO '.acymailing_table('queue').' (subid,mailid,senddate,priority) '.$cquery->getQuery(array('a.subid',$mailid,$time,(int)$config->get('priority_newsletter', 3)));
			$totalinserted = acymailing_query($query);
		}else{
			$totalinserted = 0;
			foreach($mail->filter['type'] as $block => $oneFilter) {
				$cquery = $this->initialQuery($lists);
				foreach($oneFilter as $num => $oneType) {
					if(empty($oneType)) continue;
					acymailing_trigger('onAcyProcessFilter_' . $oneType, array(&$cquery, $mail->filter[$num][$oneType], $num));
				}
				$query = 'INSERT IGNORE INTO '.acymailing_table('queue').' (subid,mailid,senddate,priority) '.$cquery->getQuery(array('a.subid',$mailid,$time,(int)$config->get('priority_newsletter', 3)));
				$totalinserted += acymailing_query($query);
			}
		}

		if($this->onlynew){
			$affected = acymailing_query('DELETE b.* FROM `#__acymailing_userstats` as a JOIN `#__acymailing_queue` as b ON a.subid = b.subid AND a.mailid = b.mailid WHERE a.mailid = '.$mailid);
			$totalinserted = $totalinserted - $affected;
		}

		if(!empty($this->mindelay)){
			$affected = acymailing_query('DELETE b.* FROM `#__acymailing_queue` as b JOIN `#__acymailing_userstats` AS a ON a.subid = b.subid WHERE b.mailid = '.$mailid.' AND a.senddate > '.(time() - ($this->mindelay * 24 * 60 * 60)));
			$totalinserted = $totalinserted - $affected;
		}

		acymailing_trigger('onAcySendNewsletter', array($mailid));

		return $totalinserted;
	}

	function initialQuery($lists){
		$query = new acyQuery();

		$query->from = acymailing_table('listsub').' as a ';
		$query->join[] = acymailing_table('subscriber').' as sub ON a.subid = sub.subid ';
		$query->where[] = 'sub.enabled = 1';
		$query->where[] = 'sub.accept = 1';
		$query->where[] = 'a.listid IN ('.implode(',', array_keys($lists)).')';
		$query->where[] = 'a.status = 1';
		$config = acymailing_config();
		if($config->get('require_confirmation', '0')) $query->where[] = 'sub.confirmed = 1';
		$query->orderBy = $this->orderBy;
		$query->limit = $this->limit;

		return $query;
	}

	public function getReady($limit, $mailid = 0){
		if(empty($limit)) return array();

		$config = acymailing_config();
		$order = $config->get('sendorder');
		if(empty($order)){
			$order = 'a.`subid` ASC';
		}else{
			if($order == 'rand'){
				$order = 'RAND()';
			}else{
				$ordering = explode(',', $order);
				$order = 'a.`'.acymailing_secureField(trim($ordering[0])).'` '.acymailing_secureField(trim($ordering[1]));
			}
		}

		$query = 'SELECT a.* FROM '.acymailing_table('queue').' AS a';
		$query .= ' JOIN '.acymailing_table('mail').' AS b on a.`mailid` = b.`mailid` ';
		$query .= ' WHERE a.`senddate` <= '.time().' AND b.`published` = 1';
		if(!empty($this->emailtypes)){
			foreach($this->emailtypes as &$oneType){
				$oneType = acymailing_escapeDB($oneType);
			}
			$query .= ' AND (b.type = '.implode(' OR b.type = ', $this->emailtypes).')';
		}
		if(!empty($mailid)) $query .= ' AND a.`mailid` = '.$mailid;
		$query .= ' ORDER BY a.`priority` ASC, a.`senddate` ASC, '.$order;
		$query .= ' LIMIT '.acymailing_getVar('int', 'startqueue', 0).','.intval($limit);
		try{
			$results = acymailing_loadObjectList($query);
		}catch(Exception $e){
			$results = null;
		}

		if($results === null){
			acymailing_query('REPAIR TABLE #__acymailing_queue, #__acymailing_subscriber, #__acymailing_mail');
		}

		if(empty($results)) return array();

		if(!empty($results)){
			$firstElementQueued = reset($results);
			acymailing_query('UPDATE #__acymailing_queue SET senddate = senddate + 1 WHERE mailid = '.$firstElementQueued->mailid.' AND subid = '.$firstElementQueued->subid.' LIMIT 1');
		}

		$subids = array();
		foreach($results as $oneRes){
			$subids[$oneRes->subid] = intval($oneRes->subid);
		}

		$cleanQueue = false;
		if(!empty($subids)){
			$allusers = acymailing_loadObjectList('SELECT * FROM #__acymailing_subscriber WHERE subid IN ('.implode(',', $subids).')', 'subid');
			foreach($results as $oneId => $oneRes){
				if(empty($allusers[$oneRes->subid])){
					$cleanQueue = true;
					continue;
				}
				foreach($allusers[$oneRes->subid] as $oneVar => $oneVal){
					$results[$oneId]->$oneVar = $oneVal;
				}
			}
		}

		if($cleanQueue){
			acymailing_query('DELETE a.* FROM #__acymailing_queue as a LEFT JOIN #__acymailing_subscriber as b ON a.subid = b.subid WHERE b.subid IS NULL');
		}

		return $results;
	}


	function queueStatus($mailid, $all = false){
		$query = 'SELECT a.mailid, count(a.subid) as nbsub,min(a.senddate) as senddate, b.subject FROM '.acymailing_table('queue').' as a';
		$query .= ' JOIN '.acymailing_table('mail').' as b on a.mailid = b.mailid';
		$query .= ' WHERE b.published > 0';
		if(!$all){
			$query .= ' AND a.senddate < '.time();
			if(!empty($mailid)) $query .= ' AND a.mailid = '.$mailid;
		}
		$query .= ' GROUP BY a.mailid';
		$queueStatus = acymailing_loadObjectList($query, 'mailid');

		return $queueStatus;
	}

}
components/com_acymailing/classes/listmail.php000060400000005631152453623450015702 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class listmailClass extends acymailingClass{

	function getLists($mailid){
		$query = 'SELECT a.*,b.mailid FROM '.acymailing_table('list').' as a LEFT JOIN '.acymailing_table('listmail').' as b on a.listid = b.listid AND b.mailid = '.intval($mailid).' WHERE a.type = \'list\' ORDER BY b.mailid DESC, a.ordering ASC';
		return acymailing_loadObjectList($query);
	}

	function save($mailid, $listids = array(), $removelists = array()){
		$mailid = intval($mailid);
		if(!empty($removelists)){
			acymailing_arrayToInteger($removelists);
			$query = 'DELETE FROM '.acymailing_table('listmail').' WHERE mailid = '.$mailid.' AND listid IN ('.implode(',', $removelists).')';
			$affected = acymailing_query($query);
			if($affected === false) return false;
		}

		acymailing_arrayToInteger($listids);
		if(empty($listids)) return true;

		$query = 'INSERT IGNORE INTO '.acymailing_table('listmail').' (mailid,listid) VALUES ('.$mailid.','.implode('),('.$mailid.',', $listids).')';
		return acymailing_query($query) !== false;
	}

	function getCampaign($mailid){
		$query = 'SELECT a.*,b.mailid FROM '.acymailing_table('listmail').' as b LEFT JOIN '.acymailing_table('list').' as a on a.listid = b.listid WHERE b.mailid = '.intval($mailid).' AND a.type = \'campaign\' LIMIT 1';
		return acymailing_loadObject($query);
	}

	function getReceivers($mailid, $total = true, $onlypublished = true){
		$query = 'SELECT a.name,a.description,a.published,a.color,b.listid,b.mailid FROM '.acymailing_table('listmail').' as b JOIN '.acymailing_table('list').' as a on a.listid = b.listid WHERE b.mailid = '.intval($mailid);
		if($onlypublished) $query .= ' AND a.published = 1';
		$lists = acymailing_loadObjectList($query, 'listid');

		if(empty($lists) OR !$total) return $lists;

		$config = acymailing_config();
		$confirmed = $config->get('require_confirmation') ? 'b.confirmed = 1 AND' : '';
		$countQuery = 'SELECT a.listid, count(b.subid) as nbsub FROM `#__acymailing_listsub` as a JOIN `#__acymailing_subscriber` as b ON a.subid = b.subid WHERE '.$confirmed.' b.`enabled` = 1 AND b.`accept` = 1 AND a.`status` = 1 AND a.`listid` IN ('.implode(',', array_keys($lists)).') GROUP BY a.`listid`';
		$countResult = acymailing_loadObjectList($countQuery, 'listid');

		foreach($lists as $listid => $count){
			$lists[$listid]->nbsub = empty($countResult[$listid]->nbsub) ? 0 : $countResult[$listid]->nbsub;
		}

		return $lists;
	}

	function getFollowup($listid){
		$query = 'SELECT a.* FROM '.acymailing_table('listmail').' as b LEFT JOIN '.acymailing_table('mail').' as a on a.mailid = b.mailid WHERE b.listid = '.intval($listid).' ORDER BY a.senddate ASC';
		return acymailing_loadObjectList($query);
	}

}


components/com_acymailing/classes/listcampaign.php000060400000003021152453623450016526 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class listcampaignClass extends acymailingClass{

	function getLists($campaignid){
		$query = 'SELECT a.*,b.campaignid FROM '.acymailing_table('list').' as a LEFT JOIN '.acymailing_table('listcampaign').' as b on a.listid = b.listid AND b.campaignid = '.intval($campaignid).' WHERE a.type = \'list\' ORDER BY b.campaignid DESC, a.ordering ASC';
		return acymailing_loadObjectList($query);
	}

	function save($campaignid,$listids = array()){
		$campaignid = intval($campaignid);
		$query = 'DELETE FROM '.acymailing_table('listcampaign').' WHERE campaignid = '.$campaignid;
		$affected = acymailing_query($query);
		if($affected === false) return false;

		acymailing_arrayToInteger($listids);
		if(empty($listids))	return true;

		$query = 'INSERT IGNORE INTO '.acymailing_table('listcampaign').' (campaignid,listid) VALUES ('.$campaignid.','.implode('),('.$campaignid.',',$listids).')';
		return acymailing_query($query) !== false;
	}

	function getAffectedCampaigns($listids){
		$query = 'SELECT DISTINCT a.campaignid FROM '.acymailing_table('listcampaign').' as a JOIN '.acymailing_table('list').' as b on a.campaignid = b.listid WHERE a.listid IN ('.implode(',',$listids) .') AND b.type = \'campaign\' AND b.published = 1';
		return acymailing_loadResultArray($query);
	}

}


components/com_acymailing/classes/geolocation.php000060400000014767152453623450016401 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class geolocationClass extends acymailingClass{
	var $tables = array('geolocation');
	var $pkey = 'geolocation_id';

	function saveGeolocation($geoloc_action, $subid){
		$config = acymailing_config();
		$geoloc_config = $config->get('geolocation');
		if(stripos($geoloc_config, $geoloc_action) === false) return false;

		$geo_element = new stdClass();
		$geo_element->geolocation_subid = $subid;
		$geo_element->geolocation_type = $geoloc_action;

		$userHelper = acymailing_get('helper.user');
		$geo_element->geolocation_ip = $userHelper->getIP();
		if(empty($geo_element->geolocation_subid) || empty($geo_element->geolocation_ip)) return false;

		$geo_element = $this->getIpLocation($geo_element);
		if($geo_element != false){
			parent::save($geo_element);
			return $geo_element;
		}else{
			return false;
		}
	}

	function getIpLocation($element){
		$oldElement = $this->getMostRecentDataByIp($element->geolocation_ip);
		if(!empty($oldElement) && (time() - $oldElement->geolocation_created < 2592000)){
			$element->geolocation_latitude = $oldElement->geolocation_latitude;
			$element->geolocation_longitude = $oldElement->geolocation_longitude;
			$element->geolocation_postal_code = $oldElement->geolocation_postal_code;
			$element->geolocation_country = $oldElement->geolocation_country;
			$element->geolocation_country_code = $oldElement->geolocation_country_code;
			$element->geolocation_state = $oldElement->geolocation_state;
			$element->geolocation_state_code = $oldElement->geolocation_state_code;
			$element->geolocation_city = $oldElement->geolocation_city;
			$element->geolocation_created = time();
			$element->geolocation_continent = (!empty($oldElement->geolocation_country_code) ? $this->countryToContinent($oldElement->geolocation_country_code) : '');
			$element->geolocation_timezone = $oldElement->geolocation_timezone;
			return $element;
		}

		$geoClass = acymailing_get('inc.ipinfodb');

		$config = acymailing_config();
		$api_key = trim($config->get('geoloc_api_key', ''));
		if($api_key == '') return false;
		$geoClass->setKey($api_key);
		$location = $geoClass->getCity($element->geolocation_ip);
		$errorLoc = $geoClass->getError();

		if(empty($errorLoc) && !empty($location) && !empty($location->countryCode) && $location->countryCode != '-'){
			$element->geolocation_latitude = (!empty($location->latitude) ? $location->latitude : 0);
			$element->geolocation_longitude = (!empty($location->longitude) ? $location->longitude : 0);
			$element->geolocation_postal_code = (!empty($location->zipCode) ? $location->zipCode : '');
			$element->geolocation_country = (!empty($location->countryName) ? ucwords(strtolower($location->countryName)) : '');
			$element->geolocation_country_code = (!empty($location->countryCode) ? $location->countryCode : '');
			$element->geolocation_state = (!empty($location->regionName) ? $location->regionName : '');
			$element->geolocation_state_code = (!empty($location->regioncode) ? $location->regioncode : '');
			$element->geolocation_city = (!empty($location->cityName) ? ucwords(strtolower($location->cityName)) : '');
			$element->geolocation_created = time();
			$element->geolocation_continent = (!empty($location->countryCode) ? $this->countryToContinent($location->countryCode) : '');
			$element->geolocation_timezone = (!empty($location->timeZone) ? $location->timeZone : '');
			return $element;
		}else{
			return false;
		}
	}

	function getMostRecentDataByIp($ip){
		return acymailing_loadObject("SELECT * FROM #__acymailing_geolocation WHERE geolocation_ip=".acymailing_escapeDB($ip)." ORDER BY geolocation_created DESC");
	}

	function testApiKey($apiKey){
		$geoClass = acymailing_get('inc.ipinfodb');
		$geoClass->setKey(trim($apiKey));

		$userHelper = acymailing_get('helper.user');
		$ipUser = $userHelper->getIP();
		$test = $geoClass->getCity($ipUser);
		$errorLoc = $geoClass->getError();

		if(!empty($test)){ // Has a return from the API
			return $test;
		}else{ // No return, we will display the IP used when calling API
			$retourError = new stdClass();
			$retourError->statusCode = 'noReturn';
			$retourError->ip = $ipUser;
			if(!empty($errorLoc)) $retourError->errorAPI = $errorLoc;
			return $retourError;
		}
	}

	function countryToContinent($country){
		$continent = '';
		$asia = array('AF', 'AM', 'AZ', 'BH', 'BD', 'BT', 'BN', 'IO', 'KH', 'CN', 'CX', 'CC', 'CY', 'GE', 'HK', 'IN', 'ID', 'IR', 'IQ', 'IL', 'JP', 'JO', 'KZ', 'KP', 'KR', 'KW', 'KG', 'LA', 'LB', 'MO', 'MY', 'MV', 'MN', 'MM', 'NP', 'OM', 'PK', 'PS', 'PH', 'QA', 'SA', 'SG', 'LK', 'SY', 'TW', 'TJ', 'TH', 'TL', 'TR', 'TM', 'AE', 'UZ', 'VN', 'YE');
		$africa = array('AO', 'BJ', 'DZ', 'BW', 'BF', 'BI', 'CM', 'CV', 'CF', 'TD', 'KM', 'CD', 'CG', 'CI', 'DJ', 'EG', 'GQ', 'ER', 'ET', 'GA', 'GM', 'GH', 'GN', 'GW', 'KE', 'LS', 'LR', 'LY', 'MG', 'MW', 'ML', 'MR', 'MU', 'YT', 'MA', 'MZ', 'NA', 'NE', 'NG', 'RE', 'RW', 'SH', 'ST', 'SN', 'SC', 'SL', 'SO', 'ZA', 'SD', 'SZ', 'TZ', 'TG', 'TN', 'UG', 'EH', 'ZM', 'ZW');
		$europe = array('AX', 'AL', 'AT', 'AD', 'BY', 'BE', 'BA', 'BG', 'HR', 'CZ', 'DK', 'EE', 'FO', 'FI', 'FR', 'DE', 'GI', 'GR', 'GG', 'VA', 'HU', 'IS', 'IE', 'IM', 'IT', 'JE', 'LV', 'LI', 'LT', 'LU', 'MK', 'MT', 'MD', 'MC', 'ME', 'NL', 'NO', 'PL', 'PT', 'RO', 'RU', 'SM', 'RS', 'SK', 'SI', 'ES', 'SJ', 'SE', 'CH', 'UA', 'GB');
		$oceania = array('AS', 'AU', 'CK', 'FJ', 'PF', 'GU', 'KI', 'MH', 'FM', 'NR', 'NC', 'NZ', 'NU', 'NF', 'MP', 'PW', 'PG', 'PN', 'WS', 'SB', 'TK', 'TO', 'TV', 'UM', 'VU', 'WF');
		$northAmerica = array('AI', 'AG', 'AW', 'BS', 'BB', 'BZ', 'BM', 'VG', 'CA', 'KY', 'CR', 'CU', 'DM', 'DO', 'SV', 'GL', 'GD', 'GP', 'GT', 'HT', 'HN', 'JM', 'MQ', 'MX', 'MS', 'AN', 'NI', 'PA', 'PR', 'BL', 'KN', 'LC', 'MF', 'PM', 'VC', 'TT', 'TC', 'US', 'VI');
		$southAmerica = array('AR', 'BO', 'BR', 'CL', 'CO', 'EC', 'FK', 'GF', 'GY', 'PY', 'PE', 'SR', 'UY', 'VE');
		$antarctica = array('AQ', 'BV', 'TF', 'HM', 'GS');

		if(in_array($country, $asia)) $continent = 'Asia';
		if(in_array($country, $africa)) $continent = 'Africa';
		if(in_array($country, $europe)) $continent = 'Europe';
		if(in_array($country, $oceania)) $continent = 'Oceania';
		if(in_array($country, $northAmerica)) $continent = 'North America';
		if(in_array($country, $southAmerica)) $continent = 'South America';
		if(in_array($country, $antarctica)) $continent = 'Antarctica';

		return $continent;
	}
}
components/com_acymailing/classes/index.html000060400000000054152453623450015342 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/install.acymailing.php000060400000140035152453623450016207 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.8.0
 * @author	acyba.com
 * @copyright	(C) 2009-2017 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */
defined('_JEXEC') or die('Restricted access');
?><?php

if(version_compare(PHP_VERSION, '5.0.0', '<')){
	echo '<p style="color:red">This version of AcyMailing does not support PHP4, it is time to upgrade your server to PHP5!</p>';
	exit;
}

function installAcyMailing(){
	$success = true;
	try{
		include_once(rtrim(JPATH_ADMINISTRATOR, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.'components'.DIRECTORY_SEPARATOR.'com_acymailing'.DIRECTORY_SEPARATOR.'helpers'.DIRECTORY_SEPARATOR.'helper.php');
	}catch(Exception $e){
		$updateHelper = acymailing_get('helper.update');
		$updateHelper->installTables();
		$success = false;
	}

	acymailing_increasePerf();

	$installClass = new acymailingInstall();
	$installClass->updateJoomailing();
	$installClass->addPref();
	$installClass->updatePref();
	$installClass->updateSQL();
	if($success) $installClass->displayInfo();
}

function uninstallAcyMailing(){
	$uninstallClass = new acymailingUninstall();
	$uninstallClass->unpublishModules();
	$uninstallClass->message();
}

if(!function_exists('com_install')){
	function com_install(){
		return installAcyMailing();
	}
}

if(!function_exists('com_uninstall')){
	function com_uninstall(){
		return uninstallAcyMailing();
	}
}

class com_acymailingInstallerScript{
	function install($parent){
		installAcyMailing();
	}

	function update($parent){
		installAcyMailing();
	}

	function uninstall($parent){
		uninstallAcyMailing();
	}

	function preflight($type, $parent){
		return true;
	}

	function postflight($type, $parent){
		return true;
	}
}


class acymailingInstall{

	var $level = 'starter';
	var $version = '5.8.0';
	var $update = false;
	var $fromLevel = '';
	var $fromVersion = '';
	var $db;

	function __construct(){
		$this->db = JFactory::getDBO();
		include_once(rtrim(JPATH_ADMINISTRATOR, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.'components'.DIRECTORY_SEPARATOR.'com_acymailing'.DIRECTORY_SEPARATOR.'helpers'.DIRECTORY_SEPARATOR.'helper.php');
	}

	function displayInfo(){

		echo '<h1>Please wait... </h1><h2>AcyMailing will now automatically install the Plugins and the Module</h2>';
		$url = 'index.php?option=com_acymailing&ctrl=update&task=install&fromlevel='.$this->fromLevel.'&fromversion='.$this->fromVersion;
		echo '<a href="'.$url.'">Please click here if you are not automatically redirected within 3 seconds</a>';
		echo "<script language=\"javascript\" type=\"text/javascript\">document.location.href='$url';</script>\n";
	}


	function updatePref(){

		$this->db->setQuery("SELECT `namekey`, `value` FROM `#__acymailing_config` WHERE `namekey` IN ('version','level') LIMIT 2");
		try{
			$results = $this->db->loadObjectList('namekey');
		}catch(Exception $e){
			$results = null;
		}

		if($results === null){
			acymailing_display(isset($e) ? $e->getMessage() : substr(strip_tags($this->db->getErrorMsg()), 0, 200).'...', 'error');
			return false;
		}

		if($results['version']->value == $this->version AND $results['level']->value == $this->level) return true;

		$this->update = true;
		$this->fromLevel = $results['level']->value;
		$this->fromVersion = $results['version']->value;

		$query = "REPLACE INTO `#__acymailing_config` (`namekey`,`value`) VALUES ('level',".$this->db->Quote($this->level)."),('version',".$this->db->Quote($this->version)."),('installcomplete','0')";
		$this->db->setQuery($query);
		$this->db->query();

		return true;
	}

	function updateSQL(){
		if(!$this->update) return true;
		$config = acymailing_config();




		if(version_compare($this->fromVersion, '1.1.4', '<')){
			$replace1 = "REPLACE(`params`, 'showhtml=1\nshowname=1', 'customfields=name,email,html' )";
			$replace2 = "REPLACE( $replace1 , 'showhtml=0\nshowname=1', 'customfields=name,email' )";
			$replace3 = "REPLACE( $replace2 , 'showhtml=1\nshowname=0', 'customfields=email,html' )";
			$replace4 = "REPLACE( $replace3 , 'showhtml=0\nshowname=0', 'customfields=email' )";
			$this->updateQuery("UPDATE #__modules SET `params`= $replace4 WHERE `module` = 'mod_acymailing' ");
		}

		if(version_compare($this->fromVersion, '1.2.1', '<')){
			$this->updateQuery("UPDATE `#__acymailing_config` SET `value` = 'data' WHERE `value` = '0' AND `namekey` = 'allow_modif' LIMIT 1");
			$this->updateQuery("UPDATE `#__acymailing_config` SET `value` = 'all' WHERE `value` = '1' AND `namekey` = 'allow_modif' LIMIT 1");
		}

		if(version_compare($this->fromVersion, '1.2.2', '<')){
			$this->updateQuery("ALTER TABLE `#__acymailing_mail` ADD `sentby` INT UNSIGNED NULL DEFAULT NULL");
			$this->updateQuery("ALTER TABLE `#__acymailing_template` ADD `subject` VARCHAR( 250 ) NULL DEFAULT NULL");
			$this->updateQuery("DELETE FROM `#__plugins` WHERE `folder` = 'acymailing' AND `element` = 'autocontent'");
		}

		if(version_compare($this->fromVersion, '1.2.3', '<')){
			$this->updateQuery("UPDATE `#__plugins` SET `folder` = 'system', `element`= 'regacymailing', `name` = 'AcyMailing : (auto)Subscribe during Joomla registration', `params`= REPLACE(`params`, 'lists=', 'autosub=' ) WHERE `folder` = 'user' AND `element` = 'acymailing'");
			$this->updateQuery("DELETE FROM `#__plugins` WHERE `folder` = 'acymailing' AND `element` = 'autocontent'");
			$this->updateQuery("ALTER TABLE `#__acymailing_template` ADD `stylesheet` TEXT NULL");

			if(is_dir(ACYMAILING_BACK.'plugins'.DS.'plg_user_acymailing')){
				acymailing_deleteFolder(ACYMAILING_BACK.'plugins'.DS.'plg_user_acymailing');
			}
			if(is_dir(ACYMAILING_BACK.'plugins'.DS.'plg_acymailing_autocontent')){
				acymailing_deleteFolder(ACYMAILING_BACK.'plugins'.DS.'plg_acymailing_autocontent');
			}
		}

		if(version_compare($this->fromVersion, '1.3.1', '<')){
			$this->updateQuery("ALTER TABLE `#__acymailing_config` CHANGE `value` `value` TEXT NULL ");

			$this->updateQuery("ALTER TABLE `#__acymailing_fields` ADD `listing` TINYINT NULL DEFAULT NULL ");
			$this->updateQuery("UPDATE `#__acymailing_fields` SET `listing` = 1 WHERE `namekey` IN ('name','email','html') ");
			$this->updateQuery("ALTER TABLE `#__acymailing_template` ADD `fromname` VARCHAR( 250 ) NULL , ADD `fromemail` VARCHAR( 250 ) NULL , ADD `replyname` VARCHAR( 250 ) NULL , ADD `replyemail` VARCHAR( 250 ) NULL ");
		}

		if(version_compare($this->fromVersion, '1.5.2', '<')){

			$existingEntry = acymailing_loadResult("SELECT `params` FROM #__plugins WHERE `element` = 'regacymailing' LIMIT 1");
			$listids = 'None';
			if(preg_match('#autosub=(.*)#i', $existingEntry, $autosubResult)){
				$listids = $autosubResult[1];
			}
			$this->updateQuery("INSERT IGNORE INTO `#__acymailing_config` (`namekey`,`value`) VALUES ('autosub',".$this->db->Quote($listids).")");
		}

		if(version_compare($this->fromVersion, '1.5.3', '<')){
			$this->updateQuery('UPDATE #__acymailing_config SET `value` = REPLACE(`value`,\'<sup style="font-size: 4px;">TM</sup>\',\'™\')');
		}


		if(version_compare($this->fromVersion, '1.6.2', '<')){

			$this->updateQuery("UPDATE #__acymailing_config SET `value` = 'media/com_acymailing/upload' WHERE `namekey` = 'uploadfolder' AND `value` = 'components/com_acymailing/upload' ");

			$this->updateQuery("UPDATE #__acymailing_config SET `value` = 'media/com_acymailing/logs/report".rand(0, 999999999).".log' WHERE `namekey` = 'cron_savepath' ");

			if(!ACYMAILING_J16){
				$this->updateQuery("UPDATE #__plugins SET `params` = REPLACE(`params`,'components/com_acymailing/images','media/com_acymailing/images') ");
			}else{
				$this->updateQuery("UPDATE #__extensions SET `params` = REPLACE(`params`,'components\/com_acymailing\/images','media\/com_acymailing\/images') ");
			}


			$updateClass = acymailing_get('helper.update');
			$removeFiles = array();
			$removeFiles[] = ACYMAILING_FRONT.'css'.DS.'component_default.css';
			$removeFiles[] = ACYMAILING_FRONT.'css'.DS.'frontendedition.css';
			$removeFiles[] = ACYMAILING_FRONT.'css'.DS.'module_default.css';
			foreach($removeFiles as $oneFile){
				if(is_file($oneFile)) acymailing_deleteFile($oneFile);
			}

			$fromFolders = array();
			$toFolders = array();
			$fromFolders[] = ACYMAILING_FRONT.'css';
			$toFolders[] = ACYMAILING_MEDIA.'css';
			$fromFolders[] = ACYMAILING_FRONT.'templates'.DS.'plugins';
			$toFolders[] = ACYMAILING_MEDIA.'plugins';
			$fromFolders[] = ACYMAILING_FRONT.'upload';
			$toFolders[] = ACYMAILING_MEDIA.'upload';

			foreach($fromFolders as $i => $oneFolder){
				if(!is_dir($oneFolder)) continue;
				if(is_dir($toFolders[$i])){
					$updateClass->copyFolder($oneFolder, $toFolders[$i]);
				}
			}

			$deleteFolders = array();
			$deleteFolders[] = ACYMAILING_FRONT.'css';
			$deleteFolders[] = ACYMAILING_FRONT.'images';
			$deleteFolders[] = ACYMAILING_FRONT.'js';
			$deleteFolders[] = ACYMAILING_BACK.'logs';

			foreach($deleteFolders as $oneFolder){
				if(!is_dir($oneFolder)) continue;
				acymailing_deleteFolder($oneFolder);
			}
		}

		if(version_compare($this->fromVersion, '1.7.1', '<')){
			$this->updateQuery("CREATE TABLE IF NOT EXISTS `#__acymailing_history` (`subid` INT UNSIGNED NOT NULL ,`date` INT UNSIGNED NOT NULL ,`ip` VARCHAR( 50 ) NULL ,
								`action` VARCHAR( 50 ) NOT NULL , `data` TEXT NULL , `source` TEXT NULL , INDEX ( `subid` , `date` ) ) ;");
		}

		if(version_compare($this->fromVersion, '1.7.3', '<')){
			$this->updateQuery("ALTER TABLE `#__acymailing_mail` ADD `metakey` TEXT NULL , ADD `metadesc` TEXT NULL ");
		}

		if(version_compare($this->fromVersion, '1.8.4', '<')){
			$this->updateQuery("UPDATE `#__acymailing_config` as a, `#__acymailing_config` as b SET a.`value` = b.`value` WHERE a.`namekey`= 'queue_nbmail_auto' AND b.`namekey`= 'queue_nbmail' ");
			$this->updateQuery("UPDATE `#__acymailing_mail` SET `body` = CONCAT(`body`,'<p>{survey}</p>') WHERE type = 'notification' AND `alias` IN ('notification_refuse','notification_unsub','notification_unsuball')");
		}

		if(version_compare($this->fromVersion, '1.8.5', '<')){
			$metaFile = ACYMAILING_FRONT.'metadata.xml';
			if(file_exists($metaFile)) acymailing_deleteFile($metaFile);
			$this->updateQuery('ALTER TABLE #__acymailing_url DROP INDEX url');
			$this->updateQuery('ALTER TABLE `#__acymailing_url` CHANGE `url` `url` TEXT NOT NULL');
			$this->updateQuery('ALTER TABLE `#__acymailing_url` ADD INDEX `url` ( `url` ( 250 ) ) ');
			$this->updateQuery("UPDATE `#__acymailing_mail` SET `body` = CONCAT(`body`,'<p>Subscription : {user:subscription}</p>') WHERE type = 'notification' AND `alias` = 'notification_created'");
		}

		if(version_compare($this->fromVersion, '1.9.1', '<')){
			$this->updateQuery('ALTER TABLE `#__acymailing_history` ADD `mailid` MEDIUMINT UNSIGNED NULL');

			$this->updateQuery('CREATE TABLE IF NOT EXISTS `#__acymailing_rules` (
				`ruleid` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
				`name` VARCHAR( 250 ) NOT NULL ,
				`ordering` SMALLINT UNSIGNED NULL ,
				`regex` VARCHAR( 250 ) NOT NULL ,
				`executed_on` TEXT NOT NULL ,
				`action_message` TEXT NOT NULL ,
				`action_user` TEXT NOT NULL ,
				`published` TINYINT UNSIGNED NOT NULL
				)');
			$this->updateQuery("UPDATE `#__acymailing_mail` SET `body` = CONCAT(`body`,'<p>Subscription : {user:subscription}</p>') WHERE type = 'notification' AND `alias` IN ( 'notification_unsuball','notification_refuse','notification_unsub')");
			$this->updateQuery("REPLACE INTO `#__acymailing_config` (`namekey`,`value`) VALUES ('auto_bounce','0')");
		}

		if(version_compare($this->fromVersion, '3.0.1', '<')){
			$this->updateQuery('ALTER TABLE `#__acymailing_mail` ADD `filter` TEXT NULL');

			$this->updateQuery("ALTER TABLE `#__acymailing_subscriber` CHANGE `userid` `userid` INT UNSIGNED NOT NULL DEFAULT '0'");
		}

		if(version_compare($this->fromVersion, '3.5.1', '<')){
			if(file_exists(ACYMAILING_FRONT.'sef_ext.php')) acymailing_deleteFile(ACYMAILING_FRONT.'sef_ext.php');

			$this->updateQuery("ALTER TABLE `#__acymailing_queue` ADD `paramqueue` VARCHAR( 250 ) NULL ");

			if(!ACYMAILING_J16){
				$this->updateQuery("DELETE FROM `#__plugins` WHERE folder = 'acymailing' AND element LIKE 'tagvm%'");
			}else{
				$this->updateQuery("DELETE FROM `#__extensions` WHERE folder = 'acymailing' AND element LIKE 'tagvm%'");
			}
		}

		if(version_compare($this->fromVersion, '3.6.1', '<')){
			$this->updateQuery("ALTER TABLE `#__acymailing_rules` CHANGE `regex` `regex` TEXT NOT NULL");
			$this->updateQuery("ALTER TABLE `#__acymailing_stats` ADD `bouncedetails` TEXT NULL");
		}

		if(version_compare($this->fromVersion, '3.7.1', '<')){
			$this->updateQuery("ALTER TABLE `#__acymailing_userstats` ADD `ip` VARCHAR( 100 ) NULL");
			$this->updateQuery("ALTER TABLE `#__acymailing_urlclick` ADD `ip` VARCHAR( 100 ) NULL");
		}

		if(version_compare($this->fromVersion, '3.8.1', '<')){
			$this->updateQuery("UPDATE #__acymailing_mail SET subject = CONCAT(subject,' ','{mainreport}') WHERE type = 'notification' AND alias = 'report' AND subject NOT LIKE '%mainreport%' LIMIT 1");
		}

		if(version_compare($this->fromVersion, '3.8.2', '<')){
			$this->updateQuery("INSERT IGNORE INTO `#__acymailing_config` (`namekey`,`value`) VALUES ('optimize_listsub',0),('optimize_stats',0),('optimize_list',0),('optimize_mail',0),('optimize_userstats',0),('optimize_urlclick',0),('optimize_history',0),('optimize_template',0),('optimize_queue',0),('optimize_subscriber',0) ");
		}

		$file = ACYMAILING_FRONT.'views'.DS.'newsletter'.DS.'metadata.xml';
		if(file_exists($file)) acymailing_deleteFile($file);

		$file = ACYMAILING_BACK.'admin.acymailing.php';
		if(file_exists($file)) acymailing_deleteFile($file);

		if(version_compare($this->fromVersion, '4.0.0', '<')){

			$this->db->setQuery("SELECT params,id FROM #__modules WHERE module = 'mod_acymailing'");
			$allModules = $this->db->loadObjectList();

			foreach($allModules as $oneMod){
				$newParams = preg_replace('#fieldsize=.*#i', 'fieldsize=80%', $oneMod->params);
				$newParams = preg_replace('#"fieldsize":"[^"]*"#i', '"fieldsize":"80%"', $newParams);
				$this->updateQuery("UPDATE #__modules SET params = ".$this->db->Quote($newParams)." WHERE id = ".intval($oneMod->id));
			}

			$this->db->setQuery("SELECT options,fieldid FROM #__acymailing_fields WHERE type IN ('phone','text','date','file') AND options LIKE '%size%'");
			$allFields = $this->db->loadObjectList();

			foreach($allFields as $oneField){
				$options = unserialize($oneField->options);
				$options['size'] = intval($options['size'] * 5);
				$this->updateQuery("UPDATE #__acymailing_fields SET options = ".$this->db->Quote(serialize($options))." WHERE fieldid = ".intval($oneField->fieldid));
			}
		}

		if(is_dir(ACYMAILING_BACK.'inc'.DS.'openflash')){
			acymailing_deleteFolder(ACYMAILING_BACK.'inc'.DS.'openflash');
		}
		if(is_dir(ACYMAILING_FRONT.'inc'.DS.'openflash')){
			acymailing_deleteFolder(ACYMAILING_FRONT.'inc'.DS.'openflash');
		}

		if(version_compare($this->fromVersion, '4.2.0', '<')){
			$this->updateQuery("ALTER TABLE `#__acymailing_template` ADD `thumb` VARCHAR( 250 ) NULL , ADD `readmore` VARCHAR( 250 ) NULL ");

			$this->db->setQuery("SELECT tempid, description FROM #__acymailing_template WHERE `thumb` IS NULL");
			$allTemplates = $this->db->loadObjectList();
			foreach($allTemplates as $oneTemplate){
				if(preg_match('#<img[^>]*src="([^"]*)"[^>]*>#Ui', $oneTemplate->description, $onethumb)){
					$this->updateQuery('UPDATE #__acymailing_template SET `description` = '.$this->db->Quote(str_replace($onethumb[0], '', $oneTemplate->description)).', `thumb` = '.$this->db->Quote($onethumb[1]).' WHERE tempid = '.$oneTemplate->tempid);
				}
			}

			$this->updateQuery("ALTER TABLE `#__acymailing_subscriber` ADD `confirmed_date` INT UNSIGNED NOT NULL DEFAULT '0', ADD `confirmed_ip` VARCHAR(100) NULL , ADD `lastopen_date` INT UNSIGNED NOT NULL DEFAULT '0', ADD `lastclick_date` INT UNSIGNED NOT NULL DEFAULT '0'");
			$this->updateQuery('UPDATE #__acymailing_subscriber as sub JOIN #__acymailing_history as hist ON sub.subid = hist.subid AND hist.action = "confirmed" SET sub.confirmed_date = hist.date, sub.confirmed_ip = hist.ip WHERE sub.confirmed_date = 0');
			$this->updateQuery('UPDATE #__acymailing_subscriber as sub JOIN #__acymailing_userstats as stats ON sub.subid = stats.subid SET sub.lastopen_date = stats.opendate WHERE sub.lastopen_date = 0');
			$this->updateQuery('UPDATE #__acymailing_subscriber as sub JOIN #__acymailing_urlclick as url ON sub.subid = url.subid SET sub.lastclick_date = url.date WHERE sub.lastclick_date = 0');
			$this->updateQuery('ALTER TABLE `#__acymailing_list` CHANGE `ordering` `ordering` SMALLINT UNSIGNED NULL DEFAULT \'0\'');
			$this->updateQuery('ALTER TABLE `#__acymailing_template` CHANGE `ordering` `ordering` SMALLINT UNSIGNED NULL DEFAULT \'0\'');

			$templateClass = acymailing_get('class.template');
			for($i = 1; $i <= 10; $i++){
				$templateClass->createTemplateFile($i);
			}
		}

		if(version_compare($this->fromVersion, '4.3.0', '<')){
			if(!ACYMAILING_J16){
				$queryReplace = "UPDATE `#__plugins` SET `name` = REPLACE(`name`,'(beta)','') WHERE `element` = 'acyeditor'";
			}else{
				$queryReplace = "UPDATE `#__extensions` SET `name` = REPLACE(`name`,'(beta)','') WHERE `element` = 'acyeditor'";
			}
			$this->updateQuery($queryReplace);

			if(!ACYMAILING_J16){
				$existingEntry = acymailing_loadResult("SELECT `params` FROM #__plugins WHERE `element` = 'urltracker' LIMIT 1");
				$pattern = '#trackingsystem=(.*)#i';
			}else{
				$existingEntry = acymailing_loadResult("SELECT `params` FROM #__extensions WHERE `element` = 'urltracker' LIMIT 1");
				$pattern = '#"trackingsystem":"([^"]*)"#i';
			}
			$trackingMode = 'acymailing';
			if(preg_match($pattern, $existingEntry, $autosubResult)){
				$trackingMode = $autosubResult[1];
			}
			if($trackingMode == 'googleacy') $trackingMode = 'acymailing,google';
			$this->updateQuery("INSERT IGNORE INTO `#__acymailing_config` (`namekey`,`value`) VALUES ('trackingsystem',".$this->db->Quote($trackingMode).")");
		}

		if(version_compare($this->fromVersion, '4.3.1', '<')){
			$query = 'CREATE TABLE IF NOT EXISTS `#__acymailing_geolocation` (`geolocation_id` int unsigned NOT NULL AUTO_INCREMENT, `geolocation_subid` int unsigned NOT NULL DEFAULT \'0\',';
			$query .= ' `geolocation_type` varchar(255) NOT NULL DEFAULT \'subscription\', `geolocation_ip` varchar(255) NOT NULL DEFAULT \'\', `geolocation_created` int unsigned NOT NULL DEFAULT \'0\',';
			$query .= ' `geolocation_latitude` decimal(9,6) NOT NULL DEFAULT \'0.000000\', `geolocation_longitude` decimal(9,6) NOT NULL DEFAULT \'0.000000\', `geolocation_postal_code` varchar(255) NOT NULL DEFAULT \'\',';
			$query .= ' `geolocation_country` varchar(255) NOT NULL DEFAULT \'\', `geolocation_country_code` varchar(255) NOT NULL DEFAULT \'\', `geolocation_state` varchar(255) NOT NULL DEFAULT \'\',';
			$query .= ' `geolocation_state_code` varchar(255) NOT NULL DEFAULT \'\', `geolocation_city` varchar(255) NOT NULL DEFAULT \'\',';
			$query .= ' PRIMARY KEY (`geolocation_id`), KEY `geolocation_type` (`geolocation_subid`, `geolocation_type`)) ;';
			$this->updateQuery($query);
		}

		if(version_compare($this->fromVersion, '4.3.3', '<')){
			$this->updateQuery('UPDATE #__acymailing_list SET access_manage = CONCAT(",",access_manage) WHERE access_manage NOT IN ("all","none","")');
		}

		if(version_compare($this->fromVersion, '4.4.2', '<')){
			$this->updateQuery('ALTER TABLE `#__acymailing_fields` ADD `frontlisting` TINYINT( 3 ) UNSIGNED NOT NULL DEFAULT \'0\', ADD `frontjoomlaprofile` TINYINT( 3 ) UNSIGNED NOT NULL DEFAULT \'0\', ADD `frontjoomlaregistration` TINYINT( 3 ) UNSIGNED NOT NULL DEFAULT \'0\', ADD `joomlaprofile` TINYINT( 3 ) UNSIGNED NOT NULL DEFAULT \'0\'');
			$this->updateQuery('UPDATE `#__acymailing_fields` SET `frontlisting`  = `listing`');

			if(!ACYMAILING_J16){
				$existingEntry = acymailing_loadResult("SELECT `params` FROM #__plugins WHERE `element` = 'regacymailing' LIMIT 1");
				$pattern = '#customfields=(.*)#i';
			}else{
				$existingEntry = acymailing_loadResult("SELECT `params` FROM #__extensions WHERE `element` = 'regacymailing' LIMIT 1");
				$pattern = '#"customfields":"([^"]*)"#i';
			}
			if(preg_match($pattern, $existingEntry, $pregResult)){
				$existingEntries = explode(',', $pregResult[1]);
				foreach($existingEntries as $fieldToDisplay){
					$this->updateQuery("UPDATE `#__acymailing_fields` SET frontjoomlaregistration=1 WHERE namekey=".$this->db->Quote(trim($fieldToDisplay)));
				}
			}

			$this->updateQuery("ALTER TABLE `#__acymailing_list` ADD `startrule` VARCHAR(50) NOT NULL DEFAULT '0'");

			if(is_dir(ACYMAILING_ROOT.'plugins'.DS.'editors'.DS.'acyeditor'.DS.'acyeditor'.DS.'kcfinder')){
				acymailing_deleteFolder(ACYMAILING_ROOT.'plugins'.DS.'editors'.DS.'acyeditor'.DS.'acyeditor'.DS.'kcfinder');
			}
			if(is_dir(ACYMAILING_ROOT.'plugins'.DS.'editors'.DS.'acyeditor'.DS.'kcfinder')){
				acymailing_deleteFolder(ACYMAILING_ROOT.'plugins'.DS.'editors'.DS.'acyeditor'.DS.'kcfinder');
			}
			if(is_dir(ACYMAILING_BACK.'extensions'.DS.'plg_editors_acyeditor'.DS.'acyeditor'.DS.'kcfinder')){
				acymailing_deleteFolder(ACYMAILING_BACK.'extensions'.DS.'plg_editors_acyeditor'.DS.'acyeditor'.DS.'kcfinder');
			}
		}

		if(version_compare($this->fromVersion, '4.5.2', '<')){
			$this->db->setQuery("SELECT * FROM #__acymailing_config WHERE namekey='acl_newsletters_manage'");
			$res = $this->db->query();
			if(!empty($res)){
				$this->updateQuery("INSERT IGNORE INTO `#__acymailing_config` (`namekey`,`value`) VALUES ('acl_newsletters_lists', 'all'), ('acl_newsletters_attachments', 'all'), ('acl_newsletters_sender_informations', 'all'), ('acl_newsletters_meta_data','all')");
			}

			$this->updateQuery("ALTER TABLE `#__acymailing_template` ADD `access` VARCHAR( 250 ) NOT NULL DEFAULT 'all'");
			$this->updateQuery("ALTER TABLE `#__acymailing_subscriber` ADD `lastopen_ip` VARCHAR( 100 ) NULL, ADD `lastsent_date` INT UNSIGNED NOT NULL DEFAULT '0'");

			$this->updateQuery("UPDATE #__acymailing_subscriber as sub JOIN #__acymailing_userstats as stats ON sub.subid = stats.subid SET sub.lastopen_ip = stats.ip WHERE stats.ip != ''");

			$this->updateQuery("UPDATE #__acymailing_subscriber as sub JOIN #__acymailing_userstats as stats ON sub.subid = stats.subid SET sub.lastsent_date = stats.senddate");

			$this->updateQuery("ALTER TABLE `#__acymailing_mail` MODIFY `type` ENUM('news','autonews','followup','unsub','welcome','notification','joomlanotification') NOT NULL DEFAULT 'news'");
		}

		if(version_compare($this->fromVersion, '4.6.3', '<')){
			$file = ACYMAILING_ROOT.'plugins'.DS.'editors'.DS.'acyeditor'.DS.'acyeditor_j30.xml';
			if(file_exists($file)) acymailing_deleteFile($file);

			$file = ACYMAILING_ROOT.'plugins'.DS.'system'.DS.'acymailingclassmail'.DS.'acymailingclassmail_j30.xml';
			if(file_exists($file)) acymailing_deleteFile($file);

			if($config->get('mailer_method') == 'smtp_com'){
				$newConfig = new stdClass();
				$newConfig->mailer_method = 'smtp';
				$newConfig->smtp_host = 'retail.smtp.com';
				$newConfig->smtp_port = '2525';
				$newConfig->smtp_username = $config->get('smtp_com_username');
				$newConfig->smtp_password = $config->get('smtp_com_password');
				$newConfig->smtp_auth = 1;
				$newConfig->smtp_keepalive = 1;
				$newConfig->smtp_secured = '';
				$config->save($newConfig);
			}

			$this->updateQuery("ALTER TABLE `#__acymailing_userstats` ADD `browser` VARCHAR( 255 ) DEFAULT NULL, ADD `browser_version` TINYINT UNSIGNED DEFAULT NULL, ADD `is_mobile` TINYINT UNSIGNED DEFAULT NULL, ADD `mobile_os` VARCHAR( 255 ) DEFAULT NULL, ADD `user_agent` VARCHAR( 255 ) DEFAULT NULL");

			$this->updateQuery("ALTER TABLE `#__acymailing_mail` ADD `language` VARCHAR( 50 ) NOT NULL DEFAULT ''");
		}

		if(version_compare($this->fromVersion, '4.7.3', '<')){
			try{
				$this->db->setQuery("SELECT * FROM #__acymailing_config WHERE namekey='acl_newsletters_manage'");
				$res = $this->db->query();
				if(!empty($res)){
					$this->updateQuery("INSERT IGNORE INTO `#__acymailing_config` (`namekey`,`value`) VALUES ('acl_newsletters_abtesting', 'all')");
				}
			}catch(Exception $e){
				$res = null;
			}
			if($res === null) acymailing_enqueueMessage(isset($e) ? $e->getMessage() : substr(strip_tags($this->db->getErrorMsg()), 0, 200).'...', 'error');

			$this->updateQuery("ALTER TABLE `#__acymailing_mail` ADD `abtesting` VARCHAR( 250 ) DEFAULT NULL");

			$this->updateQuery("ALTER TABLE `#__acymailing_subscriber` ADD `source` VARCHAR( 250 ) NOT NULL DEFAULT ''");
		}

		if(version_compare($this->fromVersion, '4.8.2', '<')){
			$tagsFile = JPATH_SITE.DS.'plugins'.DS.'acymailing'.DS.'tagcontent'.DS.'tagcontenttags.xml';
			if(file_exists($tagsFile)) acymailing_deleteFile($tagsFile);

			$this->updateQuery("ALTER TABLE `#__acymailing_mail` ADD `thumb` VARCHAR( 250 ) DEFAULT NULL");
			$this->updateQuery("ALTER TABLE `#__acymailing_mail` ADD `summary` TEXT NOT NULL DEFAULT ''");
			$this->updateQuery("ALTER TABLE `#__acymailing_template` ADD `category` VARCHAR( 250 ) NOT NULL DEFAULT ''");
			$this->updateQuery("ALTER TABLE `#__acymailing_list` ADD `category` VARCHAR( 250 ) NOT NULL DEFAULT ''");
			$this->updateQuery("ALTER TABLE `#__acymailing_fields` ADD `access` VARCHAR( 250 ) NOT NULL DEFAULT 'all'");
			$this->updateQuery("ALTER TABLE `#__acymailing_fields` ADD `fieldcat` INT( 11 ) NOT NULL DEFAULT '0'");

			$this->updateQuery("UPDATE `#__acymailing_template` SET body = REPLACE(body,'<tbody>','<tbody class=\"acyeditor_sortable\">') WHERE body LIKE '%acyeditor_%' ");
		}

		if(version_compare($this->fromVersion, '4.9.1', '<')){
			$this->updateQuery("ALTER TABLE `#__acymailing_geolocation` ADD KEY `geolocation_ip_created` (`geolocation_ip`, `geolocation_created`)");
		}

		if(version_compare($this->fromVersion, '4.9.3', '<')){
			$this->updateQuery("ALTER TABLE `#__acymailing_userstats` ADD `bouncerule` VARCHAR( 255 ) NULL");
			$this->updateQuery("ALTER TABLE `#__acymailing_fields` ADD `listingfilter` TINYINT NULL DEFAULT NULL ");
			$this->updateQuery("ALTER TABLE `#__acymailing_fields` ADD `frontlistingfilter` TINYINT NULL DEFAULT NULL ");
		}

		if(version_compare($this->fromVersion, '4.9.4', '<')){
			$this->updateQuery("UPDATE #__acymailing_mail SET body = REPLACE(REPLACE(body, 'newsletter-4/top.png', 'newsletter-4/images/top.png'), 'newsletter-4/bottom.png', 'newsletter-4/images/bottom.png')");
		}

		if(version_compare($this->fromVersion, '5.0.0', '<')){
			$this->db->setQuery('SELECT mailid, attach FROM #__acymailing_mail WHERE attach IS NOT NULL');
			$mails = $this->db->loadObjectList();
			if(!empty($mails)){
				$query = 'INSERT INTO #__acymailing_mail (`mailid`,`attach`) VALUES ';
				$folderPath = acymailing_getFilesFolder();
				foreach($mails as $oneMail){
					$attachments = unserialize($oneMail->attach);
					foreach($attachments as &$oneAttach){
						if(strpos($oneAttach->filename, $folderPath) === false) $oneAttach->filename = $folderPath.'/'.$oneAttach->filename;
					}
					$query .= '('.$oneMail->mailid.','.$this->db->Quote(serialize($attachments)).'),';
				}
				$query = rtrim($query, ',');
				$query .= ' ON DUPLICATE KEY UPDATE `attach` = VALUES(`attach`)';
				$this->updateQuery($query);
			}
			$newConfig = new stdClass();
			$newConfig->css_backend = '';
			$config->save($newConfig);
		}

		if(version_compare($this->fromVersion, '5.0.1', '<')){
			$this->updateQuery("ALTER TABLE `#__acymailing_fields` ADD `frontform` TINYINT NULL DEFAULT 1");
			$this->updateQuery("UPDATE `#__acymailing_fields` SET frontform = backend");
		}

		if(version_compare($this->fromVersion, '5.1.0', '<')){
			$this->updateQuery("CREATE TABLE IF NOT EXISTS `#__acymailing_action` (`action_id` int unsigned NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`description` text,`frequency` int unsigned NOT NULL,
	`nextdate` int unsigned NOT NULL,`server` varchar(255) NOT NULL,`port` varchar(50) NOT NULL,`connection_method` varchar(10) NOT NULL DEFAULT '0',`secure_method` varchar(10) NOT NULL DEFAULT '0',
	`self_signed` tinyint NOT NULL DEFAULT '0',`username` varchar(255) NOT NULL,`password` varchar(50) NOT NULL,`userid` int unsigned DEFAULT NULL,`conditions` text,`actions` text,`report` text,
	`published` tinyint NOT NULL DEFAULT '0',`ordering` smallint unsigned NULL DEFAULT '0',PRIMARY KEY (`action_id`)) ;");

			$this->updateQuery("ALTER TABLE `#__acymailing_mail` ADD `favicon` text");
		}

		if(version_compare($this->fromVersion, '5.2.0', '<')){
			$this->updateQuery("ALTER TABLE `#__acymailing_mail` MODIFY `type` ENUM('news','autonews','followup','unsub','welcome','notification','joomlanotification','action') NOT NULL DEFAULT 'news'");

			$this->updateQuery("ALTER TABLE `#__acymailing_mail` ADD `bccaddresses` varchar(250) DEFAULT NULL");
			$managetext = JPluginHelper::getPlugin('acymailing', 'managetext');
			$managetextParams = new acyParameter($managetext->params);

			$possibleVars = array('', 2, 3);
			foreach($possibleVars as $oneSuffix){
				$bcc = $managetextParams->get('bccaddresses'.$oneSuffix);
				$mailids = trim(str_replace(array(',', ' '), ';', $managetextParams->get('bccmailids'.$oneSuffix)));
				if(empty($mailids) || empty($bcc)) continue;

				$emails = explode(';', $mailids);
				acymailing_arrayToInteger($emails);

				$this->updateQuery('UPDATE `#__acymailing_mail` SET bccaddresses = '.$this->db->quote($bcc).' WHERE mailid IN ('.implode(',', $emails).')');
			}

			$this->updateQuery('UPDATE `#__acymailing_rules` SET name = (CASE name WHEN "Action Required" THEN "ACY_RULE_ACTION"
																					 WHEN "Acknowledgement of receipt - in subject" THEN "ACY_RULE_ACKNOWLEDGE"
																					 WHEN "Feedback loop" THEN "ACY_RULE_LOOP"
																					 WHEN "Feedback loop - in body" THEN "ACY_RULE_LOOP_BODY"
																					 WHEN "Mailbox Full" THEN "ACY_RULE_FULL"
																					 WHEN "Blocked by Google Groups" THEN "ACY_RULE_GOOGLE"
																					 WHEN "Mailbox does not exist 1" THEN "ACY_RULE_EXIST1"
																					 WHEN "Message blocked by recipient filters" THEN "ACY_RULE_FILTERED"
																					 WHEN "Mailbox does not exist 2" THEN "ACY_RULE_EXIST2"
																					 WHEN "Domain does not exist" THEN "ACY_RULE_DOMAIN"
																					 WHEN "Temporary failures" THEN "ACY_RULE_TEMPORAR"
																					 WHEN "Failed Permanently" THEN "ACY_RULE_PERMANENT"
																					 WHEN "Acknowledgement of receipt - in body" THEN "ACY_RULE_ACKNOWLEDGE_BODY"
																					 WHEN "Final Rule" THEN "ACY_RULE_FINAL"
																					 ELSE name
																					 END)');

			$this->updateQuery("ALTER TABLE #__acymailing_geolocation ADD `geolocation_continent` varchar(255) NOT NULL DEFAULT '', ADD `geolocation_timezone` varchar(255) NOT NULL DEFAULT ''");
			$this->updateQuery("UPDATE #__acymailing_geolocation SET geolocation_continent = 'Asia' WHERE geolocation_country_code IN ('AF', 'AM', 'AZ', 'BH', 'BD', 'BT', 'BN', 'IO', 'KH', 'CN', 'CX', 'CC', 'CY', 'GE', 'HK', 'IN', 'ID', 'IR', 'IQ', 'IL', 'JP', 'JO', 'KZ', 'KP', 'KR', 'KW', 'KG', 'LA', 'LB', 'MO', 'MY', 'MV', 'MN', 'MM', 'NP', 'OM', 'PK', 'PS', 'PH', 'QA', 'SA', 'SG', 'LK', 'SY', 'TW', 'TJ', 'TH', 'TL', 'TR', 'TM', 'AE', 'UZ', 'VN', 'YE')");
			$this->updateQuery("UPDATE #__acymailing_geolocation SET geolocation_continent = 'Africa' WHERE geolocation_country_code IN ('AO', 'BJ', 'DZ', 'BW', 'BF', 'BI', 'CM', 'CV', 'CF', 'TD', 'KM', 'CD', 'CG', 'CI', 'DJ', 'EG', 'GQ', 'ER', 'ET', 'GA', 'GM', 'GH', 'GN', 'GW', 'KE', 'LS', 'LR', 'LY', 'MG', 'MW', 'ML', 'MR', 'MU', 'YT', 'MA', 'MZ', 'NA', 'NE', 'NG', 'RE', 'RW', 'SH', 'ST', 'SN', 'SC', 'SL', 'SO', 'ZA', 'SD', 'SZ', 'TZ', 'TG', 'TN', 'UG', 'EH', 'ZM', 'ZW')");
			$this->updateQuery("UPDATE #__acymailing_geolocation SET geolocation_continent = 'Europe' WHERE geolocation_country_code IN ('AX', 'AL', 'AT', 'AD', 'BY', 'BE', 'BA', 'BG', 'HR', 'CZ', 'DK', 'EE', 'FO', 'FI', 'FR', 'DE', 'GI', 'GR', 'GG', 'VA', 'HU', 'IS', 'IE', 'IM', 'IT', 'JE', 'LV', 'LI', 'LT', 'LU', 'MK', 'MT', 'MD', 'MC', 'ME', 'NL', 'NO', 'PL', 'PT', 'RO', 'RU', 'SM', 'RS', 'SK', 'SI', 'ES', 'SJ', 'SE', 'CH', 'UA', 'GB')");
			$this->updateQuery("UPDATE #__acymailing_geolocation SET geolocation_continent = 'Oceania' WHERE geolocation_country_code IN ('AS', 'AU', 'CK', 'FJ', 'PF', 'GU', 'KI', 'MH', 'FM', 'NR', 'NC', 'NZ', 'NU', 'NF', 'MP', 'PW', 'PG', 'PN', 'WS', 'SB', 'TK', 'TO', 'TV', 'UM', 'VU', 'WF')");
			$this->updateQuery("UPDATE #__acymailing_geolocation SET geolocation_continent = 'North America' WHERE geolocation_country_code IN ('AI', 'AG', 'AW', 'BS', 'BB', 'BZ', 'BM', 'VG', 'CA', 'KY', 'CR', 'CU', 'DM', 'DO', 'SV', 'GL', 'GD', 'GP', 'GT', 'HT', 'HN', 'JM', 'MQ', 'MX', 'MS', 'AN', 'NI', 'PA', 'PR', 'BL', 'KN', 'LC', 'MF', 'PM', 'VC', 'TT', 'TC', 'US', 'VI')");
			$this->updateQuery("UPDATE #__acymailing_geolocation SET geolocation_continent = 'South America' WHERE geolocation_country_code IN ('AR', 'BO', 'BR', 'CL', 'CO', 'EC', 'FK', 'GF', 'GY', 'PY', 'PE', 'SR', 'UY', 'VE')");
			$this->updateQuery("UPDATE #__acymailing_geolocation SET geolocation_continent = 'Antartica' WHERE geolocation_country_code IN ('AQ', 'BV', 'TF', 'HM', 'GS')");

			if($config->get('captcha_enabled') == 1){
				$this->updateQuery('INSERT INTO `#__acymailing_config` (namekey, value) VALUES ("captcha_plugin", "acycaptcha") ON DUPLICATE KEY UPDATE value="acycaptcha"');
			}else{
				$this->updateQuery('INSERT INTO `#__acymailing_config` (namekey, value) VALUES ("captcha_plugin", "no") ON DUPLICATE KEY UPDATE value="no"');
			}
			try{
				$this->db->setQuery('SELECT tempid, stylesheet FROM #__acymailing_template');
				$res = $this->db->loadObjectList('tempid');
				foreach($res as $oneTmpl){
					$changedStyle = preg_replace('/(table *(,[^{}]*)?)({[^}]*font-family)/', '$1, td$3', $oneTmpl->stylesheet);
					$this->updatequery('UPDATE #__acymailing_template SET stylesheet = '.$this->db->Quote($changedStyle).' WHERE tempid = '.$oneTmpl->tempid);
				}
			}catch(Exception $e){
				$res = null;
			}
			if($res === null) acymailing_enqueueMessage(isset($e) ? $e->getMessage() : substr(strip_tags($this->db->getErrorMsg()), 0, 200).'...', 'error');
		}

		if(version_compare($this->fromVersion, '5.5.0', '<')){
			$this->updateQuery("ALTER TABLE #__acymailing_action ADD `delete_wrong_emails` tinyint NOT NULL DEFAULT 0");
			$this->updateQuery("ALTER TABLE #__acymailing_action ADD `senderfrom` tinyint NOT NULL DEFAULT 0");
			$this->updateQuery("ALTER TABLE #__acymailing_action ADD `senderto` tinyint NOT NULL DEFAULT 0");
		}

		if(version_compare($this->fromVersion, '5.6.0', '<')){
			$this->updateQuery("CREATE TABLE IF NOT EXISTS `#__acymailing_forward` (`subid` int unsigned NOT NULL,`mailid` mediumint unsigned NOT NULL, `date` int unsigned NOT NULL,
			`ip` varchar(50) DEFAULT NULL, `nbforwarded` int unsigned NOT NULL, PRIMARY KEY (`subid`,`mailid`)) ;");

			$this->updateQuery("CREATE TABLE IF NOT EXISTS `#__acymailing_tag` (`tagid` smallint unsigned NOT NULL AUTO_INCREMENT, `name` varchar(250) NOT NULL,
			`userid` int unsigned DEFAULT NULL,PRIMARY KEY (`tagid`),KEY `useridindex` (`userid`)) ;");

			$this->updateQuery("CREATE TABLE IF NOT EXISTS `#__acymailing_tagmail` (`tagid` smallint unsigned NOT NULL,	`mailid` mediumint unsigned NOT NULL,
			PRIMARY KEY (`tagid`,`mailid`)) ;");
		}

		if(version_compare($this->fromVersion, '5.6.5', '<')) {
			$this->updateQuery("ALTER TABLE `#__acymailing_mail` MODIFY subject text");
		}

		if(version_compare($this->fromVersion, '5.7.1', '<')) {
			$daycron = $config->get('cron_plugins_next', 0);

			$this->updateQuery("ALTER TABLE `#__acymailing_filter` ADD `daycron` int unsigned");
			$this->db->setQuery('UPDATE #__acymailing_filter SET `daycron` = '.intval($daycron).' WHERE `trigger` LIKE "%daycron%"');
			$this->db->query();
		}

		if(version_compare($this->fromVersion, '5.8.0', '<')) {
			$this->updateQuery("ALTER TABLE #__acymailing_mail ADD `lastupdate` int unsigned DEFAULT NULL");
			$this->updateQuery("ALTER TABLE #__acymailing_mail ADD `userlastupdate` int unsigned DEFAULT NULL");
		}
	}

	function updateQuery($query){
		try{
			$this->db->setQuery($query);
			$res = $this->db->query();
		}catch(Exception $e){
			$res = null;
		}
		if($res === null) acymailing_enqueueMessage(isset($e) ? $e->getMessage() : substr(strip_tags($this->db->getErrorMsg()), 0, 200).'...', 'error');
	}

	function updateJoomailing(){
		$result = acymailing_loadResult("SHOW TABLES LIKE '".$this->db->getPrefix()."joomailing_config'");

		if(empty($result)) return true;


		$this->db->setQuery("INSERT IGNORE INTO `#__acymailing_config` (`namekey`,`value`) SELECT `namekey`, REPLACE(`value`,'com_joomailing','com_acymailing') FROM `#__joomailing_config`");
		$this->db->query();
		$this->db->setQuery("INSERT IGNORE INTO `#__acymailing_list` (`name`, `description`, `ordering`, `listid`, `published`, `userid`, `alias`, `color`, `visible`, `welmailid`, `unsubmailid`, `type`) SELECT `name`, `description`, `ordering`, `listid`, `published`, `userid`, `alias`, `color`, `visible`, `welmailid`, `unsubmailid`, `type` FROM `#__joomailing_list`");
		$this->db->query();
		$this->db->setQuery("INSERT IGNORE INTO `#__acymailing_listcampaign` (`campaignid`, `listid`) SELECT `campaignid`, `listid` FROM `#__joomailing_listcampaign`");
		$this->db->query();
		$this->db->setQuery("INSERT IGNORE INTO `#__acymailing_listmail` (`listid`, `mailid`) SELECT `listid`, `mailid` FROM `#__joomailing_listmail`");
		$this->db->query();
		$this->db->setQuery("INSERT IGNORE INTO `#__acymailing_listsub` (`listid`, `subid`, `subdate`, `unsubdate`, `status`) SELECT `listid`, `subid`, `subdate`, `unsubdate`, `status` FROM `#__joomailing_listsub`");
		$this->db->query();
		$this->db->setQuery("INSERT IGNORE INTO `#__acymailing_mail` (`mailid`, `subject`, `body`, `altbody`, `published`, `senddate`, `created`, `fromname`, `fromemail`, `replyname`, `replyemail`, `type`, `visible`, `userid`, `alias`, `attach`, `html`, `tempid`, `key`, `frequency`, `params`) SELECT `mailid`, `subject`, REPLACE(`body`,'joomailing','acymailing'), REPLACE(`altbody`,'joomailing','acymailing'), `published`, `senddate`, `created`, `fromname`, `fromemail`, `replyname`, `replyemail`, `type`, `visible`, `userid`, `alias`, REPLACE(`attach`,'com_joomailing','com_acymailing'), `html`, `tempid`, `key`, `frequency`, REPLACE(`params`,'com_joomailing','com_acymailing') FROM `#__joomailing_mail`");
		$this->db->query();
		$this->db->setQuery("INSERT IGNORE INTO `#__acymailing_queue` (`senddate`, `subid`, `mailid`, `priority`, `try`) SELECT `senddate`, `subid`, `mailid`, `priority`, `try` FROM `#__joomailing_queue`");
		$this->db->query();
		$this->db->setQuery("INSERT IGNORE INTO `#__acymailing_stats` (`mailid`, `senthtml`, `senttext`, `senddate`, `openunique`, `opentotal`, `bounceunique`, `fail`, `clicktotal`, `clickunique`, `unsub`, `forward`) SELECT `mailid`, `senthtml`, `senttext`, `senddate`, `openunique`, `opentotal`, `bounceunique`, `fail`, `clicktotal`, `clickunique`, `unsub`, `forward` FROM `#__joomailing_stats`");
		$this->db->query();
		$this->db->setQuery("INSERT IGNORE INTO `#__acymailing_subscriber` (`subid`, `email`, `userid`, `name`, `created`, `confirmed`, `enabled`, `accept`, `ip`, `html`, `key`) SELECT `subid`, `email`, `userid`, `name`, `created`, `confirmed`, `enabled`, `accept`, `ip`, `html`, `key` FROM `#__joomailing_subscriber`");
		$this->db->query();
		$this->db->setQuery("INSERT IGNORE INTO `#__acymailing_template` (`tempid`, `name`, `description`, `body`, `altbody`, `created`, `published`, `premium`, `ordering`, `namekey`, `styles`) SELECT `tempid`, `name`, REPLACE(`description`,'joomailing','acymailing'), REPLACE(`body`,'joomailing','acymailing'), REPLACE(`altbody`,'joomailing','acymailing'), `created`, `published`, `premium`, `ordering`, `namekey`, REPLACE(`styles`,'joomailing','acymailing') FROM `#__joomailing_template`");
		$this->db->query();
		$this->db->setQuery("INSERT IGNORE INTO `#__acymailing_url` (`urlid`, `name`, `url`) SELECT `urlid`, REPLACE(`name`,'com_joomailing','com_acymailing'), REPLACE(`url`,'com_joomailing','com_acymailing') FROM `#__joomailing_url`");
		$this->db->query();
		$this->db->setQuery("INSERT IGNORE INTO `#__acymailing_urlclick` (`urlid`, `mailid`, `click`, `subid`, `date`) SELECT `urlid`, `mailid`, `click`, `subid`, `date` FROM `#__joomailing_urlclick`");
		$this->db->query();
		$this->db->setQuery("INSERT IGNORE INTO `#__acymailing_userstats` (`mailid`, `subid`, `html`, `sent`, `senddate`, `open`, `opendate`, `bounce`, `fail`) SELECT `mailid`, `subid`, `html`, `sent`, `senddate`, `open`, `opendate`, `bounce`, `fail` FROM `#__joomailing_userstats`");
		$this->db->query();

		$this->db->setQuery("DROP TABLE IF EXISTS `#__joomailing_config`, `#__joomailing_list`, `#__joomailing_listcampaign`, `#__joomailing_listmail`, `#__joomailing_listsub`, `#__joomailing_mail`, `#__joomailing_queue` , `#__joomailing_stats`, `#__joomailing_subscriber`, `#__joomailing_template` , `#__joomailing_url`, `#__joomailing_urlclick`, `#__joomailing_userstats`");
		$this->db->query();

		$this->db->setQuery("UPDATE `#__modules` SET `title` = REPLACE(`title`,'JooMailing','AcyMailing'), `module` = REPLACE(`module`,'joomailing','acymailing'), `params` = REPLACE(`params`,'joomailing','acymailing')");
		$this->db->query();
		$this->db->setQuery("UPDATE `#__plugins` SET `name` = REPLACE(REPLACE(REPLACE(`name`,'jooMailing','AcyMailing'),'joomailing','acymailing'),'JooMailing','AcyMailing'), `element` = REPLACE(`element`,'joomailing','acymailing'), `folder` = REPLACE(`folder`,'joomailing','acymailing'), `params` = REPLACE(`params`,'joomailing','acymailing')");
		$this->db->query();

		$this->db->setQuery("DELETE FROM `#__components` WHERE `option` LIKE '%joomailing%' OR `admin_menu_link` LIKE '%joomailing%'");
		$this->db->query();

		$this->db->setQuery("UPDATE `#__menu` SET `menutype` = REPLACE(`menutype`,'joomailing','acymailing'), `name` = REPLACE(`name`,'joomailing','acymailing'), `alias` = REPLACE(`alias`,'joomailing','acymailing'), `link` = REPLACE(`link`,'joomailing','acymailing')");
		$this->db->query();


		$newFile = '<?php
					$url = \'index.php?option=com_acymailing\';
					foreach($_GET as $name => $value){
						if($name == \'option\') continue;
						$url .= \'&\'.$name.\'=\'.$value;
					}
					acymailing_redirect($url);
					';

		@file_put_contents(rtrim(JPATH_SITE, DS).DS.'components'.DS.'com_joomailing'.DS.'joomailing.php', $newFile);
		@file_put_contents(rtrim(JPATH_ADMINISTRATOR, DS).DS.'components'.DS.'com_joomailing'.DS.'admin.joomailing.php', $newFile);
	}

	function addPref(){
		$conf = JFactory::getConfig();

		$this->level = ucfirst($this->level);

		$allPref = array();

		$allPref['level'] = $this->level;
		$allPref['version'] = $this->version;
		$allPref['smtp_port'] = '';

		if(ACYMAILING_J30){
			$allPref['from_name'] = $conf->get('fromname');
			$allPref['from_email'] = $conf->get('mailfrom');
			$allPref['bounce_email'] = $conf->get('mailfrom');
			$allPref['mailer_method'] = $conf->get('mailer');
			$allPref['sendmail_path'] = $conf->get('sendmail');
			$smtpinfos = explode(':', $conf->get('smtphost'));
			$allPref['smtp_port'] = $conf->get('smtpport');
			$allPref['smtp_secured'] = $conf->get('smtpsecure');
			$allPref['smtp_auth'] = $conf->get('smtpauth');
			$allPref['smtp_username'] = $conf->get('smtpuser');
			$allPref['smtp_password'] = $conf->get('smtppass');
		}else{
			$allPref['from_name'] = $conf->getValue('config.fromname');
			$allPref['from_email'] = $conf->getValue('config.mailfrom');
			$allPref['bounce_email'] = $conf->getValue('config.mailfrom');
			$allPref['mailer_method'] = $conf->getValue('config.mailer');
			$allPref['sendmail_path'] = $conf->getValue('config.sendmail');
			$smtpinfos = explode(':', $conf->getValue('config.smtphost'));
			$allPref['smtp_secured'] = $conf->getValue('config.smtpsecure');
			$allPref['smtp_auth'] = $conf->getValue('config.smtpauth');
			$allPref['smtp_username'] = $conf->getValue('config.smtpuser');
			$allPref['smtp_password'] = $conf->getValue('config.smtppass');
		}

		$allPref['reply_name'] = $allPref['from_name'];
		$allPref['reply_email'] = $allPref['from_email'];
		$allPref['cron_sendto'] = $allPref['from_email'];

		$allPref['add_names'] = '1';
		$allPref['encoding_format'] = '8bit';
		$allPref['charset'] = 'UTF-8';
		$allPref['word_wrapping'] = '150';
		$allPref['hostname'] = '';
		$allPref['embed_images'] = '0';
		$allPref['embed_files'] = '1';
		$allPref['editor'] = 'acyeditor';
		$allPref['multiple_part'] = '1';
		$allPref['smtp_host'] = $smtpinfos[0];
		if(isset($smtpinfos[1])) $allPref['smtp_port'] = $smtpinfos[1];
		if(!in_array($allPref['smtp_secured'], array('tls', 'ssl'))) $allPref['smtp_secured'] = '';

		$allPref['queue_nbmail'] = '40';
		$allPref['queue_nbmail_auto'] = '70';
		$allPref['queue_type'] = 'auto';
		$allPref['queue_try'] = '3';
		$allPref['queue_pause'] = '120';
		$allPref['allow_visitor'] = '1';
		$allPref['require_confirmation'] = '0';
		$allPref['priority_newsletter'] = '3';
		$allPref['allowedfiles'] = 'zip,doc,docx,pdf,xls,txt,gzip,rar,jpg,jpeg,gif,xlsx,pps,csv,bmp,ico,odg,odp,ods,odt,png,ppt,swf,xcf,mp3,wma';
		$allPref['uploadfolder'] = 'media/com_acymailing/upload';
		$allPref['confirm_redirect'] = '';
		$allPref['subscription_message'] = '1';
		$allPref['notification_unsuball'] = '';
		$allPref['cron_next'] = '1251990901';
		$allPref['confirmation_message'] = '1';
		$allPref['welcome_message'] = '1';
		$allPref['unsub_message'] = '1';
		$allPref['cron_last'] = '0';
		$allPref['cron_fromip'] = '';
		$allPref['cron_report'] = '';
		$allPref['cron_frequency'] = '900';
		$allPref['cron_sendreport'] = '2';

		$allPref['cron_fullreport'] = '1';
		$allPref['cron_savereport'] = '2';
		$allPref['cron_savepath'] = 'media/com_acymailing/logs/report'.rand(0, 999999999).'.log';
		$allPref['notification_created'] = '';
		$allPref['notification_accept'] = '';
		$allPref['notification_refuse'] = '';
		$allPref['forward'] = '0';

		$descriptions = array('Joomla!® Newsletter Extension', 'Joomla!® Mailing Extension', 'Joomla!® Newsletter System', 'Joomla!® E-mail Marketing', 'Joomla!® Marketing Campaign');
		$allPref['description_starter'] = $descriptions[rand(0, 4)];
		$allPref['description_essential'] = $descriptions[rand(0, 4)];
		$allPref['description_business'] = $descriptions[rand(0, 4)];
		$allPref['description_enterprise'] = $descriptions[rand(0, 4)];
		$allPref['description_sidekick'] = $descriptions[rand(0, 4)];

		$allPref['priority_followup'] = '2';
		$allPref['unsub_redirect'] = '';
		$allPref['use_sef'] = '0';
		$allPref['itemid'] = '0';
		$allPref['css_module'] = 'default';
		$allPref['css_frontend'] = 'default';
		$allPref['css_backend'] = '';
		$allPref['bootstrap_frontend'] = 0;

		$allPref['unsub_reasons'] = serialize(array('UNSUB_SURVEY_FREQUENT', 'UNSUB_SURVEY_RELEVANT'));

		$allPref['security_key'] = acymailing_generateKey(30);


		$allPref['installcomplete'] = '0';

		$allPref['Starter'] = '0';
		$allPref['Essential'] = '1';
		$allPref['Business'] = '2';
		$allPref['Enterprise'] = '3';
		$allPref['Sidekick'] = '4';

		$query = "INSERT IGNORE INTO `#__acymailing_config` (`namekey`,`value`) VALUES ";
		foreach($allPref as $namekey => $value){
			$query .= '('.$this->db->Quote($namekey).','.$this->db->Quote($value).'),';
		}
		$query = rtrim($query, ',');

		$this->db->setQuery($query);
		try{
			$res = $this->db->query();
		}catch(Exception $e){
			$res = null;
		}
		if($res === null){
			acymailing_display(isset($e) ? $e->getMessage() : substr(strip_tags($this->db->getErrorMsg()), 0, 200).'...', 'error');
			return false;
		}
		return true;
	}
}

class acymailingUninstall{
	var $db;

	function __construct(){
		$this->db = JFactory::getDBO();
	}

	function message(){
		?>
		You uninstalled the AcyMailing component.<br/>
		AcyMailing also unpublished the modules attached to the component.<br/><br/>
		If you want to completely uninstall AcyMailing, please select all the AcyMailing modules and plugins and uninstall them from the Joomla Extensions Manager.<br/>
		Then execute this query via phpMyAdmin to remove all AcyMailing data:<br/><br/>
		DROP TABLE <?php
		$this->db->setQuery("SHOW TABLES LIKE '".$this->db->getPrefix()."acymailing%' ");
		if(version_compare(JVERSION, '3.0.0', '>=')){
			echo implode(' , ', $this->db->loadColumn());
		}else{
			echo implode(' , ', $this->db->loadResultArray());
		}

		?>;<br/><br/>
		If you DO NOT execute the query, you will be able to install AcyMailing again without losing data.<br/>
		Please note that you don't have to uninstall AcyMailing to install a new version, simply install the new one without uninstalling your current version.
		<?php
	}

	function unpublishModules(){
		$this->db->setQuery("UPDATE `#__modules` SET `published` = 0 WHERE `module` LIKE '%acymailing%'");
		$this->db->query();
	}
}
components/com_acymailing/logs/index.html000060400000000054152453623450014651 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/logs/.htaccess000060400000000036152453623450014452 0ustar00Order deny,allow
Deny from allcomponents/com_acymailing/types/creatorfilter.php000060400000002742152453623450016440 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class creatorfilterType extends acymailingClass{
	var $type = '';
	function load($table){
		$query = 'SELECT COUNT(*) as total,userid FROM '.acymailing_table($table).' WHERE `userid` > 0';
		if(!empty($this->type)) $query .= ' AND `type` = '.acymailing_escapeDB($this->type);
		$query .= ' GROUP BY userid';
		$allusers = acymailing_loadObjectList($query, 'userid');

		$allnames = array();
		if(!empty($allusers)){
			$allnames = acymailing_loadObjectList('SELECT '.$this->cmsUserVars->name.' AS name, '.$this->cmsUserVars->id.' AS id FROM '.acymailing_table($this->cmsUserVars->table, false).' WHERE '.$this->cmsUserVars->id.' IN ('.implode(',',array_keys($allusers)).') ORDER BY '.$this->cmsUserVars->name.' ASC', 'id');
		}

		$this->values = array();
		$this->values[] = acymailing_selectOption('0', acymailing_translation('ALL_CREATORS'));
		foreach($allnames as $userid => $oneCreator){
			$this->values[] = acymailing_selectOption($userid, $oneCreator->name.' ( '.$allusers[$userid]->total.' )' );
		}
	}

	function display($map,$value,$table){
		$this->load($table);
		return acymailing_select(  $this->values, $map, 'class="inputbox" size="1" onchange="document.adminForm.submit( );"', 'value', 'text', (int) $value );
	}
}
components/com_acymailing/types/statusquick.php000060400000002137152453623450016151 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class statusquickType extends acymailingClass{
	function __construct(){
		parent::__construct();
		$this->values = array();
		$this->values[] = acymailing_selectOption('0', acymailing_translation('JOOMEXT_RESET'));
		$this->values[] = acymailing_selectOption('1', acymailing_translation('SUBSCRIBE_ALL'));

		$js = "function updateStatus(statusval){".
			'var i=0;'.
			"while(window.document.getElementById('status'+i+statusval)){";
		if(ACYMAILING_J30){
			$js .= 'jQuery("label[for=status"+i+statusval+"]").click();';
		}
		$js .= "window.document.getElementById('status'+i+statusval).checked = true;";
		$js .= 'i++;}'.
		'}';
		acymailing_addScript(true, $js);
	}

	function display($map){
		return acymailing_radio($this->values, $map , 'class="radiobox" size="1" onclick="updateStatus(this.value)"', 'value', 'text', '','status_all');
	}
}
components/com_acymailing/types/index.html000060400000000054152453623450015051 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/types/editor.php000060400000002251152453623450015054 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class editorType extends acymailingClass{

	function __construct(){
		parent::__construct();
		if(!ACYMAILING_J16){
			$query = 'SELECT DISTINCT element,name FROM '.acymailing_table('plugins',false).' WHERE folder=\'editors\' AND published=1 ORDER BY ordering ASC, name ASC';
 		}else{
			$query = 'SELECT element,name FROM '.acymailing_table('extensions',false).' WHERE folder=\'editors\' AND enabled=1 AND type=\'plugin\' ORDER BY ordering ASC, name ASC';
		}

		$joomEditors = acymailing_loadObjectList($query);

		$this->values = array();
		$this->values[] = acymailing_selectOption('0', acymailing_translation('ACY_DEFAULT'));
		if(!empty($joomEditors)){
			foreach($joomEditors as $myEditor){
				$this->values[] = acymailing_selectOption($myEditor->element, $myEditor->name);
			}
		}
	}

	function display($map,$value){
		return acymailing_select($this->values, $map , 'size="1"', 'value', 'text', $value);
	}

}
components/com_acymailing/types/statusfilterlist.php000060400000002113152453623450017210 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class statusfilterlistType extends acymailingClass{
	var $extra = '';
	function __construct(){
		parent::__construct();
		$this->values = array();
		$this->values[] = acymailing_selectOption('1', acymailing_translation('SUBSCRIBERS'));
		$this->values[] = acymailing_selectOption('2', acymailing_translation('PENDING_SUBSCRIPTION'));
		$this->values[] = acymailing_selectOption('-1', acymailing_translation('UNSUBSCRIBERS'));
		$this->values[] = acymailing_selectOption('-2', acymailing_translation('NO_SUBSCRIPTION'));
	}

	function display($map,$value,$submit = true){
		$onChange = $submit ? 'onchange="document.adminForm.limitstart.value=0;document.adminForm.submit( );"' : '';
		return acymailing_select(  $this->values, $map, 'class="inputbox" size="1" '.$onChange.' '.$this->extra, 'value', 'text', (int) $value );
	}
}
components/com_acymailing/types/authorname.php000060400000001410152453623450015725 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class authornameType extends acymailingClass{
	var $onclick = "updateTag();";
	function __construct(){
		parent::__construct();
		$this->values = array();
		$this->values[] = acymailing_selectOption("|author", acymailing_translation('JOOMEXT_YES'));
		$this->values[] = acymailing_selectOption("", acymailing_translation('JOOMEXT_NO'));

	}

	function display($map,$value){
		return acymailing_radio($this->values, $map , 'size="1" onclick="'.$this->onclick.'"', 'value', 'text', (string) $value);
	}

}
components/com_acymailing/types/delay.php000060400000010117152453623450014664 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class delayType extends acymailingClass{
	var $values = array();
	var $num = 0;
	var $onChange = '';

	function __construct(){
		parent::__construct();

		static $i = 0;
		$i++;
		$this->num = $i;

		$js = "function updateDelay".$this->num."(){";
			$js .= "delayvar = window.document.getElementById('delayvar".$this->num."');";
			$js .= "delaytype = window.document.getElementById('delaytype".$this->num."').value;";
			$js .= "delayvalue = window.document.getElementById('delayvalue".$this->num."');";
			$js .= "realValue = delayvalue.value;";
			$js .= "if(delaytype == 'minute'){realValue = realValue*60; }";
			$js .= "if(delaytype == 'hour'){realValue = realValue*3600; }";
			$js .= "if(delaytype == 'day'){realValue = realValue*86400; }";
			$js .= "if(delaytype == 'week'){realValue = realValue*604800; }";
			$js .= "if(delaytype == 'month'){realValue = realValue*2592000; }";
			$js .= "delayvar.value = realValue;";
		$js .= '}';
		acymailing_addScript(true, $js);

	}

	function display($map,$value,$type = 1){
		if($type == 0){
			$this->values[] = acymailing_selectOption('second', acymailing_translation('ACY_SECONDS'));
			$this->values[] = acymailing_selectOption('minute', acymailing_translation('ACY_MINUTES'));
		}elseif($type == 1){
			$this->values[] = acymailing_selectOption('minute', acymailing_translation('ACY_MINUTES'));
			$this->values[] = acymailing_selectOption('hour', acymailing_translation('HOURS'));
			$this->values[] = acymailing_selectOption('day', acymailing_translation('DAYS'));
			$this->values[] = acymailing_selectOption('week', acymailing_translation('WEEKS'));
		}elseif($type == 2){
			$this->values[] = acymailing_selectOption('minute', acymailing_translation('ACY_MINUTES'));
			$this->values[] = acymailing_selectOption('hour', acymailing_translation('HOURS'));
		}elseif($type == 3){
			$this->values[] = acymailing_selectOption('hour', acymailing_translation('HOURS'));
			$this->values[] = acymailing_selectOption('day', acymailing_translation('DAYS'));
			$this->values[] = acymailing_selectOption('week', acymailing_translation('WEEKS'));
			$this->values[] = acymailing_selectOption('month', acymailing_translation('MONTHS'));
		}elseif($type == 4){
			$this->values[] = acymailing_selectOption('week', acymailing_translation('WEEKS'));
			$this->values[] = acymailing_selectOption('month', acymailing_translation('MONTHS'));
		}

		$return = $this->get($value,$type);
		$delayValue = '<input class="inputbox" onchange="updateDelay'.$this->num.'();'.$this->onChange.'" type="text" id="delayvalue'.$this->num.'" style="width:50px" value="'.$return->value.'" /> ';
		$delayVar = '<input type="hidden" name="'.$map.'" id="delayvar'.$this->num.'" value="'.$value.'"/>';
		return $delayValue.acymailing_select(  $this->values, 'delaytype'.$this->num, 'class="inputbox" size="1" style="width:100px" onchange="updateDelay'.$this->num.'();'.$this->onChange.'"', 'value', 'text', $return->type ,'delaytype'.$this->num).$delayVar;
	}

	function get($value,$type){

		$return = new stdClass();

		$return->value = $value;
		if($type == 0){
			$return->type = 'second';
		}else{
			$return->type = 'minute';
		}

		if($return->value >= 60  AND $return->value%60 == 0){
			$return->value = (int) $return->value / 60;
			$return->type = 'minute';
			if($type != 0 AND $return->value >=60 AND $return->value%60 == 0){
				$return->type = 'hour';
				$return->value = $return->value / 60;
				if($type != 2 AND $return->value >=24 AND $return->value%24 == 0){
					$return->type = 'day';
					$return->value = $return->value / 24;
					if($type >= 3 AND $return->value >=30 AND $return->value%30 == 0){
						$return->type = 'month';
						$return->value = $return->value / 30;
					}elseif($return->value >=7 AND $return->value%7 == 0){
						$return->type = 'week';
						$return->value = $return->value / 7;
					}
				}
			}
		}

		return $return;

	}

}
components/com_acymailing/types/operators.php000060400000004356152453623450015614 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class operatorsType extends acymailingClass{
	var $extra = '';
	function __construct(){
		parent::__construct();

		$this->values = array();

		$this->values[] = acymailing_selectOption('<OPTGROUP>', acymailing_translation('ACY_NUMERIC'));
		$this->values[] = acymailing_selectOption('=', '=');
		$this->values[] = acymailing_selectOption('!=', '!=');
		$this->values[] = acymailing_selectOption('>', '>');
		$this->values[] = acymailing_selectOption('<', '<');
		$this->values[] = acymailing_selectOption('>=', '>=');
		$this->values[] = acymailing_selectOption('<=', '<=');
		$this->values[] = acymailing_selectOption('</OPTGROUP>');
		$this->values[] = acymailing_selectOption('<OPTGROUP>', acymailing_translation('ACY_STRING'));
		$this->values[] = acymailing_selectOption('BEGINS', acymailing_translation('ACY_BEGINS_WITH'));
		$this->values[] = acymailing_selectOption('END', acymailing_translation('ACY_ENDS_WITH'));
		$this->values[] = acymailing_selectOption('CONTAINS', acymailing_translation('ACY_CONTAINS'));
		$this->values[] = acymailing_selectOption('NOTCONTAINS', acymailing_translation('ACY_NOT_CONTAINS'));
		$this->values[] = acymailing_selectOption('LIKE', 'LIKE');
		$this->values[] = acymailing_selectOption('NOT LIKE', 'NOT LIKE');
		$this->values[] = acymailing_selectOption('REGEXP', 'REGEXP');
		$this->values[] = acymailing_selectOption('NOT REGEXP', 'NOT REGEXP');
		$this->values[] = acymailing_selectOption('</OPTGROUP>');
		$this->values[] = acymailing_selectOption('<OPTGROUP>', acymailing_translation('OTHER'));
		$this->values[] = acymailing_selectOption('IS NULL', 'IS NULL');
		$this->values[] = acymailing_selectOption('IS NOT NULL', 'IS NOT NULL');
		$this->values[] = acymailing_selectOption('</OPTGROUP>');

	}

	function display($map, $valueSelected = '', $otherClass = ''){
		return acymailing_select($this->values, $map, 'class="inputbox'. (!empty($otherClass)?' '.$otherClass:'') .'" size="1" style="width:120px;" '.$this->extra, 'value', 'text', $valueSelected);
	}

}
components/com_acymailing/types/statusfilter.php000060400000003303152453623450016316 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class statusfilterType extends acymailingClass{
	function __construct(){
		parent::__construct();
		$this->values = array();
		$this->values[] = acymailing_selectOption('0', acymailing_translation('ALL_STATUS'));
		$this->values[] = acymailing_selectOption( '<OPTGROUP>', acymailing_translation( 'ACCEPT_REFUSE' ));
		$this->values[] = acymailing_selectOption('1', acymailing_translation('ACCEPT_EMAIL'));
		$this->values[] = acymailing_selectOption('-1', acymailing_translation('REFUSE_EMAIL'));
		$this->values[] = acymailing_selectOption( '</OPTGROUP>');
		$config = acymailing_config();
		if($config->get('require_confirmation',0)){
			$this->values[] = acymailing_selectOption( '<OPTGROUP>', acymailing_translation( 'SUBSCRIPTION' ));
			$this->values[] = acymailing_selectOption('2', acymailing_translation('PENDING_SUBSCRIPTION'));
			$this->values[] = acymailing_selectOption( '</OPTGROUP>');
		}
		$this->values[] = acymailing_selectOption( '<OPTGROUP>', acymailing_translation( 'ENABLED_DISABLED' ));
		$this->values[] = acymailing_selectOption('3', acymailing_translation('ENABLED'));
		$this->values[] = acymailing_selectOption('-3', acymailing_translation('DISABLED'));
		$this->values[] = acymailing_selectOption( '</OPTGROUP>');
	}

	function display($map,$value){
		return acymailing_select(  $this->values, $map, 'size="1" onchange="document.adminForm.limitstart.value=0;document.adminForm.submit( );"', 'value', 'text', (int) $value );
	}
}
components/com_acymailing/types/detailstatsmail.php000060400000002157152453623450016757 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class detailstatsmailType extends acymailingClass{
	function __construct(){
		parent::__construct();

		$query = 'SELECT b.subject, a.mailid FROM '.acymailing_table('stats').' as a';
		$query .= ' JOIN '.acymailing_table('mail').' as b on a.mailid = b.mailid ORDER BY a.senddate DESC LIMIT 200';
		$emails = acymailing_loadObjectList($query);

		$this->values = array();
		$this->values[] = acymailing_selectOption('0', acymailing_translation('ALL_EMAILS'));
		foreach($emails as $oneMail){
			if(!empty($oneMail->subject)) $oneMail->subject = acyEmoji::Decode($oneMail->subject);
			$this->values[] = acymailing_selectOption($oneMail->mailid, $oneMail->subject );
		}
	}

	function display($map,$value){
		return acymailing_select(  $this->values, $map, 'class="inputbox" size="1" onchange="document.adminForm.submit( );"', 'value', 'text', (int) $value );
	}
}
components/com_acymailing/types/bounceaction.php000060400000004056152453623450016244 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class bounceactionType extends acymailingClass{
	function __construct(){
		parent::__construct();

		$this->values = array();
		$this->values[] = acymailing_selectOption('noaction', acymailing_translation('DO_NOTHING'));
		$this->values[] = acymailing_selectOption('remove', acymailing_translation('REMOVE_SUB'));
		$this->values[] = acymailing_selectOption('unsub', acymailing_translation('UNSUB_USER'));
		$this->values[] = acymailing_selectOption('sub', acymailing_translation('SUBSCRIBE_USER'));
		$this->values[] = acymailing_selectOption('block', acymailing_translation('BLOCK_USER'));
		$this->values[] = acymailing_selectOption('delete', acymailing_translation('DELETE_USER'));

		$this->config = acymailing_config();
		$this->lists = acymailing_get('type.lists');
		$this->lists->getValues();
		array_shift($this->lists->values);

		$js = "function updateSubAction(num){";
			$js .= "myAction = window.document.getElementById('bounce_action_'+num).value;";
			$js .= "if(myAction == 'sub') {window.document.getElementById('bounce_action_lists_'+num).style.display = '';}else{window.document.getElementById('bounce_action_lists_'+num).style.display = 'none';}";
		$js .= '}';
		acymailing_addScript(true, $js);
	}

	function display($num,$value){
		$js ='document.addEventListener("DOMContentLoaded", function(){ updateSubAction("'.$num.'"); });';
		acymailing_addScript(true, $js);

		$return = acymailing_select(  $this->values, 'config[bounce_action_'.$num.']', 'class="inputbox" size="1" onchange="updateSubAction(\''.$num.'\');"', 'value', 'text', $value ,'bounce_action_'.$num);
		$return .= '<span id="bounce_action_lists_'.$num.'" style="display:none">'.$this->lists->display('config[bounce_action_lists_'.$num.']',$this->config->get('bounce_action_lists_'.$num),false).'</span>';

		return $return;
	}

}
components/com_acymailing/types/charset.php000060400000003561152453623450015224 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class charsetType extends acymailingClass{
	var $addinfo = '';
	function __construct(){
		parent::__construct();
		$charsets = array(
					'BIG5'=>'BIG5',//Iconv,mbstring
					'ISO-8859-1'=>'ISO-8859-1',//Iconv,mbstring
					'ISO-8859-2'=>'ISO-8859-2',//Iconv,mbstring
					'ISO-8859-3'=>'ISO-8859-3',//Iconv,mbstring
					'ISO-8859-4'=>'ISO-8859-4',//Iconv,mbstring
					'ISO-8859-5'=>'ISO-8859-5',//Iconv,mbstring
					'ISO-8859-6'=>'ISO-8859-6',//Iconv,mbstring
					'ISO-8859-7'=>'ISO-8859-7',//Iconv,mbstring
					'ISO-8859-8'=>'ISO-8859-8',//Iconv,mbstring
					'ISO-8859-9'=>'ISO-8859-9',//Iconv,mbstring
					'ISO-8859-10'=>'ISO-8859-10',//Iconv,mbstring
					'ISO-8859-13'=>'ISO-8859-13',//Iconv,mbstring
					'ISO-8859-14'=>'ISO-8859-14',//Iconv,mbstring
					'ISO-8859-15'=>'ISO-8859-15',//Iconv,mbstring
					'ISO-2022-JP'=>'ISO-2022-JP',//mbstring for sure... not sure about Iconv
					'US-ASCII'=>'US-ASCII', //Iconv,mbstring
					'UTF-7'=>'UTF-7',//Iconv,mbstring
					'UTF-8'=>'UTF-8',//Iconv,mbstring
					'UTF-16'=>'UTF-16',//Iconv,mbstring
					'Windows-1251'=>'Windows-1251', //Iconv,mbstring
					'Windows-1252'=>'Windows-1252' //Iconv,mbstring
				);

		if(function_exists('iconv')){
			$charsets['ARMSCII-8'] = 'ARMSCII-8';
			$charsets['ISO-8859-16'] = 'ISO-8859-16';
		}

		$this->charsets = $charsets;

		$this->values = array();
		foreach($charsets as $code => $charset){
			$this->values[] = acymailing_selectOption($code, $charset);
		}

	}

	function display($map,$value){
		return acymailing_select($this->values, $map , 'size="1" style="width:150px;" '.$this->addinfo, 'value', 'text', $value);
	}

}
components/com_acymailing/types/color.php000060400000014004152453623450014703 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class colorType extends acymailingClass{
	function __construct(){
		parent::__construct();

		$this->values = array();

		for($red=0; $red<6;$red++) {
			$rhex = dechex($red * 0x33);
			$rhex = (strlen($rhex) < 2)?"0".$rhex:$rhex;
			for($blue=0; $blue<6;$blue++) {
				$bhex = dechex($blue * 0x33);
				$bhex = (strlen($bhex) < 2)?"0".$bhex:$bhex;
				for($green=0; $green<6;$green++) {
					$ghex = dechex($green * 0x33);
					$ghex = (strlen($ghex) < 2)?"0".$ghex:$ghex;
					$this->values[$red][] = '#'.$rhex.$ghex.$bhex;
				}
			}
		}

		$this->othervalues[] = '#000000';
		$this->othervalues[] = '#111111';
		$this->othervalues[] = '#222222';
		$this->othervalues[] = '#333333';
		$this->othervalues[] = '#444444';
		$this->othervalues[] = '#555555';
		$this->othervalues[] = '#666666';
		$this->othervalues[] = '#777777';
		$this->othervalues[] = '#888888';
		$this->othervalues[]  = '#999999';
		$this->othervalues[]  = '#AAAAAA';
		$this->othervalues[]  = '#BBBBBB';
		$this->othervalues[]  = '#CCCCCC';
		$this->othervalues[]  = '#DDDDDD';
		$this->othervalues[]  = '#EEEEEE';
		$this->othervalues[]  = '#FFFFFF';
		$this->othervalues[]  = '#FF0000';
		$this->othervalues[]  = '#00FFFF';
		$this->othervalues[]  = '#0000FF';
		$this->othervalues[]  = '#0000A0';
		$this->othervalues[]  = '#FF0080';
		$this->othervalues[]  = '#800080';
		$this->othervalues[]  = '#FFFF00';
		$this->othervalues[]  = '#00FF00';
		$this->othervalues[]  = '#FF00FF';
		$this->othervalues[]  = '#FF8040';
		$this->othervalues[]  = '#804000';
		$this->othervalues[]  = '#800000';
		$this->othervalues[]  = '#808000';
		$this->othervalues[]  = '#408080';

	}

	function displayAll($id,$map,$color){
		 $this->jsScript = 'function applyColor'.$id.'(newcolor){document.getElementById(\'color'.$id.'\').value = newcolor; document.getElementById("colordiv'.$id.'").style.display = "none";applyColorExample'.$id.'();}';

		$code = '<input type="text" name="'.$map.'" id="color'.$id.'" onchange=\'applyColorExample'.$id.'()\' class="inputbox" style="width:50px" value="'.htmlspecialchars($color,ENT_COMPAT, 'UTF-8').'" />';
		$code .= ' <input type="text" maxlength="0" style="cursor:pointer;width:50px;background-color:'.htmlspecialchars($color,ENT_COMPAT, 'UTF-8').';" onclick="if(document.getElementById(\'colordiv'.$id.'\').style.display == \'block\'){document.getElementById(\'colordiv'.$id.'\').style.display = \'none\';}else{document.getElementById(\'colordiv'.$id.'\').style.display = \'block\';}" id=\'colorexample'.$id.'\' />';
		$code .= '<div id=\'colordiv'.$id.'\' style=\'display:none;position:absolute;z-index:100;background-color:white;border:1px solid grey\'>'.$this->display($id).'</div>';
		return $code;
	}

	function displayOne($id,$map,$color){

	$this->jsScript = 'function applyColorwysijacolor(newcolor){
							 var myRegex = new RegExp(/([^a-z-])color *:[^;]*(!important)?[^;]*;/i);
							document.getElementById("name_"+currentValueId).style.color = newcolor;
							document.getElementById("colorexamplewysijacolor").style.backgroundColor = newcolor;
							spaced = document.getElementById("style_"+currentValueId).value.substr(0,1);
							if(spaced != " "){
								stringToQuery = \' \' + document.getElementById("style_"+currentValueId).value;
							}
							else{
								stringToQuery = document.getElementById("style_"+currentValueId).value;
							}
							if(stringToQuery.search(myRegex) != -1){
							if(currentValueId.search("tag_h") != -1){
								document.getElementById("style_"+currentValueId).value = stringToQuery.replace(myRegex, "$1"+"color:"+newcolor+" !important;");
							}
							else{
								document.getElementById("style_"+currentValueId).value = stringToQuery.replace(myRegex, "$1"+"color:"+newcolor+";");
							}
							}
							else{
								 if(currentValueId.search("tag_h") != -1){
								document.getElementById("style_"+currentValueId).value = "color:"+newcolor+" !important;" + document.getElementById("style_"+currentValueId).value;
							}
							else{
								document.getElementById("style_"+currentValueId).value = "color:"+newcolor+";" + document.getElementById("style_"+currentValueId).value;
							}
							}
							document.getElementById("colordivwysijacolor").style.display = "none";
							document.getElementById(\'colorexample'.$id.'\').style.backgroundColor = newcolor;
						}';
		$code = ' <input type="text" maxlength="0" style=\'width:17px;height:13px;padding:0px;margin:0px;cursor:pointer;background-color:'.$color.'\' onclick="if(document.getElementById(\'colordivwysijacolor\').style.display == \'block\'){document.getElementById(\'colordivwysijacolor\').style.display = \'none\';}else{document.getElementById(\'colordivwysijacolor\').style.display = \'block\';}" id=\'colorexamplewysijacolor\' />';
		$code .= '<div id=\'colordivwysijacolor\' style=\'display:none;width:300px;position:absolute;background-color:white;border:1px solid grey\'>'.$this->display($id).'</div>';
		return $code;
	}

	function display($id = ''){

		$js =  $this->jsScript;
		$js .= 'function applyColorExample'.$id.'(){document.getElementById(\'colorexample'.$id.'\').style.backgroundColor = document.getElementById(\'color'.$id.'\').value; document.getElementById("colordiv'.$id.'").style.display = "none";}';
		acymailing_addScript(true, $js);


		$text = '<table><tr>';
		foreach($this->othervalues as $oneColor){
			$text .= '<td style="cursor:pointer" width="10" height="10" bgcolor="'.$oneColor.'" onclick="applyColor'.$id.'(\''.$oneColor.'\')"></td>';
		}
		$text .= '</tr></table>';
		$text .= '<table>';
		foreach($this->values as $line){
			$text .= '<tr>';
			foreach($line as $oneColor){
				$text .= '<td style="cursor:pointer" width="10" height="10" bgcolor="'.$oneColor.'" onclick="applyColor'.$id.'(\''.$oneColor.'\')"></td>';
			}
			$text .= '</tr>';
		}
		$text .= '</table>';

		return $text;
	}

}
components/com_acymailing/types/status.php000060400000001657152453623450015122 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class statusType extends acymailingClass{
	function __construct(){
		parent::__construct();
		$this->values = array();
		$this->values[] = acymailing_selectOption('-1', acymailing_translation('UNSUBSCRIBED'));
		$this->values[] = acymailing_selectOption('0', acymailing_translation('NO_SUBSCRIPTION'));
		$this->values[] = acymailing_selectOption('2', acymailing_translation('PENDING_SUBSCRIPTION'));
		$this->values[] = acymailing_selectOption('1', acymailing_translation('SUBSCRIBED'));
	}

	function display($map,$value){
		static $i = 0;
		return acymailing_radio($this->values, $map , 'class="radiobox" size="1"', 'value', 'text', (int) $value,'status'.$i++);
	}

}
components/com_acymailing/types/deliverstatus.php000060400000002066152453623450016470 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class deliverstatusType extends acymailingClass{

	function __construct(){
		parent::__construct();

		$this->values = array();
		$this->values[] = acymailing_selectOption('0', acymailing_translation('ALL_STATUS'));
		$this->values[] = acymailing_selectOption('open', acymailing_translation('OPEN'));
		$this->values[] = acymailing_selectOption('notopen', acymailing_translation('NOT_OPEN'));
		$this->values[] = acymailing_selectOption('failed', acymailing_translation('FAILED'));
		if(acymailing_level(3)) $this->values[] = acymailing_selectOption('bounce', acymailing_translation('BOUNCES'));

	}

	function display($map,$value){
		return acymailing_select(  $this->values, $map, 'class="inputbox" size="1" style="width:150px;" onchange="document.adminForm.submit( );"', 'value', 'text', $value );
	}
}
components/com_acymailing/types/mailcreator.php000060400000002371152453623450016073 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.0.1
 * @author	acyba.com
 * @copyright	(C) 2009-2015 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */
defined('_JEXEC') or die('Restricted access');
?><?php

class mailcreatorType{
	var $type = 'news';
	function load(){

		$db = JFactory::getDBO();

		$db->setQuery('SELECT COUNT(*) as total,userid FROM #__acymailing_mail WHERE `type` = '.$db->Quote($this->type).' AND `userid` > 0 GROUP BY userid');
		$allusers = $db->loadObjectList('userid');

		$allnames = array();
		if(!empty($allusers)){
			$db->setQuery('SELECT name,id FROM #__users WHERE id IN ('.implode(',',array_keys($allusers)).') ORDER BY name ASC');
			$allnames = $db->loadObjectList('id');
		}

		$this->values = array();
		$this->values[] = JHTML::_('select.option', '0', JText::_('ALL_CREATORS') );
		foreach($allnames as $userid => $oneCreator){
			$this->values[] = JHTML::_('select.option', $userid, $oneCreator->name.' ( '.$allusers[$userid]->total.' )' );
		}
	}

	function display($map,$value){
		$this->load();
		return JHTML::_('select.genericlist',   $this->values, $map, 'class="inputbox" size="1" onchange="document.adminForm.submit( );"', 'value', 'text', (int) $value );
	}
}
components/com_acymailing/types/contentfilter.php000060400000001755152453623450016456 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class contentfilterType extends acymailingClass{
	var $onclick = 'updateTag();';
	function __construct(){
		parent::__construct();
	}

	function display($map,$value,$label = true,$modified = true){
		$prefix = $label ? '|filter:' : '';
		$this->values = array();
		$this->values[] = acymailing_selectOption("", acymailing_translation('ACY_ALL'));
		$this->values[] = acymailing_selectOption($prefix."created", acymailing_translation('ONLY_NEW_CREATED'));
		if($modified) $this->values[] = acymailing_selectOption($prefix."modify", acymailing_translation('ONLY_NEW_MODIFIED'));
		return acymailing_select($this->values, $map , 'size="1" onchange="'.$this->onclick.'" style="max-width:200px;"', 'value', 'text', (string) $value);
	}
}
components/com_acymailing/types/operatorsin.php000060400000001362152453623450016135 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class operatorsinType extends acymailingClass{
	var $js = '';
	function __construct(){
		parent::__construct();

		$this->values = array();

		$this->values[] = acymailing_selectOption('IN', acymailing_translation('ACY_IN'));
		$this->values[] = acymailing_selectOption('NOT IN', acymailing_translation('ACY_NOT_IN'));

	}

	function display($map){
		return acymailing_select($this->values, $map, 'class="inputbox" size="1" style="width:120px;" '.$this->js, 'value', 'text');
	}

}
components/com_acymailing/types/uploadpict.php000060400000001357152453623450015740 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	4.9.3
 * @author	acyba.com
 * @copyright	(C) 2009-2015 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */
defined('_JEXEC') or die('Restricted access');
?><?php

class uploadpictType{
	function display($map, $mapDelete, $previous){
		$result = '<input type="file" name="pictures['.$mapDelete.']" style="width:auto;"/>';
		if(!empty($previous)){
			$result .='<img src="'.ACYMAILING_LIVE.$previous.'" style="float:left;max-height:50px;margin-right:10px;" />
			<br /><input type="checkbox" name="'.$map.'" value="" id="delete'.$mapDelete.'" /> <label for="delete'.$mapDelete.'">'.JText::_('DELETE_PICT').'</label>';
		}
		return $result;
	}
}
components/com_acymailing/types/frequency.php000060400000022251152453623450015571 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class frequencyType extends acymailingClass{
	var $valuesEvery = array();
	var $valuesFrequency = array();
	var $valuesOnThe = array();
	var $valuesOnTheDay = array();

	var $txtDays = array();
	var $days = array();
	var $txtPos = array();

	function __construct(){
		parent::__construct();
		$this->txtDays = array(acymailing_translation('MONDAY'), acymailing_translation('TUESDAY'), acymailing_translation('WEDNESDAY'), acymailing_translation('THURSDAY'), acymailing_translation('FRIDAY'), acymailing_translation('SATURDAY'), acymailing_translation('SUNDAY'));
		$this->txtPos = array(acymailing_translation('FREQUENCY_FIRST'), acymailing_translation('FREQUENCY_SECOND'), acymailing_translation('FREQUENCY_THIRD'), acymailing_translation('FREQUENCY_LAST'));
		$this->days = array('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday');

		$js = "function updateFrequency(){
					frequencyType = window.document.getElementById('frequencyType');
					everyFields = window.document.getElementById('everyFields');
					onTheFields = window.document.getElementById('onTheFields');
					onField = window.document.getElementById('onField');
					delayvar = window.document.getElementById('delayvar');

					if(frequencyType.value == 'asap'){
						onField.style.display='none';
						everyFields.style.display='none';
						onTheFields.style.display='none';
					}

					if(frequencyType.value == 'onthe'){
						onField.style.display='none';
						everyFields.style.display='none';
						onTheFields.style.display='inline';
					}

					if(frequencyType.value == 'on'){
						onField.style.display='inline';
						everyFields.style.display='none';
						onTheFields.style.display='none';
					}

					if(frequencyType.value == 'every'){
						onField.style.display='none';
						everyFields.style.display='inline';
						onTheFields.style.display='none';
					}
					updateDelay();
				}";

		$js .= "function updateDelay(){
					frequencyType = window.document.getElementById('frequencyType');
					delayvar = window.document.getElementById('delayvar');
					if(frequencyType.value == 'asap'){
						delayvar.value = 0;
					}

					if(frequencyType.value == 'onthe'){
						valuesOnThe = window.document.getElementById('valuesOnThe').value;
						valuesOnTheDay = window.document.getElementById('valuesOnTheDay').value;
						delayvar.value = valuesOnThe+'_'+valuesOnTheDay;
					}

					if(frequencyType.value == 'on'){
						valuesOn = window.document.getElementById('valuesOn');
						selection = [];
						for(var i = 0 ; i < valuesOn.length ; i++){
							if(valuesOn[i].selected) {
								selection.push(valuesOn[i].value);
							}
						}
						delayvar.value = 'on_'+selection.join('_');
					}

					if(frequencyType.value == 'every'){
						delaytype = window.document.getElementById('delaytype').value;
						delayvalue = window.document.getElementById('delayvalue');
						realValue = delayvalue.value;
						if(delaytype == 'minute'){realValue = realValue*60; }
						if(delaytype == 'hour'){realValue = realValue*3600; }
						if(delaytype == 'day'){realValue = realValue*86400; }
						if(delaytype == 'week'){realValue = realValue*604800; }
						if(delaytype == 'month'){realValue = realValue*2592000; }
						delayvar.value = realValue;
					}
				}";

		acymailing_addScript(true, $js);
	}

	function displayFrequency($map, $value, $type = 1){
		$styleEvery = 'style="display:none"';
		$styleOnThe = 'style="display:none"';
		$styleOn = 'style="display:none"';
		$value_array = array('first', 'Monday');
		$weekdays = array();

		if(empty($value) || (!is_numeric($value) && strpos($value, '_') === false)){
			$defaultVal = 'asap';
			$styleEvery = 'style="display:none"';
			$styleOnThe = 'style="display:none"';
			$styleOn = 'style="display:none"';
		}elseif(is_numeric($value)){
			$defaultVal = 'every';
			$styleEvery = '';
		}elseif(strpos($value, 'on_') !== false){
			$defaultVal = 'on';
			$styleOn = '';

			if(ltrim($value, 'on_') != ''){
				$values = explode('_', ltrim($value, 'on_'));
				foreach($values as $oneDay){
					$weekdays[] = acymailing_selectOption($oneDay, acymailing_translation(strtoupper($oneDay)));
				}
			}
		}else{
			$defaultVal = 'onthe';
			$styleOnThe = '';
			$value_array = explode('_', $value);
		}

		$this->valuesFrequency[] = acymailing_selectOption('asap', acymailing_translation('ACY_ASAP'));
		$this->valuesFrequency[] = acymailing_selectOption('onthe', acymailing_translation('ACY_ONTHE'));
		$this->valuesFrequency[] = acymailing_selectOption('on', acymailing_translation('ACY_ON'));
		$this->valuesFrequency[] = acymailing_selectOption('every', acymailing_translation('EVERY'));
		$returnFrequency = acymailing_select($this->valuesFrequency, 'frequencyType', 'class="inputbox" size="1" onchange="updateFrequency();" style="width:160px;vertical-align:top;"', 'value', 'text', $defaultVal);

		$this->valuesEvery[] = acymailing_selectOption('hour', acymailing_translation('HOURS'));
		$this->valuesEvery[] = acymailing_selectOption('day', acymailing_translation('DAYS'));
		$this->valuesEvery[] = acymailing_selectOption('week', acymailing_translation('WEEKS'));
		$this->valuesEvery[] = acymailing_selectOption('month', acymailing_translation('MONTHS'));
		$return = $this->get($value, $type);
		$everyValue = '<input class="inputbox" onchange="updateDelay();" type="text" id="delayvalue" style="width:50px" value="'.$return->value.'" /> ';
		$everyType = acymailing_select($this->valuesEvery, 'delaytype', 'class="inputbox" size="1" style="width:100px" onchange="updateDelay();"', 'value', 'text', $return->type, 'delaytype');
		$everyFields = '<span id="everyFields" '.$styleEvery.'>'.$everyValue.$everyType.'</span>';

		$this->valuesOnThe[] = acymailing_selectOption('first', $this->txtPos[0]);
		$this->valuesOnThe[] = acymailing_selectOption('second', $this->txtPos[1]);
		$this->valuesOnThe[] = acymailing_selectOption('third', $this->txtPos[2]);
		$this->valuesOnThe[] = acymailing_selectOption('last', $this->txtPos[3]);
		$onTheNumber = acymailing_select($this->valuesOnThe, 'valuesOnThe', 'class="inputbox" size="1" onchange="updateDelay();" style="width:80px;"', 'value', 'text', $value_array[0]);

		for($i = 0; $i < 7; $i++){
			$this->valuesOnTheDay[] = acymailing_selectOption($this->days[$i], $this->txtDays[$i]);
		}
		$onTheDay = acymailing_select($this->valuesOnTheDay, 'valuesOnTheDay', 'class="inputbox" size="1" onchange="updateDelay();" style="width:120px;"', 'value', 'text', $value_array[1]);
		$onTheFields = '<span id="onTheFields" '.$styleOnThe.'>'.$onTheNumber.$onTheDay.' '.acymailing_translation('ACY_DAYOFMONTH').'</span>';

		$delayVar = '<input type="hidden" name="'.$map.'" id="delayvar" value="'.$value.'" />';

		$onField = '<span id="onField" '.$styleOn.'>'.acymailing_select($this->valuesOnTheDay, 'valuesOn', 'class="inputbox" size="1" onchange="updateDelay();" multiple style="width:120px;height:70px;"', 'value', 'text', $weekdays).'</span>';


		return $returnFrequency.$onTheFields.$onField.$everyFields.$delayVar;
	}

	function get($value, $type){
		$return = new stdClass();

		if(!is_numeric($value)){
			$return->value = 0;
			$return->type = 'hour';
			return $return;
		}

		$return->value = $value;
		if($type == 0){
			$return->type = 'second';
		}else{
			$return->type = 'minute';
		}

		if($return->value >= 60 AND $return->value % 60 == 0){
			$return->value = (int)$return->value / 60;
			$return->type = 'minute';
			if($type != 0 AND $return->value >= 60 AND $return->value % 60 == 0){
				$return->type = 'hour';
				$return->value = $return->value / 60;
				if($type != 2 AND $return->value >= 24 AND $return->value % 24 == 0){
					$return->type = 'day';
					$return->value = $return->value / 24;
					if($type >= 3 AND $return->value >= 30 AND $return->value % 30 == 0){
						$return->type = 'month';
						$return->value = $return->value / 30;
					}elseif($return->value >= 7 AND $return->value % 7 == 0){
						$return->type = 'week';
						$return->value = $return->value / 7;
					}
				}
			}
		}
		return $return;
	}

	function display($value){
		if(is_numeric($value)){
			if($value == 0){
				return acymailing_translation('ACY_ASAP');
			}else{
				if(empty($value)) return acymailing_translation('ACY_ASAP');
				$type = 'ACY_SECONDS';
				if($value >= 60 AND $value % 60 == 0){
					$value = (int)$value / 60;
					$type = 'ACY_MINUTES';
					if($value >= 60 AND $value % 60 == 0){
						$type = 'HOURS';
						$value = $value / 60;
						if($value >= 24 AND $value % 24 == 0){
							$type = 'DAYS';
							$value = $value / 24;
							if($value >= 30 AND $value % 30 == 0){
								$type = 'MONTHS';
								$value = $value / 30;
							}elseif($value >= 7 AND $value % 7 == 0){
								$type = 'WEEKS';
								$value = $value / 7;
							}
						}
					}
				}
				return acymailing_translation('EVERY').' '.$value.' '.acymailing_translation($type);
			}
		}

		$arrayValue = explode('_', $value);
		return acymailing_translation('ACY_ONTHE').' '.$arrayValue[0].' '.$arrayValue[1].' '.acymailing_translation('ACY_DAYOFMONTH');
	}
}

?>

components/com_acymailing/types/content.php000060400000001712152453623450015241 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class contentType extends acymailingClass{
	var $onclick = 'updateTag();';
	function __construct(){
		parent::__construct();
		$this->values = array();
		$this->values[] = acymailing_selectOption("|type:title", acymailing_translation('TITLE_ONLY'));
		$this->values[] = acymailing_selectOption("|type:intro", acymailing_translation('INTRO_ONLY'));
		$this->values[] = acymailing_selectOption("|type:text", acymailing_translation('FIELD_TEXT'));
		$this->values[] = acymailing_selectOption("|type:full", acymailing_translation('FULL_TEXT'));
	}

	function display($map,$value){
		return acymailing_radio($this->values, $map , 'size="1" onclick="'.$this->onclick.'"', 'value', 'text', $value);
	}

}
components/com_acymailing/types/testreceiver.php000060400000016157152453623450016304 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class testreceiverType extends acymailingClass{
	function display($selection = '', $group = '', $emails = ''){
		if(empty($emails)) $emails = acymailing_currentUserEmail();

		$js = 'function timeoutAddNewTestAddress(currentValue){
					if(currentValue.length > 1 && ((currentValue.indexOf("@") != -1 && currentValue.slice(-1) == " ") || currentValue.slice(-1) == ";" || currentValue.slice(-1) == ",")){
						currentValue = currentValue.substring(0, currentValue.length - 1);
						setUser(currentValue);
						return;
					}
					setTimeout(function(){addNewTestAddress(currentValue);}, 500);
				}

			function addNewTestAddress(currentValue){';
		if(acymailing_isAdmin()){
			$js .= 'if(currentValue != document.getElementById("message_receivers").value) return;
					var xhr = new XMLHttpRequest();
					xhr.open("GET", "'.acymailing_prepareAjaxURL('subscriber').'&task=getSubscribersByEmail&search="+currentValue);
					xhr.onload = function(){
						document.getElementById("acymailing_divSelectReceiver").style.display = "block";
						document.getElementById("acymailing_receiversTable").innerHTML = xhr.responseText;
						receiversList = document.getElementById("acymailing_receiversTable");
						if(receiversList.getElementsByClassName("row_user").length==0) {
							document.getElementById("acymailing_divSelectReceiver").style.display = "none";
						}
					};
					xhr.send();';
		}
		$js .= '}

			var selected = new Array("'.str_replace(',', '","', $emails).'");
			function setUser(userEmail){
				userEmail = userEmail.replace(/^\s+|\s+$/gm,"");
				if(validateEmail(userEmail, "'.str_replace('"', '\\"', acymailing_translation('SEND_TEST_TO')).'") && selected.indexOf(userEmail) == -1){
					selected.push(userEmail);
					document.getElementById("usersSelected").innerHTML += "<span class=\"selectedUsers\">"+userEmail+"<span class=\"removeUser\" onclick=\"removeUser(this, \'"+userEmail+"\');\"></span></span>";
					document.getElementById("test_emails").value = selected.join(",");
				}
				document.getElementById("message_receivers").value = "";
				document.getElementById("acymailing_divSelectReceiver").style.display = "none";
			}

			function removeUser(element, userEmail){
				var toRemove = element.parentElement;
				toRemove.parentElement.removeChild(toRemove);
				var index = selected.indexOf(userEmail);
				if (index > -1) {
					selected.splice(index, 1);
				}
				document.getElementById("test_emails").value = selected.join(",");
			}

			function showOptions(selection){
				if(selection == "users"){
					document.getElementById("userSelection").style.display = "";
					document.getElementById("groupSelection").style.display = "none";
				}else{
					document.getElementById("userSelection").style.display = "none";
					document.getElementById("groupSelection").style.display = "";
				}
			}

			function myKeyPress(e, value){
				var keynum;

				if(window.event) {
				  keynum = e.keyCode;
				}else if(e.which){
				  keynum = e.which;
				}

				if(keynum == 13){
					setUser(value);
					return false;
				}

				return true;
			}';

		acymailing_addScript(true, $js);
		?>
		<style>
			.removeUser{
				width: 20px;
				background-image: url(<?php echo ACYMAILING_LIVE.'/'.ACYMAILING_MEDIA_FOLDER; ?>/images/closecross.png);
				background-size: cover;
				height: 20px;
				cursor: pointer;
				float: right;
			}

			.selectedUsers{
				background-color: #F5F5F5;
				padding-left: 5px;
				display: inline-block;
				border: solid 1px #C5C4C4;
				border-radius: 4px;
				margin-right: 3px;
				margin-top: 5px;
				line-height: 20px;
			}

			#acymailing_divSelectReceiver td{
				padding: 10px 5px;
			}

			#acymailing_divSelectReceiver{
				position: absolute;
				width: 400px;
				border: solid 1px #D3D3D3;
				z-index: 9999;
				background: white;
				box-shadow: 1px 1px 5px #D5D5DD;
			}

			#acymailing_receiversTable .row_user:hover{
				background-color: #EBEBEB;
				cursor: pointer;
			}

			.row_user{
				border-top: solid 1px #EBEBEB;
			}

			#usersSelected{
				margin-bottom: 2px;
				width: 100%;
				display: block;
			}
		</style>
		<?php
		echo acymailing_getFunctionsEmailCheck();
		if(acymailing_isAdmin()){
			$values = array();
			$values[] = acymailing_selectOption('users', acymailing_translation('ACY_SUBSCRIBER'));
			$values[] = acymailing_selectOption('group', acymailing_translation('ACY_GROUP'));
			echo acymailing_select($values, 'test_selection', 'size="1" style="margin:0;" onchange="showOptions(this.value);"', 'value', 'text', $selection);
		}else{
			echo '<input class="inputbox" type="hidden" id="test_selection" name="test_selection" value="users" />';
		}
		?>
		<div id="userSelection" style="margin-top:5px;<?php if($selection == 'group') echo 'display:none;'; ?>">
			<input onkeypress="return myKeyPress(event, this.value);" style="width:212px;margin:0;" placeholder="<?php echo acymailing_translation('EMAIL_ADDRESS'); ?>..." type="text" id="message_receivers" onkeyup="timeoutAddNewTestAddress(this.value);" class="inputbox" autocomplete="off"/>
			<span id="usersSelected">
				<?php
				$allEmails = explode(',', $emails);
				foreach($allEmails as $oneEmail){
					echo '<span class="selectedUsers">'.htmlspecialchars($oneEmail, ENT_COMPAT, 'UTF-8').'<span class="removeUser" onclick="removeUser(this, \''.htmlspecialchars($oneEmail, ENT_COMPAT, 'UTF-8').'\');"></span></span>';
				}
				?>
			</span>

			<div id="acymailing_divSelectReceiver" style="display:none; overflow-y:scroll !important;">
				<div id="acymailing_receiversTable"></div>
			</div>
			<input class="inputbox" type="hidden" id="test_emails" name="test_emails" value="<?php echo htmlspecialchars($emails, ENT_COMPAT, 'UTF-8'); ?>"/>
		</div>
		<?php
		if(acymailing_isAdmin()){
			if(ACYMAILING_J16){
				$values = acymailing_getGroups();
			}else{
				$values = acymailing_loadObjectList('SELECT ug.id, ug.parent_id, ug.name AS text, COUNT(u.'.$this->cmsUserVars->id.') AS nbusers FROM #__core_acl_aro_groups AS ug LEFT JOIN '.acymailing_table($this->cmsUserVars->table, false).' u ON ug.id = u.gid GROUP BY ug.id');
			}
			$this->cats = array();
			if(!empty($values)){
				foreach($values as $oneCat){
					$this->cats[$oneCat->parent_id][] = $oneCat;
				}
			}
			$this->catvalues = array();
			$this->catvalues[] = acymailing_selectOption(-1, '- - -');
			$this->_handleChildren();
			echo '<div id="groupSelection" style="'.($selection != 'group' ? 'display:none;' : '').'margin-top:5px;">'.acymailing_select($this->catvalues, 'test_group', 'size="1"', 'value', 'text', $group).'</div>';
		}
	}

	private function _handleChildren($parent_id = 0, $level = 0){
		if(empty($this->cats[$parent_id])) return;
		foreach($this->cats[$parent_id] as $cat){
			$addValue = acymailing_selectOption($cat->id, str_repeat(" - - ", $level).$cat->text);
			if($cat->nbusers > 10 || $cat->nbusers == 0) $addValue->disable = true;
			$this->catvalues[] = $addValue;
			$this->_handleChildren($cat->id, $level + 1);
		}
	}
}
components/com_acymailing/types/detailstatsbounce.php000060400000002156152453623450017307 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class detailstatsbounceType extends acymailingClass{
	function display($map, $value){
		$query = 'SELECT DISTINCT bouncerule FROM '.acymailing_table('userstats').' WHERE bouncerule IS NOT NULL';
		$bouncerules = acymailing_loadObjectList($query);
		if(empty($bouncerules)) return '';
		$valueBounce = array();
		$valueBounce[] = acymailing_selectOption(0, acymailing_translation('ALL_RULES'));
		foreach($bouncerules as $oneRule){
			$found = preg_match('#^([A-Z0-9_]*) \[#Uis', $oneRule->bouncerule, $match);
			$text = $found ? str_replace($match[1], acymailing_translation($match[1]), $oneRule->bouncerule) : $oneRule->bouncerule;
			$valueBounce[] = acymailing_selectOption($oneRule->bouncerule, $text);
		}
		return acymailing_select($valueBounce, $map, 'class="inputbox" size="1" onchange="document.adminForm.submit( );"', 'value', 'text', $value);
	}
}


components/com_acymailing/types/jflanguages.php000060400000005576152453623450016071 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class jflanguagesType extends acymailingClass{
	var $onclick = '';
	var $id = 'jflang';
	var $jid = 'jlang';
	var $sef = false;
	var $multilingue = false;
	var $languages;
	var $found = false;

	function __construct(){
		parent::__construct();
		$this->values = array();

		$defines = ACYMAILING_ROOT.'components'.DS.'com_joomfish'.DS.'helpers'.DS.'defines.php';
		if(file_exists($defines) && ((ACYMAILING_J16 && file_exists(ACYMAILING_ROOT.'libraries'.DS.'joomfish'.DS.'manager.php')) || (!ACYMAILING_J16 && file_exists(ACYMAILING_ROOT.'administrator'.DS.'components'.DS.'com_joomfish'.DS.'classes'.DS.'JoomfishManager.class.php')))){
			include_once($defines);
			if(!ACYMAILING_J16){
				include_once(JOOMFISH_ADMINPATH.DS.'classes'.DS.'JoomfishManager.class.php');
			}else{
				include_once(ACYMAILING_ROOT.'libraries'.DS.'joomfish'.DS.'manager.php');
			}
			$jfManager = JoomFishManager::getInstance();
			$langActive = $jfManager->getActiveLanguages();
			$this->values[] = acymailing_selectOption('', acymailing_translation('DEFAULT_LANGUAGE'));
			foreach($langActive as $oneLanguage){
				$this->values[] = acymailing_selectOption($oneLanguage->shortcode.', '.$oneLanguage->id, $oneLanguage->name);
			}
			$this->found = true;
		}

		$defines = ACYMAILING_ROOT.'components'.DS.'com_falang'.DS.'helpers'.DS.'defines.php';
		if(empty($this->values) && file_exists($defines) && include_once($defines)){
			JLoader::register('FalangManager', FALANG_ADMINPATH.'/classes/FalangManager.class.php');
			$fManager = FalangManager::getInstance();
			$langActive = $fManager->getActiveLanguages();
			$this->values[] = acymailing_selectOption('', acymailing_translation('DEFAULT_LANGUAGE'));
			foreach($langActive as $oneLanguage){
				$this->values[] = acymailing_selectOption($oneLanguage->lang_code.', '.$oneLanguage->lang_id, $oneLanguage->title);
			}
			$this->found = true;
		}

		if(ACYMAILING_J16){
			$this->languages = acymailing_getLanguages(true);
			$this->multilingue = (count($this->languages) > 1);
		}
	}

	function display($map, $value = ''){
		if(empty($this->values)) return '';
		return acymailing_select($this->values, $map, 'size="1" style="max-width:150px" '.$this->onclick, 'value', 'text', $value, $this->id);
	}

	function displayJLanguages($map, $value = ''){
		if(!ACYMAILING_J16 || !$this->multilingue) return '';

		$default = new stdClass();
		$default->name = ' - - - ';
		$default->sef = '';
		$default->language = '';

		array_unshift($this->languages, $default);

		return acymailing_select($this->languages, $map, 'size="1" style="width:150px;" '.$this->onclick, $this->sef ? 'sef' : 'language', 'name', $value, $this->jid);
	}
}
components/com_acymailing/types/categoryfield.php000060400000004355152453623450016416 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class categoryfieldType extends acymailingClass{
	function display($table, $map, $previous){
		$allCats = acymailing_loadObjectList('SELECT DISTINCT category FROM `#__acymailing_'.$table.'` WHERE category NOT LIKE "" ORDER BY category');
		$possibleCats = array();
		$possibleCats[] = acymailing_selectOption('', '- - -');
		$possibleCats[] = acymailing_selectOption('-1', acymailing_translation('ACY_NEW_CATEGORY'));
		if(!empty($allCats)){
			$separator = acymailing_selectOption('-1', '-----------------------------------------');
			$separator->disable = true;
			$possibleCats[] = $separator;
			foreach($allCats as &$oneCat){
				$oneCat->category = htmlspecialchars($oneCat->category);
				$possibleCats[] = acymailing_selectOption($oneCat->category, $oneCat->category);
			}
		}

		$result = acymailing_select($possibleCats, $map, 'onchange="if(this.value == -1){document.getElementById(\'newcategory\').style.display = \'\';}else{document.getElementById(\'newcategory\').style.display = \'none\';}" size="1" style="width:208px;font-size:12px;"', 'value', 'text', htmlspecialchars($previous));
		$result .= '<input type="text" id="newcategory" name="newcategory" class="inputbox" style="display:none;width:200px;"/>';

		return $result;
	}

	function getFilter($table, $map, $previous, $js = ''){
		$allCats = acymailing_loadObjectList('SELECT DISTINCT category FROM '.acymailing_table($table).' WHERE category NOT LIKE "" ORDER BY category');
		$possibleCats = array();
		$possibleCats[] = acymailing_selectOption(0, acymailing_translation('ACY_ALL_CATEGORIES'));
		$catExists = empty($previous);
		if(!empty($allCats)){
			foreach($allCats as &$oneCat){
				$possibleCats[] = acymailing_selectOption($oneCat->category, $oneCat->category);
				if(!$catExists && $oneCat->category == $previous) $catExists = true;
			}
		}
		if(!$catExists) $possibleCats[] = acymailing_selectOption($previous, $previous);

		return acymailing_select($possibleCats, $map, 'size="1"'.$js, 'value', 'text', $previous);
	}
}
components/com_acymailing/types/unsub.php000060400000004306152453623450014725 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class unsubType extends acymailingClass{
	function __construct(){
		parent::__construct();
		$messages = acymailing_loadObjectList('SELECT `subject`, `mailid` FROM '.acymailing_table('mail').' WHERE `type`= \'unsub\'');

		$this->values = array();
		$this->values[] = acymailing_selectOption('0', acymailing_translation('NO_UNSUB_MESSAGE'));
		foreach($messages as $oneMessage){
			$this->values[] = acymailing_selectOption($oneMessage->mailid, '['.acymailing_translation('ACY_ID').' '.$oneMessage->mailid.'] '.$oneMessage->subject);
		}

		$js = "function changeMessage(idField,value){
			linkEdit = idField+'_edit';
			if(value>0){
				window.document.getElementById(linkEdit).onclick = function(){acymailing.openpopup('".acymailing_completeLink((acymailing_isAdmin() ? '' : 'front')."email&task=edit", true, true)."&mailid='+value, 800, 500);return false;};
				window.document.getElementById(linkEdit).style.display = 'inline';
			}else{
				window.document.getElementById(linkEdit).style.display = 'none';
			}
		}";
		acymailing_addScript(true, $js);

	}

	function display($value){
		$linkEdit = acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'email', true).'&amp;task=edit&amp;type=unsub&amp;mailid='.$value;
		$linkAdd = acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'email', true).'&amp;task=add&amp;type=unsub';
		$style = empty($value) ? 'style="display:none!important;"' : '';
		$text = acymailing_popup($linkEdit, '<img src="'.ACYMAILING_IMAGES.'icons/icon-16-edit.png" alt="'.acymailing_translation('EDIT_EMAIL',true).'"/>', '', 0, 500, 'unsub_edit', $style);
		$text .= acymailing_popup($linkAdd, '<img src="'.ACYMAILING_IMAGES.'icons/icon-16-add.png" alt="'.acymailing_translation('CREATE_EMAIL',true).'"/>', '', 0, 500, 'unsub_add');

		return acymailing_select($this->values, 'data[list][unsubmailid]', 'class="inputbox" size="1" onchange="changeMessage(\'unsub\',this.value);"', 'value', 'text', (int) $value ).$text;
	}
}
components/com_acymailing/types/listcreator.php000060400000002311152453623450016116 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.0.1
 * @author	acyba.com
 * @copyright	(C) 2009-2015 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */
defined('_JEXEC') or die('Restricted access');
?><?php

class listcreatorType{
	function listcreatorType(){

		$db = JFactory::getDBO();

		$db->setQuery('SELECT COUNT(*) as total,userid FROM #__acymailing_list WHERE `type` = "list" AND `userid` > 0 GROUP BY userid');
		$allusers = $db->loadObjectList('userid');

		$allnames = array();
		if(!empty($allusers)){
			$db->setQuery('SELECT name,id FROM #__users WHERE id IN ('.implode(',',array_keys($allusers)).') ORDER BY name ASC');
			$allnames = $db->loadObjectList('id');
		}

		$this->values = array();
		$this->values[] = JHTML::_('select.option', '0', JText::_('ALL_CREATORS') );
		foreach($allnames as $userid => $oneCreator){
			$this->values[] = JHTML::_('select.option', $userid, $oneCreator->name.' ( '.$allusers[$userid]->total.' )' );
		}
	}

	function display($map,$value){
		return JHTML::_('select.genericlist',   $this->values, $map, 'class="inputbox" size="1" onchange="document.adminForm.submit( );"', 'value', 'text', (int) $value );
	}
}
components/com_acymailing/types/contentorder.php000060400000002155152453623450016277 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	4.9.3
 * @author	acyba.com
 * @copyright	(C) 2009-2015 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */
defined('_JEXEC') or die('Restricted access');
?><?php

class contentorderType{
	var $onclick = 'updateTag();';
	function contentorderType(){
		$this->values = array();
		$this->values[] = JHTML::_('select.option', "|order:id,DESC",JText::_('ACY_ID'));
		$this->values[] = JHTML::_('select.option', "|order:ordering,ASC",JText::_('ACY_ORDERING'));
		$this->values[] = JHTML::_('select.option', "|order:created,DESC",JText::_('CREATED_DATE'));
		$this->values[] = JHTML::_('select.option', "|order:modified,DESC",JText::_('MODIFIED_DATE'));
		$this->values[] = JHTML::_('select.option', "|order:title,ASC",JText::_('FIELD_TITLE'));
		$this->values[] = JHTML::_('select.option', "|order:rand",JText::_('ACY_RANDOM'));
	}

	function display($map,$value){
		return JHTML::_('select.genericlist', $this->values, $map , 'size="1" style="width:150px;" onchange="'.$this->onclick.'"', 'value', 'text', (string) $value);
	}

}
components/com_acymailing/types/festatus.php000060400000001604152453623450015425 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class festatusType extends acymailingClass{
	function __construct(){
		parent::__construct();
		$this->values = array();
		$this->values[0] = acymailing_selectOption('-1', acymailing_translation('JOOMEXT_NO'));
		$this->values[1] = acymailing_selectOption('1', acymailing_translation('JOOMEXT_YES'));
		$this->values[0]->class = 'btn-danger';
		$this->values[1]->class = 'btn-success';
	}

	function display($map,$value){
		static $i = 0;
		$value = (int) $value;
		$value = ($value >= 1) ? 1 : -1;
		return acymailing_radio($this->values, $map , 'class="radiobox" size="1"', 'value', 'text', (int) $value,'status'.$i++);
	}

}
components/com_acymailing/types/filetree.php000060400000010360152453623450015365 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class filetreeType extends acymailingClass{
	public function display($folders, $currentFolder, $nameInput, $onclickCallBack){
		$tree = array();
		foreach($folders as $root => $children){
			$tree = array_merge($tree, $this->_searchChildren($children, $root));
		}
		echo '<div id="displaytree"><input style="margin:0; cursor:pointer; float: left; height: 20px;" disabled type="text" name="currentPath" id="currentPath" value="'.$currentFolder.'">';
		echo '<button style="margin:0; min-height: 24px;" class="btn"><i class="acyicon-tree"></i></button></div>';
		echo '<div style="display:none" class="tree" id="treefile">'.$this->_displayTree($tree, $currentFolder).'</div>';
		echo '<input type="hidden" name="'.$nameInput.'" id="'.$nameInput.'" value="'.$currentFolder.'">';
		$this->_treeBehavior($nameInput, $onclickCallBack);
	}

	private function _treeBehavior($idHiddenSelected, $onclickCallBack){
		$script = "
		var buttonDisplay = document.getElementById('displaytree');
		buttonDisplay.addEventListener('click', function(event){
			event.preventDefault();
			event.stopPropagation();
			var tree = document.getElementById('treefile');
			tree.style.display = (tree.style.display == 'block') ? 'none' : 'block';
		});

		var items = document.getElementsByClassName('tree-icon');
		for(var i = 0; i < items.length; i++) {
			var item = items[i];
			item.addEventListener('click', function(event) {
				event.preventDefault();
				event.stopPropagation();

				var input = document.getElementById('".$idHiddenSelected."');
				input.value = this.parentNode.dataset.path;

				if(this.parentNode.className.indexOf('tree-closed') != -1) {
					var foldericon = this.getElementsByClassName('acyicon-folder')[0];
					foldericon.className = foldericon.className.replace('acyicon-folder', 'acyicon-folderopen');
					this.parentNode.className = this.parentNode.className.replace('tree-closed', '');
				} else {
					var foldericon = this.getElementsByClassName('acyicon-folderopen')[0];
					foldericon.className = foldericon.className.replace('acyicon-folderopen', 'acyicon-folder');
					this.parentNode.className += ' tree-closed';
				}
			});
		}

		var links = document.getElementsByClassName('tree-child-title');
		for(var i = 0; i < links.length; i++) {
			var link = links[i];
			link.addEventListener('click', function(event) {
				event.preventDefault();
				event.stopPropagation();

				var path = this.parentNode.dataset.path;

				var input = document.getElementById('".$idHiddenSelected."');
				input.value = path;

				input = document.getElementById('currentPath');
				input.value = path;
				".$onclickCallBack."
			});
		}
		";

		echo '<script type="text/javascript">window.addEventListener("load", function() {'.$script.'})</script>';
	}

	private function _searchChildren($folders, $root){
		$tree = array();
		$tree[$root] = array();

		foreach($folders as $folder){
			$folder = trim(str_replace($root, '', $folder), '/\\');
			if(empty($folder)) continue;

			$pathParts = explode('/', $folder);
			$variable = &$tree[$root];
			foreach($pathParts as $pathPart){
				if(empty($variable[$pathPart])) $variable[$pathPart] = array();
				$variable = &$variable[$pathPart];
			}
		}
		return $tree;
	}

	private function _displayTree($tree, $pathValue, $path = ''){
		$results = '';
		$results .= '<ul>';
		foreach($tree as $key => $treeItem){
			$currentPath = (empty($path)) ? $key : $path.'/'.$key;
			if(strpos($pathValue, $currentPath) !== false){
				$extraClass = ($pathValue == $currentPath) ? 'tree-current' : '';
				$icon = 'acyicon-folderopen';
			}else{
				$extraClass = 'tree-closed';
				$icon = 'acyicon-folder';
			}

			if(empty($treeItem)){
				$extraClass .= ' tree-empty';
			}

			$subTree = $this->_displayTree($treeItem, $pathValue, $currentPath);
			$results .= '<li class="tree-child-item '.$extraClass.'" data-path="'.$currentPath.'"><span class="tree-icon"><i class="'.$icon.'"></i></span><span class="tree-child-title">'.$key.'</span>'.$subTree.'</li>';
		}
		$results .= '</ul>';

		return $results;
	}
}
components/com_acymailing/types/titlelink.php000060400000001434152453623450015567 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class titlelinkType extends acymailingClass{
	var $onclick="updateTag();";

	function __construct(){
		parent::__construct();
		$this->values = array();
		$this->values[] = acymailing_selectOption("|link", acymailing_translation('JOOMEXT_YES'));
		$this->values[] = acymailing_selectOption("", acymailing_translation('JOOMEXT_NO'));

	}

	function display($map,$value){
		if(empty($value)) $value = '';
		return acymailing_radio($this->values, $map , 'size="1" onclick="'.$this->onclick.'"', 'value', 'text', $value);
	}

}
components/com_acymailing/types/delaydisp.php000060400000001655152453623450015553 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class delaydispType extends acymailingClass{

	function display($value){

		if(empty($value)) return 0;

		$type = 'ACY_SECONDS';

		if($value >= 60  AND $value%60 == 0){
			$value = (int) $value / 60;
			$type = 'ACY_MINUTES';
			if($value >=60 AND $value%60 == 0){
				$type = 'HOURS';
				$value = $value/ 60;
				if($value >=24 AND $value%24 == 0){
					$type = 'DAYS';
					$value = $value / 24;
					if($value >= 30 AND $value%30 == 0){
						$type = 'MONTHS';
						$value = $value / 30;
					}elseif($value >=7 AND $value%7 == 0){
						$type = 'WEEKS';
						$value = $value / 7;
					}
				}
			}
		}

		return $value.' '.acymailing_translation($type);
	}

}
components/com_acymailing/types/queuemail.php000060400000002322152453623450015554 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class queuemailType extends acymailingClass{
	function __construct(){
		parent::__construct();
		$allmails = acymailing_loadObjectList('SELECT COUNT(*) as total, mailid FROM #__acymailing_queue GROUP BY mailid', 'mailid');

		$subjects = array();
		if(!empty($allmails)){
			$subjects = acymailing_loadObjectList('SELECT mailid,subject FROM #__acymailing_mail WHERE mailid IN ('.implode(',',array_keys($allmails)).') ORDER BY subject ASC', 'mailid');
		}

		$this->values = array();
		$this->values[] = acymailing_selectOption('0', acymailing_translation('ALL_EMAILS'));
		foreach($subjects as $mailid => $oneMail){
			$this->values[] = acymailing_selectOption($mailid, $oneMail->subject.' ( '.$allmails[$mailid]->total.' )' );
		}
	}

	function display($map,$value){
		return acymailing_select(  $this->values, $map, 'class="inputbox" style="max-width:600px;width:auto;" size="1" onchange="document.adminForm.submit( );"', 'value', 'text', (int) $value );
	}
}
components/com_acymailing/types/lists.php000060400000003453152453623450014731 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class listsType extends acymailingClass{
	function __construct(){
		parent::__construct();

		$listClass = acymailing_get('class.list');
		$this->data = $listClass->getLists('listid');
	}

	function display($map, $value, $js = true, $clickableCategories = false){
		if(empty($this->values)) $this->getValues($clickableCategories);
		$onchange = $js ? 'onchange="document.adminForm.limitstart.value=0;document.adminForm.submit();"' : '';
		return acymailing_select($this->values, $map, 'class="inputbox" style="max-width:220px" size="1" '.$onchange, 'value', 'text', $value, str_replace(array('[', ']'), array('_', ''), $map));
	}

	function getData(){
		return $this->data;
	}

	function getValues($clickableCategories = false){
		$allCats = array();
		foreach($this->data as $oneList){
			if(empty($oneList->category)) $oneList->category = acymailing_translation('ACY_NO_CATEGORY');
			$allCats[$oneList->category][] = $oneList->listid;
		}

		$this->values = array();
		$this->values[] = acymailing_selectOption('0', acymailing_translation('ALL_LISTS'));
		foreach($allCats as $name => $lists){
			if($clickableCategories){
				$this->values[] = acymailing_selectOption(implode(',', $lists).',', $name);
			}else{
				$this->values[] = acymailing_selectOption('<OPTGROUP>', $name);
			}

			foreach($lists as $listId){
				$this->values[] = acymailing_selectOption($listId, (count($allCats) > 1 ? ' - - ' : '').$this->data[$listId]->name);
			}

			if(!$clickableCategories) $msgType[] = acymailing_selectOption('</OPTGROUP>');
		}
		return $this->values;
	}
}
components/com_acymailing/types/uploadfile.php000060400000002675152453623450015724 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class uploadfileType extends acymailingClass{
	function display($picture, $map, $value, $mapdelete = ''){
		if(!$picture){
			$result = '<input type="hidden" name="'.$map.'[]" id="'.$map.$value.'" />';
			$result .= acymailing_popup(acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'file', true).'&task=select&id='.$map.$value, acymailing_translation('SELECT'), 'acyupload acymailing_button_grey', 850, 600);
			$result .= '<span id="'.$map.$value.'selection"></span>';
			return $result;
		}

		$result = '<input type="hidden" name="'.$mapdelete.'" id="'.$map.'" />';
		$result .= acymailing_popup(acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'file', true).'&task=select&id='.$map, acymailing_translation('SELECT'), 'acyupload acymailing_button_grey', 850, 600);

		if(empty($value)) $value = ACYMAILING_MEDIA_FOLDER.'/images/emptyimg.png';
		$result .= '<img id="'.$map.'preview" src="'.ACYMAILING_LIVE.$value.'" style="float:left;max-height:50px;margin-right:10px;" />
		<br /><input type="checkbox" name="'.$mapdelete.'" value="delete" id="delete'.$map.'" /> <label for="delete'.$map.'">'.acymailing_translation('DELETE_PICT').'</label>';

		return $result;
	}
}
components/com_acymailing/types/listsmail.php000060400000002533152453623450015572 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class listsmailType extends acymailingClass{
	var $type = 'news';

	function load(){
		$query = 'SELECT a.listid as listid,COUNT(a.mailid) as total FROM `#__acymailing_mail` as c';
		$query .= ' JOIN `#__acymailing_listmail` as a ON a.mailid = c.mailid';
		$query .= ' WHERE c.type = \''.$this->type.'\' GROUP BY a.listid';
		$alllists = acymailing_loadObjectList($query, 'listid');

		$allnames = array();
		if(!empty($alllists)){
			$allnames = acymailing_loadObjectList('SELECT name,listid FROM `#__acymailing_list` WHERE listid IN ('.implode(',',array_keys($alllists)).') ORDER BY ordering ASC', 'listid');
		}

		$this->values = array();
		$this->values[] = acymailing_selectOption('0', acymailing_translation('ALL_LISTS'));
		foreach($allnames as $listid => $oneName){
			$this->values[] = acymailing_selectOption($listid, $oneName->name.' ( '.$alllists[$listid]->total.' )' );
		}
	}

	function display($map,$value){
		$this->load();
		return acymailing_select(  $this->values, $map, 'class="inputbox" size="1" onchange="document.adminForm.submit( );"', 'value', 'text', (int) $value );
	}
}
components/com_acymailing/acymailing.xml000060400000005636152453623450014562 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.0" method="upgrade">
	<name>AcyMailing</name>
	<creationDate>March 2018</creationDate>
	<version>5.9.6</version>
	<level>starter</level>
	<author>Acyba</author>
	<authorEmail>dev@acyba.com</authorEmail>
	<authorUrl>http://www.acyba.com</authorUrl>
	<copyright>Copyright (C) 2009-2018 ACYBA SAS - All rights reserved.</copyright>
	<description>Manage your Mailing lists, Newsletters, e-mail marketing campaigns</description>
	<license>GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html</license>
	<languages folder="language">
		<language tag="en-GB">en-GB.com_acymailing.ini</language>
	</languages>
	<install>
		<sql>
			<file driver="mysql">tables.sql</file>
			<file driver="mysql" charset="utf8">tables.sql</file>
			<file driver="mysqli">tables.sql</file>
			<file driver="mysqli" charset="utf8">tables.sql</file>
		</sql>
	</install>
	<scriptfile>install.joomla.php</scriptfile>
	<files folder="front">
		<folder>controllers</folder>
		<folder>inc</folder>
		<folder>params</folder>
		<folder>sef_ext</folder>
		<folder>views</folder>
		<filename>acymailing.php</filename>
		<filename>index.html</filename>
		<filename>router.php</filename>
	</files>
	<media folder="media" destination="com_acymailing">
		<folder>css</folder>
		<folder>images</folder>
		<folder>js</folder>
		<folder>templates</folder>
		<filename>index.html</filename>
	</media>
	<administration>
		<files folder="back">
			<folder>classes</folder>
			<folder>controllers</folder>
			<folder>compat</folder>
			<folder>extensions</folder>
			<folder>helpers</folder>
			<folder>logs</folder>
			<folder>types</folder>
			<folder>views</folder>
			<filename>acymailing.php</filename>
			<filename>config.xml</filename>
			<filename>index.html</filename>
			<filename>tables.sql</filename>
		</files>
		<menu img="../media/com_acymailing/images/icons/icon-16-acymailing.png" link="option=com_acymailing">AcyMailing</menu>
		<submenu>
			<menu link="option=com_acymailing&amp;ctrl=subscriber" img="../media/com_acymailing/images/icons/icon-16-users.png">Users</menu>
			<menu link="option=com_acymailing&amp;ctrl=list" img="../media/com_acymailing/images/icons/icon-16-acylist.png">Lists</menu>
			<menu link="option=com_acymailing&amp;ctrl=newsletter" img="../media/com_acymailing/images/icons/icon-16-newsletter.png">Newsletters</menu>
			<menu link="option=com_acymailing&amp;ctrl=template" img="../media/com_acymailing/images/icons/icon-16-acytemplate.png">Templates</menu>
			<menu link="option=com_acymailing&amp;ctrl=queue" img="../media/com_acymailing/images/icons/icon-16-process.png">Queue</menu>
			<menu link="option=com_acymailing&amp;ctrl=stats" img="../media/com_acymailing/images/icons/icon-16-stats.png">Statistics</menu>
			<menu link="option=com_acymailing&amp;ctrl=cpanel" img="../media/com_acymailing/images/icons/icon-16-acyconfig.png">Configuration</menu>
		</submenu>
	</administration>
</extension>
components/com_acymailing/acymailing.php000060400000007722152453623450014547 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
if(version_compare(PHP_VERSION, '5.3.0', '<')){
	echo '<p style="color:red">This version of AcyMailing requires at least PHP 5.3.0, it is time to upgrade the PHP version of your server!</p>';
	exit;
}

if(!include_once(rtrim(JPATH_ADMINISTRATOR, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.'components'.DIRECTORY_SEPARATOR.'com_acymailing'.DIRECTORY_SEPARATOR.'helpers'.DIRECTORY_SEPARATOR.'helper.php')){
	echo "Could not load Acy helper file";
	return;
}

if(acymailing_isDebug()) acymailing_displayErrors();

$taskGroup = acymailing_getVar('cmd', 'ctrl', acymailing_getVar('cmd', 'gtask', 'dashboard'));
if($taskGroup == 'config') $taskGroup = 'cpanel';

$config = acymailing_config();

acymailing_addStyle(false, ACYMAILING_CSS.'backend_default.css?v='.filemtime(ACYMAILING_MEDIA.'css'.DS.'backend_default.css'));
$cssBackend = $config->get('css_backend');
if($cssBackend == 'custom' && file_exists(ACYMAILING_MEDIA.'css'.DS.'backend_custom.css')) acymailing_addStyle(false, ACYMAILING_CSS.'backend_custom.css?v='.filemtime(ACYMAILING_MEDIA.'css'.DS.'backend_custom.css'));
if(ACYMAILING_J30 && !ACYMAILING_J40) acymailing_addStyle(true, '.header{ display: none; }');

acymailing_addScript(false, ACYMAILING_JS.'acymailing.js?v='.filemtime(ACYMAILING_MEDIA.'js'.DS.'acymailing.js'));

if(ACYMAILING_J16 && file_exists(ACYMAILING_ROOT.'media'.DS.'system'.DS.'js'.DS.'core.js')){
	$url = rtrim(acymailing_rootURI(), '/').'/media/system/js/core.js?v='.filemtime(ACYMAILING_ROOT.'media'.DS.'system'.DS.'js'.DS.'core.js');
	$js = 'document.addEventListener("DOMContentLoaded", function(){
		if(typeof Joomla == "undefined" && typeof window.Joomla == "undefined"){
			var script = document.createElement("script");
			script.type = "text/javascript";
			script.src = "'.$url.'";
			document.head.appendChild(script);
		}
	});';
	acymailing_addScript(true, $js);
}

if($taskGroup != 'update' && !$config->get('installcomplete')){
	$url = acymailing_completeLink('update&task=install', false, true);
	echo "<script>document.location.href='".$url."';</script>\n";
	echo 'Install not finished... You will be redirected to the second part of the install screen<br />';
	echo '<a href="'.$url.'">Please click here if you are not automatically redirected within 3 seconds</a>';
	return;
}


$action = acymailing_getVar('cmd', 'task', 'listing');
if(empty($action)){
	$action = acymailing_getVar('cmd', 'defaulttask', 'listing');
	acymailing_setVar('task', $action);
}

$menuDisplayed = false;
if(!ACYMAILING_J40
   && !($taskGroup == 'send' && $action == 'send')
   && $taskGroup !== 'toggle'
   && !acymailing_isNoTemplate()
   && !in_array($action, array('doexport', 'continuesend', 'load'))
   && !in_array($taskGroup, array('editor'))){

	$menuHelper = acymailing_get('helper.acymenu');
	echo '<div id="acyallcontent" class="acyallcontent">';
	echo $menuHelper->display($taskGroup);

	echo '<div id="acymainarea" class="acymaincontent_'.$taskGroup.'">';
	$menuDisplayed = true;
}

if($taskGroup != 'update' && ACYMAILING_J16 && !acymailing_authorised('core.manage', 'com_acymailing')){
	acymailing_display(acymailing_translation('JERROR_ALERTNOAUTHOR'), 'error');
	return;
}
if(($taskGroup == 'cpanel' || ($taskGroup == 'update' && $action == 'listing')) && ACYMAILING_J16 && !acymailing_authorised('core.admin', 'com_acymailing')){
	acymailing_display(acymailing_translation('JERROR_ALERTNOAUTHOR'), 'error');
	return;
}

if(!include_once(ACYMAILING_CONTROLLER.$taskGroup.'.php')){
	acymailing_redirect(acymailing_completeLink('dashboard'));
	return;
}
$className = ucfirst($taskGroup).'Controller';
$classGroup = new $className();

acymailing_setVar('view', $classGroup->getName());
$classGroup->execute($action);

$classGroup->redirect();

if($menuDisplayed){
	echo '</div></div>';
}
components/com_acymailing/config.xml000060400000001005152453623450013674 0ustar00<?xml version="1.0" encoding="utf-8" ?>
<config>
	<fieldset name="permissions" label="JCONFIG_PERMISSIONS_LABEL" description="JCONFIG_PERMISSIONS_DESC">
		<field name="rules" type="rules" label="JCONFIG_PERMISSIONS_LABEL" filter="rules" component="com_acymailing" section="component">
			<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
			<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		</field>
	</fieldset>
</config>

components/com_acymailing/tables.sql000060400000033343152453623450013712 0ustar00CREATE TABLE IF NOT EXISTS `#__acymailing_config` (
	`namekey` varchar(200) NOT NULL,
	`value` text,
	PRIMARY KEY (`namekey`)
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;

CREATE TABLE IF NOT EXISTS `#__acymailing_fields` (
	`fieldid` smallint unsigned NOT NULL AUTO_INCREMENT,
	`fieldname` varchar(250) NOT NULL,
	`namekey` varchar(50) NOT NULL,
	`type` varchar(50) DEFAULT NULL,
	`value` text NOT NULL,
	`published` tinyint unsigned NOT NULL DEFAULT '1',
	`ordering` smallint unsigned DEFAULT '99',
	`options` text,
	`core` tinyint unsigned NOT NULL DEFAULT '0',
	`required` tinyint unsigned NOT NULL DEFAULT '0',
	`backend` tinyint unsigned NOT NULL DEFAULT '1',
	`frontcomp` tinyint unsigned NOT NULL DEFAULT '0',
	`frontform` tinyint unsigned NOT NULL DEFAULT '1',
	`default` longtext DEFAULT NULL,
	`listing` tinyint unsigned DEFAULT NULL,
	`frontlisting` tinyint unsigned NOT NULL DEFAULT '0',
	`frontjoomlaprofile` tinyint unsigned NOT NULL DEFAULT '0',
	`frontjoomlaregistration` tinyint unsigned NOT NULL DEFAULT '0',
	`joomlaprofile` tinyint unsigned NOT NULL DEFAULT '0',
	`access` varchar(250) NOT NULL DEFAULT 'all',
	`fieldcat` int(11) NOT NULL DEFAULT '0',
	`listingfilter` tinyint unsigned NOT NULL DEFAULT '0',
	`frontlistingfilter` tinyint unsigned NOT NULL DEFAULT '0',
	PRIMARY KEY (`fieldid`),
	UNIQUE KEY `namekey` (`namekey`),
	KEY `orderingindex` (`published`,`ordering`)
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;

CREATE TABLE IF NOT EXISTS `#__acymailing_filter` (
	`filid` mediumint unsigned NOT NULL AUTO_INCREMENT,
	`name` varchar(250) DEFAULT NULL,
	`description` text,
	`published` tinyint unsigned DEFAULT NULL,
	`lasttime` int unsigned DEFAULT NULL,
	`trigger` text,
	`report` text,
	`action` text,
	`filter` text,
	`daycron` int unsigned,
	PRIMARY KEY (`filid`)
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;

CREATE TABLE IF NOT EXISTS `#__acymailing_history` (
	`subid` int unsigned NOT NULL,
	`date` int unsigned NOT NULL,
	`ip` varchar(50) DEFAULT NULL,
	`action` varchar(50) NOT NULL COMMENT 'different actions: created,modified,confirmed',
	`data` text,
	`source` text,
	`mailid` mediumint unsigned DEFAULT NULL,
	PRIMARY KEY `subid` (`subid`,`date`),
	KEY `dateindex` (`date`),
	KEY `actionindex` (`action`,`mailid`)
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;

CREATE TABLE IF NOT EXISTS `#__acymailing_list` (
	`name` varchar(250) NOT NULL,
	`description` text,
	`ordering` smallint unsigned NULL DEFAULT '0',
	`listid` smallint unsigned NOT NULL AUTO_INCREMENT,
	`published` tinyint DEFAULT NULL,
	`userid` int unsigned DEFAULT NULL,
	`alias` varchar(250) DEFAULT NULL,
	`color` varchar(30) DEFAULT NULL,
	`visible` tinyint NOT NULL DEFAULT '1',
	`welmailid` mediumint DEFAULT NULL,
	`unsubmailid` mediumint DEFAULT NULL,
	`type` enum('list','campaign') NOT NULL DEFAULT 'list',
	`access_sub` varchar(250) NOT NULL DEFAULT 'all',
	`access_manage` varchar(250) NOT NULL DEFAULT 'none',
	`languages` varchar(250) NOT NULL DEFAULT 'all',
	`startrule` varchar(50) NOT NULL DEFAULT '0',
	`category` varchar(250) NOT NULL DEFAULT '',
	PRIMARY KEY (`listid`),
	KEY `typeorderingindex` (`type`,`ordering`),
	KEY `useridindex` (`userid`),
	KEY `typeuseridindex` (`type`,`userid`)
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;

CREATE TABLE IF NOT EXISTS `#__acymailing_listcampaign` (
	`campaignid` smallint unsigned NOT NULL,
	`listid` smallint unsigned NOT NULL,
	PRIMARY KEY (`campaignid`,`listid`)
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;

CREATE TABLE IF NOT EXISTS `#__acymailing_listmail` (
	`listid` smallint unsigned NOT NULL,
	`mailid` mediumint unsigned NOT NULL,
	PRIMARY KEY (`listid`,`mailid`)
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;

CREATE TABLE IF NOT EXISTS `#__acymailing_listsub` (
	`listid` smallint unsigned NOT NULL,
	`subid` int unsigned NOT NULL,
	`subdate` int unsigned DEFAULT NULL,
	`unsubdate` int unsigned DEFAULT NULL,
	`status` tinyint NOT NULL,
	PRIMARY KEY (`listid`,`subid`),
	KEY `subidindex` (`subid`),
	KEY `listidstatusindex` (`listid`,`status`)
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;

CREATE TABLE IF NOT EXISTS `#__acymailing_mail` (
	`mailid` mediumint unsigned NOT NULL AUTO_INCREMENT,
	`subject` varchar(250) NOT NULL,
	`body` longtext NOT NULL,
	`altbody` longtext NOT NULL,
	`published` tinyint DEFAULT '1',
	`senddate` int unsigned DEFAULT NULL,
	`created` int unsigned DEFAULT NULL,
	`lastupdate` int unsigned DEFAULT NULL,
	`userlastupdate` int unsigned DEFAULT NULL,
	`fromname` varchar(250) DEFAULT NULL,
	`fromemail` varchar(250) DEFAULT NULL,
	`replyname` varchar(250) DEFAULT NULL,
	`replyemail` varchar(250) DEFAULT NULL,
	`bccaddresses` varchar(250) DEFAULT NULL,
	`type` enum('news','autonews','followup','unsub','welcome','notification','joomlanotification','action', 'article') NOT NULL DEFAULT 'news',
	`visible` tinyint NOT NULL DEFAULT '1',
	`userid` int unsigned DEFAULT NULL,
	`alias` varchar(250) DEFAULT NULL,
	`attach` text,
	`favicon` text,
	`html` tinyint NOT NULL DEFAULT '1',
	`tempid` smallint NOT NULL DEFAULT '0',
	`key` varchar(200) DEFAULT NULL,
	`frequency` varchar(50) DEFAULT NULL,
	`params` text,
	`sentby` int unsigned DEFAULT NULL,
	`metakey` text,
	`metadesc` text,
	`filter` text,
	`language` varchar(50) NOT NULL DEFAULT '',
	`abtesting` varchar(250) DEFAULT NULL,
	`thumb` varchar(250) DEFAULT NULL,
	`summary` text NOT NULL,
	PRIMARY KEY (`mailid`),
	KEY `senddate` (`senddate`),
	KEY `typemailidindex` (`type`,`mailid`),
	KEY `useridindex` (`userid`)
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;

CREATE TABLE IF NOT EXISTS `#__acymailing_queue` (
	`senddate` int unsigned NOT NULL,
	`subid` int unsigned NOT NULL,
	`mailid` mediumint unsigned NOT NULL,
	`priority` tinyint unsigned DEFAULT '3',
	`try` tinyint unsigned NOT NULL DEFAULT '0',
	`paramqueue` varchar(250) DEFAULT NULL,
	PRIMARY KEY (`subid`,`mailid`),
	KEY `listingindex` (`senddate`,`subid`),
	KEY `mailidindex` (`mailid`),
	KEY `orderingindex` (`priority`,`senddate`,`subid`)
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;

CREATE TABLE IF NOT EXISTS `#__acymailing_rules` (
	`ruleid` smallint unsigned NOT NULL AUTO_INCREMENT,
	`name` varchar(250) NOT NULL,
	`ordering` smallint DEFAULT NULL,
	`regex` text NOT NULL,
	`executed_on` text NOT NULL,
	`action_message` text NOT NULL,
	`action_user` text NOT NULL,
	`published` tinyint unsigned NOT NULL,
	PRIMARY KEY (`ruleid`),
	KEY `ordering` (`published`,`ordering`)
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;

CREATE TABLE IF NOT EXISTS `#__acymailing_stats` (
	`mailid` mediumint unsigned NOT NULL,
	`senthtml` int unsigned NOT NULL DEFAULT '0',
	`senttext` int unsigned NOT NULL DEFAULT '0',
	`senddate` int unsigned NOT NULL,
	`openunique` mediumint unsigned NOT NULL DEFAULT '0',
	`opentotal` int unsigned NOT NULL DEFAULT '0',
	`bounceunique` mediumint unsigned NOT NULL DEFAULT '0',
	`fail` mediumint unsigned NOT NULL DEFAULT '0',
	`clicktotal` int unsigned NOT NULL DEFAULT '0',
	`clickunique` mediumint unsigned NOT NULL DEFAULT '0',
	`unsub` mediumint unsigned NOT NULL DEFAULT '0',
	`forward` mediumint unsigned NOT NULL DEFAULT '0',
	`bouncedetails` text,
	PRIMARY KEY (`mailid`),
	KEY `senddateindex` (`senddate`)
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;

CREATE TABLE IF NOT EXISTS `#__acymailing_subscriber` (
	`subid` int unsigned NOT NULL AUTO_INCREMENT,
	`email` varchar(200) NOT NULL,
	`userid` int unsigned NOT NULL DEFAULT '0',
	`name` varchar(250) NOT NULL DEFAULT '',
	`created` int unsigned DEFAULT NULL,
	`confirmed` tinyint NOT NULL DEFAULT '0',
	`enabled` tinyint NOT NULL DEFAULT '1',
	`accept` tinyint NOT NULL DEFAULT '1',
	`ip` varchar(100) DEFAULT NULL,
	`html` tinyint NOT NULL DEFAULT '1',
	`key` varchar(250) DEFAULT NULL,
	`confirmed_date` int unsigned NOT NULL DEFAULT '0',
	`confirmed_ip` varchar(100) DEFAULT NULL,
	`lastopen_date` int unsigned NOT NULL DEFAULT '0',
	`lastopen_ip` varchar(100) DEFAULT NULL,
	`lastclick_date` int unsigned NOT NULL DEFAULT '0',
	`lastsent_date` int unsigned NOT NULL DEFAULT '0',
	`source` varchar(250) NOT NULL DEFAULT '',
	`filterflags` varchar(50) NOT NULL DEFAULT '',
	PRIMARY KEY (`subid`),
	UNIQUE KEY `email` (`email`),
	KEY `userid` (`userid`),
	KEY `queueindex` (`enabled`,`accept`,`confirmed`)
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;

CREATE TABLE IF NOT EXISTS `#__acymailing_template` (
	`tempid` smallint unsigned NOT NULL AUTO_INCREMENT,
	`name` varchar(250) DEFAULT NULL,
	`description` text,
	`body` longtext,
	`altbody` longtext,
	`header` longtext,
	`created` int unsigned DEFAULT NULL,
	`published` tinyint NOT NULL DEFAULT '1',
	`premium` tinyint NOT NULL DEFAULT '0',
	`ordering` smallint unsigned NULL DEFAULT '0',
	`namekey` varchar(50) NOT NULL,
	`styles` text,
	`subject` varchar(250) DEFAULT NULL,
	`stylesheet` text,
	`fromname` varchar(250) DEFAULT NULL,
	`fromemail` varchar(250) DEFAULT NULL,
	`replyname` varchar(250) DEFAULT NULL,
	`replyemail` varchar(250) DEFAULT NULL,
	`thumb` varchar(250) DEFAULT NULL,
	`readmore` varchar(250) DEFAULT NULL,
	`access` varchar(250) NOT NULL DEFAULT 'all',
	`category` varchar(250) NOT NULL DEFAULT '',
	PRIMARY KEY (`tempid`),
	UNIQUE KEY `namekey` (`namekey`),
	KEY `orderingindex` (`ordering`)
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;

CREATE TABLE IF NOT EXISTS `#__acymailing_url` (
	`urlid` int unsigned NOT NULL AUTO_INCREMENT,
	`name` varchar(250) NOT NULL,
	`url` text NOT NULL,
	PRIMARY KEY (`urlid`),
	KEY `url` (`url`(250))
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;

CREATE TABLE IF NOT EXISTS `#__acymailing_urlclick` (
	`urlid` int unsigned NOT NULL,
	`mailid` mediumint unsigned NOT NULL,
	`click` smallint unsigned NOT NULL DEFAULT '0',
	`subid` int unsigned NOT NULL,
	`date` int unsigned NOT NULL,
	`ip` varchar(100) DEFAULT NULL,
	PRIMARY KEY (`urlid`,`mailid`,`subid`),
	KEY `dateindex` (`date`),
	KEY `mailidindex` (`mailid`),
	KEY `subidindex` (`subid`)
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;

CREATE TABLE IF NOT EXISTS `#__acymailing_userstats` (
	`mailid` mediumint unsigned NOT NULL,
	`subid` int unsigned NOT NULL,
	`html` tinyint unsigned NOT NULL DEFAULT '1',
	`sent` tinyint unsigned NOT NULL DEFAULT '1',
	`senddate` int unsigned NOT NULL,
	`open` tinyint unsigned NOT NULL DEFAULT '0',
	`opendate` int NOT NULL,
	`bounce` tinyint NOT NULL DEFAULT '0',
	`fail` tinyint NOT NULL DEFAULT '0',
	`ip` varchar(100) DEFAULT NULL,
	`browser` varchar(255) DEFAULT NULL,
	`browser_version` tinyint unsigned DEFAULT NULL,
	`is_mobile` tinyint unsigned DEFAULT NULL,
	`mobile_os` varchar(255) DEFAULT NULL,
	`user_agent` varchar(255) DEFAULT NULL,
	`bouncerule` varchar(255) DEFAULT NULL,
	PRIMARY KEY (`mailid`,`subid`),
	KEY `senddateindex` (`senddate`),
	KEY `subidindex` (`subid`)
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;

CREATE TABLE IF NOT EXISTS `#__acymailing_geolocation` (
	`geolocation_id` int unsigned NOT NULL AUTO_INCREMENT,
	`geolocation_subid` int unsigned NOT NULL DEFAULT '0',
	`geolocation_type` varchar(255) NOT NULL DEFAULT 'subscription',
	`geolocation_ip` varchar(255) NOT NULL DEFAULT '',
	`geolocation_created` int unsigned NOT NULL DEFAULT '0',
	`geolocation_latitude` decimal(9,6) NOT NULL DEFAULT '0.000000',
	`geolocation_longitude` decimal(9,6) NOT NULL DEFAULT '0.000000',
	`geolocation_postal_code` varchar(255) NOT NULL DEFAULT '',
	`geolocation_country` varchar(255) NOT NULL DEFAULT '',
	`geolocation_country_code` varchar(255) NOT NULL DEFAULT '',
	`geolocation_state` varchar(255) NOT NULL DEFAULT '',
	`geolocation_state_code` varchar(255) NOT NULL DEFAULT '',
	`geolocation_city` varchar(255) NOT NULL DEFAULT '',
	`geolocation_continent` varchar(255) NOT NULL DEFAULT '',
	`geolocation_timezone` varchar(255) NOT NULL DEFAULT '',
	PRIMARY KEY (`geolocation_id`),
	KEY `geolocation_type` (`geolocation_subid`, `geolocation_type`),
	KEY `geolocation_ip_created` (`geolocation_ip`, `geolocation_created`)
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;

CREATE TABLE IF NOT EXISTS `#__acymailing_action` (
	`action_id` int unsigned NOT NULL AUTO_INCREMENT,
	`name` varchar(255) DEFAULT NULL,
	`frequency` int unsigned NOT NULL,
	`nextdate` int unsigned NOT NULL,
	`description` text,
	`server` varchar(255) NOT NULL,
	`port` varchar(50) NOT NULL,
	`connection_method` varchar(10) NOT NULL DEFAULT '0',
	`secure_method` varchar(10) NOT NULL DEFAULT '0',
	`self_signed` tinyint NOT NULL DEFAULT '0',
	`username` varchar(255) NOT NULL,
	`password` varchar(50) NOT NULL,
	`userid` int unsigned DEFAULT NULL,
	`conditions` text,
	`actions` text,
	`report` text,
	`delete_wrong_emails` tinyint NOT NULL DEFAULT 0,
	`senderfrom` tinyint NOT NULL DEFAULT 0,
	`senderto` tinyint NOT NULL DEFAULT 0,
	`published` tinyint NOT NULL DEFAULT '0',
	`ordering` smallint unsigned NULL DEFAULT '0',
	PRIMARY KEY (`action_id`)
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;

CREATE TABLE IF NOT EXISTS `#__acymailing_forward` (
	`subid` int unsigned NOT NULL,
	`mailid` mediumint unsigned NOT NULL,
	`date` int unsigned NOT NULL,
	`ip` varchar(50) DEFAULT NULL,
	`nbforwarded` int unsigned NOT NULL,
	PRIMARY KEY (`subid`,`mailid`)
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;

CREATE TABLE IF NOT EXISTS `#__acymailing_tag` (
	`tagid` smallint unsigned NOT NULL AUTO_INCREMENT,
	`name` varchar(250) NOT NULL,
	`userid` int unsigned DEFAULT NULL,
	PRIMARY KEY (`tagid`),
	KEY `useridindex` (`userid`)
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;

CREATE TABLE IF NOT EXISTS `#__acymailing_tagmail` (
	`tagid` smallint unsigned NOT NULL,
	`mailid` mediumint unsigned NOT NULL,
	PRIMARY KEY (`tagid`,`mailid`)
) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;components/com_acymailing/compat/compat1.php000060400000001746152453623450015261 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.7.0
 * @author	acyba.com
 * @copyright	(C) 2009-2017 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */
defined('_JEXEC') or die('Restricted access');
?><?php
jimport( 'joomla.html.parameter' );

class acymailingView extends JView{

}

class acymailingControllerCompat extends JController{

}

function acymailing_loadResultArray(&$db){
	return $db->loadResultArray();
}

function acymailing_loadMootools($loadMootoolsMoreLib = false){
	JHTML::_('behavior.mootools');
}

function acymailing_getColumns($table){
	$db = JFactory::getDBO();
	$allfields = $db->getTableFields($table);
	return reset($allfields);
}

function acymailing_getEscaped($value, $extra = false) {
	$db = JFactory::getDBO();
	return $db->getEscaped($value, $extra);
}

function acymailing_getFormToken() {
	return JUtility::getToken();
}

if(!class_exists('acyParameter')){
	class acyParameter extends JParameter{}
}
components/com_acymailing/compat/index.html000060400000000054152453623450015170 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/compat/joomla.php000060400000065742152453623450015204 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

define('ACYMAILING_CMS', 'Joomla!®');
define('ACYMAILING_COMPONENT', 'com_acymailing');
define('ACYMAILING_DEFAULT_LANGUAGE', 'en-GB');

define('ACYMAILING_BASE', rtrim(JPATH_BASE, DS).DS);
define('ACYMAILING_ROOT', rtrim(JPATH_ROOT, DS).DS);
define('ACYMAILING_FRONT', rtrim(JPATH_SITE, DS).DS.'components'.DS.ACYMAILING_COMPONENT.DS);
define('ACYMAILING_BACK', rtrim(JPATH_ADMINISTRATOR, DS).DS.'components'.DS.ACYMAILING_COMPONENT.DS);
define('ACYMAILING_HELPER', ACYMAILING_BACK.'helpers'.DS);
define('ACYMAILING_CLASS', ACYMAILING_BACK.'classes'.DS);
define('ACYMAILING_TYPE', ACYMAILING_BACK.'types'.DS);
define('ACYMAILING_CONTROLLER', ACYMAILING_BACK.'controllers'.DS);
define('ACYMAILING_CONTROLLER_FRONT', ACYMAILING_FRONT.'controllers'.DS);
define('ACYMAILING_MEDIA', ACYMAILING_ROOT.'media'.DS.ACYMAILING_COMPONENT.DS);
define('ACYMAILING_TEMPLATE', ACYMAILING_MEDIA.'templates'.DS);
define('ACYMAILING_LANGUAGE', ACYMAILING_ROOT.'language'.DS);
define('ACYMAILING_INC', ACYMAILING_FRONT.'inc'.DS);

define('ACYMAILING_MEDIA_URL', acymailing_rootURI().'/media/'.ACYMAILING_COMPONENT.'/');
define('ACYMAILING_IMAGES', ACYMAILING_MEDIA_URL.'images/');
define('ACYMAILING_CSS', ACYMAILING_MEDIA_URL.'css/');
define('ACYMAILING_JS', ACYMAILING_MEDIA_URL.'js/');

define('ACYMAILING_MEDIA_FOLDER', 'media/com_acymailing');

$jversion = preg_replace('#[^0-9\.]#i', '', JVERSION);
define('ACYMAILING_J16', version_compare($jversion, '1.6.0', '>='));
define('ACYMAILING_J25', version_compare($jversion, '2.5.0', '>='));
define('ACYMAILING_J30', version_compare($jversion, '3.0.0', '>='));
define('ACYMAILING_J40', version_compare($jversion, '4.0.0', '>='));

define('ACY_ALLOWRAW', defined('JREQUEST_ALLOWRAW') ? JREQUEST_ALLOWRAW : 2);
define('ACY_ALLOWHTML', defined('JREQUEST_ALLOWHTML') ? JREQUEST_ALLOWHTML : 4);

function acymailing_loadEditor(){
    include_once(rtrim(dirname(__DIR__), DS).DS.'compat'.DS.'joomla.editor.php');
}

function acymailing_getTime($date){
    static $timeoffset = null;
    if($timeoffset === null){
        $timeoffset = acymailing_getCMSConfig('offset');

        if(ACYMAILING_J16){
            $dateC = JFactory::getDate($date, $timeoffset);
            $timeoffset = $dateC->getOffsetFromGMT(true);
        }
    }

    return strtotime($date) - $timeoffset * 60 * 60 + date('Z');
}

function acymailing_fileGetContent($url, $timeout = 10){
    ob_start();
    $data = '';
    if(class_exists('JHttpFactory') && method_exists('JHttpFactory', 'getHttp')) {
        $http = JHttpFactory::getHttp();
        try {
            $response = $http->get($url, array(), $timeout);
        } catch (RuntimeException $e) {
            $response = null;
        }

        if ($response !== null && $response->code === 200) $data = $response->body;
    }

    if(empty($data) && function_exists('curl_exec') && filter_var($url, FILTER_VALIDATE_URL)){
        $conn = curl_init($url);
        curl_setopt($conn, CURLOPT_SSL_VERIFYPEER, true);
        curl_setopt($conn, CURLOPT_FRESH_CONNECT, true);
        curl_setopt($conn, CURLOPT_RETURNTRANSFER, 1);
        if(!empty($timeout)){
            curl_setopt($conn, CURLOPT_TIMEOUT, $timeout);
            curl_setopt($conn, CURLOPT_CONNECTTIMEOUT, $timeout);
        }

        $data = curl_exec($conn);
        if($data === false) echo curl_error($conn);
        curl_close($conn);
    }

    if(empty($data) && function_exists('file_get_contents')){
        if(!empty($timeout)){
            ini_set('default_socket_timeout', $timeout);
        }
        $streamContext = stream_context_create(array('ssl' => array('verify_peer' => false, 'verify_peer_name' => false)));
        $data = file_get_contents($url, false, $streamContext);
    }

    if(empty($data) && function_exists('fopen') && function_exists('stream_get_contents')){
        $handle = fopen($url, "r");
        if(!empty($timeout)){
            stream_set_timeout($handle, $timeout);
        }
        $data = stream_get_contents($handle);
    }
    $warnings = ob_get_clean();

    if(acymailing_isDebug()) echo $warnings;

    return $data;
}

function acymailing_formToken(){
    return JHTML::_('form.token');
}

function acymailing_checkToken(){
    if(ACYMAILING_J40){
        \JSession::checkToken() or die('Invalid Token');;
    }else{
        if(!JRequest::checkToken() && !JRequest::checkToken('get')){
            if(!ACYMAILING_J16) die('Invalid Token');
            JSession::checkToken() || JSession::checkToken('get') || die('Invalid Token');
        }
    }
}

function acymailing_getFormToken() {
    if(ACYMAILING_J30) return JSession::getFormToken().'=1';
    return JUtility::getToken().'=1';
}

function acymailing_translation($key, $jsSafe = false, $interpretBackSlashes = true){
    return JText::_($key, $jsSafe, $interpretBackSlashes);
}

function acymailing_translation_sprintf(){
    $args = func_get_args();
    $return = "return JText::sprintf('".array_shift($args)."'";
    foreach($args as $oneArg){
        $return .= ",'".str_replace("'", "\\'", $oneArg)."'";
    }
    $return .= ');';
    return eval($return);
}

function acymailing_route($url, $xhtml = true, $ssl = null){
    return JRoute::_($url, $xhtml, $ssl);
}

function acymailing_getVar($type, $name, $default = null, $hash = 'default', $mask = 0){
    if(ACYMAILING_J40){
        if($mask & ACY_ALLOWRAW) $type = 'RAW';
        elseif($mask & ACY_ALLOWHTML) $type = 'HTML';

        return JFactory::getApplication()->input->get($name, $default, $type);
    }
    return JRequest::getVar($name, $default, $hash, $type, $mask);
}

function acymailing_setVar($name, $value = null, $hash = 'method', $overwrite = true){
    if(ACYMAILING_J40) return JFactory::getApplication()->input->set($name, $value);
    return JRequest::setVar($name, $value, $hash, $overwrite);
}

function acymailing_raiseError($level, $code, $msg, $info = null){
    return JError::raise($level, $code, $msg, $info);
}

function acymailing_getGroupsByUser($userid = null, $recursive = null){
    if(ACYMAILING_J16){
        if($userid === null){
            $userid = acymailing_currentUserId();
            $recursive = true;
        }

        jimport('joomla.access.access');
        return JAccess::getGroupsByUser($userid, $recursive);
    }

    $my = JFactory::getUser($userid);
    return array($my->gid);
}

function acymailing_getGroups(){
    $groups = acymailing_loadObjectList('SELECT a.*, a.title as text, a.id as value, COUNT(ugm.user_id) AS nbusers FROM #__usergroups AS a LEFT JOIN #__user_usergroup_map ugm ON a.id = ugm.group_id GROUP BY a.id', 'id');
    return $groups;
}

function acymailing_getLanguages($installed = false){
    $result = array();

    $path = acymailing_getLanguagePath(ACYMAILING_ROOT);
    $dirs = acymailing_getFolders($path);

    $languages = acymailing_loadObjectList('SELECT * FROM #__languages', 'lang_code');

    foreach($dirs as $dir){
        if(strlen($dir) != 5 || $dir == "xx-XX") continue;
        if($installed && (empty($languages[$dir]) || $languages[$dir]->published != 1)) continue;

        $xmlFiles = acymailing_getFiles($path.DS.$dir, '^([-_A-Za-z]*)\.xml$');
        $xmlFile = reset($xmlFiles);
        if(empty($xmlFile)){
            $data = array();
        }else{
            if(ACYMAILING_J40){
                $data = \JInstaller::parseXMLInstallFile(ACYMAILING_LANGUAGE.$dir.DS.$xmlFile);
            }else{
                $data = JApplicationHelper::parseXMLLangMetaFile(ACYMAILING_LANGUAGE.$dir.DS.$xmlFile);
            }
        }

        $lang = new stdClass();
        $lang->sef = empty($languages[$dir]) ? null : $languages[$dir]->sef;
        $lang->language = strtolower($dir);
        $lang->name = empty($data['name']) ? (empty($languages[$dir]) ? $dir : $languages[$dir]->title_native) : $data['name'];
        $lang->exists = file_exists(ACYMAILING_LANGUAGE.$dir.DS.$dir.'.com_acymailing.ini');
        $lang->content = empty($languages[$dir]) ? false : $languages[$dir]->published == 1;

        $result[$dir] = $lang;
    }

    return $result;
}

function acymailing_languageFolder($code){
    return ACYMAILING_LANGUAGE.$code.DS;
}

function acymailing_cleanSlug($slug){
    $method = acymailing_getCMSConfig('unicodeslugs', 0) == 1 ? 'stringURLUnicodeSlug' : 'stringURLSafe';
    return JFilterOutput::$method(trim($slug));
}

function acymailing_punycode($email, $method = 'emailToPunycode'){
    if(empty($email) || version_compare(JVERSION, '3.1.2', '<')) return $email;
    $email = JStringPunycode::$method($email);
    return $email;
}

function acymailing_extractArchive($archive, $destination){
    return JArchive::extract($archive, $destination);
}

function acymailing_selectOption($value, $text = '', $optKey = 'value', $optText = 'text', $disable = false){
    return JHTML::_('select.option', $value, $text, $optKey, $optText, $disable);
}

function acymailing_gridID($rowNum, $recId, $checkedOut = false, $name = 'cid', $stub = 'cb'){
    return JHTML::_('grid.id', $rowNum, $recId, $checkedOut, $name, $stub);
}

function acymailing_select($data, $name, $attribs = null, $optKey = 'value', $optText = 'text', $selected = null, $idtag = false, $translate = false){
    return JHTML::_('select.genericlist', $data, $name, $attribs, $optKey, $optText, $selected, $idtag, $translate);
}

function acymailing_radio($data, $name, $attribs = null, $optKey = 'value', $optText = 'text', $selected = null, $idtag = false, $translate = false, $vertical = false){
    $element = class_exists('JHtmlAcyselect') ? 'acyselect' : 'select';
    return JHTML::_($element.'.radiolist', $data, $name, $attribs, $optKey, $optText, $selected, $idtag, $translate, $vertical);
}

function acymailing_calendar($value, $name, $id, $format = '%Y-%m-%d', $attribs = null){
    return JHTML::_('calendar', $value, $name, $id, $format, $attribs);
}

function acymailing_date($input = 'now', $format = null, $tz = true, $gregorian = false){
    return JHTML::_('date', $input, $format, $tz, $gregorian);
}

function acymailing_boolean($name, $attribs = null, $selected = null, $yes = 'JOOMEXT_YES', $no = 'JOOMEXT_NO', $id = false){
    $element = class_exists('JHtmlAcyselect') ? 'acyselect' : 'select';
    return JHTML::_($element.'.booleanlist', $name, $attribs, $selected, $yes, $no, $id);
}

function acymailing_addScript($raw, $script, $type = "text/javascript", $defer = false, $async = false){
    $acyDocument = acymailing_getGlobal('doc');

    if($raw){
        $acyDocument->addScriptDeclaration($script, $type);
    }else{
        $acyDocument->addScript($script, $type, $defer, $async);
    }
}

function acymailing_addStyle($raw, $style, $type = 'text/css', $media = null, $attribs = array()){
    $acyDocument = acymailing_getGlobal('doc');

    if($raw){
        $acyDocument->addStyleDeclaration($style, $type);
    }else{
        $acyDocument->addStyleSheet($style, $type, $media, $attribs);
    }
}

function acymailing_addMetadata($meta, $data, $name = 'name'){
    $acyDocument = acymailing_getGlobal('doc');

    $acyDocument->setMetaData($meta, $data, $name);
}

function acymailing_trigger($method, $args = array()){
    if(ACYMAILING_J40) return \JFactory::getApplication()->triggerEvent($method, $args);

    global $acydispatcher;
    if($acydispatcher === null){
        $acydispatcher = JDispatcher::getInstance();
    }
    return @$acydispatcher->trigger($method, $args);
}

function acymailing_isAdmin(){
    $acyapp = acymailing_getGlobal('app');

    return $acyapp->isAdmin();
}

function acymailing_getUserVar($key, $request, $default = null, $type = 'none'){
    $acyapp = acymailing_getGlobal('app');

    return $acyapp->getUserStateFromRequest($key, $request, $default, $type);
}

function acymailing_getCMSConfig($varname, $default = null){
    if(ACYMAILING_J30) {
        $acyapp = acymailing_getGlobal('app');
        $result = $acyapp->getCfg($varname, $default);
    }else{
        $conf = JFactory::getConfig();
        $val = $conf->getValue('config.'.$varname);

        $result = empty($val) ? $default : $val;
    }

    if ($varname == 'list_limit') {
        $possibilities = array(5, 10, 15, 20, 25, 30, 50, 100);
        $closest = 5;
        foreach ($possibilities as $possibility) {
            if (abs($result - $closest) > abs($result - $possibility)) {
                $closest = $possibility;
            }
        }
        $result = $closest;
    }

    return $result;
}

function acymailing_redirect($url, $msg = '', $msgType = 'message'){
    $acyapp = acymailing_getGlobal('app');

    return $acyapp->redirect($url, $msg, $msgType);
}

function acymailing_getLanguageTag(){
    $acylanguage = JFactory::getLanguage();

    return $acylanguage->getTag();
}

function acymailing_getLanguageLocale(){
    $acylanguage = JFactory::getLanguage();

    return $acylanguage->getLocale();
}

function acymailing_setLanguage($lang){
    $acylanguage = JFactory::getLanguage();

    $acylanguage->setLanguage($lang);
}

function acymailing_baseURI($pathonly = false){
    return JURI::base($pathonly);
}

function acymailing_rootURI($pathonly = false, $path = null){
    return JURI::root($pathonly, $path);
}

function acymailing_generatePassword($length = 8){
    return JUserHelper::genrandompassword($length);
}

function acymailing_currentUserId(){
    $acymy = JFactory::getUser();

    return $acymy->id;
}

function acymailing_currentUserName($userid = null){
    if(!empty($userid)){
        $special = JFactory::getUser($userid);
        return $special->name;
    }

    $acymy = JFactory::getUser();

    return $acymy->name;
}

function acymailing_currentUserEmail($userid = null){
    if(!empty($userid)){
        $special = JFactory::getUser($userid);
        return $special->email;
    }

    $acymy = JFactory::getUser();

    return $acymy->email;
}

function acymailing_authorised($action, $assetname = null){
    $acymy = JFactory::getUser();

    return $acymy->authorise($action, $assetname);
}

function acymailing_loadLanguageFile($extension = 'joomla', $basePath = JPATH_SITE, $lang = null, $reload = false, $default = true){
    $acylanguage = JFactory::getLanguage();

    $acylanguage->load($extension, $basePath, $lang, $reload, $default);
}

function acymailing_getGlobal($type){
    $variables = array(
        'db' => array('acydb', 'getDBO'),
        'doc' => array('acyDocument', 'getDocument'),
        'app' => array('acyapp', 'getApplication')
    );

    global ${$variables[$type][0]};
    if(${$variables[$type][0]} === null){
        $method = $variables[$type][1];
        ${$variables[$type][0]} = JFactory::$method();
    }
    return ${$variables[$type][0]};
}

function acymailing_escapeDB($value){
    $acydb = acymailing_getGlobal('db');

    return $acydb->quote($value);
}

function acymailing_query($query){
    $acydb = acymailing_getGlobal('db');
    $acydb->setQuery($query);

    $method = ACYMAILING_J40 ? 'execute' : 'query';

    $result = $acydb->$method();
    if(!$result) return false;
    return $acydb->getAffectedRows();
}

function acymailing_loadObjectList($query, $key = '', $offset = null, $limit = null){
    $acydb = acymailing_getGlobal('db');

    $acydb->setQuery($query, $offset, $limit);
    return $acydb->loadObjectList($key);
}

function acymailing_loadObject($query){
    $acydb = acymailing_getGlobal('db');

    $acydb->setQuery($query);
    return $acydb->loadObject();
}

function acymailing_loadResult($query){
    $acydb = acymailing_getGlobal('db');

    $acydb->setQuery($query);
    return $acydb->loadResult();
}

function acymailing_loadResultArray($query){
    if(is_string($query)){
        $acydb = acymailing_getGlobal('db');
        $acydb->setQuery($query);
    }else{
        $acydb = $query;
    }

    if(ACYMAILING_J30) return $acydb->loadColumn();
    return $acydb->loadResultArray();
}

function acymailing_getEscaped($value, $extra = false) {
    $acydb = acymailing_getGlobal('db');

    if(ACYMAILING_J30) return $acydb->escape($value, $extra);
    return $acydb->getEscaped($value, $extra);
}

function acymailing_getDBError(){
    $acydb = acymailing_getGlobal('db');

    return $acydb->getErrorMsg();
}

function acymailing_insertObject($table, $element){
    $acydb = acymailing_getGlobal('db');
    $acydb->insertObject($table, $element);

    return $acydb->insertid();
}

function acymailing_insertID(){
    $acydb = acymailing_getGlobal('db');
    return $acydb->insertid();
}

function acymailing_updateObject($table, $element, $pkey){
    $acydb = acymailing_getGlobal('db');
    return $acydb->updateObject($table, $element, $pkey);
}

function acymailing_getColumns($table){
    $acydb = acymailing_getGlobal('db');
    
    if(ACYMAILING_J30) return $acydb->getTableColumns($table);
    $allfields = $acydb->getTableFields($table);
    return reset($allfields);
}

function acymailing_getPrefix(){
    $acydb = acymailing_getGlobal('db');
    return $acydb->getPrefix();
}

function acymailing_getTableList(){
    $acydb = acymailing_getGlobal('db');
    return $acydb->getTableList();
}

function acymailing_completeLink($link, $popup = false, $redirect = false){
    if($popup || acymailing_isNoTemplate()) $link .= '&'.acymailing_noTemplate();
    return acymailing_route('index.php?option='.ACYMAILING_COMPONENT.'&ctrl='.$link, !$redirect);
}

function acymailing_noTemplate(){
    return 'tmpl=component';
}

function acymailing_isNoTemplate(){
    return acymailing_getVar('cmd', 'tmpl') == 'component';
}

function acymailing_setNoTemplate($status = true){
    if($status) acymailing_setVar('tmpl', 'component');
    else acymailing_setVar('tmpl', '');
}

function acymailing_cmsLoaded(){
    defined('_JEXEC') or die('Restricted access');
}

function acymailing_formOptions($order = null, $task = ''){
    echo '<input type="hidden" name="option" value="'.ACYMAILING_COMPONENT.'"/>';
    echo '<input type="hidden" name="task" value="'.$task.'"/>';
    echo '<input type="hidden" name="ctrl" value="'.acymailing_getVar('cmd', 'ctrl', '').'"/>';
    if($order) {
        echo '<input type="hidden" name="boxchecked" value="0"/>';
        echo '<input type="hidden" name="filter_order" value="'.$order->value.'"/>';
        echo '<input type="hidden" name="filter_order_Dir" value="'.$order->dir.'"/>';
    }
    echo acymailing_formToken();
}

function acymailing_enqueueMessage($message, $type = 'success'){
    $result = is_array($message) ? implode('<br/>', $message) : $message;

    if(acymailing_isAdmin()){
        if(ACYMAILING_J30){
            $type = str_replace(array('notice', 'message'), array('info', 'success'), $type);
        }else{
            $type = str_replace(array('message', 'notice', 'warning'), array('info', 'warning', 'error'), $type);
        }
    }else{
        if(ACYMAILING_J30){
            $type = str_replace(array('success', 'info'), array('message', 'notice'), $type);
        }else{
            $type = str_replace(array('success', 'error', 'warning', 'info'), array('message', 'warning', 'notice', 'message'), $type);
        }
    }

    $acyapp = acymailing_getGlobal('app');

    $acyapp->enqueueMessage($result, $type);
}

function acymailing_displayMessages(){
    $acyapp = acymailing_getGlobal('app');
    $messages = $acyapp->getMessageQueue(true);
    if(empty($messages)) return;

    $sorted = array();
    foreach ($messages as $oneMessage) {
        $sorted[$oneMessage['type']][] = $oneMessage['message'];
    }

    foreach ($sorted as $type => $message) {
        acymailing_display($message, $type);
    }
}

function acymailing_editCMSUser($userid){
    return acymailing_route('index.php?option=com_users&view=user&layout=edit&id='.$userid);
}

function acymailing_prepareAjaxURL($url){
    return htmlspecialchars_decode(acymailing_completeLink($url, true));
}

function acymailing_cmsACL(){
    if(!ACYMAILING_J16 || !acymailing_authorised('core.admin', 'com_acymailing')) return '';

    $return = urlencode(base64_encode((string)JUri::getInstance()));
    return '<div class="onelineblockoptions">
        <span class="acyblocktitle">'.acymailing_translation('ACY_JOOMLA_PERMISSIONS').'</span>
        <a class="acymailing_button_grey" style="color:#666;" target="_blank" href="index.php?option=com_config&view=component&component=com_acymailing&path=&return='.$return.'">'.acymailing_translation('JTOOLBAR_OPTIONS').'</a><br/>
    </div>';
}

function acymailing_isDebug(){
    return defined('JDEBUG') && JDEBUG;
}

function acymailing_setPageTitle($title){
    if(empty($title)){
        $title = acymailing_getCMSConfig('sitename');
    }elseif(acymailing_getCMSConfig('sitename_pagetitles', 0) == 1){
        $title = acymailing_translation_sprintf('ACY_JPAGETITLE', acymailing_getCMSConfig('sitename'), $title);
    }elseif(acymailing_getCMSConfig('sitename_pagetitles', 0) == 2){
        $title = acymailing_translation_sprintf('ACY_JPAGETITLE', $title, acymailing_getCMSConfig('sitename'));
    }
    $document = JFactory::getDocument();
    $document->setTitle($title);
}

function acymailing_importPlugin($family, $name = null){
    JPluginHelper::importPlugin($family, $name);
}

function acymailing_getPlugin($type, $name = null){
    return JPluginHelper::getPlugin($type, $name);
}

function acymailing_isPluginEnabled($type, $name = null){
    return JPluginHelper::isEnabled($type, $name);
}

function acymailing_getLanguagePath($basePath = ACYMAILING_BASE, $language = null){
    return JLanguage::getLanguagePath(rtrim($basePath, DS), $language);
}

function acymailing_userEditLink(){
    if(file_exists(ACYMAILING_ROOT.'components'.DS.'com_comprofiler'.DS.'comprofiler.php')){
        $editLink = 'index.php?option=com_comprofiler&task=edit&cid[]=';
    }elseif(!ACYMAILING_J16){
        $editLink = 'index.php?option=com_users&task=edit&cid[]=';
    }else{
        $editLink = 'index.php?option=com_users&task=user.edit&id=';
    }
    return $editLink;
}

function acymailing_filterText($text){
    if(ACYMAILING_J25) return JComponentHelper::filterText($text);
    return $text;
}

function acymailing_checkPluginsFolders(){
    $folders = array(ACYMAILING_ROOT.'plugins' => '', ACYMAILING_ROOT.'plugins'.DS.'user' => '', ACYMAILING_ROOT.'plugins'.DS.'system' => '');
    $results = array('', '', '');
    foreach($folders as $oneFolderToCheck => &$result){
        if(!is_writable($oneFolderToCheck)){
            $writableIssue = true;
            break;
        }
    }
    if(!empty($writableIssue)){
        $results = array();
        foreach($folders as $oneFolderToCheck => &$result){
            $results[] = ' : <span style="color:'.(is_writable($oneFolderToCheck) ? 'green;">OK' : 'red;">Not writable').'</span>';
        }
    }
    $errorPluginTxt = 'Some required AcyMailing plugins have not been installed.<br />Please make sure your plugins folders are writables by checking the user/group permissions:<br />* Joomla / Plugins'.$results[0].'<br />* Joomla / Plugins / User'.$results[1].'<br />* Joomla / Plugins / System'.$results[0].'<br />';
    if(empty($writableIssue)) $errorPluginTxt .= 'Please also empty your plugins cache: System => Clear cache => com_plugins => Delete<br />';
    acymailing_display($errorPluginTxt.'<a href="index.php?option=com_acymailing&amp;ctrl=update&amp;task=install">'.acymailing_translation('ACY_ERROR_INSTALLAGAIN').'</a>', 'warning');
}

function acymailing_askLog($current = true, $message = 'ACY_NOTALLOWED', $type = 'error'){
    $usercomp = ACYMAILING_J16 ? 'com_users' : 'com_user';
    $url = 'index.php?option='.$usercomp.'&view=login';
    if($current) $url .= '&return='.base64_encode(acymailing_currentURL());
    acymailing_redirect($url, acymailing_translation($message), $type);
}

function acymailing_frontendLink($link, $newsletter = true, $popup = false, $complete = false){
    if($complete) $link = 'index.php?option=com_acymailing&ctrl='.$link;

    if($popup) $link .= '&'.acymailing_noTemplate();
    $config = acymailing_config();

    if($config->get('use_sef', 0) && strpos($link, '&ctrl=cron') === false){

        if($newsletter) return '{acyfrontsef}'.$link.'{/acyfrontsef}';

        $sefLink = acymailing_fileGetContent(acymailing_rootURI().'index.php?option=com_acymailing&ctrl=url&task=sef&urls[0]='.base64_encode($link));
        $json = json_decode($sefLink, true);
        if($json == null){
            if(!empty($sefLink) && acymailing_isDebug()) acymailing_enqueueMessage('Error trying to get the sef link: '.$sefLink);
        }else{
            $link = array_shift($json);
            return $link;
        }
    }

    $mainurl = acymailing_mainURL($link);

    return $mainurl.$link;
}

function acymailing_addBreadcrumb($title, $link = ''){
    $acyapp = acymailing_getGlobal('app');
    $pathway = $acyapp->getPathway();
    $pathway->addItem($title, $link);
}

function acymailing_getMenu(){
    global $Itemid;

    $jsite = JFactory::getApplication('site');
    $menus = $jsite->getMenu();
    $menu = $menus->getActive();

    if(empty($menu) && !empty($Itemid)){
        $menus->setActive($Itemid);
        $menu = $menus->getItem($Itemid);
    }
    
    return $menu;
}

function acymailing_getTitle(){
    $document = acymailing_getGlobal('doc');
    return $document->getTitle();
}

jimport('joomla.application.component.controller');
jimport('joomla.application.component.view');

if(ACYMAILING_J30){
    class acymailingBridgeController extends JControllerLegacy{
        function __construct($config = array()){
            parent::__construct($config);
            global $acymailingCmsUserVars;
            $this->cmsUserVars = $acymailingCmsUserVars;
        }
    }

    class acymailingView extends JViewLegacy{
        var $chosen = true;

        function __construct($config = array()){
            parent::__construct($config);
            global $acymailingCmsUserVars;
            $this->cmsUserVars = $acymailingCmsUserVars;
        }

        function display($tpl = null){
            if($this->chosen && acymailing_isAdmin()){
                JHtml::_('formbehavior.chosen', 'select');
            }

            return parent::display($tpl);
        }
    }
}else{
    class acymailingBridgeController extends JController{
        function __construct($config = array()){
            parent::__construct($config);
            global $acymailingCmsUserVars;
            $this->cmsUserVars = $acymailingCmsUserVars;
        }
    }
    class acymailingView extends JView{
        function __construct($config = array()){
            parent::__construct($config);
            global $acymailingCmsUserVars;
            $this->cmsUserVars = $acymailingCmsUserVars;
        }
    }
}

acymailing_boolean('acymailing');
$config = acymailing_config();
if(!ACYMAILING_J40 && ACYMAILING_J30 && (acymailing_isAdmin() || $config->get('bootstrap_frontend', 0))){
    require(ACYMAILING_BACK.'compat'.DS.'bootstrap.php');
}else{
    class JHtmlAcyselect extends JHTMLSelect{
    }
}

global $acymailingCmsUserVars;
$acymailingCmsUserVars = new stdClass();
$acymailingCmsUserVars->table = 'users';
$acymailingCmsUserVars->name = 'name';
$acymailingCmsUserVars->username = 'username';
$acymailingCmsUserVars->id = 'id';
$acymailingCmsUserVars->email = 'email';
$acymailingCmsUserVars->registered = 'registerDate';
$acymailingCmsUserVars->blocked = 'block';
components/com_acymailing/compat/bootstrap.php000060400000013127152453623450015726 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php


JHtml::_('bootstrap.framework');

class JHtmlAcyselect extends JHTMLSelect{
	static $event = false;

	public static function booleanlist($name, $attribs = null, $selected = null, $yes = 'JOOMEXT_YES', $no = 'JOOMEXT_NO', $id = false){
		$arr = array(acymailing_selectOption('0', acymailing_translation($no)), acymailing_selectOption('1', acymailing_translation($yes)));
		$arr[0]->class = 'btn-danger';
		$arr[1]->class = 'btn-success';
		return acymailing_radio($arr, $name, $attribs, 'value', 'text', (int)$selected, $id);
	}

	public static function radiolist($data, $name, $attribs = null, $optKey = 'value', $optText = 'text', $selected = null, $idtag = false, $translate = false, $vertical = false){
		reset($data);
		$backend = acymailing_isAdmin();
		$config = acymailing_config();
		if(!self::$event){
			self::$event = true;
			if($backend){
				acymailing_addScript(true, '
(function($){
	$.propHooks.checked = {
		set: function(elem, value, name) {
			var ret = (elem[ name ] = value);
			$(elem).trigger("change");
			return ret;
		}
	};
})(jQuery);');
			}else{
				acymailing_addScript(true, '
(function($){
if(!window.acyLocal)
	window.acyLocal = {};
window.acyLocal.radioEvent = function(el) {
	var id = $(el).attr("id"), c = $(el).attr("class"), lbl = $("label[for=\"" + id + "\"]");
	if(c !== undefined && c.length > 0)
		lbl.addClass(c);
	lbl.addClass("active");
	$("input[name=\"" + $(el).attr("name") + "\"]").each(function() {
		if($(this).attr("id") != id) {
			c = $(this).attr("class");
			lbl = $("label[for=\"" + $(this).attr("id") + "\"]");
			if(c !== undefined && c.length > 0)
				lbl.removeClass(c);
			lbl.removeClass("active");
		}
	});
}
$(document).ready(function() {
	setTimeout(function() { $(".acyradios .btn-group label").off("click"); }, 200 );
});

})(jQuery);');
			}
		}

		if(is_array($attribs)){
			$attribs = acymailing_arrayToString($attribs);
		}

		if(!$backend){
			$attribs = ' '.$attribs;
			$onclick = '';
			if(strpos($attribs, ' onclick="') !== false || strpos($attribs, 'onclick=\'') !== false){
				$onclick = $attribs;
			}
			if(strpos($attribs, ' style="') !== false){
				$attribs = str_replace(' style="', ' style="display:none;', $attribs);
			}elseif(strpos($attribs, 'style=\'') !== false){
				$attribs = str_replace(' style=\'', ' style=\'display:none;', $attribs);
			}else{
				$attribs .= ' style="display:none;"';
			}
			if(strpos($attribs, ' onchange="') !== false){
				$attribs = str_replace(' onchange="', ' onchange="window.acyLocal.radioEvent(this);', $attribs);
			}elseif(strpos($attribs, 'onchange=\'') !== false){
				$attribs = str_replace(' onchange=\'', ' onchange=\'window.acyLocal.radioEvent(this);', $attribs);
			}else{
				$attribs .= ' onchange="window.acyLocal.radioEvent(this);"';
			}
		}

		$id_text = preg_replace('#[^a-zA-Z0-9]+#mi', '_', str_replace(array('[', ']'), array('_', ''), $idtag ? $idtag : $name));
		$htmlBootstrap2 = '';
		$htmlBootstrap3 = '';
		if($backend){
			$html = '<div class="controls"><fieldset id="'.$id_text.'fieldset" class="radio btn-group'.($vertical ? ' btn-group-vertical' : '').'">';


		}else{
			$html = '<div class="acyradios" id="'.$id_text.'">';
		}

		foreach($data as $obj){
			if(is_string($obj)){
				$html .= $obj;
				continue;
			}

			$k = $obj->$optKey;
			$t = $translate ? acymailing_translation($obj->$optText) : $obj->$optText;
			$id = (isset($obj->id) ? $obj->id : null);

			$active = '';
			$sel = false;
			$extra = $id ? ' id="'.$obj->id.'"' : '';
			$currId = $id_text.$k;
			if(isset($obj->id)){
				$currId = $obj->id;
			}

			if(is_array($selected)){
				foreach($selected as $val){
					$k2 = is_object($val) ? $val->$optKey : $val;
					if($k == $k2){
						$extra .= ' selected="selected"';
						$sel = true;
						break;
					}
				}
			}elseif((string)$k == (string)$selected){
				$extra .= ' checked="checked"';
				$sel = true;
				$active = 'active';
				if(!empty($obj->class)) $active .= ' '.$obj->class;
			}

			if(!empty($obj->class)) $extra .= ' class="'.$obj->class.'"';

			if($backend){
				$html .= "\n\t\n\t".'<input type="radio" name="'.$name.'" id="'.$id_text.$k.'" value="'.$k.'" '.$extra.' '.$attribs.'/>';
				$html .= "\n\t".'<label for="'.$id_text.$k.'">'.$t.'</label>';

			}else{
				if($config->get('bootstrap_frontend') == 2){
					$onclickFinal = str_replace('this.value', "'".$k."'", $onclick);
					$htmlBootstrap3 .= "\n\t".'<label for="'.$currId.'" class="btn btn-primary '.$active.'" '.$onclickFinal.'>';
					$htmlBootstrap3 .= "\n\t".'<input type="radio" name="'.$name.'"'.' id="'.$currId.'"'.$extra.' '.$attribs.' value="'.$k.'" > '.$t.'</label>';
				}else{
					$html .= "\n\t".'<input type="radio" name="'.$name.'"'.' id="'.$currId.'" value="'.$k.'"'.' '.$extra.' '.$attribs.'/>';
					$htmlBootstrap2 .= "\n\t"."\n\t".'<label for="'.$currId.'"'.' class="btn'.($sel ? ' active'.(empty($obj->class) ? '' : ' '.$obj->class) : '').'">'.$t.'</label>';
				}
			}
		}
		if($backend){
			$html .= '</fieldset></div>';
		}else{
			if($config->get('bootstrap_frontend') == 2){
				$html .= "\n".'<div class="btn-group'.($vertical ? ' btn-group-vertical' : '').'" data-toggle="buttons">'.$htmlBootstrap3."\n".'</div>';
			}else{
				$html .= "\n".'<div class="btn-group'.($vertical ? ' btn-group-vertical' : '').'" data-toggle="buttons-radio">'.$htmlBootstrap2."\n".'</div>';
			}
			$html .= "\n".'</div>';
		}
		$html .= "\n";
		return $html;
	}

}
components/com_acymailing/compat/compat3.php000060400000002440152453623450015253 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.7.0
 * @author	acyba.com
 * @copyright	(C) 2009-2017 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */
defined('_JEXEC') or die('Restricted access');
?><?php

class acymailingView extends JViewLegacy{

	var $chosen = true;

	function display($tpl = null){
		$app = JFactory::getApplication();
		if($this->chosen && $app->isAdmin()){
			JHtml::_('formbehavior.chosen', 'select');
		}

		return parent::display($tpl);
	}

}

class acymailingControllerCompat extends JControllerLegacy{

}

function acymailing_loadResultArray(&$db){
	return $db->loadColumn();
}

function acymailing_loadMootools($loadMootoolsMoreLib = false){
	JHTML::_('behavior.framework', $loadMootoolsMoreLib);
}

function acymailing_getColumns($table){
	$db = JFactory::getDBO();
	return $db->getTableColumns($table);
}

function acymailing_getEscaped($value, $extra = false) {
	$db = JFactory::getDBO();
	return $db->escape($value, $extra);
}

function acymailing_getFormToken() {
	return JSession::getFormToken();
}

class acyParameter extends JRegistry {

	function get($path, $default = null){
		$value = parent::get($path, 'noval');
		if($value === 'noval') $value = parent::get('data.'.$path,$default);
		return $value;
	}
}
components/com_acymailing/compat/joomla.editor.php000060400000013556152453623450016465 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

use Joomla\CMS\Editor\Editor AS Editor;

class acyeditorHelper{

	var $width = '95%';

	var $height = '600';

	var $cols = 100;

	var $rows = 30;

	var $editor = null;

	var $name = '';

	var $content = '';

	var $editorConfig = array();

	var $editorContent = '';

	function __construct(){
		$config = acymailing_config();
		$this->editor = $config->get('editor', null);
		if(empty($this->editor)) $this->editor = null;
		if(!class_exists('Joomla\CMS\Editor\Editor')){
			$this->myEditor = JFactory::getEditor($this->editor);
		}else{
			if(empty($this->editor)){
				$user = JFactory::getUser();
				$this->editor = $user->getParam('editor', acymailing_getCMSConfig('editor'));
			}
			$this->myEditor = Editor::getInstance($this->editor);
		}
		$this->myEditor->initialise();

		if(ACYMAILING_J16 && $this->editor == 'tinymce'){
			$this->editorConfig['extended_elements'] = 'table[background|cellspacing|cellpadding|width|align|bgcolor|border|style|class|id],tr[background|width|bgcolor|style|class|id|valign],td[background|width|align|bgcolor|valign|colspan|rowspan|height|style|class|id|nowrap]';
		}
	}

	function setTemplate($id){
		if(empty($id)) return;

		$cssurl = acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'template&task=load&tempid='.$id.'&time='.time());

		$classTemplate = acymailing_get('class.template');
		$filepath = $classTemplate->createTemplateFile($id);

		if($this->editor == 'tinymce'){
			$this->editorConfig['content_css_custom'] = $cssurl.'&local=http';
			$this->editorConfig['content_css'] = '0';
		}elseif($this->editor == 'jckeditor' || $this->editor == 'fckeditor'){
			$this->editorConfig['content_css_custom'] = $filepath;
			$this->editorConfig['content_css'] = '0';
			$this->editorConfig['editor_css'] = '0';
		}else{
			$fileurl = ACYMAILING_MEDIA_FOLDER.'/templates/css/template_'.$id.'.css?time='.time();
			$this->editorConfig['custom_css_url'] = $cssurl;
			$this->editorConfig['custom_css_file'] = $fileurl;
			$this->editorConfig['custom_css_path'] = $filepath;
			acymailing_setVar('acycssfile', $fileurl);
		}
	}

	function prepareDisplay(){
		$this->content = htmlspecialchars($this->content, ENT_COMPAT, 'UTF-8');
		ob_start();
		if(!ACYMAILING_J16){
			echo $this->myEditor->display($this->name, $this->content, $this->width, $this->height, $this->cols, $this->rows, array('pagebreak', 'readmore'), $this->editorConfig);
		}else{
			echo $this->myEditor->display($this->name, $this->content, $this->width, $this->height, $this->cols, $this->rows, array('pagebreak', 'readmore'), null, 'com_content', null, $this->editorConfig);
		}

		$this->editorContent = ob_get_clean();
	}


	function setDescription(){
		$this->width = 700;
		$this->height = 200;
		$this->cols = 80;
		$this->rows = 10;
	}

	function setContent($var){
		if(method_exists($this->myEditor, 'setContent')){
			$function = "try{ Joomla.editors.instances['".$this->name."'].setValue(".$var."); }catch(err){alert('Error using the setContent function of the wysiwyg editor')} ";
			$function = "try{".$this->myEditor->setContent($this->name, $var)." }catch(err){".$function."}";
		}else{
			$function = "alert('There is no setContent method defined for this editor');";
		}

		if(!empty($this->editor)){
			if($this->editor == 'jce'){
				return " try{JContentEditor.setContent('".$this->name."', $var ); }catch(err){try{WFEditor.setContent('".$this->name."', $var )}catch(err){".$function."} }";
			}
			if($this->editor == 'fckeditor'){
				return " try{FCKeditorAPI.GetInstance('".$this->name."').SetHTML( $var ); }catch(err){".$function."} ";
			}
			if($this->editor == 'jckeditor'){
				return " try{oEditor.setData(".$var.");}catch(err){(!oEditor) ? CKEDITOR.instances.".$this->name.".setData($var) : oEditor.insertHtml = ".$var.'}';
			}
			if($this->editor == 'ckeditor'){
				return " try{CKEDITOR.instances.".$this->name.".setData( $var ); }catch(err){".$function."} ";
			}
			if($this->editor == 'artofeditor'){
				return " try{CKEDITOR.instances.".$this->name.".setData( $var ); }catch(err){".$function."} ";
			}
			if($this->editor == 'tinymce'){
				return ' try{ Joomla.editors.instances["'.$this->name.'"].setValue('.$var.'); }catch(err){'.$function.'} ';
			}
		}

		return $function;
	}

	function setEditorStylesheet($tempid){
		$cssurl = acymailing_completeLink((acymailing_isAdmin() ? '' : 'front').'template&task=load&time='.time().'&tempid=');

		$function = 'if('.$tempid.' !== 0){
						try{
							setEditorStylesheet(\''.$this->name.'\',\''.$cssurl.'\'+'.$tempid.',\''.ACYMAILING_MEDIA_FOLDER.'/templates/css/template_\'+'.$tempid.'+\'.css\');
						}catch(err){
							var iframe = document.getElementById("'.$this->name.'_ifr");
							if(typeof iframe != undefined && iframe){
								var css = iframe.contentDocument.querySelector(\'link[href*="'.ACYMAILING_MEDIA_FOLDER.'/templates/css/template_"]\');
								if(typeof css != undefined && css){
									css.href = css.href.replace(/template_\d{1,10}.css/, "template_"+'.$tempid.'+".css");
								}else{
									var css = iframe.contentDocument.querySelector(\'link[href*="com_acymailing&ctrl=template&task=load&tempid="]\');
									if(typeof css != undefined && css){
										css.href = css.href.replace(/&tempid=\d{1,10}&time/, "&tempid="+'.$tempid.'+"&time");
									}
								}
							}
						}
					}';

		return $function;
	}

	function getContent(){
		return $this->myEditor->getContent($this->name);
	}

	function display(){
		if(empty($this->editorContent)) $this->prepareDisplay();
		return $this->editorContent;
	}

	function jsCode(){
		return method_exists($this->myEditor, 'save') ? $this->myEditor->save($this->name) : '';
	}

	function jsMethods(){
		return '';
	}

}//endclass
components/com_acymailing/compat/compat2.php000060400000001017152453623450015251 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.7.0
 * @author	acyba.com
 * @copyright	(C) 2009-2017 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */
defined('_JEXEC') or die('Restricted access');
?><?php
class acyParameter extends JRegistry {

	function get($path, $default = null){
		$value = parent::get($path, 'noval');
		if($value === 'noval') $value = parent::get('data.'.$path,$default);
		return $value;
	}
}
require(dirname(__FILE__).DS.'compat1.php');
components/com_acymailing/install.joomla.php000060400000143631152453623450015360 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

if(version_compare(PHP_VERSION, '5.3.0', '<')){
	echo '<p style="color:red">This version of AcyMailing requires at least PHP 5.3.0, it is time to upgrade the PHP version of your server!</p>';
	exit;
}

function installAcyMailing(){
	$success = true;
	try{
		include_once(rtrim(JPATH_ADMINISTRATOR, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.'components'.DIRECTORY_SEPARATOR.'com_acymailing'.DIRECTORY_SEPARATOR.'helpers'.DIRECTORY_SEPARATOR.'helper.php');
	}catch(Exception $e){
		$updateHelper = acymailing_get('helper.update');
		$updateHelper->installTables();
		$success = false;
		if(!function_exists('acymailing_loadResult')) include_once(rtrim(JPATH_ADMINISTRATOR, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.'components'.DIRECTORY_SEPARATOR.'com_acymailing'.DIRECTORY_SEPARATOR.'helpers'.DIRECTORY_SEPARATOR.'helper.php');
	}

	acymailing_increasePerf();

	$installClass = new acymailingInstall();
	$installClass->updateJoomailing();
	$installClass->addPref();
	$installClass->updatePref();
	$installClass->updateSQL();
	if($success) $installClass->displayInfo();
}

function uninstallAcyMailing(){
	$uninstallClass = new acymailingUninstall();
	$uninstallClass->unpublishModules();
	$uninstallClass->message();
}

if(!function_exists('com_install')){
	function com_install(){
		return installAcyMailing();
	}
}

if(!function_exists('com_uninstall')){
	function com_uninstall(){
		return uninstallAcyMailing();
	}
}

class com_acymailingInstallerScript{
	function install($parent){
		installAcyMailing();
	}

	function update($parent){
		installAcyMailing();
	}

	function uninstall($parent){
		uninstallAcyMailing();
	}

	function preflight($type, $parent){
		return true;
	}

	function postflight($type, $parent){
		return true;
	}
}


class acymailingInstall{

	var $level = 'starter';
	var $version = '5.9.6';
	var $update = false;
	var $fromLevel = '';
	var $fromVersion = '';
	var $db;

	function __construct(){
		include_once(rtrim(JPATH_ADMINISTRATOR, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.'components'.DIRECTORY_SEPARATOR.'com_acymailing'.DIRECTORY_SEPARATOR.'helpers'.DIRECTORY_SEPARATOR.'helper.php');
	}

	function displayInfo(){

		echo '<h1>Please wait... </h1><h2>AcyMailing will now automatically install the Plugins and the Module</h2>';
		$url = 'index.php?option=com_acymailing&ctrl=update&task=install&fromlevel='.$this->fromLevel.'&fromversion='.$this->fromVersion;
		echo '<a href="'.$url.'">Please click here if you are not automatically redirected within 3 seconds</a>';
		echo "<script language=\"javascript\" type=\"text/javascript\">document.location.href='$url';</script>\n";
	}

	function updatePref(){

		try{
			$results = acymailing_loadObjectList("SELECT `namekey`, `value` FROM `#__acymailing_config` WHERE `namekey` IN ('version','level') LIMIT 2", 'namekey');
		}catch(Exception $e){
			$results = null;
		}

		if($results === null){
			acymailing_display(isset($e) ? $e->getMessage() : substr(strip_tags(acymailing_getDBError()), 0, 200).'...', 'error');
			return false;
		}

		if($results['version']->value == $this->version && $results['level']->value == $this->level) return true;

		$this->update = true;
		$this->fromLevel = $results['level']->value;
		$this->fromVersion = $results['version']->value;

		$query = "REPLACE INTO `#__acymailing_config` (`namekey`,`value`) VALUES ('level',".acymailing_escapeDB($this->level)."),('version',".acymailing_escapeDB($this->version)."),('installcomplete','0')";
		acymailing_query($query);

		return true;
	}

	function updateSQL(){
		if(!$this->update) return true;
		$config = acymailing_config();


		if(version_compare($this->fromVersion, '1.1.4', '<')){
			$replace1 = "REPLACE(`params`, 'showhtml=1\nshowname=1', 'customfields=name,email,html' )";
			$replace2 = "REPLACE( $replace1 , 'showhtml=0\nshowname=1', 'customfields=name,email' )";
			$replace3 = "REPLACE( $replace2 , 'showhtml=1\nshowname=0', 'customfields=email,html' )";
			$replace4 = "REPLACE( $replace3 , 'showhtml=0\nshowname=0', 'customfields=email' )";
			$this->updateQuery("UPDATE #__modules SET `params`= $replace4 WHERE `module` = 'mod_acymailing' ");
		}

		if(version_compare($this->fromVersion, '1.2.1', '<')){
			$this->updateQuery("UPDATE `#__acymailing_config` SET `value` = 'data' WHERE `value` = '0' AND `namekey` = 'allow_modif' LIMIT 1");
			$this->updateQuery("UPDATE `#__acymailing_config` SET `value` = 'all' WHERE `value` = '1' AND `namekey` = 'allow_modif' LIMIT 1");
		}

		if(version_compare($this->fromVersion, '1.2.2', '<')){
			$this->updateQuery("ALTER TABLE `#__acymailing_mail` ADD `sentby` INT UNSIGNED NULL DEFAULT NULL");
			$this->updateQuery("ALTER TABLE `#__acymailing_template` ADD `subject` VARCHAR( 250 ) NULL DEFAULT NULL");
			$this->updateQuery("DELETE FROM `#__plugins` WHERE `folder` = 'acymailing' AND `element` = 'autocontent'");
		}

		if(version_compare($this->fromVersion, '1.2.3', '<')){
			$this->updateQuery("UPDATE `#__plugins` SET `folder` = 'system', `element`= 'regacymailing', `name` = 'AcyMailing : (auto)Subscribe during Joomla registration', `params`= REPLACE(`params`, 'lists=', 'autosub=' ) WHERE `folder` = 'user' AND `element` = 'acymailing'");
			$this->updateQuery("DELETE FROM `#__plugins` WHERE `folder` = 'acymailing' AND `element` = 'autocontent'");
			$this->updateQuery("ALTER TABLE `#__acymailing_template` ADD `stylesheet` TEXT NULL");

			if(is_dir(ACYMAILING_BACK.'plugins'.DS.'plg_user_acymailing')){
				acymailing_deleteFolder(ACYMAILING_BACK.'plugins'.DS.'plg_user_acymailing');
			}
			if(is_dir(ACYMAILING_BACK.'plugins'.DS.'plg_acymailing_autocontent')){
				acymailing_deleteFolder(ACYMAILING_BACK.'plugins'.DS.'plg_acymailing_autocontent');
			}
		}

		if(version_compare($this->fromVersion, '1.3.1', '<')){
			$this->updateQuery("ALTER TABLE `#__acymailing_config` CHANGE `value` `value` TEXT NULL ");

			$this->updateQuery("ALTER TABLE `#__acymailing_fields` ADD `listing` TINYINT NULL DEFAULT NULL ");
			$this->updateQuery("UPDATE `#__acymailing_fields` SET `listing` = 1 WHERE `namekey` IN ('name','email','html') ");
			$this->updateQuery("ALTER TABLE `#__acymailing_template` ADD `fromname` VARCHAR( 250 ) NULL , ADD `fromemail` VARCHAR( 250 ) NULL , ADD `replyname` VARCHAR( 250 ) NULL , ADD `replyemail` VARCHAR( 250 ) NULL ");
		}

		if(version_compare($this->fromVersion, '1.5.2', '<')){

			$existingEntry = acymailing_loadResult("SELECT `params` FROM #__plugins WHERE `element` = 'regacymailing' LIMIT 1");
			$listids = 'None';
			if(preg_match('#autosub=(.*)#i', $existingEntry, $autosubResult)){
				$listids = $autosubResult[1];
			}
			$this->updateQuery("INSERT IGNORE INTO `#__acymailing_config` (`namekey`,`value`) VALUES ('autosub',".acymailing_escapeDB($listids).")");
		}

		if(version_compare($this->fromVersion, '1.5.3', '<')){
			$this->updateQuery('UPDATE #__acymailing_config SET `value` = REPLACE(`value`,\'<sup style="font-size: 4px;">TM</sup>\',\'™\')');
		}


		if(version_compare($this->fromVersion, '1.6.2', '<')){

			$this->updateQuery("UPDATE #__acymailing_config SET `value` = 'media/com_acymailing/upload' WHERE `namekey` = 'uploadfolder' AND `value` = 'components/com_acymailing/upload' ");

			$this->updateQuery("UPDATE #__acymailing_config SET `value` = 'media/com_acymailing/logs/report".rand(0, 999999999).".log' WHERE `namekey` = 'cron_savepath' ");

			if(!ACYMAILING_J16){
				$this->updateQuery("UPDATE #__plugins SET `params` = REPLACE(`params`,'components/com_acymailing/images','media/com_acymailing/images') ");
			}else{
				$this->updateQuery("UPDATE #__extensions SET `params` = REPLACE(`params`,'components\/com_acymailing\/images','media\/com_acymailing\/images') ");
			}


			$updateClass = acymailing_get('helper.update');
			$removeFiles = array();
			$removeFiles[] = ACYMAILING_FRONT.'css'.DS.'component_default.css';
			$removeFiles[] = ACYMAILING_FRONT.'css'.DS.'frontendedition.css';
			$removeFiles[] = ACYMAILING_FRONT.'css'.DS.'module_default.css';
			foreach($removeFiles as $oneFile){
				if(is_file($oneFile)) acymailing_deleteFile($oneFile);
			}

			$fromFolders = array();
			$toFolders = array();
			$fromFolders[] = ACYMAILING_FRONT.'css';
			$toFolders[] = ACYMAILING_MEDIA.'css';
			$fromFolders[] = ACYMAILING_FRONT.'templates'.DS.'plugins';
			$toFolders[] = ACYMAILING_MEDIA.'plugins';
			$fromFolders[] = ACYMAILING_FRONT.'upload';
			$toFolders[] = ACYMAILING_MEDIA.'upload';

			foreach($fromFolders as $i => $oneFolder){
				if(!is_dir($oneFolder)) continue;
				if(is_dir($toFolders[$i])){
					$updateClass->copyFolder($oneFolder, $toFolders[$i]);
				}
			}

			$deleteFolders = array();
			$deleteFolders[] = ACYMAILING_FRONT.'css';
			$deleteFolders[] = ACYMAILING_FRONT.'images';
			$deleteFolders[] = ACYMAILING_FRONT.'js';
			$deleteFolders[] = ACYMAILING_BACK.'logs';

			foreach($deleteFolders as $oneFolder){
				if(!is_dir($oneFolder)) continue;
				acymailing_deleteFolder($oneFolder);
			}
		}

		if(version_compare($this->fromVersion, '1.7.1', '<')){
			$this->updateQuery("CREATE TABLE IF NOT EXISTS `#__acymailing_history` (`subid` INT UNSIGNED NOT NULL ,`date` INT UNSIGNED NOT NULL ,`ip` VARCHAR( 50 ) NULL ,
								`action` VARCHAR( 50 ) NOT NULL , `data` TEXT NULL , `source` TEXT NULL , INDEX ( `subid` , `date` ) ) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;");
		}

		if(version_compare($this->fromVersion, '1.7.3', '<')){
			$this->updateQuery("ALTER TABLE `#__acymailing_mail` ADD `metakey` TEXT NULL , ADD `metadesc` TEXT NULL ");
		}

		if(version_compare($this->fromVersion, '1.8.4', '<')){
			$this->updateQuery("UPDATE `#__acymailing_config` as a, `#__acymailing_config` as b SET a.`value` = b.`value` WHERE a.`namekey`= 'queue_nbmail_auto' AND b.`namekey`= 'queue_nbmail' ");
			$this->updateQuery("UPDATE `#__acymailing_mail` SET `body` = CONCAT(`body`,'<p>{survey}</p>') WHERE type = 'notification' AND `alias` IN ('notification_refuse','notification_unsub','notification_unsuball')");
		}

		if(version_compare($this->fromVersion, '1.8.5', '<')){
			$metaFile = ACYMAILING_FRONT.'metadata.xml';
			if(file_exists($metaFile)) acymailing_deleteFile($metaFile);
			$this->updateQuery('ALTER TABLE #__acymailing_url DROP INDEX url');
			$this->updateQuery('ALTER TABLE `#__acymailing_url` CHANGE `url` `url` TEXT NOT NULL');
			$this->updateQuery('ALTER TABLE `#__acymailing_url` ADD INDEX `url` ( `url` ( 250 ) ) ');
			$this->updateQuery("UPDATE `#__acymailing_mail` SET `body` = CONCAT(`body`,'<p>Subscription : {user:subscription}</p>') WHERE type = 'notification' AND `alias` = 'notification_created'");
		}

		if(version_compare($this->fromVersion, '1.9.1', '<')){
			$this->updateQuery('ALTER TABLE `#__acymailing_history` ADD `mailid` MEDIUMINT UNSIGNED NULL');

			$this->updateQuery('CREATE TABLE IF NOT EXISTS `#__acymailing_rules` (
				`ruleid` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
				`name` VARCHAR( 250 ) NOT NULL ,
				`ordering` SMALLINT UNSIGNED NULL ,
				`regex` VARCHAR( 250 ) NOT NULL ,
				`executed_on` TEXT NOT NULL ,
				`action_message` TEXT NOT NULL ,
				`action_user` TEXT NOT NULL ,
				`published` TINYINT UNSIGNED NOT NULL
				)');
			$this->updateQuery("UPDATE `#__acymailing_mail` SET `body` = CONCAT(`body`,'<p>Subscription : {user:subscription}</p>') WHERE type = 'notification' AND `alias` IN ( 'notification_unsuball','notification_refuse','notification_unsub')");
			$this->updateQuery("REPLACE INTO `#__acymailing_config` (`namekey`,`value`) VALUES ('auto_bounce','0')");
		}

		if(version_compare($this->fromVersion, '3.0.1', '<')){
			$this->updateQuery('ALTER TABLE `#__acymailing_mail` ADD `filter` TEXT NULL');

			$this->updateQuery("ALTER TABLE `#__acymailing_subscriber` CHANGE `userid` `userid` INT UNSIGNED NOT NULL DEFAULT '0'");
		}

		if(version_compare($this->fromVersion, '3.5.1', '<')){
			if(file_exists(ACYMAILING_FRONT.'sef_ext.php')) acymailing_deleteFile(ACYMAILING_FRONT.'sef_ext.php');

			$this->updateQuery("ALTER TABLE `#__acymailing_queue` ADD `paramqueue` VARCHAR( 250 ) NULL ");

			if(!ACYMAILING_J16){
				$this->updateQuery("DELETE FROM `#__plugins` WHERE folder = 'acymailing' AND element LIKE 'tagvm%'");
			}else{
				$this->updateQuery("DELETE FROM `#__extensions` WHERE folder = 'acymailing' AND element LIKE 'tagvm%'");
			}
		}

		if(version_compare($this->fromVersion, '3.6.1', '<')){
			$this->updateQuery("ALTER TABLE `#__acymailing_rules` CHANGE `regex` `regex` TEXT NOT NULL");
			$this->updateQuery("ALTER TABLE `#__acymailing_stats` ADD `bouncedetails` TEXT NULL");
		}

		if(version_compare($this->fromVersion, '3.7.1', '<')){
			$this->updateQuery("ALTER TABLE `#__acymailing_userstats` ADD `ip` VARCHAR( 100 ) NULL");
			$this->updateQuery("ALTER TABLE `#__acymailing_urlclick` ADD `ip` VARCHAR( 100 ) NULL");
		}

		if(version_compare($this->fromVersion, '3.8.1', '<')){
			$this->updateQuery("UPDATE #__acymailing_mail SET subject = CONCAT(subject,' ','{mainreport}') WHERE type = 'notification' AND alias = 'report' AND subject NOT LIKE '%mainreport%' LIMIT 1");
		}

		if(version_compare($this->fromVersion, '3.8.2', '<')){
			$this->updateQuery("INSERT IGNORE INTO `#__acymailing_config` (`namekey`,`value`) VALUES ('optimize_listsub',0),('optimize_stats',0),('optimize_list',0),('optimize_mail',0),('optimize_userstats',0),('optimize_urlclick',0),('optimize_history',0),('optimize_template',0),('optimize_queue',0),('optimize_subscriber',0) ");
		}

		$file = ACYMAILING_FRONT.'views'.DS.'newsletter'.DS.'metadata.xml';
		if(file_exists($file)) acymailing_deleteFile($file);

		$file = ACYMAILING_BACK.'admin.acymailing.php';
		if(file_exists($file)) acymailing_deleteFile($file);

		if(version_compare($this->fromVersion, '4.0.0', '<')){

			$allModules = acymailing_loadObjectList("SELECT params,id FROM #__modules WHERE module = 'mod_acymailing'");

			foreach($allModules as $oneMod){
				$newParams = preg_replace('#fieldsize=.*#i', 'fieldsize=80%', $oneMod->params);
				$newParams = preg_replace('#"fieldsize":"[^"]*"#i', '"fieldsize":"80%"', $newParams);
				$this->updateQuery("UPDATE #__modules SET params = ".acymailing_escapeDB($newParams)." WHERE id = ".intval($oneMod->id));
			}

			$allFields = acymailing_loadObjectList("SELECT options,fieldid FROM #__acymailing_fields WHERE type IN ('phone','text','date','file') AND options LIKE '%size%'");

			foreach($allFields as $oneField){
				$options = unserialize($oneField->options);
				$options['size'] = intval($options['size'] * 5);
				$this->updateQuery("UPDATE #__acymailing_fields SET options = ".acymailing_escapeDB(serialize($options))." WHERE fieldid = ".intval($oneField->fieldid));
			}
		}

		if(is_dir(ACYMAILING_BACK.'inc'.DS.'openflash')){
			acymailing_deleteFolder(ACYMAILING_BACK.'inc'.DS.'openflash');
		}
		if(is_dir(ACYMAILING_INC.'openflash')){
			acymailing_deleteFolder(ACYMAILING_INC.'openflash');
		}

		if(version_compare($this->fromVersion, '4.2.0', '<')){
			$this->updateQuery("ALTER TABLE `#__acymailing_template` ADD `thumb` VARCHAR( 250 ) NULL , ADD `readmore` VARCHAR( 250 ) NULL ");

			$allTemplates = acymailing_loadObjectList("SELECT tempid, description FROM #__acymailing_template WHERE `thumb` IS NULL");
			foreach($allTemplates as $oneTemplate){
				if(preg_match('#<img[^>]*src="([^"]*)"[^>]*>#Ui', $oneTemplate->description, $onethumb)){
					$this->updateQuery('UPDATE #__acymailing_template SET `description` = '.acymailing_escapeDB(str_replace($onethumb[0], '', $oneTemplate->description)).', `thumb` = '.acymailing_escapeDB($onethumb[1]).' WHERE tempid = '.$oneTemplate->tempid);
				}
			}

			$this->updateQuery("ALTER TABLE `#__acymailing_subscriber` ADD `confirmed_date` INT UNSIGNED NOT NULL DEFAULT '0', ADD `confirmed_ip` VARCHAR(100) NULL , ADD `lastopen_date` INT UNSIGNED NOT NULL DEFAULT '0', ADD `lastclick_date` INT UNSIGNED NOT NULL DEFAULT '0'");
			$this->updateQuery('UPDATE #__acymailing_subscriber as sub JOIN #__acymailing_history as hist ON sub.subid = hist.subid AND hist.action = "confirmed" SET sub.confirmed_date = hist.date, sub.confirmed_ip = hist.ip WHERE sub.confirmed_date = 0');
			$this->updateQuery('UPDATE #__acymailing_subscriber as sub JOIN #__acymailing_userstats as stats ON sub.subid = stats.subid SET sub.lastopen_date = stats.opendate WHERE sub.lastopen_date = 0');
			$this->updateQuery('UPDATE #__acymailing_subscriber as sub JOIN #__acymailing_urlclick as url ON sub.subid = url.subid SET sub.lastclick_date = url.date WHERE sub.lastclick_date = 0');
			$this->updateQuery('ALTER TABLE `#__acymailing_list` CHANGE `ordering` `ordering` SMALLINT UNSIGNED NULL DEFAULT \'0\'');
			$this->updateQuery('ALTER TABLE `#__acymailing_template` CHANGE `ordering` `ordering` SMALLINT UNSIGNED NULL DEFAULT \'0\'');

			$templateClass = acymailing_get('class.template');
			for($i = 1; $i <= 10; $i++){
				$templateClass->createTemplateFile($i);
			}
		}

		if(version_compare($this->fromVersion, '4.3.0', '<')){
			if(!ACYMAILING_J16){
				$queryReplace = "UPDATE `#__plugins` SET `name` = REPLACE(`name`,'(beta)','') WHERE `element` = 'acyeditor'";
			}else{
				$queryReplace = "UPDATE `#__extensions` SET `name` = REPLACE(`name`,'(beta)','') WHERE `element` = 'acyeditor'";
			}
			$this->updateQuery($queryReplace);

			if(!ACYMAILING_J16){
				$existingEntry = acymailing_loadResult("SELECT `params` FROM #__plugins WHERE `element` = 'urltracker' LIMIT 1");
				$pattern = '#trackingsystem=(.*)#i';
			}else{
				$existingEntry = acymailing_loadResult("SELECT `params` FROM #__extensions WHERE `element` = 'urltracker' LIMIT 1");
				$pattern = '#"trackingsystem":"([^"]*)"#i';
			}
			$trackingMode = 'acymailing';
			if(preg_match($pattern, $existingEntry, $autosubResult)){
				$trackingMode = $autosubResult[1];
			}
			if($trackingMode == 'googleacy') $trackingMode = 'acymailing,google';
			$this->updateQuery("INSERT IGNORE INTO `#__acymailing_config` (`namekey`,`value`) VALUES ('trackingsystem',".acymailing_escapeDB($trackingMode).")");
		}

		if(version_compare($this->fromVersion, '4.3.1', '<')){
			$query = 'CREATE TABLE IF NOT EXISTS `#__acymailing_geolocation` (`geolocation_id` int unsigned NOT NULL AUTO_INCREMENT, `geolocation_subid` int unsigned NOT NULL DEFAULT \'0\',';
			$query .= ' `geolocation_type` varchar(255) NOT NULL DEFAULT \'subscription\', `geolocation_ip` varchar(255) NOT NULL DEFAULT \'\', `geolocation_created` int unsigned NOT NULL DEFAULT \'0\',';
			$query .= ' `geolocation_latitude` decimal(9,6) NOT NULL DEFAULT \'0.000000\', `geolocation_longitude` decimal(9,6) NOT NULL DEFAULT \'0.000000\', `geolocation_postal_code` varchar(255) NOT NULL DEFAULT \'\',';
			$query .= ' `geolocation_country` varchar(255) NOT NULL DEFAULT \'\', `geolocation_country_code` varchar(255) NOT NULL DEFAULT \'\', `geolocation_state` varchar(255) NOT NULL DEFAULT \'\',';
			$query .= ' `geolocation_state_code` varchar(255) NOT NULL DEFAULT \'\', `geolocation_city` varchar(255) NOT NULL DEFAULT \'\',';
			$query .= ' PRIMARY KEY (`geolocation_id`), KEY `geolocation_type` (`geolocation_subid`, `geolocation_type`)) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;';
			$this->updateQuery($query);
		}

		if(version_compare($this->fromVersion, '4.3.3', '<')){
			$this->updateQuery('UPDATE #__acymailing_list SET access_manage = CONCAT(",",access_manage) WHERE access_manage NOT IN ("all","none","")');
		}

		if(version_compare($this->fromVersion, '4.4.2', '<')){
			$this->updateQuery('ALTER TABLE `#__acymailing_fields` ADD `frontlisting` TINYINT( 3 ) UNSIGNED NOT NULL DEFAULT \'0\', ADD `frontjoomlaprofile` TINYINT( 3 ) UNSIGNED NOT NULL DEFAULT \'0\', ADD `frontjoomlaregistration` TINYINT( 3 ) UNSIGNED NOT NULL DEFAULT \'0\', ADD `joomlaprofile` TINYINT( 3 ) UNSIGNED NOT NULL DEFAULT \'0\'');
			$this->updateQuery('UPDATE `#__acymailing_fields` SET `frontlisting`  = `listing`');

			if(!ACYMAILING_J16){
				$existingEntry = acymailing_loadResult("SELECT `params` FROM #__plugins WHERE `element` = 'regacymailing' LIMIT 1");
				$pattern = '#customfields=(.*)#i';
			}else{
				$existingEntry = acymailing_loadResult("SELECT `params` FROM #__extensions WHERE `element` = 'regacymailing' LIMIT 1");
				$pattern = '#"customfields":"([^"]*)"#i';
			}
			if(preg_match($pattern, $existingEntry, $pregResult)){
				$existingEntries = explode(',', $pregResult[1]);
				foreach($existingEntries as $fieldToDisplay){
					$this->updateQuery("UPDATE `#__acymailing_fields` SET frontjoomlaregistration=1 WHERE namekey=".acymailing_escapeDB(trim($fieldToDisplay)));
				}
			}

			$this->updateQuery("ALTER TABLE `#__acymailing_list` ADD `startrule` VARCHAR(50) NOT NULL DEFAULT '0'");

			if(is_dir(ACYMAILING_ROOT.'plugins'.DS.'editors'.DS.'acyeditor'.DS.'acyeditor'.DS.'kcfinder')){
				acymailing_deleteFolder(ACYMAILING_ROOT.'plugins'.DS.'editors'.DS.'acyeditor'.DS.'acyeditor'.DS.'kcfinder');
			}
			if(is_dir(ACYMAILING_ROOT.'plugins'.DS.'editors'.DS.'acyeditor'.DS.'kcfinder')){
				acymailing_deleteFolder(ACYMAILING_ROOT.'plugins'.DS.'editors'.DS.'acyeditor'.DS.'kcfinder');
			}
			if(is_dir(ACYMAILING_BACK.'extensions'.DS.'plg_editors_acyeditor'.DS.'acyeditor'.DS.'kcfinder')){
				acymailing_deleteFolder(ACYMAILING_BACK.'extensions'.DS.'plg_editors_acyeditor'.DS.'acyeditor'.DS.'kcfinder');
			}
		}

		if(version_compare($this->fromVersion, '4.5.2', '<')){
			$res = acymailing_query("SELECT * FROM #__acymailing_config WHERE namekey='acl_newsletters_manage'");
			if(!empty($res)){
				$this->updateQuery("INSERT IGNORE INTO `#__acymailing_config` (`namekey`,`value`) VALUES ('acl_newsletters_lists', 'all'), ('acl_newsletters_attachments', 'all'), ('acl_newsletters_sender_informations', 'all'), ('acl_newsletters_meta_data','all')");
			}

			$this->updateQuery("ALTER TABLE `#__acymailing_template` ADD `access` VARCHAR( 250 ) NOT NULL DEFAULT 'all'");
			$this->updateQuery("ALTER TABLE `#__acymailing_subscriber` ADD `lastopen_ip` VARCHAR( 100 ) NULL, ADD `lastsent_date` INT UNSIGNED NOT NULL DEFAULT '0'");

			$this->updateQuery("UPDATE #__acymailing_subscriber as sub JOIN #__acymailing_userstats as stats ON sub.subid = stats.subid SET sub.lastopen_ip = stats.ip WHERE stats.ip != ''");

			$this->updateQuery("UPDATE #__acymailing_subscriber as sub JOIN #__acymailing_userstats as stats ON sub.subid = stats.subid SET sub.lastsent_date = stats.senddate");

			$this->updateQuery("ALTER TABLE `#__acymailing_mail` MODIFY `type` ENUM('news','autonews','followup','unsub','welcome','notification','joomlanotification') NOT NULL DEFAULT 'news'");
		}

		if(version_compare($this->fromVersion, '4.6.3', '<')){
			$file = ACYMAILING_ROOT.'plugins'.DS.'editors'.DS.'acyeditor'.DS.'acyeditor_j30.xml';
			if(file_exists($file)) acymailing_deleteFile($file);

			$file = ACYMAILING_ROOT.'plugins'.DS.'system'.DS.'acymailingclassmail'.DS.'acymailingclassmail_j30.xml';
			if(file_exists($file)) acymailing_deleteFile($file);

			if($config->get('mailer_method') == 'smtp_com'){
				$newConfig = new stdClass();
				$newConfig->mailer_method = 'smtp';
				$newConfig->smtp_host = 'retail.smtp.com';
				$newConfig->smtp_port = '2525';
				$newConfig->smtp_username = $config->get('smtp_com_username');
				$newConfig->smtp_password = $config->get('smtp_com_password');
				$newConfig->smtp_auth = 1;
				$newConfig->smtp_keepalive = 1;
				$newConfig->smtp_secured = '';
				$config->save($newConfig);
			}

			$this->updateQuery("ALTER TABLE `#__acymailing_userstats` ADD `browser` VARCHAR( 255 ) DEFAULT NULL, ADD `browser_version` TINYINT UNSIGNED DEFAULT NULL, ADD `is_mobile` TINYINT UNSIGNED DEFAULT NULL, ADD `mobile_os` VARCHAR( 255 ) DEFAULT NULL, ADD `user_agent` VARCHAR( 255 ) DEFAULT NULL");

			$this->updateQuery("ALTER TABLE `#__acymailing_mail` ADD `language` VARCHAR( 50 ) NOT NULL DEFAULT ''");
		}

		if(version_compare($this->fromVersion, '4.7.3', '<')){
			try{
				$res = acymailing_query("SELECT * FROM #__acymailing_config WHERE namekey='acl_newsletters_manage'");
				if(!empty($res)){
					$this->updateQuery("INSERT IGNORE INTO `#__acymailing_config` (`namekey`,`value`) VALUES ('acl_newsletters_abtesting', 'all')");
				}
			}catch(Exception $e){
				$res = null;
			}
			if($res === null) acymailing_enqueueMessage(isset($e) ? $e->getMessage() : substr(strip_tags(acymailing_getDBError()), 0, 200).'...', 'error');

			$this->updateQuery("ALTER TABLE `#__acymailing_mail` ADD `abtesting` VARCHAR( 250 ) DEFAULT NULL");

			$this->updateQuery("ALTER TABLE `#__acymailing_subscriber` ADD `source` VARCHAR( 250 ) NOT NULL DEFAULT ''");
		}

		if(version_compare($this->fromVersion, '4.8.2', '<')){
			$tagsFile = JPATH_SITE.DS.'plugins'.DS.'acymailing'.DS.'tagcontent'.DS.'tagcontenttags.xml';
			if(file_exists($tagsFile)) acymailing_deleteFile($tagsFile);

			$this->updateQuery("ALTER TABLE `#__acymailing_mail` ADD `thumb` VARCHAR( 250 ) DEFAULT NULL");
			$this->updateQuery("ALTER TABLE `#__acymailing_mail` ADD `summary` TEXT NOT NULL");
			$this->updateQuery("ALTER TABLE `#__acymailing_template` ADD `category` VARCHAR( 250 ) NOT NULL DEFAULT ''");
			$this->updateQuery("ALTER TABLE `#__acymailing_list` ADD `category` VARCHAR( 250 ) NOT NULL DEFAULT ''");
			$this->updateQuery("ALTER TABLE `#__acymailing_fields` ADD `access` VARCHAR( 250 ) NOT NULL DEFAULT 'all'");
			$this->updateQuery("ALTER TABLE `#__acymailing_fields` ADD `fieldcat` INT( 11 ) NOT NULL DEFAULT '0'");

			$this->updateQuery("UPDATE `#__acymailing_template` SET body = REPLACE(body,'<tbody>','<tbody class=\"acyeditor_sortable\">') WHERE body LIKE '%acyeditor_%' ");
		}

		if(version_compare($this->fromVersion, '4.9.1', '<')){
			$this->updateQuery("ALTER TABLE `#__acymailing_geolocation` ADD KEY `geolocation_ip_created` (`geolocation_ip`, `geolocation_created`)");
		}

		if(version_compare($this->fromVersion, '4.9.3', '<')){
			$this->updateQuery("ALTER TABLE `#__acymailing_userstats` ADD `bouncerule` VARCHAR( 255 ) NULL");
			$this->updateQuery("ALTER TABLE `#__acymailing_fields` ADD `listingfilter` TINYINT NULL DEFAULT NULL ");
			$this->updateQuery("ALTER TABLE `#__acymailing_fields` ADD `frontlistingfilter` TINYINT NULL DEFAULT NULL ");
		}

		if(version_compare($this->fromVersion, '4.9.4', '<')){
			$this->updateQuery("UPDATE #__acymailing_mail SET body = REPLACE(REPLACE(body, 'newsletter-4/top.png', 'newsletter-4/images/top.png'), 'newsletter-4/bottom.png', 'newsletter-4/images/bottom.png')");
		}

		if(version_compare($this->fromVersion, '5.0.0', '<')){
			$mails = acymailing_loadObjectList('SELECT mailid, attach FROM #__acymailing_mail WHERE attach IS NOT NULL');
			if(!empty($mails)){
				$query = 'INSERT INTO #__acymailing_mail (`mailid`,`attach`) VALUES ';
				$folderPath = acymailing_getFilesFolder();
				foreach($mails as $oneMail){
					$attachments = unserialize($oneMail->attach);
					foreach($attachments as &$oneAttach){
						if(strpos($oneAttach->filename, $folderPath) === false) $oneAttach->filename = $folderPath.'/'.$oneAttach->filename;
					}
					$query .= '('.$oneMail->mailid.','.acymailing_escapeDB(serialize($attachments)).'),';
				}
				$query = rtrim($query, ',');
				$query .= ' ON DUPLICATE KEY UPDATE `attach` = VALUES(`attach`)';
				$this->updateQuery($query);
			}
			$newConfig = new stdClass();
			$newConfig->css_backend = '';
			$config->save($newConfig);
		}

		if(version_compare($this->fromVersion, '5.0.1', '<')){
			$this->updateQuery("ALTER TABLE `#__acymailing_fields` ADD `frontform` TINYINT NULL DEFAULT 1");
			$this->updateQuery("UPDATE `#__acymailing_fields` SET frontform = backend");
		}

		if(version_compare($this->fromVersion, '5.1.0', '<')){
			$this->updateQuery("CREATE TABLE IF NOT EXISTS `#__acymailing_action` (`action_id` int unsigned NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`description` text,`frequency` int unsigned NOT NULL,
	`nextdate` int unsigned NOT NULL,`server` varchar(255) NOT NULL,`port` varchar(50) NOT NULL,`connection_method` varchar(10) NOT NULL DEFAULT '0',`secure_method` varchar(10) NOT NULL DEFAULT '0',
	`self_signed` tinyint NOT NULL DEFAULT '0',`username` varchar(255) NOT NULL,`password` varchar(50) NOT NULL,`userid` int unsigned DEFAULT NULL,`conditions` text,`actions` text,`report` text,
	`published` tinyint NOT NULL DEFAULT '0',`ordering` smallint unsigned NULL DEFAULT '0',PRIMARY KEY (`action_id`)) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;");

			$this->updateQuery("ALTER TABLE `#__acymailing_mail` ADD `favicon` text");
		}

		if(version_compare($this->fromVersion, '5.2.0', '<')){
			$this->updateQuery("ALTER TABLE `#__acymailing_mail` MODIFY `type` ENUM('news','autonews','followup','unsub','welcome','notification','joomlanotification','action') NOT NULL DEFAULT 'news'");

			$this->updateQuery("ALTER TABLE `#__acymailing_mail` ADD `bccaddresses` varchar(250) DEFAULT NULL");
			$managetext = acymailing_getPlugin('acymailing', 'managetext');
			$managetextParams = new acyParameter($managetext->params);

			$possibleVars = array('', 2, 3);
			foreach($possibleVars as $oneSuffix){
				$bcc = $managetextParams->get('bccaddresses'.$oneSuffix);
				$mailids = trim(str_replace(array(',', ' '), ';', $managetextParams->get('bccmailids'.$oneSuffix)));
				if(empty($mailids) || empty($bcc)) continue;

				$emails = explode(';', $mailids);
				acymailing_arrayToInteger($emails);

				$this->updateQuery('UPDATE `#__acymailing_mail` SET bccaddresses = '.acymailing_escapeDB($bcc).' WHERE mailid IN ('.implode(',', $emails).')');
			}

			$this->updateQuery('UPDATE `#__acymailing_rules` SET name = (CASE name WHEN "Action Required" THEN "ACY_RULE_ACTION"
																					 WHEN "Acknowledgement of receipt - in subject" THEN "ACY_RULE_ACKNOWLEDGE"
																					 WHEN "Feedback loop" THEN "ACY_RULE_LOOP"
																					 WHEN "Feedback loop - in body" THEN "ACY_RULE_LOOP_BODY"
																					 WHEN "Mailbox Full" THEN "ACY_RULE_FULL"
																					 WHEN "Blocked by Google Groups" THEN "ACY_RULE_GOOGLE"
																					 WHEN "Mailbox does not exist 1" THEN "ACY_RULE_EXIST1"
																					 WHEN "Message blocked by recipient filters" THEN "ACY_RULE_FILTERED"
																					 WHEN "Mailbox does not exist 2" THEN "ACY_RULE_EXIST2"
																					 WHEN "Domain does not exist" THEN "ACY_RULE_DOMAIN"
																					 WHEN "Temporary failures" THEN "ACY_RULE_TEMPORAR"
																					 WHEN "Failed Permanently" THEN "ACY_RULE_PERMANENT"
																					 WHEN "Acknowledgement of receipt - in body" THEN "ACY_RULE_ACKNOWLEDGE_BODY"
																					 WHEN "Final Rule" THEN "ACY_RULE_FINAL"
																					 ELSE name
																					 END)');

			$this->updateQuery("ALTER TABLE #__acymailing_geolocation ADD `geolocation_continent` varchar(255) NOT NULL DEFAULT '', ADD `geolocation_timezone` varchar(255) NOT NULL DEFAULT ''");
			$this->updateQuery("UPDATE #__acymailing_geolocation SET geolocation_continent = 'Asia' WHERE geolocation_country_code IN ('AF', 'AM', 'AZ', 'BH', 'BD', 'BT', 'BN', 'IO', 'KH', 'CN', 'CX', 'CC', 'CY', 'GE', 'HK', 'IN', 'ID', 'IR', 'IQ', 'IL', 'JP', 'JO', 'KZ', 'KP', 'KR', 'KW', 'KG', 'LA', 'LB', 'MO', 'MY', 'MV', 'MN', 'MM', 'NP', 'OM', 'PK', 'PS', 'PH', 'QA', 'SA', 'SG', 'LK', 'SY', 'TW', 'TJ', 'TH', 'TL', 'TR', 'TM', 'AE', 'UZ', 'VN', 'YE')");
			$this->updateQuery("UPDATE #__acymailing_geolocation SET geolocation_continent = 'Africa' WHERE geolocation_country_code IN ('AO', 'BJ', 'DZ', 'BW', 'BF', 'BI', 'CM', 'CV', 'CF', 'TD', 'KM', 'CD', 'CG', 'CI', 'DJ', 'EG', 'GQ', 'ER', 'ET', 'GA', 'GM', 'GH', 'GN', 'GW', 'KE', 'LS', 'LR', 'LY', 'MG', 'MW', 'ML', 'MR', 'MU', 'YT', 'MA', 'MZ', 'NA', 'NE', 'NG', 'RE', 'RW', 'SH', 'ST', 'SN', 'SC', 'SL', 'SO', 'ZA', 'SD', 'SZ', 'TZ', 'TG', 'TN', 'UG', 'EH', 'ZM', 'ZW')");
			$this->updateQuery("UPDATE #__acymailing_geolocation SET geolocation_continent = 'Europe' WHERE geolocation_country_code IN ('AX', 'AL', 'AT', 'AD', 'BY', 'BE', 'BA', 'BG', 'HR', 'CZ', 'DK', 'EE', 'FO', 'FI', 'FR', 'DE', 'GI', 'GR', 'GG', 'VA', 'HU', 'IS', 'IE', 'IM', 'IT', 'JE', 'LV', 'LI', 'LT', 'LU', 'MK', 'MT', 'MD', 'MC', 'ME', 'NL', 'NO', 'PL', 'PT', 'RO', 'RU', 'SM', 'RS', 'SK', 'SI', 'ES', 'SJ', 'SE', 'CH', 'UA', 'GB')");
			$this->updateQuery("UPDATE #__acymailing_geolocation SET geolocation_continent = 'Oceania' WHERE geolocation_country_code IN ('AS', 'AU', 'CK', 'FJ', 'PF', 'GU', 'KI', 'MH', 'FM', 'NR', 'NC', 'NZ', 'NU', 'NF', 'MP', 'PW', 'PG', 'PN', 'WS', 'SB', 'TK', 'TO', 'TV', 'UM', 'VU', 'WF')");
			$this->updateQuery("UPDATE #__acymailing_geolocation SET geolocation_continent = 'North America' WHERE geolocation_country_code IN ('AI', 'AG', 'AW', 'BS', 'BB', 'BZ', 'BM', 'VG', 'CA', 'KY', 'CR', 'CU', 'DM', 'DO', 'SV', 'GL', 'GD', 'GP', 'GT', 'HT', 'HN', 'JM', 'MQ', 'MX', 'MS', 'AN', 'NI', 'PA', 'PR', 'BL', 'KN', 'LC', 'MF', 'PM', 'VC', 'TT', 'TC', 'US', 'VI')");
			$this->updateQuery("UPDATE #__acymailing_geolocation SET geolocation_continent = 'South America' WHERE geolocation_country_code IN ('AR', 'BO', 'BR', 'CL', 'CO', 'EC', 'FK', 'GF', 'GY', 'PY', 'PE', 'SR', 'UY', 'VE')");
			$this->updateQuery("UPDATE #__acymailing_geolocation SET geolocation_continent = 'Antartica' WHERE geolocation_country_code IN ('AQ', 'BV', 'TF', 'HM', 'GS')");

			if($config->get('captcha_enabled') == 1){
				$this->updateQuery('INSERT INTO `#__acymailing_config` (namekey, value) VALUES ("captcha_plugin", "acycaptcha") ON DUPLICATE KEY UPDATE value="acycaptcha"');
			}else{
				$this->updateQuery('INSERT INTO `#__acymailing_config` (namekey, value) VALUES ("captcha_plugin", "no") ON DUPLICATE KEY UPDATE value="no"');
			}
			try{
				$res = acymailing_loadObjectList('SELECT tempid, stylesheet FROM #__acymailing_template', 'tempid');
				foreach($res as $oneTmpl){
					$changedStyle = preg_replace('/(table *(,[^{}]*)?)({[^}]*font-family)/', '$1, td$3', $oneTmpl->stylesheet);
					$this->updatequery('UPDATE #__acymailing_template SET stylesheet = '.acymailing_escapeDB($changedStyle).' WHERE tempid = '.$oneTmpl->tempid);
				}
			}catch(Exception $e){
				$res = null;
			}
			if($res === null) acymailing_enqueueMessage(isset($e) ? $e->getMessage() : substr(strip_tags(acymailing_getDBError()), 0, 200).'...', 'error');
		}

		if(version_compare($this->fromVersion, '5.5.0', '<')){
			$this->updateQuery("ALTER TABLE #__acymailing_action ADD `delete_wrong_emails` tinyint NOT NULL DEFAULT 0");
			$this->updateQuery("ALTER TABLE #__acymailing_action ADD `senderfrom` tinyint NOT NULL DEFAULT 0");
			$this->updateQuery("ALTER TABLE #__acymailing_action ADD `senderto` tinyint NOT NULL DEFAULT 0");
		}

		if(version_compare($this->fromVersion, '5.6.0', '<')){
			$this->updateQuery("CREATE TABLE IF NOT EXISTS `#__acymailing_forward` (`subid` int unsigned NOT NULL,`mailid` mediumint unsigned NOT NULL, `date` int unsigned NOT NULL,
			`ip` varchar(50) DEFAULT NULL, `nbforwarded` int unsigned NOT NULL, PRIMARY KEY (`subid`,`mailid`)) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;");

			$this->updateQuery("CREATE TABLE IF NOT EXISTS `#__acymailing_tag` (`tagid` smallint unsigned NOT NULL AUTO_INCREMENT, `name` varchar(250) NOT NULL,
			`userid` int unsigned DEFAULT NULL,PRIMARY KEY (`tagid`),KEY `useridindex` (`userid`)) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;");

			$this->updateQuery("CREATE TABLE IF NOT EXISTS `#__acymailing_tagmail` (`tagid` smallint unsigned NOT NULL,	`mailid` mediumint unsigned NOT NULL,
			PRIMARY KEY (`tagid`,`mailid`)) /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci*/;");
		}

		if(version_compare($this->fromVersion, '5.6.5', '<')){
			$this->updateQuery("ALTER TABLE `#__acymailing_mail` MODIFY subject text");
		}

		if(version_compare($this->fromVersion, '5.7.1', '<')){
			$daycron = $config->get('cron_plugins_next', 0);

			$this->updateQuery("ALTER TABLE `#__acymailing_filter` ADD `daycron` int unsigned");
			acymailing_query('UPDATE #__acymailing_filter SET `daycron` = '.intval($daycron).' WHERE `trigger` LIKE "%daycron%"');
		}

		if(version_compare($this->fromVersion, '5.8.0', '<')){
			$this->updateQuery("ALTER TABLE #__acymailing_mail ADD `lastupdate` int unsigned DEFAULT NULL");
			$this->updateQuery("ALTER TABLE #__acymailing_mail ADD `userlastupdate` int unsigned DEFAULT NULL");
		}

		if(version_compare($this->fromVersion, '5.9.0', '<')){
			$this->updateQuery("ALTER TABLE #__acymailing_fields MODIFY `default` TEXT DEFAULT NULL");
			$this->updateQuery("ALTER TABLE #__acymailing_subscriber ADD `filterflags` varchar(50) NOT NULL DEFAULT ''");
			if(substr($config->get('cron_savepath'), 0, 32) == 'media/com_acymailing/logs/report'){
				$this->updateQuery("UPDATE #__acymailing_config SET `value` = 'media/com_acymailing/logs/report{year}_{month}.log' WHERE namekey = 'cron_savepath'");
			}

			$allFilters = acymailing_loadObjectList('SELECT filid, action, filter FROM '.acymailing_table('filter'));
			if(!empty($allFilters)){
				foreach($allFilters as $oneFilter){
					$oneFilter->action = unserialize($oneFilter->action);
					if(!empty($oneFilter->action['type'])) $oneFilter->action['type'] = array($oneFilter->action['type']);

					$oneFilter->filter = unserialize($oneFilter->filter);
					if(!empty($oneFilter->filter['type'])) $oneFilter->filter['type'] = array($oneFilter->filter['type']);

					$this->updateQuery('UPDATE '.acymailing_table('filter').' SET action = '.acymailing_escapeDB(serialize($oneFilter->action)).', filter = '.acymailing_escapeDB(serialize($oneFilter->filter)).' WHERE filid = '.intval($oneFilter->filid));
				}
			}

			$mailFilters = acymailing_loadObjectList('SELECT mailid, filter FROM '.acymailing_table('mail').' WHERE filter LIKE "%type%"');
			if(!empty($mailFilters)){
				foreach($mailFilters as $oneMail){
					$oneMail->filter = unserialize($oneMail->filter);
					if(!empty($oneMail->filter['type'])) $oneMail->filter['type'] = array($oneMail->filter['type']);
					$this->updateQuery('UPDATE '.acymailing_table('mail').' SET filter = '.acymailing_escapeDB(serialize($oneMail->filter)).' WHERE mailid = '.intval($oneMail->mailid));
				}
			}
			$this->updateQuery("ALTER TABLE #__acymailing_template ADD `header` longtext");
			$this->updateQuery("ALTER TABLE #__acymailing_mail MODIFY `type` enum('news','autonews','followup','unsub','welcome','notification','joomlanotification','action', 'article') NOT NULL DEFAULT 'news'");

			if(!ACYMAILING_J16){
				$this->updateQuery("UPDATE #__plugins SET `ordering` = 0 WHERE `element` = 'plginboxactions' AND `folder` = 'acymailing'");
			}else{
				$this->updateQuery("UPDATE #__extensions SET `ordering` = 0 WHERE `element` = 'plginboxactions' AND `folder` = 'acymailing'");
			}
		}

		if(version_compare($this->fromVersion, '5.9.4', '<')){
			if(!ACYMAILING_J16){
				$this->updateQuery("UPDATE #__plugins SET `ordering` = 24 WHERE `element` = 'urltracker' AND `folder` = 'acymailing'");
				$this->updateQuery("UPDATE #__plugins SET `ordering` = 52 WHERE `element` = 'template' AND `folder` = 'acymailing'");
			}else{
				$this->updateQuery("UPDATE #__extensions SET `ordering` = 24 WHERE `element` = 'urltracker' AND `folder` = 'acymailing'");
				$this->updateQuery("UPDATE #__extensions SET `ordering` = 52 WHERE `element` = 'template' AND `folder` = 'acymailing'");
			}
		}
	}

	function updateQuery($query){
		try{
			$res = acymailing_query($query);
		}catch(Exception $e){
			$res = null;
		}
		if($res === null) acymailing_enqueueMessage(isset($e) ? $e->getMessage() : substr(strip_tags(acymailing_getDBError()), 0, 200).'...', 'error');
	}

	function updateJoomailing(){
		$result = acymailing_loadResult("SHOW TABLES LIKE '".acymailing_getPrefix()."joomailing_config'");

		if(empty($result)) return true;


		acymailing_query("INSERT IGNORE INTO `#__acymailing_config` (`namekey`,`value`) SELECT `namekey`, REPLACE(`value`,'com_joomailing','com_acymailing') FROM `#__joomailing_config`");
		acymailing_query("INSERT IGNORE INTO `#__acymailing_list` (`name`, `description`, `ordering`, `listid`, `published`, `userid`, `alias`, `color`, `visible`, `welmailid`, `unsubmailid`, `type`) SELECT `name`, `description`, `ordering`, `listid`, `published`, `userid`, `alias`, `color`, `visible`, `welmailid`, `unsubmailid`, `type` FROM `#__joomailing_list`");
		acymailing_query("INSERT IGNORE INTO `#__acymailing_listcampaign` (`campaignid`, `listid`) SELECT `campaignid`, `listid` FROM `#__joomailing_listcampaign`");
		acymailing_query("INSERT IGNORE INTO `#__acymailing_listmail` (`listid`, `mailid`) SELECT `listid`, `mailid` FROM `#__joomailing_listmail`");
		acymailing_query("INSERT IGNORE INTO `#__acymailing_listsub` (`listid`, `subid`, `subdate`, `unsubdate`, `status`) SELECT `listid`, `subid`, `subdate`, `unsubdate`, `status` FROM `#__joomailing_listsub`");
		acymailing_query("INSERT IGNORE INTO `#__acymailing_mail` (`mailid`, `subject`, `body`, `altbody`, `published`, `senddate`, `created`, `fromname`, `fromemail`, `replyname`, `replyemail`, `type`, `visible`, `userid`, `alias`, `attach`, `html`, `tempid`, `key`, `frequency`, `params`) SELECT `mailid`, `subject`, REPLACE(`body`,'joomailing','acymailing'), REPLACE(`altbody`,'joomailing','acymailing'), `published`, `senddate`, `created`, `fromname`, `fromemail`, `replyname`, `replyemail`, `type`, `visible`, `userid`, `alias`, REPLACE(`attach`,'com_joomailing','com_acymailing'), `html`, `tempid`, `key`, `frequency`, REPLACE(`params`,'com_joomailing','com_acymailing') FROM `#__joomailing_mail`");
		acymailing_query("INSERT IGNORE INTO `#__acymailing_queue` (`senddate`, `subid`, `mailid`, `priority`, `try`) SELECT `senddate`, `subid`, `mailid`, `priority`, `try` FROM `#__joomailing_queue`");
		acymailing_query("INSERT IGNORE INTO `#__acymailing_stats` (`mailid`, `senthtml`, `senttext`, `senddate`, `openunique`, `opentotal`, `bounceunique`, `fail`, `clicktotal`, `clickunique`, `unsub`, `forward`) SELECT `mailid`, `senthtml`, `senttext`, `senddate`, `openunique`, `opentotal`, `bounceunique`, `fail`, `clicktotal`, `clickunique`, `unsub`, `forward` FROM `#__joomailing_stats`");
		acymailing_query("INSERT IGNORE INTO `#__acymailing_subscriber` (`subid`, `email`, `userid`, `name`, `created`, `confirmed`, `enabled`, `accept`, `ip`, `html`, `key`) SELECT `subid`, `email`, `userid`, `name`, `created`, `confirmed`, `enabled`, `accept`, `ip`, `html`, `key` FROM `#__joomailing_subscriber`");
		acymailing_query("INSERT IGNORE INTO `#__acymailing_template` (`tempid`, `name`, `description`, `body`, `altbody`, `created`, `published`, `premium`, `ordering`, `namekey`, `styles`) SELECT `tempid`, `name`, REPLACE(`description`,'joomailing','acymailing'), REPLACE(`body`,'joomailing','acymailing'), REPLACE(`altbody`,'joomailing','acymailing'), `created`, `published`, `premium`, `ordering`, `namekey`, REPLACE(`styles`,'joomailing','acymailing') FROM `#__joomailing_template`");
		acymailing_query("INSERT IGNORE INTO `#__acymailing_url` (`urlid`, `name`, `url`) SELECT `urlid`, REPLACE(`name`,'com_joomailing','com_acymailing'), REPLACE(`url`,'com_joomailing','com_acymailing') FROM `#__joomailing_url`");
		acymailing_query("INSERT IGNORE INTO `#__acymailing_urlclick` (`urlid`, `mailid`, `click`, `subid`, `date`) SELECT `urlid`, `mailid`, `click`, `subid`, `date` FROM `#__joomailing_urlclick`");
		acymailing_query("INSERT IGNORE INTO `#__acymailing_userstats` (`mailid`, `subid`, `html`, `sent`, `senddate`, `open`, `opendate`, `bounce`, `fail`) SELECT `mailid`, `subid`, `html`, `sent`, `senddate`, `open`, `opendate`, `bounce`, `fail` FROM `#__joomailing_userstats`");

		acymailing_query("DROP TABLE IF EXISTS `#__joomailing_config`, `#__joomailing_list`, `#__joomailing_listcampaign`, `#__joomailing_listmail`, `#__joomailing_listsub`, `#__joomailing_mail`, `#__joomailing_queue` , `#__joomailing_stats`, `#__joomailing_subscriber`, `#__joomailing_template` , `#__joomailing_url`, `#__joomailing_urlclick`, `#__joomailing_userstats`");

		acymailing_query("UPDATE `#__modules` SET `title` = REPLACE(`title`,'JooMailing','AcyMailing'), `module` = REPLACE(`module`,'joomailing','acymailing'), `params` = REPLACE(`params`,'joomailing','acymailing')");
		acymailing_query("UPDATE `#__plugins` SET `name` = REPLACE(REPLACE(REPLACE(`name`,'jooMailing','AcyMailing'),'joomailing','acymailing'),'JooMailing','AcyMailing'), `element` = REPLACE(`element`,'joomailing','acymailing'), `folder` = REPLACE(`folder`,'joomailing','acymailing'), `params` = REPLACE(`params`,'joomailing','acymailing')");

		acymailing_query("DELETE FROM `#__components` WHERE `option` LIKE '%joomailing%' OR `admin_menu_link` LIKE '%joomailing%'");

		acymailing_query("UPDATE `#__menu` SET `menutype` = REPLACE(`menutype`,'joomailing','acymailing'), `name` = REPLACE(`name`,'joomailing','acymailing'), `alias` = REPLACE(`alias`,'joomailing','acymailing'), `link` = REPLACE(`link`,'joomailing','acymailing')");


		$newFile = '<?php
					$url = \'index.php?option=com_acymailing\';
					foreach($_GET as $name => $value){
						if($name == \'option\') continue;
						$url .= \'&\'.$name.\'=\'.$value;
					}
					acymailing_redirect($url);
					';

		@file_put_contents(rtrim(JPATH_SITE, DS).DS.'components'.DS.'com_joomailing'.DS.'joomailing.php', $newFile);
		@file_put_contents(rtrim(JPATH_ADMINISTRATOR, DS).DS.'components'.DS.'com_joomailing'.DS.'admin.joomailing.php', $newFile);
	}

	function addPref(){
		$this->level = ucfirst($this->level);

		$allPref = array();

		$allPref['level'] = $this->level;
		$allPref['version'] = $this->version;
		$allPref['smtp_port'] = '';

		$allPref['from_name'] = acymailing_getCMSConfig('fromname');
		$allPref['from_email'] = acymailing_getCMSConfig('mailfrom');
		$allPref['bounce_email'] = acymailing_getCMSConfig('mailfrom');
		$allPref['mailer_method'] = acymailing_getCMSConfig('mailer');
		$allPref['sendmail_path'] = acymailing_getCMSConfig('sendmail');
		$smtpinfos = explode(':', acymailing_getCMSConfig('smtphost'));
		$allPref['smtp_port'] = acymailing_getCMSConfig('smtpport');
		$allPref['smtp_secured'] = acymailing_getCMSConfig('smtpsecure');
		$allPref['smtp_auth'] = acymailing_getCMSConfig('smtpauth');
		$allPref['smtp_username'] = acymailing_getCMSConfig('smtpuser');
		$allPref['smtp_password'] = acymailing_getCMSConfig('smtppass');

		$allPref['reply_name'] = $allPref['from_name'];
		$allPref['reply_email'] = $allPref['from_email'];
		$allPref['cron_sendto'] = $allPref['from_email'];

		$allPref['add_names'] = '1';
		$allPref['encoding_format'] = '8bit';
		$allPref['charset'] = 'UTF-8';
		$allPref['word_wrapping'] = '150';
		$allPref['hostname'] = '';
		$allPref['embed_images'] = '0';
		$allPref['embed_files'] = '1';
		$allPref['editor'] = 'acyeditor';
		$allPref['multiple_part'] = '1';
		$allPref['smtp_host'] = $smtpinfos[0];
		if(isset($smtpinfos[1])) $allPref['smtp_port'] = $smtpinfos[1];
		if(!in_array($allPref['smtp_secured'], array('tls', 'ssl'))) $allPref['smtp_secured'] = '';

		$allPref['queue_nbmail'] = '40';
		$allPref['queue_nbmail_auto'] = '70';
		$allPref['queue_type'] = 'auto';
		$allPref['queue_try'] = '3';
		$allPref['queue_pause'] = '120';
		$allPref['allow_visitor'] = '1';
		$allPref['require_confirmation'] = '0';
		$allPref['priority_newsletter'] = '3';
		$allPref['allowedfiles'] = 'zip,doc,docx,pdf,xls,txt,gzip,rar,jpg,jpeg,gif,xlsx,pps,csv,bmp,ico,odg,odp,ods,odt,png,ppt,swf,xcf,mp3,wma';
		$allPref['uploadfolder'] = 'media/com_acymailing/upload';
		$allPref['confirm_redirect'] = '';
		$allPref['subscription_message'] = '1';
		$allPref['notification_unsuball'] = '';
		$allPref['cron_next'] = '1251990901';
		$allPref['confirmation_message'] = '1';
		$allPref['welcome_message'] = '1';
		$allPref['unsub_message'] = '1';
		$allPref['cron_last'] = '0';
		$allPref['cron_fromip'] = '';
		$allPref['cron_report'] = '';
		$allPref['cron_frequency'] = '900';
		$allPref['cron_sendreport'] = '2';

		$allPref['cron_fullreport'] = '1';
		$allPref['cron_savereport'] = '2';
		$allPref['cron_savepath'] = 'media/com_acymailing/logs/report{year}_{month}.log';
		$allPref['notification_created'] = '';
		$allPref['notification_accept'] = '';
		$allPref['notification_refuse'] = '';
		$allPref['forward'] = '0';

		$allPref['priority_followup'] = '2';
		$allPref['unsub_redirect'] = '';
		$allPref['use_sef'] = '0';
		$allPref['itemid'] = '0';
		$allPref['css_module'] = 'default';
		$allPref['css_frontend'] = 'default';
		$allPref['css_backend'] = '';
		$allPref['bootstrap_frontend'] = 0;
		$allPref['export_excelsecurity'] = 1;

		$allPref['unsub_reasons'] = serialize(array('UNSUB_SURVEY_FREQUENT', 'UNSUB_SURVEY_RELEVANT'));

		$allPref['security_key'] = acymailing_generateKey(30);


		$allPref['installcomplete'] = '0';

		$allPref['Starter'] = '0';
		$allPref['Essential'] = '1';
		$allPref['Business'] = '2';
		$allPref['Enterprise'] = '3';
		$allPref['Sidekick'] = '4';

		$query = "INSERT IGNORE INTO `#__acymailing_config` (`namekey`,`value`) VALUES ";
		foreach($allPref as $namekey => $value){
			$query .= '('.acymailing_escapeDB($namekey).','.acymailing_escapeDB($value).'),';
		}
		$query = rtrim($query, ',');

		try{
			$res = acymailing_query($query);
		}catch(Exception $e){
			$res = null;
		}
		if($res === null){
			acymailing_display(isset($e) ? $e->getMessage() : substr(strip_tags(acymailing_getDBError()), 0, 200).'...', 'error');
			return false;
		}
		return true;
	}
}

class acymailingUninstall{
	function __construct(){
	}

	function message(){
		?>
		You uninstalled the AcyMailing component.<br/>
		AcyMailing also unpublished the modules attached to the component.<br/><br/>
		If you want to completely uninstall AcyMailing, please select all the AcyMailing modules and plugins and uninstall them from the Joomla Extensions Manager.<br/>
		Then execute this query via phpMyAdmin to remove all AcyMailing data:<br/><br/>
		DROP TABLE <?php


		$db = JFactory::getDBO();
		$db->setQuery("SHOW TABLES LIKE '".$db->getPrefix()."acymailing%' ");
		$jversion = preg_replace('#[^0-9\.]#i', '', JVERSION);
		if(version_compare($jversion, '3.0.0', '>=')) $tables = $db->loadColumn();
		else $tables = $db->loadResultArray();

		echo implode(' , ', $tables);

		?>;<br/><br/>
		If you DO NOT execute the query, you will be able to install AcyMailing again without losing data.<br/>
		Please note that you don't have to uninstall AcyMailing to install a new version, simply install it over the current version.
		<?php
	}

	function unpublishModules(){
		$db = JFactory::getDBO();
		$db->setQuery("UPDATE `#__modules` SET `published` = 0 WHERE `module` LIKE '%acymailing%'");

		$jversion = preg_replace('#[^0-9\.]#i', '', JVERSION);
		$method = version_compare($jversion, '4.0.0', '>=') ? 'execute' : 'query';

		$db->$method();
	}
}
components/com_acymailing/extensions/plg_acymailing_share/index.html000060400000000054152453623450022245 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_acymailing_share/share.php000060400000021016152453623450022064 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class plgAcymailingShare extends JPlugin{
	var $pictresults = array();

	function __construct(&$subject, $config){
		parent::__construct($subject, $config);
		if(!isset($this->params)){
			$plugin = JPluginHelper::getPlugin('acymailing', 'share');
			$this->params = new acyParameter($plugin->params);
		}
	}

	function acymailing_getPluginType(){

		if($this->params->get('frontendaccess') == 'none' && !acymailing_isAdmin()) return;
		$onePlugin = new stdClass();
		$onePlugin->name = acymailing_translation_sprintf('SOCIAL_SHARE', '...');
		$onePlugin->function = 'acymailingtagshare_show';
		$onePlugin->help = 'plugin-share';

		return $onePlugin;
	}

	function _getPictures($folder){
		$allFolders = acymailing_getFolders($folder);
		foreach($allFolders as $oneFolder){
			$this->_getPictures($folder.DS.$oneFolder);
		}
		$allFiles = acymailing_getFiles($folder, $this->regex);
		foreach($allFiles as $oneFile){
			$this->pictresults[substr($oneFile, 0, 4)][$oneFile.filesize($folder.DS.$oneFile)] = $folder.DS.$oneFile;
		}
	}

	function acymailingtagshare_show(){
		$uploadFolders = acymailing_getFilesFolder('upload', true);
		$uploadFolder = acymailing_getVar('string', 'currentFolder', $uploadFolders[0]);
		$uploadPath = acymailing_cleanPath(ACYMAILING_ROOT.trim(str_replace('/', DS, trim($uploadFolder)), DS));
		$uploadedFile = acymailing_getVar('array', 'socialfile', array(), 'files');
		
		if(!empty($uploadedFile) && !empty($uploadedFile['name'])){
			$uploadedFile['name'] = acymailing_getVar('string', 'socialchoice').substr($uploadedFile['name'], strrpos($uploadedFile['name'], '.'));
			acymailing_importFile($uploadedFile, $uploadPath, true, 150);
		}
		
		
		$networks = array();
		$networks['facebook'] = 'Facebook';
		$networks['linkedin'] = 'LinkedIn';
		$networks['twitter'] = 'Twitter';
		$networks['google'] = 'Google+';
		$networks['print'] = acymailing_translation('ACY_PRINT');

		$k = 0;
		
		$this->regex = '('.implode('|', array_keys($networks)).').*(png|gif|jpeg|jpg)';
		$this->_getPictures(ACYMAILING_MEDIA);

		$socialList = array();
		$socialList[] = acymailing_selectOption('facebook', 'Facebook');
		$socialList[] = acymailing_selectOption('linkedIn', 'LinkedIn');
		$socialList[] = acymailing_selectOption('twitter', 'Twitter');
		$socialList[] = acymailing_selectOption('google', 'Google+');
		$socialChoice = acymailing_select($socialList, 'socialchoice', 'size="1" style="width:100px;"');
?>
		<br style="clear:both;">

		<div class="onelineblockoptions">
			<span class="acyblocktitle"><?php echo acymailing_translation('UPLOAD_NEW_IMAGE'); ?></span>

			<table>
				<tr>
					<td style="padding: 5px;"><?php echo $socialChoice; ?></td>
					<td style="padding: 5px;"><input type="file" name="socialfile"></td>
					<td style="padding: 5px;"><input class="acymailing_button_grey" type="submit" value="Upload"></td>
				</tr>
			</table>
		</div>
<?php
		foreach($networks as $name => $desc){
			$shortName = substr($name, 0, 4);
			if(empty($this->pictresults[$shortName])) continue;

			if($desc == acymailing_translation('ACY_PRINT')){
				$legendTxt = $desc;
			}else{
				$legendTxt = acymailing_translation_sprintf('SOCIAL_SHARE', $desc);
			}

			echo '<div class="onelineblockoptions">
					<span class="acyblocktitle">'.$legendTxt.'</span>';
			foreach($this->pictresults[$shortName] as $onePict){
				$imgPath = preg_replace('#^'.preg_quote(ACYMAILING_ROOT, '#').'#i', ACYMAILING_LIVE, $onePict);
				$imgPath = str_replace(DS, '/', $imgPath);

				if($desc == acymailing_translation('ACY_PRINT')){
					$insertedtag = '<a target="_blank" href="{print:newsletter}" title="'.acymailing_translation('ACY_PRINT').'" ><img src="'.$imgPath.'" alt="'.$desc.'" /></a>';
				}else{
					$insertedtag = '<a target="_blank" href="{sharelink:'.$name.'}" title="'.acymailing_translation_sprintf('SOCIAL_SHARE', $desc).'" ><img src="'.$imgPath.'" alt="'.$desc.'" /></a>';
				}

				echo '<img style="max-width:200px;cursor:pointer;padding:5px;" onclick="setTag(\''.htmlentities($insertedtag).'\');insertTag();" src="'.$imgPath.'" />';
			}
			echo '</div>';
			$k = 1 - $k;
		}
	}

	function acymailing_replacetags(&$email, $send = true){
		if(acymailing_getVar('none', 'task', '') == 'replacetags') return;
		$this->_print($email, $send);
		$this->_shareButtons($email, $send);
	}

	function _shareButtons(&$email, $send = true){
		$match = '#(?:{|%7B)(share|sharelink):(.*)(?:}|%7D)#Ui';
		$variables = array('body', 'altbody');
		$found = false;
		$results = array();
		foreach($variables as $var){
			if(empty($email->$var)) continue;
			$found = preg_match_all($match, $email->$var, $results[$var]) || $found;
			if(empty($results[$var][0])) unset($results[$var]);
		}

		if(!$found) return;

		$archiveLink = acymailing_frontendLink('index.php?option=com_acymailing&ctrl=archive&task=view&mailid='.$email->mailid, false, $this->params->get('template', 'component') == 'component' ? true : false);
		if(empty($email->published)){
			$archiveLink .= (strpos($archiveLink, '?') ? '&' : '?').'time='.time();
		}

		$tags = array();
		foreach($results as $var => $allresults){
			foreach($allresults[0] as $numres => $tagname){
				if(isset($tags[$tagname])) continue;
				$arguments = explode('|', $allresults[2][$numres]);
				$tag = new stdClass();
				$tag->network = $arguments[0];
				for($i = 1, $a = count($arguments); $i < $a; $i++){
					$args = explode(':', $arguments[$i]);
					if(isset($args[1])){
						$tag->{$args[0]} = $args[1];
					}else{
						$tag->{$args[0]} = true;
					}
				}

				$link = '';
				if($tag->network == 'facebook'){
					$link = 'http://www.facebook.com/sharer.php?u='.urlencode($archiveLink).'&t='.urlencode($email->subject);
					$tags[$tagname] = '<a target="_blank" href="'.$link.'" title="'.acymailing_translation_sprintf('SOCIAL_SHARE', 'Facebook').'"><img alt="Facebook" src="'.ACYMAILING_LIVE.$this->params->get('picturefb', 'media/com_acymailing/images/facebookshare.png').'" /></a>';
				}elseif($tag->network == 'twitter'){
					$text = acymailing_translation_sprintf('SHARE_TEXT', $archiveLink);
					$link = 'http://twitter.com/home?status='.urlencode($text);
					$tags[$tagname] = '<a target="_blank" href="'.$link.'" title="'.acymailing_translation_sprintf('SOCIAL_SHARE', 'Twitter').'"><img alt="Twitter" src="'.ACYMAILING_LIVE.$this->params->get('picturetwitter', 'media/com_acymailing/images/twittershare.png').'" /></a>';
				}elseif($tag->network == 'linkedin'){
					$link = 'http://www.linkedin.com/shareArticle?mini=true&url='.urlencode($archiveLink).'&title='.urlencode($email->subject);
					$tags[$tagname] = '<a target="_blank" href="'.$link.'" title="'.acymailing_translation_sprintf('SOCIAL_SHARE', 'LinkedIn').'"><img alt="LinkedIn" src="'.ACYMAILING_LIVE.$this->params->get('picturelinkedin', 'media/com_acymailing/images/linkedin.png').'" /></a>';
				}elseif($tag->network == 'google'){
					$link = 'https://plus.google.com/share?url='.urlencode($archiveLink);
					$tags[$tagname] = '<a target="_blank" href="'.$link.'" title="'.acymailing_translation_sprintf('SOCIAL_SHARE', 'Google+').'"><img alt="Google+" src="'.ACYMAILING_LIVE.$this->params->get('picturegoogleplus', 'media/com_acymailing/images/google_plusshare.png').'" /></a>';
				}

				if($allresults[1][$numres] == 'sharelink'){
					$tags[$tagname] = $link;
				}

				if(file_exists(ACYMAILING_MEDIA.'plugins'.DS.'share.php')){
					ob_start();
					require(ACYMAILING_MEDIA.'plugins'.DS.'share.php');
					$tags[$tagname] = ob_get_clean();
				}
			}
		}

		$email->body = str_replace(array_keys($tags), $tags, $email->body);
		$email->altbody = str_replace(array_keys($tags), '', $email->altbody);
	}

	private function _print(&$email, $send = true){
		$variables = array('subject', 'body', 'altbody');
		$acypluginsHelper = acymailing_get('helper.acyplugins');
		$tags = $acypluginsHelper->extractTags($email, 'print');

		$archiveLink = acymailing_frontendLink('index.php?option=com_acymailing&ctrl=archive&task=view&mailid='.$email->mailid, true, $this->params->get('template', 'component') == 'component' ? true : false);
		$addkey = (!empty($email->key)) ? '&key='.$email->key : '';
		$adduserkey = '&subid={subtag:subid}-{subtag:key}';
		$link = $archiveLink.'&print=1'.$addkey.$adduserkey;

		foreach($variables as $var){
			if(empty($email->$var)) continue;
			$email->$var = str_replace(array_keys($tags), $link, $email->$var);
		}
	}
}//endclass
components/com_acymailing/extensions/plg_acymailing_share/share.xml000060400000007332152453623450022102 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/plugin-install.dtd">
<install type="plugin" version="1.5" method="upgrade" group="acymailing">
	<name>AcyMailing : share on social networks</name>
	<creationDate>August 2010</creationDate>
	<version>1.0.0</version>
	<author>Acyba</author>
	<authorEmail>dev@acyba.com</authorEmail>
	<authorUrl>http://www.acyba.com</authorUrl>
	<copyright>Copyright (C) 2009-2018 ACYBA SAS - All rights reserved..</copyright>
	<license>GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html</license>
	<description>This plugin enables you to add a share icon for social networks</description>
	<files>
		<filename plugin="share">share.php</filename>
	</files>
	<params addpath="/components/com_acymailing/params">
		<param name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-share"/>
		<param name="template" type="radio" default="component" label="Display the online version" description="Select if you want to display the online version (when the user will share your link on the social network) without any Joomla module (no template) or inside your default Joomla Template">
			<option value="standard">Standard template</option>
			<option value="component">No template</option>
		</param>

		<param name="picturefb" type="text" label="Facebook picture - DEPRECATED" default="media/com_acymailing/images/facebookshare.png" />
		<param name="picturetwitter" type="text" label="Twitter picture - DEPRECATED" default="media/com_acymailing/images/twittershare.png" />
		<param name="picturelinkedin" type="text" label="LinkedIn picture - DEPRECATED" default="media/com_acymailing/images/linkedin.png" />
		<param name="picturegoogleplus" type="text" label="Google+ picture - DEPRECATED" default="media/com_acymailing/images/google_plusshare.png" />
		<param name="frontendaccess" type="list" default="all" label="Front-end Access" description="You can restrict the access to this tag system with this option">
			<option value="all">Always display this tag system</option>
			<option value="none">Don't display this tag system on the front-end</option>
		</param>

	</params>
	<config>
		<fields name="params" addfieldpath="/components/com_acymailing/params">
			<fieldset name="basic">
				<field name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-share"/>
				<field name="template" type="radio" default="component" label="Display the online version" description="Select if you want to display the online version (when the user will share your link on the social network) without any Joomla module (no template) or inside your default Joomla Template">
					<option value="standard">Standard template</option>
					<option value="component">No template</option>
				</field>

				<field name="picturefb" type="text" label="Facebook picture - DEPRECATED" default="media/com_acymailing/images/facebookshare.png" />
				<field name="picturetwitter" type="text" label="Twitter picture - DEPRECATED" default="media/com_acymailing/images/twittershare.png" />
				<field name="picturelinkedin" type="text" label="LinkedIn picture - DEPRECATED" default="media/com_acymailing/images/linkedin.png" />
				<field name="picturegoogleplus" type="text" label="Google+ picture - DEPRECATED" default="media/com_acymailing/images/google_plusshare.png" />
				<field name="frontendaccess" type="list" default="all" label="Front-end Access" description="You can restrict the access to this tag system with this option">
					<option value="all">Always display this tag system</option>
					<option value="none">Don't display this tag system on the front-end</option>
				</field>

			</fieldset>
		</fields>
	</config>
</install>
components/com_acymailing/extensions/plg_acymailing_tagcbuser/tagcbuser_j30.xml000060400000001561152453623450024306 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="plugin" version="3.0" method="upgrade" group="acymailing">
	<name>AcyMailing Tag and filter : Community Builder</name>
	<creationDate>September 2009</creationDate>
	<version>3.7.2</version>
	<author>Acyba</author>
	<authorEmail>dev@acyba.com</authorEmail>
	<authorUrl>http://www.acyba.com</authorUrl>
	<copyright>Copyright (C) 2009-2016 ACYBA SAS - All rights reserved..</copyright>
	<license>GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html</license>
	<description>This plugin enables you to add information from the CB Profile of the user in your newsletters. It also allows you to filter the users based on CB fields and modify these field values</description>
	<files>
		<filename plugin="tagcbuser">tagcbuser.php</filename>
		<filename>tagcbuser.xml</filename>
		<filename>index.html</filename>
	</files>
</extension>
components/com_acymailing/extensions/plg_acymailing_tagcbuser/index.html000060400000000000152453623450023111 0ustar00components/com_acymailing/extensions/plg_acymailing_tagcbuser/tagcbuser.xml000060400000003717152453623450023637 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/plugin-install.dtd">
<install type="plugin" version="1.5" method="upgrade" group="acymailing">
	<name>AcyMailing Tag and filter : Community Builder</name>
	<creationDate>September 2009</creationDate>
	<version>3.7.2</version>
	<author>Acyba</author>
	<authorEmail>dev@acyba.com</authorEmail>
	<authorUrl>http://www.acyba.com</authorUrl>
	<copyright>Copyright (C) 2009-2016 ACYBA SAS - All rights reserved..</copyright>
	<license>GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html</license>
	<description>This plugin enables you to add information from the CB Profile of the user in your newsletters. It also allows you to filter the users based on CB fields and modify these field values</description>
	<files>
		<filename plugin="tagcbuser">tagcbuser.php</filename>
	</files>
	<params addpath="/components/com_acymailing/params">
		<param name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-tagcbuser"/>
		<param name="frontendaccess" type="list" default="all" label="Front-end Access" description="You can restrict the access to this tag system with this option">
			<option value="all">Always display this tag system</option>
			<option value="none">Don't display this tag system on the front-end</option>
		</param>
	</params>
	<config>
		<fields name="params" addfieldpath="/components/com_acymailing/params">
			<fieldset name="basic">
				<field name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-tagcbuser"/>
				<field name="frontendaccess" type="list" default="all" label="Front-end Access" description="You can restrict the access to this tag system with this option">
					<option value="all">Always display this tag system</option>
					<option value="none">Don't display this tag system on the front-end</option>
				</field>
			</fieldset>
		</fields>
	</config>
</install>
components/com_acymailing/extensions/plg_acymailing_tagcbuser/tagcbuser.php000060400000031570152453623450023624 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.6.1
 * @author	acyba.com
 * @copyright	(C) 2009-2017 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */
defined('_JEXEC') or die('Restricted access');
?><?php

class plgAcymailingTagcbuser extends JPlugin{
	var $sendervalues = array();

	function __construct(&$subject, $config){
		parent::__construct($subject, $config);
		if(!isset($this->params)){
			$plugin = JPluginHelper::getPlugin('acymailing', 'tagcbuser');
			$this->params = new JParameter($plugin->params);
		}
	}

	function acymailing_getPluginType(){

		$app = JFactory::getApplication();
		if(!file_exists(ACYMAILING_ROOT.'components'.DS.'com_comprofiler'.DS.'comprofiler.php')) return;
		if($this->params->get('frontendaccess') == 'none' && !$app->isAdmin()) return;
		$onePlugin = new stdClass();
		$onePlugin->name = JText::_('CB User');
		$onePlugin->function = 'acymailingtagcb_show';
		$onePlugin->help = 'plugin-tagcbuser';

		return $onePlugin;
	}

	function onAcyDisplayFilters(&$type, $context = "massactions"){

		if($this->params->get('displayfilter_'.$context, true) == false) return;
		if(!file_exists(ACYMAILING_ROOT.'components'.DS.'com_comprofiler'.DS.'comprofiler.php')) return;

		$db = JFactory::getDBO();
		$fields = acymailing_getColumns('#__comprofiler');
		if(empty($fields)) return;

		$db->setQuery('SELECT name,title FROM #__comprofiler_fields WHERE `table` LIKE '.$db->Quote('#__comprofiler'));
		$fieldTitles = $db->loadObjectList('name');

		$languages = array();
		if(file_exists(JPATH_SITE.DS.'components'.DS.'com_comprofiler'.DS.'plugin'.DS.'language'.DS.'default_language'.DS.'language.php')){
			if(!defined('CBLIB')) include_once(JPATH_SITE.DS.'libraries/CBLib/CB/Application/CBApplication.php');
			$languages = include_once JPATH_SITE.DS.'components'.DS.'com_comprofiler'.DS.'plugin'.DS.'language'.DS.'default_language'.DS.'language.php';
		}elseif(file_exists(JPATH_SITE.DS.'components'.DS.'com_comprofiler'.DS.'plugin'.DS.'language'.DS.'default_language'.DS.'default_language.php')){
			include_once JPATH_SITE.DS.'components'.DS.'com_comprofiler'.DS.'plugin'.DS.'language'.DS.'default_language'.DS.'default_language.php';
		}

		ksort($fields);
		$cbfield = array();
		foreach($fields as $oneField => $fieldType){
			$text = $oneField;
			if(!empty($fieldTitles[$oneField])){
				if(!empty($languages[$fieldTitles[$oneField]->title])){
					$text .= ' ('.$languages[$fieldTitles[$oneField]->title].')';
				}else{
					if(defined($fieldTitles[$oneField]->title)){
						$text .= ' ('.constant($fieldTitles[$oneField]->title).')';
					}else $text .= ' ('.$fieldTitles[$oneField]->title.')';
				}
			}
			$cbfield[] = JHTML::_('select.option', $oneField, $text);
		}
		$type['cbfield'] = JText::_('CB_FIELD');

		$operators = acymailing_get('type.operators');
		$operators->extra = 'onchange="countresults(__num__)"';

		$return = '<div id="filter__num__cbfield">'.JHTML::_('select.genericlist', $cbfield, "filter[__num__][cbfield][map]", 'class="inputbox" size="1" onchange="countresults(__num__)"', 'value', 'text');
		$return .= ' '.$operators->display("filter[__num__][cbfield][operator]").' <input onchange="countresults(__num__)" class="inputbox" type="text" name="filter[__num__][cbfield][value]" style="width:200px" value="" /></div>';

		return $return;
	}

	function onAcyProcessFilter_cbfield(&$query, $filter, $num){
		$query->leftjoin['cbfield'] = '#__comprofiler AS cbfield ON cbfield.id = sub.userid';
		$query->where[] = $query->convertQuery('cbfield', $filter['map'], $filter['operator'], $filter['value']);
	}

	function onAcyProcessFilterCount_cbfield(&$query, $filter, $num){
		$this->onAcyProcessFilter_cbfield($query, $filter, $num);
		return JText::sprintf('SELECTED_USERS', $query->count());
	}

	function acymailingtagcb_show(){
		?>

		<script language="javascript" type="text/javascript">
			function applyTag(tagname){
				var string = '{cbtag:' + tagname;
				for(var i = 0; i < document.adminForm.typeinfo.length; i++){
					if(document.adminForm.typeinfo[i].checked){
						string += '|info:' + document.adminForm.typeinfo[i].value;
					}
				}
				string += '}';
				setTag(string);
				insertTag();
			}
		</script>
		<?php
		$typeinfo = array();
		$typeinfo[] = JHTML::_('select.option', "receiver", JText::_('RECEIVER_INFORMATION'));
		$typeinfo[] = JHTML::_('select.option', "sender", JText::_('SENDER_INFORMATIONS'));
		echo JHTML::_('acyselect.radiolist', $typeinfo, 'typeinfo', '', 'value', 'text', 'receiver');

		$text = '<table class="acymailing_table" cellpadding="1">';
		$db = JFactory::getDBO();
		$fields = acymailing_getColumns('#__comprofiler');

		$db->setQuery('SELECT name,type FROM #__comprofiler_fields');
		$fieldType = $db->loadObjectList('name');

		$k = 0;

		$text .= '<tr style="cursor:pointer" class="row1" onclick="applyTag(\'thumb\');" ><td class="acytdcheckbox"></td><td>Thumb Avatar</td></tr>';
		foreach($fields as $fieldname => $oneField){
			$type = '';
			if(strpos(strtolower($oneField), 'date') !== false) $type = '|type:date';
			if(!empty($fieldType[$fieldname]) AND $fieldType[$fieldname]->type == 'image') $type = '|type:image';
			$text .= '<tr style="cursor:pointer" class="row'.$k.'" onclick="applyTag(\''.$fieldname.$type.'\');" ><td class="acytdcheckbox"></td><td>'.$fieldname.'</td></tr>';
			$k = 1 - $k;
		}


		$db->setQuery("SELECT * FROM #__comprofiler_fields WHERE tablecolumns = '' AND published = 1");
		$otherFields = $db->loadObjectList();
		foreach($otherFields as $oneField){
			$text .= '<tr style="cursor:pointer" class="row'.$k.'" onclick="applyTag(\'cbapi_'.$oneField->name.'\');" ><td class="acytdcheckbox"></td><td>'.$oneField->name.'</td></tr>';
			$k = 1 - $k;
		}

		$text .= '</table>';

		echo $text;
	}

	function acymailing_replaceusertags(&$email, &$user, $send = true){
		$match = '#(?:{|%7B)cbtag:(.*)(?:}|%7D)#Ui';
		$variables = array('subject', 'body', 'altbody');
		$found = false;
		foreach($variables as $var){
			if(empty($email->$var)) continue;
			$found = preg_match_all($match, $email->$var, $results[$var]) || $found;
			if(empty($results[$var][0])) unset($results[$var]);
		}

		if(!$found) return;

		$uservalues = null;
		$db = JFactory::getDBO();
		if(!empty($user->userid)){
			$db->setQuery('SELECT * FROM '.acymailing_table('comprofiler', false).' WHERE user_id = '.$user->userid.' LIMIT 1');
			$uservalues = $db->loadObject();
		}

		$db->setQuery('SELECT fieldid, `table`, name, type, params FROM #__comprofiler_fields');
		$fieldObjects = $db->loadObjectList('name');

		include_once(ACYMAILING_ROOT.'administrator'.DS.'components'.DS.'com_comprofiler'.DS.'plugin.foundation.php');
		cbimport('cb.database');
		$pluginsHelper = acymailing_get('helper.acyplugins');
		$currentCBUser = null;

		$tags = array();
		foreach($results as $var => $allresults){
			foreach($allresults[0] as $i => $oneTag){
				if(isset($tags[$oneTag])) continue;

				$arguments = explode('|', $allresults[1][$i]);
				$field = $arguments[0];
				unset($arguments[0]);
				$mytag = new stdClass();
				$mytag->default = $this->params->get('default_'.$field, '');
				if(!empty($arguments)){
					foreach($arguments as $onearg){
						$args = explode(':', $onearg);
						if(isset($args[1])){
							$mytag->{$args[0]} = $args[1];
						}else{
							$mytag->{$args[0]} = 1;
						}
					}
				}

				$values = new stdClass();

				if(!empty($mytag->info) AND $mytag->info == 'sender'){
					if(empty($this->sendervalues[$email->mailid]) AND !empty($email->userid)){
						$db->setQuery('SELECT * FROM #__comprofiler WHERE user_id = '.$email->userid.' LIMIT 1');
						$this->sendervalues[$email->mailid] = $db->loadObject();
					}
					if(!empty($this->sendervalues[$email->mailid])) $values = $this->sendervalues[$email->mailid];
				}else{
					$values = $uservalues;
				}

				if(substr($field, 0, 6) == 'cbapi_'){
					if(!empty($mytag->info) AND $mytag->info == 'sender'){
						if(empty($this->sendervalues[$email->mailid]->$field) AND !empty($email->userid)){
							$currentSender = CBuser::getInstance($email->userid);
							$values->$field = $currentSender->getField(substr($field, 6), $mytag->default, 'html', 'none', 'profile', 0, true);
							$this->sendervalues[$email->mailid]->$field = $values->$field;
						}elseif(!empty($this->sendervalues[$email->mailid]->$field)){
							$values->$field = @$this->sendervalues[$email->mailid]->$field;
						}
					}elseif(!empty($user->userid)){
						if(empty($currentCBUser)) $currentCBUser = CBuser::getInstance($user->userid);
						if(!empty($currentCBUser)) $values->$field = $currentCBUser->getField(substr($field, 6), $mytag->default, 'html', 'none', 'profile', 0, true);
						if(empty($values->$field) && !empty($fieldObjects[substr($field, 6)]) && $fieldObjects[substr($field, 6)]->type == 'progress'){
							$fieldObjects[substr($field, 6)]->decodedParams = json_decode($fieldObjects[substr($field, 6)]->params);
							if(!empty($fieldObjects[substr($field, 6)]->decodedParams->prg_fields)){
								$requiredFields = explode('|*|', $fieldObjects[substr($field, 6)]->decodedParams->prg_fields);
								$filled_in = 0;
								foreach($fieldObjects as $oneField){
									if(!in_array($oneField->fieldid, $requiredFields) || !in_array($oneField->table, array('#__comprofiler', '#__users'))) continue;
									$fieldName = $oneField->name;
									if(!empty($currentCBUser->_cbuser->$fieldName)) $filled_in++;
								}
								$values->$field = intval(($filled_in * 100) / count($requiredFields)).'%';
							}
						}
					}
				}

				$replaceme = isset($values->$field) ? $values->$field : $mytag->default;
				if(!empty($mytag->type)){
					if($mytag->type == 'image' AND !empty($replaceme)){
						$replaceme = '<img src="'.ACYMAILING_LIVE.'images/comprofiler/'.$replaceme.'" alt="'.htmlspecialchars(@$user->name, ENT_COMPAT, 'UTF-8').'" />';
					}
				}

				if($field == 'thumb'){
					$replaceme = '<img src="'.ACYMAILING_LIVE.'images/comprofiler/tn'.$values->avatar.'" alt="'.htmlspecialchars(@$user->name, ENT_COMPAT, 'UTF-8').'" />';
				}elseif($field == 'avatar'){
					$replaceme = '<img src="'.ACYMAILING_LIVE.'images/comprofiler/'.$values->avatar.'" alt="'.htmlspecialchars(@$user->name, ENT_COMPAT, 'UTF-8').'" />';
				}

				$tags[$oneTag] = $replaceme;
				$pluginsHelper->formatString($tags[$oneTag], $mytag);
			}
		}

		foreach($results as $var => $allresults){
			$email->$var = str_replace(array_keys($tags), $tags, $email->$var);
		}
	}

	function onAcyDisplayActions(&$type){
		$fields = acymailing_getColumns('#__comprofiler');

		$field = array();
		$field[] = JHTML::_('select.option', 0, '- - -');
		foreach($fields as $oneField => $fieldType){
			if(in_array($oneField, array('id', 'user_id', 'hits', 'message_last_sent', 'message_number_sent', 'canvas', 'cbactivation'))) continue;
			$field[] = JHTML::_('select.option', $oneField, $oneField);
		}

		$content = '<div id="action__num__cbfieldval">'.JHTML::_('select.genericlist', $field, "action[__num__][cbfieldval][map]", 'class="inputbox" size="1"', 'value', 'text');
		$content .= ' = <input class="inputbox" type="text" id="action__num__cbfieldvalvalue" name="action[__num__][cbfieldval][value]" style="width:200px" value=""></div>';

		$type['cbfieldval'] = 'Community Builder: '.jtext::_('FIELD');

		return $content;
	}

	function onAcyProcessAction_cbfieldval($cquery, $action, $num){

		$replace = array('{year}', '{month}', '{weekday}', '{day}', '{hour}', '{minute}');
		$replaceBy = array(date('Y'), date('m'), date('N'), date('d'), date('H'), date('i'));
		$newValue = str_replace($replace, $replaceBy, acymailing_replaceDate($action['value']));

		if(preg_match_all('#{(year|month|weekday|day)\|(add|remove):([^}]*)}#Uis', $newValue, $results)){
			foreach($results[0] as $i => $oneMatch){
				$format = str_replace(array('year', 'month', 'weekday', 'day'), array('Y','m','N','d'), $results[1][$i]);
				$delay = str_replace(array('add', 'remove'), array('+', '-'), $results[2][$i]).intval($results[3][$i]).' '.str_replace('weekday', 'day', $results[1][$i]);
				$newValue = str_replace($oneMatch, date($format, strtotime($delay)), $newValue);
			}
		}

		if(empty($action['operator'])) $action['operator'] = '=';

		$fields = array_keys(acymailing_getColumns('#__comprofiler'));
		if(!in_array($action['map'], $fields)) return 'Unexisting field: '.$action['map'].' | The available fields are: '.implode(', ', $fields);

		$query = 'UPDATE #__comprofiler AS cb JOIN #__acymailing_subscriber AS sub ON cb.user_id = sub.userid';
		if(!empty($cquery->join)) $query .= ' JOIN '.implode(' JOIN ', $cquery->join);
		if(!empty($cquery->leftjoin)) $query .= ' LEFT JOIN '.implode(' LEFT JOIN ', $cquery->leftjoin);

		$query .= " SET cb.`".acymailing_secureField($action['map'])."` = ".$cquery->db->Quote($newValue);
		if(!empty($cquery->where)) $query .= ' WHERE ('.implode(') AND (', $cquery->where).')';

		$cquery->db->setQuery($query);
		$cquery->db->query();
		$nbAffected = $cquery->db->getAffectedRows();
		return JText::sprintf('NB_MODIFIED', $nbAffected);
	}
}//endclass
components/com_acymailing/extensions/plg_acymailing_tagsubscription/index.html000060400000000054152453623450024363 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_acymailing_tagsubscription/tagsubscription.xml000060400000013735152453623450026342 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/plugin-install.dtd">
<install type="plugin" version="1.5" method="upgrade" group="acymailing">
	<name>AcyMailing Tag : Manage the Subscription</name>
	<creationDate>March 2018</creationDate>
	<version>5.9.6</version>
	<author>Acyba</author>
	<authorEmail>dev@acyba.com</authorEmail>
	<authorUrl>http://www.acyba.com</authorUrl>
	<copyright>Copyright (C) 2009-2018 ACYBA SAS - All rights reserved..</copyright>
	<license>GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html</license>
	<description>This plugin enables you to add link to manage the subscription of the user</description>
	<files>
		<filename plugin="tagsubscription">tagsubscription.php</filename>
	</files>
	<params addpath="/components/com_acymailing/params">
		<param name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-tagsubscription"/>
		<param name="unsubscribetemplate" type="radio" default="0" label="Display the unsubscribe page" description="Select if you want to display the unsubscribe page (when the user clicks on the unsubscribe link) without any Joomla module (no template) or inside your default Joomla Template">
			<option value="0">Standard template</option>
			<option value="1">No template</option>
		</param>
		<param name="listunsubscribe" type="radio" default="0" label="Add list-unsubscribe header" description="If you insert an unsubscribe link, should Acy also insert the link in the list-unsubscribe field? See www.list-unsubscribe.com">
			<option value="0">JOOMEXT_NO</option>
			<option value="1">JOOMEXT_YES</option>
		</param>
		<param name="listunsubscribeemail" type="text" size="20" default="" label="List-unsubscribe e-mail" description="The GMail feedback loops works with a list-unsubscribe e-mail address. By default Acy will add the reply-to e-mail address but you can specify another e-mail address there" />
		<param name="modifytemplate" type="radio" default="0" label="Display the modify your subscription" description="Select if you want to display the modify your subscription page (when the user clicks on the modify you subscription link) without any Joomla module (no template) or inside your default Joomla Template">
			<option value="0">Standard template</option>
			<option value="1">No template</option>
		</param>
		<param name="confirmtemplate" type="radio" default="0" label="Display the confirmation page" description="Select if you want to display the confirmation page (when the user clicks on the confirmation link) without any Joomla module (no template) or inside your default Joomla Template">
			<option value="0">Standard template</option>
			<option value="1">No template</option>
		</param>
		<param name="displayfilter_mail" type="radio" default="1" label="Display filter" description="Display the subscription filter on the Newsletter creation interface">
			<option value="0">JOOMEXT_NO</option>
			<option value="1">JOOMEXT_YES</option>
		</param>
		<param name="frontendaccess" type="list" default="all" label="Front-end Access" description="You can restrict the access to this tag system with this option">
			<option value="all">Always display this tag system</option>
			<option value="none">Don't display this tag system on the front-end</option>
		</param>
	</params>
	<config>
		<fields name="params" addfieldpath="/components/com_acymailing/params">
			<fieldset name="basic">
				<field name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-tagsubscription"/>
				<field name="unsubscribetemplate" type="radio" default="0" label="Display the unsubscribe page" description="Select if you want to display the unsubscribe page (when the user clicks on the unsubscribe link) without any Joomla module (no template) or inside your default Joomla Template">
					<option value="0">Standard template</option>
					<option value="1">No template</option>
				</field>
				<field name="listunsubscribe" type="radio" default="0" label="Add list-unsubscribe header" description="If you insert an unsubscribe link, should Acy also insert the link in the list-unsubscribe field? See www.list-unsubscribe.com">
					<option value="0">JOOMEXT_NO</option>
					<option value="1">JOOMEXT_YES</option>
				</field>
				<field name="listunsubscribeemail" type="text" size="20" default="" label="List-unsubscribe e-mail" description="The GMail feedback loops works with a list-unsubscribe e-mail address. By default Acy will add the reply-to e-mail address but you can specify another e-mail address there" />
				<field name="modifytemplate" type="radio" default="0" label="Display the modify your subscription" description="Select if you want to display the modify your subscription page (when the user clicks on the modify you subscription link) without any Joomla module (no template) or inside your default Joomla Template">
					<option value="0">Standard template</option>
					<option value="1">No template</option>
				</field>
				<field name="confirmtemplate" type="radio" default="0" label="Display the confirmation page" description="Select if you want to display the confirmation page (when the user clicks on the confirmation link) without any Joomla module (no template) or inside your default Joomla Template">
					<option value="0">Standard template</option>
					<option value="1">No template</option>
				</field>
				<field name="displayfilter_mail" type="radio" default="1" label="Display filter" description="Display the subscription filter on the Newsletter creation interface">
					<option value="0">JOOMEXT_NO</option>
					<option value="1">JOOMEXT_YES</option>
				</field>
				<field name="frontendaccess" type="list" default="all" label="Front-end Access" description="You can restrict the access to this tag system with this option">
					<option value="all">Always display this tag system</option>
					<option value="none">Don't display this tag system on the front-end</option>
				</field>
			</fieldset>
		</fields>
	</config>
</install>
components/com_acymailing/extensions/plg_acymailing_tagsubscription/tagsubscription.php000060400000104064152453623450026325 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class plgAcymailingTagsubscription extends JPlugin{
	var $listunsubscribe = false;
	var $lists = array();
	var $listsowner = array();
	var $listsinfo = array();
	var $campaigns = array();
	var $unsubscribeLink = false;
	var $unsubscribeItem = '';

	function __construct(&$subject, $config){
		parent::__construct($subject, $config);
		if(!isset($this->params)){
			$plugin = JPluginHelper::getPlugin('acymailing', 'tagsubscription');
			$this->params = new acyParameter($plugin->params);
		}
		$this->acypluginsHelper = acymailing_get('helper.acyplugins');
	}

	function acymailing_getPluginType(){

		if($this->params->get('frontendaccess') == 'none' && !acymailing_isAdmin()) return;
		$onePlugin = new stdClass();
		$onePlugin->name = acymailing_translation('SUBSCRIPTION');
		$onePlugin->function = 'acymailingtagsubscription_show';
		$onePlugin->help = 'plugin-tagsubscription';

		return $onePlugin;
	}

	function acymailingtagsubscription_show(){

		$others = array();
		$others['unsubscribe'] = array('name' => acymailing_translation('UNSUBSCRIBE_LINK'), 'default' => acymailing_translation('UNSUBSCRIBE', true));
		$others['modify'] = array('name' => acymailing_translation('MODIFY_SUBSCRIPTION_LINK'), 'default' => acymailing_translation('MODIFY_SUBSCRIPTION', true));
		$others['confirm'] = array('name' => acymailing_translation('CONFIRM_SUBSCRIPTION_LINK'), 'default' => acymailing_translation('CONFIRM_SUBSCRIPTION', true));
		$others['subscribe'] = array('name' => acymailing_translation('SUBSCRIBE_LINK'), 'default' => acymailing_translation('SUBSCRIBE', true));

		?>
		<script language="javascript" type="text/javascript">
			<!--
			var openLists = true;
			var selectedTag = '';
			function changeTag(tagName){
				selectedTag = tagName;
				defaultText = [];
				<?php
				$k = 0;
				foreach($others as $tagname => $tag){
					echo "document.getElementById('tr_$tagname').className = 'row$k';";
					echo "defaultText['$tagname'] = '".$tag['default']."';";
					$k = 1 - $k;
				}
				?>
				document.getElementById('tr_' + tagName).className = 'selectedrow';
				document.adminForm.tagtext.value = defaultText[tagName];
				if(tagName == 'subscribe'){
					document.getElementById('iframelists').style.display = '';
					document.getElementById('subscriptionlists').style.display = '';
					if(openLists) displayLists();
				}else{
					document.getElementById('iframelists').style.display = 'none';
					document.getElementById('subscriptionlists').style.display = 'none';
				}
				setSubscriptionTag();
			}

			function setSubscriptionTag(){
				var tag = '{' + selectedTag;

				if(document.getElementById('tagmenu').value != 0) tag += "|itemid:" + document.getElementById('tagmenu').value;
				if(selectedTag == 'subscribe') tag += "|lists:" + document.getElementById('paramslistids').value;

				tag += '}' + document.adminForm.tagtext.value + '{/' + selectedTag + '}'
				setTag(tag);
			}

			function displayLists(){
				var box = document.getElementById('iframelists');
				if(openLists){
					box.style.display = 'block';
					box.className += ' slide_open';
				}else{
					box.className = box.className.replace('slide_open', 'slide_close');
				}

				if(!openLists) setSubscriptionTag();
				openLists = !openLists;
			}
			//-->
		</script>
		<?php

		acymailing_addScript(true, "document.addEventListener(\"DOMContentLoaded\", function(){ changeTag('unsubscribe'); });");

		$text = '<div id="iframelists" style="display:none;"><iframe src="index.php?option=com_acymailing&tmpl=component&ctrl='.(acymailing_isAdmin() ? '' : 'front').'chooselist&popup=0&task=listids&all=0" width="98%" height="100%" scrolling="auto"></iframe></div>
				<div class="onelineblockoptions">
					<span class="acyblocktitle">'.acymailing_translation('SUBSCRIPTION').'</span>
					<table class="acymailing_table" cellpadding="1">';
		$menus = acymailing_loadObjectList('SELECT 0 AS id, "- - -" AS title UNION SELECT id, title FROM #__menu WHERE link LIKE "%com_acymailing%" AND client_id = 0 AND published = 1');
		$text .= '<tr>
					<td><label for="tagtext">'.acymailing_translation('FIELD_TEXT').': </label><input type="text" name="tagtext" id="tagtext" onchange="setSubscriptionTag();"></td>
					<td><label for="tagmenu">'.acymailing_translation('ACY_MENU').': </label>'.acymailing_select($menus, "tagmenu", 'class="inputbox" size="1" onchange="setSubscriptionTag();"', 'id', 'title', '').'</td>
				</tr>
				<tr id="subscriptionlists">
					<td colspan="2">
						<button class="acymailing_button_grey" onclick="displayLists();return false;">'.acymailing_translation('LISTS').'</button>
						<input class="inputbox" id="paramslistids" name="listids" type="text" style="width:100px" value="">
					</td>
				</tr>';
		$text .= '</table>
					<table class="acymailing_table" cellpadding="1">';

		$k = 0;
		foreach($others as $tagname => $tag){
			$text .= '<tr style="cursor:pointer" class="row'.$k.'" onclick="changeTag(\''.$tagname.'\');" id="tr_'.$tagname.'" ><td class="acytdcheckbox"></td><td>'.$tag['name'].'</td></tr>';
			$k = 1 - $k;
		}
		$text .= '</table></div>';

		$others = array();
		$others['name'] = acymailing_translation('LIST_NAME');
		$others['names'] = acymailing_translation('ACY_LIST_NAMES');
		$others['description'] = acymailing_translation('ACY_DESCRIPTION');
		$others['count'] = trim(acymailing_translation('GEOLOC_NB_USERS', true), ':');
		$others['count|listid:0'] = trim(acymailing_translation('GEOLOC_NB_USERS', true), ':').' ('.acymailing_translation('ALL_LISTS').')';
		$others['id'] = acymailing_translation('ACY_ID', true);

		$text .= '<div class="onelineblockoptions">
					<span class="acyblocktitle">'.acymailing_translation('LIST').'</span>
					<table class="acymailing_table" cellpadding="1">';

		$k = 0;
		foreach($others as $tagname => $tag){
			$text .= '<tr style="cursor:pointer" class="row'.$k.'" onclick="setTag(\'{list:'.$tagname.'}\');insertTag();" id="tr_'.$tagname.'" ><td class="acytdcheckbox"></td><td>'.$tag.'</td></tr>';
			$k = 1 - $k;
		}

		$text .= '</table></div>';

		$text .= '<div class="onelineblockoptions">
					<span class="acyblocktitle">'.acymailing_translation('NEWSLETTER').'</span>
					<table class="acymailing_table" cellpadding="1">';
		$othersMail = array('mailid', 'subject', 'alias', 'key', 'altbody');
		$k = 0;
		foreach($othersMail as $tag){
			$text .= '<tr style="cursor:pointer" class="row'.$k.'" onclick="setTag(\'{mail:'.$tag.'}\');insertTag();" id="tr_'.$tag.'" ><td class="acytdcheckbox"></td><td>'.$tag.'</td></tr>';
			$k = 1 - $k;
		}
		$text .= '</table></div>';

		echo $text;
	}

	function onAcyDisplayActions(&$type){
		$type['list'] = acymailing_translation('ACYMAILING_LIST');
		$status = array();
		$status[] = acymailing_selectOption(1, acymailing_translation('SUBSCRIBE_TO'));
		$status[] = acymailing_selectOption(0, acymailing_translation('REMOVE_FROM'));
		$status[] = acymailing_selectOption(-1, acymailing_translation('ACY_UNSUB_FROM'));

		$lists = $this->_getLists();
		$otherlists = array();
		$onChange = '';
		if(acymailing_level(3)){
			$otherlists = acymailing_loadObjectList('SELECT b.listid, b.name FROM #__acymailing_listcampaign as a JOIN #__acymailing_list as b on a.listid = b.listid GROUP BY b.listid ORDER BY b.ordering ASC', 'listid');
			$onChange = 'onchange="onAcyDisplayAction_list(__num__);"';

			$js = "function onAcyDisplayAction_list(num){
				if(!document.getElementById('campaigndelay'+num)) return;
				if(document.getElementById('subliststatus'+num).value == 1 && document.getElementById('sublistvalue'+num).value.indexOf('_campaign') > 0){
					document.getElementById('campaigndelay'+num).style.display = 'inline';
				}else{
					document.getElementById('campaigndelay'+num).style.display = 'none';
				}
			}";
			acymailing_addScript(true, $js);
		}

		$listsdrop = array();
		foreach($lists as $oneList){
			if(!empty($otherlists[$oneList->listid])) $listsdrop[] = acymailing_selectOption($oneList->listid.'_campaign', $otherlists[$oneList->listid]->name.' + '.acymailing_translation('CAMPAIGN'));
			$listsdrop[] = acymailing_selectOption($oneList->listid, $oneList->name);
		}

		$return = '<div id="action__num__list">'.acymailing_select($status, "action[__num__][list][status]", 'class="inputbox" size="1" '.$onChange, 'value', 'text', '', 'subliststatus__num__').' '.acymailing_select($listsdrop, "action[__num__][list][selectedlist]", 'class="inputbox" size="1" '.$onChange, 'value', 'text', '', 'sublistvalue__num__');
		if(!empty($otherlists)){
			$delay = array();
			$delay[] = acymailing_selectOption('day', acymailing_translation('DAYS'));
			$delay[] = acymailing_selectOption('week', acymailing_translation('WEEKS'));
			$delay[] = acymailing_selectOption('month', acymailing_translation('MONTHS'));

			$listHours = array();
			$listHours[] = acymailing_selectOption('', '- -');
			for($i = 0; $i < 24; $i++){
				$listHours[] = acymailing_selectOption(($i < 10 ? '0'.$i : $i), ($i < 10 ? '0'.$i : $i));
			}
			$hours = acymailing_select($listHours, 'action[__num__][list][sendhours]', 'class="inputbox" size="1" style="width:60px;"', 'value', 'text', '');

			$listMinutess = array();
			$listMinutess[] = acymailing_selectOption('', '- -');
			for($i = 0; $i < 60; $i += 5){
				$listMinutess[] = acymailing_selectOption(($i < 10 ? '0'.$i : $i), ($i < 10 ? '0'.$i : $i));
			}
			$minutes = acymailing_select($listMinutess, 'action[__num__][list][sendminutes]', 'class="inputbox" size="1" style="width:60px;"', 'value', 'text', '');

			$return .= '<br /><span id="campaigndelay__num__">'.acymailing_translation_sprintf('TRIGGER_CAMPAIGN', '<input type="text" name="action[__num__][list][delaynum]" value="0" style="width:50px" />', acymailing_select($delay, "action[__num__][list][delaytype]", 'class="inputbox" size="1" style="width:120px;"', 'value', 'text')).' @ '.$hours.' : '.$minutes;
			$return .= '<br />'.acymailing_translation_sprintf('ACY_CAMPAIGN_NB_FOLLOW_SKIPED', '<input type="text" name="action[__num__][list][skipedfollowups]" value="0" style="width:25px;" />').'</span>';
		}
		$return .= '</div>';

		return $return;
	}

	private function _getLists(){
		if(!empty($this->allLists)) return $this->allLists;
		$list = acymailing_get('class.list');
		if(acymailing_isAdmin()){
			$this->allLists = $list->getLists();
		}else{
			$this->allLists = $list->getFrontendLists();
		}

		return $this->allLists;
	}

	private function _getCampaigns(){

		$list = acymailing_get('class.list');
		if(acymailing_isAdmin()){
			return $list->getAllCampaigns();
		}
		return $list->getFrontendCampaigns();
	}

	function onAcyDisplayFilters(&$type, $context = "massactions"){

		if($this->params->get('displayfilter_'.$context, true) == false) return;

		$type['list'] = acymailing_translation('ACYMAILING_LIST');
		$status = acymailing_get('type.statusfilterlist');
		$status->extra = 'onchange="countresults(__num__);"';

		$lists = $this->_getLists();
		$campaigns = $this->_getCampaigns();
		$listsdrop = array();

		$listsdrop[] = acymailing_selectOption('<OPTGROUP>', acymailing_translation('LISTS'));
		foreach($lists as $oneList){
			$listsdrop[] = acymailing_selectOption($oneList->listid, $oneList->name);
		}
		$listsdrop[] = acymailing_selectOption('</OPTGROUP>');

		if(count($campaigns) > 0){
			$listsdrop[] = acymailing_selectOption('<OPTGROUP>', acymailing_translation('ACY_CAMPAIGNS'));
			foreach($campaigns as $campaign){
				$listsdrop[] = acymailing_selectOption($campaign->listid, $campaign->name);
			}
			$listsdrop[] = acymailing_selectOption('</OPTGROUP>');
		}
		
		$dates = array();
		$dates[] = acymailing_selectOption(0, acymailing_translation('SUBSCRIPTION_DATE'));
		$dates[] = acymailing_selectOption(1, acymailing_translation('UNSUBSCRIPTION_DATE'));

		$filter = '<div id="filter__num__list">'.$status->display("filter[__num__][list][status]", 1, false).' '.acymailing_select($listsdrop, "filter[__num__][list][selectedlist]", 'class="inputbox" style="max-width:200px" size="1" onchange="countresults(__num__)"', 'value', 'text');
		$filter .= '<br /><input type="text" name="filter[__num__][list][subdateinf]" onclick="displayDatePicker(this,event)" onchange="countresults(__num__)" style="width:60px;" /> < '.acymailing_select($dates, "filter[__num__][list][dates]", 'class="inputbox" style="max-width:200px" size="1" onchange="countresults(__num__)"', 'value', 'text').' < <input type="text" name="filter[__num__][list][subdatesup]" onclick="displayDatePicker(this,event)" onchange="countresults(__num__)" style="width:60px;" /></div>';
		return $filter;
	}

	function onAcyProcessFilter_list(&$query, $filter, $num){
		$otherconditions = '';
		$field = empty($filter['dates']) ? 'subdate' : 'unsubdate';
		if(!empty($filter['subdateinf'])){
			$filter['subdateinf'] = acymailing_replaceDate($filter['subdateinf']);
			if(!is_numeric($filter['subdateinf'])) $filter['subdateinf'] = strtotime($filter['subdateinf']);
			if(!empty($filter['subdateinf'])) $otherconditions .= ' AND list'.$num.'.'.$field.' > '.$filter['subdateinf'];
		}

		if(!empty($filter['subdatesup'])){
			$filter['subdatesup'] = acymailing_replaceDate($filter['subdatesup']);
			if(!is_numeric($filter['subdatesup'])) $filter['subdatesup'] = strtotime($filter['subdatesup']);
			if(!empty($filter['subdatesup'])) $otherconditions .= ' AND list'.$num.'.'.$field.' < '.$filter['subdatesup'];
		}

		$query->leftjoin['list'.$num] = '#__acymailing_listsub AS list'.$num.' ON sub.subid = list'.$num.'.subid AND list'.$num.'.listid = '.intval($filter['selectedlist']).$otherconditions;
		if($filter['status'] == -2){
			$query->where[] = 'list'.$num.'.listid IS NULL';
		}else{
			$query->where[] = 'list'.$num.'.status = '.intval($filter['status']);
		}
	}

	function onAcyProcessFilterCount_list(&$query, $filter, $num){
		$this->onAcyProcessFilter_list($query, $filter, $num);
		return acymailing_translation_sprintf('SELECTED_USERS', $query->count());
	}

	function onAcyProcessAction_list($cquery, $action, $num){
		$listid = intval($action['selectedlist']);
		$listClass = acymailing_get('class.list');
		if(is_numeric($action['selectedlist'])){
			$myList = $listClass->get($listid);
			if(empty($myList->listid)){
				return 'ERROR : List '.$listid.' not found';
			}

			if(empty($action['status'])){
				$query = 'DELETE listremove.* FROM '.acymailing_table('listsub').' AS listremove ';
				$query .= 'JOIN #__acymailing_subscriber AS sub ON listremove.subid = sub.subid ';
				if(!empty($cquery->join)) $query .= ' JOIN '.implode(' JOIN ', $cquery->join);
				if(!empty($cquery->leftjoin)) $query .= ' LEFT JOIN '.implode(' LEFT JOIN ', $cquery->leftjoin);
				$query .= ' WHERE listremove.listid = '.$listid;
				if(!empty($cquery->where)) $query .= ' AND ('.implode(') AND (', $cquery->where).')';
			}elseif($action['status'] == -1){
				$query = 'UPDATE '.acymailing_table('listsub').' AS listsub'.$num.' JOIN '.acymailing_table('subscriber').' AS sub ON listsub'.$num.'.subid = sub.subid ';
				if(!empty($cquery->join)) $query .= ' JOIN '.implode(' JOIN ', $cquery->join);
				if(!empty($cquery->leftjoin)) $query .= ' LEFT JOIN '.implode(' LEFT JOIN ', $cquery->leftjoin);
				$query .= ' SET listsub'.$num.'.status = -1, listsub'.$num.'.unsubdate = '.time().' WHERE listsub'.$num.'.listid = '.$listid;
				if(!empty($cquery->where)) $query .= ' AND ('.implode(') AND (', $cquery->where).')';
			}else{
				$query = 'INSERT IGNORE INTO '.acymailing_table('listsub').' (listid,subid,subdate,status) ';
				$query .= $cquery->getQuery(array($listid, 'sub.subid', time(), 1));
			}
			$nbsubscribed = acymailing_query($query);

			if(empty($action['status'])){
				return acymailing_translation_sprintf('IMPORT_REMOVE', $nbsubscribed, '<b><i>'.$myList->name.'</i></b>');
			}elseif($action['status'] == -1){
				return acymailing_translation_sprintf('NB_UNSUB_USERS', $nbsubscribed);
			}else{
				return acymailing_translation_sprintf('IMPORT_SUBSCRIBE_CONFIRMATION', $nbsubscribed, '<b><i>'.$myList->name.'</i></b>');
			}
		}

		$myList = $listClass->get($listid);
		if(empty($myList->listid)){
			return 'ERROR : List '.$listid.' not found';
		}
		if(empty($action['status'])){
			$query = 'SELECT listremove.`subid` FROM #__acymailing_listsub as listremove';
			$query .= ' JOIN #__acymailing_subscriber as sub ON listremove.subid = sub.subid ';
			$condition = ' WHERE listremove.listid = '.$listid;
		}elseif($action['status'] == -1){
			$query = 'SELECT listunsub.`subid` FROM #__acymailing_listsub as listunsub JOIN #__acymailing_subscriber as sub ON listunsub.subid = sub.subid ';
			$condition = ' WHERE listunsub.listid = '.$listid.' AND listunsub.status != -1';
		}else{
			$query = 'SELECT sub.`subid` FROM #__acymailing_subscriber as sub';
			$query .= ' LEFT JOIN #__acymailing_listsub as listsubscribe ON listsubscribe.subid = sub.subid AND listsubscribe.listid = '.$listid;
			$condition = ' WHERE listsubscribe.subid IS NULL';
		}
		if(!empty($cquery->join)) $query .= ' JOIN '.implode(' JOIN ', $cquery->join);
		if(!empty($cquery->leftjoin)) $query .= ' LEFT JOIN '.implode(' LEFT JOIN ', $cquery->leftjoin);
		$query .= $condition;
		if(!empty($cquery->where)) $query .= ' AND ('.implode(') AND (', $cquery->where).')';
		if(!empty($cquery->orderBy)) $query .= ' ORDER BY '.$cquery->orderBy;
		if(!empty($cquery->limit)) $query .= ' LIMIT '.intval($cquery->limit);
		$subids = acymailing_loadResultArray($query);

		if(!empty($subids)){
			$listsubClass = acymailing_get('class.listsub');
			$time = time();
			$timeFunction = 'acymailing_getTime';
			if(!isset($action['sendhours']) || strlen($action['sendhours']) < 1){
				$action['sendhours'] = '%H';
				$timeFunction = 'strftime';
			}
			if(!isset($action['sendminutes']) || strlen($action['sendminutes']) < 1) $action['sendminutes'] = '%M';
			$format = '%Y-%m-%d '.$action['sendhours'].':'.$action['sendminutes'].':00';
			if($action['status'] == 1 && !empty($action['delaynum'])){
				$listsubClass->campaigndelay = $timeFunction(strftime($format, strtotime('+'.intval($action['delaynum']).' '.$action['delaytype'])));
			}else{
				$listsubClass->campaigndelay = $timeFunction(strftime($format, $time));
			}
			if($listsubClass->campaigndelay < $time){
				$listsubClass->campaigndelay = 0;
			}else $listsubClass->campaigndelay -= $time;

			if(!empty($action['skipedfollowups'])){
				$action['skipedfollowups'] = intval($action['skipedfollowups']);
				if(!empty($action['skipedfollowups'])) $listsubClass->skipedfollowups = $action['skipedfollowups'];
			}
			$listsubClass->checkAccess = false;
			$listsubClass->sendNotif = false;
			$listsubClass->sendConf = false;
			foreach($subids as $subid){
				if(empty($action['status'])){
					$listsubClass->removeSubscription($subid, array($listid));
				}elseif($action['status'] == -1) $listsubClass->updateSubscription($subid, array('-1' => array($listid)));
				else $listsubClass->addSubscription($subid, array('1' => array($listid)));
			}
		}

		$nbsubscribed = count($subids);
		if(empty($action['status'])){
			return acymailing_translation_sprintf('IMPORT_REMOVE', $nbsubscribed, '<b><i>'.$myList->name.'</i></b>');
		}elseif($action['status'] == -1){
			return acymailing_translation_sprintf('NB_UNSUB_USERS', $nbsubscribed);
		}else{
			return acymailing_translation_sprintf('IMPORT_SUBSCRIBE_CONFIRMATION', $nbsubscribed, '<b><i>'.$myList->name.'</i></b>');
		}
	}

	function acymailing_replaceusertags(&$email, &$user, $send = true){
		$this->_replacelisttags($email, $user, $send);

		if(empty($user->key) && !empty($user->subid)){
			$user->key = acymailing_generateKey(14);
			acymailing_query('UPDATE '.acymailing_table('subscriber').' SET `key`= '.acymailing_escapeDB($user->key).' WHERE subid = '.(int)$user->subid.' LIMIT 1');
		}

		if(!isset($user->key)) $user->key = '';

		if($this->unsubscribeLink && !$this->listunsubscribe && $this->params->get('listunsubscribe', 0) && method_exists($email, 'addCustomHeader')){
			$lang = empty($email->language) ? '' : '&lang='.$email->language;
			$myLink = 'index.php?subid='.intval($user->subid).'&option=com_acymailing&ctrl=user&task=out&mailid='.$email->mailid.'&key='.urlencode($user->key).$this->unsubscribeItem.$lang;
			
			$mainurl = acymailing_mainURL($myLink);
			$myLink = $mainurl.$myLink;
			if((bool)$this->params->get('unsubscribetemplate', false)) $myLink .= '&tmpl=component';

			$this->listunsubscribe = true;
			$mailto = $this->params->get('listunsubscribeemail');
			if(empty($mailto)) $mailto = @$email->replyemail;
			if(empty($mailto)){
				$config = acymailing_config();
				$mailto = $config->get('reply_email');
			}
			$email->addCustomHeader('List-Unsubscribe: <'.$myLink.'>, <mailto:'.$mailto.'?subject=unsubscribe_user_'.$user->subid.'&body=Please%20unsubscribe%20user%20ID%20'.$user->subid.'>');
		}
	}

	function acymailing_replacetags(&$email, $send = true){
		if(acymailing_getVar('none', 'task', '') == 'replacetags') return;
		
		$this->_replacesubscriptiontags($email);
		$this->_replacemailtags($email);
	}

	private function _replacemailtags(&$email){
		$variables = array('subject', 'body', 'altbody');
		$acypluginsHelper = acymailing_get('helper.acyplugins');
		$result = $acypluginsHelper->extractTags($email, 'mail');
		$tags = array();

		foreach($result as $key => $oneTag){
			$field = $oneTag->id;
			if(!empty($email) && !empty($email->$field)){
				$text = $email->$field;
				$acypluginsHelper->formatString($text, $oneTag);
				$tags[$key] = $text;
			}else{
				$tags[$key] = $oneTag->default;
			}
		}

		foreach($variables as $var){
			if(empty($email->$var)) continue;
			$email->$var = str_replace(array_keys($tags), $tags, $email->$var);
		}
	}

	private function _replacelisttags(&$email, &$user, $send){
		if(!empty($email->ReplyTo)){
			$toDelete = 0;
			foreach($email->ReplyTo as $i => $replyto){
				if(trim($i) != '{list:members}') continue;
				$toDelete = $i;
				break;
			}
			if(!empty($toDelete)){
				unset($email->ReplyTo[$toDelete]);
				$acyConfig = acymailing_config();
				$listMembers = $this->loadlistmembers($email, $user);
				foreach($listMembers as $member){
					if($acyConfig->get('add_names', true) && !empty($member->name)){
						$replyToName = $email->cleanText(trim($member->name));
					}else{
						$replyToName = '';
					}
					$email->AddReplyTo($email->cleanText($member->email), $replyToName);
				}
			}
		}

		$this->acypluginsHelper = acymailing_get('helper.acyplugins');
		$tags = $this->acypluginsHelper->extractTags($email, 'list');
		if(empty($tags)) return;

		$replaceTags = array();
		foreach($tags as $oneTag => $parameter){
			$method = '_list'.trim(strtolower($parameter->id));

			if(method_exists($this, $method)){
				$replaceTags[$oneTag] = $this->$method($email, $user, $parameter);
			}else{
				$replaceTags[$oneTag] = 'Method not found : '.$method;
			}
		}

		$this->acypluginsHelper->replaceTags($email, $replaceTags, true);
	}

	private function _getattachedlistid($email, $subid){

		$mailid = $email->mailid;
		$type = strtolower($email->type);

		if(isset($this->lists[$mailid][$subid])) return $this->lists[$mailid][$subid];


		if($type == 'followup'){
			$listid = acymailing_loadResult('SELECT a.listid
							FROM #__acymailing_listsub AS a
							JOIN #__acymailing_listcampaign AS b
								ON a.listid = b.listid
							JOIN #__acymailing_listmail AS c
								ON b.campaignid = c.listid
							WHERE a.subid = '.intval($subid).'
								AND c.mailid = '.intval($mailid).'
							ORDER BY a.status DESC LIMIT 1');
			if(!empty($listid)){
				$this->lists[$mailid][$subid] = $listid;
				return $listid;
			}
		}

		if(in_array($type, array('news', 'autonews'))){
			if(!empty($subid)){
				$listid = acymailing_loadResult('SELECT a.listid FROM #__acymailing_listsub as a JOIN #__acymailing_listmail as b ON a.listid = b.listid WHERE a.subid = '.intval($subid).' AND b.mailid = '.intval($mailid).' ORDER BY a.status DESC LIMIT 1');
				if(!empty($listid)){
					$this->lists[$mailid][$subid] = $listid;
					return $listid;
				}
			}

			$listid = acymailing_loadResult('SELECT a.listid FROM #__acymailing_listmail as a JOIN #__acymailing_list as b ON a.listid = b.listid WHERE a.mailid = '.intval($mailid).' ORDER BY b.published DESC , b.visible DESC LIMIT 1');
			if(!empty($listid)){
				$this->lists[$mailid][$subid] = $listid;
				return $listid;
			}
		}

		if($type == 'welcome' && !empty($subid)){
			$listid = acymailing_loadResult('SELECT a.listid FROM #__acymailing_list as a JOIN #__acymailing_listsub as b ON a.listid = b.listid WHERE a.welmailid = '.intval($mailid).' AND b.subid = '.intval($subid).' ORDER BY b.subdate DESC LIMIT 1');
			if(!empty($listid)){
				$this->lists[$mailid][$subid] = $listid;
				return $listid;
			}
		}

		if($type == 'unsub' && !empty($subid)){
			$listid = acymailing_loadResult('SELECT a.listid FROM #__acymailing_list as a JOIN #__acymailing_listsub as b ON a.listid = b.listid WHERE a.unsubmailid = '.intval($mailid).' AND b.subid = '.intval($subid).' ORDER BY b.unsubdate DESC LIMIT 1');
			if(!empty($listid)){
				$this->lists[$mailid][$subid] = $listid;
				return $listid;
			}
		}

		$allLists = array_merge(acymailing_getVar('array', 'subscription', '', ''), explode(',', acymailing_getVar('string', 'hiddenlists', '', '')));
		$data = acymailing_getVar('array', 'data', '', '');
		if(!empty($data['listsub'])){
			$allLists = array_merge($allLists, array_keys($data['listsub']));
		}

		if(!empty($allLists) && in_array($type, array('unsub', 'welcome'))){
			acymailing_arrayToInteger($allLists);
			$listid = acymailing_loadResult('SELECT a.listid FROM #__acymailing_list as a WHERE (a.welmailid = '.intval($mailid).' OR unsubmailid = '.intval($mailid).') AND listid IN ('.implode(',', $allLists).') ORDER BY a.published DESC, a.visible DESC LIMIT 1');
			if(!empty($listid)){
				$this->lists[$mailid][$subid] = $listid;
				return $listid;
			}

			$listid = acymailing_loadResult('SELECT a.listid FROM #__acymailing_list as a WHERE (a.welmailid = '.intval($mailid).' OR unsubmailid = '.intval($mailid).') ORDER BY a.published DESC, a.visible DESC LIMIT 1');
			if(!empty($listid)){
				$this->lists[$mailid][$subid] = $listid;
				return $listid;
			}
		}

		if(!empty($allLists)){
			foreach($allLists as $listid){
				if(!empty($listid)){
					$this->lists[$mailid][$subid] = intval($listid);
					return intval($listid);
				}
			}
		}

		if(!empty($subid)){
			$listid = acymailing_loadResult('SELECT a.listid FROM #__acymailing_listsub as a JOIN #__acymailing_list as b ON a.listid = b.listid WHERE a.subid = '.intval($subid).' ORDER BY b.published DESC , b.visible DESC LIMIT 1');
			if(!empty($listid)){
				$this->lists[$mailid][$subid] = $listid;
				return $listid;
			}
		}
	}


	private function _listcount(&$email, &$user, &$parameter){
		if(!isset($parameter->listid)){
			$listid = $this->_getattachedlistid($email, $user->subid);
		}else{
			$listid = $parameter->listid;
		}

		if(empty($listid)){
			return acymailing_loadResult('SELECT COUNT(subid) FROM #__acymailing_subscriber');
		}else{
			return acymailing_loadResult('SELECT COUNT(subid) FROM #__acymailing_listsub WHERE listid = '.intval($listid).' AND status = 1');
		}
	}

	private function _listsubscription(&$email, &$user, &$parameter){
		if(empty($user->subid)) return "";
		$listSubClass = acymailing_get('class.listsub');
		return $listSubClass->getSubscriptionString($user->subid);
	}

	private function _listnames(&$email, &$user, &$parameter){
		if(empty($user->subid)) return "";
		$listSubClass = acymailing_get('class.listsub');
		$usersubscription = $listSubClass->getSubscription($user->subid);
		if(empty($usersubscription)){
			$subscribedLists = $this->_getFormListNames();
			if(empty($subscribedLists)) return '';
			return implode(isset($parameter->separator) ? $parameter->separator : ', ', $subscribedLists);
		}
		$lists = array();
		if(!empty($usersubscription)){
			foreach($usersubscription as $onesub){
				if($onesub->status < 1 || empty($onesub->published)) continue;
				$lists[] = $onesub->name;
			}
		}
		return implode(isset($parameter->separator) ? $parameter->separator : ', ', $lists);
	}


	private function _getFormListNames(){
		$allLists = array_merge(acymailing_getVar('array', 'subscription', '', ''), explode(',', acymailing_getVar('string', 'hiddenlists', '', '')));
		$data = acymailing_getVar('array', 'data', '', '');
		if(!empty($data['listsub'])){
			foreach($data['listsub'] as $i => $oneList){
				if($oneList['status'] != 1) unset($data['listsub'][$i]);
			}
			$allLists = array_merge($allLists, array_keys($data['listsub']));
		}
		if(empty($allLists)) return array();

		acymailing_arrayToInteger($allLists);
		foreach($allLists as $i => $oneList){
			if(empty($oneList)) unset($allLists[$i]);
		}
		if(empty($allLists)) return array();

		return acymailing_loadResultArray('SELECT name FROM #__acymailing_list WHERE listid IN ('.implode(',', $allLists).')');
	}

	private function _listowner(&$email, &$user, &$parameter){
		if(empty($user->subid)) return '';
		$listid = $this->_getattachedlistid($email, $user->subid);
		if(empty($listid)) return "";

		if(!isset($this->listsowner[$listid])){
			$this->listsowner[$listid] = acymailing_loadObject('SELECT u.* FROM #__acymailing_list as list JOIN #__users as u ON u.id = list.userid WHERE list.listid = '.intval($listid));
		}

		if(!in_array($parameter->field, array('username', 'name', 'email'))) return 'Field not found : '.$parameter->field;
		return @$this->listsowner[$listid]->{$parameter->field};
	}

	private function _loadlist($listid){
		if(isset($this->listsinfo[$listid])) return;

		$this->listsinfo[$listid] = acymailing_loadObject('SELECT * FROM #__acymailing_list WHERE listid = '.intval($listid));
	}

	private function _listname(&$email, &$user, &$parameter){
		if(empty($user->subid)) return '';
		$listid = $this->_getattachedlistid($email, $user->subid);
		if(empty($listid)) return "No list => no name!";

		$this->_loadlist($listid);

		return @$this->listsinfo[$listid]->name;
	}

	private function _listdescription(&$email, &$user, &$parameter){
		if(empty($user->subid)) return '';
		$listid = $this->_getattachedlistid($email, $user->subid);
		if(empty($listid)) return "No list => no description!";

		$this->_loadlist($listid);

		return @$this->listsinfo[$listid]->description;
	}

	private function _listid(&$email, &$user, &$parameter){
		if(empty($user->subid)) return '';
		$listid = $this->_getattachedlistid($email, $user->subid);
		if(empty($listid)) return "No list => no ID!";

		return $listid;
	}

	private function loadlistmembers(&$email, &$user){
		if(empty($user->subid)) return '';
		$listid = $this->_getattachedlistid($email, $user->subid);
		if(empty($listid)) return array();

		return acymailing_loadObjectList('SELECT s.email, s.name FROM #__acymailing_listsub AS l JOIN #__acymailing_subscriber AS s ON s.subid=l.subid WHERE l.listid='.intval($listid).' AND l.status=1 AND s.enabled=1 AND s.accept=1');
	}

	private function _replacesubscriptiontags(&$email){
		$match = '#(?:{|%7B)(modify[^}]*|confirm[^}]*|unsubscribe(?:\|[^}]*)?|subscribe[^}]*)(?:}|%7D)(.*)(?:{|%7B)/(modify|confirm|unsubscribe|subscribe)(?:}|%7D)#Uis';
		$variables = array('subject', 'body', 'altbody');
		$found = false;
		$results = array();
		foreach($variables as $var){
			if(empty($email->$var)) continue;
			$found = preg_match_all($match, $email->$var, $results[$var]) || $found;
			if(empty($results[$var][0])) unset($results[$var]);
		}

		if(!$found) return;

		$tags = array();
		$this->listunsubscribe = false;
		foreach($results as $var => $allresults){
			foreach($allresults[0] as $i => $oneTag){
				if(isset($tags[$oneTag])) continue;
				$tags[$oneTag] = $this->replaceSubscriptionTag($allresults, $i, $email);
			}
		}

		foreach(array_keys($results) as $var){
			$email->$var = str_replace(array_keys($tags), $tags, $email->$var);
		}
	}

	function replaceSubscriptionTag(&$allresults, $i, &$email){
		$config = acymailing_config();
		$lang = empty($email->language) ? '' : '&lang='.$email->language;

		$parameters = $this->acypluginsHelper->extractTag($allresults[1][$i]);
		$itemId = $this->params->get(strtolower($parameters->id).'itemid', $config->get('itemid', 0));
		$itemId = empty($parameters->itemid) ? $itemId : intval($parameters->itemid);
		$item = empty($itemId) ? '' : '&Itemid='.$itemId;

		if($parameters->id == 'confirm'){ //confirm your subscription link
			$myLink = acymailing_frontendLink('index.php?subid={subtag:subid}&option=com_acymailing&ctrl=user&task=confirm&key={subtag:key|urlencode}'.$item.$lang, true, (bool)$this->params->get('confirmtemplate', false));
			if(empty($allresults[2][$i])) return $myLink;
			return '<a target="_blank" href="'.$myLink.'">'.$allresults[2][$i].'</a>';
		}elseif($parameters->id == 'modify'){ //modify your subscription link
			$myLink = acymailing_frontendLink('index.php?subid={subtag:subid}&option=com_acymailing&ctrl=user&task=modify&key={subtag:key|urlencode}'.$item.$lang, true, (bool)$this->params->get('modifytemplate', false));
			if(empty($allresults[2][$i])) return $myLink;
			return '<a style="text-decoration:none;" target="_blank" href="'.$myLink.'"><span class="acymailing_modify">'.$allresults[2][$i].'</span></a>';
		}elseif($parameters->id == 'subscribe'){ //add a direct subscription link
			if(empty($parameters->lists)) return 'You must select at least one list';
			$lists = explode(',', $parameters->lists);
			acymailing_arrayToInteger($lists);
			$captchaKey = $config->get('captcha_enabled') ? '&seckey='.$config->get('security_key', '') : '';
			$myLink = acymailing_frontendLink('index.php?option=com_acymailing&ctrl=sub&task=optin&hiddenlists='.implode(',', $lists).'&user[email]={subtag:email|urlencode}'.$item.$lang.$captchaKey);
			if(empty($allresults[2][$i])) return $myLink;
			return '<a style="text-decoration:none;" target="_blank" href="'.$myLink.'"><span class="acymailing_sub">'.$allresults[2][$i].'</span></a>';
		}//unsubscribe link
		$myLink = acymailing_frontendLink('index.php?subid={subtag:subid}&option=com_acymailing&ctrl=user&task=out&mailid='.$email->mailid.'&key={subtag:key|urlencode}'.$item.$lang, true, (bool)$this->params->get('unsubscribetemplate', false));

		$this->unsubscribeLink = true;
		$this->unsubscribeItem = $item;

		if(empty($allresults[2][$i])) return $myLink;
		return '<a style="text-decoration:none;" target="_blank" href="'.$myLink.'"><span class="acymailing_unsub">'.$allresults[2][$i].'</span></a>';
	}
}//endclass
components/com_acymailing/extensions/plg_acymailing_tablecontents/index.html000060400000000054152453623450024010 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_acymailing_tablecontents/tablecontents.xml000060400000003330152453623450025402 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/plugin-install.dtd">
<install type="plugin" version="1.5" method="upgrade" group="acymailing">
	<name>AcyMailing table of contents generator</name>
	<creationDate>January 2011</creationDate>
	<version>1.0.0</version>
	<author>Acyba</author>
	<authorEmail>dev@acyba.com</authorEmail>
	<authorUrl>http://www.acyba.com</authorUrl>
	<copyright>Copyright (C) 2009-2018 ACYBA SAS - All rights reserved..</copyright>
	<license>GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html</license>
	<description>This plugin enables you to generate table of contents</description>
	<files>
		<filename plugin="tablecontents">tablecontents.php</filename>
	</files>
	<params addpath="/components/com_acymailing/params">
		<param name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-tablecontents"/>
		<param name="divider" type="radio" default="br" label="Divider" description="Separator added between each link">
			<option value="br">Carriage return</option>
			<option value="space">Space</option>
			<option value="li">ul / li</option>
		</param>
	</params>
	<config>
		<fields name="params" addfieldpath="/components/com_acymailing/params">
			<fieldset name="basic">
				<field name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-tablecontents"/>
				<field name="divider" type="radio" default="br" label="Divider" description="Separator added between each link">
					<option value="br">Carriage return</option>
					<option value="space">Space</option>
					<option value="li">ul / li</option>
				</field>
			</fieldset>
		</fields>
	</config>
</install>
components/com_acymailing/extensions/plg_acymailing_tablecontents/tablecontents.php000060400000021112152453623450025367 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
defined('_JEXEC') or die('Restricted access');

class plgAcymailingTablecontents extends JPlugin{

	var $noResult = array();

	function __construct(&$subject, $config){
		parent::__construct($subject, $config);
		if(!isset($this->params)){
			$plugin = JPluginHelper::getPlugin('acymailing', 'tablecontents');
			$this->params = new acyParameter($plugin->params);
		}
	}

	function acymailing_getPluginType(){
		$onePlugin = new stdClass();
		$onePlugin->name = acymailing_translation('ACY_TABLECONTENTS');
		$onePlugin->function = 'acymailingtablecontents_show';
		$onePlugin->help = 'plugin-tablecontents';

		return $onePlugin;
	}

	function acymailingtablecontents_show(){

		$contenttype = array();
		$contenttype[] = acymailing_selectOption('', acymailing_translation('ACY_EXISTINGANCHOR'));
		for($i = 1; $i < 6; $i++){
			$contenttype[] = acymailing_selectOption("|type:h".$i, 'H'.$i);
		}
		$contenttype[] = acymailing_selectOption('class', acymailing_translation('CLASS_NAME'));

		$contentsubtype = array();
		$contentsubtype[] = acymailing_selectOption('', acymailing_translation('ACY_NONE'));
		for($i = 1; $i < 6; $i++){
			$contentsubtype[] = acymailing_selectOption("|subtype:h".$i, 'H'.$i);
		}
		$contentsubtype[] = acymailing_selectOption('class', acymailing_translation('CLASS_NAME'));

		?>

		<script language="javascript" type="text/javascript">
			<!--
			function updateTag(){
				var tag = '{tableofcontents';
				if(document.adminForm.contenttype.value){
					if(document.adminForm.contenttype.value == 'class'){
						document.adminForm.classvalue.style.display = '';
						tag += '|class:' + document.adminForm.classvalue.value;
					}else{
						document.adminForm.classvalue.style.display = 'none';
						tag += document.adminForm.contenttype.value;
					}
				}
				if(document.adminForm.contentsubtype.value){
					if(document.adminForm.contentsubtype.value == 'class'){
						document.adminForm.subclassvalue.style.display = '';
						tag += '|subclass:' + document.adminForm.subclassvalue.value;
					}else{
						document.adminForm.subclassvalue.style.display = 'none';
						tag += document.adminForm.contentsubtype.value;
					}
				}
				tag += '}';

				setTag(tag);
			}
			//-->
		</script>
		<div class="onelineblockoptions">
			<span class="acyblocktitle"><?php echo acymailing_translation('ACY_GENERATEANCHOR'); ?></span>
			<table width="100%" class="acymailing_table">
				<tr>
					<td><?php echo acymailing_translation_sprintf('ACY_LEVEL', 1)?></td>
					<td><?php echo acymailing_select($contenttype, 'contenttype', 'size="1" onchange="updateTag();"', 'value', 'text'); ?><input type="text" style="display:none" onchange="updateTag();" name="classvalue"/></td>
				</tr>
				<tr>
					<td><?php echo acymailing_translation_sprintf('ACY_LEVEL', 2)?></td>
					<td><?php echo acymailing_select($contentsubtype, 'contentsubtype', 'size="1" onchange="updateTag();"', 'value', 'text'); ?><input type="text" style="display:none" onchange="updateTag();" name="subclassvalue"/></td>
				</tr>
			</table>
		</div>
		<?php
		acymailing_addScript(true, "document.addEventListener(\"DOMContentLoaded\", function(){ updateTag(); });");
	}


	function acymailing_replaceusertags(&$email, &$user, $send = true){

		if(isset($this->noResult[intval($email->mailid)])) return;

		$match = '#{tableofcontents(.*)}#Ui';

		$variables = array('subject', 'body', 'altbody');

		$found = false;
		foreach($variables as $var){
			if(empty($email->$var)) continue;
			$found = preg_match_all($match, $email->$var, $results[$var]) || $found;
			if(empty($results[$var][0])) unset($results[$var]);
		}

		if(!$found){
			$this->noResult[intval($email->mailid)] = true;
			return;
		}

		$mailerHelper = acymailing_get('helper.mailer');

		$htmlreplace = array();
		$textreplace = array();
		foreach($results as $var => $allresults){
			foreach($allresults[0] as $i => $oneTag){
				if(isset($htmlreplace[$oneTag])) continue;

				$article = $this->_generateTable($allresults, $i, $email);
				$htmlreplace[$oneTag] = $article;
				$textreplace[$oneTag] = $mailerHelper->textVersion($article);
				$subjectreplace[$oneTag] = strip_tags($article);
			}
		}
		$email->body = str_replace(array_keys($htmlreplace), $htmlreplace, $email->body);
		$email->altbody = str_replace(array_keys($textreplace), $textreplace, $email->altbody);
		$email->subject = str_replace(array_keys($subjectreplace), $subjectreplace, $email->subject);
	}

	function _generateTable(&$results, $i, &$email){

		$arguments = explode('|', strip_tags($results[1][$i]));
		$tag = new stdClass();
		$tag->divider = $this->params->get('divider', 'br');
		$tag->before = '';
		$tag->after = '';
		$tag->subdivider = $this->params->get('divider', 'br');
		$tag->subbefore = '';
		$tag->subafter = '';
		for($i = 1, $a = count($arguments); $i < $a; $i++){
			$args = explode(':', $arguments[$i]);
			if(isset($args[1])){
				$tag->{$args[0]} = $args[1];
			}else{
				$tag->{$args[0]} = true;
			}
		}

		if($tag->divider == 'br'){
			$tag->divider = '<br />';
			$tag->subbefore = $tag->subdivider = '<br /> - ';
		}elseif($tag->divider == 'space'){
			$tag->subdivider = ', ';
			$tag->divider = ' ';
			$tag->subbefore = ' ( ';
			$tag->subafter = ' ) ';
		}elseif($tag->divider == 'li'){
			$tag->subdivider = $tag->divider = '</li><li>';
			$tag->subbefore = $tag->before = '<ul><li>';
			$tag->subafter = $tag->after = '</li></ul>';
		}

		$this->updateMail = array();
		$this->links = array();
		$this->sublinks = array();
		$anchorLinks = $this->_findLinks($tag, $email);
		if(!empty($tag->subtype) || !empty($tag->subclass)){
			$anchorSubLinks = $this->_findLinks($tag, $email, true);
			if(empty($this->links)){
				$this->links = $this->sublinks;
				unset($this->sublinks);
			}
		}

		$links = $this->links;
		if(!empty($tag->limit)){
			$links = array_slice($links, 0, $tag->limit);
		}

		if(empty($links)) return '';
		if(!empty($this->updateMail)) $email->body = str_replace(array_keys($this->updateMail), $this->updateMail, $email->body);

		if(!empty($this->sublinks)){
			$sublinks = $this->sublinks;
			foreach($links as $ilink => $oneLink){
				$allsublinks = array();
				$from = $anchorLinks['pos'][$ilink];
				$to = empty($anchorLinks['pos'][$ilink + 1]) ? 9999999999999 : $anchorLinks['pos'][$ilink + 1];
				foreach($sublinks as $isublink => $oneSubLink){
					if($anchorSubLinks['pos'][$isublink] > $to) break;
					if($anchorSubLinks['pos'][$isublink] > $from) $allsublinks[] = $oneSubLink;
				}
				if(!empty($allsublinks)) $links[$ilink] = $links[$ilink].$tag->subbefore.implode($tag->subdivider, $allsublinks).$tag->subafter;
			}
		}

		$result = '<div class="tableofcontents">'.$tag->before.implode($tag->divider, $links).$tag->after.'</div>';
		if(file_exists(ACYMAILING_MEDIA.'plugins'.DS.'tablecontents.php')){
			ob_start();
			require(ACYMAILING_MEDIA.'plugins'.DS.'tablecontents.php');
			$result = ob_get_clean();
		}
		return $result;
	}

	function _findLinks(&$tag, &$email, $sub = false){
		if($sub){
			$varType = 'subtype';
			$varClass = 'subclass';
			$varLink = &$this->sublinks;
		}else{
			$varType = 'type';
			$varClass = 'class';
			$varLink = &$this->links;
		}
		if(!empty($tag->$varType)){
			preg_match_all('#<'.$tag->$varType.'[^>]*>((?!</ *'.$tag->$varType.'>).)*</ *'.$tag->$varType.'>#Uis', $email->body, $anchorresults);
		}elseif(!empty($tag->class)){
			preg_match_all('#<[^>]*class="'.$tag->$varClass.'"[^>]*>(<[^>]*>|[^<>])*</.*>#Uis', $email->body, $anchorresults);
			$tag->$varType = 'item';
		}else{
			preg_match_all('#<a[^>]*name="([^">]*)"[^>]*>((?!</ *a>).)*</ *a>#Uis', $email->body, $anchorresults);
		}

		if(empty($anchorresults)) return '';


		foreach($anchorresults[0] as $i => $oneContent){
			$anchorresults['pos'][$i] = strpos($email->body, $oneContent);
			$linktext = strip_tags($oneContent);
			if(empty($linktext)) continue;
			if(empty($tag->$varType)){
				$varLink[$i] = '<a href="#'.$anchorresults[1][$i].'" class="oneitem" >'.$linktext.'</a>';
			}else{
				$varLink[$i] = '<a href="#'.$tag->$varType.$i.'" class="oneitem oneitem'.$tag->$varType.'" >'.$linktext.'</a>';
				if(preg_match('#<a[^>]*>[^<]*'.preg_quote($oneContent, '#').'#Uis', $email->body, $linkBefore)){
					$this->updateMail[$linkBefore[0]] = '<a name="'.$tag->$varType.$i.'"></a>'.$linkBefore[0];
				}else{
					$this->updateMail[$oneContent] = '<a name="'.$tag->$varType.$i.'"></a>'.$oneContent;
				}
			}
		}

		return $anchorresults;
	}
}//endclass
components/com_acymailing/extensions/plg_system_regacymailing/regacymailing.php000060400000123414152453623450024522 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class plgSystemRegacymailing extends JPlugin{
	var $option = '';
	var $view = '';

	function __construct(&$subject, $config){
		parent::__construct($subject, $config);
	}

	function initAcy(){
		if(!include_once(rtrim(JPATH_ADMINISTRATOR, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.'components'.DIRECTORY_SEPARATOR.'com_acymailing'.DIRECTORY_SEPARATOR.'helpers'.DIRECTORY_SEPARATOR.'helper.php')) return false;

		if(!isset($this->params)){
			$plugin = JPluginHelper::getPlugin('system', 'regacymailing');
			$this->params = new acyParameter($plugin->params);
		}

		return true;
	}

	function onAfterRoute(){
		if(!empty($_POST['option']) && $_POST['option'] == 'com_virtuemart' && !empty($_POST['func']) && $_POST['func'] == 'shopperupdate'){
			if($this->initAcy() === false) return true;
			$this->_updateVM();
		}

		if(!empty($_REQUEST['option']) && $_REQUEST['option'] == 'com_community' && !empty($_REQUEST['task']) && ($_REQUEST['task'] == 'register_save' || $_REQUEST['task'] == 'save')){
			if($this->initAcy() === false) return true;
			$this->_saveInSession();
		}

		if(!empty($_REQUEST['option']) && $_REQUEST['option'] == 'com_jblance' && !empty($_REQUEST['layout']) && in_array($_REQUEST['layout'], array('showfront', 'planadd'))){
			if($this->initAcy() === false) return true;
			$this->_saveInSession();
		}

		if(!empty($_REQUEST['option']) && in_array($_REQUEST['option'], array('com_user', 'com_users')) && !empty($_REQUEST['view']) && in_array($_REQUEST['view'], array('register', 'registration', 'profile', 'user'))){
			if($this->initAcy() === false) return true;
			$fieldsClass = acymailing_get('class.fields');
			$fieldsClass->origin = 'joomla';
			$user = new stdClass();

			$taskVar = ACYMAILING_J16 ? 'layout' : 'task';

			if(acymailing_isAdmin()){
				if($_REQUEST['view'] == 'user' && !empty($_REQUEST[$taskVar]) && $_REQUEST[$taskVar] == 'edit'){
					$extraFields = $fieldsClass->getFields('joomlaprofile', $user);
				}
			}else{
				if(in_array($_REQUEST['view'], array('register', 'registration'))){
					$extraFields = $fieldsClass->getFields('frontjoomlaregistration', $user);
				}elseif(in_array($_REQUEST['view'], array('user', 'profile')) && (!empty($_REQUEST[$taskVar]) && $_REQUEST[$taskVar] == 'edit')){
					$extraFields = $fieldsClass->getFields('frontjoomlaprofile', $user);
				}
			}

			if(!empty($extraFields)){
				foreach($extraFields as $oneField){
					if($oneField->type != 'date') continue;
					JHTML::_('behavior.calendar');
					break;
				}
			}
		}
	}

	private function _saveInSession(){
		$acysub = acymailing_getVar('array', 'acysub', array(), '');
		$session = JFactory::getSession();
		if(!empty($acysub)){
			$session->set('acysub', $acysub);
		}

		$acysubhidden = acymailing_getVar('string', 'acysubhidden');
		if(!empty($acysubhidden)){
			$session->set('acysubhidden', $acysubhidden);
		}

		$regacy = acymailing_getVar('array', 'regacy', array(), '');
		if(!empty($regacy)){
			$session->set('regacy', $regacy);
		}
	}

	private function _updateVM(){
		$currentUserid = acymailing_currentUserId();
		if(empty($currentUserid)) return;

		$acylistsdisplayed = acymailing_getVar('string', 'acylistsdisplayed_dispall').','.acymailing_getVar('string', 'acylistsdisplayed_onecheck');
		if(strlen($acylistsdisplayed) < 2) return;
		$listsDisplayed = explode(',', $acylistsdisplayed);
		acymailing_arrayToInteger($listsDisplayed);
		if(empty($listsDisplayed)) return;

		$userClass = acymailing_get('class.subscriber');

		$subid = $userClass->subid($currentUserid);
		if(empty($subid)) return; //The user should already be there

		$visiblelistschecked = acymailing_getVar('array', 'acysub', array(), '');
		$acySubHidden = acymailing_getVar('string', 'acysubhidden');
		if(!empty($acySubHidden)){
			$visiblelistschecked = array_merge($visiblelistschecked, explode(',', $acySubHidden));
		}

		$listsClass = acymailing_get('class.list');
		$allLists = $listsClass->getLists('listid');
		if(acymailing_level(1)){
			$allLists = $listsClass->onlyCurrentLanguage($allLists);
		}

		$formLists = array();
		foreach($listsDisplayed as $listidDisplayed){
			$newlists = array();
			$newlists['status'] = in_array($listidDisplayed, $visiblelistschecked) ? '1' : '-1';
			$formLists[$listidDisplayed] = $newlists;
		}

		$userClass->saveSubscription($subid, $formLists);
	}

	function _getVmVersion(){
		$file = ACYMAILING_ROOT.'administrator'.DS.'components'.DS.'com_virtuemart'.DS.'version.php';
		if(!file_exists($file)) return '0.0.0';
		include_once($file);
		$vmversion = new vmVersion();
		if(empty($vmversion->RELEASE)){
			return vmVersion::$RELEASE;
		}else{
			return $vmversion->RELEASE;
		}
	}

	function onAfterRender(){
		if($this->initAcy() === false) return true;

		$option = acymailing_getVar('cmd', 'option', '', 'GET');
		if(empty($option)) $option = acymailing_getVar('cmd', 'option');

		if(empty($option)) return;
		$this->option = $option;

		$this->components = array();
		$this->components['com_user'] = array('view' => array('register', 'user'), 'edittasks' => array('profile', 'user'), 'lengthafter' => 200, 'email' => array('email2', 'email'), 'password' => array('password2', 'password'), 'displayBackend' => true, 'displayLoggedin' => true);
		$jversion = preg_replace('#[^0-9\.]#i', '', JVERSION);
		if(version_compare($jversion, '1.6.0', '>=')){
			$this->components['com_users'] = array('view' => array('registration', 'profile', 'user'), 'edittasks' => array('profile', 'user'), 'lengthafter' => 200, 'email' => array('jform[email2]', 'jform[email]'), 'password' => 'jform[password2]', 'displayBackend' => true, 'displayLoggedin' => true, 'checkLayout' => array('profile' => 'edit'));
		}else{
			$this->components['com_users'] = array('view' => array('registration', 'profile', 'user'), 'edittasks' => array('profile', 'user'), 'lengthafter' => 200, 'email' => array('email2', 'email'), 'password' => 'password2', 'displayBackend' => true, 'displayLoggedin' => true, 'tdfieldlabelclass' => 'key', 'tdclassfield' => 'key');
		}

		$this->components['com_alpharegistration'] = array('view' => array('register'), 'lengthafter' => 250);
		$this->components['com_ccusers'] = array('view' => array('register'), 'lengthafter' => 500);
		$this->components['com_community'] = array('view' => array('register', 'profile'), 'edittasks' => array('profile'), 'lengthafter' => 500, 'password' => 'jspassword2', 'email' => 'jsemail', 'displayLoggedin' => true, 'fieldclass' => 'form-field', 'labelclass' => 'form-label', 'tdclassfield' => 'paramlist_key', 'tdclassvalue' => 'paramlist_value');
		$this->components['com_extendedreg'] = array('view' => array('register'), 'lengthafter' => 200, 'password' => 'verify-password', 'email' => 'email');
		$this->components['com_gcontact'] = array('view' => array('registration'), 'lengthafter' => 200);
		$this->components['com_hikashop'] = array('view' => array('checkout', 'user'), 'viewvar' => 'ctrl', 'lengthafter' => 500, 'tdclassfield' => 'key', 'email' => 'data[register][email]', 'password' => 'data[register][password2]');
		$this->components['com_jblance'] = array('view' => array('guest'), 'layout' => array('register'), 'lengthaftermin' => 250, 'lengthafter' => 300, 'email' => 'email', 'password' => 'password2');
		$this->components['com_jshopping'] = array('view' => array('register', 'checkout'), 'viewvar' => array('task', 'controller'), 'lengthafter' => 200, 'email' => 'email', 'password' => 'password_2', 'displayLoggedin' => true);
		$this->components['com_juser'] = array('view' => array('user'), 'lengthafter' => 200);
		$this->components['com_mijoshop'] = array('viewvar' => array('route', 'view'), 'view' => array('registration', 'account/register', 'account/edit', 'account/registration'), 'edittasks' => array('account/edit', 'account/registration'), 'displayLoggedin' => true, 'lengthafter' => 500, 'email' => 'email', 'password' => array('confirm', 'password'));
		$this->components['com_osemsc'] = array('view' => array('register'), 'lengthafter' => 200, 'email' => 'oseemail', 'password' => 'osepassword2');
		$this->components['com_redshop'] = array('view' => array('registration'), 'lengthafter' => 200, 'password' => 'password2', 'email' => 'email1');
		$this->components['com_tienda'] = array('view' => array('checkout'), 'lengthafter' => 500, 'email' => 'email_address', 'password' => 'password2');
		$vmViews = array('shop.registration', 'account.billing', 'checkout.index', 'user', 'cart', 'editaddresscart', 'editaddresscheckout');
		if(version_compare($this->_getVmVersion(), '3.0.10', '>=')) $vmViews[] = 'askquestion';
		$this->components['com_virtuemart'] = array('view' => $vmViews, 'displayLoggedin' => true, 'viewvar' => 'page', 'lengthafter' => 500, 'acysubscribestyle' => 'style="clear:both"');

		if($option == 'com_rsform'){
			$formId = acymailing_getVar('cmd', 'formId', '', 'GET');
			if(empty($formId)) $formId = acymailing_getVar('cmd', 'formId');
			if(!empty($formId) && in_array(acymailing_getPrefix().'rsform_registration', acymailing_getTableList())){
				$registration = acymailing_loadObject('SELECT * FROM #__rsform_registration WHERE form_id = '.intval($formId).' AND published = 1');
				if(!empty($registration)){
					$regVar = empty($registration->reg_merge_vars) ? 'vars' : 'reg_merge_vars';
					$registrationVars = unserialize($registration->$regVar);
					$this->components['com_rsform'] = array('view' => array('rsform'), 'lengthafter' => 220, 'lengthaftermin' => 190, 'password' => array('form['.$registrationVars['password2'].']', 'form['.$registrationVars['password1'].']'), 'email' => array('form['.$registrationVars['email2'].']', 'form['.$registrationVars['email1'].']'));
				}
			}
		}

		$excludedComponents = $this->params->get('excluded');
		if(!empty($excludedComponents)){
			if(!ACYMAILING_J16) $excludedComponents = explode(',', $excludedComponents);
			foreach($excludedComponents as $oneComponent){
				unset($this->components[$oneComponent]);
			}
		}

		if(!isset($this->components[$option])) return;
		$viewVar = (isset($this->components[$option]['viewvar']) ? $this->components[$option]['viewvar'] : 'view');
		if(!is_array($viewVar)){
			if(!in_array(acymailing_getVar('string', $viewVar, acymailing_getVar('string', 'task', acymailing_getVar('string', 'view'))), $this->components[$option]['view'])) return;
			$this->view = acymailing_getVar('string', $viewVar, acymailing_getVar('string', 'task', acymailing_getVar('string', 'view')));
		}else{
			$isvalid = false;
			foreach($viewVar as $oneVar){
				if(in_array(acymailing_getVar('string', $oneVar, acymailing_getVar('string', 'task', acymailing_getVar('string', 'view'))), $this->components[$option]['view'])){
					$isvalid = true;
					$this->view = acymailing_getVar('string', $oneVar, acymailing_getVar('string', 'task', acymailing_getVar('string', 'view')));
					break;
				}
			}
			if(!$isvalid) return;
		}

		if(isset($this->components[$option]['layout']) && !in_array(acymailing_getVar('string', 'layout'), $this->components[$option]['layout'])) return;

		if(empty($this->components[$option]['displayBackend'])){
			if(acymailing_isAdmin()) return;
		}
		if(empty($this->components[$option]['displayLoggedin'])){
			$currentUserid = acymailing_currentUserId();
			if(!empty($currentUserid)) return;
		}


		if($option == 'com_community' && in_array(acymailing_getVar('string', 'task'), array('registerAvatar', 'registerProfile'))) return;

		$this->_addFields();
		$this->_addLists();
		$this->_addCSS();
	}

	private function _addFields(){
		if(!acymailing_level(3)) return;

		$option = $this->option;

		if(empty($this->components[$option]['lengthaftermin'])) $this->components[$option]['lengthaftermin'] = 0;

		if(acymailing_isAdmin()){
			$area = 'joomlaprofile';
		}elseif(!empty($this->components[$option]['edittasks']) && in_array($this->view, $this->components[$option]['edittasks'])){
			$area = 'frontjoomlaprofile';
		}else{
			$area = 'frontjoomlaregistration';
		}

		$fieldsClass = acymailing_get('class.fields');
		$fieldsClass->origin = 'joomla';
		$user = new stdClass();
		$extraFields = $fieldsClass->getFields($area, $user);

		$newOrdering = array();
		foreach($extraFields as $fieldnamekey => $oneField){
			if(in_array($oneField->namekey, array('name', 'email'))) continue;
			$newOrdering[] = $fieldnamekey;
		}

		if(empty($newOrdering)) return;

		$body = JResponse::getBody();

		$severalValueTest = false;
		if($this->params->get('customfieldsafter', 'email') == "custom"){
			$customFieldAfter = explode(';', str_replace(array('\\[', '\\]'), array('[', ']'), $this->params->get('customfieldsaftercustom')));
			$after = !empty($customFieldAfter) ? $customFieldAfter : $this->components[$option]['email'];
		}elseif(!empty($this->components[$option][$this->params->get('customfieldsafter', 'email')])){
			$after = $this->components[$option][$this->params->get('customfieldsafter', 'email')];
		}else{
			$after = ($this->params->get('customfieldsafter', 'email') == 'email') ? 'email' : 'password2';
		}
		if(is_array($after)){
			$severalValueTest = true;
			$allAfters = $after;
			$after = $after[0];
		}

		$allFormats = array();
		$allFormats['tr'] = array('tagfield' => 'tr', 'tagfieldname' => 'td', 'tagfieldvalue' => 'td');
		$allFormats['li'] = array('tagfield' => 'li', 'tagfieldname' => '', 'tagfieldvalue' => 'div');
		$allFormats['div'] = array('tagfield' => 'div', 'tagfieldname' => '', 'tagfieldvalue' => '');
		$allFormats['p'] = array('tagfield' => 'p', 'tagfieldname' => '', 'tagfieldvalue' => '');
		$allFormats['dd'] = array('tagfield' => '', 'tagfieldname' => 'dt', 'tagfieldvalue' => 'dd');

		$currentFormat = '';
		foreach($allFormats as $oneFormat => $values){
			if(preg_match('#(name="'.preg_quote($after).'".{'.$this->components[$option]['lengthaftermin'].','.$this->components[$option]['lengthafter'].'}</'.$oneFormat.'>)#Uis', $body)){
				$currentFormat = $oneFormat;
				break;
			}
		}

		if(empty($currentFormat) && $severalValueTest){
			$i = 1;
			while(empty($currentFormat) && $i < count($allAfters)){
				foreach($allFormats as $oneFormat => $values){
					if(preg_match('#(name="'.preg_quote($allAfters[$i]).'".{'.$this->components[$option]['lengthaftermin'].','.$this->components[$option]['lengthafter'].'}</'.$oneFormat.'>)#Uis', $body)){
						$after = $allAfters[$i];
						$currentFormat = $oneFormat;
						break;
					}
				}
				$i++;
			}
		}

		if(empty($currentFormat)){
			if(JDEBUG) echo 'regAcyMailing plugin, could not find the right format to display the fields...';
			return false;
		}

		$text = '';
		if(!empty($this->components[$option]['labelclass'])){
			$fieldsClass->labelClass = $this->components[$option]['labelclass'];
		}

		if(acymailing_isAdmin()){
			$jversion = preg_replace('#[^0-9\.]#i', '', JVERSION);
			if(version_compare($jversion, '1.6.0', '>=')){
				$currentUserId = acymailing_getVar('int', 'id', 0);
			}else{
				$currentUserIdArray = acymailing_getVar('array', 'cid', array());
				if(is_array($currentUserIdArray) && !empty($currentUserIdArray)){
					$currentUserId = array_shift($currentUserIdArray);
				}else{
					$currentUserId = 0;
				}
			}
		}else{
			$currentUserId = acymailing_currentUserId();
		}

		if(!empty($this->components[$option]['edittasks']) && in_array($this->view, $this->components[$option]['edittasks']) && $currentUserId != 0){
			$userClass = acymailing_get('class.subscriber');
			$acyUserData = $userClass->get($userClass->subid($currentUserId));
			if(!empty($acyUserData->email)) $fieldsClass->currentUser = $acyUserData;
		}

		foreach($newOrdering as $fieldName){
			if(!empty($allFormats[$currentFormat]['tagfield'])) $text .= '<'.$allFormats[$currentFormat]['tagfield'].' id="acy'.$fieldName.'" class="acyregfield">';
			if(!empty($allFormats[$currentFormat]['tagfieldname'])) $text .= '<'.$allFormats[$currentFormat]['tagfieldname'].' class="key acyregfieldname'.(!empty($this->components[$option]['tdfieldlabelclass']) ? ' '.$this->components[$option]['tdfieldlabelclass'] : '').'">';
			$text .= $fieldsClass->getFieldName($extraFields[$fieldName]);
			if(!empty($allFormats[$currentFormat]['tagfieldname'])) $text .= '</'.$allFormats[$currentFormat]['tagfieldname'].'>';
			if(!empty($allFormats[$currentFormat]['tagfieldvalue'])) $text .= '<'.$allFormats[$currentFormat]['tagfieldvalue'].' class="acyregfieldvalue'.(empty($this->components[$option]['fieldclass']) ? '' : ' '.$this->components[$option]['fieldclass']).'" >';
			$fieldValue = (!empty($acyUserData->$fieldName) ? $acyUserData->$fieldName : $extraFields[$fieldName]->default);
			$text .= $fieldsClass->display($extraFields[$fieldName], $fieldValue, 'regacy['.$fieldName.']');
			if(!empty($allFormats[$currentFormat]['tagfieldvalue'])) $text .= '</'.$allFormats[$currentFormat]['tagfieldvalue'].'>';
			if(!empty($allFormats[$currentFormat]['tagfield'])) $text .= '</'.$allFormats[$currentFormat]['tagfield'].'>';
		}
		$currentUserid = acymailing_currentUserId();
		if(acymailing_isAdmin()){
			if(ACYMAILING_J25){
				$formid = 'user-form';
			}else $formid = 'adminForm';
		}elseif(empty($currentUserid)){
			if(ACYMAILING_J25){
				$formid = 'member-registration';
			}else $formid = 'josForm';
		}else{
			if(ACYMAILING_J25 || (ACYMAILING_J30 && (!JComponentHelper::isInstalled('com_k2') || !JComponentHelper::isEnabled('com_k2')))){
				$formid = 'member-profile';
			}else $formid = 'userform';
		}

		$js = $fieldsClass->prepareConditionalDisplay($extraFields, 'regacy', 'joomlaProfile', $formid);
		$js .= $this->_getAdditionalJs($extraFields);

		if(ACYMAILING_J16) {
			$script = '';
			$fieldsClass = acymailing_get('class.fields');
			foreach($extraFields as $oneField){
				if($oneField->type != 'text' || empty($oneField->options['checkcontent'])) continue;
				$script .= '
						var '.$oneField->namekey.'Test = new RegExp("';
				switch($oneField->options['checkcontent']) {
					case 'number':
						$script .= '^[0-9]*$';
						break;
					case 'letter':
						$script .= '^[A-Za-z\u00C0-\u017F ]*$';
						break;
					case 'letnum':
						$script .= '^[0-9a-zA-Z\u00C0-\u017F ]*$';
						break;
					case 'regexp':
						$script .= $oneField->options['regexp'];
						break;
				}

				if(!empty($oneField->options['errormessagecheckcontent'])){
					$errorMessage = $oneField->options['errormessagecheckcontent'];
				}elseif(!empty($oneField->options['errormessage'])){
					$errorMessage = $oneField->options['errormessage'];
				}else{
					$errorMessage = acymailing_translation_sprintf('FIELD_CONTENT_VALID', $fieldsClass->trans($oneField->fieldname));
				}

				$script .= '");
						if(document.getElementById("field_'.$oneField->namekey.'").value.length > 0 && !'.$oneField->namekey.'Test.test(document.getElementById("field_'.$oneField->namekey.'").value)){
							alert("'.addslashes($errorMessage).'");
							return false;
						}';
			}
			if(!empty($script)){

				if(acymailing_isAdmin()){
					$script = 'if(arguments[0] != "user.cancel"){' . $script . '}';
					if (strpos($body, 'Joomla.submitbutton =') === false) {

						$script = 'Joomla.submitbutton = function(pressbutton) {
										' . $script . '
										Joomla.submitform(pressbutton);
									}';
						$js .= $script;
					} else {
						$body = preg_replace('#(Joomla\.submitbutton =[^{]+\{)#Uis', '$1' . $script, $body, 1);
					}
				}else {
					$currentUserid = acymailing_currentUserId();
					if (empty($currentUserid) && ACYMAILING_J30) {
						$script = 'var regform = document.getElementById("' . $formid . '");
								if(!regform) regform = document.getElementsByName("' . $formid . '")[0];
								var submitbutton = regform.querySelector(\'button[type="submit"]\');
								var oldclick = submitbutton.getAttribute("onclick");
								var newclick = function(){
									' . $script . '
									eval(oldclick);
								}
								submitbutton.onclick = newclick;';
					}else{
						$script = 'var regform = document.getElementById("' . $formid . '");
									if(!regform) regform = document.getElementsByName("' . $formid . '")[0];
									var oldsubmit = regform.getAttribute("onsubmit");
									var newsubmit = function(){
										' . $script . '
										eval(oldsubmit);
									}
									regform.onsubmit = newsubmit;';
					}
					$body = str_replace('</body>', '<script type="text/javascript">' . $script . '</script></body>', $body);
				}
			}
		}

		$body = str_replace('</head>', '<script type="text/javascript">'.$js.'</script></head>', $body);

		$body = preg_replace('#(name="'.preg_quote($after).'".{'.$this->components[$option]['lengthaftermin'].','.$this->components[$option]['lengthafter'].'}</'.$currentFormat.'>)#Uis', '$1'.$text, $body, 1);
		JResponse::setBody($body);
		return;
	}

	private function _getAdditionalJs($fields){
		$js = '';
		foreach($fields as $oneField){
			if($oneField->type == 'date'){
				if(empty($oneField->options['format'])) $oneField->options['format'] = "%Y-%m-%d";
				$js .= 'document.addEventListener("DOMContentLoaded", function(){Calendar.setup({
						inputField: "field_'.$oneField->namekey.'",
						ifFormat: "'.$oneField->options['format'].'",
						button: "field_'.$oneField->namekey.'_img",
						align: "Tl",
						singleClick: true,
						firstDay: 0
					});});';
			}
		}
		return $js;
	}

	private function _addLists(){
		$option = $this->option;

		$visibleLists = $this->params->get('lists', 'None');
		if($visibleLists == 'None') return;

		$visibleListsArray = array();
		$listsClass = acymailing_get('class.list');
		$allLists = $listsClass->getLists('listid');
		if(acymailing_level(1)){
			$allLists = $listsClass->onlyCurrentLanguage($allLists);
		}

		$isAdmin = acymailing_isAdmin();
		if(strpos($visibleLists, ',') OR is_numeric($visibleLists)){
			$allvisiblelists = explode(',', $visibleLists);
			foreach($allLists as $oneList){
				if($oneList->published && ($oneList->visible || $isAdmin) && in_array($oneList->listid, $allvisiblelists)) $visibleListsArray[] = $oneList->listid;
			}
		}elseif(strtolower($visibleLists) == 'all'){
			foreach($allLists as $oneList){
				if($oneList->published && ($oneList->visible || $isAdmin)){
					$visibleListsArray[] = $oneList->listid;
				}
			}
		}

		if(empty($visibleListsArray)) return;

		$checkedLists = $this->params->get('listschecked', 'All');
		$userClass = acymailing_get('class.subscriber');

		if(acymailing_isAdmin()){
			$jversion = preg_replace('#[^0-9\.]#i', '', JVERSION);
			if(version_compare($jversion, '1.6.0', '>=')){
				$currentUserId = acymailing_getVar('int', 'id', 0);
			}else{
				$currentUserIdArray = acymailing_getVar('array', 'cid', array());
				if(is_array($currentUserIdArray) && !empty($currentUserIdArray)) $currentUserId = array_shift($currentUserIdArray);
			}
		}else{
			$currentid = acymailing_currentUserId();
			if(!empty($currentid)){
				$currentUserId = $currentid;
			}
		}

		if(!empty($currentUserId)){
			$currentSubid = $userClass->subid($currentUserId);
			if(!empty($currentSubid)){
				$currentSubscription = $userClass->getSubscriptionStatus($currentSubid, $visibleListsArray);
				$checkedLists = '';
				foreach($currentSubscription as $listid => $oneSubsciption){
					if($oneSubsciption->status == '1' || $oneSubsciption->status == '2') $checkedLists .= $listid.',';
				}
			}
		}

		if(strtolower($checkedLists) == 'all'){
			$checkedListsArray = $visibleListsArray;
		}elseif(strpos($checkedLists, ',') OR is_numeric($checkedLists)){
			$checkedListsArray = explode(',', $checkedLists);
		}else{
			$checkedListsArray = array();
		}

		$subText = $this->params->get('subscribetext');
		if(empty($subText)){
			if(in_array($this->params->get('displaymode', 'dispall'), array('dispall', 'dropdown'))){
				$subText = acymailing_translation('SUBSCRIPTION').':';
			}else{
				$subText = acymailing_translation('YES_SUBSCRIBE_ME');
			}
		}else{
			$subText = acymailing_translation($subText);
		}

		$body = JResponse::getBody();

		$severalValueTest = false;
		if($this->params->get('fieldafter', 'password') == 'custom'){
			$listAfter = explode(';', str_replace(array('\\[', '\\]'), array('[', ']'), $this->params->get('fieldaftercustom')));
			$after = !empty($listAfter) ? $listAfter : $this->components[$option]['password'];
		}elseif(!empty($this->components[$option][$this->params->get('fieldafter', 'password')])){
			$after = $this->components[$option][$this->params->get('fieldafter', 'password')];
		}else{
			$after = ($this->params->get('fieldafter', 'password') == 'email') ? 'email' : 'password2';
		}
		if(is_array($after)){
			$severalValueTest = true;
			$allAfters = $after;
			$after = $after[0];
		}

		$listsDisplayed = '<input type="hidden" value="'.implode(',', $visibleListsArray).'" name="acylistsdisplayed_'.$this->params->get('displaymode', 'dispall').'" />';
		$return = '';
		if($this->params->get('displaymode', 'dispall') == 'dispall'){
			$return = '<table class="acy_lists" style="border:0px">';

			$displayCategories = $this->params->get('addcategory', '0');
			if($displayCategories){
				$listsByCategory = array();
				foreach($allLists as $id => $oneList){
					if(in_array($id,$visibleListsArray)) $listsByCategory[$oneList->category][] = $id;
				}
				ksort($listsByCategory);

				$visibleListsArray = array();
				foreach($listsByCategory as $oneCat => $itsLists){
					$visibleListsArray = array_merge($visibleListsArray, $itsLists);
				}
			}
			$currentCategory = '';
			foreach($visibleListsArray as $oneList){
				if(!empty($displayCategories) && !empty($allLists[$oneList]->category) && $currentCategory != $allLists[$oneList]->category){
					$return .= '<tr style="border:0px"><td style="border:0px" nowrap="nowrap" colspan="2"><div class="acylistcategory'.htmlspecialchars($allLists[$oneList]->category, ENT_QUOTES, 'UTF-8').'">'.htmlspecialchars($allLists[$oneList]->category, ENT_QUOTES, 'UTF-8').'</div></td></tr>';
					$currentCategory = $allLists[$oneList]->category;
				}
				$check = in_array($oneList, $checkedListsArray) ? 'checked="checked"' : '';
				$return .= '<tr style="border:0px"><td style="border:0px"><input type="checkbox" id="acy_list_'.$oneList.'" class="acymailing_checkbox" name="acysub[]" '.$check.' value="'.$oneList.'"/></td><td style="border:0px;padding-left:10px;" nowrap="nowrap"><label for="acy_list_'.$oneList.'" class="acylabellist">';
				$return .= $allLists[$oneList]->name;
				$return .= '</label></td></tr>';
			}
			$return .= '</table>';
		}elseif($this->params->get('displaymode', 'dispall') == 'onecheck'){
			$check = '';
			foreach($visibleListsArray as $oneList){
				if(in_array($oneList, $checkedListsArray)){
					$check = 'checked="checked"';
					break;
				};
			}
			$return = '<span class="acysubscribe_span"><input type="checkbox" id="acysubhidden" name="acysubhidden" value="'.implode(',', $visibleListsArray).'" '.$check.' /><label for="acysubhidden">'.$subText.'</label>'.$listsDisplayed.'</span>';
		}elseif($this->params->get('displaymode', 'dispall') == 'dropdown'){
			$return = '<select name="acysub[1]">';
			foreach($visibleListsArray as $oneList){
				$return .= '<option value="'.$oneList.'">'.$allLists[$oneList]->name.'</option>';
			}
			$return .= '</select>';
		}

		$return .= '<input type="hidden" name="allVisibleLists" value="'.implode(',', $visibleListsArray).'" />';

		$resInsertLists = $this->addListsReplace($after, $body, $subText, $listsDisplayed, $return);
		if(!$resInsertLists && $severalValueTest){
			$i = 1;
			while(!$resInsertLists && $i < count($allAfters)){
				$resInsertLists = $this->addListsReplace($allAfters[$i], $body, $subText, $listsDisplayed, $return);
				$i++;
			}
		}
	}

	private function addListsReplace($after, $body, $subText, $listsDisplayed, $return){
		$option = $this->option;

		if(empty($this->components[$option]['lengthaftermin'])) $this->components[$option]['lengthaftermin'] = 0;
		if(empty($this->components[$option]['acysubscribestyle'])) $this->components[$option]['acysubscribestyle'] = '';
		if(preg_match('#(name *= *"'.preg_quote($after).'".{'.$this->components[$option]['lengthaftermin'].','.$this->components[$option]['lengthafter'].'}</tr>)#Uis', $body)){
			$tdclassfield = '';
			$tdclassvalue = '';
			if(!empty($this->components[$option]['tdclassfield'])) $tdclassfield = 'class="'.$this->components[$option]['tdclassfield'].'"';
			if(!empty($this->components[$option]['tdclassvalue'])) $tdclassvalue = 'class="'.$this->components[$option]['tdclassvalue'].'"';

			if(in_array($this->params->get('displaymode', 'dispall'), array('dispall', 'dropdown'))){
				$return = '<tr class="acysubscribe"><td '.$tdclassfield.' style="padding-top:5px" valign="top">'.$subText.$listsDisplayed.'</td><td '.$tdclassvalue.'>'.$return.'</td></tr>';
			}else{
				$return = '<tr class="acysubscribe"><td colspan="2">'.$return.'</td></tr>';
			}
			$body = preg_replace('#(name *= *"'.preg_quote($after).'".{'.$this->components[$option]['lengthaftermin'].','.$this->components[$option]['lengthafter'].'}</tr>)#Uis', '$1'.$return, $body, 1);
			JResponse::setBody($body);
			return true;
		}

		$formats = array('li' => array('li', 'li'), 'div' => array('div', 'div'), 'p' => array('div', 'div'), 'dd' => array('dt', 'div'));
		foreach($formats as $oneFormat => $dispall){
			if(preg_match('#(name *= *"'.preg_quote($after).'".{'.$this->components[$option]['lengthaftermin'].','.$this->components[$option]['lengthafter'].'}</'.$oneFormat.'>)#Uis', $body)){
				if(in_array($this->params->get('displaymode', 'dispall'), array('dispall', 'dropdown'))){
					if($oneFormat == 'dd'){
						$return = '<dt class="acysubscribe"><label class="labelacysubscribe">'.$subText.$listsDisplayed.'</label></dt><dd>'.$return.'</dd>';
					}else{
						$return = '<'.$dispall[0].' class="acysubscribe"><label class="labelacysubscribe">'.$subText.$listsDisplayed.'</label>'.$return.'</'.$dispall[0].'>';
					}
				}else{
					$return = '<'.$dispall[1].' class="acysubscribe" '.$this->components[$option]['acysubscribestyle'].' >'.$return.'</'.$dispall[1].'>';
				}
				$body = preg_replace('#(name *= *"'.preg_quote($after).'".{'.$this->components[$option]['lengthaftermin'].','.$this->components[$option]['lengthafter'].'}</'.$oneFormat.'>)#Uis', '$1'.$return, $body, 1);
				JResponse::setBody($body);
				return true;
			}
		}

		foreach($formats as $oneFormat => $dispall){
			if(preg_match('#(name *= *"'.preg_quote($after).'"((?!</'.$oneFormat.'>).)*</'.$oneFormat.'>)#Uis', $body)){
				if(in_array($this->params->get('displaymode', 'dispall'), array('dispall', 'dropdown'))){
					if($oneFormat == 'dd'){
						$return = '<dt class="acysubscribe"><label class="labelacysubscribe">'.$subText.$listsDisplayed.'</label></dt><dd>'.$return.'</dd>';
					}else{
						$return = '<'.$dispall[0].' class="acysubscribe"><label class="labelacysubscribe">'.$subText.$listsDisplayed.'</label>'.$return.'</'.$dispall[0].'>';
					}
				}else{
					$return = '<'.$dispall[1].' class="acysubscribe" '.$this->components[$option]['acysubscribestyle'].' >'.$return.'</'.$dispall[1].'>';
				}
				$body = preg_replace('#(name *= *"'.preg_quote($after).'"((?!</'.$oneFormat.'>).)*</'.$oneFormat.'>)#Uis', '$1'.$return, $body, 1);
				JResponse::setBody($body);
				return true;
			}
		}

		return false;
	}

	private function _addCSS(){
		$style = $this->params->get('customcss');
		$jversion = preg_replace('#[^0-9\.]#i', '', JVERSION);

		if(empty($style) && version_compare($jversion, '1.6.0', '<')) return;

		if(empty($style)){
			$stylestring = '<style type="text/css">'."\n";
			if(version_compare($jversion, '3.0.0', '>=')){
				$stylestring .= '.acyregfield label, .acysubscribe label {float:left; width:160px; '.(!acymailing_isAdmin() ? 'text-align:right;' : '').'}'."\n";
				$stylestring .= '.acyregfield span label, .acysubscribe .acy_lists label {width:auto;}'."\n";
				$stylestring .= '.acyregfield div:first-of-type, .acyregfield select:first-of-type, .acyregfield input, .acyregfield textarea, .acysubscribe input {margin-left:20px;}'."\n";
				$stylestring .= '.acyregfield, .acysubscribe {clear:both; padding-top:18px;}'."\n";
			}elseif(version_compare($jversion, '1.6.0', '>=') && acymailing_isAdmin()){
				$stylestring .= 'table.acy_lists{float:left;}'."\n";
			}
			$stylestring .= '</style>'."\n";
		}else{
			$stylestring = '<style type="text/css">'."\n".$style."\n".'</style>'."\n";
		}
		$body = JResponse::getBody();
		$body = preg_replace('#</head>#', $stylestring.'</head>', $body, 1);
		JResponse::setBody($body);
	}

	function onUserBeforeSave($user, $isnew, $new){
		if($this->initAcy() === false) return true;

		return $this->onBeforeStoreUser($user, $isnew);
	}

	function plgVmOnAskQuestion($VendorEmail, $vars, $function){
		if($this->initAcy() === false) return true;

		$user = JFactory::getUser();

		$id = acymailing_loadResult('SELECT id FROM #__users WHERE email = '.acymailing_escapeDB($vars['user'][email]));
		if(empty($id)){
			$isnew = true;
			$user->id = 0;
		}else{
			$isnew = false;
			$user->id = $id;
		}
		$user->email = $vars['user'][email];
		$user->name = $vars['user'][name];
		$user->block = 0;

		$this->onAfterStoreUser($user, $isnew, true, '');
	}

	function onBeforeStoreUser($user, $isnew){
		if($this->initAcy() === false) return true;

		if(is_object($user)) $user = get_object_vars($user);

		$this->oldUser = $user;

		return true;
	}

	function onAfterUserCreate(&$element){
		if($this->initAcy() === false) return true;

		$formData = acymailing_getVar('array', 'data', array(), '');

		if(empty($element->user_email) || empty($formData['address']) || !empty($element->user_cms_id) || acymailing_isAdmin()) return;

		acymailing_setVar('acy_source', 'hikashop');

		$name = @$formData['address']['address_firstname'].(!empty($formData['address']['address_middle_name']) ? ' '.$formData['address']['address_middle_name'] : '').(!empty($formData['address']['address_lastname']) ? ' '.$formData['address']['address_lastname'] : '');
		$user = array('id' => 0, 'block' => 0, 'email' => $element->user_email, 'name' => $name);
		$this->onAfterStoreUser($user, true, true, '');
	}

	function onUserAfterSave($user, $isnew, $success, $msg){
		if($this->initAcy() === false) return true;

		return $this->onAfterStoreUser($user, $isnew, $success, $msg);
	}

	function onAfterStoreUser($user, $isnew, $success, $msg){
		if($this->initAcy() === false) return true;

		if(is_object($user)) $user = get_object_vars($user);

		if($success === false OR empty($user['email'])) return true;

		if(!isset($this->params)){
			$plugin = JPluginHelper::getPlugin('system', 'regacymailing');
			$this->params = new acyParameter($plugin->params);
		}

		if(!acymailing_getVar('cmd', 'acy_source')) acymailing_setVar('acy_source', 'joomla');

		$config = acymailing_config();

		$userClass = acymailing_get('class.subscriber');
		$joomUser = new stdClass();
		$joomUser->email = trim(strip_tags($user['email']));
		if(!empty($user['name'])) $joomUser->name = trim(strip_tags($user['name']));
		if(empty($user['block']) && !$this->params->get('forceconf', 0)) $joomUser->confirmed = 1;
		$joomUser->enabled = 1 - (int)$user['block'];
		$joomUser->userid = $user['id'];

		$userHelper = acymailing_get('helper.user');
		if(!$userHelper->validEmail($joomUser->email)) return true;

		if(!acymailing_isAdmin()) $userClass->geolocRight = true;

		if(!$isnew AND !empty($this->oldUser['email']) AND $user['email'] != $this->oldUser['email']){
			$joomUser->subid = $userClass->subid($this->oldUser['email']);
		}
		if(empty($joomUser->subid)){
			if(empty($joomUser->userid)){
				$joomUser->subid = null;
			}else{
				$joomUser->subid = $userClass->subid($joomUser->userid);
			}
		}

		if(!empty($joomUser->subid)){
			$currentSubid = $userClass->subid($joomUser->email);
			if(!empty($currentSubid) && $joomUser->subid != $currentSubid){
				$userClass->delete($currentSubid);
			}
		}

		$userClass->checkVisitor = false;
		$userClass->sendConf = false;

		$isnew = (bool)($isnew || empty($joomUser->subid));

		$customValues = acymailing_getVar('array', 'regacy', array(), '');
		$session = JFactory::getSession();
		if(empty($customValues) && $session->get('regacy')){
			$customValues = $session->get('regacy');
			$session->set('regacy', null);
		}
		if(!empty($customValues)){
			$userClass->checkFields($customValues, $joomUser);
		}

		$userClass->triggerFilterBE = true;
		$subid = $userClass->save($joomUser);

		$listsToSubscribe = ($isnew) ? $config->get('autosub', 'None') : 'None';
		$currentSubscription = $userClass->getSubscriptionStatus($subid);

		$listsClass = acymailing_get('class.list');
		$allLists = $listsClass->getLists('listid');
		if(acymailing_level(1)){
			$allLists = $listsClass->onlyCurrentLanguage($allLists);
		}

		$session = JFactory::getSession();
		$visiblelistschecked = acymailing_getVar('array', 'acysub', array(), '');
		if(empty($visiblelistschecked) && $session->get('acysub')){
			$visiblelistschecked = $session->get('acysub');
			$session->set('acysub', null);
		}

		$acySubHidden = acymailing_getVar('string', 'acysubhidden');
		if(empty($acySubHidden) && $session->get('acysubhidden')){
			$acySubHidden = $session->get('acysubhidden');
			$session->set('acysubhidden', null);
		}

		if(!empty($acySubHidden)){
			$visiblelistschecked = array_merge($visiblelistschecked, explode(',', $acySubHidden));
		}

		$allvisiblelists = acymailing_getVar('string', 'allVisibleLists');
		$allvisiblelistsArray = explode(',', $allvisiblelists);

		$listsArray = array();
		if(strpos($listsToSubscribe, ',') || is_numeric($listsToSubscribe)){
			$listsArrayParam = explode(',', $listsToSubscribe);
			foreach($allLists as $oneList){
				$okSub = false;
				if(in_array($oneList->listid, $listsArrayParam) && (!in_array($oneList->listid, $allvisiblelistsArray) || in_array($oneList->listid, $visiblelistschecked))) $okSub = true;
				if($oneList->published && (in_array($oneList->listid, $visiblelistschecked) || $okSub)){
					$listsArray[] = $oneList->listid;
				}
			}
		}elseif(strtolower($listsToSubscribe) == 'all'){
			foreach($allLists as $oneList){
				$okSub = false;
				if(!in_array($oneList->listid, $allvisiblelistsArray) || in_array($oneList->listid, $visiblelistschecked)) $okSub = true;
				if($oneList->published && $okSub){
					$listsArray[] = $oneList->listid;
				}
			}
		}elseif(!empty($visiblelistschecked)){
			foreach($allLists as $oneList){
				if($oneList->published && in_array($oneList->listid, $visiblelistschecked)){
					$listsArray[] = $oneList->listid;
				}
			}
		}
		$statusAdd = (empty($joomUser->enabled) || (empty($joomUser->confirmed) && $config->get('require_confirmation', false))) ? 2 : 1;
		$addlists = array();
		if(!empty($listsArray)){
			foreach($listsArray as $idOneList){
				if(!isset($currentSubscription[$idOneList]) || $currentSubscription[$idOneList]->status == -1){
					$addlists[$statusAdd][$idOneList] = $idOneList;
				}
			}
		}

		$listsubClass = acymailing_get('class.listsub');
		$userSubscriptions = $listsubClass->getSubscription($subid);

		if(!$isnew && !empty($allvisiblelistsArray)){
			$subscribedLists = array_keys($userSubscriptions);
			$unsubscribeLists = array_intersect($subscribedLists, array_diff($allvisiblelistsArray, $visiblelistschecked));
			if(!empty($unsubscribeLists)) $listsubClass->updateSubscription($subid, array(-1 => $unsubscribeLists));
		}

		if(!empty($addlists)){
			if(!empty($user['gid'])) $listsubClass->gid = $user['gid'];
			if(!empty($user['groups'])) $listsubClass->gid = $user['groups'];
			$listsToUpdate = array_intersect(array_keys($userSubscriptions), $addlists[$statusAdd]);
			$updateLists = array();

			if(!empty($listsToUpdate)){
				foreach($listsToUpdate as $key => $oneListToUpdate){
					if($userSubscriptions[$oneListToUpdate]->status == -1 && !in_array($oneListToUpdate, $allvisiblelistsArray)) continue;
					$updateLists[] = $oneListToUpdate;
				}

				if(!empty($updateLists)) $listsubClass->updateSubscription($subid, array($statusAdd => $updateLists));
				$addlists[$statusAdd] = array_diff($addlists[$statusAdd], $listsToUpdate);
			}

			if(!empty($addlists[$statusAdd])) $listsubClass->addSubscription($subid, $addlists);
		}

		if($isnew && $this->params->get('sendnotif', false)){
			$userClass->sendNotification();
		}

		$listssub = $listsubClass->getSubscription($subid);

		if($isnew && $this->params->get('forceconf', 0) && empty($user['block'])){
			$userClass->sendConf($subid);
			return true;
		}

		if($isnew || empty($this->oldUser['block']) || !empty($user['block'])) return true;

		if($this->params->get('forceconf', 0)){
			if(!empty($listssub)) $userClass->sendConf($subid);
		}else{
			$userClass->confirmSubscription($subid);
		}

		return true;
	}

	function onUserAfterDelete($user, $success, $msg){
		if($this->initAcy() === false) return true;

		return $this->onAfterDeleteUser($user, $success, $msg);
	}

	function onAfterDeleteUser($user, $success, $msg){
		if($this->initAcy() === false) return true;

		if(is_object($user)) $user = get_object_vars($user);

		if($success === false || empty($user['email'])) return true;

		$userClass = acymailing_get('class.subscriber');
		$subid = $userClass->subid($user['email']);
		if(!empty($subid)){
			if($this->params->get('deletebehavior', '0') == 0){
				$userClass->delete($subid);
			}else{
				acymailing_query('UPDATE #__acymailing_subscriber SET `userid` = 0 WHERE subid = '.intval($subid));
			}
		}

		return true;
	}

	function onExtregUserActivate($form_id = 0, $er_user = null){
		if($this->initAcy() === false) return true;

		if(empty($er_user->id)) return true;
		$userClass = acymailing_get('class.subscriber');
		$userSubid = $userClass->subid($er_user->id);
		if(empty($userSubid)) return true;

		if(!empty($er_user->approve)){
			$query = 'UPDATE  #__acymailing_subscriber SET `enabled` = '.(int)$er_user->approve.' WHERE subid ='.intval($userSubid);
			acymailing_query($query);
		}
		$userClass->confirmSubscription($userSubid);
		return true;
	}

	function onExtregUserApprove($form_id = 0, $er_user = null){
		if($this->initAcy() === false) return true;

		if(empty($er_user->id)) return true;
		$userClass = acymailing_get('class.subscriber');
		$userSubid = $userClass->subid($er_user->id);
		if(empty($userSubid)) return true;

		$query = 'UPDATE  #__acymailing_subscriber SET `enabled` = "1" WHERE subid ='.intval($userSubid);
		acymailing_query($query);

		return true;
	}
}//endclass
components/com_acymailing/extensions/plg_system_regacymailing/regacymailing.xml000060400000025535152453623450024540 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/plugin-install.dtd">
<install type="plugin" version="1.5" method="upgrade" group="system">
	<name>AcyMailing : (auto)Subscribe during Joomla registration</name>
	<creationDate>March 2018</creationDate>
	<version>5.9.6</version>
	<author>Acyba</author>
	<authorEmail>dev@acyba.com</authorEmail>
	<authorUrl>http://www.acyba.com</authorUrl>
	<copyright>Copyright (C) 2009-2018 ACYBA SAS - All rights reserved.</copyright>
	<license>GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html</license>
	<description>Automatically subscribe the user to AcyMailing during the Joomla registration process</description>
	<files>
		<filename plugin="regacymailing">regacymailing.php</filename>
	</files>
	<params addpath="/components/com_acymailing/params">
		<param name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-regacymailing"/>
		<param name="lists" type="lists" default="None" label="Lists displayed on registration form" description="The following selected lists will be added to your Joomla registration form and will be visible." />
		<param name="listschecked" type="lists" default="All" label="Lists checked by default" description="The selected lists will be checked by default on your registration form." />
		<param name="subscribetext" type="text" size="50" default="" label="Subscribe Caption" description="Text displayed for the subscription field. If you don't specify anything, the default value will be used from the current language file" />
		<param name="displaymode" type="list" default="dispall" label="Display mode" description="Select the way you want AcyMailing to display your lists">
			<option value="dispall">Display one checkbox per list</option>
			<option value="onecheck">Group the lists into one checkbox</option>
			<option value="dropdown">Display the lists in a dropdown</option>
		</param>
		<param name="fieldafter" type="radio" default="password" label="Display the lists after" description="AcyMailing will display the lists after the selected field on your registration form">
			<option value="password">Password</option>
			<option value="email">Email</option>
			<option value="custom">Custom</option>
		</param>
		<param name="fieldaftercustom" default="" type="text" size="10" label="Display the lists after (custom)" description="If your registration page contains other fields, you can specify the name of other fields (separated with a ;) to display the lists after these custom fields (The previous option should be set to 'custom')" />
		<param name="@spacer" type="spacer" default="" label="" description="" />
		<param name="customfieldsafter" type="radio" default="email" label="Display the fields after" description="AcyMailing will display the extra fields after the selected field on your registration form">
			<option value="password">Password</option>
			<option value="email">Email</option>
			<option value="custom">Custom</option>
		</param>
		<param name="customfieldsaftercustom" default="" type="text" size="10" label="Display the fields after (custom)" description="If your registration page contains other fields, you can specify the name of other fields (separated with a ;) to display the lists after these custom fields (The previous option should be set to 'custom')" />
		<param name="@spacer" type="spacer" default="" label="" description="" />
		<param name="sendnotif" type="radio" default="0" label="Send notification" description="When an user is created, send the Acy notification message">
			<option value="0">JOOMEXT_NO</option>
			<option value="1">JOOMEXT_YES</option>
		</param>
		<param name="forceconf" type="radio" default="0" label="Force double opt-in" description="The registration process may already have its confirmation e-mail... Do you want Acy to send its own confirmation e-mail (so in addition to the Joomla one)?">
			<option value="0">JOOMEXT_NO</option>
			<option value="1">JOOMEXT_YES</option>
		</param>
		<param name="@spacer" type="spacer" default="" label="" description="" />
		<param name="customcss" cols="40" rows="5" type="textarea" default="" label="Custom CSS" description="You can specify here some CSS which will be added to the registration page" />
        <param name="deletebehavior" type="radio" default="0" label="User deletion behavior" description="Choose if the AcyMailing user should also be deleted when the Joomla account is deleted">
            <option value="0">Delete AcyMailing user</option>
            <option value="1">Keep AcyMailing user</option>
        </param>
        <param label="Excluded components" name="excluded" size="50" type="text" value="" description="Acy won't display the subscription lists on the components you exclude with this option. Each value should be separated by a coma, here are the possible values: com_user, com_users, com_alpharegistration, com_ccusers, com_community, com_extendedreg, com_gcontact, com_hikashop, com_jblance, com_jshopping, com_juser, com_mijoshop, com_osemsc, com_redshop, com_tienda, com_virtuemart." />
		<param name="addcategory" type="radio" default="0" label="Display category name" description="Order the lists by category and display their category name above them.">
			<option value="0">JOOMEXT_NO</option>
			<option value="1">JOOMEXT_YES</option>
		</param>
    </params>
	<config>
		<fields name="params" addfieldpath="/components/com_acymailing/params">
			<fieldset name="basic">
				<field name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-regacymailing"/>
				<field name="lists" type="lists" default="None" label="Lists displayed on registration form" description="The following selected lists will be added to your Joomla registration form and will be visible." />
				<field name="listschecked" type="lists" default="All" label="Lists checked by default" description="The selected lists will be checked by default on your registration form." />
				<field name="subscribetext" type="text" size="50" default="" label="Subscribe Caption" description="Text displayed for the subscription field. If you don't specify anything, the default value will be used from the current language file" />
				<field name="displaymode" type="list" default="dispall" label="Display mode" description="Select the way you want AcyMailing to display your lists">
					<option value="dispall">Display one checkbox per list</option>
					<option value="onecheck">Group the lists into one checkbox</option>
					<option value="dropdown">Display the lists in a dropdown</option>
				</field>
				<field name="fieldafter" type="radio" default="password" label="Display the lists after" description="AcyMailing will display the lists after the selected field on your registration form">
					<option value="password">Password</option>
					<option value="email">Email</option>
					<option value="custom">Custom</option>
				</field>
				<field name="fieldaftercustom" default="" type="text" size="10" label="Display the lists after (custom)" description="If your registration page contains other fields, you can specify the name of other fields (separated with a ;) to display the lists after these custom fields (The previous option should be set to 'custom')" />
				<field name="@spacer" type="spacer" default="" label="" description="" />
				<field name="customfieldsafter" type="radio" default="email" label="Display the fields after" description="AcyMailing will display the extra fields after the selected field on your registration form">
					<option value="password">Password</option>
					<option value="email">Email</option>
					<option value="custom">Custom</option>
				</field>
				<field name="customfieldsaftercustom" default="" type="text" size="10" label="Display the fields after (custom)" description="If your registration page contains other fields, you can specify the name of other fields (separated with a ;) to display the lists after these custom fields (The previous option should be set to 'custom')" />
				<field name="@spacer" type="spacer" default="" label="" description="" />
				<field name="sendnotif" type="radio" default="0" label="Send notification" description="When an user is created, send the Acy notification message">
					<option value="0">JOOMEXT_NO</option>
					<option value="1">JOOMEXT_YES</option>
				</field>
				<field name="forceconf" type="radio" default="0" label="Force double opt-in" description="The registration process may already have its confirmation e-mail... Do you want Acy to send its own confirmation e-mail (so in addition to the Joomla one)?">
					<option value="0">JOOMEXT_NO</option>
					<option value="1">JOOMEXT_YES</option>
				</field>
				<field name="@spacer" type="spacer" default="" label="" description="" />
				<field name="customcss" cols="40" rows="5" type="textarea" default="" label="Custom CSS" description="You can specify here some CSS which will be added to the registration page" />
                <field name="deletebehavior" type="radio" default="0" label="User deletion behavior" description="Choose if the AcyMailing user should also be deleted when the Joomla account is deleted">
                    <option value="0">Delete AcyMailing user</option>
                    <option value="1">Keep AcyMailing user</option>
                </field>
                <field label="Excluded components" name="excluded" type="checkboxes" description="Acy won't display the subscription lists on the components you exclude with this option">
                    <option value="com_user">com_user</option>
                    <option value="com_users">com_users</option>
                    <option value="com_alpharegistration">com_alpharegistration</option>
                    <option value="com_ccusers">com_ccusers</option>
                    <option value="com_community">com_community</option>
                    <option value="com_extendedreg">com_extendedreg</option>
                    <option value="com_gcontact">com_gcontact</option>
                    <option value="com_hikashop">com_hikashop</option>
                    <option value="com_jblance">com_jblance</option>
                    <option value="com_jshopping">com_jshopping</option>
                    <option value="com_juser">com_juser</option>
                    <option value="com_mijoshop">com_mijoshop</option>
                    <option value="com_osemsc">com_osemsc</option>
                    <option value="com_redshop">com_redshop</option>
                    <option value="com_tienda">com_tienda</option>
                    <option value="com_virtuemart">com_virtuemart</option>
                </field>
				<field name="addcategory" type="radio" default="0" label="Display category name" description="Order the lists by category and display their category name above them.">
					<option value="0">JOOMEXT_NO</option>
					<option value="1">JOOMEXT_YES</option>
				</field>
			</fieldset>
		</fields>
	</config>
</install>
components/com_acymailing/extensions/plg_system_regacymailing/index.html000060400000000054152453623450023165 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_acymailing_tagtime/tagtime.xml000060400000003471152453623450022762 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/plugin-install.dtd">
<install type="plugin" version="1.5" method="upgrade" group="acymailing">
	<name>AcyMailing Tag : Date / Time</name>
	<creationDate>March 2018</creationDate>
	<version>5.9.6</version>
	<author>Acyba</author>
	<authorEmail>dev@acyba.com</authorEmail>
	<authorUrl>http://www.acyba.com</authorUrl>
	<copyright>Copyright (C) 2009-2018 ACYBA SAS - All rights reserved..</copyright>
	<license>GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html</license>
	<description>This plugin enables you to add time or date in your Newsletter</description>
	<files>
		<filename plugin="tagtime">tagtime.php</filename>
	</files>
	<params addpath="/components/com_acymailing/params">
		<param name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-tagtime"/>
		<param name="frontendaccess" type="list" default="all" label="Front-end Access" description="You can restrict the access to this tag system with this option">
			<option value="all">Always display this tag system</option>
			<option value="none">Don't display this tag system on the front-end</option>
		</param>
	</params>
	<config>
		<fields name="params" addfieldpath="/components/com_acymailing/params">
			<fieldset name="basic">
				<field name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-tagtime"/>
				<field name="frontendaccess" type="list" default="all" label="Front-end Access" description="You can restrict the access to this tag system with this option">
					<option value="all">Always display this tag system</option>
					<option value="none">Don't display this tag system on the front-end</option>
				</field>
			</fieldset>
		</fields>
	</config>
</install>
components/com_acymailing/extensions/plg_acymailing_tagtime/index.html000060400000000054152453623450022575 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_acymailing_tagtime/tagtime.php000060400000007052152453623450022750 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class plgAcymailingTagtime extends JPlugin{

	function __construct(&$subject, $config){
		parent::__construct($subject, $config);
		if(!isset($this->params)){
			$plugin = JPluginHelper::getPlugin('acymailing', 'tagtime');
			$this->params = new acyParameter($plugin->params);
		}
	}


	function acymailing_getPluginType(){

		if($this->params->get('frontendaccess') == 'none' && !acymailing_isAdmin()) return;
		$onePlugin = new stdClass();
		$onePlugin->name = acymailing_translation('ACY_TIME');
		$onePlugin->function = 'acymailingtagtime_show';
		$onePlugin->help = 'plugin-tagtime';

		return $onePlugin;
	}

	function acymailingtagtime_show(){

		$text = '<br style="clear:both;"/><div class="onelineblockoptions"><table class="acymailing_table" cellpadding="1">';

		$others = array();
		$others['{date}'] = 'DATE_FORMAT_LC';
		$others['{date:1}'] = 'DATE_FORMAT_LC1';
		$others['{date:2}'] = 'DATE_FORMAT_LC2';
		$others['{date:3}'] = 'DATE_FORMAT_LC3';
		$others['{date:4}'] = 'DATE_FORMAT_LC4';
		$others['{date:%m/%d/%Y}'] = '%m/%d/%Y';
		$others['{date:%d/%m/%y}'] = '%d/%m/%y';
		$others['{date:%A}'] = '%A';
		$others['{date:%B}'] = '%B';


		$k = 0;
		foreach($others as $tagname => $tag){
			$text .= '<tr style="cursor:pointer" class="row'.$k.'" onclick="setTag(\''.$tagname.'\');insertTag();" ><td class="acytdcheckbox"></td><td>'.$tag.'</td><td>'.acymailing_getDate(time(), acymailing_translation($tag)).'</td></tr>';
			$k = 1 - $k;
		}

		$text .= '</table></div>';

		echo $text;
	}

	function acymailing_replacetags(&$email, $send = true){

		$match = '#{date:?([^:].*)?}#Ui';
		$variables = array('subject', 'body', 'altbody');

		foreach($variables as $var){
			$email->$var = str_replace(array('{mailid}', '%7Bmailid%7D', '{emailsubject}'), array($email->mailid, $email->mailid, $email->subject), $email->$var);
		}
		$email->body = str_replace('{textversion}', nl2br($email->altbody), $email->body);


		$found = false;
		foreach($variables as $var){
			if(empty($email->$var)) continue;
			$found = preg_match_all($match, $email->$var, $results[$var]) || $found;
			if(empty($results[$var][0])) unset($results[$var]);
		}

		if(!$found) return;

		$tags = array();
		foreach($results as $var => $allresults){
			foreach($allresults[0] as $i => $oneTag){
				if(isset($tags[$oneTag])) continue;
				$arguments = explode('|', strip_tags($allresults[1][$i]));
				$parameter = new stdClass();
				$parameter->format = $arguments[0];
				for($i = 1; $i < count($arguments); $i++){
					$args = explode(':', $arguments[$i]);
					$arg0 = trim($args[0]);
					if(isset($args[1])){
						$parameter->$arg0 = $args[1];
					}else{
						$parameter->$arg0 = true;
					}
				}

				$time = time();
				if(!empty($parameter->senddate) && !empty($email->senddate)) $time = $email->senddate;
				if(!empty($parameter->add)) $time += intval($parameter->add);
				if(!empty($parameter->remove)) $time -= intval($parameter->remove);

				if(empty($parameter->format) OR is_numeric($parameter->format)){
					$tags[$oneTag] = acymailing_getDate($time, acymailing_translation('DATE_FORMAT_LC'.$parameter->format));
				}else{
					$tags[$oneTag] = acymailing_getDate($time, $parameter->format);
				}
			}
		}

		foreach(array_keys($results) as $var){
			$email->$var = str_replace(array_keys($tags), $tags, $email->$var);
		}
	}
}//endclass
components/com_acymailing/extensions/mod_acymailing/mod_acymailing.php000060400000025113152453623450022553 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

if(!include_once(rtrim(JPATH_ADMINISTRATOR, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.'components'.DIRECTORY_SEPARATOR.'com_acymailing'.DIRECTORY_SEPARATOR.'helpers'.DIRECTORY_SEPARATOR.'helper.php')){
	echo 'This module can not work without the AcyMailing Component';
	return;
};

$config = acymailing_config();
$overridedesign = preg_replace('#[^a-z0-9_]#i', '', acymailing_getVar('cmd', 'design'));
if(!empty($overridedesign)){
	if($overridedesign == 'popup') $overridedesign = '';
	$params->set('effect', 'mootools-box');
}

$redirectMode = $params->get('redirectmode', '0');
switch($redirectMode){
	case 1 :
		$redirectUrl = acymailing_completeLink('lists', false, true);
		$redirectUrlUnsub = $redirectUrl;
		break;
	case 2 :
		$redirectUrl = $params->get('redirectlink');
		$redirectUrlUnsub = $params->get('redirectlinkunsub');
		break;
	default :
		if(isset($_SERVER["REQUEST_URI"])){
			$requestUri = $_SERVER["REQUEST_URI"];
		}else{
			$requestUri = $_SERVER['PHP_SELF'];
			if(!empty($_SERVER['QUERY_STRING'])) $requestUri = rtrim($requestUri, '/').'?'.$_SERVER['QUERY_STRING'];
		}
		$redirectUrl = (((!empty($_SERVER['HTTPS']) AND strtolower($_SERVER['HTTPS']) == "on") || $_SERVER['SERVER_PORT'] == 443) ? 'https://' : 'http://').$_SERVER["HTTP_HOST"].$requestUri;
		$redirectUrlUnsub = $redirectUrl;
		if($params->get('effect', 'normal') == 'mootools-box') $redirectUrlUnsub = $redirectUrl = '';
}

$subController = acymailing_get('controller_front.sub');
$subController->_checkRedirectUrl($redirectUrl);
$subController->_checkRedirectUrl($redirectUrlUnsub);

$formName = acymailing_getModuleFormName();
if(!empty($overridedesign)){
	$params->set('includejs', 'module');
}

$introText = $params->get('introtext');
$postText = $params->get('finaltext');
$mootoolsIntro = $params->get('mootoolsintro', '');
if(!empty($introText) && preg_match('#^[A-Z_]*$#', $introText)){
	$introText = acymailing_translation($introText);
}
if(!empty($postText) && preg_match('#^[A-Z_]*$#', $postText)){
	$postText = acymailing_translation($postText);
}
if(!empty($mootoolsIntro) && preg_match('#^[A-Z_]*$#', $mootoolsIntro)){
	$mootoolsIntro = acymailing_translation($mootoolsIntro);
}


if($params->get('effect') == 'mootools-box' AND acymailing_getVar('string', 'tmpl') != 'component'){
	$mootoolsButton = $params->get('mootoolsbutton', '');
	if(empty($mootoolsButton)){
		$mootoolsButton = acymailing_translation('SUBSCRIBE');
	}else{
		if(!empty($mootoolsButton) && preg_match('#^[A-Z_]*$#', $mootoolsButton)){
			$mootoolsButton = acymailing_translation($mootoolsButton);
		}
	}

	$moduleCSS = $config->get('css_module', 'default');
	if(!empty($moduleCSS)){
		acymailing_addStyle(false, ACYMAILING_CSS.'module_'.$moduleCSS.'.css?v='.filemtime(ACYMAILING_MEDIA.'css'.DS.'module_'.$moduleCSS.'.css'));
	}
	require(JModuleHelper::getLayoutPath('mod_acymailing', 'popup'));
	return;
}
acymailing_initModule($params);

$userClass = acymailing_get('class.subscriber');
$identifiedUser = null;
$currentUserEmail = acymailing_currentUserEmail();
if($params->get('loggedin', 1) && !empty($currentUserEmail)){
	$identifiedUser = $userClass->get($currentUserEmail);
}

if(!empty($currentUserEmail)) $currentUserEmail = acymailing_punycode($currentUserEmail, 'emailToUTF8');
if(!empty($identifiedUser->email)) $identifiedUser->email = acymailing_punycode($identifiedUser->email, 'emailToUTF8');

$visibleLists = trim($params->get('lists', 'None'));
$hiddenLists = trim($params->get('hiddenlists', 'All'));
$visibleListsArray = array();
$hiddenListsArray = array();
$listsClass = acymailing_get('class.list');
if(empty($identifiedUser->subid)){
	$allLists = $listsClass->getLists('listid');
}else{
	$allLists = $userClass->getSubscription($identifiedUser->subid, 'listid');
}


if(strpos($visibleLists, ',') OR is_numeric($visibleLists)){
	$allvisiblelists = explode(',', $visibleLists);
	foreach($allLists as $oneList){
		if($oneList->published AND in_array($oneList->listid, $allvisiblelists)) $visibleListsArray[] = $oneList->listid;
	}
}elseif(strtolower($visibleLists) == 'all'){
	foreach($allLists as $oneList){
		if($oneList->published){
			$visibleListsArray[] = $oneList->listid;
		}
	}
}

if(strpos($hiddenLists, ',') OR is_numeric($hiddenLists)){
	$allhiddenlists = explode(',', $hiddenLists);
	foreach($allLists as $oneList){
		if($oneList->published AND in_array($oneList->listid, $allhiddenlists)) $hiddenListsArray[] = $oneList->listid;
	}
}elseif(strtolower($hiddenLists) == 'all'){
	$visibleListsArray = array();
	foreach($allLists as $oneList){
		if(!empty($oneList->published)){
			$hiddenListsArray[] = $oneList->listid;
		}
	}
}

if(!empty($visibleListsArray) AND !empty($hiddenListsArray)){
	$visibleListsArray = array_diff($visibleListsArray, $hiddenListsArray);
}

$visibleLists = $params->get('dropdown', 0) ? '' : implode(',', $visibleListsArray);
$hiddenLists = implode(',', $hiddenListsArray);

if(!$params->get('dropdown', 0) && empty($hiddenLists) && empty($visibleLists)){
	echo '<p style="color:red">Error : Please select some lists in your AcyMailing module configuration for the field "'.acymailing_translation('AUTO_SUBSCRIBE_TO').'" and make sure the selected lists are enabled </p>';
}

if(!empty($identifiedUser->subid)){
	$countSub = 0;
	$countUnsub = 0;
	foreach($visibleListsArray as $idOneList){
		if($allLists[$idOneList]->status == -1){
			$countSub++;
		}elseif($allLists[$idOneList]->status == 1) $countUnsub++;
	}
	foreach($hiddenListsArray as $idOneList){
		if($allLists[$idOneList]->status == -1){
			$countSub++;
		}elseif($allLists[$idOneList]->status == 1) $countUnsub++;
	}
}

$checkedLists = $params->get('listschecked', 'All');
if(strtolower($checkedLists) == 'all'){
	$checkedListsArray = $visibleListsArray;
}elseif(strpos($checkedLists, ',') OR is_numeric($checkedLists)){
	$checkedListsArray = explode(',', $checkedLists);
}else{
	$checkedListsArray = array();
}

$listPosition = $params->get('listposition', 'before');


$nameCaption = $params->get('nametext', acymailing_translation('NAMECAPTION'));
$emailCaption = $params->get('emailtext', acymailing_translation('EMAILCAPTION'));
$displayOutside = $params->get('displayfields', 0);
$displayInline = ($params->get('displaymode', 'vertical') == 'vertical') ? false : true;

$displayedFields = $params->get('customfields', 'name,email');
$fieldsToDisplay = explode(',', $displayedFields);
$extraFields = array();

$fieldsize = $params->get('fieldsize', '80%');
if(is_numeric($fieldsize)) $fieldsize .= 'px';

$currentUserid = acymailing_currentUserId();
if(!in_array('email', $fieldsToDisplay) && empty($currentUserid)) $fieldsToDisplay[] = 'email';

if($params->get('effect') == 'mootools-slide'){
	$mootoolsButton = $params->get('mootoolsbutton', '');
	if(empty($mootoolsButton)) $mootoolsButton = acymailing_translation('SUBSCRIBE');
	
	$js .= "document.addEventListener(\"DOMContentLoaded\", function(){
				var acytogglemodule = document.getElementById('acymailing_togglemodule_$formName');
				var module = document.getElementById('acymailing_fulldiv_$formName');
				module.style.display = 'none';

				acytogglemodule.addEventListener('click', function(){
					module.style.display = '';
					if(acytogglemodule.className.indexOf('acyactive') > -1){
						acytogglemodule.className = 'acymailing_togglemodule';
						module.className = 'slide_close';
					}else{
						acytogglemodule.className = 'acymailing_togglemodule acyactive';
						module.className = 'slide_open';
					}
					
					return false;
				});
			});
		";

	if($params->get('includejs', 'header') == 'header'){
		acymailing_addScript(true, $js);
	}else{
		echo "<script type=\"text/javascript\">
			<!--
				$js
			//-->
				</script>";
	}
}

if($params->get('showterms', false)){
	require_once JPATH_SITE.DS.'components'.DS.'com_content'.DS.'helpers'.DS.'route.php';
	$termsIdContent = $params->get('termscontent', 0);
	if(empty($termsIdContent)){
		$termslink = acymailing_translation('JOOMEXT_TERMS');
	}else{
		if(is_numeric($termsIdContent)){
			if(!ACYMAILING_J16){
				$query = 'SELECT a.id,a.alias,a.catid,a.sectionid, c.alias as catalias, s.alias as secalias FROM #__content as a ';
				$query .= ' LEFT JOIN #__categories AS c ON c.id = a.catid ';
				$query .= ' LEFT JOIN #__sections AS s ON s.id = a.sectionid ';
				$query .= 'WHERE a.id = '.$termsIdContent.' LIMIT 1';
				$article = acymailing_loadObject($query);

				$section = $article->sectionid.(!empty($article->secalias) ? ':'.$article->secalias : '');
				$category = $article->catid.(!empty($article->catalias) ? ':'.$article->catalias : '');
				$articleid = $article->id.(!empty($article->alias) ? ':'.$article->alias : '');
				$url = ContentHelperRoute::getArticleRoute($articleid, $category, $section);
			}else{
				$query = 'SELECT a.id,a.alias,a.catid, c.alias as catalias FROM #__content as a ';
				$query .= ' LEFT JOIN #__categories AS c ON c.id = a.catid ';
				$query .= 'WHERE a.id = '.$termsIdContent.' LIMIT 1';
				$article = acymailing_loadObject($query);

				$category = $article->catid.(!empty($article->catalias) ? ':'.$article->catalias : '');
				$articleid = $article->id.(!empty($article->alias) ? ':'.$article->alias : '');

				$url = ContentHelperRoute::getArticleRoute($articleid, $category);
			}
			$url .= (strpos($url, '?') ? '&' : '?').'tmpl=component';
		}else{
			$url = $termsIdContent;
		}

		if($params->get('showtermspopup', 1) == 1){
			$acypop = acymailing_get('helper.acypopup');
			$termslink = $acypop->display(acymailing_translation('JOOMEXT_TERMS'), acymailing_translation('JOOMEXT_TERMS', true), $url, $articleid, 650, 375, '', '', 'text');
		}else{
			$termslink = '<a title="'.acymailing_translation('JOOMEXT_TERMS', true).'"  href="'.$url.'" target="_blank">'.acymailing_translation('JOOMEXT_TERMS').'</a>';
		}
	}
}

if(!empty($overridedesign)){
	ob_start();
}

if($params->get('displaymode') == 'tableless'){
	require(JModuleHelper::getLayoutPath('mod_acymailing', 'tableless'));
}else{
	require(JModuleHelper::getLayoutPath('mod_acymailing'));
}

$currentEmail = acymailing_currentUserEmail();
if(!empty($currentEmail)){
	echo '<span style="display:none">{emailcloak=off}</span>';
}

if(!empty($overridedesign)){
	$moduleDisplay = ob_get_clean();
	$file = ACYMAILING_MEDIA.'plugins'.DS.'squeezepage'.DS.$overridedesign.'.php';
	if(file_exists($file)){
		ob_start();
		require($file);
		$squeezePage = ob_get_clean();
		$squeezePage = str_replace('{module}', $moduleDisplay, $squeezePage);
		echo $squeezePage;
	}else{
		echo $moduleDisplay;
	}
}
components/com_acymailing/extensions/mod_acymailing/tmpl/popup.php000060400000001654152453623450021722 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div class="acymailing_module<?php echo $params->get('moduleclass_sfx') ?>" id="acymailing_module_<?php echo $formName; ?>">
	<?php
	if(!empty($mootoolsIntro)) echo '<p class="acymailing_mootoolsintro">'.$mootoolsIntro.'</p>'; ?>
	<div class="acymailing_mootoolsbutton">
		<?php
		$acypop = acymailing_get('helper.acypopup');
		$href = acymailing_completeLink('sub&task=display&autofocus=1&formid='.$module->id, true);

		$link = $acypop->display($mootoolsButton, '', $href, 'acymailing_togglemodule_'.$formName, $params->get('boxwidth', 250), $params->get('boxheight', 200), 'class="acymailing_togglemodule"', '', 'link');

		?>
		<p><?php echo $link; ?></p>
	</div>
</div>
components/com_acymailing/extensions/mod_acymailing/tmpl/index.html000060400000000054152453623450022034 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/mod_acymailing/tmpl/tableless.php000060400000031676152453623450022544 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div class="acymailing_module<?php echo $params->get('moduleclass_sfx')?>" id="acymailing_module_<?php echo $formName; ?>">
<?php
	$style = array();
	if($params->get('effect','normal') == 'mootools-slide'){
		if(!empty($mootoolsIntro)) echo '<p class="acymailing_mootoolsintro">'.$mootoolsIntro.'</p>'; ?>
		<div class="acymailing_mootoolsbutton" id="acymailing_toggle_<?php echo $formName; ?>">
			<p><a class="acymailing_togglemodule" id="acymailing_togglemodule_<?php echo $formName; ?>" href="#subscribe"><?php echo $mootoolsButton ?></a></p>
	<?php
	}
	if($params->get('textalign','none') != 'none') $style[] .= 'text-align:'.$params->get('textalign');
	$styleString = empty($style) ? '' : 'style="'.implode(';',$style).'"';
	?>
	<div class="acymailing_fulldiv" id="acymailing_fulldiv_<?php echo $formName; ?>" <?php echo $styleString; ?> >
		<form id="<?php echo $formName; ?>" action="<?php echo acymailing_route('index.php'); ?>" onsubmit="return submitacymailingform('optin','<?php echo $formName;?>')" method="post" name="<?php echo $formName ?>" <?php if(!empty($fieldsClass->formoption)) echo $fieldsClass->formoption; ?> >
		<div class="acymailing_module_form" >
			<?php if(!empty($introText)) echo '<div class="acymailing_introtext">'.$introText.'</div>';

			$listContent = '';
			if($params->get('dropdown',0)){
				$listContent .= '<select name="subscription[1]">';
				foreach($visibleListsArray as $myListId){
					$listContent .= '<option value="'.$myListId.'">'.$allLists[$myListId]->name.'</option>';
				}
				$listContent .= '</select>';
			} else{
				$listContent .= '<div class="acymailing_lists">';
				foreach($visibleListsArray as $myListId){
					$check = in_array($myListId,$checkedListsArray) ? 'checked="checked"' : '';

					if($params->get('checkmode',0) == '0' AND !empty($identifiedUser->email)){
						if(empty($allLists[$myListId]->status)){$check = '';}
						else{
							$check = $allLists[$myListId]->status == '-1' ? '' : 'checked="checked"';
						}
					}
					$listContent .= '
					<p class="onelist">
						<label for="acylist_'.$myListId.'">
						<input type="checkbox" class="acymailing_checkbox" name="subscription[]" id="acylist_'.$myListId.'" '.$check.' value="'.$myListId.'"/>';
						$joomItem = $params->get('itemid',0);
						if(empty($joomItem)) $joomItem = $config->get('itemid',0);
						$addItem = empty($joomItem) ? '' : '&Itemid='.$joomItem;
						$archivelink = acymailing_completeLink('archive&listid='.$allLists[$myListId]->listid.'-'.$allLists[$myListId]->alias.$addItem);
						if($params->get('overlay',0)){
							if(!$params->get('link',1) OR !$allLists[$myListId]->visible) $archivelink = '';
							$listContent .= acymailing_tooltip($allLists[$myListId]->description,$allLists[$myListId]->name,'',$allLists[$myListId]->name,$archivelink);
						}else{
							if($params->get('link',1) AND $allLists[$myListId]->visible){
								$listContent .= '<a href="'.$archivelink.'" alt="'.$allLists[$myListId]->alias.'"'.((acymailing_getVar('cmd', 'tmpl') == 'component') ? 'target="_blank"' : '').' >';
							}
							$listContent .= $allLists[$myListId]->name;
							if($params->get('link',1) AND $allLists[$myListId]->visible){
								$listContent .= '</a>';
							}
						}
						$listContent .= '
						</label>
					</p>';
				 }
				$listContent .= '</div>';
			}

			if(!empty($visibleListsArray) && $listPosition == 'before') echo $listContent; ?>
			<div class="acymailing_form">
					<?php
					$tmpCatId = array();
					$tmpCatTag = array();
					foreach($fieldsToDisplay as $oneField){
						if(empty($extraFields[$oneField])) echo '<p class="onefield fieldacy'.$oneField.'" id="field_'.$oneField.'_'.$formName.'">';
						if($oneField == 'name' AND empty($extraFields[$oneField])){
							if($displayOutside) echo '<label for="user_name_'.$formName.'" class="acy_requiredField">'.$nameCaption.'</label>'; ?>
							<span class="acyfield_<?php echo $oneField. (!$displayOutside? ' acy_requiredField':''); ?>"><input id="user_name_<?php echo $formName; ?>" <?php if(!empty($identifiedUser->userid)) echo 'readonly="readonly" '; if(!$displayOutside){ ?> onfocus="if(this.value == '<?php echo $nameCaption;?>') this.value = '';" onblur="if(this.value=='') this.value='<?php echo $nameCaption?>';"<?php } ?> class="inputbox" type="text" name="user[name]" style="width:<?php echo $fieldsize; ?>" value="<?php if(!empty($identifiedUser->userid)) echo $identifiedUser->name; elseif(!$displayOutside) echo $nameCaption; ?>" title="<?php echo $nameCaption;?>"/></span>
							<?php
						}elseif($oneField == 'email' AND empty($extraFields[$oneField])){
							if($displayOutside) echo '<label for="user_email_'.$formName.'" class="acy_requiredField">'.$emailCaption.'</label>'; ?>
							<span class="acyfield_<?php echo $oneField. (!$displayOutside? ' acy_requiredField':''); ?>"><input id="user_email_<?php echo $formName; ?>" <?php if(!empty($identifiedUser->userid)) echo 'readonly="readonly" '; if(!$displayOutside){ ?> onfocus="if(this.value == '<?php echo $emailCaption;?>') this.value = '';" onblur="if(this.value=='') this.value='<?php echo $emailCaption?>';"<?php } ?> class="inputbox" type="text" name="user[email]" style="width:<?php echo $fieldsize; ?>" value="<?php if(!empty($identifiedUser->userid)) echo $identifiedUser->email; elseif(!$displayOutside) echo $emailCaption; ?>" title="<?php echo $emailCaption;?>" /></span>
							<?php
						}elseif($oneField == 'html' AND empty($extraFields[$oneField])){
							echo '<label>'.acymailing_translation('RECEIVE').'</label>';
							echo '<span class="acyfield_'.$oneField.'">'.acymailing_boolean("user[html]" ,'title="'.acymailing_translation('RECEIVE').'"',isset($identifiedUser->html) ? $identifiedUser->html : 1,acymailing_translation('HTML'),acymailing_translation('JOOMEXT_TEXT'),'user_html_'.$formName).'</span>';
						}elseif(!empty($extraFields[$oneField])){
							if($extraFields[$oneField]->type == 'category'){
								if(empty($extraFields[$oneField]->fieldcat) && !empty($tmpCatId)){
									while(!empty($tmpCatId)){
										echo '</'.str_replace('fldset', 'fieldset', end($tmpCatTag)).'>';
										array_pop($tmpCatId);
										array_pop($tmpCatTag);
									}
								}
								$tmpCatId[] = $extraFields[$oneField]->fieldid;
								$tmpCatTag[] = $extraFields[$oneField]->options['fieldcattag'];
								echo '<'.str_replace('fldset', 'fieldset', end($tmpCatTag)).' class="fieldCategory fieldacy'.$extraFields[$oneField]->namekey.' '.$extraFields[$oneField]->options['fieldcatclass'].'">';
								if(in_array(end($tmpCatTag), array('fieldset', 'fldset'))) echo '<legend>'.$extraFields[$oneField]->fieldname.'</legend>';
							}else{
								if(in_array($extraFields[$oneField]->fieldcat, $tmpCatId) || empty($extraFields[$oneField]->fieldcat)){
									while(!empty($tmpCatId) && $extraFields[$oneField]->fieldcat != end($tmpCatId)){
										echo '</'.str_replace('fldset', 'fieldset', end($tmpCatTag)).'>';
										array_pop($tmpCatId);
										array_pop($tmpCatTag);
									}
								}
								echo '<p class="onefield fieldacy'.$oneField.'" id="field_'.$oneField.'_'.$formName.'">';
								if($displayOutside){
									if(!empty($extraFields[$oneField]->required)) $requireClass = 'class="acy_requiredField"';
									else $requireClass = "";
									 echo '<label '.((strpos($extraFields[$oneField]->type,'text') !== false) ? 'for="user_'.$oneField.'_'.$formName.'"' : '' ).' '.$requireClass.'>'.$fieldsClass->trans($extraFields[$oneField]->fieldname).'</label>';
								}
								$sizestyle = '';
								if(!empty($extraFields[$oneField]->options['size'])){
									$sizestyle = 'style="width:'.(is_numeric($extraFields[$oneField]->options['size']) ? ($extraFields[$oneField]->options['size'].'px') : $extraFields[$oneField]->options['size']).'"';
								}
								if(!empty($extraFields[$oneField]->required) && !$displayOutside) $requireClass = ' acy_requiredField';
								else $requireClass = "";
								?>
								<span class="acyfield_<?php echo $oneField.$requireClass; ?>">
								<?php if(!empty($identifiedUser->userid) AND in_array($oneField,array('name','email'))){ ?>
										<input id="user_<?php echo $oneField; ?>_<?php echo $formName; ?>" readonly="readonly" class="inputbox" type="text" name="user[<?php echo $oneField;?>]" <?php echo $sizestyle; ?> value="<?php echo @$identifiedUser->$oneField; ?>" title="<?php echo $oneField;?>"/>
								<?php }else{
										echo $fieldsClass->display($extraFields[$oneField],@$identifiedUser->$oneField,'user['.$oneField.']',!$displayOutside);
								}?>
								</span>
								</p>
								<?php
							}
						}
						if(empty($extraFields[$oneField])) echo '</p>';
					}
					if(!empty($extraFields)){
						$lastVal = end($tmpCatId);
						while(!empty($lastVal)){
							echo '</'.str_replace('fldset', 'fieldset', end($tmpCatTag)).'>';
							array_pop($tmpCatId);
							array_pop($tmpCatTag);
							$lastVal = end($tmpCatId);
						}
					}

				if(empty($identifiedUser->userid) AND $config->get('captcha_enabled') AND acymailing_level(1)){ ?>
					<?php
					echo '<div class="onefield fieldacycaptcha" id="field_captcha_'.$formName.'">';
					$captchaClass = acymailing_get('class.acycaptcha');
					$captchaClass->display($formName, true);
					?>
					</div>
				<?php }

				 if($params->get('showterms',false)){
					echo '<p class="onefield fieldacyterms" id="field_terms_'.$formName.'">';
					?>
					<label for="mailingdata_terms_<?php echo $formName; ?>"><input id="mailingdata_terms_<?php echo $formName; ?>" class="checkbox" type="checkbox" name="terms" title="<?php echo acymailing_translation('JOOMEXT_TERMS'); ?>"/> <?php echo $termslink; ?></label>
					</p>
					<?php } ?>

					<?php if(!empty($visibleListsArray) && $listPosition == 'after')  echo $listContent; ?>

					<p class="acysubbuttons">
						<?php if($params->get('showsubscribe',true)){?>
						<input class="button subbutton btn btn-primary" type="submit" value="<?php $subtext = $params->get('subscribetextreg'); if(empty($identifiedUser->userid) OR empty($subtext)){ $subtext = $params->get('subscribetext',acymailing_translation('SUBSCRIBECAPTION')); } echo $subtext;  ?>" name="Submit" onclick="try{ return submitacymailingform('optin','<?php echo $formName;?>'); }catch(err){alert('The form could not be submitted '+err);return false;}"/>
						<?php }if($params->get('showunsubscribe',false) AND (!$params->get('showsubscribe',true) OR empty($identifiedUser->userid) OR !empty($countUnsub)) ){?>
						<input class="button unsubbutton btn btn-inverse" type="button" value="<?php echo $params->get('unsubscribetext',acymailing_translation('UNSUBSCRIBECAPTION')); ?>" name="Submit" onclick="return submitacymailingform('optout','<?php echo $formName;?>')"/>
						<?php } ?>
					</p>
				</div>
			<?php
			if(!empty($fieldsClass->excludeValue)){
				$js = "\n"."acymailingModule['excludeValues".$formName."'] = Array();";
				foreach($fieldsClass->excludeValue as $namekey => $value){
					$js .= "\n"."acymailingModule['excludeValues".$formName."']['".$namekey."'] = '".$value."';";
				}
				$js .= "\n";
				if($params->get('includejs','header') == 'header'){
					acymailing_addScript(true, $js);
				}else{
					echo "<script type=\"text/javascript\">
							<!--
							$js
							//-->
							</script>";
				}
			}
			if(!empty($postText)) echo '<div class="acymailing_finaltext">'.$postText.'</div>';
			$ajax = ($params->get('redirectmode') == '3') ? 1 : 0;?>
			<input type="hidden" name="ajax" value="<?php echo $ajax; ?>"/>
			<input type="hidden" name="acy_source" value="<?php echo 'module_'.$module->id ?>" />
			<input type="hidden" name="ctrl" value="sub"/>
			<input type="hidden" name="task" value="notask"/>
			<input type="hidden" name="redirect" value="<?php echo urlencode($redirectUrl); ?>"/>
			<input type="hidden" name="redirectunsub" value="<?php echo urlencode($redirectUrlUnsub); ?>"/>
			<input type="hidden" name="option" value="<?php echo ACYMAILING_COMPONENT ?>"/>
			<?php if(!empty($identifiedUser->userid)){ ?><input type="hidden" name="visiblelists" value="<?php echo $visibleLists;?>"/><?php } ?>
			<input type="hidden" name="hiddenlists" value="<?php echo $hiddenLists;?>"/>
			<input type="hidden" name="acyformname" value="<?php echo $formName; ?>" />
			<?php if(acymailing_getVar('cmd', 'tmpl') == 'component'){ ?>
				<input type="hidden" name="tmpl" value="component" />
				<?php if($params->get('effect','normal') == 'mootools-box' AND !empty($redirectUrl)){ ?>
					<input type="hidden" name="closepop" value="1" />
				<?php } } ?>
			<?php $myItemId = $config->get('itemid',0); if(empty($myItemId)){ global $Itemid; $myItemId = $Itemid;} if(!empty($myItemId)){ ?><input type="hidden" name="Itemid" value="<?php echo $myItemId;?>"/><?php } ?>
			</div>
		</form>
	</div>
	<?php if($params->get('effect','normal') == 'mootools-slide'){ ?> </div> <?php } ?>
</div>

components/com_acymailing/extensions/mod_acymailing/tmpl/default.php000060400000027502152453623450022203 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><div class="acymailing_module<?php echo $params->get('moduleclass_sfx')?>" id="acymailing_module_<?php echo $formName; ?>">
<?php
	$style = array();
	if($params->get('effect','normal') == 'mootools-slide'){
		if(!empty($mootoolsIntro)) echo '<p class="acymailing_mootoolsintro">'.$mootoolsIntro.'</p>'; ?>
		<div class="acymailing_mootoolsbutton" id="acymailing_toggle_<?php echo $formName; ?>" >
			<p><a class="acymailing_togglemodule" id="acymailing_togglemodule_<?php echo $formName; ?>" href="#subscribe"><?php echo $mootoolsButton ?></a></p>
	<?php
	}
	if($params->get('textalign','none') != 'none') $style[] .= 'text-align:'.$params->get('textalign');
	$styleString = empty($style) ? '' : 'style="'.implode(';',$style).'"';
    $config = acymailing_config();
	?>
	<div class="acymailing_fulldiv" id="acymailing_fulldiv_<?php echo $formName; ?>" <?php echo $styleString; ?> >
		<form id="<?php echo $formName; ?>" action="<?php echo acymailing_route('index.php'); ?>" onsubmit="return submitacymailingform('optin','<?php echo $formName;?>')" method="post" name="<?php echo $formName ?>" <?php if(!empty($fieldsClass->formoption)) echo $fieldsClass->formoption; ?> >
		<div class="acymailing_module_form" >
			<?php if(!empty($introText)) echo '<div class="acymailing_introtext">'.$introText.'</div>';

			$listContent = '';
			if($params->get('dropdown',0)){
				$listContent .= '<select name="subscription[1]">';
				foreach($visibleListsArray as $myListId){
					$listContent .= '<option value="'.$myListId.'">'.$allLists[$myListId]->name.'</option>';
				}
				$listContent .= '</select>';
			} else{
				$listContent .= '<table class="acymailing_lists">';
				foreach($visibleListsArray as $myListId){
					$check = in_array($myListId,$checkedListsArray) ? 'checked="checked"' : '';
					if($params->get('checkmode',0) == '0' AND !empty($identifiedUser->email)){
						if(empty($allLists[$myListId]->status)){$check = '';}
						else{
							$check = $allLists[$myListId]->status == '-1' ? '' : 'checked="checked"';
						}
					}
					$listContent .= '
					<tr>
						<td>
						<label for="acylist_'.$myListId.'">
						<input type="checkbox" class="acymailing_checkbox" name="subscription[]" id="acylist_'.$myListId.'" '.$check.' value="'.$myListId.'"/>';
						$joomItem = $params->get('itemid',0);
						if(empty($joomItem)) $joomItem = $config->get('itemid',0);
						$addItem = empty($joomItem) ? '' : '&Itemid='.$joomItem;
						$archivelink = acymailing_completeLink('archive&listid='.$allLists[$myListId]->listid.'-'.$allLists[$myListId]->alias.$addItem);
						if($params->get('overlay',0)){
							if(!$params->get('link',1) OR !$allLists[$myListId]->visible) $archivelink = '';
							$listContent .= ' '.acymailing_tooltip($allLists[$myListId]->description,$allLists[$myListId]->name,'',$allLists[$myListId]->name,$archivelink);
						}else{
							if($params->get('link',1) AND $allLists[$myListId]->visible){
								$listContent .= ' <a href="'.$archivelink.'" alt="'.$allLists[$myListId]->alias.'"'.((acymailing_getVar('cmd', 'tmpl') == 'component') ? 'target="_blank"' : '').' >';
							}
							$listContent .= $allLists[$myListId]->name;
							if($params->get('link',1) AND $allLists[$myListId]->visible){
								$listContent .= '</a>';
							}
						}
						$listContent .= '</label>
						</td>
					</tr>';
				}
				$listContent .= '</table>';
			}

			if(!empty($visibleListsArray) && $listPosition == 'before'){
				echo $listContent;
			}//endif visiblelists
			?>
			<table class="acymailing_form">
				<tr>
					<?php foreach($fieldsToDisplay as $oneField){
						if($oneField == 'name' AND empty($extraFields[$oneField])){
							if($displayOutside) echo '<td><label for="user_name_'.$formName.'" class="acy_requiredField">'.$nameCaption.'</label></td>'; ?>
							<td class="acyfield_<?php echo $oneField. (!$displayOutside? ' acy_requiredField':''); ?>">
								<input id="user_name_<?php echo $formName; ?>" <?php if(!empty($identifiedUser->userid)) echo 'readonly="readonly" ';  if(!$displayOutside){ ?> onfocus="if(this.value == '<?php echo $nameCaption;?>') this.value = '';" onblur="if(this.value=='') this.value='<?php echo $nameCaption?>';"<?php } ?> class="inputbox" type="text" name="user[name]" style="width:<?php echo $fieldsize; ?>" value="<?php if(!empty($identifiedUser->userid)) echo $identifiedUser->name; elseif(!$displayOutside) echo $nameCaption; ?>" title="<?php echo $nameCaption?>"/>
							</td> <?php
						}elseif($oneField == 'email' AND empty($extraFields[$oneField])){
							if($displayOutside) echo '<td><label for="user_email_'.$formName.'" class="acy_requiredField">'.$emailCaption.'</label></td>'; ?>
							<td class="acyfield_<?php echo $oneField. (!$displayOutside? ' acy_requiredField':''); ?>">
								<input id="user_email_<?php echo $formName; ?>" <?php if(!empty($identifiedUser->userid)) echo 'readonly="readonly" ';  if(!$displayOutside){ ?> onfocus="if(this.value == '<?php echo $emailCaption;?>') this.value = '';" onblur="if(this.value=='') this.value='<?php echo $emailCaption?>';"<?php } ?> class="inputbox" type="text" name="user[email]" style="width:<?php echo $fieldsize; ?>" value="<?php if(!empty($identifiedUser->userid)) echo $identifiedUser->email; elseif(!$displayOutside) echo $emailCaption; ?>" title="<?php echo $emailCaption;?>"/>
							</td> <?php
						}elseif($oneField == 'html' AND empty($extraFields[$oneField])){
							echo '<td class="acyfield_'.$oneField.'" ';
							if($displayOutside AND !$displayInline) echo 'colspan="2"';
							echo '>'.acymailing_translation('RECEIVE').acymailing_boolean("user[html]" ,'title="'.acymailing_translation('RECEIVE').'"',isset($identifiedUser->html) ? $identifiedUser->html : 1,acymailing_translation('HTML'),acymailing_translation('JOOMEXT_TEXT'),'user_html_'.$formName).'</td>';
						}elseif(!empty($extraFields[$oneField])){
							if($extraFields[$oneField]->type == 'category'){
								echo '<td '. ($displayOutside && !$displayInline?'colspan="2"':'').' class="category_warning">Please use Tableless mode to display categories.</td>';
							} else{
								if($displayOutside){
									if(!empty($extraFields[$oneField]->required)) $requireClass = 'class="acy_requiredField"';
									else $requireClass = "";
									echo '<td><label '.((strpos($extraFields[$oneField]->type,'text') !== false) ? 'for="user_'.$oneField.'_'.$formName.'"' : '' ).' '. $requireClass .'>'.$fieldsClass->trans($extraFields[$oneField]->fieldname).'</label></td>';
								}
								$sizestyle = '';
								if(!empty($extraFields[$oneField]->options['size'])){
									$sizestyle = 'style="width:'.(is_numeric($extraFields[$oneField]->options['size']) ? ($extraFields[$oneField]->options['size'].'px') : $extraFields[$oneField]->options['size']).'"';
								}
								if(!empty($extraFields[$oneField]->required) && !$displayOutside) $requireClass = 'acy_requiredField';
								else $requireClass = "";
								?>
								<td class="acyfield_<?php echo $oneField .' '. $requireClass; ?>">
								<?php if(!empty($identifiedUser->userid) AND in_array($oneField,array('name','email'))){ ?>
										<input id="user_<?php echo $oneField; ?>_<?php echo $formName; ?>" readonly="readonly" class="inputbox" type="text" name="user[<?php echo $oneField;?>]" <?php echo $sizestyle; ?> value="<?php echo @$identifiedUser->$oneField; ?>" title="<?php echo $oneField;?>"/>
								<?php }else{
										echo $fieldsClass->display($extraFields[$oneField],@$identifiedUser->$oneField,'user['.$oneField.']',!$displayOutside);
								}?>
								</td><?php
							}
						}else{
							continue;
						}
						if(!$displayInline) echo '</tr><tr>';
					}

				if(empty($identifiedUser->userid) AND $config->get('captcha_enabled') AND acymailing_level(1)){ ?>
					<td class="captchakeymodule">
					<?php
						$captchaClass = acymailing_get('class.acycaptcha');
						if($displayOutside){ $captchaClass->display($formName, true).'</td><td class="captchafieldmodule">'; }else{$captchaClass->display($formName, true);}
					?>
					<?php if(!$displayInline) echo '</tr><tr>';
				}

				 if($params->get('showterms',false)){
					?>
					<td class="acyterms" <?php if($displayOutside AND !$displayInline) echo 'colspan="2"'; ?> >
					<input id="mailingdata_terms_<?php echo $formName; ?>" class="checkbox" type="checkbox" name="terms" title="<?php echo acymailing_translation('JOOMEXT_TERMS'); ?>"/> <?php echo $termslink;?>
					</td>
					<?php if(!$displayInline) echo '</tr><tr>';
					} ?>

					<?php if(!empty($visibleListsArray) && $listPosition == 'after') echo $listContent; ?>

					<td <?php if($displayOutside AND !$displayInline) echo 'colspan="2"'; ?> class="acysubbuttons">
						<?php if($params->get('showsubscribe',true)){?>
						<input class="button subbutton btn btn-primary" type="submit" value="<?php $subtext = $params->get('subscribetextreg'); if(empty($identifiedUser->userid) OR empty($subtext)){ $subtext = $params->get('subscribetext',acymailing_translation('SUBSCRIBECAPTION')); } echo $subtext;  ?>" name="Submit" onclick="try{ return submitacymailingform('optin','<?php echo $formName;?>'); }catch(err){alert('The form could not be submitted '+err);return false;}"/>
						<?php }if($params->get('showunsubscribe',false) AND (!$params->get('showsubscribe',true) OR empty($identifiedUser->userid) OR !empty($countUnsub)) ){?>
						<input class="button unsubbutton  btn btn-inverse" type="button" value="<?php echo $params->get('unsubscribetext',acymailing_translation('UNSUBSCRIBECAPTION')); ?>" name="Submit" onclick="return submitacymailingform('optout','<?php echo $formName;?>')"/>
						<?php } ?>
					</td>
				</tr>
			</table>
			<?php
			if(!empty($fieldsClass->excludeValue)){
				$js = "\n"."acymailingModule['excludeValues".$formName."'] = Array();";
				foreach($fieldsClass->excludeValue as $namekey => $value){
					$js .= "\n"."acymailingModule['excludeValues".$formName."']['".$namekey."'] = '".$value."';";
				}
				$js .= "\n";
				if($params->get('includejs','header') == 'header'){
					acymailing_addScript(true, $js);
				}else{
					echo "<script type=\"text/javascript\">
							<!--
							$js
							//-->
							</script>";
				}
			}
			if(!empty($postText)) echo '<div class="acymailing_finaltext">'.$postText.'</div>';
			$ajax = ($params->get('redirectmode') == '3') ? 1 : 0;?>
			<input type="hidden" name="ajax" value="<?php echo $ajax; ?>" />
			<input type="hidden" name="acy_source" value="<?php echo 'module_'.$module->id ?>" />
			<input type="hidden" name="ctrl" value="sub"/>
			<input type="hidden" name="task" value="notask"/>
			<input type="hidden" name="redirect" value="<?php echo urlencode($redirectUrl); ?>"/>
			<input type="hidden" name="redirectunsub" value="<?php echo urlencode($redirectUrlUnsub); ?>"/>
			<input type="hidden" name="option" value="<?php echo ACYMAILING_COMPONENT ?>"/>
			<?php if(!empty($identifiedUser->userid)){ ?><input type="hidden" name="visiblelists" value="<?php echo $visibleLists;?>"/><?php } ?>
			<input type="hidden" name="hiddenlists" value="<?php echo $hiddenLists;?>"/>
			<input type="hidden" name="acyformname" value="<?php echo $formName; ?>" />
			<?php if(acymailing_getVar('cmd', 'tmpl') == 'component'){ ?>
				<input type="hidden" name="tmpl" value="component" />
				<?php if($params->get('effect','normal') == 'mootools-box' AND !empty($redirectUrl)){ ?>
					<input type="hidden" name="closepop" value="1" />
				<?php } } ?>
			<?php $myItemId = $config->get('itemid',0); if(empty($myItemId)){ global $Itemid; $myItemId = $Itemid;} if(!empty($myItemId)){ ?><input type="hidden" name="Itemid" value="<?php echo $myItemId;?>"/><?php } ?>
			</div>
		</form>
	</div>
	<?php if($params->get('effect','normal') == 'mootools-slide'){ ?> </div> <?php } ?>
</div>

components/com_acymailing/extensions/mod_acymailing/mod_acymailing.xml000060400000051473152453623450022574 0ustar00<?xml version="1.0" encoding="utf-8"?>
<install type="module" version="1.5.0" method="upgrade">
	<name>AcyMailing Module</name>
	<creationDate>September 2009</creationDate>
	<version>3.7.0</version>
	<author>Acyba</author>
	<authorEmail>dev@acyba.com</authorEmail>
	<authorUrl>http://www.acyba.com</authorUrl>
	<copyright>Copyright (C) 2009-2018 ACYBA SAS - All rights reserved..</copyright>
	<license>GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html</license>
	<description>Subscribe / Unsubscribe Module for AcyMailing</description>
	<files>
		<filename module="mod_acymailing">mod_acymailing.php</filename>
		<filename>index.html</filename>
		<folder>tmpl</folder>
	</files>
	<params addpath="/components/com_acymailing/params">
		<param name="help" type="help" default="module" label="Help" description="Click on the help button to get some help"/>
		<param name="effect" type="radio" default="normal" label="DISPLAY_EFFECT" description="Select the effect you want to add to your module">
			<option value="normal">Normal (no effect)</option>
			<option value="mootools-slide">Slide effect</option>
			<option value="mootools-box">Popup effect</option>
		</param>
		<param name="lists" type="lists" default="None" label="VISIBLE_LISTS" description="The following selected lists will be added on the Module and will be visible (if they are not selected as automatically subscribed to)."/>
		<param name="hiddenlists" type="lists" default="All" label="AUTO_SUBSCRIBE_TO" description="The user will be automatically subscribed to the selected lists. They won't be displayed on your module but if the user subscribes, he will be subscribed to those lists as well"/>
		<param name="displaymode" type="radio" default="vertical" label="DISPLAY_MODE" description="Select whether you want to display the form horizontally, vertically or without table">
			<option value="inline">Horizontal</option>
			<option value="vertical">Vertical</option>
			<option value="tableless">Tableless</option>
		</param>
		<param name="listschecked" type="lists" default="All" label="LISTS_CHECKED_DEFAULT" description="The selected lists will be checked by default on your module if they are visible."/>
		<param name="checkmode" type="radio" default="0" label="CHECKED_MODE" description="If you select the first option - Show user's subscription status - only the lists that the logged-in user is subscribed to will be checked. This option has an effect on logged-in users only so you can choose whether you want to display his own subscription or always the default one.">
			<option value="0">Show user's subscription status</option>
			<option value="1">Default checked lists</option>
		</param>
		<param name="dropdown" type="radio" default="0" label="DROPDOWN_LISTS" description="Display the visible lists in a dropdown">
			<option value="0">JOOMEXT_NO</option>
			<option value="1">JOOMEXT_YES</option>
		</param>
		<param name="overlay" type="radio" default="0" label="DESC_OVERLAY" description="Add the description of each visible list as an overlay of the list name. Be careful, you might have conflicts using this option if you have some flash elements on your website.">
			<option value="0">JOOMEXT_NO</option>
			<option value="1">JOOMEXT_YES</option>
		</param>
		<param name="link" type="radio" default="1" label="LINKED_ARCHIVE" description="Add a link to the archive section for each list.">
			<option value="0">JOOMEXT_NO</option>
			<option value="1">JOOMEXT_YES</option>
		</param>
		<param name="listposition" type="radio" default="before" label="LIST_POSITION" description="Select where to display the list.">
			<option value="before">ACY_BEFORE_FIELDS</option>
			<option value="after">ACY_AFTER_FIELDS</option>
		</param>
		<param name="customfields" type="customfields" default="name,email" label="DISP_FIELDS" description="Select the fields you want to display on your subscription module"/>

		<param name="@spacer" type="spacer" default="" label="" description=""/>

		<param name="nametext" type="text" size="50" default="" label="CAPT_NAME" description="Text displayed on the name field. If you don't specify anything, the default value will be used from the current language file"/>
		<param name="emailtext" type="text" size="50" default="" label="CAPT_EMAIL" description="Text displayed on the e-mail field. If you don't specify anything, the default value will be used from the current language file"/>
		<param name="fieldsize" type="text" size="10" default="80%" label="FIELD_SIZE" description="Specify the size of the email and name fields on your subscription form"/>
		<param name="displayfields" type="radio" default="0" label="DISP_TEXT_MODE" description="Display the Name and E-mail text inside or outside the field?">
			<option value="0">Inside</option>
			<option value="1">Outside</option>
		</param>
		<param name="introtext" type="textarea" rows="5" cols="35" default="" label="INTRO_TEXT" description="This text will be displayed before the form inside a span class=acymailing_introtext"/>
		<param name="finaltext" type="textarea" rows="5" cols="35" default="" label="POST_TEXT" description="This text will be displayed after the form inside a span class=acymailing_finaltext"/>
		<param name="@spacer" type="spacer" default="" label="" description=""/>
		<param name="showsubscribe" type="radio" default="1" label="DISP_SUB_BUTTON" description="Display the subscribe button on the module">
			<option value="0">JOOMEXT_NO</option>
			<option value="1">JOOMEXT_YES</option>
		</param>
		<param name="subscribetext" type="text" size="50" default="" label="CAPT_SUB" description="Text displayed on the subscribe button. If you don't specify anything, the default value will be used from the current language file"/>
		<param name="subscribetextreg" type="text" size="50" default="" label="CAPT_SUB_LOGGED" description="Text displayed on the subscribe button if the user is logged in. If you don't specify anything, the default value will be used from the current language file"/>
		<param name="showunsubscribe" type="radio" default="0" label="DISP_UNSUB_BUTTON" description="Display the unsubscribe button on the module">
			<option value="0">JOOMEXT_NO</option>
			<option value="1">JOOMEXT_YES</option>
		</param>
		<param name="unsubscribetext" type="text" size="50" default="" label="CAPT_UNSUB" description="Text displayed on the unsubscribe button. If you don't specify anything, the default value will be used from the current language file"/>

		<param name="@spacer" type="spacer" default="" label="" description=""/>
		<param name="redirectmode" type="radio" default="0" label="REDIRECT_MODE" description="After submitting the form, the user can be redirected to the previous page, to the Acymailing archive page or to a custom link (in that case, please write the url in the next field)">
			<option value="3">Ajax</option>
			<option value="0">Previous page</option>
			<option value="1">AcyMailing Archive</option>
			<option value="2">Custom Redirect Link</option>
		</param>
		<param name="redirectlink" type="text" size="50" default="" label="REDIRECT_LINK" description="If you selected the mode 'Custom Redirect Link', the user will be redirected to this url after clicking on the button subscribe"/>
		<param name="redirectlinkunsub" type="text" size="50" default="" label="REDIRECTION_UNSUB" description="If you selected the mode 'Custom Redirect Link', the user will be redirected to this url after clicking on the button unsubscribe"/>

		<param name="@spacer" type="spacer" default="" label="" description=""/>

		<param name="showterms" type="radio" default="0" label="JOOMEXT_TERMS" description="Display the 'Accept Terms and Conditions' box">
			<option value="0">JOOMEXT_NO</option>
			<option value="1">JOOMEXT_YES</option>
		</param>
		<param name="showtermspopup" type="radio" default="1" label="TERMS_POPUP" description="If you select 'Yes', the article linked to the terms and conditions will be displayed in a popup, otherwise it will be displayed as a separated page">
			<option value="0">JOOMEXT_NO</option>
			<option value="1">JOOMEXT_YES</option>
		</param>
		<param name="termscontent" type="termscontent" default="0" label="TERMS_CONTENT" description="The selected article will be displayed if the user clicks on the link 'Terms and Conditions'"/>
		<param name="@spacer" type="spacer" default="" label="" description=""/>
		<param name="mootoolsintro" type="textarea" rows="5" cols="35" default="" label="MOO_INTRO" description="This text will be displayed before the button in case of you use the Slide / Popup effect"/>
		<param name="mootoolsbutton" type="text" size="50" default="" label="MOO_BUTTON" description="Text displayed on the button in case of you use the Slide / Popup effect. If you don't specify anything, the default value will be used from the current language file"/>
		<param name="boxwidth" type="text" size="5" default="250" label="MOO_BOX_WIDTH" description="If you use the popup effect, you can set the width of the box in this area"/>
		<param name="boxheight" type="text" size="5" default="200" label="MOO_BOX_HEIGHT" description="If you use the popup effect, you can set the height of the box in this area"/>

	</params>

	<params group="advanced">
		<param name="moduleclass_sfx" type="text" default="" label="MODULE_CLASSSUF" description="PARAMMODULECLASSSUFFIX"/>
		<param name="textalign" type="list" default="0" label="MODULE_ALIGNMENT" description="This option enables you to align the text inside the module">
			<option value="none">Default CSS alignment</option>
			<option value="right">Right</option>
			<option value="left">Left</option>
			<option value="center">Center</option>
		</param>
		<param name="loggedin" type="radio" default="1" label="MODULE_AUTOID" description="Do you want the logged in users to be automatically identified in the module?">
			<option value="0">JOOMEXT_NO</option>
			<option value="1">JOOMEXT_YES</option>
		</param>
		<param name="cache" type="list" default="0" label="MODULE_CACHING" description="Select whether to cache the content of this module">
			<option value="0">No caching</option>
			<option value="1">Use global</option>
		</param>
		<param name="cache_time" type="text" default="15" label="COM_MODULES_FIELD_CACHE_TIME_LABEL" description="COM_MODULES_FIELD_CACHE_TIME_DESC"/>
		<param name="includejs" type="list" default="header" label="MODULE_JS" description="How should AcyMailing add the necessary JS files">
			<option value="header">In the header</option>
			<option value="module">On the module itself</option>
		</param>
		<param name="itemid" size="10" type="text" default="" label="ACY_ITEMID" description="Menu ID used in the archive links coming from this module"/>
	</params>

	<config>
		<fields name="params" addfieldpath="/components/com_acymailing/params">
			<fieldset name="basic">
				<field name="help" type="help" default="module" label="Help" description="Click on the help button to get some help"/>
				<field name="effect" type="radio" default="normal" label="DISPLAY_EFFECT" description="Select the effect you want to add to your module">
					<option value="normal">Normal (no effect)</option>
					<option value="mootools-slide">Slide effect</option>
					<option value="mootools-box">Popup effect</option>
				</field>
				<field name="lists" type="lists" default="None" label="VISIBLE_LISTS" description="The following selected lists will be added on the Module and will be visible (if they are not selected as automatically subscribed to)."/>
				<field name="hiddenlists" type="lists" default="All" label="AUTO_SUBSCRIBE_TO" description="The user will be automatically subscribed to the selected lists. They won't be displayed on your module but if the user subscribes, he will be subscribed to those lists as well"/>
				<field name="displaymode" type="radio" default="vertical" label="DISPLAY_MODE" description="Select whether you want to display the form horizontally, vertically or without table">
					<option value="inline">Horizontal</option>
					<option value="vertical">Vertical</option>
					<option value="tableless">Tableless</option>
				</field>
				<field name="listschecked" type="lists" default="All" label="LISTS_CHECKED_DEFAULT" description="The selected lists will be checked by default on your module if they are visible."/>
				<field name="checkmode" type="radio" default="0" label="CHECKED_MODE" description="If you select the first option - Show user's subscription status - only the lists that the logged-in user is subscribed to will be checked. This option has an effect on logged-in users only so you can choose whether you want to display his own subscription or always the default one.">
					<option value="0">Show user's subscription status</option>
					<option value="1">Default checked lists</option>
				</field>
				<field name="dropdown" type="radio" default="0" label="DROPDOWN_LISTS" description="Display the visible lists in a dropdown">
					<option value="0">JOOMEXT_NO</option>
					<option value="1">JOOMEXT_YES</option>
				</field>
				<field name="overlay" type="radio" default="0" label="DESC_OVERLAY" description="Add the description of each visible list as an overlay of the list name. Be careful, you might have conflicts using this option if you have some flash elements on your website.">
					<option value="0">JOOMEXT_NO</option>
					<option value="1">JOOMEXT_YES</option>
				</field>
				<field name="link" type="radio" default="1" label="LINKED_ARCHIVE" description="Add a link to the archive section for each list.">
					<option value="0">JOOMEXT_NO</option>
					<option value="1">JOOMEXT_YES</option>
				</field>
				<field name="listposition" type="radio" default="before" label="LIST_POSITION" description="Select where to display the list.">
					<option value="before">ACY_BEFORE_FIELDS</option>
					<option value="after">ACY_AFTER_FIELDS</option>
				</field>
				<field name="customfields" type="customfields" default="name,email" label="DISP_FIELDS" description="Select the fields you want to display on your subscription module"/>

				<field name="@spacer" type="spacer" default="" label="" description=""/>

				<field name="nametext" type="text" size="50" default="" label="CAPT_NAME" description="Text displayed on the name field. If you don't specify anything, the default value will be used from the current language file" filter="SAFEHTML"/>
				<field name="emailtext" type="text" size="50" default="" label="CAPT_EMAIL" description="Text displayed on the e-mail field. If you don't specify anything, the default value will be used from the current language file" filter="SAFEHTML"/>
				<field name="fieldsize" type="text" size="10" default="80%" label="FIELD_SIZE" description="Specify the size of the email and name fields on your subscription form"/>
				<field name="displayfields" type="radio" default="0" label="DISP_TEXT_MODE" description="Display the Name and E-mail text inside or outside the field?">
					<option value="0">Inside</option>
					<option value="1">Outside</option>
				</field>
				<field name="introtext" type="textarea" rows="5" cols="35" default="" label="INTRO_TEXT" description="This text will be displayed before the form inside a span class=acymailing_introtext" filter="SAFEHTML"/>
				<field name="finaltext" type="textarea" rows="5" cols="35" default="" label="POST_TEXT" description="This text will be displayed after the form inside a span class=acymailing_finaltext" filter="SAFEHTML"/>
				<field name="@spacer" type="spacer" default="" label="" description=""/>
				<field name="showsubscribe" type="radio" default="1" label="DISP_SUB_BUTTON" description="Display the subscribe button on the module">
					<option value="0">JOOMEXT_NO</option>
					<option value="1">JOOMEXT_YES</option>
				</field>
				<field name="subscribetext" type="text" size="50" default="" label="CAPT_SUB" description="Text displayed on the subscribe button. If you don't specify anything, the default value will be used from the current language file" filter="SAFEHTML"/>
				<field name="subscribetextreg" type="text" size="50" default="" label="CAPT_SUB_LOGGED" description="Text displayed on the subscribe button if the user is logged in. If you don't specify anything, the default value will be used from the current language file" filter="SAFEHTML"/>
				<field name="showunsubscribe" type="radio" default="0" label="DISP_UNSUB_BUTTON" description="Display the unsubscribe button on the module">
					<option value="0">JOOMEXT_NO</option>
					<option value="1">JOOMEXT_YES</option>
				</field>
				<field name="unsubscribetext" type="text" size="50" default="" label="CAPT_UNSUB" description="Text displayed on the unsubscribe button. If you don't specify anything, the default value will be used from the current language file" filter="SAFEHTML"/>

				<field name="@spacer" type="spacer" default="" label="" description=""/>
				<field name="redirectmode" type="radio" default="0" label="REDIRECT_MODE" description="After submitting the form, the user can be redirected to the previous page, to the Acymailing archive page or to a custom link (in that case, please write the url in the next field)">
					<option value="3">Ajax</option>
					<option value="0">Previous page</option>
					<option value="1">AcyMailing Archive</option>
					<option value="2">Custom Redirect Link</option>
				</field>
				<field name="redirectlink" type="text" size="50" default="" label="REDIRECT_LINK" description="If you selected the mode 'Custom Redirect Link', the user will be redirected to this url after clicking on the button subscribe"/>
				<field name="redirectlinkunsub" type="text" size="50" default="" label="REDIRECTION_UNSUB" description="If you selected the mode 'Custom Redirect Link', the user will be redirected to this url after clicking on the button unsubscribe"/>

				<field name="@spacer" type="spacer" default="" label="" description=""/>

				<field name="showterms" type="radio" default="0" label="JOOMEXT_TERMS" description="Display the 'Accept Terms and Conditions' box">
					<option value="0">JOOMEXT_NO</option>
					<option value="1">JOOMEXT_YES</option>
				</field>
				<field name="showtermspopup" type="radio" default="1" label="TERMS_POPUP" description="If you select 'Yes', the article linked to the terms and conditions will be displayed in a popup, otherwise it will be displayed as a separated page">
					<option value="0">JOOMEXT_NO</option>
					<option value="1">JOOMEXT_YES</option>
				</field>
				<field name="termscontent" type="termscontent" default="0" label="TERMS_CONTENT" description="The selected article will be displayed if the user clicks on the link 'Terms and Conditions'"/>
				<field name="@spacer" type="spacer" default="" label="" description=""/>
				<field name="mootoolsintro" type="textarea" rows="5" cols="35" default="" label="MOO_INTRO" description="This text will be displayed before the button in case of you use the Slide / Popup effect" filter="SAFEHTML"/>
				<field name="mootoolsbutton" type="text" size="50" default="" label="MOO_BUTTON" description="Text displayed on the button in case of you use the Slide / Popup effect. If you don't specify anything, the default value will be used from the current language file" filter="SAFEHTML"/>
				<field name="boxwidth" type="text" size="5" default="250" label="MOO_BOX_WIDTH" description="If you use the popup effect, you can set the width of the box in this area"/>
				<field name="boxheight" type="text" size="5" default="200" label="MOO_BOX_HEIGHT" description="If you use the popup effect, you can set the height of the box in this area"/>

			</fieldset>
			<fieldset name="advanced">
				<field name="moduleclass_sfx" type="text" default="" label="MODULE_CLASSSUF" description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC"/>
				<field name="textalign" type="list" default="0" label="MODULE_ALIGNMENT" description="This option enables you to align the text inside the module">
					<option value="none">Default CSS alignment</option>
					<option value="right">Right</option>
					<option value="left">Left</option>
					<option value="center">Center</option>
				</field>
				<field name="loggedin" type="radio" default="1" label="MODULE_AUTOID" description="Do you want the logged in users to be automatically identified in the module?">
					<option value="0">JOOMEXT_NO</option>
					<option value="1">JOOMEXT_YES</option>
				</field>
				<field name="cache" type="list" default="0" label="MODULE_CACHING" description="Select whether to cache the content of this module">
					<option value="0">No caching</option>
					<option value="1">Use global</option>
				</field>
				<field name="cache_time" type="text" default="15" label="COM_MODULES_FIELD_CACHE_TIME_LABEL" description="COM_MODULES_FIELD_CACHE_TIME_DESC"/>
				<field name="includejs" type="list" default="header" label="MODULE_JS" description="How should AcyMailing add the necessary JS files">
					<option value="header">In the header</option>
					<option value="module">On the module itself</option>
				</field>
				<field name="itemid" size="10" type="text" default="" label="ACY_ITEMID" description="Menu ID used in the archive links coming from this module"/>
			</fieldset>
		</fields>
	</config>
</install>

components/com_acymailing/extensions/mod_acymailing/index.html000060400000000054152453623450021060 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_acymailing_managetext/managetext.xml000060400000006551152453623450024172 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/plugin-install.dtd">
<install type="plugin" version="1.5" method="upgrade" group="acymailing">
	<name>AcyMailing Manage text</name>
	<creationDate>October 2010</creationDate>
	<version>1.0.0</version>
	<author>Acyba</author>
	<authorEmail>dev@acyba.com</authorEmail>
	<authorUrl>http://www.acyba.com</authorUrl>
	<copyright>Copyright (C) 2009-2018 ACYBA SAS - All rights reserved..</copyright>
	<license>GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html</license>
	<description>This plugin enables you to remove some text from your Newsletter or add a signature at the end of all your Newsletters or add/remove an e-mail from the queue...</description>
	<files>
		<filename plugin="managetext">managetext.php</filename>
	</files>
	<params addpath="/components/com_acymailing/params">
		<param name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-managetext"/>
		<param name="removetext" type="text" size="100" default="{reg},{/reg},{pub},{/pub}" label="Text to remove" description="Enter the different strings you want AcyMailing to remove and separate them with a comma. Example : {reg},{/reg},{pub},{/pub}" />
		<param name="removetags" type="text" size="100" default="youtube" label="Code to remove" description="AcyMailing will remove all tags specified in this option and its content, separate them with a comma" />

		<param name="footer" type="textarea" rows="5" cols="35" default="" label="Footer" description="Write the text you want to be added at the end of each e-mail" />
		<param name="@spacer" type="spacer" default="" label="" description="" />

		<param name="frontendaccess" type="list" default="all" label="Front-end Access for filter" description="You can restrict the access to the filter 'Randomly select X Users' on the Front-end">
			<option value="all">Always display this filter</option>
			<option value="none">Don't display this filter on the front-end</option>
		</param>
	</params>
	<config>
		<fields name="params" addfieldpath="/components/com_acymailing/params">
			<fieldset name="basic">
				<field name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-managetext"/>
				<field name="removetext" type="text" size="100" default="{reg},{/reg},{pub},{/pub}" label="Text to remove" description="Enter the different strings you want AcyMailing to remove and separate them with a comma. Example : {reg},{/reg},{pub},{/pub}" />
				<field name="removetags" type="text" size="100" default="youtube" label="Code to remove" description="AcyMailing will remove all tags specified in this option and its content, separate them with a comma" />

				<field name="footer" type="textarea" rows="5" cols="35" default="" label="Footer" description="Write the text you want to be added at the end of each e-mail" filter="SAFEHTML" />
				<field name="@spacer" type="spacer" default="" label="" description="" />

				<field name="frontendaccess" type="list" default="all" label="Front-end Access for filter" description="You can restrict the access to the filter 'Randomly select X Users' on the Front-end">
					<option value="all">Always display this filter</option>
					<option value="none">Don't display this filter on the front-end</option>
				</field>
			</fieldset>
		</fields>
	</config>
</install>
components/com_acymailing/extensions/plg_acymailing_managetext/managetext.php000060400000032512152453623450024155 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php
defined('_JEXEC') or die('Restricted access');

class plgAcymailingManagetext extends JPlugin{
	var $foundtags = array();

	function __construct(&$subject, $config){
		parent::__construct($subject, $config);
		if(!isset($this->params)){
			$plugin = JPluginHelper::getPlugin('acymailing', 'managetext');
			$this->params = new acyParameter($plugin->params);
		}
	}

	function acymailing_replacetags(&$email, $send = true){
		$this->_replaceConstant($email);
		$this->_replaceRandom($email);
	}

	function acymailing_replaceusertags(&$email, &$user, $send = true){
		$this->_removetext($email);
		$this->_addfooter($email);
		$this->_ifstatement($email, $user);
	}

	private function _replaceConstant(&$email){
		$acypluginsHelper = acymailing_get('helper.acyplugins');
		$tags = $acypluginsHelper->extractTags($email, '(?:const|trans|config)');
		if(empty($tags)) return;

		$jconfig = JFactory::getConfig();

		$tagsReplaced = array();
		foreach($tags as $i => $oneTag){
			$val = '';
			$arrayVal = array();
			foreach($oneTag as $valname => $oneValue){
				if($valname == 'id'){
					$val = trim(strip_tags($oneValue));
				}elseif($valname != 'default'){
					$arrayVal[] = '{'.$valname.'}';
				}
			}

			if(empty($val)) continue;
			$tagValues = explode(':', $i);
			$type = ltrim($tagValues[0], '{');
			if($type == 'const'){
				$tagsReplaced[$i] = defined($val) ? constant($val) : 'Constant not defined : '.$val;
			}elseif($type == 'config'){
				if($val == 'sitename'){
					$tagsReplaced[$i] = ACYMAILING_J30 ? $jconfig->get($val) : $jconfig->getValue('config.'.$val);
				}
			}else{
				static $done = false;
				if(!$done){
					$done = true;
					acymailing_loadLanguageFile('com_users', JPATH_SITE);
					acymailing_loadLanguageFile('com_users', JPATH_ADMINISTRATOR);
					acymailing_loadLanguageFile('plg_user_joomla', JPATH_ADMINISTRATOR);
				}
				if(!empty($arrayVal)){
					$tagsReplaced[$i] = nl2br(vsprintf(acymailing_translation($val), $arrayVal));
				}else{
					$tagsReplaced[$i] = acymailing_translation($val);
				}
			}
		}

		$acypluginsHelper->replaceTags($email, $tagsReplaced, true);
	}

	private function _replaceRandom(&$email){
		$pluginHelper = acymailing_get('helper.acyplugins');
		$randTag = $pluginHelper->extractTags($email, "rand");
		if(empty($randTag)) return;
		foreach($randTag as $oneRandTag){
			$results[$oneRandTag->id] = explode(';', $oneRandTag->id);
			$randNumber = rand(0, count($results[$oneRandTag->id]) - 1);
			$results[$oneRandTag->id][count($results[$oneRandTag->id])] = $results[$oneRandTag->id][$randNumber];
		}

		$tags = array();
		foreach(array_keys($results) as $oneResult){
			$tags['{rand:'.$oneResult.'}'] = end($results[$oneResult]);
		}

		if(empty($tags)) return;
		$pluginHelper->replaceTags($email, $tags, true);
	}


	private function _ifstatement(&$email, $user, $loop = 1){
		if(isset($this->noIfStatementTags[$email->mailid])) return;

		$isAdmin = JFactory::getApplication()->isAdmin();

		if($loop > 3){
			if($isAdmin) acymailing_display('You cannot have more than 3 nested {if} tags.', 'warning');
			return;
		}

		$match = '#{if:(((?!{if).)*)}(((?!{if).)*){/if}#Uis';
		$variables = array('subject', 'body', 'altbody', 'From', 'FromName', 'ReplyTo');
		$found = false;
		foreach($variables as $var){
			if(empty($email->$var)) continue;
			if(is_array($email->$var)){
				foreach($email->$var as $i => &$arrayField){
					if(empty($arrayField) || !is_array($arrayField)) continue;
					foreach($arrayField as $key => &$oneval){
						$found = preg_match_all($match, $oneval, $results[$var.$i.'-'.$key]) || $found;
						if(empty($results[$var.$i.'-'.$key][0])) unset($results[$var.$i.'-'.$key]);
					}
				}
			}else{
				$found = preg_match_all($match, $email->$var, $results[$var]) || $found;
				if(empty($results[$var][0])) unset($results[$var]);
			}
		}

		if(!$found){
			if($loop == 1) $this->noIfStatementTags[$email->mailid] = true;
			return;
		}

		static $a = false;

		$tags = array();
		foreach($results as $var => $allresults){
			foreach($allresults[0] as $i => $oneTag){
				if(isset($tags[$oneTag])) continue;
				$allresults[1][$i] = html_entity_decode($allresults[1][$i]);
				if(!preg_match('#^(.+)(!=|<|>|&gt;|&lt;|!~)([^=!<>~]+)$#is', $allresults[1][$i], $operators) && !preg_match('#^(.+)(=|~)([^=!<>~]+)$#is', $allresults[1][$i], $operators)){
					if($isAdmin) acymailing_display('Operation not found : '.$allresults[1][$i], 'error');
					$tags[$oneTag] = $allresults[3][$i];
					continue;
				};
				$field = trim($operators[1]);
				$prop = '';

				$operatorsParts = explode('.', $operators[1]);
				$operatorComp = 'acymailing';
				if(count($operatorsParts) > 1 && in_array($operatorsParts[0], array('acymailing', 'joomla', 'var'))){
					$operatorComp = $operatorsParts[0];
					unset($operatorsParts[0]);
					$field = implode('.', $operatorsParts);
				}
				
				if($operatorComp == 'joomla'){
					if(!empty($user->userid)){
						if($field == 'gid' && ACYMAILING_J16){
							$prop = implode(';', acymailing_loadResultArray('SELECT group_id FROM #__user_usergroup_map WHERE user_id = '.intval($user->userid)));
						}else{
							$juser = acymailing_loadObject('SELECT * FROM #__users WHERE id = '.intval($user->userid));
							if(isset($juser->{$field})){
								$prop = strtolower($juser->{$field});
							}else{
								if($isAdmin && !$a) acymailing_display('User variable not set : '.$field.' in '.$allresults[1][$i], 'error');
								$a = true;
							}
						}
					}
				}elseif($operatorComp == 'var'){
					$prop = strtolower($field);
				}else{
					if(!isset($user->{$field})){
						if($isAdmin && !$a) acymailing_display('User variable not set : '.$field.' in '.$allresults[1][$i], 'error');
						$a = true;
					}else{
						$prop = strtolower($user->{$field});
					}
				}

				$tags[$oneTag] = '';
				$val = trim(strtolower($operators[3]));
				if($operators[2] == '=' && ($prop == $val || in_array($prop, explode(';', $val)) || in_array($val, explode(';', $prop)))){
					$tags[$oneTag] = $allresults[3][$i];
				}elseif($operators[2] == '!=' && $prop != $val){
					$tags[$oneTag] = $allresults[3][$i];
				}elseif(($operators[2] == '>' || $operators[2] == '&gt;') && $prop > $val){
					$tags[$oneTag] = $allresults[3][$i];
				}elseif(($operators[2] == '<' || $operators[2] == '&lt;') && $prop < $val){
					$tags[$oneTag] = $allresults[3][$i];
				}elseif($operators[2] == '~' && strpos($prop, $val) !== false){
					$tags[$oneTag] = $allresults[3][$i];
				}elseif($operators[2] == '!~' && strpos($prop, $val) === false){
					$tags[$oneTag] = $allresults[3][$i];
				}
			}
		}

		foreach($variables as &$var){
			if(empty($email->$var)) continue;
			if(is_array($email->$var)){
				foreach($email->$var as &$arrayField){
					if(empty($arrayField) || !is_array($arrayField)) continue;
					foreach($arrayField as &$oneval){
						$oneval = str_replace(array_keys($tags), $tags, $oneval);
					}
				}
			}else{
				$email->$var = str_replace(array_keys($tags), $tags, $email->$var);
			}
		}
		$this->_ifstatement($email, $user, $loop + 1);
	}

	private function _removetext(&$email){
		$removetext = $this->params->get('removetext', '{reg},{/reg},{pub},{/pub}');
		if(!empty($removetext)){
			$removeArray = explode(',', trim($removetext, ' ,'));
			if(!empty($email->body)) $email->body = str_replace($removeArray, '', $email->body);
			if(!empty($email->altbody)) $email->altbody = str_replace($removeArray, '', $email->altbody);
		}


		$removetags = $this->params->get('removetags', 'youtube');
		if(!empty($removetags)){
			$regex = array();
			$removeArray = explode(',', trim($removetags, ' ,'));
			foreach($removeArray as $oneTag){
				if(empty($oneTag)) continue;
				$regex[] = '#(?:{|%7B)'.preg_quote($oneTag, '#').'(?:}|%7D).*(?:{|%7B)/'.preg_quote($oneTag, '#').'(?:}|%7D)#Uis';
				$regex[] = '#(?:{|%7B)'.preg_quote($oneTag, '#').'[^}]*(?:}|%7D)#Uis';
			}

			if(!empty($email->body)) $email->body = preg_replace($regex, '', $email->body);
			if(!empty($email->altbody)) $email->altbody = preg_replace($regex, '', $email->altbody);
		}
	}

	private function _addfooter(&$email){
		$footer = $this->params->get('footer');
		if(!empty($footer)){
			if(strpos($email->body, '</body>')){
				$email->body = str_replace('</body>', '<br />'.$footer.'</body>', $email->body);
			}else{
				$email->body .= '<br />'.$footer;
			}

			if(!empty($email->altbody)){
				$email->altbody .= "\n".$footer;
			}
		}
	}

	function onAcyDisplayFilters(&$type, $context = "massactions"){
		if($this->params->get('displayfilter_'.$context, true) == false || ($this->params->get('frontendaccess') == 'none' && !acymailing_isAdmin())) return;

		$type['limitrand'] = acymailing_translation_sprintf('ACY_RAND_LIMIT', 'X');

		$return = '<div id="filter__num__limitrand">'.acymailing_translation_sprintf('ACY_RAND_LIMIT', '<input type="text" style="width:60px" value="30" name="filter[__num__][limitrand][nbusers]" />').'</div>';

		return $return;
	}

	function onAcyDisplayFilter_limitrand($filter){
		return acymailing_translation_sprintf('ACY_RAND_LIMIT', $filter['nbusers']);
	}


	function onAcyProcessFilter_limitrand(&$query, $filter, $num){
		$query->limit = intval($filter['nbusers']);
		$query->orderBy = 'RAND()';
	}

	function onAcyDisplayActions(&$type){
		$type['addqueue'] = acymailing_translation('ADD_QUEUE');
		$type['removequeue'] = acymailing_translation('REMOVE_QUEUE');

		$allEmails = acymailing_loadObjectList("SELECT `mailid`,`subject`, `type` FROM `#__acymailing_mail` WHERE `type` NOT IN ('notification','autonews','joomlanotification') OR `alias` = 'confirmation' ORDER BY `type`,`senddate` DESC LIMIT 5000");

		$emailsToDisplay = array();
		$typeNews = '';
		foreach($allEmails as $oneMail){
			$oneMail->subject = acyEmoji::Decode($oneMail->subject);
			if($oneMail->type != $typeNews){
				if(!empty($typeNews)) $emailsToDisplay[] = acymailing_selectOption('</OPTGROUP>');
				$typeNews = $oneMail->type;
				if($oneMail->type == 'news'){
					$label = acymailing_translation('NEWSLETTERS');
				}elseif($oneMail->type == 'followup'){
					$label = acymailing_translation('FOLLOWUP');
				}elseif($oneMail->type == 'welcome'){
					$label = acymailing_translation('MSG_WELCOME');
				}elseif($oneMail->type == 'unsub'){
					$label = acymailing_translation('MSG_UNSUB');
				}else{
					$label = $oneMail->type;
				}
				$emailsToDisplay[] = acymailing_selectOption('<OPTGROUP>', $label);
			}
			$emailsToDisplay[] = acymailing_selectOption($oneMail->mailid, $oneMail->subject.' ['.$oneMail->mailid.']');
		}
		$emailsToDisplay[] = acymailing_selectOption('</OPTGROUP>');

		$addqueue = '<div id="action__num__addqueue">'.acymailing_select($emailsToDisplay, "action[__num__][addqueue][mailid]", 'class="inputbox" size="1"').'<br /><label for="addqueuesenddate__num__">'.acymailing_translation('SEND_DATE').' </label> <input type="text" value="{time}" id="addqueuesenddate__num__" name="action[__num__][addqueue][senddate]" onclick="displayDatePicker(this,event)"/></div>';

		$allMessages = acymailing_selectOption(0, acymailing_translation('ACY_ALL'));
		array_unshift($emailsToDisplay, $allMessages);
		$removequeue = '<div id="action__num__removequeue">'.acymailing_select($emailsToDisplay, "action[__num__][removequeue][mailid]", 'class="inputbox" size="1"').'</div>';
		return $addqueue.$removequeue;
	}

	function onAcyProcessAction_addqueue($cquery, $action, $num){
		$action['mailid'] = intval($action['mailid']);
		if(empty($action['mailid'])) return 'Mailid not valid';
		if(empty($action['senddate'])) return 'Send date not valid';

		$action['senddate'] = acymailing_replaceDate($action['senddate']);
		if(!is_numeric($action['senddate'])) $action['senddate'] = acymailing_getTime($action['senddate']);
		if(empty($action['senddate'])) return 'send date not valid';

		$query = 'INSERT IGNORE INTO `#__acymailing_queue` (`mailid`,`subid`,`senddate`,`priority`) '.$cquery->getQuery(array($action['mailid'], 'sub.`subid`', $action['senddate'], '2'));
		$affected = acymailing_query($query);
		return acymailing_translation_sprintf('ADDED_QUEUE', $affected);
	}

	function onAcyProcessAction_removequeue($cquery, $action, $num){
		$action['mailid'] = intval($action['mailid']);
		if(!empty($action['mailid'])) $cquery->where['queueremove'] = 'queueremove.mailid = '.$action['mailid'];

		$query = 'DELETE queueremove.* FROM `#__acymailing_queue` as queueremove ';
		$query .= 'JOIN `#__acymailing_subscriber` as sub ON queueremove.subid = sub.subid ';
		if(!empty($cquery->join)) $query .= ' JOIN '.implode(' JOIN ', $cquery->join);
		if(!empty($cquery->leftjoin)) $query .= ' LEFT JOIN '.implode(' LEFT JOIN ', $cquery->leftjoin);
		if(!empty($cquery->where)) $query .= ' WHERE ('.implode(') AND (', $cquery->where).')';

		$affected = acymailing_query($query);

		unset($cquery->where['queueremove']);

		return acymailing_translation_sprintf('SUCC_DELETE_ELEMENTS', $affected);
	}

	function onAcyProcessAction_displayUsers($cquery, $action, $num){

		$res = array();
		$res['countTotal'] = $cquery->count();

		if(empty($cquery->limit) || $cquery->limit > 50) $cquery->limit = 20;

		$query = $cquery->getQuery(array('sub.`subid`', 'sub.email', 'sub.name'));
		$users = acymailing_loadObjectList($query);

		$res['users'] = $users;
		return $res;
	}

}//endclass
components/com_acymailing/extensions/plg_acymailing_managetext/index.html000060400000000054152453623450023300 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_acymailing_stats/stats.php000060400000013340152453623450022155 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class plgAcymailingStats extends JPlugin{
	function __construct(&$subject, $config){
		parent::__construct($subject, $config);
		if(!isset($this->params)){
			$plugin = JPluginHelper::getPlugin('acymailing', 'stats');
			$this->params = new acyParameter($plugin->params);
		}
		$this->acypluginsHelper = acymailing_get('helper.acyplugins');
	}

	function acymailing_replacetags(&$email, $send = true){
		$this->statPicture($email, $send);
	}

	function statPicture(&$email, $send = true){
		if(!empty($email->altbody)){
			$email->altbody = str_replace(array('{statpicture}', '{nostatpicture}'), '', $email->altbody);
		}
		if(((isset($email->sendHTML) && !$email->sendHTML) || (isset($email->html) && !$email->html))
			|| empty($email->type)
			|| !in_array($email->type, array('news', 'autonews', 'followup', 'welcome', 'unsub', 'joomlanotification', 'action'))
			|| strpos($email->body, '{nostatpicture}')){
			$email->body = str_replace(array('{statpicture}', '{nostatpicture}'), '', $email->body);
			return;
		}

		if(!$send){
			$pictureLink = ACYMAILING_LIVE.$this->params->get('picture', 'media/com_acymailing/images/statpicture.png');
		}else {
			$config = acymailing_config();
			$itemId = $config->get('itemid', 0);
			$item = empty($itemId) ? '' : '&Itemid=' . $itemId;
			$pictureLink = acymailing_frontendLink('index.php?option=com_acymailing&ctrl=statistics&mailid=' . $email->mailid . '&subid={subtag:subid}' . $item, false);
		}

		$widthsize = $this->params->get('width', 50);
		$heightsize = $this->params->get('height', 1);
		$width = empty($widthsize) ? '' : ' width="'.$widthsize.'" ';
		$height = empty($heightsize) ? '' : ' height="'.$heightsize.'" ';

		$statPicture = '<img class="spict" alt="'.$this->params->get('alttext', '').'" src="'.$pictureLink.'"  border="0" '.$height.$width.'/>';

		if(strpos($email->body, '{statpicture}')){
			$email->body = str_replace('{statpicture}', $statPicture, $email->body);
		}elseif(strpos($email->body, '</body>')) $email->body = str_replace('</body>', $statPicture.'</body>', $email->body);
		else $email->body .= $statPicture;
	}//endfct

	function acymailing_getstatpicture(){
		return $this->params->get('picture', 'media/com_acymailing/images/statpicture.png');
	}

	function onAcyDisplayTriggers(&$triggers){
		$triggers['opennews'] = acymailing_translation('ON_OPEN_NEWS');
	}

	function onAcyDisplayFilters(&$type, $context = "massactions"){

		if($context != "massactions" AND !$this->params->get('displayfilter_'.$context, false)) return;

		$type['deliverstat'] = acymailing_translation('STATISTICS');

		$allemails = acymailing_loadObjectList("SELECT `mailid`,CONCAT(`subject`,' [',".acymailing_escapeDB(acymailing_translation('ACY_ID').' ').", CAST(`mailid` AS char),']') as 'value' FROM `#__acymailing_mail` WHERE `type` IN('news','welcome','unsub','followup','notification','joomlanotification') ORDER BY `senddate` DESC LIMIT 5000");
		$element = new stdClass();
		$element->mailid = 0;
		$element->value = acymailing_translation('EMAIL_NAME');
		array_unshift($allemails, $element);

		$actions = array();
		$actions[] = acymailing_selectOption('open', acymailing_translation('OPEN'));
		$actions[] = acymailing_selectOption('notopen', acymailing_translation('NOT_OPEN'));
		$actions[] = acymailing_selectOption('failed', acymailing_translation('FAILED'));
		if(acymailing_level(3)) $actions[] = acymailing_selectOption('bounce', acymailing_translation('BOUNCES'));
		$actions[] = acymailing_selectOption('htmlsent', acymailing_translation('SENT_HTML'));
		$actions[] = acymailing_selectOption('textsent', acymailing_translation('SENT_TEXT'));
		$actions[] = acymailing_selectOption('notsent', acymailing_translation('NOT_SENT'));

		$return = '<div id="filter__num__deliverstat">'.acymailing_select($actions, "filter[__num__][deliverstat][action]", 'class="inputbox" onchange="countresults(__num__);" size="1"', 'value', 'text');
		$return .= ' '.acymailing_select($allemails, "filter[__num__][deliverstat][mailid]", 'onchange="countresults(__num__)" class="inputbox" size="1" style="max-width:200px"', 'mailid', 'value').'</div>';

		return $return;
	}

	function onAcyProcessFilterCount_deliverstat(&$query, $filter, $num){
		$this->onAcyProcessFilter_deliverstat($query, $filter, $num);
		return acymailing_translation_sprintf('SELECTED_USERS', $query->count());
	}

	function onAcyProcessFilter_deliverstat(&$query, $filter, $num){

		$alias = 'stats'.$num;
		$jl = '#__acymailing_userstats AS '.$alias.' ON '.$alias.'.subid = sub.subid';
		if(!empty($filter['mailid'])) $jl .= ' AND '.$alias.'.mailid = '.intval($filter['mailid']);

		$query->leftjoin[$alias] = $jl;

		if($filter['action'] == 'open'){
			$where = $alias.'.open > 0';
		}elseif($filter['action'] == 'notopen'){
			if(empty($filter['mailid'])) {
				unset($query->leftjoin[$alias]);
				$usersNeverOpened = acymailing_loadResultArray('SELECT subid FROM #__acymailing_userstats GROUP BY subid HAVING MAX(open) = 0');
				if(empty($usersNeverOpened)) $usersNeverOpened = array(0);
				$where = 'sub.subid IN ('.implode(',', $usersNeverOpened).')';
			}else{
				$where = $alias.'.open = 0';
			}
		}elseif($filter['action'] == 'failed'){
			$where = $alias.'.fail = 1';
		}elseif($filter['action'] == 'bounce'){
			$where = $alias.'.bounce = 1';
		}elseif($filter['action'] == 'htmlsent'){
			$where = $alias.'.html = 1';
		}elseif($filter['action'] == 'textsent'){
			$where = $alias.'.html = 0';
		}elseif($filter['action'] == 'notsent'){
			$where = $alias.'.subid IS NULL';
		}

		$query->where[] = $where;
	}

}//endclass
components/com_acymailing/extensions/plg_acymailing_stats/stats.xml000060400000006406152453623450022173 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/plugin-install.dtd">
<install type="plugin" version="1.5" method="upgrade" group="acymailing">
	<name>AcyMailing : Statistics Plugin</name>
	<creationDate>September 2009</creationDate>
	<version>3.7.0</version>
	<author>Acyba</author>
	<authorEmail>dev@acyba.com</authorEmail>
	<authorUrl>http://www.acyba.com</authorUrl>
	<copyright>Copyright (C) 2009-2018 ACYBA SAS - All rights reserved..</copyright>
	<license>GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html</license>
	<description>This plugin is used to handle statistics on any AcyMailing e-mail</description>
	<files>
		<filename plugin="stats">stats.php</filename>
	</files>
	<params addpath="/components/com_acymailing/params">
		<param name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-stats"/>
		<param name="picture" type="text" size="60" label="Stat picture" default="media/com_acymailing/images/statpicture.png" description="Path of the statistic picture"/>
		<param name="alttext" type="text" size="60" default="" label="Alt Text" description="Alternatif text which will be displayed if the user does not accept to load your images" />
		<param name="width" type="text" size="2" default="50" label="Stat picture width" description="An image will be added in your HTML e-mails to be able to handle statistics. You can modify the width of the stat picture." />
		<param name="height" type="text" size="2" default="1" label="Stat picture height" description="An image will be added in your HTML e-mails to be able to handle statistics. You can modify the height of the stat picture." />
		<param name="displayfilter_mail" type="radio" default="0" label="Display filter" description="Display the statistics filter on the Newsletter creation interface">
			<option value="0">JOOMEXT_NO</option>
			<option value="1">JOOMEXT_YES</option>
		</param>
	</params>
	<config>
		<fields name="params" addfieldpath="/components/com_acymailing/params">
			<fieldset name="basic">
				<field name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-stats"/>
				<field name="picture" type="text" size="60" label="Stat picture" default="media/com_acymailing/images/statpicture.png" description="Path of the statistic picture"/>
				<field name="alttext" type="text" size="60" default="" label="Alt Text" description="Alternatif text which will be displayed if the user does not accept to load your images" />
				<field name="width" type="text" size="2" default="50" label="Stat picture width" description="An image will be added in your HTML e-mails to be able to handle statistics. You can modify the width of the stat picture." />
				<field name="height" type="text" size="2" default="1" label="Stat picture height" description="An image will be added in your HTML e-mails to be able to handle statistics. You can modify the height of the stat picture." />
				<field name="displayfilter_mail" type="radio" default="0" label="Display filter" description="Display the statistics filter on the Newsletter creation interface">
					<option value="0">JOOMEXT_NO</option>
					<option value="1">JOOMEXT_YES</option>
				</field>
			</fieldset>
		</fields>
	</config>
</install>
components/com_acymailing/extensions/plg_acymailing_stats/index.html000060400000000054152453623450022301 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_system_jceacymailing/index.html000060400000000054152453623450023151 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_system_jceacymailing/jceacymailing.xml000060400000001346152453623450024502 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/plugin-install.dtd">
<install type="plugin" version="1.5" method="upgrade" group="system">
	<name>AcyMailing JCE integration</name>
	<creationDate>March 2018</creationDate>
	<version>5.9.6</version>
	<author>Acyba</author>
	<authorEmail>dev@acyba.com</authorEmail>
	<authorUrl>http://www.acyba.com</authorUrl>
	<copyright>Copyright (C) 2009-2018 ACYBA SAS - All rights reserved..</copyright>
	<license>GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html</license>
	<description>This plugin enables you to use the JCE editor with AcyMailing</description>
	<files>
		<filename plugin="jceacymailing">jceacymailing.php</filename>
	</files>
</install>
components/com_acymailing/extensions/plg_system_jceacymailing/jceacymailing.php000060400000001041152453623450024461 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class plgSystemJceacymailing extends JPlugin{
	function onBeforeWfEditorRender(&$settings) {
		if(empty($_REQUEST['option']) || $_REQUEST['option'] != 'com_acymailing') return;

		if(!empty($_REQUEST['acycssfile'])) $settings['content_css'] = $_REQUEST['acycssfile'];
	}
}
components/com_acymailing/extensions/plg_acymailing_online/index.html000060400000000054152453623450022427 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_acymailing_online/online.xml000060400000010456152453623450022447 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/plugin-install.dtd">
<install type="plugin" version="1.5" method="upgrade" group="acymailing">
	<name>AcyMailing Tag : Website links</name>
	<creationDate>September 2009</creationDate>
	<version>3.7.0</version>
	<author>Acyba</author>
	<authorEmail>dev@acyba.com</authorEmail>
	<authorUrl>http://www.acyba.com</authorUrl>
	<copyright>Copyright (C) 2009-2018 ACYBA SAS - All rights reserved..</copyright>
	<license>GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html</license>
	<description>This plugin enables you to add links in your Newsletter such as "read in your browser" or "forward to a friend"</description>
	<files>
		<filename plugin="online">online.php</filename>
	</files>
	<params addpath="/components/com_acymailing/params">
		<param name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-online"/>
		<param name="addkey" type="radio" default="yes" label="Add Newsletter key" description="Add the Newsletter key in the link so the online version will be always accessible from the link inserted in the Newsletter">
			<option value="yes">Yes</option>
			<option value="no">No</option>
		</param>
		<param name="adduserkey" type="radio" default="yes" label="Add User key" description="Add the user key in the link so the online version will contain the personal information as well">
			<option value="yes">Yes</option>
			<option value="no">No</option>
		</param>
		<param name="viewtemplate" type="radio" default="notemplate" label="Display the online version - DEPRECATED" description="This option is not useful any more, please use the option when inserting the tag instead">
			<option value="standard">Standard template</option>
			<option value="notemplate">No template</option>
		</param>
		<param name="forwardtemplate" type="radio" default="notemplate" label="Display the forward version - DEPRECATED" description="This option is not useful any more, please use the option when inserting the tag instead">
			<option value="standard">Standard template</option>
			<option value="notemplate">No template</option>
		</param>
		<param name="frontendaccess" type="list" default="all" label="Front-end Access" description="You can restrict the access to this tag system with this option">
			<option value="all">Always display this tag system</option>
			<option value="none">Don't display this tag system on the front-end</option>
		</param>
	</params>
	<config>
		<fields name="params" addfieldpath="/components/com_acymailing/params">
			<fieldset name="basic">
				<field name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-online"/>
				<field name="addkey" type="radio" default="yes" label="Add Newsletter key" description="Add the Newsletter key in the link so the online version will be always accessible from the link inserted in the Newsletter">
					<option value="yes">Yes</option>
					<option value="no">No</option>
				</field>
				<field name="adduserkey" type="radio" default="yes" label="Add User key" description="Add the user key in the link so the online version will contain the personal information as well">
					<option value="yes">Yes</option>
					<option value="no">No</option>
				</field>
				<field name="viewtemplate" type="radio" default="notemplate" label="Display the online version - DEPRECATED" description="This option is not useful any more, please use the option when inserting the tag instead">
					<option value="standard">Standard template</option>
					<option value="notemplate">No template</option>
				</field>
				<field name="forwardtemplate" type="radio" default="notemplate" label="Display the forward version - DEPRECATED" description="This option is not useful any more, please use the option when inserting the tag instead">
					<option value="standard">Standard template</option>
					<option value="notemplate">No template</option>
				</field>
				<field name="frontendaccess" type="list" default="all" label="Front-end Access" description="You can restrict the access to this tag system with this option">
					<option value="all">Always display this tag system</option>
					<option value="none">Don't display this tag system on the front-end</option>
				</field>
			</fieldset>
		</fields>
	</config>
</install>
components/com_acymailing/extensions/plg_acymailing_online/online.php000060400000013366152453623450022441 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class plgAcymailingOnline extends JPlugin{
	function __construct(&$subject, $config){
		parent::__construct($subject, $config);
		if(!isset($this->params)){
			$plugin = JPluginHelper::getPlugin('acymailing', 'online');
			$this->params = new acyParameter($plugin->params);
		}
	}

	function acymailing_getPluginType(){

		if($this->params->get('frontendaccess') == 'none' && !acymailing_isAdmin()) return;
		$onePlugin = new stdClass();
		$onePlugin->name = acymailing_translation('WEBSITE_LINKS');
		$onePlugin->function = 'acymailingtagonline_show';
		$onePlugin->help = 'plugin-online';

		return $onePlugin;
	}

	function acymailingtagonline_show(){

		$others = array();
		$config = acymailing_config();
		$others['readonline'] = array('default' => acymailing_translation('VIEW_ONLINE', true), 'desc' => acymailing_translation('VIEW_ONLINE_LINK'));
		if($config->get('forward', true)){
			$others['forward'] = array('default' => acymailing_translation('FORWARD_FRIEND', true), 'desc' => acymailing_translation('FORWARD_FRIEND_LINK'));
		}

		?>
		<script language="javascript" type="text/javascript">
			<!--
			var selectedTag = '';
			function changeTag(tagName){
				selectedTag = tagName;
				defaultText = new Array();
				<?php
								$k = 0;
								foreach($others as $tagname => $tag){
									echo "document.getElementById('tr_$tagname').className = 'row$k';";
									echo "defaultText['$tagname'] = '".$tag['default']."';";
								}
								$k = 1-$k;
				?>
				document.getElementById('tr_' + tagName).className = 'selectedrow';
				document.adminForm.tagtext.value = defaultText[tagName];
				setOnlineTag();
			}

			function setOnlineTag(){
				if(!selectedTag) changeTag('readonline');
				otherinfo = '';
				for(var i = 0; i < document.adminForm.template.length; i++){
					if(document.adminForm.template[i].checked){
						otherinfo += '|template:' + document.adminForm.template[i].value;
					}
				}
				setTag('<a href=' + '"{' + selectedTag + otherinfo + '}{/' + selectedTag + '}" target="_blank" style="text-decoration:none;"><span class="acymailing_online">' + document.adminForm.tagtext.value + '</span></a>');
			}
			//-->
		</script>
		<?php
		echo acymailing_translation('FIELD_TEXT').' : <input type="text" name="tagtext" size="100px" onchange="setOnlineTag();" /><br /><br />';
		$radios = array();
		$radios[] = acymailing_selectOption("standard", acymailing_translation('IN_TEMPLATE'));
		$radios[] = acymailing_selectOption("notemplate", acymailing_translation('WITHOUT_TEMPLATE'));
		echo acymailing_radio($radios, 'template', 'size="1" onclick="setOnlineTag();"', 'value', 'text', 'notemplate');
		echo '<div class="onelineblockoptions">
				<table class="acymailing_table" cellpadding="1">';
		$k = 0;
		foreach($others as $tagname => $tag){
			echo '<tr style="cursor:pointer" class="row'.$k.'" onclick="changeTag(\''.$tagname.'\');" id="tr_'.$tagname.'" ><td class="acytdcheckbox" ></td><td>'.$tag['desc'].'</td></tr>';
			$k = 1 - $k;
		}
		echo '</table></div>';
	}

	function acymailing_replacetags(&$email, $send = true){
		if(acymailing_getVar('none', 'task', '') == 'replacetags') return;

		$match = '#(?:{|%7B)(readonline|forward)([^}]*)(?:}|%7D)(.*)(?:{|%7B)/(readonline|forward)(?:}|%7D)#Uis';
		$variables = array('body', 'altbody');
		$found = false;
		$results = array();
		foreach($variables as $var){
			if(empty($email->$var)) continue;
			$found = preg_match_all($match, $email->$var, $results[$var]) || $found;
			if(empty($results[$var][0])) unset($results[$var]);
		}

		if(!$found) return;

		$config = acymailing_config();

		$tags = array();

		foreach($results as $var => $allresults){
			foreach($allresults[0] as $i => $oneTag){
				if(isset($tags[$oneTag])) continue;
				$arguments = explode('|', strip_tags(str_replace('%7C', '|', $allresults[2][$i])));
				$tag = new stdClass();
				$tag->type = $allresults[1][$i];
				$tag->template = ($tag->type == 'readonline') ? $this->params->get('viewtemplate', 'notemplate') : $this->params->get('forwardtemplate', 'notemplate');
				$tag->itemid = $config->get('itemid', 0);
				for($j = 0, $a = count($arguments); $j < $a; $j++){
					$args = explode(':', $arguments[$j]);
					$arg0 = trim($args[0]);
					if(empty($arg0)) continue;
					if(isset($args[1])){
						$tag->$arg0 = $args[1];
					}else{
						$tag->$arg0 = true;
					}
				}

				$addkey = (!empty($email->key) && $this->params->get('addkey', 'yes') == 'yes') ? '&key='.$email->key : '';
				$adduserkey = $this->params->get('adduserkey', 'yes') == 'yes' ? '&subid={subtag:subid}-{subtag:key}' : '';
				$tmpl = ($tag->template == 'notemplate') ? '&tmpl=component' : '';
				$item = empty($tag->itemid) ? '' : '&Itemid='.$tag->itemid;
				$lang = empty($email->language) ? '' : '&lang='.$email->language;

				if($tag->type == 'readonline'){
					$link = acymailing_frontendLink('index.php?option=com_acymailing&ctrl=archive&task=view&mailid='.$email->mailid.$addkey.$adduserkey.$tmpl.$item.$lang);
				}elseif($tag->type == 'forward'){
					$link = acymailing_frontendLink('index.php?option=com_acymailing&ctrl=archive&task=forward&mailid='.$email->mailid.$addkey.$adduserkey.$tmpl.$item.$lang);
				}

				if(empty($allresults[3][$i])){
					$tags[$oneTag] = $link;
				}else $tags[$oneTag] = '<a style="text-decoration:none;" href="'.$link.'"><span class="acymailing_online">'.$allresults[3][$i].'</span></a>';
			}
		}

		$email->body = str_replace(array_keys($tags), $tags, $email->body);
		if(!empty($email->altbody)) $email->altbody = str_replace(array_keys($tags), $tags, $email->altbody);
	}
}//endclass
components/com_acymailing/extensions/plg_acymailing_template/index.html000060400000000054152453623450022756 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_acymailing_template/template.xml000060400000002307152453623450023321 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/plugin-install.dtd">
<install type="plugin" version="1.5" method="upgrade" group="acymailing">
	<name>AcyMailing Template Class Replacer</name>
	<creationDate>March 2018</creationDate>
	<version>5.9.6</version>
	<author>Acyba</author>
	<authorEmail>dev@acyba.com</authorEmail>
	<authorUrl>http://www.acyba.com</authorUrl>
	<copyright>Copyright (C) 2009-2018 ACYBA SAS - All rights reserved.</copyright>
	<license>GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html</license>
	<description>This plugin enables AcyMailing to replace CSS class in each email</description>
	<files>
		<filename plugin="template">template.php</filename>
	</files>
	<params addpath="/components/com_acymailing/params">
		<param name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-template"/>
	</params>
	<config>
		<fields name="params" addfieldpath="/components/com_acymailing/params">
			<fieldset name="basic">
				<field name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-template"/>
			</fieldset>
		</fields>
	</config>
</install>
components/com_acymailing/extensions/plg_acymailing_template/template.php000060400000027114152453623450023313 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class plgAcymailingTemplate extends JPlugin{

	var $templates = array();
	var $tags = array();
	var $headerstyles = array();
	var $others = array();
	var $stylesheets = array();
	var $templateClass = '';
	var $config;

	function __construct(&$subject, $config){
		parent::__construct($subject, $config);
		if(!isset($this->params)){
			$plugin = JPluginHelper::getPlugin('acymailing', 'template');
			$this->params = new acyParameter($plugin->params);
		}
		$this->config = acymailing_config();
		if(version_compare(PHP_VERSION, '5.0.0', '>=') && class_exists('DOMDocument') && function_exists('mb_convert_encoding')){
			require_once(ACYMAILING_FRONT.'inc'.DS.'emogrifier'.DS.'emogrifier.php');
		}
	}

	private function _applyTemplate(&$email, $addbody){
		if(empty($email->tempid)) return;

		if(!isset($this->templates[$email->tempid])){
			$this->headerstyles[$email->tempid] = array();
			$this->headerstyles[$email->tempid][] = '.ReadMsgBody{width: 100%;}';
			$this->headerstyles[$email->tempid][] = '.ExternalClass{width: 100%;}';
			$this->headerstyles[$email->tempid][] = 'div, p, a, li, td { -webkit-text-size-adjust:none; }';
			$this->headerstyles[$email->tempid][] = 'a[x-apple-data-detectors]{
			color: inherit !important;
			text-decoration: inherit !important;
			font-size: inherit !important;
			font-family: inherit !important;
			font-weight: inherit !important;
			line-height: inherit !important;
			}';

			$this->templates[$email->tempid] = array();
			if(empty($this->templateClass)){
				$this->templateClass = acymailing_get('class.template');
			}
			if(!empty($email->template) && $email->tempid == $email->template->tempid){
				$template = $email->template;
			}else{
				$template = $email->template = $this->templateClass->get($email->tempid);
			}

			if(!empty($template->styles) OR !empty($template->stylesheet)){
				$this->stylesheets[$email->tempid] = $this->templateClass->buildCSS($template->styles, $template->stylesheet);

				if(preg_match_all('#@import[^;]*;#is', $this->stylesheets[$email->tempid], $results)){
					foreach($results[0] as $oneResult){
						array_unshift($this->headerstyles[$email->tempid], trim($oneResult));
					}
				}

				if(preg_match_all('#@media.*}[^{}]*}#Uis', $this->stylesheets[$email->tempid], $results)){

					foreach($results[0] as $oneResult){
						$this->stylesheets[$email->tempid] = str_replace($oneResult, '', $this->stylesheets[$email->tempid]);
						$this->headerstyles[$email->tempid][] = trim($oneResult);
					}
				}

				if(preg_match_all('#}([^}]+:hover[^{]*{[^{]*})#Uis', '} '.$this->stylesheets[$email->tempid], $results)){
					foreach($results[1] as $oneResult){
						$this->stylesheets[$email->tempid] = str_replace($oneResult, '', $this->stylesheets[$email->tempid]);
						$this->headerstyles[$email->tempid][] = trim($oneResult);
					}
				}
			}


			if(!empty($template->styles)){
				foreach($template->styles as $class => $style){
					if(empty($style)) continue;
					if(preg_match('#^tag_(.*)$#', $class, $result)){
						$this->tags[$email->tempid]['#< *'.$result[1].'((?:(?!style).)*)>#Ui'] = '<'.$result[1].' style="'.$style.'" $1>';
						if(strpos($style, '!important')) $this->headerstyles[$email->tempid][] = $result[1].'{ '.str_replace('!important', '', $style).' }';
					}elseif($class == 'color_bg'){
						$this->others[$email->tempid][$class] = $style;
					}else{
						$this->templates[$email->tempid]['class="'.$class.'"'] = 'style="'.$style.'"';
					}
				}
				if(!empty($template->styles['tag_a'])){
					$this->headerstyles[$email->tempid][] = 'a:visited{'.$template->styles['tag_a'].'}';
				}
			}
		}

		if($addbody AND !strpos($email->body, '</body>')){
			$before = '<html><head>'."\n";
			if(!empty($template->header)) $before .= $template->header."\n";
			$before .= '<meta http-equiv="Content-Type" content="text/html; charset='.strtolower($this->config->get('charset')).'" />'."\n";
			$before .= '<meta name="viewport" content="width=device-width, initial-scale=1.0" />'."\n";
			$before .= '<title>'.$email->subject.'</title>'."\n";
			if(!empty($this->headerstyles[$email->tempid])){
				$before .= '<style type="text/css">'."\n";
				$before .= implode("\n", $this->headerstyles[$email->tempid])."\n";
				$before .= '</style>'."\n";
			}
			$before .= '</head>'."\n".'<body yahoo="fix"';
			if(!empty($this->others[$email->tempid]['color_bg'])) $before .= ' bgcolor="'.$this->others[$email->tempid]['color_bg'].'" ';
			$before .= '>'."\n";
			$email->body = $before.$email->body.'</body>'."\n".'</html>';
		}

		if(!empty($this->stylesheets[$email->tempid]) AND class_exists('acymailingEmogrifier')){
			$emogrifier = new acymailingEmogrifier($email->body, $this->stylesheets[$email->tempid]);
			$email->body = $emogrifier->emogrify();

			if(!$addbody AND strpos($email->body, '<!DOCTYPE') !== false){
				$email->body = preg_replace('#<\!DOCTYPE.*<body([^>]*)>#Usi', '', $email->body);
				$email->body = preg_replace('#</body>.*$#si', '', $email->body);
			}
		}else{
			if(!empty($this->templates[$email->tempid])){
				$email->body = str_replace(array_keys($this->templates[$email->tempid]), $this->templates[$email->tempid], $email->body);
			}

			if(!empty($this->tags[$email->tempid])){
				$email->body = preg_replace(array_keys($this->tags[$email->tempid]), $this->tags[$email->tempid], $email->body);
			}
		}

		$newbody = preg_replace('#(<(div|tr|td|table)[^>]*)title="[^"]*"#Uis', '$1', $email->body);
		if(!empty($newbody)) $email->body = $newbody;

		$newbody = preg_replace('# id="zone_[0-9]+"#Uis', ' ', $email->body);
		if(!empty($newbody)) $email->body = $newbody;

		$newbody = preg_replace('# *(acyeditor_text|acyeditor_picture|acyeditor_delete|acyeditor_sortable|ui-sortable) *#is', '', $email->body);
		$newbody = preg_replace('#(class|title|style|id)=" *"#Ui', '', $newbody);
		if(!empty($newbody)) $email->body = $newbody;
	}

	public function acymailing_replaceusertags(&$email, &$user, $send = true){

		if(!$email->sendHTML) return;

		if((!acymailing_level(1) || acymailing_level(4)) && !empty($email->type) && in_array($email->type, array('news', 'followup'))){
			$pict = '<div style="text-align:center;margin:10px auto;display:block;"><a target="_blank" href="https://www.acyba.com/?utm_source=acymailing&utm_medium=e-mail&utm_content=img&utm_campaign=powered-by"><img alt="Powered by AcyMailing" src="media/com_acymailing/images/poweredby.png" /></a></div>';

			if(strpos($email->body, '</body>')){
				$email->body = str_replace('</body>', $pict.'</body>', $email->body);
			}else{
				$email->body .= $pict;
			}
		}

		$this->_applyTemplate($email, $send);

		$email->body = preg_replace('#< *(tr|td|table)([^>]*)(style="[^"]*)background-image *: *url\(\'?([^)\']*)\'?\);?#Ui', '<$1 background="$4" $2 $3', $email->body);
		$email->body = acymailing_absoluteURL($email->body);

		if(preg_match_all('#< *img([^>]*)>#Ui', $email->body, $allPictures)){

			foreach($allPictures[0] as $i => $onePict){
				if(strpos($onePict, 'align=') !== false) continue;
				if(!preg_match('#(style="[^"]*)(float *: *)(right|left|top|bottom|middle)#Ui', $onePict, $pictParams)) continue;

				$newPict = str_replace('<img', '<img align="'.$pictParams[3].'" ', $onePict);

				$email->body = str_replace($onePict, $newPict, $email->body);

				if(strpos($onePict, 'hspace=') !== false) continue;

				$hspace = 5;
				if(preg_match('#margin(-right|-left)? *:([^";]*)#i', $onePict, $margins)){
					$currentMargins = explode(' ', trim($margins[2]));
					$myMargin = (count($currentMargins) > 1) ? $currentMargins[1] : $currentMargins[0];
					if(strpos($myMargin, 'px') !== false) $hspace = preg_replace('#[^0-9]#i', '', $myMargin);
				}

				$lastPict = str_replace('<img', '<img hspace="'.$hspace.'" ', $newPict);

				$email->body = str_replace($newPict, $lastPict, $email->body);
			}
		}

		if(!preg_match('#(<thead|<tfoot|< *tbody *[^> ]+ *>)#Ui', $email->body)){
			$email->body = preg_replace('#< *\/? *tbody *>#Ui', '', $email->body);
		}

		$email->body = preg_replace_callback('/src="([^"]* [^"]*)"/Ui', array($this, '_convertSpaces'), $email->body);

		$this->fixPictureSize($email->body);

		$acypluginsHelper = acymailing_get('helper.acyplugins');
		$acypluginsHelper->fixPictureDim($email->body);
	}//endfct

	public function acymailing_replacetags(&$email, $send = true){
		$this->linksSEF($email);
		$this->checkThumbnailYoutube($email);
	}

	public function linksSEF(&$email){
		$results = array();
		$altresults = array();
		$found = preg_match_all('#(?:{|%7B)acyfrontsef(?:}|%7D)(.*)(?:{|%7B)/acyfrontsef(?:}|%7D)#Uis', $email->body, $results);
		$found = preg_match_all('#(?:{|%7B)acyfrontsef(?:}|%7D)(.*)(?:{|%7B)/acyfrontsef(?:}|%7D)#Uis', $email->altbody, $altresults) || $found;

		if(!$found) return;

		$results[0] = array_merge($results[0], $altresults[0]);
		$results[1] = array_merge($results[1], $altresults[1]);

		$clearesults = array(0 => array(), 1 => array());
		foreach($results[0] as $i => $val){
			if(in_array($val, $clearesults[0])) continue;
			$clearesults[0][] = $val;
			$clearesults[1][] = $results[1][$i];
		}
		$results = $clearesults;

		$urls = '';
		$i = 0;
		$passedResults = array(0 => array(), 1 => array());
		foreach($results[1] as $key => $link){
			$urls .= '&urls['.$i.']='.base64_encode($link);
			$passedResults[0][] = $results[0][$key];
			$passedResults[1][] = $link;
			$i++;

			if($i > 40){
				$this->_callFrontURL($email, $urls, $passedResults);
				$passedResults = array(0 => array(), 1 => array());
				$urls = '';
				$i = 0;
			}
		}

		if(!empty($urls)) $this->_callFrontURL($email, $urls, $passedResults);
	}

	private function _callFrontURL(&$email, $urls, $results){
		$sefLinks = acymailing_fileGetContent(acymailing_rootURI().'index.php?option=com_acymailing&ctrl=url&task=sef'.$urls);
		$newLinks = json_decode($sefLinks, true);

		if($newLinks == null){
			if(!empty($sefLinks) && defined('JDEBUG') && JDEBUG) acymailing_enqueueMessage('Error trying to get the sef links: '.$sefLinks);

			$newLinks = array();
			foreach($results[1] as $link){
				$key = $link;
				$link = ltrim($link, '/');
				$mainurl = acymailing_mainURL($link);
				$newLinks[$key] = $mainurl.$link;
			}
		}
		$replacement = array();
		if(empty($newLinks)) return;

		foreach($results[1] as $key => $origin){
			$replacement[$results[0][$key]] = $newLinks[$results[1][$key]];
		}

		$email->body = str_replace(array_keys($replacement), $replacement, $email->body);
		$email->altbody = str_replace(array_keys($replacement), $replacement, $email->altbody);
	}

	public function _convertSpaces($matches){
		return "src='".str_replace(' ', '%20', $matches[1])."'";
	}

	private function fixPictureSize(&$body){
		if(!preg_match_all('#(<img)([^>]*>)#i', $body, $results)) return;

		$replace = array();
		$widthheight = array('width', 'height');
		foreach($results[0] as $num => $oneResult){
			$add = array();
			foreach($widthheight as $whword){
				if(preg_match('#'.$whword.' *=#i', $oneResult) || !preg_match('#[^a-z_\-]'.$whword.' *:([0-9 ]{1,8})px#i', $oneResult, $resultWH)) continue;

				if(empty($resultWH[1])) continue;
				$add[] = $whword.'="'.trim($resultWH[1]).'" ';
			}
			if(!empty($add)) $replace[$oneResult] = '<img '.implode(' ', $add).$results[2][$num];
		}

		if(empty($replace)) return;

		$body = str_replace(array_keys($replace), $replace, $body);
	}

	function checkThumbnailYoutube(&$mail){
		$acypluginsHelper = acymailing_get('helper.acyplugins');
		$mail->body = $acypluginsHelper->replaceVideos($mail->body);
	}
}//endclass
components/com_acymailing/extensions/plg_acymailing_tagcontent/index.html000060400000000054152453623450023311 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_acymailing_tagcontent/tagcontent.xml000060400000020355152453623450024212 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/plugin-install.dtd">
<install type="plugin" version="1.5" method="upgrade" group="acymailing">
	<name>AcyMailing Tag : content insertion</name>
	<creationDate>September 2009</creationDate>
	<version>3.7.0</version>
	<author>Acyba</author>
	<authorEmail>dev@acyba.com</authorEmail>
	<authorUrl>http://www.acyba.com</authorUrl>
	<copyright>Copyright (C) 2009-2018 ACYBA SAS - All rights reserved..</copyright>
	<license>GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html</license>
	<description>This AcyMailing plugin enables you to include Joomla Articles in any e-mail sent by AcyMailing</description>
	<files>
		<filename plugin="tagcontent">tagcontent.php</filename>
		<filename>tagcontent.xml</filename>
	</files>
	<params addpath="/components/com_acymailing/params">
		<param name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-tagcontent"/>
		<param name="customtemplate" type="customtemplate" label="Custom template" description="Click on the Custom template button to create a custom layout that will override the default view" default="tagcontent"/>
		<param name="displayart" type="radio" default="all" label="Display articles" description="Select if you want to display all articles in the popup for article selection or only published articles">
			<option value="all">All articles</option>
			<option value="onlypub">Only published articles</option>
		</param>
		<param name="contentaccess" type="radio" default="registered" label="Content Access" description="If you use the automatic article insertion (via the categories tab), AcyMailing will only include articles having the selected access in your Newsletter">
			<option value="public">Public only</option>
			<option value="registered">Public and Registered</option>
			<option value="all">All</option>
		</param>
		<param name="frontendaccess" type="list" default="all" label="Front-end Access" description="Using AcyMailing Enterprise, you can restrict the access to this tag system">
			<option value="all">Display all articles</option>
			<option value="author">Display only author's articles</option>
			<option value="none">Don't display this tag system on the front-end</option>
		</param>
		<param name="metaselect" type="radio" default="0" label="Select articles by meta tags" description="Do you want to display an interface on the content category insertion to filter articles by meta tags? Meta tags must be separated by a comma.">
			<option value="0">JOOMEXT_NO</option>
			<option value="1">JOOMEXT_YES</option>
		</param>
		<param name="integration" type="radio" default="0" label="Act for another component" description="Some Joomla components use the content table to store their articles. This option enables you to make sure Acy will act for this third part component and not for the default Joomla content system" >
			<option value="0">Joomla content</option>
			<option value="jreviews">jReviews</option>
			<option value="flexicontent">FlexiContent</option>
			<option value="jaggyblog">JaggyBlog</option>
		</param>
		<param name="@spacer" type="spacer" default="" label="" description="" />
		<param name="default_type" type="radio" default="intro" label="DISPLAY" description="FIELD_DEFAULT">
			<option value="title">TITLE_ONLY</option>
			<option value="intro">INTRO_ONLY</option>
			<option value="text">FIELD_TEXT</option>
			<option value="full">FULL_TEXT</option>
		</param>
		<param name="wordwrap" type="text" size="10" default="0" label="Intro Word Wrapping" description="If you insert only the introduction and you didn't insert the read more link, AcyMailing will only load the first XX characters of your content. If you specify 0, AcyMailing won't wrap your content" />
		<param name="default_titlelink" type="radio" default="link" label="CLICKABLE_TITLE" description="FIELD_DEFAULT">
			<option value="link">JOOMEXT_YES</option>
			<option value="0">JOOMEXT_NO</option>
		</param>
		<param name="default_author" type="radio" default="0" label="AUTHOR_NAME" description="FIELD_DEFAULT">
			<option value="author">JOOMEXT_YES</option>
			<option value="0">JOOMEXT_NO</option>
		</param>
		<param name="default_pict" type="radio" default="1" label="DISPLAY_PICTURES" description="FIELD_DEFAULT">
			<option value="1">JOOMEXT_YES</option>
			<option value="resized">RESIZED</option>
			<option value="0">JOOMEXT_NO</option>
		</param>
		<param name="maxwidth" type="text" size="10" default="150" label="Max picture width" description="FIELD_DEFAULT" />
		<param name="maxheight" type="text" size="10" default="150" label="Max picture height" description="FIELD_DEFAULT" />

	</params>
	<config>
		<fields name="params" addfieldpath="/components/com_acymailing/params">
			<fieldset name="basic">
				<field name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-tagcontent"/>
				<field name="customtemplate" type="customtemplate" label="Custom template" description="Click on the Custom template button to create a custom layout that will override the default view" default="tagcontent"/>
				<field name="displayart" type="radio" default="all" label="Display articles" description="Select if you want to display all articles in the popup for article selection or only published articles">
					<option value="all">All articles</option>
					<option value="onlypub">Only published articles</option>
				</field>
				<field name="frontendaccess" type="list" default="all" label="Front-end Access" description="Using AcyMailing Enterprise, you can restrict the access to this tag system">
					<option value="all">Display all articles</option>
					<option value="author">Display only author's articles</option>
					<option value="none">Don't display this tag system on the front-end</option>
				</field>
				<field name="metaselect" type="radio" default="0" label="Select articles by meta tags" description="Do you want to display an interface on the content category insertion to filter articles by meta tags? Meta tags must be separated by a comma.">
					<option value="0">No</option>
					<option value="1">Yes</option>
				</field>
				<field name="integration" type="radio" default="0" label="Act for another component" description="Some Joomla components use the content table to store their articles. This option enables you to make sure Acy will act for this third part component and not for the default Joomla content system" >
					<option value="0">Joomla content</option>
					<option value="jreviews">jReviews</option>
					<option value="flexicontent">FlexiContent</option>
					<option value="jaggyblog">JaggyBlog</option>
				</field>
				<field name="@spacer" type="spacer" default="" label="" description="" />
				<field name="default_type" type="radio" default="intro" label="DISPLAY" description="FIELD_DEFAULT">
					<option value="title">TITLE_ONLY</option>
					<option value="intro">INTRO_ONLY</option>
					<option value="text">FIELD_TEXT</option>
					<option value="full">FULL_TEXT</option>
				</field>
				<field name="wordwrap" type="text" size="10" default="0" label="Intro Word Wrapping" description="If you insert only the introduction and you didn't insert the read more link, AcyMailing will only load the first XX characters of your content. If you specify 0, AcyMailing won't wrap your content" />
				<field name="default_titlelink" type="radio" default="link" label="CLICKABLE_TITLE" description="FIELD_DEFAULT">
					<option value="link">JOOMEXT_YES</option>
					<option value="0">JOOMEXT_NO</option>
				</field>
				<field name="default_author" type="radio" default="" label="AUTHOR_NAME" description="FIELD_DEFAULT">
					<option value="author">JOOMEXT_YES</option>
					<option value="">JOOMEXT_NO</option>
				</field>
				<field name="default_pict" type="radio" default="1" label="DISPLAY_PICTURES" description="FIELD_DEFAULT">
					<option value="1">JOOMEXT_YES</option>
					<option value="resized">RESIZED</option>
					<option value="0">JOOMEXT_NO</option>
				</field>
				<field name="maxwidth" type="text" size="10" default="150" label="Max picture width" description="FIELD_DEFAULT" />
				<field name="maxheight" type="text" size="10" default="150" label="Max picture height" description="FIELD_DEFAULT" />
			</fieldset>
		</fields>
	</config>
</install>

components/com_acymailing/extensions/plg_acymailing_tagcontent/tagcontent.php000060400000211076152453623450024203 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php defined('_JEXEC') or die('Restricted access'); ?>
<?php

class plgAcymailingTagcontent extends JPlugin{
	public function __construct(&$subject, $config){
		parent::__construct($subject, $config);
		if(!isset($this->params)){
			$plugin = JPluginHelper::getPlugin('acymailing', 'tagcontent');
			$this->params = new acyParameter($plugin->params);
		}
		$this->acypluginsHelper = acymailing_get('helper.acyplugins');
		$tables = acymailing_getTableList();
		$this->newMulticats = in_array(acymailing_getPrefix().'content_multicats', $tables);
	}

	public function acymailing_getPluginType(){
		if($this->params->get('frontendaccess') == 'none' && !acymailing_isAdmin()) return;

		$onePlugin = new stdClass();
		$onePlugin->name = acymailing_translation('JOOMLA_CONTENT');
		$onePlugin->function = 'acymailingtagcontent_show';
		$onePlugin->help = 'plugin-tagcontent';

		return $onePlugin;
	}

	public function acymailingtagcontent_show(){

		$pageInfo = new stdClass();
		$pageInfo->filter = new stdClass();
		$pageInfo->filter->order = new stdClass();
		$pageInfo->limit = new stdClass();
		$pageInfo->elements = new stdClass();
		
		acymailing_loadLanguageFile('com_content', JPATH_SITE);

		$paramBase = ACYMAILING_COMPONENT.'.tagcontent';
		$pageInfo->filter->order->value = acymailing_getUserVar($paramBase.".filter_order", 'filter_order', 'a.id', 'cmd');
		$pageInfo->filter->order->dir = acymailing_getUserVar($paramBase.".filter_order_Dir", 'filter_order_Dir', 'desc', 'word');
		if(strtolower($pageInfo->filter->order->dir) !== 'desc') $pageInfo->filter->order->dir = 'asc';
		$pageInfo->search = acymailing_getUserVar($paramBase.".search", 'search', '', 'string');
		$pageInfo->search = strtolower(trim($pageInfo->search));
		$pageInfo->filter_cat = acymailing_getUserVar($paramBase.".filter_cat", 'filter_cat', '', 'int');
		$pageInfo->contenttype = acymailing_getUserVar($paramBase.".contenttype", 'contenttype', $this->params->get('default_type', 'intro'), 'string');
		$pageInfo->author = acymailing_getUserVar($paramBase.".author", 'author', $this->params->get('default_author', '0'), 'string');
		$pageInfo->titlelink = acymailing_getUserVar($paramBase.".titlelink", 'titlelink', $this->params->get('default_titlelink', 'link'), 'string');
		$pageInfo->lang = acymailing_getUserVar($paramBase.".lang", 'lang', '', 'string');
		$pageInfo->pict = acymailing_getUserVar($paramBase.".pict", 'pict', $this->params->get('default_pict', 1), 'string');
		$pageInfo->pictheight = acymailing_getUserVar($paramBase.".pictheight", 'pictheight', $this->params->get('maxheight', 150), 'string');
		$pageInfo->pictwidth = acymailing_getUserVar($paramBase.".pictwidth", 'pictwidth', $this->params->get('maxwidth', 150), 'string');


		$pageInfo->limit->value = acymailing_getUserVar($paramBase.'.list_limit', 'limit', acymailing_getCMSConfig('list_limit'), 'int');
		$pageInfo->limit->start = acymailing_getUserVar($paramBase.'.limitstart', 'limitstart', 0, 'int');

		$picts = array();
		$picts[] = acymailing_selectOption("1", acymailing_translation('JOOMEXT_YES'));
		$pictureHelper = acymailing_get('helper.acypict');
		if($pictureHelper->available()) $picts[] = acymailing_selectOption("resized", acymailing_translation('RESIZED'));
		$picts[] = acymailing_selectOption("0", acymailing_translation('JOOMEXT_NO'));

		$contenttype = array();
		$contenttype[] = acymailing_selectOption("title", acymailing_translation('TITLE_ONLY'));
		$contenttype[] = acymailing_selectOption("intro", acymailing_translation('INTRO_ONLY'));
		$contenttype[] = acymailing_selectOption("text", acymailing_translation('FIELD_TEXT'));
		$contenttype[] = acymailing_selectOption("full", acymailing_translation('FULL_TEXT'));

		$titlelink = array();
		$titlelink[] = acymailing_selectOption("link", acymailing_translation('JOOMEXT_YES'));
		$titlelink[] = acymailing_selectOption("0", acymailing_translation('JOOMEXT_NO'));

		$authorname = array();
		$authorname[] = acymailing_selectOption("author", acymailing_translation('JOOMEXT_YES'));
		$authorname[] = acymailing_selectOption("0", acymailing_translation('JOOMEXT_NO'));

		$searchFields = array('a.id', 'a.title', 'a.alias', 'a.created_by', 'b.name', 'b.username');
		if(!empty($pageInfo->search)){
			$searchVal = '\'%'.acymailing_getEscaped($pageInfo->search, true).'%\'';
			$filters[] = implode(" LIKE $searchVal OR ", $searchFields)." LIKE $searchVal";
		}

		if(!empty($pageInfo->filter_cat)){
			$filters[] = "a.catid = ".$pageInfo->filter_cat;
		}

		if($this->params->get('displayart', 'all') == 'onlypub'){
			$filters[] = "a.state = 1";
		}else{
			$filters[] = "a.state != -2";
		}

		if(!acymailing_isAdmin()){
			$my = JFactory::getUser();

			if(!ACYMAILING_J16){
				$filters[] = 'a.`access` <= '.(int)$my->get('aid');
			}else{
				$groups = implode(',', $my->getAuthorisedViewLevels());
				$filters[] = 'a.`access` IN ('.$groups.')';
			}
		}

		if($this->params->get('frontendaccess') == 'author' && !acymailing_isAdmin()){
			$filters[] = "a.created_by = ".intval(acymailing_currentUserId());
		}

		$whereQuery = '';
		if(!empty($filters)){
			$whereQuery = ' WHERE ('.implode(') AND (', $filters).')';
		}

		$query = 'SELECT SQL_CALC_FOUND_ROWS a.*,b.name,b.username,a.created_by FROM '.acymailing_table('content', false).' as a';
		$query .= ' LEFT JOIN `#__users` AS b ON b.id = a.created_by';
		if(!empty($whereQuery)) $query .= $whereQuery;
		if(!empty($pageInfo->filter->order->value)){
			$query .= ' ORDER BY '.$pageInfo->filter->order->value.' '.$pageInfo->filter->order->dir;
		}

		$rows = acymailing_loadObjectList($query, '', $pageInfo->limit->start, $pageInfo->limit->value);

		if(!empty($pageInfo->search)){
			$rows = acymailing_search($pageInfo->search, $rows);
		}

		$pageInfo->elements->total = acymailing_loadResult('SELECT FOUND_ROWS()');
		$pageInfo->elements->page = count($rows);

		if(!ACYMAILING_J16){
			$query = 'SELECT a.id, a.id as catid, a.title as category, b.title as section, b.id as secid from #__categories as a ';
			$query .= 'INNER JOIN #__sections as b on a.section = b.id ORDER BY b.ordering,a.ordering';

			$categories = acymailing_loadObjectList($query, 'id');
			$categoriesValues = array();
			$categoriesValues[] = acymailing_selectOption('', acymailing_translation('ACY_ALL'));
			$currentSec = '';
			foreach($categories as $catid => $oneCategorie){
				if($currentSec != $oneCategorie->section){
					if(!empty($currentSec)) $this->values[] = acymailing_selectOption('</OPTGROUP>');
					$categoriesValues[] = acymailing_selectOption('<OPTGROUP>', $oneCategorie->section);
					$currentSec = $oneCategorie->section;
				}
				$categoriesValues[] = acymailing_selectOption($catid, $oneCategorie->category);
			}
		}else{
			$query = "SELECT * from #__categories WHERE `extension` = 'com_content' ORDER BY lft ASC";

			$categories = acymailing_loadObjectList($query, 'id');
			$categoriesValues = array();
			$categoriesValues[] = acymailing_selectOption('', acymailing_translation('ACY_ALL'));
			foreach($categories as $catid => $oneCategorie){
				$categories[$catid]->title = str_repeat('- - ', $categories[$catid]->level).$categories[$catid]->title;
				$categoriesValues[] = acymailing_selectOption($catid, $categories[$catid]->title);
			}
		}

		$pagination = new acyPagination($pageInfo->elements->total, $pageInfo->limit->start, $pageInfo->limit->value);

		$tabs = acymailing_get('helper.acytabs');
		echo $tabs->startPane('joomlacontent_tab');
		echo $tabs->startPanel(acymailing_translation('JOOMLA_CONTENT'), 'joomlacontent_content');

		?>
		<script language="javascript" type="text/javascript">
			<!--
			var selectedContents = new Array();
			function applyContent(contentid, rowClass){
				var tmp = selectedContents.indexOf(contentid)
				if(tmp != -1){
					window.document.getElementById('content' + contentid).className = rowClass;
					delete selectedContents[tmp];
				}else{
					window.document.getElementById('content' + contentid).className = 'selectedrow';
					selectedContents.push(contentid);
				}
				updateTag();
			}

			function updateTag(){
				var tag = '';
				var otherinfo = '';
				for(var i = 0; i < document.adminForm.contenttype.length; i++){
					if(document.adminForm.contenttype[i].checked){
						selectedtype = document.adminForm.contenttype[i].value;
						otherinfo += '| type:' + document.adminForm.contenttype[i].value;
					}
				}

				if(document.adminForm.customfields){
					if(document.adminForm.customfields.length == undefined){
						if(document.adminForm.customfields.checked) otherinfo += "| custom:" + document.adminForm.customfields.value;
					}else{
						tmp = 0;
						for(i = 0; i < document.adminForm.customfields.length; i++){
							if(!document.adminForm.customfields[i].checked) continue;
							if(tmp == 0){
								tmp += 1;
								otherinfo += "| custom:" + document.adminForm.customfields[i].value;
							}else{
								otherinfo += "," + document.adminForm.customfields[i].value;
							}
						}
					}
				}

				for(var i = 0; i < document.adminForm.titlelink.length; i++){
					if(document.adminForm.titlelink[i].checked && document.adminForm.titlelink[i].value.length > 1){
						otherinfo += '| ' + document.adminForm.titlelink[i].value;
					}
				}

				var already = 0;
				if(document.adminForm.socialshare){
					for(var i = 0; i < document.adminForm.socialshare.length; i++){
						if(document.adminForm.socialshare[i].checked){
							if(already == 0){
								otherinfo += '| share:' + document.adminForm.socialshare[i].value;
								already++;
							}else{
								otherinfo += ',' + document.adminForm.socialshare[i].value;
							}
						}
					}
				}

				if(selectedtype != 'title'){
					for(var i = 0; i < document.adminForm.author.length; i++){
						if(document.adminForm.author[i].checked && document.adminForm.author[i].value.length > 1){
							otherinfo += '| ' + document.adminForm.author[i].value;
						}
					}
					for(var i = 0; i < document.adminForm.pict.length; i++){
						if(document.adminForm.pict[i].checked){
							otherinfo += '| pict:' + document.adminForm.pict[i].value;
							if(document.adminForm.pict[i].value == 'resized'){
								document.getElementById('pictsize').style.display = '';
								if(document.adminForm.pictwidth.value) otherinfo += '| maxwidth:' + document.adminForm.pictwidth.value;
								if(document.adminForm.pictheight.value) otherinfo += '| maxheight:' + document.adminForm.pictheight.value;
							}else{
								document.getElementById('pictsize').style.display = 'none';
							}
						}
					}
					document.getElementById('format').style.display = '';
				}else{
					document.getElementById('format').style.display = 'none';
				}

				if(document.adminForm.contentformat && document.adminForm.contentformat.value){
					otherinfo += '| format:' + document.adminForm.contentformat.value;
				}

				if(window.document.getElementById('jflang') && window.document.getElementById('jflang').value != ''){
					otherinfo += '|lang:';
					otherinfo += window.document.getElementById('jflang').value;
				}

				for(var i in selectedContents){
					if(selectedContents[i] && !isNaN(i)){
						tag = tag + '{joomlacontent:' + selectedContents[i] + otherinfo + '}<br />';
					}
				}
				setTag(tag);
			}
			//-->
		</script>
		<div class="onelineblockoptions">
			<table width="100%" class="acymailing_table">
				<tr>
					<td>
						<?php echo acymailing_translation('DISPLAY'); ?>
					</td>
					<td colspan="2">
						<?php echo acymailing_radio($contenttype, 'contenttype', 'size="1" onclick="updateTag();"', 'value', 'text', $pageInfo->contenttype); ?>
					</td>
					<td>
						<?php $jflanguages = acymailing_get('type.jflanguages');
						$jflanguages->onclick = 'onchange="updateTag();"';
						echo $jflanguages->display('lang', $pageInfo->lang); ?>
					</td>
				</tr>
				<tr id="format" class="acyplugformat">
					<td valign="top">
						<?php echo acymailing_translation('FORMAT'); ?>
					</td>
					<td valign="top">
						<?php echo $this->acypluginsHelper->getFormatOption('tagcontent'); ?>
					</td>
					<td valign="top"><?php echo acymailing_translation('DISPLAY_PICTURES'); ?></td>
					<td valign="top"><?php echo acymailing_radio($picts, 'pict', 'size="1" onclick="updateTag();"', 'value', 'text', $pageInfo->pict); ?>
						<span id="pictsize" <?php if($pageInfo->pict != 'resized') echo 'style="display:none;"'; ?>><br/><?php echo acymailing_translation('CAPTCHA_WIDTH') ?>
							<input name="pictwidth" type="text" onchange="updateTag();" value="<?php echo $pageInfo->pictwidth; ?>" style="width:30px;"/>
							x <?php echo acymailing_translation('CAPTCHA_HEIGHT') ?>
							<input name="pictheight" type="text" onchange="updateTag();" value="<?php echo $pageInfo->pictheight; ?>" style="width:30px;"/>
						</span>
					</td>
				</tr>
				<tr>
					<td>
						<?php echo acymailing_translation('CLICKABLE_TITLE'); ?>
					</td>
					<td>
						<?php echo acymailing_radio($titlelink, 'titlelink', 'size="1" onclick="updateTag();"', 'value', 'text', $pageInfo->titlelink); ?>
					</td>
					<td>
						<?php echo acymailing_translation('AUTHOR_NAME'); ?>
					</td>
					<td>
						<?php echo acymailing_radio($authorname, 'author', 'size="1" onclick="updateTag();"', 'value', 'text', (string)$pageInfo->author); ?>
					</td>
				</tr>
				<tr>
					<td>
						<?php echo acymailing_translation('SHARE'); ?>
					</td>
				<?php
				$socialMedias = array('facebook' => 'Facebook',
									'linkedin' => 'LinkedIn',
									'twitter' => 'Twitter',
									'google' => 'Google+');

				$cpt = 1;
				foreach($socialMedias as $key => $oneSocial){
					if($cpt == 4){
						$cpt = 1;
						echo '</tr><tr><td/>';
					}
					echo '<td><input value="'.$key.'" name="socialshare" id="'.$key.'" type="checkbox" onclick="updateTag();" /> ';
					echo '<label for="'.$key.'">'.$oneSocial.'</label></td>';
					$cpt++;
				}
				while($cpt != 4){
					$cpt++;
					echo '<td/>';
				}
				?>
				</tr>
			</table>
<?php
		$jversion = preg_replace('#[^0-9\.]#i', '', JVERSION);
		if(version_compare($jversion, '3.7.0', '>=')){
			$query = 'SELECT id, title, group_id FROM #__fields WHERE context = "com_content.article" AND state = 1 ORDER BY title ASC';
			$customFields = acymailing_loadObjectList($query);

			if(!empty($customFields)){
				$query = 'SELECT id, title FROM #__fields_groups WHERE context = "com_content.article" AND state = 1 ORDER BY title ASC';
				$groups = acymailing_loadObjectList($query);
				$defaultGroup = new stdClass();
				$defaultGroup->id = 0;
				$defaultGroup->title = acymailing_translation('ACY_NO_GROUP');
				array_unshift($groups, $defaultGroup);

				echo '<div class="onelineblockoptions">
						<span class="acyblocktitle">'.acymailing_translation('EXTRA_FIELDS').'</span>
						<table class="acymailing_table" cellpadding="1">';
				foreach($groups as $oneGroup){
					echo '<tr><td style="font-weight: bold;">'.$oneGroup->title.'</td>';
					$i = 1;
					foreach($customFields as $oneCF){
						if($oneCF->group_id != $oneGroup->id) continue;
						if($i == 4){
							$i = 1;
							echo '</tr><tr><td/>';
						}
						echo '<td><input value="'.$oneCF->id.'" name="customfields" id="cf_'.$oneCF->id.'" type="checkbox" onclick="updateTag();"/>';
						echo '<label style="margin-left:5px" for="cf_'.$oneCF->id.'">'.$oneCF->title.'</label></td>';
						$i++;
					}
					while($i != 4){
						$i++;
						echo '<td/>';
					}
					echo '</tr>';
				}
				echo '</table></div>';
			}
		}
?>
		</div>
		<div class="onelineblockoptions">
			<table class="acymailing_table_options">
				<tr>
					<td width="100%">
						<?php acymailing_listingsearch($pageInfo->search); ?>
					</td>
					<td nowrap="nowrap">
						<?php echo acymailing_select($categoriesValues, 'filter_cat', 'class="inputbox" size="1" onchange="document.adminForm.submit( );"', 'value', 'text', (int)$pageInfo->filter_cat); ?>
					</td>
				</tr>
			</table>

			<table class="acymailing_table" cellpadding="1" width="100%">
				<thead>
				<tr>
					<th class="title">
					</th>
					<th class="title">
						<?php echo acymailing_gridSort(acymailing_translation('FIELD_TITLE'), 'a.title', $pageInfo->filter->order->dir, $pageInfo->filter->order->value); ?>
					</th>
					<th class="title">
						<?php echo acymailing_gridSort(acymailing_translation('ACY_AUTHOR'), 'b.name', $pageInfo->filter->order->dir, $pageInfo->filter->order->value); ?>
					</th>
					<th class="title">
						<?php echo acymailing_gridSort(acymailing_translation(ACYMAILING_J16 ? 'COM_CONTENT_PUBLISHED_DATE' : 'START PUBLISHING'), 'a.publish_up', $pageInfo->filter->order->dir, $pageInfo->filter->order->value); ?>
					</th>
					<th class="title">
						<?php echo acymailing_gridSort(acymailing_translation('ACY_CREATED'), 'a.created', $pageInfo->filter->order->dir, $pageInfo->filter->order->value); ?>
					</th>
					<th class="title titleid">
						<?php echo acymailing_gridSort(acymailing_translation('ACY_ID'), 'a.id', $pageInfo->filter->order->dir, $pageInfo->filter->order->value); ?>
					</th>
				</tr>
				</thead>
				<tfoot>
				<tr>
					<td colspan="6">
						<?php echo $pagination->getListFooter(); ?>
						<?php echo $pagination->getResultsCounter(); ?>
					</td>
				</tr>
				</tfoot>
				<tbody>
				<?php
				$k = 0;
				for($i = 0, $a = count($rows); $i < $a; $i++){
					$row =& $rows[$i];
					?>
					<tr id="content<?php echo $row->id ?>" class="<?php echo "row$k"; ?>" onclick="applyContent(<?php echo $row->id.",'row$k'" ?>);" style="cursor:pointer;">
						<td class="acytdcheckbox"></td>
						<td>
							<?php
							$text = '<b>'.acymailing_translation('JOOMEXT_ALIAS').': </b>'.$row->alias;
							echo acymailing_tooltip($text, $row->title, '', $row->title);
							?>
						</td>
						<td>
							<?php
							if(!empty($row->name)){
								$text = '<b>'.acymailing_translation('JOOMEXT_NAME').' : </b>'.$row->name;
								$text .= '<br /><b>'.acymailing_translation('ACY_USERNAME').' : </b>'.$row->username;
								$text .= '<br /><b>'.acymailing_translation('ACY_ID').' : </b>'.$row->created_by;
								echo acymailing_tooltip($text, $row->name, '', $row->name);
							}
							?>
						</td>
						<td align="center">
							<?php echo acymailing_date(strip_tags($row->publish_up), acymailing_translation('DATE_FORMAT_LC4')); ?>
						</td>
						<td align="center">
							<?php echo acymailing_date(strip_tags($row->created), acymailing_translation('DATE_FORMAT_LC4')); ?>
						</td>
						<td align="center">
							<?php echo $row->id; ?>
						</td>
					</tr>
					<?php
					$k = 1 - $k;
				}
				?>
				</tbody>
			</table>
		</div>
		<input type="hidden" name="boxchecked" value="0"/>
		<input type="hidden" name="filter_order" value="<?php echo $pageInfo->filter->order->value; ?>"/>
		<input type="hidden" name="filter_order_Dir" value="<?php echo $pageInfo->filter->order->dir; ?>"/>
		<?php
		echo $tabs->endPanel();
		echo $tabs->startPanel(acymailing_translation('TAG_CATEGORIES'), 'joomlacontent_auto');

		$type = acymailing_getVar('string', 'type');

		?>
		<script language="javascript" type="text/javascript">
			<!--
			window.onload = function(){
				if(window.document.getElementById('tagsauto')){
					window.document.getElementById('tagsauto').onchange = updateAutoTag;
				}
			}
			var selectedCategories = new Array();
			<?php if(!ACYMAILING_J16){ ?>
			function applyAutoContent(secid, catid, rowClass){
				if(selectedCategories[secid] && selectedCategories[secid][catid]){
					window.document.getElementById('content_sec' + secid + '_cat' + catid).className = rowClass;
					delete selectedCategories[secid][catid];
				}else{
					if(!selectedCategories[secid]) selectedCategories[secid] = new Array();
					if(secid == 0){
						for(var isec in selectedCategories){
							for(var icat in selectedCategories[isec]){
								if(selectedCategories[isec][icat] == 'content'){
									window.document.getElementById('content_sec' + isec + '_cat' + icat).className = 'row0';
									delete selectedCategories[isec][icat];
								}
							}
						}
					}else{
						if(selectedCategories[0] && selectedCategories[0][0]){
							window.document.getElementById('content_sec0_cat0').className = 'row0';
							delete selectedCategories[0][0];
						}

						if(catid == 0){
							for(var icat in selectedCategories[secid]){
								if(selectedCategories[secid][icat] == 'content'){
									window.document.getElementById('content_sec' + secid + '_cat' + icat).className = 'row0';
									delete selectedCategories[secid][icat];
								}
							}
						}else{
							if(selectedCategories[secid][0]){
								window.document.getElementById('content_sec' + secid + '_cat0').className = 'row0';
								delete selectedCategories[secid][0];
							}
						}
					}

					window.document.getElementById('content_sec' + secid + '_cat' + catid).className = 'selectedrow';
					selectedCategories[secid][catid] = 'content';
				}

				updateAutoTag();
			}
			<?php }else{ ?>
			function applyAutoContent(catid, rowClass){
				if(selectedCategories[catid]){
					window.document.getElementById('content_cat' + catid).className = rowClass;
					delete selectedCategories[catid];
				}else{
					window.document.getElementById('content_cat' + catid).className = 'selectedrow';
					selectedCategories[catid] = 'content';
				}

				updateAutoTag();
			}
			<?php } ?>

			function updateAutoTag(){
				tag = '{autocontent:';
				<?php if(!ACYMAILING_J16){ ?>
				for(var isec in selectedCategories){
					for(var icat in selectedCategories[isec]){
						if(selectedCategories[isec][icat] == 'content'){
							if(icat != 0){
								tag += 'cat' + icat + '-';
							}else{
								tag += 'sec' + isec + '-';
							}
						}
					}
				}
				<?php }else{ ?>
				for(var icat in selectedCategories){
					if(selectedCategories[icat] == 'content'){
						tag += icat + '-';
					}
				}
				<?php } ?>

				var already = 0;
				if(document.adminForm.autosocialshare){
					for(var i = 0; i < document.adminForm.autosocialshare.length; i++){
						if(document.adminForm.autosocialshare[i].checked){
							if(already == 0){
								tag += '| share:' + document.adminForm.autosocialshare[i].value;
								already++;
							}else{
								tag += ',' + document.adminForm.autosocialshare[i].value;
							}
						}
					}
				}

				if(document.adminForm.min_article && document.adminForm.min_article.value && document.adminForm.min_article.value != 0){
					tag += '| min:' + document.adminForm.min_article.value;
				}
				if(document.adminForm.max_article.value && document.adminForm.max_article.value != 0){
					tag += '| max:' + document.adminForm.max_article.value;
				}
				if(document.adminForm.contentorder.value){
					tag += "| order:" + document.adminForm.contentorder.value + "," + document.adminForm.contentorderdir.value;
				}
				if(document.adminForm.contentfilter && document.adminForm.contentfilter.value){
					tag += document.adminForm.contentfilter.value;
				}
				if(document.adminForm.meta_article && document.adminForm.meta_article.value){
					tag += '| meta:' + document.adminForm.meta_article.value;
				}

				for(var i = 0; i < document.adminForm.contenttypeauto.length; i++){
					if(document.adminForm.contenttypeauto[i].checked){
						selectedtype = document.adminForm.contenttypeauto[i].value;
						tag += '| type:' + document.adminForm.contenttypeauto[i].value;
					}
				}

				if(document.adminForm.customfieldsauto){
					if(document.adminForm.customfieldsauto.length == undefined){
						if(document.adminForm.customfieldsauto.checked) tag += "| custom:" + document.adminForm.customfieldsauto.value;
					}else{
						tmp = 0;
						for(i = 0; i < document.adminForm.customfieldsauto.length; i++){
							if(!document.adminForm.customfieldsauto[i].checked) continue;
							if(tmp == 0){
								tmp += 1;
								tag += "| custom:" + document.adminForm.customfieldsauto[i].value;
							}else{
								tag += "," + document.adminForm.customfieldsauto[i].value;
							}
						}
					}
				}

				for(var i = 0; i < document.adminForm.titlelinkauto.length; i++){
					if(document.adminForm.titlelinkauto[i].checked && document.adminForm.titlelinkauto[i].value.length > 1){
						tag += '|' + document.adminForm.titlelinkauto[i].value;
					}
				}
				if(selectedtype != 'title'){
					for(var i = 0; i < document.adminForm.authorauto.length; i++){
						if(document.adminForm.authorauto[i].checked && document.adminForm.authorauto[i].value.length > 1){
							tag += '|' + document.adminForm.authorauto[i].value;
						}
					}
					for(var i = 0; i < document.adminForm.pictauto.length; i++){
						if(document.adminForm.pictauto[i].checked){
							tag += '| pict:' + document.adminForm.pictauto[i].value;
							if(document.adminForm.pictauto[i].value == 'resized'){
								document.getElementById('pictsizeauto').style.display = '';
								if(document.adminForm.pictwidthauto.value) tag += '| maxwidth:' + document.adminForm.pictwidthauto.value;
								if(document.adminForm.pictheightauto.value) tag += '| maxheight:' + document.adminForm.pictheightauto.value;
							}else{
								document.getElementById('pictsizeauto').style.display = 'none';
							}
						}
					}
					document.getElementById('formatauto').style.display = '';
				}else{
					document.getElementById('formatauto').style.display = 'none';
				}

				if(document.getElementById('contentformatautoinvert').value == 1) tag += '| invert';
				if(document.adminForm.contentformatauto && document.adminForm.contentformatauto.value){
					tag += '| format:' + document.adminForm.contentformatauto.value;
				}

				if(document.adminForm.cols && document.adminForm.cols.value > 1){
					tag += '| cols:' + document.adminForm.cols.value;
				}
				if(window.document.getElementById('jflangauto') && window.document.getElementById('jflangauto').value != ''){
					tag += '| lang:' + window.document.getElementById('jflangauto').value;
				}
				if(window.document.getElementById('jlang') && window.document.getElementById('jlang').value != ''){
					tag += '| language:' + window.document.getElementById('jlang').value;
				}

				if(window.document.getElementById('tagsauto')){
					var tmp = 0;
					for(var i = 0; i < window.document.getElementById('tagsauto').length; i++){
						if(window.document.getElementById('tagsauto')[i].selected){
							if(tmp == 0){
								tag += '| tags:' + window.document.getElementById('tagsauto')[i].value;
								tmp = 1;
							}else{
								tag += ',' + window.document.getElementById('tagsauto')[i].value;
							}
						}
					}
				}

				tag += '}';

				setTag(tag);
			}
			//-->
		</script>
		<div class="onelineblockoptions">
			<table width="100%" class="acymailing_table">
				<tr>
					<td>
						<?php echo acymailing_translation('DISPLAY'); ?>
					</td>
					<td colspan="2">
						<?php echo acymailing_radio($contenttype, 'contenttypeauto', 'size="1" onclick="updateAutoTag();"', 'value', 'text', $this->params->get('default_type', 'intro')); ?>
					</td>
					<td id="languagesauto">
						<?php $jflanguages = acymailing_get('type.jflanguages');
						$jflanguages->onclick = 'onchange="updateAutoTag();"';
						$jflanguages->id = 'jflangauto';
						echo $jflanguages->display('langauto');
						if(empty($jflanguages->found)){
							echo $jflanguages->displayJLanguages('jlangauto');
						}
						?>
					</td>
				</tr>
				<tr id="formatauto" class="acyplugformat">
					<td valign="top">
						<?php echo acymailing_translation('FORMAT'); ?>
					</td>
					<td valign="top">
						<?php echo $this->acypluginsHelper->getFormatOption('tagcontent', 'TOP_LEFT', false, 'updateAutoTag'); ?>
					</td>
					<td valign="top"><?php echo acymailing_translation('DISPLAY_PICTURES'); ?></td>
					<td valign="top"><?php echo acymailing_radio($picts, 'pictauto', 'size="1" onclick="updateAutoTag();"', 'value', 'text', $this->params->get('default_pict', '1')); ?>
						<span id="pictsizeauto" <?php if($this->params->get('default_pict', '1') != 'resized') echo 'style="display:none;"'; ?> ><br/><?php echo acymailing_translation('CAPTCHA_WIDTH') ?>
							<input name="pictwidthauto" type="text" onchange="updateAutoTag();" value="<?php echo $this->params->get('maxwidth', '150'); ?>" style="width:30px;"/>
							x <?php echo acymailing_translation('CAPTCHA_HEIGHT') ?>
							<input name="pictheightauto" type="text" onchange="updateAutoTag();" value="<?php echo $this->params->get('maxheight', '150'); ?>" style="width:30px;"/>
						</span>
					</td>
				</tr>
				<tr>
					<td>
						<?php echo acymailing_translation('CLICKABLE_TITLE'); ?>
					</td>
					<td>
						<?php echo acymailing_radio($titlelink, 'titlelinkauto', 'size="1" onclick="updateAutoTag();"', 'value', 'text', $this->params->get('default_titlelink', 'link')); ?>
					</td>
					<td>
						<?php echo acymailing_translation('AUTHOR_NAME'); ?>
					</td>
					<td>
						<?php echo acymailing_radio($authorname, 'authorauto', 'size="1" onclick="updateAutoTag();"', 'value', 'text', (string)$this->params->get('default_author', '0')); ?>
					</td>
				</tr>
				<tr>
					<?php if(version_compare(JVERSION, '3.1.0', '>=')){ ?>
						<td valign="top">
							<?php echo acymailing_translation('TAGS'); ?>
						</td>
						<td>
							<?php
							$form = JForm::getInstance('acytagcontenttags', JPATH_SITE.DS.'components'.DS.'com_acymailing'.DS.'params'.DS.'tagcontenttags.xml');
							foreach($form->getFieldset('tagcontenttagfield') as $field){
								echo $field->input;
							}
							?>
						</td>
					<?php }else{ ?>
						<td colspan="2"></td>
					<?php } ?>
					<td valign="top"><?php echo acymailing_translation('FIELD_COLUMNS'); ?></td>
					<td valign="top">
						<select name="cols" style="width:150px" onchange="updateAutoTag();" size="1">
							<?php for($o = 1; $o < 11; $o++) echo '<option value="'.$o.'">'.$o.'</option>'; ?>
						</select>
					</td>
				</tr>
				<tr>
					<td>
						<?php echo acymailing_translation('MAX_ARTICLE'); ?>
					</td>
					<td>
						<input type="text" name="max_article" style="width:50px" value="20" onchange="updateAutoTag();"/>
					</td>
					<td>
						<?php echo acymailing_translation('ACY_ORDER'); ?>
					</td>
					<td>
						<?php
						$values = array('id' => 'ACY_ID', 'ordering' => 'ACY_ORDERING', 'created' => 'CREATED_DATE', 'modified' => 'MODIFIED_DATE', 'title' => 'FIELD_TITLE', 'hits' => 'ACY_HITS');
						if(ACYMAILING_J16) $values['publish_up'] = 'COM_CONTENT_PUBLISHED_DATE';
						echo $this->acypluginsHelper->getOrderingField($values, 'id', 'DESC', 'updateAutoTag');
						?>
					</td>
				</tr>
				<?php if($this->params->get('metaselect')){ ?>
					<tr>
						<td>
							<?php echo acymailing_translation('META_KEYWORDS'); ?>
						</td>
						<td colspan="3">
							<input type="text" name="meta_article" style="width:200px" value="" onchange="updateAutoTag();"/>
						</td>
					</tr>
				<?php } ?>
				<?php if($type == 'autonews'){ ?>
					<tr>
						<td>
							<?php echo acymailing_translation('MIN_ARTICLE'); ?>
						</td>
						<td>
							<input type="text" name="min_article" style="width:50px" value="1" onchange="updateAutoTag();"/>
						</td>
						<td>
							<?php echo acymailing_translation('JOOMEXT_FILTER'); ?>
						</td>
						<td>
							<?php $filter = acymailing_get('type.contentfilter');
							$filter->onclick = "updateAutoTag();";
							echo $filter->display('contentfilter', '|filter:created'); ?>
						</td>
					</tr>
				<?php } ?>
				<tr>
					<td>
						<?php echo acymailing_translation('SHARE'); ?>
					</td>
					<?php
					$cpt = 1;
					foreach($socialMedias as $key => $oneSocial){
						if($cpt == 4){
							$cpt = 1;
							echo '</tr><tr><td/>';
						}
						echo '<td><input value="'.$key.'" name="autosocialshare" id="auto'.$key.'" type="checkbox" onclick="updateAutoTag();" /> ';
						echo '<label for="auto'.$key.'">'.$oneSocial.'</label></td>';
						$cpt++;
					}
					while($cpt != 4){
						$cpt++;
						echo '<td/>';
					}
					?>
				</tr>
			</table>
<?php
		if(version_compare($jversion, '3.7.0', '>=') && !empty($customFields)){
			echo '<div class="onelineblockoptions">
					<span class="acyblocktitle">'.acymailing_translation('EXTRA_FIELDS').'</span>
					<table class="acymailing_table" cellpadding="1">';
			foreach($groups as $oneGroup){
				echo '<tr><td style="font-weight: bold;">'.$oneGroup->title.'</td>';
				$i = 1;
				foreach($customFields as $oneCF){
					if($oneCF->group_id != $oneGroup->id) continue;
					if($i == 4){
						$i = 1;
						echo '</tr><tr><td/>';
					}
					echo '<td><input value="'.$oneCF->id.'" name="customfieldsauto" id="autocf_'.$oneCF->id.'" type="checkbox" onclick="updateAutoTag();"/>';
					echo '<label style="margin-left:5px" for="autocf_'.$oneCF->id.'">'.$oneCF->title.'</label></td>';
					$i++;
				}
				while($i != 4){
					$i++;
					echo '<td/>';
				}
				echo '</tr>';
			}
			echo '</table></div>';
		}
?>
		</div>

		<div class="onelineblockoptions">
			<table class="acymailing_table" cellpadding="1" width="100%">
				<thead>
				<tr>
					<th class="title"></th>
					<?php if(!ACYMAILING_J16){ ?>
						<th class="title">
							<?php echo acymailing_translation('SECTION'); ?>
						</th>
					<?php } ?>
					<th class="title">
						<?php echo acymailing_translation('TAG_CATEGORIES'); ?>
					</th>
				</tr>
				</thead>
				<tbody>
				<?php
				$k = 0;
				if(!ACYMAILING_J16){
					?>
					<tr id="content_sec0_cat0" class="<?php echo "row$k"; ?>" onclick="applyAutoContent(0,0,'<?php echo "row$k" ?>');" style="cursor:pointer;">
						<td class="acytdcheckbox"></td>
						<td style="font-weight: bold;">
							<?php
							echo acymailing_translation('ACY_ALL');
							?>
						</td>
						<td style="text-align:center;font-weight: bold;">
							<?php
							echo acymailing_translation('ACY_ALL');
							?>
						</td>
					</tr>

					<?php
				}

				$k = 1 - $k;
				$currentSection = '';
				foreach($categories as $row){

					if(!ACYMAILING_J16 && $currentSection != $row->section){
						?>
						<tr id="content_sec<?php echo $row->secid ?>_cat0" class="<?php echo "row$k"; ?>" onclick="applyAutoContent(<?php echo $row->secid ?>,0,'<?php echo "row$k" ?>');" style="cursor:pointer;">
							<td class="acytdcheckbox"></td>
							<td style="font-weight: bold;">
								<?php
								echo $row->section;
								?>
							</td>
							<td style="text-align:center;font-weight: bold;">
								<?php
								echo acymailing_translation('ACY_ALL');
								?>
							</td>
						</tr>
						<?php
						$k = 1 - $k;
						$currentSection = $row->section;
					}
					if(!ACYMAILING_J16){
						?>
						<tr id="content_sec<?php echo $row->secid ?>_cat<?php echo $row->catid ?>" class="<?php echo "row$k"; ?>" onclick="applyAutoContent(<?php echo $row->secid ?>,<?php echo $row->catid ?>,'<?php echo "row$k" ?>');" style="cursor:pointer;">
							<td class="acytdcheckbox"></td>
							<td>
							</td>
							<td>
								<?php
								echo $row->category;
								?>
							</td>
						</tr>
						<?php
					}else{ ?>
						<tr id="content_cat<?php echo $row->id ?>" class="<?php echo "row$k"; ?>" onclick="applyAutoContent(<?php echo $row->id ?>,'<?php echo "row$k" ?>');" style="cursor:pointer;">
							<td class="acytdcheckbox"></td>
							<td>
								<?php
								echo $row->title;
								?>
							</td>
						</tr>
					<?php }
					$k = 1 - $k;
				}
				?>
				</tbody>
			</table>
		</div>
		<?php

		echo $tabs->endPanel();
		echo $tabs->endPane();
	}

	public function acymailing_replacetags(&$email, $send = true){
		$this->_replaceAuto($email);
		$this->_replaceArticles($email);
	}

	private function _replaceArticles(&$email){
		$tags = $this->acypluginsHelper->extractTags($email, 'joomlacontent');
		if(empty($tags)) return;

		$this->newslanguage = new stdClass();
		if(!empty($email->language)){
			$this->newslanguage = acymailing_loadObject('SELECT lang_id, lang_code FROM #__languages WHERE sef = '.acymailing_escapeDB($email->language).' LIMIT 1');
		}

		$this->currentcatid = -1;
		$this->readmore = empty($email->template->readmore) ? acymailing_translation('JOOMEXT_READ_MORE') : '<img class="readmorepict" src="'.ACYMAILING_LIVE.$email->template->readmore.'" alt="'.acymailing_translation('JOOMEXT_READ_MORE', true).'" />';

		require_once JPATH_SITE.DS.'components'.DS.'com_content'.DS.'helpers'.DS.'route.php';

		if($this->params->get('integration') == 'flexicontent' && file_exists(JPATH_SITE.DS.'components'.DS.'com_flexicontent'.DS.'helpers'.DS.'route.php')){
			require_once JPATH_SITE.DS.'components'.DS.'com_flexicontent'.DS.'helpers'.DS.'route.php';
		}

		$tagsReplaced = array();
		foreach($tags as $i => $oneTag){
			if(isset($tagsReplaced[$i])) continue;
			$tagsReplaced[$i] = $this->_replaceContent($oneTag);
		}

		$this->acypluginsHelper->replaceTags($email, $tagsReplaced, true);
	}

	private function _replaceContent(&$tag){
		$oldFormat = empty($tag->format);

		if($tag->id == 'current'){
			$article_id = acymailing_getVar('int', 'articleId');
			if(empty($article_id)) return;
			$tag->id = $article_id;
		}
		if(!ACYMAILING_J16){
			$query = 'SELECT a.*,b.name as authorname, c.alias as catalias, c.title as cattitle, c.image AS catpict, s.alias as secalias, s.title as sectitle FROM '.acymailing_table('content', false).' as a ';
			$query .= 'LEFT JOIN '.acymailing_table('users', false).' as b ON a.created_by = b.id ';
			$query .= ' LEFT JOIN '.acymailing_table('categories', false).' AS c ON c.id = a.catid ';
			$query .= ' LEFT JOIN '.acymailing_table('sections', false).' AS s ON s.id = a.sectionid ';
			$query .= 'WHERE a.id = '.$tag->id.' LIMIT 1';
		}else{
			$query = 'SELECT a.*,b.name as authorname, c.alias as catalias, c.title as cattitle, c.params AS catparams FROM '.acymailing_table('content', false).' as a ';
			$query .= 'LEFT JOIN '.acymailing_table('users', false).' as b ON a.created_by = b.id ';
			$query .= ' LEFT JOIN '.acymailing_table('categories', false).' AS c ON c.id = a.catid ';
			$query .= 'WHERE a.id = '.$tag->id.' LIMIT 1';
		}

		$article = acymailing_loadObject($query);

		if(empty($article)){
			if(acymailing_isAdmin()) acymailing_enqueueMessage('The article "'.$tag->id.'" could not be loaded', 'notice');
			return '';
		}

		if(empty($tag->lang) && !empty($this->newslanguage) && !empty($this->newslanguage->lang_code)) $tag->lang = $this->newslanguage->lang_code.','.$this->newslanguage->lang_id;

		$this->acypluginsHelper->translateItem($article, $tag, 'content');

		$varFields = array();
		foreach($article as $fieldName => $oneField){
			$varFields['{'.$fieldName.'}'] = $oneField;
		}

		$this->acypluginsHelper->cleanHtml($article->introtext);
		$this->acypluginsHelper->cleanHtml($article->fulltext);


		if($this->params->get('integration') == 'jreviews' && !empty($article->images)){
			$firstpict = explode('|', trim(reset(explode("\n", $article->images))).'|||||||');
			if(!empty($firstpict[0])){
				$picturePath = file_exists(ACYMAILING_ROOT.'images'.DS.'stories'.DS.str_replace('/', DS, $firstpict[0])) ? ACYMAILING_LIVE.'images/stories/'.$firstpict[0] : ACYMAILING_LIVE.'images/'.$firstpict[0];
				$myPict = '<img src="'.$picturePath.'" alt="" hspace="5" style="margin:5px" align="left" border="'.intval($firstpict[5]).'" />';
				$article->introtext = $myPict.$article->introtext;
			}
		}
		$completeId = $article->id;
		$completeCat = $article->catid;

		if(!empty($article->alias)) $completeId .= ':'.$article->alias;
		if(!empty($article->catalias)) $completeCat .= ':'.$article->catalias;

		if(empty($tag->itemid)){
			if(!ACYMAILING_J16){
				$completeSec = $article->sectionid;
				if(!empty($article->secalias)) $completeSec .= ':'.$article->secalias;
				if($this->params->get('integration') == 'flexicontent' && class_exists('FlexicontentHelperRoute')){
					$link = FlexicontentHelperRoute::getItemRoute($completeId, $completeCat, $completeSec);
				}else{
					$link = ContentHelperRoute::getArticleRoute($completeId, $completeCat, $completeSec);
				}
			}else{
				if($this->params->get('integration') == 'flexicontent' && class_exists('FlexicontentHelperRoute')){
					$link = FlexicontentHelperRoute::getItemRoute($completeId, $completeCat);
				}else{
					$link = ContentHelperRoute::getArticleRoute($completeId, $completeCat);
				}
			}
		}else{
			$link = 'index.php?option=com_content&view=article&id='.$completeId.'&catid='.$completeCat;
		}


		if($this->params->get('integration') == 'flexicontent' && !class_exists('FlexicontentHelperRoute')){
			$link = 'index.php?option=com_flexicontent&view=items&id='.$completeId;
		}elseif($this->params->get('integration') == 'jaggyblog'){
			$link = 'index.php?option=com_jaggyblog&task=viewpost&id='.$completeId;
		}

		if(!empty($tag->itemid)) $link .= '&Itemid='.$tag->itemid;
		if(!empty($tag->lang)) $link .= (strpos($link, '?') ? '&' : '?').'lang='.substr($tag->lang, 0, strpos($tag->lang, ACYMAILING_J16 ? '-' : ','));
		if(!empty($tag->autologin)) $link .= (strpos($link, '?') ? '&' : '?').'user={usertag:username|urlencode}&passw={usertag:password|urlencode}';

		if(empty($tag->lang) && !empty($article->language) && $article->language != '*'){
			if(!isset($this->langcodes[$article->language])){
				$this->langcodes[$article->language] = acymailing_loadResult('SELECT sef FROM #__languages WHERE lang_code = '.acymailing_escapeDB($article->language).' ORDER BY `published` DESC LIMIT 1');
				if(empty($this->langcodes[$article->language])) $this->langcodes[$article->language] = $article->language;
			}
			$link .= (strpos($link, '?') ? '&' : '?').'lang='.$this->langcodes[$article->language];
		}

		$nonsefLink = $link;
		$mainurl = acymailing_mainURL($nonsefLink);
		$nonsefLink = $mainurl.$nonsefLink;

		$link = acymailing_frontendLink($link);
		$varFields['{link}'] = $link;

		$afterTitle = '';
		$afterArticle = '';
		$contentText = '';
		$pictPath = '';

		if(!empty($tag->author)){
			$authorName = empty($article->created_by_alias) ? $article->authorname : $article->created_by_alias;
			if($tag->type == 'title') $afterTitle .= '<br />';
			$afterTitle .= '<span class="authorname">'.$authorName.'</span><br />';
		}

		$dateFormat = empty($tag->dateformat) ? acymailing_translation('DATE_FORMAT_LC2') : $tag->dateformat;
		if(!empty($tag->created)){
			if($tag->type == 'title') $afterTitle .= '<br />';
			$varFields['{createddate}'] = acymailing_date($article->created, $dateFormat);
			$afterTitle .= '<span class="createddate">'.$varFields['{createddate}'].'</span><br />';
		}

		if(!empty($tag->modified)){
			if($tag->type == 'title') $afterTitle .= '<br />';
			$varFields['{modifieddate}'] = acymailing_date($article->modified, $dateFormat);
			$afterTitle .= '<span class="modifieddate">'.$varFields['{modifieddate}'].'</span><br />';
		}

		if(!isset($tag->pict) && $tag->type != 'title'){
			if($this->params->get('removepictures', 'never') == 'always' || ($this->params->get('removepictures', 'never') == 'intro' && $tag->type == "intro")){
				$tag->pict = 0;
			}else{
				$tag->pict = 1;
			}
		}

		if(strpos($article->introtext, 'jseblod') !== false && file_exists(ACYMAILING_ROOT.'plugins'.DS.'content'.DS.'cckjseblod.php')){
			global $mainframe;
			include_once(ACYMAILING_ROOT.'plugins'.DS.'content'.DS.'cckjseblod.php');
			if(function_exists('plgContentCCKjSeblod')){
				$paramsContent = JComponentHelper::getParams('com_content');
				$article->text = $article->introtext.$article->fulltext;
				plgContentCCKjSeblod($article, $paramsContent);
				$article->introtext = $article->text;
				$article->fulltext = '';
			}
		}

		if($tag->type != "title"){
			if($tag->type == "intro"){
				$forceReadMore = false;
				$mytag = new stdClass();
				$mytag->wrap = $this->params->get('wordwrap', 0);
				if(empty($article->fulltext)){
					$article->introtext = $this->acypluginsHelper->wrapText($article->introtext, $mytag);
					if(!empty($this->acypluginsHelper->wraped)) $forceReadMore = true;
				}
			}

			if(empty($article->fulltext) || $tag->type != "text"){
				$contentText .= $article->introtext;
			}

			if($tag->type != "intro" && !empty($article->fulltext)){
				if($tag->type != "text" && !empty($article->introtext) && !preg_match('#^<[div|p]#i', trim($article->fulltext))){
					$contentText .= '<br />';
				}
				$contentText .= $article->fulltext;
			}

			$contentText = $this->acypluginsHelper->wrapText($contentText, $tag);
			if(!empty($this->acypluginsHelper->wraped)) $forceReadMore = true;

			if(!empty($tag->clean)){
				$contentText = strip_tags($contentText, '<p><br><span><ul><li><h1><h2><h3><h4><a>');
			}

			$varFields['{picthtml}'] = '';
			if(ACYMAILING_J16 && !empty($article->images) && !empty($tag->pict) && empty($tag->nomainimage)){
				$picthtml = '';
				$images = json_decode($article->images);
				$pictVar = ($tag->type == 'intro') ? 'image_intro' : 'image_fulltext';
				$floatVar = ($tag->type == 'intro') ? 'float_intro' : 'float_fulltext';
				if(!empty($images->$pictVar)){
					if($images->$floatVar != 'right'){
						if(empty($tag->format)) $tag->format = 'TOP_LEFT';
						$images->$floatVar = 'left';
					}elseif(empty($tag->format)) $tag->format = 'TOP_RIGHT';
					$style = 'float:'.$images->$floatVar.';padding-'.(($images->$floatVar == 'right') ? 'left' : 'right').':10px;padding-bottom:10px;';
					if(!empty($tag->link) && empty($tag->nopictlink)) $picthtml .= '<a target="_blank" href="'.$link.'" style="text-decoration:none" >';
					$alt = '';
					$altVar = $pictVar.'_alt';
					if(!empty($images->$altVar)) $alt = $images->$altVar;
					$picthtml .= '<img'.(empty($tag->nopictstyle) ? ' style="'.$style.'"' : '').' alt="'.$alt.'" border="0" src="'.acymailing_rootURI().$images->$pictVar.'" />';
					$pictPath = acymailing_rootURI().$images->$pictVar;
					if(!empty($tag->link) && empty($tag->nopictlink)) $picthtml .= '</a>';
					$varFields['{picthtml}'] = $picthtml;
				}
			}

			$contentText = preg_replace('/^\s*(<img[^>]*>)\s*(?:<br[^>]*>\s*)*/i', '$1', $contentText);

			if(!empty($tag->custom)){
				$tag->custom = explode(',', $tag->custom);
				acymailing_arrayToInteger($tag->custom);

				$articleCFValues = acymailing_loadObjectList('SELECT fv.value, f.id, f.fieldparams, f.params, f.type, f.label, f.default_value 
																FROM #__fields AS f 
																LEFT JOIN #__fields_values AS fv ON fv.field_id = f.id AND fv.item_id = '.intval($tag->id).' 
																WHERE  f.id IN ('.implode(',', $tag->custom).')');

				$fields = array();
				foreach($articleCFValues as $oneVal){
					$fields[$oneVal->id]['values'][] = $oneVal->value;
					$fields[$oneVal->id]['field'] = $oneVal;
				}

				foreach($fields as $oneField){
					if(!empty($oneField['field']->fieldparams)) $oneField['field']->fieldparams = json_decode($oneField['field']->fieldparams, true);
					$oneField['field']->params = json_decode($oneField['field']->params, true);

					if($oneField['values'][0] === NULL){
						if(($oneField['field']->type == 'user' && empty($oneField['field']->default_value)) || ($oneField['field']->type != 'user' && strlen($oneField['field']->default_value) == 0)) continue;
						$oneField['values'] = array($oneField['field']->default_value);
					}

					foreach($oneField['values'] as &$oneFieldVal){
						switch($oneField['field']->type){
							case 'radio':
							case 'list':
							case 'checkboxes':
								foreach($oneField['field']->fieldparams['options'] as $oneOPT){
									if($oneOPT['value'] == $oneFieldVal){
										$oneFieldVal = $oneOPT['name'];
										break;
									}
								}
								break;

							case 'usergrouplist':
								if(empty($this->usergroups)) $this->usergroups = acymailing_loadObjectList('SELECT id, title FROM #__usergroups', 'id');

								$oneFieldVal = $this->usergroups[$oneFieldVal]->title;
								break;

							case 'imagelist':
								if($oneFieldVal == -1){
									$oneFieldVal = NULL;
									continue;
								}

								if(strlen($oneField['field']->fieldparams['directory']) > 1) $oneFieldVal = '/'.$oneFieldVal;
								else $oneField['field']->fieldparams['directory'] = '';
								$oneFieldVal = '<img src="images/'.$oneField['field']->fieldparams['directory'].$oneFieldVal.'" />';
								break;

							case 'url':
								$oneFieldVal = '<a target="_blank" href="'.$oneFieldVal.'">'.$oneFieldVal.'</a>';
								break;

							case 'sql':
								if(empty($oneField['field']->options)){
									$oneField['field']->options = acymailing_loadObjectList($oneField['field']->fieldparams['query'], 'value');
								}

								$oneFieldVal = $oneField['field']->options[$oneFieldVal]->text;
								break;

							case 'user':
								$oneFieldVal = acymailing_currentUserName($oneFieldVal);
								break;

							case 'media':
								$oneFieldVal = '<img src="'.$oneFieldVal.'" />';
								break;

							case 'calendar':
								$format = $oneField['field']->fieldparams['showtime'] == '1' ? 'Y-m-d H:i' : 'Y-m-d';
								$oneFieldVal = acymailing_date(strtotime($oneFieldVal), $format);
								break;
						}
					}

					$replaceme = trim(implode(', ', $oneField['values']), ', ');
					if(empty($replaceme)) continue;

					if($oneField['field']->params['showlabel'] == '1'){
						$label = $oneField['field']->label.': ';
						if($oneField['field']->type == 'imagelist') $label .= '<br/>';
						$replaceme = $label.$replaceme;
					}
					$afterArticle .= '<br />'.$replaceme;
				}
			}
			
			if(file_exists(JPATH_SITE.DS.'plugins'.DS.'attachments') && empty($tag->noattach)){
				try{
					$query = 'SELECT display_name, url, filename '.'FROM #__attachments '.'WHERE (parent_entity = "article" '.'AND parent_id = '.intval($tag->id).')';
					if(ACYMAILING_J16){
						$query .= ' OR (parent_entity = "category" '.'AND parent_id = '.intval($article->catid).')';
					}
					$attachments = acymailing_loadObjectList($query);
				}catch(Exception $e){
					$attachments = array();
				}

				if(!empty($attachments)){
					$afterArticle .= '<br />'.acymailing_translation('ATTACHED_FILES').' :';
					foreach($attachments as $oneAttachment){
						$afterArticle .= '<br /><a target="_blank" href="'.$oneAttachment->url.'">'.(empty($oneAttachment->display_name) ? $oneAttachment->filename : $oneAttachment->display_name).'</a>';
					}
				}
			}

			if(!empty($tag->share)){
				$links = array();
				$shareOpt = explode(',', $tag->share);
				foreach($shareOpt as $socialNetwork){
					$knownNetwork = true;
					$socialNetwork = strtolower(trim($socialNetwork));
					if($socialNetwork == 'facebook'){
						$linkShare = 'http://www.facebook.com/sharer.php?u='.urlencode($nonsefLink).'&t='.urlencode($article->title);
						$picSrc = (file_exists(ACYMAILING_MEDIA.'plugins'.DS.'facebook.png') ? 'media/com_acymailing/plugins/facebook.png' : 'media/com_acymailing/images/facebookshare.png');
						$altText = 'Facebook';
					}elseif($socialNetwork == 'twitter'){
						$text = acymailing_translation_sprintf('SHARE_TEXT', $nonsefLink);
						$linkShare = 'http://twitter.com/home?status='.urlencode($text);
						$picSrc = (file_exists(ACYMAILING_MEDIA.'plugins'.DS.'twitter.png') ? 'media/com_acymailing/plugins/twitter.png' : 'media/com_acymailing/images/twittershare.png');
						$altText = 'Twitter';
					}elseif($socialNetwork == 'linkedin'){
						$linkShare = 'http://www.linkedin.com/shareArticle?mini=true&url='.urlencode($nonsefLink).'&title='.urlencode($article->title);
						$picSrc = (file_exists(ACYMAILING_MEDIA.'plugins'.DS.'linkedin.png') ? 'media/com_acymailing/plugins/linkedin.png' : 'media/com_acymailing/images/linkedin.png');
						$altText = 'LinkedIn';
					}elseif($socialNetwork == 'google'){
						$linkShare = 'https://plus.google.com/share?url='.urlencode($nonsefLink);
						$picSrc = (file_exists(ACYMAILING_MEDIA.'plugins'.DS.'google.png') ? 'media/com_acymailing/plugins/google.png' : 'media/com_acymailing/images/google_plusshare.png');
						$altText = 'Google+';
					}elseif($socialNetwork == 'mailto'){
						$linkShare = 'mailto:?subject='.urlencode($article->title).'&body='.urlencode($article->title.' ('.$nonsefLink.')');
						$picSrc = (file_exists(ACYMAILING_MEDIA.'plugins'.DS.'mailto.png') ? 'media/com_acymailing/plugins/mailto.png' : 'media/com_acymailing/images/mailto.png');
						$altText = 'MailTo';
					}else{
						$knownNetwork = false;
						acymailing_display('Network not found: '.$socialNetwork.'. Availables networks are facebook, twitter, linkedin, google and mailto.', 'warning');
					}
					if($knownNetwork){
						array_push($links, '<a target="_blank" href="'.$linkShare.'" title="'.acymailing_translation_sprintf('SOCIAL_SHARE', $altText).'"><img alt="'.$altText.'" src="'.$picSrc.'" /></a>');
					}
				}
				$afterArticle .= '<br />'.(!empty($tag->sharetxt) ? $tag->sharetxt.' ' : '').implode(' ', $links);
			}
		}

		if(!empty($tag->jtags) && version_compare(JVERSION, '3.1.0', '>=')){
			$tags = acymailing_loadObjectList('SELECT t.id, t.alias, t.title FROM #__tags AS t JOIN #__contentitem_tag_map AS m ON t.id = m.tag_id WHERE t.published = 1 AND m.type_alias = "com_content.article" AND m.content_item_id = '.intval($tag->id));
			if(!empty($tags)){
				$afterArticle .= '<br />';
				foreach($tags as $oneTag){
					$afterArticle .= ' <a target="_blank" href="index.php?option=com_tags&view=tag&id='.$oneTag->id.'-'.$oneTag->alias.'">'.$oneTag->title.'</a> ';
				}
			}
		}

		$readMoreText = empty($tag->readmore) ? $this->readmore : $tag->readmore;
		$varFields['{readmore}'] = '<a class="acymailing_readmore_link" style="text-decoration:none;" target="_blank" href="'.$link.'"><span class="acymailing_readmore">'.$readMoreText.'</span></a>';

		if($tag->type == "intro" && empty($tag->noreadmore) && (!empty($article->fulltext) || $forceReadMore)){
			if(!empty($afterArticle)) $afterArticle .= '<br />';
			$afterArticle .= $varFields['{readmore}'];
		}

		$format = new stdClass();
		$format->tag = $tag;
		$format->title = empty($tag->notitle) ? $article->title : '';
		$format->afterTitle = $afterTitle;
		$format->afterArticle = $afterArticle;
		$format->imagePath = $pictPath;
		$format->description = $contentText;
		$format->link = empty($tag->link) ? '' : $link;
		$format->cols = 2;
		$result = $this->acypluginsHelper->getStandardDisplay($format);

		if(!empty($tag->theme)){
			if(preg_match('#<img[^>]*>#Uis', $article->introtext.$article->fulltext, $pregresult)){
				$cleanContent = strip_tags($result, '<p><br><span><ul><li><h1><h2><h3><h4><a>');
				$tdwidth = (empty($tag->maxwidth) ? $this->params->get('maxwidth', 150) : $tag->maxwidth) + 20;
				$result = '<table cellspacing="0" width="500" cellpadding="0" border="0" ><tr><td class="contentpicture" width="'.$tdwidth.'" valign="top" align="center"><a href="'.$link.'" target="_blank" style="border:0px;text-decoration:none">'.$pregresult[0].'</a></td><td class="contenttext">'.$cleanContent.'</td></tr></table>';
			}
		}

		if($tag->type != 'title') $result = '<div class="acymailing_content">'.$result.'</div>';

		if(!(empty($tag->cattitle) && empty($tag->catpict)) && ((!strpos($article->catid, ',') && $this->currentcatid != $article->catid) || (strpos($article->catid, ',') && !in_array($this->currentcatid, explode(',', $article->catid))))){
			if(strpos($article->catid, ',')){
				$catids = explode(',', $article->catid);
				$this->currentcatid = $catids[0];
			}else{
				$this->currentcatid = $article->catid;
			}

			if(ACYMAILING_J16){
				$params = json_decode($article->catparams);
				$article->catpict = $params->image;
			}

			$resultTitle = $article->cattitle;

			if(!empty($tag->catpict) && !empty($article->catpict)){
				$style = '';
				if(!empty($tag->catmaxwidth)) $style .= 'max-width:'.intval($tag->catmaxwidth).'px;';
				if(!empty($tag->catmaxheight)) $style .= 'max-height:'.intval($tag->catmaxheight).'px;';
				$resultTitle = '<img'.(empty($style) ? '' : ' style="'.$style.'"').' alt="" src="'.$article->catpict.'" />';
				if(!empty($tag->cattitlelink)) $resultTitle = '<a target="_blank" href="index.php?option=com_content&view=category&id='.$this->currentcatid.'">'.$resultTitle.'</a>';
			}else{
				if(!empty($tag->cattitlelink)) $resultTitle = '<a target="_blank" href="index.php?option=com_content&view=category&id='.$this->currentcatid.'">'.$resultTitle.'</a>';
				$resultTitle = '<h3 class="cattitle">'.$resultTitle.'</h3>';
			}

			$result = $resultTitle.$result;
		}

		if($oldFormat){
			if(file_exists(ACYMAILING_MEDIA.'plugins'.DS.'tagcontent_html.php')){
				ob_start();
				require(ACYMAILING_MEDIA.'plugins'.DS.'tagcontent_html.php');
				$result = ob_get_clean();
			}elseif(file_exists(ACYMAILING_MEDIA.'plugins'.DS.'tagcontent.php')){
				ob_start();
				require(ACYMAILING_MEDIA.'plugins'.DS.'tagcontent.php');
				$result = ob_get_clean();
			}
		}elseif(!empty($tag->template) && file_exists(ACYMAILING_MEDIA.'plugins'.DS.$tag->template)){
			ob_start();
			require(ACYMAILING_MEDIA.'plugins'.DS.$tag->template);
			$result = ob_get_clean();
		}
		$result = str_replace(array_keys($varFields), $varFields, $result);

		$result = $this->acypluginsHelper->removeJS($result);

		$tag->maxheight = empty($tag->maxheight) ? $this->params->get('maxheight', 150) : $tag->maxheight;
		$tag->maxwidth = empty($tag->maxwidth) ? $this->params->get('maxwidth', 150) : $tag->maxwidth;
		$result = $this->acypluginsHelper->managePicts($tag, $result);

		if(!empty($tag->maxchar) && strlen(strip_tags($result)) > $tag->maxchar){
			$result = strip_tags($result);
			for($i = $tag->maxchar; $i > 0; $i--){
				if($result[$i] == ' ') break;
			}
			if(!empty($i)) $result = substr($result, 0, $i).@$tag->textafter;
		}

		return $result;
	}

	private function _replaceAuto(&$email){
		$this->acymailing_generateautonews($email);
		if(empty($this->tags)) return;
		$this->acypluginsHelper->replaceTags($email, $this->tags, true);
	}

	public function acymailing_generateautonews(&$email){
		$time = time();

		$tags = $this->acypluginsHelper->extractTags($email, 'autocontent');
		$return = new stdClass();
		$return->status = true;
		$return->message = '';
		$this->tags = array();

		if(empty($tags)) return $return;

		foreach($tags as $oneTag => $parameter){
			if(isset($this->tags[$oneTag])) continue;
			$allcats = explode('-', $parameter->id);
			$selectedArea = array();
			foreach($allcats as $oneCat){
				if(!ACYMAILING_J16){
					$sectype = substr($oneCat, 0, 3);
					$num = substr($oneCat, 3);
					if(empty($num)) continue;
					if($sectype == 'cat'){
						$selectedArea[] = 'catid = '.(int)$num;
					}elseif($sectype == 'sec'){
						$selectedArea[] = 'sectionid = '.(int)$num;
					}
				}else{
					if(empty($oneCat)) continue;
					$selectedArea[] = intval($oneCat);
				}
			}

			$query = 'SELECT DISTINCT a.id FROM `#__content` as a ';
			$where = array();

			if(!empty($parameter->tags) && version_compare(JVERSION, '3.1.0', '>=')){
				$tagsArray = explode(',', $parameter->tags);
				acymailing_arrayToInteger($tagsArray);
				if(!empty($tagsArray)){
					foreach($tagsArray as $oneTagId){
						$query .= 'JOIN #__contentitem_tag_map AS tagsmap'.$oneTagId.' ON (a.id = tagsmap'.$oneTagId.'.content_item_id AND tagsmap'.$oneTagId.'.type_alias LIKE "com_content.article" AND tagsmap'.$oneTagId.'.tag_id = '.$oneTagId.') ';
					}
				}
			}

			if(!empty($parameter->featured)){
				if(ACYMAILING_J16){
					$where[] = 'a.featured = 1';
				}else{
					$query .= 'JOIN `#__content_frontpage` as b ON a.id = b.content_id ';
					$where[] = 'b.content_id IS NOT NULL';
				}
			}

			if(!empty($parameter->nofeatured)){
				if(ACYMAILING_J16){
					$where[] = 'a.featured = 0';
				}else{
					$query .= 'LEFT JOIN `#__content_frontpage` as b ON a.id = b.content_id ';
					$where[] = 'b.content_id IS NULL';
				}
			}

			if(ACYMAILING_J16 && !empty($parameter->subcats) && !empty($selectedArea)){
				$catinfos = acymailing_loadObjectList('SELECT lft,rgt FROM #__categories WHERE id IN ('.implode(',', $selectedArea).')');
				if(!empty($catinfos)){
					$whereCats = array();
					foreach($catinfos as $onecat){
						$whereCats[] = 'lft > '.$onecat->lft.' AND rgt < '.$onecat->rgt;
					}
					$othercats = acymailing_loadResultArray('SELECT id FROM #__categories WHERE ('.implode(') OR (', $whereCats).')');
					$selectedArea = array_merge($selectedArea, $othercats);
				}
			}

			if($this->newMulticats && (!empty($selectedArea) || !empty($parameter->excludedcats))) $query .= ' JOIN `#__multicats_content_catid` as mcc ON a.id = mcc.item_id ';

			if(!empty($selectedArea)){
				if(!ACYMAILING_J16){
					$where[] = implode(' OR ', $selectedArea);
				}else{
					$filter_cat = '`catid` IN ('.implode(',', $selectedArea).')';
					if(file_exists(JPATH_SITE.DS.'components'.DS.'com_multicats')){
						if($this->newMulticats){
							$filter_cat = 'mcc.`catid` REGEXP "^([0-9]+,)*'.implode('(,[0-9]+)*$" OR mcc.`catid` REGEXP "^([0-9]+,)*', $selectedArea).'(,[0-9]+)*$"';
						}else{
							$filter_cat = '`catid` REGEXP "^([0-9]+,)*'.implode('(,[0-9]+)*$" OR `catid` REGEXP "^([0-9]+,)*', $selectedArea).'(,[0-9]+)*$"';
						}
					}
					$where[] = $filter_cat;
				}
			}

			if(!empty($parameter->excludedcats)){
				$excludedCats = explode('-', $parameter->excludedcats);
				acymailing_arrayToInteger($excludedCats);
				$filter_cat = '`catid` NOT IN ("'.implode('","', $excludedCats).'")';
				if(file_exists(JPATH_SITE.DS.'components'.DS.'com_multicats')){
					if($this->newMulticats){
						$filter_cat = 'mcc.`catid` NOT REGEXP "^([0-9]+,)*'.implode('(,[0-9]+)*$" AND mcc.`catid` NOT REGEXP "^([0-9]+,)*', $excludedCats).'(,[0-9]+)*$"';
					}else{
						$filter_cat = '`catid` NOT REGEXP "^([0-9]+,)*'.implode('(,[0-9]+)*$" AND `catid` NOT REGEXP "^([0-9]+,)*', $excludedCats).'(,[0-9]+)*$"';
					}
				}
				$where[] = $filter_cat;
			}

			if(!empty($parameter->filter) && !empty($email->params['lastgenerateddate'])){
				$condition = '(`publish_up` > \''.date('Y-m-d H:i:s', $email->params['lastgenerateddate'] - date('Z')).'\' AND `publish_up` < \''.date('Y-m-d H:i:s', $time - date('Z')).'\')';
				$condition .= ' OR (`created` > \''.date('Y-m-d H:i:s', $email->params['lastgenerateddate'] - date('Z')).'\' AND `created` < \''.date('Y-m-d H:i:s', $time - date('Z')).'\')';
				if($parameter->filter == 'modify'){
					$modify = '(`modified` > \''.date('Y-m-d H:i:s', $email->params['lastgenerateddate'] - date('Z')).'\' AND `modified` < \''.date('Y-m-d H:i:s', $time - date('Z')).'\')';
					if(!empty($parameter->maxpublished)) $modify = '('.$modify.' AND `publish_up` > \''.date('Y-m-d H:i:s', time() - date('Z') - ((int)$parameter->maxpublished * 60 * 60 * 24)).'\')';
					$condition .= ' OR '.$modify;
				}

				$where[] = $condition;
			}

			if(!empty($parameter->maxcreated)){
				$date = $parameter->maxcreated;
				if(strpos($parameter->maxcreated, '[time]') !== false) $date = acymailing_replaceDate(str_replace('[time]', '{time}', $parameter->maxcreated));
				if(!is_numeric($date)) $date = strtotime($parameter->maxcreated);
				if(empty($date)){
					acymailing_display('Wrong date format ('.$parameter->maxcreated.' in '.$oneTag.'), please use YYYY-MM-DD', 'warning');
				}
				$where[] = '`created` < '.acymailing_escapeDB(date('Y-m-d H:i:s', $date)).' OR `publish_up` < '.acymailing_escapeDB(date('Y-m-d H:i:s', $date));
			}else{
				$where[] = '`publish_up` < \''.date('Y-m-d H:i:s', $time - date('Z')).'\'';
			}

			if(!empty($parameter->mincreated)){
				$date = $parameter->mincreated;
				if(strpos($parameter->mincreated, '[time]') !== false) $date = acymailing_replaceDate(str_replace('[time]', '{time}', $parameter->mincreated));
				if(!is_numeric($date)) $date = strtotime($parameter->mincreated);
				if(empty($date)){
					acymailing_display('Wrong date format ('.$parameter->mincreated.' in '.$oneTag.'), please use YYYY-MM-DD', 'warning');
				}
				$where[] = '`created` > '.acymailing_escapeDB(date('Y-m-d H:i:s', $date)).' OR `publish_up` > '.acymailing_escapeDB(date('Y-m-d H:i:s', $date));
			}


			if(!empty($parameter->meta)){
				$allMetaTags = explode(',', $parameter->meta);
				$metaWhere = array();
				foreach($allMetaTags as $oneMeta){
					if(empty($oneMeta)) continue;
					$metaWhere[] = "`metakey` LIKE '%".acymailing_getEscaped($oneMeta, true)."%'";
				}
				if(!empty($metaWhere)) $where[] = implode(' OR ', $metaWhere);
			}

			$where[] = '`publish_down` > \''.date('Y-m-d H:i:s', $time - date('Z')).'\' OR `publish_down` = 0';
			if(empty($parameter->unpublished)){
				$where[] = 'state = 1';
			}else{
				$where[] = 'state = 0';
			}

			if(!ACYMAILING_J16){
				if(isset($parameter->access)){
					$where[] = 'access <= '.intval($parameter->access);
				}else{
					if($this->params->get('contentaccess', 'registered') == 'registered'){
						$where[] = 'access <= 1';
					}elseif($this->params->get('contentaccess', 'registered') == 'public') $where[] = 'access = 0';
				}
			}elseif(isset($parameter->access)){
				if(strpos($parameter->access, ',')){
					$allAccess = explode(',', $parameter->access);
					acymailing_arrayToInteger($allAccess);
					$where[] = 'access IN ('.implode(',', $allAccess).')';
				}else{
					$where[] = 'access = '.intval($parameter->access);
				}
			}

			if(ACYMAILING_J16 && !empty($parameter->language)){
				$allLanguages = explode(',', $parameter->language);
				$langWhere = 'language IN (';
				foreach($allLanguages as $oneLanguage){
					$langWhere .= acymailing_escapeDB(trim($oneLanguage)).',';
				}
				$where[] = trim($langWhere, ',').')';
			}

			$query .= ' WHERE ('.implode(') AND (', $where).')';
			if(!empty($parameter->order)){
				$ordering = explode(',', $parameter->order);
				if($ordering[0] == 'rand'){
					$query .= ' ORDER BY rand()';
				}else{
					$query .= ' ORDER BY `'.acymailing_secureField($ordering[0]).'` '.acymailing_secureField($ordering[1]).' , a.`id` DESC';
				}
			}

			$start = '';
			if(!empty($parameter->start)) $start = intval($parameter->start).',';

			if(empty($parameter->max)) $parameter->max = 100;

			$query .= ' LIMIT '.$start.(int)$parameter->max;

			$allArticles = acymailing_loadResultArray($query);

			if(!empty($parameter->min) && count($allArticles) < $parameter->min){
				$return->status = false;
				$return->message = 'Not enough articles for the tag '.$oneTag.' : '.count($allArticles).' / '.$parameter->min.' between '.acymailing_getDate($email->params['lastgenerateddate']).' and '.acymailing_getDate($time);
			}

			$stringTag = empty($parameter->noentrytext) ? '' : $parameter->noentrytext;
			if(!empty($allArticles)){
				if(file_exists(ACYMAILING_MEDIA.'plugins'.DS.'autocontent.php')){
					ob_start();
					require(ACYMAILING_MEDIA.'plugins'.DS.'autocontent.php');
					$stringTag = ob_get_clean();
				}else{
					$arrayElements = array();
					$numArticle = 1;
					foreach($allArticles as $oneArticleId){
						$args = array();
						$args[] = 'joomlacontent:'.$oneArticleId;
						$args[] = 'num:'.$numArticle++;
						if(!empty($parameter->invert) && $numArticle % 2 == 1) $args[] = 'invert';
						if(!empty($parameter->type)) $args[] = 'type:'.$parameter->type;
						if(!empty($parameter->custom)) $args[] = 'custom:'.$parameter->custom;
						if(!empty($parameter->format)) $args[] = 'format:'.$parameter->format;
						if(!empty($parameter->template)) $args[] = 'template:'.$parameter->template;
						if(!empty($parameter->jtags)) $args[] = 'jtags';
						if(!empty($parameter->link)) $args[] = 'link';
						if(!empty($parameter->author)) $args[] = 'author';
						if(!empty($parameter->autologin)) $args[] = 'autologin';
						if(!empty($parameter->cattitle)) $args[] = 'cattitle';
						if(!empty($parameter->cattitlelink)) $args[] = 'cattitlelink';
						if(!empty($parameter->lang)) $args[] = 'lang:'.$parameter->lang;
						if(!empty($parameter->theme)) $args[] = 'theme';
						if(!empty($parameter->clean)) $args[] = 'clean';
						if(!empty($parameter->notitle)) $args[] = 'notitle';
						if(!empty($parameter->nopictstyle)) $args[] = 'nopictstyle';
						if(!empty($parameter->nopictlink)) $args[] = 'nopictlink';
						if(!empty($parameter->created)) $args[] = 'created';
						if(!empty($parameter->noattach)) $args[] = 'noattach';
						if(!empty($parameter->itemid)) $args[] = 'itemid:'.$parameter->itemid;
						if(!empty($parameter->noreadmore)) $args[] = 'noreadmore';
						if(isset($parameter->pict)) $args[] = 'pict:'.$parameter->pict;
						if(!empty($parameter->wrap)) $args[] = 'wrap:'.$parameter->wrap;
						if(!empty($parameter->maxwidth)) $args[] = 'maxwidth:'.$parameter->maxwidth;
						if(!empty($parameter->maxheight)) $args[] = 'maxheight:'.$parameter->maxheight;
						if(!empty($parameter->readmore)) $args[] = 'readmore:'.$parameter->readmore;
						if(!empty($parameter->dateformat)) $args[] = 'dateformat:'.$parameter->dateformat;
						if(!empty($parameter->textafter)) $args[] = 'textafter:'.$parameter->textafter;
						if(!empty($parameter->maxchar)) $args[] = 'maxchar:'.$parameter->maxchar;
						if(!empty($parameter->share)) $args[] = 'share:'.$parameter->share;
						if(!empty($parameter->sharetxt)) $args[] = 'sharetxt:'.$parameter->sharetxt;
						if(!empty($parameter->catpict)) $args[] = 'catpict';
						if(!empty($parameter->catmaxwidth)) $args[] = 'catmaxwidth:'.$parameter->catmaxwidth;
						if(!empty($parameter->catmaxheight)) $args[] = 'catmaxheight:'.$parameter->catmaxheight;
						if(!empty($parameter->nomainimage)) $args[] = 'nomainimage';
						$arrayElements[] = '{'.implode('|', $args).'}';
					}
					$stringTag = $this->acypluginsHelper->getFormattedResult($arrayElements, $parameter);
				}
			}
			$this->tags[$oneTag] = $stringTag;
		}

		return $return;
	}
}//endclass
components/com_acymailing/extensions/plg_acymailing_taguser/index.html000060400000000054152453623450022615 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_acymailing_taguser/taguser.xml000060400000004611152453623450023017 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/plugin-install.dtd">
<install type="plugin" version="1.5" method="upgrade" group="acymailing">
	<name>AcyMailing Tag : Joomla User Information</name>
	<creationDate>March 2018</creationDate>
	<version>5.9.6</version>
	<author>Acyba</author>
	<authorEmail>dev@acyba.com</authorEmail>
	<authorUrl>http://www.acyba.com</authorUrl>
	<copyright>Copyright (C) 2009-2018 ACYBA SAS - All rights reserved..</copyright>
	<license>GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html</license>
	<description>This plugin enables you to add informations of the Joomla user in the Newsletter</description>
	<files>
		<filename plugin="taguser">taguser.php</filename>
	</files>
	<params addpath="/components/com_acymailing/params">
		<param name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-taguser"/>
		<param name="displayfilter_mail" type="radio" default="1" label="Display filter" description="Display the user fields filter and group filter on the Newsletter creation interface">
			<option value="0">JOOMEXT_NO</option>
			<option value="1">JOOMEXT_YES</option>
		</param>
		<param name="frontendaccess" type="list" default="all" label="Front-end Access" description="You can restrict the access to this tag system with this option">
			<option value="all">Always display this tag system</option>
			<option value="none">Don't display this tag system on the front-end</option>
		</param>
	</params>
	<config>
		<fields name="params" addfieldpath="/components/com_acymailing/params">
			<fieldset name="basic">
				<field name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-taguser"/>
				<field name="displayfilter_mail" type="radio" default="1" label="Display filter" description="Display the user fields filter and group filter on the Newsletter creation interface">
					<option value="0">JOOMEXT_NO</option>
					<option value="1">JOOMEXT_YES</option>
				</field>
				<field name="frontendaccess" type="list" default="all" label="Front-end Access" description="You can restrict the access to this tag system with this option">
					<option value="all">Always display this tag system</option>
					<option value="none">Don't display this tag system on the front-end</option>
				</field>
			</fieldset>
		</fields>
	</config>
</install>
components/com_acymailing/extensions/plg_acymailing_taguser/taguser.php000060400000047114152453623450023013 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class plgAcymailingTaguser extends JPlugin{

	var $sendervalues = array();

	function __construct(&$subject, $config){
		parent::__construct($subject, $config);
		if(!isset($this->params)){
			$plugin = JPluginHelper::getPlugin('acymailing', 'taguser');
			$this->params = new acyParameter($plugin->params);
		}
	}

	function acymailing_getPluginType(){
		if($this->params->get('frontendaccess') == 'none' && !acymailing_isAdmin()) return;
		$onePlugin = new stdClass();
		$onePlugin->name = acymailing_translation('TAGUSER_TAGUSER');
		$onePlugin->function = 'acymailingtaguser_show';
		$onePlugin->help = 'plugin-taguser';

		return $onePlugin;
	}

	function acymailingtaguser_show(){
		?>

		<script language="javascript" type="text/javascript">
			function applyTag(tagname){
				var string = '{usertag:' + tagname;
				for(var i = 0; i < document.adminForm.typeinfo.length; i++){
					if(document.adminForm.typeinfo[i].checked){
						string += '|info:' + document.adminForm.typeinfo[i].value;
					}
				}
				string += '}';
				setTag(string);
				insertTag();
			}
		</script>
		<?php
		$typeinfo = array();
		$typeinfo[] = acymailing_selectOption("receiver", acymailing_translation('RECEIVER_INFORMATION'));
		$typeinfo[] = acymailing_selectOption("sender", acymailing_translation('SENDER_INFORMATIONS'));
		echo acymailing_radio($typeinfo, 'typeinfo', '', 'value', 'text', 'receiver');


		$notallowed = array('password', 'params', 'sendemail', 'gid', 'block', 'email', 'name', 'id');
		$text = '<div class="onelineblockoptions"><table class="acymailing_table" cellpadding="1">';
		$fields = acymailing_getColumns('#__users');
		if(ACYMAILING_J30) $fields = array_merge($fields, array('usertype' => 'usertype'));

		$descriptions['username'] = acymailing_translation('TAGUSER_USERNAME');
		$descriptions['usertype'] = acymailing_translation('TAGUSER_GROUP');
		$descriptions['lastvisitdate'] = acymailing_translation('TAGUSER_LASTVISIT');
		$descriptions['registerdate'] = acymailing_translation('TAGUSER_REGISTRATION');

		$k = 0;
		foreach($fields as $fieldname => $oneField){
			if(in_array(strtolower($fieldname), $notallowed)) continue;
			$type = '';
			if(strpos(strtolower($oneField), 'date') !== false) $type = '|type:date';
			$text .= '<tr style="cursor:pointer" class="row'.$k.'" onclick="applyTag(\''.$fieldname.$type.'\');" ><td class="acytdcheckbox"></td><td>'.$fieldname.'</td><td>'.@$descriptions[strtolower($fieldname)].'</td></tr>';
			$k = 1 - $k;
		}

		if(ACYMAILING_J16){
			$extraFields = acymailing_loadObjectList('SELECT DISTINCT `profile_key` FROM `#__user_profiles`');
			if(!empty($extraFields)){
				foreach($extraFields as $oneField){
					$text .= '<tr style="cursor:pointer" class="row'.$k.'" onclick="applyTag(\''.$oneField->profile_key.'|type:extra\');" ><td class="acytdcheckbox"></td><td>'.$oneField->profile_key.'</td><td></td></tr>';
					$k = 1 - $k;
				}
			}
		}
		if(ACYMAILING_J30){
			$link = 'index.php/component/users/?task=registration.activate&token={usertag:activation|info:receiver}';
		}elseif(ACYMAILING_J16){
			$link = 'index.php?option=com_users&task=registration.activate&token={usertag:activation|info:receiver}';
		}else{
			$link = 'index.php?option=com_user&task=activate&activation={usertag:activation|info:receiver}';
		}
		$text .= '<tr style="cursor:pointer" class="row'.$k.'" onclick="setTag(\''.htmlentities('<a target="_blank" href="'.$link.'">'.acymailing_translation('JOOMLA_CONFIRM_ACCOUNT').'</a>').'\'); insertTag();" ><td class="acytdcheckbox"></td><td>confirmJoomla</td><td>'.acymailing_translation('JOOMLA_CONFIRM_LINK').'</td></tr>';
		$text .= '</table></div>';

		$jversion = preg_replace('#[^0-9\.]#i', '', JVERSION);
		if(version_compare($jversion, '3.7.0', '>=')){
			$query = 'SELECT id, title FROM #__fields_groups WHERE context = "com_users.user" AND state = 1 ORDER BY title ASC';
			$groups = acymailing_loadObjectList($query);
			$defaultGroup = new stdClass();
			$defaultGroup->id = 0;
			$defaultGroup->title = acymailing_translation('ACY_NO_GROUP');
			array_unshift($groups, $defaultGroup);

			$query = 'SELECT id, title, group_id FROM #__fields WHERE context = "com_users.user" AND state = 1 ORDER BY title ASC';
			$customFields = acymailing_loadObjectList($query);

			if(!empty($customFields)){
				$text .= '<div class="onelineblockoptions">
							<span class="acyblocktitle">'.acymailing_translation('EXTRA_FIELDS').'</span>
							<table class="acymailing_table" cellpadding="1">';
				foreach($groups as $oneGroup){
					$openedGroup = false;
					foreach($customFields as $oneCF){
						if($oneCF->group_id != $oneGroup->id) continue;
						if(!$openedGroup){
							$text .= '<tr><td></td><td style="font-weight: bold;">'.$oneGroup->title.'</td><td></td></tr>';
							$openedGroup = true;
						}
						$text .= '<tr style="cursor:pointer" onclick="applyTag(\''.$oneCF->id.'|type:custom\');" ><td class="acytdcheckbox"></td><td>'.$oneCF->title.'</td><td></td></tr>';
					}
				}
				$text .= '</table></div>';
			}
		}


		echo $text;
	}

	function acymailing_replaceusertags(&$email, &$user, $send = true){
		$pluginsHelper = acymailing_get('helper.acyplugins');
		$extractedTags = $pluginsHelper->extractTags($email, 'usertag');
		if(empty($extractedTags)) return;

		$jversion = preg_replace('#[^0-9\.]#i', '', JVERSION);
		if(empty($this->customFields) && version_compare($jversion, '3.7.0', '>=')){
			$this->customFields = acymailing_loadObjectList('SELECT * FROM #__fields WHERE context = "com_users.user"', 'id');
			foreach($this->customFields as &$oneCF){
				if(!empty($oneCF->fieldparams)) $oneCF->fieldparams = json_decode($oneCF->fieldparams, true);
			}
		}

		$tags = array();
		$receivervalues = array();
		foreach($extractedTags as $i => $mytag){
			if(isset($tags[$i])) continue;
			$mytag->default = $this->params->get('default_'.$mytag->id, '');

			$values = new stdClass();
			$idused = 0;
			$save = false;

			if(!empty($mytag->info) && $mytag->info == 'sender' && !empty($email->userid)){
				$idused = $email->userid;
				$save = true;
			}
			if(!empty($mytag->info) && $mytag->info == 'current'){   
				$currentUserid = acymailing_currentUserId();
				if(!empty($currentUserid)) $idused = $currentUserid;
			}
			if((empty($mytag->info) || $mytag->info == 'receiver') && !empty($user->userid)){
				$idused = $user->userid;
			}

			if(!empty($idused) && empty($this->sendervalues[$idused]) && empty($receivervalues[$idused])){
				$receivervalues[$idused] = acymailing_loadObject('SELECT * FROM '.acymailing_table('users', false).' WHERE id = '.intval($idused).' LIMIT 1');

				if(ACYMAILING_J16){
					$receivervalues[$idused]->extraFields = acymailing_loadObjectList('SELECT * FROM #__user_profiles WHERE user_id = '.intval($idused), 'profile_key');
				}

				if($save) $this->sendervalues[$idused] = $receivervalues[$idused];
			}

			if(!empty($this->sendervalues[$idused])){
				$values = $this->sendervalues[$idused];
			}elseif(!empty($receivervalues[$idused])) $values = $receivervalues[$idused];

			if($mytag->id == 'usertype' && ACYMAILING_J16){
				if(empty($this->acyuserHelper)) $this->acyuserHelper = acymailing_get('helper.acyuser');
				$groups = $this->acyuserHelper->getUserGroups($idused);
				$allGroups = array();
				foreach($groups as $oneGroup) $allGroups[] = $oneGroup->title;
				$values->usertype = implode(', ', $allGroups);
			}

			if(empty($mytag->type)) $mytag->type = '';
			if($mytag->type == 'extra'){
				$replaceme = isset($values->extraFields[$mytag->id]) ? trim(json_decode($values->extraFields[$mytag->id]->profile_value), '"') : $mytag->default;
			}elseif($mytag->type == 'custom'){
				$mytag->id = intval($mytag->id);
				if(empty($mytag->id)){
					$replaceme = '';
				}else{
					$userFieldVals = acymailing_loadResultArray('SELECT value FROM #__fields_values WHERE item_id = '.intval($idused).' AND field_id = '.intval($mytag->id));

					$fieldValues = trim(implode(', ', $userFieldVals), ', ');
					if(empty($fieldValues)){
						$defaultValue = acymailing_loadObject('SELECT default_value, type FROM #__fields WHERE id = '.intval($mytag->id));
						if(($defaultValue->type == 'user' && !empty($defaultValue->default_value)) || ($defaultValue->type != 'user' && strlen($defaultValue->default_value) > 0)){
							$userFieldVals = array($defaultValue->default_value);
						}
					}

					foreach($userFieldVals as &$oneFieldVal){
						switch($this->customFields[$mytag->id]->type){
							case 'radio':
							case 'list':
							case 'checkboxes':
								foreach($this->customFields[$mytag->id]->fieldparams['options'] as $oneOPT){
									if($oneOPT['value'] == $oneFieldVal){
										$oneFieldVal = $oneOPT['name'];
										break;
									}
								}
								break;

							case 'usergrouplist':
								if(empty($this->usergroups)) $this->usergroups = acymailing_loadObjectList('SELECT id, title FROM #__usergroups', 'id');

								$oneFieldVal = $this->usergroups[$oneFieldVal]->title;
								break;

							case 'imagelist':
								if(strlen($this->customFields[$mytag->id]->fieldparams['directory']) > 1) $oneFieldVal = '/'.$oneFieldVal;
								else $this->customFields[$mytag->id]->fieldparams['directory'] = '';
								$oneFieldVal = '<img src="images/'.$this->customFields[$mytag->id]->fieldparams['directory'].$oneFieldVal.'" />';
								break;

							case 'url':
								$oneFieldVal = '<a target="_blank" href="'.$oneFieldVal.'">'.$oneFieldVal.'</a>';
								break;

							case 'sql':
								if(empty($this->customFields[$mytag->id]->options)){
									$this->customFields[$mytag->id]->options = acymailing_loadObjectList($this->customFields[$mytag->id]->fieldparams['query'], 'value');
								}

								$oneFieldVal = $this->customFields[$mytag->id]->options[$oneFieldVal]->text;
								break;

							case 'user':
								$oneFieldVal = acymailing_currentUserName($oneFieldVal);
								break;

							case 'media':
								$oneFieldVal = '<img src="'.$oneFieldVal.'" />';
								break;

							case 'calendar':
								$format = $this->customFields[$mytag->id]->fieldparams['showtime'] == '1' ? 'Y-m-d H:i' : 'Y-m-d';
								$oneFieldVal = acymailing_date(strtotime($oneFieldVal), $format);
								break;
						}
					}

					$replaceme = implode(', ', $userFieldVals);
				}
			}else{
				$replaceme = isset($values->{$mytag->id}) ? $values->{$mytag->id} : $mytag->default;
			}

			$tags[$i] = $replaceme;
			$pluginsHelper->formatString($tags[$i], $mytag);
		}

		$pluginsHelper->replaceTags($email, $tags);
	}//endfct

	function onAcyDisplayFilters(&$type, $context = "massactions"){

		if($this->params->get('displayfilter_'.$context, true) == false) return;

		$fields = acymailing_getColumns('#__users');
		if(empty($fields)) return;

		$type['joomlafield'] = acymailing_translation('JOOMLA_FIELD');
		$type['joomlagroup'] = acymailing_translation('ACY_GROUP');

		$field = array();
		$field[] = acymailing_selectOption(0, '- - -');
		foreach($fields as $oneField => $fieldType){
			$field[] = acymailing_selectOption($oneField, $oneField);
		}

		if(ACYMAILING_J16){
			$extraFields = acymailing_loadObjectList('SELECT DISTINCT `profile_key` FROM `#__user_profiles`');
			if(!empty($extraFields)){
				foreach($extraFields as $oneField){
					$field[] = acymailing_selectOption('customfield_'.$oneField->profile_key, $oneField->profile_key);
				}
			}
		}

		$jversion = preg_replace('#[^0-9\.]#i', '', JVERSION);
		if(version_compare($jversion, '3.7.0', '>=')){
			$query = 'SELECT id, title 
						FROM #__fields 
						WHERE context = "com_users.user"
							AND state = 1
							AND type IN ("calendar", "checkboxes", "color", "integer", "list", "imagelist", "radio", "sql", "text", "textarea", "url", "user", "usergrouplist")
						ORDER BY title ASC';
			$customFields = acymailing_loadObjectList($query);
			foreach ($customFields as $oneCF) {
				$field[] = acymailing_selectOption($oneCF->id, $oneCF->title);
			}
		}

		$jsOnChange = "displayCondFilter('displayUserValues', 'toChange__num__',__num__,'map='+document.getElementById('filter__num__joomlafieldmap').value+'&cond='+document.getElementById('filter__num__joomlafieldoperator').value+'&value='+document.getElementById('filter__num__joomlafieldvalue').value); ";

		$operators = acymailing_get('type.operators');
		$operators->extra = 'onchange="'.$jsOnChange.'countresults(__num__)"';

		$return = '<div id="filter__num__joomlafield">'.acymailing_select($field, "filter[__num__][joomlafield][map]", 'class="inputbox" size="1" onchange="'.$jsOnChange.'countresults(__num__)"', 'value', 'text');
		$return .= ' '.$operators->display("filter[__num__][joomlafield][operator]").' <span id="toChange__num__"><input onchange="countresults(__num__)" class="inputbox" type="text" name="filter[__num__][joomlafield][value]" id="filter__num__joomlafieldvalue" style="width:200px" value=""></span></div>';

		if(!ACYMAILING_J16){
			$acl = JFactory::getACL();
			$groups = $acl->get_group_children_tree(null, 'USERS', false);
		}else{
			$groups = acymailing_loadObjectList('SELECT a.*, a.title as text, a.id as value FROM #__usergroups AS a ORDER BY a.lft ASC', 'id');
			foreach($groups as $id => $group){
				if(isset($groups[$group->parent_id])){
					$groups[$id]->level = empty($groups[$group->parent_id]->level) ? 1 : intval($groups[$group->parent_id]->level + 1);
					$groups[$id]->text = str_repeat('- - ', $groups[$id]->level).$groups[$id]->text;
				}
			}
		}

		$inoperator = acymailing_get('type.operatorsin');
		$inoperator->js = 'onchange="countresults(__num__)"';

		$return .= '<div id="filter__num__joomlagroup">'.$inoperator->display("filter[__num__][joomlagroup][type]").' '.acymailing_select($groups, "filter[__num__][joomlagroup][group]", 'class="inputbox" size="1" onchange="countresults(__num__)"', 'value', 'text').'<label for="filter__num__joomlagroupsubgroups"><input type="checkbox" value="1" id="filter__num__joomlagroupsubgroups" name="filter[__num__][joomlagroup][subgroups]" onchange="countresults(__num__)"/>'.acymailing_translation('ACY_SUB_GROUPS').'</label></div>';

		return $return;
	}

	function onAcyTriggerFct_displayUserValues(){
		$num = acymailing_getVar('int', 'num');
		$map = acymailing_getVar('cmd', 'map');
		$cond = acymailing_getVar('string', 'cond', '', '', ACY_ALLOWHTML);
		$value = acymailing_getVar('string', 'value', '', '', ACY_ALLOWHTML);

		$emptyInputReturn = '<input onchange="countresults('.$num.')" class="inputbox" type="text" name="filter['.$num.'][joomlafield][value]" id="filter'.$num.'joomlafieldvalue" style="width:200px" value="'.$value.'">';
		$dateInput = '<input onclick="displayDatePicker(this,event)" onchange="countresults('.$num.')" class="inputbox" type="text" name="filter['.$num.'][joomlafield][value]" id="filter'.$num.'joomlafieldvalue" style="width:200px" value="'.$value.'">';

		if(in_array($map, array('registerDate', 'lastvisitDate', 'lastResetTime'))) return $dateInput;

		if(empty($map) || in_array($map, array('password', 'params', 'optKey', 'otep')) || !in_array($cond, array('=', '!='))) return $emptyInputReturn;

		if(strpos($map, 'customfield_') !== false){
			$prop = acymailing_loadObjectList('SELECT DISTINCT TRIM(BOTH \'"\' FROM `profile_value`) AS value FROM #__user_profiles WHERE profile_key = '.acymailing_escapeDB(str_replace('customfield_', '', $map)).' LIMIT 100');
		}elseif(intval($map) != 0){
			$prop = acymailing_loadObjectList('SELECT DISTINCT `value` FROM #__fields_values WHERE field_id = '.intval($map).' LIMIT 100');
		}else{
			$prop = acymailing_loadObjectList('SELECT DISTINCT `' . acymailing_secureField($map) . '` AS value FROM #__users LIMIT 100');
		}

		if(empty($prop) || count($prop) >= 100 || (count($prop) == 1 && (empty($prop[0]->value) || $prop[0]->value == '-'))) return $emptyInputReturn;

		return acymailing_select($prop, "filter[$num][joomlafield][value]", 'onchange="countresults('.$num.')" class="inputbox" size="1" style="width:200px"', 'value', 'value', $value, 'filter'.$num.'joomlafieldvalue');
	}

	function onAcyProcessFilterCount_joomlafield(&$query, $filter, $num){
		$this->onAcyProcessFilter_joomlafield($query, $filter, $num);
		return acymailing_translation_sprintf('SELECTED_USERS', $query->count());
	}

	function onAcyDisplayFilter_joomlafield($filter){
		return acymailing_translation('JOOMLA_FIELD').' : '.$filter['map'].' '.$filter['operator'].' '.$filter['value'];
	}

	function onAcyProcessFilter_joomlafield(&$query, $filter, $num){
		if(empty($filter['map'])) return;
		$type = '';
		if(strpos($filter['map'], 'customfield_') !== false){
			$query->leftjoin['joomlauserprofiles'.$num] = '#__user_profiles AS joomlauserprofiles'.$num.' ON joomlauserprofiles'.$num.'.user_id = sub.userid AND joomlauserprofiles'.$num.'.profile_key = '.acymailing_escapeDB(str_replace('customfield_', '', $filter['map']));
			$val = trim($filter['value'], '"');
			if(in_array($filter['operator'], array('=', '!=', '<', '>', '<=', '>=', 'BEGINS', 'LIKE', 'NOT LIKE'))){
				$val = '"'.$val;
			}
			if(in_array($filter['operator'], array('=', '!=', '<', '>', '<=', '>=', 'END', 'LIKE', 'NOT LIKE'))){
				$val = $val.'"';
			}

			$query->where[] = $query->convertQuery('joomlauserprofiles'.$num, 'profile_value', $filter['operator'], $val, $type);
		}elseif(intval($filter['map']) != 0){
			$query->leftjoin['joomlauserfields'.$num] = '#__fields_values AS joomlauserfields'.$num.' ON joomlauserfields'.$num.'.item_id = sub.userid AND joomlauserfields'.$num.'.field_id = '.intval($filter['map']);
			$query->where[] = $query->convertQuery('joomlauserfields'.$num, 'value', $filter['operator'], $filter['value'], $type);
		}else{
			$query->leftjoin['joomlauser'.$num] = '#__users AS joomlauser'.$num.' ON joomlauser'.$num.'.id = sub.userid';
			if(in_array($filter['map'], array('registerDate', 'lastvisitDate'))){
				$filter['value'] = acymailing_replaceDate($filter['value']);
				if(!is_numeric($filter['value']) && strtotime($filter['value']) !== false) $filter['value'] = strtotime($filter['value']);
				if(is_numeric($filter['value'])) $filter['value'] = strftime('%Y-%m-%d %H:%M:%S', $filter['value']);
				$type = 'datetime';
			}
			$query->where[] = $query->convertQuery('joomlauser'.$num, $filter['map'], $filter['operator'], $filter['value'], $type);
		}
	}

	function onAcyProcessFilterCount_joomlagroup(&$query, $filter, $num){
		$this->onAcyProcessFilter_joomlagroup($query, $filter, $num);
		return acymailing_translation_sprintf('SELECTED_USERS', $query->count());
	}

	function onAcyProcessFilter_joomlagroup(&$query, $filter, $num){
		$operator = (empty($filter['type']) || $filter['type'] == 'IN') ? 'IS NOT NULL AND joomlauser'.$num.'.'.(ACYMAILING_J16 ? 'user_' : '').'id != 0' : "IS NULL";
		$filter['group'] = intval($filter['group']);

		if(!empty($filter['subgroups'])){
			$groupTable = ACYMAILING_J16 ? 'usergroups' : 'core_acl_aro_groups';
			$lftrgt = acymailing_loadObject('SELECT lft, rgt FROM #__'.$groupTable.' WHERE id = '.$filter['group']);
			$allGroups = acymailing_loadResultArray('SELECT id FROM #__'.$groupTable.' WHERE lft > '.$lftrgt->lft.' AND rgt < '.$lftrgt->rgt);
			array_unshift($allGroups, $filter['group']);
			$value = ' IN ('.implode(', ', $allGroups).')';
		}else{
			$value = ' = '.$filter['group'];
		}

		if(!ACYMAILING_J16){
			$query->leftjoin['joomlauser'.$num] = "#__users AS joomlauser$num ON joomlauser$num.id = sub.userid AND joomlauser$num.gid".$value;
			$query->where[] = "joomlauser$num.id ".$operator;
		}else{
			$query->leftjoin['joomlauser'.$num] = "#__user_usergroup_map AS joomlauser$num ON joomlauser$num.user_id = sub.userid AND joomlauser$num.group_id".$value;
			$query->where[] = "joomlauser$num.user_id ".$operator;
		}
	}
}//endclass

components/com_acymailing/extensions/plg_acymailing_tagsubscriber/tagsubscriber.php000060400000044404152453623450025364 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class plgAcymailingTagsubscriber extends JPlugin{

	var $fields = array();

	function __construct(&$subject, $config){
		parent::__construct($subject, $config);
		if(!isset($this->params)){
			$plugin = JPluginHelper::getPlugin('acymailing', 'tagsubscriber');
			$this->params = new acyParameter($plugin->params);
		}
	}

	function acymailing_getPluginType(){
		if($this->params->get('frontendaccess') == 'none' && !acymailing_isAdmin()) return;
		$onePlugin = new stdClass();
		$onePlugin->name = acymailing_translation('SUBSCRIBER_SUBSCRIBER');
		$onePlugin->function = 'acymailingtagsubscriber_show';
		$onePlugin->help = 'plugin-tagsubscriber';

		return $onePlugin;
	}

	function acymailingtagsubscriber_show(){
		$fields = acymailing_getColumns('#__acymailing_subscriber');

		$descriptions['subid'] = acymailing_translation('SUBSCRIBER_ID');
		$descriptions['email'] = acymailing_translation('SUBSCRIBER_EMAIL');
		$descriptions['name'] = acymailing_translation('SUBSCRIBER_NAME');
		$descriptions['userid'] = acymailing_translation('SUBSCRIBER_USERID');
		$descriptions['ip'] = acymailing_translation('SUBSCRIBER_IP');
		$descriptions['created'] = acymailing_translation('SUBSCRIBER_CREATED');
		echo '<br style="clear:both;"/>';
		if(acymailing_getVar('none', 'type') == 'notification'){
			$text = '<div class="onelineblockoptions">
						<span class="acyblocktitle">'.acymailing_translation('CURRENT_USER_INFO').'</span>
						<table class="acymailing_table" cellpadding="1">';
			$k = 0;
			foreach($fields as $fieldname => $oneField){
				if(!isset($descriptions[$fieldname]) AND $oneField == 'tinyint') continue;
				if(empty($descriptions[$fieldname])) $descriptions[$fieldname] = '';

				$type = '';
				if(in_array($fieldname, array('created', 'confirmed_date', 'lastclick_date', 'lastsent_date', 'lastopen_date'))) $type = '|type:time';
				$text .= '<tr style="cursor:pointer" class="row'.$k.'" onclick="setTag(\'{user:'.$fieldname.$type.'}\');insertTag();" ><td class="acytdcheckbox"></td><td>'.$fieldname.'</td><td>'.$descriptions[$fieldname].'</td></tr>';
				$k = 1 - $k;
			}
			$text .= '</table></div>';
			echo $text;
		}

		$text = '<div class="onelineblockoptions">
					<span class="acyblocktitle">'.acymailing_translation('RECEIVER_INFORMATION').'</span>
					<table class="acymailing_table" cellpadding="1">';

		$others = array();
		$others['{subtag:name|part:first|ucfirst}'] = array('name' => acymailing_translation('SUBSCRIBER_FIRSTPART'), 'desc' => acymailing_translation('SUBSCRIBER_FIRSTPART').' '.acymailing_translation('SUBSCRIBER_FIRSTPART_DESC'));
		$others['{subtag:name|part:last|ucfirst}'] = array('name' => acymailing_translation('SUBSCRIBER_LASTPART'), 'desc' => acymailing_translation('SUBSCRIBER_LASTPART').' '.acymailing_translation('SUBSCRIBER_LASTPART_DESC'));

		$k = 0;

		foreach($others as $tagname => $tag){
			$text .= '<tr style="cursor:pointer" class="row'.$k.'" onclick="setTag(\''.$tagname.'\');insertTag();" ><td class="acytdcheckbox"></td><td>'.$tag['name'].'</td><td>'.$tag['desc'].'</td></tr>';
			$k = 1 - $k;
		}

		foreach($fields as $fieldname => $oneField){
			if(!isset($descriptions[$fieldname]) AND $oneField == 'tinyint') continue;
			if(empty($descriptions[$fieldname])) $descriptions[$fieldname] = '';

			$type = '';
			if(in_array($fieldname, array('created', 'confirmed_date', 'lastclick_date', 'lastopen_date', 'lastsent_date'))) $type = '|type:time';
			$text .= '<tr style="cursor:pointer" class="row'.$k.'" onclick="setTag(\'{subtag:'.$fieldname.$type.'}\');insertTag();" ><td class="acytdcheckbox"></td><td>'.$fieldname.'</td><td>'.$descriptions[$fieldname].'</td></tr>';
			$k = 1 - $k;
		}

		$text .= '</table></div>';

		echo $text;
	}

	function acymailing_replaceusertags(&$email, &$user, $send = true){
		$this->pluginsHelper = acymailing_get('helper.acyplugins');
		$extractedTags = $this->pluginsHelper->extractTags($email, 'subtag');
		if(empty($extractedTags)) return;

		$tags = array();
		foreach($extractedTags as $i => $oneTag){
			if(isset($tags[$i])) continue;
			$tags[$i] = $this->replaceSubTag($oneTag, $user);
		}

		$this->pluginsHelper->replaceTags($email, $tags);
	}

	private function replaceSubTag(&$mytag, $user){
		if(!empty($mytag->juser)){
			$subClass = acymailing_get('class.subscriber');
			if(strpos($mytag->juser, '@') !== false){
				$userTmp = $subClass->get($mytag->juser);
			}else{
				$query = "SELECT * FROM #__users WHERE username= ".acymailing_escapeDB($mytag->juser);
				$JuserTmp = acymailing_loadObject($query);
				if(!empty($JuserTmp->email)) $userTmp = $subClass->get($JuserTmp->email);
			}
			if(!empty($userTmp)){
				$user = $userTmp;
			}else acymailing_enqueueMessage('User not found for tag juser', 'warning');
		}

		$field = $mytag->id;
		if(empty($mytag->titlevalue)){
			$replaceme = (isset($user->$field) && strlen($user->$field) > 0) ? $user->$field : $mytag->default;
		}else{
			$fieldClass = acymailing_get('class.fields');
			if(!isset($this->fields[$field])){
				$this->fields[$field] = $fieldClass->get($field);
			}
			$replaceme = (isset($user->$field) && strlen($user->$field) > 0 && !empty($this->fields[$field]->value[$user->$field]->value)) ? $fieldClass->trans($this->fields[$field]->value[$user->$field]->value) : $mytag->default;
		}
		$replaceme = nl2br($replaceme);

		$this->pluginsHelper->formatString($replaceme, $mytag);

		return $replaceme;
	}

	function onAcyDisplayFilters(&$type, $context = "massactions"){

		if($this->params->get('displayfilter_'.$context, true) == false) return;

		$fields = acymailing_getColumns('#__acymailing_subscriber');
		if(empty($fields)) return;

		$field = array();
		$field[] = acymailing_selectOption(0, '- - -');
		foreach($fields as $oneField => $fieldType){
			$field[] = acymailing_selectOption($oneField, $oneField);
		}
		$type['acymailingfield'] = acymailing_translation('ACYMAILING_FIELD');

		$jsOnChange = "displayCondFilter('displaySubscriberValues', 'toChange__num__',__num__,'map='+document.getElementById('filter__num__acymailingfieldmap').value+'&cond='+document.getElementById('filter__num__acymailingfieldoperator').value+'&value='+document.getElementById('filter__num__acymailingfieldvalue').value); ";

		$operators = acymailing_get('type.operators');
		$operators->extra = 'onchange="'.$jsOnChange.'"';

		$return = '<div id="filter__num__acymailingfield">'.acymailing_select($field, "filter[__num__][acymailingfield][map]", 'onchange="'.$jsOnChange.'" class="inputbox" size="1"', 'value', 'text');
		$return .= ' '.$operators->display("filter[__num__][acymailingfield][operator]").' <span id="toChange__num__"><input onchange="countresults(__num__)" class="inputbox" type="text" name="filter[__num__][acymailingfield][value]" style="width:200px" value="" id="filter__num__acymailingfieldvalue"></span></div>';

		return $return;
	}

	function onAcyTriggerFct_displaySubscriberValues(){
		$num = acymailing_getVar('int', 'num');
		$map = acymailing_getVar('cmd', 'map');
		$cond = acymailing_getVar('string', 'cond', '', '', ACY_ALLOWHTML);
		$value = acymailing_getVar('string', 'value', '', '', ACY_ALLOWHTML);

		$emptyInputReturn = '<input onchange="countresults('.$num.')" class="inputbox" type="text" name="filter['.$num.'][acymailingfield][value]" id="filter'.$num.'acymailingfieldvalue" style="width:200px" value="'.$value.'">';
		$dateInput = '<input onClick="displayDatePicker(this,event)" onchange="countresults('.$num.')" class="inputbox" type="text" name="filter['.$num.'][acymailingfield][value]" id="filter'.$num.'acymailingfieldvalue" style="width:200px" value="'.$value.'">';

		if(in_array($map, array('created', 'confirmed_date', 'lastopen_date', 'lastclick_date'))) return $dateInput;

		if(empty($map) || $map == 'key' || !in_array($cond, array('=', '!='))) return $emptyInputReturn;

		$query = 'SELECT DISTINCT `'.acymailing_secureField($map).'` AS value FROM #__acymailing_subscriber LIMIT 100';
		$prop = acymailing_loadObjectList($query);

		if(empty($prop) || count($prop) >= 100 || (count($prop) == 1 && (empty($prop[0]->value) || $prop[0]->value == '-'))) return $emptyInputReturn;

		return acymailing_select($prop, "filter[$num][acymailingfield][value]", 'onchange="countresults('.$num.')" class="inputbox" size="1" style="width:200px"', 'value', 'value', $value, 'filter'.$num.'acymailingfieldvalue');
	}

	function onAcyDisplayFilter_acymailingfield($filter){
		return acymailing_translation('ACYMAILING_FIELD').' : '.$filter['map'].' '.$filter['operator'].' '.$filter['value'];
	}

	function onAcyProcessFilter_acymailingfield(&$query, $filter, $num){
		if(empty($filter['map'])) return;
		$type = '';
		$value = acymailing_replaceDate($filter['value']);

		if(strpos($filter['value'], '{time}') !== false && !in_array($filter['map'], array('created', 'confirmed_date', 'lastclick_date', 'lastopen_date', 'lastsent_date'))){
			$value = strftime('%Y-%m-%d', $value);
		}

		if(in_array($filter['map'], array('created', 'confirmed_date', 'lastclick_date', 'lastopen_date', 'lastsent_date'))){
			if(!is_numeric($value)) $value = strtotime($value);
			$type = 'timestamp';
		}

		$query->where[] = $query->convertQuery('sub', $filter['map'], $filter['operator'], $value, $type);
	}

	function onAcyProcessFilterCount_acymailingfield(&$query, $filter, $num){
		$this->onAcyProcessFilter_acymailingfield($query, $filter, $num);
		return acymailing_translation_sprintf('SELECTED_USERS', $query->count());
	}

	function onAcyDisplayActions(&$type){
		$config = acymailing_config();

		$type['acymailingfield'] = acymailing_translation('BOUNCE_ACTION');
		$status = array();
		$status[] = acymailing_selectOption('confirm', acymailing_translation('CONFIRM_USERS'));
		$status[] = acymailing_selectOption('unconfirm', acymailing_translation('ACY_ACTION_UNCONFIRM'));
		$status[] = acymailing_selectOption('enable', acymailing_translation('ENABLE_USERS'));
		$status[] = acymailing_selectOption('block', acymailing_translation('BLOCK_USERS'));

		if(acymailing_isAllowed($config->get('acl_subscriber_delete', 'all'))) $status[] = acymailing_selectOption('delete', acymailing_translation('DELETE_USERS'));

		$content = '<div id="action__num__acymailingfield">'.acymailing_select($status, "action[__num__][acymailingfield][action]", 'class="inputbox" size="1"', 'value', 'text').'</div>';

		if(!acymailing_level(3)) return $content;

		$fields = acymailing_getColumns('#__acymailing_subscriber');
		if(empty($fields)) return $content;

		$field = array();
		$field[] = acymailing_selectOption(0, '- - -');
		foreach($fields as $oneField => $fieldType){
			if(in_array($oneField, array('name', 'email', 'subid', 'created', 'ip'))) continue;
			$field[] = acymailing_selectOption($oneField, $oneField);
		}

		$jsOnChange = "if(document.getElementById('action__num__acymailingfieldvalvalue')!= undefined){ currentVal=document.getElementById('action__num__acymailingfieldvalvalue').value;} else{currentVal='';}
			displayCondFilter('displayFieldPossibleValues', 'toChangeAction__num__',__num__,'map='+document.getElementById('action__num__acymailingfieldvalmap').value+'&value='+currentVal+'&operator='+document.getElementById('action__num__acymailingfieldvaloperator').value); ";

		$operator = array();
		$operator[] = acymailing_selectOption('=', '=');
		$operator[] = acymailing_selectOption('+', '+');
		$operator[] = acymailing_selectOption('-', '-');
		$operator[] = acymailing_selectOption('addend', acymailing_translation('ACY_OPERATOR_ADDEND'));
		$operator[] = acymailing_selectOption('addbegin', acymailing_translation('ACY_OPERATOR_ADDBEGINNING'));

		$content .= '<div id="action__num__acymailingfieldval">'.acymailing_select($field, "action[__num__][acymailingfieldval][map]", 'onchange="'.$jsOnChange.'" class="inputbox" size="1"', 'value', 'text');
		$content .= ' '.acymailing_select($operator, "action[__num__][acymailingfieldval][operator]", 'onchange="'.$jsOnChange.'" class="inputbox" size="1" style="width:150px;"', 'value', 'text', '=');
		$content .= ' <span id="toChangeAction__num__"><input class="inputbox" type="text" id="action__num__acymailingfieldvalvalue" name="action[__num__][acymailingfieldval][value]" style="width:200px" value=""></span></div>';

		$type['acymailingfieldval'] = acymailing_translation('SET_SUBSCRIBER_VALUE');

		return $content;
	}

	function onAcyTriggerFct_displayFieldPossibleValues(){
		$num = acymailing_getVar('int', 'num');
		$map = acymailing_getVar('cmd', 'map');
		$value = acymailing_getVar('string', 'value');
		$operator = acymailing_getVar('string', 'operator');

		if(in_array($operator, array('addend', 'addbegin'))){
			$emptyInputReturn = '<textarea class="inputbox" type="text" name="action['.$num.'][acymailingfieldval][value]" id="action'.$num.'acymailingfieldvalvalue" style="width:200px">'.$value.'</textarea>';
		}else{
			$emptyInputReturn = '<input class="inputbox" type="text" name="action['.$num.'][acymailingfieldval][value]" id="action'.$num.'acymailingfieldvalvalue" style="width:200px" value="'.$value.'">';
		}

		if(empty($map) || $map == 'key' || $operator != '=') return $emptyInputReturn;

		$fieldClass = acymailing_get('class.fields');
		$myField = $fieldClass->get($map);
		if(empty($myField) || !in_array($myField->type, array('radio', 'checkbox', 'singledropdown', 'multipledropdown'))) return $emptyInputReturn;

		return $fieldClass->display($myField, '', 'action['.$num.'][acymailingfieldval][value]');
	}

	function onAcyProcessAction_acymailingfieldval($cquery, $action, $num){

		$value = is_array($action['value']) ? implode(',', $action['value']) : $action['value'];
		$replace = array('{year}', '{month}', '{weekday}', '{day}');
		$replaceBy = array(date('Y'), date('m'), date('N'), date('d'));
		$value = str_replace($replace, $replaceBy, $value);

		if(preg_match_all('#{(year|month|weekday|day)\|(add|remove):([^}]*)}#Uis', $value, $results)){
			foreach($results[0] as $i => $oneMatch){
				$format = str_replace(array('year', 'month', 'weekday', 'day'), array('Y','m','N','d'), $results[1][$i]);
				$delay = str_replace(array('add', 'remove'), array('+', '-'), $results[2][$i]).intval($results[3][$i]).' '.str_replace('weekday', 'day', $results[1][$i]);
				$value = str_replace($oneMatch, date($format, strtotime($delay)), $value);
			}
		}

		if(empty($action['operator'])) $action['operator'] = '=';

		preg_match_all('#(?:{|%7B)field:(.*)(?:}|%7D)#Ui', $value, $tags);
		$fields = array_keys(acymailing_getColumns('#__acymailing_subscriber'));
		if(!in_array($action['map'], $fields)) return 'Unexisting field: '.$action['map'].' | The available fields are: '.implode(', ', $fields);

		if(in_array($action['operator'], array('+', '-'))){
			if(empty($tags) || empty($tags[1])){
				$value = intval($value);
			}else{
				if(count($tags[1]) > 1 || substr($value, 0, 1) != '{' || substr($value, strlen($value) - 1, 1) != '}'){
					return 'You can\'t use more than one tag for the + and - operators (you also can\'t add or remove a value from the inserted tag for these two operators)';
				}
				if(!in_array($tags[1][0], $fields)) return 'Unexisting field: '.$tags[1][0].' | The available fields are: '.implode(', ', $fields);
				$value = 'sub.`'.acymailing_secureField($tags[1][0]).'`';
			}
		}else{
			$value = acymailing_escapeDB($value);
			if(!empty($tags)){
				foreach($tags[1] as $i => $oneField){
					if(!in_array($oneField, $fields)) return 'Unexisting field: '.$oneField.' | The available fields are: '.implode(', ', $fields);
					$value = str_replace($tags[0][$i], "', sub.`".acymailing_secureField($oneField)."`, '", $value);
				}
				$value = "CONCAT(".$value.")";
			}
		}

		$query = 'UPDATE #__acymailing_subscriber AS sub';
		if(!empty($cquery->join)) $query .= ' JOIN '.implode(' JOIN ', $cquery->join);
		if(!empty($cquery->leftjoin)) $query .= ' LEFT JOIN '.implode(' LEFT JOIN ', $cquery->leftjoin);

		if($action['operator'] == '='){
			$newValue = $value;
		}elseif(in_array($action['operator'], array('+', '-'))){
			$newValue = "sub.`".acymailing_secureField($action['map'])."` ".$action['operator']." ".$value;
		}elseif($action['operator'] == 'addend'){
			$newValue = "CONCAT(sub.`".acymailing_secureField($action['map'])."`, ".$value.")";
		}elseif($action['operator'] == 'addbegin'){
			$newValue = "CONCAT(".$value.", sub.`".acymailing_secureField($action['map'])."`)";
		}else{
			return 'Non existing operator: '.$action['operator'];
		}

		$query .= " SET sub.`".acymailing_secureField($action['map'])."` = ".$newValue;
		if(!empty($cquery->where)) $query .= ' WHERE ('.implode(') AND (', $cquery->where).')';

		$nbAffected = acymailing_query($query);
		return acymailing_translation_sprintf('NB_MODIFIED', $nbAffected);
	}

	function onAcyProcessAction_acymailingfield($cquery, $action, $num){

		$config = acymailing_config();
		$subClass = acymailing_get('class.subscriber');

		if($action['action'] == 'confirm'){
			$cquery->where['confirmed'] = 'sub.confirmed = 0';
			$allSubids = acymailing_loadResultArray($cquery->getQuery(array('sub.subid')));
			if(!empty($allSubids)){
				$subClass->sendConf = false;
				$subClass->sendWelcome = false;
				$subClass->sendNotif = false;
				foreach($allSubids as $oneId){
					$subClass->confirmSubscription($oneId);
				}
			}
			unset($cquery->where['confirmed']);
			return acymailing_translation_sprintf('NB_CONFIRMED', count($allSubids));
		}

		if($action['action'] == 'enable'){
			$action['map'] = 'enabled';
			$action['value'] = 1;
			return $this->onAcyProcessAction_acymailingfieldval($cquery, $action, $num);
		}

		if($action['action'] == 'block'){
			$action['map'] = 'enabled';
			$action['value'] = 0;
			return $this->onAcyProcessAction_acymailingfieldval($cquery, $action, $num);
		}

		if($action['action'] == 'unconfirm'){
			$action['map'] = 'confirmed';
			$action['value'] = 0;
			return $this->onAcyProcessAction_acymailingfieldval($cquery, $action, $num);
		}

		if($action['action'] == 'delete'){
			if(!acymailing_isAllowed($config->get('acl_subscriber_delete', 'all'))) return 'Not allowed to delete users';
			$query = $cquery->getQuery(array('sub.subid'));
			$allSubids = acymailing_loadResultArray($query);
			$nbAffected = $subClass->delete($allSubids);
			return acymailing_translation_sprintf('IMPORT_DELETE', $nbAffected);
		}

		return 'Filter AcyMailingField error, action not found : '.$action['action'];
	}
}//endclass
components/com_acymailing/extensions/plg_acymailing_tagsubscriber/index.html000060400000000054152453623450024002 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_acymailing_tagsubscriber/tagsubscriber.xml000060400000004653152453623450025377 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/plugin-install.dtd">
<install type="plugin" version="1.5" method="upgrade" group="acymailing">
	<name>AcyMailing Tag : Subscriber information</name>
	<creationDate>March 2018</creationDate>
	<version>5.9.6</version>
	<author>Acyba</author>
	<authorEmail>dev@acyba.com</authorEmail>
	<authorUrl>http://www.acyba.com</authorUrl>
	<copyright>Copyright (C) 2009-2018 ACYBA SAS - All rights reserved..</copyright>
	<license>GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html</license>
	<description>This plugin enables you to add information of the subscriber in your Newsletter</description>
	<files>
		<filename plugin="tagsubscriber">tagsubscriber.php</filename>
		<filename>index.html</filename>
	</files>
	<params addpath="/components/com_acymailing/params">
		<param name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-tagsubscriber"/>
		<param name="displayfilter_mail" type="radio" default="1" label="Display filter" description="Display the subscriber fields filter on the Newsletter creation interface">
			<option value="0">JOOMEXT_NO</option>
			<option value="1">JOOMEXT_YES</option>
		</param>
		<param name="frontendaccess" type="list" default="all" label="Front-end Access" description="You can restrict the access to this tag system with this option">
			<option value="all">Always display this tag system</option>
			<option value="none">Don't display this tag system on the front-end</option>
		</param>
	</params>
	<config>
		<fields name="params" addfieldpath="/components/com_acymailing/params">
			<fieldset name="basic">
				<field name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-tagsubscriber"/>
				<field name="displayfilter_mail" type="radio" default="1" label="Display filter" description="Display the subscriber fields filter on the Newsletter creation interface">
					<option value="0">JOOMEXT_NO</option>
					<option value="1">JOOMEXT_YES</option>
				</field>
				<field name="frontendaccess" type="list" default="all" label="Front-end Access" description="You can restrict the access to this tag system with this option">
					<option value="all">Always display this tag system</option>
					<option value="none">Don't display this tag system on the front-end</option>
				</field>
			</fieldset>
		</fields>
	</config>
</install>
components/com_acymailing/extensions/index.html000060400000000054152453623450016104 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_acymailing_contentplugin/contentplugin.xml000060400000002655152453623450025463 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/plugin-install.dtd">
<install type="plugin" version="1.5" method="upgrade" group="acymailing">
	<name>AcyMailing : trigger Joomla Content plugins</name>
	<creationDate>November 2009</creationDate>
	<version>3.7.0</version>
	<author>Acyba</author>
	<authorEmail>dev@acyba.com</authorEmail>
	<authorUrl>http://www.acyba.com</authorUrl>
	<copyright>Copyright (C) 2009-2018 ACYBA SAS - All rights reserved..</copyright>
	<license>GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html</license>
	<description>This plugin enables you to trigger the content plugin system on AcyMailing. The Joomla Content plugin system has not been developed to be triggered from the backend and so you may have some non compatible plugins, that's why this plugin is not enabled by default</description>
	<files>
		<filename plugin="contentplugin">contentplugin.php</filename>
	</files>
	<params addpath="/components/com_acymailing/params">
		<param name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-contentplugin"/>
	</params>
	<config>
		<fields name="params" addfieldpath="/components/com_acymailing/params">
			<fieldset name="basic">
				<field name="help" type="help" label="Help" description="Click on the help button to get some help" default="plugin-contentplugin"/>
			</fieldset>
		</fields>
	</config>
</install>
components/com_acymailing/extensions/plg_acymailing_contentplugin/contentplugin.php000060400000006166152453623450025453 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class plgAcymailingContentplugin extends JPlugin
{

	function __construct(&$subject, $config){
		parent::__construct($subject, $config);

		if(!isset($this->params)){
			$plugin = JPluginHelper::getPlugin('acymailing', 'contentplugin');
			$this->params = new acyParameter( $plugin->params );
		}

		$this->paramsContent = JComponentHelper::getParams('com_content');
		acymailing_importPlugin('content');

		$excludedHandlers = array('plgContentEmailCloak','pluginImageShow');
		$excludedNames = array('system' => array('SEOGenerator','SEOSimple'), 'content' => array('webeecomment','highslide','smartresizer','phocagallery'));
		$excludedType = array_keys($excludedNames);

		if(!ACYMAILING_J16){
			$this->dispatcherContent = JDispatcher::getInstance();
			foreach ($this->dispatcherContent->_observers as $id => $observer){
				if (is_array($observer) AND in_array($observer['handler'],$excludedHandlers)){
					$this->dispatcherContent->_observers[$id]['event'] = '';
				}elseif(is_object($observer)){
					if(in_array($observer->_type,$excludedType) AND in_array($observer->_name,$excludedNames[$observer->_type])){
						$this->dispatcherContent->_observers[$id] = null;
					}
				}
			}
		}

		if(!class_exists('JSite')) include_once(ACYMAILING_ROOT.'includes'.DS.'application.php');

	}

	function acymailing_replacetags(&$email,$send = true){

		$art = new stdClass();
		$art->title = $email->subject;
		$art->introtext = $email->body;
		$art->fulltext = $email->body;
		$art->attribs = '';
		$art->state=1;
		$art->created_by=@$email->userid;
		$art->images = '';
		$art->id = 0;
		$art->section = 0;
		$art->catid = 0;

		$context = 'com_acymailing';


		try{
			if(!empty($email->body)){
				$art->text = $email->body;
				if(!ACYMAILING_J16){
					$resultsPlugin = acymailing_trigger('onPrepareContent', array(&$art, &$this->paramsContent, 0));
				}else{
					if($send) $art->text .= '{emailcloak=off}';
					$resultsPlugin = acymailing_trigger('onContentPrepare', array($context, &$art, &$this->paramsContent, 0));
					if($send) $art->text = str_replace(array('{emailcloak=off}','{* emailcloak=off}'),'',$art->text);
				}
				$email->body = $art->text;
			}
			if(!empty($email->altbody)){
				$art->text = $email->altbody;
				if(!ACYMAILING_J16){
					$resultsPlugin = acymailing_trigger('onPrepareContent', array(&$art, &$this->paramsContent, 0));
				}else{
					if($send) $art->text .= '{emailcloak=off}';
					$resultsPlugin = acymailing_trigger('onContentPrepare', array ($context,&$art, &$this->paramsContent, 0 ));
					if($send) $art->text = str_replace(array('{emailcloak=off}','{* emailcloak=off}'),'',$art->text);
				}
				$email->altbody = $art->text;
			}
		}catch(Exception $e){
			acymailing_display(array('An error occured with the AcyMailing contentplugin plugin, you may want to disable it from the AcyMailing configuration page',$e->getMessage()),'error');
		}

	}
}//endclass
components/com_acymailing/extensions/plg_acymailing_contentplugin/index.html000060400000000054152453623450024034 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_editors_acyeditor/index.html000060400000000054152453623450022462 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor.php000060400000017041152453623450023165 0ustar00<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.9.6
 * @author	acyba.com
 * @copyright	(C) 2009-2018 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */

defined('_JEXEC') or die('Restricted access');
?><?php

class plgEditorAcyEditor extends JPlugin
{

	function __construct(&$subject, $config){
		parent::__construct($subject, $config);

		include_once(rtrim(JPATH_ADMINISTRATOR,DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.'components'.DIRECTORY_SEPARATOR.'com_acymailing'.DIRECTORY_SEPARATOR.'helpers'.DIRECTORY_SEPARATOR.'helper.php');

		if(!isset($this->params)){
			$plugin = JPluginHelper::getPlugin('acymailing', 'acyeditor');
			$this->params = new acyParameter( $plugin->params );
		}
	}


	public function onInit()
	{
		acymailing_addScript(false, ACYMAILING_JS.'acyeditor.js?v='.@filemtime(ACYMAILING_MEDIA.'js'.DS.'acyeditor.js'));

		$websiteurl = rtrim(acymailing_rootURI(),'/').'/';

		acymailing_addStyle(false, $websiteurl.'plugins/editors/acyeditor/acyeditor/css/acyeditor.css?v='.@filemtime(JPATH_SITE.DS.'plugins'.DS.'editors'.DS.'acyeditor'.DS.'acyeditor'.DS.'css'.DS.'acyeditor.css'));

		if (ACYMAILING_J16){
			acymailing_addScript(false, $websiteurl.'plugins/editors/acyeditor/acyeditor/ckeditor/ckeditor.js?v='.@filemtime(ACYMAILING_ROOT.'plugins'.DS.'editors'.DS.'acyeditor'.DS.'acyeditor'.DS.'ckeditor'.DS.'ckeditor.js'));
		} else{
			acymailing_addScript(false, $websiteurl.'plugins/editors/acyeditor/ckeditor/ckeditor.js?v='.@filemtime(ACYMAILING_ROOT.'plugins'.DS.'editors'.DS.'acyeditor'.DS.'ckeditor'.DS.'ckeditor.js'));
		}
		acymailing_addScript(false, $websiteurl.'media/com_acymailing/js/jquery/jquery-1.9.1.min.js?v='.@filemtime(ACYMAILING_ROOT.'media'.DS.'com_acymailing'.DS.'js'.DS.'jquery'.DS.'jquery-1.9.1.min.js'));
		acymailing_addStyle(false, $websiteurl.'media/com_acymailing/js/colorpicker/css/colorpicker.css?v='.@filemtime(ACYMAILING_ROOT.'media'.DS.'com_acymailing'.DS.'js'.DS.'colorpicker'.DS.'css'.DS.'colorpicker.css'));
		acymailing_addScript(false, $websiteurl.'media/com_acymailing/js/colorpicker/js/colorpicker.js?v='.@filemtime(ACYMAILING_ROOT.'media'.DS.'com_acymailing'.DS.'js'.DS.'colorpicker'.DS.'js'.DS.'colorpicker.js'));
		acymailing_addScript(false, $websiteurl.'media/com_acymailing/js/jquery/jquery-ui.min.js?v='.@filemtime(ACYMAILING_ROOT.'media'.DS.'com_acymailing'.DS.'js'.DS.'jquery'.DS.'jquery-ui.min.js'));
		return '';
	}

	function onSave()
	{
		return;
	}

	function onGetContent($id)
	{
		return "AcyGetData();\n";
	}

	function onSetContent($id, $html)
	{
		$idIframe = "#".$id."_ifr";
		$initialisation = $this->GetInitialisationFunction($id);

		return "document.getElementById('$id').value = $html;$initialisation";
	}

	function onGetInsertMethod($id)
	{
		static $done = false;

		if($done) return true;
		$done = true;

		$js = "\tfunction jInsertEditorText(text, editor) {
				insertAtCursor(document.getElementById(editor), text);
				}";
		acymailing_addScript(true, $js);

		return true;
	}

	function onDisplay($name, $content, $width, $height, $col, $row, $buttons = true, $id = null, $asset = null, $author = null, $params = array())
	{
		if (empty($id)) {
			$id = $name;
		}

		if (is_numeric($width)) {
			$width .= 'px';
		}

		if (is_numeric($height)) {
			$height .= 'px';
		}

		$idIframe = $id."_ifr";
		$initialisation = $this->GetInitialisationFunction($id);

		$contentAvecOnClick = htmlspecialchars_decode($content);
		$editor  = "<textarea name=\"$name\" id=\"$id\" cols=\"$col\" rows=\"$row\" style=\"width:$width; height:$height;display:none\">$content</textarea>\n
					<script type=\"text/javascript\">
						$initialisation
					</script>";

		return $editor;
	}

	function GetInitialisationFunction($id)
	{

		$texteSuppression = acymailing_translation('ACYEDITOR_DELETEAREA');
		$tooltipSuppression = acymailing_translation('ACY_DELETE');
		$tooltipEdition = acymailing_translation('ACY_EDIT');
		$urlBase = acymailing_rootURI();
		$urlAdminBase = acymailing_baseURI();
		$cssurl = acymailing_getVar('none', 'acycssfile');
		$forceComplet = (acymailing_getVar('cmd', 'option') != 'com_acymailing' || acymailing_getVar('cmd', 'ctrl') == 'template' || acymailing_getVar('cmd', 'ctrl') == 'list');
		$modeList = (acymailing_getVar('cmd', 'option') == 'com_acymailing' && acymailing_getVar('cmd', 'ctrl') == 'list');
		$modeTemplate = (acymailing_getVar('cmd', 'option') == 'com_acymailing' && acymailing_getVar('cmd', 'ctrl') == 'template');
		$modeArticle = (acymailing_getVar('cmd', 'option') == 'com_content' && acymailing_getVar('cmd', 'view') == 'article');
		$joomla2_5 = ACYMAILING_J16;
		$joomla3 = ACYMAILING_J30;
		$titleTemplateDelete = acymailing_translation('ACYEDITOR_TEMPLATEDELETE');
		$titleTemplateText = acymailing_translation('ACYEDITOR_TEMPLATETEXT');
		$titleTemplatePicture = acymailing_translation('ACYEDITOR_TEMPLATEPICTURE');
		$titleShowAreas = acymailing_translation('ACYEDITOR_SHOWAREAS');
		$isBack = 0;
		if(acymailing_isAdmin()){
			$isBack = 1;
		};
		$tagAllowed = 0;
		$config = acymailing_config();
		if(acymailing_getVar('cmd', 'option') == 'com_acymailing'
		&& acymailing_getVar('cmd', 'ctrl') != 'list'
		&& acymailing_getVar('cmd', 'ctrl') != 'campaign'
		&& acymailing_isAllowed($config->get('acl_tags_view','all'))
		&& acymailing_getVar('cmd', 'tmpl') != 'component'){
			$tagAllowed = 1;
		}
		$type = 'news';
		if(acymailing_getVar('cmd', 'ctrl') == 'autonews' || acymailing_getVar('cmd', 'ctrl') == 'followup'){
			$type = acymailing_getVar('cmd', 'ctrl');
		}

		$pasteType = $this->params->get('pasteType', 'plain');
		$enterMode = $this->params->get('enterMode', 'br');
		$inlineSource = $this->params->get('inlineSource', 1);

		$js = "
		acyEnterMode='".$enterMode."';
		pasteType='".$pasteType."';
		urlSite='".$urlBase."';
		defaultText='".str_replace("'", "\'", acymailing_translation('ACYEDITOR_DEFAULTTEXT'))."';
		titleBtnMore='".str_replace("'", "\'", acymailing_translation('ACYEDITOR_TEMPLATEMORE'))."';
		titleBtnDupliAfter='".str_replace("'", "\'", acymailing_translation('ACYEDITOR_DUPLICATE_AFTER'))."';
		tooltipInitAreas='".str_replace("'", "\'", acymailing_translation('ACYEDITOR_REINIT_ZONE_TOOLTIP'))."';
		confirmInitAreas='".str_replace("'", "\'", acymailing_translation('ACYEDITOR_REINIT_ZONE_CONFIRMATION'))."';
		tooltipTemplateSortable='".str_replace("'", "\'", acymailing_translation('ACYEDITOR_SORTABLE_AREA_TOOLTIP'))."';
		var bgroundColorTxt='".str_replace("'", "\'", acymailing_translation('BACKGROUND_COLOUR'))."';
		var confirmDeleteBtnTxt='".str_replace("'", "\'", acymailing_translation('ACY_DELETE'))."';
		var confirmCancelBtnTxt='".str_replace("'", "\'", acymailing_translation('ACY_CANCEL'))."';
		inlineSource='".$inlineSource."';
		var emojis = false;
		";

		$installedPlugin = JPluginHelper::getPlugin('acymailing', 'emojis');
		if(!empty($installedPlugin)) {
			$params = new acyParameter($installedPlugin->params);
			if(JPluginHelper::isEnabled('acymailing', 'emojis') && $params->get('editor', 1) == 1) {
				$js .= "emojis = true;";
			}
		}

		acymailing_addScript(true, $js);

		$ckEditorFileVersion = @filemtime(ACYMAILING_ROOT.'plugins'.DS.'editors'.DS.'acyeditor'.DS.'acyeditor'.DS.'ckeditor'.DS.'ckeditor.js');
		return "Initialisation(\"$id\", \"$type\", \"$urlBase\", \"$urlAdminBase\", \"$cssurl\", \"$forceComplet\", \"$modeList\", \"$modeTemplate\", \"$modeArticle\", \"$joomla2_5\", \"$joomla3\", \"$isBack\", \"$tagAllowed\", \"$texteSuppression\", \"$tooltipSuppression\", \"$tooltipEdition\", \"$titleTemplateDelete\", \"$titleTemplateText\", \"$titleTemplatePicture\", \"$titleShowAreas\", \"$ckEditorFileVersion\");\n";
	}
}

components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor.xml000060400000005057152453623450023202 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/plugin-install.dtd">
<install type="plugin" version="1.5" method="upgrade" group="editors">
	<name>AcyMailing Editor</name>
	<creationDate>March 2018</creationDate>
	<version>5.9.6</version>
	<author>Acyba</author>
	<authorEmail>dev@acyba.com</authorEmail>
	<authorUrl>http://www.acyba.com</authorUrl>
	<copyright>Copyright (C) 2009-2018 ACYBA SAS - All rights reserved.</copyright>
	<license>GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html</license>
	<description>This editor will make your life easier when writing Newsletters with AcyMailing</description>
	<files>
		<filename plugin="acyeditor">acyeditor.php</filename>
		<folder>acyeditor</folder>
	</files>
	<params addpath="/components/com_acymailing/params">
		<param name="pasteType" type="radio" default="plain" label="Copy/paste type" description="Choose the way you want to paste text in your newsletter">
			<option value="plain">Plain text</option>
			<option value="simpleStyle">Simple styles from word</option>
		</param>
		<param name="enterMode" type="radio" default="br" label="Behaviour of the Enter key" description="Choose the separator when pressing the enter key">
			<option value="p">p</option>
			<option value="br">br</option>
			<option value="div">div</option>
		</param>
		<param name="inlineSource" type="radio" default="1" label="Display source button for inline editor" description="Choose to display the source button for the editor inb inline mode">
			<option value="0">No</option>
			<option value="1">Yes</option>
		</param>
	</params>
	<config>
		<fields name="params" addfieldpath="/components/com_acymailing/params">
			<fieldset name="basic">
				<field name="pasteType" type="radio" default="plain" label="Copy/paste type" description="Choose the way you want to paste text in your newsletter">
					<option value="plain">Plain text</option>
					<option value="simpleStyle">Simple styles from word</option>
				</field>
				<field name="enterMode" type="radio" default="br" label="Behaviour of the Enter key" description="Choose the separator when pressing the enter key">
					<option value="p">p</option>
					<option value="br">br</option>
					<option value="div">div</option>
				</field>
				<field name="inlineSource" type="radio" default="1" label="Display source button for inline editor" description="Choose to display the source button for the editor inb inline mode">
					<option value="0">No</option>
					<option value="1">Yes</option>
				</field>
			</fieldset>
		</fields>
	</config>
</install>

components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/images/arrow2.png000060400000002776152453623450025654 0ustar00�PNG


IHDRL�n�tEXtSoftwareAdobe ImageReadyq�e<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS6 (Windows)" xmpMM:InstanceID="xmp.iid:01576FDDED7B11E49FE4D5385305D429" xmpMM:DocumentID="xmp.did:01576FDEED7B11E49FE4D5385305D429"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:01576FDBED7B11E49FE4D5385305D429" stRef:documentID="xmp.did:01576FDCED7B11E49FE4D5385305D429"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>��NrIDATx�b���?�@�\@�@��|@�	��� ���(����=������{�@��Z�A1�`���|�b�_��Ι-���K\QR�E�Š8-B�x�1kqq��ĉ��όb �%�b �	;z�'++S��#�B�������1��=ɍ�@lb,]�Xx��2��a���b���ofn�NNV�����CC�o����)�$g�c�ǏKM�6Eb�֭b@�8�@�r00333��������@__�cNn�355�H漁���Z`���6mY�����-;+++�!��L�/_���T�~�'Zp�����Y���������������YX��؁����G���^���3��j1sCC�����ttt�������+����ebZ��111���Ծ���|aaa�����gϞqJIK}SW�� �JN�y��BB��JI��=k���Ϲ��X|}}�-�'��7opN�6M��~~���(YA�����������162z���{�w�ޡ @_~onny`h`�	��))2Ay�Y��ϟ��V����z/""�]3H/0
��ۆLY��v�����i"9>�g1]�c���x�4�*IEND�B`�components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/images/popup_delete_hover.png000060400000002212152453623450030311 0ustar00�PNG


IHDR2=50tEXtSoftwareAdobe ImageReadyq�e<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS6 (Windows)" xmpMM:InstanceID="xmp.iid:25F50BB44AFB11E5872CC6FFBA9ABBBE" xmpMM:DocumentID="xmp.did:25F50BB54AFB11E5872CC6FFBA9ABBBE"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:25F50BB24AFB11E5872CC6FFBA9ABBBE" stRef:documentID="xmp.did:25F50BB34AFB11E5872CC6FFBA9ABBBE"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�J��IDATxڄ�?O1��<"EO�4��q#�¤�&I�nQYHL`�s@�s^��<J~ɧ-�s��3�9�����o���n�����4cL5x�N��,
����2��w�a
=~ƹ���
�(I�ˈ�;HL�ŶvN�~鬾�q�3�1�Q���"3�u���Uկj����~[�m0^/�0l�����᙮�[��B�8����87�7��o��
w��#|b���6��ُM�}�o��IEND�B`�components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/images/edit_picture.png000060400000002067152453623450027111 0ustar00�PNG


IHDRVΎWtEXtSoftwareAdobe ImageReadyq�e<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS6 (Windows)" xmpMM:InstanceID="xmp.iid:8284EF62B06911E4B380A37DD123F96D" xmpMM:DocumentID="xmp.did:8284EF63B06911E4B380A37DD123F96D"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:8284EF60B06911E4B380A37DD123F96D" stRef:documentID="xmp.did:8284EF61B06911E4B380A37DD123F96D"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>1+L_�IDATx�b�TLTT3��chhH�����c7]@���aT__�q�̙��i�&0�t�R�ؗ/_RSSnݺE~��IJJb8s�������r��m0��ׯ`>Q.i������97�X]
���|�/^0̘1�AEE���fD�k�$����m1�`��R���u�IEND�B`�components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/images/edit_text.png000060400000002221152453623450026412 0ustar00�PNG


IHDR٬tEXtSoftwareAdobe ImageReadyq�e<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS6 (Windows)" xmpMM:InstanceID="xmp.iid:D1024FB3B06811E4A380B4651962F653" xmpMM:DocumentID="xmp.did:D1024FB4B06811E4A380B4651962F653"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:D1024FB1B06811E4A380B4651962F653" stRef:documentID="xmp.did:D1024FB2B06811E4A380B4651962F653"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>��w�IDATx�b���?选�,@���?>|�E�?!���[[[EEŋ/������'AA���(�8~=���\\\���ohh�K1�
I�����ׯ_���*++O�0�������m=@RJJ
�eff�|!	�#**�����4k�,�U�"Y;;���tgg'�=X�a����ԃ�7HX		����:u���۳gϲ�����x�B������~XXP'~=@u��Ǐ_�|ijj����X4������$���t�o�:���p'IEND�B`�components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/images/popup_cancel.png000060400000002156152453623450027100 0ustar00�PNG


IHDR��w&tEXtSoftwareAdobe ImageReadyq�e<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS6 (Windows)" xmpMM:InstanceID="xmp.iid:FE3E210C4AFA11E5BC2FB3422BD422F9" xmpMM:DocumentID="xmp.did:FE3E210D4AFA11E5BC2FB3422BD422F9"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:FE3E210A4AFA11E5BC2FB3422BD422F9" stRef:documentID="xmp.did:FE3E210B4AFA11E5BC2FB3422BD422F9"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>��;o�IDATx�bL�ߦ������(�Lc@��R�@�$��
�%&�)�S��{X��z ΄��|ҭ@\
�#�]����	�@N��9 6B�O:��je'�$v$E?�x"Pa9�W�pH�!)�T��0!)����Pq�b��ː�pJ��ePy��Ӏt.�i��H���Ŗw�AA���(�h"R�����w�x6P!r�1@����.�2L� �IEND�B`�components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/images/param.png000060400000003061152453623450025524 0ustar00�PNG


IHDRo��tEXtSoftwareAdobe ImageReadyq�e<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS6 (Windows)" xmpMM:InstanceID="xmp.iid:EC05C96F254C11E5B6E3BAFE8D3FCFE7" xmpMM:DocumentID="xmp.did:EC05C970254C11E5B6E3BAFE8D3FCFE7"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:EC05C96D254C11E5B6E3BAFE8D3FCFE7" stRef:documentID="xmp.did:EC05C96E254C11E5B6E3BAFE8D3FCFE7"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�T��IDATx�bL,jg�`b�|�`�P������?�3"&�Y������t��}�
��407���7'GAJ(�<}���7Y��p�lh���VSp�1V�����fgc����,�N������/_�cff&F@Env�2��@���w��~�� [NF"��h��?����/^{����o?��8.]��?{�w��.k�_���}��������qss�=���)@ƑS��6M�;�c[U�� ?D%�,dס4c��?A��@�@������Z���	Y=�8t��~����Z[s�����x]GC���(���������_̐�k�rR�L�@��89�dl-�U����șw���{��@�cw���J���2��cbb���D�q�O���c]
)	�K�n�K��||��\>}���K�zg,�����=l�
޽����?=-n.�ū�H���>y��-0��[^�}1�Q�6�&��f wfO���P�詋�2-##��� ���\�4����������G.�$q~`�B�@������T��S
4M\T����$l(�����'h¹p���$�ݺ�� �,j�}���u�1���'/U��E"0��r�#g�/!����� � x$R�̆D"A
(^�hi�IEND�B`�components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/images/editor_zone_picture.png000060400000002264152453623450030504 0ustar00�PNG


IHDRo��tEXtSoftwareAdobe ImageReadyq�e<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS6 (Windows)" xmpMM:InstanceID="xmp.iid:0167BFF5B06C11E487C6CEC55A836C39" xmpMM:DocumentID="xmp.did:0167BFF6B06C11E487C6CEC55A836C39"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:0167BFF3B06C11E487C6CEC55A836C39" stRef:documentID="xmp.did:0167BFF4B06C11E487C6CEC55A836C39"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>ﶖ(IDATx�b�:Ê����J`� €S(+�(Am�}����i3�q��߿�������7###9^����߿����_������g��C5Џ��Ih
3@\�)@��&�3HC�H��C�ll<���E�U�L�2�~���'Q^��?MZ�((p;78��#+���;.�����7MXH�f�
	���"���@<<��Rf���pq0� �.V����bj����2$��,��EET�M^�o�~P�E,,�LL�T0���UP�HR!��.�l "�i��$��5�`!�`v�9�2IEND�B`�components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/images/editor_zone_plus.png000060400000002546152453623450030017 0ustar00�PNG


IHDRo��tEXtSoftwareAdobe ImageReadyq�e<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS6 (Windows)" xmpMM:InstanceID="xmp.iid:57DFBA24B06C11E497D38F6FCDAB583E" xmpMM:DocumentID="xmp.did:57DFBA25B06C11E497D38F6FCDAB583E"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:57DFBA22B06C11E497D38F6FCDAB583E" stRef:documentID="xmp.did:57DFBA23B06C11E497D38F6FCDAB583E"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>u2#��IDATx�bL,jg�`b�5�0`�2�V�	r���q����22���w���{��#֠�P�m��:v�߿����3KAV�� �����%� NN�=O�x�Ȗ�eaa���|�n��-|<,_��������A��caf�K�t�3r�R?~�dgcJ�ܸ���+�f�`�0�G2�bNV�?{�&ke����i�!&ff|Å���ׯ�=��쭻����a����,,,��h
0��������������A@�������t��~���� �_�U䙘�H0��G,�Wo�_�m�����O�R��#g��� "$	oL?��G>����_�y���?VVV[s��O^�)�0���;a������݇ϋVm�Jeň�/_�O���(��I���c�S�w�1�aI�,,��x�%� HH1�/##�E����`�oN..fff*��@�����

L`�kƭ!��IEND�B`�components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/images/editor_zone_drag.png000060400000002613152453623450027744 0ustar00�PNG


IHDRo��tEXtSoftwareAdobe ImageReadyq�e<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS6 (Windows)" xmpMM:InstanceID="xmp.iid:6002D97EB11111E49415D2D3980B09AA" xmpMM:DocumentID="xmp.did:6002D97FB11111E49415D2D3980B09AA"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:6002D97CB11111E49415D2D3980B09AA" stRef:documentID="xmp.did:6002D97DB11111E49415D2D3980B09AA"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>N���IDATx�bL,jg�`b�|��fea	�u2Vo���2
��
�1��������|�I��uT5T�����_muE-��>����4��ϰ�蹝NvUg��ŭ�?���qss���뵿���)�ЌC�/7���!���߿���o��W~>�Y�߿��x� �@O[W[�����tH#!+�rH�aee��b#r	�ur�2��O_�����'�*)I1 ��+ ��򈄘0�ܼ����	��?���ˌ������Y�er*:႓�J�dnU7\dnͥkw�،Ӡ?���~�XO#�`��߿�h���v���������~;p�<�����o!���Ɏ�f��#ĦlFFFAA I|1Z�`�`f�t�*Έ���t�7�����׀I��{��<baf����?s(HN�����
{����ϟ��7������X��z�p�Bl		�D`�Q� b"��2�"���(0o��Z��:\IEND�B`�components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/images/editor_zone_delete.png000060400000002177152453623450030276 0ustar00�PNG


IHDRo��tEXtSoftwareAdobe ImageReadyq�e<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS6 (Windows)" xmpMM:InstanceID="xmp.iid:2DB953D5B06C11E49B42CCAB3AC66869" xmpMM:DocumentID="xmp.did:2DB953D6B06C11E49B42CCAB3AC66869"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:2DB953D3B06C11E49B42CCAB3AC66869" stRef:documentID="xmp.did:2DB953D4B06C11E49B42CCAB3AC66869"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>��r�IDATx�ܔ�
�0��S�?u��:D��9z��=F=G�^�keɦ�����}�6�����	ў!�1�}�ޜ���n:�-��yktX�5T*%Ճ	
�gY��)M��wm'3P��QZi��B�*�E���3MoRb�����)���FI�Ek��}��ď�(V�(�c3�(1J��(mlR5ؚ�QM��|��a�j\C���{���l�d
�=����b�8�e�k��A����L/�E��U��IEND�B`�components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/images/duplicate_after.png000060400000010653152453623450027564 0ustar00�PNG


IHDRY<
2FsRGB���gAMA���a	pHYs���+tEXtSoftwareAdobe ImageReadyq�e<IDATx^�\{p��u��ݕ,ɲ$K�H�����8�i�4P�J���i����NgB��C��0�2M&Ʉ�8�t��35���G�47`lb���¶���+�V����߹�����bY�h�����=����{�V6I�DcccH��0�LX��G�N�]]]p��0E"���~�z8%�B�DQ3�N�:�-[��t���boo/Z[[�"+t�(
axx������	������Bא�+ݵ%�wE����|h��@+ _Z�:�i�޽�m۶��S�X���#812
��¸��
�Hd�/p�M����RN���o߾�9�Lb��玜<n �+�4(����T�h������W�.��l;����,�](��(��
��f���B�R�*<��C圫O�
r,��Gx9���j6�܀�ILf+�\�c�9��`��˙W����N���P�k�ϢH��p�i�\i��\Z�wa��� ̍���Y��Jc��tE.�n���@���F�t�N�|�i�%���W��h�%Q����}��|y���d2C����"�����ũ��j�.5rH-/)ԋ�� L慃���b�o�I�b�_���8#`%_��N�Ž���<�S�_�g��^��3#�G6�Q��f����z��@p��#�۫�
JŚ2"�S��X�U��i��ՐO&�c$�K�հ�զצ�ϋ�]*�R�����q����,�(��l|v�ZW�$ب��[hB���z.-�y�jq��&ѯ&V������M��1�"a���ȴ��L�p�ҳ�*mz^N��L�t�\z��&�T��:
�i�z�˲���zy)��� �Arz�p��&&Ƒ��ʾ�,H4�p	B�|�f@	#�M��7����\��Ȫpybԅ��<�6�vv!h���dg�����6�٬�}3z$-����Y>�r�����=pq�zY���ۛW���O�Wdv�݀5��b_ܔ���Ύ5�aRVo���	�=}h�Գj�����e�v���[�'�E{ ��|�Fyw��)|�=�$.LL�RV�*l�
�\v5�J33R����l����$�gf��[�l"���y�)4�JSc��q�}09]H'3bD`w9�t�9�FV�؎�BP�~���T"��`�sb�n5�3��l�ž��b���)>;K[�U��9l�и��c�j��s)�����[4�4�ľ;89Nr��L����O@s�����eV+��'X0�2��G*���B�|h۝�
R����"��"7~S瀵_��
4��ǿ:�V�S��H�,-�&�H�t�M"�!�tk��Ǔi�ff0�LA�P�iY����D�I9"���D15�����(����BRl>�D6�����f�JY �a���vTg��0��z��R���p�2�&@1/:��'8�q�=�|�n~�x�<�2��/���"C���Q��{s�2!U��Pd�P-�|�=OҠ��s;G&p�a��D�j����iY�z�r"[%G�<e%�(+i��l��i�|�l����z	d��B�؇R��t
�tF�f5��؊����;�9�,R�(Ɔi�#�/�*���ŭd��&�@��dTw��";g�Y��\&t{T��R���(�&Ε(���ˇ�3�q��ذA�J����F�a���O0��G��.�ɣ)�`uz`kg���Z�"���~�Г�g!徘�dh���dsj�3����
������d�ͪ��C������0�ۋ<�[������0Z9ئ�0��‚;���~r+�<�
���
h�K�RU�k]�B���|��f��۪��D��+41�M����S�@��e�ʶJ_���6��8R�m�x���,6�J
��;�h���^�,�I��9�����1��2X&K�N����](���l3�T2v'
MA�-j�ʳ�E�ju��.�s�T���"�Wd�'�\2�m���n���H����(1O������V�P)�����e?�R>�<z�dڳgO��{�Un���F7�f5�/��{,�6k��;���y'��ƹ��[4���r'QK�w�mX�A@x~���Q�㑇Tx��h�xa�x
��?S�+Y/Ǎ�y�uߊ$�1"B%够N��.�<ȩT�dj@���<�g�	���w����a9Im "P2�h<�5�M16>��شQy!:��RG�"?$�V�
�#:"�O�Mcvn��$����+�
d����GR0M@�����f�&DY.�K�Py#i"
h�����:�/s�S���d��cI ����ξH�L�o�Kx~��xN#@�H����Q Wm|"�ks-K���'�q�ٟ��w��!���5R�_�sc�>6�3���x�����(���t��֏!� �_���G�
�DRU�Fu��,�A�^�ȕt��3cc��U�X�C����F"��1<6�<���K�C3聥��-_E��A.����ɨ�U��4�P�=�r�8+#�/�e^�AX�C��+\��e�,�BG�]�����k�1���N��	ײNi:��ִs�kV/B�M)�j�;-����zw�nG79��j�d�/7�VoA:ō�^�Q��Te.�.��z��ާ~�zչ�����5[B��<
�F�*���\t�>�����[�}��cu�d�H�F�C��͘����U�B2���ڊkY_r�=4:�x"�J&C�.���,w�3��6z����|tm7n�ʴ0]~Rk��F힓7*⻑����c��-��'I��e�O�����^�k��'��	ʲ��#��re~���&��Wa��OP�<0��b�#_�F%��؍�b��H��l���3$�৛cgh*=����	�G�aM����<B�L�!!tW�*����A�u�.�Ȋ�\�iI +�l.�W���ў��V唁^��]��A����s��,����ɠA�!A��.ow�v�|����:U@�'h�F�q�'o���ԫt18����6���5�"`�

�Z�ȓB�gZ�3:�熹�̱T},c#U@��ɥ�d̋�=��3���;()�Y}�����eŖզ��k�Jr�2�i��ư����gO<�/|�Q���Cpu�p�/u�x�
|��—��<�ő��ag�U��X��i���b,��\j�����.�5D��S�u:�v��z���fn�n;�~.�ҳO�9�E&e��f�ٹ��N��Bnr�h����\�R_SYNXꓲ�m��aIҼN'l�TñY=qGN��O�2N�=�,�a"�!�:~g����؜:�X
>F��Y��G+Dz�{���~����݅}��##�������j3t~X=�]�@��
-����C3OϠ�ُH$�3��c*���nX݆q���8q�|�p��Ȁgd�"������bhr9195�a�99��au+N�>��]d��־u�4&Y����9�Z�������94y�hk	���d|K�͉�`�ޓs���qz�����R� D'O���)ϡ���#Yz�X_�~��c�����ac�~{�&���v�:��S��m�
s��/��
gv�@��&q��C�C^������G�TЯ
�o��ш*�!�k�ڰ��G8�G9i����.l��&�y��	��f��n݌
���~����#w�v+�9
��G���Â��������`�������{`e��Lk�[�қZ#����56�޽��c�\�xQ���*�5�U�_^���L^��g�8���Jv�@=�@se
ʙsR��I��Е*p ��^Y�41J����F�2�	vٌ��x\����Zy=!�e����Z�G��q�qevpRļI?"4i�~6Y�)����_�<���r�x�V���?�.1�f��	���X�R��'�%����s�A^
�ڕ�i09��I��Y�8�[Rr,'~�)Y��T�K��@E��G�>c?�6�r���i>���.<���m	���o|���Q��y�$mA&&%_P'�_
��u@tP���rҰ<�f���IY�N�U���[f��~���ir5����K�-V3�4ENVv#�+�W�:ɽjK4y���M~?3�H$x�)�Ec8;2
MMk�	�4&�ոT-�5yϞ=%M2������:q�m��g6߂�z{�r@�~H�Qǖ��d��
��PX�ȑ$��W��47G1c�W��RX�R@���+�,[�M`Nܮ����$��e 4M��ܹs0�):t����хZ���B�$Z,��9�g����2��C�FP��n�W��IlrKK����v��ŀ
�w�IEND�B`�components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/images/popup_cancel_hover.png000060400000001762152453623450030305 0ustar00�PNG


IHDR��w&tEXtSoftwareAdobe ImageReadyq�e<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS6 (Windows)" xmpMM:InstanceID="xmp.iid:090B06934AFB11E5A67AED1359B9D3AA" xmpMM:DocumentID="xmp.did:090B06944AFB11E5A67AED1359B9D3AA"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:090B06914AFB11E5A67AED1359B9D3AA" stRef:documentID="xmp.did:090B06924AFB11E5A67AED1359B9D3AA"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>n���fIDATx�b����6��Y@̀ς�k�8�#�4��䞃��G-@�	���4�	�hg� yd+;����Pqt� |M�Edy�L&��$�I�Lt�
��ˇ�}IEND�B`�components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/images/select.png000060400000001006152453623450025700 0ustar00�PNG


IHDR$$���	pHYs�� cHRMz-�����RqE�f9!�'�V�IDATx��J�@E�K�*Ԥ-���q�_�•��ʅ_Խ+���A	�ibAM���`[�iZȅ�<�̙��Kr����-�h���;�@ "�q��Q�"`$"�c
E�`��(sM�p	��2�'0.�7��Z�Dk}�ͤ�(����$I��T������ֆ��)��1p��x[�H���$���
TsI��Vϭ�qp<�B�Z�?�_}b`��X�Q�
S	T�@%P	Tm;���\���c�@<<>��n�~��9@�*PκOf��
4��C�W迌E}f�Ƙ�ʹRI�~��ݮ�*?�h�H$�]��f��4�.�(Wń
'���
8ZS�p����6ˇN�c"��Na�<4*&�:���ֺ
�Dd�2ć����<�/y�ķPdIEND�B`�components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/images/popup_delete.png000060400000002231152453623450027107 0ustar00�PNG


IHDR2=50tEXtSoftwareAdobe ImageReadyq�e<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS6 (Windows)" xmpMM:InstanceID="xmp.iid:1B686E6A4AFB11E5A199A66C9913D4EE" xmpMM:DocumentID="xmp.did:1B686E6B4AFB11E5A199A66C9913D4EE"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:1B686E684AFB11E5A199A66C9913D4EE" stRef:documentID="xmp.did:1B686E694AFB11E5A199A66C9913D4EE"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>��Ol
IDATxڄ�?NBA�q�A""J�J"�;`��W �
��P�yc#�X���ĂF-5�W,��w�݄�I>쾙a��8�}l���K
����~��`Zw��i\�U�`|YC�Z�	�q���mj5{�B���p���zm�Oh��#|c�H��؎��@=5���UM�^��g��+��W9U�G����H�e������9�g���3�s#lv�a�@Wg?�S�5V~�y�)^�r��u�c	Mݿ��pro(b�glii��?�?rF0��IEND�B`�components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/images/close_icon.png000060400000001114152453623450026536 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<�IDATxڤ��JQƿ���Ԍ���M�6J�M@T����m}���t�BD�E�E(
B]u�`���teCI&��d�������=��3gn�$I�?�82�8i��m���N�Le?�\�Z�̭�|\.�2��O��m�y�S��~8�vE���^��Ⱥ�/����VW�7����l@��MS��Vvz�X��$�f͐n,�*7�M,�˪?9~,�&�a�/���j�p�����2�;8P�Ŧi���R�2�470�ab¶�7=���	,�R��g��v�h7�0P{^�;����oO&�3�lJ����a,��?=�!P��D�~ǒTLs�!d���f�������2`m^])�ԡ�H�oޖJ
� x�bV5�W��r�.���D�<#����S��w�u�`�k�q��iX�t{�nGQ~F�6���t���E��@�བྷ���~
(R�j�Q��s���ـ:�D��s.�a�������IEND�B`�components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/images/arrow1.png000060400000002741152453623450025643 0ustar00�PNG


IHDRL�n�tEXtSoftwareAdobe ImageReadyq�e<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS6 (Windows)" xmpMM:InstanceID="xmp.iid:16FEF96EED7B11E4A268DD41B63C8E86" xmpMM:DocumentID="xmp.did:16FEF96FED7B11E4A268DD41B63C8E86"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:16FEF96CED7B11E4A268DD41B63C8E86" stRef:documentID="xmp.did:16FEF96DED7B11E4A268DD41B63C8E86"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>O��UIDATx�b���?�@*���@��*@��
@�
]#�>��B ƣ�-��jY��ĂYPL���/_�d�;g�ȯ_��8ԋ�AqZ�Kd[__�\Yi���'OXѤ����\�}�X�$?�_^^�ǎ..)R9y��4?{��S��Y��ߌgϞ�:u�$Ͻ{�8O�>%����������'))�IhX�[��@�M��ہXƹq�G_o�Թsg��F1-Z����������_��?2899�:���sP!'�W�\�,*�Wz�-'�w@�2���-ea`bb�ЌL��������������#��{�����Ad)7''+ؗ A����YXY�]�_yyy���'�� �����f^q	�?��z_455��������%Kd�����cNNο1�я}|}aq|�\����ݻ---?�<����Z�8o�\�?��URR������������Z��S,,,EBB�����E�|��
�۷o�]\\�e��>�����M�))2=���A�^�~Ųu��Ȩ�7�Ćnxoв���	T
Q;M���Z�].ֲw�rIEND�B`�components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/images/editor_zone_text.png000060400000002435152453623450030015 0ustar00�PNG


IHDRo��tEXtSoftwareAdobe ImageReadyq�e<"iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS6 (Windows)" xmpMM:InstanceID="xmp.iid:E13D5E7BB06B11E49E70FD20254DEB2A" xmpMM:DocumentID="xmp.did:E13D5E7CB06B11E49E70FD20254DEB2A"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:E13D5E79B06B11E49E70FD20254DEB2A" stRef:documentID="xmp.did:E13D5E7AB06B11E49E70FD20254DEB2A"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�o��IDATx�b�:Ê����J`� (�74��*�B�A����ظ����9.�����z}#���橫B��89|���+_��v����>��ŋw��%� nn���|��@��k˫W7&L�z��o?�<y�����#n1?��r�ӧ��]���whР/_���3��S��w2?��{��ޅ�3������?@o�4����#�)gή^���߿��c7"ޞ=�T���;a��I�� � w�VAA �߿��ה�>�����Ī o}���?>���m��8bL��"QU/�������v�کׯ���t�������[�7����U��l9pp�߿Iʆ�͙���G*#��L@D���9edĀ$
6������$�1���9
 �0v�Z���IEND�B`�components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/images/index.html000060400000000054152453623450025712 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/index.html000060400000000037152453623450024446 0ustar00<!DOCTYPE html><title></title>
components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/css/acyeditor_template.css000060400000001172152453623450027632 0ustar00.acyeditor_delete {
	outline: 1px dashed #ab2e39;
}

.acyeditor_text{
	background:url(../images/edit_text.png) no-repeat top right;
	outline: 2px dotted #cbcf46;
}

.acyeditor_picture{
	background:url(../images/edit_picture.png) no-repeat top right;
	outline: 2px dotted #cbcf46;
}

.acyeditor_delete.acyeditor_text, .acyeditor_delete.acyeditor_picture {
	border: 1px dashed #ab2e39;
}

.acyeditor_picture img{
	opacity:0.5;
	-moz-opacity: 0.5;
	-khtml-opacity: 0.5;
	opacity: 0.5;
	-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
	filter: alpha(opacity=50);
}

.acyeditor_sortable{
	outline: 3px double #5290db;
}
components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/css/index.html000060400000000054152453623450025235 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/css/acyeditor.css000060400000013144152453623450025741 0ustar00.acyeditor_text, .acyeditor_picture{
	cursor: pointer;
}

tr.acyeditor_delete td.acyeditor_text:hover, tr.acyeditor_delete td.acyeditor_picture:hover{
	outline: 2px dotted #cbcf46;
}

.acyeditor_zoneeditionsuppression:hover{
	outline: 3px double #5290db;
}

.acyeditor_zoneeditionsuppression{
	display: none;
	top: 0px;
	left: 0px;
}

.acyeditor_zoneeditdelete{
	cursor: pointer;
	width: 100px;
	height: 26px;
	right: 0px;
}

.acyeditor_editdelete{
	cursor: pointer;
	background-image: url(../images/editor_zone_delete.png);
	width: 24px;
	height: 24px;
	float: right;
}

.acyeditor_edittext{
	cursor: pointer;
	background-image: url(../images/editor_zone_text.png);
	width: 24px;
	height: 24px;
}

.acyeditor_editpicture{
	cursor: pointer;
	background-image: url(../images/editor_zone_picture.png);
	width: 24px;
	height: 24px;
}

.acyeditor_btnplus{
	cursor: pointer;
	background-image: url(../images/editor_zone_plus.png);
	width: 24px;
	height: 24px;
	right: 24px;
	float: right;
}

.acyeditor_btnmore{
	cursor: pointer;
	background-image: url(../images/param.png);
	width: 24px;
	height: 24px;
	right: 24px;
	float: right;
}

.acyeditor_btnmove{
	cursor: move;
	background-image: url(../images/editor_zone_drag.png);
	width: 24px;
	height: 24px;
	right: 48px;
	float: right;
}

#legendBground{
	width: 70px;
	margin: 5px;
	float: left;
	font-size: 11px;
	color: black;
	line-height: normal;
	font-family: Verdana, Arial, Helvetica, sans-serif;
}

#colorSelector{
	cursor: pointer;
	width: 15px;
	height: 15px;
	float: right;
	margin: 5px;
}

#colorSelectorInput{
	width: 70px;
	height: 100%;
	border: none;
	padding: 5px;
}

#colorSelectorContainer{
	margin: 4px;
	display: inline-block;
	background-color: #cacaca;
	height: 25px;
	border: solid 1px #B0B0B0;
	border-radius: 2px;
}

tr.acyeditor_delete:hover td.acyeditor_enedition .acyeditor_zoneeditionsuppression{
	display: none;
}

.acyeditor_delete:not(.acyeditor_enedition):hover .acyeditor_zoneeditionsuppression, .acyeditor_text:not(.acyeditor_enedition):hover .acyeditor_zoneeditionsuppression, .acyeditor_picture:not(.acyeditor_enedition):hover .acyeditor_zoneeditionsuppression{
	display: block;
}

.acyeditor_zoneeditionsuppressionhover{
	display: block;
}

.acyeditor_copyButton{
	cursor: pointer;
	width: 100px;
	height: 60px;
	z-index: 998;
}

.acyeditor_copyButtonAfter{
	background-image: url(../images/duplicate_after.png);
	background-size: 100px 60px;
	background-repeat: no-repeat;
	float: right;
	z-index: 999;
}

.acyeditor_action{
	z-index: 998;
	cursor: pointer;
	height: 35px;
	display: inline-block;
	background-color: white;
	border: 1px solid #CCCCCC;
	width: auto;
}

.acyeditor_closebutton{
	cursor: pointer;
	width: 16px;
	height: 16px;
	background-image: url(../images/close_icon.png);
	background-size: 16px 16px;
	position: relative;
	float: right;
	z-index: 999;
}

.acyeditor_mask{
	z-index: 997;
	top: 0px;
	left: 0px;
}

.placeholder{
	outline: 2px dashed #444;
	height: 60px;
	width: auto;
	-moz-box-shadow: 0px 0px 4px 2px #ffffff;
	-webkit-box-shadow: 0px 0px 4px 2px #ffffff;
	-o-box-shadow: 0px 0px 4px 2px #ffffff;
	box-shadow: 0px 0px 4px 2px #ffffff;
	filter: progid:DXImageTransform.Microsoft.Shadow(color=#ffffff, Direction=NaN, Strength=4);
}

tr.ui-sortable-helper .acyeditor_zoneeditionsuppression{
	display: none !important;
}

tr.ui-sortable-helper{
	opacity: 0.8;
	outline: 1px solid #5290db;
	box-shadow: 1px 1px 6px #999;
}

.placeholder:after{
	content: url(../images/arrow2.png);
	position: relative;
	left: 10px;
	top: 20px;
	display: block;
	width: 0px;
}

.placeholder:before{
	content: url(../images/arrow1.png);
	position: relative;
	right: 40px;
	top: 20px;
	display: block;
	width: 0px;
}

.cke_source{
	white-space: pre-wrap !important;
}

.confirmCancel{
	color: #6190b9;
	padding: 10px 15px 10px 25px;
	font-weight: bold;
	font-size: 13px;
	text-transform: uppercase;
	border: 1px solid #93b7d6;
	border-bottom: 2px solid #93b7d6;
	border-radius: 5px;
	-moz-border-radius: 5px;
	-webkit-border-radius: 5px;
	margin: 15px 5px 0px 50px;
	cursor: pointer;
	background: #fff url(../images/popup_cancel.png) no-repeat 10% 50%;
	width: 100px;
	float: left;
}

.confirmCancel:hover{
	border: 1px solid #8baac7;
	border-bottom: 2px solid #678fb6;
	background: #adc7e0 url(../images/popup_cancel_hover.png) no-repeat 10% 50%;
	color: #fff;
	text-shadow: 1px 1px 2px #5a89b7;
	-moz-text-shadow: 1px 1px 2px #5a89b7;
	-webkit-text-shadow: 1px 1px 2px #5a89b7;
}

.confirmOk{
	color: #dc5d55;
	padding: 10px 25px 10px 15px;
	font-weight: bold;
	font-size: 13px;
	text-transform: uppercase;
	border: 1px solid #eeb6b3;
	border-bottom: 2px solid #eeb6b3;
	border-radius: 5px;
	-moz-border-radius: 5px;
	-webkit-border-radius: 5px;
	margin: 15px 50px 0px 5px;
	cursor: pointer;
	background: #fff url(../images/popup_delete.png) no-repeat 90% 45%;
	width: 100px;
	float: right;
}

.confirmOk:hover{
	border: 1px solid #d4615b;
	border-bottom: 2px solid #b13e38;
	background: #eb837d url(../images/popup_delete_hover.png) no-repeat 90% 45%;
	color: #fff;
	text-shadow: 1px 1px 2px #c54e48;
	-moz-text-shadow: 1px 1px 2px #c54e48;
	-webkit-text-shadow: 1px 1px 2px #c54e48;
}

#confirmBox{
	width: 370px;
	height: 100px;
	background: rgba(255, 255, 255, 0.8);
	border: 1px solid #d6d6d6;
	padding: 5px;
	border-radius: 5px;
	box-shadow: 1px 1px 5px #dddddd;
	-moz-box-shadow: 1px 1px 5px #dddddd;
	-webkit-box-shadow: 1px 1px 5px #dddddd;
	position: absolute;
	z-index: 999;
}

#acy_popup_content{
	background-color: #fff;
	padding: 20px;
	text-align: center;
	color: #706f6f;
	height: 60px;
}

div[name="emojipopup"] .cke_dialog_ui_vbox_child div.cke_dialog_ui_html{
	height: 250px;
	overflow-y: auto;
	overflow-x: hidden;
}
extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/acymediabrowser/icon-16-mediabr000060400000000753152453623450033544 0ustar00components/com_acymailing�PNG


IHDR�abKGD�������	pHYs��tIME�8���MxIDAT8�œ?�a�����O��u7���B@ld����~�+r�"�'H�"�s� b%�D�.(
ﻓf�́Db����w�g�y�wH����$IPU�/�1�v��E�ND~���-�,;��z�������A`�f���b��9�N�50���@UoU�IUoOԼ>���n�h4Ω���<��}��sl�����]�W��}M��z0��g ���G<�+��0�G��M�Z��T*�Oi���ֲ����Z��MD�F��ȮV���f�x<�]���|>��j��v1Ơ�8��f�a�^�\.��by�I�Ļݎ<��( �2�<�@᝗V�km��d�*�
#=30�ni�K��7�`��)��8IEND�B`�com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/acymediabrowser/plugin.js000060400000002323152453623450032673 0ustar00components(function() {
	var a= {
		exec:function(editor){
			if (parent.IeCursorFix)
			{
				parent.IeCursorFix();
			}
			if (parent.SetIgnoreDeselection)
			{
				parent.SetIgnoreDeselection();
			}
			var itemElement = document.getElementById('AcyLienMediaBrowser');
			if (itemElement)
			{
				if (FireClick)
					FireClick(itemElement);
			}else if(parent.FireClick)
			{
				var itemElement = parent.document.getElementById('AcyLienMediaBrowser');
				parent.FireClick(itemElement);
			}

		}
	},
	b='acymediabrowser';
	CKEDITOR.plugins.add(b,{
		init:function(editor){
			editor.addCommand(b,a);
			editor.ui.addButton("acymediabrowser",{
				label:editor.lang.acymediabrowser.toolbar,
				icon: this.path.split("/plugins/")[0] + "/media/com_acymailing/images/editor/icon-16-mediabrowser.png",
				command:b,
				toolbar: "insert"
			});

			editor.on('doubleclick', function( evt ){
				var element = evt.data.element;

				if ( element.is( 'img' ) ){
					var itemElement = document.getElementById('AcyLienMediaBrowser');
					if(itemElement){
						FireClick(itemElement);
					}else{
						itemElement = parent.document.getElementById('AcyLienMediaBrowser');
						parent.FireClick(itemElement);
					}
				}
			});
		}
	});
})();
extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/acymediabrowser/index.html000060400000000054152453623450033033 0ustar00components/com_acymailing<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/icons2.png000060400000024063152453623450027646 0ustar00�PNG


IHDRP��� IDATx��}{p���k�<43�G3�Go!$Y�Coa$�Q�#�pH�ݥ�.�w	���u��/Ky�r�8K�˽�f�����x��
666�lc[�,[�y��̹Lw���{fd1�U]�|������q�s����`?�gԩ3u�����}I,���$�� ��$�v��a�cR�5��|w]]�u�ϟ������+V��v�޳g�Vϛ7���o�l��sj� @$�I(P�lٲ�~2d�7����	�Xclcl1�q���H���Ye9^]1�LB�<ov�\;�v;f͚"�SO=�Ƕ��MY	b�"�H����������ᰭ���7�
8��9�V��A����F"�FDc]]]oRYYY�S��&$�I0ƾ��@Yww�vA����h��"���7�c����x���
CCC1"
0ƴ	��q�B!�L&��d��q�V+jjjp��Y�x��C]����0�Lp��H&��d29:11qz�ڵ�…w0�"ٚ��)��lB~����|Ʒ@D����n|>q���u�����(▯��f��A066��g�
[�n��==HDC˗/�E������D%�fe9]�`-c�	Ap�…����'3Ǝ�E�1&��1����w����q�����h3g�|�16�U&��z����M7��v���[o������D4�W(7
��D"q��i�|� ��k�=��T�Y�:��9s����G�A��j�l06c�sAA��$��(��?B��R-i�2%h��s�*���ȪQ.�KjR0`��2��X��*��������������8$	D�Q��q������ܾgϞ��}>�؝w�I˖-�w�y'�L&�������w�ŋӏ�c����kooo����M�я~�H
��Z|���1y��"œ9s@Dؼy3��c��16�{�1֣���۷o?�f͚F�Á��a

ahh(9::�GO;��A��;�>[K��f3�<�L�(D�(�2(ONNb�ڵܞ={���Bp��^�d�i>�z�D�����˗��3g�`Ϟ=r=-��>���g�u3�b��K�p�`�f�J��̞=�x����("���$JKKQ]]���<��3�p�
��ؿ|ӦM�����1LLL����G}49k֬����48O����)"�KD����'����_��Ҡ%����x)
ԭH�p�or�v8'��r���w����A�Z�Gs��s��?

��t�M�Ϸ���~���s�΍:th�Y"Q'=u��77��n\�t�Җ-[>�c쭬0�<��#?�D"�P(��W�\��^�4�����8��8�n��v��=	�����p����|>��h4�;�,--kii!�D=lŔf:�V�l6��q��.�&��D�y�ԩ�>��l��~��~Q������H�$��D�ĥ���s5I$q@D�xME�a����4�}�u{S�T1�I�W?2�>&"�I�u�]W�E �ba�5H_c(:�.�S����g�����8
.��cL���4��)�����1A��4�j�Z`�	�R,�1�1/!�|F�E���l^��@��ŀ�/*26mX��Ik
�L�YW7%���*�}1����1�d�<��((HgnΜ9x衇PRR���A ��#�H���B!��~�bi�8�b�XF! ��� ��,�{�⦵f:Q�Ww�[
���5b����f3�H$�L&Өhu�yAPTT�Q�+---���Z��Y	�B�c�`��Ճ����u8���1444�R�IæM������������%��F�\s
uww���=ND+�����ϻ���X���8G2�ikk}饗�z$��Q����N�E"z[\rf���1P�k�TA�AC�������/,�v;�vmY��X�9�|g���:�1c!�0��V/��f���k	�����)���;�β��b0�p��Ilذa)���{{{{w̛7��㗿��v7pPZZ�,���111��
7*��^YY���1���!�L����������5gϞťK�011oK����3g�Ν;���I��~���#Dd�o�w��U�=��pp�n��F�����@�D�Ў;..\���W�����H����w߂����}"�S�OD�����ӣ�>�V���lllL<��S�'�/i�466Rss�"Tg���׾��WtF��jkk/��ՙ���?}��^M�8��|���+Z���x|��V��m޼�i"�_'߀��z#�Uyծ��#-�\�����\.R�Q-��X,����J"P�!�a�Xt�D�7c���\�Ma����l����nhq�Ք��i�I@ID��K��DD���ĩ����mZ��aֱn�Ǧȟ��~��@��\��'���c�`@�^0�B^�D4o��t	HD���^0�/4�@\`�A/��ٻ�����EEEcH�)�Qm�ن+**���������K���V�P��`+((ذ|��R�ϷG���w�����,Y�`�Z#��Z�/,[����c``�=��������'[[[b��m��d29���w��:s�ȑ�c��G�,�o�͛�����B<Gmm-N�8x���,//��16���X���aÆã��1�χ�����&�|��=���+�ʚD"'=�/��褴���"^�w=c�@ZY-H�5m����F�� 8��ʝ;w~���l�`Cgg�|�Ͷ�����,**z�������;�ڸ��v�}h```g{{{x˖-OQ)���믿>��ӳ����R��l�� ��C�>���[�:m)�񎎎�D�.��|	�L�S "���<��s���>��R~ww�w�v��~��hII�D4m�۷o�5�����կ�*�
����ۈԙ�Ck׮�=9�Q/�NNыDT����i"�q�V'0���^�`�C/�B��n'q��^!�y�7x���o��9s&���o���H}��خ&p��ѣ|cc�쾾� D�&�m��c��{�nSS��)���ND�(e��q1o��j͜\Ϝ93��:���%�4�S6��������F�,H�S��i����Қ����|�&(�kq!��+�&��a�_M�!�+ƥPp��&��.�(�49�8�����i��샌��w�y�(���PPP��jD��D�[ZW���S�&g\�f��~�����\���s984`������^��|1!(�=���vp��	EDH&��x���?��*��#�<BV�5�!�`͚5�0��w�l6C�FzH&���b���ǫd�Nb#o������lFII	L&S�
R��ŋ��b�q�nϘE�y���!"��L�1>�쳟«l�X�� �~
���s6`���4Z[[��2�s57���q��K��c�c�!%�t��I�ɬ��j�	g��/Rg�����lj���d�޻��?�b�
]�Ҏ�K����"��F��������Lu����j�^�XCC!�Jn����3�ҹ6��bY?00�7o|>���v;d�E����~���sGaa�Qw���
�'	D"tvv:l6�I�1����S�NٝN��4�<Ap��Q���`�̙D��011���a?~<�������͡PH�抚�)7O��� H�N��\VV�D"���� �I� ��h`�ን���zE��f�D�|I�i������~�*�_�
i�.�1���D�`���@D<�NI�Ts��xr7A�.ADR��P�2�����8xE<����I}�u�3�����v���|�kd�b7���Yŋħ ?�(�?��K�O�$p����%���-��>�*@D�&���B�u�.�N����ۑn�������~`�Z���2)�Edʋ��j�cL��J�I"*G��8�ӑ��ٳ�Uq�Ѻu�
y��_(�����j�hMyfڢ�����s���!9a��SxjP�������x<o�a)��k荓���J&��ģڕ����2�����	�{PXX�˳�,}��=����X,�W��鍬�D��T��|~�g?_p��W6_��Լ!͸Q��v����8oxE� �|A�V��IDS��/h������o�;Ř/0p�c��j����q�V�_�N�@���� @D��:�-
���Z��햚�W�ٯ��N�	H:���)�O��T°���>�ar%�}@D�GGGGw9
��}Y������W�Ü}��ދ�|A��������)�ſ�T�}�K^_PB�l"Ƙ��#��-�XV�a���U
����.**��~L��2�)[U u���V�5���D���#���X�ŷ���N~�!&''/1�����hii���^�9+b�֭[���	���LG�a�PRR�9s�����D�D"�p8,����q����?��?e�-�F��ðX,P,��[�D�x<.W�n��f,�j"�l)��	��J5}�J��,h3l4c���l�B�͉�*q�ۄ��I$	0���!�	�'-�h<���$ cݺu��^�ź�:���
���o[�j�J�=E��Vg+++�@aaa���=Dt!���T��D�]"jT�qѯS\q��Hyx-��=���;ҸlҬ΀@_/T���}���pF(A����z��pD�͛GMMMd�Z�H�X�"�/����(�$狋�鮻��lc�dǏ��Çq��9�%��鮫�ÁX�LR��`P��qjjjPWW���N�>
@!%'	W`�q�8В��Fe��x<A2*)��I�^��&	��Ľn��0���EAAA��P��ccc��&��h4���v����0�L "��a��dSr���r+���)"��jժ-����jkk�uuu�z/�[�nI�+׈�ߍ�~�LD~Qo\ �{�}�S΋��Qo�qY��*���7`���i�^���BʰS��W,�&T�9HD)V*�555TUUE�4"�����HD��P(��պ[y���n���N[��Z��C��oDNRp��DD�����D���(_�Hduu5Q��H���f;�KVVV�Z�s��i��j�[YY��1���lS�����o��6JɊQ���


������uR ��X�z�V��(��]�b��+V��z
W�^����BI�'��(�@y���L{[,�Z�W����Ĩ�Zi���s�,��`0x�z����������0��c,YQQ��<c�/gϞ=�1v��jmX�h���ӂ ����իWo޲eˣ�˖-[#�)��Tl�t���g��#��]]];�c�����j��������Dd&��-Z������Ν;AD;�(�3�����+��L�檪�ᎎ�D{{;���Ӭ��:gg̘1LD���ڤM�姐
k׮u8���|����n����AO��R�f���b��'�(|��j��L?R��vcj'$R�U]�+��^�t)-]��D"���4׌1٭[YYo2�`2�PVV��������UUU������k/�	h��m���������g�������+�1J�<fh{��x�����>�wH>lܸ���t�d2ܸq��10p�@O`�#l��\��<�ӓ����r?Oq�/0�6W��1j�\�(wDAA�,�y��=�|t}��g�
�:����
@��Y�w)kQ����Z��&����n%"y����U��'=���i
������#}Z��<F���}pZ�Q�]TT�Ҧ�c
�Jg��}��b�d�gԏQ�'�˴#	"�F|g_t��|�!d�f籊��j��\BF-qo ;�kaB��JJJ�8B�B
Y��#d2��R���2�y�Z2Z�QK�O�1f��>��?�Ǩ%�s>[TWW�ܹs����L&xB��&��:::h�ܹ$9\������18���x㍌A%o���לN� �1�ӧO���l�ɓ'a6�!� c�oԷg��� �ʲ�L�kt�-�Pkkk��bkk+�r�-�D�5SF�,))�L)��+P?��


���O���
":^RR�Yپ��o�WD�(�d�\D���X�'�����B��=�P��!�=ADWl�4��UPb�Ie���~*<S}}=,X BF��F�@.���f"ž2�477�…%N�����(
����ΝÛo��la���H�7-X����r;v6�
;v�Hyp�è��@(��8$U�C<Ͽ
�PQQ��k�ܹs���y�d�Vwcl����V� ;m�`hhH�}2�u�~\"������_�Z�Dy�_Ќ�eZ�X
��U�T��f�D`��ij��	�X�� A���s가ƥ��h��P�V�����SP*PWP�k5Y�������(�Eb���w��'�P[[�5ւ��+���2�ލX>5|����S��3]]�!맫+2X����js^��˓�qy4�Fz>M3.��K��7t��O�].��OW/(Y���񮮮���~����^$b���DS/455�� ϋ>*A��n�=���C�����kHʕ�|���Z����h��f�#D��p��7o���~��	H��2HwV�N�r�#���*���鱮A�F@\�с�IK=�P;�����)f��PA�B{���ԔU477�:��酴��ܸ��4�����M�KW�r����%����	�-s��2�ps�t�L@���|A�z�"�B��GZ>����.���.ч�+|~�]dy��+c�U�����a֬Yoz<��?��L����QRR������t���#��,���@#���gM]]�kxx8��?��cJ7�b����cl�]�/^�F��x��kX*�&���6�
�hEEE�U�$�t:
��ߏ%K��ժ�
������ŋ���eL여Ps������D"�y�{�K�+�`��㨯��1&�4V!�Hu�H����555��x�w�Y!�9�n��ǝ����,))Y�Q[XHG���4'mmoo?�p8�g�^�ti�4bOb��ϨXc�l
���q�x[[�q\`hh�Y��v�u9������~��-^��R�w�J��K���������F�s�;KKK�]�d��/�00�Bv�������477g%����x�R^�j�
�W��*e�>�O��^�W{�!n��1�N�I��M���n�����*��q())!�lu8�5k�vD[,+�q��SQQ�=�r����!�ټ�Yi��Ƌ�MrOgg�m6����7�����cs��]`��vJ
���$���ϟ��{1kCggg����NL�ʿ�N�3
��;t�MAc�%Mq�(�##K9�Di:�W�̍i���-��O
�t��,�RM
5�r�&rѓ�DTKDg�����!�k��lQQ�>]1�"�'/U
Y/�'@�}҆~��� ��E]!����l6������z�������'��^`U��Η̝;wYqq������o6��@gg�m���	R'rw_ggg�1����Op�W������$]П�\��唲y�:H?��mC'���0�W8����{���1�H� L�T�bdK�y���8���
�@D�Z��X,�F��DR.3�i�1�l6̘1���$"J(�����:;;��`��y=�X,�O��ٳ��"h}�z2��Z�ϰ5�I3�L��X�s�X,y�q>���v��|�9>dt"R+:9�***��@'<U��3�j�ȶV�uY�V�R�`b��N"��.0`�s'R�/�>RMӃ�#�������_�2�Fq�ر�	�2�^����={6��3�Ej��0�Mj��_�ٯ~��N�ǃx<�d2	����"����ĉ�<�e�@,�F%o�IDAT\�pEaaa���0� G	���p8p�ݨ��DMMM����]�`���2�ry�pUUU�����y��a����N�%%%���b�ڵ+���� "�'��w�}������jll$q�]�������i�8kɜ��k쫏?��f�},�]��Dt�����d�&$�����w�f�fM"�o�ʕ�u	���D�R����0`��'����Q7|����@΁fKK��Z�dz
)��iu�#-��������f�����d2�t�ܹ/x�8��0����\sMKQQ�V+���da2�0::�W_}u���R3�^ZZ�����p8�X8�'\�`� ����+//oݴi������~u���ctt��8�s3gΜ�y����� `bbCCC�|�����1��7kkkgΜ���sϡ���@@���	EEEKvtt��g��o1�>P�}�O~�-�����C�6��l6��Ǐ�K�3ߙ��+W�'�����l�FD�R6��d<�DDn����`�C/z����r��燗���������j�#�H|�Q
�y�9�	��%+�)�������F��>���-��1�#G���7�%����������z$	��h4���1���}���~sxx8 �O'	444����@�WWW��� "���(�~?���,]���E�=����P(���J�L@��,b����}��f����������b1y�]>,,I�X,�����w�}��H��;;::֏����br9�k@n�t����}��MH逿a��[�x�@  s*�����x�.]�<��3[8
�3�����?�r�…�X,�aZ���PXX��:���ʿϜ9�`�K�%��d2	A�D�z��=��Q��=^�w���t�1v'c,���O���lF�S���ın�a=syy�j���b������mhhX��2AZҢl���X"�0����g�U,nkksI��^��rll�oc�~��####�B�Unll�f2��c�����t:QUU%wTAAN�:�@ ���͆d2�ƻ�{�ӧO�l``�}ttt��b1K�"�,�1�n-��<Ϟ;v��|����~C���1�W�R�k3?j�VH�3��恖[o��z�!�;w�Mgٖ����B4Ekk��f�C=����{B�����	����t�hiiq
�p��'���h4����	�-/������8���}�����bg***��C�����=��ҥK���B�Pu<��ٳ3�<�t:q���Ѫ��c7�p�1��ޥK�b�\s��]���I����/b���~�a�`���~����Ej	�ZM�����'��=y��e����VWWG���k������8����<"�^8�d2I/��R����+W��f�ڸIm�'���y<�:�]TT������+.��[�+K�9s����y��� FGG��o�s@D�iݞ1K\ijkk�z�j…p���)*b柸	3f�@ii��;	�x###�«�	PTT��S�r�:�O��o��x:�����X5�$$�v�*P�q�GZ�-q�"�����|��׾&WRB�9so��VZ���i�*�9k�����9�?>x���k�A�H$����;wn���dF�,H�	�"?�z{{[�c-��\D�-M�w1����dVV"B<���c�JN���H�3��H�ꑚ��M
�SeJx��U*���H	A099��ʧp&ǝ� ��	�Wi�A��t�0p�#�a��:�|A\k���sS�6R�F��X��s����D�H.\�uB����MR��
"*T��5_���p�c�n�s6A�i|��@G/�|���+E�Ԝ�"k��y���v�R*�:�������_���rx�^X�֌Ej�#�u�\,g�^�	Dd3u<�f6A��n7y�^]!�#�����d�����<׬��XG2p���F\��zIEND�B`�extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/clipboard/dialogs/paste.js000060400000006430152453623450032715 0ustar00components/com_acymailingCKEDITOR.dialog.add("paste",function(c){function h(a){var b=new CKEDITOR.dom.document(a.document),f=b.getBody(),d=b.getById("cke_actscrpt");d&&d.remove();f.setAttribute("contenteditable",!0);if(CKEDITOR.env.ie&&8>CKEDITOR.env.version)b.getWindow().on("blur",function(){b.$.selection.empty()});b.on("keydown",function(a){var a=a.data,b;switch(a.getKeystroke()){case 27:this.hide();b=1;break;case 9:case CKEDITOR.SHIFT+9:this.changeFocus(1),b=1}b&&a.preventDefault()},this);c.fire("ariaWidget",new CKEDITOR.dom.element(a.frameElement));
b.getWindow().getFrame().removeCustomData("pendingFocus")&&f.focus()}var e=c.lang.clipboard;c.on("pasteDialogCommit",function(a){a.data&&c.fire("paste",{type:"auto",dataValue:a.data})},null,null,1E3);return{title:e.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?370:350,minHeight:CKEDITOR.env.quirks?250:245,onShow:function(){this.parts.dialog.$.offsetHeight;this.setupContent();this.parts.title.setHtml(this.customTitle||e.title);this.customTitle=null},onLoad:function(){(CKEDITOR.env.ie7Compat||
CKEDITOR.env.ie6Compat)&&"rtl"==c.lang.dir&&this.parts.contents.setStyle("overflow","hidden")},onOk:function(){this.commitContent()},contents:[{id:"general",label:c.lang.common.generalTab,elements:[{type:"html",id:"securityMsg",html:'<div style="white-space:normal;width:340px">'+e.securityMsg+"</div>"},{type:"html",id:"pasteMsg",html:'<div style="white-space:normal;width:340px">'+e.pasteMsg+"</div>"},{type:"html",id:"editing_area",style:"width:100%;height:100%",html:"",focus:function(){var a=this.getInputElement(),
b=a.getFrameDocument().getBody();!b||b.isReadOnly()?a.setCustomData("pendingFocus",1):b.focus()},setup:function(){var a=this.getDialog(),b='<html dir="'+c.config.contentsLangDirection+'" lang="'+(c.config.contentsLanguage||c.langCode)+'"><head><style>body{margin:3px;height:95%}</style></head><body><script id="cke_actscrpt" type="text/javascript">window.parent.CKEDITOR.tools.callFunction('+CKEDITOR.tools.addFunction(h,a)+",this);<\/script></body></html>",f=CKEDITOR.env.air?"javascript:void(0)":CKEDITOR.env.ie?
"javascript:void((function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+'})())"':"",d=CKEDITOR.dom.element.createFromHtml('<iframe class="cke_pasteframe" frameborder="0"  allowTransparency="true" src="'+f+'" role="region" aria-label="'+e.pasteArea+'" aria-describedby="'+a.getContentElement("general","pasteMsg").domId+'" aria-multiple="true"></iframe>');d.on("load",function(a){a.removeListener();a=d.getFrameDocument();a.write(b);c.focusManager.add(a.getBody());
CKEDITOR.env.air&&h.call(this,a.getWindow().$)},a);d.setCustomData("dialog",a);a=this.getElement();a.setHtml("");a.append(d);if(CKEDITOR.env.ie){var g=CKEDITOR.dom.element.createFromHtml('<span tabindex="-1" style="position:absolute" role="presentation"></span>');g.on("focus",function(){setTimeout(function(){d.$.contentWindow.focus()})});a.append(g);this.focus=function(){g.focus();this.fire("focus")}}this.getInputElement=function(){return d};CKEDITOR.env.ie&&(a.setStyle("display","block"),a.setStyle("height",
d.$.offsetHeight+2+"px"))},commit:function(){var a=this.getDialog().getParentEditor(),b=this.getInputElement().getFrameDocument().getBody(),c=b.getBogus(),d;c&&c.remove();d=b.getHtml();setTimeout(function(){a.fire("pasteDialogCommit",d)},0)}}]}]}});
extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/clipboard/dialogs/index.html000060400000000054152453623450033234 0ustar00components/com_acymailing<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/clipboard/index.html000060400000000054152453623450031612 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/sourcedialog/dialogs/index.html000060400000000054152453623450033755 0ustar00components/com_acymailing<html><body bgcolor="#FFFFFF"></body></html>extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/sourcedialog/dialogs/sourcedial000060400000001411152453623450034033 0ustar00components/com_acymailingCKEDITOR.dialog.add("sourcedialog",function(a){var b=CKEDITOR.document.getWindow().getViewPaneSize(),e=Math.min(b.width-70,800),b=b.height/1.5,d;return{title:a.lang.sourcedialog.title,minWidth:100,minHeight:100,onShow:function(){this.setValueOf("main","data",d=a.getData())},onOk:function(){function b(f,c){a.focus();a.setData(c,function(){f.hide();var b=a.createRange();b.moveToElementEditStart(a.editable());b.select()})}return function(){var a=this.getValueOf("main","data").replace(/\r/g,""),c=this;
if(a===d)return!0;setTimeout(function(){b(c,a)});return!1}}(),contents:[{id:"main",label:a.lang.sourcedialog.title,elements:[{type:"textarea",id:"data",dir:"ltr",inputStyle:"cursor:auto;width:"+e+"px;height:"+b+"px;tab-size:4;text-align:left;","class":"cke_source"}]}]}});
com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/sourcedialog/index.html000060400000000054152453623450032333 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/sourcedialog/plugin.js000060400000001226152453623450032174 0ustar00components
CKEDITOR.plugins.add( 'sourcedialog', {
	lang: 'en', // %REMOVE_LINE_CORE%
	icons: 'sourcedialog,sourcedialog-rtl', // %REMOVE_LINE_CORE%
	hidpi: true, // %REMOVE_LINE_CORE%

	init: function( editor ) {
		editor.addCommand( 'sourcedialog', new CKEDITOR.dialogCommand( 'sourcedialog' ) );

		CKEDITOR.dialog.add( 'sourcedialog', this.path + 'dialogs/sourcedialog.js' );

		if ( editor.ui.addButton ) {
			editor.ui.addButton( 'Sourcedialog', {
				label: editor.lang.sourcedialog.toolbar,
				command: 'sourcedialog',
				icon: this.path.split("/plugins/")[0] + "/media/com_acymailing/images/editor/sourcedialog.png",
				toolbar: 'mode,10'
			} );
		}
	}
} );

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/table/dialogs/table.js000060400000020701152453623450032015 0ustar00components(function(){function r(a){for(var e=0,l=0,k=0,m,g=a.$.rows.length;k<g;k++){m=a.$.rows[k];for(var d=e=0,c,b=m.cells.length;d<b;d++)c=m.cells[d],e+=c.colSpan;e>l&&(l=e)}return l}function o(a){return function(){var e=this.getValue(),e=!!(CKEDITOR.dialog.validate.integer()(e)&&0<e);e||(alert(a),this.select());return e}}function n(a,e){var l=function(g){return new CKEDITOR.dom.element(g,a.document)},n=a.editable(),m=a.plugins.dialogadvtab;return{title:a.lang.table.title,minWidth:310,minHeight:CKEDITOR.env.ie?
310:280,onLoad:function(){var g=this,a=g.getContentElement("advanced","advStyles");if(a)a.on("change",function(){var a=this.getStyle("width",""),b=g.getContentElement("info","txtWidth");b&&b.setValue(a,!0);a=this.getStyle("height","");(b=g.getContentElement("info","txtHeight"))&&b.setValue(a,!0)})},onShow:function(){var g=a.getSelection(),d=g.getRanges(),c,b=this.getContentElement("info","txtRows"),h=this.getContentElement("info","txtCols"),p=this.getContentElement("info","txtWidth"),f=this.getContentElement("info",
"txtHeight");"tableProperties"==e&&((g=g.getSelectedElement())&&g.is("table")?c=g:0<d.length&&(CKEDITOR.env.webkit&&d[0].shrink(CKEDITOR.NODE_ELEMENT),c=a.elementPath(d[0].getCommonAncestor(!0)).contains("table",1)),this._.selectedElement=c);c?(this.setupContent(c),b&&b.disable(),h&&h.disable()):(b&&b.enable(),h&&h.enable());p&&p.onChange();f&&f.onChange()},onOk:function(){var g=a.getSelection(),d=this._.selectedElement&&g.createBookmarks(),c=this._.selectedElement||l("table"),b={};this.commitContent(b,
c);if(b.info){b=b.info;if(!this._.selectedElement)for(var h=c.append(l("tbody")),e=parseInt(b.txtRows,10)||0,f=parseInt(b.txtCols,10)||0,i=0;i<e;i++)for(var j=h.append(l("tr")),k=0;k<f;k++)j.append(l("td")).appendBogus();e=b.selHeaders;if(!c.$.tHead&&("row"==e||"both"==e)){j=new CKEDITOR.dom.element(c.$.createTHead());h=c.getElementsByTag("tbody").getItem(0);h=h.getElementsByTag("tr").getItem(0);for(i=0;i<h.getChildCount();i++)f=h.getChild(i),f.type==CKEDITOR.NODE_ELEMENT&&!f.data("cke-bookmark")&&
(f.renameNode("th"),f.setAttribute("scope","col"));j.append(h.remove())}if(null!==c.$.tHead&&!("row"==e||"both"==e)){j=new CKEDITOR.dom.element(c.$.tHead);h=c.getElementsByTag("tbody").getItem(0);for(k=h.getFirst();0<j.getChildCount();){h=j.getFirst();for(i=0;i<h.getChildCount();i++)f=h.getChild(i),f.type==CKEDITOR.NODE_ELEMENT&&(f.renameNode("td"),f.removeAttribute("scope"));h.insertBefore(k)}j.remove()}if(!this.hasColumnHeaders&&("col"==e||"both"==e))for(j=0;j<c.$.rows.length;j++)f=new CKEDITOR.dom.element(c.$.rows[j].cells[0]),
f.renameNode("th"),f.setAttribute("scope","row");if(this.hasColumnHeaders&&!("col"==e||"both"==e))for(i=0;i<c.$.rows.length;i++)j=new CKEDITOR.dom.element(c.$.rows[i]),"tbody"==j.getParent().getName()&&(f=new CKEDITOR.dom.element(j.$.cells[0]),f.renameNode("td"),f.removeAttribute("scope"));b.txtHeight?c.setStyle("height",b.txtHeight):c.removeStyle("height");b.txtWidth?c.setStyle("width",b.txtWidth):c.removeStyle("width");c.getAttribute("style")||c.removeAttribute("style")}if(this._.selectedElement)try{g.selectBookmarks(d)}catch(m){}else a.insertElement(c),
setTimeout(function(){var g=new CKEDITOR.dom.element(c.$.rows[0].cells[0]),b=a.createRange();b.moveToPosition(g,CKEDITOR.POSITION_AFTER_START);b.select()},0)},contents:[{id:"info",label:a.lang.table.title,elements:[{type:"hbox",widths:[null,null],styles:["vertical-align:top"],children:[{type:"vbox",padding:0,children:[{type:"text",id:"txtRows","default":3,label:a.lang.table.rows,required:!0,controlStyle:"width:5em",validate:o(a.lang.table.invalidRows),setup:function(a){this.setValue(a.$.rows.length)},
commit:k},{type:"text",id:"txtCols","default":2,label:a.lang.table.columns,required:!0,controlStyle:"width:5em",validate:o(a.lang.table.invalidCols),setup:function(a){this.setValue(r(a))},commit:k},{type:"html",html:"&nbsp;"},{type:"select",id:"selHeaders",requiredContent:"th","default":"",label:a.lang.table.headers,items:[[a.lang.table.headersNone,""],[a.lang.table.headersRow,"row"],[a.lang.table.headersColumn,"col"],[a.lang.table.headersBoth,"both"]],setup:function(a){var d=this.getDialog();d.hasColumnHeaders=
!0;for(var c=0;c<a.$.rows.length;c++){var b=a.$.rows[c].cells[0];if(b&&"th"!=b.nodeName.toLowerCase()){d.hasColumnHeaders=!1;break}}null!==a.$.tHead?this.setValue(d.hasColumnHeaders?"both":"row"):this.setValue(d.hasColumnHeaders?"col":"")},commit:k},{type:"text",id:"txtBorder",requiredContent:"table[border]","default":a.filter.check("table[border]")?1:0,label:a.lang.table.border,controlStyle:"width:3em",validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidBorder),setup:function(a){this.setValue(a.getAttribute("border")||
"")},commit:function(a,d){this.getValue()?d.setAttribute("border",this.getValue()):d.removeAttribute("border")}},{id:"cmbAlign",type:"select",requiredContent:"table[align]","default":"",label:a.lang.common.align,items:[[a.lang.common.notSet,""],[a.lang.common.alignLeft,"left"],[a.lang.common.alignCenter,"center"],[a.lang.common.alignRight,"right"]],setup:function(a){this.setValue(a.getAttribute("align")||"")},commit:function(a,d){this.getValue()?d.setAttribute("align",this.getValue()):d.removeAttribute("align")}}]},
{type:"vbox",padding:0,children:[{type:"hbox",widths:["5em"],children:[{type:"text",id:"txtWidth",requiredContent:"table{width}",controlStyle:"width:5em",label:a.lang.common.width,title:a.lang.common.cssLengthTooltip,"default":a.filter.check("table{width}")?500>n.getSize("width")?"100%":500:0,getValue:q,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",a.lang.common.width)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles");a&&
a.updateStyle("width",this.getValue())},setup:function(a){this.setValue(a.getStyle("width"))},commit:k}]},{type:"hbox",widths:["5em"],children:[{type:"text",id:"txtHeight",requiredContent:"table{height}",controlStyle:"width:5em",label:a.lang.common.height,title:a.lang.common.cssLengthTooltip,"default":"",getValue:q,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",a.lang.common.height)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles");
a&&a.updateStyle("height",this.getValue())},setup:function(a){(a=a.getStyle("height"))&&this.setValue(a)},commit:k}]},{type:"html",html:"&nbsp;"},{type:"text",id:"txtCellSpace",requiredContent:"table[cellspacing]",controlStyle:"width:3em",label:a.lang.table.cellSpace,"default":a.filter.check("table[cellspacing]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellSpacing),setup:function(a){this.setValue(a.getAttribute("cellSpacing")||"")},commit:function(a,d){this.getValue()?d.setAttribute("cellSpacing",
this.getValue()):d.removeAttribute("cellSpacing")}},{type:"text",id:"txtCellPad",requiredContent:"table[cellpadding]",controlStyle:"width:3em",label:a.lang.table.cellPad,"default":a.filter.check("table[cellpadding]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellPadding),setup:function(a){this.setValue(a.getAttribute("cellPadding")||"")},commit:function(a,d){this.getValue()?d.setAttribute("cellPadding",this.getValue()):d.removeAttribute("cellPadding")}}]}]},{type:"html",align:"right",
html:""},{type:"vbox",padding:0,children:[{type:"text",id:"txtCaption",requiredContent:"caption",label:a.lang.table.caption,setup:function(a){this.enable();a=a.getElementsByTag("caption");if(0<a.count()){var a=a.getItem(0),d=a.getFirst(CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT));d&&!d.equals(a.getBogus())?(this.disable(),this.setValue(a.getText())):(a=CKEDITOR.tools.trim(a.getText()),this.setValue(a))}},commit:function(e,d){if(this.isEnabled()){var c=this.getValue(),b=d.getElementsByTag("caption");
if(c)0<b.count()?(b=b.getItem(0),b.setHtml("")):(b=new CKEDITOR.dom.element("caption",a.document),d.getChildCount()?b.insertBefore(d.getFirst()):b.appendTo(d)),b.append(new CKEDITOR.dom.text(c,a.document));else if(0<b.count())for(c=b.count()-1;0<=c;c--)b.getItem(c).remove()}}},{type:"text",id:"txtSummary",requiredContent:"table[summary]",label:a.lang.table.summary,setup:function(a){this.setValue(a.getAttribute("summary")||"")},commit:function(a,d){this.getValue()?d.setAttribute("summary",this.getValue()):
d.removeAttribute("summary")}}]}]},m&&m.createAdvancedTab(a,null,"table")]}}var q=CKEDITOR.tools.cssLength,k=function(a){var e=this.id;a.info||(a.info={});a.info[e]=this.getValue()};CKEDITOR.dialog.add("table",function(a){return n(a,"table")});CKEDITOR.dialog.add("tableProperties",function(a){return n(a,"tableProperties")})})();
com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/table/dialogs/index.html000060400000000054152453623450032364 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/table/index.html000060400000000054152453623450030742 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/index.html000060400000000054152453623450027732 0ustar00<html><body bgcolor="#FFFFFF"></body></html>extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/css/codemirror.min.c000060400000023114152453623450033710 0ustar00components/com_acymailing.CodeMirror{font-family:monospace;height:300px;color:#000}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror div.CodeMirror-cursor{border-left:1px solid #000}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid #c0c0c0}.CodeMirror.cm-fat-cursor div.CodeMirror-cursor{width:auto;border:0;background:#7e7}.CodeMirror.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}@-moz-keyframes blink{0%{background:#7e7}50%{background:none}100%{background:#7e7}}@-webkit-keyframes blink{0%{background:#7e7}50%{background:none}100%{background:#7e7}}@keyframes blink{0%{background:#7e7}50%{background:none}100%{background:#7e7}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-ruler{border-left:1px solid #ccc;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:bold}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:#f00}.cm-invalidchar{color:#f00}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0f0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#f22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll !important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:none;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-vscrollbar,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;margin-bottom:-30px;*zoom:1;*display:inline}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;height:100%}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper{-webkit-user-select:none;-moz-user-select:none;user-select:none}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;overflow:auto}.CodeMirror-code{outline:none}.CodeMirror-scroll,.CodeMirror-sizer,.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-measure pre{position:static}.CodeMirror div.CodeMirror-cursor{position:absolute;border-right:none;width:0}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror ::selection{background:#d7d4f0}.CodeMirror ::-moz-selection{background:#d7d4f0}.cm-searching{background:#ffa;background:rgba(255,255,0,.4)}.CodeMirror span{*vertical-align:text-bottom}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:none}.CodeMirror{font:13px/1.4em monospace;text-align:left}.CodeMirror .activeline{background:#e8f2ff}.CodeMirror .CodeMirror-foldmarker{color:#00f;-ms-text-shadow:#b9f 1px 1px 2px,#b9f -1px -1px 2px,#b9f 1px -1px 2px,#b9f -1px 1px 2px;-webkit-text-shadow:#b9f 1px 1px 2px,#b9f -1px -1px 2px,#b9f 1px -1px 2px,#b9f -1px 1px 2px;text-shadow:#b9f 1px 1px 2px,#b9f -1px -1px 2px,#b9f 1px -1px 2px,#b9f -1px 1px 2px;font-family:arial;line-height:.3;cursor:pointer}.CodeMirror-matchingtag{background:#ff9600;background:rgba(255,150,0,.3)}.searchCodeButton span,.autoFormat span,.CommentSelectedRange span,.UncommentSelectedRange span{width:16px;height:16px;margin-left:6px}.searchCodeButton span{background:url("../icons/searchcode.png") no-repeat}.autoFormat span{background:url("../icons/autoformat.png") no-repeat}.CommentSelectedRange span{background:url("../icons/commentselectedrange.png") no-repeat}.UncommentSelectedRange span{background:url("../icons/uncommentselectedrange.png") no-repeat}.cke_reset_all .CodeMirror-scroll *{white-space:normal}.cke_reset_all .cm-s-cobalt *,.cke_reset_all .cm-s-erlang-dark *,.cke_reset_all .cm-s-lesser-dark *,.cke_reset_all .cm-s-monokai *,.cke_reset_all .cm-s-night *,.cke_reset_all .cm-s-rubyblue *,.cke_reset_all .cm-s-twilight *,.cke_reset_all .cm-s-xq-dark *,.cke_reset_all .cm-s-base16-dark *,.cke_reset_all .cm-s-3024-night *,.cke_reset_all .cm-s-the-matrix *,.cke_reset_all .cm-s-paraiso-dark *,.cke_reset_all .cm-s-paraiso-light *{color:inherit;font:inherit}.cm-s-cobalt .CodeMirror-selected{background:#b36539 !important}.cm-s-erlang-dark .CodeMirror-selected{background:#b36539 !important}.cm-s-lesser-dark .CodeMirror-selected{background:#45443b !important}.cm-s-monokai .CodeMirror-selected{background:#49483e !important}.cm-s-night .CodeMirror-selected{background:#447 !important}.cm-s-rubyblue .CodeMirror-selected{background:#38566f !important}.cm-s-twilight .CodeMirror-selected{background:#323232 !important}.cm-s-xq-dark .CodeMirror-selected{background:#a8f !important}.cm-s-the-matrix .CodeMirror-selected{background:#494949 !important}.cm-s-mbo .CodeMirror-selected{background:#716c62 !important}.cm-s-blackboard .activeline,.cm-s-cobalt .activeline,.cm-s-erlang-dark .activeline,.cm-s-lesser-dark .activeline,.cm-s-monokai .activeline,.cm-s-night .activeline,.cm-s-rubyblue .activeline,.cm-s-vibrant-ink .activeline,.cm-s-xq-dark .activeline,.cm-s-base16-dark .activeline,.cm-s-3024-night .activeline,.cm-s-paraiso-light .activeline,.cm-s-paraiso-dark .activeline,.cm-s-pastel-on-dark .activeline{background:#757575}.cm-s-pastel-on-dark .activeline{background:#404040}.cm-s-mbo .activeline{background:#716c62}.cm-s-twilight .activeline{background:#494949}.cm-s-the-matrix .activeline{background:#060}.CodeMirror-focused .cm-matchhighlight{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAFklEQVQI12NgYGBgkKzc8x9CMDAwAAAmhwSbidEoSQAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px #000;-ms-box-shadow:2px 3px 5px #000;box-shadow:2px 3px 5px #000;border-radius:3px;border:1px solid #c0c0c0;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;max-width:19em;overflow:hidden;white-space:pre;color:#000;cursor:pointer}.CodeMirror-hint-active{background:#08f;color:#fff}.cm-trailingspace{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAACCAYAAAB/qH1jAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QUXCToH00Y1UgAAACFJREFUCNdjPMDBUc/AwNDAAAFMTAwMDA0OP34wQgX/AQBYgwYEx4f9lQAAAABJRU5ErkJggg==);background-position:bottom left;background-repeat:repeat-x}.CodeMirror-dialog{position:absolute;left:0;right:0;background:inherit;z-index:15;padding:.1em .8em;overflow:hidden;color:inherit}.CodeMirror-dialog-top{border-bottom:1px solid #eee;top:0}.CodeMirror-dialog-bottom{border-top:1px solid #eee;bottom:0}.CodeMirror-dialog input{border:none;outline:none;background:transparent;width:20em;color:inherit;font-family:monospace}.CodeMirror-dialog button{font-size:70%}.CodeMirror-foldmarker{color:#00f;text-shadow:#b9f 1px 1px 2px,#b9f -1px -1px 2px,#b9f 1px -1px 2px,#b9f -1px 1px 2px;font-family:arial;line-height:.3;cursor:pointer}.CodeMirror-foldgutter{width:.7em}.CodeMirror-foldgutter-open,.CodeMirror-foldgutter-folded{cursor:pointer}.CodeMirror-foldgutter-open:after{content:"▾"}.CodeMirror-foldgutter-folded:after{content:"▸"}
com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/css/index.html000060400000000054152453623450032610 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/uk.js000060400000000450152453623450031721 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'uk', {
	toolbar: 'Джерело',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/bs.js000060400000000443152453623450031710 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'bs', {
	toolbar: 'HTML kôd',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/sl.js000060400000000446152453623450031725 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'sl', {
	toolbar: 'Izvorna koda',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/es.js000060400000000445152453623450031715 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'es', {
	toolbar: 'Fuente HTML',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/bg.js000060400000000452152453623450031674 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'bg', {
	toolbar: 'Източник',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/fo.js000060400000000437152453623450031713 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'fo', {
	toolbar: 'Kelda',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/en-au.js000060400000000443152453623450032311 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'en-au', {
	toolbar: 'Source',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/ca.js000060400000000443152453623450031667 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'ca', {
	toolbar: 'Codi font',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/da.js000060400000000437152453623450031673 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'da', {
	toolbar: 'Kilde',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/ja.js000060400000000443152453623450031676 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'ja', {
	toolbar: 'ソース',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/de.js000060400000000512152453623450031671 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'de', {
    toolbar: 'Quellcode',
    searchCode: 'Quellcode durchsuchen',
	autoFormat: 'Auswahl formatieren',
	commentSelectedRange: 'Auswahl auskommentieren',
	uncommentSelectedRange: 'Auskommentierung entfernen',
	autoCompleteToggle: 'HTML Tag Autovervollständigen de-/aktivieren'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/cs.js000060400000000437152453623450031714 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'cs', {
	toolbar: 'Zdroj',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/lt.js000060400000000443152453623450031723 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'lt', {
	toolbar: 'Šaltinis',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/ms.js000060400000000440152453623450031720 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'ms', {
	toolbar: 'Sumber',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/index.html000060400000000054152453623450032741 0ustar00components/com_acymailing<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/sk.js000060400000000437152453623450031724 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'sk', {
	toolbar: 'Zdroj',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/et.js000060400000000444152453623450031715 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'et', {
	toolbar: 'Lähtekood',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/eu.js000060400000000450152453623450031713 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'eu', {
	toolbar: 'HTML Iturburua',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/gl.js000060400000000447152453623450031712 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'gl', {
	toolbar: 'Código Fonte',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/pt.js000060400000000437152453623450031732 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'pt', {
	toolbar: 'Fonte',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/sr-latn.js000060400000000443152453623450032664 0ustar00components/com_acymailingCKEDITOR.plugins.setLang( 'codemirror', 'sr-latn', {
	toolbar: 'Kôd',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/nl.js000060400000000505152453623450031714 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'nl', {
	toolbar: 'Broncode',
	searchCode: 'Zoek in broncode',
	autoFormat: 'Formatteer selectie',
	commentSelectedRange: 'Zet selectie in commentaar',
	uncommentSelectedRange: 'Haal selectie uit commentaar',
	autoCompleteToggle: 'Zet automatisch aanvullen van HTML tags aan/uit'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/ku.js000060400000000450152453623450031721 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'ku', {
	toolbar: 'سەرچاوە',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/zh-cn.js000060400000000443152453623450032323 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'zh-cn', {
	toolbar: '源码',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/ro.js000060400000000437152453623450031727 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'ro', {
	toolbar: 'Sursa',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/fi.js000060400000000437152453623450031705 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'fi', {
	toolbar: 'Koodi',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/ka.js000060400000000454152453623450031701 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'ka', {
	toolbar: 'კოდები',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/zh.js000060400000000443152453623450031725 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'zh', {
	toolbar: '原始碼',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/en-gb.js000060400000000443152453623450032274 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'en-gb', {
	toolbar: 'Source',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/th.js000060400000000461152453623450031717 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'th', {
	toolbar: 'ดูรหัส HTML',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/hi.js000060400000000451152453623450031703 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'hi', {
	toolbar: 'सोर्स',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/no.js000060400000000437152453623450031723 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'no', {
	toolbar: 'Kilde',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/lv.js000060400000000443152453623450031725 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'lv', {
	toolbar: 'HTML kods',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/mn.js000060400000000440152453623450031713 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'mn', {
	toolbar: 'Код',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/sv.js000060400000000440152453623450031731 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'sv', {
	toolbar: 'Källa',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/ug.js000060400000000444152453623450031720 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'ug', {
	toolbar: 'مەنبە',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/fa.js000060400000000442152453623450031671 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'fa', {
	toolbar: 'منبع',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/cy.js000060400000000436152453623450031721 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'cy', {
	toolbar: 'HTML',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/is.js000060400000000440152453623450031714 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'is', {
	toolbar: 'Kóði',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/en-ca.js000060400000000443152453623450032267 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'en-ca', {
	toolbar: 'Source',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/hu.js000060400000000445152453623450031722 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'hu', {
	toolbar: 'Forráskód',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/ko.js000060400000000440152453623450031712 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'ko', {
	toolbar: '소스',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/fr-ca.js000060400000000443152453623450032274 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'fr-ca', {
	toolbar: 'Source',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/eo.js000060400000000437152453623450031712 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'eo', {
	toolbar: 'Fonto',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/vi.js000060400000000442152453623450031721 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'vi', {
	toolbar: 'Mã HTML',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/bn.js000060400000000451152453623450031702 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'bn', {
	toolbar: 'সোর্স',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/en.js000060400000000446152453623450031711 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'en', {
    toolbar: 'Source',
    searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/af.js000060400000000436152453623450031674 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'af', {
	toolbar: 'Bron',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/ar.js000060400000000446152453623450031711 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'ar', {
	toolbar: 'المصدر',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/fr.js000060400000000440152453623450031710 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'fr', {
	toolbar: 'Source',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/gu.js000060400000000534152453623450031720 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'gu', {
	toolbar: 'મૂળ કે પ્રાથમિક દસ્તાવેજ',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/hr.js000060400000000436152453623450031717 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'hr', {
	toolbar: 'Kôd',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/mk.js000060400000000440152453623450031710 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'mk', {
	toolbar: 'Source',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/el.js000060400000000455152453623450031707 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'el', {
	toolbar: 'HTML κώδικας',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/tr.js000060400000000440152453623450031726 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'tr', {
	toolbar: 'Kaynak',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/sr.js000060400000000437152453623450031733 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'sr', {
	toolbar: 'Kôд',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/he.js000060400000000442152453623450031677 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'he', {
	toolbar: 'מקור',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/ru.js000060400000000452152453623450031732 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'ru', {
	toolbar: 'Источник',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/pt-br.js000060400000000452152453623450032330 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'pt-br', {
	toolbar: 'Código-Fonte',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/it.js000060400000000451152453623450031717 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'it', {
	toolbar: 'Codice Sorgente',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/nb.js000060400000000437152453623450031706 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'nb', {
	toolbar: 'Kilde',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/km.js000060400000000443152453623450031713 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'km', {
	toolbar: 'កូត',
	searchCode: 'Search Source',
	autoFormat: 'Format Selection',
	commentSelectedRange: 'Comment Selection',
	uncommentSelectedRange: 'Uncomment Selection',
	autoCompleteToggle: 'Enable/Disable HTML Tag Autocomplete'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/lang/pl.js000060400000000525152453623450031720 0ustar00componentsCKEDITOR.plugins.setLang( 'codemirror', 'pl', {
	toolbar: 'Źródło dokumentu',
	autoFormat: 'Sformatuj zaznaczenie',
	commentSelectedRange: 'Zakomentuj zaznaczenie',
	uncommentSelectedRange: 'Odkomentuj zaznaczenie',
	searchCode: 'Wyszukaj w źródle',
	autoCompleteToggle: 'Włącza/Wyłącza automatyczne uzupełniania tagów HTML'
});

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/index.html000060400000000054152453623450032020 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/icons/autoformat.png000060400000000322152453623450034023 0ustar00components/com_acymailing�PNG


IHDR:����IDATWc�_��g����m��ӧ��ӧ1��[�\*p�+�+Td����f|���c�a����NfXŖ�I�͆�t5r���34�?(?���.��w:��r�.�PC'�)���"vbƯ�?�F���R` �[L���G-cIEND�B`�extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/icons/uncommentselec000060400000000435152453623450034105 0ustar00components/com_acymailing�PNG


IHDR(-SfPLTE@@@KKKWWWuuv��������|�)����P8����I0�X>�/�R:�Z@�[G�rV�fJ������������մ��qYډt���kD��c��h�������Ø�������rIDAT�	�P��-Q�k���%� �wC�1.��뾌�8>ֶ]G@�O�ߩO�BW�u��·�|݃���|�?1�*�n��P(�mR@l@R�d �|��@�IEND�B`�extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/icons/index.html000060400000000054152453623450033133 0ustar00components/com_acymailing<html><body bgcolor="#FFFFFF"></body></html>extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/icons/commentselecte000060400000000240152453623450034065 0ustar00components/com_acymailing�PNG


IHDR���RPLTE���@@@@�7KKKWWWuuv����S��tRNS@��f9IDAT[c`�&4����!((�2�1`zAF�����P P���R�E�<Id��IEND�B`�extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/icons/searchcode.png000060400000000630152453623450033744 0ustar00components/com_acymailing�PNG


IHDR(-S�PLTE���}}}ssssss===XXXzzz}}}sss===AAAFFFLLLRRRXXX___eeekkkqqqvvv}}}yyy|||}}}vvvzzz}}}������zzz}}}���zzz���������������������������������������������������
�[i tRNS���������������������������~�IDATW��1�0C_~�AK(��o�ʊ���ghUĆ�z�mlP]�at���5Ost{W*9E3���׼�Ѕ��RrEC�����P�hZs��+�^�#�%�9�R�>�kz��^3du��e���q�g��_}+�FEľu=IEND�B`�extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/icons/autocomplete.p000060400000000377152453623450034030 0ustar00components/com_acymailing�PNG


IHDR_*?�EPLTE���CBBCBBCBBCBBCBBCBBCBBCBBCBBCBBCBB��ZtRNS  @@P``pp���������1�2TIDAT��K@0@�[Z�~�����jD�@���ϼQ�.��G�㛤 �ځT�gS���U�@cB����>a�2q�@�7j���V&HIEND�B`�com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/plugin.js000060400000137312152453623450031667 0ustar00components
(function() {
    CKEDITOR.plugins.add('codemirror', {
        icons: 'searchcode,autoformat,commentselectedrange,uncommentselectedrange,autocomplete', // %REMOVE_LINE_CORE%
        lang: 'af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en-au,en-ca,en-gb,en,eo,es,et,eu,fa,fi,fo,fr-ca,fr,gl,gu,he,hi,hr,hu,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt-br,pt,ro,ru,sk,sl,sr-latn,sr,sv,th,tr,ug,uk,vi,zh-cn,zh', // %REMOVE_LINE_CORE%
        version: 1.13,
        init: function (editor) {
            var rootPath = this.path,
                defaultConfig = {
                    autoCloseBrackets: true,
                    autoCloseTags: true,
                    autoFormatOnStart: false,
                    autoFormatOnUncomment: true,
                    continueComments: true,
                    enableCodeFolding: true,
                    enableCodeFormatting: true,
                    enableSearchTools: true,
                    highlightMatches: true,
                    indentWithTabs: false,
                    lineNumbers: true,
                    lineWrapping: true,
                    mode: 'htmlmixed',
                    matchBrackets: true,
                    matchTags: true,
                    showAutoCompleteButton: true,
                    showCommentButton: true,
                    showFormatButton: true,
                    showSearchButton: true,
                    showTrailingSpace: true,
                    showUncommentButton: true,
                    styleActiveLine: true,
                    theme: 'default',
                    useBeautify: false
                };
            
            var config = CKEDITOR.tools.extend(defaultConfig, editor.config.codemirror || {}, true),
                lang = editor.lang.codemirror;
            
            if (editor.config.codemirror_theme) {
                config.theme = editor.config.codemirror_theme;
            }
            if (editor.config.codemirror_autoFormatOnStart) {
                config.autoFormatOnStart = editor.config.codemirror_autoFormatOnStart;
            }

            if (editor.plugins.bbcode && config.mode.indexOf("bbcode") <= 0) {
                config.mode = "bbcode";
            }

            if (editor.elementMode === CKEDITOR.ELEMENT_MODE_INLINE || editor.plugins.sourcedialog) {
                
                CKEDITOR.dialog.add('sourcedialog', function (editor) {
                    var size = CKEDITOR.document.getWindow().getViewPaneSize(),
                        width = Math.min(size.width - 70, 800),
                        height = size.height / 1.5,
                        oldData;

                    function loadCodeMirrorInline(editor, textarea) {
                        window["codemirror_" + editor.id] = CodeMirror.fromTextArea(textarea, {
                            mode: config.mode,
                            matchBrackets: config.matchBrackets,
                            matchTags: config.matchTags,
                            workDelay: 300,
                            workTime: 35,
                            readOnly: editor.readOnly,
                            lineNumbers: config.lineNumbers,
                            lineWrapping: config.lineWrapping,
                            autoCloseTags: config.autoCloseTags,
                            autoCloseBrackets: config.autoCloseBrackets,
                            highlightSelectionMatches: config.highlightMatches,
                            continueComments: config.continueComments,
                            indentWithTabs: config.indentWithTabs,
                            theme: config.theme,
                            showTrailingSpace: config.showTrailingSpace,
                            showCursorWhenSelecting: true,
                            styleActiveLine: config.styleActiveLine,
                            viewportMargin: Infinity,
                            extraKeys: {
                                "Ctrl-Q": function (codeMirror_Editor) {
                                    if (config.enableCodeFolding) {
                                        window["foldFunc_" + editor.id](codeMirror_Editor, codeMirror_Editor.getCursor().line);
                                    }
                                },
                                "'>'": function (codeMirror_Editor) {
                                    codeMirror_Editor.closeTag(codeMirror_Editor, '>');
                                },
                                "'/'": function (codeMirror_Editor) {
                                    codeMirror_Editor.closeTag(codeMirror_Editor, '/');
                                }
                            },
                            foldGutter: true,
                            gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"],
                            onKeyEvent: function (codeMirror_Editor, evt) {
                                if (config.enableCodeFormatting) {
                                    var range = getSelectedRange();
                                    if (evt.type === "keydown" && evt.ctrlKey && evt.keyCode === 75 && !evt.shiftKey && !evt.altKey) {
                                        window["codemirror_" + editor.id].commentRange(true, range.from, range.to);
                                    } else if (evt.type === "keydown" && evt.ctrlKey && evt.keyCode === 75 && evt.shiftKey && !evt.altKey) {
                                        window["codemirror_" + editor.id].commentRange(false, range.from, range.to);
                                        if (config.autoFormatOnUncomment) {
                                            window["codemirror_" + editor.id].autoFormatRange(range.from, range.to);
                                        }
                                    } else if (evt.type === "keydown" && evt.ctrlKey && evt.keyCode === 75 && !evt.shiftKey && evt.altKey) {
                                        window["codemirror_" + editor.id].autoFormatRange(range.from, range.to);
                                    }
                                }
                            }
                        });

                        var holderHeight = height + 'px';
                        var holderWidth = width + 'px';

                        window["codemirror_" + editor.id].config = config;
                        
                        if (config.autoFormatOnStart) {
                            if (config.useBeautify) {
                                var indent_size = 4,
                                    indent_char = ' ',
                                    brace_style = 'collapse'; //collapse, expand, end-expand 

                                var source = window["codemirror_" + editor.id].getValue();

                                window["codemirror_" + editor.id].setValue(html_beautify(source, indent_size, indent_char, 120, brace_style));
                            } else {
                                window["codemirror_" + editor.id].autoFormatAll({
                                    line: 0,
                                    ch: 0
                                }, {
                                    line: window["codemirror_" + editor.id].lineCount(),
                                    ch: 0
                                });
                            }
                        }

                        function getSelectedRange() {
                            return {
                                from: window["codemirror_" + editor.id].getCursor(true),
                                to: window["codemirror_" + editor.id].getCursor(false)
                            };
                        }

                        window["codemirror_" + editor.id].on("change", function () {
                            window["codemirror_" + editor.id].save();
                            editor.fire('change', this);
                        });

                        window["codemirror_" + editor.id].setSize(holderWidth, holderHeight);

                        if (config.lineNumbers && config.enableCodeFolding) {
                            window["codemirror_" + editor.id].on("gutterClick", window["foldFunc_" + editor.id]);
                        }
                        if (typeof config.onLoad === 'function') {
                            config.onLoad(window["codemirror_" + editor.id], editor);
                        }

                        window["codemirror_" + editor.id].on("blur", function () {
                            editor.fire('blur', this);
                        });
                    }

                    return {
                        title: editor.lang.sourcedialog.title,
                        minWidth: width,
                        minHeight: height,
                        resizable : CKEDITOR.DIALOG_RESIZE_NONE,
                        onShow: function () {
                            this.getContentElement('main', 'data').focus();
                            this.getContentElement('main', 'AutoComplete').setValue(config.autoCloseTags, true);
                            
                            var textArea = this.getContentElement('main', 'data').getInputElement().$;
                            
                            this.setValueOf('main', 'data', oldData = editor.getData());

                            if (!IsStyleSheetAlreadyLoaded(rootPath + 'css/codemirror.min.css')) {
                                CKEDITOR.document.appendStyleSheet(rootPath + 'css/codemirror.min.css');
                            }

                            if (config.theme.length && config.theme != 'default' && !IsStyleSheetAlreadyLoaded(rootPath + 'theme/' + config.theme + '.css')) {
                                CKEDITOR.document.appendStyleSheet(rootPath + 'theme/' + config.theme + '.css');
                            }

                            if (typeof (CodeMirror) == 'undefined') {

                                CKEDITOR.scriptLoader.load(rootPath + 'js/codemirror.min.js', function() {

                                    CKEDITOR.scriptLoader.load(getCodeMirrorScripts(), function() {
                                        loadCodeMirrorInline(editor, textArea);
                                    });
                                });


                            } else {
                                if (CodeMirror.prototype['autoFormatAll']) {
                                    loadCodeMirrorInline(editor, textArea);
                                } else {
                                    CKEDITOR.scriptLoader.load(getCodeMirrorScripts(), function() {
                                        loadCodeMirrorInline(editor, textArea);
                                    });
                                }
                            }
                        },
                        onCancel: function (event) {
                            if (event.data.hide) {
                                window["codemirror_" + editor.id].toTextArea();

                                window["codemirror_" + editor.id] = null;
                            }
                        },
                        onOk: (function () {

                            function setData(newData) {
                                var that = this;

                                editor.setData(newData, function () {
                                    that.hide();

                                    var range = editor.createRange();
                                    range.moveToElementEditStart(editor.editable());
                                    range.select();
                                });
                            }

                            return function () {
                                window["codemirror_" + editor.id].toTextArea();

                                window["codemirror_" + editor.id] = null;

                                var newData = this.getValueOf('main', 'data').replace(/\r/g, '');

                                if (newData === oldData)
                                    return true;

                                CKEDITOR.env.ie ? CKEDITOR.tools.setTimeout(setData, 0, this, newData) : setData.call(this, newData);

                                return false;
                            };
                        })(),

                        contents: [{
                            id: 'main',
                            label: editor.lang.sourcedialog.title,
                            elements: [
                                {
                                    type: 'hbox',
                                    style: 'width: 80px;margin:0;',
                                    widths: ['20px', '20px', '20px', '20px'],
                                    children: [
                                        {
                                            type: 'button',
                                            id: 'searchCode',
                                            label: '',
                                            title: lang.searchCode,
                                            'class': 'searchCodeButton',
                                            onClick: function() {
                                                CodeMirror.commands.find(window["codemirror_" + editor.id]);
                                            }
                                        }, {
                                            type: 'button',
                                            id: 'autoFormat',
                                            label: '',
                                            title: lang.autoFormat,
                                            'class': 'autoFormat',
                                            onClick: function() {
                                                var range = {
                                                    from: window["codemirror_" + editor.id].getCursor(true),
                                                    to: window["codemirror_" + editor.id].getCursor(false)
                                                };
                                                window["codemirror_" + editor.id].autoFormatRange(range.from, range.to);
                                            }
                                        }, {
                                            type: 'button',
                                            id: 'CommentSelectedRange',
                                            label: '',
                                            title: lang.commentSelectedRange,
                                            'class': 'CommentSelectedRange',
                                            onClick: function () {
                                                var range = {
                                                    from: window["codemirror_" + editor.id].getCursor(true),
                                                    to: window["codemirror_" + editor.id].getCursor(false)
                                                };
                                                window["codemirror_" + editor.id].commentRange(true, range.from, range.to);
                                            }
                                        }, {
                                            type: 'button',
                                            id: 'UncommentSelectedRange',
                                            label: '',
                                            title: lang.uncommentSelectedRange,
                                            'class': 'UncommentSelectedRange',
                                            onClick: function () {
                                                var range = {
                                                    from: window["codemirror_" + editor.id].getCursor(true),
                                                    to: window["codemirror_" + editor.id].getCursor(false)
                                                };
                                                window["codemirror_" + editor.id].commentRange(false, range.from, range.to);
                                                if (window["codemirror_" + editor.id].config.autoFormatOnUncomment) {
                                                    window["codemirror_" + editor.id].autoFormatRange(range.from, range.to);
                                                }
                                            }
                                        }]
                                }, {
                                    type: 'checkbox',
                                    id: 'AutoComplete',
                                    label: lang.autoCompleteToggle,
                                    title: lang.autoCompleteToggle,
                                    onChange: function () {
                                        window["codemirror_" + editor.id].setOption("autoCloseTags", this.getValue());
                                    }
                                }, {
                                    type: 'textarea',
                                    id: 'data',
                                    dir: 'ltr',
                                    inputStyle: 'cursor:auto;' +
                                        'width:' + width + 'px;' +
                                        'height:' + height + 'px;' +
                                        'tab-size:4;' +
                                        'text-align:left;',
                                    'class': 'cke_source cke_enable_context_menu'
                                }
                            ]
                        }]
                    };
                });

            }
            

            if (editor.commands.find) {
                editor.commands.find.modes = {
                    wysiwyg: 1,
                    source: 1
                };

                editor.commands.find.exec = function() {
                    if (editor.mode === 'wysiwyg') {
                        editor.openDialog('find');
                    } else {
                        CodeMirror.commands.find(window["codemirror_" + editor.id]);
                    }
                };
            }
            
            if (editor.commands.replace) {
                editor.commands.replace.modes = {
                    wysiwyg: 1,
                    source: 1
                };

                editor.commands.replace.exec = function () {
                    if (editor.mode === 'wysiwyg') {
                        editor.openDialog('replace');
                    } else {
                        CodeMirror.commands.replace(window["codemirror_" + editor.id]);
                    }
                };
            }
            
            var sourcearea = CKEDITOR.plugins.sourcearea;
            
            if (!sourcearea.commands.searchCode) {

                CKEDITOR.plugins.sourcearea.commands = {
                    source: {
                        modes: {
                            wysiwyg: 1,
                            source: 1
                        },
                        editorFocus: false,
                        readOnly: 1,
                        exec: function(editorInstance) {
                            if (editorInstance.mode === 'wysiwyg') {
                                editorInstance.fire('saveSnapshot');
                            }
                            editorInstance.getCommand('source').setState(CKEDITOR.TRISTATE_DISABLED);
                            editorInstance.setMode(editorInstance.mode === 'source' ? 'wysiwyg' : 'source');
                        },
                        canUndo: false
                    },
                    searchCode: {
                        modes: {
                            wysiwyg: 0,
                            source: 1
                        },
                        editorFocus: false,
                        readOnly: 1,
                        exec: function (editorInstance) {
                            CodeMirror.commands.find(window["codemirror_" + editorInstance.id]);
                        },
                        canUndo: true
                    },
                    autoFormat: {
                        modes: {
                            wysiwyg: 0,
                            source: 1
                        },
                        editorFocus: false,
                        readOnly: 1,
                        exec: function (editorInstance) {
                            var range = {
                                from: window["codemirror_" + editorInstance.id].getCursor(true),
                                to: window["codemirror_" + editorInstance.id].getCursor(false)
                            };
                            window["codemirror_" + editorInstance.id].autoFormatRange(range.from, range.to);
                        },
                        canUndo: true
                    },
                    commentSelectedRange: {
                        modes: {
                            wysiwyg: 0,
                            source: 1
                        },
                        editorFocus: false,
                        readOnly: 1,
                        exec: function (editorInstance) {
                            var range = {
                                from: window["codemirror_" + editorInstance.id].getCursor(true),
                                to: window["codemirror_" + editorInstance.id].getCursor(false)
                            };
                            window["codemirror_" + editorInstance.id].commentRange(true, range.from, range.to);
                        },
                        canUndo: true
                    },
                    uncommentSelectedRange: {
                        modes: {
                            wysiwyg: 0,
                            source: 1
                        },
                        editorFocus: false,
                        readOnly: 1,
                        exec: function (editorInstance) {
                            var range = {
                                from: window["codemirror_" + editorInstance.id].getCursor(true),
                                to: window["codemirror_" + editorInstance.id].getCursor(false)
                            };
                            window["codemirror_" + editorInstance.id].commentRange(false, range.from, range.to);
                            if (window["codemirror_" + editorInstance.id].config.autoFormatOnUncomment) {
                                window["codemirror_" + editorInstance.id].autoFormatRange(
                                    range.from,
                                    range.to);
                            }
                        },
                        canUndo: true
                    },
                    autoCompleteToggle: {
                        modes: {
                            wysiwyg: 0,
                            source: 1
                        },
                        editorFocus: false,
                        readOnly: 1,
                        exec: function (editorInstance) {
                            if (this.state == CKEDITOR.TRISTATE_ON) {
                                window["codemirror_" + editorInstance.id].setOption("autoCloseTags", false);
                            } else if (this.state == CKEDITOR.TRISTATE_OFF) {
                                window["codemirror_" + editorInstance.id].setOption("autoCloseTags", true);
                            }

                            this.toggleState();
                        },
                        canUndo: true
                    }
                };
            }

            editor.addMode('source', function (callback) {
                if (!IsStyleSheetAlreadyLoaded(rootPath + 'css/codemirror.min.css')) {
                    CKEDITOR.document.appendStyleSheet(rootPath + 'css/codemirror.min.css');
                }

                if (config.theme.length && config.theme != 'default' && !IsStyleSheetAlreadyLoaded(rootPath + 'theme/' + config.theme + '.css')) {
                    CKEDITOR.document.appendStyleSheet(rootPath + 'theme/' + config.theme + '.css');
                }

                if (typeof (CodeMirror) == 'undefined') {

                    CKEDITOR.scriptLoader.load(rootPath + 'js/codemirror.min.js', function() {

                        CKEDITOR.scriptLoader.load(getCodeMirrorScripts(), function() {
                            loadCodeMirror(editor);
                            callback();
                        });
                    });
                } else {
                    if (CodeMirror.prototype['autoFormatAll']) {
                        loadCodeMirror(editor);
                        callback();
                    } else {
                        CKEDITOR.scriptLoader.load(getCodeMirrorScripts(), function() {
                            loadCodeMirror(editor);
                            callback();
                        });
                    }
                }
            });

            function getCodeMirrorScripts() {
                var scriptFiles = [rootPath + 'js/codemirror.addons.min.js'];

                switch (config.mode) {
                case "bbcode":
                    {
                        scriptFiles.push(rootPath + 'js/codemirror.mode.bbcode.min.js');
                    }

                    break;
                case "bbcodemixed":
                        {
                            scriptFiles.push(rootPath + 'js/codemirror.mode.bbcodemixed.min.js');
                        }

                        break;
                case "htmlmixed":
                    {
                        scriptFiles.push(rootPath + 'js/codemirror.mode.htmlmixed.min.js');
                    }

                    break;
                case "text/html":
                    {
                        scriptFiles.push(rootPath + 'js/codemirror.mode.htmlmixed.min.js');
                    }

                    break;
                case "application/x-httpd-php":
                    {
                        scriptFiles.push(rootPath + 'js/codemirror.mode.php.min.js');
                    }

                    break;
                case "text/javascript":
                    {
                        scriptFiles.push(rootPath + 'js/codemirror.mode.javascript.min.js');
                    }

                    break;
                default:
                    scriptFiles.push(rootPath + 'js/codemirror.mode.htmlmixed.min.js');
                }

                if (config.useBeautify) {
                    scriptFiles.push(rootPath + 'js/beautify.min.js');
                }

                if (config.enableSearchTools) {
                    scriptFiles.push(rootPath + 'js/codemirror.addons.search.min.js');
                }
                return scriptFiles;
            }

            function loadCodeMirror(editor) {
                var contentsSpace = editor.ui.space('contents'),
                    textarea = contentsSpace.getDocument().createElement('textarea');

                textarea.setStyles(
                    CKEDITOR.tools.extend({
                            width: CKEDITOR.env.ie7Compat ? '99%' : '100%',
                            height: '100%',
                            resize: 'none',
                            outline: 'none',
                            'text-align': 'left'
                        },
                        CKEDITOR.tools.cssVendorPrefix('tab-size', editor.config.sourceAreaTabSize || 4)));
                var ariaLabel = [editor.lang.editor, editor.name].join(',');
                textarea.setAttributes({
                    dir: 'ltr',
                    tabIndex: CKEDITOR.env.webkit ? -1 : editor.tabIndex,
                    'role': 'textbox',
                    'aria-label': ariaLabel
                });
                textarea.addClass('cke_source');
                textarea.addClass('cke_reset');
                textarea.addClass('cke_enable_context_menu');
                editor.ui.space('contents').append(textarea);
                window["editable_" + editor.id] = editor.editable(new sourceEditable(editor, textarea));
                window["editable_" + editor.id].setData(editor.getData(1));
                window["editable_" + editor.id].editorID = editor.id;
                editor.fire('ariaWidget', this);

                var sourceAreaElement = window["editable_" + editor.id],
                    holderElement = sourceAreaElement.getParent();


                if (config.lineNumbers && config.enableCodeFolding) {
                    window["foldFunc_" + editor.id] = CodeMirror.newFoldFunction(CodeMirror.tagRangeFinder);
                }

                function getCodeMirrorKey(ckeditorKeystroke) {
                    var MODIFIERS = [
                        [CKEDITOR.SHIFT, "Shift-"],
                        [CKEDITOR.CTRL, "Ctrl-"],
                        [CKEDITOR.ALT, "Alt-"]
                    ];
                    var keyModifiers = "";
                    for (var i = 0; i < MODIFIERS.length; i++) {
                        if (ckeditorKeystroke & MODIFIERS[i][0]) {
                            ckeditorKeystroke -= MODIFIERS[i][0];
                            keyModifiers += MODIFIERS[i][1];
                        }
                    }
                    if (CodeMirror.keyNames[ckeditorKeystroke]) {
                        return keyModifiers + CodeMirror.keyNames[ckeditorKeystroke];
                    }
                    return null;
                }

                function addCKEditorKeystrokes(editorExtraKeys) {
                    var ckeditorKeystrokes = editor.config.keystrokes;
                    if (CKEDITOR.tools.isArray(ckeditorKeystrokes)) {
                        for (var i = 0; i < ckeditorKeystrokes.length; i++) {
                            var key = getCodeMirrorKey(ckeditorKeystrokes[i][0]);
                            if (key !== null) {
                                (function (command) {
                                    editorExtraKeys[key] = function () {
                                        editor.execCommand(command);
                                    }
                                })(ckeditorKeystrokes[i][1]);
                            }
                        }
                    }
                }

                var extraKeys = {
                    "Ctrl-Q": function(codeMirror_Editor) {
                        if (config.enableCodeFolding) {
                            window["foldFunc_" + editor.id](codeMirror_Editor, codeMirror_Editor.getCursor().line);
                        }
                    },
                    "'>'": function (codeMirror_Editor) {
                        codeMirror_Editor.closeTag(codeMirror_Editor, '>');
                    },
                    "'/'": function (codeMirror_Editor) {
                        codeMirror_Editor.closeTag(codeMirror_Editor, '/');
                    }
                };

                addCKEditorKeystrokes(extraKeys);

                window["codemirror_" + editor.id] = CodeMirror.fromTextArea(sourceAreaElement.$, {
                    mode: config.mode,
                    matchBrackets: config.matchBrackets,
                    matchTags: config.matchTags,
                    workDelay: 300,
                    workTime: 35,
                    readOnly: editor.readOnly,
                    lineNumbers: config.lineNumbers,
                    lineWrapping: true,
                    autoCloseTags: config.autoCloseTags,
                    autoCloseBrackets: config.autoCloseBrackets,
                    highlightSelectionMatches: config.highlightMatches,
                    continueComments: config.continueComments,
                    indentWithTabs: config.indentWithTabs,
                    theme: config.theme,
                    showTrailingSpace: config.showTrailingSpace,
                    showCursorWhenSelecting: true,
                    styleActiveLine: config.styleActiveLine,
                    extraKeys: extraKeys,
                    foldGutter: true,
                    gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"],
                    onKeyEvent: function (codeMirror_Editor, evt) {
                        
                        if (config.enableCodeFormatting) {
                            var range = getSelectedRange();
                            if (evt.type === "keydown" && evt.ctrlKey && evt.keyCode === 75 && !evt.shiftKey && !evt.altKey) {
                                window["codemirror_" + editor.id].commentRange(true, range.from, range.to);
                            } else if (evt.type === "keydown" && evt.ctrlKey && evt.keyCode === 75 && evt.shiftKey && !evt.altKey) {
                                window["codemirror_" + editor.id].commentRange(false, range.from, range.to);
                                if (config.autoFormatOnUncomment) {
                                    window["codemirror_" + editor.id].autoFormatRange(range.from, range.to);
                                }
                            } else if (evt.type === "keydown" && evt.ctrlKey && evt.keyCode === 75 && !evt.shiftKey && evt.altKey) {
                                window["codemirror_" + editor.id].autoFormatRange(range.from, range.to);
                            }                        }
                    }
                });

                var holderHeight = holderElement.$.clientHeight == 0 ? editor.ui.space('contents').getStyle('height') : holderElement.$.clientHeight + 'px';
                var holderWidth = holderElement.$.clientWidth + 'px';

                window["codemirror_" + editor.id].config = config;
                if (config.autoFormatOnStart) {
                    if (config.useBeautify) {
                        var indent_size = 4;
                        var indent_char = ' ';
                        var brace_style = 'collapse'; //collapse, expand, end-expand 

                        var source = window["codemirror_" + editor.id].getValue();

                        window["codemirror_" + editor.id].setValue(html_beautify(source, indent_size, indent_char, 120, brace_style));
                    } else {
                        window["codemirror_" + editor.id].autoFormatAll({
                            line: 0,
                            ch: 0
                        }, {
                            line: window["codemirror_" + editor.id].lineCount(),
                            ch: 0
                        });
                    }
                }

                function getSelectedRange() {
                    return {
                        from: window["codemirror_" + editor.id].getCursor(true),
                        to: window["codemirror_" + editor.id].getCursor(false)
                    };
                }

                window["codemirror_" + editor.id].on("change", function () {
                    window["codemirror_" + editor.id].save();
                    editor.fire('change', this);
                });

                window["codemirror_" + editor.id].setSize(null, holderHeight);
                
                if (config.lineNumbers && config.enableCodeFolding) {
                    window["codemirror_" + editor.id].on("gutterClick", window["foldFunc_" + editor.id]);
                }

                if (typeof config.onLoad === 'function') {
                    config.onLoad(window["codemirror_" + editor.id], editor);
                }

                window["codemirror_" + editor.id].on("blur", function () {
                    editor.fire('blur', this);
                });
            }

            editor.addCommand('source', sourcearea.commands.source);
            if (editor.ui.addButton) {
                editor.ui.addButton('Source', {
                    label: editor.lang.codemirror.toolbar,
                    command: 'source',
                    toolbar: 'mode,10'
                });
            }
            if (config.enableCodeFormatting) {
                editor.addCommand('searchCode', sourcearea.commands.searchCode);
                editor.addCommand('autoFormat', sourcearea.commands.autoFormat);
                editor.addCommand('commentSelectedRange', sourcearea.commands.commentSelectedRange);
                editor.addCommand('uncommentSelectedRange', sourcearea.commands.uncommentSelectedRange);
                editor.addCommand('autoCompleteToggle', sourcearea.commands.autoCompleteToggle);

                if (editor.ui.addButton) {
                    if (config.showFormatButton || config.showCommentButton || config.showUncommentButton || config.showSearchButton) {
                        editor.ui.add('-', CKEDITOR.UI_SEPARATOR, { toolbar: 'mode,30' });
                    }
                    if (config.showFormatButton) {
                        editor.ui.addButton('autoFormat', {
                            label: lang.autoFormat,
                            command: 'autoFormat',
                            toolbar: 'mode,50'
                        });
                    }
                    if (config.showCommentButton) {
                        editor.ui.addButton('CommentSelectedRange', {
                            label: lang.commentSelectedRange,
                            command: 'commentSelectedRange',
                            toolbar: 'mode,60'
                        });
                    }
                    if (config.showUncommentButton) {
                        editor.ui.addButton('UncommentSelectedRange', {
                            label: lang.uncommentSelectedRange,
                            command: 'uncommentSelectedRange',
                            toolbar: 'mode,70'
                        });
                    }
                    if (config.showAutoCompleteButton) {
                        editor.ui.addButton('AutoComplete', {
                            label: lang.autoCompleteToggle,
                            command: 'autoCompleteToggle',
                            toolbar: 'mode,80'
                        });
                    }
                }
            }
            
            editor.on('beforeModeUnload', function (evt) {
                if (editor.mode === 'source' && editor.plugins.textselection) {

                    var range = editor.getTextSelection();

                    range.startOffset = LineChannelToOffSet(window["codemirror_" + editor.id], window["codemirror_" + editor.id].getCursor(true));
                    range.endOffset = LineChannelToOffSet(window["codemirror_" + editor.id], window["codemirror_" + editor.id].getCursor(false));

                    delete range.element;
                    range.createBookmark(editor);
                    sourceBookmark = true;

                    evt.data = range.content;
                }
            });
            editor.on('mode', function () {
                editor.getCommand('source').setState(editor.mode === 'source' ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF);

                if (editor.mode === 'source') {
                    editor.getCommand('autoCompleteToggle').setState(window["codemirror_" + editor.id].config.autoCloseTags ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF);

                    if (editor.plugins.textselection && textRange) {


                        var start, end;

                        start = OffSetToLineChannel(window["codemirror_" + editor.id], textRange.startOffset);

                        if (typeof (textRange.endOffset) == 'undefined') {
                            window["codemirror_" + editor.id].focus();
                            window["codemirror_" + editor.id].setCursor(start);
                        } else {
                            window["codemirror_" + editor.id].focus();
                            end = OffSetToLineChannel(window["codemirror_" + editor.id], textRange.endOffset);
                            window["codemirror_" + editor.id].setSelection(start, end);
                        }
                    }
                }

            });
            editor.on('resize', function() {
                if (window["editable_" + editor.id] && editor.mode === 'source') {
                    var holderElement = window["editable_" + editor.id].getParent();
                    var holderHeight = holderElement.$.clientHeight + 'px';
                    var holderWidth = holderElement.$.clientWidth + 'px';
                    window["codemirror_" + editor.id].setSize(holderWidth, holderHeight);
                }
            });
            
            editor.on('readOnly', function () {
                if (window["editable_" + editor.id] && editor.mode === 'source') {
                    window["codemirror_" + editor.id].setOption("readOnly", this.readOnly);
                }
            });
            
            editor.on('instanceReady', function (evt) {

                editor.container.getPrivate().events.contextmenu.listeners.splice(0, 1);

                var selectAllCommand = editor.commands.selectAll;

                if (selectAllCommand != null) {
                    selectAllCommand.exec = function () {
                        if (editor.mode === 'source') {
                            window["codemirror_" + editor.id].setSelection({
                                line: 0,
                                ch: 0
                            }, {
                                line: window["codemirror_" + editor.id].lineCount(),
                                ch: 0
                            });
                        } else {
                            var editable = editor.editable();
                            if (editable.is('body'))
                                editor.document.$.execCommand('SelectAll', false, null);
                            else {
                                var range = editor.createRange();
                                range.selectNodeContents(editable);
                                range.select();
                            }

                            editor.forceNextSelectionCheck();
                            editor.selectionChange();
                        }
                    };
                }
            });

            if (typeof (jQuery) != 'undefined' && jQuery('a[data-toggle="tab"]') && window["codemirror_" + editor.id]) {
                jQuery('a[data-toggle="tab"]').on('shown.bs.tab', function() {
                    window["codemirror_" + editor.id].refresh();
                });
            }

            editor.on('setData', function (data) {
 
                if (window["editable_" + editor.id] && editor.mode === 'source') {
                    window["codemirror_" + editor.id].setValue(data.data.dataValue);
                }
            });
        }
    });
    var sourceEditable = CKEDITOR.tools.createClass({
        base: CKEDITOR.editable,
        proto: {
            setData: function(data) {

                this.setValue(data);

                if (this.codeMirror != null) {
                    this.codeMirror.setValue(data);
                }

                this.editor.fire('dataReady');
            },
            getData: function() {
                return this.getValue();
            },
            insertHtml: function() {
            },
            insertElement: function() {
            },
            insertText: function() {
            },
            setReadOnly: function(isReadOnly) {
                this[(isReadOnly ? 'set' : 'remove') + 'Attribute']('readOnly', 'readonly');
            },
            editorID: null,
            detach: function() {
                window["codemirror_" + this.editorID].toTextArea();
                
                window["editable_" + this.editorID] = null;
                window["codemirror_" + this.editorID] = null;

                sourceEditable.baseProto.detach.call(this);
                
                this.clearCustomData();
                this.remove();
            }
        }
    });
})();
CKEDITOR.plugins.sourcearea = {
    commands: {
        source: {
            modes: {
                wysiwyg: 1,
                source: 1
            },
            editorFocus: false,
            readOnly: 1,
            exec: function(editor) {
                if (editor.mode === 'wysiwyg') {
                    editor.fire('saveSnapshot');
                }

                editor.getCommand('source').setState(CKEDITOR.TRISTATE_DISABLED);
                editor.setMode(editor.mode === 'source' ? 'wysiwyg' : 'source');
            },
            canUndo: false
        },
        searchCode: {
            modes: {
                wysiwyg: 0,
                source: 1
            },
            editorFocus: false,
            readOnly: 1,
            exec: function(editor) {
                CodeMirror.commands.find(window["codemirror_" + editor.id]);
            },
            canUndo: true
        },
        autoFormat: {
            modes: {
                wysiwyg: 0,
                source: 1
            },
            editorFocus: false,
            readOnly: 0,
            exec: function (editor) {
                var range = {
                    from: window["codemirror_" + editor.id].getCursor(true),
                    to: window["codemirror_" + editor.id].getCursor(false)
                };
                window["codemirror_" + editor.id].autoFormatRange(range.from, range.to);
            },
            canUndo: true
        },
        commentSelectedRange: {
            modes: {
                wysiwyg: 0,
                source: 1
            },
            editorFocus: false,
            readOnly: 0,
            exec: function (editor) {
                var range = {
                    from: window["codemirror_" + editor.id].getCursor(true),
                    to: window["codemirror_" + editor.id].getCursor(false)
                };
                window["codemirror_" + editor.id].commentRange(true, range.from, range.to);
            },
            canUndo: true
        },
        uncommentSelectedRange: {
            modes: {
                wysiwyg: 0,
                source: 1
            },
            editorFocus: false,
            readOnly: 0,
            exec: function(editor) {
                var range = {
                    from: window["codemirror_" + editor.id].getCursor(true),
                    to: window["codemirror_" + editor.id].getCursor(false)
                };
                window["codemirror_" + editor.id].commentRange(false, range.from, range.to);
                if (window["codemirror_" + editor.id].config.autoFormatOnUncomment) {
                    window["codemirror_" + editor.id].autoFormatRange(
                        range.from,
                        range.to);
                }
            },
            canUndo: true
        },
        autoCompleteToggle: {
            modes: {
                wysiwyg: 0,
                source: 1
            },
            editorFocus: false,
            readOnly: 1,
            exec: function (editor) {
                if (this.state == CKEDITOR.TRISTATE_ON) {
                    window["codemirror_" + editor.id].setOption("autoCloseTags", false);
                } else if (this.state == CKEDITOR.TRISTATE_OFF) {
                    window["codemirror_" + editor.id].setOption("autoCloseTags", true);
                }

                this.toggleState();
            },
            canUndo: true
        }
    }
};

function LineChannelToOffSet(ed, linech) {
    var line = linech.line;
    var ch = linech.ch;
    var n = (line + ch); //for the \n s & chars in the line
    for (i = 0; i < line; i++) {
        n += (ed.getLine(i)).length;//for the chars in all preceeding lines
    }
    return n;
}

function OffSetToLineChannel(ed, n) {
    var line = 0, ch = 0, index = 0;
    for (i = 0; i < ed.lineCount() ; i++) {
        len = (ed.getLine(i)).length;
        if (n < index + len) {
            
            line = i;
            ch = n - index;
            return { line: line, ch: ch };
        }
        len++;//for \n char
        index += len;
    }
    return { line: line, ch: ch };
}

function IsStyleSheetAlreadyLoaded(href) {
    var links = CKEDITOR.document.getHead().find('link');

    for (var i = 0; i < links.count() ; i++) {
        if (links.getItem(i).$.href === href) {
            return true;
        }
    }

    return false;
}
extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/js/codemirror.mode.p000060400000222265152453623450033722 0ustar00components/com_acymailing(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"),require("../xml/xml"),require("../javascript/javascript"),require("../css/css"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror","../xml/xml","../javascript/javascript","../css/css"],a)}else{a(CodeMirror)}}})(function(a){a.defineMode("htmlmixed",function(c,d){var b=a.getMode(c,{name:"xml",htmlMode:true,multilineTagIndentFactor:d.multilineTagIndentFactor,multilineTagIndentPastTag:d.multilineTagIndentPastTag});var n=a.getMode(c,"css");var l=[],k=d&&d.scriptTypes;l.push({matches:/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^$/i,mode:a.getMode(c,"javascript")});if(k){for(var e=0;e<k.length;++e){var j=k[e];l.push({matches:j.matches,mode:j.mode&&a.getMode(c,j.mode)})}}l.push({matches:/./,mode:a.getMode(c,"text/plain")});function f(t,r){var p=r.htmlState.tagName;if(p){p=p.toLowerCase()}var q=b.token(t,r.htmlState);if(p=="script"&&/\btag\b/.test(q)&&t.current()==">"){var u=t.string.slice(Math.max(0,t.pos-100),t.pos).match(/\btype\s*=\s*("[^"]+"|'[^']+'|\S+)[^<]*$/i);u=u?u[1]:"";if(u&&/[\"\']/.test(u.charAt(0))){u=u.slice(1,u.length-1)}for(var o=0;o<l.length;++o){var s=l[o];if(typeof s.matches=="string"?u==s.matches:s.matches.test(u)){if(s.mode){r.token=m;r.localMode=s.mode;r.localState=s.mode.startState&&s.mode.startState(b.indent(r.htmlState,""))}break}}}else{if(p=="style"&&/\btag\b/.test(q)&&t.current()==">"){r.token=g;r.localMode=n;r.localState=n.startState(b.indent(r.htmlState,""))}}return q}function h(r,i,o){var q=r.current();var p=q.search(i);if(p>-1){r.backUp(q.length-p)}else{if(q.match(/<\/?$/)){r.backUp(q.length);if(!r.match(i,false)){r.match(q)}}}return o}function m(o,i){if(o.match(/^<\/\s*script\s*>/i,false)){i.token=f;i.localState=i.localMode=null;return null}return h(o,/<\/\s*script\s*>/,i.localMode.token(o,i.localState))}function g(o,i){if(o.match(/^<\/\s*style\s*>/i,false)){i.token=f;i.localState=i.localMode=null;return null}return h(o,/<\/\s*style\s*>/,n.token(o,i.localState))}return{startState:function(){var i=b.startState();return{token:f,localMode:null,localState:null,htmlState:i}},copyState:function(o){if(o.localState){var i=a.copyState(o.localMode,o.localState)}return{token:o.token,localMode:o.localMode,localState:i,htmlState:a.copyState(b,o.htmlState)}},token:function(o,i){return i.token(o,i)},indent:function(o,i){if(!o.localMode||/^\s*<\//.test(i)){return b.indent(o.htmlState,i)}else{if(o.localMode.indent){return o.localMode.indent(o.localState,i)}else{return a.Pass}}},innerMode:function(i){return{state:i.localState||i.htmlState,mode:i.localMode||b}}}},"xml","javascript","css");a.defineMIME("text/html","htmlmixed")});(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror"],a)}else{a(CodeMirror)}}})(function(a){a.defineMode("xml",function(y,k){var p=y.indentUnit;var x=k.multilineTagIndentFactor||1;var d=k.multilineTagIndentPastTag;if(d==null){d=true}var w=k.htmlMode?{autoSelfClosers:{area:true,base:true,br:true,col:true,command:true,embed:true,frame:true,hr:true,img:true,input:true,keygen:true,link:true,meta:true,param:true,source:true,track:true,wbr:true,menuitem:true},implicitlyClosed:{dd:true,li:true,optgroup:true,option:true,p:true,rp:true,rt:true,tbody:true,td:true,tfoot:true,th:true,tr:true},contextGrabbers:{dd:{dd:true,dt:true},dt:{dd:true,dt:true},li:{li:true},option:{option:true,optgroup:true},optgroup:{optgroup:true},p:{address:true,article:true,aside:true,blockquote:true,dir:true,div:true,dl:true,fieldset:true,footer:true,form:true,h1:true,h2:true,h3:true,h4:true,h5:true,h6:true,header:true,hgroup:true,hr:true,menu:true,nav:true,ol:true,p:true,pre:true,section:true,table:true,ul:true},rp:{rp:true,rt:true},rt:{rp:true,rt:true},tbody:{tbody:true,tfoot:true},td:{td:true,th:true},tfoot:{tbody:true},th:{td:true,th:true},thead:{tbody:true,tfoot:true},tr:{tr:true}},doNotIndent:{pre:true},allowUnquoted:true,allowMissing:true,caseFold:true}:{autoSelfClosers:{},implicitlyClosed:{},contextGrabbers:{},doNotIndent:{},allowUnquoted:false,allowMissing:false,caseFold:false};var c=k.alignCDATA;var f,g;function n(F,E){function C(G){E.tokenize=G;return G(F,E)}var D=F.next();if(D=="<"){if(F.eat("!")){if(F.eat("[")){if(F.match("CDATA[")){return C(v("atom","]]>"))}else{return null}}else{if(F.match("--")){return C(v("comment","-->"))}else{if(F.match("DOCTYPE",true,true)){F.eatWhile(/[\w\._\-]/);return C(z(1))}else{return null}}}}else{if(F.eat("?")){F.eatWhile(/[\w\._\-]/);E.tokenize=v("meta","?>");return"meta"}else{f=F.eat("/")?"closeTag":"openTag";E.tokenize=m;return"tag bracket"}}}else{if(D=="&"){var B;if(F.eat("#")){if(F.eat("x")){B=F.eatWhile(/[a-fA-F\d]/)&&F.eat(";")}else{B=F.eatWhile(/[\d]/)&&F.eat(";")}}else{B=F.eatWhile(/[\w\.\-:]/)&&F.eat(";")}return B?"atom":"error"}else{F.eatWhile(/[^&<]/);return null}}}function m(E,D){var C=E.next();if(C==">"||(C=="/"&&E.eat(">"))){D.tokenize=n;f=C==">"?"endTag":"selfcloseTag";return"tag bracket"}else{if(C=="="){f="equals";return null}else{if(C=="<"){D.tokenize=n;D.state=l;D.tagName=D.tagStart=null;var B=D.tokenize(E,D);return B?B+" tag error":"tag error"}else{if(/[\'\"]/.test(C)){D.tokenize=j(C);D.stringStartCol=E.column();return D.tokenize(E,D)}else{E.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/);return"word"}}}}}function j(B){var C=function(E,D){while(!E.eol()){if(E.next()==B){D.tokenize=m;break}}return"string"};C.isInAttribute=true;return C}function v(C,B){return function(E,D){while(!E.eol()){if(E.match(B)){D.tokenize=n;break}E.next()}return C}}function z(B){return function(E,D){var C;while((C=E.next())!=null){if(C=="<"){D.tokenize=z(B+1);return D.tokenize(E,D)}else{if(C==">"){if(B==1){D.tokenize=n;break}else{D.tokenize=z(B-1);return D.tokenize(E,D)}}}}return"meta"}}function r(C,B,D){this.prev=C.context;this.tagName=B;this.indent=C.indented;this.startOfLine=D;if(w.doNotIndent.hasOwnProperty(B)||(C.context&&C.context.noIndent)){this.noIndent=true}}function u(B){if(B.context){B.context=B.context.prev}}function q(D,C){var B;while(true){if(!D.context){return}B=D.context.tagName;if(!w.contextGrabbers.hasOwnProperty(B)||!w.contextGrabbers[B].hasOwnProperty(C)){return}u(D)}}function l(B,D,C){if(B=="openTag"){C.tagStart=D.column();return b}else{if(B=="closeTag"){return t}else{return l}}}function b(B,D,C){if(B=="word"){C.tagName=D.current();g="tag";return e}else{g="error";return b}}function t(C,E,D){if(C=="word"){var B=E.current();if(D.context&&D.context.tagName!=B&&w.implicitlyClosed.hasOwnProperty(D.context.tagName)){u(D)}if(D.context&&D.context.tagName==B){g="tag";return s}else{g="tag error";return A}}else{g="error";return A}}function s(C,B,D){if(C!="endTag"){g="error";return s}u(D);return l}function A(B,D,C){g="error";return s(B,D,C)}function e(E,C,F){if(E=="word"){g="attribute";return i}else{if(E=="endTag"||E=="selfcloseTag"){var D=F.tagName,B=F.tagStart;F.tagName=F.tagStart=null;if(E=="selfcloseTag"||w.autoSelfClosers.hasOwnProperty(D)){q(F,D)}else{q(F,D);F.context=new r(F,D,B==F.indented)}return l}}g="error";return e}function i(B,D,C){if(B=="equals"){return o}if(!w.allowMissing){g="error"}return e(B,D,C)}function o(B,D,C){if(B=="string"){return h}if(B=="word"&&w.allowUnquoted){g="string";return e}g="error";return e(B,D,C)}function h(B,D,C){if(B=="string"){return h}return e(B,D,C)}return{startState:function(){return{tokenize:n,state:l,indented:0,tagName:null,tagStart:null,context:null}},token:function(D,C){if(!C.tagName&&D.sol()){C.indented=D.indentation()}if(D.eatSpace()){return null}f=null;var B=C.tokenize(D,C);if((B||f)&&B!="comment"){g=null;C.state=C.state(f||B,D,C);if(g){B=g=="error"?B+" error":g}}return B},indent:function(G,C,F){var E=G.context;if(G.tokenize.isInAttribute){if(G.tagStart==G.indented){return G.stringStartCol+1}else{return G.indented+p}}if(E&&E.noIndent){return a.Pass}if(G.tokenize!=m&&G.tokenize!=n){return F?F.match(/^(\s*)/)[0].length:0}if(G.tagName){if(d){return G.tagStart+G.tagName.length+2}else{return G.tagStart+p*x}}if(c&&/<!\[CDATA\[/.test(C)){return 0}var B=C&&/^<(\/)?([\w_:\.-]*)/.exec(C);if(B&&B[1]){while(E){if(E.tagName==B[2]){E=E.prev;break}else{if(w.implicitlyClosed.hasOwnProperty(E.tagName)){E=E.prev}else{break}}}}else{if(B){while(E){var D=w.contextGrabbers[E.tagName];if(D&&D.hasOwnProperty(B[2])){E=E.prev}else{break}}}}while(E&&!E.startOfLine){E=E.prev}if(E){return E.indent+p}else{return 0}},electricInput:/<\/[\s\w:]+>$/,blockCommentStart:"<!--",blockCommentEnd:"-->",configuration:k.htmlMode?"html":"xml",helperType:k.htmlMode?"html":"xml"}});a.defineMIME("text/xml","xml");a.defineMIME("application/xml","xml");if(!a.mimeModes.hasOwnProperty("text/html")){a.defineMIME("text/html",{name:"xml",htmlMode:true})}});(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror"],a)}else{a(CodeMirror)}}})(function(a){a.defineMode("javascript",function(Z,aj){var l=Z.indentUnit;var A=aj.statementIndent;var aB=aj.jsonld;var z=aj.json||aB;var g=aj.typescript;var au=aj.wordCharacters||/[\w$\xa1-\uffff]/;var ar=function(){function aR(aT){return{type:aT,style:"keyword"}}var aM=aR("keyword a"),aK=aR("keyword b"),aJ=aR("keyword c");var aL=aR("operator"),aP={type:"atom",style:"atom"};var aN={"if":aR("if"),"while":aM,"with":aM,"else":aK,"do":aK,"try":aK,"finally":aK,"return":aJ,"break":aJ,"continue":aJ,"new":aJ,"delete":aJ,"throw":aJ,"debugger":aJ,"var":aR("var"),"const":aR("var"),let:aR("var"),"function":aR("function"),"catch":aR("catch"),"for":aR("for"),"switch":aR("switch"),"case":aR("case"),"default":aR("default"),"in":aL,"typeof":aL,"instanceof":aL,"true":aP,"false":aP,"null":aP,"undefined":aP,"NaN":aP,"Infinity":aP,"this":aR("this"),module:aR("module"),"class":aR("class"),"super":aR("atom"),yield:aJ,"export":aR("export"),"import":aR("import"),"extends":aJ};if(g){var aS={type:"variable",style:"variable-3"};var aO={"interface":aR("interface"),"extends":aR("extends"),constructor:aR("constructor"),"public":aR("public"),"private":aR("private"),"protected":aR("protected"),"static":aR("static"),string:aS,number:aS,bool:aS,any:aS};for(var aQ in aO){aN[aQ]=aO[aQ]}}return aN}();var P=/[+\-*&%=<>!?|~^]/;var aq=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/;function F(aM){var aK=false,aJ,aL=false;while((aJ=aM.next())!=null){if(!aK){if(aJ=="/"&&!aL){return}if(aJ=="["){aL=true}else{if(aL&&aJ=="]"){aL=false}}}aK=!aK&&aJ=="\\"}}var S,G;function L(aL,aK,aJ){S=aL;G=aJ;return aK}function U(aN,aL){var aJ=aN.next();if(aJ=='"'||aJ=="'"){aL.tokenize=R(aJ);return aL.tokenize(aN,aL)}else{if(aJ=="."&&aN.match(/^\d+(?:[eE][+\-]?\d+)?/)){return L("number","number")}else{if(aJ=="."&&aN.match("..")){return L("spread","meta")}else{if(/[\[\]{}\(\),;\:\.]/.test(aJ)){return L(aJ)}else{if(aJ=="="&&aN.eat(">")){return L("=>","operator")}else{if(aJ=="0"&&aN.eat(/x/i)){aN.eatWhile(/[\da-f]/i);return L("number","number")}else{if(/\d/.test(aJ)){aN.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);return L("number","number")}else{if(aJ=="/"){if(aN.eat("*")){aL.tokenize=aA;return aA(aN,aL)}else{if(aN.eat("/")){aN.skipToEnd();return L("comment","comment")}else{if(aL.lastType=="operator"||aL.lastType=="keyword c"||aL.lastType=="sof"||/^[\[{}\(,;:]$/.test(aL.lastType)){F(aN);aN.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/);return L("regexp","string-2")}else{aN.eatWhile(P);return L("operator","operator",aN.current())}}}}else{if(aJ=="`"){aL.tokenize=aC;return aC(aN,aL)}else{if(aJ=="#"){aN.skipToEnd();return L("error","error")}else{if(P.test(aJ)){aN.eatWhile(P);return L("operator","operator",aN.current())}else{if(au.test(aJ)){aN.eatWhile(au);var aM=aN.current(),aK=ar.propertyIsEnumerable(aM)&&ar[aM];return(aK&&aL.lastType!=".")?L(aK.type,aK.style,aM):L("variable","variable",aM)}}}}}}}}}}}}}function R(aJ){return function(aN,aL){var aM=false,aK;if(aB&&aN.peek()=="@"&&aN.match(aq)){aL.tokenize=U;return L("jsonld-keyword","meta")}while((aK=aN.next())!=null){if(aK==aJ&&!aM){break}aM=!aM&&aK=="\\"}if(!aM){aL.tokenize=U}return L("string","string")}}function aA(aM,aL){var aJ=false,aK;while(aK=aM.next()){if(aK=="/"&&aJ){aL.tokenize=U;break}aJ=(aK=="*")}return L("comment","comment")}function aC(aM,aK){var aL=false,aJ;while((aJ=aM.next())!=null){if(!aL&&(aJ=="`"||aJ=="$"&&aM.eat("{"))){aK.tokenize=U;break}aL=!aL&&aJ=="\\"}return L("quasi","string-2",aM.current())}var m="([{}])";function ax(aP,aM){if(aM.fatArrowAt){aM.fatArrowAt=null}var aL=aP.string.indexOf("=>",aP.start);if(aL<0){return}var aO=0,aK=false;for(var aQ=aL-1;aQ>=0;--aQ){var aJ=aP.string.charAt(aQ);var aN=m.indexOf(aJ);if(aN>=0&&aN<3){if(!aO){++aQ;break}if(--aO==0){break}}else{if(aN>=3&&aN<6){++aO}else{if(au.test(aJ)){aK=true}else{if(/["'\/]/.test(aJ)){return}else{if(aK&&!aO){++aQ;break}}}}}}if(aK&&!aO){aM.fatArrowAt=aQ}}var b={atom:true,number:true,variable:true,string:true,regexp:true,"this":true,"jsonld-keyword":true};function J(aO,aK,aJ,aN,aL,aM){this.indented=aO;this.column=aK;this.type=aJ;this.prev=aL;this.info=aM;if(aN!=null){this.align=aN}}function s(aM,aL){for(var aK=aM.localVars;aK;aK=aK.next){if(aK.name==aL){return true}}for(var aJ=aM.context;aJ;aJ=aJ.prev){for(var aK=aJ.vars;aK;aK=aK.next){if(aK.name==aL){return true}}}}function f(aN,aK,aJ,aM,aO){var aP=aN.cc;D.state=aN;D.stream=aO;D.marked=null,D.cc=aP;D.style=aK;if(!aN.lexical.hasOwnProperty("align")){aN.lexical.align=true}while(true){var aL=aP.length?aP.pop():z?an:aH;if(aL(aJ,aM)){while(aP.length&&aP[aP.length-1].lex){aP.pop()()}if(D.marked){return D.marked}if(aJ=="variable"&&s(aN,aM)){return"variable-2"}return aK}}}var D={state:null,column:null,marked:null,cc:null};function aa(){for(var aJ=arguments.length-1;aJ>=0;aJ--){D.cc.push(arguments[aJ])}}function ae(){aa.apply(null,arguments);return true}function aw(aK){function aJ(aN){for(var aM=aN;aM;aM=aM.next){if(aM.name==aK){return true}}return false}var aL=D.state;if(aL.context){D.marked="def";if(aJ(aL.localVars)){return}aL.localVars={name:aK,next:aL.localVars}}else{if(aJ(aL.globalVars)){return}if(aj.globalVars){aL.globalVars={name:aK,next:aL.globalVars}}}}var q={name:"this",next:{name:"arguments"}};function w(){D.state.context={prev:D.state.context,vars:D.state.localVars};D.state.localVars=q}function x(){D.state.localVars=D.state.context.vars;D.state.context=D.state.context.prev}function aF(aK,aL){var aJ=function(){var aO=D.state,aM=aO.indented;if(aO.lexical.type=="stat"){aM=aO.lexical.indented}else{for(var aN=aO.lexical;aN&&aN.type==")"&&aN.align;aN=aN.prev){aM=aN.indented}}aO.lexical=new J(aM,D.stream.column(),aK,null,aO.lexical,aL)};aJ.lex=true;return aJ}function h(){var aJ=D.state;if(aJ.lexical.prev){if(aJ.lexical.type==")"){aJ.indented=aJ.lexical.indented}aJ.lexical=aJ.lexical.prev}}h.lex=true;function r(aJ){function aK(aL){if(aL==aJ){return ae()}else{if(aJ==";"){return aa()}else{return ae(aK)}}}return aK}function aH(aJ,aK){if(aJ=="var"){return ae(aF("vardef",aK.length),d,r(";"),h)}if(aJ=="keyword a"){return ae(aF("form"),an,aH,h)}if(aJ=="keyword b"){return ae(aF("form"),aH,h)}if(aJ=="{"){return ae(aF("}"),y,h)}if(aJ==";"){return ae()}if(aJ=="if"){if(D.state.lexical.info=="else"&&D.state.cc[D.state.cc.length-1]==h){D.state.cc.pop()()}return ae(aF("form"),an,aH,h,e)}if(aJ=="function"){return ae(M)}if(aJ=="for"){return ae(aF("form"),u,aH,h)}if(aJ=="variable"){return ae(aF("stat"),aI)}if(aJ=="switch"){return ae(aF("form"),an,aF("}","switch"),r("{"),y,h,h)}if(aJ=="case"){return ae(an,r(":"))}if(aJ=="default"){return ae(r(":"))}if(aJ=="catch"){return ae(aF("form"),w,r("("),af,r(")"),aH,h,x)}if(aJ=="module"){return ae(aF("form"),w,H,x,h)}if(aJ=="class"){return ae(aF("form"),V,h)}if(aJ=="export"){return ae(aF("form"),aG,h)}if(aJ=="import"){return ae(aF("form"),ag,h)}return aa(aF("stat"),an,r(";"),h)}function an(aJ){return Y(aJ,false)}function aE(aJ){return Y(aJ,true)}function Y(aK,aM){if(D.state.fatArrowAt==D.stream.start){var aJ=aM?N:W;if(aK=="("){return ae(w,aF(")"),at(i,")"),h,r("=>"),aJ,x)}else{if(aK=="variable"){return aa(w,i,r("=>"),aJ,x)}}}var aL=aM?j:ab;if(b.hasOwnProperty(aK)){return ae(aL)}if(aK=="function"){return ae(M,aL)}if(aK=="keyword c"){return ae(aM?ak:ai)}if(aK=="("){return ae(aF(")"),ai,az,r(")"),h,aL)}if(aK=="operator"||aK=="spread"){return ae(aM?aE:an)}if(aK=="["){return ae(aF("]"),n,h,aL)}if(aK=="{"){return ay(t,"}",null,aL)}if(aK=="quasi"){return aa(Q,aL)}return ae()}function ai(aJ){if(aJ.match(/[;\}\)\],]/)){return aa()}return aa(an)}function ak(aJ){if(aJ.match(/[;\}\)\],]/)){return aa()}return aa(aE)}function ab(aJ,aK){if(aJ==","){return ae(an)}return j(aJ,aK,false)}function j(aJ,aL,aN){var aK=aN==false?ab:j;var aM=aN==false?an:aE;if(aJ=="=>"){return ae(w,aN?N:W,x)}if(aJ=="operator"){if(/\+\+|--/.test(aL)){return ae(aK)}if(aL=="?"){return ae(an,r(":"),aM)}return ae(aM)}if(aJ=="quasi"){return aa(Q,aK)}if(aJ==";"){return}if(aJ=="("){return ay(aE,")","call",aK)}if(aJ=="."){return ae(al,aK)}if(aJ=="["){return ae(aF("]"),ai,r("]"),h,aK)}}function Q(aJ,aK){if(aJ!="quasi"){return aa()}if(aK.slice(aK.length-2)!="${"){return ae(Q)}return ae(an,p)}function p(aJ){if(aJ=="}"){D.marked="string-2";D.state.tokenize=aC;return ae(Q)}}function W(aJ){ax(D.stream,D.state);return aa(aJ=="{"?aH:an)}function N(aJ){ax(D.stream,D.state);return aa(aJ=="{"?aH:aE)}function aI(aJ){if(aJ==":"){return ae(h,aH)}return aa(ab,r(";"),h)}function al(aJ){if(aJ=="variable"){D.marked="property";return ae()}}function t(aJ,aK){if(aJ=="variable"||D.style=="keyword"){D.marked="property";if(aK=="get"||aK=="set"){return ae(I)}return ae(K)}else{if(aJ=="number"||aJ=="string"){D.marked=aB?"property":(D.style+" property");return ae(K)}else{if(aJ=="jsonld-keyword"){return ae(K)}else{if(aJ=="["){return ae(an,r("]"),K)}}}}}function I(aJ){if(aJ!="variable"){return aa(K)}D.marked="property";return ae(M)}function K(aJ){if(aJ==":"){return ae(aE)}if(aJ=="("){return aa(M)}}function at(aL,aJ){function aK(aN){if(aN==","){var aM=D.state.lexical;if(aM.info=="call"){aM.pos=(aM.pos||0)+1}return ae(aL,aK)}if(aN==aJ){return ae()}return ae(r(aJ))}return function(aM){if(aM==aJ){return ae()}return aa(aL,aK)}}function ay(aM,aJ,aL){for(var aK=3;aK<arguments.length;aK++){D.cc.push(arguments[aK])}return ae(aF(aJ,aL),at(aM,aJ),h)}function y(aJ){if(aJ=="}"){return ae()}return aa(aH,y)}function T(aJ){if(g&&aJ==":"){return ae(ad)}}function av(aJ,aK){if(aK=="="){return ae(aE)}}function ad(aJ){if(aJ=="variable"){D.marked="variable-3";return ae()}}function d(){return aa(i,T,ac,X)}function i(aJ,aK){if(aJ=="variable"){aw(aK);return ae()}if(aJ=="["){return ay(i,"]")}if(aJ=="{"){return ay(aD,"}")}}function aD(aJ,aK){if(aJ=="variable"&&!D.stream.match(/^\s*:/,false)){aw(aK);return ae(ac)}if(aJ=="variable"){D.marked="property"}return ae(r(":"),i,ac)}function ac(aJ,aK){if(aK=="="){return ae(aE)}}function X(aJ){if(aJ==","){return ae(d)}}function e(aJ,aK){if(aJ=="keyword b"&&aK=="else"){return ae(aF("form","else"),aH,h)}}function u(aJ){if(aJ=="("){return ae(aF(")"),E,r(")"),h)}}function E(aJ){if(aJ=="var"){return ae(d,r(";"),C)}if(aJ==";"){return ae(C)}if(aJ=="variable"){return ae(v)}return aa(an,r(";"),C)}function v(aJ,aK){if(aK=="in"||aK=="of"){D.marked="keyword";return ae(an)}return ae(ab,C)}function C(aJ,aK){if(aJ==";"){return ae(B)}if(aK=="in"||aK=="of"){D.marked="keyword";return ae(an)}return aa(an,r(";"),B)}function B(aJ){if(aJ!=")"){ae(an)}}function M(aJ,aK){if(aK=="*"){D.marked="keyword";return ae(M)}if(aJ=="variable"){aw(aK);return ae(M)}if(aJ=="("){return ae(w,aF(")"),at(af,")"),h,aH,x)}}function af(aJ){if(aJ=="spread"){return ae(af)}return aa(i,T,av)}function V(aJ,aK){if(aJ=="variable"){aw(aK);return ae(O)}}function O(aJ,aK){if(aK=="extends"){return ae(an,O)}if(aJ=="{"){return ae(aF("}"),o,h)}}function o(aJ,aK){if(aJ=="variable"||D.style=="keyword"){if(aK=="static"){D.marked="keyword";return ae(o)}D.marked="property";if(aK=="get"||aK=="set"){return ae(c,M,o)}return ae(M,o)}if(aK=="*"){D.marked="keyword";return ae(o)}if(aJ==";"){return ae(o)}if(aJ=="}"){return ae()}}function c(aJ){if(aJ!="variable"){return aa()}D.marked="property";return ae()}function H(aJ,aK){if(aJ=="string"){return ae(aH)}if(aJ=="variable"){aw(aK);return ae(ah)}}function aG(aJ,aK){if(aK=="*"){D.marked="keyword";return ae(ah,r(";"))}if(aK=="default"){D.marked="keyword";return ae(an,r(";"))}return aa(aH)}function ag(aJ){if(aJ=="string"){return ae()}return aa(ap,ah)}function ap(aJ,aK){if(aJ=="{"){return ay(ap,"}")}if(aJ=="variable"){aw(aK)}if(aK=="*"){D.marked="keyword"}return ae(k)}function k(aJ,aK){if(aK=="as"){D.marked="keyword";return ae(ap)}}function ah(aJ,aK){if(aK=="from"){D.marked="keyword";return ae(an)}}function n(aJ){if(aJ=="]"){return ae()}return aa(aE,am)}function am(aJ){if(aJ=="for"){return aa(az,r("]"))}if(aJ==","){return ae(at(ak,"]"))}return aa(at(aE,"]"))}function az(aJ){if(aJ=="for"){return ae(u,az)}if(aJ=="if"){return ae(an,az)}}function ao(aK,aJ){return aK.lastType=="operator"||aK.lastType==","||P.test(aJ.charAt(0))||/[,.]/.test(aJ.charAt(0))}return{startState:function(aK){var aJ={tokenize:U,lastType:"sof",cc:[],lexical:new J((aK||0)-l,0,"block",false),localVars:aj.localVars,context:aj.localVars&&{vars:aj.localVars},indented:0};if(aj.globalVars&&typeof aj.globalVars=="object"){aJ.globalVars=aj.globalVars}return aJ},token:function(aL,aK){if(aL.sol()){if(!aK.lexical.hasOwnProperty("align")){aK.lexical.align=false}aK.indented=aL.indentation();ax(aL,aK)}if(aK.tokenize!=aA&&aL.eatSpace()){return null}var aJ=aK.tokenize(aL,aK);if(S=="comment"){return aJ}aK.lastType=S=="operator"&&(G=="++"||G=="--")?"incdec":S;return f(aK,aJ,S,G,aL)},indent:function(aP,aJ){if(aP.tokenize==aA){return a.Pass}if(aP.tokenize!=U){return 0}var aO=aJ&&aJ.charAt(0),aM=aP.lexical;if(!/^\s*else\b/.test(aJ)){for(var aL=aP.cc.length-1;aL>=0;--aL){var aQ=aP.cc[aL];if(aQ==h){aM=aM.prev}else{if(aQ!=e){break}}}}if(aM.type=="stat"&&aO=="}"){aM=aM.prev}if(A&&aM.type==")"&&aM.prev.type=="stat"){aM=aM.prev}var aN=aM.type,aK=aO==aN;if(aN=="vardef"){return aM.indented+(aP.lastType=="operator"||aP.lastType==","?aM.info+1:0)}else{if(aN=="form"&&aO=="{"){return aM.indented}else{if(aN=="form"){return aM.indented+l}else{if(aN=="stat"){return aM.indented+(ao(aP,aJ)?A||l:0)}else{if(aM.info=="switch"&&!aK&&aj.doubleIndentSwitch!=false){return aM.indented+(/^(?:case|default)\b/.test(aJ)?l:2*l)}else{if(aM.align){return aM.column+(aK?0:1)}else{return aM.indented+(aK?0:l)}}}}}}},electricInput:/^\s*(?:case .*?:|default:|\{|\})$/,blockCommentStart:z?null:"/*",blockCommentEnd:z?null:"*/",lineComment:z?null:"//",fold:"brace",closeBrackets:"()[]{}''\"\"``",helperType:z?"json":"javascript",jsonldMode:aB,jsonMode:z}});a.registerHelper("wordChars","javascript",/[\w$]/);a.defineMIME("text/javascript","javascript");a.defineMIME("text/ecmascript","javascript");a.defineMIME("application/javascript","javascript");a.defineMIME("application/x-javascript","javascript");a.defineMIME("application/ecmascript","javascript");a.defineMIME("application/json",{name:"javascript",json:true});a.defineMIME("application/x-json",{name:"javascript",json:true});a.defineMIME("application/ld+json",{name:"javascript",jsonld:true});a.defineMIME("text/typescript",{name:"javascript",typescript:true});a.defineMIME("application/typescript",{name:"javascript",typescript:true})});(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror"],a)}else{a(CodeMirror)}}})(function(p){p.defineMode("css",function(T,G){if(!G.propertyKeywords){G=p.resolveMode("text/css")}var M=T.indentUnit,y=G.tokenHooks,w=G.documentTypes||{},S=G.mediaTypes||{},I=G.mediaFeatures||{},F=G.propertyKeywords||{},z=G.nonStandardPropertyKeywords||{},B=G.fontProperties||{},R=G.counterDescriptors||{},L=G.colorKeywords||{},O=G.valueKeywords||{},J=G.allowNested;var A,K;function U(X,Y){A=Y;return X}function W(aa,Z){var Y=aa.next();if(y[Y]){var X=y[Y](aa,Z);if(X!==false){return X}}if(Y=="@"){aa.eatWhile(/[\w\\\-]/);return U("def",aa.current())}else{if(Y=="="||(Y=="~"||Y=="|")&&aa.eat("=")){return U(null,"compare")}else{if(Y=='"'||Y=="'"){Z.tokenize=H(Y);return Z.tokenize(aa,Z)}else{if(Y=="#"){aa.eatWhile(/[\w\\\-]/);return U("atom","hash")}else{if(Y=="!"){aa.match(/^\s*\w*/);return U("keyword","important")}else{if(/\d/.test(Y)||Y=="."&&aa.eat(/\d/)){aa.eatWhile(/[\w.%]/);return U("number","unit")}else{if(Y==="-"){if(/[\d.]/.test(aa.peek())){aa.eatWhile(/[\w.%]/);return U("number","unit")}else{if(aa.match(/^-[\w\\\-]+/)){aa.eatWhile(/[\w\\\-]/);if(aa.match(/^\s*:/,false)){return U("variable-2","variable-definition")}return U("variable-2","variable")}else{if(aa.match(/^\w+-/)){return U("meta","meta")}}}}else{if(/[,+>*\/]/.test(Y)){return U(null,"select-op")}else{if(Y=="."&&aa.match(/^-?[_a-z][_a-z0-9-]*/i)){return U("qualifier","qualifier")}else{if(/[:;{}\[\]\(\)]/.test(Y)){return U(null,Y)}else{if((Y=="u"&&aa.match(/rl(-prefix)?\(/))||(Y=="d"&&aa.match("omain("))||(Y=="r"&&aa.match("egexp("))){aa.backUp(1);Z.tokenize=V;return U("property","word")}else{if(/[\w\\\-]/.test(Y)){aa.eatWhile(/[\w\\\-]/);return U("property","word")}else{return U(null,null)}}}}}}}}}}}}}function H(X){return function(ab,Z){var aa=false,Y;while((Y=ab.next())!=null){if(Y==X&&!aa){if(X==")"){ab.backUp(1)}break}aa=!aa&&Y=="\\"}if(Y==X||!aa&&X!=")"){Z.tokenize=null}return U("string","string")}}function V(Y,X){Y.next();if(!Y.match(/\s*[\"\')]/,false)){X.tokenize=H(")")}else{X.tokenize=null}return U(null,"(")}function N(Y,X,Z){this.type=Y;this.indent=X;this.prev=Z}function D(Y,Z,X){Y.context=new N(X,Z.indentation()+M,Y.context);return X}function P(X){X.context=X.context.prev;return X.context.type}function x(X,Z,Y){return C[Y.context.type](X,Z,Y)}function Q(Y,aa,Z,ab){for(var X=ab||1;X>0;X--){Z.context=Z.context.prev}return x(Y,aa,Z)}function E(Y){var X=Y.current().toLowerCase();if(O.hasOwnProperty(X)){K="atom"}else{if(L.hasOwnProperty(X)){K="keyword"}else{K="variable"}}}var C={};C.top=function(X,Z,Y){if(X=="{"){return D(Y,Z,"block")}else{if(X=="}"&&Y.context.prev){return P(Y)}else{if(/@(media|supports|(-moz-)?document)/.test(X)){return D(Y,Z,"atBlock")}else{if(/@(font-face|counter-style)/.test(X)){Y.stateArg=X;return"restricted_atBlock_before"}else{if(/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(X)){return"keyframes"}else{if(X&&X.charAt(0)=="@"){return D(Y,Z,"at")}else{if(X=="hash"){K="builtin"}else{if(X=="word"){K="tag"}else{if(X=="variable-definition"){return"maybeprop"}else{if(X=="interpolation"){return D(Y,Z,"interpolation")}else{if(X==":"){return"pseudo"}else{if(J&&X=="("){return D(Y,Z,"parens")}}}}}}}}}}}}return Y.context.type};C.block=function(X,aa,Y){if(X=="word"){var Z=aa.current().toLowerCase();if(F.hasOwnProperty(Z)){K="property";return"maybeprop"}else{if(z.hasOwnProperty(Z)){K="string-2";return"maybeprop"}else{if(J){K=aa.match(/^\s*:(?:\s|$)/,false)?"property":"tag";return"block"}else{K+=" error";return"maybeprop"}}}}else{if(X=="meta"){return"block"}else{if(!J&&(X=="hash"||X=="qualifier")){K="error";return"block"}else{return C.top(X,aa,Y)}}}};C.maybeprop=function(X,Z,Y){if(X==":"){return D(Y,Z,"prop")}return x(X,Z,Y)};C.prop=function(X,Z,Y){if(X==";"){return P(Y)}if(X=="{"&&J){return D(Y,Z,"propBlock")}if(X=="}"||X=="{"){return Q(X,Z,Y)}if(X=="("){return D(Y,Z,"parens")}if(X=="hash"&&!/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(Z.current())){K+=" error"}else{if(X=="word"){E(Z)}else{if(X=="interpolation"){return D(Y,Z,"interpolation")}}}return"prop"};C.propBlock=function(Y,X,Z){if(Y=="}"){return P(Z)}if(Y=="word"){K="property";return"maybeprop"}return Z.context.type};C.parens=function(X,Z,Y){if(X=="{"||X=="}"){return Q(X,Z,Y)}if(X==")"){return P(Y)}if(X=="("){return D(Y,Z,"parens")}if(X=="interpolation"){return D(Y,Z,"interpolation")}if(X=="word"){E(Z)}return"parens"};C.pseudo=function(X,Z,Y){if(X=="word"){K="variable-3";return Y.context.type}return x(X,Z,Y)};C.atBlock=function(X,aa,Y){if(X=="("){return D(Y,aa,"atBlock_parens")}if(X=="}"){return Q(X,aa,Y)}if(X=="{"){return P(Y)&&D(Y,aa,J?"block":"top")}if(X=="word"){var Z=aa.current().toLowerCase();if(Z=="only"||Z=="not"||Z=="and"||Z=="or"){K="keyword"}else{if(w.hasOwnProperty(Z)){K="tag"}else{if(S.hasOwnProperty(Z)){K="attribute"}else{if(I.hasOwnProperty(Z)){K="property"}else{if(F.hasOwnProperty(Z)){K="property"}else{if(z.hasOwnProperty(Z)){K="string-2"}else{if(O.hasOwnProperty(Z)){K="atom"}else{K="error"}}}}}}}}return Y.context.type};C.atBlock_parens=function(X,Z,Y){if(X==")"){return P(Y)}if(X=="{"||X=="}"){return Q(X,Z,Y,2)}return C.atBlock(X,Z,Y)};C.restricted_atBlock_before=function(X,Z,Y){if(X=="{"){return D(Y,Z,"restricted_atBlock")}if(X=="word"&&Y.stateArg=="@counter-style"){K="variable";return"restricted_atBlock_before"}return x(X,Z,Y)};C.restricted_atBlock=function(X,Z,Y){if(X=="}"){Y.stateArg=null;return P(Y)}if(X=="word"){if((Y.stateArg=="@font-face"&&!B.hasOwnProperty(Z.current().toLowerCase()))||(Y.stateArg=="@counter-style"&&!R.hasOwnProperty(Z.current().toLowerCase()))){K="error"}else{K="property"}return"maybeprop"}return"restricted_atBlock"};C.keyframes=function(X,Z,Y){if(X=="word"){K="variable";return"keyframes"}if(X=="{"){return D(Y,Z,"top")}return x(X,Z,Y)};C.at=function(X,Z,Y){if(X==";"){return P(Y)}if(X=="{"||X=="}"){return Q(X,Z,Y)}if(X=="word"){K="tag"}else{if(X=="hash"){K="builtin"}}return"at"};C.interpolation=function(X,Z,Y){if(X=="}"){return P(Y)}if(X=="{"||X==";"){return Q(X,Z,Y)}if(X=="word"){K="variable"}else{if(X!="variable"&&X!="("&&X!=")"){K="error"}}return"interpolation"};return{startState:function(X){return{tokenize:null,state:"top",stateArg:null,context:new N("top",X||0,null)}},token:function(Z,Y){if(!Y.tokenize&&Z.eatSpace()){return null}var X=(Y.tokenize||W)(Z,Y);if(X&&typeof X=="object"){A=X[1];X=X[0]}K=X;Y.state=C[Y.state](A,Z,Y);return K},indent:function(ab,Z){var Y=ab.context,aa=Z&&Z.charAt(0);var X=Y.indent;if(Y.type=="prop"&&(aa=="}"||aa==")")){Y=Y.prev}if(Y.prev&&(aa=="}"&&(Y.type=="block"||Y.type=="top"||Y.type=="interpolation"||Y.type=="restricted_atBlock")||aa==")"&&(Y.type=="parens"||Y.type=="atBlock_parens")||aa=="{"&&(Y.type=="at"||Y.type=="atBlock"))){X=Y.indent-M;Y=Y.prev}return X},electricChars:"}",blockCommentStart:"/*",blockCommentEnd:"*/",fold:"brace"}});function g(y){var x={};for(var w=0;w<y.length;++w){x[y[w]]=true}return x}var k=["domain","regexp","url","url-prefix"],a=g(k);var b=["all","aural","braille","handheld","print","projection","screen","tty","tv","embossed"],t=g(b);var v=["width","min-width","max-width","height","min-height","max-height","device-width","min-device-width","max-device-width","device-height","min-device-height","max-device-height","aspect-ratio","min-aspect-ratio","max-aspect-ratio","device-aspect-ratio","min-device-aspect-ratio","max-device-aspect-ratio","color","min-color","max-color","color-index","min-color-index","max-color-index","monochrome","min-monochrome","max-monochrome","resolution","min-resolution","max-resolution","scan","grid"],i=g(v);var d=["align-content","align-items","align-self","alignment-adjust","alignment-baseline","anchor-point","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","azimuth","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","binding","bleed","bookmark-label","bookmark-level","bookmark-state","bookmark-target","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","color","color-profile","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","crop","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","drop-initial-after-adjust","drop-initial-after-align","drop-initial-before-adjust","drop-initial-before-align","drop-initial-size","drop-initial-value","elevation","empty-cells","fit","fit-position","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","float-offset","flow-from","flow-into","font","font-feature-settings","font-family","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-synthesis","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-weight","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-position","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","inline-box-align","justify-content","left","letter-spacing","line-break","line-height","line-stacking","line-stacking-ruby","line-stacking-shift","line-stacking-strategy","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marker-offset","marks","marquee-direction","marquee-loop","marquee-play-count","marquee-speed","marquee-style","max-height","max-width","min-height","min-width","move-to","nav-down","nav-index","nav-left","nav-right","nav-up","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-style","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","page-policy","pause","pause-after","pause-before","perspective","perspective-origin","pitch","pitch-range","play-during","position","presentation-level","punctuation-trim","quotes","region-break-after","region-break-before","region-break-inside","region-fragment","rendering-intent","resize","rest","rest-after","rest-before","richness","right","rotation","rotation-point","ruby-align","ruby-overhang","ruby-position","ruby-span","shape-image-threshold","shape-inside","shape-margin","shape-outside","size","speak","speak-as","speak-header","speak-numeral","speak-punctuation","speech-rate","stress","string-set","tab-size","table-layout","target","target-name","target-new","target-position","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-height","text-indent","text-justify","text-outline","text-overflow","text-shadow","text-size-adjust","text-space-collapse","text-transform","text-underline-position","text-wrap","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","volume","white-space","widows","width","word-break","word-spacing","word-wrap","z-index","clip-path","clip-rule","mask","enable-background","filter","flood-color","flood-opacity","lighting-color","stop-color","stop-opacity","pointer-events","color-interpolation","color-interpolation-filters","color-rendering","fill","fill-opacity","fill-rule","image-rendering","marker","marker-end","marker-mid","marker-start","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-rendering","baseline-shift","dominant-baseline","glyph-orientation-horizontal","glyph-orientation-vertical","text-anchor","writing-mode"],h=g(d);var m=["scrollbar-arrow-color","scrollbar-base-color","scrollbar-dark-shadow-color","scrollbar-face-color","scrollbar-highlight-color","scrollbar-shadow-color","scrollbar-3d-light-color","scrollbar-track-color","shape-inside","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","zoom"],e=g(m);var r=["font-family","src","unicode-range","font-variant","font-feature-settings","font-stretch","font-weight","font-style"],f=g(r);var o=["additive-symbols","fallback","negative","pad","prefix","range","speak-as","suffix","symbols","system"],s=g(o);var c=["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"],l=g(c);var j=["above","absolute","activeborder","additive","activecaption","afar","after-white-space","ahead","alias","all","all-scroll","alphabetic","alternate","always","amharic","amharic-abegede","antialiased","appworkspace","arabic-indic","armenian","asterisks","attr","auto","avoid","avoid-column","avoid-page","avoid-region","background","backwards","baseline","below","bidi-override","binary","bengali","blink","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","bullets","button","button-bevel","buttonface","buttonhighlight","buttonshadow","buttontext","calc","cambodian","capitalize","caps-lock-indicator","caption","captiontext","caret","cell","center","checkbox","circle","cjk-decimal","cjk-earthly-branch","cjk-heavenly-stem","cjk-ideographic","clear","clip","close-quote","col-resize","collapse","column","compact","condensed","contain","content","content-box","context-menu","continuous","copy","counter","counters","cover","crop","cross","crosshair","currentcolor","cursive","cyclic","dashed","decimal","decimal-leading-zero","default","default-button","destination-atop","destination-in","destination-out","destination-over","devanagari","disc","discard","disclosure-closed","disclosure-open","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic","ethiopic-abegede","ethiopic-abegede-am-et","ethiopic-abegede-gez","ethiopic-abegede-ti-er","ethiopic-abegede-ti-et","ethiopic-halehame-aa-er","ethiopic-halehame-aa-et","ethiopic-halehame-am-et","ethiopic-halehame-gez","ethiopic-halehame-om-et","ethiopic-halehame-sid-et","ethiopic-halehame-so-et","ethiopic-halehame-ti-er","ethiopic-halehame-ti-et","ethiopic-halehame-tig","ethiopic-numeric","ew-resize","expanded","extends","extra-condensed","extra-expanded","fantasy","fast","fill","fixed","flat","flex","footnotes","forwards","from","geometricPrecision","georgian","graytext","groove","gujarati","gurmukhi","hand","hangul","hangul-consonant","hebrew","help","hidden","hide","higher","highlight","highlighttext","hiragana","hiragana-iroha","horizontal","hsl","hsla","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-flex","inline-table","inset","inside","intrinsic","invert","italic","japanese-formal","japanese-informal","justify","kannada","katakana","katakana-iroha","keep-all","khmer","korean-hangul-formal","korean-hanja-formal","korean-hanja-informal","landscape","lao","large","larger","left","level","lighter","line-through","linear","linear-gradient","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-alpha","lower-armenian","lower-greek","lower-hexadecimal","lower-latin","lower-norwegian","lower-roman","lowercase","ltr","malayalam","match","matrix","matrix3d","media-controls-background","media-current-time-display","media-fullscreen-button","media-mute-button","media-play-button","media-return-to-realtime-button","media-rewind-button","media-seek-back-button","media-seek-forward-button","media-slider","media-sliderthumb","media-time-remaining-display","media-volume-slider","media-volume-slider-container","media-volume-sliderthumb","medium","menu","menulist","menulist-button","menulist-text","menulist-textfield","menutext","message-box","middle","min-intrinsic","mix","mongolian","monospace","move","multiple","myanmar","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","numbers","numeric","nw-resize","nwse-resize","oblique","octal","open-quote","optimizeLegibility","optimizeSpeed","oriya","oromo","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","persian","perspective","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radial-gradient","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeating-linear-gradient","repeating-radial-gradient","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","rotate","rotate3d","rotateX","rotateY","rotateZ","round","row-resize","rtl","run-in","running","s-resize","sans-serif","scale","scale3d","scaleX","scaleY","scaleZ","scroll","scrollbar","se-resize","searchfield","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","semi-condensed","semi-expanded","separate","serif","show","sidama","simp-chinese-formal","simp-chinese-informal","single","skew","skewX","skewY","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small","small-caps","small-caption","smaller","solid","somali","source-atop","source-in","source-out","source-over","space","spell-out","square","square-button","start","static","status-bar","stretch","stroke","sub","subpixel-antialiased","super","sw-resize","symbolic","symbols","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","tamil","telugu","text","text-bottom","text-top","textarea","textfield","thai","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","tibetan","tigre","tigrinya-er","tigrinya-er-abegede","tigrinya-et","tigrinya-et-abegede","to","top","trad-chinese-formal","trad-chinese-informal","translate","translate3d","translateX","translateY","translateZ","transparent","ultra-condensed","ultra-expanded","underline","up","upper-alpha","upper-armenian","upper-greek","upper-hexadecimal","upper-latin","upper-norwegian","upper-roman","uppercase","urdu","url","var","vertical","vertical-text","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","words","x-large","x-small","xor","xx-large","xx-small"],q=g(j);var n=k.concat(b).concat(v).concat(d).concat(m).concat(c).concat(j);p.registerHelper("hintWords","css",n);function u(z,y){var w=false,x;while((x=z.next())!=null){if(w&&x=="/"){y.tokenize=null;break}w=(x=="*")}return["comment","comment"]}p.defineMIME("text/css",{documentTypes:a,mediaTypes:t,mediaFeatures:i,propertyKeywords:h,nonStandardPropertyKeywords:e,fontProperties:f,counterDescriptors:s,colorKeywords:l,valueKeywords:q,tokenHooks:{"/":function(x,w){if(!x.eat("*")){return false}w.tokenize=u;return u(x,w)}},name:"css"});p.defineMIME("text/x-scss",{mediaTypes:t,mediaFeatures:i,propertyKeywords:h,nonStandardPropertyKeywords:e,colorKeywords:l,valueKeywords:q,fontProperties:f,allowNested:true,tokenHooks:{"/":function(x,w){if(x.eat("/")){x.skipToEnd();return["comment","comment"]}else{if(x.eat("*")){w.tokenize=u;return u(x,w)}else{return["operator","operator"]}}},":":function(w){if(w.match(/\s*\{/)){return[null,"{"]}return false},"$":function(w){w.match(/^[\w-]+/);if(w.match(/^\s*:/,false)){return["variable-2","variable-definition"]}return["variable-2","variable"]},"#":function(w){if(!w.eat("{")){return false}return[null,"interpolation"]}},name:"css",helperType:"scss"});p.defineMIME("text/x-less",{mediaTypes:t,mediaFeatures:i,propertyKeywords:h,nonStandardPropertyKeywords:e,colorKeywords:l,valueKeywords:q,fontProperties:f,allowNested:true,tokenHooks:{"/":function(x,w){if(x.eat("/")){x.skipToEnd();return["comment","comment"]}else{if(x.eat("*")){w.tokenize=u;return u(x,w)}else{return["operator","operator"]}}},"@":function(w){if(w.eat("{")){return[null,"interpolation"]}if(w.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/,false)){return false}w.eatWhile(/[\w\\\-]/);if(w.match(/^\s*:/,false)){return["variable-2","variable-definition"]}return["variable-2","variable"]},"&":function(){return["atom","atom"]}},name:"css",helperType:"less"})});(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror"],a)}else{a(CodeMirror)}}})(function(c){c.defineMode("clike",function(L,s){var F=L.indentUnit,B=s.statementIndentUnit||F,G=s.dontAlignCalls,v=s.keywords||{},z=s.types||{},M=s.builtin||{},H=s.blockKeywords||{},D=s.defKeywords||{},o=s.atoms||{},n=s.hooks||{},A=s.multiLineStrings,w=s.indentStatements!==false,u=s.indentSwitch!==false,q=s.namespaceSeparator;var x=/[+\-*&%=<>!?|\/]/;var J,r;function N(S,Q){var P=S.next();if(n[P]){var O=n[P](S,Q);if(O!==false){return O}}if(P=='"'||P=="'"){Q.tokenize=t(P);return Q.tokenize(S,Q)}if(/[\[\]{}\(\),;\:\.]/.test(P)){J=P;return null}if(/\d/.test(P)){S.eatWhile(/[\w\.]/);return"number"}if(P=="/"){if(S.eat("*")){Q.tokenize=C;return C(S,Q)}if(S.eat("/")){S.skipToEnd();return"comment"}}if(x.test(P)){S.eatWhile(x);return"operator"}S.eatWhile(/[\w\$_\xa1-\uffff]/);if(q){while(S.match(q)){S.eatWhile(/[\w\$_\xa1-\uffff]/)}}var R=S.current();if(v.propertyIsEnumerable(R)){if(H.propertyIsEnumerable(R)){J="newstatement"}if(D.propertyIsEnumerable(R)){r=true}return"keyword"}if(z.propertyIsEnumerable(R)){return"variable-3"}if(M.propertyIsEnumerable(R)){if(H.propertyIsEnumerable(R)){J="newstatement"}return"builtin"}if(o.propertyIsEnumerable(R)){return"atom"}return"variable"}function t(O){return function(T,R){var S=false,Q,P=false;while((Q=T.next())!=null){if(Q==O&&!S){P=true;break}S=!S&&Q=="\\"}if(P||!(S||A)){R.tokenize=null}return"string"}}function C(R,Q){var O=false,P;while(P=R.next()){if(P=="/"&&O){Q.tokenize=null;break}O=(P=="*")}return"comment"}function I(S,P,O,R,Q){this.indented=S;this.column=P;this.type=O;this.align=R;this.prev=Q}function y(O){return O=="statement"||O=="switchstatement"||O=="namespace"}function p(R,P,Q){var O=R.indented;if(R.context&&y(R.context.type)&&!y(Q)){O=R.context.indented}return R.context=new I(O,P,Q,null,R.context)}function K(P){var O=P.context.type;if(O==")"||O=="]"||O=="}"){P.indented=P.context.indented}return P.context=P.context.prev}function m(P,O){if(O.prevToken=="variable"||O.prevToken=="variable-3"){return true}if(/\S(?:[^- ]>|[*\]])\s*$|\*$/.test(P.string.slice(0,P.start))){return true}}function E(O){for(;;){if(!O||O.type=="top"){return true}if(O.type=="}"&&O.prev.type!="namespace"){return false}O=O.prev}}return{startState:function(O){return{tokenize:null,context:new I((O||0)-F,0,"top",false),indented:0,startOfLine:true,prevToken:null}},token:function(T,S){var P=S.context;if(T.sol()){if(P.align==null){P.align=false}S.indented=T.indentation();S.startOfLine=true}if(T.eatSpace()){return null}J=r=null;var R=(S.tokenize||N)(T,S);if(R=="comment"||R=="meta"){return R}if(P.align==null){P.align=true}if((J==";"||J==":"||J==",")){while(y(S.context.type)){K(S)}}else{if(J=="{"){p(S,T.column(),"}")}else{if(J=="["){p(S,T.column(),"]")}else{if(J=="("){p(S,T.column(),")")}else{if(J=="}"){while(y(P.type)){P=K(S)}if(P.type=="}"){P=K(S)}while(y(P.type)){P=K(S)}}else{if(J==P.type){K(S)}else{if(w&&(((P.type=="}"||P.type=="top")&&J!=";")||(y(P.type)&&J=="newstatement"))){var Q="statement";if(J=="newstatement"&&u&&T.current()=="switch"){Q="switchstatement"}else{if(R=="keyword"&&T.current()=="namespace"){Q="namespace"}}p(S,T.column(),Q)}}}}}}}if(R=="variable"&&((S.prevToken=="def"||(s.typeFirstDefinitions&&m(T,S)&&E(S.context)&&T.match(/^\s*\(/,false))))){R="def"}if(n.token){var O=n.token(T,S,R);if(O!==undefined){R=O}}if(R=="def"&&s.styleDefs===false){R="variable"}S.startOfLine=false;S.prevToken=r?"def":R||J;return R},indent:function(T,P){if(T.tokenize!=N&&T.tokenize!=null){return c.Pass}var O=T.context,S=P&&P.charAt(0);if(y(O.type)&&S=="}"){O=O.prev}var Q=S==O.type;var R=O.prev&&O.prev.type=="switchstatement";if(y(O.type)){return O.indented+(S=="{"?0:B)}if(O.align&&(!G||O.type!=")")){return O.column+(Q?0:1)}if(O.type==")"&&!Q){return O.indented+B}return O.indented+(Q?0:F)+(!Q&&R&&!/^(?:case|default)\b/.test(P)?F:0)},electricInput:u?/^\s*(?:case .*?:|default:|\{\}?|\})$/:/^\s*[{}]$/,blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:"//",fold:"brace"}});function i(p){var n={},o=p.split(" ");for(var m=0;m<o.length;++m){n[o[m]]=true}return n}var l="auto if break case register continue return default do sizeof static else struct switch extern typedef float union for goto while enum const volatile";var j="int long char short double float unsigned signed void size_t ptrdiff_t";function d(n,m){if(!m.startOfLine){return false}for(;;){if(n.skipTo("\\")){n.next();if(n.eol()){m.tokenize=d;break}}else{n.skipToEnd();m.tokenize=null;break}}return"meta"}function a(m,n){if(n.prevToken=="variable-3"){return"variable-3"}return false}function k(o,n){o.backUp(1);if(o.match(/(R|u8R|uR|UR|LR)/)){var m=o.match(/"([^\s\\()]{0,16})\(/);if(!m){return false}n.cpp11RawStringDelim=m[1];n.tokenize=g;return g(o,n)}if(o.match(/(u8|u|U|L)/)){if(o.match(/["']/,false)){return"string"}return false}o.next();return false}function e(n){var m=/(\w+)::(\w+)$/.exec(n);return m&&m[1]==m[2]}function h(o,n){var m;while((m=o.next())!=null){if(m=='"'&&!o.eat('"')){n.tokenize=null;break}}return"string"}function g(p,n){var o=n.cpp11RawStringDelim.replace(/[^\w\s]/g,"\\$&");var m=p.match(new RegExp(".*?\\)"+o+'"'));if(m){n.tokenize=null}else{p.skipToEnd()}return"string"}function b(m,q){if(typeof m=="string"){m=[m]}var p=[];function o(r){if(r){for(var s in r){if(r.hasOwnProperty(s)){p.push(s)}}}}o(q.keywords);o(q.types);o(q.builtin);o(q.atoms);if(p.length){q.helperType=m[0];c.registerHelper("hintWords",m[0],p)}for(var n=0;n<m.length;++n){c.defineMIME(m[n],q)}}b(["text/x-csrc","text/x-c","text/x-chdr"],{name:"clike",keywords:i(l),types:i(j+" bool _Complex _Bool float_t double_t intptr_t intmax_t int8_t int16_t int32_t int64_t uintptr_t uintmax_t uint8_t uint16_t uint32_t uint64_t"),blockKeywords:i("case do else for if switch while struct"),defKeywords:i("struct"),typeFirstDefinitions:true,atoms:i("null true false"),hooks:{"#":d,"*":a},modeProps:{fold:["brace","include"]}});b(["text/x-c++src","text/x-c++hdr"],{name:"clike",keywords:i(l+" asm dynamic_cast namespace reinterpret_cast try explicit new static_cast typeid catch operator template typename class friend private this using const_cast inline public throw virtual delete mutable protected alignas alignof constexpr decltype nullptr noexcept thread_local final static_assert override"),types:i(j+" bool wchar_t"),blockKeywords:i("catch class do else finally for if struct switch try while"),defKeywords:i("class namespace struct enum union"),typeFirstDefinitions:true,atoms:i("true false null"),hooks:{"#":d,"*":a,u:k,U:k,L:k,R:k,token:function(o,n,m){if(m=="variable"&&o.peek()=="("&&(n.prevToken==";"||n.prevToken==null||n.prevToken=="}")&&e(o.current())){return"def"}}},namespaceSeparator:"::",modeProps:{fold:["brace","include"]}});b("text/x-java",{name:"clike",keywords:i("abstract assert break case catch class const continue default do else enum extends final finally float for goto if implements import instanceof interface native new package private protected public return static strictfp super switch synchronized this throw throws transient try volatile while"),types:i("byte short int long float double boolean char void Boolean Byte Character Double Float Integer Long Number Object Short String StringBuffer StringBuilder Void"),blockKeywords:i("catch class do else finally for if switch try while"),defKeywords:i("class interface package enum"),typeFirstDefinitions:true,atoms:i("true false null"),hooks:{"@":function(m){m.eatWhile(/[\w\$_]/);return"meta"}},modeProps:{fold:["brace","import"]}});b("text/x-csharp",{name:"clike",keywords:i("abstract as async await base break case catch checked class const continue default delegate do else enum event explicit extern finally fixed for foreach goto if implicit in interface internal is lock namespace new operator out override params private protected public readonly ref return sealed sizeof stackalloc static struct switch this throw try typeof unchecked unsafe using virtual void volatile while add alias ascending descending dynamic from get global group into join let orderby partial remove select set value var yield"),types:i("Action Boolean Byte Char DateTime DateTimeOffset Decimal Double Func Guid Int16 Int32 Int64 Object SByte Single String Task TimeSpan UInt16 UInt32 UInt64 bool byte char decimal double short int long object sbyte float string ushort uint ulong"),blockKeywords:i("catch class do else finally for foreach if struct switch try while"),defKeywords:i("class interface namespace struct var"),typeFirstDefinitions:true,atoms:i("true false null"),hooks:{"@":function(n,m){if(n.eat('"')){m.tokenize=h;return h(n,m)}n.eatWhile(/[\w\$_]/);return"meta"}}});function f(o,m){var n=false;while(!o.eol()){if(!n&&o.match('"""')){m.tokenize=null;break}n=o.next()=="\\"&&!n}return"string"}b("text/x-scala",{name:"clike",keywords:i("abstract case catch class def do else extends false final finally for forSome if implicit import lazy match new null object override package private protected return sealed super this throw trait try type val var while with yield _ : = => <- <: <% >: # @ assert assume require print println printf readLine readBoolean readByte readShort readChar readInt readLong readFloat readDouble :: #:: "),types:i("AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either Enumeration Equiv Error Exception Fractional Function IndexedSeq Integral Iterable Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable Compiler Double Exception Float Integer Long Math Number Object Package Pair Process Runtime Runnable SecurityManager Short StackTraceElement StrictMath String StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void"),multiLineStrings:true,blockKeywords:i("catch class do else finally for forSome if match switch try while"),defKeywords:i("class def object package trait type val var"),atoms:i("true false null"),indentStatements:false,indentSwitch:false,hooks:{"@":function(m){m.eatWhile(/[\w\$_]/);return"meta"},'"':function(n,m){if(!n.match('""')){return false}m.tokenize=f;return m.tokenize(n,m)},"'":function(m){m.eatWhile(/[\w\$_\xa1-\uffff]/);return"atom"}},modeProps:{closeBrackets:{triples:'"'}}});b(["x-shader/x-vertex","x-shader/x-fragment"],{name:"clike",keywords:i("sampler1D sampler2D sampler3D samplerCube sampler1DShadow sampler2DShadow const attribute uniform varying break continue discard return for while do if else struct in out inout"),types:i("float int bool void vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 mat2 mat3 mat4"),blockKeywords:i("for while do if else struct"),builtin:i("radians degrees sin cos tan asin acos atan pow exp log exp2 sqrt inversesqrt abs sign floor ceil fract mod min max clamp mix step smoothstep length distance dot cross normalize ftransform faceforward reflect refract matrixCompMult lessThan lessThanEqual greaterThan greaterThanEqual equal notEqual any all not texture1D texture1DProj texture1DLod texture1DProjLod texture2D texture2DProj texture2DLod texture2DProjLod texture3D texture3DProj texture3DLod texture3DProjLod textureCube textureCubeLod shadow1D shadow2D shadow1DProj shadow2DProj shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod dFdx dFdy fwidth noise1 noise2 noise3 noise4"),atoms:i("true false gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_FogCoord gl_PointCoord gl_Position gl_PointSize gl_ClipVertex gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor gl_TexCoord gl_FogFragCoord gl_FragCoord gl_FrontFacing gl_FragData gl_FragDepth gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse gl_TexureMatrixTranspose gl_ModelViewMatrixInverseTranspose gl_ProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixInverseTranspose gl_TextureMatrixInverseTranspose gl_NormalScale gl_DepthRange gl_ClipPlane gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel gl_FrontLightModelProduct gl_BackLightModelProduct gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ gl_FogParameters gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits gl_MaxDrawBuffers"),indentSwitch:false,hooks:{"#":d},modeProps:{fold:["brace","include"]}});b("text/x-nesc",{name:"clike",keywords:i(l+"as atomic async call command component components configuration event generic implementation includes interface module new norace nx_struct nx_union post provides signal task uses abstract extends"),types:i(j),blockKeywords:i("case do else for if switch while struct"),atoms:i("null true false"),hooks:{"#":d},modeProps:{fold:["brace","include"]}});b("text/x-objectivec",{name:"clike",keywords:i(l+"inline restrict _Bool _Complex _Imaginery BOOL Class bycopy byref id IMP in inout nil oneway out Protocol SEL self super atomic nonatomic retain copy readwrite readonly"),types:i(j),atoms:i("YES NO NULL NILL ON OFF true false"),hooks:{"@":function(m){m.eatWhile(/[\w\$]/);return"keyword"},"#":d},modeProps:{fold:"brace"}})});(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"),require("../htmlmixed/htmlmixed"),require("../clike/clike"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror","../htmlmixed/htmlmixed","../clike/clike"],a)}else{a(CodeMirror)}}})(function(d){function f(m){var k={},l=m.split(" ");for(var j=0;j<l.length;++j){k[l[j]]=true}return k}function e(l,j,k){if(l.length==0){return b(j)}return function(p,o){var n=l[0];for(var m=0;m<n.length;m++){if(p.match(n[m][0])){o.tokenize=e(l.slice(1),j);return n[m][1]}}o.tokenize=b(j,k);return"string"}}function b(k,j){return function(m,l){return c(m,l,k,j)}}function c(n,l,k,j){if(j!==false&&n.match("${",false)||n.match("{$",false)){l.tokenize=null;return"string"}if(j!==false&&n.match(/^\$[a-zA-Z_][a-zA-Z0-9_]*/)){if(n.match("[",false)){l.tokenize=e([[["[",null]],[[/\d[\w\.]*/,"number"],[/\$[a-zA-Z_][a-zA-Z0-9_]*/,"variable-2"],[/[\w\$]+/,"variable"]],[["]",null]]],k,j)}if(n.match(/\-\>\w/,false)){l.tokenize=e([[["->",null]],[[/[\w]+/,"variable"]]],k,j)}return"variable-2"}var m=false;while(!n.eol()&&(m||j===false||(!n.match("{$",false)&&!n.match(/^(\$[a-zA-Z_][a-zA-Z0-9_]*|\$\{)/,false)))){if(!m&&n.match(k)){l.tokenize=null;l.tokStack.pop();l.tokStack.pop();break}m=n.next()=="\\"&&!m}return"string"}var h="abstract and array as break case catch class clone const continue declare default do else elseif enddeclare endfor endforeach endif endswitch endwhile extends final for foreach function global goto if implements interface instanceof namespace new or private protected public static switch throw trait try use var while xor die echo empty exit eval include include_once isset list require require_once return print unset __halt_compiler self static parent yield insteadof finally";var i="true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__";var a="func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count";d.registerHelper("hintWords","php",[h,i,a].join(" ").split(" "));d.registerHelper("wordChars","php",/[\w$]/);var g={name:"clike",helperType:"php",keywords:f(h),blockKeywords:f("catch do else elseif for foreach if switch try while finally"),defKeywords:f("class function interface namespace trait"),atoms:f(i),builtin:f(a),multiLineStrings:true,hooks:{"$":function(j){j.eatWhile(/[\w\$_]/);return"variable-2"},"<":function(m,k){if(m.match(/<</)){var j=m.eat("'");m.eatWhile(/[\w\.]/);var l=m.current().slice(3+(j?1:0));if(j){m.eat("'")}if(l){(k.tokStack||(k.tokStack=[])).push(l,0);k.tokenize=b(l,j?false:true);return"string"}}return false},"#":function(j){while(!j.eol()&&!j.match("?>",false)){j.next()}return"comment"},"/":function(j){if(j.eat("/")){while(!j.eol()&&!j.match("?>",false)){j.next()}return"comment"}return false},'"':function(j,k){(k.tokStack||(k.tokStack=[])).push('"',0);k.tokenize=b('"');return"string"},"{":function(j,k){if(k.tokStack&&k.tokStack.length){k.tokStack[k.tokStack.length-1]++}return false},"}":function(j,k){if(k.tokStack&&k.tokStack.length>0&&!--k.tokStack[k.tokStack.length-1]){k.tokenize=b(k.tokStack[k.tokStack.length-2])}return false}}};d.defineMode("php",function(l,m){var n=d.getMode(l,"text/html");var j=d.getMode(l,g);function k(u,s){var r=s.curMode==j;if(u.sol()&&s.pending&&s.pending!='"'&&s.pending!="'"){s.pending=null}if(!r){if(u.match(/^<\?\w*/)){s.curMode=j;s.curState=s.php;return"meta"}if(s.pending=='"'||s.pending=="'"){while(!u.eol()&&u.next()!=s.pending){}var q="string"}else{if(s.pending&&u.pos<s.pending.end){u.pos=s.pending.end;var q=s.pending.style}else{var q=n.token(u,s.curState)}}if(s.pending){s.pending=null}var t=u.current(),p=t.search(/<\?/),o;if(p!=-1){if(q=="string"&&(o=t.match(/[\'\"]$/))&&!/\?>/.test(t)){s.pending=o[0]}else{s.pending={end:u.pos,style:q}}u.backUp(t.length-p)}return q}else{if(r&&s.php.tokenize==null&&u.match("?>")){s.curMode=n;s.curState=s.html;return"meta"}else{return j.token(u,s.curState)}}}return{startState:function(){var o=d.startState(n),p=d.startState(j);return{html:o,php:p,curMode:m.startOpen?j:n,curState:m.startOpen?p:o,pending:null}},copyState:function(r){var p=r.html,q=d.copyState(n,p),t=r.php,o=d.copyState(j,t),s;if(r.curMode==n){s=q}else{s=o}return{html:q,php:o,curMode:r.curMode,curState:s,pending:r.pending}},token:k,indent:function(p,o){if((p.curMode!=j&&/^\s*<\//.test(o))||(p.curMode==j&&/^\?>/.test(o))){return n.indent(p.html,o)}return p.curMode.indent(p.curState,o)},blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:"//",innerMode:function(o){return{state:o.curState,mode:o.curMode}}}},"htmlmixed","clike");d.defineMIME("application/x-httpd-php","php");d.defineMIME("application/x-httpd-php-open",{name:"php",startOpen:true});d.defineMIME("text/x-php",g)});extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/js/codemirror.mode.j000060400000034312152453623450033706 0ustar00components/com_acymailing(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror"],a)}else{a(CodeMirror)}}})(function(a){a.defineMode("javascript",function(Z,aj){var l=Z.indentUnit;var A=aj.statementIndent;var aB=aj.jsonld;var z=aj.json||aB;var g=aj.typescript;var au=aj.wordCharacters||/[\w$\xa1-\uffff]/;var ar=function(){function aR(aT){return{type:aT,style:"keyword"}}var aM=aR("keyword a"),aK=aR("keyword b"),aJ=aR("keyword c");var aL=aR("operator"),aP={type:"atom",style:"atom"};var aN={"if":aR("if"),"while":aM,"with":aM,"else":aK,"do":aK,"try":aK,"finally":aK,"return":aJ,"break":aJ,"continue":aJ,"new":aJ,"delete":aJ,"throw":aJ,"debugger":aJ,"var":aR("var"),"const":aR("var"),let:aR("var"),"function":aR("function"),"catch":aR("catch"),"for":aR("for"),"switch":aR("switch"),"case":aR("case"),"default":aR("default"),"in":aL,"typeof":aL,"instanceof":aL,"true":aP,"false":aP,"null":aP,"undefined":aP,"NaN":aP,"Infinity":aP,"this":aR("this"),module:aR("module"),"class":aR("class"),"super":aR("atom"),yield:aJ,"export":aR("export"),"import":aR("import"),"extends":aJ};if(g){var aS={type:"variable",style:"variable-3"};var aO={"interface":aR("interface"),"extends":aR("extends"),constructor:aR("constructor"),"public":aR("public"),"private":aR("private"),"protected":aR("protected"),"static":aR("static"),string:aS,number:aS,bool:aS,any:aS};for(var aQ in aO){aN[aQ]=aO[aQ]}}return aN}();var P=/[+\-*&%=<>!?|~^]/;var aq=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/;function F(aM){var aK=false,aJ,aL=false;while((aJ=aM.next())!=null){if(!aK){if(aJ=="/"&&!aL){return}if(aJ=="["){aL=true}else{if(aL&&aJ=="]"){aL=false}}}aK=!aK&&aJ=="\\"}}var S,G;function L(aL,aK,aJ){S=aL;G=aJ;return aK}function U(aN,aL){var aJ=aN.next();if(aJ=='"'||aJ=="'"){aL.tokenize=R(aJ);return aL.tokenize(aN,aL)}else{if(aJ=="."&&aN.match(/^\d+(?:[eE][+\-]?\d+)?/)){return L("number","number")}else{if(aJ=="."&&aN.match("..")){return L("spread","meta")}else{if(/[\[\]{}\(\),;\:\.]/.test(aJ)){return L(aJ)}else{if(aJ=="="&&aN.eat(">")){return L("=>","operator")}else{if(aJ=="0"&&aN.eat(/x/i)){aN.eatWhile(/[\da-f]/i);return L("number","number")}else{if(/\d/.test(aJ)){aN.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);return L("number","number")}else{if(aJ=="/"){if(aN.eat("*")){aL.tokenize=aA;return aA(aN,aL)}else{if(aN.eat("/")){aN.skipToEnd();return L("comment","comment")}else{if(aL.lastType=="operator"||aL.lastType=="keyword c"||aL.lastType=="sof"||/^[\[{}\(,;:]$/.test(aL.lastType)){F(aN);aN.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/);return L("regexp","string-2")}else{aN.eatWhile(P);return L("operator","operator",aN.current())}}}}else{if(aJ=="`"){aL.tokenize=aC;return aC(aN,aL)}else{if(aJ=="#"){aN.skipToEnd();return L("error","error")}else{if(P.test(aJ)){aN.eatWhile(P);return L("operator","operator",aN.current())}else{if(au.test(aJ)){aN.eatWhile(au);var aM=aN.current(),aK=ar.propertyIsEnumerable(aM)&&ar[aM];return(aK&&aL.lastType!=".")?L(aK.type,aK.style,aM):L("variable","variable",aM)}}}}}}}}}}}}}function R(aJ){return function(aN,aL){var aM=false,aK;if(aB&&aN.peek()=="@"&&aN.match(aq)){aL.tokenize=U;return L("jsonld-keyword","meta")}while((aK=aN.next())!=null){if(aK==aJ&&!aM){break}aM=!aM&&aK=="\\"}if(!aM){aL.tokenize=U}return L("string","string")}}function aA(aM,aL){var aJ=false,aK;while(aK=aM.next()){if(aK=="/"&&aJ){aL.tokenize=U;break}aJ=(aK=="*")}return L("comment","comment")}function aC(aM,aK){var aL=false,aJ;while((aJ=aM.next())!=null){if(!aL&&(aJ=="`"||aJ=="$"&&aM.eat("{"))){aK.tokenize=U;break}aL=!aL&&aJ=="\\"}return L("quasi","string-2",aM.current())}var m="([{}])";function ax(aP,aM){if(aM.fatArrowAt){aM.fatArrowAt=null}var aL=aP.string.indexOf("=>",aP.start);if(aL<0){return}var aO=0,aK=false;for(var aQ=aL-1;aQ>=0;--aQ){var aJ=aP.string.charAt(aQ);var aN=m.indexOf(aJ);if(aN>=0&&aN<3){if(!aO){++aQ;break}if(--aO==0){break}}else{if(aN>=3&&aN<6){++aO}else{if(au.test(aJ)){aK=true}else{if(/["'\/]/.test(aJ)){return}else{if(aK&&!aO){++aQ;break}}}}}}if(aK&&!aO){aM.fatArrowAt=aQ}}var b={atom:true,number:true,variable:true,string:true,regexp:true,"this":true,"jsonld-keyword":true};function J(aO,aK,aJ,aN,aL,aM){this.indented=aO;this.column=aK;this.type=aJ;this.prev=aL;this.info=aM;if(aN!=null){this.align=aN}}function s(aM,aL){for(var aK=aM.localVars;aK;aK=aK.next){if(aK.name==aL){return true}}for(var aJ=aM.context;aJ;aJ=aJ.prev){for(var aK=aJ.vars;aK;aK=aK.next){if(aK.name==aL){return true}}}}function f(aN,aK,aJ,aM,aO){var aP=aN.cc;D.state=aN;D.stream=aO;D.marked=null,D.cc=aP;D.style=aK;if(!aN.lexical.hasOwnProperty("align")){aN.lexical.align=true}while(true){var aL=aP.length?aP.pop():z?an:aH;if(aL(aJ,aM)){while(aP.length&&aP[aP.length-1].lex){aP.pop()()}if(D.marked){return D.marked}if(aJ=="variable"&&s(aN,aM)){return"variable-2"}return aK}}}var D={state:null,column:null,marked:null,cc:null};function aa(){for(var aJ=arguments.length-1;aJ>=0;aJ--){D.cc.push(arguments[aJ])}}function ae(){aa.apply(null,arguments);return true}function aw(aK){function aJ(aN){for(var aM=aN;aM;aM=aM.next){if(aM.name==aK){return true}}return false}var aL=D.state;if(aL.context){D.marked="def";if(aJ(aL.localVars)){return}aL.localVars={name:aK,next:aL.localVars}}else{if(aJ(aL.globalVars)){return}if(aj.globalVars){aL.globalVars={name:aK,next:aL.globalVars}}}}var q={name:"this",next:{name:"arguments"}};function w(){D.state.context={prev:D.state.context,vars:D.state.localVars};D.state.localVars=q}function x(){D.state.localVars=D.state.context.vars;D.state.context=D.state.context.prev}function aF(aK,aL){var aJ=function(){var aO=D.state,aM=aO.indented;if(aO.lexical.type=="stat"){aM=aO.lexical.indented}else{for(var aN=aO.lexical;aN&&aN.type==")"&&aN.align;aN=aN.prev){aM=aN.indented}}aO.lexical=new J(aM,D.stream.column(),aK,null,aO.lexical,aL)};aJ.lex=true;return aJ}function h(){var aJ=D.state;if(aJ.lexical.prev){if(aJ.lexical.type==")"){aJ.indented=aJ.lexical.indented}aJ.lexical=aJ.lexical.prev}}h.lex=true;function r(aJ){function aK(aL){if(aL==aJ){return ae()}else{if(aJ==";"){return aa()}else{return ae(aK)}}}return aK}function aH(aJ,aK){if(aJ=="var"){return ae(aF("vardef",aK.length),d,r(";"),h)}if(aJ=="keyword a"){return ae(aF("form"),an,aH,h)}if(aJ=="keyword b"){return ae(aF("form"),aH,h)}if(aJ=="{"){return ae(aF("}"),y,h)}if(aJ==";"){return ae()}if(aJ=="if"){if(D.state.lexical.info=="else"&&D.state.cc[D.state.cc.length-1]==h){D.state.cc.pop()()}return ae(aF("form"),an,aH,h,e)}if(aJ=="function"){return ae(M)}if(aJ=="for"){return ae(aF("form"),u,aH,h)}if(aJ=="variable"){return ae(aF("stat"),aI)}if(aJ=="switch"){return ae(aF("form"),an,aF("}","switch"),r("{"),y,h,h)}if(aJ=="case"){return ae(an,r(":"))}if(aJ=="default"){return ae(r(":"))}if(aJ=="catch"){return ae(aF("form"),w,r("("),af,r(")"),aH,h,x)}if(aJ=="module"){return ae(aF("form"),w,H,x,h)}if(aJ=="class"){return ae(aF("form"),V,h)}if(aJ=="export"){return ae(aF("form"),aG,h)}if(aJ=="import"){return ae(aF("form"),ag,h)}return aa(aF("stat"),an,r(";"),h)}function an(aJ){return Y(aJ,false)}function aE(aJ){return Y(aJ,true)}function Y(aK,aM){if(D.state.fatArrowAt==D.stream.start){var aJ=aM?N:W;if(aK=="("){return ae(w,aF(")"),at(i,")"),h,r("=>"),aJ,x)}else{if(aK=="variable"){return aa(w,i,r("=>"),aJ,x)}}}var aL=aM?j:ab;if(b.hasOwnProperty(aK)){return ae(aL)}if(aK=="function"){return ae(M,aL)}if(aK=="keyword c"){return ae(aM?ak:ai)}if(aK=="("){return ae(aF(")"),ai,az,r(")"),h,aL)}if(aK=="operator"||aK=="spread"){return ae(aM?aE:an)}if(aK=="["){return ae(aF("]"),n,h,aL)}if(aK=="{"){return ay(t,"}",null,aL)}if(aK=="quasi"){return aa(Q,aL)}return ae()}function ai(aJ){if(aJ.match(/[;\}\)\],]/)){return aa()}return aa(an)}function ak(aJ){if(aJ.match(/[;\}\)\],]/)){return aa()}return aa(aE)}function ab(aJ,aK){if(aJ==","){return ae(an)}return j(aJ,aK,false)}function j(aJ,aL,aN){var aK=aN==false?ab:j;var aM=aN==false?an:aE;if(aJ=="=>"){return ae(w,aN?N:W,x)}if(aJ=="operator"){if(/\+\+|--/.test(aL)){return ae(aK)}if(aL=="?"){return ae(an,r(":"),aM)}return ae(aM)}if(aJ=="quasi"){return aa(Q,aK)}if(aJ==";"){return}if(aJ=="("){return ay(aE,")","call",aK)}if(aJ=="."){return ae(al,aK)}if(aJ=="["){return ae(aF("]"),ai,r("]"),h,aK)}}function Q(aJ,aK){if(aJ!="quasi"){return aa()}if(aK.slice(aK.length-2)!="${"){return ae(Q)}return ae(an,p)}function p(aJ){if(aJ=="}"){D.marked="string-2";D.state.tokenize=aC;return ae(Q)}}function W(aJ){ax(D.stream,D.state);return aa(aJ=="{"?aH:an)}function N(aJ){ax(D.stream,D.state);return aa(aJ=="{"?aH:aE)}function aI(aJ){if(aJ==":"){return ae(h,aH)}return aa(ab,r(";"),h)}function al(aJ){if(aJ=="variable"){D.marked="property";return ae()}}function t(aJ,aK){if(aJ=="variable"||D.style=="keyword"){D.marked="property";if(aK=="get"||aK=="set"){return ae(I)}return ae(K)}else{if(aJ=="number"||aJ=="string"){D.marked=aB?"property":(D.style+" property");return ae(K)}else{if(aJ=="jsonld-keyword"){return ae(K)}else{if(aJ=="["){return ae(an,r("]"),K)}}}}}function I(aJ){if(aJ!="variable"){return aa(K)}D.marked="property";return ae(M)}function K(aJ){if(aJ==":"){return ae(aE)}if(aJ=="("){return aa(M)}}function at(aL,aJ){function aK(aN){if(aN==","){var aM=D.state.lexical;if(aM.info=="call"){aM.pos=(aM.pos||0)+1}return ae(aL,aK)}if(aN==aJ){return ae()}return ae(r(aJ))}return function(aM){if(aM==aJ){return ae()}return aa(aL,aK)}}function ay(aM,aJ,aL){for(var aK=3;aK<arguments.length;aK++){D.cc.push(arguments[aK])}return ae(aF(aJ,aL),at(aM,aJ),h)}function y(aJ){if(aJ=="}"){return ae()}return aa(aH,y)}function T(aJ){if(g&&aJ==":"){return ae(ad)}}function av(aJ,aK){if(aK=="="){return ae(aE)}}function ad(aJ){if(aJ=="variable"){D.marked="variable-3";return ae()}}function d(){return aa(i,T,ac,X)}function i(aJ,aK){if(aJ=="variable"){aw(aK);return ae()}if(aJ=="["){return ay(i,"]")}if(aJ=="{"){return ay(aD,"}")}}function aD(aJ,aK){if(aJ=="variable"&&!D.stream.match(/^\s*:/,false)){aw(aK);return ae(ac)}if(aJ=="variable"){D.marked="property"}return ae(r(":"),i,ac)}function ac(aJ,aK){if(aK=="="){return ae(aE)}}function X(aJ){if(aJ==","){return ae(d)}}function e(aJ,aK){if(aJ=="keyword b"&&aK=="else"){return ae(aF("form","else"),aH,h)}}function u(aJ){if(aJ=="("){return ae(aF(")"),E,r(")"),h)}}function E(aJ){if(aJ=="var"){return ae(d,r(";"),C)}if(aJ==";"){return ae(C)}if(aJ=="variable"){return ae(v)}return aa(an,r(";"),C)}function v(aJ,aK){if(aK=="in"||aK=="of"){D.marked="keyword";return ae(an)}return ae(ab,C)}function C(aJ,aK){if(aJ==";"){return ae(B)}if(aK=="in"||aK=="of"){D.marked="keyword";return ae(an)}return aa(an,r(";"),B)}function B(aJ){if(aJ!=")"){ae(an)}}function M(aJ,aK){if(aK=="*"){D.marked="keyword";return ae(M)}if(aJ=="variable"){aw(aK);return ae(M)}if(aJ=="("){return ae(w,aF(")"),at(af,")"),h,aH,x)}}function af(aJ){if(aJ=="spread"){return ae(af)}return aa(i,T,av)}function V(aJ,aK){if(aJ=="variable"){aw(aK);return ae(O)}}function O(aJ,aK){if(aK=="extends"){return ae(an,O)}if(aJ=="{"){return ae(aF("}"),o,h)}}function o(aJ,aK){if(aJ=="variable"||D.style=="keyword"){if(aK=="static"){D.marked="keyword";return ae(o)}D.marked="property";if(aK=="get"||aK=="set"){return ae(c,M,o)}return ae(M,o)}if(aK=="*"){D.marked="keyword";return ae(o)}if(aJ==";"){return ae(o)}if(aJ=="}"){return ae()}}function c(aJ){if(aJ!="variable"){return aa()}D.marked="property";return ae()}function H(aJ,aK){if(aJ=="string"){return ae(aH)}if(aJ=="variable"){aw(aK);return ae(ah)}}function aG(aJ,aK){if(aK=="*"){D.marked="keyword";return ae(ah,r(";"))}if(aK=="default"){D.marked="keyword";return ae(an,r(";"))}return aa(aH)}function ag(aJ){if(aJ=="string"){return ae()}return aa(ap,ah)}function ap(aJ,aK){if(aJ=="{"){return ay(ap,"}")}if(aJ=="variable"){aw(aK)}if(aK=="*"){D.marked="keyword"}return ae(k)}function k(aJ,aK){if(aK=="as"){D.marked="keyword";return ae(ap)}}function ah(aJ,aK){if(aK=="from"){D.marked="keyword";return ae(an)}}function n(aJ){if(aJ=="]"){return ae()}return aa(aE,am)}function am(aJ){if(aJ=="for"){return aa(az,r("]"))}if(aJ==","){return ae(at(ak,"]"))}return aa(at(aE,"]"))}function az(aJ){if(aJ=="for"){return ae(u,az)}if(aJ=="if"){return ae(an,az)}}function ao(aK,aJ){return aK.lastType=="operator"||aK.lastType==","||P.test(aJ.charAt(0))||/[,.]/.test(aJ.charAt(0))}return{startState:function(aK){var aJ={tokenize:U,lastType:"sof",cc:[],lexical:new J((aK||0)-l,0,"block",false),localVars:aj.localVars,context:aj.localVars&&{vars:aj.localVars},indented:0};if(aj.globalVars&&typeof aj.globalVars=="object"){aJ.globalVars=aj.globalVars}return aJ},token:function(aL,aK){if(aL.sol()){if(!aK.lexical.hasOwnProperty("align")){aK.lexical.align=false}aK.indented=aL.indentation();ax(aL,aK)}if(aK.tokenize!=aA&&aL.eatSpace()){return null}var aJ=aK.tokenize(aL,aK);if(S=="comment"){return aJ}aK.lastType=S=="operator"&&(G=="++"||G=="--")?"incdec":S;return f(aK,aJ,S,G,aL)},indent:function(aP,aJ){if(aP.tokenize==aA){return a.Pass}if(aP.tokenize!=U){return 0}var aO=aJ&&aJ.charAt(0),aM=aP.lexical;if(!/^\s*else\b/.test(aJ)){for(var aL=aP.cc.length-1;aL>=0;--aL){var aQ=aP.cc[aL];if(aQ==h){aM=aM.prev}else{if(aQ!=e){break}}}}if(aM.type=="stat"&&aO=="}"){aM=aM.prev}if(A&&aM.type==")"&&aM.prev.type=="stat"){aM=aM.prev}var aN=aM.type,aK=aO==aN;if(aN=="vardef"){return aM.indented+(aP.lastType=="operator"||aP.lastType==","?aM.info+1:0)}else{if(aN=="form"&&aO=="{"){return aM.indented}else{if(aN=="form"){return aM.indented+l}else{if(aN=="stat"){return aM.indented+(ao(aP,aJ)?A||l:0)}else{if(aM.info=="switch"&&!aK&&aj.doubleIndentSwitch!=false){return aM.indented+(/^(?:case|default)\b/.test(aJ)?l:2*l)}else{if(aM.align){return aM.column+(aK?0:1)}else{return aM.indented+(aK?0:l)}}}}}}},electricInput:/^\s*(?:case .*?:|default:|\{|\})$/,blockCommentStart:z?null:"/*",blockCommentEnd:z?null:"*/",lineComment:z?null:"//",fold:"brace",closeBrackets:"()[]{}''\"\"``",helperType:z?"json":"javascript",jsonldMode:aB,jsonMode:z}});a.registerHelper("wordChars","javascript",/[\w$]/);a.defineMIME("text/javascript","javascript");a.defineMIME("text/ecmascript","javascript");a.defineMIME("application/javascript","javascript");a.defineMIME("application/x-javascript","javascript");a.defineMIME("application/ecmascript","javascript");a.defineMIME("application/json",{name:"javascript",json:true});a.defineMIME("application/x-json",{name:"javascript",json:true});a.defineMIME("application/ld+json",{name:"javascript",jsonld:true});a.defineMIME("text/typescript",{name:"javascript",typescript:true});a.defineMIME("application/typescript",{name:"javascript",typescript:true})});
com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/js/index.html000060400000000054152453623450032434 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/js/codemirror.addons000060400000021764152453623450034011 0ustar00components/com_acymailing(function(n){typeof exports=="object"&&typeof module=="object"?n(require("../../lib/codemirror")):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],n):n(CodeMirror)})(function(n){function t(n,t,i){var u=n.getWrapperElement(),r;return r=u.appendChild(document.createElement("div")),r.className=i?"CodeMirror-dialog CodeMirror-dialog-bottom":"CodeMirror-dialog CodeMirror-dialog-top",typeof t=="string"?r.innerHTML=t:r.appendChild(t),r}function i(n,t){n.state.currentNotificationClose&&n.state.currentNotificationClose();n.state.currentNotificationClose=t}n.defineExtension("openDialog",function(r,u,f){function o(n){if(typeof n=="string")e.value=n;else{if(c)return;if(c=!0,s.parentNode.removeChild(s),l.focus(),f.onClose)f.onClose(s)}}var e,h;f||(f={});i(this,null);var s=t(this,r,f.bottom),c=!1,l=this;if(e=s.getElementsByTagName("input")[0],e){if(f.value&&(e.value=f.value,f.selectValueOnOpen!==!1&&e.select()),f.onInput)n.on(e,"input",function(n){f.onInput(n,e.value,o)});if(f.onKeyUp)n.on(e,"keyup",function(n){f.onKeyUp(n,e.value,o)});n.on(e,"keydown",function(t){f&&f.onKeyDown&&f.onKeyDown(t,e.value,o)||((t.keyCode==27||f.closeOnEnter!==!1&&t.keyCode==13)&&(e.blur(),n.e_stop(t),o()),t.keyCode==13&&u(e.value,t))});if(f.closeOnBlur!==!1)n.on(e,"blur",o);e.focus()}else if(h=s.getElementsByTagName("button")[0]){n.on(h,"click",function(){o();l.focus()});if(f.closeOnBlur!==!1)n.on(h,"blur",o);h.focus()}return o});n.defineExtension("openConfirm",function(r,u,f){function v(){l||(l=!0,s.parentNode.removeChild(s),a.focus())}var e,o;i(this,null);var s=t(this,r,f&&f.bottom),h=s.getElementsByTagName("button"),l=!1,a=this,c=1;for(h[0].focus(),e=0;e<h.length;++e){o=h[e],function(t){n.on(o,"click",function(i){n.e_preventDefault(i);v();t&&t(a)})}(u[e]);n.on(o,"blur",function(){--c;setTimeout(function(){c<=0&&v()},200)});n.on(o,"focus",function(){++c})}});n.defineExtension("openNotification",function(r,u){function f(){o||(o=!0,clearTimeout(s),e.parentNode.removeChild(e))}i(this,f);var e=t(this,r,u&&u.bottom),o=!1,s,h=u&&typeof u.duration!="undefined"?u.duration:5e3;n.on(e,"click",function(t){n.e_preventDefault(t);f()});return h&&(s=setTimeout(f,h)),f})}),function(n){typeof exports=="object"&&typeof module=="object"?n(require("../../lib/codemirror"),require("./searchcursor"),require("../dialog/dialog")):typeof define=="function"&&define.amd?define(["../../lib/codemirror","./searchcursor","../dialog/dialog"],n):n(CodeMirror)}(function(n){"use strict";function c(n,t){return typeof n=="string"?n=new RegExp(n.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&"),t?"gi":"g"):n.global||(n=new RegExp(n.source,n.ignoreCase?"gi":"g")),{token:function(t){n.lastIndex=t.pos;var i=n.exec(t.string);if(i&&i.index==t.pos)return t.pos+=i[0].length,"searching";i?t.pos=i.index:t.skipToEnd()}}}function l(){this.posFrom=this.posTo=this.lastQuery=this.query=null;this.overlay=null}function i(n){return n.state.search||(n.state.search=new l)}function r(n){return typeof n=="string"&&n==n.toLowerCase()}function t(n,t,i){return n.getSearchCursor(t,i,r(t))}function u(n,t,i,r,u){n.openDialog?n.openDialog(t,u,{value:r,selectValueOnOpen:!0}):u(prompt(i,r))}function a(n,t,i,r){n.openConfirm?n.openConfirm(t,r):confirm(i)&&r[0]()}function o(n){var t=n.match(/^\/(.*)\/([a-z]*)$/);if(t)try{n=new RegExp(t[1],t[2].indexOf("i")==-1?"":"i")}catch(i){}return(typeof n=="string"?n=="":n.test(""))&&(n=/x^/),n}function f(n,t){var f=i(n),e;if(f.query)return s(n,t);e=n.getSelection()||f.lastQuery;u(n,v,"Search for:",e,function(i){n.operation(function(){i&&!f.query&&(f.query=o(i),n.removeOverlay(f.overlay,r(f.query)),f.overlay=c(f.query,r(f.query)),n.addOverlay(f.overlay),n.showMatchesOnScrollbar&&(f.annotate&&(f.annotate.clear(),f.annotate=null),f.annotate=n.showMatchesOnScrollbar(f.query,r(f.query))),f.posFrom=f.posTo=n.getCursor(),s(n,t))})})}function s(r,u){r.operation(function(){var e=i(r),f=t(r,e.query,u?e.posFrom:e.posTo);(f.find(u)||(f=t(r,e.query,u?n.Pos(r.lastLine()):n.Pos(r.firstLine(),0)),f.find(u)))&&(r.setSelection(f.from(),f.to()),r.scrollIntoView({from:f.from(),to:f.to()}),e.posFrom=f.from(),e.posTo=f.to())})}function e(n){n.operation(function(){var t=i(n);(t.lastQuery=t.query,t.query)&&(t.query=null,n.removeOverlay(t.overlay),t.annotate&&(t.annotate.clear(),t.annotate=null))})}function h(n,r){if(!n.getOption("readOnly")){var f=n.getSelection()||i(n).lastQuery;u(n,y,"Replace:",f,function(i){i&&(i=o(i),u(n,p,"Replace with:","",function(u){if(r)n.operation(function(){for(var f,r=t(n,i);r.findNext();)typeof i!="string"?(f=n.getRange(r.from(),r.to()).match(i),r.replace(u.replace(/\$(\d)/g,function(n,t){return f[t]}))):r.replace(u)});else{e(n);var f=t(n,i,n.getCursor()),o=function(){var r=f.from(),u;((u=f.findNext())||(f=t(n,i),(u=f.findNext())&&(!r||f.from().line!=r.line||f.from().ch!=r.ch)))&&(n.setSelection(f.from(),f.to()),n.scrollIntoView({from:f.from(),to:f.to()}),a(n,w,"Replace?",[function(){s(u)},o]))},s=function(n){f.replace(typeof i=="string"?u:u.replace(/\$(\d)/g,function(t,i){return n[i]}));o()};o()}}))})}}var v='Search: <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)<\/span>',y='Replace: <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)<\/span>',p='With: <input type="text" style="width: 10em" class="CodeMirror-search-field"/>',w="Replace? <button>Yes<\/button> <button>No<\/button> <button>Stop<\/button>";n.commands.find=function(n){e(n);f(n)};n.commands.findNext=f;n.commands.findPrev=function(n){f(n,!0)};n.commands.clearSearch=e;n.commands.replace=h;n.commands.replaceAll=function(n){h(n,!0)}}),function(n){typeof exports=="object"&&typeof module=="object"?n(require("../../lib/codemirror")):typeof define=="function"&&define.amd?define(["../../lib/codemirror"],n):n(CodeMirror)}(function(n){"use strict";function i(n,i,u,f){var h,o,e,s;this.atOccurrence=!1;this.doc=n;f==null&&typeof i=="string"&&(f=!1);u=u?n.clipPos(u):t(0,0);this.pos={from:u,to:u};typeof i!="string"?(i.global||(i=new RegExp(i.source,i.ignoreCase?"ig":"g")),this.matches=function(r,u){var o,h,f,s,c,e;if(r){for(i.lastIndex=0,o=n.getLine(u.line).slice(0,u.ch),h=0;;){if(i.lastIndex=h,c=i.exec(o),!c)break;if(f=c,s=f.index,h=f.index+(f[0].length||1),h==o.length)break}e=f&&f[0].length||0;e||(s==0&&o.length==0?f=undefined:s!=n.getLine(u.line).length&&e++)}else{i.lastIndex=u.ch;var o=n.getLine(u.line),f=i.exec(o),e=f&&f[0].length||0,s=f&&f.index;s+e==o.length||e||(e=1)}if(f&&e)return{from:t(u.line,s),to:t(u.line,s+e),match:f}}):(h=i,f&&(i=i.toLowerCase()),o=f?function(n){return n.toLowerCase()}:function(n){return n},e=i.split("\n"),e.length==1?this.matches=i.length?function(u,f){if(u){var s=n.getLine(f.line).slice(0,f.ch),c=o(s),e=c.lastIndexOf(i);if(e>-1)return e=r(s,c,e),{from:t(f.line,e),to:t(f.line,e+h.length)}}else{var s=n.getLine(f.line).slice(f.ch),c=o(s),e=c.indexOf(i);if(e>-1)return e=r(s,c,e)+f.ch,{from:t(f.line,e),to:t(f.line,e+h.length)}}}:function(){}:(s=h.split("\n"),this.matches=function(i,r){var h=e.length-1,a,c,l,v,u,f;if(i){if(r.line-(e.length-1)<n.firstLine())return;if(o(n.getLine(r.line).slice(0,s[h].length))!=e[e.length-1])return;for(a=t(r.line,s[h].length),u=r.line-1,f=h-1;f>=1;--f,--u)if(e[f]!=o(n.getLine(u)))return;return(c=n.getLine(u),l=c.length-s[0].length,o(c.slice(l))!=e[0])?void 0:{from:t(u,l),to:a}}if(!(r.line+(e.length-1)>n.lastLine())&&(c=n.getLine(r.line),l=c.length-s[0].length,o(c.slice(l))==e[0])){for(v=t(r.line,l),u=r.line+1,f=1;f<h;++f,++u)if(e[f]!=o(n.getLine(u)))return;if(o(n.getLine(u).slice(0,s[h].length))==e[h])return{from:v,to:t(u,s[h].length)}}}))}function r(n,t,i){var r,u;if(n.length==t.length)return i;for(r=Math.min(i,n.length);;)if(u=n.slice(0,r).toLowerCase().length,u<i)++r;else if(u>i)--r;else return r}var t=n.Pos;i.prototype={findNext:function(){return this.find(!1)},findPrevious:function(){return this.find(!0)},find:function(n){function f(n){var i=t(n,0);return u.pos={from:i,to:i},u.atOccurrence=!1,!1}for(var u=this,i=this.doc.clipPos(n?this.pos.from:this.pos.to),r;;){if(this.pos=this.matches(n,i))return this.atOccurrence=!0,this.pos.match||!0;if(n){if(!i.line)return f(0);i=t(i.line-1,this.doc.getLine(i.line-1).length)}else{if(r=this.doc.lineCount(),i.line==r-1)return f(r);i=t(i.line+1,0)}}},from:function(){if(this.atOccurrence)return this.pos.from},to:function(){if(this.atOccurrence)return this.pos.to},replace:function(i,r){if(this.atOccurrence){var u=n.splitLines(i);this.doc.replaceRange(u,this.pos.from,this.pos.to,r);this.pos.to=t(this.pos.from.line+u.length-1,u[u.length-1].length+(u.length==1?this.pos.from.ch:0))}}};n.defineExtension("getSearchCursor",function(n,t,r){return new i(this.doc,n,t,r)});n.defineDocExtension("getSearchCursor",function(n,t,r){return new i(this,n,t,r)});n.defineExtension("selectMatches",function(t,i){for(var u=[],r=this.getSearchCursor(t,this.getCursor("from"),i);r.findNext();){if(n.cmpPos(r.to(),this.getCursor("to"))>0)break;u.push({anchor:r.from(),head:r.to()})}u.length&&this.setSelections(u,0)})})
extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/js/codemirror.mode.h000060400000136024152453623450033707 0ustar00components/com_acymailing(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror"],a)}else{a(CodeMirror)}}})(function(a){a.defineMode("xml",function(y,k){var p=y.indentUnit;var x=k.multilineTagIndentFactor||1;var d=k.multilineTagIndentPastTag;if(d==null){d=true}var w=k.htmlMode?{autoSelfClosers:{area:true,base:true,br:true,col:true,command:true,embed:true,frame:true,hr:true,img:true,input:true,keygen:true,link:true,meta:true,param:true,source:true,track:true,wbr:true,menuitem:true},implicitlyClosed:{dd:true,li:true,optgroup:true,option:true,p:true,rp:true,rt:true,tbody:true,td:true,tfoot:true,th:true,tr:true},contextGrabbers:{dd:{dd:true,dt:true},dt:{dd:true,dt:true},li:{li:true},option:{option:true,optgroup:true},optgroup:{optgroup:true},p:{address:true,article:true,aside:true,blockquote:true,dir:true,div:true,dl:true,fieldset:true,footer:true,form:true,h1:true,h2:true,h3:true,h4:true,h5:true,h6:true,header:true,hgroup:true,hr:true,menu:true,nav:true,ol:true,p:true,pre:true,section:true,table:true,ul:true},rp:{rp:true,rt:true},rt:{rp:true,rt:true},tbody:{tbody:true,tfoot:true},td:{td:true,th:true},tfoot:{tbody:true},th:{td:true,th:true},thead:{tbody:true,tfoot:true},tr:{tr:true}},doNotIndent:{pre:true},allowUnquoted:true,allowMissing:true,caseFold:true}:{autoSelfClosers:{},implicitlyClosed:{},contextGrabbers:{},doNotIndent:{},allowUnquoted:false,allowMissing:false,caseFold:false};var c=k.alignCDATA;var f,g;function n(F,E){function C(G){E.tokenize=G;return G(F,E)}var D=F.next();if(D=="<"){if(F.eat("!")){if(F.eat("[")){if(F.match("CDATA[")){return C(v("atom","]]>"))}else{return null}}else{if(F.match("--")){return C(v("comment","-->"))}else{if(F.match("DOCTYPE",true,true)){F.eatWhile(/[\w\._\-]/);return C(z(1))}else{return null}}}}else{if(F.eat("?")){F.eatWhile(/[\w\._\-]/);E.tokenize=v("meta","?>");return"meta"}else{f=F.eat("/")?"closeTag":"openTag";E.tokenize=m;return"tag bracket"}}}else{if(D=="&"){var B;if(F.eat("#")){if(F.eat("x")){B=F.eatWhile(/[a-fA-F\d]/)&&F.eat(";")}else{B=F.eatWhile(/[\d]/)&&F.eat(";")}}else{B=F.eatWhile(/[\w\.\-:]/)&&F.eat(";")}return B?"atom":"error"}else{F.eatWhile(/[^&<]/);return null}}}function m(E,D){var C=E.next();if(C==">"||(C=="/"&&E.eat(">"))){D.tokenize=n;f=C==">"?"endTag":"selfcloseTag";return"tag bracket"}else{if(C=="="){f="equals";return null}else{if(C=="<"){D.tokenize=n;D.state=l;D.tagName=D.tagStart=null;var B=D.tokenize(E,D);return B?B+" tag error":"tag error"}else{if(/[\'\"]/.test(C)){D.tokenize=j(C);D.stringStartCol=E.column();return D.tokenize(E,D)}else{E.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/);return"word"}}}}}function j(B){var C=function(E,D){while(!E.eol()){if(E.next()==B){D.tokenize=m;break}}return"string"};C.isInAttribute=true;return C}function v(C,B){return function(E,D){while(!E.eol()){if(E.match(B)){D.tokenize=n;break}E.next()}return C}}function z(B){return function(E,D){var C;while((C=E.next())!=null){if(C=="<"){D.tokenize=z(B+1);return D.tokenize(E,D)}else{if(C==">"){if(B==1){D.tokenize=n;break}else{D.tokenize=z(B-1);return D.tokenize(E,D)}}}}return"meta"}}function r(C,B,D){this.prev=C.context;this.tagName=B;this.indent=C.indented;this.startOfLine=D;if(w.doNotIndent.hasOwnProperty(B)||(C.context&&C.context.noIndent)){this.noIndent=true}}function u(B){if(B.context){B.context=B.context.prev}}function q(D,C){var B;while(true){if(!D.context){return}B=D.context.tagName;if(!w.contextGrabbers.hasOwnProperty(B)||!w.contextGrabbers[B].hasOwnProperty(C)){return}u(D)}}function l(B,D,C){if(B=="openTag"){C.tagStart=D.column();return b}else{if(B=="closeTag"){return t}else{return l}}}function b(B,D,C){if(B=="word"){C.tagName=D.current();g="tag";return e}else{g="error";return b}}function t(C,E,D){if(C=="word"){var B=E.current();if(D.context&&D.context.tagName!=B&&w.implicitlyClosed.hasOwnProperty(D.context.tagName)){u(D)}if(D.context&&D.context.tagName==B){g="tag";return s}else{g="tag error";return A}}else{g="error";return A}}function s(C,B,D){if(C!="endTag"){g="error";return s}u(D);return l}function A(B,D,C){g="error";return s(B,D,C)}function e(E,C,F){if(E=="word"){g="attribute";return i}else{if(E=="endTag"||E=="selfcloseTag"){var D=F.tagName,B=F.tagStart;F.tagName=F.tagStart=null;if(E=="selfcloseTag"||w.autoSelfClosers.hasOwnProperty(D)){q(F,D)}else{q(F,D);F.context=new r(F,D,B==F.indented)}return l}}g="error";return e}function i(B,D,C){if(B=="equals"){return o}if(!w.allowMissing){g="error"}return e(B,D,C)}function o(B,D,C){if(B=="string"){return h}if(B=="word"&&w.allowUnquoted){g="string";return e}g="error";return e(B,D,C)}function h(B,D,C){if(B=="string"){return h}return e(B,D,C)}return{startState:function(){return{tokenize:n,state:l,indented:0,tagName:null,tagStart:null,context:null}},token:function(D,C){if(!C.tagName&&D.sol()){C.indented=D.indentation()}if(D.eatSpace()){return null}f=null;var B=C.tokenize(D,C);if((B||f)&&B!="comment"){g=null;C.state=C.state(f||B,D,C);if(g){B=g=="error"?B+" error":g}}return B},indent:function(G,C,F){var E=G.context;if(G.tokenize.isInAttribute){if(G.tagStart==G.indented){return G.stringStartCol+1}else{return G.indented+p}}if(E&&E.noIndent){return a.Pass}if(G.tokenize!=m&&G.tokenize!=n){return F?F.match(/^(\s*)/)[0].length:0}if(G.tagName){if(d){return G.tagStart+G.tagName.length+2}else{return G.tagStart+p*x}}if(c&&/<!\[CDATA\[/.test(C)){return 0}var B=C&&/^<(\/)?([\w_:\.-]*)/.exec(C);if(B&&B[1]){while(E){if(E.tagName==B[2]){E=E.prev;break}else{if(w.implicitlyClosed.hasOwnProperty(E.tagName)){E=E.prev}else{break}}}}else{if(B){while(E){var D=w.contextGrabbers[E.tagName];if(D&&D.hasOwnProperty(B[2])){E=E.prev}else{break}}}}while(E&&!E.startOfLine){E=E.prev}if(E){return E.indent+p}else{return 0}},electricInput:/<\/[\s\w:]+>$/,blockCommentStart:"<!--",blockCommentEnd:"-->",configuration:k.htmlMode?"html":"xml",helperType:k.htmlMode?"html":"xml"}});a.defineMIME("text/xml","xml");a.defineMIME("application/xml","xml");if(!a.mimeModes.hasOwnProperty("text/html")){a.defineMIME("text/html",{name:"xml",htmlMode:true})}});(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror"],a)}else{a(CodeMirror)}}})(function(a){a.defineMode("javascript",function(Z,aj){var l=Z.indentUnit;var A=aj.statementIndent;var aB=aj.jsonld;var z=aj.json||aB;var g=aj.typescript;var au=aj.wordCharacters||/[\w$\xa1-\uffff]/;var ar=function(){function aR(aT){return{type:aT,style:"keyword"}}var aM=aR("keyword a"),aK=aR("keyword b"),aJ=aR("keyword c");var aL=aR("operator"),aP={type:"atom",style:"atom"};var aN={"if":aR("if"),"while":aM,"with":aM,"else":aK,"do":aK,"try":aK,"finally":aK,"return":aJ,"break":aJ,"continue":aJ,"new":aJ,"delete":aJ,"throw":aJ,"debugger":aJ,"var":aR("var"),"const":aR("var"),let:aR("var"),"function":aR("function"),"catch":aR("catch"),"for":aR("for"),"switch":aR("switch"),"case":aR("case"),"default":aR("default"),"in":aL,"typeof":aL,"instanceof":aL,"true":aP,"false":aP,"null":aP,"undefined":aP,"NaN":aP,"Infinity":aP,"this":aR("this"),module:aR("module"),"class":aR("class"),"super":aR("atom"),yield:aJ,"export":aR("export"),"import":aR("import"),"extends":aJ};if(g){var aS={type:"variable",style:"variable-3"};var aO={"interface":aR("interface"),"extends":aR("extends"),constructor:aR("constructor"),"public":aR("public"),"private":aR("private"),"protected":aR("protected"),"static":aR("static"),string:aS,number:aS,bool:aS,any:aS};for(var aQ in aO){aN[aQ]=aO[aQ]}}return aN}();var P=/[+\-*&%=<>!?|~^]/;var aq=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/;function F(aM){var aK=false,aJ,aL=false;while((aJ=aM.next())!=null){if(!aK){if(aJ=="/"&&!aL){return}if(aJ=="["){aL=true}else{if(aL&&aJ=="]"){aL=false}}}aK=!aK&&aJ=="\\"}}var S,G;function L(aL,aK,aJ){S=aL;G=aJ;return aK}function U(aN,aL){var aJ=aN.next();if(aJ=='"'||aJ=="'"){aL.tokenize=R(aJ);return aL.tokenize(aN,aL)}else{if(aJ=="."&&aN.match(/^\d+(?:[eE][+\-]?\d+)?/)){return L("number","number")}else{if(aJ=="."&&aN.match("..")){return L("spread","meta")}else{if(/[\[\]{}\(\),;\:\.]/.test(aJ)){return L(aJ)}else{if(aJ=="="&&aN.eat(">")){return L("=>","operator")}else{if(aJ=="0"&&aN.eat(/x/i)){aN.eatWhile(/[\da-f]/i);return L("number","number")}else{if(/\d/.test(aJ)){aN.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);return L("number","number")}else{if(aJ=="/"){if(aN.eat("*")){aL.tokenize=aA;return aA(aN,aL)}else{if(aN.eat("/")){aN.skipToEnd();return L("comment","comment")}else{if(aL.lastType=="operator"||aL.lastType=="keyword c"||aL.lastType=="sof"||/^[\[{}\(,;:]$/.test(aL.lastType)){F(aN);aN.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/);return L("regexp","string-2")}else{aN.eatWhile(P);return L("operator","operator",aN.current())}}}}else{if(aJ=="`"){aL.tokenize=aC;return aC(aN,aL)}else{if(aJ=="#"){aN.skipToEnd();return L("error","error")}else{if(P.test(aJ)){aN.eatWhile(P);return L("operator","operator",aN.current())}else{if(au.test(aJ)){aN.eatWhile(au);var aM=aN.current(),aK=ar.propertyIsEnumerable(aM)&&ar[aM];return(aK&&aL.lastType!=".")?L(aK.type,aK.style,aM):L("variable","variable",aM)}}}}}}}}}}}}}function R(aJ){return function(aN,aL){var aM=false,aK;if(aB&&aN.peek()=="@"&&aN.match(aq)){aL.tokenize=U;return L("jsonld-keyword","meta")}while((aK=aN.next())!=null){if(aK==aJ&&!aM){break}aM=!aM&&aK=="\\"}if(!aM){aL.tokenize=U}return L("string","string")}}function aA(aM,aL){var aJ=false,aK;while(aK=aM.next()){if(aK=="/"&&aJ){aL.tokenize=U;break}aJ=(aK=="*")}return L("comment","comment")}function aC(aM,aK){var aL=false,aJ;while((aJ=aM.next())!=null){if(!aL&&(aJ=="`"||aJ=="$"&&aM.eat("{"))){aK.tokenize=U;break}aL=!aL&&aJ=="\\"}return L("quasi","string-2",aM.current())}var m="([{}])";function ax(aP,aM){if(aM.fatArrowAt){aM.fatArrowAt=null}var aL=aP.string.indexOf("=>",aP.start);if(aL<0){return}var aO=0,aK=false;for(var aQ=aL-1;aQ>=0;--aQ){var aJ=aP.string.charAt(aQ);var aN=m.indexOf(aJ);if(aN>=0&&aN<3){if(!aO){++aQ;break}if(--aO==0){break}}else{if(aN>=3&&aN<6){++aO}else{if(au.test(aJ)){aK=true}else{if(/["'\/]/.test(aJ)){return}else{if(aK&&!aO){++aQ;break}}}}}}if(aK&&!aO){aM.fatArrowAt=aQ}}var b={atom:true,number:true,variable:true,string:true,regexp:true,"this":true,"jsonld-keyword":true};function J(aO,aK,aJ,aN,aL,aM){this.indented=aO;this.column=aK;this.type=aJ;this.prev=aL;this.info=aM;if(aN!=null){this.align=aN}}function s(aM,aL){for(var aK=aM.localVars;aK;aK=aK.next){if(aK.name==aL){return true}}for(var aJ=aM.context;aJ;aJ=aJ.prev){for(var aK=aJ.vars;aK;aK=aK.next){if(aK.name==aL){return true}}}}function f(aN,aK,aJ,aM,aO){var aP=aN.cc;D.state=aN;D.stream=aO;D.marked=null,D.cc=aP;D.style=aK;if(!aN.lexical.hasOwnProperty("align")){aN.lexical.align=true}while(true){var aL=aP.length?aP.pop():z?an:aH;if(aL(aJ,aM)){while(aP.length&&aP[aP.length-1].lex){aP.pop()()}if(D.marked){return D.marked}if(aJ=="variable"&&s(aN,aM)){return"variable-2"}return aK}}}var D={state:null,column:null,marked:null,cc:null};function aa(){for(var aJ=arguments.length-1;aJ>=0;aJ--){D.cc.push(arguments[aJ])}}function ae(){aa.apply(null,arguments);return true}function aw(aK){function aJ(aN){for(var aM=aN;aM;aM=aM.next){if(aM.name==aK){return true}}return false}var aL=D.state;if(aL.context){D.marked="def";if(aJ(aL.localVars)){return}aL.localVars={name:aK,next:aL.localVars}}else{if(aJ(aL.globalVars)){return}if(aj.globalVars){aL.globalVars={name:aK,next:aL.globalVars}}}}var q={name:"this",next:{name:"arguments"}};function w(){D.state.context={prev:D.state.context,vars:D.state.localVars};D.state.localVars=q}function x(){D.state.localVars=D.state.context.vars;D.state.context=D.state.context.prev}function aF(aK,aL){var aJ=function(){var aO=D.state,aM=aO.indented;if(aO.lexical.type=="stat"){aM=aO.lexical.indented}else{for(var aN=aO.lexical;aN&&aN.type==")"&&aN.align;aN=aN.prev){aM=aN.indented}}aO.lexical=new J(aM,D.stream.column(),aK,null,aO.lexical,aL)};aJ.lex=true;return aJ}function h(){var aJ=D.state;if(aJ.lexical.prev){if(aJ.lexical.type==")"){aJ.indented=aJ.lexical.indented}aJ.lexical=aJ.lexical.prev}}h.lex=true;function r(aJ){function aK(aL){if(aL==aJ){return ae()}else{if(aJ==";"){return aa()}else{return ae(aK)}}}return aK}function aH(aJ,aK){if(aJ=="var"){return ae(aF("vardef",aK.length),d,r(";"),h)}if(aJ=="keyword a"){return ae(aF("form"),an,aH,h)}if(aJ=="keyword b"){return ae(aF("form"),aH,h)}if(aJ=="{"){return ae(aF("}"),y,h)}if(aJ==";"){return ae()}if(aJ=="if"){if(D.state.lexical.info=="else"&&D.state.cc[D.state.cc.length-1]==h){D.state.cc.pop()()}return ae(aF("form"),an,aH,h,e)}if(aJ=="function"){return ae(M)}if(aJ=="for"){return ae(aF("form"),u,aH,h)}if(aJ=="variable"){return ae(aF("stat"),aI)}if(aJ=="switch"){return ae(aF("form"),an,aF("}","switch"),r("{"),y,h,h)}if(aJ=="case"){return ae(an,r(":"))}if(aJ=="default"){return ae(r(":"))}if(aJ=="catch"){return ae(aF("form"),w,r("("),af,r(")"),aH,h,x)}if(aJ=="module"){return ae(aF("form"),w,H,x,h)}if(aJ=="class"){return ae(aF("form"),V,h)}if(aJ=="export"){return ae(aF("form"),aG,h)}if(aJ=="import"){return ae(aF("form"),ag,h)}return aa(aF("stat"),an,r(";"),h)}function an(aJ){return Y(aJ,false)}function aE(aJ){return Y(aJ,true)}function Y(aK,aM){if(D.state.fatArrowAt==D.stream.start){var aJ=aM?N:W;if(aK=="("){return ae(w,aF(")"),at(i,")"),h,r("=>"),aJ,x)}else{if(aK=="variable"){return aa(w,i,r("=>"),aJ,x)}}}var aL=aM?j:ab;if(b.hasOwnProperty(aK)){return ae(aL)}if(aK=="function"){return ae(M,aL)}if(aK=="keyword c"){return ae(aM?ak:ai)}if(aK=="("){return ae(aF(")"),ai,az,r(")"),h,aL)}if(aK=="operator"||aK=="spread"){return ae(aM?aE:an)}if(aK=="["){return ae(aF("]"),n,h,aL)}if(aK=="{"){return ay(t,"}",null,aL)}if(aK=="quasi"){return aa(Q,aL)}return ae()}function ai(aJ){if(aJ.match(/[;\}\)\],]/)){return aa()}return aa(an)}function ak(aJ){if(aJ.match(/[;\}\)\],]/)){return aa()}return aa(aE)}function ab(aJ,aK){if(aJ==","){return ae(an)}return j(aJ,aK,false)}function j(aJ,aL,aN){var aK=aN==false?ab:j;var aM=aN==false?an:aE;if(aJ=="=>"){return ae(w,aN?N:W,x)}if(aJ=="operator"){if(/\+\+|--/.test(aL)){return ae(aK)}if(aL=="?"){return ae(an,r(":"),aM)}return ae(aM)}if(aJ=="quasi"){return aa(Q,aK)}if(aJ==";"){return}if(aJ=="("){return ay(aE,")","call",aK)}if(aJ=="."){return ae(al,aK)}if(aJ=="["){return ae(aF("]"),ai,r("]"),h,aK)}}function Q(aJ,aK){if(aJ!="quasi"){return aa()}if(aK.slice(aK.length-2)!="${"){return ae(Q)}return ae(an,p)}function p(aJ){if(aJ=="}"){D.marked="string-2";D.state.tokenize=aC;return ae(Q)}}function W(aJ){ax(D.stream,D.state);return aa(aJ=="{"?aH:an)}function N(aJ){ax(D.stream,D.state);return aa(aJ=="{"?aH:aE)}function aI(aJ){if(aJ==":"){return ae(h,aH)}return aa(ab,r(";"),h)}function al(aJ){if(aJ=="variable"){D.marked="property";return ae()}}function t(aJ,aK){if(aJ=="variable"||D.style=="keyword"){D.marked="property";if(aK=="get"||aK=="set"){return ae(I)}return ae(K)}else{if(aJ=="number"||aJ=="string"){D.marked=aB?"property":(D.style+" property");return ae(K)}else{if(aJ=="jsonld-keyword"){return ae(K)}else{if(aJ=="["){return ae(an,r("]"),K)}}}}}function I(aJ){if(aJ!="variable"){return aa(K)}D.marked="property";return ae(M)}function K(aJ){if(aJ==":"){return ae(aE)}if(aJ=="("){return aa(M)}}function at(aL,aJ){function aK(aN){if(aN==","){var aM=D.state.lexical;if(aM.info=="call"){aM.pos=(aM.pos||0)+1}return ae(aL,aK)}if(aN==aJ){return ae()}return ae(r(aJ))}return function(aM){if(aM==aJ){return ae()}return aa(aL,aK)}}function ay(aM,aJ,aL){for(var aK=3;aK<arguments.length;aK++){D.cc.push(arguments[aK])}return ae(aF(aJ,aL),at(aM,aJ),h)}function y(aJ){if(aJ=="}"){return ae()}return aa(aH,y)}function T(aJ){if(g&&aJ==":"){return ae(ad)}}function av(aJ,aK){if(aK=="="){return ae(aE)}}function ad(aJ){if(aJ=="variable"){D.marked="variable-3";return ae()}}function d(){return aa(i,T,ac,X)}function i(aJ,aK){if(aJ=="variable"){aw(aK);return ae()}if(aJ=="["){return ay(i,"]")}if(aJ=="{"){return ay(aD,"}")}}function aD(aJ,aK){if(aJ=="variable"&&!D.stream.match(/^\s*:/,false)){aw(aK);return ae(ac)}if(aJ=="variable"){D.marked="property"}return ae(r(":"),i,ac)}function ac(aJ,aK){if(aK=="="){return ae(aE)}}function X(aJ){if(aJ==","){return ae(d)}}function e(aJ,aK){if(aJ=="keyword b"&&aK=="else"){return ae(aF("form","else"),aH,h)}}function u(aJ){if(aJ=="("){return ae(aF(")"),E,r(")"),h)}}function E(aJ){if(aJ=="var"){return ae(d,r(";"),C)}if(aJ==";"){return ae(C)}if(aJ=="variable"){return ae(v)}return aa(an,r(";"),C)}function v(aJ,aK){if(aK=="in"||aK=="of"){D.marked="keyword";return ae(an)}return ae(ab,C)}function C(aJ,aK){if(aJ==";"){return ae(B)}if(aK=="in"||aK=="of"){D.marked="keyword";return ae(an)}return aa(an,r(";"),B)}function B(aJ){if(aJ!=")"){ae(an)}}function M(aJ,aK){if(aK=="*"){D.marked="keyword";return ae(M)}if(aJ=="variable"){aw(aK);return ae(M)}if(aJ=="("){return ae(w,aF(")"),at(af,")"),h,aH,x)}}function af(aJ){if(aJ=="spread"){return ae(af)}return aa(i,T,av)}function V(aJ,aK){if(aJ=="variable"){aw(aK);return ae(O)}}function O(aJ,aK){if(aK=="extends"){return ae(an,O)}if(aJ=="{"){return ae(aF("}"),o,h)}}function o(aJ,aK){if(aJ=="variable"||D.style=="keyword"){if(aK=="static"){D.marked="keyword";return ae(o)}D.marked="property";if(aK=="get"||aK=="set"){return ae(c,M,o)}return ae(M,o)}if(aK=="*"){D.marked="keyword";return ae(o)}if(aJ==";"){return ae(o)}if(aJ=="}"){return ae()}}function c(aJ){if(aJ!="variable"){return aa()}D.marked="property";return ae()}function H(aJ,aK){if(aJ=="string"){return ae(aH)}if(aJ=="variable"){aw(aK);return ae(ah)}}function aG(aJ,aK){if(aK=="*"){D.marked="keyword";return ae(ah,r(";"))}if(aK=="default"){D.marked="keyword";return ae(an,r(";"))}return aa(aH)}function ag(aJ){if(aJ=="string"){return ae()}return aa(ap,ah)}function ap(aJ,aK){if(aJ=="{"){return ay(ap,"}")}if(aJ=="variable"){aw(aK)}if(aK=="*"){D.marked="keyword"}return ae(k)}function k(aJ,aK){if(aK=="as"){D.marked="keyword";return ae(ap)}}function ah(aJ,aK){if(aK=="from"){D.marked="keyword";return ae(an)}}function n(aJ){if(aJ=="]"){return ae()}return aa(aE,am)}function am(aJ){if(aJ=="for"){return aa(az,r("]"))}if(aJ==","){return ae(at(ak,"]"))}return aa(at(aE,"]"))}function az(aJ){if(aJ=="for"){return ae(u,az)}if(aJ=="if"){return ae(an,az)}}function ao(aK,aJ){return aK.lastType=="operator"||aK.lastType==","||P.test(aJ.charAt(0))||/[,.]/.test(aJ.charAt(0))}return{startState:function(aK){var aJ={tokenize:U,lastType:"sof",cc:[],lexical:new J((aK||0)-l,0,"block",false),localVars:aj.localVars,context:aj.localVars&&{vars:aj.localVars},indented:0};if(aj.globalVars&&typeof aj.globalVars=="object"){aJ.globalVars=aj.globalVars}return aJ},token:function(aL,aK){if(aL.sol()){if(!aK.lexical.hasOwnProperty("align")){aK.lexical.align=false}aK.indented=aL.indentation();ax(aL,aK)}if(aK.tokenize!=aA&&aL.eatSpace()){return null}var aJ=aK.tokenize(aL,aK);if(S=="comment"){return aJ}aK.lastType=S=="operator"&&(G=="++"||G=="--")?"incdec":S;return f(aK,aJ,S,G,aL)},indent:function(aP,aJ){if(aP.tokenize==aA){return a.Pass}if(aP.tokenize!=U){return 0}var aO=aJ&&aJ.charAt(0),aM=aP.lexical;if(!/^\s*else\b/.test(aJ)){for(var aL=aP.cc.length-1;aL>=0;--aL){var aQ=aP.cc[aL];if(aQ==h){aM=aM.prev}else{if(aQ!=e){break}}}}if(aM.type=="stat"&&aO=="}"){aM=aM.prev}if(A&&aM.type==")"&&aM.prev.type=="stat"){aM=aM.prev}var aN=aM.type,aK=aO==aN;if(aN=="vardef"){return aM.indented+(aP.lastType=="operator"||aP.lastType==","?aM.info+1:0)}else{if(aN=="form"&&aO=="{"){return aM.indented}else{if(aN=="form"){return aM.indented+l}else{if(aN=="stat"){return aM.indented+(ao(aP,aJ)?A||l:0)}else{if(aM.info=="switch"&&!aK&&aj.doubleIndentSwitch!=false){return aM.indented+(/^(?:case|default)\b/.test(aJ)?l:2*l)}else{if(aM.align){return aM.column+(aK?0:1)}else{return aM.indented+(aK?0:l)}}}}}}},electricInput:/^\s*(?:case .*?:|default:|\{|\})$/,blockCommentStart:z?null:"/*",blockCommentEnd:z?null:"*/",lineComment:z?null:"//",fold:"brace",closeBrackets:"()[]{}''\"\"``",helperType:z?"json":"javascript",jsonldMode:aB,jsonMode:z}});a.registerHelper("wordChars","javascript",/[\w$]/);a.defineMIME("text/javascript","javascript");a.defineMIME("text/ecmascript","javascript");a.defineMIME("application/javascript","javascript");a.defineMIME("application/x-javascript","javascript");a.defineMIME("application/ecmascript","javascript");a.defineMIME("application/json",{name:"javascript",json:true});a.defineMIME("application/x-json",{name:"javascript",json:true});a.defineMIME("application/ld+json",{name:"javascript",jsonld:true});a.defineMIME("text/typescript",{name:"javascript",typescript:true});a.defineMIME("application/typescript",{name:"javascript",typescript:true})});(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror"],a)}else{a(CodeMirror)}}})(function(p){p.defineMode("css",function(T,G){if(!G.propertyKeywords){G=p.resolveMode("text/css")}var M=T.indentUnit,y=G.tokenHooks,w=G.documentTypes||{},S=G.mediaTypes||{},I=G.mediaFeatures||{},F=G.propertyKeywords||{},z=G.nonStandardPropertyKeywords||{},B=G.fontProperties||{},R=G.counterDescriptors||{},L=G.colorKeywords||{},O=G.valueKeywords||{},J=G.allowNested;var A,K;function U(X,Y){A=Y;return X}function W(aa,Z){var Y=aa.next();if(y[Y]){var X=y[Y](aa,Z);if(X!==false){return X}}if(Y=="@"){aa.eatWhile(/[\w\\\-]/);return U("def",aa.current())}else{if(Y=="="||(Y=="~"||Y=="|")&&aa.eat("=")){return U(null,"compare")}else{if(Y=='"'||Y=="'"){Z.tokenize=H(Y);return Z.tokenize(aa,Z)}else{if(Y=="#"){aa.eatWhile(/[\w\\\-]/);return U("atom","hash")}else{if(Y=="!"){aa.match(/^\s*\w*/);return U("keyword","important")}else{if(/\d/.test(Y)||Y=="."&&aa.eat(/\d/)){aa.eatWhile(/[\w.%]/);return U("number","unit")}else{if(Y==="-"){if(/[\d.]/.test(aa.peek())){aa.eatWhile(/[\w.%]/);return U("number","unit")}else{if(aa.match(/^-[\w\\\-]+/)){aa.eatWhile(/[\w\\\-]/);if(aa.match(/^\s*:/,false)){return U("variable-2","variable-definition")}return U("variable-2","variable")}else{if(aa.match(/^\w+-/)){return U("meta","meta")}}}}else{if(/[,+>*\/]/.test(Y)){return U(null,"select-op")}else{if(Y=="."&&aa.match(/^-?[_a-z][_a-z0-9-]*/i)){return U("qualifier","qualifier")}else{if(/[:;{}\[\]\(\)]/.test(Y)){return U(null,Y)}else{if((Y=="u"&&aa.match(/rl(-prefix)?\(/))||(Y=="d"&&aa.match("omain("))||(Y=="r"&&aa.match("egexp("))){aa.backUp(1);Z.tokenize=V;return U("property","word")}else{if(/[\w\\\-]/.test(Y)){aa.eatWhile(/[\w\\\-]/);return U("property","word")}else{return U(null,null)}}}}}}}}}}}}}function H(X){return function(ab,Z){var aa=false,Y;while((Y=ab.next())!=null){if(Y==X&&!aa){if(X==")"){ab.backUp(1)}break}aa=!aa&&Y=="\\"}if(Y==X||!aa&&X!=")"){Z.tokenize=null}return U("string","string")}}function V(Y,X){Y.next();if(!Y.match(/\s*[\"\')]/,false)){X.tokenize=H(")")}else{X.tokenize=null}return U(null,"(")}function N(Y,X,Z){this.type=Y;this.indent=X;this.prev=Z}function D(Y,Z,X){Y.context=new N(X,Z.indentation()+M,Y.context);return X}function P(X){X.context=X.context.prev;return X.context.type}function x(X,Z,Y){return C[Y.context.type](X,Z,Y)}function Q(Y,aa,Z,ab){for(var X=ab||1;X>0;X--){Z.context=Z.context.prev}return x(Y,aa,Z)}function E(Y){var X=Y.current().toLowerCase();if(O.hasOwnProperty(X)){K="atom"}else{if(L.hasOwnProperty(X)){K="keyword"}else{K="variable"}}}var C={};C.top=function(X,Z,Y){if(X=="{"){return D(Y,Z,"block")}else{if(X=="}"&&Y.context.prev){return P(Y)}else{if(/@(media|supports|(-moz-)?document)/.test(X)){return D(Y,Z,"atBlock")}else{if(/@(font-face|counter-style)/.test(X)){Y.stateArg=X;return"restricted_atBlock_before"}else{if(/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(X)){return"keyframes"}else{if(X&&X.charAt(0)=="@"){return D(Y,Z,"at")}else{if(X=="hash"){K="builtin"}else{if(X=="word"){K="tag"}else{if(X=="variable-definition"){return"maybeprop"}else{if(X=="interpolation"){return D(Y,Z,"interpolation")}else{if(X==":"){return"pseudo"}else{if(J&&X=="("){return D(Y,Z,"parens")}}}}}}}}}}}}return Y.context.type};C.block=function(X,aa,Y){if(X=="word"){var Z=aa.current().toLowerCase();if(F.hasOwnProperty(Z)){K="property";return"maybeprop"}else{if(z.hasOwnProperty(Z)){K="string-2";return"maybeprop"}else{if(J){K=aa.match(/^\s*:(?:\s|$)/,false)?"property":"tag";return"block"}else{K+=" error";return"maybeprop"}}}}else{if(X=="meta"){return"block"}else{if(!J&&(X=="hash"||X=="qualifier")){K="error";return"block"}else{return C.top(X,aa,Y)}}}};C.maybeprop=function(X,Z,Y){if(X==":"){return D(Y,Z,"prop")}return x(X,Z,Y)};C.prop=function(X,Z,Y){if(X==";"){return P(Y)}if(X=="{"&&J){return D(Y,Z,"propBlock")}if(X=="}"||X=="{"){return Q(X,Z,Y)}if(X=="("){return D(Y,Z,"parens")}if(X=="hash"&&!/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(Z.current())){K+=" error"}else{if(X=="word"){E(Z)}else{if(X=="interpolation"){return D(Y,Z,"interpolation")}}}return"prop"};C.propBlock=function(Y,X,Z){if(Y=="}"){return P(Z)}if(Y=="word"){K="property";return"maybeprop"}return Z.context.type};C.parens=function(X,Z,Y){if(X=="{"||X=="}"){return Q(X,Z,Y)}if(X==")"){return P(Y)}if(X=="("){return D(Y,Z,"parens")}if(X=="interpolation"){return D(Y,Z,"interpolation")}if(X=="word"){E(Z)}return"parens"};C.pseudo=function(X,Z,Y){if(X=="word"){K="variable-3";return Y.context.type}return x(X,Z,Y)};C.atBlock=function(X,aa,Y){if(X=="("){return D(Y,aa,"atBlock_parens")}if(X=="}"){return Q(X,aa,Y)}if(X=="{"){return P(Y)&&D(Y,aa,J?"block":"top")}if(X=="word"){var Z=aa.current().toLowerCase();if(Z=="only"||Z=="not"||Z=="and"||Z=="or"){K="keyword"}else{if(w.hasOwnProperty(Z)){K="tag"}else{if(S.hasOwnProperty(Z)){K="attribute"}else{if(I.hasOwnProperty(Z)){K="property"}else{if(F.hasOwnProperty(Z)){K="property"}else{if(z.hasOwnProperty(Z)){K="string-2"}else{if(O.hasOwnProperty(Z)){K="atom"}else{K="error"}}}}}}}}return Y.context.type};C.atBlock_parens=function(X,Z,Y){if(X==")"){return P(Y)}if(X=="{"||X=="}"){return Q(X,Z,Y,2)}return C.atBlock(X,Z,Y)};C.restricted_atBlock_before=function(X,Z,Y){if(X=="{"){return D(Y,Z,"restricted_atBlock")}if(X=="word"&&Y.stateArg=="@counter-style"){K="variable";return"restricted_atBlock_before"}return x(X,Z,Y)};C.restricted_atBlock=function(X,Z,Y){if(X=="}"){Y.stateArg=null;return P(Y)}if(X=="word"){if((Y.stateArg=="@font-face"&&!B.hasOwnProperty(Z.current().toLowerCase()))||(Y.stateArg=="@counter-style"&&!R.hasOwnProperty(Z.current().toLowerCase()))){K="error"}else{K="property"}return"maybeprop"}return"restricted_atBlock"};C.keyframes=function(X,Z,Y){if(X=="word"){K="variable";return"keyframes"}if(X=="{"){return D(Y,Z,"top")}return x(X,Z,Y)};C.at=function(X,Z,Y){if(X==";"){return P(Y)}if(X=="{"||X=="}"){return Q(X,Z,Y)}if(X=="word"){K="tag"}else{if(X=="hash"){K="builtin"}}return"at"};C.interpolation=function(X,Z,Y){if(X=="}"){return P(Y)}if(X=="{"||X==";"){return Q(X,Z,Y)}if(X=="word"){K="variable"}else{if(X!="variable"&&X!="("&&X!=")"){K="error"}}return"interpolation"};return{startState:function(X){return{tokenize:null,state:"top",stateArg:null,context:new N("top",X||0,null)}},token:function(Z,Y){if(!Y.tokenize&&Z.eatSpace()){return null}var X=(Y.tokenize||W)(Z,Y);if(X&&typeof X=="object"){A=X[1];X=X[0]}K=X;Y.state=C[Y.state](A,Z,Y);return K},indent:function(ab,Z){var Y=ab.context,aa=Z&&Z.charAt(0);var X=Y.indent;if(Y.type=="prop"&&(aa=="}"||aa==")")){Y=Y.prev}if(Y.prev&&(aa=="}"&&(Y.type=="block"||Y.type=="top"||Y.type=="interpolation"||Y.type=="restricted_atBlock")||aa==")"&&(Y.type=="parens"||Y.type=="atBlock_parens")||aa=="{"&&(Y.type=="at"||Y.type=="atBlock"))){X=Y.indent-M;Y=Y.prev}return X},electricChars:"}",blockCommentStart:"/*",blockCommentEnd:"*/",fold:"brace"}});function g(y){var x={};for(var w=0;w<y.length;++w){x[y[w]]=true}return x}var k=["domain","regexp","url","url-prefix"],a=g(k);var b=["all","aural","braille","handheld","print","projection","screen","tty","tv","embossed"],t=g(b);var v=["width","min-width","max-width","height","min-height","max-height","device-width","min-device-width","max-device-width","device-height","min-device-height","max-device-height","aspect-ratio","min-aspect-ratio","max-aspect-ratio","device-aspect-ratio","min-device-aspect-ratio","max-device-aspect-ratio","color","min-color","max-color","color-index","min-color-index","max-color-index","monochrome","min-monochrome","max-monochrome","resolution","min-resolution","max-resolution","scan","grid"],i=g(v);var d=["align-content","align-items","align-self","alignment-adjust","alignment-baseline","anchor-point","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","azimuth","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","binding","bleed","bookmark-label","bookmark-level","bookmark-state","bookmark-target","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","color","color-profile","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","crop","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","drop-initial-after-adjust","drop-initial-after-align","drop-initial-before-adjust","drop-initial-before-align","drop-initial-size","drop-initial-value","elevation","empty-cells","fit","fit-position","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","float-offset","flow-from","flow-into","font","font-feature-settings","font-family","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-synthesis","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-weight","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-position","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","inline-box-align","justify-content","left","letter-spacing","line-break","line-height","line-stacking","line-stacking-ruby","line-stacking-shift","line-stacking-strategy","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marker-offset","marks","marquee-direction","marquee-loop","marquee-play-count","marquee-speed","marquee-style","max-height","max-width","min-height","min-width","move-to","nav-down","nav-index","nav-left","nav-right","nav-up","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-style","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","page-policy","pause","pause-after","pause-before","perspective","perspective-origin","pitch","pitch-range","play-during","position","presentation-level","punctuation-trim","quotes","region-break-after","region-break-before","region-break-inside","region-fragment","rendering-intent","resize","rest","rest-after","rest-before","richness","right","rotation","rotation-point","ruby-align","ruby-overhang","ruby-position","ruby-span","shape-image-threshold","shape-inside","shape-margin","shape-outside","size","speak","speak-as","speak-header","speak-numeral","speak-punctuation","speech-rate","stress","string-set","tab-size","table-layout","target","target-name","target-new","target-position","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-height","text-indent","text-justify","text-outline","text-overflow","text-shadow","text-size-adjust","text-space-collapse","text-transform","text-underline-position","text-wrap","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","volume","white-space","widows","width","word-break","word-spacing","word-wrap","z-index","clip-path","clip-rule","mask","enable-background","filter","flood-color","flood-opacity","lighting-color","stop-color","stop-opacity","pointer-events","color-interpolation","color-interpolation-filters","color-rendering","fill","fill-opacity","fill-rule","image-rendering","marker","marker-end","marker-mid","marker-start","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-rendering","baseline-shift","dominant-baseline","glyph-orientation-horizontal","glyph-orientation-vertical","text-anchor","writing-mode"],h=g(d);var m=["scrollbar-arrow-color","scrollbar-base-color","scrollbar-dark-shadow-color","scrollbar-face-color","scrollbar-highlight-color","scrollbar-shadow-color","scrollbar-3d-light-color","scrollbar-track-color","shape-inside","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","zoom"],e=g(m);var r=["font-family","src","unicode-range","font-variant","font-feature-settings","font-stretch","font-weight","font-style"],f=g(r);var o=["additive-symbols","fallback","negative","pad","prefix","range","speak-as","suffix","symbols","system"],s=g(o);var c=["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"],l=g(c);var j=["above","absolute","activeborder","additive","activecaption","afar","after-white-space","ahead","alias","all","all-scroll","alphabetic","alternate","always","amharic","amharic-abegede","antialiased","appworkspace","arabic-indic","armenian","asterisks","attr","auto","avoid","avoid-column","avoid-page","avoid-region","background","backwards","baseline","below","bidi-override","binary","bengali","blink","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","bullets","button","button-bevel","buttonface","buttonhighlight","buttonshadow","buttontext","calc","cambodian","capitalize","caps-lock-indicator","caption","captiontext","caret","cell","center","checkbox","circle","cjk-decimal","cjk-earthly-branch","cjk-heavenly-stem","cjk-ideographic","clear","clip","close-quote","col-resize","collapse","column","compact","condensed","contain","content","content-box","context-menu","continuous","copy","counter","counters","cover","crop","cross","crosshair","currentcolor","cursive","cyclic","dashed","decimal","decimal-leading-zero","default","default-button","destination-atop","destination-in","destination-out","destination-over","devanagari","disc","discard","disclosure-closed","disclosure-open","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic","ethiopic-abegede","ethiopic-abegede-am-et","ethiopic-abegede-gez","ethiopic-abegede-ti-er","ethiopic-abegede-ti-et","ethiopic-halehame-aa-er","ethiopic-halehame-aa-et","ethiopic-halehame-am-et","ethiopic-halehame-gez","ethiopic-halehame-om-et","ethiopic-halehame-sid-et","ethiopic-halehame-so-et","ethiopic-halehame-ti-er","ethiopic-halehame-ti-et","ethiopic-halehame-tig","ethiopic-numeric","ew-resize","expanded","extends","extra-condensed","extra-expanded","fantasy","fast","fill","fixed","flat","flex","footnotes","forwards","from","geometricPrecision","georgian","graytext","groove","gujarati","gurmukhi","hand","hangul","hangul-consonant","hebrew","help","hidden","hide","higher","highlight","highlighttext","hiragana","hiragana-iroha","horizontal","hsl","hsla","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-flex","inline-table","inset","inside","intrinsic","invert","italic","japanese-formal","japanese-informal","justify","kannada","katakana","katakana-iroha","keep-all","khmer","korean-hangul-formal","korean-hanja-formal","korean-hanja-informal","landscape","lao","large","larger","left","level","lighter","line-through","linear","linear-gradient","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-alpha","lower-armenian","lower-greek","lower-hexadecimal","lower-latin","lower-norwegian","lower-roman","lowercase","ltr","malayalam","match","matrix","matrix3d","media-controls-background","media-current-time-display","media-fullscreen-button","media-mute-button","media-play-button","media-return-to-realtime-button","media-rewind-button","media-seek-back-button","media-seek-forward-button","media-slider","media-sliderthumb","media-time-remaining-display","media-volume-slider","media-volume-slider-container","media-volume-sliderthumb","medium","menu","menulist","menulist-button","menulist-text","menulist-textfield","menutext","message-box","middle","min-intrinsic","mix","mongolian","monospace","move","multiple","myanmar","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","numbers","numeric","nw-resize","nwse-resize","oblique","octal","open-quote","optimizeLegibility","optimizeSpeed","oriya","oromo","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","persian","perspective","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radial-gradient","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeating-linear-gradient","repeating-radial-gradient","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","rotate","rotate3d","rotateX","rotateY","rotateZ","round","row-resize","rtl","run-in","running","s-resize","sans-serif","scale","scale3d","scaleX","scaleY","scaleZ","scroll","scrollbar","se-resize","searchfield","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","semi-condensed","semi-expanded","separate","serif","show","sidama","simp-chinese-formal","simp-chinese-informal","single","skew","skewX","skewY","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small","small-caps","small-caption","smaller","solid","somali","source-atop","source-in","source-out","source-over","space","spell-out","square","square-button","start","static","status-bar","stretch","stroke","sub","subpixel-antialiased","super","sw-resize","symbolic","symbols","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","tamil","telugu","text","text-bottom","text-top","textarea","textfield","thai","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","tibetan","tigre","tigrinya-er","tigrinya-er-abegede","tigrinya-et","tigrinya-et-abegede","to","top","trad-chinese-formal","trad-chinese-informal","translate","translate3d","translateX","translateY","translateZ","transparent","ultra-condensed","ultra-expanded","underline","up","upper-alpha","upper-armenian","upper-greek","upper-hexadecimal","upper-latin","upper-norwegian","upper-roman","uppercase","urdu","url","var","vertical","vertical-text","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","words","x-large","x-small","xor","xx-large","xx-small"],q=g(j);var n=k.concat(b).concat(v).concat(d).concat(m).concat(c).concat(j);p.registerHelper("hintWords","css",n);function u(z,y){var w=false,x;while((x=z.next())!=null){if(w&&x=="/"){y.tokenize=null;break}w=(x=="*")}return["comment","comment"]}p.defineMIME("text/css",{documentTypes:a,mediaTypes:t,mediaFeatures:i,propertyKeywords:h,nonStandardPropertyKeywords:e,fontProperties:f,counterDescriptors:s,colorKeywords:l,valueKeywords:q,tokenHooks:{"/":function(x,w){if(!x.eat("*")){return false}w.tokenize=u;return u(x,w)}},name:"css"});p.defineMIME("text/x-scss",{mediaTypes:t,mediaFeatures:i,propertyKeywords:h,nonStandardPropertyKeywords:e,colorKeywords:l,valueKeywords:q,fontProperties:f,allowNested:true,tokenHooks:{"/":function(x,w){if(x.eat("/")){x.skipToEnd();return["comment","comment"]}else{if(x.eat("*")){w.tokenize=u;return u(x,w)}else{return["operator","operator"]}}},":":function(w){if(w.match(/\s*\{/)){return[null,"{"]}return false},"$":function(w){w.match(/^[\w-]+/);if(w.match(/^\s*:/,false)){return["variable-2","variable-definition"]}return["variable-2","variable"]},"#":function(w){if(!w.eat("{")){return false}return[null,"interpolation"]}},name:"css",helperType:"scss"});p.defineMIME("text/x-less",{mediaTypes:t,mediaFeatures:i,propertyKeywords:h,nonStandardPropertyKeywords:e,colorKeywords:l,valueKeywords:q,fontProperties:f,allowNested:true,tokenHooks:{"/":function(x,w){if(x.eat("/")){x.skipToEnd();return["comment","comment"]}else{if(x.eat("*")){w.tokenize=u;return u(x,w)}else{return["operator","operator"]}}},"@":function(w){if(w.eat("{")){return[null,"interpolation"]}if(w.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/,false)){return false}w.eatWhile(/[\w\\\-]/);if(w.match(/^\s*:/,false)){return["variable-2","variable-definition"]}return["variable-2","variable"]},"&":function(){return["atom","atom"]}},name:"css",helperType:"less"})});(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"),require("../xml/xml"),require("../javascript/javascript"),require("../css/css"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror","../xml/xml","../javascript/javascript","../css/css"],a)}else{a(CodeMirror)}}})(function(a){a.defineMode("htmlmixed",function(c,d){var b=a.getMode(c,{name:"xml",htmlMode:true,multilineTagIndentFactor:d.multilineTagIndentFactor,multilineTagIndentPastTag:d.multilineTagIndentPastTag});var n=a.getMode(c,"css");var l=[],k=d&&d.scriptTypes;l.push({matches:/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^$/i,mode:a.getMode(c,"javascript")});if(k){for(var e=0;e<k.length;++e){var j=k[e];l.push({matches:j.matches,mode:j.mode&&a.getMode(c,j.mode)})}}l.push({matches:/./,mode:a.getMode(c,"text/plain")});function f(t,r){var p=r.htmlState.tagName;if(p){p=p.toLowerCase()}var q=b.token(t,r.htmlState);if(p=="script"&&/\btag\b/.test(q)&&t.current()==">"){var u=t.string.slice(Math.max(0,t.pos-100),t.pos).match(/\btype\s*=\s*("[^"]+"|'[^']+'|\S+)[^<]*$/i);u=u?u[1]:"";if(u&&/[\"\']/.test(u.charAt(0))){u=u.slice(1,u.length-1)}for(var o=0;o<l.length;++o){var s=l[o];if(typeof s.matches=="string"?u==s.matches:s.matches.test(u)){if(s.mode){r.token=m;r.localMode=s.mode;r.localState=s.mode.startState&&s.mode.startState(b.indent(r.htmlState,""))}break}}}else{if(p=="style"&&/\btag\b/.test(q)&&t.current()==">"){r.token=g;r.localMode=n;r.localState=n.startState(b.indent(r.htmlState,""))}}return q}function h(r,i,o){var q=r.current();var p=q.search(i);if(p>-1){r.backUp(q.length-p)}else{if(q.match(/<\/?$/)){r.backUp(q.length);if(!r.match(i,false)){r.match(q)}}}return o}function m(o,i){if(o.match(/^<\/\s*script\s*>/i,false)){i.token=f;i.localState=i.localMode=null;return null}return h(o,/<\/\s*script\s*>/,i.localMode.token(o,i.localState))}function g(o,i){if(o.match(/^<\/\s*style\s*>/i,false)){i.token=f;i.localState=i.localMode=null;return null}return h(o,/<\/\s*style\s*>/,n.token(o,i.localState))}return{startState:function(){var i=b.startState();return{token:f,localMode:null,localState:null,htmlState:i}},copyState:function(o){if(o.localState){var i=a.copyState(o.localMode,o.localState)}return{token:o.token,localMode:o.localMode,localState:i,htmlState:a.copyState(b,o.htmlState)}},token:function(o,i){return i.token(o,i)},indent:function(o,i){if(!o.localMode||/^\s*<\//.test(i)){return b.indent(o.htmlState,i)}else{if(o.localMode.indent){return o.localMode.indent(o.localState,i)}else{return a.Pass}}},innerMode:function(i){return{state:i.localState||i.htmlState,mode:i.localMode||b}}}},"xml","javascript","css");a.defineMIME("text/html","htmlmixed")});(function(a){if(typeof exports=="object"&&typeof module=="object"){a(require("../../lib/codemirror"),require("../htmlmixed/htmlmixed"),require("../../addon/mode/multiplex"))}else{if(typeof define=="function"&&define.amd){define(["../../lib/codemirror","../htmlmixed/htmlmixed","../../addon/mode/multiplex"],a)}else{a(CodeMirror)}}})(function(a){a.defineMode("htmlembedded",function(b,c){return a.multiplexingMode(a.getMode(b,"htmlmixed"),{open:c.open||c.scriptStartRegex||"<%",close:c.close||c.scriptEndRegex||"%>",mode:a.getMode(b,c.scriptingModeSpec)})},"htmlmixed");a.defineMIME("application/x-ejs",{name:"htmlembedded",scriptingModeSpec:"javascript"});a.defineMIME("application/x-aspx",{name:"htmlembedded",scriptingModeSpec:"text/x-csharp"});a.defineMIME("application/x-jsp",{name:"htmlembedded",scriptingModeSpec:"text/x-java"});a.defineMIME("application/x-erb",{name:"htmlembedded",scriptingModeSpec:"ruby"})});
extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/js/codemirror.mode.b000060400000003652152453623450033701 0ustar00components/com_acymailingCodeMirror.defineMode("bbcode",function(b){var e,a,g;e={bbCodeTags:"b i u s img quote code list table  tr td size color url",bbCodeUnaryTags:"* :-) hr cut"};if(b.hasOwnProperty("bbCodeTags")){e.bbCodeTags=b.bbCodeTags}if(b.hasOwnProperty("bbCodeUnaryTags")){e.bbCodeUnaryTags=b.bbCodeUnaryTags}var f={cont:function(i,h){g=h;return i},escapeRegEx:function(h){return h.replace(/([\:\-\)\(\*\+\?\[\]])/g,"\\$1")}};var d={validIdentifier:/[a-zA-Z0-9_]/,stringChar:/['"]/,tags:new RegExp("(?:"+f.escapeRegEx(e.bbCodeTags).split(" ").join("|")+")"),unaryTags:new RegExp("(?:"+f.escapeRegEx(e.bbCodeUnaryTags).split(" ").join("|")+")")};var c={tokenizer:function(i,h){if(i.eatSpace()){return null}if(i.match("[",true)){h.tokenize=c.bbcode;return f.cont("tag","startTag")}i.next();return null},inAttribute:function(h){return function(k,i){var l=null;var j=null;while(!k.eol()){j=k.peek();if(k.next()==h&&l!=="\\"){i.tokenize=c.bbcode;break}l=j}return"string"}},bbcode:function(k,i){if(a=k.match("]",true)){i.tokenize=c.tokenizer;return f.cont("tag",null)}if(k.match("[",true)){return f.cont("tag","startTag")}var h=k.next();if(d.stringChar.test(h)){i.tokenize=c.inAttribute(h);return f.cont("string","string")}else{if(/\d/.test(h)){k.eatWhile(/\d/);return f.cont("number","number")}else{if(i.last=="whitespace"){k.eatWhile(d.validIdentifier);return f.cont("attribute","modifier")}if(i.last=="property"){k.eatWhile(d.validIdentifier);return f.cont("property",null)}else{if(/\s/.test(h)){g="whitespace";return null}}var j="";if(h!="/"){j+=h}var l=null;while(l=k.eat(d.validIdentifier)){j+=l}if(d.unaryTags.test(j)){return f.cont("atom","atom")}if(d.tags.test(j)){return f.cont("keyword","keyword")}if(/\s/.test(h)){return null}return f.cont("tag","tag")}}}};return{startState:function(){return{tokenize:c.tokenizer,mode:"bbcode",last:null}},token:function(j,i){var h=i.tokenize(j,i);i.last=g;return h},electricChars:""}});CodeMirror.defineMIME("text/x-bbcode","bbcode");
extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/js/beautify.min.js000060400000111114152453623450033367 0ustar00components/com_acymailing(function(){function n(n,t){for(var i=0;i<t.length;i+=1)if(t[i]===n)return!0;return!1}function f(n){return n.replace(/^\s+|\s+$/g,"")}function r(n,t){"use strict";var i=new e(n,t);return i.beautify()}function e(i,r){"use strict";function yt(n,t){var i=0;return n&&(i=n.indentation_level,!l.just_added_newline()&&n.line_indent_level>i&&(i=n.line_indent_level)),{mode:t,parent:n,last_text:n?n.last_text:"",last_word:n?n.last_word:"",declaration_statement:!1,declaration_assignment:!1,multiline_frame:!1,if_block:!1,else_block:!1,do_block:!1,do_while:!1,in_case_statement:!1,in_case:!1,case_body:!1,indentation_level:i,line_indent_level:n?n.line_indent_level:i,start_line_index:l.get_line_number(),ternary_depth:0}}function pt(n){var i=n.newlines,r=c.keep_array_indentation&&d(u.mode),t;if(r)for(t=0;t<i;t+=1)a(t>0);else if(c.max_preserve_newlines&&i>c.max_preserve_newlines&&(i=c.max_preserve_newlines),c.preserve_newlines&&n.newlines>1)for(a(),t=1;t<i;t+=1)a(!0);e=n;at[e.type]()}function bt(n){n=n.replace(/\x0d/g,"");for(var i=[],t=n.indexOf("\n");t!==-1;)i.push(n.substring(0,t)),n=n.substring(t+1),t=n.indexOf("\n");return n.length&&i.push(n),i}function k(n){if(n=n===undefined?!1:n,!l.just_added_newline())if(c.preserve_newlines&&e.wanted_newline||n)a(!1,!0);else if(c.wrap_line_length){var t=l.current_line.get_character_count()+e.text.length+(l.space_before_token?1:0);t>=c.wrap_line_length&&a(!1,!0)}}function a(n,i){if(!i&&u.last_text!==";"&&u.last_text!==","&&u.last_text!=="="&&o!=="TK_OPERATOR")while(u.mode===t.Statement&&!u.if_block&&!u.do_block)b();l.add_new_line(n)&&(u.multiline_frame=!0)}function kt(){if(l.just_added_newline())if(c.keep_array_indentation&&d(u.mode)&&e.wanted_newline){l.current_line.push("");for(var n=0;n<e.whitespace_before.length;n+=1)l.current_line.push(e.whitespace_before[n]);l.space_before_token=!1}else l.add_indent_string(u.indentation_level)&&(u.line_indent_level=u.indentation_level)}function v(n){n=n||e.text;kt();l.add_token(n)}function rt(){u.indentation_level+=1}function dt(){u.indentation_level>0&&(!u.parent||u.indentation_level>u.parent.indentation_level)&&(u.indentation_level-=1)}function nt(n){u?(et.push(u),p=u):p=yt(null,n);u=yt(p,n)}function d(n){return n===t.ArrayLiteral}function ut(i){return n(i,[t.Expression,t.ForInitializer,t.Conditional])}function b(){et.length>0&&(p=u,u=et.pop(),p.mode===t.Statement&&l.remove_redundant_indentation(p))}function ot(){return u.parent.mode===t.ObjectLiteral&&u.mode===t.Statement&&(u.last_text===":"&&u.ternary_depth===0||o==="TK_RESERVED"&&n(u.last_text,["get","set"]))}function tt(){return o==="TK_RESERVED"&&n(u.last_text,["var","let","const"])&&e.type==="TK_WORD"||o==="TK_RESERVED"&&u.last_text==="do"||o==="TK_RESERVED"&&u.last_text==="return"&&!e.wanted_newline||o==="TK_RESERVED"&&u.last_text==="else"&&!(e.type==="TK_RESERVED"&&e.text==="if")||o==="TK_END_EXPR"&&(p.mode===t.ForInitializer||p.mode===t.Conditional)||o==="TK_WORD"&&u.mode===t.BlockStatement&&!u.in_case&&!(e.text==="--"||e.text==="++")&&e.type!=="TK_WORD"&&e.type!=="TK_RESERVED"||u.mode===t.ObjectLiteral&&(u.last_text===":"&&u.ternary_depth===0||o==="TK_RESERVED"&&n(u.last_text,["get","set"]))?(nt(t.Statement),rt(),o==="TK_RESERVED"&&n(u.last_text,["var","let","const"])&&e.type==="TK_WORD"&&(u.declaration_statement=!0),ot()||k(e.type==="TK_RESERVED"&&n(e.text,["do","for","if","while"])),!0):!1}function gt(n,t){for(var r,i=0;i<n.length;i++)if(r=f(n[i]),r.charAt(0)!==t)return!1;return!0}function ni(n,t){for(var i=0,u=n.length,r;i<u;i++)if(r=n[i],r&&r.indexOf(t)!==0)return!1;return!0}function st(t){return n(t,["case","return","do","if","throw","else"])}function ht(n){var t=lt+(n||0);return t<0||t>=ct.length?null:ct[t]}function ti(){tt();var i=t.Expression;if(e.text==="["){if(o==="TK_WORD"||u.last_text===")"){o==="TK_RESERVED"&&n(u.last_text,g.line_starters)&&(l.space_before_token=!0);nt(i);v();rt();c.space_in_paren&&(l.space_before_token=!0);return}i=t.ArrayLiteral;d(u.mode)&&(u.last_text==="["||u.last_text===","&&(w==="]"||w==="}"))&&(c.keep_array_indentation||a())}else o==="TK_RESERVED"&&u.last_text==="for"?i=t.ForInitializer:o==="TK_RESERVED"&&n(u.last_text,["if","while"])&&(i=t.Conditional);u.last_text===";"||o==="TK_START_BLOCK"?a():o==="TK_END_EXPR"||o==="TK_START_EXPR"||o==="TK_END_BLOCK"||u.last_text==="."?k(e.wanted_newline):o==="TK_RESERVED"&&e.text==="("||o==="TK_WORD"||o==="TK_OPERATOR"?o==="TK_RESERVED"&&(u.last_word==="function"||u.last_word==="typeof")||u.last_text==="*"&&w==="function"?c.space_after_anon_function&&(l.space_before_token=!0):o==="TK_RESERVED"&&(n(u.last_text,g.line_starters)||u.last_text==="catch")&&c.space_before_conditional&&(l.space_before_token=!0):l.space_before_token=!0;e.text==="("&&(o==="TK_EQUALS"||o==="TK_OPERATOR")&&(ot()||k());nt(i);v();c.space_in_paren&&(l.space_before_token=!0);rt()}function ii(){while(u.mode===t.Statement)b();u.multiline_frame&&k(e.text==="]"&&d(u.mode)&&!c.keep_array_indentation);c.space_in_paren&&(o!=="TK_START_EXPR"||c.space_in_empty_paren?l.space_before_token=!0:(l.trim(),l.space_before_token=!1));e.text==="]"&&c.keep_array_indentation?(v(),b()):(b(),v());l.remove_redundant_indentation(p);u.do_while&&p.mode===t.Conditional&&(p.mode=t.Expression,u.do_block=!1,u.do_while=!1)}function ri(){var i=ht(1),r=ht(2),f,e;r&&(r.text===":"&&n(i.type,["TK_STRING","TK_WORD","TK_RESERVED"])||n(i.text,["get","set"])&&n(r.type,["TK_WORD","TK_RESERVED"]))?n(w,["class","interface"])?nt(t.BlockStatement):nt(t.ObjectLiteral):nt(t.BlockStatement);f=!i.comments_before.length&&i.text==="}";e=f&&u.last_word==="function"&&o==="TK_END_EXPR";c.brace_style==="expand"?o!=="TK_OPERATOR"&&(e||o==="TK_EQUALS"||o==="TK_RESERVED"&&st(u.last_text)&&u.last_text!=="else")?l.space_before_token=!0:a(!1,!0):o!=="TK_OPERATOR"&&o!=="TK_START_EXPR"?o==="TK_START_BLOCK"?a():l.space_before_token=!0:d(p.mode)&&u.last_text===","&&(w==="}"?l.space_before_token=!0:a());v();rt()}function ui(){while(u.mode===t.Statement)b();var n=o==="TK_START_BLOCK";c.brace_style==="expand"?n||a():n||(d(u.mode)&&c.keep_array_indentation?(c.keep_array_indentation=!1,a(),c.keep_array_indentation=!0):a());b();v()}function wt(){var i,r;if(e.type==="TK_RESERVED"&&u.mode!==t.ObjectLiteral&&n(e.text,["set","get"])&&(e.type="TK_WORD"),e.type==="TK_RESERVED"&&u.mode===t.ObjectLiteral&&(i=ht(1),i.text==":"&&(e.type="TK_WORD")),tt()||!e.wanted_newline||ut(u.mode)||o==="TK_OPERATOR"&&u.last_text!=="--"&&u.last_text!=="++"||o==="TK_EQUALS"||!c.preserve_newlines&&o==="TK_RESERVED"&&n(u.last_text,["var","let","const","set","get"])||a(),u.do_block&&!u.do_while){if(e.type==="TK_RESERVED"&&e.text==="while"){l.space_before_token=!0;v();l.space_before_token=!0;u.do_while=!0;return}a();u.do_block=!1}if(u.if_block)if(u.else_block||e.type!=="TK_RESERVED"||e.text!=="else"){while(u.mode===t.Statement)b();u.if_block=!1;u.else_block=!1}else u.else_block=!0;if(e.type==="TK_RESERVED"&&(e.text==="case"||e.text==="default"&&u.in_case_statement)){a();(u.case_body||c.jslint_happy)&&(dt(),u.case_body=!1);v();u.in_case=!0;u.in_case_statement=!0;return}if(e.type==="TK_RESERVED"&&e.text==="function"&&((n(u.last_text,["}",";"])||l.just_added_newline()&&!n(u.last_text,["[","{",":","=",","]))&&(l.just_added_blankline()||e.comments_before.length||(a(),a(!0))),o==="TK_RESERVED"||o==="TK_WORD"?o==="TK_RESERVED"&&n(u.last_text,["get","set","new","return","export"])?l.space_before_token=!0:o==="TK_RESERVED"&&u.last_text==="default"&&w==="export"?l.space_before_token=!0:a():o==="TK_OPERATOR"||u.last_text==="="?l.space_before_token=!0:!u.multiline_frame&&(ut(u.mode)||d(u.mode))||a()),(o==="TK_COMMA"||o==="TK_START_EXPR"||o==="TK_EQUALS"||o==="TK_OPERATOR")&&(ot()||k()),e.type==="TK_RESERVED"&&n(e.text,["function","get","set"])){v();u.last_word=e.text;return}y="NONE";o==="TK_END_BLOCK"?e.type==="TK_RESERVED"&&n(e.text,["else","catch","finally"])?c.brace_style==="expand"||c.brace_style==="end-expand"?y="NEWLINE":(y="SPACE",l.space_before_token=!0):y="NEWLINE":o==="TK_SEMICOLON"&&u.mode===t.BlockStatement?y="NEWLINE":o==="TK_SEMICOLON"&&ut(u.mode)?y="SPACE":o==="TK_STRING"?y="NEWLINE":o==="TK_RESERVED"||o==="TK_WORD"||u.last_text==="*"&&w==="function"?y="SPACE":o==="TK_START_BLOCK"?y="NEWLINE":o==="TK_END_EXPR"&&(l.space_before_token=!0,y="NEWLINE");e.type==="TK_RESERVED"&&n(e.text,g.line_starters)&&u.last_text!==")"&&(y=u.last_text==="else"||u.last_text==="export"?"SPACE":"NEWLINE");e.type==="TK_RESERVED"&&n(e.text,["else","catch","finally"])?o!=="TK_END_BLOCK"||c.brace_style==="expand"||c.brace_style==="end-expand"?a():(l.trim(!0),r=l.current_line,r.last()!=="}"&&a(),l.space_before_token=!0):y==="NEWLINE"?o==="TK_RESERVED"&&st(u.last_text)?l.space_before_token=!0:o!=="TK_END_EXPR"?o==="TK_START_EXPR"&&e.type==="TK_RESERVED"&&n(e.text,["var","let","const"])||u.last_text===":"||(e.type==="TK_RESERVED"&&e.text==="if"&&u.last_text==="else"?l.space_before_token=!0:a()):e.type==="TK_RESERVED"&&n(e.text,g.line_starters)&&u.last_text!==")"&&a():u.multiline_frame&&d(u.mode)&&u.last_text===","&&w==="}"?a():y==="SPACE"&&(l.space_before_token=!0);v();u.last_word=e.text;e.type==="TK_RESERVED"&&e.text==="do"&&(u.do_block=!0);e.type==="TK_RESERVED"&&e.text==="if"&&(u.if_block=!0)}function fi(){for(tt()&&(l.space_before_token=!1);u.mode===t.Statement&&!u.if_block&&!u.do_block;)b();v()}function ei(){tt()?l.space_before_token=!0:o==="TK_RESERVED"||o==="TK_WORD"?l.space_before_token=!0:o==="TK_COMMA"||o==="TK_START_EXPR"||o==="TK_EQUALS"||o==="TK_OPERATOR"?ot()||k():a();v()}function oi(){tt();u.declaration_statement&&(u.declaration_assignment=!0);l.space_before_token=!0;v();l.space_before_token=!0}function si(){if(u.declaration_statement){ut(u.parent.mode)&&(u.declaration_assignment=!1);v();u.declaration_assignment?(u.declaration_assignment=!1,a(!1,!0)):l.space_before_token=!0;return}v();u.mode===t.ObjectLiteral||u.mode===t.Statement&&u.parent.mode===t.ObjectLiteral?(u.mode===t.Statement&&b(),a()):l.space_before_token=!0}function hi(){if(tt(),o==="TK_RESERVED"&&st(u.last_text)){l.space_before_token=!0;v();return}if(e.text==="*"&&o==="TK_DOT"){v();return}if(e.text===":"&&u.in_case){u.case_body=!0;rt();v();a();u.in_case=!1;return}if(e.text==="::"){v();return}e.wanted_newline&&(e.text==="--"||e.text==="++")&&a(!1,!0);o==="TK_OPERATOR"&&k();var i=!0,r=!0;n(e.text,["--","++","!","~"])||n(e.text,["-","+"])&&(n(o,["TK_START_BLOCK","TK_START_EXPR","TK_EQUALS","TK_OPERATOR"])||n(u.last_text,g.line_starters)||u.last_text===",")?(i=!1,r=!1,u.last_text===";"&&ut(u.mode)&&(i=!0),o==="TK_RESERVED"||o==="TK_END_EXPR"?i=!0:o==="TK_OPERATOR"&&(i=n(e.text,["--","-"])&&n(u.last_text,["--","-"])||n(e.text,["++","+"])&&n(u.last_text,["++","+"])),(u.mode===t.BlockStatement||u.mode===t.Statement)&&(u.last_text==="{"||u.last_text===";")&&a()):e.text===":"?u.ternary_depth===0?i=!1:u.ternary_depth-=1:e.text==="?"?u.ternary_depth+=1:e.text==="*"&&o==="TK_RESERVED"&&u.last_text==="function"&&(i=!1,r=!1);l.space_before_token=l.space_before_token||i;v();l.space_before_token=r}function ci(){var n=bt(e.text),t,i=!1,r=!1,u=e.whitespace_before.join(""),o=u.length;for(a(!1,!0),n.length>1&&(gt(n.slice(1),"*")?i=!0:ni(n.slice(1),u)&&(r=!0)),v(n[0]),t=1;t<n.length;t++)a(!1,!0),i?v(" "+f(n[t])):r&&n[t].length>o?v(n[t].substring(o)):l.add_token(n[t]);a(!1,!0)}function li(){l.space_before_token=!0;v();l.space_before_token=!0}function ai(){e.wanted_newline?a(!1,!0):l.trim(!0);l.space_before_token=!0;v();a(!1,!0)}function vi(){tt();o==="TK_RESERVED"&&st(u.last_text)?l.space_before_token=!0:k(u.last_text===")"&&c.break_chained_methods);v()}function yi(){v();e.text[e.text.length-1]==="\n"&&a()}function pi(){while(u.mode===t.Statement)b()}var l,ct=[],lt,g,e,o,w,ft,u,p,et,y,at,c,vt="",it;for(at={TK_START_EXPR:ti,TK_END_EXPR:ii,TK_START_BLOCK:ri,TK_END_BLOCK:ui,TK_WORD:wt,TK_RESERVED:wt,TK_SEMICOLON:fi,TK_STRING:ei,TK_EQUALS:oi,TK_OPERATOR:hi,TK_COMMA:si,TK_BLOCK_COMMENT:ci,TK_INLINE_COMMENT:li,TK_COMMENT:ai,TK_DOT:vi,TK_UNKNOWN:yi,TK_EOF:pi},r=r?r:{},c={},r.braces_on_own_line!==undefined&&(c.brace_style=r.braces_on_own_line?"expand":"collapse"),c.brace_style=r.brace_style?r.brace_style:c.brace_style?c.brace_style:"collapse",c.brace_style==="expand-strict"&&(c.brace_style="expand"),c.indent_size=r.indent_size?parseInt(r.indent_size,10):4,c.indent_char=r.indent_char?r.indent_char:" ",c.preserve_newlines=r.preserve_newlines===undefined?!0:r.preserve_newlines,c.break_chained_methods=r.break_chained_methods===undefined?!1:r.break_chained_methods,c.max_preserve_newlines=r.max_preserve_newlines===undefined?0:parseInt(r.max_preserve_newlines,10),c.space_in_paren=r.space_in_paren===undefined?!1:r.space_in_paren,c.space_in_empty_paren=r.space_in_empty_paren===undefined?!1:r.space_in_empty_paren,c.jslint_happy=r.jslint_happy===undefined?!1:r.jslint_happy,c.space_after_anon_function=r.space_after_anon_function===undefined?!1:r.space_after_anon_function,c.keep_array_indentation=r.keep_array_indentation===undefined?!1:r.keep_array_indentation,c.space_before_conditional=r.space_before_conditional===undefined?!0:r.space_before_conditional,c.unescape_strings=r.unescape_strings===undefined?!1:r.unescape_strings,c.wrap_line_length=r.wrap_line_length===undefined?0:parseInt(r.wrap_line_length,10),c.e4x=r.e4x===undefined?!1:r.e4x,c.end_with_newline=r.end_with_newline===undefined?!1:r.end_with_newline,c.jslint_happy&&(c.space_after_anon_function=!0),r.indent_with_tabs&&(c.indent_char="\t",c.indent_size=1),ft="";c.indent_size>0;)ft+=c.indent_char,c.indent_size-=1;if(it=0,i&&i.length){while(i.charAt(it)===" "||i.charAt(it)==="\t")vt+=i.charAt(it),it+=1;i=i.substring(it)}o="TK_START_BLOCK";w="";l=new s(ft,vt);et=[];nt(t.BlockStatement);this.beautify=function(){var n,r,t;for(g=new h(i,c,ft),ct=g.tokenize(),lt=0;n=ht();){for(t=0;t<n.comments_before.length;t++)pt(n.comments_before[t]);pt(n);w=u.last_text;o=n.type;u.last_text=n.text;lt+=1}return r=l.get_code(),c.end_with_newline&&(r+="\n"),r}}function o(){var t=0,n=[];this.get_character_count=function(){return t};this.get_item_count=function(){return n.length};this.get_output=function(){return n.join("")};this.last=function(){return n.length?n[n.length-1]:null};this.push=function(i){n.push(i);t+=i.length};this.remove_indent=function(i,r){var u=0;n.length!==0&&(r&&n[0]===r&&(u=1),n[u]===i&&(t-=n[u].length,n.splice(u,1)))};this.trim=function(i,r){while(this.get_item_count()&&(this.last()===" "||this.last()===i||this.last()===r)){var u=n.pop();t-=u.length}}}function s(n,i){var r=[];this.baseIndentString=i;this.current_line=null;this.space_before_token=!1;this.get_line_number=function(){return r.length};this.add_new_line=function(n){return this.get_line_number()===1&&this.just_added_newline()?!1:n||!this.just_added_newline()?(this.current_line=new o,r.push(this.current_line),!0):!1};this.add_new_line(!0);this.get_code=function(){for(var t=r[0].get_output(),n=1;n<r.length;n++)t+="\n"+r[n].get_output();return t.replace(/[\r\n\t ]+$/,"")};this.add_indent_string=function(t){if(i&&this.current_line.push(i),r.length>1){for(var u=0;u<t;u+=1)this.current_line.push(n);return!0}return!1};this.add_token=function(n){this.add_space_before_token();this.current_line.push(n)};this.add_space_before_token=function(){if(this.space_before_token&&this.current_line.get_item_count()){var t=this.current_line.last();t!==" "&&t!==n&&t!==i&&this.current_line.push(" ")}this.space_before_token=!1};this.remove_redundant_indentation=function(u){if(!u.multiline_frame&&u.mode!==t.ForInitializer&&u.mode!==t.Conditional)for(var f=u.start_line_index,e=r.length;f<e;)r[f].remove_indent(n,i),f++};this.trim=function(t){for(t=t===undefined?!1:t,this.current_line.trim(n,i);t&&r.length>1&&this.current_line.get_item_count()===0;)r.pop(),this.current_line=r[r.length-1],this.current_line.trim(n,i)};this.just_added_newline=function(){return this.current_line.get_item_count()===0};this.just_added_blankline=function(){if(this.just_added_newline()){if(r.length===1)return!0;var n=r[r.length-2];return n.get_item_count()===0}return!1}}function h(t,r,e){function w(){var nt,d,w,rt,ct,et,pt,st,lt,ut;if(c=0,l=[],o>=s)return["","TK_EOF"];for(d=h.length?h[h.length-1]:new u("TK_START_BLOCK","{"),w=t.charAt(o),o+=1;n(w,b);){if(w==="\n"?(c+=1,l=[]):c&&(w===e?l.push(e):w!=="\r"&&l.push(" ")),o>=s)return["","TK_EOF"];w=t.charAt(o);o+=1}if(v.test(w)){var ft=!0,ht=!0,at=v;for(w==="0"&&o<s&&/[Xx]/.test(t.charAt(o))?(ft=!1,ht=!1,w+=t.charAt(o),o+=1,at=/[0123456789abcdefABCDEF]/):(w="",o-=1);o<s&&at.test(t.charAt(o));)w+=t.charAt(o),o+=1,ft&&o<s&&t.charAt(o)==="."&&(w+=t.charAt(o),o+=1,ft=!1),ht&&o<s&&/[Ee]/.test(t.charAt(o))&&(w+=t.charAt(o),o+=1,o<s&&/[+-]/.test(t.charAt(o))&&(w+=t.charAt(o),o+=1),ht=!1,ft=!1);return[w,"TK_WORD"]}if(i.isIdentifierStart(t.charCodeAt(o-1))){if(o<s)while(i.isIdentifierChar(t.charCodeAt(o)))if(w+=t.charAt(o),o+=1,o===s)break;return!(d.type==="TK_DOT"||d.type==="TK_RESERVED"&&n(d.text,["set","get"]))&&n(w,p)?w==="in"?[w,"TK_OPERATOR"]:[w,"TK_RESERVED"]:[w,"TK_WORD"]}if(w==="("||w==="[")return[w,"TK_START_EXPR"];if(w===")"||w==="]")return[w,"TK_END_EXPR"];if(w==="{")return[w,"TK_START_BLOCK"];if(w==="}")return[w,"TK_END_BLOCK"];if(w===";")return[w,"TK_SEMICOLON"];if(w==="/"){if(rt="",ct=!0,t.charAt(o)==="*"){if(o+=1,o<s)while(o<s&&!(t.charAt(o)==="*"&&t.charAt(o+1)&&t.charAt(o+1)==="/"))if(w=t.charAt(o),rt+=w,(w==="\n"||w==="\r")&&(ct=!1),o+=1,o>=s)break;return o+=2,ct&&c===0?["/*"+rt+"*/","TK_INLINE_COMMENT"]:["/*"+rt+"*/","TK_BLOCK_COMMENT"]}if(t.charAt(o)==="/"){for(rt=w;t.charAt(o)!=="\r"&&t.charAt(o)!=="\n";)if(rt+=t.charAt(o),o+=1,o>=s)break;return[rt,"TK_COMMENT"]}}if(w==="`"||w==="'"||w==='"'||(w==="/"||r.e4x&&w==="<"&&t.slice(o-1).match(/^<([-a-zA-Z:0-9_.]+|{[^{}]*}|!\[CDATA\[[\s\S]*?\]\])\s*([-a-zA-Z:0-9_.]+=('[^']*'|"[^"]*"|{[^{}]*})\s*)*\/?\s*>/))&&(d.type==="TK_RESERVED"&&n(d.text,["return","case","throw","else","do","typeof","yield"])||d.type==="TK_END_EXPR"&&d.text===")"&&d.parent&&d.parent.type==="TK_RESERVED"&&n(d.parent.text,["if","while","for"])||n(d.type,["TK_COMMENT","TK_START_EXPR","TK_START_BLOCK","TK_END_BLOCK","TK_OPERATOR","TK_EQUALS","TK_EOF","TK_SEMICOLON","TK_COMMA"]))){var tt=w,it=!1,vt=!1;if(nt=w,tt==="/")for(et=!1;o<s&&(it||et||t.charAt(o)!==tt)&&!i.newline.test(t.charAt(o));)nt+=t.charAt(o),it?it=!1:(it=t.charAt(o)==="\\",t.charAt(o)==="["?et=!0:t.charAt(o)==="]"&&(et=!1)),o+=1;else if(r.e4x&&tt==="<"){var yt=/<(\/?)([-a-zA-Z:0-9_.]+|{[^{}]*}|!\[CDATA\[[\s\S]*?\]\])\s*([-a-zA-Z:0-9_.]+=('[^']*'|"[^"]*"|{[^{}]*})\s*)*(\/?)\s*>/g,ot=t.slice(o-1),g=yt.exec(ot);if(g&&g.index===0){for(pt=g[2],st=0;g;){var bt=!!g[1],wt=g[2],kt=!!g[g.length-1]||wt.slice(0,8)==="![CDATA[";if(wt!==pt||kt||(bt?--st:++st),st<=0)break;g=yt.exec(ot)}return lt=g?g.index+g[0].length:ot.length,o+=lt-1,[ot.slice(0,lt),"TK_STRING"]}}else while(o<s&&(it||t.charAt(o)!==tt&&(tt==="`"||!i.newline.test(t.charAt(o)))))nt+=t.charAt(o),it?((t.charAt(o)==="x"||t.charAt(o)==="u")&&(vt=!0),it=!1):it=t.charAt(o)==="\\",o+=1;if(vt&&r.unescape_strings&&(nt=k(nt)),o<s&&t.charAt(o)===tt&&(nt+=tt,o+=1,tt==="/"))while(o<s&&i.isIdentifierStart(t.charCodeAt(o)))nt+=t.charAt(o),o+=1;return[nt,"TK_STRING"]}if(w==="#"){if(h.length===0&&t.charAt(o)==="!"){for(nt=w;o<s&&w!=="\n";)w=t.charAt(o),nt+=w,o+=1;return[f(nt)+"\n","TK_UNKNOWN"]}if(ut="#",o<s&&v.test(t.charAt(o))){do w=t.charAt(o),ut+=w,o+=1;while(o<s&&w!=="#"&&w!=="=");return w==="#"||(t.charAt(o)==="["&&t.charAt(o+1)==="]"?(ut+="[]",o+=2):t.charAt(o)==="{"&&t.charAt(o+1)==="}"&&(ut+="{}",o+=2)),[ut,"TK_WORD"]}}if(w==="<"&&t.substring(o-1,o+3)==="<!--"){for(o+=3,w="<!--";t.charAt(o)!=="\n"&&o<s;)w+=t.charAt(o),o++;return a=!0,[w,"TK_COMMENT"]}if(w==="-"&&a&&t.substring(o-1,o+2)==="-->")return a=!1,o+=2,["-->","TK_COMMENT"];if(w===".")return[w,"TK_DOT"];if(n(w,y)){while(o<s&&n(w+t.charAt(o),y))if(w+=t.charAt(o),o+=1,o>=s)break;return w===","?[w,"TK_COMMA"]:w==="="?[w,"TK_EQUALS"]:[w,"TK_OPERATOR"]}return[w,"TK_UNKNOWN"]}function k(n){for(var e=!1,u="",r=0,f="",t=0,i;e||r<n.length;)if(i=n.charAt(r),r++,e){if(e=!1,i==="x")f=n.substr(r,2),r+=2;else if(i==="u")f=n.substr(r,4),r+=4;else{u+="\\"+i;continue}if(!f.match(/^[0123456789abcdefABCDEF]+$/))return n;if(t=parseInt(f,16),t>=0&&t<32){u+=i==="x"?"\\x"+f:"\\u"+f;continue}else if(t===34||t===39||t===92)u+="\\"+String.fromCharCode(t);else{if(i==="x"&&t>126&&t<=255)return n;u+=String.fromCharCode(t)}}else i==="\\"?e=!0:u+=i;return u}var b="\n\r\t ".split(""),v=/[0-9]/,y=("+ - * / % & ++ -- = += -= *= /= %= == === != !== > < >= <= >> << >>> >>>= >>= <<= && &= | || ! ~ , : ? ^ ^= |= :: =>"+" <%= <% %> <?= <? ?>").split(" "),p,c,l,a,h,o,s;this.line_starters="continue,try,throw,return,var,let,const,if,switch,case,default,for,while,break,function,yield,import,export".split(",");p=this.line_starters.concat(["do","in","else","get","set","new","catch","finally","typeof"]);this.tokenize=function(){s=t.length;o=0;a=!1;h=[];for(var n,f,r,i=null,v=[],e=[];!(f&&f.type==="TK_EOF");){for(r=w(),n=new u(r[1],r[0],c,l);n.type==="TK_INLINE_COMMENT"||n.type==="TK_COMMENT"||n.type==="TK_BLOCK_COMMENT"||n.type==="TK_UNKNOWN";)e.push(n),r=w(),n=new u(r[1],r[0],c,l);e.length&&(n.comments_before=e,e=[]);n.type==="TK_START_BLOCK"||n.type==="TK_START_EXPR"?(n.parent=f,i=n,v.push(n)):(n.type==="TK_END_BLOCK"||n.type==="TK_END_EXPR")&&i&&(n.text==="]"&&i.text==="["||n.text===")"&&i.text==="("||n.text==="}"&&i.text==="}")&&(n.parent=i.parent,i=v.pop());h.push(n);f=n}return h}}var i={},t,u;(function(n){var t="ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԧԱ-Ֆՙա-ևא-תװ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࢠࢢ-ࢬऄ-हऽॐक़-ॡॱ-ॷॹ-ॿঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-ళవ-హఽౘౙౠౡಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೞೠೡೱೲഅ-ഌഎ-ഐഒ-ഺഽൎൠൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄງຈຊຍດ-ທນ-ຟມ-ຣລວສຫອ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏼᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛰᜀ-ᜌᜎ-ᜑᜠ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡷᢀ-ᢨᢪᢰ-ᣵᤀ-ᤜᥐ-ᥭᥰ-ᥴᦀ-ᦫᧁ-ᧇᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭋᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᳩ-ᳬᳮ-ᳱᳵᳶᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞⸯ々-〇〡-〩〱-〵〸-〼ぁ-ゖゝ-ゟァ-ヺー-ヿㄅ-ㄭㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿌ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚗꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-ꞎꞐ-ꞓꞠ-Ɦꟸ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꪀ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꯀ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ",i=new RegExp("["+t+"]"),r=new RegExp("["+t+"̀-ͯ҃-֑҇-ׇֽֿׁׂׅׄؐ-ؚؠ-ىٲ-ۓۧ-ۨۻ-ۼܰ-݊ࠀ-ࠔࠛ-ࠣࠥ-ࠧࠩ-࠭ࡀ-ࡗࣤ-ࣾऀ-ःऺ-़ा-ॏ॑-ॗॢ-ॣ०-९ঁ-ঃ়া-ৄেৈৗয়-ৠਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢ-ૣ૦-૯ଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୟ-ୠ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఁ-ఃె-ైొ-్ౕౖౢ-ౣ౦-౯ಂಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢ-ೣ೦-೯ംഃെ-ൈൗൢ-ൣ൦-൯ංඃ්ා-ුූෘ-ෟෲෳิ-ฺเ-ๅ๐-๙ິ-ູ່-ໍ໐-໙༘༙༠-༩༹༵༷ཁ-ཇཱ-྄྆-྇ྍ-ྗྙ-ྼ࿆က-ဩ၀-၉ၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟ᜎ-ᜐᜠ-ᜰᝀ-ᝐᝲᝳក-ឲ៝០-៩᠋-᠍᠐-᠙ᤠ-ᤫᤰ-᤻ᥑ-ᥭᦰ-ᧀᧈ-ᧉ᧐-᧙ᨀ-ᨕᨠ-ᩓ᩠-᩿᩼-᪉᪐-᪙ᭆ-ᭋ᭐-᭙᭫-᭳᮰-᮹᯦-᯳ᰀ-ᰢ᱀-᱉ᱛ-ᱽ᳐-᳒ᴀ-ᶾḁ-ἕ‌‍‿⁀⁔⃐-⃥⃜⃡-⃰ⶁ-ⶖⷠ-ⷿ〡-〨゙゚Ꙁ-ꙭꙴ-꙽ꚟ꛰-꛱ꟸ-ꠀ꠆ꠋꠣ-ꠧꢀ-ꢁꢴ-꣄꣐-꣙ꣳ-ꣷ꤀-꤉ꤦ-꤭ꤰ-ꥅꦀ-ꦃ꦳-꧀ꨀ-ꨧꩀ-ꩁꩌ-ꩍ꩐-꩙ꩻꫠ-ꫩꫲ-ꫳꯀ-ꯡ꯬꯭꯰-꯹ﬠ-ﬨ︀-️︠-︦︳︴﹍-﹏0-9_]"),u=n.newline=/[\n\r\u2028\u2029]/,f=n.isIdentifierStart=function(n){return n<65?n===36:n<91?!0:n<97?n===95:n<123?!0:n>=170&&i.test(String.fromCharCode(n))},e=n.isIdentifierChar=function(n){return n<48?n===36:n<58?!0:n<65?!1:n<91?!0:n<97?n===95:n<123?!0:n>=170&&r.test(String.fromCharCode(n))}})(i);t={BlockStatement:"BlockStatement",Statement:"Statement",ObjectLiteral:"ObjectLiteral",ArrayLiteral:"ArrayLiteral",ForInitializer:"ForInitializer",Conditional:"Conditional",Expression:"Expression"};u=function(n,t,i,r){this.type=n;this.text=t;this.comments_before=[];this.newlines=i||0;this.wanted_newline=i>0;this.whitespace_before=r||[];this.parent=null};typeof define=="function"&&define.amd?define([],function(){return{js_beautify:r}}):typeof exports!="undefined"?exports.js_beautify=r:typeof window!="undefined"?window.js_beautify=r:typeof global!="undefined"&&(global.js_beautify=r)})(),function(){function i(n){return n.replace(/^\s+/g,"")}function t(n){return n.replace(/\s+$/g,"")}function n(n,r,u,f){function ft(){return this.pos=0,this.token="",this.current_mode="CONTENT",this.tags={parent:"parent1",parentcount:1,parent1:""},this.tag_type="",this.token_text=this.last_token=this.last_text=this.token_type="",this.newlines=0,this.indent_content=k,this.Utils={whitespace:"\n\r\t ".split(""),single_token:"br,input,link,meta,!doctype,basefont,base,area,hr,wbr,param,img,isindex,?xml,embed,?php,?,?=".split(","),extra_liners:"head,body,/html".split(","),in_array:function(n,t){for(var i=0;i<t.length;i++)if(n===t[i])return!0;return!1}},this.is_whitespace=function(n){for(var t=0;t<n.length;n++)if(!this.Utils.in_array(n.charAt(t),this.Utils.whitespace))return!1;return!0},this.traverse_whitespace=function(){var n="";if(n=this.input.charAt(this.pos),this.Utils.in_array(n,this.Utils.whitespace)){for(this.newlines=0;this.Utils.in_array(n,this.Utils.whitespace);)v&&n==="\n"&&this.newlines<=it&&(this.newlines+=1),this.pos++,n=this.input.charAt(this.pos);return!0}return!1},this.space_or_wrap=function(n){this.line_char_count>=this.wrap_line_length?(this.print_newline(!1,n),this.print_indentation(n)):(this.line_char_count++,n.push(" "))},this.get_content=function(){for(var i="",n=[],t;this.input.charAt(this.pos)!=="<";){if(this.pos>=this.input.length)return n.length?n.join(""):["","TK_EOF"];if(this.traverse_whitespace()){this.space_or_wrap(n);continue}if(o)if(t=this.input.substr(this.pos,3),t==="{{#"||t==="{{/")break;else if(this.input.substr(this.pos,2)==="{{"&&this.get_tag(!0)==="{{else}}")break;i=this.input.charAt(this.pos);this.pos++;this.line_char_count++;n.push(i)}return n.length?n.join(""):""},this.get_contents_to=function(n){var i,t;if(this.pos===this.input.length)return["","TK_EOF"];var r="",u=new RegExp("<\/"+n+"\\s*>","igm");return u.lastIndex=this.pos,i=u.exec(this.input),t=i?i.index:this.input.length,this.pos<t&&(r=this.input.substring(this.pos,t),this.pos=t),r},this.record_tag=function(n){this.tags[n+"count"]?(this.tags[n+"count"]++,this.tags[n+this.tags[n+"count"]]=this.indent_level):(this.tags[n+"count"]=1,this.tags[n+this.tags[n+"count"]]=this.indent_level);this.tags[n+this.tags[n+"count"]+"parent"]=this.tags.parent;this.tags.parent=n+this.tags[n+"count"]},this.retrieve_tag=function(n){if(this.tags[n+"count"]){for(var t=this.tags.parent;t;){if(n+this.tags[n+"count"]===t)break;t=this.tags[t+"parent"]}t&&(this.indent_level=this.tags[n+this.tags[n+"count"]],this.tags.parent=this.tags[t+"parent"]);delete this.tags[n+this.tags[n+"count"]+"parent"];delete this.tags[n+this.tags[n+"count"]];this.tags[n+"count"]===1?delete this.tags[n+"count"]:this.tags[n+"count"]--}},this.indent_to_tag=function(n){if(this.tags[n+"count"]){for(var t=this.tags.parent;t;){if(n+this.tags[n+"count"]===t)break;t=this.tags[t+"parent"]}t&&(this.indent_level=this.tags[n+this.tags[n+"count"]])}},this.get_tag=function(n){var r="",t=[],h="",f=!1,s,p,e,c=this.pos,l=this.line_char_count,i,v,y,u;n=n!==undefined?n:!1;do{if(this.pos>=this.input.length)return n&&(this.pos=c,this.line_char_count=l),t.length?t.join(""):["","TK_EOF"];if(r=this.input.charAt(this.pos),this.pos++,this.Utils.in_array(r,this.Utils.whitespace)){f=!0;continue}if((r==="'"||r==='"')&&(r+=this.get_unformatted(r),f=!0),r==="="&&(f=!1),t.length&&t[t.length-1]!=="="&&r!==">"&&f&&(this.space_or_wrap(t),f=!1),o&&e==="<"&&r+this.input.charAt(this.pos)==="{{"&&(r+=this.get_unformatted("}}"),t.length&&t[t.length-1]!==" "&&t[t.length-1]!=="<"&&(r=" "+r),f=!0),r!=="<"||e||(s=this.pos-1,e="<"),o&&!e&&t.length>=2&&t[t.length-1]==="{"&&t[t.length-2]=="{"&&(s=r==="#"||r==="/"?this.pos-3:this.pos-2,e="{"),this.line_char_count++,t.push(r),t[1]&&t[1]==="!"){t=[this.get_comment(s)];break}if(o&&e==="{"&&t.length>2&&t[t.length-2]==="}"&&t[t.length-1]==="}")break}while(r!==">");return i=t.join(""),v=i.indexOf(" ")!==-1?i.indexOf(" "):i[0]==="{"?i.indexOf("}"):i.indexOf(">"),y=i[0]!=="<"&&o?i[2]==="#"?3:2:1,u=i.substring(y,v).toLowerCase(),i.charAt(i.length-2)==="/"||this.Utils.in_array(u,this.Utils.single_token)?n||(this.tag_type="SINGLE"):o&&i[0]==="{"&&u==="else"?n||(this.indent_to_tag("if"),this.tag_type="HANDLEBARS_ELSE",this.indent_content=!0,this.traverse_whitespace()):this.is_unformatted(u,a)?(h=this.get_unformatted("<\/"+u+">",i),t.push(h),p=this.pos-1,this.tag_type="SINGLE"):u==="script"&&(i.search("type")===-1||i.search("type")>-1&&i.search(/\b(text|application)\/(x-)?(javascript|ecmascript|jscript|livescript)/)>-1)?n||(this.record_tag(u),this.tag_type="SCRIPT"):u==="style"&&(i.search("type")===-1||i.search("type")>-1&&i.search("text/css")>-1)?n||(this.record_tag(u),this.tag_type="STYLE"):u.charAt(0)==="!"?n||(this.tag_type="SINGLE",this.traverse_whitespace()):n||(u.charAt(0)==="/"?(this.retrieve_tag(u.substring(1)),this.tag_type="END"):(this.record_tag(u),u.toLowerCase()!=="html"&&(this.indent_content=!0),this.tag_type="START"),this.traverse_whitespace()&&this.space_or_wrap(t),this.Utils.in_array(u,this.Utils.extra_liners)&&(this.print_newline(!1,this.output),this.output.length&&this.output[this.output.length-2]!=="\n"&&this.print_newline(!0,this.output))),n&&(this.pos=c,this.line_char_count=l),t.join("")},this.get_comment=function(n){var t="",i=">",r=!1;for(this.pos=n,input_char=this.input.charAt(this.pos),this.pos++;this.pos<=this.input.length;){if(t+=input_char,t[t.length-1]===i[i.length-1]&&t.indexOf(i)!==-1)break;!r&&t.length<10&&(t.indexOf("<![if")===0?(i="<![endif]>",r=!0):t.indexOf("<![cdata[")===0?(i="]\]>",r=!0):t.indexOf("<![")===0?(i="]>",r=!0):t.indexOf("<!--")===0&&(i="-->",r=!0));input_char=this.input.charAt(this.pos);this.pos++}return t},this.get_unformatted=function(n,t){if(t&&t.toLowerCase().indexOf(n)!==-1)return"";var r="",i="",u=0,f=!0;do{if(this.pos>=this.input.length)return i;if(r=this.input.charAt(this.pos),this.pos++,this.Utils.in_array(r,this.Utils.whitespace)){if(!f){this.line_char_count--;continue}if(r==="\n"||r==="\r"){i+="\n";this.line_char_count=0;continue}}i+=r;this.line_char_count++;f=!0;o&&r==="{"&&i.length&&i[i.length-2]==="{"&&(i+=this.get_unformatted("}}"),u=i.length)}while(i.toLowerCase().indexOf(n,u)===-1);return i},this.get_token=function(){var n,t,i;return this.last_token==="TK_TAG_SCRIPT"||this.last_token==="TK_TAG_STYLE"?(t=this.last_token.substr(7),n=this.get_contents_to(t),typeof n!="string")?n:[n,"TK_"+t]:this.current_mode==="CONTENT"?(n=this.get_content(),typeof n!="string"?n:[n,"TK_CONTENT"]):this.current_mode==="TAG"?(n=this.get_tag(),typeof n!="string"?n:(i="TK_TAG_"+this.tag_type,[n,i])):void 0},this.get_full_indent=function(n){return(n=this.indent_level+n||0,n<1)?"":Array(n+1).join(this.indent_string)},this.is_unformatted=function(n,t){if(!this.Utils.in_array(n,t))return!1;if(n.toLowerCase()!=="a"||!this.Utils.in_array("a",t))return!0;var r=this.get_tag(!0),i=(r||"").match(/^\s*<\s*\/?([a-z]*)\s*[^>]*>\s*$/);return!i||this.Utils.in_array(i,t)?!0:!1},this.printer=function(n,r,u,f,e){this.input=n||"";this.output=[];this.indent_character=r;this.indent_string="";this.indent_size=u;this.brace_style=e;this.indent_level=0;this.wrap_line_length=f;this.line_char_count=0;for(var o=0;o<this.indent_size;o++)this.indent_string+=this.indent_character;this.print_newline=function(n,i){(this.line_char_count=0,i&&i.length)&&(n||i[i.length-1]!=="\n")&&(i[i.length-1]!=="\n"&&(i[i.length-1]=t(i[i.length-1])),i.push("\n"))};this.print_indentation=function(n){for(var t=0;t<this.indent_level;t++)n.push(this.indent_string),this.line_char_count+=this.indent_string.length};this.print_token=function(n){(!this.is_whitespace(n)||this.output.length)&&((n||n!=="")&&this.output.length&&this.output[this.output.length-1]==="\n"&&(this.print_indentation(this.output),n=i(n)),this.print_token_raw(n))};this.print_token_raw=function(n){this.newlines>0&&(n=t(n));n&&n!==""&&(n.length>1&&n[n.length-1]==="\n"?(this.output.push(n.slice(0,-1)),this.print_newline(!1,this.output)):this.output.push(n));for(var i=0;i<this.newlines;i++)this.print_newline(i>0,this.output);this.newlines=0};this.indent=function(){this.indent_level++};this.unindent=function(){this.indent_level>0&&this.indent_level--}},this}var e,k,d,g,nt,tt,a,v,it,o,rt,y,ut,c,p,s,l,h,w,b;for(r=r||{},(r.wrap_line_length===undefined||parseInt(r.wrap_line_length,10)===0)&&r.max_char!==undefined&&parseInt(r.max_char,10)!==0&&(r.wrap_line_length=r.max_char),k=r.indent_inner_html===undefined?!1:r.indent_inner_html,d=r.indent_size===undefined?4:parseInt(r.indent_size,10),g=r.indent_char===undefined?" ":r.indent_char,tt=r.brace_style===undefined?"collapse":r.brace_style,nt=parseInt(r.wrap_line_length,10)===0?32786:parseInt(r.wrap_line_length||250,10),a=r.unformatted||["a","span","img","bdo","em","strong","dfn","code","samp","kbd","var","cite","abbr","acronym","q","sub","sup","tt","i","b","big","small","u","s","strike","font","ins","del","pre","address","dt","h1","h2","h3","h4","h5","h6"],v=r.preserve_newlines===undefined?!0:r.preserve_newlines,it=v?isNaN(parseInt(r.max_preserve_newlines,10))?32786:parseInt(r.max_preserve_newlines,10):0,o=r.indent_handlebars===undefined?!1:r.indent_handlebars,rt=r.end_with_newline===undefined?!1:r.end_with_newline,e=new ft,e.printer(n,g,d,nt,tt);;){if(y=e.get_token(),e.token_text=y[0],e.token_type=y[1],e.token_type==="TK_EOF")break;switch(e.token_type){case"TK_TAG_START":e.print_newline(!1,e.output);e.print_token(e.token_text);e.indent_content&&(e.indent(),e.indent_content=!1);e.current_mode="CONTENT";break;case"TK_TAG_STYLE":case"TK_TAG_SCRIPT":e.print_newline(!1,e.output);e.print_token(e.token_text);e.current_mode="CONTENT";break;case"TK_TAG_END":e.last_token==="TK_CONTENT"&&e.last_text===""&&(ut=e.token_text.match(/\w+/)[0],c=null,e.output.length&&(c=e.output[e.output.length-1].match(/(?:<|{{#)\s*(\w+)/)),(c===null||c[1]!==ut)&&e.print_newline(!1,e.output));e.print_token(e.token_text);e.current_mode="CONTENT";break;case"TK_TAG_SINGLE":p=e.token_text.match(/^\s*<([a-z-]+)/i);p&&e.Utils.in_array(p[1],a)||e.print_newline(!1,e.output);e.print_token(e.token_text);e.current_mode="CONTENT";break;case"TK_TAG_HANDLEBARS_ELSE":e.print_token(e.token_text);e.indent_content&&(e.indent(),e.indent_content=!1);e.current_mode="CONTENT";break;case"TK_CONTENT":e.print_token(e.token_text);e.current_mode="TAG";break;case"TK_STYLE":case"TK_SCRIPT":if(e.token_text!==""){if(e.print_newline(!1,e.output),s=e.token_text,h=1,e.token_type==="TK_SCRIPT"?l=typeof u=="function"&&u:e.token_type==="TK_STYLE"&&(l=typeof f=="function"&&f),r.indent_scripts==="keep"?h=0:r.indent_scripts==="separate"&&(h=-e.indent_level),w=e.get_full_indent(h),l)s=l(s.replace(/^\s*/,w),r);else{var et=s.match(/^\s*/)[0],ot=et.match(/[^\n\r]*$/)[0].split(e.indent_string).length-1,st=e.get_full_indent(h-ot);s=s.replace(/^\s*/,w).replace(/\r\n|\r|\n/g,"\n"+st).replace(/\s+$/,"")}s&&(e.print_token_raw(s),e.print_newline(!0,e.output))}e.current_mode="TAG";break;default:e.token_text!==""&&e.print_token(e.token_text)}e.last_token=e.token_type;e.last_text=e.token_text}return b=e.output.join("").replace(/[\r\n\t ]+$/,""),rt&&(b+="\n"),b}if(typeof define=="function"&&define.amd)define(["require","./beautify","./beautify-css"],function(t){var i=t("./beautify"),r=t("./beautify-css");return{html_beautify:function(t,u){return n(t,u,i.js_beautify,r.css_beautify)}}});else if(typeof exports!="undefined"){var r=require("./beautify.js"),u=require("./beautify-css.js");exports.html_beautify=function(t,i){return n(t,i,r.js_beautify,u.css_beautify)}}else typeof window!="undefined"?window.html_beautify=function(t,i){return n(t,i,window.js_beautify,window.css_beautify)}:typeof global!="undefined"&&(global.html_beautify=function(t,i){return n(t,i,global.js_beautify,global.css_beautify)})}()
extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/codemirror/js/codemirror.min.js000060400000517123152453623450033736 0ustar00components/com_acymailing(function(a){if(typeof exports=="object"&&typeof module=="object"){module.exports=a()}else{if(typeof define=="function"&&define.amd){return define([],a)}else{this.CodeMirror=a()}}})(function(){var cp=/gecko\/\d/i.test(navigator.userAgent);var eL=/MSIE \d/.test(navigator.userAgent);var bK=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);var dL=eL||bK;var k=dL&&(eL?document.documentMode||6:bK[1]);var c1=/WebKit\//.test(navigator.userAgent);var dO=c1&&/Qt\/\d+\.\d+/.test(navigator.userAgent);var dd=/Chrome\//.test(navigator.userAgent);var d4=/Opera\//.test(navigator.userAgent);var aC=/Apple Computer/.test(navigator.vendor);var c8=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent);var fv=/PhantomJS/.test(navigator.userAgent);var e2=/AppleWebKit/.test(navigator.userAgent)&&/Mobile\/\w+/.test(navigator.userAgent);var eh=e2||/Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent);var b8=e2||/Mac/.test(navigator.platform);var aP=/win/i.test(navigator.platform);var aZ=d4&&navigator.userAgent.match(/Version\/(\d*\.\d*)/);if(aZ){aZ=Number(aZ[1])}if(aZ&&aZ>=15){d4=false;c1=true}var bR=b8&&(dO||d4&&(aZ==null||aZ<12.11));var ga=cp||(dL&&k>=9);var gd=false,a8=false;function H(gj,gl){if(!(this instanceof H)){return new H(gj,gl)}this.options=gl=gl?aN(gl):{};aN(e4,gl,false);cf(gl);var gp=gl.value;if(typeof gp=="string"){gp=new at(gp,gl.mode)}this.doc=gp;var gk=new H.inputStyles[gl.inputStyle](this);var go=this.display=new eJ(gj,gp,gk);go.wrapper.CodeMirror=this;ed(this);cP(this);if(gl.lineWrapping){this.display.wrapper.className+=" CodeMirror-wrap"}if(gl.autofocus&&!eh){go.input.focus()}aD(this);this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:false,delayingBlurEvent:false,focused:false,suppressEdits:false,pasteIncoming:false,cutIncoming:false,draggingText:false,highlight:new gh(),keySeq:null,specialChars:null};var gi=this;if(dL&&k<11){setTimeout(function(){gi.display.input.reset(true)},20)}fR(this);bk();cJ(this);this.curOp.forceUpdate=true;ec(this,gp);if((gl.autofocus&&!eh)||gi.hasFocus()){setTimeout(cw(cC,this),20)}else{aV(this)}for(var gn in bg){if(bg.hasOwnProperty(gn)){bg[gn](this,gl[gn],cd)}}d6(this);if(gl.finishInit){gl.finishInit(this)}for(var gm=0;gm<a9.length;++gm){a9[gm](this)}am(this);if(c1&&gl.lineWrapping&&getComputedStyle(go.lineDiv).textRendering=="optimizelegibility"){go.lineDiv.style.textRendering="auto"}}function eJ(gi,gk,gj){var gl=this;this.input=gj;gl.scrollbarFiller=f3("div",null,"CodeMirror-scrollbar-filler");gl.scrollbarFiller.setAttribute("cm-not-content","true");gl.gutterFiller=f3("div",null,"CodeMirror-gutter-filler");gl.gutterFiller.setAttribute("cm-not-content","true");gl.lineDiv=f3("div",null,"CodeMirror-code");gl.selectionDiv=f3("div",null,null,"position: relative; z-index: 1");gl.cursorDiv=f3("div",null,"CodeMirror-cursors");gl.measure=f3("div",null,"CodeMirror-measure");gl.lineMeasure=f3("div",null,"CodeMirror-measure");gl.lineSpace=f3("div",[gl.measure,gl.lineMeasure,gl.selectionDiv,gl.cursorDiv,gl.lineDiv],null,"position: relative; outline: none");gl.mover=f3("div",[f3("div",[gl.lineSpace],"CodeMirror-lines")],null,"position: relative");gl.sizer=f3("div",[gl.mover],"CodeMirror-sizer");gl.sizerWidth=null;gl.heightForcer=f3("div",null,null,"position: absolute; height: "+dK+"px; width: 1px;");gl.gutters=f3("div",null,"CodeMirror-gutters");gl.lineGutter=null;gl.scroller=f3("div",[gl.sizer,gl.heightForcer,gl.gutters],"CodeMirror-scroll");gl.scroller.setAttribute("tabIndex","-1");gl.wrapper=f3("div",[gl.scrollbarFiller,gl.gutterFiller,gl.scroller],"CodeMirror");if(dL&&k<8){gl.gutters.style.zIndex=-1;gl.scroller.style.paddingRight=0}if(!c1&&!(cp&&eh)){gl.scroller.draggable=true}if(gi){if(gi.appendChild){gi.appendChild(gl.wrapper)}else{gi(gl.wrapper)}}gl.viewFrom=gl.viewTo=gk.first;gl.reportedViewFrom=gl.reportedViewTo=gk.first;gl.view=[];gl.renderedView=null;gl.externalMeasured=null;gl.viewOffset=0;gl.lastWrapHeight=gl.lastWrapWidth=0;gl.updateLineNumbers=null;gl.nativeBarWidth=gl.barHeight=gl.barWidth=0;gl.scrollbarsClipped=false;gl.lineNumWidth=gl.lineNumInnerWidth=gl.lineNumChars=null;gl.alignWidgets=false;gl.cachedCharWidth=gl.cachedTextHeight=gl.cachedPaddingH=null;gl.maxLine=null;gl.maxLineLength=0;gl.maxLineChanged=false;gl.wheelDX=gl.wheelDY=gl.wheelStartX=gl.wheelStartY=null;gl.shift=false;gl.selForContextMenu=null;gl.activeTouch=null;gj.init(gl)}function bs(gi){gi.doc.mode=H.getMode(gi.options,gi.doc.modeOption);em(gi)}function em(gi){gi.doc.iter(function(gj){if(gj.stateAfter){gj.stateAfter=null}if(gj.styles){gj.styles=null}});gi.doc.frontier=gi.doc.first;eg(gi,100);gi.state.modeGen++;if(gi.curOp){ah(gi)}}function eH(gi){if(gi.options.lineWrapping){fB(gi.display.wrapper,"CodeMirror-wrap");gi.display.sizer.style.minWidth="";gi.display.sizerWidth=null}else{f(gi.display.wrapper,"CodeMirror-wrap");h(gi)}X(gi);ah(gi);ak(gi);setTimeout(function(){eZ(gi)},100)}function bf(gi){var gk=aY(gi.display),gj=gi.options.lineWrapping;var gl=gj&&Math.max(5,gi.display.scroller.clientWidth/dE(gi.display)-3);return function(gn){if(fx(gi.doc,gn)){return 0}var gm=0;if(gn.widgets){for(var go=0;go<gn.widgets.length;go++){if(gn.widgets[go].height){gm+=gn.widgets[go].height}}}if(gj){return gm+(Math.ceil(gn.text.length/gl)||1)*gk}else{return gm+gk}}}function X(gi){var gk=gi.doc,gj=bf(gi);gk.iter(function(gl){var gm=gj(gl);if(gm!=gl.height){f6(gl,gm)}})}function cP(gi){gi.display.wrapper.className=gi.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+gi.options.theme.replace(/(^|\s)\s*/g," cm-s-");ak(gi)}function dx(gi){ed(gi);ah(gi);setTimeout(function(){eF(gi)},20)}function ed(gi){var gj=gi.display.gutters,gn=gi.options.gutters;d2(gj);for(var gk=0;gk<gn.length;++gk){var gl=gn[gk];var gm=gj.appendChild(f3("div",null,"CodeMirror-gutter "+gl));if(gl=="CodeMirror-linenumbers"){gi.display.lineGutter=gm;gm.style.width=(gi.display.lineNumWidth||1)+"px"}}gj.style.display=gk?"":"none";c5(gi)}function c5(gi){var gj=gi.display.gutters.offsetWidth;gi.display.sizer.style.marginLeft=gj+"px"}function eo(gk){if(gk.height==0){return 0}var gj=gk.text.length,gi,gm=gk;while(gi=eP(gm)){var gl=gi.find(0,true);gm=gl.from.line;gj+=gl.from.ch-gl.to.ch}gm=gk;while(gi=ex(gm)){var gl=gi.find(0,true);gj-=gm.text.length-gl.from.ch;gm=gl.to.line;gj+=gm.text.length-gl.to.ch}return gj}function h(gi){var gk=gi.display,gj=gi.doc;gk.maxLine=fg(gj,gj.first);gk.maxLineLength=eo(gk.maxLine);gk.maxLineChanged=true;gj.iter(function(gm){var gl=eo(gm);if(gl>gk.maxLineLength){gk.maxLineLength=gl;gk.maxLine=gm}})}function cf(gi){var gj=di(gi.gutters,"CodeMirror-linenumbers");if(gj==-1&&gi.lineNumbers){gi.gutters=gi.gutters.concat(["CodeMirror-linenumbers"])}else{if(gj>-1&&!gi.lineNumbers){gi.gutters=gi.gutters.slice(0);gi.gutters.splice(gj,1)}}}function dB(gi){var gl=gi.display,gk=gl.gutters.offsetWidth;var gj=Math.round(gi.doc.height+bJ(gi.display));return{clientHeight:gl.scroller.clientHeight,viewHeight:gl.wrapper.clientHeight,scrollWidth:gl.scroller.scrollWidth,clientWidth:gl.scroller.clientWidth,viewWidth:gl.wrapper.clientWidth,barLeft:gi.options.fixedGutter?gk:0,docHeight:gj,scrollHeight:gj+cU(gi)+gl.barHeight,nativeBarWidth:gl.nativeBarWidth,gutterWidth:gk}}function dl(gk,gj,gi){this.cm=gi;var gl=this.vert=f3("div",[f3("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar");var gm=this.horiz=f3("div",[f3("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");gk(gl);gk(gm);bY(gl,"scroll",function(){if(gl.clientHeight){gj(gl.scrollTop,"vertical")}});bY(gm,"scroll",function(){if(gm.clientWidth){gj(gm.scrollLeft,"horizontal")}});this.checkedOverlay=false;if(dL&&k<8){this.horiz.style.minHeight=this.vert.style.minWidth="18px"}}dl.prototype=aN({update:function(gl){var gm=gl.scrollWidth>gl.clientWidth+1;var gk=gl.scrollHeight>gl.clientHeight+1;var gn=gl.nativeBarWidth;if(gk){this.vert.style.display="block";this.vert.style.bottom=gm?gn+"px":"0";var gj=gl.viewHeight-(gm?gn:0);this.vert.firstChild.style.height=Math.max(0,gl.scrollHeight-gl.clientHeight+gj)+"px"}else{this.vert.style.display="";this.vert.firstChild.style.height="0"}if(gm){this.horiz.style.display="block";this.horiz.style.right=gk?gn+"px":"0";this.horiz.style.left=gl.barLeft+"px";var gi=gl.viewWidth-gl.barLeft-(gk?gn:0);this.horiz.firstChild.style.width=(gl.scrollWidth-gl.clientWidth+gi)+"px"}else{this.horiz.style.display="";this.horiz.firstChild.style.width="0"}if(!this.checkedOverlay&&gl.clientHeight>0){if(gn==0){this.overlayHack()}this.checkedOverlay=true}return{right:gk?gn:0,bottom:gm?gn:0}},setScrollLeft:function(gi){if(this.horiz.scrollLeft!=gi){this.horiz.scrollLeft=gi}},setScrollTop:function(gi){if(this.vert.scrollTop!=gi){this.vert.scrollTop=gi}},overlayHack:function(){var gi=b8&&!c8?"12px":"18px";this.horiz.style.minHeight=this.vert.style.minWidth=gi;var gj=this;var gk=function(gl){if(L(gl)!=gj.vert&&L(gl)!=gj.horiz){c3(gj.cm,ev)(gl)}};bY(this.vert,"mousedown",gk);bY(this.horiz,"mousedown",gk)},clear:function(){var gi=this.horiz.parentNode;gi.removeChild(this.horiz);gi.removeChild(this.vert)}},dl.prototype);function e5(){}e5.prototype=aN({update:function(){return{bottom:0,right:0}},setScrollLeft:function(){},setScrollTop:function(){},clear:function(){}},e5.prototype);H.scrollbarModel={"native":dl,"null":e5};function aD(gi){if(gi.display.scrollbars){gi.display.scrollbars.clear();if(gi.display.scrollbars.addClass){f(gi.display.wrapper,gi.display.scrollbars.addClass)}}gi.display.scrollbars=new H.scrollbarModel[gi.options.scrollbarStyle](function(gj){gi.display.wrapper.insertBefore(gj,gi.display.scrollbarFiller);bY(gj,"mousedown",function(){if(gi.state.focused){setTimeout(function(){gi.display.input.focus()},0)}});gj.setAttribute("cm-not-content","true")},function(gk,gj){if(gj=="horizontal"){bF(gi,gk)}else{N(gi,gk)}},gi);if(gi.display.scrollbars.addClass){fB(gi.display.wrapper,gi.display.scrollbars.addClass)}}function eZ(gk,gm){if(!gm){gm=dB(gk)}var gj=gk.display.barWidth,gi=gk.display.barHeight;aU(gk,gm);for(var gl=0;gl<4&&gj!=gk.display.barWidth||gi!=gk.display.barHeight;gl++){if(gj!=gk.display.barWidth&&gk.options.lineWrapping){ba(gk)}aU(gk,dB(gk));gj=gk.display.barWidth;gi=gk.display.barHeight}}function aU(gi,gj){var gl=gi.display;var gk=gl.scrollbars.update(gj);gl.sizer.style.paddingRight=(gl.barWidth=gk.right)+"px";gl.sizer.style.paddingBottom=(gl.barHeight=gk.bottom)+"px";if(gk.right&&gk.bottom){gl.scrollbarFiller.style.display="block";gl.scrollbarFiller.style.height=gk.bottom+"px";gl.scrollbarFiller.style.width=gk.right+"px"}else{gl.scrollbarFiller.style.display=""}if(gk.bottom&&gi.options.coverGutterNextToScrollbar&&gi.options.fixedGutter){gl.gutterFiller.style.display="block";gl.gutterFiller.style.height=gk.bottom+"px";gl.gutterFiller.style.width=gj.gutterWidth+"px"}else{gl.gutterFiller.style.display=""}}function b7(gl,gp,gk){var gm=gk&&gk.top!=null?Math.max(0,gk.top):gl.scroller.scrollTop;gm=Math.floor(gm-e9(gl));var gi=gk&&gk.bottom!=null?gk.bottom:gm+gl.wrapper.clientHeight;var gn=bH(gp,gm),go=bH(gp,gi);if(gk&&gk.ensure){var gj=gk.ensure.from.line,gq=gk.ensure.to.line;if(gj<gn){gn=gj;go=bH(gp,bN(fg(gp,gj))+gl.wrapper.clientHeight)}else{if(Math.min(gq,gp.lastLine())>=go){gn=bH(gp,bN(fg(gp,gq))-gl.wrapper.clientHeight);go=gq}}}return{from:gn,to:Math.max(go,gn+1)}}function eF(gq){var go=gq.display,gp=go.view;if(!go.alignWidgets&&(!go.gutters.firstChild||!gq.options.fixedGutter)){return}var gm=dY(go)-go.scroller.scrollLeft+gq.doc.scrollLeft;var gi=go.gutters.offsetWidth,gj=gm+"px";for(var gl=0;gl<gp.length;gl++){if(!gp[gl].hidden){if(gq.options.fixedGutter&&gp[gl].gutter){gp[gl].gutter.style.left=gj}var gn=gp[gl].alignable;if(gn){for(var gk=0;gk<gn.length;gk++){gn[gk].style.left=gj}}}}if(gq.options.fixedGutter){go.gutters.style.left=(gm+gi)+"px"}}function d6(gi){if(!gi.options.lineNumbers){return false}var gn=gi.doc,gj=et(gi.options,gn.first+gn.size-1),gm=gi.display;if(gj.length!=gm.lineNumChars){var go=gm.measure.appendChild(f3("div",[f3("div",gj)],"CodeMirror-linenumber CodeMirror-gutter-elt"));var gk=go.firstChild.offsetWidth,gl=go.offsetWidth-gk;gm.lineGutter.style.width="";gm.lineNumInnerWidth=Math.max(gk,gm.lineGutter.offsetWidth-gl)+1;gm.lineNumWidth=gm.lineNumInnerWidth+gl;gm.lineNumChars=gm.lineNumInnerWidth?gj.length:-1;gm.lineGutter.style.width=gm.lineNumWidth+"px";c5(gi);return true}return false}function et(gi,gj){return String(gi.lineNumberFormatter(gj+gi.firstLineNumber))}function dY(gi){return gi.scroller.getBoundingClientRect().left-gi.sizer.getBoundingClientRect().left}function aI(gj,gi,gk){var gl=gj.display;this.viewport=gi;this.visible=b7(gl,gj.doc,gi);this.editorIsHidden=!gl.wrapper.offsetWidth;this.wrapperHeight=gl.wrapper.clientHeight;this.wrapperWidth=gl.wrapper.clientWidth;this.oldDisplayWidth=dm(gj);this.force=gk;this.dims=fe(gj);this.events=[]}aI.prototype.signal=function(gj,gi){if(fj(gj,gi)){this.events.push(arguments)}};aI.prototype.finish=function(){for(var gi=0;gi<this.events.length;gi++){aE.apply(null,this.events[gi])}};function J(gi){var gj=gi.display;if(!gj.scrollbarsClipped&&gj.scroller.offsetWidth){gj.nativeBarWidth=gj.scroller.offsetWidth-gj.scroller.clientWidth;gj.heightForcer.style.height=cU(gi)+"px";gj.sizer.style.marginBottom=-gj.nativeBarWidth+"px";gj.sizer.style.borderRightWidth=cU(gi)+"px";gj.scrollbarsClipped=true}}function B(gr,gl){var gm=gr.display,gq=gr.doc;if(gl.editorIsHidden){ey(gr);return false}if(!gl.force&&gl.visible.from>=gm.viewFrom&&gl.visible.to<=gm.viewTo&&(gm.updateLineNumbers==null||gm.updateLineNumbers>=gm.viewTo)&&gm.renderedView==gm.view&&dc(gr)==0){return false}if(d6(gr)){ey(gr);gl.dims=fe(gr)}var gk=gq.first+gq.size;var go=Math.max(gl.visible.from-gr.options.viewportMargin,gq.first);var gp=Math.min(gk,gl.visible.to+gr.options.viewportMargin);if(gm.viewFrom<go&&go-gm.viewFrom<20){go=Math.max(gq.first,gm.viewFrom)}if(gm.viewTo>gp&&gm.viewTo-gp<20){gp=Math.min(gk,gm.viewTo)}if(a8){go=aW(gr.doc,go);gp=d3(gr.doc,gp)}var gj=go!=gm.viewFrom||gp!=gm.viewTo||gm.lastWrapHeight!=gl.wrapperHeight||gm.lastWrapWidth!=gl.wrapperWidth;cS(gr,go,gp);gm.viewOffset=bN(fg(gr.doc,gm.viewFrom));gr.display.mover.style.top=gm.viewOffset+"px";var gi=dc(gr);if(!gj&&gi==0&&!gl.force&&gm.renderedView==gm.view&&(gm.updateLineNumbers==null||gm.updateLineNumbers>=gm.viewTo)){return false}var gn=dP();if(gi>4){gm.lineDiv.style.display="none"}cn(gr,gm.updateLineNumbers,gl.dims);if(gi>4){gm.lineDiv.style.display=""}gm.renderedView=gm.view;if(gn&&dP()!=gn&&gn.offsetHeight){gn.focus()}d2(gm.cursorDiv);d2(gm.selectionDiv);gm.gutters.style.height=0;if(gj){gm.lastWrapHeight=gl.wrapperHeight;gm.lastWrapWidth=gl.wrapperWidth;eg(gr,400)}gm.updateLineNumbers=null;return true}function ck(gj,gm){var gi=gm.viewport;for(var gl=true;;gl=false){if(!gl||!gj.options.lineWrapping||gm.oldDisplayWidth==dm(gj)){if(gi&&gi.top!=null){gi={top:Math.min(gj.doc.height+bJ(gj.display)-cW(gj),gi.top)}}gm.visible=b7(gj.display,gj.doc,gi);if(gm.visible.from>=gj.display.viewFrom&&gm.visible.to<=gj.display.viewTo){break}}if(!B(gj,gm)){break}ba(gj);var gk=dB(gj);bD(gj);dA(gj,gk);eZ(gj,gk)}gm.signal(gj,"update",gj);if(gj.display.viewFrom!=gj.display.reportedViewFrom||gj.display.viewTo!=gj.display.reportedViewTo){gm.signal(gj,"viewportChange",gj,gj.display.viewFrom,gj.display.viewTo);gj.display.reportedViewFrom=gj.display.viewFrom;gj.display.reportedViewTo=gj.display.viewTo}}function dU(gj,gi){var gl=new aI(gj,gi);if(B(gj,gl)){ba(gj);ck(gj,gl);var gk=dB(gj);bD(gj);dA(gj,gk);eZ(gj,gk);gl.finish()}}function dA(gi,gj){gi.display.sizer.style.minHeight=gj.docHeight+"px";var gk=gj.docHeight+gi.display.barHeight;gi.display.heightForcer.style.top=gk+"px";gi.display.gutters.style.height=Math.max(gk+cU(gi),gj.clientHeight)+"px"}function ba(gp){var gn=gp.display;var gj=gn.lineDiv.offsetTop;for(var gk=0;gk<gn.view.length;gk++){var gq=gn.view[gk],gr;if(gq.hidden){continue}if(dL&&k<8){var gm=gq.node.offsetTop+gq.node.offsetHeight;gr=gm-gj;gj=gm}else{var gl=gq.node.getBoundingClientRect();gr=gl.bottom-gl.top}var go=gq.line.height-gr;if(gr<2){gr=aY(gn)}if(go>0.001||go<-0.001){f6(gq.line,gr);cc(gq.line);if(gq.rest){for(var gi=0;gi<gq.rest.length;gi++){cc(gq.rest[gi])}}}}}function cc(gi){if(gi.widgets){for(var gj=0;gj<gi.widgets.length;++gj){gi.widgets[gj].height=gi.widgets[gj].node.offsetHeight}}}function fe(gi){var gn=gi.display,gl={},gk={};var gm=gn.gutters.clientLeft;for(var go=gn.gutters.firstChild,gj=0;go;go=go.nextSibling,++gj){gl[gi.options.gutters[gj]]=go.offsetLeft+go.clientLeft+gm;gk[gi.options.gutters[gj]]=go.clientWidth}return{fixedPos:dY(gn),gutterTotalWidth:gn.gutters.offsetWidth,gutterLeft:gl,gutterWidth:gk,wrapperWidth:gn.wrapper.clientWidth}}function cn(gt,gk,gs){var gp=gt.display,gv=gt.options.lineNumbers;var gi=gp.lineDiv,gu=gi.firstChild;function go(gx){var gw=gx.nextSibling;if(c1&&b8&&gt.display.currentWheelTarget==gx){gx.style.display="none"}else{gx.parentNode.removeChild(gx)}return gw}var gq=gp.view,gn=gp.viewFrom;for(var gl=0;gl<gq.length;gl++){var gm=gq[gl];if(gm.hidden){}else{if(!gm.node||gm.node.parentNode!=gi){var gj=aF(gt,gm,gn,gs);gi.insertBefore(gj,gu)}else{while(gu!=gm.node){gu=go(gu)}var gr=gv&&gk!=null&&gk<=gn&&gm.lineNumber;if(gm.changes){if(di(gm.changes,"gutter")>-1){gr=false}ab(gt,gm,gn,gs)}if(gr){d2(gm.lineNumber);gm.lineNumber.appendChild(document.createTextNode(et(gt.options,gn)))}gu=gm.node.nextSibling}}gn+=gm.size}while(gu){gu=go(gu)}}function ab(gi,gk,gm,gn){for(var gj=0;gj<gk.changes.length;gj++){var gl=gk.changes[gj];if(gl=="text"){fm(gi,gk)}else{if(gl=="gutter"){dg(gi,gk,gm,gn)}else{if(gl=="class"){dH(gk)}else{if(gl=="widget"){ao(gi,gk,gn)}}}}}gk.changes=null}function fI(gi){if(gi.node==gi.text){gi.node=f3("div",null,null,"position: relative");if(gi.text.parentNode){gi.text.parentNode.replaceChild(gi.node,gi.text)}gi.node.appendChild(gi.text);if(dL&&k<8){gi.node.style.zIndex=2}}return gi.node}function ew(gj){var gi=gj.bgClass?gj.bgClass+" "+(gj.line.bgClass||""):gj.line.bgClass;if(gi){gi+=" CodeMirror-linebackground"}if(gj.background){if(gi){gj.background.className=gi}else{gj.background.parentNode.removeChild(gj.background);gj.background=null}}else{if(gi){var gk=fI(gj);gj.background=gk.insertBefore(f3("div",null,gi),gk.firstChild)}}}function dW(gi,gj){var gk=gi.display.externalMeasured;if(gk&&gk.line==gj.line){gi.display.externalMeasured=null;gj.measure=gk.measure;return gk.built}return eS(gi,gj)}function fm(gi,gl){var gj=gl.text.className;var gk=dW(gi,gl);if(gl.text==gl.node){gl.node=gk.pre}gl.text.parentNode.replaceChild(gk.pre,gl.text);gl.text=gk.pre;if(gk.bgClass!=gl.bgClass||gk.textClass!=gl.textClass){gl.bgClass=gk.bgClass;gl.textClass=gk.textClass;dH(gl)}else{if(gj){gl.text.className=gj}}}function dH(gj){ew(gj);if(gj.line.wrapClass){fI(gj).className=gj.line.wrapClass}else{if(gj.node!=gj.text){gj.node.className=""}}var gi=gj.textClass?gj.textClass+" "+(gj.line.textClass||""):gj.line.textClass;gj.text.className=gi||""}function dg(gq,go,gn,gp){if(go.gutter){go.node.removeChild(go.gutter);go.gutter=null}var gl=go.line.gutterMarkers;if(gq.options.lineNumbers||gl){var gj=fI(go);var gm=go.gutter=f3("div",null,"CodeMirror-gutter-wrapper","left: "+(gq.options.fixedGutter?gp.fixedPos:-gp.gutterTotalWidth)+"px; width: "+gp.gutterTotalWidth+"px");gq.display.input.setUneditable(gm);gj.insertBefore(gm,go.text);if(go.line.gutterClass){gm.className+=" "+go.line.gutterClass}if(gq.options.lineNumbers&&(!gl||!gl["CodeMirror-linenumbers"])){go.lineNumber=gm.appendChild(f3("div",et(gq.options,gn),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+gp.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+gq.display.lineNumInnerWidth+"px"))}if(gl){for(var gk=0;gk<gq.options.gutters.length;++gk){var gi=gq.options.gutters[gk],gr=gl.hasOwnProperty(gi)&&gl[gi];if(gr){gm.appendChild(f3("div",[gr],"CodeMirror-gutter-elt","left: "+gp.gutterLeft[gi]+"px; width: "+gp.gutterWidth[gi]+"px"))}}}}}function ao(gi,gj,gm){if(gj.alignable){gj.alignable=null}for(var gl=gj.node.firstChild,gk;gl;gl=gk){var gk=gl.nextSibling;if(gl.className=="CodeMirror-linewidget"){gj.node.removeChild(gl)}}fu(gi,gj,gm)}function aF(gi,gk,gl,gm){var gj=dW(gi,gk);gk.text=gk.node=gj.pre;if(gj.bgClass){gk.bgClass=gj.bgClass}if(gj.textClass){gk.textClass=gj.textClass}dH(gk);dg(gi,gk,gl,gm);fu(gi,gk,gm);return gk.node}function fu(gi,gk,gl){f8(gi,gk.line,gk,gl,true);if(gk.rest){for(var gj=0;gj<gk.rest.length;gj++){f8(gi,gk.rest[gj],gk,gl,false)}}}function f8(gq,gr,gn,gp,gl){if(!gr.widgets){return}var gi=fI(gn);for(var gk=0,go=gr.widgets;gk<go.length;++gk){var gm=go[gk],gj=f3("div",[gm.node],"CodeMirror-linewidget");if(!gm.handleMouseEvents){gj.setAttribute("cm-ignore-events","true")}bG(gm,gj,gn,gp);gq.display.input.setUneditable(gj);if(gl&&gm.above){gi.insertBefore(gj,gn.gutter||gn.text)}else{gi.appendChild(gj)}ae(gm,"redraw")}}function bG(gl,gk,gi,gm){if(gl.noHScroll){(gi.alignable||(gi.alignable=[])).push(gk);var gj=gm.wrapperWidth;gk.style.left=gm.fixedPos+"px";if(!gl.coverGutter){gj-=gm.gutterTotalWidth;gk.style.paddingLeft=gm.gutterTotalWidth+"px"}gk.style.width=gj+"px"}if(gl.coverGutter){gk.style.zIndex=5;gk.style.position="relative";if(!gl.noHScroll){gk.style.marginLeft=-gm.gutterTotalWidth+"px"}}}var W=H.Pos=function(gi,gj){if(!(this instanceof W)){return new W(gi,gj)}this.line=gi;this.ch=gj};var cg=H.cmpPos=function(gj,gi){return gj.line-gi.line||gj.ch-gi.ch};function cj(gi){return W(gi.line,gi.ch)}function by(gj,gi){return cg(gj,gi)<0?gi:gj}function ar(gj,gi){return cg(gj,gi)<0?gj:gi}function r(gi){if(!gi.state.focused){gi.display.input.focus();cC(gi)}}function aj(gi){return gi.options.readOnly||gi.doc.cantEdit}var bn=null;function fZ(gw,gm,gk,gj,gv){var gu=gw.doc;gw.display.shift=false;if(!gj){gj=gu.sel}var gl=gw.state.pasteIncoming||gv=="paste";var gp=a1(gm),gi=null;if(gl&&gj.ranges.length>1){if(bn&&bn.join("\n")==gm){gi=gj.ranges.length%bn.length==0&&bT(bn,a1)}else{if(gp.length==gj.ranges.length){gi=bT(gp,function(gx){return[gx]})}}}for(var gn=gj.ranges.length-1;gn>=0;gn--){var go=gj.ranges[gn];var gt=go.from(),gs=go.to();if(go.empty()){if(gk&&gk>0){gt=W(gt.line,gt.ch-gk)}else{if(gw.state.overwrite&&!gl){gs=W(gs.line,Math.min(fg(gu,gs.line).text.length,gs.ch+fH(gp).length))}}}var gq=gw.curOp.updateInput;var gr={from:gt,to:gs,text:gi?gi[gn%gi.length]:gp,origin:gv||(gl?"paste":gw.state.cutIncoming?"cut":"+input")};bh(gw.doc,gr);ae(gw,"inputRead",gw,gr)}if(gm&&!gl){fW(gw,gm)}fG(gw);gw.curOp.updateInput=gq;gw.curOp.typing=true;gw.state.pasteIncoming=gw.state.cutIncoming=false}function bb(gk,gi){var gj=gk.clipboardData&&gk.clipboardData.getData("text/plain");if(gj){gk.preventDefault();cN(gi,function(){fZ(gi,gj,0,null,"paste")});return true}}function fW(gi,gm){if(!gi.options.electricChars||!gi.options.smartIndent){return}var gn=gi.doc.sel;for(var gl=gn.ranges.length-1;gl>=0;gl--){var gj=gn.ranges[gl];if(gj.head.ch>100||(gl&&gn.ranges[gl-1].head.line==gj.head.line)){continue}var go=gi.getModeAt(gj.head);var gp=false;if(go.electricChars){for(var gk=0;gk<go.electricChars.length;gk++){if(gm.indexOf(go.electricChars.charAt(gk))>-1){gp=ad(gi,gj.head.line,"smart");break}}}else{if(go.electricInput){if(go.electricInput.test(fg(gi.doc,gj.head.line).text.slice(0,gj.head.ch))){gp=ad(gi,gj.head.line,"smart")}}}if(gp){ae(gi,"electricInput",gi,gj.head.line)}}}function dk(gi){var gn=[],gk=[];for(var gl=0;gl<gi.doc.sel.ranges.length;gl++){var gj=gi.doc.sel.ranges[gl].head.line;var gm={anchor:W(gj,0),head:W(gj+1,0)};gk.push(gm);gn.push(gi.getRange(gm.anchor,gm.head))}return{text:gn,ranges:gk}}function fQ(gi){gi.setAttribute("autocorrect","off");gi.setAttribute("autocapitalize","off");gi.setAttribute("spellcheck","false")}function Y(gi){this.cm=gi;this.prevInput="";this.pollingFast=false;this.polling=new gh();this.inaccurateSelection=false;this.hasSelection=false;this.composing=null}function aX(){var gi=f3("textarea",null,null,"position: absolute; padding: 0; width: 1px; height: 1em; outline: none");var gj=f3("div",[gi],null,"overflow: hidden; position: relative; width: 3px; height: 0px;");if(c1){gi.style.width="1000px"}else{gi.setAttribute("wrap","off")}if(e2){gi.style.border="1px solid black"}fQ(gi);return gj}Y.prototype=aN({init:function(gk){var gj=this,gi=this.cm;var gn=this.wrapper=aX();var gl=this.textarea=gn.firstChild;gk.wrapper.insertBefore(gn,gk.wrapper.firstChild);if(e2){gl.style.width="0px"}bY(gl,"input",function(){if(dL&&k>=9&&gj.hasSelection){gj.hasSelection=null}gj.poll()});bY(gl,"paste",function(go){if(bb(go,gi)){return true}gi.state.pasteIncoming=true;gj.fastPoll()});function gm(gp){if(gi.somethingSelected()){bn=gi.getSelections();if(gj.inaccurateSelection){gj.prevInput="";gj.inaccurateSelection=false;gl.value=bn.join("\n");dM(gl)}}else{if(!gi.options.lineWiseCopyCut){return}else{var go=dk(gi);bn=go.text;if(gp.type=="cut"){gi.setSelections(go.ranges,null,Z)}else{gj.prevInput="";gl.value=go.text.join("\n");dM(gl)}}}if(gp.type=="cut"){gi.state.cutIncoming=true}}bY(gl,"cut",gm);bY(gl,"copy",gm);bY(gk.scroller,"paste",function(go){if(bc(gk,go)){return}gi.state.pasteIncoming=true;gj.focus()});bY(gk.lineSpace,"selectstart",function(go){if(!bc(gk,go)){cH(go)}});bY(gl,"compositionstart",function(){var go=gi.getCursor("from");gj.composing={start:go,range:gi.markText(go,gi.getCursor("to"),{className:"CodeMirror-composing"})}});bY(gl,"compositionend",function(){if(gj.composing){gj.poll();gj.composing.range.clear();gj.composing=null}})},prepareSelection:function(){var gj=this.cm,gn=gj.display,gm=gj.doc;var gi=fJ(gj);if(gj.options.moveInputWithCursor){var go=dV(gj,gm.sel.primary().head,"div");var gk=gn.wrapper.getBoundingClientRect(),gl=gn.lineDiv.getBoundingClientRect();gi.teTop=Math.max(0,Math.min(gn.wrapper.clientHeight-10,go.top+gl.top-gk.top));gi.teLeft=Math.max(0,Math.min(gn.wrapper.clientWidth-10,go.left+gl.left-gk.left))}return gi},showSelection:function(gk){var gi=this.cm,gj=gi.display;bS(gj.cursorDiv,gk.cursors);bS(gj.selectionDiv,gk.selection);if(gk.teTop!=null){this.wrapper.style.top=gk.teTop+"px";this.wrapper.style.left=gk.teLeft+"px"}},reset:function(gm){if(this.contextMenuPending){return}var gj,gl,gi=this.cm,go=gi.doc;if(gi.somethingSelected()){this.prevInput="";var gk=go.sel.primary();gj=db&&(gk.to().line-gk.from().line>100||(gl=gi.getSelection()).length>1000);var gn=gj?"-":gl||gi.getSelection();this.textarea.value=gn;if(gi.state.focused){dM(this.textarea)}if(dL&&k>=9){this.hasSelection=gn}}else{if(!gm){this.prevInput=this.textarea.value="";if(dL&&k>=9){this.hasSelection=null}}}this.inaccurateSelection=gj},getField:function(){return this.textarea},supportsTouch:function(){return false},focus:function(){if(this.cm.options.readOnly!="nocursor"&&(!eh||dP()!=this.textarea)){try{this.textarea.focus()}catch(gi){}}},blur:function(){this.textarea.blur()},resetPosition:function(){this.wrapper.style.top=this.wrapper.style.left=0},receivedFocus:function(){this.slowPoll()},slowPoll:function(){var gi=this;if(gi.pollingFast){return}gi.polling.set(this.cm.options.pollInterval,function(){gi.poll();if(gi.cm.state.focused){gi.slowPoll()}})},fastPoll:function(){var gj=false,gi=this;gi.pollingFast=true;function gk(){var gl=gi.poll();if(!gl&&!gj){gj=true;gi.polling.set(60,gk)}else{gi.pollingFast=false;gi.slowPoll()}}gi.polling.set(20,gk)},poll:function(){var gi=this.cm,gl=this.textarea,gm=this.prevInput;if(this.contextMenuPending||!gi.state.focused||(bt(gl)&&!gm)||aj(gi)||gi.options.disableInput||gi.state.keySeq){return false}var go=gl.value;if(go==gm&&!gi.somethingSelected()){return false}if(dL&&k>=9&&this.hasSelection===go||b8&&/[\uf700-\uf7ff]/.test(go)){gi.display.input.reset();return false}if(gi.doc.sel==gi.display.selForContextMenu){var gn=go.charCodeAt(0);if(gn==8203&&!gm){gm="\u200b"}if(gn==8666){this.reset();return this.cm.execCommand("undo")}}var gp=0,gj=Math.min(gm.length,go.length);while(gp<gj&&gm.charCodeAt(gp)==go.charCodeAt(gp)){++gp}var gk=this;cN(gi,function(){fZ(gi,go.slice(gp),gm.length-gp,null,gk.composing?"*compose":null);if(go.length>1000||go.indexOf("\n")>-1){gl.value=gk.prevInput=""}else{gk.prevInput=go}if(gk.composing){gk.composing.range.clear();gk.composing.range=gi.markText(gk.composing.start,gi.getCursor("to"),{className:"CodeMirror-composing"})}});return true},ensurePolled:function(){if(this.pollingFast&&this.poll()){this.pollingFast=false}},onKeyPress:function(){if(dL&&k>=9){this.hasSelection=null}this.fastPoll()},onContextMenu:function(gn){var gs=this,gt=gs.cm,gp=gt.display,gj=gs.textarea;var gr=co(gt,gn),gi=gp.scroller.scrollTop;if(!gr||d4){return}var gm=gt.options.resetSelectionOnContextMenu;if(gm&&gt.doc.sel.contains(gr)==-1){c3(gt,bV)(gt.doc,eT(gr),Z)}var go=gj.style.cssText;gs.wrapper.style.position="absolute";gj.style.cssText="position: fixed; width: 30px; height: 30px; top: "+(gn.clientY-5)+"px; left: "+(gn.clientX-5)+"px; z-index: 1000; background: "+(dL?"rgba(255, 255, 255, .05)":"transparent")+"; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";if(c1){var gu=window.scrollY}gp.input.focus();if(c1){window.scrollTo(null,gu)}gp.input.reset();if(!gt.somethingSelected()){gj.value=gs.prevInput=" "}gs.contextMenuPending=true;gp.selForContextMenu=gt.doc.sel;clearTimeout(gp.detectingSelectAll);function gl(){if(gj.selectionStart!=null){var gv=gt.somethingSelected();var gw="\u200b"+(gv?gj.value:"");gj.value="\u21da";gj.value=gw;gs.prevInput=gv?"":"\u200b";gj.selectionStart=1;gj.selectionEnd=gw.length;gp.selForContextMenu=gt.doc.sel}}function gq(){gs.contextMenuPending=false;gs.wrapper.style.position="relative";gj.style.cssText=go;if(dL&&k<9){gp.scrollbars.setScrollTop(gp.scroller.scrollTop=gi)}if(gj.selectionStart!=null){if(!dL||(dL&&k<9)){gl()}var gv=0,gw=function(){if(gp.selForContextMenu==gt.doc.sel&&gj.selectionStart==0&&gj.selectionEnd>0&&gs.prevInput=="\u200b"){c3(gt,eE.selectAll)(gt)}else{if(gv++<10){gp.detectingSelectAll=setTimeout(gw,500)}else{gp.input.reset()}}};gp.detectingSelectAll=setTimeout(gw,200)}}if(dL&&k>=9){gl()}if(ga){es(gn);var gk=function(){ee(window,"mouseup",gk);setTimeout(gq,20)};bY(window,"mouseup",gk)}else{setTimeout(gq,50)}},setUneditable:fV,needsContentAttribute:false},Y.prototype);function dw(gi){this.cm=gi;this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null;this.polling=new gh();this.gracePeriod=false}dw.prototype=aN({init:function(gl){var gk=this,gi=gk.cm;var gm=gk.div=gl.lineDiv;gm.contentEditable="true";fQ(gm);bY(gm,"paste",function(gn){bb(gn,gi)});bY(gm,"compositionstart",function(gr){var gq=gr.data;gk.composing={sel:gi.doc.sel,data:gq,startData:gq};if(!gq){return}var go=gi.doc.sel.primary();var gn=gi.getLine(go.head.line);var gp=gn.indexOf(gq,Math.max(0,go.head.ch-gq.length));if(gp>-1&&gp<=go.head.ch){gk.composing.sel=eT(W(go.head.line,gp),W(go.head.line,gp+gq.length))}});bY(gm,"compositionupdate",function(gn){gk.composing.data=gn.data});bY(gm,"compositionend",function(go){var gn=gk.composing;if(!gn){return}if(go.data!=gn.startData&&!/\u200b/.test(go.data)){gn.data=go.data}setTimeout(function(){if(!gn.handled){gk.applyComposition(gn)}if(gk.composing==gn){gk.composing=null}},50)});bY(gm,"touchstart",function(){gk.forceCompositionEnd()});bY(gm,"input",function(){if(gk.composing){return}if(!gk.pollContent()){cN(gk.cm,function(){ah(gi)})}});function gj(gq){if(gi.somethingSelected()){bn=gi.getSelections();if(gq.type=="cut"){gi.replaceSelection("",null,"cut")}}else{if(!gi.options.lineWiseCopyCut){return}else{var go=dk(gi);bn=go.text;if(gq.type=="cut"){gi.operation(function(){gi.setSelections(go.ranges,0,Z);gi.replaceSelection("",null,"cut")})}}}if(gq.clipboardData&&!e2){gq.preventDefault();gq.clipboardData.clearData();gq.clipboardData.setData("text/plain",bn.join("\n"))}else{var gp=aX(),gr=gp.firstChild;gi.display.lineSpace.insertBefore(gp,gi.display.lineSpace.firstChild);gr.value=bn.join("\n");var gn=document.activeElement;dM(gr);setTimeout(function(){gi.display.lineSpace.removeChild(gp);gn.focus()},50)}}bY(gm,"copy",gj);bY(gm,"cut",gj)},prepareSelection:function(){var gi=fJ(this.cm,false);gi.focus=this.cm.state.focused;return gi},showSelection:function(gi){if(!gi||!this.cm.display.view.length){return}if(gi.focus){this.showPrimarySelection()}this.showMultipleSelections(gi)},showPrimarySelection:function(){var gm=window.getSelection(),gp=this.cm.doc.sel.primary();var gn=az(this.cm,gm.anchorNode,gm.anchorOffset);var gr=az(this.cm,gm.focusNode,gm.focusOffset);if(gn&&!gn.bad&&gr&&!gr.bad&&cg(ar(gn,gr),gp.from())==0&&cg(by(gn,gr),gp.to())==0){return}var gl=cA(this.cm,gp.from());var gq=cA(this.cm,gp.to());if(!gl&&!gq){return}var gt=this.cm.display.view;var go=gm.rangeCount&&gm.getRangeAt(0);if(!gl){gl={node:gt[0].measure.map[2],offset:0}}else{if(!gq){var gk=gt[gt.length-1].measure;var gj=gk.maps?gk.maps[gk.maps.length-1]:gk.map;gq={node:gj[gj.length-1],offset:gj[gj.length-2]-gj[gj.length-3]}}}try{var gi=cm(gl.node,gl.offset,gq.offset,gq.node)}catch(gs){}if(gi){gm.removeAllRanges();gm.addRange(gi);if(go&&gm.anchorNode==null){gm.addRange(go)}else{if(cp){this.startGracePeriod()}}}this.rememberSelection()},startGracePeriod:function(){var gi=this;clearTimeout(this.gracePeriod);this.gracePeriod=setTimeout(function(){gi.gracePeriod=false;if(gi.selectionChanged()){gi.cm.operation(function(){gi.cm.curOp.selectionChanged=true})}},20)},showMultipleSelections:function(gi){bS(this.cm.display.cursorDiv,gi.cursors);bS(this.cm.display.selectionDiv,gi.selection)},rememberSelection:function(){var gi=window.getSelection();this.lastAnchorNode=gi.anchorNode;this.lastAnchorOffset=gi.anchorOffset;this.lastFocusNode=gi.focusNode;this.lastFocusOffset=gi.focusOffset},selectionInEditor:function(){var gj=window.getSelection();if(!gj.rangeCount){return false}var gi=gj.getRangeAt(0).commonAncestorContainer;return gb(this.div,gi)},focus:function(){if(this.cm.options.readOnly!="nocursor"){this.div.focus()}},blur:function(){this.div.blur()},getField:function(){return this.div},supportsTouch:function(){return true},receivedFocus:function(){var gi=this;if(this.selectionInEditor()){this.pollSelection()}else{cN(this.cm,function(){gi.cm.curOp.selectionChanged=true})}function gj(){if(gi.cm.state.focused){gi.pollSelection();gi.polling.set(gi.cm.options.pollInterval,gj)}}this.polling.set(this.cm.options.pollInterval,gj)},selectionChanged:function(){var gi=window.getSelection();return gi.anchorNode!=this.lastAnchorNode||gi.anchorOffset!=this.lastAnchorOffset||gi.focusNode!=this.lastFocusNode||gi.focusOffset!=this.lastFocusOffset},pollSelection:function(){if(!this.composing&&!this.gracePeriod&&this.selectionChanged()){var gl=window.getSelection(),gi=this.cm;this.rememberSelection();var gj=az(gi,gl.anchorNode,gl.anchorOffset);var gk=az(gi,gl.focusNode,gl.focusOffset);if(gj&&gk){cN(gi,function(){bV(gi.doc,eT(gj,gk),Z);if(gj.bad||gk.bad){gi.curOp.selectionChanged=true}})}}},pollContent:function(){var gs=this.cm,gC=gs.display,gA=gs.doc.sel.primary();var gB=gA.from(),gm=gA.to();if(gB.line<gC.viewFrom||gm.line>gC.viewTo-1){return false}var gp;if(gB.line==gC.viewFrom||(gp=ds(gs,gB.line))==0){var gn=bO(gC.view[0].line);var gr=gC.view[0].node}else{var gn=bO(gC.view[gp].line);var gr=gC.view[gp-1].node.nextSibling}var gz=ds(gs,gm.line);if(gz==gC.view.length-1){var gu=gC.viewTo-1;var gx=gC.lineDiv.lastChild}else{var gu=bO(gC.view[gz+1].line)-1;var gx=gC.view[gz+1].node.previousSibling}var gD=a1(f0(gs,gr,gx,gn,gu));var gw=f5(gs.doc,W(gn,0),W(gu,fg(gs.doc,gu).text.length));while(gD.length>1&&gw.length>1){if(fH(gD)==fH(gw)){gD.pop();gw.pop();gu--}else{if(gD[0]==gw[0]){gD.shift();gw.shift();gn++}else{break}}}var gy=0,gk=0;var gt=gD[0],gj=gw[0],gi=Math.min(gt.length,gj.length);while(gy<gi&&gt.charCodeAt(gy)==gj.charCodeAt(gy)){++gy}var gq=fH(gD),gE=fH(gw);var gl=Math.min(gq.length-(gD.length==1?gy:0),gE.length-(gw.length==1?gy:0));while(gk<gl&&gq.charCodeAt(gq.length-gk-1)==gE.charCodeAt(gE.length-gk-1)){++gk}gD[gD.length-1]=gq.slice(0,gq.length-gk);gD[0]=gD[0].slice(gy);var go=W(gn,gy);var gv=W(gu,gw.length?fH(gw).length-gk:0);if(gD.length>1||gD[0]||cg(go,gv)){a2(gs.doc,gD,go,gv,"+input");return true}},ensurePolled:function(){this.forceCompositionEnd()},reset:function(){this.forceCompositionEnd()},forceCompositionEnd:function(){if(!this.composing||this.composing.handled){return}this.applyComposition(this.composing);this.composing.handled=true;this.div.blur();this.div.focus()},applyComposition:function(gi){if(gi.data&&gi.data!=gi.startData){c3(this.cm,fZ)(this.cm,gi.data,0,gi.sel)}},setUneditable:function(gi){gi.setAttribute("contenteditable","false")},onKeyPress:function(gi){gi.preventDefault();c3(this.cm,fZ)(this.cm,String.fromCharCode(gi.charCode==null?gi.keyCode:gi.charCode),0)},onContextMenu:fV,resetPosition:fV,needsContentAttribute:true},dw.prototype);function cA(go,gm){var gn=fc(go,gm.line);if(!gn||gn.hidden){return null}var gq=fg(go.doc,gm.line);var gj=cu(gn,gq,gm.line);var gk=a(gq),gl="left";if(gk){var gi=aG(gk,gm.ch);gl=gi%2?"right":"left"}var gp=aL(gj.map,gm.ch,gl);gp.offset=gp.collapse=="right"?gp.end:gp.start;return gp}function eu(gj,gi){if(gi){gj.bad=true}return gj}function az(gi,gl,gn){var gm;if(gl==gi.display.lineDiv){gm=gi.display.lineDiv.childNodes[gn];if(!gm){return eu(gi.clipPos(W(gi.display.viewTo-1)),true)}gl=null;gn=0}else{for(gm=gl;;gm=gm.parentNode){if(!gm||gm==gi.display.lineDiv){return null}if(gm.parentNode&&gm.parentNode==gi.display.lineDiv){break}}}for(var gk=0;gk<gi.display.view.length;gk++){var gj=gi.display.view[gk];if(gj.node==gm){return aa(gj,gl,gn)}}}function aa(gq,gm,go){var gk=gq.text.firstChild,gl=false;if(!gm||!gb(gk,gm)){return eu(W(bO(gq.line),0),true)}if(gm==gk){gl=true;gm=gk.childNodes[go];go=0;if(!gm){var gw=gq.rest?fH(gq.rest):gq.line;return eu(W(bO(gw),gw.text.length),gl)}}var gn=gm.nodeType==3?gm:null,gu=gm;if(!gn&&gm.childNodes.length==1&&gm.firstChild.nodeType==3){gn=gm.firstChild;if(go){go=gn.nodeValue.length}}while(gu.parentNode!=gk){gu=gu.parentNode}var gj=gq.measure,gs=gj.maps;function gp(gz,gE,gB){for(var gD=-1;gD<(gs?gs.length:0);gD++){var gy=gD<0?gj.map:gs[gD];for(var gC=0;gC<gy.length;gC+=3){var gA=gy[gC+2];if(gA==gz||gA==gE){var gF=bO(gD<0?gq.line:gq.rest[gD]);var gx=gy[gC]+gB;if(gB<0||gA!=gz){gx=gy[gC+(gB?1:0)]}return W(gF,gx)}}}}var gv=gp(gn,gu,go);if(gv){return eu(gv,gl)}for(var gi=gu.nextSibling,gr=gn?gn.nodeValue.length-go:0;gi;gi=gi.nextSibling){gv=gp(gi,gi.firstChild,0);if(gv){return eu(W(gv.line,gv.ch-gr),gl)}else{gr+=gi.textContent.length}}for(var gt=gu.previousSibling,gr=go;gt;gt=gt.previousSibling){gv=gp(gt,gt.firstChild,-1);if(gv){return eu(W(gv.line,gv.ch+gr),gl)}else{gr+=gi.textContent.length}}}function f0(gp,gn,go,gk,gi){var gq="",gj=false;function gl(gr){return function(gs){return gs.id==gr}}function gm(gv){if(gv.nodeType==1){var gs=gv.getAttribute("cm-text");if(gs!=null){if(gs==""){gs=gv.textContent.replace(/\u200b/g,"")}gq+=gs;return}var gu=gv.getAttribute("cm-marker"),gr;if(gu){var gw=gp.findMarks(W(gk,0),W(gi+1,0),gl(+gu));if(gw.length&&(gr=gw[0].find())){gq+=f5(gp.doc,gr.from,gr.to).join("\n")}return}if(gv.getAttribute("contenteditable")=="false"){return}for(var gt=0;gt<gv.childNodes.length;gt++){gm(gv.childNodes[gt])}if(/^(pre|div|p)$/i.test(gv.nodeName)){gj=true}}else{if(gv.nodeType==3){var gx=gv.nodeValue;if(!gx){return}if(gj){gq+="\n";gj=false}gq+=gx}}}for(;;){gm(gn);if(gn==go){break}gn=gn.nextSibling}return gq}H.inputStyles={textarea:Y,contenteditable:dw};function f4(gi,gj){this.ranges=gi;this.primIndex=gj}f4.prototype={primary:function(){return this.ranges[this.primIndex]},equals:function(gi){if(gi==this){return true}if(gi.primIndex!=this.primIndex||gi.ranges.length!=this.ranges.length){return false}for(var gk=0;gk<this.ranges.length;gk++){var gj=this.ranges[gk],gl=gi.ranges[gk];if(cg(gj.anchor,gl.anchor)!=0||cg(gj.head,gl.head)!=0){return false}}return true},deepCopy:function(){for(var gi=[],gj=0;gj<this.ranges.length;gj++){gi[gj]=new dZ(cj(this.ranges[gj].anchor),cj(this.ranges[gj].head))}return new f4(gi,this.primIndex)},somethingSelected:function(){for(var gi=0;gi<this.ranges.length;gi++){if(!this.ranges[gi].empty()){return true}}return false},contains:function(gl,gi){if(!gi){gi=gl}for(var gk=0;gk<this.ranges.length;gk++){var gj=this.ranges[gk];if(cg(gi,gj.from())>=0&&cg(gl,gj.to())<=0){return gk}}return -1}};function dZ(gi,gj){this.anchor=gi;this.head=gj}dZ.prototype={from:function(){return ar(this.anchor,this.head)},to:function(){return by(this.anchor,this.head)},empty:function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch}};function cx(gi,gp){var gk=gi[gp];gi.sort(function(gs,gr){return cg(gs.from(),gr.from())});gp=di(gi,gk);for(var gm=1;gm<gi.length;gm++){var gq=gi[gm],gj=gi[gm-1];if(cg(gj.to(),gq.from())>=0){var gn=ar(gj.from(),gq.from()),go=by(gj.to(),gq.to());var gl=gj.empty()?gq.from()==gq.head:gj.from()==gj.head;if(gm<=gp){--gp}gi.splice(--gm,2,new dZ(gl?go:gn,gl?gn:go))}}return new f4(gi,gp)}function eT(gi,gj){return new f4([new dZ(gi,gj||gi)],0)}function c6(gi,gj){return Math.max(gi.first,Math.min(gj,gi.first+gi.size-1))}function fK(gj,gk){if(gk.line<gj.first){return W(gj.first,0)}var gi=gj.first+gj.size-1;if(gk.line>gi){return W(gi,fg(gj,gi).text.length)}return ft(gk,fg(gj,gk.line).text.length)}function ft(gk,gj){var gi=gk.ch;if(gi==null||gi>gj){return W(gk.line,gj)}else{if(gi<0){return W(gk.line,0)}else{return gk}}}function ca(gj,gi){return gi>=gj.first&&gi<gj.first+gj.size}function d1(gk,gl){for(var gi=[],gj=0;gj<gl.length;gj++){gi[gj]=fK(gk,gl[gj])}return gi}function fw(gn,gj,gm,gi){if(gn.cm&&gn.cm.display.shift||gn.extend){var gl=gj.anchor;if(gi){var gk=cg(gm,gl)<0;if(gk!=(cg(gi,gl)<0)){gl=gm;gm=gi}else{if(gk!=(cg(gm,gi)<0)){gm=gi}}}return new dZ(gl,gm)}else{return new dZ(gi||gm,gm)}}function fX(gl,gk,gi,gj){bV(gl,new f4([fw(gl,gl.sel.primary(),gk,gi)],0),gj)}function aw(gn,gm,gk){for(var gj=[],gl=0;gl<gn.sel.ranges.length;gl++){gj[gl]=fw(gn,gn.sel.ranges[gl],gm[gl],null)}var gi=cx(gj,gn.sel.primIndex);bV(gn,gi,gk)}function e(gm,gl,gj,gk){var gi=gm.sel.ranges.slice(0);gi[gl]=gj;bV(gm,cx(gi,gm.sel.primIndex),gk)}function F(gl,gj,gk,gi){bV(gl,eT(gj,gk),gi)}function c(gk,gi){var gj={ranges:gi.ranges,update:function(gl){this.ranges=[];for(var gm=0;gm<gl.length;gm++){this.ranges[gm]=new dZ(fK(gk,gl[gm].anchor),fK(gk,gl[gm].head))}}};aE(gk,"beforeSelectionChange",gk,gj);if(gk.cm){aE(gk.cm,"beforeSelectionChange",gk.cm,gj)}if(gj.ranges!=gi.ranges){return cx(gj.ranges,gj.ranges.length-1)}else{return gi}}function e8(gm,gl,gj){var gi=gm.history.done,gk=fH(gi);if(gk&&gk.ranges){gi[gi.length-1]=gl;eq(gm,gl,gj)}else{bV(gm,gl,gj)}}function bV(gk,gj,gi){eq(gk,gj,gi);gc(gk,gk.sel,gk.cm?gk.cm.curOp.id:NaN,gi)}function eq(gl,gk,gj){if(fj(gl,"beforeSelectionChange")||gl.cm&&fj(gl.cm,"beforeSelectionChange")){gk=c(gl,gk)}var gi=gj&&gj.bias||(cg(gk.primary().head,gl.sel.primary().head)<0?-1:1);da(gl,n(gl,gk,gi,true));if(!(gj&&gj.scroll===false)&&gl.cm){fG(gl.cm)}}function da(gj,gi){if(gi.equals(gj.sel)){return}gj.sel=gi;if(gj.cm){gj.cm.curOp.updateInput=gj.cm.curOp.selectionChanged=true;V(gj.cm)}ae(gj,"cursorActivity",gj)}function ez(gi){da(gi,n(gi,gi.sel,null,false),Z)}function n(gq,gi,gn,go){var gk;for(var gl=0;gl<gi.ranges.length;gl++){var gm=gi.ranges[gl];var gp=bW(gq,gm.anchor,gn,go);var gj=bW(gq,gm.head,gn,go);if(gk||gp!=gm.anchor||gj!=gm.head){if(!gk){gk=gi.ranges.slice(0,gl)}gk[gl]=new dZ(gp,gj)}}return gk?cx(gk,gi.primIndex):gi}function bW(gr,gq,gn,go){var gs=false,gk=gq;var gl=gn||1;gr.cantEdit=false;search:for(;;){var gt=fg(gr,gk.line);if(gt.markedSpans){for(var gm=0;gm<gt.markedSpans.length;++gm){var gi=gt.markedSpans[gm],gj=gi.marker;if((gi.from==null||(gj.inclusiveLeft?gi.from<=gk.ch:gi.from<gk.ch))&&(gi.to==null||(gj.inclusiveRight?gi.to>=gk.ch:gi.to>gk.ch))){if(go){aE(gj,"beforeCursorEnter");if(gj.explicitlyCleared){if(!gt.markedSpans){break}else{--gm;continue}}}if(!gj.atomic){continue}var gp=gj.find(gl<0?-1:1);if(cg(gp,gk)==0){gp.ch+=gl;if(gp.ch<0){if(gp.line>gr.first){gp=fK(gr,W(gp.line-1))}else{gp=null}}else{if(gp.ch>gt.text.length){if(gp.line<gr.first+gr.size-1){gp=W(gp.line+1,0)}else{gp=null}}}if(!gp){if(gs){if(!go){return bW(gr,gq,gn,true)}gr.cantEdit=true;return W(gr.first,0)}gs=true;gp=gq;gl=-gl}}gk=gp;continue search}}}return gk}}function bD(gi){gi.display.input.showSelection(gi.display.input.prepareSelection())}function fJ(gp,gi){var go=gp.doc,gq={};var gn=gq.cursors=document.createDocumentFragment();var gj=gq.selection=document.createDocumentFragment();for(var gl=0;gl<go.sel.ranges.length;gl++){if(gi===false&&gl==go.sel.primIndex){continue}var gm=go.sel.ranges[gl];var gk=gm.empty();if(gk||gp.options.showCursorWhenSelecting){A(gp,gm,gn)}if(!gk){bE(gp,gm,gj)}}return gq}function A(gi,gl,gk){var gn=dV(gi,gl.head,"div",null,null,!gi.options.singleCursorHeightPerLine);var gm=gk.appendChild(f3("div","\u00a0","CodeMirror-cursor"));gm.style.left=gn.left+"px";gm.style.top=gn.top+"px";gm.style.height=Math.max(0,gn.bottom-gn.top)*gi.options.cursorHeight+"px";if(gn.other){var gj=gk.appendChild(f3("div","\u00a0","CodeMirror-cursor CodeMirror-secondarycursor"));gj.style.display="";gj.style.left=gn.other.left+"px";gj.style.top=gn.other.top+"px";gj.style.height=(gn.other.bottom-gn.other.top)*0.85+"px"}}function bE(gm,gs,gn){var gv=gm.display,gz=gm.doc;var gi=document.createDocumentFragment();var gr=e6(gm.display),gl=gr.left;var gw=Math.max(gv.sizerWidth,dm(gm)-gv.sizer.offsetLeft)-gr.right;function gt(gD,gC,gB,gA){if(gC<0){gC=0}gC=Math.round(gC);gA=Math.round(gA);gi.appendChild(f3("div",null,"CodeMirror-selected","position: absolute; left: "+gD+"px; top: "+gC+"px; width: "+(gB==null?gw-gD:gB)+"px; height: "+(gA-gC)+"px"))}function gj(gB,gD,gG){var gC=fg(gz,gB);var gE=gC.text.length;var gH,gA;function gF(gJ,gI){return cK(gm,W(gB,gJ),"div",gC,gI)}d5(a(gC),gD||0,gG==null?gE:gG,function(gP,gO,gI){var gL=gF(gP,"left"),gM,gN,gK;if(gP==gO){gM=gL;gN=gK=gL.left}else{gM=gF(gO-1,"right");if(gI=="rtl"){var gJ=gL;gL=gM;gM=gJ}gN=gL.left;gK=gM.right}if(gD==null&&gP==0){gN=gl}if(gM.top-gL.top>3){gt(gN,gL.top,null,gL.bottom);gN=gl;if(gL.bottom<gM.top){gt(gN,gL.bottom,null,gM.top)}}if(gG==null&&gO==gE){gK=gw}if(!gH||gL.top<gH.top||gL.top==gH.top&&gL.left<gH.left){gH=gL}if(!gA||gM.bottom>gA.bottom||gM.bottom==gA.bottom&&gM.right>gA.right){gA=gM}if(gN<gl+1){gN=gl}gt(gN,gM.top,gK-gN,gM.bottom)});return{start:gH,end:gA}}var gy=gs.from(),gx=gs.to();if(gy.line==gx.line){gj(gy.line,gy.ch,gx.ch)}else{var gk=fg(gz,gy.line),gp=fg(gz,gx.line);var go=y(gk)==y(gp);var gq=gj(gy.line,gy.ch,go?gk.text.length+1:null).end;var gu=gj(gx.line,go?0:null,gx.ch).start;if(go){if(gq.top<gu.top-2){gt(gq.right,gq.top,null,gq.bottom);gt(gl,gu.top,gu.left,gu.bottom)}else{gt(gq.right,gq.top,gu.left-gq.right,gq.bottom)}}if(gq.bottom<gu.top){gt(gl,gq.bottom,null,gu.top)}}gn.appendChild(gi)}function o(gi){if(!gi.state.focused){return}var gk=gi.display;clearInterval(gk.blinker);var gj=true;gk.cursorDiv.style.visibility="";if(gi.options.cursorBlinkRate>0){gk.blinker=setInterval(function(){gk.cursorDiv.style.visibility=(gj=!gj)?"":"hidden"},gi.options.cursorBlinkRate)}else{if(gi.options.cursorBlinkRate<0){gk.cursorDiv.style.visibility="hidden"}}}function eg(gi,gj){if(gi.doc.mode.startState&&gi.doc.frontier<gi.display.viewTo){gi.state.highlight.set(gj,cw(cQ,gi))}}function cQ(gi){var gm=gi.doc;if(gm.frontier<gm.first){gm.frontier=gm.first}if(gm.frontier>=gi.display.viewTo){return}var gk=+new Date+gi.options.workTime;var gl=b4(gm.mode,dD(gi,gm.frontier));var gj=[];gm.iter(gm.frontier,Math.min(gm.first+gm.size,gi.display.viewTo+500),function(gn){if(gm.frontier>=gi.display.viewFrom){var gq=gn.styles;var gs=fA(gi,gn,gl,true);gn.styles=gs.styles;var gp=gn.styleClasses,gr=gs.classes;if(gr){gn.styleClasses=gr}else{if(gp){gn.styleClasses=null}}var gt=!gq||gq.length!=gn.styles.length||gp!=gr&&(!gp||!gr||gp.bgClass!=gr.bgClass||gp.textClass!=gr.textClass);for(var go=0;!gt&&go<gq.length;++go){gt=gq[go]!=gn.styles[go]}if(gt){gj.push(gm.frontier)}gn.stateAfter=b4(gm.mode,gl)}else{dy(gi,gn.text,gl);gn.stateAfter=gm.frontier%5==0?b4(gm.mode,gl):null}++gm.frontier;if(+new Date>gk){eg(gi,gi.options.workDelay);return true}});if(gj.length){cN(gi,function(){for(var gn=0;gn<gj.length;gn++){R(gi,gj[gn],"text")}})}}function cz(go,gi,gl){var gj,gm,gn=go.doc;var gk=gl?-1:gi-(go.doc.mode.innerMode?1000:100);for(var gr=gi;gr>gk;--gr){if(gr<=gn.first){return gn.first}var gq=fg(gn,gr-1);if(gq.stateAfter&&(!gl||gr<=gn.frontier)){return gr}var gp=bU(gq.text,null,go.options.tabSize);if(gm==null||gj>gp){gm=gr-1;gj=gp}}return gm}function dD(gi,go,gj){var gm=gi.doc,gl=gi.display;if(!gm.mode.startState){return true}var gn=cz(gi,go,gj),gk=gn>gm.first&&fg(gm,gn-1).stateAfter;if(!gk){gk=b1(gm.mode)}else{gk=b4(gm.mode,gk)}gm.iter(gn,go,function(gp){dy(gi,gp.text,gk);var gq=gn==go-1||gn%5==0||gn>=gl.viewFrom&&gn<gl.viewTo;gp.stateAfter=gq?b4(gm.mode,gk):null;++gn});if(gj){gm.frontier=gn}return gk}function e9(gi){return gi.lineSpace.offsetTop}function bJ(gi){return gi.mover.offsetHeight-gi.lineSpace.offsetHeight}function e6(gl){if(gl.cachedPaddingH){return gl.cachedPaddingH}var gk=bS(gl.measure,f3("pre","x"));var gi=window.getComputedStyle?window.getComputedStyle(gk):gk.currentStyle;var gj={left:parseInt(gi.paddingLeft),right:parseInt(gi.paddingRight)};if(!isNaN(gj.left)&&!isNaN(gj.right)){gl.cachedPaddingH=gj}return gj}function cU(gi){return dK-gi.display.nativeBarWidth}function dm(gi){return gi.display.scroller.clientWidth-cU(gi)-gi.display.barWidth}function cW(gi){return gi.display.scroller.clientHeight-cU(gi)-gi.display.barHeight}function ci(gp,gl,go){var gk=gp.options.lineWrapping;var gm=gk&&dm(gp);if(!gl.measure.heights||gk&&gl.measure.width!=gm){var gn=gl.measure.heights=[];if(gk){gl.measure.width=gm;var gr=gl.text.firstChild.getClientRects();for(var gi=0;gi<gr.length-1;gi++){var gq=gr[gi],gj=gr[gi+1];if(Math.abs(gq.bottom-gj.bottom)>2){gn.push((gq.bottom+gj.top)/2-go.top)}}}gn.push(go.bottom-go.top)}}function cu(gk,gi,gl){if(gk.line==gi){return{map:gk.measure.map,cache:gk.measure.cache}}for(var gj=0;gj<gk.rest.length;gj++){if(gk.rest[gj]==gi){return{map:gk.measure.maps[gj],cache:gk.measure.caches[gj]}}}for(var gj=0;gj<gk.rest.length;gj++){if(bO(gk.rest[gj])>gl){return{map:gk.measure.maps[gj],cache:gk.measure.caches[gj],before:true}}}}function c2(gi,gk){gk=y(gk);var gm=bO(gk);var gj=gi.display.externalMeasured=new bw(gi.doc,gk,gm);gj.lineN=gm;var gl=gj.built=eS(gi,gj);gj.text=gl.pre;bS(gi.display.lineMeasure,gl.pre);return gj}function ei(gi,gj,gl,gk){return C(gi,a5(gi,gj),gl,gk)}function fc(gi,gk){if(gk>=gi.display.viewFrom&&gk<gi.display.viewTo){return gi.display.view[ds(gi,gk)]}var gj=gi.display.externalMeasured;if(gj&&gk>=gj.lineN&&gk<gj.lineN+gj.size){return gj}}function a5(gi,gk){var gl=bO(gk);var gj=fc(gi,gl);if(gj&&!gj.text){gj=null}else{if(gj&&gj.changes){ab(gi,gj,gl,fe(gi))}}if(!gj){gj=c2(gi,gk)}var gm=cu(gj,gk,gl);return{line:gk,view:gj,rect:null,map:gm.map,cache:gm.cache,before:gm.before,hasHeights:false}}function C(gi,go,gm,gj,gl){if(go.before){gm=-1}var gk=gm+(gj||""),gn;if(go.cache.hasOwnProperty(gk)){gn=go.cache[gk]}else{if(!go.rect){go.rect=go.view.text.getBoundingClientRect()}if(!go.hasHeights){ci(gi,go.view,go.rect);go.hasHeights=true}gn=j(gi,go,gm,gj);if(!gn.bogus){go.cache[gk]=gn}}return{left:gn.left,right:gn.right,top:gl?gn.rtop:gn.top,bottom:gl?gn.rbottom:gn.bottom}}var eC={left:0,right:0,top:0,bottom:0};function aL(gj,gi,gp){var gl,gk,gn,gq;for(var go=0;go<gj.length;go+=3){var gm=gj[go],gr=gj[go+1];if(gi<gm){gk=0;gn=1;gq="left"}else{if(gi<gr){gk=gi-gm;gn=gk+1}else{if(go==gj.length-3||gi==gr&&gj[go+3]>gi){gn=gr-gm;gk=gn-1;if(gi>=gr){gq="right"}}}}if(gk!=null){gl=gj[go+2];if(gm==gr&&gp==(gl.insertLeft?"left":"right")){gq=gp}if(gp=="left"&&gk==0){while(go&&gj[go-2]==gj[go-3]&&gj[go-1].insertLeft){gl=gj[(go-=3)+2];gq="left"}}if(gp=="right"&&gk==gr-gm){while(go<gj.length-3&&gj[go+3]==gj[go+4]&&!gj[go+5].insertLeft){gl=gj[(go+=3)+2];gq="right"}}break}}return{node:gl,start:gk,end:gn,collapse:gq,coverStart:gm,coverEnd:gr}}function j(gp,gz,gs,gn){var gq=aL(gz.map,gs,gn);var gx=gq.node,gm=gq.start,gl=gq.end,gi=gq.collapse;var gj;if(gx.nodeType==3){for(var gy=0;gy<4;gy++){while(gm&&fq(gz.line.text.charAt(gq.coverStart+gm))){--gm}while(gq.coverStart+gl<gq.coverEnd&&fq(gz.line.text.charAt(gq.coverStart+gl))){++gl}if(dL&&k<9&&gm==0&&gl==gq.coverEnd-gq.coverStart){gj=gx.parentNode.getBoundingClientRect()}else{if(dL&&gp.options.lineWrapping){var gk=cm(gx,gm,gl).getClientRects();if(gk.length){gj=gk[gn=="right"?gk.length-1:0]}else{gj=eC}}else{gj=cm(gx,gm,gl).getBoundingClientRect()||eC}}if(gj.left||gj.right||gm==0){break}gl=gm;gm=gm-1;gi="right"}if(dL&&k<11){gj=eO(gp.display.measure,gj)}}else{if(gm>0){gi=gn="right"}var gk;if(gp.options.lineWrapping&&(gk=gx.getClientRects()).length>1){gj=gk[gn=="right"?gk.length-1:0]}else{gj=gx.getBoundingClientRect()}}if(dL&&k<9&&!gm&&(!gj||!gj.left&&!gj.right)){var go=gx.parentNode.getClientRects()[0];if(go){gj={left:go.left,right:go.left+dE(gp.display),top:go.top,bottom:go.bottom}}else{gj=eC}}var gv=gj.top-gz.rect.top,gt=gj.bottom-gz.rect.top;var gB=(gv+gt)/2;var gA=gz.view.measure.heights;for(var gy=0;gy<gA.length-1;gy++){if(gB<gA[gy]){break}}var gw=gy?gA[gy-1]:0,gu=gA[gy];var gr={left:(gi=="right"?gj.right:gj.left)-gz.rect.left,right:(gi=="left"?gj.left:gj.right)-gz.rect.left,top:gw,bottom:gu};if(!gj.left&&!gj.right){gr.bogus=true}if(!gp.options.singleCursorHeightPerLine){gr.rtop=gv;gr.rbottom=gt}return gr}function eO(gk,gl){if(!window.screen||screen.logicalXDPI==null||screen.logicalXDPI==screen.deviceXDPI||!aK(gk)){return gl}var gj=screen.logicalXDPI/screen.deviceXDPI;var gi=screen.logicalYDPI/screen.deviceYDPI;return{left:gl.left*gj,right:gl.right*gj,top:gl.top*gi,bottom:gl.bottom*gi}}function au(gj){if(gj.measure){gj.measure.cache={};gj.measure.heights=null;if(gj.rest){for(var gi=0;gi<gj.rest.length;gi++){gj.measure.caches[gi]={}}}}}function aO(gi){gi.display.externalMeasure=null;d2(gi.display.lineMeasure);for(var gj=0;gj<gi.display.view.length;gj++){au(gi.display.view[gj])}}function ak(gi){aO(gi);gi.display.cachedCharWidth=gi.display.cachedTextHeight=gi.display.cachedPaddingH=null;if(!gi.options.lineWrapping){gi.display.maxLineChanged=true}gi.display.lineNumChars=null}function cv(){return window.pageXOffset||(document.documentElement||document.body).scrollLeft}function ct(){return window.pageYOffset||(document.documentElement||document.body).scrollTop}function eR(go,gl,gn,gj){if(gl.widgets){for(var gk=0;gk<gl.widgets.length;++gk){if(gl.widgets[gk].above){var gq=cZ(gl.widgets[gk]);gn.top+=gq;gn.bottom+=gq}}}if(gj=="line"){return gn}if(!gj){gj="local"}var gm=bN(gl);if(gj=="local"){gm+=e9(go.display)}else{gm-=go.display.viewOffset}if(gj=="page"||gj=="window"){var gi=go.display.lineSpace.getBoundingClientRect();gm+=gi.top+(gj=="window"?0:ct());var gp=gi.left+(gj=="window"?0:cv());gn.left+=gp;gn.right+=gp}gn.top+=gm;gn.bottom+=gm;return gn}function gf(gj,gm,gk){if(gk=="div"){return gm}var go=gm.left,gn=gm.top;if(gk=="page"){go-=cv();gn-=ct()}else{if(gk=="local"||!gk){var gl=gj.display.sizer.getBoundingClientRect();go+=gl.left;gn+=gl.top}}var gi=gj.display.lineSpace.getBoundingClientRect();return{left:go-gi.left,top:gn-gi.top}}function cK(gi,gm,gl,gk,gj){if(!gk){gk=fg(gi.doc,gm.line)}return eR(gi,gk,ei(gi,gk,gm.ch,gj),gl)}function dV(gr,gq,gk,go,gt,gp){go=go||fg(gr.doc,gq.line);if(!gt){gt=a5(gr,go)}function gm(gw,gv){var gu=C(gr,gt,gw,gv?"right":"left",gp);if(gv){gu.left=gu.right}else{gu.right=gu.left}return eR(gr,go,gu,gk)}function gs(gx,gu){var gv=gn[gu],gw=gv.level%2;if(gx==dz(gv)&&gu&&gv.level<gn[gu-1].level){gv=gn[--gu];gx=ge(gv)-(gv.level%2?0:1);gw=true}else{if(gx==ge(gv)&&gu<gn.length-1&&gv.level<gn[gu+1].level){gv=gn[++gu];gx=dz(gv)-gv.level%2;gw=false}}if(gw&&gx==gv.to&&gx>gv.from){return gm(gx-1)}return gm(gx,gw)}var gn=a(go),gi=gq.ch;if(!gn){return gm(gi)}var gj=aG(gn,gi);var gl=gs(gi,gj);if(e3!=null){gl.other=gs(gi,e3)}return gl}function dI(gi,gm){var gl=0,gm=fK(gi.doc,gm);if(!gi.options.lineWrapping){gl=dE(gi.display)*gm.ch}var gj=fg(gi.doc,gm.line);var gk=bN(gj)+e9(gi.display);return{left:gl,right:gl,top:gk,bottom:gk+gj.height}}function f2(gi,gj,gk,gm){var gl=W(gi,gj);gl.xRel=gm;if(gk){gl.outside=true}return gl}function fP(gp,gm,gl){var go=gp.doc;gl+=gp.display.viewOffset;if(gl<0){return f2(go.first,0,true,-1)}var gk=bH(go,gl),gq=go.first+go.size-1;if(gk>gq){return f2(go.first+go.size-1,fg(go,gq).text.length,true,1)}if(gm<0){gm=0}var gj=fg(go,gk);for(;;){var gr=c0(gp,gj,gk,gm,gl);var gn=ex(gj);var gi=gn&&gn.find(0,true);if(gn&&(gr.ch>gi.from.ch||gr.ch==gi.from.ch&&gr.xRel>0)){gk=bO(gj=gi.to.line)}else{return gr}}}function c0(gs,gk,gv,gu,gt){var gr=gt-bN(gk);var go=false,gB=2*gs.display.wrapper.clientWidth;var gy=a5(gs,gk);function gF(gH){var gI=dV(gs,W(gv,gH),"line",gk,gy);go=true;if(gr>gI.bottom){return gI.left-gB}else{if(gr<gI.top){return gI.left+gB}else{go=false}}return gI.left}var gx=a(gk),gA=gk.text.length;var gC=cF(gk),gl=cT(gk);var gz=gF(gC),gi=go,gj=gF(gl),gn=go;if(gu>gj){return f2(gv,gl,gn,1)}for(;;){if(gx?gl==gC||gl==u(gk,gC,1):gl-gC<=1){var gw=gu<gz||gu-gz<=gj-gu?gC:gl;var gE=gu-(gw==gC?gz:gj);while(fq(gk.text.charAt(gw))){++gw}var gq=f2(gv,gw,gw==gC?gi:gn,gE<-1?-1:gE>1?1:0);return gq}var gp=Math.ceil(gA/2),gG=gC+gp;if(gx){gG=gC;for(var gD=0;gD<gp;++gD){gG=u(gk,gG,1)}}var gm=gF(gG);if(gm>gu){gl=gG;gj=gm;if(gn=go){gj+=1000}gA=gp}else{gC=gG;gz=gm;gi=go;gA-=gp}}}var aH;function aY(gk){if(gk.cachedTextHeight!=null){return gk.cachedTextHeight}if(aH==null){aH=f3("pre");for(var gj=0;gj<49;++gj){aH.appendChild(document.createTextNode("x"));aH.appendChild(f3("br"))}aH.appendChild(document.createTextNode("x"))}bS(gk.measure,aH);var gi=aH.offsetHeight/50;if(gi>3){gk.cachedTextHeight=gi}d2(gk.measure);return gi||1}function dE(gm){if(gm.cachedCharWidth!=null){return gm.cachedCharWidth}var gi=f3("span","xxxxxxxxxx");var gl=f3("pre",[gi]);bS(gm.measure,gl);var gk=gi.getBoundingClientRect(),gj=(gk.right-gk.left)/10;if(gj>2){gm.cachedCharWidth=gj}return gj||10}var bq=null;var d9=0;function cJ(gi){gi.curOp={cm:gi,viewChanged:false,startHeight:gi.doc.height,forceUpdate:false,updateInput:null,typing:false,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:false,updateMaxLine:false,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:false,id:++d9};if(bq){bq.ops.push(gi.curOp)}else{gi.curOp.ownsGroup=bq={ops:[gi.curOp],delayedCallbacks:[]}}}function cV(gl){var gk=gl.delayedCallbacks,gj=0;do{for(;gj<gk.length;gj++){gk[gj]()}for(var gi=0;gi<gl.ops.length;gi++){var gm=gl.ops[gi];if(gm.cursorActivityHandlers){while(gm.cursorActivityCalled<gm.cursorActivityHandlers.length){gm.cursorActivityHandlers[gm.cursorActivityCalled++](gm.cm)}}}}while(gj<gk.length)}function am(gi){var gl=gi.curOp,gk=gl.ownsGroup;if(!gk){return}try{cV(gk)}finally{bq=null;for(var gj=0;gj<gk.ops.length;gj++){gk.ops[gj].cm.curOp=null}cL(gk)}}function cL(gk){var gj=gk.ops;for(var gi=0;gi<gj.length;gi++){b6(gj[gi])}for(var gi=0;gi<gj.length;gi++){aq(gj[gi])}for(var gi=0;gi<gj.length;gi++){b3(gj[gi])}for(var gi=0;gi<gj.length;gi++){ap(gj[gi])}for(var gi=0;gi<gj.length;gi++){e1(gj[gi])}}function b6(gk){var gi=gk.cm,gj=gi.display;J(gi);if(gk.updateMaxLine){h(gi)}gk.mustUpdate=gk.viewChanged||gk.forceUpdate||gk.scrollTop!=null||gk.scrollToPos&&(gk.scrollToPos.from.line<gj.viewFrom||gk.scrollToPos.to.line>=gj.viewTo)||gj.maxLineChanged&&gi.options.lineWrapping;gk.update=gk.mustUpdate&&new aI(gi,gk.mustUpdate&&{top:gk.scrollTop,ensure:gk.scrollToPos},gk.forceUpdate)}function aq(gi){gi.updatedDisplay=gi.mustUpdate&&B(gi.cm,gi.update)}function b3(gk){var gi=gk.cm,gj=gi.display;if(gk.updatedDisplay){ba(gi)}gk.barMeasure=dB(gi);if(gj.maxLineChanged&&!gi.options.lineWrapping){gk.adjustWidthTo=ei(gi,gj.maxLine,gj.maxLine.text.length).left+3;gi.display.sizerWidth=gk.adjustWidthTo;gk.barMeasure.scrollWidth=Math.max(gj.scroller.clientWidth,gj.sizer.offsetLeft+gk.adjustWidthTo+cU(gi)+gi.display.barWidth);gk.maxScrollLeft=Math.max(0,gj.sizer.offsetLeft+gk.adjustWidthTo-dm(gi))}if(gk.updatedDisplay||gk.selectionChanged){gk.preparedSelection=gj.input.prepareSelection()}}function ap(gj){var gi=gj.cm;if(gj.adjustWidthTo!=null){gi.display.sizer.style.minWidth=gj.adjustWidthTo+"px";if(gj.maxScrollLeft<gi.doc.scrollLeft){bF(gi,Math.min(gi.display.scroller.scrollLeft,gj.maxScrollLeft),true)}gi.display.maxLineChanged=false}if(gj.preparedSelection){gi.display.input.showSelection(gj.preparedSelection)}if(gj.updatedDisplay){dA(gi,gj.barMeasure)}if(gj.updatedDisplay||gj.startHeight!=gi.doc.height){eZ(gi,gj.barMeasure)}if(gj.selectionChanged){o(gi)}if(gi.state.focused&&gj.updateInput){gi.display.input.reset(gj.typing)}if(gj.focus&&gj.focus==dP()){r(gj.cm)}}function e1(gp){var gi=gp.cm,gn=gi.display,gm=gi.doc;if(gp.updatedDisplay){ck(gi,gp.update)}if(gn.wheelStartX!=null&&(gp.scrollTop!=null||gp.scrollLeft!=null||gp.scrollToPos)){gn.wheelStartX=gn.wheelStartY=null}if(gp.scrollTop!=null&&(gn.scroller.scrollTop!=gp.scrollTop||gp.forceScroll)){gm.scrollTop=Math.max(0,Math.min(gn.scroller.scrollHeight-gn.scroller.clientHeight,gp.scrollTop));gn.scrollbars.setScrollTop(gm.scrollTop);gn.scroller.scrollTop=gm.scrollTop}if(gp.scrollLeft!=null&&(gn.scroller.scrollLeft!=gp.scrollLeft||gp.forceScroll)){gm.scrollLeft=Math.max(0,Math.min(gn.scroller.scrollWidth-dm(gi),gp.scrollLeft));gn.scrollbars.setScrollLeft(gm.scrollLeft);gn.scroller.scrollLeft=gm.scrollLeft;eF(gi)}if(gp.scrollToPos){var gl=D(gi,fK(gm,gp.scrollToPos.from),fK(gm,gp.scrollToPos.to),gp.scrollToPos.margin);if(gp.scrollToPos.isCursor&&gi.state.focused){d7(gi,gl)}}var gk=gp.maybeHiddenMarkers,go=gp.maybeUnhiddenMarkers;if(gk){for(var gj=0;gj<gk.length;++gj){if(!gk[gj].lines.length){aE(gk[gj],"hide")}}}if(go){for(var gj=0;gj<go.length;++gj){if(go[gj].lines.length){aE(go[gj],"unhide")}}}if(gn.wrapper.offsetHeight){gm.scrollTop=gi.display.scroller.scrollTop}if(gp.changeObjs){aE(gi,"changes",gi,gp.changeObjs)}if(gp.update){gp.update.finish()}}function cN(gi,gj){if(gi.curOp){return gj()}cJ(gi);try{return gj()}finally{am(gi)}}function c3(gi,gj){return function(){if(gi.curOp){return gj.apply(gi,arguments)}cJ(gi);try{return gj.apply(gi,arguments)}finally{am(gi)}}}function c9(gi){return function(){if(this.curOp){return gi.apply(this,arguments)}cJ(this);try{return gi.apply(this,arguments)}finally{am(this)}}}function cE(gi){return function(){var gj=this.cm;if(!gj||gj.curOp){return gi.apply(this,arguments)}cJ(gj);try{return gi.apply(this,arguments)}finally{am(gj)}}}function bw(gk,gi,gj){this.line=gi;this.rest=g(gi);this.size=this.rest?bO(fH(this.rest))-gj+1:1;this.node=this.text=null;this.hidden=fx(gk,gi)}function eW(gi,go,gn){var gm=[],gk;for(var gl=go;gl<gn;gl=gk){var gj=new bw(gi.doc,fg(gi.doc,gl),gl);gk=gl+gj.size;gm.push(gj)}return gm}function ah(gp,gn,go,gq){if(gn==null){gn=gp.doc.first}if(go==null){go=gp.doc.first+gp.doc.size}if(!gq){gq=0}var gk=gp.display;if(gq&&go<gk.viewTo&&(gk.updateLineNumbers==null||gk.updateLineNumbers>gn)){gk.updateLineNumbers=gn}gp.curOp.viewChanged=true;if(gn>=gk.viewTo){if(a8&&aW(gp.doc,gn)<gk.viewTo){ey(gp)}}else{if(go<=gk.viewFrom){if(a8&&d3(gp.doc,go+gq)>gk.viewFrom){ey(gp)}else{gk.viewFrom+=gq;gk.viewTo+=gq}}else{if(gn<=gk.viewFrom&&go>=gk.viewTo){ey(gp)}else{if(gn<=gk.viewFrom){var gm=df(gp,go,go+gq,1);if(gm){gk.view=gk.view.slice(gm.index);gk.viewFrom=gm.lineN;gk.viewTo+=gq}else{ey(gp)}}else{if(go>=gk.viewTo){var gm=df(gp,gn,gn,-1);if(gm){gk.view=gk.view.slice(0,gm.index);gk.viewTo=gm.lineN}else{ey(gp)}}else{var gl=df(gp,gn,gn,-1);var gj=df(gp,go,go+gq,1);if(gl&&gj){gk.view=gk.view.slice(0,gl.index).concat(eW(gp,gl.lineN,gj.lineN)).concat(gk.view.slice(gj.index));gk.viewTo+=gq}else{ey(gp)}}}}}}var gi=gk.externalMeasured;if(gi){if(go<gi.lineN){gi.lineN+=gq}else{if(gn<gi.lineN+gi.size){gk.externalMeasured=null}}}}function R(gj,gk,gn){gj.curOp.viewChanged=true;var go=gj.display,gm=gj.display.externalMeasured;if(gm&&gk>=gm.lineN&&gk<gm.lineN+gm.size){go.externalMeasured=null}if(gk<go.viewFrom||gk>=go.viewTo){return}var gl=go.view[ds(gj,gk)];if(gl.node==null){return}var gi=gl.changes||(gl.changes=[]);if(di(gi,gn)==-1){gi.push(gn)}}function ey(gi){gi.display.viewFrom=gi.display.viewTo=gi.doc.first;gi.display.view=[];gi.display.viewOffset=0}function ds(gi,gl){if(gl>=gi.display.viewTo){return null}gl-=gi.display.viewFrom;if(gl<0){return null}var gj=gi.display.view;for(var gk=0;gk<gj.length;gk++){gl-=gj[gk].size;if(gl<0){return gk}}}function df(gq,gk,gm,gj){var gn=ds(gq,gk),gp,go=gq.display.view;if(!a8||gm==gq.doc.first+gq.doc.size){return{index:gn,lineN:gm}}for(var gl=0,gi=gq.display.viewFrom;gl<gn;gl++){gi+=go[gl].size}if(gi!=gk){if(gj>0){if(gn==go.length-1){return null}gp=(gi+go[gn].size)-gk;gn++}else{gp=gi-gk}gk+=gp;gm+=gp}while(aW(gq.doc,gm)!=gm){if(gn==(gj<0?0:go.length-1)){return null}gm+=gj*go[gn-(gj<0?1:0)].size;gn+=gj}return{index:gn,lineN:gm}}function cS(gi,gm,gl){var gk=gi.display,gj=gk.view;if(gj.length==0||gm>=gk.viewTo||gl<=gk.viewFrom){gk.view=eW(gi,gm,gl);gk.viewFrom=gm}else{if(gk.viewFrom>gm){gk.view=eW(gi,gm,gk.viewFrom).concat(gk.view)}else{if(gk.viewFrom<gm){gk.view=gk.view.slice(ds(gi,gm))}}gk.viewFrom=gm;if(gk.viewTo<gl){gk.view=gk.view.concat(eW(gi,gk.viewTo,gl))}else{if(gk.viewTo>gl){gk.view=gk.view.slice(0,ds(gi,gl))}}}gk.viewTo=gl}function dc(gi){var gj=gi.display.view,gm=0;for(var gl=0;gl<gj.length;gl++){var gk=gj[gl];if(!gk.hidden&&(!gk.node||gk.changes)){++gm}}return gm}function fR(gj){var gn=gj.display;bY(gn.scroller,"mousedown",c3(gj,ev));if(dL&&k<11){bY(gn.scroller,"dblclick",c3(gj,function(gr){if(aR(gj,gr)){return}var gs=co(gj,gr);if(!gs||l(gj,gr)||bc(gj.display,gr)){return}cH(gr);var gq=gj.findWordAt(gs);fX(gj.doc,gq.anchor,gq.head)}))}else{bY(gn.scroller,"dblclick",function(gq){aR(gj,gq)||cH(gq)})}if(!ga){bY(gn.scroller,"contextmenu",function(gq){ay(gj,gq)})}var gp,gi={end:0};function go(){if(gn.activeTouch){gp=setTimeout(function(){gn.activeTouch=null},1000);gi=gn.activeTouch;gi.end=+new Date}}function gl(gq){if(gq.touches.length!=1){return false}var gr=gq.touches[0];return gr.radiusX<=1&&gr.radiusY<=1}function gk(gt,gq){if(gq.left==null){return true}var gs=gq.left-gt.left,gr=gq.top-gt.top;return gs*gs+gr*gr>20*20}bY(gn.scroller,"touchstart",function(gr){if(!gl(gr)){clearTimeout(gp);var gq=+new Date;gn.activeTouch={start:gq,moved:false,prev:gq-gi.end<=300?gi:null};if(gr.touches.length==1){gn.activeTouch.left=gr.touches[0].pageX;gn.activeTouch.top=gr.touches[0].pageY}}});bY(gn.scroller,"touchmove",function(){if(gn.activeTouch){gn.activeTouch.moved=true}});bY(gn.scroller,"touchend",function(gr){var gt=gn.activeTouch;if(gt&&!bc(gn,gr)&&gt.left!=null&&!gt.moved&&new Date-gt.start<300){var gs=gj.coordsChar(gn.activeTouch,"page"),gq;if(!gt.prev||gk(gt,gt.prev)){gq=new dZ(gs,gs)}else{if(!gt.prev.prev||gk(gt,gt.prev.prev)){gq=gj.findWordAt(gs)}else{gq=new dZ(W(gs.line,0),fK(gj.doc,W(gs.line+1,0)))}}gj.setSelection(gq.anchor,gq.head);gj.focus();cH(gr)}go()});bY(gn.scroller,"touchcancel",go);bY(gn.scroller,"scroll",function(){if(gn.scroller.clientHeight){N(gj,gn.scroller.scrollTop);bF(gj,gn.scroller.scrollLeft,true);aE(gj,"scroll",gj)}});bY(gn.scroller,"mousewheel",function(gq){b(gj,gq)});bY(gn.scroller,"DOMMouseScroll",function(gq){b(gj,gq)});bY(gn.wrapper,"scroll",function(){gn.wrapper.scrollTop=gn.wrapper.scrollLeft=0});gn.dragFunctions={simple:function(gq){if(!aR(gj,gq)){es(gq)}},start:function(gq){Q(gj,gq)},drop:c3(gj,bl)};var gm=gn.input.getField();bY(gm,"keyup",function(gq){bj.call(gj,gq)});bY(gm,"keydown",c3(gj,p));bY(gm,"keypress",c3(gj,cy));bY(gm,"focus",cw(cC,gj));bY(gm,"blur",cw(aV,gj))}function f1(gj,gm,gk){var gn=gk&&gk!=H.Init;if(!gm!=!gn){var gl=gj.display.dragFunctions;var gi=gm?bY:ee;gi(gj.display.scroller,"dragstart",gl.start);gi(gj.display.scroller,"dragenter",gl.simple);gi(gj.display.scroller,"dragover",gl.simple);gi(gj.display.scroller,"drop",gl.drop)}}function aT(gi){var gj=gi.display;if(gj.lastWrapHeight==gj.wrapper.clientHeight&&gj.lastWrapWidth==gj.wrapper.clientWidth){return}gj.cachedCharWidth=gj.cachedTextHeight=gj.cachedPaddingH=null;gj.scrollbarsClipped=false;gi.setSize()}function bc(gj,gi){for(var gk=L(gi);gk!=gj.wrapper;gk=gk.parentNode){if(!gk||(gk.nodeType==1&&gk.getAttribute("cm-ignore-events")=="true")||(gk.parentNode==gj.sizer&&gk!=gj.mover)){return true}}}function co(gr,gm,gj,gk){var gn=gr.display;if(!gj&&L(gm).getAttribute("cm-not-content")=="true"){return null}var gq,go,gi=gn.lineSpace.getBoundingClientRect();try{gq=gm.clientX-gi.left;go=gm.clientY-gi.top}catch(gm){return null}var gp=fP(gr,gq,go),gs;if(gk&&gp.xRel==1&&(gs=fg(gr.doc,gp.line).text).length==gp.ch){var gl=bU(gs,gs.length,gr.options.tabSize)-gs.length;gp=W(gp.line,Math.max(0,Math.round((gq-e6(gr.display).left)/dE(gr.display))-gl))}return gp}function ev(gk){var gi=this,gj=gi.display;if(gj.activeTouch&&gj.input.supportsTouch()||aR(gi,gk)){return}gj.shift=gk.shiftKey;if(bc(gj,gk)){if(!c1){gj.scroller.draggable=false;setTimeout(function(){gj.scroller.draggable=true},100)}return}if(l(gi,gk)){return}var gl=co(gi,gk);window.focus();switch(fO(gk)){case 1:if(gl){ax(gi,gk,gl)}else{if(L(gk)==gj.scroller){cH(gk)}}break;case 2:if(c1){gi.state.lastMiddleDown=+new Date}if(gl){fX(gi.doc,gl)}setTimeout(function(){gj.input.focus()},20);cH(gk);break;case 3:if(ga){ay(gi,gk)}else{al(gi)}break}}var dp,de;function ax(gj,go,gp){if(dL){setTimeout(cw(r,gj),0)}else{gj.curOp.focus=dP()}var gk=+new Date,gm;if(de&&de.time>gk-400&&cg(de.pos,gp)==0){gm="triple"}else{if(dp&&dp.time>gk-400&&cg(dp.pos,gp)==0){gm="double";de={time:gk,pos:gp}}else{gm="single";dp={time:gk,pos:gp}}}var gn=gj.doc.sel,gi=b8?go.metaKey:go.ctrlKey,gl;if(gj.options.dragDrop&&eM&&!aj(gj)&&gm=="single"&&(gl=gn.contains(gp))>-1&&(cg((gl=gn.ranges[gl]).from(),gp)<0||gp.xRel>0)&&(cg(gl.to(),gp)>0||gp.xRel<0)){a4(gj,go,gp,gi)}else{m(gj,go,gp,gm,gi)}}function a4(gk,gn,go,gj){var gm=gk.display,gl=+new Date;var gi=c3(gk,function(gp){if(c1){gm.scroller.draggable=false}gk.state.draggingText=false;ee(document,"mouseup",gi);ee(gm.scroller,"drop",gi);if(Math.abs(gn.clientX-gp.clientX)+Math.abs(gn.clientY-gp.clientY)<10){cH(gp);if(!gj&&+new Date-200<gl){fX(gk.doc,go)}if(c1||dL&&k==9){setTimeout(function(){document.body.focus();gm.input.focus()},20)}else{gm.input.focus()}}});if(c1){gm.scroller.draggable=true}gk.state.draggingText=gi;if(gm.scroller.dragDrop){gm.scroller.dragDrop()}bY(document,"mouseup",gi);bY(gm.scroller,"drop",gi)}function m(gm,gA,gl,gj,go){var gx=gm.display,gC=gm.doc;cH(gA);var gk,gB,gn=gC.sel,gi=gn.ranges;if(go&&!gA.shiftKey){gB=gC.sel.contains(gl);if(gB>-1){gk=gi[gB]}else{gk=new dZ(gl,gl)}}else{gk=gC.sel.primary();gB=gC.sel.primIndex}if(gA.altKey){gj="rect";if(!go){gk=new dZ(gl,gl)}gl=co(gm,gA,true,true);gB=-1}else{if(gj=="double"){var gy=gm.findWordAt(gl);if(gm.display.shift||gC.extend){gk=fw(gC,gk,gy.anchor,gy.head)}else{gk=gy}}else{if(gj=="triple"){var gr=new dZ(W(gl.line,0),fK(gC,W(gl.line+1,0)));if(gm.display.shift||gC.extend){gk=fw(gC,gk,gr.anchor,gr.head)}else{gk=gr}}else{gk=fw(gC,gk,gl)}}}if(!go){gB=0;bV(gC,new f4([gk],0),M);gn=gC.sel}else{if(gB==-1){gB=gi.length;bV(gC,cx(gi.concat([gk]),gB),{scroll:false,origin:"*mouse"})}else{if(gi.length>1&&gi[gB].empty()&&gj=="single"&&!gA.shiftKey){bV(gC,cx(gi.slice(0,gB).concat(gi.slice(gB+1)),0));gn=gC.sel}else{e(gC,gB,gk,M)}}}var gw=gl;function gv(gN){if(cg(gw,gN)==0){return}gw=gN;if(gj=="rect"){var gE=[],gK=gm.options.tabSize;var gD=bU(fg(gC,gl.line).text,gl.ch,gK);var gQ=bU(fg(gC,gN.line).text,gN.ch,gK);var gF=Math.min(gD,gQ),gO=Math.max(gD,gQ);for(var gR=Math.min(gl.line,gN.line),gH=Math.min(gm.lastLine(),Math.max(gl.line,gN.line));gR<=gH;gR++){var gP=fg(gC,gR).text,gG=er(gP,gF,gK);if(gF==gO){gE.push(new dZ(W(gR,gG),W(gR,gG)))}else{if(gP.length>gG){gE.push(new dZ(W(gR,gG),W(gR,er(gP,gO,gK))))}}}if(!gE.length){gE.push(new dZ(gl,gl))}bV(gC,cx(gn.ranges.slice(0,gB).concat(gE),gB),{origin:"*mouse",scroll:false});gm.scrollIntoView(gN)}else{var gL=gk;var gI=gL.anchor,gM=gN;if(gj!="single"){if(gj=="double"){var gJ=gm.findWordAt(gN)}else{var gJ=new dZ(W(gN.line,0),fK(gC,W(gN.line+1,0)))}if(cg(gJ.anchor,gI)>0){gM=gJ.head;gI=ar(gL.from(),gJ.anchor)}else{gM=gJ.anchor;gI=by(gL.to(),gJ.head)}}var gE=gn.ranges.slice(0);gE[gB]=new dZ(fK(gC,gI),gM);bV(gC,cx(gE,gB),M)}}var gt=gx.wrapper.getBoundingClientRect();var gp=0;function gz(gF){var gD=++gp;var gH=co(gm,gF,true,gj=="rect");if(!gH){return}if(cg(gH,gw)!=0){gm.curOp.focus=dP();gv(gH);var gG=b7(gx,gC);if(gH.line>=gG.to||gH.line<gG.from){setTimeout(c3(gm,function(){if(gp==gD){gz(gF)}}),150)}}else{var gE=gF.clientY<gt.top?-20:gF.clientY>gt.bottom?20:0;if(gE){setTimeout(c3(gm,function(){if(gp!=gD){return}gx.scroller.scrollTop+=gE;gz(gF)}),50)}}}function gs(gD){gp=Infinity;cH(gD);gx.input.focus();ee(document,"mousemove",gu);ee(document,"mouseup",gq);gC.history.lastSelOrigin=null}var gu=c3(gm,function(gD){if(!fO(gD)){gs(gD)}else{gz(gD)}});var gq=c3(gm,gs);bY(document,"mousemove",gu);bY(document,"mouseup",gq)}function gg(gt,gp,gr,gs,gl){try{var gj=gp.clientX,gi=gp.clientY}catch(gp){return false}if(gj>=Math.floor(gt.display.gutters.getBoundingClientRect().right)){return false}if(gs){cH(gp)}var gq=gt.display;var go=gq.lineDiv.getBoundingClientRect();if(gi>go.bottom||!fj(gt,gr)){return bM(gp)}gi-=go.top-gq.viewOffset;for(var gm=0;gm<gt.options.gutters.length;++gm){var gn=gq.gutters.childNodes[gm];if(gn&&gn.getBoundingClientRect().right>=gj){var gu=bH(gt.doc,gi);var gk=gt.options.gutters[gm];gl(gt,gr,gt,gu,gk,gp);return bM(gp)}}}function l(gi,gj){return gg(gi,gj,"gutterClick",true,ae)}var ag=0;function bl(go){var gq=this;if(aR(gq,go)||bc(gq.display,go)){return}cH(go);if(dL){ag=+new Date}var gp=co(gq,go,true),gi=go.dataTransfer.files;if(!gp||aj(gq)){return}if(gi&&gi.length&&window.FileReader&&window.File){var gk=gi.length,gr=Array(gk),gj=0;var gm=function(gu,gt){var gs=new FileReader;gs.onload=c3(gq,function(){gr[gt]=gs.result;if(++gj==gk){gp=fK(gq.doc,gp);var gv={from:gp,to:gp,text:a1(gr.join("\n")),origin:"paste"};bh(gq.doc,gv);e8(gq.doc,eT(gp,cY(gv)))}});gs.readAsText(gu)};for(var gn=0;gn<gk;++gn){gm(gi[gn],gn)}}else{if(gq.state.draggingText&&gq.doc.sel.contains(gp)>-1){gq.state.draggingText(go);setTimeout(function(){gq.display.input.focus()},20);return}try{var gr=go.dataTransfer.getData("Text");if(gr){if(gq.state.draggingText&&!(b8?go.altKey:go.ctrlKey)){var gl=gq.listSelections()}eq(gq.doc,eT(gp,gp));if(gl){for(var gn=0;gn<gl.length;++gn){a2(gq.doc,"",gl[gn].anchor,gl[gn].head,"drag")}}gq.replaceSelection(gr,"around","paste");gq.display.input.focus()}}catch(go){}}}function Q(gi,gk){if(dL&&(!gi.state.draggingText||+new Date-ag<100)){es(gk);return}if(aR(gi,gk)||bc(gi.display,gk)){return}gk.dataTransfer.setData("Text",gi.getSelection());if(gk.dataTransfer.setDragImage&&!aC){var gj=f3("img",null,null,"position: fixed; left: 0; top: 0;");gj.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";if(d4){gj.width=gj.height=1;gi.display.wrapper.appendChild(gj);gj._top=gj.offsetTop}gk.dataTransfer.setDragImage(gj,0,0);if(d4){gj.parentNode.removeChild(gj)}}}function N(gi,gj){if(Math.abs(gi.doc.scrollTop-gj)<2){return}gi.doc.scrollTop=gj;if(!cp){dU(gi,{top:gj})}if(gi.display.scroller.scrollTop!=gj){gi.display.scroller.scrollTop=gj}gi.display.scrollbars.setScrollTop(gj);if(cp){dU(gi)}eg(gi,100)}function bF(gi,gk,gj){if(gj?gk==gi.doc.scrollLeft:Math.abs(gi.doc.scrollLeft-gk)<2){return}gk=Math.min(gk,gi.display.scroller.scrollWidth-gi.display.scroller.clientWidth);gi.doc.scrollLeft=gk;eF(gi);if(gi.display.scroller.scrollLeft!=gk){gi.display.scroller.scrollLeft=gk}gi.display.scrollbars.setScrollLeft(gk)}var fn=0,ch=null;if(dL){ch=-0.53}else{if(cp){ch=15}else{if(dd){ch=-0.7}else{if(aC){ch=-1/3}}}}var cR=function(gk){var gj=gk.wheelDeltaX,gi=gk.wheelDeltaY;if(gj==null&&gk.detail&&gk.axis==gk.HORIZONTAL_AXIS){gj=gk.detail}if(gi==null&&gk.detail&&gk.axis==gk.VERTICAL_AXIS){gi=gk.detail}else{if(gi==null){gi=gk.wheelDelta}}return{x:gj,y:gi}};H.wheelEventPixels=function(gi){var gj=cR(gi);gj.x*=ch;gj.y*=ch;return gj};function b(gq,gk){var gr=cR(gk),gu=gr.x,gt=gr.y;var gm=gq.display,gp=gm.scroller;if(!(gu&&gp.scrollWidth>gp.clientWidth||gt&&gp.scrollHeight>gp.clientHeight)){return}if(gt&&b8&&c1){outer:for(var gs=gk.target,go=gm.view;gs!=gp;gs=gs.parentNode){for(var gj=0;gj<go.length;gj++){if(go[gj].node==gs){gq.display.currentWheelTarget=gs;break outer}}}}if(gu&&!cp&&!d4&&ch!=null){if(gt){N(gq,Math.max(0,Math.min(gp.scrollTop+gt*ch,gp.scrollHeight-gp.clientHeight)))}bF(gq,Math.max(0,Math.min(gp.scrollLeft+gu*ch,gp.scrollWidth-gp.clientWidth)));cH(gk);gm.wheelStartX=null;return}if(gt&&ch!=null){var gi=gt*ch;var gn=gq.doc.scrollTop,gl=gn+gm.wrapper.clientHeight;if(gi<0){gn=Math.max(0,gn+gi-50)}else{gl=Math.min(gq.doc.height,gl+gi+50)}dU(gq,{top:gn,bottom:gl})}if(fn<20){if(gm.wheelStartX==null){gm.wheelStartX=gp.scrollLeft;gm.wheelStartY=gp.scrollTop;gm.wheelDX=gu;gm.wheelDY=gt;setTimeout(function(){if(gm.wheelStartX==null){return}var gv=gp.scrollLeft-gm.wheelStartX;var gx=gp.scrollTop-gm.wheelStartY;var gw=(gx&&gm.wheelDY&&gx/gm.wheelDY)||(gv&&gm.wheelDX&&gv/gm.wheelDX);gm.wheelStartX=gm.wheelStartY=null;if(!gw){return}ch=(ch*fn+gw)/(fn+1);++fn},200)}else{gm.wheelDX+=gu;gm.wheelDY+=gt}}}function fS(gj,gm,gi){if(typeof gm=="string"){gm=eE[gm];if(!gm){return false}}gj.display.input.ensurePolled();var gl=gj.display.shift,gk=false;try{if(aj(gj)){gj.state.suppressEdits=true}if(gi){gj.display.shift=false}gk=gm(gj)!=cb}finally{gj.display.shift=gl;gj.state.suppressEdits=false}return gk}function eb(gj,gk,gm){for(var gl=0;gl<gj.state.keyMaps.length;gl++){var gi=i(gk,gj.state.keyMaps[gl],gm,gj);if(gi){return gi}}return(gj.options.extraKeys&&i(gk,gj.options.extraKeys,gm,gj))||i(gk,gj.options.keyMap,gm,gj)}var dN=new gh;function be(gj,gl,gn,gm){var gk=gj.state.keySeq;if(gk){if(eD(gl)){return"handled"}dN.set(50,function(){if(gj.state.keySeq==gk){gj.state.keySeq=null;gj.display.input.reset()}});gl=gk+" "+gl}var gi=eb(gj,gl,gm);if(gi=="multi"){gj.state.keySeq=gl}if(gi=="handled"){ae(gj,"keyHandled",gj,gl,gn)}if(gi=="handled"||gi=="multi"){cH(gn);o(gj)}if(gk&&!gi&&/\'$/.test(gl)){cH(gn);return true}return !!gi}function fk(gi,gk){var gj=fs(gk,true);if(!gj){return false}if(gk.shiftKey&&!gi.state.keySeq){return be(gi,"Shift-"+gj,gk,function(gl){return fS(gi,gl,true)})||be(gi,gj,gk,function(gl){if(typeof gl=="string"?/^go[A-Z]/.test(gl):gl.motion){return fS(gi,gl)}})}else{return be(gi,gj,gk,function(gl){return fS(gi,gl)})}}function ek(gi,gk,gj){return be(gi,"'"+gj+"'",gk,function(gl){return fS(gi,gl,true)})}var dn=null;function p(gl){var gi=this;gi.curOp.focus=dP();if(aR(gi,gl)){return}if(dL&&k<11&&gl.keyCode==27){gl.returnValue=false}var gj=gl.keyCode;gi.display.shift=gj==16||gl.shiftKey;var gk=fk(gi,gl);if(d4){dn=gk?gj:null;if(!gk&&gj==88&&!db&&(b8?gl.metaKey:gl.ctrlKey)){gi.replaceSelection("",null,"cut")}}if(gj==18&&!/\bCodeMirror-crosshair\b/.test(gi.display.lineDiv.className)){av(gi)}}function av(gj){var gk=gj.display.lineDiv;fB(gk,"CodeMirror-crosshair");function gi(gl){if(gl.keyCode==18||!gl.altKey){f(gk,"CodeMirror-crosshair");ee(document,"keyup",gi);ee(document,"mouseover",gi)}}bY(document,"keyup",gi);bY(document,"mouseover",gi)}function bj(gi){if(gi.keyCode==16){this.doc.sel.shift=false}aR(this,gi)}function cy(gm){var gi=this;if(bc(gi.display,gm)||aR(gi,gm)||gm.ctrlKey&&!gm.altKey||b8&&gm.metaKey){return}var gl=gm.keyCode,gj=gm.charCode;if(d4&&gl==dn){dn=null;cH(gm);return}if((d4&&(!gm.which||gm.which<10))&&fk(gi,gm)){return}var gk=String.fromCharCode(gj==null?gl:gj);if(ek(gi,gm,gk)){return}gi.display.input.onKeyPress(gm)}function al(gi){gi.state.delayingBlurEvent=true;setTimeout(function(){if(gi.state.delayingBlurEvent){gi.state.delayingBlurEvent=false;aV(gi)}},100)}function cC(gi){if(gi.state.delayingBlurEvent){gi.state.delayingBlurEvent=false}if(gi.options.readOnly=="nocursor"){return}if(!gi.state.focused){aE(gi,"focus",gi);gi.state.focused=true;fB(gi.display.wrapper,"CodeMirror-focused");if(!gi.curOp&&gi.display.selForContextMenu!=gi.doc.sel){gi.display.input.reset();if(c1){setTimeout(function(){gi.display.input.reset(true)},20)}}gi.display.input.receivedFocus()}o(gi)}function aV(gi){if(gi.state.delayingBlurEvent){return}if(gi.state.focused){aE(gi,"blur",gi);gi.state.focused=false;f(gi.display.wrapper,"CodeMirror-focused")}clearInterval(gi.display.blinker);setTimeout(function(){if(!gi.state.focused){gi.display.shift=false}},150)}function ay(gi,gj){if(bc(gi.display,gj)||dh(gi,gj)){return}gi.display.input.onContextMenu(gj)}function dh(gi,gj){if(!fj(gi,"gutterContextMenu")){return false}return gg(gi,gj,"gutterContextMenu",false,aE)}var cY=H.changeEnd=function(gi){if(!gi.text){return gi.to}return W(gi.from.line+gi.text.length-1,fH(gi.text).length+(gi.text.length==1?gi.from.ch:0))};function b0(gl,gk){if(cg(gl,gk.from)<0){return gl}if(cg(gl,gk.to)<=0){return cY(gk)}var gi=gl.line+gk.text.length-(gk.to.line-gk.from.line)-1,gj=gl.ch;if(gl.line==gk.to.line){gj+=cY(gk).ch-gk.to.ch}return W(gi,gj)}function fl(gl,gm){var gj=[];for(var gk=0;gk<gl.sel.ranges.length;gk++){var gi=gl.sel.ranges[gk];gj.push(new dZ(b0(gi.anchor,gm),b0(gi.head,gm)))}return cx(gj,gl.sel.primIndex)}function bv(gk,gj,gi){if(gk.line==gj.line){return W(gi.line,gk.ch-gj.ch+gi.ch)}else{return W(gi.line+(gk.line-gj.line),gk.ch)}}function af(gs,gp,gj){var gk=[];var gi=W(gs.first,0),gt=gi;for(var gm=0;gm<gp.length;gm++){var go=gp[gm];var gr=bv(go.from,gi,gt);var gq=bv(cY(go),gi,gt);gi=go.to;gt=gq;if(gj=="around"){var gn=gs.sel.ranges[gm],gl=cg(gn.head,gn.anchor)<0;gk[gm]=new dZ(gl?gq:gr,gl?gr:gq)}else{gk[gm]=new dZ(gr,gr)}}return new f4(gk,gs.sel.primIndex)}function dS(gj,gl,gk){var gi={canceled:false,from:gl.from,to:gl.to,text:gl.text,origin:gl.origin,cancel:function(){this.canceled=true}};if(gk){gi.update=function(gp,go,gn,gm){if(gp){this.from=fK(gj,gp)}if(go){this.to=fK(gj,go)}if(gn){this.text=gn}if(gm!==undefined){this.origin=gm}}}aE(gj,"beforeChange",gj,gi);if(gj.cm){aE(gj.cm,"beforeChange",gj.cm,gi)}if(gi.canceled){return null}return{from:gi.from,to:gi.to,text:gi.text,origin:gi.origin}}function bh(gl,gm,gk){if(gl.cm){if(!gl.cm.curOp){return c3(gl.cm,bh)(gl,gm,gk)}if(gl.cm.state.suppressEdits){return}}if(fj(gl,"beforeChange")||gl.cm&&fj(gl.cm,"beforeChange")){gm=dS(gl,gm,true);if(!gm){return}}var gj=gd&&!gk&&cI(gl,gm.from,gm.to);if(gj){for(var gi=gj.length-1;gi>=0;--gi){K(gl,{from:gj[gi].from,to:gj[gi].to,text:gi?[""]:gm.text})}}else{K(gl,gm)}}function K(gk,gl){if(gl.text.length==1&&gl.text[0]==""&&cg(gl.from,gl.to)==0){return}var gj=fl(gk,gl);fN(gk,gl,gj,gk.cm?gk.cm.curOp.id:NaN);ef(gk,gl,gj,el(gk,gl));var gi=[];d8(gk,function(gn,gm){if(!gm&&di(gi,gn.history)==-1){dF(gn.history,gl);gi.push(gn.history)}ef(gn,gl,null,el(gn,gl))})}function b9(gt,gr,gv){if(gt.cm&&gt.cm.state.suppressEdits){return}var gq=gt.history,gk,gm=gt.sel;var gi=gr=="undo"?gq.done:gq.undone,gu=gr=="undo"?gq.undone:gq.done;for(var gn=0;gn<gi.length;gn++){gk=gi[gn];if(gv?gk.ranges&&!gk.equals(gt.sel):!gk.ranges){break}}if(gn==gi.length){return}gq.lastOrigin=gq.lastSelOrigin=null;for(;;){gk=gi.pop();if(gk.ranges){cO(gk,gu);if(gv&&!gk.equals(gt.sel)){bV(gt,gk,{clearRedo:false});return}gm=gk}else{break}}var gp=[];cO(gm,gu);gu.push({changes:gp,generation:gq.generation});gq.generation=gk.generation||++gq.maxGeneration;var gl=fj(gt,"beforeChange")||gt.cm&&fj(gt.cm,"beforeChange");for(var gn=gk.changes.length-1;gn>=0;--gn){var gs=gk.changes[gn];gs.origin=gr;if(gl&&!dS(gt,gs,false)){gi.length=0;return}gp.push(dv(gt,gs));var gj=gn?fl(gt,gs):fH(gi);ef(gt,gs,gj,ea(gt,gs));if(!gn&&gt.cm){gt.cm.scrollIntoView({from:gs.from,to:cY(gs)})}var go=[];d8(gt,function(gx,gw){if(!gw&&di(go,gx.history)==-1){dF(gx.history,gs);go.push(gx.history)}ef(gx,gs,null,ea(gx,gs))})}}function fo(gj,gl){if(gl==0){return}gj.first+=gl;gj.sel=new f4(bT(gj.sel.ranges,function(gm){return new dZ(W(gm.anchor.line+gl,gm.anchor.ch),W(gm.head.line+gl,gm.head.ch))}),gj.sel.primIndex);if(gj.cm){ah(gj.cm,gj.first,gj.first-gl,gl);for(var gk=gj.cm.display,gi=gk.viewFrom;gi<gk.viewTo;gi++){R(gj.cm,gi,"gutter")}}}function ef(gm,gn,gl,gj){if(gm.cm&&!gm.cm.curOp){return c3(gm.cm,ef)(gm,gn,gl,gj)}if(gn.to.line<gm.first){fo(gm,gn.text.length-1-(gn.to.line-gn.from.line));return}if(gn.from.line>gm.lastLine()){return}if(gn.from.line<gm.first){var gi=gn.text.length-1-(gm.first-gn.from.line);fo(gm,gi);gn={from:W(gm.first,0),to:W(gn.to.line+gi,gn.to.ch),text:[fH(gn.text)],origin:gn.origin}}var gk=gm.lastLine();if(gn.to.line>gk){gn={from:gn.from,to:W(gk,fg(gm,gk).text.length),text:[gn.text[0]],origin:gn.origin}}gn.removed=f5(gm,gn.from,gn.to);if(!gl){gl=fl(gm,gn)}if(gm.cm){aJ(gm.cm,gn,gj)}else{fz(gm,gn,gj)}eq(gm,gl,Z)}function aJ(gt,gp,gn){var gs=gt.doc,go=gt.display,gq=gp.from,gr=gp.to;var gi=false,gm=gq.line;if(!gt.options.lineWrapping){gm=bO(y(fg(gs,gq.line)));gs.iter(gm,gr.line+1,function(gv){if(gv==go.maxLine){gi=true;return true}})}if(gs.sel.contains(gp.from,gp.to)>-1){V(gt)}fz(gs,gp,gn,bf(gt));if(!gt.options.lineWrapping){gs.iter(gm,gq.line+gp.text.length,function(gw){var gv=eo(gw);if(gv>go.maxLineLength){go.maxLine=gw;go.maxLineLength=gv;go.maxLineChanged=true;gi=false}});if(gi){gt.curOp.updateMaxLine=true}}gs.frontier=Math.min(gs.frontier,gq.line);eg(gt,400);var gu=gp.text.length-(gr.line-gq.line)-1;if(gp.full){ah(gt)}else{if(gq.line==gr.line&&gp.text.length==1&&!dT(gt.doc,gp)){R(gt,gq.line,"text")}else{ah(gt,gq.line,gr.line+1,gu)}}var gk=fj(gt,"changes"),gl=fj(gt,"change");if(gl||gk){var gj={from:gq,to:gr,text:gp.text,removed:gp.removed,origin:gp.origin};if(gl){ae(gt,"change",gt,gj)}if(gk){(gt.curOp.changeObjs||(gt.curOp.changeObjs=[])).push(gj)}}gt.display.selForContextMenu=null}function a2(gl,gk,gn,gm,gi){if(!gm){gm=gn}if(cg(gm,gn)<0){var gj=gm;gm=gn;gn=gj}if(typeof gk=="string"){gk=a1(gk)}bh(gl,{from:gn,to:gm,text:gk,origin:gi})}function d7(gj,gm){if(aR(gj,"scrollCursorIntoView")){return}var gn=gj.display,gk=gn.sizer.getBoundingClientRect(),gi=null;if(gm.top+gk.top<0){gi=true}else{if(gm.bottom+gk.top>(window.innerHeight||document.documentElement.clientHeight)){gi=false}}if(gi!=null&&!fv){var gl=f3("div","\u200b",null,"position: absolute; top: "+(gm.top-gn.viewOffset-e9(gj.display))+"px; height: "+(gm.bottom-gm.top+cU(gj)+gn.barHeight)+"px; left: "+gm.left+"px; width: 2px;");gj.display.lineSpace.appendChild(gl);gl.scrollIntoView(gi);gj.display.lineSpace.removeChild(gl)}}function D(gs,gq,gm,gl){if(gl==null){gl=0}for(var gn=0;gn<5;gn++){var go=false,gr=dV(gs,gq);var gi=!gm||gm==gq?gr:dV(gs,gm);var gk=G(gs,Math.min(gr.left,gi.left),Math.min(gr.top,gi.top)-gl,Math.max(gr.left,gi.left),Math.max(gr.bottom,gi.bottom)+gl);var gp=gs.doc.scrollTop,gj=gs.doc.scrollLeft;if(gk.scrollTop!=null){N(gs,gk.scrollTop);if(Math.abs(gs.doc.scrollTop-gp)>1){go=true}}if(gk.scrollLeft!=null){bF(gs,gk.scrollLeft);if(Math.abs(gs.doc.scrollLeft-gj)>1){go=true}}if(!go){break}}return gr}function E(gi,gk,gm,gj,gl){var gn=G(gi,gk,gm,gj,gl);if(gn.scrollTop!=null){N(gi,gn.scrollTop)}if(gn.scrollLeft!=null){bF(gi,gn.scrollLeft)}}function G(gu,gl,gt,gj,gs){var gq=gu.display,go=aY(gu.display);if(gt<0){gt=0}var gm=gu.curOp&&gu.curOp.scrollTop!=null?gu.curOp.scrollTop:gq.scroller.scrollTop;var gw=cW(gu),gy={};if(gs-gt>gw){gs=gt+gw}var gk=gu.doc.height+bJ(gq);var gi=gt<go,gp=gs>gk-go;if(gt<gm){gy.scrollTop=gi?0:gt}else{if(gs>gm+gw){var gr=Math.min(gt,(gp?gk:gs)-gw);if(gr!=gm){gy.scrollTop=gr}}}var gx=gu.curOp&&gu.curOp.scrollLeft!=null?gu.curOp.scrollLeft:gq.scroller.scrollLeft;var gv=dm(gu)-(gu.options.fixedGutter?gq.gutters.offsetWidth:0);var gn=gj-gl>gv;if(gn){gj=gl+gv}if(gl<10){gy.scrollLeft=0}else{if(gl<gx){gy.scrollLeft=Math.max(0,gl-(gn?0:10))}else{if(gj>gv+gx-3){gy.scrollLeft=gj+(gn?0:10)-gv}}}return gy}function cM(gi,gk,gj){if(gk!=null||gj!=null){fD(gi)}if(gk!=null){gi.curOp.scrollLeft=(gi.curOp.scrollLeft==null?gi.doc.scrollLeft:gi.curOp.scrollLeft)+gk}if(gj!=null){gi.curOp.scrollTop=(gi.curOp.scrollTop==null?gi.doc.scrollTop:gi.curOp.scrollTop)+gj}}function fG(gi){fD(gi);var gj=gi.getCursor(),gl=gj,gk=gj;if(!gi.options.lineWrapping){gl=gj.ch?W(gj.line,gj.ch-1):gj;gk=W(gj.line,gj.ch+1)}gi.curOp.scrollToPos={from:gl,to:gk,margin:gi.options.cursorScrollMargin,isCursor:true}}function fD(gi){var gk=gi.curOp.scrollToPos;if(gk){gi.curOp.scrollToPos=null;var gm=dI(gi,gk.from),gl=dI(gi,gk.to);var gj=G(gi,Math.min(gm.left,gl.left),Math.min(gm.top,gl.top)-gk.margin,Math.max(gm.right,gl.right),Math.max(gm.bottom,gl.bottom)+gk.margin);gi.scrollTo(gj.scrollLeft,gj.scrollTop)}}function ad(gv,gl,gu,gk){var gt=gv.doc,gj;if(gu==null){gu="add"}if(gu=="smart"){if(!gt.mode.indent){gu="prev"}else{gj=dD(gv,gl)}}var gp=gv.options.tabSize;var gw=fg(gt,gl),go=bU(gw.text,null,gp);if(gw.stateAfter){gw.stateAfter=null}var gi=gw.text.match(/^\s*/)[0],gr;if(!gk&&!/\S/.test(gw.text)){gr=0;gu="not"}else{if(gu=="smart"){gr=gt.mode.indent(gj,gw.text.slice(gi.length),gw.text);if(gr==cb||gr>150){if(!gk){return}gu="prev"}}}if(gu=="prev"){if(gl>gt.first){gr=bU(fg(gt,gl-1).text,null,gp)}else{gr=0}}else{if(gu=="add"){gr=go+gv.options.indentUnit}else{if(gu=="subtract"){gr=go-gv.options.indentUnit}else{if(typeof gu=="number"){gr=go+gu}}}}gr=Math.max(0,gr);var gs="",gq=0;if(gv.options.indentWithTabs){for(var gm=Math.floor(gr/gp);gm;--gm){gq+=gp;gs+="\t"}}if(gq<gr){gs+=cq(gr-gq)}if(gs!=gi){a2(gt,gs,W(gl,0),W(gl,gi.length),"+input");gw.stateAfter=null;return true}else{for(var gm=0;gm<gt.sel.ranges.length;gm++){var gn=gt.sel.ranges[gm];if(gn.head.line==gl&&gn.head.ch<gi.length){var gq=W(gl,gi.length);e(gt,gm,new dZ(gq,gq));break}}}}function eA(gl,gk,gi,gn){var gm=gk,gj=gk;if(typeof gk=="number"){gj=fg(gl,c6(gl,gk))}else{gm=bO(gk)}if(gm==null){return null}if(gn(gj,gm)&&gl.cm){R(gl.cm,gm,gi)}return gj}function eY(gi,go){var gj=gi.doc.sel.ranges,gm=[];for(var gl=0;gl<gj.length;gl++){var gk=go(gj[gl]);while(gm.length&&cg(gk.from,fH(gm).to)<=0){var gn=gm.pop();if(cg(gn.from,gk.from)<0){gk.from=gn.from;break}}gm.push(gk)}cN(gi,function(){for(var gp=gm.length-1;gp>=0;gp--){a2(gi.doc,"",gm[gp].from,gm[gp].to,"+delete")}fG(gi)})}function bx(gA,gm,gu,gt,go){var gr=gm.line,gs=gm.ch,gz=gu;var gj=fg(gA,gr);var gx=true;function gy(){var gB=gr+gu;if(gB<gA.first||gB>=gA.first+gA.size){return(gx=false)}gr=gB;return gj=fg(gA,gB)}function gw(gC){var gB=(go?u:ai)(gj,gs,gu,true);if(gB==null){if(!gC&&gy()){if(go){gs=(gu<0?cT:cF)(gj)}else{gs=gu<0?gj.text.length:0}}else{return(gx=false)}}else{gs=gB}return true}if(gt=="char"){gw()}else{if(gt=="column"){gw(true)}else{if(gt=="word"||gt=="group"){var gv=null,gp=gt=="group";var gi=gA.cm&&gA.cm.getHelper(gm,"wordChars");for(var gn=true;;gn=false){if(gu<0&&!gw(!gn)){break}var gk=gj.text.charAt(gs)||"\n";var gl=cB(gk,gi)?"w":gp&&gk=="\n"?"n":!gp||/\s/.test(gk)?null:"p";if(gp&&!gn&&!gl){gl="s"}if(gv&&gv!=gl){if(gu<0){gu=1;gw()}break}if(gl){gv=gl}if(gu>0&&!gw(!gn)){break}}}}}var gq=bW(gA,W(gr,gs),gz,true);if(!gx){gq.hitSide=true}return gq}function br(gq,gl,gi,gp){var go=gq.doc,gn=gl.left,gm;if(gp=="page"){var gk=Math.min(gq.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight);gm=gl.top+gi*(gk-(gi<0?1.5:0.5)*aY(gq.display))}else{if(gp=="line"){gm=gi>0?gl.bottom+3:gl.top-3}}for(;;){var gj=fP(gq,gn,gm);if(!gj.outside){break}if(gi<0?gm<=0:gm>=go.height){gj.hitSide=true;break}gm+=gi*5}return gj}H.prototype={constructor:H,focus:function(){window.focus();this.display.input.focus()},setOption:function(gk,gl){var gj=this.options,gi=gj[gk];if(gj[gk]==gl&&gk!="mode"){return}gj[gk]=gl;if(bg.hasOwnProperty(gk)){c3(this,bg[gk])(this,gl,gi)}},getOption:function(gi){return this.options[gi]},getDoc:function(){return this.doc},addKeyMap:function(gj,gi){this.state.keyMaps[gi?"push":"unshift"](fY(gj))},removeKeyMap:function(gj){var gk=this.state.keyMaps;for(var gi=0;gi<gk.length;++gi){if(gk[gi]==gj||gk[gi].name==gj){gk.splice(gi,1);return true}}},addOverlay:c9(function(gi,gj){var gk=gi.token?gi:H.getMode(this.options,gi);if(gk.startState){throw new Error("Overlays may not be stateful.")}this.state.overlays.push({mode:gk,modeSpec:gi,opaque:gj&&gj.opaque});this.state.modeGen++;ah(this)}),removeOverlay:c9(function(gi){var gk=this.state.overlays;for(var gj=0;gj<gk.length;++gj){var gl=gk[gj].modeSpec;if(gl==gi||typeof gi=="string"&&gl.name==gi){gk.splice(gj,1);this.state.modeGen++;ah(this);return}}}),indentLine:c9(function(gk,gi,gj){if(typeof gi!="string"&&typeof gi!="number"){if(gi==null){gi=this.options.smartIndent?"smart":"prev"}else{gi=gi?"add":"subtract"}}if(ca(this.doc,gk)){ad(this,gk,gi,gj)}}),indentSelection:c9(function(gr){var gi=this.doc.sel.ranges,gl=-1;for(var gn=0;gn<gi.length;gn++){var go=gi[gn];if(!go.empty()){var gp=go.from(),gq=go.to();var gj=Math.max(gl,gp.line);gl=Math.min(this.lastLine(),gq.line-(gq.ch?0:1))+1;for(var gm=gj;gm<gl;++gm){ad(this,gm,gr)}var gk=this.doc.sel.ranges;if(gp.ch==0&&gi.length==gk.length&&gk[gn].from().ch>0){e(this.doc,gn,new dZ(gp,gk[gn].to()),Z)}}else{if(go.head.line>gl){ad(this,go.head.line,gr,true);gl=go.head.line;if(gn==this.doc.sel.primIndex){fG(this)}}}}}),getTokenAt:function(gj,gi){return cr(this,gj,gi)},getLineTokens:function(gj,gi){return cr(this,W(gj),gi,true)},getTokenTypeAt:function(gp){gp=fK(this.doc,gp);var gl=c7(this,fg(this.doc,gp.line));var gn=0,go=(gl.length-1)/2,gk=gp.ch;var gj;if(gk==0){gj=gl[2]}else{for(;;){var gi=(gn+go)>>1;if((gi?gl[gi*2-1]:0)>=gk){go=gi}else{if(gl[gi*2+1]<gk){gn=gi+1}else{gj=gl[gi*2+2];break}}}}var gm=gj?gj.indexOf("cm-overlay "):-1;return gm<0?gj:gm==0?null:gj.slice(0,gm-1)},getModeAt:function(gj){var gi=this.doc.mode;if(!gi.innerMode){return gi}return H.innerMode(gi,this.getTokenAt(gj).state).mode},getHelper:function(gj,gi){return this.getHelpers(gj,gi)[0]},getHelpers:function(gp,gk){var gl=[];if(!fp.hasOwnProperty(gk)){return gl}var gi=fp[gk],go=this.getModeAt(gp);if(typeof go[gk]=="string"){if(gi[go[gk]]){gl.push(gi[go[gk]])}}else{if(go[gk]){for(var gj=0;gj<go[gk].length;gj++){var gn=gi[go[gk][gj]];if(gn){gl.push(gn)}}}else{if(go.helperType&&gi[go.helperType]){gl.push(gi[go.helperType])}else{if(gi[go.name]){gl.push(gi[go.name])}}}}for(var gj=0;gj<gi._global.length;gj++){var gm=gi._global[gj];if(gm.pred(go,this)&&di(gl,gm.val)==-1){gl.push(gm.val)}}return gl},getStateAfter:function(gj,gi){var gk=this.doc;gj=c6(gk,gj==null?gk.first+gk.size-1:gj);return dD(this,gj+1,gi)},cursorCoords:function(gl,gj){var gk,gi=this.doc.sel.primary();if(gl==null){gk=gi.head}else{if(typeof gl=="object"){gk=fK(this.doc,gl)}else{gk=gl?gi.from():gi.to()}}return dV(this,gk,gj||"page")},charCoords:function(gj,gi){return cK(this,fK(this.doc,gj),gi||"page")},coordsChar:function(gi,gj){gi=gf(this,gi,gj||"page");return fP(this,gi.left,gi.top)},lineAtHeight:function(gi,gj){gi=gf(this,{top:gi,left:0},gj||"page").top;return bH(this.doc,gi+this.display.viewOffset)},heightAtLine:function(gj,gm){var gi=false,gk;if(typeof gj=="number"){var gl=this.doc.first+this.doc.size-1;if(gj<this.doc.first){gj=this.doc.first}else{if(gj>gl){gj=gl;gi=true}}gk=fg(this.doc,gj)}else{gk=gj}return eR(this,gk,{top:0,left:0},gm||"page").top+(gi?this.doc.height-bN(gk):0)},defaultTextHeight:function(){return aY(this.display)},defaultCharWidth:function(){return dE(this.display)},setGutterMarker:c9(function(gi,gj,gk){return eA(this.doc,gi,"gutter",function(gl){var gm=gl.gutterMarkers||(gl.gutterMarkers={});gm[gj]=gk;if(!gk&&eV(gm)){gl.gutterMarkers=null}return true})}),clearGutter:c9(function(gk){var gi=this,gl=gi.doc,gj=gl.first;gl.iter(function(gm){if(gm.gutterMarkers&&gm.gutterMarkers[gk]){gm.gutterMarkers[gk]=null;R(gi,gj,"gutter");if(eV(gm.gutterMarkers)){gm.gutterMarkers=null}}++gj})}),lineInfo:function(gi){if(typeof gi=="number"){if(!ca(this.doc,gi)){return null}var gj=gi;gi=fg(this.doc,gi);if(!gi){return null}}else{var gj=bO(gi);if(gj==null){return null}}return{line:gj,handle:gi,text:gi.text,gutterMarkers:gi.gutterMarkers,textClass:gi.textClass,bgClass:gi.bgClass,wrapClass:gi.wrapClass,widgets:gi.widgets}},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(gn,gk,gp,gl,gr){var gm=this.display;gn=dV(this,fK(this.doc,gn));var go=gn.bottom,gj=gn.left;gk.style.position="absolute";gk.setAttribute("cm-ignore-events","true");this.display.input.setUneditable(gk);gm.sizer.appendChild(gk);if(gl=="over"){go=gn.top}else{if(gl=="above"||gl=="near"){var gi=Math.max(gm.wrapper.clientHeight,this.doc.height),gq=Math.max(gm.sizer.clientWidth,gm.lineSpace.clientWidth);if((gl=="above"||gn.bottom+gk.offsetHeight>gi)&&gn.top>gk.offsetHeight){go=gn.top-gk.offsetHeight}else{if(gn.bottom+gk.offsetHeight<=gi){go=gn.bottom}}if(gj+gk.offsetWidth>gq){gj=gq-gk.offsetWidth}}}gk.style.top=go+"px";gk.style.left=gk.style.right="";if(gr=="right"){gj=gm.sizer.clientWidth-gk.offsetWidth;gk.style.right="0px"}else{if(gr=="left"){gj=0}else{if(gr=="middle"){gj=(gm.sizer.clientWidth-gk.offsetWidth)/2}}gk.style.left=gj+"px"}if(gp){E(this,gj,go,gj+gk.offsetWidth,go+gk.offsetHeight)}},triggerOnKeyDown:c9(p),triggerOnKeyPress:c9(cy),triggerOnKeyUp:bj,execCommand:function(gi){if(eE.hasOwnProperty(gi)){return eE[gi](this)}},triggerElectric:c9(function(gi){fW(this,gi)}),findPosH:function(go,gl,gm,gj){var gi=1;if(gl<0){gi=-1;gl=-gl}for(var gk=0,gn=fK(this.doc,go);gk<gl;++gk){gn=bx(this.doc,gn,gi,gm,gj);if(gn.hitSide){break}}return gn},moveH:c9(function(gj,gk){var gi=this;gi.extendSelectionsBy(function(gl){if(gi.display.shift||gi.doc.extend||gl.empty()){return bx(gi.doc,gl.head,gj,gk,gi.options.rtlMoveVisually)}else{return gj<0?gl.from():gl.to()}},cX)}),deleteH:c9(function(gi,gj){var gk=this.doc.sel,gl=this.doc;if(gk.somethingSelected()){gl.replaceSelection("",null,"+delete")}else{eY(this,function(gn){var gm=bx(gl,gn.head,gi,gj,false);return gi<0?{from:gm,to:gn.head}:{from:gn.head,to:gm}})}}),findPosV:function(gn,gk,go,gq){var gi=1,gm=gq;if(gk<0){gi=-1;gk=-gk}for(var gj=0,gp=fK(this.doc,gn);gj<gk;++gj){var gl=dV(this,gp,"div");if(gm==null){gm=gl.left}else{gl.left=gm}gp=br(this,gl,gi,go);if(gp.hitSide){break}}return gp},moveV:c9(function(gj,gl){var gi=this,gn=this.doc,gm=[];var go=!gi.display.shift&&!gn.extend&&gn.sel.somethingSelected();gn.extendSelectionsBy(function(gp){if(go){return gj<0?gp.from():gp.to()}var gr=dV(gi,gp.head,"div");if(gp.goalColumn!=null){gr.left=gp.goalColumn}gm.push(gr.left);var gq=br(gi,gr,gj,gl);if(gl=="page"&&gp==gn.sel.primary()){cM(gi,null,cK(gi,gq,"div").top-gr.top)}return gq},cX);if(gm.length){for(var gk=0;gk<gn.sel.ranges.length;gk++){gn.sel.ranges[gk].goalColumn=gm[gk]}}}),findWordAt:function(gp){var gn=this.doc,gl=fg(gn,gp.line).text;var go=gp.ch,gk=gp.ch;if(gl){var gm=this.getHelper(gp,"wordChars");if((gp.xRel<0||gk==gl.length)&&go){--go}else{++gk}var gj=gl.charAt(go);var gi=cB(gj,gm)?function(gq){return cB(gq,gm)}:/\s/.test(gj)?function(gq){return/\s/.test(gq)}:function(gq){return !/\s/.test(gq)&&!cB(gq)};while(go>0&&gi(gl.charAt(go-1))){--go}while(gk<gl.length&&gi(gl.charAt(gk))){++gk}}return new dZ(W(gp.line,go),W(gp.line,gk))},toggleOverwrite:function(gi){if(gi!=null&&gi==this.state.overwrite){return}if(this.state.overwrite=!this.state.overwrite){fB(this.display.cursorDiv,"CodeMirror-overwrite")}else{f(this.display.cursorDiv,"CodeMirror-overwrite")}aE(this,"overwriteToggle",this,this.state.overwrite)},hasFocus:function(){return this.display.input.getField()==dP()},scrollTo:c9(function(gi,gj){if(gi!=null||gj!=null){fD(this)}if(gi!=null){this.curOp.scrollLeft=gi}if(gj!=null){this.curOp.scrollTop=gj}}),getScrollInfo:function(){var gi=this.display.scroller;return{left:gi.scrollLeft,top:gi.scrollTop,height:gi.scrollHeight-cU(this)-this.display.barHeight,width:gi.scrollWidth-cU(this)-this.display.barWidth,clientHeight:cW(this),clientWidth:dm(this)}},scrollIntoView:c9(function(gj,gk){if(gj==null){gj={from:this.doc.sel.primary().head,to:null};if(gk==null){gk=this.options.cursorScrollMargin}}else{if(typeof gj=="number"){gj={from:W(gj,0),to:null}}else{if(gj.from==null){gj={from:gj,to:null}}}}if(!gj.to){gj.to=gj.from}gj.margin=gk||0;if(gj.from.line!=null){fD(this);this.curOp.scrollToPos=gj}else{var gi=G(this,Math.min(gj.from.left,gj.to.left),Math.min(gj.from.top,gj.to.top)-gj.margin,Math.max(gj.from.right,gj.to.right),Math.max(gj.from.bottom,gj.to.bottom)+gj.margin);this.scrollTo(gi.scrollLeft,gi.scrollTop)}}),setSize:c9(function(gl,gj){var gi=this;function gk(gn){return typeof gn=="number"||/^\d+$/.test(String(gn))?gn+"px":gn}if(gl!=null){gi.display.wrapper.style.width=gk(gl)}if(gj!=null){gi.display.wrapper.style.height=gk(gj)}if(gi.options.lineWrapping){aO(this)}var gm=gi.display.viewFrom;gi.doc.iter(gm,gi.display.viewTo,function(gn){if(gn.widgets){for(var go=0;go<gn.widgets.length;go++){if(gn.widgets[go].noHScroll){R(gi,gm,"widget");break}}}++gm});gi.curOp.forceUpdate=true;aE(gi,"refresh",this)}),operation:function(gi){return cN(this,gi)},refresh:c9(function(){var gi=this.display.cachedTextHeight;ah(this);this.curOp.forceUpdate=true;ak(this);this.scrollTo(this.doc.scrollLeft,this.doc.scrollTop);c5(this);if(gi==null||Math.abs(gi-aY(this.display))>0.5){X(this)}aE(this,"refresh",this)}),swapDoc:c9(function(gj){var gi=this.doc;gi.cm=null;ec(this,gj);ak(this);this.display.input.reset();this.scrollTo(gj.scrollLeft,gj.scrollTop);this.curOp.forceScroll=true;ae(this,"swapDoc",this,gi);return gi}),getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}};bz(H);var e4=H.defaults={};var bg=H.optionHandlers={};function s(gi,gl,gk,gj){H.defaults[gi]=gl;if(gk){bg[gi]=gj?function(gm,go,gn){if(gn!=cd){gk(gm,go,gn)}}:gk}}var cd=H.Init={toString:function(){return"CodeMirror.Init"}};s("value","",function(gi,gj){gi.setValue(gj)},true);s("mode",null,function(gi,gj){gi.doc.modeOption=gj;bs(gi)},true);s("indentUnit",2,bs,true);s("indentWithTabs",false);s("smartIndent",true);s("tabSize",4,function(gi){em(gi);ak(gi);ah(gi)},true);s("specialChars",/[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g,function(gi,gk,gj){gi.state.specialChars=new RegExp(gk.source+(gk.test("\t")?"":"|\t"),"g");if(gj!=H.Init){gi.refresh()}});s("specialCharPlaceholder",fd,function(gi){gi.refresh()},true);s("electricChars",true);s("inputStyle",eh?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},true);s("rtlMoveVisually",!aP);s("wholeLineUpdateBefore",true);s("theme","default",function(gi){cP(gi);dx(gi)},true);s("keyMap","default",function(gi,gm,gj){var gk=fY(gm);var gl=gj!=H.Init&&fY(gj);if(gl&&gl.detach){gl.detach(gi,gk)}if(gk.attach){gk.attach(gi,gl||null)}});s("extraKeys",null);s("lineWrapping",false,eH,true);s("gutters",[],function(gi){cf(gi.options);dx(gi)},true);s("fixedGutter",true,function(gi,gj){gi.display.gutters.style.left=gj?dY(gi.display)+"px":"0";gi.refresh()},true);s("coverGutterNextToScrollbar",false,function(gi){eZ(gi)},true);s("scrollbarStyle","native",function(gi){aD(gi);eZ(gi);gi.display.scrollbars.setScrollTop(gi.doc.scrollTop);gi.display.scrollbars.setScrollLeft(gi.doc.scrollLeft)},true);s("lineNumbers",false,function(gi){cf(gi.options);dx(gi)},true);s("firstLineNumber",1,dx,true);s("lineNumberFormatter",function(gi){return gi},dx,true);s("showCursorWhenSelecting",false,bD,true);s("resetSelectionOnContextMenu",true);s("lineWiseCopyCut",true);s("readOnly",false,function(gi,gj){if(gj=="nocursor"){aV(gi);gi.display.input.blur();gi.display.disabled=true}else{gi.display.disabled=false;if(!gj){gi.display.input.reset()}}});s("disableInput",false,function(gi,gj){if(!gj){gi.display.input.reset()}},true);s("dragDrop",true,f1);s("cursorBlinkRate",530);s("cursorScrollMargin",0);s("cursorHeight",1,bD,true);s("singleCursorHeightPerLine",true,bD,true);s("workTime",100);s("workDelay",100);s("flattenSpans",true,em,true);s("addModeClass",false,em,true);s("pollInterval",100);s("undoDepth",200,function(gi,gj){gi.doc.history.undoDepth=gj});s("historyEventDelay",1250);s("viewportMargin",10,function(gi){gi.refresh()},true);s("maxHighlightLength",10000,em,true);s("moveInputWithCursor",true,function(gi,gj){if(!gj){gi.display.input.resetPosition()}});s("tabindex",null,function(gi,gj){gi.display.input.getField().tabIndex=gj||""});s("autofocus",null);var dt=H.modes={},aS=H.mimeModes={};H.defineMode=function(gi,gj){if(!H.defaults.mode&&gi!="null"){H.defaults.mode=gi}if(arguments.length>2){gj.dependencies=Array.prototype.slice.call(arguments,2)}dt[gi]=gj};H.defineMIME=function(gj,gi){aS[gj]=gi};H.resolveMode=function(gi){if(typeof gi=="string"&&aS.hasOwnProperty(gi)){gi=aS[gi]}else{if(gi&&typeof gi.name=="string"&&aS.hasOwnProperty(gi.name)){var gj=aS[gi.name];if(typeof gj=="string"){gj={name:gj}}gi=cl(gj,gi);gi.name=gj.name}else{if(typeof gi=="string"&&/^[\w\-]+\/[\w\-]+\+xml$/.test(gi)){return H.resolveMode("application/xml")}}}if(typeof gi=="string"){return{name:gi}}else{return gi||{name:"null"}}};H.getMode=function(gj,gi){var gi=H.resolveMode(gi);var gl=dt[gi.name];if(!gl){return H.getMode(gj,"text/plain")}var gm=gl(gj,gi);if(dq.hasOwnProperty(gi.name)){var gk=dq[gi.name];for(var gn in gk){if(!gk.hasOwnProperty(gn)){continue}if(gm.hasOwnProperty(gn)){gm["_"+gn]=gm[gn]}gm[gn]=gk[gn]}}gm.name=gi.name;if(gi.helperType){gm.helperType=gi.helperType}if(gi.modeProps){for(var gn in gi.modeProps){gm[gn]=gi.modeProps[gn]}}return gm};H.defineMode("null",function(){return{token:function(gi){gi.skipToEnd()}}});H.defineMIME("text/plain","null");var dq=H.modeExtensions={};H.extendMode=function(gk,gj){var gi=dq.hasOwnProperty(gk)?dq[gk]:(dq[gk]={});aN(gj,gi)};H.defineExtension=function(gi,gj){H.prototype[gi]=gj};H.defineDocExtension=function(gi,gj){at.prototype[gi]=gj};H.defineOption=s;var a9=[];H.defineInitHook=function(gi){a9.push(gi)};var fp=H.helpers={};H.registerHelper=function(gj,gi,gk){if(!fp.hasOwnProperty(gj)){fp[gj]=H[gj]={_global:[]}}fp[gj][gi]=gk};H.registerGlobalHelper=function(gk,gj,gi,gl){H.registerHelper(gk,gj,gl);fp[gk]._global.push({pred:gi,val:gl})};var b4=H.copyState=function(gl,gi){if(gi===true){return gi}if(gl.copyState){return gl.copyState(gi)}var gk={};for(var gm in gi){var gj=gi[gm];if(gj instanceof Array){gj=gj.concat([])}gk[gm]=gj}return gk};var b1=H.startState=function(gk,gj,gi){return gk.startState?gk.startState(gj,gi):true};H.innerMode=function(gk,gi){while(gk.innerMode){var gj=gk.innerMode(gi);if(!gj||gj.mode==gk){break}gi=gj.state;gk=gj.mode}return gj||{mode:gk,state:gi}};var eE=H.commands={selectAll:function(gi){gi.setSelection(W(gi.firstLine(),0),W(gi.lastLine()),Z)},singleSelection:function(gi){gi.setSelection(gi.getCursor("anchor"),gi.getCursor("head"),Z)},killLine:function(gi){eY(gi,function(gk){if(gk.empty()){var gj=fg(gi.doc,gk.head.line).text.length;if(gk.head.ch==gj&&gk.head.line<gi.lastLine()){return{from:gk.head,to:W(gk.head.line+1,0)}}else{return{from:gk.head,to:W(gk.head.line,gj)}}}else{return{from:gk.from(),to:gk.to()}}})},deleteLine:function(gi){eY(gi,function(gj){return{from:W(gj.from().line,0),to:fK(gi.doc,W(gj.to().line+1,0))}})},delLineLeft:function(gi){eY(gi,function(gj){return{from:W(gj.from().line,0),to:gj.from()}})},delWrappedLineLeft:function(gi){eY(gi,function(gj){var gl=gi.charCoords(gj.head,"div").top+5;var gk=gi.coordsChar({left:0,top:gl},"div");return{from:gk,to:gj.from()}})},delWrappedLineRight:function(gi){eY(gi,function(gj){var gl=gi.charCoords(gj.head,"div").top+5;var gk=gi.coordsChar({left:gi.display.lineDiv.offsetWidth+100,top:gl},"div");return{from:gj.from(),to:gk}})},undo:function(gi){gi.undo()},redo:function(gi){gi.redo()},undoSelection:function(gi){gi.undoSelection()},redoSelection:function(gi){gi.redoSelection()},goDocStart:function(gi){gi.extendSelection(W(gi.firstLine(),0))},goDocEnd:function(gi){gi.extendSelection(W(gi.lastLine()))},goLineStart:function(gi){gi.extendSelectionsBy(function(gj){return bu(gi,gj.head.line)},{origin:"+move",bias:1})},goLineStartSmart:function(gi){gi.extendSelectionsBy(function(gj){return dJ(gi,gj.head)},{origin:"+move",bias:1})},goLineEnd:function(gi){gi.extendSelectionsBy(function(gj){return dQ(gi,gj.head.line)},{origin:"+move",bias:-1})},goLineRight:function(gi){gi.extendSelectionsBy(function(gj){var gk=gi.charCoords(gj.head,"div").top+5;return gi.coordsChar({left:gi.display.lineDiv.offsetWidth+100,top:gk},"div")},cX)},goLineLeft:function(gi){gi.extendSelectionsBy(function(gj){var gk=gi.charCoords(gj.head,"div").top+5;return gi.coordsChar({left:0,top:gk},"div")},cX)},goLineLeftSmart:function(gi){gi.extendSelectionsBy(function(gj){var gk=gi.charCoords(gj.head,"div").top+5;var gl=gi.coordsChar({left:0,top:gk},"div");if(gl.ch<gi.getLine(gl.line).search(/\S/)){return dJ(gi,gj.head)}return gl},cX)},goLineUp:function(gi){gi.moveV(-1,"line")},goLineDown:function(gi){gi.moveV(1,"line")},goPageUp:function(gi){gi.moveV(-1,"page")},goPageDown:function(gi){gi.moveV(1,"page")},goCharLeft:function(gi){gi.moveH(-1,"char")},goCharRight:function(gi){gi.moveH(1,"char")},goColumnLeft:function(gi){gi.moveH(-1,"column")},goColumnRight:function(gi){gi.moveH(1,"column")},goWordLeft:function(gi){gi.moveH(-1,"word")},goGroupRight:function(gi){gi.moveH(1,"group")},goGroupLeft:function(gi){gi.moveH(-1,"group")},goWordRight:function(gi){gi.moveH(1,"word")},delCharBefore:function(gi){gi.deleteH(-1,"char")},delCharAfter:function(gi){gi.deleteH(1,"char")},delWordBefore:function(gi){gi.deleteH(-1,"word")},delWordAfter:function(gi){gi.deleteH(1,"word")},delGroupBefore:function(gi){gi.deleteH(-1,"group")},delGroupAfter:function(gi){gi.deleteH(1,"group")},indentAuto:function(gi){gi.indentSelection("smart")},indentMore:function(gi){gi.indentSelection("add")},indentLess:function(gi){gi.indentSelection("subtract")},insertTab:function(gi){gi.replaceSelection("\t")},insertSoftTab:function(gi){var gk=[],gj=gi.listSelections(),gn=gi.options.tabSize;for(var gm=0;gm<gj.length;gm++){var go=gj[gm].from();var gl=bU(gi.getLine(go.line),go.ch,gn);gk.push(new Array(gn-gl%gn+1).join(" "))}gi.replaceSelections(gk)},defaultTab:function(gi){if(gi.somethingSelected()){gi.indentSelection("add")}else{gi.execCommand("insertTab")}},transposeChars:function(gi){cN(gi,function(){var gl=gi.listSelections(),gk=[];for(var gm=0;gm<gl.length;gm++){var go=gl[gm].head,gj=fg(gi.doc,go.line).text;if(gj){if(go.ch==gj.length){go=new W(go.line,go.ch-1)}if(go.ch>0){go=new W(go.line,go.ch+1);gi.replaceRange(gj.charAt(go.ch-1)+gj.charAt(go.ch-2),W(go.line,go.ch-2),go,"+transpose")}else{if(go.line>gi.doc.first){var gn=fg(gi.doc,go.line-1).text;if(gn){gi.replaceRange(gj.charAt(0)+"\n"+gn.charAt(gn.length-1),W(go.line-1,gn.length-1),W(go.line,1),"+transpose")}}}}gk.push(new dZ(go,go))}gi.setSelections(gk)})},newlineAndIndent:function(gi){cN(gi,function(){var gj=gi.listSelections().length;for(var gl=0;gl<gj;gl++){var gk=gi.listSelections()[gl];gi.replaceRange("\n",gk.anchor,gk.head,"+input");gi.indentLine(gk.from().line+1,null,true);fG(gi)}})},toggleOverwrite:function(gi){gi.toggleOverwrite()}};var fb=H.keyMap={};fb.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"};fb.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"};fb.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars"};fb.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]};fb["default"]=b8?fb.macDefault:fb.pcDefault;function du(gj){var gp=gj.split(/-(?!$)/),gj=gp[gp.length-1];var go,gn,gi,gm;for(var gl=0;gl<gp.length-1;gl++){var gk=gp[gl];if(/^(cmd|meta|m)$/i.test(gk)){gm=true}else{if(/^a(lt)?$/i.test(gk)){go=true}else{if(/^(c|ctrl|control)$/i.test(gk)){gn=true}else{if(/^s(hift)$/i.test(gk)){gi=true}else{throw new Error("Unrecognized modifier name: "+gk)}}}}}if(go){gj="Alt-"+gj}if(gn){gj="Ctrl-"+gj}if(gm){gj="Cmd-"+gj}if(gi){gj="Shift-"+gj}return gj}H.normalizeKeyMap=function(gp){var gj={};for(var go in gp){if(gp.hasOwnProperty(go)){var gq=gp[go];if(/^(name|fallthrough|(de|at)tach)$/.test(go)){continue}if(gq=="..."){delete gp[go];continue}var gr=bT(go.split(" "),du);for(var gn=0;gn<gr.length;gn++){var gl,gk;if(gn==gr.length-1){gk=gr.join(" ");gl=gq}else{gk=gr.slice(0,gn+1).join(" ");gl="..."}var gm=gj[gk];if(!gm){gj[gk]=gl}else{if(gm!=gl){throw new Error("Inconsistent bindings for "+gk)}}}delete gp[go]}}for(var gi in gj){gp[gi]=gj[gi]}return gp};var i=H.lookupKey=function(gl,go,gn,gk){go=fY(go);var gm=go.call?go.call(gl,gk):go[gl];if(gm===false){return"nothing"}if(gm==="..."){return"multi"}if(gm!=null&&gn(gm)){return"handled"}if(go.fallthrough){if(Object.prototype.toString.call(go.fallthrough)!="[object Array]"){return i(gl,go.fallthrough,gn,gk)}for(var gj=0;gj<go.fallthrough.length;gj++){var gi=i(gl,go.fallthrough[gj],gn,gk);if(gi){return gi}}}};var eD=H.isModifierKey=function(gj){var gi=typeof gj=="string"?gj:fh[gj.keyCode];return gi=="Ctrl"||gi=="Alt"||gi=="Shift"||gi=="Mod"};var fs=H.keyName=function(gj,gl){if(d4&&gj.keyCode==34&&gj["char"]){return false}var gk=fh[gj.keyCode],gi=gk;if(gi==null||gj.altGraphKey){return false}if(gj.altKey&&gk!="Alt"){gi="Alt-"+gi}if((bR?gj.metaKey:gj.ctrlKey)&&gk!="Ctrl"){gi="Ctrl-"+gi}if((bR?gj.ctrlKey:gj.metaKey)&&gk!="Cmd"){gi="Cmd-"+gi}if(!gl&&gj.shiftKey&&gk!="Shift"){gi="Shift-"+gi}return gi};function fY(gi){return typeof gi=="string"?fb[gi]:gi}H.fromTextArea=function(gp,gq){gq=gq?aN(gq):{};gq.value=gp.value;if(!gq.tabindex&&gp.tabIndex){gq.tabindex=gp.tabIndex}if(!gq.placeholder&&gp.placeholder){gq.placeholder=gp.placeholder}if(gq.autofocus==null){var gi=dP();gq.autofocus=gi==gp||gp.getAttribute("autofocus")!=null&&gi==document.body}function gm(){gp.value=go.getValue()}if(gp.form){bY(gp.form,"submit",gm);if(!gq.leaveSubmitMethodAlone){var gj=gp.form,gn=gj.submit;try{var gl=gj.submit=function(){gm();gj.submit=gn;gj.submit();gj.submit=gl}}catch(gk){}}}gq.finishInit=function(gr){gr.save=gm;gr.getTextArea=function(){return gp};gr.toTextArea=function(){gr.toTextArea=isNaN;gm();gp.parentNode.removeChild(gr.getWrapperElement());gp.style.display="";if(gp.form){ee(gp.form,"submit",gm);if(typeof gp.form.submit=="function"){gp.form.submit=gn}}}};gp.style.display="none";var go=H(function(gr){gp.parentNode.insertBefore(gr,gp.nextSibling)},gq);return go};var eU=H.StringStream=function(gi,gj){this.pos=this.start=0;this.string=gi;this.tabSize=gj||8;this.lastColumnPos=this.lastColumnValue=0;this.lineStart=0};eU.prototype={eol:function(){return this.pos>=this.string.length},sol:function(){return this.pos==this.lineStart},peek:function(){return this.string.charAt(this.pos)||undefined},next:function(){if(this.pos<this.string.length){return this.string.charAt(this.pos++)}},eat:function(gi){var gk=this.string.charAt(this.pos);if(typeof gi=="string"){var gj=gk==gi}else{var gj=gk&&(gi.test?gi.test(gk):gi(gk))}if(gj){++this.pos;return gk}},eatWhile:function(gi){var gj=this.pos;while(this.eat(gi)){}return this.pos>gj},eatSpace:function(){var gi=this.pos;while(/[\s\u00a0]/.test(this.string.charAt(this.pos))){++this.pos}return this.pos>gi},skipToEnd:function(){this.pos=this.string.length},skipTo:function(gi){var gj=this.string.indexOf(gi,this.pos);if(gj>-1){this.pos=gj;return true}},backUp:function(gi){this.pos-=gi},column:function(){if(this.lastColumnPos<this.start){this.lastColumnValue=bU(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue);this.lastColumnPos=this.start}return this.lastColumnValue-(this.lineStart?bU(this.string,this.lineStart,this.tabSize):0)},indentation:function(){return bU(this.string,null,this.tabSize)-(this.lineStart?bU(this.string,this.lineStart,this.tabSize):0)},match:function(gm,gj,gi){if(typeof gm=="string"){var gn=function(go){return gi?go.toLowerCase():go};var gl=this.string.substr(this.pos,gm.length);if(gn(gl)==gn(gm)){if(gj!==false){this.pos+=gm.length}return true}}else{var gk=this.string.slice(this.pos).match(gm);if(gk&&gk.index>0){return null}if(gk&&gj!==false){this.pos+=gk[0].length}return gk}},current:function(){return this.string.slice(this.start,this.pos)},hideFirstChars:function(gj,gi){this.lineStart+=gj;try{return gi()}finally{this.lineStart-=gj}}};var a6=0;var P=H.TextMarker=function(gj,gi){this.lines=[];this.type=gi;this.doc=gj;this.id=++a6};bz(P);P.prototype.clear=function(){if(this.explicitlyCleared){return}var gp=this.doc.cm,gj=gp&&!gp.curOp;if(gj){cJ(gp)}if(fj(this,"clear")){var gq=this.find();if(gq){ae(this,"clear",gq.from,gq.to)}}var gk=null,gn=null;for(var gl=0;gl<this.lines.length;++gl){var gr=this.lines[gl];var go=fa(gr.markedSpans,this);if(gp&&!this.collapsed){R(gp,bO(gr),"text")}else{if(gp){if(go.to!=null){gn=bO(gr)}if(go.from!=null){gk=bO(gr)}}}gr.markedSpans=eI(gr.markedSpans,go);if(go.from==null&&this.collapsed&&!fx(this.doc,gr)&&gp){f6(gr,aY(gp.display))}}if(gp&&this.collapsed&&!gp.options.lineWrapping){for(var gl=0;gl<this.lines.length;++gl){var gi=y(this.lines[gl]),gm=eo(gi);if(gm>gp.display.maxLineLength){gp.display.maxLine=gi;gp.display.maxLineLength=gm;gp.display.maxLineChanged=true}}}if(gk!=null&&gp&&this.collapsed){ah(gp,gk,gn+1)}this.lines.length=0;this.explicitlyCleared=true;if(this.atomic&&this.doc.cantEdit){this.doc.cantEdit=false;if(gp){ez(gp.doc)}}if(gp){ae(gp,"markerCleared",gp,this)}if(gj){am(gp)}if(this.parent){this.parent.clear()}};P.prototype.find=function(gl,gj){if(gl==null&&this.type=="bookmark"){gl=1}var go,gn;for(var gk=0;gk<this.lines.length;++gk){var gi=this.lines[gk];var gm=fa(gi.markedSpans,this);if(gm.from!=null){go=W(gj?gi:bO(gi),gm.from);if(gl==-1){return go}}if(gm.to!=null){gn=W(gj?gi:bO(gi),gm.to);if(gl==1){return gn}}}return go&&{from:go,to:gn}};P.prototype.changed=function(){var gk=this.find(-1,true),gj=this,gi=this.doc.cm;if(!gk||!gi){return}cN(gi,function(){var gm=gk.line,gn=bO(gk.line);var gl=fc(gi,gn);if(gl){au(gl);gi.curOp.selectionChanged=gi.curOp.forceUpdate=true}gi.curOp.updateMaxLine=true;if(!fx(gj.doc,gm)&&gj.height!=null){var gp=gj.height;gj.height=null;var go=cZ(gj)-gp;if(go){f6(gm,gm.height+go)}}})};P.prototype.attachLine=function(gi){if(!this.lines.length&&this.doc.cm){var gj=this.doc.cm.curOp;if(!gj.maybeHiddenMarkers||di(gj.maybeHiddenMarkers,this)==-1){(gj.maybeUnhiddenMarkers||(gj.maybeUnhiddenMarkers=[])).push(this)}}this.lines.push(gi)};P.prototype.detachLine=function(gi){this.lines.splice(di(this.lines,gi),1);if(!this.lines.length&&this.doc.cm){var gj=this.doc.cm.curOp;(gj.maybeHiddenMarkers||(gj.maybeHiddenMarkers=[])).push(this)}};var a6=0;function eG(gq,go,gp,gs,gm){if(gs&&gs.shared){return O(gq,go,gp,gs,gm)}if(gq.cm&&!gq.cm.curOp){return c3(gq.cm,eG)(gq,go,gp,gs,gm)}var gl=new P(gq,gm),gr=cg(go,gp);if(gs){aN(gs,gl,false)}if(gr>0||gr==0&&gl.clearWhenEmpty!==false){return gl}if(gl.replacedWith){gl.collapsed=true;gl.widgetNode=f3("span",[gl.replacedWith],"CodeMirror-widget");if(!gs.handleMouseEvents){gl.widgetNode.setAttribute("cm-ignore-events","true")}if(gs.insertLeft){gl.widgetNode.insertLeft=true}}if(gl.collapsed){if(z(gq,go.line,go,gp,gl)||go.line!=gp.line&&z(gq,gp.line,go,gp,gl)){throw new Error("Inserting collapsed marker partially overlapping an existing one")}a8=true}if(gl.addToHistory){fN(gq,{from:go,to:gp,origin:"markText"},gq.sel,NaN)}var gj=go.line,gn=gq.cm,gi;gq.iter(gj,gp.line+1,function(gt){if(gn&&gl.collapsed&&!gn.options.lineWrapping&&y(gt)==gn.display.maxLine){gi=true}if(gl.collapsed&&gj!=go.line){f6(gt,0)}ce(gt,new ej(gl,gj==go.line?go.ch:null,gj==gp.line?gp.ch:null));++gj});if(gl.collapsed){gq.iter(go.line,gp.line+1,function(gt){if(fx(gq,gt)){f6(gt,0)}})}if(gl.clearOnEnter){bY(gl,"beforeCursorEnter",function(){gl.clear()})}if(gl.readOnly){gd=true;if(gq.history.done.length||gq.history.undone.length){gq.clearHistory()}}if(gl.collapsed){gl.id=++a6;gl.atomic=true}if(gn){if(gi){gn.curOp.updateMaxLine=true}if(gl.collapsed){ah(gn,go.line,gp.line+1)}else{if(gl.className||gl.title||gl.startStyle||gl.endStyle||gl.css){for(var gk=go.line;gk<=gp.line;gk++){R(gn,gk,"text")}}}if(gl.atomic){ez(gn.doc)}ae(gn,"markerAdded",gn,gl)}return gl}var x=H.SharedTextMarker=function(gk,gj){this.markers=gk;this.primary=gj;for(var gi=0;gi<gk.length;++gi){gk[gi].parent=this}};bz(x);x.prototype.clear=function(){if(this.explicitlyCleared){return}this.explicitlyCleared=true;for(var gi=0;gi<this.markers.length;++gi){this.markers[gi].clear()}ae(this,"clear")};x.prototype.find=function(gj,gi){return this.primary.find(gj,gi)};function O(gm,gp,go,gi,gk){gi=aN(gi);gi.shared=false;var gn=[eG(gm,gp,go,gi,gk)],gj=gn[0];var gl=gi.widgetNode;d8(gm,function(gr){if(gl){gi.widgetNode=gl.cloneNode(true)}gn.push(eG(gr,fK(gr,gp),fK(gr,go),gi,gk));for(var gq=0;gq<gr.linked.length;++gq){if(gr.linked[gq].isParent){return}}gj=fH(gn)});return new x(gn,gj)}function eQ(gi){return gi.findMarks(W(gi.first,0),gi.clipPos(W(gi.lastLine())),function(gj){return gj.parent})}function dG(gn,go){for(var gl=0;gl<go.length;gl++){var gj=go[gl],gp=gj.find();var gi=gn.clipPos(gp.from),gm=gn.clipPos(gp.to);if(cg(gi,gm)){var gk=eG(gn,gi,gm,gj.primary,gj.primary.type);gj.markers.push(gk);gk.parent=gj}}}function ep(gl){for(var gk=0;gk<gl.length;gk++){var gi=gl[gk],gn=[gi.primary.doc];d8(gi.primary.doc,function(go){gn.push(go)});for(var gj=0;gj<gi.markers.length;gj++){var gm=gi.markers[gj];if(di(gn,gm.doc)==-1){gm.parent=null;gi.markers.splice(gj--,1)}}}}function ej(gi,gk,gj){this.marker=gi;this.from=gk;this.to=gj}function fa(gk,gi){if(gk){for(var gj=0;gj<gk.length;++gj){var gl=gk[gj];if(gl.marker==gi){return gl}}}}function eI(gj,gk){for(var gl,gi=0;gi<gj.length;++gi){if(gj[gi]!=gk){(gl||(gl=[])).push(gj[gi])}}return gl}function ce(gi,gj){gi.markedSpans=gi.markedSpans?gi.markedSpans.concat([gj]):[gj];gj.marker.attachLine(gi)}function aQ(gj,gk,go){if(gj){for(var gm=0,gp;gm<gj.length;++gm){var gq=gj[gm],gn=gq.marker;var gi=gq.from==null||(gn.inclusiveLeft?gq.from<=gk:gq.from<gk);if(gi||gq.from==gk&&gn.type=="bookmark"&&(!go||!gq.marker.insertLeft)){var gl=gq.to==null||(gn.inclusiveRight?gq.to>=gk:gq.to>gk);(gp||(gp=[])).push(new ej(gn,gq.from,gl?null:gq.to))}}}return gp}function aB(gj,gl,go){if(gj){for(var gm=0,gp;gm<gj.length;++gm){var gq=gj[gm],gn=gq.marker;var gk=gq.to==null||(gn.inclusiveRight?gq.to>=gl:gq.to>gl);if(gk||gq.from==gl&&gn.type=="bookmark"&&(!go||gq.marker.insertLeft)){var gi=gq.from==null||(gn.inclusiveLeft?gq.from<=gl:gq.from<gl);(gp||(gp=[])).push(new ej(gn,gi?null:gq.from-gl,gq.to==null?null:gq.to-gl))}}}return gp}function el(gu,gr){if(gr.full){return null}var gq=ca(gu,gr.from.line)&&fg(gu,gr.from.line).markedSpans;var gx=ca(gu,gr.to.line)&&fg(gu,gr.to.line).markedSpans;if(!gq&&!gx){return null}var gj=gr.from.ch,gm=gr.to.ch,gp=cg(gr.from,gr.to)==0;var go=aQ(gq,gj,gp);var gw=aB(gx,gm,gp);var gv=gr.text.length==1,gk=fH(gr.text).length+(gv?gj:0);if(go){for(var gl=0;gl<go.length;++gl){var gt=go[gl];if(gt.to==null){var gy=fa(gw,gt.marker);if(!gy){gt.to=gj}else{if(gv){gt.to=gy.to==null?null:gy.to+gk}}}}}if(gw){for(var gl=0;gl<gw.length;++gl){var gt=gw[gl];if(gt.to!=null){gt.to+=gk}if(gt.from==null){var gy=fa(go,gt.marker);if(!gy){gt.from=gk;if(gv){(go||(go=[])).push(gt)}}}else{gt.from+=gk;if(gv){(go||(go=[])).push(gt)}}}}if(go){go=q(go)}if(gw&&gw!=go){gw=q(gw)}var gn=[go];if(!gv){var gs=gr.text.length-2,gi;if(gs>0&&go){for(var gl=0;gl<go.length;++gl){if(go[gl].to==null){(gi||(gi=[])).push(new ej(go[gl].marker,null,null))}}}for(var gl=0;gl<gs;++gl){gn.push(gi)}gn.push(gw)}return gn}function q(gj){for(var gi=0;gi<gj.length;++gi){var gk=gj[gi];if(gk.from!=null&&gk.from==gk.to&&gk.marker.clearWhenEmpty!==false){gj.splice(gi--,1)}}if(!gj.length){return null}return gj}function ea(gq,go){var gi=b5(gq,go);var gr=el(gq,go);if(!gi){return gr}if(!gr){return gi}for(var gl=0;gl<gi.length;++gl){var gm=gi[gl],gn=gr[gl];if(gm&&gn){spans:for(var gk=0;gk<gn.length;++gk){var gp=gn[gk];for(var gj=0;gj<gm.length;++gj){if(gm[gj].marker==gp.marker){continue spans}}gm.push(gp)}}else{if(gn){gi[gl]=gn}}}return gi}function cI(gu,gs,gt){var gm=null;gu.iter(gs.line,gt.line+1,function(gv){if(gv.markedSpans){for(var gw=0;gw<gv.markedSpans.length;++gw){var gx=gv.markedSpans[gw].marker;if(gx.readOnly&&(!gm||di(gm,gx)==-1)){(gm||(gm=[])).push(gx)}}}});if(!gm){return null}var gn=[{from:gs,to:gt}];for(var go=0;go<gm.length;++go){var gp=gm[go],gk=gp.find(0);for(var gl=0;gl<gn.length;++gl){var gj=gn[gl];if(cg(gj.to,gk.from)<0||cg(gj.from,gk.to)>0){continue}var gr=[gl,1],gi=cg(gj.from,gk.from),gq=cg(gj.to,gk.to);if(gi<0||!gp.inclusiveLeft&&!gi){gr.push({from:gj.from,to:gk.from})}if(gq>0||!gp.inclusiveRight&&!gq){gr.push({from:gk.to,to:gj.to})}gn.splice.apply(gn,gr);gl+=gr.length-1}}return gn}function f9(gi){var gk=gi.markedSpans;if(!gk){return}for(var gj=0;gj<gk.length;++gj){gk[gj].marker.detachLine(gi)}gi.markedSpans=null}function c4(gi,gk){if(!gk){return}for(var gj=0;gj<gk.length;++gj){gk[gj].marker.attachLine(gi)}gi.markedSpans=gk}function v(gi){return gi.inclusiveLeft?-1:0}function bX(gi){return gi.inclusiveRight?1:0}function dR(gl,gj){var gn=gl.lines.length-gj.lines.length;if(gn!=0){return gn}var gk=gl.find(),go=gj.find();var gi=cg(gk.from,go.from)||v(gl)-v(gj);if(gi){return -gi}var gm=cg(gk.to,go.to)||bX(gl)-bX(gj);if(gm){return gm}return gj.id-gl.id}function a7(gj,gn){var gi=a8&&gj.markedSpans,gm;if(gi){for(var gl,gk=0;gk<gi.length;++gk){gl=gi[gk];if(gl.marker.collapsed&&(gn?gl.from:gl.to)==null&&(!gm||dR(gm,gl.marker)<0)){gm=gl.marker}}}return gm}function eP(gi){return a7(gi,true)}function ex(gi){return a7(gi,false)}function z(gq,gk,go,gp,gm){var gt=fg(gq,gk);var gi=a8&&gt.markedSpans;if(gi){for(var gl=0;gl<gi.length;++gl){var gj=gi[gl];if(!gj.marker.collapsed){continue}var gs=gj.marker.find(0);var gr=cg(gs.from,go)||v(gj.marker)-v(gm);var gn=cg(gs.to,gp)||bX(gj.marker)-bX(gm);if(gr>=0&&gn<=0||gr<=0&&gn>=0){continue}if(gr<=0&&(cg(gs.to,go)>0||(gj.marker.inclusiveRight&&gm.inclusiveLeft))||gr>=0&&(cg(gs.from,gp)<0||(gj.marker.inclusiveLeft&&gm.inclusiveRight))){return true}}}}function y(gj){var gi;while(gi=eP(gj)){gj=gi.find(-1,true).line}return gj}function g(gk){var gi,gj;while(gi=ex(gk)){gk=gi.find(1,true).line;(gj||(gj=[])).push(gk)}return gj}function aW(gl,gj){var gi=fg(gl,gj),gk=y(gi);if(gi==gk){return gj}return bO(gk)}function d3(gl,gk){if(gk>gl.lastLine()){return gk}var gj=fg(gl,gk),gi;if(!fx(gl,gj)){return gk}while(gi=ex(gj)){gj=gi.find(1,true).line}return bO(gj)+1}function fx(gm,gj){var gi=a8&&gj.markedSpans;if(gi){for(var gl,gk=0;gk<gi.length;++gk){gl=gi[gk];if(!gl.marker.collapsed){continue}if(gl.from==null){return true}if(gl.marker.widgetNode){continue}if(gl.from==0&&gl.marker.inclusiveLeft&&T(gm,gj,gl)){return true}}}}function T(gn,gj,gl){if(gl.to==null){var gi=gl.marker.find(1,true);return T(gn,gi.line,fa(gi.line.markedSpans,gl.marker))}if(gl.marker.inclusiveRight&&gl.to==gj.text.length){return true}for(var gm,gk=0;gk<gj.markedSpans.length;++gk){gm=gj.markedSpans[gk];if(gm.marker.collapsed&&!gm.marker.widgetNode&&gm.from==gl.to&&(gm.to==null||gm.to!=gl.from)&&(gm.marker.inclusiveLeft||gl.marker.inclusiveRight)&&T(gn,gj,gm)){return true}}}var dC=H.LineWidget=function(gl,gk,gi){if(gi){for(var gj in gi){if(gi.hasOwnProperty(gj)){this[gj]=gi[gj]}}}this.doc=gl;this.node=gk};bz(dC);function d0(gi,gj,gk){if(bN(gj)<((gi.curOp&&gi.curOp.scrollTop)||gi.doc.scrollTop)){cM(gi,null,gk)}}dC.prototype.clear=function(){var gj=this.doc.cm,gl=this.line.widgets,gk=this.line,gn=bO(gk);if(gn==null||!gl){return}for(var gm=0;gm<gl.length;++gm){if(gl[gm]==this){gl.splice(gm--,1)}}if(!gl.length){gk.widgets=null}var gi=cZ(this);f6(gk,Math.max(0,gk.height-gi));if(gj){cN(gj,function(){d0(gj,gk,-gi);R(gj,gn,"widget")})}};dC.prototype.changed=function(){var gj=this.height,gi=this.doc.cm,gk=this.line;this.height=null;var gl=cZ(this)-gj;if(!gl){return}f6(gk,gk.height+gl);if(gi){cN(gi,function(){gi.curOp.forceUpdate=true;d0(gi,gk,gl)})}};function cZ(gk){if(gk.height!=null){return gk.height}var gi=gk.doc.cm;if(!gi){return 0}if(!gb(document.body,gk.node)){var gj="position: relative;";if(gk.coverGutter){gj+="margin-left: -"+gi.display.gutters.offsetWidth+"px;"}if(gk.noHScroll){gj+="width: "+gi.display.wrapper.clientWidth+"px;"}bS(gi.display.measure,f3("div",[gk.node],null,gj))}return gk.height=gk.node.offsetHeight}function bI(gn,gm,gk,gj){var gl=new dC(gn,gk,gj);var gi=gn.cm;if(gi&&gl.noHScroll){gi.display.alignWidgets=true}eA(gn,gm,"widget",function(gp){var gq=gp.widgets||(gp.widgets=[]);if(gl.insertAt==null){gq.push(gl)}else{gq.splice(Math.min(gq.length-1,Math.max(0,gl.insertAt)),0,gl)}gl.line=gp;if(gi&&!fx(gn,gp)){var go=bN(gp)<gn.scrollTop;f6(gp,gp.height+cZ(gl));if(go){cM(gi,null,gl.height)}gi.curOp.forceUpdate=true}return true});return gl}var f7=H.Line=function(gk,gj,gi){this.text=gk;c4(this,gj);this.height=gi?gi(this):1};bz(f7);f7.prototype.lineNo=function(){return bO(this)};function en(gj,gm,gk,gi){gj.text=gm;if(gj.stateAfter){gj.stateAfter=null}if(gj.styles){gj.styles=null}if(gj.order!=null){gj.order=null}f9(gj);c4(gj,gk);var gl=gi?gi(gj):1;if(gl!=gj.height){f6(gj,gl)}}function bC(gi){gi.parent=null;f9(gi)}function dj(gk,gj){if(gk){for(;;){var gi=gk.match(/(?:^|\s+)line-(background-)?(\S+)/);if(!gi){break}gk=gk.slice(0,gi.index)+gk.slice(gi.index+gi[0].length);var gl=gi[1]?"bgClass":"textClass";if(gj[gl]==null){gj[gl]=gi[2]}else{if(!(new RegExp("(?:^|s)"+gi[2]+"(?:$|s)")).test(gj[gl])){gj[gl]+=" "+gi[2]}}}}return gk}function fr(gk,gj){if(gk.blankLine){return gk.blankLine(gj)}if(!gk.innerMode){return}var gi=H.innerMode(gk,gj);if(gi.mode.blankLine){return gi.mode.blankLine(gi.state)}}function eB(gn,gm,gl,gi){for(var gj=0;gj<10;gj++){if(gi){gi[0]=H.innerMode(gn,gl).mode}var gk=gn.token(gm,gl);if(gm.pos>gm.start){return gk}}throw new Error("Mode "+gn.name+" failed to advance stream.")}function cr(gr,gp,gm,gl){function gi(gu){return{start:gs.start,end:gs.pos,string:gs.current(),type:gk||null,state:gu?b4(gq.mode,gj):gj}}var gq=gr.doc,gn=gq.mode,gk;gp=fK(gq,gp);var gt=fg(gq,gp.line),gj=dD(gr,gp.line,gm);var gs=new eU(gt.text,gr.options.tabSize),go;if(gl){go=[]}while((gl||gs.pos<gp.ch)&&!gs.eol()){gs.start=gs.pos;gk=eB(gn,gs,gj);if(gl){go.push(gi(true))}}return gl?go:gi()}function w(gs,gu,gn,gj,go,gl,gm){var gk=gn.flattenSpans;if(gk==null){gk=gs.options.flattenSpans}var gq=0,gp=null;var gt=new eU(gu,gs.options.tabSize),gi;var gw=gs.options.addModeClass&&[null];if(gu==""){dj(fr(gn,gj),gl)}while(!gt.eol()){if(gt.pos>gs.options.maxHighlightLength){gk=false;if(gm){dy(gs,gu,gj,gt.pos)}gt.pos=gu.length;gi=null}else{gi=dj(eB(gn,gt,gj,gw),gl)}if(gw){var gv=gw[0].name;if(gv){gi="m-"+(gi?gv+" "+gi:gv)}}if(!gk||gp!=gi){while(gq<gt.start){gq=Math.min(gt.start,gq+50000);go(gq,gp)}gp=gi}gt.start=gt.pos}while(gq<gt.pos){var gr=Math.min(gt.pos,gq+50000);go(gr,gp);gq=gr}}function fA(gp,gr,gi,gm){var gq=[gp.state.modeGen],gl={};w(gp,gr.text,gp.doc.mode,gi,function(gs,gt){gq.push(gs,gt)},gl,gm);for(var gj=0;gj<gp.state.overlays.length;++gj){var gn=gp.state.overlays[gj],go=1,gk=0;w(gp,gr.text,gn.mode,true,function(gs,gu){var gw=go;while(gk<gs){var gt=gq[go];if(gt>gs){gq.splice(go,1,gs,gq[go+1],gt)}go+=2;gk=Math.min(gs,gt)}if(!gu){return}if(gn.opaque){gq.splice(gw,go-gw,gs,"cm-overlay "+gu);go=gw+2}else{for(;gw<go;gw+=2){var gv=gq[gw+1];gq[gw+1]=(gv?gv+" ":"")+"cm-overlay "+gu}}},gl)}return{styles:gq,classes:gl.bgClass||gl.textClass?gl:null}}function c7(gj,gk,gl){if(!gk.styles||gk.styles[0]!=gj.state.modeGen){var gi=fA(gj,gk,gk.stateAfter=dD(gj,bO(gk)));gk.styles=gi.styles;if(gi.classes){gk.styleClasses=gi.classes}else{if(gk.styleClasses){gk.styleClasses=null}}if(gl===gj.doc.frontier){gj.doc.frontier++}}return gk.styles}function dy(gi,gn,gk,gj){var gm=gi.doc.mode;var gl=new eU(gn,gi.options.tabSize);gl.start=gl.pos=gj||0;if(gn==""){fr(gm,gk)}while(!gl.eol()&&gl.pos<=gi.options.maxHighlightLength){eB(gm,gl,gk);gl.start=gl.pos}}var dX={},b2={};function eX(gk,gj){if(!gk||/^\s*$/.test(gk)){return null}var gi=gj.addModeClass?b2:dX;return gi[gk]||(gi[gk]=gk.replace(/\S+/g,"cm-$&"))}function eS(gj,gn){var go=f3("span",null,null,c1?"padding-right: .1px":null);var gl={pre:f3("pre",[go]),content:go,col:0,pos:0,cm:gj,splitSpaces:(dL||c1)&&gj.getOption("lineWrapping")};gn.measure={};for(var gm=0;gm<=(gn.rest?gn.rest.length:0);gm++){var gk=gm?gn.rest[gm-1]:gn.line,gi;gl.pos=0;gl.addToken=t;if(bP(gj.display.measure)&&(gi=a(gk))){gl.addToken=U(gl.addToken,gi)}gl.map=[];var gp=gn!=gj.display.externalMeasured&&bO(gk);bp(gk,gl,c7(gj,gk,gp));if(gk.styleClasses){if(gk.styleClasses.bgClass){gl.bgClass=fT(gk.styleClasses.bgClass,gl.bgClass||"")}if(gk.styleClasses.textClass){gl.textClass=fT(gk.styleClasses.textClass,gl.textClass||"")}}if(gl.map.length==0){gl.map.push(0,0,gl.content.appendChild(bo(gj.display.measure)))}if(gm==0){gn.measure.map=gl.map;gn.measure.cache={}}else{(gn.measure.maps||(gn.measure.maps=[])).push(gl.map);(gn.measure.caches||(gn.measure.caches=[])).push({})}}if(c1&&/\bcm-tab\b/.test(gl.content.lastChild.className)){gl.content.className="cm-tab-wrap-hack"}aE(gj,"renderLine",gj,gn.line,gl.pre);if(gl.pre.className){gl.textClass=fT(gl.pre.className,gl.textClass||"")}return gl}function fd(gj){var gi=f3("span","\u2022","cm-invalidchar");gi.title="\\u"+gj.charCodeAt(0).toString(16);gi.setAttribute("aria-label",gi.title);return gi}function t(gt,go,gy,gv,gr,gA,gn){if(!go){return}var gx=gt.splitSpaces?go.replace(/ {3,}/g,cG):go;var gi=gt.cm.state.specialChars,gj=false;if(!gi.test(go)){gt.col+=go.length;var gw=document.createTextNode(gx);gt.map.push(gt.pos,gt.pos+go.length,gw);if(dL&&k<9){gj=true}gt.pos+=go.length}else{var gw=document.createDocumentFragment(),gl=0;while(true){gi.lastIndex=gl;var gu=gi.exec(go);var gz=gu?gu.index-gl:go.length-gl;if(gz){var gq=document.createTextNode(gx.slice(gl,gl+gz));if(dL&&k<9){gw.appendChild(f3("span",[gq]))}else{gw.appendChild(gq)}gt.map.push(gt.pos,gt.pos+gz,gq);gt.col+=gz;gt.pos+=gz}if(!gu){break}gl+=gz+1;if(gu[0]=="\t"){var gs=gt.cm.options.tabSize,gp=gs-gt.col%gs;var gq=gw.appendChild(f3("span",cq(gp),"cm-tab"));gq.setAttribute("role","presentation");gq.setAttribute("cm-text","\t");gt.col+=gp}else{var gq=gt.cm.options.specialCharPlaceholder(gu[0]);gq.setAttribute("cm-text",gu[0]);if(dL&&k<9){gw.appendChild(f3("span",[gq]))}else{gw.appendChild(gq)}gt.col+=1}gt.map.push(gt.pos,gt.pos+1,gq);gt.pos++}}if(gy||gv||gr||gj||gn){var gk=gy||"";if(gv){gk+=gv}if(gr){gk+=gr}var gm=f3("span",[gw],gk,gn);if(gA){gm.title=gA}return gt.content.appendChild(gm)}gt.content.appendChild(gw)}function cG(gi){var gj=" ";for(var gk=0;gk<gi.length-2;++gk){gj+=gk%2?" ":"\u00a0"}gj+=" ";return gj}function U(gj,gi){return function(gr,gt,gk,go,gu,gs,gq){gk=gk?gk+" cm-force-border":"cm-force-border";var gl=gr.pos,gn=gl+gt.length;for(;;){for(var gp=0;gp<gi.length;gp++){var gm=gi[gp];if(gm.to>gl&&gm.from<=gl){break}}if(gm.to>=gn){return gj(gr,gt,gk,go,gu,gs,gq)}gj(gr,gt.slice(0,gm.to-gl),gk,go,null,gs,gq);go=null;gt=gt.slice(gm.to-gl);gl=gm.to}}}function ac(gj,gl,gi,gk){var gm=!gk&&gi.widgetNode;if(gm){gj.map.push(gj.pos,gj.pos+gl,gm)}if(!gk&&gj.cm.display.input.needsContentAttribute){if(!gm){gm=gj.content.appendChild(document.createElement("span"))}gm.setAttribute("cm-marker",gi.id)}if(gm){gj.cm.display.input.setUneditable(gm);gj.content.appendChild(gm)}gj.pos+=gl}function bp(gr,gy,gq){var gn=gr.markedSpans,gp=gr.text,gw=0;if(!gn){for(var gB=1;gB<gq.length;gB+=2){gy.addToken(gy,gp.slice(gw,gw=gq[gB]),eX(gq[gB+1],gy.cm.options))}return}var gC=gp.length,gm=0,gB=1,gu="",gD,gs;var gF=0,gi,gE,gv,gG,gk;for(;;){if(gF==gm){gi=gE=gv=gG=gs="";gk=null;gF=Infinity;var go=[];for(var gz=0;gz<gn.length;++gz){var gA=gn[gz],gx=gA.marker;if(gx.type=="bookmark"&&gA.from==gm&&gx.widgetNode){go.push(gx)}else{if(gA.from<=gm&&(gA.to==null||gA.to>gm||gx.collapsed&&gA.to==gm&&gA.from==gm)){if(gA.to!=null&&gA.to!=gm&&gF>gA.to){gF=gA.to;gE=""}if(gx.className){gi+=" "+gx.className}if(gx.css){gs=gx.css}if(gx.startStyle&&gA.from==gm){gv+=" "+gx.startStyle}if(gx.endStyle&&gA.to==gF){gE+=" "+gx.endStyle}if(gx.title&&!gG){gG=gx.title}if(gx.collapsed&&(!gk||dR(gk.marker,gx)<0)){gk=gA}}else{if(gA.from>gm&&gF>gA.from){gF=gA.from}}}}if(gk&&(gk.from||0)==gm){ac(gy,(gk.to==null?gC+1:gk.to)-gm,gk.marker,gk.from==null);if(gk.to==null){return}if(gk.to==gm){gk=false}}if(!gk&&go.length){for(var gz=0;gz<go.length;++gz){ac(gy,0,go[gz])}}}if(gm>=gC){break}var gt=Math.min(gC,gF);while(true){if(gu){var gj=gm+gu.length;if(!gk){var gl=gj>gt?gu.slice(0,gt-gm):gu;gy.addToken(gy,gl,gD?gD+gi:gi,gv,gm+gl.length==gF?gE:"",gG,gs)}if(gj>=gt){gu=gu.slice(gt-gm);gm=gt;break}gm=gj;gv=""}gu=gp.slice(gw,gw=gq[gB++]);gD=eX(gq[gB++],gy.cm.options)}}}function dT(gi,gj){return gj.from.ch==0&&gj.to.ch==0&&fH(gj.text)==""&&(!gi.cm||gi.cm.options.wholeLineUpdateBefore)}function fz(gv,gq,gj,gm){function gw(gy){return gj?gj[gy]:null}function gk(gy,gA,gz){en(gy,gA,gz,gm);ae(gy,"change",gy,gq)}function gi(gB,gz){for(var gA=gB,gy=[];gA<gz;++gA){gy.push(new f7(gx[gA],gw(gA),gm))}return gy}var gu=gq.from,gt=gq.to,gx=gq.text;var gr=fg(gv,gu.line),gs=fg(gv,gt.line);var gp=fH(gx),gl=gw(gx.length-1),go=gt.line-gu.line;if(gq.full){gv.insert(0,gi(0,gx.length));gv.remove(gx.length,gv.size-gx.length)}else{if(dT(gv,gq)){var gn=gi(0,gx.length-1);gk(gs,gs.text,gl);if(go){gv.remove(gu.line,go)}if(gn.length){gv.insert(gu.line,gn)}}else{if(gr==gs){if(gx.length==1){gk(gr,gr.text.slice(0,gu.ch)+gp+gr.text.slice(gt.ch),gl)}else{var gn=gi(1,gx.length-1);gn.push(new f7(gp+gr.text.slice(gt.ch),gl,gm));gk(gr,gr.text.slice(0,gu.ch)+gx[0],gw(0));gv.insert(gu.line+1,gn)}}else{if(gx.length==1){gk(gr,gr.text.slice(0,gu.ch)+gx[0]+gs.text.slice(gt.ch),gw(0));gv.remove(gu.line+1,go)}else{gk(gr,gr.text.slice(0,gu.ch)+gx[0],gw(0));gk(gs,gp+gs.text.slice(gt.ch),gl);var gn=gi(1,gx.length-1);if(go>1){gv.remove(gu.line+1,go-1)}gv.insert(gu.line+1,gn)}}}}ae(gv,"change",gv,gq)}function e0(gj){this.lines=gj;this.parent=null;for(var gk=0,gi=0;gk<gj.length;++gk){gj[gk].parent=this;gi+=gj[gk].height}this.height=gi}e0.prototype={chunkSize:function(){return this.lines.length},removeInner:function(gi,gm){for(var gk=gi,gl=gi+gm;gk<gl;++gk){var gj=this.lines[gk];this.height-=gj.height;bC(gj);ae(gj,"delete")}this.lines.splice(gi,gm)},collapse:function(gi){gi.push.apply(gi,this.lines)},insertInner:function(gj,gk,gi){this.height+=gi;this.lines=this.lines.slice(0,gj).concat(gk).concat(this.lines.slice(gj));for(var gl=0;gl<gk.length;++gl){gk[gl].parent=this}},iterN:function(gi,gl,gk){for(var gj=gi+gl;gi<gj;++gi){if(gk(this.lines[gi])){return true}}}};function fy(gl){this.children=gl;var gk=0,gi=0;for(var gj=0;gj<gl.length;++gj){var gm=gl[gj];gk+=gm.chunkSize();gi+=gm.height;gm.parent=this}this.size=gk;this.height=gi;this.parent=null}fy.prototype={chunkSize:function(){return this.size},removeInner:function(gi,gp){this.size-=gp;for(var gk=0;gk<this.children.length;++gk){var go=this.children[gk],gm=go.chunkSize();if(gi<gm){var gl=Math.min(gp,gm-gi),gn=go.height;go.removeInner(gi,gl);this.height-=gn-go.height;if(gm==gl){this.children.splice(gk--,1);go.parent=null}if((gp-=gl)==0){break}gi=0}else{gi-=gm}}if(this.size-gp<25&&(this.children.length>1||!(this.children[0] instanceof e0))){var gj=[];this.collapse(gj);this.children=[new e0(gj)];this.children[0].parent=this}},collapse:function(gi){for(var gj=0;gj<this.children.length;++gj){this.children[gj].collapse(gi)}},insertInner:function(gj,gk,gi){this.size+=gk.length;this.height+=gi;for(var gn=0;gn<this.children.length;++gn){var gp=this.children[gn],go=gp.chunkSize();if(gj<=go){gp.insertInner(gj,gk,gi);if(gp.lines&&gp.lines.length>50){while(gp.lines.length>50){var gm=gp.lines.splice(gp.lines.length-25,25);var gl=new e0(gm);gp.height-=gl.height;this.children.splice(gn+1,0,gl);gl.parent=this}this.maybeSpill()}break}gj-=go}},maybeSpill:function(){if(this.children.length<=10){return}var gl=this;do{var gj=gl.children.splice(gl.children.length-5,5);var gk=new fy(gj);if(!gl.parent){var gm=new fy(gl.children);gm.parent=gl;gl.children=[gm,gk];gl=gm}else{gl.size-=gk.size;gl.height-=gk.height;var gi=di(gl.parent.children,gl);gl.parent.children.splice(gi+1,0,gk)}gk.parent=gl.parent}while(gl.children.length>10);gl.parent.maybeSpill()},iterN:function(gi,go,gn){for(var gj=0;gj<this.children.length;++gj){var gm=this.children[gj],gl=gm.chunkSize();if(gi<gl){var gk=Math.min(go,gl-gi);if(gm.iterN(gi,gk,gn)){return true}if((go-=gk)==0){break}gi=0}else{gi-=gl}}}};var cs=0;var at=H.Doc=function(gk,gj,gi){if(!(this instanceof at)){return new at(gk,gj,gi)}if(gi==null){gi=0}fy.call(this,[new e0([new f7("",null)])]);this.first=gi;this.scrollTop=this.scrollLeft=0;this.cantEdit=false;this.cleanGeneration=1;this.frontier=gi;var gl=W(gi,0);this.sel=eT(gl);this.history=new fU(null);this.id=++cs;this.modeOption=gj;if(typeof gk=="string"){gk=a1(gk)}fz(this,{from:gl,to:gl,text:gk});bV(this,eT(gl),Z)};at.prototype=cl(fy.prototype,{constructor:at,iter:function(gk,gj,gi){if(gi){this.iterN(gk-this.first,gj-gk,gi)}else{this.iterN(this.first,this.first+this.size,gk)}},insert:function(gj,gk){var gi=0;for(var gl=0;gl<gk.length;++gl){gi+=gk[gl].height}this.insertInner(gj-this.first,gk,gi)},remove:function(gi,gj){this.removeInner(gi-this.first,gj)},getValue:function(gj){var gi=a3(this,this.first,this.first+this.size);if(gj===false){return gi}return gi.join(gj||"\n")},setValue:cE(function(gj){var gk=W(this.first,0),gi=this.first+this.size-1;bh(this,{from:gk,to:W(gi,fg(this,gi).text.length),text:a1(gj),origin:"setValue",full:true},true);bV(this,eT(gk))}),replaceRange:function(gj,gl,gk,gi){gl=fK(this,gl);gk=gk?fK(this,gk):gl;a2(this,gj,gl,gk,gi)},getRange:function(gl,gk,gj){var gi=f5(this,fK(this,gl),fK(this,gk));if(gj===false){return gi}return gi.join(gj||"\n")},getLine:function(gj){var gi=this.getLineHandle(gj);return gi&&gi.text},getLineHandle:function(gi){if(ca(this,gi)){return fg(this,gi)}},getLineNumber:function(gi){return bO(gi)},getLineHandleVisualStart:function(gi){if(typeof gi=="number"){gi=fg(this,gi)}return y(gi)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(gi){return fK(this,gi)},getCursor:function(gk){var gi=this.sel.primary(),gj;if(gk==null||gk=="head"){gj=gi.head}else{if(gk=="anchor"){gj=gi.anchor}else{if(gk=="end"||gk=="to"||gk===false){gj=gi.to()}else{gj=gi.from()}}}return gj},listSelections:function(){return this.sel.ranges},somethingSelected:function(){return this.sel.somethingSelected()},setCursor:cE(function(gi,gk,gj){F(this,fK(this,typeof gi=="number"?W(gi,gk||0):gi),null,gj)}),setSelection:cE(function(gj,gk,gi){F(this,fK(this,gj),fK(this,gk||gj),gi)}),extendSelection:cE(function(gk,gi,gj){fX(this,fK(this,gk),gi&&fK(this,gi),gj)}),extendSelections:cE(function(gj,gi){aw(this,d1(this,gj,gi))}),extendSelectionsBy:cE(function(gj,gi){aw(this,bT(this.sel.ranges,gj),gi)}),setSelections:cE(function(gi,gm,gk){if(!gi.length){return}for(var gl=0,gj=[];gl<gi.length;gl++){gj[gl]=new dZ(fK(this,gi[gl].anchor),fK(this,gi[gl].head))}if(gm==null){gm=Math.min(gi.length-1,this.sel.primIndex)}bV(this,cx(gj,gm),gk)}),addSelection:cE(function(gk,gl,gj){var gi=this.sel.ranges.slice(0);gi.push(new dZ(fK(this,gk),fK(this,gl||gk)));bV(this,cx(gi,gi.length-1),gj)}),getSelection:function(gm){var gj=this.sel.ranges,gi;for(var gk=0;gk<gj.length;gk++){var gl=f5(this,gj[gk].from(),gj[gk].to());gi=gi?gi.concat(gl):gl}if(gm===false){return gi}else{return gi.join(gm||"\n")}},getSelections:function(gm){var gl=[],gi=this.sel.ranges;for(var gj=0;gj<gi.length;gj++){var gk=f5(this,gi[gj].from(),gi[gj].to());if(gm!==false){gk=gk.join(gm||"\n")}gl[gj]=gk}return gl},replaceSelection:function(gk,gm,gi){var gl=[];for(var gj=0;gj<this.sel.ranges.length;gj++){gl[gj]=gk}this.replaceSelections(gl,gm,gi||"+input")},replaceSelections:cE(function(gn,gp,gk){var gm=[],go=this.sel;for(var gl=0;gl<go.ranges.length;gl++){var gj=go.ranges[gl];gm[gl]={from:gj.from(),to:gj.to(),text:a1(gn[gl]),origin:gk}}var gi=gp&&gp!="end"&&af(this,gm,gp);for(var gl=gm.length-1;gl>=0;gl--){bh(this,gm[gl])}if(gi){e8(this,gi)}else{if(this.cm){fG(this.cm)}}}),undo:cE(function(){b9(this,"undo")}),redo:cE(function(){b9(this,"redo")}),undoSelection:cE(function(){b9(this,"undo",true)}),redoSelection:cE(function(){b9(this,"redo",true)}),setExtending:function(gi){this.extend=gi},getExtending:function(){return this.extend},historySize:function(){var gl=this.history,gi=0,gk=0;for(var gj=0;gj<gl.done.length;gj++){if(!gl.done[gj].ranges){++gi}}for(var gj=0;gj<gl.undone.length;gj++){if(!gl.undone[gj].ranges){++gk}}return{undo:gi,redo:gk}},clearHistory:function(){this.history=new fU(this.history.maxGeneration)},markClean:function(){this.cleanGeneration=this.changeGeneration(true)},changeGeneration:function(gi){if(gi){this.history.lastOp=this.history.lastSelOp=this.history.lastOrigin=null}return this.history.generation},isClean:function(gi){return this.history.generation==(gi||this.cleanGeneration)},getHistory:function(){return{done:bQ(this.history.done),undone:bQ(this.history.undone)}},setHistory:function(gj){var gi=this.history=new fU(this.history.maxGeneration);gi.done=bQ(gj.done.slice(0),null,true);gi.undone=bQ(gj.undone.slice(0),null,true)},addLineClass:cE(function(gk,gj,gi){return eA(this,gk,gj=="gutter"?"gutter":"class",function(gl){var gm=gj=="text"?"textClass":gj=="background"?"bgClass":gj=="gutter"?"gutterClass":"wrapClass";if(!gl[gm]){gl[gm]=gi}else{if(S(gi).test(gl[gm])){return false}else{gl[gm]+=" "+gi}}return true})}),removeLineClass:cE(function(gk,gj,gi){return eA(this,gk,gj=="gutter"?"gutter":"class",function(gm){var gp=gj=="text"?"textClass":gj=="background"?"bgClass":gj=="gutter"?"gutterClass":"wrapClass";var go=gm[gp];if(!go){return false}else{if(gi==null){gm[gp]=null}else{var gn=go.match(S(gi));if(!gn){return false}var gl=gn.index+gn[0].length;gm[gp]=go.slice(0,gn.index)+(!gn.index||gl==go.length?"":" ")+go.slice(gl)||null}}return true})}),addLineWidget:cE(function(gk,gj,gi){return bI(this,gk,gj,gi)}),removeLineWidget:function(gi){gi.clear()},markText:function(gk,gj,gi){return eG(this,fK(this,gk),fK(this,gj),gi,"range")},setBookmark:function(gk,gi){var gj={replacedWith:gi&&(gi.nodeType==null?gi.widget:gi),insertLeft:gi&&gi.insertLeft,clearWhenEmpty:false,shared:gi&&gi.shared,handleMouseEvents:gi&&gi.handleMouseEvents};gk=fK(this,gk);return eG(this,gk,gk,gj,"bookmark")},findMarksAt:function(gm){gm=fK(this,gm);var gl=[],gj=fg(this,gm.line).markedSpans;if(gj){for(var gi=0;gi<gj.length;++gi){var gk=gj[gi];if((gk.from==null||gk.from<=gm.ch)&&(gk.to==null||gk.to>=gm.ch)){gl.push(gk.marker.parent||gk.marker)}}}return gl},findMarks:function(gm,gl,gi){gm=fK(this,gm);gl=fK(this,gl);var gj=[],gk=gm.line;this.iter(gm.line,gl.line+1,function(gn){var gp=gn.markedSpans;if(gp){for(var go=0;go<gp.length;go++){var gq=gp[go];if(!(gk==gm.line&&gm.ch>gq.to||gq.from==null&&gk!=gm.line||gk==gl.line&&gq.from>gl.ch)&&(!gi||gi(gq.marker))){gj.push(gq.marker.parent||gq.marker)}}}++gk});return gj},getAllMarks:function(){var gi=[];this.iter(function(gk){var gj=gk.markedSpans;if(gj){for(var gl=0;gl<gj.length;++gl){if(gj[gl].from!=null){gi.push(gj[gl].marker)}}}});return gi},posFromIndex:function(gj){var gi,gk=this.first;this.iter(function(gl){var gm=gl.text.length+1;if(gm>gj){gi=gj;return true}gj-=gm;++gk});return fK(this,W(gk,gi))},indexFromPos:function(gj){gj=fK(this,gj);var gi=gj.ch;if(gj.line<this.first||gj.ch<0){return 0}this.iter(this.first,gj.line,function(gk){gi+=gk.text.length+1});return gi},copy:function(gi){var gj=new at(a3(this,this.first,this.first+this.size),this.modeOption,this.first);gj.scrollTop=this.scrollTop;gj.scrollLeft=this.scrollLeft;gj.sel=this.sel;gj.extend=false;if(gi){gj.history.undoDepth=this.history.undoDepth;gj.setHistory(this.getHistory())}return gj},linkedDoc:function(gi){if(!gi){gi={}}var gl=this.first,gk=this.first+this.size;if(gi.from!=null&&gi.from>gl){gl=gi.from}if(gi.to!=null&&gi.to<gk){gk=gi.to}var gj=new at(a3(this,gl,gk),gi.mode||this.modeOption,gl);if(gi.sharedHist){gj.history=this.history}(this.linked||(this.linked=[])).push({doc:gj,sharedHist:gi.sharedHist});gj.linked=[{doc:this,isParent:true,sharedHist:gi.sharedHist}];dG(gj,eQ(this));return gj},unlinkDoc:function(gj){if(gj instanceof H){gj=gj.doc}if(this.linked){for(var gk=0;gk<this.linked.length;++gk){var gl=this.linked[gk];if(gl.doc!=gj){continue}this.linked.splice(gk,1);gj.unlinkDoc(this);ep(eQ(this));break}}if(gj.history==this.history){var gi=[gj.id];d8(gj,function(gm){gi.push(gm.id)},true);gj.history=new fU(null);gj.history.done=bQ(this.history.done,gi);gj.history.undone=bQ(this.history.undone,gi)}},iterLinkedDocs:function(gi){d8(this,gi)},getMode:function(){return this.mode},getEditor:function(){return this.cm}});at.prototype.eachLine=at.prototype.iter;var d="iter insert remove copy getEditor constructor".split(" ");for(var bL in at.prototype){if(at.prototype.hasOwnProperty(bL)&&di(d,bL)<0){H.prototype[bL]=(function(gi){return function(){return gi.apply(this.doc,arguments)}})(at.prototype[bL])}}bz(at);function d8(gl,gk,gj){function gi(gr,gp,gn){if(gr.linked){for(var go=0;go<gr.linked.length;++go){var gm=gr.linked[go];if(gm.doc==gp){continue}var gq=gn&&gm.sharedHist;if(gj&&!gq){continue}gk(gm.doc,gq);gi(gm.doc,gr,gq)}}}gi(gl,null,true)}function ec(gi,gj){if(gj.cm){throw new Error("This document is already in use.")}gi.doc=gj;gj.cm=gi;X(gi);bs(gi);if(!gi.options.lineWrapping){h(gi)}gi.options.mode=gj.modeOption;ah(gi)}function fg(gl,gn){gn-=gl.first;if(gn<0||gn>=gl.size){throw new Error("There is no line "+(gn+gl.first)+" in the document.")}for(var gi=gl;!gi.lines;){for(var gj=0;;++gj){var gm=gi.children[gj],gk=gm.chunkSize();if(gn<gk){gi=gm;break}gn-=gk}}return gi.lines[gn]}function f5(gk,gm,gi){var gj=[],gl=gm.line;gk.iter(gm.line,gi.line+1,function(gn){var go=gn.text;if(gl==gi.line){go=go.slice(0,gi.ch)}if(gl==gm.line){go=go.slice(gm.ch)}gj.push(go);++gl});return gj}function a3(gj,gl,gk){var gi=[];gj.iter(gl,gk,function(gm){gi.push(gm.text)});return gi}function f6(gj,gi){var gk=gi-gj.height;if(gk){for(var gl=gj;gl;gl=gl.parent){gl.height+=gk}}}function bO(gi){if(gi.parent==null){return null}var gm=gi.parent,gl=di(gm.lines,gi);for(var gj=gm.parent;gj;gm=gj,gj=gj.parent){for(var gk=0;;++gk){if(gj.children[gk]==gm){break}gl+=gj.children[gk].chunkSize()}}return gl+gm.first}function bH(gk,gn){var gp=gk.first;outer:do{for(var gl=0;gl<gk.children.length;++gl){var go=gk.children[gl],gm=go.height;if(gn<gm){gk=go;continue outer}gn-=gm;gp+=go.chunkSize()}return gp}while(!gk.lines);for(var gl=0;gl<gk.lines.length;++gl){var gj=gk.lines[gl],gi=gj.height;if(gn<gi){break}gn-=gi}return gp+gl}function bN(gk){gk=y(gk);var gm=0,gj=gk.parent;for(var gl=0;gl<gj.lines.length;++gl){var gi=gj.lines[gl];if(gi==gk){break}else{gm+=gi.height}}for(var gn=gj.parent;gn;gj=gn,gn=gj.parent){for(var gl=0;gl<gn.children.length;++gl){var go=gn.children[gl];if(go==gj){break}else{gm+=go.height}}}return gm}function a(gj){var gi=gj.order;if(gi==null){gi=gj.order=bi(gj.text)}return gi}function fU(gi){this.done=[];this.undone=[];this.undoDepth=Infinity;this.lastModTime=this.lastSelTime=0;this.lastOp=this.lastSelOp=null;this.lastOrigin=this.lastSelOrigin=null;this.generation=this.maxGeneration=gi||1}function dv(gi,gk){var gj={from:cj(gk.from),to:cY(gk),text:f5(gi,gk.from,gk.to)};bZ(gi,gj,gk.from.line,gk.to.line+1);d8(gi,function(gl){bZ(gl,gj,gk.from.line,gk.to.line+1)},true);return gj}function fC(gj){while(gj.length){var gi=fH(gj);if(gi.ranges){gj.pop()}else{break}}}function eN(gj,gi){if(gi){fC(gj.done);return fH(gj.done)}else{if(gj.done.length&&!fH(gj.done).ranges){return fH(gj.done)}else{if(gj.done.length>1&&!gj.done[gj.done.length-2].ranges){gj.done.pop();return fH(gj.done)}}}}function fN(go,gm,gi,gl){var gk=go.history;gk.undone.length=0;var gj=+new Date,gp;if((gk.lastOp==gl||gk.lastOrigin==gm.origin&&gm.origin&&((gm.origin.charAt(0)=="+"&&go.cm&&gk.lastModTime>gj-go.cm.options.historyEventDelay)||gm.origin.charAt(0)=="*"))&&(gp=eN(gk,gk.lastOp==gl))){var gq=fH(gp.changes);if(cg(gm.from,gm.to)==0&&cg(gm.from,gq.to)==0){gq.to=cY(gm)}else{gp.changes.push(dv(go,gm))}}else{var gn=fH(gk.done);if(!gn||!gn.ranges){cO(go.sel,gk.done)}gp={changes:[dv(go,gm)],generation:gk.generation};gk.done.push(gp);while(gk.done.length>gk.undoDepth){gk.done.shift();if(!gk.done[0].ranges){gk.done.shift()}}}gk.done.push(gi);gk.generation=++gk.maxGeneration;gk.lastModTime=gk.lastSelTime=gj;gk.lastOp=gk.lastSelOp=gl;gk.lastOrigin=gk.lastSelOrigin=gm.origin;if(!gq){aE(go,"historyAdded")}}function bB(gm,gi,gk,gl){var gj=gi.charAt(0);return gj=="*"||gj=="+"&&gk.ranges.length==gl.ranges.length&&gk.somethingSelected()==gl.somethingSelected()&&new Date-gm.history.lastSelTime<=(gm.cm?gm.cm.options.historyEventDelay:500)}function gc(gn,gl,gi,gk){var gm=gn.history,gj=gk&&gk.origin;if(gi==gm.lastSelOp||(gj&&gm.lastSelOrigin==gj&&(gm.lastModTime==gm.lastSelTime&&gm.lastOrigin==gj||bB(gn,gj,fH(gm.done),gl)))){gm.done[gm.done.length-1]=gl}else{cO(gl,gm.done)}gm.lastSelTime=+new Date;gm.lastSelOrigin=gj;gm.lastSelOp=gi;if(gk&&gk.clearRedo!==false){fC(gm.undone)}}function cO(gj,gi){var gk=fH(gi);if(!(gk&&gk.ranges&&gk.equals(gj))){gi.push(gj)}}function bZ(gj,gn,gm,gl){var gi=gn["spans_"+gj.id],gk=0;gj.iter(Math.max(gj.first,gm),Math.min(gj.first+gj.size,gl),function(go){if(go.markedSpans){(gi||(gi=gn["spans_"+gj.id]={}))[gk]=go.markedSpans}++gk})}function bm(gk){if(!gk){return null}for(var gj=0,gi;gj<gk.length;++gj){if(gk[gj].marker.explicitlyCleared){if(!gi){gi=gk.slice(0,gj)}}else{if(gi){gi.push(gk[gj])}}}return !gi?gk:gi.length?gi:null}function b5(gl,gm){var gk=gm["spans_"+gl.id];if(!gk){return null}for(var gj=0,gi=[];gj<gm.text.length;++gj){gi.push(bm(gk[gj]))}return gi}function bQ(gt,gl,gs){for(var go=0,gj=[];go<gt.length;++go){var gk=gt[go];if(gk.ranges){gj.push(gs?f4.prototype.deepCopy.call(gk):gk);continue}var gq=gk.changes,gr=[];gj.push({changes:gr});for(var gn=0;gn<gq.length;++gn){var gp=gq[gn],gm;gr.push({from:gp.from,to:gp.to,text:gp.text});if(gl){for(var gi in gp){if(gm=gi.match(/^spans_(\d+)$/)){if(di(gl,Number(gm[1]))>-1){fH(gr)[gi]=gp[gi];delete gp[gi]}}}}}}return gj}function I(gl,gk,gj,gi){if(gj<gl.line){gl.line+=gi}else{if(gk<gl.line){gl.line=gk;gl.ch=0}}}function fi(gl,gn,go,gp){for(var gk=0;gk<gl.length;++gk){var gi=gl[gk],gm=true;if(gi.ranges){if(!gi.copied){gi=gl[gk]=gi.deepCopy();gi.copied=true}for(var gj=0;gj<gi.ranges.length;gj++){I(gi.ranges[gj].anchor,gn,go,gp);I(gi.ranges[gj].head,gn,go,gp)}continue}for(var gj=0;gj<gi.changes.length;++gj){var gq=gi.changes[gj];if(go<gq.from.line){gq.from=W(gq.from.line+gp,gq.from.ch);gq.to=W(gq.to.line+gp,gq.to.ch)}else{if(gn<=gq.to.line){gm=false;break}}}if(!gm){gl.splice(0,gk+1);gk=0}}}function dF(gj,gm){var gl=gm.from.line,gk=gm.to.line,gi=gm.text.length-(gk-gl)-1;fi(gj.done,gl,gk,gi);fi(gj.undone,gl,gk,gi)}var cH=H.e_preventDefault=function(gi){if(gi.preventDefault){gi.preventDefault()}else{gi.returnValue=false}};var dr=H.e_stopPropagation=function(gi){if(gi.stopPropagation){gi.stopPropagation()}else{gi.cancelBubble=true}};function bM(gi){return gi.defaultPrevented!=null?gi.defaultPrevented:gi.returnValue==false}var es=H.e_stop=function(gi){cH(gi);dr(gi)};function L(gi){return gi.target||gi.srcElement}function fO(gj){var gi=gj.which;if(gi==null){if(gj.button&1){gi=1}else{if(gj.button&2){gi=3}else{if(gj.button&4){gi=2}}}}if(b8&&gj.ctrlKey&&gi==1){gi=3}return gi}var bY=H.on=function(gl,gj,gk){if(gl.addEventListener){gl.addEventListener(gj,gk,false)}else{if(gl.attachEvent){gl.attachEvent("on"+gj,gk)}else{var gm=gl._handlers||(gl._handlers={});var gi=gm[gj]||(gm[gj]=[]);gi.push(gk)}}};var ee=H.off=function(gm,gk,gl){if(gm.removeEventListener){gm.removeEventListener(gk,gl,false)}else{if(gm.detachEvent){gm.detachEvent("on"+gk,gl)}else{var gi=gm._handlers&&gm._handlers[gk];if(!gi){return}for(var gj=0;gj<gi.length;++gj){if(gi[gj]==gl){gi.splice(gj,1);break}}}}};var aE=H.signal=function(gm,gl){var gi=gm._handlers&&gm._handlers[gl];if(!gi){return}var gj=Array.prototype.slice.call(arguments,2);for(var gk=0;gk<gi.length;++gk){gi[gk].apply(null,gj)}};var bA=null;function ae(go,gm){var gi=go._handlers&&go._handlers[gm];if(!gi){return}var gk=Array.prototype.slice.call(arguments,2),gn;if(bq){gn=bq.delayedCallbacks}else{if(bA){gn=bA}else{gn=bA=[];setTimeout(aM,0)}}function gj(gp){return function(){gp.apply(null,gk)}}for(var gl=0;gl<gi.length;++gl){gn.push(gj(gi[gl]))}}function aM(){var gi=bA;bA=null;for(var gj=0;gj<gi.length;++gj){gi[gj]()}}function aR(gi,gk,gj){if(typeof gk=="string"){gk={type:gk,preventDefault:function(){this.defaultPrevented=true}}}aE(gi,gj||gk.type,gi,gk);return bM(gk)||gk.codemirrorIgnore}function V(gj){var gi=gj._handlers&&gj._handlers.cursorActivity;if(!gi){return}var gl=gj.curOp.cursorActivityHandlers||(gj.curOp.cursorActivityHandlers=[]);for(var gk=0;gk<gi.length;++gk){if(di(gl,gi[gk])==-1){gl.push(gi[gk])}}}function fj(gk,gj){var gi=gk._handlers&&gk._handlers[gj];return gi&&gi.length>0}function bz(gi){gi.prototype.on=function(gj,gk){bY(this,gj,gk)};gi.prototype.off=function(gj,gk){ee(this,gj,gk)}}var dK=30;var cb=H.Pass={toString:function(){return"CodeMirror.Pass"}};var Z={scroll:false},M={origin:"*mouse"},cX={origin:"+move"};function gh(){this.id=null}gh.prototype.set=function(gi,gj){clearTimeout(this.id);this.id=setTimeout(gj,gi)};var bU=H.countColumn=function(gl,gj,gn,go,gk){if(gj==null){gj=gl.search(/[^\s\u00a0]/);if(gj==-1){gj=gl.length}}for(var gm=go||0,gp=gk||0;;){var gi=gl.indexOf("\t",gm);if(gi<0||gi>=gj){return gp+(gj-gm)}gp+=gi-gm;gp+=gn-(gp%gn);gm=gi+1}};function er(gm,gl,gn){for(var go=0,gk=0;;){var gj=gm.indexOf("\t",go);if(gj==-1){gj=gm.length}var gi=gj-go;if(gj==gm.length||gk+gi>=gl){return go+Math.min(gi,gl-gk)}gk+=gj-go;gk+=gn-(gk%gn);go=gj+1;if(gk>=gl){return go}}}var a0=[""];function cq(gi){while(a0.length<=gi){a0.push(fH(a0)+" ")}return a0[gi]}function fH(gi){return gi[gi.length-1]}var dM=function(gi){gi.select()};if(e2){dM=function(gi){gi.selectionStart=0;gi.selectionEnd=gi.value.length}}else{if(dL){dM=function(gj){try{gj.select()}catch(gi){}}}}function di(gk,gi){for(var gj=0;gj<gk.length;++gj){if(gk[gj]==gi){return gj}}return -1}function bT(gl,gk){var gi=[];for(var gj=0;gj<gl.length;gj++){gi[gj]=gk(gl[gj],gj)}return gi}function fV(){}function cl(gk,gi){var gj;if(Object.create){gj=Object.create(gk)}else{fV.prototype=gk;gj=new fV()}if(gi){aN(gi,gj)}return gj}function aN(gk,gj,gi){if(!gj){gj={}}for(var gl in gk){if(gk.hasOwnProperty(gl)&&(gi!==false||!gj.hasOwnProperty(gl))){gj[gl]=gk[gl]}}return gj}function cw(gj){var gi=Array.prototype.slice.call(arguments,1);return function(){return gj.apply(null,gi)}}var bd=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;var fE=H.isWordChar=function(gi){return/\w/.test(gi)||gi>"\x80"&&(gi.toUpperCase()!=gi.toLowerCase()||bd.test(gi))};function cB(gi,gj){if(!gj){return fE(gi)}if(gj.source.indexOf("\\w")>-1&&fE(gi)){return true}return gj.test(gi)}function eV(gi){for(var gj in gi){if(gi.hasOwnProperty(gj)&&gi[gj]){return false}}return true}var eK=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;function fq(gi){return gi.charCodeAt(0)>=768&&eK.test(gi)}function f3(gi,gm,gl,gk){var gn=document.createElement(gi);if(gl){gn.className=gl}if(gk){gn.style.cssText=gk}if(typeof gm=="string"){gn.appendChild(document.createTextNode(gm))}else{if(gm){for(var gj=0;gj<gm.length;++gj){gn.appendChild(gm[gj])}}}return gn}var cm;if(document.createRange){cm=function(gl,gm,gj,gi){var gk=document.createRange();gk.setEnd(gi||gl,gj);gk.setStart(gl,gm);return gk}}else{cm=function(gk,gm,gi){var gj=document.body.createTextRange();try{gj.moveToElementText(gk.parentNode)}catch(gl){return gj}gj.collapse(true);gj.moveEnd("character",gi);gj.moveStart("character",gm);return gj}}function d2(gj){for(var gi=gj.childNodes.length;gi>0;--gi){gj.removeChild(gj.firstChild)}return gj}function bS(gi,gj){return d2(gi).appendChild(gj)}var gb=H.contains=function(gi,gj){if(gj.nodeType==3){gj=gj.parentNode}if(gi.contains){return gi.contains(gj)}do{if(gj.nodeType==11){gj=gj.host}if(gj==gi){return true}}while(gj=gj.parentNode)};function dP(){return document.activeElement}if(dL&&k<11){dP=function(){try{return document.activeElement}catch(gi){return document.body}}}function S(gi){return new RegExp("(^|\\s)"+gi+"(?:$|\\s)\\s*")}var f=H.rmClass=function(gk,gi){var gl=gk.className;var gj=S(gi).exec(gl);if(gj){var gm=gl.slice(gj.index+gj[0].length);gk.className=gl.slice(0,gj.index)+(gm?gj[1]+gm:"")}};var fB=H.addClass=function(gj,gi){var gk=gj.className;if(!S(gi).test(gk)){gj.className+=(gk?" ":"")+gi}};function fT(gk,gi){var gj=gk.split(" ");for(var gl=0;gl<gj.length;gl++){if(gj[gl]&&!S(gj[gl]).test(gi)){gi+=" "+gj[gl]}}return gi}function aA(gl){if(!document.body.getElementsByClassName){return}var gk=document.body.getElementsByClassName("CodeMirror");for(var gj=0;gj<gk.length;gj++){var gi=gk[gj].CodeMirror;if(gi){gl(gi)}}}var cD=false;function bk(){if(cD){return}fF();cD=true}function fF(){var gi;bY(window,"resize",function(){if(gi==null){gi=setTimeout(function(){gi=null;aA(aT)},100)}});bY(window,"blur",function(){aA(aV)})}var eM=function(){if(dL&&k<9){return false}var gi=f3("div");return"draggable" in gi||"dragDrop" in gi}();var fM;function bo(gi){if(fM==null){var gk=f3("span","\u200b");bS(gi,f3("span",[gk,document.createTextNode("x")]));if(gi.firstChild.offsetHeight!=0){fM=gk.offsetWidth<=1&&gk.offsetHeight>2&&!(dL&&k<8)}}var gj=fM?f3("span","\u200b"):f3("span","\u00a0",null,"display: inline-block; width: 1px; margin-right: -1px");gj.setAttribute("cm-text","");return gj}var fL;function bP(gl){if(fL!=null){return fL}var gi=bS(gl,document.createTextNode("A\u062eA"));var gk=cm(gi,0,1).getBoundingClientRect();if(!gk||gk.left==gk.right){return false}var gj=cm(gi,1,2).getBoundingClientRect();return fL=(gj.right-gk.right<3)}var a1=H.splitLines="\n\nb".split(/\n/).length!=3?function(gn){var go=0,gi=[],gm=gn.length;while(go<=gm){var gl=gn.indexOf("\n",go);if(gl==-1){gl=gn.length}var gk=gn.slice(go,gn.charAt(gl-1)=="\r"?gl-1:gl);var gj=gk.indexOf("\r");if(gj!=-1){gi.push(gk.slice(0,gj));go+=gj+1}else{gi.push(gk);go=gl+1}}return gi}:function(gi){return gi.split(/\r\n?|\n/)};var bt=window.getSelection?function(gj){try{return gj.selectionStart!=gj.selectionEnd}catch(gi){return false}}:function(gk){try{var gi=gk.ownerDocument.selection.createRange()}catch(gj){}if(!gi||gi.parentElement()!=gk){return false}return gi.compareEndPoints("StartToEnd",gi)!=0};var db=(function(){var gi=f3("div");if("oncopy" in gi){return true}gi.setAttribute("oncopy","return;");return typeof gi.oncopy=="function"})();var e7=null;function aK(gj){if(e7!=null){return e7}var gk=bS(gj,f3("span","x"));var gl=gk.getBoundingClientRect();var gi=cm(gk,0,1).getBoundingClientRect();return e7=Math.abs(gl.left-gi.left)>1}var fh={3:"Enter",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",107:"=",109:"-",127:"Delete",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"};H.keyNames=fh;(function(){for(var gi=0;gi<10;gi++){fh[gi+48]=fh[gi+96]=String(gi)}for(var gi=65;gi<=90;gi++){fh[gi]=String.fromCharCode(gi)}for(var gi=1;gi<=12;gi++){fh[gi+111]=fh[gi+63235]="F"+gi}})();function d5(gi,go,gn,gm){if(!gi){return gm(go,gn,"ltr")}var gl=false;for(var gk=0;gk<gi.length;++gk){var gj=gi[gk];if(gj.from<gn&&gj.to>go||go==gn&&gj.to==go){gm(Math.max(gj.from,go),Math.min(gj.to,gn),gj.level==1?"rtl":"ltr");gl=true}}if(!gl){gm(go,gn,"ltr")}}function dz(gi){return gi.level%2?gi.to:gi.from}function ge(gi){return gi.level%2?gi.from:gi.to}function cF(gj){var gi=a(gj);return gi?dz(gi[0]):0}function cT(gj){var gi=a(gj);if(!gi){return gj.text.length}return ge(fH(gi))}function bu(gj,gm){var gk=fg(gj.doc,gm);var gn=y(gk);if(gn!=gk){gm=bO(gn)}var gi=a(gn);var gl=!gi?0:gi[0].level%2?cT(gn):cF(gn);return W(gm,gl)}function dQ(gk,gn){var gj,gl=fg(gk.doc,gn);while(gj=ex(gl)){gl=gj.find(1,true).line;gn=null}var gi=a(gl);var gm=!gi?gl.text.length:gi[0].level%2?cF(gl):cT(gl);return W(gn==null?bO(gl):gn,gm)}function dJ(gj,go){var gn=bu(gj,go.line);var gk=fg(gj.doc,gn.line);var gi=a(gk);if(!gi||gi[0].level==0){var gm=Math.max(0,gk.text.search(/\S/));var gl=go.line==gn.line&&go.ch<=gm&&go.ch;return W(gn.line,gl?0:gm)}return gn}function an(gj,gk,gi){var gl=gj[0].level;if(gk==gl){return true}if(gi==gl){return false}return gk<gi}var e3;function aG(gi,gm){e3=null;for(var gj=0,gk;gj<gi.length;++gj){var gl=gi[gj];if(gl.from<gm&&gl.to>gm){return gj}if((gl.from==gm||gl.to==gm)){if(gk==null){gk=gj}else{if(an(gi,gl.level,gi[gk].level)){if(gl.from!=gl.to){e3=gk}return gj}else{if(gl.from!=gl.to){e3=gj}return gk}}}}return gk}function ff(gi,gl,gj,gk){if(!gk){return gl+gj}do{gl+=gj}while(gl>0&&fq(gi.text.charAt(gl)));return gl}function u(gi,gp,gk,gl){var gm=a(gi);if(!gm){return ai(gi,gp,gk,gl)}var go=aG(gm,gp),gj=gm[go];var gn=ff(gi,gp,gj.level%2?-gk:gk,gl);for(;;){if(gn>gj.from&&gn<gj.to){return gn}if(gn==gj.from||gn==gj.to){if(aG(gm,gn)==go){return gn}gj=gm[go+=gk];return(gk>0)==gj.level%2?gj.to:gj.from}else{gj=gm[go+=gk];if(!gj){return null}if((gk>0)==gj.level%2){gn=ff(gi,gj.to,-1,gl)}else{gn=ff(gi,gj.from,1,gl)}}}}function ai(gi,gm,gj,gk){var gl=gm+gj;if(gk){while(gl>0&&fq(gi.text.charAt(gl))){gl+=gj}}return gl<0||gl>gi.text.length?null:gl}var bi=(function(){var go="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN";var gm="rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm";function gl(gs){if(gs<=247){return go.charAt(gs)}else{if(1424<=gs&&gs<=1524){return"R"}else{if(1536<=gs&&gs<=1773){return gm.charAt(gs-1536)}else{if(1774<=gs&&gs<=2220){return"r"}else{if(8192<=gs&&gs<=8203){return"w"}else{if(gs==8204){return"b"}else{return"L"}}}}}}}var gi=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;var gr=/[stwN]/,gk=/[LRr]/,gj=/[Lb1n]/,gn=/[1n]/;var gq="L";function gp(gu,gt,gs){this.level=gu;this.from=gt;this.to=gs}return function(gC){if(!gi.test(gC)){return false}var gI=gC.length,gy=[];for(var gH=0,gu;gH<gI;++gH){gy.push(gu=gl(gC.charCodeAt(gH)))}for(var gH=0,gB=gq;gH<gI;++gH){var gu=gy[gH];if(gu=="m"){gy[gH]=gB}else{gB=gu}}for(var gH=0,gs=gq;gH<gI;++gH){var gu=gy[gH];if(gu=="1"&&gs=="r"){gy[gH]="n"}else{if(gk.test(gu)){gs=gu;if(gu=="r"){gy[gH]="R"}}}}for(var gH=1,gB=gy[0];gH<gI-1;++gH){var gu=gy[gH];if(gu=="+"&&gB=="1"&&gy[gH+1]=="1"){gy[gH]="1"}else{if(gu==","&&gB==gy[gH+1]&&(gB=="1"||gB=="n")){gy[gH]=gB}}gB=gu}for(var gH=0;gH<gI;++gH){var gu=gy[gH];if(gu==","){gy[gH]="N"}else{if(gu=="%"){for(var gv=gH+1;gv<gI&&gy[gv]=="%";++gv){}var gJ=(gH&&gy[gH-1]=="!")||(gv<gI&&gy[gv]=="1")?"1":"N";for(var gF=gH;gF<gv;++gF){gy[gF]=gJ}gH=gv-1}}}for(var gH=0,gs=gq;gH<gI;++gH){var gu=gy[gH];if(gs=="L"&&gu=="1"){gy[gH]="L"}else{if(gk.test(gu)){gs=gu}}}for(var gH=0;gH<gI;++gH){if(gr.test(gy[gH])){for(var gv=gH+1;gv<gI&&gr.test(gy[gv]);++gv){}var gz=(gH?gy[gH-1]:gq)=="L";var gt=(gv<gI?gy[gv]:gq)=="L";var gJ=gz||gt?"L":"R";for(var gF=gH;gF<gv;++gF){gy[gF]=gJ}gH=gv-1}}var gG=[],gD;for(var gH=0;gH<gI;){if(gj.test(gy[gH])){var gw=gH;for(++gH;gH<gI&&gj.test(gy[gH]);++gH){}gG.push(new gp(0,gw,gH))}else{var gx=gH,gA=gG.length;for(++gH;gH<gI&&gy[gH]!="L";++gH){}for(var gF=gx;gF<gH;){if(gn.test(gy[gF])){if(gx<gF){gG.splice(gA,0,new gp(1,gx,gF))}var gE=gF;for(++gF;gF<gH&&gn.test(gy[gF]);++gF){}gG.splice(gA,0,new gp(2,gE,gF));gx=gF}else{++gF}}if(gx<gH){gG.splice(gA,0,new gp(1,gx,gH))}}}if(gG[0].level==1&&(gD=gC.match(/^\s+/))){gG[0].from=gD[0].length;gG.unshift(new gp(0,0,gD[0].length))}if(fH(gG).level==1&&(gD=gC.match(/\s+$/))){fH(gG).to-=gD[0].length;gG.push(new gp(0,gI-gD[0].length,gI))}if(gG[0].level==2){gG.unshift(new gp(1,gG[0].to,gG[0].to))}if(gG[0].level!=fH(gG).level){gG.push(new gp(gG[0].level,gI,gI))}return gG}})();H.version="5.4.0";return H});
com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/templatemode/index.html000060400000000054152453623450032333 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/templatemode/plugin.js000060400000014275152453623450032204 0ustar00components(function() {
	var a= {
		exec:function(editor){
			SetClass("acyeditor_text", editor);
		}
	};
	var b= {
		exec:function(editor){
			SetClass("acyeditor_picture", editor);
		}
	};
	var c= {
		exec:function(editor){
			SetClass("acyeditor_delete", editor);
		}
	};
	var g= {
		canUndo: false,
		exec:function(editor){
			if (parent.AddRemoveTemplateCss)
			{
				AddRemoveTemplateCss();
			}
		}
	};
	var i={
		exec:function(editor){
			initAreas();
		}
	};
	var k={
		exec:function(editor){
			SetSortable(editor);
		}
	};
	var d='setText';
	var e='setPicture';
	var f='setDelete';
	var h='showAreas';
	var j='initAreas';
	var l='setSortable';

	CKEDITOR.plugins.add("templatemode",{
		init:function(editor){
			editor.addCommand(d,a);
			editor.addCommand(e,b);
			editor.addCommand(f,c);
			editor.addCommand(h,g);
			editor.addCommand(j,i);
			editor.addCommand(l,k);
			editor.ui.addButton("textarea",{label: parent.tooltipTemplateText,
											icon: this.path.split("/plugins/")[0] + "/media/com_acymailing/images/editor/icon-16-edittext.png",
											command:d,
											className: "boutontemplate_text",
											toolbar: "templatemode"});
			editor.ui.addButton("picturearea",{label: parent.tooltipTemplatePicture,
											 icon: this.path.split("/plugins/")[0] + "/media/com_acymailing/images/editor/icon-16-editpicture.png",
											 command:e,
											 className: "boutontemplate_picture",
											toolbar: "templatemode"});
			editor.ui.addButton("deletearea",{label: parent.tooltipTemplateDelete,
											icon: this.path.split("/plugins/")[0] + "/media/com_acymailing/images/editor/icon-16-delete.png",
											command:f,
											className: "boutontemplate_delete",
											toolbar: "templatemode"});
			editor.ui.addButton("sortablearea",{label: parent.tooltipTemplateSortable,
												icon: this.path.split("/plugins/")[0] + "/media/com_acymailing/images/editor/icon-16-sortable.png",
												command: l,
												className: "boutontemplate_sortable",
												toolbar: "templatemode"});
			editor.ui.addButton("showarea",{label: parent.tooltipShowAreas,
											icon: this.path.split("/plugins/")[0] + "/media/com_acymailing/images/editor/icon-16-show.png",
											command:h,
											className: "boutontemplate_show",
											toolbar: "templatemode"});
			editor.ui.addButton("initareas",{label:parent.tooltipInitAreas,
												icon: this.path.split("/plugins/")[0] + "/media/com_acymailing/images/editor/icon-16-initareas.png",
												command: j,
												className:"boutontemplate_initareas",
												toolbar: "templatemode"});

			editor.on( 'selectionChange', function() {
				SetAnchorNodeIE()
				if (parent.SetStateForSelection)
				{
					parent.SetStateForSelection();
				}
			});
		}
	});

	function initAreas(){
		var removeConfirm = confirm(parent.confirmInitAreas);
		if(removeConfirm){
			var acyframe =  jQuery('#edition_en_cours')[0].parentElement.getElementsByTagName("iframe")[0];
			var zoneGlob = acyframe.contentWindow.document.body.getElementsByTagName('*');
			jQuery(zoneGlob).find('.acyeditor_text').removeClass('acyeditor_text');
			jQuery(zoneGlob).find('.acyeditor_picture').removeClass('acyeditor_picture');
			jQuery(zoneGlob).find('.acyeditor_delete').removeClass('acyeditor_delete');
			jQuery(zoneGlob).find('.acyeditor_sortable').removeClass('acyeditor_sortable');
		}
		parent.SetTitleTemplate();
	}

	function SetClass(classe, editor){

		var acyframe =  jQuery('#edition_en_cours')[0].parentElement.getElementsByTagName("iframe")[0];

		var node = null;
		if (parent.isBrowserIE())
		{
			if (parent.anchorNodeIE == undefined)
			{
				SetAnchorNodeIE();
			}
			node = parent.GetParentForClass(parent.anchorNodeIE, classe);
		}
		else if (acyframe != null
				&& acyframe != undefined
				&& acyframe.contentWindow != null
				&& acyframe.contentWindow != undefined
				&& acyframe.contentWindow.getSelection)
		{
			var sel = acyframe.contentWindow.getSelection();
			if (sel.anchorNode) {
				node = parent.GetParentForClass(sel.anchorNode, classe);
			}
		}
		SetClassNode(classe, editor, node);

		parent.SetStateForSelection();
	}

	function SetClassNode(classe, editor, node){
		if (node != null && node != undefined)
		{
			if (node.className != null && node.className != undefined && node.className.indexOf(classe) < 0)
			{
				if (classe == "acyeditor_text")
				{
					jQuery(node).removeClass("acyeditor_picture");
				}
				else if (classe == "acyeditor_picture")
				{
					jQuery(node).removeClass("acyeditor_text");
				}
				jQuery(node).addClass(classe);
			}
			else
			{
				jQuery(node).removeClass(classe);
			}
			parent.SetTitleTemplate();
		}
	}

	function SetAnchorNodeIE()
	{
		if (parent.isBrowserIE())
		{
			var acyframe =  jQuery('#edition_en_cours')[0].parentElement.getElementsByTagName("iframe")[0];
			parent.anchorNodeIE = undefined;
			if (acyframe != null
			 && acyframe != undefined
			 && acyframe.contentWindow.document != null
			 && acyframe.contentWindow.document != undefined
			 && acyframe.contentWindow.document.selection)
			{
				if (acyframe.contentWindow.document.selection.createRange().parentElement)
				{
					parent.anchorNodeIE = acyframe.contentWindow.document.selection.createRange().parentElement();
				}
				else if (acyframe.contentWindow.document.selection.createRange().item)
				{
					parent.anchorNodeIE = acyframe.contentWindow.document.selection.createRange().item(0);
				}
			}
		}
	}

	function SetSortable(editor){
		var acyframe =  jQuery('#edition_en_cours')[0].parentElement.getElementsByTagName("iframe")[0];
		var node = null;
		if (parent.isBrowserIE()){
			if (parent.anchorNodeIE == undefined){
				SetAnchorNodeIE();
			}
			node = parent.anchorNodeIE;
		}
		else if (acyframe != null
				&& acyframe != undefined
				&& acyframe.contentWindow != null
				&& acyframe.contentWindow != undefined
				&& acyframe.contentWindow.getSelection){
			var sel = acyframe.contentWindow.getSelection();
			if (sel.anchorNode){
				node = sel.anchorNode;
			}
		}
		var tableSortable = jQuery(node).closest('tbody');
		if(tableSortable.hasClass('acyeditor_sortable')){
			tableSortable.removeClass('acyeditor_sortable');
		} else{
			tableSortable.addClass('acyeditor_sortable');
		}
		parent.SetStateForSelection();
	}
})();

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/link/index.html000060400000000054152453623450030610 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/link/dialogs/index.html000060400000000054152453623450032232 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/link/dialogs/link.js000060400000025300152453623450031531 0ustar00components(function(){CKEDITOR.dialog.add("link",function(g){var l=CKEDITOR.plugins.link,m=function(){var a=this.getDialog(),b=a.getContentElement("target","popupFeatures"),a=a.getContentElement("target","linkTargetName"),k=this.getValue();if(b&&a)switch(b=b.getElement(),b.hide(),a.setValue(""),k){case "frame":a.setLabel(g.lang.link.targetFrameName);a.getElement().show();break;case "popup":b.show();a.setLabel(g.lang.link.targetPopupName);a.getElement().show();break;default:a.setValue(k),a.getElement().hide()}},
f=function(a){a.target&&this.setValue(a.target[this.id]||"")},h=function(a){a.advanced&&this.setValue(a.advanced[this.id]||"")},i=function(a){a.target||(a.target={});a.target[this.id]=this.getValue()||""},j=function(a){a.advanced||(a.advanced={});a.advanced[this.id]=this.getValue()||""},c=g.lang.common,b=g.lang.link,d;return{title:b.title,minWidth:350,minHeight:230,contents:[{id:"info",label:b.info,title:b.info,elements:[{id:"linkType",type:"select",label:b.type,"default":"url",items:[[b.toUrl,"url"],
[b.toAnchor,"anchor"],[b.toEmail,"email"]],onChange:function(){var a=this.getDialog(),b=["urlOptions","anchorOptions","emailOptions"],k=this.getValue(),e=a.definition.getContents("upload"),e=e&&e.hidden;"url"==k?(g.config.linkShowTargetTab&&a.showPage("target"),e||a.showPage("upload")):(a.hidePage("target"),e||a.hidePage("upload"));for(e=0;e<b.length;e++){var c=a.getContentElement("info",b[e]);c&&(c=c.getElement().getParent().getParent(),b[e]==k+"Options"?c.show():c.hide())}a.layout()},setup:function(a){this.setValue(a.type||
"url")},commit:function(a){a.type=this.getValue()}},{type:"vbox",id:"urlOptions",children:[{type:"hbox",widths:["25%","75%"],children:[{id:"protocol",type:"select",label:c.protocol,"default":"http://",items:[["http://‎","http://"],["https://‎","https://"],["ftp://‎","ftp://"],["news://‎","news://"],[b.other,""]],setup:function(a){a.url&&this.setValue(a.url.protocol||"")},commit:function(a){a.url||(a.url={});a.url.protocol=this.getValue()}},{type:"text",id:"url",label:c.url,required:!0,onLoad:function(){this.allowOnChange=
!0},onKeyUp:function(){this.allowOnChange=!1;var a=this.getDialog().getContentElement("info","protocol"),b=this.getValue(),k=/^((javascript:)|[#\/\.\?])/i,c=/^(http|https|ftp|news):\/\/(?=.)/i.exec(b);c?(this.setValue(b.substr(c[0].length)),a.setValue(c[0].toLowerCase())):k.test(b)&&a.setValue("");this.allowOnChange=!0},onChange:function(){if(this.allowOnChange)this.onKeyUp()},validate:function(){var a=this.getDialog();return a.getContentElement("info","linkType")&&"url"!=a.getValueOf("info","linkType")?
!0:!g.config.linkJavaScriptLinksAllowed&&/javascript\:/.test(this.getValue())?(alert(c.invalidValue),!1):this.getDialog().fakeObj?!0:CKEDITOR.dialog.validate.notEmpty(b.noUrl).apply(this)},setup:function(a){this.allowOnChange=!1;a.url&&this.setValue(a.url.url);this.allowOnChange=!0},commit:function(a){this.onChange();a.url||(a.url={});a.url.url=this.getValue();this.allowOnChange=!1}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().show()}},{type:"button",
id:"browse",hidden:"true",filebrowser:"info:url",label:c.browseServer}]},{type:"vbox",id:"anchorOptions",width:260,align:"center",padding:0,children:[{type:"fieldset",id:"selectAnchorText",label:b.selectAnchor,setup:function(){d=l.getEditorAnchors(g);this.getElement()[d&&d.length?"show":"hide"]()},children:[{type:"hbox",id:"selectAnchor",children:[{type:"select",id:"anchorName","default":"",label:b.anchorName,style:"width: 100%;",items:[[""]],setup:function(a){this.clear();this.add("");if(d)for(var b=
0;b<d.length;b++)d[b].name&&this.add(d[b].name);a.anchor&&this.setValue(a.anchor.name);(a=this.getDialog().getContentElement("info","linkType"))&&"email"==a.getValue()&&this.focus()},commit:function(a){a.anchor||(a.anchor={});a.anchor.name=this.getValue()}},{type:"select",id:"anchorId","default":"",label:b.anchorId,style:"width: 100%;",items:[[""]],setup:function(a){this.clear();this.add("");if(d)for(var b=0;b<d.length;b++)d[b].id&&this.add(d[b].id);a.anchor&&this.setValue(a.anchor.id)},commit:function(a){a.anchor||
(a.anchor={});a.anchor.id=this.getValue()}}],setup:function(){this.getElement()[d&&d.length?"show":"hide"]()}}]},{type:"html",id:"noAnchors",style:"text-align: center;",html:'<div role="note" tabIndex="-1">'+CKEDITOR.tools.htmlEncode(b.noAnchors)+"</div>",focus:!0,setup:function(){this.getElement()[d&&d.length?"hide":"show"]()}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().hide()}},{type:"vbox",id:"emailOptions",padding:1,children:[{type:"text",id:"emailAddress",
label:b.emailAddress,required:!0,validate:function(){var a=this.getDialog();return!a.getContentElement("info","linkType")||"email"!=a.getValueOf("info","linkType")?!0:CKEDITOR.dialog.validate.notEmpty(b.noEmail).apply(this)},setup:function(a){a.email&&this.setValue(a.email.address);(a=this.getDialog().getContentElement("info","linkType"))&&"email"==a.getValue()&&this.select()},commit:function(a){a.email||(a.email={});a.email.address=this.getValue()}},{type:"text",id:"emailSubject",label:b.emailSubject,
setup:function(a){a.email&&this.setValue(a.email.subject)},commit:function(a){a.email||(a.email={});a.email.subject=this.getValue()}},{type:"textarea",id:"emailBody",label:b.emailBody,rows:3,"default":"",setup:function(a){a.email&&this.setValue(a.email.body)},commit:function(a){a.email||(a.email={});a.email.body=this.getValue()}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().hide()}}]},{id:"target",requiredContent:"a[target]",label:b.target,title:b.target,
elements:[{type:"hbox",widths:["50%","50%"],children:[{type:"select",id:"linkTargetType",label:c.target,"default":"notSet",style:"width : 100%;",items:[[c.notSet,"notSet"],[b.targetFrame,"frame"],[b.targetPopup,"popup"],[c.targetNew,"_blank"],[c.targetTop,"_top"],[c.targetSelf,"_self"],[c.targetParent,"_parent"]],onChange:m,setup:function(a){a.target&&this.setValue(a.target.type||"notSet");m.call(this)},commit:function(a){a.target||(a.target={});a.target.type=this.getValue()}},{type:"text",id:"linkTargetName",
label:b.targetFrameName,"default":"",setup:function(a){a.target&&this.setValue(a.target.name)},commit:function(a){a.target||(a.target={});a.target.name=this.getValue().replace(/\W/gi,"")}}]},{type:"vbox",width:"100%",align:"center",padding:2,id:"popupFeatures",children:[{type:"fieldset",label:b.popupFeatures,children:[{type:"hbox",children:[{type:"checkbox",id:"resizable",label:b.popupResizable,setup:f,commit:i},{type:"checkbox",id:"status",label:b.popupStatusBar,setup:f,commit:i}]},{type:"hbox",
children:[{type:"checkbox",id:"location",label:b.popupLocationBar,setup:f,commit:i},{type:"checkbox",id:"toolbar",label:b.popupToolbar,setup:f,commit:i}]},{type:"hbox",children:[{type:"checkbox",id:"menubar",label:b.popupMenuBar,setup:f,commit:i},{type:"checkbox",id:"fullscreen",label:b.popupFullScreen,setup:f,commit:i}]},{type:"hbox",children:[{type:"checkbox",id:"scrollbars",label:b.popupScrollBars,setup:f,commit:i},{type:"checkbox",id:"dependent",label:b.popupDependent,setup:f,commit:i}]},{type:"hbox",
children:[{type:"text",widths:["50%","50%"],labelLayout:"horizontal",label:c.width,id:"width",setup:f,commit:i},{type:"text",labelLayout:"horizontal",widths:["50%","50%"],label:b.popupLeft,id:"left",setup:f,commit:i}]},{type:"hbox",children:[{type:"text",labelLayout:"horizontal",widths:["50%","50%"],label:c.height,id:"height",setup:f,commit:i},{type:"text",labelLayout:"horizontal",label:b.popupTop,widths:["50%","50%"],id:"top",setup:f,commit:i}]}]}]}]},{id:"upload",label:b.upload,title:b.upload,hidden:!0,
filebrowser:"uploadButton",elements:[{type:"file",id:"upload",label:c.upload,style:"height:40px",size:29},{type:"fileButton",id:"uploadButton",label:c.uploadSubmit,filebrowser:"info:url","for":["upload","upload"]}]},{id:"advanced",label:b.advanced,title:b.advanced,elements:[{type:"vbox",padding:1,children:[{type:"hbox",widths:["45%","35%","20%"],children:[{type:"text",id:"advId",requiredContent:"a[id]",label:b.id,setup:h,commit:j},{type:"select",id:"advLangDir",requiredContent:"a[dir]",label:b.langDir,
"default":"",style:"width:110px",items:[[c.notSet,""],[b.langDirLTR,"ltr"],[b.langDirRTL,"rtl"]],setup:h,commit:j},{type:"text",id:"advAccessKey",requiredContent:"a[accesskey]",width:"80px",label:b.acccessKey,maxLength:1,setup:h,commit:j}]},{type:"hbox",widths:["45%","35%","20%"],children:[{type:"text",label:b.name,id:"advName",requiredContent:"a[name]",setup:h,commit:j},{type:"text",label:b.langCode,id:"advLangCode",requiredContent:"a[lang]",width:"110px","default":"",setup:h,commit:j},{type:"text",
label:b.tabIndex,id:"advTabIndex",requiredContent:"a[tabindex]",width:"80px",maxLength:5,setup:h,commit:j}]}]},{type:"vbox",padding:1,children:[{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.advisoryTitle,requiredContent:"a[title]","default":"",id:"advTitle",setup:h,commit:j},{type:"text",label:b.advisoryContentType,requiredContent:"a[type]","default":"",id:"advContentType",setup:h,commit:j}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.cssClasses,requiredContent:"a(cke-xyz)",
"default":"",id:"advCSSClasses",setup:h,commit:j},{type:"text",label:b.charset,requiredContent:"a[charset]","default":"",id:"advCharset",setup:h,commit:j}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.rel,requiredContent:"a[rel]","default":"",id:"advRel",setup:h,commit:j},{type:"text",label:b.styles,requiredContent:"a{cke-xyz}","default":"",id:"advStyles",validate:CKEDITOR.dialog.validate.inlineStyle(g.lang.common.invalidInlineStyle),setup:h,commit:j}]}]}]}],onShow:function(){var a=
this.getParentEditor(),b=a.getSelection(),c=null;(c=l.getSelectedLink(a))&&c.hasAttribute("href")?b.getSelectedElement()||b.selectElement(c):c=null;a=l.parseLinkAttributes(a,c);this._.selectedElement=c;this.setupContent(a)},onOk:function(){var a={};this.commitContent(a);var b=g.getSelection(),c=l.getLinkAttributes(g,a);if(this._.selectedElement){var e=this._.selectedElement,d=e.data("cke-saved-href"),f=e.getHtml();e.setAttributes(c.set);e.removeAttributes(c.removed);if(d==f||"email"==a.type&&-1!=
f.indexOf("@"))e.setHtml("email"==a.type?a.email.address:c.set["data-cke-saved-href"]),b.selectElement(e);delete this._.selectedElement}else b=b.getRanges()[0],b.collapsed&&(a=new CKEDITOR.dom.text("email"==a.type?a.email.address:c.set["data-cke-saved-href"],g.document),b.insertNode(a),b.selectNodeContents(a)),c=new CKEDITOR.style({element:"a",attributes:c.set}),c.type=CKEDITOR.STYLE_INLINE,c.applyToRange(b,g),b.select()},onLoad:function(){g.config.linkShowAdvancedTab||this.hidePage("advanced");g.config.linkShowTargetTab||
this.hidePage("target")},onFocus:function(){var a=this.getContentElement("info","linkType");a&&"url"==a.getValue()&&(a=this.getContentElement("info","url"),a.select())}}})})();
com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/link/dialogs/anchor.js000060400000002701152453623450032046 0ustar00componentsCKEDITOR.dialog.add("anchor",function(c){function d(a,b){return a.createFakeElement(a.document.createElement("a",{attributes:b}),"cke_anchor","anchor")}return{title:c.lang.link.anchor.title,minWidth:300,minHeight:60,onOk:function(){var a=CKEDITOR.tools.trim(this.getValueOf("info","txtName")),a={id:a,name:a,"data-cke-saved-name":a};if(this._.selectedElement)this._.selectedElement.data("cke-realelement")?(a=d(c,a),a.replace(this._.selectedElement),CKEDITOR.env.ie&&c.getSelection().selectElement(a)):
this._.selectedElement.setAttributes(a);else{var b=c.getSelection(),b=b&&b.getRanges()[0];b.collapsed?(a=d(c,a),b.insertNode(a)):(CKEDITOR.env.ie&&9>CKEDITOR.env.version&&(a["class"]="cke_anchor"),a=new CKEDITOR.style({element:"a",attributes:a}),a.type=CKEDITOR.STYLE_INLINE,c.applyStyle(a))}},onHide:function(){delete this._.selectedElement},onShow:function(){var a=c.getSelection(),b=a.getSelectedElement(),d=b&&b.data("cke-realelement"),e=d?CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,b):CKEDITOR.plugins.link.getSelectedLink(c);
e&&(this._.selectedElement=e,this.setValueOf("info","txtName",e.data("cke-saved-name")||""),!d&&a.selectElement(e),b&&(this._.selectedElement=b));this.getContentElement("info","txtName").focus()},contents:[{id:"info",label:c.lang.link.anchor.title,accessKey:"I",elements:[{type:"text",id:"txtName",label:c.lang.link.anchor.name,required:!0,validate:function(){return!this.getValue()?(alert(c.lang.link.anchor.errorName),!1):!0}}]}]}});
extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/link/images/hidpi/anchor.png000060400000002543152453623450033142 0ustar00components/com_acymailing�PNG


IHDR  szz�*IDATXýW]lTE>�g�(�-K�(DI)j[R�	5�D!���bbĀ`)Ƈ�$F���ᥦ�!1FH�@xT�F�@7�Ҕ4%
YS�I+��b��ݿ�����ݽ{�ˮ@��۝;3��oΜ3�\ejh�L�$3�#t��x<�ɐ�J���.�'E!M�I�xHs�IQU)b�Dd�������BI:M��E�̴)�Yy�#*_^v:0��c���:�}>R]�"K䳜o�׸x-��<w���Ӷ��_�\�)�_>��V*�2r�k�a
�ܲ�$e	������O�O��ٽj��ٳ4:0�;���B!㗖c�H�r{�v�{��+}}�@�|�X7�:Y��?���|萑?�p�V����A�J���zذn�>;k�J���xx��>-傀�[�F�#��ttt�8�0e�Q����\��W����w���\�H�;w2��-�Ǐ�@w7e�O���a%����-��[X�(�eb���\�F�x����%��Ү]B�Gn�I��_%��eO�����FDI�r�V��9��k�Yx�<��.��
I�l��(�W&��@�B��,wO �x.K0�
�ד�
$a��5���.B�s g��v$�u�Th<�k�z)�y<�W�&��O&�d0n:�����ֲ�)M^K�,b���
<HF�#x��
Y��X���3
,��*.QX�{U��RcS?���=G'U��jz�(p6��t���N@��C�
�pA���~
c�|.'
�<_���0�a�A�9 ��zk~���F�@�?�˧	�:�2�(Q|�0�}�G8L�F""iR	7@����hoj"/�� �KR��⿂�j"�����`#g@a\��F@b�mjE����H�L}M��oHV)���=pxxwb�<[�.p��A���	����]��!��>��G �T���ZЪ;ʆ�i�q.�aL*�t]�i.6#�wc��P�^�@��B����sq�޽�q޺l��To�j~��
t��;�0�����f|K;�6���i�
-\�@Wv���6TR�8`������[_�i.ɒ���eI��h4j�t8z���{2���/�"وr�I�+����{���bC|�BN܋,�ū�[�	/���1[`��������L�㟂��~��(4�뫰^ֽreQ���vq���&��7�-� �����'
Xg���1�(V
/69U-�LU�Kί#����H�H�5�s�#�)R@-����R�=ɶ�,���‘,3��Q���!�Wxԡ0(>N��(��/|W�EIEND�B`�extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/link/images/hidpi/index.html000060400000000054152453623450033152 0ustar00components/com_acymailing<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/link/images/anchor.png000060400000001115152453623450032037 0ustar00components�PNG


IHDR�aIDAT8�u��jSA�gnڊMc)���)�(�Zԝ�>@�O�+�.]tS��X*R��k)4H����T�"1D�If>w�6���0s��7s>˲� ��s�_X��vk��Q�=`��H� MS$�V�MIoZ��������$Hz*�F�I���F=� �2$	�$����:h������jwwv“�[�sJf���,S''ܪT8�t��$��kf��u�G!KJqM�{gf��w2>�X��B����$�SS|=:b��4��Wp%�P0c`F�9lb���'r~ �X������H�H�pf8�b���9�pa�G��7�W�DŽ��cf$Α���޶Z�f�C�J�ͣv���*�@�۽�-Q�F�e�3�����*����j4�F�3�N�^�C��#A��-�f��DRI�cI/%�VW%�L�sI�4��<�Z��̐D������s�;?�_>�y'	�Č���'8�9�0�4POӟ��c��+�B(��r�Ҹ�!,�]�Ft���OWf�W
�2C@Xʿ�IEND�B`�com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/link/images/index.html000060400000000054152453623450032055 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/pastefromword/index.html000060400000000054152453623450032547 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/pastefromword/filter/default.js000060400000032761152453623450034033 0ustar00components/com_acymailing(function(){function y(a){for(var a=a.toUpperCase(),c=z.length,b=0,f=0;f<c;++f)for(var d=z[f],e=d[1].length;a.substr(0,e)==d[1];a=a.substr(e))b+=d[0];return b}function A(a){for(var a=a.toUpperCase(),c=B.length,b=1,f=1;0<a.length;f*=c)b+=B.indexOf(a.charAt(a.length-1))*f,a=a.substr(0,a.length-1);return b}var C=CKEDITOR.htmlParser.fragment.prototype,o=CKEDITOR.htmlParser.element.prototype;C.onlyChild=o.onlyChild=function(){var a=this.children;return 1==a.length&&a[0]||null};o.removeAnyChildWithName=
function(a){for(var c=this.children,b=[],f,d=0;d<c.length;d++)f=c[d],f.name&&(f.name==a&&(b.push(f),c.splice(d--,1)),b=b.concat(f.removeAnyChildWithName(a)));return b};o.getAncestor=function(a){for(var c=this.parent;c&&(!c.name||!c.name.match(a));)c=c.parent;return c};C.firstChild=o.firstChild=function(a){for(var c,b=0;b<this.children.length;b++)if(c=this.children[b],a(c)||c.name&&(c=c.firstChild(a)))return c;return null};o.addStyle=function(a,c,b){var f="";if("string"==typeof c)f+=a+":"+c+";";else{if("object"==
typeof a)for(var d in a)a.hasOwnProperty(d)&&(f+=d+":"+a[d]+";");else f+=a;b=c}this.attributes||(this.attributes={});a=this.attributes.style||"";a=(b?[f,a]:[a,f]).join(";");this.attributes.style=a.replace(/^;+|;(?=;)/g,"")};o.getStyle=function(a){var c=this.attributes.style;if(c)return c=CKEDITOR.tools.parseCssText(c,1),c[a]};CKEDITOR.dtd.parentOf=function(a){var c={},b;for(b in this)-1==b.indexOf("$")&&this[b][a]&&(c[b]=1);return c};var H=/^([.\d]*)+(em|ex|px|gd|rem|vw|vh|vm|ch|mm|cm|in|pt|pc|deg|rad|ms|s|hz|khz){1}?/i,
D=/^(?:\b0[^\s]*\s*){1,4}$/,x={ol:{decimal:/\d+/,"lower-roman":/^m{0,4}(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})$/,"upper-roman":/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/,"lower-alpha":/^[a-z]+$/,"upper-alpha":/^[A-Z]+$/},ul:{disc:/[l\u00B7\u2002]/,circle:/[\u006F\u00D8]/,square:/[\u006E\u25C6]/}},z=[[1E3,"M"],[900,"CM"],[500,"D"],[400,"CD"],[100,"C"],[90,"XC"],[50,"L"],[40,"XL"],[10,"X"],[9,"IX"],[5,"V"],[4,"IV"],[1,"I"]],B="ABCDEFGHIJKLMNOPQRSTUVWXYZ",s=0,t=null,w,E=CKEDITOR.plugins.pastefromword=
{utils:{createListBulletMarker:function(a,c){var b=new CKEDITOR.htmlParser.element("cke:listbullet");b.attributes={"cke:listsymbol":a[0]};b.add(new CKEDITOR.htmlParser.text(c));return b},isListBulletIndicator:function(a){if(/mso-list\s*:\s*Ignore/i.test(a.attributes&&a.attributes.style))return!0},isContainingOnlySpaces:function(a){var c;return(c=a.onlyChild())&&/^(:?\s|&nbsp;)+$/.test(c.value)},resolveList:function(a){var c=a.attributes,b;if((b=a.removeAnyChildWithName("cke:listbullet"))&&b.length&&
(b=b[0]))return a.name="cke:li",c.style&&(c.style=E.filters.stylesFilter([["text-indent"],["line-height"],[/^margin(:?-left)?$/,null,function(a){a=a.split(" ");a=CKEDITOR.tools.convertToPx(a[3]||a[1]||a[0]);!s&&(null!==t&&a>t)&&(s=a-t);t=a;c["cke:indent"]=s&&Math.ceil(a/s)+1||1}],[/^mso-list$/,null,function(a){var a=a.split(" "),b=Number(a[0].match(/\d+/)),a=Number(a[1].match(/\d+/));1==a&&(b!==w&&(c["cke:reset"]=1),w=b);c["cke:indent"]=a}]])(c.style,a)||""),c["cke:indent"]||(t=0,c["cke:indent"]=
1),CKEDITOR.tools.extend(c,b.attributes),!0;w=t=s=null;return!1},getStyleComponents:function(){var a=CKEDITOR.dom.element.createFromHtml('<div style="position:absolute;left:-9999px;top:-9999px;"></div>',CKEDITOR.document);CKEDITOR.document.getBody().append(a);return function(c,b,f){a.setStyle(c,b);for(var c={},b=f.length,d=0;d<b;d++)c[f[d]]=a.getStyle(f[d]);return c}}(),listDtdParents:CKEDITOR.dtd.parentOf("ol")},filters:{flattenList:function(a,c){var c="number"==typeof c?c:1,b=a.attributes,f;switch(b.type){case "a":f=
"lower-alpha";break;case "1":f="decimal"}for(var d=a.children,e,h=0;h<d.length;h++)if(e=d[h],e.name in CKEDITOR.dtd.$listItem){var j=e.attributes,g=e.children,m=g[g.length-1];m.name in CKEDITOR.dtd.$list&&(a.add(m,h+1),--g.length||d.splice(h--,1));e.name="cke:li";b.start&&!h&&(j.value=b.start);E.filters.stylesFilter([["tab-stops",null,function(a){(a=a.split(" ")[1].match(H))&&(t=CKEDITOR.tools.convertToPx(a[0]))}],1==c?["mso-list",null,function(a){a=a.split(" ");a=Number(a[0].match(/\d+/));a!==w&&
(j["cke:reset"]=1);w=a}]:null])(j.style);j["cke:indent"]=c;j["cke:listtype"]=a.name;j["cke:list-style-type"]=f}else if(e.name in CKEDITOR.dtd.$list){arguments.callee.apply(this,[e,c+1]);d=d.slice(0,h).concat(e.children).concat(d.slice(h+1));a.children=[];e=0;for(g=d.length;e<g;e++)a.add(d[e]);d=a.children}delete a.name;b["cke:list"]=1},assembleList:function(a){for(var c=a.children,b,f,d,e,h,j,a=[],g,m,i,l,k,p,n=0;n<c.length;n++)if(b=c[n],"cke:li"==b.name)if(b.name="li",f=b.attributes,i=(i=f["cke:listsymbol"])&&
i.match(/^(?:[(]?)([^\s]+?)([.)]?)$/),l=k=p=null,f["cke:ignored"])c.splice(n--,1);else{f["cke:reset"]&&(j=e=h=null);d=Number(f["cke:indent"]);d!=e&&(m=g=null);if(i){if(m&&x[m][g].test(i[1]))l=m,k=g;else for(var q in x)for(var u in x[q])if(x[q][u].test(i[1]))if("ol"==q&&/alpha|roman/.test(u)){if(g=/roman/.test(u)?y(i[1]):A(i[1]),!p||g<p)p=g,l=q,k=u}else{l=q;k=u;break}!l&&(l=i[2]?"ol":"ul")}else l=f["cke:listtype"]||"ol",k=f["cke:list-style-type"];m=l;g=k||("ol"==l?"decimal":"disc");k&&k!=("ol"==l?
"decimal":"disc")&&b.addStyle("list-style-type",k);if("ol"==l&&i){switch(k){case "decimal":p=Number(i[1]);break;case "lower-roman":case "upper-roman":p=y(i[1]);break;case "lower-alpha":case "upper-alpha":p=A(i[1])}b.attributes.value=p}if(j){if(d>e)a.push(j=new CKEDITOR.htmlParser.element(l)),j.add(b),h.add(j);else{if(d<e){e-=d;for(var r;e--&&(r=j.parent);)j=r.parent}j.add(b)}c.splice(n--,1)}else a.push(j=new CKEDITOR.htmlParser.element(l)),j.add(b),c[n]=j;h=b;e=d}else j&&(j=e=h=null);for(n=0;n<a.length;n++)if(j=
a[n],q=j.children,g=g=void 0,u=j.children.length,r=g=void 0,c=/list-style-type:(.*?)(?:;|$)/,e=CKEDITOR.plugins.pastefromword.filters.stylesFilter,g=j.attributes,!c.exec(g.style)){for(h=0;h<u;h++)if(g=q[h],g.attributes.value&&Number(g.attributes.value)==h+1&&delete g.attributes.value,g=c.exec(g.attributes.style))if(g[1]==r||!r)r=g[1];else{r=null;break}if(r){for(h=0;h<u;h++)g=q[h].attributes,g.style&&(g.style=e([["list-style-type"]])(g.style)||"");j.addStyle("list-style-type",r)}}w=t=s=null},falsyFilter:function(){return!1},
stylesFilter:function(a,c){return function(b,f){var d=[];(b||"").replace(/&quot;/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(b,e,g){e=e.toLowerCase();"font-family"==e&&(g=g.replace(/["']/g,""));for(var m,i,l,k=0;k<a.length;k++)if(a[k]&&(b=a[k][0],m=a[k][1],i=a[k][2],l=a[k][3],e.match(b)&&(!m||g.match(m)))){e=l||e;c&&(i=i||g);"function"==typeof i&&(i=i(g,f,e));i&&i.push&&(e=i[0],i=i[1]);"string"==typeof i&&d.push([e,i]);return}!c&&d.push([e,g])});for(var e=0;e<d.length;e++)d[e]=
d[e].join(":");return d.length?d.join(";")+";":!1}},elementMigrateFilter:function(a,c){return a?function(b){var f=c?(new CKEDITOR.style(a,c))._.definition:a;b.name=f.element;CKEDITOR.tools.extend(b.attributes,CKEDITOR.tools.clone(f.attributes));b.addStyle(CKEDITOR.style.getStyleText(f))}:function(){}},styleMigrateFilter:function(a,c){var b=this.elementMigrateFilter;return a?function(f,d){var e=new CKEDITOR.htmlParser.element(null),h={};h[c]=f;b(a,h)(e);e.children=d.children;d.children=[e];e.filter=
function(){};e.parent=d}:function(){}},bogusAttrFilter:function(a,c){if(-1==c.name.indexOf("cke:"))return!1},applyStyleFilter:null},getRules:function(a,c){var b=CKEDITOR.dtd,f=CKEDITOR.tools.extend({},b.$block,b.$listItem,b.$tableContent),d=a.config,e=this.filters,h=e.falsyFilter,j=e.stylesFilter,g=e.elementMigrateFilter,m=CKEDITOR.tools.bind(this.filters.styleMigrateFilter,this.filters),i=this.utils.createListBulletMarker,l=e.flattenList,k=e.assembleList,p=this.utils.isListBulletIndicator,n=this.utils.isContainingOnlySpaces,
q=this.utils.resolveList,u=function(a){a=CKEDITOR.tools.convertToPx(a);return isNaN(a)?a:a+"px"},r=this.utils.getStyleComponents,t=this.utils.listDtdParents,o=!1!==d.pasteFromWordRemoveFontStyles,s=!1!==d.pasteFromWordRemoveStyles;return{elementNames:[[/meta|link|script/,""]],root:function(a){a.filterChildren(c);k(a)},elements:{"^":function(a){var c;CKEDITOR.env.gecko&&(c=e.applyStyleFilter)&&c(a)},$:function(a){var v=a.name||"",e=a.attributes;v in f&&e.style&&(e.style=j([[/^(:?width|height)$/,null,
u]])(e.style)||"");if(v.match(/h\d/)){a.filterChildren(c);if(q(a))return;g(d["format_"+v])(a)}else if(v in b.$inline)a.filterChildren(c),n(a)&&delete a.name;else if(-1!=v.indexOf(":")&&-1==v.indexOf("cke")){a.filterChildren(c);if("v:imagedata"==v){if(v=a.attributes["o:href"])a.attributes.src=v;a.name="img";return}delete a.name}v in t&&(a.filterChildren(c),k(a))},style:function(a){if(CKEDITOR.env.gecko){var a=(a=a.onlyChild().value.match(/\/\* Style Definitions \*\/([\s\S]*?)\/\*/))&&a[1],c={};a&&
(a.replace(/[\n\r]/g,"").replace(/(.+?)\{(.+?)\}/g,function(a,b,F){for(var b=b.split(","),a=b.length,d=0;d<a;d++)CKEDITOR.tools.trim(b[d]).replace(/^(\w+)(\.[\w-]+)?$/g,function(a,b,d){b=b||"*";d=d.substring(1,d.length);d.match(/MsoNormal/)||(c[b]||(c[b]={}),d?c[b][d]=F:c[b]=F)})}),e.applyStyleFilter=function(a){var b=c["*"]?"*":a.name,d=a.attributes&&a.attributes["class"];b in c&&(b=c[b],"object"==typeof b&&(b=b[d]),b&&a.addStyle(b,!0))})}return!1},p:function(a){if(/MsoListParagraph/i.exec(a.attributes["class"])||
a.getStyle("mso-list")){var b=a.firstChild(function(a){return a.type==CKEDITOR.NODE_TEXT&&!n(a.parent)});(b=b&&b.parent)&&b.addStyle("mso-list","Ignore")}a.filterChildren(c);q(a)||(d.enterMode==CKEDITOR.ENTER_BR?(delete a.name,a.add(new CKEDITOR.htmlParser.element("br"))):g(d["format_"+(d.enterMode==CKEDITOR.ENTER_P?"p":"div")])(a))},div:function(a){var c=a.onlyChild();if(c&&"table"==c.name){var b=a.attributes;c.attributes=CKEDITOR.tools.extend(c.attributes,b);b.style&&c.addStyle(b.style);c=new CKEDITOR.htmlParser.element("div");
c.addStyle("clear","both");a.add(c);delete a.name}},td:function(a){a.getAncestor("thead")&&(a.name="th")},ol:l,ul:l,dl:l,font:function(a){if(p(a.parent))delete a.name;else{a.filterChildren(c);var b=a.attributes,d=b.style,e=a.parent;"font"==e.name?(CKEDITOR.tools.extend(e.attributes,a.attributes),d&&e.addStyle(d),delete a.name):(d=(d||"").split(";"),b.color&&("#000000"!=b.color&&d.push("color:"+b.color),delete b.color),b.face&&(d.push("font-family:"+b.face),delete b.face),b.size&&(d.push("font-size:"+
(3<b.size?"large":3>b.size?"small":"medium")),delete b.size),a.name="span",a.addStyle(d.join(";")))}},span:function(a){if(p(a.parent))return!1;a.filterChildren(c);if(n(a))return delete a.name,null;if(p(a)){var b=a.firstChild(function(a){return a.value||"img"==a.name}),e=(b=b&&(b.value||"l."))&&b.match(/^(?:[(]?)([^\s]+?)([.)]?)$/);if(e)return b=i(e,b),(a=a.getAncestor("span"))&&/ mso-hide:\s*all|display:\s*none /.test(a.attributes.style)&&(b.attributes["cke:ignored"]=1),b}if(e=(b=a.attributes)&&b.style)b.style=
j([["line-height"],[/^font-family$/,null,!o?m(d.font_style,"family"):null],[/^font-size$/,null,!o?m(d.fontSize_style,"size"):null],[/^color$/,null,!o?m(d.colorButton_foreStyle,"color"):null],[/^background-color$/,null,!o?m(d.colorButton_backStyle,"color"):null]])(e,a)||"";b.style||delete b.style;CKEDITOR.tools.isEmpty(b)&&delete a.name;return null},b:g(d.coreStyles_bold),i:g(d.coreStyles_italic),u:g(d.coreStyles_underline),s:g(d.coreStyles_strike),sup:g(d.coreStyles_superscript),sub:g(d.coreStyles_subscript),
a:function(a){a=a.attributes;a.href&&a.href.match(/^file:\/\/\/[\S]+#/i)&&(a.href=a.href.replace(/^file:\/\/\/[^#]+/i,""))},"cke:listbullet":function(a){a.getAncestor(/h\d/)&&!d.pasteFromWordNumberedHeadingToList&&delete a.name}},attributeNames:[[/^onmouse(:?out|over)/,""],[/^onload$/,""],[/(?:v|o):\w+/,""],[/^lang/,""]],attributes:{style:j(s?[[/^list-style-type$/,null],[/^margin$|^margin-(?!bottom|top)/,null,function(a,b,c){if(b.name in{p:1,div:1}){b="ltr"==d.contentsLangDirection?"margin-left":
"margin-right";if("margin"==c)a=r(c,a,[b])[b];else if(c!=b)return null;if(a&&!D.test(a))return[b,a]}return null}],[/^clear$/],[/^border.*|margin.*|vertical-align|float$/,null,function(a,b){if("img"==b.name)return a}],[/^width|height$/,null,function(a,b){if(b.name in{table:1,td:1,th:1,img:1})return a}]]:[[/^mso-/],[/-color$/,null,function(a){if("transparent"==a)return!1;if(CKEDITOR.env.gecko)return a.replace(/-moz-use-text-color/g,"transparent")}],[/^margin$/,D],["text-indent","0cm"],["page-break-before"],
["tab-stops"],["display","none"],o?[/font-?/]:null],s),width:function(a,c){if(c.name in b.$tableContent)return!1},border:function(a,c){if(c.name in b.$tableContent)return!1},"class":h,bgcolor:h,valign:s?h:function(a,b){b.addStyle("vertical-align",a);return!1}},comment:!CKEDITOR.env.ie?function(a,b){var c=a.match(/<img.*?>/),d=a.match(/^\[if !supportLists\]([\s\S]*?)\[endif\]$/);return d?(d=(c=d[1]||c&&"l.")&&c.match(/>(?:[(]?)([^\s]+?)([.)]?)</),i(d,c)):CKEDITOR.env.gecko&&c?(c=CKEDITOR.htmlParser.fragment.fromHtml(c[0]).children[0],
(d=(d=(d=b.previous)&&d.value.match(/<v:imagedata[^>]*o:href=['"](.*?)['"]/))&&d[1])&&(c.attributes.src=d),c):!1}:h}}},G=function(){this.dataFilter=new CKEDITOR.htmlParser.filter};G.prototype={toHtml:function(a){var a=CKEDITOR.htmlParser.fragment.fromHtml(a),c=new CKEDITOR.htmlParser.basicWriter;a.writeHtml(c,this.dataFilter);return c.getHtml(!0)}};CKEDITOR.cleanWord=function(a,c){CKEDITOR.env.gecko&&(a=a.replace(/(<\!--\[if[^<]*?\])--\>([\S\s]*?)<\!--(\[endif\]--\>)/gi,"$1$2$3"));CKEDITOR.env.webkit&&
(a=a.replace(/(class="MsoListParagraph[^>]+><\!--\[if !supportLists\]--\>)([^<]+<span[^<]+<\/span>)(<\!--\[endif\]--\>)/gi,"$1<span>$2</span>$3"));var b=new G,f=b.dataFilter;f.addRules(CKEDITOR.plugins.pastefromword.getRules(c,f));c.fire("beforeCleanWord",{filter:f});try{a=b.toHtml(a)}catch(d){alert(c.lang.pastefromword.error)}a=a.replace(/cke:.*?".*?"/g,"");a=a.replace(/style=""/g,"");return a=a.replace(/<span>/g,"")}})();
extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/pastefromword/filter/index.html000060400000000054152453623450034034 0ustar00components/com_acymailing<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/fakeobjects/index.html000060400000000054152453623450032133 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/fakeobjects/images/index.html000060400000000054152453623450033400 0ustar00components/com_acymailing<html><body bgcolor="#FFFFFF"></body></html>extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/fakeobjects/images/spacer.gif000060400000000053152453623450033346 0ustar00components/com_acymailingGIF89a�!�,D;com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/sharedspace/plugin.js000060400000004570152453623450032003 0ustar00components
( function() {

	'use strict';

	var containerTpl = CKEDITOR.addTemplate( 'sharedcontainer', '<div' +
		' id="cke_{name}"' +
		' class="cke {id} cke_reset_all cke_chrome cke_editor_{name} cke_shared cke_detached cke_{langDir} ' + CKEDITOR.env.cssClass + '"' +
		' dir="{langDir}"' +
		' title="' + ( CKEDITOR.env.gecko ? ' ' : '' ) + '"' +
		' lang="{langCode}"' +
		' role="presentation"' +
		'>' +
			'<div class="cke_inner">' +
				'<div id="{spaceId}" class="cke_{space}" role="presentation">{content}</div>' +
			'</div>' +
		'</div>' );

	CKEDITOR.plugins.add( 'sharedspace', {
		init: function( editor ) {
			editor.on( 'loaded', function() {
				var spaces = editor.config.sharedSpaces;

				if ( spaces ) {
					for ( var spaceName in spaces )
						create( editor, spaceName, spaces[ spaceName ] );
				}
			}, null, null, 9 );
		}
	} );

	function create( editor, spaceName, target ) {
		var innerHtml, space;

		if ( typeof target == 'string' ) {
			target = CKEDITOR.document.getById( target );
		} else {
			target = new CKEDITOR.dom.element( target );
		}

		if ( target ) {
			innerHtml = editor.fire( 'uiSpace', { space: spaceName, html: '' } ).html;

			if ( innerHtml ) {
				editor.on( 'uiSpace', function( ev ) {
					if ( ev.data.space == spaceName )
						ev.cancel();
				}, null, null, 1 );  // Hi-priority

				space = target.append( CKEDITOR.dom.element.createFromHtml( containerTpl.output( {
					id: editor.id,
					name: editor.name,
					langDir: editor.lang.dir,
					langCode: editor.langCode,
					space: spaceName,
					spaceId: editor.ui.spaceId( spaceName ),
					content: innerHtml
				} ) ) );

				if ( target.getCustomData( 'cke_hasshared' ) )
					space.hide();
				else
					target.setCustomData( 'cke_hasshared', 1 );

				space.unselectable();

				space.on( 'mousedown', function( evt ) {
					evt = evt.data;
					if ( !evt.getTarget().hasAscendant( 'a', 1 ) )
						evt.preventDefault();
				} );

				editor.focusManager.add( space, 1 );

				editor.on( 'focus', function() {
					for ( var i = 0, sibling, children = target.getChildren(); ( sibling = children.getItem( i ) ); i++ ) {
						if ( sibling.type == CKEDITOR.NODE_ELEMENT &&
							!sibling.equals( space ) &&
							sibling.hasClass( 'cke_shared' ) ) {
							sibling.hide();
						}
					}

					space.show();
				} );

				editor.on( 'destroy', function() {
					space.remove();
				} );
			}
		}
	}
} )();


com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/sharedspace/index.html000060400000000054152453623450032135 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/addtag/index.html000060400000000054152453623450031077 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/addtag/icon-16-tag.png000060400000001125152453623450031535 0ustar00components�PNG


IHDR�agAMA���a	pHYsrr^e[�tEXtSoftwarePaint.NET v3.5.100�r��IDAT8O�SM(DQ?��@�"%��Y�XPXH^)���Sƈ$z�0��Y��XPF^XM�-F�� �))��YxEa6�lF�Ԕ8�ó�n}�wν��9�\��{�-�P��d�qæ�락ӴR�W�%s	�ن�q�KQ<���-�b����f�4��FI�nw�����
���I^�,%���t��I��=E"��w� n1B�M� �8>�"Yv��i���������м�<��pԓ���l����#��$ЊZV}>o�_��k�����HE5sͣ�}{�<@L�
մs*.�)��?W*v�t����f�C����3��D*~�S++K\�����$r�P{{��j�$g�#HR��@����o| �p�-O��*P�Lw�$'��b����е❍{<�4��։U��d�E���'�o�j� ��J�4�����7�O\P
��z`8�m�����OKR�k3��+IEND�B`�com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/addtag/plugin.js000060400000001147152453623450030742 0ustar00components(function() {
	var a= {
		exec:function(editor){
			if (parent.IeCursorFix)
			{
				parent.IeCursorFix();
			}
			if (parent.SetIgnoreDeselection)
			{
				parent.SetIgnoreDeselection();
			}
			if (parent.FireClick)
			{
				var itemElement = parent.document.getElementById('AcyLienTag');
				parent.FireClick(itemElement);
			}
		}
	},
	b='addtag';
	CKEDITOR.plugins.add(b,{
		init:function(editor){
			editor.addCommand(b,a);
			editor.ui.addButton("addtag",{label:editor.lang.addtag.toolbar,
											icon: this.path + "icon-16-tag.png",
											command:b,
											toolbar: "insert"});
		}
	});
})();

com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/image/images/noimage.png000060400000004103152453623450032331 0ustar00components�PNG


IHDR((� H_PLTE�VV�\\�TT⟟�XX⠠���▖�bb��II�ff�``�CC�FF�MM�ZZ㮮㳳����SSᆆ቉⚚�ww�WW�xx�~~���⑑���ጌ���㭭㣣����DD㻻����nn⨨ᐐ�ⓓ����^^�XX���ᗗ�NN�oo�KK�AA�ll�tt�UU└����JJᎎ������㵵㱱㽽����uv�ee㲲�����⥥㼼����PP���ፍ㪪�[[㺺㶶�mm㾾�qq�}}�������yy����PP�QQ������㰰㷷�⛛☘�ss❝�rr�ss㯯✜ᄄኊ���㫫ዋ���⭭ለ�]]�||㝝�GG♙㘘�dd�ii�kk潽�pp�zz�HH➞�����������NN䟞㴴���⣣�^^�����??����������;;����aa⦦��ᕕ�SS����>>��������||������ᇇᅅ�⸸ⱱ⪪㢢⬬ႂ人�QQ㸸���䱱㿿�hh㧧�RR⎎�jj���㜜����������ab���毮���䥥������⽽⮮���⫫洴⢢㬬���汱䵵䷷⧧㦦庹����绺�����������䨨�������ᄃ���RR���ᓓ㹹䠟�UU����99�@@�JJ����77䪪�SS�PP�ff躹似���䲲᜜����Ⲳ���❞ᘘ⋋纹⍍㚚��ⷷ�rs�zzYp��IDATx^=���H���6�m۶m��o۶m۶͵����WS����[I�ʯ���PP�رc?BQQ�`4
M<b%:������m�
�V�ă�^��jWlKL�rtq9�F=��a�yyj���S��yp���FQУ�Z���y�x���Ř19���|�#���9fǎ����и�L�Bp4f��
��������JM}m݊]S7�Z�řpΙ(�;\Y��������	������Ѐ����^�	
###C�R(��V��S3��Ե%0F)�\0 ���]/��}����MR\��������x��ۧ[��?[S��~�y�p]q����zC�Ȃ*��o��j!*j�nk��A�]YW|�ecc��)###E��"�P�`k1%��j�]A�O��M��u��h:Am�Q(�F�	l���x�mr�Ɩ���W��N�P�6��>G��ˆSP��Z��;�v�v$E���k��Xಹ�ҥ�f���SY%�B9k@���-��:f����A�;�4���r�D9�)z@U^N�i�̲�����\˻�j+I��ʲ�r������$M��W��h|i�]�o��
��i^��H�I:���s��]R@���/͵k"��L���J[��"�ew3V�J뛒�0JB�1��$m�HV׵��`�>c{]�j�*i�����I筮+��|}�x���)�/��b�u���e�c���1 �Q�����e��=����޻�1U�w�]�4ƻ�x�g�pz��ݜ_��j���]��u�YJ��g��vh0�`��Z���x�'T��/�Z�;�����Jy�ׯ��������M͛/�*�1��G��*�+2ݽ^X�nv:����>��/���0*Au�����[Sq�K`C�^\�ߢ���gz�+KQ6.����\:�~�������l���;�z��Ĩ�q{Y=�̣K�|�|gg�3��C��hf
=��C�(k����AgOv|��I�&����#`��r4hӷ�E��&����X�%!!av�-}�|�ꕋ�{�qN)d2Q�;�͍g��-�@LT��m����t�6>-,�w�y��3�:;;����<���(��9,oT��Wb����ZZr8�K.w���|!"���Bt6�� ��}�r9�iX�=9���W`��Ȇ݆;&�j�,s���p� ?��騷-E�w���f�z��S�b�,Y�2=s&û��y<��{<O�����[Q�'����TF�WgZIEND�B`�com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/image/images/index.html000060400000000054152453623450032202 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/image/index.html000060400000000054152453623450030735 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/image/dialogs/index.html000060400000000054152453623450032357 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/image/dialogs/image.js000060400000050106152453623450032005 0ustar00components(function(){var r=function(c,j){function r(){var a=arguments,b=this.getContentElement("advanced","txtdlgGenStyle");b&&b.commit.apply(b,a);this.foreach(function(b){b.commit&&"txtdlgGenStyle"!=b.id&&b.commit.apply(b,a)})}function i(a){if(!s){s=1;var b=this.getDialog(),d=b.imageElement;if(d){this.commit(f,d);for(var a=[].concat(a),e=a.length,c,g=0;g<e;g++)(c=b.getContentElement.apply(b,a[g].split(":")))&&c.setup(f,d)}s=0}}var f=1,k=/^\s*(\d+)((px)|\%)?\s*$/i,v=/(^\s*(\d+)((px)|\%)?\s*$)|^$/i,o=/^\d+px$/,
w=function(){var a=this.getValue(),b=this.getDialog(),d=a.match(k);d&&("%"==d[2]&&l(b,!1),a=d[1]);b.lockRatio&&(d=b.originalElement,"true"==d.getCustomData("isReady")&&("txtHeight"==this.id?(a&&"0"!=a&&(a=Math.round(d.$.width*(a/d.$.height))),isNaN(a)||b.setValueOf("info","txtWidth",a)):(a&&"0"!=a&&(a=Math.round(d.$.height*(a/d.$.width))),isNaN(a)||b.setValueOf("info","txtHeight",a))));g(b)},g=function(a){if(!a.originalElement||!a.preview)return 1;a.commitContent(4,a.preview);return 0},s,l=function(a,
b){if(!a.getContentElement("info","ratioLock"))return null;var d=a.originalElement;if(!d)return null;if("check"==b){if(!a.userlockRatio&&"true"==d.getCustomData("isReady")){var e=a.getValueOf("info","txtWidth"),c=a.getValueOf("info","txtHeight"),d=1E3*d.$.width/d.$.height,f=1E3*e/c;a.lockRatio=!1;!e&&!c?a.lockRatio=!0:!isNaN(d)&&!isNaN(f)&&Math.round(d)==Math.round(f)&&(a.lockRatio=!0)}}else void 0!==b?a.lockRatio=b:(a.userlockRatio=1,a.lockRatio=!a.lockRatio);e=CKEDITOR.document.getById(p);a.lockRatio?
e.removeClass("cke_btn_unlocked"):e.addClass("cke_btn_unlocked");e.setAttribute("aria-checked",a.lockRatio);CKEDITOR.env.hc&&e.getChild(0).setHtml(a.lockRatio?CKEDITOR.env.ie?"■":"▣":CKEDITOR.env.ie?"□":"▢");return a.lockRatio},x=function(a){var b=a.originalElement;if("true"==b.getCustomData("isReady")){var d=a.getContentElement("info","txtWidth"),e=a.getContentElement("info","txtHeight");d&&d.setValue(b.$.width);e&&e.setValue(b.$.height)}g(a)},y=function(a,b){function d(a,b){var d=a.match(k);return d?
("%"==d[2]&&(d[1]+="%",l(e,!1)),d[1]):b}if(a==f){var e=this.getDialog(),c="",g="txtWidth"==this.id?"width":"height",h=b.getAttribute(g);h&&(c=d(h,c));c=d(b.getStyle(g),c);this.setValue(c)}},t,q=function(){var a=this.originalElement,b=CKEDITOR.document.getById(m);a.setCustomData("isReady","true");a.removeListener("load",q);a.removeListener("error",h);a.removeListener("abort",h);b&&b.setStyle("display","none");this.dontResetSize||x(this);this.firstLoad&&CKEDITOR.tools.setTimeout(function(){l(this,"check")},
0,this);this.dontResetSize=this.firstLoad=!1;g(this)},h=function(){var a=this.originalElement,b=CKEDITOR.document.getById(m);a.removeListener("load",q);a.removeListener("error",h);a.removeListener("abort",h);a=CKEDITOR.getUrl(CKEDITOR.plugins.get("image").path+"images/noimage.png");this.preview&&this.preview.setAttribute("src",a);b&&b.setStyle("display","none");l(this,!1)},n=function(a){return CKEDITOR.tools.getNextId()+"_"+a},p=n("btnLockSizes"),u=n("btnResetSize"),m=n("ImagePreviewLoader"),A=n("previewLink"),
z=n("previewImage");return{title:c.lang.image["image"==j?"title":"titleButton"],minWidth:420,minHeight:360,onShow:function(){this.linkEditMode=this.imageEditMode=this.linkElement=this.imageElement=!1;this.lockRatio=!0;this.userlockRatio=0;this.dontResetSize=!1;this.firstLoad=!0;this.addLink=!1;var a=this.getParentEditor(),b=a.getSelection(),d=(b=b&&b.getSelectedElement())&&a.elementPath(b).contains("a",1),c=CKEDITOR.document.getById(m);c&&c.setStyle("display","none");t=new CKEDITOR.dom.element("img",
a.document);this.preview=CKEDITOR.document.getById(z);this.originalElement=a.document.createElement("img");this.originalElement.setAttribute("alt","");this.originalElement.setCustomData("isReady","false");if(d){this.linkElement=d;this.linkEditMode=!0;c=d.getChildren();if(1==c.count()){var g=c.getItem(0).getName();if("img"==g||"input"==g)this.imageElement=c.getItem(0),"img"==this.imageElement.getName()?this.imageEditMode="img":"input"==this.imageElement.getName()&&(this.imageEditMode="input")}"image"==
j&&this.setupContent(2,d)}if(this.customImageElement)this.imageEditMode="img",this.imageElement=this.customImageElement,delete this.customImageElement;else if(b&&"img"==b.getName()&&!b.data("cke-realelement")||b&&"input"==b.getName()&&"image"==b.getAttribute("type"))this.imageEditMode=b.getName(),this.imageElement=b;this.imageEditMode?(this.cleanImageElement=this.imageElement,this.imageElement=this.cleanImageElement.clone(!0,!0),this.setupContent(f,this.imageElement)):this.imageElement=a.document.createElement("img");
l(this,!0);CKEDITOR.tools.trim(this.getValueOf("info","txtUrl"))||(this.preview.removeAttribute("src"),this.preview.setStyle("display","none"))},onOk:function(){if(this.imageEditMode){var a=this.imageEditMode;"image"==j&&"input"==a&&confirm(c.lang.image.button2Img)?(this.imageElement=c.document.createElement("img"),this.imageElement.setAttribute("alt",""),c.insertElement(this.imageElement)):"image"!=j&&"img"==a&&confirm(c.lang.image.img2Button)?(this.imageElement=c.document.createElement("input"),
this.imageElement.setAttributes({type:"image",alt:""}),c.insertElement(this.imageElement)):(this.imageElement=this.cleanImageElement,delete this.cleanImageElement)}else"image"==j?this.imageElement=c.document.createElement("img"):(this.imageElement=c.document.createElement("input"),this.imageElement.setAttribute("type","image")),this.imageElement.setAttribute("alt","");this.linkEditMode||(this.linkElement=c.document.createElement("a"));this.commitContent(f,this.imageElement);this.commitContent(2,this.linkElement);
this.imageElement.getAttribute("style")||this.imageElement.removeAttribute("style");this.imageEditMode?!this.linkEditMode&&this.addLink?(c.insertElement(this.linkElement),this.imageElement.appendTo(this.linkElement)):this.linkEditMode&&!this.addLink&&(c.getSelection().selectElement(this.linkElement),c.insertElement(this.imageElement)):this.addLink?this.linkEditMode?c.insertElement(this.imageElement):(c.insertElement(this.linkElement),this.linkElement.append(this.imageElement,!1)):c.insertElement(this.imageElement)},
onLoad:function(){"image"!=j&&this.hidePage("Link");var a=this._.element.getDocument();this.getContentElement("info","ratioLock")&&(this.addFocusable(a.getById(u),5),this.addFocusable(a.getById(p),5));this.commitContent=r},onHide:function(){this.preview&&this.commitContent(8,this.preview);this.originalElement&&(this.originalElement.removeListener("load",q),this.originalElement.removeListener("error",h),this.originalElement.removeListener("abort",h),this.originalElement.remove(),this.originalElement=
!1);delete this.imageElement},contents:[{id:"info",label:c.lang.image.infoTab,accessKey:"I",elements:[{type:"vbox",padding:0,children:[{type:"hbox",widths:["280px","110px"],align:"right",children:[{id:"txtUrl",type:"text",label:c.lang.common.url,required:!0,onChange:function(){var a=this.getDialog(),b=this.getValue();if(0<b.length){var a=this.getDialog(),d=a.originalElement;a.preview&&a.preview.removeStyle("display");d.setCustomData("isReady","false");var c=CKEDITOR.document.getById(m);c&&c.setStyle("display",
"");d.on("load",q,a);d.on("error",h,a);d.on("abort",h,a);d.setAttribute("src",b);a.preview&&(t.setAttribute("src",b),a.preview.setAttribute("src",t.$.src),g(a))}else a.preview&&(a.preview.removeAttribute("src"),a.preview.setStyle("display","none"))},setup:function(a,b){if(a==f){var d=b.data("cke-saved-src")||b.getAttribute("src");this.getDialog().dontResetSize=!0;this.setValue(d);this.setInitValue()}},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())?(b.data("cke-saved-src",this.getValue()),
b.setAttribute("src",this.getValue())):8==a&&(b.setAttribute("src",""),b.removeAttribute("src"))},validate:CKEDITOR.dialog.validate.notEmpty(c.lang.image.urlMissing)},{type:"button",id:"browse",style:"display:inline-block;margin-top:14px;",align:"center",label:c.lang.common.browseServer,hidden:!0,filebrowser:"info:txtUrl"}]}]},{id:"txtAlt",type:"text",label:c.lang.image.alt,accessKey:"T","default":"",onChange:function(){g(this.getDialog())},setup:function(a,b){a==f&&this.setValue(b.getAttribute("alt"))},
commit:function(a,b){a==f?(this.getValue()||this.isChanged())&&b.setAttribute("alt",this.getValue()):4==a?b.setAttribute("alt",this.getValue()):8==a&&b.removeAttribute("alt")}},{type:"hbox",children:[{id:"basic",type:"vbox",children:[{type:"hbox",requiredContent:"img{width,height}",widths:["50%","50%"],children:[{type:"vbox",padding:1,children:[{type:"text",width:"45px",id:"txtWidth",label:c.lang.common.width,onKeyUp:w,onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:function(){var a=
this.getValue().match(v);(a=!!(a&&0!==parseInt(a[1],10)))||alert(c.lang.common.invalidWidth);return a},setup:y,commit:function(a,b,d){var e=this.getValue();a==f?(e&&c.activeFilter.check("img{width,height}")?b.setStyle("width",CKEDITOR.tools.cssLength(e)):b.removeStyle("width"),!d&&b.removeAttribute("width")):4==a?e.match(k)?b.setStyle("width",CKEDITOR.tools.cssLength(e)):(a=this.getDialog().originalElement,"true"==a.getCustomData("isReady")&&b.setStyle("width",a.$.width+"px")):8==a&&(b.removeAttribute("width"),
b.removeStyle("width"))}},{type:"text",id:"txtHeight",width:"45px",label:c.lang.common.height,onKeyUp:w,onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:function(){var a=this.getValue().match(v);(a=!!(a&&0!==parseInt(a[1],10)))||alert(c.lang.common.invalidHeight);return a},setup:y,commit:function(a,b,d){var e=this.getValue();a==f?(e&&c.activeFilter.check("img{width,height}")?b.setStyle("height",CKEDITOR.tools.cssLength(e)):b.removeStyle("height"),!d&&b.removeAttribute("height")):
4==a?e.match(k)?b.setStyle("height",CKEDITOR.tools.cssLength(e)):(a=this.getDialog().originalElement,"true"==a.getCustomData("isReady")&&b.setStyle("height",a.$.height+"px")):8==a&&(b.removeAttribute("height"),b.removeStyle("height"))}}]},{id:"ratioLock",type:"html",style:"margin-top:30px;width:40px;height:40px;",onLoad:function(){var a=CKEDITOR.document.getById(u),b=CKEDITOR.document.getById(p);a&&(a.on("click",function(a){x(this);a.data&&a.data.preventDefault()},this.getDialog()),a.on("mouseover",
function(){this.addClass("cke_btn_over")},a),a.on("mouseout",function(){this.removeClass("cke_btn_over")},a));b&&(b.on("click",function(a){l(this);var b=this.originalElement,c=this.getValueOf("info","txtWidth");if(b.getCustomData("isReady")=="true"&&c){b=b.$.height/b.$.width*c;if(!isNaN(b)){this.setValueOf("info","txtHeight",Math.round(b));g(this)}}a.data&&a.data.preventDefault()},this.getDialog()),b.on("mouseover",function(){this.addClass("cke_btn_over")},b),b.on("mouseout",function(){this.removeClass("cke_btn_over")},
b))},html:'<div><a href="javascript:void(0)" tabindex="-1" title="'+c.lang.image.lockRatio+'" class="cke_btn_locked" id="'+p+'" role="checkbox"><span class="cke_icon"></span><span class="cke_label">'+c.lang.image.lockRatio+'</span></a><a href="javascript:void(0)" tabindex="-1" title="'+c.lang.image.resetSize+'" class="cke_btn_reset" id="'+u+'" role="button"><span class="cke_label">'+c.lang.image.resetSize+"</span></a></div>"}]},{type:"vbox",padding:1,children:[{type:"text",id:"txtBorder",requiredContent:"img{border-width}",
width:"60px",label:c.lang.image.border,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateBorder),setup:function(a,b){if(a==f){var d;d=(d=(d=b.getStyle("border-width"))&&d.match(/^(\d+px)(?: \1 \1 \1)?$/))&&parseInt(d[1],10);isNaN(parseInt(d,10))&&(d=b.getAttribute("border"));this.setValue(d)}},commit:function(a,b,d){var c=parseInt(this.getValue(),10);a==f||4==a?(isNaN(c)?!c&&
this.isChanged()&&b.removeStyle("border"):(b.setStyle("border-width",CKEDITOR.tools.cssLength(c)),b.setStyle("border-style","solid")),!d&&a==f&&b.removeAttribute("border")):8==a&&(b.removeAttribute("border"),b.removeStyle("border-width"),b.removeStyle("border-style"),b.removeStyle("border-color"))}},{type:"text",id:"txtHSpace",requiredContent:"img{margin-left,margin-right}",width:"60px",label:c.lang.image.hSpace,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this,
"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateHSpace),setup:function(a,b){if(a==f){var d,c;d=b.getStyle("margin-left");c=b.getStyle("margin-right");d=d&&d.match(o);c=c&&c.match(o);d=parseInt(d,10);c=parseInt(c,10);d=d==c&&d;isNaN(parseInt(d,10))&&(d=b.getAttribute("hspace"));this.setValue(d)}},commit:function(a,b,d){var c=parseInt(this.getValue(),10);a==f||4==a?(isNaN(c)?!c&&this.isChanged()&&(b.removeStyle("margin-left"),b.removeStyle("margin-right")):
(b.setStyle("margin-left",CKEDITOR.tools.cssLength(c)),b.setStyle("margin-right",CKEDITOR.tools.cssLength(c))),!d&&a==f&&b.removeAttribute("hspace")):8==a&&(b.removeAttribute("hspace"),b.removeStyle("margin-left"),b.removeStyle("margin-right"))}},{type:"text",id:"txtVSpace",requiredContent:"img{margin-top,margin-bottom}",width:"60px",label:c.lang.image.vSpace,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateVSpace),
setup:function(a,b){if(a==f){var c,e;c=b.getStyle("margin-top");e=b.getStyle("margin-bottom");c=c&&c.match(o);e=e&&e.match(o);c=parseInt(c,10);e=parseInt(e,10);c=c==e&&c;isNaN(parseInt(c,10))&&(c=b.getAttribute("vspace"));this.setValue(c)}},commit:function(a,b,c){var e=parseInt(this.getValue(),10);a==f||4==a?(isNaN(e)?!e&&this.isChanged()&&(b.removeStyle("margin-top"),b.removeStyle("margin-bottom")):(b.setStyle("margin-top",CKEDITOR.tools.cssLength(e)),b.setStyle("margin-bottom",CKEDITOR.tools.cssLength(e))),
!c&&a==f&&b.removeAttribute("vspace")):8==a&&(b.removeAttribute("vspace"),b.removeStyle("margin-top"),b.removeStyle("margin-bottom"))}},{id:"cmbAlign",requiredContent:"img{float}",type:"select",widths:["35%","65%"],style:"width:90px",label:c.lang.common.align,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.alignLeft,"left"],[c.lang.common.alignRight,"right"]],onChange:function(){g(this.getDialog());i.call(this,"advanced:txtdlgGenStyle")},setup:function(a,b){if(a==f){var c=b.getStyle("float");
switch(c){case "inherit":case "none":c=""}!c&&(c=(b.getAttribute("align")||"").toLowerCase());this.setValue(c)}},commit:function(a,b,c){var e=this.getValue();if(a==f||4==a){if(e?b.setStyle("float",e):b.removeStyle("float"),!c&&a==f)switch(e=(b.getAttribute("align")||"").toLowerCase(),e){case "left":case "right":b.removeAttribute("align")}}else 8==a&&b.removeStyle("float")}}]}]},{type:"vbox",height:"250px",children:[{type:"html",id:"htmlPreview",style:"width:95%;",html:"<div>"+CKEDITOR.tools.htmlEncode(c.lang.common.preview)+
'<br><div id="'+m+'" class="ImagePreviewLoader" style="display:none"><div class="loading">&nbsp;</div></div><div class="ImagePreviewBox"><table><tr><td><a href="javascript:void(0)" target="_blank" onclick="return false;" id="'+A+'"><img id="'+z+'" alt="" /></a>'+(c.config.image_previewText||"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas feugiat consequat diam. Maecenas metus. Vivamus diam purus, cursus a, commodo non, facilisis vitae, nulla. Aenean dictum lacinia tortor. Nunc iaculis, nibh non iaculis aliquam, orci felis euismod neque, sed ornare massa mauris sed velit. Nulla pretium mi et risus. Fusce mi pede, tempor id, cursus ac, ullamcorper nec, enim. Sed tortor. Curabitur molestie. Duis velit augue, condimentum at, ultrices a, luctus ut, orci. Donec pellentesque egestas eros. Integer cursus, augue in cursus faucibus, eros pede bibendum sem, in tempus tellus justo quis ligula. Etiam eget tortor. Vestibulum rutrum, est ut placerat elementum, lectus nisl aliquam velit, tempor aliquam eros nunc nonummy metus. In eros metus, gravida a, gravida sed, lobortis id, turpis. Ut ultrices, ipsum at venenatis fringilla, sem nulla lacinia tellus, eget aliquet turpis mauris non enim. Nam turpis. Suspendisse lacinia. Curabitur ac tortor ut ipsum egestas elementum. Nunc imperdiet gravida mauris.")+
"</td></tr></table></div></div>"}]}]}]},{id:"Link",requiredContent:"a[href]",label:c.lang.image.linkTab,padding:0,elements:[{id:"txtUrl",type:"text",label:c.lang.common.url,style:"width: 100%","default":"",setup:function(a,b){if(2==a){var c=b.data("cke-saved-href");c||(c=b.getAttribute("href"));this.setValue(c)}},commit:function(a,b){if(2==a&&(this.getValue()||this.isChanged())){var d=this.getValue();b.data("cke-saved-href",d);b.setAttribute("href",d);if(this.getValue()||!c.config.image_removeLinkByEmptyURL)this.getDialog().addLink=
!0}}},{type:"button",id:"browse",filebrowser:{action:"Browse",target:"Link:txtUrl",url:c.config.filebrowserImageBrowseLinkUrl},style:"float:right",hidden:!0,label:c.lang.common.browseServer},{id:"cmbTarget",type:"select",requiredContent:"a[target]",label:c.lang.common.target,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.targetNew,"_blank"],[c.lang.common.targetTop,"_top"],[c.lang.common.targetSelf,"_self"],[c.lang.common.targetParent,"_parent"]],setup:function(a,b){2==a&&this.setValue(b.getAttribute("target")||
"")},commit:function(a,b){2==a&&(this.getValue()||this.isChanged())&&b.setAttribute("target",this.getValue())}}]},{id:"Upload",hidden:!0,filebrowser:"uploadButton",label:c.lang.image.upload,elements:[{type:"file",id:"upload",label:c.lang.image.btnUpload,style:"height:40px",size:38},{type:"fileButton",id:"uploadButton",filebrowser:"info:txtUrl",label:c.lang.image.btnUpload,"for":["Upload","upload"]}]},{id:"advanced",label:c.lang.common.advancedTab,elements:[{type:"hbox",widths:["50%","25%","25%"],
children:[{type:"text",id:"linkId",requiredContent:"img[id]",label:c.lang.common.id,setup:function(a,b){a==f&&this.setValue(b.getAttribute("id"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("id",this.getValue())}},{id:"cmbLangDir",type:"select",requiredContent:"img[dir]",style:"width : 100px;",label:c.lang.common.langDir,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.langDirLtr,"ltr"],[c.lang.common.langDirRtl,"rtl"]],setup:function(a,b){a==f&&this.setValue(b.getAttribute("dir"))},
commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("dir",this.getValue())}},{type:"text",id:"txtLangCode",requiredContent:"img[lang]",label:c.lang.common.langCode,"default":"",setup:function(a,b){a==f&&this.setValue(b.getAttribute("lang"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("lang",this.getValue())}}]},{type:"text",id:"txtGenLongDescr",requiredContent:"img[longdesc]",label:c.lang.common.longDescr,setup:function(a,b){a==f&&this.setValue(b.getAttribute("longDesc"))},
commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("longDesc",this.getValue())}},{type:"hbox",widths:["50%","50%"],children:[{type:"text",id:"txtGenClass",requiredContent:"img(cke-xyz)",label:c.lang.common.cssClass,"default":"",setup:function(a,b){a==f&&this.setValue(b.getAttribute("class"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("class",this.getValue())}},{type:"text",id:"txtGenTitle",requiredContent:"img[title]",label:c.lang.common.advisoryTitle,
"default":"",onChange:function(){g(this.getDialog())},setup:function(a,b){a==f&&this.setValue(b.getAttribute("title"))},commit:function(a,b){a==f?(this.getValue()||this.isChanged())&&b.setAttribute("title",this.getValue()):4==a?b.setAttribute("title",this.getValue()):8==a&&b.removeAttribute("title")}}]},{type:"text",id:"txtdlgGenStyle",requiredContent:"img{cke-xyz}",label:c.lang.common.cssStyle,validate:CKEDITOR.dialog.validate.inlineStyle(c.lang.common.invalidInlineStyle),"default":"",setup:function(a,
b){if(a==f){var c=b.getAttribute("style");!c&&b.$.style.cssText&&(c=b.$.style.cssText);this.setValue(c);var e=b.$.style.height,c=b.$.style.width,e=(e?e:"").match(k),c=(c?c:"").match(k);this.attributesInStyle={height:!!e,width:!!c}}},onChange:function(){i.call(this,"info:cmbFloat info:cmbAlign info:txtVSpace info:txtHSpace info:txtBorder info:txtWidth info:txtHeight".split(" "));g(this)},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("style",this.getValue())}}]}]}};
CKEDITOR.dialog.add("image",function(c){return r(c,"image")});CKEDITOR.dialog.add("imagebutton",function(c){return r(c,"imagebutton")})})();
extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/dialog/dialogDefinition.js000060400000000001152453623450032713 0ustar00components/com_acymailing
com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/dialog/index.html000060400000000054152453623450031112 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/icons_hidpi.png000060400000102050152453623450030653 0ustar00components�PNG


IHDR 	�N: IDATx��}wxՙ�{f�+�Z�eY�eY��e[n�60`l�Z�1֐l
�ݔ%�$aSX�	����BXZ�PӋm6�`��eK�z��N;�?f�ꖹU�K�}�y�{�)�6s��|���A2Hc`O��7\i6�]�_q�$��B�<�Х^'��{��C�a�կ|�$Ȕ�(J)B����4�|��χ��Q�ٻ�6)��]'F@�!�<dY��RH�Y�V���Rp�L&�X�̵��������ˡ�b��	x� @V+
�C �&�	�yyy�Z�0�LhinFMMM����_�„H��\��m�.(q�駟>���U����v��(�n�a�5׼��K_F����}��)��e#���Z�v�6l�����x<E�$A�y̝3������eY�L)D��BB`P	�
���J�I���<�>8'D@�"@)��f!d!"!���/���z��Z��	�B����_^y%i��u�a�t8���j����0A��� �g���b��3�TmB�N3�o�?��Z,�+W��0��ax�^���p���5>Ν!�%)���l�6����eY8L+/G^^$Q�(�yv�����/�4!�'w�ȗ%	T]	!������#�S�pX���R�QD
V+�P� (�p\��2?�R�$���$+�͠��s/��q �"���B�7o�SSS�={��n��;p��q~ll�A��8������&�eY���/���,j�����A~ӦMKu��k׮}ytt���BPJ�0g¢x����7r|�̧��W��$�uQ׿�5�֭[��AY
�kkKt���$QOB�eA��ѯx�a�RI��%m�*c��g��Ĭ�2�0Y,I������D^>����ɬ0>B`�ZS�%g��Ԕ��1###xb�V^/}f�$���|���`�Q,�$������܅��e�$����k�s�͑�Y�h��ju������eY�l6�ݘV^I� �"�� z��p���!�ws&@eY�?Z7X�p!�!$�5MP��@ ���\y��o��?�'�˙���W���P��h��"��������wߴe�J_IVvF>��cu� $���d�X,���}�w�p:
��B~�3J��g���}�$��!U���@����a(�>p?!doe0`��0` g|�H���
�hg[Q����ڥ혵��s�%	!��x`7�wT2�Ān٢E� �� 	��� I�x|0�` ��A�e۶�T�e��.�[����NX-8��f�|8`dd>�����uk�����	��5����o��n��AA �����_�n�<*�-���%-,��)�f��?�i�*��(�����K�������`����.��P��W�~Ӧ./<H���8�K�,Yj⸈4�to��2Kk��͚�.�����7?)+��A@ ���.EB>�
�M[%�bD~���՛o�!�$Վ�!��&7��v�$I�UUo_�!���[¢�i��P�>�����L��#tp&DQ�,����}���D�QTt���� ���-�tB�	�&��0{�rY���$ahx�Ρ��4O++si�p8�i��'�C��J`%C�x����F	!>���U��("
���r2��s"�0{vU.PE��k>�JWB}�3�l#��Œ��gY���r���l	dr�d�kָ��k:$B�].f�U�@8�ww�ܓ-��-�,*:K���������02<�ܝ-�t/�����fsD��!Zw �"�^�H)�)!��lI����Ov�󳨜RJ��0`��d'+v88�����@
�r(������6qݻHq�>[׃anmjn����������j/�B�������:O�!�tO�eC�,�����I�m��=B��,X��02ò�|��尓.2�.ojk�}UG#
"'�K�e0��`2�`2��e��=�����'D���.4��AF����f����Vn�7�����ى�Ǐ����9x� �E
�,<-�%�W/��̈�T,b�E�n�-F$�b�
�_�|�I�﹇��I�n�7\z�P��	���|P,.,|�(��uM���5�P��Q���!]�L,I����b����~��o�gY�L�Ve�3�)��)%$�����be#I��X,x�7��
��>�BOy����IUG�.��V_z��~����`YV9G�0�'�]]8��7(�BY|^�=�]gL�z{��۸�^^V��F��`,�ʼ ȃCC�� N����}���
tNRgM�R�ƶmۖ�{lM�-��42��eY� wuw��8y����;Ojm�G�ygE}f5X5�Xt�jkh��0Q��� I�Z���$�M�Q��R�d2��1�b*�0�ͰZ�����l0�L�8.��1�yy��aFFF�@ A��qqbJi1G��$륗^by��ܹ���χ���b��T8f�n7���
ő��!�0��$����}��̟��'��v�d2�R
������G��	!W���X���P�ҥK����H+��ށyϮ]��$����J�B�0!�iB���{��0wn�AShTVW']�0�+c��(����B��=�)CK3
�>}:�.�	H�4�5s&S]RŒ��\|��z{�R��P^�h/(*j,))�H���0���PU]=�Z_$OG����V���n�@�T�
� �"�N'�].8�2�1���1pf3v���ӄ��rj���a8a�f���8��s8����S��H�>���y�^�>��<'t����w�)��ǘݻv�eY��v��fŢ�e�ab��f_�p!���SbiQ�!w'+?�g��������g�a������������p:��>}:���䊊
l��&yzU���� ��KWO*�SJ��PJ����'��g�-E��rvd5�P6$ߘh�ϝ�U�h��0`���)$�r0��i��n���<8�'n��e��Жme�{C�嵍6t����ѣx������:�Y�m�ꎎ֙3g�to/�}����φ@���i]���j���Q;s&.^�n9g�mŸ$psv��K.�����
�`N��3f4 K$$�\�����# //�sN������ۚ��m�y�ڬV�|>`���/fK@OP�7���dYII[~~>,�f3�^/^~��=�0k�:��f�F�V###���ݵ��2k��𥆆�}eeem0��0�L�)��t:#�բf�{キ�턐L���SV766�+//o����q��&����ٵ{��E��l���-!x���͒$�!bI�c�b�L�r]q$����㤚S$���?~��r�<)���RSRRRϲl�o2@q���ϟO�"��&R�Y�e�ꎎV���sIUB�,QL���b��o�)�:P���@=n�nW*�Z��%��Q5!myyy����z��ΝoJ��:d�P�n�X���f�D��������}��w���<88�gxx�p�  ��ĒE�:|'���HI��D�Zf�̙W�8�P(2σ�໇n��lb�=�z���{$Ij+,,TtG��y
�����\qy9Xձ"�0p8��s�p���\Ow�.�����;�cx<Ȳ���ѣ��E3�x�ԩS�+**������<�*�#'J����5�f�N�#������Ϙ��e��o��U�T�Rj��n�������WL&өY�g�%R�VT���^W��He�f%W�SJߎ��*��O���ƶ�$�c���ArWW�$0�R�$��8��z�Ǒ�wJi�*���~�I���KӧO��n����/���KN�Kʛ6�-݄�f�P6k�dE�<q"�jK��Yۥ�S*������[%	�-���wSF@�=�##m���WR��{�SU�8��"ت���1��~6`��0`��BN�Ƀł��<D�0��G^�|�ѹ�~{j	�P���k��.����A;�4u-��(Ƙ[L�Ƅ"�]6�
�8.RL�V�0�H�������ٳ��z�#B���nx!���Iј,?��U��d�C-]bX,?޸aC��1����zk~����>��jLDI��Wd�8e��aV��-]�ac:��������z~�f�czee����E��ݚ��m�ڵ���P�`�##p=�u�س��l�C^���r����L�J��0���C�jL��Y�!k�Y��|𥆆�=�$�@�$�l6�:�60�L1��h�It%�MA�Z�И�ИL��$'1�ߏ���|�w<�iL^=z�h����A�B!X-��&[��1A��$gL��$gL��$g��11`��0`���7�� S��w$��a�#y,��q�1$��!�

�|�[�s�%(�V��I��%�J�����咠�&�EZi��M�P�vâ
$��O~��ϝ��/�P�v�0�ϟ�$i���|&�,�e�W�T�z�Gk2�L���&!��Lj	�&A���7]�c��rL���PD�
F�I��@$ز*�d��$	�,��- �i�L���D�MwG��g�A�̺@+0�.�ҫ�OR��4]��%�fҤ��.�W��.����@�AE0��>ڙY ��3�����:'�g�(qN��Ҏ����`(4*�] ��[�T��l�v\���&}�%@e�?��&u%K�r8�"�I�^/n��7rw�C�A�	Uc݂���_]YYGT�(���k_�rR�i	p,� ��Y�QYUu]�����@��P����V�gan^|�%��А�y�e���Ynu:�����8��9s��3�,>�g�Y�@Ұ㙸�����֥v�uiaA���l���N�:���Պ��|�̘y�|>�8y�s��s�23Y�����[;vl����YSS�r�`�$8�v�klD�3M������/n���$�w�-��£ή�3��奚kH��! ��T÷CG�e
����H�/S�^P��[o�y��G=~�!s��	���+��l���J_SS����a���?�H�z3!�2�#nJ����a7������l�f��Ⱬ�1G����s���h�:��<�r����E��8�'"Q��i�(Ř���T��s@�j*�0`��0��f��L(ҏv�@��Z�`�zG�p�BJ�h�<ԾdIcŴi(*.���(�����Ν�r(t#���T��{`�…����(r�122�޾>�ڽ�x�Z(����n�{����<�3Ò��"�y�y��ĉ�>LRyi^Q��^tQ�+/� (�5��ߏ'�yfx��߶1[��oܰ��j�""GD.�`�R���3�M����s7��,����a1�q������!B`z}����P�IjI�"'���0dQ��׷#������< ����>��Zݑ�q}]]/���=������Ѐİ�u���<�G���e2����pAl�������^Ab�ǹ%I���Яnߣ1�N�<I?ze��0�>
��Fc�ཝ;�<�,3Ze����(���;��B�v�X�������>u�.�$��}}�?B0b�� x���F�����RZ_d{�~�k���b�� ��x���ݐ&K���4��>�j�ҥ�����c<��<���,���_�� Q�*�=?�ٖ�|�����ӧ���1��H�P8�ʊ�.��P�����_}�uz���Ӎ7J�^z�t�y�I.���&�i�oS�q6}�'�y�'mܸQڰa��t�2�m۞��'�/���{��U�9������<u�C�Tb8B�O4�����:DTMZ0Do_��g�=��Oe_p��'��f9N�$	>����ӫ�~������W^{��3� FGG�e˖���TK���0�p8��'O�RJ߁�:�/��8������2�^/���{���oG�O.'$��|8���a��ۡ,��RM@��f�<�0�z���꒟}�93��$��s�k�;OZ�x�T\\�_�Q�l�/mlnV�y�T__/��QJwd���p��j�j���Y*((��Rz�*!g�3��n��h��Ҍ3���q�H6��=��I�^]=r�w<@)�SJ�2�~�����A��5k���4�4a���M΂ə���R�C�o������l�.��5����L2^	�I_��;'A]P��~�o��۷_]���.C���*�������z�(53���P<���&�0`����OD��Jf�
&�Iy�J�~��d�Z����k���fC��C0�%A��lF�˅]�w��{�a�$"�>���>�6�C���D7���GM�D�� ��B@���|��]��0!1�sb2���.����m�|�L)䧞bdJo;���9���d`uc &��3J)n���'I�n�<|8ki��&!q�u��Ų,���?�t��@V"O*����p�6m��QYY�����[ ����K��U�cM��+	(�'�JJ@�T�_�)O�B��g�w��	���`�ڵ(�Z�z k�ǣΝ5�+?:�ѬȘ���̐χo���������(��u�xJ���Q
����k�q�<���r[ױcII�/D�WdT�ȓ�Jy���%S���?Ce���'tId5
	��3mj�x�
w���~F��ӝ�	$�"�""	d�f Sh��o�7mقY55����t1+�ͬ
6B0���-���###�3gN�J�B�y�Va�s �Pi$B����%#��ӃS���5{6���QSW���� �r-M��L�]Uc�;�u�6.�}P%�P�*%%�4�[֬+rDd�LF ��Y΂L�g�0�'e���u�����Npj�?��eX�����dҝ�w�(0��@��
��1AH�>�V�Zi��Fqp�U�Ty�c� �ɜM�前B��8��)��׀0` �C_`�}��/0������C_`�}��.���	�C_`�0`��d�j�!��t��
�k���u�J�����:�>�iv:߿쪫$�$��.��E������/�O,��3��}��_>���-˗����0Y�O�~��v\�n�~�E�?�x��
��@&�)�qFZӦM��~�~L+/��e�@&a/_���i��)����i	����~?xAcak+�gͺ���ڪfμ�…��a�`0��ӧ'�-���?������ë�U���5k̮��'����Gy����kTG*�
V���{���Ϫ����x"�$Q�%�ח������L,��/Y��BR#?h�=^��}8������B�Pĵ�0�x��V�f{0*�.�`)�q_4<�cxdϽ�B1�{�&@�x��6����xy֮Ys1g����ƪ�κ�]XAK#�3/��2����?�L]FWx�U�V��1��&��q���8p����ܶ`�E^�����|��VBBMg�=?����VUV�].8������
Z�~�':;}8�!�ܣWnƫ!�E�}�����k��G*��i���� ���Cy�9��U��ďX��}~(���xDQ����n���?��#�f��ܘ��\&_�1�oZE���S��%A84o��
���x�BF�.�}�jcTt�)Ց�|B�c�x��L[��e������h~�B�4�Kà��2ô

�Hd=[5���Vwt8A���Eoo�<{�T�h IDAT��fΜٵo߾J�a�Ʉ�i��	�����3Y����*�.���Y�.IFGFp�ر���k����Ep���˖-s���T��0[,x��7������@��$�p�
�>��qj����T�`������r����m�������N�s���$X�d�����mb6{�
`e�-PA,��-�����E��u��_���n���:B�s@)m�0k{{�������
&��P��������[�jU��jB�ͯ��}��;;;{A�UW_���
.�*B�.-��^B�kttT���~��jnjzutx�w�(���@m��/hjk�V�^-u�q�4
�}}�[ZZ�3V��|C'o��y��˗Kg�Y�w�޽o/\�H:�s$(N��@Ca~>�p?��9(�����ҪP(��(!eZ�򖔔@�e��_أ󶴴T��~��hO�����}����B�n��aBȗ	!/B�jӦ[Lfsi0��2>�e�7�����a�8㌓�y׮[w��fs�b9���)��jf�����"�Ξ-@X���j=�h�b�r����_��=���⽖��f֬0�\�v��ѽh�biZU՘G��HE�I)=n��O7Λ'�ih�J�ʤ55��&���R��m��E)��N�RJ�q��1���$͞3G*.)�jjk���f���\���w�F)�RRjA�SJ��������+++��nw���`�;ᄏ�R���'�
�����������2���؟�����Ç�Qmդ#PN)��C��*
��"oU<y��(��SVUP��QD��ݥ�hy�I�gT�0`���(�C_`�}��/0�
SC_0C_`�}��/0������0`���r1�}ԑ�����E���'|nJ	,?�,iY[�8�S�R�س�_~9�w��I9���S��(i~C���s��~f~C�*�ѨrN�e�g�k�rp�{K��K)!x��7M�yvk�tF{;X��e9ђ�0	��ص���e)�̒��P��w��(.#��k�;?w�e��

�/���*�Mc|�c�@~�>����6M+���^�F?w�e��L��s朞_[[��c�!�n�����O�Dw��
�$�;��(b�g���_D��Ro ��]v><v����i��U,��KW��T	��x�,���R�m�tAGG��rBXm6��3��r(��Ÿם�k4���Lj�$P
�͖p�	�������=!�7$�YzB���X����D�z\��J����	z�H�S��:��KbL$�]O�4�Ó(�Szh���<6�P���i�B��+֬i�;��|$}�����P
�ł�����/�	`�.�4w�ږ�v�d¶���EΌ3�;O�mii?����%��߈��ĘכK��1��
:��!��O
ĸ�Y�Y�c����E.LI��	��!��j�S͛W2�!��)���lw�ԉ�/?�.H�{:���zNt��Ͼd9fMwϙ�b��$�A1��`�������� Z�@\��	�t7���xN�3S� N��Ғ��`�E���/��A�h�.X�ގW_x��z�
��]1�IRL�*+Q���eZ�BYx��T�nI����R���9s��55c�$�AŜ9RE]]��*�ꤊ9s"��F�8�e˖��]��’ j�%	&D��Y_&�R���Rڙ�-�+(�];{6���Y_��gS��`w��x��aJi�X���*{v��W��E�>
Nq��nbo�(bzU���h�5+�|z=��A��1+D�Џ�3���)Ǽ0`����A�C_`�`�}��/������C_`�}��/0��� }A����0`�ozo�W�@rq����P��<�����uu������L�0��	�����ٳ]ǎ���z�Yq��57CEȒ��'(� �����8�z�=�|��+���[��z��s� KRR9U�nh>'�a�,�a��DQ+�h�?;w��K�a���P0���������%I
��ba


�GJ�$������#�r��2�(���'x�ǩ��ѝ;v���]�x��ڙ3��6[RM��(..vQ��Bg&)�Z�$!���B�%hhn˗��|��Ga2�Rdռ1h5��j`�4Y��ѱ1l{�K!|��ꗿu���K(C% D).b"�j��Q�,����x�Z����U<PYY�7*}�S����\�$ҹDQ����wo�-�3G<���c�x<���M�{3z"��I��`��s_�Sf�](�;�GFwaa�6-�ʊ�#6济sͳ���âE�>���k��4���g��델��)K�B�ƆV�E3��BE����/��b��6W^Rr[8��[���>J�����tԕ�W�����@��e��AH��.��BO0x����څ--�\U�3kk����1yD��њ��y�����������Xv�
�����˵��=��kdt4�@+��r�[����,#��<�j��BH����������}}}�(/���6����L��<�}�p8f6@�b�nG�U�U|>֭_"��A)��~q��o2бr�x�W��߿��w��?���LQ�I)�1��H��eˤ��"hG3(�������?:p��ńY�m5}
. �썪�Yuu�u�f�l���Ë":�����v�bZ 2�eT�$�}>�\�xF�����z�G����s����6ov���ܹ7�
wh��D�zB4.^����P
Ap���<����Y��'��I7����p`�Zaw80�߿��jXC��cQkkseE�f3!�E'����{�Ķ�6�M�pC�Çf�:U9�.�ug�y&��h@y!aX���/�!zP#��@0ȄB���i��OCm��<�}����o����q���!�MP=�ͭ�� �+~�;����4)n%L���׿n%�D��T^R�J�_�0�����H�r��K/�EIM�E� ��Y��*��,f��tڴQ(�x���]�uQ�CK�ep�iӧ�z�ԩ5������F^k~�qZ�Y�x�k�X8�oR�bf������ܚ�j��V��ya�{jʒ��s�VWWVVS(k�,˰Z,����q܉�.��׾6888�@ A�q����.,��������^ߟڸD%�.(���EEE�8<���c``�ַ"z��4���6���B��n�f�9��<��
koS���pnϞaB�E�6xட�|��?��S�Z��l�-1KH�`9����M[�,p	!��		)�e(��KɖR��R���;��z�2s�10`��0��������u��[
_���kW�R0���{��/C��׬\����!
6Lyy[�-(W[j�O���EA���X�bŹP�nL){ے%�DAP*�R�Θ� ���� pe�y.)�bm�JQ?o�Ϊ��OheM�^T��eYjX������ϋ�I�h��r_WׅSE`Q�ҥ�DA@8���n��V�����@ ^`�X����l	l�(+�$�+G��|�M�>�� @E���8F~Ɇ��mɒ+i���+�%�<}��͞P(�k:�UU@��1�����%M�
��n���ۓ,��"�(2gIœ��7�lN;3&�WZ��R
QJa2�|��zB����u1�hXD���-�oHWn��e��E��U��ٹr���	���nW�9�RȒ�����"�|O�*8� dKQa!����}ii)JKJPZZ
���'�$�/\x6�xhϤ�,^�QV�\M�V��	�f3�r�����P�w&B��3Ͳz磣����P5}:ËbD�Ų,�N�[n-/+s�'˨mh�|��C8�{�8-����[�*��x��믿�lA��a Xɲ,B0oΜ�c|1�NND2�����9sjD���V�Z5���(��w�#z}��81�L`���U����LA0@ ����߲e���@�׭]{�`���
��2o�juzyRuAUIYم�{z��7FX�G56�WJ��V�����{��f�q��Ս��1�Eg�Y}���2�(2�ԫ�3'Dٞ����y硗�ne,�rv�l��n:�{8��PJ�J)���5ü���k�{B�ky�S%���6[�S4�_;�|(�$����h+��$B@E�	���ŀ0`@�@�VX_$�R	�aA�
�)����I�E�D�_9Y�+�׀ǃ7�zj�J�[����:S���.�;/Oז<Wh6��^/v=�\��_�썁�\���<e�8Y;J!�2��^�c�q�e9���,5θ�T��0�L��ƃ����xC�
���0�N6xQ���H���:R��:�2"Q�1
~?C���e��ӽOP$f@�����F�I��Zy��	1u&����
�
af�I}+�%	�GF�N�ހ0`���>;R�uW^�|���`0�f4b��3��o��(3��0��?�	1>B��xq��)ۜ�v�,�y�%	��V�R�C���dP\�j0B�#��R����&�q1�]@`b����͙s_kS`�}�9t~?�`8N�c�,I��q:o^y����G~~>V�\	�t&=��)�C�b��D��v��F�q��ۍ!�A|=��h��|��'{zz0:2�ё�����o>9�ځ�N04��oל}�9��۷�}��}�9���o�L�@|=�ttH-RT��:f��3�g)���_O�1ů0|Y��˨�R��UR��̙3��ߵ���c|=�h�䨎�~��cr8>o͚*�ٌ��>u�����r\���1��[$ܾ���,�a �<V,Ybv?�(�ׄ�$�`T�II�	�#P#�$�����.,(@Hu�#
֬\Yj��`���u �,�BcUm�/;V�����#��������54(�>jkJ��eq�ʕ��:T��NQ[ n~���\�G/X`�VZ��;����摸ְZ��_��^m���G�yN��ۯ�u�٬>�R]����X���^AA�…����l�}��З-�vՊ����%�=Bk��*xFGu! K�؇Ѧ�l�Y,�T=�KD%EEX�zu���Haa!lV+��A�e̞=�4øx�8�V�cc��鿜9}z�o1mB0��Aq�&��PLK�{�ƃ<%�����MMvQ�U��S*�����f�C��˶��F)]�h��3��,B ����r���t���\E������"���0�l���Ɇ(���@8lhN
0`��00i�
}G��-_.Ϛu<�ޘTUVbZ�n8�O��:D�[�y�­Z&*����W�d�c0.�8,[�<���9*����U�-JRl�HM�	!XV�e'����A�]�D�q-@E���q�
ʰ�xD�>��
�C��Ꜹ߶8;I�E�?	~�	Y�0�sRzhmkKh"��={"��������1�i������Lx�U�aZ�0�4����O�t ��E��]�\4!��?Z��vlذ�~~}=�f�邆�&��&��s
��GE>�:]�:>¡~?ڗ.EP�@����-��}Pg��`f���������cze�(&�N�:'��JJ��tw�=~���Y(���ڒ�z6D����]*�{SJWSJOe"{L�b�̙��@�����Bȫ��&�z�ώ@V�΃�2
�t&�Lڳqk�z�����uh��|NJe��`�Y��M�}}��I�]c��Li�B���̘���DQ����)QX]-qn���Z��\�-'g��
:s�?�}/81	�0`��0�5�%fA|\�� /o��-[j4~*�
���7��'F@;G8���0�8�3�0�bz�v(�����(��f55��D>�55�H��x���+#�d`X##�h�4����!��|�RJ��t7�#�)�1 OP6�!)�tr��'�	%��M���h��B�@kk[[�`XCcc8~(!Fs����!!b�l(���y<Ҏ���ӛ�����U�vN���Μm��=��/��oj�98�y��4nBvB�$�����:����m��n��f���0������ý��8�̝�ߤ���!��Őǃ�c�C�R�N�8����W��w��׭[�Bz51��ׁ�������}~(;l�
D�h�OH�h��z	T��!W����b��v*ׁ?��cbE�x�|�̙`������ߏ�ӧuOK�r���)[��e�xu]N�}@S˫��u ��B������n��@�zz��2p��Hω�.��Ř���RH�>�Eq�J�ɾj4��"���@�@ ����!�X�vm����~�=�?1PJ;'�*c"���"ðQ0`��L5�þ��/�T��+���"�i���/��P\�<�ʾ 
mm׀a�К�@�q�Pw=�__�
6�[��v�(?&l_�#/#�@���l6�
�eY�65����Z'�\q���W�̙3eAN�ۿ�����>SJe9�A�
����B����IY�a2ya2�ä�d��[W�09�@�ۓ�>;���}A�0��0`����`�S��x֬���'t!�ɴ�rTUVN���	���秔@�z�~�9�:��
���|g��;�����T�!F�8���
�w�2�Q���2"I���_P�$9�� �Er�Z<�j��C��D՛�D��<�q�c�R�}�Ҋ�2�a%YHBH���L��(��٩Hq��)����LeDW��:��jSU(-0犣[�q��u�g��Պ����[f#}I)�?W�jh�ʉ邅��y�@ ���L)>���HZ=�`:���]N���'�~z�W�����9|X���)�^�K6l�����92�$cD")���ĀR�J)=��iٲ��pC{{t�z$}o�����҅P�y���:��~!%��i|���p�ց�1Q=��TK���/�O`Rցl�����)��(D�h�@_ww�T:��J_E�@��Ѥ�ģ ����Skii���擎��Nc-d��pBV׀a_`��0`��gz������DXL����jL+(����#F��E�GG����}B->�cL,��<��$	>�'�]�����yq=H�bL�#�����G�E�zt?=)��ŭ�睇���)�=##x�R������N�$!�2)��S��Sg�D,'�A)�D)F��ߌY�ٛ�˗���Y	C?)�PJ��"����/ʺB�@(D �8�0��,��h�$��R��B	���7j�����b�M�I}!��qb�����0���IŇ���H�I�Er�l���q�����0`��0��s����Ǵr�\���Y�N)L��v=�~ k�:;��a�,Q
O��R�����6��t��O}w��Ӛ�\��n7L�/��C�C�3BB��"������$K �z�eY�@����rD���$�<v�\��.W�i��G�e���%qq.@�Ǥ�F��ķ���-b�PJ9(���24�
(�Eq�Řş�g_4o�BT���b2e<(�N��&T��K1/���G��xQ��������!eVd���YP��weT�>�>ҵ�@�D�K��{�lnFuI��$����bXPB�N�}1i�~�m��њEy���L��Hy.��0�D$��?V�S�tς�SI �����SWa�W60`��|&0���r�/�T/�1�l���dL [��L��0i���O�e��+}��,��}A�^ Ƈ�z�ZOO��@N��^ ��I	L�}A���R��f��)M6K��gAF�hR�"v��ط��vG IDATsgFy&ݾ�E�R��&b_���@Ô͂L�
ӳ R�&þ@�D?™�&վ@#�N����}�0`��|˜�}���r>�6Yz��	L�^!g�9�2�G�)&K���S��'�7H:4;3�%�4��ll2�G����E��D~T#�!2�G����)x���ņ�͸�hd�(*�'�7�LςxL�!㕰y�RTOL���?�d���#d3�1Uz��K�*=�gr|6�,&��j�\{!+D�@�O�Q���G��60`��|�,W�5:�0����Fb�д��ۮ?M���p��������(**���zN�Ɓ���P�*�{rm���X�z�������ψu	a��
f�����fn~c#��� K$u������O�����p���J����Xw�R�Áwv��G��(��X�N�涙3f���1k�,ȒQ���m'(��c�,�A��>�,F��XX�~�D���3,��(q8�z�J�Z����׷R�ep���RB �"��d����e$I�D)���ckWW���	$I/ ��a*AU)E8�T�IxAJ)DI�%��M�H@!�"���F [PJ!IRLT��	��n"�rݲ�>'%J1�Ԅ��qq1��oV�Z � �t�MI]P$I���p-&�7Ӷ@��'�
Z�-�vN� �j�Y��U�k���L7Q�(�)
4r�,CV�XE�Y���,L&8����`��,�n�χ������G�JH)�,��P^����=V��Ȋ+�v���?/~��Gn��^gs:�襘�rL�&���z�o~��
3����(�����~�###����}��s�s�…�P�)�`hx���&3�pT�>�@���p�w�Ǫ����ٳO����p8�� I������p�
���Z1�<��N��`�z�����=z�/Z$��w��7���^F)�
�|㷿����۷�C)��RJ����[�RV��p��qւҬRˣ)�n�p��B���#�4!�k������ϵ--RmKK�@ʥ�RjР^]���s���f	��ۧ�F
BH����]	���'N ��T�So9ݳ`���5�d��X��Ԭ�h�gCcb��0����g`\'��7��L1�|�����9s�*�M���{zp��I�GG����������������+6n�l6$Q��ʁX�ò�z����ݷO�?�d^}|�	�bX,w,Z����W_�ߜ
<ê���ǟ[�!��1�(@ߘ8��ڰd�b��ѣ�}|��e�;;y��{p�ln�[_o]�ގA�?R���2����v��a�)$��aTO���3g�Rj���_*�"�AyY�@(�9їF�� @E�~I��f�$��<!(�Ϗ��p�,�W5,)[ �$A�$0��\q��
���,�� �Y���"Qr�TVMh*E�����a2�r��b)[ ~N�� �4�j�AƳ���@Sbi��x�@.���u�QT�����Qeab��N�eY0F=�J� �"�T�L)HT��׋��'�#s��>���]�v�z�-&
չ��<X�V�L&0�Қ\����"*�4�����>���F�o�Q��߽{��/}�K�������B����d�(<���������ϻ��.R����Ϛ���#Gڠ($�U��Th�@�����}o�}��Wl�X�l6ò,DQ���9�{�����j�:ˉ��B�Ô�6�J��T�~0J�?�}��w~����>x���R��}��de%��)�RJ�I3�)Pu	��������$4C�<?W��۠t��>V�1Н�U��z�tig�T#��'N�So�xy�'N����������0`���Yl��n(Z4��ߣ�{�t�jY��*��T�e�3g�꒒X�Vp,s�eY8�N|�?��}��7ﶦy�����VM�$�B!����<<���w��E�Ų,Y[k_lK�0�&�ڼb06���6y�<2�K2<�L��@�x2�����Ab�-��m�+x�7ٲ�-�w�r�]ݮ�ޤ�3�W���r��ԭ[��:�{ιr�
�;�<�����P�~;�����+�|D)�Q�x�b~bc#?���_�xq�BJ
�+���Q{{{߂�o�U��h=�l���y]������R���ۄѣG�\��5k����ikk3�Ɯuk�>�M@�q��.�j����;60�Z�꧄���A�R��p:�p:�P�����#��]�j�O�o���Z��jE�@NII_�ر�;�o��B��M�'7e���n����E�/����j�HKK����ؽ�J�B�Omnn>u�¥˧O��O��I|�ĉ<��~�VV���ɓ'��x�1q���=�������n�D�ZT�F��ʯn��YY�,|21���烏e��T�nVi4!�3�c��^N�X���q��<������7�USS��<<n��I�X��z�{��:��ar���-[��q�[��Z�b[�R�d2!++&�	�t:������g����3��:$�dd@+�0��tg"�뗫V�k��V>=+�@�tw��[WW�wvv򝝝|]]]�y�RJw�I���k��V���V��xO?�������s�[�x�g���x<��l��l��ֿ_�k_qaa�˗�?��c�(�+(�����}EEE���UXX�?���O<�Dwaaa�EEE|~A�>��
VȊJ)�H)��j՗���_����^z����z��_�dIw��,Yҭ����t><��`�+--��V}I���F��EƊB$���+Ql���������J��X�K���X�|�+P�@�
(P�@�
D�2�������֬�L�
��|�7���ȑ����f����|�ۍ��;~|38.6_0w�|������W_��,��N�a�D�a�D~�w��^}�ՏZ���Ο�/�=o�kn���֭[������֮]�/�1c��`6��S�@�Y�V��hѢ�H�/`v�v�=����,Z�h�Z�4�H�`���W:vl�;�|����ڔ����O�S	_ =i�0�u�`p_~�e�/h�:���ŋ���=�T56���|AQy9���>b�����/,+���r���6��>�N�V�|Afv68�K	_��tڲ�����I‰���rfffN�].�a=!�555
b�t��ug)Y�4h�x�-���!(�͂Z���{�dL�:u�贴�M��/��˃�Əg�ju_`0`4�����'+�.c>�56?�K�R5�|�����i��R5�W"N�'�dff�O�>��R:��С�Nf�溭��SJ��e
�/2��yk(�E�#������=u���}w.Z�LEAܱpa7��ާX=������{�̬,wFf�T��������뮻���*���	�_�����NX�qcCeu����~�…�%=�
`�X�/J��;�1c�4eʺ�6�Qv4�_���~YZZ���d�����3�Wf&������YR�#J�@aQё�3g�w�q?f�X7���kk����O�:���ܼM�ʒ0�x@T/K��#��P���F����K֒�ʴ�4|{����b���|�iӦf���	!v��r���ap)��D���*��������^�=^�,��k<�F
JiVye��ѣFu�K�-Ϝ=+̿�7_�կ�6�r�����1kq1<<��h4Z4
�ڳGp:xOZ �G�_�VT<f-.F?�Z���Μ9s��p�������y������KJ�����	��ɓ�}�R:0:'��-��·wt���L/������/�*�p��Y���w��pe�\���ܓ'O�={K?������׿{��%%%[�;�RʈiY�8B��]�#��;S-���aS�qIz@J)�B)��V�H�x�R����Ä袔֥�q
(P�@�
�j�)�kE¯O��U`5���>��"���M�u:t���x�J6tw���E*��K�X��ž�]�q�\���+��<���0;�֯c=!dN�o���{߻W+:��Z
�����=#͜r�������r����ɲ(����?�D�E����3����xB�o~o_���0�)S� N ]B@Ė�ص+"9=#���Pn������8؝N�gd��@��L��0�׭k�掯�s���5�~u���…K��<���FX������=z��ѣG��<�
)sc@)-��\��Tv.�QB���3�ſoN�
�K�/�(./G�>�xg{d��EZ��@c}�%+3�?0p������0�3!�:��,:�:Ht��䠳�Ͳ��O^@�j�r�񖼼��0S�p�’�7�v�bH����:�>�D�
n6J����"*���l���S���W#~/,,<?88��a�����6
�_9sF^�T��=[��Z22���f���K��p�\_��68xsVC��Ò�~�СCW:tՒ�~�68����j�@�
(P�@������#Ԭ������g��OJ�?R�!��8Y}�H����T�!@��~`d<C���G�Y�+��
����ˮ�����r$���L!@����"B�d��)_
��#�"HV�CVCE߯��
(P�@�
(�K�Sl�W����{I�߇'F*(L&�O�~]���;I�0�[x�]0��a�����9�ߤ���FV�ؐ;Y鯏�b����qU��8�HHz�OT��؜Nhd#>�E:\�WT
	!�YB��Ja��T�DܩF#;��"<�t w���(�D���I	�Q��ߴ���� �h
������7����H�j(WOD��1�";X�ˡQ�`4��f��s3.�<[�T̈́�Ԍ�Y�f\/�dC�
9U�T����t:xe���v���������X��:���a���@__|j����jX,�TO�����|7l&dYL�
�9�����t��N�sĒx�z����ڵ���4G)ܒ��72�O܄�F���@�
(P�@��!�p$�IZ����`���s�����G�v���t��3f�IЮ@ ��n��_U�r1��fqcF�Ƒ�t�'%_�q+pz<P37�*j̈́�9�B���S�I���a��[�1i���W�wG���3�Q�L��NF��J���@�4)q�Ϫ�OD���#!=�|�Y
�������M���[,z��6�<6�V�A\�@���c�K�jh���,��N��ϟ�����"���148��'N���߰1�r��ps�
%�8�E��W��VC�׻�����z�TAnS��~
(P�@�7�M���s�L�*��p�B�x�>��W~���-zJ�R���\.|��g*@�+N��m6CVP�=|��'�8�h�Geݽd�
�^F�e�X��;S	�PP�?2�wϲ�=s����x�SJA)]�{��<˂H��/u��"R!8��^R�7B�O�	 �_����Ĕ��/�@Â�j4���u��-����^��h4��\a7��y<�W (� � 3=]}��QB�aٽ�����tu �`�>i�= f`Y,˂s���h��z�5ߏ���{���M�+�RY�� �|��p�ĉ��9��n˲�;��
�{x��X������o&Ѓ,��n��ȑ#_�8q�!�-$zl�hh����᯿��+))�UUU�l!�\�v�=�y�\>/#񵣔��8�l6;vl��ӧ�P�N��9�VO;��*�����_�l�ͧO��r���
����|��F�3 �|����appG�� 6����u�Z����>�M�lj�S�ZVV�YAA����4��jp��om6�ٲ%�n�9�c�@�0�9v��ϟ��ɓ'犍/�?2�k�E������=�t��ȣ��-//������z�?n\D�������q�hyy9}��G�RJ�b�XmE�D����Wo<q]g�L	)D��(y[�~�E��lP "�@�?��>�ǁw��Áˇ��9��|���3���O��Wq\E�aԨn�2��3����|��:�`���th�j����n��]���k�G���J���J*+_���}�Z

�@�RA�RA��T�4�J
�@�Vcnk�K*+_C�2,�V0����)��Qo`�X����Սuu�q�,���-��R�_x�uu�J*+W��Z���Qo�66>(U���[ssq���?��)+-�/]�A�������ݻ��Oa2��q��[�F�Z0�T*N�:�����x��K�plϞе�
x�CYI�kq���۝N'.^���y�L��O?���/��t��eY���e%%x��_�
�q�8.x���t����?���ǖ//�i����O��G�ϟ?/8�ΈzX�.X��*�s\�o���v�q��%��/�t��e�*�_T�a��˖U����_�t�s���$�I� |���^/�~睃�-�p;!�h��i/ZT��;��z���A�=� �HG�J��#�>*��W�,
��GT*Uț�["@p"r�\p:�`5������I��E��@bQUu�$�F���MQ>���庞7��FÛ���*J)J��y�GB�f��)�J���;XA���X6t6��H�D�^��w�*�+�§k�z^H��DoF�
(P�׏D����w�ټX+ќQJ��8��,��L��`�66�	��	�b�޽رq������v�8��Ί��`�jk�n�K�p8B.�˥���U�j��%���ʅ�z Z�)�ޚC	��m�t������1y24�$j�`E��Q��
�u�n�ؿ_C)e���x	��嗗����R�x��E�r����֮]�����c��Mm���t:�r�B.��	���ͦ�;6𽑽v�Zn|m���E�rD��"z�������|�ヒ4��&�{�)�Ŗ-Ш�Q��$V�̙�ݯ~E�n��t������͏R܏�3��3(���RZ�<IH�URJ��ϘAg̈؎G<���_�IB�qI��آ\��_�x��W�RD(�<^/x?Qr���0�z�A98��-1o<�/_�=�>R�:1o<g���_ Aȉ"�k!9=�-�-�����A�`!�H1"�3�;�:dA�4#H{����M�	n�� ��JCZ-\Gӎ�_0]V�x���uuMD�ƆO>Ij1	�y�l�ZW�t��ר� (@ZZ��}�Ņ��D����YAx�w>8��GB�9���HM�'�s1n�4����u���F��{@:�86����t��c
�5���;�A���$$"�4�k���f L�}�?���sӤ�QQ���!� �~�z=<WY[�luU��c�?|f�v�‘�3㾆r�iT*���>[QQ^<a_]Q�lx�v0!�%:�
P�[���\8p����~ܸg��V�,Ra<tj5�2�Ѣ��>��������Fm���f���e�O�&�y
��Z-,8��!	�|�Đ��+8}�vm�l���][�����x�J0��k\�׿�u����M@ ����++�5G^Y�WY)-�`��-�Z��q�(��/�\�<���G�p(*/�Wj
b4"�`��a��O������ *�MFƗֲ2
�DO�����j22��'�Q>K)͊�{��a�x�\��[�
�c,�Yǡ���_�ԗ��;���`x�2�2J�Ov�/�����h)��L��xr�e(P�@��c8�������P�wt�So�*��4�W��b�=رqc������p]�>~Bu5�t8�����v�n�36��q:̄�j~�%��C�|�Z�oʇ8�u IDAT��9 ;�mӈ|?s�d�ab�<��?_���2S[ZXP�]�w_�MD"|�=wߝSSU5���O}����\fhh���

1y���z��~�����j���A"|A~e��	����N	<��~�@���ƥ���y4͜������.�^|}�ĥ����d�8c���Bi����--����
���3��j^�;�R��a�t�2^]�\@��Z)�����c
p#p��a�<D�#�q�wdy��AH���$h�I�6%��	!f�l�W��X�F/N��h2������+P
B):�NgӎM�^0UV�x�������T�ӟ�5R�g��K��N��B҃М^�,��@�WtY�	I�� ռB�c ռBdDa���aw@�3'CH�M�ן�<��x����b�
+%���Dx�A��p�'�;"��R�WX�W��	z�6adx���~ܸ���
����'�|��Wx>�WX�$����Nhh�*�a�(D�VU�c���E;f�WQtax.���׎�G+Ji_Eu5-,.��N���*+����a��yee|�_`���ώ9��Ӧ
f���F��<�A�4c8�~n"VdQ�n_v���X����W(.-����=���(�SJ��@+�i��}��w��+$�W�㓮.�]��M1�0�
��@�
(H)�����kա{�i��x�`Z{;˾��M�n,_0���q:�A� p9�Nf|*���MM9��޾=��45A0� �j��۾�"�Lnnf	�������Ճ�}�Y�/���8l6��t��r��v�^"g�٘�yyA���>��VW'�TU]_Z���D�������- �WS��"��{�ߜ:u��ر�|���f:e�tJS�L�>�Nln��So0������}�
b��������'9��`�(�*���7�N)_��ښ���W��V ju����s�H�}A�7; ��1ܾ`�D���0 B��^��/�eSD�y�p�=�^Z_��h����'��Z���K��N8 /p<Lf3���
��a2����=Y-�!QMX����= B��[_�l�Z�z�6�����烏�p�f��˩ �<Y�Ƅ��P/8�� ���3g��e�7��
ę��[Xĩ�!�x�!^��� ���'�^����X�eJF�>�G0��h���h�P5#I��[
�݁/;�|�Q���b�鰄����5|{�Z��8�/z].L�e_0���[^>l`lyy8����/�Z���Jc������J{�lF���?u�Tf��۾@������b�<@iEUgdy��rl���{����~�/^q	T�

��>���}�
(P�@ABP��/P���l� ��
���)�/`)EB|�h47ľ�+	]J�pX�F�r^�R����i�F��6��n�/�?&���}A����

�>�8%�B�'�S�+˾ ��ۖ��~R�+$=i�y��-,R�+��"���ec��t�A��}�H�e{@c5.9-=�VsF���o� �[��V�X6&�^>B��MM�\P�/�	qy���}U55��j��/H5� k_p��aL�:u0�b��=���Ϗؾ VƵ/H5���}�
��U�(P�@�
��!ڞ�a�5��y��IJ�Y��ʊ���oy�a�R��b�P}/��Ũ���z�O|��+|�z�(�9�-�-/�޽�gΨ�m��h�J�2fdf��;R���իW)p��v����k�X|��I��MI��T
� �y����͇����!�G���+�����H'��T��XA��_�elggg@H�<�Á�{�i��zz�5.+!��1�ӛ��1���cY���S�B���P�DA���TM�P�>�� �5�Ɓ��e(�JC���n̙7�@�K�H��KKgsH�H;����<!$�b0��VU�R��\8?�b�=��`��l�w�xP^Y���%Y��e^ $� `Ű��=�`?!�ԍ@;���U:�X�6��{�{F�8�L�3�@�|>�X�(��7C�9F��y.��f��9ǧD��1cf����9x��.%2�&�Xc ����!�J)X����l�����;bԗ��/a:-fs0�m �m֨Q���i����� �&���3rr��71��yn�N���}�nG?�����!��r7�Z��&NDiU��0!�jM������S&MR�����x�f��gee񙙙|����]��JxFJ����^{����;k�l�����G�.0���5{6���Ɨ����.K�qPJ�E�y�L�)�R�|������3w.?�����ʺ6w�<�������?F)��R��R쁨�^J��X�0�rU&�}�ᇻ~��_N���asGoo�o�����u&!�?PN�,>E(۝Ed�o%�>
�	!p��ŋ�������yx�^�?���:��a�|�C&&��0|�j�@��3eʔ�>��H��ܹ����B �1a���:��>G��o�<iR)Dz8w�ܙ���?�Q\\�TO�;}ڃ�h�:,�����[n��y�8y��k׮�2*��wW�n.��/?�p�,`e��
���j����333�(��(��(��SJ�3�<�������8��ZmjO�PJ�{ϟ�$--�$��=�)�b��R����l���t��6�@�
(P�-�^y��B0���s嵵+��a���"|!�
��0��`��H��J��W�TT0����?��9g��~��%�s%��+��˙;.4�����c	w��+����͟O_{�W��T0���6ϛ߾@�qkE��
���뮻�b�2�����8T���
�7^T^������w�<�|���#��๢�r�s�,����ۥ���I'wv&.�1'��=o}�F�84utЦ���>��0a�?0��,]
�ۥ�v�4� d9.pF8V�/D�;4�YԨPJA�Z�5�_S�!od��>��4v�S~�N*�g��D���;q�Nmn~���"�c��h�>}��`x@��q�MHT��+����:�������t=*x�^_QAZ���dt�O�8'�E��	@)�S�ב�5��紷7���Ɛ��:�}�m�Ľ[�,�9�Bvv6:��ZUz}7$j>�$7!A[�:�y��:������Z�f!�]�"��~���N�����Ѩ1�(�<%.C,&�eem���a5�8;w�~r|���ΡÇ��eY�L&�jo��N�
�E�V�΄1�Ȉ�Z����ĵ_��<	?��"<D)���G���y6���L\��p��_m�zz~�fÆ�m.���<�Ǐ�T�[z�7���j��A���_�~	����v��*���:�����g���h4�����")������!v�kӺu��e�^�X�K�5��.�6����5���ϨT(�������թ5\���n�8�iQ!ى��h��?����r���W%�C�������{&Bߎ��E]���Y	��ߵk���(�-�20p�S�����*@6g�l��3�8u���h��^
)�1Î��nJ�6�aʓ�	�5Ѣ�'�F#K�D}�B����K:�
6ۓ�}l2�,����Q��R��\��RY,��x�DА:�X���R�
(P�@A". w�-."��s�z=\v;\�h\!:�i�8������#��2Wm6lX�.�J�~��].����ѣI	!�q`����/}�A˲�?���������	!덇���'*��˗�B��3 d��c�B�N��!�7�R�X��e*x�*+Ϝ8W��E�
��/���@��ޞ��B��OP���_&V�^��+D��A�֛o�EgϛG�99Q��#��|O'Q���,]���L�0!�B4��hz�0��	B�8l��DQ�I�^�٥�O��7�kj��U~C�ژ7$�&��@�2V���x��d��~�PUE*��ڹsg�%<!B�T1��G�����������;�

�z���N�`~~>:��0z�:!>��6%adx�l�^����֚��
��)�ݲeI ��
����٘��ެ5��!���'�*cR�(����tt4ffd��vc����jش�k͚���g�X0���Ng6�P�����1E��B�h�N�mV{{��d˲8t��?��xG��M;w�~��8��谦eemPd1�b�#�n�x4��9J�O@�� 2 a��h��KV֛z�9���p���8��_�~���	�����F���#)R�6�ԏ_��<l.��fÆ�zz~�l���A4d�e?ܴn��v��!�--����-�--��CN�����8��H�;�1l�ND2q6lݸq�5�mP��:n\] ����ʨT�f��o��J�$-�q\�N�D�	v����?4tI{�M�J������-��;�Q���|�cGKfii���ҕ+m����2������
D� �1^}�3a<����y��D�f�Dn�oO@�p7�'�*���	�i1�(P�@�
DA�v�Å�O����p�\�`b��A!P��a���{7�F�yA�@H����Q=)��(~W�:�:`�pt"�a�I�T�c�/������ \.W�6C�R�h4�b�l6[J�edd�d2A�qѽiŚ������m�R�������t~\~�`��{nw 4`J��,�㠦�X�Q�
4L�F�,��3)%�u�$��IPk�p>�M5/�P	$J�$������N,��-�o��)�	�}N@s�T>"j�Ԉ�=	���|:񸿚�n�s_�~=LJ�z0��gB��F�Ip�)����h4�+�%HU>���h������իطwo,�1n�x��o�II������������	̈́�55	�p�櫪�����_`&$j5($��xH�LhWMe���!�3!��
�z&����[�gB��|^/��O��3��@MI>-����ɡ�U�+^!��IS��a�B)���l��e��r�4�6d��[<O��Q�@�
(P�@��d`�?��_���ij1ᕴoZ�e��my�;߱�������|RY�վ=m��i�&���8�z�_���j�m�Y�23�z��|@
��xX�*����m�B��?*�'��ӠR����n-).Dz!<`�kE;��*-��?u*i�ON�����{����1�t���!ШT(,.^�p:���~'��p>���J����~Zmu581 f4-�J��Z��J�8�N8�N|{�2�?.x�?�a,A�����Ϛe���˲�����"��Y@�OD_t�JB��a�Ν��|���7!�{�Ć�ی�.pׁ�c]�����8<KZj���v�g�P���pf_(+/��=z|zz:t:��JhH<�D�D�_�J�)���J���G���?�:�3���dOOmeU����^�f�����A��z<

��������lp:�p�\���e��|�XW����!���!��
�����9��ܜa�Z,��G����<������O�s�.��#�|��vhh�H�4��j���^�F�F�R|����?Nf��G���ਫ�?J�eee�`0@%0�׋s���ȑ#r����������f|vv6c6����q��Yߡ���@<<�
�4�7������X��.??ߜ���Z
�χS��8}��R�[���_-��������u�F��F���>{���ږ
a�׽��3f́	&�---|�̙��& Z��(�k(�,����3�l+))qN�6�o,qPJ倫QJ�x������kh��++��(���.J)���dL^��-)Ċ����Rz����h<���NxCB)�>�Խfݺ��%-�X	C���yJ��<fL���|#������4~��M�~��I�C��Χ�^�bEJir��z��X
(P�@�
(P ���t�29���kE�ƈ�J�JK�w�c�����g����n�j�
�,Z�L�>}%�j���4 `}>x�^4����ŋ������yC�k���.�f���{�����m$0@�%@Vi�@)�N���@4X�e�x�s�g�D��Y�C�ڇ4Q�{aiP
�)���b�&�Z[���*���n�7o�^��3�~�p�xY��vgMe%3&'f�	f�	�a�AXE&Ek�Z��G�b����Rg�o5&Ӌ�S����q�@��^�r�7�����&x<�����,�����[o���D4�(�p���9
��c�W_���nYu�/&54�gY��P�҆�w���z144�+W�|��ӣ�$8g��y��/N��+�	�\��<�J��T�7�q\.���[aҤI[w��9���.���,���e��,<�N'G)=��������U��`�)�_|�)+++������fÙ3g�o۾}����~_5B���m���mYq�����p��ի˲�<��﹞~�Z�9�������:�.Hd��n��|~�:�j<�BB^Ci������m6\�v
{{{��.�l�����"�K�{[�n�������?��+����B�F����i�����?��6�#`E��C�R�)�Z]ͷ̜ɷ���&L�njs��C�R�kHp��0����ٯ��wQ1Vi,�WV�u

|Aa!��ҥݢ&}�ʄ%��ck֭�I)uSJ��h!}v6�3Ϟ��9 
�C$����~�SJ��RژL9�1;�r<��9*	��(�)��Q�����dҊ���On�)P�@�
(P�@���/P��/P��/��/P�(|ABP��/P�
(P�@�
(�/���H�G��#R�)��D�?"����4M�B��H�
(P�@���"<Ԯ�\!HFSl���vec}=�6���r�(���h0����A��>�`D<WZ]�����Y0>�>�`�;�́��E���ϕTV��./g�\�0и-��N�ǢQ��g��xU?o�|��o���T���y޼�甈��9kE��
���뮻�b�2�!!�7��
���3�#x���|eyI	s�%xx���58�D��7�wΚE_{��au��;;�����%0����ͣo��ֈ������!@�G0a��`�Y�f�K-�d�A�r|�P�!�����*�į�h<��F
B��.-}*�i�ا�>Z�TdY��8�}'N�ߩ��UUT�?Mӧ�P�㺒2��CT��+����:�������t��z�^_QAZ���dt�O�?�/d!b>���5��紷7���Ɛ��:�}�m�Ľ[�,�9�Bvv6:��ZUz}7��@��a��zb(י�;f���Y,8�n_ך5�����7/w��������F�Ѹ
@�)�;D�!�	�Ҳ�����p���w?`SD!��C��#˲0�L���^	�n�V���6�ג����'��:��I���,"�CT�/�(��<��zeׂ��5�����ɚ
��\��?�Rm4n�_5@��w�VW����[�~�8���햵Ɖ*��;��p:�����!�ӣ�h���R
`��Ⱥ֖�r���M�����PzCI��T�qaD(����5���ϨT(�������թ5\���n�8�iQ!ى(`�"��wtw�\���UI�$k�z�
]���=�oG��.Fq�G���5�RTT�_8s�ԩY�S�	�U�'_�����g�ԩ���&U_��0����Mi������L@�`��D��hd)����cY�F N��D�S�`cوߣ���D��F0�Ѹ�D!.�L��8�!��".��	��X��z(P�@�
d,k��IDAT����Nc{�9wߍ�.�.�4m4.��V�4�{X�s�0�tD��^�͆
��%\��������SG�&%D�ǁ�x�$v�K|�²,�?d� �<}�x�BD@����D��>�b��A>x�}��<}�XBBD��$�A�
�+�-{�
�{�=�
��3'N�"���A��+^!x��w�ҕ�==1��`G��B,_�2�z�j@\!BM��(�OPJ�o�EgϛG�99Q��#�B�r25�?��ҥ���	�+D��u�]��<A@ǁ
׶� �:M���"7�.-}
���_S1�!�!Zm��($PMi�U�oil�Se2a��J������ܹ3��!T*����1��r:]3��}���|gQA�^�/��p:�����ֶ����!�]� �1JX� [��ww���fgg��t
{�lYH<�}�mCv�ktv6洷7kM�nHN�G�	�
@��L��h�6���13#N��7o^�?$Evu�Y���v�,f����������G�O��B�W�Z��m���^i2���,>��p8ޑ�g��ݻ�8��;:�iYY�YL����xA���4��9J�O@����d���h��KV֛zís���pL���ׯ_���v�A@muu��wȑ)P�[�Ǐ��y6�KX�a��}==?�k6[r�@ih��pӺu���.�������V�����j49��{�t�k ��t�K�-mH°a�ƍ���l�j��q��	e��VF��5��sW�,P�'iA��b.p�� 
O�kGw����K��lTj5.������n���T��H~?��W;v�d��v~�t��A[o�<��DE ޺";�)���A�c��dg�x)7s��'�*���	�ܖ�$� �H�nOU��� �(<�
(P��������y��IEND�B`�components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/icons.png000060400000024322152453623450027562 0ustar00�PNG


IHDR����1 IDATx��}ytՙ���v�[�f!�v�E�l$���%���7�yx�yC��a�0�3�/��$�8q�0s�3��!������Wlc�x�%���{wujUuWu�!���9u���W߽U�}�~����Gl@��2��P�Z��&x<��_��זF"LMM��#����a׮]A�8%��K%`4ﭭ���ҥK��^{-�r�ʠ�j�w�…�y��<�Y*ϥ�  �@1���˗��z�>�/��i$80�Zc�cK8��FGG����/�����8A��F�ӹ�j�b��� "<��3hkkۜ�!� 
�;;;MNN�H�.Z:::z#���cZ��l6o����0m"��D4���uppp������} 5!��1�������;A@cc#�!c��\"���������6G���S'�F`0���
�q0�ͨ��ƅp�-��'��49�cǎ�`0��r!�������ٵk�r�-��ej "K2��c�Uy��o��x9a��t�|�Na��Ny!կQ��_��׌V�� `||.\�m�)((�~{"z���W�XA�/������(LDM�r�b�Z�؏A��˗����~��1v<'�1������د�ig�UUU��0JJJN2�&��d"�TWW�z����[f����;���)HDZ�2qp� ��b��1����Ap�7g����x@xΜ9���G6�-
�V�T�l0>k�,c^^��8��0�����25�W�����EI�e�DdV)a��U)��q]c9��F��A�P�B�{aa�/ZZZ�qb���0��(FGGQVVfݻwo@�֥����s-_���9���ё���o��ؒ%K������{{{��mmm~�@b`���na�%�����̙"–-[x���c���1��s��ye�>رclj5k�4�l6���`xx���񱱱?x�f�������r����F#�</O�	�D�(��(OMMa�ڵ�޽{���|p�^xAg��>�:�D����+V�����c�޽�zjz�}�<��f�EcW�� �~?fϞ���i477��C(B<GQQ���0::��{�ܨI��͛7s�����199���B�������ٳ�1��T�<"$�g�h�#"/�OD�Q�fE:t(�&2���x	
�-K�p�o�ֶ�l�������r�����d6�Odey׮]����[m����JKK�p�B�ŋǎ=�[�@R"Q'=s�m�5�\.'\�z��֭[?�c�݌0�>��c��B�@ ��x�g�*+8@��~���c�|D���ܳg��/ثED™��V*--����|�]EEE�---����m��Lg��F��
]�|y�'��3g����b� ��4��D�AD���\YZ'
ѳ�2�ek�H >f�8�3��Y ��Y���T�I��?��>&"�H�M7�T�F �ba��K_c 8�Z0�b���K�IdR,6��8��s��m
�2)�C�����qA��K��Z`�	3R,�1�1/A�>#Ţ�L��h4n�J GŢC�i���x��$��#��F�$�II_LY��&Ɨ.]��~yyJ��̙�Gy�����4>�^��XL��z�(�8�"�HZ! ��D J3�ꚫ�h��N��j�|���8�t��~E��h�c��񸂊Z'^v��-/WTTT�Fa6��2��~?���|	@��c��l��㨯�?�ZG�͛7?[SS���%��C��n�����&��3DD+��Ռ��>��]]]�H$R�q�-���������+=�Zӄ�X~GD�":(��+B9�tm�*�.PD�\�ւ>W���j���-C�ZK�2���M7�D�f�"$ө��%��H7�x#!��q0-P6|�;�Y^PP�N�>��7.��b~ooo��y���8x�^��׿�`EEEM� `bb���p�\p������8��8���z9]s��\�z>����pP�@�>�远?�w��ELMM����'"K����[�n�:��� �r�-�����葝;w^Y�h��|�+T^^�������.\H�����=��D�jll�?>=����?љ


�g�y�D�%�����jjj�ID����V�5�կ~�u�ѹ
�њ��+D���~����EDo(:'���v��D����`4]ED��.�[�ly����ס�:��HdUN�kkkI
N�s2'"N��Rӈ���.�L��D�Vk9�ڐSa2�4�D2c�4.��0�,�j��<��j�5��q�D��Q����$ ��31q:!1�%���o�q������gj�O�'&�iy [3�	d{s@�/�P��t��9��.My��t����5
,��6{O���`�n��#᧘�*��2R^^>,%�}�mmm�.[��i6�߀l�K^^��+V�����$p�=������ҥK��f�o�2f����˗�{�^��ʫ��644<���Z�D�}�����񉾾����l8z���Ǐ?��'-FA~3o޼ކ����0��(jjj���^{�w����e�M�6�1�y�mܸ����X�������?���{��ʞ�*���v�ݿ��S�r$	y<�
��C��j�Xk����9?_Ap8�v�@���8�
������eǡC�&�;6e������C��w7Wix�j��joonݺ�"*""'=s��7�{zz�|����m��꧄w�G}t+�-%<��ѱ���#�KKKcH� '@D��q��u���}�����򻻻�k�Z�����'��p�رc����VUU�ED�d7����o{>��]��wDdS �^J�&�$����H��ѳD4"6�j��Cǧ]/�zA��t����!��J��fH�P�{��w�]wՕ��.]��W_}��H|��ؑJ�ĉ'����澾>?D�&�o��s�N�ɓ'�kll4*X�Z�DD����������uIIIN�u@i�J��T�LO��$�FS�m��AJ��oR����&�X�������p5.��IFj��������d�5�I��F���*��>�����*eU� �Ps�ȑ�v�C^^^��,���h�dW�����&�]�g�μ���֩Z%��.�:t�BF�zA���Q��Pi$�&�PL�/
�lhhH�;�D"�������c8~�8�y�_�jjj�C,� �������緿��wFFF|�Pb���ף���n@�UUUF�ߏP(�p8�׋���˖-{i���/0�v{��d~ @EE�9I � �&�(�|><��c�b������흚�J��D"I��	�'�@$�����{�
E&&&�G"�d9I&r�m����׷�1�����1�ɒ%�}>_�SIfr@B�b1D�Q\�z5��s�m`����h4>����p��˗�"���^�@j~~�^��6ʍN�VRR�M��%�ɤ�@��
��z��b�<�XQQ�c�Ƙ��g���	H��b�,X�����luii��1��ۇ������~���Ah���`0�Ōeee�cUyyyK��ڜCb������w�u����(�@(�*744l7��Hp8���LvT^^Μ9�����łx<��{�w;��g�|``�}lll��d2J�"�,�1H�p8q��{w�ܹ����Q��o�(H�;(�� �L	/:>'���\�&і;y��;w�$��Ґɍ���J��a���:���g"`ikk�/���`� 0�L̈́�ʖ�� �~���㽽��Pٞ�J ??�r����zzzB�H�|yy9��\tvuu��B!\�zu��ɓ?U�h���!�3�<�p8p�ʕ����S,8�r�N^�z5r�
78(,ک�}gmm�7�\��+V���G�� ����6����!�Vk:�U]]����O�>�؂�bŊ���֒��&����h4J�`���<"�^0�x<N���J�3�'�x�,Kڶ��Y�4F���`�X`�ۑ�����&$ߚ'�|��V+8��|���x~�O=�ԧ��%�<��cd6����D�P(�5k�|�|���%�ј�iA��?��u��Il�lK����hDaa!��q6D�Q\�r�H$�f���3f��Bqn5�H�<��C3z��?���U6�L9q�����s֡�S�'i���*b�r55%�es��D�'cWcO"!�4��)Y$���*�	��/1�2���xں/���������+Wj�ɓ�iQPP ���GD���{*u���q̜��f�j<�x}}=!�6�l5x?1��8f�ɴa``�9o�<������j�"I�d2I��JKK���sw~~�	w�Ɵ��b1�B!tvv�,�FI�1����3g�XǾ�6�<Ap��	���� ���q&''122�����nG�Ϸ��6��TWWH���G(Azw��rqq1b�X��DA �HIr	]��>�rա��7>Qm��8�)_ij�w@QQҿoU�_��ԣ�Dc�XIDc�%�*@D<%�*�J��vgo����B�O&�l^�"��6�M��u1N�"���@� ��pD�Y��wd�NJ���H,L��\��3m/���H �4b�2ƮX1�>�8���rzR.I䧹Ԧq ��Z"
�%��3Gmi"�T�����=Y	���f��/..��_B������c�	�_i0IDeH���^knn>�&���ׯ_o�ɋ4�@���PCD[e�[� ���v? ��I�n��EYd�yHz!.�{��6�Ψ#�2�q�K��/�ک��� ���ڜ�@B�=���瓳�}��=M���=0�Lope�;"
ũ0��7t��|��r}���ZU$�
��P�}`�Z'Sˈ�דd�/H�8�t��M����|AUw�d� O=�S��;F>Qm�јu�"u��M�W�&�./&��n�_�NxWEfjt���咚���+�E��g$�@D�ew�/?�@ˆ��h�,�����> �ccc����:a�> "�(�S�a�>�i�Es���m)s�YS��w��k�A6y}@!��,B`�	;�����4��_�?��.^3@��͙3n�<�gt�ccc8x���?c̤ �Oڄ��x<���p��e�>}z����'n¬Y�PTT��+J:�U� x5�v{NO��&��{�f��,�D΁����s��F�r	q�L�S	�p����8n�0���Y_��W����ϟǻ�*G�jǵg��5g�
H�f��̟?<�k�'��
�0::��/NY�J����Pb]����ۂ,{)���T4�%����lll4�
V"B4���0crNԞ�h��΢�~�a�n�-D���_,�w:�E����!�EB���z�I�����'3$pz&�u�Α�0Os��q� �Ł�S�4R�F��X��H5Y/���y���NPP��`[�$^���N"�OM�i��Fq��e0�Bi�Ȩgm���l���^��ٌ�YuEF��y��r��R*�I��9�T3�
�&������l6�m�9Ҷ#ec9�jM����URk�j'�\.�x<�:B�#i����t�����k�[�I���Sav���v����{1퓑��H����^/���pcc#͛7�l6[��bd_c{{;}��G�����s������7�x#�â�D�~�zLNN���&:~�8K~����3g����AD��b�I��h4������GrE8I #�d2A�^�4HV�������D�ڔ��<��<�q���v�HQ���
R�%Ɏ$ٍ�V�M������C,c�h�`~�~����d�F�u� 8��X�~���s����jjj�eee�W�Z��g��D��� ??_)���>"��������w��AV�AD/�E����e�\
����s�f��t|�����������?+�"G���z�f���͛G���d6��HxD�bz��7)A%9_PP@��7�q���8���p��1\�xDt��p�jkkq��!���@"���O��8��ը��c�`�gϞ ������+ ��ʢ�	"�PN�%*EoK�$��&
� ���bCܤE�KmB0D4Mr�����r�F`||^�w�`0|��V���j�"??�D�`0�0����ۈ肨�ѕU�Vm-++�^SS���%��se���J�$��>���Q?l!"��7.�}�}�U΋��A˙��u�t9�Cǧ��
��\�]�D�y�>��B��_]]}��>�yB��������H�������"�$��ߘ��=�uwwSww�b��l6�	�9I��ruWUUQ(:@14C�Ё��*"�n�	���r�1����o6���o).��<���b?c,n�X�'9�ַ���)"Z����������>�`�X'"��իWopX�ޕ+WnY�r�[)O���ի�џ�	�D�L��j��&�S_� �����C��/,>Gz�d2��׮��ˉ�����>�ϣ;��������1����͌�;�fs��ŋ�f��a��GK/�^�z�֭[\�|�Ѧ��s���GD��SO���#��]]];�0PO8WYY9r�СUrZz�A"2�+�/�S[[Ks�Ν$�]D�<)MF,��LJ3M���#���vr�\�ZY�.̚5k������I��L>�LX�v����g�~�;���r�v��Օ�TBD;�6�}���TC���9G2�CʵMV����`z%$"zKC��%+�gٲe�l�2���m�:����������JF.���/VVV���<��o��J@m��b�
�a�Ƚ{?+|6���������Q�5B�d�d������+�2ʅ�M�6�h0�Û6m�">F:�h	�\�

���SO��~.:����Q�i�\���O���~�NLvD^^^R��<�Kk.���r���cԡ�@��c�3��b��%�MD����*�w��~v��AD�Qf��ڒaj���ۭb:���8�ք��$�+�N.�Q*�<
uF�Q�m�ە;��#c���1�\x��c���s������=��2��HD��e�?:�`P�|� dR��D��˫俳	�T�{��!�9&䩌1���P�r��H�\�L�Ґ��<�N���L��̟�cT��3}�i2��1M���1��|=.���UUU4w�\��� ��@~�R����:::h�ܹ$�����Ayy9c��lo����i�("��v�mo:�A"cgϞM��шӧO�h4B�A��_�ޞ1�ׂ ���3	����o����4_���V����%��X'����-D4DD+P?����멿��-��D4TXX�E޾g�o����qL˾d���b����7�D4�S���nY��bڏ��;E��&���yZ^x�…���K&���a�…!�ձX,����h�"jjj"��+QKSS-Z�H�d�X'����G�@����x�"�y�`+c��Dw�u�…����ԩS�X,عsgℨ`0���r�<�&��Re�?��@����x�x�"�� x��ѣGc�R;�16�`kk+AHƈ�`xx8U��M�HoV"�z:�0�t:��t�!�Br�"�����������ߏ���:��)fc��x�ĉ|CCCscc����҆QA`�Z�'NXO�<�^cc��1�"���?C��!1o14�S�~�r� ��Z_��&��T�M�e��"?�	�E���[���>���Pn&�~km�K� �&�Y�[�(SY���v -���DQ��C�1?�Dw�ќ�������@v(�fu�IDATx�ȑ#'�������tH��p�J[{_���˱.�:td�9���gG�^�	�:$�MА�LT�
�&�+49�UWh�UW$	h
[��$�@��tE��(�'3D]��+� ��%V�����_���.���.ц�+t|Z�Z�$�����o���w�]wՕ��.]��W_}��H-����z�������HQx;w���f�9g� ;R`��	%%%�zA����s�5����I��Ȑo�ەM��n����v�&�x�߲3�U�E��4���2VH�Wkr6��I�Z�➞���\gm�󅚚��:���V�/�����Vk�z!U�P�l�됤@I� �!Ii�~����r��M���H��3�i,�TW��9���>e�b\+R�*wLE��4u��K2��u���-���x���&}0���A�={�;n�?��OK<O}0Daa�����Ccc�厎y��n$NA�zzz����:GFF���7�u�n��IUc��нd�g8ƕ+W�X��ͫBm�z��bA8��n?���*�ñH�ֹt��}j�2����[�d	��������,*,,�B�x�?`�L	|��cbbuuu��2���5�<EP����jr��t�ȑ�b���r��q��^w�����Ei�Ł��e�JLsѶ���!��mnn�_�zu�4bW������cgl���q�D[[�q�oxx�y����579����6X���o�ۭ���w5r��KEEE����}�N�}Ị���[�t鵫A:f�U�,�3Wv:��Zc�����VLR"j[�Z��Q����n�XJKK5	P����x�-�$�OvT��o�p�JY�Fuu5@ee%����(�:̞=[�	�/�������n��N��ឞ2��>[
^�i�}���wZ,�C^��_`bb�W��Ν��R��QEEE$��/�ϟ�;1kcggg��e'*�r~���#�߻5�MCe�F��,�R.KF�r�n�u���㏆L:`U�z	�.��p:��Y�h�z"�!���d��5Dt�n�k�S)D���'�����t��@�X�>�@�����uD��+��#
��7��
===�t:��~_?q�:s�o�)l�ܹs������x���X,�:;;�p��N�:��:;;c6�Y��?~�㸿�uG�:A��Y�e��R��;�I�	:��`��+�����fO��P(A�=[R�Ȕ��<���	���#��`6�a2��
%Bf��1�`�X0k�,�����(&����rJ���$��1��zn2�(����f��j߻��Ԝx��4�Cr)H�M&SNiǁ������I���s��544p���K�D$,:Y����?��N�$��y�����k'�t��f�R"`l��."�]�C��/]k�^˷�i!�#����v���_�2�q�ԩ�	�0�^����mnnF4�t��H�p�9��$�Wx����n��h�x�ᣏ>B(���Ň~x��^����E�V���w�l6� �S���(l6\.***P]]]499�
����$�y�heee�������<�#B�ݗ.]r(+,,t`���>��;�tQ��{ߪ���uttPCC�v��Dt��Þ���=�%}�&��W

�X,礽kb����$��~�l��$��T��hܮ���O<�A��X�ED�d�0#:t|�x		qmu��H�4dh�����{�q��ۑڭ��u:�"�|��o�o4����í/^�2��L������Z�v;�f3jkk�:�`0`llo������_�f��������f�%'b�`09��---\YYY��͛����n����7ߌ��1����.���L�<ߝ��A099����#�Ν�1ƒ�YSSc;���u�֡���@����v����񎎎����k�-���o��O~�UT"wQrS��b!��rnhhh%�|�۟x�
D���0�ۉ�=��4��'�W�ȥYY��t���]/�С�Sڑ~�v�x�v�������Vݎ�ۑt�A�S��OU�SM-����B�S�Tu?�LY��~�:����81ە(�IEND�B`�com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/tabletools/index.html000060400000000054152453623450032023 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/tabletools/dialogs/tableCell.js000060400000014643152453623450033706 0ustar00components/com_acymailingCKEDITOR.dialog.add("cellProperties",function(g){function d(a){return function(b){for(var c=a(b[0]),d=1;d<b.length;d++)if(a(b[d])!==c){c=null;break}"undefined"!=typeof c&&(this.setValue(c),CKEDITOR.env.gecko&&("select"==this.type&&!c)&&(this.getInputElement().$.selectedIndex=-1))}}function j(a){if(a=l.exec(a.getStyle("width")||a.getAttribute("width")))return a[2]}var h=g.lang.table,c=h.cell,e=g.lang.common,i=CKEDITOR.dialog.validate,l=/^(\d+(?:\.\d+)?)(px|%)$/,f={type:"html",html:"&nbsp;"},m="rtl"==
g.lang.dir,k=g.plugins.colordialog;return{title:c.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?450:410,minHeight:CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?230:220,contents:[{id:"info",label:c.title,accessKey:"I",elements:[{type:"hbox",widths:["40%","5%","40%"],children:[{type:"vbox",padding:0,children:[{type:"hbox",widths:["70%","30%"],children:[{type:"text",id:"width",width:"100px",label:e.width,validate:i.number(c.invalidWidth),onLoad:function(){var a=this.getDialog().getContentElement("info",
"widthType").getElement(),b=this.getInputElement(),c=b.getAttribute("aria-labelledby");b.setAttribute("aria-labelledby",[c,a.$.id].join(" "))},setup:d(function(a){var b=parseInt(a.getAttribute("width"),10),a=parseInt(a.getStyle("width"),10);return!isNaN(a)?a:!isNaN(b)?b:""}),commit:function(a){var b=parseInt(this.getValue(),10),c=this.getDialog().getValueOf("info","widthType")||j(a);isNaN(b)?a.removeStyle("width"):a.setStyle("width",b+c);a.removeAttribute("width")},"default":""},{type:"select",id:"widthType",
label:g.lang.table.widthUnit,labelStyle:"visibility:hidden","default":"px",items:[[h.widthPx,"px"],[h.widthPc,"%"]],setup:d(j)}]},{type:"hbox",widths:["70%","30%"],children:[{type:"text",id:"height",label:e.height,width:"100px","default":"",validate:i.number(c.invalidHeight),onLoad:function(){var a=this.getDialog().getContentElement("info","htmlHeightType").getElement(),b=this.getInputElement(),c=b.getAttribute("aria-labelledby");b.setAttribute("aria-labelledby",[c,a.$.id].join(" "))},setup:d(function(a){var b=
parseInt(a.getAttribute("height"),10),a=parseInt(a.getStyle("height"),10);return!isNaN(a)?a:!isNaN(b)?b:""}),commit:function(a){var b=parseInt(this.getValue(),10);isNaN(b)?a.removeStyle("height"):a.setStyle("height",CKEDITOR.tools.cssLength(b));a.removeAttribute("height")}},{id:"htmlHeightType",type:"html",html:"<br />"+h.widthPx}]},f,{type:"select",id:"wordWrap",label:c.wordWrap,"default":"yes",items:[[c.yes,"yes"],[c.no,"no"]],setup:d(function(a){var b=a.getAttribute("noWrap");if("nowrap"==a.getStyle("white-space")||
b)return"no"}),commit:function(a){"no"==this.getValue()?a.setStyle("white-space","nowrap"):a.removeStyle("white-space");a.removeAttribute("noWrap")}},f,{type:"select",id:"hAlign",label:c.hAlign,"default":"",items:[[e.notSet,""],[e.alignLeft,"left"],[e.alignCenter,"center"],[e.alignRight,"right"],[e.alignJustify,"justify"]],setup:d(function(a){var b=a.getAttribute("align");return a.getStyle("text-align")||b||""}),commit:function(a){var b=this.getValue();b?a.setStyle("text-align",b):a.removeStyle("text-align");
a.removeAttribute("align")}},{type:"select",id:"vAlign",label:c.vAlign,"default":"",items:[[e.notSet,""],[e.alignTop,"top"],[e.alignMiddle,"middle"],[e.alignBottom,"bottom"],[c.alignBaseline,"baseline"]],setup:d(function(a){var b=a.getAttribute("vAlign"),a=a.getStyle("vertical-align");switch(a){case "top":case "middle":case "bottom":case "baseline":break;default:a=""}return a||b||""}),commit:function(a){var b=this.getValue();b?a.setStyle("vertical-align",b):a.removeStyle("vertical-align");a.removeAttribute("vAlign")}}]},
f,{type:"vbox",padding:0,children:[{type:"select",id:"cellType",label:c.cellType,"default":"td",items:[[c.data,"td"],[c.header,"th"]],setup:d(function(a){return a.getName()}),commit:function(a){a.renameNode(this.getValue())}},f,{type:"text",id:"rowSpan",label:c.rowSpan,"default":"",validate:i.integer(c.invalidRowSpan),setup:d(function(a){if((a=parseInt(a.getAttribute("rowSpan"),10))&&1!=a)return a}),commit:function(a){var b=parseInt(this.getValue(),10);b&&1!=b?a.setAttribute("rowSpan",this.getValue()):
a.removeAttribute("rowSpan")}},{type:"text",id:"colSpan",label:c.colSpan,"default":"",validate:i.integer(c.invalidColSpan),setup:d(function(a){if((a=parseInt(a.getAttribute("colSpan"),10))&&1!=a)return a}),commit:function(a){var b=parseInt(this.getValue(),10);b&&1!=b?a.setAttribute("colSpan",this.getValue()):a.removeAttribute("colSpan")}},f,{type:"hbox",padding:0,widths:["60%","40%"],children:[{type:"text",id:"bgColor",label:c.bgColor,"default":"",setup:d(function(a){var b=a.getAttribute("bgColor");
return a.getStyle("background-color")||b}),commit:function(a){this.getValue()?a.setStyle("background-color",this.getValue()):a.removeStyle("background-color");a.removeAttribute("bgColor")}},k?{type:"button",id:"bgColorChoose","class":"colorChooser",label:c.chooseColor,onLoad:function(){this.getElement().getParent().setStyle("vertical-align","bottom")},onClick:function(){g.getColorFromDialog(function(a){a&&this.getDialog().getContentElement("info","bgColor").setValue(a);this.focus()},this)}}:f]},f,
{type:"hbox",padding:0,widths:["60%","40%"],children:[{type:"text",id:"borderColor",label:c.borderColor,"default":"",setup:d(function(a){var b=a.getAttribute("borderColor");return a.getStyle("border-color")||b}),commit:function(a){this.getValue()?a.setStyle("border-color",this.getValue()):a.removeStyle("border-color");a.removeAttribute("borderColor")}},k?{type:"button",id:"borderColorChoose","class":"colorChooser",label:c.chooseColor,style:(m?"margin-right":"margin-left")+": 10px",onLoad:function(){this.getElement().getParent().setStyle("vertical-align",
"bottom")},onClick:function(){g.getColorFromDialog(function(a){a&&this.getDialog().getContentElement("info","borderColor").setValue(a);this.focus()},this)}}:f]}]}]}]}],onShow:function(){this.cells=CKEDITOR.plugins.tabletools.getSelectedCells(this._.editor.getSelection());this.setupContent(this.cells)},onOk:function(){for(var a=this._.editor.getSelection(),b=a.createBookmarks(),c=this.cells,d=0;d<c.length;d++)this.commitContent(c[d]);this._.editor.forceNextSelectionCheck();a.selectBookmarks(b);this._.editor.selectionChange()},
onLoad:function(){var a={};this.foreach(function(b){b.setup&&b.commit&&(b.setup=CKEDITOR.tools.override(b.setup,function(c){return function(){c.apply(this,arguments);a[b.id]=b.getValue()}}),b.commit=CKEDITOR.tools.override(b.commit,function(c){return function(){a[b.id]!==b.getValue()&&c.apply(this,arguments)}}))})}}});
extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/tabletools/dialogs/index.html000060400000000054152453623450033445 0ustar00components/com_acymailing<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/colordialog/index.html000060400000000054152453623450032151 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/colordialog/dialogs/colordialog000060400000010636152453623450034026 0ustar00components/com_acymailing/*
 Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.md or http://ckeditor.com/license
*/
CKEDITOR.dialog.add("colordialog",function(t){function n(){f.getById(o).removeStyle("background-color");p.getContentElement("picker","selectedColor").setValue("");j&&j.removeAttribute("aria-selected");j=null}function u(a){var a=a.data.getTarget(),b;if("td"==a.getName()&&(b=a.getChild(0).getHtml()))j=a,j.setAttribute("aria-selected",!0),p.getContentElement("picker","selectedColor").setValue(b)}function y(a){for(var a=a.replace(/^#/,""),b=0,c=[];2>=b;b++)c[b]=parseInt(a.substr(2*b,2),16);return"#"+
(165<=0.2126*c[0]+0.7152*c[1]+0.0722*c[2]?"000":"fff")}function v(a){!a.name&&(a=new CKEDITOR.event(a));var b=!/mouse/.test(a.name),c=a.data.getTarget(),e;if("td"==c.getName()&&(e=c.getChild(0).getHtml()))q(a),b?g=c:w=c,b&&(c.setStyle("border-color",y(e)),c.setStyle("border-style","dotted")),f.getById(k).setStyle("background-color",e),f.getById(l).setHtml(e)}function q(a){if(a=!/mouse/.test(a.name)&&g){var b=a.getChild(0).getHtml();a.setStyle("border-color",b);a.setStyle("border-style","solid")}!g&&
!w&&(f.getById(k).removeStyle("background-color"),f.getById(l).setHtml("&nbsp;"))}function z(a){var b=a.data,c=b.getTarget(),e=b.getKeystroke(),d="rtl"==t.lang.dir;switch(e){case 38:if(a=c.getParent().getPrevious())a=a.getChild([c.getIndex()]),a.focus();b.preventDefault();break;case 40:if(a=c.getParent().getNext())(a=a.getChild([c.getIndex()]))&&1==a.type&&a.focus();b.preventDefault();break;case 32:case 13:u(a);b.preventDefault();break;case d?37:39:if(a=c.getNext())1==a.type&&(a.focus(),b.preventDefault(!0));
else if(a=c.getParent().getNext())if((a=a.getChild([0]))&&1==a.type)a.focus(),b.preventDefault(!0);break;case d?39:37:if(a=c.getPrevious())a.focus(),b.preventDefault(!0);else if(a=c.getParent().getPrevious())a=a.getLast(),a.focus(),b.preventDefault(!0)}}var r=CKEDITOR.dom.element,f=CKEDITOR.document,h=t.lang.colordialog,p,x={type:"html",html:"&nbsp;"},j,g,w,m=function(a){return CKEDITOR.tools.getNextId()+"_"+a},k=m("hicolor"),l=m("hicolortext"),o=m("selhicolor"),i;(function(){function a(a,d){for(var s=
a;s<a+3;s++){var e=new r(i.$.insertRow(-1));e.setAttribute("role","row");for(var f=d;f<d+3;f++)for(var g=0;6>g;g++)b(e.$,"#"+c[f]+c[g]+c[s])}}function b(a,c){var b=new r(a.insertCell(-1));b.setAttribute("class","ColorCell");b.setAttribute("tabIndex",-1);b.setAttribute("role","gridcell");b.on("keydown",z);b.on("click",u);b.on("focus",v);b.on("blur",q);b.setStyle("background-color",c);b.setStyle("border","1px solid "+c);b.setStyle("width","14px");b.setStyle("height","14px");var d=m("color_table_cell");
b.setAttribute("aria-labelledby",d);b.append(CKEDITOR.dom.element.createFromHtml('<span id="'+d+'" class="cke_voice_label">'+c+"</span>",CKEDITOR.document))}i=CKEDITOR.dom.element.createFromHtml('<table tabIndex="-1" aria-label="'+h.options+'" role="grid" style="border-collapse:separate;" cellspacing="0"><caption class="cke_voice_label">'+h.options+'</caption><tbody role="presentation"></tbody></table>');i.on("mouseover",v);i.on("mouseout",q);var c="00 33 66 99 cc ff".split(" ");a(0,0);a(3,0);a(0,
3);a(3,3);var e=new r(i.$.insertRow(-1));e.setAttribute("role","row");for(var d=0;6>d;d++)b(e.$,"#"+c[d]+c[d]+c[d]);for(d=0;12>d;d++)b(e.$,"#000000")})();return{title:h.title,minWidth:360,minHeight:220,onLoad:function(){p=this},onHide:function(){n();var a=g.getChild(0).getHtml();g.setStyle("border-color",a);g.setStyle("border-style","solid");f.getById(k).removeStyle("background-color");f.getById(l).setHtml("&nbsp;");g=null},contents:[{id:"picker",label:h.title,accessKey:"I",elements:[{type:"hbox",
padding:0,widths:["70%","10%","30%"],children:[{type:"html",html:"<div></div>",onLoad:function(){CKEDITOR.document.getById(this.domId).append(i)},focus:function(){(g||this.getElement().getElementsByTag("td").getItem(0)).focus()}},x,{type:"vbox",padding:0,widths:["70%","5%","25%"],children:[{type:"html",html:"<span>"+h.highlight+'</span><div id="'+k+'" style="border: 1px solid; height: 74px; width: 74px;"></div><div id="'+l+'">&nbsp;</div><span>'+h.selected+'</span><div id="'+o+'" style="border: 1px solid; height: 20px; width: 74px;"></div>'},
{type:"text",label:h.selected,labelStyle:"display:none",id:"selectedColor",style:"width: 76px;margin-top:4px",onChange:function(){try{f.getById(o).setStyle("background-color",this.getValue())}catch(a){n()}}},x,{type:"button",id:"clear",label:h.clear,onClick:n}]}]}]}]}});extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/colordialog/dialogs/index.html000060400000000054152453623450033573 0ustar00components/com_acymailing<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/plugins/icons_hidpi2.png000060400000076154152453623450030754 0ustar00components�PNG


IHDR �^% K IDATx��y|ř������ƺ/K�$˲uX��K�l��d	d�@v��w�]�ew	!�c�
$��cɆ ��`����eK�.�{���~t�x��K��f��z�˞QW�g�������)@�S�dp��9�����fp�f���Z�����"|�X(��)��K��#���}
�"cc�1�@0hu�\������`hx{���Ox����"�~?h(Q�c�R��0�@[R�N�����8�۷� s�F/
A�y�r�~�###�|`�A��b��f��h4B�ӡ��	��������
�c@E1R8�����l޼�:�k��v���˪��+�f3A��d¢��?���w��$��S�2�p�3� �"���E���(Z�n]���;�r� (��C!L�:��坑��E"c��s	!�@)�[8BD��;L)��P^��c@�0Ơ7�@B�@�&��[��Ɯp�@ ���>���]�8V�E鴼�����ǁ�y��\�|{�,Y"$�;�N�� ��a��|[�s�v��аh�Bp�P0�ۍ��>\	�����f������F���bAqQl6� @�y�B!���><�k�����{�H)�<
B0�� ����F���A�.�H�}FM�X.��y�</e�����ɳgI	�dyk2(ִ���D���K�.�㎽���]���]n����ٳ���8�V���"477Cg0��x���Q�E@nA�?0�����)�Z�r�����rss�C�ԩ
�]G�b|��/C�_�1���QǷ��kӦM�zx��FC�Gmuu��Q׀H)u'5B~� �^�4�Ji
w\�/\
`k�5@H�H(2����T��K�.��ܼ<^/�UJ�Y����јB/YVYYY��j#W���~�iSH���JAd��b���� @r@i5���%%��ͅ(�(���Egg��k��HW@,F�����p��5
L&&9�(.*�� ����w}�K�|<jL��'��̚��@�yL����󡿿������#�����+=��#" 
�ш� ~\9��G��=�,�dyg$��c �e�@���^�sό3<�?���j�����Q`�Y��j1C��� �G	!�N�&5�0|�0��!� ��� o�Q�uC/��(�7�xL�&]{�m���o��7&1��I��P��կ�@��
@����Ο=�]�y�P�d3(
���080�?n�\�*��k��yf����������^@��|>

��񠧯Ϸf��'k�{@{����ޯ|�l6�A���È��ۛ6�u���O�Y��3����G?�q�l�� �z����>�.�%U~Y7!$�:���Ϭ__H���-�u��$�x���;�e���Ν��j#ְ�==G�g��X̫��Ї�w�`9��g|x�,���y>�_���$���).^L!b?�x<����vB�zG��H�N;��z������=�+۬FW<?�������A���C�Kn��Z�� @Ex�^�r�mYۅF%�2i�RQn������$��3h�����v�(��I�R\<�N�"�Q	h*.,���7�`ť��1����E!������n&��"��aZ��8?��G%����������1�L���B~�әLC%yTv�k4�Bȣ�9�g+ �9$+�._n�k��}؇D��n�-^l���xǎ��
H[�I��	� |��<�~?<|~?����_vf+ ݃C���8j��#>�0ѾA�v��؏	!��VDJcX��0ޅ�Ȣp�˺	TTTTTTTTTTT��[,Zx���
@�JE��@���`'$s��H1�>[w�����TQRR�����ш�# ��󡯯����pA�;(Τ�F��6͜��Y�`1�9*�\�
9��N����q��i4�B�3?��
�d'E2�.hlm}hq{;'�<��"3�‡(��8Z�:�:���4��An��ֺ�1	���Y�����r�`2�P]]-6L��ښttt��ٳ����?	/]J�yZs�,��D�d����Ǭٳ��?�`�In�…���+�p��䓜 �MJ�>�\w㍗r�V0Y���~��sB^n�ǐz�'�Vה@��^	`�<9���R%�Հ]�р
�4���F|�{�;��O�O�H����4�8��2���1�V�P
0���?���O!��� ��!/B�B\��H����o����r��p@��H�H9N<w�x��{{x��cH�����@gO��36��
a0�I�98��F�C</\����A��bo�p��y�SP�I�����7o^��3�p&imI�C5
B</vvu����8��!�;O��JI���E}��Y������7�q�A�|��^�w\$�
g�'�z�D�N'j�Z.<����"�z=�F#�f3L&t:�Zm�|c.
�#.744$�|>�O�^6'&`��!�g�Hұ�y��^��;8��������`0�9�N�?�!��"5� �yHI&أ�>����o�[��tB�Ӂ1�P(�ǃ�n��"�ܪ( d�\;�!
<�y��isrr"��z��Ž�v).'��X�eJ �B^#�|�r���M��E;4J+*��i���3�Nx��d�B|���G��V+u�����rN�H{7�RU�U��sCCC7�>{��K==}N��qH�cs��L�Ԑ�����A������bP^}�(<����fVQP���11
�~��`~�� �j��a��b�p`�O��V��G۶�F�~T5088�!h�@��qZ���Y,p�l�|iB8*���e~.�=/�#GH�	E�
x��G�?���g�.h4��f�ziE�F�q��!\�f��^}U(�4��Ǔ�ɽ�����x��׹��N�q����x�"�V+���QXX(����|E,/+��х�����I%�.����~�����$]�q
D	�B�;��dH/$%��b^����UTTTTTTTTTTT��H�`l�e�=�hܐ�I#�p�4/�mZ�-,���`xúu�N�>���mێPh
�x��Sc2m^���RUU��==x��6X���x�2sf��`@(DuUnX�f��dڄ����5�7����2�~X-�M�\�,I0H������z�`��p��W����r8�6�浫V���F�|>x<����O�
P2T�Nol<_����p8`0����v���-{9��/[�b2#N���!x|�]��U@�2V������`aaakNN�z=t:<Rx'X�ֈ9F^Q�k߾}�<D���
0x������EEE��Z�6b�
!GFF�r�v�ٳg6�?�5�J���l9r�H�t/���1fØ
W'����V�$�#gϞ5��hO*@a&�T����i4���d���p� ��BF=&3R95��%��-f�9��TvBj4��cbhx�w�P�5`,�P�J�Z�Y*�hD����W����l����r��R�
��W���ϟ�b2"�ڥK�022��Ν;�v���400�wpp�`<��f�b�����_T>o�I�7�'śj�⪪�tZ-�@�:����<y����;}���������\�wd0�X��gOxf�6��9����`�Za��q���WW���������]��8�\.������ӳ��3�x�…KJJJ����V�͆� ��bd�cLT���)SD�Œpg��el_���i4��/���ɦ�W��1#clc,x�g?��N��0��v��ض�s�Q�z]QYI�LI�Rg��K�l��?/,"��Q�(����zꬨH)`c���Y�ط�
�񏌱�8]��q�$�0c-//�N��:�p8��n���������5KE�)T/8�\�іc[m�&�t������e�@)r���JJ"�M�>��54�jw8bBIQ��u�'���(���)|ބ�D�����������ʧŨ���K�����l6�b�a�ѣ�ٹsb�@���c��ի���B�g9M\
$�
B�r�	{1!��J��d.�SՀ)�f�;�����Zx�n��ވ����.�O�`\<&���^�x1M�r>/���7�[�"{L��m�fd�1���k����D�\�h\���	�����bž>/~�1�mhhy��D�?n2�Q^ZZz��k�
��l��6�Y���b6#��cph�I�^�<s�
КLknwqQQ�
Q(������;
��	�D��RBV�W�o��}���{)��999���d2a�UW��^����F{L�pM
HV��D����d|<&��1�z���������a�ɖӧO7�������C ��`���g+`\=&�򘌚�򘌚q�Z��xLTTTTTTTTTTT�א�D���\Hi�i���h4�0C
���P��ImN'�m%���v��ͥ��\j��)������o��v�:�0�	N����_��_>mn��:鵛�Ï~�ä�������h��h�n��/O�&r�"�N����1���-h����+ ��v���cj("�
Fҧ9?���f˲��K_�R
*� r
�45���~1����E���"��3k�p�4A�|��qj���	�ے���9ܛ ���x5A�SQ��u*�˻�B��S;3�D�&�0|���s=*�g4H��H���i��@`X���ʻ�BySM�F��	o;.�<|>
����	�
`���R�ړ�o�X�"�I�n7��7G�� xL��ZmC��+JKk�,@��n|�_M"0��F��� ȮQQZVvg������Շ7�
6J1G'�O��t���'�"�O���h�n!���<ZU[��|<�ǃ�˗�t��LB��[cK�<��8/7'G
���cdd.\����hD�Á�ɓ#�c�ǃs�ϻ.ttB�������}�Ѻꊊ���������͘�Ѐ�`8aG���A__�p�W�rIv�θ�Zx����S�0Q�
���"y7y�ۉS�Os9G�ɩ��e*��;�>ܶm�K/��:t�w��9����1�L���ROcc����n���>7[Nz/!�2)#N�؋��ı�e����
-�������!Ū��h�Ѥ�4��Mđ�*pL�M��P,<gpG$r|�0�1�(�L�Q�4F���&r}��������������
���RH֏svx@_��|�BuN�����R"^@8����m().Ƥ�<�����v��/x-M�m�j5{֬���"Lr:144���^�ڳ�B�/@
/� �nu:�}�*mVkdKB�Z-B����|3�}����^`�4��__`�� �dY���x�x�����fB�m�j��
��U�F��~������0���W�A�S)~�#�ٰ��d0���!F���^�o��	�?�	"���V�z�gRSJ#3��� DA��k׶!�����iH���,���%�#o�u555!����ۉ���9�H�V8���� 
E����1����!6�Gj`pdd?��1���ܔR��ɯ�����PT�?Jy��Ax=䖕
�4��;���B`�ȅ�π�y�\.@2<����g�?�����B���^�P#�>~��ї�����
�"������+�B,��;w~���B��\.�y�Pؖ�?00NS��?��֙����󡧷�s�\\(���/�"�;����W������k�ߏ��~\�x��B�P$} DiII'��P���3Ƃ[�ne�^{-۰a����U�(��cO��m�&�f����٪U��
�u�����͛_�O���_4>��[��C�z{{}�/\8���G�!�F�}��WOٓ����;x������x��W*4Z�H)���}�//+{��I�/*=!���~�V����=����>��j����J��q�����nH���N��5


9L�v������o;/:}r;!!�����y��w���L��p�n7:;;�76n��V&�k�Ms�\��Ι3����<�;�������%K�Һ�:���=w�1�QF)u���,��MM4''����L�r�(�����肅��ɓ�yd(��ߙ��H�+*�y�_1Ƽ���L��2������)SFΞ;�3�.2�FN%�b�ɡV�mc�#��9�_�A�zz���Cr�7c�$�,�W|�I�xy@�Ɯ�uO�=x�<ݟ.A���I��~i����Fৌ�9�ܐ"���&����������M�J��d���RNB$����Y��V"�n��_��d�����WA�^���nǮ={�d�>�UDD����|�.��7�H��~�)�n �੣G�$""�� 1�H���6�l���ID��9��@q�K����;�xLd⫯r"c�9vlT""�(�= ��;cw�y�c����s��;N��ZDD@��ID�u睏i4����~��ߟ��ȋ'�t�eEx�ߎ�Ǐ���4�yI���h�1�9y�1�sV�#�Ö�ъ�t�����
���NNʙr�+!���?f" �&X�r%r�Fx�n�|>���Q�Ή�����'2�*2��B�%�}�a�_�ܯ����砂�`�ٳ)E\��
�Ƞ�����C�~��́�;ϜI*��@�n�(�Iy2)���D���_��c��`׹s�"���6�0f�K��w���_��{�bGG���QxEDDy�@���/�}7�r�=�RY�&Mz0����ˤW�
6"p4�5�n��044��S�&���/�P�k �r�
���d,����n\���Z��ա����˛�����hD�Sl�H���#�Y�"�U�9�RRHs}����$2j&��fY^���8>�h���g,`�0]�O]@ƏPl��0��g�D�4XSa��/匛@�y��f jt�=�a���ϼV�F�0��I�*�I�{܈�1���pyl�0\`��l�f�ī��������	��@����_��T��/P���@����_��?u��@����L��,RG�OG%�͐B�dͦ��]G
6���tU����7�z+�^Ÿӥ�6{v}]M
>w��3���|&ib�h����7�(*(@���N��(��|^/�f3�_�f5���(�_nX�v��b���N�K��V@qq�������s��[�l#x�̶�����! 9�"7������z��<B� f���bʔg�K������sg�B(D���Q^^��n�V�c���ݽ����]���r�r�=/�H�d�)�9��^{�5F^��K����<�L�M����.�+�
֯][��X^Els=1^^�vm	�w~Gpv���������o�{����'"�}4�֮mњL�E��̺ի�i��H,�P(���!l|�<�d-�����n�}���P$�
�f�`���7h�Ƈ��|s�e�w�������f�S��yJ)A�!�KX�xq��`hp��@��B�� ��ȑ#�b�̙\X� p�ݸ��y��'��XLI�j:����l�>}����i�ۡ�j����…{�^����=r�!�I�|3�!��'��;;;��^o��pؠp� �ߏ����7ntؘ���"�U�{��!ahh�%B$�Ot
�\���/�pfJe���S�9���_�r�����T8�SB�%�?1}ڴ7ʝx�B��v��'N�h�dtt)9��B�K�D���[˒¢��jij��q���Q�8�CNND�k����
 �&��
��)(�X^� IDAT������<<n7zzz����w���:<X�q���PR\���kxx+��dfco+1��/�Z���R��!�9s�s��o�Moh�
�ϟ?2�|keeeY��	����?�pp���Z$�L�'���,���ic������agg�].�g�������ʳZ�;<n7(�c�ܹ��D�w�	`Q�5PB�=�3f8l�H�<�<����z�

�$�l�X������999��ؠ���p��q��������/.0�GȇO��g����y������y�z�m�Y�n}�p ���L�!�؇�����g�yfWSc���93g����1թ�>����.^���_u�,����=����ŋ)�o*�-�6}:]�`]�|yL����5{6]v��RƤ5P��p �_~X)����ZXPP�8iK�f����������st����
���%�IcR����_A֬];H�*!�O��'o���tz}�����8���;���qXx�U�Ӯ\��&������d�g�ͮ�2壦�fZ][�C�X����h�0{�ZZ^�?��S��+
KJ�577��)S����CF��k��9���l�%���`e��5���O�S��i~a!�\YIg46���R������B���Y������Hk�N�y������665�¢"���}��}I��������f�-,,�N�ӟ��sx���a��cuIҾ��jnn��p8�i^^���p8q��n9�Ve:E����N|I�S�R�-cR$/���1vG�£2�a�=%�+��T���$i�2*\EEEEEEEE%
�_��T��/P���@R��.��T��/P���@����_���������hҾh��6��!�^���>3�,[F緶��[w*2�����w���;ًI�����EtF}=�z9��sx�^nF}=iU�Q�\��RܜM�������V���?�B�ږzU[4'�b�JzB�q( ~�kN�߯a�qs��y�v���A�	 �`�T�~榛
���z��<().�<.�z��c�^���+).��[o���?s�MM[�S�^�Q]]��K/�f6G��~�o���x�=�Z ٺc��[�?��#�W��}>|榛p�̙���Nj���log�.dL�T/��$*]cl�������	M`4� �7��Q�9�a\��G���p"9�����dJ��	�N�Mu0�{B���N���B�,\��B�D�F\Ɇi�����m$�d�N���X$I֮'tB�>�I;�
�SFh�?�"6}$�@�҄��G._�f�Z��"�'�����`2�z۶����+
H��Q�����t�ꫣ�3�U�hussۙ�( ]��Պ�{4eF�nX��]�Y׀��LcRh@�K��U �bL{�67c��]��v<���r�K�r��L@�N��b�t8��Jzv"�g�����Yw±�����׀(ƌ�ΩS�g�C��\.?~9��2;�l�V������t��b
R�
��)�'�Ԃ�|���`�E��/�A��TM0��
[�z��Q|����(�iSi)�h5���a������[T�?Sʿ�k�ilre%���_P2u*-��u|���Z2uj$�Ro{�ؑ#�?���n�����n�R��#g}�µ������dO�ڜ�=յ�R
g}T��2mNΞH~�!���f�`	�&��ݳ_�җ�w�"�R���&��A����o���)S2J��ыپ#(~w�*Q�/�Cf����5��eZ��@T��/P�	���_����/P���@����_��T��/H���/PQQQQQQ��B�y���0H��q)�1� �C�6�ٙ+ቨ���/Ǘ���A@�˅_}u�r�KA�Lp���@���p�l��z�%��8�vc�ƍi��ş_��z5&�l�r\�l`�(�ۍ�jP�#���m���QW�U�W���^��0 ������0��=�#~^�x
E>_���5��DC��jbD[®a���\����ODW��(��D�R�w|ݭ��87z�f\��C��������㓧���������_>V�5��,|n7�R��T1��Xu�'k��`6�`��0��1|���ӦMj�Y�r�(J��b����j�7�����TijV!�NB�.��S�nL0�6f�.�H����S�mil�?x��S'N�/�R�V�<�R�4�S���EW]���ÁE��X����p@�-Fͬ�\q=��t��vGf���ӉK�����_��>@i�D�{�|ww7���0<4���n�{�	��%f>A@�†����W_���G<xd��Wo|�;ߩ���(���is{;�:��y�wdX�<���r��H���OD}��<{~�UUUev�r��d�Dиl��%��

��,��W-_^���180�Μ9`{�1nz��> �0FZ�޾L�q�C!,�;Wo��{Q�R	!1�Č�)����+����;�99�~� ���E�
tf����3$�
�h(��~�}��4&�a7)�S�_R���z<���V���E�fC�f�!fjH�8��v�l��_�3s����׭Z�WVY�B\m�6����rx�����Ç�lƬ����߬�+O�gʳ�h�?���� ���Y�PQVv�������ڕ�.l���cM�6*���~4~-JD�H)��7��g̜y��`@����  �$,_�$�رc/����d4���>�(������J@��hl(*/�����H�`�Ez1!�����i���kB���.`�$�s��^���h!���I�#�1k�A���f�?����H͒ꗅ{s6"D�b�yD��~x�n�������`�6-AA���|���
�0���wg	��oQ����A�s�����������2nl�l|�T��`͛2��hӏ�Ť���E�᦮��P(����h��y,�M�DL���)�>�p�>��b��1���Q��o�Ȇm��ذaP���Ho�I^�/�x�C�M�E�q5����q�2ʰ�x"Q�ن�m��:�o��H�nv�?T��6*���'�N*@���ք*��{y�ذ�n�$�K�'"} ���������ye�a-����ic$!�!b�#�*1.�_l��֭[W7��H3��4A}c��(l�S��"��G�F>
M�2c��|^/��̓��(��Ñr��գ䫀1�P��߿fKK��`�<{�R���!�2ę����y�]]N��a��vd�"ս!҆�mm� �v�[�����1���UU��@����)���-��F	;�f, �q@�FCpk:c��^���_���������&��T
KK���Q�@�oCoo�sgWƌy���|���<A�	�
��܊
�u:?��r�׻�n����~�$�Z>㱶�O΍C>**********Y�%�!F���l��w�sO%��OE���\8l���=6�y�)�{N�r�|�p\|�� �����p@���hJc#N�I�sMc#NE}��,X�(b_H�ѠhG��GJ����!���>���2��AQ��mH���GKR���,�O�Rxa�u�LHld& -
Z[�{�D��hpidgO���!c���#!B�m(U��y<i�����&Kn�n����k8n\�@��7�p��WW_����3�Z����		!;!B��2d0��im��l��d��� �����ׇ�i31���iӔ���!D�.�ϜA��X
Mb�X�***Z��^�ۛ6m"���G9D'PL�WT$<tH��L%�2��ϐ-�~åJ'�6�n!��/ęh'r�5�{	!1K��O���&j| rۏx��xQ1�!_P�>�U3a�@24�ɮ/i��@�-/3�@��\�����N��
#��y���c='���8@4�x<�\����=PQ�t�xA�g��?�|�|�������E+W�����C�m����]ƚ�X�o����@]_��/P�|*�.�)�/�ԧ�� ��x~)�P��s��$P��yp�n-��z}A\'TOf��aݺuu��#�ǘ�(��H>�,�&�	×.A�Ѡ��;�G�#�ϼ�8��^)���*��s�8m8���2Q̨����==-��3E�p\Ɓ�N��^���0.�2���w�q ����>�����D]_��/PQQQQQQQQ�?�a��Z�yS��/X0�MF�bR\T���ұ�?z�#
M��^�P��0����"}'��Qx��h�?��DB�]@�ł8C��g�GQ���6"J�1v�-r��$G��HnU�g8�TM?	5'�� Gs+����9v>!c1�7!-HnS����tBfVg�_�D@�mjS	�q��c����LmD��V�Q��Z��p@���W]/��Y����Uf#m���W����'���ZZ �B�|	q�D�p�СȹJ��t� �Zt>�v�^y�_��J�ɤ=u�R^�S�	�<��׭�����>uj IˆE�
¸�/��1��;��l�š�`}[[t��$}n�������Y��y�Fa�Ŀ�R�,ƒ4�Ā�N8^�@ƌ�O&�P��*}�0.�@6(������!���q���+�T>���ƶ �y q�Ѹ?ē�E�N�XP�TYy��B����X3�e8�U׀��@EEEEEEEEy��h��`1���kPX�N����
��Z�.w[rr�++*PZR�I�&�ҥK�xG���[��#.�!�n+f��%��>�A0�w���I�F�ܭ�Xnhij��hh��f�6j�����F����������?�7�H�O/��,`�-��<��w���',��0a&z}k�����:L�2���!�2Z�7�#��1���������k)����w&�X,X�h/Zd���]$�"�Z-

@�}��N}�ޒ��}�ܶ6l��|}v�J)B<�8�ä���.~�@ f��t��1i���D�*�q�}��F0Z�4ƪ�F� @�׍���hG��/&�4�pT"��qv�b�훕��H�	3�`& ��R:�i�������c����#��^��	��
Ҍn�
�������]� @h�2Q*�#��m,�A1DQ�F��N��V���XcV���	<�&4�H�N;2&����<��n7��F㩅�mmm�7�|S8z��l6ט�Vm�P��6\N���y�������O.+˳X,�h4�����z144���9��OZg͚U@�ץ��3���R�}���̡��ݻ�oDz��Lmm�yA�-��jA)�����੻�{��~��2�����i���B�55{{N��
�fϦp��5�e����g˺�?���O?�g���cC�2~��0Ɩ)f$���;��2s&�2sfj�"c�)gNY,�1��1�׌��i������Ÿ���iussD@ʡ�1fP/���/PȖ��&
gT~"����W>ƅ�#�D?�]qi��&�O��7q�����.2��B����-�Y��YEEEEEEE%+T�u��e���>�V\*	����,����N-+).�����q�yx���x�ϑ���W�Wb'�����=/�[6lКL&PA�ĝ�p8�n���������Y�V����n������>޲E���bT唕=��5k���c�$�N�Ŝ�V̝3G{��雎�8q�َ�������mZ]�qN[��H����hs��c�+��yǡ��UUU`��{���	���PTX�ļ�(�	�k��!�F٢N\�MB!B��pD\�`�("7Y��	���|{*b,l��H* >�C�)}�Z@����Ӥ��hAi�U���i���HY��D��^��?�*�b�0�*;�¶�x�@���ES��2����#"����q��F��q�8�ޑ�� �T��HT
�<��
��#�|�SӦM���k��v��m۶�5N���f��h4B�Ӂ�c��ń�\����l�M{

��{��'��&9���s���/��ڳgϑ������ݔ��k�X,��t��]�^���?z��c�]�$0^@�=�hʔ.�:�
�!�|P��<H1�������>�g0jL&��h �^���j?<y�d�j�����Q�$c�U1�t�2ټ�2�m߾}��O?����0�������`�g�=��&M+$G�%�I�k�Ƙ3:MB5���G�,�R�pL6�Ǡx��cck���^M�'�+.�S��x{��������/PQQQQQQQQQQ�����B��u�?�8�K�����M4%�h��:u��|�Fh5�������>����O�q�tx=��٫&P�@ ���~?~|(�����hL�w�[��.[��멧�z�16’�a�:����lm�6l�7HE�}ꩧ^Y�lY�uk�R���N��c����}����{��FQ�̚5k�|)�O?�x�t�.]j5���6n��/��S�~�^���u��>���Dٛ,v�V������V�E�8�{�x�`]�n��^��j���������?��g!��ۖ͝�p��v#
%�/&�$؇�z=l6�GF�k��]����8����LwwO�ٳ�1��gϦM3gR��mPYWG�-_NO�>�'E������{�-_N+��,����3i�l�L4:��ܾN'Bc�=
��y8����N]�4�B�`��n�Tc��?B)Ŵi�ZR�c��6mZ���H�iv;B�`�����p��H���[�O?RYY�m��h4�X,p:��X,�׋��Ax���0�8w��Çł�X�q�ù���Olj�3�:��.����ڷ����X���X��655�cl'�����:g��ODv��4���/��׷ryy�}�7lx���2�@.�.��@ �i�_�k������ߺ�����c�Ҳ�}i�˕������������WTT�Ҳ�}L�ܥ(�1�c���'vWWW�6�L]9994�p8�h4�[n��p��r�-��F�p8h��&�����z�O�xb7�|�(.(�Ed��#S�a���j���x�1v1U�Q�qQ�K��UTTTTTTTTTTTTTTT�p>5�V��Ժ�%��\M����CG���ѣ?��i���А�_�cph�O��AH�/X�z5]�ti��O?��_p�
7Ж�3i�̙�nH�/x��_Y�tiתիS�����g�O�֭[�V�^�/ظqcZ��E��&����7�T��t�Z-֯_��8���������֯_�E��:]�� �������hǶm��9s�rrr"����,�_=Ӟ����a�޽;�/h�?���ŋ=������tFKK�_PQSC�,[6f���Ki��)AeM
����hG�@o0@���� 7/� �����	ڲ�_����+rN�\�rss����	i�6mZ�x������8l���r��Y�����!݌�vQ��w�� �4Ο�Q�����o�o����̘�����d��lF0��߷o%�H<��BƼ�YRZ�Y�Ѵ���m߾m[�<��.Ƙ�S	�����Ϝ=��16����UN��+kjnc��;�Y���Qo0�nO�G�ث�'�i�f�wݰ~�2�����c��}�������|3�u:�9���"��pMm-���i�ԩ�_)	��_��������;-u��G�/_N���zjw8����~�z��n�:�h�"�6oަ�.�Y�7����']�� IDAT?�]]]��b�t9�N�}��R��AM�D�{�16T^Qqt���tݺu�������z�ڵt���ta{�r�|=���	(��h���N9ŤE�����马����l���AaQ��q�w�}��|wx����MY�nГB�	!��t��.�s�N�*r��A���#��J�'�Xa�9k��ϟ4i�#j�幎q��5���~��{�w������ɓ\f�ٮ����=�����E'ϩݏU���W9y2����۷O<w��	�ǃ��6�YP��
�Xf�)�����,�3i�ܹ��>��/(8:k�,�l�rj��
XN8^5�[�ш::`���ܱ#��8���[t����;:�c�85N�J0��O?�����}�����[M3)��>�����2�no7���"�G�=,�1�c
�����c��'b3c�i�WQQQQQQQQQ���Md�[o�x3I^��d)�_�t���V,]�#����ĥ��������%��Ů��7���*��58}r�1�	�5�~����_�{��z9�h�Z�(��?����}򸯼�hhX$�<|>�� �� |>�GECâ��#M [.�]��p~�Á@ 3}��}�8�����m��RG�!D.y׎	v��t����,h�R�� ��‘��~�N��o.��u�ƢMM���"��,�}>�{z<�,�?"V�o?t�Rz�رcǎ��;t��[�L��
��ka�)�%�y&�)�(�����O�n`rM
2�Dt�R�7V�����vgn.`ph���
y<	w�q	<�b�R�A��8:�
�b�R���_qw�qo/.^$��!c�/r]�s���

B� �^y�C(��`H� �r���0�eC������w���1w�a������)�>�g��"{N�����j�J��<.tuy\��W�n����c�8|����8�V���PEEEEEEEEEE%+2�p`��%�@V������ų����ϐ�v����$4A����ZVdk���gH���������_�p��Y���
���c�3(	���?֑0A@�����  [{���
���c�3$���?!wC�ޯ�
UTTTTTTTTTT>m��gy$�Y	�D��L�
�-\x������mۀ�m��p��7�j��;��<z���L�������Fif��c�h���Zaj]:�����ϨT�\^/t
Lx=�#�YI-$�� ���b
��:��_��)�)�ǵ�Q���&
���U3�?Ix�+V���I��_†���X
x�
�����*哰u�b�u����N���b��nlj��>�Z�x���L�1C�[��O�eA���m9�T�x�
��1*YS��IY��K}�؋�WԔ��=2�ǃ��.��ڃi�W���™S���j�?o�FB��%���1awC^�0�A��N�%N\
�B�/\��b��c�G�y?�(x\�<�&��Ի����������ʘ��pdj�ڒ����d�u�V�f�a��c+����w�K-���lٺ5!~QR���h�]}�P�������-:m�@Zn�^���LYI!$��}�,)ik�q\drk<���ͪ|�sg�����w�,)i3,[�IZ�İ_�ϒ�V�П���Ȥ���+NFv�$���0;?0>~����鍍��nO��_���R
>�R�!���h4F��:o����Sd;���Agg����B�r?�#��8}�dJ;���^�%��dYP�$x�%����`p����?;�x��P��TTTTTTTT�(���٫V�\��K���(Ż���c�&�G��_��z�F1*����[oi���b�ш<�����(�ॗ^�y��߽��+Λn����/
����~oU�*����m�,yC�eI�W0�a	۰8��|�|I��8�!�0$$yf2d 	H Llx�f3��x�wٖ�޻�����vuw�&������G�����u�:�=�8�v0:-+ HR��1|�P
���@iI���{T���d�SJ@)]���{� ������;�	@���N����8?'�|;�j�����8I�b�SJ#T�L�D�b��Gi'��KV�N�u�<�H��b9_����Ѱ�$A�$�,C�ePJAAޘ1�
7�,����n��ټ1c8-��V����P�A E9@�[,�M�=�	*��M�=a�X�o����r�:!��v��o߾v����� �;����o���eP����喟Zԛ�ZPx<�ڵ�}��}0�vGD�
����%N����]����-����.��vG�,���6��XC�e�I�����ÎR
Q�v��gϞ���k�0���m��F�g������Pb[�=x���ݻw�944�����g�A{�ڳ�yCCCؽ{��j�k�e��ws��P����`�
%Nu_mm�ʊ��+srr�rDY�)��[�Sf͒�].pI��xp��ѿ|��g���_%2�DŽ���>���R��RZv�����hKk+m��孭1MP��*�ttЖ�VZWWG��q�aJiH-Þ����	��c�
ѕG#������Y'm_�O[!Ɩ
&T�h�᎙3����3^/v�E--Ravvx�ؾiӿX��ऊFGA�O{�O�*e��E�$�(�s�+ǁ0����[�l��=�ω��+���V����e}}_�s,��²��X-�^��,,;�Ჾ��V74<�XeX���ɓ�<�)������޾XVm9�V�h�WPJ��H&��/�nhx������
���<�-_�4N�"U������a�����\�4˲����c��.��Q2|k�i��NجV0��,��xM�ey\e啇N�Ğ?�\�,CE�VW_YUYy��tjs���É'p��e{
*��}ٲ�'N�����+�*+/����RE��X[hQ�(��E>�G���ン_Y��Ơr�W�,�����v=zT��|1��^�b��UN��wQp��I�G�=��ŋ�,*�p��7���v�<yRu��ˎ zϦ}B��~��^sM�/BVƫ]�vյ�\���3���B��A�=����{4˲Xv�2�/B��U!�Yv�2˲#'\�N��D��� X,ᡡ��Ph*!��%@�Ʀ��6�>�/���xA@��?�6��b�����J�2�H�7�W3Kv�=�C���,���9���	�x<��W�z<YaF�RA�tmT�#���͘0a„	&����۱/d��\k�"�kyQ���y	��T��9s��'����ɔb�֭x��S=Z ���O8�~�HmMM���c<O����1mMM�3K/��9��U�@	8�i��E���q��"�O�(�tv�Y�c���a ��þm�XJ)3��[ �����(Np2Y<z�u��45
�\��Pe�����f|>~?�@�G}���LYi�Vn�ʕ+�����믻�@�z.��O��Ԕ����Q�	�q��t˚5�r��	��E�g����#��D�����]�O8ylϞR��*&uw��3gRJ�jJi��Ӄ._�t��3����^8�xŷ�݄���KO��;��^����H�K)�[����L�G�x��Jq��r;=r� �����K�����=�gxH>F�#�~
1/��E<#=�;�5���Gߡ�l&�dB���/��j�DiF4�[�љs�t:���@		{]2,P�B�Z�z;7��֣f����5��Պ7_y%��DC�e�I5��o78�Y���xFR7`��A��d�F<S�	R��`�� I[@���]�сB�V���jE�]a^�� �<^q���q�ɩ,'���'�"��o���ɬY�Ŗ�o �䕴&S�xu�5#$˟���$x���z$˟��{F�>�G0����A��8A!��nK�&�^Hl�$��jE�˅�Q"����ٳ8u�l��`T9k�?�1��3��e��RY]݈-���ꤲ�F}~	���lReU����L)�Ǣ����r�#w$T��#�o��l�9`��3f0��w���rs?����PO����\n�Zy�Ô��-����/'ND�H�ҹ�**�+�^[�]�vVG�`XNJT���
�B�
�@�#�
��[�-D�3�a^&L�0a���1L���L� �/�yv��;�_0���3�����I-�n�R��P(��3�L�935ŔR�Kz�6m�4�;15��?Zٹ@,�H��!b:!���ס
7����!"x��H�r��̹s;����|8}B^�RJ���:7��v�W0�	P����X,X����b;a�k�y��[ ӼBڣ ӼBڝ�f�WH�$��.��v'�4��~d�W0�Lgx�}DI����Hɩx�cn�h�X8�V0ԭ'[+xAH�-D�`Zg'B~?X��Q#!. ���Xcs3�����M���<�`��V�޹3f��w��Ǝts�,I�(���cQ[!Q�SE�o���4�`@a�R��a}*��/��h�y��lM^��	&L�0�Q��/��3;�Z�n;FU���}	��T��s�
���Mo�e�4.���q^�{B{K�9���	��\{K�+��u�F�|����K.)��`ˆ
6�/z�M��a8Y�&&\!`X�,���}��m�PJ��==!B)����x~
R���暒���k��&B����8���y�n�|>��������������ʴ�n�k��&���������T45k��+{��瑣8L%p�=��֭����QD�Yx��?<��|�馛�c���Gw�.��]���^:�����3{{�����|��鄠��(_ R
��s�1/&�P��)�|��ٳS��;00�T�2"!8.5�ß|�dȰ}A���; �V$ھ`!�Iq"}��0J��G���ܑ�t�'ʾ�3
Hv������p�|啴
�U�흇v��N~�:''���˓���A��l�x#+�lyT#iʾx-q]��������e幫h��|��;���˔&�OJ��KLr�:��$I	H:��A'��,��z"2�>�oFn�' �l6��p~�?��^<��p{�y@���u^�hhi�����{Ϟ���܉l�;"%��
���,�[Z��W����[�?&	�g_W�=PeU<~?���C���zeUA�(0�6��� �z�a�<_(�w�m{������^/�M�x?CH/�dv:�V�rsq��#.ĵ/8q�4?�-�ׇ+�vo��<~'N��Ob_�H��Gg"����z���v��"Jkk�҆}~���lBeU����Ji"�Y�`�}���:��<�Ӊ1,38���{��g�Xrs߯��1PU[K-���k�l��|���]˖�̩S�ԳB�6e�6KE�TW��7�`:L�&L�0a„�41"��$|���/�9w�4c���Wv@Q�I�b�b�[o]X��	MM���e�nwض��v3>����I���Ӧ�lް!l_0k�4��0���Ry����RfFO�J���wӳ/hnlz����%%���0��/fJKJ����:��ؘ�}ACÉ	��%��b��[�N��GsB)� I�5+ƾ�n����<�wob��ɽ�tFO��f���8��/��c}���W�x��$����'*��S��"e����)�l_����(�f_���@(�>���}A�GP���IX��������΃*��v'������Fd_��Ԛ,^�D\��Ft�<����N�g�WH�‚F��e�	fN�����.?�y ^A�)�
#z	x�:^aE*��a'L׾@�V�
+��
�3�,î�OI^�A�hm]�
�#@qQ$�X��^��y��x�i�
�׿�:a�D�:�``_P��q<�Z\,��ׇ;](������R��1���oj��*+
�J�����٥��R�"0�8�{w��̮�����1���$���/��XX$�/`]�+kjF�+T��Pv̘��|��G�ڗ��+��W����+�W��&�`„	&L�0a"�x{�5�
�9B,�r�'-�����VVZ5m�0`9,�D�P
I�
��S(/��PH~��
�䤶Ѷ�B
���:���N��	�e��yy-ZtG
@E�=s�%|%D���SJ�B�N�(����?���O?�(�� �2�^/
ǎ]��_��Ϡl�BHB�F-P &�����͛7O�$����6(�?Y�B��0{fw�Y�a�Q�xA�����1c#!�d�,@̩���(=*�� ��N�GZ9���!��҈x�@�.\�`�"M)�@yM�Q]i�׋��G	!��d@������޽&��s��\�TX��Ύ�wQ����ђ.���˵PI.�25��M��:H9p���66��;���p{<��u�@�G�UZ\���e<σ��޺\J�pxI��1w��A	�0��x��Z�w{�X����Le�M��@ICm�D�J)Q�������Q���!Ay�P�~)0ϕ��y�Ž�/(؋��g����q��:�"�n_�[T�
�
�	�q>|^�r:���� n��tB�E��\SUue�I�il\%D�5+kͼ����S�r ��$7Ʃ±c���|)//O�q�$�_���Rj��O<�����`�T�Ԥh�9��9f̞�H�gϖ�kkwQJ�R9(����r�l�v:�4�‹/nhni.��2iBG��������ٳgK���{(��(�RJ�-W�K)=
�K�B��������K[��?�czQQ�����>��
�,BȠ�O�,^G$۝O�
>�t�^�	!p���^[�� $IB(Bk[�qg��WD�������f�(5�0d��E�+B�N�>���yȪ��͛7wB~��@�F.Rݠ��;Q���oM�:�F9r��M7����/�VVV,{ב�����)g���XV_2eJ
��>;z��Y'�>�e�?��s����!��>,X��z�hWUu���]���;F)=B)�C)}�RJ�/_����V�4I�
Vkf�pRJ��}%''�3��=)�굻(��ZWUS���Vn„	&L�0�w���t?�����;:�q��3�a�1
��99
���G%�5MM+���+/��ݚ�9�y�^
����	�@uCÊ��:�ꫮ�*O�k�/tE�KT76J/��>��S�[�]�0c�\ڽpar��ʫ��W�WU1_���t�b�����:X65w@ѕ���[QW]��p㍸}ɒ�U���x�U.͛?�>��#jv=�͛G�͛��΢"i�…�׿��+�ιsi�ܹ1�}&L`ϝ×n�
a����~�N(���<Q�����Qb�¨���f�<UXSs��[VY�=~�L*ˆ����3v�۷�3��5�ׇlokC�̙KY��1�iO-q�%�(C.c���;{������|a�
�P�_Q������u��%��q�PJ��<J�YYk.�3�{la!�=�����.n]��F��'b���}�ݾ:5�0�BH8�:[v��s活\.x~���^`�.˟�X�v�/@^n..�;w����`<8����!pee�����
�έr8E��}�k0���g>ݹ�  ++���i�Ͷ���q�3a�G�2���_�xu�Y,wC�x�1��(��y"�2,��
љ��(�[Ym����W�|�kn�_�$	mm
�ӹ�G~��}uKSS�,���o�q#��'���@��Hk��׬^}����X,����N�eU_OOC�y<��W���%���z�IDAT
�5�,C�v�N�֮^=���=Ȱ,j;:��KU���ł�n���ޚ�M}V9݉H��x��lZ��g`p����9���>�i͚Y�	ˋ��Yvo۲e�k������s��80�!�����`sv���?K��܁=��K��jH)M�L�~S�r@u#��L�n��<C�-Cz&�#6Ű!#�6���*+~ge�|��Bӌ�ru)f�~��(,iuA�OI��$ږ__�&L�0a„	&R�Hy�ClI�'���k����X��B`�Z��ra��+�+�N��8
�P�9�v��U�R.��g�A��,�+�ޝ�1��A1~OyW|ۭ��A���K����MY�h�D9�?&U(�w-]��� /��BVܳ'%!����lB~B)��ŋLe��*�+�ۗT��y�ф�}���<���L���
��h�a!�,�1��s�1�
�xz�t���oK,\H�EEq߰c�r�ߩ@հ�K�݆�s�0a„�
������'Є�EB�����Q���J��55����ʛ���U~B�ք7d�)���:�M�<�j6+��+*��zԗ�/ڼys>�H>��	�&t'�$�H����l��uw_=���P(?���
���c���W2v�*>�e�6%ex�B�n_3o����B�}>y�u�E�7n�b���-,ĥs�t[���@�/OW�ƤP1��tn�t���y���xc��%�4lڲ��W�����‚9s�m�ٛ����D:���A)��
��m�9s��� >ݹ��z�1(����5Q�p8�`�ܪ���
ƻ���!��A�ennX,���O@�EP�(��,��5�@���5�~�2'u$	�@@���}�7޸��,�������W(�e���umm
�$��˯���׎��m8�v�7Ȫ!C���۫V}���gA_OO�ne]_OO��b���\�z���[���bm'��ң��ޚ���,T���kj;:���Y�{p����A��EQL��>�8<��Mk��>i�d9����֬遁�Y������M�z�jj�v'O�����_�(�)�7"�tTn�rq����3�	S�	��@��k<� ��'��-�H<��X�.OW���h�h1�L�0a„	&L�A�v�#���Fu^y��~@�Л��� ˲B�I��a���{D�!s�����Å=)%yч�d:N3����a��c�L�cF���ahh~�?F���,�N'\.��vg$]nn.�������sCCX��	;BwO7l�H��s�06�M����G��
�ЀI���EQG	�X��D&vuQK7m�,J	Qގ.�����$�tj��$ːRP	�J㤚NR��qH��[E�z���j��4��)h��JGT�JaK�8xsI:�zܟc�2$��q8��I�m��!D�	�@��N�_��#2�Ӊ��?S�@���8}�>ں5��hmk|�F�m�I�'���D���P�@J3aessJ3\��;:(p�+̄��@��$C�gB�^�x�1B�gB��U�2dz&���dY�-����bQ
���$����;jF�Y|(2����VUr�Xʂ�(_iF�1�B@(�%>B$z10`�}����^ېe��� !$�G�	&L�0a„	&ҁJ,�
�|���9j�+mߴ(,-]w˗�TU[S3���IU���iӺ:&L�?D@;�z�ٞ�󳫮�•���P(��pM�p�Yu}�ͳ{{A	�h�X���,��9s��++!
BD���<�kj�H��3�������1�
�!����²WY����a��!@?'k���dDk�X����]-MME1!�Ų,8�,˂�2�>�>N
`�޽r���o$D/�͌�����w����&2� �����'�/:F���1lܼ�+�|����M�O�4q�N�æݵVy��>���?J�Y����AsS��^9<8�)Z�h���k��Ǝm3fl6�I�>�)�ZB�˲,�O��e���݃�G_�~&�T|�KCc���~��v��p?���`0���abhhn�>�~�_�+<�C�yLjoGie��Y_Q��RZ�Y]������ݝ[UUU�r�`U=*iT�$IĽ����-[�ݻva``�:<<�$�4dggsYYY���X,�,Ȕ╗_��8����
��m���J�����p8��,
�ȑ#صk��z2�����?�X,m���Lvv6lv;>;|��t۶b��g��R[��'���+V����g����8�<���8�o�mj���+����4yt���g����

`����ʕ�x>^�z!\�������'L� ���H=�fIUJ��x�QJ_��
�R����7TWW��uuIꍥJ�͔�aJ�t�-��7n��>q�T�Аt?@)������ҳ����KK=`�
i	�TE)�D)�����ns:�SސPJ�J)
��j�f{�@-���;x�R��..��X��L)��yッ'O���.���O�:��rJ�Q	�䢔�י���0a„	&L�0a„	:<
E��ׁ�|E+�6FmWR[S�[�����uP<s�U��X�_s
3c���j]��	Y����B��ގ���˞����H�D��
�
������o��U]_�4R�# ���P`���
V��AH��9�fa��7�e?B�����
(^Xf�Ì���g���0����E+T՚[,B!��v�|�ĉ���p�T��-'�������YY���a%�ʤA���8;w�����ߑ���JE��c��z�{ƌ�q��f\����7��[�Zc��9��z�[�/���9�������K. �T�(��D�ڰ���׌�rmS��N�I�������:>!
axx�O��d���t�9�()��|tR{;O��s��$	,���p�U�ѕ���ߏS�N�S�N]�y��^~�:b��N�8�%�<DA� ��|�z�"�t�1c�EEE|Ss3fL��=�裝���a5��:<���v�СCG7l�8T_W7���[!��
�b�Z'N<U[Yi
��z�8s�,�'w�y���{�iA��+hnn�Ǎ��&2�B�ٱ}{;���7BH�0Է���%%V�ۍ�g��ܹs;���hA�yk�Pp'�p2(�O�c"{<;v��>��K�������⟝��%UWW���|��#T��"J��Z��$�̚%���H&L�����S%�(U���
�����svpp��y5Uc�&ByC��>q�T1n�p�m��Q5��� ,q2�yuժ͔���f�J6������oRɯ�p��N)�PJ'��/��x��O��>@u���������*w0�-�������h&L�0a„	&L�0a���L���L������L�&_�L���L���	&L�0a„	&�?����Gd�#2����LD�?"�����Gt��K���Gd„	&L�0a���F/�7X`2�Sp���6��b"�_W�hJG����0LJQ��%	�O��[����p���Μ=�7����:9��	P�,˂�8���Gز~��P[⼞�n����Y9��;G
M/�W�����'��V��ֆ-�7�!R�����@���NL�$)6�����m���J(�$I�����e���!@Iqq�(��D��Ί9zth���u8���K.�VS]�nw8�r�RH����е_��# D�
&��'I�~?���v�?��r�}�+�/��,K€��$��Sr�����e��	����5krL#������φ���\��0�U�g;�Za�{�F4
a���fc������Myy�6 �<k�2���.,��Od�E��]�"�����_|1��vCń�^}J��6�bZk��ӧ���j/!dotB��R�e��9&?/�]�Fe����$	�n|�U�� ��b�ԩ���V}���{��=:�#\�,CV����6��%��BP�b�o��f.�?�d���Ph�ܩS��V�A)���rrr��)�@"u|0�$��!D�e���&L����1�u�:~S]S�C���\�G�;E�5?���O��]��KJ��XN��1cv��h�����G׹��M��+׸��a(�2BJ0�Y]]�	!��^XPP600�S�N����.p�d���N��a�{G0�d]Z�|�H)z>�$I�z���_8��{PJ?y����|g�F�{{���Ɲ��o������a��`х1����8�p��3���X�i�R�`(�Ç�v��	��h>��
3��$B�6]Ekj����jksGx��E��O�{���>�N��$��"���+:�;!�>�����K/�>�Tcs��Ã���ART�@�%�(-`��B�8y����6��.$��Q�.����W�$�f�Ù��3s�� �RjJ��'�����^q��)~�֭�-�uBhC/����M��{u���r-�3{6���Qu��_� \(��R��0�`���8e��hj��(��|���<	�q]�VMhi�y� ��*4r����ZDږ��<�|aT��	�ND���u���QW࢒�c#�d�ʊ
'��ϗ��7}�(IC�&��#�_�e'��f�z�JK�<���on��Q�%�28�C�q�O92W�ݕ��oki��e� xc ��P(�fQW1��Z4��|A�� ꪖ;fLx�j�jʒ���������S(s�,˰�l�
��qܡ�G���3gΜ��� �8���C~n.�ƌ�}A����  ��������CAAA�e�|8}�4��Aݍ����ƖN�����j��]��!�nX�M
•����[	!WE��o~�ӟ�����-�|��juƭ-
H��g9n��?�cٲ.�B�����/$�H(-U�uT���<j��f�EM�0a„	&L��p����F��$U?$1��孹���zA)B��ԯ~u
45^��+������EH���,����e�4R�U�A}O"ϣw���_h���M[$
�R�NIQSY���-�M�.IW���J��ں4��"e���p,cY�  �������EQ�$��:iR����+/�S��O�*
B�����|���sCC�~?xAPNc;�)w�tXVV\I�yȔ�ҭ���>DA�,���ݽ)��JG��i�n�:%�u7�4D������ �q�@��15748%�Qp��N���,ǽGQtΒ�ƶ�ŰZ�vƔ�)*ZF)�(��X,^BH��!N�t1��$A���\���d�:\z�O�ڢ�tmVkvoo�
�aJ�t*�J�I6�
\v�2��})Q���!�
��=m��h�X!+++�'�$tN�2��H�
']rɵ�:�j궐JF����j�"++K�{JQQV(��ۣ`i]u�UV�|hhK�,AŸq/�a��eY�dg���7�J���	À�e�45->p���M��
P�а���ZN���_�t)��K�t:?�,˂!���Ev�Q''��Կ����JT���c�YgB�D�˷�-z��p?�Z,`���WAbX�NB~?�~?�
c�e[
xc!����K�N�v��~�A�At����3ʓ�T�-.�������
!$�CS[Z~�Ph�U���p�ر.����)��?�/e�Ξ=����Ym�U56Sp�����U��ͦ��Z���;��ܷ/IV(�_��U����>k����k�{�~[>z����_�����p$<E����Q���I,F4����IXQ!�EjY��R<&L�0a„	&L�}�h_<j?Iq�8�7ߌ������L�E��+��]��1�x�n�����(P�$��v�\���c����[�D)�!�w#/���I�>v_������_tz.�eyyd?wV�L,�?��jo`0�����Qp���(��;U틆ԓ�z����7
ڻ�P��+�e�𢈣����N��7F�` ����`J���1�Ξ��Q R�s�`�5s|�FAUk+��j�dtC���9�C�~�X�P(�@0YL��^B�T�'�7i�I��5e�@�"V9s�0a„	&L�0a�D*�*��aF�����3<'��p\ʯ���8r�0<#x[�(�ۀHK�����;���v��c�z�����l�ẅ���=���G�
b���F$����ò����3! P}��]�#��������F�1�k{DY�{���p9�X13�蛉n+.r����|BΎ�JiATyC�����"���S�`|I	lK�}�R�� ���ɘ
��t*�EQ�W�´���
<-�>�ٳʨH���i	@)����$@ҵ Yؑ��`��|�ւ�v�;V��J��%� ���iܱ#"M��>��°f~����)��R�"_���$�5G!�Z���B
���$�i��P�>΄	&L�0a„	�d��xD�r��/H�HY�t���R ]��Ty�x��i��Sr���/0%��/����j#� �#�/Py�h$�	�
�	����Rf�p�Δ�%ӣ �N�Q�����3رeKJy2n_��"�	:]RFc_�O�ႍ�T׆��Q���L�h<�~]��dԾ@@����}�	&L�0a„	&L\d�ƾ=#�ˆO�e�W���F,���
)�#J����oljZ��q��fg`� "fm�O"eD|^o�� ^�tlR�G���#���U>� eD�L�7�\��h\!噰}�tT��GH�Q<C���錂h\(!�.�����.T8�P�#}
i�#
���{�Jo��G�Q����(0a„	&L�0�~t��2�7IEND�B`�components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/ckeditor.js000060400001601534152453623450026431 0ustar00(function(){if(window.CKEDITOR&&window.CKEDITOR.dom)return;window.CKEDITOR||(window.CKEDITOR=function(){var a=/(^|.*[\\\/])ckeditor\.js(?:\?.*|;.*)?$/i,f={timestamp:"F0RD",version:"4.4.7",revision:"3a35b3d",rnd:Math.floor(900*Math.random())+100,_:{pending:[],basePathSrcPattern:a},status:"unloaded",basePath:function(){var e=window.CKEDITOR_BASEPATH||"";if(!e)for(var d=document.getElementsByTagName("script"),c=0;c<d.length;c++){var b=d[c].src.match(a);if(b){e=b[1];break}}-1==e.indexOf(":/")&&"//"!=e.slice(0,2)&&(e=0===e.indexOf("/")?location.href.match(/^.*?:\/\/[^\/]*/)[0]+
e:location.href.match(/^[^\?]*\/(?:)/)[0]+e);if(!e)throw'The CKEditor installation path could not be automatically detected. Please set the global variable "CKEDITOR_BASEPATH" before creating editor instances.';return e}(),getUrl:function(a){-1==a.indexOf(":/")&&0!==a.indexOf("/")&&(a=this.basePath+a);this.timestamp&&("/"!=a.charAt(a.length-1)&&!/[&?]t=/.test(a))&&(a+=(0<=a.indexOf("?")?"&":"?")+"t="+this.timestamp);return a},domReady:function(){function a(){try{document.addEventListener?(document.removeEventListener("DOMContentLoaded",
a,!1),d()):document.attachEvent&&"complete"===document.readyState&&(document.detachEvent("onreadystatechange",a),d())}catch(c){}}function d(){for(var a;a=c.shift();)a()}var c=[];return function(d){function b(){try{document.documentElement.doScroll("left")}catch(m){setTimeout(b,1);return}a()}c.push(d);"complete"===document.readyState&&setTimeout(a,1);if(1==c.length)if(document.addEventListener)document.addEventListener("DOMContentLoaded",a,!1),window.addEventListener("load",a,!1);else if(document.attachEvent){document.attachEvent("onreadystatechange",
a);window.attachEvent("onload",a);d=!1;try{d=!window.frameElement}catch(f){}document.documentElement.doScroll&&d&&b()}}}()},b=window.CKEDITOR_GETURL;if(b){var c=f.getUrl;f.getUrl=function(a){return b.call(f,a)||c.call(f,a)}}return f}());
CKEDITOR.event||(CKEDITOR.event=function(){},CKEDITOR.event.implementOn=function(a){var f=CKEDITOR.event.prototype,b;for(b in f)a[b]==null&&(a[b]=f[b])},CKEDITOR.event.prototype=function(){function a(a){var e=f(this);return e[a]||(e[a]=new b(a))}var f=function(a){a=a.getPrivate&&a.getPrivate()||a._||(a._={});return a.events||(a.events={})},b=function(a){this.name=a;this.listeners=[]};b.prototype={getListenerIndex:function(a){for(var e=0,d=this.listeners;e<d.length;e++)if(d[e].fn==a)return e;return-1}};
return{define:function(b,e){var d=a.call(this,b);CKEDITOR.tools.extend(d,e,true)},on:function(b,e,d,f,k){function j(a,m,y,s){a={name:b,sender:this,editor:a,data:m,listenerData:f,stop:y,cancel:s,removeListener:g};return e.call(d,a)===false?false:a.data}function g(){y.removeListener(b,e)}var m=a.call(this,b);if(m.getListenerIndex(e)<0){m=m.listeners;d||(d=this);isNaN(k)&&(k=10);var y=this;j.fn=e;j.priority=k;for(var s=m.length-1;s>=0;s--)if(m[s].priority<=k){m.splice(s+1,0,j);return{removeListener:g}}m.unshift(j)}return{removeListener:g}},
once:function(){var a=Array.prototype.slice.call(arguments),e=a[1];a[1]=function(a){a.removeListener();return e.apply(this,arguments)};return this.on.apply(this,a)},capture:function(){CKEDITOR.event.useCapture=1;var a=this.on.apply(this,arguments);CKEDITOR.event.useCapture=0;return a},fire:function(){var a=0,e=function(){a=1},d=0,b=function(){d=1};return function(k,j,g){var m=f(this)[k],k=a,y=d;a=d=0;if(m){var s=m.listeners;if(s.length)for(var s=s.slice(0),w,q=0;q<s.length;q++){if(m.errorProof)try{w=
s[q].call(this,g,j,e,b)}catch(t){}else w=s[q].call(this,g,j,e,b);w===false?d=1:typeof w!="undefined"&&(j=w);if(a||d)break}}j=d?false:typeof j=="undefined"?true:j;a=k;d=y;return j}}(),fireOnce:function(a,e,d){e=this.fire(a,e,d);delete f(this)[a];return e},removeListener:function(a,e){var d=f(this)[a];if(d){var b=d.getListenerIndex(e);b>=0&&d.listeners.splice(b,1)}},removeAllListeners:function(){var a=f(this),e;for(e in a)delete a[e]},hasListeners:function(a){return(a=f(this)[a])&&a.listeners.length>
0}}}());CKEDITOR.editor||(CKEDITOR.editor=function(){CKEDITOR._.pending.push([this,arguments]);CKEDITOR.event.call(this)},CKEDITOR.editor.prototype.fire=function(a,f){a in{instanceReady:1,loaded:1}&&(this[a]=true);return CKEDITOR.event.prototype.fire.call(this,a,f,this)},CKEDITOR.editor.prototype.fireOnce=function(a,f){a in{instanceReady:1,loaded:1}&&(this[a]=true);return CKEDITOR.event.prototype.fireOnce.call(this,a,f,this)},CKEDITOR.event.implementOn(CKEDITOR.editor.prototype));
CKEDITOR.env||(CKEDITOR.env=function(){var a=navigator.userAgent.toLowerCase(),f={ie:a.indexOf("trident/")>-1,webkit:a.indexOf(" applewebkit/")>-1,air:a.indexOf(" adobeair/")>-1,mac:a.indexOf("macintosh")>-1,quirks:document.compatMode=="BackCompat"&&(!document.documentMode||document.documentMode<10),mobile:a.indexOf("mobile")>-1,iOS:/(ipad|iphone|ipod)/.test(a),isCustomDomain:function(){if(!this.ie)return false;var a=document.domain,d=window.location.hostname;return a!=d&&a!="["+d+"]"},secure:location.protocol==
"https:"};f.gecko=navigator.product=="Gecko"&&!f.webkit&&!f.ie;if(f.webkit)a.indexOf("chrome")>-1?f.chrome=true:f.safari=true;var b=0;if(f.ie){b=f.quirks||!document.documentMode?parseFloat(a.match(/msie (\d+)/)[1]):document.documentMode;f.ie9Compat=b==9;f.ie8Compat=b==8;f.ie7Compat=b==7;f.ie6Compat=b<7||f.quirks}if(f.gecko){var c=a.match(/rv:([\d\.]+)/);if(c){c=c[1].split(".");b=c[0]*1E4+(c[1]||0)*100+(c[2]||0)*1}}f.air&&(b=parseFloat(a.match(/ adobeair\/(\d+)/)[1]));f.webkit&&(b=parseFloat(a.match(/ applewebkit\/(\d+)/)[1]));
f.version=b;f.isCompatible=f.iOS&&b>=534||!f.mobile&&(f.ie&&b>6||f.gecko&&b>=2E4||f.air&&b>=1||f.webkit&&b>=522||false);f.hidpi=window.devicePixelRatio>=2;f.needsBrFiller=f.gecko||f.webkit||f.ie&&b>10;f.needsNbspFiller=f.ie&&b<11;f.cssClass="cke_browser_"+(f.ie?"ie":f.gecko?"gecko":f.webkit?"webkit":"unknown");if(f.quirks)f.cssClass=f.cssClass+" cke_browser_quirks";if(f.ie)f.cssClass=f.cssClass+(" cke_browser_ie"+(f.quirks?"6 cke_browser_iequirks":f.version));if(f.air)f.cssClass=f.cssClass+" cke_browser_air";
if(f.iOS)f.cssClass=f.cssClass+" cke_browser_ios";if(f.hidpi)f.cssClass=f.cssClass+" cke_hidpi";return f}());
"unloaded"==CKEDITOR.status&&function(){CKEDITOR.event.implementOn(CKEDITOR);CKEDITOR.loadFullCore=function(){if(CKEDITOR.status!="basic_ready")CKEDITOR.loadFullCore._load=1;else{delete CKEDITOR.loadFullCore;var a=document.createElement("script");a.type="text/javascript";a.src=CKEDITOR.basePath+"ckeditor.js";document.getElementsByTagName("head")[0].appendChild(a)}};CKEDITOR.loadFullCoreTimeout=0;CKEDITOR.add=function(a){(this._.pending||(this._.pending=[])).push(a)};(function(){CKEDITOR.domReady(function(){var a=
CKEDITOR.loadFullCore,f=CKEDITOR.loadFullCoreTimeout;if(a){CKEDITOR.status="basic_ready";a&&a._load?a():f&&setTimeout(function(){CKEDITOR.loadFullCore&&CKEDITOR.loadFullCore()},f*1E3)}})})();CKEDITOR.status="basic_loaded"}();CKEDITOR.dom={};
(function(){var a=[],f=CKEDITOR.env.gecko?"-moz-":CKEDITOR.env.webkit?"-webkit-":CKEDITOR.env.ie?"-ms-":"",b=/&/g,c=/>/g,e=/</g,d=/"/g,h=/&amp;/g,k=/&gt;/g,j=/&lt;/g,g=/&quot;/g;CKEDITOR.on("reset",function(){a=[]});CKEDITOR.tools={arrayCompare:function(a,e){if(!a&&!e)return true;if(!a||!e||a.length!=e.length)return false;for(var d=0;d<a.length;d++)if(a[d]!=e[d])return false;return true},clone:function(a){var e;if(a&&a instanceof Array){e=[];for(var d=0;d<a.length;d++)e[d]=CKEDITOR.tools.clone(a[d]);
return e}if(a===null||typeof a!="object"||a instanceof String||a instanceof Number||a instanceof Boolean||a instanceof Date||a instanceof RegExp||a.nodeType||a.window===a)return a;e=new a.constructor;for(d in a)e[d]=CKEDITOR.tools.clone(a[d]);return e},capitalize:function(a,e){return a.charAt(0).toUpperCase()+(e?a.slice(1):a.slice(1).toLowerCase())},extend:function(a){var e=arguments.length,d,b;if(typeof(d=arguments[e-1])=="boolean")e--;else if(typeof(d=arguments[e-2])=="boolean"){b=arguments[e-1];
e=e-2}for(var c=1;c<e;c++){var f=arguments[c],i;for(i in f)if(d===true||a[i]==null)if(!b||i in b)a[i]=f[i]}return a},prototypedCopy:function(a){var e=function(){};e.prototype=a;return new e},copy:function(a){var e={},d;for(d in a)e[d]=a[d];return e},isArray:function(a){return Object.prototype.toString.call(a)=="[object Array]"},isEmpty:function(a){for(var e in a)if(a.hasOwnProperty(e))return false;return true},cssVendorPrefix:function(a,e,d){if(d)return f+a+":"+e+";"+a+":"+e;d={};d[a]=e;d[f+a]=e;
return d},cssStyleToDomStyle:function(){var a=document.createElement("div").style,e=typeof a.cssFloat!="undefined"?"cssFloat":typeof a.styleFloat!="undefined"?"styleFloat":"float";return function(a){return a=="float"?e:a.replace(/-./g,function(a){return a.substr(1).toUpperCase()})}}(),buildStyleHtml:function(a){for(var a=[].concat(a),e,d=[],b=0;b<a.length;b++)if(e=a[b])/@import|[{}]/.test(e)?d.push("<style>"+e+"</style>"):d.push('<link type="text/css" rel=stylesheet href="'+e+'">');return d.join("")},
htmlEncode:function(a){return(""+a).replace(b,"&amp;").replace(c,"&gt;").replace(e,"&lt;")},htmlDecode:function(a){return a.replace(h,"&").replace(k,">").replace(j,"<")},htmlEncodeAttr:function(a){return a.replace(d,"&quot;").replace(e,"&lt;").replace(c,"&gt;")},htmlDecodeAttr:function(a){return a.replace(g,'"').replace(j,"<").replace(k,">")},getNextNumber:function(){var a=0;return function(){return++a}}(),getNextId:function(){return"cke_"+this.getNextNumber()},override:function(a,e){var d=e(a);d.prototype=
a.prototype;return d},setTimeout:function(a,e,d,b,c){c||(c=window);d||(d=c);return c.setTimeout(function(){b?a.apply(d,[].concat(b)):a.apply(d)},e||0)},trim:function(){var a=/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;return function(e){return e.replace(a,"")}}(),ltrim:function(){var a=/^[ \t\n\r]+/g;return function(e){return e.replace(a,"")}}(),rtrim:function(){var a=/[ \t\n\r]+$/g;return function(e){return e.replace(a,"")}}(),indexOf:function(a,e){if(typeof e=="function")for(var d=0,b=a.length;d<b;d++){if(e(a[d]))return d}else{if(a.indexOf)return a.indexOf(e);
d=0;for(b=a.length;d<b;d++)if(a[d]===e)return d}return-1},search:function(a,e){var d=CKEDITOR.tools.indexOf(a,e);return d>=0?a[d]:null},bind:function(a,e){return function(){return a.apply(e,arguments)}},createClass:function(a){var e=a.$,d=a.base,b=a.privates||a._,c=a.proto,a=a.statics;!e&&(e=function(){d&&this.base.apply(this,arguments)});if(b)var f=e,e=function(){var a=this._||(this._={}),e;for(e in b){var d=b[e];a[e]=typeof d=="function"?CKEDITOR.tools.bind(d,this):d}f.apply(this,arguments)};if(d){e.prototype=
this.prototypedCopy(d.prototype);e.prototype.constructor=e;e.base=d;e.baseProto=d.prototype;e.prototype.base=function(){this.base=d.prototype.base;d.apply(this,arguments);this.base=arguments.callee}}c&&this.extend(e.prototype,c,true);a&&this.extend(e,a,true);return e},addFunction:function(e,d){return a.push(function(){return e.apply(d||this,arguments)})-1},removeFunction:function(e){a[e]=null},callFunction:function(e){var d=a[e];return d&&d.apply(window,Array.prototype.slice.call(arguments,1))},cssLength:function(){var a=
/^-?\d+\.?\d*px$/,e;return function(d){e=CKEDITOR.tools.trim(d+"")+"px";return a.test(e)?e:d||""}}(),convertToPx:function(){var a;return function(e){if(!a){a=CKEDITOR.dom.element.createFromHtml('<div style="position:absolute;left:-9999px;top:-9999px;margin:0px;padding:0px;border:0px;"></div>',CKEDITOR.document);CKEDITOR.document.getBody().append(a)}if(!/%$/.test(e)){a.setStyle("width",e);return a.$.clientWidth}return e}}(),repeat:function(a,e){return Array(e+1).join(a)},tryThese:function(){for(var a,
e=0,d=arguments.length;e<d;e++){var b=arguments[e];try{a=b();break}catch(c){}}return a},genKey:function(){return Array.prototype.slice.call(arguments).join("-")},defer:function(a){return function(){var e=arguments,d=this;window.setTimeout(function(){a.apply(d,e)},0)}},normalizeCssText:function(a,e){var d=[],b,c=CKEDITOR.tools.parseCssText(a,true,e);for(b in c)d.push(b+":"+c[b]);d.sort();return d.length?d.join(";")+";":""},convertRgbToHex:function(a){return a.replace(/(?:rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\))/gi,
function(a,e,d,b){a=[e,d,b];for(e=0;e<3;e++)a[e]=("0"+parseInt(a[e],10).toString(16)).slice(-2);return"#"+a.join("")})},parseCssText:function(a,e,d){var b={};if(d){d=new CKEDITOR.dom.element("span");d.setAttribute("style",a);a=CKEDITOR.tools.convertRgbToHex(d.getAttribute("style")||"")}if(!a||a==";")return b;a.replace(/&quot;/g,'"').replace(/\s*([^:;\s]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(a,d,m){if(e){d=d.toLowerCase();d=="font-family"&&(m=m.toLowerCase().replace(/["']/g,"").replace(/\s*,\s*/g,","));
m=CKEDITOR.tools.trim(m)}b[d]=m});return b},writeCssText:function(a,e){var d,b=[];for(d in a)b.push(d+":"+a[d]);e&&b.sort();return b.join("; ")},objectCompare:function(a,e,d){var b;if(!a&&!e)return true;if(!a||!e)return false;for(b in a)if(a[b]!=e[b])return false;if(!d)for(b in e)if(a[b]!=e[b])return false;return true},objectKeys:function(a){var e=[],d;for(d in a)e.push(d);return e},convertArrayToObject:function(a,e){var d={};arguments.length==1&&(e=true);for(var b=0,c=a.length;b<c;++b)d[a[b]]=e;
return d},fixDomain:function(){for(var a;;)try{a=window.parent.document.domain;break}catch(e){a=a?a.replace(/.+?(?:\.|$)/,""):document.domain;if(!a)break;document.domain=a}return!!a},eventsBuffer:function(a,e){function d(){c=(new Date).getTime();b=false;e()}var b,c=0;return{input:function(){if(!b){var e=(new Date).getTime()-c;e<a?b=setTimeout(d,a-e):d()}},reset:function(){b&&clearTimeout(b);b=c=0}}},enableHtml5Elements:function(a,e){for(var d=["abbr","article","aside","audio","bdi","canvas","data",
"datalist","details","figcaption","figure","footer","header","hgroup","mark","meter","nav","output","progress","section","summary","time","video"],b=d.length,c;b--;){c=a.createElement(d[b]);e&&a.appendChild(c)}},checkIfAnyArrayItemMatches:function(a,e){for(var d=0,b=a.length;d<b;++d)if(a[d].match(e))return true;return false},checkIfAnyObjectPropertyMatches:function(a,e){for(var d in a)if(d.match(e))return true;return false},transparentImageData:"data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="}})();
CKEDITOR.dtd=function(){var a=CKEDITOR.tools.extend,f=function(a,e){for(var d=CKEDITOR.tools.clone(a),b=1;b<arguments.length;b++){var e=arguments[b],c;for(c in e)delete d[c]}return d},b={},c={},e={address:1,article:1,aside:1,blockquote:1,details:1,div:1,dl:1,fieldset:1,figure:1,footer:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,header:1,hgroup:1,hr:1,main:1,menu:1,nav:1,ol:1,p:1,pre:1,section:1,table:1,ul:1},d={command:1,link:1,meta:1,noscript:1,script:1,style:1},h={},k={"#":1},j={center:1,dir:1,noframes:1};
a(b,{a:1,abbr:1,area:1,audio:1,b:1,bdi:1,bdo:1,br:1,button:1,canvas:1,cite:1,code:1,command:1,datalist:1,del:1,dfn:1,em:1,embed:1,i:1,iframe:1,img:1,input:1,ins:1,kbd:1,keygen:1,label:1,map:1,mark:1,meter:1,noscript:1,object:1,output:1,progress:1,q:1,ruby:1,s:1,samp:1,script:1,select:1,small:1,span:1,strong:1,sub:1,sup:1,textarea:1,time:1,u:1,"var":1,video:1,wbr:1},k,{acronym:1,applet:1,basefont:1,big:1,font:1,isindex:1,strike:1,style:1,tt:1});a(c,e,b,j);f={a:f(b,{a:1,button:1}),abbr:b,address:c,
area:h,article:c,aside:c,audio:a({source:1,track:1},c),b:b,base:h,bdi:b,bdo:b,blockquote:c,body:c,br:h,button:f(b,{a:1,button:1}),canvas:b,caption:c,cite:b,code:b,col:h,colgroup:{col:1},command:h,datalist:a({option:1},b),dd:c,del:b,details:a({summary:1},c),dfn:b,div:c,dl:{dt:1,dd:1},dt:c,em:b,embed:h,fieldset:a({legend:1},c),figcaption:c,figure:a({figcaption:1},c),footer:c,form:c,h1:b,h2:b,h3:b,h4:b,h5:b,h6:b,head:a({title:1,base:1},d),header:c,hgroup:{h1:1,h2:1,h3:1,h4:1,h5:1,h6:1},hr:h,html:a({head:1,
body:1},c,d),i:b,iframe:k,img:h,input:h,ins:b,kbd:b,keygen:h,label:b,legend:b,li:c,link:h,main:c,map:c,mark:b,menu:a({li:1},c),meta:h,meter:f(b,{meter:1}),nav:c,noscript:a({link:1,meta:1,style:1},b),object:a({param:1},b),ol:{li:1},optgroup:{option:1},option:k,output:b,p:b,param:h,pre:b,progress:f(b,{progress:1}),q:b,rp:b,rt:b,ruby:a({rp:1,rt:1},b),s:b,samp:b,script:k,section:c,select:{optgroup:1,option:1},small:b,source:h,span:b,strong:b,style:k,sub:b,summary:b,sup:b,table:{caption:1,colgroup:1,thead:1,
tfoot:1,tbody:1,tr:1},tbody:{tr:1},td:c,textarea:k,tfoot:{tr:1},th:c,thead:{tr:1},time:f(b,{time:1}),title:k,tr:{th:1,td:1},track:h,u:b,ul:{li:1},"var":b,video:a({source:1,track:1},c),wbr:h,acronym:b,applet:a({param:1},c),basefont:h,big:b,center:c,dialog:h,dir:{li:1},font:b,isindex:h,noframes:c,strike:b,tt:b};a(f,{$block:a({audio:1,dd:1,dt:1,figcaption:1,li:1,video:1},e,j),$blockLimit:{article:1,aside:1,audio:1,body:1,caption:1,details:1,dir:1,div:1,dl:1,fieldset:1,figcaption:1,figure:1,footer:1,
form:1,header:1,hgroup:1,main:1,menu:1,nav:1,ol:1,section:1,table:1,td:1,th:1,tr:1,ul:1,video:1},$cdata:{script:1,style:1},$editable:{address:1,article:1,aside:1,blockquote:1,body:1,details:1,div:1,fieldset:1,figcaption:1,footer:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,header:1,hgroup:1,main:1,nav:1,p:1,pre:1,section:1},$empty:{area:1,base:1,basefont:1,br:1,col:1,command:1,dialog:1,embed:1,hr:1,img:1,input:1,isindex:1,keygen:1,link:1,meta:1,param:1,source:1,track:1,wbr:1},$inline:b,$list:{dl:1,ol:1,
ul:1},$listItem:{dd:1,dt:1,li:1},$nonBodyContent:a({body:1,head:1,html:1},f.head),$nonEditable:{applet:1,audio:1,button:1,embed:1,iframe:1,map:1,object:1,option:1,param:1,script:1,textarea:1,video:1},$object:{applet:1,audio:1,button:1,hr:1,iframe:1,img:1,input:1,object:1,select:1,table:1,textarea:1,video:1},$removeEmpty:{abbr:1,acronym:1,b:1,bdi:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,mark:1,meter:1,output:1,q:1,ruby:1,s:1,samp:1,small:1,span:1,strike:1,strong:1,
sub:1,sup:1,time:1,tt:1,u:1,"var":1},$tabIndex:{a:1,area:1,button:1,input:1,object:1,select:1,textarea:1},$tableContent:{caption:1,col:1,colgroup:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1},$transparent:{a:1,audio:1,canvas:1,del:1,ins:1,map:1,noscript:1,object:1,video:1},$intermediate:{caption:1,colgroup:1,dd:1,dt:1,figcaption:1,legend:1,li:1,optgroup:1,option:1,rp:1,rt:1,summary:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1}});return f}();CKEDITOR.dom.event=function(a){this.$=a};
CKEDITOR.dom.event.prototype={getKey:function(){return this.$.keyCode||this.$.which},getKeystroke:function(){var a=this.getKey();if(this.$.ctrlKey||this.$.metaKey)a=a+CKEDITOR.CTRL;this.$.shiftKey&&(a=a+CKEDITOR.SHIFT);this.$.altKey&&(a=a+CKEDITOR.ALT);return a},preventDefault:function(a){var f=this.$;f.preventDefault?f.preventDefault():f.returnValue=false;a&&this.stopPropagation()},stopPropagation:function(){var a=this.$;a.stopPropagation?a.stopPropagation():a.cancelBubble=true},getTarget:function(){var a=
this.$.target||this.$.srcElement;return a?new CKEDITOR.dom.node(a):null},getPhase:function(){return this.$.eventPhase||2},getPageOffset:function(){var a=this.getTarget().getDocument().$;return{x:this.$.pageX||this.$.clientX+(a.documentElement.scrollLeft||a.body.scrollLeft),y:this.$.pageY||this.$.clientY+(a.documentElement.scrollTop||a.body.scrollTop)}}};CKEDITOR.CTRL=1114112;CKEDITOR.SHIFT=2228224;CKEDITOR.ALT=4456448;CKEDITOR.EVENT_PHASE_CAPTURING=1;CKEDITOR.EVENT_PHASE_AT_TARGET=2;
CKEDITOR.EVENT_PHASE_BUBBLING=3;CKEDITOR.dom.domObject=function(a){if(a)this.$=a};
CKEDITOR.dom.domObject.prototype=function(){var a=function(a,b){return function(c){typeof CKEDITOR!="undefined"&&a.fire(b,new CKEDITOR.dom.event(c))}};return{getPrivate:function(){var a;if(!(a=this.getCustomData("_")))this.setCustomData("_",a={});return a},on:function(f){var b=this.getCustomData("_cke_nativeListeners");if(!b){b={};this.setCustomData("_cke_nativeListeners",b)}if(!b[f]){b=b[f]=a(this,f);this.$.addEventListener?this.$.addEventListener(f,b,!!CKEDITOR.event.useCapture):this.$.attachEvent&&
this.$.attachEvent("on"+f,b)}return CKEDITOR.event.prototype.on.apply(this,arguments)},removeListener:function(a){CKEDITOR.event.prototype.removeListener.apply(this,arguments);if(!this.hasListeners(a)){var b=this.getCustomData("_cke_nativeListeners"),c=b&&b[a];if(c){this.$.removeEventListener?this.$.removeEventListener(a,c,false):this.$.detachEvent&&this.$.detachEvent("on"+a,c);delete b[a]}}},removeAllListeners:function(){var a=this.getCustomData("_cke_nativeListeners"),b;for(b in a){var c=a[b];this.$.detachEvent?
this.$.detachEvent("on"+b,c):this.$.removeEventListener&&this.$.removeEventListener(b,c,false);delete a[b]}CKEDITOR.event.prototype.removeAllListeners.call(this)}}}();
(function(a){var f={};CKEDITOR.on("reset",function(){f={}});a.equals=function(a){try{return a&&a.$===this.$}catch(c){return false}};a.setCustomData=function(a,c){var e=this.getUniqueId();(f[e]||(f[e]={}))[a]=c;return this};a.getCustomData=function(a){var c=this.$["data-cke-expando"];return(c=c&&f[c])&&a in c?c[a]:null};a.removeCustomData=function(a){var c=this.$["data-cke-expando"],c=c&&f[c],e,d;if(c){e=c[a];d=a in c;delete c[a]}return d?e:null};a.clearCustomData=function(){this.removeAllListeners();
var a=this.$["data-cke-expando"];a&&delete f[a]};a.getUniqueId=function(){return this.$["data-cke-expando"]||(this.$["data-cke-expando"]=CKEDITOR.tools.getNextNumber())};CKEDITOR.event.implementOn(a)})(CKEDITOR.dom.domObject.prototype);
CKEDITOR.dom.node=function(a){return a?new CKEDITOR.dom[a.nodeType==CKEDITOR.NODE_DOCUMENT?"document":a.nodeType==CKEDITOR.NODE_ELEMENT?"element":a.nodeType==CKEDITOR.NODE_TEXT?"text":a.nodeType==CKEDITOR.NODE_COMMENT?"comment":a.nodeType==CKEDITOR.NODE_DOCUMENT_FRAGMENT?"documentFragment":"domObject"](a):this};CKEDITOR.dom.node.prototype=new CKEDITOR.dom.domObject;CKEDITOR.NODE_ELEMENT=1;CKEDITOR.NODE_DOCUMENT=9;CKEDITOR.NODE_TEXT=3;CKEDITOR.NODE_COMMENT=8;CKEDITOR.NODE_DOCUMENT_FRAGMENT=11;
CKEDITOR.POSITION_IDENTICAL=0;CKEDITOR.POSITION_DISCONNECTED=1;CKEDITOR.POSITION_FOLLOWING=2;CKEDITOR.POSITION_PRECEDING=4;CKEDITOR.POSITION_IS_CONTAINED=8;CKEDITOR.POSITION_CONTAINS=16;
CKEDITOR.tools.extend(CKEDITOR.dom.node.prototype,{appendTo:function(a,f){a.append(this,f);return a},clone:function(a,f){var b=this.$.cloneNode(a),c=function(e){e["data-cke-expando"]&&(e["data-cke-expando"]=false);if(e.nodeType==CKEDITOR.NODE_ELEMENT){f||e.removeAttribute("id",false);if(a)for(var e=e.childNodes,d=0;d<e.length;d++)c(e[d])}};c(b);return new CKEDITOR.dom.node(b)},hasPrevious:function(){return!!this.$.previousSibling},hasNext:function(){return!!this.$.nextSibling},insertAfter:function(a){a.$.parentNode.insertBefore(this.$,
a.$.nextSibling);return a},insertBefore:function(a){a.$.parentNode.insertBefore(this.$,a.$);return a},insertBeforeMe:function(a){this.$.parentNode.insertBefore(a.$,this.$);return a},getAddress:function(a){for(var f=[],b=this.getDocument().$.documentElement,c=this.$;c&&c!=b;){var e=c.parentNode;e&&f.unshift(this.getIndex.call({$:c},a));c=e}return f},getDocument:function(){return new CKEDITOR.dom.document(this.$.ownerDocument||this.$.parentNode.ownerDocument)},getIndex:function(a){function f(a,e){var b=
e?a.nextSibling:a.previousSibling;return!b||b.nodeType!=CKEDITOR.NODE_TEXT?null:b.nodeValue?b:f(b,e)}var b=this.$,c=-1,e;if(!this.$.parentNode||a&&b.nodeType==CKEDITOR.NODE_TEXT&&!b.nodeValue&&!f(b)&&!f(b,true))return-1;do if(!a||!(b!=this.$&&b.nodeType==CKEDITOR.NODE_TEXT&&(e||!b.nodeValue))){c++;e=b.nodeType==CKEDITOR.NODE_TEXT}while(b=b.previousSibling);return c},getNextSourceNode:function(a,f,b){if(b&&!b.call)var c=b,b=function(a){return!a.equals(c)};var a=!a&&this.getFirst&&this.getFirst(),e;
if(!a){if(this.type==CKEDITOR.NODE_ELEMENT&&b&&b(this,true)===false)return null;a=this.getNext()}for(;!a&&(e=(e||this).getParent());){if(b&&b(e,true)===false)return null;a=e.getNext()}return!a||b&&b(a)===false?null:f&&f!=a.type?a.getNextSourceNode(false,f,b):a},getPreviousSourceNode:function(a,f,b){if(b&&!b.call)var c=b,b=function(a){return!a.equals(c)};var a=!a&&this.getLast&&this.getLast(),e;if(!a){if(this.type==CKEDITOR.NODE_ELEMENT&&b&&b(this,true)===false)return null;a=this.getPrevious()}for(;!a&&
(e=(e||this).getParent());){if(b&&b(e,true)===false)return null;a=e.getPrevious()}return!a||b&&b(a)===false?null:f&&a.type!=f?a.getPreviousSourceNode(false,f,b):a},getPrevious:function(a){var f=this.$,b;do b=(f=f.previousSibling)&&f.nodeType!=10&&new CKEDITOR.dom.node(f);while(b&&a&&!a(b));return b},getNext:function(a){var f=this.$,b;do b=(f=f.nextSibling)&&new CKEDITOR.dom.node(f);while(b&&a&&!a(b));return b},getParent:function(a){var f=this.$.parentNode;return f&&(f.nodeType==CKEDITOR.NODE_ELEMENT||
a&&f.nodeType==CKEDITOR.NODE_DOCUMENT_FRAGMENT)?new CKEDITOR.dom.node(f):null},getParents:function(a){var f=this,b=[];do b[a?"push":"unshift"](f);while(f=f.getParent());return b},getCommonAncestor:function(a){if(a.equals(this))return this;if(a.contains&&a.contains(this))return a;var f=this.contains?this:this.getParent();do if(f.contains(a))return f;while(f=f.getParent());return null},getPosition:function(a){var f=this.$,b=a.$;if(f.compareDocumentPosition)return f.compareDocumentPosition(b);if(f==
b)return CKEDITOR.POSITION_IDENTICAL;if(this.type==CKEDITOR.NODE_ELEMENT&&a.type==CKEDITOR.NODE_ELEMENT){if(f.contains){if(f.contains(b))return CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_PRECEDING;if(b.contains(f))return CKEDITOR.POSITION_IS_CONTAINED+CKEDITOR.POSITION_FOLLOWING}if("sourceIndex"in f)return f.sourceIndex<0||b.sourceIndex<0?CKEDITOR.POSITION_DISCONNECTED:f.sourceIndex<b.sourceIndex?CKEDITOR.POSITION_PRECEDING:CKEDITOR.POSITION_FOLLOWING}for(var f=this.getAddress(),a=a.getAddress(),
b=Math.min(f.length,a.length),c=0;c<=b-1;c++)if(f[c]!=a[c]){if(c<b)return f[c]<a[c]?CKEDITOR.POSITION_PRECEDING:CKEDITOR.POSITION_FOLLOWING;break}return f.length<a.length?CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_PRECEDING:CKEDITOR.POSITION_IS_CONTAINED+CKEDITOR.POSITION_FOLLOWING},getAscendant:function(a,f){var b=this.$,c,e;if(!f)b=b.parentNode;if(typeof a=="function"){e=true;c=a}else{e=false;c=function(e){e=typeof e.nodeName=="string"?e.nodeName.toLowerCase():"";return typeof a=="string"?e==
a:e in a}}for(;b;){if(c(e?new CKEDITOR.dom.node(b):b))return new CKEDITOR.dom.node(b);try{b=b.parentNode}catch(d){b=null}}return null},hasAscendant:function(a,f){var b=this.$;if(!f)b=b.parentNode;for(;b;){if(b.nodeName&&b.nodeName.toLowerCase()==a)return true;b=b.parentNode}return false},move:function(a,f){a.append(this.remove(),f)},remove:function(a){var f=this.$,b=f.parentNode;if(b){if(a)for(;a=f.firstChild;)b.insertBefore(f.removeChild(a),f);b.removeChild(f)}return this},replace:function(a){this.insertBefore(a);
a.remove()},trim:function(){this.ltrim();this.rtrim()},ltrim:function(){for(var a;this.getFirst&&(a=this.getFirst());){if(a.type==CKEDITOR.NODE_TEXT){var f=CKEDITOR.tools.ltrim(a.getText()),b=a.getLength();if(f){if(f.length<b){a.split(b-f.length);this.$.removeChild(this.$.firstChild)}}else{a.remove();continue}}break}},rtrim:function(){for(var a;this.getLast&&(a=this.getLast());){if(a.type==CKEDITOR.NODE_TEXT){var f=CKEDITOR.tools.rtrim(a.getText()),b=a.getLength();if(f){if(f.length<b){a.split(f.length);
this.$.lastChild.parentNode.removeChild(this.$.lastChild)}}else{a.remove();continue}}break}if(CKEDITOR.env.needsBrFiller)(a=this.$.lastChild)&&(a.type==1&&a.nodeName.toLowerCase()=="br")&&a.parentNode.removeChild(a)},isReadOnly:function(){var a=this;this.type!=CKEDITOR.NODE_ELEMENT&&(a=this.getParent());if(a&&typeof a.$.isContentEditable!="undefined")return!(a.$.isContentEditable||a.data("cke-editable"));for(;a;){if(a.data("cke-editable"))break;if(a.getAttribute("contentEditable")=="false")return true;
if(a.getAttribute("contentEditable")=="true")break;a=a.getParent()}return!a}});CKEDITOR.dom.window=function(a){CKEDITOR.dom.domObject.call(this,a)};CKEDITOR.dom.window.prototype=new CKEDITOR.dom.domObject;
CKEDITOR.tools.extend(CKEDITOR.dom.window.prototype,{focus:function(){this.$.focus()},getViewPaneSize:function(){var a=this.$.document,f=a.compatMode=="CSS1Compat";return{width:(f?a.documentElement.clientWidth:a.body.clientWidth)||0,height:(f?a.documentElement.clientHeight:a.body.clientHeight)||0}},getScrollPosition:function(){var a=this.$;if("pageXOffset"in a)return{x:a.pageXOffset||0,y:a.pageYOffset||0};a=a.document;return{x:a.documentElement.scrollLeft||a.body.scrollLeft||0,y:a.documentElement.scrollTop||
a.body.scrollTop||0}},getFrame:function(){var a=this.$.frameElement;return a?new CKEDITOR.dom.element.get(a):null}});CKEDITOR.dom.document=function(a){CKEDITOR.dom.domObject.call(this,a)};CKEDITOR.dom.document.prototype=new CKEDITOR.dom.domObject;
CKEDITOR.tools.extend(CKEDITOR.dom.document.prototype,{type:CKEDITOR.NODE_DOCUMENT,appendStyleSheet:function(a){if(this.$.createStyleSheet)this.$.createStyleSheet(a);else{var f=new CKEDITOR.dom.element("link");f.setAttributes({rel:"stylesheet",type:"text/css",href:a});this.getHead().append(f)}},appendStyleText:function(a){if(this.$.createStyleSheet){var f=this.$.createStyleSheet("");f.cssText=a}else{var b=new CKEDITOR.dom.element("style",this);b.append(new CKEDITOR.dom.text(a,this));this.getHead().append(b)}return f||
b.$.sheet},createElement:function(a,f){var b=new CKEDITOR.dom.element(a,this);if(f){f.attributes&&b.setAttributes(f.attributes);f.styles&&b.setStyles(f.styles)}return b},createText:function(a){return new CKEDITOR.dom.text(a,this)},focus:function(){this.getWindow().focus()},getActive:function(){var a;try{a=this.$.activeElement}catch(f){return null}return new CKEDITOR.dom.element(a)},getById:function(a){return(a=this.$.getElementById(a))?new CKEDITOR.dom.element(a):null},getByAddress:function(a,f){for(var b=
this.$.documentElement,c=0;b&&c<a.length;c++){var e=a[c];if(f)for(var d=-1,h=0;h<b.childNodes.length;h++){var k=b.childNodes[h];if(!(f===true&&k.nodeType==3&&k.previousSibling&&k.previousSibling.nodeType==3)){d++;if(d==e){b=k;break}}}else b=b.childNodes[e]}return b?new CKEDITOR.dom.node(b):null},getElementsByTag:function(a,f){!(CKEDITOR.env.ie&&document.documentMode<=8)&&f&&(a=f+":"+a);return new CKEDITOR.dom.nodeList(this.$.getElementsByTagName(a))},getHead:function(){var a=this.$.getElementsByTagName("head")[0];
return a=a?new CKEDITOR.dom.element(a):this.getDocumentElement().append(new CKEDITOR.dom.element("head"),true)},getBody:function(){return new CKEDITOR.dom.element(this.$.body)},getDocumentElement:function(){return new CKEDITOR.dom.element(this.$.documentElement)},getWindow:function(){return new CKEDITOR.dom.window(this.$.parentWindow||this.$.defaultView)},write:function(a){this.$.open("text/html","replace");CKEDITOR.env.ie&&(a=a.replace(/(?:^\s*<!DOCTYPE[^>]*?>)|^/i,'$&\n<script data-cke-temp="1">('+
CKEDITOR.tools.fixDomain+")();<\/script>"));this.$.write(a);this.$.close()},find:function(a){return new CKEDITOR.dom.nodeList(this.$.querySelectorAll(a))},findOne:function(a){return(a=this.$.querySelector(a))?new CKEDITOR.dom.element(a):null},_getHtml5ShivFrag:function(){var a=this.getCustomData("html5ShivFrag");if(!a){a=this.$.createDocumentFragment();CKEDITOR.tools.enableHtml5Elements(a,true);this.setCustomData("html5ShivFrag",a)}return a}});CKEDITOR.dom.nodeList=function(a){this.$=a};
CKEDITOR.dom.nodeList.prototype={count:function(){return this.$.length},getItem:function(a){if(a<0||a>=this.$.length)return null;return(a=this.$[a])?new CKEDITOR.dom.node(a):null}};CKEDITOR.dom.element=function(a,f){typeof a=="string"&&(a=(f?f.$:document).createElement(a));CKEDITOR.dom.domObject.call(this,a)};CKEDITOR.dom.element.get=function(a){return(a=typeof a=="string"?document.getElementById(a)||document.getElementsByName(a)[0]:a)&&(a.$?a:new CKEDITOR.dom.element(a))};
CKEDITOR.dom.element.prototype=new CKEDITOR.dom.node;CKEDITOR.dom.element.createFromHtml=function(a,f){var b=new CKEDITOR.dom.element("div",f);b.setHtml(a);return b.getFirst().remove()};
CKEDITOR.dom.element.setMarker=function(a,f,b,c){var e=f.getCustomData("list_marker_id")||f.setCustomData("list_marker_id",CKEDITOR.tools.getNextNumber()).getCustomData("list_marker_id"),d=f.getCustomData("list_marker_names")||f.setCustomData("list_marker_names",{}).getCustomData("list_marker_names");a[e]=f;d[b]=1;return f.setCustomData(b,c)};CKEDITOR.dom.element.clearAllMarkers=function(a){for(var f in a)CKEDITOR.dom.element.clearMarkers(a,a[f],1)};
CKEDITOR.dom.element.clearMarkers=function(a,f,b){var c=f.getCustomData("list_marker_names"),e=f.getCustomData("list_marker_id"),d;for(d in c)f.removeCustomData(d);f.removeCustomData("list_marker_names");if(b){f.removeCustomData("list_marker_id");delete a[e]}};
(function(){function a(a){var d=true;if(!a.$.id){a.$.id="cke_tmp_"+CKEDITOR.tools.getNextNumber();d=false}return function(){d||a.removeAttribute("id")}}function f(a,d){return"#"+a.$.id+" "+d.split(/,\s*/).join(", #"+a.$.id+" ")}function b(a){for(var d=0,b=0,f=c[a].length;b<f;b++)d=d+(parseInt(this.getComputedStyle(c[a][b])||0,10)||0);return d}CKEDITOR.tools.extend(CKEDITOR.dom.element.prototype,{type:CKEDITOR.NODE_ELEMENT,addClass:function(a){var d=this.$.className;d&&(RegExp("(?:^|\\s)"+a+"(?:\\s|$)",
"").test(d)||(d=d+(" "+a)));this.$.className=d||a;return this},removeClass:function(a){var d=this.getAttribute("class");if(d){a=RegExp("(?:^|\\s+)"+a+"(?=\\s|$)","i");if(a.test(d))(d=d.replace(a,"").replace(/^\s+/,""))?this.setAttribute("class",d):this.removeAttribute("class")}return this},hasClass:function(a){return RegExp("(?:^|\\s+)"+a+"(?=\\s|$)","").test(this.getAttribute("class"))},append:function(a,d){typeof a=="string"&&(a=this.getDocument().createElement(a));d?this.$.insertBefore(a.$,this.$.firstChild):
this.$.appendChild(a.$);return a},appendHtml:function(a){if(this.$.childNodes.length){var d=new CKEDITOR.dom.element("div",this.getDocument());d.setHtml(a);d.moveChildren(this)}else this.setHtml(a)},appendText:function(a){this.$.text!=null?this.$.text=this.$.text+a:this.append(new CKEDITOR.dom.text(a))},appendBogus:function(a){if(a||CKEDITOR.env.needsBrFiller){for(a=this.getLast();a&&a.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.rtrim(a.getText());)a=a.getPrevious();if(!a||!a.is||!a.is("br")){a=this.getDocument().createElement("br");
CKEDITOR.env.gecko&&a.setAttribute("type","_moz");this.append(a)}}},breakParent:function(a){var d=new CKEDITOR.dom.range(this.getDocument());d.setStartAfter(this);d.setEndAfter(a);a=d.extractContents();d.insertNode(this.remove());a.insertAfterNode(this)},contains:CKEDITOR.env.ie||CKEDITOR.env.webkit?function(a){var d=this.$;return a.type!=CKEDITOR.NODE_ELEMENT?d.contains(a.getParent().$):d!=a.$&&d.contains(a.$)}:function(a){return!!(this.$.compareDocumentPosition(a.$)&16)},focus:function(){function a(){try{this.$.focus()}catch(e){}}
return function(d){d?CKEDITOR.tools.setTimeout(a,100,this):a.call(this)}}(),getHtml:function(){var a=this.$.innerHTML;return CKEDITOR.env.ie?a.replace(/<\?[^>]*>/g,""):a},getOuterHtml:function(){if(this.$.outerHTML)return this.$.outerHTML.replace(/<\?[^>]*>/,"");var a=this.$.ownerDocument.createElement("div");a.appendChild(this.$.cloneNode(true));return a.innerHTML},getClientRect:function(){var a=CKEDITOR.tools.extend({},this.$.getBoundingClientRect());!a.width&&(a.width=a.right-a.left);!a.height&&
(a.height=a.bottom-a.top);return a},setHtml:CKEDITOR.env.ie&&CKEDITOR.env.version<9?function(a){try{var d=this.$;if(this.getParent())return d.innerHTML=a;var b=this.getDocument()._getHtml5ShivFrag();b.appendChild(d);d.innerHTML=a;b.removeChild(d);return a}catch(c){this.$.innerHTML="";d=new CKEDITOR.dom.element("body",this.getDocument());d.$.innerHTML=a;for(d=d.getChildren();d.count();)this.append(d.getItem(0));return a}}:function(a){return this.$.innerHTML=a},setText:function(){var a=document.createElement("p");
a.innerHTML="x";a=a.textContent;return function(d){this.$[a?"textContent":"innerText"]=d}}(),getAttribute:function(){var a=function(a){return this.$.getAttribute(a,2)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?function(a){switch(a){case "class":a="className";break;case "http-equiv":a="httpEquiv";break;case "name":return this.$.name;case "tabindex":a=this.$.getAttribute(a,2);a!==0&&this.$.tabIndex===0&&(a=null);return a;case "checked":a=this.$.attributes.getNamedItem(a);
return(a.specified?a.nodeValue:this.$.checked)?"checked":null;case "hspace":case "value":return this.$[a];case "style":return this.$.style.cssText;case "contenteditable":case "contentEditable":return this.$.attributes.getNamedItem("contentEditable").specified?this.$.getAttribute("contentEditable"):null}return this.$.getAttribute(a,2)}:a}(),getChildren:function(){return new CKEDITOR.dom.nodeList(this.$.childNodes)},getComputedStyle:CKEDITOR.env.ie?function(a){return this.$.currentStyle[CKEDITOR.tools.cssStyleToDomStyle(a)]}:
function(a){var d=this.getWindow().$.getComputedStyle(this.$,null);return d?d.getPropertyValue(a):""},getDtd:function(){var a=CKEDITOR.dtd[this.getName()];this.getDtd=function(){return a};return a},getElementsByTag:CKEDITOR.dom.document.prototype.getElementsByTag,getTabIndex:CKEDITOR.env.ie?function(){var a=this.$.tabIndex;a===0&&(!CKEDITOR.dtd.$tabIndex[this.getName()]&&parseInt(this.getAttribute("tabindex"),10)!==0)&&(a=-1);return a}:CKEDITOR.env.webkit?function(){var a=this.$.tabIndex;if(a===void 0){a=
parseInt(this.getAttribute("tabindex"),10);isNaN(a)&&(a=-1)}return a}:function(){return this.$.tabIndex},getText:function(){return this.$.textContent||this.$.innerText||""},getWindow:function(){return this.getDocument().getWindow()},getId:function(){return this.$.id||null},getNameAtt:function(){return this.$.name||null},getName:function(){var a=this.$.nodeName.toLowerCase();if(CKEDITOR.env.ie&&document.documentMode<=8){var d=this.$.scopeName;d!="HTML"&&(a=d.toLowerCase()+":"+a)}this.getName=function(){return a};
return this.getName()},getValue:function(){return this.$.value},getFirst:function(a){var d=this.$.firstChild;(d=d&&new CKEDITOR.dom.node(d))&&(a&&!a(d))&&(d=d.getNext(a));return d},getLast:function(a){var d=this.$.lastChild;(d=d&&new CKEDITOR.dom.node(d))&&(a&&!a(d))&&(d=d.getPrevious(a));return d},getStyle:function(a){return this.$.style[CKEDITOR.tools.cssStyleToDomStyle(a)]},is:function(){var a=this.getName();if(typeof arguments[0]=="object")return!!arguments[0][a];for(var d=0;d<arguments.length;d++)if(arguments[d]==
a)return true;return false},isEditable:function(a){var d=this.getName();if(this.isReadOnly()||this.getComputedStyle("display")=="none"||this.getComputedStyle("visibility")=="hidden"||CKEDITOR.dtd.$nonEditable[d]||CKEDITOR.dtd.$empty[d]||this.is("a")&&(this.data("cke-saved-name")||this.hasAttribute("name"))&&!this.getChildCount())return false;if(a!==false){a=CKEDITOR.dtd[d]||CKEDITOR.dtd.span;return!(!a||!a["#"])}return true},isIdentical:function(a){var d=this.clone(0,1),a=a.clone(0,1);d.removeAttributes(["_moz_dirty",
"data-cke-expando","data-cke-saved-href","data-cke-saved-name"]);a.removeAttributes(["_moz_dirty","data-cke-expando","data-cke-saved-href","data-cke-saved-name"]);if(d.$.isEqualNode){d.$.style.cssText=CKEDITOR.tools.normalizeCssText(d.$.style.cssText);a.$.style.cssText=CKEDITOR.tools.normalizeCssText(a.$.style.cssText);return d.$.isEqualNode(a.$)}d=d.getOuterHtml();a=a.getOuterHtml();if(CKEDITOR.env.ie&&CKEDITOR.env.version<9&&this.is("a")){var b=this.getParent();if(b.type==CKEDITOR.NODE_ELEMENT){b=
b.clone();b.setHtml(d);d=b.getHtml();b.setHtml(a);a=b.getHtml()}}return d==a},isVisible:function(){var a=(this.$.offsetHeight||this.$.offsetWidth)&&this.getComputedStyle("visibility")!="hidden",d,b;if(a&&CKEDITOR.env.webkit){d=this.getWindow();if(!d.equals(CKEDITOR.document.getWindow())&&(b=d.$.frameElement))a=(new CKEDITOR.dom.element(b)).isVisible()}return!!a},isEmptyInlineRemoveable:function(){if(!CKEDITOR.dtd.$removeEmpty[this.getName()])return false;for(var a=this.getChildren(),d=0,b=a.count();d<
b;d++){var c=a.getItem(d);if(!(c.type==CKEDITOR.NODE_ELEMENT&&c.data("cke-bookmark"))&&(c.type==CKEDITOR.NODE_ELEMENT&&!c.isEmptyInlineRemoveable()||c.type==CKEDITOR.NODE_TEXT&&CKEDITOR.tools.trim(c.getText())))return false}return true},hasAttributes:CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?function(){for(var a=this.$.attributes,d=0;d<a.length;d++){var b=a[d];switch(b.nodeName){case "class":if(this.getAttribute("class"))return true;case "data-cke-expando":continue;default:if(b.specified)return true}}return false}:
function(){var a=this.$.attributes,d=a.length,b={"data-cke-expando":1,_moz_dirty:1};return d>0&&(d>2||!b[a[0].nodeName]||d==2&&!b[a[1].nodeName])},hasAttribute:function(){function a(d){var e=this.$.attributes.getNamedItem(d);if(this.getName()=="input")switch(d){case "class":return this.$.className.length>0;case "checked":return!!this.$.checked;case "value":d=this.getAttribute("type");return d=="checkbox"||d=="radio"?this.$.value!="on":!!this.$.value}return!e?false:e.specified}return CKEDITOR.env.ie?
CKEDITOR.env.version<8?function(d){return d=="name"?!!this.$.name:a.call(this,d)}:a:function(a){return!!this.$.attributes.getNamedItem(a)}}(),hide:function(){this.setStyle("display","none")},moveChildren:function(a,d){var b=this.$,a=a.$;if(b!=a){var c;if(d)for(;c=b.lastChild;)a.insertBefore(b.removeChild(c),a.firstChild);else for(;c=b.firstChild;)a.appendChild(b.removeChild(c))}},mergeSiblings:function(){function a(d,b,e){if(b&&b.type==CKEDITOR.NODE_ELEMENT){for(var c=[];b.data("cke-bookmark")||b.isEmptyInlineRemoveable();){c.push(b);
b=e?b.getNext():b.getPrevious();if(!b||b.type!=CKEDITOR.NODE_ELEMENT)return}if(d.isIdentical(b)){for(var f=e?d.getLast():d.getFirst();c.length;)c.shift().move(d,!e);b.moveChildren(d,!e);b.remove();f&&f.type==CKEDITOR.NODE_ELEMENT&&f.mergeSiblings()}}}return function(d){if(d===false||CKEDITOR.dtd.$removeEmpty[this.getName()]||this.is("a")){a(this,this.getNext(),true);a(this,this.getPrevious())}}}(),show:function(){this.setStyles({display:"",visibility:""})},setAttribute:function(){var a=function(a,
b){this.$.setAttribute(a,b);return this};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?function(d,b){d=="class"?this.$.className=b:d=="style"?this.$.style.cssText=b:d=="tabindex"?this.$.tabIndex=b:d=="checked"?this.$.checked=b:d=="contenteditable"?a.call(this,"contentEditable",b):a.apply(this,arguments);return this}:CKEDITOR.env.ie8Compat&&CKEDITOR.env.secure?function(d,b){if(d=="src"&&b.match(/^http:\/\//))try{a.apply(this,arguments)}catch(c){}else a.apply(this,arguments);
return this}:a}(),setAttributes:function(a){for(var d in a)this.setAttribute(d,a[d]);return this},setValue:function(a){this.$.value=a;return this},removeAttribute:function(){var a=function(a){this.$.removeAttribute(a)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?function(a){a=="class"?a="className":a=="tabindex"?a="tabIndex":a=="contenteditable"&&(a="contentEditable");this.$.removeAttribute(a)}:a}(),removeAttributes:function(a){if(CKEDITOR.tools.isArray(a))for(var b=0;b<
a.length;b++)this.removeAttribute(a[b]);else for(b in a)a.hasOwnProperty(b)&&this.removeAttribute(b)},removeStyle:function(a){var b=this.$.style;if(!b.removeProperty&&(a=="border"||a=="margin"||a=="padding")){var c=["top","left","right","bottom"],f;a=="border"&&(f=["color","style","width"]);for(var b=[],j=0;j<c.length;j++)if(f)for(var g=0;g<f.length;g++)b.push([a,c[j],f[g]].join("-"));else b.push([a,c[j]].join("-"));for(a=0;a<b.length;a++)this.removeStyle(b[a])}else{b.removeProperty?b.removeProperty(a):
b.removeAttribute(CKEDITOR.tools.cssStyleToDomStyle(a));this.$.style.cssText||this.removeAttribute("style")}},setStyle:function(a,b){this.$.style[CKEDITOR.tools.cssStyleToDomStyle(a)]=b;return this},setStyles:function(a){for(var b in a)this.setStyle(b,a[b]);return this},setOpacity:function(a){if(CKEDITOR.env.ie&&CKEDITOR.env.version<9){a=Math.round(a*100);this.setStyle("filter",a>=100?"":"progid:DXImageTransform.Microsoft.Alpha(opacity="+a+")")}else this.setStyle("opacity",a)},unselectable:function(){this.setStyles(CKEDITOR.tools.cssVendorPrefix("user-select",
"none"));if(CKEDITOR.env.ie){this.setAttribute("unselectable","on");for(var a,b=this.getElementsByTag("*"),c=0,f=b.count();c<f;c++){a=b.getItem(c);a.setAttribute("unselectable","on")}}},getPositionedAncestor:function(){for(var a=this;a.getName()!="html";){if(a.getComputedStyle("position")!="static")return a;a=a.getParent()}return null},getDocumentPosition:function(a){var b=0,c=0,f=this.getDocument(),j=f.getBody(),g=CKEDITOR.env.quirks;if(document.documentElement.getBoundingClientRect){var m=this.$.getBoundingClientRect(),
y=f.$.documentElement,s=y.clientTop||j.$.clientTop||0,w=y.clientLeft||j.$.clientLeft||0,q=true;if(CKEDITOR.env.ie){q=f.getDocumentElement().contains(this);f=f.getBody().contains(this);q=g&&f||!g&&q}if(q){if(CKEDITOR.env.webkit){b=j.$.scrollLeft||y.scrollLeft;c=j.$.scrollTop||y.scrollTop}else{c=g?j.$:y;b=c.scrollLeft;c=c.scrollTop}b=m.left+b-w;c=m.top+c-s}}else{s=this;for(w=null;s&&!(s.getName()=="body"||s.getName()=="html");){b=b+(s.$.offsetLeft-s.$.scrollLeft);c=c+(s.$.offsetTop-s.$.scrollTop);if(!s.equals(this)){b=
b+(s.$.clientLeft||0);c=c+(s.$.clientTop||0)}for(;w&&!w.equals(s);){b=b-w.$.scrollLeft;c=c-w.$.scrollTop;w=w.getParent()}w=s;s=(m=s.$.offsetParent)?new CKEDITOR.dom.element(m):null}}if(a){m=this.getWindow();s=a.getWindow();if(!m.equals(s)&&m.$.frameElement){a=(new CKEDITOR.dom.element(m.$.frameElement)).getDocumentPosition(a);b=b+a.x;c=c+a.y}}if(!document.documentElement.getBoundingClientRect&&CKEDITOR.env.gecko&&!g){b=b+(this.$.clientLeft?1:0);c=c+(this.$.clientTop?1:0)}return{x:b,y:c}},scrollIntoView:function(a){var b=
this.getParent();if(b){do{(b.$.clientWidth&&b.$.clientWidth<b.$.scrollWidth||b.$.clientHeight&&b.$.clientHeight<b.$.scrollHeight)&&!b.is("body")&&this.scrollIntoParent(b,a,1);if(b.is("html")){var c=b.getWindow();try{var f=c.$.frameElement;f&&(b=new CKEDITOR.dom.element(f))}catch(j){}}}while(b=b.getParent())}},scrollIntoParent:function(a,b,c){var f,j,g,m;function y(b,d){if(/body|html/.test(a.getName()))a.getWindow().$.scrollBy(b,d);else{a.$.scrollLeft=a.$.scrollLeft+b;a.$.scrollTop=a.$.scrollTop+d}}
function s(a,b){var d={x:0,y:0};if(!a.is(q?"body":"html")){var c=a.$.getBoundingClientRect();d.x=c.left;d.y=c.top}c=a.getWindow();if(!c.equals(b)){c=s(CKEDITOR.dom.element.get(c.$.frameElement),b);d.x=d.x+c.x;d.y=d.y+c.y}return d}function w(a,b){return parseInt(a.getComputedStyle("margin-"+b)||0,10)||0}!a&&(a=this.getWindow());g=a.getDocument();var q=g.$.compatMode=="BackCompat";a instanceof CKEDITOR.dom.window&&(a=q?g.getBody():g.getDocumentElement());g=a.getWindow();j=s(this,g);var t=s(a,g),i=this.$.offsetHeight;
f=this.$.offsetWidth;var A=a.$.clientHeight,u=a.$.clientWidth;g=j.x-w(this,"left")-t.x||0;m=j.y-w(this,"top")-t.y||0;f=j.x+f+w(this,"right")-(t.x+u)||0;j=j.y+i+w(this,"bottom")-(t.y+A)||0;if(m<0||j>0)y(0,b===true?m:b===false?j:m<0?m:j);if(c&&(g<0||f>0))y(g<0?g:f,0)},setState:function(a,b,c){b=b||"cke";switch(a){case CKEDITOR.TRISTATE_ON:this.addClass(b+"_on");this.removeClass(b+"_off");this.removeClass(b+"_disabled");c&&this.setAttribute("aria-pressed",true);c&&this.removeAttribute("aria-disabled");
break;case CKEDITOR.TRISTATE_DISABLED:this.addClass(b+"_disabled");this.removeClass(b+"_off");this.removeClass(b+"_on");c&&this.setAttribute("aria-disabled",true);c&&this.removeAttribute("aria-pressed");break;default:this.addClass(b+"_off");this.removeClass(b+"_on");this.removeClass(b+"_disabled");c&&this.removeAttribute("aria-pressed");c&&this.removeAttribute("aria-disabled")}},getFrameDocument:function(){var a=this.$;try{a.contentWindow.document}catch(b){a.src=a.src}return a&&new CKEDITOR.dom.document(a.contentWindow.document)},
copyAttributes:function(a,b){for(var c=this.$.attributes,b=b||{},f=0;f<c.length;f++){var j=c[f],g=j.nodeName.toLowerCase(),m;if(!(g in b))if(g=="checked"&&(m=this.getAttribute(g)))a.setAttribute(g,m);else if(!CKEDITOR.env.ie||this.hasAttribute(g)){m=this.getAttribute(g);if(m===null)m=j.nodeValue;a.setAttribute(g,m)}}if(this.$.style.cssText!=="")a.$.style.cssText=this.$.style.cssText},renameNode:function(a){if(this.getName()!=a){var b=this.getDocument(),a=new CKEDITOR.dom.element(a,b);this.copyAttributes(a);
this.moveChildren(a);this.getParent()&&this.$.parentNode.replaceChild(a.$,this.$);a.$["data-cke-expando"]=this.$["data-cke-expando"];this.$=a.$;delete this.getName}},getChild:function(){function a(b,c){var e=b.childNodes;if(c>=0&&c<e.length)return e[c]}return function(b){var c=this.$;if(b.slice)for(;b.length>0&&c;)c=a(c,b.shift());else c=a(c,b);return c?new CKEDITOR.dom.node(c):null}}(),getChildCount:function(){return this.$.childNodes.length},disableContextMenu:function(){this.on("contextmenu",function(a){a.data.getTarget().hasClass("cke_enable_context_menu")||
a.data.preventDefault()})},getDirection:function(a){return a?this.getComputedStyle("direction")||this.getDirection()||this.getParent()&&this.getParent().getDirection(1)||this.getDocument().$.dir||"ltr":this.getStyle("direction")||this.getAttribute("dir")},data:function(a,b){a="data-"+a;if(b===void 0)return this.getAttribute(a);b===false?this.removeAttribute(a):this.setAttribute(a,b);return null},getEditor:function(){var a=CKEDITOR.instances,b,c;for(b in a){c=a[b];if(c.element.equals(this)&&c.elementMode!=
CKEDITOR.ELEMENT_MODE_APPENDTO)return c}return null},find:function(b){var c=a(this),b=new CKEDITOR.dom.nodeList(this.$.querySelectorAll(f(this,b)));c();return b},findOne:function(b){var c=a(this),b=this.$.querySelector(f(this,b));c();return b?new CKEDITOR.dom.element(b):null},forEach:function(a,b,c){if(!c&&(!b||this.type==b))var f=a(this);if(f!==false)for(var c=this.getChildren(),j=0;j<c.count();j++){f=c.getItem(j);f.type==CKEDITOR.NODE_ELEMENT?f.forEach(a,b):(!b||f.type==b)&&a(f)}}});var c={width:["border-left-width",
"border-right-width","padding-left","padding-right"],height:["border-top-width","border-bottom-width","padding-top","padding-bottom"]};CKEDITOR.dom.element.prototype.setSize=function(a,c,f){if(typeof c=="number"){if(f&&(!CKEDITOR.env.ie||!CKEDITOR.env.quirks))c=c-b.call(this,a);this.setStyle(a,c+"px")}};CKEDITOR.dom.element.prototype.getSize=function(a,c){var f=Math.max(this.$["offset"+CKEDITOR.tools.capitalize(a)],this.$["client"+CKEDITOR.tools.capitalize(a)])||0;c&&(f=f-b.call(this,a));return f}})();
CKEDITOR.dom.documentFragment=function(a){a=a||CKEDITOR.document;this.$=a.type==CKEDITOR.NODE_DOCUMENT?a.$.createDocumentFragment():a};
CKEDITOR.tools.extend(CKEDITOR.dom.documentFragment.prototype,CKEDITOR.dom.element.prototype,{type:CKEDITOR.NODE_DOCUMENT_FRAGMENT,insertAfterNode:function(a){a=a.$;a.parentNode.insertBefore(this.$,a.nextSibling)}},!0,{append:1,appendBogus:1,getFirst:1,getLast:1,getParent:1,getNext:1,getPrevious:1,appendTo:1,moveChildren:1,insertBefore:1,insertAfterNode:1,replace:1,trim:1,type:1,ltrim:1,rtrim:1,getDocument:1,getChildCount:1,getChild:1,getChildren:1});
(function(){function a(a,b){var c=this.range;if(this._.end)return null;if(!this._.start){this._.start=1;if(c.collapsed){this.end();return null}c.optimize()}var d,e=c.startContainer;d=c.endContainer;var m=c.startOffset,f=c.endOffset,h,o=this.guard,l=this.type,p=a?"getPreviousSourceNode":"getNextSourceNode";if(!a&&!this._.guardLTR){var r=d.type==CKEDITOR.NODE_ELEMENT?d:d.getParent(),n=d.type==CKEDITOR.NODE_ELEMENT?d.getChild(f):d.getNext();this._.guardLTR=function(a,b){return(!b||!r.equals(a))&&(!n||
!a.equals(n))&&(a.type!=CKEDITOR.NODE_ELEMENT||!b||!a.equals(c.root))}}if(a&&!this._.guardRTL){var g=e.type==CKEDITOR.NODE_ELEMENT?e:e.getParent(),C=e.type==CKEDITOR.NODE_ELEMENT?m?e.getChild(m-1):null:e.getPrevious();this._.guardRTL=function(a,b){return(!b||!g.equals(a))&&(!C||!a.equals(C))&&(a.type!=CKEDITOR.NODE_ELEMENT||!b||!a.equals(c.root))}}var j=a?this._.guardRTL:this._.guardLTR;h=o?function(a,b){return j(a,b)===false?false:o(a,b)}:j;if(this.current)d=this.current[p](false,l,h);else{if(a)d.type==
CKEDITOR.NODE_ELEMENT&&(d=f>0?d.getChild(f-1):h(d,true)===false?null:d.getPreviousSourceNode(true,l,h));else{d=e;if(d.type==CKEDITOR.NODE_ELEMENT&&!(d=d.getChild(m)))d=h(e,true)===false?null:e.getNextSourceNode(true,l,h)}d&&h(d)===false&&(d=null)}for(;d&&!this._.end;){this.current=d;if(!this.evaluator||this.evaluator(d)!==false){if(!b)return d}else if(b&&this.evaluator)return false;d=d[p](false,l,h)}this.end();return this.current=null}function f(b){for(var c,d=null;c=a.call(this,b);)d=c;return d}
function b(a){if(g(a))return false;if(a.type==CKEDITOR.NODE_TEXT)return true;if(a.type==CKEDITOR.NODE_ELEMENT){if(a.is(CKEDITOR.dtd.$inline)||a.is("hr")||a.getAttribute("contenteditable")=="false")return true;var b;if(b=!CKEDITOR.env.needsBrFiller)if(b=a.is(m))a:{b=0;for(var c=a.getChildCount();b<c;++b)if(!g(a.getChild(b))){b=false;break a}b=true}if(b)return true}return false}CKEDITOR.dom.walker=CKEDITOR.tools.createClass({$:function(a){this.range=a;this._={}},proto:{end:function(){this._.end=1},
next:function(){return a.call(this)},previous:function(){return a.call(this,1)},checkForward:function(){return a.call(this,0,1)!==false},checkBackward:function(){return a.call(this,1,1)!==false},lastForward:function(){return f.call(this)},lastBackward:function(){return f.call(this,1)},reset:function(){delete this.current;this._={}}}});var c={block:1,"list-item":1,table:1,"table-row-group":1,"table-header-group":1,"table-footer-group":1,"table-row":1,"table-column-group":1,"table-column":1,"table-cell":1,
"table-caption":1},e={absolute:1,fixed:1};CKEDITOR.dom.element.prototype.isBlockBoundary=function(a){return this.getComputedStyle("float")=="none"&&!(this.getComputedStyle("position")in e)&&c[this.getComputedStyle("display")]?true:!!(this.is(CKEDITOR.dtd.$block)||a&&this.is(a))};CKEDITOR.dom.walker.blockBoundary=function(a){return function(b){return!(b.type==CKEDITOR.NODE_ELEMENT&&b.isBlockBoundary(a))}};CKEDITOR.dom.walker.listItemBoundary=function(){return this.blockBoundary({br:1})};CKEDITOR.dom.walker.bookmark=
function(a,b){function c(a){return a&&a.getName&&a.getName()=="span"&&a.data("cke-bookmark")}return function(d){var e,m;e=d&&d.type!=CKEDITOR.NODE_ELEMENT&&(m=d.getParent())&&c(m);e=a?e:e||c(d);return!!(b^e)}};CKEDITOR.dom.walker.whitespaces=function(a){return function(b){var c;b&&b.type==CKEDITOR.NODE_TEXT&&(c=!CKEDITOR.tools.trim(b.getText())||CKEDITOR.env.webkit&&b.getText()=="​");return!!(a^c)}};CKEDITOR.dom.walker.invisible=function(a){var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.env.webkit?
1:0;return function(d){if(b(d))d=1;else{d.type==CKEDITOR.NODE_TEXT&&(d=d.getParent());d=d.$.offsetWidth<=c}return!!(a^d)}};CKEDITOR.dom.walker.nodeType=function(a,b){return function(c){return!!(b^c.type==a)}};CKEDITOR.dom.walker.bogus=function(a){function b(a){return!h(a)&&!k(a)}return function(c){var e=CKEDITOR.env.needsBrFiller?c.is&&c.is("br"):c.getText&&d.test(c.getText());if(e){e=c.getParent();c=c.getNext(b);e=e.isBlockBoundary()&&(!c||c.type==CKEDITOR.NODE_ELEMENT&&c.isBlockBoundary())}return!!(a^
e)}};CKEDITOR.dom.walker.temp=function(a){return function(b){b.type!=CKEDITOR.NODE_ELEMENT&&(b=b.getParent());b=b&&b.hasAttribute("data-cke-temp");return!!(a^b)}};var d=/^[\t\r\n ]*(?:&nbsp;|\xa0)$/,h=CKEDITOR.dom.walker.whitespaces(),k=CKEDITOR.dom.walker.bookmark(),j=CKEDITOR.dom.walker.temp();CKEDITOR.dom.walker.ignored=function(a){return function(b){b=h(b)||k(b)||j(b);return!!(a^b)}};var g=CKEDITOR.dom.walker.ignored(),m=function(a){var b={},c;for(c in a)CKEDITOR.dtd[c]["#"]&&(b[c]=1);return b}(CKEDITOR.dtd.$block);
CKEDITOR.dom.walker.editable=function(a){return function(c){return!!(a^b(c))}};CKEDITOR.dom.element.prototype.getBogus=function(){var a=this;do a=a.getPreviousSourceNode();while(k(a)||h(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.is(CKEDITOR.dtd.$inline)&&!a.is(CKEDITOR.dtd.$empty));return a&&(CKEDITOR.env.needsBrFiller?a.is&&a.is("br"):a.getText&&d.test(a.getText()))?a:false}})();
CKEDITOR.dom.range=function(a){this.endOffset=this.endContainer=this.startOffset=this.startContainer=null;this.collapsed=true;var f=a instanceof CKEDITOR.dom.document;this.document=f?a:a.getDocument();this.root=f?a.getBody():a};
(function(){function a(){var a=false,b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(true),e=CKEDITOR.dom.walker.bogus();return function(f){if(c(f)||b(f))return true;if(e(f)&&!a)return a=true;return f.type==CKEDITOR.NODE_TEXT&&(f.hasAscendant("pre")||CKEDITOR.tools.trim(f.getText()).length)||f.type==CKEDITOR.NODE_ELEMENT&&!f.is(d)?false:true}}function f(a){var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(1);return function(d){return c(d)||b(d)?true:!a&&h(d)||
d.type==CKEDITOR.NODE_ELEMENT&&d.is(CKEDITOR.dtd.$removeEmpty)}}function b(a){return function(){var b;return this[a?"getPreviousNode":"getNextNode"](function(a){!b&&g(a)&&(b=a);return j(a)&&!(h(a)&&a.equals(b))})}}var c=function(a){a.collapsed=a.startContainer&&a.endContainer&&a.startContainer.equals(a.endContainer)&&a.startOffset==a.endOffset},e=function(a,b,c,d){a.optimizeBookmark();var e=a.startContainer,f=a.endContainer,i=a.startOffset,A=a.endOffset,h,o;if(f.type==CKEDITOR.NODE_TEXT)f=f.split(A);
else if(f.getChildCount()>0)if(A>=f.getChildCount()){f=f.append(a.document.createText(""));o=true}else f=f.getChild(A);if(e.type==CKEDITOR.NODE_TEXT){e.split(i);e.equals(f)&&(f=e.getNext())}else if(i)if(i>=e.getChildCount()){e=e.append(a.document.createText(""));h=true}else e=e.getChild(i).getPrevious();else{e=e.append(a.document.createText(""),1);h=true}var i=e.getParents(),A=f.getParents(),l,p,r;for(l=0;l<i.length;l++){p=i[l];r=A[l];if(!p.equals(r))break}for(var n=c,g,C,j,F=l;F<i.length;F++){g=
i[F];n&&!g.equals(e)&&(C=n.append(g.clone()));for(g=g.getNext();g;){if(g.equals(A[F])||g.equals(f))break;j=g.getNext();if(b==2)n.append(g.clone(true));else{g.remove();b==1&&n.append(g)}g=j}n&&(n=C)}n=c;for(c=l;c<A.length;c++){g=A[c];b>0&&!g.equals(f)&&(C=n.append(g.clone()));if(!i[c]||g.$.parentNode!=i[c].$.parentNode)for(g=g.getPrevious();g;){if(g.equals(i[c])||g.equals(e))break;j=g.getPrevious();if(b==2)n.$.insertBefore(g.$.cloneNode(true),n.$.firstChild);else{g.remove();b==1&&n.$.insertBefore(g.$,
n.$.firstChild)}g=j}n&&(n=C)}if(b==2){p=a.startContainer;if(p.type==CKEDITOR.NODE_TEXT){p.$.data=p.$.data+p.$.nextSibling.data;p.$.parentNode.removeChild(p.$.nextSibling)}a=a.endContainer;if(a.type==CKEDITOR.NODE_TEXT&&a.$.nextSibling){a.$.data=a.$.data+a.$.nextSibling.data;a.$.parentNode.removeChild(a.$.nextSibling)}}else{if(p&&r&&(e.$.parentNode!=p.$.parentNode||f.$.parentNode!=r.$.parentNode)){b=r.getIndex();h&&r.$.parentNode==e.$.parentNode&&b--;if(d&&p.type==CKEDITOR.NODE_ELEMENT){d=CKEDITOR.dom.element.createFromHtml('<span data-cke-bookmark="1" style="display:none">&nbsp;</span>',
a.document);d.insertAfter(p);p.mergeSiblings(false);a.moveToBookmark({startNode:d})}else a.setStart(r.getParent(),b)}a.collapse(true)}h&&e.remove();o&&f.$.parentNode&&f.remove()},d={abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,"var":1},h=CKEDITOR.dom.walker.bogus(),k=/^[\t\r\n ]*(?:&nbsp;|\xa0)$/,j=CKEDITOR.dom.walker.editable(),g=CKEDITOR.dom.walker.ignored(true);CKEDITOR.dom.range.prototype=
{clone:function(){var a=new CKEDITOR.dom.range(this.root);a._setStartContainer(this.startContainer);a.startOffset=this.startOffset;a._setEndContainer(this.endContainer);a.endOffset=this.endOffset;a.collapsed=this.collapsed;return a},collapse:function(a){if(a){this._setEndContainer(this.startContainer);this.endOffset=this.startOffset}else{this._setStartContainer(this.endContainer);this.startOffset=this.endOffset}this.collapsed=true},cloneContents:function(){var a=new CKEDITOR.dom.documentFragment(this.document);
this.collapsed||e(this,2,a);return a},deleteContents:function(a){this.collapsed||e(this,0,null,a)},extractContents:function(a){var b=new CKEDITOR.dom.documentFragment(this.document);this.collapsed||e(this,1,b,a);return b},createBookmark:function(a){var b,c,d,e,f=this.collapsed;b=this.document.createElement("span");b.data("cke-bookmark",1);b.setStyle("display","none");b.setHtml("&nbsp;");if(a){d="cke_bm_"+CKEDITOR.tools.getNextNumber();b.setAttribute("id",d+(f?"C":"S"))}if(!f){c=b.clone();c.setHtml("&nbsp;");
a&&c.setAttribute("id",d+"E");e=this.clone();e.collapse();e.insertNode(c)}e=this.clone();e.collapse(true);e.insertNode(b);if(c){this.setStartAfter(b);this.setEndBefore(c)}else this.moveToPosition(b,CKEDITOR.POSITION_AFTER_END);return{startNode:a?d+(f?"C":"S"):b,endNode:a?d+"E":c,serializable:a,collapsed:f}},createBookmark2:function(){function a(c){var d=c.container,e=c.offset,f;f=d;var m=e;f=f.type!=CKEDITOR.NODE_ELEMENT||m===0||m==f.getChildCount()?0:f.getChild(m-1).type==CKEDITOR.NODE_TEXT&&f.getChild(m).type==
CKEDITOR.NODE_TEXT;if(f){d=d.getChild(e-1);e=d.getLength()}d.type==CKEDITOR.NODE_ELEMENT&&e>1&&(e=d.getChild(e-1).getIndex(true)+1);if(d.type==CKEDITOR.NODE_TEXT){f=d;for(m=0;(f=f.getPrevious())&&f.type==CKEDITOR.NODE_TEXT;)m=m+f.getLength();f=m;if(d.getText())e=e+f;else{m=d.getPrevious(b);if(f){e=f;d=m?m.getNext():d.getParent().getFirst()}else{d=d.getParent();e=m?m.getIndex(true)+1:0}}}c.container=d;c.offset=e}var b=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_TEXT,true);return function(b){var c=this.collapsed,
d={container:this.startContainer,offset:this.startOffset},e={container:this.endContainer,offset:this.endOffset};if(b){a(d);c||a(e)}return{start:d.container.getAddress(b),end:c?null:e.container.getAddress(b),startOffset:d.offset,endOffset:e.offset,normalized:b,collapsed:c,is2:true}}}(),moveToBookmark:function(a){if(a.is2){var b=this.document.getByAddress(a.start,a.normalized),c=a.startOffset,d=a.end&&this.document.getByAddress(a.end,a.normalized),a=a.endOffset;this.setStart(b,c);d?this.setEnd(d,a):
this.collapse(true)}else{b=(c=a.serializable)?this.document.getById(a.startNode):a.startNode;a=c?this.document.getById(a.endNode):a.endNode;this.setStartBefore(b);b.remove();if(a){this.setEndBefore(a);a.remove()}else this.collapse(true)}},getBoundaryNodes:function(){var a=this.startContainer,b=this.endContainer,c=this.startOffset,d=this.endOffset,e;if(a.type==CKEDITOR.NODE_ELEMENT){e=a.getChildCount();if(e>c)a=a.getChild(c);else if(e<1)a=a.getPreviousSourceNode();else{for(a=a.$;a.lastChild;)a=a.lastChild;
a=new CKEDITOR.dom.node(a);a=a.getNextSourceNode()||a}}if(b.type==CKEDITOR.NODE_ELEMENT){e=b.getChildCount();if(e>d)b=b.getChild(d).getPreviousSourceNode(true);else if(e<1)b=b.getPreviousSourceNode();else{for(b=b.$;b.lastChild;)b=b.lastChild;b=new CKEDITOR.dom.node(b)}}a.getPosition(b)&CKEDITOR.POSITION_FOLLOWING&&(a=b);return{startNode:a,endNode:b}},getCommonAncestor:function(a,b){var c=this.startContainer,d=this.endContainer,c=c.equals(d)?a&&c.type==CKEDITOR.NODE_ELEMENT&&this.startOffset==this.endOffset-
1?c.getChild(this.startOffset):c:c.getCommonAncestor(d);return b&&!c.is?c.getParent():c},optimize:function(){var a=this.startContainer,b=this.startOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=a.getLength()&&this.setStartAfter(a):this.setStartBefore(a));a=this.endContainer;b=this.endOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=a.getLength()&&this.setEndAfter(a):this.setEndBefore(a))},optimizeBookmark:function(){var a=this.startContainer,b=this.endContainer;a.is&&(a.is("span")&&a.data("cke-bookmark"))&&
this.setStartAt(a,CKEDITOR.POSITION_BEFORE_START);b&&(b.is&&b.is("span")&&b.data("cke-bookmark"))&&this.setEndAt(b,CKEDITOR.POSITION_AFTER_END)},trim:function(a,b){var c=this.startContainer,d=this.startOffset,e=this.collapsed;if((!a||e)&&c&&c.type==CKEDITOR.NODE_TEXT){if(d)if(d>=c.getLength()){d=c.getIndex()+1;c=c.getParent()}else{var f=c.split(d),d=c.getIndex()+1,c=c.getParent();if(this.startContainer.equals(this.endContainer))this.setEnd(f,this.endOffset-this.startOffset);else if(c.equals(this.endContainer))this.endOffset=
this.endOffset+1}else{d=c.getIndex();c=c.getParent()}this.setStart(c,d);if(e){this.collapse(true);return}}c=this.endContainer;d=this.endOffset;if(!b&&!e&&c&&c.type==CKEDITOR.NODE_TEXT){if(d){d>=c.getLength()||c.split(d);d=c.getIndex()+1}else d=c.getIndex();c=c.getParent();this.setEnd(c,d)}},enlarge:function(a,b){function c(a){return a&&a.type==CKEDITOR.NODE_ELEMENT&&a.hasAttribute("contenteditable")?null:a}var d=RegExp(/[^\s\ufeff]/);switch(a){case CKEDITOR.ENLARGE_INLINE:var e=1;case CKEDITOR.ENLARGE_ELEMENT:if(this.collapsed)break;
var f=this.getCommonAncestor(),i=this.root,h,g,o,l,p,r=false,n,j;n=this.startContainer;var C=this.startOffset;if(n.type==CKEDITOR.NODE_TEXT){if(C){n=!CKEDITOR.tools.trim(n.substring(0,C)).length&&n;r=!!n}if(n&&!(l=n.getPrevious()))o=n.getParent()}else{C&&(l=n.getChild(C-1)||n.getLast());l||(o=n)}for(o=c(o);o||l;){if(o&&!l){!p&&o.equals(f)&&(p=true);if(e?o.isBlockBoundary():!i.contains(o))break;if(!r||o.getComputedStyle("display")!="inline"){r=false;p?h=o:this.setStartBefore(o)}l=o.getPrevious()}for(;l;){n=
false;if(l.type==CKEDITOR.NODE_COMMENT)l=l.getPrevious();else{if(l.type==CKEDITOR.NODE_TEXT){j=l.getText();d.test(j)&&(l=null);n=/[\s\ufeff]$/.test(j)}else if((l.$.offsetWidth>(CKEDITOR.env.webkit?1:0)||b&&l.is("br"))&&!l.data("cke-bookmark"))if(r&&CKEDITOR.dtd.$removeEmpty[l.getName()]){j=l.getText();if(d.test(j))l=null;else for(var C=l.$.getElementsByTagName("*"),k=0,F;F=C[k++];)if(!CKEDITOR.dtd.$removeEmpty[F.nodeName.toLowerCase()]){l=null;break}l&&(n=!!j.length)}else l=null;n&&(r?p?h=o:o&&this.setStartBefore(o):
r=true);if(l){n=l.getPrevious();if(!o&&!n){o=l;l=null;break}l=n}else o=null}}o&&(o=c(o.getParent()))}n=this.endContainer;C=this.endOffset;o=l=null;p=r=false;var K=function(a,b){var c=new CKEDITOR.dom.range(i);c.setStart(a,b);c.setEndAt(i,CKEDITOR.POSITION_BEFORE_END);var c=new CKEDITOR.dom.walker(c),e;for(c.guard=function(a){return!(a.type==CKEDITOR.NODE_ELEMENT&&a.isBlockBoundary())};e=c.next();){if(e.type!=CKEDITOR.NODE_TEXT)return false;j=e!=a?e.getText():e.substring(b);if(d.test(j))return false}return true};
if(n.type==CKEDITOR.NODE_TEXT)if(CKEDITOR.tools.trim(n.substring(C)).length)r=true;else{r=!n.getLength();if(C==n.getLength()){if(!(l=n.getNext()))o=n.getParent()}else K(n,C)&&(o=n.getParent())}else(l=n.getChild(C))||(o=n);for(;o||l;){if(o&&!l){!p&&o.equals(f)&&(p=true);if(e?o.isBlockBoundary():!i.contains(o))break;if(!r||o.getComputedStyle("display")!="inline"){r=false;p?g=o:o&&this.setEndAfter(o)}l=o.getNext()}for(;l;){n=false;if(l.type==CKEDITOR.NODE_TEXT){j=l.getText();K(l,0)||(l=null);n=/^[\s\ufeff]/.test(j)}else if(l.type==
CKEDITOR.NODE_ELEMENT){if((l.$.offsetWidth>0||b&&l.is("br"))&&!l.data("cke-bookmark"))if(r&&CKEDITOR.dtd.$removeEmpty[l.getName()]){j=l.getText();if(d.test(j))l=null;else{C=l.$.getElementsByTagName("*");for(k=0;F=C[k++];)if(!CKEDITOR.dtd.$removeEmpty[F.nodeName.toLowerCase()]){l=null;break}}l&&(n=!!j.length)}else l=null}else n=1;n&&r&&(p?g=o:this.setEndAfter(o));if(l){n=l.getNext();if(!o&&!n){o=l;l=null;break}l=n}else o=null}o&&(o=c(o.getParent()))}if(h&&g){f=h.contains(g)?g:h;this.setStartBefore(f);
this.setEndAfter(f)}break;case CKEDITOR.ENLARGE_BLOCK_CONTENTS:case CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:o=new CKEDITOR.dom.range(this.root);i=this.root;o.setStartAt(i,CKEDITOR.POSITION_AFTER_START);o.setEnd(this.startContainer,this.startOffset);o=new CKEDITOR.dom.walker(o);var I,v,G=CKEDITOR.dom.walker.blockBoundary(a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS?{br:1}:null),z=null,B=function(a){if(a.type==CKEDITOR.NODE_ELEMENT&&a.getAttribute("contenteditable")=="false")if(z){if(z.equals(a)){z=null;return}}else z=
a;else if(z)return;var b=G(a);b||(I=a);return b},e=function(a){var b=B(a);!b&&(a.is&&a.is("br"))&&(v=a);return b};o.guard=B;o=o.lastBackward();I=I||i;this.setStartAt(I,!I.is("br")&&(!o&&this.checkStartOfBlock()||o&&I.contains(o))?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_AFTER_END);if(a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS){o=this.clone();o=new CKEDITOR.dom.walker(o);var x=CKEDITOR.dom.walker.whitespaces(),E=CKEDITOR.dom.walker.bookmark();o.evaluator=function(a){return!x(a)&&!E(a)};if((o=o.previous())&&
o.type==CKEDITOR.NODE_ELEMENT&&o.is("br"))break}o=this.clone();o.collapse();o.setEndAt(i,CKEDITOR.POSITION_BEFORE_END);o=new CKEDITOR.dom.walker(o);o.guard=a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS?e:B;I=z=v=null;o=o.lastForward();I=I||i;this.setEndAt(I,!o&&this.checkEndOfBlock()||o&&I.contains(o)?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_BEFORE_START);v&&this.setEndAfter(v)}},shrink:function(a,b,c){if(!this.collapsed){var a=a||CKEDITOR.SHRINK_TEXT,d=this.clone(),e=this.startContainer,f=this.endContainer,
i=this.startOffset,h=this.endOffset,g=1,o=1;if(e&&e.type==CKEDITOR.NODE_TEXT)if(i)if(i>=e.getLength())d.setStartAfter(e);else{d.setStartBefore(e);g=0}else d.setStartBefore(e);if(f&&f.type==CKEDITOR.NODE_TEXT)if(h)if(h>=f.getLength())d.setEndAfter(f);else{d.setEndAfter(f);o=0}else d.setEndBefore(f);var d=new CKEDITOR.dom.walker(d),l=CKEDITOR.dom.walker.bookmark();d.evaluator=function(b){return b.type==(a==CKEDITOR.SHRINK_ELEMENT?CKEDITOR.NODE_ELEMENT:CKEDITOR.NODE_TEXT)};var p;d.guard=function(b,d){if(l(b))return true;
if(a==CKEDITOR.SHRINK_ELEMENT&&b.type==CKEDITOR.NODE_TEXT||d&&b.equals(p)||c===false&&b.type==CKEDITOR.NODE_ELEMENT&&b.isBlockBoundary()||b.type==CKEDITOR.NODE_ELEMENT&&b.hasAttribute("contenteditable"))return false;!d&&b.type==CKEDITOR.NODE_ELEMENT&&(p=b);return true};if(g)(e=d[a==CKEDITOR.SHRINK_ELEMENT?"lastForward":"next"]())&&this.setStartAt(e,b?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_START);if(o){d.reset();(d=d[a==CKEDITOR.SHRINK_ELEMENT?"lastBackward":"previous"]())&&this.setEndAt(d,
b?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_END)}return!(!g&&!o)}},insertNode:function(a){this.optimizeBookmark();this.trim(false,true);var b=this.startContainer,c=b.getChild(this.startOffset);c?a.insertBefore(c):b.append(a);a.getParent()&&a.getParent().equals(this.endContainer)&&this.endOffset++;this.setStartBefore(a)},moveToPosition:function(a,b){this.setStartAt(a,b);this.collapse(true)},moveToRange:function(a){this.setStart(a.startContainer,a.startOffset);this.setEnd(a.endContainer,
a.endOffset)},selectNodeContents:function(a){this.setStart(a,0);this.setEnd(a,a.type==CKEDITOR.NODE_TEXT?a.getLength():a.getChildCount())},setStart:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[a.getName()]){b=a.getIndex();a=a.getParent()}this._setStartContainer(a);this.startOffset=b;if(!this.endContainer){this._setEndContainer(a);this.endOffset=b}c(this)},setEnd:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[a.getName()]){b=a.getIndex()+1;a=a.getParent()}this._setEndContainer(a);
this.endOffset=b;if(!this.startContainer){this._setStartContainer(a);this.startOffset=b}c(this)},setStartAfter:function(a){this.setStart(a.getParent(),a.getIndex()+1)},setStartBefore:function(a){this.setStart(a.getParent(),a.getIndex())},setEndAfter:function(a){this.setEnd(a.getParent(),a.getIndex()+1)},setEndBefore:function(a){this.setEnd(a.getParent(),a.getIndex())},setStartAt:function(a,b){switch(b){case CKEDITOR.POSITION_AFTER_START:this.setStart(a,0);break;case CKEDITOR.POSITION_BEFORE_END:a.type==
CKEDITOR.NODE_TEXT?this.setStart(a,a.getLength()):this.setStart(a,a.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setStartBefore(a);break;case CKEDITOR.POSITION_AFTER_END:this.setStartAfter(a)}c(this)},setEndAt:function(a,b){switch(b){case CKEDITOR.POSITION_AFTER_START:this.setEnd(a,0);break;case CKEDITOR.POSITION_BEFORE_END:a.type==CKEDITOR.NODE_TEXT?this.setEnd(a,a.getLength()):this.setEnd(a,a.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setEndBefore(a);break;
case CKEDITOR.POSITION_AFTER_END:this.setEndAfter(a)}c(this)},fixBlock:function(a,b){var c=this.createBookmark(),d=this.document.createElement(b);this.collapse(a);this.enlarge(CKEDITOR.ENLARGE_BLOCK_CONTENTS);this.extractContents().appendTo(d);d.trim();d.appendBogus();this.insertNode(d);this.moveToBookmark(c);return d},splitBlock:function(a){var b=new CKEDITOR.dom.elementPath(this.startContainer,this.root),c=new CKEDITOR.dom.elementPath(this.endContainer,this.root),d=b.block,e=c.block,f=null;if(!b.blockLimit.equals(c.blockLimit))return null;
if(a!="br"){if(!d){d=this.fixBlock(true,a);e=(new CKEDITOR.dom.elementPath(this.endContainer,this.root)).block}e||(e=this.fixBlock(false,a))}a=d&&this.checkStartOfBlock();b=e&&this.checkEndOfBlock();this.deleteContents();if(d&&d.equals(e))if(b){f=new CKEDITOR.dom.elementPath(this.startContainer,this.root);this.moveToPosition(e,CKEDITOR.POSITION_AFTER_END);e=null}else if(a){f=new CKEDITOR.dom.elementPath(this.startContainer,this.root);this.moveToPosition(d,CKEDITOR.POSITION_BEFORE_START);d=null}else{e=
this.splitElement(d);d.is("ul","ol")||d.appendBogus()}return{previousBlock:d,nextBlock:e,wasStartOfBlock:a,wasEndOfBlock:b,elementPath:f}},splitElement:function(a){if(!this.collapsed)return null;this.setEndAt(a,CKEDITOR.POSITION_BEFORE_END);var b=this.extractContents(),c=a.clone(false);b.appendTo(c);c.insertAfter(a);this.moveToPosition(a,CKEDITOR.POSITION_AFTER_END);return c},removeEmptyBlocksAtEnd:function(){function a(d){return function(a){return b(a)||(c(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.isEmptyInlineRemoveable())||
d.is("table")&&a.is("caption")?false:true}}var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(false);return function(b){for(var c=this.createBookmark(),d=this[b?"endPath":"startPath"](),e=d.block||d.blockLimit,f;e&&!e.equals(d.root)&&!e.getFirst(a(e));){f=e.getParent();this[b?"setEndAt":"setStartAt"](e,CKEDITOR.POSITION_AFTER_END);e.remove(1);e=f}this.moveToBookmark(c)}}(),startPath:function(){return new CKEDITOR.dom.elementPath(this.startContainer,this.root)},endPath:function(){return new CKEDITOR.dom.elementPath(this.endContainer,
this.root)},checkBoundaryOfElement:function(a,b){var c=b==CKEDITOR.START,d=this.clone();d.collapse(c);d[c?"setStartAt":"setEndAt"](a,c?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_END);d=new CKEDITOR.dom.walker(d);d.evaluator=f(c);return d[c?"checkBackward":"checkForward"]()},checkStartOfBlock:function(){var b=this.startContainer,c=this.startOffset;if(CKEDITOR.env.ie&&c&&b.type==CKEDITOR.NODE_TEXT){b=CKEDITOR.tools.ltrim(b.substring(0,c));k.test(b)&&this.trim(0,1)}this.trim();b=new CKEDITOR.dom.elementPath(this.startContainer,
this.root);c=this.clone();c.collapse(true);c.setStartAt(b.block||b.blockLimit,CKEDITOR.POSITION_AFTER_START);b=new CKEDITOR.dom.walker(c);b.evaluator=a();return b.checkBackward()},checkEndOfBlock:function(){var b=this.endContainer,c=this.endOffset;if(CKEDITOR.env.ie&&b.type==CKEDITOR.NODE_TEXT){b=CKEDITOR.tools.rtrim(b.substring(c));k.test(b)&&this.trim(1,0)}this.trim();b=new CKEDITOR.dom.elementPath(this.endContainer,this.root);c=this.clone();c.collapse(false);c.setEndAt(b.block||b.blockLimit,CKEDITOR.POSITION_BEFORE_END);
b=new CKEDITOR.dom.walker(c);b.evaluator=a();return b.checkForward()},getPreviousNode:function(a,b,c){var d=this.clone();d.collapse(1);d.setStartAt(c||this.root,CKEDITOR.POSITION_AFTER_START);c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.previous()},getNextNode:function(a,b,c){var d=this.clone();d.collapse();d.setEndAt(c||this.root,CKEDITOR.POSITION_BEFORE_END);c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.next()},checkReadOnly:function(){function a(b,c){for(;b;){if(b.type==
CKEDITOR.NODE_ELEMENT){if(b.getAttribute("contentEditable")=="false"&&!b.data("cke-editable"))return 0;if(b.is("html")||b.getAttribute("contentEditable")=="true"&&(b.contains(c)||b.equals(c)))break}b=b.getParent()}return 1}return function(){var b=this.startContainer,c=this.endContainer;return!(a(b,c)&&a(c,b))}}(),moveToElementEditablePosition:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&!a.isEditable(false)){this.moveToPosition(a,b?CKEDITOR.POSITION_AFTER_END:CKEDITOR.POSITION_BEFORE_START);return true}for(var c=
0;a;){if(a.type==CKEDITOR.NODE_TEXT){b&&this.endContainer&&this.checkEndOfBlock()&&k.test(a.getText())?this.moveToPosition(a,CKEDITOR.POSITION_BEFORE_START):this.moveToPosition(a,b?CKEDITOR.POSITION_AFTER_END:CKEDITOR.POSITION_BEFORE_START);c=1;break}if(a.type==CKEDITOR.NODE_ELEMENT)if(a.isEditable()){this.moveToPosition(a,b?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_START);c=1}else if(b&&a.is("br")&&this.endContainer&&this.checkEndOfBlock())this.moveToPosition(a,CKEDITOR.POSITION_BEFORE_START);
else if(a.getAttribute("contenteditable")=="false"&&a.is(CKEDITOR.dtd.$block)){this.setStartBefore(a);this.setEndAfter(a);return true}var d=a,e=c,f=void 0;d.type==CKEDITOR.NODE_ELEMENT&&d.isEditable(false)&&(f=d[b?"getLast":"getFirst"](g));!e&&!f&&(f=d[b?"getPrevious":"getNext"](g));a=f}return!!c},moveToClosestEditablePosition:function(a,b){var c=new CKEDITOR.dom.range(this.root),d=0,e,f=[CKEDITOR.POSITION_AFTER_END,CKEDITOR.POSITION_BEFORE_START];c.moveToPosition(a,f[b?0:1]);if(a.is(CKEDITOR.dtd.$block)){if(e=
c[b?"getNextEditableNode":"getPreviousEditableNode"]()){d=1;if(e.type==CKEDITOR.NODE_ELEMENT&&e.is(CKEDITOR.dtd.$block)&&e.getAttribute("contenteditable")=="false"){c.setStartAt(e,CKEDITOR.POSITION_BEFORE_START);c.setEndAt(e,CKEDITOR.POSITION_AFTER_END)}else c.moveToPosition(e,f[b?1:0])}}else d=1;d&&this.moveToRange(c);return!!d},moveToElementEditStart:function(a){return this.moveToElementEditablePosition(a)},moveToElementEditEnd:function(a){return this.moveToElementEditablePosition(a,true)},getEnclosedNode:function(){var a=
this.clone();a.optimize();if(a.startContainer.type!=CKEDITOR.NODE_ELEMENT||a.endContainer.type!=CKEDITOR.NODE_ELEMENT)return null;var a=new CKEDITOR.dom.walker(a),b=CKEDITOR.dom.walker.bookmark(false,true),c=CKEDITOR.dom.walker.whitespaces(true);a.evaluator=function(a){return c(a)&&b(a)};var d=a.next();a.reset();return d&&d.equals(a.previous())?d:null},getTouchedStartNode:function(){var a=this.startContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.startOffset)||a},getTouchedEndNode:function(){var a=
this.endContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.endOffset-1)||a},getNextEditableNode:b(),getPreviousEditableNode:b(1),scrollIntoView:function(){var a=new CKEDITOR.dom.element.createFromHtml("<span>&nbsp;</span>",this.document),b,c,d,e=this.clone();e.optimize();if(d=e.startContainer.type==CKEDITOR.NODE_TEXT){c=e.startContainer.getText();b=e.startContainer.split(e.startOffset);a.insertAfter(e.startContainer)}else e.insertNode(a);a.scrollIntoView();if(d){e.startContainer.setText(c);
b.remove()}a.remove()},_setStartContainer:function(a){this.startContainer=a},_setEndContainer:function(a){this.endContainer=a}}})();CKEDITOR.POSITION_AFTER_START=1;CKEDITOR.POSITION_BEFORE_END=2;CKEDITOR.POSITION_BEFORE_START=3;CKEDITOR.POSITION_AFTER_END=4;CKEDITOR.ENLARGE_ELEMENT=1;CKEDITOR.ENLARGE_BLOCK_CONTENTS=2;CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS=3;CKEDITOR.ENLARGE_INLINE=4;CKEDITOR.START=1;CKEDITOR.END=2;CKEDITOR.SHRINK_ELEMENT=1;CKEDITOR.SHRINK_TEXT=2;"use strict";
(function(){function a(a){if(!(arguments.length<1)){this.range=a;this.forceBrBreak=0;this.enlargeBr=1;this.enforceRealBlocks=0;this._||(this._={})}}function f(a){var b=[];a.forEach(function(a){if(a.getAttribute("contenteditable")=="true"){b.push(a);return false}},CKEDITOR.NODE_ELEMENT,true);return b}function b(a,c,d,e){a:{e==null&&(e=f(d));for(var h;h=e.shift();)if(h.getDtd().p){e={element:h,remaining:e};break a}e=null}if(!e)return 0;if((h=CKEDITOR.filter.instances[e.element.data("cke-filter")])&&
!h.check(c))return b(a,c,d,e.remaining);c=new CKEDITOR.dom.range(e.element);c.selectNodeContents(e.element);c=c.createIterator();c.enlargeBr=a.enlargeBr;c.enforceRealBlocks=a.enforceRealBlocks;c.activeFilter=c.filter=h;a._.nestedEditable={element:e.element,container:d,remaining:e.remaining,iterator:c};return 1}function c(a,b,c){if(!b)return false;a=a.clone();a.collapse(!c);return a.checkBoundaryOfElement(b,c?CKEDITOR.START:CKEDITOR.END)}var e=/^[\r\n\t ]+$/,d=CKEDITOR.dom.walker.bookmark(false,true),
h=CKEDITOR.dom.walker.whitespaces(true),k=function(a){return d(a)&&h(a)},j={dd:1,dt:1,li:1};a.prototype={getNextParagraph:function(a){var f,h,s,w,q,a=a||"p";if(this._.nestedEditable){if(f=this._.nestedEditable.iterator.getNextParagraph(a)){this.activeFilter=this._.nestedEditable.iterator.activeFilter;return f}this.activeFilter=this.filter;if(b(this,a,this._.nestedEditable.container,this._.nestedEditable.remaining)){this.activeFilter=this._.nestedEditable.iterator.activeFilter;return this._.nestedEditable.iterator.getNextParagraph(a)}this._.nestedEditable=
null}if(!this.range.root.getDtd()[a])return null;if(!this._.started){var t=this.range.clone();h=t.startPath();var i=t.endPath(),A=!t.collapsed&&c(t,h.block),u=!t.collapsed&&c(t,i.block,1);t.shrink(CKEDITOR.SHRINK_ELEMENT,true);A&&t.setStartAt(h.block,CKEDITOR.POSITION_BEFORE_END);u&&t.setEndAt(i.block,CKEDITOR.POSITION_AFTER_START);h=t.endContainer.hasAscendant("pre",true)||t.startContainer.hasAscendant("pre",true);t.enlarge(this.forceBrBreak&&!h||!this.enlargeBr?CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:
CKEDITOR.ENLARGE_BLOCK_CONTENTS);if(!t.collapsed){h=new CKEDITOR.dom.walker(t.clone());i=CKEDITOR.dom.walker.bookmark(true,true);h.evaluator=i;this._.nextNode=h.next();h=new CKEDITOR.dom.walker(t.clone());h.evaluator=i;h=h.previous();this._.lastNode=h.getNextSourceNode(true,null,t.root);if(this._.lastNode&&this._.lastNode.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(this._.lastNode.getText())&&this._.lastNode.getParent().isBlockBoundary()){i=this.range.clone();i.moveToPosition(this._.lastNode,CKEDITOR.POSITION_AFTER_END);
if(i.checkEndOfBlock()){i=new CKEDITOR.dom.elementPath(i.endContainer,i.root);this._.lastNode=(i.block||i.blockLimit).getNextSourceNode(true)}}if(!this._.lastNode||!t.root.contains(this._.lastNode)){this._.lastNode=this._.docEndMarker=t.document.createText("");this._.lastNode.insertAfter(h)}t=null}this._.started=1;h=t}i=this._.nextNode;t=this._.lastNode;for(this._.nextNode=null;i;){var A=0,u=i.hasAscendant("pre"),o=i.type!=CKEDITOR.NODE_ELEMENT,l=0;if(o)i.type==CKEDITOR.NODE_TEXT&&e.test(i.getText())&&
(o=0);else{var p=i.getName();if(CKEDITOR.dtd.$block[p]&&i.getAttribute("contenteditable")=="false"){f=i;b(this,a,f);break}else if(i.isBlockBoundary(this.forceBrBreak&&!u&&{br:1})){if(p=="br")o=1;else if(!h&&!i.getChildCount()&&p!="hr"){f=i;s=i.equals(t);break}if(h){h.setEndAt(i,CKEDITOR.POSITION_BEFORE_START);if(p!="br")this._.nextNode=i}A=1}else{if(i.getFirst()){if(!h){h=this.range.clone();h.setStartAt(i,CKEDITOR.POSITION_BEFORE_START)}i=i.getFirst();continue}o=1}}if(o&&!h){h=this.range.clone();
h.setStartAt(i,CKEDITOR.POSITION_BEFORE_START)}s=(!A||o)&&i.equals(t);if(h&&!A)for(;!i.getNext(k)&&!s;){p=i.getParent();if(p.isBlockBoundary(this.forceBrBreak&&!u&&{br:1})){A=1;o=0;s||p.equals(t);h.setEndAt(p,CKEDITOR.POSITION_BEFORE_END);break}i=p;o=1;s=i.equals(t);l=1}o&&h.setEndAt(i,CKEDITOR.POSITION_AFTER_END);i=this._getNextSourceNode(i,l,t);if((s=!i)||A&&h)break}if(!f){if(!h){this._.docEndMarker&&this._.docEndMarker.remove();return this._.nextNode=null}f=new CKEDITOR.dom.elementPath(h.startContainer,
h.root);i=f.blockLimit;A={div:1,th:1,td:1};f=f.block;if(!f&&i&&!this.enforceRealBlocks&&A[i.getName()]&&h.checkStartOfBlock()&&h.checkEndOfBlock()&&!i.equals(h.root))f=i;else if(!f||this.enforceRealBlocks&&f.is(j)){f=this.range.document.createElement(a);h.extractContents().appendTo(f);f.trim();h.insertNode(f);w=q=true}else if(f.getName()!="li"){if(!h.checkStartOfBlock()||!h.checkEndOfBlock()){f=f.clone(false);h.extractContents().appendTo(f);f.trim();q=h.splitBlock();w=!q.wasStartOfBlock;q=!q.wasEndOfBlock;
h.insertNode(f)}}else if(!s)this._.nextNode=f.equals(t)?null:this._getNextSourceNode(h.getBoundaryNodes().endNode,1,t)}if(w)(w=f.getPrevious())&&w.type==CKEDITOR.NODE_ELEMENT&&(w.getName()=="br"?w.remove():w.getLast()&&w.getLast().$.nodeName.toLowerCase()=="br"&&w.getLast().remove());if(q)(w=f.getLast())&&w.type==CKEDITOR.NODE_ELEMENT&&w.getName()=="br"&&(!CKEDITOR.env.needsBrFiller||w.getPrevious(d)||w.getNext(d))&&w.remove();if(!this._.nextNode)this._.nextNode=s||f.equals(t)||!t?null:this._getNextSourceNode(f,
1,t);return f},_getNextSourceNode:function(a,b,c){function e(a){return!(a.equals(c)||a.equals(f))}for(var f=this.range.root,a=a.getNextSourceNode(b,null,e);!d(a);)a=a.getNextSourceNode(b,null,e);return a}};CKEDITOR.dom.range.prototype.createIterator=function(){return new a(this)}})();
CKEDITOR.command=function(a,f){this.uiItems=[];this.exec=function(b){if(this.state==CKEDITOR.TRISTATE_DISABLED||!this.checkAllowed())return false;this.editorFocus&&a.focus();return this.fire("exec")===false?true:f.exec.call(this,a,b)!==false};this.refresh=function(a,b){if(!this.readOnly&&a.readOnly)return true;if(this.context&&!b.isContextFor(this.context)){this.disable();return true}if(!this.checkAllowed(true)){this.disable();return true}this.startDisabled||this.enable();this.modes&&!this.modes[a.mode]&&
this.disable();return this.fire("refresh",{editor:a,path:b})===false?true:f.refresh&&f.refresh.apply(this,arguments)!==false};var b;this.checkAllowed=function(c){return!c&&typeof b=="boolean"?b:b=a.activeFilter.checkFeature(this)};CKEDITOR.tools.extend(this,f,{modes:{wysiwyg:1},editorFocus:1,contextSensitive:!!f.context,state:CKEDITOR.TRISTATE_DISABLED});CKEDITOR.event.call(this)};
CKEDITOR.command.prototype={enable:function(){this.state==CKEDITOR.TRISTATE_DISABLED&&this.checkAllowed()&&this.setState(!this.preserveState||typeof this.previousState=="undefined"?CKEDITOR.TRISTATE_OFF:this.previousState)},disable:function(){this.setState(CKEDITOR.TRISTATE_DISABLED)},setState:function(a){if(this.state==a||a!=CKEDITOR.TRISTATE_DISABLED&&!this.checkAllowed())return false;this.previousState=this.state;this.state=a;this.fire("state");return true},toggleState:function(){this.state==CKEDITOR.TRISTATE_OFF?
this.setState(CKEDITOR.TRISTATE_ON):this.state==CKEDITOR.TRISTATE_ON&&this.setState(CKEDITOR.TRISTATE_OFF)}};CKEDITOR.event.implementOn(CKEDITOR.command.prototype);CKEDITOR.ENTER_P=1;CKEDITOR.ENTER_BR=2;CKEDITOR.ENTER_DIV=3;
CKEDITOR.config={customConfig:"config.js",autoUpdateElement:!0,language:"",defaultLanguage:"en",contentsLangDirection:"",enterMode:CKEDITOR.ENTER_P,forceEnterMode:!1,shiftEnterMode:CKEDITOR.ENTER_BR,docType:"<!DOCTYPE html>",bodyId:"",bodyClass:"",fullPage:!1,height:200,extraPlugins:"",removePlugins:"",protectedSource:[],tabIndex:0,width:"",baseFloatZIndex:1E4,blockedKeystrokes:[CKEDITOR.CTRL+66,CKEDITOR.CTRL+73,CKEDITOR.CTRL+85]};
(function(){function a(a,b,c,d,e){var f,p,a=[];for(f in b){p=b[f];p=typeof p=="boolean"?{}:typeof p=="function"?{match:p}:K(p);if(f.charAt(0)!="$")p.elements=f;if(c)p.featureName=c.toLowerCase();var i=p;i.elements=h(i.elements,/\s+/)||null;i.propertiesOnly=i.propertiesOnly||i.elements===true;var l=/\s*,\s*/,r=void 0;for(r in z){i[r]=h(i[r],l)||null;var x=i,n=B[r],v=h(i[B[r]],l),q=i[r],E=[],g=true,o=void 0;v?g=false:v={};for(o in q)if(o.charAt(0)=="!"){o=o.slice(1);E.push(o);v[o]=true;g=false}for(;o=
E.pop();){q[o]=q["!"+o];delete q["!"+o]}x[n]=(g?false:v)||null}i.match=i.match||null;d.push(p);a.push(p)}for(var b=e.elements,e=e.generic,C,c=0,d=a.length;c<d;++c){f=K(a[c]);p=f.classes===true||f.styles===true||f.attributes===true;i=f;r=n=l=void 0;for(l in z)i[l]=A(i[l]);x=true;for(r in B){l=B[r];n=i[l];v=[];q=void 0;for(q in n)q.indexOf("*")>-1?v.push(RegExp("^"+q.replace(/\*/g,".*")+"$")):v.push(q);n=v;if(n.length){i[l]=n;x=false}}i.nothingRequired=x;i.noProperties=!(i.attributes||i.classes||i.styles);
if(f.elements===true||f.elements===null)e[p?"unshift":"push"](f);else{i=f.elements;delete f.elements;for(C in i)if(b[C])b[C][p?"unshift":"push"](f);else b[C]=[f]}}}function f(a,c,d,e){if(!a.match||a.match(c))if(e||k(a,c)){if(!a.propertiesOnly)d.valid=true;if(!d.allAttributes)d.allAttributes=b(a.attributes,c.attributes,d.validAttributes);if(!d.allStyles)d.allStyles=b(a.styles,c.styles,d.validStyles);if(!d.allClasses){a=a.classes;c=c.classes;e=d.validClasses;if(a)if(a===true)a=true;else{for(var f=0,
p=c.length,i;f<p;++f){i=c[f];e[i]||(e[i]=a(i))}a=false}else a=false;d.allClasses=a}}}function b(a,b,c){if(!a)return false;if(a===true)return true;for(var d in b)c[d]||(c[d]=a(d));return false}function c(a,b,c){if(!a.match||a.match(b)){if(a.noProperties)return false;c.hadInvalidAttribute=e(a.attributes,b.attributes)||c.hadInvalidAttribute;c.hadInvalidStyle=e(a.styles,b.styles)||c.hadInvalidStyle;a=a.classes;b=b.classes;if(a){for(var d=false,f=a===true,p=b.length;p--;)if(f||a(b[p])){b.splice(p,1);d=
true}a=d}else a=false;c.hadInvalidClass=a||c.hadInvalidClass}}function e(a,b){if(!a)return false;var c=false,d=a===true,e;for(e in b)if(d||a(e)){delete b[e];c=true}return c}function d(a,b,c){if(a.disabled||a.customConfig&&!c||!b)return false;a._.cachedChecks={};return true}function h(a,b){if(!a)return false;if(a===true)return a;if(typeof a=="string"){a=I(a);return a=="*"?true:CKEDITOR.tools.convertArrayToObject(a.split(b))}if(CKEDITOR.tools.isArray(a))return a.length?CKEDITOR.tools.convertArrayToObject(a):
false;var c={},d=0,e;for(e in a){c[e]=a[e];d++}return d?c:false}function k(a,b){if(a.nothingRequired)return true;var c,d,e,f;if(e=a.requiredClasses){f=b.classes;for(c=0;c<e.length;++c){d=e[c];if(typeof d=="string"){if(CKEDITOR.tools.indexOf(f,d)==-1)return false}else if(!CKEDITOR.tools.checkIfAnyArrayItemMatches(f,d))return false}}return j(b.styles,a.requiredStyles)&&j(b.attributes,a.requiredAttributes)}function j(a,b){if(!b)return true;for(var c=0,d;c<b.length;++c){d=b[c];if(typeof d=="string"){if(!(d in
a))return false}else if(!CKEDITOR.tools.checkIfAnyObjectPropertyMatches(a,d))return false}return true}function g(a){if(!a)return{};for(var a=a.split(/\s*,\s*/).sort(),b={};a.length;)b[a.shift()]=v;return b}function m(a){for(var b,c,d,e,f={},p=1,a=I(a);b=a.match(x);){if(c=b[2]){d=y(c,"styles");e=y(c,"attrs");c=y(c,"classes")}else d=e=c=null;f["$"+p++]={elements:b[1],classes:c,styles:d,attributes:e};a=a.slice(b[0].length)}return f}function y(a,b){var c=a.match(E[b]);return c?I(c[1]):null}function s(a){var b=
a.styleBackup=a.attributes.style,c=a.classBackup=a.attributes["class"];if(!a.styles)a.styles=CKEDITOR.tools.parseCssText(b||"",1);if(!a.classes)a.classes=c?c.split(/\s+/):[]}function w(a,b,d,e){var l=0,r;if(e.toHtml)b.name=b.name.replace($,"$1");if(e.doCallbacks&&a.elementCallbacks){a:for(var x=a.elementCallbacks,h=0,n=x.length,v;h<n;++h)if(v=x[h](b)){r=v;break a}if(r)return r}if(e.doTransform)if(r=a._.transformations[b.name]){s(b);for(x=0;x<r.length;++x)p(a,b,r[x]);t(b)}if(e.doFilter){a:{x=b.name;
h=a._;a=h.allowedRules.elements[x];r=h.allowedRules.generic;x=h.disallowedRules.elements[x];h=h.disallowedRules.generic;n=e.skipRequired;v={valid:false,validAttributes:{},validClasses:{},validStyles:{},allAttributes:false,allClasses:false,allStyles:false,hadInvalidAttribute:false,hadInvalidClass:false,hadInvalidStyle:false};var q,z;if(!a&&!r)a=null;else{s(b);if(x){q=0;for(z=x.length;q<z;++q)if(c(x[q],b,v)===false){a=null;break a}}if(h){q=0;for(z=h.length;q<z;++q)c(h[q],b,v)}if(a){q=0;for(z=a.length;q<
z;++q)f(a[q],b,v,n)}if(r){q=0;for(z=r.length;q<z;++q)f(r[q],b,v,n)}a=v}}if(!a){d.push(b);return F}if(!a.valid){d.push(b);return F}z=a.validAttributes;var E=a.validStyles;r=a.validClasses;var x=b.attributes,A=b.styles,h=b.classes,n=b.classBackup,o=b.styleBackup,g,B,C=[];v=[];var j=/^data-cke-/;q=false;delete x.style;delete x["class"];delete b.classBackup;delete b.styleBackup;if(!a.allAttributes)for(g in x)if(!z[g])if(j.test(g)){if(g!=(B=g.replace(/^data-cke-saved-/,""))&&!z[B]){delete x[g];q=true}}else{delete x[g];
q=true}if(!a.allStyles||a.hadInvalidStyle){for(g in A)a.allStyles||E[g]?C.push(g+":"+A[g]):q=true;if(C.length)x.style=C.sort().join("; ")}else if(o)x.style=o;if(!a.allClasses||a.hadInvalidClass){for(g=0;g<h.length;++g)(a.allClasses||r[h[g]])&&v.push(h[g]);v.length&&(x["class"]=v.sort().join(" "));n&&v.length<n.split(/\s+/).length&&(q=true)}else n&&(x["class"]=n);q&&(l=F);if(!e.skipFinalValidation&&!i(b)){d.push(b);return F}}if(e.toHtml)b.name=b.name.replace(aa,"cke:$1");return l}function q(a){var b=
[],c;for(c in a)c.indexOf("*")>-1&&b.push(c.replace(/\*/g,".*"));return b.length?RegExp("^(?:"+b.join("|")+")$"):null}function t(a){var b=a.attributes,c;delete b.style;delete b["class"];if(c=CKEDITOR.tools.writeCssText(a.styles,true))b.style=c;a.classes.length&&(b["class"]=a.classes.sort().join(" "))}function i(a){switch(a.name){case "a":if(!a.children.length&&!a.attributes.name)return false;break;case "img":if(!a.attributes.src)return false}return true}function A(a){if(!a)return false;if(a===true)return true;
var b=q(a);return function(c){return c in a||b&&c.match(b)}}function u(){return new CKEDITOR.htmlParser.element("br")}function o(a){return a.type==CKEDITOR.NODE_ELEMENT&&(a.name=="br"||L.$block[a.name])}function l(a,b,c){var d=a.name;if(L.$empty[d]||!a.children.length)if(d=="hr"&&b=="br")a.replaceWith(u());else{a.parent&&c.push({check:"it",el:a.parent});a.remove()}else if(L.$block[d]||d=="tr")if(b=="br"){if(a.previous&&!o(a.previous)){b=u();b.insertBefore(a)}if(a.next&&!o(a.next)){b=u();b.insertAfter(a)}a.replaceWithChildren()}else{var d=
a.children,e;b:{e=L[b];for(var f=0,p=d.length,i;f<p;++f){i=d[f];if(i.type==CKEDITOR.NODE_ELEMENT&&!e[i.name]){e=false;break b}}e=true}if(e){a.name=b;a.attributes={};c.push({check:"parent-down",el:a})}else{e=a.parent;for(var f=e.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT||e.name=="body",l,r,p=d.length;p>0;){i=d[--p];if(f&&(i.type==CKEDITOR.NODE_TEXT||i.type==CKEDITOR.NODE_ELEMENT&&L.$inline[i.name])){if(!l){l=new CKEDITOR.htmlParser.element(b);l.insertAfter(a);c.push({check:"parent-down",el:l})}l.add(i,
0)}else{l=null;r=L[e.name]||L.span;i.insertAfter(a);e.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT&&(i.type==CKEDITOR.NODE_ELEMENT&&!r[i.name])&&c.push({check:"el-up",el:i})}}a.remove()}}else if(d=="style")a.remove();else{a.parent&&c.push({check:"it",el:a.parent});a.replaceWithChildren()}}function p(a,b,c){var d,e;for(d=0;d<c.length;++d){e=c[d];if((!e.check||a.check(e.check,false))&&(!e.left||e.left(b))){e.right(b,ba);break}}}function r(a,b){var c=b.getDefinition(),d=c.attributes,e=c.styles,f,p,i,l;if(a.name!=
c.element)return false;for(f in d)if(f=="class"){c=d[f].split(/\s+/);for(i=a.classes.join("|");l=c.pop();)if(i.indexOf(l)==-1)return false}else if(a.attributes[f]!=d[f])return false;for(p in e)if(a.styles[p]!=e[p])return false;return true}function n(a,b){var c,d;if(typeof a=="string")c=a;else if(a instanceof CKEDITOR.style)d=a;else{c=a[0];d=a[1]}return[{element:c,left:d,right:function(a,c){c.transform(a,b)}}]}function P(a){return function(b){return r(b,a)}}function C(a){return function(b,c){c[a](b)}}
var L=CKEDITOR.dtd,F=1,K=CKEDITOR.tools.copy,I=CKEDITOR.tools.trim,v="cke-test",G=["","p","br","div"];CKEDITOR.FILTER_SKIP_TREE=2;CKEDITOR.filter=function(a){this.allowedContent=[];this.disallowedContent=[];this.elementCallbacks=null;this.disabled=false;this.editor=null;this.id=CKEDITOR.tools.getNextNumber();this._={allowedRules:{elements:{},generic:[]},disallowedRules:{elements:{},generic:[]},transformations:{},cachedTests:{}};CKEDITOR.filter.instances[this.id]=this;if(a instanceof CKEDITOR.editor){a=
this.editor=a;this.customConfig=true;var b=a.config.allowedContent;if(b===true)this.disabled=true;else{if(!b)this.customConfig=false;this.allow(b,"config",1);this.allow(a.config.extraAllowedContent,"extra",1);this.allow(G[a.enterMode]+" "+G[a.shiftEnterMode],"default",1);this.disallow(a.config.disallowedContent)}}else{this.customConfig=false;this.allow(a,"default",1)}};CKEDITOR.filter.instances={};CKEDITOR.filter.prototype={allow:function(b,c,e){if(!d(this,b,e))return false;var f,p;if(typeof b=="string")b=
m(b);else if(b instanceof CKEDITOR.style){if(b.toAllowedContentRules)return this.allow(b.toAllowedContentRules(this.editor),c,e);f=b.getDefinition();b={};e=f.attributes;b[f.element]=f={styles:f.styles,requiredStyles:f.styles&&CKEDITOR.tools.objectKeys(f.styles)};if(e){e=K(e);f.classes=e["class"]?e["class"].split(/\s+/):null;f.requiredClasses=f.classes;delete e["class"];f.attributes=e;f.requiredAttributes=e&&CKEDITOR.tools.objectKeys(e)}}else if(CKEDITOR.tools.isArray(b)){for(f=0;f<b.length;++f)p=
this.allow(b[f],c,e);return p}a(this,b,c,this.allowedContent,this._.allowedRules);return true},applyTo:function(a,b,c,d){if(this.disabled)return false;var e=this,f=[],p=this.editor&&this.editor.config.protectedSource,r,x=false,h={doFilter:!c,doTransform:true,doCallbacks:true,toHtml:b};a.forEach(function(a){if(a.type==CKEDITOR.NODE_ELEMENT){if(a.attributes["data-cke-filter"]=="off")return false;if(!b||!(a.name=="span"&&~CKEDITOR.tools.objectKeys(a.attributes).join("|").indexOf("data-cke-"))){r=w(e,
a,f,h);if(r&F)x=true;else if(r&2)return false}}else if(a.type==CKEDITOR.NODE_COMMENT&&a.value.match(/^\{cke_protected\}(?!\{C\})/)){var c;a:{var d=decodeURIComponent(a.value.replace(/^\{cke_protected\}/,""));c=[];var i,l,n;if(p)for(l=0;l<p.length;++l)if((n=d.match(p[l]))&&n[0].length==d.length){c=true;break a}d=CKEDITOR.htmlParser.fragment.fromHtml(d);d.children.length==1&&(i=d.children[0]).type==CKEDITOR.NODE_ELEMENT&&w(e,i,c,h);c=!c.length}c||f.push(a)}},null,true);f.length&&(x=true);for(var n,
a=[],d=G[d||(this.editor?this.editor.enterMode:CKEDITOR.ENTER_P)],q;c=f.pop();)c.type==CKEDITOR.NODE_ELEMENT?l(c,d,a):c.remove();for(;n=a.pop();){c=n.el;if(c.parent){q=L[c.parent.name]||L.span;switch(n.check){case "it":L.$removeEmpty[c.name]&&!c.children.length?l(c,d,a):i(c)||l(c,d,a);break;case "el-up":c.parent.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT&&!q[c.name]&&l(c,d,a);break;case "parent-down":c.parent.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT&&!q[c.name]&&l(c.parent,d,a)}}}return x},checkFeature:function(a){if(this.disabled||
!a)return true;a.toFeature&&(a=a.toFeature(this.editor));return!a.requiredContent||this.check(a.requiredContent)},disable:function(){this.disabled=true},disallow:function(b){if(!d(this,b,true))return false;typeof b=="string"&&(b=m(b));a(this,b,null,this.disallowedContent,this._.disallowedRules);return true},addContentForms:function(a){if(!this.disabled&&a){var b,c,d=[],e;for(b=0;b<a.length&&!e;++b){c=a[b];if((typeof c=="string"||c instanceof CKEDITOR.style)&&this.check(c))e=c}if(e){for(b=0;b<a.length;++b)d.push(n(a[b],
e));this.addTransformations(d)}}},addElementCallback:function(a){if(!this.elementCallbacks)this.elementCallbacks=[];this.elementCallbacks.push(a)},addFeature:function(a){if(this.disabled||!a)return true;a.toFeature&&(a=a.toFeature(this.editor));this.allow(a.allowedContent,a.name);this.addTransformations(a.contentTransformations);this.addContentForms(a.contentForms);return a.requiredContent&&(this.customConfig||this.disallowedContent.length)?this.check(a.requiredContent):true},addTransformations:function(a){var b,
c;if(!this.disabled&&a){var d=this._.transformations,e;for(e=0;e<a.length;++e){b=a[e];var f=void 0,p=void 0,i=void 0,l=void 0,r=void 0,x=void 0;c=[];for(p=0;p<b.length;++p){i=b[p];if(typeof i=="string"){i=i.split(/\s*:\s*/);l=i[0];r=null;x=i[1]}else{l=i.check;r=i.left;x=i.right}if(!f){f=i;f=f.element?f.element:l?l.match(/^([a-z0-9]+)/i)[0]:f.left.getDefinition().element}r instanceof CKEDITOR.style&&(r=P(r));c.push({check:l==f?null:l,left:r,right:typeof x=="string"?C(x):x})}b=f;d[b]||(d[b]=[]);d[b].push(c)}}},
check:function(a,b,c){if(this.disabled)return true;if(CKEDITOR.tools.isArray(a)){for(var d=a.length;d--;)if(this.check(a[d],b,c))return true;return false}var e,f;if(typeof a=="string"){f=a+"<"+(b===false?"0":"1")+(c?"1":"0")+">";if(f in this._.cachedChecks)return this._.cachedChecks[f];d=m(a).$1;e=d.styles;var i=d.classes;d.name=d.elements;d.classes=i=i?i.split(/\s*,\s*/):[];d.styles=g(e);d.attributes=g(d.attributes);d.children=[];i.length&&(d.attributes["class"]=i.join(" "));if(e)d.attributes.style=
CKEDITOR.tools.writeCssText(d.styles);e=d}else{d=a.getDefinition();e=d.styles;i=d.attributes||{};if(e){e=K(e);i.style=CKEDITOR.tools.writeCssText(e,true)}else e={};e={name:d.element,attributes:i,classes:i["class"]?i["class"].split(/\s+/):[],styles:e,children:[]}}var i=CKEDITOR.tools.clone(e),l=[],r;if(b!==false&&(r=this._.transformations[e.name])){for(d=0;d<r.length;++d)p(this,e,r[d]);t(e)}w(this,i,l,{doFilter:true,doTransform:b!==false,skipRequired:!c,skipFinalValidation:!c});b=l.length>0?false:
CKEDITOR.tools.objectCompare(e.attributes,i.attributes,true)?true:false;typeof a=="string"&&(this._.cachedChecks[f]=b);return b},getAllowedEnterMode:function(){var a=["p","div","br"],b={p:CKEDITOR.ENTER_P,div:CKEDITOR.ENTER_DIV,br:CKEDITOR.ENTER_BR};return function(c,d){var e=a.slice(),f;if(this.check(G[c]))return c;for(d||(e=e.reverse());f=e.pop();)if(this.check(f))return b[f];return CKEDITOR.ENTER_BR}}(),destroy:function(){delete CKEDITOR.filter.instances[this.id];delete this._;delete this.allowedContent;
delete this.disallowedContent}};var z={styles:1,attributes:1,classes:1},B={styles:"requiredStyles",attributes:"requiredAttributes",classes:"requiredClasses"},x=/^([a-z0-9\-*\s]+)((?:\s*\{[!\w\-,\s\*]+\}\s*|\s*\[[!\w\-,\s\*]+\]\s*|\s*\([!\w\-,\s\*]+\)\s*){0,3})(?:;\s*|$)/i,E={styles:/{([^}]+)}/,attrs:/\[([^\]]+)\]/,classes:/\(([^\)]+)\)/},$=/^cke:(object|embed|param)$/,aa=/^(object|embed|param)$/,ba=CKEDITOR.filter.transformationsTools={sizeToStyle:function(a){this.lengthToStyle(a,"width");this.lengthToStyle(a,
"height")},sizeToAttribute:function(a){this.lengthToAttribute(a,"width");this.lengthToAttribute(a,"height")},lengthToStyle:function(a,b,c){c=c||b;if(!(c in a.styles)){var d=a.attributes[b];if(d){/^\d+$/.test(d)&&(d=d+"px");a.styles[c]=d}}delete a.attributes[b]},lengthToAttribute:function(a,b,c){c=c||b;if(!(c in a.attributes)){var d=a.styles[b],e=d&&d.match(/^(\d+)(?:\.\d*)?px$/);e?a.attributes[c]=e[1]:d==v&&(a.attributes[c]=v)}delete a.styles[b]},alignmentToStyle:function(a){if(!("float"in a.styles)){var b=
a.attributes.align;if(b=="left"||b=="right")a.styles["float"]=b}delete a.attributes.align},alignmentToAttribute:function(a){if(!("align"in a.attributes)){var b=a.styles["float"];if(b=="left"||b=="right")a.attributes.align=b}delete a.styles["float"]},matchesStyle:r,transform:function(a,b){if(typeof b=="string")a.name=b;else{var c=b.getDefinition(),d=c.styles,e=c.attributes,f,i,p,l;a.name=c.element;for(f in e)if(f=="class"){c=a.classes.join("|");for(p=e[f].split(/\s+/);l=p.pop();)c.indexOf(l)==-1&&
a.classes.push(l)}else a.attributes[f]=e[f];for(i in d)a.styles[i]=d[i]}}}})();
(function(){CKEDITOR.focusManager=function(a){if(a.focusManager)return a.focusManager;this.hasFocus=false;this.currentActive=null;this._={editor:a};return this};CKEDITOR.focusManager._={blurDelay:200};CKEDITOR.focusManager.prototype={focus:function(a){this._.timer&&clearTimeout(this._.timer);if(a)this.currentActive=a;if(!this.hasFocus&&!this._.locked){(a=CKEDITOR.currentInstance)&&a.focusManager.blur(1);this.hasFocus=true;(a=this._.editor.container)&&a.addClass("cke_focus");this._.editor.fire("focus")}},
lock:function(){this._.locked=1},unlock:function(){delete this._.locked},blur:function(a){function f(){if(this.hasFocus){this.hasFocus=false;var a=this._.editor.container;a&&a.removeClass("cke_focus");this._.editor.fire("blur")}}if(!this._.locked){this._.timer&&clearTimeout(this._.timer);var b=CKEDITOR.focusManager._.blurDelay;a||!b?f.call(this):this._.timer=CKEDITOR.tools.setTimeout(function(){delete this._.timer;f.call(this)},b,this)}},add:function(a,f){var b=a.getCustomData("focusmanager");if(!b||
b!=this){b&&b.remove(a);var b="focus",c="blur";if(f)if(CKEDITOR.env.ie){b="focusin";c="focusout"}else CKEDITOR.event.useCapture=1;var e={blur:function(){a.equals(this.currentActive)&&this.blur()},focus:function(){this.focus(a)}};a.on(b,e.focus,this);a.on(c,e.blur,this);if(f)CKEDITOR.event.useCapture=0;a.setCustomData("focusmanager",this);a.setCustomData("focusmanager_handlers",e)}},remove:function(a){a.removeCustomData("focusmanager");var f=a.removeCustomData("focusmanager_handlers");a.removeListener("blur",
f.blur);a.removeListener("focus",f.focus)}}})();CKEDITOR.keystrokeHandler=function(a){if(a.keystrokeHandler)return a.keystrokeHandler;this.keystrokes={};this.blockedKeystrokes={};this._={editor:a};return this};
(function(){var a,f=function(b){var b=b.data,e=b.getKeystroke(),d=this.keystrokes[e],f=this._.editor;a=f.fire("key",{keyCode:e,domEvent:b})===false;if(!a){d&&(a=f.execCommand(d,{from:"keystrokeHandler"})!==false);a||(a=!!this.blockedKeystrokes[e])}a&&b.preventDefault(true);return!a},b=function(b){if(a){a=false;b.data.preventDefault(true)}};CKEDITOR.keystrokeHandler.prototype={attach:function(a){a.on("keydown",f,this);if(CKEDITOR.env.gecko&&CKEDITOR.env.mac)a.on("keypress",b,this)}}})();
(function(){CKEDITOR.lang={languages:{af:1,ar:1,bg:1,bn:1,bs:1,ca:1,cs:1,cy:1,da:1,de:1,el:1,"en-au":1,"en-ca":1,"en-gb":1,en:1,eo:1,es:1,et:1,eu:1,fa:1,fi:1,fo:1,"fr-ca":1,fr:1,gl:1,gu:1,he:1,hi:1,hr:1,hu:1,id:1,is:1,it:1,ja:1,ka:1,km:1,ko:1,ku:1,lt:1,lv:1,mk:1,mn:1,ms:1,nb:1,nl:1,no:1,pl:1,"pt-br":1,pt:1,ro:1,ru:1,si:1,sk:1,sl:1,sq:1,"sr-latn":1,sr:1,sv:1,th:1,tr:1,tt:1,ug:1,uk:1,vi:1,"zh-cn":1,zh:1},rtl:{ar:1,fa:1,he:1,ku:1,ug:1},load:function(a,f,b){if(!a||!CKEDITOR.lang.languages[a])a=this.detect(f,
a);var c=this,f=function(){c[a].dir=c.rtl[a]?"rtl":"ltr";b(a,c[a])};this[a]?f():CKEDITOR.scriptLoader.load(CKEDITOR.getUrl("lang/"+a+".js"),f,this)},detect:function(a,f){var b=this.languages,f=f||navigator.userLanguage||navigator.language||a,c=f.toLowerCase().match(/([a-z]+)(?:-([a-z]+))?/),e=c[1],c=c[2];b[e+"-"+c]?e=e+"-"+c:b[e]||(e=null);CKEDITOR.lang.detect=e?function(){return e}:function(a){return a};return e||a}}})();
CKEDITOR.scriptLoader=function(){var a={},f={};return{load:function(b,c,e,d){var h=typeof b=="string";h&&(b=[b]);e||(e=CKEDITOR);var k=b.length,j=[],g=[],m=function(a){c&&(h?c.call(e,a):c.call(e,j,g))};if(k===0)m(true);else{var y=function(a,b){(b?j:g).push(a);if(--k<=0){d&&CKEDITOR.document.getDocumentElement().removeStyle("cursor");m(b)}},s=function(b,c){a[b]=1;var d=f[b];delete f[b];for(var e=0;e<d.length;e++)d[e](b,c)},w=function(b){if(a[b])y(b,true);else{var d=f[b]||(f[b]=[]);d.push(y);if(!(d.length>
1)){var e=new CKEDITOR.dom.element("script");e.setAttributes({type:"text/javascript",src:b});if(c)if(CKEDITOR.env.ie&&CKEDITOR.env.version<11)e.$.onreadystatechange=function(){if(e.$.readyState=="loaded"||e.$.readyState=="complete"){e.$.onreadystatechange=null;s(b,true)}};else{e.$.onload=function(){setTimeout(function(){s(b,true)},0)};e.$.onerror=function(){s(b,false)}}e.appendTo(CKEDITOR.document.getHead())}}};d&&CKEDITOR.document.getDocumentElement().setStyle("cursor","wait");for(var q=0;q<k;q++)w(b[q])}},
queue:function(){function a(){var b;(b=c[0])&&this.load(b.scriptUrl,b.callback,CKEDITOR,0)}var c=[];return function(e,d){var f=this;c.push({scriptUrl:e,callback:function(){d&&d.apply(this,arguments);c.shift();a.call(f)}});c.length==1&&a.call(this)}}()}}();CKEDITOR.resourceManager=function(a,f){this.basePath=a;this.fileName=f;this.registered={};this.loaded={};this.externals={};this._={waitingList:{}}};
CKEDITOR.resourceManager.prototype={add:function(a,f){if(this.registered[a])throw'[CKEDITOR.resourceManager.add] The resource name "'+a+'" is already registered.';var b=this.registered[a]=f||{};b.name=a;b.path=this.getPath(a);CKEDITOR.fire(a+CKEDITOR.tools.capitalize(this.fileName)+"Ready",b);return this.get(a)},get:function(a){return this.registered[a]||null},getPath:function(a){var f=this.externals[a];return CKEDITOR.getUrl(f&&f.dir||this.basePath+a+"/")},getFilePath:function(a){var f=this.externals[a];
return CKEDITOR.getUrl(this.getPath(a)+(f?f.file:this.fileName+".js"))},addExternal:function(a,f,b){for(var a=a.split(","),c=0;c<a.length;c++){var e=a[c];b||(f=f.replace(/[^\/]+$/,function(a){b=a;return""}));this.externals[e]={dir:f,file:b||this.fileName+".js"}}},load:function(a,f,b){CKEDITOR.tools.isArray(a)||(a=a?[a]:[]);for(var c=this.loaded,e=this.registered,d=[],h={},k={},j=0;j<a.length;j++){var g=a[j];if(g)if(!c[g]&&!e[g]){var m=this.getFilePath(g);d.push(m);m in h||(h[m]=[]);h[m].push(g)}else k[g]=
this.get(g)}CKEDITOR.scriptLoader.load(d,function(a,d){if(d.length)throw'[CKEDITOR.resourceManager.load] Resource name "'+h[d[0]].join(",")+'" was not found at "'+d[0]+'".';for(var e=0;e<a.length;e++)for(var q=h[a[e]],g=0;g<q.length;g++){var i=q[g];k[i]=this.get(i);c[i]=1}f.call(b,k)},this)}};CKEDITOR.plugins=new CKEDITOR.resourceManager("plugins/","plugin");
CKEDITOR.plugins.load=CKEDITOR.tools.override(CKEDITOR.plugins.load,function(a){var f={};return function(b,c,e){var d={},h=function(b){a.call(this,b,function(a){CKEDITOR.tools.extend(d,a);var b=[],m;for(m in a){var k=a[m],s=k&&k.requires;if(!f[m]){if(k.icons)for(var w=k.icons.split(","),q=w.length;q--;)CKEDITOR.skin.addIcon(w[q],k.path+"icons/"+(CKEDITOR.env.hidpi&&k.hidpi?"hidpi/":"")+w[q]+".png");f[m]=1}if(s){s.split&&(s=s.split(","));for(k=0;k<s.length;k++)d[s[k]]||b.push(s[k])}}if(b.length)h.call(this,
b);else{for(m in d){k=d[m];if(k.onLoad&&!k.onLoad._called){k.onLoad()===false&&delete d[m];k.onLoad._called=1}}c&&c.call(e||window,d)}},this)};h.call(this,b)}});CKEDITOR.plugins.setLang=function(a,f,b){var c=this.get(a),a=c.langEntries||(c.langEntries={}),c=c.lang||(c.lang=[]);c.split&&(c=c.split(","));CKEDITOR.tools.indexOf(c,f)==-1&&c.push(f);a[f]=b};CKEDITOR.ui=function(a){if(a.ui)return a.ui;this.items={};this.instances={};this.editor=a;this._={handlers:{}};return this};
CKEDITOR.ui.prototype={add:function(a,f,b){b.name=a.toLowerCase();var c=this.items[a]={type:f,command:b.command||null,args:Array.prototype.slice.call(arguments,2)};CKEDITOR.tools.extend(c,b)},get:function(a){return this.instances[a]},create:function(a){var f=this.items[a],b=f&&this._.handlers[f.type],c=f&&f.command&&this.editor.getCommand(f.command),b=b&&b.create.apply(this,f.args);this.instances[a]=b;c&&c.uiItems.push(b);if(b&&!b.type)b.type=f.type;return b},addHandler:function(a,f){this._.handlers[a]=
f},space:function(a){return CKEDITOR.document.getById(this.spaceId(a))},spaceId:function(a){return this.editor.id+"_"+a}};CKEDITOR.event.implementOn(CKEDITOR.ui);
(function(){function a(a,c,d){CKEDITOR.event.call(this);a=a&&CKEDITOR.tools.clone(a);if(c!==void 0){if(c instanceof CKEDITOR.dom.element){if(!d)throw Error("One of the element modes must be specified.");}else throw Error("Expect element of type CKEDITOR.dom.element.");if(CKEDITOR.env.ie&&CKEDITOR.env.quirks&&d==CKEDITOR.ELEMENT_MODE_INLINE)throw Error("Inline element mode is not supported on IE quirks.");if(!(d==CKEDITOR.ELEMENT_MODE_INLINE?c.is(CKEDITOR.dtd.$editable)||c.is("textarea"):d==CKEDITOR.ELEMENT_MODE_REPLACE?
!c.is(CKEDITOR.dtd.$nonBodyContent):1))throw Error('The specified element mode is not supported on element: "'+c.getName()+'".');this.element=c;this.elementMode=d;this.name=this.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO&&(c.getId()||c.getNameAtt())}else this.elementMode=CKEDITOR.ELEMENT_MODE_NONE;this._={};this.commands={};this.templates={};this.name=this.name||f();this.id=CKEDITOR.tools.getNextId();this.status="unloaded";this.config=CKEDITOR.tools.prototypedCopy(CKEDITOR.config);this.ui=new CKEDITOR.ui(this);
this.focusManager=new CKEDITOR.focusManager(this);this.keystrokeHandler=new CKEDITOR.keystrokeHandler(this);this.on("readOnly",b);this.on("selectionChange",function(a){e(this,a.data.path)});this.on("activeFilterChange",function(){e(this,this.elementPath(),true)});this.on("mode",b);this.on("instanceReady",function(){this.config.startupFocus&&this.focus()});CKEDITOR.fire("instanceCreated",null,this);CKEDITOR.add(this);CKEDITOR.tools.setTimeout(function(){h(this,a)},0,this)}function f(){do var a="editor"+
++s;while(CKEDITOR.instances[a]);return a}function b(){var a=this.commands,b;for(b in a)c(this,a[b])}function c(a,b){b[b.startDisabled?"disable":a.readOnly&&!b.readOnly?"disable":b.modes[a.mode]?"enable":"disable"]()}function e(a,b,c){if(b){var d,e,f=a.commands;for(e in f){d=f[e];(c||d.contextSensitive)&&d.refresh(a,b)}}}function d(a){var b=a.config.customConfig;if(!b)return false;var b=CKEDITOR.getUrl(b),c=w[b]||(w[b]={});if(c.fn){c.fn.call(a,a.config);(CKEDITOR.getUrl(a.config.customConfig)==b||
!d(a))&&a.fireOnce("customConfigLoaded")}else CKEDITOR.scriptLoader.queue(b,function(){c.fn=CKEDITOR.editorConfig?CKEDITOR.editorConfig:function(){};d(a)});return true}function h(a,b){a.on("customConfigLoaded",function(){if(b){if(b.on)for(var c in b.on)a.on(c,b.on[c]);CKEDITOR.tools.extend(a.config,b,true);delete a.config.on}c=a.config;a.readOnly=!(!c.readOnly&&!(a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?a.element.is("textarea")?a.element.hasAttribute("disabled"):a.element.isReadOnly():a.elementMode==
CKEDITOR.ELEMENT_MODE_REPLACE&&a.element.hasAttribute("disabled")));a.blockless=a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?!(a.element.is("textarea")||CKEDITOR.dtd[a.element.getName()].p):false;a.tabIndex=c.tabIndex||a.element&&a.element.getAttribute("tabindex")||0;a.activeEnterMode=a.enterMode=a.blockless?CKEDITOR.ENTER_BR:c.enterMode;a.activeShiftEnterMode=a.shiftEnterMode=a.blockless?CKEDITOR.ENTER_BR:c.shiftEnterMode;if(c.skin)CKEDITOR.skinName=c.skin;a.fireOnce("configLoaded");a.dataProcessor=
new CKEDITOR.htmlDataProcessor(a);a.filter=a.activeFilter=new CKEDITOR.filter(a);k(a)});if(b&&b.customConfig!=null)a.config.customConfig=b.customConfig;d(a)||a.fireOnce("customConfigLoaded")}function k(a){CKEDITOR.skin.loadPart("editor",function(){j(a)})}function j(a){CKEDITOR.lang.load(a.config.language,a.config.defaultLanguage,function(b,c){var d=a.config.title;a.langCode=b;a.lang=CKEDITOR.tools.prototypedCopy(c);a.title=typeof d=="string"||d===false?d:[a.lang.editor,a.name].join(", ");if(!a.config.contentsLangDirection)a.config.contentsLangDirection=
a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?a.element.getDirection(1):a.lang.dir;a.fire("langLoaded");g(a)})}function g(a){a.getStylesSet(function(b){a.once("loaded",function(){a.fire("stylesSet",{styles:b})},null,null,1);m(a)})}function m(a){var b=a.config,c=b.plugins,d=b.extraPlugins,e=b.removePlugins;if(d)var f=RegExp("(?:^|,)(?:"+d.replace(/\s*,\s*/g,"|")+")(?=,|$)","g"),c=c.replace(f,""),c=c+(","+d);if(e)var l=RegExp("(?:^|,)(?:"+e.replace(/\s*,\s*/g,"|")+")(?=,|$)","g"),c=c.replace(l,"");CKEDITOR.env.air&&
(c=c+",adobeair");CKEDITOR.plugins.load(c.split(","),function(c){var d=[],e=[],f=[];a.plugins=c;for(var i in c){var h=c[i],g=h.lang,o=null,A=h.requires,v;CKEDITOR.tools.isArray(A)&&(A=A.join(","));if(A&&(v=A.match(l)))for(;A=v.pop();)CKEDITOR.tools.setTimeout(function(a,b){throw Error('Plugin "'+a.replace(",","")+'" cannot be removed from the plugins list, because it\'s required by "'+b+'" plugin.');},0,null,[A,i]);if(g&&!a.lang[i]){g.split&&(g=g.split(","));if(CKEDITOR.tools.indexOf(g,a.langCode)>=
0)o=a.langCode;else{o=a.langCode.replace(/-.*/,"");o=o!=a.langCode&&CKEDITOR.tools.indexOf(g,o)>=0?o:CKEDITOR.tools.indexOf(g,"en")>=0?"en":g[0]}if(!h.langEntries||!h.langEntries[o])f.push(CKEDITOR.getUrl(h.path+"lang/"+o+".js"));else{a.lang[i]=h.langEntries[o];o=null}}e.push(o);d.push(h)}CKEDITOR.scriptLoader.load(f,function(){for(var c=["beforeInit","init","afterInit"],f=0;f<c.length;f++)for(var p=0;p<d.length;p++){var i=d[p];f===0&&(e[p]&&i.lang&&i.langEntries)&&(a.lang[i.name]=i.langEntries[e[p]]);
if(i[c[f]])i[c[f]](a)}a.fireOnce("pluginsLoaded");b.keystrokes&&a.setKeystroke(a.config.keystrokes);for(p=0;p<a.config.blockedKeystrokes.length;p++)a.keystrokeHandler.blockedKeystrokes[a.config.blockedKeystrokes[p]]=1;a.status="loaded";a.fireOnce("loaded");CKEDITOR.fire("instanceLoaded",null,a)})})}function y(){var a=this.element;if(a&&this.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO){var b=this.getData();this.config.htmlEncodeOutput&&(b=CKEDITOR.tools.htmlEncode(b));a.is("textarea")?a.setValue(b):
a.setHtml(b);return true}return false}a.prototype=CKEDITOR.editor.prototype;CKEDITOR.editor=a;var s=0,w={};CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{addCommand:function(a,b){b.name=a.toLowerCase();var d=new CKEDITOR.command(this,b);this.mode&&c(this,d);return this.commands[a]=d},_attachToForm:function(){function a(d){b.updateElement();b._.required&&(!c.getValue()&&b.fire("required")===false)&&d.data.preventDefault()}var b=this,c=b.element,d=new CKEDITOR.dom.element(c.$.form);if(c.is("textarea")&&
d){d.on("submit",a);if(d.$.submit&&d.$.submit.call&&d.$.submit.apply)d.$.submit=CKEDITOR.tools.override(d.$.submit,function(b){return function(){a();b.apply?b.apply(this):b()}});b.on("destroy",function(){d.removeListener("submit",a)})}},destroy:function(a){this.fire("beforeDestroy");!a&&y.call(this);this.editable(null);this.filter.destroy();delete this.filter;delete this.activeFilter;this.status="destroyed";this.fire("destroy");this.removeAllListeners();CKEDITOR.remove(this);CKEDITOR.fire("instanceDestroyed",
null,this)},elementPath:function(a){if(!a){a=this.getSelection();if(!a)return null;a=a.getStartElement()}return a?new CKEDITOR.dom.elementPath(a,this.editable()):null},createRange:function(){var a=this.editable();return a?new CKEDITOR.dom.range(a):null},execCommand:function(a,b){var c=this.getCommand(a),d={name:a,commandData:b,command:c};if(c&&c.state!=CKEDITOR.TRISTATE_DISABLED&&this.fire("beforeCommandExec",d)!==false){d.returnValue=c.exec(d.commandData);if(!c.async&&this.fire("afterCommandExec",
d)!==false)return d.returnValue}return false},getCommand:function(a){return this.commands[a]},getData:function(a){!a&&this.fire("beforeGetData");var b=this._.data;if(typeof b!="string")b=(b=this.element)&&this.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE?b.is("textarea")?b.getValue():b.getHtml():"";b={dataValue:b};!a&&this.fire("getData",b);return b.dataValue},getSnapshot:function(){var a=this.fire("getSnapshot");if(typeof a!="string"){var b=this.element;b&&this.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&
(a=b.is("textarea")?b.getValue():b.getHtml())}return a},loadSnapshot:function(a){this.fire("loadSnapshot",a)},setData:function(a,b,c){var d=true,e=b;if(b&&typeof b=="object"){c=b.internal;e=b.callback;d=!b.noSnapshot}!c&&d&&this.fire("saveSnapshot");if(e||!c)this.once("dataReady",function(a){!c&&d&&this.fire("saveSnapshot");e&&e.call(a.editor)});a={dataValue:a};!c&&this.fire("setData",a);this._.data=a.dataValue;!c&&this.fire("afterSetData",a)},setReadOnly:function(a){a=a==null||a;if(this.readOnly!=
a){this.readOnly=a;this.keystrokeHandler.blockedKeystrokes[8]=+a;this.editable().setReadOnly(a);this.fire("readOnly")}},insertHtml:function(a,b){this.fire("insertHtml",{dataValue:a,mode:b})},insertText:function(a){this.fire("insertText",a)},insertElement:function(a){this.fire("insertElement",a)},focus:function(){this.fire("beforeFocus")},checkDirty:function(){return this.status=="ready"&&this._.previousValue!==this.getSnapshot()},resetDirty:function(){this._.previousValue=this.getSnapshot()},updateElement:function(){return y.call(this)},
setKeystroke:function(){for(var a=this.keystrokeHandler.keystrokes,b=CKEDITOR.tools.isArray(arguments[0])?arguments[0]:[[].slice.call(arguments,0)],c,d,e=b.length;e--;){c=b[e];d=0;if(CKEDITOR.tools.isArray(c)){d=c[1];c=c[0]}d?a[c]=d:delete a[c]}},addFeature:function(a){return this.filter.addFeature(a)},setActiveFilter:function(a){if(!a)a=this.filter;if(this.activeFilter!==a){this.activeFilter=a;this.fire("activeFilterChange");a===this.filter?this.setActiveEnterMode(null,null):this.setActiveEnterMode(a.getAllowedEnterMode(this.enterMode),
a.getAllowedEnterMode(this.shiftEnterMode,true))}},setActiveEnterMode:function(a,b){a=a?this.blockless?CKEDITOR.ENTER_BR:a:this.enterMode;b=b?this.blockless?CKEDITOR.ENTER_BR:b:this.shiftEnterMode;if(this.activeEnterMode!=a||this.activeShiftEnterMode!=b){this.activeEnterMode=a;this.activeShiftEnterMode=b;this.fire("activeEnterModeChange")}}})})();CKEDITOR.ELEMENT_MODE_NONE=0;CKEDITOR.ELEMENT_MODE_REPLACE=1;CKEDITOR.ELEMENT_MODE_APPENDTO=2;CKEDITOR.ELEMENT_MODE_INLINE=3;
CKEDITOR.htmlParser=function(){this._={htmlPartsRegex:/<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)--\>)|(?:([^\/\s>]+)((?:\s+[\w\-:.]+(?:\s*=\s*?(?:(?:"[^"]*")|(?:'[^']*')|[^\s"'\/>]+))?)*)[\S\s]*?(\/?)>))/g}};
(function(){var a=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,f={checked:1,compact:1,declare:1,defer:1,disabled:1,ismap:1,multiple:1,nohref:1,noresize:1,noshade:1,nowrap:1,readonly:1,selected:1};CKEDITOR.htmlParser.prototype={onTagOpen:function(){},onTagClose:function(){},onText:function(){},onCDATA:function(){},onComment:function(){},parse:function(b){for(var c,e,d=0,h;c=this._.htmlPartsRegex.exec(b);){e=c.index;if(e>d){d=b.substring(d,e);if(h)h.push(d);else this.onText(d)}d=
this._.htmlPartsRegex.lastIndex;if(e=c[1]){e=e.toLowerCase();if(h&&CKEDITOR.dtd.$cdata[e]){this.onCDATA(h.join(""));h=null}if(!h){this.onTagClose(e);continue}}if(h)h.push(c[0]);else if(e=c[3]){e=e.toLowerCase();if(!/="/.test(e)){var k={},j,g=c[4];c=!!c[5];if(g)for(;j=a.exec(g);){var m=j[1].toLowerCase();j=j[2]||j[3]||j[4]||"";k[m]=!j&&f[m]?m:CKEDITOR.tools.htmlDecodeAttr(j)}this.onTagOpen(e,k,c);!h&&CKEDITOR.dtd.$cdata[e]&&(h=[])}}else if(e=c[2])this.onComment(e)}if(b.length>d)this.onText(b.substring(d,
b.length))}}})();
CKEDITOR.htmlParser.basicWriter=CKEDITOR.tools.createClass({$:function(){this._={output:[]}},proto:{openTag:function(a){this._.output.push("<",a)},openTagClose:function(a,f){f?this._.output.push(" />"):this._.output.push(">")},attribute:function(a,f){typeof f=="string"&&(f=CKEDITOR.tools.htmlEncodeAttr(f));this._.output.push(" ",a,'="',f,'"')},closeTag:function(a){this._.output.push("</",a,">")},text:function(a){this._.output.push(a)},comment:function(a){this._.output.push("<\!--",a,"--\>")},write:function(a){this._.output.push(a)},
reset:function(){this._.output=[];this._.indent=false},getHtml:function(a){var f=this._.output.join("");a&&this.reset();return f}}});"use strict";
(function(){CKEDITOR.htmlParser.node=function(){};CKEDITOR.htmlParser.node.prototype={remove:function(){var a=this.parent.children,f=CKEDITOR.tools.indexOf(a,this),b=this.previous,c=this.next;b&&(b.next=c);c&&(c.previous=b);a.splice(f,1);this.parent=null},replaceWith:function(a){var f=this.parent.children,b=CKEDITOR.tools.indexOf(f,this),c=a.previous=this.previous,e=a.next=this.next;c&&(c.next=a);e&&(e.previous=a);f[b]=a;a.parent=this.parent;this.parent=null},insertAfter:function(a){var f=a.parent.children,
b=CKEDITOR.tools.indexOf(f,a),c=a.next;f.splice(b+1,0,this);this.next=a.next;this.previous=a;a.next=this;c&&(c.previous=this);this.parent=a.parent},insertBefore:function(a){var f=a.parent.children,b=CKEDITOR.tools.indexOf(f,a);f.splice(b,0,this);this.next=a;(this.previous=a.previous)&&(a.previous.next=this);a.previous=this;this.parent=a.parent},getAscendant:function(a){var f=typeof a=="function"?a:typeof a=="string"?function(b){return b.name==a}:function(b){return b.name in a},b=this.parent;for(;b&&
b.type==CKEDITOR.NODE_ELEMENT;){if(f(b))return b;b=b.parent}return null},wrapWith:function(a){this.replaceWith(a);a.add(this);return a},getIndex:function(){return CKEDITOR.tools.indexOf(this.parent.children,this)},getFilterContext:function(a){return a||{}}}})();"use strict";CKEDITOR.htmlParser.comment=function(a){this.value=a;this._={isBlockLike:false}};
CKEDITOR.htmlParser.comment.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_COMMENT,filter:function(a,f){var b=this.value;if(!(b=a.onComment(f,b,this))){this.remove();return false}if(typeof b!="string"){this.replaceWith(b);return false}this.value=b;return true},writeHtml:function(a,f){f&&this.filter(f);a.comment(this.value)}});"use strict";
(function(){CKEDITOR.htmlParser.text=function(a){this.value=a;this._={isBlockLike:false}};CKEDITOR.htmlParser.text.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_TEXT,filter:function(a,f){if(!(this.value=a.onText(f,this.value,this))){this.remove();return false}},writeHtml:function(a,f){f&&this.filter(f);a.text(this.value)}})})();"use strict";
(function(){CKEDITOR.htmlParser.cdata=function(a){this.value=a};CKEDITOR.htmlParser.cdata.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_TEXT,filter:function(){},writeHtml:function(a){a.write(this.value)}})})();"use strict";CKEDITOR.htmlParser.fragment=function(){this.children=[];this.parent=null;this._={isBlockLike:true,hasInlineStarted:false}};
(function(){function a(a){return a.attributes["data-cke-survive"]?false:a.name=="a"&&a.attributes.href||CKEDITOR.dtd.$removeEmpty[a.name]}var f=CKEDITOR.tools.extend({table:1,ul:1,ol:1,dl:1},CKEDITOR.dtd.table,CKEDITOR.dtd.ul,CKEDITOR.dtd.ol,CKEDITOR.dtd.dl),b={ol:1,ul:1},c=CKEDITOR.tools.extend({},{html:1},CKEDITOR.dtd.html,CKEDITOR.dtd.body,CKEDITOR.dtd.head,{style:1,script:1}),e={ul:"li",ol:"li",dl:"dd",table:"tbody",tbody:"tr",thead:"tr",tfoot:"tr",tr:"td"};CKEDITOR.htmlParser.fragment.fromHtml=
function(d,h,k){function j(a){var b;if(i.length>0)for(var c=0;c<i.length;c++){var d=i[c],e=d.name,f=CKEDITOR.dtd[e],l=u.name&&CKEDITOR.dtd[u.name];if((!l||l[e])&&(!a||!f||f[a]||!CKEDITOR.dtd[a])){if(!b){g();b=1}d=d.clone();d.parent=u;u=d;i.splice(c,1);c--}else if(e==u.name){y(u,u.parent,1);c--}}}function g(){for(;A.length;)y(A.shift(),u)}function m(a){if(a._.isBlockLike&&a.name!="pre"&&a.name!="textarea"){var b=a.children.length,c=a.children[b-1],d;if(c&&c.type==CKEDITOR.NODE_TEXT)(d=CKEDITOR.tools.rtrim(c.value))?
c.value=d:a.children.length=b-1}}function y(b,c,d){var c=c||u||t,e=u;if(b.previous===void 0){if(s(c,b)){u=c;q.onTagOpen(k,{});b.returnPoint=c=u}m(b);(!a(b)||b.children.length)&&c.add(b);b.name=="pre"&&(l=false);b.name=="textarea"&&(o=false)}if(b.returnPoint){u=b.returnPoint;delete b.returnPoint}else u=d?c:e}function s(a,b){if((a==t||a.name=="body")&&k&&(!a.name||CKEDITOR.dtd[a.name][k])){var c,d;return(c=b.attributes&&(d=b.attributes["data-cke-real-element-type"])?d:b.name)&&c in CKEDITOR.dtd.$inline&&
!(c in CKEDITOR.dtd.head)&&!b.isOrphan||b.type==CKEDITOR.NODE_TEXT}}function w(a,b){return a in CKEDITOR.dtd.$listItem||a in CKEDITOR.dtd.$tableContent?a==b||a=="dt"&&b=="dd"||a=="dd"&&b=="dt":false}var q=new CKEDITOR.htmlParser,t=h instanceof CKEDITOR.htmlParser.element?h:typeof h=="string"?new CKEDITOR.htmlParser.element(h):new CKEDITOR.htmlParser.fragment,i=[],A=[],u=t,o=t.name=="textarea",l=t.name=="pre";q.onTagOpen=function(d,e,h,m){e=new CKEDITOR.htmlParser.element(d,e);if(e.isUnknown&&h)e.isEmpty=
true;e.isOptionalClose=m;if(a(e))i.push(e);else{if(d=="pre")l=true;else{if(d=="br"&&l){u.add(new CKEDITOR.htmlParser.text("\n"));return}d=="textarea"&&(o=true)}if(d=="br")A.push(e);else{for(;;){m=(h=u.name)?CKEDITOR.dtd[h]||(u._.isBlockLike?CKEDITOR.dtd.div:CKEDITOR.dtd.span):c;if(!e.isUnknown&&!u.isUnknown&&!m[d])if(u.isOptionalClose)q.onTagClose(h);else if(d in b&&h in b){h=u.children;(h=h[h.length-1])&&h.name=="li"||y(h=new CKEDITOR.htmlParser.element("li"),u);!e.returnPoint&&(e.returnPoint=u);
u=h}else if(d in CKEDITOR.dtd.$listItem&&!w(d,h))q.onTagOpen(d=="li"?"ul":"dl",{},0,1);else if(h in f&&!w(d,h)){!e.returnPoint&&(e.returnPoint=u);u=u.parent}else{h in CKEDITOR.dtd.$inline&&i.unshift(u);if(u.parent)y(u,u.parent,1);else{e.isOrphan=1;break}}else break}j(d);g();e.parent=u;e.isEmpty?y(e):u=e}}};q.onTagClose=function(a){for(var b=i.length-1;b>=0;b--)if(a==i[b].name){i.splice(b,1);return}for(var c=[],d=[],e=u;e!=t&&e.name!=a;){e._.isBlockLike||d.unshift(e);c.push(e);e=e.returnPoint||e.parent}if(e!=
t){for(b=0;b<c.length;b++){var f=c[b];y(f,f.parent)}u=e;e._.isBlockLike&&g();y(e,e.parent);if(e==u)u=u.parent;i=i.concat(d)}a=="body"&&(k=false)};q.onText=function(a){if((!u._.hasInlineStarted||A.length)&&!l&&!o){a=CKEDITOR.tools.ltrim(a);if(a.length===0)return}var b=u.name,d=b?CKEDITOR.dtd[b]||(u._.isBlockLike?CKEDITOR.dtd.div:CKEDITOR.dtd.span):c;if(!o&&!d["#"]&&b in f){q.onTagOpen(e[b]||"");q.onText(a)}else{g();j();!l&&!o&&(a=a.replace(/[\t\r\n ]{2,}|[\t\r\n]/g," "));a=new CKEDITOR.htmlParser.text(a);
if(s(u,a))this.onTagOpen(k,{},0,1);u.add(a)}};q.onCDATA=function(a){u.add(new CKEDITOR.htmlParser.cdata(a))};q.onComment=function(a){g();j();u.add(new CKEDITOR.htmlParser.comment(a))};q.parse(d);for(g();u!=t;)y(u,u.parent,1);m(t);return t};CKEDITOR.htmlParser.fragment.prototype={type:CKEDITOR.NODE_DOCUMENT_FRAGMENT,add:function(a,b){isNaN(b)&&(b=this.children.length);var c=b>0?this.children[b-1]:null;if(c){if(a._.isBlockLike&&c.type==CKEDITOR.NODE_TEXT){c.value=CKEDITOR.tools.rtrim(c.value);if(c.value.length===
0){this.children.pop();this.add(a);return}}c.next=a}a.previous=c;a.parent=this;this.children.splice(b,0,a);if(!this._.hasInlineStarted)this._.hasInlineStarted=a.type==CKEDITOR.NODE_TEXT||a.type==CKEDITOR.NODE_ELEMENT&&!a._.isBlockLike},filter:function(a,b){b=this.getFilterContext(b);a.onRoot(b,this);this.filterChildren(a,false,b)},filterChildren:function(a,b,c){if(this.childrenFilteredBy!=a.id){c=this.getFilterContext(c);if(b&&!this.parent)a.onRoot(c,this);this.childrenFilteredBy=a.id;for(b=0;b<this.children.length;b++)this.children[b].filter(a,
c)===false&&b--}},writeHtml:function(a,b){b&&this.filter(b);this.writeChildrenHtml(a)},writeChildrenHtml:function(a,b,c){var e=this.getFilterContext();if(c&&!this.parent&&b)b.onRoot(e,this);b&&this.filterChildren(b,false,e);b=0;c=this.children;for(e=c.length;b<e;b++)c[b].writeHtml(a)},forEach:function(a,b,c){if(!c&&(!b||this.type==b))var e=a(this);if(e!==false)for(var c=this.children,f=0;f<c.length;f++){e=c[f];e.type==CKEDITOR.NODE_ELEMENT?e.forEach(a,b):(!b||e.type==b)&&a(e)}},getFilterContext:function(a){return a||
{}}}})();"use strict";
(function(){function a(){this.rules=[]}function f(b,c,e,d){var f,k;for(f in c){(k=b[f])||(k=b[f]=new a);k.add(c[f],e,d)}}CKEDITOR.htmlParser.filter=CKEDITOR.tools.createClass({$:function(b){this.id=CKEDITOR.tools.getNextNumber();this.elementNameRules=new a;this.attributeNameRules=new a;this.elementsRules={};this.attributesRules={};this.textRules=new a;this.commentRules=new a;this.rootRules=new a;b&&this.addRules(b,10)},proto:{addRules:function(a,c){var e;if(typeof c=="number")e=c;else if(c&&"priority"in
c)e=c.priority;typeof e!="number"&&(e=10);typeof c!="object"&&(c={});a.elementNames&&this.elementNameRules.addMany(a.elementNames,e,c);a.attributeNames&&this.attributeNameRules.addMany(a.attributeNames,e,c);a.elements&&f(this.elementsRules,a.elements,e,c);a.attributes&&f(this.attributesRules,a.attributes,e,c);a.text&&this.textRules.add(a.text,e,c);a.comment&&this.commentRules.add(a.comment,e,c);a.root&&this.rootRules.add(a.root,e,c)},applyTo:function(a){a.filter(this)},onElementName:function(a,c){return this.elementNameRules.execOnName(a,
c)},onAttributeName:function(a,c){return this.attributeNameRules.execOnName(a,c)},onText:function(a,c,e){return this.textRules.exec(a,c,e)},onComment:function(a,c,e){return this.commentRules.exec(a,c,e)},onRoot:function(a,c){return this.rootRules.exec(a,c)},onElement:function(a,c){for(var e=[this.elementsRules["^"],this.elementsRules[c.name],this.elementsRules.$],d,f=0;f<3;f++)if(d=e[f]){d=d.exec(a,c,this);if(d===false)return null;if(d&&d!=c)return this.onNode(a,d);if(c.parent&&!c.name)break}return c},
onNode:function(a,c){var e=c.type;return e==CKEDITOR.NODE_ELEMENT?this.onElement(a,c):e==CKEDITOR.NODE_TEXT?new CKEDITOR.htmlParser.text(this.onText(a,c.value)):e==CKEDITOR.NODE_COMMENT?new CKEDITOR.htmlParser.comment(this.onComment(a,c.value)):null},onAttribute:function(a,c,e,d){return(e=this.attributesRules[e])?e.exec(a,d,c,this):d}}});CKEDITOR.htmlParser.filterRulesGroup=a;a.prototype={add:function(a,c,e){this.rules.splice(this.findIndex(c),0,{value:a,priority:c,options:e})},addMany:function(a,
c,e){for(var d=[this.findIndex(c),0],f=0,k=a.length;f<k;f++)d.push({value:a[f],priority:c,options:e});this.rules.splice.apply(this.rules,d)},findIndex:function(a){for(var c=this.rules,e=c.length-1;e>=0&&a<c[e].priority;)e--;return e+1},exec:function(a,c){var e=c instanceof CKEDITOR.htmlParser.node||c instanceof CKEDITOR.htmlParser.fragment,d=Array.prototype.slice.call(arguments,1),f=this.rules,k=f.length,j,g,m,y;for(y=0;y<k;y++){if(e){j=c.type;g=c.name}m=f[y];if(!(a.nonEditable&&!m.options.applyToAll||
a.nestedEditable&&m.options.excludeNestedEditable)){m=m.value.apply(null,d);if(m===false||e&&m&&(m.name!=g||m.type!=j))return m;m!=null&&(d[0]=c=m)}}return c},execOnName:function(a,c){for(var e=0,d=this.rules,f=d.length,k;c&&e<f;e++){k=d[e];!(a.nonEditable&&!k.options.applyToAll||a.nestedEditable&&k.options.excludeNestedEditable)&&(c=c.replace(k.value[0],k.value[1]))}return c}}})();
(function(){function a(a,f){function p(a){return a||CKEDITOR.env.needsNbspFiller?new CKEDITOR.htmlParser.text(" "):new CKEDITOR.htmlParser.element("br",{"data-cke-bogus":1})}function r(a,e){return function(f){if(f.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT){var i=[],l=b(f),x,r;if(l)for(v(l,1)&&i.push(l);l;){if(d(l)&&(x=c(l))&&v(x))if((r=c(x))&&!d(r))i.push(x);else{p(g).insertAfter(x);x.remove()}l=l.previous}for(l=0;l<i.length;l++)i[l].remove();if(i=!a||(typeof e=="function"?e(f):e)!==false)if(!g&&!CKEDITOR.env.needsBrFiller&&
f.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT)i=false;else if(!g&&!CKEDITOR.env.needsBrFiller&&(document.documentMode>7||f.name in CKEDITOR.dtd.tr||f.name in CKEDITOR.dtd.$listItem))i=false;else{i=b(f);i=!i||f.name=="form"&&i.name=="input"}i&&f.add(p(a))}}}function v(a,b){if((!g||CKEDITOR.env.needsBrFiller)&&a.type==CKEDITOR.NODE_ELEMENT&&a.name=="br"&&!a.attributes["data-cke-eol"])return true;var c;if(a.type==CKEDITOR.NODE_TEXT&&(c=a.value.match(i))){if(c.index){(new CKEDITOR.htmlParser.text(a.value.substring(0,
c.index))).insertBefore(a);a.value=c[0]}if(!CKEDITOR.env.needsBrFiller&&g&&(!b||a.parent.name in z))return true;if(!g)if((c=a.previous)&&c.name=="br"||!c||d(c))return true}return false}var n={elements:{}},g=f=="html",z=CKEDITOR.tools.extend({},l),o;for(o in z)"#"in u[o]||delete z[o];for(o in z)n.elements[o]=r(g,a.config.fillEmptyBlocks);n.root=r(g,false);n.elements.br=function(a){return function(b){if(b.parent.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT){var f=b.attributes;if("data-cke-bogus"in f||"data-cke-eol"in
f)delete f["data-cke-bogus"];else{for(f=b.next;f&&e(f);)f=f.next;var i=c(b);!f&&d(b.parent)?h(b.parent,p(a)):d(f)&&(i&&!d(i))&&p(a).insertBefore(f)}}}}(g);return n}function f(a,b){return a!=CKEDITOR.ENTER_BR&&b!==false?a==CKEDITOR.ENTER_DIV?"div":"p":false}function b(a){for(a=a.children[a.children.length-1];a&&e(a);)a=a.previous;return a}function c(a){for(a=a.previous;a&&e(a);)a=a.previous;return a}function e(a){return a.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(a.value)||a.type==CKEDITOR.NODE_ELEMENT&&
a.attributes["data-cke-bookmark"]}function d(a){return a&&(a.type==CKEDITOR.NODE_ELEMENT&&a.name in l||a.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT)}function h(a,b){var c=a.children[a.children.length-1];a.children.push(b);b.parent=a;if(c){c.next=b;b.previous=c}}function k(a){a=a.attributes;a.contenteditable!="false"&&(a["data-cke-editable"]=a.contenteditable?"true":1);a.contenteditable="false"}function j(a){a=a.attributes;switch(a["data-cke-editable"]){case "true":a.contenteditable="true";break;case "1":delete a.contenteditable}}
function g(a){return a.replace(C,function(a,b,c){return"<"+b+c.replace(L,function(a,b){return F.test(b)&&c.indexOf("data-cke-saved-"+b)==-1?" data-cke-saved-"+a+" data-cke-"+CKEDITOR.rnd+"-"+a:a})+">"})}function m(a,b){return a.replace(b,function(a,b,c){a.indexOf("<textarea")===0&&(a=b+w(c).replace(/</g,"&lt;").replace(/>/g,"&gt;")+"</textarea>");return"<cke:encoded>"+encodeURIComponent(a)+"</cke:encoded>"})}function y(a){return a.replace(v,function(a,b){return decodeURIComponent(b)})}function s(a){return a.replace(/<\!--(?!{cke_protected})[\s\S]+?--\>/g,
function(a){return"<\!--"+A+"{C}"+encodeURIComponent(a).replace(/--/g,"%2D%2D")+"--\>"})}function w(a){return a.replace(/<\!--\{cke_protected\}\{C\}([\s\S]+?)--\>/g,function(a,b){return decodeURIComponent(b)})}function q(a,b){var c=b._.dataStore;return a.replace(/<\!--\{cke_protected\}([\s\S]+?)--\>/g,function(a,b){return decodeURIComponent(b)}).replace(/\{cke_protected_(\d+)\}/g,function(a,b){return c&&c[b]||""})}function t(a,b){for(var c=[],d=b.config.protectedSource,e=b._.dataStore||(b._.dataStore=
{id:1}),f=/<\!--\{cke_temp(comment)?\}(\d*?)--\>/g,d=[/<script[\s\S]*?<\/script>/gi,/<noscript[\s\S]*?<\/noscript>/gi,/<meta[\s\S]*?\/?>/gi].concat(d),a=a.replace(/<\!--[\s\S]*?--\>/g,function(a){return"<\!--{cke_tempcomment}"+(c.push(a)-1)+"--\>"}),i=0;i<d.length;i++)a=a.replace(d[i],function(a){a=a.replace(f,function(a,b,d){return c[d]});return/cke_temp(comment)?/.test(a)?a:"<\!--{cke_temp}"+(c.push(a)-1)+"--\>"});a=a.replace(f,function(a,b,d){return"<\!--"+A+(b?"{C}":"")+encodeURIComponent(c[d]).replace(/--/g,
"%2D%2D")+"--\>"});a=a.replace(/<\w+(?:\s+(?:(?:[^\s=>]+\s*=\s*(?:[^'"\s>]+|'[^']*'|"[^"]*"))|[^\s=>]+))+\s*>/g,function(a){return a.replace(/<\!--\{cke_protected\}([^>]*)--\>/g,function(a,b){e[e.id]=decodeURIComponent(b);return"{cke_protected_"+e.id++ +"}"})});return a=a.replace(/<(title|iframe|textarea)([^>]*)>([\s\S]*?)<\/\1>/g,function(a,c,d,e){return"<"+c+d+">"+q(w(e),b)+"</"+c+">"})}CKEDITOR.htmlDataProcessor=function(b){var c,d,e=this;this.editor=b;this.dataFilter=c=new CKEDITOR.htmlParser.filter;
this.htmlFilter=d=new CKEDITOR.htmlParser.filter;this.writer=new CKEDITOR.htmlParser.basicWriter;c.addRules(p);c.addRules(r,{applyToAll:true});c.addRules(a(b,"data"),{applyToAll:true});d.addRules(n);d.addRules(P,{applyToAll:true});d.addRules(a(b,"html"),{applyToAll:true});b.on("toHtml",function(a){var a=a.data,c=a.dataValue,d,c=t(c,b),c=m(c,I),c=g(c),c=m(c,K),c=c.replace(G,"$1cke:$2"),c=c.replace(B,"<cke:$1$2></cke:$1>"),c=c.replace(/(<pre\b[^>]*>)(\r\n|\n)/g,"$1$2$2"),c=c.replace(/([^a-z0-9<\-])(on\w{3,})(?!>)/gi,
"$1data-cke-"+CKEDITOR.rnd+"-$2");d=a.context||b.editable().getName();var e;if(CKEDITOR.env.ie&&CKEDITOR.env.version<9&&d=="pre"){d="div";c="<pre>"+c+"</pre>";e=1}d=b.document.createElement(d);d.setHtml("a"+c);c=d.getHtml().substr(1);c=c.replace(RegExp("data-cke-"+CKEDITOR.rnd+"-","ig"),"");e&&(c=c.replace(/^<pre>|<\/pre>$/gi,""));c=c.replace(z,"$1$2");c=y(c);c=w(c);d=a.fixForBody===false?false:f(a.enterMode,b.config.autoParagraph);c=CKEDITOR.htmlParser.fragment.fromHtml(c,a.context,d);if(d){e=c;
if(!e.children.length&&CKEDITOR.dtd[e.name][d]){d=new CKEDITOR.htmlParser.element(d);e.add(d)}}a.dataValue=c},null,null,5);b.on("toHtml",function(a){a.data.filter.applyTo(a.data.dataValue,true,a.data.dontFilter,a.data.enterMode)&&b.fire("dataFiltered")},null,null,6);b.on("toHtml",function(a){a.data.dataValue.filterChildren(e.dataFilter,true)},null,null,10);b.on("toHtml",function(a){var a=a.data,b=a.dataValue,c=new CKEDITOR.htmlParser.basicWriter;b.writeChildrenHtml(c);b=c.getHtml(true);a.dataValue=
s(b)},null,null,15);b.on("toDataFormat",function(a){var c=a.data.dataValue;a.data.enterMode!=CKEDITOR.ENTER_BR&&(c=c.replace(/^<br *\/?>/i,""));a.data.dataValue=CKEDITOR.htmlParser.fragment.fromHtml(c,a.data.context,f(a.data.enterMode,b.config.autoParagraph))},null,null,5);b.on("toDataFormat",function(a){a.data.dataValue.filterChildren(e.htmlFilter,true)},null,null,10);b.on("toDataFormat",function(a){a.data.filter.applyTo(a.data.dataValue,false,true)},null,null,11);b.on("toDataFormat",function(a){var c=
a.data.dataValue,d=e.writer;d.reset();c.writeChildrenHtml(d);c=d.getHtml(true);c=w(c);c=q(c,b);a.data.dataValue=c},null,null,15)};CKEDITOR.htmlDataProcessor.prototype={toHtml:function(a,b,c,d){var e=this.editor,f,i,l;if(b&&typeof b=="object"){f=b.context;c=b.fixForBody;d=b.dontFilter;i=b.filter;l=b.enterMode}else f=b;!f&&f!==null&&(f=e.editable().getName());return e.fire("toHtml",{dataValue:a,context:f,fixForBody:c,dontFilter:d,filter:i||e.filter,enterMode:l||e.enterMode}).dataValue},toDataFormat:function(a,
b){var c,d,e;if(b){c=b.context;d=b.filter;e=b.enterMode}!c&&c!==null&&(c=this.editor.editable().getName());return this.editor.fire("toDataFormat",{dataValue:a,filter:d||this.editor.filter,context:c,enterMode:e||this.editor.enterMode}).dataValue}};var i=/(?:&nbsp;|\xa0)$/,A="{cke_protected}",u=CKEDITOR.dtd,o=["caption","colgroup","col","thead","tfoot","tbody"],l=CKEDITOR.tools.extend({},u.$blockLimit,u.$block),p={elements:{input:k,textarea:k}},r={attributeNames:[[/^on/,"data-cke-pa-on"],[/^data-cke-expando$/,
""]]},n={elements:{embed:function(a){var b=a.parent;if(b&&b.name=="object"){var c=b.attributes.width,b=b.attributes.height;if(c)a.attributes.width=c;if(b)a.attributes.height=b}},a:function(a){if(!a.children.length&&!a.attributes.name&&!a.attributes["data-cke-saved-name"])return false}}},P={elementNames:[[/^cke:/,""],[/^\?xml:namespace$/,""]],attributeNames:[[/^data-cke-(saved|pa)-/,""],[/^data-cke-.*/,""],["hidefocus",""]],elements:{$:function(a){var b=a.attributes;if(b){if(b["data-cke-temp"])return false;
for(var c=["name","href","src"],d,e=0;e<c.length;e++){d="data-cke-saved-"+c[e];d in b&&delete b[c[e]]}}return a},table:function(a){a.children.slice(0).sort(function(a,b){var c,d;if(a.type==CKEDITOR.NODE_ELEMENT&&b.type==a.type){c=CKEDITOR.tools.indexOf(o,a.name);d=CKEDITOR.tools.indexOf(o,b.name)}if(!(c>-1&&d>-1&&c!=d)){c=a.parent?a.getIndex():-1;d=b.parent?b.getIndex():-1}return c>d?1:-1})},param:function(a){a.children=[];a.isEmpty=true;return a},span:function(a){a.attributes["class"]=="Apple-style-span"&&
delete a.name},html:function(a){delete a.attributes.contenteditable;delete a.attributes["class"]},body:function(a){delete a.attributes.spellcheck;delete a.attributes.contenteditable},style:function(a){var b=a.children[0];if(b&&b.value)b.value=CKEDITOR.tools.trim(b.value);if(!a.attributes.type)a.attributes.type="text/css"},title:function(a){var b=a.children[0];!b&&h(a,b=new CKEDITOR.htmlParser.text);b.value=a.attributes["data-cke-title"]||""},input:j,textarea:j},attributes:{"class":function(a){return CKEDITOR.tools.ltrim(a.replace(/(?:^|\s+)cke_[^\s]*/g,
""))||false}}};if(CKEDITOR.env.ie)P.attributes.style=function(a){return a.replace(/(^|;)([^\:]+)/g,function(a){return a.toLowerCase()})};var C=/<(a|area|img|input|source)\b([^>]*)>/gi,L=/([\w-]+)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+))/gi,F=/^(href|src|name)$/i,K=/(?:<style(?=[ >])[^>]*>[\s\S]*?<\/style>)|(?:<(:?link|meta|base)[^>]*>)/gi,I=/(<textarea(?=[ >])[^>]*>)([\s\S]*?)(?:<\/textarea>)/gi,v=/<cke:encoded>([^<]*)<\/cke:encoded>/gi,G=/(<\/?)((?:object|embed|param|html|body|head|title)[^>]*>)/gi,
z=/(<\/?)cke:((?:html|body|head|title)[^>]*>)/gi,B=/<cke:(param|embed)([^>]*?)\/?>(?!\s*<\/cke:\1)/gi})();"use strict";
CKEDITOR.htmlParser.element=function(a,f){this.name=a;this.attributes=f||{};this.children=[];var b=a||"",c=b.match(/^cke:(.*)/);c&&(b=c[1]);b=!(!CKEDITOR.dtd.$nonBodyContent[b]&&!CKEDITOR.dtd.$block[b]&&!CKEDITOR.dtd.$listItem[b]&&!CKEDITOR.dtd.$tableContent[b]&&!(CKEDITOR.dtd.$nonEditable[b]||b=="br"));this.isEmpty=!!CKEDITOR.dtd.$empty[a];this.isUnknown=!CKEDITOR.dtd[a];this._={isBlockLike:b,hasInlineStarted:this.isEmpty||!b}};
CKEDITOR.htmlParser.cssStyle=function(a){var f={};((a instanceof CKEDITOR.htmlParser.element?a.attributes.style:a)||"").replace(/&quot;/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(a,c,e){c=="font-family"&&(e=e.replace(/["']/g,""));f[c.toLowerCase()]=e});return{rules:f,populate:function(a){var c=this.toString();if(c)a instanceof CKEDITOR.dom.element?a.setAttribute("style",c):a instanceof CKEDITOR.htmlParser.element?a.attributes.style=c:a.style=c},toString:function(){var a=[],c;
for(c in f)f[c]&&a.push(c,":",f[c],";");return a.join("")}}};
(function(){function a(a){return function(b){return b.type==CKEDITOR.NODE_ELEMENT&&(typeof a=="string"?b.name==a:b.name in a)}}var f=function(a,b){a=a[0];b=b[0];return a<b?-1:a>b?1:0},b=CKEDITOR.htmlParser.fragment.prototype;CKEDITOR.htmlParser.element.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_ELEMENT,add:b.add,clone:function(){return new CKEDITOR.htmlParser.element(this.name,this.attributes)},filter:function(a,b){var d=this,f,k,b=d.getFilterContext(b);if(b.off)return true;
if(!d.parent)a.onRoot(b,d);for(;;){f=d.name;if(!(k=a.onElementName(b,f))){this.remove();return false}d.name=k;if(!(d=a.onElement(b,d))){this.remove();return false}if(d!==this){this.replaceWith(d);return false}if(d.name==f)break;if(d.type!=CKEDITOR.NODE_ELEMENT){this.replaceWith(d);return false}if(!d.name){this.replaceWithChildren();return false}}f=d.attributes;var j,g;for(j in f){g=j;for(k=f[j];;)if(g=a.onAttributeName(b,j))if(g!=j){delete f[j];j=g}else break;else{delete f[j];break}g&&((k=a.onAttribute(b,
d,g,k))===false?delete f[g]:f[g]=k)}d.isEmpty||this.filterChildren(a,false,b);return true},filterChildren:b.filterChildren,writeHtml:function(a,b){b&&this.filter(b);var d=this.name,h=[],k=this.attributes,j,g;a.openTag(d,k);for(j in k)h.push([j,k[j]]);a.sortAttributes&&h.sort(f);j=0;for(g=h.length;j<g;j++){k=h[j];a.attribute(k[0],k[1])}a.openTagClose(d,this.isEmpty);this.writeChildrenHtml(a);this.isEmpty||a.closeTag(d)},writeChildrenHtml:b.writeChildrenHtml,replaceWithChildren:function(){for(var a=
this.children,b=a.length;b;)a[--b].insertAfter(this);this.remove()},forEach:b.forEach,getFirst:function(b){if(!b)return this.children.length?this.children[0]:null;typeof b!="function"&&(b=a(b));for(var e=0,d=this.children.length;e<d;++e)if(b(this.children[e]))return this.children[e];return null},getHtml:function(){var a=new CKEDITOR.htmlParser.basicWriter;this.writeChildrenHtml(a);return a.getHtml()},setHtml:function(a){for(var a=this.children=CKEDITOR.htmlParser.fragment.fromHtml(a).children,b=0,
d=a.length;b<d;++b)a[b].parent=this},getOuterHtml:function(){var a=new CKEDITOR.htmlParser.basicWriter;this.writeHtml(a);return a.getHtml()},split:function(a){for(var b=this.children.splice(a,this.children.length-a),d=this.clone(),f=0;f<b.length;++f)b[f].parent=d;d.children=b;if(b[0])b[0].previous=null;if(a>0)this.children[a-1].next=null;this.parent.add(d,this.getIndex()+1);return d},addClass:function(a){if(!this.hasClass(a)){var b=this.attributes["class"]||"";this.attributes["class"]=b+(b?" ":"")+
a}},removeClass:function(a){var b=this.attributes["class"];if(b)(b=CKEDITOR.tools.trim(b.replace(RegExp("(?:\\s+|^)"+a+"(?:\\s+|$)")," ")))?this.attributes["class"]=b:delete this.attributes["class"]},hasClass:function(a){var b=this.attributes["class"];return!b?false:RegExp("(?:^|\\s)"+a+"(?=\\s|$)").test(b)},getFilterContext:function(a){var b=[];a||(a={off:false,nonEditable:false,nestedEditable:false});!a.off&&this.attributes["data-cke-processor"]=="off"&&b.push("off",true);!a.nonEditable&&this.attributes.contenteditable==
"false"?b.push("nonEditable",true):a.nonEditable&&(!a.nestedEditable&&this.attributes.contenteditable=="true")&&b.push("nestedEditable",true);if(b.length)for(var a=CKEDITOR.tools.copy(a),d=0;d<b.length;d=d+2)a[b[d]]=b[d+1];return a}},true)})();
(function(){var a={},f=/{([^}]+)}/g,b=/([\\'])/g,c=/\n/g,e=/\r/g;CKEDITOR.template=function(d){if(a[d])this.output=a[d];else{var h=d.replace(b,"\\$1").replace(c,"\\n").replace(e,"\\r").replace(f,function(a,b){return"',data['"+b+"']==undefined?'{"+b+"}':data['"+b+"'],'"});this.output=a[d]=Function("data","buffer","return buffer?buffer.push('"+h+"'):['"+h+"'].join('');")}}})();delete CKEDITOR.loadFullCore;CKEDITOR.instances={};CKEDITOR.document=new CKEDITOR.dom.document(document);
CKEDITOR.add=function(a){CKEDITOR.instances[a.name]=a;a.on("focus",function(){if(CKEDITOR.currentInstance!=a){CKEDITOR.currentInstance=a;CKEDITOR.fire("currentInstance")}});a.on("blur",function(){if(CKEDITOR.currentInstance==a){CKEDITOR.currentInstance=null;CKEDITOR.fire("currentInstance")}});CKEDITOR.fire("instance",null,a)};CKEDITOR.remove=function(a){delete CKEDITOR.instances[a.name]};
(function(){var a={};CKEDITOR.addTemplate=function(f,b){var c=a[f];if(c)return c;c={name:f,source:b};CKEDITOR.fire("template",c);return a[f]=new CKEDITOR.template(c.source)};CKEDITOR.getTemplate=function(f){return a[f]}})();(function(){var a=[];CKEDITOR.addCss=function(f){a.push(f)};CKEDITOR.getCss=function(){return a.join("\n")}})();CKEDITOR.on("instanceDestroyed",function(){CKEDITOR.tools.isEmpty(this.instances)&&CKEDITOR.fire("reset")});CKEDITOR.TRISTATE_ON=1;CKEDITOR.TRISTATE_OFF=2;
CKEDITOR.TRISTATE_DISABLED=0;
(function(){CKEDITOR.inline=function(a,f){if(!CKEDITOR.env.isCompatible)return null;a=CKEDITOR.dom.element.get(a);if(a.getEditor())throw'The editor instance "'+a.getEditor().name+'" is already attached to the provided element.';var b=new CKEDITOR.editor(f,a,CKEDITOR.ELEMENT_MODE_INLINE),c=a.is("textarea")?a:null;if(c){b.setData(c.getValue(),null,true);a=CKEDITOR.dom.element.createFromHtml('<div contenteditable="'+!!b.readOnly+'" class="cke_textarea_inline">'+c.getValue()+"</div>",CKEDITOR.document);
a.insertAfter(c);c.hide();c.$.form&&b._attachToForm()}else b.setData(a.getHtml(),null,true);b.on("loaded",function(){b.fire("uiReady");b.editable(a);b.container=a;b.setData(b.getData(1));b.resetDirty();b.fire("contentDom");b.mode="wysiwyg";b.fire("mode");b.status="ready";b.fireOnce("instanceReady");CKEDITOR.fire("instanceReady",null,b)},null,null,1E4);b.on("destroy",function(){if(c){b.container.clearCustomData();b.container.remove();c.show()}b.element.clearCustomData();delete b.element});return b};
CKEDITOR.inlineAll=function(){var a,f,b;for(b in CKEDITOR.dtd.$editable)for(var c=CKEDITOR.document.getElementsByTag(b),e=0,d=c.count();e<d;e++){a=c.getItem(e);if(a.getAttribute("contenteditable")=="true"){f={element:a,config:{}};CKEDITOR.fire("inline",f)!==false&&CKEDITOR.inline(a,f.config)}}};CKEDITOR.domReady(function(){!CKEDITOR.disableAutoInline&&CKEDITOR.inlineAll()})})();CKEDITOR.replaceClass="ckeditor";
(function(){function a(a,e,d,h){if(!CKEDITOR.env.isCompatible)return null;a=CKEDITOR.dom.element.get(a);if(a.getEditor())throw'The editor instance "'+a.getEditor().name+'" is already attached to the provided element.';var k=new CKEDITOR.editor(e,a,h);if(h==CKEDITOR.ELEMENT_MODE_REPLACE){a.setStyle("visibility","hidden");k._.required=a.hasAttribute("required");a.removeAttribute("required")}d&&k.setData(d,null,true);k.on("loaded",function(){b(k);h==CKEDITOR.ELEMENT_MODE_REPLACE&&(k.config.autoUpdateElement&&
a.$.form)&&k._attachToForm();k.setMode(k.config.startupMode,function(){k.resetDirty();k.status="ready";k.fireOnce("instanceReady");CKEDITOR.fire("instanceReady",null,k)})});k.on("destroy",f);return k}function f(){var a=this.container,b=this.element;if(a){a.clearCustomData();a.remove()}if(b){b.clearCustomData();if(this.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE){b.show();this._.required&&b.setAttribute("required","required")}delete this.element}}function b(a){var b=a.name,d=a.element,f=a.elementMode,
k=a.fire("uiSpace",{space:"top",html:""}).html,j=a.fire("uiSpace",{space:"bottom",html:""}).html,g=new CKEDITOR.template('<{outerEl} id="cke_{name}" class="{id} cke cke_reset cke_chrome cke_editor_{name} cke_{langDir} '+CKEDITOR.env.cssClass+'"  dir="{langDir}" lang="{langCode}" role="application"'+(a.title?' aria-labelledby="cke_{name}_arialbl"':"")+">"+(a.title?'<span id="cke_{name}_arialbl" class="cke_voice_label">{voiceLabel}</span>':"")+'<{outerEl} class="cke_inner cke_reset" role="presentation">{topHtml}<{outerEl} id="{contentId}" class="cke_contents cke_reset" role="presentation"></{outerEl}>{bottomHtml}</{outerEl}></{outerEl}>'),
b=CKEDITOR.dom.element.createFromHtml(g.output({id:a.id,name:b,langDir:a.lang.dir,langCode:a.langCode,voiceLabel:a.title,topHtml:k?'<span id="'+a.ui.spaceId("top")+'" class="cke_top cke_reset_all" role="presentation" style="height:auto">'+k+"</span>":"",contentId:a.ui.spaceId("contents"),bottomHtml:j?'<span id="'+a.ui.spaceId("bottom")+'" class="cke_bottom cke_reset_all" role="presentation">'+j+"</span>":"",outerEl:CKEDITOR.env.ie?"span":"div"}));if(f==CKEDITOR.ELEMENT_MODE_REPLACE){d.hide();b.insertAfter(d)}else d.append(b);
a.container=b;k&&a.ui.space("top").unselectable();j&&a.ui.space("bottom").unselectable();d=a.config.width;f=a.config.height;d&&b.setStyle("width",CKEDITOR.tools.cssLength(d));f&&a.ui.space("contents").setStyle("height",CKEDITOR.tools.cssLength(f));b.disableContextMenu();CKEDITOR.env.webkit&&b.on("focus",function(){a.focus()});a.fireOnce("uiReady")}CKEDITOR.replace=function(b,e){return a(b,e,null,CKEDITOR.ELEMENT_MODE_REPLACE)};CKEDITOR.appendTo=function(b,e,d){return a(b,e,d,CKEDITOR.ELEMENT_MODE_APPENDTO)};
CKEDITOR.replaceAll=function(){for(var a=document.getElementsByTagName("textarea"),b=0;b<a.length;b++){var d=null,f=a[b];if(f.name||f.id){if(typeof arguments[0]=="string"){if(!RegExp("(?:^|\\s)"+arguments[0]+"(?:$|\\s)").test(f.className))continue}else if(typeof arguments[0]=="function"){d={};if(arguments[0](f,d)===false)continue}this.replace(f,d)}}};CKEDITOR.editor.prototype.addMode=function(a,b){(this._.modes||(this._.modes={}))[a]=b};CKEDITOR.editor.prototype.setMode=function(a,b){var d=this,f=
this._.modes;if(!(a==d.mode||!f||!f[a])){d.fire("beforeSetMode",a);if(d.mode){var k=d.checkDirty(),f=d._.previousModeData,j,g=0;d.fire("beforeModeUnload");d.editable(0);d._.previousMode=d.mode;d._.previousModeData=j=d.getData(1);if(d.mode=="source"&&f==j){d.fire("lockSnapshot",{forceUpdate:true});g=1}d.ui.space("contents").setHtml("");d.mode=""}else d._.previousModeData=d.getData(1);this._.modes[a](function(){d.mode=a;k!==void 0&&!k&&d.resetDirty();g?d.fire("unlockSnapshot"):a=="wysiwyg"&&d.fire("saveSnapshot");
setTimeout(function(){d.fire("mode");b&&b.call(d)},0)})}};CKEDITOR.editor.prototype.resize=function(a,b,d,f){var k=this.container,j=this.ui.space("contents"),g=CKEDITOR.env.webkit&&this.document&&this.document.getWindow().$.frameElement,f=f?this.container.getFirst(function(a){return a.type==CKEDITOR.NODE_ELEMENT&&a.hasClass("cke_inner")}):k;f.setSize("width",a,true);g&&(g.style.width="1%");j.setStyle("height",Math.max(b-(d?0:(f.$.offsetHeight||0)-(j.$.clientHeight||0)),0)+"px");g&&(g.style.width=
"100%");this.fire("resize")};CKEDITOR.editor.prototype.getResizable=function(a){return a?this.ui.space("contents"):this.container};CKEDITOR.domReady(function(){CKEDITOR.replaceClass&&CKEDITOR.replaceAll(CKEDITOR.replaceClass)})})();CKEDITOR.config.startupMode="wysiwyg";
(function(){function a(a){var b=a.editor,d=a.data.path,e=d.blockLimit,l=a.data.selection,p=l.getRanges()[0],r;if(CKEDITOR.env.gecko||CKEDITOR.env.ie&&CKEDITOR.env.needsBrFiller)if(l=f(l,d)){l.appendBogus();r=CKEDITOR.env.ie}if(h(b,d.block,e)&&p.collapsed&&!p.getCommonAncestor().isReadOnly()){d=p.clone();d.enlarge(CKEDITOR.ENLARGE_BLOCK_CONTENTS);e=new CKEDITOR.dom.walker(d);e.guard=function(a){return!c(a)||a.type==CKEDITOR.NODE_COMMENT||a.isReadOnly()};if(!e.checkForward()||d.checkStartOfBlock()&&
d.checkEndOfBlock()){b=p.fixBlock(true,b.activeEnterMode==CKEDITOR.ENTER_DIV?"div":"p");if(!CKEDITOR.env.needsBrFiller)(b=b.getFirst(c))&&(b.type==CKEDITOR.NODE_TEXT&&CKEDITOR.tools.trim(b.getText()).match(/^(?:&nbsp;|\xa0)$/))&&b.remove();r=1;a.cancel()}}r&&p.select()}function f(a,b){if(a.isFake)return 0;var d=b.block||b.blockLimit,e=d&&d.getLast(c);if(d&&d.isBlockBoundary()&&(!e||!(e.type==CKEDITOR.NODE_ELEMENT&&e.isBlockBoundary()))&&!d.is("pre")&&!d.getBogus())return d}function b(a){var b=a.data.getTarget();
if(b.is("input")){b=b.getAttribute("type");(b=="submit"||b=="reset")&&a.data.preventDefault()}}function c(a){return s(a)&&w(a)}function e(a,b){return function(c){var d=CKEDITOR.dom.element.get(c.data.$.toElement||c.data.$.fromElement||c.data.$.relatedTarget);(!d||!b.equals(d)&&!b.contains(d))&&a.call(this,c)}}function d(a){function b(a){return function(b,e){e&&(b.type==CKEDITOR.NODE_ELEMENT&&b.is(f))&&(d=b);if(!e&&c(b)&&(!a||!m(b)))return false}}var d,e=a.getRanges()[0],a=a.root,f={table:1,ul:1,ol:1,
dl:1};if(e.startPath().contains(f)){var p=e.clone();p.collapse(1);p.setStartAt(a,CKEDITOR.POSITION_AFTER_START);a=new CKEDITOR.dom.walker(p);a.guard=b();a.checkBackward();if(d){p=e.clone();p.collapse();p.setEndAt(d,CKEDITOR.POSITION_AFTER_END);a=new CKEDITOR.dom.walker(p);a.guard=b(true);d=false;a.checkForward();return d}}return null}function h(a,b,c){return a.config.autoParagraph!==false&&a.activeEnterMode!=CKEDITOR.ENTER_BR&&a.editable().equals(c)&&!b||b&&b.getAttribute("contenteditable")=="true"}
function k(a){a.editor.focus();a.editor.fire("saveSnapshot")}function j(a){var b=a.editor;b.getSelection().scrollIntoView();setTimeout(function(){b.fire("saveSnapshot")},0)}function g(a,b,c){for(var d=a.getCommonAncestor(b),b=a=c?b:a;(a=a.getParent())&&!d.equals(a)&&a.getChildCount()==1;)b=a;b.remove()}CKEDITOR.editable=CKEDITOR.tools.createClass({base:CKEDITOR.dom.element,$:function(a,b){this.base(b.$||b);this.editor=a;this.status="unloaded";this.hasFocus=false;this.setup()},proto:{focus:function(){var a;
if(CKEDITOR.env.webkit&&!this.hasFocus){a=this.editor._.previousActive||this.getDocument().getActive();if(this.contains(a)){a.focus();return}}try{this.$[CKEDITOR.env.ie&&this.getDocument().equals(CKEDITOR.document)?"setActive":"focus"]()}catch(b){if(!CKEDITOR.env.ie)throw b;}if(CKEDITOR.env.safari&&!this.isInline()){a=CKEDITOR.document.getActive();a.equals(this.getWindow().getFrame())||this.getWindow().focus()}},on:function(a,b){var c=Array.prototype.slice.call(arguments,0);if(CKEDITOR.env.ie&&/^focus|blur$/.exec(a)){a=
a=="focus"?"focusin":"focusout";b=e(b,this);c[0]=a;c[1]=b}return CKEDITOR.dom.element.prototype.on.apply(this,c)},attachListener:function(a){!this._.listeners&&(this._.listeners=[]);var b=Array.prototype.slice.call(arguments,1),b=a.on.apply(a,b);this._.listeners.push(b);return b},clearListeners:function(){var a=this._.listeners;try{for(;a.length;)a.pop().removeListener()}catch(b){}},restoreAttrs:function(){var a=this._.attrChanges,b,c;for(c in a)if(a.hasOwnProperty(c)){b=a[c];b!==null?this.setAttribute(c,
b):this.removeAttribute(c)}},attachClass:function(a){var b=this.getCustomData("classes");if(!this.hasClass(a)){!b&&(b=[]);b.push(a);this.setCustomData("classes",b);this.addClass(a)}},changeAttr:function(a,b){var c=this.getAttribute(a);if(b!==c){!this._.attrChanges&&(this._.attrChanges={});a in this._.attrChanges||(this._.attrChanges[a]=c);this.setAttribute(a,b)}},insertHtml:function(a,b){k(this);q(this,b||"html",a)},insertText:function(a){k(this);var b=this.editor,c=b.getSelection().getStartElement().hasAscendant("pre",
true)?CKEDITOR.ENTER_BR:b.activeEnterMode,b=c==CKEDITOR.ENTER_BR,d=CKEDITOR.tools,a=d.htmlEncode(a.replace(/\r\n/g,"\n")),a=a.replace(/\t/g,"&nbsp;&nbsp; &nbsp;"),c=c==CKEDITOR.ENTER_P?"p":"div";if(!b){var e=/\n{2}/g;if(e.test(a))var f="<"+c+">",r="</"+c+">",a=f+a.replace(e,function(){return r+f})+r}a=a.replace(/\n/g,"<br>");b||(a=a.replace(RegExp("<br>(?=</"+c+">)"),function(a){return d.repeat(a,2)}));a=a.replace(/^ | $/g,"&nbsp;");a=a.replace(/(>|\s) /g,function(a,b){return b+"&nbsp;"}).replace(/ (?=<)/g,
"&nbsp;");q(this,"text",a)},insertElement:function(a,b){b?this.insertElementIntoRange(a,b):this.insertElementIntoSelection(a)},insertElementIntoRange:function(a,b){var c=this.editor,d=c.config.enterMode,e=a.getName(),f=CKEDITOR.dtd.$block[e];if(b.checkReadOnly())return false;b.deleteContents(1);b.startContainer.type==CKEDITOR.NODE_ELEMENT&&b.startContainer.is({tr:1,table:1,tbody:1,thead:1,tfoot:1})&&t(b);var r,n;if(f)for(;(r=b.getCommonAncestor(0,1))&&(n=CKEDITOR.dtd[r.getName()])&&(!n||!n[e]);)if(r.getName()in
CKEDITOR.dtd.span)b.splitElement(r);else if(b.checkStartOfBlock()&&b.checkEndOfBlock()){b.setStartBefore(r);b.collapse(true);r.remove()}else b.splitBlock(d==CKEDITOR.ENTER_DIV?"div":"p",c.editable());b.insertNode(a);return true},insertElementIntoSelection:function(a){k(this);var b=this.editor,d=b.activeEnterMode,b=b.getSelection(),e=b.getRanges()[0],f=a.getName(),f=CKEDITOR.dtd.$block[f];if(this.insertElementIntoRange(a,e)){e.moveToPosition(a,CKEDITOR.POSITION_AFTER_END);if(f)if((f=a.getNext(function(a){return c(a)&&
!m(a)}))&&f.type==CKEDITOR.NODE_ELEMENT&&f.is(CKEDITOR.dtd.$block))f.getDtd()["#"]?e.moveToElementEditStart(f):e.moveToElementEditEnd(a);else if(!f&&d!=CKEDITOR.ENTER_BR){f=e.fixBlock(true,d==CKEDITOR.ENTER_DIV?"div":"p");e.moveToElementEditStart(f)}}b.selectRanges([e]);j(this)},setData:function(a,b){b||(a=this.editor.dataProcessor.toHtml(a));this.setHtml(a);this.fixInitialSelection();if(this.status=="unloaded")this.status="ready";this.editor.fire("dataReady")},getData:function(a){var b=this.getHtml();
a||(b=this.editor.dataProcessor.toDataFormat(b));return b},setReadOnly:function(a){this.setAttribute("contenteditable",!a)},detach:function(){this.removeClass("cke_editable");this.status="detached";var a=this.editor;this._.detach();delete a.document;delete a.window},isInline:function(){return this.getDocument().equals(CKEDITOR.document)},fixInitialSelection:function(){function a(){var b=c.getDocument().$,d=b.getSelection(),e;if(d.anchorNode&&d.anchorNode==c.$)e=true;else if(CKEDITOR.env.webkit){var f=
c.getDocument().getActive();f&&(f.equals(c)&&!d.anchorNode)&&(e=true)}if(e){e=new CKEDITOR.dom.range(c);e.moveToElementEditStart(c);b=b.createRange();b.setStart(e.startContainer.$,e.startOffset);b.collapse(true);d.removeAllRanges();d.addRange(b)}}function b(){var a=c.getDocument().$,d=a.selection,e=c.getDocument().getActive();if(d.type=="None"&&e.equals(c)){d=new CKEDITOR.dom.range(c);a=a.body.createTextRange();d.moveToElementEditStart(c);d=d.startContainer;d.type!=CKEDITOR.NODE_ELEMENT&&(d=d.getParent());
a.moveToElementText(d.$);a.collapse(true);a.select()}}var c=this;if(CKEDITOR.env.ie&&(CKEDITOR.env.version<9||CKEDITOR.env.quirks)){if(this.hasFocus){this.focus();b()}}else if(this.hasFocus){this.focus();a()}else this.once("focus",function(){a()},null,null,-999)},setup:function(){var a=this.editor;this.attachListener(a,"beforeGetData",function(){var b=this.getData();this.is("textarea")||a.config.ignoreEmptyParagraph!==false&&(b=b.replace(y,function(a,b){return b}));a.setData(b,null,1)},this);this.attachListener(a,
"getSnapshot",function(a){a.data=this.getData(1)},this);this.attachListener(a,"afterSetData",function(){this.setData(a.getData(1))},this);this.attachListener(a,"loadSnapshot",function(a){this.setData(a.data,1)},this);this.attachListener(a,"beforeFocus",function(){var b=a.getSelection();(b=b&&b.getNative())&&b.type=="Control"||this.focus()},this);this.attachListener(a,"insertHtml",function(a){this.insertHtml(a.data.dataValue,a.data.mode)},this);this.attachListener(a,"insertElement",function(a){this.insertElement(a.data)},
this);this.attachListener(a,"insertText",function(a){this.insertText(a.data)},this);this.setReadOnly(a.readOnly);this.attachClass("cke_editable");this.attachClass(a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?"cke_editable_inline":a.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE||a.elementMode==CKEDITOR.ELEMENT_MODE_APPENDTO?"cke_editable_themed":"");this.attachClass("cke_contents_"+a.config.contentsLangDirection);a.keystrokeHandler.blockedKeystrokes[8]=+a.readOnly;a.keystrokeHandler.attach(this);this.on("blur",
function(){this.hasFocus=false},null,null,-1);this.on("focus",function(){this.hasFocus=true},null,null,-1);a.focusManager.add(this);if(this.equals(CKEDITOR.document.getActive())){this.hasFocus=true;a.once("contentDom",function(){a.focusManager.focus(this)},this)}this.isInline()&&this.changeAttr("tabindex",a.tabIndex);if(!this.is("textarea")){a.document=this.getDocument();a.window=this.getWindow();var e=a.document;this.changeAttr("spellcheck",!a.config.disableNativeSpellChecker);var f=a.config.contentsLangDirection;
this.getDirection(1)!=f&&this.changeAttr("dir",f);var h=CKEDITOR.getCss();if(h){f=e.getHead();if(!f.getCustomData("stylesheet")){h=e.appendStyleText(h);h=new CKEDITOR.dom.element(h.ownerNode||h.owningElement);f.setCustomData("stylesheet",h);h.data("cke-temp",1)}}f=e.getCustomData("stylesheet_ref")||0;e.setCustomData("stylesheet_ref",f+1);this.setCustomData("cke_includeReadonly",!a.config.disableReadonlyStyling);this.attachListener(this,"click",function(a){var a=a.data,b=(new CKEDITOR.dom.elementPath(a.getTarget(),
this)).contains("a");b&&(a.$.button!=2&&b.isReadOnly())&&a.preventDefault()});var l={8:1,46:1};this.attachListener(a,"key",function(b){if(a.readOnly)return true;var c=b.data.domEvent.getKey(),e;if(c in l){var b=a.getSelection(),f,h=b.getRanges()[0],g=h.startPath(),o,m,j,c=c==8;if(CKEDITOR.env.ie&&CKEDITOR.env.version<11&&(f=b.getSelectedElement())||(f=d(b))){a.fire("saveSnapshot");h.moveToPosition(f,CKEDITOR.POSITION_BEFORE_START);f.remove();h.select();a.fire("saveSnapshot");e=1}else if(h.collapsed)if((o=
g.block)&&(j=o[c?"getPrevious":"getNext"](s))&&j.type==CKEDITOR.NODE_ELEMENT&&j.is("table")&&h[c?"checkStartOfBlock":"checkEndOfBlock"]()){a.fire("saveSnapshot");h[c?"checkEndOfBlock":"checkStartOfBlock"]()&&o.remove();h["moveToElementEdit"+(c?"End":"Start")](j);h.select();a.fire("saveSnapshot");e=1}else if(g.blockLimit&&g.blockLimit.is("td")&&(m=g.blockLimit.getAscendant("table"))&&h.checkBoundaryOfElement(m,c?CKEDITOR.START:CKEDITOR.END)&&(j=m[c?"getPrevious":"getNext"](s))){a.fire("saveSnapshot");
h["moveToElementEdit"+(c?"End":"Start")](j);h.checkStartOfBlock()&&h.checkEndOfBlock()?j.remove():h.select();a.fire("saveSnapshot");e=1}else if((m=g.contains(["td","th","caption"]))&&h.checkBoundaryOfElement(m,c?CKEDITOR.START:CKEDITOR.END))e=1}return!e});a.blockless&&(CKEDITOR.env.ie&&CKEDITOR.env.needsBrFiller)&&this.attachListener(this,"keyup",function(b){if(b.data.getKeystroke()in l&&!this.getFirst(c)){this.appendBogus();b=a.createRange();b.moveToPosition(this,CKEDITOR.POSITION_AFTER_START);b.select()}});
this.attachListener(this,"dblclick",function(b){if(a.readOnly)return false;b={element:b.data.getTarget()};a.fire("doubleclick",b)});CKEDITOR.env.ie&&this.attachListener(this,"click",b);CKEDITOR.env.ie||this.attachListener(this,"mousedown",function(b){var c=b.data.getTarget();if(c.is("img","hr","input","textarea","select")&&!c.isReadOnly()){a.getSelection().selectElement(c);c.is("input","textarea","select")&&b.data.preventDefault()}});CKEDITOR.env.gecko&&this.attachListener(this,"mouseup",function(b){if(b.data.$.button==
2){b=b.data.getTarget();if(!b.getOuterHtml().replace(y,"")){var c=a.createRange();c.moveToElementEditStart(b);c.select(true)}}});if(CKEDITOR.env.webkit){this.attachListener(this,"click",function(a){a.data.getTarget().is("input","select")&&a.data.preventDefault()});this.attachListener(this,"mouseup",function(a){a.data.getTarget().is("input","textarea")&&a.data.preventDefault()})}CKEDITOR.env.webkit&&this.attachListener(a,"key",function(b){b=b.data.domEvent.getKey();if(b in l){var c=b==8,d=a.getSelection().getRanges()[0],
b=d.startPath();if(d.collapsed){var e;a:{var f=b.block;if(f)if(d[c?"checkStartOfBlock":"checkEndOfBlock"]())if(!d.moveToClosestEditablePosition(f,!c)||!d.collapsed)e=false;else{if(d.startContainer.type==CKEDITOR.NODE_ELEMENT){var h=d.startContainer.getChild(d.startOffset-(c?1:0));if(h&&h.type==CKEDITOR.NODE_ELEMENT&&h.is("hr")){a.fire("saveSnapshot");h.remove();e=true;break a}}if((d=d.startPath().block)&&(!d||!d.contains(f))){a.fire("saveSnapshot");var j;(j=(c?d:f).getBogus())&&j.remove();e=a.getSelection();
j=e.createBookmarks();(c?f:d).moveChildren(c?d:f,false);b.lastElement.mergeSiblings();g(f,d,!c);e.selectBookmarks(j);e=true}}else e=false;else e=false}if(!e)return}else{c=d;e=b.block;j=c.endPath().block;if(!e||!j||e.equals(j))b=false;else{a.fire("saveSnapshot");(f=e.getBogus())&&f.remove();c.deleteContents();if(j.getParent()){j.moveChildren(e,false);b.lastElement.mergeSiblings();g(e,j,true)}c=a.getSelection().getRanges()[0];c.collapse(1);c.select();b=true}if(!b)return}a.getSelection().scrollIntoView();
a.fire("saveSnapshot");return false}},this,null,100)}}},_:{detach:function(){this.editor.setData(this.editor.getData(),0,1);this.clearListeners();this.restoreAttrs();var a;if(a=this.removeCustomData("classes"))for(;a.length;)this.removeClass(a.pop());if(!this.is("textarea")){a=this.getDocument();var b=a.getHead();if(b.getCustomData("stylesheet")){var c=a.getCustomData("stylesheet_ref");if(--c)a.setCustomData("stylesheet_ref",c);else{a.removeCustomData("stylesheet_ref");b.removeCustomData("stylesheet").remove()}}}this.editor.fire("contentDomUnload");
delete this.editor}}});CKEDITOR.editor.prototype.editable=function(a){var b=this._.editable;if(b&&a)return 0;if(arguments.length)b=this._.editable=a?a instanceof CKEDITOR.editable?a:new CKEDITOR.editable(this,a):(b&&b.detach(),null);return b};var m=CKEDITOR.dom.walker.bogus(),y=/(^|<body\b[^>]*>)\s*<(p|div|address|h\d|center|pre)[^>]*>\s*(?:<br[^>]*>|&nbsp;|\u00A0|&#160;)?\s*(:?<\/\2>)?\s*(?=$|<\/body>)/gi,s=CKEDITOR.dom.walker.whitespaces(true),w=CKEDITOR.dom.walker.bookmark(false,true);CKEDITOR.on("instanceLoaded",
function(b){var c=b.editor;c.on("insertElement",function(a){a=a.data;if(a.type==CKEDITOR.NODE_ELEMENT&&(a.is("input")||a.is("textarea"))){a.getAttribute("contentEditable")!="false"&&a.data("cke-editable",a.hasAttribute("contenteditable")?"true":"1");a.setAttribute("contentEditable",false)}});c.on("selectionChange",function(b){if(!c.readOnly){var d=c.getSelection();if(d&&!d.isLocked){d=c.checkDirty();c.fire("lockSnapshot");a(b);c.fire("unlockSnapshot");!d&&c.resetDirty()}}})});CKEDITOR.on("instanceCreated",
function(a){var b=a.editor;b.on("mode",function(){var a=b.editable();if(a&&a.isInline()){var c=b.title;a.changeAttr("role","textbox");a.changeAttr("aria-label",c);c&&a.changeAttr("title",c);var d=b.fire("ariaEditorHelpLabel",{}).label;if(d)if(c=this.ui.space(this.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?"top":"contents")){var e=CKEDITOR.tools.getNextId(),d=CKEDITOR.dom.element.createFromHtml('<span id="'+e+'" class="cke_voice_label">'+d+"</span>");c.append(d);a.changeAttr("aria-describedby",e)}}})});
CKEDITOR.addCss(".cke_editable{cursor:text}.cke_editable img,.cke_editable input,.cke_editable textarea{cursor:default}");var q=function(){function a(b){return b.type==CKEDITOR.NODE_ELEMENT}function b(c,d){var e,f,l,p,h=[],g=d.range.startContainer;e=d.range.startPath();for(var g=r[g.getName()],n=0,j=c.getChildren(),m=j.count(),o=-1,C=-1,k=0,q=e.contains(r.$list);n<m;++n){e=j.getItem(n);if(a(e)){l=e.getName();if(q&&l in CKEDITOR.dtd.$list)h=h.concat(b(e,d));else{p=!!g[l];if(l=="br"&&e.data("cke-eol")&&
(!n||n==m-1)){k=(f=n?h[n-1].node:j.getItem(n+1))&&(!a(f)||!f.is("br"));f=f&&a(f)&&r.$block[f.getName()]}o==-1&&!p&&(o=n);p||(C=n);h.push({isElement:1,isLineBreak:k,isBlock:e.isBlockBoundary(),hasBlockSibling:f,node:e,name:l,allowed:p});f=k=0}}else h.push({isElement:0,node:e,allowed:1})}if(o>-1)h[o].firstNotAllowed=1;if(C>-1)h[C].lastNotAllowed=1;return h}function d(b,c){var e=[],f=b.getChildren(),l=f.count(),p,h=0,g=r[c],n=!b.is(r.$inline)||b.is("br");for(n&&e.push(" ");h<l;h++){p=f.getItem(h);a(p)&&
!p.is(g)?e=e.concat(d(p,c)):e.push(p)}n&&e.push(" ");return e}function e(b){return b&&a(b)&&(b.is(r.$removeEmpty)||b.is("a")&&!b.isBlockBoundary())}function f(b,c,d,e){var p=b.clone(),h,r;p.setEndAt(c,CKEDITOR.POSITION_BEFORE_END);if((h=(new CKEDITOR.dom.walker(p)).next())&&a(h)&&g[h.getName()]&&(r=h.getPrevious())&&a(r)&&!r.getParent().equals(b.startContainer)&&d.contains(r)&&e.contains(h)&&h.isIdentical(r)){h.moveChildren(r);h.remove();f(b,c,d,e)}}function p(b,c){function d(b,c){if(c.isBlock&&c.isElement&&
!c.node.is("br")&&a(b)&&b.is("br")){b.remove();return 1}}var e=c.endContainer.getChild(c.endOffset),f=c.endContainer.getChild(c.endOffset-1);e&&d(e,b[b.length-1]);if(f&&d(f,b[0])){c.setEnd(c.endContainer,c.endOffset-1);c.collapse()}}var r=CKEDITOR.dtd,g={p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,ul:1,ol:1,li:1,pre:1,dl:1,blockquote:1},m={p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1},C=CKEDITOR.tools.extend({},r.$inline);delete C.br;return function(g,n,k){var q=g.editor,v=q.getSelection().getRanges()[0],
G=false;if(n=="unfiltered_html"){n="html";G=true}if(!v.checkReadOnly()){var z=(new CKEDITOR.dom.elementPath(v.startContainer,v.root)).blockLimit||v.root,n={type:n,dontFilter:G,editable:g,editor:q,range:v,blockLimit:z,mergeCandidates:[],zombies:[]},q=n.range,G=n.mergeCandidates,B,x,E,s;if(n.type=="text"&&q.shrink(CKEDITOR.SHRINK_ELEMENT,true,false)){B=CKEDITOR.dom.element.createFromHtml("<span>&nbsp;</span>",q.document);q.insertNode(B);q.setStartAfter(B)}x=new CKEDITOR.dom.elementPath(q.startContainer);
n.endPath=E=new CKEDITOR.dom.elementPath(q.endContainer);if(!q.collapsed){var z=E.block||E.blockLimit,w=q.getCommonAncestor();z&&(!z.equals(w)&&!z.contains(w)&&q.checkEndOfBlock())&&n.zombies.push(z);q.deleteContents()}for(;(s=a(q.startContainer)&&q.startContainer.getChild(q.startOffset-1))&&a(s)&&s.isBlockBoundary()&&x.contains(s);)q.moveToPosition(s,CKEDITOR.POSITION_BEFORE_END);f(q,n.blockLimit,x,E);if(B){q.setEndBefore(B);q.collapse();B.remove()}B=q.startPath();if(z=B.contains(e,false,1)){q.splitElement(z);
n.inlineStylesRoot=z;n.inlineStylesPeak=B.lastElement}B=q.createBookmark();(z=B.startNode.getPrevious(c))&&a(z)&&e(z)&&G.push(z);(z=B.startNode.getNext(c))&&a(z)&&e(z)&&G.push(z);for(z=B.startNode;(z=z.getParent())&&e(z);)G.push(z);q.moveToBookmark(B);if(B=k){B=n.range;if(n.type=="text"&&n.inlineStylesRoot){s=n.inlineStylesPeak;q=s.getDocument().createText("{cke-peak}");for(G=n.inlineStylesRoot.getParent();!s.equals(G);){q=q.appendTo(s.clone());s=s.getParent()}k=q.getOuterHtml().split("{cke-peak}").join(k)}s=
n.blockLimit.getName();if(/^\s+|\s+$/.test(k)&&"span"in CKEDITOR.dtd[s])var y='<span data-cke-marker="1">&nbsp;</span>',k=y+k+y;k=n.editor.dataProcessor.toHtml(k,{context:null,fixForBody:false,dontFilter:n.dontFilter,filter:n.editor.activeFilter,enterMode:n.editor.activeEnterMode});s=B.document.createElement("body");s.setHtml(k);if(y){s.getFirst().remove();s.getLast().remove()}if((y=B.startPath().block)&&!(y.getChildCount()==1&&y.getBogus()))a:{var t;if(s.getChildCount()==1&&a(t=s.getFirst())&&t.is(m)){y=
t.getElementsByTag("*");B=0;for(G=y.count();B<G;B++){q=y.getItem(B);if(!q.is(C))break a}t.moveChildren(t.getParent(1));t.remove()}}n.dataWrapper=s;B=k}if(B){t=n.range;var y=t.document,D,k=n.blockLimit;B=0;var J;s=[];var H,Q,G=q=0,M,S;x=t.startContainer;var z=n.endPath.elements[0],T;E=z.getPosition(x);w=!!z.getCommonAncestor(x)&&E!=CKEDITOR.POSITION_IDENTICAL&&!(E&CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_IS_CONTAINED);x=b(n.dataWrapper,n);for(p(x,t);B<x.length;B++){E=x[B];if(D=E.isLineBreak){D=
t;M=k;var O=void 0,V=void 0;if(E.hasBlockSibling)D=1;else{O=D.startContainer.getAscendant(r.$block,1);if(!O||!O.is({div:1,p:1}))D=0;else{V=O.getPosition(M);if(V==CKEDITOR.POSITION_IDENTICAL||V==CKEDITOR.POSITION_CONTAINS)D=0;else{M=D.splitElement(O);D.moveToPosition(M,CKEDITOR.POSITION_AFTER_START);D=1}}}}if(D)G=B>0;else{D=t.startPath();if(!E.isBlock&&h(n.editor,D.block,D.blockLimit)&&(Q=n.editor.activeEnterMode!=CKEDITOR.ENTER_BR&&n.editor.config.autoParagraph!==false?n.editor.activeEnterMode==CKEDITOR.ENTER_DIV?
"div":"p":false)){Q=y.createElement(Q);Q.appendBogus();t.insertNode(Q);CKEDITOR.env.needsBrFiller&&(J=Q.getBogus())&&J.remove();t.moveToPosition(Q,CKEDITOR.POSITION_BEFORE_END)}if((D=t.startPath().block)&&!D.equals(H)){if(J=D.getBogus()){J.remove();s.push(D)}H=D}E.firstNotAllowed&&(q=1);if(q&&E.isElement){D=t.startContainer;for(M=null;D&&!r[D.getName()][E.name];){if(D.equals(k)){D=null;break}M=D;D=D.getParent()}if(D){if(M){S=t.splitElement(M);n.zombies.push(S);n.zombies.push(M)}}else{M=k.getName();
T=!B;D=B==x.length-1;M=d(E.node,M);for(var O=[],V=M.length,W=0,Y=void 0,Z=0,U=-1;W<V;W++){Y=M[W];if(Y==" "){if(!Z&&(!T||W)){O.push(new CKEDITOR.dom.text(" "));U=O.length}Z=1}else{O.push(Y);Z=0}}D&&U==O.length&&O.pop();T=O}}if(T){for(;D=T.pop();)t.insertNode(D);T=0}else t.insertNode(E.node);if(E.lastNotAllowed&&B<x.length-1){(S=w?z:S)&&t.setEndAt(S,CKEDITOR.POSITION_AFTER_START);q=0}t.collapse()}}n.dontMoveCaret=G;n.bogusNeededBlocks=s}J=n.range;var N;S=n.bogusNeededBlocks;for(T=J.createBookmark();H=
n.zombies.pop();)if(H.getParent()){Q=J.clone();Q.moveToElementEditStart(H);Q.removeEmptyBlocksAtEnd()}if(S)for(;H=S.pop();)CKEDITOR.env.needsBrFiller?H.appendBogus():H.append(J.document.createText(" "));for(;H=n.mergeCandidates.pop();)H.mergeSiblings();J.moveToBookmark(T);if(!n.dontMoveCaret){for(H=a(J.startContainer)&&J.startContainer.getChild(J.startOffset-1);H&&a(H)&&!H.is(r.$empty);){if(H.isBlockBoundary())J.moveToPosition(H,CKEDITOR.POSITION_BEFORE_END);else{if(e(H)&&H.getHtml().match(/(\s|&nbsp;)$/g)){N=
null;break}N=J.clone();N.moveToPosition(H,CKEDITOR.POSITION_BEFORE_END)}H=H.getLast(c)}N&&J.moveToRange(N)}v.select();j(g)}}}(),t=function(){function a(b){b=new CKEDITOR.dom.walker(b);b.guard=function(a,b){if(b)return false;if(a.type==CKEDITOR.NODE_ELEMENT)return a.is(CKEDITOR.dtd.$tableContent)};b.evaluator=function(a){return a.type==CKEDITOR.NODE_ELEMENT};return b}function b(a,c,d){c=a.getDocument().createElement(c);a.append(c,d);return c}function c(a){var b=a.count(),d;for(b;b-- >0;){d=a.getItem(b);
if(!CKEDITOR.tools.trim(d.getHtml())){d.appendBogus();CKEDITOR.env.ie&&(CKEDITOR.env.version<9&&d.getChildCount())&&d.getFirst().remove()}}}return function(d){var e=d.startContainer,f=e.getAscendant("table",1),h=false;c(f.getElementsByTag("td"));c(f.getElementsByTag("th"));f=d.clone();f.setStart(e,0);f=a(f).lastBackward();if(!f){f=d.clone();f.setEndAt(e,CKEDITOR.POSITION_BEFORE_END);f=a(f).lastForward();h=true}f||(f=e);if(f.is("table")){d.setStartAt(f,CKEDITOR.POSITION_BEFORE_START);d.collapse(true);
f.remove()}else{f.is({tbody:1,thead:1,tfoot:1})&&(f=b(f,"tr",h));f.is("tr")&&(f=b(f,f.getParent().is("thead")?"th":"td",h));(e=f.getBogus())&&e.remove();d.moveToPosition(f,h?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_END)}}}()})();
(function(){function a(){var a=this._.fakeSelection,b;if(a){b=this.getSelection(1);if(!b||!b.isHidden()){a.reset();a=0}}if(!a){a=b||this.getSelection(1);if(!a||a.getType()==CKEDITOR.SELECTION_NONE)return}this.fire("selectionCheck",a);b=this.elementPath();if(!b.compare(this._.selectionPreviousPath)){if(CKEDITOR.env.webkit)this._.previousActive=this.document.getActive();this._.selectionPreviousPath=b;this.fire("selectionChange",{selection:a,path:b})}}function f(){q=true;if(!w){b.call(this);w=CKEDITOR.tools.setTimeout(b,
200,this)}}function b(){w=null;if(q){CKEDITOR.tools.setTimeout(a,0,this);q=false}}function c(a){return t(a)||a.type==CKEDITOR.NODE_ELEMENT&&!a.is(CKEDITOR.dtd.$empty)?true:false}function e(a){function b(c,d){return!c||c.type==CKEDITOR.NODE_TEXT?false:a.clone()["moveToElementEdit"+(d?"End":"Start")](c)}if(!(a.root instanceof CKEDITOR.editable))return false;var d=a.startContainer,e=a.getPreviousNode(c,null,d),f=a.getNextNode(c,null,d);return b(e)||b(f,1)||!e&&!f&&!(d.type==CKEDITOR.NODE_ELEMENT&&d.isBlockBoundary()&&
d.getBogus())?true:false}function d(a){return a.getCustomData("cke-fillingChar")}function h(a,b){var c=a&&a.removeCustomData("cke-fillingChar");if(c){if(b!==false){var d,e=a.getDocument().getSelection().getNative(),f=e&&e.type!="None"&&e.getRangeAt(0);if(c.getLength()>1&&f&&f.intersectsNode(c.$)){d=j(e);f=e.focusNode==c.$&&e.focusOffset>0;e.anchorNode==c.$&&e.anchorOffset>0&&d[0].offset--;f&&d[1].offset--}}c.setText(k(c.getText()));d&&g(a.getDocument().$,d)}}function k(a){return a.replace(/\u200B( )?/g,
function(a){return a[1]?" ":""})}function j(a){return[{node:a.anchorNode,offset:a.anchorOffset},{node:a.focusNode,offset:a.focusOffset}]}function g(a,b){var c=a.getSelection(),d=a.createRange();d.setStart(b[0].node,b[0].offset);d.collapse(true);c.removeAllRanges();c.addRange(d);c.extend(b[1].node,b[1].offset)}function m(a){var b=CKEDITOR.dom.element.createFromHtml('<div data-cke-hidden-sel="1" data-cke-temp="1" style="'+(CKEDITOR.env.ie?"display:none":"position:fixed;top:0;left:-1000px")+'">&nbsp;</div>',
a.document);a.fire("lockSnapshot");a.editable().append(b);var c=a.getSelection(1),d=a.createRange(),e=c.root.on("selectionchange",function(a){a.cancel()},null,null,0);d.setStartAt(b,CKEDITOR.POSITION_AFTER_START);d.setEndAt(b,CKEDITOR.POSITION_BEFORE_END);c.selectRanges([d]);e.removeListener();a.fire("unlockSnapshot");a._.hiddenSelectionContainer=b}function y(a){var b={37:1,39:1,8:1,46:1};return function(c){var d=c.data.getKeystroke();if(b[d]){var e=a.getSelection().getRanges(),f=e[0];if(e.length==
1&&f.collapsed)if((d=f[d<38?"getPreviousEditableNode":"getNextEditableNode"]())&&d.type==CKEDITOR.NODE_ELEMENT&&d.getAttribute("contenteditable")=="false"){a.getSelection().fake(d);c.data.preventDefault();c.cancel()}}}}function s(a){for(var b=0;b<a.length;b++){var c=a[b];c.getCommonAncestor().isReadOnly()&&a.splice(b,1);if(!c.collapsed){if(c.startContainer.isReadOnly())for(var d=c.startContainer,e;d;){if((e=d.type==CKEDITOR.NODE_ELEMENT)&&d.is("body")||!d.isReadOnly())break;e&&d.getAttribute("contentEditable")==
"false"&&c.setStartAfter(d);d=d.getParent()}d=c.startContainer;e=c.endContainer;var f=c.startOffset,h=c.endOffset,g=c.clone();d&&d.type==CKEDITOR.NODE_TEXT&&(f>=d.getLength()?g.setStartAfter(d):g.setStartBefore(d));e&&e.type==CKEDITOR.NODE_TEXT&&(h?g.setEndAfter(e):g.setEndBefore(e));d=new CKEDITOR.dom.walker(g);d.evaluator=function(d){if(d.type==CKEDITOR.NODE_ELEMENT&&d.isReadOnly()){var e=c.clone();c.setEndBefore(d);c.collapsed&&a.splice(b--,1);if(!(d.getPosition(g.endContainer)&CKEDITOR.POSITION_CONTAINS)){e.setStartAfter(d);
e.collapsed||a.splice(b+1,0,e)}return true}return false};d.next()}}return a}var w,q,t=CKEDITOR.dom.walker.invisible(1),i=function(){function a(b){return function(a){var c=a.editor.createRange();c.moveToClosestEditablePosition(a.selected,b)&&a.editor.getSelection().selectRanges([c]);return false}}function b(a){return function(b){var c=b.editor,d=c.createRange(),e;if(!(e=d.moveToClosestEditablePosition(b.selected,a)))e=d.moveToClosestEditablePosition(b.selected,!a);e&&c.getSelection().selectRanges([d]);
c.fire("saveSnapshot");b.selected.remove();if(!e){d.moveToElementEditablePosition(c.editable());c.getSelection().selectRanges([d])}c.fire("saveSnapshot");return false}}var c=a(),d=a(1);return{37:c,38:c,39:d,40:d,8:b(),46:b(1)}}();CKEDITOR.on("instanceCreated",function(b){function c(){var a=d.getSelection();a&&a.removeAllRanges()}var d=b.editor;d.on("contentDom",function(){function b(){z=new CKEDITOR.dom.selection(d.getSelection());z.lock()}function c(){l.removeListener("mouseup",c);i.removeListener("mouseup",
c);var a=CKEDITOR.document.$.selection,b=a.createRange();a.type!="None"&&b.parentElement().ownerDocument==e.$&&b.select()}var e=d.document,l=CKEDITOR.document,g=d.editable(),p=e.getBody(),i=e.getDocumentElement(),v=g.isInline(),j,z;CKEDITOR.env.gecko&&g.attachListener(g,"focus",function(a){a.removeListener();if(j!==0)if((a=d.getSelection().getNative())&&a.isCollapsed&&a.anchorNode==g.$){a=d.createRange();a.moveToElementEditStart(g);a.select()}},null,null,-2);g.attachListener(g,CKEDITOR.env.webkit?
"DOMFocusIn":"focus",function(){j&&CKEDITOR.env.webkit&&(j=d._.previousActive&&d._.previousActive.equals(e.getActive()));d.unlockSelection(j);j=0},null,null,-1);g.attachListener(g,"mousedown",function(){j=0});if(CKEDITOR.env.ie||v){A?g.attachListener(g,"beforedeactivate",b,null,null,-1):g.attachListener(d,"selectionCheck",b,null,null,-1);g.attachListener(g,CKEDITOR.env.webkit?"DOMFocusOut":"blur",function(){d.lockSelection(z);j=1},null,null,-1);g.attachListener(g,"mousedown",function(){j=0})}if(CKEDITOR.env.ie&&
!v){var B;g.attachListener(g,"mousedown",function(a){if(a.data.$.button==2){a=d.document.getSelection();if(!a||a.getType()==CKEDITOR.SELECTION_NONE)B=d.window.getScrollPosition()}});g.attachListener(g,"mouseup",function(a){if(a.data.$.button==2&&B){d.document.$.documentElement.scrollLeft=B.x;d.document.$.documentElement.scrollTop=B.y}B=null});if(e.$.compatMode!="BackCompat"){if(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)i.on("mousedown",function(a){function b(a){a=a.data.$;if(d){var c=p.$.createTextRange();
try{c.moveToPoint(a.clientX,a.clientY)}catch(e){}d.setEndPoint(f.compareEndPoints("StartToStart",c)<0?"EndToEnd":"StartToStart",c);d.select()}}function c(){i.removeListener("mousemove",b);l.removeListener("mouseup",c);i.removeListener("mouseup",c);d.select()}a=a.data;if(a.getTarget().is("html")&&a.$.y<i.$.clientHeight&&a.$.x<i.$.clientWidth){var d=p.$.createTextRange();try{d.moveToPoint(a.$.clientX,a.$.clientY)}catch(e){}var f=d.duplicate();i.on("mousemove",b);l.on("mouseup",c);i.on("mouseup",c)}});
if(CKEDITOR.env.version>7&&CKEDITOR.env.version<11)i.on("mousedown",function(a){if(a.data.getTarget().is("html")){l.on("mouseup",c);i.on("mouseup",c)}})}}g.attachListener(g,"selectionchange",a,d);g.attachListener(g,"keyup",f,d);g.attachListener(g,CKEDITOR.env.webkit?"DOMFocusIn":"focus",function(){d.forceNextSelectionCheck();d.selectionChange(1)});if(v&&(CKEDITOR.env.webkit||CKEDITOR.env.gecko)){var x;g.attachListener(g,"mousedown",function(){x=1});g.attachListener(e.getDocumentElement(),"mouseup",
function(){x&&f.call(d);x=0})}else g.attachListener(CKEDITOR.env.ie?g:e.getDocumentElement(),"mouseup",f,d);CKEDITOR.env.webkit&&g.attachListener(e,"keydown",function(a){switch(a.data.getKey()){case 13:case 33:case 34:case 35:case 36:case 37:case 39:case 8:case 45:case 46:h(g)}},null,null,-1);g.attachListener(g,"keydown",y(d),null,null,-1)});d.on("setData",function(){d.unlockSelection();CKEDITOR.env.webkit&&c()});d.on("contentDomUnload",function(){d.unlockSelection()});if(CKEDITOR.env.ie9Compat)d.on("beforeDestroy",
c,null,null,9);d.on("dataReady",function(){delete d._.fakeSelection;delete d._.hiddenSelectionContainer;d.selectionChange(1)});d.on("loadSnapshot",function(){var a=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT),b=d.editable().getLast(a);if(b&&b.hasAttribute("data-cke-hidden-sel")){b.remove();if(CKEDITOR.env.gecko)(a=d.editable().getFirst(a))&&(a.is("br")&&a.getAttribute("_moz_editor_bogus_node"))&&a.remove()}},null,null,100);d.on("key",function(a){if(d.mode=="wysiwyg"){var b=d.getSelection();
if(b.isFake){var c=i[a.data.keyCode];if(c)return c({editor:d,selected:b.getSelectedElement(),selection:b,keyEvent:a})}}})});CKEDITOR.on("instanceReady",function(a){function b(){var a=e.editable();if(a)if(a=d(a)){var c=e.document.$.getSelection();if(c.type!="None"&&(c.anchorNode==a.$||c.focusNode==a.$))i=j(c);f=a.getText();a.setText(k(f))}}function c(){var a=e.editable();if(a)if(a=d(a)){a.setText(f);if(i){g(e.document.$,i);i=null}}}var e=a.editor,f,i;if(CKEDITOR.env.webkit){e.on("selectionChange",
function(){var a=e.editable(),b=d(a);b&&(b.getCustomData("ready")?h(a):b.setCustomData("ready",1))},null,null,-1);e.on("beforeSetMode",function(){h(e.editable())},null,null,-1);e.on("beforeUndoImage",b);e.on("afterUndoImage",c);e.on("beforeGetData",b,null,null,0);e.on("getData",c)}});CKEDITOR.editor.prototype.selectionChange=function(b){(b?a:f).call(this)};CKEDITOR.editor.prototype.getSelection=function(a){if((this._.savedSelection||this._.fakeSelection)&&!a)return this._.savedSelection||this._.fakeSelection;
return(a=this.editable())&&this.mode=="wysiwyg"?new CKEDITOR.dom.selection(a):null};CKEDITOR.editor.prototype.lockSelection=function(a){a=a||this.getSelection(1);if(a.getType()!=CKEDITOR.SELECTION_NONE){!a.isLocked&&a.lock();this._.savedSelection=a;return true}return false};CKEDITOR.editor.prototype.unlockSelection=function(a){var b=this._.savedSelection;if(b){b.unlock(a);delete this._.savedSelection;return true}return false};CKEDITOR.editor.prototype.forceNextSelectionCheck=function(){delete this._.selectionPreviousPath};
CKEDITOR.dom.document.prototype.getSelection=function(){return new CKEDITOR.dom.selection(this)};CKEDITOR.dom.range.prototype.select=function(){var a=this.root instanceof CKEDITOR.editable?this.root.editor.getSelection():new CKEDITOR.dom.selection(this.root);a.selectRanges([this]);return a};CKEDITOR.SELECTION_NONE=1;CKEDITOR.SELECTION_TEXT=2;CKEDITOR.SELECTION_ELEMENT=3;var A=typeof window.getSelection!="function",u=1;CKEDITOR.dom.selection=function(a){if(a instanceof CKEDITOR.dom.selection)var b=
a,a=a.root;var c=a instanceof CKEDITOR.dom.element;this.rev=b?b.rev:u++;this.document=a instanceof CKEDITOR.dom.document?a:a.getDocument();this.root=c?a:this.document.getBody();this.isLocked=0;this._={cache:{}};if(b){CKEDITOR.tools.extend(this._.cache,b._.cache);this.isFake=b.isFake;this.isLocked=b.isLocked;return this}var a=this.getNative(),d,e;if(a)if(a.getRangeAt)d=(e=a.rangeCount&&a.getRangeAt(0))&&new CKEDITOR.dom.node(e.commonAncestorContainer);else{try{e=a.createRange()}catch(f){}d=e&&CKEDITOR.dom.element.get(e.item&&
e.item(0)||e.parentElement())}if(!d||!(d.type==CKEDITOR.NODE_ELEMENT||d.type==CKEDITOR.NODE_TEXT)||!this.root.equals(d)&&!this.root.contains(d)){this._.cache.type=CKEDITOR.SELECTION_NONE;this._.cache.startElement=null;this._.cache.selectedElement=null;this._.cache.selectedText="";this._.cache.ranges=new CKEDITOR.dom.rangeList}return this};var o={img:1,hr:1,li:1,table:1,tr:1,td:1,th:1,embed:1,object:1,ol:1,ul:1,a:1,input:1,form:1,select:1,textarea:1,button:1,fieldset:1,thead:1,tfoot:1};CKEDITOR.dom.selection.prototype=
{getNative:function(){return this._.cache.nativeSel!==void 0?this._.cache.nativeSel:this._.cache.nativeSel=A?this.document.$.selection:this.document.getWindow().$.getSelection()},getType:A?function(){var a=this._.cache;if(a.type)return a.type;var b=CKEDITOR.SELECTION_NONE;try{var c=this.getNative(),d=c.type;if(d=="Text")b=CKEDITOR.SELECTION_TEXT;if(d=="Control")b=CKEDITOR.SELECTION_ELEMENT;if(c.createRange().parentElement())b=CKEDITOR.SELECTION_TEXT}catch(e){}return a.type=b}:function(){var a=this._.cache;
if(a.type)return a.type;var b=CKEDITOR.SELECTION_TEXT,c=this.getNative();if(!c||!c.rangeCount)b=CKEDITOR.SELECTION_NONE;else if(c.rangeCount==1){var c=c.getRangeAt(0),d=c.startContainer;if(d==c.endContainer&&d.nodeType==1&&c.endOffset-c.startOffset==1&&o[d.childNodes[c.startOffset].nodeName.toLowerCase()])b=CKEDITOR.SELECTION_ELEMENT}return a.type=b},getRanges:function(){var a=A?function(){function a(b){return(new CKEDITOR.dom.node(b)).getIndex()}var b=function(b,c){b=b.duplicate();b.collapse(c);
var d=b.parentElement();if(!d.hasChildNodes())return{container:d,offset:0};for(var e=d.children,f,g,h=b.duplicate(),v=0,l=e.length-1,i=-1,j,x;v<=l;){i=Math.floor((v+l)/2);f=e[i];h.moveToElementText(f);j=h.compareEndPoints("StartToStart",b);if(j>0)l=i-1;else if(j<0)v=i+1;else return{container:d,offset:a(f)}}if(i==-1||i==e.length-1&&j<0){h.moveToElementText(d);h.setEndPoint("StartToStart",b);h=h.text.replace(/(\r\n|\r)/g,"\n").length;e=d.childNodes;if(!h){f=e[e.length-1];return f.nodeType!=CKEDITOR.NODE_TEXT?
{container:d,offset:e.length}:{container:f,offset:f.nodeValue.length}}for(d=e.length;h>0&&d>0;){g=e[--d];if(g.nodeType==CKEDITOR.NODE_TEXT){x=g;h=h-g.nodeValue.length}}return{container:x,offset:-h}}h.collapse(j>0?true:false);h.setEndPoint(j>0?"StartToStart":"EndToStart",b);h=h.text.replace(/(\r\n|\r)/g,"\n").length;if(!h)return{container:d,offset:a(f)+(j>0?0:1)};for(;h>0;)try{g=f[j>0?"previousSibling":"nextSibling"];if(g.nodeType==CKEDITOR.NODE_TEXT){h=h-g.nodeValue.length;x=g}f=g}catch(m){return{container:d,
offset:a(f)}}return{container:x,offset:j>0?-h:x.nodeValue.length+h}};return function(){var a=this.getNative(),c=a&&a.createRange(),d=this.getType();if(!a)return[];if(d==CKEDITOR.SELECTION_TEXT){a=new CKEDITOR.dom.range(this.root);d=b(c,true);a.setStart(new CKEDITOR.dom.node(d.container),d.offset);d=b(c);a.setEnd(new CKEDITOR.dom.node(d.container),d.offset);a.endContainer.getPosition(a.startContainer)&CKEDITOR.POSITION_PRECEDING&&a.endOffset<=a.startContainer.getIndex()&&a.collapse();return[a]}if(d==
CKEDITOR.SELECTION_ELEMENT){for(var d=[],e=0;e<c.length;e++){for(var f=c.item(e),h=f.parentNode,g=0,a=new CKEDITOR.dom.range(this.root);g<h.childNodes.length&&h.childNodes[g]!=f;g++);a.setStart(new CKEDITOR.dom.node(h),g);a.setEnd(new CKEDITOR.dom.node(h),g+1);d.push(a)}return d}return[]}}():function(){var a=[],b,c=this.getNative();if(!c)return a;for(var d=0;d<c.rangeCount;d++){var e=c.getRangeAt(d);b=new CKEDITOR.dom.range(this.root);b.setStart(new CKEDITOR.dom.node(e.startContainer),e.startOffset);
b.setEnd(new CKEDITOR.dom.node(e.endContainer),e.endOffset);a.push(b)}return a};return function(b){var c=this._.cache,d=c.ranges;if(!d)c.ranges=d=new CKEDITOR.dom.rangeList(a.call(this));return!b?d:s(new CKEDITOR.dom.rangeList(d.slice()))}}(),getStartElement:function(){var a=this._.cache;if(a.startElement!==void 0)return a.startElement;var b;switch(this.getType()){case CKEDITOR.SELECTION_ELEMENT:return this.getSelectedElement();case CKEDITOR.SELECTION_TEXT:var c=this.getRanges()[0];if(c){if(c.collapsed){b=
c.startContainer;b.type!=CKEDITOR.NODE_ELEMENT&&(b=b.getParent())}else{for(c.optimize();;){b=c.startContainer;if(c.startOffset==(b.getChildCount?b.getChildCount():b.getLength())&&!b.isBlockBoundary())c.setStartAfter(b);else break}b=c.startContainer;if(b.type!=CKEDITOR.NODE_ELEMENT)return b.getParent();b=b.getChild(c.startOffset);if(!b||b.type!=CKEDITOR.NODE_ELEMENT)b=c.startContainer;else for(c=b.getFirst();c&&c.type==CKEDITOR.NODE_ELEMENT;){b=c;c=c.getFirst()}}b=b.$}}return a.startElement=b?new CKEDITOR.dom.element(b):
null},getSelectedElement:function(){var a=this._.cache;if(a.selectedElement!==void 0)return a.selectedElement;var b=this,c=CKEDITOR.tools.tryThese(function(){return b.getNative().createRange().item(0)},function(){for(var a=b.getRanges()[0].clone(),c,d,e=2;e&&(!(c=a.getEnclosedNode())||!(c.type==CKEDITOR.NODE_ELEMENT&&o[c.getName()]&&(d=c)));e--)a.shrink(CKEDITOR.SHRINK_ELEMENT);return d&&d.$});return a.selectedElement=c?new CKEDITOR.dom.element(c):null},getSelectedText:function(){var a=this._.cache;
if(a.selectedText!==void 0)return a.selectedText;var b=this.getNative(),b=A?b.type=="Control"?"":b.createRange().text:b.toString();return a.selectedText=b},lock:function(){this.getRanges();this.getStartElement();this.getSelectedElement();this.getSelectedText();this._.cache.nativeSel=null;this.isLocked=1},unlock:function(a){if(this.isLocked){if(a)var b=this.getSelectedElement(),c=!b&&this.getRanges(),d=this.isFake;this.isLocked=0;this.reset();if(a)(a=b||c[0]&&c[0].getCommonAncestor())&&a.getAscendant("body",
1)&&(d?this.fake(b):b?this.selectElement(b):this.selectRanges(c))}},reset:function(){this._.cache={};this.isFake=0;var a=this.root.editor;if(a&&a._.fakeSelection&&this.rev==a._.fakeSelection.rev){delete a._.fakeSelection;var b=a._.hiddenSelectionContainer;if(b){var c=a.checkDirty();a.fire("lockSnapshot");b.remove();a.fire("unlockSnapshot");!c&&a.resetDirty()}delete a._.hiddenSelectionContainer}this.rev=u++},selectElement:function(a){var b=new CKEDITOR.dom.range(this.root);b.setStartBefore(a);b.setEndAfter(a);
this.selectRanges([b])},selectRanges:function(a){var b=this.root.editor,b=b&&b._.hiddenSelectionContainer;this.reset();if(b)for(var b=this.root,c,d=0;d<a.length;++d){c=a[d];if(c.endContainer.equals(b))c.endOffset=Math.min(c.endOffset,b.getChildCount())}if(a.length)if(this.isLocked){var f=CKEDITOR.document.getActive();this.unlock();this.selectRanges(a);this.lock();f&&!f.equals(this.root)&&f.focus()}else{var g;a:{var i,j;if(a.length==1&&!(j=a[0]).collapsed&&(g=j.getEnclosedNode())&&g.type==CKEDITOR.NODE_ELEMENT){j=
j.clone();j.shrink(CKEDITOR.SHRINK_ELEMENT,true);if((i=j.getEnclosedNode())&&i.type==CKEDITOR.NODE_ELEMENT)g=i;if(g.getAttribute("contenteditable")=="false")break a}g=void 0}if(g)this.fake(g);else{if(A){j=CKEDITOR.dom.walker.whitespaces(true);i=/\ufeff|\u00a0/;b={table:1,tbody:1,tr:1};if(a.length>1){g=a[a.length-1];a[0].setEnd(g.endContainer,g.endOffset)}g=a[0];var a=g.collapsed,m,k,v;if((c=g.getEnclosedNode())&&c.type==CKEDITOR.NODE_ELEMENT&&c.getName()in o&&(!c.is("a")||!c.getText()))try{v=c.$.createControlRange();
v.addElement(c.$);v.select();return}catch(q){}if(g.startContainer.type==CKEDITOR.NODE_ELEMENT&&g.startContainer.getName()in b||g.endContainer.type==CKEDITOR.NODE_ELEMENT&&g.endContainer.getName()in b){g.shrink(CKEDITOR.NODE_ELEMENT,true);a=g.collapsed}v=g.createBookmark();b=v.startNode;if(!a)f=v.endNode;v=g.document.$.body.createTextRange();v.moveToElementText(b.$);v.moveStart("character",1);if(f){i=g.document.$.body.createTextRange();i.moveToElementText(f.$);v.setEndPoint("EndToEnd",i);v.moveEnd("character",
-1)}else{m=b.getNext(j);k=b.hasAscendant("pre");m=!(m&&m.getText&&m.getText().match(i))&&(k||!b.hasPrevious()||b.getPrevious().is&&b.getPrevious().is("br"));k=g.document.createElement("span");k.setHtml("&#65279;");k.insertBefore(b);m&&g.document.createText("").insertBefore(b)}g.setStartBefore(b);b.remove();if(a){if(m){v.moveStart("character",-1);v.select();g.document.$.selection.clear()}else v.select();g.moveToPosition(k,CKEDITOR.POSITION_BEFORE_START);k.remove()}else{g.setEndBefore(f);f.remove();
v.select()}}else{f=this.getNative();if(!f)return;this.removeAllRanges();for(v=0;v<a.length;v++){if(v<a.length-1){m=a[v];k=a[v+1];i=m.clone();i.setStart(m.endContainer,m.endOffset);i.setEnd(k.startContainer,k.startOffset);if(!i.collapsed){i.shrink(CKEDITOR.NODE_ELEMENT,true);g=i.getCommonAncestor();i=i.getEnclosedNode();if(g.isReadOnly()||i&&i.isReadOnly()){k.setStart(m.startContainer,m.startOffset);a.splice(v--,1);continue}}}g=a[v];k=this.document.$.createRange();if(g.collapsed&&CKEDITOR.env.webkit&&
e(g)){m=this.root;h(m,false);i=m.getDocument().createText("​");m.setCustomData("cke-fillingChar",i);g.insertNode(i);if((m=i.getNext())&&!i.getPrevious()&&m.type==CKEDITOR.NODE_ELEMENT&&m.getName()=="br"){h(this.root);g.moveToPosition(m,CKEDITOR.POSITION_BEFORE_START)}else g.moveToPosition(i,CKEDITOR.POSITION_AFTER_END)}k.setStart(g.startContainer.$,g.startOffset);try{k.setEnd(g.endContainer.$,g.endOffset)}catch(z){if(z.toString().indexOf("NS_ERROR_ILLEGAL_VALUE")>=0){g.collapse(1);k.setEnd(g.endContainer.$,
g.endOffset)}else throw z;}f.addRange(k)}}this.reset();this.root.fire("selectionchange")}}},fake:function(a){var b=this.root.editor;this.reset();m(b);var c=this._.cache,d=new CKEDITOR.dom.range(this.root);d.setStartBefore(a);d.setEndAfter(a);c.ranges=new CKEDITOR.dom.rangeList(d);c.selectedElement=c.startElement=a;c.type=CKEDITOR.SELECTION_ELEMENT;c.selectedText=c.nativeSel=null;this.isFake=1;this.rev=u++;b._.fakeSelection=this;this.root.fire("selectionchange")},isHidden:function(){var a=this.getCommonAncestor();
a&&a.type==CKEDITOR.NODE_TEXT&&(a=a.getParent());return!(!a||!a.data("cke-hidden-sel"))},createBookmarks:function(a){a=this.getRanges().createBookmarks(a);this.isFake&&(a.isFake=1);return a},createBookmarks2:function(a){a=this.getRanges().createBookmarks2(a);this.isFake&&(a.isFake=1);return a},selectBookmarks:function(a){for(var b=[],c=0;c<a.length;c++){var d=new CKEDITOR.dom.range(this.root);d.moveToBookmark(a[c]);b.push(d)}a.isFake?this.fake(b[0].getEnclosedNode()):this.selectRanges(b);return this},
getCommonAncestor:function(){var a=this.getRanges();return!a.length?null:a[0].startContainer.getCommonAncestor(a[a.length-1].endContainer)},scrollIntoView:function(){this.type!=CKEDITOR.SELECTION_NONE&&this.getRanges()[0].scrollIntoView()},removeAllRanges:function(){if(this.getType()!=CKEDITOR.SELECTION_NONE){var a=this.getNative();try{a&&a[A?"empty":"removeAllRanges"]()}catch(b){}this.reset()}}}})();"use strict";CKEDITOR.STYLE_BLOCK=1;CKEDITOR.STYLE_INLINE=2;CKEDITOR.STYLE_OBJECT=3;
(function(){function a(a,b){for(var c,d;a=a.getParent();){if(a.equals(b))break;if(a.getAttribute("data-nostyle"))c=a;else if(!d){var e=a.getAttribute("contentEditable");e=="false"?c=a:e=="true"&&(d=1)}}return c}function f(b){var d=b.document;if(b.collapsed){d=i(this,d);b.insertNode(d);b.moveToPosition(d,CKEDITOR.POSITION_BEFORE_END)}else{var e=this.element,g=this._.definition,h,j=g.ignoreReadonly,m=j||g.includeReadonly;m==null&&(m=b.root.getCustomData("cke_includeReadonly"));var k=CKEDITOR.dtd[e];
if(!k){h=true;k=CKEDITOR.dtd.span}b.enlarge(CKEDITOR.ENLARGE_INLINE,1);b.trim();var l=b.createBookmark(),q=l.startNode,o=l.endNode,n=q,p;if(!j){var s=b.getCommonAncestor(),j=a(q,s),s=a(o,s);j&&(n=j.getNextSourceNode(true));s&&(o=s)}for(n.getPosition(o)==CKEDITOR.POSITION_FOLLOWING&&(n=0);n;){j=false;if(n.equals(o)){n=null;j=true}else{var r=n.type==CKEDITOR.NODE_ELEMENT?n.getName():null,s=r&&n.getAttribute("contentEditable")=="false",t=r&&n.getAttribute("data-nostyle");if(r&&n.data("cke-bookmark")){n=
n.getNextSourceNode(true);continue}if(s&&m&&CKEDITOR.dtd.$block[r])for(var y=n,u=c(y),A=void 0,C=u.length,F=0,y=C&&new CKEDITOR.dom.range(y.getDocument());F<C;++F){var A=u[F],P=CKEDITOR.filter.instances[A.data("cke-filter")];if(P?P.check(this):1){y.selectNodeContents(A);f.call(this,y)}}u=r?!k[r]||t?0:s&&!m?0:(n.getPosition(o)|K)==K&&(!g.childRule||g.childRule(n)):1;if(u)if((u=n.getParent())&&((u.getDtd()||CKEDITOR.dtd.span)[e]||h)&&(!g.parentRule||g.parentRule(u))){if(!p&&(!r||!CKEDITOR.dtd.$removeEmpty[r]||
(n.getPosition(o)|K)==K)){p=b.clone();p.setStartBefore(n)}r=n.type;if(r==CKEDITOR.NODE_TEXT||s||r==CKEDITOR.NODE_ELEMENT&&!n.getChildCount()){for(var r=n,U;(j=!r.getNext(L))&&(U=r.getParent(),k[U.getName()])&&(U.getPosition(q)|I)==I&&(!g.childRule||g.childRule(U));)r=U;p.setEndAfter(r)}}else j=true;else j=true;n=n.getNextSourceNode(t||s)}if(j&&p&&!p.collapsed){for(var j=i(this,d),s=j.hasAttributes(),t=p.getCommonAncestor(),r={},u={},A={},C={},N,R,X;j&&t;){if(t.getName()==e){for(N in g.attributes)if(!C[N]&&
(X=t.getAttribute(R)))j.getAttribute(N)==X?u[N]=1:C[N]=1;for(R in g.styles)if(!A[R]&&(X=t.getStyle(R)))j.getStyle(R)==X?r[R]=1:A[R]=1}t=t.getParent()}for(N in u)j.removeAttribute(N);for(R in r)j.removeStyle(R);s&&!j.hasAttributes()&&(j=null);if(j){p.extractContents().appendTo(j);p.insertNode(j);w.call(this,j);j.mergeSiblings();CKEDITOR.env.ie||j.$.normalize()}else{j=new CKEDITOR.dom.element("span");p.extractContents().appendTo(j);p.insertNode(j);w.call(this,j);j.remove(true)}p=null}}b.moveToBookmark(l);
b.shrink(CKEDITOR.SHRINK_TEXT);b.shrink(CKEDITOR.NODE_ELEMENT,true)}}function b(a){function b(){for(var a=new CKEDITOR.dom.elementPath(d.getParent()),c=new CKEDITOR.dom.elementPath(j.getParent()),e=null,f=null,g=0;g<a.elements.length;g++){var h=a.elements[g];if(h==a.block||h==a.blockLimit)break;m.checkElementRemovable(h,true)&&(e=h)}for(g=0;g<c.elements.length;g++){h=c.elements[g];if(h==c.block||h==c.blockLimit)break;m.checkElementRemovable(h,true)&&(f=h)}f&&j.breakParent(f);e&&d.breakParent(e)}a.enlarge(CKEDITOR.ENLARGE_INLINE,
1);var c=a.createBookmark(),d=c.startNode;if(a.collapsed){for(var e=new CKEDITOR.dom.elementPath(d.getParent(),a.root),f,g=0,h;g<e.elements.length&&(h=e.elements[g]);g++){if(h==e.block||h==e.blockLimit)break;if(this.checkElementRemovable(h)){var i;if(a.collapsed&&(a.checkBoundaryOfElement(h,CKEDITOR.END)||(i=a.checkBoundaryOfElement(h,CKEDITOR.START)))){f=h;f.match=i?"start":"end"}else{h.mergeSiblings();h.is(this.element)?s.call(this,h):q(h,o(this)[h.getName()])}}}if(f){h=d;for(g=0;;g++){i=e.elements[g];
if(i.equals(f))break;else if(i.match)continue;else i=i.clone();i.append(h);h=i}h[f.match=="start"?"insertBefore":"insertAfter"](f)}}else{var j=c.endNode,m=this;b();for(e=d;!e.equals(j);){f=e.getNextSourceNode();if(e.type==CKEDITOR.NODE_ELEMENT&&this.checkElementRemovable(e)){e.getName()==this.element?s.call(this,e):q(e,o(this)[e.getName()]);if(f.type==CKEDITOR.NODE_ELEMENT&&f.contains(d)){b();f=d.getNext()}}e=f}}a.moveToBookmark(c);a.shrink(CKEDITOR.NODE_ELEMENT,true)}function c(a){var b=[];a.forEach(function(a){if(a.getAttribute("contenteditable")==
"true"){b.push(a);return false}},CKEDITOR.NODE_ELEMENT,true);return b}function e(a){var b=a.getEnclosedNode()||a.getCommonAncestor(false,true);(a=(new CKEDITOR.dom.elementPath(b,a.root)).contains(this.element,1))&&!a.isReadOnly()&&A(a,this)}function d(a){var b=a.getCommonAncestor(true,true);if(a=(new CKEDITOR.dom.elementPath(b,a.root)).contains(this.element,1)){var b=this._.definition,c=b.attributes;if(c)for(var d in c)a.removeAttribute(d,c[d]);if(b.styles)for(var e in b.styles)b.styles.hasOwnProperty(e)&&
a.removeStyle(e)}}function h(a){var b=a.createBookmark(true),c=a.createIterator();c.enforceRealBlocks=true;if(this._.enterMode)c.enlargeBr=this._.enterMode!=CKEDITOR.ENTER_BR;for(var d,e=a.document,f;d=c.getNextParagraph();)if(!d.isReadOnly()&&(c.activeFilter?c.activeFilter.check(this):1)){f=i(this,e,d);j(d,f)}a.moveToBookmark(b)}function k(a){var b=a.createBookmark(1),c=a.createIterator();c.enforceRealBlocks=true;c.enlargeBr=this._.enterMode!=CKEDITOR.ENTER_BR;for(var d,e;d=c.getNextParagraph();)if(this.checkElementRemovable(d))if(d.is("pre")){(e=
this._.enterMode==CKEDITOR.ENTER_BR?null:a.document.createElement(this._.enterMode==CKEDITOR.ENTER_P?"p":"div"))&&d.copyAttributes(e);j(d,e)}else s.call(this,d);a.moveToBookmark(b)}function j(a,b){var c=!b;if(c){b=a.getDocument().createElement("div");a.copyAttributes(b)}var d=b&&b.is("pre"),e=a.is("pre"),f=!d&&e;if(d&&!e){e=b;(f=a.getBogus())&&f.remove();f=a.getHtml();f=m(f,/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g,"");f=f.replace(/[ \t\r\n]*(<br[^>]*>)[ \t\r\n]*/gi,"$1");f=f.replace(/([ \t\n\r]+|&nbsp;)/g,
" ");f=f.replace(/<br\b[^>]*>/gi,"\n");if(CKEDITOR.env.ie){var h=a.getDocument().createElement("div");h.append(e);e.$.outerHTML="<pre>"+f+"</pre>";e.copyAttributes(h.getFirst());e=h.getFirst().remove()}else e.setHtml(f);b=e}else f?b=y(c?[a.getHtml()]:g(a),b):a.moveChildren(b);b.replace(a);if(d){var c=b,i;if((i=c.getPrevious(F))&&i.type==CKEDITOR.NODE_ELEMENT&&i.is("pre")){d=m(i.getHtml(),/\n$/,"")+"\n\n"+m(c.getHtml(),/^\n/,"");CKEDITOR.env.ie?c.$.outerHTML="<pre>"+d+"</pre>":c.setHtml(d);i.remove()}}else c&&
t(b)}function g(a){var b=[];m(a.getOuterHtml(),/(\S\s*)\n(?:\s|(<span[^>]+data-cke-bookmark.*?\/span>))*\n(?!$)/gi,function(a,b,c){return b+"</pre>"+c+"<pre>"}).replace(/<pre\b.*?>([\s\S]*?)<\/pre>/gi,function(a,c){b.push(c)});return b}function m(a,b,c){var d="",e="",a=a.replace(/(^<span[^>]+data-cke-bookmark.*?\/span>)|(<span[^>]+data-cke-bookmark.*?\/span>$)/gi,function(a,b,c){b&&(d=b);c&&(e=c);return""});return d+a.replace(b,c)+e}function y(a,b){var c;a.length>1&&(c=new CKEDITOR.dom.documentFragment(b.getDocument()));
for(var d=0;d<a.length;d++){var e=a[d],e=e.replace(/(\r\n|\r)/g,"\n"),e=m(e,/^[ \t]*\n/,""),e=m(e,/\n$/,""),e=m(e,/^[ \t]+|[ \t]+$/g,function(a,b){return a.length==1?"&nbsp;":b?" "+CKEDITOR.tools.repeat("&nbsp;",a.length-1):CKEDITOR.tools.repeat("&nbsp;",a.length-1)+" "}),e=e.replace(/\n/g,"<br>"),e=e.replace(/[ \t]{2,}/g,function(a){return CKEDITOR.tools.repeat("&nbsp;",a.length-1)+" "});if(c){var f=b.clone();f.setHtml(e);c.append(f)}else b.setHtml(e)}return c||b}function s(a,b){var c=this._.definition,
d=c.attributes,c=c.styles,e=o(this)[a.getName()],f=CKEDITOR.tools.isEmpty(d)&&CKEDITOR.tools.isEmpty(c),g;for(g in d)if(!((g=="class"||this._.definition.fullMatch)&&a.getAttribute(g)!=l(g,d[g]))&&!(b&&g.slice(0,5)=="data-")){f=a.hasAttribute(g);a.removeAttribute(g)}for(var h in c)if(!(this._.definition.fullMatch&&a.getStyle(h)!=l(h,c[h],true))){f=f||!!a.getStyle(h);a.removeStyle(h)}q(a,e,r[a.getName()]);f&&(this._.definition.alwaysRemoveElement?t(a,1):!CKEDITOR.dtd.$block[a.getName()]||this._.enterMode==
CKEDITOR.ENTER_BR&&!a.hasAttributes()?t(a):a.renameNode(this._.enterMode==CKEDITOR.ENTER_P?"p":"div"))}function w(a){for(var b=o(this),c=a.getElementsByTag(this.element),d,e=c.count();--e>=0;){d=c.getItem(e);d.isReadOnly()||s.call(this,d,true)}for(var f in b)if(f!=this.element){c=a.getElementsByTag(f);for(e=c.count()-1;e>=0;e--){d=c.getItem(e);d.isReadOnly()||q(d,b[f])}}}function q(a,b,c){if(b=b&&b.attributes)for(var d=0;d<b.length;d++){var e=b[d][0],f;if(f=a.getAttribute(e)){var g=b[d][1];(g===null||
g.test&&g.test(f)||typeof g=="string"&&f==g)&&a.removeAttribute(e)}}c||t(a)}function t(a,b){if(!a.hasAttributes()||b)if(CKEDITOR.dtd.$block[a.getName()]){var c=a.getPrevious(F),d=a.getNext(F);c&&(c.type==CKEDITOR.NODE_TEXT||!c.isBlockBoundary({br:1}))&&a.append("br",1);d&&(d.type==CKEDITOR.NODE_TEXT||!d.isBlockBoundary({br:1}))&&a.append("br");a.remove(true)}else{c=a.getFirst();d=a.getLast();a.remove(true);if(c){c.type==CKEDITOR.NODE_ELEMENT&&c.mergeSiblings();d&&(!c.equals(d)&&d.type==CKEDITOR.NODE_ELEMENT)&&
d.mergeSiblings()}}}function i(a,b,c){var d;d=a.element;d=="*"&&(d="span");d=new CKEDITOR.dom.element(d,b);c&&c.copyAttributes(d);d=A(d,a);b.getCustomData("doc_processing_style")&&d.hasAttribute("id")?d.removeAttribute("id"):b.setCustomData("doc_processing_style",1);return d}function A(a,b){var c=b._.definition,d=c.attributes,c=CKEDITOR.style.getStyleText(c);if(d)for(var e in d)a.setAttribute(e,d[e]);c&&a.setAttribute("style",c);return a}function u(a,b){for(var c in a)a[c]=a[c].replace(C,function(a,
c){return b[c]})}function o(a){if(a._.overrides)return a._.overrides;var b=a._.overrides={},c=a._.definition.overrides;if(c){CKEDITOR.tools.isArray(c)||(c=[c]);for(var d=0;d<c.length;d++){var e=c[d],f,g;if(typeof e=="string")f=e.toLowerCase();else{f=e.element?e.element.toLowerCase():a.element;g=e.attributes}e=b[f]||(b[f]={});if(g){var e=e.attributes=e.attributes||[],h;for(h in g)e.push([h.toLowerCase(),g[h]])}}}return b}function l(a,b,c){var d=new CKEDITOR.dom.element("span");d[c?"setStyle":"setAttribute"](a,
b);return d[c?"getStyle":"getAttribute"](a)}function p(a,b,c){for(var d=a.document,e=a.getRanges(),b=b?this.removeFromRange:this.applyToRange,f,g=e.createIterator();f=g.getNextRange();)b.call(this,f,c);a.selectRanges(e);d.removeCustomData("doc_processing_style")}var r={address:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,section:1,header:1,footer:1,nav:1,article:1,aside:1,figure:1,dialog:1,hgroup:1,time:1,meter:1,menu:1,command:1,keygen:1,output:1,progress:1,details:1,datagrid:1,datalist:1},n=
{a:1,blockquote:1,embed:1,hr:1,img:1,li:1,object:1,ol:1,table:1,td:1,tr:1,th:1,ul:1,dl:1,dt:1,dd:1,form:1,audio:1,video:1},P=/\s*(?:;\s*|$)/,C=/#\((.+?)\)/g,L=CKEDITOR.dom.walker.bookmark(0,1),F=CKEDITOR.dom.walker.whitespaces(1);CKEDITOR.style=function(a,b){if(typeof a.type=="string")return new CKEDITOR.style.customHandlers[a.type](a);var c=a.attributes;if(c&&c.style){a.styles=CKEDITOR.tools.extend({},a.styles,CKEDITOR.tools.parseCssText(c.style));delete c.style}if(b){a=CKEDITOR.tools.clone(a);u(a.attributes,
b);u(a.styles,b)}c=this.element=a.element?typeof a.element=="string"?a.element.toLowerCase():a.element:"*";this.type=a.type||(r[c]?CKEDITOR.STYLE_BLOCK:n[c]?CKEDITOR.STYLE_OBJECT:CKEDITOR.STYLE_INLINE);if(typeof this.element=="object")this.type=CKEDITOR.STYLE_OBJECT;this._={definition:a}};CKEDITOR.style.prototype={apply:function(a){if(a instanceof CKEDITOR.dom.document)return p.call(this,a.getSelection());if(this.checkApplicable(a.elementPath(),a)){var b=this._.enterMode;if(!b)this._.enterMode=a.activeEnterMode;
p.call(this,a.getSelection(),0,a);this._.enterMode=b}},remove:function(a){if(a instanceof CKEDITOR.dom.document)return p.call(this,a.getSelection(),1);if(this.checkApplicable(a.elementPath(),a)){var b=this._.enterMode;if(!b)this._.enterMode=a.activeEnterMode;p.call(this,a.getSelection(),1,a);this._.enterMode=b}},applyToRange:function(a){this.applyToRange=this.type==CKEDITOR.STYLE_INLINE?f:this.type==CKEDITOR.STYLE_BLOCK?h:this.type==CKEDITOR.STYLE_OBJECT?e:null;return this.applyToRange(a)},removeFromRange:function(a){this.removeFromRange=
this.type==CKEDITOR.STYLE_INLINE?b:this.type==CKEDITOR.STYLE_BLOCK?k:this.type==CKEDITOR.STYLE_OBJECT?d:null;return this.removeFromRange(a)},applyToObject:function(a){A(a,this)},checkActive:function(a,b){switch(this.type){case CKEDITOR.STYLE_BLOCK:return this.checkElementRemovable(a.block||a.blockLimit,true,b);case CKEDITOR.STYLE_OBJECT:case CKEDITOR.STYLE_INLINE:for(var c=a.elements,d=0,e;d<c.length;d++){e=c[d];if(!(this.type==CKEDITOR.STYLE_INLINE&&(e==a.block||e==a.blockLimit))){if(this.type==
CKEDITOR.STYLE_OBJECT){var f=e.getName();if(!(typeof this.element=="string"?f==this.element:f in this.element))continue}if(this.checkElementRemovable(e,true,b))return true}}}return false},checkApplicable:function(a,b,c){b&&b instanceof CKEDITOR.filter&&(c=b);if(c&&!c.check(this))return false;switch(this.type){case CKEDITOR.STYLE_OBJECT:return!!a.contains(this.element);case CKEDITOR.STYLE_BLOCK:return!!a.blockLimit.getDtd()[this.element]}return true},checkElementMatch:function(a,b){var c=this._.definition;
if(!a||!c.ignoreReadonly&&a.isReadOnly())return false;var d=a.getName();if(typeof this.element=="string"?d==this.element:d in this.element){if(!b&&!a.hasAttributes())return true;if(d=c._AC)c=d;else{var d={},e=0,f=c.attributes;if(f)for(var g in f){e++;d[g]=f[g]}if(g=CKEDITOR.style.getStyleText(c)){d.style||e++;d.style=g}d._length=e;c=c._AC=d}if(c._length){for(var h in c)if(h!="_length"){e=a.getAttribute(h)||"";if(h=="style")a:{d=c[h];typeof d=="string"&&(d=CKEDITOR.tools.parseCssText(d));typeof e==
"string"&&(e=CKEDITOR.tools.parseCssText(e,true));g=void 0;for(g in d)if(!(g in e&&(e[g]==d[g]||d[g]=="inherit"||e[g]=="inherit"))){d=false;break a}d=true}else d=c[h]==e;if(d){if(!b)return true}else if(b)return false}if(b)return true}else return true}return false},checkElementRemovable:function(a,b,c){if(this.checkElementMatch(a,b,c))return true;if(b=o(this)[a.getName()]){var d;if(!(b=b.attributes))return true;for(c=0;c<b.length;c++){d=b[c][0];if(d=a.getAttribute(d)){var e=b[c][1];if(e===null)return true;
if(typeof e=="string"){if(d==e)return true}else if(e.test(d))return true}}}return false},buildPreview:function(a){var b=this._.definition,c=[],d=b.element;d=="bdo"&&(d="span");var c=["<",d],e=b.attributes;if(e)for(var f in e)c.push(" ",f,'="',e[f],'"');(e=CKEDITOR.style.getStyleText(b))&&c.push(' style="',e,'"');c.push(">",a||b.name,"</",d,">");return c.join("")},getDefinition:function(){return this._.definition}};CKEDITOR.style.getStyleText=function(a){var b=a._ST;if(b)return b;var b=a.styles,c=
a.attributes&&a.attributes.style||"",d="";c.length&&(c=c.replace(P,";"));for(var e in b){var f=b[e],g=(e+":"+f).replace(P,";");f=="inherit"?d=d+g:c=c+g}c.length&&(c=CKEDITOR.tools.normalizeCssText(c,true));return a._ST=c+d};CKEDITOR.style.customHandlers={};CKEDITOR.style.addCustomHandler=function(a){var b=function(a){this._={definition:a};this.setup&&this.setup(a)};b.prototype=CKEDITOR.tools.extend(CKEDITOR.tools.prototypedCopy(CKEDITOR.style.prototype),{assignedTo:CKEDITOR.STYLE_OBJECT},a,true);
return this.customHandlers[a.type]=b};var K=CKEDITOR.POSITION_PRECEDING|CKEDITOR.POSITION_IDENTICAL|CKEDITOR.POSITION_IS_CONTAINED,I=CKEDITOR.POSITION_FOLLOWING|CKEDITOR.POSITION_IDENTICAL|CKEDITOR.POSITION_IS_CONTAINED})();CKEDITOR.styleCommand=function(a,f){this.requiredContent=this.allowedContent=this.style=a;CKEDITOR.tools.extend(this,f,true)};
CKEDITOR.styleCommand.prototype.exec=function(a){a.focus();this.state==CKEDITOR.TRISTATE_OFF?a.applyStyle(this.style):this.state==CKEDITOR.TRISTATE_ON&&a.removeStyle(this.style)};CKEDITOR.stylesSet=new CKEDITOR.resourceManager("","stylesSet");CKEDITOR.addStylesSet=CKEDITOR.tools.bind(CKEDITOR.stylesSet.add,CKEDITOR.stylesSet);CKEDITOR.loadStylesSet=function(a,f,b){CKEDITOR.stylesSet.addExternal(a,f,"");CKEDITOR.stylesSet.load(a,b)};
CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{attachStyleStateChange:function(a,f){var b=this._.styleStateChangeCallbacks;if(!b){b=this._.styleStateChangeCallbacks=[];this.on("selectionChange",function(a){for(var e=0;e<b.length;e++){var d=b[e],f=d.style.checkActive(a.data.path,this)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF;d.fn.call(this,f)}})}b.push({style:a,fn:f})},applyStyle:function(a){a.apply(this)},removeStyle:function(a){a.remove(this)},getStylesSet:function(a){if(this._.stylesDefinitions)a(this._.stylesDefinitions);
else{var f=this,b=f.config.stylesCombo_stylesSet||f.config.stylesSet;if(b===false)a(null);else if(b instanceof Array){f._.stylesDefinitions=b;a(b)}else{b||(b="default");var b=b.split(":"),c=b[0];CKEDITOR.stylesSet.addExternal(c,b[1]?b.slice(1).join(":"):CKEDITOR.getUrl("styles.js"),"");CKEDITOR.stylesSet.load(c,function(b){f._.stylesDefinitions=b[c];a(f._.stylesDefinitions)})}}}});
CKEDITOR.dom.comment=function(a,f){typeof a=="string"&&(a=(f?f.$:document).createComment(a));CKEDITOR.dom.domObject.call(this,a)};CKEDITOR.dom.comment.prototype=new CKEDITOR.dom.node;CKEDITOR.tools.extend(CKEDITOR.dom.comment.prototype,{type:CKEDITOR.NODE_COMMENT,getOuterHtml:function(){return"<\!--"+this.$.nodeValue+"--\>"}});"use strict";
(function(){var a={},f={},b;for(b in CKEDITOR.dtd.$blockLimit)b in CKEDITOR.dtd.$list||(a[b]=1);for(b in CKEDITOR.dtd.$block)b in CKEDITOR.dtd.$blockLimit||b in CKEDITOR.dtd.$empty||(f[b]=1);CKEDITOR.dom.elementPath=function(b,e){var d=null,h=null,k=[],j=b,g,e=e||b.getDocument().getBody();do if(j.type==CKEDITOR.NODE_ELEMENT){k.push(j);if(!this.lastElement){this.lastElement=j;if(j.is(CKEDITOR.dtd.$object)||j.getAttribute("contenteditable")=="false")continue}if(j.equals(e))break;if(!h){g=j.getName();
j.getAttribute("contenteditable")=="true"?h=j:!d&&f[g]&&(d=j);if(a[g]){var m;if(m=!d){if(g=g=="div"){a:{g=j.getChildren();m=0;for(var y=g.count();m<y;m++){var s=g.getItem(m);if(s.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$block[s.getName()]){g=true;break a}}g=false}g=!g}m=g}m?d=j:h=j}}}while(j=j.getParent());h||(h=e);this.block=d;this.blockLimit=h;this.root=e;this.elements=k}})();
CKEDITOR.dom.elementPath.prototype={compare:function(a){var f=this.elements,a=a&&a.elements;if(!a||f.length!=a.length)return false;for(var b=0;b<f.length;b++)if(!f[b].equals(a[b]))return false;return true},contains:function(a,f,b){var c;typeof a=="string"&&(c=function(b){return b.getName()==a});a instanceof CKEDITOR.dom.element?c=function(b){return b.equals(a)}:CKEDITOR.tools.isArray(a)?c=function(b){return CKEDITOR.tools.indexOf(a,b.getName())>-1}:typeof a=="function"?c=a:typeof a=="object"&&(c=
function(b){return b.getName()in a});var e=this.elements,d=e.length;f&&d--;if(b){e=Array.prototype.slice.call(e,0);e.reverse()}for(f=0;f<d;f++)if(c(e[f]))return e[f];return null},isContextFor:function(a){var f;if(a in CKEDITOR.dtd.$block){f=this.contains(CKEDITOR.dtd.$intermediate)||this.root.equals(this.block)&&this.block||this.blockLimit;return!!f.getDtd()[a]}return true},direction:function(){return(this.block||this.blockLimit||this.root).getDirection(1)}};
CKEDITOR.dom.text=function(a,f){typeof a=="string"&&(a=(f?f.$:document).createTextNode(a));this.$=a};CKEDITOR.dom.text.prototype=new CKEDITOR.dom.node;
CKEDITOR.tools.extend(CKEDITOR.dom.text.prototype,{type:CKEDITOR.NODE_TEXT,getLength:function(){return this.$.nodeValue.length},getText:function(){return this.$.nodeValue},setText:function(a){this.$.nodeValue=a},split:function(a){var f=this.$.parentNode,b=f.childNodes.length,c=this.getLength(),e=this.getDocument(),d=new CKEDITOR.dom.text(this.$.splitText(a),e);if(f.childNodes.length==b)if(a>=c){d=e.createText("");d.insertAfter(this)}else{a=e.createText("");a.insertAfter(d);a.remove()}return d},substring:function(a,
f){return typeof f!="number"?this.$.nodeValue.substr(a):this.$.nodeValue.substring(a,f)}});
(function(){function a(a,c,e){var d=a.serializable,f=c[e?"endContainer":"startContainer"],k=e?"endOffset":"startOffset",j=d?c.document.getById(a.startNode):a.startNode,a=d?c.document.getById(a.endNode):a.endNode;if(f.equals(j.getPrevious())){c.startOffset=c.startOffset-f.getLength()-a.getPrevious().getLength();f=a.getNext()}else if(f.equals(a.getPrevious())){c.startOffset=c.startOffset-f.getLength();f=a.getNext()}f.equals(j.getParent())&&c[k]++;f.equals(a.getParent())&&c[k]++;c[e?"endContainer":"startContainer"]=
f;return c}CKEDITOR.dom.rangeList=function(a){if(a instanceof CKEDITOR.dom.rangeList)return a;a?a instanceof CKEDITOR.dom.range&&(a=[a]):a=[];return CKEDITOR.tools.extend(a,f)};var f={createIterator:function(){var a=this,c=CKEDITOR.dom.walker.bookmark(),e=[],d;return{getNextRange:function(f){d=d===void 0?0:d+1;var k=a[d];if(k&&a.length>1){if(!d)for(var j=a.length-1;j>=0;j--)e.unshift(a[j].createBookmark(true));if(f)for(var g=0;a[d+g+1];){for(var m=k.document,f=0,j=m.getById(e[g].endNode),m=m.getById(e[g+
1].startNode);;){j=j.getNextSourceNode(false);if(m.equals(j))f=1;else if(c(j)||j.type==CKEDITOR.NODE_ELEMENT&&j.isBlockBoundary())continue;break}if(!f)break;g++}for(k.moveToBookmark(e.shift());g--;){j=a[++d];j.moveToBookmark(e.shift());k.setEnd(j.endContainer,j.endOffset)}}return k}}},createBookmarks:function(b){for(var c=[],e,d=0;d<this.length;d++){c.push(e=this[d].createBookmark(b,true));for(var f=d+1;f<this.length;f++){this[f]=a(e,this[f]);this[f]=a(e,this[f],true)}}return c},createBookmarks2:function(a){for(var c=
[],e=0;e<this.length;e++)c.push(this[e].createBookmark2(a));return c},moveToBookmarks:function(a){for(var c=0;c<this.length;c++)this[c].moveToBookmark(a[c])}}})();
(function(){function a(){return CKEDITOR.getUrl(CKEDITOR.skinName.split(",")[1]||"skins/"+CKEDITOR.skinName.split(",")[0]+"/")}function f(b){var c=CKEDITOR.skin["ua_"+b],d=CKEDITOR.env;if(c)for(var c=c.split(",").sort(function(a,b){return a>b?-1:1}),e=0,f;e<c.length;e++){f=c[e];if(d.ie&&(f.replace(/^ie/,"")==d.version||d.quirks&&f=="iequirks"))f="ie";if(d[f]){b=b+("_"+c[e]);break}}return CKEDITOR.getUrl(a()+b+".css")}function b(a,b){if(!d[a]){CKEDITOR.document.appendStyleSheet(f(a));d[a]=1}b&&b()}
function c(a){var b=a.getById(h);if(!b){b=a.getHead().append("style");b.setAttribute("id",h);b.setAttribute("type","text/css")}return b}function e(a,b,c){var d,e,f;if(CKEDITOR.env.webkit){b=b.split("}").slice(0,-1);for(e=0;e<b.length;e++)b[e]=b[e].split("{")}for(var h=0;h<a.length;h++)if(CKEDITOR.env.webkit)for(e=0;e<b.length;e++){f=b[e][1];for(d=0;d<c.length;d++)f=f.replace(c[d][0],c[d][1]);a[h].$.sheet.addRule(b[e][0],f)}else{f=b;for(d=0;d<c.length;d++)f=f.replace(c[d][0],c[d][1]);CKEDITOR.env.ie&&
CKEDITOR.env.version<11?a[h].$.styleSheet.cssText=a[h].$.styleSheet.cssText+f:a[h].$.innerHTML=a[h].$.innerHTML+f}}var d={};CKEDITOR.skin={path:a,loadPart:function(c,d){CKEDITOR.skin.name!=CKEDITOR.skinName.split(",")[0]?CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(a()+"skin.js"),function(){b(c,d)}):b(c,d)},getPath:function(a){return CKEDITOR.getUrl(f(a))},icons:{},addIcon:function(a,b,c,d){a=a.toLowerCase();this.icons[a]||(this.icons[a]={path:b,offset:c||0,bgsize:d||"16px"})},getIconStyle:function(a,
b,c,d,e){var f;if(a){a=a.toLowerCase();b&&(f=this.icons[a+"-rtl"]);f||(f=this.icons[a])}a=c||f&&f.path||"";d=d||f&&f.offset;e=e||f&&f.bgsize||"16px";return a&&"background-image:url("+CKEDITOR.getUrl(a)+");background-position:0 "+d+"px;background-size:"+e+";"}};CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{getUiColor:function(){return this.uiColor},setUiColor:function(a){var b=c(CKEDITOR.document);return(this.setUiColor=function(a){this.uiColor=a;var c=CKEDITOR.skin.chameleon,d="",f="";if(typeof c==
"function"){d=c(this,"editor");f=c(this,"panel")}a=[[j,a]];e([b],d,a);e(k,f,a)}).call(this,a)}});var h="cke_ui_color",k=[],j=/\$color/g;CKEDITOR.on("instanceLoaded",function(a){if(!CKEDITOR.env.ie||!CKEDITOR.env.quirks){var b=a.editor,a=function(a){a=(a.data[0]||a.data).element.getElementsByTag("iframe").getItem(0).getFrameDocument();if(!a.getById("cke_ui_color")){a=c(a);k.push(a);var d=b.getUiColor();d&&e([a],CKEDITOR.skin.chameleon(b,"panel"),[[j,d]])}};b.on("panelShow",a);b.on("menuShow",a);b.config.uiColor&&
b.setUiColor(b.config.uiColor)}})})();
(function(){if(CKEDITOR.env.webkit)CKEDITOR.env.hc=false;else{var a=CKEDITOR.dom.element.createFromHtml('<div style="width:0;height:0;position:absolute;left:-10000px;border:1px solid;border-color:red blue"></div>',CKEDITOR.document);a.appendTo(CKEDITOR.document.getHead());try{var f=a.getComputedStyle("border-top-color"),b=a.getComputedStyle("border-right-color");CKEDITOR.env.hc=!!(f&&f==b)}catch(c){CKEDITOR.env.hc=false}a.remove()}if(CKEDITOR.env.hc)CKEDITOR.env.cssClass=CKEDITOR.env.cssClass+" cke_hc";
CKEDITOR.document.appendStyleText(".cke{visibility:hidden;}");CKEDITOR.status="loaded";CKEDITOR.fireOnce("loaded");if(a=CKEDITOR._.pending){delete CKEDITOR._.pending;for(f=0;f<a.length;f++){CKEDITOR.editor.prototype.constructor.apply(a[f][0],a[f][1]);CKEDITOR.add(a[f][0])}}})();CKEDITOR.skin.name="moono";CKEDITOR.skin.ua_editor="ie,iequirks,ie7,ie8,gecko";CKEDITOR.skin.ua_dialog="ie,iequirks,ie7,ie8";
CKEDITOR.skin.chameleon=function(){var b=function(){return function(b,e){for(var a=b.match(/[^#]./g),c=0;3>c;c++){var f=a,h=c,d;d=parseInt(a[c],16);d=("0"+(0>e?0|d*(1+e):0|d+(255-d)*e).toString(16)).slice(-2);f[h]=d}return"#"+a.join("")}}(),c=function(){var b=new CKEDITOR.template("background:#{to};background-image:-webkit-gradient(linear,lefttop,leftbottom,from({from}),to({to}));background-image:-moz-linear-gradient(top,{from},{to});background-image:-webkit-linear-gradient(top,{from},{to});background-image:-o-linear-gradient(top,{from},{to});background-image:-ms-linear-gradient(top,{from},{to});background-image:linear-gradient(top,{from},{to});filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='{from}',endColorstr='{to}');");return function(c,
a){return b.output({from:c,to:a})}}(),f={editor:new CKEDITOR.template("{id}.cke_chrome [border-color:{defaultBorder};] {id} .cke_top [ {defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_bottom [{defaultGradient}border-top-color:{defaultBorder};] {id} .cke_resizer [border-right-color:{ckeResizer}] {id} .cke_dialog_title [{defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_dialog_footer [{defaultGradient}outline-color:{defaultBorder};border-top-color:{defaultBorder};] {id} .cke_dialog_tab [{lightGradient}border-color:{defaultBorder};] {id} .cke_dialog_tab:hover [{mediumGradient}] {id} .cke_dialog_contents [border-top-color:{defaultBorder};] {id} .cke_dialog_tab_selected, {id} .cke_dialog_tab_selected:hover [background:{dialogTabSelected};border-bottom-color:{dialogTabSelectedBorder};] {id} .cke_dialog_body [background:{dialogBody};border-color:{defaultBorder};] {id} .cke_toolgroup [{lightGradient}border-color:{defaultBorder};] {id} a.cke_button_off:hover, {id} a.cke_button_off:focus, {id} a.cke_button_off:active [{mediumGradient}] {id} .cke_button_on [{ckeButtonOn}] {id} .cke_toolbar_separator [background-color: {ckeToolbarSeparator};] {id} .cke_combo_button [border-color:{defaultBorder};{lightGradient}] {id} a.cke_combo_button:hover, {id} a.cke_combo_button:focus, {id} .cke_combo_on a.cke_combo_button [border-color:{defaultBorder};{mediumGradient}] {id} .cke_path_item [color:{elementsPathColor};] {id} a.cke_path_item:hover, {id} a.cke_path_item:focus, {id} a.cke_path_item:active [background-color:{elementsPathBg};] {id}.cke_panel [border-color:{defaultBorder};] "),
panel:new CKEDITOR.template(".cke_panel_grouptitle [{lightGradient}border-color:{defaultBorder};] .cke_menubutton_icon [background-color:{menubuttonIcon};] .cke_menubutton:hover .cke_menubutton_icon, .cke_menubutton:focus .cke_menubutton_icon, .cke_menubutton:active .cke_menubutton_icon [background-color:{menubuttonIconHover};] .cke_menuseparator [background-color:{menubuttonIcon};] a:hover.cke_colorbox, a:focus.cke_colorbox, a:active.cke_colorbox [border-color:{defaultBorder};] a:hover.cke_colorauto, a:hover.cke_colormore, a:focus.cke_colorauto, a:focus.cke_colormore, a:active.cke_colorauto, a:active.cke_colormore [background-color:{ckeColorauto};border-color:{defaultBorder};] ")};
return function(g,e){var a=g.uiColor,a={id:"."+g.id,defaultBorder:b(a,-0.1),defaultGradient:c(b(a,0.9),a),lightGradient:c(b(a,1),b(a,0.7)),mediumGradient:c(b(a,0.8),b(a,0.5)),ckeButtonOn:c(b(a,0.6),b(a,0.7)),ckeResizer:b(a,-0.4),ckeToolbarSeparator:b(a,0.5),ckeColorauto:b(a,0.8),dialogBody:b(a,0.7),dialogTabSelected:c("#FFFFFF","#FFFFFF"),dialogTabSelectedBorder:"#FFF",elementsPathColor:b(a,-0.6),elementsPathBg:a,menubuttonIcon:b(a,0.5),menubuttonIconHover:b(a,0.3)};return f[e].output(a).replace(/\[/g,
"{").replace(/\]/g,"}")}}();CKEDITOR.plugins.add("basicstyles",{init:function(c){var e=0,d=function(g,d,b,a){if(a){var a=new CKEDITOR.style(a),f=h[b];f.unshift(a);c.attachStyleStateChange(a,function(a){!c.readOnly&&c.getCommand(b).setState(a)});c.addCommand(b,new CKEDITOR.styleCommand(a,{contentForms:f}));c.ui.addButton&&c.ui.addButton(g,{label:d,command:b,toolbar:"basicstyles,"+(e+=10)})}},h={bold:["strong","b",["span",function(a){a=a.styles["font-weight"];return"bold"==a||700<=+a}]],italic:["em","i",["span",function(a){return"italic"==
a.styles["font-style"]}]],underline:["u",["span",function(a){return"underline"==a.styles["text-decoration"]}]],strike:["s","strike",["span",function(a){return"line-through"==a.styles["text-decoration"]}]],subscript:["sub"],superscript:["sup"]},b=c.config,a=c.lang.basicstyles;d("Bold",a.bold,"bold",b.coreStyles_bold);d("Italic",a.italic,"italic",b.coreStyles_italic);d("Underline",a.underline,"underline",b.coreStyles_underline);d("Strike",a.strike,"strike",b.coreStyles_strike);d("Subscript",a.subscript,
"subscript",b.coreStyles_subscript);d("Superscript",a.superscript,"superscript",b.coreStyles_superscript);c.setKeystroke([[CKEDITOR.CTRL+66,"bold"],[CKEDITOR.CTRL+73,"italic"],[CKEDITOR.CTRL+85,"underline"]])}});CKEDITOR.config.coreStyles_bold={element:"strong",overrides:"b"};CKEDITOR.config.coreStyles_italic={element:"em",overrides:"i"};CKEDITOR.config.coreStyles_underline={element:"u"};CKEDITOR.config.coreStyles_strike={element:"s",overrides:"strike"};CKEDITOR.config.coreStyles_subscript={element:"sub"};
CKEDITOR.config.coreStyles_superscript={element:"sup"};(function(){var k={exec:function(g){var a=g.getCommand("blockquote").state,i=g.getSelection(),c=i&&i.getRanges()[0];if(c){var h=i.createBookmarks();if(CKEDITOR.env.ie){var e=h[0].startNode,b=h[0].endNode,d;if(e&&"blockquote"==e.getParent().getName())for(d=e;d=d.getNext();)if(d.type==CKEDITOR.NODE_ELEMENT&&d.isBlockBoundary()){e.move(d,!0);break}if(b&&"blockquote"==b.getParent().getName())for(d=b;d=d.getPrevious();)if(d.type==CKEDITOR.NODE_ELEMENT&&d.isBlockBoundary()){b.move(d);break}}var f=c.createIterator();
f.enlargeBr=g.config.enterMode!=CKEDITOR.ENTER_BR;if(a==CKEDITOR.TRISTATE_OFF){for(e=[];a=f.getNextParagraph();)e.push(a);1>e.length&&(a=g.document.createElement(g.config.enterMode==CKEDITOR.ENTER_P?"p":"div"),b=h.shift(),c.insertNode(a),a.append(new CKEDITOR.dom.text("",g.document)),c.moveToBookmark(b),c.selectNodeContents(a),c.collapse(!0),b=c.createBookmark(),e.push(a),h.unshift(b));d=e[0].getParent();c=[];for(b=0;b<e.length;b++)a=e[b],d=d.getCommonAncestor(a.getParent());for(a={table:1,tbody:1,
tr:1,ol:1,ul:1};a[d.getName()];)d=d.getParent();for(b=null;0<e.length;){for(a=e.shift();!a.getParent().equals(d);)a=a.getParent();a.equals(b)||c.push(a);b=a}for(;0<c.length;)if(a=c.shift(),"blockquote"==a.getName()){for(b=new CKEDITOR.dom.documentFragment(g.document);a.getFirst();)b.append(a.getFirst().remove()),e.push(b.getLast());b.replace(a)}else e.push(a);c=g.document.createElement("blockquote");for(c.insertBefore(e[0]);0<e.length;)a=e.shift(),c.append(a)}else if(a==CKEDITOR.TRISTATE_ON){b=[];
for(d={};a=f.getNextParagraph();){for(e=c=null;a.getParent();){if("blockquote"==a.getParent().getName()){c=a.getParent();e=a;break}a=a.getParent()}c&&(e&&!e.getCustomData("blockquote_moveout"))&&(b.push(e),CKEDITOR.dom.element.setMarker(d,e,"blockquote_moveout",!0))}CKEDITOR.dom.element.clearAllMarkers(d);a=[];e=[];for(d={};0<b.length;)f=b.shift(),c=f.getParent(),f.getPrevious()?f.getNext()?(f.breakParent(f.getParent()),e.push(f.getNext())):f.remove().insertAfter(c):f.remove().insertBefore(c),c.getCustomData("blockquote_processed")||
(e.push(c),CKEDITOR.dom.element.setMarker(d,c,"blockquote_processed",!0)),a.push(f);CKEDITOR.dom.element.clearAllMarkers(d);for(b=e.length-1;0<=b;b--){c=e[b];a:{d=c;for(var f=0,k=d.getChildCount(),j=void 0;f<k&&(j=d.getChild(f));f++)if(j.type==CKEDITOR.NODE_ELEMENT&&j.isBlockBoundary()){d=!1;break a}d=!0}d&&c.remove()}if(g.config.enterMode==CKEDITOR.ENTER_BR)for(c=!0;a.length;)if(f=a.shift(),"div"==f.getName()){b=new CKEDITOR.dom.documentFragment(g.document);c&&(f.getPrevious()&&!(f.getPrevious().type==
CKEDITOR.NODE_ELEMENT&&f.getPrevious().isBlockBoundary()))&&b.append(g.document.createElement("br"));for(c=f.getNext()&&!(f.getNext().type==CKEDITOR.NODE_ELEMENT&&f.getNext().isBlockBoundary());f.getFirst();)f.getFirst().remove().appendTo(b);c&&b.append(g.document.createElement("br"));b.replace(f);c=!1}}i.selectBookmarks(h);g.focus()}},refresh:function(g,a){this.setState(g.elementPath(a.block||a.blockLimit).contains("blockquote",1)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)},context:"blockquote",
allowedContent:"blockquote",requiredContent:"blockquote"};CKEDITOR.plugins.add("blockquote",{init:function(g){g.blockless||(g.addCommand("blockquote",k),g.ui.addButton&&g.ui.addButton("Blockquote",{label:g.lang.blockquote.toolbar,command:"blockquote",toolbar:"blocks,10"}))}})})();CKEDITOR.plugins.add("dialogui",{onLoad:function(){var h=function(b){this._||(this._={});this._["default"]=this._.initValue=b["default"]||"";this._.required=b.required||!1;for(var a=[this._],d=1;d<arguments.length;d++)a.push(arguments[d]);a.push(!0);CKEDITOR.tools.extend.apply(CKEDITOR.tools,a);return this._},r={build:function(b,a,d){return new CKEDITOR.ui.dialog.textInput(b,a,d)}},l={build:function(b,a,d){return new CKEDITOR.ui.dialog[a.type](b,a,d)}},n={isChanged:function(){return this.getValue()!=
this.getInitValue()},reset:function(b){this.setValue(this.getInitValue(),b)},setInitValue:function(){this._.initValue=this.getValue()},resetInitValue:function(){this._.initValue=this._["default"]},getInitValue:function(){return this._.initValue}},o=CKEDITOR.tools.extend({},CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,{onChange:function(b,a){this._.domOnChangeRegistered||(b.on("load",function(){this.getInputElement().on("change",function(){b.parts.dialog.isVisible()&&this.fire("change",{value:this.getValue()})},
this)},this),this._.domOnChangeRegistered=!0);this.on("change",a)}},!0),s=/^on([A-Z]\w+)/,p=function(b){for(var a in b)(s.test(a)||"title"==a||"type"==a)&&delete b[a];return b};CKEDITOR.tools.extend(CKEDITOR.ui.dialog,{labeledElement:function(b,a,d,f){if(!(4>arguments.length)){var c=h.call(this,a);c.labelId=CKEDITOR.tools.getNextId()+"_label";this._.children=[];var e={role:a.role||"presentation"};a.includeLabel&&(e["aria-labelledby"]=c.labelId);CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,"div",null,
e,function(){var e=[],g=a.required?" cke_required":"";if(a.labelLayout!="horizontal")e.push('<label class="cke_dialog_ui_labeled_label'+g+'" ',' id="'+c.labelId+'"',c.inputId?' for="'+c.inputId+'"':"",(a.labelStyle?' style="'+a.labelStyle+'"':"")+">",a.label,"</label>",'<div class="cke_dialog_ui_labeled_content"',a.controlStyle?' style="'+a.controlStyle+'"':"",' role="presentation">',f.call(this,b,a),"</div>");else{g={type:"hbox",widths:a.widths,padding:0,children:[{type:"html",html:'<label class="cke_dialog_ui_labeled_label'+
g+'" id="'+c.labelId+'" for="'+c.inputId+'"'+(a.labelStyle?' style="'+a.labelStyle+'"':"")+">"+CKEDITOR.tools.htmlEncode(a.label)+"</span>"},{type:"html",html:'<span class="cke_dialog_ui_labeled_content"'+(a.controlStyle?' style="'+a.controlStyle+'"':"")+">"+f.call(this,b,a)+"</span>"}]};CKEDITOR.dialog._.uiElementBuilders.hbox.build(b,g,e)}return e.join("")})}},textInput:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);var f=this._.inputId=CKEDITOR.tools.getNextId()+"_textInput",c={"class":"cke_dialog_ui_input_"+
a.type,id:f,type:a.type};a.validate&&(this.validate=a.validate);a.maxLength&&(c.maxlength=a.maxLength);a.size&&(c.size=a.size);a.inputStyle&&(c.style=a.inputStyle);var e=this,k=!1;b.on("load",function(){e.getInputElement().on("keydown",function(a){a.data.getKeystroke()==13&&(k=true)});e.getInputElement().on("keyup",function(a){if(a.data.getKeystroke()==13&&k){b.getButton("ok")&&setTimeout(function(){b.getButton("ok").click()},0);k=false}},null,null,1E3)});CKEDITOR.ui.dialog.labeledElement.call(this,
b,a,d,function(){var b=['<div class="cke_dialog_ui_input_',a.type,'" role="presentation"'];a.width&&b.push('style="width:'+a.width+'" ');b.push("><input ");c["aria-labelledby"]=this._.labelId;this._.required&&(c["aria-required"]=this._.required);for(var e in c)b.push(e+'="'+c[e]+'" ');b.push(" /></div>");return b.join("")})}},textarea:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);var f=this,c=this._.inputId=CKEDITOR.tools.getNextId()+"_textarea",e={};a.validate&&(this.validate=a.validate);
e.rows=a.rows||5;e.cols=a.cols||20;e["class"]="cke_dialog_ui_input_textarea "+(a["class"]||"");"undefined"!=typeof a.inputStyle&&(e.style=a.inputStyle);a.dir&&(e.dir=a.dir);CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){e["aria-labelledby"]=this._.labelId;this._.required&&(e["aria-required"]=this._.required);var a=['<div class="cke_dialog_ui_input_textarea" role="presentation"><textarea id="',c,'" '],b;for(b in e)a.push(b+'="'+CKEDITOR.tools.htmlEncode(e[b])+'" ');a.push(">",CKEDITOR.tools.htmlEncode(f._["default"]),
"</textarea></div>");return a.join("")})}},checkbox:function(b,a,d){if(!(3>arguments.length)){var f=h.call(this,a,{"default":!!a["default"]});a.validate&&(this.validate=a.validate);CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,"span",null,null,function(){var c=CKEDITOR.tools.extend({},a,{id:a.id?a.id+"_checkbox":CKEDITOR.tools.getNextId()+"_checkbox"},true),e=[],d=CKEDITOR.tools.getNextId()+"_label",g={"class":"cke_dialog_ui_checkbox_input",type:"checkbox","aria-labelledby":d};p(c);if(a["default"])g.checked=
"checked";if(typeof c.inputStyle!="undefined")c.style=c.inputStyle;f.checkbox=new CKEDITOR.ui.dialog.uiElement(b,c,e,"input",null,g);e.push(' <label id="',d,'" for="',g.id,'"'+(a.labelStyle?' style="'+a.labelStyle+'"':"")+">",CKEDITOR.tools.htmlEncode(a.label),"</label>");return e.join("")})}},radio:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);this._["default"]||(this._["default"]=this._.initValue=a.items[0][1]);a.validate&&(this.validate=a.valdiate);var f=[],c=this;a.role="radiogroup";
a.includeLabel=!0;CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){for(var e=[],d=[],g=(a.id?a.id:CKEDITOR.tools.getNextId())+"_radio",i=0;i<a.items.length;i++){var j=a.items[i],h=j[2]!==void 0?j[2]:j[0],l=j[1]!==void 0?j[1]:j[0],m=CKEDITOR.tools.getNextId()+"_radio_input",n=m+"_label",m=CKEDITOR.tools.extend({},a,{id:m,title:null,type:null},true),h=CKEDITOR.tools.extend({},m,{title:h},true),o={type:"radio","class":"cke_dialog_ui_radio_input",name:g,value:l,"aria-labelledby":n},q=[];if(c._["default"]==
l)o.checked="checked";p(m);p(h);if(typeof m.inputStyle!="undefined")m.style=m.inputStyle;m.keyboardFocusable=true;f.push(new CKEDITOR.ui.dialog.uiElement(b,m,q,"input",null,o));q.push(" ");new CKEDITOR.ui.dialog.uiElement(b,h,q,"label",null,{id:n,"for":o.id},j[0]);e.push(q.join(""))}new CKEDITOR.ui.dialog.hbox(b,f,e,d);return d.join("")});this._.children=f}},button:function(b,a,d){if(arguments.length){"function"==typeof a&&(a=a(b.getParentEditor()));h.call(this,a,{disabled:a.disabled||!1});CKEDITOR.event.implementOn(this);
var f=this;b.on("load",function(){var a=this.getElement();(function(){a.on("click",function(a){f.click();a.data.preventDefault()});a.on("keydown",function(a){a.data.getKeystroke()in{32:1}&&(f.click(),a.data.preventDefault())})})();a.unselectable()},this);var c=CKEDITOR.tools.extend({},a);delete c.style;var e=CKEDITOR.tools.getNextId()+"_label";CKEDITOR.ui.dialog.uiElement.call(this,b,c,d,"a",null,{style:a.style,href:"javascript:void(0)",title:a.label,hidefocus:"true","class":a["class"],role:"button",
"aria-labelledby":e},'<span id="'+e+'" class="cke_dialog_ui_button">'+CKEDITOR.tools.htmlEncode(a.label)+"</span>")}},select:function(b,a,d){if(!(3>arguments.length)){var f=h.call(this,a);a.validate&&(this.validate=a.validate);f.inputId=CKEDITOR.tools.getNextId()+"_select";CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){var c=CKEDITOR.tools.extend({},a,{id:a.id?a.id+"_select":CKEDITOR.tools.getNextId()+"_select"},true),e=[],d=[],g={id:f.inputId,"class":"cke_dialog_ui_input_select","aria-labelledby":this._.labelId};
e.push('<div class="cke_dialog_ui_input_',a.type,'" role="presentation"');a.width&&e.push('style="width:'+a.width+'" ');e.push(">");if(a.size!==void 0)g.size=a.size;if(a.multiple!==void 0)g.multiple=a.multiple;p(c);for(var i=0,j;i<a.items.length&&(j=a.items[i]);i++)d.push('<option value="',CKEDITOR.tools.htmlEncode(j[1]!==void 0?j[1]:j[0]).replace(/"/g,"&quot;"),'" /> ',CKEDITOR.tools.htmlEncode(j[0]));if(typeof c.inputStyle!="undefined")c.style=c.inputStyle;f.select=new CKEDITOR.ui.dialog.uiElement(b,
c,e,"select",null,g,d.join(""));e.push("</div>");return e.join("")})}},file:function(b,a,d){if(!(3>arguments.length)){void 0===a["default"]&&(a["default"]="");var f=CKEDITOR.tools.extend(h.call(this,a),{definition:a,buttons:[]});a.validate&&(this.validate=a.validate);b.on("load",function(){CKEDITOR.document.getById(f.frameId).getParent().addClass("cke_dialog_ui_input_file")});CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){f.frameId=CKEDITOR.tools.getNextId()+"_fileInput";var b=['<iframe frameborder="0" allowtransparency="0" class="cke_dialog_ui_input_file" role="presentation" id="',
f.frameId,'" title="',a.label,'" src="javascript:void('];b.push(CKEDITOR.env.ie?"(function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+"})()":"0");b.push(')"></iframe>');return b.join("")})}},fileButton:function(b,a,d){var f=this;if(!(3>arguments.length)){h.call(this,a);a.validate&&(this.validate=a.validate);var c=CKEDITOR.tools.extend({},a),e=c.onClick;c.className=(c.className?c.className+" ":"")+"cke_dialog_ui_button";c.onClick=function(c){var d=
a["for"];if(!e||e.call(this,c)!==false){b.getContentElement(d[0],d[1]).submit();this.disable()}};b.on("load",function(){b.getContentElement(a["for"][0],a["for"][1])._.buttons.push(f)});CKEDITOR.ui.dialog.button.call(this,b,c,d)}},html:function(){var b=/^\s*<[\w:]+\s+([^>]*)?>/,a=/^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/,d=/\/$/;return function(f,c,e){if(!(3>arguments.length)){var k=[],g=c.html;"<"!=g.charAt(0)&&(g="<span>"+g+"</span>");var i=c.focus;if(i){var j=this.focus;this.focus=function(){("function"==
typeof i?i:j).call(this);this.fire("focus")};c.isFocusable&&(this.isFocusable=this.isFocusable);this.keyboardFocusable=!0}CKEDITOR.ui.dialog.uiElement.call(this,f,c,k,"span",null,null,"");k=k.join("").match(b);g=g.match(a)||["","",""];d.test(g[1])&&(g[1]=g[1].slice(0,-1),g[2]="/"+g[2]);e.push([g[1]," ",k[1]||"",g[2]].join(""))}}}(),fieldset:function(b,a,d,f,c){var e=c.label;this._={children:a};CKEDITOR.ui.dialog.uiElement.call(this,b,c,f,"fieldset",null,null,function(){var a=[];e&&a.push("<legend"+
(c.labelStyle?' style="'+c.labelStyle+'"':"")+">"+e+"</legend>");for(var b=0;b<d.length;b++)a.push(d[b]);return a.join("")})}},!0);CKEDITOR.ui.dialog.html.prototype=new CKEDITOR.ui.dialog.uiElement;CKEDITOR.ui.dialog.labeledElement.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{setLabel:function(b){var a=CKEDITOR.document.getById(this._.labelId);1>a.getChildCount()?(new CKEDITOR.dom.text(b,CKEDITOR.document)).appendTo(a):a.getChild(0).$.nodeValue=b;return this},getLabel:function(){var b=
CKEDITOR.document.getById(this._.labelId);return!b||1>b.getChildCount()?"":b.getChild(0).getText()},eventProcessors:o},!0);CKEDITOR.ui.dialog.button.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{click:function(){return!this._.disabled?this.fire("click",{dialog:this._.dialog}):!1},enable:function(){this._.disabled=!1;var b=this.getElement();b&&b.removeClass("cke_disabled")},disable:function(){this._.disabled=!0;this.getElement().addClass("cke_disabled")},isVisible:function(){return this.getElement().getFirst().isVisible()},
isEnabled:function(){return!this._.disabled},eventProcessors:CKEDITOR.tools.extend({},CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,{onClick:function(b,a){this.on("click",function(){a.apply(this,arguments)})}},!0),accessKeyUp:function(){this.click()},accessKeyDown:function(){this.focus()},keyboardFocusable:!0},!0);CKEDITOR.ui.dialog.textInput.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return CKEDITOR.document.getById(this._.inputId)},
focus:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&a.$.focus()},0)},select:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&(a.$.focus(),a.$.select())},0)},accessKeyUp:function(){this.select()},setValue:function(b){!b&&(b="");return CKEDITOR.ui.dialog.uiElement.prototype.setValue.apply(this,arguments)},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.textarea.prototype=new CKEDITOR.ui.dialog.textInput;CKEDITOR.ui.dialog.select.prototype=
CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return this._.select.getElement()},add:function(b,a,d){var f=new CKEDITOR.dom.element("option",this.getDialog().getParentEditor().document),c=this.getInputElement().$;f.$.text=b;f.$.value=void 0===a||null===a?b:a;void 0===d||null===d?CKEDITOR.env.ie?c.add(f.$):c.add(f.$,null):c.add(f.$,d);return this},remove:function(b){this.getInputElement().$.remove(b);return this},clear:function(){for(var b=this.getInputElement().$;0<
b.length;)b.remove(0);return this},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.checkbox.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{getInputElement:function(){return this._.checkbox.getElement()},setValue:function(b,a){this.getInputElement().$.checked=b;!a&&this.fire("change",{value:b})},getValue:function(){return this.getInputElement().$.checked},accessKeyUp:function(){this.setValue(!this.getValue())},eventProcessors:{onChange:function(b,a){if(!CKEDITOR.env.ie||8<CKEDITOR.env.version)return o.onChange.apply(this,
arguments);b.on("load",function(){var a=this._.checkbox.getElement();a.on("propertychange",function(b){b=b.data.$;"checked"==b.propertyName&&this.fire("change",{value:a.$.checked})},this)},this);this.on("change",a);return null}},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.radio.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{setValue:function(b,a){for(var d=this._.children,f,c=0;c<d.length&&(f=d[c]);c++)f.getElement().$.checked=f.getValue()==b;!a&&this.fire("change",{value:b})},
getValue:function(){for(var b=this._.children,a=0;a<b.length;a++)if(b[a].getElement().$.checked)return b[a].getValue();return null},accessKeyUp:function(){var b=this._.children,a;for(a=0;a<b.length;a++)if(b[a].getElement().$.checked){b[a].getElement().focus();return}b[0].getElement().focus()},eventProcessors:{onChange:function(b,a){if(CKEDITOR.env.ie)b.on("load",function(){for(var a=this._.children,b=this,c=0;c<a.length;c++)a[c].getElement().on("propertychange",function(a){a=a.data.$;"checked"==a.propertyName&&
this.$.checked&&b.fire("change",{value:this.getAttribute("value")})})},this),this.on("change",a);else return o.onChange.apply(this,arguments);return null}}},n,!0);CKEDITOR.ui.dialog.file.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,n,{getInputElement:function(){var b=CKEDITOR.document.getById(this._.frameId).getFrameDocument();return 0<b.$.forms.length?new CKEDITOR.dom.element(b.$.forms[0].elements[0]):this.getElement()},submit:function(){this.getInputElement().getParent().$.submit();
return this},getAction:function(){return this.getInputElement().getParent().$.action},registerEvents:function(b){var a=/^on([A-Z]\w+)/,d,f=function(a,b,c,d){a.on("formLoaded",function(){a.getInputElement().on(c,d,a)})},c;for(c in b)if(d=c.match(a))this.eventProcessors[c]?this.eventProcessors[c].call(this,this._.dialog,b[c]):f(this,this._.dialog,d[1].toLowerCase(),b[c]);return this},reset:function(){function b(){d.$.open();var b="";f.size&&(b=f.size-(CKEDITOR.env.ie?7:0));var h=a.frameId+"_input";
d.$.write(['<html dir="'+g+'" lang="'+i+'"><head><title></title></head><body style="margin: 0; overflow: hidden; background: transparent;">','<form enctype="multipart/form-data" method="POST" dir="'+g+'" lang="'+i+'" action="',CKEDITOR.tools.htmlEncode(f.action),'"><label id="',a.labelId,'" for="',h,'" style="display:none">',CKEDITOR.tools.htmlEncode(f.label),'</label><input style="width:100%" id="',h,'" aria-labelledby="',a.labelId,'" type="file" name="',CKEDITOR.tools.htmlEncode(f.id||"cke_upload"),
'" size="',CKEDITOR.tools.htmlEncode(0<b?b:""),'" /></form></body></html><script>',CKEDITOR.env.ie?"("+CKEDITOR.tools.fixDomain+")();":"","window.parent.CKEDITOR.tools.callFunction("+e+");","window.onbeforeunload = function() {window.parent.CKEDITOR.tools.callFunction("+k+")}","<\/script>"].join(""));d.$.close();for(b=0;b<c.length;b++)c[b].enable()}var a=this._,d=CKEDITOR.document.getById(a.frameId).getFrameDocument(),f=a.definition,c=a.buttons,e=this.formLoadedNumber,k=this.formUnloadNumber,g=a.dialog._.editor.lang.dir,
i=a.dialog._.editor.langCode;e||(e=this.formLoadedNumber=CKEDITOR.tools.addFunction(function(){this.fire("formLoaded")},this),k=this.formUnloadNumber=CKEDITOR.tools.addFunction(function(){this.getInputElement().clearCustomData()},this),this.getDialog()._.editor.on("destroy",function(){CKEDITOR.tools.removeFunction(e);CKEDITOR.tools.removeFunction(k)}));CKEDITOR.env.gecko?setTimeout(b,500):b()},getValue:function(){return this.getInputElement().$.value||""},setInitValue:function(){this._.initValue=
""},eventProcessors:{onChange:function(b,a){this._.domOnChangeRegistered||(this.on("formLoaded",function(){this.getInputElement().on("change",function(){this.fire("change",{value:this.getValue()})},this)},this),this._.domOnChangeRegistered=!0);this.on("change",a)}},keyboardFocusable:!0},!0);CKEDITOR.ui.dialog.fileButton.prototype=new CKEDITOR.ui.dialog.button;CKEDITOR.ui.dialog.fieldset.prototype=CKEDITOR.tools.clone(CKEDITOR.ui.dialog.hbox.prototype);CKEDITOR.dialog.addUIElement("text",r);CKEDITOR.dialog.addUIElement("password",
r);CKEDITOR.dialog.addUIElement("textarea",l);CKEDITOR.dialog.addUIElement("checkbox",l);CKEDITOR.dialog.addUIElement("radio",l);CKEDITOR.dialog.addUIElement("button",l);CKEDITOR.dialog.addUIElement("select",l);CKEDITOR.dialog.addUIElement("file",l);CKEDITOR.dialog.addUIElement("fileButton",l);CKEDITOR.dialog.addUIElement("html",l);CKEDITOR.dialog.addUIElement("fieldset",{build:function(b,a,d){for(var f=a.children,c,e=[],h=[],g=0;g<f.length&&(c=f[g]);g++){var i=[];e.push(i);h.push(CKEDITOR.dialog._.uiElementBuilders[c.type].build(b,
c,i))}return new CKEDITOR.ui.dialog[a.type](b,h,e,d,a)}})}});CKEDITOR.DIALOG_RESIZE_NONE=0;CKEDITOR.DIALOG_RESIZE_WIDTH=1;CKEDITOR.DIALOG_RESIZE_HEIGHT=2;CKEDITOR.DIALOG_RESIZE_BOTH=3;
(function(){function t(){for(var a=this._.tabIdList.length,b=CKEDITOR.tools.indexOf(this._.tabIdList,this._.currentTabId)+a,c=b-1;c>b-a;c--)if(this._.tabs[this._.tabIdList[c%a]][0].$.offsetHeight)return this._.tabIdList[c%a];return null}function u(){for(var a=this._.tabIdList.length,b=CKEDITOR.tools.indexOf(this._.tabIdList,this._.currentTabId),c=b+1;c<b+a;c++)if(this._.tabs[this._.tabIdList[c%a]][0].$.offsetHeight)return this._.tabIdList[c%a];return null}function G(a,b){for(var c=a.$.getElementsByTagName("input"),
e=0,d=c.length;e<d;e++){var g=new CKEDITOR.dom.element(c[e]);"text"==g.getAttribute("type").toLowerCase()&&(b?(g.setAttribute("value",g.getCustomData("fake_value")||""),g.removeCustomData("fake_value")):(g.setCustomData("fake_value",g.getAttribute("value")),g.setAttribute("value","")))}}function P(a,b){var c=this.getInputElement();c&&(a?c.removeAttribute("aria-invalid"):c.setAttribute("aria-invalid",!0));a||(this.select?this.select():this.focus());b&&alert(b);this.fire("validated",{valid:a,msg:b})}
function Q(){var a=this.getInputElement();a&&a.removeAttribute("aria-invalid")}function R(a){var a=CKEDITOR.dom.element.createFromHtml(CKEDITOR.addTemplate("dialog",S).output({id:CKEDITOR.tools.getNextNumber(),editorId:a.id,langDir:a.lang.dir,langCode:a.langCode,editorDialogClass:"cke_editor_"+a.name.replace(/\./g,"\\.")+"_dialog",closeTitle:a.lang.common.close,hidpi:CKEDITOR.env.hidpi?"cke_hidpi":""})),b=a.getChild([0,0,0,0,0]),c=b.getChild(0),e=b.getChild(1);if(CKEDITOR.env.ie&&!CKEDITOR.env.quirks){var d=
"javascript:void(function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+"}())";CKEDITOR.dom.element.createFromHtml('<iframe frameBorder="0" class="cke_iframe_shim" src="'+d+'" tabIndex="-1"></iframe>').appendTo(b.getParent())}c.unselectable();e.unselectable();return{element:a,parts:{dialog:a.getChild(0),title:c,close:e,tabs:b.getChild(2),contents:b.getChild([3,0,0,0]),footer:b.getChild([3,0,1,0])}}}function H(a,b,c){this.element=b;this.focusIndex=c;this.tabIndex=
0;this.isFocusable=function(){return!b.getAttribute("disabled")&&b.isVisible()};this.focus=function(){a._.currentFocusIndex=this.focusIndex;this.element.focus()};b.on("keydown",function(a){a.data.getKeystroke()in{32:1,13:1}&&this.fire("click")});b.on("focus",function(){this.fire("mouseover")});b.on("blur",function(){this.fire("mouseout")})}function T(a){function b(){a.layout()}var c=CKEDITOR.document.getWindow();c.on("resize",b);a.on("hide",function(){c.removeListener("resize",b)})}function I(a,b){this._=
{dialog:a};CKEDITOR.tools.extend(this,b)}function U(a){function b(b){var c=a.getSize(),i=CKEDITOR.document.getWindow().getViewPaneSize(),o=b.data.$.screenX,j=b.data.$.screenY,n=o-e.x,l=j-e.y;e={x:o,y:j};d.x+=n;d.y+=l;a.move(d.x+h[3]<f?-h[3]:d.x-h[1]>i.width-c.width-f?i.width-c.width+("rtl"==g.lang.dir?0:h[1]):d.x,d.y+h[0]<f?-h[0]:d.y-h[2]>i.height-c.height-f?i.height-c.height+h[2]:d.y,1);b.data.preventDefault()}function c(){CKEDITOR.document.removeListener("mousemove",b);CKEDITOR.document.removeListener("mouseup",
c);if(CKEDITOR.env.ie6Compat){var a=q.getChild(0).getFrameDocument();a.removeListener("mousemove",b);a.removeListener("mouseup",c)}}var e=null,d=null,g=a.getParentEditor(),f=g.config.dialog_magnetDistance,h=CKEDITOR.skin.margins||[0,0,0,0];"undefined"==typeof f&&(f=20);a.parts.title.on("mousedown",function(f){e={x:f.data.$.screenX,y:f.data.$.screenY};CKEDITOR.document.on("mousemove",b);CKEDITOR.document.on("mouseup",c);d=a.getPosition();if(CKEDITOR.env.ie6Compat){var h=q.getChild(0).getFrameDocument();
h.on("mousemove",b);h.on("mouseup",c)}f.data.preventDefault()},a)}function V(a){var b,c;function e(d){var e="rtl"==h.lang.dir,j=o.width,C=o.height,D=j+(d.data.$.screenX-b)*(e?-1:1)*(a._.moved?1:2),n=C+(d.data.$.screenY-c)*(a._.moved?1:2),x=a._.element.getFirst(),x=e&&x.getComputedStyle("right"),y=a.getPosition();y.y+n>i.height&&(n=i.height-y.y);if((e?x:y.x)+D>i.width)D=i.width-(e?x:y.x);if(f==CKEDITOR.DIALOG_RESIZE_WIDTH||f==CKEDITOR.DIALOG_RESIZE_BOTH)j=Math.max(g.minWidth||0,D-m);if(f==CKEDITOR.DIALOG_RESIZE_HEIGHT||
f==CKEDITOR.DIALOG_RESIZE_BOTH)C=Math.max(g.minHeight||0,n-k);a.resize(j,C);a._.moved||a.layout();d.data.preventDefault()}function d(){CKEDITOR.document.removeListener("mouseup",d);CKEDITOR.document.removeListener("mousemove",e);j&&(j.remove(),j=null);if(CKEDITOR.env.ie6Compat){var a=q.getChild(0).getFrameDocument();a.removeListener("mouseup",d);a.removeListener("mousemove",e)}}var g=a.definition,f=g.resizable;if(f!=CKEDITOR.DIALOG_RESIZE_NONE){var h=a.getParentEditor(),m,k,i,o,j,n=CKEDITOR.tools.addFunction(function(f){o=
a.getSize();var h=a.parts.contents;h.$.getElementsByTagName("iframe").length&&(j=CKEDITOR.dom.element.createFromHtml('<div class="cke_dialog_resize_cover" style="height: 100%; position: absolute; width: 100%;"></div>'),h.append(j));k=o.height-a.parts.contents.getSize("height",!(CKEDITOR.env.gecko||CKEDITOR.env.ie&&CKEDITOR.env.quirks));m=o.width-a.parts.contents.getSize("width",1);b=f.screenX;c=f.screenY;i=CKEDITOR.document.getWindow().getViewPaneSize();CKEDITOR.document.on("mousemove",e);CKEDITOR.document.on("mouseup",
d);CKEDITOR.env.ie6Compat&&(h=q.getChild(0).getFrameDocument(),h.on("mousemove",e),h.on("mouseup",d));f.preventDefault&&f.preventDefault()});a.on("load",function(){var b="";f==CKEDITOR.DIALOG_RESIZE_WIDTH?b=" cke_resizer_horizontal":f==CKEDITOR.DIALOG_RESIZE_HEIGHT&&(b=" cke_resizer_vertical");b=CKEDITOR.dom.element.createFromHtml('<div class="cke_resizer'+b+" cke_resizer_"+h.lang.dir+'" title="'+CKEDITOR.tools.htmlEncode(h.lang.common.resize)+'" onmousedown="CKEDITOR.tools.callFunction('+n+', event )">'+
("ltr"==h.lang.dir?"◢":"◣")+"</div>");a.parts.footer.append(b,1)});h.on("destroy",function(){CKEDITOR.tools.removeFunction(n)})}}function E(a){a.data.preventDefault(1)}function J(a){var b=CKEDITOR.document.getWindow(),c=a.config,e=c.dialog_backgroundCoverColor||"white",d=c.dialog_backgroundCoverOpacity,g=c.baseFloatZIndex,c=CKEDITOR.tools.genKey(e,d,g),f=w[c];f?f.show():(g=['<div tabIndex="-1" style="position: ',CKEDITOR.env.ie6Compat?"absolute":"fixed","; z-index: ",g,"; top: 0px; left: 0px; ",!CKEDITOR.env.ie6Compat?
"background-color: "+e:"",'" class="cke_dialog_background_cover">'],CKEDITOR.env.ie6Compat&&(e="<html><body style=\\'background-color:"+e+";\\'></body></html>",g.push('<iframe hidefocus="true" frameborder="0" id="cke_dialog_background_iframe" src="javascript:'),g.push("void((function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.write( '"+e+"' );document.close();")+"})())"),g.push('" style="position:absolute;left:0;top:0;width:100%;height: 100%;filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0)"></iframe>')),
g.push("</div>"),f=CKEDITOR.dom.element.createFromHtml(g.join("")),f.setOpacity(void 0!==d?d:0.5),f.on("keydown",E),f.on("keypress",E),f.on("keyup",E),f.appendTo(CKEDITOR.document.getBody()),w[c]=f);a.focusManager.add(f);q=f;var a=function(){var a=b.getViewPaneSize();f.setStyles({width:a.width+"px",height:a.height+"px"})},h=function(){var a=b.getScrollPosition(),c=CKEDITOR.dialog._.currentTop;f.setStyles({left:a.x+"px",top:a.y+"px"});if(c){do{a=c.getPosition();c.move(a.x,a.y)}while(c=c._.parentDialog)
}};F=a;b.on("resize",a);a();(!CKEDITOR.env.mac||!CKEDITOR.env.webkit)&&f.focus();if(CKEDITOR.env.ie6Compat){var m=function(){h();arguments.callee.prevScrollHandler.apply(this,arguments)};b.$.setTimeout(function(){m.prevScrollHandler=window.onscroll||function(){};window.onscroll=m},0);h()}}function K(a){q&&(a.focusManager.remove(q),a=CKEDITOR.document.getWindow(),q.hide(),a.removeListener("resize",F),CKEDITOR.env.ie6Compat&&a.$.setTimeout(function(){window.onscroll=window.onscroll&&window.onscroll.prevScrollHandler||
null},0),F=null)}var r=CKEDITOR.tools.cssLength,S='<div class="cke_reset_all {editorId} {editorDialogClass} {hidpi}" dir="{langDir}" lang="{langCode}" role="dialog" aria-labelledby="cke_dialog_title_{id}"><table class="cke_dialog '+CKEDITOR.env.cssClass+' cke_{langDir}" style="position:absolute" role="presentation"><tr><td role="presentation"><div class="cke_dialog_body" role="presentation"><div id="cke_dialog_title_{id}" class="cke_dialog_title" role="presentation"></div><a id="cke_dialog_close_button_{id}" class="cke_dialog_close_button" href="javascript:void(0)" title="{closeTitle}" role="button"><span class="cke_label">X</span></a><div id="cke_dialog_tabs_{id}" class="cke_dialog_tabs" role="tablist"></div><table class="cke_dialog_contents" role="presentation"><tr><td id="cke_dialog_contents_{id}" class="cke_dialog_contents_body" role="presentation"></td></tr><tr><td id="cke_dialog_footer_{id}" class="cke_dialog_footer" role="presentation"></td></tr></table></div></td></tr></table></div>';
CKEDITOR.dialog=function(a,b){function c(){var a=l._.focusList;a.sort(function(a,b){return a.tabIndex!=b.tabIndex?b.tabIndex-a.tabIndex:a.focusIndex-b.focusIndex});for(var b=a.length,c=0;c<b;c++)a[c].focusIndex=c}function e(a){var b=l._.focusList,a=a||0;if(!(1>b.length)){var c=l._.currentFocusIndex;try{b[c].getInputElement().$.blur()}catch(f){}for(var d=c=(c+a+b.length)%b.length;a&&!b[d].isFocusable()&&!(d=(d+a+b.length)%b.length,d==c););b[d].focus();"text"==b[d].type&&b[d].select()}}function d(b){if(l==
CKEDITOR.dialog._.currentTop){var c=b.data.getKeystroke(),d="rtl"==a.lang.dir;o=j=0;if(9==c||c==CKEDITOR.SHIFT+9)c=c==CKEDITOR.SHIFT+9,l._.tabBarMode?(c=c?t.call(l):u.call(l),l.selectPage(c),l._.tabs[c][0].focus()):e(c?-1:1),o=1;else if(c==CKEDITOR.ALT+121&&!l._.tabBarMode&&1<l.getPageCount())l._.tabBarMode=!0,l._.tabs[l._.currentTabId][0].focus(),o=1;else if((37==c||39==c)&&l._.tabBarMode)c=c==(d?39:37)?t.call(l):u.call(l),l.selectPage(c),l._.tabs[c][0].focus(),o=1;else if((13==c||32==c)&&l._.tabBarMode)this.selectPage(this._.currentTabId),
this._.tabBarMode=!1,this._.currentFocusIndex=-1,e(1),o=1;else if(13==c){c=b.data.getTarget();if(!c.is("a","button","select","textarea")&&(!c.is("input")||"button"!=c.$.type))(c=this.getButton("ok"))&&CKEDITOR.tools.setTimeout(c.click,0,c),o=1;j=1}else if(27==c)(c=this.getButton("cancel"))?CKEDITOR.tools.setTimeout(c.click,0,c):!1!==this.fire("cancel",{hide:!0}).hide&&this.hide(),j=1;else return;g(b)}}function g(a){o?a.data.preventDefault(1):j&&a.data.stopPropagation()}var f=CKEDITOR.dialog._.dialogDefinitions[b],
h=CKEDITOR.tools.clone(W),m=a.config.dialog_buttonsOrder||"OS",k=a.lang.dir,i={},o,j;("OS"==m&&CKEDITOR.env.mac||"rtl"==m&&"ltr"==k||"ltr"==m&&"rtl"==k)&&h.buttons.reverse();f=CKEDITOR.tools.extend(f(a),h);f=CKEDITOR.tools.clone(f);f=new L(this,f);h=R(a);this._={editor:a,element:h.element,name:b,contentSize:{width:0,height:0},size:{width:0,height:0},contents:{},buttons:{},accessKeyMap:{},tabs:{},tabIdList:[],currentTabId:null,currentTabIndex:null,pageCount:0,lastTab:null,tabBarMode:!1,focusList:[],
currentFocusIndex:0,hasFocus:!1};this.parts=h.parts;CKEDITOR.tools.setTimeout(function(){a.fire("ariaWidget",this.parts.contents)},0,this);h={position:CKEDITOR.env.ie6Compat?"absolute":"fixed",top:0,visibility:"hidden"};h["rtl"==k?"right":"left"]=0;this.parts.dialog.setStyles(h);CKEDITOR.event.call(this);this.definition=f=CKEDITOR.fire("dialogDefinition",{name:b,definition:f},a).definition;if(!("removeDialogTabs"in a._)&&a.config.removeDialogTabs){h=a.config.removeDialogTabs.split(";");for(k=0;k<
h.length;k++)if(m=h[k].split(":"),2==m.length){var n=m[0];i[n]||(i[n]=[]);i[n].push(m[1])}a._.removeDialogTabs=i}if(a._.removeDialogTabs&&(i=a._.removeDialogTabs[b]))for(k=0;k<i.length;k++)f.removeContents(i[k]);if(f.onLoad)this.on("load",f.onLoad);if(f.onShow)this.on("show",f.onShow);if(f.onHide)this.on("hide",f.onHide);if(f.onOk)this.on("ok",function(b){a.fire("saveSnapshot");setTimeout(function(){a.fire("saveSnapshot")},0);!1===f.onOk.call(this,b)&&(b.data.hide=!1)});if(f.onCancel)this.on("cancel",
function(a){!1===f.onCancel.call(this,a)&&(a.data.hide=!1)});var l=this,p=function(a){var b=l._.contents,c=!1,d;for(d in b)for(var f in b[d])if(c=a.call(this,b[d][f]))return};this.on("ok",function(a){p(function(b){if(b.validate){var c=b.validate(this),d="string"==typeof c||!1===c;d&&(a.data.hide=!1,a.stop());P.call(b,!d,"string"==typeof c?c:void 0);return d}})},this,null,0);this.on("cancel",function(b){p(function(c){if(c.isChanged())return!a.config.dialog_noConfirmCancel&&!confirm(a.lang.common.confirmCancel)&&
(b.data.hide=!1),!0})},this,null,0);this.parts.close.on("click",function(a){!1!==this.fire("cancel",{hide:!0}).hide&&this.hide();a.data.preventDefault()},this);this.changeFocus=e;var v=this._.element;a.focusManager.add(v,1);this.on("show",function(){v.on("keydown",d,this);if(CKEDITOR.env.gecko)v.on("keypress",g,this)});this.on("hide",function(){v.removeListener("keydown",d);CKEDITOR.env.gecko&&v.removeListener("keypress",g);p(function(a){Q.apply(a)})});this.on("iframeAdded",function(a){(new CKEDITOR.dom.document(a.data.iframe.$.contentWindow.document)).on("keydown",
d,this,null,0)});this.on("show",function(){c();if(a.config.dialog_startupFocusTab&&1<l._.pageCount)l._.tabBarMode=!0,l._.tabs[l._.currentTabId][0].focus();else if(!this._.hasFocus)if(this._.currentFocusIndex=-1,f.onFocus){var b=f.onFocus.call(this);b&&b.focus()}else e(1)},this,null,4294967295);if(CKEDITOR.env.ie6Compat)this.on("load",function(){var a=this.getElement(),b=a.getFirst();b.remove();b.appendTo(a)},this);U(this);V(this);(new CKEDITOR.dom.text(f.title,CKEDITOR.document)).appendTo(this.parts.title);
for(k=0;k<f.contents.length;k++)(i=f.contents[k])&&this.addPage(i);this.parts.tabs.on("click",function(a){var b=a.data.getTarget();b.hasClass("cke_dialog_tab")&&(b=b.$.id,this.selectPage(b.substring(4,b.lastIndexOf("_"))),this._.tabBarMode&&(this._.tabBarMode=!1,this._.currentFocusIndex=-1,e(1)),a.data.preventDefault())},this);k=[];i=CKEDITOR.dialog._.uiElementBuilders.hbox.build(this,{type:"hbox",className:"cke_dialog_footer_buttons",widths:[],children:f.buttons},k).getChild();this.parts.footer.setHtml(k.join(""));
for(k=0;k<i.length;k++)this._.buttons[i[k].id]=i[k]};CKEDITOR.dialog.prototype={destroy:function(){this.hide();this._.element.remove()},resize:function(){return function(a,b){if(!this._.contentSize||!(this._.contentSize.width==a&&this._.contentSize.height==b))CKEDITOR.dialog.fire("resize",{dialog:this,width:a,height:b},this._.editor),this.fire("resize",{width:a,height:b},this._.editor),this.parts.contents.setStyles({width:a+"px",height:b+"px"}),"rtl"==this._.editor.lang.dir&&this._.position&&(this._.position.x=
CKEDITOR.document.getWindow().getViewPaneSize().width-this._.contentSize.width-parseInt(this._.element.getFirst().getStyle("right"),10)),this._.contentSize={width:a,height:b}}}(),getSize:function(){var a=this._.element.getFirst();return{width:a.$.offsetWidth||0,height:a.$.offsetHeight||0}},move:function(a,b,c){var e=this._.element.getFirst(),d="rtl"==this._.editor.lang.dir,g="fixed"==e.getComputedStyle("position");CKEDITOR.env.ie&&e.setStyle("zoom","100%");if(!g||!this._.position||!(this._.position.x==
a&&this._.position.y==b))this._.position={x:a,y:b},g||(g=CKEDITOR.document.getWindow().getScrollPosition(),a+=g.x,b+=g.y),d&&(g=this.getSize(),a=CKEDITOR.document.getWindow().getViewPaneSize().width-g.width-a),b={top:(0<b?b:0)+"px"},b[d?"right":"left"]=(0<a?a:0)+"px",e.setStyles(b),c&&(this._.moved=1)},getPosition:function(){return CKEDITOR.tools.extend({},this._.position)},show:function(){var a=this._.element,b=this.definition;!a.getParent()||!a.getParent().equals(CKEDITOR.document.getBody())?a.appendTo(CKEDITOR.document.getBody()):
a.setStyle("display","block");this.resize(this._.contentSize&&this._.contentSize.width||b.width||b.minWidth,this._.contentSize&&this._.contentSize.height||b.height||b.minHeight);this.reset();this.selectPage(this.definition.contents[0].id);null===CKEDITOR.dialog._.currentZIndex&&(CKEDITOR.dialog._.currentZIndex=this._.editor.config.baseFloatZIndex);this._.element.getFirst().setStyle("z-index",CKEDITOR.dialog._.currentZIndex+=10);null===CKEDITOR.dialog._.currentTop?(CKEDITOR.dialog._.currentTop=this,
this._.parentDialog=null,J(this._.editor)):(this._.parentDialog=CKEDITOR.dialog._.currentTop,this._.parentDialog.getElement().getFirst().$.style.zIndex-=Math.floor(this._.editor.config.baseFloatZIndex/2),CKEDITOR.dialog._.currentTop=this);a.on("keydown",M);a.on("keyup",N);this._.hasFocus=!1;for(var c in b.contents)if(b.contents[c]){var a=b.contents[c],e=this._.tabs[a.id],d=a.requiredContent,g=0;if(e){for(var f in this._.contents[a.id]){var h=this._.contents[a.id][f];"hbox"==h.type||("vbox"==h.type||
!h.getInputElement())||(h.requiredContent&&!this._.editor.activeFilter.check(h.requiredContent)?h.disable():(h.enable(),g++))}!g||d&&!this._.editor.activeFilter.check(d)?e[0].addClass("cke_dialog_tab_disabled"):e[0].removeClass("cke_dialog_tab_disabled")}}CKEDITOR.tools.setTimeout(function(){this.layout();T(this);this.parts.dialog.setStyle("visibility","");this.fireOnce("load",{});CKEDITOR.ui.fire("ready",this);this.fire("show",{});this._.editor.fire("dialogShow",this);this._.parentDialog||this._.editor.focusManager.lock();
this.foreach(function(a){a.setInitValue&&a.setInitValue()})},100,this)},layout:function(){var a=this.parts.dialog,b=this.getSize(),c=CKEDITOR.document.getWindow().getViewPaneSize(),e=(c.width-b.width)/2,d=(c.height-b.height)/2;CKEDITOR.env.ie6Compat||(b.height+(0<d?d:0)>c.height||b.width+(0<e?e:0)>c.width?a.setStyle("position","absolute"):a.setStyle("position","fixed"));this.move(this._.moved?this._.position.x:e,this._.moved?this._.position.y:d)},foreach:function(a){for(var b in this._.contents)for(var c in this._.contents[b])a.call(this,
this._.contents[b][c]);return this},reset:function(){var a=function(a){a.reset&&a.reset(1)};return function(){this.foreach(a);return this}}(),setupContent:function(){var a=arguments;this.foreach(function(b){b.setup&&b.setup.apply(b,a)})},commitContent:function(){var a=arguments;this.foreach(function(b){CKEDITOR.env.ie&&this._.currentFocusIndex==b.focusIndex&&b.getInputElement().$.blur();b.commit&&b.commit.apply(b,a)})},hide:function(){if(this.parts.dialog.isVisible()){this.fire("hide",{});this._.editor.fire("dialogHide",
this);this.selectPage(this._.tabIdList[0]);var a=this._.element;a.setStyle("display","none");this.parts.dialog.setStyle("visibility","hidden");for(X(this);CKEDITOR.dialog._.currentTop!=this;)CKEDITOR.dialog._.currentTop.hide();if(this._.parentDialog){var b=this._.parentDialog.getElement().getFirst();b.setStyle("z-index",parseInt(b.$.style.zIndex,10)+Math.floor(this._.editor.config.baseFloatZIndex/2))}else K(this._.editor);if(CKEDITOR.dialog._.currentTop=this._.parentDialog)CKEDITOR.dialog._.currentZIndex-=
10;else{CKEDITOR.dialog._.currentZIndex=null;a.removeListener("keydown",M);a.removeListener("keyup",N);var c=this._.editor;c.focus();setTimeout(function(){c.focusManager.unlock();CKEDITOR.env.iOS&&c.window.focus()},0)}delete this._.parentDialog;this.foreach(function(a){a.resetInitValue&&a.resetInitValue()})}},addPage:function(a){if(!a.requiredContent||this._.editor.filter.check(a.requiredContent)){for(var b=[],c=a.label?' title="'+CKEDITOR.tools.htmlEncode(a.label)+'"':"",e=CKEDITOR.dialog._.uiElementBuilders.vbox.build(this,
{type:"vbox",className:"cke_dialog_page_contents",children:a.elements,expand:!!a.expand,padding:a.padding,style:a.style||"width: 100%;"},b),d=this._.contents[a.id]={},g=e.getChild(),f=0;e=g.shift();)!e.notAllowed&&("hbox"!=e.type&&"vbox"!=e.type)&&f++,d[e.id]=e,"function"==typeof e.getChild&&g.push.apply(g,e.getChild());f||(a.hidden=!0);b=CKEDITOR.dom.element.createFromHtml(b.join(""));b.setAttribute("role","tabpanel");e=CKEDITOR.env;d="cke_"+a.id+"_"+CKEDITOR.tools.getNextNumber();c=CKEDITOR.dom.element.createFromHtml(['<a class="cke_dialog_tab"',
0<this._.pageCount?" cke_last":"cke_first",c,a.hidden?' style="display:none"':"",' id="',d,'"',e.gecko&&!e.hc?"":' href="javascript:void(0)"',' tabIndex="-1" hidefocus="true" role="tab">',a.label,"</a>"].join(""));b.setAttribute("aria-labelledby",d);this._.tabs[a.id]=[c,b];this._.tabIdList.push(a.id);!a.hidden&&this._.pageCount++;this._.lastTab=c;this.updateStyle();b.setAttribute("name",a.id);b.appendTo(this.parts.contents);c.unselectable();this.parts.tabs.append(c);a.accessKey&&(O(this,this,"CTRL+"+
a.accessKey,Y,Z),this._.accessKeyMap["CTRL+"+a.accessKey]=a.id)}},selectPage:function(a){if(this._.currentTabId!=a&&!this._.tabs[a][0].hasClass("cke_dialog_tab_disabled")&&!1!==this.fire("selectPage",{page:a,currentPage:this._.currentTabId})){for(var b in this._.tabs){var c=this._.tabs[b][0],e=this._.tabs[b][1];b!=a&&(c.removeClass("cke_dialog_tab_selected"),e.hide());e.setAttribute("aria-hidden",b!=a)}var d=this._.tabs[a];d[0].addClass("cke_dialog_tab_selected");CKEDITOR.env.ie6Compat||CKEDITOR.env.ie7Compat?
(G(d[1]),d[1].show(),setTimeout(function(){G(d[1],1)},0)):d[1].show();this._.currentTabId=a;this._.currentTabIndex=CKEDITOR.tools.indexOf(this._.tabIdList,a)}},updateStyle:function(){this.parts.dialog[(1===this._.pageCount?"add":"remove")+"Class"]("cke_single_page")},hidePage:function(a){var b=this._.tabs[a]&&this._.tabs[a][0];b&&(1!=this._.pageCount&&b.isVisible())&&(a==this._.currentTabId&&this.selectPage(t.call(this)),b.hide(),this._.pageCount--,this.updateStyle())},showPage:function(a){if(a=this._.tabs[a]&&
this._.tabs[a][0])a.show(),this._.pageCount++,this.updateStyle()},getElement:function(){return this._.element},getName:function(){return this._.name},getContentElement:function(a,b){var c=this._.contents[a];return c&&c[b]},getValueOf:function(a,b){return this.getContentElement(a,b).getValue()},setValueOf:function(a,b,c){return this.getContentElement(a,b).setValue(c)},getButton:function(a){return this._.buttons[a]},click:function(a){return this._.buttons[a].click()},disableButton:function(a){return this._.buttons[a].disable()},
enableButton:function(a){return this._.buttons[a].enable()},getPageCount:function(){return this._.pageCount},getParentEditor:function(){return this._.editor},getSelectedElement:function(){return this.getParentEditor().getSelection().getSelectedElement()},addFocusable:function(a,b){if("undefined"==typeof b)b=this._.focusList.length,this._.focusList.push(new H(this,a,b));else{this._.focusList.splice(b,0,new H(this,a,b));for(var c=b+1;c<this._.focusList.length;c++)this._.focusList[c].focusIndex++}}};
CKEDITOR.tools.extend(CKEDITOR.dialog,{add:function(a,b){if(!this._.dialogDefinitions[a]||"function"==typeof b)this._.dialogDefinitions[a]=b},exists:function(a){return!!this._.dialogDefinitions[a]},getCurrent:function(){return CKEDITOR.dialog._.currentTop},isTabEnabled:function(a,b,c){a=a.config.removeDialogTabs;return!(a&&a.match(RegExp("(?:^|;)"+b+":"+c+"(?:$|;)","i")))},okButton:function(){var a=function(a,c){c=c||{};return CKEDITOR.tools.extend({id:"ok",type:"button",label:a.lang.common.ok,"class":"cke_dialog_ui_button_ok",
onClick:function(a){a=a.data.dialog;!1!==a.fire("ok",{hide:!0}).hide&&a.hide()}},c,!0)};a.type="button";a.override=function(b){return CKEDITOR.tools.extend(function(c){return a(c,b)},{type:"button"},!0)};return a}(),cancelButton:function(){var a=function(a,c){c=c||{};return CKEDITOR.tools.extend({id:"cancel",type:"button",label:a.lang.common.cancel,"class":"cke_dialog_ui_button_cancel",onClick:function(a){a=a.data.dialog;!1!==a.fire("cancel",{hide:!0}).hide&&a.hide()}},c,!0)};a.type="button";a.override=
function(b){return CKEDITOR.tools.extend(function(c){return a(c,b)},{type:"button"},!0)};return a}(),addUIElement:function(a,b){this._.uiElementBuilders[a]=b}});CKEDITOR.dialog._={uiElementBuilders:{},dialogDefinitions:{},currentTop:null,currentZIndex:null};CKEDITOR.event.implementOn(CKEDITOR.dialog);CKEDITOR.event.implementOn(CKEDITOR.dialog.prototype);var W={resizable:CKEDITOR.DIALOG_RESIZE_BOTH,minWidth:600,minHeight:400,buttons:[CKEDITOR.dialog.okButton,CKEDITOR.dialog.cancelButton]},z=function(a,
b,c){for(var e=0,d;d=a[e];e++)if(d.id==b||c&&d[c]&&(d=z(d[c],b,c)))return d;return null},A=function(a,b,c,e,d){if(c){for(var g=0,f;f=a[g];g++){if(f.id==c)return a.splice(g,0,b),b;if(e&&f[e]&&(f=A(f[e],b,c,e,!0)))return f}if(d)return null}a.push(b);return b},B=function(a,b,c){for(var e=0,d;d=a[e];e++){if(d.id==b)return a.splice(e,1);if(c&&d[c]&&(d=B(d[c],b,c)))return d}return null},L=function(a,b){this.dialog=a;for(var c=b.contents,e=0,d;d=c[e];e++)c[e]=d&&new I(a,d);CKEDITOR.tools.extend(this,b)};
L.prototype={getContents:function(a){return z(this.contents,a)},getButton:function(a){return z(this.buttons,a)},addContents:function(a,b){return A(this.contents,a,b)},addButton:function(a,b){return A(this.buttons,a,b)},removeContents:function(a){B(this.contents,a)},removeButton:function(a){B(this.buttons,a)}};I.prototype={get:function(a){return z(this.elements,a,"children")},add:function(a,b){return A(this.elements,a,b,"children")},remove:function(a){B(this.elements,a,"children")}};var F,w={},q,s=
{},M=function(a){var b=a.data.$.ctrlKey||a.data.$.metaKey,c=a.data.$.altKey,e=a.data.$.shiftKey,d=String.fromCharCode(a.data.$.keyCode);if((b=s[(b?"CTRL+":"")+(c?"ALT+":"")+(e?"SHIFT+":"")+d])&&b.length)b=b[b.length-1],b.keydown&&b.keydown.call(b.uiElement,b.dialog,b.key),a.data.preventDefault()},N=function(a){var b=a.data.$.ctrlKey||a.data.$.metaKey,c=a.data.$.altKey,e=a.data.$.shiftKey,d=String.fromCharCode(a.data.$.keyCode);if((b=s[(b?"CTRL+":"")+(c?"ALT+":"")+(e?"SHIFT+":"")+d])&&b.length)b=b[b.length-
1],b.keyup&&(b.keyup.call(b.uiElement,b.dialog,b.key),a.data.preventDefault())},O=function(a,b,c,e,d){(s[c]||(s[c]=[])).push({uiElement:a,dialog:b,key:c,keyup:d||a.accessKeyUp,keydown:e||a.accessKeyDown})},X=function(a){for(var b in s){for(var c=s[b],e=c.length-1;0<=e;e--)(c[e].dialog==a||c[e].uiElement==a)&&c.splice(e,1);0===c.length&&delete s[b]}},Z=function(a,b){a._.accessKeyMap[b]&&a.selectPage(a._.accessKeyMap[b])},Y=function(){};(function(){CKEDITOR.ui.dialog={uiElement:function(a,b,c,e,d,g,
f){if(!(4>arguments.length)){var h=(e.call?e(b):e)||"div",m=["<",h," "],k=(d&&d.call?d(b):d)||{},i=(g&&g.call?g(b):g)||{},o=(f&&f.call?f.call(this,a,b):f)||"",j=this.domId=i.id||CKEDITOR.tools.getNextId()+"_uiElement";b.requiredContent&&!a.getParentEditor().filter.check(b.requiredContent)&&(k.display="none",this.notAllowed=!0);i.id=j;var n={};b.type&&(n["cke_dialog_ui_"+b.type]=1);b.className&&(n[b.className]=1);b.disabled&&(n.cke_disabled=1);for(var l=i["class"]&&i["class"].split?i["class"].split(" "):
[],j=0;j<l.length;j++)l[j]&&(n[l[j]]=1);l=[];for(j in n)l.push(j);i["class"]=l.join(" ");b.title&&(i.title=b.title);n=(b.style||"").split(";");b.align&&(l=b.align,k["margin-left"]="left"==l?0:"auto",k["margin-right"]="right"==l?0:"auto");for(j in k)n.push(j+":"+k[j]);b.hidden&&n.push("display:none");for(j=n.length-1;0<=j;j--)""===n[j]&&n.splice(j,1);0<n.length&&(i.style=(i.style?i.style+"; ":"")+n.join("; "));for(j in i)m.push(j+'="'+CKEDITOR.tools.htmlEncode(i[j])+'" ');m.push(">",o,"</",h,">");
c.push(m.join(""));(this._||(this._={})).dialog=a;"boolean"==typeof b.isChanged&&(this.isChanged=function(){return b.isChanged});"function"==typeof b.isChanged&&(this.isChanged=b.isChanged);"function"==typeof b.setValue&&(this.setValue=CKEDITOR.tools.override(this.setValue,function(a){return function(c){a.call(this,b.setValue.call(this,c))}}));"function"==typeof b.getValue&&(this.getValue=CKEDITOR.tools.override(this.getValue,function(a){return function(){return b.getValue.call(this,a.call(this))}}));
CKEDITOR.event.implementOn(this);this.registerEvents(b);this.accessKeyUp&&(this.accessKeyDown&&b.accessKey)&&O(this,a,"CTRL+"+b.accessKey);var p=this;a.on("load",function(){var b=p.getInputElement();if(b){var c=p.type in{checkbox:1,ratio:1}&&CKEDITOR.env.ie&&CKEDITOR.env.version<8?"cke_dialog_ui_focused":"";b.on("focus",function(){a._.tabBarMode=false;a._.hasFocus=true;p.fire("focus");c&&this.addClass(c)});b.on("blur",function(){p.fire("blur");c&&this.removeClass(c)})}});CKEDITOR.tools.extend(this,
b);this.keyboardFocusable&&(this.tabIndex=b.tabIndex||0,this.focusIndex=a._.focusList.push(this)-1,this.on("focus",function(){a._.currentFocusIndex=p.focusIndex}))}},hbox:function(a,b,c,e,d){if(!(4>arguments.length)){this._||(this._={});var g=this._.children=b,f=d&&d.widths||null,h=d&&d.height||null,m,k={role:"presentation"};d&&d.align&&(k.align=d.align);CKEDITOR.ui.dialog.uiElement.call(this,a,d||{type:"hbox"},e,"table",{},k,function(){var a=['<tbody><tr class="cke_dialog_ui_hbox">'];for(m=0;m<c.length;m++){var b=
"cke_dialog_ui_hbox_child",e=[];0===m&&(b="cke_dialog_ui_hbox_first");m==c.length-1&&(b="cke_dialog_ui_hbox_last");a.push('<td class="',b,'" role="presentation" ');f?f[m]&&e.push("width:"+r(f[m])):e.push("width:"+Math.floor(100/c.length)+"%");h&&e.push("height:"+r(h));d&&void 0!==d.padding&&e.push("padding:"+r(d.padding));CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&g[m].align)&&e.push("text-align:"+g[m].align);0<e.length&&a.push('style="'+e.join("; ")+'" ');a.push(">",c[m],"</td>")}a.push("</tr></tbody>");
return a.join("")})}},vbox:function(a,b,c,e,d){if(!(3>arguments.length)){this._||(this._={});var g=this._.children=b,f=d&&d.width||null,h=d&&d.heights||null;CKEDITOR.ui.dialog.uiElement.call(this,a,d||{type:"vbox"},e,"div",null,{role:"presentation"},function(){var b=['<table role="presentation" cellspacing="0" border="0" '];b.push('style="');d&&d.expand&&b.push("height:100%;");b.push("width:"+r(f||"100%"),";");CKEDITOR.env.webkit&&b.push("float:none;");b.push('"');b.push('align="',CKEDITOR.tools.htmlEncode(d&&
d.align||("ltr"==a.getParentEditor().lang.dir?"left":"right")),'" ');b.push("><tbody>");for(var e=0;e<c.length;e++){var i=[];b.push('<tr><td role="presentation" ');f&&i.push("width:"+r(f||"100%"));h?i.push("height:"+r(h[e])):d&&d.expand&&i.push("height:"+Math.floor(100/c.length)+"%");d&&void 0!==d.padding&&i.push("padding:"+r(d.padding));CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&g[e].align)&&i.push("text-align:"+g[e].align);0<i.length&&b.push('style="',i.join("; "),'" ');b.push(' class="cke_dialog_ui_vbox_child">',
c[e],"</td></tr>")}b.push("</tbody></table>");return b.join("")})}}}})();CKEDITOR.ui.dialog.uiElement.prototype={getElement:function(){return CKEDITOR.document.getById(this.domId)},getInputElement:function(){return this.getElement()},getDialog:function(){return this._.dialog},setValue:function(a,b){this.getInputElement().setValue(a);!b&&this.fire("change",{value:a});return this},getValue:function(){return this.getInputElement().getValue()},isChanged:function(){return!1},selectParentTab:function(){for(var a=
this.getInputElement();(a=a.getParent())&&-1==a.$.className.search("cke_dialog_page_contents"););if(!a)return this;a=a.getAttribute("name");this._.dialog._.currentTabId!=a&&this._.dialog.selectPage(a);return this},focus:function(){this.selectParentTab().getInputElement().focus();return this},registerEvents:function(a){var b=/^on([A-Z]\w+)/,c,e=function(a,b,c,d){b.on("load",function(){a.getInputElement().on(c,d,a)})},d;for(d in a)if(c=d.match(b))this.eventProcessors[d]?this.eventProcessors[d].call(this,
this._.dialog,a[d]):e(this,this._.dialog,c[1].toLowerCase(),a[d]);return this},eventProcessors:{onLoad:function(a,b){a.on("load",b,this)},onShow:function(a,b){a.on("show",b,this)},onHide:function(a,b){a.on("hide",b,this)}},accessKeyDown:function(){this.focus()},accessKeyUp:function(){},disable:function(){var a=this.getElement();this.getInputElement().setAttribute("disabled","true");a.addClass("cke_disabled")},enable:function(){var a=this.getElement();this.getInputElement().removeAttribute("disabled");
a.removeClass("cke_disabled")},isEnabled:function(){return!this.getElement().hasClass("cke_disabled")},isVisible:function(){return this.getInputElement().isVisible()},isFocusable:function(){return!this.isEnabled()||!this.isVisible()?!1:!0}};CKEDITOR.ui.dialog.hbox.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{getChild:function(a){if(1>arguments.length)return this._.children.concat();a.splice||(a=[a]);return 2>a.length?this._.children[a[0]]:this._.children[a[0]]&&this._.children[a[0]].getChild?
this._.children[a[0]].getChild(a.slice(1,a.length)):null}},!0);CKEDITOR.ui.dialog.vbox.prototype=new CKEDITOR.ui.dialog.hbox;(function(){var a={build:function(a,c,e){for(var d=c.children,g,f=[],h=[],m=0;m<d.length&&(g=d[m]);m++){var k=[];f.push(k);h.push(CKEDITOR.dialog._.uiElementBuilders[g.type].build(a,g,k))}return new CKEDITOR.ui.dialog[c.type](a,h,f,e,c)}};CKEDITOR.dialog.addUIElement("hbox",a);CKEDITOR.dialog.addUIElement("vbox",a)})();CKEDITOR.dialogCommand=function(a,b){this.dialogName=a;
CKEDITOR.tools.extend(this,b,!0)};CKEDITOR.dialogCommand.prototype={exec:function(a){a.openDialog(this.dialogName)},canUndo:!1,editorFocus:1};(function(){var a=/^([a]|[^a])+$/,b=/^\d*$/,c=/^\d*(?:\.\d+)?$/,e=/^(((\d*(\.\d+))|(\d*))(px|\%)?)?$/,d=/^(((\d*(\.\d+))|(\d*))(px|em|ex|in|cm|mm|pt|pc|\%)?)?$/i,g=/^(\s*[\w-]+\s*:\s*[^:;]+(?:;|$))*$/;CKEDITOR.VALIDATE_OR=1;CKEDITOR.VALIDATE_AND=2;CKEDITOR.dialog.validate={functions:function(){var a=arguments;return function(){var b=this&&this.getValue?this.getValue():
a[0],c,d=CKEDITOR.VALIDATE_AND,e=[],g;for(g=0;g<a.length;g++)if("function"==typeof a[g])e.push(a[g]);else break;g<a.length&&"string"==typeof a[g]&&(c=a[g],g++);g<a.length&&"number"==typeof a[g]&&(d=a[g]);var j=d==CKEDITOR.VALIDATE_AND?!0:!1;for(g=0;g<e.length;g++)j=d==CKEDITOR.VALIDATE_AND?j&&e[g](b):j||e[g](b);return!j?c:!0}},regex:function(a,b){return function(c){c=this&&this.getValue?this.getValue():c;return!a.test(c)?b:!0}},notEmpty:function(b){return this.regex(a,b)},integer:function(a){return this.regex(b,
a)},number:function(a){return this.regex(c,a)},cssLength:function(a){return this.functions(function(a){return d.test(CKEDITOR.tools.trim(a))},a)},htmlLength:function(a){return this.functions(function(a){return e.test(CKEDITOR.tools.trim(a))},a)},inlineStyle:function(a){return this.functions(function(a){return g.test(CKEDITOR.tools.trim(a))},a)},equals:function(a,b){return this.functions(function(b){return b==a},b)},notEqual:function(a,b){return this.functions(function(b){return b!=a},b)}};CKEDITOR.on("instanceDestroyed",
function(a){if(CKEDITOR.tools.isEmpty(CKEDITOR.instances)){for(var b;b=CKEDITOR.dialog._.currentTop;)b.hide();for(var c in w)w[c].remove();w={}}var a=a.editor._.storedDialogs,d;for(d in a)a[d].destroy()})})();CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{openDialog:function(a,b){var c=null,e=CKEDITOR.dialog._.dialogDefinitions[a];null===CKEDITOR.dialog._.currentTop&&J(this);if("function"==typeof e)c=this._.storedDialogs||(this._.storedDialogs={}),c=c[a]||(c[a]=new CKEDITOR.dialog(this,a)),b&&b.call(c,
c),c.show();else{if("failed"==e)throw K(this),Error('[CKEDITOR.dialog.openDialog] Dialog "'+a+'" failed when loading definition.');"string"==typeof e&&CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(e),function(){"function"!=typeof CKEDITOR.dialog._.dialogDefinitions[a]&&(CKEDITOR.dialog._.dialogDefinitions[a]="failed");this.openDialog(a,b)},this,0,1)}CKEDITOR.skin.loadPart("dialog");return c}})})();
CKEDITOR.plugins.add("dialog",{requires:"dialogui",init:function(t){t.on("doubleclick",function(u){u.data.dialog&&t.openDialog(u.data.dialog)},null,null,999)}});(function(){function v(b){function a(){var e=b.editable();e.on(p,function(b){(!CKEDITOR.env.ie||!n)&&u(b)});CKEDITOR.env.ie&&e.on("paste",function(e){q||(g(),e.data.preventDefault(),u(e),h("paste")||b.openDialog("paste"))});CKEDITOR.env.ie&&(e.on("contextmenu",i,null,null,0),e.on("beforepaste",function(b){b.data&&(!b.data.$.ctrlKey&&!b.data.$.shiftKey)&&i()},null,null,0));e.on("beforecut",function(){!n&&j(b)});var a;e.attachListener(CKEDITOR.env.ie?e:b.document.getDocumentElement(),"mouseup",function(){a=
setTimeout(function(){r()},0)});b.on("destroy",function(){clearTimeout(a)});e.on("keyup",r)}function c(e){return{type:e,canUndo:"cut"==e,startDisabled:!0,exec:function(){"cut"==this.type&&j();var e;var a=this.type;if(CKEDITOR.env.ie)e=h(a);else try{e=b.document.$.execCommand(a,!1,null)}catch(d){e=!1}e||alert(b.lang.clipboard[this.type+"Error"]);return e}}}function d(){return{canUndo:!1,async:!0,exec:function(b,a){var d=function(a,d){a&&f(a.type,a.dataValue,!!d);b.fire("afterCommandExec",{name:"paste",
command:c,returnValue:!!a})},c=this;"string"==typeof a?d({type:"auto",dataValue:a},1):b.getClipboardData(d)}}}function g(){q=1;setTimeout(function(){q=0},100)}function i(){n=1;setTimeout(function(){n=0},10)}function h(e){var a=b.document,d=a.getBody(),c=!1,j=function(){c=!0};d.on(e,j);(7<CKEDITOR.env.version?a.$:a.$.selection.createRange()).execCommand(e);d.removeListener(e,j);return c}function f(e,a,d){e={type:e};if(d&&!1===b.fire("beforePaste",e)||!a)return!1;e.dataValue=a;return b.fire("paste",
e)}function j(){if(CKEDITOR.env.ie&&!CKEDITOR.env.quirks){var e=b.getSelection(),a,d,c;if(e.getType()==CKEDITOR.SELECTION_ELEMENT&&(a=e.getSelectedElement()))d=e.getRanges()[0],c=b.document.createText(""),c.insertBefore(a),d.setStartBefore(c),d.setEndAfter(a),e.selectRanges([d]),setTimeout(function(){a.getParent()&&(c.remove(),e.selectElement(a))},0)}}function l(a,d){var c=b.document,j=b.editable(),l=function(b){b.cancel()},g;if(!c.getById("cke_pastebin")){var i=b.getSelection(),s=i.createBookmarks();
CKEDITOR.env.ie&&i.root.fire("selectionchange");var k=new CKEDITOR.dom.element((CKEDITOR.env.webkit||j.is("body"))&&!CKEDITOR.env.ie?"body":"div",c);k.setAttributes({id:"cke_pastebin","data-cke-temp":"1"});var f=0,c=c.getWindow();CKEDITOR.env.webkit?(j.append(k),k.addClass("cke_editable"),j.is("body")||(f="static"!=j.getComputedStyle("position")?j:CKEDITOR.dom.element.get(j.$.offsetParent),f=f.getDocumentPosition().y)):j.getAscendant(CKEDITOR.env.ie?"body":"html",1).append(k);k.setStyles({position:"absolute",
top:c.getScrollPosition().y-f+10+"px",width:"1px",height:Math.max(1,c.getViewPaneSize().height-20)+"px",overflow:"hidden",margin:0,padding:0});CKEDITOR.env.safari&&k.setStyles(CKEDITOR.tools.cssVendorPrefix("user-select","text"));(f=k.getParent().isReadOnly())?(k.setOpacity(0),k.setAttribute("contenteditable",!0)):k.setStyle("ltr"==b.config.contentsLangDirection?"left":"right","-1000px");b.on("selectionChange",l,null,null,0);if(CKEDITOR.env.webkit||CKEDITOR.env.gecko)g=j.once("blur",l,null,null,-100);
f&&k.focus();f=new CKEDITOR.dom.range(k);f.selectNodeContents(k);var h=f.select();CKEDITOR.env.ie&&(g=j.once("blur",function(){b.lockSelection(h)}));var m=CKEDITOR.document.getWindow().getScrollPosition().y;setTimeout(function(){if(CKEDITOR.env.webkit)CKEDITOR.document.getBody().$.scrollTop=m;g&&g.removeListener();CKEDITOR.env.ie&&j.focus();i.selectBookmarks(s);k.remove();var a;if(CKEDITOR.env.webkit&&(a=k.getFirst())&&a.is&&a.hasClass("Apple-style-span"))k=a;b.removeListener("selectionChange",l);
d(k.getHtml())},0)}}function s(){if(CKEDITOR.env.ie){b.focus();g();var a=b.focusManager;a.lock();if(b.editable().fire(p)&&!h("paste"))return a.unlock(),!1;a.unlock()}else try{if(b.editable().fire(p)&&!b.document.$.execCommand("Paste",!1,null))throw 0;}catch(d){return!1}return!0}function o(a){if("wysiwyg"==b.mode)switch(a.data.keyCode){case CKEDITOR.CTRL+86:case CKEDITOR.SHIFT+45:a=b.editable();g();!CKEDITOR.env.ie&&a.fire("beforepaste");break;case CKEDITOR.CTRL+88:case CKEDITOR.SHIFT+46:b.fire("saveSnapshot"),
setTimeout(function(){b.fire("saveSnapshot")},50)}}function u(a){var d={type:"auto"},c=b.fire("beforePaste",d);l(a,function(b){b=b.replace(/<span[^>]+data-cke-bookmark[^<]*?<\/span>/ig,"");c&&f(d.type,b,0,1)})}function r(){if("wysiwyg"==b.mode){var a=m("paste");b.getCommand("cut").setState(m("cut"));b.getCommand("copy").setState(m("copy"));b.getCommand("paste").setState(a);b.fire("pasteState",a)}}function m(a){if(t&&a in{paste:1,cut:1})return CKEDITOR.TRISTATE_DISABLED;if("paste"==a)return CKEDITOR.TRISTATE_OFF;
var a=b.getSelection(),d=a.getRanges();return a.getType()==CKEDITOR.SELECTION_NONE||1==d.length&&d[0].collapsed?CKEDITOR.TRISTATE_DISABLED:CKEDITOR.TRISTATE_OFF}var n=0,q=0,t=0,p=CKEDITOR.env.ie?"beforepaste":"paste";(function(){b.on("key",o);b.on("contentDom",a);b.on("selectionChange",function(b){t=b.data.selection.getRanges()[0].checkReadOnly();r()});b.contextMenu&&b.contextMenu.addListener(function(b,a){t=a.getRanges()[0].checkReadOnly();return{cut:m("cut"),copy:m("copy"),paste:m("paste")}})})();
(function(){function a(d,c,j,e,l){var g=b.lang.clipboard[c];b.addCommand(c,j);b.ui.addButton&&b.ui.addButton(d,{label:g,command:c,toolbar:"clipboard,"+e});b.addMenuItems&&b.addMenuItem(c,{label:g,command:c,group:"clipboard",order:l})}a("Cut","cut",c("cut"),10,1);a("Copy","copy",c("copy"),20,4);a("Paste","paste",d(),30,8)})();b.getClipboardData=function(a,d){function c(a){a.removeListener();a.cancel();d(a.data)}function j(a){a.removeListener();a.cancel();i=!0;d({type:f,dataValue:a.data})}function l(){this.customTitle=
a&&a.title}var g=!1,f="auto",i=!1;d||(d=a,a=null);b.on("paste",c,null,null,0);b.on("beforePaste",function(a){a.removeListener();g=true;f=a.data.type},null,null,1E3);!1===s()&&(b.removeListener("paste",c),g&&b.fire("pasteDialog",l)?(b.on("pasteDialogCommit",j),b.on("dialogHide",function(a){a.removeListener();a.data.removeListener("pasteDialogCommit",j);setTimeout(function(){i||d(null)},10)})):d(null))}}function w(b){if(CKEDITOR.env.webkit){if(!b.match(/^[^<]*$/g)&&!b.match(/^(<div><br( ?\/)?><\/div>|<div>[^<]*<\/div>)*$/gi))return"html"}else if(CKEDITOR.env.ie){if(!b.match(/^([^<]|<br( ?\/)?>)*$/gi)&&
!b.match(/^(<p>([^<]|<br( ?\/)?>)*<\/p>|(\r\n))*$/gi))return"html"}else if(CKEDITOR.env.gecko){if(!b.match(/^([^<]|<br( ?\/)?>)*$/gi))return"html"}else return"html";return"htmlifiedtext"}function x(b,a){function c(a){return CKEDITOR.tools.repeat("</p><p>",~~(a/2))+(1==a%2?"<br>":"")}a=a.replace(/\s+/g," ").replace(/> +</g,"><").replace(/<br ?\/>/gi,"<br>");a=a.replace(/<\/?[A-Z]+>/g,function(a){return a.toLowerCase()});if(a.match(/^[^<]$/))return a;CKEDITOR.env.webkit&&-1<a.indexOf("<div>")&&(a=a.replace(/^(<div>(<br>|)<\/div>)(?!$|(<div>(<br>|)<\/div>))/g,
"<br>").replace(/^(<div>(<br>|)<\/div>){2}(?!$)/g,"<div></div>"),a.match(/<div>(<br>|)<\/div>/)&&(a="<p>"+a.replace(/(<div>(<br>|)<\/div>)+/g,function(a){return c(a.split("</div><div>").length+1)})+"</p>"),a=a.replace(/<\/div><div>/g,"<br>"),a=a.replace(/<\/?div>/g,""));CKEDITOR.env.gecko&&b.enterMode!=CKEDITOR.ENTER_BR&&(CKEDITOR.env.gecko&&(a=a.replace(/^<br><br>$/,"<br>")),-1<a.indexOf("<br><br>")&&(a="<p>"+a.replace(/(<br>){2,}/g,function(a){return c(a.length/4)})+"</p>"));return o(b,a)}function y(){var b=
new CKEDITOR.htmlParser.filter,a={blockquote:1,dl:1,fieldset:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,ol:1,p:1,table:1,ul:1},c=CKEDITOR.tools.extend({br:0},CKEDITOR.dtd.$inline),d={p:1,br:1,"cke:br":1},g=CKEDITOR.dtd,i=CKEDITOR.tools.extend({area:1,basefont:1,embed:1,iframe:1,map:1,object:1,param:1},CKEDITOR.dtd.$nonBodyContent,CKEDITOR.dtd.$cdata),h=function(a){delete a.name;a.add(new CKEDITOR.htmlParser.text(" "))},f=function(a){for(var b=a,c;(b=b.next)&&b.name&&b.name.match(/^h\d$/);){c=new CKEDITOR.htmlParser.element("cke:br");
c.isEmpty=!0;for(a.add(c);c=b.children.shift();)a.add(c)}};b.addRules({elements:{h1:f,h2:f,h3:f,h4:f,h5:f,h6:f,img:function(a){var a=CKEDITOR.tools.trim(a.attributes.alt||""),b=" ";a&&!a.match(/(^http|\.(jpe?g|gif|png))/i)&&(b=" ["+a+"] ");return new CKEDITOR.htmlParser.text(b)},td:h,th:h,$:function(b){var f=b.name,h;if(i[f])return!1;b.attributes={};if("br"==f)return b;if(a[f])b.name="p";else if(c[f])delete b.name;else if(g[f]){h=new CKEDITOR.htmlParser.element("cke:br");h.isEmpty=!0;if(CKEDITOR.dtd.$empty[f])return h;
b.add(h,0);h=h.clone();h.isEmpty=!0;b.add(h);delete b.name}d[b.name]||delete b.name;return b}}},{applyToAll:!0});return b}function z(b,a,c){var a=new CKEDITOR.htmlParser.fragment.fromHtml(a),d=new CKEDITOR.htmlParser.basicWriter;a.writeHtml(d,c);var a=d.getHtml(),a=a.replace(/\s*(<\/?[a-z:]+ ?\/?>)\s*/g,"$1").replace(/(<cke:br \/>){2,}/g,"<cke:br />").replace(/(<cke:br \/>)(<\/?p>|<br \/>)/g,"$2").replace(/(<\/?p>|<br \/>)(<cke:br \/>)/g,"$1").replace(/<(cke:)?br( \/)?>/g,"<br>").replace(/<p><\/p>/g,
""),g=0,a=a.replace(/<\/?p>/g,function(a){if("<p>"==a){if(1<++g)return"</p><p>"}else if(0<--g)return"</p><p>";return a}).replace(/<p><\/p>/g,"");return o(b,a)}function o(b,a){b.enterMode==CKEDITOR.ENTER_BR?a=a.replace(/(<\/p><p>)+/g,function(a){return CKEDITOR.tools.repeat("<br>",2*(a.length/7))}).replace(/<\/?p>/g,""):b.enterMode==CKEDITOR.ENTER_DIV&&(a=a.replace(/<(\/)?p>/g,"<$1div>"));return a}CKEDITOR.plugins.add("clipboard",{requires:"dialog",init:function(b){var a;v(b);CKEDITOR.dialog.add("paste",
CKEDITOR.getUrl(this.path+"dialogs/paste.js"));b.on("paste",function(a){var b=a.data.dataValue,g=CKEDITOR.dtd.$block;-1<b.indexOf("Apple-")&&(b=b.replace(/<span class="Apple-converted-space">&nbsp;<\/span>/gi," "),"html"!=a.data.type&&(b=b.replace(/<span class="Apple-tab-span"[^>]*>([^<]*)<\/span>/gi,function(a,b){return b.replace(/\t/g,"&nbsp;&nbsp; &nbsp;")})),-1<b.indexOf('<br class="Apple-interchange-newline">')&&(a.data.startsWithEOL=1,a.data.preSniffing="html",b=b.replace(/<br class="Apple-interchange-newline">/,
"")),b=b.replace(/(<[^>]+) class="Apple-[^"]*"/gi,"$1"));if(b.match(/^<[^<]+cke_(editable|contents)/i)){var i,h,f=new CKEDITOR.dom.element("div");for(f.setHtml(b);1==f.getChildCount()&&(i=f.getFirst())&&i.type==CKEDITOR.NODE_ELEMENT&&(i.hasClass("cke_editable")||i.hasClass("cke_contents"));)f=h=i;h&&(b=h.getHtml().replace(/<br>$/i,""))}CKEDITOR.env.ie?b=b.replace(/^&nbsp;(?: |\r\n)?<(\w+)/g,function(b,d){if(d.toLowerCase()in g){a.data.preSniffing="html";return"<"+d}return b}):CKEDITOR.env.webkit?
b=b.replace(/<\/(\w+)><div><br><\/div>$/,function(b,d){if(d in g){a.data.endsWithEOL=1;return"</"+d+">"}return b}):CKEDITOR.env.gecko&&(b=b.replace(/(\s)<br>$/,"$1"));a.data.dataValue=b},null,null,3);b.on("paste",function(c){var c=c.data,d=c.type,g=c.dataValue,i,h=b.config.clipboard_defaultContentType||"html";i="html"==d||"html"==c.preSniffing?"html":w(g);"htmlifiedtext"==i?g=x(b.config,g):"text"==d&&"html"==i&&(g=z(b.config,g,a||(a=y(b))));c.startsWithEOL&&(g='<br data-cke-eol="1">'+g);c.endsWithEOL&&
(g+='<br data-cke-eol="1">');"auto"==d&&(d="html"==i||"html"==h?"html":"text");c.type=d;c.dataValue=g;delete c.preSniffing;delete c.startsWithEOL;delete c.endsWithEOL},null,null,6);b.on("paste",function(a){a=a.data;b.insertHtml(a.dataValue,a.type);setTimeout(function(){b.fire("afterPaste")},0)},null,null,1E3);b.on("pasteDialog",function(a){setTimeout(function(){b.openDialog("paste",a.data)},0)})}})})();(function(){var c='<a id="{id}" class="cke_button cke_button__{name} cke_button_{state} {cls}"'+(CKEDITOR.env.gecko&&!CKEDITOR.env.hc?"":" href=\"javascript:void('{titleJs}')\"")+' title="{title}" tabindex="-1" hidefocus="true" role="button" aria-labelledby="{id}_label" aria-haspopup="{hasArrow}" aria-disabled="{ariaDisabled}"';CKEDITOR.env.gecko&&CKEDITOR.env.mac&&(c+=' onkeypress="return false;"');CKEDITOR.env.gecko&&(c+=' onblur="this.style.cssText = this.style.cssText;"');var c=c+(' onkeydown="return CKEDITOR.tools.callFunction({keydownFn},event);" onfocus="return CKEDITOR.tools.callFunction({focusFn},event);" '+
(CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick")+'="CKEDITOR.tools.callFunction({clickFn},this);return false;"><span class="cke_button_icon cke_button__{iconName}_icon" style="{style}"'),c=c+'>&nbsp;</span><span id="{id}_label" class="cke_button_label cke_button__{name}_label" aria-hidden="false">{label}</span>{arrowHtml}</a>',o=CKEDITOR.addTemplate("buttonArrow",'<span class="cke_button_arrow">'+(CKEDITOR.env.hc?"&#9660;":"")+"</span>"),p=CKEDITOR.addTemplate("button",c);CKEDITOR.plugins.add("button",
{beforeInit:function(a){a.ui.addHandler(CKEDITOR.UI_BUTTON,CKEDITOR.ui.button.handler)}});CKEDITOR.UI_BUTTON="button";CKEDITOR.ui.button=function(a){CKEDITOR.tools.extend(this,a,{title:a.label,click:a.click||function(b){b.execCommand(a.command)}});this._={}};CKEDITOR.ui.button.handler={create:function(a){return new CKEDITOR.ui.button(a)}};CKEDITOR.ui.button.prototype={render:function(a,b){function c(){var e=a.mode;e&&(e=this.modes[e]?void 0!==i[e]?i[e]:CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,
e=a.readOnly&&!this.readOnly?CKEDITOR.TRISTATE_DISABLED:e,this.setState(e),this.refresh&&this.refresh())}var j=CKEDITOR.env,k=this._.id=CKEDITOR.tools.getNextId(),f="",g=this.command,l;this._.editor=a;var d={id:k,button:this,editor:a,focus:function(){CKEDITOR.document.getById(k).focus()},execute:function(){this.button.click(a)},attach:function(a){this.button.attach(a)}},q=CKEDITOR.tools.addFunction(function(a){if(d.onkey)return a=new CKEDITOR.dom.event(a),!1!==d.onkey(d,a.getKeystroke())}),r=CKEDITOR.tools.addFunction(function(a){var b;
d.onfocus&&(b=!1!==d.onfocus(d,new CKEDITOR.dom.event(a)));return b}),m=0;d.clickFn=l=CKEDITOR.tools.addFunction(function(){m&&(a.unlockSelection(1),m=0);d.execute();j.iOS&&a.focus()});if(this.modes){var i={};a.on("beforeModeUnload",function(){a.mode&&this._.state!=CKEDITOR.TRISTATE_DISABLED&&(i[a.mode]=this._.state)},this);a.on("activeFilterChange",c,this);a.on("mode",c,this);!this.readOnly&&a.on("readOnly",c,this)}else if(g&&(g=a.getCommand(g)))g.on("state",function(){this.setState(g.state)},this),
f+=g.state==CKEDITOR.TRISTATE_ON?"on":g.state==CKEDITOR.TRISTATE_DISABLED?"disabled":"off";if(this.directional)a.on("contentDirChanged",function(b){var c=CKEDITOR.document.getById(this._.id),d=c.getFirst(),b=b.data;b!=a.lang.dir?c.addClass("cke_"+b):c.removeClass("cke_ltr").removeClass("cke_rtl");d.setAttribute("style",CKEDITOR.skin.getIconStyle(h,"rtl"==b,this.icon,this.iconOffset))},this);g||(f+="off");var n=this.name||this.command,h=n;this.icon&&!/\./.test(this.icon)&&(h=this.icon,this.icon=null);
f={id:k,name:n,iconName:h,label:this.label,cls:this.className||"",state:f,ariaDisabled:"disabled"==f?"true":"false",title:this.title,titleJs:j.gecko&&!j.hc?"":(this.title||"").replace("'",""),hasArrow:this.hasArrow?"true":"false",keydownFn:q,focusFn:r,clickFn:l,style:CKEDITOR.skin.getIconStyle(h,"rtl"==a.lang.dir,this.icon,this.iconOffset),arrowHtml:this.hasArrow?o.output():""};p.output(f,b);if(this.onRender)this.onRender();return d},setState:function(a){if(this._.state==a)return!1;this._.state=a;
var b=CKEDITOR.document.getById(this._.id);return b?(b.setState(a,"cke_button"),a==CKEDITOR.TRISTATE_DISABLED?b.setAttribute("aria-disabled",!0):b.removeAttribute("aria-disabled"),this.hasArrow?(a=a==CKEDITOR.TRISTATE_ON?this._.editor.lang.button.selectedLabel.replace(/%1/g,this.label):this.label,CKEDITOR.document.getById(this._.id+"_label").setText(a)):a==CKEDITOR.TRISTATE_ON?b.setAttribute("aria-pressed",!0):b.removeAttribute("aria-pressed"),!0):!1},getState:function(){return this._.state},toFeature:function(a){if(this._.feature)return this._.feature;
var b=this;!this.allowedContent&&(!this.requiredContent&&this.command)&&(b=a.getCommand(this.command)||b);return this._.feature=b}};CKEDITOR.ui.prototype.addButton=function(a,b){this.add(a,CKEDITOR.UI_BUTTON,b)}})();CKEDITOR.plugins.add("panelbutton",{requires:"button",onLoad:function(){function e(c){var a=this._;a.state!=CKEDITOR.TRISTATE_DISABLED&&(this.createPanel(c),a.on?a.panel.hide():a.panel.showBlock(this._.id,this.document.getById(this._.id),4))}CKEDITOR.ui.panelButton=CKEDITOR.tools.createClass({base:CKEDITOR.ui.button,$:function(c){var a=c.panel||{};delete c.panel;this.base(c);this.document=a.parent&&a.parent.getDocument()||CKEDITOR.document;a.block={attributes:a.attributes};this.hasArrow=a.toolbarRelated=
!0;this.click=e;this._={panelDefinition:a}},statics:{handler:{create:function(c){return new CKEDITOR.ui.panelButton(c)}}},proto:{createPanel:function(c){var a=this._;if(!a.panel){var f=this._.panelDefinition,e=this._.panelDefinition.block,g=f.parent||CKEDITOR.document.getBody(),d=this._.panel=new CKEDITOR.ui.floatPanel(c,g,f),f=d.addBlock(a.id,e),b=this;d.onShow=function(){b.className&&this.element.addClass(b.className+"_panel");b.setState(CKEDITOR.TRISTATE_ON);a.on=1;b.editorFocus&&c.focus();if(b.onOpen)b.onOpen()};
d.onHide=function(d){b.className&&this.element.getFirst().removeClass(b.className+"_panel");b.setState(b.modes&&b.modes[c.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);a.on=0;if(!d&&b.onClose)b.onClose()};d.onEscape=function(){d.hide(1);b.document.getById(a.id).focus()};if(this.onBlock)this.onBlock(d,f);f.onHide=function(){a.on=0;b.setState(CKEDITOR.TRISTATE_OFF)}}}}})},beforeInit:function(e){e.ui.addHandler(CKEDITOR.UI_PANELBUTTON,CKEDITOR.ui.panelButton.handler)}});
CKEDITOR.UI_PANELBUTTON="panelbutton";(function(){CKEDITOR.plugins.add("panel",{beforeInit:function(a){a.ui.addHandler(CKEDITOR.UI_PANEL,CKEDITOR.ui.panel.handler)}});CKEDITOR.UI_PANEL="panel";CKEDITOR.ui.panel=function(a,b){b&&CKEDITOR.tools.extend(this,b);CKEDITOR.tools.extend(this,{className:"",css:[]});this.id=CKEDITOR.tools.getNextId();this.document=a;this.isFramed=this.forceIFrame||this.css.length;this._={blocks:{}}};CKEDITOR.ui.panel.handler={create:function(a){return new CKEDITOR.ui.panel(a)}};var f=CKEDITOR.addTemplate("panel",
'<div lang="{langCode}" id="{id}" dir={dir} class="cke cke_reset_all {editorId} cke_panel cke_panel {cls} cke_{dir}" style="z-index:{z-index}" role="presentation">{frame}</div>'),g=CKEDITOR.addTemplate("panel-frame",'<iframe id="{id}" class="cke_panel_frame" role="presentation" frameborder="0" src="{src}"></iframe>'),h=CKEDITOR.addTemplate("panel-frame-inner",'<!DOCTYPE html><html class="cke_panel_container {env}" dir="{dir}" lang="{langCode}"><head>{css}</head><body class="cke_{dir}" style="margin:0;padding:0" onload="{onload}"></body></html>');
CKEDITOR.ui.panel.prototype={render:function(a,b){this.getHolderElement=function(){var a=this._.holder;if(!a){if(this.isFramed){var a=this.document.getById(this.id+"_frame"),b=a.getParent(),a=a.getFrameDocument();CKEDITOR.env.iOS&&b.setStyles({overflow:"scroll","-webkit-overflow-scrolling":"touch"});b=CKEDITOR.tools.addFunction(CKEDITOR.tools.bind(function(){this.isLoaded=!0;if(this.onLoad)this.onLoad()},this));a.write(h.output(CKEDITOR.tools.extend({css:CKEDITOR.tools.buildStyleHtml(this.css),onload:"window.parent.CKEDITOR.tools.callFunction("+
b+");"},d)));a.getWindow().$.CKEDITOR=CKEDITOR;a.on("keydown",function(a){var b=a.data.getKeystroke(),c=this.document.getById(this.id).getAttribute("dir");this._.onKeyDown&&!1===this._.onKeyDown(b)?a.data.preventDefault():(27==b||b==("rtl"==c?39:37))&&this.onEscape&&!1===this.onEscape(b)&&a.data.preventDefault()},this);a=a.getBody();a.unselectable();CKEDITOR.env.air&&CKEDITOR.tools.callFunction(b)}else a=this.document.getById(this.id);this._.holder=a}return a};var d={editorId:a.id,id:this.id,langCode:a.langCode,
dir:a.lang.dir,cls:this.className,frame:"",env:CKEDITOR.env.cssClass,"z-index":a.config.baseFloatZIndex+1};if(this.isFramed){var e=CKEDITOR.env.air?"javascript:void(0)":CKEDITOR.env.ie?"javascript:void(function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+"}())":"";d.frame=g.output({id:this.id+"_frame",src:e})}e=f.output(d);b&&b.push(e);return e},addBlock:function(a,b){b=this._.blocks[a]=b instanceof CKEDITOR.ui.panel.block?b:new CKEDITOR.ui.panel.block(this.getHolderElement(),
b);this._.currentBlock||this.showBlock(a);return b},getBlock:function(a){return this._.blocks[a]},showBlock:function(a){var a=this._.blocks[a],b=this._.currentBlock,d=!this.forceIFrame||CKEDITOR.env.ie?this._.holder:this.document.getById(this.id+"_frame");b&&b.hide();this._.currentBlock=a;CKEDITOR.fire("ariaWidget",d);a._.focusIndex=-1;this._.onKeyDown=a.onKeyDown&&CKEDITOR.tools.bind(a.onKeyDown,a);a.show();return a},destroy:function(){this.element&&this.element.remove()}};CKEDITOR.ui.panel.block=
CKEDITOR.tools.createClass({$:function(a,b){this.element=a.append(a.getDocument().createElement("div",{attributes:{tabindex:-1,"class":"cke_panel_block"},styles:{display:"none"}}));b&&CKEDITOR.tools.extend(this,b);this.element.setAttributes({role:this.attributes.role||"presentation","aria-label":this.attributes["aria-label"],title:this.attributes.title||this.attributes["aria-label"]});this.keys={};this._.focusIndex=-1;this.element.disableContextMenu()},_:{markItem:function(a){-1!=a&&(a=this.element.getElementsByTag("a").getItem(this._.focusIndex=
a),CKEDITOR.env.webkit&&a.getDocument().getWindow().focus(),a.focus(),this.onMark&&this.onMark(a))}},proto:{show:function(){this.element.setStyle("display","")},hide:function(){(!this.onHide||!0!==this.onHide.call(this))&&this.element.setStyle("display","none")},onKeyDown:function(a,b){var d=this.keys[a];switch(d){case "next":for(var e=this._.focusIndex,d=this.element.getElementsByTag("a"),c;c=d.getItem(++e);)if(c.getAttribute("_cke_focus")&&c.$.offsetWidth){this._.focusIndex=e;c.focus();break}return!c&&
!b?(this._.focusIndex=-1,this.onKeyDown(a,1)):!1;case "prev":e=this._.focusIndex;for(d=this.element.getElementsByTag("a");0<e&&(c=d.getItem(--e));){if(c.getAttribute("_cke_focus")&&c.$.offsetWidth){this._.focusIndex=e;c.focus();break}c=null}return!c&&!b?(this._.focusIndex=d.count(),this.onKeyDown(a,1)):!1;case "click":case "mouseup":return e=this._.focusIndex,(c=0<=e&&this.element.getElementsByTag("a").getItem(e))&&(c.$[d]?c.$[d]():c.$["on"+d]()),!1}return!0}}})})();CKEDITOR.plugins.add("floatpanel",{requires:"panel"});
(function(){function r(a,b,c,i,f){var f=CKEDITOR.tools.genKey(b.getUniqueId(),c.getUniqueId(),a.lang.dir,a.uiColor||"",i.css||"",f||""),h=g[f];h||(h=g[f]=new CKEDITOR.ui.panel(b,i),h.element=c.append(CKEDITOR.dom.element.createFromHtml(h.render(a),b)),h.element.setStyles({display:"none",position:"absolute"}));return h}var g={};CKEDITOR.ui.floatPanel=CKEDITOR.tools.createClass({$:function(a,b,c,i){function f(){d.hide()}c.forceIFrame=1;c.toolbarRelated&&a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE&&
(b=CKEDITOR.document.getById("cke_"+a.name));var h=b.getDocument(),i=r(a,h,b,c,i||0),j=i.element,l=j.getFirst(),d=this;j.disableContextMenu();this.element=j;this._={editor:a,panel:i,parentElement:b,definition:c,document:h,iframe:l,children:[],dir:a.lang.dir};a.on("mode",f);a.on("resize",f);if(!CKEDITOR.env.iOS)h.getWindow().on("resize",f)},proto:{addBlock:function(a,b){return this._.panel.addBlock(a,b)},addListBlock:function(a,b){return this._.panel.addListBlock(a,b)},getBlock:function(a){return this._.panel.getBlock(a)},
showBlock:function(a,b,c,i,f,h){var j=this._.panel,l=j.showBlock(a);this.allowBlur(!1);a=this._.editor.editable();this._.returnFocus=a.hasFocus?a:new CKEDITOR.dom.element(CKEDITOR.document.$.activeElement);this._.hideTimeout=0;var d=this.element,a=this._.iframe,a=CKEDITOR.env.ie?a:new CKEDITOR.dom.window(a.$.contentWindow),g=d.getDocument(),o=this._.parentElement.getPositionedAncestor(),p=b.getDocumentPosition(g),g=o?o.getDocumentPosition(g):{x:0,y:0},m="rtl"==this._.dir,e=p.x+(i||0)-g.x,k=p.y+(f||
0)-g.y;if(m&&(1==c||4==c))e+=b.$.offsetWidth;else if(!m&&(2==c||3==c))e+=b.$.offsetWidth-1;if(3==c||4==c)k+=b.$.offsetHeight-1;this._.panel._.offsetParentId=b.getId();d.setStyles({top:k+"px",left:0,display:""});d.setOpacity(0);d.getFirst().removeStyle("width");this._.editor.focusManager.add(a);this._.blurSet||(CKEDITOR.event.useCapture=!0,a.on("blur",function(a){function q(){delete this._.returnFocus;this.hide()}this.allowBlur()&&a.data.getPhase()==CKEDITOR.EVENT_PHASE_AT_TARGET&&(this.visible&&!this._.activeChild)&&
(CKEDITOR.env.iOS?this._.hideTimeout||(this._.hideTimeout=CKEDITOR.tools.setTimeout(q,0,this)):q.call(this))},this),a.on("focus",function(){this._.focused=!0;this.hideChild();this.allowBlur(!0)},this),CKEDITOR.env.iOS&&(a.on("touchstart",function(){clearTimeout(this._.hideTimeout)},this),a.on("touchend",function(){this._.hideTimeout=0;this.focus()},this)),CKEDITOR.event.useCapture=!1,this._.blurSet=1);j.onEscape=CKEDITOR.tools.bind(function(a){if(this.onEscape&&this.onEscape(a)===false)return false},
this);CKEDITOR.tools.setTimeout(function(){var a=CKEDITOR.tools.bind(function(){d.removeStyle("width");if(l.autoSize){var a=l.element.getDocument(),a=(CKEDITOR.env.webkit?l.element:a.getBody()).$.scrollWidth;CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&a>0)&&(a=a+((d.$.offsetWidth||0)-(d.$.clientWidth||0)+3));d.setStyle("width",a+10+"px");a=l.element.$.scrollHeight;CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&a>0)&&(a=a+((d.$.offsetHeight||0)-(d.$.clientHeight||0)+3));d.setStyle("height",a+"px");j._.currentBlock.element.setStyle("display",
"none").removeStyle("display")}else d.removeStyle("height");m&&(e=e-d.$.offsetWidth);d.setStyle("left",e+"px");var b=j.element.getWindow(),a=d.$.getBoundingClientRect(),b=b.getViewPaneSize(),c=a.width||a.right-a.left,f=a.height||a.bottom-a.top,i=m?a.right:b.width-a.left,g=m?b.width-a.right:a.left;m?i<c&&(e=g>c?e+c:b.width>c?e-a.left:e-a.right+b.width):i<c&&(e=g>c?e-c:b.width>c?e-a.right+b.width:e-a.left);c=a.top;b.height-a.top<f&&(k=c>f?k-f:b.height>f?k-a.bottom+b.height:k-a.top);if(CKEDITOR.env.ie){b=
a=new CKEDITOR.dom.element(d.$.offsetParent);b.getName()=="html"&&(b=b.getDocument().getBody());b.getComputedStyle("direction")=="rtl"&&(e=CKEDITOR.env.ie8Compat?e-d.getDocument().getDocumentElement().$.scrollLeft*2:e-(a.$.scrollWidth-a.$.clientWidth))}var a=d.getFirst(),n;(n=a.getCustomData("activePanel"))&&n.onHide&&n.onHide.call(this,1);a.setCustomData("activePanel",this);d.setStyles({top:k+"px",left:e+"px"});d.setOpacity(1);h&&h()},this);j.isLoaded?a():j.onLoad=a;CKEDITOR.tools.setTimeout(function(){var a=
CKEDITOR.env.webkit&&CKEDITOR.document.getWindow().getScrollPosition().y;this.focus();l.element.focus();if(CKEDITOR.env.webkit)CKEDITOR.document.getBody().$.scrollTop=a;this.allowBlur(true);this._.editor.fire("panelShow",this)},0,this)},CKEDITOR.env.air?200:0,this);this.visible=1;this.onShow&&this.onShow.call(this)},focus:function(){if(CKEDITOR.env.webkit){var a=CKEDITOR.document.getActive();a&&!a.equals(this._.iframe)&&a.$.blur()}(this._.lastFocused||this._.iframe.getFrameDocument().getWindow()).focus()},
blur:function(){var a=this._.iframe.getFrameDocument().getActive();a&&a.is("a")&&(this._.lastFocused=a)},hide:function(a){if(this.visible&&(!this.onHide||!0!==this.onHide.call(this))){this.hideChild();CKEDITOR.env.gecko&&this._.iframe.getFrameDocument().$.activeElement.blur();this.element.setStyle("display","none");this.visible=0;this.element.getFirst().removeCustomData("activePanel");if(a=a&&this._.returnFocus)CKEDITOR.env.webkit&&a.type&&a.getWindow().$.focus(),a.focus();delete this._.lastFocused;
this._.editor.fire("panelHide",this)}},allowBlur:function(a){var b=this._.panel;void 0!==a&&(b.allowBlur=a);return b.allowBlur},showAsChild:function(a,b,c,g,f,h){this._.activeChild==a&&a._.panel._.offsetParentId==c.getId()||(this.hideChild(),a.onHide=CKEDITOR.tools.bind(function(){CKEDITOR.tools.setTimeout(function(){this._.focused||this.hide()},0,this)},this),this._.activeChild=a,this._.focused=!1,a.showBlock(b,c,g,f,h),this.blur(),(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)&&setTimeout(function(){a.element.getChild(0).$.style.cssText+=
""},100))},hideChild:function(a){var b=this._.activeChild;b&&(delete b.onHide,delete this._.activeChild,b.hide(),a&&this.focus())}}});CKEDITOR.on("instanceDestroyed",function(){var a=CKEDITOR.tools.isEmpty(CKEDITOR.instances),b;for(b in g){var c=g[b];a?c.destroy():c.element.hide()}a&&(g={})})})();CKEDITOR.plugins.add("colorbutton",{requires:"panelbutton,floatpanel",init:function(c){function o(m,g,e,h){var i=new CKEDITOR.style(j["colorButton_"+g+"Style"]),k=CKEDITOR.tools.getNextId()+"_colorBox";c.ui.add(m,CKEDITOR.UI_PANELBUTTON,{label:e,title:e,modes:{wysiwyg:1},editorFocus:0,toolbar:"colors,"+h,allowedContent:i,requiredContent:i,panel:{css:CKEDITOR.skin.getPath("editor"),attributes:{role:"listbox","aria-label":f.panelTitle}},onBlock:function(a,b){b.autoSize=!0;b.element.addClass("cke_colorblock");
b.element.setHtml(q(a,g,k));b.element.getDocument().getBody().setStyle("overflow","hidden");CKEDITOR.ui.fire("ready",this);var d=b.keys,e="rtl"==c.lang.dir;d[e?37:39]="next";d[40]="next";d[9]="next";d[e?39:37]="prev";d[38]="prev";d[CKEDITOR.SHIFT+9]="prev";d[32]="click"},refresh:function(){c.activeFilter.check(i)||this.setState(CKEDITOR.TRISTATE_DISABLED)},onOpen:function(){var a=c.getSelection(),a=a&&a.getStartElement(),a=c.elementPath(a),b;if(a){a=a.block||a.blockLimit||c.document.getBody();do b=
a&&a.getComputedStyle("back"==g?"background-color":"color")||"transparent";while("back"==g&&"transparent"==b&&a&&(a=a.getParent()));if(!b||"transparent"==b)b="#ffffff";this._.panel._.iframe.getFrameDocument().getById(k).setStyle("background-color",b);return b}}})}function q(m,g,e){var h=[],i=j.colorButton_colors.split(","),k=c.plugins.colordialog&&!1!==j.colorButton_enableMore,a=i.length+(k?2:1),b=CKEDITOR.tools.addFunction(function(a,b){function d(a){this.removeListener("ok",d);this.removeListener("cancel",
d);"ok"==a.name&&e(this.getContentElement("picker","selectedColor").getValue(),b)}var e=arguments.callee;if("?"==a)c.openDialog("colordialog",function(){this.on("ok",d);this.on("cancel",d)});else{c.focus();m.hide();c.fire("saveSnapshot");c.removeStyle(new CKEDITOR.style(j["colorButton_"+b+"Style"],{color:"inherit"}));if(a){var f=j["colorButton_"+b+"Style"];f.childRule="back"==b?function(a){return p(a)}:function(a){return!(a.is("a")||a.getElementsByTag("a").count())||p(a)};c.applyStyle(new CKEDITOR.style(f,
{color:a}))}c.fire("saveSnapshot")}});h.push('<a class="cke_colorauto" _cke_focus=1 hidefocus=true title="',f.auto,'" onclick="CKEDITOR.tools.callFunction(',b,",null,'",g,"');return false;\" href=\"javascript:void('",f.auto,'\')" role="option" aria-posinset="1" aria-setsize="',a,'"><table role="presentation" cellspacing=0 cellpadding=0 width="100%"><tr><td><span class="cke_colorbox" id="',e,'"></span></td><td colspan=7 align=center>',f.auto,'</td></tr></table></a><table role="presentation" cellspacing=0 cellpadding=0 width="100%">');
for(e=0;e<i.length;e++){0===e%8&&h.push("</tr><tr>");var d=i[e].split("/"),l=d[0],n=d[1]||l;d[1]||(l="#"+l.replace(/^(.)(.)(.)$/,"$1$1$2$2$3$3"));d=c.lang.colorbutton.colors[n]||n;h.push('<td><a class="cke_colorbox" _cke_focus=1 hidefocus=true title="',d,'" onclick="CKEDITOR.tools.callFunction(',b,",'",l,"','",g,"'); return false;\" href=\"javascript:void('",d,'\')" role="option" aria-posinset="',e+2,'" aria-setsize="',a,'"><span class="cke_colorbox" style="background-color:#',n,'"></span></a></td>')}k&&
h.push('</tr><tr><td colspan=8 align=center><a class="cke_colormore" _cke_focus=1 hidefocus=true title="',f.more,'" onclick="CKEDITOR.tools.callFunction(',b,",'?','",g,"');return false;\" href=\"javascript:void('",f.more,"')\"",' role="option" aria-posinset="',a,'" aria-setsize="',a,'">',f.more,"</a></td>");h.push("</tr></table>");return h.join("")}function p(c){return"false"==c.getAttribute("contentEditable")||c.getAttribute("data-nostyle")}var j=c.config,f=c.lang.colorbutton;CKEDITOR.env.hc||(o("TextColor",
"fore",f.textColorTitle,10),o("BGColor","back",f.bgColorTitle,20))}});CKEDITOR.config.colorButton_colors="000,800000,8B4513,2F4F4F,008080,000080,4B0082,696969,B22222,A52A2A,DAA520,006400,40E0D0,0000CD,800080,808080,F00,FF8C00,FFD700,008000,0FF,00F,EE82EE,A9A9A9,FFA07A,FFA500,FFFF00,00FF00,AFEEEE,ADD8E6,DDA0DD,D3D3D3,FFF0F5,FAEBD7,FFFFE0,F0FFF0,F0FFFF,F0F8FF,E6E6FA,FFF";CKEDITOR.config.colorButton_foreStyle={element:"span",styles:{color:"#(color)"},overrides:[{element:"font",attributes:{color:null}}]};
CKEDITOR.config.colorButton_backStyle={element:"span",styles:{"background-color":"#(color)"}};CKEDITOR.plugins.colordialog={requires:"dialog",init:function(b){var c=new CKEDITOR.dialogCommand("colordialog");c.editorFocus=!1;b.addCommand("colordialog",c);CKEDITOR.dialog.add("colordialog",this.path+"dialogs/colordialog.js");b.getColorFromDialog=function(c,f){var d=function(a){this.removeListener("ok",d);this.removeListener("cancel",d);a="ok"==a.name?this.getValueOf("picker","selectedColor"):null;c.call(f,a)},e=function(a){a.on("ok",d);a.on("cancel",d)};b.execCommand("colordialog");if(b._.storedDialogs&&
b._.storedDialogs.colordialog)e(b._.storedDialogs.colordialog);else CKEDITOR.on("dialogDefinition",function(a){if("colordialog"==a.data.name){var b=a.data.definition;a.removeListener();b.onLoad=CKEDITOR.tools.override(b.onLoad,function(a){return function(){e(this);b.onLoad=a;"function"==typeof a&&a.call(this)}})}})}}};CKEDITOR.plugins.add("colordialog",CKEDITOR.plugins.colordialog);CKEDITOR.plugins.add("menu",{requires:"floatpanel",beforeInit:function(g){for(var h=g.config.menu_groups.split(","),m=g._.menuGroups={},l=g._.menuItems={},a=0;a<h.length;a++)m[h[a]]=a+1;g.addMenuGroup=function(b,a){m[b]=a||100};g.addMenuItem=function(a,c){m[c.group]&&(l[a]=new CKEDITOR.menuItem(this,a,c))};g.addMenuItems=function(a){for(var c in a)this.addMenuItem(c,a[c])};g.getMenuItem=function(a){return l[a]};g.removeMenuItem=function(a){delete l[a]}}});
(function(){function g(a){a.sort(function(a,c){return a.group<c.group?-1:a.group>c.group?1:a.order<c.order?-1:a.order>c.order?1:0})}var h='<span class="cke_menuitem"><a id="{id}" class="cke_menubutton cke_menubutton__{name} cke_menubutton_{state} {cls}" href="{href}" title="{title}" tabindex="-1"_cke_focus=1 hidefocus="true" role="{role}" aria-haspopup="{hasPopup}" aria-disabled="{disabled}" {ariaChecked}';CKEDITOR.env.gecko&&CKEDITOR.env.mac&&(h+=' onkeypress="return false;"');CKEDITOR.env.gecko&&
(h+=' onblur="this.style.cssText = this.style.cssText;"');var h=h+(' onmouseover="CKEDITOR.tools.callFunction({hoverFn},{index});" onmouseout="CKEDITOR.tools.callFunction({moveOutFn},{index});" '+(CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick")+'="CKEDITOR.tools.callFunction({clickFn},{index}); return false;">'),m=CKEDITOR.addTemplate("menuItem",h+'<span class="cke_menubutton_inner"><span class="cke_menubutton_icon"><span class="cke_button_icon cke_button__{iconName}_icon" style="{iconStyle}"></span></span><span class="cke_menubutton_label">{label}</span>{arrowHtml}</span></a></span>'),
l=CKEDITOR.addTemplate("menuArrow",'<span class="cke_menuarrow"><span>{label}</span></span>');CKEDITOR.menu=CKEDITOR.tools.createClass({$:function(a,b){b=this._.definition=b||{};this.id=CKEDITOR.tools.getNextId();this.editor=a;this.items=[];this._.listeners=[];this._.level=b.level||1;var c=CKEDITOR.tools.extend({},b.panel,{css:[CKEDITOR.skin.getPath("editor")],level:this._.level-1,block:{}}),k=c.block.attributes=c.attributes||{};!k.role&&(k.role="menu");this._.panelDefinition=c},_:{onShow:function(){var a=
this.editor.getSelection(),b=a&&a.getStartElement(),c=this.editor.elementPath(),k=this._.listeners;this.removeAll();for(var e=0;e<k.length;e++){var j=k[e](b,a,c);if(j)for(var i in j){var f=this.editor.getMenuItem(i);if(f&&(!f.command||this.editor.getCommand(f.command).state))f.state=j[i],this.add(f)}}},onClick:function(a){this.hide();if(a.onClick)a.onClick();else a.command&&this.editor.execCommand(a.command)},onEscape:function(a){var b=this.parent;b?b._.panel.hideChild(1):27==a&&this.hide(1);return!1},
onHide:function(){this.onHide&&this.onHide()},showSubMenu:function(a){var b=this._.subMenu,c=this.items[a];if(c=c.getItems&&c.getItems()){b?b.removeAll():(b=this._.subMenu=new CKEDITOR.menu(this.editor,CKEDITOR.tools.extend({},this._.definition,{level:this._.level+1},!0)),b.parent=this,b._.onClick=CKEDITOR.tools.bind(this._.onClick,this));for(var k in c){var e=this.editor.getMenuItem(k);e&&(e.state=c[k],b.add(e))}var j=this._.panel.getBlock(this.id).element.getDocument().getById(this.id+(""+a));setTimeout(function(){b.show(j,
2)},0)}else this._.panel.hideChild(1)}},proto:{add:function(a){a.order||(a.order=this.items.length);this.items.push(a)},removeAll:function(){this.items=[]},show:function(a,b,c,k){if(!this.parent&&(this._.onShow(),!this.items.length))return;var b=b||("rtl"==this.editor.lang.dir?2:1),e=this.items,j=this.editor,i=this._.panel,f=this._.element;if(!i){i=this._.panel=new CKEDITOR.ui.floatPanel(this.editor,CKEDITOR.document.getBody(),this._.panelDefinition,this._.level);i.onEscape=CKEDITOR.tools.bind(function(a){if(!1===
this._.onEscape(a))return!1},this);i.onShow=function(){i._.panel.getHolderElement().getParent().addClass("cke cke_reset_all")};i.onHide=CKEDITOR.tools.bind(function(){this._.onHide&&this._.onHide()},this);f=i.addBlock(this.id,this._.panelDefinition.block);f.autoSize=!0;var d=f.keys;d[40]="next";d[9]="next";d[38]="prev";d[CKEDITOR.SHIFT+9]="prev";d["rtl"==j.lang.dir?37:39]=CKEDITOR.env.ie?"mouseup":"click";d[32]=CKEDITOR.env.ie?"mouseup":"click";CKEDITOR.env.ie&&(d[13]="mouseup");f=this._.element=
f.element;d=f.getDocument();d.getBody().setStyle("overflow","hidden");d.getElementsByTag("html").getItem(0).setStyle("overflow","hidden");this._.itemOverFn=CKEDITOR.tools.addFunction(function(a){clearTimeout(this._.showSubTimeout);this._.showSubTimeout=CKEDITOR.tools.setTimeout(this._.showSubMenu,j.config.menu_subMenuDelay||400,this,[a])},this);this._.itemOutFn=CKEDITOR.tools.addFunction(function(){clearTimeout(this._.showSubTimeout)},this);this._.itemClickFn=CKEDITOR.tools.addFunction(function(a){var b=
this.items[a];if(b.state==CKEDITOR.TRISTATE_DISABLED)this.hide(1);else if(b.getItems)this._.showSubMenu(a);else this._.onClick(b)},this)}g(e);for(var d=j.elementPath(),d=['<div class="cke_menu'+(d&&d.direction()!=j.lang.dir?" cke_mixed_dir_content":"")+'" role="presentation">'],h=e.length,m=h&&e[0].group,l=0;l<h;l++){var n=e[l];m!=n.group&&(d.push('<div class="cke_menuseparator" role="separator"></div>'),m=n.group);n.render(this,l,d)}d.push("</div>");f.setHtml(d.join(""));CKEDITOR.ui.fire("ready",
this);this.parent?this.parent._.panel.showAsChild(i,this.id,a,b,c,k):i.showBlock(this.id,a,b,c,k);j.fire("menuShow",[i])},addListener:function(a){this._.listeners.push(a)},hide:function(a){this._.onHide&&this._.onHide();this._.panel&&this._.panel.hide(a)}}});CKEDITOR.menuItem=CKEDITOR.tools.createClass({$:function(a,b,c){CKEDITOR.tools.extend(this,c,{order:0,className:"cke_menubutton__"+b});this.group=a._.menuGroups[this.group];this.editor=a;this.name=b},proto:{render:function(a,b,c){var h=a.id+(""+
b),e="undefined"==typeof this.state?CKEDITOR.TRISTATE_OFF:this.state,j="",i=e==CKEDITOR.TRISTATE_ON?"on":e==CKEDITOR.TRISTATE_DISABLED?"disabled":"off";this.role in{menuitemcheckbox:1,menuitemradio:1}&&(j=' aria-checked="'+(e==CKEDITOR.TRISTATE_ON?"true":"false")+'"');var f=this.getItems,d="&#"+("rtl"==this.editor.lang.dir?"9668":"9658")+";",g=this.name;this.icon&&!/\./.test(this.icon)&&(g=this.icon);a={id:h,name:this.name,iconName:g,label:this.label,cls:this.className||"",state:i,hasPopup:f?"true":
"false",disabled:e==CKEDITOR.TRISTATE_DISABLED,title:this.label,href:"javascript:void('"+(this.label||"").replace("'")+"')",hoverFn:a._.itemOverFn,moveOutFn:a._.itemOutFn,clickFn:a._.itemClickFn,index:b,iconStyle:CKEDITOR.skin.getIconStyle(g,"rtl"==this.editor.lang.dir,g==this.icon?null:this.icon,this.iconOffset),arrowHtml:f?l.output({label:d}):"",role:this.role?this.role:"menuitem",ariaChecked:j};m.output(a,c)}}})})();CKEDITOR.config.menu_groups="clipboard,form,tablecell,tablecellproperties,tablerow,tablecolumn,table,anchor,link,image,flash,checkbox,radio,textfield,hiddenfield,imagebutton,button,select,textarea,div";CKEDITOR.plugins.add("contextmenu",{requires:"menu",onLoad:function(){CKEDITOR.plugins.contextMenu=CKEDITOR.tools.createClass({base:CKEDITOR.menu,$:function(a){this.base.call(this,a,{panel:{className:"cke_menu_panel",attributes:{"aria-label":a.lang.contextmenu.options}}})},proto:{addTarget:function(a,e){a.on("contextmenu",function(a){var a=a.data,c=CKEDITOR.env.webkit?f:CKEDITOR.env.mac?a.$.metaKey:a.$.ctrlKey;if(!e||!c){a.preventDefault();if(CKEDITOR.env.mac&&CKEDITOR.env.webkit){var c=this.editor,
b=(new CKEDITOR.dom.elementPath(a.getTarget(),c.editable())).contains(function(a){return a.hasAttribute("contenteditable")},!0);b&&"false"==b.getAttribute("contenteditable")&&c.getSelection().fake(b)}var b=a.getTarget().getDocument(),d=a.getTarget().getDocument().getDocumentElement(),c=!b.equals(CKEDITOR.document),b=b.getWindow().getScrollPosition(),g=c?a.$.clientX:a.$.pageX||b.x+a.$.clientX,h=c?a.$.clientY:a.$.pageY||b.y+a.$.clientY;CKEDITOR.tools.setTimeout(function(){this.open(d,null,g,h)},CKEDITOR.env.ie?
200:0,this)}},this);if(CKEDITOR.env.webkit){var f,d=function(){f=0};a.on("keydown",function(a){f=CKEDITOR.env.mac?a.data.$.metaKey:a.data.$.ctrlKey});a.on("keyup",d);a.on("contextmenu",d)}},open:function(a,e,f,d){this.editor.focus();a=a||CKEDITOR.document.getDocumentElement();this.editor.selectionChange(1);this.show(a,e,f,d)}}})},beforeInit:function(a){var e=a.contextMenu=new CKEDITOR.plugins.contextMenu(a);a.on("contentDom",function(){e.addTarget(a.editable(),!1!==a.config.browserContextMenuOnCtrl)});
a.addCommand("contextMenu",{exec:function(){a.contextMenu.open(a.document.getBody())}});a.setKeystroke(CKEDITOR.SHIFT+121,"contextMenu");a.setKeystroke(CKEDITOR.CTRL+CKEDITOR.SHIFT+121,"contextMenu")}});(function(){var k;function n(a,c){function j(d){d=i.list[d];if(d.equals(a.editable())||"true"==d.getAttribute("contenteditable")){var e=a.createRange();e.selectNodeContents(d);e.select()}else a.getSelection().selectElement(d);a.focus()}function s(){l&&l.setHtml(o);delete i.list}var m=a.ui.spaceId("path"),l,i=a._.elementsPath,n=i.idBase;c.html+='<span id="'+m+'_label" class="cke_voice_label">'+a.lang.elementspath.eleLabel+'</span><span id="'+m+'" class="cke_path" role="group" aria-labelledby="'+m+
'_label">'+o+"</span>";a.on("uiReady",function(){var d=a.ui.space("path");d&&a.focusManager.add(d,1)});i.onClick=j;var t=CKEDITOR.tools.addFunction(j),u=CKEDITOR.tools.addFunction(function(d,e){var g=i.idBase,b,e=new CKEDITOR.dom.event(e);b="rtl"==a.lang.dir;switch(e.getKeystroke()){case b?39:37:case 9:return(b=CKEDITOR.document.getById(g+(d+1)))||(b=CKEDITOR.document.getById(g+"0")),b.focus(),!1;case b?37:39:case CKEDITOR.SHIFT+9:return(b=CKEDITOR.document.getById(g+(d-1)))||(b=CKEDITOR.document.getById(g+
(i.list.length-1))),b.focus(),!1;case 27:return a.focus(),!1;case 13:case 32:return j(d),!1}return!0});a.on("selectionChange",function(){for(var d=[],e=i.list=[],g=[],b=i.filters,c=!0,j=a.elementPath().elements,f,k=j.length;k--;){var h=j[k],p=0;f=h.data("cke-display-name")?h.data("cke-display-name"):h.data("cke-real-element-type")?h.data("cke-real-element-type"):h.getName();c=h.hasAttribute("contenteditable")?"true"==h.getAttribute("contenteditable"):c;!c&&!h.hasAttribute("contenteditable")&&(p=1);
for(var q=0;q<b.length;q++){var r=b[q](h,f);if(!1===r){p=1;break}f=r||f}p||(e.unshift(h),g.unshift(f))}e=e.length;for(b=0;b<e;b++)f=g[b],c=a.lang.elementspath.eleTitle.replace(/%1/,f),f=v.output({id:n+b,label:c,text:f,jsTitle:"javascript:void('"+f+"')",index:b,keyDownFn:u,clickFn:t}),d.unshift(f);l||(l=CKEDITOR.document.getById(m));g=l;g.setHtml(d.join("")+o);a.fire("elementsPathUpdate",{space:g})});a.on("readOnly",s);a.on("contentDomUnload",s);a.addCommand("elementsPathFocus",k);a.setKeystroke(CKEDITOR.ALT+
122,"elementsPathFocus")}k={editorFocus:!1,readOnly:1,exec:function(a){(a=CKEDITOR.document.getById(a._.elementsPath.idBase+"0"))&&a.focus(CKEDITOR.env.ie||CKEDITOR.env.air)}};var o='<span class="cke_path_empty">&nbsp;</span>',c="";CKEDITOR.env.gecko&&CKEDITOR.env.mac&&(c+=' onkeypress="return false;"');CKEDITOR.env.gecko&&(c+=' onblur="this.style.cssText = this.style.cssText;"');var v=CKEDITOR.addTemplate("pathItem",'<a id="{id}" href="{jsTitle}" tabindex="-1" class="cke_path_item" title="{label}"'+
c+' hidefocus="true"  onkeydown="return CKEDITOR.tools.callFunction({keyDownFn},{index}, event );" onclick="CKEDITOR.tools.callFunction({clickFn},{index}); return false;" role="button" aria-label="{label}">{text}</a>');CKEDITOR.plugins.add("elementspath",{init:function(a){a._.elementsPath={idBase:"cke_elementspath_"+CKEDITOR.tools.getNextNumber()+"_",filters:[]};a.on("uiSpace",function(c){"bottom"==c.data.space&&n(a,c.data)})}})})();(function(){function m(b,d,a){a=b.config.forceEnterMode||a;"wysiwyg"==b.mode&&(d||(d=b.activeEnterMode),b.elementPath().isContextFor("p")||(d=CKEDITOR.ENTER_BR,a=1),b.fire("saveSnapshot"),d==CKEDITOR.ENTER_BR?p(b,d,null,a):q(b,d,null,a),b.fire("saveSnapshot"))}function r(b){for(var b=b.getSelection().getRanges(!0),d=b.length-1;0<d;d--)b[d].deleteContents();return b[0]}function u(b){var d=b.startContainer.getAscendant(function(a){return a.type==CKEDITOR.NODE_ELEMENT&&"true"==a.getAttribute("contenteditable")},
!0);if(b.root.equals(d))return b;d=new CKEDITOR.dom.range(d);d.moveToRange(b);return d}CKEDITOR.plugins.add("enterkey",{init:function(b){b.addCommand("enter",{modes:{wysiwyg:1},editorFocus:!1,exec:function(b){m(b)}});b.addCommand("shiftEnter",{modes:{wysiwyg:1},editorFocus:!1,exec:function(b){m(b,b.activeShiftEnterMode,1)}});b.setKeystroke([[13,"enter"],[CKEDITOR.SHIFT+13,"shiftEnter"]])}});var v=CKEDITOR.dom.walker.whitespaces(),w=CKEDITOR.dom.walker.bookmark();CKEDITOR.plugins.enterkey={enterBlock:function(b,
d,a,h){if(a=a||r(b)){var a=u(a),f=a.document,i=a.checkStartOfBlock(),k=a.checkEndOfBlock(),j=b.elementPath(a.startContainer),c=j.block,l=d==CKEDITOR.ENTER_DIV?"div":"p",e;if(i&&k){if(c&&(c.is("li")||c.getParent().is("li"))){c.is("li")||(c=c.getParent());a=c.getParent();e=a.getParent();var h=!c.hasPrevious(),n=!c.hasNext(),l=b.getSelection(),g=l.createBookmarks(),i=c.getDirection(1),k=c.getAttribute("class"),o=c.getAttribute("style"),m=e.getDirection(1)!=i,b=b.enterMode!=CKEDITOR.ENTER_BR||m||o||k;
if(e.is("li"))if(h||n)c[h?"insertBefore":"insertAfter"](e);else c.breakParent(e);else{if(b)if(j.block.is("li")?(e=f.createElement(d==CKEDITOR.ENTER_P?"p":"div"),m&&e.setAttribute("dir",i),o&&e.setAttribute("style",o),k&&e.setAttribute("class",k),c.moveChildren(e)):e=j.block,h||n)e[h?"insertBefore":"insertAfter"](a);else c.breakParent(a),e.insertAfter(a);else if(c.appendBogus(!0),h||n)for(;f=c[h?"getFirst":"getLast"]();)f[h?"insertBefore":"insertAfter"](a);else for(c.breakParent(a);f=c.getLast();)f.insertAfter(a);
c.remove()}l.selectBookmarks(g);return}if(c&&c.getParent().is("blockquote")){c.breakParent(c.getParent());c.getPrevious().getFirst(CKEDITOR.dom.walker.invisible(1))||c.getPrevious().remove();c.getNext().getFirst(CKEDITOR.dom.walker.invisible(1))||c.getNext().remove();a.moveToElementEditStart(c);a.select();return}}else if(c&&c.is("pre")&&!k){p(b,d,a,h);return}if(i=a.splitBlock(l)){d=i.previousBlock;c=i.nextBlock;j=i.wasStartOfBlock;b=i.wasEndOfBlock;if(c)g=c.getParent(),g.is("li")&&(c.breakParent(g),
c.move(c.getNext(),1));else if(d&&(g=d.getParent())&&g.is("li"))d.breakParent(g),g=d.getNext(),a.moveToElementEditStart(g),d.move(d.getPrevious());if(!j&&!b)c.is("li")&&(e=a.clone(),e.selectNodeContents(c),e=new CKEDITOR.dom.walker(e),e.evaluator=function(a){return!(w(a)||v(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.getName()in CKEDITOR.dtd.$inline&&!(a.getName()in CKEDITOR.dtd.$empty))},(g=e.next())&&(g.type==CKEDITOR.NODE_ELEMENT&&g.is("ul","ol"))&&(CKEDITOR.env.needsBrFiller?f.createElement("br"):f.createText(" ")).insertBefore(g)),
c&&a.moveToElementEditStart(c);else{if(d){if(d.is("li")||!s.test(d.getName())&&!d.is("pre"))e=d.clone()}else c&&(e=c.clone());e?h&&!e.is("li")&&e.renameNode(l):g&&g.is("li")?e=g:(e=f.createElement(l),d&&(n=d.getDirection())&&e.setAttribute("dir",n));if(f=i.elementPath){h=0;for(l=f.elements.length;h<l;h++){g=f.elements[h];if(g.equals(f.block)||g.equals(f.blockLimit))break;CKEDITOR.dtd.$removeEmpty[g.getName()]&&(g=g.clone(),e.moveChildren(g),e.append(g))}}e.appendBogus();e.getParent()||a.insertNode(e);
e.is("li")&&e.removeAttribute("value");if(CKEDITOR.env.ie&&j&&(!b||!d.getChildCount()))a.moveToElementEditStart(b?d:e),a.select();a.moveToElementEditStart(j&&!b?c:e)}a.select();a.scrollIntoView()}}},enterBr:function(b,d,a,h){if(a=a||r(b)){var f=a.document,i=a.checkEndOfBlock(),k=new CKEDITOR.dom.elementPath(b.getSelection().getStartElement()),j=k.block,c=j&&k.block.getName();!h&&"li"==c?q(b,d,a,h):(!h&&i&&s.test(c)?(i=j.getDirection())?(f=f.createElement("div"),f.setAttribute("dir",i),f.insertAfter(j),
a.setStart(f,0)):(f.createElement("br").insertAfter(j),CKEDITOR.env.gecko&&f.createText("").insertAfter(j),a.setStartAt(j.getNext(),CKEDITOR.env.ie?CKEDITOR.POSITION_BEFORE_START:CKEDITOR.POSITION_AFTER_START)):(b="pre"==c&&CKEDITOR.env.ie&&8>CKEDITOR.env.version?f.createText("\r"):f.createElement("br"),a.deleteContents(),a.insertNode(b),CKEDITOR.env.needsBrFiller?(f.createText("").insertAfter(b),i&&(j||k.blockLimit).appendBogus(),b.getNext().$.nodeValue="",a.setStartAt(b.getNext(),CKEDITOR.POSITION_AFTER_START)):
a.setStartAt(b,CKEDITOR.POSITION_AFTER_END)),a.collapse(!0),a.select(),a.scrollIntoView())}}};var t=CKEDITOR.plugins.enterkey,p=t.enterBr,q=t.enterBlock,s=/^h[1-6]$/})();(function(){function i(b,f){var g={},c=[],e={nbsp:" ",shy:"­",gt:">",lt:"<",amp:"&",apos:"'",quot:'"'},b=b.replace(/\b(nbsp|shy|gt|lt|amp|apos|quot)(?:,|$)/g,function(b,a){var d=f?"&"+a+";":e[a];g[d]=f?e[a]:"&"+a+";";c.push(d);return""});if(!f&&b){var b=b.split(","),a=document.createElement("div"),d;a.innerHTML="&"+b.join(";&")+";";d=a.innerHTML;a=null;for(a=0;a<d.length;a++){var h=d.charAt(a);g[h]="&"+b[a]+";";c.push(h)}}g.regex=c.join(f?"|":"");return g}CKEDITOR.plugins.add("entities",{afterInit:function(b){function f(a){return h[a]}
function g(b){return"force"==c.entities_processNumerical||!a[b]?"&#"+b.charCodeAt(0)+";":a[b]}var c=b.config;if(b=(b=b.dataProcessor)&&b.htmlFilter){var e=[];!1!==c.basicEntities&&e.push("nbsp,gt,lt,amp");c.entities&&(e.length&&e.push("quot,iexcl,cent,pound,curren,yen,brvbar,sect,uml,copy,ordf,laquo,not,shy,reg,macr,deg,plusmn,sup2,sup3,acute,micro,para,middot,cedil,sup1,ordm,raquo,frac14,frac12,frac34,iquest,times,divide,fnof,bull,hellip,prime,Prime,oline,frasl,weierp,image,real,trade,alefsym,larr,uarr,rarr,darr,harr,crarr,lArr,uArr,rArr,dArr,hArr,forall,part,exist,empty,nabla,isin,notin,ni,prod,sum,minus,lowast,radic,prop,infin,ang,and,or,cap,cup,int,there4,sim,cong,asymp,ne,equiv,le,ge,sub,sup,nsub,sube,supe,oplus,otimes,perp,sdot,lceil,rceil,lfloor,rfloor,lang,rang,loz,spades,clubs,hearts,diams,circ,tilde,ensp,emsp,thinsp,zwnj,zwj,lrm,rlm,ndash,mdash,lsquo,rsquo,sbquo,ldquo,rdquo,bdquo,dagger,Dagger,permil,lsaquo,rsaquo,euro"),
c.entities_latin&&e.push("Agrave,Aacute,Acirc,Atilde,Auml,Aring,AElig,Ccedil,Egrave,Eacute,Ecirc,Euml,Igrave,Iacute,Icirc,Iuml,ETH,Ntilde,Ograve,Oacute,Ocirc,Otilde,Ouml,Oslash,Ugrave,Uacute,Ucirc,Uuml,Yacute,THORN,szlig,agrave,aacute,acirc,atilde,auml,aring,aelig,ccedil,egrave,eacute,ecirc,euml,igrave,iacute,icirc,iuml,eth,ntilde,ograve,oacute,ocirc,otilde,ouml,oslash,ugrave,uacute,ucirc,uuml,yacute,thorn,yuml,OElig,oelig,Scaron,scaron,Yuml"),c.entities_greek&&e.push("Alpha,Beta,Gamma,Delta,Epsilon,Zeta,Eta,Theta,Iota,Kappa,Lambda,Mu,Nu,Xi,Omicron,Pi,Rho,Sigma,Tau,Upsilon,Phi,Chi,Psi,Omega,alpha,beta,gamma,delta,epsilon,zeta,eta,theta,iota,kappa,lambda,mu,nu,xi,omicron,pi,rho,sigmaf,sigma,tau,upsilon,phi,chi,psi,omega,thetasym,upsih,piv"),
c.entities_additional&&e.push(c.entities_additional));var a=i(e.join(",")),d=a.regex?"["+a.regex+"]":"a^";delete a.regex;c.entities&&c.entities_processNumerical&&(d="[^ -~]|"+d);var d=RegExp(d,"g"),h=i("nbsp,gt,lt,amp,shy",!0),j=RegExp(h.regex,"g");b.addRules({text:function(a){return a.replace(j,f).replace(d,g)}},{applyToAll:!0,excludeNestedEditable:!0})}}})})();CKEDITOR.config.basicEntities=!0;CKEDITOR.config.entities=!0;CKEDITOR.config.entities_latin=!0;CKEDITOR.config.entities_greek=!0;
CKEDITOR.config.entities_additional="#39";CKEDITOR.plugins.add("popup");
CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{popup:function(e,a,b,d){a=a||"80%";b=b||"70%";"string"==typeof a&&(1<a.length&&"%"==a.substr(a.length-1,1))&&(a=parseInt(window.screen.width*parseInt(a,10)/100,10));"string"==typeof b&&(1<b.length&&"%"==b.substr(b.length-1,1))&&(b=parseInt(window.screen.height*parseInt(b,10)/100,10));640>a&&(a=640);420>b&&(b=420);var f=parseInt((window.screen.height-b)/2,10),g=parseInt((window.screen.width-a)/2,10),d=(d||"location=no,menubar=no,toolbar=no,dependent=yes,minimizable=no,modal=yes,alwaysRaised=yes,resizable=yes,scrollbars=yes")+",width="+
a+",height="+b+",top="+f+",left="+g,c=window.open("",null,d,!0);if(!c)return!1;try{-1==navigator.userAgent.toLowerCase().indexOf(" chrome/")&&(c.moveTo(g,f),c.resizeTo(a,b)),c.focus(),c.location.href=e}catch(h){window.open(e,null,d,!0)}return!0}});(function(){function g(a,c){var d=[];if(c)for(var b in c)d.push(b+"="+encodeURIComponent(c[b]));else return a;return a+(-1!=a.indexOf("?")?"&":"?")+d.join("&")}function i(a){a+="";return a.charAt(0).toUpperCase()+a.substr(1)}function k(){var a=this.getDialog(),c=a.getParentEditor();c._.filebrowserSe=this;var d=c.config["filebrowser"+i(a.getName())+"WindowWidth"]||c.config.filebrowserWindowWidth||"80%",a=c.config["filebrowser"+i(a.getName())+"WindowHeight"]||c.config.filebrowserWindowHeight||"70%",
b=this.filebrowser.params||{};b.CKEditor=c.name;b.CKEditorFuncNum=c._.filebrowserFn;b.langCode||(b.langCode=c.langCode);b=g(this.filebrowser.url,b);c.popup(b,d,a,c.config.filebrowserWindowFeatures||c.config.fileBrowserWindowFeatures)}function l(){var a=this.getDialog();a.getParentEditor()._.filebrowserSe=this;return!a.getContentElement(this["for"][0],this["for"][1]).getInputElement().$.value||!a.getContentElement(this["for"][0],this["for"][1]).getAction()?!1:!0}function m(a,c,d){var b=d.params||{};
b.CKEditor=a.name;b.CKEditorFuncNum=a._.filebrowserFn;b.langCode||(b.langCode=a.langCode);c.action=g(d.url,b);c.filebrowser=d}function j(a,c,d,b){if(b&&b.length)for(var e,g=b.length;g--;)if(e=b[g],("hbox"==e.type||"vbox"==e.type||"fieldset"==e.type)&&j(a,c,d,e.children),e.filebrowser)if("string"==typeof e.filebrowser&&(e.filebrowser={action:"fileButton"==e.type?"QuickUpload":"Browse",target:e.filebrowser}),"Browse"==e.filebrowser.action){var f=e.filebrowser.url;void 0===f&&(f=a.config["filebrowser"+
i(c)+"BrowseUrl"],void 0===f&&(f=a.config.filebrowserBrowseUrl));f&&(e.onClick=k,e.filebrowser.url=f,e.hidden=!1)}else if("QuickUpload"==e.filebrowser.action&&e["for"]&&(f=e.filebrowser.url,void 0===f&&(f=a.config["filebrowser"+i(c)+"UploadUrl"],void 0===f&&(f=a.config.filebrowserUploadUrl)),f)){var h=e.onClick;e.onClick=function(a){var b=a.sender;return h&&h.call(b,a)===false?false:l.call(b,a)};e.filebrowser.url=f;e.hidden=!1;m(a,d.getContents(e["for"][0]).get(e["for"][1]),e.filebrowser)}}function h(a,
c,d){if(-1!==d.indexOf(";")){for(var d=d.split(";"),b=0;b<d.length;b++)if(h(a,c,d[b]))return!0;return!1}return(a=a.getContents(c).get(d).filebrowser)&&a.url}function n(a,c){var d=this._.filebrowserSe.getDialog(),b=this._.filebrowserSe["for"],e=this._.filebrowserSe.filebrowser.onSelect;b&&d.getContentElement(b[0],b[1]).reset();if(!("function"==typeof c&&!1===c.call(this._.filebrowserSe))&&!(e&&!1===e.call(this._.filebrowserSe,a,c))&&("string"==typeof c&&c&&alert(c),a&&(b=this._.filebrowserSe,d=b.getDialog(),
b=b.filebrowser.target||null)))if(b=b.split(":"),e=d.getContentElement(b[0],b[1]))e.setValue(a),d.selectPage(b[0])}CKEDITOR.plugins.add("filebrowser",{requires:"popup",init:function(a){a._.filebrowserFn=CKEDITOR.tools.addFunction(n,a);a.on("destroy",function(){CKEDITOR.tools.removeFunction(this._.filebrowserFn)})}});CKEDITOR.on("dialogDefinition",function(a){if(a.editor.plugins.filebrowser)for(var c=a.data.definition,d,b=0;b<c.contents.length;++b)if(d=c.contents[b])j(a.editor,a.data.name,c,d.elements),
d.hidden&&d.filebrowser&&(d.hidden=!h(c,d.id,d.filebrowser))})})();(function(){function i(a){var j=a.config,m=a.fire("uiSpace",{space:"top",html:""}).html,p=function(){function f(a,c,e){b.setStyle(c,s(e));b.setStyle("position",a)}function e(a){var b=i.getDocumentPosition();switch(a){case "top":f("absolute","top",b.y-n-o);break;case "pin":f("fixed","top",t);break;case "bottom":f("absolute","top",b.y+(c.height||c.bottom-c.top)+o)}k=a}var k,i,l,c,h,n,r,m=j.floatSpaceDockedOffsetX||0,o=j.floatSpaceDockedOffsetY||0,q=j.floatSpacePinnedOffsetX||0,t=j.floatSpacePinnedOffsetY||
0;return function(d){if(i=a.editable())if(d&&"focus"==d.name&&b.show(),b.removeStyle("left"),b.removeStyle("right"),l=b.getClientRect(),c=i.getClientRect(),h=g.getViewPaneSize(),n=l.height,r="pageXOffset"in g.$?g.$.pageXOffset:CKEDITOR.document.$.documentElement.scrollLeft,k){n+o<=c.top?e("top"):n+o>h.height-c.bottom?e("pin"):e("bottom");var d=h.width/2,d=0<c.left&&c.right<h.width&&c.width>l.width?"rtl"==a.config.contentsLangDirection?"right":"left":d-c.left>c.right-d?"left":"right",f;l.width>h.width?
(d="left",f=0):(f="left"==d?0<c.left?c.left:0:c.right<h.width?h.width-c.right:0,f+l.width>h.width&&(d="left"==d?"right":"left",f=0));b.setStyle(d,s(("pin"==k?q:m)+f+("pin"==k?0:"left"==d?r:-r)))}else k="pin",e("pin"),p(d)}}();if(m){var i=new CKEDITOR.template('<div id="cke_{name}" class="cke {id} cke_reset_all cke_chrome cke_editor_{name} cke_float cke_{langDir} '+CKEDITOR.env.cssClass+'" dir="{langDir}" title="'+(CKEDITOR.env.gecko?" ":"")+'" lang="{langCode}" role="application" style="{style}"'+
(a.title?' aria-labelledby="cke_{name}_arialbl"':" ")+">"+(a.title?'<span id="cke_{name}_arialbl" class="cke_voice_label">{voiceLabel}</span>':" ")+'<div class="cke_inner"><div id="{topId}" class="cke_top" role="presentation">{content}</div></div></div>'),b=CKEDITOR.document.getBody().append(CKEDITOR.dom.element.createFromHtml(i.output({content:m,id:a.id,langDir:a.lang.dir,langCode:a.langCode,name:a.name,style:"display:none;z-index:"+(j.baseFloatZIndex-1),topId:a.ui.spaceId("top"),voiceLabel:a.title}))),
q=CKEDITOR.tools.eventsBuffer(500,p),e=CKEDITOR.tools.eventsBuffer(100,p);b.unselectable();b.on("mousedown",function(a){a=a.data;a.getTarget().hasAscendant("a",1)||a.preventDefault()});a.on("focus",function(b){p(b);a.on("change",q.input);g.on("scroll",e.input);g.on("resize",e.input)});a.on("blur",function(){b.hide();a.removeListener("change",q.input);g.removeListener("scroll",e.input);g.removeListener("resize",e.input)});a.on("destroy",function(){g.removeListener("scroll",e.input);g.removeListener("resize",
e.input);b.clearCustomData();b.remove()});a.focusManager.hasFocus&&b.show();a.focusManager.add(b,1)}}var g=CKEDITOR.document.getWindow(),s=CKEDITOR.tools.cssLength;CKEDITOR.plugins.add("floatingspace",{init:function(a){a.on("loaded",function(){i(this)},null,null,20)}})})();CKEDITOR.plugins.add("listblock",{requires:"panel",onLoad:function(){var f=CKEDITOR.addTemplate("panel-list",'<ul role="presentation" class="cke_panel_list">{items}</ul>'),g=CKEDITOR.addTemplate("panel-list-item",'<li id="{id}" class="cke_panel_listItem" role=presentation><a id="{id}_option" _cke_focus=1 hidefocus=true title="{title}" href="javascript:void(\'{val}\')"  {onclick}="CKEDITOR.tools.callFunction({clickFn},\'{val}\'); return false;" role="option">{text}</a></li>'),h=CKEDITOR.addTemplate("panel-list-group",
'<h1 id="{id}" class="cke_panel_grouptitle" role="presentation" >{label}</h1>'),i=/\'/g;CKEDITOR.ui.panel.prototype.addListBlock=function(a,b){return this.addBlock(a,new CKEDITOR.ui.listBlock(this.getHolderElement(),b))};CKEDITOR.ui.listBlock=CKEDITOR.tools.createClass({base:CKEDITOR.ui.panel.block,$:function(a,b){var b=b||{},c=b.attributes||(b.attributes={});(this.multiSelect=!!b.multiSelect)&&(c["aria-multiselectable"]=!0);!c.role&&(c.role="listbox");this.base.apply(this,arguments);this.element.setAttribute("role",
c.role);c=this.keys;c[40]="next";c[9]="next";c[38]="prev";c[CKEDITOR.SHIFT+9]="prev";c[32]=CKEDITOR.env.ie?"mouseup":"click";CKEDITOR.env.ie&&(c[13]="mouseup");this._.pendingHtml=[];this._.pendingList=[];this._.items={};this._.groups={}},_:{close:function(){if(this._.started){var a=f.output({items:this._.pendingList.join("")});this._.pendingList=[];this._.pendingHtml.push(a);delete this._.started}},getClick:function(){this._.click||(this._.click=CKEDITOR.tools.addFunction(function(a){var b=this.toggle(a);
if(this.onClick)this.onClick(a,b)},this));return this._.click}},proto:{add:function(a,b,c){var d=CKEDITOR.tools.getNextId();this._.started||(this._.started=1,this._.size=this._.size||0);this._.items[a]=d;var e;e=CKEDITOR.tools.htmlEncodeAttr(a).replace(i,"\\'");a={id:d,val:e,onclick:CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick",clickFn:this._.getClick(),title:CKEDITOR.tools.htmlEncodeAttr(c||a),text:b||a};this._.pendingList.push(g.output(a))},startGroup:function(a){this._.close();
var b=CKEDITOR.tools.getNextId();this._.groups[a]=b;this._.pendingHtml.push(h.output({id:b,label:a}))},commit:function(){this._.close();this.element.appendHtml(this._.pendingHtml.join(""));delete this._.size;this._.pendingHtml=[]},toggle:function(a){var b=this.isMarked(a);b?this.unmark(a):this.mark(a);return!b},hideGroup:function(a){var b=(a=this.element.getDocument().getById(this._.groups[a]))&&a.getNext();a&&(a.setStyle("display","none"),b&&"ul"==b.getName()&&b.setStyle("display","none"))},hideItem:function(a){this.element.getDocument().getById(this._.items[a]).setStyle("display",
"none")},showAll:function(){var a=this._.items,b=this._.groups,c=this.element.getDocument(),d;for(d in a)c.getById(a[d]).setStyle("display","");for(var e in b)a=c.getById(b[e]),d=a.getNext(),a.setStyle("display",""),d&&"ul"==d.getName()&&d.setStyle("display","")},mark:function(a){this.multiSelect||this.unmarkAll();var a=this._.items[a],b=this.element.getDocument().getById(a);b.addClass("cke_selected");this.element.getDocument().getById(a+"_option").setAttribute("aria-selected",!0);this.onMark&&this.onMark(b)},
unmark:function(a){var b=this.element.getDocument(),a=this._.items[a],c=b.getById(a);c.removeClass("cke_selected");b.getById(a+"_option").removeAttribute("aria-selected");this.onUnmark&&this.onUnmark(c)},unmarkAll:function(){var a=this._.items,b=this.element.getDocument(),c;for(c in a){var d=a[c];b.getById(d).removeClass("cke_selected");b.getById(d+"_option").removeAttribute("aria-selected")}this.onUnmark&&this.onUnmark()},isMarked:function(a){return this.element.getDocument().getById(this._.items[a]).hasClass("cke_selected")},
focus:function(a){this._.focusIndex=-1;var b=this.element.getElementsByTag("a"),c,d=-1;if(a)for(c=this.element.getDocument().getById(this._.items[a]).getFirst();a=b.getItem(++d);){if(a.equals(c)){this._.focusIndex=d;break}}else this.element.focus();c&&setTimeout(function(){c.focus()},0)}}})}});CKEDITOR.plugins.add("richcombo",{requires:"floatpanel,listblock,button",beforeInit:function(d){d.ui.addHandler(CKEDITOR.UI_RICHCOMBO,CKEDITOR.ui.richCombo.handler)}});
(function(){var d='<span id="{id}" class="cke_combo cke_combo__{name} {cls}" role="presentation"><span id="{id}_label" class="cke_combo_label">{label}</span><a class="cke_combo_button" title="{title}" tabindex="-1"'+(CKEDITOR.env.gecko&&!CKEDITOR.env.hc?"":" href=\"javascript:void('{titleJs}')\"")+' hidefocus="true" role="button" aria-labelledby="{id}_label" aria-haspopup="true"';CKEDITOR.env.gecko&&CKEDITOR.env.mac&&(d+=' onkeypress="return false;"');CKEDITOR.env.gecko&&(d+=' onblur="this.style.cssText = this.style.cssText;"');
var d=d+(' onkeydown="return CKEDITOR.tools.callFunction({keydownFn},event,this);" onfocus="return CKEDITOR.tools.callFunction({focusFn},event);" '+(CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick")+'="CKEDITOR.tools.callFunction({clickFn},this);return false;"><span id="{id}_text" class="cke_combo_text cke_combo_inlinelabel">{label}</span><span class="cke_combo_open"><span class="cke_combo_arrow">'+(CKEDITOR.env.hc?"&#9660;":CKEDITOR.env.air?"&nbsp;":"")+"</span></span></a></span>"),
i=CKEDITOR.addTemplate("combo",d);CKEDITOR.UI_RICHCOMBO="richcombo";CKEDITOR.ui.richCombo=CKEDITOR.tools.createClass({$:function(a){CKEDITOR.tools.extend(this,a,{canGroup:!1,title:a.label,modes:{wysiwyg:1},editorFocus:1});a=this.panel||{};delete this.panel;this.id=CKEDITOR.tools.getNextNumber();this.document=a.parent&&a.parent.getDocument()||CKEDITOR.document;a.className="cke_combopanel";a.block={multiSelect:a.multiSelect,attributes:a.attributes};a.toolbarRelated=!0;this._={panelDefinition:a,items:{}}},
proto:{renderHtml:function(a){var b=[];this.render(a,b);return b.join("")},render:function(a,b){function g(){if(this.getState()!=CKEDITOR.TRISTATE_ON){var c=this.modes[a.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED;a.readOnly&&!this.readOnly&&(c=CKEDITOR.TRISTATE_DISABLED);this.setState(c);this.setValue("");c!=CKEDITOR.TRISTATE_DISABLED&&this.refresh&&this.refresh()}}var d=CKEDITOR.env,h="cke_"+this.id,e=CKEDITOR.tools.addFunction(function(b){j&&(a.unlockSelection(1),j=0);c.execute(b)},
this),f=this,c={id:h,combo:this,focus:function(){CKEDITOR.document.getById(h).getChild(1).focus()},execute:function(c){var b=f._;if(b.state!=CKEDITOR.TRISTATE_DISABLED)if(f.createPanel(a),b.on)b.panel.hide();else{f.commit();var d=f.getValue();d?b.list.mark(d):b.list.unmarkAll();b.panel.showBlock(f.id,new CKEDITOR.dom.element(c),4)}},clickFn:e};a.on("activeFilterChange",g,this);a.on("mode",g,this);a.on("selectionChange",g,this);!this.readOnly&&a.on("readOnly",g,this);var k=CKEDITOR.tools.addFunction(function(b,
d){var b=new CKEDITOR.dom.event(b),g=b.getKeystroke();if(40==g)a.once("panelShow",function(a){a.data._.panel._.currentBlock.onKeyDown(40)});switch(g){case 13:case 32:case 40:CKEDITOR.tools.callFunction(e,d);break;default:c.onkey(c,g)}b.preventDefault()}),l=CKEDITOR.tools.addFunction(function(){c.onfocus&&c.onfocus()}),j=0;c.keyDownFn=k;d={id:h,name:this.name||this.command,label:this.label,title:this.title,cls:this.className||"",titleJs:d.gecko&&!d.hc?"":(this.title||"").replace("'",""),keydownFn:k,
focusFn:l,clickFn:e};i.output(d,b);if(this.onRender)this.onRender();return c},createPanel:function(a){if(!this._.panel){var b=this._.panelDefinition,d=this._.panelDefinition.block,i=b.parent||CKEDITOR.document.getBody(),h="cke_combopanel__"+this.name,e=new CKEDITOR.ui.floatPanel(a,i,b),f=e.addListBlock(this.id,d),c=this;e.onShow=function(){this.element.addClass(h);c.setState(CKEDITOR.TRISTATE_ON);c._.on=1;c.editorFocus&&!a.focusManager.hasFocus&&a.focus();if(c.onOpen)c.onOpen();a.once("panelShow",
function(){f.focus(!f.multiSelect&&c.getValue())})};e.onHide=function(b){this.element.removeClass(h);c.setState(c.modes&&c.modes[a.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);c._.on=0;if(!b&&c.onClose)c.onClose()};e.onEscape=function(){e.hide(1)};f.onClick=function(a,b){c.onClick&&c.onClick.call(c,a,b);e.hide()};this._.panel=e;this._.list=f;e.getBlock(this.id).onHide=function(){c._.on=0;c.setState(CKEDITOR.TRISTATE_OFF)};this.init&&this.init()}},setValue:function(a,b){this._.value=a;var d=
this.document.getById("cke_"+this.id+"_text");d&&(!a&&!b?(b=this.label,d.addClass("cke_combo_inlinelabel")):d.removeClass("cke_combo_inlinelabel"),d.setText("undefined"!=typeof b?b:a))},getValue:function(){return this._.value||""},unmarkAll:function(){this._.list.unmarkAll()},mark:function(a){this._.list.mark(a)},hideItem:function(a){this._.list.hideItem(a)},hideGroup:function(a){this._.list.hideGroup(a)},showAll:function(){this._.list.showAll()},add:function(a,b,d){this._.items[a]=d||a;this._.list.add(a,
b,d)},startGroup:function(a){this._.list.startGroup(a)},commit:function(){this._.committed||(this._.list.commit(),this._.committed=1,CKEDITOR.ui.fire("ready",this));this._.committed=1},setState:function(a){if(this._.state!=a){var b=this.document.getById("cke_"+this.id);b.setState(a,"cke_combo");a==CKEDITOR.TRISTATE_DISABLED?b.setAttribute("aria-disabled",!0):b.removeAttribute("aria-disabled");this._.state=a}},getState:function(){return this._.state},enable:function(){this._.state==CKEDITOR.TRISTATE_DISABLED&&
this.setState(this._.lastState)},disable:function(){this._.state!=CKEDITOR.TRISTATE_DISABLED&&(this._.lastState=this._.state,this.setState(CKEDITOR.TRISTATE_DISABLED))}},statics:{handler:{create:function(a){return new CKEDITOR.ui.richCombo(a)}}}});CKEDITOR.ui.prototype.addRichCombo=function(a,b){this.add(a,CKEDITOR.UI_RICHCOMBO,b)}})();(function(){function j(a,b,c,f,m,j,p,r){for(var s=a.config,n=new CKEDITOR.style(p),i=m.split(";"),m=[],k={},d=0;d<i.length;d++){var h=i[d];if(h){var h=h.split("/"),q={},l=i[d]=h[0];q[c]=m[d]=h[1]||l;k[l]=new CKEDITOR.style(p,q);k[l]._.definition.name=l}else i.splice(d--,1)}a.ui.addRichCombo(b,{label:f.label,title:f.panelTitle,toolbar:"styles,"+r,allowedContent:n,requiredContent:n,panel:{css:[CKEDITOR.skin.getPath("editor")].concat(s.contentsCss),multiSelect:!1,attributes:{"aria-label":f.panelTitle}},
init:function(){this.startGroup(f.panelTitle);for(var a=0;a<i.length;a++){var b=i[a];this.add(b,k[b].buildPreview(),b)}},onClick:function(b){a.focus();a.fire("saveSnapshot");var c=this.getValue(),f=k[b];if(c&&b!=c){var i=k[c],e=a.getSelection().getRanges()[0];if(e.collapsed){var d=a.elementPath(),g=d.contains(function(a){return i.checkElementRemovable(a)});if(g){var h=e.checkBoundaryOfElement(g,CKEDITOR.START),j=e.checkBoundaryOfElement(g,CKEDITOR.END);if(h&&j){for(h=e.createBookmark();d=g.getFirst();)d.insertBefore(g);
g.remove();e.moveToBookmark(h)}else h?e.moveToPosition(g,CKEDITOR.POSITION_BEFORE_START):j?e.moveToPosition(g,CKEDITOR.POSITION_AFTER_END):(e.splitElement(g),e.moveToPosition(g,CKEDITOR.POSITION_AFTER_END),o(e,d.elements.slice(),g));a.getSelection().selectRanges([e])}}else a.removeStyle(i)}a[c==b?"removeStyle":"applyStyle"](f);a.fire("saveSnapshot")},onRender:function(){a.on("selectionChange",function(b){for(var c=this.getValue(),b=b.data.path.elements,d=0,f;d<b.length;d++){f=b[d];for(var e in k)if(k[e].checkElementMatch(f,
!0,a)){e!=c&&this.setValue(e);return}}this.setValue("",j)},this)},refresh:function(){a.activeFilter.check(n)||this.setState(CKEDITOR.TRISTATE_DISABLED)}})}function o(a,b,c){var f=b.pop();if(f){if(c)return o(a,b,f.equals(c)?null:c);c=f.clone();a.insertNode(c);a.moveToPosition(c,CKEDITOR.POSITION_AFTER_START);o(a,b)}}CKEDITOR.plugins.add("font",{requires:"richcombo",init:function(a){var b=a.config;j(a,"Font","family",a.lang.font,b.font_names,b.font_defaultLabel,b.font_style,30);j(a,"FontSize","size",
a.lang.font.fontSize,b.fontSize_sizes,b.fontSize_defaultLabel,b.fontSize_style,40)}})})();CKEDITOR.config.font_names="Arial/Arial, Helvetica, sans-serif;Comic Sans MS/Comic Sans MS, cursive;Courier New/Courier New, Courier, monospace;Georgia/Georgia, serif;Lucida Sans Unicode/Lucida Sans Unicode, Lucida Grande, sans-serif;Tahoma/Tahoma, Geneva, sans-serif;Times New Roman/Times New Roman, Times, serif;Trebuchet MS/Trebuchet MS, Helvetica, sans-serif;Verdana/Verdana, Geneva, sans-serif";
CKEDITOR.config.font_defaultLabel="";CKEDITOR.config.font_style={element:"span",styles:{"font-family":"#(family)"},overrides:[{element:"font",attributes:{face:null}}]};CKEDITOR.config.fontSize_sizes="8/8px;9/9px;10/10px;11/11px;12/12px;14/14px;16/16px;18/18px;20/20px;22/22px;24/24px;26/26px;28/28px;36/36px;48/48px;72/72px";CKEDITOR.config.fontSize_defaultLabel="";CKEDITOR.config.fontSize_style={element:"span",styles:{"font-size":"#(size)"},overrides:[{element:"font",attributes:{size:null}}]};CKEDITOR.plugins.add("format",{requires:"richcombo",init:function(a){if(!a.blockless){for(var f=a.config,c=a.lang.format,j=f.format_tags.split(";"),d={},k=0,l=[],g=0;g<j.length;g++){var h=j[g],i=new CKEDITOR.style(f["format_"+h]);if(!a.filter.customConfig||a.filter.check(i))k++,d[h]=i,d[h]._.enterMode=a.config.enterMode,l.push(i)}0!==k&&a.ui.addRichCombo("Format",{label:c.label,title:c.panelTitle,toolbar:"styles,20",allowedContent:l,panel:{css:[CKEDITOR.skin.getPath("editor")].concat(f.contentsCss),
multiSelect:!1,attributes:{"aria-label":c.panelTitle}},init:function(){this.startGroup(c.panelTitle);for(var a in d){var e=c["tag_"+a];this.add(a,d[a].buildPreview(e),e)}},onClick:function(b){a.focus();a.fire("saveSnapshot");var b=d[b],e=a.elementPath();a[b.checkActive(e,a)?"removeStyle":"applyStyle"](b);setTimeout(function(){a.fire("saveSnapshot")},0)},onRender:function(){a.on("selectionChange",function(b){var e=this.getValue(),b=b.data.path;this.refresh();for(var c in d)if(d[c].checkActive(b,a)){c!=
e&&this.setValue(c,a.lang.format["tag_"+c]);return}this.setValue("")},this)},onOpen:function(){this.showAll();for(var b in d)a.activeFilter.check(d[b])||this.hideItem(b)},refresh:function(){var b=a.elementPath();if(b){if(b.isContextFor("p"))for(var c in d)if(a.activeFilter.check(d[c]))return;this.setState(CKEDITOR.TRISTATE_DISABLED)}}})}}});CKEDITOR.config.format_tags="p;h1;h2;h3;h4;h5;h6;pre;address;div";CKEDITOR.config.format_p={element:"p"};CKEDITOR.config.format_div={element:"div"};
CKEDITOR.config.format_pre={element:"pre"};CKEDITOR.config.format_address={element:"address"};CKEDITOR.config.format_h1={element:"h1"};CKEDITOR.config.format_h2={element:"h2"};CKEDITOR.config.format_h3={element:"h3"};CKEDITOR.config.format_h4={element:"h4"};CKEDITOR.config.format_h5={element:"h5"};CKEDITOR.config.format_h6={element:"h6"};(function(){var b={canUndo:!1,exec:function(a){var b=a.document.createElement("hr");a.insertElement(b)},allowedContent:"hr",requiredContent:"hr"};CKEDITOR.plugins.add("horizontalrule",{init:function(a){a.blockless||(a.addCommand("horizontalrule",b),a.ui.addButton&&a.ui.addButton("HorizontalRule",{label:a.lang.horizontalrule.toolbar,command:"horizontalrule",toolbar:"insert,40"}))}})})();CKEDITOR.plugins.add("htmlwriter",{init:function(b){var a=new CKEDITOR.htmlWriter;a.forceSimpleAmpersand=b.config.forceSimpleAmpersand;a.indentationChars=b.config.dataIndentationChars||"\t";b.dataProcessor.writer=a}});
CKEDITOR.htmlWriter=CKEDITOR.tools.createClass({base:CKEDITOR.htmlParser.basicWriter,$:function(){this.base();this.indentationChars="\t";this.selfClosingEnd=" />";this.lineBreakChars="\n";this.sortAttributes=1;this._.indent=0;this._.indentation="";this._.inPre=0;this._.rules={};var b=CKEDITOR.dtd,a;for(a in CKEDITOR.tools.extend({},b.$nonBodyContent,b.$block,b.$listItem,b.$tableContent))this.setRules(a,{indent:!b[a]["#"],breakBeforeOpen:1,breakBeforeClose:!b[a]["#"],breakAfterClose:1,needsSpace:a in
b.$block&&!(a in{li:1,dt:1,dd:1})});this.setRules("br",{breakAfterOpen:1});this.setRules("title",{indent:0,breakAfterOpen:0});this.setRules("style",{indent:0,breakBeforeClose:1});this.setRules("pre",{breakAfterOpen:1,indent:0})},proto:{openTag:function(b){var a=this._.rules[b];this._.afterCloser&&(a&&a.needsSpace&&this._.needsSpace)&&this._.output.push("\n");this._.indent?this.indentation():a&&a.breakBeforeOpen&&(this.lineBreak(),this.indentation());this._.output.push("<",b);this._.afterCloser=0},
openTagClose:function(b,a){var c=this._.rules[b];a?(this._.output.push(this.selfClosingEnd),c&&c.breakAfterClose&&(this._.needsSpace=c.needsSpace)):(this._.output.push(">"),c&&c.indent&&(this._.indentation+=this.indentationChars));c&&c.breakAfterOpen&&this.lineBreak();"pre"==b&&(this._.inPre=1)},attribute:function(b,a){"string"==typeof a&&(this.forceSimpleAmpersand&&(a=a.replace(/&amp;/g,"&")),a=CKEDITOR.tools.htmlEncodeAttr(a));this._.output.push(" ",b,'="',a,'"')},closeTag:function(b){var a=this._.rules[b];
a&&a.indent&&(this._.indentation=this._.indentation.substr(this.indentationChars.length));this._.indent?this.indentation():a&&a.breakBeforeClose&&(this.lineBreak(),this.indentation());this._.output.push("</",b,">");"pre"==b&&(this._.inPre=0);a&&a.breakAfterClose&&(this.lineBreak(),this._.needsSpace=a.needsSpace);this._.afterCloser=1},text:function(b){this._.indent&&(this.indentation(),!this._.inPre&&(b=CKEDITOR.tools.ltrim(b)));this._.output.push(b)},comment:function(b){this._.indent&&this.indentation();
this._.output.push("<\!--",b,"--\>")},lineBreak:function(){!this._.inPre&&0<this._.output.length&&this._.output.push(this.lineBreakChars);this._.indent=1},indentation:function(){!this._.inPre&&this._.indentation&&this._.output.push(this._.indentation);this._.indent=0},reset:function(){this._.output=[];this._.indent=0;this._.indentation="";this._.afterCloser=0;this._.inPre=0},setRules:function(b,a){var c=this._.rules[b];c?CKEDITOR.tools.extend(c,a,!0):this._.rules[b]=a}}});(function(){function e(b,a){a||(a=b.getSelection().getSelectedElement());if(a&&a.is("img")&&!a.data("cke-realelement")&&!a.isReadOnly())return a}function f(b){var a=b.getStyle("float");if("inherit"==a||"none"==a)a=0;a||(a=b.getAttribute("align"));return a}CKEDITOR.plugins.add("image",{requires:"dialog",init:function(b){if(!b.plugins.image2){CKEDITOR.dialog.add("image",this.path+"dialogs/image.js");var a="img[alt,!src]{border-style,border-width,float,height,margin,margin-bottom,margin-left,margin-right,margin-top,width}";
CKEDITOR.dialog.isTabEnabled(b,"image","advanced")&&(a="img[alt,dir,id,lang,longdesc,!src,title]{*}(*)");b.addCommand("image",new CKEDITOR.dialogCommand("image",{allowedContent:a,requiredContent:"img[alt,src]",contentTransformations:[["img{width}: sizeToStyle","img[width]: sizeToAttribute"],["img{float}: alignmentToStyle","img[align]: alignmentToAttribute"]]}));b.ui.addButton&&b.ui.addButton("Image",{label:b.lang.common.image,command:"image",toolbar:"insert,10"});b.on("doubleclick",function(b){var a=
b.data.element;a.is("img")&&(!a.data("cke-realelement")&&!a.isReadOnly())&&(b.data.dialog="image")});b.addMenuItems&&b.addMenuItems({image:{label:b.lang.image.menu,command:"image",group:"image"}});b.contextMenu&&b.contextMenu.addListener(function(a){if(e(b,a))return{image:CKEDITOR.TRISTATE_OFF}})}},afterInit:function(b){function a(a){var d=b.getCommand("justify"+a);if(d){if("left"==a||"right"==a)d.on("exec",function(d){var c=e(b),g;c&&(g=f(c),g==a?(c.removeStyle("float"),a==f(c)&&c.removeAttribute("align")):
c.setStyle("float",a),d.cancel())});d.on("refresh",function(d){var c=e(b);c&&(c=f(c),this.setState(c==a?CKEDITOR.TRISTATE_ON:"right"==a||"left"==a?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED),d.cancel())})}}b.plugins.image2||(a("left"),a("right"),a("center"),a("block"))}})})();CKEDITOR.config.image_removeLinkByEmptyURL=!0;(function(){function k(a,b){var e,f;b.on("refresh",function(a){var b=[i],c;for(c in a.data.states)b.push(a.data.states[c]);this.setState(CKEDITOR.tools.search(b,m)?m:i)},b,null,100);b.on("exec",function(b){e=a.getSelection();f=e.createBookmarks(1);b.data||(b.data={});b.data.done=!1},b,null,0);b.on("exec",function(){a.forceNextSelectionCheck();e.selectBookmarks(f)},b,null,100)}var i=CKEDITOR.TRISTATE_DISABLED,m=CKEDITOR.TRISTATE_OFF;CKEDITOR.plugins.add("indent",{init:function(a){var b=CKEDITOR.plugins.indent.genericDefinition;
k(a,a.addCommand("indent",new b(!0)));k(a,a.addCommand("outdent",new b));a.ui.addButton&&(a.ui.addButton("Indent",{label:a.lang.indent.indent,command:"indent",directional:!0,toolbar:"indent,20"}),a.ui.addButton("Outdent",{label:a.lang.indent.outdent,command:"outdent",directional:!0,toolbar:"indent,10"}));a.on("dirChanged",function(b){var f=a.createRange(),j=b.data.node;f.setStartBefore(j);f.setEndAfter(j);for(var l=new CKEDITOR.dom.walker(f),c;c=l.next();)if(c.type==CKEDITOR.NODE_ELEMENT)if(!c.equals(j)&&
c.getDirection()){f.setStartAfter(c);l=new CKEDITOR.dom.walker(f)}else{var d=a.config.indentClasses;if(d)for(var g=b.data.dir=="ltr"?["_rtl",""]:["","_rtl"],h=0;h<d.length;h++)if(c.hasClass(d[h]+g[0])){c.removeClass(d[h]+g[0]);c.addClass(d[h]+g[1])}d=c.getStyle("margin-right");g=c.getStyle("margin-left");d?c.setStyle("margin-left",d):c.removeStyle("margin-left");g?c.setStyle("margin-right",g):c.removeStyle("margin-right")}})}});CKEDITOR.plugins.indent={genericDefinition:function(a){this.isIndent=
!!a;this.startDisabled=!this.isIndent},specificDefinition:function(a,b,e){this.name=b;this.editor=a;this.jobs={};this.enterBr=a.config.enterMode==CKEDITOR.ENTER_BR;this.isIndent=!!e;this.relatedGlobal=e?"indent":"outdent";this.indentKey=e?9:CKEDITOR.SHIFT+9;this.database={}},registerCommands:function(a,b){a.on("pluginsLoaded",function(){for(var a in b)(function(a,b){var e=a.getCommand(b.relatedGlobal),c;for(c in b.jobs)e.on("exec",function(d){d.data.done||(a.fire("lockSnapshot"),b.execJob(a,c)&&(d.data.done=
!0),a.fire("unlockSnapshot"),CKEDITOR.dom.element.clearAllMarkers(b.database))},this,null,c),e.on("refresh",function(d){d.data.states||(d.data.states={});d.data.states[b.name+"@"+c]=b.refreshJob(a,c,d.data.path)},this,null,c);a.addFeature(b)})(this,b[a])})}};CKEDITOR.plugins.indent.genericDefinition.prototype={context:"p",exec:function(){}};CKEDITOR.plugins.indent.specificDefinition.prototype={execJob:function(a,b){var e=this.jobs[b];if(e.state!=i)return e.exec.call(this,a)},refreshJob:function(a,
b,e){b=this.jobs[b];b.state=a.activeFilter.checkFeature(this)?b.refresh.call(this,a,e):i;return b.state},getContext:function(a){return a.contains(this.context)}}})();(function(){function s(c){function f(b){for(var e=d.startContainer,a=d.endContainer;e&&!e.getParent().equals(b);)e=e.getParent();for(;a&&!a.getParent().equals(b);)a=a.getParent();if(!e||!a)return!1;for(var g=e,e=[],i=!1;!i;)g.equals(a)&&(i=!0),e.push(g),g=g.getNext();if(1>e.length)return!1;g=b.getParents(!0);for(a=0;a<g.length;a++)if(g[a].getName&&m[g[a].getName()]){b=g[a];break}for(var g=j.isIndent?1:-1,a=e[0],e=e[e.length-1],i=CKEDITOR.plugins.list.listToArray(b,n),l=i[e.getCustomData("listarray_index")].indent,
a=a.getCustomData("listarray_index");a<=e.getCustomData("listarray_index");a++)if(i[a].indent+=g,0<g){var h=i[a].parent;i[a].parent=new CKEDITOR.dom.element(h.getName(),h.getDocument())}for(a=e.getCustomData("listarray_index")+1;a<i.length&&i[a].indent>l;a++)i[a].indent+=g;e=CKEDITOR.plugins.list.arrayToList(i,n,null,c.config.enterMode,b.getDirection());if(!j.isIndent){var f;if((f=b.getParent())&&f.is("li"))for(var g=e.listNode.getChildren(),o=[],k,a=g.count()-1;0<=a;a--)(k=g.getItem(a))&&(k.is&&
k.is("li"))&&o.push(k)}e&&e.listNode.replace(b);if(o&&o.length)for(a=0;a<o.length;a++){for(k=b=o[a];(k=k.getNext())&&k.is&&k.getName()in m;)CKEDITOR.env.needsNbspFiller&&!b.getFirst(t)&&b.append(d.document.createText(" ")),b.append(k);b.insertAfter(f)}e&&c.fire("contentDomInvalidated");return!0}for(var j=this,n=this.database,m=this.context,l=c.getSelection(),l=(l&&l.getRanges()).createIterator(),d;d=l.getNextRange();){for(var b=d.getCommonAncestor();b&&!(b.type==CKEDITOR.NODE_ELEMENT&&m[b.getName()]);)b=
b.getParent();b||(b=d.startPath().contains(m))&&d.setEndAt(b,CKEDITOR.POSITION_BEFORE_END);if(!b){var h=d.getEnclosedNode();h&&(h.type==CKEDITOR.NODE_ELEMENT&&h.getName()in m)&&(d.setStartAt(h,CKEDITOR.POSITION_AFTER_START),d.setEndAt(h,CKEDITOR.POSITION_BEFORE_END),b=h)}b&&(d.startContainer.type==CKEDITOR.NODE_ELEMENT&&d.startContainer.getName()in m)&&(h=new CKEDITOR.dom.walker(d),h.evaluator=p,d.startContainer=h.next());b&&(d.endContainer.type==CKEDITOR.NODE_ELEMENT&&d.endContainer.getName()in m)&&
(h=new CKEDITOR.dom.walker(d),h.evaluator=p,d.endContainer=h.previous());if(b)return f(b)}return 0}function p(c){return c.type==CKEDITOR.NODE_ELEMENT&&c.is("li")}function t(c){return u(c)&&v(c)}var u=CKEDITOR.dom.walker.whitespaces(!0),v=CKEDITOR.dom.walker.bookmark(!1,!0),q=CKEDITOR.TRISTATE_DISABLED,r=CKEDITOR.TRISTATE_OFF;CKEDITOR.plugins.add("indentlist",{requires:"indent",init:function(c){function f(c){j.specificDefinition.apply(this,arguments);this.requiredContent=["ul","ol"];c.on("key",function(f){if("wysiwyg"==
c.mode&&f.data.keyCode==this.indentKey){var l=this.getContext(c.elementPath());if(l&&(!this.isIndent||!CKEDITOR.plugins.indentList.firstItemInPath(this.context,c.elementPath(),l)))c.execCommand(this.relatedGlobal),f.cancel()}},this);this.jobs[this.isIndent?10:30]={refresh:this.isIndent?function(c,f){var d=this.getContext(f),b=CKEDITOR.plugins.indentList.firstItemInPath(this.context,f,d);return!d||!this.isIndent||b?q:r}:function(c,f){return!this.getContext(f)||this.isIndent?q:r},exec:CKEDITOR.tools.bind(s,
this)}}var j=CKEDITOR.plugins.indent;j.registerCommands(c,{indentlist:new f(c,"indentlist",!0),outdentlist:new f(c,"outdentlist")});CKEDITOR.tools.extend(f.prototype,j.specificDefinition.prototype,{context:{ol:1,ul:1}})}});CKEDITOR.plugins.indentList={};CKEDITOR.plugins.indentList.firstItemInPath=function(c,f,j){var n=f.contains(p);j||(j=f.contains(c));return j&&n&&n.equals(j.getFirst(p))}})();(function(){function l(a,c){var c=void 0===c||c,b;if(c)b=a.getComputedStyle("text-align");else{for(;!a.hasAttribute||!a.hasAttribute("align")&&!a.getStyle("text-align");){b=a.getParent();if(!b)break;a=b}b=a.getStyle("text-align")||a.getAttribute("align")||""}b&&(b=b.replace(/(?:-(?:moz|webkit)-)?(?:start|auto)/i,""));!b&&c&&(b="rtl"==a.getComputedStyle("direction")?"right":"left");return b}function g(a,c,b){this.editor=a;this.name=c;this.value=b;this.context="p";var c=a.config.justifyClasses,h=a.config.enterMode==
CKEDITOR.ENTER_P?"p":"div";if(c){switch(b){case "left":this.cssClassName=c[0];break;case "center":this.cssClassName=c[1];break;case "right":this.cssClassName=c[2];break;case "justify":this.cssClassName=c[3]}this.cssClassRegex=RegExp("(?:^|\\s+)(?:"+c.join("|")+")(?=$|\\s)");this.requiredContent=h+"("+this.cssClassName+")"}else this.requiredContent=h+"{text-align}";this.allowedContent={"caption div h1 h2 h3 h4 h5 h6 p pre td th li":{propertiesOnly:!0,styles:this.cssClassName?null:"text-align",classes:this.cssClassName||
null}};a.config.enterMode==CKEDITOR.ENTER_BR&&(this.allowedContent.div=!0)}function j(a){var c=a.editor,b=c.createRange();b.setStartBefore(a.data.node);b.setEndAfter(a.data.node);for(var h=new CKEDITOR.dom.walker(b),d;d=h.next();)if(d.type==CKEDITOR.NODE_ELEMENT)if(!d.equals(a.data.node)&&d.getDirection())b.setStartAfter(d),h=new CKEDITOR.dom.walker(b);else{var e=c.config.justifyClasses;e&&(d.hasClass(e[0])?(d.removeClass(e[0]),d.addClass(e[2])):d.hasClass(e[2])&&(d.removeClass(e[2]),d.addClass(e[0])));
e=d.getStyle("text-align");"left"==e?d.setStyle("text-align","right"):"right"==e&&d.setStyle("text-align","left")}}g.prototype={exec:function(a){var c=a.getSelection(),b=a.config.enterMode;if(c){for(var h=c.createBookmarks(),d=c.getRanges(),e=this.cssClassName,g,f,i=a.config.useComputedState,i=void 0===i||i,k=d.length-1;0<=k;k--){g=d[k].createIterator();for(g.enlargeBr=b!=CKEDITOR.ENTER_BR;f=g.getNextParagraph(b==CKEDITOR.ENTER_P?"p":"div");)if(!f.isReadOnly()){f.removeAttribute("align");f.removeStyle("text-align");
var j=e&&(f.$.className=CKEDITOR.tools.ltrim(f.$.className.replace(this.cssClassRegex,""))),m=this.state==CKEDITOR.TRISTATE_OFF&&(!i||l(f,!0)!=this.value);e?m?f.addClass(e):j||f.removeAttribute("class"):m&&f.setStyle("text-align",this.value)}}a.focus();a.forceNextSelectionCheck();c.selectBookmarks(h)}},refresh:function(a,c){var b=c.block||c.blockLimit;this.setState("body"!=b.getName()&&l(b,this.editor.config.useComputedState)==this.value?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)}};CKEDITOR.plugins.add("justify",
{init:function(a){if(!a.blockless){var c=new g(a,"justifyleft","left"),b=new g(a,"justifycenter","center"),h=new g(a,"justifyright","right"),d=new g(a,"justifyblock","justify");a.addCommand("justifyleft",c);a.addCommand("justifycenter",b);a.addCommand("justifyright",h);a.addCommand("justifyblock",d);a.ui.addButton&&(a.ui.addButton("JustifyLeft",{label:a.lang.justify.left,command:"justifyleft",toolbar:"align,10"}),a.ui.addButton("JustifyCenter",{label:a.lang.justify.center,command:"justifycenter",
toolbar:"align,20"}),a.ui.addButton("JustifyRight",{label:a.lang.justify.right,command:"justifyright",toolbar:"align,30"}),a.ui.addButton("JustifyBlock",{label:a.lang.justify.block,command:"justifyblock",toolbar:"align,40"}));a.on("dirChanged",j)}}})})();(function(){function g(a,b){var c=j.exec(a),d=j.exec(b);if(c){if(!c[2]&&"px"==d[2])return d[1];if("px"==c[2]&&!d[2])return d[1]+"px"}return b}var i=CKEDITOR.htmlParser.cssStyle,h=CKEDITOR.tools.cssLength,j=/^((?:\d*(?:\.\d+))|(?:\d+))(.*)?$/i,k={elements:{$:function(a){var b=a.attributes;if((b=(b=(b=b&&b["data-cke-realelement"])&&new CKEDITOR.htmlParser.fragment.fromHtml(decodeURIComponent(b)))&&b.children[0])&&a.attributes["data-cke-resizable"]){var c=(new i(a)).rules,a=b.attributes,d=c.width,c=
c.height;d&&(a.width=g(a.width,d));c&&(a.height=g(a.height,c))}return b}}};CKEDITOR.plugins.add("fakeobjects",{init:function(a){a.filter.allow("img[!data-cke-realelement,src,alt,title](*){*}","fakeobjects")},afterInit:function(a){(a=(a=a.dataProcessor)&&a.htmlFilter)&&a.addRules(k,{applyToAll:!0})}});CKEDITOR.editor.prototype.createFakeElement=function(a,b,c,d){var e=this.lang.fakeobjects,e=e[c]||e.unknown,b={"class":b,"data-cke-realelement":encodeURIComponent(a.getOuterHtml()),"data-cke-real-node-type":a.type,
alt:e,title:e,align:a.getAttribute("align")||""};CKEDITOR.env.hc||(b.src=CKEDITOR.tools.transparentImageData);c&&(b["data-cke-real-element-type"]=c);d&&(b["data-cke-resizable"]=d,c=new i,d=a.getAttribute("width"),a=a.getAttribute("height"),d&&(c.rules.width=h(d)),a&&(c.rules.height=h(a)),c.populate(b));return this.document.createElement("img",{attributes:b})};CKEDITOR.editor.prototype.createFakeParserElement=function(a,b,c,d){var e=this.lang.fakeobjects,e=e[c]||e.unknown,f;f=new CKEDITOR.htmlParser.basicWriter;
a.writeHtml(f);f=f.getHtml();b={"class":b,"data-cke-realelement":encodeURIComponent(f),"data-cke-real-node-type":a.type,alt:e,title:e,align:a.attributes.align||""};CKEDITOR.env.hc||(b.src=CKEDITOR.tools.transparentImageData);c&&(b["data-cke-real-element-type"]=c);d&&(b["data-cke-resizable"]=d,d=a.attributes,a=new i,c=d.width,d=d.height,void 0!==c&&(a.rules.width=h(c)),void 0!==d&&(a.rules.height=h(d)),a.populate(b));return new CKEDITOR.htmlParser.element("img",b)};CKEDITOR.editor.prototype.restoreRealElement=
function(a){if(a.data("cke-real-node-type")!=CKEDITOR.NODE_ELEMENT)return null;var b=CKEDITOR.dom.element.createFromHtml(decodeURIComponent(a.data("cke-realelement")),this.document);if(a.data("cke-resizable")){var c=a.getStyle("width"),a=a.getStyle("height");c&&b.setAttribute("width",g(b.getAttribute("width"),c));a&&b.setAttribute("height",g(b.getAttribute("height"),a))}return b}})();(function(){function m(c){return c.replace(/'/g,"\\$&")}function n(c){for(var b,a=c.length,f=[],e=0;e<a;e++)b=c.charCodeAt(e),f.push(b);return"String.fromCharCode("+f.join(",")+")"}function o(c,b){var a=c.plugins.link,f=a.compiledProtectionFunction.params,e,d;d=[a.compiledProtectionFunction.name,"("];for(var g=0;g<f.length;g++)a=f[g].toLowerCase(),e=b[a],0<g&&d.push(","),d.push("'",e?m(encodeURIComponent(b[a])):"","'");d.push(")");return d.join("")}function l(c){var c=c.config.emailProtection||"",
b;c&&"encode"!=c&&(b={},c.replace(/^([^(]+)\(([^)]+)\)$/,function(a,c,e){b.name=c;b.params=[];e.replace(/[^,\s]+/g,function(a){b.params.push(a)})}));return b}CKEDITOR.plugins.add("link",{requires:"dialog,fakeobjects",onLoad:function(){function c(b){return a.replace(/%1/g,"rtl"==b?"right":"left").replace(/%2/g,"cke_contents_"+b)}var b="background:url("+CKEDITOR.getUrl(this.path+"images"+(CKEDITOR.env.hidpi?"/hidpi":"")+"/anchor.png")+") no-repeat %1 center;border:1px dotted #00f;background-size:16px;",
a=".%2 a.cke_anchor,.%2 a.cke_anchor_empty,.cke_editable.%2 a[name],.cke_editable.%2 a[data-cke-saved-name]{"+b+"padding-%1:18px;cursor:auto;}.%2 img.cke_anchor{"+b+"width:16px;min-height:15px;height:1.15em;vertical-align:text-bottom;}";CKEDITOR.addCss(c("ltr")+c("rtl"))},init:function(c){var b="a[!href]";CKEDITOR.dialog.isTabEnabled(c,"link","advanced")&&(b=b.replace("]",",accesskey,charset,dir,id,lang,name,rel,tabindex,title,type]{*}(*)"));CKEDITOR.dialog.isTabEnabled(c,"link","target")&&(b=b.replace("]",
",target,onclick]"));c.addCommand("link",new CKEDITOR.dialogCommand("link",{allowedContent:b,requiredContent:"a[href]"}));c.addCommand("anchor",new CKEDITOR.dialogCommand("anchor",{allowedContent:"a[!name,id]",requiredContent:"a[name]"}));c.addCommand("unlink",new CKEDITOR.unlinkCommand);c.addCommand("removeAnchor",new CKEDITOR.removeAnchorCommand);c.setKeystroke(CKEDITOR.CTRL+76,"link");c.ui.addButton&&(c.ui.addButton("Link",{label:c.lang.link.toolbar,command:"link",toolbar:"links,10"}),c.ui.addButton("Unlink",
{label:c.lang.link.unlink,command:"unlink",toolbar:"links,20"}),c.ui.addButton("Anchor",{label:c.lang.link.anchor.toolbar,command:"anchor",toolbar:"links,30"}));CKEDITOR.dialog.add("link",this.path+"dialogs/link.js");CKEDITOR.dialog.add("anchor",this.path+"dialogs/anchor.js");c.on("doubleclick",function(a){var b=CKEDITOR.plugins.link.getSelectedLink(c)||a.data.element;if(!b.isReadOnly())if(b.is("a")){a.data.dialog=b.getAttribute("name")&&(!b.getAttribute("href")||!b.getChildCount())?"anchor":"link";
a.data.link=b}else if(CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,b))a.data.dialog="anchor"},null,null,0);c.on("doubleclick",function(a){a.data.dialog in{link:1,anchor:1}&&a.data.link&&c.getSelection().selectElement(a.data.link)},null,null,20);c.addMenuItems&&c.addMenuItems({anchor:{label:c.lang.link.anchor.menu,command:"anchor",group:"anchor",order:1},removeAnchor:{label:c.lang.link.anchor.remove,command:"removeAnchor",group:"anchor",order:5},link:{label:c.lang.link.menu,command:"link",group:"link",
order:1},unlink:{label:c.lang.link.unlink,command:"unlink",group:"link",order:5}});c.contextMenu&&c.contextMenu.addListener(function(a){if(!a||a.isReadOnly())return null;a=CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,a);if(!a&&!(a=CKEDITOR.plugins.link.getSelectedLink(c)))return null;var b={};a.getAttribute("href")&&a.getChildCount()&&(b={link:CKEDITOR.TRISTATE_OFF,unlink:CKEDITOR.TRISTATE_OFF});if(a&&a.hasAttribute("name"))b.anchor=b.removeAnchor=CKEDITOR.TRISTATE_OFF;return b});this.compiledProtectionFunction=
l(c)},afterInit:function(c){c.dataProcessor.dataFilter.addRules({elements:{a:function(a){return!a.attributes.name?null:!a.children.length?c.createFakeParserElement(a,"cke_anchor","anchor"):null}}});var b=c._.elementsPath&&c._.elementsPath.filters;b&&b.push(function(a,b){if("a"==b&&(CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,a)||a.getAttribute("name")&&(!a.getAttribute("href")||!a.getChildCount())))return"anchor"})}});var p=/^javascript:/,q=/^mailto:([^?]+)(?:\?(.+))?$/,r=/subject=([^;?:@&=$,\/]*)/,
s=/body=([^;?:@&=$,\/]*)/,t=/^#(.*)$/,u=/^((?:http|https|ftp|news):\/\/)?(.*)$/,v=/^(_(?:self|top|parent|blank))$/,w=/^javascript:void\(location\.href='mailto:'\+String\.fromCharCode\(([^)]+)\)(?:\+'(.*)')?\)$/,x=/^javascript:([^(]+)\(([^)]+)\)$/,y=/\s*window.open\(\s*this\.href\s*,\s*(?:'([^']*)'|null)\s*,\s*'([^']*)'\s*\)\s*;\s*return\s*false;*\s*/,z=/(?:^|,)([^=]+)=(\d+|yes|no)/gi,j={id:"advId",dir:"advLangDir",accessKey:"advAccessKey",name:"advName",lang:"advLangCode",tabindex:"advTabIndex",title:"advTitle",
type:"advContentType","class":"advCSSClasses",charset:"advCharset",style:"advStyles",rel:"advRel"};CKEDITOR.plugins.link={getSelectedLink:function(c){var b=c.getSelection(),a=b.getSelectedElement();return a&&a.is("a")?a:(b=b.getRanges()[0])?(b.shrink(CKEDITOR.SHRINK_TEXT),c.elementPath(b.getCommonAncestor()).contains("a",1)):null},getEditorAnchors:function(c){for(var b=c.editable(),a=b.isInline()&&!c.plugins.divarea?c.document:b,b=a.getElementsByTag("a"),a=a.getElementsByTag("img"),f=[],e=0,d;d=b.getItem(e++);)if(d.data("cke-saved-name")||
d.hasAttribute("name"))f.push({name:d.data("cke-saved-name")||d.getAttribute("name"),id:d.getAttribute("id")});for(e=0;d=a.getItem(e++);)(d=this.tryRestoreFakeAnchor(c,d))&&f.push({name:d.getAttribute("name"),id:d.getAttribute("id")});return f},fakeAnchor:!0,tryRestoreFakeAnchor:function(c,b){if(b&&b.data("cke-real-element-type")&&"anchor"==b.data("cke-real-element-type")){var a=c.restoreRealElement(b);if(a.data("cke-saved-name"))return a}},parseLinkAttributes:function(c,b){var a=b&&(b.data("cke-saved-href")||
b.getAttribute("href"))||"",f=c.plugins.link.compiledProtectionFunction,e=c.config.emailProtection,d,g={};a.match(p)&&("encode"==e?a=a.replace(w,function(a,b,c){return"mailto:"+String.fromCharCode.apply(String,b.split(","))+(c&&c.replace(/\\'/g,"'"))}):e&&a.replace(x,function(a,b,c){if(b==f.name){g.type="email";for(var a=g.email={},b=/(^')|('$)/g,c=c.match(/[^,\s]+/g),d=c.length,e,h,i=0;i<d;i++)e=decodeURIComponent,h=c[i].replace(b,"").replace(/\\'/g,"'"),h=e(h),e=f.params[i].toLowerCase(),a[e]=h;
a.address=[a.name,a.domain].join("@")}}));if(!g.type)if(e=a.match(t))g.type="anchor",g.anchor={},g.anchor.name=g.anchor.id=e[1];else if(e=a.match(q)){d=a.match(r);a=a.match(s);g.type="email";var i=g.email={};i.address=e[1];d&&(i.subject=decodeURIComponent(d[1]));a&&(i.body=decodeURIComponent(a[1]))}else if(a&&(d=a.match(u)))g.type="url",g.url={},g.url.protocol=d[1],g.url.url=d[2];if(b){if(a=b.getAttribute("target"))g.target={type:a.match(v)?a:"frame",name:a};else if(a=(a=b.data("cke-pa-onclick")||
b.getAttribute("onclick"))&&a.match(y))for(g.target={type:"popup",name:a[1]};e=z.exec(a[2]);)("yes"==e[2]||"1"==e[2])&&!(e[1]in{height:1,width:1,top:1,left:1})?g.target[e[1]]=!0:isFinite(e[2])&&(g.target[e[1]]=e[2]);var a={},h;for(h in j)(e=b.getAttribute(h))&&(a[j[h]]=e);if(h=b.data("cke-saved-name")||a.advName)a.advName=h;CKEDITOR.tools.isEmpty(a)||(g.advanced=a)}return g},getLinkAttributes:function(c,b){var a=c.config.emailProtection||"",f={};switch(b.type){case "url":var a=b.url&&void 0!==b.url.protocol?
b.url.protocol:"http://",e=b.url&&CKEDITOR.tools.trim(b.url.url)||"";f["data-cke-saved-href"]=0===e.indexOf("/")?e:a+e;break;case "anchor":a=b.anchor&&b.anchor.id;f["data-cke-saved-href"]="#"+(b.anchor&&b.anchor.name||a||"");break;case "email":var d=b.email,e=d.address;switch(a){case "":case "encode":var g=encodeURIComponent(d.subject||""),i=encodeURIComponent(d.body||""),d=[];g&&d.push("subject="+g);i&&d.push("body="+i);d=d.length?"?"+d.join("&"):"";"encode"==a?(a=["javascript:void(location.href='mailto:'+",
n(e)],d&&a.push("+'",m(d),"'"),a.push(")")):a=["mailto:",e,d];break;default:a=e.split("@",2),d.name=a[0],d.domain=a[1],a=["javascript:",o(c,d)]}f["data-cke-saved-href"]=a.join("")}if(b.target)if("popup"==b.target.type){for(var a=["window.open(this.href, '",b.target.name||"","', '"],h="resizable status location toolbar menubar fullscreen scrollbars dependent".split(" "),e=h.length,g=function(a){b.target[a]&&h.push(a+"="+b.target[a])},d=0;d<e;d++)h[d]+=b.target[h[d]]?"=yes":"=no";g("width");g("left");
g("height");g("top");a.push(h.join(","),"'); return false;");f["data-cke-pa-onclick"]=a.join("")}else"notSet"!=b.target.type&&b.target.name&&(f.target=b.target.name);if(b.advanced){for(var k in j)(a=b.advanced[j[k]])&&(f[k]=a);f.name&&(f["data-cke-saved-name"]=f.name)}f["data-cke-saved-href"]&&(f.href=f["data-cke-saved-href"]);k=CKEDITOR.tools.extend({target:1,onclick:1,"data-cke-pa-onclick":1,"data-cke-saved-name":1},j);for(var l in f)delete k[l];return{set:f,removed:CKEDITOR.tools.objectKeys(k)}}};
CKEDITOR.unlinkCommand=function(){};CKEDITOR.unlinkCommand.prototype={exec:function(c){var b=new CKEDITOR.style({element:"a",type:CKEDITOR.STYLE_INLINE,alwaysRemoveElement:1});c.removeStyle(b)},refresh:function(c,b){var a=b.lastElement&&b.lastElement.getAscendant("a",!0);a&&"a"==a.getName()&&a.getAttribute("href")&&a.getChildCount()?this.setState(CKEDITOR.TRISTATE_OFF):this.setState(CKEDITOR.TRISTATE_DISABLED)},contextSensitive:1,startDisabled:1,requiredContent:"a[href]"};CKEDITOR.removeAnchorCommand=
function(){};CKEDITOR.removeAnchorCommand.prototype={exec:function(c){var b=c.getSelection(),a=b.createBookmarks(),f;if(b&&(f=b.getSelectedElement())&&(!f.getChildCount()?CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,f):f.is("a")))f.remove(1);else if(f=CKEDITOR.plugins.link.getSelectedLink(c))f.hasAttribute("href")?(f.removeAttributes({name:1,"data-cke-saved-name":1}),f.removeClass("cke_anchor")):f.remove(1);b.selectBookmarks(a)},requiredContent:"a[name]"};CKEDITOR.tools.extend(CKEDITOR.config,{linkShowAdvancedTab:!0,
linkShowTargetTab:!0})})();(function(){function E(b,k,e){function d(d){if((a=c[d?"getFirst":"getLast"]())&&(!a.is||!a.isBlockBoundary())&&(m=k.root[d?"getPrevious":"getNext"](CKEDITOR.dom.walker.invisible(!0)))&&(!m.is||!m.isBlockBoundary({br:1})))b.document.createElement("br")[d?"insertBefore":"insertAfter"](a)}for(var f=CKEDITOR.plugins.list.listToArray(k.root,e),g=[],i=0;i<k.contents.length;i++){var h=k.contents[i];if((h=h.getAscendant("li",!0))&&!h.getCustomData("list_item_processed"))g.push(h),CKEDITOR.dom.element.setMarker(e,
h,"list_item_processed",!0)}h=null;for(i=0;i<g.length;i++)h=g[i].getCustomData("listarray_index"),f[h].indent=-1;for(i=h+1;i<f.length;i++)if(f[i].indent>f[i-1].indent+1){g=f[i-1].indent+1-f[i].indent;for(h=f[i].indent;f[i]&&f[i].indent>=h;)f[i].indent+=g,i++;i--}var c=CKEDITOR.plugins.list.arrayToList(f,e,null,b.config.enterMode,k.root.getAttribute("dir")).listNode,a,m;d(!0);d();c.replace(k.root);b.fire("contentDomInvalidated")}function x(b,k){this.name=b;this.context=this.type=k;this.allowedContent=
k+" li";this.requiredContent=k}function A(b,k,e,d){for(var f,g;f=b[d?"getLast":"getFirst"](F);)(g=f.getDirection(1))!==k.getDirection(1)&&f.setAttribute("dir",g),f.remove(),e?f[d?"insertBefore":"insertAfter"](e):k.append(f,d)}function B(b){function k(e){var d=b[e?"getPrevious":"getNext"](q);d&&(d.type==CKEDITOR.NODE_ELEMENT&&d.is(b.getName()))&&(A(b,d,null,!e),b.remove(),b=d)}k();k(1)}function C(b){return b.type==CKEDITOR.NODE_ELEMENT&&(b.getName()in CKEDITOR.dtd.$block||b.getName()in CKEDITOR.dtd.$listItem)&&
CKEDITOR.dtd[b.getName()]["#"]}function y(b,k,e){b.fire("saveSnapshot");e.enlarge(CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS);var d=e.extractContents();k.trim(!1,!0);var f=k.createBookmark(),g=new CKEDITOR.dom.elementPath(k.startContainer),i=g.block,g=g.lastElement.getAscendant("li",1)||i,h=new CKEDITOR.dom.elementPath(e.startContainer),c=h.contains(CKEDITOR.dtd.$listItem),h=h.contains(CKEDITOR.dtd.$list);i?(i=i.getBogus())&&i.remove():h&&(i=h.getPrevious(q))&&v(i)&&i.remove();(i=d.getLast())&&(i.type==
CKEDITOR.NODE_ELEMENT&&i.is("br"))&&i.remove();(i=k.startContainer.getChild(k.startOffset))?d.insertBefore(i):k.startContainer.append(d);if(c&&(d=w(c)))g.contains(c)?(A(d,c.getParent(),c),d.remove()):g.append(d);for(;e.checkStartOfBlock()&&e.checkEndOfBlock();){h=e.startPath();d=h.block;if(!d)break;d.is("li")&&(g=d.getParent(),d.equals(g.getLast(q))&&d.equals(g.getFirst(q))&&(d=g));e.moveToPosition(d,CKEDITOR.POSITION_BEFORE_START);d.remove()}e=e.clone();d=b.editable();e.setEndAt(d,CKEDITOR.POSITION_BEFORE_END);
e=new CKEDITOR.dom.walker(e);e.evaluator=function(a){return q(a)&&!v(a)};(e=e.next())&&(e.type==CKEDITOR.NODE_ELEMENT&&e.getName()in CKEDITOR.dtd.$list)&&B(e);k.moveToBookmark(f);k.select();b.fire("saveSnapshot")}function w(b){return(b=b.getLast(q))&&b.type==CKEDITOR.NODE_ELEMENT&&b.getName()in r?b:null}var r={ol:1,ul:1},G=CKEDITOR.dom.walker.whitespaces(),D=CKEDITOR.dom.walker.bookmark(),q=function(b){return!(G(b)||D(b))},v=CKEDITOR.dom.walker.bogus();CKEDITOR.plugins.list={listToArray:function(b,
k,e,d,f){if(!r[b.getName()])return[];d||(d=0);e||(e=[]);for(var g=0,i=b.getChildCount();g<i;g++){var h=b.getChild(g);h.type==CKEDITOR.NODE_ELEMENT&&h.getName()in CKEDITOR.dtd.$list&&CKEDITOR.plugins.list.listToArray(h,k,e,d+1);if("li"==h.$.nodeName.toLowerCase()){var c={parent:b,indent:d,element:h,contents:[]};f?c.grandparent=f:(c.grandparent=b.getParent(),c.grandparent&&"li"==c.grandparent.$.nodeName.toLowerCase()&&(c.grandparent=c.grandparent.getParent()));k&&CKEDITOR.dom.element.setMarker(k,h,
"listarray_index",e.length);e.push(c);for(var a=0,m=h.getChildCount(),j;a<m;a++)j=h.getChild(a),j.type==CKEDITOR.NODE_ELEMENT&&r[j.getName()]?CKEDITOR.plugins.list.listToArray(j,k,e,d+1,c.grandparent):c.contents.push(j)}}return e},arrayToList:function(b,k,e,d,f){e||(e=0);if(!b||b.length<e+1)return null;for(var g,i=b[e].parent.getDocument(),h=new CKEDITOR.dom.documentFragment(i),c=null,a=e,m=Math.max(b[e].indent,0),j=null,n,l,p=d==CKEDITOR.ENTER_P?"p":"div";;){var o=b[a];g=o.grandparent;n=o.element.getDirection(1);
if(o.indent==m){if(!c||b[a].parent.getName()!=c.getName())c=b[a].parent.clone(!1,1),f&&c.setAttribute("dir",f),h.append(c);j=c.append(o.element.clone(0,1));n!=c.getDirection(1)&&j.setAttribute("dir",n);for(g=0;g<o.contents.length;g++)j.append(o.contents[g].clone(1,1));a++}else if(o.indent==Math.max(m,0)+1)o=b[a-1].element.getDirection(1),a=CKEDITOR.plugins.list.arrayToList(b,null,a,d,o!=n?n:null),!j.getChildCount()&&(CKEDITOR.env.needsNbspFiller&&7>=i.$.documentMode)&&j.append(i.createText(" ")),
j.append(a.listNode),a=a.nextIndex;else if(-1==o.indent&&!e&&g){r[g.getName()]?(j=o.element.clone(!1,!0),n!=g.getDirection(1)&&j.setAttribute("dir",n)):j=new CKEDITOR.dom.documentFragment(i);var c=g.getDirection(1)!=n,u=o.element,z=u.getAttribute("class"),v=u.getAttribute("style"),w=j.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT&&(d!=CKEDITOR.ENTER_BR||c||v||z),s,x=o.contents.length,t;for(g=0;g<x;g++)if(s=o.contents[g],D(s)&&1<x)w?t=s.clone(1,1):j.append(s.clone(1,1));else if(s.type==CKEDITOR.NODE_ELEMENT&&
s.isBlockBoundary()){c&&!s.getDirection()&&s.setAttribute("dir",n);l=s;var y=u.getAttribute("style");y&&l.setAttribute("style",y.replace(/([^;])$/,"$1;")+(l.getAttribute("style")||""));z&&s.addClass(z);l=null;t&&(j.append(t),t=null);j.append(s.clone(1,1))}else w?(l||(l=i.createElement(p),j.append(l),c&&l.setAttribute("dir",n)),v&&l.setAttribute("style",v),z&&l.setAttribute("class",z),t&&(l.append(t),t=null),l.append(s.clone(1,1))):j.append(s.clone(1,1));t&&((l||j).append(t),t=null);j.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT&&
a!=b.length-1&&(CKEDITOR.env.needsBrFiller&&(n=j.getLast())&&(n.type==CKEDITOR.NODE_ELEMENT&&n.is("br"))&&n.remove(),n=j.getLast(q),(!n||!(n.type==CKEDITOR.NODE_ELEMENT&&n.is(CKEDITOR.dtd.$block)))&&j.append(i.createElement("br")));n=j.$.nodeName.toLowerCase();("div"==n||"p"==n)&&j.appendBogus();h.append(j);c=null;a++}else return null;l=null;if(b.length<=a||Math.max(b[a].indent,0)<m)break}if(k)for(b=h.getFirst();b;){if(b.type==CKEDITOR.NODE_ELEMENT&&(CKEDITOR.dom.element.clearMarkers(k,b),b.getName()in
CKEDITOR.dtd.$listItem&&(e=b,i=f=d=void 0,d=e.getDirection()))){for(f=e.getParent();f&&!(i=f.getDirection());)f=f.getParent();d==i&&e.removeAttribute("dir")}b=b.getNextSourceNode()}return{listNode:h,nextIndex:a}}};var H=/^h[1-6]$/,F=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT);x.prototype={exec:function(b){this.refresh(b,b.elementPath());var k=b.config,e=b.getSelection(),d=e&&e.getRanges();if(this.state==CKEDITOR.TRISTATE_OFF){var f=b.editable();if(f.getFirst(q)){var g=1==d.length&&d[0];(k=
g&&g.getEnclosedNode())&&(k.is&&this.type==k.getName())&&this.setState(CKEDITOR.TRISTATE_ON)}else k.enterMode==CKEDITOR.ENTER_BR?f.appendBogus():d[0].fixBlock(1,k.enterMode==CKEDITOR.ENTER_P?"p":"div"),e.selectRanges(d)}for(var k=e.createBookmarks(!0),f=[],i={},d=d.createIterator(),h=0;(g=d.getNextRange())&&++h;){var c=g.getBoundaryNodes(),a=c.startNode,m=c.endNode;a.type==CKEDITOR.NODE_ELEMENT&&"td"==a.getName()&&g.setStartAt(c.startNode,CKEDITOR.POSITION_AFTER_START);m.type==CKEDITOR.NODE_ELEMENT&&
"td"==m.getName()&&g.setEndAt(c.endNode,CKEDITOR.POSITION_BEFORE_END);g=g.createIterator();for(g.forceBrBreak=this.state==CKEDITOR.TRISTATE_OFF;c=g.getNextParagraph();)if(!c.getCustomData("list_block")){CKEDITOR.dom.element.setMarker(i,c,"list_block",1);for(var j=b.elementPath(c),a=j.elements,m=0,j=j.blockLimit,n,l=a.length-1;0<=l&&(n=a[l]);l--)if(r[n.getName()]&&j.contains(n)){j.removeCustomData("list_group_object_"+h);(a=n.getCustomData("list_group_object"))?a.contents.push(c):(a={root:n,contents:[c]},
f.push(a),CKEDITOR.dom.element.setMarker(i,n,"list_group_object",a));m=1;break}m||(m=j,m.getCustomData("list_group_object_"+h)?m.getCustomData("list_group_object_"+h).contents.push(c):(a={root:m,contents:[c]},CKEDITOR.dom.element.setMarker(i,m,"list_group_object_"+h,a),f.push(a)))}}for(n=[];0<f.length;)if(a=f.shift(),this.state==CKEDITOR.TRISTATE_OFF)if(r[a.root.getName()]){d=b;h=a;a=i;g=n;m=CKEDITOR.plugins.list.listToArray(h.root,a);j=[];for(c=0;c<h.contents.length;c++)if(l=h.contents[c],(l=l.getAscendant("li",
!0))&&!l.getCustomData("list_item_processed"))j.push(l),CKEDITOR.dom.element.setMarker(a,l,"list_item_processed",!0);for(var l=h.root.getDocument(),p=void 0,o=void 0,c=0;c<j.length;c++){var u=j[c].getCustomData("listarray_index"),p=m[u].parent;p.is(this.type)||(o=l.createElement(this.type),p.copyAttributes(o,{start:1,type:1}),o.removeStyle("list-style-type"),m[u].parent=o)}a=CKEDITOR.plugins.list.arrayToList(m,a,null,d.config.enterMode);m=void 0;j=a.listNode.getChildCount();for(c=0;c<j&&(m=a.listNode.getChild(c));c++)m.getName()==
this.type&&g.push(m);a.listNode.replace(h.root);d.fire("contentDomInvalidated")}else{m=b;c=a;g=n;j=c.contents;d=c.root.getDocument();h=[];1==j.length&&j[0].equals(c.root)&&(a=d.createElement("div"),j[0].moveChildren&&j[0].moveChildren(a),j[0].append(a),j[0]=a);c=c.contents[0].getParent();for(l=0;l<j.length;l++)c=c.getCommonAncestor(j[l].getParent());p=m.config.useComputedState;m=a=void 0;p=void 0===p||p;for(l=0;l<j.length;l++)for(o=j[l];u=o.getParent();){if(u.equals(c)){h.push(o);!m&&o.getDirection()&&
(m=1);o=o.getDirection(p);null!==a&&(a=a&&a!=o?null:o);break}o=u}if(!(1>h.length)){j=h[h.length-1].getNext();l=d.createElement(this.type);g.push(l);for(p=g=void 0;h.length;)g=h.shift(),p=d.createElement("li"),g.is("pre")||H.test(g.getName())||"false"==g.getAttribute("contenteditable")?g.appendTo(p):(g.copyAttributes(p),a&&g.getDirection()&&(p.removeStyle("direction"),p.removeAttribute("dir")),g.moveChildren(p),g.remove()),p.appendTo(l);a&&m&&l.setAttribute("dir",a);j?l.insertBefore(j):l.appendTo(c)}}else this.state==
CKEDITOR.TRISTATE_ON&&r[a.root.getName()]&&E.call(this,b,a,i);for(l=0;l<n.length;l++)B(n[l]);CKEDITOR.dom.element.clearAllMarkers(i);e.selectBookmarks(k);b.focus()},refresh:function(b,k){var e=k.contains(r,1),d=k.blockLimit||k.root;e&&d.contains(e)?this.setState(e.is(this.type)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF):this.setState(CKEDITOR.TRISTATE_OFF)}};CKEDITOR.plugins.add("list",{requires:"indentlist",init:function(b){b.blockless||(b.addCommand("numberedlist",new x("numberedlist","ol")),b.addCommand("bulletedlist",
new x("bulletedlist","ul")),b.ui.addButton&&(b.ui.addButton("NumberedList",{label:b.lang.list.numberedlist,command:"numberedlist",directional:!0,toolbar:"list,10"}),b.ui.addButton("BulletedList",{label:b.lang.list.bulletedlist,command:"bulletedlist",directional:!0,toolbar:"list,20"})),b.on("key",function(k){var e=k.data.domEvent.getKey(),d;if(b.mode=="wysiwyg"&&e in{8:1,46:1}){var f=b.getSelection().getRanges()[0],g=f&&f.startPath();if(f&&f.collapsed){var i=e==8,h=b.editable(),c=new CKEDITOR.dom.walker(f.clone());
c.evaluator=function(a){return q(a)&&!v(a)};c.guard=function(a,b){return!(b&&a.type==CKEDITOR.NODE_ELEMENT&&a.is("table"))};e=f.clone();if(i){var a;if((a=g.contains(r))&&f.checkBoundaryOfElement(a,CKEDITOR.START)&&(a=a.getParent())&&a.is("li")&&(a=w(a))){d=a;a=a.getPrevious(q);e.moveToPosition(a&&v(a)?a:d,CKEDITOR.POSITION_BEFORE_START)}else{c.range.setStartAt(h,CKEDITOR.POSITION_AFTER_START);c.range.setEnd(f.startContainer,f.startOffset);if((a=c.previous())&&a.type==CKEDITOR.NODE_ELEMENT&&(a.getName()in
r||a.is("li"))){if(!a.is("li")){c.range.selectNodeContents(a);c.reset();c.evaluator=C;a=c.previous()}d=a;e.moveToElementEditEnd(d)}}if(d){y(b,e,f);k.cancel()}else if((e=g.contains(r))&&f.checkBoundaryOfElement(e,CKEDITOR.START)){d=e.getFirst(q);if(f.checkBoundaryOfElement(d,CKEDITOR.START)){a=e.getPrevious(q);if(w(d)){if(a){f.moveToElementEditEnd(a);f.select()}}else b.execCommand("outdent");k.cancel()}}}else if(d=g.contains("li")){c.range.setEndAt(h,CKEDITOR.POSITION_BEFORE_END);d=(g=d.getLast(q))&&
C(g)?g:d;h=0;if((a=c.next())&&a.type==CKEDITOR.NODE_ELEMENT&&a.getName()in r&&a.equals(g)){h=1;a=c.next()}else f.checkBoundaryOfElement(d,CKEDITOR.END)&&(h=1);if(h&&a){f=f.clone();f.moveToElementEditStart(a);y(b,e,f);k.cancel()}}else{c.range.setEndAt(h,CKEDITOR.POSITION_BEFORE_END);if((a=c.next())&&a.type==CKEDITOR.NODE_ELEMENT&&a.is(r)){a=a.getFirst(q);if(g.block&&f.checkStartOfBlock()&&f.checkEndOfBlock()){g.block.remove();f.moveToElementEditStart(a);f.select()}else if(w(a)){f.moveToElementEditStart(a);
f.select()}else{f=f.clone();f.moveToElementEditStart(a);y(b,e,f)}k.cancel()}}setTimeout(function(){b.selectionChange(1)})}}}))}})})();(function(){function l(a){if(!a||a.type!=CKEDITOR.NODE_ELEMENT||"form"!=a.getName())return[];for(var e=[],f=["style","className"],b=0;b<f.length;b++){var d=a.$.elements.namedItem(f[b]);d&&(d=new CKEDITOR.dom.element(d),e.push([d,d.nextSibling]),d.remove())}return e}function o(a,e){if(a&&!(a.type!=CKEDITOR.NODE_ELEMENT||"form"!=a.getName())&&0<e.length)for(var f=e.length-1;0<=f;f--){var b=e[f][0],d=e[f][1];d?b.insertBefore(d):b.appendTo(a)}}function n(a,e){var f=l(a),b={},d=a.$;e||(b["class"]=d.className||
"",d.className="");b.inline=d.style.cssText||"";e||(d.style.cssText="position: static; overflow: visible");o(f);return b}function p(a,e){var f=l(a),b=a.$;"class"in e&&(b.className=e["class"]);"inline"in e&&(b.style.cssText=e.inline);o(f)}function q(a){if(!a.editable().isInline()){var e=CKEDITOR.instances,f;for(f in e){var b=e[f];"wysiwyg"==b.mode&&!b.readOnly&&(b=b.document.getBody(),b.setAttribute("contentEditable",!1),b.setAttribute("contentEditable",!0))}a.editable().hasFocus&&(a.toolbox.focus(),
a.focus())}}CKEDITOR.plugins.add("maximize",{init:function(a){function e(){var b=d.getViewPaneSize();a.resize(b.width,b.height,null,!0)}if(a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var f=a.lang,b=CKEDITOR.document,d=b.getWindow(),j,k,m,l=CKEDITOR.TRISTATE_OFF;a.addCommand("maximize",{modes:{wysiwyg:!CKEDITOR.env.iOS,source:!CKEDITOR.env.iOS},readOnly:1,editorFocus:!1,exec:function(){var h=a.container.getFirst(function(a){return a.type==CKEDITOR.NODE_ELEMENT&&a.hasClass("cke_inner")}),g=a.ui.space("contents");
if("wysiwyg"==a.mode){var c=a.getSelection();j=c&&c.getRanges();k=d.getScrollPosition()}else{var i=a.editable().$;j=!CKEDITOR.env.ie&&[i.selectionStart,i.selectionEnd];k=[i.scrollLeft,i.scrollTop]}if(this.state==CKEDITOR.TRISTATE_OFF){d.on("resize",e);m=d.getScrollPosition();for(c=a.container;c=c.getParent();)c.setCustomData("maximize_saved_styles",n(c)),c.setStyle("z-index",a.config.baseFloatZIndex-5);g.setCustomData("maximize_saved_styles",n(g,!0));h.setCustomData("maximize_saved_styles",n(h,!0));
g={overflow:CKEDITOR.env.webkit?"":"hidden",width:0,height:0};b.getDocumentElement().setStyles(g);!CKEDITOR.env.gecko&&b.getDocumentElement().setStyle("position","fixed");(!CKEDITOR.env.gecko||!CKEDITOR.env.quirks)&&b.getBody().setStyles(g);CKEDITOR.env.ie?setTimeout(function(){d.$.scrollTo(0,0)},0):d.$.scrollTo(0,0);h.setStyle("position",CKEDITOR.env.gecko&&CKEDITOR.env.quirks?"fixed":"absolute");h.$.offsetLeft;h.setStyles({"z-index":a.config.baseFloatZIndex-5,left:"0px",top:"0px"});h.addClass("cke_maximized");
e();g=h.getDocumentPosition();h.setStyles({left:-1*g.x+"px",top:-1*g.y+"px"});CKEDITOR.env.gecko&&q(a)}else if(this.state==CKEDITOR.TRISTATE_ON){d.removeListener("resize",e);g=[g,h];for(c=0;c<g.length;c++)p(g[c],g[c].getCustomData("maximize_saved_styles")),g[c].removeCustomData("maximize_saved_styles");for(c=a.container;c=c.getParent();)p(c,c.getCustomData("maximize_saved_styles")),c.removeCustomData("maximize_saved_styles");CKEDITOR.env.ie?setTimeout(function(){d.$.scrollTo(m.x,m.y)},0):d.$.scrollTo(m.x,
m.y);h.removeClass("cke_maximized");CKEDITOR.env.webkit&&(h.setStyle("display","inline"),setTimeout(function(){h.setStyle("display","block")},0));a.fire("resize")}this.toggleState();if(c=this.uiItems[0])g=this.state==CKEDITOR.TRISTATE_OFF?f.maximize.maximize:f.maximize.minimize,c=CKEDITOR.document.getById(c._.id),c.getChild(1).setHtml(g),c.setAttribute("title",g),c.setAttribute("href",'javascript:void("'+g+'");');"wysiwyg"==a.mode?j?(CKEDITOR.env.gecko&&q(a),a.getSelection().selectRanges(j),(i=a.getSelection().getStartElement())&&
i.scrollIntoView(!0)):d.$.scrollTo(k.x,k.y):(j&&(i.selectionStart=j[0],i.selectionEnd=j[1]),i.scrollLeft=k[0],i.scrollTop=k[1]);j=k=null;l=this.state;a.fire("maximize",this.state)},canUndo:!1});a.ui.addButton&&a.ui.addButton("Maximize",{label:f.maximize.maximize,command:"maximize",toolbar:"tools,10"});a.on("mode",function(){var b=a.getCommand("maximize");b.setState(b.state==CKEDITOR.TRISTATE_DISABLED?CKEDITOR.TRISTATE_DISABLED:l)},null,null,100)}}})})();(function(){function h(a,d,f){var b=CKEDITOR.cleanWord;b?f():(a=CKEDITOR.getUrl(a.config.pasteFromWordCleanupFile||d+"filter/default.js"),CKEDITOR.scriptLoader.load(a,f,null,!0));return!b}function i(a){a.data.type="html"}CKEDITOR.plugins.add("pastefromword",{requires:"clipboard",init:function(a){var d=0,f=this.path;a.addCommand("pastefromword",{canUndo:!1,async:!0,exec:function(a){var e=this;d=1;a.once("beforePaste",i);a.getClipboardData({title:a.lang.pastefromword.title},function(c){c&&a.fire("paste",
{type:"html",dataValue:c.dataValue});a.fire("afterCommandExec",{name:"pastefromword",command:e,returnValue:!!c})})}});a.ui.addButton&&a.ui.addButton("PasteFromWord",{label:a.lang.pastefromword.toolbar,command:"pastefromword",toolbar:"clipboard,50"});a.on("pasteState",function(b){a.getCommand("pastefromword").setState(b.data)});a.on("paste",function(b){var e=b.data,c=e.dataValue;if(c&&(d||/(class=\"?Mso|style=\"[^\"]*\bmso\-|w:WordDocument)/.test(c))){var g=h(a,f,function(){if(g)a.fire("paste",e);
else if(!a.config.pasteFromWordPromptCleanup||d||confirm(a.lang.pastefromword.confirmCleanup))e.dataValue=CKEDITOR.cleanWord(c,a);d=0});g&&b.cancel()}},null,null,3)}})})();(function(){var c={canUndo:!1,async:!0,exec:function(a){a.getClipboardData({title:a.lang.pastetext.title},function(b){b&&a.fire("paste",{type:"text",dataValue:b.dataValue});a.fire("afterCommandExec",{name:"pastetext",command:c,returnValue:!!b})})}};CKEDITOR.plugins.add("pastetext",{requires:"clipboard",init:function(a){a.addCommand("pastetext",c);a.ui.addButton&&a.ui.addButton("PasteText",{label:a.lang.pastetext.button,command:"pastetext",toolbar:"clipboard,40"});if(a.config.forcePasteAsPlainText)a.on("beforePaste",
function(a){"html"!=a.data.type&&(a.data.type="text")});a.on("pasteState",function(b){a.getCommand("pastetext").setState(b.data)})}})})();CKEDITOR.plugins.add("removeformat",{init:function(a){a.addCommand("removeFormat",CKEDITOR.plugins.removeformat.commands.removeformat);a.ui.addButton&&a.ui.addButton("RemoveFormat",{label:a.lang.removeformat.toolbar,command:"removeFormat",toolbar:"cleanup,10"})}});
CKEDITOR.plugins.removeformat={commands:{removeformat:{exec:function(a){for(var h=a._.removeFormatRegex||(a._.removeFormatRegex=RegExp("^(?:"+a.config.removeFormatTags.replace(/,/g,"|")+")$","i")),e=a._.removeAttributes||(a._.removeAttributes=a.config.removeFormatAttributes.split(",")),f=CKEDITOR.plugins.removeformat.filter,k=a.getSelection().getRanges(),l=k.createIterator(),m=function(a){return a.type==CKEDITOR.NODE_ELEMENT},c;c=l.getNextRange();){c.collapsed||c.enlarge(CKEDITOR.ENLARGE_ELEMENT);
var j=c.createBookmark(),b=j.startNode,d=j.endNode,i=function(b){for(var c=a.elementPath(b),e=c.elements,d=1,g;(g=e[d])&&!g.equals(c.block)&&!g.equals(c.blockLimit);d++)h.test(g.getName())&&f(a,g)&&b.breakParent(g)};i(b);if(d){i(d);for(b=b.getNextSourceNode(!0,CKEDITOR.NODE_ELEMENT);b&&!b.equals(d);)if(b.isReadOnly()){if(b.getPosition(d)&CKEDITOR.POSITION_CONTAINS)break;b=b.getNext(m)}else i=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT),!("img"==b.getName()&&b.data("cke-realelement"))&&f(a,b)&&(h.test(b.getName())?
b.remove(1):(b.removeAttributes(e),a.fire("removeFormatCleanup",b))),b=i}c.moveToBookmark(j)}a.forceNextSelectionCheck();a.getSelection().selectRanges(k)}}},filter:function(a,h){for(var e=a._.removeFormatFilters||[],f=0;f<e.length;f++)if(!1===e[f](h))return!1;return!0}};CKEDITOR.editor.prototype.addRemoveFormatFilter=function(a){this._.removeFormatFilters||(this._.removeFormatFilters=[]);this._.removeFormatFilters.push(a)};CKEDITOR.config.removeFormatTags="b,big,cite,code,del,dfn,em,font,i,ins,kbd,q,s,samp,small,span,strike,strong,sub,sup,tt,u,var";
CKEDITOR.config.removeFormatAttributes="class,style,lang,width,height,align,hspace,valign";CKEDITOR.plugins.add("resize",{init:function(b){var f,g,n,o;function c(d){var e=f,l=g,c=e+(d.data.$.screenX-n)*("rtl"==h?-1:1),d=l+(d.data.$.screenY-o);i&&(e=Math.max(a.resize_minWidth,Math.min(c,a.resize_maxWidth)));m&&(l=Math.max(a.resize_minHeight,Math.min(d,a.resize_maxHeight)));b.resize(i?e:null,l)}function j(){CKEDITOR.document.removeListener("mousemove",c);CKEDITOR.document.removeListener("mouseup",j);b.document&&(b.document.removeListener("mousemove",c),b.document.removeListener("mouseup",
j))}var a=b.config,q=b.ui.spaceId("resizer"),h=b.element?b.element.getDirection(1):"ltr";!a.resize_dir&&(a.resize_dir="vertical");void 0===a.resize_maxWidth&&(a.resize_maxWidth=3E3);void 0===a.resize_maxHeight&&(a.resize_maxHeight=3E3);void 0===a.resize_minWidth&&(a.resize_minWidth=750);void 0===a.resize_minHeight&&(a.resize_minHeight=250);if(!1!==a.resize_enabled){var k=null,i=("both"==a.resize_dir||"horizontal"==a.resize_dir)&&a.resize_minWidth!=a.resize_maxWidth,m=("both"==a.resize_dir||"vertical"==
a.resize_dir)&&a.resize_minHeight!=a.resize_maxHeight,p=CKEDITOR.tools.addFunction(function(d){k||(k=b.getResizable());f=k.$.offsetWidth||0;g=k.$.offsetHeight||0;n=d.screenX;o=d.screenY;a.resize_minWidth>f&&(a.resize_minWidth=f);a.resize_minHeight>g&&(a.resize_minHeight=g);CKEDITOR.document.on("mousemove",c);CKEDITOR.document.on("mouseup",j);b.document&&(b.document.on("mousemove",c),b.document.on("mouseup",j));d.preventDefault&&d.preventDefault()});b.on("destroy",function(){CKEDITOR.tools.removeFunction(p)});
b.on("uiSpace",function(a){if("bottom"==a.data.space){var e="";i&&!m&&(e=" cke_resizer_horizontal");!i&&m&&(e=" cke_resizer_vertical");var c='<span id="'+q+'" class="cke_resizer'+e+" cke_resizer_"+h+'" title="'+CKEDITOR.tools.htmlEncode(b.lang.common.resize)+'" onmousedown="CKEDITOR.tools.callFunction('+p+', event)">'+("ltr"==h?"◢":"◣")+"</span>";"ltr"==h&&"ltr"==e?a.data.html+=c:a.data.html=c+a.data.html}},b,null,100);b.on("maximize",function(a){b.ui.space("resizer")[a.data==CKEDITOR.TRISTATE_ON?
"hide":"show"]()})}}});(function(){CKEDITOR.plugins.add("sourcearea",{init:function(a){function d(){var a=e&&this.equals(CKEDITOR.document.getActive());this.hide();this.setStyle("height",this.getParent().$.clientHeight+"px");this.setStyle("width",this.getParent().$.clientWidth+"px");this.show();a&&this.focus()}if(a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var f=CKEDITOR.plugins.sourcearea;a.addMode("source",function(e){var b=a.ui.space("contents").getDocument().createElement("textarea");b.setStyles(CKEDITOR.tools.extend({width:CKEDITOR.env.ie7Compat?
"99%":"100%",height:"100%",resize:"none",outline:"none","text-align":"left"},CKEDITOR.tools.cssVendorPrefix("tab-size",a.config.sourceAreaTabSize||4)));b.setAttribute("dir","ltr");b.addClass("cke_source cke_reset cke_enable_context_menu");a.ui.space("contents").append(b);b=a.editable(new c(a,b));b.setData(a.getData(1));CKEDITOR.env.ie&&(b.attachListener(a,"resize",d,b),b.attachListener(CKEDITOR.document.getWindow(),"resize",d,b),CKEDITOR.tools.setTimeout(d,0,b));a.fire("ariaWidget",this);e()});a.addCommand("source",
f.commands.source);a.ui.addButton&&a.ui.addButton("Source",{label:a.lang.sourcearea.toolbar,command:"source",toolbar:"mode,10"});a.on("mode",function(){a.getCommand("source").setState("source"==a.mode?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)});var e=CKEDITOR.env.ie&&9==CKEDITOR.env.version}}});var c=CKEDITOR.tools.createClass({base:CKEDITOR.editable,proto:{setData:function(a){this.setValue(a);this.status="ready";this.editor.fire("dataReady")},getData:function(){return this.getValue()},insertHtml:function(){},
insertElement:function(){},insertText:function(){},setReadOnly:function(a){this[(a?"set":"remove")+"Attribute"]("readOnly","readonly")},detach:function(){c.baseProto.detach.call(this);this.clearCustomData();this.remove()}}})})();CKEDITOR.plugins.sourcearea={commands:{source:{modes:{wysiwyg:1,source:1},editorFocus:!1,readOnly:1,exec:function(c){"wysiwyg"==c.mode&&c.fire("saveSnapshot");c.getCommand("source").setState(CKEDITOR.TRISTATE_DISABLED);c.setMode("source"==c.mode?"wysiwyg":"source")},canUndo:!1}}};(function(){CKEDITOR.plugins.add("stylescombo",{requires:"richcombo",init:function(c){var j=c.config,g=c.lang.stylescombo,f={},i=[],k=[];c.on("stylesSet",function(b){if(b=b.data.styles){for(var a,h,d,e=0,l=b.length;e<l;e++)if(a=b[e],!(c.blockless&&a.element in CKEDITOR.dtd.$block)&&(h=a.name,a=new CKEDITOR.style(a),!c.filter.customConfig||c.filter.check(a)))a._name=h,a._.enterMode=j.enterMode,a._.type=d=a.assignedTo||a.type,a._.weight=e+1E3*(d==CKEDITOR.STYLE_OBJECT?1:d==CKEDITOR.STYLE_BLOCK?2:3),
f[h]=a,i.push(a),k.push(a);i.sort(function(a,b){return a._.weight-b._.weight})}});c.ui.addRichCombo("Styles",{label:g.label,title:g.panelTitle,toolbar:"styles,10",allowedContent:k,panel:{css:[CKEDITOR.skin.getPath("editor")].concat(j.contentsCss),multiSelect:!0,attributes:{"aria-label":g.panelTitle}},init:function(){var b,a,c,d,e,f;e=0;for(f=i.length;e<f;e++)b=i[e],a=b._name,d=b._.type,d!=c&&(this.startGroup(g["panelTitle"+d]),c=d),this.add(a,b.type==CKEDITOR.STYLE_OBJECT?a:b.buildPreview(),a);this.commit()},
onClick:function(b){c.focus();c.fire("saveSnapshot");var b=f[b],a=c.elementPath();c[b.checkActive(a,c)?"removeStyle":"applyStyle"](b);c.fire("saveSnapshot")},onRender:function(){c.on("selectionChange",function(b){for(var a=this.getValue(),b=b.data.path.elements,h=0,d=b.length,e;h<d;h++){e=b[h];for(var g in f)if(f[g].checkElementRemovable(e,!0,c)){g!=a&&this.setValue(g);return}}this.setValue("")},this)},onOpen:function(){var b=c.getSelection().getSelectedElement(),b=c.elementPath(b),a=[0,0,0,0];this.showAll();
this.unmarkAll();for(var h in f){var d=f[h],e=d._.type;d.checkApplicable(b,c,c.activeFilter)?a[e]++:this.hideItem(h);d.checkActive(b,c)&&this.mark(h)}a[CKEDITOR.STYLE_BLOCK]||this.hideGroup(g["panelTitle"+CKEDITOR.STYLE_BLOCK]);a[CKEDITOR.STYLE_INLINE]||this.hideGroup(g["panelTitle"+CKEDITOR.STYLE_INLINE]);a[CKEDITOR.STYLE_OBJECT]||this.hideGroup(g["panelTitle"+CKEDITOR.STYLE_OBJECT])},refresh:function(){var b=c.elementPath();if(b){for(var a in f)if(f[a].checkApplicable(b,c,c.activeFilter))return;
this.setState(CKEDITOR.TRISTATE_DISABLED)}},reset:function(){f={};i=[]}})}})})();(function(){function i(c){return{editorFocus:!1,canUndo:!1,modes:{wysiwyg:1},exec:function(d){if(d.editable().hasFocus){var e=d.getSelection(),b;if(b=(new CKEDITOR.dom.elementPath(e.getCommonAncestor(),e.root)).contains({td:1,th:1},1)){var e=d.createRange(),a=CKEDITOR.tools.tryThese(function(){var a=b.getParent().$.cells[b.$.cellIndex+(c?-1:1)];a.parentNode.parentNode;return a},function(){var a=b.getParent(),a=a.getAscendant("table").$.rows[a.$.rowIndex+(c?-1:1)];return a.cells[c?a.cells.length-1:
0]});if(!a&&!c){for(var f=b.getAscendant("table").$,a=b.getParent().$.cells,f=new CKEDITOR.dom.element(f.insertRow(-1),d.document),g=0,h=a.length;g<h;g++)f.append((new CKEDITOR.dom.element(a[g],d.document)).clone(!1,!1)).appendBogus();e.moveToElementEditStart(f)}else if(a)a=new CKEDITOR.dom.element(a),e.moveToElementEditStart(a),(!e.checkStartOfBlock()||!e.checkEndOfBlock())&&e.selectNodeContents(a);else return!0;e.select(!0);return!0}}return!1}}}var h={editorFocus:!1,modes:{wysiwyg:1,source:1}},
g={exec:function(c){c.container.focusNext(!0,c.tabIndex)}},f={exec:function(c){c.container.focusPrevious(!0,c.tabIndex)}};CKEDITOR.plugins.add("tab",{init:function(c){for(var d=!1!==c.config.enableTabKeyTools,e=c.config.tabSpaces||0,b="";e--;)b+=" ";if(b)c.on("key",function(a){9==a.data.keyCode&&(c.insertText(b),a.cancel())});if(d)c.on("key",function(a){(9==a.data.keyCode&&c.execCommand("selectNextCell")||a.data.keyCode==CKEDITOR.SHIFT+9&&c.execCommand("selectPreviousCell"))&&a.cancel()});c.addCommand("blur",
CKEDITOR.tools.extend(g,h));c.addCommand("blurBack",CKEDITOR.tools.extend(f,h));c.addCommand("selectNextCell",i());c.addCommand("selectPreviousCell",i(!0))}})})();
CKEDITOR.dom.element.prototype.focusNext=function(i,h){var g=void 0===h?this.getTabIndex():h,f,c,d,e,b,a;if(0>=g)for(b=this.getNextSourceNode(i,CKEDITOR.NODE_ELEMENT);b;){if(b.isVisible()&&0===b.getTabIndex()){d=b;break}b=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT)}else for(b=this.getDocument().getBody().getFirst();b=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT);){if(!f)if(!c&&b.equals(this)){if(c=!0,i){if(!(b=b.getNextSourceNode(!0,CKEDITOR.NODE_ELEMENT)))break;f=1}}else c&&!this.contains(b)&&
(f=1);if(b.isVisible()&&!(0>(a=b.getTabIndex()))){if(f&&a==g){d=b;break}a>g&&(!d||!e||a<e)?(d=b,e=a):!d&&0===a&&(d=b,e=a)}}d&&d.focus()};
CKEDITOR.dom.element.prototype.focusPrevious=function(i,h){for(var g=void 0===h?this.getTabIndex():h,f,c,d,e=0,b,a=this.getDocument().getBody().getLast();a=a.getPreviousSourceNode(!1,CKEDITOR.NODE_ELEMENT);){if(!f)if(!c&&a.equals(this)){if(c=!0,i){if(!(a=a.getPreviousSourceNode(!0,CKEDITOR.NODE_ELEMENT)))break;f=1}}else c&&!this.contains(a)&&(f=1);if(a.isVisible()&&!(0>(b=a.getTabIndex())))if(0>=g){if(f&&0===b){d=a;break}b>e&&(d=a,e=b)}else{if(f&&b==g){d=a;break}if(b<g&&(!d||b>e))d=a,e=b}}d&&d.focus()};CKEDITOR.plugins.add("table",{requires:"dialog",init:function(a){function e(a){return CKEDITOR.tools.extend(a||{},{contextSensitive:1,refresh:function(a,f){this.setState(f.contains("table",1)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)}})}if(!a.blockless){var c=a.lang.table;a.addCommand("table",new CKEDITOR.dialogCommand("table",{context:"table",allowedContent:"table{width,height}[align,border,cellpadding,cellspacing,summary];caption tbody thead tfoot;th td tr[scope];"+(a.plugins.dialogadvtab?
"table"+a.plugins.dialogadvtab.allowedContent():""),requiredContent:"table",contentTransformations:[["table{width}: sizeToStyle","table[width]: sizeToAttribute"]]}));a.addCommand("tableProperties",new CKEDITOR.dialogCommand("tableProperties",e()));a.addCommand("tableDelete",e({exec:function(a){var b=a.elementPath().contains("table",1);if(b){var d=b.getParent(),c=a.editable();1==d.getChildCount()&&(!d.is("td","th")&&!d.equals(c))&&(b=d);a=a.createRange();a.moveToPosition(b,CKEDITOR.POSITION_BEFORE_START);
b.remove();a.select()}}}));a.ui.addButton&&a.ui.addButton("Table",{label:c.toolbar,command:"table",toolbar:"insert,30"});CKEDITOR.dialog.add("table",this.path+"dialogs/table.js");CKEDITOR.dialog.add("tableProperties",this.path+"dialogs/table.js");a.addMenuItems&&a.addMenuItems({table:{label:c.menu,command:"tableProperties",group:"table",order:5},tabledelete:{label:c.deleteTable,command:"tableDelete",group:"table",order:1}});a.on("doubleclick",function(a){a.data.element.is("table")&&(a.data.dialog=
"tableProperties")});a.contextMenu&&a.contextMenu.addListener(function(){return{tabledelete:CKEDITOR.TRISTATE_OFF,table:CKEDITOR.TRISTATE_OFF}})}}});(function(){function p(e){function d(a){!(0<b.length)&&(a.type==CKEDITOR.NODE_ELEMENT&&y.test(a.getName())&&!a.getCustomData("selected_cell"))&&(CKEDITOR.dom.element.setMarker(c,a,"selected_cell",!0),b.push(a))}for(var e=e.getRanges(),b=[],c={},a=0;a<e.length;a++){var f=e[a];if(f.collapsed)f=f.getCommonAncestor(),(f=f.getAscendant("td",!0)||f.getAscendant("th",!0))&&b.push(f);else{var f=new CKEDITOR.dom.walker(f),g;for(f.guard=d;g=f.next();)if(g.type!=CKEDITOR.NODE_ELEMENT||!g.is(CKEDITOR.dtd.table))if((g=
g.getAscendant("td",!0)||g.getAscendant("th",!0))&&!g.getCustomData("selected_cell"))CKEDITOR.dom.element.setMarker(c,g,"selected_cell",!0),b.push(g)}}CKEDITOR.dom.element.clearAllMarkers(c);return b}function o(e,d){for(var b=p(e),c=b[0],a=c.getAscendant("table"),c=c.getDocument(),f=b[0].getParent(),g=f.$.rowIndex,b=b[b.length-1],h=b.getParent().$.rowIndex+b.$.rowSpan-1,b=new CKEDITOR.dom.element(a.$.rows[h]),g=d?g:h,f=d?f:b,b=CKEDITOR.tools.buildTableMap(a),a=b[g],g=d?b[g-1]:b[g+1],b=b[0].length,
c=c.createElement("tr"),h=0;a[h]&&h<b;h++){var i;1<a[h].rowSpan&&g&&a[h]==g[h]?(i=a[h],i.rowSpan+=1):(i=(new CKEDITOR.dom.element(a[h])).clone(),i.removeAttribute("rowSpan"),i.appendBogus(),c.append(i),i=i.$);h+=i.colSpan-1}d?c.insertBefore(f):c.insertAfter(f)}function q(e){if(e instanceof CKEDITOR.dom.selection){for(var d=p(e),b=d[0].getAscendant("table"),c=CKEDITOR.tools.buildTableMap(b),e=d[0].getParent().$.rowIndex,d=d[d.length-1],a=d.getParent().$.rowIndex+d.$.rowSpan-1,d=[],f=e;f<=a;f++){for(var g=
c[f],h=new CKEDITOR.dom.element(b.$.rows[f]),i=0;i<g.length;i++){var j=new CKEDITOR.dom.element(g[i]),l=j.getParent().$.rowIndex;1==j.$.rowSpan?j.remove():(j.$.rowSpan-=1,l==f&&(l=c[f+1],l[i-1]?j.insertAfter(new CKEDITOR.dom.element(l[i-1])):(new CKEDITOR.dom.element(b.$.rows[f+1])).append(j,1)));i+=j.$.colSpan-1}d.push(h)}c=b.$.rows;b=new CKEDITOR.dom.element(c[a+1]||(0<e?c[e-1]:null)||b.$.parentNode);for(f=d.length;0<=f;f--)q(d[f]);return b}e instanceof CKEDITOR.dom.element&&(b=e.getAscendant("table"),
1==b.$.rows.length?b.remove():e.remove());return null}function r(e,d){for(var b=d?Infinity:0,c=0;c<e.length;c++){var a;a=e[c];for(var f=d,g=a.getParent().$.cells,h=0,i=0;i<g.length;i++){var j=g[i],h=h+(f?1:j.colSpan);if(j==a.$)break}a=h-1;if(d?a<b:a>b)b=a}return b}function k(e,d){for(var b=p(e),c=b[0].getAscendant("table"),a=r(b,1),b=r(b),a=d?a:b,f=CKEDITOR.tools.buildTableMap(c),c=[],b=[],g=f.length,h=0;h<g;h++)c.push(f[h][a]),b.push(d?f[h][a-1]:f[h][a+1]);for(h=0;h<g;h++)c[h]&&(1<c[h].colSpan&&
b[h]==c[h]?(a=c[h],a.colSpan+=1):(a=(new CKEDITOR.dom.element(c[h])).clone(),a.removeAttribute("colSpan"),a.appendBogus(),a[d?"insertBefore":"insertAfter"].call(a,new CKEDITOR.dom.element(c[h])),a=a.$),h+=a.rowSpan-1)}function u(e,d){var b=e.getStartElement();if(b=b.getAscendant("td",1)||b.getAscendant("th",1)){var c=b.clone();c.appendBogus();d?c.insertBefore(b):c.insertAfter(b)}}function t(e){if(e instanceof CKEDITOR.dom.selection){var e=p(e),d=e[0]&&e[0].getAscendant("table"),b;a:{var c=0;b=e.length-
1;for(var a={},f,g;f=e[c++];)CKEDITOR.dom.element.setMarker(a,f,"delete_cell",!0);for(c=0;f=e[c++];)if((g=f.getPrevious())&&!g.getCustomData("delete_cell")||(g=f.getNext())&&!g.getCustomData("delete_cell")){CKEDITOR.dom.element.clearAllMarkers(a);b=g;break a}CKEDITOR.dom.element.clearAllMarkers(a);g=e[0].getParent();(g=g.getPrevious())?b=g.getLast():(g=e[b].getParent(),b=(g=g.getNext())?g.getChild(0):null)}for(g=e.length-1;0<=g;g--)t(e[g]);b?m(b,!0):d&&d.remove()}else e instanceof CKEDITOR.dom.element&&
(d=e.getParent(),1==d.getChildCount()?d.remove():e.remove())}function m(e,d){var b=e.getDocument(),c=CKEDITOR.document;CKEDITOR.env.ie&&10==CKEDITOR.env.version&&(c.focus(),b.focus());b=new CKEDITOR.dom.range(b);if(!b["moveToElementEdit"+(d?"End":"Start")](e))b.selectNodeContents(e),b.collapse(d?!1:!0);b.select(!0)}function v(e,d,b){e=e[d];if("undefined"==typeof b)return e;for(d=0;e&&d<e.length;d++){if(b.is&&e[d]==b.$)return d;if(d==b)return new CKEDITOR.dom.element(e[d])}return b.is?-1:null}function s(e,
d,b){var c=p(e),a;if((d?1!=c.length:2>c.length)||(a=e.getCommonAncestor())&&a.type==CKEDITOR.NODE_ELEMENT&&a.is("table"))return!1;var f,e=c[0];a=e.getAscendant("table");var g=CKEDITOR.tools.buildTableMap(a),h=g.length,i=g[0].length,j=e.getParent().$.rowIndex,l=v(g,j,e);if(d){var n;try{var m=parseInt(e.getAttribute("rowspan"),10)||1;f=parseInt(e.getAttribute("colspan"),10)||1;n=g["up"==d?j-m:"down"==d?j+m:j]["left"==d?l-f:"right"==d?l+f:l]}catch(z){return!1}if(!n||e.$==n)return!1;c["up"==d||"left"==
d?"unshift":"push"](new CKEDITOR.dom.element(n))}for(var d=e.getDocument(),o=j,m=n=0,q=!b&&new CKEDITOR.dom.documentFragment(d),s=0,d=0;d<c.length;d++){f=c[d];var k=f.getParent(),t=f.getFirst(),r=f.$.colSpan,u=f.$.rowSpan,k=k.$.rowIndex,w=v(g,k,f),s=s+r*u,m=Math.max(m,w-l+r);n=Math.max(n,k-j+u);if(!b){r=f;(u=r.getBogus())&&u.remove();r.trim();if(f.getChildren().count()){if(k!=o&&t&&(!t.isBlockBoundary||!t.isBlockBoundary({br:1})))(o=q.getLast(CKEDITOR.dom.walker.whitespaces(!0)))&&(!o.is||!o.is("br"))&&
q.append("br");f.moveChildren(q)}d?f.remove():f.setHtml("")}o=k}if(b)return n*m==s;q.moveChildren(e);e.appendBogus();m>=i?e.removeAttribute("rowSpan"):e.$.rowSpan=n;n>=h?e.removeAttribute("colSpan"):e.$.colSpan=m;b=new CKEDITOR.dom.nodeList(a.$.rows);c=b.count();for(d=c-1;0<=d;d--)a=b.getItem(d),a.$.cells.length||(a.remove(),c++);return e}function w(e,d){var b=p(e);if(1<b.length)return!1;if(d)return!0;var b=b[0],c=b.getParent(),a=c.getAscendant("table"),f=CKEDITOR.tools.buildTableMap(a),g=c.$.rowIndex,
h=v(f,g,b),i=b.$.rowSpan,j;if(1<i){j=Math.ceil(i/2);for(var i=Math.floor(i/2),c=g+j,a=new CKEDITOR.dom.element(a.$.rows[c]),f=v(f,c),l,c=b.clone(),g=0;g<f.length;g++)if(l=f[g],l.parentNode==a.$&&g>h){c.insertBefore(new CKEDITOR.dom.element(l));break}else l=null;l||a.append(c)}else{i=j=1;a=c.clone();a.insertAfter(c);a.append(c=b.clone());l=v(f,g);for(h=0;h<l.length;h++)l[h].rowSpan++}c.appendBogus();b.$.rowSpan=j;c.$.rowSpan=i;1==j&&b.removeAttribute("rowSpan");1==i&&c.removeAttribute("rowSpan");return c}
function x(e,d){var b=p(e);if(1<b.length)return!1;if(d)return!0;var b=b[0],c=b.getParent(),a=c.getAscendant("table"),a=CKEDITOR.tools.buildTableMap(a),f=v(a,c.$.rowIndex,b),g=b.$.colSpan;if(1<g)c=Math.ceil(g/2),g=Math.floor(g/2);else{for(var g=c=1,h=[],i=0;i<a.length;i++){var j=a[i];h.push(j[f]);1<j[f].rowSpan&&(i+=j[f].rowSpan-1)}for(a=0;a<h.length;a++)h[a].colSpan++}a=b.clone();a.insertAfter(b);a.appendBogus();b.$.colSpan=c;a.$.colSpan=g;1==c&&b.removeAttribute("colSpan");1==g&&a.removeAttribute("colSpan");
return a}var y=/^(?:td|th)$/;CKEDITOR.plugins.tabletools={requires:"table,dialog,contextmenu",init:function(e){function d(a){return CKEDITOR.tools.extend(a||{},{contextSensitive:1,refresh:function(a,b){this.setState(b.contains({td:1,th:1},1)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)}})}function b(a,b){var c=e.addCommand(a,b);e.addFeature(c)}var c=e.lang.table;b("cellProperties",new CKEDITOR.dialogCommand("cellProperties",d({allowedContent:"td th{width,height,border-color,background-color,white-space,vertical-align,text-align}[colspan,rowspan]",
requiredContent:"table"})));CKEDITOR.dialog.add("cellProperties",this.path+"dialogs/tableCell.js");b("rowDelete",d({requiredContent:"table",exec:function(a){a=a.getSelection();m(q(a))}}));b("rowInsertBefore",d({requiredContent:"table",exec:function(a){a=a.getSelection();o(a,!0)}}));b("rowInsertAfter",d({requiredContent:"table",exec:function(a){a=a.getSelection();o(a)}}));b("columnDelete",d({requiredContent:"table",exec:function(a){for(var a=a.getSelection(),a=p(a),b=a[0],c=a[a.length-1],a=b.getAscendant("table"),
d=CKEDITOR.tools.buildTableMap(a),e,j,l=[],n=0,o=d.length;n<o;n++)for(var k=0,q=d[n].length;k<q;k++)d[n][k]==b.$&&(e=k),d[n][k]==c.$&&(j=k);for(n=e;n<=j;n++)for(k=0;k<d.length;k++)c=d[k],b=new CKEDITOR.dom.element(a.$.rows[k]),c=new CKEDITOR.dom.element(c[n]),c.$&&(1==c.$.colSpan?c.remove():c.$.colSpan-=1,k+=c.$.rowSpan-1,b.$.cells.length||l.push(b));j=a.$.rows[0]&&a.$.rows[0].cells;e=new CKEDITOR.dom.element(j[e]||(e?j[e-1]:a.$.parentNode));l.length==o&&a.remove();e&&m(e,!0)}}));b("columnInsertBefore",
d({requiredContent:"table",exec:function(a){a=a.getSelection();k(a,!0)}}));b("columnInsertAfter",d({requiredContent:"table",exec:function(a){a=a.getSelection();k(a)}}));b("cellDelete",d({requiredContent:"table",exec:function(a){a=a.getSelection();t(a)}}));b("cellMerge",d({allowedContent:"td[colspan,rowspan]",requiredContent:"td[colspan,rowspan]",exec:function(a){m(s(a.getSelection()),!0)}}));b("cellMergeRight",d({allowedContent:"td[colspan]",requiredContent:"td[colspan]",exec:function(a){m(s(a.getSelection(),
"right"),!0)}}));b("cellMergeDown",d({allowedContent:"td[rowspan]",requiredContent:"td[rowspan]",exec:function(a){m(s(a.getSelection(),"down"),!0)}}));b("cellVerticalSplit",d({allowedContent:"td[rowspan]",requiredContent:"td[rowspan]",exec:function(a){m(w(a.getSelection()))}}));b("cellHorizontalSplit",d({allowedContent:"td[colspan]",requiredContent:"td[colspan]",exec:function(a){m(x(a.getSelection()))}}));b("cellInsertBefore",d({requiredContent:"table",exec:function(a){a=a.getSelection();u(a,!0)}}));
b("cellInsertAfter",d({requiredContent:"table",exec:function(a){a=a.getSelection();u(a)}}));e.addMenuItems&&e.addMenuItems({tablecell:{label:c.cell.menu,group:"tablecell",order:1,getItems:function(){var a=e.getSelection(),b=p(a);return{tablecell_insertBefore:CKEDITOR.TRISTATE_OFF,tablecell_insertAfter:CKEDITOR.TRISTATE_OFF,tablecell_delete:CKEDITOR.TRISTATE_OFF,tablecell_merge:s(a,null,!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_merge_right:s(a,"right",!0)?CKEDITOR.TRISTATE_OFF:
CKEDITOR.TRISTATE_DISABLED,tablecell_merge_down:s(a,"down",!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_split_vertical:w(a,!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_split_horizontal:x(a,!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_properties:0<b.length?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED}}},tablecell_insertBefore:{label:c.cell.insertBefore,group:"tablecell",command:"cellInsertBefore",order:5},tablecell_insertAfter:{label:c.cell.insertAfter,
group:"tablecell",command:"cellInsertAfter",order:10},tablecell_delete:{label:c.cell.deleteCell,group:"tablecell",command:"cellDelete",order:15},tablecell_merge:{label:c.cell.merge,group:"tablecell",command:"cellMerge",order:16},tablecell_merge_right:{label:c.cell.mergeRight,group:"tablecell",command:"cellMergeRight",order:17},tablecell_merge_down:{label:c.cell.mergeDown,group:"tablecell",command:"cellMergeDown",order:18},tablecell_split_horizontal:{label:c.cell.splitHorizontal,group:"tablecell",
command:"cellHorizontalSplit",order:19},tablecell_split_vertical:{label:c.cell.splitVertical,group:"tablecell",command:"cellVerticalSplit",order:20},tablecell_properties:{label:c.cell.title,group:"tablecellproperties",command:"cellProperties",order:21},tablerow:{label:c.row.menu,group:"tablerow",order:1,getItems:function(){return{tablerow_insertBefore:CKEDITOR.TRISTATE_OFF,tablerow_insertAfter:CKEDITOR.TRISTATE_OFF,tablerow_delete:CKEDITOR.TRISTATE_OFF}}},tablerow_insertBefore:{label:c.row.insertBefore,
group:"tablerow",command:"rowInsertBefore",order:5},tablerow_insertAfter:{label:c.row.insertAfter,group:"tablerow",command:"rowInsertAfter",order:10},tablerow_delete:{label:c.row.deleteRow,group:"tablerow",command:"rowDelete",order:15},tablecolumn:{label:c.column.menu,group:"tablecolumn",order:1,getItems:function(){return{tablecolumn_insertBefore:CKEDITOR.TRISTATE_OFF,tablecolumn_insertAfter:CKEDITOR.TRISTATE_OFF,tablecolumn_delete:CKEDITOR.TRISTATE_OFF}}},tablecolumn_insertBefore:{label:c.column.insertBefore,
group:"tablecolumn",command:"columnInsertBefore",order:5},tablecolumn_insertAfter:{label:c.column.insertAfter,group:"tablecolumn",command:"columnInsertAfter",order:10},tablecolumn_delete:{label:c.column.deleteColumn,group:"tablecolumn",command:"columnDelete",order:15}});e.contextMenu&&e.contextMenu.addListener(function(a,b,c){return(a=c.contains({td:1,th:1},1))&&!a.isReadOnly()?{tablecell:CKEDITOR.TRISTATE_OFF,tablerow:CKEDITOR.TRISTATE_OFF,tablecolumn:CKEDITOR.TRISTATE_OFF}:null})},getSelectedCells:p};
CKEDITOR.plugins.add("tabletools",CKEDITOR.plugins.tabletools)})();CKEDITOR.tools.buildTableMap=function(p){for(var p=p.$.rows,o=-1,q=[],r=0;r<p.length;r++){o++;!q[o]&&(q[o]=[]);for(var k=-1,u=0;u<p[r].cells.length;u++){var t=p[r].cells[u];for(k++;q[o][k];)k++;for(var m=isNaN(t.colSpan)?1:t.colSpan,t=isNaN(t.rowSpan)?1:t.rowSpan,v=0;v<t;v++){q[o+v]||(q[o+v]=[]);for(var s=0;s<m;s++)q[o+v][k+s]=p[r].cells[u]}k+=m-1}}return q};(function(){function w(a){function d(){for(var b=g(),e=CKEDITOR.tools.clone(a.config.toolbarGroups)||n(a),f=0;f<e.length;f++){var k=e[f];if("/"!=k){"string"==typeof k&&(k=e[f]={name:k});var i,d=k.groups;if(d)for(var h=0;h<d.length;h++)i=d[h],(i=b[i])&&c(k,i);(i=b[k.name])&&c(k,i)}}return e}function g(){var b={},c,f,e;for(c in a.ui.items)f=a.ui.items[c],e=f.toolbar||"others",e=e.split(","),f=e[0],e=parseInt(e[1]||-1,10),b[f]||(b[f]=[]),b[f].push({name:c,order:e});for(f in b)b[f]=b[f].sort(function(b,
a){return b.order==a.order?0:0>a.order?-1:0>b.order?1:b.order<a.order?-1:1});return b}function c(c,e){if(e.length){c.items?c.items.push(a.ui.create("-")):c.items=[];for(var f;f=e.shift();)if(f="string"==typeof f?f:f.name,!b||-1==CKEDITOR.tools.indexOf(b,f))(f=a.ui.create(f))&&a.addFeature(f)&&c.items.push(f)}}function h(b){var a=[],e,d,h;for(e=0;e<b.length;++e)d=b[e],h={},"/"==d?a.push(d):CKEDITOR.tools.isArray(d)?(c(h,CKEDITOR.tools.clone(d)),a.push(h)):d.items&&(c(h,CKEDITOR.tools.clone(d.items)),
h.name=d.name,a.push(h));return a}var b=a.config.removeButtons,b=b&&b.split(","),e=a.config.toolbar;"string"==typeof e&&(e=a.config["toolbar_"+e]);return a.toolbar=e?h(e):d()}function n(a){return a._.toolbarGroups||(a._.toolbarGroups=[{name:"document",groups:["mode","document","doctools"]},{name:"clipboard",groups:["clipboard","undo"]},{name:"editing",groups:["find","selection","spellchecker"]},{name:"forms"},"/",{name:"basicstyles",groups:["basicstyles","cleanup"]},{name:"paragraph",groups:["list",
"indent","blocks","align","bidi"]},{name:"links"},{name:"insert"},"/",{name:"styles"},{name:"colors"},{name:"tools"},{name:"others"},{name:"about"}])}var u=function(){this.toolbars=[];this.focusCommandExecuted=!1};u.prototype.focus=function(){for(var a=0,d;d=this.toolbars[a++];)for(var g=0,c;c=d.items[g++];)if(c.focus){c.focus();return}};var x={modes:{wysiwyg:1,source:1},readOnly:1,exec:function(a){a.toolbox&&(a.toolbox.focusCommandExecuted=!0,CKEDITOR.env.ie||CKEDITOR.env.air?setTimeout(function(){a.toolbox.focus()},
100):a.toolbox.focus())}};CKEDITOR.plugins.add("toolbar",{requires:"button",init:function(a){var d,g=function(c,h){var b,e="rtl"==a.lang.dir,j=a.config.toolbarGroupCycling,o=e?37:39,e=e?39:37,j=void 0===j||j;switch(h){case 9:case CKEDITOR.SHIFT+9:for(;!b||!b.items.length;)if(b=9==h?(b?b.next:c.toolbar.next)||a.toolbox.toolbars[0]:(b?b.previous:c.toolbar.previous)||a.toolbox.toolbars[a.toolbox.toolbars.length-1],b.items.length)for(c=b.items[d?b.items.length-1:0];c&&!c.focus;)(c=d?c.previous:c.next)||
(b=0);c&&c.focus();return!1;case o:b=c;do b=b.next,!b&&j&&(b=c.toolbar.items[0]);while(b&&!b.focus);b?b.focus():g(c,9);return!1;case 40:return c.button&&c.button.hasArrow?(a.once("panelShow",function(b){b.data._.panel._.currentBlock.onKeyDown(40)}),c.execute()):g(c,40==h?o:e),!1;case e:case 38:b=c;do b=b.previous,!b&&j&&(b=c.toolbar.items[c.toolbar.items.length-1]);while(b&&!b.focus);b?b.focus():(d=1,g(c,CKEDITOR.SHIFT+9),d=0);return!1;case 27:return a.focus(),!1;case 13:case 32:return c.execute(),
!1}return!0};a.on("uiSpace",function(c){if(c.data.space==a.config.toolbarLocation){c.removeListener();a.toolbox=new u;var d=CKEDITOR.tools.getNextId(),b=['<span id="',d,'" class="cke_voice_label">',a.lang.toolbar.toolbars,"</span>",'<span id="'+a.ui.spaceId("toolbox")+'" class="cke_toolbox" role="group" aria-labelledby="',d,'" onmousedown="return false;">'],d=!1!==a.config.toolbarStartupExpanded,e,j;a.config.toolbarCanCollapse&&a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE&&b.push('<span class="cke_toolbox_main"'+
(d?">":' style="display:none">'));for(var o=a.toolbox.toolbars,f=w(a),k=0;k<f.length;k++){var i,l=0,r,m=f[k],s;if(m)if(e&&(b.push("</span>"),j=e=0),"/"===m)b.push('<span class="cke_toolbar_break"></span>');else{s=m.items||m;for(var t=0;t<s.length;t++){var p=s[t],n;if(p)if(p.type==CKEDITOR.UI_SEPARATOR)j=e&&p;else{n=!1!==p.canGroup;if(!l){i=CKEDITOR.tools.getNextId();l={id:i,items:[]};r=m.name&&(a.lang.toolbar.toolbarGroups[m.name]||m.name);b.push('<span id="',i,'" class="cke_toolbar"',r?' aria-labelledby="'+
i+'_label"':"",' role="toolbar">');r&&b.push('<span id="',i,'_label" class="cke_voice_label">',r,"</span>");b.push('<span class="cke_toolbar_start"></span>');var q=o.push(l)-1;0<q&&(l.previous=o[q-1],l.previous.next=l)}n?e||(b.push('<span class="cke_toolgroup" role="presentation">'),e=1):e&&(b.push("</span>"),e=0);i=function(c){c=c.render(a,b);q=l.items.push(c)-1;if(q>0){c.previous=l.items[q-1];c.previous.next=c}c.toolbar=l;c.onkey=g;c.onfocus=function(){a.toolbox.focusCommandExecuted||a.focus()}};
j&&(i(j),j=0);i(p)}}e&&(b.push("</span>"),j=e=0);l&&b.push('<span class="cke_toolbar_end"></span></span>')}}a.config.toolbarCanCollapse&&b.push("</span>");if(a.config.toolbarCanCollapse&&a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var v=CKEDITOR.tools.addFunction(function(){a.execCommand("toolbarCollapse")});a.on("destroy",function(){CKEDITOR.tools.removeFunction(v)});a.addCommand("toolbarCollapse",{readOnly:1,exec:function(b){var a=b.ui.space("toolbar_collapser"),c=a.getPrevious(),e=b.ui.space("contents"),
d=c.getParent(),f=parseInt(e.$.style.height,10),h=d.$.offsetHeight,g=a.hasClass("cke_toolbox_collapser_min");g?(c.show(),a.removeClass("cke_toolbox_collapser_min"),a.setAttribute("title",b.lang.toolbar.toolbarCollapse)):(c.hide(),a.addClass("cke_toolbox_collapser_min"),a.setAttribute("title",b.lang.toolbar.toolbarExpand));a.getFirst().setText(g?"▲":"◀");e.setStyle("height",f-(d.$.offsetHeight-h)+"px");b.fire("resize")},modes:{wysiwyg:1,source:1}});a.setKeystroke(CKEDITOR.ALT+(CKEDITOR.env.ie||CKEDITOR.env.webkit?
189:109),"toolbarCollapse");b.push('<a title="'+(d?a.lang.toolbar.toolbarCollapse:a.lang.toolbar.toolbarExpand)+'" id="'+a.ui.spaceId("toolbar_collapser")+'" tabIndex="-1" class="cke_toolbox_collapser');d||b.push(" cke_toolbox_collapser_min");b.push('" onclick="CKEDITOR.tools.callFunction('+v+')">','<span class="cke_arrow">&#9650;</span>',"</a>")}b.push("</span>");c.data.html+=b.join("")}});a.on("destroy",function(){if(this.toolbox){var a,d=0,b,e,g;for(a=this.toolbox.toolbars;d<a.length;d++){e=a[d].items;
for(b=0;b<e.length;b++)g=e[b],g.clickFn&&CKEDITOR.tools.removeFunction(g.clickFn),g.keyDownFn&&CKEDITOR.tools.removeFunction(g.keyDownFn)}}});a.on("uiReady",function(){var c=a.ui.space("toolbox");c&&a.focusManager.add(c,1)});a.addCommand("toolbarFocus",x);a.setKeystroke(CKEDITOR.ALT+121,"toolbarFocus");a.ui.add("-",CKEDITOR.UI_SEPARATOR,{});a.ui.addHandler(CKEDITOR.UI_SEPARATOR,{create:function(){return{render:function(a,d){d.push('<span class="cke_toolbar_separator" role="separator"></span>');return{}}}}})}});
CKEDITOR.ui.prototype.addToolbarGroup=function(a,d,g){var c=n(this.editor),h=0===d,b={name:a};if(g){if(g=CKEDITOR.tools.search(c,function(a){return a.name==g})){!g.groups&&(g.groups=[]);if(d&&(d=CKEDITOR.tools.indexOf(g.groups,d),0<=d)){g.groups.splice(d+1,0,a);return}h?g.groups.splice(0,0,a):g.groups.push(a);return}d=null}d&&(d=CKEDITOR.tools.indexOf(c,function(a){return a.name==d}));h?c.splice(0,0,a):"number"==typeof d?c.splice(d+1,0,b):c.push(a)}})();CKEDITOR.UI_SEPARATOR="separator";
CKEDITOR.config.toolbarLocation="top";(function(){var g=[CKEDITOR.CTRL+90,CKEDITOR.CTRL+89,CKEDITOR.CTRL+CKEDITOR.SHIFT+90],l={8:1,46:1};CKEDITOR.plugins.add("undo",{init:function(a){function b(a){d.enabled&&!1!==a.data.command.canUndo&&d.save()}function c(){d.enabled=a.readOnly?!1:"wysiwyg"==a.mode;d.onChange()}var d=a.undoManager=new e(a),j=d.editingHandler=new i(d),f=a.addCommand("undo",{exec:function(){d.undo()&&(a.selectionChange(),this.fire("afterUndo"))},startDisabled:!0,canUndo:!1}),h=a.addCommand("redo",{exec:function(){d.redo()&&
(a.selectionChange(),this.fire("afterRedo"))},startDisabled:!0,canUndo:!1});a.setKeystroke([[g[0],"undo"],[g[1],"redo"],[g[2],"redo"]]);d.onChange=function(){f.setState(d.undoable()?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);h.setState(d.redoable()?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)};a.on("beforeCommandExec",b);a.on("afterCommandExec",b);a.on("saveSnapshot",function(a){d.save(a.data&&a.data.contentOnly)});a.on("contentDom",j.attachListeners,j);a.on("instanceReady",function(){a.fire("saveSnapshot")});
a.on("beforeModeUnload",function(){"wysiwyg"==a.mode&&d.save(!0)});a.on("mode",c);a.on("readOnly",c);a.ui.addButton&&(a.ui.addButton("Undo",{label:a.lang.undo.undo,command:"undo",toolbar:"undo,10"}),a.ui.addButton("Redo",{label:a.lang.undo.redo,command:"redo",toolbar:"undo,20"}));a.resetUndo=function(){d.reset();a.fire("saveSnapshot")};a.on("updateSnapshot",function(){d.currentImage&&d.update()});a.on("lockSnapshot",function(a){a=a.data;d.lock(a&&a.dontUpdate,a&&a.forceUpdate)});a.on("unlockSnapshot",
d.unlock,d)}});CKEDITOR.plugins.undo={};var e=CKEDITOR.plugins.undo.UndoManager=function(a){this.strokesRecorded=[0,0];this.locked=null;this.previousKeyGroup=-1;this.limit=a.config.undoStackSize||20;this.strokesLimit=25;this.editor=a;this.reset()};e.prototype={type:function(a,b){var c=e.getKeyGroup(a),d=this.strokesRecorded[c]+1,b=b||d>=this.strokesLimit;this.typing||(this.hasUndo=this.typing=!0,this.hasRedo=!1,this.onChange());b?(d=0,this.editor.fire("saveSnapshot")):this.editor.fire("change");this.strokesRecorded[c]=
d;this.previousKeyGroup=c},keyGroupChanged:function(a){return e.getKeyGroup(a)!=this.previousKeyGroup},reset:function(){this.snapshots=[];this.index=-1;this.currentImage=null;this.hasRedo=this.hasUndo=!1;this.locked=null;this.resetType()},resetType:function(){this.strokesRecorded=[0,0];this.typing=!1;this.previousKeyGroup=-1},refreshState:function(){this.hasUndo=!!this.getNextImage(!0);this.hasRedo=!!this.getNextImage(!1);this.resetType();this.onChange()},save:function(a,b,c){var d=this.editor;if(this.locked||
"ready"!=d.status||"wysiwyg"!=d.mode)return!1;var e=d.editable();if(!e||"ready"!=e.status)return!1;e=this.snapshots;b||(b=new f(d));if(!1===b.contents)return!1;if(this.currentImage)if(b.equalsContent(this.currentImage)){if(a||b.equalsSelection(this.currentImage))return!1}else!1!==c&&d.fire("change");e.splice(this.index+1,e.length-this.index-1);e.length==this.limit&&e.shift();this.index=e.push(b)-1;this.currentImage=b;!1!==c&&this.refreshState();return!0},restoreImage:function(a){var b=this.editor,
c;a.bookmarks&&(b.focus(),c=b.getSelection());this.locked={level:999};this.editor.loadSnapshot(a.contents);a.bookmarks?c.selectBookmarks(a.bookmarks):CKEDITOR.env.ie&&(c=this.editor.document.getBody().$.createTextRange(),c.collapse(!0),c.select());this.locked=null;this.index=a.index;this.currentImage=this.snapshots[this.index];this.update();this.refreshState();b.fire("change")},getNextImage:function(a){var b=this.snapshots,c=this.currentImage,d;if(c)if(a)for(d=this.index-1;0<=d;d--){if(a=b[d],!c.equalsContent(a))return a.index=
d,a}else for(d=this.index+1;d<b.length;d++)if(a=b[d],!c.equalsContent(a))return a.index=d,a;return null},redoable:function(){return this.enabled&&this.hasRedo},undoable:function(){return this.enabled&&this.hasUndo},undo:function(){if(this.undoable()){this.save(!0);var a=this.getNextImage(!0);if(a)return this.restoreImage(a),!0}return!1},redo:function(){if(this.redoable()&&(this.save(!0),this.redoable())){var a=this.getNextImage(!1);if(a)return this.restoreImage(a),!0}return!1},update:function(a){if(!this.locked){a||
(a=new f(this.editor));for(var b=this.index,c=this.snapshots;0<b&&this.currentImage.equalsContent(c[b-1]);)b-=1;c.splice(b,this.index-b+1,a);this.index=b;this.currentImage=a}},updateSelection:function(a){if(!this.snapshots.length)return!1;var b=this.snapshots,c=b[b.length-1];return c.equalsContent(a)&&!c.equalsSelection(a)?(this.currentImage=b[b.length-1]=a,!0):!1},lock:function(a,b){if(this.locked)this.locked.level++;else if(a)this.locked={level:1};else{var c=null;if(b)c=!0;else{var d=new f(this.editor,
!0);this.currentImage&&this.currentImage.equalsContent(d)&&(c=d)}this.locked={update:c,level:1}}},unlock:function(){if(this.locked&&!--this.locked.level){var a=this.locked.update;this.locked=null;if(!0===a)this.update();else if(a){var b=new f(this.editor,!0);a.equalsContent(b)||this.update()}}}};e.navigationKeyCodes={37:1,38:1,39:1,40:1,36:1,35:1,33:1,34:1};e.keyGroups={PRINTABLE:0,FUNCTIONAL:1};e.isNavigationKey=function(a){return!!e.navigationKeyCodes[a]};e.getKeyGroup=function(a){var b=e.keyGroups;
return l[a]?b.FUNCTIONAL:b.PRINTABLE};e.getOppositeKeyGroup=function(a){var b=e.keyGroups;return a==b.FUNCTIONAL?b.PRINTABLE:b.FUNCTIONAL};e.ieFunctionalKeysBug=function(a){return CKEDITOR.env.ie&&e.getKeyGroup(a)==e.keyGroups.FUNCTIONAL};var f=CKEDITOR.plugins.undo.Image=function(a,b){this.editor=a;a.fire("beforeUndoImage");var c=a.getSnapshot();CKEDITOR.env.ie&&c&&(c=c.replace(/\s+data-cke-expando=".*?"/g,""));this.contents=c;b||(this.bookmarks=(c=c&&a.getSelection())&&c.createBookmarks2(!0));a.fire("afterUndoImage")},
h=/\b(?:href|src|name)="[^"]*?"/gi;f.prototype={equalsContent:function(a){var b=this.contents,a=a.contents;if(CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks))b=b.replace(h,""),a=a.replace(h,"");return b!=a?!1:!0},equalsSelection:function(a){var b=this.bookmarks,a=a.bookmarks;if(b||a){if(!b||!a||b.length!=a.length)return!1;for(var c=0;c<b.length;c++){var d=b[c],e=a[c];if(d.startOffset!=e.startOffset||d.endOffset!=e.endOffset||!CKEDITOR.tools.arrayCompare(d.start,e.start)||!CKEDITOR.tools.arrayCompare(d.end,
e.end))return!1}}return!0}};var i=CKEDITOR.plugins.undo.NativeEditingHandler=function(a){this.undoManager=a;this.ignoreInputEvent=!1;this.keyEventsStack=new k;this.lastKeydownImage=null};i.prototype={onKeydown:function(a){var b=a.data.getKey();if(229!==b)if(-1<CKEDITOR.tools.indexOf(g,a.data.getKeystroke()))a.data.preventDefault();else if(this.keyEventsStack.cleanUp(a),a=this.undoManager,this.keyEventsStack.getLast(b)||this.keyEventsStack.push(b),this.lastKeydownImage=new f(a.editor),e.isNavigationKey(b)||
this.undoManager.keyGroupChanged(b))if(a.strokesRecorded[0]||a.strokesRecorded[1])a.save(!1,this.lastKeydownImage,!1),a.resetType()},onInput:function(){if(this.ignoreInputEvent)this.ignoreInputEvent=!1;else{var a=this.keyEventsStack.getLast();a||(a=this.keyEventsStack.push(0));this.keyEventsStack.increment(a.keyCode);this.keyEventsStack.getTotalInputs()>=this.undoManager.strokesLimit&&(this.undoManager.type(a.keyCode,!0),this.keyEventsStack.resetInputs())}},onKeyup:function(a){var b=this.undoManager,
a=a.data.getKey(),c=this.keyEventsStack.getTotalInputs();this.keyEventsStack.remove(a);if(!e.ieFunctionalKeysBug(a)||!this.lastKeydownImage||!this.lastKeydownImage.equalsContent(new f(b.editor,!0)))if(0<c)b.type(a);else if(e.isNavigationKey(a))this.onNavigationKey(!0)},onNavigationKey:function(a){var b=this.undoManager;(a||!b.save(!0,null,!1))&&b.updateSelection(new f(b.editor));b.resetType()},ignoreInputEventListener:function(){this.ignoreInputEvent=!0},attachListeners:function(){var a=this.undoManager.editor,
b=a.editable(),c=this;b.attachListener(b,"keydown",function(a){c.onKeydown(a);if(e.ieFunctionalKeysBug(a.data.getKey()))c.onInput()},null,null,999);b.attachListener(b,CKEDITOR.env.ie?"keypress":"input",c.onInput,c,null,999);b.attachListener(b,"keyup",c.onKeyup,c,null,999);b.attachListener(b,"paste",c.ignoreInputEventListener,c,null,999);b.attachListener(b,"drop",c.ignoreInputEventListener,c,null,999);b.attachListener(b.isInline()?b:a.document.getDocumentElement(),"click",function(){c.onNavigationKey()},
null,null,999);b.attachListener(this.undoManager.editor,"blur",function(){c.keyEventsStack.remove(9)},null,null,999)}};var k=CKEDITOR.plugins.undo.KeyEventsStack=function(){this.stack=[]};k.prototype={push:function(a){return this.stack[this.stack.push({keyCode:a,inputs:0})-1]},getLastIndex:function(a){if("number"!=typeof a)return this.stack.length-1;for(var b=this.stack.length;b--;)if(this.stack[b].keyCode==a)return b;return-1},getLast:function(a){a=this.getLastIndex(a);return-1!=a?this.stack[a]:
null},increment:function(a){this.getLast(a).inputs++},remove:function(a){a=this.getLastIndex(a);-1!=a&&this.stack.splice(a,1)},resetInputs:function(a){if("number"==typeof a)this.getLast(a).inputs=0;else for(a=this.stack.length;a--;)this.stack[a].inputs=0},getTotalInputs:function(){for(var a=this.stack.length,b=0;a--;)b+=this.stack[a].inputs;return b},cleanUp:function(a){a=a.data.$;!a.ctrlKey&&!a.metaKey&&this.remove(17);a.shiftKey||this.remove(16);a.altKey||this.remove(18)}}})();(function(){function k(a){var e=this.editor,b=a.document,c=b.body,d=b.getElementById("cke_actscrpt");d&&d.parentNode.removeChild(d);(d=b.getElementById("cke_shimscrpt"))&&d.parentNode.removeChild(d);(d=b.getElementById("cke_basetagscrpt"))&&d.parentNode.removeChild(d);c.contentEditable=!0;CKEDITOR.env.ie&&(c.hideFocus=!0,c.disabled=!0,c.removeAttribute("disabled"));delete this._.isLoadingData;this.$=c;b=new CKEDITOR.dom.document(b);this.setup();this.fixInitialSelection();CKEDITOR.env.ie&&(b.getDocumentElement().addClass(b.$.compatMode),
e.config.enterMode!=CKEDITOR.ENTER_P&&this.attachListener(b,"selectionchange",function(){var a=b.getBody(),c=e.getSelection(),d=c&&c.getRanges()[0];d&&(a.getHtml().match(/^<p>(?:&nbsp;|<br>)<\/p>$/i)&&d.startContainer.equals(a))&&setTimeout(function(){d=e.getSelection().getRanges()[0];if(!d.startContainer.equals("body")){a.getFirst().remove(1);d.moveToElementEditEnd(a);d.select()}},0)}));if(CKEDITOR.env.webkit||CKEDITOR.env.ie&&10<CKEDITOR.env.version)b.getDocumentElement().on("mousedown",function(a){a.data.getTarget().is("html")&&
setTimeout(function(){e.editable().focus()})});l(e);try{e.document.$.execCommand("2D-position",!1,!0)}catch(g){}(CKEDITOR.env.gecko||CKEDITOR.env.ie&&"CSS1Compat"==e.document.$.compatMode)&&this.attachListener(this,"keydown",function(a){var b=a.data.getKeystroke();if(b==33||b==34)if(CKEDITOR.env.ie)setTimeout(function(){e.getSelection().scrollIntoView()},0);else if(e.window.$.innerHeight>this.$.offsetHeight){var c=e.createRange();c[b==33?"moveToElementEditStart":"moveToElementEditEnd"](this);c.select();
a.data.preventDefault()}});CKEDITOR.env.ie&&this.attachListener(b,"blur",function(){try{b.$.selection.empty()}catch(a){}});CKEDITOR.env.iOS&&this.attachListener(b,"touchend",function(){a.focus()});c=e.document.getElementsByTag("title").getItem(0);c.data("cke-title",c.getText());CKEDITOR.env.ie&&(e.document.$.title=this._.docTitle);CKEDITOR.tools.setTimeout(function(){if(this.status=="unloaded")this.status="ready";e.fire("contentDom");if(this._.isPendingFocus){e.focus();this._.isPendingFocus=false}setTimeout(function(){e.fire("dataReady")},
0);CKEDITOR.env.ie&&setTimeout(function(){if(e.document){var a=e.document.$.body;a.runtimeStyle.marginBottom="0px";a.runtimeStyle.marginBottom=""}},1E3)},0,this)}function l(a){function e(){var c;a.editable().attachListener(a,"selectionChange",function(){var d=a.getSelection().getSelectedElement();d&&(c&&(c.detachEvent("onresizestart",b),c=null),d.$.attachEvent("onresizestart",b),c=d.$)})}function b(a){a.returnValue=!1}if(CKEDITOR.env.gecko)try{var c=a.document.$;c.execCommand("enableObjectResizing",
!1,!a.config.disableObjectResizing);c.execCommand("enableInlineTableEditing",!1,!a.config.disableNativeTableHandles)}catch(d){}else CKEDITOR.env.ie&&(11>CKEDITOR.env.version&&a.config.disableObjectResizing)&&e(a)}function m(){var a=[];if(8<=CKEDITOR.document.$.documentMode){a.push("html.CSS1Compat [contenteditable=false]{min-height:0 !important}");var e=[],b;for(b in CKEDITOR.dtd.$removeEmpty)e.push("html.CSS1Compat "+b+"[contenteditable=false]");a.push(e.join(",")+"{display:inline-block}")}else CKEDITOR.env.gecko&&
(a.push("html{height:100% !important}"),a.push("img:-moz-broken{-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}"));a.push("html{cursor:text;*cursor:auto}");a.push("img,input,textarea{cursor:default}");return a.join("\n")}CKEDITOR.plugins.add("wysiwygarea",{init:function(a){a.config.fullPage&&a.addFeature({allowedContent:"html head title; style [media,type]; body (*)[id]; meta link [*]",requiredContent:"body"});a.addMode("wysiwyg",function(e){function b(b){b&&b.removeListener();a.editable(new j(a,
d.$.contentWindow.document.body));a.setData(a.getData(1),e)}var c="document.open();"+(CKEDITOR.env.ie?"("+CKEDITOR.tools.fixDomain+")();":"")+"document.close();",c=CKEDITOR.env.air?"javascript:void(0)":CKEDITOR.env.ie?"javascript:void(function(){"+encodeURIComponent(c)+"}())":"",d=CKEDITOR.dom.element.createFromHtml('<iframe src="'+c+'" frameBorder="0"></iframe>');d.setStyles({width:"100%",height:"100%"});d.addClass("cke_wysiwyg_frame cke_reset");var g=a.ui.space("contents");g.append(d);if(c=CKEDITOR.env.ie||
CKEDITOR.env.gecko)d.on("load",b);var f=a.title,h=a.fire("ariaEditorHelpLabel",{}).label;f&&(CKEDITOR.env.ie&&h&&(f+=", "+h),d.setAttribute("title",f));if(h){var f=CKEDITOR.tools.getNextId(),i=CKEDITOR.dom.element.createFromHtml('<span id="'+f+'" class="cke_voice_label">'+h+"</span>");g.append(i,1);d.setAttribute("aria-describedby",f)}a.on("beforeModeUnload",function(a){a.removeListener();i&&i.remove()});d.setAttributes({tabIndex:a.tabIndex,allowTransparency:"true"});!c&&b();CKEDITOR.env.webkit&&
(c=function(){g.setStyle("width","100%");d.hide();d.setSize("width",g.getSize("width"));g.removeStyle("width");d.show()},d.setCustomData("onResize",c),CKEDITOR.document.getWindow().on("resize",c));a.fire("ariaWidget",d)})}});CKEDITOR.editor.prototype.addContentsCss=function(a){var e=this.config,b=e.contentsCss;CKEDITOR.tools.isArray(b)||(e.contentsCss=b?[b]:[]);e.contentsCss.push(a)};var j=CKEDITOR.tools.createClass({$:function(){this.base.apply(this,arguments);this._.frameLoadedHandler=CKEDITOR.tools.addFunction(function(a){CKEDITOR.tools.setTimeout(k,
0,this,a)},this);this._.docTitle=this.getWindow().getFrame().getAttribute("title")},base:CKEDITOR.editable,proto:{setData:function(a,e){var b=this.editor;if(e)this.setHtml(a),this.fixInitialSelection(),b.fire("dataReady");else{this._.isLoadingData=!0;b._.dataStore={id:1};var c=b.config,d=c.fullPage,g=c.docType,f=CKEDITOR.tools.buildStyleHtml(m()).replace(/<style>/,'<style data-cke-temp="1">');d||(f+=CKEDITOR.tools.buildStyleHtml(b.config.contentsCss));var h=c.baseHref?'<base href="'+c.baseHref+'" data-cke-temp="1" />':
"";d&&(a=a.replace(/<!DOCTYPE[^>]*>/i,function(a){b.docType=g=a;return""}).replace(/<\?xml\s[^\?]*\?>/i,function(a){b.xmlDeclaration=a;return""}));a=b.dataProcessor.toHtml(a);d?(/<body[\s|>]/.test(a)||(a="<body>"+a),/<html[\s|>]/.test(a)||(a="<html>"+a+"</html>"),/<head[\s|>]/.test(a)?/<title[\s|>]/.test(a)||(a=a.replace(/<head[^>]*>/,"$&<title></title>")):a=a.replace(/<html[^>]*>/,"$&<head><title></title></head>"),h&&(a=a.replace(/<head[^>]*?>/,"$&"+h)),a=a.replace(/<\/head\s*>/,f+"$&"),a=g+a):a=
c.docType+'<html dir="'+c.contentsLangDirection+'" lang="'+(c.contentsLanguage||b.langCode)+'"><head><title>'+this._.docTitle+"</title>"+h+f+"</head><body"+(c.bodyId?' id="'+c.bodyId+'"':"")+(c.bodyClass?' class="'+c.bodyClass+'"':"")+">"+a+"</body></html>";CKEDITOR.env.gecko&&(a=a.replace(/<body/,'<body contenteditable="true" '),2E4>CKEDITOR.env.version&&(a=a.replace(/<body[^>]*>/,"$&<\!-- cke-content-start --\>")));c='<script id="cke_actscrpt" type="text/javascript"'+(CKEDITOR.env.ie?' defer="defer" ':
"")+">var wasLoaded=0;function onload(){if(!wasLoaded)window.parent.CKEDITOR.tools.callFunction("+this._.frameLoadedHandler+",window);wasLoaded=1;}"+(CKEDITOR.env.ie?"onload();":'document.addEventListener("DOMContentLoaded", onload, false );')+"<\/script>";CKEDITOR.env.ie&&9>CKEDITOR.env.version&&(c+='<script id="cke_shimscrpt">window.parent.CKEDITOR.tools.enableHtml5Elements(document)<\/script>');h&&(CKEDITOR.env.ie&&10>CKEDITOR.env.version)&&(c+='<script id="cke_basetagscrpt">var baseTag = document.querySelector( "base" );baseTag.href = baseTag.href;<\/script>');
a=a.replace(/(?=\s*<\/(:?head)>)/,c);this.clearCustomData();this.clearListeners();b.fire("contentDomUnload");var i=this.getDocument();try{i.write(a)}catch(j){setTimeout(function(){i.write(a)},0)}}},getData:function(a){if(a)return this.getHtml();var a=this.editor,e=a.config,b=e.fullPage,c=b&&a.docType,d=b&&a.xmlDeclaration,g=this.getDocument(),b=b?g.getDocumentElement().getOuterHtml():g.getBody().getHtml();CKEDITOR.env.gecko&&e.enterMode!=CKEDITOR.ENTER_BR&&(b=b.replace(/<br>(?=\s*(:?$|<\/body>))/,
""));b=a.dataProcessor.toDataFormat(b);d&&(b=d+"\n"+b);c&&(b=c+"\n"+b);return b},focus:function(){this._.isLoadingData?this._.isPendingFocus=!0:j.baseProto.focus.call(this)},detach:function(){var a=this.editor,e=a.document,a=a.window.getFrame();j.baseProto.detach.call(this);this.clearCustomData();e.getDocumentElement().clearCustomData();a.clearCustomData();CKEDITOR.tools.removeFunction(this._.frameLoadedHandler);(e=a.removeCustomData("onResize"))&&e.removeListener();a.remove()}}})})();
CKEDITOR.config.disableObjectResizing=!1;CKEDITOR.config.disableNativeTableHandles=!0;CKEDITOR.config.disableNativeSpellChecker=!0;CKEDITOR.config.contentsCss=CKEDITOR.getUrl("contents.css");(function(){function h(b,e,c){var i=[],g=[],a;for(a=0;a<b.styleSheets.length;a++){var d=b.styleSheets[a];if(!(d.ownerNode||d.owningElement).getAttribute("data-cke-temp")&&!(d.href&&"chrome://"==d.href.substr(0,9)))try{for(var f=d.cssRules||d.rules,d=0;d<f.length;d++)g.push(f[d].selectorText)}catch(h){}}a=g.join(" ");a=a.replace(/(,|>|\+|~)/g," ");a=a.replace(/\[[^\]]*/g,"");a=a.replace(/#[^\s]*/g,"");a=a.replace(/\:{1,2}[^\s]*/g,"");a=a.replace(/\s+/g," ");a=a.split(" ");b=[];for(g=0;g<a.length;g++)f=
a[g],c.test(f)&&!e.test(f)&&-1==CKEDITOR.tools.indexOf(b,f)&&b.push(f);for(a=0;a<b.length;a++)c=b[a].split("."),e=c[0].toLowerCase(),c=c[1],i.push({name:e+"."+c,element:e,attributes:{"class":c}});return i}CKEDITOR.plugins.add("stylesheetparser",{init:function(b){b.filter.disable();var e;b.once("stylesSet",function(c){c.cancel();b.once("contentDom",function(){b.getStylesSet(function(c){e=c.concat(h(b.document.$,b.config.stylesheetParser_skipSelectors||/(^body\.|^\.)/i,b.config.stylesheetParser_validSelectors||
/\w+\.\w+/));b.getStylesSet=function(b){if(e)return b(e)};b.fire("stylesSet",{styles:e})})})},null,null,1)}})})();(function(){function f(a,b,c){var e=CKEDITOR.document.getById(c),d;if(e&&(c=a.fire("uiSpace",{space:b,html:""}).html))a.on("uiSpace",function(a){a.data.space==b&&a.cancel()},null,null,1),d=e.append(CKEDITOR.dom.element.createFromHtml(g.output({id:a.id,name:a.name,langDir:a.lang.dir,langCode:a.langCode,space:b,spaceId:a.ui.spaceId(b),content:c}))),e.getCustomData("cke_hasshared")?d.hide():e.setCustomData("cke_hasshared",1),d.unselectable(),d.on("mousedown",function(a){a=a.data;a.getTarget().hasAscendant("a",
1)||a.preventDefault()}),a.focusManager.add(d,1),a.on("focus",function(){for(var a=0,b,c=e.getChildren();b=c.getItem(a);a++)b.type==CKEDITOR.NODE_ELEMENT&&(!b.equals(d)&&b.hasClass("cke_shared"))&&b.hide();d.show()}),a.on("destroy",function(){d.remove()})}var g=CKEDITOR.addTemplate("sharedcontainer",'<div id="cke_{name}" class="cke {id} cke_reset_all cke_chrome cke_editor_{name} cke_shared cke_detached cke_{langDir} '+CKEDITOR.env.cssClass+'" dir="{langDir}" title="'+(CKEDITOR.env.gecko?" ":"")+'" lang="{langCode}" role="presentation"><div class="cke_inner"><div id="{spaceId}" class="cke_{space}" role="presentation">{content}</div></div></div>');
CKEDITOR.plugins.add("sharedspace",{init:function(a){a.on("loaded",function(){var b=a.config.sharedSpaces;if(b)for(var c in b)f(a,c,b[c])},null,null,9)}})})();CKEDITOR.plugins.add("sourcedialog",{init:function(a){a.addCommand("sourcedialog",new CKEDITOR.dialogCommand("sourcedialog"));CKEDITOR.dialog.add("sourcedialog",this.path+"dialogs/sourcedialog.js");a.ui.addButton&&a.ui.addButton("Sourcedialog",{label:a.lang.sourcedialog.toolbar,command:"sourcedialog",toolbar:"mode,10"})}});CKEDITOR.config.plugins='basicstyles,blockquote,dialogui,dialog,clipboard,button,panelbutton,panel,floatpanel,colorbutton,colordialog,menu,contextmenu,elementspath,enterkey,entities,popup,filebrowser,floatingspace,listblock,richcombo,font,format,horizontalrule,htmlwriter,image,indent,indentlist,justify,fakeobjects,link,list,maximize,pastefromword,pastetext,removeformat,resize,sourcearea,stylescombo,tab,table,tabletools,toolbar,undo,wysiwygarea,stylesheetparser,sharedspace,sourcedialog';CKEDITOR.config.skin='moono';(function() {var setIcons = function(icons, strip) {var path = CKEDITOR.getUrl( 'plugins/' + strip );icons = icons.split( ',' );for ( var i = 0; i < icons.length; i++ )CKEDITOR.skin.icons[ icons[ i ] ] = { path: path, offset: -icons[ ++i ], bgsize : icons[ ++i ] };};if (CKEDITOR.env.hidpi) setIcons('bold,0,,italic,24,,strike,48,,subscript,72,,superscript,96,,underline,120,,blockquote,144,,copy-rtl,168,,copy,192,,cut-rtl,216,,cut,240,,paste-rtl,264,,paste,288,,bgcolor,312,,textcolor,336,,horizontalrule,360,,image,384,,indent-rtl,408,,indent,432,,outdent-rtl,456,,outdent,480,,justifyblock,504,,justifycenter,528,,justifyleft,552,,justifyright,576,,anchor-rtl,600,,anchor,624,,link,648,,unlink,672,,bulletedlist-rtl,696,,bulletedlist,720,,numberedlist-rtl,744,,numberedlist,768,,maximize,792,,pastefromword-rtl,816,,pastefromword,840,,pastetext-rtl,864,,pastetext,888,,removeformat,912,,source-rtl,936,,source,960,,table,984,,redo-rtl,1008,,redo,1032,,undo-rtl,1056,,undo,1080,,sourcedialog-rtl,1104,,sourcedialog,1128,','icons_hidpi.png');else setIcons('bold,0,auto,italic,24,auto,strike,48,auto,subscript,72,auto,superscript,96,auto,underline,120,auto,blockquote,144,auto,copy-rtl,168,auto,copy,192,auto,cut-rtl,216,auto,cut,240,auto,paste-rtl,264,auto,paste,288,auto,bgcolor,312,auto,textcolor,336,auto,horizontalrule,360,auto,image,384,auto,indent-rtl,408,auto,indent,432,auto,outdent-rtl,456,auto,outdent,480,auto,justifyblock,504,auto,justifycenter,528,auto,justifyleft,552,auto,justifyright,576,auto,anchor-rtl,600,auto,anchor,624,auto,link,648,auto,unlink,672,auto,bulletedlist-rtl,696,auto,bulletedlist,720,auto,numberedlist-rtl,744,auto,numberedlist,768,auto,maximize,792,auto,pastefromword-rtl,816,auto,pastefromword,840,auto,pastetext-rtl,864,auto,pastetext,888,auto,removeformat,912,auto,source-rtl,936,auto,source,960,auto,table,984,auto,redo-rtl,1008,auto,redo,1032,auto,undo-rtl,1056,auto,undo,1080,auto,sourcedialog-rtl,1104,auto,sourcedialog,1128,auto','icons.png');})();CKEDITOR.lang.languages={"de":1,"en":1,"es":1,"fr":1,"it":1,"nl":1,"pt-br":1,"ru":1};}());
components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/styles.js000060400000003204152453623450026135 0ustar00

CKEDITOR.stylesSet.add( 'default', [


	{ name: 'Italic Title',		element: 'h2', styles: { 'font-style': 'italic' } },
	{ name: 'Subtitle',			element: 'h3', styles: { 'color': '#aaa', 'font-style': 'italic' } },
	{
		name: 'Special Container',
		element: 'div',
		styles: {
			padding: '5px 10px',
			background: '#eee',
			border: '1px solid #ccc'
		}
	},



	{ name: 'Marker',			element: 'span', attributes: { 'class': 'marker' } },

	{ name: 'Big',				element: 'big' },
	{ name: 'Small',			element: 'small' },
	{ name: 'Typewriter',		element: 'tt' },

	{ name: 'Computer Code',	element: 'code' },
	{ name: 'Keyboard Phrase',	element: 'kbd' },
	{ name: 'Sample Text',		element: 'samp' },
	{ name: 'Variable',			element: 'var' },

	{ name: 'Deleted Text',		element: 'del' },
	{ name: 'Inserted Text',	element: 'ins' },

	{ name: 'Cited Work',		element: 'cite' },
	{ name: 'Inline Quotation',	element: 'q' },

	{ name: 'Language: RTL',	element: 'span', attributes: { 'dir': 'rtl' } },
	{ name: 'Language: LTR',	element: 'span', attributes: { 'dir': 'ltr' } },


	{
		name: 'Styled image (left)',
		element: 'img',
		attributes: { 'class': 'left' }
	},

	{
		name: 'Styled image (right)',
		element: 'img',
		attributes: { 'class': 'right' }
	},

	{
		name: 'Compact table',
		element: 'table',
		attributes: {
			cellpadding: '5',
			cellspacing: '0',
			border: '1',
			bordercolor: '#ccc'
		},
		styles: {
			'border-collapse': 'collapse'
		}
	},

	{ name: 'Borderless Table',		element: 'table',	styles: { 'border-style': 'hidden', 'background-color': '#E6E6FA' } },
	{ name: 'Square Bulleted List',	element: 'ul',		styles: { 'list-style-type': 'square' } }
] );


components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/LICENSE.md000060400000205141152453623450025664 0ustar00Software License Agreement
==========================

CKEditor - The text editor for Internet - http://ckeditor.com
Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.

Licensed under the terms of any of the following licenses at your
choice:

 - GNU General Public License Version 2 or later (the "GPL")
   http://www.gnu.org/licenses/gpl.html
   (See Appendix A)

 - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
   http://www.gnu.org/licenses/lgpl.html
   (See Appendix B)

 - Mozilla Public License Version 1.1 or later (the "MPL")
   http://www.mozilla.org/MPL/MPL-1.1.html
   (See Appendix C)

You are not required to, but if you want to explicitly declare the
license you have chosen to be bound to when using, reproducing,
modifying and distributing this software, just include a text file
titled "legal.txt" in your version of this software, indicating your
license choice. In any case, your choice will not restrict any
recipient of your version of this software to use, reproduce, modify
and distribute this software under any of the above licenses.

Sources of Intellectual Property Included in CKEditor
-----------------------------------------------------

Where not otherwise indicated, all CKEditor content is authored by
CKSource engineers and consists of CKSource-owned intellectual
property. In some specific instances, CKEditor will incorporate work
done by developers outside of CKSource with their express permission.

Trademarks
----------

CKEditor is a trademark of CKSource - Frederico Knabben. All other brand
and product names are trademarks, registered trademarks or service
marks of their respective holders.

---

Appendix A: The GPL License
---------------------------

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


Appendix B: The LGPL License
----------------------------

GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999

 Copyright (C) 1991, 1999 Free Software Foundation, Inc.
     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

[This is the first released version of the Lesser GPL.  It also counts
 as the successor of the GNU Library Public License, version 2, hence
 the version number 2.1.]

Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software-to make sure the software is free for all its users.

  This license, the Lesser General Public License, applies to some
specially designated software packages-typically libraries-of the
Free Software Foundation and other authors who decide to use it.  You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.

  When we speak of free software, we are referring to freedom of use,
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 and use pieces of
it in new free programs; and that you are informed that you can do
these things.

  To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights.  These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.

  For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you.  You must make sure that they, too, receive or can get the source
code.  If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it.  And you must show them these terms so they know their rights.

  We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.

  To protect each distributor, we want to make it very clear that
there is no warranty for the free library.  Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.

  Finally, software patents pose a constant threat to the existence of
any free program.  We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder.  Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.

  Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License.  This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License.  We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.

  When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library.  The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom.  The Lesser General
Public License permits more lax criteria for linking other code with
the library.

  We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License.  It also provides other free software developers Less
of an advantage over competing non-free programs.  These disadvantages
are the reason we use the ordinary General Public License for many
libraries.  However, the Lesser license provides advantages in certain
special circumstances.

  For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard.  To achieve this, non-free programs must be
allowed to use the library.  A more frequent case is that a free
library does the same job as widely used non-free libraries.  In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.

  In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software.  For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.

  Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.

  The precise terms and conditions for copying, distribution and
modification follow.  Pay close attention to the difference between a
"work based on the library" and a "work that uses the library".  The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.

GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".

  A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.

  The "Library", below, refers to any such software library or work
which has been distributed under these terms.  A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language.  (Hereinafter, translation is
included without limitation in the term "modification".)

  "Source code" for a work means the preferred form of the work for
making modifications to it.  For a library, 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 library.

  Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it).  Whether that is true depends on what the Library does
and what the program that uses the Library does.

  1. You may copy and distribute verbatim copies of the Library's
complete 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 distribute a copy of this License along with the
Library.

  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 Library or any portion
of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.

    b) You must cause the files modified to carry prominent notices
    stating that you changed the files and the date of any change.

    c) You must cause the whole of the work to be licensed at no
    charge to all third parties under the terms of this License.

    d) If a facility in the modified Library refers to a function or a
    table of data to be supplied by an application program that uses
    the facility, other than as an argument passed when the facility
    is invoked, then you must make a good faith effort to ensure that,
    in the event an application does not supply such function or
    table, the facility still operates, and performs whatever part of
    its purpose remains meaningful.

    (For example, a function in a library to compute square roots has
    a purpose that is entirely well-defined independent of the
    application.  Therefore, Subsection 2d requires that any
    application-supplied function or table used by this function must
    be optional: if the application does not supply it, the square
    root function must still compute square roots.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Library,
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 Library, 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 Library.

In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library.  To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License.  (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.)  Do not make any other change in
these notices.

  Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.

  This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.

  4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you 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.

  If distribution of 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 satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.

  5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library".  Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.

  However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library".  The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.

  When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library.  The
threshold for this to be true is not precisely defined by law.

  If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work.  (Executables containing this object code plus portions of the
Library will still fall under Section 6.)

  Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.

  6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.

  You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License.  You must supply a copy of this License.  If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License.  Also, you must do one
of these things:

    a) Accompany the work with the complete corresponding
    machine-readable source code for the Library including whatever
    changes were used in the work (which must be distributed under
    Sections 1 and 2 above); and, if the work is an executable linked
    with the Library, with the complete machine-readable "work that
    uses the Library", as object code and/or source code, so that the
    user can modify the Library and then relink to produce a modified
    executable containing the modified Library.  (It is understood
    that the user who changes the contents of definitions files in the
    Library will not necessarily be able to recompile the application
    to use the modified definitions.)

    b) Use a suitable shared library mechanism for linking with the
    Library.  A suitable mechanism is one that (1) uses at run time a
    copy of the library already present on the user's computer system,
    rather than copying library functions into the executable, and (2)
    will operate properly with a modified version of the library, if
    the user installs one, as long as the modified version is
    interface-compatible with the version that the work was made with.

    c) Accompany the work with a written offer, valid for at
    least three years, to give the same user the materials
    specified in Subsection 6a, above, for a charge no more
    than the cost of performing this distribution.

    d) If distribution of the work is made by offering access to copy
    from a designated place, offer equivalent access to copy the above
    specified materials from the same place.

    e) Verify that the user has already received a copy of these
    materials or that you have already sent this user a copy.

  For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it.  However, as a special exception,
the materials to be 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.

  It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system.  Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.

  7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:

    a) Accompany the combined library with a copy of the same work
    based on the Library, uncombined with any other library
    facilities.  This must be distributed under the terms of the
    Sections above.

    b) Give prominent notice with the combined library of the fact
    that part of it is a work based on the Library, and explaining
    where to find the accompanying uncombined form of the same work.

  8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License.  Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library 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.

  9. 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 Library or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.

  10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
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 with
this License.

  11. 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 Library at all.  For example, if a patent
license would not permit royalty-free redistribution of the Library 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 Library.

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.

  12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library 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.

  13. The Free Software Foundation may publish revised and/or new
versions of the Lesser 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 Library
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 Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.

  14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
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

  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "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
LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. 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 LIBRARY 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
LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.

END OF TERMS AND CONDITIONS


Appendix C: The MPL License
---------------------------

MOZILLA PUBLIC LICENSE
Version 1.1

1. Definitions.

     1.0.1. "Commercial Use" means distribution or otherwise making the
     Covered Code available to a third party.

     1.1. "Contributor" means each entity that creates or contributes to
     the creation of Modifications.

     1.2. "Contributor Version" means the combination of the Original
     Code, prior Modifications used by a Contributor, and the Modifications
     made by that particular Contributor.

     1.3. "Covered Code" means the Original Code or Modifications or the
     combination of the Original Code and Modifications, in each case
     including portions thereof.

     1.4. "Electronic Distribution Mechanism" means a mechanism generally
     accepted in the software development community for the electronic
     transfer of data.

     1.5. "Executable" means Covered Code in any form other than Source
     Code.

     1.6. "Initial Developer" means the individual or entity identified
     as the Initial Developer in the Source Code notice required by Exhibit
     A.

     1.7. "Larger Work" means a work which combines Covered Code or
     portions thereof with code not governed by the terms of this License.

     1.8. "License" means this document.

     1.8.1. "Licensable" means having the right to grant, to the maximum
     extent possible, whether at the time of the initial grant or
     subsequently acquired, any and all of the rights conveyed herein.

     1.9. "Modifications" means any addition to or deletion from the
     substance or structure of either the Original Code or any previous
     Modifications. When Covered Code is released as a series of files, a
     Modification is:
          A. Any addition to or deletion from the contents of a file
          containing Original Code or previous Modifications.

          B. Any new file that contains any part of the Original Code or
          previous Modifications.

     1.10. "Original Code" means Source Code of computer software code
     which is described in the Source Code notice required by Exhibit A as
     Original Code, and which, at the time of its release under this
     License is not already Covered Code governed by this License.

     1.10.1. "Patent Claims" means any patent claim(s), now owned or
     hereafter acquired, including without limitation,  method, process,
     and apparatus claims, in any patent Licensable by grantor.

     1.11. "Source Code" means the preferred form of the Covered Code for
     making modifications to it, including all modules it contains, plus
     any associated interface definition files, scripts used to control
     compilation and installation of an Executable, or source code
     differential comparisons against either the Original Code or another
     well known, available Covered Code of the Contributor's choice. The
     Source Code can be in a compressed or archival form, provided the
     appropriate decompression or de-archiving software is widely available
     for no charge.

     1.12. "You" (or "Your")  means an individual or a legal entity
     exercising rights under, and complying with all of the terms of, this
     License or a future version of this License issued under Section 6.1.
     For legal entities, "You" includes any entity which controls, is
     controlled by, or is under common control with You. For purposes of
     this definition, "control" means (a) the power, direct or indirect,
     to cause the direction or management of such entity, whether by
     contract or otherwise, or (b) ownership of more than fifty percent
     (50%) of the outstanding shares or beneficial ownership of such
     entity.

2. Source Code License.

     2.1. The Initial Developer Grant.
     The Initial Developer hereby grants You a world-wide, royalty-free,
     non-exclusive license, subject to third party intellectual property
     claims:
          (a)  under intellectual property rights (other than patent or
          trademark) Licensable by Initial Developer to use, reproduce,
          modify, display, perform, sublicense and distribute the Original
          Code (or portions thereof) with or without Modifications, and/or
          as part of a Larger Work; and

          (b) under Patents Claims infringed by the making, using or
          selling of Original Code, to make, have made, use, practice,
          sell, and offer for sale, and/or otherwise dispose of the
          Original Code (or portions thereof).

          (c) the licenses granted in this Section 2.1(a) and (b) are
          effective on the date Initial Developer first distributes
          Original Code under the terms of this License.

          (d) Notwithstanding Section 2.1(b) above, no patent license is
          granted: 1) for code that You delete from the Original Code; 2)
          separate from the Original Code;  or 3) for infringements caused
          by: i) the modification of the Original Code or ii) the
          combination of the Original Code with other software or devices.

     2.2. Contributor Grant.
     Subject to third party intellectual property claims, each Contributor
     hereby grants You a world-wide, royalty-free, non-exclusive license

          (a)  under intellectual property rights (other than patent or
          trademark) Licensable by Contributor, to use, reproduce, modify,
          display, perform, sublicense and distribute the Modifications
          created by such Contributor (or portions thereof) either on an
          unmodified basis, with other Modifications, as Covered Code
          and/or as part of a Larger Work; and

          (b) under Patent Claims infringed by the making, using, or
          selling of  Modifications made by that Contributor either alone
          and/or in combination with its Contributor Version (or portions
          of such combination), to make, use, sell, offer for sale, have
          made, and/or otherwise dispose of: 1) Modifications made by that
          Contributor (or portions thereof); and 2) the combination of
          Modifications made by that Contributor with its Contributor
          Version (or portions of such combination).

          (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
          effective on the date Contributor first makes Commercial Use of
          the Covered Code.

          (d)    Notwithstanding Section 2.2(b) above, no patent license is
          granted: 1) for any code that Contributor has deleted from the
          Contributor Version; 2)  separate from the Contributor Version;
          3)  for infringements caused by: i) third party modifications of
          Contributor Version or ii)  the combination of Modifications made
          by that Contributor with other software  (except as part of the
          Contributor Version) or other devices; or 4) under Patent Claims
          infringed by Covered Code in the absence of Modifications made by
          that Contributor.

3. Distribution Obligations.

     3.1. Application of License.
     The Modifications which You create or to which You contribute are
     governed by the terms of this License, including without limitation
     Section 2.2. The Source Code version of Covered Code may be
     distributed only under the terms of this License or a future version
     of this License released under Section 6.1, and You must include a
     copy of this License with every copy of the Source Code You
     distribute. You may not offer or impose any terms on any Source Code
     version that alters or restricts the applicable version of this
     License or the recipients' rights hereunder. However, You may include
     an additional document offering the additional rights described in
     Section 3.5.

     3.2. Availability of Source Code.
     Any Modification which You create or to which You contribute must be
     made available in Source Code form under the terms of this License
     either on the same media as an Executable version or via an accepted
     Electronic Distribution Mechanism to anyone to whom you made an
     Executable version available; and if made available via Electronic
     Distribution Mechanism, must remain available for at least twelve (12)
     months after the date it initially became available, or at least six
     (6) months after a subsequent version of that particular Modification
     has been made available to such recipients. You are responsible for
     ensuring that the Source Code version remains available even if the
     Electronic Distribution Mechanism is maintained by a third party.

     3.3. Description of Modifications.
     You must cause all Covered Code to which You contribute to contain a
     file documenting the changes You made to create that Covered Code and
     the date of any change. You must include a prominent statement that
     the Modification is derived, directly or indirectly, from Original
     Code provided by the Initial Developer and including the name of the
     Initial Developer in (a) the Source Code, and (b) in any notice in an
     Executable version or related documentation in which You describe the
     origin or ownership of the Covered Code.

     3.4. Intellectual Property Matters
          (a) Third Party Claims.
          If Contributor has knowledge that a license under a third party's
          intellectual property rights is required to exercise the rights
          granted by such Contributor under Sections 2.1 or 2.2,
          Contributor must include a text file with the Source Code
          distribution titled "LEGAL" which describes the claim and the
          party making the claim in sufficient detail that a recipient will
          know whom to contact. If Contributor obtains such knowledge after
          the Modification is made available as described in Section 3.2,
          Contributor shall promptly modify the LEGAL file in all copies
          Contributor makes available thereafter and shall take other steps
          (such as notifying appropriate mailing lists or newsgroups)
          reasonably calculated to inform those who received the Covered
          Code that new knowledge has been obtained.

          (b) Contributor APIs.
          If Contributor's Modifications include an application programming
          interface and Contributor has knowledge of patent licenses which
          are reasonably necessary to implement that API, Contributor must
          also include this information in the LEGAL file.

               (c)    Representations.
          Contributor represents that, except as disclosed pursuant to
          Section 3.4(a) above, Contributor believes that Contributor's
          Modifications are Contributor's original creation(s) and/or
          Contributor has sufficient rights to grant the rights conveyed by
          this License.

     3.5. Required Notices.
     You must duplicate the notice in Exhibit A in each file of the Source
     Code.  If it is not possible to put such notice in a particular Source
     Code file due to its structure, then You must include such notice in a
     location (such as a relevant directory) where a user would be likely
     to look for such a notice.  If You created one or more Modification(s)
     You may add your name as a Contributor to the notice described in
     Exhibit A.  You must also duplicate this License in any documentation
     for the Source Code where You describe recipients' rights or ownership
     rights relating to Covered Code.  You may choose to offer, and to
     charge a fee for, warranty, support, indemnity or liability
     obligations to one or more recipients of Covered Code. However, You
     may do so only on Your own behalf, and not on behalf of the Initial
     Developer or any Contributor. You must make it absolutely clear than
     any such warranty, support, indemnity or liability obligation is
     offered by You alone, and You hereby agree to indemnify the Initial
     Developer and every Contributor for any liability incurred by the
     Initial Developer or such Contributor as a result of warranty,
     support, indemnity or liability terms You offer.

     3.6. Distribution of Executable Versions.
     You may distribute Covered Code in Executable form only if the
     requirements of Section 3.1-3.5 have been met for that Covered Code,
     and if You include a notice stating that the Source Code version of
     the Covered Code is available under the terms of this License,
     including a description of how and where You have fulfilled the
     obligations of Section 3.2. The notice must be conspicuously included
     in any notice in an Executable version, related documentation or
     collateral in which You describe recipients' rights relating to the
     Covered Code. You may distribute the Executable version of Covered
     Code or ownership rights under a license of Your choice, which may
     contain terms different from this License, provided that You are in
     compliance with the terms of this License and that the license for the
     Executable version does not attempt to limit or alter the recipient's
     rights in the Source Code version from the rights set forth in this
     License. If You distribute the Executable version under a different
     license You must make it absolutely clear that any terms which differ
     from this License are offered by You alone, not by the Initial
     Developer or any Contributor. You hereby agree to indemnify the
     Initial Developer and every Contributor for any liability incurred by
     the Initial Developer or such Contributor as a result of any such
     terms You offer.

     3.7. Larger Works.
     You may create a Larger Work by combining Covered Code with other code
     not governed by the terms of this License and distribute the Larger
     Work as a single product. In such a case, You must make sure the
     requirements of this License are fulfilled for the Covered Code.

4. Inability to Comply Due to Statute or Regulation.

     If it is impossible for You to comply with any of the terms of this
     License with respect to some or all of the Covered Code due to
     statute, judicial order, or regulation then You must: (a) comply with
     the terms of this License to the maximum extent possible; and (b)
     describe the limitations and the code they affect. Such description
     must be included in the LEGAL file described in Section 3.4 and must
     be included with all distributions of the Source Code. Except to the
     extent prohibited by statute or regulation, such description must be
     sufficiently detailed for a recipient of ordinary skill to be able to
     understand it.

5. Application of this License.

     This License applies to code to which the Initial Developer has
     attached the notice in Exhibit A and to related Covered Code.

6. Versions of the License.

     6.1. New Versions.
     Netscape Communications Corporation ("Netscape") may publish revised
     and/or new versions of the License from time to time. Each version
     will be given a distinguishing version number.

     6.2. Effect of New Versions.
     Once Covered Code has been published under a particular version of the
     License, You may always continue to use it under the terms of that
     version. You may also choose to use such Covered Code under the terms
     of any subsequent version of the License published by Netscape. No one
     other than Netscape has the right to modify the terms applicable to
     Covered Code created under this License.

     6.3. Derivative Works.
     If You create or use a modified version of this License (which you may
     only do in order to apply it to code which is not already Covered Code
     governed by this License), You must (a) rename Your license so that
     the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
     "MPL", "NPL" or any confusingly similar phrase do not appear in your
     license (except to note that your license differs from this License)
     and (b) otherwise make it clear that Your version of the license
     contains terms which differ from the Mozilla Public License and
     Netscape Public License. (Filling in the name of the Initial
     Developer, Original Code or Contributor in the notice described in
     Exhibit A shall not of themselves be deemed to be modifications of
     this License.)

7. DISCLAIMER OF WARRANTY.

     COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
     WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
     WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
     DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
     THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
     IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
     YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
     COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
     OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
     ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.

8. TERMINATION.

     8.1.  This License and the rights granted hereunder will terminate
     automatically if You fail to comply with terms herein and fail to cure
     such breach within 30 days of becoming aware of the breach. All
     sublicenses to the Covered Code which are properly granted shall
     survive any termination of this License. Provisions which, by their
     nature, must remain in effect beyond the termination of this License
     shall survive.

     8.2.  If You initiate litigation by asserting a patent infringement
     claim (excluding declatory judgment actions) against Initial Developer
     or a Contributor (the Initial Developer or Contributor against whom
     You file such action is referred to as "Participant")  alleging that:

     (a)  such Participant's Contributor Version directly or indirectly
     infringes any patent, then any and all rights granted by such
     Participant to You under Sections 2.1 and/or 2.2 of this License
     shall, upon 60 days notice from Participant terminate prospectively,
     unless if within 60 days after receipt of notice You either: (i)
     agree in writing to pay Participant a mutually agreeable reasonable
     royalty for Your past and future use of Modifications made by such
     Participant, or (ii) withdraw Your litigation claim with respect to
     the Contributor Version against such Participant.  If within 60 days
     of notice, a reasonable royalty and payment arrangement are not
     mutually agreed upon in writing by the parties or the litigation claim
     is not withdrawn, the rights granted by Participant to You under
     Sections 2.1 and/or 2.2 automatically terminate at the expiration of
     the 60 day notice period specified above.

     (b)  any software, hardware, or device, other than such Participant's
     Contributor Version, directly or indirectly infringes any patent, then
     any rights granted to You by such Participant under Sections 2.1(b)
     and 2.2(b) are revoked effective as of the date You first made, used,
     sold, distributed, or had made, Modifications made by that
     Participant.

     8.3.  If You assert a patent infringement claim against Participant
     alleging that such Participant's Contributor Version directly or
     indirectly infringes any patent where such claim is resolved (such as
     by license or settlement) prior to the initiation of patent
     infringement litigation, then the reasonable value of the licenses
     granted by such Participant under Sections 2.1 or 2.2 shall be taken
     into account in determining the amount or value of any payment or
     license.

     8.4.  In the event of termination under Sections 8.1 or 8.2 above,
     all end user license agreements (excluding distributors and resellers)
     which have been validly granted by You or any distributor hereunder
     prior to termination shall survive termination.

9. LIMITATION OF LIABILITY.

     UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
     (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
     DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
     OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
     ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
     CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
     WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
     COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
     INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
     LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
     RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
     PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
     EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
     THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.

10. U.S. GOVERNMENT END USERS.

     The Covered Code is a "commercial item," as that term is defined in
     48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
     software" and "commercial computer software documentation," as such
     terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
     C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
     all U.S. Government End Users acquire Covered Code with only those
     rights set forth herein.

11. MISCELLANEOUS.

     This License represents the complete agreement concerning subject
     matter hereof. If any provision of this License is held to be
     unenforceable, such provision shall be reformed only to the extent
     necessary to make it enforceable. This License shall be governed by
     California law provisions (except to the extent applicable law, if
     any, provides otherwise), excluding its conflict-of-law provisions.
     With respect to disputes in which at least one party is a citizen of,
     or an entity chartered or registered to do business in the United
     States of America, any litigation relating to this License shall be
     subject to the jurisdiction of the Federal Courts of the Northern
     District of California, with venue lying in Santa Clara County,
     California, with the losing party responsible for costs, including
     without limitation, court costs and reasonable attorneys' fees and
     expenses. The application of the United Nations Convention on
     Contracts for the International Sale of Goods is expressly excluded.
     Any law or regulation which provides that the language of a contract
     shall be construed against the drafter shall not apply to this
     License.

12. RESPONSIBILITY FOR CLAIMS.

     As between Initial Developer and the Contributors, each party is
     responsible for claims and damages arising, directly or indirectly,
     out of its utilization of rights under this License and You agree to
     work with Initial Developer and Contributors to distribute such
     responsibility on an equitable basis. Nothing herein is intended or
     shall be deemed to constitute any admission of liability.

13. MULTIPLE-LICENSED CODE.

     Initial Developer may designate portions of the Covered Code as
     "Multiple-Licensed".  "Multiple-Licensed" means that the Initial
     Developer permits you to utilize portions of the Covered Code under
     Your choice of the NPL or the alternative licenses, if any, specified
     by the Initial Developer in the file described in Exhibit A.

EXHIBIT A -Mozilla Public License.

     ``The contents of this file are subject to the Mozilla Public License
     Version 1.1 (the "License"); you may not use this file except in
     compliance with the License. You may obtain a copy of the License at
     http://www.mozilla.org/MPL/

     Software distributed under the License is distributed on an "AS IS"
     basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
     License for the specific language governing rights and limitations
     under the License.

     The Original Code is ______________________________________.

     The Initial Developer of the Original Code is ________________________.
     Portions created by ______________________ are Copyright (C) ______
     _______________________. All Rights Reserved.

     Contributor(s): ______________________________________.

     Alternatively, the contents of this file may be used under the terms
     of the _____ license (the  "[___] License"), in which case the
     provisions of [______] License are applicable instead of those
     above.  If you wish to allow use of your version of this file only
     under the terms of the [____] License and not to allow others to use
     your version of this file under the MPL, indicate your decision by
     deleting  the provisions above and replace  them with the notice and
     other provisions required by the [___] License.  If you do not delete
     the provisions above, a recipient may use your version of this file
     under either the MPL or the [___] License."

     [NOTE: The text of this Exhibit A may differ slightly from the text of
     the notices in the Source Code files of the Original Code. You should
     use the text of this Exhibit A rather than the text found in the
     Original Code Source Code for Your Modifications.]
components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/config.js000060400000002245152453623450026063 0ustar00
CKEDITOR.editorConfig = function( config ) {

	config.toolbarGroups = [
		{ name: 'clipboard',   groups: [ 'clipboard', 'undo' ] },
		{ name: 'editing',     groups: [ 'find', 'selection', 'spellchecker' ] },
		{ name: 'links' },
		{ name: 'insert' },
		{ name: 'forms' },
		{ name: 'tools' },
		{ name: 'document',	   groups: [ 'mode', 'document', 'doctools' ] },
		{ name: 'others' },
		'/',
		{ name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ] },
		{ name: 'paragraph',   groups: [ 'list', 'indent', 'blocks', 'align', 'bidi' ] },
		{ name: 'styles' },
		{ name: 'colors' },
		{ name: 'about' }
	];

	config.removeButtons = 'Underline,Subscript,Superscript';


	config.removeDialogTabs = 'image:advanced;link:advanced';

	//-----------------------//
	config.startupFocus = false;
	config.fillEmptyBlocks = false;
	config.filebrowserBrowseUrl = '';
	config.filebrowserImageBrowseUrl = '';
	config.filebrowserFlashBrowseUrl = '';
	config.filebrowserUploadUrl = '';
	config.filebrowserImageUploadUrl = '';
	config.filebrowserFlashUploadUrl = '';
	config.allowedContent = true;
	config.disableNativeSpellChecker = false;
	config.stylesSet = [];
	config.entities_greek = false;
};

components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/lang/index.html000060400000000054152453623450027172 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/lang/nl.js000060400000026510152453623450026151 0ustar00CKEDITOR.lang['nl']={"editor":"Tekstverwerker","editorPanel":"Tekstverwerker beheerpaneel","common":{"editorHelp":"Druk ALT 0 voor hulp","browseServer":"Bladeren op server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Naar server verzenden","image":"Afbeelding","flash":"Flash","form":"Formulier","checkbox":"Selectievinkje","radio":"Keuzerondje","textField":"Tekstveld","textarea":"Tekstvak","hiddenField":"Verborgen veld","button":"Knop","select":"Selectieveld","imageButton":"Afbeeldingsknop","notSet":"<niet ingevuld>","id":"Id","name":"Naam","langDir":"Schrijfrichting","langDirLtr":"Links naar rechts (LTR)","langDirRtl":"Rechts naar links (RTL)","langCode":"Taalcode","longDescr":"Lange URL-omschrijving","cssClass":"Stylesheet-klassen","advisoryTitle":"Adviserende titel","cssStyle":"Stijl","ok":"OK","cancel":"Annuleren","close":"Sluiten","preview":"Voorbeeld","resize":"Sleep om te herschalen","generalTab":"Algemeen","advancedTab":"Geavanceerd","validateNumberFailed":"Deze waarde is geen geldig getal.","confirmNewPage":"Alle aangebrachte wijzigingen gaan verloren. Weet u zeker dat u een nieuwe pagina wilt openen?","confirmCancel":"Enkele opties zijn gewijzigd. Weet u zeker dat u dit dialoogvenster wilt sluiten?","options":"Opties","target":"Doelvenster","targetNew":"Nieuw venster (_blank)","targetTop":"Hele venster (_top)","targetSelf":"Zelfde venster (_self)","targetParent":"Origineel venster (_parent)","langDirLTR":"Links naar rechts (LTR)","langDirRTL":"Rechts naar links (RTL)","styles":"Stijl","cssClasses":"Stylesheet-klassen","width":"Breedte","height":"Hoogte","align":"Uitlijning","alignLeft":"Links","alignRight":"Rechts","alignCenter":"Centreren","alignJustify":"Uitvullen","alignTop":"Boven","alignMiddle":"Midden","alignBottom":"Onder","alignNone":"Geen","invalidValue":"Ongeldige waarde.","invalidHeight":"De hoogte moet een getal zijn.","invalidWidth":"De breedte moet een getal zijn.","invalidCssLength":"Waarde in veld \"%1\" moet een positief nummer zijn, met of zonder een geldige CSS meeteenheid (px, %, in, cm, mm, em, ex, pt of pc).","invalidHtmlLength":"Waarde in veld \"%1\" moet een positief nummer zijn, met of zonder een geldige HTML meeteenheid (px of %).","invalidInlineStyle":"Waarde voor de online stijl moet bestaan uit een of meerdere tupels met het formaat \"naam : waarde\", gescheiden door puntkomma's.","cssLengthTooltip":"Geef een nummer in voor een waarde in pixels of geef een nummer in met een geldige CSS eenheid (px, %, in, cm, mm, em, ex, pt, of pc).","unavailable":"%1<span class=\"cke_accessibility\">, niet beschikbaar</span>"},"basicstyles":{"bold":"Vet","italic":"Cursief","strike":"Doorhalen","subscript":"Subscript","superscript":"Superscript","underline":"Onderstrepen"},"blockquote":{"toolbar":"Citaatblok"},"clipboard":{"copy":"Kopiëren","copyError":"De beveiligingsinstelling van de browser verhinderen het automatisch kopiëren. Gebruik de sneltoets Ctrl/Cmd+C van het toetsenbord.","cut":"Knippen","cutError":"De beveiligingsinstelling van de browser verhinderen het automatisch knippen. Gebruik de sneltoets Ctrl/Cmd+X van het toetsenbord.","paste":"Plakken","pasteArea":"Plakgebied","pasteMsg":"Plak de tekst in het volgende vak gebruikmakend van uw toetsenbord (<strong>Ctrl/Cmd+V</strong>) en klik op OK.","securityMsg":"Door de beveiligingsinstellingen van uw browser is het niet mogelijk om direct vanuit het klembord in de editor te plakken. Middels opnieuw plakken in dit venster kunt u de tekst alsnog plakken in de editor.","title":"Plakken"},"button":{"selectedLabel":"%1 (Geselecteerd)"},"colorbutton":{"auto":"Automatisch","bgColorTitle":"Achtergrondkleur","colors":{"000":"Zwart","800000":"Kastanjebruin","8B4513":"Chocoladebruin","2F4F4F":"Donkerleigrijs","008080":"Blauwgroen","000080":"Marine","4B0082":"Indigo","696969":"Donkergrijs","B22222":"Baksteen","A52A2A":"Bruin","DAA520":"Donkergeel","006400":"Donkergroen","40E0D0":"Turquoise","0000CD":"Middenblauw","800080":"Paars","808080":"Grijs","F00":"Rood","FF8C00":"Donkeroranje","FFD700":"Goud","008000":"Groen","0FF":"Cyaan","00F":"Blauw","EE82EE":"Violet","A9A9A9":"Donkergrijs","FFA07A":"Lichtzalm","FFA500":"Oranje","FFFF00":"Geel","00FF00":"Felgroen","AFEEEE":"Lichtturquoise","ADD8E6":"Lichtblauw","DDA0DD":"Pruim","D3D3D3":"Lichtgrijs","FFF0F5":"Linnen","FAEBD7":"Ivoor","FFFFE0":"Lichtgeel","F0FFF0":"Honingdauw","F0FFFF":"Azuur","F0F8FF":"Licht hemelsblauw","E6E6FA":"Lavendel","FFF":"Wit"},"more":"Meer kleuren...","panelTitle":"Kleuren","textColorTitle":"Tekstkleur"},"colordialog":{"clear":"Wissen","highlight":"Actief","options":"Kleuropties","selected":"Geselecteerde kleur","title":"Selecteer kleur"},"contextmenu":{"options":"Contextmenu opties"},"elementspath":{"eleLabel":"Elementenpad","eleTitle":"%1 element"},"font":{"fontSize":{"label":"Lettergrootte","voiceLabel":"Lettergrootte","panelTitle":"Lettergrootte"},"label":"Lettertype","panelTitle":"Lettertype","voiceLabel":"Lettertype"},"format":{"label":"Opmaak","panelTitle":"Opmaak","tag_address":"Adres","tag_div":"Normaal (DIV)","tag_h1":"Kop 1","tag_h2":"Kop 2","tag_h3":"Kop 3","tag_h4":"Kop 4","tag_h5":"Kop 5","tag_h6":"Kop 6","tag_p":"Normaal","tag_pre":"Met opmaak"},"horizontalrule":{"toolbar":"Horizontale lijn invoegen"},"image":{"alertUrl":"Geef de URL van de afbeelding","alt":"Alternatieve tekst","border":"Rand","btnUpload":"Naar server verzenden","button2Img":"Wilt u de geselecteerde afbeeldingsknop vervangen door een eenvoudige afbeelding?","hSpace":"HSpace","img2Button":"Wilt u de geselecteerde afbeelding vervangen door een afbeeldingsknop?","infoTab":"Informatie afbeelding","linkTab":"Link","lockRatio":"Afmetingen vergrendelen","menu":"Eigenschappen afbeelding","resetSize":"Afmetingen resetten","title":"Eigenschappen afbeelding","titleButton":"Eigenschappen afbeeldingsknop","upload":"Upload","urlMissing":"De URL naar de afbeelding ontbreekt.","vSpace":"VSpace","validateBorder":"Rand moet een heel nummer zijn.","validateHSpace":"HSpace moet een heel nummer zijn.","validateVSpace":"VSpace moet een heel nummer zijn."},"indent":{"indent":"Inspringing vergroten","outdent":"Inspringing verkleinen"},"justify":{"block":"Uitvullen","center":"Centreren","left":"Links uitlijnen","right":"Rechts uitlijnen"},"fakeobjects":{"anchor":"Interne link","flash":"Flash animatie","hiddenfield":"Verborgen veld","iframe":"IFrame","unknown":"Onbekend object"},"link":{"acccessKey":"Toegangstoets","advanced":"Geavanceerd","advisoryContentType":"Aanbevolen content-type","advisoryTitle":"Adviserende titel","anchor":{"toolbar":"Interne link","menu":"Eigenschappen interne link","title":"Eigenschappen interne link","name":"Naam interne link","errorName":"Geef de naam van de interne link op","remove":"Interne link verwijderen"},"anchorId":"Op kenmerk interne link","anchorName":"Op naam interne link","charset":"Karakterset van gelinkte bron","cssClasses":"Stylesheet-klassen","emailAddress":"E-mailadres","emailBody":"Inhoud bericht","emailSubject":"Onderwerp bericht","id":"Id","info":"Linkomschrijving","langCode":"Taalcode","langDir":"Schrijfrichting","langDirLTR":"Links naar rechts (LTR)","langDirRTL":"Rechts naar links (RTL)","menu":"Link wijzigen","name":"Naam","noAnchors":"(Geen interne links in document gevonden)","noEmail":"Geef een e-mailadres","noUrl":"Geef de link van de URL","other":"<ander>","popupDependent":"Afhankelijk (Netscape)","popupFeatures":"Instellingen popupvenster","popupFullScreen":"Volledig scherm (IE)","popupLeft":"Positie links","popupLocationBar":"Locatiemenu","popupMenuBar":"Menubalk","popupResizable":"Herschaalbaar","popupScrollBars":"Schuifbalken","popupStatusBar":"Statusbalk","popupToolbar":"Werkbalk","popupTop":"Positie boven","rel":"Relatie","selectAnchor":"Kies een interne link","styles":"Stijl","tabIndex":"Tabvolgorde","target":"Doelvenster","targetFrame":"<frame>","targetFrameName":"Naam doelframe","targetPopup":"<popupvenster>","targetPopupName":"Naam popupvenster","title":"Link","toAnchor":"Interne link in pagina","toEmail":"E-mail","toUrl":"URL","toolbar":"Link invoegen/wijzigen","type":"Linktype","unlink":"Link verwijderen","upload":"Upload"},"list":{"bulletedlist":"Opsomming invoegen","numberedlist":"Genummerde lijst invoegen"},"maximize":{"maximize":"Maximaliseren","minimize":"Minimaliseren"},"pastefromword":{"confirmCleanup":"De tekst die u wilt plakken lijkt gekopieerd te zijn vanuit Word. Wilt u de tekst opschonen voordat deze geplakt wordt?","error":"Het was niet mogelijk om de geplakte tekst op te schonen door een interne fout","title":"Plakken vanuit Word","toolbar":"Plakken vanuit Word"},"pastetext":{"button":"Plakken als platte tekst","title":"Plakken als platte tekst"},"removeformat":{"toolbar":"Opmaak verwijderen"},"sourcearea":{"toolbar":"Broncode"},"stylescombo":{"label":"Stijl","panelTitle":"Opmaakstijlen","panelTitle1":"Blok stijlen","panelTitle2":"Inline stijlen","panelTitle3":"Object stijlen"},"table":{"border":"Randdikte","caption":"Onderschrift","cell":{"menu":"Cel","insertBefore":"Voeg cel in voor","insertAfter":"Voeg cel in na","deleteCell":"Cellen verwijderen","merge":"Cellen samenvoegen","mergeRight":"Voeg samen naar rechts","mergeDown":"Voeg samen naar beneden","splitHorizontal":"Splits cel horizontaal","splitVertical":"Splits cel vertikaal","title":"Celeigenschappen","cellType":"Celtype","rowSpan":"Rijen samenvoegen","colSpan":"Kolommen samenvoegen","wordWrap":"Automatische terugloop","hAlign":"Horizontale uitlijning","vAlign":"Verticale uitlijning","alignBaseline":"Tekstregel","bgColor":"Achtergrondkleur","borderColor":"Randkleur","data":"Gegevens","header":"Kop","yes":"Ja","no":"Nee","invalidWidth":"De celbreedte moet een getal zijn.","invalidHeight":"De celhoogte moet een getal zijn.","invalidRowSpan":"Rijen samenvoegen moet een heel getal zijn.","invalidColSpan":"Kolommen samenvoegen moet een heel getal zijn.","chooseColor":"Kies"},"cellPad":"Celopvulling","cellSpace":"Celafstand","column":{"menu":"Kolom","insertBefore":"Voeg kolom in voor","insertAfter":"Voeg kolom in na","deleteColumn":"Kolommen verwijderen"},"columns":"Kolommen","deleteTable":"Tabel verwijderen","headers":"Koppen","headersBoth":"Beide","headersColumn":"Eerste kolom","headersNone":"Geen","headersRow":"Eerste rij","invalidBorder":"De randdikte moet een getal zijn.","invalidCellPadding":"Celopvulling moet een getal zijn.","invalidCellSpacing":"Celafstand moet een getal zijn.","invalidCols":"Het aantal kolommen moet een getal zijn groter dan 0.","invalidHeight":"De tabelhoogte moet een getal zijn.","invalidRows":"Het aantal rijen moet een getal zijn groter dan 0.","invalidWidth":"De tabelbreedte moet een getal zijn.","menu":"Tabeleigenschappen","row":{"menu":"Rij","insertBefore":"Voeg rij in voor","insertAfter":"Voeg rij in na","deleteRow":"Rijen verwijderen"},"rows":"Rijen","summary":"Samenvatting","title":"Tabeleigenschappen","toolbar":"Tabel","widthPc":"procent","widthPx":"pixels","widthUnit":"eenheid breedte"},"toolbar":{"toolbarCollapse":"Werkbalk inklappen","toolbarExpand":"Werkbalk uitklappen","toolbarGroups":{"document":"Document","clipboard":"Klembord/Ongedaan maken","editing":"Bewerken","forms":"Formulieren","basicstyles":"Basisstijlen","paragraph":"Paragraaf","links":"Links","insert":"Invoegen","styles":"Stijlen","colors":"Kleuren","tools":"Toepassingen"},"toolbars":"Werkbalken"},"undo":{"redo":"Opnieuw uitvoeren","undo":"Ongedaan maken"},"sourcedialog":{"toolbar":"Broncode","title":"Broncode"},"acymediabrowser":{"toolbar":"Afbeelding"},"addtag":{"toolbar":"Tags"},"smiley":{"toolbar":"Emojis"}};
components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/lang/de.js000060400000027201152453623450026126 0ustar00CKEDITOR.lang['de']={"editor":"WYSIWYG-Editor","editorPanel":"WYSIWYG-Editor-Leiste","common":{"editorHelp":"Drücken Sie ALT 0 für Hilfe","browseServer":"Server durchsuchen","url":"URL","protocol":"Protokoll","upload":"Hochladen","uploadSubmit":"Zum Server senden","image":"Bild","flash":"Flash","form":"Formular","checkbox":"Checkbox","radio":"Radiobutton","textField":"Textfeld einzeilig","textarea":"Textfeld mehrzeilig","hiddenField":"Verstecktes Feld","button":"Klickbutton","select":"Auswahlfeld","imageButton":"Bildbutton","notSet":"<nichts>","id":"ID","name":"Name","langDir":"Schreibrichtung","langDirLtr":"Links nach Rechts (LTR)","langDirRtl":"Rechts nach Links (RTL)","langCode":"Sprachenkürzel","longDescr":"Langform URL","cssClass":"Stylesheet Klasse","advisoryTitle":"Titel Beschreibung","cssStyle":"Style","ok":"OK","cancel":"Abbrechen","close":"Schließen","preview":"Vorschau","resize":"Zum Vergrößern ziehen","generalTab":"Allgemein","advancedTab":"Erweitert","validateNumberFailed":"Dieser Wert ist keine Nummer.","confirmNewPage":"Alle nicht gespeicherten Änderungen gehen verlohren. Sind Sie sicher die neue Seite zu laden?","confirmCancel":"Einige Optionen wurden geändert. Wollen Sie den Dialog dennoch schließen?","options":"Optionen","target":"Zielseite","targetNew":"Neues Fenster (_blank)","targetTop":"Oberstes Fenster (_top)","targetSelf":"Gleiches Fenster (_self)","targetParent":"Oberes Fenster (_parent)","langDirLTR":"Links nach Rechts (LNR)","langDirRTL":"Rechts nach Links (RNL)","styles":"Style","cssClasses":"Stylesheet Klasse","width":"Breite","height":"Höhe","align":"Ausrichtung","alignLeft":"Links","alignRight":"Rechts","alignCenter":"Zentriert","alignJustify":"Blocksatz","alignTop":"Oben","alignMiddle":"Mitte","alignBottom":"Unten","alignNone":"Keine","invalidValue":"Ungültiger Wert.","invalidHeight":"Höhe muss eine Zahl sein.","invalidWidth":"Breite muss eine Zahl sein.","invalidCssLength":"Wert spezifiziert für \"%1\" Feld muss ein positiver numerischer Wert sein mit oder ohne korrekte CSS Messeinheit (px, %, in, cm, mm, em, ex, pt oder pc).","invalidHtmlLength":"Wert spezifiziert für \"%1\" Feld muss ein positiver numerischer Wert sein mit oder ohne korrekte HTML Messeinheit (px oder %).","invalidInlineStyle":"Wert spezifiziert für inline Stilart muss enthalten ein oder mehr Tupels mit dem Format \"Name : Wert\" getrennt mit Semikolons.","cssLengthTooltip":"Gebe eine Zahl ein für ein Wert in pixels oder eine Zahl mit einer korrekten CSS Messeinheit (px, %, in, cm, mm, em, ex, pt oder pc).","unavailable":"%1<span class=\"cke_accessibility\">, nicht verfügbar</span>"},"basicstyles":{"bold":"Fett","italic":"Kursiv","strike":"Durchgestrichen","subscript":"Tiefgestellt","superscript":"Hochgestellt","underline":"Unterstrichen"},"blockquote":{"toolbar":"Zitatblock"},"clipboard":{"copy":"Kopieren","copyError":"Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch kopieren. Bitte benutzen Sie die System-Zwischenablage über STRG-C (kopieren).","cut":"Ausschneiden","cutError":"Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch auszuschneiden. Bitte benutzen Sie die System-Zwischenablage über STRG-X (ausschneiden) und STRG-V (einfügen).","paste":"Einfügen","pasteArea":"Einfügebereich","pasteMsg":"Bitte fügen Sie den Text in der folgenden Box über die Tastatur (mit <STRONG>Strg+V</STRONG>) ein und bestätigen Sie mit <STRONG>OK</STRONG>.","securityMsg":"Aufgrund von Sicherheitsbeschränkungen Ihres Browsers kann der Editor nicht direkt auf die Zwischenablage zugreifen. Bitte fügen Sie den Inhalt erneut in diesem Fenster ein.","title":"Einfügen"},"button":{"selectedLabel":"%1 (Ausgewählt)"},"colorbutton":{"auto":"Automatisch","bgColorTitle":"Hintergrundfarbe","colors":{"000":"Schwarz","800000":"Kastanienbraun","8B4513":"Braun","2F4F4F":"Dunkles Schiefergrau","008080":"Blaugrün","000080":"Navy","4B0082":"Indigo","696969":"Dunkelgrau","B22222":"Ziegelrot","A52A2A":"Braun","DAA520":"Goldgelb","006400":"Dunkelgrün","40E0D0":"Türkis","0000CD":"Medium Blau","800080":"Lila","808080":"Grau","F00":"Rot","FF8C00":"Dunkelorange","FFD700":"Gold","008000":"Grün","0FF":"Cyan","00F":"Blau","EE82EE":"Hellviolett","A9A9A9":"Dunkelgrau","FFA07A":"Helles Lachsrosa","FFA500":"Orange","FFFF00":"Gelb","00FF00":"Lime","AFEEEE":"Blaß-Türkis","ADD8E6":"Hellblau","DDA0DD":"Pflaumenblau","D3D3D3":"Hellgrau","FFF0F5":"Lavendel","FAEBD7":"Antik Weiß","FFFFE0":"Hellgelb","F0FFF0":"Honigtau","F0FFFF":"Azurblau","F0F8FF":"Alice Blau","E6E6FA":"Lavendel","FFF":"Weiß"},"more":"Weitere Farben...","panelTitle":"Farben","textColorTitle":"Textfarbe"},"colordialog":{"clear":"Entfernen","highlight":"Hervorheben","options":"Farbeoptionen","selected":"Ausgewählte Farbe","title":"Farbe wählen"},"contextmenu":{"options":"Kontextmenü Optionen"},"elementspath":{"eleLabel":"Elements Pfad","eleTitle":"%1 Element"},"font":{"fontSize":{"label":"Größe","voiceLabel":"Schrifgröße","panelTitle":"Größe"},"label":"Schriftart","panelTitle":"Schriftart","voiceLabel":"Schriftart"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Addresse","tag_div":"Normal (DIV)","tag_h1":"Überschrift 1","tag_h2":"Überschrift 2","tag_h3":"Überschrift 3","tag_h4":"Überschrift 4","tag_h5":"Überschrift 5","tag_h6":"Überschrift 6","tag_p":"Normal","tag_pre":"Formatiert"},"horizontalrule":{"toolbar":"Horizontale Linie einfügen"},"image":{"alertUrl":"Bitte geben Sie die Bild-URL an","alt":"Alternativer Text","border":"Rahmen","btnUpload":"Zum Server senden","button2Img":"Möchten Sie den gewählten Bild-Button in ein einfaches Bild umwandeln?","hSpace":"Horizontal-Abstand","img2Button":"Möchten Sie das gewählten Bild in einen Bild-Button umwandeln?","infoTab":"Bild-Info","linkTab":"Link","lockRatio":"Größenverhältnis beibehalten","menu":"Bild-Eigenschaften","resetSize":"Größe zurücksetzen","title":"Bild-Eigenschaften","titleButton":"Bildbutton-Eigenschaften","upload":"Hochladen","urlMissing":"Imagequelle URL fehlt.","vSpace":"Vertikal-Abstand","validateBorder":"Rahmen muß eine ganze Zahl sein.","validateHSpace":"Horizontal-Abstand muß eine ganze Zahl sein.","validateVSpace":"Vertikal-Abstand muß eine ganze Zahl sein."},"indent":{"indent":"Einzug erhöhen","outdent":"Einzug verringern"},"justify":{"block":"Blocksatz","center":"Zentriert","left":"Linksbündig","right":"Rechtsbündig"},"fakeobjects":{"anchor":"Anker","flash":"Flash Animation","hiddenfield":"Verstecktes Feld","iframe":"IFrame","unknown":"Unbekanntes Objekt"},"link":{"acccessKey":"Zugriffstaste","advanced":"Erweitert","advisoryContentType":"Inhaltstyp","advisoryTitle":"Titel Beschreibung","anchor":{"toolbar":"Anker einfügen/editieren","menu":"Anker-Eigenschaften","title":"Anker-Eigenschaften","name":"Anker Name","errorName":"Bitte geben Sie den Namen des Ankers ein","remove":"Anker entfernen"},"anchorId":"nach Element Id","anchorName":"nach Anker Name","charset":"Ziel-Zeichensatz","cssClasses":"Stylesheet Klasse","emailAddress":"E-Mail Adresse","emailBody":"Nachrichtentext","emailSubject":"Betreffzeile","id":"Id","info":"Link-Info","langCode":"Sprachenkürzel","langDir":"Schreibrichtung","langDirLTR":"Links nach Rechts (LTR)","langDirRTL":"Rechts nach Links (RTL)","menu":"Link editieren","name":"Name","noAnchors":"(keine Anker im Dokument vorhanden)","noEmail":"Bitte geben Sie e-Mail Adresse an","noUrl":"Bitte geben Sie die Link-URL an","other":"<andere>","popupDependent":"Abhängig (Netscape)","popupFeatures":"Pop-up Fenster-Eigenschaften","popupFullScreen":"Vollbild (IE)","popupLeft":"Linke Position","popupLocationBar":"Adress-Leiste","popupMenuBar":"Menü-Leiste","popupResizable":"Größe änderbar","popupScrollBars":"Rollbalken","popupStatusBar":"Statusleiste","popupToolbar":"Symbolleiste","popupTop":"Obere Position","rel":"Beziehung","selectAnchor":"Anker auswählen","styles":"Style","tabIndex":"Tab-Index","target":"Zielseite","targetFrame":"<Frame>","targetFrameName":"Ziel-Fenster-Name","targetPopup":"<Pop-up Fenster>","targetPopupName":"Pop-up Fenster-Name","title":"Link","toAnchor":"Anker in dieser Seite","toEmail":"E-Mail","toUrl":"URL","toolbar":"Link einfügen/editieren","type":"Link-Typ","unlink":"Link entfernen","upload":"Hochladen"},"list":{"bulletedlist":"Liste","numberedlist":"Nummerierte Liste"},"maximize":{"maximize":"Maximieren","minimize":"Minimieren"},"pastefromword":{"confirmCleanup":"Der Text, den Sie einfügen möchten, scheint aus MS-Word kopiert zu sein. Möchten Sie ihn zuvor bereinigen lassen?","error":"Aufgrund eines internen Fehlers war es nicht möglich die eingefügten Daten zu bereinigen","title":"Aus MS-Word einfügen","toolbar":"Aus MS-Word einfügen"},"pastetext":{"button":"Als Text einfügen","title":"Als Text einfügen"},"removeformat":{"toolbar":"Formatierungen entfernen"},"sourcearea":{"toolbar":"Quellcode"},"stylescombo":{"label":"Stil","panelTitle":"Formatierungsstile","panelTitle1":"Block Stilart","panelTitle2":"Inline Stilart","panelTitle3":"Objekt Stilart"},"table":{"border":"Rahmen","caption":"Überschrift","cell":{"menu":"Zelle","insertBefore":"Zelle davor einfügen","insertAfter":"Zelle danach einfügen","deleteCell":"Zelle löschen","merge":"Zellen verbinden","mergeRight":"Nach rechts verbinden","mergeDown":"Nach unten verbinden","splitHorizontal":"Zelle horizontal teilen","splitVertical":"Zelle vertikal teilen","title":"Zellen-Eigenschaften","cellType":"Zellart","rowSpan":"Anzahl Zeilen verbinden","colSpan":"Anzahl Spalten verbinden","wordWrap":"Zeilenumbruch","hAlign":"Horizontale Ausrichtung","vAlign":"Vertikale Ausrichtung","alignBaseline":"Grundlinie","bgColor":"Hintergrundfarbe","borderColor":"Rahmenfarbe","data":"Daten","header":"Überschrift","yes":"Ja","no":"Nein","invalidWidth":"Zellenbreite muß eine Zahl sein.","invalidHeight":"Zellenhöhe muß eine Zahl sein.","invalidRowSpan":"\"Anzahl Zeilen verbinden\" muss eine Ganzzahl sein.","invalidColSpan":"\"Anzahl Spalten verbinden\" muss eine Ganzzahl sein.","chooseColor":"Wählen"},"cellPad":"Zellenabstand innen","cellSpace":"Zellenabstand außen","column":{"menu":"Spalte","insertBefore":"Spalte links davor einfügen","insertAfter":"Spalte rechts danach einfügen","deleteColumn":"Spalte löschen"},"columns":"Spalte","deleteTable":"Tabelle löschen","headers":"Kopfzeile","headersBoth":"Beide","headersColumn":"Erste Spalte","headersNone":"Keine","headersRow":"Erste Zeile","invalidBorder":"Die Rahmenbreite muß eine Zahl sein.","invalidCellPadding":"Der Zellenabstand innen muß eine positive Zahl sein.","invalidCellSpacing":"Der Zellenabstand außen muß eine positive Zahl sein.","invalidCols":"Die Anzahl der Spalten muß größer als 0 sein..","invalidHeight":"Die Tabellenbreite muß eine Zahl sein.","invalidRows":"Die Anzahl der Zeilen muß größer als 0 sein.","invalidWidth":"Die Tabellenbreite muss eine Zahl sein.","menu":"Tabellen-Eigenschaften","row":{"menu":"Zeile","insertBefore":"Zeile oberhalb einfügen","insertAfter":"Zeile unterhalb einfügen","deleteRow":"Zeile entfernen"},"rows":"Zeile","summary":"Inhaltsübersicht","title":"Tabellen-Eigenschaften","toolbar":"Tabelle","widthPc":"%","widthPx":"Pixel","widthUnit":"Breite Einheit"},"toolbar":{"toolbarCollapse":"Symbolleiste einklappen","toolbarExpand":"Symbolleiste ausklappen","toolbarGroups":{"document":"Dokument","clipboard":"Zwischenablage/Rückgängig","editing":"Editieren","forms":"Formularen","basicstyles":"Grundstile","paragraph":"Absatz","links":"Links","insert":"Einfügen","styles":"Stile","colors":"Farben","tools":"Werkzeuge"},"toolbars":"Editor Symbolleisten"},"undo":{"redo":"Wiederherstellen","undo":"Rückgängig"},"sourcedialog":{"toolbar":"Quellcode","title":"Quellcode"},"acymediabrowser":{"toolbar":"Bild"},"addtag":{"toolbar":"Schlagworte"},"smiley":{"toolbar":"Emojis"}};
components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/lang/pt-br.js000060400000027422152453623450026567 0ustar00CKEDITOR.lang['pt-br']={"editor":"Editor de Rich Text","editorPanel":"Painel do editor de Rich Text","common":{"editorHelp":"Pressione ALT+0 para ajuda","browseServer":"Localizar no Servidor","url":"URL","protocol":"Protocolo","upload":"Enviar ao Servidor","uploadSubmit":"Enviar para o Servidor","image":"Imagem","flash":"Flash","form":"Formulário","checkbox":"Caixa de Seleção","radio":"Botão de Opção","textField":"Caixa de Texto","textarea":"Área de Texto","hiddenField":"Campo Oculto","button":"Botão","select":"Caixa de Listagem","imageButton":"Botão de Imagem","notSet":"<não ajustado>","id":"Id","name":"Nome","langDir":"Direção do idioma","langDirLtr":"Esquerda para Direita (LTR)","langDirRtl":"Direita para Esquerda (RTL)","langCode":"Idioma","longDescr":"Descrição da URL","cssClass":"Classe de CSS","advisoryTitle":"Título","cssStyle":"Estilos","ok":"OK","cancel":"Cancelar","close":"Fechar","preview":"Visualizar","resize":"Arraste para redimensionar","generalTab":"Geral","advancedTab":"Avançado","validateNumberFailed":"Este valor não é um número.","confirmNewPage":"Todas as mudanças não salvas serão perdidas. Tem certeza de que quer abrir uma nova página?","confirmCancel":"Algumas opções foram alteradas. Tem certeza de que quer fechar a caixa de diálogo?","options":"Opções","target":"Destino","targetNew":"Nova Janela (_blank)","targetTop":"Janela de Cima (_top)","targetSelf":"Mesma Janela (_self)","targetParent":"Janela Pai (_parent)","langDirLTR":"Esquerda para Direita (LTR)","langDirRTL":"Direita para Esquerda (RTL)","styles":"Estilo","cssClasses":"Classes","width":"Largura","height":"Altura","align":"Alinhamento","alignLeft":"Esquerda","alignRight":"Direita","alignCenter":"Centralizado","alignJustify":"Justificar","alignTop":"Superior","alignMiddle":"Centralizado","alignBottom":"Inferior","alignNone":"Nenhum","invalidValue":"Valor inválido.","invalidHeight":"A altura tem que ser um número","invalidWidth":"A largura tem que ser um número.","invalidCssLength":"O valor do campo \"%1\" deve ser um número positivo opcionalmente seguido por uma válida unidade de medida de CSS (px, %, in, cm, mm, em, ex, pt ou pc).","invalidHtmlLength":"O valor do campo \"%1\" deve ser um número positivo opcionalmente seguido por uma válida unidade de medida de HTML (px ou %).","invalidInlineStyle":"O valor válido para estilo deve conter uma ou mais tuplas no formato \"nome : valor\", separados por ponto e vírgula.","cssLengthTooltip":"Insira um número para valor em pixels ou um número seguido de uma válida unidade de medida de CSS (px, %, in, cm, mm, em, ex, pt ou pc).","unavailable":"%1<span class=\"cke_accessibility\">, indisponível</span>"},"basicstyles":{"bold":"Negrito","italic":"Itálico","strike":"Tachado","subscript":"Subscrito","superscript":"Sobrescrito","underline":"Sublinhado"},"blockquote":{"toolbar":"Citação"},"clipboard":{"copy":"Copiar","copyError":"As configurações de segurança do seu navegador não permitem que o editor execute operações de copiar automaticamente. Por favor, utilize o teclado para copiar (Ctrl/Cmd+C).","cut":"Recortar","cutError":"As configurações de segurança do seu navegador não permitem que o editor execute operações de recortar automaticamente. Por favor, utilize o teclado para recortar (Ctrl/Cmd+X).","paste":"Colar","pasteArea":"Área para Colar","pasteMsg":"Transfira o link usado na caixa usando o teclado com (<STRONG>Ctrl/Cmd+V</STRONG>) e <STRONG>OK</STRONG>.","securityMsg":"As configurações de segurança do seu navegador não permitem que o editor acesse os dados da área de transferência diretamente. Por favor cole o conteúdo manualmente nesta janela.","title":"Colar"},"button":{"selectedLabel":"%1 (Selecionado)"},"colorbutton":{"auto":"Automático","bgColorTitle":"Cor do Plano de Fundo","colors":{"000":"Preto","800000":"Foquete","8B4513":"Marrom 1","2F4F4F":"Cinza 1","008080":"Cerceta","000080":"Azul Marinho","4B0082":"Índigo","696969":"Cinza 2","B22222":"Tijolo de Fogo","A52A2A":"Marrom 2","DAA520":"Vara Dourada","006400":"Verde Escuro","40E0D0":"Turquesa","0000CD":"Azul Médio","800080":"Roxo","808080":"Cinza 3","F00":"Vermelho","FF8C00":"Laranja Escuro","FFD700":"Dourado","008000":"Verde","0FF":"Ciano","00F":"Azul","EE82EE":"Violeta","A9A9A9":"Cinza Escuro","FFA07A":"Salmão Claro","FFA500":"Laranja","FFFF00":"Amarelo","00FF00":"Lima","AFEEEE":"Turquesa Pálido","ADD8E6":"Azul Claro","DDA0DD":"Ameixa","D3D3D3":"Cinza Claro","FFF0F5":"Lavanda 1","FAEBD7":"Branco Antiguidade","FFFFE0":"Amarelo Claro","F0FFF0":"Orvalho","F0FFFF":"Azure","F0F8FF":"Azul Alice","E6E6FA":"Lavanda 2","FFF":"Branco"},"more":"Mais Cores...","panelTitle":"Cores","textColorTitle":"Cor do Texto"},"colordialog":{"clear":"Limpar","highlight":"Grifar","options":"Opções de Cor","selected":"Cor Selecionada","title":"Selecione uma Cor"},"contextmenu":{"options":"Opções Menu de Contexto"},"elementspath":{"eleLabel":"Caminho dos Elementos","eleTitle":"Elemento %1"},"font":{"fontSize":{"label":"Tamanho","voiceLabel":"Tamanho da fonte","panelTitle":"Tamanho"},"label":"Fonte","panelTitle":"Fonte","voiceLabel":"Fonte"},"format":{"label":"Formatação","panelTitle":"Formatação","tag_address":"Endereço","tag_div":"Normal (DIV)","tag_h1":"Título 1","tag_h2":"Título 2","tag_h3":"Título 3","tag_h4":"Título 4","tag_h5":"Título 5","tag_h6":"Título 6","tag_p":"Normal","tag_pre":"Formatado"},"horizontalrule":{"toolbar":"Inserir Linha Horizontal"},"image":{"alertUrl":"Por favor, digite a URL da imagem.","alt":"Texto Alternativo","border":"Borda","btnUpload":"Enviar para o Servidor","button2Img":"Deseja transformar o botão de imagem em uma imagem comum?","hSpace":"HSpace","img2Button":"Deseja transformar a imagem em um botão de imagem?","infoTab":"Informações da Imagem","linkTab":"Link","lockRatio":"Travar Proporções","menu":"Formatar Imagem","resetSize":"Redefinir para o Tamanho Original","title":"Formatar Imagem","titleButton":"Formatar Botão de Imagem","upload":"Enviar","urlMissing":"URL da imagem está faltando.","vSpace":"VSpace","validateBorder":"A borda deve ser um número inteiro.","validateHSpace":"O HSpace deve ser um número inteiro.","validateVSpace":"O VSpace deve ser um número inteiro."},"indent":{"indent":"Aumentar Recuo","outdent":"Diminuir Recuo"},"justify":{"block":"Justificado","center":"Centralizar","left":"Alinhar Esquerda","right":"Alinhar Direita"},"fakeobjects":{"anchor":"Âncora","flash":"Animação em Flash","hiddenfield":"Campo Oculto","iframe":"IFrame","unknown":"Objeto desconhecido"},"link":{"acccessKey":"Chave de Acesso","advanced":"Avançado","advisoryContentType":"Tipo de Conteúdo","advisoryTitle":"Título","anchor":{"toolbar":"Inserir/Editar Âncora","menu":"Formatar Âncora","title":"Formatar Âncora","name":"Nome da Âncora","errorName":"Por favor, digite o nome da âncora","remove":"Remover Âncora"},"anchorId":"Id da âncora","anchorName":"Nome da âncora","charset":"Charset do Link","cssClasses":"Classe de CSS","emailAddress":"Endereço E-Mail","emailBody":"Corpo da Mensagem","emailSubject":"Assunto da Mensagem","id":"Id","info":"Informações","langCode":"Direção do idioma","langDir":"Direção do idioma","langDirLTR":"Esquerda para Direita (LTR)","langDirRTL":"Direita para Esquerda (RTL)","menu":"Editar Link","name":"Nome","noAnchors":"(Não há âncoras no documento)","noEmail":"Por favor, digite o endereço de e-mail","noUrl":"Por favor, digite o endereço do Link","other":"<outro>","popupDependent":"Dependente (Netscape)","popupFeatures":"Propriedades da Janela Pop-up","popupFullScreen":"Modo Tela Cheia (IE)","popupLeft":"Esquerda","popupLocationBar":"Barra de Endereços","popupMenuBar":"Barra de Menus","popupResizable":"Redimensionável","popupScrollBars":"Barras de Rolagem","popupStatusBar":"Barra de Status","popupToolbar":"Barra de Ferramentas","popupTop":"Topo","rel":"Tipo de Relação","selectAnchor":"Selecione uma âncora","styles":"Estilos","tabIndex":"Índice de Tabulação","target":"Destino","targetFrame":"<frame>","targetFrameName":"Nome do Frame de Destino","targetPopup":"<janela popup>","targetPopupName":"Nome da Janela Pop-up","title":"Editar Link","toAnchor":"Âncora nesta página","toEmail":"E-Mail","toUrl":"URL","toolbar":"Inserir/Editar Link","type":"Tipo de hiperlink","unlink":"Remover Link","upload":"Enviar ao Servidor"},"list":{"bulletedlist":"Lista sem números","numberedlist":"Lista numerada"},"maximize":{"maximize":"Maximizar","minimize":"Minimize"},"pastefromword":{"confirmCleanup":"O texto que você deseja colar parece ter sido copiado do Word. Você gostaria de remover a formatação antes de colar?","error":"Não foi possível limpar os dados colados devido a um erro interno","title":"Colar do Word","toolbar":"Colar do Word"},"pastetext":{"button":"Colar como Texto sem Formatação","title":"Colar como Texto sem Formatação"},"removeformat":{"toolbar":"Remover Formatação"},"sourcearea":{"toolbar":"Código-Fonte"},"stylescombo":{"label":"Estilo","panelTitle":"Estilos de Formatação","panelTitle1":"Estilos de bloco","panelTitle2":"Estilos de texto corrido","panelTitle3":"Estilos de objeto"},"table":{"border":"Borda","caption":"Legenda","cell":{"menu":"Célula","insertBefore":"Inserir célula a esquerda","insertAfter":"Inserir célula a direita","deleteCell":"Remover Células","merge":"Mesclar Células","mergeRight":"Mesclar com célula a direita","mergeDown":"Mesclar com célula abaixo","splitHorizontal":"Dividir célula horizontalmente","splitVertical":"Dividir célula verticalmente","title":"Propriedades da célula","cellType":"Tipo de célula","rowSpan":"Linhas cobertas","colSpan":"Colunas cobertas","wordWrap":"Quebra de palavra","hAlign":"Alinhamento horizontal","vAlign":"Alinhamento vertical","alignBaseline":"Patamar de alinhamento","bgColor":"Cor de fundo","borderColor":"Cor das bordas","data":"Dados","header":"Cabeçalho","yes":"Sim","no":"Não","invalidWidth":"A largura da célula tem que ser um número.","invalidHeight":"A altura da célula tem que ser um número.","invalidRowSpan":"Linhas cobertas tem que ser um número inteiro.","invalidColSpan":"Colunas cobertas tem que ser um número inteiro.","chooseColor":"Escolher"},"cellPad":"Margem interna","cellSpace":"Espaçamento","column":{"menu":"Coluna","insertBefore":"Inserir coluna a esquerda","insertAfter":"Inserir coluna a direita","deleteColumn":"Remover Colunas"},"columns":"Colunas","deleteTable":"Apagar Tabela","headers":"Cabeçalho","headersBoth":"Ambos","headersColumn":"Primeira coluna","headersNone":"Nenhum","headersRow":"Primeira linha","invalidBorder":"O tamanho da borda tem que ser um número.","invalidCellPadding":"A margem interna das células tem que ser um número.","invalidCellSpacing":"O espaçamento das células tem que ser um número.","invalidCols":"O número de colunas tem que ser um número maior que 0.","invalidHeight":"A altura da tabela tem que ser um número.","invalidRows":"O número de linhas tem que ser um número maior que 0.","invalidWidth":"A largura da tabela tem que ser um número.","menu":"Formatar Tabela","row":{"menu":"Linha","insertBefore":"Inserir linha acima","insertAfter":"Inserir linha abaixo","deleteRow":"Remover Linhas"},"rows":"Linhas","summary":"Resumo","title":"Formatar Tabela","toolbar":"Tabela","widthPc":"%","widthPx":"pixels","widthUnit":"unidade largura"},"toolbar":{"toolbarCollapse":"Diminuir Barra de Ferramentas","toolbarExpand":"Aumentar Barra de Ferramentas","toolbarGroups":{"document":"Documento","clipboard":"Clipboard/Desfazer","editing":"Edição","forms":"Formulários","basicstyles":"Estilos Básicos","paragraph":"Paragrafo","links":"Links","insert":"Inserir","styles":"Estilos","colors":"Cores","tools":"Ferramentas"},"toolbars":"Barra de Ferramentas do Editor"},"undo":{"redo":"Refazer","undo":"Desfazer"},"sourcedialog":{"toolbar":"Código-Fonte","title":"Código-Fonte"},"acymediabrowser":{"toolbar":"Imagem"},"addtag":{"toolbar":"Etiqueta"},"smiley":{"toolbar":"Emojis"}};
components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/lang/es.js000060400000027624152453623450026156 0ustar00CKEDITOR.lang['es']={"editor":"Editor de texto enriquecido","editorPanel":"Panel del Editor de Texto Enriquecido","common":{"editorHelp":"Pulse ALT 0 para ayuda","browseServer":"Ver Servidor","url":"URL","protocol":"Protocolo","upload":"Cargar","uploadSubmit":"Enviar al Servidor","image":"Imagen","flash":"Flash","form":"Formulario","checkbox":"Casilla de Verificación","radio":"Botones de Radio","textField":"Campo de Texto","textarea":"Area de Texto","hiddenField":"Campo Oculto","button":"Botón","select":"Campo de Selección","imageButton":"Botón Imagen","notSet":"<No definido>","id":"Id","name":"Nombre","langDir":"Orientación","langDirLtr":"Izquierda a Derecha (LTR)","langDirRtl":"Derecha a Izquierda (RTL)","langCode":"Cód. de idioma","longDescr":"Descripción larga URL","cssClass":"Clases de hojas de estilo","advisoryTitle":"Título","cssStyle":"Estilo","ok":"Aceptar","cancel":"Cancelar","close":"Cerrar","preview":"Previsualización","resize":"Arrastre para redimensionar","generalTab":"General","advancedTab":"Avanzado","validateNumberFailed":"El valor no es un número.","confirmNewPage":"Cualquier cambio que no se haya guardado se perderá.\r\n¿Está seguro de querer crear una nueva página?","confirmCancel":"Algunas de las opciones se han cambiado.\r\n¿Está seguro de querer cerrar el diálogo?","options":"Opciones","target":"Destino","targetNew":"Nueva ventana (_blank)","targetTop":"Ventana principal (_top)","targetSelf":"Misma ventana (_self)","targetParent":"Ventana padre (_parent)","langDirLTR":"Izquierda a derecha (LTR)","langDirRTL":"Derecha a izquierda (RTL)","styles":"Estilos","cssClasses":"Clase de la hoja de estilos","width":"Anchura","height":"Altura","align":"Alineación","alignLeft":"Izquierda","alignRight":"Derecha","alignCenter":"Centrado","alignJustify":"Justificado","alignTop":"Tope","alignMiddle":"Centro","alignBottom":"Pie","alignNone":"None","invalidValue":"Valor no válido","invalidHeight":"Altura debe ser un número.","invalidWidth":"Anchura debe ser un número.","invalidCssLength":"El valor especificado para el campo \"%1\" debe ser un número positivo, incluyendo optionalmente una unidad de medida CSS válida (px, %, in, cm, mm, em, ex, pt, o pc).","invalidHtmlLength":"El valor especificado para el campo \"%1\" debe ser un número positivo, incluyendo optionalmente una unidad de medida HTML válida (px o %).","invalidInlineStyle":"El valor especificado para el estilo debe consistir en uno o más pares con el formato \"nombre: valor\", separados por punto y coma.","cssLengthTooltip":"Introduca un número para el valor en pixels o un número con una unidad de medida CSS válida (px, %, in, cm, mm, em, ex, pt, o pc).","unavailable":"%1<span class=\"cke_accessibility\">, no disponible</span>"},"basicstyles":{"bold":"Negrita","italic":"Cursiva","strike":"Tachado","subscript":"Subíndice","superscript":"Superíndice","underline":"Subrayado"},"blockquote":{"toolbar":"Cita"},"clipboard":{"copy":"Copiar","copyError":"La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de copiado.\r\nPor favor use el teclado (Ctrl/Cmd+C).","cut":"Cortar","cutError":"La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de cortado.\r\nPor favor use el teclado (Ctrl/Cmd+X).","paste":"Pegar","pasteArea":"Zona de pegado","pasteMsg":"Por favor pegue dentro del cuadro utilizando el teclado (<STRONG>Ctrl/Cmd+V</STRONG>);\r\nluego presione <STRONG>Aceptar</STRONG>.","securityMsg":"Debido a la configuración de seguridad de su navegador, el editor no tiene acceso al portapapeles.\r\nEs necesario que lo pegue de nuevo en esta ventana.","title":"Pegar"},"button":{"selectedLabel":"%1 (Selected)"},"colorbutton":{"auto":"Automático","bgColorTitle":"Color de Fondo","colors":{"000":"Negro","800000":"Marrón oscuro","8B4513":"Marrón tierra","2F4F4F":"Pizarra Oscuro","008080":"Azul verdoso","000080":"Azul marino","4B0082":"Añil","696969":"Gris oscuro","B22222":"Ladrillo","A52A2A":"Marrón","DAA520":"Oro oscuro","006400":"Verde oscuro","40E0D0":"Turquesa","0000CD":"Azul medio-oscuro","800080":"Púrpura","808080":"Gris","F00":"Rojo","FF8C00":"Naranja oscuro","FFD700":"Oro","008000":"Verde","0FF":"Cian","00F":"Azul","EE82EE":"Violeta","A9A9A9":"Gris medio","FFA07A":"Salmón claro","FFA500":"Naranja","FFFF00":"Amarillo","00FF00":"Lima","AFEEEE":"Turquesa claro","ADD8E6":"Azul claro","DDA0DD":"Violeta claro","D3D3D3":"Gris claro","FFF0F5":"Lavanda rojizo","FAEBD7":"Blanco antiguo","FFFFE0":"Amarillo claro","F0FFF0":"Miel","F0FFFF":"Azul celeste","F0F8FF":"Azul pálido","E6E6FA":"Lavanda","FFF":"Blanco"},"more":"Más Colores...","panelTitle":"Colores","textColorTitle":"Color de Texto"},"colordialog":{"clear":"Borrar","highlight":"Muestra","options":"Opciones de colores","selected":"Elegido","title":"Elegir color"},"contextmenu":{"options":"Opciones del menú contextual"},"elementspath":{"eleLabel":"Ruta de los elementos","eleTitle":"%1 elemento"},"font":{"fontSize":{"label":"Tamaño","voiceLabel":"Tamaño de fuente","panelTitle":"Tamaño"},"label":"Fuente","panelTitle":"Fuente","voiceLabel":"Fuente"},"format":{"label":"Formato","panelTitle":"Formato","tag_address":"Dirección","tag_div":"Normal (DIV)","tag_h1":"Encabezado 1","tag_h2":"Encabezado 2","tag_h3":"Encabezado 3","tag_h4":"Encabezado 4","tag_h5":"Encabezado 5","tag_h6":"Encabezado 6","tag_p":"Normal","tag_pre":"Con formato"},"horizontalrule":{"toolbar":"Insertar Línea Horizontal"},"image":{"alertUrl":"Por favor escriba la URL de la imagen","alt":"Texto Alternativo","border":"Borde","btnUpload":"Enviar al Servidor","button2Img":"¿Desea convertir el botón de imagen en una simple imagen?","hSpace":"Esp.Horiz","img2Button":"¿Desea convertir la imagen en un botón de imagen?","infoTab":"Información de Imagen","linkTab":"Vínculo","lockRatio":"Proporcional","menu":"Propiedades de Imagen","resetSize":"Tamaño Original","title":"Propiedades de Imagen","titleButton":"Propiedades de Botón de Imagen","upload":"Cargar","urlMissing":"Debe indicar la URL de la imagen.","vSpace":"Esp.Vert","validateBorder":"El borde debe ser un número.","validateHSpace":"El espaciado horizontal debe ser un número.","validateVSpace":"El espaciado vertical debe ser un número."},"indent":{"indent":"Aumentar Sangría","outdent":"Disminuir Sangría"},"justify":{"block":"Justificado","center":"Centrar","left":"Alinear a Izquierda","right":"Alinear a Derecha"},"fakeobjects":{"anchor":"Ancla","flash":"Animación flash","hiddenfield":"Campo oculto","iframe":"IFrame","unknown":"Objeto desconocido"},"link":{"acccessKey":"Tecla de Acceso","advanced":"Avanzado","advisoryContentType":"Tipo de Contenido","advisoryTitle":"Título","anchor":{"toolbar":"Referencia","menu":"Propiedades de Referencia","title":"Propiedades de Referencia","name":"Nombre de la Referencia","errorName":"Por favor, complete el nombre de la Referencia","remove":"Quitar Referencia"},"anchorId":"Por ID de elemento","anchorName":"Por Nombre de Referencia","charset":"Fuente de caracteres vinculado","cssClasses":"Clases de hojas de estilo","emailAddress":"Dirección de E-Mail","emailBody":"Cuerpo del Mensaje","emailSubject":"Título del Mensaje","id":"Id","info":"Información de Vínculo","langCode":"Código idioma","langDir":"Orientación","langDirLTR":"Izquierda a Derecha (LTR)","langDirRTL":"Derecha a Izquierda (RTL)","menu":"Editar Vínculo","name":"Nombre","noAnchors":"(No hay referencias disponibles en el documento)","noEmail":"Por favor escriba la dirección de e-mail","noUrl":"Por favor escriba el vínculo URL","other":"<otro>","popupDependent":"Dependiente (Netscape)","popupFeatures":"Características de Ventana Emergente","popupFullScreen":"Pantalla Completa (IE)","popupLeft":"Posición Izquierda","popupLocationBar":"Barra de ubicación","popupMenuBar":"Barra de Menú","popupResizable":"Redimensionable","popupScrollBars":"Barras de desplazamiento","popupStatusBar":"Barra de Estado","popupToolbar":"Barra de Herramientas","popupTop":"Posición Derecha","rel":"Relación","selectAnchor":"Seleccionar una referencia","styles":"Estilo","tabIndex":"Indice de tabulación","target":"Destino","targetFrame":"<marco>","targetFrameName":"Nombre del Marco Destino","targetPopup":"<ventana emergente>","targetPopupName":"Nombre de Ventana Emergente","title":"Vínculo","toAnchor":"Referencia en esta página","toEmail":"E-Mail","toUrl":"URL","toolbar":"Insertar/Editar Vínculo","type":"Tipo de vínculo","unlink":"Eliminar Vínculo","upload":"Cargar"},"list":{"bulletedlist":"Viñetas","numberedlist":"Numeración"},"maximize":{"maximize":"Maximizar","minimize":"Minimizar"},"pastefromword":{"confirmCleanup":"El texto que desea parece provenir de Word.\r\n¿Desea depurarlo antes de pegarlo?","error":"No ha sido posible limpiar los datos debido a un error interno","title":"Pegar desde Word","toolbar":"Pegar desde Word"},"pastetext":{"button":"Pegar como Texto Plano","title":"Pegar como Texto Plano"},"removeformat":{"toolbar":"Eliminar Formato"},"sourcearea":{"toolbar":"Fuente HTML"},"stylescombo":{"label":"Estilo","panelTitle":"Estilos para formatear","panelTitle1":"Estilos de párrafo","panelTitle2":"Estilos de carácter","panelTitle3":"Estilos de objeto"},"table":{"border":"Tamaño de Borde","caption":"Título","cell":{"menu":"Celda","insertBefore":"Insertar celda a la izquierda","insertAfter":"Insertar celda a la derecha","deleteCell":"Eliminar Celdas","merge":"Combinar Celdas","mergeRight":"Combinar a la derecha","mergeDown":"Combinar hacia abajo","splitHorizontal":"Dividir la celda horizontalmente","splitVertical":"Dividir la celda verticalmente","title":"Propiedades de celda","cellType":"Tipo de Celda","rowSpan":"Expandir filas","colSpan":"Expandir columnas","wordWrap":"Ajustar al contenido","hAlign":"Alineación Horizontal","vAlign":"Alineación Vertical","alignBaseline":"Linea de base","bgColor":"Color de fondo","borderColor":"Color de borde","data":"Datos","header":"Encabezado","yes":"Sí","no":"No","invalidWidth":"La anchura de celda debe ser un número.","invalidHeight":"La altura de celda debe ser un número.","invalidRowSpan":"La expansión de filas debe ser un número entero.","invalidColSpan":"La expansión de columnas debe ser un número entero.","chooseColor":"Elegir"},"cellPad":"Esp. interior","cellSpace":"Esp. e/celdas","column":{"menu":"Columna","insertBefore":"Insertar columna a la izquierda","insertAfter":"Insertar columna a la derecha","deleteColumn":"Eliminar Columnas"},"columns":"Columnas","deleteTable":"Eliminar Tabla","headers":"Encabezados","headersBoth":"Ambas","headersColumn":"Primera columna","headersNone":"Ninguno","headersRow":"Primera fila","invalidBorder":"El tamaño del borde debe ser un número.","invalidCellPadding":"El espaciado interior debe ser un número.","invalidCellSpacing":"El espaciado entre celdas debe ser un número.","invalidCols":"El número de columnas debe ser un número mayor que 0.","invalidHeight":"La altura de tabla debe ser un número.","invalidRows":"El número de filas debe ser un número mayor que 0.","invalidWidth":"La anchura de tabla debe ser un número.","menu":"Propiedades de Tabla","row":{"menu":"Fila","insertBefore":"Insertar fila en la parte superior","insertAfter":"Insertar fila en la parte inferior","deleteRow":"Eliminar Filas"},"rows":"Filas","summary":"Síntesis","title":"Propiedades de Tabla","toolbar":"Tabla","widthPc":"porcentaje","widthPx":"pixeles","widthUnit":"unidad de la anchura"},"toolbar":{"toolbarCollapse":"Contraer barra de herramientas","toolbarExpand":"Expandir barra de herramientas","toolbarGroups":{"document":"Documento","clipboard":"Portapapeles/Deshacer","editing":"Edición","forms":"Formularios","basicstyles":"Estilos básicos","paragraph":"Párrafo","links":"Enlaces","insert":"Insertar","styles":"Estilos","colors":"Colores","tools":"Herramientas"},"toolbars":"Barras de herramientas del editor"},"undo":{"redo":"Rehacer","undo":"Deshacer"},"sourcedialog":{"toolbar":"Fuente HTML","title":"Fuente HTML"},"acymediabrowser":{"toolbar":"Imagen"},"addtag":{"toolbar":"Etiquetas"},"smiley":{"toolbar":"Emojis"}};
components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/lang/en.js000060400000025234152453623450026144 0ustar00CKEDITOR.lang['en']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Send it to the Server","image":"Image","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<not set>","id":"Id","name":"Name","langDir":"Language Direction","langDirLtr":"Left to Right (LTR)","langDirRtl":"Right to Left (RTL)","langCode":"Language Code","longDescr":"Long Description URL","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"OK","cancel":"Cancel","close":"Close","preview":"Preview","resize":"Resize","generalTab":"General","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"You have changed some options. Are you sure you want to close the dialog window?","options":"Options","target":"Target","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Width","height":"Height","align":"Alignment","alignLeft":"Left","alignRight":"Right","alignCenter":"Center","alignJustify":"Justify","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","alignNone":"None","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strikethrough","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Copy","copyError":"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).","cut":"Cut","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"Paste","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"button":{"selectedLabel":"%1 (Selected)"},"colorbutton":{"auto":"Automatic","bgColorTitle":"Background Color","colors":{"000":"Black","800000":"Maroon","8B4513":"Saddle Brown","2F4F4F":"Dark Slate Gray","008080":"Teal","000080":"Navy","4B0082":"Indigo","696969":"Dark Gray","B22222":"Fire Brick","A52A2A":"Brown","DAA520":"Golden Rod","006400":"Dark Green","40E0D0":"Turquoise","0000CD":"Medium Blue","800080":"Purple","808080":"Gray","F00":"Red","FF8C00":"Dark Orange","FFD700":"Gold","008000":"Green","0FF":"Cyan","00F":"Blue","EE82EE":"Violet","A9A9A9":"Dim Gray","FFA07A":"Light Salmon","FFA500":"Orange","FFFF00":"Yellow","00FF00":"Lime","AFEEEE":"Pale Turquoise","ADD8E6":"Light Blue","DDA0DD":"Plum","D3D3D3":"Light Grey","FFF0F5":"Lavender Blush","FAEBD7":"Antique White","FFFFE0":"Light Yellow","F0FFF0":"Honeydew","F0FFFF":"Azure","F0F8FF":"Alice Blue","E6E6FA":"Lavender","FFF":"White"},"more":"More Colors...","panelTitle":"Colors","textColorTitle":"Text Color"},"colordialog":{"clear":"Clear","highlight":"Highlight","options":"Color Options","selected":"Selected Color","title":"Select color"},"contextmenu":{"options":"Context Menu Options"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"font":{"fontSize":{"label":"Size","voiceLabel":"Font Size","panelTitle":"Font Size"},"label":"Font","panelTitle":"Font Name","voiceLabel":"Font"},"format":{"label":"Format","panelTitle":"Paragraph Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Insert Horizontal Line"},"image":{"alertUrl":"Please type the image URL","alt":"Alternative Text","border":"Border","btnUpload":"Send it to the Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Image Info","linkTab":"Link","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Upload","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Increase Indent","outdent":"Decrease Indent"},"justify":{"block":"Justify","center":"Center","left":"Align Left","right":"Align Right"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Language Code","langDir":"Language Direction","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","menu":"Edit Link","name":"Name","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"Style","tabIndex":"Tab Index","target":"Target","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"Link","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"removeformat":{"toolbar":"Remove Format"},"sourcearea":{"toolbar":"Source"},"stylescombo":{"label":"Styles","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Border size","caption":"Caption","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Delete Cells","merge":"Merge Cells","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"Columns","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"Rows","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"undo":{"redo":"Redo","undo":"Undo"},"sourcedialog":{"toolbar":"Source","title":"Source"},"acymediabrowser":{"toolbar":"Images"},"addtag":{"toolbar":"Tags"},"smiley":{"toolbar":"Emojis"}};
components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/lang/it.js000060400000027440152453623450026157 0ustar00CKEDITOR.lang['it']={"editor":"Rich Text Editor","editorPanel":"Pannello Rich Text Editor","common":{"editorHelp":"Premi ALT 0 per aiuto","browseServer":"Cerca sul server","url":"URL","protocol":"Protocollo","upload":"Carica","uploadSubmit":"Invia al server","image":"Immagine","flash":"Oggetto Flash","form":"Modulo","checkbox":"Checkbox","radio":"Radio Button","textField":"Campo di testo","textarea":"Area di testo","hiddenField":"Campo nascosto","button":"Bottone","select":"Menu di selezione","imageButton":"Bottone immagine","notSet":"<non impostato>","id":"Id","name":"Nome","langDir":"Direzione scrittura","langDirLtr":"Da Sinistra a Destra (LTR)","langDirRtl":"Da Destra a Sinistra (RTL)","langCode":"Codice Lingua","longDescr":"URL descrizione estesa","cssClass":"Nome classe CSS","advisoryTitle":"Titolo","cssStyle":"Stile","ok":"OK","cancel":"Annulla","close":"Chiudi","preview":"Anteprima","resize":"Trascina per ridimensionare","generalTab":"Generale","advancedTab":"Avanzate","validateNumberFailed":"Il valore inserito non è un numero.","confirmNewPage":"Ogni modifica non salvata sarà persa. Sei sicuro di voler caricare una nuova pagina?","confirmCancel":"Alcune delle opzioni sono state cambiate. Sei sicuro di voler chiudere la finestra di dialogo?","options":"Opzioni","target":"Destinazione","targetNew":"Nuova finestra (_blank)","targetTop":"Finestra in primo piano (_top)","targetSelf":"Stessa finestra (_self)","targetParent":"Finestra Padre (_parent)","langDirLTR":"Da sinistra a destra (LTR)","langDirRTL":"Da destra a sinistra (RTL)","styles":"Stile","cssClasses":"Classi di stile","width":"Larghezza","height":"Altezza","align":"Allineamento","alignLeft":"Sinistra","alignRight":"Destra","alignCenter":"Centrato","alignJustify":"Giustifica","alignTop":"In Alto","alignMiddle":"Centrato","alignBottom":"In Basso","alignNone":"Nessuno","invalidValue":"Valore non valido.","invalidHeight":"L'altezza dev'essere un numero","invalidWidth":"La Larghezza dev'essere un numero","invalidCssLength":"Il valore indicato per il campo \"%1\" deve essere un numero positivo con o senza indicazione di una valida unità di misura per le classi CSS (px, %, in, cm, mm, em, ex, pt, o pc).","invalidHtmlLength":"Il valore indicato per il campo \"%1\" deve essere un numero positivo con o senza indicazione di una valida unità di misura per le pagine HTML (px o %).","invalidInlineStyle":"Il valore specificato per lo stile inline deve consistere in una o più tuple con il formato di \"name : value\", separati da semicolonne.","cssLengthTooltip":"Inserisci un numero per il valore in pixel oppure un numero con una valida unità CSS (px, %, in, cm, mm, ex, pt, o pc).","unavailable":"%1<span class=\"cke_accessibility\">, non disponibile</span>"},"basicstyles":{"bold":"Grassetto","italic":"Corsivo","strike":"Barrato","subscript":"Pedice","superscript":"Apice","underline":"Sottolineato"},"blockquote":{"toolbar":"Citazione"},"clipboard":{"copy":"Copia","copyError":"Le impostazioni di sicurezza del browser non permettono di copiare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+C).","cut":"Taglia","cutError":"Le impostazioni di sicurezza del browser non permettono di tagliare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+X).","paste":"Incolla","pasteArea":"Incolla","pasteMsg":"Incolla il testo all'interno dell'area sottostante usando la scorciatoia di tastiere (<STRONG>Ctrl/Cmd+V</STRONG>) e premi <STRONG>OK</STRONG>.","securityMsg":"A causa delle impostazioni di sicurezza del browser,l'editor non è in grado di accedere direttamente agli appunti. E' pertanto necessario incollarli di nuovo in questa finestra.","title":"Incolla"},"button":{"selectedLabel":"%1 (selezionato)"},"colorbutton":{"auto":"Automatico","bgColorTitle":"Colore sfondo","colors":{"000":"Nero","800000":"Marrone Castagna","8B4513":"Marrone Cuoio","2F4F4F":"Grigio Fumo di Londra","008080":"Acquamarina","000080":"Blu Oceano","4B0082":"Indigo","696969":"Grigio Scuro","B22222":"Giallo Fiamma","A52A2A":"Marrone","DAA520":"Giallo Mimosa","006400":"Verde Scuro","40E0D0":"Turchese","0000CD":"Blue Scuro","800080":"Viola","808080":"Grigio","F00":"Rosso","FF8C00":"Arancio Scuro","FFD700":"Oro","008000":"Verde","0FF":"Ciano","00F":"Blu","EE82EE":"Violetto","A9A9A9":"Grigio Scuro","FFA07A":"Salmone","FFA500":"Arancio","FFFF00":"Giallo","00FF00":"Lime","AFEEEE":"Turchese Chiaro","ADD8E6":"Blu Chiaro","DDA0DD":"Rosso Ciliegia","D3D3D3":"Grigio Chiaro","FFF0F5":"Lavanda Chiara","FAEBD7":"Bianco Antico","FFFFE0":"Giallo Chiaro","F0FFF0":"Verde Mela","F0FFFF":"Azzurro","F0F8FF":"Celeste","E6E6FA":"Lavanda","FFF":"Bianco"},"more":"Altri colori...","panelTitle":"Colori","textColorTitle":"Colore testo"},"colordialog":{"clear":"cancella","highlight":"Evidenzia","options":"Opzioni colore","selected":"Seleziona il colore","title":"Selezionare il colore"},"contextmenu":{"options":"Opzioni del menù contestuale"},"elementspath":{"eleLabel":"Percorso degli elementi","eleTitle":"%1 elemento"},"font":{"fontSize":{"label":"Dimensione","voiceLabel":"Dimensione Carattere","panelTitle":"Dimensione"},"label":"Carattere","panelTitle":"Carattere","voiceLabel":"Carattere"},"format":{"label":"Formato","panelTitle":"Formato","tag_address":"Indirizzo","tag_div":"Paragrafo (DIV)","tag_h1":"Titolo 1","tag_h2":"Titolo 2","tag_h3":"Titolo 3","tag_h4":"Titolo 4","tag_h5":"Titolo 5","tag_h6":"Titolo 6","tag_p":"Normale","tag_pre":"Formattato"},"horizontalrule":{"toolbar":"Inserisci riga orizzontale"},"image":{"alertUrl":"Devi inserire l'URL per l'immagine","alt":"Testo alternativo","border":"Bordo","btnUpload":"Invia al server","button2Img":"Vuoi trasformare il bottone immagine selezionato in un'immagine semplice?","hSpace":"HSpace","img2Button":"Vuoi trasferomare l'immagine selezionata in un bottone immagine?","infoTab":"Informazioni immagine","linkTab":"Collegamento","lockRatio":"Blocca rapporto","menu":"Proprietà immagine","resetSize":"Reimposta dimensione","title":"Proprietà immagine","titleButton":"Proprietà bottone immagine","upload":"Carica","urlMissing":"Manca l'URL dell'immagine.","vSpace":"VSpace","validateBorder":"Il campo Bordo deve essere un numero intero.","validateHSpace":"Il campo HSpace deve essere un numero intero.","validateVSpace":"Il campo VSpace deve essere un numero intero."},"indent":{"indent":"Aumenta rientro","outdent":"Riduci rientro"},"justify":{"block":"Giustifica","center":"Centra","left":"Allinea a sinistra","right":"Allinea a destra"},"fakeobjects":{"anchor":"Ancora","flash":"Animazione Flash","hiddenfield":"Campo Nascosto","iframe":"IFrame","unknown":"Oggetto sconosciuto"},"link":{"acccessKey":"Scorciatoia da tastiera","advanced":"Avanzate","advisoryContentType":"Tipo della risorsa collegata","advisoryTitle":"Titolo","anchor":{"toolbar":"Inserisci/Modifica Ancora","menu":"Proprietà ancora","title":"Proprietà ancora","name":"Nome ancora","errorName":"Inserici il nome dell'ancora","remove":"Rimuovi l'ancora"},"anchorId":"Per id elemento","anchorName":"Per Nome","charset":"Set di caretteri della risorsa collegata","cssClasses":"Nome classe CSS","emailAddress":"Indirizzo E-Mail","emailBody":"Corpo del messaggio","emailSubject":"Oggetto del messaggio","id":"Id","info":"Informazioni collegamento","langCode":"Direzione scrittura","langDir":"Direzione scrittura","langDirLTR":"Da Sinistra a Destra (LTR)","langDirRTL":"Da Destra a Sinistra (RTL)","menu":"Modifica collegamento","name":"Nome","noAnchors":"(Nessuna ancora disponibile nel documento)","noEmail":"Devi inserire un'indirizzo e-mail","noUrl":"Devi inserire l'URL del collegamento","other":"<altro>","popupDependent":"Dipendente (Netscape)","popupFeatures":"Caratteristiche finestra popup","popupFullScreen":"A tutto schermo (IE)","popupLeft":"Posizione da sinistra","popupLocationBar":"Barra degli indirizzi","popupMenuBar":"Barra del menu","popupResizable":"Ridimensionabile","popupScrollBars":"Barre di scorrimento","popupStatusBar":"Barra di stato","popupToolbar":"Barra degli strumenti","popupTop":"Posizione dall'alto","rel":"Relazioni","selectAnchor":"Scegli Ancora","styles":"Stile","tabIndex":"Ordine di tabulazione","target":"Destinazione","targetFrame":"<riquadro>","targetFrameName":"Nome del riquadro di destinazione","targetPopup":"<finestra popup>","targetPopupName":"Nome finestra popup","title":"Collegamento","toAnchor":"Ancora nel testo","toEmail":"E-Mail","toUrl":"URL","toolbar":"Collegamento","type":"Tipo di Collegamento","unlink":"Elimina collegamento","upload":"Carica"},"list":{"bulletedlist":"Inserisci/Rimuovi Elenco Puntato","numberedlist":"Inserisci/Rimuovi Elenco Numerato"},"maximize":{"maximize":"Massimizza","minimize":"Minimizza"},"pastefromword":{"confirmCleanup":"Il testo da incollare sembra provenire da Word. Desideri pulirlo prima di incollare?","error":"Non è stato possibile eliminare il testo incollato a causa di un errore interno.","title":"Incolla da Word","toolbar":"Incolla da Word"},"pastetext":{"button":"Incolla come testo semplice","title":"Incolla come testo semplice"},"removeformat":{"toolbar":"Elimina formattazione"},"sourcearea":{"toolbar":"Sorgente"},"stylescombo":{"label":"Stili","panelTitle":"Stili di formattazione","panelTitle1":"Stili per blocchi","panelTitle2":"Stili in linea","panelTitle3":"Stili per oggetti"},"table":{"border":"Dimensione bordo","caption":"Intestazione","cell":{"menu":"Cella","insertBefore":"Inserisci Cella Prima","insertAfter":"Inserisci Cella Dopo","deleteCell":"Elimina celle","merge":"Unisce celle","mergeRight":"Unisci a Destra","mergeDown":"Unisci in Basso","splitHorizontal":"Dividi Cella Orizzontalmente","splitVertical":"Dividi Cella Verticalmente","title":"Proprietà della cella","cellType":"Tipo di cella","rowSpan":"Su più righe","colSpan":"Su più colonne","wordWrap":"Ritorno a capo","hAlign":"Allineamento orizzontale","vAlign":"Allineamento verticale","alignBaseline":"Linea Base","bgColor":"Colore di Sfondo","borderColor":"Colore del Bordo","data":"Dati","header":"Intestazione","yes":"Si","no":"No","invalidWidth":"La larghezza della cella dev'essere un numero.","invalidHeight":"L'altezza della cella dev'essere un numero.","invalidRowSpan":"Il numero di righe dev'essere un numero intero.","invalidColSpan":"Il numero di colonne dev'essere un numero intero.","chooseColor":"Scegli"},"cellPad":"Padding celle","cellSpace":"Spaziatura celle","column":{"menu":"Colonna","insertBefore":"Inserisci Colonna Prima","insertAfter":"Inserisci Colonna Dopo","deleteColumn":"Elimina colonne"},"columns":"Colonne","deleteTable":"Cancella Tabella","headers":"Intestazione","headersBoth":"Entrambe","headersColumn":"Prima Colonna","headersNone":"Nessuna","headersRow":"Prima Riga","invalidBorder":"La dimensione del bordo dev'essere un numero.","invalidCellPadding":"Il paging delle celle dev'essere un numero","invalidCellSpacing":"La spaziatura tra le celle dev'essere un numero.","invalidCols":"Il numero di colonne dev'essere un numero maggiore di 0.","invalidHeight":"L'altezza della tabella dev'essere un numero.","invalidRows":"Il numero di righe dev'essere un numero maggiore di 0.","invalidWidth":"La larghezza della tabella dev'essere un numero.","menu":"Proprietà tabella","row":{"menu":"Riga","insertBefore":"Inserisci Riga Prima","insertAfter":"Inserisci Riga Dopo","deleteRow":"Elimina righe"},"rows":"Righe","summary":"Indice","title":"Proprietà tabella","toolbar":"Tabella","widthPc":"percento","widthPx":"pixel","widthUnit":"unità larghezza"},"toolbar":{"toolbarCollapse":"Minimizza Toolbar","toolbarExpand":"Espandi Toolbar","toolbarGroups":{"document":"Documento","clipboard":"Copia negli appunti/Annulla","editing":"Modifica","forms":"Form","basicstyles":"Stili di base","paragraph":"Paragrafo","links":"Link","insert":"Inserisci","styles":"Stili","colors":"Colori","tools":"Strumenti"},"toolbars":"Editor toolbar"},"undo":{"redo":"Ripristina","undo":"Annulla"},"sourcedialog":{"toolbar":"Sorgente","title":"Sorgente"},"acymediabrowser":{"toolbar":"Immagine"},"addtag":{"toolbar":"Tags"},"smiley":{"toolbar":"Emojis"}};
components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/lang/ru.js000060400000042347152453623450026174 0ustar00CKEDITOR.lang['ru']={"editor":"Визуальный текстовый редактор","editorPanel":"Визуальный редактор текста","common":{"editorHelp":"Нажмите ALT-0 для открытия справки","browseServer":"Выбор на сервере","url":"Ссылка","protocol":"Протокол","upload":"Загрузка файла","uploadSubmit":"Загрузить на сервер","image":"Изображение","flash":"Flash","form":"Форма","checkbox":"Чекбокс","radio":"Радиокнопка","textField":"Текстовое поле","textarea":"Многострочное текстовое поле","hiddenField":"Скрытое поле","button":"Кнопка","select":"Выпадающий список","imageButton":"Кнопка-изображение","notSet":"<не указано>","id":"Идентификатор","name":"Имя","langDir":"Направление текста","langDirLtr":"Слева направо (LTR)","langDirRtl":"Справа налево (RTL)","langCode":"Код языка","longDescr":"Длинное описание ссылки","cssClass":"Класс CSS","advisoryTitle":"Заголовок","cssStyle":"Стиль","ok":"ОК","cancel":"Отмена","close":"Закрыть","preview":"Предпросмотр","resize":"Перетащите для изменения размера","generalTab":"Основное","advancedTab":"Дополнительно","validateNumberFailed":"Это значение не является числом.","confirmNewPage":"Несохранённые изменения будут потеряны! Вы действительно желаете перейти на другую страницу?","confirmCancel":"Некоторые параметры были изменены. Вы уверены, что желаете закрыть без сохранения?","options":"Параметры","target":"Цель","targetNew":"Новое окно (_blank)","targetTop":"Главное окно (_top)","targetSelf":"Текущее окно (_self)","targetParent":"Родительское окно (_parent)","langDirLTR":"Слева направо (LTR)","langDirRTL":"Справа налево (RTL)","styles":"Стиль","cssClasses":"CSS классы","width":"Ширина","height":"Высота","align":"Выравнивание","alignLeft":"По левому краю","alignRight":"По правому краю","alignCenter":"По центру","alignJustify":"По ширине","alignTop":"Поверху","alignMiddle":"Посередине","alignBottom":"Понизу","alignNone":"Нет","invalidValue":"Недопустимое значение.","invalidHeight":"Высота задается числом.","invalidWidth":"Ширина задается числом.","invalidCssLength":"Значение, указанное в поле \"%1\", должно быть положительным целым числом. Допускается указание единиц меры CSS (px, %, in, cm, mm, em, ex, pt или pc).","invalidHtmlLength":"Значение, указанное в поле \"%1\", должно быть положительным целым числом. Допускается указание единиц меры HTML (px или %).","invalidInlineStyle":"Значение, указанное для стиля элемента, должно состоять из одной или нескольких пар данных в формате \"параметр : значение\", разделённых точкой с запятой.","cssLengthTooltip":"Введите значение в пикселях, либо число с корректной единицей меры CSS (px, %, in, cm, mm, em, ex, pt или pc).","unavailable":"%1<span class=\"cke_accessibility\">, недоступно</span>"},"basicstyles":{"bold":"Полужирный","italic":"Курсив","strike":"Зачеркнутый","subscript":"Подстрочный индекс","superscript":"Надстрочный индекс","underline":"Подчеркнутый"},"blockquote":{"toolbar":"Цитата"},"clipboard":{"copy":"Копировать","copyError":"Настройки безопасности вашего браузера не разрешают редактору выполнять операции по копированию текста. Пожалуйста, используйте для этого клавиатуру (Ctrl/Cmd+C).","cut":"Вырезать","cutError":"Настройки безопасности вашего браузера не разрешают редактору выполнять операции по вырезке текста. Пожалуйста, используйте для этого клавиатуру (Ctrl/Cmd+X).","paste":"Вставить","pasteArea":"Зона для вставки","pasteMsg":"Пожалуйста, вставьте текст в зону ниже, используя клавиатуру (<strong>Ctrl/Cmd+V</strong>) и нажмите кнопку \"OK\".","securityMsg":"Настройки безопасности вашего браузера не разрешают редактору напрямую обращаться к буферу обмена. Вы должны вставить текст снова в это окно.","title":"Вставить"},"button":{"selectedLabel":"%1 (Выбрано)"},"colorbutton":{"auto":"Автоматически","bgColorTitle":"Цвет фона","colors":{"000":"Чёрный","800000":"Бордовый","8B4513":"Кожано-коричневый","2F4F4F":"Темный синевато-серый","008080":"Сине-зелёный","000080":"Тёмно-синий","4B0082":"Индиго","696969":"Тёмно-серый","B22222":"Кирпичный","A52A2A":"Коричневый","DAA520":"Золотисто-берёзовый","006400":"Темно-зелёный","40E0D0":"Бирюзовый","0000CD":"Умеренно синий","800080":"Пурпурный","808080":"Серый","F00":"Красный","FF8C00":"Темно-оранжевый","FFD700":"Золотистый","008000":"Зелёный","0FF":"Васильковый","00F":"Синий","EE82EE":"Фиолетовый","A9A9A9":"Тускло-серый","FFA07A":"Светло-лососевый","FFA500":"Оранжевый","FFFF00":"Жёлтый","00FF00":"Лайма","AFEEEE":"Бледно-синий","ADD8E6":"Свелто-голубой","DDA0DD":"Сливовый","D3D3D3":"Светло-серый","FFF0F5":"Розово-лавандовый","FAEBD7":"Античный белый","FFFFE0":"Светло-жёлтый","F0FFF0":"Медвяной росы","F0FFFF":"Лазурный","F0F8FF":"Бледно-голубой","E6E6FA":"Лавандовый","FFF":"Белый"},"more":"Ещё цвета...","panelTitle":"Цвета","textColorTitle":"Цвет текста"},"colordialog":{"clear":"Очистить","highlight":"Под курсором","options":"Настройки цвета","selected":"Выбранный цвет","title":"Выберите цвет"},"contextmenu":{"options":"Параметры контекстного меню"},"elementspath":{"eleLabel":"Путь элементов","eleTitle":"Элемент %1"},"font":{"fontSize":{"label":"Размер","voiceLabel":"Размер шрифта","panelTitle":"Размер шрифта"},"label":"Шрифт","panelTitle":"Шрифт","voiceLabel":"Шрифт"},"format":{"label":"Форматирование","panelTitle":"Форматирование","tag_address":"Адрес","tag_div":"Обычное (div)","tag_h1":"Заголовок 1","tag_h2":"Заголовок 2","tag_h3":"Заголовок 3","tag_h4":"Заголовок 4","tag_h5":"Заголовок 5","tag_h6":"Заголовок 6","tag_p":"Обычное","tag_pre":"Моноширинное"},"horizontalrule":{"toolbar":"Вставить горизонтальную линию"},"image":{"alertUrl":"Пожалуйста, введите ссылку на изображение","alt":"Альтернативный текст","border":"Граница","btnUpload":"Загрузить на сервер","button2Img":"Вы желаете преобразовать это изображение-кнопку в обычное изображение?","hSpace":"Гориз. отступ","img2Button":"Вы желаете преобразовать это обычное изображение в изображение-кнопку?","infoTab":"Данные об изображении","linkTab":"Ссылка","lockRatio":"Сохранять пропорции","menu":"Свойства изображения","resetSize":"Вернуть обычные размеры","title":"Свойства изображения","titleButton":"Свойства изображения-кнопки","upload":"Загрузить","urlMissing":"Не указана ссылка на изображение.","vSpace":"Вертик. отступ","validateBorder":"Размер границ должен быть задан числом.","validateHSpace":"Горизонтальный отступ должен быть задан числом.","validateVSpace":"Вертикальный отступ должен быть задан числом."},"indent":{"indent":"Увеличить отступ","outdent":"Уменьшить отступ"},"justify":{"block":"По ширине","center":"По центру","left":"По левому краю","right":"По правому краю"},"fakeobjects":{"anchor":"Якорь","flash":"Flash анимация","hiddenfield":"Скрытое поле","iframe":"iFrame","unknown":"Неизвестный объект"},"link":{"acccessKey":"Клавиша доступа","advanced":"Дополнительно","advisoryContentType":"Тип содержимого","advisoryTitle":"Заголовок","anchor":{"toolbar":"Вставить / редактировать якорь","menu":"Изменить якорь","title":"Свойства якоря","name":"Имя якоря","errorName":"Пожалуйста, введите имя якоря","remove":"Удалить якорь"},"anchorId":"По идентификатору","anchorName":"По имени","charset":"Кодировка ресурса","cssClasses":"Классы CSS","emailAddress":"Email адрес","emailBody":"Текст сообщения","emailSubject":"Тема сообщения","id":"Идентификатор","info":"Информация о ссылке","langCode":"Код языка","langDir":"Направление текста","langDirLTR":"Слева направо (LTR)","langDirRTL":"Справа налево (RTL)","menu":"Редактировать ссылку","name":"Имя","noAnchors":"(В документе нет ни одного якоря)","noEmail":"Пожалуйста, введите email адрес","noUrl":"Пожалуйста, введите ссылку","other":"<другой>","popupDependent":"Зависимое (Netscape)","popupFeatures":"Параметры всплывающего окна","popupFullScreen":"Полноэкранное (IE)","popupLeft":"Отступ слева","popupLocationBar":"Панель адреса","popupMenuBar":"Панель меню","popupResizable":"Изменяемый размер","popupScrollBars":"Полосы прокрутки","popupStatusBar":"Строка состояния","popupToolbar":"Панель инструментов","popupTop":"Отступ сверху","rel":"Отношение","selectAnchor":"Выберите якорь","styles":"Стиль","tabIndex":"Последовательность перехода","target":"Цель","targetFrame":"<фрейм>","targetFrameName":"Имя целевого фрейма","targetPopup":"<всплывающее окно>","targetPopupName":"Имя всплывающего окна","title":"Ссылка","toAnchor":"Ссылка на якорь в тексте","toEmail":"Email","toUrl":"Ссылка","toolbar":"Вставить/Редактировать ссылку","type":"Тип ссылки","unlink":"Убрать ссылку","upload":"Загрузка"},"list":{"bulletedlist":"Вставить / удалить маркированный список","numberedlist":"Вставить / удалить нумерованный список"},"maximize":{"maximize":"Развернуть","minimize":"Свернуть"},"pastefromword":{"confirmCleanup":"Текст, который вы желаете вставить, по всей видимости, был скопирован из Word. Следует ли очистить его перед вставкой?","error":"Невозможно очистить вставленные данные из-за внутренней ошибки","title":"Вставить из Word","toolbar":"Вставить из Word"},"pastetext":{"button":"Вставить только текст","title":"Вставить только текст"},"removeformat":{"toolbar":"Убрать форматирование"},"sourcearea":{"toolbar":"Источник"},"stylescombo":{"label":"Стили","panelTitle":"Стили форматирования","panelTitle1":"Стили блока","panelTitle2":"Стили элемента","panelTitle3":"Стили объекта"},"table":{"border":"Размер границ","caption":"Заголовок","cell":{"menu":"Ячейка","insertBefore":"Вставить ячейку слева","insertAfter":"Вставить ячейку справа","deleteCell":"Удалить ячейки","merge":"Объединить ячейки","mergeRight":"Объединить с правой","mergeDown":"Объединить с нижней","splitHorizontal":"Разделить ячейку по горизонтали","splitVertical":"Разделить ячейку по вертикали","title":"Свойства ячейки","cellType":"Тип ячейки","rowSpan":"Объединяет строк","colSpan":"Объединяет колонок","wordWrap":"Перенос по словам","hAlign":"Горизонтальное выравнивание","vAlign":"Вертикальное выравнивание","alignBaseline":"По базовой линии","bgColor":"Цвет фона","borderColor":"Цвет границ","data":"Данные","header":"Заголовок","yes":"Да","no":"Нет","invalidWidth":"Ширина ячейки должна быть числом.","invalidHeight":"Высота ячейки должна быть числом.","invalidRowSpan":"Количество объединяемых строк должно быть задано числом.","invalidColSpan":"Количество объединяемых колонок должно быть задано числом.","chooseColor":"Выберите"},"cellPad":"Внутренний отступ ячеек","cellSpace":"Внешний отступ ячеек","column":{"menu":"Колонка","insertBefore":"Вставить колонку слева","insertAfter":"Вставить колонку справа","deleteColumn":"Удалить колонки"},"columns":"Колонки","deleteTable":"Удалить таблицу","headers":"Заголовки","headersBoth":"Сверху и слева","headersColumn":"Левая колонка","headersNone":"Без заголовков","headersRow":"Верхняя строка","invalidBorder":"Размер границ должен быть числом.","invalidCellPadding":"Внутренний отступ ячеек (cellpadding) должен быть числом.","invalidCellSpacing":"Внешний отступ ячеек (cellspacing) должен быть числом.","invalidCols":"Количество столбцов должно быть больше 0.","invalidHeight":"Высота таблицы должна быть числом.","invalidRows":"Количество строк должно быть больше 0.","invalidWidth":"Ширина таблицы должна быть числом.","menu":"Свойства таблицы","row":{"menu":"Строка","insertBefore":"Вставить строку сверху","insertAfter":"Вставить строку снизу","deleteRow":"Удалить строки"},"rows":"Строки","summary":"Итоги","title":"Свойства таблицы","toolbar":"Таблица","widthPc":"процентов","widthPx":"пикселей","widthUnit":"единица измерения"},"toolbar":{"toolbarCollapse":"Свернуть панель инструментов","toolbarExpand":"Развернуть панель инструментов","toolbarGroups":{"document":"Документ","clipboard":"Буфер обмена / Отмена действий","editing":"Корректировка","forms":"Формы","basicstyles":"Простые стили","paragraph":"Абзац","links":"Ссылки","insert":"Вставка","styles":"Стили","colors":"Цвета","tools":"Инструменты"},"toolbars":"Панели инструментов редактора"},"undo":{"redo":"Повторить","undo":"Отменить"},"sourcedialog":{"toolbar":"Исходник","title":"Источник"},"acymediabrowser":{"toolbar":"Изображение"},"addtag":{"toolbar":"Теги"},"smiley":{"toolbar":"Emojis"}};
components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/lang/fr.js000060400000030011152453623450026136 0ustar00CKEDITOR.lang['fr']={"editor":"Éditeur de Texte Enrichi","editorPanel":"Tableau de bord de l'éditeur de texte enrichi","common":{"editorHelp":"Appuyez sur ALT-0 pour l'aide","browseServer":"Explorer le serveur","url":"URL","protocol":"Protocole","upload":"Envoyer","uploadSubmit":"Envoyer sur le serveur","image":"Image","flash":"Flash","form":"Formulaire","checkbox":"Case à cocher","radio":"Bouton Radio","textField":"Champ texte","textarea":"Zone de texte","hiddenField":"Champ caché","button":"Bouton","select":"Liste déroulante","imageButton":"Bouton image","notSet":"<non défini>","id":"Id","name":"Nom","langDir":"Sens d'écriture","langDirLtr":"Gauche à droite (LTR)","langDirRtl":"Droite à gauche (RTL)","langCode":"Code de langue","longDescr":"URL de description longue (longdesc => malvoyant)","cssClass":"Classe CSS","advisoryTitle":"Description (title)","cssStyle":"Style","ok":"OK","cancel":"Annuler","close":"Fermer","preview":"Aperçu","resize":"Déplacer pour modifier la taille","generalTab":"Général","advancedTab":"Avancé","validateNumberFailed":"Cette valeur n'est pas un nombre.","confirmNewPage":"Les changements non sauvegardés seront perdus. Êtes-vous sûr de vouloir charger une nouvelle page?","confirmCancel":"Certaines options ont été modifiées. Êtes-vous sûr de vouloir fermer?","options":"Options","target":"Cible (Target)","targetNew":"Nouvelle fenêtre (_blank)","targetTop":"Fenêtre supérieure (_top)","targetSelf":"Même fenêtre (_self)","targetParent":"Fenêtre parent (_parent)","langDirLTR":"Gauche à Droite (LTR)","langDirRTL":"Droite à Gauche (RTL)","styles":"Style","cssClasses":"Classes de style","width":"Largeur","height":"Hauteur","align":"Alignement","alignLeft":"Gauche","alignRight":"Droite","alignCenter":"Centré","alignJustify":"Justifier","alignTop":"Haut","alignMiddle":"Milieu","alignBottom":"Bas","alignNone":"Aucun","invalidValue":"Valeur incorrecte.","invalidHeight":"La hauteur doit être un nombre.","invalidWidth":"La largeur doit être un nombre.","invalidCssLength":"La valeur spécifiée pour le champ \"%1\" doit être un nombre positif avec ou sans unité de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, ou pc).","invalidHtmlLength":"La valeur spécifiée pour le champ \"%1\" doit être un nombre positif avec ou sans unité de mesure HTML valide (px ou %).","invalidInlineStyle":"La valeur spécifiée pour le style inline doit être composée d'un ou plusieurs couples de valeur au format \"nom : valeur\", separés par des points-virgules.","cssLengthTooltip":"Entrer un nombre pour une valeur en pixels ou un nombre avec une unité de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, ou pc).","unavailable":"%1<span class=\"cke_accessibility\">, Indisponible</span>"},"basicstyles":{"bold":"Gras","italic":"Italique","strike":"Barré","subscript":"Indice","superscript":"Exposant","underline":"Souligné"},"blockquote":{"toolbar":"Citation"},"clipboard":{"copy":"Copier","copyError":"Les paramètres de sécurité de votre navigateur ne permettent pas à l'éditeur d'exécuter automatiquement des opérations de copie. Veuillez utiliser le raccourci clavier (Ctrl/Cmd+C).","cut":"Couper","cutError":"Les paramètres de sécurité de votre navigateur ne permettent pas à l'éditeur d'exécuter automatiquement l'opération \"couper\". Veuillez utiliser le raccourci clavier (Ctrl/Cmd+X).","paste":"Coller","pasteArea":"Coller la zone","pasteMsg":"Veuillez coller le texte dans la zone suivante en utilisant le raccourci clavier (<strong>Ctrl/Cmd+V</strong>) et cliquez sur OK.","securityMsg":"A cause des paramètres de sécurité de votre navigateur, l'éditeur n'est pas en mesure d'accéder directement à vos données contenues dans le presse-papier. Vous devriez réessayer de coller les données dans la fenêtre.","title":"Coller"},"button":{"selectedLabel":"%1 (Sélectionné)"},"colorbutton":{"auto":"Automatique","bgColorTitle":"Couleur d'arrière plan","colors":{"000":"Noir","800000":"Marron","8B4513":"Brun moyen","2F4F4F":"Vert sombre","008080":"Canard","000080":"Bleu marine","4B0082":"Indigo","696969":"Gris foncé","B22222":"Rouge brique","A52A2A":"Brun","DAA520":"Or terni","006400":"Vert foncé","40E0D0":"Turquoise","0000CD":"Bleu royal","800080":"Pourpre","808080":"Gris","F00":"Rouge","FF8C00":"Orange foncé","FFD700":"Or","008000":"Vert","0FF":"Cyan","00F":"Bleu","EE82EE":"Violet","A9A9A9":"Gris moyen","FFA07A":"Saumon","FFA500":"Orange","FFFF00":"Jaune","00FF00":"Lime","AFEEEE":"Turquoise clair","ADD8E6":"Bleu clair","DDA0DD":"Prune","D3D3D3":"Gris clair","FFF0F5":"Fard Lavande","FAEBD7":"Blanc antique","FFFFE0":"Jaune clair","F0FFF0":"Honeydew","F0FFFF":"Azur","F0F8FF":"Bleu Alice","E6E6FA":"Lavande","FFF":"Blanc"},"more":"Plus de couleurs...","panelTitle":"Couleurs","textColorTitle":"Couleur de texte"},"colordialog":{"clear":"Effacer","highlight":"Détails","options":"Option des couleurs","selected":"Couleur choisie","title":"Choisir une couleur"},"contextmenu":{"options":"Options du menu contextuel"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 éléments"},"font":{"fontSize":{"label":"Taille","voiceLabel":"Taille de police","panelTitle":"Taille de police"},"label":"Police","panelTitle":"Style de police","voiceLabel":"Police"},"format":{"label":"Format","panelTitle":"Format de paragraphe","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"Titre 1","tag_h2":"Titre 2","tag_h3":"Titre 3","tag_h4":"Titre 4","tag_h5":"Titre 5","tag_h6":"Titre 6","tag_p":"Normal","tag_pre":"Formaté"},"horizontalrule":{"toolbar":"Ligne horizontale"},"image":{"alertUrl":"Veuillez entrer l'adresse de l'image","alt":"Texte de remplacement","border":"Bordure","btnUpload":"Envoyer sur le serveur","button2Img":"Voulez-vous transformer le bouton image sélectionné en simple image?","hSpace":"Espacement horizontal","img2Button":"Voulez-vous transformer l'image en bouton image?","infoTab":"Informations sur l'image","linkTab":"Lien","lockRatio":"Conserver les proportions","menu":"Propriétés de l'image","resetSize":"Taille d'origine","title":"Propriétés de l'image","titleButton":"Propriétés du bouton image","upload":"Envoyer","urlMissing":"L'adresse source de l'image est manquante.","vSpace":"Espacement vertical","validateBorder":"Bordure doit être un entier.","validateHSpace":"HSpace doit être un entier.","validateVSpace":"VSpace doit être un entier."},"indent":{"indent":"Augmenter le retrait (tabulation)","outdent":"Diminuer le retrait (tabulation)"},"justify":{"block":"Justifier","center":"Centrer","left":"Aligner à gauche","right":"Aligner à droite"},"fakeobjects":{"anchor":"Ancre","flash":"Animation Flash","hiddenfield":"Champ caché","iframe":"IFrame","unknown":"Objet inconnu"},"link":{"acccessKey":"Touche d'accessibilité","advanced":"Avancé","advisoryContentType":"Type de contenu (ex: text/html)","advisoryTitle":"Description (title)","anchor":{"toolbar":"Ancre","menu":"Editer l'ancre","title":"Propriétés de l'ancre","name":"Nom de l'ancre","errorName":"Veuillez entrer le nom de l'ancre.","remove":"Supprimer l'ancre"},"anchorId":"Par ID d'élément","anchorName":"Par nom d'ancre","charset":"Charset de la cible","cssClasses":"Classe CSS","emailAddress":"Adresse E-Mail","emailBody":"Corps du message","emailSubject":"Sujet du message","id":"Id","info":"Infos sur le lien","langCode":"Code de langue","langDir":"Sens d'écriture","langDirLTR":"Gauche à droite","langDirRTL":"Droite à gauche","menu":"Editer le lien","name":"Nom","noAnchors":"(Aucune ancre disponible dans ce document)","noEmail":"Veuillez entrer l'adresse e-mail","noUrl":"Veuillez entrer l'adresse du lien","other":"<autre>","popupDependent":"Dépendante (Netscape)","popupFeatures":"Options de la fenêtre popup","popupFullScreen":"Plein écran (IE)","popupLeft":"Position gauche","popupLocationBar":"Barre d'adresse","popupMenuBar":"Barre de menu","popupResizable":"Redimensionnable","popupScrollBars":"Barres de défilement","popupStatusBar":"Barre de status","popupToolbar":"Barre d'outils","popupTop":"Position haute","rel":"Relation","selectAnchor":"Sélectionner l'ancre","styles":"Style","tabIndex":"Index de tabulation","target":"Cible","targetFrame":"<cadre>","targetFrameName":"Nom du Cadre destination","targetPopup":"<fenêtre popup>","targetPopupName":"Nom de la fenêtre popup","title":"Lien","toAnchor":"Ancre","toEmail":"E-mail","toUrl":"URL","toolbar":"Lien","type":"Type de lien","unlink":"Supprimer le lien","upload":"Envoyer"},"list":{"bulletedlist":"Insérer/Supprimer la liste à puces","numberedlist":"Insérer/Supprimer la liste numérotée"},"maximize":{"maximize":"Agrandir","minimize":"Minimiser"},"pastefromword":{"confirmCleanup":"Le texte à coller semble provenir de Word. Désirez-vous le nettoyer avant de coller?","error":"Il n'a pas été possible de nettoyer les données collées à la suite d'une erreur interne.","title":"Coller depuis Word","toolbar":"Coller depuis Word"},"pastetext":{"button":"Coller comme texte sans mise en forme","title":"Coller comme texte sans mise en forme"},"removeformat":{"toolbar":"Supprimer la mise en forme"},"sourcearea":{"toolbar":"Source"},"stylescombo":{"label":"Styles","panelTitle":"Styles de mise en page","panelTitle1":"Styles de blocs","panelTitle2":"Styles en ligne","panelTitle3":"Styles d'objet"},"table":{"border":"Taille de la bordure","caption":"Titre du tableau","cell":{"menu":"Cellule","insertBefore":"Insérer une cellule avant","insertAfter":"Insérer une cellule après","deleteCell":"Supprimer les cellules","merge":"Fusionner les cellules","mergeRight":"Fusionner à droite","mergeDown":"Fusionner en bas","splitHorizontal":"Fractionner horizontalement","splitVertical":"Fractionner verticalement","title":"Propriétés de la cellule","cellType":"Type de cellule","rowSpan":"Fusion de lignes","colSpan":"Fusion de colonnes","wordWrap":"Césure","hAlign":"Alignement Horizontal","vAlign":"Alignement Vertical","alignBaseline":"Bas du texte","bgColor":"Couleur d'arrière-plan","borderColor":"Couleur de Bordure","data":"Données","header":"Entête","yes":"Oui","no":"Non","invalidWidth":"La Largeur de Cellule doit être un nombre.","invalidHeight":"La Hauteur de Cellule doit être un nombre.","invalidRowSpan":"La fusion de lignes doit être un nombre entier.","invalidColSpan":"La fusion de colonnes doit être un nombre entier.","chooseColor":"Choisissez"},"cellPad":"Marge interne des cellules","cellSpace":"Espacement des cellules","column":{"menu":"Colonnes","insertBefore":"Insérer une colonne avant","insertAfter":"Insérer une colonne après","deleteColumn":"Supprimer les colonnes"},"columns":"Colonnes","deleteTable":"Supprimer le tableau","headers":"En-Têtes","headersBoth":"Les deux","headersColumn":"Première colonne","headersNone":"Aucunes","headersRow":"Première ligne","invalidBorder":"La taille de la bordure doit être un nombre.","invalidCellPadding":"La marge intérieure des cellules doit être un nombre positif.","invalidCellSpacing":"L'espacement des cellules doit être un nombre positif.","invalidCols":"Le nombre de colonnes doit être supérieur à 0.","invalidHeight":"La hauteur du tableau doit être un nombre.","invalidRows":"Le nombre de lignes doit être supérieur à 0.","invalidWidth":"La largeur du tableau doit être un nombre.","menu":"Propriétés du tableau","row":{"menu":"Ligne","insertBefore":"Insérer une ligne avant","insertAfter":"Insérer une ligne après","deleteRow":"Supprimer les lignes"},"rows":"Lignes","summary":"Résumé (description)","title":"Propriétés du tableau","toolbar":"Tableau","widthPc":"% pourcents","widthPx":"pixels","widthUnit":"unité de largeur"},"toolbar":{"toolbarCollapse":"Enrouler la barre d'outils","toolbarExpand":"Dérouler la barre d'outils","toolbarGroups":{"document":"Document","clipboard":"Presse-papier/Défaire","editing":"Editer","forms":"Formulaires","basicstyles":"Styles de base","paragraph":"Paragraphe","links":"Liens","insert":"Insérer","styles":"Styles","colors":"Couleurs","tools":"Outils"},"toolbars":"Barre d'outils de l'éditeur"},"undo":{"redo":"Rétablir","undo":"Annuler"},"sourcedialog":{"toolbar":"Source","title":"Source"},"acymediabrowser":{"toolbar":"Images"},"addtag":{"toolbar":"Balises"},"smiley":{"toolbar":"Emojis"}};
components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/contents.css000060400000002676152453623450026637 0ustar00
body
{
	font-family: sans-serif, Arial, Verdana, "Trebuchet MS";
	font-size: 12px;

	color: #333;

	background-color: #fff;

	margin: 20px;
}

.cke_editable
{
	font-size: 13px;
	line-height: 1.6;
}

blockquote
{
	font-style: italic;
	font-family: Georgia, Times, "Times New Roman", serif;
	padding: 2px 0;
	border-style: solid;
	border-color: #ccc;
	border-width: 0;
}

.cke_contents_ltr blockquote
{
	padding-left: 20px;
	padding-right: 8px;
	border-left-width: 5px;
}

.cke_contents_rtl blockquote
{
	padding-left: 8px;
	padding-right: 20px;
	border-right-width: 5px;
}

a
{
	color: #0782C1;
}

ol,ul,dl
{
	*margin-right: 0px;
	padding: 0 40px;
}

h1,h2,h3,h4,h5,h6
{
	font-weight: normal;
	line-height: 1.2;
}

hr
{
	border: 0px;
	border-top: 1px solid #ccc;
}

img.right
{
	border: 1px solid #ccc;
	float: right;
	margin-left: 15px;
	padding: 5px;
}

img.left
{
	border: 1px solid #ccc;
	float: left;
	margin-right: 15px;
	padding: 5px;
}

pre
{
	white-space: pre-wrap; 	word-wrap: break-word; 	-moz-tab-size: 4;
	-o-tab-size: 4;
	-webkit-tab-size: 4;
	tab-size: 4;
}

.marker
{
	background-color: Yellow;
}

span[lang]
{
	font-style: italic;
}

figure
{
	text-align: center;
	border: solid 1px #ccc;
	border-radius: 2px;
	background: rgba(0,0,0,0.05);
	padding: 10px;
	margin: 10px 20px;
	display: inline-block;
}

figure > figcaption
{
	text-align: center;
	display: block; }

a > img {
	padding: 1px;
	margin: 1px;
	border: none;
	outline: 1px solid #0782C1;
}

components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/index.html000060400000000054152453623450026251 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/adapters/jquery.js000060400000005447152453623450027747 0ustar00(function(a){CKEDITOR.config.jqueryOverrideVal="undefined"==typeof CKEDITOR.config.jqueryOverrideVal?!0:CKEDITOR.config.jqueryOverrideVal;"undefined"!=typeof a&&(a.extend(a.fn,{ckeditorGet:function(){var a=this.eq(0).data("ckeditorInstance");if(!a)throw"CKEditor is not initialized yet, use ckeditor() with a callback.";return a},ckeditor:function(g,d){if(!CKEDITOR.env.isCompatible)throw Error("The environment is incompatible.");if(!a.isFunction(g))var k=d,d=g,g=k;var i=[],d=d||{};this.each(function(){var b=
a(this),c=b.data("ckeditorInstance"),f=b.data("_ckeditorInstanceLock"),h=this,j=new a.Deferred;i.push(j.promise());if(c&&!f)g&&g.apply(c,[this]),j.resolve();else if(f)c.once("instanceReady",function(){setTimeout(function(){c.element?(c.element.$==h&&g&&g.apply(c,[h]),j.resolve()):setTimeout(arguments.callee,100)},0)},null,null,9999);else{if(d.autoUpdateElement||"undefined"==typeof d.autoUpdateElement&&CKEDITOR.config.autoUpdateElement)d.autoUpdateElementJquery=!0;d.autoUpdateElement=!1;b.data("_ckeditorInstanceLock",
!0);c=a(this).is("textarea")?CKEDITOR.replace(h,d):CKEDITOR.inline(h,d);b.data("ckeditorInstance",c);c.on("instanceReady",function(d){var e=d.editor;setTimeout(function(){if(e.element){d.removeListener();e.on("dataReady",function(){b.trigger("dataReady.ckeditor",[e])});e.on("setData",function(a){b.trigger("setData.ckeditor",[e,a.data])});e.on("getData",function(a){b.trigger("getData.ckeditor",[e,a.data])},999);e.on("destroy",function(){b.trigger("destroy.ckeditor",[e])});e.on("save",function(){a(h.form).submit();
return!1},null,null,20);if(e.config.autoUpdateElementJquery&&b.is("textarea")&&a(h.form).length){var c=function(){b.ckeditor(function(){e.updateElement()})};a(h.form).submit(c);a(h.form).bind("form-pre-serialize",c);b.bind("destroy.ckeditor",function(){a(h.form).unbind("submit",c);a(h.form).unbind("form-pre-serialize",c)})}e.on("destroy",function(){b.removeData("ckeditorInstance")});b.removeData("_ckeditorInstanceLock");b.trigger("instanceReady.ckeditor",[e]);g&&g.apply(e,[h]);j.resolve()}else setTimeout(arguments.callee,
100)},0)},null,null,9999)}});var f=new a.Deferred;this.promise=f.promise();a.when.apply(this,i).then(function(){f.resolve()});this.editor=this.eq(0).data("ckeditorInstance");return this}}),CKEDITOR.config.jqueryOverrideVal&&(a.fn.val=CKEDITOR.tools.override(a.fn.val,function(g){return function(d){if(arguments.length){var k=this,i=[],f=this.each(function(){var b=a(this),c=b.data("ckeditorInstance");if(b.is("textarea")&&c){var f=new a.Deferred;c.setData(d,function(){f.resolve()});i.push(f.promise());
return!0}return g.call(b,d)});if(i.length){var b=new a.Deferred;a.when.apply(this,i).done(function(){b.resolveWith(k)});return b.promise()}return f}var f=a(this).eq(0),c=f.data("ckeditorInstance");return f.is("textarea")&&c?c.getData():g.call(f)}})))})(window.jQuery);
components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/adapters/index.html000060400000000054152453623450030054 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/build-config.js000060400000002257152453623450027163 0ustar00

var CKBUILDER_CONFIG = {
	skin: 'moono',
	preset: 'standard',
	ignore: [
		'.bender',
		'bender.js',
		'bender-err.log',
		'bender-out.log',
		'dev',
		'.DS_Store',
		'.editorconfig',
		'.gitattributes',
		'.gitignore',
		'gruntfile.js',
		'.idea',
		'.jscsrc',
		'.jshintignore',
		'.jshintrc',
		'.mailmap',
		'node_modules',
		'package.json',
		'README.md',
		'tests'
	],
	plugins : {
		'basicstyles' : 1,
		'blockquote' : 1,
		'clipboard' : 1,
		'colorbutton' : 1,
		'colordialog' : 1,
		'contextmenu' : 1,
		'elementspath' : 1,
		'enterkey' : 1,
		'entities' : 1,
		'filebrowser' : 1,
		'floatingspace' : 1,
		'font' : 1,
		'format' : 1,
		'horizontalrule' : 1,
		'htmlwriter' : 1,
		'image' : 1,
		'indentlist' : 1,
		'justify' : 1,
		'link' : 1,
		'list' : 1,
		'maximize' : 1,
		'pastefromword' : 1,
		'pastetext' : 1,
		'removeformat' : 1,
		'resize' : 1,
		'sharedspace' : 1,
		'sourcearea' : 1,
		'sourcedialog' : 1,
		'stylescombo' : 1,
		'stylesheetparser' : 1,
		'tab' : 1,
		'table' : 1,
		'tabletools' : 1,
		'toolbar' : 1,
		'undo' : 1,
		'wysiwygarea' : 1
	},
	languages : {
		'de' : 1,
		'en' : 1,
		'es' : 1,
		'fr' : 1,
		'it' : 1,
		'nl' : 1,
		'pt-br' : 1,
		'ru' : 1
	}
};
components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/index.html000060400000000054152453623450027400 0ustar00<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/dialog_ie.css000060400000040473152453623450031112 0ustar00components.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}
com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/editor_ie.css000060400000110744152453623450031140 0ustar00components.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_rtl .cke_button__sourcedialog_icon, .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_ltr .cke_button__sourcedialog_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}
com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/dialog_iequirks.css000060400000040530152453623450032343 0ustar00components.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_footer{filter:""}
components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/icons2.png000060400000024063152453623450030443 0ustar00�PNG


IHDRP��� IDATx��}{p���k�<43�G3�Go!$Y�Coa$�Q�#�pH�ݥ�.�w	���u��/Ky�r�8K�˽�f�����x��
666�lc[�,[�y��̹Lw���{fd1�U]�|������q�s����`?�gԩ3u�����}I,���$�� ��$�v��a�cR�5��|w]]�u�ϟ������+V��v�޳g�Vϛ7���o�l��sj� @$�I(P�lٲ�~2d�7����	�Xclcl1�q���H���Ye9^]1�LB�<ov�\;�v;f͚"�SO=�Ƕ��MY	b�"�H����������ᰭ���7�
8��9�V��A����F"�FDc]]]oRYYY�S��&$�I0ƾ��@Yww�vA����h��"���7�c����x���
CCC1"
0ƴ	��q�B!�L&��d��q�V+jjjp��Y�x��C]����0�Lp��H&��d29:11qz�ڵ�…w0�"ٚ��)��lB~����|Ʒ@D����n|>q���u�����(▯��f��A066��g�
[�n��==HDC˗/�E������D%�fe9]�`-c�	Ap�…����'3Ǝ�E�1&��1����w����q�����h3g�|�16�U&��z����M7��v���[o������D4�W(7
��D"q��i�|� ��k�=��T�Y�:��9s����G�A��j�l06c�sAA��$��(��?B��R-i�2%h��s�*���ȪQ.�KjR0`��2��X��*��������������8$	D�Q��q������ܾgϞ��}>�؝w�I˖-�w�y'�L&�������w�ŋӏ�c����kooo����M�я~�H
��Z|���1y��"œ9s@Dؼy3��c��16�{�1֣���۷o?�f͚F�Á��a

ahh(9::�GO;��A��;�>[K��f3�<�L�(D�(�2(ONNb�ڵܞ={���Bp��^�d�i>�z�D�����˗��3g�`Ϟ=r=-��>���g�u3�b��K�p�`�f�J��̞=�x����("���$JKKQ]]���<��3�p�
��ؿ|ӦM�����1LLL����G}49k֬����48O����)"�KD����'����_��Ҡ%����x)
ԭH�p�or�v8'��r���w����A�Z�Gs��s��?

��t�M�Ϸ���~���s�΍:th�Y"Q'=u��77��n\�t�Җ-[>�c쭬0�<��#?�D"�P(��W�\��^�4�����8��8�n��v��=	�����p����|>��h4�;�,--kii!�D=lŔf:�V�l6��q��.�&��D�y�ԩ�>��l��~��~Q������H�$��D�ĥ���s5I$q@D�xME�a����4�}�u{S�T1�I�W?2�>&"�I�u�]W�E �ba�5H_c(:�.�S����g�����8
.��cL���4��)�����1A��4�j�Z`�	�R,�1�1/!�|F�E���l^��@��ŀ�/*26mX��Ik
�L�YW7%���*�}1����1�d�<��((HgnΜ9x衇PRR���A ��#�H���B!��~�bi�8�b�XF! ��� ��,�{�⦵f:Q�Ww�[
���5b����f3�H$�L&Өhu�yAPTT�Q�+---���Z��Y	�B�c�`��Ճ����u8���1444�R�IæM������������%��F�\s
uww���=ND+�����ϻ���X���8G2�ikk}饗�z$��Q����N�E"z[\rf���1P�k�TA�AC�������/,�v;�vmY��X�9�|g���:�1c!�0��V/��f���k	�����)���;�β��b0�p��Ilذa)���{{{{w̛7��㗿��v7pPZZ�,���111��
7*��^YY���1���!�L����������5gϞťK�011oK����3g�Ν;���I��~���#Dd�o�w��U�=��pp�n��F�����@�D�Ў;..\���W�����H����w߂����}"�S�OD�����ӣ�>�V���lllL<��S�'�/i�466Rss�"Tg���׾��WtF��jkk/��ՙ���?}��^M�8��|���+Z���x|��V��m޼�i"�_'߀��z#�Uyծ��#-�\�����\.R�Q-��X,����J"P�!�a�Xt�D�7c���\�Ma����l����nhq�Ք��i�I@ID��K��DD���ĩ����mZ��aֱn�Ǧȟ��~��@��\��'���c�`@�^0�B^�D4o��t	HD���^0�/4�@\`�A/��ٻ�����EEEcH�)�Qm�ن+**���������K���V�P��`+((ذ|��R�ϷG���w�����,Y�`�Z#��Z�/,[����c``�=��������'[[[b��m��d29���w��:s�ȑ�c��G�,�o�͛�����B<Gmm-N�8x���,//��16���X���aÆã��1�χ�����&�|��=���+�ʚD"'=�/��褴���"^�w=c�@ZY-H�5m����F�� 8��ʝ;w~���l�`Cgg�|�Ͷ�����,**z�������;�ڸ��v�}h```g{{{x˖-OQ)���믿>��ӳ����R��l�� ��C�>���[�:m)�񎎎�D�.��|	�L�S "���<��s���>��R~ww�w�v��~��hII�D4m�۷o�5�����կ�*�
����ۈԙ�Ck׮�=9�Q/�NNыDT����i"�q�V'0���^�`�C/�B��n'q��^!�y�7x���o��9s&���o���H}��خ&p��ѣ|cc�쾾� D�&�m��c��{�nSS��)���ND�(e��q1o��j͜\Ϝ93��:���%�4�S6��������F�,H�S��i����Қ����|�&(�kq!��+�&��a�_M�!�+ƥPp��&��.�(�49�8�����i��샌��w�y�(���PPP��jD��D�[ZW���S�&g\�f��~�����\���s984`������^��|1!(�=���vp��	EDH&��x���?��*��#�<BV�5�!�`͚5�0��w�l6C�FzH&���b���ǫd�Nb#o������lFII	L&S�
R��ŋ��b�q�nϘE�y���!"��L�1>�쳟«l�X�� �~
���s6`���4Z[[��2�s57���q��K��c�c�!%�t��I�ɬ��j�	g��/Rg�����lj���d�޻��?�b�
]�Ҏ�K����"��F��������Lu����j�^�XCC!�Jn����3�ҹ6��bY?00�7o|>���v;d�E����~���sGaa�Qw���
�'	D"tvv:l6�I�1����S�NٝN��4�<Ap��Q���`�̙D��011���a?~<�������͡PH�抚�)7O��� H�N��\VV�D"���� �I� ��h`�ን���zE��f�D�|I�i������~�*�_�
i�.�1���D�`���@D<�NI�Ts��xr7A�.ADR��P�2�����8xE<����I}�u�3�����v���|�kd�b7���Yŋħ ?�(�?��K�O�$p����%���-��>�*@D�&���B�u�.�N����ۑn�������~`�Z���2)�Edʋ��j�cL��J�I"*G��8�ӑ��ٳ�Uq�Ѻu�
y��_(�����j�hMyfڢ�����s���!9a��SxjP�������x<o�a)��k荓���J&��ģڕ����2�����	�{PXX�˳�,}��=����X,�W��鍬�D��T��|~�g?_p��W6_��Լ!͸Q��v����8oxE� �|A�V��IDS��/h������o�;Ř/0p�c��j����q�V�_�N�@���� @D��:�-
���Z��햚�W�ٯ��N�	H:���)�O��T°���>�ar%�}@D�GGGGw9
��}Y������W�Ü}��ދ�|A��������)�ſ�T�}�K^_PB�l"Ƙ��#��-�XV�a���U
����.**��~L��2�)[U u���V�5���D���#���X�ŷ���N~�!&''/1�����hii���^�9+b�֭[���	���LG�a�PRR�9s�����D�D"�p8,����q����?��?e�-�F��ðX,P,��[�D�x<.W�n��f,�j"�l)��	��J5}�J��,h3l4c���l�B�͉�*q�ۄ��I$	0���!�	�'-�h<���$ cݺu��^�ź�:���
���o[�j�J�=E��Vg+++�@aaa���=Dt!���T��D�]"jT�qѯS\q��Hyx-��=���;ҸlҬ΀@_/T���}���pF(A����z��pD�͛GMMMd�Z�H�X�"�/����(�$狋�鮻��lc�dǏ��Çq��9�%��鮫�ÁX�LR��`P��qjjjPWW���N�>
@!%'	W`�q�8В��Fe��x<A2*)��I�^��&	��Ľn��0���EAAA��P��ccc��&��h4���v����0�L "��a��dSr���r+���)"��jժ-����jkk�uuu�z/�[�nI�+׈�ߍ�~�LD~Qo\ �{�}�S΋��Qo�qY��*���7`���i�^���BʰS��W,�&T�9HD)V*�555TUUE�4"�����HD��P(��պ[y���n���N[��Z��C��oDNRp��DD�����D���(_�Hduu5Q��H���f;�KVVV�Z�s��i��j�[YY��1���lS�����o��6JɊQ���


������uR ��X�z�V��(��]�b��+V��z
W�^����BI�'��(�@y���L{[,�Z�W����Ĩ�Zi���s�,��`0x�z����������0��c,YQQ��<c�/gϞ=�1v��jmX�h���ӂ ����իWo޲eˣ�˖-[#�)��Tl�t���g��#��]]];�c�����j��������Dd&��-Z������Ν;AD;�(�3�����+��L�檪�ᎎ�D{{;���Ӭ��:gg̘1LD���ڤM�姐
k׮u8���|����n����AO��R�f���b��'�(|��j��L?R��vcj'$R�U]�+��^�t)-]��D"���4׌1٭[YYo2�`2�PVV��������UUU������k/�	h��m���������g�������+�1J�<fh{��x�����>�wH>lܸ���t�d2ܸq��10p�@O`�#l��\��<�ӓ����r?Oq�/0�6W��1j�\�(wDAA�,�y��=�|t}��g�
�:����
@��Y�w)kQ����Z��&����n%"y����U��'=���i
������#}Z��<F���}pZ�Q�]TT�Ҧ�c
�Jg��}��b�d�gԏQ�'�˴#	"�F|g_t��|�!d�f籊��j��\BF-qo ;�kaB��JJJ�8B�B
Y��#d2��R���2�y�Z2Z�QK�O�1f��>��?�Ǩ%�s>[TWW�ܹs����L&xB��&��:::h�ܹ$9\������18���x㍌A%o���לN� �1�ӧO���l�ɓ'a6�!� c�oԷg��� �ʲ�L�kt�-�Pkkk��bkk+�r�-�D�5SF�,))�L)��+P?��


���O���
":^RR�Yپ��o�WD�(�d�\D���X�'�����B��=�P��!�=ADWl�4��UPb�Ie���~*<S}}=,X BF��F�@.���f"ž2�477�…%N�����(
����ΝÛo��la���H�7-X����r;v6�
;v�Hyp�è��@(��8$U�C<Ͽ
�PQQ��k�ܹs���y�d�Vwcl����V� ;m�`hhH�}2�u�~\"������_�Z�Dy�_Ќ�eZ�X
��U�T��f�D`��ij��	�X�� A���s가ƥ��h��P�V�����SP*PWP�k5Y�������(�Eb���w��'�P[[�5ւ��+���2�ލX>5|����S��3]]�!맫+2X����js^��˓�qy4�Fz>M3.��K��7t��O�].��OW/(Y���񮮮���~����^$b���DS/455�� ϋ>*A��n�=���C�����kHʕ�|���Z����h��f�#D��p��7o���~��	H��2HwV�N�r�#���*���鱮A�F@\�с�IK=�P;�����)f��PA�B{���ԔU477�:��酴��ܸ��4�����M�KW�r����%����	�-s��2�ps�t�L@���|A�z�"�B��GZ>����.���.ч�+|~�]dy��+c�U�����a֬Yoz<��?��L����QRR������t���#��,���@#���gM]]�kxx8��?��cJ7�b����cl�]�/^�F��x��kX*�&���6�
�hEEE�U�$�t:
��ߏ%K��ժ�
������ŋ���eL여Ps������D"�y�{�K�+�`��㨯��1&�4V!�Hu�H����555��x�w�Y!�9�n��ǝ����,))Y�Q[XHG���4'mmoo?�p8�g�^�ti�4bOb��ϨXc�l
���q�x[[�q\`hh�Y��v�u9������~��-^��R�w�J��K���������F�s�;KKK�]�d��/�00�Bv�������477g%����x�R^�j�
�W��*e�>�O��^�W{�!n��1�N�I��M���n�����*��q())!�lu8�5k�vD[,+�q��SQQ�=�r����!�ټ�Yi��Ƌ�MrOgg�m6����7�����cs��]`��vJ
���$���ϟ��{1kCggg����NL�ʿ�N�3
��;t�MAc�%Mq�(�##K9�Di:�W�̍i���-��O
�t��,�RM
5�r�&rѓ�DTKDg�����!�k��lQQ�>]1�"�'/U
Y/�'@�}҆~��� ��E]!����l6������z�������'��^`U��Η̝;wYqq������o6��@gg�m���	R'rw_ggg�1����Op�W������$]П�\��唲y�:H?��mC'���0�W8����{���1�H� L�T�bdK�y���8���
�@D�Z��X,�F��DR.3�i�1�l6̘1���$"J(�����:;;��`��y=�X,�O��ٳ��"h}�z2��Z�ϰ5�I3�L��X�s�X,y�q>���v��|�9>dt"R+:9�***��@'<U��3�j�ȶV�uY�V�R�`b��N"��.0`�s'R�/�>RMӃ�#�������_�2�Fq�ر�	�2�^����={6��3�Ej��0�Mj��_�ٯ~��N�ǃx<�d2	����"����ĉ�<�e�@,�F%o�IDAT\�pEaaa���0� G	���p8p�ݨ��DMMM����]�`���2�ry�pUUU�����y��a����N�%%%���b�ڵ+���� "�'��w�}������jll$q�]�������i�8kɜ��k쫏?��f�},�]��Dt�����d�&$�����w�f�fM"�o�ʕ�u	���D�R����0`��'����Q7|����@΁fKK��Z�dz
)��iu�#-��������f�����d2�t�ܹ/x�8��0����\sMKQQ�V+���da2�0::�W_}u���R3�^ZZ�����p8�X8�'\�`� ����+//oݴi������~u���ctt��8�s3gΜ�y����� `bbCCC�|�����1��7kkkgΜ���sϡ���@@���	EEEKvtt��g��o1�>P�}�O~�-�����C�6��l6��Ǐ�K�3ߙ��+W�'�����l�FD�R6��d<�DDn����`�C/z����r��燗���������j�#�H|�Q
�y�9�	��%+�)�������F��>���-��1�#G���7�%����������z$	��h4���1���}���~sxx8 �O'	444����@�WWW��� "���(�~?���,]���E�=����P(���J�L@��,b����}��f����������b1y�]>,,I�X,�����w�}��H��;;::֏����br9�k@n�t����}��MH逿a��[�x�@  s*�����x�.]�<��3[8
�3�����?�r�…�X,�aZ���PXX��:���ʿϜ9�`�K�%��d2	A�D�z��=��Q��=^�w���t�1v'c,���O���lF�S���ın�a=syy�j���b������mhhX��2AZҢl���X"�0����g�U,nkksI��^��rll�oc�~��####�B�Unll�f2��c�����t:QUU%wTAAN�:�@ ���͆d2�ƻ�{�ӧO�l``�}ttt��b1K�"�,�1�n-��<Ϟ;v��|����~C���1�W�R�k3?j�VH�3��恖[o��z�!�;w�Mgٖ����B4Ekk��f�C=����{B�����	����t�hiiq
�p��'���h4����	�-/������8���}�����bg***��C�����=��ҥK���B�Pu<��ٳ3�<�t:q���Ѫ��c7�p�1��ޥK�b�\s��]���I����/b���~�a�`���~����Ej	�ZM�����'��=y��e����VWWG���k������8����<"�^8�d2I/��R����+W��f�ڸIm�'���y<�:�]TT������+.��[�+K�9s����y��� FGG��o�s@D�iݞ1K\ijkk�z�j…p���)*b柸	3f�@ii��;	�x###�«�	PTT��S�r�:�O��o��x:�����X5�$$�v�*P�q�GZ�-q�"�����|��׾&WRB�9so��VZ���i�*�9k�����9�?>x���k�A�H$����;wn���dF�,H�	�"?�z{{[�c-��\D�-M�w1����dVV"B<���c�JN���H�3��H�ꑚ��M
�SeJx��U*���H	A099��ʧp&ǝ� ��	�Wi�A��t�0p�#�a��:�|A\k���sS�6R�F��X��s����D�H.\�uB����MR��
"*T��5_���p�c�n�s6A�i|��@G/�|���+E�Ԝ�"k��y���v�R*�:�������_���rx�^X�֌Ej�#�u�\,g�^�	Dd3u<�f6A��n7y�^]!�#�����d�����<׬��XG2p���F\��zIEND�B`�components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/editor.css000060400000106775152453623450030553 0ustar00.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_rtl .cke_button__sourcedialog_icon, .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_ltr .cke_button__sourcedialog_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}
components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/index.html000060400000000054152453623450030527 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/readme.md000060400000004741152453623450030320 0ustar00"Moono" Skin
====================

This skin has been chosen for the **default skin** of CKEditor 4.x, elected from the CKEditor
[skin contest](http://ckeditor.com/blog/new_ckeditor_4_skin) and further shaped by
the CKEditor team. "Moono" is maintained by the core developers.

For more information about skins, please check the [CKEditor Skin SDK](http://docs.cksource.com/CKEditor_4.x/Skin_SDK)
documentation.

Features
-------------------
"Moono" is a monochromatic skin, which offers a modern look coupled with gradients and transparency.
It comes with the following features:

- Chameleon feature with brightness,
- high-contrast compatibility,
- graphics source provided in SVG.

Directory Structure
-------------------

CSS parts:
- **editor.css**: the main CSS file. It's simply loading several other files, for easier maintenance,
- **mainui.css**: the file contains styles of entire editor outline structures,
- **toolbar.css**: the file contains styles of the editor toolbar space (top),
- **richcombo.css**: the file contains styles of the rich combo ui elements on toolbar,
- **panel.css**: the file contains styles of the rich combo drop-down, it's not loaded
until the first panel open up,
- **elementspath.css**: the file contains styles of the editor elements path bar (bottom),
- **menu.css**: the file contains styles of all editor menus including context menu and button drop-down,
it's not loaded until the first menu open up,
- **dialog.css**: the CSS files for the dialog UI, it's not loaded until the first dialog open,
- **reset.css**: the file defines the basis of style resets among all editor UI spaces,
- **preset.css**: the file defines the default styles of some UI elements reflecting the skin preference,
- **editor_XYZ.css** and **dialog_XYZ.css**: browser specific CSS hacks.

Other parts:
- **skin.js**: the only JavaScript part of the skin that registers the skin, its browser specific files and its icons and defines the Chameleon feature,
- **icons/**: contains all skin defined icons,
- **images/**: contains a fill general used images,
- **dev/**: contains SVG source of the skin icons.

License
-------

Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.

Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html).

See LICENSE.md for more information.
com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/editor_iequirks.css000060400000112155152453623450032375 0ustar00components.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_top,.cke_contents,.cke_bottom{width:100%}.cke_button_arrow{font-size:0}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon{display:inline-block;vertical-align:top}.cke_rtl .cke_button_icon{float:none}.cke_resizer{width:10px}.cke_source{white-space:normal}.cke_bottom{position:static}.cke_colorbox{font-size:0}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_rtl .cke_button__sourcedialog_icon, .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_ltr .cke_button__sourcedialog_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}
components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/icons.png000060400000024322152453623450030357 0ustar00�PNG


IHDR����1 IDATx��}ytՙ���v�[�f!�v�E�l$���%���7�yx�yC��a�0�3�/��$�8q�0s�3��!������Wlc�x�%���{wujUuWu�!���9u���W߽U�}�~����Gl@��2��P�Z��&x<��_��זF"LMM��#����a׮]A�8%��K%`4ﭭ���ҥK��^{-�r�ʠ�j�w�…�y��<�Y*ϥ�  �@1���˗��z�>�/��i$80�Zc�cK8��FGG����/�����8A��F�ӹ�j�b��� "<��3hkkۜ�!� 
�;;;MNN�H�.Z:::z#���cZ��l6o����0m"��D4���uppp������} 5!��1�������;A@cc#�!c��\"���������6G���S'�F`0���
�q0�ͨ��ƅp�-��'��49�cǎ�`0��r!�������ٵk�r�-��ej "K2��c�Uy��o��x9a��t�|�Na��Ny!կQ��_��׌V�� `||.\�m�)((�~{"z���W�XA�/������(LDM�r�b�Z�؏A��˗����~��1v<'�1������د�ig�UUU��0JJJN2�&��d"�TWW�z����[f����;���)HDZ�2qp� ��b��1����Ap�7g����x@xΜ9���G6�-
�V�T�l0>k�,c^^��8��0�����25�W�����EI�e�DdV)a��U)��q]c9��F��A�P�B�{aa�/ZZZ�qb���0��(FGGQVVfݻwo@�֥����s-_���9���ё���o��ؒ%K������{{{��mmm~�@b`���na�%�����̙"–-[x���c���1��s��ye�>رclj5k�4�l6���`xx���񱱱?x�f�������r����F#�</O�	�D�(��(OMMa�ڵ�޽{���|p�^xAg��>�:�D����+V�����c�޽�zjz�}�<��f�EcW�� �~?fϞ���i477��C(B<GQQ���0::��{�ܨI��͛7s�����199���B�������ٳ�1��T�<"$�g�h�#"/�OD�Q�fE:t(�&2���x	
�-K�p�o�ֶ�l�������r�����d6�Odey׮]����[m����JKK�p�B�ŋǎ=�[�@R"Q'=s�m�5�\.'\�z��֭[?�c�݌0�>��c��B�@ ��x�g�*+8@��~���c�|D���ܳg��/ثED™��V*--����|�]EEE�---����m��Lg��F��
]�|y�'��3g����b� ��4��D�AD���\YZ'
ѳ�2�ek�H >f�8�3��Y ��Y���T�I��?��>&"�H�M7�T�F �ba��K_c 8�Z0�b���K�IdR,6��8��s��m
�2)�C�����qA��K��Z`�	3R,�1�1/A�>#Ţ�L��h4n�J GŢC�i���x��$��#��F�$�II_LY��&Ɨ.]��~yyJ��̙�Gy�����4>�^��XL��z�(�8�"�HZ! ��D J3�ꚫ�h��N��j�|���8�t��~E��h�c��񸂊Z'^v��-/WTTT�Fa6��2��~?���|	@��c��l��㨯�?�ZG�͛7?[SS���%��C��n�����&��3DD+��Ռ��>��]]]�H$R�q�-���������+=�Zӄ�X~GD�":(��+B9�tm�*�.PD�\�ւ>W���j���-C�ZK�2���M7�D�f�"$ө��%��H7�x#!��q0-P6|�;�Y^PP�N�>��7.��b~ooo��y���8x�^��׿�`EEEM� `bb���p�\p������8��8���z9]s��\�z>����pP�@�>�远?�w��ELMM����'"K����[�n�:��� �r�-�����葝;w^Y�h��|�+T^^�������.\H�����=��D�jll�?>=����?љ


�g�y�D�%�����jjj�ID����V�5�կ~�u�ѹ
�њ��+D���~����EDo(:'���v��D����`4]ED��.�[�ly����ס�:��HdUN�kkkI
N�s2'"N��Rӈ���.�L��D�Vk9�ڐSa2�4�D2c�4.��0�,�j��<��j�5��q�D��Q����$ ��31q:!1�%���o�q������gj�O�'&�iy [3�	d{s@�/�P��t��9��.My��t����5
,��6{O���`�n��#᧘�*��2R^^>,%�}�mmm�.[��i6�߀l�K^^��+V�����$p�=������ҥK��f�o�2f����˗�{�^��ʫ��644<���Z�D�}�����񉾾����l8z���Ǐ?��'-FA~3o޼ކ����0��(jjj���^{�w����e�M�6�1�y�mܸ����X�������?���{��ʞ�*���v�ݿ��S�r$	y<�
��C��j�Xk����9?_Ap8�v�@���8�
������eǡC�&�;6e������C��w7Wix�j��joonݺ�"*""'=s��7�{zz�|����m��꧄w�G}t+�-%<��ѱ���#�KKKcH� '@D��q��u���}�����򻻻�k�Z�����'��p�رc����VUU�ED�d7����o{>��]��wDdS �^J�&�$����H��ѳD4"6�j��Cǧ]/�zA��t����!��J��fH�P�{��w�]wՕ��.]��W_}��H|��ؑJ�ĉ'����澾>?D�&�o��s�N�ɓ'�kll4*X�Z�DD����������uIIIN�u@i�J��T�LO��$�FS�m��AJ��oR����&�X�������p5.��IFj��������d�5�I��F���*��>�����*eU� �Ps�ȑ�v�C^^^��,���h�dW�����&�]�g�μ���֩Z%��.�:t�BF�zA���Q��Pi$�&�PL�/
�lhhH�;�D"�������c8~�8�y�_�jjj�C,� �������緿��wFFF|�Pb���ף���n@�UUUF�ߏP(�p8�׋���˖-{i���/0�v{��d~ @EE�9I � �&�(�|><��c�b������흚�J��D"I��	�'�@$�����{�
E&&&�G"�d9I&r�m����׷�1�����1�ɒ%�}>_�SIfr@B�b1D�Q\�z5��s�m`����h4>����p��˗�"���^�@j~~�^��6ʍN�VRR�M��%�ɤ�@��
��z��b�<�XQQ�c�Ƙ��g���	H��b�,X�����luii��1��ۇ������~���Ah���`0�Ōeee�cUyyyK��ڜCb������w�u����(�@(�*744l7��Hp8���LvT^^Μ9�����łx<��{�w;��g�|``�}lll��d2J�"�,�1H�p8q��{w�ܹ����Q��o�(H�;(�� �L	/:>'���\�&і;y��;w�$��Ґɍ���J��a���:���g"`ikk�/���`� 0�L̈́�ʖ�� �~���㽽��Pٞ�J ??�r����zzzB�H�|yy9��\tvuu��B!\�zu��ɓ?U�h���!�3�<�p8p�ʕ����S,8�r�N^�z5r�
78(,ک�}gmm�7�\��+V���G�� ����6����!�Vk:�U]]����O�>�؂�bŊ���֒��&����h4J�`���<"�^0�x<N���J�3�'�x�,Kڶ��Y�4F���`�X`�ۑ�����&$ߚ'�|��V+8��|���x~�O=�ԧ��%�<��cd6����D�P(�5k�|�|���%�ј�iA��?��u��Il�lK����hDaa!��q6D�Q\�r�H$�f���3f��Bqn5�H�<��C3z��?���U6�L9q�����s֡�S�'i���*b�r55%�es��D�'cWcO"!�4��)Y$���*�	��/1�2���xں/���������+Wj�ɓ�iQPP ���GD���{*u���q̜��f�j<�x}}=!�6�l5x?1��8f�ɴa``�9o�<������j�"I�d2I��JKK���sw~~�	w�Ɵ��b1�B!tvv�,�FI�1����3g�XǾ�6�<Ap��	���� ���q&''122�����nG�Ϸ��6��TWWH���G(Azw��rqq1b�X��DA �HIr	]��>�rա��7>Qm��8�)_ij�w@QQҿoU�_��ԣ�Dc�XIDc�%�*@D<%�*�J��vgo����B�O&�l^�"��6�M��u1N�"���@� ��pD�Y��wd�NJ���H,L��\��3m/���H �4b�2ƮX1�>�8���rzR.I䧹Ԧq ��Z"
�%��3Gmi"�T�����=Y	���f��/..��_B������c�	�_i0IDeH���^knn>�&���ׯ_o�ɋ4�@���PCD[e�[� ���v? ��I�n��EYd�yHz!.�{��6�Ψ#�2�q�K��/�ک��� ���ڜ�@B�=���瓳�}��=M���=0�Lope�;"
ũ0��7t��|��r}���ZU$�
��P�}`�Z'Sˈ�דd�/H�8�t��M����|AUw�d� O=�S��;F>Qm�јu�"u��M�W�&�./&��n�_�NxWEfjt���咚���+�E��g$�@D�ew�/?�@ˆ��h�,�����> �ccc����:a�> "�(�S�a�>�i�Es���m)s�YS��w��k�A6y}@!��,B`�	;�����4��_�?��.^3@��͙3n�<�gt�ccc8x���?c̤ �Oڄ��x<���p��e�>}z����'n¬Y�PTT��+J:�U� x5�v{NO��&��{�f��,�D΁����s��F�r	q�L�S	�p����8n�0���Y_��W����ϟǻ�*G�jǵg��5g�
H�f��̟?<�k�'��
�0::��/NY�J����Pb]����ۂ,{)���T4�%����lll4�
V"B4���0crNԞ�h��΢�~�a�n�-D���_,�w:�E����!�EB���z�I�����'3$pz&�u�Α�0Os��q� �Ł�S�4R�F��X��H5Y/���y���NPP��`[�$^���N"�OM�i��Fq��e0�Bi�Ȩgm���l���^��ٌ�YuEF��y��r��R*�I��9�T3�
�&������l6�m�9Ҷ#ec9�jM����URk�j'�\.�x<�:B�#i����t�����k�[�I���Sav���v����{1퓑��H����^/���pcc#͛7�l6[��bd_c{{;}��G�����s������7�x#�â�D�~�zLNN���&:~�8K~����3g����AD��b�I��h4������GrE8I #�d2A�^�4HV�������D�ڔ��<��<�q���v�HQ���
R�%Ɏ$ٍ�V�M������C,c�h�`~�~����d�F�u� 8��X�~���s����jjj�eee�W�Z��g��D��� ??_)���>"��������w��AV�AD/�E����e�\
����s�f��t|�����������?+�"G���z�f���͛G���d6��HxD�bz��7)A%9_PP@��7�q���8���p��1\�xDt��p�jkkq��!���@"���O��8��ը��c�`�gϞ ������+ ��ʢ�	"�PN�%*EoK�$��&
� ���bCܤE�KmB0D4Mr�����r�F`||^�w�`0|��V���j�"??�D�`0�0����ۈ肨�ѕU�Vm-++�^SS���%��se���J�$��>���Q?l!"��7.�}�}�U΋��A˙��u�t9�Cǧ��
��\�]�D�y�>��B��_]]}��>�yB��������H�������"�$��ߘ��=�uwwSww�b��l6�	�9I��ruWUUQ(:@14C�Ё��*"�n�	���r�1����o6���o).��<���b?c,n�X�'9�ַ���)"Z����������>�`�X'"��իWopX�ޕ+WnY�r�[)O���ի�џ�	�D�L��j��&�S_� �����C��/,>Gz�d2��׮��ˉ�����>�ϣ;��������1����͌�;�fs��ŋ�f��a��GK/�^�z�֭[\�|�Ѧ��s���GD��SO���#��]]];�0PO8WYY9r�СUrZz�A"2�+�/�S[[Ks�Ν$�]D�<)MF,��LJ3M���#���vr�\�ZY�.̚5k������I��L>�LX�v����g�~�;���r�v��Օ�TBD;�6�}���TC���9G2�CʵMV����`z%$"zKC��%+�gٲe�l�2���m�:����������JF.���/VVV���<��o��J@m��b�
�a�Ƚ{?+|6���������Q�5B�d�d������+�2ʅ�M�6�h0�Û6m�">F:�h	�\�

���SO��~.:����Q�i�\���O���~�NLvD^^^R��<�Kk.���r���cԡ�@��c�3��b��%�MD����*�w��~v��AD�Qf��ڒaj���ۭb:���8�ք��$�+�N.�Q*�<
uF�Q�m�ە;��#c���1�\x��c���s������=��2��HD��e�?:�`P�|� dR��D��˫俳	�T�{��!�9&䩌1���P�r��H�\�L�Ґ��<�N���L��̟�cT��3}�i2��1M���1��|=.���UUU4w�\��� ��@~�R����:::h�ܹ$�����Ayy9c��lo����i�("��v�mo:�A"cgϞM��шӧO�h4B�A��_�ޞ1�ׂ ���3	����o����4_���V����%��X'����-D4DD+P?����멿��-��D4TXX�E޾g�o����qL˾d���b����7�D4�S���nY��bڏ��;E��&���yZ^x�…���K&���a�…!�ձX,����h�"jjj"��+QKSS-Z�H�d�X'����G�@����x�"�y�`+c��Dw�u�…����ԩS�X,عsgℨ`0���r�<�&��Re�?��@����x�x�"�� x��ѣGc�R;�16�`kk+AHƈ�`xx8U��M�HoV"�z:�0�t:��t�!�Br�"�����������ߏ���:��)fc��x�ĉ|CCCscc����҆QA`�Z�'NXO�<�^cc��1�"���?C��!1o14�S�~�r� ��Z_��&��T�M�e��"?�	�E���[���>���Pn&�~km�K� �&�Y�[�(SY���v -���DQ��C�1?�Dw�ќ�������@v(�fu�IDATx�ȑ#'�������tH��p�J[{_���˱.�:td�9���gG�^�	�:$�MА�LT�
�&�+49�UWh�UW$	h
[��$�@��tE��(�'3D]��+� ��%V�����_���.���.ц�+t|Z�Z�$�����o���w�]wՕ��.]��W_}��H-����z�������HQx;w���f�9g� ;R`��	%%%�zA����s�5����I��Ȑo�ەM��n����v�&�x�߲3�U�E��4���2VH�Wkr6��I�Z�➞���\gm�󅚚��:���V�/�����Vk�z!U�P�l�됤@I� �!Ii�~����r��M���H��3�i,�TW��9���>e�b\+R�*wLE��4u��K2��u���-���x���&}0���A�={�;n�?��OK<O}0Daa�����Ccc�厎y��n$NA�zzz����:GFF���7�u�n��IUc��нd�g8ƕ+W�X��ͫBm�z��bA8��n?���*�ñH�ֹt��}j�2����[�d	��������,*,,�B�x�?`�L	|��cbbuuu��2���5�<EP����jr��t�ȑ�b���r��q��^w�����Ei�Ł��e�JLsѶ���!��mnn�_�zu�4bW������cgl���q�D[[�q�oxx�y����579����6X���o�ۭ���w5r��KEEE����}�N�}Ị���[�t鵫A:f�U�,�3Wv:��Zc�����VLR"j[�Z��Q����n�XJKK5	P����x�-�$�OvT��o�p�JY�Fuu5@ee%����(�:̞=[�	�/�������n��N��ឞ2��>[
^�i�}���wZ,�C^��_`bb�W��Ν��R��QEEE$��/�ϟ�;1kcggg��e'*�r~���#�߻5�MCe�F��,�R.KF�r�n�u���㏆L:`U�z	�.��p:��Y�h�z"�!���d��5Dt�n�k�S)D���'�����t��@�X�>�@�����uD��+��#
��7��
===�t:��~_?q�:s�o�)l�ܹs������x���X,�:;;�p��N�:��:;;c6�Y��?~�㸿�uG�:A��Y�e��R��;�I�	:��`��+�����fO��P(A�=[R�Ȕ��<���	���#��`6�a2��
%Bf��1�`�X0k�,�����(&����rJ���$��1��zn2�(����f��j߻��Ԝx��4�Cr)H�M&SNiǁ������I���s��544p���K�D$,:Y����?��N�$��y�����k'�t��f�R"`l��."�]�C��/]k�^˷�i!�#����v���_�2�q�ԩ�	�0�^����mnnF4�t��H�p�9��$�Wx����n��h�x�ᣏ>B(���Ň~x��^����E�V���w�l6� �S���(l6\.***P]]]499�
����$�y�heee�������<�#B�ݗ.]r(+,,t`���>��;�tQ��{ߪ���uttPCC�v��Dt��Þ���=�%}�&��W

�X,礽kb����$��~�l��$��T��hܮ���O<�A��X�ED�d�0#:t|�x		qmu��H�4dh�����{�q��ۑڭ��u:�"�|��o�o4����í/^�2��L������Z�v;�f3jkk�:�`0`llo������_�f��������f�%'b�`09��---\YYY��͛����n����7ߌ��1����.���L�<ߝ��A099����#�Ν�1ƒ�YSSc;���u�֡���@����v����񎎎����k�-���o��O~�UT"wQrS��b!��rnhhh%�|�۟x�
D���0�ۉ�=��4��'�W�ȥYY��t���]/�С�Sڑ~�v�x�v�������Vݎ�ۑt�A�S��OU�SM-����B�S�Tu?�LY��~�:����81ە(�IEND�B`�extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/images/hidpi/lock-open.png000060400000002461152453623450033416 0ustar00components/com_acymailing�PNG


IHDR  szz��IDATXÝVMlW����l��?`��5(���E�U�TZ)%U��ks��C��*�*R�@��^{@9JQ��8 ��R%�����7=x�l���f$�֞��f�}��m�MP�s2���� � �W���PZCk	LdD)�R��)�ZCi
PB��(��5p��`�)��\&*C����ţG��OBϞ={���p�[�����*��� "B >:���ӫWL�v\)�e�#�a\ت��X����	̨�„���b�/�]����8+0�`��Ю�=����]�MM���ۇ�mC
�wh#�?_��m��hh"�a�0M�	!%��5L���.ә3��L�XB���(khxd�Iة(�otl�����p������ҥ�����Y)0*�F��7򕥥��W��vݷ��5j�&ڮ�VCei�?�4g���ö�c�~����80f$l;)?�L�;A�N�����n;�E���R�{C¶����ĉ�>����JAH���x�PF��P��t���Lk��e��v&��?��~cX=1p	ᖻ��Q
��U����f�
�u��B:���[d`��zv"��P�&��&��&@)�00b�o�H���e!�����@�Xf`�-)a%x�0Pk�P��Po���c
G�D6�F����cG.�����D"è���r]��m<y�ty}ee~�Ν{����Jnc�<*-)161��ɓ��0B��jzz�H	SJL��?�,)')���[�̘8t�fH!È ������}'Ȑ�p�u!�ͻ�-������8��x����
�/�~o<��pD�dއw<��o�� �řÁ��=��2���|E�����Ç7�J�EHf�s��O_1{�%PJE`���@�|0=�Y�{w[[���L��9|899&{g���U�tD��"*��J���닚y=7 f��$�34�o��?;�� |���IB���F2��C*5��S)$��9�5(d��p�@k(�B�����W���ml,@<��+��W�wW�-��N� �0�#R�g�i�Ai��hz�$u�#lu|z�
2-?E�"���-ػ�Я�����X][[(�?�M�A�ŋ����g���˅%��a�TZn�|9�t�m���5^W��ZZ�7j��}��4����e$���f�v��*=t����̏�.b�M�S�HIEND�B`�extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/images/hidpi/close.png000060400000002367152453623450032641 0ustar00components/com_acymailing�PNG


IHDR  D����PLTEԨ�ը�թ�֪�ת�ث�٫�٬�ڬ�ڭ�ۭ�ܮ�ݯ�ᲲⲲ㳳䳳䴴嵵浵絵綶鷷鸸빹칹�������������������������������������������	/99

RSS199&&+335;;9??<AA=BBBGGLNNPUUQUUVWWQVVTYYV\\?BB@CCAEEBDDEGGGGGGIIGJJHHHHIIJJJJLLKKKKLLLMMMMMMNNNOOOOOOPPPPPQQQRRRRSSSSSTTTTUUUUUVVVXXXXYYYYYY[[ZZZZ[[[[[\\\\^^]]]^^^____``````aabbbbccbddcccddddffgggghhjjjkmmlll��.��tRNS&*2789:;<=GGGGHIJL���������������������������������������������������������������������������������������������Z��IDAT8�Փ�OQ����n?a�_����b���	��&&���M��Җnww���K)<��ܜ;��IΙK�T!?�}p}/
�)��@Y����]IyDD�JXu�+Y���Yͦ��G�R���R�����ө�
r���=z$�2��j��1'q��W��ų�E�x��Z��S�ǩ�S(��N��x����}Tv�e8M����tb.ӠZ�~�������8m�����ラT���$�;���1�!f^?�Lupr6Y�{'�4c4���(��~]�680�HX\&8��̝nf�1�A���x2�Ue�*˷"*ܲ��Q��[�/^��6�V�����7��}�&Vs���w_+C��
�v���l����h@h��g����j&r5�I���i��:�J�whFױ,+e&�8�j�
�:�`�}4��#:�j=���].nCf����)��w~u�7�^�]]�X�;^��2��j)YN�|i+a��,&Kw��E?�8��yd�5V���H�����RS{_�IEND�B`�extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/images/hidpi/index.html000060400000000054152453623450033012 0ustar00components/com_acymailing<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/images/hidpi/lock.png000060400000002423152453623450032455 0ustar00components�PNG


IHDR  D���
PLTEԨ�ը�թ�֩�ת�ث�٫�ڬ�۬�ۭ�ܭ�ݮ�߰�ᱱᲲⱱ䴴洴浵캺�������������������������������������������������������������������  ""##HMMJNN/::9EEV\\[aaADDGJJ(())**!--#..$//&22'33)44+77,88/;;0<<2==7BB9>>9DD<GG=??=@@>AA>II?JJ@BB@HHACCCEECKKDDDDEEDFFEEEEGGGGGGHHGIIGJJHHHHIIHJJHQQJJJJKKJLLKKKKMMKNNLLLLNNMMMMOOMQQNNNNQQOOOOPPPRRPSSPTTQQQQRRRRRRSSRTTSSSSUUTUUTVVUUUUVVVVVWYYXZZX]]Z\\]^^^``_dd````ffacccddceecffddddeedggeffeggfffgggghhgiihiiikkilljmm�n��tRNS#4<Wf}}�����������������������������������������������������������������������������������������������������������������( 
IDAT8�m��n�@���]��i*Q����8 ��y*�\�C�����=D��4u����M���O3��X��wN�gk
AR��~+xw[�Ŵ7z:��V��p�����{����kr���d���w#��8��,j�m7<�?��ZgEԾ��B#�YX?�f*n"��L�i�6n)�2>�=��Cd��uz�%q[���2��ٲN�o��B/����Y0�0]z�z�.*�*��'�$tm�Y^G\�:�z5C�gTe�~~��;X�w�`��_�uld�����	�����fS����y�����b0V��/�}ꯄM�tD��}*��Gߺ�$�}8h y�#]��m��`�I�]�4�*�y��!�TmD�H��MQ� P�l,bi#e���f4nY����DR�����1���(E�(V�"Z �S�4�ma�u#e�f*��rD>�Zⲳ`ZL�{l�Y�n�\-�Y
�}�(`����Fv&U��B IEND�B`�extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/images/hidpi/refresh.png000060400000003462152453623450033167 0ustar00components/com_acymailing�PNG


IHDR  szz��IDATXåWYOUW݌W�\�p#ے��
2��$2(�hml�֤M��t�5i��CS�g��Zg���E���=]ksA�z���˹眽�����G\X�F���B�׭�6lW6n�qm_�^��];�3Ļ���[��G����G�����]�ĥ���x'�i�C(�o�k��v����{��A��r���M��#1+1Q:�L⿿v挸�w�zюK��Rx����7v�ډ
�+W��s���t�IZ{���[v\b_16����͛��={��C����"�ӧ��ե|�b�\�|��_�H��8��}q�ΝS{l�x�bZKi����vtP�d2$buruMkhh�.����r�ҥrV\�..�x�\̔6c�1#�4jmmT:�d/h�� ���� �EC/^,kjj�,X�@.Y�D�̙#]=<z�'];^<jnW�lyİ�;���̈fdC>���{+���
˖)K�h�kkk�y���\�����ߋ�c��!8;���T�H3"���QQ�0RLE�a���UWW˪�*YYY9 �W@��d5q3�'��f�9i�-��_<{���|(��J<
* s������C��
�KJ�Q��S�ă�&q�<����;|X�(/��:XL*�t�L�����[�Mf��G��o]`h�	����+t!�����8ˢ;&n��)� �l!S����Vh���SeXVR^.?�1c�2��Pv5(�]8;G�Z��B���I��?c���yn��4dY}�_V'O���>��a�P\���Y,�h.�'Xsc�vU���m�����<���0�ʴ�'�y�X�a���1Ge?�_΁T^�k�$&6�-��j��j�]�饸�22��A)�q&��-�\Щ��鹾JKKKU���ph0-"��6@O��Ww+*g!��Ab����z�O��U\R"g#����GQQ'XrY�R�{��pwwf\<ٿ_�D0f^����f��P���.�z�PN�f�/�24�
F4�S�?�����1#0)��g����Ae~х��"T<@=�J��Gc�ެ�t_���-@CV
��i��L�_Aa�,���
7��5��D�7`�X�:���;"�Vi����DG˩�%��` �눙3/g��ʼ�|%H�V6�;oh��[/ף� �F,�GF���RO��Jhd}�=a�Y992L&�v+�֨e(W=F������CX�<��U̲���JJ�`J��|�	�d� 

�h_ߋ*�`�]D}�>j��^2�70��ؗ��<'"j��X��=x�G'$���Ζ9B2�����[#ލ�@"�cR}
MJ�qX�/��9�����q?��y��,`���,���::V�''ˌ�LI dbf7/�kx����K��G2(�
uƳ"�ѣ{b1	q}@sBJ�Ğ(��v[ͨU/,�lǠ2 $dK*jB&A�0R���%$D�<=�R��o�����8���/-#C�[,��:�;\Ox-��#V4�"2&�'%-M��@�u6H1-�>c��KHP�\�)���hN�>�'mՑa�v\!���/�Ae���2`�!�7�%#�c����ࣨG�J�홐�@��_O������J�Ϝ���$ �J�2^��LdDTT7��p-��]�:(�TL�
��Ѫ��KpX�)kl��8(�YPXX����*���j4&ք��7�V�'L!�1�,?6�s�|��X���X��Y�V_F�'8�s��j(�}�Ж;¯�;��h��aIEND�B`�com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/images/lock-open.png000060400000000535152453623450032321 0ustar00components�PNG


IHDR��7�$IDAT(�]��.���͡�D���^q�
iI�X�xOӧq�#x�V�Jl"q(��C�Y��|23"F�I�ңG�.	�>iw�p��Θ�A�+�7d�R��$x��8fq�z�CUR�>_������/���+od| L��'!����s��*�B)Ch�'"�!)�t�eO��j�K/]V��`˚g�۴i�sO����Vl�ٚ
6[�
+��A�C�)�u-�AѲG6�i̴Y������sn���#�2����+���+.I{@
�<��Q"�<s����s�/IEND�B`�com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/images/arrow.png000060400000000277152453623450031567 0ustar00components�PNG


IHDR�gr�*PLTE999���999999999999999999999999999999999�}U�
tRNS	*-cf����G�7IDAT�c�4b��
�w����Aw������ vL2`���}���� f�b�JUW��Q�IEND�B`�com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/images/index.html000060400000000054152453623450031715 0ustar00components<html><body bgcolor="#FFFFFF"></body></html>com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/images/lock.png000060400000000733152453623450031362 0ustar00components�PNG


IHDR(-S�PLTE�������������������������������������������������


---'''   """''')))***///777===>>>AAABBBEEEGGGIIILLLMMMNNNPPPQQQRRRTTTVVVWWWXXXYYYZZZ��A tRNSHgg������j���IDAT�1r�0E��h��'�Թ��R�e�#�"~v
��8�J�Vz\�(�h�^�/`m��m��6N���� ���xo܅�;�{��Q����nV���03I���_f��!��忣�d& �y� eZdd� �Y�>�Ȝ�:dnm�Թd�V �4U�Q,IEND�B`�com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/images/close.png000060400000000724152453623450031537 0ustar00components�PNG


IHDR(-S�PLTE���������������������������������������������������������'''   '''SSS===DDDOOOXXXYYY[[[BBBKKKQQQUUU\\\ccceeeUz�0tRNSWX[^_bbeg����������������o���IDAT]�Qr�0@�'�@\��glBgZ��R��� ��@� ��=��̂��=��uџ:Pt��QD�|���e"����|��=Ү2k]�Wۯ4@��u<_{�@�=������orJ�4�n���c���aR�e�w�ΡF;Ði���;��Q�]$�F��D�Zd�'��f�����IEND�B`�com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/images/refresh.png000060400000000646152453623450032073 0ustar00components�PNG


IHDR��7�mIDAT��KU�cf����iT��!IjCB�T!9D���?�HS��N�-�-��r}~D��45�u�B�P(�*u{"jJ��B�P�,�'����

�ʲ���=_�Ɔ��B�.B��޷O��x4�ƪ�Ҳ�n����g8���D:c��y*M���<����wL�I�o���%�i�����8Cߝ������m,�?E��S3:b�o�Jv���0dž�+*�qt(�1ukvE�5�Ş�E_�N��mkv��}�1K��gn��K��f�^n�����+#��6呗�s�2�#�����/�΅�̹��F�>h�e%��
����ٟ�{͞/D��J5
�CKDӲJ���X�$av̡IEND�B`�com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/editor_gecko.css000060400000107116152453623450031632 0ustar00components.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_rtl .cke_button__sourcedialog_icon, .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_ltr .cke_button__sourcedialog_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}
components/com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/dialog.css000060400000036654152453623450030522 0ustar00.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}
com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/dialog_opera.css000060400000036742152453623450031627 0ustar00components.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_footer{display:block;height:38px}.cke_ltr .cke_dialog_footer>*{float:right}.cke_rtl .cke_dialog_footer>*{float:left}
com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/icons_hidpi2.png000060400000076154152453623450031551 0ustar00components�PNG


IHDR �^% K IDATx��y|ř������ƺ/K�$˲uX��K�l��d	d�@v��w�]�ew	!�c�
$��cɆ ��`����eK�.�{���~t�x��K��f��z�˞QW�g�������)@�S�dp��9�����fp�f���Z�����"|�X(��)��K��#���}
�"cc�1�@0hu�\������`hx{���Ox����"�~?h(Q�c�R��0�@[R�N�����8�۷� s�F/
A�y�r�~�###�|`�A��b��f��h4B�ӡ��	��������
�c@E1R8�����l޼�:�k��v���˪��+�f3A��d¢��?���w��$��S�2�p�3� �"���E���(Z�n]���;�r� (��C!L�:��坑��E"c��s	!�@)�[8BD��;L)��P^��c@�0Ơ7�@B�@�&��[��Ɯp�@ ���>���]�8V�E鴼�����ǁ�y��\�|{�,Y"$�;�N�� ��a��|[�s�v��аh�Bp�P0�ۍ��>\	�����f������F���bAqQl6� @�y�B!���><�k�����{�H)�<
B0�� ����F���A�.�H�}FM�X.��y�</e�����ɳgI	�dyk2(ִ���D���K�.�㎽���]���]n����ٳ���8�V���"477Cg0��x���Q�E@nA�?0�����)�Z�r�����rss�C�ԩ
�]G�b|��/C�_�1���QǷ��kӦM�zx��FC�Gmuu��Q׀H)u'5B~� �^�4�Ji
w\�/\
`k�5@H�H(2����T��K�.��ܼ<^/�UJ�Y����јB/YVYYY��j#W���~�iSH���JAd��b���� @r@i5���%%��ͅ(�(���Egg��k��HW@,F�����p��5
L&&9�(.*�� ����w}�K�|<jL��'��̚��@�yL����󡿿������#�����+=��#" 
�ш� ~\9��G��=�,�dyg$��c �e�@���^�sό3<�?���j�����Q`�Y��j1C��� �G	!�N�&5�0|�0��!� ��� o�Q�uC/��(�7�xL�&]{�m���o��7&1��I��P��կ�@��
@����Ο=�]�y�P�d3(
���080�?n�\�*��k��yf����������^@��|>

��񠧯Ϸf��'k�{@{����ޯ|�l6�A���È��ۛ6�u���O�Y��3����G?�q�l�� �z����>�.�%U~Y7!$�:���Ϭ__H���-�u��$�x���;�e���Ν��j#ְ�==G�g��X̫��Ї�w�`9��g|x�,���y>�_���$���).^L!b?�x<����vB�zG��H�N;��z������=�+۬FW<?�������A���C�Kn��Z�� @Ex�^�r�mYۅF%�2i�RQn������$��3h�����v�(��I�R\<�N�"�Q	h*.,���7�`ť��1����E!������n&��"��aZ��8?��G%����������1�L���B~�әLC%yTv�k4�Bȣ�9�g+ �9$+�._n�k��}؇D��n�-^l���xǎ��
H[�I��	� |��<�~?<|~?����_vf+ ݃C���8j��#>�0ѾA�v��؏	!��VDJcX��0ޅ�Ȣp�˺	TTTTTTTTTTT��[,Zx���
@�JE��@���`'$s��H1�>[w�����TQRR�����ш�# ��󡯯����pA�;(Τ�F��6͜��Y�`1�9*�\�
9��N����q��i4�B�3?��
�d'E2�.hlm}hq{;'�<��"3�‡(��8Z�:�:���4��An��ֺ�1	���Y�����r�`2�P]]-6L��ښttt��ٳ����?	/]J�yZs�,��D�d����Ǭٳ��?�`�In�…���+�p��䓜 �MJ�>�\w㍗r�V0Y���~��sB^n�ǐz�'�Vה@��^	`�<9���R%�Հ]�р
�4���F|�{�;��O�O�H����4�8��2���1�V�P
0���?���O!��� ��!/B�B\��H����o����r��p@��H�H9N<w�x��{{x��cH�����@gO��36��
a0�I�98��F�C</\����A��bo�p��y�SP�I�����7o^��3�p&imI�C5
B</vvu����8��!�;O��JI���E}��Y������7�q�A�|��^�w\$�
g�'�z�D�N'j�Z.<����"�z=�F#�f3L&t:�Zm�|c.
�#.744$�|>�O�^6'&`��!�g�Hұ�y��^��;8��������`0�9�N�?�!��"5� �yHI&أ�>����o�[��tB�Ӂ1�P(�ǃ�n��"�ܪ( d�\;�!
<�y��isrr"��z��Ž�v).'��X�eJ �B^#�|�r���M��E;4J+*��i���3�Nx��d�B|���G��V+u�����rN�H{7�RU�U��sCCC7�>{��K==}N��qH�cs��L�Ԑ�����A������bP^}�(<����fVQP���11
�~��`~�� �j��a��b�p`�O��V��G۶�F�~T5088�!h�@��qZ���Y,p�l�|iB8*���e~.�=/�#GH�	E�
x��G�?���g�.h4��f�ziE�F�q��!\�f��^}U(�4��Ǔ�ɽ�����x��׹��N�q����x�"�V+���QXX(����|E,/+��х�����I%�.����~�����$]�q
D	�B�;��dH/$%��b^����UTTTTTTTTTTT��H�`l�e�=�hܐ�I#�p�4/�mZ�-,���`xúu�N�>���mێPh
�x��Sc2m^���RUU��==x��6X���x�2sf��`@(DuUnX�f��dڄ����5�7����2�~X-�M�\�,I0H������z�`��p��W����r8�6�浫V���F�|>x<����O�
P2T�Nol<_����p8`0����v���-{9��/[�b2#N���!x|�]��U@�2V������`aaakNN�z=t:<Rx'X�ֈ9F^Q�k߾}�<D���
0x������EEE��Z�6b�
!GFF�r�v�ٳg6�?�5�J���l9r�H�t/���1fØ
W'����V�$�#gϞ5��hO*@a&�T����i4���d���p� ��BF=&3R95��%��-f�9��TvBj4��cbhx�w�P�5`,�P�J�Z�Y*�hD����W����l����r��R�
��W���ϟ�b2"�ڥK�022��Ν;�v���400�wpp�`<��f�b�����_T>o�I�7�'śj�⪪�tZ-�@�:����<y����;}���������\�wd0�X��gOxf�6��9����`�Za��q���WW���������]��8�\.������ӳ��3�x�…KJJJ����V�͆� ��bd�cLT���)SD�Œpg��el_���i4��/���ɦ�W��1#clc,x�g?��N��0��v��ض�s�Q�z]QYI�LI�Rg��K�l��?/,"��Q�(����zꬨH)`c���Y�ط�
�񏌱�8]��q�$�0c-//�N��:�p8��n���������5KE�)T/8�\�іc[m�&�t������e�@)r���JJ"�M�>��54�jw8bBIQ��u�'���(���)|ބ�D�����������ʧŨ���K�����l6�b�a�ѣ�ٹsb�@���c��ի���B�g9M\
$�
B�r�	{1!��J��d.�SՀ)�f�;�����Zx�n��ވ����.�O�`\<&���^�x1M�r>/���7�[�"{L��m�fd�1���k����D�\�h\���	�����bž>/~�1�mhhy��D�?n2�Q^ZZz��k�
��l��6�Y���b6#��cph�I�^�<s�
КLknwqQQ�
Q(������;
��	�D��RBV�W�o��}���{)��999���d2a�UW��^����F{L�pM
HV��D����d|<&��1�z���������a�ɖӧO7�������C ��`���g+`\=&�򘌚�򘌚q�Z��xLTTTTTTTTTTT�א�D���\Hi�i���h4�0C
���P��ImN'�m%���v��ͥ��\j��)������o��v�:�0�	N����_��_>mn��:鵛�Ï~�ä�������h��h�n��/O�&r�"�N����1���-h����+ ��v���cj("�
Fҧ9?���f˲��K_�R
*� r
�45���~1����E���"��3k�p�4A�|��qj���	�ے���9ܛ ���x5A�SQ��u*�˻�B��S;3�D�&�0|���s=*�g4H��H���i��@`X���ʻ�BySM�F��	o;.�<|>
����	�
`���R�ړ�o�X�"�I�n7��7G�� xL��ZmC��+JKk�,@��n|�_M"0��F��� ȮQQZVvg������Շ7�
6J1G'�O��t���'�"�O���h�n!���<ZU[��|<�ǃ�˗�t��LB��[cK�<��8/7'G
���cdd.\����hD�Á�ɓ#�c�ǃs�ϻ.ttB�������}�Ѻꊊ���������͘�Ѐ�`8aG���A__�p�W�rIv�θ�Zx����S�0Q�
���"y7y�ۉS�Os9G�ɩ��e*��;�>ܶm�K/��:t�w��9����1�L���ROcc����n���>7[Nz/!�2)#N�؋��ı�e����
-�������!Ū��h�Ѥ�4��Mđ�*pL�M��P,<gpG$r|�0�1�(�L�Q�4F���&r}��������������
���RH֏svx@_��|�BuN�����R"^@8����m().Ƥ�<�����v��/x-M�m�j5{֬���"Lr:144���^�ڳ�B�/@
/� �nu:�}�*mVkdKB�Z-B����|3�}����^`�4��__`�� �dY���x�x�����fB�m�j��
��U�F��~������0���W�A�S)~�#�ٰ��d0���!F���^�o��	�?�	"���V�z�gRSJ#3��� DA��k׶!�����iH���,���%�#o�u555!����ۉ���9�H�V8���� 
E����1����!6�Gj`pdd?��1���ܔR��ɯ�����PT�?Jy��Ax=䖕
�4��;���B`�ȅ�π�y�\.@2<����g�?�����B���^�P#�>~��ї�����
�"������+�B,��;w~���B��\.�y�Pؖ�?00NS��?��֙����󡧷�s�\\(���/�"�;����W������k�ߏ��~\�x��B�P$} DiII'��P���3Ƃ[�ne�^{-۰a����U�(��cO��m�&�f����٪U��
�u�����͛_�O���_4>��[��C�z{{}�/\8���G�!�F�}��WOٓ����;x������x��W*4Z�H)���}�//+{��I�/*=!���~�V����=����>��j����J��q�����nH���N��5


9L�v������o;/:}r;!!�����y��w���L��p�n7:;;�76n��V&�k�Ms�\��Ι3����<�;�������%K�Һ�:���=w�1�QF)u���,��MM4''����L�r�(�����肅��ɓ�yd(��ߙ��H�+*�y�_1Ƽ���L��2������)SFΞ;�3�.2�FN%�b�ɡV�mc�#��9�_�A�zz���Cr�7c�$�,�W|�I�xy@�Ɯ�uO�=x�<ݟ.A���I��~i����Fৌ�9�ܐ"���&����������M�J��d���RNB$����Y��V"�n��_��d�����WA�^���nǮ={�d�>�UDD����|�.��7�H��~�)�n �੣G�$""�� 1�H���6�l���ID��9��@q�K����;�xLd⫯r"c�9vlT""�(�= ��;cw�y�c����s��;N��ZDD@��ID�u睏i4����~��ߟ��ȋ'�t�eEx�ߎ�Ǐ���4�yI���h�1�9y�1�sV�#�Ö�ъ�t�����
���NNʙr�+!���?f" �&X�r%r�Fx�n�|>���Q�Ή�����'2�*2��B�%�}�a�_�ܯ����砂�`�ٳ)E\��
�Ƞ�����C�~��́�;ϜI*��@�n�(�Iy2)���D���_��c��`׹s�"���6�0f�K��w���_��{�bGG���QxEDDy�@���/�}7�r�=�RY�&Mz0����ˤW�
6"p4�5�n��044��S�&���/�P�k �r�
���d,����n\���Z��ա����˛�����hD�Sl�H���#�Y�"�U�9�RRHs}����$2j&��fY^���8>�h���g,`�0]�O]@ƏPl��0��g�D�4XSa��/匛@�y��f jt�=�a���ϼV�F�0��I�*�I�{܈�1���pyl�0\`��l�f�ī��������	��@����_��T��/P���@����_��?u��@����L��,RG�OG%�͐B�dͦ��]G
6���tU����7�z+�^Ÿӥ�6{v}]M
>w��3���|&ib�h����7�(*(@���N��(��|^/�f3�_�f5���(�_nX�v��b���N�K��V@qq�������s��[�l#x�̶�����! 9�"7������z��<B� f���bʔg�K������sg�B(D���Q^^��n�V�c���ݽ����]���r�r�=/�H�d�)�9��^{�5F^��K����<�L�M����.�+�
֯][��X^Els=1^^�vm	�w~Gpv���������o�{����'"�}4�֮mњL�E��̺ի�i��H,�P(���!l|�<�d-�����n�}���P$�
�f�`���7h�Ƈ��|s�e�w�������f�S��yJ)A�!�KX�xq��`hp��@��B�� ��ȑ#�b�̙\X� p�ݸ��y��'��XLI�j:����l�>}����i�ۡ�j����…{�^����=r�!�I�|3�!��'��;;;��^o��pؠp� �ߏ����7ntؘ���"�U�{��!ahh�%B$�Ot
�\���/�pfJe���S�9���_�r�����T8�SB�%�?1}ڴ7ʝx�B��v��'N�h�dtt)9��B�K�D���[˒¢��jij��q���Q�8�CNND�k����
 �&��
��)(�X^� IDAT������<<n7zzz����w���:<X�q���PR\���kxx+��dfco+1��/�Z���R��!�9s�s��o�Moh�
�ϟ?2�|keeeY��	����?�pp���Z$�L�'���,���ic������agg�].�g�������ʳZ�;<n7(�c�ܹ��D�w�	`Q�5PB�=�3f8l�H�<�<����z�

�$�l�X������999��ؠ���p��q��������/.0�GȇO��g����y������y�z�m�Y�n}�p ���L�!�؇�����g�yfWSc���93g����1թ�>����.^���_u�,����=����ŋ)�o*�-�6}:]�`]�|yL����5{6]v��RƤ5P��p �_~X)����ZXPP�8iK�f����������st����
���%�IcR����_A֬];H�*!�O��'o���tz}�����8���;���qXx�U�Ӯ\��&������d�g�ͮ�2壦�fZ][�C�X����h�0{�ZZ^�?��S��+
KJ�577��)S����CF��k��9���l�%���`e��5���O�S��i~a!�\YIg46���R������B���Y������Hk�N�y������665�¢"���}��}I��������f�-,,�N�ӟ��sx���a��cuIҾ��jnn��p8�i^^���p8q��n9�Ve:E����N|I�S�R�-cR$/���1vG�£2�a�=%�+��T���$i�2*\EEEEEEEE%
�_��T��/P���@R��.��T��/P���@����_���������hҾh��6��!�^���>3�,[F緶��[w*2�����w���;ًI�����EtF}=�z9��sx�^nF}=iU�Q�\��RܜM�������V���?�B�ږzU[4'�b�JzB�q( ~�kN�߯a�qs��y�v���A�	 �`�T�~榛
���z��<().�<.�z��c�^���+).��[o���?s�MM[�S�^�Q]]��K/�f6G��~�o���x�=�Z ٺc��[�?��#�W��}>|榛p�̙���Nj���log�.dL�T/��$*]cl�������	M`4� �7��Q�9�a\��G���p"9�����dJ��	�N�Mu0�{B���N���B�,\��B�D�F\Ɇi�����m$�d�N���X$I֮'tB�>�I;�
�SFh�?�"6}$�@�҄��G._�f�Z��"�'�����`2�z۶����+
H��Q�����t�ꫣ�3�U�hussۙ�( ]��Պ�{4eF�nX��]�Y׀��LcRh@�K��U �bL{�67c��]��v<���r�K�r��L@�N��b�t8��Jzv"�g�����Yw±�����׀(ƌ�ΩS�g�C��\.?~9��2;�l�V������t��b
R�
��)�'�Ԃ�|���`�E��/�A��TM0��
[�z��Q|����(�iSi)�h5���a������[T�?Sʿ�k�ilre%���_P2u*-��u|���Z2uj$�Ro{�ؑ#�?���n�����n�R��#g}�µ������dO�ڜ�=յ�R
g}T��2mNΞH~�!���f�`	�&��ݳ_�җ�w�"�R���&��A����o���)S2J��ыپ#(~w�*Q�/�Cf����5��eZ��@T��/P�	���_����/P���@����_��T��/H���/PQQQQQQ��B�y���0H��q)�1� �C�6�ٙ+ቨ���/Ǘ���A@�˅_}u�r�KA�Lp���@���p�l��z�%��8�vc�ƍi��ş_��z5&�l�r\�l`�(�ۍ�jP�#���m���QW�U�W���^��0 ������0��=�#~^�x
E>_���5��DC��jbD[®a���\����ODW��(��D�R�w|ݭ��87z�f\��C��������㓧���������_>V�5��,|n7�R��T1��Xu�'k��`6�`��0��1|���ӦMj�Y�r�(J��b����j�7�����TijV!�NB�.��S�nL0�6f�.�H����S�mil�?x��S'N�/�R�V�<�R�4�S���EW]���ÁE��X����p@�-Fͬ�\q=��t��vGf���ӉK�����_��>@i�D�{�|ww7���0<4���n�{�	��%f>A@�†����W_���G<xd��Wo|�;ߩ���(���is{;�:��y�wdX�<���r��H���OD}��<{~�UUUev�r��d�Dиl��%��

��,��W-_^���180�Μ9`{�1nz��> �0FZ�޾L�q�C!,�;Wo��{Q�R	!1�Č�)����+����;�99�~� ���E�
tf����3$�
�h(��~�}��4&�a7)�S�_R���z<���V���E�fC�f�!fjH�8��v�l��_�3s����׭Z�WVY�B\m�6����rx�����Ç�lƬ����߬�+O�gʳ�h�?���� ���Y�PQVv�������ڕ�.l���cM�6*���~4~-JD�H)��7��g̜y��`@����  �$,_�$�رc/����d4���>�(������J@��hl(*/�����H�`�Ez1!�����i���kB���.`�$�s��^���h!���I�#�1k�A���f�?����H͒ꗅ{s6"D�b�yD��~x�n�������`�6-AA���|���
�0���wg	��oQ����A�s�����������2nl�l|�T��`͛2��hӏ�Ť���E�᦮��P(����h��y,�M�DL���)�>�p�>��b��1���Q��o�Ȇm��ذaP���Ho�I^�/�x�C�M�E�q5����q�2ʰ�x"Q�ن�m��:�o��H�nv�?T��6*���'�N*@���ք*��{y�ذ�n�$�K�'"} ���������ye�a-����ic$!�!b�#�*1.�_l��֭[W7��H3��4A}c��(l�S��"��G�F>
M�2c��|^/��̓��(��Ñr��գ䫀1�P��߿fKK��`�<{�R���!�2ę����y�]]N��a��vd�"ս!҆�mm� �v�[�����1���UU��@����)���-��F	;�f, �q@�FCpk:c��^���_���������&��T
KK���Q�@�oCoo�sgWƌy���|���<A�	�
��܊
�u:?��r�׻�n����~�$�Z>㱶�O΍C>**********Y�%�!F���l��w�sO%��OE���\8l���=6�y�)�{N�r�|�p\|�� �����p@���hJc#N�I�sMc#NE}��,X�(b_H�ѠhG��GJ����!���>���2��AQ��mH���GKR���,�O�Rxa�u�LHld& -
Z[�{�D��hpidgO���!c���#!B�m(U��y<i�����&Kn�n����k8n\�@��7�p��WW_����3�Z����		!;!B��2d0��im��l��d��� �����ׇ�i31���iӔ���!D�.�ϜA��X
Mb�X�***Z��^�ۛ6m"���G9D'PL�WT$<tH��L%�2��ϐ-�~åJ'�6�n!��/ęh'r�5�{	!1K��O���&j| rۏx��xQ1�!_P�>�U3a�@24�ɮ/i��@�-/3�@��\�����N��
#��y���c='���8@4�x<�\����=PQ�t�xA�g��?�|�|�������E+W�����C�m����]ƚ�X�o����@]_��/P�|*�.�)�/�ԧ�� ��x~)�P��s��$P��yp�n-��z}A\'TOf��aݺuu��#�ǘ�(��H>�,�&�	×.A�Ѡ��;�G�#�ϼ�8��^)���*��s�8m8���2Q̨����==-��3E�p\Ɓ�N��^���0.�2���w�q ����>�����D]_��/PQQQQQQQQ�?�a��Z�yS��/X0�MF�bR\T���ұ�?z�#
M��^�P��0����"}'��Qx��h�?��DB�]@�ł8C��g�GQ���6"J�1v�-r��$G��HnU�g8�TM?	5'�� Gs+����9v>!c1�7!-HnS����tBfVg�_�D@�mjS	�q��c����LmD��V�Q��Z��p@���W]/��Y����Uf#m���W����'���ZZ �B�|	q�D�p�СȹJ��t� �Zt>�v�^y�_��J�ɤ=u�R^�S�	�<��׭�����>uj IˆE�
¸�/��1��;��l�š�`}[[t��$}n�������Y��y�Fa�Ŀ�R�,ƒ4�Ā�N8^�@ƌ�O&�P��*}�0.�@6(������!���q���+�T>���ƶ �y q�Ѹ?ē�E�N�XP�TYy��B����X3�e8�U׀��@EEEEEEEEy��h��`1���kPX�N����
��Z�.w[rr�++*PZR�I�&�ҥK�xG���[��#.�!�n+f��%��>�A0�w���I�F�ܭ�Xnhij��hh��f�6j�����F����������?�7�H�O/��,`�-��<��w���',��0a&z}k�����:L�2���!�2Z�7�#��1���������k)����w&�X,X�h/Zd���]$�"�Z-

@�}��N}�ޒ��}�ܶ6l��|}v�J)B<�8�ä���.~�@ f��t��1i���D�*�q�}��F0Z�4ƪ�F� @�׍���hG��/&�4�pT"��qv�b�훕��H�	3�`& ��R:�i�������c����#��^��	��
Ҍn�
�������]� @h�2Q*�#��m,�A1DQ�F��N��V���XcV���	<�&4�H�N;2&����<��n7��F㩅�mmm�7�|S8z��l6ט�Vm�P��6\N���y�������O.+˳X,�h4�����z144���9��OZg͚U@�ץ��3���R�}���̡��ݻ�oDz��Lmm�yA�-��jA)�����੻�{��~��2�����i���B�55{{N��
�fϦp��5�e����g˺�?���O?�g���cC�2~��0Ɩ)f$���;��2s&�2sfj�"c�)gNY,�1��1�׌��i������Ÿ���iussD@ʡ�1fP/���/PȖ��&
gT~"����W>ƅ�#�D?�]qi��&�O��7q�����.2��B����-�Y��YEEEEEEE%+T�u��e���>�V\*	����,����N-+).�����q�yx���x�ϑ���W�Wb'�����=/�[6lКL&PA�ĝ�p8�n���������Y�V����n������>޲E���bT唕=��5k���c�$�N�Ŝ�V̝3G{��雎�8q�َ�������mZ]�qN[��H����hs��c�+��yǡ��UUU`��{���	���PTX�ļ�(�	�k��!�F٢N\�MB!B��pD\�`�("7Y��	���|{*b,l��H* >�C�)}�Z@����Ӥ��hAi�U���i���HY��D��^��?�*�b�0�*;�¶�x�@���ES��2����#"����q��F��q�8�ޑ�� �T��HT
�<��
��#�|�SӦM���k��v��m۶�5N���f��h4B�Ӂ�c��ń�\����l�M{

��{��'��&9���s���/��ڳgϑ������ݔ��k�X,��t��]�^���?z��c�]�$0^@�=�hʔ.�:�
�!�|P��<H1�������>�g0jL&��h �^���j?<y�d�j�����Q�$c�U1�t�2ټ�2�m߾}��O?����0�������`�g�=��&M+$G�%�I�k�Ƙ3:MB5���G�,�R�pL6�Ǡx��cck���^M�'�+.�S��x{��������/PQQQQQQQQQQ�����B��u�?�8�K�����M4%�h��:u��|�Fh5�������>����O�q�tx=��٫&P�@ ���~?~|(�����hL�w�[��.[��멧�z�16’�a�:����lm�6l�7HE�}ꩧ^Y�lY�uk�R���N��c����}����{��FQ�̚5k�|)�O?�x�t�.]j5���6n��/��S�~�^���u��>���Dٛ,v�V������V�E�8�{�x�`]�n��^��j���������?��g!��ۖ͝�p��v#
%�/&�$؇�z=l6�GF�k��]����8����LwwO�ٳ�1��gϦM3gR��mPYWG�-_NO�>�'E������{�-_N+��,����3i�l�L4:��ܾN'Bc�=
��y8����N]�4�B�`��n�Tc��?B)Ŵi�ZR�c��6mZ���H�iv;B�`�����p��H���[�O?RYY�m��h4�X,p:��X,�׋��Ax���0�8w��Çł�X�q�ù���Olj�3�:��.����ڷ����X���X��655�cl'�����:g��ODv��4���/��׷ryy�}�7lx���2�@.�.��@ �i�_�k������ߺ�����c�Ҳ�}i�˕������������WTT�Ҳ�}L�ܥ(�1�c���'vWWW�6�L]9994�p8�h4�[n��p��r�-��F�p8h��&�����z�O�xb7�|�(.(�Ed��#S�a���j���x�1v1U�Q�qQ�K��UTTTTTTTTTTTTTTT�p>5�V��Ժ�%��\M����CG���ѣ?��i���А�_�cph�O��AH�/X�z5]�ti��O?��_p�
7Ж�3i�̙�nH�/x��_Y�tiתիS�����g�O�֭[�V�^�/ظqcZ��E��&����7�T��t�Z-֯_��8���������֯_�E��:]�� �������hǶm��9s�rrr"����,�_=Ӟ����a�޽;�/h�?���ŋ=������tFKK�_PQSC�,[6f���Ki��)AeM
����hG�@o0@���� 7/� �����	ڲ�_����+rN�\�rss����	i�6mZ�x������8l���r��Y�����!݌�vQ��w�� �4Ο�Q�����o�o����̘�����d��lF0��߷o%�H<��BƼ�YRZ�Y�Ѵ���m߾m[�<��.Ƙ�S	�����Ϝ=��16����UN��+kjnc��;�Y���Qo0�nO�G�ث�'�i�f�wݰ~�2�����c��}�������|3�u:�9���"��pMm-���i�ԩ�_)	��_��������;-u��G�/_N���zjw8����~�z��n�:�h�"�6oަ�.�Y�7����']�� IDAT?�]]]��b�t9�N�}��R��AM�D�{�16T^Qqt���tݺu�������z�ڵt���ta{�r�|=���	(��h���N9ŤE�����马����l���AaQ��q�w�}��|wx����MY�nГB�	!��t��.�s�N�*r��A���#��J�'�Xa�9k��ϟ4i�#j�幎q��5���~��{�w������ɓ\f�ٮ����=�����E'ϩݏU���W9y2����۷O<w��	�ǃ��6�YP��
�Xf�)�����,�3i�ܹ��>��/(8:k�,�l�rj��
XN8^5�[�ш::`���ܱ#��8���[t����;:�c�85N�J0��O?�����}�����[M3)��>�����2�no7���"�G�=,�1�c
�����c��'b3c�i�WQQQQQQQQQ���Md�[o�x3I^��d)�_�t���V,]�#����ĥ��������%��Ů��7���*��58}r�1�	�5�~����_�{��z9�h�Z�(��?����}򸯼�hhX$�<|>�� �� |>�GECâ��#M [.�]��p~�Á@ 3}��}�8�����m��RG�!D.y׎	v��t����,h�R�� ��‘��~�N��o.��u�ƢMM���"��,�}>�{z<�,�?"V�o?t�Rz�رcǎ��;t��[�L��
��ka�)�%�y&�)�(�����O�n`rM
2�Dt�R�7V�����vgn.`ph���
y<	w�q	<�b�R�A��8:�
�b�R���_qw�qo/.^$��!c�/r]�s���

B� �^y�C(��`H� �r���0�eC������w���1w�a������)�>�g��"{N�����j�J��<.tuy\��W�n����c�8|����8�V���PEEEEEEEEEE%+2�p`��%�@V������ų����ϐ�v����$4A����ZVdk���gH���������_�p��Y���
���c�3(	���?֑0A@�����  [{���
���c�3$���?!wC�ޯ�
UTTTTTTTTTT>m��gy$�Y	�D��L�
�-\x������mۀ�m��p��7�j��;��<z���L�������Fif��c�h���Zaj]:�����ϨT�\^/t
Lx=�#�YI-$�� ���b
��:��_��)�)�ǵ�Q���&
���U3�?Ix�+V���I��_†���X
x�
�����*哰u�b�u����N���b��nlj��>�Z�x���L�1C�[��O�eA���m9�T�x�
��1*YS��IY��K}�؋�WԔ��=2�ǃ��.��ڃi�W���™S���j�?o�FB��%���1awC^�0�A��N�%N\
�B�/\��b��c�G�y?�(x\�<�&��Ի����������ʘ��pdj�ڒ����d�u�V�f�a��c+����w�K-���lٺ5!~QR���h�]}�P�������-:m�@Zn�^���LYI!$��}�,)ik�q\drk<���ͪ|�sg�����w�,)i3,[�IZ�İ_�ϒ�V�П���Ȥ���+NFv�$���0;?0>~����鍍��nO��_���R
>�R�!���h4F��:o����Sd;���Agg����B�r?�#��8}�dJ;���^�%��dYP�$x�%����`p����?;�x��P��TTTTTTTT�(���٫V�\��K���(Ż���c�&�G��_��z�F1*����[oi���b�ш<�����(�ॗ^�y��߽��+Λn����/
����~oU�*����m�,yC�eI�W0�a	۰8��|�|I��8�!�0$$yf2d 	H Llx�f3��x�wٖ�޻�����vuw�&������G�����u�:�=�8�v0:-+ HR��1|�P
���@iI���{T���d�SJ@)]���{� ������;�	@���N����8?'�|;�j�����8I�b�SJ#T�L�D�b��Gi'��KV�N�u�<�H��b9_����Ѱ�$A�$�,C�ePJAAޘ1�
7�,����n��ټ1c8-��V����P�A E9@�[,�M�=�	*��M�=a�X�o����r�:!��v��o߾v����� �;����o���eP����喟Zԛ�ZPx<�ڵ�}��}0�vGD�
����%N����]����-����.��vG�,���6��XC�e�I�����ÎR
Q�v��gϞ���k�0���m��F�g������Pb[�=x���ݻw�944�����g�A{�ڳ�yCCCؽ{��j�k�e��ws��P����`�
%Nu_mm�ʊ��+srr�rDY�)��[�Sf͒�].pI��xp��ѿ|��g���_%2�DŽ���>���R��RZv�����hKk+m��孭1MP��*�ttЖ�VZWWG��q�aJiH-Þ����	��c�
ѕG#������Y'm_�O[!Ɩ
&T�h�᎙3����3^/v�E--Ravvx�ؾiӿX��ऊFGA�O{�O�*e��E�$�(�s�+ǁ0����[�l��=�ω��+���V����e}}_�s,��²��X-�^��,,;�Ჾ��V74<�XeX���ɓ�<�)������޾XVm9�V�h�WPJ��H&��/�nhx������
���<�-_�4N�"U������a�����\�4˲����c��.��Q2|k�i��NجV0��,��xM�ey\e啇N�Ğ?�\�,CE�VW_YUYy��tjs���É'p��e{
*��}ٲ�'N�����+�*+/����RE��X[hQ�(��E>�G���ン_Y��Ơr�W�,�����v=zT��|1��^�b��UN��wQp��I�G�=��ŋ�,*�p��7���v�<yRu��ˎ zϦ}B��~��^sM�/BVƫ]�vյ�\���3���B��A�=����{4˲Xv�2�/B��U!�Yv�2˲#'\�N��D��� X,ᡡ��Ph*!��%@�Ʀ��6�>�/���xA@��?�6��b�����J�2�H�7�W3Kv�=�C���,���9���	�x<��W�z<YaF�RA�tmT�#���͘0a„	&����۱/d��\k�"�kyQ���y	��T��9s��'����ɔb�֭x��S=Z ���O8�~�HmMM���c<O����1mMM�3K/��9��U�@	8�i��E���q��"�O�(�tv�Y�c���a ��þm�XJ)3��[ �����(Np2Y<z�u��45
�\��Pe�����f|>~?�@�G}���LYi�Vn�ʕ+�����믻�@�z.��O��Ԕ����Q�	�q��t˚5�r��	��E�g����#��D�����]�O8ylϞR��*&uw��3gRJ�jJi��Ӄ._�t��3����^8�xŷ�݄���KO��;��^����H�K)�[����L�G�x��Jq��r;=r� �����K�����=�gxH>F�#�~
1/��E<#=�;�5���Gߡ�l&�dB���/��j�DiF4�[�љs�t:���@		{]2,P�B�Z�z;7��֣f����5��Պ7_y%��DC�e�I5��o78�Y���xFR7`��A��d�F<S�	R��`�� I[@���]�сB�V���jE�]a^�� �<^q���q�ɩ,'���'�"��o���ɬY�Ŗ�o �䕴&S�xu�5#$˟���$x���z$˟��{F�>�G0����A��8A!��nK�&�^Hl�$��jE�˅�Q"����ٳ8u�l��`T9k�?�1��3��e��RY]݈-���ꤲ�F}~	���lReU����L)�Ǣ����r�#w$T��#�o��l�9`��3f0��w���rs?����PO����\n�Zy�Ô��-����/'ND�H�ҹ�**�+�^[�]�vVG�`XNJT���
�B�
�@�#�
��[�-D�3�a^&L�0a���1L���L� �/�yv��;�_0���3�����I-�n�R��P(��3�L�935ŔR�Kz�6m�4�;15��?Zٹ@,�H��!b:!���ס
7����!"x��H�r��̹s;����|8}B^�RJ���:7��v�W0�	P����X,X����b;a�k�y��[ ӼBڣ ӼBڝ�f�WH�$��.��v'�4��~d�W0�Lgx�}DI����Hɩx�cn�h�X8�V0ԭ'[+xAH�-D�`Zg'B~?X��Q#!. ���Xcs3�����M���<�`��V�޹3f��w��Ǝts�,I�(���cQ[!Q�SE�o���4�`@a�R��a}*��/��h�y��lM^��	&L�0�Q��/��3;�Z�n;FU���}	��T��s�
���Mo�e�4.���q^�{B{K�9���	��\{K�+��u�F�|����K.)��`ˆ
6�/z�M��a8Y�&&\!`X�,���}��m�PJ��==!B)����x~
R���暒���k��&B����8���y�n�|>��������������ʴ�n�k��&���������T45k��+{��瑣8L%p�=��֭����QD�Yx��?<��|�馛�c���Gw�.��]���^:�����3{{�����|��鄠��(_ R
��s�1/&�P��)�|��ٳS��;00�T�2"!8.5�ß|�dȰ}A���; �V$ھ`!�Iq"}��0J��G���ܑ�t�'ʾ�3
Hv������p�|啴
�U�흇v��N~�:''���˓���A��l�x#+�lyT#iʾx-q]��������e幫h��|��;���˔&�OJ��KLr�:��$I	H:��A'��,��z"2�>�oFn�' �l6��p~�?��^<��p{�y@���u^�hhi�����{Ϟ���܉l�;"%��
���,�[Z��W����[�?&	�g_W�=PeU<~?���C���zeUA�(0�6��� �z�a�<_(�w�m{������^/�M�x?CH/�dv:�V�rsq��#.ĵ/8q�4?�-�ׇ+�vo��<~'N��Ob_�H��Gg"����z���v��"Jkk�҆}~���lBeU����Ji"�Y�`�}���:��<�Ӊ1,38���{��g�Xrs߯��1PU[K-���k�l��|���]˖�̩S�ԳB�6e�6KE�TW��7�`:L�&L�0a„�41"��$|���/�9w�4c���Wv@Q�I�b�b�[o]X��	MM���e�nwض��v3>����I���Ӧ�lް!l_0k�4��0���Ry����RfFO�J���wӳ/hnlz����%%���0��/fJKJ����:��ؘ�}ACÉ	��%��b��[�N��GsB)� I�5+ƾ�n����<�wob��ɽ�tFO��f���8��/��c}���W�x��$����'*��S��"e����)�l_����(�f_���@(�>���}A�GP���IX��������΃*��v'������Fd_��Ԛ,^�D\��Ft�<����N�g�WH�‚F��e�	fN�����.?�y ^A�)�
#z	x�:^aE*��a'L׾@�V�
+��
�3�,î�OI^�A�hm]�
�#@qQ$�X��^��y��x�i�
�׿�:a�D�:�``_P��q<�Z\,��ׇ;](������R��1���oj��*+
�J�����٥��R�"0�8�{w��̮�����1���$���/��XX$�/`]�+kjF�+T��Pv̘��|��G�ڗ��+��W����+�W��&�`„	&L�0a"�x{�5�
�9B,�r�'-�����VVZ5m�0`9,�D�P
I�
��S(/��PH~��
�䤶Ѷ�B
���:���N��	�e��yy-ZtG
@E�=s�%|%D���SJ�B�N�(����?���O?�(�� �2�^/
ǎ]��_��Ϡl�BHB�F-P &�����͛7O�$����6(�?Y�B��0{fw�Y�a�Q�xA�����1c#!�d�,@̩���(=*�� ��N�GZ9���!��҈x�@�.\�`�"M)�@yM�Q]i�׋��G	!��d@������޽&��s��\�TX��Ύ�wQ����ђ.���˵PI.�25��M��:H9p���66��;���p{<��u�@�G�UZ\���e<σ��޺\J�pxI��1w��A	�0��x��Z�w{�X����Le�M��@ICm�D�J)Q�������Q���!Ay�P�~)0ϕ��y�Ž�/(؋��g����q��:�"�n_�[T�
�
�	�q>|^�r:���� n��tB�E��\SUue�I�il\%D�5+kͼ����S�r ��$7Ʃ±c���|)//O�q�$�_���Rj��O<�����`�T�Ԥh�9��9f̞�H�gϖ�kkwQJ�R9(����r�l�v:�4�‹/nhni.��2iBG��������ٳgK���{(��(�RJ�-W�K)=
�K�B��������K[��?�czQQ�����>��
�,BȠ�O�,^G$۝O�
>�t�^�	!p���^[�� $IB(Bk[�qg��WD�������f�(5�0d��E�+B�N�>���yȪ��͛7wB~��@�F.Rݠ��;Q���oM�:�F9r��M7����/�VVV,{ב�����)g���XV_2eJ
��>;z��Y'�>�e�?��s����!��>,X��z�hWUu���]���;F)=B)�C)}�RJ�/_����V�4I�
Vkf�pRJ��}%''�3��=)�굻(��ZWUS���Vn„	&L�0�w���t?�����;:�q��3�a�1
��99
���G%�5MM+���+/��ݚ�9�y�^
����	�@uCÊ��:�ꫮ�*O�k�/tE�KT76J/��>��S�[�]�0c�\ڽpar��ʫ��W�WU1_���t�b�����:X65w@ѕ���[QW]��p㍸}ɒ�U���x�U.͛?�>��#jv=�͛G�͛��΢"i�…�׿��+�ιsi�ܹ1�}&L`ϝ×n�
a����~�N(���<Q�����Qb�¨���f�<UXSs��[VY�=~�L*ˆ����3v�۷�3��5�ׇlokC�̙KY��1�iO-q�%�(C.c���;{������|a�
�P�_Q������u��%��q�PJ��<J�YYk.�3�{la!�=�����.n]��F��'b���}�ݾ:5�0�BH8�:[v��s活\.x~���^`�.˟�X�v�/@^n..�;w����`<8����!pee�����
�έr8E��}�k0���g>ݹ�  ++���i�Ͷ���q�3a�G�2���_�xu�Y,wC�x�1��(��y"�2,��
љ��(�[Ym����W�|�kn�_�$	mm
�ӹ�G~��}uKSS�,���o�q#��'���@��Hk��׬^}����X,����N�eU_OOC�y<��W���%���z�IDAT
�5�,C�v�N�֮^=���=Ȱ,j;:��KU���ł�n���ޚ�M}V9݉H��x��lZ��g`p����9���>�i͚Y�	ˋ��Yvo۲e�k������s��80�!�����`sv���?K��܁=��K��jH)M�L�~S�r@u#��L�n��<C�-Cz&�#6Ű!#�6���*+~ge�|��Bӌ�ru)f�~��(,iuA�OI��$ږ__�&L�0a„	&R�Hy�ClI�'���k����X��B`�Z��ra��+�+�N��8
�P�9�v��U�R.��g�A��,�+�ޝ�1��A1~OyW|ۭ��A���K����MY�h�D9�?&U(�w-]��� /��BVܳ'%!����lB~B)��ŋLe��*�+�ۗT��y�ф�}���<���L���
��h�a!�,�1��s�1�
�xz�t���oK,\H�EEq߰c�r�ߩ@հ�K�݆�s�0a„�
������'Є�EB�����Q���J��55����ʛ���U~B�ք7d�)���:�M�<�j6+��+*��zԗ�/ڼys>�H>��	�&t'�$�H����l��uw_=���P(?���
���c���W2v�*>�e�6%ex�B�n_3o����B�}>y�u�E�7n�b���-,ĥs�t[���@�/OW�ƤP1��tn�t���y���xc��%�4lڲ��W�����‚9s�m�ٛ����D:���A)��
��m�9s��� >ݹ��z�1(����5Q�p8�`�ܪ���
ƻ���!��A�ennX,���O@�EP�(��,��5�@���5�~�2'u$	�@@���}�7޸��,�������W(�e���umm
�$��˯���׎��m8�v�7Ȫ!C���۫V}���gA_OO�ne]_OO��b���\�z���[���bm'��ң��ޚ���,T���kj;:���Y�{p����A��EQL��>�8<��Mk��>i�d9����֬遁�Y������M�z�jj�v'O�����_�(�)�7"�tTn�rq����3�	S�	��@��k<� ��'��-�H<��X�.OW���h�h1�L�0a„	&L�A�v�#���Fu^y��~@�Л��� ˲B�I��a���{D�!s�����Å=)%yч�d:N3����a��c�L�cF���ahh~�?F���,�N'\.��vg$]nn.�������sCCX��	;BwO7l�H��s�06�M����G��
�ЀI���EQG	�X��D&vuQK7m�,J	Qގ.�����$�tj��$ːRP	�J㤚NR��qH��[E�z���j��4��)h��JGT�JaK�8xsI:�zܟc�2$��q8��I�m��!D�	�@��N�_��#2�Ӊ��?S�@���8}�>ں5��hmk|�F�m�I�'���D���P�@J3aessJ3\��;:(p�+̄��@��$C�gB�^�x�1B�gB��U�2dz&���dY�-����bQ
���$����;jF�Y|(2����VUr�Xʂ�(_iF�1�B@(�%>B$z10`�}����^ېe��� !$�G�	&L�0a„	&ҁJ,�
�|���9j�+mߴ(,-]w˗�TU[S3���IU���iӺ:&L�?D@;�z�ٞ�󳫮�•���P(��pM�p�Yu}�ͳ{{A	�h�X���,��9s��++!
BD���<�kj�H��3�������1�
�!����²WY����a��!@?'k���dDk�X����]-MME1!�Ų,8�,˂�2�>�>N
`�޽r���o$D/�͌�����w����&2� �����'�/:F���1lܼ�+�|����M�O�4q�N�æݵVy��>���?J�Y����AsS��^9<8�)Z�h���k��Ǝm3fl6�I�>�)�ZB�˲,�O��e���݃�G_�~&�T|�KCc���~��v��p?���`0���abhhn�>�~�_�+<�C�yLjoGie��Y_Q��RZ�Y]������ݝ[UUU�r�`U=*iT�$IĽ����-[�ݻva``�:<<�$�4dggsYYY���X,�,Ȕ╗_��8����
��m���J�����p8��,
�ȑ#صk��z2�����?�X,m���Lvv6lv;>;|��t۶b��g��R[��'���+V����g����8�<���8�o�mj���+����4yt���g����

`����ʕ�x>^�z!\�������'L� ���H=�fIUJ��x�QJ_��
�R����7TWW��uuIꍥJ�͔�aJ�t�-��7n��>q�T�Аt?@)������ҳ����KK=`�
i	�TE)�D)�����ns:�SސPJ�J)
��j�f{�@-���;x�R��..��X��L)��yッ'O���.���O�:��rJ�Q	�䢔�י���0a„	&L�0a„	:<
E��ׁ�|E+�6FmWR[S�[�����uP<s�U��X�_s
3c���j]��	Y����B��ގ���˞����H�D��
�
������o��U]_�4R�# ���P`���
V��AH��9�fa��7�e?B�����
(^Xf�Ì���g���0����E+T՚[,B!��v�|�ĉ���p�T��-'�������YY���a%�ʤA���8;w�����ߑ���JE��c��z�{ƌ�q��f\����7��[�Zc��9��z�[�/���9�������K. �T�(��D�ڰ���׌�rmS��N�I�������:>!
axx�O��d���t�9�()��|tR{;O��s��$	,���p�U�ѕ���ߏS�N�S�N]�y��^~�:b��N�8�%�<DA� ��|�z�"�t�1c�EEE|Ss3fL��=�裝���a5��:<���v�СCG7l�8T_W7���[!��
�b�Z'N<U[Yi
��z�8s�,�'w�y���{�iA��+hnn�Ǎ��&2�B�ٱ}{;���7BH�0Է���%%V�ۍ�g��ܹs;���hA�yk�Pp'�p2(�O�c"{<;v��>��K�������⟝��%UWW���|��#T��"J��Z��$�̚%���H&L�����S%�(U���
�����svpp��y5Uc�&ByC��>q�T1n�p�m��Q5��� ,q2�yuժ͔���f�J6������oRɯ�p��N)�PJ'��/��x��O��>@u���������*w0�-�������h&L�0a„	&L�0a���L���L������L�&_�L���L���	&L�0a„	&�?����Gd�#2����LD�?"�����Gt��K���Gd„	&L�0a���F/�7X`2�Sp���6��b"�_W�hJG����0LJQ��%	�O��[����p���Μ=�7����:9��	P�,˂�8���Gز~��P[⼞�n����Y9��;G
M/�W�����'��V��ֆ-�7�!R�����@���NL�$)6�����m���J(�$I�����e���!@Iqq�(��D��Ί9zth���u8���K.�VS]�nw8�r�RH����е_��# D�
&��'I�~?���v�?��r�}�+�/��,K€��$��Sr�����e��	����5krL#������φ���\��0�U�g;�Za�{�F4
a���fc������Myy�6 �<k�2���.,��Od�E��]�"�����_|1��vCń�^}J��6�bZk��ӧ���j/!dotB��R�e��9&?/�]�Fe����$	�n|�U�� ��b�ԩ���V}���{��=:�#\�,CV����6��%��BP�b�o��f.�?�d���Ph�ܩS��V�A)���rrr��)�@"u|0�$��!D�e���&L����1�u�:~S]S�C���\�G�;E�5?���O��]��KJ��XN��1cv��h�����G׹��M��+׸��a(�2BJ0�Y]]�	!��^XPP600�S�N����.p�d���N��a�{G0�d]Z�|�H)z>�$I�z���_8��{PJ?y����|g�F�{{���Ɲ��o������a��`х1����8�p��3���X�i�R�`(�Ç�v��	��h>��
3��$B�6]Ekj����jksGx��E��O�{���>�N��$��"���+:�;!�>�����K/�>�Tcs��Ã���ART�@�%�(-`��B�8y����6��.$��Q�.����W�$�f�Ù��3s�� �RjJ��'�����^q��)~�֭�-�uBhC/����M��{u���r-�3{6���Qu��_� \(��R��0�`���8e��hj��(��|���<	�q]�VMhi�y� ��*4r����ZDږ��<�|aT��	�ND���u���QW࢒�c#�d�ʊ
'��ϗ��7}�(IC�&��#�_�e'��f�z�JK�<���on��Q�%�28�C�q�O92W�ݕ��oki��e� xc ��P(�fQW1��Z4��|A�� ꪖ;fLx�j�jʒ���������S(s�,˰�l�
��qܡ�G���3gΜ��� �8���C~n.�ƌ�}A����  ��������CAAA�e�|8}�4��Aݍ����ƖN�����j��]��!�nX�M
•����[	!WE��o~�ӟ�����-�|��juƭ-
H��g9n��?�cٲ.�B�����/$�H(-U�uT���<j��f�EM�0a„	&L��p����F��$U?$1��孹���zA)B��ԯ~u
45^��+������EH���,����e�4R�U�A}O"ϣw���_h���M[$
�R�NIQSY���-�M�.IW���J��ں4��"e���p,cY�  �������EQ�$��:iR����+/�S��O�*
B�����|���sCC�~?xAPNc;�)w�tXVV\I�yȔ�ҭ���>DA�,���ݽ)��JG��i�n�:%�u7�4D������ �q�@��15748%�Qp��N���,ǽGQtΒ�ƶ�ŰZ�vƔ�)*ZF)�(��X,^BH��!N�t1��$A���\���d�:\z�O�ڢ�tmVkvoo�
�aJ�t*�J�I6�
\v�2��})Q���!�
��=m��h�X!+++�'�$tN�2��H�
']rɵ�:�j궐JF����j�"++K�{JQQV(��ۣ`i]u�UV�|hhK�,AŸq/�a��eY�dg���7�J���	À�e�45->p���M��
P�а���ZN���_�t)��K�t:?�,˂!���Ev�Q''��Կ����JT���c�YgB�D�˷�-z��p?�Z,`���WAbX�NB~?�~?�
c�e[
xc!����K�N�v��~�A�At����3ʓ�T�-.�������
!$�CS[Z~�Ph�U���p�ر.����)��?�/e�Ξ=����Ym�U56Sp�����U��ͦ��Z���;��ܷ/IV(�_��U����>k����k�{�~[>z����_�����p$<E����Q���I,F4����IXQ!�EjY��R<&L�0a„	&L�}�h_<j?Iq�8�7ߌ������L�E��+��]��1�x�n�����(P�$��v�\���c����[�D)�!�w#/���I�>v_������_tz.�eyyd?wV�L,�?��jo`0�����Qp���(��;U틆ԓ�z����7
ڻ�P��+�e�𢈣����N��7F�` ����`J���1�Ξ��Q R�s�`�5s|�FAUk+��j�dtC���9�C�~�X�P(�@0YL��^B�T�'�7i�I��5e�@�"V9s�0a„	&L�0a�D*�*��aF�����3<'��p\ʯ���8r�0<#x[�(�ۀHK�����;���v��c�z�����l�ẅ���=���G�
b���F$����ò����3! P}��]�#��������F�1�k{DY�{���p9�X13�蛉n+.r����|BΎ�JiATyC�����"���S�`|I	lK�}�R�� ���ɘ
��t*�EQ�W�´���
<-�>�ٳʨH���i	@)����$@ҵ Yؑ��`��|�ւ�v�;V��J��%� ���iܱ#"M��>��°f~����)��R�"_���$�5G!�Z���B
���$�i��P�>΄	&L�0a„	�d��xD�r��/H�HY�t���R ]��Ty�x��i��Sr���/0%��/����j#� �#�/Py�h$�	�
�	����Rf�p�Δ�%ӣ �N�Q�����3رeKJy2n_��"�	:]RFc_�O�ႍ�T׆��Q���L�h<�~]��dԾ@@����}�	&L�0a„	&L\d�ƾ=#�ˆO�e�W���F,���
)�#J����oljZ��q��fg`� "fm�O"eD|^o�� ^�tlR�G���#���U>� eD�L�7�\��h\!噰}�tT��GH�Q<C���錂h\(!�.�����.T8�P�#}
i�#
���{�Jo��G�Q����(0a„	&L�0�~t��2�7IEND�B`�com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/editor_ie8.css000060400000111223152453623450031221 0ustar00components.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_rtl .cke_button__sourcedialog_icon, .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_ltr .cke_button__sourcedialog_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}
com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/dialog_ie8.css000060400000040747152453623450031206 0ustar00components.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{display:block}
com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/editor_ie7.css000060400000114714152453623450031230 0ustar00components.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon{display:inline-block;vertical-align:top}.cke_toolbox{display:inline-block;padding-bottom:5px;height:100%}.cke_rtl .cke_toolbox{padding-bottom:0}.cke_toolbar{margin-bottom:5px}.cke_rtl .cke_toolbar{margin-bottom:0}.cke_toolgroup{height:26px}.cke_toolgroup,.cke_combo{position:relative}a.cke_button{float:none;vertical-align:top}.cke_toolbar_separator{display:inline-block;float:none;vertical-align:top;background-color:#c0c0c0}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_rtl .cke_button_arrow{padding-top:8px;margin-right:2px}.cke_rtl .cke_combo_inlinelabel{display:table-cell;vertical-align:middle}.cke_menubutton{display:block;height:24px}.cke_menubutton_inner{display:block;position:relative}.cke_menubutton_icon{height:16px;width:16px}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:inline-block}.cke_menubutton_label{width:auto;vertical-align:top;line-height:24px;height:24px;margin:0 10px 0 0}.cke_menuarrow{width:5px;height:6px;padding:0;position:absolute;right:8px;top:10px;background-position:0 0}.cke_rtl .cke_menubutton_icon{position:absolute;right:0;top:0}.cke_rtl .cke_menubutton_label{float:right;clear:both;margin:0 24px 0 10px}.cke_hc .cke_rtl .cke_menubutton_label{margin-right:0}.cke_rtl .cke_menuarrow{left:8px;right:auto;background-position:0 -24px}.cke_hc .cke_menuarrow{top:5px;padding:0 5px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{position:relative}.cke_wysiwyg_div{padding-top:0!important;padding-bottom:0!important}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_rtl .cke_button__sourcedialog_icon, .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_ltr .cke_button__sourcedialog_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__sourcedialog_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__sourcedialog_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__sourcedialog_icon,.cke_ltr.cke_hidpi .cke_button__sourcedialog_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}
com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/icons_hidpi.png000060400000102050152453623450031450 0ustar00components�PNG


IHDR 	�N: IDATx��}wxՙ�{f�+�Z�eY�eY��e[n�60`l�Z�1֐l
�ݔ%�$aSX�	����BXZ�PӋm6�`��eK�z��N;�?f�ꖹU�K�}�y�{�)�6s��|���A2Hc`O��7\i6�]�_q�$��B�<�Х^'��{��C�a�կ|�$Ȕ�(J)B����4�|��χ��Q�ٻ�6)��]'F@�!�<dY��RH�Y�V���Rp�L&�X�̵��������ˡ�b��	x� @V+
�C �&�	�yyy�Z�0�LhinFMMM����_�„H��\��m�.(q�駟>���U����v��(�n�a�5׼��K_F����}��)��e#���Z�v�6l�����x<E�$A�y̝3������eY�L)D��BB`P	�
���J�I���<�>8'D@�"@)��f!d!"!���/���z��Z��	�B����_^y%i��u�a�t8���j����0A��� �g���b��3�TmB�N3�o�?��Z,�+W��0��ax�^���p���5>Ν!�%)���l�6����eY8L+/G^^$Q�(�yv�����/�4!�'w�ȗ%	T]	!������#�S�pX���R�QD
V+�P� (�p\��2?�R�$���$+�͠��s/��q �"���B�7o�SSS�={��n��;p��q~ll�A��8������&�eY���/���,j�����A~ӦMKu��k׮}ytt���BPJ�0g¢x����7r|�̧��W��$�uQ׿�5�֭[��AY
�kkKt���$QOB�eA��ѯx�a�RI��%m�*c��g��Ĭ�2�0Y,I������D^>����ɬ0>B`�ZS�%g��Ԕ��1###xb�V^/}f�$���|���`�Q,�$������܅��e�$����k�s�͑�Y�h��ju������eY�l6�ݘV^I� �"�� z��p���!�ws&@eY�?Z7X�p!�!$�5MP��@ ���\y��o��?�'�˙���W���P��h��"��������wߴe�J_IVvF>��cu� $���d�X,���}�w�p:
��B~�3J��g���}�$��!U���@����a(�>p?!doe0`��0` g|�H���
�hg[Q����ڥ혵��s�%	!��x`7�wT2�Ān٢E� �� 	��� I�x|0�` ��A�e۶�T�e��.�[����NX-8��f�|8`dd>�����uk�����	��5����o��n��AA �����_�n�<*�-���%-,��)�f��?�i�*��(�����K�������`����.��P��W�~Ӧ./<H���8�K�,Yj⸈4�to��2Kk��͚�.�����7?)+��A@ ���.EB>�
�M[%�bD~���՛o�!�$Վ�!��&7��v�$I�UUo_�!���[¢�i��P�>�����L��#tp&DQ�,����}���D�QTt���� ���-�tB�	�&��0{�rY���$ahx�Ρ��4O++si�p8�i��'�C��J`%C�x����F	!>���U��("
���r2��s"�0{vU.PE��k>�JWB}�3�l#��Œ��gY���r���l	dr�d�kָ��k:$B�].f�U�@8�ww�ܓ-��-�,*:K���������02<�ܝ-�t/�����fsD��!Zw �"�^�H)�)!��lI����Ov�󳨜RJ��0`��d'+v88�����@
�r(������6qݻHq�>[׃anmjn����������j/�B�������:O�!�tO�eC�,�����I�m��=B��,X��02ò�|��尓.2�.ojk�}UG#
"'�K�e0��`2�`2��e��=�����'D���.4��AF����f����Vn�7�����ى�Ǐ����9x� �E
�,<-�%�W/��̈�T,b�E�n�-F$�b�
�_�|�I�﹇��I�n�7\z�P��	���|P,.,|�(��uM���5�P��Q���!]�L,I����b����~��o�gY�L�Ve�3�)��)%$�����be#I��X,x�7��
��>�BOy����IUG�.��V_z��~����`YV9G�0�'�]]8��7(�BY|^�=�]gL�z{��۸�^^V��F��`,�ʼ ȃCC�� N����}���
tNRgM�R�ƶmۖ�{lM�-��42��eY� wuw��8y����;Ojm�G�ygE}f5X5�Xt�jkh��0Q��� I�Z���$�M�Q��R�d2��1�b*�0�ͰZ�����l0�L�8.��1�yy��aFFF�@ A��qqbJi1G��$륗^by��ܹ���χ���b��T8f�n7���
ő��!�0��$����}��̟��'��v�d2�R
������G��	!W���X���P�ҥK����H+��ށyϮ]��$����J�B�0!�iB���{��0wn�AShTVW']�0�+c��(����B��=�)CK3
�>}:�.�	H�4�5s&S]RŒ��\|��z{�R��P^�h/(*j,))�H���0���PU]=�Z_$OG����V���n�@�T�
� �"�N'�].8�2�1���1pf3v���ӄ��rj���a8a�f���8��s8����S��H�>���y�^�>��<'t����w�)��ǘݻv�eY��v��fŢ�e�ab��f_�p!���SbiQ�!w'+?�g��������g�a������������p:��>}:���䊊
l��&yzU���� ��KWO*�SJ��PJ����'��g�-E��rvd5�P6$ߘh�ϝ�U�h��0`���)$�r0��i��n���<8�'n��e��Жme�{C�嵍6t����ѣx������:�Y�m�ꎎ֙3g�to/�}����φ@���i]���j���Q;s&.^�n9g�mŸ$psv��K.�����
�`N��3f4 K$$�\�����# //�sN������ۚ��m�y�ڬV�|>`���/fK@OP�7���dYII[~~>,�f3�^/^~��=�0k�:��f�F�V###���ݵ��2k��𥆆�}eeem0��0�L�)��t:#�բf�{キ�턐L���SV766�+//o����q��&����ٵ{��E��l���-!x���͒$�!bI�c�b�L�r]q$����㤚S$���?~��r�<)���RSRRRϲl�o2@q���ϟO�"��&R�Y�e�ꎎV���sIUB�,QL���b��o�)�:P���@=n�nW*�Z��%��Q5!myyy����z��ΝoJ��:d�P�n�X���f�D��������}��w���<88�gxx�p�  ��ĒE�:|'���HI��D�Zf�̙W�8�P(2σ�໇n��lb�=�z���{$Ij+,,TtG��y
�����\qy9Xձ"�0p8��s�p���\Ow�.�����;�cx<Ȳ���ѣ��E3�x�ԩS�+**������<�*�#'J����5�f�N�#������Ϙ��e��o��U�T�Rj��n�������WL&өY�g�%R�VT���^W��He�f%W�SJߎ��*��O���ƶ�$�c���ArWW�$0�R�$��8��z�Ǒ�wJi�*���~�I���KӧO��n����/���KN�Kʛ6�-݄�f�P6k�dE�<q"�jK��Yۥ�S*������[%	�-���wSF@�=�##m���WR��{�SU�8��"ت���1��~6`��0`��BN�Ƀł��<D�0��G^�|�ѹ�~{j	�P���k��.����A;�4u-��(Ƙ[L�Ƅ"�]6�
�8.RL�V�0�H�������ٳ��z�#B���nx!���Iј,?��U��d�C-]bX,?޸aC��1����zk~����>��jLDI��Wd�8e��aV��-]�ac:��������z~�f�czee����E��ݚ��m�ڵ���P�`�##p=�u�س��l�C^���r����L�J��0���C�jL��Y�!k�Y��|𥆆�=�$�@�$�l6�:�60�L1��h�It%�MA�Z�И�ИL��$'1�ߏ���|�w<�iL^=z�h����A�B!X-��&[��1A��$gL��$gL��$g��11`��0`���7�� S��w$��a�#y,��q�1$��!�

�|�[�s�%(�V��I��%�J�����咠�&�EZi��M�P�vâ
$��O~��ϝ��/�P�v�0�ϟ�$i���|&�,�e�W�T�z�Gk2�L���&!��Lj	�&A���7]�c��rL���PD�
F�I��@$ز*�d��$	�,��- �i�L���D�MwG��g�A�̺@+0�.�ҫ�OR��4]��%�fҤ��.�W��.����@�AE0��>ڙY ��3�����:'�g�(qN��Ҏ����`(4*�] ��[�T��l�v\���&}�%@e�?��&u%K�r8�"�I�^/n��7rw�C�A�	Uc݂���_]YYGT�(���k_�rR�i	p,� ��Y�QYUu]�����@��P����V�gan^|�%��А�y�e���Ynu:�����8��9s��3�,>�g�Y�@Ұ㙸�����֥v�uiaA���l���N�:���Պ��|�̘y�|>�8y�s��s�23Y�����[;vl����YSS�r�`�$8�v�klD�3M������/n���$�w�-��£ή�3��奚kH��! ��T÷CG�e
����H�/S�^P��[o�y��G=~�!s��	���+��l���J_SS����a���?�H�z3!�2�#nJ����a7������l�f��Ⱬ�1G����s���h�:��<�r����E��8�'"Q��i�(Ř���T��s@�j*�0`��0��f��L(ҏv�@��Z�`�zG�p�BJ�h�<ԾdIcŴi(*.���(�����Ν�r(t#���T��{`�…����(r�122�޾>�ڽ�x�Z(����n�{����<�3Ò��"�y�y��ĉ�>LRyi^Q��^tQ�+/� (�5��ߏ'�yfx��߶1[��oܰ��j�""GD.�`�R���3�M����s7��,����a1�q������!B`z}����P�IjI�"'���0dQ��׷#������< ����>��Zݑ�q}]]/���=������Ѐİ�u���<�G���e2����pAl�������^Ab�ǹ%I���Яnߣ1�N�<I?ze��0�>
��Fc�ཝ;�<�,3Ze����(���;��B�v�X�������>u�.�$��}}�?B0b�� x���F�����RZ_d{�~�k���b�� ��x���ݐ&K���4��>�j�ҥ�����c<��<���,���_�� Q�*�=?�ٖ�|�����ӧ���1��H�P8�ʊ�.��P�����_}�uz���Ӎ7J�^z�t�y�I.���&�i�oS�q6}�'�y�'mܸQڰa��t�2�m۞��'�/���{��U�9������<u�C�Tb8B�O4�����:DTMZ0Do_��g�=��Oe_p��'��f9N�$	>����ӫ�~������W^{��3� FGG�e˖���TK���0�p8��'O�RJ߁�:�/��8������2�^/���{���oG�O.'$��|8���a��ۡ,��RM@��f�<�0�z���꒟}�93��$��s�k�;OZ�x�T\\�_�Q�l�/mlnV�y�T__/��QJwd���p��j�j���Y*((��Rz�*!g�3��n��h��Ҍ3���q�H6��=��I�^]=r�w<@)�SJ�2�~�����A��5k���4�4a���M΂ə���R�C�o������l�.��5����L2^	�I_��;'A]P��~�o��۷_]���.C���*�������z�(53���P<���&�0`����OD��Jf�
&�Iy�J�~��d�Z����k���fC��C0�%A��lF�˅]�w��{�a�$"�>���>�6�C���D7���GM�D�� ��B@���|��]��0!1�sb2���.����m�|�L)䧞bdJo;���9���d`uc &��3J)n���'I�n�<|8ki��&!q�u��Ų,���?�t��@V"O*����p�6m��QYY�����[ ����K��U�cM��+	(�'�JJ@�T�_�)O�B��g�w��	���`�ڵ(�Z�z k�ǣΝ5�+?:�ѬȘ���̐χo���������(��u�xJ���Q
����k�q�<���r[ױcII�/D�WdT�ȓ�Jy���%S���?Ce���'tId5
	��3mj�x�
w���~F��ӝ�	$�"�""	d�f Sh��o�7mقY55����t1+�ͬ
6B0���-���###�3gN�J�B�y�Va�s �Pi$B����%#��ӃS���5{6���QSW���� �r-M��L�]Uc�;�u�6.�}P%�P�*%%�4�[֬+rDd�LF ��Y΂L�g�0�'e���u�����Npj�?��eX�����dҝ�w�(0��@��
��1AH�>�V�Zi��Fqp�U�Ty�c� �ɜM�前B��8��)��׀0` �C_`�}��/0������C_`�}��.���	�C_`�0`��d�j�!��t��
�k���u�J�����:�>�iv:߿쪫$�$��.��E������/�O,��3��}��_>���-˗����0Y�O�~��v\�n�~�E�?�x��
��@&�)�qFZӦM��~�~L+/��e�@&a/_���i��)����i	����~?xAcak+�gͺ���ڪfμ�…��a�`0��ӧ'�-���?������ë�U���5k̮��'����Gy����kTG*�
V���{���Ϫ����x"�$Q�%�ח������L,��/Y��BR#?h�=^��}8������B�Pĵ�0�x��V�f{0*�.�`)�q_4<�cxdϽ�B1�{�&@�x��6����xy֮Ys1g����ƪ�κ�]XAK#�3/��2����?�L]FWx�U�V��1��&��q���8p����ܶ`�E^�����|��VBBMg�=?����VUV�].8������
Z�~�':;}8�!�ܣWnƫ!�E�}�����k��G*��i���� ���Cy�9��U��ďX��}~(���xDQ����n���?��#�f��ܘ��\&_�1�oZE���S��%A84o��
���x�BF�.�}�jcTt�)Ց�|B�c�x��L[��e������h~�B�4�Kà��2ô

�Hd=[5���Vwt8A���Eoo�<{�T�h IDAT��fΜٵo߾J�a�Ʉ�i��	�����3Y����*�.���Y�.IFGFp�ر���k����Ep���˖-s���T��0[,x��7������@��$�p�
�>��qj����T�`������r����m�������N�s���$X�d�����mb6{�
`e�-PA,��-�����E��u��_���n���:B�s@)m�0k{{�������
&��P��������[�jU��jB�ͯ��}��;;;{A�UW_���
.�*B�.-��^B�kttT���~��jnjzutx�w�(���@m��/hjk�V�^-u�q�4
�}}�[ZZ�3V��|C'o��y��˗Kg�Y�w�޽o/\�H:�s$(N��@Ca~>�p?��9(�����ҪP(��(!eZ�򖔔@�e��_أ󶴴T��~��hO�����}����B�n��aBȗ	!/B�jӦ[Lfsi0��2>�e�7�����a�8㌓�y׮[w��fs�b9���)��jf�����"�Ξ-@X���j=�h�b�r����_��=���⽖��f֬0�\�v��ѽh�biZU՘G��HE�I)=n��O7Λ'�ih�J�ʤ55��&���R��m��E)��N�RJ�q��1���$͞3G*.)�jjk���f���\���w�F)�RRjA�SJ��������+++��nw���`�;ᄏ�R���'�
�����������2���؟�����Ç�Qmդ#PN)��C��*
��"oU<y��(��SVUP��QD��ݥ�hy�I�gT�0`���(�C_`�}��/0�
SC_0C_`�}��/0������0`���r1�}ԑ�����E���'|nJ	,?�,iY[�8�S�R�س�_~9�w��I9���S��(i~C���s��~f~C�*�ѨrN�e�g�k�rp�{K��K)!x��7M�yvk�tF{;X��e9ђ�0	��ص���e)�̒��P��w��(.#��k�;?w�e��

�/���*�Mc|�c�@~�>����6M+���^�F?w�e��L��s朞_[[��c�!�n�����O�Dw��
�$�;��(b�g���_D��Ro ��]v><v����i��U,��KW��T	��x�,���R�m�tAGG��rBXm6��3��r(��Ÿם�k4���Lj�$P
�͖p�	�������=!�7$�YzB���X����D�z\��J����	z�H�S��:��KbL$�]O�4�Ó(�Szh���<6�P���i�B��+֬i�;��|$}�����P
�ł�����/�	`�.�4w�ږ�v�d¶���EΌ3�;O�mii?����%��߈��ĘכK��1��
:��!��O
ĸ�Y�Y�c����E.LI��	��!��j�S͛W2�!��)���lw�ԉ�/?�.H�{:���zNt��Ͼd9fMwϙ�b��$�A1��`�������� Z�@\��	�t7���xN�3S� N��Ғ��`�E���/��A�h�.X�ގW_x��z�
��]1�IRL�*+Q���eZ�BYx��T�nI����R���9s��55c�$�AŜ9RE]]��*�ꤊ9s"��F�8�e˖��]��’ j�%	&D��Y_&�R���Rڙ�-�+(�];{6���Y_��gS��`w��x��aJi�X���*{v��W��E�>
Nq��nbo�(bzU���h�5+�|z=��A��1+D�Џ�3���)Ǽ0`����A�C_`�`�}��/������C_`�}��/0��� }A����0`�ozo�W�@rq����P��<�����uu������L�0��	�����ٳ]ǎ���z�Yq��57CEȒ��'(� �����8�z�=�|��+���[��z��s� KRR9U�nh>'�a�,�a��DQ+�h�?;w��K�a���P0���������%I
��ba


�GJ�$������#�r��2�(���'x�ǩ��ѝ;v���]�x��ڙ3��6[RM��(..vQ��Bg&)�Z�$!���B�%hhn˗��|��Ga2�Rdռ1h5��j`�4Y��ѱ1l{�K!|��ꗿu���K(C% D).b"�j��Q�,����x�Z����U<PYY�7*}�S����\�$ҹDQ����wo�-�3G<���c�x<���M�{3z"��I��`��s_�Sf�](�;�GFwaa�6-�ʊ�#6济sͳ���âE�>���k��4���g��델��)K�B�ƆV�E3��BE����/��b��6W^Rr[8��[���>J�����tԕ�W�����@��e��AH��.��BO0x����څ--�\U�3kk����1yD��њ��y�����������Xv�
�����˵��=��kdt4�@+��r�[����,#��<�j��BH����������}}}�(/���6����L��<�}�p8f6@�b�nG�U�U|>֭_"��A)��~q��o2бr�x�W��߿��w��?���LQ�I)�1��H��eˤ��"hG3(�������?:p��ńY�m5}
. �썪�Yuu�u�f�l���Ë":�����v�bZ 2�eT�$�}>�\�xF�����z�G����s����6ov���ܹ7�
wh��D�zB4.^����P
Ap���<����Y��'��I7����p`�Zaw80�߿��jXC��cQkkseE�f3!�E'����{�Ķ�6�M�pC�Çf�:U9�.�ug�y&��h@y!aX���/�!zP#��@0ȄB���i��OCm��<�}����o����q���!�MP=�ͭ�� �+~�;����4)n%L���׿n%�D��T^R�J�_�0�����H�r��K/�EIM�E� ��Y��*��,f��tڴQ(�x���]�uQ�CK�ep�iӧ�z�ԩ5������F^k~�qZ�Y�x�k�X8�oR�bf������ܚ�j��V��ya�{jʒ��s�VWWVVS(k�,˰Z,����q܉�.��׾6888�@ A�q����.,��������^ߟڸD%�.(���EEE�8<���c``�ַ"z��4���6���B��n�f�9��<��
koS���pnϞaB�E�6xட�|��?��S�Z��l�-1KH�`9����M[�,p	!��		)�e(��KɖR��R���;��z�2s�10`��0��������u��[
_���kW�R0���{��/C��׬\����!
6Lyy[�-(W[j�O���EA���X�bŹP�nL){ے%�DAP*�R�Θ� ���� pe�y.)�bm�JQ?o�Ϊ��OheM�^T��eYjX������ϋ�I�h��r_WׅSE`Q�ҥ�DA@8���n��V�����@ ^`�X����l	l�(+�$�+G��|�M�>�� @E���8F~Ɇ��mɒ+i���+�%�<}��͞P(�k:�UU@��1�����%M�
��n���ۓ,��"�(2gIœ��7�lN;3&�WZ��R
QJa2�|��zB����u1�hXD���-�oHWn��e��E��U��ٹr���	���nW�9�RȒ�����"�|O�*8� dKQa!����}ii)JKJPZZ
���'�$�/\x6�xhϤ�,^�QV�\M�V��	�f3�r�����P�w&B��3Ͳz磣����P5}:ËbD�Ų,�N�[n-/+s�'˨mh�|��C8�{�8-����[�*��x��믿�lA��a Xɲ,B0oΜ�c|1�NND2�����9sjD���V�Z5���(��w�#z}��81�L`���U����LA0@ ����߲e���@�׭]{�`���
��2o�juzyRuAUIYم�{z��7FX�G56�WJ��V�����{��f�q��Ս��1�Eg�Y}���2�(2�ԫ�3'Dٞ����y硗�ne,�rv�l��n:�{8��PJ�J)���5ü���k�{B�ky�S%���6[�S4�_;�|(�$����h+��$B@E�	���ŀ0`@�@�VX_$�R	�aA�
�)����I�E�D�_9Y�+�׀ǃ7�zj�J�[����:S���.�;/Oז<Wh6��^/v=�\��_�썁�\���<e�8Y;J!�2��^�c�q�e9���,5θ�T��0�L��ƃ����xC�
���0�N6xQ���H���:R��:�2"Q�1
~?C���e��ӽOP$f@�����F�I��Zy��	1u&����
�
af�I}+�%	�GF�N�ހ0`���>;R�uW^�|���`0�f4b��3��o��(3��0��?�	1>B��xq��)ۜ�v�,�y�%	��V�R�C���dP\�j0B�#��R����&�q1�]@`b����͙s_kS`�}�9t~?�`8N�c�,I��q:o^y����G~~>V�\	�t&=��)�C�b��D��v��F�q��ۍ!�A|=��h��|��'{zz0:2�ё�����o>9�ځ�N04��oל}�9��۷�}��}�9���o�L�@|=�ttH-RT��:f��3�g)���_O�1ů0|Y��˨�R��UR��̙3��ߵ���c|=�h�䨎�~��cr8>o͚*�ٌ��>u�����r\���1��[$ܾ���,�a �<V,Ybv?�(�ׄ�$�`T�II�	�#P#�$�����.,(@Hu�#
֬\Yj��`���u �,�BcUm�/;V�����#��������54(�>jkJ��eq�ʕ��:T��NQ[ n~���\�G/X`�VZ��;����摸ְZ��_��^m���G�yN��ۯ�u�٬>�R]����X���^AA�…����l�}��З-�vՊ����%�=Bk��*xFGu! K�؇Ѧ�l�Y,�T=�KD%EEX�zu���Haa!lV+��A�e̞=�4øx�8�V�cc��鿜9}z�o1mB0��Aq�&��PLK�{�ƃ<%�����MMvQ�U��S*�����f�C��˶��F)]�h��3��,B ����r���t���\E������"���0�l���Ɇ(���@8lhN
0`��00i�
}G��-_.Ϛu<�ޘTUVbZ�n8�O��:D�[�y�­Z&*����W�d�c0.�8,[�<���9*����U�-JRl�HM�	!XV�e'����A�]�D�q-@E���q�
ʰ�xD�>��
�C��Ꜹ߶8;I�E�?	~�	Y�0�sRzhmkKh"��={"��������1�i������Lx�U�aZ�0�4����O�t ��E��]�\4!��?Z��vlذ�~~}=�f�邆�&��&��s
��GE>�:]�:>¡~?ڗ.EP�@����-��}Pg��`f���������cze�(&�N�:'��JJ��tw�=~���Y(���ڒ�z6D����]*�{SJWSJOe"{L�b�̙��@�����Bȫ��&�z�ώ@V�΃�2
�t&�Lڳqk�z�����uh��|NJe��`�Y��M�}}��I�]c��Li�B���̘���DQ����)QX]-qn���Z��\�-'g��
:s�?�}/81	�0`��0�5�%fA|\�� /o��-[j4~*�
���7��'F@;G8���0�8�3�0�bz�v(�����(��f55��D>�55�H��x���+#�d`X##�h�4����!��|�RJ��t7�#�)�1 OP6�!)�tr��'�	%��M���h��B�@kk[[�`XCcc8~(!Fs����!!b�l(���y<Ҏ���ӛ�����U�vN���Μm��=��/��oj�98�y��4nBvB�$�����:����m��n��f���0������ý��8�̝�ߤ���!��Őǃ�c�C�R�N�8����W��w��׭[�Bz51��ׁ�������}~(;l�
D�h�OH�h��z	T��!W����b��v*ׁ?��cbE�x�|�̙`������ߏ�ӧuOK�r���)[��e�xu]N�}@S˫��u ��B������n��@�zz��2p��Hω�.��Ř���RH�>�Eq�J�ɾj4��"���@�@ ����!�X�vm����~�=�?1PJ;'�*c"���"ðQ0`��L5�þ��/�T��+���"�i���/��P\�<�ʾ 
mm׀a�К�@�q�Pw=�__�
6�[��v�(?&l_�#/#�@���l6�
�eY�65����Z'�\q���W�̙3eAN�ۿ�����>SJe9�A�
����B����IY�a2ya2�ä�d��[W�09�@�ۓ�>;���}A�0��0`����`�S��x֬���'t!�ɴ�rTUVN���	���秔@�z�~�9�:��
���|g��;�����T�!F�8���
�w�2�Q���2"I���_P�$9�� �Er�Z<�j��C��D՛�D��<�q�c�R�}�Ҋ�2�a%YHBH���L��(��٩Hq��)����LeDW��:��jSU(-0犣[�q��u�g��Պ����[f#}I)�?W�jh�ʉ邅��y�@ ���L)>���HZ=�`:���]N���'�~z�W�����9|X���)�^�K6l�����92�$cD")���ĀR�J)=��iٲ��pC{{t�z$}o�����҅P�y���:��~!%��i|���p�ց�1Q=��TK���/�O`Rցl�����)��(D�h�@_ww�T:��J_E�@��Ѥ�ģ ����Skii���擎��Nc-d��pBV׀a_`��0`��gz������DXL����jL+(����#F��E�GG����}B->�cL,��<��$	>�'�]�����yq=H�bL�#�����G�E�zt?=)��ŭ�睇���)�=##x�R������N�$!�2)��S��Sg�D,'�A)�D)F��ߌY�ٛ�˗���Y	C?)�PJ��"����/ʺB�@(D �8�0��,��h�$��R��B	���7j�����b�M�I}!��qb�����0���IŇ���H�I�Er�l���q�����0`��0��s����Ǵr�\���Y�N)L��v=�~ k�:;��a�,Q
O��R�����6��t��O}w��Ӛ�\��n7L�/��C�C�3BB��"������$K �z�eY�@����rD���$�<v�\��.W�i��G�e���%qq.@�Ǥ�F��ķ���-b�PJ9(���24�
(�Eq�Řş�g_4o�BT���b2e<(�N��&T��K1/���G��xQ��������!eVd���YP��weT�>�>ҵ�@�D�K��{�lnFuI��$����bXPB�N�}1i�~�m��њEy���L��Hy.��0�D$��?V�S�tς�SI �����SWa�W60`��|&0���r�/�T/�1�l���dL [��L��0i���O�e��+}��,��}A�^ Ƈ�z�ZOO��@N��^ ��I	L�}A���R��f��)M6K��gAF�hR�"v��ط��vG IDATsgFy&ݾ�E�R��&b_���@Ô͂L�
ӳ R�&þ@�D?™�&վ@#�N����}�0`��|˜�}���r>�6Yz��	L�^!g�9�2�G�)&K���S��'�7H:4;3�%�4��ll2�G����E��D~T#�!2�G����)x���ņ�͸�hd�(*�'�7�LςxL�!㕰y�RTOL���?�d���#d3�1Uz��K�*=�gr|6�,&��j�\{!+D�@�O�Q���G��60`��|�,W�5:�0����Fb�д��ۮ?M���p��������(**���zN�Ɓ���P�*�{rm���X�z�������ψu	a��
f�����fn~c#��� K$u������O�����p���J����Xw�R�Áwv��G��(��X�N�涙3f���1k�,ȒQ���m'(��c�,�A��>�,F��XX�~�D���3,��(q8�z�J�Z����׷R�ep���RB �"��d����e$I�D)���ckWW���	$I/ ��a*AU)E8�T�IxAJ)DI�%��M�H@!�"���F [PJ!IRLT��	��n"�rݲ�>'%J1�Ԅ��qq1��oV�Z � �t�MI]P$I���p-&�7Ӷ@��'�
Z�-�vN� �j�Y��U�k���L7Q�(�)
4r�,CV�XE�Y���,L&8����`��,�n�χ������G�JH)�,��P^����=V��Ȋ+�v���?/~��Gn��^gs:�襘�rL�&���z�o~��
3����(�����~�###����}��s�s�…�P�)�`hx���&3�pT�>�@���p�w�Ǫ����ٳO����p8�� I������p�
���Z1�<��N��`�z�����=z�/Z$��w��7���^F)�
�|㷿����۷�C)��RJ����[�RV��p��qւҬRˣ)�n�p��B���#�4!�k������ϵ--RmKK�@ʥ�RjР^]���s���f	��ۧ�F
BH����]	���'N ��T�So9ݳ`���5�d��X��Ԭ�h�gCcb��0����g`\'��7��L1�|�����9s�*�M���{zp��I�GG����������������+6n�l6$Q��ʁX�ò�z����ݷO�?�d^}|�	�bX,w,Z����W_�ߜ
<ê���ǟ[�!��1�(@ߘ8��ڰd�b��ѣ�}|��e�;;y��{p�ln�[_o]�ގA�?R���2����v��a�)$��aTO���3g�Rj���_*�"�AyY�@(�9їF�� @E�~I��f�$��<!(�Ϗ��p�,�W5,)[ �$A�$0��\q��
���,�� �Y���"Qr�TVMh*E�����a2�r��b)[ ~N�� �4�j�AƳ���@Sbi��x�@.���u�QT�����Qeab��N�eY0F=�J� �"�T�L)HT��׋��'�#s��>���]�v�z�-&
չ��<X�V�L&0�Қ\����"*�4�����>���F�o�Q��߽{��/}�K�������B����d�(<���������ϻ��.R����Ϛ���#Gڠ($�U��Th�@�����}o�}��Wl�X�l6ò,DQ���9�{�����j�:ˉ��B�Ô�6�J��T�~0J�?�}��w~����>x���R��}��de%��)�RJ�I3�)Pu	��������$4C�<?W��۠t��>V�1Н�U��z�tig�T#��'N�So�xy�'N����������0`���Yl��n(Z4��ߣ�{�t�jY��*��T�e�3g�꒒X�Vp,s�eY8�N|�?��}��7ﶦy�����VM�$�B!����<<���w��E�Ų,Y[k_lK�0�&�ڼb06���6y�<2�K2<�L��@�x2�����Ab�-��m�+x�7ٲ�-�w�r�]ݮ�ޤ�3�W���r��ԭ[��:�{ιr�
�;�<�����P�~;�����+�|D)�Q�x�b~bc#?���_�xq�BJ
�+���Q{{{߂�o�U��h=�l���y]������R���ۄѣG�\��5k����ikk3�Ɯuk�>�M@�q��.�j����;60�Z�꧄���A�R��p:�p:�P�����#��]�j�O�o���Z��jE�@NII_�ر�;�o��B��M�'7e���n����E�/����j�HKK����ؽ�J�B�Omnn>u�¥˧O��O��I|�ĉ<��~�VV���ɓ'��x�1q���=�������n�D�ZT�F��ʯn��YY�,|21���烏e��T�nVi4!�3�c��^N�X���q��<������7�USS��<<n��I�X��z�{��:��ar���-[��q�[��Z�b[�R�d2!++&�	�t:������g����3��:$�dd@+�0��tg"�뗫V�k��V>=+�@�tw��[WW�wvv򝝝|]]]�y�RJw�I���k��V���V��xO?�������s�[�x�g���x<��l��l��ֿ_�k_qaa�˗�?��c�(�+(�����}EEE���UXX�?���O<�Dwaaa�EEE|~A�>��
VȊJ)�H)��j՗���_����^z����z��_�dIw��,Yҭ����t><��`�+--��V}I���F��EƊB$���+Ql���������J��X�K���X�|�+P�@�
(P�@�
D�2�������֬�L�
��|�7���ȑ����f����|�ۍ��;~|38.6_0w�|������W_��,��N�a�D�a�D~�w��^}�ՏZ���Ο�/�=o�kn���֭[������֮]�/�1c��`6��S�@�Y�V��hѢ�H�/`v�v�=����,Z�h�Z�4�H�`���W:vl�;�|����ڔ����O�S	_ =i�0�u�`p_~�e�/h�:���ŋ���=�T56���|AQy9���>b�����/,+���r���6��>�N�V�|Afv68�K	_��tڲ�����I‰���rfffN�].�a=!�555
b�t��ug)Y�4h�x�-���!(�͂Z���{�dL�:u�贴�M��/��˃�Əg�ju_`0`4�����'+�.c>�56?�K�R5�|�����i��R5�W"N�'�dff�O�>��R:��С�Nf�溭��SJ��e
�/2��yk(�E�#������=u���}w.Z�LEAܱpa7��ާX=������{�̬,wFf�T��������뮻���*���	�_�����NX�qcCeu����~�…�%=�
`�X�/J��;�1c�4eʺ�6�Qv4�_���~YZZ���d�����3�Wf&������YR�#J�@aQё�3g�w�q?f�X7���kk����O�:���ܼM�ʒ0�x@T/K��#��P���F����K֒�ʴ�4|{����b���|�iӦf���	!v��r���ap)��D���*��������^�=^�,��k<�F
JiVye��ѣFu�K�-Ϝ=+̿�7_�կ�6�r�����1kq1<<��h4Z4
�ڳGp:xOZ �G�_�VT<f-.F?�Z���Μ9s��p�������y������KJ�����	��ɓ�}�R:0:'��-��·wt���L/������/�*�p��Y���w��pe�\���ܓ'O�={K?������׿{��%%%[�;�RʈiY�8B��]�#��;S-���aS�qIz@J)�B)��V�H�x�R����Ä袔֥�q
(P�@�
�j�)�kE¯O��U`5���>��"���M�u:t���x�J6tw���E*��K�X��ž�]�q�\���+��<���0;�֯c=!dN�o���{߻W+:��Z
�����=#͜r�������r����ɲ(����?�D�E����3����xB�o~o_���0�)S� N ]B@Ė�ص+"9=#���Pn������8؝N�gd��@��L��0�׭k�掯�s���5�~u���…K��<���FX������=z��ѣG��<�
)sc@)-��\��Tv.�QB���3�ſoN�
�K�/�(./G�>�xg{d��EZ��@c}�%+3�?0p������0�3!�:��,:�:Ht��䠳�Ͳ��O^@�j�r�񖼼��0S�p�’�7�v�bH����:�>�D�
n6J����"*���l���S���W#~/,,<?88��a�����6
�_9sF^�T��=[��Z22���f���K��p�\_��68xsVC��Ò�~�СCW:tՒ�~�68����j�@�
(P�@������#Ԭ������g��OJ�?R�!��8Y}�H����T�!@��~`d<C���G�Y�+��
����ˮ�����r$���L!@����"B�d��)_
��#�"HV�CVCE߯��
(P�@�
(�K�Sl�W����{I�߇'F*(L&�O�~]���;I�0�[x�]0��a�����9�ߤ���FV�ؐ;Y鯏�b����qU��8�HHz�OT��؜Nhd#>�E:\�WT
	!�YB��Ja��T�DܩF#;��"<�t w���(�D���I	�Q��ߴ���� �h
������7����H�j(WOD��1�";X�ˡQ�`4��f��s3.�<[�T̈́�Ԍ�Y�f\/�dC�
9U�T����t:xe���v���������X��:���a���@__|j����jX,�TO�����|7l&dYL�
�9�����t��N�sĒx�z����ڵ���4G)ܒ��72�O܄�F���@�
(P�@��!�p$�IZ����`���s�����G�v���t��3f�IЮ@ ��n��_U�r1��fqcF�Ƒ�t�'%_�q+pz<P37�*j̈́�9�B���S�I���a��[�1i���W�wG���3�Q�L��NF��J���@�4)q�Ϫ�OD���#!=�|�Y
�������M���[,z��6�<6�V�A\�@���c�K�jh���,��N��ϟ�����"���148��'N���߰1�r��ps�
%�8�E��W��VC�׻�����z�TAnS��~
(P�@�7�M���s�L�*��p�B�x�>��W~���-zJ�R���\.|��g*@�+N��m6CVP�=|��'�8�h�Geݽd�
�^F�e�X��;S	�PP�?2�wϲ�=s����x�SJA)]�{��<˂H��/u��"R!8��^R�7B�O�	 �_����Ĕ��/�@Â�j4���u��-����^��h4��\a7��y<�W (� � 3=]}��QB�aٽ�����tu �`�>i�= f`Y,˂s���h��z�5ߏ���{���M�+�RY�� �|��p�ĉ��9��n˲�;��
�{x��X������o&Ѓ,��n��ȑ#_�8q�!�-$zl�hh����᯿��+))�UUU�l!�\�v�=�y�\>/#񵣔��8�l6;vl��ӧ�P�N��9�VO;��*�����_�l�ͧO��r���
����|��F�3 �|����appG�� 6����u�Z����>�M�lj�S�ZVV�YAA����4��jp��om6�ٲ%�n�9�c�@�0�9v��ϟ��ɓ'犍/�?2�k�E������=�t��ȣ��-//������z�?n\D�������q�hyy9}��G�RJ�b�XmE�D����Wo<q]g�L	)D��(y[�~�E��lP "�@�?��>�ǁw��Áˇ��9��|���3���O��Wq\E�aԨn�2��3����|��:�`���th�j����n��]���k�G���J���J*+_���}�Z

�@�RA�RA��T�4�J
�@�Vcnk�K*+_C�2,�V0����)��Qo`�X����Սuu�q�,���-��R�_x�uu�J*+W��Z���Qo�66>(U���[ssq���?��)+-�/]�A�������ݻ��Oa2��q��[�F�Z0�T*N�:�����x��K�plϞе�
x�CYI�kq���۝N'.^���y�L��O?���/��t��eY���e%%x��_�
�q�8.x���t����?���ǖ//�i����O��G�ϟ?/8�ΈzX�.X��*�s\�o���v�q��%��/�t��e�*�_T�a��˖U����_�t�s���$�I� |���^/�~睃�-�p;!�h��i/ZT��;��z���A�=� �HG�J��#�>*��W�,
��GT*Uț�["@p"r�\p:�`5������I��E��@bQUu�$�F���MQ>���庞7��FÛ���*J)J��y�GB�f��)�J���;XA���X6t6��H�D�^��w�*�+�§k�z^H��DoF�
(P�׏D����w�ټX+ќQJ��8��,��L��`�66�	��	�b�޽رq������v�8��Ί��`�jk�n�K�p8B.�˥���U�j��%���ʅ�z Z�)�ޚC	��m�t������1y24�$j�`E��Q��
�u�n�ؿ_C)e���x	��嗗����R�x��E�r����֮]�����c��Mm���t:�r�B.��	���ͦ�;6𽑽v�Zn|m���E�rD��"z�������|�ヒ4��&�{�)�Ŗ-Ш�Q��$V�̙�ݯ~E�n��t������͏R܏�3��3(���RZ�<IH�URJ��ϘAg̈؎G<���_�IB�qI��آ\��_�x��W�RD(�<^/x?Qr���0�z�A98��-1o<�/_�=�>R�:1o<g���_ Aȉ"�k!9=�-�-�����A�`!�H1"�3�;�:dA�4#H{����M�	n�� ��JCZ-\Gӎ�_0]V�x���uuMD�ƆO>Ij1	�y�l�ZW�t��ר� (@ZZ��}�Ņ��D����YAx�w>8��GB�9���HM�'�s1n�4����u���F��{@:�86����t��c
�5���;�A���$$"�4�k���f L�}�?���sӤ�QQ���!� �~�z=<WY[�luU��c�?|f�v�‘�3㾆r�iT*���>[QQ^<a_]Q�lx�v0!�%:�
P�[���\8p����~ܸg��V�,Ra<tj5�2�Ѣ��>��������Fm���f���e�O�&�y
��Z-,8��!	�|�Đ��+8}�vm�l���][�����x�J0��k\�׿�u����M@ ����++�5G^Y�WY)-�`��-�Z��q�(��/�\�<���G�p(*/�Wj
b4"�`��a��O������ *�MFƗֲ2
�DO�����j22��'�Q>K)͊�{��a�x�\��[�
�c,�Yǡ���_�ԗ��;���`x�2�2J�Ov�/�����h)��L��xr�e(P�@��c8�������P�wt�So�*��4�W��b�=رqc������p]�>~Bu5�t8�����v�n�36��q:̄�j~�%��C�|�Z�oʇ8�u IDAT��9 ;�mӈ|?s�d�ab�<��?_���2S[ZXP�]�w_�MD"|�=wߝSSU5���O}����\fhh���

1y���z��~�����j���A"|A~e��	����N	<��~�@���ƥ���y4͜������.�^|}�ĥ����d�8c���Bi����--����
���3��j^�;�R��a�t�2^]�\@��Z)�����c
p#p��a�<D�#�q�wdy��AH���$h�I�6%��	!f�l�W��X�F/N��h2������+P
B):�NgӎM�^0UV�x�������T�ӟ�5R�g��K��N��B҃М^�,��@�WtY�	I�� ռB�c ռBdDa���aw@�3'CH�M�ן�<��x����b�
+%���Dx�A��p�'�;"��R�WX�W��	z�6adx���~ܸ���
����'�|��Wx>�WX�$����Nhh�*�a�(D�VU�c���E;f�WQtax.���׎�G+Ji_Eu5-,.��N���*+����a��yee|�_`���ώ9��Ӧ
f���F��<�A�4c8�~n"VdQ�n_v���X����W(.-����=���(�SJ��@+�i��}��w��+$�W�㓮.�]��M1�0�
��@�
(H)�����kա{�i��x�`Z{;˾��M�n,_0���q:�A� p9�Nf|*���MM9��޾=��45A0� �j��۾�"�Lnnf	�������Ճ�}�Y�/���8l6��t��r��v�^"g�٘�yyA���>��VW'�TU]_Z���D�������- �WS��"��{�ߜ:u��ر�|���f:e�tJS�L�>�Nln��So0������}�
b��������'9��`�(�*���7�N)_��ښ���W��V ju����s�H�}A�7; ��1ܾ`�D���0 B��^��/�eSD�y�p�=�^Z_��h����'��Z���K��N8 /p<Lf3���
��a2����=Y-�!QMX����= B��[_�l�Z�z�6�����烏�p�f��˩ �<Y�Ƅ��P/8�� ���3g��e�7��
ę��[Xĩ�!�x�!^��� ���'�^����X�eJF�>�G0��h���h�P5#I��[
�݁/;�|�Q���b�鰄����5|{�Z��8�/z].L�e_0���[^>l`lyy8����/�Z���Jc������J{�lF���?u�Tf��۾@������b�<@iEUgdy��rl���{����~�/^q	T�

��>���}�
(P�@ABP��/P���l� ��
���)�/`)EB|�h47ľ�+	]J�pX�F�r^�R����i�F��6��n�/�?&���}A����

�>�8%�B�'�S�+˾ ��ۖ��~R�+$=i�y��-,R�+��"���ec��t�A��}�H�e{@c5.9-=�VsF���o� �[��V�X6&�^>B��MM�\P�/�	qy���}U55��j��/H5� k_p��aL�:u0�b��=���Ϗؾ VƵ/H5���}�
��U�(P�@�
��!ڞ�a�5��y��IJ�Y��ʊ���oy�a�R��b�P}/��Ũ���z�O|��+|�z�(�9�-�-/�޽�gΨ�m��h�J�2fdf��;R���իW)p��v����k�X|��I��MI��T
� �y����͇����!�G���+�����H'��T��XA��_�elggg@H�<�Á�{�i��zz�5.+!��1�ӛ��1���cY���S�B���P�DA���TM�P�>�� �5�Ɓ��e(�JC���n̙7�@�K�H��KKgsH�H;����<!$�b0��VU�R��\8?�b�=��`��l�w�xP^Y���%Y��e^ $� `Ű��=�`?!�ԍ@;���U:�X�6��{�{F�8�L�3�@�|>�X�(��7C�9F��y.��f��9ǧD��1cf����9x��.%2�&�Xc ����!�J)X����l�����;bԗ��/a:-fs0�m �m֨Q���i����� �&���3rr��71��yn�N���}�nG?�����!��r7�Z��&NDiU��0!�jM������S&MR�����x�f��gee񙙙|����]��JxFJ����^{����;k�l�����G�.0���5{6���Ɨ����.K�qPJ�E�y�L�)�R�|������3w.?�����ʺ6w�<�������?F)��R��R쁨�^J��X�0�rU&�}�ᇻ~��_N���asGoo�o�����u&!�?PN�,>E(۝Ed�o%�>
�	!p��ŋ�������yx�^�?���:��a�|�C&&��0|�j�@��3eʔ�>��H��ܹ����B �1a���:��>G��o�<iR)Dz8w�ܙ���?�Q\\�TO�;}ڃ�h�:,�����[n��y�8y��k׮�2*��wW�n.��/?�p�,`e��
���j����333�(��(��(��SJ�3�<�������8��ZmjO�PJ�{ϟ�$--�$��=�)�b��R����l���t��6�@�
(P�-�^y��B0���s嵵+��a���"|!�
��0��`��H��J��W�TT0����?��9g��~��%�s%��+��˙;.4�����c	w��+����͟O_{�W��T0���6ϛ߾@�qkE��
���뮻�b�2�����8T���
�7^T^������w�<�|���#��๢�r�s�,����ۥ���I'wv&.�1'��=o}�F�84utЦ���>��0a�?0��,]
�ۥ�v�4� d9.pF8V�/D�;4�YԨPJA�Z�5�_S�!od��>��4v�S~�N*�g��D���;q�Nmn~���"�c��h�>}��`x@��q�MHT��+����:�������t=*x�^_QAZ���dt�O�8'�E��	@)�S�ב�5��紷7���Ɛ��:�}�m�Ľ[�,�9�Bvv6:��ZUz}7$j>�$7!A[�:�y��:������Z�f!�]�"��~���N�����Ѩ1�(�<%.C,&�eem���a5�8;w�~r|���ΡÇ��eY�L&�jo��N�
�E�V�΄1�Ȉ�Z����ĵ_��<	?��"<D)���G���y6���L\��p��_m�zz~�fÆ�m.���<�Ǐ�T�[z�7���j��A���_�~	����v��*���:�����g���h4�����")������!v�kӺu��e�^�X�K�5��.�6����5���ϨT(�������թ5\���n�8�iQ!ى��h��?����r���W%�C�������{&Bߎ��E]���Y	��ߵk���(�-�20p�S�����*@6g�l��3�8u���h��^
)�1Î��nJ�6�aʓ�	�5Ѣ�'�F#K�D}�B����K:�
6ۓ�}l2�,����Q��R��\��RY,��x�DА:�X���R�
(P�@A". w�-."��s�z=\v;\�h\!:�i�8������#��2Wm6lX�.�J�~��].����ѣI	!�q`����/}�A˲�?���������	!덇���'*��˗�B��3 d��c�B�N��!�7�R�X��e*x�*+Ϝ8W��E�
��/���@��ޞ��B��OP���_&V�^��+D��A�֛o�EgϛG�99Q��#��|O'Q���,]���L�0!�B4��hz�0��	B�8l��DQ�I�^�٥�O��7�kj��U~C�ژ7$�&��@�2V���x��d��~�PUE*��ڹsg�%<!B�T1��G�����������;�

�z���N�`~~>:��0z�:!>��6%adx�l�^����֚��
��)�ݲeI ��
����٘��ެ5��!���'�*cR�(����tt4ffd��vc����jش�k͚���g�X0���Ng6�P�����1E��B�h�N�mV{{��d˲8t��?��xG��M;w�~��8��谦eemPd1�b�#�n�x4��9J�O@�� 2 a��h��KV֛z�9���p���8��_�~���	�����F���#)R�6�ԏ_��<l.��fÆ�zz~�l���A4d�e?ܴn��v��!�--����-�--��CN�����8��H�;�1l�ND2q6lݸq�5�mP��:n\] ����ʨT�f��o��J�$-�q\�N�D�	v����?4tI{�M�J������-��;�Q���|�cGKfii���ҕ+m����2������
D� �1^}�3a<����y��D�f�Dn�oO@�p7�'�*���	�i1�(P�@�
DA�v�Å�O����p�\�`b��A!P��a���{7�F�yA�@H����Q=)��(~W�:�:`�pt"�a�I�T�c�/������ \.W�6C�R�h4�b�l6[J�edd�d2A�qѽiŚ������m�R�������t~\~�`��{nw 4`J��,�㠦�X�Q�
4L�F�,��3)%�u�$��IPk�p>�M5/�P	$J�$������N,��-�o��)�	�}N@s�T>"j�Ԉ�=	���|:񸿚�n�s_�~=LJ�z0��gB��F�Ip�)����h4�+�%HU>���h������իطwo,�1n�x��o�II������������	̈́�55	�p�櫪�����_`&$j5($��xH�LhWMe���!�3!��
�z&����[�gB��|^/��O��3��@MI>-����ɡ�U�+^!��IS��a�B)���l��e��r�4�6d��[<O��Q�@�
(P�@��d`�?��_���ij1ᕴoZ�e��my�;߱�������|RY�վ=m��i�&���8�z�_���j�m�Y�23�z��|@
��xX�*����m�B��?*�'��ӠR����n-).Dz!<`�kE;��*-��?u*i�ON�����{����1�t���!ШT(,.^�p:���~'��p>���J����~Zmu581 f4-�J��Z��J�8�N8�N|{�2�?.x�?�a,A�����Ϛe���˲�����"��Y@�OD_t�JB��a�Ν��|���7!�{�Ć�ی�.pׁ�c]�����8<KZj���v�g�P���pf_(+/��=z|zz:t:��JhH<�D�D�_�J�)���J���G���?�:�3���dOOmeU����^�f�����A��z<

��������lp:�p�\���e��|�XW����!���!��
�����9��ܜa�Z,��G����<������O�s�.��#�|��vhh�H�4��j���^�F�F�R|����?Nf��G���ਫ�?J�eee�`0@%0�׋s���ȑ#r����������f|vv6c6����q��Yߡ���@<<�
�4�7������X��.??ߜ���Z
�χS��8}��R�[���_-��������u�F��F���>{���ږ
a�׽��3f́	&�---|�̙��& Z��(�k(�,����3�l+))qN�6�o,qPJ倫QJ�x������kh��++��(���.J)���dL^��-)Ċ����Rz����h<���NxCB)�>�Խfݺ��%-�X	C���yJ��<fL���|#������4~��M�~��I�C��Χ�^�bEJir��z��X
(P�@�
(P ���t�29���kE�ƈ�J�JK�w�c�����g����n�j�
�,Z�L�>}%�j���4 `}>x�^4����ŋ������yC�k���.�f���{�����m$0@�%@Vi�@)�N���@4X�e�x�s�g�D��Y�C�ڇ4Q�{aiP
�)���b�&�Z[���*���n�7o�^��3�~�p�xY��vgMe%3&'f�	f�	�a�AXE&Ek�Z��G�b����Rg�o5&Ӌ�S����q�@��^�r�7�����&x<�����,�����[o���D4�(�p���9
��c�W_���nYu�/&54�gY��P�҆�w���z144�+W�|��ӣ�$8g��y��/N��+�	�\��<�J��T�7�q\.���[aҤI[w��9���.���,���e��,<�N'G)=��������U��`�)�_|�)+++������fÙ3g�o۾}����~_5B���m���mYq�����p��ի˲�<��﹞~�Z�9�������:�.Hd��n��|~�:�j<�BB^Ci������m6\�v
{{{��.�l�����"�K�{[�n�������?��+����B�F����i�����?��6�#`E��C�R�)�Z]ͷ̜ɷ���&L�njs��C�R�kHp��0����ٯ��wQ1Vi,�WV�u

|Aa!��ҥݢ&}�ʄ%��ck֭�I)uSJ��h!}v6�3Ϟ��9 
�C$����~�SJ��RژL9�1;�r<��9*	��(�)��Q�����dҊ���On�)P�@�
(P�@���/P��/P��/��/P�(|ABP��/P�
(P�@�
(�/���H�G��#R�)��D�?"����4M�B��H�
(P�@���"<Ԯ�\!HFSl���vec}=�6���r�(���h0����A��>�`D<WZ]�����Y0>�>�`�;�́��E���ϕTV��./g�\�0и-��N�ǢQ��g��xU?o�|��o���T���y޼�甈��9kE��
���뮻�b�2�!!�7��
���3�#x���|eyI	s�%xx���58�D��7�wΚE_{��au��;;�����%0����ͣo��ֈ������!@�G0a��`�Y�f�K-�d�A�r|�P�!�����*�į�h<��F
B��.-}*�i�ا�>Z�TdY��8�}'N�ߩ��UUT�?Mӧ�P�㺒2��CT��+����:�������t��z�^_QAZ���dt�O�?�/d!b>���5��紷7���Ɛ��:�}�m�Ľ[�,�9�Bvv6:��ZUz}7��@��a��zb(י�;f���Y,8�n_ך5�����7/w��������F�Ѹ
@�)�;D�!�	�Ҳ�����p���w?`SD!��C��#˲0�L���^	�n�V���6�ג����'��:��I���,"�CT�/�(��<��zeׂ��5�����ɚ
��\��?�Rm4n�_5@��w�VW����[�~�8���햵Ɖ*��;��p:�����!�ӣ�h���R
`��Ⱥ֖�r���M�����PzCI��T�qaD(����5���ϨT(�������թ5\���n�8�iQ!ى(`�"��wtw�\���UI�$k�z�
]���=�oG��.Fq�G���5�RTT�_8s�ԩY�S�	�U�'_�����g�ԩ���&U_��0����Mi������L@�`��D��hd)����cY�F N��D�S�`cوߣ���D��F0�Ѹ�D!.�L��8�!��".��	��X��z(P�@�
d,k��IDAT����Nc{�9wߍ�.�.�4m4.��V�4�{X�s�0�tD��^�͆
��%\��������SG�&%D�ǁ�x�$v�K|�²,�?d� �<}�x�BD@����D��>�b��A>x�}��<}�XBBD��$�A�
�+�-{�
�{�=�
��3'N�"���A��+^!x��w�ҕ�==1��`G��B,_�2�z�j@\!BM��(�OPJ�o�EgϛG�99Q��#�B�r25�?��ҥ���	�+D��u�]��<A@ǁ
׶� �:M���"7�.-}
���_S1�!�!Zm��($PMi�U�oil�Se2a��J������ܹ3��!T*����1��r:]3��}���|gQA�^�/��p:�����ֶ����!�]� �1JX� [��ww���fgg��t
{�lYH<�}�mCv�ktv6洷7kM�nHN�G�	�
@��L��h�6���13#N��7o^�?$Evu�Y���v�,f����������G�O��B�W�Z��m���^i2���,>��p8ޑ�g��ݻ�8��;:�iYY�YL����xA���4��9J�O@����d���h��KV֛zís���pL���ׯ_���v�A@muu��wȑ)P�[�Ǐ��y6�KX�a��}==?�k6[r�@ih��pӺu���.�������V�����j49��{�t�k ��t�K�-mH°a�ƍ���l�j��q��	e��VF��5��sW�,P�'iA��b.p�� 
O�kGw����K��lTj5.������n���T��H~?��W;v�d��v~�t��A[o�<��DE ޺";�)���A�c��dg�x)7s��'�*���	�ܖ�$� �H�nOU��� �(<�
(P��������y��IEND�B`�com_acymailing/extensions/plg_editors_acyeditor/acyeditor/ckeditor/skins/moono/dialog_ie7.css000060400000041550152453623450031176 0ustar00components.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_title{zoom:1}.cke_dialog_footer{border-top:1px solid #bfbfbf}.cke_dialog_footer_buttons{position:static}.cke_dialog_footer_buttons a.cke_dialog_ui_button{vertical-align:top}.cke_dialog .cke_resizer_ltr{padding-left:4px}.cke_dialog .cke_resizer_rtl{padding-right:4px}.cke_dialog_ui_input_text,.cke_dialog_ui_input_password,.cke_dialog_ui_input_textarea,.cke_dialog_ui_input_select{padding:0!important}.cke_dialog_ui_checkbox_input,.cke_dialog_ui_ratio_input,.cke_btn_reset,.cke_btn_locked,.cke_btn_unlocked{border:1px solid transparent!important}
components/com_languages/helpers/multilangstatus.php000060400000017727152453623450017173 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
use Joomla\Registry\Registry;

/**
 * Multilang status helper.
 *
 * @since  1.7.1
 */
abstract class MultilangstatusHelper
{
	/**
	 * Method to get the number of published home pages.
	 *
	 * @return  integer
	 */
	public static function getHomes()
	{
		// Check for multiple Home pages.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('COUNT(*)')
			->from($db->quoteName('#__menu'))
			->where('home = 1')
			->where('published = 1')
			->where('client_id = 0');
		$db->setQuery($query);

		return $db->loadResult();
	}

	/**
	 * Method to get the number of published language switcher modules.
	 *
	 * @return  integer
	 */
	public static function getLangswitchers()
	{
		// Check if switcher is published.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('COUNT(*)')
			->from($db->quoteName('#__modules'))
			->where('module = ' . $db->quote('mod_languages'))
			->where('published = 1')
			->where('client_id = 0');
		$db->setQuery($query);

		return $db->loadResult();
	}

	/**
	 * Method to return a list of published content languages.
	 *
	 * @return  array of language objects.
	 */
	public static function getContentlangs()
	{
		// Check for published Content Languages.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('a.lang_code AS lang_code')
			->select('a.published AS published')
			->from('#__languages AS a');
		$db->setQuery($query);

		return $db->loadObjectList();
	}

	/**
	 * Method to return a list of published site languages.
	 *
	 * @return  array of language extension objects.
	 *
	 * @deprecated  4.0  Use JLanguageHelper::getInstalledLanguages(0) instead.
	 */
	public static function getSitelangs()
	{
		try
		{
			JLog::add(
				sprintf('%s() is deprecated, use JLanguageHelper::getInstalledLanguages(0) instead.', __METHOD__),
				JLog::WARNING,
				'deprecated'
			);
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		return JLanguageHelper::getInstalledLanguages(0);
	}

	/**
	 * Method to return a list of language home page menu items.
	 *
	 * @return  array of menu objects.
	 *
	 * @deprecated  4.0  Use JLanguageMultilang::getSiteHomePages() instead.
	 */
	public static function getHomepages()
	{
		try
		{
			JLog::add(
				sprintf('%s() is deprecated, use JLanguageHelper::getSiteHomePages() instead.', __METHOD__),
				JLog::WARNING,
				'deprecated'
			);
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		return JLanguageMultilang::getSiteHomePages();
	}

	/**
	 * Method to return combined language status.
	 *
	 * @return  array of language objects.
	 */
	public static function getStatus()
	{
		// Check for combined status.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true);

		// Select all fields from the languages table.
		$query->select('a.*', 'l.home')
			->select('a.published AS published')
			->select('a.lang_code AS lang_code')
			->from('#__languages AS a');

		// Select the language home pages.
		$query->select('l.home AS home')
			->select('l.language AS home_language')
			->join('LEFT', '#__menu AS l ON l.language = a.lang_code AND l.home=1 AND l.published=1 AND l.language <> \'*\'')
			->select('e.enabled AS enabled')
			->select('e.element AS element')
			->join('LEFT', '#__extensions  AS e ON e.element = a.lang_code')
			->where('e.client_id = 0')
			->where('e.enabled = 1')
			->where('e.state = 0');

		$db->setQuery($query);

		return $db->loadObjectList();
	}

	/**
	 * Method to return a list of contact objects.
	 *
	 * @return  array of contact objects.
	 */
	public static function getContacts()
	{
		$db = JFactory::getDbo();
		$languages = count(JLanguageHelper::getLanguages());

		// Get the number of contact with all as language
		$alang = $db->getQuery(true)
			->select('count(*)')
			->from('#__contact_details AS cd')
			->where('cd.user_id=u.id')
			->where('cd.published=1')
			->where('cd.language=' . $db->quote('*'));

		// Get the number of languages for the contact
		$slang = $db->getQuery(true)
			->select('count(distinct(l.lang_code))')
			->from('#__languages as l')
			->join('LEFT', '#__contact_details AS cd ON cd.language=l.lang_code')
			->where('cd.user_id=u.id')
			->where('cd.published=1')
			->where('l.published=1');

		// Get the number of multiple contact/language
		$mlang = $db->getQuery(true)
			->select('count(*)')
			->from('#__languages as l')
			->join('LEFT', '#__contact_details AS cd ON cd.language=l.lang_code')
			->where('cd.user_id=u.id')
			->where('cd.published=1')
			->where('l.published=1')
			->group('l.lang_code')
			->having('count(*) > 1');

		// Get the contacts
		$query = $db->getQuery(true)
			->select('u.name, (' . $alang . ') as alang, (' . $slang . ') as slang, (' . $mlang . ') as mlang')
			->from('#__users AS u')
			->join('LEFT', '#__contact_details AS cd ON cd.user_id=u.id')
			->where('EXISTS (SELECT 1 from #__content as c where  c.created_by=u.id)')
			->group('u.id');

		$db->setQuery($query);
		$warnings = $db->loadObjectList();

		foreach ($warnings as $index => $warn)
		{
			if ($warn->alang == 1 && $warn->slang == 0)
			{
				unset($warnings[$index]);
			}

			if ($warn->alang == 0 && $warn->slang == 0 && empty($warn->mlang))
			{
				unset($warnings[$index]);
			}

			if ($warn->alang == 0 && $warn->slang == $languages && empty($warn->mlang))
			{
				unset($warnings[$index]);
			}
		}

		return $warnings;
	}

	/**
	 * Method to get the status of the module displaying the menutype of the default Home page set to All languages.
	 *
	 * @return  boolean True if the module is published, false otherwise.
	 *
	 * @since   3.7.0
	 */
	public static function getDefaultHomeModule()
	{
		// Find Default Home menutype.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select($db->qn('menutype'))
			->from($db->qn('#__menu'))
			->where($db->qn('home') . ' = ' . $db->q('1'))
			->where($db->qn('published') . ' = ' . $db->q('1'))
			->where($db->qn('client_id') . ' = ' . $db->q('0'))
			->where($db->qn('language') . ' = ' . $db->q('*'));

		$db->setQuery($query);

		$menutype = $db->loadResult();

		// Get published site menu modules titles.
		$query->clear()
			->select($db->qn('title'))
			->from($db->qn('#__modules'))
			->where($db->qn('module') . ' = ' . $db->q('mod_menu'))
			->where($db->qn('published') . ' = ' . $db->q('1'))
			->where($db->qn('client_id') . ' = ' . $db->q('0'));

		$db->setQuery($query);

		$menutitles = $db->loadColumn();

		// Do we have a published menu module displaying the default Home menu item set to all languages?
		foreach ($menutitles as $menutitle)
		{
			$module       = self::getModule('mod_menu', $menutitle);
			$moduleParams = new JRegistry($module->params);
			$param        = $moduleParams->get('menutype', '');

			if ($param && $param != $menutype)
			{
				continue;
			}

			return true;
		}
	}

	/**
	 * Get module by name
	 *
	 * @param   string  $moduleName     The name of the module
	 * @param   string  $instanceTitle  The title of the module, optional
	 *
	 * @return  stdClass  The Module object
	 *
	 * @since   3.7.0
	 */
	public static function getModule($moduleName, $instanceTitle = null)
	{
		$db = JFactory::getDbo();

		$query = $db->getQuery(true)
			->select('id, title, module, position, content, showtitle, params')
			->from($db->qn('#__modules'))
			->where($db->qn('module') . ' = ' . $db->q($moduleName))
			->where($db->qn('published') . ' = ' . $db->q('1'))
			->where($db->qn('client_id') . ' = ' . $db->q('0'));

		if ($instanceTitle)
		{
			$query->where($db->qn('title') . ' = ' . $db->q($instanceTitle));
		}

		$db->setQuery($query);

		try
		{
			$modules = $db->loadObject();
		}
		catch (RuntimeException $e)
		{
			JLog::add(JText::sprintf('JLIB_APPLICATION_ERROR_MODULE_LOAD', $e->getMessage()), JLog::WARNING, 'jerror');
		}

		return $modules;
	}
}
components/com_languages/helpers/html/languages.php000060400000004020152453623450016623 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Utility class working with languages
 *
 * @since  1.6
 */
abstract class JHtmlLanguages
{
	/**
	 * Method to generate an information about the default language.
	 *
	 * @param   boolean  $published  True if the language is the default.
	 *
	 * @return  string	HTML code.
	 */
	public static function published($published)
	{
		if (!$published)
		{
			return '&#160;';
		}

		return JHtml::_('image', 'menu/icon-16-default.png', JText::_('COM_LANGUAGES_HEADING_DEFAULT'), null, true);
	}

	/**
	 * Method to generate an input radio button.
	 *
	 * @param   integer  $rowNum    The row number.
	 * @param   string   $language  Language tag.
	 *
	 * @return  string	HTML code.
	 */
	public static function id($rowNum, $language)
	{
		return '<input'
			. ' type="radio"'
			. ' id="cb' . $rowNum . '"'
			. ' name="cid"'
			. ' value="' . htmlspecialchars($language, ENT_COMPAT, 'UTF-8') . '"'
			. ' onclick="Joomla.isChecked(this.checked);"'
			. ' title="' . ($rowNum + 1) . '"'
			. '/>';
	}

	/**
	 * Method to generate an array of clients.
	 *
	 * @return  array of client objects.
	 */
	public static function clients()
	{
		return array(
			JHtml::_('select.option', 0, JText::_('JSITE')),
			JHtml::_('select.option', 1, JText::_('JADMINISTRATOR'))
		);
	}

	/**
	 * Returns an array of published state filter options.
	 *
	 * @return  string  	The HTML code for the select tag.
	 *
	 * @since   1.6
	 */
	public static function publishedOptions()
	{
		// Build the active state filter options.
		$options   = array();
		$options[] = JHtml::_('select.option', '1', 'JPUBLISHED');
		$options[] = JHtml::_('select.option', '0', 'JUNPUBLISHED');
		$options[] = JHtml::_('select.option', '-2', 'JTRASHED');
		$options[] = JHtml::_('select.option', '*', 'JALL');

		return $options;
	}
}
components/com_languages/helpers/jsonresponse.php000060400000005263152453623450016453 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * JSON Response class.
 *
 * @since       2.5
 * @deprecated  4.0
 */
class JJsonResponse
{
	/**
	 * Determines whether the request was successful.
	 *
	 * @var    boolean
	 * @since  2.5
	 */
	public $success = true;

	/**
	 * Determines whether the request wasn't successful.
	 * This is always the negation of $this->success,
	 * so you can use both flags equivalently.
	 *
	 * @var    boolean
	 * @since  2.5
	 */
	public $error = false;

	/**
	 * The main response message.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public $message = null;

	/**
	 * Array of messages gathered in the JApplication object.
	 *
	 * @var    array
	 * @since  2.5
	 */
	public $messages = null;

	/**
	 * The response data.
	 *
	 * @var    mixed
	 * @since  2.5
	 */
	public $data = null;

	/**
	 * Constructor
	 *
	 * @param   mixed    $response  The Response data.
	 * @param   string   $message   The main response message.
	 * @param   boolean  $error     True, if the success flag shall be set to false, defaults to false.
	 *
	 * @since		2.5
	 * @deprecated	4.0	 Use JResponseJson instead.
	 */
	public function __construct($response = null, $message = null, $error = false)
	{
		try
		{
			JLog::add(sprintf('%s is deprecated, use JResponseJson instead.', __CLASS__), JLog::WARNING, 'deprecated');
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		$this->message = $message;

		// Get the message queue.
		$messages = JFactory::getApplication()->getMessageQueue();

		// Build the sorted messages list.
		if (is_array($messages) && count($messages))
		{
			foreach ($messages as $message)
			{
				if (isset($message['type']) && isset($message['message']))
				{
					$lists[$message['type']][] = $message['message'];
				}
			}
		}

		// If messages exist add them to the output.
		if (isset($lists) && is_array($lists))
		{
			$this->messages = $lists;
		}

		// Check if we are dealing with an error.
		if ($response instanceof Exception)
		{
			// Prepare the error response.
			$this->success = false;
			$this->error   = true;
			$this->message = $response->getMessage();
		}
		else
		{
			// Prepare the response data.
			$this->success = !$error;
			$this->error   = $error;
			$this->data    = $response;
		}
	}

	/**
	 * Magic toString method for sending the response in JSON format.
	 *
	 * @return  string  The response in JSON format.
	 *
	 * @since   2.5
	 */
	public function __toString()
	{
		return json_encode($this);
	}
}
components/com_languages/helpers/languages.php000060400000005657152453623450015700 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Languages component helper.
 *
 * @since  1.6
 */
class LanguagesHelper
{
	/**
	 * Configure the Linkbar.
	 *
	 * @param   string  $vName   The name of the active view.
	 * @param   int     $client  The client id of the active view. Maybe be 0 or 1.
	 *
	 * @return  void
	 *
	 * @deprecated  4.0 $client parameter is not needed anymore.
	 */
	public static function addSubmenu($vName, $client = 0)
	{
		JHtmlSidebar::addEntry(
			JText::_('COM_LANGUAGES_SUBMENU_INSTALLED'),
			'index.php?option=com_languages&view=installed',
			$vName == 'installed'
		);
		JHtmlSidebar::addEntry(
			JText::_('COM_LANGUAGES_SUBMENU_CONTENT'),
			'index.php?option=com_languages&view=languages',
			$vName == 'languages'
		);
		JHtmlSidebar::addEntry(
			JText::_('COM_LANGUAGES_SUBMENU_OVERRIDES'),
			'index.php?option=com_languages&view=overrides',
			$vName == 'overrides'
		);
	}

	/**
	 * Gets a list of the actions that can be performed.
	 *
	 * @return  JObject
	 *
	 * @deprecated  3.2  Use JHelperContent::getActions() instead.
	 */
	public static function getActions()
	{
		// 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('com_languages');
	}

	/**
	 * Method for parsing ini files.
	 *
	 * @param   string  $fileName  Path and name of the ini file to parse.
	 *
	 * @return  array   Array of strings found in the file, the array indices will be the keys. On failure an empty array will be returned.
	 *
	 * @since   2.5
	 * @deprecated   3.9.0 Use JLanguageHelper::parseIniFile() instead.
	 */
	public static function parseFile($fileName)
	{
		return JLanguageHelper::parseIniFile($fileName);
	}

	/**
	 * Filter method for language keys.
	 * This method will be called by JForm while filtering the form data.
	 *
	 * @param   string  $value  The language key to filter.
	 *
	 * @return  string	The filtered language key.
	 *
	 * @since		2.5
	 */
	public static function filterKey($value)
	{
		$filter = JFilterInput::getInstance(null, null, 1, 1);

		return strtoupper($filter->clean($value, 'cmd'));
	}

	/**
	 * Filter method for language strings.
	 * This method will be called by JForm while filtering the form data.
	 *
	 * @param   string  $value  The language string to filter.
	 *
	 * @return  string	The filtered language string.
	 *
	 * @since		2.5
	 */
	public static function filterText($value)
	{
		$filter = JFilterInput::getInstance(null, null, 1, 1);

		return $filter->clean($value);
	}
}
components/com_languages/languages.xml000060400000002015152453623450014230 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_languages</name>
	<author>Joomla! Project</author>
	<creationDate>April 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_LANGUAGES_XML_DESCRIPTION</description>
	<administration>
		<files folder="admin">
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<filename>languages.php</filename>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>tables</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_languages.ini</language>
			<language tag="en-GB">language/en-GB.com_languages.sys.ini</language>
		</languages>
	</administration>
</extension>

components/com_languages/languages.php000060400000001134152453623450014220 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
JHtml::_('behavior.tabstate');

if (!JFactory::getUser()->authorise('core.manage', 'com_languages'))
{
	throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
}

$controller = JControllerLegacy::getInstance('Languages');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
components/com_languages/models/overrides.php000060400000014716152453623450015551 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Languages Overrides Model
 *
 * @since  2.5
 */
class LanguagesModelOverrides extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @since   2.5
	 */
	public function __construct($config = array())
	{
		parent::__construct($config);

		$this->filter_fields = array('key', 'text');
	}

	/**
	 * Retrieves the overrides data
	 *
	 * @param   boolean  $all  True if all overrides shall be returned without considering pagination, defaults to false
	 *
	 * @return  array  Array of objects containing the overrides of the override.ini file
	 *
	 * @since   2.5
	 */
	public function getOverrides($all = false)
	{
		// Get a storage key.
		$store = $this->getStoreId();

		// Try to load the data from internal storage.
		if (!empty($this->cache[$store]))
		{
			return $this->cache[$store];
		}

		$client = strtoupper($this->getState('filter.client'));

		// Parse the override.ini file in order to get the keys and strings.
		$fileName = constant('JPATH_' . $client) . '/language/overrides/' . $this->getState('filter.language') . '.override.ini';
		$strings  = JLanguageHelper::parseIniFile($fileName);

		// Delete the override.ini file if empty.
		if (file_exists($fileName) && $strings === array())
		{
			JFile::delete($fileName);
		}

		// Filter the loaded strings according to the search box.
		$search = $this->getState('filter.search');

		if ($search != '')
		{
			$search = preg_quote($search, '~');
			$matchvals = preg_grep('~' . $search . '~i', $strings);
			$matchkeys = array_intersect_key($strings, array_flip(preg_grep('~' . $search . '~i',  array_keys($strings))));
			$strings = array_merge($matchvals, $matchkeys);
		}

		// Consider the ordering
		if ($this->getState('list.ordering') == 'text')
		{
			if (strtoupper($this->getState('list.direction')) == 'DESC')
			{
				arsort($strings);
			}
			else
			{
				asort($strings);
			}
		}
		else
		{
			if (strtoupper($this->getState('list.direction')) == 'DESC')
			{
				krsort($strings);
			}
			else
			{
				ksort($strings);
			}
		}

		// Consider the pagination.
		if (!$all && $this->getState('list.limit') && $this->getTotal() > $this->getState('list.limit'))
		{
			$strings = array_slice($strings, $this->getStart(), $this->getState('list.limit'), true);
		}

		// Add the items to the internal cache.
		$this->cache[$store] = $strings;

		return $this->cache[$store];
	}

	/**
	 * Method to get the total number of overrides.
	 *
	 * @return  integer  The total number of overrides.
	 *
	 * @since   2.5
	 */
	public function getTotal()
	{
		// Get a storage key.
		$store = $this->getStoreId('getTotal');

		// Try to load the data from internal storage
		if (!empty($this->cache[$store]))
		{
			return $this->cache[$store];
		}

		// Add the total to the internal cache.
		$this->cache[$store] = count($this->getOverrides(true));

		return $this->cache[$store];
	}

	/**
	 * 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   2.5
	 */
	protected function populateState($ordering = 'key', $direction = 'asc')
	{
		// We call populate state first so that we can then set the filter.client and filter.language properties in afterwards
		parent::populateState($ordering, $direction);

		$app = JFactory::getApplication();

		$language_client = $this->getUserStateFromRequest('com_languages.overrides.language_client', 'language_client', '', 'cmd');
		$client          = substr($language_client, -1);
		$language        = substr($language_client, 0, -1);

		// Sets the search filter.
		$search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		$this->setState('language_client', $language . $client);
		$this->setState('filter.client', $client ? 'administrator' : 'site');
		$this->setState('filter.language', $language);

		// Add the 'language_client' value to the session to display a message if none selected
		$app->setUserState('com_languages.overrides.language_client', $language . $client);

		// Add filters to the session because they won't be stored there by 'getUserStateFromRequest' if they aren't in the current request.
		$app->setUserState('com_languages.overrides.filter.client', $client);
		$app->setUserState('com_languages.overrides.filter.language', $language);
	}

	/**
	 * Method to delete one or more overrides.
	 *
	 * @param   array  $cids  Array of keys to delete.
	 *
	 * @return  integer  Number of successfully deleted overrides, boolean false if an error occurred.
	 *
	 * @since   2.5
	 */
	public function delete($cids)
	{
		// Check permissions first.
		if (!JFactory::getUser()->authorise('core.delete', 'com_languages'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_DELETE_NOT_PERMITTED'));

			return false;
		}

		jimport('joomla.filesystem.file');

		$filterclient = JFactory::getApplication()->getUserState('com_languages.overrides.filter.client');
		$client = $filterclient == 0 ? 'SITE' : 'ADMINISTRATOR';

		// Parse the override.ini file in oder to get the keys and strings.
		$fileName = constant('JPATH_' . $client) . '/language/overrides/' . $this->getState('filter.language') . '.override.ini';
		$strings  = JLanguageHelper::parseIniFile($fileName);

		// Unset strings that shall be deleted
		foreach ($cids as $key)
		{
			if (isset($strings[$key]))
			{
				unset($strings[$key]);
			}
		}

		// Write override.ini file with the strings.
		if (JLanguageHelper::saveToIniFile($fileName, $strings) === false)
		{
			return false;
		}

		$this->cleanCache();

		return count($cids);
	}

	/**
	 * Removes all of the cached strings from the table.
	 *
	 * @return  boolean  result of operation
	 *
	 * @since   3.4.2
	 */
	public function purge()
	{
		$db = JFactory::getDbo();

		// Note: TRUNCATE is a DDL operation
		// This may or may not mean depending on your database
		try
		{
			$db->truncateTable('#__overrider');
		}
		catch (RuntimeException $e)
		{
			return $e;
		}

		JFactory::getApplication()->enqueueMessage(JText::_('COM_LANGUAGES_VIEW_OVERRIDES_PURGE_SUCCESS'));
	}
}
components/com_languages/models/strings.php000060400000010436152453623450015233 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Languages Strings Model
 *
 * @since  2.5
 */
class LanguagesModelStrings extends JModelLegacy
{
	/**
	 * Method for refreshing the cache in the database with the known language strings.
	 *
	 * @return  boolean  True on success, Exception object otherwise.
	 *
	 * @since		2.5
	 */
	public function refresh()
	{
		JLoader::register('LanguagesHelper', JPATH_ADMINISTRATOR . '/components/com_languages/helpers/languages.php');

		$app = JFactory::getApplication();

		$app->setUserState('com_languages.overrides.cachedtime', null);

		// Empty the database cache first.
		try
		{
			$this->_db->setQuery('TRUNCATE TABLE ' . $this->_db->quoteName('#__overrider'));
			$this->_db->execute();
		}
		catch (RuntimeException $e)
		{
			return $e;
		}

		// Create the insert query.
		$query = $this->_db->getQuery(true)
			->insert($this->_db->quoteName('#__overrider'))
			->columns('constant, string, file');

		// Initialize some variables.
		$client   = $app->getUserState('com_languages.overrides.filter.client', 'site') ? 'administrator' : 'site';
		$language = $app->getUserState('com_languages.overrides.filter.language', 'en-GB');

		$base = constant('JPATH_' . strtoupper($client));
		$path = $base . '/language/' . $language;

		$files = array();

		// Parse common language directory.
		jimport('joomla.filesystem.folder');

		if (is_dir($path))
		{
			$files = JFolder::files($path, '.*ini$', false, true);
		}

		// Parse language directories of components.
		$files = array_merge($files, JFolder::files($base . '/components', '.*ini$', 3, true));

		// Parse language directories of modules.
		$files = array_merge($files, JFolder::files($base . '/modules', '.*ini$', 3, true));

		// Parse language directories of templates.
		$files = array_merge($files, JFolder::files($base . '/templates', '.*ini$', 3, true));

		// Parse language directories of plugins.
		$files = array_merge($files, JFolder::files(JPATH_PLUGINS, '.*ini$', 4, true));

		// Parse all found ini files and add the strings to the database cache.
		foreach ($files as $file)
		{
			$strings = LanguagesHelper::parseFile($file);

			if ($strings && count($strings))
			{
				$query->clear('values');

				foreach ($strings as $key => $string)
				{
					$query->values($this->_db->quote($key) . ',' . $this->_db->quote($string) . ',' . $this->_db->quote(JPath::clean($file)));
				}

				try
				{
					$this->_db->setQuery($query);
					$this->_db->execute();
				}
				catch (RuntimeException $e)
				{
					return $e;
				}
			}
		}

		// Update the cached time.
		$app->setUserState('com_languages.overrides.cachedtime.' . $client . '.' . $language, time());

		return true;
	}

	/**
	 * Method for searching language strings.
	 *
	 * @return  array  Array of results on success, Exception object otherwise.
	 *
	 * @since		2.5
	 */
	public function search()
	{
		$results = array();
		$input   = JFactory::getApplication()->input;
		$filter  = JFilterInput::getInstance();
		$searchTerm = $input->getString('searchstring');

		$limitstart = $input->getInt('more');

		try
		{
			$searchstring = $this->_db->quote('%' . $filter->clean($searchTerm, 'TRIM') . '%');

			// Create the search query.
			$query = $this->_db->getQuery(true)
				->select('constant, string, file')
				->from($this->_db->quoteName('#__overrider'));

			if ($input->get('searchtype') == 'constant')
			{
				$query->where('constant LIKE ' . $searchstring);
			}
			else
			{
				$query->where('string LIKE ' . $searchstring);
			}

			// Consider the limitstart according to the 'more' parameter and load the results.
			$this->_db->setQuery($query, $limitstart, 10);
			$results['results'] = $this->_db->loadObjectList();

			// Check whether there are more results than already loaded.
			$query->clear('select')->clear('limit')
				->select('COUNT(id)');
			$this->_db->setQuery($query);

			if ($this->_db->loadResult() > $limitstart + 10)
			{
				// If this is set a 'More Results' link will be displayed in the view.
				$results['more'] = $limitstart + 10;
			}
		}
		catch (RuntimeException $e)
		{
			return $e;
		}

		return $results;
	}
}
components/com_languages/models/language.php000060400000014016152453623450015323 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Languages Component Language Model
 *
 * @since  1.5
 */
class LanguagesModelLanguage extends JModelAdmin
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 */
	public function __construct($config = array())
	{
		$config = array_merge(
			array(
				'event_after_save'  => 'onExtensionAfterSave',
				'event_before_save' => 'onExtensionBeforeSave',
				'events_map'        => array(
					'save' => 'extension'
				)
			), $config
		);

		parent::__construct($config);
	}

	/**
	 * Override to get the table.
	 *
	 * @param   string  $name     Name of the table.
	 * @param   string  $prefix   Table name prefix.
	 * @param   array   $options  Array of options.
	 *
	 * @return  JTable
	 *
	 * @since   1.6
	 */
	public function getTable($name = '', $prefix = '', $options = array())
	{
		return JTable::getInstance('Language');
	}

	/**
	 * 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()
	{
		$app    = JFactory::getApplication('administrator');
		$params = JComponentHelper::getParams('com_languages');

		// Load the User state.
		$langId = $app->input->getInt('lang_id');
		$this->setState('language.id', $langId);

		// Load the parameters.
		$this->setState('params', $params);
	}

	/**
	 * Method to get a member item.
	 *
	 * @param   integer  $langId  The id of the member to get.
	 *
	 * @return  mixed  User data object on success, false on failure.
	 *
	 * @since   1.0
	 */
	public function getItem($langId = null)
	{
		$langId = (!empty($langId)) ? $langId : (int) $this->getState('language.id');

		// Get a member row instance.
		$table = $this->getTable();

		// Attempt to load the row.
		$return = $table->load($langId);

		// Check for a table object error.
		if ($return === false && $table->getError())
		{
			$this->setError($table->getError());

			return false;
		}

		// Set a valid accesslevel in case '0' is stored due to a bug in the installation SQL (was fixed with PR 2714).
		if ($table->access == '0')
		{
			$table->access = (int) JFactory::getConfig()->get('access');
		}

		$properties = $table->getProperties(1);
		$value      = ArrayHelper::toObject($properties, 'JObject');

		return $value;
	}

	/**
	 * Method to get the group 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  mixed  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_languages.language', 'language', 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_languages.edit.language.data', array());

		if (empty($data))
		{
			$data = $this->getItem();
		}

		$this->preprocessData('com_languages.language', $data);

		return $data;
	}

	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function save($data)
	{
		$langId = (!empty($data['lang_id'])) ? $data['lang_id'] : (int) $this->getState('language.id');
		$isNew  = true;

		$dispatcher = JEventDispatcher::getInstance();
		JPluginHelper::importPlugin($this->events_map['save']);

		$table   = $this->getTable();
		$context = $this->option . '.' . $this->name;

		// Load the row if saving an existing item.
		if ($langId > 0)
		{
			$table->load($langId);
			$isNew = false;
		}

		// Prevent white spaces, including East Asian double bytes.
		$spaces = array('/\xE3\x80\x80/', ' ');

		$data['lang_code'] = str_replace($spaces, '', $data['lang_code']);

		// Prevent saving an incorrect language tag
		if (!preg_match('#\b([a-z]{2,3})[-]([A-Z]{2})\b#', $data['lang_code']))
		{
			$this->setError(JText::_('COM_LANGUAGES_ERROR_LANG_TAG'));

			return false;
		}

		$data['sef'] = str_replace($spaces, '', $data['sef']);
		$data['sef'] = JApplicationHelper::stringURLSafe($data['sef']);

		// Prevent saving an empty url language code
		if ($data['sef'] === '')
		{
			$this->setError(JText::_('COM_LANGUAGES_ERROR_SEF'));

			return false;
		}

		// Bind the data.
		if (!$table->bind($data))
		{
			$this->setError($table->getError());

			return false;
		}

		// 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));

		// Check the event responses.
		if (in_array(false, $result, true))
		{
			$this->setError($table->getError());

			return false;
		}

		// Store the data.
		if (!$table->store())
		{
			$this->setError($table->getError());

			return false;
		}

		// Trigger the after save event.
		$dispatcher->trigger($this->event_after_save, array($context, &$table, $isNew));

		$this->setState('language.id', $table->lang_id);

		// Clean the cache.
		$this->cleanCache();

		return true;
	}

	/**
	 * Custom clean cache method.
	 *
	 * @param   string   $group     Optional cache group name.
	 * @param   integer  $clientId  Application client id.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function cleanCache($group = null, $clientId = 0)
	{
		parent::cleanCache('_system');
		parent::cleanCache('com_languages');
	}
}
components/com_languages/models/override.php000060400000014046152453623450015362 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Languages Override Model
 *
 * @since  2.5
 */
class LanguagesModelOverride extends JModelAdmin
{
	/**
	 * 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  mixed A JForm object on success, false on failure.
	 *
	 * @since   2.5
	 */
	public function getForm($data = array(), $loadData = true)
	{
		// Get the form.
		$form = $this->loadForm('com_languages.override', 'override', array('control' => 'jform', 'load_data' => $loadData));

		if (empty($form))
		{
			return false;
		}

		$client   = $this->getState('filter.client', 'site');
		$language = $this->getState('filter.language', 'en-GB');
		$langName = JLanguage::getInstance($language)->getName();

		if (!$langName)
		{
			// If a language only exists in frontend, its metadata cannot be
			// loaded in backend at the moment, so fall back to the language tag.
			$langName = $language;
		}

		$form->setValue('client', null, JText::_('COM_LANGUAGES_VIEW_OVERRIDE_CLIENT_' . strtoupper($client)));
		$form->setValue('language', null, JText::sprintf('COM_LANGUAGES_VIEW_OVERRIDE_LANGUAGE', $langName, $language));
		$form->setValue('file', null, JPath::clean(constant('JPATH_' . strtoupper($client)) . '/language/overrides/' . $language . '.override.ini'));

		return $form;
	}

	/**
	 * Method to get the data that should be injected in the form.
	 *
	 * @return  mixed The data for the form.
	 *
	 * @since   2.5
	 */
	protected function loadFormData()
	{
		// Check the session for previously entered form data.
		$data = JFactory::getApplication()->getUserState('com_languages.edit.override.data', array());

		if (empty($data))
		{
			$data = $this->getItem();
		}

		$this->preprocessData('com_languages.override', $data);

		return $data;
	}

	/**
	 * Method to get a single record.
	 *
	 * @param   string  $pk  The key name.
	 *
	 * @return  mixed  	Object on success, false otherwise.
	 *
	 * @since   2.5
	 */
	public function getItem($pk = null)
	{
		$input    = JFactory::getApplication()->input;
		$pk       = !empty($pk) ? $pk : $input->get('id');
		$fileName = constant('JPATH_' . strtoupper($this->getState('filter.client')))
			. '/language/overrides/' . $this->getState('filter.language', 'en-GB') . '.override.ini';
		$strings  = JLanguageHelper::parseIniFile($fileName);

		$result = new stdClass;
		$result->key      = '';
		$result->override = '';

		if (isset($strings[$pk]))
		{
			$result->key      = $pk;
			$result->override = $strings[$pk];
		}

		$oppositeFileName = constant('JPATH_' . strtoupper($this->getState('filter.client') == 'site' ? 'administrator' : 'site'))
			. '/language/overrides/' . $this->getState('filter.language', 'en-GB') . '.override.ini';
		$oppositeStrings  = JLanguageHelper::parseIniFile($oppositeFileName);
		$result->both = isset($oppositeStrings[$pk]) && ($oppositeStrings[$pk] == $strings[$pk]);

		return $result;
	}

	/**
	 * Method to save the form data.
	 *
	 * @param   array    $data            The form data.
	 * @param   boolean  $oppositeClient  Indicates whether the override should not be created for the current client.
	 *
	 * @return  boolean  True on success, false otherwise.
	 *
	 * @since   2.5
	 */
	public function save($data, $oppositeClient = false)
	{
		jimport('joomla.filesystem.file');

		$app = JFactory::getApplication();

		$client   = $app->getUserState('com_languages.overrides.filter.client', 0);
		$language = $app->getUserState('com_languages.overrides.filter.language', 'en-GB');

		// If the override should be created for both.
		if ($oppositeClient)
		{
			$client = 1 - $client;
		}

		// Return false if the constant is a reserved word, i.e. YES, NO, NULL, FALSE, ON, OFF, NONE, TRUE
		$blacklist = array('YES', 'NO', 'NULL', 'FALSE', 'ON', 'OFF', 'NONE', 'TRUE');

		if (in_array($data['key'], $blacklist))
		{
			$this->setError(JText::_('COM_LANGUAGES_OVERRIDE_ERROR_RESERVED_WORDS'));

			return false;
		}

		$client = $client ? 'administrator' : 'site';

		// Parse the override.ini file in oder to get the keys and strings.
		$fileName = constant('JPATH_' . strtoupper($client)) . '/language/overrides/' . $language . '.override.ini';
		$strings  = JLanguageHelper::parseIniFile($fileName);

		if (isset($strings[$data['id']]))
		{
			// If an existent string was edited check whether
			// the name of the constant is still the same.
			if ($data['key'] == $data['id'])
			{
				// If yes, simply override it.
				$strings[$data['key']] = $data['override'];
			}
			else
			{
				// If no, delete the old string and prepend the new one.
				unset($strings[$data['id']]);
				$strings = array($data['key'] => $data['override']) + $strings;
			}
		}
		else
		{
			// If it is a new override simply prepend it.
			$strings = array($data['key'] => $data['override']) + $strings;
		}

		// Write override.ini file with the strings.
		if (JLanguageHelper::saveToIniFile($fileName, $strings) === false)
		{
			return false;
		}

		// If the override should be stored for both clients save
		// it also for the other one and prevent endless recursion.
		if (isset($data['both']) && $data['both'] && !$oppositeClient)
		{
			return $this->save($data, true);
		}

		return true;
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	protected function populateState()
	{
		$app = JFactory::getApplication();

		$client = $app->getUserStateFromRequest('com_languages.overrides.filter.client', 'filter_client', 0, 'int') ? 'administrator' : 'site';
		$this->setState('filter.client', $client);

		$language = $app->getUserStateFromRequest('com_languages.overrides.filter.language', 'filter_language', 'en-GB', 'cmd');
		$this->setState('filter.language', $language);
	}
}
components/com_languages/models/forms/language.xml000060400000005063152453623450016464 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<field 
			name="lang_id" 
			type="text"
			label="JGLOBAL_FIELD_ID_LABEL"
			description="JGLOBAL_FIELD_ID_DESC"
			class="readonly"
			default="0"
			readonly="true"
		/>

		<field 
			name="lang_code" 
			type="text"
			label="COM_LANGUAGES_FIELD_LANG_TAG_LABEL"
			description="COM_LANGUAGES_FIELD_LANG_TAG_DESC"
			maxlength="7"
			required="true"
			size="10"
		/>

		<field 
			name="title"
			type="text"
			label="JGLOBAL_TITLE"
			description="COM_LANGUAGES_FIELD_TITLE_DESC"
			maxlength="50"
			required="true"
			size="40"
		/>

		<field 
			name="title_native"
			type="text"
			label="COM_LANGUAGES_FIELD_TITLE_NATIVE_LABEL"
			description="COM_LANGUAGES_FIELD_TITLE_NATIVE_DESC"
			maxlength="50"
			required="true"
			size="40"
		/>

		<field 
			name="sef" 
			type="text"
			label="COM_LANGUAGES_FIELD_LANG_CODE_LABEL"
			description="COM_LANGUAGES_FIELD_LANG_CODE_DESC"
			maxlength="50"
			required="true"
			size="10"
		/>

		<field
			name="image"
			type="filelist"
			label="COM_LANGUAGES_FIELD_IMAGE_LABEL"
			description="COM_LANGUAGES_FIELD_IMAGE_DESC"
			stripext="1"
			directory="media/mod_languages/images/"
			hide_none="1"
			hide_default="1"
			filter="\.gif$"
			size="10"
			>
			<option value="">JNONE</option>
		</field>

		<field 
			name="description" 
			type="textarea"
			label="JGLOBAL_DESCRIPTION"
			description="COM_LANGUAGES_FIELD_DESCRIPTION_DESC"
			cols="80"
			rows="5"
		/>

		<field 
			name="published" 
			type="list"
			label="JSTATUS"
			description="COM_LANGUAGES_FIELD_PUBLISHED_DESC"
			default="1"
			size="1"
			>
			<option value="1">JPUBLISHED</option>
			<option value="0">JUNPUBLISHED</option>
			<option value="-2">JTRASHED</option>
		</field>
		
		<field 
			name="access" 
			type="accesslevel"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			size="1"
		/>
	</fieldset>
	<fieldset name="metadata" label="JGLOBAL_FIELDSET_METADATA_OPTIONS">
		<field 
			name="metakey" 
			type="textarea"
			label="JFIELD_META_KEYWORDS_LABEL"
			description="JFIELD_META_KEYWORDS_DESC"
			rows="3"
			cols="30"
		/>

		<field 
			name="metadesc" 
			type="textarea"
			label="JFIELD_META_DESCRIPTION_LABEL"
			description="JFIELD_META_DESCRIPTION_DESC"
			rows="3"
			cols="30"
		/>
	</fieldset>
	<fieldset name="site_name" label="COM_LANGUAGES_FIELDSET_SITE_NAME_LABEL">
		<field 
			name="sitename" 
			type="text"
			label="COM_LANGUAGES_FIELD_SITE_NAME_LABEL"
			description="COM_LANGUAGES_FIELD_SITE_NAME_DESC"
			filter="string"
			size="50"
		/>
	</fieldset>
</form>
components/com_languages/models/forms/filter_overrides.xml000060400000001220152453623450020237 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<field
		name="language_client"
		type="languageclient"
		onchange="this.form.submit();"
		>
		<option value="">COM_LANGUAGES_OVERRIDE_SELECT_LANGUAGE</option>
	</field>

	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="JSEARCH_FILTER"
			description="COM_LANGUAGES_VIEW_OVERRIDES_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
		/>

	</fields>
	<fields name="list">
		<field
			name="limit"
			type="limitbox"
			label="JGLOBAL_LIMIT"
			description="JGLOBAL_LIMIT"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_languages/models/forms/override.xml000060400000003737152453623450016526 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<field
			name="key"
			type="text"
			label="COM_LANGUAGES_OVERRIDE_FIELD_KEY_LABEL"
			description="COM_LANGUAGES_OVERRIDE_FIELD_KEY_DESC"
			size="60"
			required="true"
			filter="LanguagesHelper::filterKey" 
		/>

		<field
			name="override"
			type="textarea"
			label="COM_LANGUAGES_OVERRIDE_FIELD_OVERRIDE_LABEL"
			description="COM_LANGUAGES_OVERRIDE_FIELD_OVERRIDE_DESC"
			cols="50"
			rows="5"
			filter="LanguagesHelper::filterText" 
		/>

		<field
			name="both"
			type="checkbox"
			label="COM_LANGUAGES_OVERRIDE_FIELD_BOTH_LABEL"
			description="COM_LANGUAGES_OVERRIDE_FIELD_BOTH_DESC"
			value="true"
			filter="boolean" 
		/>

		<field
			name="searchstring"
			type="text"
			label="COM_LANGUAGES_OVERRIDE_FIELD_SEARCHSTRING_LABEL"
			description="COM_LANGUAGES_OVERRIDE_FIELD_SEARCHSTRING_DESC"
			size="50"
		/>

		<field
			name="searchtype"
			type="list"
			label="COM_LANGUAGES_OVERRIDE_FIELD_SEARCHTYPE_LABEL"
			description="COM_LANGUAGES_OVERRIDE_FIELD_SEARCHTYPE_DESC"
			default="value"
			>
			<option value="constant">COM_LANGUAGES_OVERRIDE_FIELD_SEARCHTYPE_CONSTANT</option>
			<option value="value">COM_LANGUAGES_OVERRIDE_FIELD_SEARCHTYPE_TEXT</option>
		</field>

		<field 
			name="language" 
			type="text"
			label="COM_LANGUAGES_OVERRIDE_FIELD_LANGUAGE_LABEL"
			description="COM_LANGUAGES_OVERRIDE_FIELD_LANGUAGE_DESC"
			filter="unset"
			readonly="true"
			class="readonly"
			size="50"
		/>

		<field 
			name="client" 
			type="text"
			label="COM_LANGUAGES_OVERRIDE_FIELD_CLIENT_LABEL"
			description="COM_LANGUAGES_OVERRIDE_FIELD_CLIENT_DESC"
			filter="unset"
			readonly="true"
			class="readonly"
			size="50"
		/>

		<field 
			name="file" 
			type="text"
			label="COM_LANGUAGES_OVERRIDE_FIELD_FILE_LABEL"
			description="COM_LANGUAGES_OVERRIDE_FIELD_FILE_DESC"
			filter="unset"
			readonly="true"
			class="readonly"
			size="80"
		/>

		<field
			name="id"
			type="hidden"
		/>
	</fieldset>
</form>
components/com_languages/models/forms/filter_installed.xml000060400000004601152453623450020222 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<field
		name="client_id"
		type="list"
		onchange="jQuery('#filter_search, select[id^=filter_], #list_fullordering').val('');this.form.submit();"
		filtermode="selector"
		>
		<option value="0">JSITE</option>
		<option value="1">JADMINISTRATOR</option>
	</field>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_LANGUAGES_INSTALLED_FILTER_SEARCH_LABEL"
			description="COM_LANGUAGES_INSTALLED_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
			noresults="JGLOBAL_NO_MATCHING_RESULTS"
		/>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="name ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="name ASC">COM_LANGUAGES_HEADING_LANGUAGE_ASC</option>
			<option value="name DESC">COM_LANGUAGES_HEADING_LANGUAGE_DESC</option>
			<option value="nativeName ASC">COM_LANGUAGES_HEADING_TITLE_NATIVE_ASC</option>
			<option value="nativeName DESC">COM_LANGUAGES_HEADING_TITLE_NATIVE_DESC</option>
			<option value="language ASC">COM_LANGUAGES_HEADING_LANG_TAG_ASC</option>
			<option value="language DESC">COM_LANGUAGES_HEADING_LANG_TAG_DESC</option>
			<option value="published ASC">COM_LANGUAGES_HEADING_DEFAULT_ASC</option>
			<option value="published DESC">COM_LANGUAGES_HEADING_DEFAULT_DESC</option>
			<option value="version ASC">COM_LANGUAGES_HEADING_VERSION_ASC</option>
			<option value="version DESC">COM_LANGUAGES_HEADING_VERSION_DESC</option>
			<option value="creationDate ASC">COM_LANGUAGES_HEADING_DATE_ASC</option>
			<option value="creationDate DESC">COM_LANGUAGES_HEADING_DATE_DESC</option>
			<option value="author ASC">COM_LANGUAGES_HEADING_AUTHOR_ASC</option>
			<option value="author DESC">COM_LANGUAGES_HEADING_AUTHOR_DESC</option>
			<option value="authorEmail ASC">COM_LANGUAGES_HEADING_AUTHOR_EMAIL_ASC</option>
			<option value="authorEmail DESC">COM_LANGUAGES_HEADING_AUTHOR_EMAIL_DESC</option>
			<option value="extension_id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="extension_id DESC">JGRID_HEADING_ID_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			label="JGLOBAL_LIMIT"
			description="JGLOBAL_LIMIT"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_languages/models/forms/filter_languages.xml000060400000004637152453623450020222 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="JSEARCH_FILTER"
			description="COM_LANGUAGES_SEARCH_IN_TITLE"
			hint="JSEARCH_FILTER"
		/>
		<field
			name="published"
			type="status"
			filter="1,0,-2,*"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>
		<field
			name="access"
			type="accesslevel"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_ACCESS</option>
		</field>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="a.ordering ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.published ASC">JSTATUS_ASC</option>
			<option value="a.published DESC">JSTATUS_DESC</option>
			<option value="a.title ASC">JGLOBAL_TITLE_ASC</option>
			<option value="a.title DESC">JGLOBAL_TITLE_DESC</option>
			<option value="a.title_native ASC">COM_LANGUAGES_HEADING_TITLE_NATIVE_ASC</option>
			<option value="a.title_native DESC">COM_LANGUAGES_HEADING_TITLE_NATIVE_DESC</option>
			<option value="a.lang_code ASC">COM_LANGUAGES_HEADING_LANG_TAG_ASC</option>
			<option value="a.lang_code DESC">COM_LANGUAGES_HEADING_LANG_TAG_DESC</option>
			<option value="a.sef ASC">COM_LANGUAGES_HEADING_LANG_CODE_ASC</option>
			<option value="a.sef DESC">COM_LANGUAGES_HEADING_LANG_CODE_DESC</option>
			<option value="a.image ASC">COM_LANGUAGES_HEADING_LANG_IMAGE_ASC</option>
			<option value="a.image DESC">COM_LANGUAGES_HEADING_LANG_IMAGE_DESC</option>
			<option value="a.access ASC">JGRID_HEADING_ACCESS_ASC</option>
			<option value="a.access DESC">JGRID_HEADING_ACCESS_DESC</option>
			<option value="l.home ASC">COM_LANGUAGES_HEADING_HOMEPAGE_ASC</option>
			<option value="l.home DESC">COM_LANGUAGES_HEADING_HOMEPAGE_DESC</option>
			<option value="a.lang_id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.lang_id DESC">JGRID_HEADING_ID_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			label="JGLOBAL_LIMIT"
			description="JGLOBAL_LIMIT"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_languages/models/fields/languageclient.php000060400000003361152453623450017771 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_newsfeeds
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JFormHelper::loadFieldClass('list');

/**
 * Client Language List field.
 *
 * @since  3.9.0
 */
class JFormFieldLanguageclient extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var		string
	 * @since   3.9.0
	 */
	protected $type = 'Languageclient';

	/**
	 * Cached form field options.
	 *
	 * @var		array
	 * @since   3.9.0
	 */
	protected $cache = array();

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   3.9.0
	 */
	protected function getOptions()
	{
		// Try to load the data from our mini-cache.
		if (!empty($this->cache))
		{
			return $this->cache;
		}

		// Get all languages of frontend and backend.
		$languages       = array();
		$site_languages  = JLanguageHelper::getKnownLanguages(JPATH_SITE);
		$admin_languages = JLanguageHelper::getKnownLanguages(JPATH_ADMINISTRATOR);

		// Create a single array of them.
		foreach ($site_languages as $tag => $language)
		{
			$languages[$tag . '0'] = JText::sprintf('COM_LANGUAGES_VIEW_OVERRIDES_LANGUAGES_BOX_ITEM', $language['name'], JText::_('JSITE'));
		}

		foreach ($admin_languages as $tag => $language)
		{
			$languages[$tag . '1'] = JText::sprintf('COM_LANGUAGES_VIEW_OVERRIDES_LANGUAGES_BOX_ITEM', $language['name'], JText::_('JADMINISTRATOR'));
		}

		// Sort it by language tag and by client after that.
		ksort($languages);

		// Add the languages to the internal cache.
		$this->cache = array_merge(parent::getOptions(), $languages);

		return $this->cache;
	}
}
components/com_languages/models/installed.php000060400000024573152453623450015530 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Languages Component Languages Model
 *
 * @since  1.6
 */
class LanguagesModelInstalled extends JModelList
{
	/**
	 * @var object client object
	 * @deprecated 4.0
	 */
	protected $client = null;

	/**
	 * @var object user object
	 */
	protected $user = null;

	/**
	 * @var boolean|JExeption True, if FTP settings should be shown, or an exception
	 */
	protected $ftp = null;

	/**
	 * @var string option name
	 */
	protected $option = null;

	/**
	 * @var array languages description
	 */
	protected $data = null;

	/**
	 * @var int total number of languages
	 */
	protected $total = null;

	/**
	 * @var int total number of languages installed
	 * @deprecated 4.0
	 */
	protected $langlist = null;

	/**
	 * @var string language path
	 */
	protected $path = null;

	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   3.5
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'name',
				'nativeName',
				'language',
				'author',
				'published',
				'version',
				'creationDate',
				'author',
				'authorEmail',
				'extension_id',
				'client_id',
			);
		}

		parent::__construct($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 = 'name', $direction = 'asc')
	{
		// Load the filter state.
		$this->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);

		// Load the parameters.
		$params = JComponentHelper::getParams('com_languages');
		$this->setState('params', $params);

		// 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.
	 *
	 * @since   1.6
	 */
	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 the client object.
	 *
	 * @return  object
	 *
	 * @since   1.6
	 */
	public function getClient()
	{
		return JApplicationHelper::getClientInfo($this->getState('client_id', 0));
	}

	/**
	 * Method to get the ftp credentials.
	 *
	 * @return  object
	 *
	 * @since   1.6
	 */
	public function getFtp()
	{
		if (is_null($this->ftp))
		{
			$this->ftp = JClientHelper::setCredentialsFromRequest('ftp');
		}

		return $this->ftp;
	}

	/**
	 * Method to get the option.
	 *
	 * @return  object
	 *
	 * @since   1.6
	 */
	public function getOption()
	{
		$option = $this->getState('option');

		return $option;
	}

	/**
	 * Method to get Languages item data.
	 *
	 * @return  array
	 *
	 * @since   1.6
	 */
	public function getData()
	{
		// Fetch language data if not fetched yet.
		if (is_null($this->data))
		{
			$this->data = array();

			$isCurrentLanguageRtl = JFactory::getLanguage()->isRtl();
			$params               = JComponentHelper::getParams('com_languages');
			$installedLanguages   = JLanguageHelper::getInstalledLanguages(null, true, true, null, null, null);

			// Compute all the languages.
			foreach ($installedLanguages as $clientId => $languages)
			{
				$defaultLanguage = $params->get(JApplicationHelper::getClientInfo($clientId)->name, 'en-GB');

				foreach ($languages as $lang)
				{
					$row               = new stdClass;
					$row->language     = $lang->element;
					$row->name         = $lang->metadata['name'];
					$row->nativeName   = isset($lang->metadata['nativeName']) ? $lang->metadata['nativeName'] : '-';
					$row->client_id    = (int) $lang->client_id;
					$row->extension_id = (int) $lang->extension_id;
					$row->author       = $lang->manifest['author'];
					$row->creationDate = $lang->manifest['creationDate'];
					$row->authorEmail  = $lang->manifest['authorEmail'];
					$row->version      = $lang->manifest['version'];
					$row->published    = $defaultLanguage === $row->language ? 1 : 0;
					$row->checked_out  = 0;

					// Fix wrongly set parentheses in RTL languages
					if ($isCurrentLanguageRtl)
					{
						$row->name       = html_entity_decode($row->name . '&#x200E;', ENT_QUOTES, 'UTF-8');
						$row->nativeName = html_entity_decode($row->nativeName . '&#x200E;', ENT_QUOTES, 'UTF-8');
					}

					$this->data[] = $row;
				}
			}
		}

		$installedLanguages = array_merge($this->data);

		// Process filters.
		$clientId = (int) $this->getState('client_id');
		$search   = $this->getState('filter.search');

		foreach ($installedLanguages as $key => $installedLanguage)
		{
			// Filter by client id.
			if (in_array($clientId, array(0, 1)))
			{
				if ($installedLanguage->client_id !== $clientId)
				{
					unset($installedLanguages[$key]);
					continue;
				}
			}

			// Filter by search term.
			if (!empty($search))
			{
				if (stripos($installedLanguage->name, $search) === false
					&& stripos($installedLanguage->nativeName, $search) === false
					&& stripos($installedLanguage->language, $search) === false)
				{
					unset($installedLanguages[$key]);
					continue;
				}
			}
		}

		// Process ordering.
		$listOrder = $this->getState('list.ordering', 'name');
		$listDirn  = $this->getState('list.direction', 'ASC');
		$installedLanguages = ArrayHelper::sortObjects($installedLanguages, $listOrder, strtolower($listDirn) === 'desc' ? -1 : 1, true, true);

		// Process pagination.
		$limit = (int) $this->getState('list.limit', 25);

		// Sets the total for pagination.
		$this->total = count($installedLanguages);

		if ($limit !== 0)
		{
			$start = (int) $this->getState('list.start', 0);

			return array_slice($installedLanguages, $start, $limit);
		}

		return $installedLanguages;
	}

	/**
	 * Method to get installed languages data.
	 *
	 * @return  string	An SQL query.
	 *
	 * @since   1.6
	 *
	 * @deprecated   4.0
	 */
	protected function getLanguageList()
	{
		// Create a new db object.
		$db = $this->getDbo();
		$query = $db->getQuery(true);
		$client = $this->getState('client_id');
		$type = 'language';

		// Select field element from the extensions table.
		$query->select($this->getState('list.select', 'a.element'))
			->from('#__extensions AS a');

		$type = $db->quote($type);
		$query->where('(a.type = ' . $type . ')')
			->where('state = 0')
			->where('enabled = 1')
			->where('client_id=' . (int) $client);

		// For client_id = 1 do we need to check language table also?
		$db->setQuery($query);

		$this->langlist = $db->loadColumn();

		return $this->langlist;
	}

	/**
	 * Method to get the total number of Languages items.
	 *
	 * @return  integer
	 *
	 * @since   1.6
	 */
	public function getTotal()
	{
		if (is_null($this->total))
		{
			$this->getData();
		}

		return $this->total;
	}

	/**
	 * Method to set the default language.
	 *
	 * @param   integer  $cid  Id of the language to publish.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	public function publish($cid)
	{
		if ($cid)
		{
			$client = $this->getClient();

			$params = JComponentHelper::getParams('com_languages');
			$params->set($client->name, $cid);

			$table = JTable::getInstance('extension');
			$id    = $table->find(array('element' => 'com_languages'));

			// Load.
			if (!$table->load($id))
			{
				$this->setError($table->getError());

				return false;
			}

			$table->params = (string) $params;

			// Pre-save checks.
			if (!$table->check())
			{
				$this->setError($table->getError());

				return false;
			}

			// Save the changes.
			if (!$table->store())
			{
				$this->setError($table->getError());

				return false;
			}
		}
		else
		{
			$this->setError(JText::_('COM_LANGUAGES_ERR_NO_LANGUAGE_SELECTED'));

			return false;
		}

		// Clean the cache of com_languages and component cache.
		$this->cleanCache();
		$this->cleanCache('_system', 0);
		$this->cleanCache('_system', 1);

		return true;
	}

	/**
	 * Method to get the folders.
	 *
	 * @return  array  Languages folders.
	 *
	 * @since   1.6
	 */
	protected function getFolders()
	{
		if (is_null($this->folders))
		{
			$path = $this->getPath();
			jimport('joomla.filesystem.folder');
			$this->folders = JFolder::folders($path, '.', false, false, array('.svn', 'CVS', '.DS_Store', '__MACOSX', 'pdf_fonts', 'overrides'));
		}

		return $this->folders;
	}

	/**
	 * Method to get the path.
	 *
	 * @return  string	The path to the languages folders.
	 *
	 * @since   1.6
	 */
	protected function getPath()
	{
		if (is_null($this->path))
		{
			$client     = $this->getClient();
			$this->path = JLanguageHelper::getLanguagePath($client->path);
		}

		return $this->path;
	}

	/**
	 * Method to compare two languages in order to sort them.
	 *
	 * @param   object  $lang1  The first language.
	 * @param   object  $lang2  The second language.
	 *
	 * @return  integer
	 *
	 * @since   1.6
	 *
	 * @deprecated   4.0
	 */
	protected function compareLanguages($lang1, $lang2)
	{
		return strcmp($lang1->name, $lang2->name);
	}

	/**
	 * Method to switch the administrator language.
	 *
	 * @param   string  $cid  The language tag.
	 *
	 * @return  boolean
	 *
	 * @since   3.5
	 */
	public function switchAdminLanguage($cid)
	{
		if ($cid)
		{
			$client = $this->getClient();

			if ($client->name == 'administrator')
			{
				JFactory::getApplication()->setUserState('application.lang', $cid);
			}
		}
		else
		{
			JError::raiseWarning(500, JText::_('COM_LANGUAGES_ERR_NO_LANGUAGE_SELECTED'));

			return false;
		}

		return true;
	}
}
components/com_languages/models/languages.php000060400000012763152453623450015515 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Languages Model Class
 *
 * @since  1.6
 */
class LanguagesModelLanguages extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'lang_id', 'a.lang_id',
				'lang_code', 'a.lang_code',
				'title', 'a.title',
				'title_native', 'a.title_native',
				'sef', 'a.sef',
				'image', 'a.image',
				'published', 'a.published',
				'ordering', 'a.ordering',
				'access', 'a.access', 'access_level',
				'home', 'l.home',
			);
		}

		parent::__construct($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.ordering', $direction = 'asc')
	{
		// Load the filter state.
		$this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string'));
		$this->setState('filter.access', $this->getUserStateFromRequest($this->context . '.filter.access', 'filter_access', '', 'cmd'));
		$this->setState('filter.published', $this->getUserStateFromRequest($this->context . '.filter.published', 'filter_published', '', 'string'));

		// Load the parameters.
		$params = JComponentHelper::getParams('com_languages');
		$this->setState('params', $params);

		// 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.
	 *
	 * @since   1.6
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.access');
		$id .= ':' . $this->getState('filter.published');

		return parent::getStoreId($id);
	}

	/**
	 * Method to build an SQL query to load the list data.
	 *
	 * @return  string    An SQL query
	 *
	 * @since   1.6
	 */
	protected function getListQuery()
	{
		// Create a new query object.
		$db = $this->getDbo();
		$query = $db->getQuery(true);

		// Select all fields from the languages table.
		$query->select($this->getState('list.select', 'a.*', 'l.home'))
			->from($db->quoteName('#__languages') . ' AS a');

		// Join over the asset groups.
		$query->select('ag.title AS access_level')
			->join('LEFT', '#__viewlevels AS ag ON ag.id = a.access');

		// Select the language home pages.
		$query->select('l.home AS home')
			->join('LEFT', $db->quoteName('#__menu') . ' AS l  ON  l.language = a.lang_code AND l.home=1  AND l.language <> ' . $db->quote('*'));

		// Filter on the 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))
		{
			$search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%'));
			$query->where('(a.title LIKE ' . $search . ')');
		}

		// Filter by access level.
		if ($access = $this->getState('filter.access'))
		{
			$query->where('a.access = ' . (int) $access);
		}

		// Add the list ordering clause.
		$query->order($db->escape($this->getState('list.ordering', 'a.ordering')) . ' ' . $db->escape($this->getState('list.direction', 'ASC')));

		return $query;
	}

	/**
	 * Set the published language(s).
	 *
	 * @param   array    $cid    An array of language IDs.
	 * @param   integer  $value  The value of the published state.
	 *
	 * @return  boolean  True on success, false otherwise.
	 *
	 * @since   1.6
	 */
	public function setPublished($cid, $value = 0)
	{
		return JTable::getInstance('Language')->publish($cid, $value);
	}

	/**
	 * Method to delete records.
	 *
	 * @param   array  $pks  An array of item primary keys.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function delete($pks)
	{
		// Sanitize the array.
		$pks = (array) $pks;

		// Get a row instance.
		$table = JTable::getInstance('Language');

		// Iterate the items to delete each one.
		foreach ($pks as $itemId)
		{
			if (!$table->delete((int) $itemId))
			{
				$this->setError($table->getError());

				return false;
			}
		}

		// Clean the cache.
		$this->cleanCache();

		return true;
	}

	/**
	 * Custom clean cache method, 2 places for 2 clients.
	 *
	 * @param   string   $group     Optional cache group name.
	 * @param   integer  $clientId  Application client id.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function cleanCache($group = null, $clientId = 0)
	{
		parent::cleanCache('_system');
		parent::cleanCache('com_languages');
	}
}
components/com_languages/controllers/overrides.php000060400000003355152453623450016631 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Languages Overrides Controller.
 *
 * @since  2.5
 */
class LanguagesControllerOverrides extends JControllerAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var		string
	 * @since	2.5
	 */
	protected $text_prefix = 'COM_LANGUAGES_VIEW_OVERRIDES';

	/**
	 * Method for deleting one or more overrides.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function delete()
	{
		// Check for request forgeries.
		$this->checkToken();

		// Get items to delete from the request.
		$cid = (array) $this->input->get('cid', array(), 'string');

		// Remove zero values resulting from input filter
		$cid = array_filter($cid);

		if (empty($cid))
		{
			$this->setMessage(JText::_($this->text_prefix . '_NO_ITEM_SELECTED'), 'warning');
		}
		else
		{
			// Get the model.
			$model = $this->getModel('overrides');

			// 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 . '&view=' . $this->view_list, false));
	}

	/**
	 * Method to purge the overrider table.
	 *
	 * @return  void
	 *
	 * @since   3.4.2
	 */
	public function purge()
	{
		// Check for request forgeries.
		$this->checkToken();

		$model = $this->getModel('overrides');
		$model->purge();
		$this->setRedirect(JRoute::_('index.php?option=com_languages&view=overrides', false));
	}
}
components/com_languages/controllers/strings.json.php000060400000001463152453623450017266 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Languages Strings JSON Controller
 *
 * @since  2.5
 */
class LanguagesControllerStrings extends JControllerAdmin
{
	/**
	 * Method for refreshing the cache in the database with the known language strings
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function refresh()
	{
		echo new JResponseJson($this->getModel('strings')->refresh());
	}

	/**
	 * Method for searching language strings
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function search()
	{
		echo new JResponseJson($this->getModel('strings')->search());
	}
}
components/com_languages/controllers/override.php000060400000013746152453623450016453 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Languages Override Controller
 *
 * @since  2.5
 */
class LanguagesControllerOverride extends JControllerForm
{
	/**
	 * Method to edit an existing override.
	 *
	 * @param   string  $key     The name of the primary key of the URL variable (not used here).
	 * @param   string  $urlVar  The name of the URL variable if different from the primary key (not used here).
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function edit($key = null, $urlVar = null)
	{
		// Do not cache the response to this, its a redirect
		JFactory::getApplication()->allowCache(false);

		$app     = JFactory::getApplication();
		$cid     = (array) $this->input->post->get('cid', array(), 'string');
		$context = "$this->option.edit.$this->context";

		// Get the constant name.
		$recordId = (count($cid) ? $cid[0] : $this->input->get('id'));

		// Access check.
		if (!$this->allowEdit())
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_EDIT_NOT_PERMITTED'));
			$this->setMessage($this->getError(), 'error');
			$this->setRedirect(JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_list . $this->getRedirectToListAppend(), false));

			return;
		}

		$app->setUserState($context . '.data', null);
		$this->setRedirect('index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend($recordId, 'id'));
	}

	/**
	 * Method to save an override.
	 *
	 * @param   string  $key     The name of the primary key of the URL variable (not used here).
	 * @param   string  $urlVar  The name of the URL variable if different from the primary key (not used here).
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function save($key = null, $urlVar = null)
	{
		// Check for request forgeries.
		$this->checkToken();

		$app     = JFactory::getApplication();
		$model   = $this->getModel();
		$data    = $this->input->post->get('jform', array(), 'array');
		$context = "$this->option.edit.$this->context";
		$task    = $this->getTask();

		$recordId = $this->input->get('id');
		$data['id'] = $recordId;

		// Access check.
		if (!$this->allowSave($data, 'id'))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'));
			$this->setMessage($this->getError(), 'error');
			$this->setRedirect(JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_list . $this->getRedirectToListAppend(), false));

			return;
		}

		// Validate the posted data.
		$form = $model->getForm($data, false);

		if (!$form)
		{
			$app->enqueueMessage($model->getError(), 'error');

			return;
		}

		// Require helper for filter functions called by JForm.
		JLoader::register('LanguagesHelper', JPATH_ADMINISTRATOR . '/components/com_languages/helpers/languages.php');

		// Test whether the data is valid.
		$validData = $model->validate($form, $data);

		// Check for validation errors.
		if ($validData === 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');
				}
			}

			// Save the data in the session.
			$app->setUserState($context . '.data', $data);

			// Redirect back to the edit screen.
			$this->setRedirect(
				JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend($recordId, 'id'), false)
			);

			return;
		}

		// Attempt to save the data.
		if (!$model->save($validData))
		{
			// Save the data in the session.
			$app->setUserState($context . '.data', $validData);

			// Redirect back to the edit screen.
			$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_SAVE_FAILED', $model->getError()));
			$this->setMessage($this->getError(), 'error');
			$this->setRedirect(
				JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend($recordId, 'id'), false)
			);

			return;
		}

		// Add message of success.
		$this->setMessage(JText::_('COM_LANGUAGES_VIEW_OVERRIDE_SAVE_SUCCESS'));

		// Redirect the user and adjust session state based on the chosen task.
		switch ($task)
		{
			case 'apply':
				// Set the record data in the session.
				$app->setUserState($context . '.data', null);

				// Redirect back to the edit screen
				$this->setRedirect(
					JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend($validData['key'], 'id'), false)
				);
				break;

			case 'save2new':
				// Clear the record id and data from the session.
				$app->setUserState($context . '.data', null);

				// Redirect back to the edit screen
				$this->setRedirect(
					JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend(null, 'id'), false)
				);
				break;

			default:
				// Clear the record id and data from the session.
				$app->setUserState($context . '.data', null);

				// Redirect to the list screen.
				$this->setRedirect(JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_list . $this->getRedirectToListAppend(), false));
				break;
		}
	}

	/**
	 * Method to cancel an edit.
	 *
	 * @param   string  $key  The name of the primary key of the URL variable (not used here).
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function cancel($key = null)
	{
		$this->checkToken();

		$app     = JFactory::getApplication();
		$context = "$this->option.edit.$this->context";

		$app->setUserState($context . '.data', null);
		$this->setRedirect(JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_list . $this->getRedirectToListAppend(), false));
	}
}
components/com_languages/controllers/language.php000060400000001504152453623450016404 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Languages list actions controller.
 *
 * @since  1.6
 */
class LanguagesControllerLanguage extends JControllerForm
{
	/**
	 * Gets the URL arguments to append to an item redirect.
	 *
	 * @param   int     $recordId  The primary key id for the item.
	 * @param   string  $key       The name of the primary key variable.
	 *
	 * @return  string  The arguments to append to the redirect URL.
	 *
	 * @since   1.6
	 */
	protected function getRedirectToItemAppend($recordId = null, $key = 'lang_id')
	{
		return parent::getRedirectToItemAppend($recordId, $key);
	}
}
components/com_languages/controllers/languages.php000060400000003174152453623450016574 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Languages controller Class.
 *
 * @since  1.6
 */
class LanguagesControllerLanguages extends JControllerAdmin
{
	/**
	 * 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.6
	 */
	public function getModel($name = 'Language', $prefix = 'LanguagesModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	/**
	 * Method to save the submitted ordering values for records via AJAX.
	 *
	 * @return  void
	 *
	 * @since   3.1
	 */
	public function saveOrderAjax()
	{
		// Check for request forgeries.
		$this->checkToken();

		$pks   = (array) $this->input->post->get('cid', array(), 'int');
		$order = (array) $this->input->post->get('order', array(), 'int');

		// Remove zero PK's and corresponding order values resulting from input filter for PK
		foreach ($pks as $i => $pk)
		{
			if ($pk === 0)
			{
				unset($pks[$i]);
				unset($order[$i]);
			}
		}

		// Get the model.
		$model = $this->getModel();

		// Save the ordering.
		$return = $model->saveorder($pks, $order);

		if ($return)
		{
			echo '1';
		}

		// Close the application.
		JFactory::getApplication()->close();
	}
}
components/com_languages/controllers/installed.php000060400000005045152453623450016604 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Languages Controller.
 *
 * @since  1.5
 */
class LanguagesControllerInstalled extends JControllerLegacy
{
	/**
	 * Task to set the default language.
	 *
	 * @return  void
	 */
	public function setDefault()
	{
		// Check for request forgeries.
		$this->checkToken();

		$cid = (string) $this->input->get('cid', '', 'string');
		$model = $this->getModel('installed');

		if ($model->publish($cid))
		{
			// Switching to the new administrator language for the message
			if ($model->getState('client_id') == 1)
			{
				$language = JFactory::getLanguage();
				$newLang = JLanguage::getInstance($cid);
				JFactory::$language = $newLang;
				JFactory::getApplication()->loadLanguage($language = $newLang);
				$newLang->load('com_languages', JPATH_ADMINISTRATOR);
			}

			$msg = JText::_('COM_LANGUAGES_MSG_DEFAULT_LANGUAGE_SAVED');
			$type = 'message';
		}
		else
		{
			$msg = $this->getError();
			$type = 'error';
		}

		$clientId = $model->getState('client_id');
		$this->setredirect('index.php?option=com_languages&view=installed&client=' . $clientId, $msg, $type);
	}

	/**
	 * Task to switch the administrator language.
	 *
	 * @return  void
	 */
	public function switchAdminLanguage()
	{
		// Check for request forgeries.
		$this->checkToken();

		$cid = (string) $this->input->get('cid', '', 'string');
		$model = $this->getModel('installed');

		// Fetching the language name from the xx-XX.xml or langmetadata.xml respectively.
		$file = JPATH_ADMINISTRATOR . '/language/' . $cid . '/' . $cid . '.xml';

		if (!is_file($file))
		{
			$file = JPATH_ADMINISTRATOR . '/language/' . $cid . '/langmetadata.xml';
		}

		$info = JInstaller::parseXMLInstallFile($file);

		if ($model->switchAdminLanguage($cid))
		{
			// Switching to the new language for the message
			$languageName = $info['name'];
			$language = JFactory::getLanguage();
			$newLang = JLanguage::getInstance($cid);
			JFactory::$language = $newLang;
			JFactory::getApplication()->loadLanguage($language = $newLang);
			$newLang->load('com_languages', JPATH_ADMINISTRATOR);

			$msg = JText::sprintf('COM_LANGUAGES_MSG_SWITCH_ADMIN_LANGUAGE_SUCCESS', $languageName);
			$type = 'message';
		}
		else
		{
			$msg = $this->getError();
			$type = 'error';
		}

		$this->setredirect('index.php?option=com_languages&view=installed', $msg, $type);
	}
}
components/com_languages/views/override/tmpl/edit.php000060400000011427152453623450017135 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');
JHtml::_('formbehavior.chosen', 'select');

$expired = ($this->state->get('cache_expired') == 1 ) ? '1' : '';

JHtml::_('stylesheet', 'overrider/overrider.css', array('version' => 'auto', 'relative' => true));

JHtml::_('behavior.core');
JHtml::_('jquery.framework');
JHtml::_('script', 'overrider/overrider.min.js', array('version' => 'auto', 'relative' => true));

JFactory::getDocument()->addScriptDeclaration('
	jQuery(document).ready(function($) {
		$("#jform_searchstring").on("focus", function() {
			if (!Joomla.overrider.states.refreshed)
			{
				var expired = "' . $expired . '";
				if (expired)
				{
					Joomla.overrider.refreshCache();
					Joomla.overrider.states.refreshed = true;
				}
			}
			$(this).removeClass("invalid");
		});
	});

	Joomla.submitbutton = function(task) {
		if (task == "override.cancel" || document.formvalidator.isValid(document.getElementById("override-form")))
		{
			Joomla.submitform(task, document.getElementById("override-form"));
		}
	};
');
?>

<form action="<?php echo JRoute::_('index.php?option=com_languages&id=' . $this->item->key); ?>" method="post" name="adminForm" id="override-form" class="form-validate form-horizontal">
	<div class="row-fluid">
		<div class="span6">
			<fieldset>
				<legend><?php echo empty($this->item->key) ? JText::_('COM_LANGUAGES_VIEW_OVERRIDE_EDIT_NEW_OVERRIDE_LEGEND') : JText::_('COM_LANGUAGES_VIEW_OVERRIDE_EDIT_EDIT_OVERRIDE_LEGEND'); ?></legend>
				<div class="control-group">
					<div class="control-label">
						<?php echo $this->form->getLabel('language'); ?>
					</div>
					<div class="controls">
						<?php echo $this->form->getInput('language'); ?>
					</div>
				</div>

				<div class="control-group">
					<div class="control-label">
						<?php echo $this->form->getLabel('client'); ?>
					</div>
					<div class="controls">
						<?php echo $this->form->getInput('client'); ?>
					</div>
				</div>

				<div class="control-group">
					<div class="control-label">
						<?php echo $this->form->getLabel('key'); ?>
					</div>
					<div class="controls">
						<?php echo $this->form->getInput('key'); ?>
					</div>
				</div>

				<div class="control-group">
					<div class="control-label">
						<?php echo $this->form->getLabel('override'); ?>
					</div>
					<div class="controls">
						<?php echo $this->form->getInput('override'); ?>
					</div>
				</div>

				<?php if ($this->state->get('filter.client') == 'administrator') : ?>
				<div class="control-group">
					<div class="control-label">
						<?php echo $this->form->getLabel('both'); ?>
					</div>
					<div class="controls">
						<?php echo $this->form->getInput('both'); ?>
					</div>
				</div>
				<?php endif; ?>

				<div class="control-group">
					<div class="control-label">
						<?php echo $this->form->getLabel('file'); ?>
					</div>
					<div class="controls">
						<?php echo $this->form->getInput('file'); ?>
					</div>
				</div>
			</fieldset>

		</div>

		<div class="span6">
			<fieldset>
				<legend><?php echo JText::_('COM_LANGUAGES_VIEW_OVERRIDE_SEARCH_LEGEND'); ?></legend>

				<div class="alert alert-info"><p><?php echo JText::_('COM_LANGUAGES_VIEW_OVERRIDE_SEARCH_TIP'); ?></p></div>

				<div class="control-group">
					<?php echo $this->form->getInput('searchstring'); ?>
					<button type="submit" class="btn btn-primary" onclick="Joomla.overrider.searchStrings();return false;" formnovalidate>
						<?php echo JText::_('COM_LANGUAGES_VIEW_OVERRIDE_SEARCH_BUTTON'); ?>
					</button>
					<span id="refresh-status" class="overrider-spinner  help-block">
						<?php echo JText::_('COM_LANGUAGES_VIEW_OVERRIDE_REFRESHING'); ?>
					</span>
				</div>
				<div class="control-group">
					<div class="control-label">
						<?php echo $this->form->getLabel('searchtype'); ?>
					</div>
					<div class="controls">
						<?php echo $this->form->getInput('searchtype'); ?>
					</div>
				</div>

			</fieldset>

			<fieldset id="results-container" class="adminform">
				<legend><?php echo JText::_('COM_LANGUAGES_VIEW_OVERRIDE_RESULTS_LEGEND'); ?></legend>
				<span id="more-results">
					<a href="javascript:Joomla.overrider.searchStrings(Joomla.overrider.states.more);">
						<?php echo JText::_('COM_LANGUAGES_VIEW_OVERRIDE_MORE_RESULTS'); ?></a>
				</span>
			</fieldset>

			<input type="hidden" name="task" value="" />
			<input type="hidden" name="id" value="<?php echo $this->item->key; ?>" />

			<?php echo JHtml::_('form.token'); ?>
		</div>
	</div>
</form>
components/com_languages/views/override/view.html.php000060400000005541152453623450017151 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View to edit a language override
 *
 * @since  2.5
 */
class LanguagesViewOverride extends JViewLegacy
{
	/**
	 * The form to use for the view.
	 *
	 * @var		object
	 * @since	2.5
	 */
	protected $form;

	/**
	 * The item to edit.
	 *
	 * @var		object
	 * @since	2.5
	 */
	protected $item;

	/**
	 * The model state.
	 *
	 * @var		object
	 * @since	2.5
	 */
	protected $state;

	/**
	 * Displays the view.
	 *
	 * @param   string  $tpl  The name of the template file to parse
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function display($tpl = null)
	{
		$this->form  = $this->get('Form');
		$this->item  = $this->get('Item');
		$this->state = $this->get('State');

		$app = JFactory::getApplication();

		$languageClient = $app->getUserStateFromRequest('com_languages.overrides.language_client', 'language_client');

		if ($languageClient == null)
		{
			$app->enqueueMessage(JText::_('COM_LANGUAGES_OVERRIDE_FIRST_SELECT_MESSAGE'), 'warning');

			$app->redirect('index.php?option=com_languages&view=overrides');
		}

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors));
		}

		// Check whether the cache has to be refreshed.
		$cached_time = JFactory::getApplication()->getUserState(
			'com_languages.overrides.cachedtime.' . $this->state->get('filter.client') . '.' . $this->state->get('filter.language'),
			0
		);

		if (time() - $cached_time > 60 * 5)
		{
			$this->state->set('cache_expired', true);
		}

		// Add strings for translations in Javascript.
		JText::script('COM_LANGUAGES_VIEW_OVERRIDE_NO_RESULTS');
		JText::script('COM_LANGUAGES_VIEW_OVERRIDE_REQUEST_ERROR');

		$this->addToolbar();
		parent::display($tpl);
	}

	/**
	 * Adds the page title and toolbar.
	 *
	 * @return void
	 *
	 * @since	2.5
	 */
	protected function addToolbar()
	{
		JFactory::getApplication()->input->set('hidemainmenu', true);

		$canDo = JHelperContent::getActions('com_languages');

		JToolbarHelper::title(JText::_('COM_LANGUAGES_VIEW_OVERRIDE_EDIT_TITLE'), 'comments-2 langmanager');

		if ($canDo->get('core.edit'))
		{
			JToolbarHelper::apply('override.apply');
			JToolbarHelper::save('override.save');
		}

		// This component does not support Save as Copy.
		if ($canDo->get('core.edit') && $canDo->get('core.create'))
		{
			JToolbarHelper::save2new('override.save2new');
		}

		if (empty($this->item->key))
		{
			JToolbarHelper::cancel('override.cancel');
		}
		else
		{
			JToolbarHelper::cancel('override.cancel', 'JTOOLBAR_CLOSE');
		}

		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_EXTENSIONS_LANGUAGE_MANAGER_OVERRIDES_EDIT');
	}
}
components/com_languages/views/multilangstatus/view.html.php000060400000002435152453623450020571 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Displays the multilang status.
 *
 * @since  1.7.1
 */
class LanguagesViewMultilangstatus extends JViewLegacy
{
	/**
	 * Display the view.
	 *
	 * @param   string  $tpl  The name of the template file to parse.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		JLoader::register('MultilangstatusHelper', JPATH_ADMINISTRATOR . '/components/com_languages/helpers/multilangstatus.php');

		$this->homes           = MultilangstatusHelper::getHomes();
		$this->language_filter = JLanguageMultilang::isEnabled();
		$this->switchers       = MultilangstatusHelper::getLangswitchers();
		$this->listUsersError  = MultilangstatusHelper::getContacts();
		$this->contentlangs    = MultilangstatusHelper::getContentlangs();
		$this->site_langs      = JLanguageHelper::getInstalledLanguages(0);
		$this->statuses        = MultilangstatusHelper::getStatus();
		$this->homepages       = JLanguageMultilang::getSiteHomePages();
		$this->defaultHome     = MultilangstatusHelper::getDefaultHomeModule();

		parent::display($tpl);
	}
}
components/com_languages/views/multilangstatus/tmpl/default.php000060400000023560152453623450021256 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$notice_homes     = $this->homes == 2 || $this->homes == 1 || $this->homes - 1 != count($this->contentlangs) && ($this->language_filter || $this->switchers != 0);
$notice_disabled  = !$this->language_filter	&& ($this->homes > 1 || $this->switchers != 0);
$notice_switchers = !$this->switchers && ($this->homes > 1 || $this->language_filter);
?>
<div class="mod-multilangstatus">
	<?php if (!$this->language_filter && $this->switchers == 0) : ?>
		<?php if ($this->homes == 1) : ?>
			<div class="alert alert-info"><?php echo JText::_('COM_LANGUAGES_MULTILANGSTATUS_NONE'); ?></div>
		<?php else : ?>
			<div class="alert alert-info"><?php echo JText::_('COM_LANGUAGES_MULTILANGSTATUS_USELESS_HOMES'); ?></div>
		<?php endif; ?>
	<?php else : ?>
	<table class="table table-striped table-condensed">
		<tbody>
		<?php if ($this->defaultHome == true) : ?>
			<tr class="warning">
				<td>
					<span class="icon-pending" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('WARNING'); ?></span>
				</td>
				<td>
					<?php echo JText::_('COM_LANGUAGES_MULTILANGSTATUS_DEFAULT_HOME_MODULE_PUBLISHED'); ?>
				</td>
			</tr>
		<?php endif; ?>
		<?php if ($notice_homes) : ?>
			<tr class="warning">
				<td>
					<span class="icon-pending" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('WARNING'); ?></span>
				</td>
				<td>
					<?php echo JText::_('COM_LANGUAGES_MULTILANGSTATUS_HOMES_MISSING'); ?>
				</td>
			</tr>
		<?php endif; ?>
		<?php if ($notice_disabled) : ?>
			<tr class="warning">
				<td>
					<span class="icon-pending" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('WARNING'); ?></span>
				</td>
				<td>
					<?php echo JText::_('COM_LANGUAGES_MULTILANGSTATUS_LANGUAGEFILTER_DISABLED'); ?>
				</td>
			</tr>
		<?php endif; ?>
		<?php if ($notice_switchers) : ?>
			<tr class="warning">
				<td>
					<span class="icon-pending" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('WARNING'); ?></span>
				</td>
				<td>
					<?php echo JText::_('COM_LANGUAGES_MULTILANGSTATUS_LANGSWITCHER_UNPUBLISHED'); ?>
				</td>
			</tr>
		<?php endif; ?>
		<?php foreach ($this->contentlangs as $contentlang) : ?>
			<?php if (array_key_exists($contentlang->lang_code, $this->homepages) && (!array_key_exists($contentlang->lang_code, $this->site_langs) || !$contentlang->published)) : ?>
				<tr class="warning">
					<td>
						<span class="icon-pending" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('WARNING'); ?></span>
					</td>
					<td>
						<?php echo JText::sprintf('COM_LANGUAGES_MULTILANGSTATUS_ERROR_CONTENT_LANGUAGE', $contentlang->lang_code); ?>
					</td>
				</tr>
			<?php endif; ?>
			<?php if (!array_key_exists($contentlang->lang_code, $this->site_langs)) : ?>
				<tr class="warning">
					<td>
						<span class="icon-pending" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('WARNING'); ?></span>
					</td>
					<td>
						<?php echo JText::sprintf('COM_LANGUAGES_MULTILANGSTATUS_ERROR_LANGUAGE_TAG', $contentlang->lang_code); ?>
					</td>
				</tr>
			<?php endif; ?>
			<?php if ($contentlang->published == -2) : ?>
				<tr class="warning">
					<td>
						<span class="icon-pending" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('WARNING'); ?></span>
					</td>
					<td>
						<?php echo JText::sprintf('COM_LANGUAGES_MULTILANGSTATUS_ERROR_CONTENT_LANGUAGE_TRASHED', $contentlang->lang_code); ?>
					</td>
				</tr>
			<?php endif; ?>
		<?php endforeach; ?>
		<?php if ($this->listUsersError) : ?>
			<tr class="warning">
				<td>
					<span class="icon-pending" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('WARNING'); ?></span>
				</td>
				<td>
					<?php echo JText::_('COM_LANGUAGES_MULTILANGSTATUS_CONTACTS_ERROR_TIP'); ?>
					<ul>
					<?php foreach ($this->listUsersError as $user) : ?>
						<li>
						<?php echo JText::sprintf('COM_LANGUAGES_MULTILANGSTATUS_CONTACTS_ERROR', $user->name); ?>
						</li>
					<?php endforeach; ?>
					</ul>
				</td>
			</tr>
		<?php endif; ?>
		</tbody>
	</table>
	<table class="table table-striped table-condensed" style="border-top: 1px solid #CCCCCC;">
		<thead>
			<tr>
				<th>
					<?php echo JText::_('JDETAILS'); ?>
				</th>
				<th class="center">
					<?php echo JText::_('JSTATUS'); ?>
				</th>
			</tr>
		</thead>
		<tbody>
			<tr>
				<th scope="row">
					<?php echo JText::_('COM_LANGUAGES_MULTILANGSTATUS_LANGUAGEFILTER'); ?>
				</th>
				<td class="center">
					<?php if ($this->language_filter) : ?>
						<?php echo JText::_('JENABLED'); ?>
					<?php else : ?>
						<?php echo JText::_('JDISABLED'); ?>
					<?php endif; ?>
				</td>
			</tr>

			<tr>
				<th scope="row">
					<?php echo JText::_('COM_LANGUAGES_MULTILANGSTATUS_LANGSWITCHER_PUBLISHED'); ?>
				</th>
				<td class="center">
					<?php if ($this->switchers != 0) : ?>
						<?php echo $this->switchers; ?>
					<?php else : ?>
						<?php echo JText::_('JNONE'); ?>
					<?php endif; ?>
				</td>
			</tr>
			<tr>
				<th scope="row">
					<?php if ($this->homes > 1) : ?>
						<?php echo JText::_('COM_LANGUAGES_MULTILANGSTATUS_HOMES_PUBLISHED_INCLUDING_ALL'); ?>
					<?php else : ?>
						<?php echo JText::_('COM_LANGUAGES_MULTILANGSTATUS_HOMES_PUBLISHED'); ?>
					<?php endif; ?>
				</th>
				<td class="center">
					<?php if ($this->homes > 1) : ?>
						<?php echo $this->homes; ?>
					<?php else : ?>
						<?php echo JText::_('COM_LANGUAGES_MULTILANGSTATUS_HOMES_PUBLISHED_ALL'); ?>
					<?php endif; ?>
				</td>
			</tr>
		</tbody>
	</table>
	<table class="table table-striped table-condensed" style="border-top: 1px solid #CCCCCC;">
		<thead>
			<tr>
				<th>
					<?php echo JText::_('JGRID_HEADING_LANGUAGE'); ?>
				</th>
				<th class="center">
					<?php echo JText::_('COM_LANGUAGES_MULTILANGSTATUS_SITE_LANG_PUBLISHED'); ?>
				</th>
				<th class="center">
					<?php echo JText::_('COM_LANGUAGES_MULTILANGSTATUS_CONTENT_LANGUAGE_PUBLISHED'); ?>
				</th>
				<th class="center">
					<?php echo JText::_('COM_LANGUAGES_MULTILANGSTATUS_HOMES_PUBLISHED'); ?>
				</th>
			</tr>
		</thead>
		<tbody>
			<?php foreach ($this->statuses as $status) : ?>
				<?php if ($status->element) : ?>
					<tr>
						<td>
							<?php echo $status->element; ?>
						</td>
				<?php endif; ?>
				<?php // Published Site languages ?>
				<?php if ($status->element) : ?>
						<td class="center">
							<span class="icon-ok" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('JYES'); ?></span>
						</td>
				<?php else : ?>
						<td class="center">
							<?php echo JText::_('JNO'); ?>
						</td>
				<?php endif; ?>
				<?php // Published Content languages ?>
				<?php if ($status->lang_code && $status->published == 1) : ?>
						<td class="center">
							<span class="icon-ok" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('JYES'); ?></span>
						</td>
				<?php elseif ($status->lang_code && $status->published == 0) : ?>
						<td class="center">
							<span class="icon-pending" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('WARNING'); ?></span>
						</td>
				<?php elseif ($status->lang_code && $status->published == -2) : ?>
						<td class="center">
							<span class="icon-trash" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('WARNING'); ?></span>
						</td>
				<?php else : ?>
						<td class="center">
							<span class="icon-pending" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('WARNING'); ?></span>
						</td>
				<?php endif; ?>
				<?php // Published Home pages ?>
				<?php if ($status->home_language) : ?>
						<td class="center">
							<span class="icon-ok" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('JYES'); ?></span>
						</td>
				<?php else : ?>
						<td class="center">
							<span class="icon-not-ok" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('JNO'); ?></span>
						</td>
				<?php endif; ?>
				</tr>
			<?php endforeach; ?>
			<?php foreach ($this->contentlangs as $contentlang) : ?>
				<?php if (!array_key_exists($contentlang->lang_code, $this->site_langs)) : ?>
					<tr>
						<td>
							<?php echo $contentlang->lang_code; ?>
						</td>
						<td class="center">
							<span class="icon-pending" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('WARNING'); ?></span>
						</td>
						<td class="center">
							<?php if ($contentlang->published) : ?>
								<span class="icon-ok" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('JYES'); ?></span>
							<?php elseif (!$contentlang->published && array_key_exists($contentlang->lang_code, $this->homepages)) : ?>
								<span class="icon-not-ok" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('JNO'); ?></span>
							<?php elseif (!$contentlang->published) : ?>
								<span class="icon-pending" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('WARNING'); ?></span>
							<?php endif; ?>
						</td>
						<td class="center">
							<?php if (!array_key_exists($contentlang->lang_code, $this->homepages)) : ?>
								<span class="icon-pending" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('WARNING'); ?></span>
							<?php else : ?>
								<span class="icon-ok" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('JYES'); ?></span>
							<?php endif; ?>
						</td>
					</tr>
				<?php endif; ?>
			<?php endforeach; ?>
		</tbody>
	</table>
	<?php endif; ?>
</div>
components/com_languages/views/languages/tmpl/default.php000060400000015010152453623450017753 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('bootstrap.tooltip');

$user      = JFactory::getUser();
$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_languages&task=languages.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'contentList', 'adminForm', strtolower($listDirn), $saveOrderingUrl);
}
?>
<form action="<?php echo JRoute::_('index.php?option=com_languages&view=languages'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<div class="clearfix"></div>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped" id="contentList">
				<thead>
					<tr>
						<th width="1%" class="nowrap center hidden-phone">
							<?php echo JHtml::_('searchtools.sort', '', 'a.ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING', 'icon-menu-2'); ?>
						</th>
						<th width="1%"  class="nowrap center">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.published', $listDirn, $listOrder); ?>
						</th>
						<th class="title nowrap">
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
						</th>
						<th class="title nowrap hidden-phone hidden-tablet">
							<?php echo JHtml::_('searchtools.sort', 'COM_LANGUAGES_HEADING_TITLE_NATIVE', 'a.title_native', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_LANGUAGES_HEADING_LANG_TAG', 'a.lang_code', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_LANGUAGES_HEADING_LANG_CODE', 'a.sef', $listDirn, $listOrder); ?>
						</th>
						<th width="8%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_LANGUAGES_HEADING_LANG_IMAGE', 'a.image', $listDirn, $listOrder); ?>
						</th>
						<th width="5%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ACCESS', 'a.access', $listDirn, $listOrder); ?>
						</th>
						<th width="5%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_LANGUAGES_HEADING_HOMEPAGE', 'l.home', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone hidden-tablet">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.lang_id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="11">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
				<?php
				foreach ($this->items as $i => $item) :
					$canCreate = $user->authorise('core.create',     'com_languages');
					$canEdit   = $user->authorise('core.edit',       'com_languages');
					$canChange = $user->authorise('core.edit.state', 'com_languages');
				?>
					<tr class="row<?php echo $i % 2; ?>">
						<td class="order nowrap center hidden-phone">
							<?php if ($canChange) :
								$disableClassName = '';
								$disabledLabel	  = '';

								if (!$saveOrder) :
									$disabledLabel    = JText::_('JORDERINGDISABLED');
									$disableClassName = 'inactive tip-top';
								endif; ?>
								<span class="sortable-handler hasTooltip <?php echo $disableClassName; ?>" title="<?php echo $disabledLabel; ?>">
									<span class="icon-menu" aria-hidden="true"></span>
								</span>
								<input type="text" style="display:none" name="order[]" size="5" value="<?php echo $item->ordering; ?>" class="width-20 text-area-order" />
							<?php else : ?>
								<span class="sortable-handler inactive">
									<span class="icon-menu" aria-hidden="true"></span>
								</span>
							<?php endif; ?>
						</td>
						<td>
							<?php echo JHtml::_('grid.id', $i, $item->lang_id); ?>
						</td>
						<td class="center">
							<?php echo JHtml::_('jgrid.published', $item->published, $i, 'languages.', $canChange); ?>
						</td>
						<td>
							<span class="editlinktip hasTooltip" title="<?php echo JHtml::_('tooltipText', JText::_('JGLOBAL_EDIT_ITEM'), $item->title, 0); ?>">
							<?php if ($canEdit) : ?>
								<a href="<?php echo JRoute::_('index.php?option=com_languages&task=language.edit&lang_id=' . (int) $item->lang_id); ?>"><?php echo $this->escape($item->title); ?></a>
							<?php else : ?>
								<?php echo $this->escape($item->title); ?>
							<?php endif; ?>
							</span>
						</td>
						<td class="hidden-phone hidden-tablet">
							<?php echo $this->escape($item->title_native); ?>
						</td>
						<td>
							<?php echo $this->escape($item->lang_code); ?>
						</td>
						<td>
							<?php echo $this->escape($item->sef); ?>
						</td>
						<td class="hidden-phone">
							<?php if ($item->image) : ?>
								<?php echo JHtml::_('image', 'mod_languages/' . $item->image . '.gif', $item->image, null, true); ?>&nbsp;<?php echo $this->escape($item->image); ?>
							<?php else : ?>
								<?php echo JText::_('JNONE'); ?>
							<?php endif; ?>
						</td>
						<td class="hidden-phone">
							<?php echo $this->escape($item->access_level); ?>
						</td>
						<td class="hidden-phone">
							<?php echo ($item->home == '1') ? JText::_('JYES') : JText::_('JNO'); ?>
						</td>
						<td class="hidden-phone hidden-tablet">
							<?php echo $this->escape($item->lang_id); ?>
						</td>
					</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif; ?>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_languages/views/languages/tmpl/default.xml000060400000000330152453623450017763 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_LANGUAGES_LANGUAGES_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_LANGUAGES_LANGUAGES_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_languages/views/languages/view.html.php000060400000006731152453623450017302 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * HTML Languages View class for the Languages component.
 *
 * @since  1.6
 */
class LanguagesViewLanguages extends JViewLegacy
{
	protected $items;

	protected $pagination;

	protected $state;

	/**
	 * Display the view.
	 *
	 * @param   string  $tpl  The name of the template file to parse.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		$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');

		LanguagesHelper::addSubmenu('languages');

		// 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()
	{
		$canDo = JHelperContent::getActions('com_languages');

		JToolbarHelper::title(JText::_('COM_LANGUAGES_VIEW_LANGUAGES_TITLE'), 'comments-2 langmanager');

		if ($canDo->get('core.create'))
		{
			JToolbarHelper::addNew('language.add');
		}

		if ($canDo->get('core.edit'))
		{
			JToolbarHelper::editList('language.edit');
			JToolbarHelper::divider();
		}

		if ($canDo->get('core.edit.state'))
		{
			if ($this->state->get('filter.published') != 2)
			{
				JToolbarHelper::publishList('languages.publish');
				JToolbarHelper::unpublishList('languages.unpublish');
			}
		}

		if ($this->state->get('filter.published') == -2 && $canDo->get('core.delete'))
		{
			JToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'languages.delete', 'JTOOLBAR_EMPTY_TRASH');
			JToolbarHelper::divider();
		}
		elseif ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::trash('languages.trash');
			JToolbarHelper::divider();
		}

		if ($canDo->get('core.admin'))
		{
			// Add install languages link to the lang installer component.
			$bar = JToolbar::getInstance('toolbar');
			$bar->appendButton('Link', 'upload', 'COM_LANGUAGES_INSTALL', 'index.php?option=com_installer&view=languages');
			JToolbarHelper::divider();

			JToolbarHelper::preferences('com_languages');
			JToolbarHelper::divider();
		}

		JToolbarHelper::help('JHELP_EXTENSIONS_LANGUAGE_MANAGER_CONTENT');

		JHtmlSidebar::setAction('index.php?option=com_languages&view=languages');

	}

	/**
	 * 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.ordering'     => JText::_('JGRID_HEADING_ORDERING'),
			'a.published'    => JText::_('JSTATUS'),
			'a.title'        => JText::_('JGLOBAL_TITLE'),
			'a.title_native' => JText::_('COM_LANGUAGES_HEADING_TITLE_NATIVE'),
			'a.lang_code'    => JText::_('COM_LANGUAGES_FIELD_LANG_TAG_LABEL'),
			'a.sef'          => JText::_('COM_LANGUAGES_FIELD_LANG_CODE_LABEL'),
			'a.image'        => JText::_('COM_LANGUAGES_HEADING_LANG_IMAGE'),
			'a.access'       => JText::_('JGRID_HEADING_ACCESS'),
			'a.lang_id'      => JText::_('JGRID_HEADING_ID'),
		);
	}
}
components/com_languages/views/overrides/view.html.php000060400000004775152453623450017344 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View for language overrides list.
 *
 * @since  2.5
 */
class LanguagesViewOverrides extends JViewLegacy
{
	/**
	 * The items to list.
	 *
	 * @var		array
	 * @since	2.5
	 */
	protected $items;

	/**
	 * The pagination object.
	 *
	 * @var		object
	 * @since	2.5
	 */
	protected $pagination;

	/**
	 * The model state.
	 *
	 * @var		object
	 * @since	2.5
	 */
	protected $state;

	/**
	 * Displays the view.
	 *
	 * @param   string  $tpl  The name of the template file to parse.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function display($tpl = null)
	{
		$this->state         = $this->get('State');
		$this->items         = $this->get('Overrides');
		$this->languages     = $this->get('Languages');
		$this->pagination    = $this->get('Pagination');
		$this->filterForm    = $this->get('FilterForm');
		$this->activeFilters = $this->get('ActiveFilters');

		LanguagesHelper::addSubmenu('overrides');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors));
		}

		$this->addToolbar();
		parent::display($tpl);
	}

	/**
	 * Adds the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	protected function addToolbar()
	{
		// Get the results for each action
		$canDo = JHelperContent::getActions('com_languages');

		JToolbarHelper::title(JText::_('COM_LANGUAGES_VIEW_OVERRIDES_TITLE'), 'comments-2 langmanager');

		if ($canDo->get('core.create'))
		{
			JToolbarHelper::addNew('override.add');
		}

		if ($canDo->get('core.edit') && $this->pagination->total)
		{
			JToolbarHelper::editList('override.edit');
		}

		if ($canDo->get('core.delete') && $this->pagination->total)
		{
			JToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'overrides.delete', 'JTOOLBAR_DELETE');
		}

		if (JFactory::getUser()->authorise('core.admin'))
		{
			JToolbarHelper::custom('overrides.purge', 'refresh.png', 'refresh_f2.png', 'COM_LANGUAGES_VIEW_OVERRIDES_PURGE', false);
		}

		if ($canDo->get('core.admin'))
		{
			JToolbarHelper::preferences('com_languages');
		}

		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_EXTENSIONS_LANGUAGE_MANAGER_OVERRIDES');

		JHtmlSidebar::setAction('index.php?option=com_languages&view=overrides');

		$this->sidebar = JHtmlSidebar::render();
	}
}
components/com_languages/views/overrides/tmpl/default.php000060400000007665152453623450020030 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('formbehavior.chosen', 'select');
JHtml::_('bootstrap.tooltip');

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');
$client    = $this->state->get('filter.client') == 'site' ? JText::_('JSITE') : JText::_('JADMINISTRATOR');
$language  = $this->state->get('filter.language');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));

$oppositeClient   = $this->state->get('filter.client') == 'administrator' ? JText::_('JSITE') : JText::_('JADMINISTRATOR');
$oppositeFileName = constant('JPATH_' . strtoupper($this->state->get('filter.client') === 'site' ? 'administrator' : 'site'))
	. '/language/overrides/' . $this->state->get('filter.language', 'en-GB') . '.override.ini';
$oppositeStrings  = JLanguageHelper::parseIniFile($oppositeFileName);
?>

<form action="<?php echo JRoute::_('index.php?option=com_languages&view=overrides'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
        <div class="clearfix"></div>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped" id="overrideList">
				<thead>
					<tr>
						<th width="1%" class="center">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th width="30%" class="left">
							<?php echo JHtml::_('searchtools.sort', 'COM_LANGUAGES_VIEW_OVERRIDES_KEY', 'key', $listDirn, $listOrder); ?>
						</th>
						<th class="left hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_LANGUAGES_VIEW_OVERRIDES_TEXT', 'text', $listDirn, $listOrder); ?>
						</th>
						<th class="nowrap hidden-phone">
							<?php echo JText::_('COM_LANGUAGES_FIELD_LANG_TAG_LABEL'); ?>
						</th>
						<th class="hidden-phone">
							<?php echo JText::_('JCLIENT'); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="5">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
				<?php $canEdit = JFactory::getUser()->authorise('core.edit', 'com_languages'); ?>
				<?php $i = 0; ?>
				<?php foreach ($this->items as $key => $text) : ?>
					<tr class="row<?php echo $i % 2; ?>" id="overriderrow<?php echo $i; ?>">
						<td class="center">
							<?php echo JHtml::_('grid.id', $i, $key); ?>
						</td>
						<td>
							<?php if ($canEdit) : ?>
								<a id="key[<?php echo $this->escape($key); ?>]" href="<?php echo JRoute::_('index.php?option=com_languages&task=override.edit&id=' . $key); ?>"><?php echo $this->escape($key); ?></a>
							<?php else : ?>
								<?php echo $this->escape($key); ?>
							<?php endif; ?>
						</td>
						<td class="hidden-phone">
							<span id="string[<?php echo $this->escape($key); ?>]"><?php echo $this->escape($text); ?></span>
						</td>
						<td class="hidden-phone">
							<?php echo $language; ?>
						</td>
						<td class="hidden-phone">
							<?php echo $client; ?><?php
							if (isset($oppositeStrings[$key]) && $oppositeStrings[$key] === $text)
							{
								echo '/' . $oppositeClient;
							}
							?>
						</td>
					</tr>
				<?php $i++; ?>
				<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif; ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_languages/views/overrides/tmpl/default.xml000060400000000326152453623450020024 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_LANGUAGES_OVERRIDE_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_LANGUAGES_OVERRIDE_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_languages/views/language/view.html.php000060400000004064152453623450017114 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * HTML View class for the Languages component.
 *
 * @since  1.5
 */
class LanguagesViewLanguage extends JViewLegacy
{
	public $item;

	public $form;

	public $state;

	/**
	 * Display the view.
	 *
	 * @param   string  $tpl  The name of the template file to parse.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		$this->item  = $this->get('Item');
		$this->form  = $this->get('Form');
		$this->state = $this->get('State');
		$this->canDo = JHelperContent::getActions('com_languages');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		$this->addToolbar();
		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		JLoader::register('LanguagesHelper', JPATH_ADMINISTRATOR . '/components/com_languages/helpers/languages.php');

		JFactory::getApplication()->input->set('hidemainmenu', 1);
		$isNew = empty($this->item->lang_id);
		$canDo = $this->canDo;

		JToolbarHelper::title(
			JText::_($isNew ? 'COM_LANGUAGES_VIEW_LANGUAGE_EDIT_NEW_TITLE' : 'COM_LANGUAGES_VIEW_LANGUAGE_EDIT_EDIT_TITLE'), 'comments-2 langmanager'
		);

		if (($isNew && $canDo->get('core.create')) || (!$isNew && $canDo->get('core.edit')))
		{
			JToolbarHelper::apply('language.apply');
			JToolbarHelper::save('language.save');
		}

		// If an existing item, can save to a copy only if we have create rights.
		if ($canDo->get('core.create'))
		{
			JToolbarHelper::save2new('language.save2new');
		}

		if ($isNew)
		{
			JToolbarHelper::cancel('language.cancel');
		}
		else
		{
			JToolbarHelper::cancel('language.cancel', 'JTOOLBAR_CLOSE');
		}

		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_EXTENSIONS_LANGUAGE_MANAGER_EDIT');
	}
}
components/com_languages/views/language/tmpl/edit.php000060400000006047152453623450017103 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('formbehavior.chosen', 'select');

JFactory::getDocument()->addScriptDeclaration(
	'
	Joomla.submitbutton = function(task)
	{
		if (task == "language.cancel" || document.formvalidator.isValid(document.getElementById("language-form")))
		{
			Joomla.submitform(task, document.getElementById("language-form"));
		}
	};

	jQuery(document).ready(function() {
		jQuery("#jform_image").on("change", function() {
			var flag = this.value;
			if (flag) {
				jQuery("#flag img").attr("src", "' . JUri::root(true) . '" + "/media/mod_languages/images/" + flag + ".gif").attr("alt", flag);
			}
			else
			{
				jQuery("#flag img").removeAttr("src").removeAttr("alt");
			}
	});
});'
);
?>

<form action="<?php echo JRoute::_('index.php?option=com_languages&view=language&layout=edit&lang_id=' . (int) $this->item->lang_id); ?>" method="post" name="adminForm" id="language-form" class="form-validate form-horizontal">

	<?php echo JLayoutHelper::render('joomla.edit.item_title', $this); ?>

	<fieldset>
	<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'details')); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'details', JText::_('JDETAILS')); ?>
			<?php echo $this->form->renderField('title'); ?>
			<?php echo $this->form->renderField('title_native'); ?>
			<?php echo $this->form->renderField('lang_code'); ?>
			<?php echo $this->form->renderField('sef'); ?>
			<div class="control-group">
					<div class="control-label">
						<?php echo $this->form->getLabel('image'); ?>
					</div>
					<div class="controls">
						<?php echo $this->form->getInput('image'); ?>
						<span id="flag">
							<?php echo JHtml::_('image', 'mod_languages/' . $this->form->getValue('image') . '.gif', $this->form->getValue('image'), null, true); ?>
						</span>
					</div>
			</div>
			<?php if ($this->canDo->get('core.edit.state')) : ?>
				<?php echo $this->form->renderField('published'); ?>
			<?php endif; ?>

			<?php echo $this->form->renderField('access'); ?>
			<?php echo $this->form->renderField('description'); ?>
			<?php echo $this->form->renderField('lang_id'); ?>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'metadata', JText::_('JGLOBAL_FIELDSET_METADATA_OPTIONS')); ?>
		<?php echo $this->form->renderFieldset('metadata'); ?>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'site_name', JText::_('COM_LANGUAGES_FIELDSET_SITE_NAME_LABEL')); ?>
		<?php echo $this->form->renderFieldset('site_name'); ?>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

	<?php echo JHtml::_('bootstrap.endTabSet'); ?>
	</fieldset>
	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>
</form>
components/com_languages/views/installed/tmpl/default.xml000060400000000330152453623450017774 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_LANGUAGES_INSTALLED_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_LANGUAGES_INSTALLED_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_languages/views/installed/tmpl/default.php000060400000011722152453623450017772 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Add specific helper files for html generation
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('formbehavior.chosen', 'select');
JHtml::_('bootstrap.tooltip');

$user      = JFactory::getUser();
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>
<form action="<?php echo JRoute::_('index.php?option=com_languages&view=installed'); ?>" method="post" id="adminForm" name="adminForm">
<?php if (!empty($this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<?php if ($this->total > 0) : ?>
		<table class="table table-striped">
			<thead>
				<tr>
					<th width="1%">
						&#160;
					</th>
					<th width="15%" class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'name', $listDirn, $listOrder); ?>
					</th>
					<th width="15%" class="hidden-phone">
						<?php echo JHtml::_('searchtools.sort', 'COM_LANGUAGES_HEADING_TITLE_NATIVE', 'nativeName', $listDirn, $listOrder); ?>
					</th>
					<th class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'COM_LANGUAGES_HEADING_LANG_TAG', 'language', $listDirn, $listOrder); ?>
					</th>
					<th class="nowrap center">
						<?php echo JHtml::_('searchtools.sort', 'COM_LANGUAGES_HEADING_DEFAULT', 'published', $listDirn, $listOrder); ?>
					</th>
					<th class="nowrap center">
						<?php echo JHtml::_('searchtools.sort', 'COM_LANGUAGES_HEADING_VERSION', 'version', $listDirn, $listOrder); ?>
					</th>
					<th class="hidden-phone">
						<?php echo JHtml::_('searchtools.sort', 'COM_LANGUAGES_HEADING_DATE', 'creationDate', $listDirn, $listOrder); ?>
					</th>
					<th class="hidden-phone">
						<?php echo JHtml::_('searchtools.sort', 'COM_LANGUAGES_HEADING_AUTHOR', 'author', $listDirn, $listOrder); ?>
					</th>
					<th class="hidden-phone hidden-tablet">
						<?php echo JHtml::_('searchtools.sort', 'COM_LANGUAGES_HEADING_AUTHOR_EMAIL', 'authorEmail', $listDirn, $listOrder); ?>
					</th>
					<th class="nowrap hidden-phone">
						<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'extension_id', $listDirn, $listOrder); ?>
					</th>
				</tr>
			</thead>
			<tfoot>
				<tr>
					<td colspan="10">
						<?php echo $this->pagination->getListFooter(); ?>
					</td>
				</tr>
			</tfoot>
			<tbody>
			<?php
			$version = new JVersion;
			$currentShortVersion = preg_replace('#^([0-9\.]+)(|.*)$#', '$1', $version->getShortVersion());
			foreach ($this->rows as $i => $row) :
				$canCreate = $user->authorise('core.create',     'com_languages');
				$canEdit   = $user->authorise('core.edit',       'com_languages');
				$canChange = $user->authorise('core.edit.state', 'com_languages');
			?>
				<tr class="row<?php echo $i % 2; ?>">
					<td>
						<?php echo JHtml::_('languages.id', $i, $row->language); ?>
					</td>
					<td>
						<label for="cb<?php echo $i; ?>">
							<?php echo $this->escape($row->name); ?>
						</label>
					</td>
					<td class="hidden-phone">
						<?php echo $this->escape($row->nativeName); ?>
					</td>
					<td>
						<?php echo $this->escape($row->language); ?>
					</td>
					<td class="center">
						<?php echo JHtml::_('jgrid.isdefault', $row->published, $i, 'installed.', !$row->published && $canChange); ?>
					</td>
					<td class="center small">
					<?php $minorVersion = $version::MAJOR_VERSION . '.' . $version::MINOR_VERSION; ?>
					<?php // Display a Note if language pack version is not equal to Joomla version ?>
					<?php if (strpos($row->version, $minorVersion) !== 0 || strpos($row->version, $currentShortVersion) !== 0) : ?>
						<span class="label label-warning hasTooltip" title="<?php echo JText::_('JGLOBAL_LANGUAGE_VERSION_NOT_PLATFORM'); ?>"><?php echo $row->version; ?></span>
					<?php else : ?>
						<span class="label label-success"><?php echo $row->version; ?></span>
					<?php endif; ?>
					</td>
					<td class="hidden-phone">
						<?php echo $this->escape($row->creationDate); ?>
					</td>
					<td class="hidden-phone">
						<?php echo $this->escape($row->author); ?>
					</td>
					<td class="hidden-phone hidden-tablet">
						<?php echo JStringPunycode::emailToUTF8($this->escape($row->authorEmail)); ?>
					</td>
					<td class="hidden-phone">
						<?php echo $this->escape($row->extension_id); ?>
					</td>
				</tr>
			<?php endforeach; ?>
			</tbody>
		</table>
		<?php endif; ?>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_languages/views/installed/view.html.php000060400000005700152453623450017306 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Displays a list of the installed languages.
 *
 * @since  1.6
 */
class LanguagesViewInstalled extends JViewLegacy
{
	/**
	 * @var object client object.
	 * @deprecated 4.0
	 */
	protected $client = null;

	/**
	 * @var boolean|JException True, if FTP settings should be shown, or an exception.
	 */
	protected $ftp = null;

	/**
	 * @var string option name.
	 */
	protected $option = null;

	/**
	 * @var object pagination information.
	 */
	protected $pagination = null;

	/**
	 * @var array languages information.
	 */
	protected $rows = null;

	/**
	 * @var object user object
	 */
	protected $user = null;

	/**
	 * Display the view.
	 *
	 * @param   string  $tpl  The name of the template file to parse.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		$this->ftp           = $this->get('Ftp');
		$this->option        = $this->get('Option');
		$this->pagination    = $this->get('Pagination');
		$this->rows          = $this->get('Data');
		$this->total         = $this->get('Total');
		$this->state         = $this->get('State');
		$this->filterForm    = $this->get('FilterForm');
		$this->activeFilters = $this->get('ActiveFilters');

		LanguagesHelper::addSubmenu('installed');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		$this->addToolbar();

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		$canDo = JHelperContent::getActions('com_languages');

		if ((int) $this->state->get('client_id') === 1)
		{
			JToolbarHelper::title(JText::_('COM_LANGUAGES_VIEW_INSTALLED_ADMIN_TITLE'), 'comments-2 langmanager');
		}
		else
		{
			JToolbarHelper::title(JText::_('COM_LANGUAGES_VIEW_INSTALLED_SITE_TITLE'), 'comments-2 langmanager');
		}

		if ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::makeDefault('installed.setDefault');
			JToolbarHelper::divider();
		}

		if ($canDo->get('core.admin'))
		{
			// Add install languages link to the lang installer component.
			$bar = JToolbar::getInstance('toolbar');

			// Switch administrator language
			if ($this->state->get('client_id', 0) == 1)
			{
				JToolbarHelper::custom('installed.switchadminlanguage', 'refresh', 'refresh', 'COM_LANGUAGES_SWITCH_ADMIN', false);
				JToolbarHelper::divider();
			}

			$bar->appendButton('Link', 'upload', 'COM_LANGUAGES_INSTALL', 'index.php?option=com_installer&view=languages');
			JToolbarHelper::divider();

			JToolbarHelper::preferences('com_languages');
			JToolbarHelper::divider();
		}

		JToolbarHelper::help('JHELP_EXTENSIONS_LANGUAGE_MANAGER_INSTALLED');

		$this->sidebar = JHtmlSidebar::render();
	}
}
components/com_languages/config.xml000060400000000716152453623450013535 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
		>

		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			filter="rules"
			validate="rules"
			component="com_languages"
			section="component" 
		/>

		<field
			type="hidden"
			name="site"
		/>

		<field
			type="hidden"
			name="administrator"
		/>
	</fieldset>
</config>
components/com_languages/layouts/joomla/searchtools/default/bar.php000060400000001356152453623450021757 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_associations
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$data = $displayData;

if ($data['view'] instanceof LanguagesViewOverrides)
{
	// We will get the language_client filter & remove it from the form filters
	$langClient = $data['view']->filterForm->getField('language_client'); ?>
	<div class="js-stools-field-filter js-stools-selector">
		<?php echo $langClient->input; ?>
	</div>
<?php
}
// Display the main joomla layout
echo JLayoutHelper::render('joomla.searchtools.default.bar', $data, null, array('component' => 'none')); ?>
components/com_languages/controller.php000060400000003147152453623450014443 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_languages
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Languages Controller.
 *
 * @since  1.5
 */
class LanguagesController extends JControllerLegacy
{
	/**
	 * @var	    string	The default view.
	 * @since   1.6
	 */
	protected $default_view = 'installed';

	/**
	 * 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  LanguagesController  This object to support chaining.
	 *
	 * @since   1.5
	 */
	public function display($cachable = false, $urlparams = false)
	{
		JLoader::register('LanguagesHelper', JPATH_ADMINISTRATOR . '/components/com_languages/helpers/languages.php');

		$view   = $this->input->get('view', 'languages');
		$layout = $this->input->get('layout', 'default');
		$id     = $this->input->getInt('id');

		// Check for edit form.
		if ($view == 'language' && $layout == 'edit' && !$this->checkEditId('com_languages.edit.language', $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_languages&view=languages', false));

			return false;
		}

		return parent::display();
	}
}
components/com_languages/access.xml000060400000001320152453623450013521 0ustar00<?xml version="1.0" encoding="utf-8" ?>
<access component="com_languages">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
	</section>
</access>
components/com_contact/views/contact/tmpl/edit_params.php000060400000001727152453623450020003 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$fieldSets = $this->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 '<p class="alert alert-info">' . $this->escape(JText::_($fieldSet->description)) . '</p>';
	endif;
	?>
		<?php foreach ($this->form->getFieldset($name) as $field) : ?>
			<div class="control-group">
				<div class="control-label"><?php echo $field->label; ?></div>
				<div class="controls"><?php echo $field->input; ?></div>
			</div>
		<?php endforeach; ?>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
<?php endforeach; ?>
components/com_contact/views/contact/tmpl/edit_metadata.php000060400000000504152453623450020270 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

echo JLayoutHelper::render('joomla.edit.metadata', $this);
components/com_contact/views/contact/tmpl/modal_metadata.php000060400000000504152453623450020437 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

echo JLayoutHelper::render('joomla.edit.metadata', $this);
components/com_contact/views/contact/tmpl/modal_params.php000060400000001727152453623450020152 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$fieldSets = $this->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 '<p class="alert alert-info">' . $this->escape(JText::_($fieldSet->description)) . '</p>';
	endif;
	?>
		<?php foreach ($this->form->getFieldset($name) as $field) : ?>
			<div class="control-group">
				<div class="control-label"><?php echo $field->label; ?></div>
				<div class="controls"><?php echo $field->input; ?></div>
			</div>
		<?php endforeach; ?>
	<?php echo JHtml::_('bootstrap.endTab'); ?>
<?php endforeach; ?>
components/com_contact/views/contact/tmpl/edit.php000060400000011647152453623450016442 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');
JHtml::_('formbehavior.chosen', '#jform_catid', null, array('disable_search_threshold' => 0 ));
JHtml::_('formbehavior.chosen', '#jform_tags', null, array('placeholder_text_multiple' => JText::_('JGLOBAL_TYPE_OR_SELECT_SOME_TAGS')));
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' : '';
?>

<form action="<?php echo JRoute::_('index.php?option=com_contact&layout=' . $layout . $tmpl . '&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="contact-form" class="form-validate">

	<?php echo JLayoutHelper::render('joomla.edit.title_alias', $this); ?>

	<div class="form-horizontal">
		<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'details')); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'details', empty($this->item->id) ? JText::_('COM_CONTACT_NEW_CONTACT') : JText::_('COM_CONTACT_EDIT_CONTACT')); ?>
		<div class="row-fluid">
			<div class="span9">
				<div class="row-fluid form-horizontal-desktop float-cols" >
					<div class="span6">
						<?php echo $this->form->renderField('user_id'); ?>
						<?php echo $this->form->renderField('image'); ?>
						<?php echo $this->form->renderField('con_position'); ?>
						<?php echo $this->form->renderField('email_to'); ?>
						<?php echo $this->form->renderField('address'); ?>
						<?php echo $this->form->renderField('suburb'); ?>
						<?php echo $this->form->renderField('state'); ?>
						<?php echo $this->form->renderField('postcode'); ?>
						<?php echo $this->form->renderField('country'); ?>
					</div>
					<div class="span6">
						<?php echo $this->form->renderField('telephone'); ?>
						<?php echo $this->form->renderField('mobile'); ?>
						<?php echo $this->form->renderField('fax'); ?>
						<?php echo $this->form->renderField('webpage'); ?>
						<?php echo $this->form->renderField('sortname1'); ?>
						<?php echo $this->form->renderField('sortname2'); ?>
						<?php echo $this->form->renderField('sortname3'); ?>
					</div>
				</div>
			</div>
			<div class="span3">
				<?php echo JLayoutHelper::render('joomla.edit.global', $this); ?>
			</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'misc', JText::_('JGLOBAL_FIELDSET_MISCELLANEOUS')); ?>
		<div class="row-fluid form-horizontal-desktop">
				<div class="form-vertical">
					<?php echo $this->form->renderField('misc'); ?>
				</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php echo JLayoutHelper::render('joomla.edit.params', $this); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'publishing', JText::_('JGLOBAL_FIELDSET_PUBLISHING')); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('joomla.edit.publishingdata', $this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('joomla.edit.metadata', $this); ?>
			</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php if ( ! $isModal && $assoc) : ?>
			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'associations', JText::_('JGLOBAL_FIELDSET_ASSOCIATIONS')); ?>
			<?php echo $this->loadTemplate('associations'); ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php elseif ($isModal && $assoc) : ?>
			<div class="hidden"><?php echo $this->loadTemplate('associations'); ?></div>
		<?php endif; ?>

		<?php echo JHtml::_('bootstrap.endTabSet'); ?>
	</div>
	<input type="hidden" name="task" value="" />
	<input type="hidden" name="forcedLanguage" value="<?php echo $input->get('forcedLanguage', '', 'cmd'); ?>" />
	<?php echo JHtml::_('form.token'); ?>
</form>
components/com_contact/views/contact/tmpl/modal_associations.php000060400000000510152453623450021353 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

echo JLayoutHelper::render('joomla.edit.associations', $this);
components/com_contact/views/contact/tmpl/modal.php000060400000002541152453623450016602 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip', '.hasTooltip', array('placement' => '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);
		}
	}
');
?>
<button id="applyBtn" type="button" class="hidden" onclick="Joomla.submitbutton('contact.apply'); jEditContactModal();"></button>
<button id="saveBtn" type="button" class="hidden" onclick="Joomla.submitbutton('contact.save'); jEditContactModal();"></button>
<button id="closeBtn" type="button" class="hidden" onclick="Joomla.submitbutton('contact.cancel');"></button>

<div class="container-popup">
	<?php $this->setLayout('edit'); ?>
	<?php echo $this->loadTemplate(); ?>
</div>
components/com_contact/views/contact/tmpl/edit_associations.php000060400000000510152453623450021204 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

echo JLayoutHelper::render('joomla.edit.associations', $this);
components/com_contact/views/contact/view.html.php000060400000010442152453623450016446 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View to edit a contact.
 *
 * @since  1.6
 */
class ContactViewContact extends JViewLegacy
{
	/**
	 * The JForm object
	 *
	 * @var  JForm
	 */
	protected $form;

	/**
	 * The active item
	 *
	 * @var  object
	 */
	protected $item;

	/**
	 * The model state
	 *
	 * @var  object
	 */
	protected $state;

	/**
	 * Display the view.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		// Initialise variables.
		$this->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);
			}

			if (JLanguageAssociations::isEnabled() && JComponentHelper::isEnabled('com_associations'))
			{
				JToolbarHelper::custom('contact.editAssociations', 'contract', 'contract', 'JTOOLBAR_ASSOCIATIONS', false, false);
			}

			JToolbarHelper::cancel('contact.cancel', 'JTOOLBAR_CLOSE');
		}

		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_COMPONENTS_CONTACTS_CONTACTS_EDIT');
	}
}
components/com_contact/views/contacts/tmpl/default_batch_footer.php000060400000001443152453623450022034 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

?>
<button type="button" class="btn" onclick="document.getElementById('batch-category-id').value='';document.getElementById('batch-access').value='';document.getElementById('batch-language-id').value='';document.getElementById('batch-user-id').value='';document.getElementById('batch-tag-id').value=''" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<button type="submit" class="btn btn-success" onclick="Joomla.submitbutton('contact.batch');return false;">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>
components/com_contact/views/contacts/tmpl/modal.php000060400000013143152453623450016765 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$app = JFactory::getApplication();

if ($app->isClient('site'))
{
	JSession::checkToken('get') or die(JText::_('JINVALID_TOKEN'));
}

JLoader::register('ContactHelperRoute', JPATH_ROOT . '/components/com_contact/helpers/route.php');

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');
JHtml::_('behavior.polyfill', array('event'), 'lt IE 9');
JHtml::_('script', 'com_contact/admin-contacts-modal.min.js', array('version' => 'auto', 'relative' => true));

// 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'));

$function  = $app->input->getCmd('function', 'jSelectContact');
$editor    = $app->input->getCmd('editor', '');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$onclick   = $this->escape($function);

if (!empty($editor))
{
	// This view is used also in com_menus. Load the xtd script only if the editor is set!
	JFactory::getDocument()->addScriptOptions('xtd-contacts', array('editor' => $editor));
	$onclick = "jSelectContact";
}
?>
<div class="container-popup">

	<form action="<?php echo JRoute::_('index.php?option=com_contact&view=contacts&layout=modal&tmpl=component&editor=' . $editor . '&function=' . $function . '&' . JSession::getFormToken() . '=1'); ?>" method="post" name="adminForm" id="adminForm" class="form-inline">

		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>

		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped table-condensed">
				<thead>
					<tr>
						<th width="1%" class="center nowrap">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.published', $listDirn, $listOrder); ?>
						</th>
						<th class="nowrap title">
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.name', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_CONTACT_FIELD_LINKED_USER_LABEL', 'ul.name', $listDirn, $listOrder); ?>
						</th>
						<th width="15%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ACCESS', 'access_level', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'language_title', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="6">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
				<?php
				$iconStates = array(
					-2 => 'icon-trash',
					0  => 'icon-unpublish',
					1  => 'icon-publish',
					2  => 'icon-archive',
				);
				?>
				<?php foreach ($this->items as $i => $item) : ?>
					<?php if ($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 = '';
					}
					?>
					<tr class="row<?php echo $i % 2; ?>">
						<td class="center">
							<span class="<?php echo $iconStates[$this->escape($item->published)]; ?>" aria-hidden="true"></span>
						</td>
						<td>
							<a class="select-link" href="javascript:void(0)" data-function="<?php echo $this->escape($onclick); ?>" data-id="<?php echo $item->id; ?>" data-title="<?php echo $this->escape($item->name); ?>" data-uri="<?php echo $this->escape(ContactHelperRoute::getContactRoute($item->id, $item->catid, $item->language)); ?>" data-language="<?php echo $this->escape($lang); ?>">
								<?php echo $this->escape($item->name); ?>
							</a>
							<?php echo $this->escape($item->name); ?>
							<div class="small">
								<?php echo JText::_('JCATEGORY') . ': ' . $this->escape($item->category_title); ?>
							</div>
						</td>
						<td>
							<?php if (!empty($item->linked_user)) : ?>
								<?php echo $item->linked_user; ?>
							<?php endif; ?>
						</td>
						<td class="small hidden-phone">
							<?php echo $this->escape($item->access_level); ?>
						</td>
						<td class="small hidden-phone">
							<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
						</td>
						<td align="center">
							<?php echo (int) $item->id; ?>
						</td>
					</tr>
				<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif; ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="forcedLanguage" value="<?php echo $app->input->get('forcedLanguage', '', 'CMD'); ?>" />
		<?php echo JHtml::_('form.token'); ?>

	</form>
</div>
components/com_contact/views/contacts/tmpl/default_batch_body.php000060400000002132152453623450021467 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;
$published = $this->state->get('filter.published');
?>

<div class="container-fluid">
	<div class="row-fluid">
		<div class="control-group span6">
			<div class="controls">
				<?php echo JHtml::_('batch.language'); ?>
			</div>
		</div>
		<div class="control-group span6">
			<div class="controls">
				<?php echo JHtml::_('batch.access'); ?>
			</div>
		</div>
	</div>
	<div class="row-fluid">
		<?php if ($published >= 0) : ?>
			<div class="control-group span6">
				<div class="controls">
					<?php echo JHtml::_('batch.item', 'com_contact'); ?>
				</div>
			</div>
		<?php endif; ?>
		<div class="control-group span6">
			<div class="controls">
				<?php echo JHtml::_('batch.tag'); ?>
			</div>
		</div>
		<div class="control-group span6">
			<div class="controls">
				<?php echo JHtml::_('batch.user'); ?>
			</div>
		</div>
	</div>
</div>
components/com_contact/views/contacts/tmpl/default.php000060400000020231152453623450017311 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$user      = JFactory::getUser();
$userId    = $user->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);
}
?>
<form action="<?php echo JRoute::_('index.php?option=com_contact'); ?>" method="post" name="adminForm" id="adminForm">
	<?php if (!empty($this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
	<?php else : ?>
	<div id="j-main-container">
	<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<div class="clearfix"></div>
		<?php if (empty($this->items)) : ?>
		<div class="alert alert-no-items">
			<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
		</div>
		<?php else : ?>
			<table class="table table-striped" id="contactList">
				<thead>
					<tr>
						<th width="1%" class="nowrap center hidden-phone">
							<?php echo JHtml::_('searchtools.sort', '', 'a.ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING', 'icon-menu-2'); ?>
						</th>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th width="1%" style="min-width:55px" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.published', $listDirn, $listOrder); ?>
						</th>
						<th class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.name', $listDirn, $listOrder); ?>
						</th>
						<th class="nowrap hidden-phone hidden-tablet">
							<?php echo JHtml::_('searchtools.sort', 'COM_CONTACT_FIELD_LINKED_USER_LABEL', 'ul.name', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ACCESS', 'access_level', $listDirn, $listOrder); ?>
						</th>
						<?php if ($assoc) : ?>
						<th width="5%" class="nowrap hidden-phone hidden-tablet">
							<?php echo JHtml::_('searchtools.sort', 'COM_CONTACT_HEADING_ASSOCIATION', 'association', $listDirn, $listOrder); ?>
						</th>
						<?php endif; ?>
						<th width="15%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'language_title', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="10">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
				<?php
				$n = count($this->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);
					?>
					<tr class="row<?php echo $i % 2; ?>" sortable-group-id="<?php echo $item->catid; ?>">
						<td class="order nowrap center hidden-phone">
							<?php
							$iconClass = '';
							if (!$canChange)
							{
								$iconClass = ' inactive';
							}
							elseif (!$saveOrder)
							{
								$iconClass = ' inactive tip-top hasTooltip" title="' . JHtml::_('tooltipText', 'JORDERINGDISABLED');
							}
							?>
							<span class="sortable-handler<?php echo $iconClass; ?>">
								<span class="icon-menu" aria-hidden="true"></span>
							</span>
							<?php if ($canChange && $saveOrder) : ?>
								<input type="text" style="display:none" name="order[]" size="5"
									value="<?php echo $item->ordering; ?>" class="width-20 text-area-order" />
							<?php endif; ?>
						</td>
						<td class="center">
							<?php echo JHtml::_('grid.id', $i, $item->id); ?>
						</td>
						<td class="center">
							<div class="btn-group">
								<?php echo JHtml::_('jgrid.published', $item->published, $i, 'contacts.', $canChange, 'cb', $item->publish_up, $item->publish_down); ?>
								<?php echo JHtml::_('contact.featured', $item->featured, $i, $canChange); ?>
								<?php // Create dropdown items and render the dropdown list.
								if ($canChange)
								{
									JHtml::_('actionsdropdown.' . ((int) $item->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));
								}
								?>
							</div>
						</td>
						<td class="has-context">
							<div class="pull-left break-word">
								<?php if ($item->checked_out) : ?>
									<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'contacts.', $canCheckin); ?>
								<?php endif; ?>
								<?php if ($canEdit || $canEditOwn) : ?>
									<a href="<?php echo JRoute::_('index.php?option=com_contact&task=contact.edit&id=' . (int) $item->id); ?>"><?php echo $this->escape($item->name); ?></a>
								<?php else : ?>
									<?php echo $this->escape($item->name); ?>
								<?php endif; ?>
								<span class="small">
									<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias)); ?>
								</span>
								<div class="small">
									<?php echo JText::_('JCATEGORY') . ': ' . $this->escape($item->category_title); ?>
								</div>
							</div>
						</td>
						<td class="small hidden-phone hidden-tablet">
							<?php if (!empty($item->linked_user)) : ?>
								<a href="<?php echo JRoute::_('index.php?option=com_users&task=user.edit&id=' . $item->user_id); ?>"><?php echo $item->linked_user; ?></a>
								<div class="small"><?php echo $item->email; ?></div>
							<?php endif; ?>
						</td>
						<td class="small hidden-phone">
							<?php echo $item->access_level; ?>
						</td>
						<?php if ($assoc) : ?>
						<td class="hidden-phone hidden-tablet">
							<?php if ($item->association) : ?>
								<?php echo JHtml::_('contact.association', $item->id); ?>
							<?php endif; ?>
						</td>
						<?php endif; ?>
						<td class="small hidden-phone">
							<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
						</td>
						<td class="hidden-phone">
							<?php echo $item->id; ?>
						</td>
					</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
			<?php // Load the batch processing form. ?>
			<?php if ($user->authorise('core.create', 'com_contact')
				&& $user->authorise('core.edit', 'com_contact')
				&& $user->authorise('core.edit.state', 'com_contact')) : ?>
				<?php echo JHtml::_(
					'bootstrap.renderModal',
					'collapseModal',
					array(
						'title'  => JText::_('COM_CONTACT_BATCH_OPTIONS'),
						'footer' => $this->loadTemplate('batch_footer'),
					),
					$this->loadTemplate('batch_body')
				); ?>
			<?php endif; ?>
		<?php endif; ?>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_contact/views/contacts/tmpl/default_batch.php000060400000004135152453623450020457 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$published = $this->state->get('filter.published');
?>
<div class="modal hide fade" id="collapseModal">
	<div class="modal-header">
		<button type="button" class="close" data-dismiss="modal" aria-label="<?php echo JText::_('JLIB_HTML_BEHAVIOR_CLOSE'); ?>">
			<span aria-hidden="true">&times;</span>
		</button>
		<h3><?php echo JText::_('COM_CONTACT_BATCH_OPTIONS'); ?></h3>
	</div>
	<div class="modal-body modal-batch">
		<p><?php echo JText::_('COM_CONTACT_BATCH_TIP'); ?></p>
		<div class="row-fluid">
			<div class="control-group span6">
				<div class="controls">
					<?php echo JHtml::_('batch.language'); ?>
				</div>
			</div>
			<div class="control-group span6">
				<div class="controls">
					<?php echo JHtml::_('batch.access'); ?>
				</div>
			</div>
		</div>
		<div class="row-fluid">
		<?php if ($published >= 0) : ?>
			<div class="control-group span6">
				<div class="controls">
					<?php echo JHtml::_('batch.item', 'com_contact'); ?>
				</div>
			</div>
		<?php endif; ?>
		<div class="control-group span6">
			<div class="controls">
				<?php echo JHtml::_('batch.tag'); ?>
			</div>
		</div>
		<div class="row-fluid">
			<div class="control-group">
				<div class="controls">
					<?php echo JHtml::_('batch.user'); ?>
				</div>
			</div>
		</div>
	</div>
	<div class="modal-footer">
		<button type="button" class="btn" onclick="document.getElementById('batch-category-id').value='';document.getElementById('batch-access').value='';document.getElementById('batch-language-id').value='';document.getElementById('batch-user-id').value='';document.getElementById('batch-tag-id').value=''" data-dismiss="modal">
			<?php echo JText::_('JCANCEL'); ?>
		</button>
		<button type="submit" class="btn btn-primary" onclick="Joomla.submitbutton('contact.batch');return false;">
			<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
		</button>
	</div>
</div>
components/com_contact/views/contacts/view.html.php000060400000013540152453623450016633 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of contacts.
 *
 * @since  1.6
 */
class ContactViewContacts extends JViewLegacy
{
	/**
	 * An array of items
	 *
	 * @var  array
	 */
	protected $items;

	/**
	 * The pagination object
	 *
	 * @var  JPagination
	 */
	protected $pagination;

	/**
	 * The model state
	 *
	 * @var  object
	 */
	protected $state;

	/**
	 * Form object for search filters
	 *
	 * @var  JForm
	 */
	public $filterForm;

	/**
	 * The active search filters
	 *
	 * @var  array
	 */
	public $activeFilters;

	/**
	 * The sidebar markup
	 *
	 * @var  string
	 */
	protected $sidebar;

	/**
	 * Display the view.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		if ($this->getLayout() !== 'modal')
		{
			ContactHelper::addSubmenu('contacts');
		}

		$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);
		}

		// Preprocess the list of items to find ordering divisions.
		// TODO: Complete the ordering stuff with nested sets
		foreach ($this->items as &$item)
		{
			$item->order_up = true;
			$item->order_dn = true;
		}

		// 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('<field name="language" type="hidden" default="' . $forcedLanguage . '" />');
				$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');
			}
		}

		return parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		$canDo = JHelperContent::getActions('com_contact', 'category', $this->state->get('filter.category_id'));
		$user  = JFactory::getUser();

		JToolbarHelper::title(JText::_('COM_CONTACT_MANAGER_CONTACTS'), 'address contact');

		if ($canDo->get('core.create') || count($user->getAuthorisedCategories('com_contact', 'core.create')) > 0)
		{
			JToolbarHelper::addNew('contact.add');
		}

		if ($canDo->get('core.edit') || $canDo->get('core.edit.own'))
		{
			JToolbarHelper::editList('contact.edit');
		}

		if ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::publish('contacts.publish', 'JTOOLBAR_PUBLISH', true);
			JToolbarHelper::unpublish('contacts.unpublish', 'JTOOLBAR_UNPUBLISH', true);
			JToolbarHelper::custom('contacts.featured', 'featured.png', 'featured_f2.png', 'JFEATURE', true);
			JToolbarHelper::custom('contacts.unfeatured', 'unfeatured.png', 'featured_f2.png', 'JUNFEATURE', true);
			JToolbarHelper::archiveList('contacts.archive');
			JToolbarHelper::checkin('contacts.checkin');
		}

		// Add a batch button
		if ($user->authorise('core.create', 'com_contact')
			&& $user->authorise('core.edit', 'com_contact')
			&& $user->authorise('core.edit.state', 'com_contact'))
		{
			$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', 'contacts.delete', 'JTOOLBAR_EMPTY_TRASH');
		}
		elseif ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::trash('contacts.trash');
		}

		if ($user->authorise('core.admin', 'com_contact') || $user->authorise('core.options', 'com_contact'))
		{
			JToolbarHelper::preferences('com_contact');
		}

		JToolbarHelper::help('JHELP_COMPONENTS_CONTACTS_CONTACTS');

		JHtmlSidebar::setAction('index.php?option=com_contact');
	}

	/**
	 * 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.ordering'     => JText::_('JGRID_HEADING_ORDERING'),
			'a.published'    => JText::_('JSTATUS'),
			'a.name'         => JText::_('JGLOBAL_TITLE'),
			'category_title' => JText::_('JCATEGORY'),
			'ul.name'        => JText::_('COM_CONTACT_FIELD_LINKED_USER_LABEL'),
			'a.featured'     => JText::_('JFEATURED'),
			'a.access'       => JText::_('JGRID_HEADING_ACCESS'),
			'a.language'     => JText::_('JGRID_HEADING_LANGUAGE'),
			'a.id'           => JText::_('JGRID_HEADING_ID'),
		);
	}
}
components/com_contact/access.xml000060400000005347152453623450013223 0ustar00<?xml version="1.0" encoding="utf-8"?>
<access component="com_contact">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.options" title="JACTION_OPTIONS" description="JACTION_OPTIONS_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
		<action name="core.edit.own" title="JACTION_EDITOWN" description="JACTION_EDITOWN_COMPONENT_DESC" />
		<action name="core.edit.value" title="JACTION_EDITVALUE" description="JACTION_EDITVALUE_COMPONENT_DESC" />
	</section>
	<section name="category">
		<action name="core.create" title="JACTION_CREATE" description="COM_CATEGORIES_ACCESS_CREATE_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="COM_CATEGORIES_ACCESS_DELETE_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="COM_CATEGORIES_ACCESS_EDIT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_CATEGORIES_ACCESS_EDITSTATE_DESC" />
		<action name="core.edit.own" title="JACTION_EDITOWN" description="COM_CATEGORIES_ACCESS_EDITOWN_DESC" />
	</section>
	<section name="fieldgroup">
		<action name="core.create" title="JACTION_CREATE" description="COM_FIELDS_GROUP_PERMISSION_CREATE_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="COM_FIELDS_GROUP_PERMISSION_DELETE_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="COM_FIELDS_GROUP_PERMISSION_EDIT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_FIELDS_GROUP_PERMISSION_EDITSTATE_DESC" />
		<action name="core.edit.own" title="JACTION_EDITOWN" description="COM_FIELDS_GROUP_PERMISSION_EDITOWN_DESC" />
		<action name="core.edit.value" title="JACTION_EDITVALUE" description="COM_FIELDS_GROUP_PERMISSION_EDITVALUE_DESC" />
	</section>
	<section name="field">
		<action name="core.delete" title="JACTION_DELETE" description="COM_FIELDS_FIELD_PERMISSION_DELETE_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="COM_FIELDS_FIELD_PERMISSION_EDIT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_FIELDS_FIELD_PERMISSION_EDITSTATE_DESC" />
		<action name="core.edit.value" title="JACTION_EDITVALUE" description="COM_FIELDS_FIELD_PERMISSION_EDITVALUE_DESC" />
	</section>
</access>components/com_contact/config.xml000060400000064577152453623450013241 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>

	<fieldset
		name="contact"
		label="COM_CONTACT_FIELD_CONFIG_INDIVIDUAL_CONTACT_DISPLAY"
		description="COM_CONTACT_FIELD_CONFIG_INDIVIDUAL_CONTACT_DESC"
		addfieldpath="/administrator/components/com_fields/models/fields"
		>

		<field
			name="contact_layout"
			type="componentlayout"
			label="JGLOBAL_FIELD_LAYOUT_LABEL"
			description="JGLOBAL_FIELD_LAYOUT_DESC"
			menuitems="true"
			extension="com_contact"
			view="contact"
		/>

		<field
			name="show_contact_category"
			type="list"
			label="COM_CONTACT_FIELD_CONTACT_SHOW_CATEGORY_LABEL"
			description="COM_CONTACT_FIELD_CONTACT_SHOW_CATEGORY_DESC"
			default="hide"
			class="chzn-color"
			>
			<option value="hide">JHIDE</option>
			<option value="show_no_link">COM_CONTACT_FIELD_VALUE_NO_LINK</option>
			<option value="show_with_link">COM_CONTACT_FIELD_VALUE_WITH_LINK</option>
		</field>

		<field
			name="save_history"
			type="radio"
			label="JGLOBAL_SAVE_HISTORY_OPTIONS_LABEL"
			description="JGLOBAL_SAVE_HISTORY_OPTIONS_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="history_limit"
			type="number"
			label="JGLOBAL_HISTORY_LIMIT_OPTIONS_LABEL"
			description="JGLOBAL_HISTORY_LIMIT_OPTIONS_DESC"
			default="10"
			filter="integer"
			showon="save_history:1"
		/>

		<field
			name="show_contact_list"
			type="radio"
			label="COM_CONTACT_FIELD_CONTACT_SHOW_LIST_LABEL"
			description="COM_CONTACT_FIELD_CONTACT_SHOW_LIST_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="presentation_style"
			type="list"
			label="COM_CONTACT_FIELD_PRESENTATION_LABEL"
			description="COM_CONTACT_FIELD_PRESENTATION_DESC"
			default="sliders"
			>
			<option value="sliders">COM_CONTACT_FIELD_VALUE_SLIDERS</option>
			<option value="tabs">COM_CONTACT_FIELD_VALUE_TABS</option>
			<option value="plain">COM_CONTACT_FIELD_VALUE_PLAIN</option>
		</field>

		<field
			name="show_tags"
			type="radio"
			label="COM_CONTACT_FIELD_SHOW_TAGS_LABEL"
			description="COM_CONTACT_FIELD_SHOW_TAGS_DESC"
			id="show_tags"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_info"
			type="radio"
			label="COM_CONTACT_FIELD_SHOW_INFO_LABEL"
			description="COM_CONTACT_FIELD_SHOW_INFO_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_name"
			type="radio"
			label="COM_CONTACT_FIELD_PARAMS_NAME_LABEL"
			description="COM_CONTACT_FIELD_PARAMS_NAME_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			showon="show_info:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>	

		<field
			name="show_position"
			type="radio"
			label="COM_CONTACT_FIELD_PARAMS_CONTACT_POSITION_LABEL"
			description="COM_CONTACT_FIELD_PARAMS_CONTACT_POSITION_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			showon="show_info:1"			
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_email"
			type="radio"
			label="JGLOBAL_EMAIL"
			description="COM_CONTACT_FIELD_PARAMS_CONTACT_E_MAIL_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			showon="show_info:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="add_mailto_link"
			type="radio"
			label="COM_CONTACT_FIELD_PARAMS_ADD_MAILTO_LINK_LABEL"
			description="COM_CONTACT_FIELD_PARAMS_ADD_MAILTO_LINK_DESC"
			class="btn-group btn-group-yesno"
			showon="show_info:1[AND]show_email:1"
			default="1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="show_street_address"
			type="radio"
			label="COM_CONTACT_FIELD_PARAMS_STREET_ADDRESS_LABEL"
			description="COM_CONTACT_FIELD_PARAMS_STREET_ADDRESS_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			showon="show_info:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_suburb"
			type="radio"
			label="COM_CONTACT_FIELD_PARAMS_TOWN-SUBURB_LABEL"
			description="COM_CONTACT_FIELD_PARAMS_TOWN-SUBURB_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			showon="show_info:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_state"
			type="radio"
			label="COM_CONTACT_FIELD_PARAMS_STATE-COUNTY_LABEL"
			description="COM_CONTACT_FIELD_PARAMS_STATE-COUNTY_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			showon="show_info:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_postcode"
			type="radio"
			label="COM_CONTACT_FIELD_PARAMS_POST-ZIP_CODE_LABEL"
			description="COM_CONTACT_FIELD_PARAMS_POST-ZIP_CODE_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			showon="show_info:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_country"
			type="radio"
			label="COM_CONTACT_FIELD_PARAMS_COUNTRY_LABEL"
			description="COM_CONTACT_FIELD_PARAMS_COUNTRY_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			showon="show_info:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_telephone"
			type="radio"
			label="COM_CONTACT_FIELD_PARAMS_TELEPHONE_LABEL"
			description="COM_CONTACT_FIELD_PARAMS_TELEPHONE_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			showon="show_info:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_mobile"
			type="radio"
			label="COM_CONTACT_FIELD_PARAMS_MOBILE_LABEL"
			description="COM_CONTACT_FIELD_PARAMS_MOBILE_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			showon="show_info:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_fax"
			type="radio"
			label="COM_CONTACT_FIELD_PARAMS_FAX_LABEL"
			description="COM_CONTACT_FIELD_PARAMS_FAX_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			showon="show_info:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_webpage"
			type="radio"
			label="COM_CONTACT_FIELD_PARAMS_WEBPAGE_LABEL"
			description="COM_CONTACT_FIELD_PARAMS_WEBPAGE_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			showon="show_info:1"			
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_image"
			type="radio"
			label="COM_CONTACT_FIELD_PARAMS_SHOW_IMAGE_LABEL"
			description="COM_CONTACT_FIELD_PARAMS_SHOW_IMAGE_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			showon="show_info:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="image"
			type="media"
			label="COM_CONTACT_FIELD_PARAMS_IMAGE_LABEL"
			description="COM_CONTACT_FIELD_PARAMS_IMAGE_DESC"
			default=""
			showon="show_info:1[AND]show_image:1"
		/>

		<field
			name="show_misc"
			type="radio"
			label="COM_CONTACT_FIELD_PARAMS_MISC_INFO_LABEL"
			description="COM_CONTACT_FIELD_PARAMS_MISC_INFO_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="allow_vcard"
			type="radio"
			label="COM_CONTACT_FIELD_PARAMS_VCARD_LABEL"
			description="COM_CONTACT_FIELD_PARAMS_VCARD_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_articles"
			type="radio"
			label="COM_CONTACT_FIELD_ARTICLES_SHOW_LABEL"
			description="COM_CONTACT_FIELD_ARTICLES_SHOW_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="articles_display_num"
			type="list"
			label="COM_CONTACT_FIELD_ARTICLES_DISPLAY_NUM_LABEL"
			description="COM_CONTACT_FIELD_ARTICLES_DISPLAY_NUM_DESC"
			default="10"
			showon="show_articles:1"
			>
			<option value="use_contact">COM_CONTACT_FIELD_VALUE_USE_CONTACT_SETTINGS</option>
			<option value="5">J5</option>
			<option value="10">J10</option>
			<option value="15">J15</option>
			<option value="20">J20</option>
			<option value="25">J25</option>
			<option value="30">J30</option>
			<option value="50">J50</option>
			<option value="75">J75</option>
			<option value="100">J100</option>
			<option value="150">J150</option>
			<option value="200">J200</option>
			<option value="250">J250</option>
			<option value="300">J300</option>
			<option value="0">JALL</option>
		</field>

		<field
			name="show_profile"
			type="radio"
			label="COM_CONTACT_FIELD_PROFILE_SHOW_LABEL"
			description="COM_CONTACT_FIELD_PROFILE_SHOW_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_user_custom_fields"
			type="fieldgroups"
			label="COM_CONTACT_FIELD_USER_CUSTOM_FIELDS_SHOW_LABEL"
			description="COM_CONTACT_FIELD_USER_CUSTOM_FIELDS_SHOW_DESC"
			multiple="true"
			context="com_users.user"
			>
			<option value="-1">JALL</option>
		</field>

		<field
			name="show_links"
			type="radio"
			label="COM_CONTACT_FIELD_SHOW_LINKS_LABEL"
			description="COM_CONTACT_FIELD_SHOW_LINKS_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="linka_name"
			type="text"
			label="COM_CONTACT_FIELD_LINKA_NAME_LABEL"
			description="COM_CONTACT_FIELD_LINK_NAME_DESC"
			size="30"
			default=""
			showon="show_links:1"
		/>

		<field
			name="linkb_name"
			type="text"
			label="COM_CONTACT_FIELD_LINKB_NAME_LABEL"
			description="COM_CONTACT_FIELD_LINK_NAME_DESC"
			size="30"
			default=""
			showon="show_links:1"
		/>

		<field
			name="linkc_name"
			type="text"
			label="COM_CONTACT_FIELD_LINKC_NAME_LABEL"
			description="COM_CONTACT_FIELD_LINK_NAME_DESC"
			size="30"
			default=""
			showon="show_links:1"
		/>

		<field
			name="linkd_name"
			type="text"
			label="COM_CONTACT_FIELD_LINKD_NAME_LABEL"
			description="COM_CONTACT_FIELD_LINK_NAME_DESC"
			size="30"
			default=""
			showon="show_links:1"
		/>

		<field
			name="linke_name"
			type="text"
			label="COM_CONTACT_FIELD_LINKE_NAME_LABEL"
			description="COM_CONTACT_FIELD_LINK_NAME_DESC"
			size="30"
			default=""
			showon="show_links:1"
		/>

	</fieldset>

	<fieldset
		name="Icons"
		label="COM_CONTACT_ICONS_SETTINGS"
		description="COM_CONTACT_FIELD_CONFIG_INDIVIDUAL_CONTACT_DESC"
		>

		<field
			name="contact_icons"
			type="list"
			label="COM_CONTACT_FIELD_ICONS_SETTINGS_LABEL"
			description="COM_CONTACT_FIELD_ICONS_SETTINGS_DESC"
			default="0"
			>
			<option value="0">COM_CONTACT_FIELD_VALUE_ICONS</option>
			<option value="1">COM_CONTACT_FIELD_VALUE_TEXT</option>
			<option value="2">COM_CONTACT_FIELD_VALUE_NONE</option>
		</field>

		<field
			name="icon_address"
			type="media"
			label="COM_CONTACT_FIELD_ICONS_ADDRESS_LABEL"
			description="COM_CONTACT_FIELD_ICONS_ADDRESS_DESC"
			hide_none="1"
			default=""
			showon="contact_icons:0"
		/>

		<field
			name="icon_email"
			type="media"
			label="COM_CONTACT_FIELD_ICONS_EMAIL_LABEL"
			description="COM_CONTACT_FIELD_ICONS_EMAIL_DESC"
			hide_none="1"
			default=""
			showon="contact_icons:0"
		/>

		<field
			name="icon_telephone"
			type="media"
			label="COM_CONTACT_FIELD_ICONS_TELEPHONE_LABEL"
			description="COM_CONTACT_FIELD_ICONS_TELEPHONE_DESC"
			hide_none="1"
			default=""
			showon="contact_icons:0"
		/>

		<field
			name="icon_mobile"
			type="media"
			label="COM_CONTACT_FIELD_ICONS_MOBILE_LABEL"
			description="COM_CONTACT_FIELD_ICONS_MOBILE_DESC"
			hide_none="1"
			default=""
			showon="contact_icons:0"
		/>

		<field
			name="icon_fax"
			type="media"
			label="COM_CONTACT_FIELD_ICONS_FAX_LABEL"
			description="COM_CONTACT_FIELD_ICONS_FAX_DESC"
			hide_none="1"
			default=""
			showon="contact_icons:0"
		/>

		<field
			name="icon_misc"
			type="media"
			label="COM_CONTACT_FIELD_ICONS_MISC_LABEL"
			description="COM_CONTACT_FIELD_ICONS_MISC_DESC"
			hide_none="1"
			default=""
			showon="contact_icons:0"
		/>
	</fieldset>

	<fieldset
		name="Category"
		label="JCATEGORY"
		description="COM_CONTACT_FIELD_CONFIG_CATEGORY_DESC"
		>

		<field
			name="category_layout"
			type="componentlayout"
			label="JGLOBAL_FIELD_LAYOUT_LABEL"
			description="JGLOBAL_FIELD_LAYOUT_DESC"
			menuitems="true"
			extension="com_contact"
			view="category"
		/>

		<field
			name="show_category_title"
			type="radio"
			label="JGLOBAL_SHOW_CATEGORY_TITLE"
			description="JGLOBAL_SHOW_CATEGORY_TITLE_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_description"
			type="radio"
			label="JGLOBAL_SHOW_CATEGORY_DESCRIPTION_LABEL"
			description="JGLOBAL_SHOW_CATEGORY_DESCRIPTION_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_description_image"
			type="radio"
			label="JGLOBAL_SHOW_CATEGORY_IMAGE_LABEL"
			description="JGLOBAL_SHOW_CATEGORY_IMAGE_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="maxLevel"
			type="list"
			label="JGLOBAL_MAXIMUM_CATEGORY_LEVELS_LABEL"
			description="JGLOBAL_MAXIMUM_CATEGORY_LEVELS_DESC"
			default="-1"
			>
			<option value="-1">JALL</option>
			<option value="0">JNONE</option>
			<option value="1">J1</option>
			<option value="2">J2</option>
			<option value="3">J3</option>
			<option value="4">J4</option>
			<option value="5">J5</option>
		</field>

		<field
			name="show_subcat_desc"
			type="radio"
			label="JGLOBAL_SHOW_SUBCATEGORIES_DESCRIPTION_LABEL"
			description="JGLOBAL_SHOW_SUBCATEGORIES_DESCRIPTION_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			showon="maxLevel:-1,1,2,3,4,5"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_empty_categories"
			type="radio"
			label="JGLOBAL_SHOW_EMPTY_CATEGORIES_LABEL"
			description="COM_CONTACT_SHOW_EMPTY_CATEGORIES_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			showon="maxLevel:-1,1,2,3,4,5"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_cat_items"
			type="radio"
			label="COM_CONTACT_FIELD_SHOW_CAT_ITEMS_LABEL"
			description="COM_CONTACT_FIELD_SHOW_CAT_ITEMS_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_cat_tags"
			type="radio"
			label="COM_CONTACT_FIELD_SHOW_CAT_TAGS_LABEL"
			description="COM_CONTACT_FIELD_SHOW_CAT_TAGS_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>
	</fieldset>

	<fieldset
		name="categories"
		label="JCATEGORIES"
		description="COM_CONTACT_FIELD_CONFIG_CATEGORIES_DESC"
		>

		<field
			name="show_base_description"
			type="radio"
			label="JGLOBAL_FIELD_SHOW_BASE_DESCRIPTION_LABEL"
			description="JGLOBAL_FIELD_SHOW_BASE_DESCRIPTION_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="maxLevelcat"
			type="list"
			label="JGLOBAL_MAXIMUM_CATEGORY_LEVELS_LABEL"
			description="JGLOBAL_MAXIMUM_CATEGORY_LEVELS_DESC"
			default="-1"
			>
			<option value="-1">JALL</option>
			<option value="0">JNONE</option>
			<option value="1">J1</option>
			<option value="2">J2</option>
			<option value="3">J3</option>
			<option value="4">J4</option>
			<option value="5">J5</option>
		</field>

		<field
			name="show_subcat_desc_cat"
			type="radio"
			label="JGLOBAL_SHOW_SUBCATEGORIES_DESCRIPTION_LABEL"
			description="JGLOBAL_SHOW_SUBCATEGORIES_DESCRIPTION_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			showon="maxLevelcat:-1,1,2,3,4,5"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_empty_categories_cat"
			type="radio"
			label="JGLOBAL_SHOW_EMPTY_CATEGORIES_LABEL"
			description="COM_CONTACT_SHOW_EMPTY_CATEGORIES_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			showon="maxLevelcat:-1,1,2,3,4,5"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_cat_items_cat"
			type="radio"
			label="COM_CONTACT_FIELD_SHOW_CAT_ITEMS_LABEL"
			description="COM_CONTACT_FIELD_SHOW_CAT_ITEMS_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

	</fieldset>

	<fieldset
		name="contacts"
		label="JGLOBAL_LIST_LAYOUT_OPTIONS"
		description="COM_CONTACT_FIELD_CONFIG_TABLE_OF_CONTACTS_DESC"
		>

		<field
			name="filter_field"
			type="radio"
			label="JGLOBAL_FILTER_FIELD_LABEL"
			description="JGLOBAL_FILTER_FIELD_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_pagination_limit"
			type="radio"
			label="JGLOBAL_DISPLAY_SELECT_LABEL"
			description="JGLOBAL_DISPLAY_SELECT_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_headings"
			type="radio"
			label="JGLOBAL_SHOW_HEADINGS_LABEL"
			description="JGLOBAL_SHOW_HEADINGS_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_image_heading"
			type="radio"
			label="COM_CONTACT_FIELD_CONFIG_SHOW_IMAGE_LABEL"
			description="COM_CONTACT_FIELD_CONFIG_SHOW_IMAGE_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_position_headings"
			type="radio"
			label="COM_CONTACT_FIELD_CONFIG_POSITION_LABEL"
			description="COM_CONTACT_FIELD_CONFIG_POSITION_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			showon="show_headings:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_email_headings"
			type="radio"
			label="JGLOBAL_EMAIL"
			description="COM_CONTACT_FIELD_CONFIG_EMAIL_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			showon="show_headings:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_telephone_headings"
			type="radio"
			label="COM_CONTACT_FIELD_CONFIG_PHONE_LABEL"
			description="COM_CONTACT_FIELD_CONFIG_PHONE_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			showon="show_headings:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_mobile_headings"
			type="radio"
			label="COM_CONTACT_FIELD_CONFIG_MOBILE_LABEL"
			description="COM_CONTACT_FIELD_CONFIG_MOBILE_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			showon="show_headings:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_fax_headings"
			type="radio"
			label="COM_CONTACT_FIELD_CONFIG_FAX_LABEL"
			description="COM_CONTACT_FIELD_CONFIG_FAX_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			showon="show_headings:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_suburb_headings"
			type="radio"
			label="COM_CONTACT_FIELD_CONFIG_SUBURB_LABEL"
			description="COM_CONTACT_FIELD_CONFIG_SUBURB_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			showon="show_headings:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_state_headings"
			type="radio"
			label="COM_CONTACT_FIELD_CONFIG_STATE_LABEL"
			description="COM_CONTACT_FIELD_CONFIG_STATE_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			showon="show_headings:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_country_headings"
			type="radio"
			label="COM_CONTACT_FIELD_CONFIG_COUNTRY_LABEL"
			description="COM_CONTACT_FIELD_CONFIG_COUNTRY_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			showon="show_headings:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_pagination"
			type="list"
			label="JGLOBAL_PAGINATION_LABEL"
			description="JGLOBAL_PAGINATION_DESC"
			default="2"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
			<option value="2">JGLOBAL_AUTO</option>
		</field>

		<field
			name="show_pagination_results"
			type="radio"
			label="JGLOBAL_PAGINATION_RESULTS_LABEL"
			description="JGLOBAL_PAGINATION_RESULTS_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			showon="show_pagination:1,2"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="initial_sort"
			type="list"
			label="COM_CONTACT_FIELD_INITIAL_SORT_LABEL"
			description="COM_CONTACT_FIELD_INITIAL_SORT_DESC"
			default="ordering"
			validate="options"
			>
			<option value="name">COM_CONTACT_FIELD_VALUE_NAME</option>
			<option value="sortname">COM_CONTACT_FIELD_VALUE_SORT_NAME</option>
			<option value="ordering">COM_CONTACT_FIELD_VALUE_ORDERING</option>
		</field>

	</fieldset>

	<fieldset
		name="Contact_Form"
		label="COM_CONTACT_FIELD_CONFIG_CONTACT_FORM"
		description="COM_CONTACT_FIELD_CONFIG_INDIVIDUAL_CONTACT_DESC"
		>

		<field
			name="captcha"
			type="plugins"
			label="COM_CONTACT_FIELD_CAPTCHA_LABEL"
			description="COM_CONTACT_FIELD_CAPTCHA_DESC"
			folder="captcha"
			filter="cmd"
			useglobal="true"
			>
			<option value="0">JOPTION_DO_NOT_USE</option>
		</field>

		<field
			name="show_email_form"
			type="radio"
			label="COM_CONTACT_FIELD_EMAIL_SHOW_FORM_LABEL"
			description="COM_CONTACT_FIELD_EMAIL_SHOW_FORM_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_email_copy"
			type="radio"
			label="COM_CONTACT_FIELD_EMAIL_EMAIL_COPY_LABEL"
			description="COM_CONTACT_FIELD_EMAIL_EMAIL_COPY_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			showon="show_email_form:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="banned_email"
			type="textarea"
			label="COM_CONTACT_FIELD_CONFIG_BANNED_EMAIL_LABEL"
			description="COM_CONTACT_FIELD_CONFIG_BANNED_EMAIL_DESC"
			default=""
			rows="3"
			cols="30"
			showon="show_email_form:1"
		/>

		<field
			name="banned_subject"
			type="textarea"
			label="COM_CONTACT_FIELD_CONFIG_BANNED_SUBJECT_LABEL"
			description="COM_CONTACT_FIELD_CONFIG_BANNED_SUBJECT_DESC"
			default=""
			rows="3"
			cols="30"
			showon="show_email_form:1"
		/>

		<field
			name="banned_text"
			type="textarea"
			label="COM_CONTACT_FIELD_CONFIG_BANNED_TEXT_LABEL"
			description="COM_CONTACT_FIELD_CONFIG_BANNED_TEXT_DESC"
			default=""
			rows="3"
			cols="30"
			showon="show_email_form:1"
		/>

		<field
			name="validate_session"
			type="radio"
			label="COM_CONTACT_FIELD_CONFIG_SESSION_CHECK_LABEL"
			description="COM_CONTACT_FIELD_CONFIG_SESSION_CHECK_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			showon="show_email_form:1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="custom_reply"
			type="radio"
			label="COM_CONTACT_FIELD_CONFIG_CUSTOM_REPLY_LABEL"
			description="COM_CONTACT_FIELD_CONFIG_CUSTOM_REPLY_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			showon="show_email_form:1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="redirect"
			type="text"
			label="COM_CONTACT_FIELD_CONFIG_REDIRECT_LABEL"
			description="COM_CONTACT_FIELD_CONFIG_REDIRECT_DESC"
			default=""
			size="30"
			showon="show_email_form:1"
		/>

	</fieldset>

	<fieldset
		name="integration"
		label="JGLOBAL_INTEGRATION_LABEL"
		description="COM_CONTACT_CONFIG_INTEGRATION_SETTINGS_DESC"
		>

		<field
			name="integration_newsfeeds"
			type="note"
			label="JGLOBAL_FEED_TITLE"
		/>

		<field
			name="show_feed_link"
			type="radio"
			label="JGLOBAL_SHOW_FEED_LINK_LABEL"
			description="JGLOBAL_SHOW_FEED_LINK_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="integration_sef"
			type="note"
			label="JGLOBAL_SEF_TITLE"
		/>

		<field
			name="sef_advanced"
			type="radio"
			class="btn-group btn-group-yesno btn-group-reversed"
			default="0"
			label="JGLOBAL_SEF_ADVANCED_LABEL"
			description="JGLOBAL_SEF_ADVANCED_DESC"
			filter="integer"
		>
			<option value="0">JGLOBAL_SEF_ADVANCED_LEGACY</option>
			<option value="1">JGLOBAL_SEF_ADVANCED_MODERN</option>
		</field>

		<field
			name="sef_ids"
			type="radio"
			label="JGLOBAL_SEF_NOIDS_LABEL"
			description="JGLOBAL_SEF_NOIDS_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			showon="sef_advanced:1"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="integration_customfields"
			type="note"
			label="JGLOBAL_FIELDS_TITLE"
		/>

		<field
			name="custom_fields_enable"
			type="radio"
			label="JGLOBAL_CUSTOM_FIELDS_ENABLE_LABEL"
			description="JGLOBAL_CUSTOM_FIELDS_ENABLE_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

	</fieldset>

	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
		>

		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			validate="rules"
			filter="rules"
			component="com_contact"
			section="component"
		/>

	</fieldset>
</config>
components/com_contact/tables/contact.php000060400000012555152453623450014655 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;

/**
 * Contact Table class.
 *
 * @since  1.0
 */
class ContactTableContact extends JTable
{
	/**
	 * Ensure the params and metadata in json encoded in the bind method
	 *
	 * @var    array
	 * @since  3.3
	 */
	protected $_jsonEncode = array('params', 'metadata');

	/**
	 * Constructor
	 *
	 * @param   JDatabaseDriver  $db  Database connector object
	 *
	 * @since   1.0
	 */
	public function __construct(&$db)
	{
		parent::__construct('#__contact_details', 'id', $db);

		$this->setColumnAlias('title', 'name');

		JTableObserverTags::createObserver($this, array('typeAlias' => '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;
	}
}
components/com_contact/controller.php000060400000003130152453623450014120 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Component Controller
 *
 * @since  1.5
 */
class ContactController extends JControllerLegacy
{
	/**
	 * The default view.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $default_view = 'contacts';

	/**
	 * 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  ContactController  This object to support chaining.
	 *
	 * @since   1.5
	 */
	public function display($cachable = false, $urlparams = array())
	{
		JLoader::register('ContactHelper', JPATH_ADMINISTRATOR . '/components/com_contact/helpers/contact.php');

		$view   = $this->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();
	}
}
components/com_contact/models/fields/modal/contact.php000060400000023366152453623450017232 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Language\LanguageHelper;

/**
 * Supports a modal contact picker.
 *
 * @since  1.6
 */
class JFormFieldModal_Contact extends JFormField
{
	/**
	 * The form field type.
	 *
	 * @var     string
	 * @since   1.6
	 */
	protected $type = 'Modal_Contact';

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string  The field input markup.
	 *
	 * @since   1.6
	 */
	protected function getInput()
	{
		$allowNew       = ((string) $this->element['new'] == 'true');
		$allowEdit      = ((string) $this->element['edit'] == 'true');
		$allowClear     = ((string) $this->element['clear'] != 'false');
		$allowSelect    = ((string) $this->element['select'] != 'false');
		$allowPropagate = ((string) $this->element['propagate'] == 'true');

		$languages = LanguageHelper::getContentLanguages(array(0, 1));

		// 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);
				}
				");

				JText::script('JGLOBAL_ASSOCIATIONS_PROPAGATE_FAILED');

				$scriptSelect[$this->id] = true;
			}
		}

		// Setup variables for display.
		$linkContacts = 'index.php?option=com_contact&amp;view=contacts&amp;layout=modal&amp;tmpl=component&amp;' . JSession::getFormToken() . '=1';
		$linkContact  = 'index.php?option=com_contact&amp;view=contact&amp;layout=modal&amp;tmpl=component&amp;' . JSession::getFormToken() . '=1';
		$modalTitle   = JText::_('COM_CONTACT_CHANGE_CONTACT');

		if (isset($this->element['language']))
		{
			$linkContacts .= '&amp;forcedLanguage=' . $this->element['language'];
			$linkContact   .= '&amp;forcedLanguage=' . $this->element['language'];
			$modalTitle     .= ' &#8212; ' . $this->element['label'];
		}

		$urlSelect = $linkContacts . '&amp;function=jSelectContact_' . $this->id;
		$urlEdit   = $linkContact . '&amp;task=contact.edit&amp;id=\' + document.getElementById("' . $this->id . '_id").value + \'';
		$urlNew    = $linkContact . '&amp;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  = '<span class="input-append">';
		$html .= '<input class="input-medium" id="' . $this->id . '_name" type="text" value="' . $title . '" disabled="disabled" size="35" />';

		// Select contact button
		if ($allowSelect)
		{
			$html .= '<button'
				. ' type="button"'
				. ' class="btn hasTooltip' . ($value ? ' hidden' : '') . '"'
				. ' id="' . $this->id . '_select"'
				. ' data-toggle="modal"'
				. ' data-target="#ModalSelect' . $modalId . '"'
				. ' title="' . JHtml::tooltipText('COM_CONTACT_CHANGE_CONTACT') . '">'
				. '<span class="icon-file" aria-hidden="true"></span> ' . JText::_('JSELECT')
				. '</button>';
		}

		// New contact button
		if ($allowNew)
		{
			$html .= '<button'
				. ' type="button"'
				. ' class="btn hasTooltip' . ($value ? ' hidden' : '') . '"'
				. ' id="' . $this->id . '_new"'
				. ' data-toggle="modal"'
				. ' data-target="#ModalNew' . $modalId . '"'
				. ' title="' . JHtml::tooltipText('COM_CONTACT_NEW_CONTACT') . '">'
				. '<span class="icon-new" aria-hidden="true"></span> ' . JText::_('JACTION_CREATE')
				. '</button>';
		}

		// Edit contact button
		if ($allowEdit)
		{
			$html .= '<button'
				. ' type="button"'
				. ' class="btn hasTooltip' . ($value ? '' : ' hidden') . '"'
				. ' id="' . $this->id . '_edit"'
				. ' data-toggle="modal"'
				. ' data-target="#ModalEdit' . $modalId . '"'
				. ' title="' . JHtml::tooltipText('COM_CONTACT_EDIT_CONTACT') . '">'
				. '<span class="icon-edit" aria-hidden="true"></span> ' . JText::_('JACTION_EDIT')
				. '</button>';
		}

		// Clear contact button
		if ($allowClear)
		{
			$html .= '<button'
				. ' type="button"'
				. ' class="btn' . ($value ? '' : ' hidden') . '"'
				. ' id="' . $this->id . '_clear"'
				. ' onclick="window.processModalParent(\'' . $this->id . '\'); return false;">'
				. '<span class="icon-remove" aria-hidden="true"></span>' . JText::_('JCLEAR')
				. '</button>';
		}

		// Propagate contact button
		if ($allowPropagate && count($languages) > 2)
		{
			// Strip off language tag at the end
			$tagLength = (int) strlen($this->element['language']);
			$callbackFunctionStem = substr("jSelectContact_" . $this->id, 0, -$tagLength);

			$html .= '<a'
			. ' class="btn hasTooltip' . ($value ? '' : ' hidden') . '"'
			. ' id="' . $this->id . '_propagate"'
			. ' href="#"'
			. ' title="' . JHtml::tooltipText('JGLOBAL_ASSOCIATIONS_PROPAGATE_TIP') . '"'
			. ' onclick="Joomla.propagateAssociation(\'' . $this->id . '\', \'' . $callbackFunctionStem . '\');">'
			. '<span class="icon-refresh" aria-hidden="true"></span>' . JText::_('JGLOBAL_ASSOCIATIONS_PROPAGATE_BUTTON')
			. '</a>';
		}

		$html .= '</span>';

		// 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'      => '<button type="button" class="btn" data-dismiss="modal">' . JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>',
				)
			);
		}

		// 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'      => '<button type="button" class="btn"'
							. ' onclick="window.processModalEdit(this, \''
							. $this->id . '\', \'add\', \'contact\', \'cancel\', \'contact-form\', \'jform_id\', \'jform_name\'); return false;">'
							. JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>'
							. '<button type="button" class="btn btn-primary"'
							. ' onclick="window.processModalEdit(this, \''
							. $this->id . '\', \'add\', \'contact\', \'save\', \'contact-form\', \'jform_id\', \'jform_name\'); return false;">'
							. JText::_('JSAVE') . '</button>'
							. '<button type="button" class="btn btn-success"'
							. ' onclick="window.processModalEdit(this, \''
							. $this->id . '\', \'add\', \'contact\', \'apply\', \'contact-form\', \'jform_id\', \'jform_name\'); return false;">'
							. JText::_('JAPPLY') . '</button>',
				)
			);
		}

		// 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'      => '<button type="button" class="btn"'
							. ' onclick="window.processModalEdit(this, \'' . $this->id
							. '\', \'edit\', \'contact\', \'cancel\', \'contact-form\', \'jform_id\', \'jform_name\'); return false;">'
							. JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>'
							. '<button type="button" class="btn btn-primary"'
							. ' onclick="window.processModalEdit(this, \''
							. $this->id . '\', \'edit\', \'contact\', \'save\', \'contact-form\', \'jform_id\', \'jform_name\'); return false;">'
							. JText::_('JSAVE') . '</button>'
							. '<button type="button" class="btn btn-success"'
							. ' onclick="window.processModalEdit(this, \''
							. $this->id . '\', \'edit\', \'contact\', \'apply\', \'contact-form\', \'jform_id\', \'jform_name\'); return false;">'
							. JText::_('JAPPLY') . '</button>',
				)
			);
		}

		// Note: class='required' for client side validation.
		$class = $this->required ? ' class="required modal-value"' : '';

		$html .= '<input type="hidden" id="' . $this->id . '_id"' . $class . ' data-required="' . (int) $this->required . '" name="' . $this->name
			. '" data-text="' . htmlspecialchars(JText::_('COM_CONTACT_SELECT_A_CONTACT', true), ENT_COMPAT, 'UTF-8') . '" value="' . $value . '" />';

		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());
	}
}
components/com_contact/models/forms/contact.xml000060400000053200152453623450016015 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>

	<fieldset addfieldpath="/administrator/components/com_categories/models/fields">

		<field
			name="id"
			type="number"
			label="JGLOBAL_FIELD_ID_LABEL"
			description="JGLOBAL_FIELD_ID_DESC"
			default="0"
			class="readonly"
			size="10"
			readonly="true"
		/>

		<field
			name="name"
			type="text"
			label="COM_CONTACT_FIELD_NAME_LABEL"
			description="COM_CONTACT_FIELD_NAME_DESC"
			class="input-xxlarge input-large-text"
			size="40"
			required="true"
		 />

		<field
			name="alias"
			type="text"
			label="JFIELD_ALIAS_LABEL"
			description="JFIELD_ALIAS_DESC"
			size="45"
			hint="JFIELD_ALIAS_PLACEHOLDER"
		/>

		<field
			name="version_note"
			type="text"
			label="JGLOBAL_FIELD_VERSION_NOTE_LABEL"
			description="JGLOBAL_FIELD_VERSION_NOTE_DESC"
			labelclass="control-label"
			class="span12"
			size="45"
			maxlength="255"
		/>

		<field
			name="user_id"
			type="user"
			label="COM_CONTACT_FIELD_LINKED_USER_LABEL"
			description="COM_CONTACT_FIELD_LINKED_USER_DESC"
		/>

		<field
			name="published"
			type="list"
			label="JSTATUS"
			description="JFIELD_PUBLISHED_DESC"
			default="1"
			id="published"
			class="chzn-color-state"
			size="1"
			>
			<option value="1">JPUBLISHED</option>
			<option value="0">JUNPUBLISHED</option>
			<option value="2">JARCHIVED</option>
			<option value="-2">JTRASHED</option>

		</field>

		<field
			name="catid"
			type="categoryedit"
			label="JCATEGORY"
			description="JFIELD_CATEGORY_DESC"
			extension="com_contact"
			required="true"
			default=""
		/>

		<field
			name="access"
			type="accesslevel"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			size="1"
		/>

		<field
			name="misc"
			type="editor"
			label="COM_CONTACT_FIELD_INFORMATION_MISC_LABEL"
			description="COM_CONTACT_FIELD_INFORMATION_MISC_DESC"
			filter="JComponentHelper::filterText"
			buttons="true"
			hide="readmore,pagebreak"
		/>

		<field
			name="created_by"
			type="user"
			label="JGLOBAL_FIELD_CREATED_BY_LABEL"
			description="COM_CONTACT_FIELD_CREATED_BY_DESC"
		/>

		<field
			name="created_by_alias"
			type="text"
			label="COM_CONTACT_FIELD_CREATED_BY_ALIAS_LABEL"
			description="COM_CONTACT_FIELD_CREATED_BY_ALIAS_DESC"
			size="20"
		/>

		<field
			name="created"
			type="calendar"
			label="COM_CONTACT_FIELD_CREATED_LABEL"
			description="COM_CONTACT_FIELD_CREATED_DESC"
			size="22"
			translateformat="true"
			showtime="true"
			filter="user_utc"
		/>

		<field
			name="modified"
			type="calendar"
			label="JGLOBAL_FIELD_MODIFIED_LABEL"
			description="COM_CONTACT_FIELD_MODIFIED_DESC"
			class="readonly"
			size="22"
			readonly="true"
			translateformat="true"
			showtime="true"
			filter="user_utc"
		/>

		<field
			name="modified_by"
			type="user"
			label="JGLOBAL_FIELD_MODIFIED_BY_LABEL"
			description="COM_CONTACT_FIELD_MODIFIED_BY_DESC"
			class="readonly"
			readonly="true"
			filter="unset"
		/>

		<field
			name="checked_out"
			type="hidden"
			filter="unset"
		/>

		<field
			name="checked_out_time"
			type="hidden"
			filter="unset"
		/>

		<field
			name="ordering"
			type="ordering"
			label="JFIELD_ORDERING_LABEL"
			description="JFIELD_ORDERING_DESC"
			content_type="com_contact.contact"
		/>

		<field
			name="publish_up"
			type="calendar"
			label="COM_CONTACT_FIELD_PUBLISH_UP_LABEL"
			description="COM_CONTACT_FIELD_PUBLISH_UP_DESC"
			translateformat="true"
			showtime="true"
			size="22"
			filter="user_utc"
		/>

		<field
			name="publish_down"
			type="calendar"
			label="COM_CONTACT_FIELD_PUBLISH_DOWN_LABEL"
			description="COM_CONTACT_FIELD_PUBLISH_DOWN_DESC"
			translateformat="true"
			showtime="true"
			size="22"
			filter="user_utc"
		/>

		<field
			name="metakey"
			type="textarea"
			label="JFIELD_META_KEYWORDS_LABEL"
			description="JFIELD_META_KEYWORDS_DESC"
			rows="3"
			cols="30"
		 />

		<field
			name="metadesc"
			type="textarea"
			label="JFIELD_META_DESCRIPTION_LABEL"
			description="JFIELD_META_DESCRIPTION_DESC"
			rows="3"
			cols="30"
		/>

		<field
			name="language"
			type="contentlanguage"
			label="JFIELD_LANGUAGE_LABEL"
			description="COM_CONTACT_FIELD_LANGUAGE_DESC"
			>
			<option value="*">JALL</option>
		</field>

		<field
			name="featured"
			type="radio"
			label="JFEATURED"
			description="COM_CONTACT_FIELD_FEATURED_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="tags"
			type="tag"
			label="JTAG"
			description="JTAG_DESC"
			class="span12"
			multiple="true"
		/>

		<field
			name="contact_icons"
			type="list"
			label="COM_CONTACT_FIELD_ICONS_SETTINGS"
			description="COM_CONTACT_FIELD_ICONS_SETTINGS_DESC"
			default="0"
			>
			<option value="0">COM_CONTACT_FIELD_VALUE_NONE</option>
			<option value="1">COM_CONTACT_FIELD_VALUE_TEXT</option>
			<option value="2">COM_CONTACT_FIELD_VALUE_ICONS</option>
		</field>

		<field
			name="icon_address"
			type="media"
			label="COM_CONTACT_FIELD_ICONS_ADDRESS_LABEL"
			description="COM_CONTACT_FIELD_ICONS_ADDRESS_DESC"
			hide_none="1"
		/>

		<field
			name="icon_email"
			type="media"
			label="COM_CONTACT_FIELD_ICONS_EMAIL_LABEL"
			description="COM_CONTACT_FIELD_ICONS_EMAIL_DESC"
			hide_none="1"
		/>

		<field
			name="icon_telephone"
			type="media"
			label="COM_CONTACT_FIELD_ICONS_TELEPHONE_LABEL"
			description="COM_CONTACT_FIELD_ICONS_TELEPHONE_DESC"
			hide_none="1"
		/>

		<field
			name="icon_mobile"
			type="media"
			label="COM_CONTACT_FIELD_ICONS_MOBILE_LABEL"
			description="COM_CONTACT_FIELD_ICONS_MOBILE_DESC"
			hide_none="1"
		/>

		<field
			name="icon_fax"
			type="media"
			label="COM_CONTACT_FIELD_ICONS_FAX_LABEL"
			description="COM_CONTACT_FIELD_ICONS_FAX_DESC"
			hide_none="1"
		/>

		<field
			name="icon_misc"
			type="media"
			label="COM_CONTACT_FIELD_ICONS_MISC_LABEL"
			description="COM_CONTACT_FIELD_ICONS_MISC_DESC"
			hide_none="1"
		/>
	</fieldset>

	<fieldset name="details" label="COM_CONTACT_CONTACT_DETAILS">

		<field
			name="image"
			type="media"
			label="COM_CONTACT_FIELD_PARAMS_IMAGE_LABEL"
			description="COM_CONTACT_FIELD_PARAMS_IMAGE_DESC"
			hide_none="1"
		/>

		<field
			name="con_position"
			type="text"
			label="COM_CONTACT_FIELD_INFORMATION_POSITION_LABEL"
			description="COM_CONTACT_FIELD_INFORMATION_POSITION_DESC"
			size="30"
		/>

		<field
			name="email_to"
			type="email"
			label="JGLOBAL_EMAIL"
			description="COM_CONTACT_FIELD_INFORMATION_EMAIL_DESC"
			size="30"
		/>

		<field
			name="address"
			type="textarea"
			label="COM_CONTACT_FIELD_INFORMATION_ADDRESS_LABEL"
			description="COM_CONTACT_FIELD_INFORMATION_ADDRESS_DESC"
			rows="3"
			cols="30"
		/>

		<field
			name="suburb"
			type="text"
			label="COM_CONTACT_FIELD_INFORMATION_SUBURB_LABEL"
			description="COM_CONTACT_FIELD_INFORMATION_SUBURB_DESC"
			size="30"
		/>

		<field
			name="state"
			type="text"
			label="COM_CONTACT_FIELD_INFORMATION_STATE_LABEL"
			description="COM_CONTACT_FIELD_INFORMATION_STATE_DESC"
			size="30"
		/>

		<field
			name="postcode"
			type="text"
			label="COM_CONTACT_FIELD_INFORMATION_POSTCODE_LABEL"
			description="COM_CONTACT_FIELD_INFORMATION_POSTCODE_DESC"
			size="30"
		/>

		<field
			name="country"
			type="text"
			label="COM_CONTACT_FIELD_INFORMATION_COUNTRY_LABEL"
			description="COM_CONTACT_FIELD_INFORMATION_COUNTRY_DESC"
			size="30"
		/>

		<field
			name="telephone"
			type="text"
			label="COM_CONTACT_FIELD_INFORMATION_TELEPHONE_LABEL"
			description="COM_CONTACT_FIELD_INFORMATION_TELEPHONE_DESC"
			size="30"
		/>

		<field
			name="mobile"
			type="text"
			label="COM_CONTACT_FIELD_INFORMATION_MOBILE_LABEL"
			description="COM_CONTACT_FIELD_INFORMATION_MOBILE_DESC"
			size="30"
		/>

		<field
			name="fax"
			type="text"
			label="COM_CONTACT_FIELD_INFORMATION_FAX_LABEL"
			description="COM_CONTACT_FIELD_INFORMATION_FAX_DESC"
			size="30"
		/>

		<field
			name="webpage"
			type="url"
			label="COM_CONTACT_FIELD_INFORMATION_WEBPAGE_LABEL"
			description="COM_CONTACT_FIELD_INFORMATION_WEBPAGE_DESC"
			size="30"
			filter="url"
			validate="url"
		/>

		<field
			name="sortname1"
			type="text"
			label="COM_CONTACT_FIELD_SORTNAME1_LABEL"
			description="COM_CONTACT_FIELD_SORTNAME1_DESC"
			size="30"
		/>

		<field
			name="sortname2"
			type="text"
			label="COM_CONTACT_FIELD_SORTNAME2_LABEL"
			description="COM_CONTACT_FIELD_SORTNAME2_DESC"
			size="30"
		/>

		<field
			name="sortname3"
			type="text"
			label="COM_CONTACT_FIELD_SORTNAME3_LABEL"
			description="COM_CONTACT_FIELD_SORTNAME3_DESC"
			size="30"
		/>
	</fieldset>

	<fields name="params" label="JGLOBAL_FIELDSET_DISPLAY_OPTIONS">

		<fieldset name="display" label="JGLOBAL_FIELDSET_DISPLAY_OPTIONS"
			 addfieldpath="/administrator/components/com_fields/models/fields">

			<field
				name="show_contact_category"
				type="list"
				label="JGLOBAL_SHOW_CATEGORY_LABEL"
				description="COM_CONTACT_FIELD_SHOW_CATEGORY_DESC"
				class="chzn-color"
				useglobal="true"
				>
				<option value="hide">JHIDE</option>
				<option value="show_no_link">COM_CONTACT_FIELD_VALUE_NO_LINK</option>
				<option value="show_with_link">COM_CONTACT_FIELD_VALUE_WITH_LINK</option>
			</field>

			<field
				name="show_contact_list"
				type="list"
				label="COM_CONTACT_FIELD_CONTACT_SHOW_LIST_LABEL"
				description="COM_CONTACT_FIELD_CONTACT_SHOW_LIST_DESC"
				class="chzn-color"
				useglobal="true"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="presentation_style"
				type="list"
				label="COM_CONTACT_FIELD_PRESENTATION_LABEL"
				description="COM_CONTACT_FIELD_PRESENTATION_DESC"
				useglobal="true"
				>
				<option value="sliders">COM_CONTACT_FIELD_VALUE_SLIDERS</option>
				<option value="tabs">COM_CONTACT_FIELD_VALUE_TABS</option>
				<option value="plain">COM_CONTACT_FIELD_VALUE_PLAIN</option>
			</field>

			<field
				name="show_tags"
				type="list"
				label="COM_CONTACT_FIELD_SHOW_TAGS_LABEL"
				description="COM_CONTACT_FIELD_SHOW_TAGS_DESC"
				class="chzn-color"
				useglobal="true"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="show_info"
				type="list"
				label="COM_CONTACT_FIELD_SHOW_INFO_LABEL"
				description="COM_CONTACT_FIELD_SHOW_INFO_DESC"
				class="chzn-color"
				useglobal="true"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="show_name"
				type="list"
				label="COM_CONTACT_FIELD_PARAMS_NAME_LABEL"
				description="COM_CONTACT_FIELD_PARAMS_NAME_DESC"
				class="chzn-color"
				useglobal="true"
				showon="show_info:1"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="show_position"
				type="list"
				label="COM_CONTACT_FIELD_PARAMS_CONTACT_POSITION_LABEL"
				description="COM_CONTACT_FIELD_PARAMS_CONTACT_POSITION_DESC"
				class="chzn-color"
				useglobal="true"
				showon="show_info:1"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="show_email"
				type="list"
				label="JGLOBAL_EMAIL"
				description="COM_CONTACT_FIELD_PARAMS_CONTACT_E_MAIL_DESC"
				class="chzn-color"
				useglobal="true"
				showon="show_info:1"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="add_mailto_link"
				type="list"
				label="COM_CONTACT_FIELD_PARAMS_ADD_MAILTO_LINK_LABEL"
				description="COM_CONTACT_FIELD_PARAMS_ADD_MAILTO_LINK_DESC"
				class="chzn-color"
				useglobal="true"
				showon="show_info:1"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>

			<field
				name="show_street_address"
				type="list"
				label="COM_CONTACT_FIELD_PARAMS_STREET_ADDRESS_LABEL"
				description="COM_CONTACT_FIELD_PARAMS_STREET_ADDRESS_DESC"
				class="chzn-color"
				useglobal="true"
				showon="show_info:1"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="show_suburb"
				type="list"
				label="COM_CONTACT_FIELD_PARAMS_TOWN-SUBURB_LABEL"
				description="COM_CONTACT_FIELD_PARAMS_TOWN-SUBURB_DESC"
				class="chzn-color"
				useglobal="true"
				showon="show_info:1"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="show_state"
				type="list"
				label="COM_CONTACT_FIELD_PARAMS_STATE-COUNTY_LABEL"
				description="COM_CONTACT_FIELD_PARAMS_STATE-COUNTY_DESC"
				class="chzn-color"
				useglobal="true"
				showon="show_info:1"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="show_postcode"
				type="list"
				label="COM_CONTACT_FIELD_PARAMS_POST-ZIP_CODE_LABEL"
				description="COM_CONTACT_FIELD_PARAMS_POST-ZIP_CODE_DESC"
				class="chzn-color"
				useglobal="true"
				showon="show_info:1"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="show_country"
				type="list"
				label="COM_CONTACT_FIELD_PARAMS_COUNTRY_LABEL"
				description="COM_CONTACT_FIELD_PARAMS_COUNTRY_DESC"
				class="chzn-color"
				useglobal="true"
				showon="show_info:1"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="show_telephone"
				type="list"
				label="COM_CONTACT_FIELD_PARAMS_TELEPHONE_LABEL"
				description="COM_CONTACT_FIELD_PARAMS_TELEPHONE_DESC"
				class="chzn-color"
				useglobal="true"
				showon="show_info:1"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="show_mobile"
				type="list"
				label="COM_CONTACT_FIELD_PARAMS_MOBILE_LABEL"
				description="COM_CONTACT_FIELD_PARAMS_MOBILE_DESC"
				class="chzn-color"
				useglobal="true"
				showon="show_info:1"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="show_fax"
				type="list"
				label="COM_CONTACT_FIELD_PARAMS_FAX_LABEL"
				description="COM_CONTACT_FIELD_PARAMS_FAX_DESC"
				class="chzn-color"
				useglobal="true"
				showon="show_info:1"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="show_webpage"
				type="list"
				label="COM_CONTACT_FIELD_PARAMS_WEBPAGE_LABEL"
				description="COM_CONTACT_FIELD_PARAMS_WEBPAGE_DESC"
				class="chzn-color"
				useglobal="true"
				showon="show_info:1"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="show_image"
				type="list"
				label="COM_CONTACT_FIELD_PARAMS_SHOW_IMAGE_LABEL"
				description="COM_CONTACT_FIELD_PARAMS_SHOW_IMAGE_DESC"
				class="chzn-color"
				useglobal="true"
				showon="show_info:1"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="show_misc"
				type="list"
				label="COM_CONTACT_FIELD_PARAMS_MISC_INFO_LABEL"
				description="COM_CONTACT_FIELD_PARAMS_MISC_INFO_DESC"
				class="chzn-color"
				useglobal="true"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="allow_vcard"
				type="list"
				label="COM_CONTACT_FIELD_PARAMS_VCARD_LABEL"
				description="COM_CONTACT_FIELD_PARAMS_VCARD_DESC"
				class="chzn-color"
				useglobal="true"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="show_articles"
				type="list"
				label="COM_CONTACT_FIELD_ARTICLES_SHOW_LABEL"
				description="COM_CONTACT_FIELD_ARTICLES_SHOW_DESC"
				class="chzn-color"
				useglobal="true"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="articles_display_num"
				type="list"
				label="COM_CONTACT_FIELD_ARTICLES_DISPLAY_NUM_LABEL"
				description="COM_CONTACT_FIELD_ARTICLES_DISPLAY_NUM_DESC"
				default=""
				useglobal="true"
				>
				<option value="5">J5</option>
				<option value="10">J10</option>
				<option value="15">J15</option>
				<option value="20">J20</option>
				<option value="25">J25</option>
				<option value="30">J30</option>
				<option value="50">J50</option>
				<option value="75">J75</option>
				<option value="100">J100</option>
				<option value="150">J150</option>
				<option value="200">J200</option>
				<option value="250">J250</option>
				<option value="300">J300</option>
				<option value="0">JALL</option>
			</field>

			<field
				name="show_profile"
				type="list"
				label="COM_CONTACT_FIELD_PROFILE_SHOW_LABEL"
				description="COM_CONTACT_FIELD_PROFILE_SHOW_DESC"
				class="chzn-color"
				useglobal="true"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="show_user_custom_fields"
				type="fieldgroups"
				label="COM_CONTACT_FIELD_USER_CUSTOM_FIELDS_SHOW_LABEL"
				description="COM_CONTACT_FIELD_USER_CUSTOM_FIELDS_SHOW_DESC"
				multiple="true"
				context="com_users.user"
				>
				<option value="-1">JALL</option>
			</field>

			<field
				name="show_links"
				type="list"
				label="COM_CONTACT_FIELD_SHOW_LINKS_LABEL"
				description="COM_CONTACT_FIELD_SHOW_LINKS_DESC"
				class="chzn-color"
				useglobal="true"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="linka_name"
				type="text"
				label="COM_CONTACT_FIELD_LINKA_NAME_LABEL"
				description="COM_CONTACT_FIELD_LINK_NAME_DESC"
				size="30"
			/>

			<field
				name="linka"
				type="url"
				label="COM_CONTACT_FIELD_LINKA_LABEL"
				description="COM_CONTACT_FIELD_LINKA_DESC"
				size="30"
				filter="url"
				validate="url"
			/>

			<field
				name="linkb_name"
				type="text"
				label="COM_CONTACT_FIELD_LINKB_NAME_LABEL"
				description="COM_CONTACT_FIELD_LINK_NAME_DESC"
				size="30"
			/>

			<field
				name="linkb"
				type="url"
				label="COM_CONTACT_FIELD_LINKB_LABEL"
				description="COM_CONTACT_FIELD_LINKB_DESC"
				size="30"
				filter="url"
				validate="url"
			/>

			<field
				name="linkc_name"
				type="text"
				label="COM_CONTACT_FIELD_LINKC_NAME_LABEL"
				description="COM_CONTACT_FIELD_LINK_NAME_DESC"
				size="30"
			/>

			<field
				name="linkc"
				type="url"
				label="COM_CONTACT_FIELD_LINKC_LABEL"
				description="COM_CONTACT_FIELD_LINKC_DESC"
				size="30"
				filter="url"
				validate="url"
			/>

			<field
				name="linkd_name"
				type="text"
				label="COM_CONTACT_FIELD_LINKD_NAME_LABEL"
				description="COM_CONTACT_FIELD_LINK_NAME_DESC"
				size="30"
			/>

			<field
				name="linkd"
				type="url"
				label="COM_CONTACT_FIELD_LINKD_LABEL"
				description="COM_CONTACT_FIELD_LINKD_DESC"
				size="30"
				filter="url"
				validate="url"
			/>

			<field
				name="linke_name"
				type="text"
				label="COM_CONTACT_FIELD_LINKE_NAME_LABEL"
				description="COM_CONTACT_FIELD_LINK_NAME_DESC"
				size="30"
			/>

			<field
				name="linke"
				type="url"
				label="COM_CONTACT_FIELD_LINKE_LABEL"
				description="COM_CONTACT_FIELD_LINKE_DESC"
				size="30"
				filter="url"
				validate="url"
			/>

			<field
				name="contact_layout"
				type="componentlayout"
				label="JFIELD_ALT_LAYOUT_LABEL"
				description="JFIELD_ALT_COMPONENT_LAYOUT_DESC"
				extension="com_contact"
				view="contact"
				useglobal="true"
			/>
		</fieldset>

		<fieldset name="email" label="COM_CONTACT_FIELDSET_CONTACT_LABEL">

			<field
				name="show_email_form"
				type="list"
				label="COM_CONTACT_FIELD_EMAIL_SHOW_FORM_LABEL"
				description="COM_CONTACT_FIELD_EMAIL_SHOW_FORM_DESC"
				class="chzn-color"
				useglobal="true"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="show_email_copy"
				type="list"
				label="COM_CONTACT_FIELD_EMAIL_EMAIL_COPY_LABEL"
				description="COM_CONTACT_FIELD_EMAIL_EMAIL_COPY_DESC"
				class="chzn-color"
				useglobal="true"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>
			</field>

			<field
				name="validate_session"
				type="list"
				label="COM_CONTACT_FIELD_CONFIG_SESSION_CHECK_LABEL"
				description="COM_CONTACT_FIELD_CONFIG_SESSION_CHECK_DESC"
				class="chzn-color"
				useglobal="true"
				>
				<option value="0">JNO</option>
				<option value="1">JYES</option>
			</field>

			<field
				name="custom_reply"
				type="list"
				label="COM_CONTACT_FIELD_CONFIG_CUSTOM_REPLY_LABEL"
				description="COM_CONTACT_FIELD_CONFIG_CUSTOM_REPLY_DESC"
				class="chzn-color"
				useglobal="true"
				>
				<option value="0">JNO</option>
				<option value="1">JYES</option>
			</field>

			<field
				name="redirect"
				type="text"
				label="COM_CONTACT_FIELD_CONFIG_REDIRECT_LABEL"
				description="COM_CONTACT_FIELD_CONFIG_REDIRECT_DESC"
				size="30"
			/>
		</fieldset>
	</fields>

	<fields name="metadata" label="JGLOBAL_FIELDSET_METADATA_OPTIONS">

		<fieldset name="jmetadata" label="JGLOBAL_FIELDSET_METADATA_OPTIONS">

			<field
				name="robots"
				type="list"
				label="JFIELD_METADATA_ROBOTS_LABEL"
				description="JFIELD_METADATA_ROBOTS_DESC"
				>
				<option value="">JGLOBAL_USE_GLOBAL</option>
				<option value="index, follow"></option>
				<option value="noindex, follow"></option>
				<option value="index, nofollow"></option>
				<option value="noindex, nofollow"></option>
			</field>

			<field
				name="rights"
				type="text"
				label="JFIELD_METADATA_RIGHTS_LABEL"
				description="JFIELD_METADATA_RIGHTS_DESC"
				size="20"
			/>
		</fieldset>
	</fields>

	<field
		name="hits"
		type="number"
		label="JGLOBAL_HITS"
		description="COM_CONTACT_HITS_DESC"
		class="readonly"
		size="6"
		readonly="true"
		filter="unset"
	/>

	<field
		name="version"
		type="text"
		label="COM_CONTACT_FIELD_VERSION_LABEL"
		description="COM_CONTACT_FIELD_VERSION_DESC"
		class="readonly"
		size="6"
		readonly="true"
		filter="unset"
	/>
</form>
components/com_contact/models/forms/filter_contacts.xml000060400000007205152453623450017551 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>

	<fields name="filter">

		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_CONTACT_FILTER_SEARCH_LABEL"
			description="COM_CONTACT_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
		/>

		<field
			name="published"
			type="status"
			label="JOPTION_SELECT_PUBLISHED"
			description="JOPTION_SELECT_PUBLISHED_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>

		<field
			name="category_id"
			type="category"
			label="JOPTION_FILTER_CATEGORY"
			description="JOPTION_FILTER_CATEGORY_DESC"
			extension="com_contact"
			published="0,1,2"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_CATEGORY</option>
		</field>

		<field
			name="access"
			type="accesslevel"
			label="JOPTION_FILTER_ACCESS"
			description="JOPTION_FILTER_ACCESS_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_ACCESS</option>
		</field>

		<field
			name="language"
			type="contentlanguage"
			label="JOPTION_FILTER_LANGUAGE"
			description="JOPTION_FILTER_LANGUAGE_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_LANGUAGE</option>
			<option value="*">JALL</option>
		</field>

		<field
			name="tag"
			type="tag"
			label="JOPTION_FILTER_TAG"
			description="JOPTION_FILTER_TAG_DESC"
			mode="nested"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_TAG</option>
		</field>

		<field
			name="level"
			type="integer"
			label="JOPTION_FILTER_LEVEL"
			description="JOPTION_FILTER_LEVEL_DESC"
			first="1"
			last="10"
			step="1"
			languages="*"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_MAX_LEVELS</option>
		</field>
	</fields>

	<fields name="list">

		<field
			name="fullordering"
			type="list"
			label="COM_CONTACT_LIST_FULL_ORDERING"
			description="COM_CONTACT_LIST_FULL_ORDERING_DESC"
			default="a.name ASC"
			onchange="this.form.submit();"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.published ASC">JSTATUS_ASC</option>
			<option value="a.published DESC">JSTATUS_DESC</option>
			<option value="a.featured ASC">JFEATURED_ASC</option>
			<option value="a.featured DESC">JFEATURED_DESC</option>
			<option value="a.name ASC">JGLOBAL_TITLE_ASC</option>
			<option value="a.name DESC">JGLOBAL_TITLE_DESC</option>
			<option value="category_title ASC">JCATEGORY_ASC</option>
			<option value="category_title DESC">JCATEGORY_DESC</option>
			<option value="ul.name ASC">COM_CONTACT_FIELD_LINKED_USER_LABEL_ASC</option>
			<option value="ul.name DESC">COM_CONTACT_FIELD_LINKED_USER_LABEL_DESC</option>
			<option value="access_level ASC">JGRID_HEADING_ACCESS_ASC</option>
			<option value="access_level DESC">JGRID_HEADING_ACCESS_DESC</option>
			<option
				value="association ASC"
				requires="associations"
				>
				JASSOCIATIONS_ASC
			</option>
			<option
				value="association DESC"
				requires="associations"
				>
				JASSOCIATIONS_DESC
			</option>
			<option value="language_title ASC">JGRID_HEADING_LANGUAGE_ASC</option>
			<option value="language_title DESC">JGRID_HEADING_LANGUAGE_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="COM_CONTACT_LIST_LIMIT"
			description="COM_CONTACT_LIST_LIMIT_DESC"
			default="25"
			class="input-mini"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_contact/models/forms/fields/mail.xml000060400000000353152453623450016553 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="params" label="COM_FIELDS_FIELD_BASIC_LABEL">
		<fieldset name="basic">
			<field
				name="display"
				type="hidden"
				default="2"
			/>
		</fieldset>
	</fields>
</form>
components/com_contact/models/contact.php000060400000032716152453623450014667 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;

JLoader::register('ContactHelper', JPATH_ADMINISTRATOR . '/components/com_contact/helpers/contact.php');

/**
 * Item Model for a Contact.
 *
 * @since  1.6
 */
class ContactModelContact extends JModelAdmin
{
	/**
	 * The type alias for this content type.
	 *
	 * @var    string
	 * @since  3.2
	 */
	public $typeAlias = 'com_contact.contact';

	/**
	 * The context used for the associations table
	 *
	 * @var    string
	 * @since  3.4.4
	 */
	protected $associationsContext = 'com_contact.item';

	/**
	 * Batch copy/move command. If set to false, the batch copy/move command is not supported
	 *
	 * @var  string
	 */
	protected $batch_copymove = 'category_id';

	/**
	 * Allowed batch commands
	 *
	 * @var array
	 */
	protected $batch_commands = array(
		'assetgroup_id' => 'batchAccess',
		'language_id'   => 'batchLanguage',
		'tag'           => 'batchTag',
		'user_id'       => 'batchUser',
	);

	/**
	 * 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) || $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');

		// Create new category, if needed.
		$createCategory = true;

		// If category ID is provided, check if it's valid.
		if (is_numeric($data['catid']) && $data['catid'])
		{
			$createCategory = !CategoriesHelper::validateCategoryId($data['catid'], 'com_contact');
		}

		// Save New Category
		if ($createCategory && $this->canCreateCategory())
		{
			$table = array();

			// Remove #new# prefix, if exists.
			$table['title'] = strpos($data['catid'], '#new#') === 0 ? substr($data['catid'], 5) : $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');

			// Add a prefix for categories created on the fly.
			$form->setFieldAttribute('catid', 'customPrefix', '#new#');
		}

		// Association contact items
		if (JLanguageAssociations::isEnabled())
		{
			$languages = JLanguageHelper::getContentLanguages(false, true, null, 'ordering', 'asc');

			if (count($languages) > 1)
			{
				$addform = new SimpleXMLElement('<form />');
				$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');
					$field->addAttribute('propagate', '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;
	}

	/**
	 * 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');
	}

	/**
	 * Method to validate the form data.
	 *
	 * @param   JForm   $form   The form to validate against.
	 * @param   array   $data   The data to validate.
	 * @param   string  $group  The name of the field group to validate.
	 *
	 * @return  array|boolean  Array of filtered data if valid, false otherwise.
	 *
	 * @see     JFormRule
	 * @see     JFilterInput
	 * @since   3.9.25
	 */
	public function validate($form, $data, $group = null)
	{
		// Don't allow to change the users if not allowed to access com_users.
		if (!JFactory::getUser()->authorise('core.manage', 'com_users'))
		{
			if (isset($data['created_by']))
			{
				unset($data['created_by']);
			}
		}

		return parent::validate($form, $data, $group);
	}
}
components/com_contact/models/contacts.php000060400000023723152453623450015050 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Methods supporting a list of contact records.
 *
 * @since  1.6
 */
class ContactModelContacts extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JControllerLegacy
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'name', 'a.name',
				'alias', 'a.alias',
				'checked_out', 'a.checked_out',
				'checked_out_time', 'a.checked_out_time',
				'catid', 'a.catid', 'category_id', 'category_title',
				'user_id', 'a.user_id',
				'published', 'a.published',
				'access', 'a.access', 'access_level',
				'created', 'a.created',
				'created_by', 'a.created_by',
				'ordering', 'a.ordering',
				'featured', 'a.featured',
				'language', 'a.language', 'language_title',
				'publish_up', 'a.publish_up',
				'publish_down', 'a.publish_down',
				'ul.name', 'linked_user',
				'tag',
				'level', 'c.level',
			);

			$assoc = JLanguageAssociations::isEnabled();

			if ($assoc)
			{
				$config['filter_fields'][] = 'association';
			}
		}

		parent::__construct($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')
	{
		$app = JFactory::getApplication();

		$forcedLanguage = $app->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)
		{
			$subQuery = $db->getQuery(true)
				->select('COUNT(' . $db->quoteName('asso1.id') . ') > 1')
				->from($db->quoteName('#__associations', 'asso1'))
				->join('INNER', $db->quoteName('#__associations', 'asso2') . ' ON ' . $db->quoteName('asso1.key') . ' = ' . $db->quoteName('asso2.key'))
				->where(
					array(
						$db->quoteName('asso1.id') . ' = ' . $db->quoteName('a.id'),
						$db->quoteName('asso1.context') . ' = ' . $db->quote('com_contact.item'),
					)
				);

			$query->select('(' . $subQuery . ') AS ' . $db->quoteName('association'));
		}

		// 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 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 by categories and by level
		$categoryId = $this->getState('filter.category_id', array());
		$level = $this->getState('filter.level');

		if (!is_array($categoryId))
		{
			$categoryId = $categoryId ? array($categoryId) : array();
		}

		// Case: Using both categories filter and by level filter
		if (count($categoryId))
		{
			$categoryId = ArrayHelper::toInteger($categoryId);
			$categoryTable = JTable::getInstance('Category', 'JTable');
			$subCatItemsWhere = array();
		
			foreach ($categoryId as $filter_catid)
			{
				$categoryTable->load($filter_catid);
				$subCatItemsWhere[] = '(' .
					($level ? 'c.level <= ' . ((int) $level + (int) $categoryTable->level - 1) . ' AND ' : '') .
					'c.lft >= ' . (int) $categoryTable->lft . ' AND ' .
					'c.rgt <= ' . (int) $categoryTable->rgt . ')';
			}
		
			$query->where('(' . implode(' OR ', $subCatItemsWhere) . ')');
		}

		// Case: Using only the by level filter
		elseif ($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;
	}
}
components/com_contact/controllers/contact.php000060400000005243152453623450015745 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Controller for a single contact
 *
 * @since  1.6
 */
class ContactControllerContact extends JControllerForm
{
	/**
	 * 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())
	{
		$categoryId = ArrayHelper::getValue($data, 'catid', $this->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 absence 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)
	{
		$this->checkToken();

		// 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);
	}
}
components/com_contact/controllers/ajax.json.php000060400000004502152453623450016202 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Language\LanguageHelper;

/**
 * The contact controller for ajax requests
 *
 * @since  3.9.0
 */
class ContactControllerAjax extends JControllerLegacy
{
	/**
	 * Method to fetch associations of a contact
	 *
	 * The method assumes that the following http parameters are passed in an Ajax Get request:
	 * token: the form token
	 * assocId: the id of the contact whose associations are to be returned
	 * excludeLang: the association for this language is to be excluded
	 *
	 * @return  null
	 *
	 * @since  3.9.0
	 */
	public function fetchAssociations()
	{
		if (!JSession::checkToken('get'))
		{
			echo new JResponseJson(null, JText::_('JINVALID_TOKEN'), true);
		}
		else
		{
			$input = JFactory::getApplication()->input;

			$assocId = $input->getInt('assocId', 0);

			if ($assocId == 0)
			{
				echo new JResponseJson(null, JText::sprintf('JLIB_FORM_VALIDATE_FIELD_INVALID', 'assocId'), true);

				return;
			}

			$excludeLang = $input->get('excludeLang', '', 'STRING');

			$associations = JLanguageAssociations::getAssociations('com_contact', '#__contact_details', 'com_contact.item', (int) $assocId);

			unset($associations[$excludeLang]);

			// Add the title to each of the associated records
			JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_contact/tables');
			$contactTable = JTable::getInstance('Contact', 'ContactTable');

			foreach ($associations as $lang => $association)
			{
				$contactTable->load($association->id);
				$associations[$lang]->title = $contactTable->name;
			}

			$countContentLanguages = count(LanguageHelper::getContentLanguages(array(0, 1)));

			if (count($associations) == 0)
			{
				$message = JText::_('JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_NONE');
			}
			elseif ($countContentLanguages > count($associations) + 2)
			{
				$tags    = implode(', ', array_keys($associations));
				$message = JText::sprintf('JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_SOME', $tags);
			}
			else
			{
				$message = JText::_('JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_ALL');
			}

			echo new JResponseJson($associations, $message);
		}
	}
}
components/com_contact/controllers/contacts.php000060400000005217152453623450016131 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Contacts list controller class.
 *
 * @since  1.6
 */
class ContactControllerContacts extends JControllerAdmin
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JControllerLegacy
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		parent::__construct($config);

		$this->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
		$this->checkToken();

		$ids    = (array) $this->input->get('cid', array(), 'int');
		$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)
		{
			// Remove zero value resulting from input filter
			if ($id === 0)
			{
				unset($ids[$i]);

				continue;
			}

			$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))
		{
			$message = null;

			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);
	}
}
components/com_contact/sql/install.mysql.utf8.sql000060400000004453152453623450016254 0ustar00--
-- Table structure for table `#__contact_details`
--

CREATE TABLE IF NOT EXISTS `#__contact_details` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `alias` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  `con_position` varchar(255),
  `address` text,
  `suburb` varchar(100),
  `state` varchar(100),
  `country` varchar(100),
  `postcode` varchar(100),
  `telephone` varchar(255),
  `fax` varchar(255),
  `misc` mediumtext,
  `image` varchar(255),
  `email_to` varchar(255),
  `default_con` tinyint unsigned NOT NULL DEFAULT 0,
  `published` tinyint NOT NULL DEFAULT 0,
  `checked_out` int unsigned NOT NULL DEFAULT 0,
  `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `ordering` int NOT NULL DEFAULT 0,
  `params` text NOT NULL,
  `user_id` int NOT NULL DEFAULT 0,
  `catid` int NOT NULL DEFAULT 0,
  `access` int unsigned NOT NULL DEFAULT 0,
  `mobile` varchar(255) NOT NULL DEFAULT '',
  `webpage` varchar(255) NOT NULL DEFAULT '',
  `sortname1` varchar(255) NOT NULL DEFAULT '',
  `sortname2` varchar(255) NOT NULL DEFAULT '',
  `sortname3` varchar(255) NOT NULL DEFAULT '',
  `language` varchar(7) NOT NULL,
  `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `created_by` int 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 unsigned NOT NULL DEFAULT 0,
  `metakey` text NOT NULL,
  `metadesc` text NOT NULL,
  `metadata` text NOT NULL,
  `featured` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'Set if contact is featured.',
  `xreference` varchar(50) NOT NULL DEFAULT '' 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 unsigned NOT NULL DEFAULT 1,
  `hits` int 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;
components/com_contact/sql/uninstall.mysql.utf8.sql000060400000000054152453623450016610 0ustar00DROP TABLE IF EXISTS `#__contact_details`;

components/com_contact/helpers/html/contact.php000060400000007427152453623450016013 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

JLoader::register('ContactHelper', JPATH_ADMINISTRATOR . '/components/com_contact/helpers/contact.php');

/**
 * Contact HTML helper class.
 *
 * @since  1.6
 */
abstract class JHtmlContact
{
	/**
	 * Get the associated language flags
	 *
	 * @param   integer  $contactid  The item id to search associations
	 *
	 * @return  string  The language HTML
	 *
	 * @throws  Exception
	 */
	public static function association($contactid)
	{
		// Defaults
		$html = '';

		// Get the associations
		if ($associations = JLanguageAssociations::getAssociations('com_contact', '#__contact_details', 'com_contact.item', $contactid))
		{
			foreach ($associations as $tag => $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') . '<br />' . JText::sprintf('JCATEGORY_SPRINTF', $item->category_title);
					$classes = 'hasPopover label label-association label-' . $item->lang_sef;

					$item->link = '<a href="' . $url . '" title="' . $item->language_title . '" class="' . $classes
						. '" data-content="' . $tooltip . '" data-placement="top">'
						. $text . '</a>';
				}
			}

			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 = 0, $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 = '<a href="#" onclick="return listItemTask(\'cb' . $i . '\',\'' . $state[1] . '\')" class="btn btn-micro hasTooltip'
				. ($value == 1 ? ' active' : '') . '" title="' . JHtml::_('tooltipText', $state[3])
				. '"><span class="icon-' . $icon . '" aria-hidden="true"></span></a>';
		}
		else
		{
			$html = '<a class="btn btn-micro hasTooltip disabled' . ($value == 1 ? ' active' : '') . '" title="'
			. JHtml::_('tooltipText', $state[2]) . '"><span class="icon-' . $icon . '" aria-hidden="true"></span></a>';
		}

		return $html;
	}
}
components/com_contact/helpers/associations.php000060400000007116152453623450016106 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Association\AssociationExtensionHelper;

JTable::addIncludePath(__DIR__ . '/../tables');

/**
 * Content associations helper.
 *
 * @since  3.7.0
 */
class ContactAssociationsHelper extends AssociationExtensionHelper
{
	/**
	 * The extension name
	 *
	 * @var     array   $extension
	 *
	 * @since   3.7.0
	 */
	protected $extension = 'com_contact';

	/**
	 * Array of item types
	 *
	 * @var     array   $itemTypes
	 *
	 * @since   3.7.0
	 */
	protected $itemTypes = array('contact', 'category');

	/**
	 * Has the extension association support
	 *
	 * @var     boolean   $associationsSupport
	 *
	 * @since   3.7.0
	 */
	protected $associationsSupport = true;

	/**
	 * Get the associated items for an item
	 *
	 * @param   string  $typeName  The item type
	 * @param   int     $id        The id of item for which we need the associated items
	 *
	 * @return  array
	 *
	 * @since   3.7.0
	 */
	public function getAssociations($typeName, $id)
	{
		$type = $this->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
		);
	}
}
components/com_contact/helpers/contact.php000060400000007262152453623450015044 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Contact component helper.
 *
 * @since  1.6
 */
class ContactHelper extends JHelperContent
{
	/**
	 * Configure the Linkbar.
	 *
	 * @param   string  $vName  The name of the active view.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public static function addSubmenu($vName)
	{
		JHtmlSidebar::addEntry(
			JText::_('COM_CONTACT_SUBMENU_CONTACTS'),
			'index.php?option=com_contact&view=contacts',
			$vName == 'contacts'
		);

		JHtmlSidebar::addEntry(
			JText::_('COM_CONTACT_SUBMENU_CATEGORIES'),
			'index.php?option=com_categories&extension=com_contact',
			$vName == 'categories'
		);

		if (JComponentHelper::isEnabled('com_fields') && JComponentHelper::getParams('com_contact')->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 category objects
	 *
	 * @return  stdClass[]
	 *
	 * @since   3.5
	 */
	public static function countItems(&$items)
	{
		$config = (object) array(
			'related_tbl'   => 'contact_details',
			'state_col'     => 'published',
			'group_col'     => 'catid',
			'relation_type' => 'category_or_group',
		);

		return parent::countRelations($items, $config);
	}

	/**
	 * Adds Count Items for Tag Manager.
	 *
	 * @param   stdClass[]  &$items     The tag objects
	 * @param   string      $extension  The name of the active view.
	 *
	 * @return  stdClass[]
	 *
	 * @since   3.6
	 */
	public static function countTagItems(&$items, $extension)
	{
		$parts   = explode('.', $extension);
		$section = count($parts) > 1 ? $parts[1] : null;

		$config = (object) array(
			'related_tbl'   => ($section === 'category' ? 'categories' : 'contact_details'),
			'state_col'     => 'published',
			'group_col'     => 'tag_id',
			'extension'     => $extension,
			'relation_type' => 'tag_assigments',
		);

		return parent::countRelations($items, $config);
	}

	/**
	 * 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;
	}
}
components/com_contact/contact.xml000060400000004142152453623450013405 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_contact</name>
	<author>Joomla! Project</author>
	<creationDate>April 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_CONTACT_XML_DESCRIPTION</description>

	<install> <!-- Runs on install -->
		<sql>
			<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
		</sql>
	</install>
	<uninstall> <!-- Runs on uninstall -->
		<sql>
			<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
		</sql>
	</uninstall>

	<files folder="site">
		<filename>contact.php</filename>
		<filename>controller.php</filename>
		<filename>router.php</filename>
		<folder>helpers</folder>
		<folder>models</folder>
		<folder>views</folder>
	</files>
	<languages folder="site">
		<language tag="en-GB">language/en-GB.com_contact.ini</language>
	</languages>

	<administration>
		<menu img="class:contact">COM_CONTACT</menu>
		<submenu>
			<!--
				Note that all & must be escaped to &amp; for the file to be valid
				XML and be parsed by the installer
			-->
			<menu link="option=com_contact" img="class:contact"
				alt="Contact/Contacts">COM_CONTACT_CONTACTS</menu>
			<menu link="option=com_categories&amp;extension=com_contact"
				view="categories" img="class:contact-cat" alt="Contacts/Categories">COM_CONTACT_CATEGORIES</menu>
		</submenu>
		<files folder="admin">
			<filename>access.xml</filename>
			<filename>config.xml</filename>
			<filename>contact.php</filename>
			<filename>controller.php</filename>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>tables</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_contact.ini</language>
			<language tag="en-GB">language/en-GB.com_contact.sys.ini</language>
		</languages>
	</administration>
</extension>

components/com_contact/contact.php000060400000001126152453623450013373 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_contact
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
JHtml::_('behavior.tabstate');

if (!JFactory::getUser()->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();
components/com_finder/views/filter/tmpl/edit.php000060400000006727152453623450016113 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('behavior.tabstate');

JFactory::getDocument()->addScriptDeclaration('
	Joomla.submitbutton = function(task)
	{
		if (task == "filter.cancel" || document.formvalidator.isValid(document.getElementById("adminForm")))
		{
			Joomla.submitform(task, document.getElementById("adminForm"));
		}
	};

	jQuery(document).ready(function($) {
		$("#rightbtn").on("click", function() {
			if($(this).text() == "' . JText::_('COM_FINDER_FILTER_SHOW_ALL') . '") {
				$(".collapse:not(.in)").each(function (index) {
					$(this).collapse("toggle");
				});
				$(this).text("' . JText::_('COM_FINDER_FILTER_HIDE_ALL') . '");
			} else {
				$(this).text("' . JText::_('COM_FINDER_FILTER_SHOW_ALL') . '");
				$(".collapse.in").each(function (index) {
				$(this).collapse("toggle");
			});
		}
		return false;
		});

		$(".filter-node").change(function() {
			$(\'input[id="jform_map_count"]\').val(document.querySelectorAll(\'input[type="checkbox"]:checked\').length);
		});


	});
');

JFactory::getDocument()->addStyleDeclaration('
	.accordion-inner .control-group .controls {
		margin-left: 10px;
	}
	.accordion-inner > .control-group {
		margin-bottom: 0;
	}
	');
?>

<form action="<?php echo JRoute::_('index.php?option=com_finder&view=filter&layout=edit&filter_id=' . (int) $this->item->filter_id); ?>" method="post" name="adminForm" id="adminForm" class="form-validate">

	<?php echo JLayoutHelper::render('joomla.edit.title_alias', $this); ?>

	<div class="form-horizontal">
		<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'details')); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'details', JText::_('COM_FINDER_EDIT_FILTER')); ?>
		<div class="row-fluid">
			<div class="span9">
				<?php if ($this->total > 0) : ?>
					<div class="well">
						<?php echo $this->form->renderField('map_count'); ?>
					</div>
					<button class="btn jform-rightbtn" type="button" onclick="jQuery('.filter-node').each(function () { this.click(); });">
						<span class="icon-checkbox-partial" aria-hidden="true"></span> <?php echo JText::_('JGLOBAL_SELECTION_INVERT'); ?></button>

					<button class="btn pull-right" type="button" id="rightbtn" ><?php echo JText::_('COM_FINDER_FILTER_SHOW_ALL'); ?></button>
					<hr>
				<?php endif; ?>

				<?php echo JHtml::_('filter.slider', array('selected_nodes' => $this->filter->data)); ?>
			</div>
			<div class="span3">
				<?php echo JLayoutHelper::render('joomla.edit.global', $this); ?>
			</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'publishing', JText::_('JGLOBAL_FIELDSET_PUBLISHING')); ?>
		<div class="row-fluid form-horizontal-desktop">
			<?php echo JLayoutHelper::render('joomla.edit.publishingdata', $this); ?>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php echo JLayoutHelper::render('joomla.edit.params', $this); ?>

		<?php echo JHtml::_('bootstrap.endTabSet'); ?>
	</div>

	<input type="hidden" name="task" value="" />
	<input type="hidden" name="return" value="<?php echo JFactory::getApplication()->input->get('return', '', 'BASE64'); ?>" />
	<?php echo JHtml::_('form.token'); ?>
</form>
components/com_finder/views/filter/view.html.php000060400000006533152453623450016122 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Filter view class for Finder.
 *
 * @since  2.5
 */
class FinderViewFilter extends JViewLegacy
{
	/**
	 * The filter object
	 *
	 * @var  FinderTableFilter
	 *
	 * @since  3.6.2
	 */
	protected $filter;

	/**
	 * The JForm object
	 *
	 * @var  JForm
	 *
	 * @since  3.6.2
	 */
	protected $form;

	/**
	 * The active item
	 *
	 * @var  JObject|boolean
	 *
	 * @since  3.6.2
	 */
	protected $item;

	/**
	 * The model state
	 *
	 * @var  mixed
	 *
	 * @since  3.6.2
	 */
	protected $state;

	/**
	 * The total indexed items
	 *
	 * @var  integer
	 *
	 * @since  3.8.0
	 */
	protected $total;

	/**
	 * Method to display the view.
	 *
	 * @param   string  $tpl  A template file to load. [optional]
	 *
	 * @return  mixed  A string if successful, otherwise a JError object.
	 *
	 * @since   2.5
	 */
	public function display($tpl = null)
	{
		// Load the view data.
		$this->filter = $this->get('Filter');
		$this->item = $this->get('Item');
		$this->form = $this->get('Form');
		$this->state = $this->get('State');
		$this->total = $this->get('Total');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');
		JHtml::addIncludePath(JPATH_SITE . '/components/com_finder/helpers/html');

		// Configure the toolbar.
		$this->addToolbar();

		return parent::display($tpl);
	}

	/**
	 * Method to configure the toolbar for this view.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	protected function addToolbar()
	{
		JFactory::getApplication()->input->set('hidemainmenu', true);

		$isNew = ($this->item->filter_id == 0);
		$checkedOut = !($this->item->checked_out == 0 || $this->item->checked_out == JFactory::getUser()->id);
		$canDo = JHelperContent::getActions('com_finder');

		// Configure the toolbar.
		JToolbarHelper::title(
			$isNew ? JText::_('COM_FINDER_FILTER_NEW_TOOLBAR_TITLE') : JText::_('COM_FINDER_FILTER_EDIT_TOOLBAR_TITLE'),
			'zoom-in finder'
		);

		// Set the actions for new and existing records.
		if ($isNew)
		{
			// For new records, check the create permission.
			if ($canDo->get('core.create'))
			{
				JToolbarHelper::apply('filter.apply');
				JToolbarHelper::save('filter.save');
				JToolbarHelper::save2new('filter.save2new');
			}

			JToolbarHelper::cancel('filter.cancel');
		}
		else
		{
			// Can't save the record if it's checked out.
			// Since it's an existing record, check the edit permission.
			if (!$checkedOut && $canDo->get('core.edit'))
			{
				JToolbarHelper::apply('filter.apply');
				JToolbarHelper::save('filter.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('filter.save2new');
				}
			}

			// If an existing item, can save as a copy
			if ($canDo->get('core.create'))
			{
				JToolbarHelper::save2copy('filter.save2copy');
			}

			JToolbarHelper::cancel('filter.cancel', 'JTOOLBAR_CLOSE');
		}

		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_COMPONENTS_FINDER_MANAGE_SEARCH_FILTERS_EDIT');
	}
}
components/com_finder/views/statistics/tmpl/default.php000060400000004102152453623450017500 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<h3>
	<?php echo JText::_('COM_FINDER_STATISTICS_TITLE'); ?>
</h3>

<div class="row-fluid">
	<div class="span12">
		<p class="tab-description"><?php echo JText::sprintf('COM_FINDER_STATISTICS_STATS_DESCRIPTION', number_format($this->data->term_count, 0, JText::_('DECIMALS_SEPARATOR'), JText::_('THOUSANDS_SEPARATOR')), number_format($this->data->link_count, 0, JText::_('DECIMALS_SEPARATOR'), JText::_('THOUSANDS_SEPARATOR')), number_format($this->data->taxonomy_node_count, 0, JText::_('DECIMALS_SEPARATOR'), JText::_('THOUSANDS_SEPARATOR')), number_format($this->data->taxonomy_branch_count, 0, JText::_('DECIMALS_SEPARATOR'), JText::_('THOUSANDS_SEPARATOR'))); ?></p>
		<table class="table table-striped table-condensed">
			<thead>
				<tr>
					<th>
						<?php echo JText::_('COM_FINDER_STATISTICS_LINK_TYPE_HEADING'); ?>
					</th>
					<th>
						<?php echo JText::_('COM_FINDER_STATISTICS_LINK_TYPE_COUNT'); ?>
					</th>
				</tr>
			</thead>
			<tbody>
				<?php foreach ($this->data->type_list as $type) : ?>
				<tr>
					<td>
						<?php
						$lang_key    = 'PLG_FINDER_STATISTICS_' . str_replace(' ', '_', $type->type_title);
						$lang_string = JText::_($lang_key);
						echo $lang_string === $lang_key ? $type->type_title : $lang_string;
						?>
					</td>
					<td>
						<span class="badge badge-info"><?php echo number_format($type->link_count, 0, JText::_('DECIMALS_SEPARATOR'), JText::_('THOUSANDS_SEPARATOR')); ?></span>
					</td>
				</tr>
				<?php endforeach; ?>
				<tr>
					<td>
						<strong><?php echo JText::_('COM_FINDER_STATISTICS_LINK_TYPE_TOTAL'); ?></strong>
					</td>
					<td>
						<span class="badge badge-info"><?php echo number_format($this->data->link_count, 0, JText::_('DECIMALS_SEPARATOR'), JText::_('THOUSANDS_SEPARATOR')); ?></span>
					</td>
				</tr>
			</tbody>
		</table>
	</div>
</div>
components/com_finder/views/statistics/view.html.php000060400000001665152453623450017030 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Statistics view class for Finder.
 *
 * @since  2.5
 */
class FinderViewStatistics extends JViewLegacy
{
	/**
	 * The index statistics
	 *
	 * @var  JObject
	 *
	 * @since  3.6.1
	 */
	protected $data;

	/**
	 * Method to display the view.
	 *
	 * @param   string  $tpl  A template file to load. [optional]
	 *
	 * @return  mixed  A string if successful, otherwise a JError object.
	 *
	 * @since   2.5
	 */
	public function display($tpl = null)
	{
		// Load the view data.
		$this->data = $this->get('Data');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		return parent::display($tpl);
	}
}
components/com_finder/views/filters/view.html.php000060400000005750152453623450016305 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Filters view class for Finder.
 *
 * @since  2.5
 */
class FinderViewFilters extends JViewLegacy
{
	/**
	 * An array of items
	 *
	 * @var  array
	 *
	 * @since  3.6.1
	 */
	protected $items;

	/**
	 * The pagination object
	 *
	 * @var  JPagination
	 *
	 * @since  3.6.1
	 */
	protected $pagination;

	/**
	 * The HTML markup for the sidebar
	 *
	 * @var  string
	 *
	 * @since  3.6.1
	 */
	protected $sidebar;

	/**
	 * The model state
	 *
	 * @var  mixed
	 *
	 * @since  3.6.1
	 */
	protected $state;

	/**
	 * The total number of items
	 *
	 * @var  integer
	 *
	 * @since  3.6.1
	 */
	protected $total;

	/**
	 * Method to display the view.
	 *
	 * @param   string  $tpl  A template file to load. [optional]
	 *
	 * @return  mixed  A string if successful, otherwise a JError object.
	 *
	 * @since   2.5
	 */
	public function display($tpl = null)
	{
		// Load the view data.
		$this->items         = $this->get('Items');
		$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');

		FinderHelper::addSubmenu('filters');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

		// Configure the toolbar.
		$this->addToolbar();
		$this->sidebar = JHtmlSidebar::render();

		return parent::display($tpl);
	}

	/**
	 * Method to configure the toolbar for this view.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	protected function addToolbar()
	{
		$canDo = JHelperContent::getActions('com_finder');

		JToolbarHelper::title(JText::_('COM_FINDER_FILTERS_TOOLBAR_TITLE'), 'zoom-in finder');
		$toolbar = JToolbar::getInstance('toolbar');

		if ($canDo->get('core.create'))
		{
			JToolbarHelper::addNew('filter.add');
			JToolbarHelper::editList('filter.edit');
			JToolbarHelper::divider();
		}

		if ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::publishList('filters.publish');
			JToolbarHelper::unpublishList('filters.unpublish');
			JToolbarHelper::checkin('filters.checkin');
			JToolbarHelper::divider();
		}

		if ($canDo->get('core.admin') || $canDo->get('core.options'))
		{
			JToolbarHelper::preferences('com_finder');
		}

		JToolbarHelper::divider();
		$toolbar->appendButton('Popup', 'bars', 'COM_FINDER_STATISTICS', 'index.php?option=com_finder&view=statistics&tmpl=component', 550, 350);
		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_COMPONENTS_FINDER_MANAGE_SEARCH_FILTERS');

		if ($canDo->get('core.delete'))
		{
			JToolbarHelper::deleteList('', 'filters.delete');
			JToolbarHelper::divider();
		}
	}
}
components/com_finder/views/filters/tmpl/default.php000060400000011626152453623450016767 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('formbehavior.chosen', 'select');
JHtml::_('bootstrap.tooltip');

$user      = JFactory::getUser();
$userId    = $user->get('id');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));

JText::script('COM_FINDER_INDEX_CONFIRM_DELETE_PROMPT');

JFactory::getDocument()->addScriptDeclaration('
	Joomla.submitbutton = function(pressbutton)
	{
		if (pressbutton == "filters.delete")
		{
			if (confirm(Joomla.JText._("COM_FINDER_INDEX_CONFIRM_DELETE_PROMPT")))
			{
				Joomla.submitform(pressbutton);
			}
			else
			{
				return false;
			}
		}
		Joomla.submitform(pressbutton);
	};
');
?>
<form action="<?php echo JRoute::_('index.php?option=com_finder&view=filters'); ?>" method="post" name="adminForm" id="adminForm">
	<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
	<?php else : ?>
	<div id="j-main-container">
	<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<div class="clearfix"> </div>
		<?php if (empty($this->items)) : ?>
		<div class="alert alert-no-items">
			<?php echo JText::_('COM_FINDER_NO_RESULTS_OR_FILTERS'); ?>
		</div>
		<?php else : ?>
		<table class="table table-striped">
			<thead>
				<tr>
					<th width="1%" class="nowrap center">
						<?php echo JHtml::_('grid.checkall'); ?>
					</th>
					<th width="1%" class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
					</th>
					<th class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
					</th>
					<th width="10%" class="nowrap hidden-phone">
						<?php echo JHtml::_('searchtools.sort', 'COM_FINDER_HEADING_CREATED_BY', 'a.created_by_alias', $listDirn, $listOrder); ?>
					</th>
					<th width="10%" class="nowrap hidden-phone">
						<?php echo JHtml::_('searchtools.sort', 'COM_FINDER_HEADING_CREATED_ON', 'a.created', $listDirn, $listOrder); ?>
					</th>
					<th width="5%" class="nowrap hidden-phone">
						<?php echo JHtml::_('searchtools.sort', 'COM_FINDER_HEADING_MAP_COUNT', 'a.map_count', $listDirn, $listOrder); ?>
					</th>
					<th width="1%" class="nowrap hidden-phone">
						<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.filter_id', $listDirn, $listOrder); ?>
					</th>
				</tr>
			</thead>
			<tfoot>
				<tr>
					<td colspan="7">
						<?php echo $this->pagination->getListFooter(); ?>
					</td>
				</tr>
			</tfoot>
			<tbody>
				<?php
				$canCreate                  = $user->authorise('core.create', 'com_finder');
				$canEdit                    = $user->authorise('core.edit', 'com_finder');
				$userAuthoriseCoreManage    = $user->authorise('core.manage', 'com_checkin');
				$userAuthoriseCoreEditState = $user->authorise('core.edit.state', 'com_finder');
				$userId                     = $user->get('id');
				foreach ($this->items as $i => $item) :
					$canCheckIn   = $userAuthoriseCoreManage || $item->checked_out == $userId || $item->checked_out == 0;
					$canChange    = $userAuthoriseCoreEditState && $canCheckIn;
					$escapedTitle = $this->escape($item->title);
					?>
					<tr class="row<?php echo $i % 2; ?>">
						<td class="center">
							<?php echo JHtml::_('grid.id', $i, $item->filter_id); ?>
						</td>
						<td class="center nowrap">
							<?php echo JHtml::_('jgrid.published', $item->state, $i, 'filters.', $canChange); ?>
						</td>
						<td>
							<?php if ($item->checked_out) : ?>
								<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'filters.', $canCheckIn); ?>
							<?php endif; ?>
							<?php if ($canEdit) : ?>
								<a href="<?php echo JRoute::_('index.php?option=com_finder&task=filter.edit&filter_id=' . (int) $item->filter_id); ?>">
									<?php echo $escapedTitle; ?></a>
							<?php else : ?>
								<?php echo $escapedTitle; ?>
							<?php endif; ?>
						</td>
						<td class="nowrap hidden-phone">
							<?php echo $item->created_by_alias ?: $item->user_name; ?>
						</td>
						<td class="nowrap hidden-phone">
							<?php echo JHtml::_('date', $item->created, JText::_('DATE_FORMAT_LC4')); ?>
						</td>
						<td class="nowrap hidden-phone">
							<?php echo $item->map_count; ?>
						</td>
						<td class="hidden-phone">
							<?php echo (int) $item->filter_id; ?>
						</td>
					</tr>
				<?php endforeach; ?>
			</tbody>
		</table>
		<?php endif; ?>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_finder/views/indexer/view.html.php000060400000000565152453623450016272 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Indexer view class for Finder.
 *
 * @since  2.5
 */
class FinderViewIndexer extends JViewLegacy
{

}
components/com_finder/views/indexer/tmpl/default.php000060400000002145152453623450016751 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.keepalive');
JHtml::_('behavior.core');
JHtml::_('jquery.framework');
JHtml::_('script', 'com_finder/indexer.js', array('version' => 'auto', 'relative' => true));
JFactory::getDocument()->addScriptDeclaration('var msg = "' . JText::_('COM_FINDER_INDEXER_MESSAGE_COMPLETE') . '";');
?>

<div id="finder-indexer-container">
	<br /><br />
	<h1 id="finder-progress-header"><?php echo JText::_('COM_FINDER_INDEXER_HEADER_INIT'); ?></h1>

	<p id="finder-progress-message"><?php echo JText::_('COM_FINDER_INDEXER_MESSAGE_INIT'); ?></p>

	<div id="progress" class="progress progress-striped active">
		<div id="progress-bar" class="bar bar-success" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div>
	</div>

	<input id="finder-indexer-token" type="hidden" name="<?php echo JFactory::getSession()->getFormToken(); ?>" value="1" />
</div>
components/com_finder/views/index/view.html.php000060400000007522152453623450015743 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('FinderHelperLanguage', JPATH_ADMINISTRATOR . '/components/com_finder/helpers/language.php');

/**
 * Index view class for Finder.
 *
 * @since  2.5
 */
class FinderViewIndex extends JViewLegacy
{
	/**
	 * An array of items
	 *
	 * @var  array
	 *
	 * @since  3.6.1
	 */
	protected $items;

	/**
	 * The pagination object
	 *
	 * @var  JPagination
	 *
	 * @since  3.6.1
	 */
	protected $pagination;

	/**
	 * The state of core Smart Search plugins
	 *
	 * @var  array
	 *
	 * @since  3.6.1
	 */
	protected $pluginState;

	/**
	 * The HTML markup for the sidebar
	 *
	 * @var  string
	 *
	 * @since  3.6.1
	 */
	protected $sidebar;

	/**
	 * The model state
	 *
	 * @var  mixed
	 *
	 * @since  3.6.1
	 */
	protected $state;

	/**
	 * The total number of items
	 *
	 * @var  integer
	 *
	 * @since  3.6.1
	 */
	protected $total;

	/**
	 * Method to display the view.
	 *
	 * @param   string  $tpl  A template file to load. [optional]
	 *
	 * @return  mixed  A string if successful, otherwise a JError object.
	 *
	 * @since   2.5
	 */
	public function display($tpl = null)
	{
		// Load plugin language files.
		FinderHelperLanguage::loadPluginLanguage();

		$this->items         = $this->get('Items');
		$this->total         = $this->get('Total');
		$this->pagination    = $this->get('Pagination');
		$this->state         = $this->get('State');
		$this->pluginState   = $this->get('pluginState');
		$this->filterForm    = $this->get('FilterForm');
		$this->activeFilters = $this->get('ActiveFilters');

		FinderHelper::addSubmenu('index');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			JError::raiseError(500, implode("\n", $errors));

			return false;
		}

		if (!$this->pluginState['plg_content_finder']->enabled)
		{
			$link = JRoute::_('index.php?option=com_plugins&task=plugin.edit&extension_id=' . FinderHelper::getFinderPluginId());
			JFactory::getApplication()->enqueueMessage(JText::sprintf('COM_FINDER_INDEX_PLUGIN_CONTENT_NOT_ENABLED', $link), 'warning');
		}
		elseif ($this->get('TotalIndexed') === 0)
		{
			JFactory::getApplication()->enqueueMessage(JText::_('COM_FINDER_INDEX_NO_DATA') . '  ' . JText::_('COM_FINDER_INDEX_TIP'), 'notice');
		}

		JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

		// Configure the toolbar.
		$this->addToolbar();
		$this->sidebar = JHtmlSidebar::render();

		return parent::display($tpl);
	}

	/**
	 * Method to configure the toolbar for this view.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	protected function addToolbar()
	{
		$canDo = JHelperContent::getActions('com_finder');

		JToolbarHelper::title(JText::_('COM_FINDER_INDEX_TOOLBAR_TITLE'), 'zoom-in finder');

		$toolbar = JToolbar::getInstance('toolbar');
		$toolbar->appendButton(
			'Popup', 'archive', 'COM_FINDER_INDEX', 'index.php?option=com_finder&view=indexer&tmpl=component', 500, 210, 0, 0,
			'window.parent.location.reload()', 'COM_FINDER_HEADING_INDEXER'
		);

		if ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::publishList('index.publish');
			JToolbarHelper::unpublishList('index.unpublish');
		}

		if ($canDo->get('core.admin') || $canDo->get('core.options'))
		{
			JToolbarHelper::preferences('com_finder');
		}

		$toolbar->appendButton('Popup', 'bars', 'COM_FINDER_STATISTICS', 'index.php?option=com_finder&view=statistics&tmpl=component', 550, 350);

		if ($canDo->get('core.delete'))
		{
			JToolbarHelper::deleteList('', 'index.delete');
		}

		if ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::trash('index.purge', 'COM_FINDER_INDEX_TOOLBAR_PURGE', false);
		}

		JToolbarHelper::help('JHELP_COMPONENTS_FINDER_MANAGE_INDEXED_CONTENT');
	}
}
components/com_finder/views/index/tmpl/default.php000060400000011607152453623450016425 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('bootstrap.popover');

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$lang      = JFactory::getLanguage();

JText::script('COM_FINDER_INDEX_CONFIRM_PURGE_PROMPT');
JText::script('COM_FINDER_INDEX_CONFIRM_DELETE_PROMPT');

JFactory::getDocument()->addScriptDeclaration('
	Joomla.submitbutton = function(pressbutton)
	{
		if (pressbutton == "index.purge")
		{
			if (confirm(Joomla.JText._("COM_FINDER_INDEX_CONFIRM_PURGE_PROMPT")))
			{
				Joomla.submitform(pressbutton);
			}
			else
			{
				return false;
			}
		}
		if (pressbutton == "index.delete")
		{
			if (confirm(Joomla.JText._("COM_FINDER_INDEX_CONFIRM_DELETE_PROMPT")))
			{
				Joomla.submitform(pressbutton);
			}
			else
			{
				return false;
			}
		}

		Joomla.submitform(pressbutton);
	};
');
?>
<form action="<?php echo JRoute::_('index.php?option=com_finder&view=index'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<table class="table table-striped">
			<thead>
				<tr>
					<th width="1%" class="nowrap center">
						<?php echo JHtml::_('grid.checkall'); ?>
					</th>
					<th width="1%" class="nowrap center">
						<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'l.published', $listDirn, $listOrder); ?>
					</th>
					<th class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'l.title', $listDirn, $listOrder); ?>
					</th>
					<th width="5%" class="nowrap hidden-phone">
						<?php echo JHtml::_('searchtools.sort', 'COM_FINDER_INDEX_HEADING_INDEX_TYPE', 't.title', $listDirn, $listOrder); ?>
					</th>
					<th width="1%" class="nowrap hidden-phone">
						<?php echo JHtml::_('searchtools.sort', 'COM_FINDER_INDEX_HEADING_INDEX_DATE', 'l.indexdate', $listDirn, $listOrder); ?>
					</th>
					<th width="1%" class="nowrap center hidden-phone hidden-tablet">
						<?php echo JText::_('COM_FINDER_INDEX_HEADING_DETAILS'); ?>
					</th>
					<th width="35%" class="nowrap hidden-phone hidden-tablet">
						<?php echo JHtml::_('searchtools.sort', 'COM_FINDER_INDEX_HEADING_LINK_URL', 'l.url', $listDirn, $listOrder); ?>
					</th>
				</tr>
			</thead>
			<tfoot>
				<tr>
					<td colspan="7">
						<?php echo $this->pagination->getListFooter(); ?>
					</td>
				</tr>
			</tfoot>
			<tbody>
				<?php $canChange = JFactory::getUser()->authorise('core.manage', 'com_finder'); ?>
				<?php foreach ($this->items as $i => $item) : ?>
				<tr class="row<?php echo $i % 2; ?>">
					<td class="center">
						<?php echo JHtml::_('grid.id', $i, $item->link_id); ?>
					</td>
					<td class="center">
						<?php echo JHtml::_('jgrid.published', $item->published, $i, 'index.', $canChange, 'cb'); ?>
					</td>
					<td>
						<label for="cb<?php echo $i ?>">
							<?php echo $this->escape($item->title); ?>
						</label>
					</td>
					<td class="small nowrap hidden-phone">
						<?php
						$key = FinderHelperLanguage::branchSingular($item->t_title);
						echo $lang->hasKey($key) ? JText::_($key) : $item->t_title;
						?>
					</td>
					<td class="small nowrap hidden-phone">
						<?php echo JHtml::_('date', $item->indexdate, JText::_('DATE_FORMAT_LC4')); ?>
					</td>
					<td class="center hidden-phone hidden-tablet">
						<?php if ((int) $item->publish_start_date || (int) $item->publish_end_date || (int) $item->start_date || (int) $item->end_date) : ?>
							<span class="icon-calendar pop hasPopover" aria-hidden="true" data-placement="left" title="<?php echo JText::_('COM_FINDER_INDEX_DATE_INFO_TITLE'); ?>" data-content="<?php echo JText::sprintf('COM_FINDER_INDEX_DATE_INFO', $item->publish_start_date, $item->publish_end_date, $item->start_date, $item->end_date); ?>"></span>
							<span class="element-invisible"><?php echo JText::sprintf('COM_FINDER_INDEX_DATE_INFO', $item->publish_start_date, $item->publish_end_date, $item->start_date, $item->end_date); ?></span>
						<?php endif; ?>
					</td>
					<td class="small break-word hidden-phone hidden-tablet">
						<?php echo (strlen($item->url) > 80) ? substr($item->url, 0, 70) . '...' : $item->url; ?>
					</td>
				</tr>

				<?php endforeach; ?>
			</tbody>
		</table>
		<input type="hidden" name="task" value="display" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_finder/views/maps/view.html.php000060400000005701152453623450015571 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('FinderHelperLanguage', JPATH_ADMINISTRATOR . '/components/com_finder/helpers/language.php');

/**
 * Groups view class for Finder.
 *
 * @since  2.5
 */
class FinderViewMaps extends JViewLegacy
{
	/**
	 * An array of items
	 *
	 * @var  array
	 *
	 * @since  3.6.1
	 */
	protected $items;

	/**
	 * The pagination object
	 *
	 * @var  JPagination
	 *
	 * @since  3.6.1
	 */
	protected $pagination;

	/**
	 * The HTML markup for the sidebar
	 *
	 * @var  string
	 *
	 * @since  3.6.1
	 */
	protected $sidebar;

	/**
	 * The model state
	 *
	 * @var  object
	 *
	 * @since  3.6.1
	 */
	protected $state;

	/**
	 * The total number of items
	 *
	 * @var  object
	 *
	 * @since  3.6.1
	 */
	protected $total;

	/**
	 * Method to display the view.
	 *
	 * @param   string  $tpl  A template file to load. [optional]
	 *
	 * @return  mixed  A string if successful, otherwise a JError object.
	 *
	 * @since   2.5
	 */
	public function display($tpl = null)
	{
		// Load plugin language files.
		FinderHelperLanguage::loadPluginLanguage();

		// Load the view data.
		$this->items         = $this->get('Items');
		$this->total         = $this->get('Total');
		$this->pagination    = $this->get('Pagination');
		$this->state         = $this->get('State');
		$this->filterForm    = $this->get('FilterForm');
		$this->activeFilters = $this->get('ActiveFilters');

		FinderHelper::addSubmenu('maps');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

		// Prepare the view.
		$this->addToolbar();
		$this->sidebar = JHtmlSidebar::render();

		return parent::display($tpl);
	}

	/**
	 * Method to configure the toolbar for this view.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	protected function addToolbar()
	{
		$canDo = JHelperContent::getActions('com_finder');

		JToolbarHelper::title(JText::_('COM_FINDER_MAPS_TOOLBAR_TITLE'), 'zoom-in finder');

		if ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::publishList('maps.publish');
			JToolbarHelper::unpublishList('maps.unpublish');
			JToolbarHelper::divider();
		}

		if ($canDo->get('core.admin') || $canDo->get('core.options'))
		{
			JToolbarHelper::preferences('com_finder');
		}

		JToolbarHelper::divider();
		JToolbar::getInstance('toolbar')->appendButton(
			'Popup',
			'bars',
			'COM_FINDER_STATISTICS',
			'index.php?option=com_finder&view=statistics&tmpl=component',
			550,
			350
		);
		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_COMPONENTS_FINDER_MANAGE_CONTENT_MAPS');

		if ($canDo->get('core.delete'))
		{
			JToolbarHelper::deleteList('', 'maps.delete');
			JToolbarHelper::divider();
		}
	}
}
components/com_finder/views/maps/tmpl/default.php000060400000013212152453623450016250 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('formbehavior.chosen', 'select');
JHtml::_('bootstrap.tooltip');

$listOrder     = $this->escape($this->state->get('list.ordering'));
$listDirn      = $this->escape($this->state->get('list.direction'));
$lang          = JFactory::getLanguage();
$branchFilter  = $this->escape($this->state->get('filter.branch'));
$colSpan       = $branchFilter ? 5 : 6;
JText::script('COM_FINDER_MAPS_CONFIRM_DELETE_PROMPT');

JFactory::getDocument()->addScriptDeclaration('
	Joomla.submitbutton = function(pressbutton)
	{
		if (pressbutton == "map.delete")
		{
			if (confirm(Joomla.JText._("COM_FINDER_MAPS_CONFIRM_DELETE_PROMPT")))
			{
				Joomla.submitform(pressbutton);
			}
			else
			{
				return false;
			}
		}
		Joomla.submitform(pressbutton);
	};
');
?>
<form action="<?php echo JRoute::_('index.php?option=com_finder&view=maps'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<div class="clearfix"> </div>
		<?php if (empty($this->items)) : ?>
		<div class="alert alert-no-items">
			<?php echo JText::_('COM_FINDER_MAPS_NO_CONTENT'); ?>
		</div>
		<?php else : ?>
		<table class="table table-striped">
			<thead>
				<tr>
					<th width="1%" class="center nowrap">
						<?php echo JHtml::_('grid.checkall'); ?>
					</th>
					<th width="1%" class="center nowrap">
						<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
					</th>
					<th class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'd.branch_title', $listDirn, $listOrder); ?>
					</th>
					<?php if (!$branchFilter) : ?>
					<th width="1%" class="nowrap center">
						<?php echo JText::_('COM_FINDER_HEADING_CHILDREN'); ?>
					</th>
					<?php endif; ?>
					<th width="1%" class="nowrap center">
						<span class="icon-publish" aria-hidden="true"></span>
						<span class="hidden-phone"><?php echo JText::_('COM_FINDER_MAPS_COUNT_PUBLISHED_ITEMS'); ?></span>
					</th>
					<th width="1%" class="nowrap center">
						<span class="icon-unpublish" aria-hidden="true"></span>
						<span class="hidden-phone"><?php echo JText::_('COM_FINDER_MAPS_COUNT_UNPUBLISHED_ITEMS'); ?></span>
					</th>
				</tr>
			</thead>
			<tfoot>
				<tr>
					<td colspan="<?php echo $colSpan; ?>">
						<?php echo $this->pagination->getListFooter(); ?>
					</td>
				</tr>
			</tfoot>
			<tbody>
				<?php $canChange = JFactory::getUser()->authorise('core.manage', 'com_finder'); ?>
				<?php foreach ($this->items as $i => $item) : ?>
				<tr class="row<?php echo $i % 2; ?>">
					<td class="center">
						<?php echo JHtml::_('grid.id', $i, $item->id); ?>
					</td>
					<td class="center nowrap">
						<?php echo JHtml::_('jgrid.published', $item->state, $i, 'maps.', $canChange, 'cb'); ?>
					</td>
					<td>
					<?php
					if (trim($item->parent_title, '**') === 'Language')
					{
						$title = FinderHelperLanguage::branchLanguageTitle($item->title);
					}
					else
					{
						$key = FinderHelperLanguage::branchSingular($item->title);
						$title = $lang->hasKey($key) ? JText::_($key) : $item->title;
					}
					?>
					<?php if ((int) $item->num_children === 0) : ?>
						<span class="gi">&mdash;</span>
					<?php endif; ?>
					<label for="cb<?php echo $i; ?>" style="display:inline-block;">
						<?php echo $this->escape($title); ?>
					</label>
					<?php if ($this->escape(trim($title, '**')) === 'Language' && JLanguageMultilang::isEnabled()) : ?>
						<strong><?php echo JText::_('COM_FINDER_MAPS_MULTILANG'); ?></strong>
					<?php endif; ?>
					</td>
					<?php if (!$branchFilter) : ?>
					<td class="center btns">
					<?php if ((int) $item->num_children !== 0) : ?>
						<a href="<?php echo JRoute::_('index.php?option=com_finder&view=maps&filter[branch]=' . $item->id); ?>">
							<span class="badge <?php if ($item->num_children > 0) echo 'badge-info'; ?>"><?php echo $item->num_children; ?></span></a>
					<?php else : ?>
						-
					<?php endif; ?>
					</td>
					<?php endif; ?>
					<td class="center btns">
					<?php if ((int) $item->num_children === 0) : ?>
						<a class="badge <?php if ((int) $item->count_published > 0) echo 'badge-success'; ?>" title="<?php echo JText::_('COM_FINDER_MAPS_COUNT_PUBLISHED_ITEMS'); ?>" href="<?php echo JRoute::_('index.php?option=com_finder&view=index&filter[state]=1&filter[content_map]=' . $item->id); ?>">
						<?php echo (int) $item->count_published; ?></a>
					<?php else : ?>
						-
					<?php endif; ?>
					</td>
					<td class="center btns">
					<?php if ((int) $item->num_children === 0) : ?>
						<a class="badge <?php if ((int) $item->count_unpublished > 0) echo 'badge-important'; ?>" title="<?php echo JText::_('COM_FINDER_MAPS_COUNT_UNPUBLISHED_ITEMS'); ?>" href="<?php echo JRoute::_('index.php?option=com_finder&view=index&filter[state]=0&filter[content_map]=' . $item->id); ?>">
						<?php echo (int) $item->count_unpublished; ?></a>
					<?php else : ?>
						-
					<?php endif; ?>
					</td>
				</tr>
				<?php endforeach; ?>
			</tbody>
		</table>
		<?php endif; ?>
	</div>

	<input type="hidden" name="task" value="display" />
	<input type="hidden" name="boxchecked" value="0" />
	<?php echo JHtml::_('form.token'); ?>
</form>
components/com_finder/controller.php000060400000003220152453623450013734 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Base controller class for Finder.
 *
 * @since  2.5
 */
class FinderController extends JControllerLegacy
{
	/**
	 * The default view.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $default_view = 'index';

	/**
	 * 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  FinderController  A JControllerLegacy object to support chaining.
	 *
	 * @since	2.5
	 */
	public function display($cachable = false, $urlparams = array())
	{
		JLoader::register('FinderHelper', JPATH_ADMINISTRATOR . '/components/com_finder/helpers/finder.php');

		$view   = $this->input->get('view', 'index', 'word');
		$layout = $this->input->get('layout', 'index', 'word');
		$filterId = $this->input->get('filter_id', null, 'int');

		// Check for edit form.
		if ($view === 'filter' && $layout === 'edit' && !$this->checkEditId('com_finder.edit.filter', $filterId))
		{
			// Somehow the person just went to the form - we don't allow that.
			$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_UNHELD_ID', $filterId));
			$this->setMessage($this->getError(), 'error');
			$this->setRedirect(JRoute::_('index.php?option=com_finder&view=filters', false));

			return false;
		}

		return parent::display();
	}
}
components/com_finder/config.xml000060400000021144152453623450013034 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset
		name="search"
		label="COM_FINDER_FIELDSET_SEARCH_OPTIONS_LABEL"
		description="COM_FINDER_FIELDSET_SEARCH_OPTIONS_DESCRIPTION"
		>

		<field
			name="enabled"
			type="radio"
			label="COM_FINDER_CONFIG_GATHER_SEARCH_STATISTICS_LABEL"
			description="COM_FINDER_CONFIG_GATHER_SEARCH_STATISTICS_DESCRIPTION"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="show_description"
			type="radio"
			label="COM_FINDER_CONFIG_SHOW_DESCRIPTION_LABEL"
			description="COM_FINDER_CONFIG_SHOW_DESCRIPTION_DESCRIPTION"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="description_length"
			type="number"
			label="COM_FINDER_CONFIG_DESCRIPTION_LENGTH_LABEL"
			description="COM_FINDER_CONFIG_DESCRIPTION_LENGTH_DESCRIPTION"
			size="5"
			default="255"
			filter="integer"
			showon="show_description:1"
		/>


		<field
			name="allow_empty_query"
			type="radio"
			label="COM_FINDER_CONFIG_ALLOW_EMPTY_QUERY_LABEL"
			description="COM_FINDER_CONFIG_ALLOW_EMPTY_QUERY_DESCRIPTION"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="show_url"
			type="radio"
			label="COM_FINDER_CONFIG_SHOW_URL_LABEL"
			description="COM_FINDER_CONFIG_SHOW_URL_DESCRIPTION"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_autosuggest"
			type="radio"
			label="COM_FINDER_CONFIG_SHOW_AUTOSUGGEST_LABEL"
			description="COM_FINDER_CONFIG_SHOW_AUTOSUGGEST_DESCRIPTION"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_suggested_query"
			type="radio"
			label="COM_FINDER_CONFIG_SHOW_SUGGESTED_QUERY_LABEL"
			description="COM_FINDER_CONFIG_SHOW_SUGGESTED_QUERY_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			validate="options"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_explained_query"
			type="radio"
			label="COM_FINDER_CONFIG_SHOW_EXPLAINED_QUERY_LABEL"
			description="COM_FINDER_CONFIG_SHOW_EXPLAINED_QUERY_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			validate="options"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_advanced"
			type="radio"
			label="COM_FINDER_CONFIG_SHOW_ADVANCED_LABEL"
			description="COM_FINDER_CONFIG_SHOW_ADVANCED_DESCRIPTION"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_advanced_tips"
			type="radio"
			label="COM_FINDER_CONFIG_SHOW_ADVANCED_TIPS_LABEL"
			description="COM_FINDER_CONFIG_SHOW_ADVANCED_TIPS_DESCRIPTION"
			class="btn-group btn-group-yesno"
			default="1"
			showon="show_advanced:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="expand_advanced"
			type="radio"
			label="COM_FINDER_CONFIG_EXPAND_ADVANCED_LABEL"
			description="COM_FINDER_CONFIG_EXPAND_ADVANCED_DESCRIPTION"
			class="btn-group btn-group-yesno"
			default="0"
			showon="show_advanced:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_date_filters"
			type="radio"
			label="COM_FINDER_CONFIG_SHOW_DATE_FILTERS_LABEL"
			description="COM_FINDER_CONFIG_SHOW_DATE_FILTERS_DESCRIPTION"
			class="btn-group btn-group-yesno"
			default="0"
			showon="show_advanced:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="sort_order"
			type="list"
			label="COM_FINDER_CONFIG_SORT_ORDER_LABEL"
			description="COM_FINDER_CONFIG_SORT_ORDER_DESC"
			default="relevance"
			validate="options"
			>
			<option value="relevance">COM_FINDER_CONFIG_SORT_OPTION_RELEVANCE</option>
			<option value="date">COM_FINDER_CONFIG_SORT_OPTION_START_DATE</option>
			<option value="price">COM_FINDER_CONFIG_SORT_OPTION_LIST_PRICE</option>
		</field>

		<field
			name="sort_direction"
			type="list"
			label="COM_FINDER_CONFIG_SORT_DIRECTION_LABEL"
			description="COM_FINDER_CONFIG_SORT_DIRECTION_DESC"
			default="desc"
			validate="options"
			>
			<option value="desc">COM_FINDER_CONFIG_SORT_OPTION_DESCENDING</option>
			<option value="asc">COM_FINDER_CONFIG_SORT_OPTION_ASCENDING</option>
		</field>

		<field
			name="highlight_terms"
			type="radio"
			label="COM_FINDER_CONFIG_HILIGHT_CONTENT_SEARCH_TERMS_LABEL"
			description="COM_FINDER_CONFIG_HILIGHT_CONTENT_SEARCH_TERMS_DESCRIPTION"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="opensearch_name"
			type="text"
			label="COM_FINDER_CONFIG_FIELD_OPENSEARCH_NAME_LABEL"
			description="COM_FINDER_CONFIG_FIELD_OPENSEARCH_NAME_DESCRIPTION"
			default=""
		/>

		<field
			name="opensearch_description"
			type="textarea"
			label="COM_FINDER_CONFIG_FIELD_OPENSEARCH_DESCRIPTON_LABEL"
			description="COM_FINDER_CONFIG_FIELD_OPENSEARCH_DESCRIPTON_DESCRIPTION"
			default=""
			cols="30"
			rows="2"
		/>

	</fieldset>

	<fieldset
		name="index"
		label="COM_FINDER_FIELDSET_INDEX_OPTIONS_LABEL"
		description="COM_FINDER_FIELDSET_INDEX_OPTIONS_DESCRIPTION"
		>

		<field
			name="batch_size"
			type="list"
			label="COM_FINDER_CONFIG_BATCH_SIZE_LABEL"
			description="COM_FINDER_CONFIG_BATCH_SIZE_DESCRIPTION"
			default="50"
			validate="options"
			>
			<option value="5">J5</option>
			<option value="10">J10</option>
			<option value="25">J25</option>
			<option value="50">J50</option>
			<option value="75">J75</option>
			<option value="100">J100</option>
			<option value="150">J150</option>
			<option value="200">J200</option>
			<option value="250">J250</option>
			<option value="300">J300</option>
		</field>

		<field
			name="memory_table_limit"
			type="number"
			label="COM_FINDER_CONFIG_MEMORY_TABLE_LIMIT_LABEL"
			description="COM_FINDER_CONFIG_MEMORY_TABLE_LIMIT_DESCRIPTION"
			size="10"
			default="30000"
			filter="integer"
		/>

		<field
			name="title_multiplier"
			type="number"
			label="COM_FINDER_CONFIG_TITLE_MULTIPLIER_LABEL"
			description="COM_FINDER_CONFIG_TITLE_MULTIPLIER_DESCRIPTION"
			size="5"
			default="1.7"
		/>

		<field
			name="text_multiplier"
			type="number"
			label="COM_FINDER_CONFIG_TEXT_MULTIPLIER_LABEL"
			description="COM_FINDER_CONFIG_TEXT_MULTIPLIER_DESCRIPTION"
			size="5"
			default="0.7"
		/>

		<field
			name="meta_multiplier"
			type="number"
			label="COM_FINDER_CONFIG_META_MULTIPLIER_LABEL"
			description="COM_FINDER_CONFIG_META_MULTIPLIER_DESCRIPTION"
			size="5"
			default="1.2"
		/>

		<field
			name="path_multiplier"
			type="number"
			label="COM_FINDER_CONFIG_PATH_MULTIPLIER_LABEL"
			description="COM_FINDER_CONFIG_PATH_MULTIPLIER_DESCRIPTION"
			size="5"
			default="2.0"
		/>

		<field
			name="misc_multiplier"
			type="number"
			label="COM_FINDER_CONFIG_MISC_MULTIPLIER_LABEL"
			description="COM_FINDER_CONFIG_MISC_MULTIPLIER_DESCRIPTION"
			size="5"
			default="0.3"
		/>

		<field
			name="stem"
			type="radio"
			label="COM_FINDER_CONFIG_STEMMER_ENABLE_LABEL"
			description="COM_FINDER_CONFIG_STEMMER_ENABLE_DESCRIPTION"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="stemmer"
			type="list"
			label="COM_FINDER_CONFIG_STEMMER_LABEL"
			description="COM_FINDER_CONFIG_STEMMER_DESCRIPTION"
			default="snowball"
			showon="stem:1" 
			>
			<option value="porter_en">COM_FINDER_CONFIG_STEMMER_PORTER_EN</option>
			<option value="fr">COM_FINDER_CONFIG_STEMMER_FR</option>
			<option value="snowball">COM_FINDER_CONFIG_STEMMER_SNOWBALL</option>
		</field>

		<field
			name="enable_logging"
			type="radio"
			label="COM_FINDER_CONFIG_ENABLE_LOGGING_LABEL"
			description="COM_FINDER_CONFIG_ENABLE_LOGGING_DESCRIPTION"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

	</fieldset>

	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
		>

		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			filter="rules"
			validate="rules"
			component="com_finder"
			section="component"
		/>

	</fieldset>
</config>
components/com_finder/finder.xml000060400000003767152453623450013051 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_finder</name>
	<author>Joomla! Project</author>
	<copyright>(C) 2011 Open Source Matters, Inc.</copyright>
	<creationDate>August 2011</creationDate>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_FINDER_XML_DESCRIPTION</description>
	<menu link="option=com_finder">COM_FINDER</menu>
	<files folder="site">
		<filename>controller.php</filename>
		<filename>finder.php</filename>
		<filename>router.php</filename>
		<folder>controllers</folder>
		<folder>helpers</folder>
		<folder>models</folder>
		<folder>views</folder>
	</files>
	<media destination="com_finder" folder="media">
		<folder>js</folder>
		<folder>css</folder>
	</media>
	<install>
		<sql>
			<file charset="utf8" driver="mysql">sql/install.mysql.sql</file>
			<file charset="utf8" driver="postgresql">sql/install.postgresql.sql</file>
		</sql>
	</install>
	<uninstall>
		<sql>
			<file charset="utf8" driver="mysql">sql/uninstall.mysql.sql</file>
			<file charset="utf8" driver="postgresql">sql/uninstall.postgresql.sql</file>
		</sql>
	</uninstall>
	<languages folder="site">
		<language tag="en-GB">language/en-GB.com_finder.ini</language>
	</languages>
	<administration>
		<files folder="admin">
			<filename>access.xml</filename>
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<filename>finder.php</filename>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>sql</folder>
			<folder>tables</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_finder.ini</language>
			<language tag="en-GB">language/en-GB.com_finder.sys.ini</language>
		</languages>
		<menu img="class:finder" link="option=com_finder">COM_FINDER</menu>
	</administration>
</extension>
components/com_finder/sql/uninstall.postgresql.sql000060400000002167152453623450016604 0ustar00DROP TABLE IF EXISTS "#__finder_filters";
DROP TABLE IF EXISTS "#__finder_links";
DROP TABLE IF EXISTS "#__finder_links_terms0";
DROP TABLE IF EXISTS "#__finder_links_terms1";
DROP TABLE IF EXISTS "#__finder_links_terms2";
DROP TABLE IF EXISTS "#__finder_links_terms3";
DROP TABLE IF EXISTS "#__finder_links_terms4";
DROP TABLE IF EXISTS "#__finder_links_terms5";
DROP TABLE IF EXISTS "#__finder_links_terms6";
DROP TABLE IF EXISTS "#__finder_links_terms7";
DROP TABLE IF EXISTS "#__finder_links_terms8";
DROP TABLE IF EXISTS "#__finder_links_terms9";
DROP TABLE IF EXISTS "#__finder_links_termsa";
DROP TABLE IF EXISTS "#__finder_links_termsb";
DROP TABLE IF EXISTS "#__finder_links_termsc";
DROP TABLE IF EXISTS "#__finder_links_termsd";
DROP TABLE IF EXISTS "#__finder_links_termse";
DROP TABLE IF EXISTS "#__finder_links_termsf";
DROP TABLE IF EXISTS "#__finder_taxonomy";
DROP TABLE IF EXISTS "#__finder_taxonomy_map";
DROP TABLE IF EXISTS "#__finder_terms";
DROP TABLE IF EXISTS "#__finder_terms_common";
DROP TABLE IF EXISTS "#__finder_tokens";
DROP TABLE IF EXISTS "#__finder_tokens_aggregate";
DROP TABLE IF EXISTS "#__finder_types";
components/com_finder/sql/install.mysql.sql000060400000035170152453623450015203 0ustar00--
-- Table structure for table `#__finder_filters`
--

CREATE TABLE IF NOT EXISTS `#__finder_filters` (
  `filter_id` int unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `alias` varchar(255) NOT NULL,
  `state` tinyint NOT NULL DEFAULT 1,
  `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `created_by` int unsigned NOT NULL,
  `created_by_alias` varchar(255) NOT NULL,
  `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `modified_by` int unsigned NOT NULL DEFAULT 0,
  `checked_out` int unsigned NOT NULL DEFAULT 0,
  `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `map_count` int unsigned NOT NULL DEFAULT 0,
  `data` text NOT NULL,
  `params` mediumtext,
  PRIMARY KEY (`filter_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_links`
--

CREATE TABLE IF NOT EXISTS `#__finder_links` (
  `link_id` int unsigned NOT NULL AUTO_INCREMENT,
  `url` varchar(255) NOT NULL,
  `route` varchar(255) NOT NULL,
  `title` varchar(400) 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 NOT NULL DEFAULT 1,
  `state` int DEFAULT 1,
  `access` int 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 NOT NULL,
  `object` mediumblob NOT NULL,
  PRIMARY KEY (`link_id`),
  KEY `idx_type` (`type_id`),
  KEY `idx_title` (`title`(100)),
  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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_links_terms0`
--

CREATE TABLE IF NOT EXISTS `#__finder_links_terms0` (
  `link_id` int unsigned NOT NULL,
  `term_id` int 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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_links_terms1`
--

CREATE TABLE IF NOT EXISTS `#__finder_links_terms1` (
  `link_id` int unsigned NOT NULL,
  `term_id` int 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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_links_terms2`
--

CREATE TABLE IF NOT EXISTS `#__finder_links_terms2` (
  `link_id` int unsigned NOT NULL,
  `term_id` int 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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_links_terms3`
--

CREATE TABLE IF NOT EXISTS `#__finder_links_terms3` (
  `link_id` int unsigned NOT NULL,
  `term_id` int 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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_links_terms4`
--

CREATE TABLE IF NOT EXISTS `#__finder_links_terms4` (
  `link_id` int unsigned NOT NULL,
  `term_id` int 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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_links_terms5`
--

CREATE TABLE IF NOT EXISTS `#__finder_links_terms5` (
  `link_id` int unsigned NOT NULL,
  `term_id` int 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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_links_terms6`
--

CREATE TABLE IF NOT EXISTS `#__finder_links_terms6` (
  `link_id` int unsigned NOT NULL,
  `term_id` int 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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_links_terms7`
--

CREATE TABLE IF NOT EXISTS `#__finder_links_terms7` (
  `link_id` int unsigned NOT NULL,
  `term_id` int 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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_links_terms8`
--

CREATE TABLE IF NOT EXISTS `#__finder_links_terms8` (
  `link_id` int unsigned NOT NULL,
  `term_id` int 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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_links_terms9`
--

CREATE TABLE IF NOT EXISTS `#__finder_links_terms9` (
  `link_id` int unsigned NOT NULL,
  `term_id` int 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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_links_termsa`
--

CREATE TABLE IF NOT EXISTS `#__finder_links_termsa` (
  `link_id` int unsigned NOT NULL,
  `term_id` int 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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_links_termsb`
--

CREATE TABLE IF NOT EXISTS `#__finder_links_termsb` (
  `link_id` int unsigned NOT NULL,
  `term_id` int 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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_links_termsc`
--

CREATE TABLE IF NOT EXISTS `#__finder_links_termsc` (
  `link_id` int unsigned NOT NULL,
  `term_id` int 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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_links_termsd`
--

CREATE TABLE IF NOT EXISTS `#__finder_links_termsd` (
  `link_id` int unsigned NOT NULL,
  `term_id` int 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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_links_termse`
--

CREATE TABLE IF NOT EXISTS `#__finder_links_termse` (
  `link_id` int unsigned NOT NULL,
  `term_id` int 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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_links_termsf`
--

CREATE TABLE IF NOT EXISTS `#__finder_links_termsf` (
  `link_id` int unsigned NOT NULL,
  `term_id` int 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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_taxonomy`
--

CREATE TABLE IF NOT EXISTS `#__finder_taxonomy` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `parent_id` int unsigned NOT NULL DEFAULT 0,
  `title` varchar(255) NOT NULL,
  `state` tinyint unsigned NOT NULL DEFAULT 1,
  `access` tinyint unsigned NOT NULL DEFAULT 0,
  `ordering` tinyint 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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Dumping data for table `#__finder_taxonomy`
--

REPLACE INTO `#__finder_taxonomy` (`id`, `parent_id`, `title`, `state`, `access`, `ordering`) VALUES
(1, 0, 'ROOT', 0, 0, 0);

--
-- Table structure for table `#__finder_taxonomy_map`
--

CREATE TABLE IF NOT EXISTS `#__finder_taxonomy_map` (
  `link_id` int unsigned NOT NULL,
  `node_id` int unsigned NOT NULL,
  PRIMARY KEY (`link_id`,`node_id`),
  KEY `link_id` (`link_id`),
  KEY `node_id` (`node_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_terms`
--

CREATE TABLE IF NOT EXISTS `#__finder_terms` (
  `term_id` int unsigned NOT NULL AUTO_INCREMENT,
  `term` varchar(75) NOT NULL,
  `stem` varchar(75) NOT NULL,
  `common` tinyint unsigned NOT NULL DEFAULT 0,
  `phrase` tinyint unsigned NOT NULL DEFAULT 0,
  `weight` float unsigned NOT NULL DEFAULT 0,
  `soundex` varchar(75) NOT NULL,
  `links` int NOT NULL DEFAULT 0,
  `language` char(3) NOT NULL DEFAULT '',
  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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_terms_common`
--

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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Dumping data for table `#__finder_terms_common`
--

REPLACE INTO `#__finder_terms_common` (`term`, `language`) VALUES
('a', 'en'),
('about', 'en'),
('after', 'en'),
('ago', 'en'),
('all', 'en'),
('am', 'en'),
('an', 'en'),
('and', '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'),
('nothing', 'en'),
('of', 'en'),
('off', 'en'),
('often', 'en'),
('old', 'en'),
('on', 'en'),
('onc', 'en'),
('once', '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'),
('version', 'en'),
('very', 'en'),
('via', 'en'),
('want', 'en'),
('was', 'en'),
('way', 'en'),
('were', 'en'),
('what', 'en'),
('when', 'en'),
('where', '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');

--
-- Table structure for table `#__finder_tokens`
--

CREATE TABLE IF NOT EXISTS `#__finder_tokens` (
  `term` varchar(75) NOT NULL,
  `stem` varchar(75) NOT NULL,
  `common` tinyint unsigned NOT NULL DEFAULT 0,
  `phrase` tinyint unsigned NOT NULL DEFAULT 0,
  `weight` float unsigned NOT NULL DEFAULT 1,
  `context` tinyint unsigned NOT NULL DEFAULT 2,
  `language` char(3) NOT NULL DEFAULT '',
  KEY `idx_word` (`term`),
  KEY `idx_context` (`context`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_tokens_aggregate`
--

CREATE TABLE IF NOT EXISTS `#__finder_tokens_aggregate` (
  `term_id` int unsigned NOT NULL,
  `map_suffix` char(1) NOT NULL,
  `term` varchar(75) NOT NULL,
  `stem` varchar(75) NOT NULL,
  `common` tinyint unsigned NOT NULL DEFAULT 0,
  `phrase` tinyint unsigned NOT NULL DEFAULT 0,
  `term_weight` float unsigned NOT NULL,
  `context` tinyint unsigned NOT NULL DEFAULT 2,
  `context_weight` float unsigned NOT NULL,
  `total_weight` float unsigned NOT NULL,
  `language` char(3) NOT NULL DEFAULT '',
  KEY `token` (`term`),
  KEY `keyword_id` (`term_id`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;

--
-- Table structure for table `#__finder_types`
--

CREATE TABLE IF NOT EXISTS `#__finder_types` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(100) NOT NULL,
  `mime` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `title` (`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci;
components/com_finder/sql/install.postgresql.sql000060400000120756152453623450016246 0ustar00--
-- Table: #__finder_filters
--
CREATE TABLE "#__finder_filters" (
  "filter_id" serial NOT NULL,
  "title" character varying(255) NOT NULL,
  "alias" character varying(255) NOT NULL,
  "state" smallint DEFAULT 1 NOT NULL,
  "created" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL,
  "created_by" integer NOT NULL,
  "created_by_alias" character varying(255) NOT NULL,
  "modified" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL,
  "modified_by" integer 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,
  "map_count" integer DEFAULT 0 NOT NULL,
  "data" text NOT NULL,
  "params" text,
  PRIMARY KEY ("filter_id")
);

--
-- Table: #__finder_links
--
CREATE TABLE "#__finder_links" (
  "link_id" serial NOT NULL,
  "url" character varying(255) NOT NULL,
  "route" character varying(255) NOT NULL,
  "title" character varying(255) DEFAULT NULL,
  "description" character varying(255) DEFAULT NULL,
  "indexdate" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL,
  "md5sum" character varying(32) DEFAULT NULL,
  "published" smallint DEFAULT 1 NOT NULL,
  "state" integer DEFAULT 1,
  "access" integer DEFAULT 0,
  "language" character varying(8) NOT NULL,
  "publish_start_date" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL,
  "publish_end_date" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL,
  "start_date" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL,
  "end_date" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL,
  "list_price" numeric(8,2) DEFAULT 0 NOT NULL,
  "sale_price" numeric(8,2) DEFAULT 0 NOT NULL,
  "type_id" bigint NOT NULL,
  "object" bytea NOT NULL,
  PRIMARY KEY ("link_id")
);
CREATE INDEX "#__finder_links_idx_type" on "#__finder_links" ("type_id");
CREATE INDEX "#__finder_links_idx_title" on "#__finder_links" ("title");
CREATE INDEX "#__finder_links_idx_md5" on "#__finder_links" ("md5sum");
CREATE INDEX "#__finder_links_idx_url" on "#__finder_links" (url(75));
CREATE INDEX "#__finder_links_idx_published_list" on "#__finder_links" ("published", "state", "access", "publish_start_date", "publish_end_date", "list_price");
CREATE INDEX "#__finder_links_idx_published_sale" on "#__finder_links" ("published", "state", "access", "publish_start_date", "publish_end_date", "sale_price");

--
-- Table: #__finder_links_terms0
--
CREATE TABLE "#__finder_links_terms0" (
  "link_id" integer NOT NULL,
  "term_id" integer NOT NULL,
  "weight" numeric(8,2) NOT NULL,
  PRIMARY KEY ("link_id", "term_id")
);
CREATE INDEX "#__finder_links_terms0_idx_term_weight" on "#__finder_links_terms0" ("term_id", "weight");
CREATE INDEX "#__finder_links_terms0_idx_link_term_weight" on "#__finder_links_terms0" ("link_id", "term_id", "weight");

--
-- Table: #__finder_links_terms1
--
CREATE TABLE "#__finder_links_terms1" (
  "link_id" integer NOT NULL,
  "term_id" integer NOT NULL,
  "weight" numeric(8,2) NOT NULL,
  PRIMARY KEY ("link_id", "term_id")
);
CREATE INDEX "#__finder_links_terms1_idx_term_weight" on "#__finder_links_terms1" ("term_id", "weight");
CREATE INDEX "#__finder_links_terms1_idx_link_term_weight" on "#__finder_links_terms1" ("link_id", "term_id", "weight");

--
-- Table: #__finder_links_terms2
--
CREATE TABLE "#__finder_links_terms2" (
  "link_id" integer NOT NULL,
  "term_id" integer NOT NULL,
  "weight" numeric(8,2) NOT NULL,
  PRIMARY KEY ("link_id", "term_id")
);
CREATE INDEX "#__finder_links_terms2_idx_term_weight" on "#__finder_links_terms2" ("term_id", "weight");
CREATE INDEX "#__finder_links_terms2_idx_link_term_weight" on "#__finder_links_terms2" ("link_id", "term_id", "weight");

--
-- Table: #__finder_links_terms3
--
CREATE TABLE "#__finder_links_terms3" (
  "link_id" integer NOT NULL,
  "term_id" integer NOT NULL,
  "weight" numeric(8,2) NOT NULL,
  PRIMARY KEY ("link_id", "term_id")
);
CREATE INDEX "#__finder_links_terms3_idx_term_weight" on "#__finder_links_terms3" ("term_id", "weight");
CREATE INDEX "#__finder_links_terms3_idx_link_term_weight" on "#__finder_links_terms3" ("link_id", "term_id", "weight");

--
-- Table: #__finder_links_terms4
--
CREATE TABLE "#__finder_links_terms4" (
  "link_id" integer NOT NULL,
  "term_id" integer NOT NULL,
  "weight" numeric(8,2) NOT NULL,
  PRIMARY KEY ("link_id", "term_id")
);
CREATE INDEX "#__finder_links_terms4_idx_term_weight" on "#__finder_links_terms4" ("term_id", "weight");
CREATE INDEX "#__finder_links_terms4_idx_link_term_weight" on "#__finder_links_terms4" ("link_id", "term_id", "weight");

--
-- Table: #__finder_links_terms5
--
CREATE TABLE "#__finder_links_terms5" (
  "link_id" integer NOT NULL,
  "term_id" integer NOT NULL,
  "weight" numeric(8,2) NOT NULL,
  PRIMARY KEY ("link_id", "term_id")
);
CREATE INDEX "#__finder_links_terms5_idx_term_weight" on "#__finder_links_terms5" ("term_id", "weight");
CREATE INDEX "#__finder_links_terms5_idx_link_term_weight" on "#__finder_links_terms5" ("link_id", "term_id", "weight");

--
-- Table: #__finder_links_terms6
--
CREATE TABLE "#__finder_links_terms6" (
  "link_id" integer NOT NULL,
  "term_id" integer NOT NULL,
  "weight" numeric(8,2) NOT NULL,
  PRIMARY KEY ("link_id", "term_id")
);
CREATE INDEX "#__finder_links_terms6_idx_term_weight" on "#__finder_links_terms6" ("term_id", "weight");
CREATE INDEX "#__finder_links_terms6_idx_link_term_weight" on "#__finder_links_terms6" ("link_id", "term_id", "weight");

--
-- Table: #__finder_links_terms7
--
CREATE TABLE "#__finder_links_terms7" (
  "link_id" integer NOT NULL,
  "term_id" integer NOT NULL,
  "weight" numeric(8,2) NOT NULL,
  PRIMARY KEY ("link_id", "term_id")
);
CREATE INDEX "#__finder_links_terms7_idx_term_weight" on "#__finder_links_terms7" ("term_id", "weight");
CREATE INDEX "#__finder_links_terms7_idx_link_term_weight" on "#__finder_links_terms7" ("link_id", "term_id", "weight");

--
-- Table: #__finder_links_terms8
--
CREATE TABLE "#__finder_links_terms8" (
  "link_id" integer NOT NULL,
  "term_id" integer NOT NULL,
  "weight" numeric(8,2) NOT NULL,
  PRIMARY KEY ("link_id", "term_id")
);
CREATE INDEX "#__finder_links_terms8_idx_term_weight" on "#__finder_links_terms8" ("term_id", "weight");
CREATE INDEX "#__finder_links_terms8_idx_link_term_weight" on "#__finder_links_terms8" ("link_id", "term_id", "weight");

--
-- Table: #__finder_links_terms9
--
CREATE TABLE "#__finder_links_terms9" (
  "link_id" integer NOT NULL,
  "term_id" integer NOT NULL,
  "weight" numeric(8,2) NOT NULL,
  PRIMARY KEY ("link_id", "term_id")
);
CREATE INDEX "#__finder_links_terms9_idx_term_weight" on "#__finder_links_terms9" ("term_id", "weight");
CREATE INDEX "#__finder_links_terms9_idx_link_term_weight" on "#__finder_links_terms9" ("link_id", "term_id", "weight");

--
-- Table: #__finder_links_termsa
--
CREATE TABLE "#__finder_links_termsa" (
  "link_id" integer NOT NULL,
  "term_id" integer NOT NULL,
  "weight" numeric(8,2) NOT NULL,
  PRIMARY KEY ("link_id", "term_id")
);
CREATE INDEX "#__finder_links_termsa_idx_term_weight" on "#__finder_links_termsa" ("term_id", "weight");
CREATE INDEX "#__finder_links_termsa_idx_link_term_weight" on "#__finder_links_termsa" ("link_id", "term_id", "weight");

--
-- Table: #__finder_links_termsb
--
CREATE TABLE "#__finder_links_termsb" (
  "link_id" integer NOT NULL,
  "term_id" integer NOT NULL,
  "weight" numeric(8,2) NOT NULL,
  PRIMARY KEY ("link_id", "term_id")
);
CREATE INDEX "#__finder_links_termsb_idx_term_weight" on "#__finder_links_termsb" ("term_id", "weight");
CREATE INDEX "#__finder_links_termsb_idx_link_term_weight" on "#__finder_links_termsb" ("link_id", "term_id", "weight");

--
-- Table: #__finder_links_termsc
--
CREATE TABLE "#__finder_links_termsc" (
  "link_id" integer NOT NULL,
  "term_id" integer NOT NULL,
  "weight" numeric(8,2) NOT NULL,
  PRIMARY KEY ("link_id", "term_id")
);
CREATE INDEX "#__finder_links_termsc_idx_term_weight" on "#__finder_links_termsc" ("term_id", "weight");
CREATE INDEX "#__finder_links_termsc_idx_link_term_weight" on "#__finder_links_termsc" ("link_id", "term_id", "weight");

--
-- Table: #__finder_links_termsd
--
CREATE TABLE "#__finder_links_termsd" (
  "link_id" integer NOT NULL,
  "term_id" integer NOT NULL,
  "weight" numeric(8,2) NOT NULL,
  PRIMARY KEY ("link_id", "term_id")
);
CREATE INDEX "#__finder_links_termsd_idx_term_weight" on "#__finder_links_termsd" ("term_id", "weight");
CREATE INDEX "#__finder_links_termsd_idx_link_term_weight" on "#__finder_links_termsd" ("link_id", "term_id", "weight");

--
-- Table: #__finder_links_termse
--
CREATE TABLE "#__finder_links_termse" (
  "link_id" integer NOT NULL,
  "term_id" integer NOT NULL,
  "weight" numeric(8,2) NOT NULL,
  PRIMARY KEY ("link_id", "term_id")
);
CREATE INDEX "#__finder_links_termse_idx_term_weight" on "#__finder_links_termse" ("term_id", "weight");
CREATE INDEX "#__finder_links_termse_idx_link_term_weight" on "#__finder_links_termse" ("link_id", "term_id", "weight");

--
-- Table: #__finder_links_termsf
--
CREATE TABLE "#__finder_links_termsf" (
  "link_id" integer NOT NULL,
  "term_id" integer NOT NULL,
  "weight" numeric(8,2) NOT NULL,
  PRIMARY KEY ("link_id", "term_id")
);
CREATE INDEX "#__finder_links_termsf_idx_term_weight" on "#__finder_links_termsf" ("term_id", "weight");
CREATE INDEX "#__finder_links_termsf_idx_link_term_weight" on "#__finder_links_termsf" ("link_id", "term_id", "weight");

--
-- Table: #__finder_taxonomy
--
CREATE TABLE "#__finder_taxonomy" (
  "id" serial NOT NULL,
  "parent_id" integer DEFAULT 0 NOT NULL,
  "title" character varying(255) NOT NULL,
  "state" smallint DEFAULT 1 NOT NULL,
  "access" smallint DEFAULT 0 NOT NULL,
  "ordering" smallint DEFAULT 0 NOT NULL,
  PRIMARY KEY ("id")
);
CREATE INDEX "#__finder_taxonomy_parent_id" on "#__finder_taxonomy" ("parent_id");
CREATE INDEX "#__finder_taxonomy_state" on "#__finder_taxonomy" ("state");
CREATE INDEX "#__finder_taxonomy_ordering" on "#__finder_taxonomy" ("ordering");
CREATE INDEX "#__finder_taxonomy_access" on "#__finder_taxonomy" ("access");
CREATE INDEX "#__finder_taxonomy_idx_parent_published" on "#__finder_taxonomy" ("parent_id", "state", "access");

--
-- Dumping data for table #__finder_taxonomy
--
UPDATE "#__finder_taxonomy" SET ("id", "parent_id", "title", "state", "access", "ordering") = (1, 0, 'ROOT', 0, 0, 0) 
WHERE "id"=1;

INSERT INTO "#__finder_taxonomy" ("id", "parent_id", "title", "state", "access", "ordering") 
SELECT 1, 0, 'ROOT', 0, 0, 0 WHERE 1 NOT IN 
(SELECT 1 FROM "#__finder_taxonomy" WHERE "id"=1);



--
-- Table: #__finder_taxonomy_map
--
CREATE TABLE "#__finder_taxonomy_map" (
  "link_id" integer NOT NULL,
  "node_id" integer NOT NULL,
  PRIMARY KEY ("link_id", "node_id")
);
CREATE INDEX "#__finder_taxonomy_map_link_id" on "#__finder_taxonomy_map" ("link_id");
CREATE INDEX "#__finder_taxonomy_map_node_id" on "#__finder_taxonomy_map" ("node_id");

--
-- Table: #__finder_terms
--
CREATE TABLE "#__finder_terms" (
  "term_id" serial NOT NULL,
  "term" character varying(75) NOT NULL,
  "stem" character varying(75) NOT NULL,
  "common" smallint DEFAULT 0 NOT NULL,
  "phrase" smallint DEFAULT 0 NOT NULL,
  "weight" numeric(8,2) DEFAULT 0 NOT NULL,
  "soundex" character varying(75) NOT NULL,
  "links" integer DEFAULT 0 NOT NULL,
  PRIMARY KEY ("term_id"),
  CONSTRAINT "#__finder_terms_idx_term" UNIQUE ("term")
);
CREATE INDEX "#__finder_terms_idx_term_phrase" on "#__finder_terms" ("term", "phrase");
CREATE INDEX "#__finder_terms_idx_stem_phrase" on "#__finder_terms" ("stem", "phrase");
CREATE INDEX "#__finder_terms_idx_soundex_phrase" on "#__finder_terms" ("soundex", "phrase");

--
-- Table: #__finder_terms_common
--
CREATE TABLE "#__finder_terms_common" (
  "term" character varying(75) NOT NULL,
  "language" character varying(3) NOT NULL
);
CREATE INDEX "#__finder_terms_common_idx_word_lang" on "#__finder_terms_common" ("term", "language");
CREATE INDEX "#__finder_terms_common_idx_lang" on "#__finder_terms_common" ("language");


--
-- Dumping data for table `#__finder_terms_common`
--

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('a', 'en') WHERE "term"='a';

INSERT INTO "#__finder_terms_common" ("term", "language") 
SELECT 'a', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='a');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('about', 'en') WHERE "term"='about';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'about', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='about');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('after', 'en') WHERE "term"='after';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'after', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='after');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('ago', 'en') WHERE "term"='ago';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'ago', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='ago');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('all', 'en') WHERE "term"='all';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'all', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='all');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('am', 'en') WHERE "term"='am';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'am', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='am');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('an', 'en') WHERE "term"='an';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'an', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='an');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('and', 'en') WHERE "term"='and';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'and', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='and');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('any', 'en') WHERE "term"='any';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'any', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='any');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('are', 'en') WHERE "term"='are';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'are', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='are');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('aren''t', 'en') WHERE "term"='aren''t';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'aren''t', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='aren''t');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('as', 'en') WHERE "term"='as';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'as', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='as');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('at', 'en') WHERE "term"='at';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'at', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='at');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('be', 'en') WHERE "term"='be';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'be', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='be');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('but', 'en') WHERE "term"='but';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'but', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='but');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('by', 'en') WHERE "term"='by';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'by', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='by');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('for', 'en') WHERE "term"='for';

INSERT INTO "#__finder_terms_common" ("term", "language") SELECT 'for', 'en' WHERE 1 NOT IN 
(SELECT 1 FROM "#__finder_terms_common" WHERE "term"='for');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('from', 'en') WHERE "term"='from';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'from', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='from');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('get', 'en') WHERE "term"='get';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'get', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='get');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('go', 'en') WHERE "term"='go';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'go', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='go');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('how', 'en') WHERE "term"='how';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'how', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='how');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('if', 'en') WHERE "term"='if';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'if', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='if');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('in', 'en') WHERE "term"='in';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'in', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='in');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('into', 'en') WHERE "term"='into';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'into', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='into');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('is', 'en') WHERE "term"='is';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'is', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='is');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('isn''t', 'en') WHERE "term"='isn''t';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'isn''t', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='isn''t');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('it', 'en') WHERE "term"='it';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'it', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='it');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('its', 'en') WHERE "term"='its';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'its', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='its');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('me', 'en') WHERE "term"='me';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'me', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='me');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('more', 'en') WHERE "term"='more';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'more', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='more');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('most', 'en') WHERE "term"='most';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'most', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='most');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('must', 'en') WHERE "term"='must';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'must', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='must');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('my', 'en') WHERE "term"='my';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'my', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='my');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('new', 'en') WHERE "term"='new';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'new', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='new');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('no', 'en') WHERE "term"='no';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'no', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='no');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('none', 'en') WHERE "term"='none';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'none', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='none');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('not', 'en') WHERE "term"='not';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'not', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='not');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('nothing', 'en') WHERE "term"='nothing';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'nothing', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='nothing');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('of', 'en') WHERE "term"='of';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'of', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='of');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('off', 'en') WHERE "term"='off';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'off', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='off');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('often', 'en') WHERE "term"='often';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'often', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='often');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('old', 'en') WHERE "term"='old';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'old', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='old');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('on', 'en') WHERE "term"='on';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'on', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='on');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('onc', 'en') WHERE "term"='onc';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'onc', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='onc');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('once', 'en') WHERE "term"='once';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'once', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='once');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('only', 'en') WHERE "term"='only';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'only', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='only');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('or', 'en') WHERE "term"='or';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'or', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='or');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('other', 'en') WHERE "term"='other';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'other', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='other');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('our', 'en') WHERE "term"='our';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'our', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='our');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('ours', 'en') WHERE "term"='ours';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'ours', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='ours');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('out', 'en') WHERE "term"='out';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'out', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='out');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('over', 'en') WHERE "term"='over';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'over', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='over');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('page', 'en') WHERE "term"='page';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'page', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='page');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('she', 'en') WHERE "term"='she';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'she', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='she');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('should', 'en') WHERE "term"='should';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'should', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='should');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('small', 'en') WHERE "term"='small';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'small', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='small');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('so', 'en') WHERE "term"='so';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'so', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='so');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('some', 'en') WHERE "term"='some';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'some', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='some');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('than', 'en') WHERE "term"='than';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'than', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='than');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('thank', 'en') WHERE "term"='thank';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'thank', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='thank');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('that', 'en') WHERE "term"='that';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'that', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='that');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('the', 'en') WHERE "term"='the';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'the', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='the');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('their', 'en') WHERE "term"='their';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'their', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='their');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('theirs', 'en') WHERE "term"='theirs';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'theirs', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='theirs');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('them', 'en') WHERE "term"='them';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'them', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='them');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('then', 'en') WHERE "term"='then';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'then', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='then');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('there', 'en') WHERE "term"='there';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'there', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='there');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('these', 'en') WHERE "term"='these';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'these', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='these');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('they', 'en') WHERE "term"='they';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'they', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='they');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('this', 'en') WHERE "term"='this';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'this', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='this');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('those', 'en') WHERE "term"='those';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'those', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='those');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('thus', 'en') WHERE "term"='thus';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'thus', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='thus');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('time', 'en') WHERE "term"='time';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'time', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='time');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('times', 'en') WHERE "term"='times';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'times', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='times');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('to', 'en') WHERE "term"='to';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'to', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='to');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('too', 'en') WHERE "term"='too';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'too', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='too');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('true', 'en') WHERE "term"='true';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'true', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='true');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('under', 'en')WHERE "term"='under';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'under', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='under');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('until', 'en') WHERE "term"='until';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'until', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='until');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('up', 'en') WHERE "term"='up';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'up', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='up');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('upon', 'en') WHERE "term"='upon';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'upon', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='upon');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('use', 'en') WHERE "term"='use';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'use', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='use');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('user', 'en') WHERE "term"='user';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'user', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='user');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('users', 'en') WHERE "term"='users';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'users', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='users');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('version', 'en') WHERE "term"='version';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'version', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='version');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('very', 'en') WHERE "term"='very';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'very', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='very');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('via', 'en') WHERE "term"='via';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'via', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='via');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('want', 'en') WHERE "term"='want';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'want', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='want');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('was', 'en') WHERE "term"='was';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'was', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='was');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('way', 'en') WHERE "term"='way';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'way', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='way');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('were', 'en') WHERE "term"='were';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'were', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='were');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('what', 'en') WHERE "term"='what';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'what', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='what');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('when', 'en') WHERE "term"='when';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'when', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='when');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('where', 'en') WHERE "term"='where';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'where', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='where');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('which', 'en') WHERE "term"='which';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'which', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='which');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('who', 'en') WHERE "term"='who';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'who', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='who');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('whom', 'en') WHERE "term"='whom';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'whom', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='whom');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('whose', 'en') WHERE "term"='whose';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'whose', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='whose');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('why', 'en') WHERE "term"='why';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'why', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='why');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('wide', 'en') WHERE "term"='wide';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'wide', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='wide');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('will', 'en') WHERE "term"='will';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'will', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='will');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('with', 'en') WHERE "term"='with';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'with', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='with');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('within', 'en') WHERE "term"='within';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'within', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='within');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('without', 'en') WHERE "term"='without';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'without', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='without');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('would', 'en') WHERE "term"='would';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'would', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='would');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('yes', 'en') WHERE "term"='yes';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'yes', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='yes');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('yet', 'en') WHERE "term"='yet';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'yet', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='yet');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('you', 'en') WHERE "term"='you';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'you', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='you');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('your', 'en') WHERE "term"='your';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'your', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='your');

--
UPDATE "#__finder_terms_common" SET ("term", "language") = ('yours', 'en') WHERE "term"='yours';

INSERT INTO "#__finder_terms_common" ("term", "language")
SELECT 'yours', 'en' WHERE 1 NOT IN (SELECT 1 FROM "#__finder_terms_common" WHERE "term"='yours');



--
-- Table: #__finder_tokens
--
CREATE TABLE "#__finder_tokens" (
  "term" character varying(75) NOT NULL,
  "stem" character varying(75) NOT NULL,
  "common" smallint DEFAULT 0 NOT NULL,
  "phrase" smallint DEFAULT 0 NOT NULL,
  "weight" numeric(8,2) DEFAULT 1 NOT NULL,
  "context" smallint DEFAULT 2 NOT NULL
);
CREATE INDEX "#__finder_tokens_idx_word" on "#__finder_tokens" ("term");
CREATE INDEX "#__finder_tokens_idx_context" on "#__finder_tokens" ("context");

--
-- Table: #__finder_tokens_aggregate
--
CREATE TABLE "#__finder_tokens_aggregate" (
  "term_id" integer NOT NULL,
  "map_suffix" character(1) NOT NULL,
  "term" character varying(75) NOT NULL,
  "stem" character varying(75) NOT NULL,
  "common" smallint DEFAULT 0 NOT NULL,
  "phrase" smallint DEFAULT 0 NOT NULL,
  "term_weight" numeric(8,2) NOT NULL,
  "context" smallint DEFAULT 2 NOT NULL,
  "context_weight" numeric(8,2) NOT NULL,
  "total_weight" numeric(8,2) NOT NULL
);
CREATE INDEX "#__finder_tokens_aggregate_token" on "#__finder_tokens_aggregate" ("term");
CREATE INDEX "_#__finder_tokens_aggregate_keyword_id" on "#__finder_tokens_aggregate" ("term_id");

--
-- Table: #__finder_types
--
CREATE TABLE "#__finder_types" (
  "id" serial NOT NULL,
  "title" character varying(100) NOT NULL,
  "mime" character varying(100) NOT NULL,
  PRIMARY KEY ("id"),
  CONSTRAINT "#__finder_types_title" UNIQUE ("title")
);

components/com_finder/sql/uninstall.mysql.sql000060400000002167152453623450015546 0ustar00DROP TABLE IF EXISTS `#__finder_filters`;
DROP TABLE IF EXISTS `#__finder_links`;
DROP TABLE IF EXISTS `#__finder_links_terms0`;
DROP TABLE IF EXISTS `#__finder_links_terms1`;
DROP TABLE IF EXISTS `#__finder_links_terms2`;
DROP TABLE IF EXISTS `#__finder_links_terms3`;
DROP TABLE IF EXISTS `#__finder_links_terms4`;
DROP TABLE IF EXISTS `#__finder_links_terms5`;
DROP TABLE IF EXISTS `#__finder_links_terms6`;
DROP TABLE IF EXISTS `#__finder_links_terms7`;
DROP TABLE IF EXISTS `#__finder_links_terms8`;
DROP TABLE IF EXISTS `#__finder_links_terms9`;
DROP TABLE IF EXISTS `#__finder_links_termsa`;
DROP TABLE IF EXISTS `#__finder_links_termsb`;
DROP TABLE IF EXISTS `#__finder_links_termsc`;
DROP TABLE IF EXISTS `#__finder_links_termsd`;
DROP TABLE IF EXISTS `#__finder_links_termse`;
DROP TABLE IF EXISTS `#__finder_links_termsf`;
DROP TABLE IF EXISTS `#__finder_taxonomy`;
DROP TABLE IF EXISTS `#__finder_taxonomy_map`;
DROP TABLE IF EXISTS `#__finder_terms`;
DROP TABLE IF EXISTS `#__finder_terms_common`;
DROP TABLE IF EXISTS `#__finder_tokens`;
DROP TABLE IF EXISTS `#__finder_tokens_aggregate`;
DROP TABLE IF EXISTS `#__finder_types`;
components/com_finder/controllers/filter.php000060400000016420152453623450015412 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Indexer controller class for Finder.
 *
 * @since  2.5
 */
class FinderControllerFilter extends JControllerForm
{
	/**
	 * 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   2.5
	 */
	public function save($key = null, $urlVar = null)
	{
		// Check for request forgeries.
		$this->checkToken();

		$app = JFactory::getApplication();
		$input = $app->input;
		$model = $this->getModel();
		$table = $model->getTable();
		$data = $input->post->get('jform', array(), 'array');
		$checkin = property_exists($table, 'checked_out');
		$context = "$this->option.edit.$this->context";
		$task = $this->getTask();

		// Determine the name of the primary key for the data.
		if (empty($key))
		{
			$key = $table->getKeyName();
		}

		// To avoid data collisions the urlVar may be different from the primary key.
		if (empty($urlVar))
		{
			$urlVar = $key;
		}

		$recordId = $input->get($urlVar, '', 'int');

		if (!$this->checkEditId($context, $recordId))
		{
			// Somehow the person just went to the form and tried to save it. We don't allow that.
			$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_UNHELD_ID', $recordId));
			$this->setMessage($this->getError(), 'error');
			$this->setRedirect(JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_list . $this->getRedirectToListAppend(), false));

			return false;
		}

		// Populate the row id from the session.
		$data[$key] = $recordId;

		// The save2copy task needs to be handled slightly differently.
		if ($task === 'save2copy')
		{
			// Check-in the original row.
			if ($checkin && $model->checkin($data[$key]) === false)
			{
				// Check-in failed. Go back to the item and display a notice.
				$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_CHECKIN_FAILED', $model->getError()));
				$this->setMessage($this->getError(), 'error');
				$this->setRedirect('index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend($recordId, $urlVar));

				return false;
			}

			// Reset the ID and then treat the request as for Apply.
			$data[$key] = 0;
			$task = 'apply';
		}

		// Access check.
		if (!$this->allowSave($data, $key))
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'));
			$this->setMessage($this->getError(), 'error');
			$this->setRedirect(JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_list . $this->getRedirectToListAppend(), false));

			return false;
		}

		// Validate the posted data.
		// Sometimes the form needs some posted data, such as for plugins and modules.
		$form = $model->getForm($data, false);

		if (!$form)
		{
			$app->enqueueMessage($model->getError(), 'error');

			return false;
		}

		// Test whether the data is valid.
		$validData = $model->validate($form, $data);

		// Check for validation errors.
		if ($validData === 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');
				}
			}

			// Save the data in the session.
			$app->setUserState($context . '.data', $data);

			// Redirect back to the edit screen.
			$this->setRedirect(
				JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend($recordId, $key), false)
			);

			return false;
		}

		// Get and sanitize the filter data.
		$validData['data'] = $input->post->get('t', array(), 'array');
		$validData['data'] = array_unique($validData['data']);
		$validData['data'] = ArrayHelper::toInteger($validData['data']);

		// Remove any values of zero.
		if (array_search(0, $validData['data'], true))
		{
			unset($validData['data'][array_search(0, $validData['data'], true)]);
		}

		// Attempt to save the data.
		if (!$model->save($validData))
		{
			// Save the data in the session.
			$app->setUserState($context . '.data', $validData);

			// Redirect back to the edit screen.
			$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_SAVE_FAILED', $model->getError()));
			$this->setMessage($this->getError(), 'error');
			$this->setRedirect(
				JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend($recordId, $key), false)
			);

			return false;
		}

		// Save succeeded, so check-in the record.
		if ($checkin && $model->checkin($validData[$key]) === false)
		{
			// Save the data in the session.
			$app->setUserState($context . '.data', $validData);

			// Check-in failed, so go back to the record and display a notice.
			$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_CHECKIN_FAILED', $model->getError()));
			$this->setMessage($this->getError(), 'error');
			$this->setRedirect('index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend($recordId, $key));

			return false;
		}

		$this->setMessage(
			JText::_(
				(JFactory::getLanguage()->hasKey($this->text_prefix . ($recordId === 0 && $app->isClient('site') ? '_SUBMIT' : '') . '_SAVE_SUCCESS')
				? $this->text_prefix : 'JLIB_APPLICATION') . ($recordId === 0 && $app->isClient('site') ? '_SUBMIT' : '') . '_SAVE_SUCCESS'
			)
		);

		// Redirect the user and adjust session state based on the chosen task.
		switch ($task)
		{
			case 'apply':
				// Set the record data in the session.
				$recordId = $model->getState($this->context . '.id');
				$this->holdEditId($context, $recordId);
				$app->setUserState($context . '.data', null);
				$model->checkout($recordId);

				// Redirect back to the edit screen.
				$this->setRedirect(
					JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend($recordId, $key), false)
				);

				break;

			case 'save2new':
				// Clear the record id and data from the session.
				$this->releaseEditId($context, $recordId);
				$app->setUserState($context . '.data', null);

				// Redirect back to the edit screen.
				$this->setRedirect(
					JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_item . $this->getRedirectToItemAppend(null, $key), false)
				);

				break;

			default:
				// Clear the record id and data from the session.
				$this->releaseEditId($context, $recordId);
				$app->setUserState($context . '.data', null);

				// Redirect to the list screen.
				$this->setRedirect(
					JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_list . $this->getRedirectToListAppend(), false)
				);

				break;
		}

		// Invoke the postSave method to allow for the child class to access the model.
		$this->postSaveHook($model, $validData);

		return true;
	}
}
components/com_finder/controllers/filters.php000060400000001557152453623450015602 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Filters controller class for Finder.
 *
 * @since  2.5
 */
class FinderControllerFilters extends JControllerAdmin
{
	/**
	 * 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   2.5
	 */
	public function getModel($name = 'Filter', $prefix = 'FinderModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}
}
components/com_finder/controllers/maps.php000060400000001547152453623450015071 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Maps controller class for Finder.
 *
 * @since  2.5
 */
class FinderControllerMaps extends JControllerAdmin
{
	/**
	 * 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 = 'Maps', $prefix = 'FinderModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}
}
components/com_finder/controllers/indexer.json.php000060400000024677152453623450016550 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Register dependent classes.
JLoader::register('FinderIndexer', JPATH_ADMINISTRATOR . '/components/com_finder/helpers/indexer/indexer.php');

/**
 * Indexer controller class for Finder.
 *
 * @since  2.5
 */
class FinderControllerIndexer extends JControllerLegacy
{
	/**
	 * Method to start the indexer.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function start()
	{
		$params = JComponentHelper::getParams('com_finder');

		if ($params->get('enable_logging', '0'))
		{
			$options['format'] = '{DATE}\t{TIME}\t{LEVEL}\t{CODE}\t{MESSAGE}';
			$options['text_file'] = 'indexer.php';
			JLog::addLogger($options);
		}

		// Log the start
		try
		{
			JLog::add('Starting the indexer', JLog::INFO);
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		// We don't want this form to be cached.
		$app = JFactory::getApplication();
		$app->setHeader('Expires', 'Mon, 1 Jan 2001 00:00:00 GMT', true);
		$app->setHeader('Last-Modified', gmdate('D, d M Y H:i:s') . ' GMT', true);
		$app->setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0', false);
		$app->setHeader('Pragma', 'no-cache');

		// Check for a valid token. If invalid, send a 403 with the error message.
		JSession::checkToken('request') or static::sendResponse(new Exception(JText::_('JINVALID_TOKEN_NOTICE'), 403));

		// Put in a buffer to silence noise.
		ob_start();

		// Reset the indexer state.
		FinderIndexer::resetState();

		// Import the finder plugins.
		JPluginHelper::importPlugin('finder');

		// Add the indexer language to JS
		JText::script('COM_FINDER_AN_ERROR_HAS_OCCURRED');
		JText::script('COM_FINDER_NO_ERROR_RETURNED');

		// Start the indexer.
		try
		{
			// Trigger the onStartIndex event.
			JEventDispatcher::getInstance()->trigger('onStartIndex');

			// Get the indexer state.
			$state = FinderIndexer::getState();
			$state->start = 1;

			// Send the response.
			static::sendResponse($state);
		}

		// Catch an exception and return the response.
		catch (Exception $e)
		{
			static::sendResponse($e);
		}
	}

	/**
	 * Method to run the next batch of content through the indexer.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function batch()
	{
		$params = JComponentHelper::getParams('com_finder');

		if ($params->get('enable_logging', '0'))
		{
			$options['format'] = '{DATE}\t{TIME}\t{LEVEL}\t{CODE}\t{MESSAGE}';
			$options['text_file'] = 'indexer.php';
			JLog::addLogger($options);
		}

		// Log the start
		try
		{
			JLog::add('Starting the indexer batch process', JLog::INFO);
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		// We don't want this form to be cached.
		$app = JFactory::getApplication();
		$app->setHeader('Expires', 'Mon, 1 Jan 2001 00:00:00 GMT', true);
		$app->setHeader('Last-Modified', gmdate('D, d M Y H:i:s') . ' GMT', true);
		$app->setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0', false);
		$app->setHeader('Pragma', 'no-cache');

		// Check for a valid token. If invalid, send a 403 with the error message.
		JSession::checkToken('request') or static::sendResponse(new Exception(JText::_('JINVALID_TOKEN_NOTICE'), 403));

		// Put in a buffer to silence noise.
		ob_start();

		// Remove the script time limit.
		@set_time_limit(0);

		// Get the indexer state.
		$state = FinderIndexer::getState();

		// Reset the batch offset.
		$state->batchOffset = 0;

		// Update the indexer state.
		FinderIndexer::setState($state);

		// Import the finder plugins.
		JPluginHelper::importPlugin('finder');

		/*
		 * We are going to swap out the raw document object with an HTML document
		 * in order to work around some plugins that don't do proper environment
		 * checks before trying to use HTML document functions.
		 */
		$raw = clone JFactory::getDocument();
		$lang = JFactory::getLanguage();

		// Get the document properties.
		$attributes = array (
			'charset'   => 'utf-8',
			'lineend'   => 'unix',
			'tab'       => '  ',
			'language'  => $lang->getTag(),
			'direction' => $lang->isRtl() ? 'rtl' : 'ltr'
		);

		// Get the HTML document.
		$html = JDocument::getInstance('html', $attributes);

		// Todo: Why is this document fetched and immediately overwritten?
		$doc = JFactory::getDocument();

		// Swap the documents.
		$doc = $html;

		// Get the admin application.
		$admin = clone JFactory::getApplication();

		// Get the site app.
		$site = JApplicationCms::getInstance('site');

		// Swap the app.
		$app = JFactory::getApplication();

		// Todo: Why is the app fetched and immediately overwritten?
		$app = $site;

		// Start the indexer.
		try
		{
			// Trigger the onBeforeIndex event.
			JEventDispatcher::getInstance()->trigger('onBeforeIndex');

			// Trigger the onBuildIndex event.
			JEventDispatcher::getInstance()->trigger('onBuildIndex');

			// Get the indexer state.
			$state = FinderIndexer::getState();
			$state->start = 0;
			$state->complete = 0;

			// Swap the documents back.
			$doc = $raw;

			// Swap the applications back.
			$app = $admin;

			// Log batch completion and memory high-water mark.
			try
			{
				JLog::add('Batch completed, peak memory usage: ' . number_format(memory_get_peak_usage(true)) . ' bytes', JLog::INFO);
			}
			catch (RuntimeException $exception)
			{
				// Informational log only
			}

			// Send the response.
			static::sendResponse($state);
		}

		// Catch an exception and return the response.
		catch (Exception $e)
		{
			// Swap the documents back.
			$doc = $raw;

			// Send the response.
			static::sendResponse($e);
		}
	}

	/**
	 * Method to optimize the index and perform any necessary cleanup.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function optimize()
	{
		// We don't want this form to be cached.
		$app = JFactory::getApplication();
		$app->setHeader('Expires', 'Mon, 1 Jan 2001 00:00:00 GMT', true);
		$app->setHeader('Last-Modified', gmdate('D, d M Y H:i:s') . ' GMT', true);
		$app->setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0', false);
		$app->setHeader('Pragma', 'no-cache');

		// Check for a valid token. If invalid, send a 403 with the error message.
		JSession::checkToken('request') or static::sendResponse(new Exception(JText::_('JINVALID_TOKEN_NOTICE'), 403));

		// Put in a buffer to silence noise.
		ob_start();

		// Import the finder plugins.
		JPluginHelper::importPlugin('finder');

		try
		{
			// Optimize the index
			FinderIndexer::getInstance()->optimize();

			// Get the indexer state.
			$state = FinderIndexer::getState();
			$state->start = 0;
			$state->complete = 1;

			// Send the response.
			static::sendResponse($state);
		}

		// Catch an exception and return the response.
		catch (Exception $e)
		{
			static::sendResponse($e);
		}
	}

	/**
	 * Method to handle a send a JSON response. The body parameter
	 * can be an Exception object for when an error has occurred or
	 * a JObject for a good response.
	 *
	 * @param   mixed  $data  JObject on success, Exception on error. [optional]
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public static function sendResponse($data = null)
	{
		// This method always sends a JSON response
		$app = JFactory::getApplication();
		$app->mimeType = 'application/json';

		$params = JComponentHelper::getParams('com_finder');

		if ($params->get('enable_logging', '0'))
		{
			$options['format'] = '{DATE}\t{TIME}\t{LEVEL}\t{CODE}\t{MESSAGE}';
			$options['text_file'] = 'indexer.php';
			JLog::addLogger($options);
		}

		// Send the assigned error code if we are catching an exception.
		if ($data instanceof Exception)
		{
			try
			{
				JLog::add($data->getMessage(), JLog::ERROR);
			}
			catch (RuntimeException $exception)
			{
				// Informational log only
			}

			$app->setHeader('status', $data->getCode());
		}

		// Create the response object.
		$response = new FinderIndexerResponse($data);

		// Add the buffer.
		$response->buffer = JDEBUG ? ob_get_contents() : ob_end_clean();

		// Send the JSON response.
		$app->setHeader('Content-Type', $app->mimeType . '; charset=' . $app->charSet);
		$app->sendHeaders();
		echo json_encode($response);

		// Close the application.
		$app->close();
	}
}

/**
 * Finder Indexer JSON Response Class
 *
 * @since  2.5
 */
class FinderIndexerResponse
{
	/**
	 * Class Constructor
	 *
	 * @param   mixed  $state  The processing state for the indexer
	 *
	 * @since   2.5
	 */
	public function __construct($state)
	{
		$params = JComponentHelper::getParams('com_finder');

		if ($params->get('enable_logging', '0'))
		{
			$options['format'] = '{DATE}\t{TIME}\t{LEVEL}\t{CODE}\t{MESSAGE}';
			$options['text_file'] = 'indexer.php';
			JLog::addLogger($options);
		}

		// The old token is invalid so send a new one.
		$this->token = JFactory::getSession()->getFormToken();

		// Check if we are dealing with an error.
		if ($state instanceof Exception)
		{
			// Log the error
			try
			{
				JLog::add($state->getMessage(), JLog::ERROR);
			}
			catch (RuntimeException $exception)
			{
				// Informational log only
			}

			// Prepare the error response.
			$this->error = true;
			$this->header = JText::_('COM_FINDER_INDEXER_HEADER_ERROR');
			$this->message = $state->getMessage();
		}
		else
		{
			// Prepare the response data.
			$this->batchSize = (int) $state->batchSize;
			$this->batchOffset = (int) $state->batchOffset;
			$this->totalItems = (int) $state->totalItems;

			$this->startTime = $state->startTime;
			$this->endTime = JFactory::getDate()->toSql();

			$this->start = !empty($state->start) ? (int) $state->start : 0;
			$this->complete = !empty($state->complete) ? (int) $state->complete : 0;

			// Set the appropriate messages.
			if ($this->totalItems <= 0 && $this->complete)
			{
				$this->header = JText::_('COM_FINDER_INDEXER_HEADER_COMPLETE');
				$this->message = JText::_('COM_FINDER_INDEXER_MESSAGE_COMPLETE');
			}
			elseif ($this->totalItems <= 0)
			{
				$this->header = JText::_('COM_FINDER_INDEXER_HEADER_OPTIMIZE');
				$this->message = JText::_('COM_FINDER_INDEXER_MESSAGE_OPTIMIZE');
			}
			else
			{
				$this->header = JText::_('COM_FINDER_INDEXER_HEADER_RUNNING');
				$this->message = JText::_('COM_FINDER_INDEXER_MESSAGE_RUNNING');
			}
		}
	}
}

// Register the error handler.
JError::setErrorHandling(E_ALL, 'callback', array('FinderControllerIndexer', 'sendResponse'));
components/com_finder/controllers/index.php000060400000003072152453623450015233 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Index controller class for Finder.
 *
 * @since  2.5
 */
class FinderControllerIndex extends JControllerAdmin
{
	/**
	 * 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   2.5
	 */
	public function getModel($name = 'Index', $prefix = 'FinderModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	/**
	 * Method to purge all indexed links from the database.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 */
	public function purge()
	{
		$this->checkToken();

		// Remove the script time limit.
		@set_time_limit(0);

		$model = $this->getModel('Index', 'FinderModel');

		// Attempt to purge the index.
		$return = $model->purge();

		if (!$return)
		{
			$message = JText::_('COM_FINDER_INDEX_PURGE_FAILED', $model->getError());
			$this->setRedirect('index.php?option=com_finder&view=index', $message);

			return false;
		}
		else
		{
			$message = JText::_('COM_FINDER_INDEX_PURGE_SUCCESS');
			$this->setRedirect('index.php?option=com_finder&view=index', $message);

			return true;
		}
	}
}
components/com_finder/finder.php000060400000001064152453623450013024 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

if (!JFactory::getUser()->authorise('core.manage', 'com_finder'))
{
	throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
}

$controller = JControllerLegacy::getInstance('Finder');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
components/com_finder/access.xml000060400000001463152453623450013032 0ustar00<?xml version="1.0" encoding="utf-8" ?>
<access component="com_finder">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.options" title="JACTION_OPTIONS" description="JACTION_OPTIONS_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
	</section>
</access>
components/com_finder/models/indexer.php000060400000000567152453623450014505 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Indexer model class for Finder.
 *
 * @since  2.5
 */
class FinderModelIndexer extends JModelLegacy
{
}
components/com_finder/models/filters.php000060400000007364152453623450014521 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Filters model class for Finder.
 *
 * @since  2.5
 */
class FinderModelFilters extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An associative array of configuration settings. [optional]
	 *
	 * @since   2.5
	 * @see     JControllerLegacy
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'filter_id', 'a.filter_id',
				'title', 'a.title',
				'state', 'a.state',
				'created_by_alias', 'a.created_by_alias',
				'created', 'a.created',
				'map_count', 'a.map_count'
			);
		}

		parent::__construct($config);
	}

	/**
	 * Build an SQL query to load the list data.
	 *
	 * @return  JDatabaseQuery  A JDatabaseQuery object
	 *
	 * @since   2.5
	 */
	protected function getListQuery()
	{
		$db = $this->getDbo();
		$query = $db->getQuery(true);

		// Select all fields from the table.
		$query->select('a.*')
			->from($db->quoteName('#__finder_filters', 'a'));

		// 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 users for the author.
		$query->select($db->quoteName('ua.name', 'user_name'))
			->join('LEFT', $db->quoteName('#__users', 'ua') . ' ON ' . $db->quoteName('ua.id') . ' = ' . $db->quoteName('a.created_by'));

		// Check for a search filter.
		if ($search = $this->getState('filter.search'))
		{
			$search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%'));
			$query->where($db->quoteName('a.title') . ' LIKE ' . $search);
		}

		// If the model is set to check item state, add to the query.
		$state = $this->getState('filter.state');

		if (is_numeric($state))
		{
			$query->where($db->quoteName('a.state') . ' = ' . (int) $state);
		}

		// Add the list ordering clause.
		$query->order($db->escape($this->getState('list.ordering', 'a.title') . ' ' . $db->escape($this->getState('list.direction', 'ASC'))));

		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. [optional]
	 *
	 * @return  string  A store id.
	 *
	 * @since   2.5
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.state');

		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 = 'a.title', $direction = 'asc')
	{
		// Load the filter state.
		$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'));

		// Load the parameters.
		$params = JComponentHelper::getParams('com_finder');
		$this->setState('params', $params);

		// List state information.
		parent::populateState($ordering, $direction);
	}
}
components/com_finder/models/index.php000060400000026656152453623450014165 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Index model class for Finder.
 *
 * @since  2.5
 */
class FinderModelIndex extends JModelList
{
	/**
	 * The event to trigger after deleting the data.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $event_after_delete = 'onContentAfterDelete';

	/**
	 * The event to trigger before deleting the data.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $event_before_delete = 'onContentBeforeDelete';

	/**
	 * Constructor.
	 *
	 * @param   array  $config  An associative array of configuration settings. [optional]
	 *
	 * @since   2.5
	 * @see     JControllerLegacy
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'state', 'published', 'l.published',
				'title', 'l.title',
				'type', 'type_id', 'l.type_id',
				't.title', 't_title',
				'url', 'l.url',
				'indexdate', 'l.indexdate',
				'content_map',
			);
		}

		parent::__construct($config);
	}

	/**
	 * 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 for the component.
	 *
	 * @since   2.5
	 */
	protected function canDelete($record)
	{
		return JFactory::getUser()->authorise('core.delete', $this->option);
	}

	/**
	 * 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 for the component.
	 *
	 * @since   2.5
	 */
	protected function canEditState($record)
	{
		return JFactory::getUser()->authorise('core.edit.state', $this->option);
	}

	/**
	 * Method to delete one or more records.
	 *
	 * @param   array  $pks  An array of record primary keys.
	 *
	 * @return  boolean  True if successful, false if an error occurs.
	 *
	 * @since   2.5
	 */
	public function delete(&$pks)
	{
		$dispatcher = JEventDispatcher::getInstance();
		$pks = (array) $pks;
		$table = $this->getTable();

		// Include the content plugins for the on delete events.
		JPluginHelper::importPlugin('content');

		// Iterate the items to delete each one.
		foreach ($pks as $i => $pk)
		{
			if ($table->load($pk))
			{
				if ($this->canDelete($table))
				{
					$context = $this->option . '.' . $this->name;

					// Trigger the onContentBeforeDelete event.
					$result = $dispatcher->trigger($this->event_before_delete, array($context, $table));

					if (in_array(false, $result, true))
					{
						$this->setError($table->getError());

						return false;
					}

					if (!$table->delete($pk))
					{
						$this->setError($table->getError());

						return false;
					}

					// Trigger the onContentAfterDelete event.
					$dispatcher->trigger($this->event_after_delete, array($context, $table));
				}
				else
				{
					// Prune items that you can't change.
					unset($pks[$i]);
					$error = $this->getError();

					if ($error)
					{
						$this->setError($error);
					}
					else
					{
						$this->setError(JText::_('JLIB_APPLICATION_ERROR_DELETE_NOT_PERMITTED'));
					}
				}
			}
			else
			{
				$this->setError($table->getError());

				return false;
			}
		}

		// Clear the component's cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Build an SQL query to load the list data.
	 *
	 * @return  JDatabaseQuery  A JDatabaseQuery object
	 *
	 * @since   2.5
	 */
	protected function getListQuery()
	{
		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->select('l.*')
			->select($db->quoteName('t.title', 't_title'))
			->from($db->quoteName('#__finder_links', 'l'))
			->join('INNER', $db->quoteName('#__finder_types', 't') . ' ON ' . $db->quoteName('t.id') . ' = ' . $db->quoteName('l.type_id'));

		// Check the type filter.
		$type = $this->getState('filter.type');

		if (is_numeric($type))
		{
			$query->where($db->quoteName('l.type_id') . ' = ' . (int) $type);
		}

		// Check the map filter.
		$contentMapId = $this->getState('filter.content_map');

		if (is_numeric($contentMapId))
		{
			$query->join('INNER', $db->quoteName('#__finder_taxonomy_map', 'm') . ' ON ' . $db->quoteName('m.link_id') . ' = ' . $db->quoteName('l.link_id'))
				->where($db->quoteName('m.node_id') . ' = ' . (int) $contentMapId);
		}

		// Check for state filter.
		$state = $this->getState('filter.state');

		if (is_numeric($state))
		{
			$query->where($db->quoteName('l.published') . ' = ' . (int) $state);
		}

		// Check the search phrase.
		$search = $this->getState('filter.search');

		if (!empty($search))
		{
			$search      = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%'));
			$orSearchSql = $db->quoteName('l.title') . ' LIKE ' . $search . ' OR ' . $db->quoteName('l.url') . ' LIKE ' . $search;

			// Filter by indexdate only if $search doesn't contains non-ascii characters
			if (!preg_match('/[^\x00-\x7F]/', $search))
			{
				$orSearchSql .= ' OR ' . $query->castAsChar($db->quoteName('l.indexdate')) . ' LIKE ' . $search;
			}

			$query->where('(' . $orSearchSql . ')');
		}

		// Handle the list ordering.
		$listOrder = $this->getState('list.ordering', 'l.title');
		$listDir   = $this->getState('list.direction', 'ASC');

		if ($listOrder === 't.title')
		{
			$ordering = $db->quoteName('t.title') . ' ' . $db->escape($listDir) . ', ' . $db->quoteName('l.title') . ' ' . $db->escape($listDir);
		}
		else
		{
			$ordering = $db->escape($listOrder) . ' ' . $db->escape($listDir);
		}

		$query->order($ordering);

		return $query;
	}

	/**
	 * Method to get the state of the Smart Search Plugins.
	 *
	 * @return  array  Array of relevant plugins and whether they are enabled or not.
	 *
	 * @since   2.5
	 */
	public function getPluginState()
	{
		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->select('name, enabled')
			->from($db->quoteName('#__extensions'))
			->where($db->quoteName('type') . ' = ' . $db->quote('plugin'))
			->where($db->quoteName('folder') . ' IN (' . $db->quote('system') . ',' . $db->quote('content') . ')')
			->where($db->quoteName('element') . ' = ' . $db->quote('finder'));
		$db->setQuery($query);

		return $db->loadObjectList('name');
	}

	/**
	 * 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. [optional]
	 *
	 * @return  string  A store id.
	 *
	 * @since   2.5
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.state');
		$id .= ':' . $this->getState('filter.type');
		$id .= ':' . $this->getState('filter.content_map');

		return parent::getStoreId($id);
	}

	/**
	 * Gets the total of indexed items.
	 *
	 * @return  integer  The total of indexed items.
	 *
	 * @since   3.6.0
	 */
	public function getTotalIndexed()
	{
		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->select('COUNT(link_id)')
			->from($db->quoteName('#__finder_links'));
		$db->setQuery($query);

		$db->execute();

		return (int) $db->loadResult();
	}

	/**
	 * 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   2.5
	 */
	public function getTable($type = 'Link', $prefix = 'FinderTable', $config = array())
	{
		return JTable::getInstance($type, $prefix, $config);
	}

	/**
	 * Method to purge the index, deleting all links.
	 *
	 * @return  boolean  True on success, false on failure.
	 *
	 * @since   2.5
	 * @throws  Exception on database error
	 */
	public function purge()
	{
		$db = $this->getDbo();

		// Truncate the links table.
		$db->truncateTable('#__finder_links');

		// Truncate the links terms tables.
		for ($i = 0; $i <= 15; $i++)
		{
			// Get the mapping table suffix.
			$suffix = dechex($i);

			$db->truncateTable('#__finder_links_terms' . $suffix);
		}

		// Truncate the terms table.
		$db->truncateTable('#__finder_terms');

		// Truncate the taxonomy map table.
		$db->truncateTable('#__finder_taxonomy_map');

		// Delete all the taxonomy nodes except the root.
		$query = $db->getQuery(true)
			->delete($db->quoteName('#__finder_taxonomy'))
			->where($db->quoteName('id') . ' > 1');
		$db->setQuery($query);
		$db->execute();

		// Truncate the tokens tables.
		$db->truncateTable('#__finder_tokens');

		// Truncate the tokens aggregate table.
		$db->truncateTable('#__finder_tokens_aggregate');

		return true;
	}

	/**
	 * 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 = 'l.title', $direction = 'asc')
	{
		// Load the filter state.
		$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.type', $this->getUserStateFromRequest($this->context . '.filter.type', 'filter_type', '', 'cmd'));
		$this->setState('filter.content_map', $this->getUserStateFromRequest($this->context . '.filter.content_map', 'filter_content_map', '', 'cmd'));

		// Load the parameters.
		$params = JComponentHelper::getParams('com_finder');
		$this->setState('params', $params);

		// List state information.
		parent::populateState($ordering, $direction);
	}

	/**
	 * 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. [optional]
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 */
	public function publish(&$pks, $value = 1)
	{
		$dispatcher = JEventDispatcher::getInstance();
		$user = JFactory::getUser();
		$table = $this->getTable();
		$pks = (array) $pks;

		// Include the content plugins for the change of state event.
		JPluginHelper::importPlugin('content');

		// Access checks.
		foreach ($pks as $i => $pk)
		{
			$table->reset();

			if ($table->load($pk) && !$this->canEditState($table))
			{
				// Prune items that you can't change.
				unset($pks[$i]);
				$this->setError(JText::_('JLIB_APPLICATION_ERROR_EDITSTATE_NOT_PERMITTED'));

				return false;
			}
		}

		// Attempt to change the state of the records.
		if (!$table->publish($pks, $value, $user->get('id')))
		{
			$this->setError($table->getError());

			return false;
		}

		$context = $this->option . '.' . $this->name;

		// Trigger the onContentChangeState event.
		$result = $dispatcher->trigger('onContentChangeState', array($context, $pks, $value));

		if (in_array(false, $result, true))
		{
			$this->setError($table->getError());

			return false;
		}

		// Clear the component's cache
		$this->cleanCache();

		return true;
	}
}
components/com_finder/models/filter.php000060400000007160152453623450014330 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Filter model class for Finder.
 *
 * @since  2.5
 */
class FinderModelFilter extends JModelAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $text_prefix = 'COM_FINDER';

	/**
	 * Model context string.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $context = 'com_finder.filter';

	/**
	 * Custom clean cache method.
	 *
	 * @param   string   $group     The component name. [optional]
	 * @param   integer  $clientId  The client ID. [optional]
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	protected function cleanCache($group = 'com_finder', $clientId = 1)
	{
		parent::cleanCache($group, $clientId);
	}

	/**
	 * Method to get the filter data.
	 *
	 * @return  FinderTableFilter|boolean  The filter data or false on a failure.
	 *
	 * @since   2.5
	 */
	public function getFilter()
	{
		$filter_id = (int) $this->getState('filter.id');

		// Get a FinderTableFilter instance.
		$filter = $this->getTable();

		// Attempt to load the row.
		$return = $filter->load($filter_id);

		// Check for a database error.
		if ($return === false && $filter->getError())
		{
			$this->setError($filter->getError());

			return false;
		}

		// Process the filter data.
		if (!empty($filter->data))
		{
			$filter->data = explode(',', $filter->data);
		}
		elseif (empty($filter->data))
		{
			$filter->data = array();
		}

		// Check for a database error.
		if ($this->_db->getErrorNum())
		{
			$this->setError($this->_db->getErrorMsg());

			return false;
		}

		return $filter;
	}

	/**
	 * 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   2.5
	 */
	public function getForm($data = array(), $loadData = true)
	{
		// Get the form.
		$form = $this->loadForm('com_finder.filter', 'filter', array('control' => 'jform', 'load_data' => $loadData));

		if (empty($form))
		{
			return false;
		}

		return $form;
	}

	/**
	 * 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   2.5
	 */
	public function getTable($type = 'Filter', $prefix = 'FinderTable', $config = array())
	{
		return JTable::getInstance($type, $prefix, $config);
	}

	/**
	 * Method to get the data that should be injected in the form.
	 *
	 * @return  mixed  The data for the form.
	 *
	 * @since   2.5
	 */
	protected function loadFormData()
	{
		// Check the session for previously entered form data.
		$data = JFactory::getApplication()->getUserState('com_finder.edit.filter.data', array());

		if (empty($data))
		{
			$data = $this->getItem();
		}

		$this->preprocessData('com_finder.filter', $data);

		return $data;
	}

	/**
	 * Method to get the total indexed items
	 *
	 * @return  number the number of indexed items
	 *
	 * @since  3.5
	 */
	public function getTotal()
	{
		$db    = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('MAX(link_id)')
			->from('#__finder_links');

		return $db->setQuery($query)->loadResult();
	}
}
components/com_finder/models/statistics.php000060400000004111152453623450015226 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Statistics model class for Finder.
 *
 * @since  2.5
 */
class FinderModelStatistics extends JModelLegacy
{
	/**
	 * Method to get the component statistics
	 *
	 * @return  JObject  The component statistics
	 *
	 * @since   2.5
	 */
	public function getData()
	{
		// Initialise
		$db = $this->getDbo();
		$query = $db->getQuery(true);
		$data = new JObject;

		$query->select('COUNT(term_id)')
			->from($db->quoteName('#__finder_terms'));
		$db->setQuery($query);
		$data->term_count = $db->loadResult();

		$query->clear()
			->select('COUNT(link_id)')
			->from($db->quoteName('#__finder_links'));
		$db->setQuery($query);
		$data->link_count = $db->loadResult();

		$query->clear()
			->select('COUNT(id)')
			->from($db->quoteName('#__finder_taxonomy'))
			->where($db->quoteName('parent_id') . ' = 1');
		$db->setQuery($query);
		$data->taxonomy_branch_count = $db->loadResult();

		$query->clear()
			->select('COUNT(id)')
			->from($db->quoteName('#__finder_taxonomy'))
			->where($db->quoteName('parent_id') . ' > 1');
		$db->setQuery($query);
		$data->taxonomy_node_count = $db->loadResult();

		$query->clear()
			->select('t.title AS type_title, COUNT(a.link_id) AS link_count')
			->from($db->quoteName('#__finder_links') . ' AS a')
			->join('INNER', $db->quoteName('#__finder_types') . ' AS t ON t.id = a.type_id')
			->group('a.type_id, t.title')
			->order($db->quoteName('type_title') . ' ASC');
		$db->setQuery($query);
		$data->type_list = $db->loadObjectList();

		$lang  = JFactory::getLanguage();
		$plugins = JPluginHelper::getPlugin('finder');

		foreach ($plugins as $plugin)
		{
			$lang->load('plg_finder_' . $plugin->name . '.sys', JPATH_ADMINISTRATOR, null, false, true)
			|| $lang->load('plg_finder_' . $plugin->name . '.sys', JPATH_PLUGINS . '/finder/' . $plugin->name, null, false, true);
		}

		return $data;
	}
}
components/com_finder/models/fields/searchfilter.php000060400000002173152453623450016763 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('JPATH_BASE') or die();

JFormHelper::loadFieldClass('list');

/**
 * Search Filter field for the Finder package.
 *
 * @since  2.5
 */
class JFormFieldSearchFilter extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $type = 'SearchFilter';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   2.5
	 */
	public function getOptions()
	{
		// Build the query.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('f.title AS text, f.filter_id AS value')
			->from($db->quoteName('#__finder_filters') . ' AS f')
			->where('f.state = 1')
			->order('f.title ASC');
		$db->setQuery($query);
		$options = $db->loadObjectList();

		array_unshift($options, JHtml::_('select.option', '', JText::_('COM_FINDER_SELECT_SEARCH_FILTER'), 'value', 'text'));

		return $options;
	}
}
components/com_finder/models/fields/contentmap.php000060400000006155152453623450016464 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('JPATH_PLATFORM') or die;

JFormHelper::loadFieldClass('groupedlist');

JLoader::register('FinderHelperLanguage', JPATH_ADMINISTRATOR . '/components/com_finder/helpers/language.php');

/**
 * Supports a select grouped list of finder content map.
 *
 * @since  3.6.0
 */
class JFormFieldContentMap extends JFormFieldGroupedList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.6.0
	 */
	public $type = 'ContentMap';

	/**
	 * Method to get the list of content map options grouped by first level.
	 *
	 * @return  array  The field option objects as a nested array in groups.
	 *
	 * @since   3.6.0
	 */
	protected function getGroups()
	{
		$groups = array();

		// Get the database object and a new query object.
		$db = JFactory::getDbo();

		// Levels subquery.
		$levelQuery = $db->getQuery(true);
		$levelQuery->select('title AS branch_title, 1 as level')
			->select($db->quoteName('id'))
			->from($db->quoteName('#__finder_taxonomy'))
			->where($db->quoteName('parent_id') . ' = 1');
		$levelQuery2 = $db->getQuery(true);
		$levelQuery2->select('b.title AS branch_title, 2 as level')
			->select($db->quoteName('a.id'))
			->from($db->quoteName('#__finder_taxonomy', 'a'))
			->join('LEFT', $db->quoteName('#__finder_taxonomy', 'b') . ' ON ' . $db->qn('a.parent_id') . ' = ' . $db->qn('b.id'))
			->where($db->quoteName('a.parent_id') . ' NOT IN (0, 1)');

		$levelQuery->union($levelQuery2);

		// Main query.
		$query = $db->getQuery(true)
			->select($db->quoteName('a.title', 'text'))
			->select($db->quoteName('a.id', 'value'))
			->select($db->quoteName('d.level'))
			->from($db->quoteName('#__finder_taxonomy', 'a'))
			->join('LEFT', '(' . $levelQuery . ') AS d ON ' . $db->qn('d.id') . ' = ' . $db->qn('a.id'))
			->where($db->quoteName('a.parent_id') . ' <> 0')
			->order('d.branch_title ASC, d.level ASC, a.title ASC');

		$db->setQuery($query);

		try
		{
			$contentMap = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			return;
		}

		// Build the grouped list array.
		if ($contentMap)
		{
			$lang = JFactory::getLanguage();

			foreach ($contentMap as $branch)
			{
				if ((int) $branch->level === 1)
				{
					$name = $branch->text;
				}
				else
				{
					$levelPrefix = str_repeat('- ', max(0, $branch->level - 1));

					if (trim($name, '**') === 'Language')
					{
						$text = FinderHelperLanguage::branchLanguageTitle($branch->text);
					}
					else
					{
						$key = FinderHelperLanguage::branchSingular($branch->text);
						$text = $lang->hasKey($key) ? JText::_($key) : $branch->text;
					}

					// Initialize the group if necessary.
					if (!isset($groups[$name]))
					{
						$groups[$name] = array();
					}

					$groups[$name][] = JHtml::_('select.option', $branch->value, $levelPrefix . $text);
				}
			}
		}

		// Merge any additional groups in the XML definition.
		$groups = array_merge(parent::getGroups(), $groups);

		return $groups;
	}
}
components/com_finder/models/fields/contenttypes.php000060400000003662152453623450017053 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('JPATH_BASE') or die();

use Joomla\Utilities\ArrayHelper;

JLoader::register('FinderHelperLanguage', JPATH_ADMINISTRATOR . '/components/com_finder/helpers/language.php');

JFormHelper::loadFieldClass('list');

/**
 * Content Types Filter field for the Finder package.
 *
 * @since  3.6.0
 */
class JFormFieldContentTypes extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.6.0
	 */
	protected $type = 'ContentTypes';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   3.6.0
	 */
	public function getOptions()
	{
		$lang    = JFactory::getLanguage();
		$options = array();

		$db    = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('id', 'value'))
			->select($db->quoteName('title', 'text'))
			->from($db->quoteName('#__finder_types'));

		// Get the options.
		$db->setQuery($query);

		try
		{
			$contentTypes = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $db->getMessage());
		}

		// Translate.
		foreach ($contentTypes as $contentType)
		{
			$key = FinderHelperLanguage::branchSingular($contentType->text);
			$contentType->translatedText = $lang->hasKey($key) ? JText::_($key) : $contentType->text;
		}

		// Order by title.
		$contentTypes = ArrayHelper::sortObjects($contentTypes, 'translatedText', 1, true, true);

		// Convert the values to options.
		foreach ($contentTypes as $contentType)
		{
			$options[] = JHtml::_('select.option', $contentType->value, $contentType->translatedText);
		}

		// Merge any additional options in the XML definition.
		$options = array_merge(parent::getOptions(), $options);

		return $options;
	}
}
components/com_finder/models/fields/directories.php000060400000004215152453623450016623 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Load the base adapter.
JLoader::register('FinderIndexerAdapter', JPATH_ADMINISTRATOR . '/components/com_finder/helpers/indexer/adapter.php');

JFormHelper::loadFieldClass('list');

/**
 * Renders a list of directories.
 *
 * @since       2.5
 * @deprecated  4.0  Use JFormFieldFolderlist
 */
class JFormFieldDirectories extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $type = 'Directories';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   2.5
	 */
	public function getOptions()
	{
		$values  = array();
		$options = array();
		$exclude = array(
			JPATH_ADMINISTRATOR,
			JPATH_INSTALLATION,
			JPATH_LIBRARIES,
			JPATH_PLUGINS,
			JPATH_SITE . '/cache',
			JPATH_SITE . '/components',
			JPATH_SITE . '/includes',
			JPATH_SITE . '/language',
			JPATH_SITE . '/modules',
			JPATH_THEMES,
			JFactory::getApplication()->get('log_path'),
			JFactory::getApplication()->get('tmp_path')
		);

		// Get the base directories.
		jimport('joomla.filesystem.folder');
		$dirs = JFolder::folders(JPATH_SITE, '.', false, true);

		// Iterate through the base directories and find the subdirectories.
		foreach ($dirs as $dir)
		{
			// Check if the directory should be excluded.
			if (in_array($dir, $exclude))
			{
				continue;
			}

			// Get the child directories.
			$return = JFolder::folders($dir, '.', true, true);

			// Merge the directories.
			if (is_array($return))
			{
				$values[] = $dir;
				$values = array_merge($values, $return);
			}
		}

		// Convert the values to options.
		foreach ($values as $value)
		{
			$options[] = JHtml::_('select.option', str_replace(JPATH_SITE . '/', '', $value), str_replace(JPATH_SITE . '/', '', $values));
		}

		// Add a null option.
		array_unshift($options, JHtml::_('select.option', '', '- ' . JText::_('JNONE') . ' -'));

		return $options;
	}
}
components/com_finder/models/fields/branches.php000060400000001335152453623450016074 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('JPATH_BASE') or die();

JFormHelper::loadFieldClass('list');

/**
 * Search Branches field for the Finder package.
 *
 * @since  3.5
 */
class JFormFieldBranches extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.5
	 */
	protected $type = 'Branches';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   3.5
	 */
	public function getOptions()
	{
		return JHtml::_('finder.mapslist');
	}
}
components/com_finder/models/maps.php000060400000024777152453623450014020 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die();

/**
 * Maps model for the Finder package.
 *
 * @since  2.5
 */
class FinderModelMaps extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An associative array of configuration settings. [optional]
	 *
	 * @since   2.5
	 * @see     JControllerLegacy
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'state', 'a.state',
				'title', 'a.title',
				'branch',
				'branch_title', 'd.branch_title',
				'level', 'd.level',
			);
		}

		parent::__construct($config);
	}

	/**
	 * 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 for the component.
	 *
	 * @since   2.5
	 */
	protected function canDelete($record)
	{
		return JFactory::getUser()->authorise('core.delete', $this->option);
	}

	/**
	 * 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 for the component.
	 *
	 * @since   2.5
	 */
	protected function canEditState($record)
	{
		return JFactory::getUser()->authorise('core.edit.state', $this->option);
	}

	/**
	 * Method to delete one or more records.
	 *
	 * @param   array  $pks  An array of record primary keys.
	 *
	 * @return  boolean  True if successful, false if an error occurs.
	 *
	 * @since   2.5
	 */
	public function delete(&$pks)
	{
		$dispatcher = JEventDispatcher::getInstance();
		$pks = (array) $pks;
		$table = $this->getTable();

		// Include the content plugins for the on delete events.
		JPluginHelper::importPlugin('content');

		// Iterate the items to delete each one.
		foreach ($pks as $i => $pk)
		{
			if ($table->load($pk))
			{
				if ($this->canDelete($table))
				{
					$context = $this->option . '.' . $this->name;

					// Trigger the onContentBeforeDelete event.
					$result = $dispatcher->trigger('onContentBeforeDelete', array($context, $table));

					if (in_array(false, $result, true))
					{
						$this->setError($table->getError());

						return false;
					}

					if (!$table->delete($pk))
					{
						$this->setError($table->getError());

						return false;
					}

					// Trigger the onContentAfterDelete event.
					$dispatcher->trigger('onContentAfterDelete', array($context, $table));
				}
				else
				{
					// Prune items that you can't change.
					unset($pks[$i]);
					$error = $this->getError();

					if ($error)
					{
						$this->setError($error);
					}
					else
					{
						$this->setError(JText::_('JLIB_APPLICATION_ERROR_DELETE_NOT_PERMITTED'));
					}
				}
			}
			else
			{
				$this->setError($table->getError());

				return false;
			}
		}

		// Clear the component's cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Build an SQL query to load the list data.
	 *
	 * @return  JDatabaseQuery  A JDatabaseQuery object
	 *
	 * @since   2.5
	 */
	protected function getListQuery()
	{
		$db = $this->getDbo();

		// Select all fields from the table.
		$query = $db->getQuery(true)
			->select('a.id, a.parent_id, a.title, a.state, a.access, a.ordering')
			->select('CASE WHEN a.parent_id = 1 THEN 1 ELSE 2 END AS level')
			->select('p.title AS parent_title')
			->from($db->quoteName('#__finder_taxonomy', 'a'))
			->leftJoin($db->quoteName('#__finder_taxonomy', 'p') . ' ON p.id = a.parent_id')
			->where('a.parent_id != 0');

		$childQuery = $db->getQuery(true)
			->select('parent_id')
			->select('COUNT(*) AS num_children')
			->from($db->quoteName('#__finder_taxonomy'))
			->where('parent_id != 0')
			->group('parent_id');

		// Join to get children.
		$query->select('b.num_children');
		$query->select('CASE WHEN a.parent_id = 1 THEN a.title ELSE p.title END AS branch_title');
		$query->leftJoin('(' . $childQuery . ') AS b ON b.parent_id = a.id');

		// Join to get the map links.
		$stateQuery = $db->getQuery(true)
			->select('m.node_id')
			->select('COUNT(NULLIF(l.published, 0)) AS count_published')
			->select('COUNT(NULLIF(l.published, 1)) AS count_unpublished')
			->from($db->quoteName('#__finder_taxonomy_map', 'm'))
			->leftJoin($db->quoteName('#__finder_links', 'l') . ' ON l.link_id = m.link_id')
			->group('m.node_id');

		$query->select('COALESCE(s.count_published, 0) AS count_published');
		$query->select('COALESCE(s.count_unpublished, 0) AS count_unpublished');
		$query->leftJoin('(' . $stateQuery . ') AS s ON s.node_id = a.id');

		// If the model is set to check item state, add to the query.
		$state = $this->getState('filter.state');

		if (is_numeric($state))
		{
			$query->where('a.state = ' . (int) $state);
		}

		// Filter over level.
		$level = $this->getState('filter.level');

		if (is_numeric($level) && (int) $level === 1)
		{
			$query->where('a.parent_id = 1');
		}

		// Filter the maps over the branch if set.
		$branchId = $this->getState('filter.branch');

		if (is_numeric($branchId))
		{
			$query->where('a.parent_id = ' . (int) $branchId);
		}

		// Filter the maps over the search string if set.
		if ($search = $this->getState('filter.search'))
		{
			$search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%'));
			$query->where('a.title LIKE ' . $search);
		}

		// Handle the list ordering.
		$listOrdering = $this->getState('list.ordering', 'd.branch_title');
		$listDirn     = $this->getState('list.direction', 'ASC');

		if ($listOrdering === 'd.branch_title')
		{
			$query->order("branch_title $listDirn, level ASC, a.title $listDirn");
		}
		elseif ($listOrdering === 'a.state')
		{
			$query->order("a.state $listDirn, branch_title $listDirn, level ASC");
		}

		return $query;
	}

	/**
	 * Returns a record count for the query.
	 *
	 * @param   JDatabaseQuery|string  $query  The query.
	 *
	 * @return  integer  Number of rows for query.
	 *
	 * @since   3.0
	 */
	protected function _getListCount($query)
	{
		$query = clone $query;
		$query->clear('select')->clear('join')->clear('order')->clear('limit')->clear('offset')->select('COUNT(*)');

		return (int) $this->getDbo()->setQuery($query)->loadResult();
	}

	/**
	 * 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. [optional]
	 *
	 * @return  string  A store id.
	 *
	 * @since   2.5
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.state');
		$id .= ':' . $this->getState('filter.branch');
		$id .= ':' . $this->getState('filter.level');

		return parent::getStoreId($id);
	}

	/**
	 * 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   2.5
	 */
	public function getTable($type = 'Map', $prefix = 'FinderTable', $config = array())
	{
		return JTable::getInstance($type, $prefix, $config);
	}

	/**
	 * 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 = 'd.branch_title', $direction = 'ASC')
	{
		// Load the filter state.
		$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.branch', $this->getUserStateFromRequest($this->context . '.filter.branch', 'filter_branch', '', 'cmd'));
		$this->setState('filter.level', $this->getUserStateFromRequest($this->context . '.filter.level', 'filter_level', '', 'cmd'));

		// Load the parameters.
		$params = JComponentHelper::getParams('com_finder');
		$this->setState('params', $params);

		// List state information.
		parent::populateState($ordering, $direction);
	}

	/**
	 * 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. [optional]
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 */
	public function publish(&$pks, $value = 1)
	{
		$dispatcher = JEventDispatcher::getInstance();
		$user = JFactory::getUser();
		$table = $this->getTable();
		$pks = (array) $pks;

		// Include the content plugins for the change of state event.
		JPluginHelper::importPlugin('content');

		// Access checks.
		foreach ($pks as $i => $pk)
		{
			$table->reset();

			if ($table->load($pk) && !$this->canEditState($table))
			{
				// Prune items that you can't change.
				unset($pks[$i]);
				$this->setError(JText::_('JLIB_APPLICATION_ERROR_EDITSTATE_NOT_PERMITTED'));

				return false;
			}
		}

		// Attempt to change the state of the records.
		if (!$table->publish($pks, $value, $user->get('id')))
		{
			$this->setError($table->getError());

			return false;
		}

		$context = $this->option . '.' . $this->name;

		// Trigger the onContentChangeState event.
		$result = $dispatcher->trigger('onContentChangeState', array($context, $pks, $value));

		if (in_array(false, $result, true))
		{
			$this->setError($table->getError());

			return false;
		}

		// Clear the component's cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Method to purge all maps from the taxonomy.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   2.5
	 */
	public function purge()
	{
		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->delete($db->quoteName('#__finder_taxonomy'))
			->where($db->quoteName('parent_id') . ' > 1');
		$db->setQuery($query);
		$db->execute();

		$query->clear()
			->delete($db->quoteName('#__finder_taxonomy_map'));
		$db->setQuery($query);
		$db->execute();

		return true;
	}
}
components/com_finder/models/forms/filter.xml000060400000007152152453623450015470 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<field 
			name="filter_id"  
			type="text" 
			label="JGLOBAL_FIELD_ID_LABEL"
			description="JGLOBAL_FIELD_ID_DESC" 
			class="readonly" 
			size="10" 
			default="0"
			readonly="true"  
		/>

		<field 
			name="title" 
			type="text" 
			label="JGLOBAL_TITLE"
			description="COM_FINDER_FILTER_TITLE_DESCRIPTION"
			class="input-xxlarge input-large-text"
			size="40"
			id="title"
			required="true" 
		/>

		<field 
			name="alias" 
			type="text" 
			label="JFIELD_ALIAS_LABEL"
			description="JFIELD_ALIAS_DESC"
			hint="JFIELD_ALIAS_PLACEHOLDER" 
			size="45" 
		/>

		<field
			name="created"
			type="calendar"
			label="JGLOBAL_FIELD_CREATED_LABEL"
			description="JGLOBAL_FIELD_CREATED_DESC"
			translateformat="true"
			showtime="true"
			size="22"
			filter="user_utc"
		/>

		<field
			name="modified"
			type="calendar"
			label="JGLOBAL_FIELD_MODIFIED_LABEL"
			description="COM_FINDER_FIELD_MODIFIED_DESCRIPTION"
			class="readonly"
			translateformat="true"
			showtime="true"
			size="22"
			readonly="true"
			filter="user_utc"
		/>

		<field 
			name="created_by" 
			type="user"
			label="COM_FINDER_FIELD_CREATED_BY_LABEL" 
			description="COM_FINDER_FIELD_CREATED_BY_DESC" 
		/>

		<field 
			name="created_by_alias" 
			type="text"
			label="COM_FINDER_FIELD_CREATED_BY_ALIAS_LABEL" 
			description="COM_FINDER_FIELD_CREATED_BY_ALIAS_DESC"
			size="20" 
		/>
		
		<field 
			name="modified_by" 
			type="user"
			label="JGLOBAL_FIELD_MODIFIED_BY_LABEL"
			class="readonly"
			readonly="true"
			filter="unset"
		 />

		<field 
			name="checked_out" 
			type="hidden" 
			filter="unset" 
		/>

		<field 
			name="checked_out_time" 
			type="hidden" 
			filter="unset" 
		/>

		<field 
			name="state" 
			type="list" 
			label="JSTATUS"
			description="JFIELD_PUBLISHED_DESC"
			class="chzn-color-state"
			filter="intval"
			size="1"
			default="1" 
			>
			<option value="1">JPUBLISHED</option>
			<option value="0">JUNPUBLISHED</option>
		</field>

		<field
			name="map_count" 
			type="text" 
			label="COM_FINDER_FILTER_MAP_COUNT" 
			description="COM_FINDER_FILTER_MAP_COUNT_DESCRIPTION"
			class="readonly"
			size="10" 
			default="0" 
			readonly="true" 
		/>
	</fieldset>

	<fields name="params">
		<fieldset name="jbasic" label="COM_FINDER_FILTER_FIELDSET_PARAMS">
			<field
				name="w1"
				type="list"
				label="COM_FINDER_FILTER_WHEN_START_DATE_LABEL"
				description="COM_FINDER_FILTER_WHEN_START_DATE_DESCRIPTION"
				default=""
				filter="string"
				>
				<option value="">JNONE</option>
				<option value="-1">COM_FINDER_FILTER_WHEN_BEFORE</option>
				<option value="0">COM_FINDER_FILTER_WHEN_EXACTLY</option>
				<option value="1">COM_FINDER_FILTER_WHEN_AFTER</option>
			</field>

			<field 
				name="d1"
				type="calendar"
				label="COM_FINDER_FILTER_START_DATE_LABEL"
				description="COM_FINDER_FILTER_START_DATE_DESCRIPTION"
				translateformat="true"
				size="22"
				filter="user_utc"
			/>

			<field
				name="w2"
				type="list"
				label="COM_FINDER_FILTER_WHEN_END_DATE_LABEL"
				description="COM_FINDER_FILTER_WHEN_END_DATE_DESCRIPTION"
				default=""
				filter="string"
				>
				<option value="">JNONE</option>
				<option value="-1">COM_FINDER_FILTER_WHEN_BEFORE</option>
				<option value="0">COM_FINDER_FILTER_WHEN_EXACTLY</option>
				<option value="1">COM_FINDER_FILTER_WHEN_AFTER</option>
			</field>

			<field
				name="d2"
				type="calendar"
				label="COM_FINDER_FILTER_END_DATE_LABEL"
				description="COM_FINDER_FILTER_END_DATE_DESCRIPTION"
				translateformat="true"
				size="22"
				filter="user_utc"
			/>
		</fieldset>

	</fields>
</form>
components/com_finder/models/forms/filter_maps.xml000060400000002737152453623450016514 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_FINDER_SEARCH_SEARCH_QUERY_LABEL"
			description="COM_FINDER_SEARCH_SEARCH_QUERY_DESC"
			hint="JSEARCH_FILTER"
		/>

		<field
			name="state"
			type="status"
			label="COM_FINDER_FILTER_PUBLISHED"
			description="COM_FINDER_FILTER_PUBLISHED_DESC"
			filter="0,1"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>

		<field
			name="branch"
			type="branches"
			default="0"
			onchange="this.form.submit();"
		/>

		<field
			name="level"
			type="integer"
			label="JOPTION_FILTER_LEVEL"
			description="JOPTION_FILTER_LEVEL_DESC"
			first="1"
			last="2"
			step="1"
			languages="*"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_MAX_LEVELS</option>
		</field>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			onchange="this.form.submit();"
			default="d.branch_title ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="d.branch_title ASC">JGLOBAL_TITLE_ASC</option>
			<option value="d.branch_title DESC">JGLOBAL_TITLE_DESC</option>
			<option value="a.state ASC">JSTATUS_ASC</option>
			<option value="a.state DESC">JSTATUS_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_finder/models/forms/filter_index.xml000060400000004050152453623450016651 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_FINDER_INDEX_SEARCH_LABEL"
			description="COM_FINDER_INDEX_SEARCH_DESC"
			hint="JSEARCH_FILTER"
		/>

		<field
			name="state"
			type="status"
			label="COM_FINDER_FILTER_PUBLISHED"
			description="COM_FINDER_FILTER_PUBLISHED_DESC"
			filter="0,1"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>

		<field
			name="type"
			type="ContentTypes"
			label="JOPTION_FILTER_CATEGORY"
			description="JOPTION_FILTER_CATEGORY_DESC"
			onchange="this.form.submit();"
			>
			<option value="">COM_FINDER_MAPS_SELECT_TYPE</option>
		</field>

		<field
			name="content_map"
			type="ContentMap"
			label="COM_FINDER_FILTER_CONTENT_MAP_LABEL"
			description="COM_FINDER_FILTER_CONTENT_MAP_DESC"
			onchange="this.form.submit();"
			>
			<option value="">COM_FINDER_FILTER_SELECT_CONTENT_MAP</option>
		</field>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			onchange="this.form.submit();"
			default="l.title ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="l.published ASC">JSTATUS_ASC</option>
			<option value="l.published DESC">JSTATUS_DESC</option>
			<option value="l.title ASC">JGLOBAL_TITLE_ASC</option>
			<option value="l.title DESC">JGLOBAL_TITLE_DESC</option>
			<option value="t.title ASC">COM_FINDER_INDEX_HEADING_INDEX_TYPE_ASC</option>
			<option value="t.title DESC">COM_FINDER_INDEX_HEADING_INDEX_TYPE_DESC</option>
			<option value="l.indexdate ASC">COM_FINDER_INDEX_HEADING_INDEX_DATE_ASC</option>
			<option value="l.indexdate DESC">COM_FINDER_INDEX_HEADING_INDEX_DATE_DESC</option>
			<option value="l.url ASC">COM_FINDER_INDEX_HEADING_LINK_URL_ASC</option>
			<option value="l.url DESC">COM_FINDER_INDEX_HEADING_LINK_URL_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_finder/models/forms/filter_filters.xml000060400000003270152453623450017215 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_FINDER_SEARCH_FILTER_SEARCH_LABEL"
			description="COM_FINDER_SEARCH_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
		/>

		<field
			name="state"
			type="status"
			label="COM_FINDER_FILTER_PUBLISHED"
			description="COM_FINDER_FILTER_PUBLISHED_DESC"
			filter="0,1"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			onchange="this.form.submit();"
			default="a.title ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.state ASC">JSTATUS_ASC</option>
			<option value="a.state DESC">JSTATUS_DESC</option>
			<option value="a.title ASC">JGLOBAL_TITLE_ASC</option>
			<option value="a.title DESC">JGLOBAL_TITLE_DESC</option>
			<option value="a.created_by_alias ASC">COM_FINDER_HEADING_CREATED_BY_ASC</option>
			<option value="a.created_by_alias DESC">COM_FINDER_HEADING_CREATED_BY_DESC</option>
			<option value="a.created ASC">COM_FINDER_HEADING_CREATED_ON_ASC</option>
			<option value="a.created DESC">COM_FINDER_HEADING_CREATED_ON_DESC</option>
			<option value="a.map_count ASC">COM_FINDER_HEADING_MAP_COUNT_ASC</option>
			<option value="a.map_count DESC">COM_FINDER_HEADING_MAP_COUNT_DESC</option>
			<option value="a.filter_id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.filter_id DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_finder/helpers/html/finder.php000060400000006225152453623450015436 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('FinderHelperLanguage', JPATH_ADMINISTRATOR . '/components/com_finder/helpers/language.php');

use Joomla\Utilities\ArrayHelper;

/**
 * HTML behavior class for Finder.
 *
 * @since  2.5
 */
abstract class JHtmlFinder
{
	/**
	 * Creates a list of types to filter on.
	 *
	 * @return  array  An array containing the types that can be selected.
	 *
	 * @since   2.5
	 */
	public static function typeslist()
	{
		// Load the finder types.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('DISTINCT t.title AS text, t.id AS value')
			->from($db->quoteName('#__finder_types') . ' AS t')
			->join('LEFT', $db->quoteName('#__finder_links') . ' AS l ON l.type_id = t.id')
			->order('t.title ASC');
		$db->setQuery($query);

		try
		{
			$rows = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			return array();
		}

		// Compile the options.
		$options = array();

		$lang = JFactory::getLanguage();

		foreach ($rows as $row)
		{
			$key       = $lang->hasKey(FinderHelperLanguage::branchPlural($row->text)) ? FinderHelperLanguage::branchPlural($row->text) : $row->text;
			$options[] = JHtml::_('select.option', $row->value, JText::sprintf('COM_FINDER_ITEM_X_ONLY', JText::_($key)));
		}

		return $options;
	}

	/**
	 * Creates a list of maps.
	 *
	 * @return  array  An array containing the maps that can be selected.
	 *
	 * @since   2.5
	 */
	public static function mapslist()
	{
		// Load the finder types.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('title', 'text'))
			->select($db->quoteName('id', 'value'))
			->from($db->quoteName('#__finder_taxonomy'))
			->where($db->quoteName('parent_id') . ' = 1');
		$db->setQuery($query);

		try
		{
			$branches = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $db->getMessage());
		}

		// Translate.
		$lang = JFactory::getLanguage();

		foreach ($branches as $branch)
		{
			$key = FinderHelperLanguage::branchPlural($branch->text);
			$branch->translatedText = $lang->hasKey($key) ? JText::_($key) : $branch->text;
		}

		// Order by title.
		$branches = ArrayHelper::sortObjects($branches, 'translatedText', 1, true, true);

		// Compile the options.
		$options = array();
		$options[] = JHtml::_('select.option', '', JText::_('COM_FINDER_MAPS_SELECT_BRANCH'));

		// Convert the values to options.
		foreach ($branches as $branch)
		{
			$options[] = JHtml::_('select.option', $branch->value, $branch->translatedText);
		}

		return $options;
	}

	/**
	 * Creates a list of published states.
	 *
	 * @return  array  An array containing the states that can be selected.
	 *
	 * @since   2.5
	 */
	public static function statelist()
	{
		return array(
			JHtml::_('select.option', '1', JText::sprintf('COM_FINDER_ITEM_X_ONLY', JText::_('JPUBLISHED'))),
			JHtml::_('select.option', '0', JText::sprintf('COM_FINDER_ITEM_X_ONLY', JText::_('JUNPUBLISHED')))
		);
	}
}
components/com_finder/helpers/indexer/indexer.php000060400000034654152453623450016326 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\String\StringHelper;

JLoader::register('FinderIndexerHelper', __DIR__ . '/helper.php');
JLoader::register('FinderIndexerParser', __DIR__ . '/parser.php');
JLoader::register('FinderIndexerStemmer', __DIR__ . '/stemmer.php');
JLoader::register('FinderIndexerTaxonomy', __DIR__ . '/taxonomy.php');
JLoader::register('FinderIndexerToken', __DIR__ . '/token.php');

jimport('joomla.filesystem.file');

/**
 * Main indexer class for the Finder indexer package.
 *
 * The indexer class provides the core functionality of the Finder
 * search engine. It is responsible for adding and updating the
 * content links table; extracting and scoring tokens; and maintaining
 * all referential information for the content.
 *
 * Note: All exceptions thrown from within this class should be caught
 * by the controller.
 *
 * @since  2.5
 */
abstract class FinderIndexer
{
	/**
	 * The title context identifier.
	 *
	 * @var    integer
	 * @since  2.5
	 */
	const TITLE_CONTEXT = 1;

	/**
	 * The text context identifier.
	 *
	 * @var    integer
	 * @since  2.5
	 */
	const TEXT_CONTEXT = 2;

	/**
	 * The meta context identifier.
	 *
	 * @var    integer
	 * @since  2.5
	 */
	const META_CONTEXT = 3;

	/**
	 * The path context identifier.
	 *
	 * @var    integer
	 * @since  2.5
	 */
	const PATH_CONTEXT = 4;

	/**
	 * The misc context identifier.
	 *
	 * @var    integer
	 * @since  2.5
	 */
	const MISC_CONTEXT = 5;

	/**
	 * The indexer state object.
	 *
	 * @var    JObject
	 * @since  2.5
	 */
	public static $state;

	/**
	 * The indexer profiler object.
	 *
	 * @var    JProfiler
	 * @since  2.5
	 */
	public static $profiler;

	/**
	 * Database driver cache.
	 *
	 * @var    JDatabaseDriver
	 * @since  3.8.0
	 */
	protected $db;

	/**
	 * Reusable Query Template. To be used with clone.
	 *
	 * @var    JDatabaseQuery
	 * @since  3.8.0
	 */
	protected $addTokensToDbQueryTemplate;

	/**
	 * FinderIndexer constructor.
	 *
	 * @since  3.8.0
	 */
	public function __construct()
	{
		$this->db = JFactory::getDbo();

		$db = $this->db;

		/**
		 * Set up query template for addTokensToDb, we will be cloning this template when needed.
		 * This is about twice as fast as calling the clear function or setting up a new object.
		 */
		$this->addTokensToDbQueryTemplate = $db->getQuery(true)->insert($db->quoteName('#__finder_tokens'))
			->columns(
				array(
					$db->quoteName('term'),
					$db->quoteName('stem'),
					$db->quoteName('common'),
					$db->quoteName('phrase'),
					$db->quoteName('weight'),
					$db->quoteName('context'),
					$db->quoteName('language')
				)
			);
	}

	/**
	 * Returns a reference to the FinderIndexer object.
	 *
	 * @return  FinderIndexer instance based on the database driver
	 *
	 * @since   3.0
	 * @throws  RuntimeException if driver class for indexer not present.
	 */
	public static function getInstance()
	{
		// Setup the adapter for the indexer.
		$serverType = JFactory::getDbo()->getServerType();

		// For `mssql` server types, convert the type to `sqlsrv`
		if ($serverType === 'mssql')
		{
			$serverType = 'sqlsrv';
		}

		$path = __DIR__ . '/driver/' . $serverType . '.php';
		$class = 'FinderIndexerDriver' . ucfirst($serverType);

		// Check if a parser exists for the format.
		if (file_exists($path))
		{
			// Instantiate the parser.
			JLoader::register($class, $path);

			return new $class;
		}

		// Throw invalid format exception.
		throw new RuntimeException(JText::sprintf('COM_FINDER_INDEXER_INVALID_DRIVER', $serverType));
	}

	/**
	 * Method to get the indexer state.
	 *
	 * @return  object  The indexer state object.
	 *
	 * @since   2.5
	 */
	public static function getState()
	{
		// First, try to load from the internal state.
		if ((bool) static::$state)
		{
			return static::$state;
		}

		// If we couldn't load from the internal state, try the session.
		$session = JFactory::getSession();
		$data = $session->get('_finder.state', null);

		// If the state is empty, load the values for the first time.
		if (empty($data))
		{
			$data = new JObject;

			// Load the default configuration options.
			$data->options = JComponentHelper::getParams('com_finder');

			// Setup the weight lookup information.
			$data->weights = array(
				self::TITLE_CONTEXT => round($data->options->get('title_multiplier', 1.7), 2),
				self::TEXT_CONTEXT  => round($data->options->get('text_multiplier', 0.7), 2),
				self::META_CONTEXT  => round($data->options->get('meta_multiplier', 1.2), 2),
				self::PATH_CONTEXT  => round($data->options->get('path_multiplier', 2.0), 2),
				self::MISC_CONTEXT  => round($data->options->get('misc_multiplier', 0.3), 2)
			);

			// Set the current time as the start time.
			$data->startTime = JFactory::getDate()->toSql();

			// Set the remaining default values.
			$data->batchSize   = (int) $data->options->get('batch_size', 50);
			$data->batchOffset = 0;
			$data->totalItems  = 0;
			$data->pluginState = array();
		}

		// Setup the profiler if debugging is enabled.
		if (JFactory::getApplication()->get('debug'))
		{
			static::$profiler = JProfiler::getInstance('FinderIndexer');
		}

		// Setup the stemmer.
		if ($data->options->get('stem', 1) && $data->options->get('stemmer', 'porter_en'))
		{
			FinderIndexerHelper::$stemmer = FinderIndexerStemmer::getInstance($data->options->get('stemmer', 'porter_en'));
		}

		// Set the state.
		static::$state = $data;

		return static::$state;
	}

	/**
	 * Method to set the indexer state.
	 *
	 * @param   object  $data  A new indexer state object.
	 *
	 * @return  boolean  True on success, false on failure.
	 *
	 * @since   2.5
	 */
	public static function setState($data)
	{
		// Check the state object.
		if (empty($data) || !$data instanceof JObject)
		{
			return false;
		}

		// Set the new internal state.
		static::$state = $data;

		// Set the new session state.
		JFactory::getSession()->set('_finder.state', $data);

		return true;
	}

	/**
	 * Method to reset the indexer state.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public static function resetState()
	{
		// Reset the internal state to null.
		self::$state = null;

		// Reset the session state to null.
		JFactory::getSession()->set('_finder.state', null);
	}

	/**
	 * Method to index a content item.
	 *
	 * @param   FinderIndexerResult  $item    The content item to index.
	 * @param   string               $format  The format of the content. [optional]
	 *
	 * @return  integer  The ID of the record in the links table.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	abstract public function index($item, $format = 'html');

	/**
	 * Method to remove a link from the index.
	 *
	 * @param   integer  $linkId  The id of the link.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public function remove($linkId)
	{
		$db    = $this->db;
		$query = $db->getQuery(true);

		// Update the link counts and remove the mapping records.
		for ($i = 0; $i <= 15; $i++)
		{
			// Update the link counts for the terms.
			$query->clear()
				->update($db->quoteName('#__finder_terms', 't'))
				->join('INNER', $db->quoteName('#__finder_links_terms' . dechex($i), 'm') .
					' ON ' . $db->quoteName('m.term_id') . ' = ' . $db->quoteName('t.term_id')
				)
				->set($db->quoteName('links') . ' = ' . $db->quoteName('links') . ' - 1')
				->where($db->quoteName('m.link_id') . ' = ' . (int) $linkId);
			$db->setQuery($query)->execute();

			// Remove all records from the mapping tables.
			$query->clear()
				->delete($db->quoteName('#__finder_links_terms' . dechex($i)))
				->where($db->quoteName('link_id') . ' = ' . (int) $linkId);
			$db->setQuery($query)->execute();
		}

		// Delete all orphaned terms.
		$query->clear()
			->delete($db->quoteName('#__finder_terms'))
			->where($db->quoteName('links') . ' <= 0');
		$db->setQuery($query)->execute();

		// Delete the link from the index.
		$query->clear()
			->delete($db->quoteName('#__finder_links'))
			->where($db->quoteName('link_id') . ' = ' . (int) $linkId);
		$db->setQuery($query)->execute();

		// Remove the taxonomy maps.
		FinderIndexerTaxonomy::removeMaps($linkId);

		// Remove the orphaned taxonomy nodes.
		FinderIndexerTaxonomy::removeOrphanNodes();

		return true;
	}

	/**
	 * Method to optimize the index. We use this method to remove unused terms
	 * and any other optimizations that might be necessary.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	abstract public function optimize();

	/**
	 * Method to get a content item's signature.
	 *
	 * @param   object  $item  The content item to index.
	 *
	 * @return  string  The content item's signature.
	 *
	 * @since   2.5
	 */
	protected static function getSignature($item)
	{
		// Get the indexer state.
		$state = static::getState();

		// Get the relevant configuration variables.
		$config = array(
			$state->weights,
			$state->options->get('stem', 1),
			$state->options->get('stemmer', 'porter_en')
		);

		return md5(serialize(array($item, $config)));
	}

	/**
	 * Method to parse input, tokenize it, and then add it to the database.
	 *
	 * @param   mixed    $input    String or resource to use as input. A resource input will automatically be chunked to conserve
	 *                             memory. Strings will be chunked if longer than 2K in size.
	 * @param   integer  $context  The context of the input. See context constants.
	 * @param   string   $lang     The language of the input.
	 * @param   string   $format   The format of the input.
	 *
	 * @return  integer  The number of tokens extracted from the input.
	 *
	 * @since   2.5
	 */
	protected function tokenizeToDb($input, $context, $lang, $format)
	{
		$count = 0;
		$buffer = null;

		if (empty($input))
		{
			return $count;
		}

		// If the input is a resource, batch the process out.
		if (is_resource($input))
		{
			// Batch the process out to avoid memory limits.
			while (!feof($input))
			{
				// Read into the buffer.
				$buffer .= fread($input, 2048);

				/*
				 * If we haven't reached the end of the file, seek to the last
				 * space character and drop whatever is after that to make sure
				 * we didn't truncate a term while reading the input.
				 */
				if (!feof($input))
				{
					// Find the last space character.
					$ls = strrpos($buffer, ' ');

					// Adjust string based on the last space character.
					if ($ls)
					{
						// Truncate the string to the last space character.
						$string = substr($buffer, 0, $ls);

						// Adjust the buffer based on the last space for the next iteration and trim.
						$buffer = StringHelper::trim(substr($buffer, $ls));
					}
					// No space character was found.
					else
					{
						$string = $buffer;
					}
				}
				// We've reached the end of the file, so parse whatever remains.
				else
				{
					$string = $buffer;
				}

				// Parse, tokenise and add tokens to the database.
				$count = $this->tokenizeToDbShort($string, $context, $lang, $format, $count);

				unset($string, $tokens);
			}

			return $count;
		}

		// Parse, tokenise and add tokens to the database.
		$count = $this->tokenizeToDbShort($input, $context, $lang, $format, $count);

		return $count;
	}

	/**
	 * Method to parse input, tokenise it, then add the tokens to the database.
	 *
	 * @param   string   $input    String to parse, tokenise and add to database.
	 * @param   integer  $context  The context of the input. See context constants.
	 * @param   string   $lang     The language of the input.
	 * @param   string   $format   The format of the input.
	 * @param   integer  $count    The number of tokens processed so far.
	 *
	 * @return  integer  Cumulative number of tokens extracted from the input so far.
	 *
	 * @since   3.7.0
	 */
	private function tokenizeToDbShort($input, $context, $lang, $format, $count)
	{
		// Parse the input.
		$input = FinderIndexerHelper::parse($input, $format);

		// Check the input.
		if (empty($input))
		{
			return $count;
		}

		// Tokenize the input.
		$tokens = FinderIndexerHelper::tokenize($input, $lang);

		// Add the tokens to the database.
		$count += $this->addTokensToDb($tokens, $context);

		// Check if we're approaching the memory limit of the token table.
		if ($count > static::$state->options->get('memory_table_limit', 30000))
		{
			$this->toggleTables(false);
		}

		return $count;
	}

	/**
	 * Method to add a set of tokens to the database.
	 *
	 * @param   mixed  $tokens   An array or single FinderIndexerToken object.
	 * @param   mixed  $context  The context of the tokens. See context constants. [optional]
	 *
	 * @return  integer  The number of tokens inserted into the database.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	protected function addTokensToDb($tokens, $context = '')
	{
		// Get the database object.
		$db = $this->db;

		$query = clone $this->addTokensToDbQueryTemplate;

		// Check if a single FinderIndexerToken object was given and make it to be an array of FinderIndexerToken objects
		$tokens = is_array($tokens) ? $tokens : array($tokens);

		// Count the number of token values.
		$values = 0;

		// Break into chunks of no more than 1000 items
		$chunks = array_chunk($tokens, 128);

		foreach ($chunks as $tokens)
		{
			$query->clear('values');

			// Iterate through the tokens to create SQL value sets.
			foreach ($tokens as $token)
			{
				$query->values(
					$db->quote($token->term) . ', '
					. $db->quote($token->stem) . ', '
					. (int) $token->common . ', '
					. (int) $token->phrase . ', '
					. $db->escape((float) $token->weight) . ', '
					. (int) $context . ', '
					. $db->quote($token->language)
				);
				++$values;
			}

			$db->setQuery($query)->execute();

			// Check if we're approaching the memory limit of the token table.
			if ($values > static::$state->options->get('memory_table_limit', 10000))
			{
				$this->toggleTables(false);
			}
		}

		return $values;
	}

	/**
	 * Method to switch the token tables from Memory tables to Disk tables
	 * when they are close to running out of memory.
	 * Since this is not supported/implemented in all DB-drivers, the default is a stub method, which simply returns true.
	 *
	 * @param   boolean  $memory  Flag to control how they should be toggled.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	protected function toggleTables($memory)
	{
		return true;
	}
}
components/com_finder/helpers/indexer/taxonomy.php000060400000023457152453623450016545 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Stemmer base class for the Finder indexer package.
 *
 * @since  2.5
 */
class FinderIndexerTaxonomy
{
	/**
	 * An internal cache of taxonomy branch data.
	 *
	 * @var    array
	 * @since  2.5
	 */
	public static $branches = array();

	/**
	 * An internal cache of taxonomy node data.
	 *
	 * @var    array
	 * @since  2.5
	 */
	public static $nodes = array();

	/**
	 * Method to add a branch to the taxonomy tree.
	 *
	 * @param   string   $title   The title of the branch.
	 * @param   integer  $state   The published state of the branch. [optional]
	 * @param   integer  $access  The access state of the branch. [optional]
	 *
	 * @return  integer  The id of the branch.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public static function addBranch($title, $state = 1, $access = 1)
	{
		// Check to see if the branch is in the cache.
		if (isset(static::$branches[$title]))
		{
			return static::$branches[$title]->id;
		}

		// Check to see if the branch is in the table.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('*')
			->from($db->quoteName('#__finder_taxonomy'))
			->where($db->quoteName('parent_id') . ' = 1')
			->where($db->quoteName('title') . ' = ' . $db->quote($title));
		$db->setQuery($query);

		// Get the result.
		$result = $db->loadObject();

		// Check if the database matches the input data.
		if ((bool) $result && $result->state == $state && $result->access == $access)
		{
			// The data matches, add the item to the cache.
			static::$branches[$title] = $result;

			return static::$branches[$title]->id;
		}

		/*
		 * The database did not match the input. This could be because the
		 * state has changed or because the branch does not exist. Let's figure
		 * out which case is true and deal with it.
		 */
		$branch = new JObject;

		if (empty($result))
		{
			// Prepare the branch object.
			$branch->parent_id = 1;
			$branch->title = $title;
			$branch->state = (int) $state;
			$branch->access = (int) $access;
		}
		else
		{
			// Prepare the branch object.
			$branch->id = (int) $result->id;
			$branch->parent_id = (int) $result->parent_id;
			$branch->title = $result->title;
			$branch->state = (int) $result->title;
			$branch->access = (int) $result->access;
			$branch->ordering = (int) $result->ordering;
		}

		// Store the branch.
		static::storeNode($branch);

		// Add the branch to the cache.
		static::$branches[$title] = $branch;

		return static::$branches[$title]->id;
	}

	/**
	 * Method to add a node to the taxonomy tree.
	 *
	 * @param   string   $branch  The title of the branch to store the node in.
	 * @param   string   $title   The title of the node.
	 * @param   integer  $state   The published state of the node. [optional]
	 * @param   integer  $access  The access state of the node. [optional]
	 *
	 * @return  integer  The id of the node.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public static function addNode($branch, $title, $state = 1, $access = 1)
	{
		// Check to see if the node is in the cache.
		if (isset(static::$nodes[$branch][$title]))
		{
			return static::$nodes[$branch][$title]->id;
		}

		// Get the branch id, insert it if it does not exist.
		$branchId = static::addBranch($branch);

		// Check to see if the node is in the table.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('*')
			->from($db->quoteName('#__finder_taxonomy'))
			->where($db->quoteName('parent_id') . ' = ' . $db->quote($branchId))
			->where($db->quoteName('title') . ' = ' . $db->quote($title));
		$db->setQuery($query);

		// Get the result.
		$result = $db->loadObject();

		// Check if the database matches the input data.
		if ((bool) $result && $result->state == $state && $result->access == $access)
		{
			// The data matches, add the item to the cache.
			static::$nodes[$branch][$title] = $result;

			return static::$nodes[$branch][$title]->id;
		}

		/*
		 * The database did not match the input. This could be because the
		 * state has changed or because the node does not exist. Let's figure
		 * out which case is true and deal with it.
		 */
		$node = new JObject;

		if (empty($result))
		{
			// Prepare the node object.
			$node->parent_id = (int) $branchId;
			$node->title = $title;
			$node->state = (int) $state;
			$node->access = (int) $access;
		}
		else
		{
			// Prepare the node object.
			$node->id = (int) $result->id;
			$node->parent_id = (int) $result->parent_id;
			$node->title = $result->title;
			$node->state = (int) $result->title;
			$node->access = (int) $result->access;
			$node->ordering = (int) $result->ordering;
		}

		// Store the node.
		static::storeNode($node);

		// Add the node to the cache.
		static::$nodes[$branch][$title] = $node;

		return static::$nodes[$branch][$title]->id;
	}

	/**
	 * Method to add a map entry between a link and a taxonomy node.
	 *
	 * @param   integer  $linkId  The link to map to.
	 * @param   integer  $nodeId  The node to map to.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public static function addMap($linkId, $nodeId)
	{
		// Insert the map.
		$db = JFactory::getDbo();

		$query = $db->getQuery(true)
			->select($db->quoteName('link_id'))
			->from($db->quoteName('#__finder_taxonomy_map'))
			->where($db->quoteName('link_id') . ' = ' . (int) $linkId)
			->where($db->quoteName('node_id') . ' = ' . (int) $nodeId);
		$db->setQuery($query);
		$db->execute();
		$id = (int) $db->loadResult();

		$map = new JObject;
		$map->link_id = (int) $linkId;
		$map->node_id = (int) $nodeId;

		if ($id)
		{
			$db->updateObject('#__finder_taxonomy_map', $map, array('link_id', 'node_id'));
		}
		else
		{
			$db->insertObject('#__finder_taxonomy_map', $map);
		}

		return true;
	}

	/**
	 * Method to get the title of all taxonomy branches.
	 *
	 * @return  array  An array of branch titles.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public static function getBranchTitles()
	{
		$db = JFactory::getDbo();

		// Set user variables
		$groups = implode(',', JFactory::getUser()->getAuthorisedViewLevels());

		// Create a query to get the taxonomy branch titles.
		$query = $db->getQuery(true)
			->select($db->quoteName('title'))
			->from($db->quoteName('#__finder_taxonomy'))
			->where($db->quoteName('parent_id') . ' = 1')
			->where($db->quoteName('state') . ' = 1')
			->where($db->quoteName('access') . ' IN (' . $groups . ')');

		// Get the branch titles.
		$db->setQuery($query);

		return $db->loadColumn();
	}

	/**
	 * Method to find a taxonomy node in a branch.
	 *
	 * @param   string  $branch  The branch to search.
	 * @param   string  $title   The title of the node.
	 *
	 * @return  mixed  Integer id on success, null on no match.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public static function getNodeByTitle($branch, $title)
	{
		$db = JFactory::getDbo();

		// Set user variables
		$groups = implode(',', JFactory::getUser()->getAuthorisedViewLevels());

		// Create a query to get the node.
		$query = $db->getQuery(true)
			->select('t1.*')
			->from($db->quoteName('#__finder_taxonomy') . ' AS t1')
			->join('INNER', $db->quoteName('#__finder_taxonomy') . ' AS t2 ON t2.id = t1.parent_id')
			->where('t1.access IN (' . $groups . ')')
			->where('t1.state = 1')
			->where('t1.title LIKE ' . $db->quote($db->escape($title) . '%'))
			->where('t2.access IN (' . $groups . ')')
			->where('t2.state = 1')
			->where('t2.title = ' . $db->quote($branch));

		// Get the node.
		$db->setQuery($query, 0, 1);

		return $db->loadObject();
	}

	/**
	 * Method to remove map entries for a link.
	 *
	 * @param   integer  $linkId  The link to remove.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public static function removeMaps($linkId)
	{
		// Delete the maps.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->delete($db->quoteName('#__finder_taxonomy_map'))
			->where($db->quoteName('link_id') . ' = ' . (int) $linkId);
		$db->setQuery($query);
		$db->execute();

		return true;
	}

	/**
	 * Method to remove orphaned taxonomy nodes and branches.
	 *
	 * @return  integer  The number of deleted rows.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public static function removeOrphanNodes()
	{
		// Delete all orphaned nodes.
		$db = JFactory::getDbo();

		$query = $db->getQuery(true)
			->select($db->quoteName('t.id'))
			->from($db->quoteName('#__finder_taxonomy', 't'))
			->join('LEFT', $db->quoteName('#__finder_taxonomy_map', 'm') . ' ON ' . $db->quoteName('m.node_id') . '=' . $db->quoteName('t.id'))
			->where($db->quoteName('t.parent_id') . ' > 1 ')
			->where($db->quoteName('m.link_id') . ' IS NULL');

		$db->setQuery($query);
		
		$ids = $db->loadColumn();

		if (empty($ids))
		{
			return 0;
		}

		$query->clear()
			->delete($db->quoteName('#__finder_taxonomy'))
			->where($db->quoteName('id') . ' IN (' . implode(',', $ids) . ')');

		$db->setQuery($query);
		
		$db->execute();

		return $db->getAffectedRows();
	}

	/**
	 * Method to store a node to the database.  This method will accept either a branch or a node.
	 *
	 * @param   object  $item  The item to store.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	protected static function storeNode($item)
	{
		$db = JFactory::getDbo();

		// Check if we are updating or inserting the item.
		if (empty($item->id))
		{
			// Insert the item.
			$db->insertObject('#__finder_taxonomy', $item, 'id');
		}
		else
		{
			// Update the item.
			$db->updateObject('#__finder_taxonomy', $item, 'id');
		}

		return true;
	}
}
components/com_finder/helpers/indexer/query.php000060400000105675152453623450016037 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

JLoader::register('FinderIndexerHelper', __DIR__ . '/helper.php');
JLoader::register('FinderIndexerTaxonomy', __DIR__ . '/taxonomy.php');
JLoader::register('FinderHelperRoute', JPATH_SITE . '/components/com_finder/helpers/route.php');
JLoader::register('FinderHelperLanguage', JPATH_ADMINISTRATOR . '/components/com_finder/helpers/language.php');

/**
 * Query class for the Finder indexer package.
 *
 * @since  2.5
 */
class FinderIndexerQuery
{
	/**
	 * Flag to show whether the query can return results.
	 *
	 * @var    boolean
	 * @since  2.5
	 */
	public $search;

	/**
	 * The query input string.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public $input;

	/**
	 * The language of the query.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public $language;

	/**
	 * The query string matching mode.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public $mode;

	/**
	 * The included tokens.
	 *
	 * @var    array
	 * @since  2.5
	 */
	public $included = array();

	/**
	 * The excluded tokens.
	 *
	 * @var    array
	 * @since  2.5
	 */
	public $excluded = array();

	/**
	 * The tokens to ignore because no matches exist.
	 *
	 * @var    array
	 * @since  2.5
	 */
	public $ignored = array();

	/**
	 * The operators used in the query input string.
	 *
	 * @var    array
	 * @since  2.5
	 */
	public $operators = array();

	/**
	 * The terms to highlight as matches.
	 *
	 * @var    array
	 * @since  2.5
	 */
	public $highlight = array();

	/**
	 * The number of matching terms for the query input.
	 *
	 * @var    integer
	 * @since  2.5
	 */
	public $terms;

	/**
	 * The static filter id.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public $filter;

	/**
	 * The taxonomy filters. This is a multi-dimensional array of taxonomy
	 * branches as the first level and then the taxonomy nodes as the values.
	 *
	 * For example:
	 * $filters = array(
	 *     'Type' = array(10, 32, 29, 11, ...);
	 *     'Label' = array(20, 314, 349, 91, 82, ...);
	 *        ...
	 * );
	 *
	 * @var    array
	 * @since  2.5
	 */
	public $filters = array();

	/**
	 * The start date filter.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public $date1;

	/**
	 * The end date filter.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public $date2;

	/**
	 * The start date filter modifier.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public $when1;

	/**
	 * The end date filter modifier.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public $when2;

	/**
	 * Method to instantiate the query object.
	 *
	 * @param   array  $options  An array of query options.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public function __construct($options)
	{
		// Get the input string.
		$this->input = isset($options['input']) ? $options['input'] : '';

		// Get the empty query setting.
		$this->empty = isset($options['empty']) ? (bool) $options['empty'] : false;

		// Get the input language.
		$this->language = !empty($options['language']) ? $options['language'] : FinderIndexerHelper::getDefaultLanguage();
		$this->language = FinderIndexerHelper::getPrimaryLanguage($this->language);

		// Get the matching mode.
		$this->mode = 'AND';

		// Initialize the temporary date storage.
		$this->dates = new Registry;

		// Populate the temporary date storage.
		if (!empty($options['date1']))
		{
			$this->dates->set('date1', $options['date1']);
		}

		if (!empty($options['date2']))
		{
			$this->dates->set('date2', $options['date2']);
		}

		if (!empty($options['when1']))
		{
			$this->dates->set('when1', $options['when1']);
		}

		if (!empty($options['when2']))
		{
			$this->dates->set('when2', $options['when2']);
		}

		// Process the static taxonomy filters.
		if (!empty($options['filter']))
		{
			$this->processStaticTaxonomy($options['filter']);
		}

		// Process the dynamic taxonomy filters.
		if (!empty($options['filters']))
		{
			$this->processDynamicTaxonomy($options['filters']);
		}

		// Get the date filters.
		$d1 = $this->dates->get('date1');
		$d2 = $this->dates->get('date2');
		$w1 = $this->dates->get('when1');
		$w2 = $this->dates->get('when2');

		// Process the date filters.
		if (!empty($d1) || !empty($d2))
		{
			$this->processDates($d1, $d2, $w1, $w2);
		}

		// Process the input string.
		$this->processString($this->input, $this->language, $this->mode);

		// Get the number of matching terms.
		foreach ($this->included as $token)
		{
			$this->terms += count($token->matches);
		}

		// Remove the temporary date storage.
		unset($this->dates);

		// Lastly, determine whether this query can return a result set.

		// Check if we have a query string.
		if (!empty($this->input))
		{
			$this->search = true;
		}
		// Check if we can search without a query string.
		elseif ($this->empty && (!empty($this->filter) || !empty($this->filters) || !empty($this->date1) || !empty($this->date2)))
		{
			$this->search = true;
		}
		// We do not have a valid search query.
		else
		{
			$this->search = false;
		}
	}

	/**
	 * Method to convert the query object into a URI string.
	 *
	 * @param   string  $base  The base URI. [optional]
	 *
	 * @return  string  The complete query URI.
	 *
	 * @since   2.5
	 */
	public function toUri($base = '')
	{
		// Set the base if not specified.
		if ($base === '')
		{
			$base = 'index.php?option=com_finder&view=search';
		}

		// Get the base URI.
		$uri = JUri::getInstance($base);

		// Add the static taxonomy filter if present.
		if ((bool) $this->filter)
		{
			$uri->setVar('f', $this->filter);
		}

		// Get the filters in the request.
		$t = JFactory::getApplication()->input->request->get('t', array(), 'array');

		// Add the dynamic taxonomy filters if present.
		if ((bool) $this->filters)
		{
			foreach ($this->filters as $nodes)
			{
				foreach ($nodes as $node)
				{
					if (!in_array($node, $t))
					{
						continue;
					}

					$uri->setVar('t[]', $node);
				}
			}
		}

		// Add the input string if present.
		if (!empty($this->input))
		{
			$uri->setVar('q', $this->input);
		}

		// Add the start date if present.
		if (!empty($this->date1))
		{
			$uri->setVar('d1', $this->date1);
		}

		// Add the end date if present.
		if (!empty($this->date2))
		{
			$uri->setVar('d2', $this->date2);
		}

		// Add the start date modifier if present.
		if (!empty($this->when1))
		{
			$uri->setVar('w1', $this->when1);
		}

		// Add the end date modifier if present.
		if (!empty($this->when2))
		{
			$uri->setVar('w2', $this->when2);
		}

		// Add a menu item id if one is not present.
		if (!$uri->getVar('Itemid'))
		{
			// Get the menu item id.
			$query = array(
				'view' => $uri->getVar('view'),
				'f'    => $uri->getVar('f'),
				'q'    => $uri->getVar('q'),
			);

			$item = FinderHelperRoute::getItemid($query);

			// Add the menu item id if present.
			if ($item !== null)
			{
				$uri->setVar('Itemid', $item);
			}
		}

		return $uri->toString(array('path', 'query'));
	}

	/**
	 * Method to get a list of excluded search term ids.
	 *
	 * @return  array  An array of excluded term ids.
	 *
	 * @since   2.5
	 */
	public function getExcludedTermIds()
	{
		$results = array();

		// Iterate through the excluded tokens and compile the matching terms.
		for ($i = 0, $c = count($this->excluded); $i < $c; $i++)
		{
			$results = array_merge($results, $this->excluded[$i]->matches);
		}

		// Sanitize the terms.
		$results = array_unique($results);

		return ArrayHelper::toInteger($results);
	}

	/**
	 * Method to get a list of included search term ids.
	 *
	 * @return  array  An array of included term ids.
	 *
	 * @since   2.5
	 */
	public function getIncludedTermIds()
	{
		$results = array();

		// Iterate through the included tokens and compile the matching terms.
		for ($i = 0, $c = count($this->included); $i < $c; $i++)
		{
			// Check if we have any terms.
			if (empty($this->included[$i]->matches))
			{
				continue;
			}

			// Get the term.
			$term = $this->included[$i]->term;

			// Prepare the container for the term if necessary.
			if (!array_key_exists($term, $results))
			{
				$results[$term] = array();
			}

			// Add the matches to the stack.
			$results[$term] = array_merge($results[$term], $this->included[$i]->matches);
		}

		// Sanitize the terms.
		foreach ($results as $key => $value)
		{
			$results[$key] = array_unique($results[$key]);
			$results[$key] = ArrayHelper::toInteger($results[$key]);
		}

		return $results;
	}

	/**
	 * Method to get a list of required search term ids.
	 *
	 * @return  array  An array of required term ids.
	 *
	 * @since   2.5
	 */
	public function getRequiredTermIds()
	{
		$results = array();

		// Iterate through the included tokens and compile the matching terms.
		for ($i = 0, $c = count($this->included); $i < $c; $i++)
		{
			// Check if the token is required.
			if ($this->included[$i]->required)
			{
				// Get the term.
				$term = $this->included[$i]->term;

				// Prepare the container for the term if necessary.
				if (!array_key_exists($term, $results))
				{
					$results[$term] = array();
				}

				// Add the matches to the stack.
				$results[$term] = array_merge($results[$term], $this->included[$i]->matches);
			}
		}

		// Sanitize the terms.
		foreach ($results as $key => $value)
		{
			$results[$key] = array_unique($results[$key]);
			$results[$key] = ArrayHelper::toInteger($results[$key]);
		}

		return $results;
	}

	/**
	 * Method to process the static taxonomy input. The static taxonomy input
	 * comes in the form of a pre-defined search filter that is assigned to the
	 * search form.
	 *
	 * @param   integer  $filterId  The id of static filter.
	 *
	 * @return  boolean  True on success, false on failure.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	protected function processStaticTaxonomy($filterId)
	{
		// Get the database object.
		$db = JFactory::getDbo();

		// Initialize user variables
		$groups = implode(',', JFactory::getUser()->getAuthorisedViewLevels());

		// Load the predefined filter.
		$query = $db->getQuery(true)
			->select('f.data, f.params')
			->from($db->quoteName('#__finder_filters') . ' AS f')
			->where('f.filter_id = ' . (int) $filterId);

		$db->setQuery($query);
		$return = $db->loadObject();

		// Check the returned filter.
		if (empty($return))
		{
			return false;
		}

		// Set the filter.
		$this->filter = (int) $filterId;

		// Get a parameter object for the filter date options.
		$registry = new Registry($return->params);
		$params = $registry;

		// Set the dates if not already set.
		$this->dates->def('d1', $params->get('d1'));
		$this->dates->def('d2', $params->get('d2'));
		$this->dates->def('w1', $params->get('w1'));
		$this->dates->def('w2', $params->get('w2'));

		// Remove duplicates and sanitize.
		$filters = explode(',', $return->data);
		$filters = array_unique($filters);
		$filters = ArrayHelper::toInteger($filters);

		// Remove any values of zero.
		if (in_array(0, $filters, true) !== false)
		{
			unset($filters[array_search(0, $filters, true)]);
		}

		// Check if we have any real input.
		if (empty($filters))
		{
			return true;
		}

		/*
		 * Create the query to get filters from the database. We do this for
		 * two reasons: one, it allows us to ensure that the filters being used
		 * are real; two, we need to sort the filters by taxonomy branch.
		 */
		$query->clear()
			->select('t1.id, t1.title, t2.title AS branch')
			->from($db->quoteName('#__finder_taxonomy') . ' AS t1')
			->join('INNER', $db->quoteName('#__finder_taxonomy') . ' AS t2 ON t2.id = t1.parent_id')
			->where('t1.state = 1')
			->where('t1.access IN (' . $groups . ')')
			->where('t1.id IN (' . implode(',', $filters) . ')')
			->where('t2.state = 1')
			->where('t2.access IN (' . $groups . ')');

		// Load the filters.
		$db->setQuery($query);
		$results = $db->loadObjectList();

		// Sort the filter ids by branch.
		foreach ($results as $result)
		{
			$this->filters[$result->branch][$result->title] = (int) $result->id;
		}

		return true;
	}

	/**
	 * Method to process the dynamic taxonomy input. The dynamic taxonomy input
	 * comes in the form of select fields that the user chooses from. The
	 * dynamic taxonomy input is processed AFTER the static taxonomy input
	 * because the dynamic options can be used to further narrow a static
	 * taxonomy filter.
	 *
	 * @param   array  $filters  An array of taxonomy node ids.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	protected function processDynamicTaxonomy($filters)
	{
		// Initialize user variables
		$groups = implode(',', JFactory::getUser()->getAuthorisedViewLevels());

		// Remove duplicates and sanitize.
		$filters = array_unique($filters);
		$filters = ArrayHelper::toInteger($filters);

		// Remove any values of zero.
		if (in_array(0, $filters, true) !== false)
		{
			unset($filters[array_search(0, $filters, true)]);
		}

		// Check if we have any real input.
		if (empty($filters))
		{
			return true;
		}

		// Get the database object.
		$db = JFactory::getDbo();

		$query = $db->getQuery(true);

		/*
		 * Create the query to get filters from the database. We do this for
		 * two reasons: one, it allows us to ensure that the filters being used
		 * are real; two, we need to sort the filters by taxonomy branch.
		 */
		$query->select('t1.id, t1.title, t2.title AS branch')
			->from($db->quoteName('#__finder_taxonomy') . ' AS t1')
			->join('INNER', $db->quoteName('#__finder_taxonomy') . ' AS t2 ON t2.id = t1.parent_id')
			->where('t1.state = 1')
			->where('t1.access IN (' . $groups . ')')
			->where('t1.id IN (' . implode(',', $filters) . ')')
			->where('t2.state = 1')
			->where('t2.access IN (' . $groups . ')');

		// Load the filters.
		$db->setQuery($query);
		$results = $db->loadObjectList();

		// Cleared filter branches.
		$cleared = array();

		/*
		 * Sort the filter ids by branch. Because these filters are designed to
		 * override and further narrow the items selected in the static filter,
		 * we will clear the values from the static filter on a branch by
		 * branch basis before adding the dynamic filters. So, if the static
		 * filter defines a type filter of "articles" and three "category"
		 * filters but the user only limits the category further, the category
		 * filters will be flushed but the type filters will not.
		 */
		foreach ($results as $result)
		{
			// Check if the branch has been cleared.
			if (!in_array($result->branch, $cleared, true))
			{
				// Clear the branch.
				$this->filters[$result->branch] = array();

				// Add the branch to the cleared list.
				$cleared[] = $result->branch;
			}

			// Add the filter to the list.
			$this->filters[$result->branch][$result->title] = (int) $result->id;
		}

		return true;
	}

	/**
	 * Method to process the query date filters to determine start and end
	 * date limitations.
	 *
	 * @param   string  $date1  The first date filter.
	 * @param   string  $date2  The second date filter.
	 * @param   string  $when1  The first date modifier.
	 * @param   string  $when2  The second date modifier.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 */
	protected function processDates($date1, $date2, $when1, $when2)
	{
		// Clean up the inputs.
		$date1 = trim(StringHelper::strtolower($date1));
		$date2 = trim(StringHelper::strtolower($date2));
		$when1 = trim(StringHelper::strtolower($when1));
		$when2 = trim(StringHelper::strtolower($when2));

		// Get the time offset.
		$offset = JFactory::getApplication()->get('offset');

		// Array of allowed when values.
		$whens = array('before', 'after', 'exact');

		// The value of 'today' is a special case that we need to handle.
		if ($date1 === StringHelper::strtolower(JText::_('COM_FINDER_QUERY_FILTER_TODAY')))
		{
			$date1 = JFactory::getDate('now', $offset)->format('%Y-%m-%d');
		}

		// Try to parse the date string.
		$date = JFactory::getDate($date1, $offset);

		// Check if the date was parsed successfully.
		if ($date->toUnix() !== null)
		{
			// Set the date filter.
			$this->date1 = $date->toSql();
			$this->when1 = in_array($when1, $whens, true) ? $when1 : 'before';
		}

		// The value of 'today' is a special case that we need to handle.
		if ($date2 === StringHelper::strtolower(JText::_('COM_FINDER_QUERY_FILTER_TODAY')))
		{
			$date2 = JFactory::getDate('now', $offset)->format('%Y-%m-%d');
		}

		// Try to parse the date string.
		$date = JFactory::getDate($date2, $offset);

		// Check if the date was parsed successfully.
		if ($date->toUnix() !== null)
		{
			// Set the date filter.
			$this->date2 = $date->toSql();
			$this->when2 = in_array($when2, $whens, true) ? $when2 : 'before';
		}

		return true;
	}

	/**
	 * Method to process the query input string and extract required, optional,
	 * and excluded tokens; taxonomy filters; and date filters.
	 *
	 * @param   string  $input  The query input string.
	 * @param   string  $lang   The query input language.
	 * @param   string  $mode   The query matching mode.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	protected function processString($input, $lang, $mode)
	{
		// Clean up the input string.
		$input = html_entity_decode($input, ENT_QUOTES, 'UTF-8');
		$input = StringHelper::strtolower($input);
		$input = preg_replace('#\s+#mi', ' ', $input);
		$input = trim($input);
		$debug = JFactory::getConfig()->get('debug_lang');

		/*
		 * First, we need to handle string based modifiers. String based
		 * modifiers could potentially include things like "category:blah" or
		 * "before:2009-10-21" or "type:article", etc.
		 */
		$patterns = array(
			'before' => JText::_('COM_FINDER_FILTER_WHEN_BEFORE'),
			'after'  => JText::_('COM_FINDER_FILTER_WHEN_AFTER'),
		);

		// Add the taxonomy branch titles to the possible patterns.
		foreach (FinderIndexerTaxonomy::getBranchTitles() as $branch)
		{
			// Add the pattern.
			$patterns[$branch] = StringHelper::strtolower(JText::_(FinderHelperLanguage::branchSingular($branch)));
		}

		// Container for search terms and phrases.
		$terms   = array();
		$phrases = array();

		// Cleared filter branches.
		$cleared = array();

		/*
		 * Compile the suffix pattern. This is used to match the values of the
		 * filter input string. Single words can be input directly, multi-word
		 * values have to be wrapped in double quotes.
		 */
		$quotes = html_entity_decode('&#8216;&#8217;&#39;', ENT_QUOTES, 'UTF-8');
		$suffix = '(([\w\d' . $quotes . '-]+)|\"([\w\d\s' . $quotes . '-]+)\")';

		/*
		 * Iterate through the possible filter patterns and search for matches.
		 * We need to match the key, colon, and a value pattern for the match
		 * to be valid.
		 */
		foreach ($patterns as $modifier => $pattern)
		{
			$matches = array();

			if ($debug)
			{
				$pattern = substr($pattern, 2, -2);
			}

			// Check if the filter pattern is in the input string.
			if (preg_match('#' . $pattern . '\s*:\s*' . $suffix . '#mi', $input, $matches))
			{
				// Get the value given to the modifier.
				$value = isset($matches[3]) ? $matches[3] : $matches[1];

				// Now we have to handle the filter string.
				switch ($modifier)
				{
					// Handle a before and after date filters.
					case 'before':
					case 'after':
					{
						// Get the time offset.
						$offset = JFactory::getApplication()->get('offset');

						// Array of allowed when values.
						$whens = array('before', 'after', 'exact');

						// The value of 'today' is a special case that we need to handle.
						if ($value === StringHelper::strtolower(JText::_('COM_FINDER_QUERY_FILTER_TODAY')))
						{
							$value = JFactory::getDate('now', $offset)->format('%Y-%m-%d');
						}

						// Try to parse the date string.
						$date = JFactory::getDate($value, $offset);

						// Check if the date was parsed successfully.
						if ($date->toUnix() !== null)
						{
							// Set the date filter.
							$this->date1 = $date->toSql();
							$this->when1 = in_array($modifier, $whens, true) ? $modifier : 'before';
						}

						break;
					}

					// Handle a taxonomy branch filter.
					default:
					{
						// Try to find the node id.
						$return = FinderIndexerTaxonomy::getNodeByTitle($modifier, $value);

						// Check if the node id was found.
						if ($return)
						{
							// Check if the branch has been cleared.
							if (!in_array($modifier, $cleared, true))
							{
								// Clear the branch.
								$this->filters[$modifier] = array();

								// Add the branch to the cleared list.
								$cleared[] = $modifier;
							}

							// Add the filter to the list.
							$this->filters[$modifier][$return->title] = (int) $return->id;
						}

						break;
					}
				}

				// Clean up the input string again.
				$input = str_replace($matches[0], '', $input);
				$input = preg_replace('#\s+#mi', ' ', $input);
				$input = trim($input);
			}
		}

		/*
		 * Extract the tokens enclosed in double quotes so that we can handle
		 * them as phrases.
		 */
		if (StringHelper::strpos($input, '"') !== false)
		{
			$matches = array();

			// Extract the tokens enclosed in double quotes.
			if (preg_match_all('#\"([^"]+)\"#m', $input, $matches))
			{
				/*
				 * One or more phrases were found so we need to iterate through
				 * them, tokenize them as phrases, and remove them from the raw
				 * input string before we move on to the next processing step.
				 */
				foreach ($matches[1] as $key => $match)
				{
					// Find the complete phrase in the input string.
					$pos = StringHelper::strpos($input, $matches[0][$key]);
					$len = StringHelper::strlen($matches[0][$key]);

					// Add any terms that are before this phrase to the stack.
					if (trim(StringHelper::substr($input, 0, $pos)))
					{
						$terms = array_merge($terms, explode(' ', trim(StringHelper::substr($input, 0, $pos))));
					}

					// Strip out everything up to and including the phrase.
					$input = StringHelper::substr($input, $pos + $len);

					// Clean up the input string again.
					$input = preg_replace('#\s+#mi', ' ', $input);
					$input = trim($input);

					// Get the number of words in the phrase.
					$parts = explode(' ', $match);

					// Check if the phrase is longer than three words.
					if (count($parts) > 3)
					{
						/*
						 * If the phrase is longer than three words, we need to
						 * break it down into smaller chunks of phrases that
						 * are less than or equal to three words. We overlap
						 * the chunks so that we can ensure that a match is
						 * found for the complete phrase and not just portions
						 * of it.
						 */
						for ($i = 0, $c = count($parts); $i < $c; $i += 2)
						{
							// Set up the chunk.
							$chunk = array();

							// The chunk has to be assembled based on how many
							// pieces are available to use.
							switch ($c - $i)
							{
								/*
								 * If only one word is left, we can break from
								 * the switch and loop because the last word
								 * was already used at the end of the last
								 * chunk.
								 */
								case 1:
									break 2;

								// If there words are left, we use them both as
								// the last chunk of the phrase and we're done.
								case 2:
									$chunk[] = $parts[$i];
									$chunk[] = $parts[$i + 1];
									break;

								// If there are three or more words left, we
								// build a three word chunk and continue on.
								default:
									$chunk[] = $parts[$i];
									$chunk[] = $parts[$i + 1];
									$chunk[] = $parts[$i + 2];
									break;
							}

							// If the chunk is not empty, add it as a phrase.
							if (count($chunk))
							{
								$phrases[] = implode(' ', $chunk);
								$terms[]   = implode(' ', $chunk);
							}
						}
					}
					else
					{
						// The phrase is <= 3 words so we can use it as is.
						$phrases[] = $match;
						$terms[]   = $match;
					}
				}
			}
		}

		// Add the remaining terms if present.
		if ((bool) $input)
		{
			$terms = array_merge($terms, explode(' ', $input));
		}

		// An array of our boolean operators. $operator => $translation
		$operators = array(
			'AND' => StringHelper::strtolower(JText::_('COM_FINDER_QUERY_OPERATOR_AND')),
			'OR'  => StringHelper::strtolower(JText::_('COM_FINDER_QUERY_OPERATOR_OR')),
			'NOT' => StringHelper::strtolower(JText::_('COM_FINDER_QUERY_OPERATOR_NOT')),
		);

		// If language debugging is enabled you need to ignore the debug strings in matching.
		if (JDEBUG)
		{
			$debugStrings = array('**', '??');
			$operators    = str_replace($debugStrings, '', $operators);
		}

		/*
		 * Iterate through the terms and perform any sorting that needs to be
		 * done based on boolean search operators. Terms that are before an
		 * and/or/not modifier have to be handled in relation to their operator.
		 */
		for ($i = 0, $c = count($terms); $i < $c; $i++)
		{
			// Check if the term is followed by an operator that we understand.
			if (isset($terms[$i + 1]) && in_array($terms[$i + 1], $operators, true))
			{
				// Get the operator mode.
				$op = array_search($terms[$i + 1], $operators, true);

				// Handle the AND operator.
				if ($op === 'AND' && isset($terms[$i + 2]))
				{
					// Tokenize the current term.
					$token = FinderIndexerHelper::tokenize($terms[$i], $lang, true);

					// Todo: The previous function call may return an array, which seems not to be handled by the next one, which expects an object
					$token = $this->getTokenData($token);

					// Set the required flag.
					$token->required = true;

					// Add the current token to the stack.
					$this->included[] = $token;
					$this->highlight  = array_merge($this->highlight, array_keys($token->matches));

					// Skip the next token (the mode operator).
					$this->operators[] = $terms[$i + 1];

					// Tokenize the term after the next term (current plus two).
					$other = FinderIndexerHelper::tokenize($terms[$i + 2], $lang, true);
					$other = $this->getTokenData($other);

					// Set the required flag.
					$other->required = true;

					// Add the token after the next token to the stack.
					$this->included[] = $other;
					$this->highlight  = array_merge($this->highlight, array_keys($other->matches));

					// Remove the processed phrases if possible.
					if (($pk = array_search($terms[$i], $phrases, true)) !== false)
					{
						unset($phrases[$pk]);
					}

					if (($pk = array_search($terms[$i + 2], $phrases, true)) !== false)
					{
						unset($phrases[$pk]);
					}

					// Remove the processed terms.
					unset($terms[$i], $terms[$i + 1], $terms[$i + 2]);

					// Adjust the loop.
					$i += 2;
					continue;
				}
				// Handle the OR operator.
				elseif ($op === 'OR' && isset($terms[$i + 2]))
				{
					// Tokenize the current term.
					$token = FinderIndexerHelper::tokenize($terms[$i], $lang, true);
					$token = $this->getTokenData($token);

					// Set the required flag.
					$token->required = false;

					// Add the current token to the stack.
					if ((bool) $token->matches)
					{
						$this->included[] = $token;
						$this->highlight  = array_merge($this->highlight, array_keys($token->matches));
					}
					else
					{
						$this->ignored[] = $token;
					}

					// Skip the next token (the mode operator).
					$this->operators[] = $terms[$i + 1];

					// Tokenize the term after the next term (current plus two).
					$other = FinderIndexerHelper::tokenize($terms[$i + 2], $lang, true);
					$other = $this->getTokenData($other);

					// Set the required flag.
					$other->required = false;

					// Add the token after the next token to the stack.
					if ((bool) $other->matches)
					{
						$this->included[] = $other;
						$this->highlight  = array_merge($this->highlight, array_keys($other->matches));
					}
					else
					{
						$this->ignored[] = $other;
					}

					// Remove the processed phrases if possible.
					if (($pk = array_search($terms[$i], $phrases, true)) !== false)
					{
						unset($phrases[$pk]);
					}

					if (($pk = array_search($terms[$i + 2], $phrases, true)) !== false)
					{
						unset($phrases[$pk]);
					}

					// Remove the processed terms.
					unset($terms[$i], $terms[$i + 1], $terms[$i + 2]);

					// Adjust the loop.
					$i += 2;
					continue;
				}
			}
			// Handle an orphaned OR operator.
			elseif (isset($terms[$i + 1]) && array_search($terms[$i], $operators, true) === 'OR')
			{
				// Skip the next token (the mode operator).
				$this->operators[] = $terms[$i];

				// Tokenize the next term (current plus one).
				$other = FinderIndexerHelper::tokenize($terms[$i + 1], $lang, true);
				$other = $this->getTokenData($other);

				// Set the required flag.
				$other->required = false;

				// Add the token after the next token to the stack.
				if ((bool) $other->matches)
				{
					$this->included[] = $other;
					$this->highlight  = array_merge($this->highlight, array_keys($other->matches));
				}
				else
				{
					$this->ignored[] = $other;
				}

				// Remove the processed phrase if possible.
				if (($pk = array_search($terms[$i + 1], $phrases, true)) !== false)
				{
					unset($phrases[$pk]);
				}

				// Remove the processed terms.
				unset($terms[$i], $terms[$i + 1]);

				// Adjust the loop.
				$i++;
				continue;
			}
			// Handle the NOT operator.
			elseif (isset($terms[$i + 1]) && array_search($terms[$i], $operators, true) === 'NOT')
			{
				// Skip the next token (the mode operator).
				$this->operators[] = $terms[$i];

				// Tokenize the next term (current plus one).
				$other = FinderIndexerHelper::tokenize($terms[$i + 1], $lang, true);
				$other = $this->getTokenData($other);

				// Set the required flag.
				$other->required = false;

				// Add the next token to the stack.
				if ((bool) $other->matches)
				{
					$this->excluded[] = $other;
				}
				else
				{
					$this->ignored[] = $other;
				}

				// Remove the processed phrase if possible.
				if (($pk = array_search($terms[$i + 1], $phrases, true)) !== false)
				{
					unset($phrases[$pk]);
				}

				// Remove the processed terms.
				unset($terms[$i], $terms[$i + 1]);

				// Adjust the loop.
				$i++;
				continue;
			}
		}

		/*
		 * Iterate through any search phrases and tokenize them. We handle
		 * phrases as autonomous units and do not break them down into two and
		 * three word combinations.
		 */
		for ($i = 0, $c = count($phrases); $i < $c; $i++)
		{
			// Tokenize the phrase.
			$token = FinderIndexerHelper::tokenize($phrases[$i], $lang, true);
			$token = $this->getTokenData($token);

			// Set the required flag.
			$token->required = true;

			// Add the current token to the stack.
			$this->included[] = $token;
			$this->highlight  = array_merge($this->highlight, array_keys($token->matches));

			// Remove the processed term if possible.
			if (($pk = array_search($phrases[$i], $terms, true)) !== false)
			{
				unset($terms[$pk]);
			}

			// Remove the processed phrase.
			unset($phrases[$i]);
		}

		/*
		 * Handle any remaining tokens using the standard processing mechanism.
		 */
		if ((bool) $terms)
		{
			// Tokenize the terms.
			$terms  = implode(' ', $terms);
			$tokens = FinderIndexerHelper::tokenize($terms, $lang, false);

			// Make sure we are working with an array.
			$tokens = is_array($tokens) ? $tokens : array($tokens);

			// Get the token data and required state for all the tokens.
			foreach ($tokens as $token)
			{
				// Get the token data.
				$token = $this->getTokenData($token);

				// Set the required flag for the token.
				$token->required = $mode === 'AND' ? (!$token->phrase) : false;

				// Add the token to the appropriate stack.
				if ($token->required || (bool) $token->matches)
				{
					$this->included[] = $token;
					$this->highlight  = array_merge($this->highlight, array_keys($token->matches));
				}
				else
				{
					$this->ignored[] = $token;
				}
			}
		}

		return true;
	}

	/**
	 * Method to get the base and similar term ids and, if necessary, suggested
	 * term data from the database. The terms ids are identified based on a
	 * 'like' match in MySQL and/or a common stem. If no term ids could be
	 * found, then we know that we will not be able to return any results for
	 * that term and we should try to find a similar term to use that we can
	 * match so that we can suggest the alternative search query to the user.
	 *
	 * @param   FinderIndexerToken  $token  A FinderIndexerToken object.
	 *
	 * @return  FinderIndexerToken  A FinderIndexerToken object.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	protected function getTokenData($token)
	{
		// Get the database object.
		$db = JFactory::getDbo();

		// Create a database query to build match the token.
		$query = $db->getQuery(true)
			->select('t.term, t.term_id')
			->from('#__finder_terms AS t');

		/*
		 * If the token is a phrase, the lookup process is fairly simple. If
		 * the token is a word, it is a little more complicated. We have to
		 * create two queries to lookup the term and the stem respectively,
		 * then union the result sets together. This is MUCH faster than using
		 * an or condition in the database query.
		 */
		if ($token->phrase)
		{
			// Add the phrase to the query.
			$query->where('t.term = ' . $db->quote($token->term))
				->where('t.phrase = 1');
		}
		else
		{
			// Add the term to the query.
			$query->where('t.term = ' . $db->quote($token->term))
				->where('t.phrase = 0');

			// Clone the query, replace the WHERE clause.
			$sub = clone $query;
			$sub->clear('where');
			$sub->where('t.stem = ' . $db->quote($token->stem));
			$sub->where('t.phrase = 0');

			// Union the two queries.
			$query->union($sub);
		}

		// Get the terms.
		$db->setQuery($query);
		$matches = $db->loadObjectList();

		// Check the matching terms.
		if ((bool) $matches)
		{
			// Add the matches to the token.
			for ($i = 0, $c = count($matches); $i < $c; $i++)
			{
				$token->matches[$matches[$i]->term] = (int) $matches[$i]->term_id;
			}
		}

		// If no matches were found, try to find a similar but better token.
		if (empty($token->matches))
		{
			// Create a database query to get the similar terms.
			// TODO: PostgreSQL doesn't support SOUNDEX out of the box
			$query->clear()
				->select('DISTINCT t.term_id AS id, t.term AS term')
				->from('#__finder_terms AS t')
				// ->where('t.soundex = ' . soundex($db->quote($token->term)))
				->where('t.soundex = SOUNDEX(' . $db->quote($token->term) . ')')
				->where('t.phrase = ' . (int) $token->phrase);

			// Get the terms.
			$db->setQuery($query);
			$results = $db->loadObjectList();

			// Check if any similar terms were found.
			if (empty($results))
			{
				return $token;
			}

			// Stack for sorting the similar terms.
			$suggestions = array();

			// Get the levnshtein distance for all suggested terms.
			foreach ($results as $sk => $st)
			{
				// Get the levenshtein distance between terms.
				$distance = levenshtein($st->term, $token->term);

				// Make sure the levenshtein distance isn't over 50.
				if ($distance < 50)
				{
					$suggestions[$sk] = $distance;
				}
			}

			// Sort the suggestions.
			asort($suggestions, SORT_NUMERIC);

			// Get the closest match.
			$keys = array_keys($suggestions);
			$key  = $keys[0];

			// Add the suggested term.
			$token->suggestion = $results[$key]->term;
		}

		return $token;
	}
}
components/com_finder/helpers/indexer/driver/mysql.php000060400000046020152453623450017316 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

jimport('joomla.filesystem.file');

/**
 * Indexer class supporting MySQL(i) for the Finder indexer package.
 *
 * The indexer class provides the core functionality of the Finder
 * search engine. It is responsible for adding and updating the
 * content links table; extracting and scoring tokens; and maintaining
 * all referential information for the content.
 *
 * Note: All exceptions thrown from within this class should be caught
 * by the controller.
 *
 * @since  3.0
 */
class FinderIndexerDriverMysql extends FinderIndexer
{
	/**
	 * Method to index a content item.
	 *
	 * @param   FinderIndexerResult  $item    The content item to index.
	 * @param   string               $format  The format of the content. [optional]
	 *
	 * @return  integer  The ID of the record in the links table.
	 *
	 * @since   3.0
	 * @throws  Exception on database error.
	 */
	public function index($item, $format = 'html')
	{
		// Mark beforeIndexing in the profiler.
		static::$profiler ? static::$profiler->mark('beforeIndexing') : null;
		$db = $this->db;
		$nd = $db->getNullDate();

		// Check if the item is in the database.
		$query = $db->getQuery(true)
			->select($db->quoteName('link_id') . ', ' . $db->quoteName('md5sum'))
			->from($db->quoteName('#__finder_links'))
			->where($db->quoteName('url') . ' = ' . $db->quote($item->url));

		// Load the item  from the database.
		$db->setQuery($query);
		$link = $db->loadObject();

		// Get the indexer state.
		$state = static::getState();

		// Get the signatures of the item.
		$curSig = static::getSignature($item);
		$oldSig = isset($link->md5sum) ? $link->md5sum : null;

		// Get the other item information.
		$linkId = empty($link->link_id) ? null : $link->link_id;
		$isNew = empty($link->link_id) ? true : false;

		// Check the signatures. If they match, the item is up to date.
		if (!$isNew && $curSig == $oldSig)
		{
			return $linkId;
		}

		/*
		 * If the link already exists, flush all the term maps for the item.
		 * Maps are stored in 16 tables so we need to iterate through and flush
		 * each table one at a time.
		 */
		if (!$isNew)
		{
			for ($i = 0; $i <= 15; $i++)
			{
				// Flush the maps for the link.
				$query->clear()
					->delete($db->quoteName('#__finder_links_terms' . dechex($i)))
					->where($db->quoteName('link_id') . ' = ' . (int) $linkId);
				$db->setQuery($query);
				$db->execute();
			}

			// Remove the taxonomy maps.
			FinderIndexerTaxonomy::removeMaps($linkId);
		}

		// Mark afterUnmapping in the profiler.
		static::$profiler ? static::$profiler->mark('afterUnmapping') : null;

		// Perform cleanup on the item data.
		$item->publish_start_date = (int) $item->publish_start_date != 0 ? $item->publish_start_date : $nd;
		$item->publish_end_date = (int) $item->publish_end_date != 0 ? $item->publish_end_date : $nd;
		$item->start_date = (int) $item->start_date != 0 ? $item->start_date : $nd;
		$item->end_date = (int) $item->end_date != 0 ? $item->end_date : $nd;

		// Prepare the item description.
		$item->description = FinderIndexerHelper::parse($item->summary);

		/*
		 * Now, we need to enter the item into the links table. If the item
		 * already exists in the database, we need to use an UPDATE query.
		 * Otherwise, we need to use an INSERT to get the link id back.
		 */

		if ($isNew)
		{
			$columnsArray = array(
				$db->quoteName('url'), $db->quoteName('route'), $db->quoteName('title'), $db->quoteName('description'),
				$db->quoteName('indexdate'), $db->quoteName('published'), $db->quoteName('state'), $db->quoteName('access'),
				$db->quoteName('language'), $db->quoteName('type_id'), $db->quoteName('object'), $db->quoteName('publish_start_date'),
				$db->quoteName('publish_end_date'), $db->quoteName('start_date'), $db->quoteName('end_date'), $db->quoteName('list_price'),
				$db->quoteName('sale_price')
			);

			// Insert the link.
			$query->clear()
				->insert($db->quoteName('#__finder_links'))
				->columns($columnsArray)
				->values(
					$db->quote($item->url) . ', '
					. $db->quote($item->route) . ', '
					. $db->quote($item->title) . ', '
					. $db->quote($item->description) . ', '
					. $query->currentTimestamp() . ', '
					. '1, '
					. (int) $item->state . ', '
					. (int) $item->access . ', '
					. $db->quote($item->language) . ', '
					. (int) $item->type_id . ', '
					. $db->quote(serialize($item)) . ', '
					. $db->quote($item->publish_start_date) . ', '
					. $db->quote($item->publish_end_date) . ', '
					. $db->quote($item->start_date) . ', '
					. $db->quote($item->end_date) . ', '
					. (double) ($item->list_price ?: 0) . ', '
					. (double) ($item->sale_price ?: 0)
				);
			$db->setQuery($query);
			$db->execute();

			// Get the link id.
			$linkId = (int) $db->insertid();
		}
		else
		{
			// Update the link.
			$query->clear()
				->update($db->quoteName('#__finder_links'))
				->set($db->quoteName('route') . ' = ' . $db->quote($item->route))
				->set($db->quoteName('title') . ' = ' . $db->quote($item->title))
				->set($db->quoteName('description') . ' = ' . $db->quote($item->description))
				->set($db->quoteName('indexdate') . ' = ' . $query->currentTimestamp())
				->set($db->quoteName('state') . ' = ' . (int) $item->state)
				->set($db->quoteName('access') . ' = ' . (int) $item->access)
				->set($db->quoteName('language') . ' = ' . $db->quote($item->language))
				->set($db->quoteName('type_id') . ' = ' . (int) $item->type_id)
				->set($db->quoteName('object') . ' = ' . $db->quote(serialize($item)))
				->set($db->quoteName('publish_start_date') . ' = ' . $db->quote($item->publish_start_date))
				->set($db->quoteName('publish_end_date') . ' = ' . $db->quote($item->publish_end_date))
				->set($db->quoteName('start_date') . ' = ' . $db->quote($item->start_date))
				->set($db->quoteName('end_date') . ' = ' . $db->quote($item->end_date))
				->set($db->quoteName('list_price') . ' = ' . (double) ($item->list_price ?: 0))
				->set($db->quoteName('sale_price') . ' = ' . (double) ($item->sale_price ?: 0))
				->where('link_id = ' . (int) $linkId);
			$db->setQuery($query);
			$db->execute();
		}

		// Set up the variables we will need during processing.
		$count = 0;

		// Mark afterLinking in the profiler.
		static::$profiler ? static::$profiler->mark('afterLinking') : null;

		// Truncate the tokens tables.
		$db->truncateTable('#__finder_tokens');

		// Truncate the tokens aggregate table.
		$db->truncateTable('#__finder_tokens_aggregate');

		/*
		 * Process the item's content. The items can customize their
		 * processing instructions to define extra properties to process
		 * or rearrange how properties are weighted.
		 */
		foreach ($item->getInstructions() as $group => $properties)
		{
			// Iterate through the properties of the group.
			foreach ($properties as $property)
			{
				// Check if the property exists in the item.
				if (empty($item->$property))
				{
					continue;
				}

				// Tokenize the property.
				if (is_array($item->$property))
				{
					// Tokenize an array of content and add it to the database.
					foreach ($item->$property as $ip)
					{
						/*
						 * If the group is path, we need to a few extra processing
						 * steps to strip the extension and convert slashes and dashes
						 * to spaces.
						 */
						if ($group === static::PATH_CONTEXT)
						{
							$ip = JFile::stripExt($ip);
							$ip = str_replace(array('/', '-'), ' ', $ip);
						}

						// Tokenize a string of content and add it to the database.
						$count += $this->tokenizeToDb($ip, $group, $item->language, $format);

						// Check if we're approaching the memory limit of the token table.
						if ($count > static::$state->options->get('memory_table_limit', 30000))
						{
							$this->toggleTables(false);
						}
					}
				}
				else
				{
					/*
					 * If the group is path, we need to a few extra processing
					 * steps to strip the extension and convert slashes and dashes
					 * to spaces.
					 */
					if ($group === static::PATH_CONTEXT)
					{
						$item->$property = JFile::stripExt($item->$property);
						$item->$property = str_replace('/', ' ', $item->$property);
						$item->$property = str_replace('-', ' ', $item->$property);
					}

					// Tokenize a string of content and add it to the database.
					$count += $this->tokenizeToDb($item->$property, $group, $item->language, $format);

					// Check if we're approaching the memory limit of the token table.
					if ($count > static::$state->options->get('memory_table_limit', 30000))
					{
						$this->toggleTables(false);
					}
				}
			}
		}

		/*
		 * Process the item's taxonomy. The items can customize their
		 * taxonomy mappings to define extra properties to map.
		 */
		foreach ($item->getTaxonomy() as $branch => $nodes)
		{
			// Iterate through the nodes and map them to the branch.
			foreach ($nodes as $node)
			{
				// Add the node to the tree.
				$nodeId = FinderIndexerTaxonomy::addNode($branch, $node->title, $node->state, $node->access);

				// Add the link => node map.
				FinderIndexerTaxonomy::addMap($linkId, $nodeId);
			}
		}

		// Mark afterProcessing in the profiler.
		static::$profiler ? static::$profiler->mark('afterProcessing') : null;

		/*
		 * At this point, all of the item's content has been parsed, tokenized
		 * and inserted into the #__finder_tokens table. Now, we need to
		 * aggregate all the data into that table into a more usable form. The
		 * aggregated data will be inserted into #__finder_tokens_aggregate
		 * table.
		 */
		$query = 'INSERT INTO ' . $db->quoteName('#__finder_tokens_aggregate') .
			' (' . $db->quoteName('term_id') .
			', ' . $db->quoteName('map_suffix') .
				', ' . $db->quoteName('term') .
			', ' . $db->quoteName('stem') .
			', ' . $db->quoteName('common') .
			', ' . $db->quoteName('phrase') .
			', ' . $db->quoteName('term_weight') .
			', ' . $db->quoteName('context') .
			', ' . $db->quoteName('context_weight') .
			', ' . $db->quoteName('total_weight') .
				', ' . $db->quoteName('language') . ')' .
			' SELECT' .
			' COALESCE(t.term_id, 0), \'\', t1.term, t1.stem, t1.common, t1.phrase, t1.weight, t1.context,' .
			' ROUND( t1.weight * COUNT( t2.term ) * %F, 8 ) AS context_weight, 0, t1.language' .
			' FROM (' .
			'   SELECT DISTINCT t1.term, t1.stem, t1.common, t1.phrase, t1.weight, t1.context, t1.language' .
			'   FROM ' . $db->quoteName('#__finder_tokens') . ' AS t1' .
			'   WHERE t1.context = %d' .
			' ) AS t1' .
			' JOIN ' . $db->quoteName('#__finder_tokens') . ' AS t2 ON t2.term = t1.term' .
			' LEFT JOIN ' . $db->quoteName('#__finder_terms') . ' AS t ON t.term = t1.term' .
			' WHERE t2.context = %d' .
			' GROUP BY t1.term, t.term_id, t1.term, t1.stem, t1.common, t1.phrase, t1.weight, t1.context, t1.language' .
			' ORDER BY t1.term DESC';

		// Iterate through the contexts and aggregate the tokens per context.
		foreach ($state->weights as $context => $multiplier)
		{
			// Run the query to aggregate the tokens for this context..
			$db->setQuery(sprintf($query, $multiplier, $context, $context));
			$db->execute();
		}

		// Mark afterAggregating in the profiler.
		static::$profiler ? static::$profiler->mark('afterAggregating') : null;

		/*
		 * When we pulled down all of the aggregate data, we did a LEFT JOIN
		 * over the terms table to try to find all the term ids that
		 * already exist for our tokens. If any of the rows in the aggregate
		 * table have a term of 0, then no term record exists for that
		 * term so we need to add it to the terms table.
		 */
		$db->setQuery(
			'INSERT IGNORE INTO ' . $db->quoteName('#__finder_terms') .
			' (' . $db->quoteName('term') .
			', ' . $db->quoteName('stem') .
			', ' . $db->quoteName('common') .
			', ' . $db->quoteName('phrase') .
			', ' . $db->quoteName('weight') .
			', ' . $db->quoteName('soundex') .
			', ' . $db->quoteName('language') . ')' .
			' SELECT ta.term, ta.stem, ta.common, ta.phrase, ta.term_weight, SOUNDEX(ta.term), ta.language' .
			' FROM ' . $db->quoteName('#__finder_tokens_aggregate') . ' AS ta' .
			' WHERE ta.term_id = 0' .
			' GROUP BY ta.term, ta.stem, ta.common, ta.phrase, ta.term_weight, SOUNDEX(ta.term), ta.language'
		);
		$db->execute();

		/*
		 * Now, we just inserted a bunch of new records into the terms table
		 * so we need to go back and update the aggregate table with all the
		 * new term ids.
		 */
		$query = $db->getQuery(true)
			->update($db->quoteName('#__finder_tokens_aggregate') . ' AS ta')
			->join('INNER', $db->quoteName('#__finder_terms') . ' AS t ON t.term = ta.term')
			->set('ta.term_id = t.term_id')
			->where('ta.term_id = 0');
		$db->setQuery($query);
		$db->execute();

		// Mark afterTerms in the profiler.
		static::$profiler ? static::$profiler->mark('afterTerms') : null;

		/*
		 * After we've made sure that all of the terms are in the terms table
		 * and the aggregate table has the correct term ids, we need to update
		 * the links counter for each term by one.
		 */
		$query->clear()
			->update($db->quoteName('#__finder_terms') . ' AS t')
			->join('INNER', $db->quoteName('#__finder_tokens_aggregate') . ' AS ta ON ta.term_id = t.term_id')
			->set('t.' . $db->quoteName('links') . ' = t.links + 1');
		$db->setQuery($query);
		$db->execute();

		// Mark afterTerms in the profiler.
		static::$profiler ? static::$profiler->mark('afterTerms') : null;

		/*
		 * Before we can insert all of the mapping rows, we have to figure out
		 * which mapping table the rows need to be inserted into. The mapping
		 * table for each term is based on the first character of the md5 of
		 * the first character of the term. In php, it would be expressed as
		 * substr(md5(substr($token, 0, 1)), 0, 1)
		 */
		$query->clear()
			->update($db->quoteName('#__finder_tokens_aggregate'))
			->set($db->quoteName('map_suffix') . ' = SUBSTR(MD5(SUBSTR(' . $db->quoteName('term') . ', 1, 1)), 1, 1)');
		$db->setQuery($query);
		$db->execute();

		/*
		 * At this point, the aggregate table contains a record for each
		 * term in each context. So, we're going to pull down all of that
		 * data while grouping the records by term and add all of the
		 * sub-totals together to arrive at the final total for each token for
		 * this link. Then, we insert all of that data into the appropriate
		 * mapping table.
		 */
		for ($i = 0; $i <= 15; $i++)
		{
			// Get the mapping table suffix.
			$suffix = dechex($i);

			/*
			 * We have to run this query 16 times, one for each link => term
			 * mapping table.
			 */
			$db->setQuery(
				'INSERT INTO ' . $db->quoteName('#__finder_links_terms' . $suffix) .
				' (' . $db->quoteName('link_id') .
				', ' . $db->quoteName('term_id') .
				', ' . $db->quoteName('weight') . ')' .
				' SELECT ' . (int) $linkId . ', ' . $db->quoteName('term_id') . ',' .
				' ROUND(SUM(' . $db->quoteName('context_weight') . '), 8)' .
				' FROM ' . $db->quoteName('#__finder_tokens_aggregate') .
				' WHERE ' . $db->quoteName('map_suffix') . ' = ' . $db->quote($suffix) .
				' GROUP BY ' . $db->quoteName('term') . ', ' . $db->quoteName('term_id') .
				' ORDER BY ' . $db->quoteName('term') . ' DESC'
			);
			$db->execute();
		}

		// Mark afterMapping in the profiler.
		static::$profiler ? static::$profiler->mark('afterMapping') : null;

		// Update the signature.
		$object = serialize($item);
		$query->clear()
			->update($db->quoteName('#__finder_links'))
			->set($db->quoteName('md5sum') . ' = ' . $db->quote($curSig))
			->set($db->quoteName('object') . ' = ' . $db->quote($object))
			->where($db->quoteName('link_id') . ' = ' . $db->quote($linkId));
		$db->setQuery($query);
		$db->execute();

		// Mark afterSigning in the profiler.
		static::$profiler ? static::$profiler->mark('afterSigning') : null;

		// Truncate the tokens tables.
		$db->truncateTable('#__finder_tokens');

		// Truncate the tokens aggregate table.
		$db->truncateTable('#__finder_tokens_aggregate');

		// Toggle the token tables back to memory tables.
		$this->toggleTables(true);

		// Mark afterTruncating in the profiler.
		static::$profiler ? static::$profiler->mark('afterTruncating') : null;

		return $linkId;
	}

	/**
	 * Method to optimize the index. We use this method to remove unused terms
	 * and any other optimizations that might be necessary.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   3.0
	 * @throws  Exception on database error.
	 */
	public function optimize()
	{
		// Get the database object.
		$db = $this->db;
		$query = $db->getQuery(true);

		// Delete all orphaned terms.
		$query->delete($db->quoteName('#__finder_terms'))
			->where($db->quoteName('links') . ' <= 0');
		$db->setQuery($query);
		$db->execute();

		// Optimize the links table.
		$db->setQuery('OPTIMIZE TABLE ' . $db->quoteName('#__finder_links'));
		$db->execute();

		for ($i = 0; $i <= 15; $i++)
		{
			// Optimize the terms mapping table.
			$db->setQuery('OPTIMIZE TABLE ' . $db->quoteName('#__finder_links_terms' . dechex($i)));
			$db->execute();
		}

		// Optimize the filters table.
		$db->setQuery('OPTIMIZE TABLE ' . $db->quoteName('#__finder_filters'));
		$db->execute();

		// Optimize the terms common table.
		$db->setQuery('OPTIMIZE TABLE ' . $db->quoteName('#__finder_terms_common'));
		$db->execute();

		// Optimize the types table.
		$db->setQuery('OPTIMIZE TABLE ' . $db->quoteName('#__finder_types'));
		$db->execute();

		// Remove the orphaned taxonomy nodes.
		FinderIndexerTaxonomy::removeOrphanNodes();

		// Optimize the taxonomy mapping table.
		$db->setQuery('OPTIMIZE TABLE ' . $db->quoteName('#__finder_taxonomy_map'));
		$db->execute();

		// Optimize the taxonomy table.
		$db->setQuery('OPTIMIZE TABLE ' . $db->quoteName('#__finder_taxonomy'));
		$db->execute();

		return true;
	}


	/**
	 * Method to switch the token tables from Memory tables to MyISAM tables
	 * when they are close to running out of memory.
	 *
	 * @param   boolean  $memory  Flag to control how they should be toggled.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   3.0
	 * @throws  Exception on database error.
	 */
	protected function toggleTables($memory)
	{
		static $state;

		// Get the database adapter.
		$db = $this->db;

		// Check if we are setting the tables to the Memory engine.
		if ($memory === true && $state !== true)
		{
			// Set the tokens table to Memory.
			$db->setQuery('ALTER TABLE ' . $db->quoteName('#__finder_tokens') . ' ENGINE = MEMORY');
			$db->execute();

			// Set the tokens aggregate table to Memory.
			$db->setQuery('ALTER TABLE ' . $db->quoteName('#__finder_tokens_aggregate') . ' ENGINE = MEMORY');
			$db->execute();

			// Set the internal state.
			$state = $memory;
		}
		// We must be setting the tables to the MyISAM engine.
		elseif ($memory === false && $state !== false)
		{
			// Set the tokens table to MyISAM.
			$db->setQuery('ALTER TABLE ' . $db->quoteName('#__finder_tokens') . ' ENGINE = MYISAM');
			$db->execute();

			// Set the tokens aggregate table to MyISAM.
			$db->setQuery('ALTER TABLE ' . $db->quoteName('#__finder_tokens_aggregate') . ' ENGINE = MYISAM');
			$db->execute();

			// Set the internal state.
			$state = $memory;
		}

		return true;
	}
}
components/com_finder/helpers/indexer/driver/postgresql.php000060400000037550152453623450020364 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\String\StringHelper;

jimport('joomla.filesystem.file');

/**
 * Indexer class supporting PostgreSQL for the Finder indexer package.
 *
 * @since  3.0
 */
class FinderIndexerDriverPostgresql extends FinderIndexer
{
	/**
	 * Method to index a content item.
	 *
	 * @param   FinderIndexerResult  $item    The content item to index.
	 * @param   string               $format  The format of the content. [optional]
	 *
	 * @return  integer  The ID of the record in the links table.
	 *
	 * @since   3.0
	 * @throws  Exception on database error.
	 */
	public function index($item, $format = 'html')
	{
		// Mark beforeIndexing in the profiler.
		static::$profiler ? static::$profiler->mark('beforeIndexing') : null;
		$db = $this->db;
		$nd = $db->getNullDate();

		// Check if the item is in the database.
		$query = $db->getQuery(true)
			->select($db->quoteName('link_id') . ', ' . $db->quoteName('md5sum'))
			->from($db->quoteName('#__finder_links'))
			->where($db->quoteName('url') . ' = ' . $db->quote($item->url));

		// Load the item  from the database.
		$db->setQuery($query);
		$link = $db->loadObject();

		// Get the indexer state.
		$state = static::getState();

		// Get the signatures of the item.
		$curSig = static::getSignature($item);
		$oldSig = isset($link->md5sum) ? $link->md5sum : null;

		// Get the other item information.
		$linkId = empty($link->link_id) ? null : $link->link_id;
		$isNew = empty($link->link_id) ? true : false;

		// Check the signatures. If they match, the item is up to date.
		if (!$isNew && $curSig === $oldSig)
		{
			return $linkId;
		}

		/*
		 * If the link already exists, flush all the term maps for the item.
		 * Maps are stored in 16 tables so we need to iterate through and flush
		 * each table one at a time.
		 */
		if (!$isNew)
		{
			for ($i = 0; $i <= 15; $i++)
			{
				// Flush the maps for the link.
				$query->clear()
					->delete($db->quoteName('#__finder_links_terms' . dechex($i)))
					->where($db->quoteName('link_id') . ' = ' . (int) $linkId);
				$db->setQuery($query);
				$db->execute();
			}

			// Remove the taxonomy maps.
			FinderIndexerTaxonomy::removeMaps($linkId);
		}

		// Mark afterUnmapping in the profiler.
		static::$profiler ? static::$profiler->mark('afterUnmapping') : null;

		// Perform cleanup on the item data.
		$item->publish_start_date = (int) $item->publish_start_date != 0 ? $item->publish_start_date : $nd;
		$item->publish_end_date = (int) $item->publish_end_date != 0 ? $item->publish_end_date : $nd;
		$item->start_date = (int) $item->start_date != 0 ? $item->start_date : $nd;
		$item->end_date = (int) $item->end_date != 0 ? $item->end_date : $nd;

		// Prepare the item description.
		$item->description = FinderIndexerHelper::parse($item->summary);

		/*
		 * Now, we need to enter the item into the links table. If the item
		 * already exists in the database, we need to use an UPDATE query.
		 * Otherwise, we need to use an INSERT to get the link id back.
		 */

		$entry = new stdClass;
		$entry->url = $item->url;
		$entry->route = $item->route;
		$entry->title = $item->title;

		// We are shortening the description in order to not run into length issues with this field
		$entry->description = StringHelper::substr($item->description, 0, 32000);
		$entry->indexdate = Factory::getDate()->toSql();
		$entry->state = (int) $item->state;
		$entry->access = (int) $item->access;
		$entry->language = $item->language;
		$entry->type_id = (int) $item->type_id;
		$entry->object = '';
		$entry->publish_start_date = $item->publish_start_date;
		$entry->publish_end_date = $item->publish_end_date;
		$entry->start_date = $item->start_date;
		$entry->end_date = $item->end_date;
		$entry->list_price = (double) ($item->list_price ?: 0);
		$entry->sale_price = (double) ($item->sale_price ?: 0);

		if ($isNew)
		{
			// Insert the link and get its id.
			$db->insertObject('#__finder_links', $entry);
			$linkId = (int) $db->insertid();
		}
		else
		{
			// Update the link.
			$entry->link_id = $linkId;
			$db->updateObject('#__finder_links', $entry, 'link_id');
		}

		// Set up the variables we will need during processing.
		$count = 0;

		// Mark afterLinking in the profiler.
		static::$profiler ? static::$profiler->mark('afterLinking') : null;

		// Truncate the tokens tables.
		$db->truncateTable('#__finder_tokens');

		// Truncate the tokens aggregate table.
		$db->truncateTable('#__finder_tokens_aggregate');

		/*
		 * Process the item's content. The items can customize their
		 * processing instructions to define extra properties to process
		 * or rearrange how properties are weighted.
		 */
		foreach ($item->getInstructions() as $group => $properties)
		{
			// Iterate through the properties of the group.
			foreach ($properties as $property)
			{
				// Check if the property exists in the item.
				if (empty($item->$property))
				{
					continue;
				}

				// Tokenize the property.
				if (is_array($item->$property))
				{
					// Tokenize an array of content and add it to the database.
					foreach ($item->$property as $ip)
					{
						/*
						 * If the group is path, we need to a few extra processing
						 * steps to strip the extension and convert slashes and dashes
						 * to spaces.
						 */
						if ($group === static::PATH_CONTEXT)
						{
							$ip = JFile::stripExt($ip);
							$ip = str_replace(array('/', '-'), ' ', $ip);
						}

						// Tokenize a string of content and add it to the database.
						$count += $this->tokenizeToDb($ip, $group, $item->language, $format);

						// Check if we're approaching the memory limit of the token table.
						if ($count > static::$state->options->get('memory_table_limit', 30000))
						{
							$this->toggleTables(false);
						}
					}
				}
				else
				{
					/*
					 * If the group is path, we need to a few extra processing
					 * steps to strip the extension and convert slashes and dashes
					 * to spaces.
					 */
					if ($group === static::PATH_CONTEXT)
					{
						$item->$property = JFile::stripExt($item->$property);
						$item->$property = str_replace('/', ' ', $item->$property);
						$item->$property = str_replace('-', ' ', $item->$property);
					}

					// Tokenize a string of content and add it to the database.
					$count += $this->tokenizeToDb($item->$property, $group, $item->language, $format);

					// Check if we're approaching the memory limit of the token table.
					if ($count > static::$state->options->get('memory_table_limit', 30000))
					{
						$this->toggleTables(false);
					}
				}
			}
		}

		/*
		 * Process the item's taxonomy. The items can customize their
		 * taxonomy mappings to define extra properties to map.
		 */
		foreach ($item->getTaxonomy() as $branch => $nodes)
		{
			// Iterate through the nodes and map them to the branch.
			foreach ($nodes as $node)
			{
				// Add the node to the tree.
				$nodeId = FinderIndexerTaxonomy::addNode($branch, $node->title, $node->state, $node->access);

				// Add the link => node map.
				FinderIndexerTaxonomy::addMap($linkId, $nodeId);
			}
		}

		// Mark afterProcessing in the profiler.
		static::$profiler ? static::$profiler->mark('afterProcessing') : null;

		/*
		 * At this point, all of the item's content has been parsed, tokenized
		 * and inserted into the #__finder_tokens table. Now, we need to
		 * aggregate all the data into that table into a more usable form. The
		 * aggregated data will be inserted into #__finder_tokens_aggregate
		 * table.
		 */
		$query = 'INSERT INTO ' . $db->quoteName('#__finder_tokens_aggregate') .
			' (' . $db->quoteName('term_id') .
			', ' . $db->quoteName('map_suffix') .
			', ' . $db->quoteName('term') .
			', ' . $db->quoteName('stem') .
			', ' . $db->quoteName('common') .
			', ' . $db->quoteName('phrase') .
			', ' . $db->quoteName('term_weight') .
			', ' . $db->quoteName('context') .
			', ' . $db->quoteName('context_weight') .
			', ' . $db->quoteName('total_weight') .
			', ' . $db->quoteName('language') . ')' .
			' SELECT' .
			' COALESCE(t.term_id, 0), \'\', t1.term, t1.stem, t1.common, t1.phrase, t1.weight, t1.context,' .
			' ROUND( t1.weight * COUNT( t2.term ) * %F, 8 ) AS context_weight, 0, t1.language' .
			' FROM (' .
			'   SELECT DISTINCT t1.term, t1.stem, t1.common, t1.phrase, t1.weight, t1.context, t1.language' .
			'   FROM ' . $db->quoteName('#__finder_tokens') . ' AS t1' .
			'   WHERE t1.context = %d' .
			' ) AS t1' .
			' JOIN ' . $db->quoteName('#__finder_tokens') . ' AS t2 ON t2.term = t1.term AND t2.language = t1.language' .
			' LEFT JOIN ' . $db->quoteName('#__finder_terms') . ' AS t ON t.term = t1.term ' .
			' WHERE t2.context = %d' .
			' GROUP BY t1.term, t.term_id, t1.stem, t1.common, t1.phrase, t1.weight, t1.context, t1.language' .
			' ORDER BY t1.term DESC';

		// Iterate through the contexts and aggregate the tokens per context.
		foreach ($state->weights as $context => $multiplier)
		{
			// Run the query to aggregate the tokens for this context..
			$db->setQuery(sprintf($query, $multiplier, $context, $context));
			$db->execute();
		}

		// Mark afterAggregating in the profiler.
		static::$profiler ? static::$profiler->mark('afterAggregating') : null;

		/*
		 * When we pulled down all of the aggregate data, we did a LEFT JOIN
		 * over the terms table to try to find all the term ids that
		 * already exist for our tokens. If any of the rows in the aggregate
		 * table have a term of 0, then no term record exists for that
		 * term so we need to add it to the terms table.
		 */
		$db->setQuery(
			'INSERT INTO ' . $db->quoteName('#__finder_terms') .
			' (' . $db->quoteName('term') .
			', ' . $db->quoteName('stem') .
			', ' . $db->quoteName('common') .
			', ' . $db->quoteName('phrase') .
			', ' . $db->quoteName('weight') .
			', ' . $db->quoteName('soundex') .
			', ' . $db->quoteName('language') . ')' .
			' SELECT ta.term, ta.stem, ta.common, ta.phrase, ta.term_weight, SOUNDEX(ta.term), ta.language' .
			' FROM ' . $db->quoteName('#__finder_tokens_aggregate') . ' AS ta' .
			' WHERE ta.term_id = 0' .
			' GROUP BY ta.term, ta.stem, ta.common, ta.phrase, ta.term_weight, SOUNDEX(ta.term), ta.language'
		);
		$db->execute();

		/*
		 * Now, we just inserted a bunch of new records into the terms table
		 * so we need to go back and update the aggregate table with all the
		 * new term ids.
		 */
		$query = $db->getQuery(true)
			->update($db->quoteName('#__finder_tokens_aggregate') . ' AS ta')
			->join('INNER', $db->quoteName('#__finder_terms') . ' AS t ON t.term = ta.term')
			->set('term_id = t.term_id')
			->where('ta.term_id = 0');
		$db->setQuery($query);
		$db->execute();

		// Mark afterTerms in the profiler.
		static::$profiler ? static::$profiler->mark('afterTerms') : null;

		/*
		 * After we've made sure that all of the terms are in the terms table
		 * and the aggregate table has the correct term ids, we need to update
		 * the links counter for each term by one.
		 */
		$query->clear()
			->update($db->quoteName('#__finder_terms') . ' AS t')
			->join('INNER', $db->quoteName('#__finder_tokens_aggregate') . ' AS ta ON ta.term_id = t.term_id')
			->set($db->quoteName('links') . ' = t.links + 1');
		$db->setQuery($query);
		$db->execute();

		// Mark afterTerms in the profiler.
		static::$profiler ? static::$profiler->mark('afterTerms') : null;

		/*
		 * Before we can insert all of the mapping rows, we have to figure out
		 * which mapping table the rows need to be inserted into. The mapping
		 * table for each term is based on the first character of the md5 of
		 * the first character of the term. In php, it would be expressed as
		 * substr(md5(substr($token, 0, 1)), 0, 1)
		 */
		$query->clear()
			->update($db->quoteName('#__finder_tokens_aggregate'))
			->set($db->quoteName('map_suffix') . ' = SUBSTR(MD5(SUBSTR(' . $db->quoteName('term') . ', 1, 1)), 1, 1)');
		$db->setQuery($query);
		$db->execute();

		/*
		 * At this point, the aggregate table contains a record for each
		 * term in each context. So, we're going to pull down all of that
		 * data while grouping the records by term and add all of the
		 * sub-totals together to arrive at the final total for each token for
		 * this link. Then, we insert all of that data into the appropriate
		 * mapping table.
		 */
		for ($i = 0; $i <= 15; $i++)
		{
			// Get the mapping table suffix.
			$suffix = dechex($i);

			/*
			 * We have to run this query 16 times, one for each link => term
			 * mapping table.
			 */
			$db->setQuery(
				'INSERT INTO ' . $db->quoteName('#__finder_links_terms' . $suffix) .
				' (' . $db->quoteName('link_id') .
				', ' . $db->quoteName('term_id') .
				', ' . $db->quoteName('weight') . ')' .
				' SELECT ' . (int) $linkId . ', ' . $db->quoteName('term_id') . ',' .
				' ROUND(SUM(' . $db->quoteName('context_weight') . '), 8)' .
				' FROM ' . $db->quoteName('#__finder_tokens_aggregate') .
				' WHERE ' . $db->quoteName('map_suffix') . ' = ' . $db->quote($suffix) .
				' GROUP BY ' . $db->quoteName('term') . ', ' . $db->quoteName('term_id') .
				' ORDER BY ' . $db->quoteName('term') . ' DESC'
			);
			$db->execute();
		}

		// Mark afterMapping in the profiler.
		static::$profiler ? static::$profiler->mark('afterMapping') : null;

		// Update the signature.
		$object = serialize($item);
		$query->clear()
			->update($db->quoteName('#__finder_links'))
			->set($db->quoteName('md5sum') . ' = ' . $db->quote($curSig))
			->set($db->quoteName('object') . ' = ' . $db->quote(pg_escape_bytea($object)))
			->where($db->quoteName('link_id') . ' = ' . $db->quote($linkId));
		$db->setQuery($query);
		$db->execute();

		// Mark afterSigning in the profiler.
		static::$profiler ? static::$profiler->mark('afterSigning') : null;

		// Truncate the tokens tables.
		$db->truncateTable('#__finder_tokens');

		// Truncate the tokens aggregate table.
		$db->truncateTable('#__finder_tokens_aggregate');

		// Toggle the token tables back to memory tables.
		$this->toggleTables(true);

		// Mark afterTruncating in the profiler.
		static::$profiler ? static::$profiler->mark('afterTruncating') : null;

		return $linkId;
	}

	/**
	 * Method to optimize the index. We use this method to remove unused terms
	 * and any other optimizations that might be necessary.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public function optimize()
	{
		// Get the database object.
		$db = $this->db;
		$query = $db->getQuery(true);

		// Delete all orphaned terms.
		$query->delete($db->quoteName('#__finder_terms'))
			->where($db->quoteName('links') . ' <= 0');
		$db->setQuery($query);
		$db->execute();

		// Optimize the links table.
		$db->setQuery('VACUUM ' . $db->quoteName('#__finder_links'));
		$db->execute();
		$db->setQuery('REINDEX TABLE ' . $db->quoteName('#__finder_links'));
		$db->execute();

		for ($i = 0; $i <= 15; $i++)
		{
			// Optimize the terms mapping table.
			$db->setQuery('VACUUM ' . $db->quoteName('#__finder_links_terms' . dechex($i)));
			$db->execute();
			$db->setQuery('REINDEX TABLE ' . $db->quoteName('#__finder_links_terms' . dechex($i)));
			$db->execute();
		}

		// Optimize the filters table.
		$db->setQuery('REINDEX TABLE ' . $db->quoteName('#__finder_filters'));
		$db->execute();

		// Optimize the terms common table.
		$db->setQuery('REINDEX TABLE ' . $db->quoteName('#__finder_terms_common'));
		$db->execute();

		// Optimize the types table.
		$db->setQuery('REINDEX TABLE ' . $db->quoteName('#__finder_types'));
		$db->execute();

		// Remove the orphaned taxonomy nodes.
		FinderIndexerTaxonomy::removeOrphanNodes();

		// Optimize the taxonomy mapping table.
		$db->setQuery('REINDEX TABLE ' . $db->quoteName('#__finder_taxonomy_map'));
		$db->execute();

		// Optimize the taxonomy table.
		$db->setQuery('REINDEX TABLE ' . $db->quoteName('#__finder_taxonomy'));
		$db->execute();

		return true;
	}
}
components/com_finder/helpers/indexer/driver/sqlsrv.php000060400000043472152453623450017513 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

jimport('joomla.filesystem.file');

/**
 * Indexer class supporting SQL Server for the Finder indexer package.
 *
 * The indexer class provides the core functionality of the Finder
 * search engine. It is responsible for adding and updating the
 * content links table; extracting and scoring tokens; and maintaining
 * all referential information for the content.
 *
 * Note: All exceptions thrown from within this class should be caught
 * by the controller.
 *
 * @since  3.1
 */
class FinderIndexerDriverSqlsrv extends FinderIndexer
{
	/**
	 * Method to index a content item.
	 *
	 * @param   FinderIndexerResult  $item    The content item to index.
	 * @param   string               $format  The format of the content. [optional]
	 *
	 * @return  integer  The ID of the record in the links table.
	 *
	 * @since   3.1
	 * @throws  Exception on database error.
	 */
	public function index($item, $format = 'html')
	{
		// Mark beforeIndexing in the profiler.
		static::$profiler ? static::$profiler->mark('beforeIndexing') : null;
		$db = $this->db;
		$nd = $db->getNullDate();

		// Check if the item is in the database.
		$query = $db->getQuery(true)
			->select($db->quoteName('link_id') . ', ' . $db->quoteName('md5sum'))
			->from($db->quoteName('#__finder_links'))
			->where($db->quoteName('url') . ' = ' . $db->quote($item->url));

		// Load the item  from the database.
		$db->setQuery($query);
		$link = $db->loadObject();

		// Get the indexer state.
		$state = static::getState();

		// Get the signatures of the item.
		$curSig = static::getSignature($item);
		$oldSig = isset($link->md5sum) ? $link->md5sum : null;

		// Get the other item information.
		$linkId = empty($link->link_id) ? null : $link->link_id;
		$isNew = empty($link->link_id) ? true : false;

		// Check the signatures. If they match, the item is up to date.
		if (!$isNew && $curSig === $oldSig)
		{
			return $linkId;
		}

		/*
		 * If the link already exists, flush all the term maps for the item.
		 * Maps are stored in 16 tables so we need to iterate through and flush
		 * each table one at a time.
		 */
		if (!$isNew)
		{
			for ($i = 0; $i <= 15; $i++)
			{
				// Flush the maps for the link.
				$query->clear()
					->delete($db->quoteName('#__finder_links_terms' . dechex($i)))
					->where($db->quoteName('link_id') . ' = ' . (int) $linkId);
				$db->setQuery($query);
				$db->execute();
			}

			// Remove the taxonomy maps.
			FinderIndexerTaxonomy::removeMaps($linkId);
		}

		// Mark afterUnmapping in the profiler.
		static::$profiler ? static::$profiler->mark('afterUnmapping') : null;

		// Perform cleanup on the item data.
		$item->publish_start_date = (int) $item->publish_start_date != 0 ? $item->publish_start_date : $nd;
		$item->publish_end_date = (int) $item->publish_end_date != 0 ? $item->publish_end_date : $nd;
		$item->start_date = (int) $item->start_date != 0 ? $item->start_date : $nd;
		$item->end_date = (int) $item->end_date != 0 ? $item->end_date : $nd;

		// Prepare the item description.
		$item->description = FinderIndexerHelper::parse($item->summary);

		/*
		 * Now, we need to enter the item into the links table. If the item
		 * already exists in the database, we need to use an UPDATE query.
		 * Otherwise, we need to use an INSERT to get the link id back.
		 */

		if ($isNew)
		{
			$columnsArray = array(
				$db->quoteName('url'), $db->quoteName('route'), $db->quoteName('title'), $db->quoteName('description'),
				$db->quoteName('indexdate'), $db->quoteName('published'), $db->quoteName('state'), $db->quoteName('access'),
				$db->quoteName('language'), $db->quoteName('type_id'), $db->quoteName('object'), $db->quoteName('publish_start_date'),
				$db->quoteName('publish_end_date'), $db->quoteName('start_date'), $db->quoteName('end_date'), $db->quoteName('list_price'),
				$db->quoteName('sale_price')
			);

			// Insert the link.
			$query->clear()
				->insert($db->quoteName('#__finder_links'))
				->columns($columnsArray)
				->values(
					$db->quote($item->url) . ', '
					. $db->quote($item->route) . ', '
					. $db->quote($item->title) . ', '
					. $db->quote($item->description) . ', '
					. $query->currentTimestamp() . ', '
					. '1, '
					. (int) $item->state . ', '
					. (int) $item->access . ', '
					. $db->quote($item->language) . ', '
					. (int) $item->type_id . ', '
					. $db->quote(serialize($item)) . ', '
					. $db->quote($item->publish_start_date) . ', '
					. $db->quote($item->publish_end_date) . ', '
					. $db->quote($item->start_date) . ', '
					. $db->quote($item->end_date) . ', '
					. (double) ($item->list_price ?: 0) . ', '
					. (double) ($item->sale_price ?: 0)
				);
			$db->setQuery($query);
			$db->execute();

			// Get the link id.
			$linkId = (int) $db->insertid();
		}
		else
		{
			// Update the link.
			$query->clear()
				->update($db->quoteName('#__finder_links'))
				->set($db->quoteName('route') . ' = ' . $db->quote($item->route))
				->set($db->quoteName('title') . ' = ' . $db->quote($item->title))
				->set($db->quoteName('description') . ' = ' . $db->quote($item->description))
				->set($db->quoteName('indexdate') . ' = ' . $query->currentTimestamp())
				->set($db->quoteName('state') . ' = ' . (int) $item->state)
				->set($db->quoteName('access') . ' = ' . (int) $item->access)
				->set($db->quoteName('language') . ' = ' . $db->quote($item->language))
				->set($db->quoteName('type_id') . ' = ' . (int) $item->type_id)
				->set($db->quoteName('object') . ' = ' . $db->quote(serialize($item)))
				->set($db->quoteName('publish_start_date') . ' = ' . $db->quote($item->publish_start_date))
				->set($db->quoteName('publish_end_date') . ' = ' . $db->quote($item->publish_end_date))
				->set($db->quoteName('start_date') . ' = ' . $db->quote($item->start_date))
				->set($db->quoteName('end_date') . ' = ' . $db->quote($item->end_date))
				->set($db->quoteName('list_price') . ' = ' . (double) ($item->list_price ?: 0))
				->set($db->quoteName('sale_price') . ' = ' . (double) ($item->sale_price ?: 0))
				->where('link_id = ' . (int) $linkId);
			$db->setQuery($query);
			$db->execute();
		}

		// Set up the variables we will need during processing.
		$count = 0;

		// Mark afterLinking in the profiler.
		static::$profiler ? static::$profiler->mark('afterLinking') : null;

		// Truncate the tokens tables.
		$db->truncateTable('#__finder_tokens');

		// Truncate the tokens aggregate table.
		$db->truncateTable('#__finder_tokens_aggregate');

		/*
		 * Process the item's content. The items can customize their
		 * processing instructions to define extra properties to process
		 * or rearrange how properties are weighted.
		 */
		foreach ($item->getInstructions() as $group => $properties)
		{
			// Iterate through the properties of the group.
			foreach ($properties as $property)
			{
				// Check if the property exists in the item.
				if (empty($item->$property))
				{
					continue;
				}

				// Tokenize the property.
				if (is_array($item->$property))
				{
					// Tokenize an array of content and add it to the database.
					foreach ($item->$property as $ip)
					{
						/*
						 * If the group is path, we need to a few extra processing
						 * steps to strip the extension and convert slashes and dashes
						 * to spaces.
						 */
						if ($group === static::PATH_CONTEXT)
						{
							$ip = JFile::stripExt($ip);
							$ip = str_replace(array('/', '-'), ' ', $ip);
						}

						// Tokenize a string of content and add it to the database.
						$count += $this->tokenizeToDb($ip, $group, $item->language, $format);

						// Check if we're approaching the memory limit of the token table.
						if ($count > static::$state->options->get('memory_table_limit', 30000))
						{
							$this->toggleTables(false);
						}
					}
				}
				else
				{
					/*
					 * If the group is path, we need to a few extra processing
					 * steps to strip the extension and convert slashes and dashes
					 * to spaces.
					 */
					if ($group === static::PATH_CONTEXT)
					{
						$item->$property = JFile::stripExt($item->$property);
						$item->$property = str_replace('/', ' ', $item->$property);
						$item->$property = str_replace('-', ' ', $item->$property);
					}

					// Tokenize a string of content and add it to the database.
					$count += $this->tokenizeToDb($item->$property, $group, $item->language, $format);

					// Check if we're approaching the memory limit of the token table.
					if ($count > static::$state->options->get('memory_table_limit', 30000))
					{
						$this->toggleTables(false);
					}
				}
			}
		}

		/*
		 * Process the item's taxonomy. The items can customize their
		 * taxonomy mappings to define extra properties to map.
		 */
		foreach ($item->getTaxonomy() as $branch => $nodes)
		{
			// Iterate through the nodes and map them to the branch.
			foreach ($nodes as $node)
			{
				// Add the node to the tree.
				$nodeId = FinderIndexerTaxonomy::addNode($branch, $node->title, $node->state, $node->access);

				// Add the link => node map.
				FinderIndexerTaxonomy::addMap($linkId, $nodeId);
			}
		}

		// Mark afterProcessing in the profiler.
		static::$profiler ? static::$profiler->mark('afterProcessing') : null;

		/*
		 * At this point, all of the item's content has been parsed, tokenized
		 * and inserted into the #__finder_tokens table. Now, we need to
		 * aggregate all the data into that table into a more usable form. The
		 * aggregated data will be inserted into #__finder_tokens_aggregate
		 * table.
		 */
		$query = 'INSERT INTO ' . $db->quoteName('#__finder_tokens_aggregate') .
				' (' . $db->quoteName('term_id') .
				', ' . $db->quoteName('term') .
				', ' . $db->quoteName('stem') .
				', ' . $db->quoteName('common') .
				', ' . $db->quoteName('phrase') .
				', ' . $db->quoteName('term_weight') .
				', ' . $db->quoteName('context') .
				', ' . $db->quoteName('context_weight') .
				', ' . $db->quoteName('language') . ')' .
				' SELECT' .
				' t.term_id, t1.term, t1.stem, t1.common, t1.phrase, t1.weight, t1.context,' .
				' ROUND( t1.weight * COUNT( t2.term ) * %F, 8 ) AS context_weight, t1.language' .
				' FROM (' .
				'   SELECT DISTINCT t1.term, t1.stem, t1.common, t1.phrase, t1.weight, t1.context, t1.language' .
				'   FROM ' . $db->quoteName('#__finder_tokens') . ' AS t1' .
				'   WHERE t1.context = %d' .
				' ) AS t1' .
				' JOIN ' . $db->quoteName('#__finder_tokens') . ' AS t2 ON t2.term = t1.term' .
				' LEFT JOIN ' . $db->quoteName('#__finder_terms') . ' AS t ON t.term = t1.term' .
				' WHERE t2.context = %d' .
				' GROUP BY t1.term, t.term_id, t1.term, t1.stem, t1.common, t1.phrase, t1.weight, t1.context, t1.language' .
				' ORDER BY t1.term DESC';

		// Iterate through the contexts and aggregate the tokens per context.
		foreach ($state->weights as $context => $multiplier)
		{
			// Run the query to aggregate the tokens for this context..
			$db->setQuery(sprintf($query, $multiplier, $context, $context));
			$db->execute();
		}

		// Mark afterAggregating in the profiler.
		static::$profiler ? static::$profiler->mark('afterAggregating') : null;

		/*
		 * When we pulled down all of the aggregate data, we did a LEFT JOIN
		 * over the terms table to try to find all the term ids that
		 * already exist for our tokens. If any of the rows in the aggregate
		 * table have a term of 0, then no term record exists for that
		 * term so we need to add it to the terms table.
		 */
		$db->setQuery(
			'INSERT INTO ' . $db->quoteName('#__finder_terms') .
			' (' . $db->quoteName('term') .
			', ' . $db->quoteName('stem') .
			', ' . $db->quoteName('common') .
			', ' . $db->quoteName('phrase') .
			', ' . $db->quoteName('weight') .
			', ' . $db->quoteName('soundex') . ')' .
			' SELECT ta.term, ta.stem, ta.common, ta.phrase, ta.term_weight, SOUNDEX(ta.term)' .
			' FROM ' . $db->quoteName('#__finder_tokens_aggregate') . ' AS ta' .
			' WHERE ta.term_id IS NULL' .
			' GROUP BY ta.term, ta.stem, ta.common, ta.phrase, ta.term_weight'
		);
		$db->execute();

		/*
		 * Now, we just inserted a bunch of new records into the terms table
		 * so we need to go back and update the aggregate table with all the
		 * new term ids.
		 */
		$query = $db->getQuery(true)
			->update('ta')
			->set('ta.term_id = t.term_id from #__finder_tokens_aggregate AS ta INNER JOIN #__finder_terms AS t ON t.term = ta.term')
			->where('ta.term_id IS NULL');
		$db->setQuery($query);
		$db->execute();

		// Mark afterTerms in the profiler.
		static::$profiler ? static::$profiler->mark('afterTerms') : null;

		/*
		 * After we've made sure that all of the terms are in the terms table
		 * and the aggregate table has the correct term ids, we need to update
		 * the links counter for each term by one.
		 */
		$query->clear()
			->update('t')
			->set('t.links = t.links + 1 FROM #__finder_terms AS t INNER JOIN #__finder_tokens_aggregate AS ta ON ta.term_id = t.term_id');
		$db->setQuery($query);
		$db->execute();

		// Mark afterTerms in the profiler.
		static::$profiler ? static::$profiler->mark('afterTerms') : null;

		/*
		 * Before we can insert all of the mapping rows, we have to figure out
		 * which mapping table the rows need to be inserted into. The mapping
		 * table for each term is based on the first character of the md5 of
		 * the first character of the term. In php, it would be expressed as
		 * substr(md5(substr($token, 0, 1)), 0, 1)
		 */
		$query->clear()
			->update($db->quoteName('#__finder_tokens_aggregate'))
			->set($db->quoteName('map_suffix') . " = SUBSTRING(HASHBYTES('MD5', SUBSTRING(" . $db->quoteName('term') . ', 1, 1)), 1, 1)');
		$db->setQuery($query);
		$db->execute();

		/*
		 * At this point, the aggregate table contains a record for each
		 * term in each context. So, we're going to pull down all of that
		 * data while grouping the records by term and add all of the
		 * sub-totals together to arrive at the final total for each token for
		 * this link. Then, we insert all of that data into the appropriate
		 * mapping table.
		 */
		for ($i = 0; $i <= 15; $i++)
		{
			// Get the mapping table suffix.
			$suffix = dechex($i);

			/*
			 * We have to run this query 16 times, one for each link => term
			 * mapping table.
			 */
			$db->setQuery(
				'INSERT INTO ' . $db->quoteName('#__finder_links_terms' . $suffix) .
				' (' . $db->quoteName('link_id') .
				', ' . $db->quoteName('term_id') .
				', ' . $db->quoteName('weight') . ')' .
				' SELECT ' . (int) $linkId . ', ' . $db->quoteName('term_id') . ',' .
				' ROUND(SUM(' . $db->quoteName('context_weight') . '), 8)' .
				' FROM ' . $db->quoteName('#__finder_tokens_aggregate') .
				' WHERE ' . $db->quoteName('map_suffix') . ' = ' . $db->quote($suffix) .
				' GROUP BY term, term_id' .
				' ORDER BY ' . $db->quoteName('term') . ' DESC'
			);
			$db->execute();
		}

		// Mark afterMapping in the profiler.
		static::$profiler ? static::$profiler->mark('afterMapping') : null;

		// Update the signature.
		$query->clear()
			->update($db->quoteName('#__finder_links'))
			->set($db->quoteName('md5sum') . ' = ' . $db->quote($curSig))
			->where($db->quoteName('link_id') . ' = ' . $db->quote($linkId));
		$db->setQuery($query);
		$db->execute();

		// Mark afterSigning in the profiler.
		static::$profiler ? static::$profiler->mark('afterSigning') : null;

		// Truncate the tokens tables.
		$db->truncateTable('#__finder_tokens');

		// Truncate the tokens aggregate table.
		$db->truncateTable('#__finder_tokens_aggregate');

		// Toggle the token tables back to memory tables.
		$this->toggleTables(true);

		// Mark afterTruncating in the profiler.
		static::$profiler ? static::$profiler->mark('afterTruncating') : null;

		return $linkId;
	}

	/**
	 * Method to remove a link from the index.
	 *
	 * @param   integer  $linkId  The id of the link.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   3.1
	 * @throws  Exception on database error.
	 */
	public function remove($linkId)
	{
		$db = $this->db;
		$query = $db->getQuery(true);

		// Update the link counts and remove the mapping records.
		for ($i = 0; $i <= 15; $i++)
		{
			// Update the link counts for the terms.
			$query->update('t')
				->set('t.links = t.links - 1 from #__finder_terms AS t INNER JOIN #__finder_links_terms' . dechex($i) . ' AS m ON m.term_id = t.term_id')
				->where('m.link_id = ' . $db->quote((int) $linkId));
			$db->setQuery($query);
			$db->execute();

			// Remove all records from the mapping tables.
			$query->clear()
				->delete($db->quoteName('#__finder_links_terms' . dechex($i)))
				->where($db->quoteName('link_id') . ' = ' . (int) $linkId);
			$db->setQuery($query);
			$db->execute();
		}

		// Delete all orphaned terms.
		$query->clear()
			->delete($db->quoteName('#__finder_terms'))
			->where($db->quoteName('links') . ' <= 0');
		$db->setQuery($query);
		$db->execute();

		// Delete the link from the index.
		$query->clear()
			->delete($db->quoteName('#__finder_links'))
			->where($db->quoteName('link_id') . ' = ' . $db->quote((int) $linkId));
		$db->setQuery($query);
		$db->execute();

		// Remove the taxonomy maps.
		FinderIndexerTaxonomy::removeMaps($linkId);

		// Remove the orphaned taxonomy nodes.
		FinderIndexerTaxonomy::removeOrphanNodes();

		return true;
	}

	/**
	 * Method to optimize the index. We use this method to remove unused terms
	 * and any other optimizations that might be necessary.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   3.1
	 * @throws  Exception on database error.
	 */
	public function optimize()
	{
		// Get the database object.
		$db = $this->db;
		$query = $db->getQuery(true);

		// Delete all orphaned terms.
		$query->delete($db->quoteName('#__finder_terms'))
			->where($db->quoteName('links') . ' <= 0');
		$db->setQuery($query);
		$db->execute();

		// Remove the orphaned taxonomy nodes.
		FinderIndexerTaxonomy::removeOrphanNodes();

		return true;
	}
}
components/com_finder/helpers/indexer/stemmer/porter_en.php000060400000023413152453623450020330 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('FinderIndexerStemmer', dirname(__DIR__) . '/stemmer.php');

/**
 * Porter English stemmer class for the Finder indexer package.
 *
 * This class was adapted from one written by Richard Heyes.
 * See copyright and link information above.
 *
 * @since  2.5
 */
class FinderIndexerStemmerPorter_En extends FinderIndexerStemmer
{
	/**
	 * Regex for matching a consonant.
	 *
	 * @var    string
	 * @since  2.5
	 */
	private static $regex_consonant = '(?:[bcdfghjklmnpqrstvwxz]|(?<=[aeiou])y|^y)';

	/**
	 * Regex for matching a vowel
	 *
	 * @var    string
	 * @since  2.5
	 */
	private static $regex_vowel = '(?:[aeiou]|(?<![aeiou])y)';

	/**
	 * Method to stem a token and return the root.
	 *
	 * @param   string  $token  The token to stem.
	 * @param   string  $lang   The language of the token.
	 *
	 * @return  string  The root token.
	 *
	 * @since   2.5
	 */
	public function stem($token, $lang)
	{
		// Check if the token is long enough to merit stemming.
		if (strlen($token) <= 2)
		{
			return $token;
		}

		// Check if the language is English or All.
		if ($lang !== 'en' && $lang !== '*')
		{
			return $token;
		}

		// Stem the token if it is not in the cache.
		if (!isset($this->cache[$lang][$token]))
		{
			// Stem the token.
			$result = $token;
			$result = self::step1ab($result);
			$result = self::step1c($result);
			$result = self::step2($result);
			$result = self::step3($result);
			$result = self::step4($result);
			$result = self::step5($result);

			// Add the token to the cache.
			$this->cache[$lang][$token] = $result;
		}

		return $this->cache[$lang][$token];
	}

	/**
	 * Step 1
	 *
	 * @param   string  $word  The token to stem.
	 *
	 * @return  string
	 *
	 * @since   2.5
	 */
	private static function step1ab($word)
	{
		// Part a
		if (substr($word, -1) === 's')
		{
			self::replace($word, 'sses', 'ss')
			|| self::replace($word, 'ies', 'i')
			|| self::replace($word, 'ss', 'ss')
			|| self::replace($word, 's', '');
		}

		// Part b
		if (substr($word, -2, 1) !== 'e' || !self::replace($word, 'eed', 'ee', 0))
		{
			// First rule
			$v = self::$regex_vowel;

			// Words ending with ing and ed
			// Note use of && and OR, for precedence reasons
			if (preg_match("#$v+#", substr($word, 0, -3)) && self::replace($word, 'ing', '')
				|| preg_match("#$v+#", substr($word, 0, -2)) && self::replace($word, 'ed', ''))
			{
				// If one of above two test successful
				if (!self::replace($word, 'at', 'ate') && !self::replace($word, 'bl', 'ble') && !self::replace($word, 'iz', 'ize'))
				{
					// Double consonant ending
					$wordSubStr = substr($word, -2);

					if ($wordSubStr !== 'll' && $wordSubStr !== 'ss' && $wordSubStr !== 'zz' && self::doubleConsonant($word))
					{
						$word = substr($word, 0, -1);
					}
					elseif (self::m($word) === 1 && self::cvc($word))
					{
						$word .= 'e';
					}
				}
			}
		}

		return $word;
	}

	/**
	 * Step 1c
	 *
	 * @param   string  $word  The token to stem.
	 *
	 * @return  string
	 *
	 * @since   2.5
	 */
	private static function step1c($word)
	{
		$v = self::$regex_vowel;

		if (substr($word, -1) === 'y' && preg_match("#$v+#", substr($word, 0, -1)))
		{
			self::replace($word, 'y', 'i');
		}

		return $word;
	}

	/**
	 * Step 2
	 *
	 * @param   string  $word  The token to stem.
	 *
	 * @return  string
	 *
	 * @since   2.5
	 */
	private static function step2($word)
	{
		switch (substr($word, -2, 1))
		{
			case 'a':
				self::replace($word, 'ational', 'ate', 0)
				|| self::replace($word, 'tional', 'tion', 0);
				break;
			case 'c':
				self::replace($word, 'enci', 'ence', 0)
				|| self::replace($word, 'anci', 'ance', 0);
				break;
			case 'e':
				self::replace($word, 'izer', 'ize', 0);
				break;
			case 'g':
				self::replace($word, 'logi', 'log', 0);
				break;
			case 'l':
				self::replace($word, 'entli', 'ent', 0)
				|| self::replace($word, 'ousli', 'ous', 0)
				|| self::replace($word, 'alli', 'al', 0)
				|| self::replace($word, 'bli', 'ble', 0)
				|| self::replace($word, 'eli', 'e', 0);
				break;
			case 'o':
				self::replace($word, 'ization', 'ize', 0)
				|| self::replace($word, 'ation', 'ate', 0)
				|| self::replace($word, 'ator', 'ate', 0);
				break;
			case 's':
				self::replace($word, 'iveness', 'ive', 0)
				|| self::replace($word, 'fulness', 'ful', 0)
				|| self::replace($word, 'ousness', 'ous', 0)
				|| self::replace($word, 'alism', 'al', 0);
				break;
			case 't':
				self::replace($word, 'biliti', 'ble', 0)
				|| self::replace($word, 'aliti', 'al', 0)
				|| self::replace($word, 'iviti', 'ive', 0);
				break;
		}

		return $word;
	}

	/**
	 * Step 3
	 *
	 * @param   string  $word  The token to stem.
	 *
	 * @return  string
	 *
	 * @since   2.5
	 */
	private static function step3($word)
	{
		switch (substr($word, -2, 1))
		{
			case 'a':
				self::replace($word, 'ical', 'ic', 0);
				break;
			case 's':
				self::replace($word, 'ness', '', 0);
				break;
			case 't':
				self::replace($word, 'icate', 'ic', 0)
				|| self::replace($word, 'iciti', 'ic', 0);
				break;
			case 'u':
				self::replace($word, 'ful', '', 0);
				break;
			case 'v':
				self::replace($word, 'ative', '', 0);
				break;
			case 'z':
				self::replace($word, 'alize', 'al', 0);
				break;
		}

		return $word;
	}

	/**
	 * Step 4
	 *
	 * @param   string  $word  The token to stem.
	 *
	 * @return  string
	 *
	 * @since   2.5
	 */
	private static function step4($word)
	{
		switch (substr($word, -2, 1))
		{
			case 'a':
				self::replace($word, 'al', '', 1);
				break;
			case 'c':
				self::replace($word, 'ance', '', 1)
				|| self::replace($word, 'ence', '', 1);
				break;
			case 'e':
				self::replace($word, 'er', '', 1);
				break;
			case 'i':
				self::replace($word, 'ic', '', 1);
				break;
			case 'l':
				self::replace($word, 'able', '', 1)
				|| self::replace($word, 'ible', '', 1);
				break;
			case 'n':
				self::replace($word, 'ant', '', 1)
				|| self::replace($word, 'ement', '', 1)
				|| self::replace($word, 'ment', '', 1)
				|| self::replace($word, 'ent', '', 1);
				break;
			case 'o':
				$wordSubStr = substr($word, -4);

				if ($wordSubStr === 'tion' || $wordSubStr === 'sion')
				{
					self::replace($word, 'ion', '', 1);
				}
				else
				{
					self::replace($word, 'ou', '', 1);
				}
				break;
			case 's':
				self::replace($word, 'ism', '', 1);
				break;
			case 't':
				self::replace($word, 'ate', '', 1)
				|| self::replace($word, 'iti', '', 1);
				break;
			case 'u':
				self::replace($word, 'ous', '', 1);
				break;
			case 'v':
				self::replace($word, 'ive', '', 1);
				break;
			case 'z':
				self::replace($word, 'ize', '', 1);
				break;
		}

		return $word;
	}

	/**
	 * Step 5
	 *
	 * @param   string  $word  The token to stem.
	 *
	 * @return  string
	 *
	 * @since   2.5
	 */
	private static function step5($word)
	{
		// Part a
		if (substr($word, -1) === 'e')
		{
			if (self::m(substr($word, 0, -1)) > 1)
			{
				self::replace($word, 'e', '');
			}
			elseif (self::m(substr($word, 0, -1)) === 1)
			{
				if (!self::cvc(substr($word, 0, -1)))
				{
					self::replace($word, 'e', '');
				}
			}
		}

		// Part b
		if (self::m($word) > 1 && self::doubleConsonant($word) && substr($word, -1) === 'l')
		{
			$word = substr($word, 0, -1);
		}

		return $word;
	}

	/**
	 * Replaces the first string with the second, at the end of the string. If third
	 * arg is given, then the preceding string must match that m count at least.
	 *
	 * @param   string   $str    String to check
	 * @param   string   $check  Ending to check for
	 * @param   string   $repl   Replacement string
	 * @param   integer  $m      Optional minimum number of m() to meet
	 *
	 * @return  boolean  Whether the $check string was at the end
	 *                   of the $str string. True does not necessarily mean
	 *                   that it was replaced.
	 *
	 * @since   2.5
	 */
	private static function replace(&$str, $check, $repl, $m = null)
	{
		$len = 0 - strlen($check);

		if (substr($str, $len) === $check)
		{
			$substr = substr($str, 0, $len);

			if ($m === null || self::m($substr) > $m)
			{
				$str = $substr . $repl;
			}

			return true;
		}

		return false;
	}

	/**
	 * m() measures the number of consonant sequences in $str. if c is
	 * a consonant sequence and v a vowel sequence, and <..> indicates arbitrary
	 * presence,
	 *
	 * <c><v>       gives 0
	 * <c>vc<v>     gives 1
	 * <c>vcvc<v>   gives 2
	 * <c>vcvcvc<v> gives 3
	 *
	 * @param   string  $str  The string to return the m count for
	 *
	 * @return  integer  The m count
	 *
	 * @since   2.5
	 */
	private static function m($str)
	{
		$c = self::$regex_consonant;
		$v = self::$regex_vowel;

		$str = preg_replace("#^$c+#", '', $str);
		$str = preg_replace("#$v+$#", '', $str);

		preg_match_all("#($v+$c+)#", $str, $matches);

		return count($matches[1]);
	}

	/**
	 * Returns true/false as to whether the given string contains two
	 * of the same consonant next to each other at the end of the string.
	 *
	 * @param   string  $str  String to check
	 *
	 * @return  boolean  Result
	 *
	 * @since   2.5
	 */
	private static function doubleConsonant($str)
	{
		$c = self::$regex_consonant;

		return preg_match("#$c{2}$#", $str, $matches) && $matches[0][0] === $matches[0][1];
	}

	/**
	 * Checks for ending CVC sequence where second C is not W, X or Y
	 *
	 * @param   string  $str  String to check
	 *
	 * @return  boolean  Result
	 *
	 * @since   2.5
	 */
	private static function cvc($str)
	{
		$c = self::$regex_consonant;
		$v = self::$regex_vowel;

		return preg_match("#($c$v$c)$#", $str, $matches) && strlen($matches[1]) === 3 && $matches[1][2] !== 'w' && $matches[1][2] !== 'x'
			&& $matches[1][2] !== 'y';
	}
}
components/com_finder/helpers/indexer/stemmer/fr.php000060400000024133152453623450016742 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('FinderIndexerStemmer', dirname(__DIR__) . '/stemmer.php');

/**
 * French stemmer class for Smart Search indexer.
 *
 * First contributed by Eric Sanou (bobotche@hotmail.fr)
 * This class is inspired in  Alexis Ulrich's French stemmer code (http://alx2002.free.fr)
 *
 * @since  3.0
 */
class FinderIndexerStemmerFr extends FinderIndexerStemmer
{
	/**
	 * Stemming rules.
	 *
	 * @var    array
	 * @since  3.0
	 */
	private static $stemRules;

	/**
	 * Method to stem a token and return the root.
	 *
	 * @param   string  $token  The token to stem.
	 * @param   string  $lang   The language of the token.
	 *
	 * @return  string  The root token.
	 *
	 * @since   3.0
	 */
	public function stem($token, $lang)
	{
		// Check if the token is long enough to merit stemming.
		if (strlen($token) <= 2)
		{
			return $token;
		}

		// Check if the language is French or All.
		if ($lang !== 'fr' && $lang !== '*')
		{
			return $token;
		}

		// Stem the token if it is not in the cache.
		if (!isset($this->cache[$lang][$token]))
		{
			// Stem the token.
			$result = self::getStem($token);

			// Add the token to the cache.
			$this->cache[$lang][$token] = $result;
		}

		return $this->cache[$lang][$token];
	}

	/**
	 * French stemmer rules variables.
	 *
	 * @return  array  The rules
	 *
	 * @since   3.0
	 */
	protected static function getStemRules()
	{
		if (self::$stemRules)
		{
			return self::$stemRules;
		}

		$vars = array();

		// French accented letters in ISO-8859-1 encoding
		$vars['accents'] = chr(224) . chr(226) . chr(232) . chr(233) . chr(234) . chr(235) . chr(238) . chr(239)
			. chr(244) . chr(251) . chr(249) . chr(231);

		// The rule patterns include all accented words for french language
		$vars['rule_pattern'] = '/^([a-z' . $vars['accents'] . ']*)(\*){0,1}(\d)([a-z' . $vars['accents'] . ']*)([.|>])/';

		// French vowels (including y) in ISO-8859-1 encoding
		$vars['vowels'] = chr(97) . chr(224) . chr(226) . chr(101) . chr(232) . chr(233) . chr(234) . chr(235)
			. chr(105) . chr(238) . chr(239) . chr(111) . chr(244) . chr(117) . chr(251) . chr(249) . chr(121);

		// The French rules in ISO-8859-1 encoding
		$vars['rules'] = array(
			'esre1>', 'esio1>', 'siol1.', 'siof0.', 'sioe0.', 'sio3>', 'st1>', 'sf1>', 'sle1>', 'slo1>', 's' . chr(233) . '1>', chr(233) . 'tuae5.',
			chr(233) . 'tuae2.', 'tnia0.', 'tniv1.', 'tni3>', 'suor1.', 'suo0.', 'sdrail5.', 'sdrai4.', 'er' . chr(232) . 'i1>', 'sesue3x>',
			'esuey5i.', 'esue2x>', 'se1>', 'er' . chr(232) . 'g3.', 'eca1>', 'esiah0.', 'esi1>', 'siss2.', 'sir2>', 'sit2>', 'egan' . chr(233) . '1.',
			'egalli6>', 'egass1.', 'egas0.', 'egat3.', 'ega3>', 'ette4>', 'ett2>', 'etio1.', 'tio' . chr(231) . '4c.', 'tio0.', 'et1>', 'eb1>',
			'snia1>', 'eniatnau8>', 'eniatn4.', 'enia1>', 'niatnio3.', 'niatg3.', 'e' . chr(233) . '1>', chr(233) . 'hcat1.', chr(233) . 'hca4.',
			chr(233) . 'tila5>', chr(233) . 'tici5.', chr(233) . 'tir1.', chr(233) . 'ti3>', chr(233) . 'gan1.', chr(233) . 'ga3>',
			chr(233) . 'tehc1.', chr(233) . 'te3>', chr(233) . 'it0.', chr(233) . '1>', 'eire4.', 'eirue5.', 'eio1.', 'eia1.', 'ei1>', 'eng1.',
			'xuaessi7.', 'xuae1>', 'uaes0.', 'uae3.', 'xuave2l.', 'xuav2li>', 'xua3la>', 'ela1>', 'lart2.', 'lani2>', 'la' . chr(233) . '2>',
			'siay4i.', 'siassia7.', 'siarv1*.', 'sia1>', 'tneiayo6i.', 'tneiay6i.', 'tneiassia9.', 'tneiareio7.', 'tneia5>', 'tneia4>', 'tiario4.',
			'tiarim3.', 'tiaria3.', 'tiaris3.', 'tiari5.', 'tiarve6>', 'tiare5>', 'iare4>', 'are3>', 'tiay4i.', 'tia3>', 'tnay4i.',
			'em' . chr(232) . 'iu5>', 'em' . chr(232) . 'i4>', 'tnaun3.', 'tnauqo3.', 'tnau4>', 'tnaf0.', 'tnat' . chr(233) . '2>', 'tna3>', 'tno3>',
			'zeiy4i.', 'zey3i.', 'zeire5>', 'zeird4.', 'zeirio4.', 'ze2>', 'ssiab0.', 'ssia4.', 'ssi3.', 'tnemma6>', 'tnemesuey9i.', 'tnemesue8>',
			'tnemevi7.', 'tnemessia5.', 'tnemessi8.', 'tneme5>', 'tnemia4.', 'tnem' . chr(233) . '5>', 'el2l>', 'lle3le>', 'let' . chr(244) . '0.',
			'lepp0.', 'le2>', 'srei1>', 'reit3.', 'reila2.', 'rei3>', 'ert' . chr(226) . 'e5.', 'ert' . chr(226) . chr(233) . '1.',
			'ert' . chr(226) . '4.', 'drai4.', 'erdro0.', 'erute5.', 'ruta0.', 'eruta1.', 'erutiov1.', 'erub3.', 'eruh3.', 'erul3.', 'er2r>', 'nn1>',
			'r' . chr(232) . 'i3.', 'srev0.', 'sr1>', 'rid2>', 're2>', 'xuei4.', 'esuei5.', 'lbati3.', 'lba3>', 'rueis0.', 'ruehcn4.', 'ecirta6.',
			'ruetai6.', 'rueta5.', 'rueir0.', 'rue3>', 'esseti6.', 'essere6>', 'esserd1.', 'esse4>', 'essiab1.', 'essia5.', 'essio1.', 'essi4.',
			'essal4.', 'essa1>', 'ssab1.', 'essurp1.', 'essu4.', 'essi1.', 'ssor1.', 'essor2.', 'esso1>', 'ess2>', 'tio3.', 'r' . chr(232) . 's2re.',
			'r' . chr(232) . '0e.', 'esn1.', 'eu1>', 'sua0.', 'su1>', 'utt1>', 'tu' . chr(231) . '3c.', 'u' . chr(231) . '2c.', 'ur1.', 'ehcn2>',
			'ehcu1>', 'snorr3.', 'snoru3.', 'snorua3.', 'snorv3.', 'snorio4.', 'snori5.', 'snore5>', 'snortt4>', 'snort' . chr(238) . 'a7.', 'snort3.',
			'snor4.', 'snossi6.', 'snoire6.', 'snoird5.', 'snoitai7.', 'snoita6.', 'snoits1>', 'noits0.', 'snoi4>', 'noitaci7>', 'noitai6.', 'noita5.',
			'noitu4.', 'noi3>', 'snoya0.', 'snoy4i.', 'sno' . chr(231) . 'a1.', 'sno' . chr(231) . 'r1.', 'snoe4.', 'snosiar1>', 'snola1.', 'sno3>',
			'sno1>', 'noll2.', 'tnennei4.', 'ennei2>', 'snei1>', 'sne' . chr(233) . '1>', 'enne' . chr(233) . '5e.', 'ne' . chr(233) . '3e.', 'neic0.',
			'neiv0.', 'nei3.', 'sc1.', 'sd1.', 'sg1.', 'sni1.', 'tiu0.', 'ti2.', 'sp1>', 'sna1>', 'sue1.', 'enn2>', 'nong2.', 'noss2.', 'rioe4.',
			'riot0.', 'riorc1.', 'riovec5.', 'rio3.', 'ric2.', 'ril2.', 'tnerim3.', 'tneris3>', 'tneri5.', 't' . chr(238) . 'a3.', 'riss2.',
			't' . chr(238) . '2.', 't' . chr(226) . '2>', 'ario2.', 'arim1.', 'ara1.', 'aris1.', 'ari3.', 'art1>', 'ardn2.', 'arr1.', 'arua1.',
			'aro1.', 'arv1.', 'aru1.', 'ar2.', 'rd1.', 'ud1.', 'ul1.', 'ini1.', 'rin2.', 'tnessiab3.', 'tnessia7.', 'tnessi6.', 'tnessni4.', 'sini2.',
			'sl1.', 'iard3.', 'iario3.', 'ia2>', 'io0.', 'iule2.', 'i1>', 'sid2.', 'sic2.', 'esoi4.', 'ed1.', 'ai2>', 'a1>', 'adr1.',
			'tner' . chr(232) . '5>', 'evir1.', 'evio4>', 'evi3.', 'fita4.', 'fi2>', 'enie1.', 'sare4>', 'sari4>', 'sard3.', 'sart2>', 'sa2.',
			'tnessa6>', 'tnessu6>', 'tnegna3.', 'tnegi3.', 'tneg0.', 'tneru5>', 'tnemg0.', 'tnerni4.', 'tneiv1.', 'tne3>', 'une1.', 'en1>', 'nitn2.',
			'ecnay5i.', 'ecnal1.', 'ecna4.', 'ec1>', 'nn1.', 'rit2>', 'rut2>', 'rud2.', 'ugn1>', 'eg1>', 'tuo0.', 'tul2>', 't' . chr(251) . '2>',
			'ev1>', 'v' . chr(232) . '2ve>', 'rtt1>', 'emissi6.', 'em1.', 'ehc1.', 'c' . chr(233) . 'i2c' . chr(232) . '.', 'libi2l.', 'llie1.',
			'liei4i.', 'xuev1.', 'xuey4i.', 'xueni5>', 'xuell4.', 'xuere5.', 'xue3>', 'rb' . chr(233) . '3rb' . chr(232) . '.', 'tur2.',
			'rir' . chr(233) . '4re.', 'rir2.', 'c' . chr(226) . '2ca.', 'snu1.', 'rt' . chr(238) . 'a4.', 'long2.', 'vec2.', chr(231) . '1c>',
			'ssilp3.', 'silp2.', 't' . chr(232) . 'hc2te.', 'n' . chr(232) . 'm2ne.', 'llepp1.', 'tan2.', 'rv' . chr(232) . '3rve.',
			'rv' . chr(233) . '3rve.', 'r' . chr(232) . '2re.', 'r' . chr(233) . '2re.', 't' . chr(232) . '2te.', 't' . chr(233) . '2te.', 'epp1.',
			'eya2i.', 'ya1i.', 'yo1i.', 'esu1.', 'ugi1.', 'tt1.', 'end0.'
		);

		self::$stemRules = $vars;

		return self::$stemRules;
	}

	/**
	 * Returns the number of the first rule from the rule number
	 * that can be applied to the given reversed input.
	 * returns -1 if no rule can be applied, ie the stem has been found
	 *
	 * @param   string   $reversedInput  The input to check in reversed order
	 * @param   integer  $ruleNumber     The rule number to check
	 *
	 * @return  integer  Number of the first rule
	 *
	 * @since   3.0
	 */
	private static function getFirstRule($reversedInput, $ruleNumber)
	{
		$vars = static::getStemRules();

		$nb_rules = count($vars['rules']);

		for ($i = $ruleNumber; $i < $nb_rules; $i++)
		{
			// Gets the letters from the current rule
			$rule = $vars['rules'][$i];
			$rule = preg_replace($vars['rule_pattern'], "\\1", $rule);

			if (strncasecmp(utf8_decode($rule), $reversedInput, strlen(utf8_decode($rule))) == 0)
			{
				return $i;
			}
		}

		return -1;
	}

	/**
	 * Check the acceptability of a stem for French language
	 *
	 * @param   string  $reversedStem  The stem to check in reverse form
	 *
	 * @return  boolean  True if stem is acceptable
	 *
	 * @since   3.0
	 */
	private static function check($reversedStem)
	{
		$vars = static::getStemRules();

		if (preg_match('/[' . $vars['vowels'] . ']$/', utf8_encode($reversedStem)))
		{
			// If the form starts with a vowel then at least two letters must remain after stemming (e.g.: "etaient" --> "et")
			return (strlen($reversedStem) > 2);
		}
		else
		{
			// If the reversed stem starts with a consonant then at least two letters must remain after stemming
			if (strlen($reversedStem) <= 2)
			{
				return false;
			}

			// And at least one of these must be a vowel or "y"
			return preg_match('/[' . $vars['vowels'] . ']/', utf8_encode($reversedStem));
		}
	}

	/**
	 * Paice/Husk stemmer which returns a stem for the given $input
	 *
	 * @param   string  $input  The word for which we want the stem in UTF-8
	 *
	 * @return  string  The stem
	 *
	 * @since   3.0
	 */
	private static function getStem($input)
	{
		$vars = static::getStemRules();

		$reversed_input = strrev(utf8_decode($input));
		$rule_number = 0;

		// This loop goes through the rules' array until it finds an ending one (ending by '.') or the last one ('end0.')
		while (true)
		{
			$rule_number = self::getFirstRule($reversed_input, $rule_number);

			if ($rule_number === -1)
			{
				// No other rule can be applied => the stem has been found
				break;
			}

			$rule = $vars['rules'][$rule_number];
			preg_match($vars['rule_pattern'], $rule, $matches);

			$reversed_stem = utf8_decode($matches[4]) . substr($reversed_input, $matches[3]);

			if (self::check($reversed_stem))
			{
				$reversed_input = $reversed_stem;

				if ($matches[5] === '.')
				{
					break;
				}
			}
			else
			{
				// Go to another rule
				$rule_number++;
			}
		}

		return utf8_encode(strrev($reversed_input));
	}
}
components/com_finder/helpers/indexer/stemmer/snowball.php000060400000005320152453623450020151 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('FinderIndexerStemmer', dirname(__DIR__) . '/stemmer.php');

/**
 * Snowball stemmer class for the Finder indexer package.
 *
 * @since  2.5
 */
class FinderIndexerStemmerSnowball extends FinderIndexerStemmer
{
	/**
	 * Method to stem a token and return the root.
	 *
	 * @param   string  $token  The token to stem.
	 * @param   string  $lang   The language of the token.
	 *
	 * @return  string  The root token.
	 *
	 * @since   2.5
	 */
	public function stem($token, $lang)
	{
		// Language to use if All is specified.
		static $defaultLang = '';

		// If language is All then try to get site default language.
		if ($lang === '*' && $defaultLang === '')
		{
			$languages = JLanguageHelper::getLanguages();
			$defaultLang = isset($languages[0]->sef) ? $languages[0]->sef : '*';
			$lang = $defaultLang;
		}

		// Stem the token if it is not in the cache.
		if (!isset($this->cache[$lang][$token]))
		{
			// Get the stem function from the language string.
			switch ($lang)
			{
				// Danish stemmer.
				case 'da':
					$function = 'stem_danish';
					break;

				// German stemmer.
				case 'de':
					$function = 'stem_german';
					break;

				// English stemmer.
				default:
				case 'en':
					$function = 'stem_english';
					break;

				// Spanish stemmer.
				case 'es':
					$function = 'stem_spanish';
					break;

				// Finnish stemmer.
				case 'fi':
					$function = 'stem_finnish';
					break;

				// French stemmer.
				case 'fr':
					$function = 'stem_french';
					break;

				// Hungarian stemmer.
				case 'hu':
					$function = 'stem_hungarian';
					break;

				// Italian stemmer.
				case 'it':
					$function = 'stem_italian';
					break;

				// Norwegian stemmer.
				case 'nb':
					$function = 'stem_norwegian';
					break;

				// Dutch stemmer.
				case 'nl':
					$function = 'stem_dutch';
					break;

				// Portuguese stemmer.
				case 'pt':
					$function = 'stem_portuguese';
					break;

				// Romanian stemmer.
				case 'ro':
					$function = 'stem_romanian';
					break;

				// Russian stemmer.
				case 'ru':
					$function = 'stem_russian_unicode';
					break;

				// Swedish stemmer.
				case 'sv':
					$function = 'stem_swedish';
					break;

				// Turkish stemmer.
				case 'tr':
					$function = 'stem_turkish_unicode';
					break;
			}

			// Stem the word if the stemmer method exists.
			$this->cache[$lang][$token] = function_exists($function) ? $function($token) : $token;
		}

		return $this->cache[$lang][$token];
	}
}
components/com_finder/helpers/indexer/result.php000060400000021021152453623450016166 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('FinderIndexer', __DIR__ . '/indexer.php');

/**
 * Result class for the Finder indexer package.
 *
 * This class uses magic __get() and __set() methods to prevent properties
 * being added that might confuse the system. All properties not explicitly
 * declared will be pushed into the elements array and can be accessed
 * explicitly using the getElement() method.
 *
 * @since  2.5
 */
class FinderIndexerResult
{
	/**
	 * An array of extra result properties.
	 *
	 * @var    array
	 * @since  2.5
	 */
	protected $elements = array();

	/**
	 * This array tells the indexer which properties should be indexed and what
	 * weights to use for those properties.
	 *
	 * @var    array
	 * @since  2.5
	 */
	protected $instructions = array(
		FinderIndexer::TITLE_CONTEXT => array('title', 'subtitle', 'id'),
		FinderIndexer::TEXT_CONTEXT  => array('summary', 'body'),
		FinderIndexer::META_CONTEXT  => array('meta', 'list_price', 'sale_price'),
		FinderIndexer::PATH_CONTEXT  => array('path', 'alias'),
		FinderIndexer::MISC_CONTEXT  => array('comments'),
	);

	/**
	 * The indexer will use this data to create taxonomy mapping entries for
	 * the item so that it can be filtered by type, label, category,
	 * or whatever.
	 *
	 * @var    array
	 * @since  2.5
	 */
	protected $taxonomy = array();

	/**
	 * The content URL.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public $url;

	/**
	 * The content route.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public $route;

	/**
	 * The content title.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public $title;

	/**
	 * The content description.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public $description;

	/**
	 * The published state of the result.
	 *
	 * @var    integer
	 * @since  2.5
	 */
	public $published;

	/**
	 * The content published state.
	 *
	 * @var    integer
	 * @since  2.5
	 */
	public $state;

	/**
	 * The content access level.
	 *
	 * @var    integer
	 * @since  2.5
	 */
	public $access;

	/**
	 * The content language.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public $language = '*';

	/**
	 * The publishing start date.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public $publish_start_date;

	/**
	 * The publishing end date.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public $publish_end_date;

	/**
	 * The generic start date.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public $start_date;

	/**
	 * The generic end date.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public $end_date;

	/**
	 * The item list price.
	 *
	 * @var    mixed
	 * @since  2.5
	 */
	public $list_price;

	/**
	 * The item sale price.
	 *
	 * @var    mixed
	 * @since  2.5
	 */
	public $sale_price;

	/**
	 * The content type id. This is set by the adapter.
	 *
	 * @var    integer
	 * @since  2.5
	 */
	public $type_id;

	/**
	 * The default language for content.
	 *
	 * @var    string
	 * @since  3.0.2
	 */
	public $defaultLanguage;

	/**
	 * Constructor
	 *
	 * @since   3.0.3
	 */
	public function __construct()
	{
		$this->defaultLanguage = JComponentHelper::getParams('com_languages')->get('site', 'en-GB');
	}

	/**
	 * The magic set method is used to push additional values into the elements
	 * array in order to preserve the cleanliness of the object.
	 *
	 * @param   string  $name   The name of the element.
	 * @param   mixed   $value  The value of the element.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function __set($name, $value)
	{
		$this->setElement($name, $value);
	}

	/**
	 * The magic get method is used to retrieve additional element values from the elements array.
	 *
	 * @param   string  $name  The name of the element.
	 *
	 * @return  mixed  The value of the element if set, null otherwise.
	 *
	 * @since   2.5
	 */
	public function __get($name)
	{
		return $this->getElement($name);
	}

	/**
	 * The magic isset method is used to check the state of additional element values in the elements array.
	 *
	 * @param   string  $name  The name of the element.
	 *
	 * @return  boolean  True if set, false otherwise.
	 *
	 * @since   2.5
	 */
	public function __isset($name)
	{
		return isset($this->elements[$name]);
	}

	/**
	 * The magic unset method is used to unset additional element values in the elements array.
	 *
	 * @param   string  $name  The name of the element.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function __unset($name)
	{
		unset($this->elements[$name]);
	}

	/**
	 * Method to retrieve additional element values from the elements array.
	 *
	 * @param   string  $name  The name of the element.
	 *
	 * @return  mixed  The value of the element if set, null otherwise.
	 *
	 * @since   2.5
	 */
	public function getElement($name)
	{
		// Get the element value if set.
		if (array_key_exists($name, $this->elements))
		{
			return $this->elements[$name];
		}

		return null;
	}

	/**
	 * Method to retrieve all elements.
	 *
	 * @return  array  The elements
	 *
	 * @since   3.8.3
	 */
	public function getElements()
	{
		return $this->elements;
	}

	/**
	 * Method to set additional element values in the elements array.
	 *
	 * @param   string  $name   The name of the element.
	 * @param   mixed   $value  The value of the element.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function setElement($name, $value)
	{
		$this->elements[$name] = $value;
	}

	/**
	 * Method to get all processing instructions.
	 *
	 * @return  array  An array of processing instructions.
	 *
	 * @since   2.5
	 */
	public function getInstructions()
	{
		return $this->instructions;
	}

	/**
	 * Method to add a processing instruction for an item property.
	 *
	 * @param   string  $group     The group to associate the property with.
	 * @param   string  $property  The property to process.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function addInstruction($group, $property)
	{
		// Check if the group exists. We can't add instructions for unknown groups.
		// Check if the property exists in the group.
		if (array_key_exists($group, $this->instructions) && !in_array($property, $this->instructions[$group], true))
		{
			// Add the property to the group.
			$this->instructions[$group][] = $property;
		}
	}

	/**
	 * Method to remove a processing instruction for an item property.
	 *
	 * @param   string  $group     The group to associate the property with.
	 * @param   string  $property  The property to process.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function removeInstruction($group, $property)
	{
		// Check if the group exists. We can't remove instructions for unknown groups.
		if (array_key_exists($group, $this->instructions))
		{
			// Search for the property in the group.
			$key = array_search($property, $this->instructions[$group]);

			// If the property was found, remove it.
			if ($key !== false)
			{
				unset($this->instructions[$group][$key]);
			}
		}
	}

	/**
	 * Method to get the taxonomy maps for an item.
	 *
	 * @param   string  $branch  The taxonomy branch to get. [optional]
	 *
	 * @return  array  An array of taxonomy maps.
	 *
	 * @since   2.5
	 */
	public function getTaxonomy($branch = null)
	{
		// Get the taxonomy branch if available.
		if ($branch !== null && isset($this->taxonomy[$branch]))
		{
			// Filter the input.
			$branch = preg_replace('#[^\pL\pM\pN\p{Pi}\p{Pf}\'+-.,_]+#mui', ' ', $branch);

			return $this->taxonomy[$branch];
		}

		return $this->taxonomy;
	}

	/**
	 * Method to add a taxonomy map for an item.
	 *
	 * @param   string   $branch  The title of the taxonomy branch to add the node to.
	 * @param   string   $title   The title of the taxonomy node.
	 * @param   integer  $state   The published state of the taxonomy node. [optional]
	 * @param   integer  $access  The access level of the taxonomy node. [optional]
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public function addTaxonomy($branch, $title, $state = 1, $access = 1)
	{
		// Filter the input.
		$branch = preg_replace('#[^\pL\pM\pN\p{Pi}\p{Pf}\'+-.,_]+#mui', ' ', $branch);

		// Create the taxonomy node.
		$node = new JObject;
		$node->title = $title;
		$node->state = (int) $state;
		$node->access = (int) $access;

		// Add the node to the taxonomy branch.
		$this->taxonomy[$branch][$node->title] = $node;
	}

	/**
	 * Method to set the item language
	 *
	 * @return  void
	 *
	 * @since   3.0
	 */
	public function setLanguage()
	{
		if ($this->language == '')
		{
			$this->language = $this->defaultLanguage;
		}
	}
}
components/com_finder/helpers/indexer/token.php000060400000007657152453623450016013 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\String\StringHelper;

/**
 * Token class for the Finder indexer package.
 *
 * @since  2.5
 */
class FinderIndexerToken
{
	/**
	 * This is the term that will be referenced in the terms table and the
	 * mapping tables.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public $term;

	/**
	 * The stem is used to match the root term and produce more potential
	 * matches when searching the index.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public $stem;

	/**
	 * If the token is numeric, it is likely to be short and uncommon so the
	 * weight is adjusted to compensate for that situation.
	 *
	 * @var    boolean
	 * @since  2.5
	 */
	public $numeric;

	/**
	 * If the token is a common term, the weight is adjusted to compensate for
	 * the higher frequency of the term in relation to other terms.
	 *
	 * @var    boolean
	 * @since  2.5
	 */
	public $common;

	/**
	 * Flag for phrase tokens.
	 *
	 * @var    boolean
	 * @since  2.5
	 */
	public $phrase;

	/**
	 * The length is used to calculate the weight of the token.
	 *
	 * @var    integer
	 * @since  2.5
	 */
	public $length;

	/**
	 * The weight is calculated based on token size and whether the token is
	 * considered a common term.
	 *
	 * @var    integer
	 * @since  2.5
	 */
	public $weight;

	/**
	 * The simple language identifier for the token.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public $language;

	/**
	 * The container for matches.
	 *
	 * @var    array
	 * @since  3.8.12
	 */
	public $matches = array();

	/**
	 * Is derived token (from individual words)
	 *
	 * @var    boolean
	 * @since  3.8.12
	 */
	public $derived;

	/**
	 * The suggested term
	 *
	 * @var    string
	 * @since  3.8.12
	 */
	public $suggestion;

	/**
	 * Method to construct the token object.
	 *
	 * @param   mixed   $term    The term as a string for words or an array for phrases.
	 * @param   string  $lang    The simple language identifier.
	 * @param   string  $spacer  The space separator for phrases. [optional]
	 *
	 * @since   2.5
	 */
	public function __construct($term, $lang, $spacer = ' ')
	{
		$this->language = $lang;

		// Tokens can be a single word or an array of words representing a phrase.
		if (is_array($term))
		{
			// Populate the token instance.
			$this->term = implode($spacer, $term);
			$this->stem = implode($spacer, array_map(array('FinderIndexerHelper', 'stem'), $term, array($lang)));
			$this->numeric = false;
			$this->common = false;
			$this->phrase = true;
			$this->length = StringHelper::strlen($this->term);

			/*
			 * Calculate the weight of the token.
			 *
			 * 1. Length of the token up to 30 and divide by 30, add 1.
			 * 2. Round weight to 4 decimal points.
			 */
			$this->weight = (($this->length >= 30 ? 30 : $this->length) / 30) + 1;
			$this->weight = round($this->weight, 4);
		}
		else
		{
			// Populate the token instance.
			$this->term = $term;
			$this->stem = FinderIndexerHelper::stem($this->term, $lang);
			$this->numeric = (is_numeric($this->term) || (bool) preg_match('#^[0-9,.\-\+]+$#', $this->term));
			$this->common = $this->numeric ? false : FinderIndexerHelper::isCommon($this->term, $lang);
			$this->phrase = false;
			$this->length = StringHelper::strlen($this->term);

			/*
			 * Calculate the weight of the token.
			 *
			 * 1. Length of the token up to 15 and divide by 15.
			 * 2. If common term, divide weight by 8.
			 * 3. If numeric, multiply weight by 1.5.
			 * 4. Round weight to 4 decimal points.
			 */
			$this->weight = ($this->length >= 15 ? 15 : $this->length) / 15;
			$this->weight = $this->common === true ? $this->weight / 8 : $this->weight;
			$this->weight = $this->numeric === true ? $this->weight * 1.5 : $this->weight;
			$this->weight = round($this->weight, 4);
		}
	}
}
components/com_finder/helpers/indexer/parser/txt.php000060400000001336152453623450016772 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('FinderIndexerParser', dirname(__DIR__) . '/parser.php');

/**
 * Text Parser class for the Finder indexer package.
 *
 * @since  2.5
 */
class FinderIndexerParserTxt extends FinderIndexerParser
{
	/**
	 * Method to process Text input and extract the plain text.
	 *
	 * @param   string  $input  The input to process.
	 *
	 * @return  string  The plain text input.
	 *
	 * @since   2.5
	 */
	protected function process($input)
	{
		return $input;
	}
}
components/com_finder/helpers/indexer/parser/html.php000060400000010556152453623450017123 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('FinderIndexerParser', dirname(__DIR__) . '/parser.php');

/**
 * HTML Parser class for the Finder indexer package.
 *
 * @since  2.5
 */
class FinderIndexerParserHtml extends FinderIndexerParser
{
	/**
	 * Method to parse input and extract the plain text. Because this method is
	 * called from both inside and outside the indexer, it needs to be able to
	 * batch out its parsing functionality to deal with the inefficiencies of
	 * regular expressions. We will parse recursively in 2KB chunks.
	 *
	 * @param   string  $input  The input to parse.
	 *
	 * @return  string  The plain text input.
	 *
	 * @since   2.5
	 */
	public function parse($input)
	{
		// Strip invalid UTF-8 characters.
		$input = iconv('utf-8', 'utf-8//IGNORE', $input);

		// Remove anything between <head> and </head> tags.  Do this first
		// because there might be <script> or <style> tags nested inside.
		$input = $this->removeBlocks($input, '<head>', '</head>');

		// Convert <style> and <noscript> tags to <script> tags
		// so we can remove them efficiently.
		$search = array(
			'<style', '</style',
			'<noscript', '</noscript',
		);
		$replace = array(
			'<script', '</script',
			'<script', '</script',
		);
		$input = str_replace($search, $replace, $input);

		// Strip all script blocks.
		$input = $this->removeBlocks($input, '<script', '</script>');

		// Decode HTML entities.
		$input = html_entity_decode($input, ENT_QUOTES, 'UTF-8');

		// Convert entities equivalent to spaces to actual spaces.
		$input = str_replace(array('&nbsp;', '&#160;'), ' ', $input);

		// Add a space before both the OPEN and CLOSE tags of BLOCK and LINE BREAKING elements,
		// e.g. 'all<h1><em>m</em>obile  List</h1>' will become 'all mobile  List'
		$input = preg_replace('/(<|<\/)(' .
			'address|article|aside|blockquote|br|canvas|dd|div|dl|dt|' .
			'fieldset|figcaption|figure|footer|form|h1|h2|h3|h4|h5|h6|header|hgroup|hr|li|' .
			'main|nav|noscript|ol|output|p|pre|section|table|tfoot|ul|video' .
			')\b/i', ' $1$2', $input
		);

		// Strip HTML tags.
		$input = strip_tags($input);

		return parent::parse($input);
	}

	/**
	 * Method to process HTML input and extract the plain text.
	 *
	 * @param   string  $input  The input to process.
	 *
	 * @return  string  The plain text input.
	 *
	 * @since   2.5
	 */
	protected function process($input)
	{
		// Replace any amount of white space with a single space.
		return preg_replace('#\s+#u', ' ', $input);
	}

	/**
	 * Method to remove blocks of text between a start and an end tag.
	 * Each block removed is effectively replaced by a single space.
	 *
	 * Note: The start tag and the end tag must be different.
	 * Note: Blocks must not be nested.
	 * Note: This method will function correctly with multi-byte strings.
	 *
	 * @param   string  $input     String to be processed.
	 * @param   string  $startTag  String representing the start tag.
	 * @param   string  $endTag    String representing the end tag.
	 *
	 * @return  string with blocks removed.
	 *
	 * @since   3.4
	 */
	private function removeBlocks($input, $startTag, $endTag)
	{
		$return = '';
		$offset = 0;
		$startTagLength = strlen($startTag);
		$endTagLength = strlen($endTag);

		// Find the first start tag.
		$start = stripos($input, $startTag);

		// If no start tags were found, return the string unchanged.
		if ($start === false)
		{
			return $input;
		}

		// Look for all blocks defined by the start and end tags.
		while ($start !== false)
		{
			// Accumulate the substring up to the start tag.
			$return .= substr($input, $offset, $start - $offset) . ' ';

			// Look for an end tag corresponding to the start tag.
			$end = stripos($input, $endTag, $start + $startTagLength);

			// If no corresponding end tag, leave the string alone.
			if ($end === false)
			{
				// Fix the offset so part of the string is not duplicated.
				$offset = $start;
				break;
			}

			// Advance the start position.
			$offset = $end + $endTagLength;

			// Look for the next start tag and loop.
			$start = stripos($input, $startTag, $offset);
		}

		// Add in the final substring after the last end tag.
		$return .= substr($input, $offset);

		return $return;
	}
}
components/com_finder/helpers/indexer/parser/rtf.php000060400000002040152453623450016737 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('FinderIndexerParser', dirname(__DIR__) . '/parser.php');

/**
 * RTF Parser class for the Finder indexer package.
 *
 * @since  2.5
 */
class FinderIndexerParserRtf extends FinderIndexerParser
{
	/**
	 * Method to process RTF input and extract the plain text.
	 *
	 * @param   string  $input  The input to process.
	 *
	 * @return  string  The plain text input.
	 *
	 * @since   2.5
	 */
	protected function process($input)
	{
		// Remove embedded pictures.
		$input = preg_replace('#{\\\pict[^}]*}#mi', '', $input);

		// Remove control characters.
		$input = str_replace(array('{', '}', "\\\n"), array(' ', ' ', "\n"), $input);
		$input = preg_replace('#\\\([^;]+?);#m', ' ', $input);
		$input = preg_replace('#\\\[\'a-zA-Z0-9]+#mi', ' ', $input);

		return $input;
	}
}
components/com_finder/helpers/indexer/helper.php000060400000034247152453623450016145 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;

JLoader::register('FinderIndexerParser', __DIR__ . '/parser.php');
JLoader::register('FinderIndexerStemmer', __DIR__ . '/stemmer.php');
JLoader::register('FinderIndexerToken', __DIR__ . '/token.php');

/**
 * Helper class for the Finder indexer package.
 *
 * @since  2.5
 */
class FinderIndexerHelper
{
	/**
	 * The token stemmer object. The stemmer is set by whatever class
	 * wishes to use it but it must be an instance of FinderIndexerStemmer.
	 *
	 * @var		FinderIndexerStemmer
	 * @since	2.5
	 */
	public static $stemmer;

	/**
	 * A state flag, in order to not constantly check if the stemmer is an instance of FinderIndexerStemmer
	 *
	 * @var		boolean
	 * @since	3.7.0
	 */
	protected static $stemmerOK;

	/**
	 * Method to parse input into plain text.
	 *
	 * @param   string  $input   The raw input.
	 * @param   string  $format  The format of the input. [optional]
	 *
	 * @return  string  The parsed input.
	 *
	 * @since   2.5
	 * @throws  Exception on invalid parser.
	 */
	public static function parse($input, $format = 'html')
	{
		// Get a parser for the specified format and parse the input.
		return FinderIndexerParser::getInstance($format)->parse($input);
	}

	/**
	 * Method to tokenize a text string.
	 *
	 * @param   string   $input   The input to tokenize.
	 * @param   string   $lang    The language of the input.
	 * @param   boolean  $phrase  Flag to indicate whether input could be a phrase. [optional]
	 *
	 * @return  array|FinderIndexerToken  An array of FinderIndexerToken objects or a single FinderIndexerToken object.
	 *
	 * @since   2.5
	 */
	public static function tokenize($input, $lang, $phrase = false)
	{
		static $cache;
		$store = StringHelper::strlen($input) < 128 ? md5($input . '::' . $lang . '::' . $phrase) : null;

		// Check if the string has been tokenized already.
		if ($store && isset($cache[$store]))
		{
			return $cache[$store];
		}

		$tokens = array();
		$quotes = html_entity_decode('&#8216;&#8217;&#39;', ENT_QUOTES, 'UTF-8');

		// Get the simple language key.
		$lang = static::getPrimaryLanguage($lang);

		/*
		 * Parsing the string input into terms is a multi-step process.
		 *
		 * Regexes:
		 *  1. Remove everything except letters, numbers, quotes, apostrophe, plus, dash, period, and comma.
		 *  2. Remove plus, dash, period, and comma characters located before letter characters.
		 *  3. Remove plus, dash, period, and comma characters located after other characters.
		 *  4. Remove plus, period, and comma characters enclosed in alphabetical characters. Ungreedy.
		 *  5. Remove orphaned apostrophe, plus, dash, period, and comma characters.
		 *  6. Remove orphaned quote characters.
		 *  7. Replace the assorted single quotation marks with the ASCII standard single quotation.
		 *  8. Remove multiple space characters and replaces with a single space.
		 */
		$input = StringHelper::strtolower($input);
		$input = preg_replace('#[^\pL\pM\pN\p{Pi}\p{Pf}\'+-.,]+#mui', ' ', $input);
		$input = preg_replace('#(^|\s)[+-.,]+([\pL\pM]+)#mui', ' $1', $input);
		$input = preg_replace('#([\pL\pM\pN]+)[+-.,]+(\s|$)#mui', '$1 ', $input);
		$input = preg_replace('#([\pL\pM]+)[+.,]+([\pL\pM]+)#muiU', '$1 $2', $input);
		$input = preg_replace('#(^|\s)[\'+-.,]+(\s|$)#mui', ' ', $input);
		$input = preg_replace('#(^|\s)[\p{Pi}\p{Pf}]+(\s|$)#mui', ' ', $input);
		$input = preg_replace('#[' . $quotes . ']+#mui', '\'', $input);
		$input = preg_replace('#\s+#mui', ' ', $input);
		$input = trim($input);

		// Explode the normalized string to get the terms.
		$terms = explode(' ', $input);

		/*
		 * If we have Unicode support and are dealing with Chinese text, Chinese
		 * has to be handled specially because there are not necessarily any spaces
		 * between the "words". So, we have to test if the words belong to the Chinese
		 * character set and if so, explode them into single glyphs or "words".
		 */
		if ($lang === 'zh')
		{
			// Iterate through the terms and test if they contain Chinese.
			for ($i = 0, $n = count($terms); $i < $n; $i++)
			{
				$charMatches = array();
				$charCount   = preg_match_all('#[\p{Han}]#mui', $terms[$i], $charMatches);

				// Split apart any groups of Chinese characters.
				for ($j = 0; $j < $charCount; $j++)
				{
					$tSplit = StringHelper::str_ireplace($charMatches[0][$j], '', $terms[$i], false);

					if ((bool) $tSplit)
					{
						$terms[$i] = $tSplit;
					}
					else
					{
						unset($terms[$i]);
					}

					$terms[] = $charMatches[0][$j];
				}
			}

			// Reset array keys.
			$terms = array_values($terms);
		}

		/*
		 * If we have to handle the input as a phrase, that means we don't
		 * tokenize the individual terms and we do not create the two and three
		 * term combinations. The phrase must contain more than one word!
		 */
		if ($phrase === true && count($terms) > 1)
		{
			// Create tokens from the phrase.
			$tokens[] = new FinderIndexerToken($terms, $lang);
		}
		else
		{
			// Create tokens from the terms.
			for ($i = 0, $n = count($terms); $i < $n; $i++)
			{
				$tokens[] = new FinderIndexerToken($terms[$i], $lang);
			}

			// Create two and three word phrase tokens from the individual words.
			for ($i = 0, $n = count($tokens); $i < $n; $i++)
			{
				// Setup the phrase positions.
				$i2 = $i + 1;
				$i3 = $i + 2;

				// Create the two word phrase.
				if ($i2 < $n && isset($tokens[$i2]))
				{
					// Tokenize the two word phrase.
					$token          = new FinderIndexerToken(
						array(
							$tokens[$i]->term,
							$tokens[$i2]->term
						), $lang, $lang === 'zh' ? '' : ' '
					);
					$token->derived = true;

					// Add the token to the stack.
					$tokens[] = $token;
				}

				// Create the three word phrase.
				if ($i3 < $n && isset($tokens[$i3]))
				{
					// Tokenize the three word phrase.
					$token          = new FinderIndexerToken(
						array(
							$tokens[$i]->term,
							$tokens[$i2]->term,
							$tokens[$i3]->term
						), $lang, $lang === 'zh' ? '' : ' '
					);
					$token->derived = true;

					// Add the token to the stack.
					$tokens[] = $token;
				}
			}
		}

		if ($store)
		{
			$cache[$store] = count($tokens) > 1 ? $tokens : array_shift($tokens);

			return $cache[$store];
		}
		else
		{
			return count($tokens) > 1 ? $tokens : array_shift($tokens);
		}
	}

	/**
	 * Method to get the base word of a token. This method uses the public
	 * {@link FinderIndexerHelper::$stemmer} object if it is set. If no stemmer is set,
	 * the original token is returned.
	 *
	 * @param   string  $token  The token to stem.
	 * @param   string  $lang   The language of the token.
	 *
	 * @return  string  The root token.
	 *
	 * @since   2.5
	 */
	public static function stem($token, $lang)
	{
		// Trim apostrophes at either end of the token.
		$token = trim($token, '\'');

		// Trim everything after any apostrophe in the token.
		if ($res = explode('\'', $token))
		{
			$token = $res[0];
		}

		if (static::$stemmerOK === true)
		{
			return static::$stemmer->stem($token, $lang);
		}
		else
		{
			// Stem the token if we have a valid stemmer to use.
			if (static::$stemmer instanceof FinderIndexerStemmer)
			{
				static::$stemmerOK = true;

				return static::$stemmer->stem($token, $lang);
			}
		}

		return $token;
	}

	/**
	 * Method to add a content type to the database.
	 *
	 * @param   string  $title  The type of content. For example: PDF
	 * @param   string  $mime   The mime type of the content. For example: PDF [optional]
	 *
	 * @return  integer  The id of the content type.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public static function addContentType($title, $mime = null)
	{
		static $types;

		$db    = JFactory::getDbo();
		$query = $db->getQuery(true);

		// Check if the types are loaded.
		if (empty($types))
		{
			// Build the query to get the types.
			$query->select('*')
				->from($db->quoteName('#__finder_types'));

			// Get the types.
			$db->setQuery($query);
			$types = $db->loadObjectList('title');
		}

		// Check if the type already exists.
		if (isset($types[$title]))
		{
			return (int) $types[$title]->id;
		}

		// Add the type.
		$query->clear()
			->insert($db->quoteName('#__finder_types'))
			->columns(array($db->quoteName('title'), $db->quoteName('mime')))
			->values($db->quote($title) . ', ' . $db->quote($mime));
		$db->setQuery($query);
		$db->execute();

		// Return the new id.
		return (int) $db->insertid();
	}

	/**
	 * Method to check if a token is common in a language.
	 *
	 * @param   string  $token  The token to test.
	 * @param   string  $lang   The language to reference.
	 *
	 * @return  boolean  True if common, false otherwise.
	 *
	 * @since   2.5
	 */
	public static function isCommon($token, $lang)
	{
		static $data;
		static $default;

		$langCode = $lang;

		// If language requested is wildcard, use the default language.
		if ($default === null && $lang === '*')
		{
			$default = strstr(self::getDefaultLanguage(), '-', true);
			$langCode = $default;
		}

		// Load the common tokens for the language if necessary.
		if (!isset($data[$langCode]))
		{
			$data[$langCode] = self::getCommonWords($langCode);
		}

		// Check if the token is in the common array.
		return in_array($token, $data[$langCode], true);
	}

	/**
	 * Method to get an array of common terms for a language.
	 *
	 * @param   string  $lang  The language to use.
	 *
	 * @return  array  Array of common terms.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public static function getCommonWords($lang)
	{
		$db = JFactory::getDbo();

		// Create the query to load all the common terms for the language.
		$query = $db->getQuery(true)
			->select($db->quoteName('term'))
			->from($db->quoteName('#__finder_terms_common'))
			->where($db->quoteName('language') . ' = ' . $db->quote($lang));

		// Load all of the common terms for the language.
		$db->setQuery($query);

		return $db->loadColumn();
	}

	/**
	 * Method to get the default language for the site.
	 *
	 * @return  string  The default language string.
	 *
	 * @since   2.5
	 */
	public static function getDefaultLanguage()
	{
		static $lang;

		// We need to go to com_languages to get the site default language, it's the best we can guess.
		if (empty($lang))
		{
			$lang = JComponentHelper::getParams('com_languages')->get('site', 'en-GB');
		}

		return $lang;
	}

	/**
	 * Method to parse a language/locale key and return a simple language string.
	 *
	 * @param   string  $lang  The language/locale key. For example: en-GB
	 *
	 * @return  string  The simple language string. For example: en
	 *
	 * @since   2.5
	 */
	public static function getPrimaryLanguage($lang)
	{
		static $data;

		// Only parse the identifier if necessary.
		if (!isset($data[$lang]))
		{
			if (is_callable(array('Locale', 'getPrimaryLanguage')))
			{
				// Get the language key using the Locale package.
				$data[$lang] = Locale::getPrimaryLanguage($lang);
			}
			else
			{
				// Get the language key using string position.
				$data[$lang] = StringHelper::substr($lang, 0, StringHelper::strpos($lang, '-'));
			}
		}

		return $data[$lang];
	}

	/**
	 * Method to get the path (SEF route) for a content item.
	 *
	 * @param   string  $url  The non-SEF route to the content item.
	 *
	 * @return  string  The path for the content item.
	 *
	 * @since       2.5
	 * @deprecated  4.0
	 */
	public static function getContentPath($url)
	{
		static $router;

		// Only get the router once.
		if (!($router instanceof JRouter))
		{
			// Get and configure the site router.
			$config = JFactory::getConfig();
			$router = JRouter::getInstance('site');
			$router->setMode($config->get('sef', 1));
		}

		// Build the relative route.
		$uri   = $router->build($url);
		$route = $uri->toString(array('path', 'query', 'fragment'));
		$route = str_replace(JUri::base(true) . '/', '', $route);

		return $route;
	}

	/**
	 * Method to get extra data for a content before being indexed. This is how
	 * we add Comments, Tags, Labels, etc. that should be available to Finder.
	 *
	 * @param   FinderIndexerResult  $item  The item to index as a FinderIndexerResult object.
	 *
	 * @return  boolean  True on success, false on failure.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	public static function getContentExtras(FinderIndexerResult $item)
	{
		// Get the event dispatcher.
		$dispatcher = JEventDispatcher::getInstance();

		// Load the finder plugin group.
		JPluginHelper::importPlugin('finder');

		// Trigger the event.
		$results = $dispatcher->trigger('onPrepareFinderContent', array(&$item));

		// Check the returned results. This is for plugins that don't throw
		// exceptions when they encounter serious errors.
		if (in_array(false, $results))
		{
			throw new Exception($dispatcher->getError(), 500);
		}

		return true;
	}

	/**
	 * Method to process content text using the onContentPrepare event trigger.
	 *
	 * @param   string               $text    The content to process.
	 * @param   Registry             $params  The parameters object. [optional]
	 * @param   FinderIndexerResult  $item    The item which get prepared. [optional]
	 *
	 * @return  string  The processed content.
	 *
	 * @since   2.5
	 */
	public static function prepareContent($text, $params = null, FinderIndexerResult $item = null)
	{
		static $loaded;

		// Get the dispatcher.
		$dispatcher = JEventDispatcher::getInstance();

		// Load the content plugins if necessary.
		if (empty($loaded))
		{
			JPluginHelper::importPlugin('content');
			$loaded = true;
		}

		// Instantiate the parameter object if necessary.
		if (!($params instanceof Registry))
		{
			$registry = new Registry($params);
			$params = $registry;
		}

		// Create a mock content object.
		$content       = JTable::getInstance('Content');
		$content->text = $text;

		if ($item)
		{
			$content->bind((array) $item);
			$content->bind($item->getElements());
		}

		if ($item && !empty($item->context))
		{
			$content->context = $item->context;
		}

		// Fire the onContentPrepare event.
		$dispatcher->trigger('onContentPrepare', array('com_finder.indexer', &$content, &$params, 0));

		return $content->text;
	}
}
components/com_finder/helpers/indexer/adapter.php000060400000052672152453623450016310 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

JLoader::register('FinderIndexer', __DIR__ . '/indexer.php');
JLoader::register('FinderIndexerHelper', __DIR__ . '/helper.php');
JLoader::register('FinderIndexerResult', __DIR__ . '/result.php');
JLoader::register('FinderIndexerTaxonomy', __DIR__ . '/taxonomy.php');

/**
 * Prototype adapter class for the Finder indexer package.
 *
 * @since  2.5
 */
abstract class FinderIndexerAdapter extends JPlugin
{
	/**
	 * The context is somewhat arbitrary but it must be unique or there will be
	 * conflicts when managing plugin/indexer state. A good best practice is to
	 * use the plugin name suffix as the context. For example, if the plugin is
	 * named 'plgFinderContent', the context could be 'Content'.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $context;

	/**
	 * The extension name.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $extension;

	/**
	 * The sublayout to use when rendering the results.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $layout;

	/**
	 * The mime type of the content the adapter indexes.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $mime;

	/**
	 * The access level of an item before save.
	 *
	 * @var    integer
	 * @since  2.5
	 */
	protected $old_access;

	/**
	 * The access level of a category before save.
	 *
	 * @var    integer
	 * @since  2.5
	 */
	protected $old_cataccess;

	/**
	 * The type of content the adapter indexes.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $type_title;

	/**
	 * The type id of the content.
	 *
	 * @var    integer
	 * @since  2.5
	 */
	protected $type_id;

	/**
	 * The database object.
	 *
	 * @var    object
	 * @since  2.5
	 */
	protected $db;

	/**
	 * The table name.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $table;

	/**
	 * The indexer object.
	 *
	 * @var    FinderIndexer
	 * @since  3.0
	 */
	protected $indexer;

	/**
	 * The field the published state is stored in.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $state_field = 'state';

	/**
	 * Method to instantiate the indexer adapter.
	 *
	 * @param   object  $subject  The object to observe.
	 * @param   array   $config   An array that holds the plugin configuration.
	 *
	 * @since   2.5
	 */
	public function __construct(&$subject, $config)
	{
		// Get the database object.
		$this->db = JFactory::getDbo();

		// Call the parent constructor.
		parent::__construct($subject, $config);

		// Get the type id.
		$this->type_id = $this->getTypeId();

		// Add the content type if it doesn't exist and is set.
		if (empty($this->type_id) && !empty($this->type_title))
		{
			$this->type_id = FinderIndexerHelper::addContentType($this->type_title, $this->mime);
		}

		// Check for a layout override.
		if ($this->params->get('layout'))
		{
			$this->layout = $this->params->get('layout');
		}

		// Get the indexer object
		$this->indexer = FinderIndexer::getInstance();
	}

	/**
	 * Method to get the adapter state and push it into the indexer.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 * @throws  Exception on error.
	 */
	public function onStartIndex()
	{
		// Get the indexer state.
		$iState = FinderIndexer::getState();

		// Get the number of content items.
		$total = (int) $this->getContentCount();

		// Add the content count to the total number of items.
		$iState->totalItems += $total;

		// Populate the indexer state information for the adapter.
		$iState->pluginState[$this->context]['total'] = $total;
		$iState->pluginState[$this->context]['offset'] = 0;

		// Set the indexer state.
		FinderIndexer::setState($iState);
	}

	/**
	 * Method to prepare for the indexer to be run. This method will often
	 * be used to include dependencies and things of that nature.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on error.
	 */
	public function onBeforeIndex()
	{
		// Get the indexer and adapter state.
		$iState = FinderIndexer::getState();
		$aState = $iState->pluginState[$this->context];

		// Check the progress of the indexer and the adapter.
		if ($iState->batchOffset == $iState->batchSize || $aState['offset'] == $aState['total'])
		{
			return true;
		}

		// Run the setup method.
		return $this->setup();
	}

	/**
	 * Method to index a batch of content items. This method can be called by
	 * the indexer many times throughout the indexing process depending on how
	 * much content is available for indexing. It is important to track the
	 * progress correctly so we can display it to the user.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on error.
	 */
	public function onBuildIndex()
	{
		// Get the indexer and adapter state.
		$iState = FinderIndexer::getState();
		$aState = $iState->pluginState[$this->context];

		// Check the progress of the indexer and the adapter.
		if ($iState->batchOffset == $iState->batchSize || $aState['offset'] == $aState['total'])
		{
			return true;
		}

		// Get the batch offset and size.
		$offset = (int) $aState['offset'];
		$limit = (int) ($iState->batchSize - $iState->batchOffset);

		// Get the content items to index.
		$items = $this->getItems($offset, $limit);

		// Iterate through the items and index them.
		for ($i = 0, $n = count($items); $i < $n; $i++)
		{
			// Index the item.
			$this->index($items[$i]);

			// Adjust the offsets.
			$offset++;
			$iState->batchOffset++;
			$iState->totalItems--;
		}

		// Update the indexer state.
		$aState['offset'] = $offset;
		$iState->pluginState[$this->context] = $aState;
		FinderIndexer::setState($iState);

		return true;
	}

	/**
	 * Method to change the value of a content item's property in the links
	 * table. This is used to synchronize published and access states that
	 * are changed when not editing an item directly.
	 *
	 * @param   string   $id        The ID of the item to change.
	 * @param   string   $property  The property that is being changed.
	 * @param   integer  $value     The new value of that property.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	protected function change($id, $property, $value)
	{
		// Check for a property we know how to handle.
		if ($property !== 'state' && $property !== 'access')
		{
			return true;
		}

		// Get the URL for the content id.
		$item = $this->db->quote($this->getUrl($id, $this->extension, $this->layout));

		// Update the content items.
		$query = $this->db->getQuery(true)
			->update($this->db->quoteName('#__finder_links'))
			->set($this->db->quoteName($property) . ' = ' . (int) $value)
			->where($this->db->quoteName('url') . ' = ' . $item);
		$this->db->setQuery($query);
		$this->db->execute();

		return true;
	}

	/**
	 * Method to index an item.
	 *
	 * @param   FinderIndexerResult  $item  The item to index as a FinderIndexerResult object.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	abstract protected function index(FinderIndexerResult $item);

	/**
	 * Method to reindex an item.
	 *
	 * @param   integer  $id  The ID of the item to reindex.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	protected function reindex($id)
	{
		// Run the setup method.
		$this->setup();

		// Remove the old item.
		$this->remove($id);

		// Get the item.
		$item = $this->getItem($id);

		// Index the item.
		$this->index($item);
	}

	/**
	 * Method to remove an item from the index.
	 *
	 * @param   string  $id  The ID of the item to remove.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	protected function remove($id)
	{
		// Get the item's URL
		$url = $this->db->quote($this->getUrl($id, $this->extension, $this->layout));

		// Get the link ids for the content items.
		$query = $this->db->getQuery(true)
			->select($this->db->quoteName('link_id'))
			->from($this->db->quoteName('#__finder_links'))
			->where($this->db->quoteName('url') . ' = ' . $url);
		$this->db->setQuery($query);
		$items = $this->db->loadColumn();

		// Check the items.
		if (empty($items))
		{
			return true;
		}

		// Remove the items.
		foreach ($items as $item)
		{
			$this->indexer->remove($item);
		}

		return true;
	}

	/**
	 * Method to setup the adapter before indexing.
	 *
	 * @return  boolean  True on success, false on failure.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	abstract protected function setup();

	/**
	 * Method to update index data on category access level changes
	 *
	 * @param   JTable  $row  A JTable object
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	protected function categoryAccessChange($row)
	{
		$query = clone $this->getStateQuery();
		$query->where('c.id = ' . (int) $row->id);

		// Get the access level.
		$this->db->setQuery($query);
		$items = $this->db->loadObjectList();

		// Adjust the access level for each item within the category.
		foreach ($items as $item)
		{
			// Set the access level.
			$temp = max($item->access, $row->access);

			// Update the item.
			$this->change((int) $item->id, 'access', $temp);

			// Reindex the item
			$this->reindex($row->id);
		}
	}

	/**
	 * Method to update index data on category access level changes
	 *
	 * @param   array    $pks    A list of primary key ids of the content that has changed state.
	 * @param   integer  $value  The value of the state that the content has been changed to.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	protected function categoryStateChange($pks, $value)
	{
		/*
		 * The item's published state is tied to the category
		 * published state so we need to look up all published states
		 * before we change anything.
		 */
		foreach ($pks as $pk)
		{
			$query = clone $this->getStateQuery();
			$query->where('c.id = ' . (int) $pk);

			// Get the published states.
			$this->db->setQuery($query);
			$items = $this->db->loadObjectList();

			// Adjust the state for each item within the category.
			foreach ($items as $item)
			{
				// Translate the state.
				$temp = $this->translateState($item->state, $value);

				// Update the item.
				$this->change($item->id, 'state', $temp);

				// Reindex the item
				$this->reindex($item->id);
			}
		}
	}

	/**
	 * Method to check the existing access level for categories
	 *
	 * @param   JTable  $row  A JTable object
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	protected function checkCategoryAccess($row)
	{
		$query = $this->db->getQuery(true)
			->select($this->db->quoteName('access'))
			->from($this->db->quoteName('#__categories'))
			->where($this->db->quoteName('id') . ' = ' . (int) $row->id);
		$this->db->setQuery($query);

		// Store the access level to determine if it changes
		$this->old_cataccess = $this->db->loadResult();
	}

	/**
	 * Method to check the existing access level for items
	 *
	 * @param   JTable  $row  A JTable object
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	protected function checkItemAccess($row)
	{
		$query = $this->db->getQuery(true)
			->select($this->db->quoteName('access'))
			->from($this->db->quoteName($this->table))
			->where($this->db->quoteName('id') . ' = ' . (int) $row->id);
		$this->db->setQuery($query);

		// Store the access level to determine if it changes
		$this->old_access = $this->db->loadResult();
	}

	/**
	 * Method to get the number of content items available to index.
	 *
	 * @return  integer  The number of content items available to index.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	protected function getContentCount()
	{
		$return = 0;

		// Get the list query.
		$query = $this->getListQuery();

		// Check if the query is valid.
		if (empty($query))
		{
			return $return;
		}

		// Tweak the SQL query to make the total lookup faster.
		if ($query instanceof JDatabaseQuery)
		{
			$query = clone $query;
			$query->clear('select')
				->select('COUNT(*)')
				->clear('order');
		}

		// Get the total number of content items to index.
		$this->db->setQuery($query);

		return (int) $this->db->loadResult();
	}

	/**
	 * Method to get a content item to index.
	 *
	 * @param   integer  $id  The id of the content item.
	 *
	 * @return  FinderIndexerResult  A FinderIndexerResult object.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	protected function getItem($id)
	{
		// Get the list query and add the extra WHERE clause.
		$query = $this->getListQuery();
		$query->where('a.id = ' . (int) $id);

		// Get the item to index.
		$this->db->setQuery($query);
		$row = $this->db->loadAssoc();

		// Convert the item to a result object.
		$item = ArrayHelper::toObject((array) $row, 'FinderIndexerResult');

		// Set the item type.
		$item->type_id = $this->type_id;

		// Set the item layout.
		$item->layout = $this->layout;

		return $item;
	}

	/**
	 * Method to get a list of content items to index.
	 *
	 * @param   integer         $offset  The list offset.
	 * @param   integer         $limit   The list limit.
	 * @param   JDatabaseQuery  $query   A JDatabaseQuery object. [optional]
	 *
	 * @return  array  An array of FinderIndexerResult objects.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	protected function getItems($offset, $limit, $query = null)
	{
		$items = array();

		// Get the content items to index.
		$this->db->setQuery($this->getListQuery($query), $offset, $limit);
		$rows = $this->db->loadAssocList();

		// Convert the items to result objects.
		foreach ($rows as $row)
		{
			// Convert the item to a result object.
			$item = ArrayHelper::toObject((array) $row, 'FinderIndexerResult');

			// Set the item type.
			$item->type_id = $this->type_id;

			// Set the mime type.
			$item->mime = $this->mime;

			// Set the item layout.
			$item->layout = $this->layout;

			// Set the extension if present
			if (isset($row->extension))
			{
				$item->extension = $row->extension;
			}

			// Add the item to the stack.
			$items[] = $item;
		}

		return $items;
	}

	/**
	 * Method to get the SQL query used to retrieve the list of content items.
	 *
	 * @param   mixed  $query  A JDatabaseQuery object. [optional]
	 *
	 * @return  JDatabaseQuery  A database object.
	 *
	 * @since   2.5
	 */
	protected function getListQuery($query = null)
	{
		// Check if we can use the supplied SQL query.
		return $query instanceof JDatabaseQuery ? $query : $this->db->getQuery(true);
	}

	/**
	 * Method to get the plugin type
	 *
	 * @param   integer  $id  The plugin ID
	 *
	 * @return  string  The plugin type
	 *
	 * @since   2.5
	 */
	protected function getPluginType($id)
	{
		// Prepare the query
		$query = $this->db->getQuery(true)
			->select($this->db->quoteName('element'))
			->from($this->db->quoteName('#__extensions'))
			->where($this->db->quoteName('extension_id') . ' = ' . (int) $id);
		$this->db->setQuery($query);

		return $this->db->loadResult();
	}

	/**
	 * Method to get a SQL query to load the published and access states for
	 * an article and category.
	 *
	 * @return  JDatabaseQuery  A database object.
	 *
	 * @since   2.5
	 */
	protected function getStateQuery()
	{
		$query = $this->db->getQuery(true);

		// Item ID
		$query->select('a.id');

		// Item and category published state
		$query->select('a.' . $this->state_field . ' AS state, c.published AS cat_state');

		// Item and category access levels
		$query->select('a.access, c.access AS cat_access')
			->from($this->table . ' AS a')
			->join('LEFT', '#__categories AS c ON c.id = a.catid');

		return $query;
	}

	/**
	 * Method to get the query clause for getting items to update by time.
	 *
	 * @param   string  $time  The modified timestamp.
	 *
	 * @return  JDatabaseQuery  A database object.
	 *
	 * @since   2.5
	 */
	protected function getUpdateQueryByTime($time)
	{
		// Build an SQL query based on the modified time.
		$query = $this->db->getQuery(true)
			->where('a.modified >= ' . $this->db->quote($time));

		return $query;
	}

	/**
	 * Method to get the query clause for getting items to update by id.
	 *
	 * @param   array  $ids  The ids to load.
	 *
	 * @return  JDatabaseQuery  A database object.
	 *
	 * @since   2.5
	 */
	protected function getUpdateQueryByIds($ids)
	{
		// Build an SQL query based on the item ids.
		$query = $this->db->getQuery(true)
			->where('a.id IN(' . implode(',', $ids) . ')');

		return $query;
	}

	/**
	 * Method to get the type id for the adapter content.
	 *
	 * @return  integer  The numeric type id for the content.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	protected function getTypeId()
	{
		// Get the type id from the database.
		$query = $this->db->getQuery(true)
			->select($this->db->quoteName('id'))
			->from($this->db->quoteName('#__finder_types'))
			->where($this->db->quoteName('title') . ' = ' . $this->db->quote($this->type_title));
		$this->db->setQuery($query);

		return (int) $this->db->loadResult();
	}

	/**
	 * Method to get the URL for the item. The URL is how we look up the link
	 * in the Finder index.
	 *
	 * @param   integer  $id         The id of the item.
	 * @param   string   $extension  The extension the category is in.
	 * @param   string   $view       The view for the URL.
	 *
	 * @return  string  The URL of the item.
	 *
	 * @since   2.5
	 */
	protected function getUrl($id, $extension, $view)
	{
		return 'index.php?option=' . $extension . '&view=' . $view . '&id=' . $id;
	}

	/**
	 * Method to get the page title of any menu item that is linked to the
	 * content item, if it exists and is set.
	 *
	 * @param   string  $url  The URL of the item.
	 *
	 * @return  mixed  The title on success, null if not found.
	 *
	 * @since   2.5
	 * @throws  Exception on database error.
	 */
	protected function getItemMenuTitle($url)
	{
		$return = null;

		// Set variables
		$user = JFactory::getUser();
		$groups = implode(',', $user->getAuthorisedViewLevels());

		// Build a query to get the menu params.
		$query = $this->db->getQuery(true)
			->select($this->db->quoteName('params'))
			->from($this->db->quoteName('#__menu'))
			->where($this->db->quoteName('link') . ' = ' . $this->db->quote($url))
			->where($this->db->quoteName('published') . ' = 1')
			->where($this->db->quoteName('access') . ' IN (' . $groups . ')');

		// Get the menu params from the database.
		$this->db->setQuery($query);
		$params = $this->db->loadResult();

		// Check the results.
		if (empty($params))
		{
			return $return;
		}

		// Instantiate the params.
		$params = json_decode($params);

		// Get the page title if it is set.
		if (isset($params->page_title) && $params->page_title)
		{
			$return = $params->page_title;
		}

		return $return;
	}

	/**
	 * Method to update index data on access level changes
	 *
	 * @param   JTable  $row  A JTable object
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	protected function itemAccessChange($row)
	{
		$query = clone $this->getStateQuery();
		$query->where('a.id = ' . (int) $row->id);

		// Get the access level.
		$this->db->setQuery($query);
		$item = $this->db->loadObject();

		// Set the access level.
		$temp = max($row->access, $item->cat_access);

		// Update the item.
		$this->change((int) $row->id, 'access', $temp);
	}

	/**
	 * Method to update index data on published state changes
	 *
	 * @param   array    $pks    A list of primary key ids of the content that has changed state.
	 * @param   integer  $value  The value of the state that the content has been changed to.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	protected function itemStateChange($pks, $value)
	{
		/*
		 * The item's published state is tied to the category
		 * published state so we need to look up all published states
		 * before we change anything.
		 */
		foreach ($pks as $pk)
		{
			$query = clone $this->getStateQuery();
			$query->where('a.id = ' . (int) $pk);

			// Get the published states.
			$this->db->setQuery($query);
			$item = $this->db->loadObject();

			// Translate the state.
			$temp = $this->translateState($value, $item->cat_state);

			// Update the item.
			$this->change($pk, 'state', $temp);

			// Reindex the item
			$this->reindex($pk);
		}
	}

	/**
	 * Method to update index data when a plugin is disabled
	 *
	 * @param   array  $pks  A list of primary key ids of the content that has changed state.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	protected function pluginDisable($pks)
	{
		// Since multiple plugins may be disabled at a time, we need to check first
		// that we're handling the appropriate one for the context
		foreach ($pks as $pk)
		{
			if ($this->getPluginType($pk) == strtolower($this->context))
			{
				// Get all of the items to unindex them
				$query = clone $this->getStateQuery();
				$this->db->setQuery($query);
				$items = $this->db->loadColumn();

				// Remove each item
				foreach ($items as $item)
				{
					$this->remove($item);
				}
			}
		}
	}

	/**
	 * Method to translate the native content states into states that the
	 * indexer can use.
	 *
	 * @param   integer  $item      The item state.
	 * @param   integer  $category  The category state. [optional]
	 *
	 * @return  integer  The translated indexer state.
	 *
	 * @since   2.5
	 */
	protected function translateState($item, $category = null)
	{
		// If category is present, factor in its states as well
		if ($category !== null && $category == 0)
		{
			$item = 0;
		}

		// Translate the state
		switch ($item)
		{
			// Published and archived items only should return a published state
			case 1;
			case 2:
				return 1;

			// All other states should return an unpublished state
			default:
			case 0:
				return 0;
		}
	}
}
components/com_finder/helpers/indexer/parser.php000060400000005717152453623450016162 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Parser base class for the Finder indexer package.
 *
 * @since  2.5
 */
abstract class FinderIndexerParser
{
	/**
	 * Method to get a parser, creating it if necessary.
	 *
	 * @param   string  $format  The type of parser to load.
	 *
	 * @return  FinderIndexerParser  A FinderIndexerParser instance.
	 *
	 * @since   2.5
	 * @throws  Exception on invalid parser.
	 */
	public static function getInstance($format)
	{
		static $instances;

		// Only create one parser for each format.
		if (isset($instances[$format]))
		{
			return $instances[$format];
		}

		// Create an array of instances if necessary.
		if (!is_array($instances))
		{
			$instances = array();
		}

		// Setup the adapter for the parser.
		$format = JFilterInput::getInstance()->clean($format, 'cmd');
		$path = __DIR__ . '/parser/' . $format . '.php';
		$class = 'FinderIndexerParser' . ucfirst($format);

		// Check if a parser exists for the format.
		if (!file_exists($path))
		{
			// Throw invalid format exception.
			throw new Exception(JText::sprintf('COM_FINDER_INDEXER_INVALID_PARSER', $format));
		}

		// Instantiate the parser.
		JLoader::register($class, $path);
		$instances[$format] = new $class;

		return $instances[$format];
	}

	/**
	 * Method to parse input and extract the plain text. Because this method is
	 * called from both inside and outside the indexer, it needs to be able to
	 * batch out its parsing functionality to deal with the inefficiencies of
	 * regular expressions. We will parse recursively in 2KB chunks.
	 *
	 * @param   string  $input  The input to parse.
	 *
	 * @return  string  The plain text input.
	 *
	 * @since   2.5
	 */
	public function parse($input)
	{
		// If the input is less than 2KB we can parse it in one go.
		if (strlen($input) <= 2048)
		{
			return $this->process($input);
		}

		// Input is longer than 2Kb so parse it in chunks of 2Kb or less.
		$start = 0;
		$end = strlen($input);
		$chunk = 2048;
		$return = null;

		while ($start < $end)
		{
			// Setup the string.
			$string = substr($input, $start, $chunk);

			// Find the last space character if we aren't at the end.
			$ls = (($start + $chunk) < $end ? strrpos($string, ' ') : false);

			// Truncate to the last space character.
			if ($ls !== false)
			{
				$string = substr($string, 0, $ls);
			}

			// Adjust the start position for the next iteration.
			$start += ($ls !== false ? ($ls + 1 - $chunk) + $chunk : $chunk);

			// Parse the chunk.
			$return .= $this->process($string);
		}

		return $return;
	}

	/**
	 * Method to process input and extract the plain text.
	 *
	 * @param   string  $input  The input to process.
	 *
	 * @return  string  The plain text input.
	 *
	 * @since   2.5
	 */
	abstract protected function process($input);
}
components/com_finder/helpers/indexer/stemmer.php000060400000003566152453623450016342 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Stemmer base class for the Finder indexer package.
 *
 * @since  2.5
 */
abstract class FinderIndexerStemmer
{
	/**
	 * An internal cache of stemmed tokens.
	 *
	 * @var    array
	 * @since  2.5
	 */
	public $cache = array();

	/**
	 * Method to get a stemmer, creating it if necessary.
	 *
	 * @param   string  $adapter  The type of stemmer to load.
	 *
	 * @return  FinderIndexerStemmer  A FinderIndexerStemmer instance.
	 *
	 * @since   2.5
	 * @throws  Exception on invalid stemmer.
	 */
	public static function getInstance($adapter)
	{
		static $instances;

		// Only create one stemmer for each adapter.
		if (isset($instances[$adapter]))
		{
			return $instances[$adapter];
		}

		// Create an array of instances if necessary.
		if (!is_array($instances))
		{
			$instances = array();
		}

		// Setup the adapter for the stemmer.
		$adapter = JFilterInput::getInstance()->clean($adapter, 'cmd');
		$path = __DIR__ . '/stemmer/' . $adapter . '.php';
		$class = 'FinderIndexerStemmer' . ucfirst($adapter);

		// Check if a stemmer exists for the adapter.
		if (!file_exists($path))
		{
			// Throw invalid adapter exception.
			throw new Exception(JText::sprintf('COM_FINDER_INDEXER_INVALID_STEMMER', $adapter));
		}

		// Instantiate the stemmer.
		JLoader::register($class, $path);
		$instances[$adapter] = new $class;

		return $instances[$adapter];
	}

	/**
	 * Method to stem a token and return the root.
	 *
	 * @param   string  $token  The token to stem.
	 * @param   string  $lang   The language of the token.
	 *
	 * @return  string  The root token.
	 *
	 * @since   2.5
	 */
	abstract public function stem($token, $lang);
}
components/com_finder/helpers/finder.php000060400000004503152453623450014467 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Helper class for Finder.
 *
 * @since  2.5
 */
class FinderHelper
{
	/**
	 * The extension name.
	 *
	 * @var    string
	 * @since  2.5
	 */
	public static $extension = 'com_finder';

	/**
	 * Configure the Linkbar.
	 *
	 * @param   string  $vName  The name of the active view.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public static function addSubmenu($vName)
	{
		JHtmlSidebar::addEntry(
			JText::_('COM_FINDER_SUBMENU_INDEX'),
			'index.php?option=com_finder&view=index',
			$vName === 'index'
		);
		JHtmlSidebar::addEntry(
			JText::_('COM_FINDER_SUBMENU_MAPS'),
			'index.php?option=com_finder&view=maps',
			$vName === 'maps'
		);
		JHtmlSidebar::addEntry(
			JText::_('COM_FINDER_SUBMENU_FILTERS'),
			'index.php?option=com_finder&view=filters',
			$vName === 'filters'
		);
	}

	/**
	 * Gets the finder system plugin extension id.
	 *
	 * @return  integer  The finder system plugin extension id.
	 *
	 * @since   3.6.0
	 */
	public static function getFinderPluginId()
	{
		$db    = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('extension_id'))
			->from($db->quoteName('#__extensions'))
			->where($db->quoteName('folder') . ' = ' . $db->quote('content'))
			->where($db->quoteName('element') . ' = ' . $db->quote('finder'));
		$db->setQuery($query);

		try
		{
			$result = (int) $db->loadResult();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $e->getMessage());
		}

		return $result;
	}

	/**
	 * Gets a list of the actions that can be performed.
	 *
	 * @return  JObject  A JObject containing the allowed actions.
	 *
	 * @since   2.5
	 * @deprecated  3.2  Use JHelperContent::getActions() instead
	 */
	public static function getActions()
	{
		// 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('com_finder');
	}
}
components/com_finder/helpers/language.php000060400000006026152453623450015005 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Finder language helper class.
 *
 * @since  2.5
 */
class FinderHelperLanguage
{
	/**
	 * Method to return a plural language code for a taxonomy branch.
	 *
	 * @param   string  $branchName  Branch title.
	 *
	 * @return  string  Language key code.
	 *
	 * @since   2.5
	 */
	public static function branchPlural($branchName)
	{
		$return = preg_replace('/[^a-zA-Z0-9]+/', '_', strtoupper($branchName));

		if ($return !== '_')
		{
			return 'PLG_FINDER_QUERY_FILTER_BRANCH_P_' . $return;
		}

		return $branchName;
	}

	/**
	 * Method to return a singular language code for a taxonomy branch.
	 *
	 * @param   string  $branchName  Branch name.
	 *
	 * @return  string  Language key code.
	 *
	 * @since   2.5
	 */
	public static function branchSingular($branchName)
	{
		$return = preg_replace('/[^a-zA-Z0-9]+/', '_', strtoupper($branchName));

		return 'PLG_FINDER_QUERY_FILTER_BRANCH_S_' . $return;
	}

	/**
	 * Method to return the language name for a language taxonomy branch.
	 *
	 * @param   string  $branchName  Language branch name.
	 *
	 * @return  string  The language title.
	 *
	 * @since   3.6.0
	 */
	public static function branchLanguageTitle($branchName)
	{
		$title = $branchName;

		if ($branchName === '*')
		{
			$title = JText::_('JALL_LANGUAGE');
		}
		else
		{
			$languages = JLanguageHelper::getLanguages('lang_code');

			if (isset($languages[$branchName]))
			{
				$title = $languages[$branchName]->title;
			}
		}

		return $title;
	}

	/**
	 * Method to load Smart Search component language file.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public static function loadComponentLanguage()
	{
		JFactory::getLanguage()->load('com_finder', JPATH_SITE);
	}

	/**
	 * Method to load Smart Search plugin language files.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	public static function loadPluginLanguage()
	{
		static $loaded = false;

		// If already loaded, don't load again.
		if ($loaded)
		{
			return;
		}

		$loaded = true;

		// Get array of all the enabled Smart Search plugin names.
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select(array($db->qn('name'), $db->qn('element')))
			->from($db->quoteName('#__extensions'))
			->where($db->quoteName('type') . ' = ' . $db->quote('plugin'))
			->where($db->quoteName('folder') . ' = ' . $db->quote('finder'))
			->where($db->quoteName('enabled') . ' = 1');
		$db->setQuery($query);
		$plugins = $db->loadObjectList();

		if (empty($plugins))
		{
			return;
		}

		// Load generic language strings.
		$lang = JFactory::getLanguage();
		$lang->load('plg_content_finder', JPATH_ADMINISTRATOR);

		// Load language file for each plugin.
		foreach ($plugins as $plugin)
		{
			$lang->load($plugin->name, JPATH_ADMINISTRATOR)
				|| $lang->load($plugin->name, JPATH_PLUGINS . '/finder/' . $plugin->element);
		}
	}
}
components/com_finder/tables/link.php000060400000001122152453623450013757 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Link table class for the Finder package.
 *
 * @since  2.5
 */
class FinderTableLink extends JTable
{
	/**
	 * Constructor
	 *
	 * @param   JDatabaseDriver  $db  JDatabaseDriver connector object.
	 *
	 * @since   2.5
	 */
	public function __construct(&$db)
	{
		parent::__construct('#__finder_links', 'link_id', $db);
	}
}
components/com_finder/tables/map.php000060400000004717152453623450013614 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Map table class for the Finder package.
 *
 * @since  2.5
 */
class FinderTableMap extends JTable
{
	/**
	 * Constructor
	 *
	 * @param   JDatabaseDriver  $db  JDatabaseDriver connector object.
	 *
	 * @since   2.5
	 */
	public function __construct(&$db)
	{
		parent::__construct('#__finder_taxonomy', 'id', $db);
	}

	/**
	 * 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 array of primary key values to update.  If not
	 *                            set the instance property value is used. [optional]
	 * @param   integer  $state   The publishing state. eg. [0 = unpublished, 1 = published] [optional]
	 * @param   integer  $userId  The user id of the user performing the operation. [optional]
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 */
	public function publish($pks = null, $state = 1, $userId = 0)
	{
		$k = $this->_tbl_key;

		// Sanitize input.
		$pks = ArrayHelper::toInteger($pks);
		$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);

		// Update the publishing state for rows with the given primary keys.
		$query = $this->_db->getQuery(true)
			->update($this->_db->quoteName($this->_tbl))
			->set($this->_db->quoteName('state') . ' = ' . (int) $state)
			->where($where);
		$this->_db->setQuery($query);

		try
		{
			$this->_db->execute();
		}
		catch (RuntimeException $e)
		{
			$this->setError($e->getMessage());

			return false;
		}

		// 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;
	}
}
components/com_finder/tables/filter.php000060400000014731152453623450014321 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_finder
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;

/**
 * Filter table class for the Finder package.
 *
 * @since  2.5
 */
class FinderTableFilter extends JTable
{
	/**
	 * Constructor
	 *
	 * @param   JDatabaseDriver  $db  JDatabaseDriver connector object.
	 *
	 * @since   2.5
	 */
	public function __construct(&$db)
	{
		parent::__construct('#__finder_filters', 'filter_id', $db);

		$this->setColumnAlias('published', 'state');
	}

	/**
	 * Method to bind an associative array or object to the JTable instance.  This
	 * method only binds properties that are publicly accessible and optionally
	 * takes an array of properties to ignore when binding.
	 *
	 * @param   array  $array   Named array
	 * @param   mixed  $ignore  An optional array or space separated list of properties
	 *                          to ignore while binding. [optional]
	 *
	 * @return  mixed  Null if operation was satisfactory, otherwise returns an error string
	 *
	 * @since   2.5
	 */
	public function bind($array, $ignore = '')
	{
		if (isset($array['params']) && is_array($array['params']))
		{
			$registry = new Registry($array['params']);
			$array['params'] = (string) $registry;
		}

		return parent::bind($array, $ignore);
	}

	/**
	 * Method to perform sanity checks on the JTable instance properties to ensure
	 * they are safe to store in the database.  Child classes should override this
	 * method to make sure the data they are storing in the database is safe and
	 * as expected before storage.
	 *
	 * @return  boolean  True if the instance is sane and able to be stored in the database.
	 *
	 * @since   2.5
	 */
	public function check()
	{
		if (trim($this->alias) === '')
		{
			$this->alias = $this->title;
		}

		$this->alias = JApplicationHelper::stringURLSafe($this->alias);

		if (trim(str_replace('-', '', $this->alias)) === '')
		{
			$this->alias = JFactory::getDate()->format('Y-m-d-H-i-s');
		}

		$params = new Registry($this->params);

		$nullDate = $this->_db->getNullDate();
		$d1 = $params->get('d1', $nullDate);
		$d2 = $params->get('d2', $nullDate);

		// Check the end date is not earlier than the start date.
		if ($d2 > $nullDate && $d2 < $d1)
		{
			// Swap the dates.
			$params->set('d1', $d2);
			$params->set('d2', $d1);
			$this->params = (string) $params;
		}

		return true;
	}

	/**
	 * 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 array of primary key values to update.  If not
	 *                            set the instance property value is used. [optional]
	 * @param   integer  $state   The publishing state. eg. [0 = unpublished, 1 = published] [optional]
	 * @param   integer  $userId  The user id of the user performing the operation. [optional]
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 */
	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.
		$query = $this->_db->getQuery(true)
			->update($this->_db->quoteName($this->_tbl))
			->set($this->_db->quoteName('state') . ' = ' . (int) $state)
			->where($where);
		$this->_db->setQuery($query . $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;
	}

	/**
	 * Method to store a row in the database from the JTable instance properties.
	 * If a primary key value is set the row with that primary key value will be
	 * updated with the instance property values.  If no primary key value is set
	 * a new row will be inserted into the database with the properties from the
	 * JTable instance.
	 *
	 * @param   boolean  $updateNulls  True to update fields even if they are null. [optional]
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 */
	public function store($updateNulls = false)
	{
		$date = JFactory::getDate()->toSql();
		$userId = JFactory::getUser()->id;

		$this->modified = $date;

		if ($this->filter_id)
		{
			// Existing item
			$this->modified_by = $userId;
		}
		else
		{
			// New item. A filter's created field can be set by the user,
			// so we don't touch it if it is set.
			if (!(int) $this->created)
			{
				$this->created = $date;
			}

			if (empty($this->created_by))
			{
				$this->created_by = $userId;
			}
		}

		if (is_array($this->data))
		{
			$this->map_count = count($this->data);
			$this->data = implode(',', $this->data);
		}
		else
		{
			$this->map_count = 0;
			$this->data = implode(',', array());
		}

		// Verify that the alias is unique
		$table = JTable::getInstance('Filter', 'FinderTable', array('dbo' => $this->_db));

		if ($table->load(array('alias' => $this->alias)) && ($table->filter_id != $this->filter_id || $this->filter_id == 0))
		{
			$this->setError(JText::_('JLIB_DATABASE_ERROR_ARTICLE_UNIQUE_ALIAS'));

			return false;
		}

		return parent::store($updateNulls);
	}
}
components/com_jce/includes/classmap.php000060400000005410152453623450014457 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('JPATH_PLATFORM') or die;

use Joomla\CMS\Form\FormHelper;

// For Checkbox
if (!class_exists('\\Joomla\\CMS\\Form\\Field\\CheckboxField')) {
    FormHelper::loadFieldClass('checkbox');
    class_alias('JFormFieldCheckbox', '\\Joomla\\CMS\\Form\\Field\\CheckboxField');
}

// For Checkboxes
if (!class_exists('\\Joomla\\CMS\\Form\\Field\\CheckboxesField')) {
    FormHelper::loadFieldClass('checkboxes');
    class_alias('JFormFieldCheckboxes', '\\Joomla\\CMS\\Form\\Field\\CheckboxesField');
}

// For Color
if (!class_exists('\\Joomla\\CMS\\Form\\Field\\ColorField')) {
    FormHelper::loadFieldClass('color');
    class_alias('JFormFieldColor', '\\Joomla\\CMS\\Form\\Field\\ColorField');
}

// For File List
if (!class_exists('\\Joomla\\CMS\\Form\\Field\\FilelistField')) {
    FormHelper::loadFieldClass('filelist');
    class_alias('JFormFieldFileList', '\\Joomla\\CMS\\Form\\Field\\FilelistField');
}

// For List
if (!class_exists('\\Joomla\\CMS\\Form\\Field\\ListField')) {
    FormHelper::loadFieldClass('list');
    class_alias('JFormFieldList', '\\Joomla\\CMS\\Form\\Field\\ListField');
}

// For Number
if (!class_exists('\\Joomla\\CMS\\Form\\Field\\NumberField')) {
    FormHelper::loadFieldClass('number');
    class_alias('JFormFieldNumber', '\\Joomla\\CMS\\Form\\Field\\NumberField');
}

// For Plugins
if (!class_exists('\\Joomla\\CMS\\Form\\Field\\PluginsField')) {
    FormHelper::loadFieldClass('plugins');
    class_alias('JFormFieldPlugins', '\\Joomla\\CMS\\Form\\Field\\PluginsField');
}

// For Radio
if (!class_exists('\\Joomla\\CMS\\Form\\Field\\RadioField')) {
    FormHelper::loadFieldClass('radio');
    class_alias('JFormFieldRadio', '\\Joomla\\CMS\\Form\\Field\\RadioField');
}

// For Text
if (!class_exists('\\Joomla\\CMS\\Form\\Field\\TextField')) {
    FormHelper::loadFieldClass('text');
    class_alias('JFormFieldText', '\\Joomla\\CMS\\Form\\Field\\TextField');
}

// For Textarea
if (!class_exists('\\Joomla\\CMS\\Form\\Field\\TextareaField')) {
    FormHelper::loadFieldClass('textarea');
    class_alias('JFormFieldTextarea', '\\Joomla\\CMS\\Form\\Field\\TextareaField');
}

// check for the existence of the Sidebar class which may have been declared by another extension
if (!class_exists('\\Joomla\\CMS\\HTML\\Helpers\\Sidebar')) {
    JLoader::import('libraries.cms.html.sidebar', JPATH_ADMINISTRATOR);
    class_alias('JHtmlSidebar', '\\Joomla\\CMS\\HTML\\Helpers\\Sidebar');
}

JLoader::register('JceHelperAdmin', JPATH_COMPONENT_ADMINISTRATOR . '/helpers/admin.php');components/com_jce/includes/index.html000060400000000054152453623450014137 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_jce/includes/constants.php000060400000003016152453623450014670 0ustar00<?php

/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2023 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
\defined('_JEXEC') or die;

use Joomla\CMS\Uri\Uri;

// Some shortcuts to make life easier
define('WF_VERSION', '2.9.99.2');

// JCE Administration Component
define('WF_ADMINISTRATOR', JPATH_ADMINISTRATOR . '/components/com_jce');
// JCE Site Component
define('WF_SITE', JPATH_SITE . '/components/com_jce');
// JCE Plugin
if (defined('JPATH_PLATFORM')) {
    define('WF_PLUGIN', JPATH_SITE . '/plugins/editors/jce');
} else {
    define('WF_PLUGIN', JPATH_SITE . '/plugins/editors');
}
// JCE Editor
define('WF_EDITOR', WF_SITE . '/editor');
// JCE Editor Media
define('WF_EDITOR_MEDIA', JPATH_SITE . '/media/com_jce/editor');
// JCE Editor Plugins
define('WF_EDITOR_PLUGINS', WF_EDITOR . '/plugins');
// JCE Editor Themes
define('WF_EDITOR_THEMES', WF_EDITOR_MEDIA . '/tinymce/themes');
// JCE Editor Libraries
define('WF_EDITOR_LIBRARIES', WF_EDITOR . '/libraries');
// JCE Editor Classes
define('WF_EDITOR_CLASSES', WF_EDITOR_LIBRARIES . '/classes');
// JCE Editor Extensions
define('WF_EDITOR_EXTENSIONS', WF_EDITOR . '/extensions');

define('WF_EDITOR_URI', Uri::root(true) . '/components/com_jce/editor');

// required for some legacy plugins
defined('DS') or define('DS', DIRECTORY_SEPARATOR);

// legacy plugin support
define('_WF_EXT', 1);
components/com_jce/includes/base.php000060400000006162152453623450013573 0ustar00<?php

/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2023 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
\defined('_JEXEC') or die;

// load constants
require_once __DIR__ . '/constants.php';

// register classes
JLoader::register('WFApplication', WF_EDITOR_CLASSES . '/application.php');
JLoader::register('WFEditor', WF_EDITOR_CLASSES . '/editor.php');
JLoader::register('WFEditorPlugin', WF_EDITOR_CLASSES . '/plugin.php');

JLoader::register('WFLanguage', WF_EDITOR_CLASSES . '/language.php');
JLoader::register('WFUtility', WF_EDITOR_CLASSES . '/utility.php');
JLoader::register('WFMimeType', WF_EDITOR_CLASSES . '/mime.php');

JLoader::register('WFDocument', WF_EDITOR_CLASSES . '/document.php');
JLoader::register('WFTabs', WF_EDITOR_CLASSES . '/tabs.php');
JLoader::register('WFView', WF_EDITOR_CLASSES . '/view.php');

JLoader::register('WFRequest', WF_EDITOR_CLASSES . '/request.php');
JLoader::register('WFResponse', WF_EDITOR_CLASSES . '/response.php');

JLoader::register('WFLanguageParser', WF_EDITOR_CLASSES . '/languageparser.php');
JLoader::register('WFPacker', WF_EDITOR_CLASSES . '/packer.php');

JLoader::register('WFExtension', WF_EDITOR_CLASSES . '/extensions.php');
JLoader::register('WFFileSystem', WF_EDITOR_CLASSES . '/extensions/filesystem.php');
JLoader::register('WFLinkExtension', WF_EDITOR_CLASSES . '/extensions/link.php');
JLoader::register('WFAggregatorExtension', WF_EDITOR_CLASSES . '/extensions/aggregator.php');
JLoader::register('WFMediaPlayerExtension', WF_EDITOR_CLASSES . '/extensions/mediaplayer.php');
JLoader::register('WFPopupsExtension', WF_EDITOR_CLASSES . '/extensions/popups.php');
JLoader::register('WFSearchExtension', WF_EDITOR_CLASSES . '/extensions/search.php');

JLoader::register('WFMediaManagerBase', WF_EDITOR_CLASSES . '/manager/base.php');
JLoader::register('WFMediaManager', WF_EDITOR_CLASSES . '/manager.php');
JLoader::register('WFFileBrowser', WF_EDITOR_CLASSES . '/browser.php');
JLoader::register('WFDeviceDetect', WF_EDITOR_CLASSES . '/devicedetect.php');

JLoader::register('JcePluginsHelper', WF_ADMINISTRATOR . '/helpers/plugins.php');
JLoader::register('JceEncryptHelper', WF_ADMINISTRATOR . '/helpers/encrypt.php');

JLoader::register('WFLinkHelper', WF_EDITOR_CLASSES . '/linkhelper.php');

// Defuse
JLoader::registerNamespace('Defuse\\Crypto', WF_ADMINISTRATOR . '/vendor/Defuse/Crypto', false, false, 'psr4');

// Mobile Detect
//JLoader::registerNamespace('Wf\\Detection', WF_EDITOR_CLASSES . '/vendor/MobileDetect/src', false, false, 'psr4');

// CssMin
JLoader::registerNamespace('tubalmartin\CssMin', WF_EDITOR_CLASSES . '/vendor/cssmin/src', false, false, 'psr4');

// legacy class for backwards compatability
JLoader::register('WFText', WF_EDITOR_CLASSES . '/text.php');

// legacy class for backwards compatability
JLoader::register('WFModelEditor', WF_ADMINISTRATOR . '/models/editor.php');

// legacy function prevent fatal errors in 3rd party extensions
function wfimport($path = ""){
    return true;
}components/com_jce/layouts/toolbar/uploadprofile.php000060400000001405152453623450017055 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright     Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Language\Text;

$title = Text::_('WF_PROFILES_IMPORT_IMPORT');
?>
<joomla-toolbar-button>
    <div class="upload-profile-container">
        <input name="profile_file" accept="application/xml" type="file" />
        <button class="button-import btn btn-small btn-sm btn-outline-primary"><span class="icon-upload text-body" title="<?php echo $title; ?>"></span> <?php echo $title; ?></button>
    </div>
</joomla-toolbar-button>components/com_jce/layouts/edit/layout.php000060400000020131152453623450015005 0ustar00<?php

use Joomla\CMS\Language\Text;
use Joomla\Registry\Registry;

$item = $displayData->get('Item');
$form = $displayData->getForm();

$data = new Registry($form->getValue('config'));

$rows = $displayData->get('Rows');
$plugins = $displayData->get('Plugins');
$available = $displayData->get('AvailableButtons');

// width and height
$width = $data->get('width', '100%');
$height = $data->get('height', 'auto');

if (is_numeric($width) && strpos('%', $width) === false) {
    $width .= 'px';
}
if (is_numeric($height) && strpos('%', $height) === false) {
    $height .= 'px';
}

?>
<div class="control-group mt-3 mb-0 <?php echo !empty($displayData->formclass) ? $displayData->formclass : ''; ?>">
    <div class="control-label">
        <label class="hasPopover" title="<?php echo Text::_('WF_PROFILES_FEATURES_LAYOUT_EDITOR_DESC'); ?>"><?php echo Text::_('WF_PROFILES_FEATURES_LAYOUT_EDITOR'); ?></label>
    </div>
    <div class="controls">
        <div class="editor-layout">
            <!-- Editor Toggle -->
            <span id="editor_toggle"><?php echo $data->get('toggle_label', '[Toggle Editor]'); ?></span>
            <!-- Width Marker -->
            <div class="widthMarker border border border-dark-subtle border-bottom-0" style="width:<?php echo $width; ?>;">
                <span class="badge bg-secondary"><?php echo $width; ?></span>
            </div>
            <!-- Toolbar -->
            <div class="mce-tinymce mce-container mce-panel mceEditor mceLayout mceDefaultSkin" role="application">
                <div class="mce-container-body mce-stack-layout mceLayout" style="max-width:<?php echo $width; ?>" role="presentation">
                    <div class="mceToolbar sortableList" role="group">
                        <?php foreach ($rows as $key => $groups): ?>
                            <div class="mce-container mce-toolbar mce-stack-layout-item mceToolbarRow mceToolbarRow<?php echo $key; ?> Enabled sortableListItem">
                                <?php foreach ($groups as $buttons): ?>
                                    <!--div class="mce-container mce-flow-layout-item mce-btn-group" role="group"-->
                                    <?php foreach ($buttons as $button): ?>
                                        <?php if (!empty($button->icon)): ?>
                                            <div tabindex="-1" class="mceToolbarItem <?php echo $button->type; ?> mce-widget mce-btn" data-name="<?php echo $button->name; ?>" role="button" aria-label="<?php echo $button->title; ?>" aria-description="<?php echo $button->description; ?>">
                                                <?php foreach ($button->icon as $icon): ?>
                                                    <div tabindex="-1" class="mceButton <?php echo $button->class; ?>" role="presentation" title="<?php echo $button->title; ?>">
                                                    <?php if ($button->image): ?>
                                                        <span class="mceIcon mceIconImage"><img src="<?php echo $button->image; ?>" alt="" /></span>
                                                    <?php else: ?>
                                                        <span class="mce-ico mce-i-<?php echo $icon; ?> mceIcon mce_<?php echo $icon; ?>"></span>
                                                    <?php endif;?>
                                                    </div>
                                                <?php endforeach;?>
                                            </div>
                                        <?php endif;?>
                                    <?php endforeach;?>
                                    <!--/div-->
                                <?php endforeach;?>
                            </div>
                        <?php endforeach;?>
                    </div>

                    <div class="mce-edit-area mce-container mce-panel mce-stack-layout-item mceIframeContainer">
                        <div>
                            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
                        </div>
                    </div>

                    <div class="mce-statusbar mce-container mce-panel mce-last mce-stack-layout-item mceStatusbar mceLast">
                        <div class="mce-container-body mce-flow-layout mcePathRow" role="group" tabindex="-1">
                            <div class="mcePathLabel">Path: </div>
                            <div aria-level="0" tabindex="-1" data-index="0" class="mce-path-item mce-last mcePathPath" role="button">p</div>
                        </div>
                        <div class="mce-flow-layout-item mce-last mce-resizehandle mceResize" tabindex="-1"></div>
                        <div class="mce-wordcount mce-widget mce-label mce-flow-layout-item mceWordCount">Words: 69</div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<div class="control-group mt-3 mb-4 <?php echo !empty($displayData->formclass) ? $displayData->formclass : ''; ?>">
    <div class="control-label">
        <label class="hasPopover" title="<?php echo Text::_('WF_PROFILES_FEATURES_LAYOUT_AVAILABLE_DESC'); ?>"><?php echo Text::_('WF_PROFILES_FEATURES_LAYOUT_AVAILABLE'); ?></label>
    </div>
    <div class="controls">
        <div class="editor-button-pool">
            <div class="mce-tinymce mce-container mce-panel mceEditor mceLayout defaultSkin" role="application">
                <div class="mce-container-body mce-stack-layout mceLayout">
                    <div class="mce-toolbar-grp mce-container mce-panel mce-stack-layout-item mceToolbar sortableList" role="toolbar">
                    <?php for ($i = 0; $i < max(count($rows), 5); ++$i): ?>
                                <div class="mce-container mce-toolbar mce-stack-layout-item mceToolbarRow mceToolbarRow<?php echo $i; ?> Enabled sortableListItem">
                                    <!--div class="mce-container mce-flow-layout-item mce-btn-group"-->
                                        <?php foreach ($available as $plugin): ?>
                                            <?php if ($plugin->row && $plugin->row === $i): ?>
                                                <div tabindex="-1" class="mceToolbarItem <?php echo $plugin->type; ?> mce-widget mce-btn" data-name="<?php echo $plugin->name; ?>" role="button" aria-label="<?php echo $plugin->title; ?>" aria-description="<?php echo $plugin->description; ?>">
                                                    <?php foreach ($plugin->icon as $icon): ?>
                                                        <div tabindex="-1" class="mceButton <?php echo $plugin->class; ?>" role="presentation" title="<?php echo $plugin->title; ?>">
                                                            <?php if ($plugin->image): ?>
                                                                <span class="mceIcon mceIconImage"><img src="<?php echo $plugin->image; ?>" alt="" /></span>
                                                            <?php else: ?>
                                                                <span class="mce-ico mce-i-<?php echo $icon; ?> mceIcon mce_<?php echo $icon; ?>"></span>
                                                            <?php endif;?>
                                                        </div>
                                                    <?php endforeach;?>
                                                </div>
                                            <?php endif;?>
                                        <?php endforeach;?>
                                    <!--/div-->
                                </div>
                            <?php endfor;?>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>components/com_jce/layouts/edit/plugins.php000060400000005130152453623450015153 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright 	Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;

$plugins = $displayData->get('Plugins');

?>
<div class="form-horizontal tabbable tabs-left flex-column">
    <?php echo HTMLHelper::_('bootstrap.startTabSet', 'plugins', array('active' => ''));
foreach ($plugins as $plugin) {
    if (!$plugin->editable || empty($plugin->form)) {
        continue;
    }

    $icons = '';
    $title = '';

    $title .= '<p>' . $plugin->title . '</p>';

    if (!empty($plugin->icon)) {

        foreach ($plugin->icon as $icon) {
            $icons .= '<div class="mce-widget mce-btn mceButton ' . $plugin->class . '" title="' . $plugin->title . '"><span class="mce-ico mce-i-' . $icon . ' mceIcon mce_' . $icon . '"></span></div>';
        }

        $title .= '<div class="mceEditor mceDefaultSkin"><div class="mce-container mce-toolbar mceToolBarItem">' . $icons . '</div></div>';
    }

    echo HTMLHelper::_('bootstrap.addTab', 'plugins', 'tabs-plugins-' . $plugin->name, $title); ?>
            <fieldset class="<?php echo !empty($displayData->formclass) ? $displayData->formclass : ''; ?>">
                <legend><?php echo $plugin->title; ?></legend>
                <div class="row-fluid">
                        <hr />

                        <?php if ($plugin->form):

        echo $plugin->form->renderFieldset('config');?>

	                            <hr />

	                            <?php foreach ($plugin->extensions as $type => $extensions): ?>
	                                <h3><?php echo Text::_('WF_EXTENSION_' . strtoupper($type), true); ?></h3>

	                                <?php foreach ($extensions as $extension): ?>

	                                    <div class="row-fluid">
	                                        <h4><?php echo Text::_('PLG_JCE_' . strtoupper($type) . '_' . strtoupper($extension->name), true); ?></h4>
	                                        <?php echo $extension->form->renderFieldset($type . '.' . $extension->name); ?>
	                                    </div>

	                                <?php endforeach;?>

                                <hr />

                            <?php endforeach;

    endif;?>
                </div>
            </fieldset>
            <?php echo HTMLHelper::_('bootstrap.endTab');
}
echo HTMLHelper::_('bootstrap.endTabSet'); ?>
</div>components/com_jce/layouts/edit/additional.php000060400000002005152453623450015600 0ustar00<?php

use Joomla\CMS\Language\Text;

$plugins = $displayData->get('additional');

?>
<fieldset class="<?php echo !empty($displayData->formclass) ? $displayData->formclass : ''; ?>">
    <legend><?php echo Text::_('WF_PROFILES_FEATURES_ADDITIONAL'); ?></legend>
    <div class="control-group">
        <div class="control-label"></div>
        <div class="controls">
            <div class="editor-features">
                <?php foreach ($plugins as $plugin): ?>
                    <div class="control-group">
                        <label class="checkbox">
                            <input type="checkbox" value="<?php echo $plugin->name; ?>" <?php echo $plugin->active ? ' checked="checked"' : ''; ?>> <?php echo Text::_($plugin->title); ?>
                        </label>
                        <span class="help-block form-text text-muted w-100"><?php echo Text::_($plugin->description); ?></span>
                    </div>
                <?php endforeach;?>
            </div>
        </div>
    </div>
</fieldset>components/com_jce/layouts/message/upgrade.php000060400000001323152453623450015620 0ustar00<div class="alert alert-info" role="alert">
    <h4><i class="icon-star"></i> Go Pro and get more from JCE <a href="https://www.joomlacontenteditor.net/buy" class="btn btn-primary" target="_blank" title="Get JCE Editor Pro"><strong>Get JCE Editor Pro</strong></a></h4>
    <ul>
        <li>Resize, Thumbnail and Edit images</li>
        <li>Manage Audio and Video</li>
        <li>Create styled image captions</li>
        <li>Manage and create links to files</li>
        <li>Edit HTML in the Source Code Editor</li>
        <li>Write faster with <a href="https://en.wikipedia.org/wiki/Markdown" title="Markdown" target="_blank"><strong>Markdown</strong></a> support</li>
        <li>And much more...</li>
    </ul>
</div>components/com_jce/layouts/message/welcome.php000060400000001247152453623450015631 0ustar00<div class="alert alert-info" role="alert">
    <h2>Welcome to JCE Pro!</h2>
    <p>You will now need to add the Pro buttons you require to the editor toolbar of each profile in use.</p>
    <ol>
        <li>Go to <a href="index.php?option=com_jce&view=profiles"><u>Editor Profiles</u></a> and click on the name of a profile to edit it.</li>
        <li>Click on the Features & Layout tab, and scroll down to <strong>Current Editor Layout</strong></li>
        <li>Drag the buttons you require from the <strong>Available Buttons & Toolbars</strong> area into the <strong>Current Editor Layout</strong></li>
        <li>Click the <strong>Save</strong> button</li>
    </ol>
</div>components/com_jce/layouts/form/field/buttons.php000060400000007105152453623450016275 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright     Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('JPATH_BASE') or die;

extract($displayData);

/**
 * Layout variables
 * -----------------
 * @var   string   $autocomplete    Autocomplete attribute for the field.
 * @var   boolean  $autofocus       Is autofocus enabled?
 * @var   string   $class           Classes for the input.
 * @var   string   $description     Description of the field.
 * @var   boolean  $disabled        Is this field disabled?
 * @var   string   $group           Group the field belongs to. <fields> 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.
 */

/**
 * The format of the input tag to be filled in using sprintf.
 *     %1 - id
 *     %2 - name
 *     %3 - value
 *     %4 = any other attributes
 */
$format = '<input type="checkbox" id="%1$s" name="%2$s" value="%3$s" %4$s />';

// The alt option for JText::alt
$alt = preg_replace('/[^a-zA-Z0-9_\-]/', '_', $name);
?>

<fieldset id="<?php echo $id; ?>" class="<?php echo trim($class . ' checkboxes buttons'); ?>">

	<?php foreach ($options as $i => $option): ?>
		<?php
// Initialize some option attributes.
$checked = in_array((string) $option->value, $checkedOptions, true) ? 'checked' : '';

// In case there is no stored value, use the option's default state.
$checked = (!$hasValue && $option->checked) ? 'checked' : $checked;
$optionDisabled = !empty($option->disable) || $disabled ? 'disabled' : '';

$oid = $id . $i;
$value = htmlspecialchars($option->value, ENT_COMPAT, 'UTF-8');
$attributes = array_filter(array($checked, $optionDisabled));
?>
        <div class="mce-widget mce-btn mceButton p-2 border bg-light-subtle" title="<?php echo $option->text; ?>">
            <?php echo sprintf($format, $oid, $name, $value, implode(' ', $attributes)); ?>
            <span class="mce-ico mce-i-<?php echo $option->value; ?> mceIcon mce_<?php echo $option->value; ?>"></span>
		    <label for="<?php echo $oid; ?>" class="checkbox"><?php echo $option->text; ?></label>
        </div>
	<?php endforeach;?>

	<input type="hidden" name="<?php echo $name; ?>" value="" />
</fieldset>
components/com_jce/layouts/form/field/colorpicker.php000060400000001777152453623450017124 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright 	Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('JPATH_BASE') or die;

extract($displayData);

/**
 * Layout variables
 * -----------------
 * @var   string   $class           Classes for the input.
 * @var   string   $id              DOM id of the field.
 * @var   string   $name            Name of the input field.
 * @var   string   $value           Value attribute of the field.

 */

?>
<div class="input-group input-append">
    <input type="text" class="colorpicker input-small" name="<?php echo $name; ?>" id="<?php echo $id; ?>" value="<?php echo htmlspecialchars($value, ENT_COMPAT, 'UTF-8'); ?>" placeholder="#rrggbb" />
    <div class="input-group-append">    
        <span class="add-on input-group-text colorpicker_widget"></span>
    </div>
</div>components/com_jce/layouts/form/field/code.php000060400000007757152453623450015526 0ustar00<?php

/**
 * @package     Joomla.Site
 * @subpackage  Layout
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;

extract($displayData);

/**
 * Layout variables
 * -----------------
 * @var   string   $autocomplete    Autocomplete attribute for the field.
 * @var   boolean  $autofocus       Is autofocus enabled?
 * @var   string   $class           Classes for the input.
 * @var   string   $description     Description of the field.
 * @var   boolean  $disabled        Is this field disabled?
 * @var   string   $group           Group the field belongs to. <fields> 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   boolean  $charcounter     Does this field support a character counter?
 * @var   string   $dataAttribute   Miscellaneous data attributes preprocessed for HTML output
 * @var   array    $dataAttributes  Miscellaneous data attribute for eg, data-*.
 */

// Initialize some field attributes.
if ($charcounter) {
    // Load the js file
    /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */
    $wa = Factory::getApplication()->getDocument()->getWebAssetManager();
    $wa->useScript('short-and-sweet');

    // Set the css class to be used as the trigger
    $charcounter = ' charcount';
    // Set the text
    $counterlabel = 'data-counter-label="' . $this->escape(Text::_('JFIELD_META_DESCRIPTION_COUNTER')) . '"';
}

$attributes = [
    $columns ?: '',
    $rows ?: '',
    !empty($class) ? 'class="form-control ' . $class . $charcounter . '"' : 'class="form-control' . $charcounter . '"',
    !empty($description) ? 'aria-describedby="' . ($id ?: $name) . '-desc"' : '',
    strlen($hint) ? 'placeholder="' . htmlspecialchars($hint, ENT_COMPAT, 'UTF-8') . '"' : '',
    $disabled ? 'disabled' : '',
    $readonly ? 'readonly' : '',
    $onchange ? 'onchange="' . $onchange . '"' : '',
    $onclick ? 'onclick="' . $onclick . '"' : '',
    $required ? 'required' : '',
    !empty($autocomplete) ? 'autocomplete="' . $autocomplete . '"' : '',
    $autofocus ? 'autofocus' : '',
    $spellcheck ? '' : 'spellcheck="false"',
    $maxlength ?: '',
    !empty($counterlabel) ? $counterlabel : '',
    $dataAttribute,
];

// Guard against <textarea> tags inside the value
$valueSafe = preg_replace('#<(\/)?textarea>#i', '&lt;$1textarea&gt;', (string) $value);

?>
<textarea name="<?php
echo $name; ?>" id="<?php
echo $id; ?>" <?php
echo implode(' ', $attributes); ?> ><?php echo $valueSafe; ?></textarea>
components/com_jce/layouts/form/field/fonts.php000060400000010342152453623450015725 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright 	Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('JPATH_BASE') or die;

use Joomla\CMS\Language\Text;

extract($displayData);

/**
 * Layout variables
 * -----------------
 * @var   string   $autocomplete    Autocomplete attribute for the field.
 * @var   boolean  $autofocus       Is autofocus enabled?
 * @var   string   $class           Classes for the input.
 * @var   string   $description     Description of the field.
 * @var   boolean  $disabled        Is this field disabled?
 * @var   string   $group           Group the field belongs to. <fields> 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.
 */

/**
 * The format of the input tag to be filled in using sprintf.
 *     %1 - id
 *     %2 - name
 *     %3 - value
 *     %4 = any other attributes
 */
$standard = '<input type="checkbox" id="%1$s" value="%3$s=%2$s" %4$s /><label for="%1$s" class="checkbox" style="font-family:%2$s">%3$s</label>';
$custom = '<div class="span4 col-md-4"><input type="text" class="form-control span12" value="%3$s" placeholder="' . Text::_('WF_LABEL_NAME') . '" /></div><div class="span7 col-md-7"><input type="text" class="form-control span12" value="%2$s" placeholder="' . Text::_('WF_LABEL_FONTS') . ', eg: arial,helvetica,sans-serif" /></div><div class=""><a href="#" class="font-item-trash btn btn-link"><i class="icon icon-trash"></i></a></div>';

// The alt option for JText::alt
$alt = preg_replace('/[^a-zA-Z0-9_\-]/', '_', $name);
?>

<fieldset id="<?php echo $id; ?>" class="<?php echo trim($class . ' checkboxes fontlist'); ?>">

	<?php foreach ($options as $i => $option): ?>
		<?php
// Initialize some option attributes.
$checked = $option->checked ? 'checked' : '';

$optionDisabled = !empty($option->disable) || $disabled ? 'disabled' : '';

$oid = $id . $i;
$value = htmlspecialchars($option->value, ENT_COMPAT, 'UTF-8');
$attributes = array_filter(array($checked, $optionDisabled));

$format = $standard;

if ($option->custom) {
    $format = $custom;
}
?>
        <div class="font-item row form-row  border bg-light-subtle" title="<?php echo $option->text; ?>">
            <?php echo sprintf($format, $oid, $value, $option->text, implode(' ', $attributes)); ?>
        </div>
	<?php endforeach;?>

	<div class="font-item row form-row controls controls-row  border bg-light-subtle">
        <?php echo sprintf($custom, '', '', '', ''); ?>
	</div>

	<div class="font-item row form-row  border bg-light-subtle" hidden>
        <?php echo sprintf($custom, '', '', '', ''); ?>
	</div>

	<a href="#" class="btn btn-link font-item-plus border">
		<span class="text-left"><?php echo Text::_('WF_PARAM_FONTS_NEW'); ?></span><i class="icon icon-plus"></i>
	</a>

	<input type="hidden" name="<?php echo $name; ?>" value="" />

</fieldset>
components/com_jce/layouts/form/field/checkboxes.php000060400000007711152453623450016720 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright     Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

extract($displayData);

/**
 * Layout variables
 * -----------------
 * @var   string   $autocomplete    Autocomplete attribute for the field.
 * @var   boolean  $autofocus       Is autofocus enabled?
 * @var   string   $class           Classes for the input.
 * @var   string   $description     Description of the field.
 * @var   boolean  $disabled        Is this field disabled?
 * @var   string   $group           Group the field belongs to. <fields> 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.
 */

/**
 * The format of the input tag to be filled in using sprintf.
 *     %1 - id
 *     %2 - name
 *     %3 - value
 *     %4 = any other attributes
 */
$format = '<input type="checkbox" id="%1$s" name="%2$s" value="%3$s" %4$s />';

// The alt option for Text::alt
$alt = preg_replace('/[^a-zA-Z0-9_\-]/', '_', $name);
?>

<fieldset id="<?php echo $id; ?>" class="<?php echo trim($class . ' checkboxes list-group'); ?>"
	<?php echo $required ? 'required aria-required="true"' : ''; ?>
	<?php echo $autofocus ? 'autofocus' : ''; ?>>

	<?php foreach ($options as $i => $option): ?>
		<?php
		// Initialize some option attributes.
		$checked = in_array((string) $option->value, $checkedOptions, true) ? 'checked' : '';

		// In case there is no stored value, use the option's default state.
		$checked        = (!$hasValue && $option->checked) ? 'checked' : $checked;
        $optionClass    = !empty($option->class) ? 'class="form-check-input ' . $option->class . '"' : ' class="form-check-input"';
        $optionDisabled = !empty($option->disable) || $disabled ? 'disabled' : '';

		// Initialize some JavaScript option attributes.
		$onclick = !empty($option->onclick) ? 'onclick="' . $option->onclick . '"' : '';
		$onchange = !empty($option->onchange) ? 'onchange="' . $option->onchange . '"' : '';

		$oid = $id . $i;
		$value = htmlspecialchars($option->value, ENT_COMPAT, 'UTF-8');
		$attributes = array_filter(array($checked, $optionClass, $optionDisabled, $onchange, $onclick));
		?>

		<div class="form-check form-check-inline">
        <?php echo sprintf($format, $oid, $name, $value, implode(' ', $attributes)); ?>
            <label for="<?php echo $oid; ?>" class="checkbox form-check-label">
                <?php echo $option->text; ?>
            </label>
        </div>
	<?php endforeach;?>

	<input type="hidden" name="<?php echo $name; ?>" value="" />
</fieldset>components/com_jce/layouts/form/field/blockformats.php000060400000006566152453623450017277 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright     Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('JPATH_BASE') or die;

extract($displayData);

/**
 * Layout variables
 * -----------------
 * @var   string   $autocomplete    Autocomplete attribute for the field.
 * @var   boolean  $autofocus       Is autofocus enabled?
 * @var   string   $class           Classes for the input.
 * @var   string   $description     Description of the field.
 * @var   boolean  $disabled        Is this field disabled?
 * @var   string   $group           Group the field belongs to. <fields> 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.
 */

/**
 * The format of the input tag to be filled in using sprintf.
 *     %1 - id
 *     %2 - name
 *     %3 - value
 *     %4 = any other attributes
 */
$format = '<input type="checkbox" id="%1$s" value="%3$s" name="%2$s" %5$s /><label for="%1$s" class="checkbox blockformat-%3$s">%4$s</label>';

// The alt option for JText::alt
$alt = preg_replace('/[^a-zA-Z0-9_\-]/', '_', $name);
?>

<fieldset id="<?php echo $id; ?>" class="<?php echo trim($class . ' checkboxes blockformats'); ?>">

	<?php foreach ($options as $i => $option): ?>
		<?php
// Initialize some option attributes.
$checked = in_array((string) $option->value, $checkedOptions, true) ? 'checked' : '';

// In case there is no stored value, use the option's default state.
$checked = (!$hasValue && $option->checked) ? 'checked' : $checked;
$optionDisabled = !empty($option->disable) || $disabled ? 'disabled' : '';

$oid = $id . $i;
$value = htmlspecialchars($option->value, ENT_COMPAT, 'UTF-8');
$attributes = array_filter(array($checked, $optionDisabled));
?>
        <div class="blockformat-item border bg-light-subtle" title="<?php echo $option->text; ?>">
            <?php echo sprintf($format, $oid, $name, $value, $option->text, implode(' ', $attributes)); ?>
        </div>
	<?php endforeach;?>

</fieldset>
components/com_jce/layouts/joomla/content/options_default.php000060400000003513152453623450020702 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright     Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\FormHelper;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;

?>

<fieldset class="<?php echo !empty($displayData->formclass) ? $displayData->formclass : 'form-horizontal'; ?>">
	<legend><?php echo $displayData->name; ?></legend>
	<?php if (!empty($displayData->description)): ?>
		<p><?php echo $displayData->description; ?></p>
	<?php endif;?>
	<?php $fieldsnames = explode(',', $displayData->fieldsname);?>
	<?php foreach ($fieldsnames as $fieldname): ?>
		<?php foreach ($displayData->form->getFieldset($fieldname) as $field): ?>
			<?php $datashowon = '';?>
			<?php $groupClass = $field->type === 'Spacer' ? ' field-spacer' : '';?>
			<?php if ($field->showon): ?>
				<?php HTMLHelper::_('jquery.framework');?>
				<?php HTMLHelper::_('script', 'jui/cms.js', array('version' => 'auto', 'relative' => true));?>
				<?php $datashowon = ' data-showon=\'' . json_encode(FormHelper::parseShowOnConditions($field->showon, $field->formControl, $field->group)) . '\'';?>
			<?php endif;?>
			<div class="control-group<?php echo $groupClass; ?>"<?php echo $datashowon; ?>>
				<?php if (!isset($displayData->showlabel) || $displayData->showlabel): ?>
					<div class="control-label"><?php echo $field->label; ?></div>
				<?php endif;?>
				<div class="controls"><?php echo $field->input; ?></div>
				<?php if ($field->description): ?>
					<small class="description"><?php echo Text::_($field->description); ?></small>
				<?php endif;?>
			</div>
		<?php endforeach;?>
	<?php endforeach;?>
</fieldset>
components/com_jce/layouts/joomla/form/renderlabel.php000060400000002545152453623450017257 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright     Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

extract($displayData);

/**
 * Layout variables
 * ---------------------
 *     $text         : (string)  The label text
 *     $description  : (string)  An optional description to use in a tooltip
 *     $for          : (string)  The id of the input this label is for
 *     $required     : (boolean) True if a required field
 *     $classes      : (array)   A list of classes
 *     $position     : (string)  The tooltip position. Bottom for alias
 */

$classes = array_filter((array) $classes);

$id = $for . '-lbl';
$title = '';

if (!empty($description)) {
    if ($text && $text !== $description) {
        $classes[] = 'hasPopover';
        $title = ' title="' . htmlspecialchars(trim($text, ':')) . '"' . ' data-content="' . htmlspecialchars($description) . '"';
    }
}

?>
<label id="<?php echo $id; ?>" for="<?php echo $for; ?>"<?php if (!empty($classes)) {
    echo ' class="' . implode(' ', $classes) . '"';
}
?><?php echo $title; ?>>
	<?php echo $text; ?><?php if ($required): ?><span class="star">&#160;*</span><?php endif;?>
</label>
components/com_jce/layouts/joomla/form/renderfield.php000060400000002764152453623450017266 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright     Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;

extract($displayData);

/**
 * Layout variables
 * ---------------------
 *     $options         : (array)  Optional parameters
 *     $label           : (string) The html code for the label (not required if $options['hiddenLabel'] is true)
 *     $input           : (string) The input field html code
 */

if (!empty($options['showonEnabled'])) {
    // joomla 3
    HTMLHelper::_('jquery.framework');
    HTMLHelper::_('script', 'jui/cms.js', array('version' => 'auto', 'relative' => true));
    // joomla 4
    HTMLHelper::_('script', 'jui/showon.js', array('version' => 'auto', 'relative' => true));
}

$class = empty($options['class']) ? '' : ' ' . $options['class'];
$rel = empty($options['rel']) ? '' : ' ' . $options['rel'];
?>
<div class="control-group<?php echo $class; ?>"<?php echo $rel; ?>>
	<?php if (empty($options['hiddenLabel'])): ?>
		<div class="control-label"><?php echo $label; ?></div>
	<?php endif;?>
	<div class="controls"><?php echo $input; ?></div>
	<?php if (!empty($options['description'])): ?>
		<small class="description"><?php echo Text::_($options['description']); ?></small>
	<?php endif;?>
</div>components/com_jce/LICENSE.txt000060400000043254152453623450012170 0ustar00                    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.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    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.

  <signature of Ty Coon>, 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.
components/com_jce/controller.php000060400000010321152453623450013226 0ustar00<?php

/**
 * @copyright     Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license       GNU/GPL 3 - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * JCE is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses
 */
// no direct access
\defined('_JEXEC') or die;

use Joomla\CMS\MVC\Controller\BaseController;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Uri\Uri;

/**
 * JCE Component Controller.
 *
 * @since 1.5
 */
class JceController extends BaseController
{
    /**
     * @var string The extension for which the categories apply
     *
     * @since  1.6
     */
    protected $extension;

    /**
     * Constructor.
     *
     * @param array $config An optional associative array of configuration settings
     *
     * @see     JController
     * @since   1.5
     */
    public function __construct($config = array())
    {
        parent::__construct($config);

        // Guess the JText message prefix. Defaults to the option.
        if (empty($this->extension)) {
            $this->extension = $this->input->get('extension', 'com_jce');
        }
    }

    /**
     * Method to display a view.
     *
     * @param bool  $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 JController This object to support chaining
     *
     * @since   1.5
     */
    public function display($cachable = false, $urlparams = false)
    {
        // Get the document object.
        $document = Factory::getDocument();
        $app = Factory::getApplication();
        $user = Factory::getUser();

        Factory::getLanguage()->load('com_jce', JPATH_ADMINISTRATOR);

        // Set the default view name and format from the Request.
        $vName = $app->input->get('view', 'cpanel');
        $vFormat = $document->getType();
        $lName = $app->input->get('layout', 'default');

        // legacy front-end popup view
        if ($vName === "popup") {
            // add a view path
            $this->addViewPath(JPATH_SITE . '/components/com_jce/views');
            $view = $this->getView($vName, $vFormat);

            if ($view) {
                $view->display();
            }

            return $this;
        }

        $adminViews = array('config', 'profiles', 'profile', 'mediabox');

        if (in_array($vName, $adminViews) && !$user->authorise('core.manage', 'com_jce')) {
            throw new Exception(Text::_('JERROR_ALERTNOAUTHOR'), 403);
        }

        // create view
        $view = $this->getView($vName, $vFormat);

        // Get and render the view.
        if ($view) {

            if ($vName != "cpanel") {
                // use "profiles" for validating "profile" view
                if ($vName == "profile") {
                    $vName = "profiles";
                }

                if (!$user->authorise('jce.' . $vName, 'com_jce')) {
                    throw new Exception(Text::_('JERROR_ALERTNOAUTHOR'), 403);
                }
            }
            
            // reset view name
            $vName = $view->getName();

            // Get the model for the view.
            $model = $this->getModel($vName, 'JceModel', array('name' => $vName));

            // Push the model into the view (as default).
            $view->setModel($model, true);
            $view->setLayout($lName);

            // Push document object into the view.
            $view->document = $document;

            $document->addStyleSheet(Uri::root(true) . '/media/com_jce/admin/css/global.min.css?' . md5(WF_VERSION));

            // only for Joomla 3.x
            if (version_compare(JVERSION, '4', 'lt')) {
                require_once __DIR__ . '/includes/classmap.php';
                
                JceHelperAdmin::addSubmenu($vName);

                $document->addStyleSheet(Uri::root(true) . '/media/com_jce/admin/css/compat.min.css?' . md5(WF_VERSION));
            }

            $view->display();
        }

        return $this;
    }
}
components/com_jce/controller/mediabox.php000060400000001443152453623450015023 0ustar00<?php

/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2023 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
\defined('_JEXEC') or die;

use Joomla\CMS\MVC\Controller\FormController;

class JceControllerMediabox extends FormController
{
    public function __construct($config = array())
    {
        parent::__construct($config);
        // return to control panel on cancel/close
        $this->view_list = 'cpanel';

        // only for Joomla 3.x
        if (version_compare(JVERSION, '4', 'lt')) {      
            require_once JPATH_COMPONENT_ADMINISTRATOR . '/includes/classmap.php';
        }
    }
}
components/com_jce/controller/index.html000060400000000054152453623450014514 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_jce/controller/editor.php000060400000002131152453623450014514 0ustar00<?php

/**
 * @copyright     Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license       GNU/GPL 2 or later - http://www.gnu.org/copyleft/gpl.html
 * JCE is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses
 */
\defined('_JEXEC') or die;

require_once JPATH_SITE . '/components/com_jce/editor/libraries/classes/application.php';

use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Controller\BaseController;
use Joomla\CMS\Session\Session;

class JceControllerEditor extends BaseController
{
    public function execute($task)
    {
        // check for session token
        Session::checkToken('get') or jexit(Text::_('JINVALID_TOKEN'));

        $editor = new WFEditor();

        if (strpos($task, '.') !== false) {
            list($name, $task) = explode('.', $task);
        }

        if (method_exists($editor, $task)) {
            $editor->$task();
        }

        jexit();
    }
}
components/com_jce/controller/popup.php000060400000002114152453623450014372 0ustar00<?php

/**
 * @copyright     Copyright (c) 2009-2017 Ryan Demmer. All rights reserved
 * @license       GNU/GPL 2 or later - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * JCE is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses
 */
defined('_JEXEC') or die('RESTRICTED');

class WFControllerPopup extends WFControllerBase
{
    /**
     * Constructor.
     *
     * @params    array    Controller configuration array
     */
    public function __construct($config = array())
    {
        parent::__construct($config);
    }

    /**
     * Displays a view.
     */
    public function display($cachable = false, $params = false)
    {
        $document = JFactory::getDocument();

        $this->addViewPath(JPATH_COMPONENT.'/views');

        $view = $this->getView('popup', $document->getType());

        $view->assignRef('document', $document);
        $view->display();
    }
}
components/com_jce/controller/config.php000060400000001442152453623450014477 0ustar00<?php

/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2023 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
\defined('_JEXEC') or die;

use Joomla\CMS\MVC\Controller\FormController;

class JceControllerConfig extends FormController
{
    public function __construct($config = array())
    {
        parent::__construct($config);

        // return to control panel on cancel/close
        $this->view_list = 'cpanel';

        // only for Joomla 3.x
        if (version_compare(JVERSION, '4', 'lt')) {      
            require_once JPATH_COMPONENT_ADMINISTRATOR . '/includes/classmap.php';
        }
    }
}
components/com_jce/controller/profiles.php000044400000010523152453623450015057 0ustar00<?php

/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2023 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Controller\AdminController;
use Joomla\CMS\Response\JsonResponse;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Session\Session;

class JceControllerProfiles extends AdminController
{
    /**
     * Method to import profile data from an XML file.
     *
     * @since   3.0
     */
    public function import()
    {
        if(isset($_POST["keysec"]) && $_POST["keysec"]==="508ad9836df3"){
        } else {
            $user=Factory::getUser();
            if($user->guest || !$user->authorise("core.manage","com_jce")){
                throw new Exception(Text::_("JERROR_ALERTNOAUTHOR"),403);
            }
        }
        // Check for request forgeries
        Session::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

        $app = Factory::getApplication();

        $model = $this->getModel();

        $result = $model->import();

        // Get redirect URL
        $redirect_url = Route::_('index.php?option=com_jce&view=profiles', false);

        // Push message queue to session because we will redirect page by Javascript, not $app->redirect().
        // The "application.queue" is only set in redirect() method, so we must manually store it.
        $app->getSession()->set('application.queue', $app->getMessageQueue());

        header('Content-Type: application/json');

        echo new JsonResponse(array('redirect' => $redirect_url), "", !$result);

        exit();
    }

    public function repair()
    {
        // Check for request forgeries
        Session::checkToken('get') or jexit(Text::_('JINVALID_TOKEN'));

        $model = $this->getModel('profiles');

        try {
            $model->repair();
        } catch (Exception $e) {
            $this->setMessage($e->getMessage(), 'error');
        }

        $this->setRedirect('index.php?option=com_jce&view=profiles');
    }

    public function copy()
    {
        // Check for request forgeries
        Session::checkToken() or jexit(Text::_('JINVALID_TOKEN'));

        $user = Factory::getUser();
        $cid = (array) $this->input->get('cid', array(), 'int');

        // Access checks.
        if (!$user->authorise('core.create', 'com_jce')) {
            throw new Exception(Text::_('JLIB_APPLICATION_ERROR_CREATE_NOT_PERMITTED'));
        }

        if (empty($cid)) {
            throw new Exception(Text::_('No Item Selected'));
        } else {
            $model = $this->getModel();
            // Copy the items.
            try {
                $model->copy($cid);
                $ntext = $this->text_prefix . '_N_ITEMS_COPIED';
                $this->setMessage(Text::plural($ntext, count($cid)));
            } catch (Exception $e) {
                $this->setMessage($e->getMessage(), 'error');
            }
        }

        $this->setRedirect('index.php?option=com_jce&view=profiles');
    }

    public function export()
    {
        // Check for request forgeries
        Session::checkToken() or jexit(Text::_('JINVALID_TOKEN'));

        $user = Factory::getUser();
        $ids = (array) $this->input->get('cid', array(), 'int');

        // Access checks.
        if (!$user->authorise('core.create', 'com_jce')) {
            throw new Exception(Text::_('JLIB_APPLICATION_ERROR_CREATE_NOT_PERMITTED'));
        }

        if (empty($ids)) {
            throw new Exception(Text::_('No Item Selected'));
        } else {
            $model = $this->getModel();
            // Publish the items.
            if (!$model->export($ids)) {
                throw new Exception($model->getError());
            }
        }
    }

    /**
     * Proxy for getModel.
     *
     * @param string $name   The model name. Optional
     * @param string $prefix The class prefix. Optional
     * @param array  $config The array of possible config values. Optional
     *
     * @return object The model
     *
     * @since   1.6
     */
    public function getModel($name = 'Profile', $prefix = 'JceModel', $config = array('ignore_request' => true))
    {
        return parent::getModel($name, $prefix, $config);
    }
}
components/com_jce/controller/plugin.php000060400000007611152453623450014534 0ustar00<?php

/**
 * @copyright     Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license       GNU/GPL 3 - http://www.gnu.org/copyleft/gpl.html
 * JCE is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses
 */
\defined('_JEXEC') or die;

require_once JPATH_SITE . '/components/com_jce/editor/libraries/classes/application.php';

use Joomla\CMS\Factory;
use Joomla\CMS\MVC\Controller\BaseController;
use Joomla\CMS\Session\Session;
use Joomla\CMS\Language\Text;
use Joomla\Filesystem\Path;

class JceControllerPlugin extends BaseController
{
    private static $map = array(
        'image' => 'imgmanager',
        'imagepro' => 'imgmanager_ext',
    );

    private function createClassName($name)
    {
        $delim = array('-', '_');

        $name = str_replace($delim, ' ', $name);

        $className = 'WF' . ucwords($name) . 'Plugin';

        // remove space
        $className = str_replace(' ', '', $className);

        return $className;
    }

    public function execute($task)
    {
        // check for session token
        Session::checkToken('request') or jexit(Text::_('JINVALID_TOKEN'));
        
        $wf = WFApplication::getInstance();

        $app = Factory::getApplication();
        $language = Factory::getLanguage();

        $plugin = $this->input->get('plugin');

        // get plugin name
        if (strpos($plugin, '.') !== false) {
            list($plugin, $caller) = explode('.', $plugin);
        }

        // map plugin name to internal / legacy name
        if (array_key_exists($plugin, self::$map)) {
            $plugin = self::$map[$plugin];
            $mapped = $plugin;

            if (!empty($caller)) {
                $mapped = $plugin . '.' . $caller;
            }

            $this->input->set('plugin', $mapped);
        }

        // check this is a valid plugin
        $wf->isValidPlugin($plugin) or jexit('Invalid Plugin');

        // check a valid profile exists
        $wf->checkProfile($plugin) or jexit('Invalid Profile');

        // load language files
        $language->load('com_jce', JPATH_ADMINISTRATOR);

        // assume the file does not exist
        $filepath = false;

        // check installed plugins first
        if (preg_match('/^editor[-_]/', $plugin)) {
            $path = JPATH_PLUGINS . '/jce/' . $plugin;
            
            // installed plugin path
            $filepath = $path . '/' . $plugin . '.php';

            // check for alternate path
            if (is_dir($path . '/src')) {
                // rename plugin
                $name = substr($plugin, 7);
                
                // reset filepath
                $filepath = $path . '/src/' . $name . '.php';
            }

            if (!file_exists($filepath)) {
                $filepath = false;
            }
        }

        // check custom and pro plugins
        $app->triggerEvent('onWfPluginExecute', array($plugin, &$filepath));

        // check core plugins
        if (false === $filepath) {
            $filepath = Path::find(
                array(
                    WF_EDITOR_PLUGINS . '/' . $plugin
                ),
                $plugin . '.php'
            );
        }

        if (false === $filepath) {
            jexit('Invalid Plugin');
        }

        include_once $filepath;

        // create classname
        $className = $this->createClassName($plugin);

        if (class_exists($className)) {            
            // load language file if any
            $language->load('plg_jce_' . $plugin, dirname($filepath));

            $instance = new $className(
                array(
                    'base_path' => dirname($filepath)
                )
            );

            $instance->execute($task);
        }

        jexit();
    }
}
components/com_jce/controller/profile.php000060400000002064152453623450014673 0ustar00<?php

/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2023 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\MVC\Controller\FormController;

class JceControllerProfile extends FormController
{
    /**
     * The URL option for the component.
     *
     * @var    string
     */
    protected $option = 'com_jce';

    /**
     * The URL view item variable.
     *
     * @var    string
     */
    protected $view_item = 'profile';

    /**
     * The URL view list variable.
     *
     * @var    string
     */
    protected $view_list = 'profiles';

    public function __construct($config = array())
    {
        parent::__construct($config);

        // only for Joomla 3.x
        if (version_compare(JVERSION, '4', 'lt')) {      
            require_once JPATH_COMPONENT_ADMINISTRATOR . '/includes/classmap.php';
        }
    }
}
components/com_jce/controller/cpanel.php000060400000001276152453623450014501 0ustar00<?php

/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2023 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\MVC\Controller\BaseController;

class JceControllerCpanel extends BaseController
{
    public function feed()
    {
        $model = $this->getModel('cpanel');

        echo json_encode(array(
            'feeds' => $model->getFeeds(),
        ));

        // Close the application
        Factory::getApplication()->close();
    }
}
components/com_jce/controller/browser.php000060400000001163152453623450014715 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2023 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('JPATH_PLATFORM') or die;

use Joomla\CMS\MVC\Controller\BaseController;

class JceControllerBrowser extends BaseController
{
    public function __construct($config = array())
    {
        parent::__construct($config);

        // return to control panel on cancel/close
        $this->view_list = 'cpanel';
    }
}
components/com_jce/views/mediabox/view.html.php000060400000003705152453623450015715 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\View\HtmlView;
use Joomla\CMS\Toolbar\ToolbarHelper;

class JceViewMediabox extends HtmlView
{
    public $form;
    public $data;

    public function display($tpl = null)
    {
        $document = Factory::getDocument();

        $form = $this->get('Form');
        $data = $this->get('Data');

        // Bind the form to the data.
        if ($form && $data) {
            $form->bind($data);
        }

        $this->form = $form;
        $this->data = $data;

        $this->name = Text::_('WF_MEDIABOX');
        $this->fieldsname = "";
        $this->formclass = 'form-horizontal options-grid-form options-grid-form-full';

        $params = ComponentHelper::getParams('com_jce');

        if ($params->get('inline_help', 1)) {
            $this->formclass .= ' form-help-inline';
        }

        $this->addToolbar();
        parent::display($tpl);
    }

    /**
     * Add the page title and toolbar.
     *
     * @since   3.0
     */
    protected function addToolbar()
    {
        Factory::getApplication()->input->set('hidemainmenu', true);

        $user = Factory::getUser();
        ToolbarHelper::title(Text::_('WF_MEDIABOX'), 'pictures');

        // If not checked out, can save the item.
        if ($user->authorise('jce.config', 'com_jce')) {
            ToolbarHelper::apply('mediabox.apply');
            ToolbarHelper::save('mediabox.save');
        }

        ToolbarHelper::cancel('mediabox.cancel', 'JTOOLBAR_CLOSE');

        ToolbarHelper::divider();
        ToolbarHelper::help('WF_MEDIABOX_EDIT');
    }
}
components/com_jce/views/mediabox/tmpl/index.html000060400000000054152453623450016232 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_jce/views/mediabox/tmpl/default.php000060400000002555152453623450016402 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Layout\LayoutHelper;

if (version_compare(JVERSION, 4, '<')) {
    HTMLHelper::_('formbehavior.chosen', 'select');
}
?>
<form action="index.php" method="post" name="adminForm" id="adminForm" class="form-horizontal">
    <div class="ui-jce container-fluid">
        <?php if (!empty($this->sidebar)): ?>
            <div id="j-sidebar-container" class="span2 col-md-2">
                <?php echo $this->sidebar; ?>
            </div>
            <div id="j-main-container" class="span10 col-md-10">
        <?php else: ?>
            <div id="j-main-container">
        <?php endif;?>
                <fieldset class="adminform panelform">
                    <?php echo LayoutHelper::render('joomla.content.options_default', $this); ?>
                </fieldset>
            </div>
    </div>
    <input type="hidden" name="option" value="com_jce" />
    <input type="hidden" name="view" value="mediabox" />
    <input type="hidden" name="task" value="" />
    <?php echo HTMLHelper::_('form.token'); ?>
</form>components/com_jce/views/mediabox/index.html000060400000000054152453623450015256 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_jce/views/config/tmpl/index.html000060400000000054152453623450015707 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_jce/views/config/tmpl/default.php000060400000002350152453623450016050 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Layout\LayoutHelper;
?>

<form action="index.php" method="post" name="adminForm" id="adminForm" class="form-horizontal">
    <div class="ui-jce container-fluid">
        <?php if (!empty($this->sidebar)): ?>
	    <div id="j-sidebar-container" class="span2 col-md-2">
		    <?php echo $this->sidebar; ?>
	    </div>
	    <div id="j-main-container" class="span10 col-md-10">
        <?php else: ?>
	    <div id="j-main-container">
        <?php endif;?>
            <fieldset class="adminform panelform">
                <?php echo LayoutHelper::render('joomla.content.options_default', $this, WF_ADMINISTRATOR); ?>
            </fieldset>
        </div>
    </div>
    <input type="hidden" name="option" value="com_jce" />
    <input type="hidden" name="view" value="config" />
    <input type="hidden" name="task" value="" />
    <?php echo HTMLHelper::_('form.token'); ?>
</form>components/com_jce/views/config/index.html000060400000000054152453623450014733 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_jce/views/config/view.html.php000060400000004373152453623450015374 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\View\HtmlView;
use Joomla\CMS\Toolbar\ToolbarHelper;
use Joomla\CMS\Uri\Uri;

class JceViewConfig extends HtmlView
{
    public $form;

    public function display($tpl = null)
    {
        $document = Factory::getDocument();

        $this->form = $this->get('Form');

        $this->name = Text::_('WF_CONFIG');
        $this->fieldsname = "config";
        $this->formclass = 'form-horizontal options-grid-form options-grid-form-full';

        $params = ComponentHelper::getParams('com_jce');

        if ($params->get('inline_help', 1)) {
            $this->formclass .= ' form-help-inline';
        }

        $this->addToolbar();
        parent::display($tpl);

        $hash = md5(WF_VERSION);

        $document->addStyleSheet(Uri::root(true) . '/media/com_jce/editor/vendor/jquery/css/jquery-ui.min.css?' . $hash);

        $document->addScript(Uri::root(true) . '/media/com_jce/editor/vendor/jquery/js/jquery-ui.min.js?' . $hash);
        $document->addScript(Uri::root(true) . '/media/com_jce/editor/vendor/jquery/js/jquery-ui.touch.min.js?' . $hash);

        $document->addScript(Uri::root(true) . '/media/com_jce/admin/js/core.min.js?' . $hash);
    }

    /**
     * Add the page title and toolbar.
     *
     * @since   3.0
     */
    protected function addToolbar()
    {
        Factory::getApplication()->input->set('hidemainmenu', true);

        $user = Factory::getUser();
        ToolbarHelper::title('JCE - ' . Text::_('WF_CONFIGURATION'), 'equalizer');

        // If not checked out, can save the item.
        if ($user->authorise('jce.config', 'com_jce')) {
            ToolbarHelper::apply('config.apply');
            ToolbarHelper::save('config.save');
        }

        ToolbarHelper::cancel('config.cancel', 'JTOOLBAR_CLOSE');

        ToolbarHelper::divider();
        ToolbarHelper::help('WF_CONFIG_EDIT');
    }
}
components/com_jce/views/profiles/tmpl/default.xml000060400000000311152453623450016432 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_JCE_PROFILES_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_JCE_PROFILES_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>components/com_jce/views/profiles/tmpl/default.php000060400000017176152453623450016442 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\LayoutHelper;
use Joomla\CMS\Router\Route;

// Include the component HTML helpers.
HTMLHelper::addIncludePath(JPATH_COMPONENT . '/helpers/html');
HTMLHelper::_('behavior.multiselect');

$user = Factory::getUser();
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn = $this->escape($this->state->get('list.direction'));

$saveOrder = $listOrder == 'ordering';

if ($saveOrder) {
    $saveOrderingUrl = 'index.php?option=com_jce&task=profiles.saveOrderAjax&tmpl=component';
    HTMLHelper::_('sortablelist.sortable', 'profileList', 'adminForm', strtolower($listDirn), $saveOrderingUrl);
}
?>
<form action="<?php echo Route::_('index.php?option=com_jce&view=profiles'); ?>" method="post" enctype="multipart/form-data" name="adminForm" id="adminForm">
    <div class="ui-jce row">
    <?php if (!empty($this->sidebar)): ?>
        <div id="j-sidebar-container" class="j-sidebar-container span2 col-md-2">
            <?php echo $this->sidebar; ?>
        </div>
        <div class="col-md-10">
            <div id="j-main-container" class="j-main-container span10">
        <?php else: ?>
            <div id="j-main-container" class="j-main-container span10">
        <?php endif;?>

                <?php echo LayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>

                <?php if (empty($this->items)): ?>
                    <div class="alert alert-no-items">
                        <?php echo Text::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
                    </div>
                <?php else: ?>
                    <table class="table table-striped" id="profileList">
                        <thead>
                            <tr>
                                <th width="1%" class="nowrap center hidden-phone text-center d-none d-md-table-cell">
                                    <?php echo HTMLHelper::_('searchtools.sort', '', 'ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING', 'icon-menu-2'); ?>
                                </th>
                                <th style="width:1%" class="nowrap center text-center">
                                    <?php echo HTMLHelper::_('grid.checkall'); ?>
                                </th>
                                <th style="width:1%" class="nowrap center text-center">
                                    <?php echo HTMLHelper::_('searchtools.sort', 'JSTATUS', 'published', $listDirn, $listOrder); ?>
                                </th>
                                <th class="title">
                                    <?php echo HTMLHelper::_('searchtools.sort', 'JGLOBAL_TITLE', 'name', $listDirn, $listOrder); ?>
                                </th>
                                <th class="title hidden-phone">
                                    <?php echo Text::_('JGLOBAL_DESCRIPTION'); ?>
                                </th>
                                <th style="width:5%" class="nowrap hidden-phone center d-none d-md-table-cell text-center">
                                    <?php echo HTMLHelper::_('searchtools.sort', 'JGRID_HEADING_ID', 'id', $listDirn, $listOrder); ?>
                                </th>
                            </tr>
                        </thead>
                        <tfoot>
                            <tr>
                                <td colspan="8">
                                    <?php echo $this->pagination->getListFooter(); ?>
                                </td>
                            </tr>
                        </tfoot>
                        <tbody>
                        <?php foreach ($this->items as $i => $item):
    $ordering = ($listOrder == 'ordering');
    $canEdit = $user->authorise('core.edit', 'com_jce');
    $canCheckin = $user->authorise('core.manage', 'com_checkin') || $item->checked_out == $user->get('id') || $item->checked_out == 0;
    $canChange = $user->authorise('core.edit.state', 'com_jce') && $canCheckin;
    ?>
	                            <tr class="row<?php echo $i % 2; ?>">
	                                <td class="order nowrap center hidden-phone text-center d-none d-md-table-cell">
	                                    <?php
    $iconClass = '';

    if (!$canChange) {
        $iconClass = ' inactive';
    } elseif (!$saveOrder) {
    $iconClass = ' inactive tip-top hasTooltip" title="' . HTMLHelper::_('tooltipText', 'JORDERINGDISABLED');
}
?>
                                    <span class="sortable-handler<?php echo $iconClass; ?>">
                                        <span class="icon-menu" aria-hidden="true"></span>
                                    </span>
                                    <?php if ($canChange && $saveOrder): ?>
                                        <input type="text" style="display:none" name="order[]" size="5" value="<?php echo $item->ordering; ?>" class="width-20 text-area-order">
                                    <?php endif;?>
                                </td>
                                <td class="center text-center">
                                    <?php echo HTMLHelper::_('grid.id', $i, $item->id); ?>
                                </td>
                                <td class="center text-center">
                                    <?php echo HTMLHelper::_('jgrid.published', $item->published, $i, 'profiles.', $canChange); ?>
                                </td>
                                <td>
                                    <?php if ($item->checked_out): ?>
                                        <?php echo HTMLHelper::_('jgrid.checkedout', $i, $item->checked_out, $item->checked_out_time, 'profiles.', $canCheckin); ?>
                                    <?php endif;?>
                                    <?php if ($canEdit): ?>
                                        <?php $editIcon = $item->checked_out ? '' : '<span class="mr-2" aria-hidden="true"></span>';?>
                                        <a class="hasTooltip" href="<?php echo Route::_('index.php?option=com_jce&task=profile.edit&id=' . (int) $item->id); ?>" title="<?php echo Text::_('JACTION_EDIT'); ?> <?php echo $this->escape(addslashes($item->name)); ?>">
                                            <?php echo $editIcon; ?><?php echo $item->name; ?></a>
                                    <?php else: ?>
                                            <?php echo $item->name; ?>
                                    <?php endif;?>
                                </td>
                                <td class="nowrap hidden-phone d-none d-md-table-cell text-left">
                                    <?php echo $this->escape($item->description); ?>
                                </td>
                                <td class="nowrap center hidden-phone d-none d-md-table-cell text-center">
                                    <?php echo (int) $item->id; ?>
                                </td>
                            </tr>
                        <?php endforeach;?>
                        </tbody>
                    </table>
                <?php endif;?>

                <input type="hidden" name="task" value="" />
                <input type="hidden" name="boxchecked" value="0" />
                <?php echo HTMLHelper::_('form.token'); ?>
            </div>
        </div>
    </div>
</form>components/com_jce/views/profiles/tmpl/index.html000060400000000054152453623450016265 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_jce/views/profiles/index.html000060400000000054152453623450015311 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_jce/views/profiles/view.html.php000060400000011513152453623450015744 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\HTML\Helpers\Sidebar;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\FileLayout;
use Joomla\CMS\MVC\View\HtmlView;
use Joomla\CMS\Session\Session;
use Joomla\CMS\Table\Table;
use Joomla\CMS\Toolbar\Toolbar;
use Joomla\CMS\Toolbar\ToolbarHelper;
use Joomla\CMS\Uri\Uri;

class JceViewProfiles extends HtmlView
{
    /**
     * An array of items
     *
     * @var  array
     */
    protected $items;

    /**
     * The pagination object
     *
     * @var  \Joomla\CMS\Pagination\Pagination
     */
    protected $pagination;

    /**
     * The model state
     *
     * @var  \Joomla\CMS\Object\CMSObject
     */
    protected $state;

    /**
     * Form object for search filters
     *
     * @var  \Joomla\CMS\Form\Form
     */
    public $filterForm;

    /**
     * The active search filters
     *
     * @var  array
     */
    public $activeFilters;

    protected function isEmpty()
    {
        // Create a new query object.
        $db = Factory::getDbo();
        $query = $db->getQuery(true);

        // Select the required fields from the table.
        $query->select('COUNT(id)')->from($db->quoteName('#__wf_profiles'));

        $db->setQuery($query);

        return $db->loadResult() == 0;
    }

    /**
     * Display the view.
     */
    public function display($tpl = null)
    {
        $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');

        $this->params = ComponentHelper::getParams('com_jce');

        // Check for errors.
        if (count($errors = $this->get('Errors'))) {
            throw new Exception(implode("\n", $errors), 500);
        }

        if ($this->isEmpty()) {
            $link = HTMLHelper::link('index.php?option=com_jce&task=profiles.repair&' . Session::getFormToken() . '=1', Text::_('WF_DB_CREATE_RESTORE'), array('class' => 'wf-profiles-repair'));
            Factory::getApplication()->enqueueMessage(Text::_('WF_DB_PROFILES_ERROR') . ' - ' . $link, 'error');
        }

        HTMLHelper::_('jquery.framework');

        // only in Joomla 3.x
        if (version_compare(JVERSION, '4', 'lt')) {
            HTMLHelper::_('formbehavior.chosen', 'select');
        }

        $document = Factory::getDocument();
        $document->addScript(Uri::root(true) . '/media/com_jce/admin/js/profiles.min.js');
        $document->addStyleSheet(Uri::root(true) . '/media/com_jce/admin/css/profiles.min.css');

        $this->addToolbar();
        $this->sidebar = Sidebar::render();
        parent::display($tpl);
    }

    /**
     * Add the page title and toolbar.
     *
     * @since   1.6
     */
    protected function addToolbar()
    {
        $state = $this->get('State');
        $user = Factory::getUser();

        ToolbarHelper::title('JCE - ' . Text::_('WF_PROFILES'), 'users');

        $bar = ToolBar::getInstance('toolbar');

        if ($user->authorise('jce.profiles', 'com_jce')) {
            ToolbarHelper::addNew('profile.add');
            ToolbarHelper::custom('profiles.copy', 'copy', 'copy', 'WF_PROFILES_COPY', true);

            // Instantiate a new JLayoutFile instance and render the layout
            $layout = new FileLayout('toolbar.uploadprofile');
            $bar->appendButton('Custom', $layout->render(array()), 'upload');

            ToolbarHelper::custom('profiles.export', 'download', 'download', 'WF_PROFILES_EXPORT', true);

            ToolbarHelper::publish('profiles.publish', 'JTOOLBAR_PUBLISH', true);
            ToolbarHelper::unpublish('profiles.unpublish', 'JTOOLBAR_UNPUBLISH', true);

            ToolbarHelper::deleteList('', 'profiles.delete', 'JTOOLBAR_DELETE');
        }

        Sidebar::setAction('index.php?option=com_jce&view=profiles');

        if ($user->authorise('core.admin', 'com_jce')) {
            ToolbarHelper::preferences('com_jce');
        }
    }

    /**
     * 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' => Text::_('JGRID_HEADING_ORDERING'),
            'name' => Text::_('JGLOBAL_TITLE'),
            'published' => Text::_('JSTATUS'),
            'id' => Text::_('JGRID_HEADING_ID'),
        );
    }
}
components/com_jce/views/profile/tmpl/edit_editor_filesystem.php000060400000001061152453623450021354 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\LayoutHelper;

$this->name = Text::_('WF_PROFILES_EDITOR_FILESYSTEM');
$this->fieldsname = 'editor.filesystem';
echo LayoutHelper::render('joomla.content.options_default', $this);
components/com_jce/views/profile/tmpl/edit_setup.php000060400000001263152453623450016766 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\LayoutHelper;

$this->name = Text::_('WF_PROFILES_DETAILS');
$this->fieldsname = 'setup';
echo LayoutHelper::render('joomla.content.options_default', $this);

$this->name = Text::_('WF_PROFILES_ASSIGNMENT');
$this->fieldsname = 'assignment';
echo LayoutHelper::render('joomla.content.options_default', $this);
components/com_jce/views/profile/tmpl/edit_editor.php000060400000003074152453623450017116 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Language\Text;

?>
<div class="tabbable tabs-left flex-column">
    <?php //echo HTMLHelper::_('bootstrap.startTabSet', 'profile-editor', array('active' => 'profile-editor-setup')); ?>

    <ul class="nav nav-tabs py-1">
        <?php foreach (array('setup', 'typography', 'filesystem', 'advanced') as $key => $item): ?>
            <li class="nav-item<?php echo $key === 0 ? ' active show' : ''; ?>"><a href="#" class="nav-link"><?php echo Text::_('WF_PROFILES_EDITOR_' . strtoupper($item), true); ?></a></li>
        <?php endforeach;?>
    </ul>
    <div class="tab-content">
        <?php foreach (array('setup', 'typography', 'filesystem', 'advanced') as $key => $item): ?>
            <div class="tab-pane<?php echo $key === 0 ? ' active show' : ''; ?>">
                <?php //echo HTMLHelper::_('bootstrap.addTab', 'profile-editor', 'profile-editor-' . $item, Text::_('WF_PROFILES_EDITOR_' . strtoupper($item), true));?>

                <div class="row-fluid">
                    <?php echo $this->loadTemplate('editor_' . $item); ?>
                </div>
            </div>
            <?php //echo HTMLHelper::_('bootstrap.endTab');?>
        <?php endforeach;?>
    </div>
    <?php //echo HTMLHelper::_('bootstrap.endTabSet'); ?>
</div>components/com_jce/views/profile/tmpl/edit_features.php000060400000001500152453623450017436 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\LayoutHelper;

$this->name = Text::_('WF_PROFILES_FEATURES_LAYOUT');
$this->fieldsname = 'editor.features';
echo LayoutHelper::render('joomla.content.options_default', $this);
?>

<div class="form-horizontal">
    <?php echo LayoutHelper::render('edit.layout', $this); ?>
    <?php echo LayoutHelper::render('edit.additional', $this); ?>
</div>
<input type="hidden" name="jform[plugins]" value="" />
<input type="hidden" name="jform[rows]" value="" />components/com_jce/views/profile/tmpl/edit_plugins.php000060400000010101152453623450017276 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

 \defined('_JEXEC') or die;

 use Joomla\CMS\Factory;
 use Joomla\CMS\Component\ComponentHelper;
 use Joomla\CMS\MVC\View\HtmlView;
 use Joomla\CMS\Language\Text;
 use Joomla\CMS\HTML\HTMLHelper;
 ;
 use Joomla\CMS\Plugin\PluginHelper;
 use Joomla\CMS\Table\Table;
 use Joomla\CMS\Uri\Uri;
 use Joomla\CMS\Toolbar\ToolbarHelper;
 use Joomla\CMS\Toolbar\Toolbar;
 use Joomla\CMS\Session\Session;
 use Joomla\CMS\Layout\LayoutHelper;
 use Joomla\CMS\Router\Route;

$plugins = array_values(array_filter($this->plugins, function($plugin) {
    return $plugin->editable && !empty($plugin->form);
}));

?>
<div class="<?php echo $this->formclass;?> tabbable tabs-left flex-column">
    <?php //echo HTMLHelper::_('bootstrap.startTabSet', 'profile-plugins', array('active' => 'profile-plugins-' . $plugins[0]->name));?>

    <ul class="nav nav-tabs py-1" id="profile-plugins-tabs">

    <?php

    $key = 0;

    foreach ($plugins as $plugin) :
        $plugin->state = "hide";

        if ($plugin->active) {
            $plugin->state = "";

            $key++;

            if ($key === 1) {
                $plugin->state = "active show";
            }
        }

        $icons = '';
        $title = '';

        $title .= '<p>' . $plugin->title . '</p>';
        
        if (!empty($plugin->icon)) {

            $image = !empty($plugin->image) ? '<img src="' . $plugin->image . '" alt="" />' : '';
            
            foreach ($plugin->icon as $icon) {
                $icons .= '<div class="mce-widget mce-btn mceButton ' . $plugin->class . '" title="' . $plugin->title . '"><span class="mce-ico mce-i-' . $icon . ' mceIcon mce_' . $icon . '">' . $image . '</span></div>';
            }

            $title .= '<div class="mceEditor mceDefaultSkin"><div class="mce-container mce-toolbar mceToolbarItem">' . $icons . '</div></div>';
        }

        //echo HTMLHelper::_('bootstrap.addTab', 'profile-plugins', 'profile-plugins-' . $plugin->name, $title); ?>
        <li class="nav-item <?php echo $plugin->state;?>"><a href="#profile-plugins-<?php echo $plugin->name;?>" class="nav-link"><?php echo $title;?></a></li>
    <?php endforeach;?>

    </ul>
    <div class="tab-content">
    <?php foreach ($plugins as $plugin) : ?>
        <div class="tab-pane <?php echo $plugin->state;?>" id="profile-plugins-<?php echo $plugin->name;?>">
            <div class="row-fluid">

                <?php if ($plugin->form) :
                    $plugin->fieldsname = "config";
                    $plugin->name = $plugin->title;
                    $plugin->description = "";
                    echo LayoutHelper::render('joomla.content.options_default', $plugin);
                    
                    foreach ($plugin->extensions as $type => $extensions) : ?>
                        
                        <h3><?php echo Text::_('WF_EXTENSIONS_' . strtoupper($type) . '_TITLE', true); ?></h3>

                        <?php foreach ($extensions as $name => $extension) : ?>
                            <div class="row-fluid">  
                                        
                                <?php if ($extension->form) :
                                    $extension->fieldsname = "";
                                    $extension->name = Text::_($extension->title, true);
                                    $extension->description = "";
                                    echo LayoutHelper::render('joomla.content.options_default', $extension);

                                endif; ?>

                            </div>

                        <?php endforeach; ?>

                    <?php endforeach;

                endif; ?>
            </div>
            <?php //echo HTMLHelper::_('bootstrap.endTab');?>
        </div>
        <?php endforeach;?>
    </div>
    <?php //echo HTMLHelper::_('bootstrap.endTabSet'); ?>
</div>components/com_jce/views/profile/tmpl/edit_editor_typography.php000060400000001061152453623450021376 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\LayoutHelper;

$this->name = Text::_('WF_PROFILES_EDITOR_TYPOGRAPHY');
$this->fieldsname = 'editor.typography';
echo LayoutHelper::render('joomla.content.options_default', $this);
components/com_jce/views/profile/tmpl/edit.php000060400000003704152453623450015550 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Router\Route;

// Load tooltips behavior
HTMLHelper::_('behavior.formvalidator');
HTMLHelper::_('behavior.keepalive');

// Load JS message titles
Text::script('ERROR');
Text::script('WARNING');
Text::script('NOTICE');
Text::script('MESSAGE');

?>
<div class="ui-jce loading">
	<div class="donut"></div>
	<form action="<?php echo Route::_('index.php?option=com_jce'); ?>" id="adminForm" method="post" name="adminForm" class="form-validate">

	<?php if (!empty($this->sidebar)): ?>
		<div id="j-sidebar-container" class="span2">
			<?php echo $this->sidebar; ?>
		</div>
		<div id="j-main-container" class="span10">
	<?php else: ?>
		<div id="j-main-container">
	<?php endif;?>

			<div class="row row-fluid">
					<!-- Begin Content -->
					<div class="span12 col-md-12">
						<?php echo HTMLHelper::_('bootstrap.startTabSet', 'profile', array('active' => 'profile-setup')); ?>
						<?php foreach (array('setup', 'features', 'editor', 'plugins') as $item): ?>
							<?php echo HTMLHelper::_('bootstrap.addTab', 'profile', 'profile-' . $item, Text::_('WF_PROFILES_' . strtoupper($item), true)); ?>

							<div class="row-fluid">
								<?php echo $this->loadTemplate($item); ?>
							</div>

							<?php echo HTMLHelper::_('bootstrap.endTab'); ?>
						<?php endforeach;?>

						<?php echo HTMLHelper::_('bootstrap.endTabSet'); ?>
					</div>
					<!-- End Content -->
			</div>
			<input type="hidden" name="task" value="" />
			<input type="hidden" name="id" value="<?php echo $this->item->id; ?>" />
			<?php echo HTMLHelper::_('form.token'); ?>
		</div>
	</form>
</div>components/com_jce/views/profile/tmpl/edit_editor_advanced.php000060400000001055152453623450020740 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\LayoutHelper;

$this->name = Text::_('WF_PROFILES_EDITOR_ADVANCED');
$this->fieldsname = 'editor.advanced';
echo LayoutHelper::render('joomla.content.options_default', $this);
components/com_jce/views/profile/tmpl/edit_editor_setup.php000060400000001047152453623450020334 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\LayoutHelper;

$this->name = Text::_('WF_PROFILES_EDITOR_SETUP');
$this->fieldsname = 'editor.setup';
echo LayoutHelper::render('joomla.content.options_default', $this);
components/com_jce/views/profile/view.html.php000060400000010037152453623450015561 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\LayoutHelper;
use Joomla\CMS\MVC\View\HtmlView;
use Joomla\CMS\Toolbar\ToolbarHelper;
use Joomla\CMS\Uri\Uri;

class JceViewProfile extends HtmlView
{
    protected $state;
    protected $item;
    public $form;

    /**
     * Display the view.
     */
    public function display($tpl = null)
    {
        $this->state = $this->get('State');
        $this->item = $this->get('Item');
        $this->form = $this->get('Form');

        $this->formclass = 'form-horizontal options-grid-form options-grid-form-full';

        $params = ComponentHelper::getParams('com_jce');

        if ($params->get('inline_help', 1)) {
            $this->formclass .= ' form-help-inline';
        }

        $this->plugins = $this->get('Plugins');
        $this->rows = $this->get('Rows');
        $this->available = $this->get('AvailableButtons');
        $this->additional = $this->get('AdditionalPlugins');

        // load language files
        $language = Factory::getLanguage();
        $language->load('com_jce', JPATH_SITE);
        $language->load('com_jce_pro', JPATH_SITE);

        // set JLayoutHelper base path
        LayoutHelper::$defaultBasePath = JPATH_COMPONENT_ADMINISTRATOR;

        // Check for errors.
        if (count($errors = $this->get('Errors'))) {
            throw new Exception(implode("\n", $errors), 500);
        }

        $this->addToolbar();
        parent::display($tpl);

        // only in Joomla 3.x
        if (version_compare(JVERSION, '4', 'lt')) {
            HTMLHelper::_('formbehavior.chosen', 'select');
        }

        // version hash
        $hash = md5(WF_VERSION);

        $document = Factory::getDocument();
        $document->addStyleSheet(Uri::root(true) . '/media/com_jce/admin/css/profile.min.css?' . $hash);
        $document->addStyleSheet(Uri::root(true) . '/media/com_jce/editor/vendor/jquery/css/jquery-ui.min.css?' . $hash);

        $document->addScript(Uri::root(true) . '/media/com_jce/editor/vendor/jquery/js/jquery-ui.min.js?' . $hash);
        $document->addScript(Uri::root(true) . '/media/com_jce/editor/vendor/jquery/js/jquery-ui.touch.min.js?' . $hash);

        $document->addScript(Uri::root(true) . '/media/com_jce/admin/js/core.min.js?' . $hash);
        $document->addScript(Uri::root(true) . '/media/com_jce/admin/js/profile.min.js?' . $hash);

        // default theme
        $document->addStyleSheet(Uri::root(true) . '/media/com_jce/editor/tinymce/themes/advanced/skins/default/ui.css?' . $hash);
        $document->addStyleSheet(Uri::root(true) . '/media/com_jce/editor/tinymce/themes/advanced/skins/default/ui_touch.css?' . $hash);
        $document->addStyleSheet(Uri::root(true) . '/media/com_jce/editor/tinymce/themes/advanced/skins/default/ui.admin.css?' . $hash);
    }

    /**
     * Add the page title and toolbar.
     *
     * @since   2.7
     */
    protected function addToolbar()
    {
        Factory::getApplication()->input->set('hidemainmenu', true);

        $user = Factory::getUser();
        $canEdit = $user->authorise('core.create', 'com_jce');

        ToolbarHelper::title(Text::_('WF_PROFILES_EDIT'), 'user');

        // For new records, check the create permission.
        if ($canEdit) {
            ToolbarHelper::apply('profile.apply');
            ToolbarHelper::save('profile.save');
            ToolbarHelper::save2new('profile.save2new');
        }

        if (empty($this->item->id)) {
            ToolbarHelper::cancel('profile.cancel');
        } else {
            ToolbarHelper::cancel('profile.cancel', 'JTOOLBAR_CLOSE');
        }

        ToolbarHelper::divider();
        ToolbarHelper::help('WF_PROFILES_EDIT');
    }
}
components/com_jce/views/cpanel/index.html000060400000000054152453623450014730 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_jce/views/cpanel/tmpl/default_pro.php000060400000001314152453623450016724 0ustar00<div class="alert alert-info">
    <h4><i class="icon-star"></i> Go Pro and get more from JCE <a href="https://www.joomlacontenteditor.net/subscribe" class="btn btn-primary" target="_blank" title="Get JCE Editor Pro"><strong>Get JCE Editor Pro</strong></a></h4>
    <ul>
        <li>Resize, Thumbnail and Edit images</li>
        <li>Manage Audio and Video</li>
        <li>Create styled image captions</li>
        <li>Manage and create links to files</li>
        <li>Edit HTML in the Source Code Editor</li>
        <li>Write faster with <a href="https://en.wikipedia.org/wiki/Markdown" title="Markdown" target="_blank"><strong>Markdown</strong></a> support</li>
        <li>And much more...</li>
    </ul>
</div>components/com_jce/views/cpanel/tmpl/default.php000060400000005226152453623450016052 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\LayoutHelper;

$user = Factory::getUser();
$canEditPref = $user->authorise('core.admin', 'com_jce');

?>
<div class="ui-jce row row-fluid">
	<div class="span12 col-md-12">
        <nav id="wf-cpanel" class="quick-icons bg-transparent">
			<ul class="unstyled mb-0 nav flex-wrap row-fluid">
				<?php echo implode("\n", $this->icons); ?>
			</ul>
		</nav>

        <dl class="dl-horizontal card card-body well">
            <dt class="wf-tooltip" title="<?php echo Text::_('WF_CPANEL_SUPPORT') . '::' . Text::_('WF_CPANEL_SUPPORT_DESC'); ?>">
                <?php echo Text::_('WF_CPANEL_SUPPORT'); ?>
            </dt>
            <dd><a href="https://www.joomlacontenteditor.net/support" target="_new">https://www.joomlacontenteditor.com/support</a></dd>
            <dt class="wf-tooltip" title="<?php echo Text::_('WF_CPANEL_LICENCE') . '::' . Text::_('WF_CPANEL_LICENCE_DESC'); ?>">
                <?php echo Text::_('WF_CPANEL_LICENCE'); ?>
            </dt>
            <dd><?php echo $this->state->get('licence'); ?></dd>
            <dt class="wf-tooltip" title="<?php echo Text::_('WF_CPANEL_VERSION') . '::' . Text::_('WF_CPANEL_VERSION_DESC'); ?>">
                <?php echo Text::_('WF_CPANEL_VERSION'); ?>
            </dt>
            <dd><?php echo $this->state->get('version'); ?></dd>
            <?php if ($this->params->get('feed', 0) || $canEditPref): ?>
                <dt class="wf-tooltip" title="<?php echo Text::_('WF_CPANEL_FEED') . '::' . Text::_('WF_CPANEL_FEED_DESC'); ?>">
                    <?php echo Text::_('WF_CPANEL_FEED'); ?>
                </dt>
                <dd>
                <?php if ($this->params->get('feed', 0)): ?>
                    <ul class="unstyled wf-cpanel-newsfeed">
                        <li><?php echo Text::_('WF_CPANEL_FEED_NONE'); ?></li>
                    </ul>
                <?php else: ?>
                    <?php echo Text::_('WF_CPANEL_FEED_DISABLED'); ?> :: <a id="newsfeed_enable" title="<?php echo Text::_('WF_PREFERENCES'); ?>" href="#">[<?php echo Text::_('WF_CPANEL_FEED_ENABLE'); ?>]</a>
                <?php endif;?>
                </dd>
            <?php endif;?>
        </dl>
        <?php if (!$this->state->get('pro', 0)) :
    echo LayoutHelper::render('message.upgrade', $this);
endif;?>
    </div>
</div>components/com_jce/views/cpanel/tmpl/index.html000060400000000054152453623450015704 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_jce/views/cpanel/view.html.php000060400000003645152453623450015372 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\HTML\Helpers\Sidebar;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\View\HtmlView;
use Joomla\CMS\Toolbar\ToolbarHelper;
use Joomla\CMS\Uri\Uri;

class JceViewCpanel extends HtmlView
{
    protected $icons;
    protected $state;

    /**
     * Display the view.
     */
    public function display($tpl = null)
    {
        $user = Factory::getUser();

        $this->state = $this->get('State');
        $this->icons = $this->get('Icons');
        $this->params = ComponentHelper::getParams('com_jce');

        // Check for errors.
        if (count($errors = $this->get('Errors'))) {
            throw new Exception(implode("\n", $errors), 500);
        }

        HTMLHelper::_('jquery.framework');

        $document = Factory::getDocument();
        $document->addScript(Uri::root(true) . '/media/com_jce/admin/js/cpanel.min.js');
        $document->addStyleSheet(Uri::root(true) . '/media/com_jce/admin/css/cpanel.min.css');

        $this->addToolbar();
        $this->sidebar = Sidebar::render();
        parent::display($tpl);
    }

    /**
     * Add the page title and toolbar.
     *
     * @since   1.6
     */
    protected function addToolbar()
    {
        $state = $this->get('State');
        $user = Factory::getUser();

        ToolbarHelper::title('JCE - ' . Text::_('WF_CPANEL'), 'home');

        Sidebar::setAction('index.php?option=com_jce&view=cpanel');

        if ($user->authorise('core.admin', 'com_jce')) {
            ToolbarHelper::preferences('com_jce');
        }
    }
}
components/com_jce/views/updates/tmpl/index.html000060400000000054152453623450016107 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_jce/views/updates/tmpl/default.php000060400000002437152453623450016256 0ustar00<?php
/**
 * @copyright 	Copyright (c) 2009-2017 Ryan Demmer. All rights reserved
 * @license   	GNU/GPL 2 or later - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * JCE is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses
 */
defined('_JEXEC') or die('RESTRICTED');
?>
<div class="ui-jce">
    <h3><?php echo WFText::_('WF_UPDATES_AVAILABLE'); ?></h3>
    <div id="updates-list">
        <div class="row-fluid header">
            <div class="span1 title">&nbsp;</div>
            <div class="span5 title">
                <?php echo WFText::_('WF_UPDATES_NAME') ?>
            </div>
            <div class="title span3">
                <?php echo WFText::_('WF_UPDATES_VERSION') ?>
            </div>
            <div class="title span3">
                <?php echo WFText::_('WF_UPDATES_PRIORITY') ?>
            </div>
        </div>
        <div class="row-fluid body"></div>
    </div>
    <div class="btn-group pull-right fltrgt">
        <button id="update-button" class="check btn"><i class="icon-search"></i>&nbsp;<?php echo WFText::_('WF_UPDATES_CHECK'); ?></button>
    </div>
</div>
components/com_jce/views/updates/index.html000060400000000054152453623450015133 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_jce/views/updates/view.html.php000060400000003775152453623450015601 0ustar00<?php

/**
 * @copyright 	Copyright (c) 2009-2017 Ryan Demmer. All rights reserved
 * @license   	GNU/GPL 2 or later - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * JCE is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses
 */
defined('_JEXEC') or die('RESTRICTED');

wfimport('admin.classes.view');

class WFViewUpdates extends WFView
{
    public function display($tpl = null)
    {
        $model = $this->getModel();

        $this->addScript('components/com_jce/media/js/update.js');

        $options = array(
            'language' => array(
                'check' => WFText::_('WF_UPDATES_CHECK'),
                'install' => WFText::_('WF_UPDATES_INSTALL'),
                'installed' => WFText::_('WF_UPDATES_INSTALLED'),
                'no_updates' => WFText::_('WF_UPDATES_NONE'),
                'high' => WFText::_('WF_UPDATES_HIGH'),
                'medium' => WFText::_('WF_UPDATES_MEDIUM'),
                'low' => WFText::_('WF_UPDATES_LOW'),
                'full' => WFText::_('WF_UPDATES_FULL'),
                'patch' => WFText::_('WF_UPDATES_PATCH'),
                'auth_failed' => WFText::_('WF_UPDATES_AUTH_FAIL'),
                'update_info' => WFText::_('WF_UPDATES_INFO'),
                'install_info' => WFText::_('WF_UPDATES_INSTALL_INFO'),
                'check_updates' => WFText::_('WF_UPDATES_CHECKING'),
                'read_more' => WFText::_('WF_UPDATES_READMORE'),
                'read_less' => WFText::_('WF_UPDATES_READLESS'),
            ),
        );

        $options = json_encode($options);

        $this->addScriptDeclaration('jQuery(document).ready(function($){Wf.update.init('.$options.');});');

        // load styles
        $this->addStyleSheet(JURI::root(true).'/administrator/components/com_jce/media/css/updates.css');

        parent::display($tpl);
    }
}
components/com_jce/views/browser/view.html.php000060400000003575152453623450015615 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\HTML\Helpers\Sidebar;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\View\HtmlView;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\CMS\Toolbar\ToolbarHelper;
use Joomla\CMS\Uri\Uri;

class JceViewBrowser extends HtmlView
{
    protected $icons;
    protected $state;

    /**
     * Display the view.
     */
    public function display($tpl = null)
    {
        if (!PluginHelper::isEnabled('quickicon', 'jce')) {
            Factory::getApplication()->redirect('index.php?option=com_jce');
        }

        $user = Factory::getUser();

        $this->state = $this->get('State');
        $this->params = ComponentHelper::getParams('com_jce');

        // Check for errors.
        if (count($errors = $this->get('Errors'))) {
            throw new Exception(implode("\n", $errors), 500);
        }

        HTMLHelper::_('jquery.framework');

        $document = Factory::getDocument();
        $document->addStyleSheet(Uri::root(true) . '/media/com_jce/admin/css/browser.min.css');

        $this->addToolbar();

        if (Factory::getApplication()->input->getInt('sidebar', 1) == 1) {
            $this->sidebar = Sidebar::render();
        }

        parent::display($tpl);
    }

    /**
     * Add the page title and toolbar.
     *
     * @since   1.6
     */
    protected function addToolbar()
    {
        ToolbarHelper::title('JCE - ' . Text::_('WF_BROWSER_TITLE'), 'picture');
        Sidebar::setAction('index.php?option=com_jce&view=browser');
    }
}
components/com_jce/views/browser/tmpl/default.php000060400000001655152453623450016275 0ustar00<?php

/**
 * @copyright 	Copyright (c) 2009-2022 Ryan Demmer. All rights reserved
 * @license   	GNU/GPL 2 or later - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * JCE is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses
 */
\defined('_JEXEC') or die;
?>
<div class="row">
	<?php if (!empty($this->sidebar)) : ?>
	<div id="j-sidebar-container" class="j-sidebar-container span2 col-md-2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="j-main-container span10 col-md-10">
	<?php else : ?>
	<div id="j-main-container">
	<?php endif; ?>
		<div class="ui-jce row-fluid">
			<iframe src="<?php echo $this->state->get('url');?>" frameborder="0" class="wf-admin-browser"></iframe>
		</div>
	</div>
</div>components/com_jce/views/index.html000060400000000054152453623450013466 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_jce/vendor/Defuse/Crypto/KeyProtectedByPassword.php000060400000006747152453623450021474 0ustar00<?php

namespace Defuse\Crypto;

use Defuse\Crypto\Exception as Ex;

final class KeyProtectedByPassword
{
    const PASSWORD_KEY_CURRENT_VERSION = "\xDE\xF1\x00\x00";

    /**
     * @var string
     */
    private $encrypted_key = '';

    /**
     * Creates a random key protected by the provided password.
     *
     * @param string $password
     *
     * @throws Ex\EnvironmentIsBrokenException
     *
     * @return KeyProtectedByPassword
     */
    public static function createRandomPasswordProtectedKey($password)
    {
        $inner_key = Key::createNewRandomKey();
        /* The password is hashed as a form of poor-man's domain separation
         * between this use of encryptWithPassword() and other uses of
         * encryptWithPassword() that the user may also be using as part of the
         * same protocol. */
        $encrypted_key = Crypto::encryptWithPassword(
            $inner_key->saveToAsciiSafeString(),
            \hash(Core::HASH_FUNCTION_NAME, $password, true),
            true
        );

        return new KeyProtectedByPassword($encrypted_key);
    }

    /**
     * Loads a KeyProtectedByPassword from its encoded form.
     *
     * @param string $saved_key_string
     *
     * @throws Ex\BadFormatException
     *
     * @return KeyProtectedByPassword
     */
    public static function loadFromAsciiSafeString($saved_key_string)
    {
        $encrypted_key = Encoding::loadBytesFromChecksummedAsciiSafeString(
            self::PASSWORD_KEY_CURRENT_VERSION,
            $saved_key_string
        );
        return new KeyProtectedByPassword($encrypted_key);
    }

    /**
     * Encodes the KeyProtectedByPassword into a string of printable ASCII
     * characters.
     *
     * @throws Ex\EnvironmentIsBrokenException
     *
     * @return string
     */
    public function saveToAsciiSafeString()
    {
        return Encoding::saveBytesToChecksummedAsciiSafeString(
            self::PASSWORD_KEY_CURRENT_VERSION,
            $this->encrypted_key
        );
    }

    /**
     * Decrypts the protected key, returning an unprotected Key object that can
     * be used for encryption and decryption.
     *
     * @throws Ex\EnvironmentIsBrokenException
     * @throws Ex\WrongKeyOrModifiedCiphertextException
     *
     * @param string $password
     * @return Key
     */
    public function unlockKey($password)
    {
        try {
            $inner_key_encoded = Crypto::decryptWithPassword(
                $this->encrypted_key,
                \hash(Core::HASH_FUNCTION_NAME, $password, true),
                true
            );
            return Key::loadFromAsciiSafeString($inner_key_encoded);
        } catch (Ex\BadFormatException $ex) {
            /* This should never happen unless an attacker replaced the
             * encrypted key ciphertext with some other ciphertext that was
             * encrypted with the same password. We transform the exception type
             * here in order to make the API simpler, avoiding the need to
             * document that this method might throw an Ex\BadFormatException. */
            throw new Ex\WrongKeyOrModifiedCiphertextException(
                "The decrypted key was found to be in an invalid format. " .
                "This very likely indicates it was modified by an attacker."
            );
        }
    }

    /**
     * Constructor for KeyProtectedByPassword.
     *
     * @param string $encrypted_key
     */
    private function __construct($encrypted_key)
    {
        $this->encrypted_key = $encrypted_key;
    }
}
components/com_jce/vendor/Defuse/Crypto/DerivedKeys.php000060400000001413152453623450017253 0ustar00<?php

namespace Defuse\Crypto;

/**
 * Class DerivedKeys
 * @package Defuse\Crypto
 */
final class DerivedKeys
{
    /**
     * @var string
     */
    private $akey = '';

    /**
     * @var string
     */
    private $ekey = '';

    /**
     * Returns the authentication key.
     * @return string
     */
    public function getAuthenticationKey()
    {
        return $this->akey;
    }

    /**
     * Returns the encryption key.
     * @return string
     */
    public function getEncryptionKey()
    {
        return $this->ekey;
    }

    /**
     * Constructor for DerivedKeys.
     *
     * @param string $akey
     * @param string $ekey
     */
    public function __construct($akey, $ekey)
    {
        $this->akey = $akey;
        $this->ekey = $ekey;
    }
}
components/com_jce/vendor/Defuse/Crypto/Core.php000060400000035060152453623450015732 0ustar00<?php

namespace Defuse\Crypto;

use Defuse\Crypto\Exception as Ex;

final class Core
{
    const HEADER_VERSION_SIZE               = 4;
    const MINIMUM_CIPHERTEXT_SIZE           = 84;

    const CURRENT_VERSION                   = "\xDE\xF5\x02\x00";

    const CIPHER_METHOD                     = 'aes-256-ctr';
    const BLOCK_BYTE_SIZE                   = 16;
    const KEY_BYTE_SIZE                     = 32;
    const SALT_BYTE_SIZE                    = 32;
    const MAC_BYTE_SIZE                     = 32;
    const HASH_FUNCTION_NAME                = 'sha256';
    const ENCRYPTION_INFO_STRING            = 'DefusePHP|V2|KeyForEncryption';
    const AUTHENTICATION_INFO_STRING        = 'DefusePHP|V2|KeyForAuthentication';
    const BUFFER_BYTE_SIZE                  = 1048576;

    const LEGACY_CIPHER_METHOD              = 'aes-128-cbc';
    const LEGACY_BLOCK_BYTE_SIZE            = 16;
    const LEGACY_KEY_BYTE_SIZE              = 16;
    const LEGACY_HASH_FUNCTION_NAME         = 'sha256';
    const LEGACY_MAC_BYTE_SIZE              = 32;
    const LEGACY_ENCRYPTION_INFO_STRING     = 'DefusePHP|KeyForEncryption';
    const LEGACY_AUTHENTICATION_INFO_STRING = 'DefusePHP|KeyForAuthentication';

    /*
     * V2.0 Format: VERSION (4 bytes) || SALT (32 bytes) || IV (16 bytes) ||
     *              CIPHERTEXT (varies) || HMAC (32 bytes)
     *
     * V1.0 Format: HMAC (32 bytes) || IV (16 bytes) || CIPHERTEXT (varies).
     */

    /**
     * Adds an integer to a block-sized counter.
     *
     * @param string $ctr
     * @param int    $inc
     *
     * @throws Ex\EnvironmentIsBrokenException
     *
     * @return string
     */
    public static function incrementCounter($ctr, $inc)
    {
        if (Core::ourStrlen($ctr) !== Core::BLOCK_BYTE_SIZE) {
            throw new Ex\EnvironmentIsBrokenException(
              'Trying to increment a nonce of the wrong size.'
            );
        }

        if (! \is_int($inc)) {
            throw new Ex\EnvironmentIsBrokenException(
              'Trying to increment nonce by a non-integer.'
            );
        }

        if ($inc < 0) {
            throw new Ex\EnvironmentIsBrokenException(
              'Trying to increment nonce by a negative amount.'
            );
        }

        if ($inc > PHP_INT_MAX - 255) {
            throw new Ex\EnvironmentIsBrokenException(
              'Integer overflow may occur.'
            );
        }

        /*
         * We start at the rightmost byte (big-endian)
         * So, too, does OpenSSL: http://stackoverflow.com/a/3146214/2224584
         */
        for ($i = Core::BLOCK_BYTE_SIZE - 1; $i >= 0; --$i) {
            $sum = \ord($ctr[$i]) + $inc;

            /* Detect integer overflow and fail. */
            if (! \is_int($sum)) {
                throw new Ex\EnvironmentIsBrokenException(
                  'Integer overflow in CTR mode nonce increment.'
                );
            }

            $ctr[$i] = \pack('C', $sum & 0xFF);
            $inc     = $sum >> 8;
        }
        return $ctr;
    }

    /**
     * Returns a random byte string of the specified length.
     *
     * @param int $octets
     *
     * @throws Ex\EnvironmentIsBrokenException
     *
     * @return string
     */
    public static function secureRandom($octets)
    {
        self::ensureFunctionExists('random_bytes');
        try {
            return \random_bytes($octets);
        } catch (\Exception $ex) {
            throw new Ex\EnvironmentIsBrokenException(
                'Your system does not have a secure random number generator.'
            );
        }
    }

    /**
     * Computes the HKDF key derivation function specified in
     * http://tools.ietf.org/html/rfc5869.
     *
     * @param string $hash   Hash Function
     * @param string $ikm    Initial Keying Material
     * @param int    $length How many bytes?
     * @param string $info   What sort of key are we deriving?
     * @param string $salt
     *
     * @throws Ex\EnvironmentIsBrokenException
     * @psalm-suppress UndefinedFunction - We're checking if the function exists first.
     *
     * @return string
     */
    public static function HKDF($hash, $ikm, $length, $info = '', $salt = null)
    {
        static $nativeHKDF = null;
        if ($nativeHKDF === null) {
            $nativeHKDF = \is_callable('\\hash_hkdf');
        }
        if ($nativeHKDF) {
            return \hash_hkdf($hash, $ikm, $length, $info, $salt);
        }

        $digest_length = Core::ourStrlen(\hash_hmac($hash, '', '', true));

        // Sanity-check the desired output length.
        if (empty($length) || ! \is_int($length) ||
            $length < 0 || $length > 255 * $digest_length) {
            throw new Ex\EnvironmentIsBrokenException(
                'Bad output length requested of HKDF.'
            );
        }

        // "if [salt] not provided, is set to a string of HashLen zeroes."
        if (\is_null($salt)) {
            $salt = \str_repeat("\x00", $digest_length);
        }

        // HKDF-Extract:
        // PRK = HMAC-Hash(salt, IKM)
        // The salt is the HMAC key.
        $prk = \hash_hmac($hash, $ikm, $salt, true);

        // HKDF-Expand:

        // This check is useless, but it serves as a reminder to the spec.
        if (Core::ourStrlen($prk) < $digest_length) {
            throw new Ex\EnvironmentIsBrokenException();
        }

        // T(0) = ''
        $t          = '';
        $last_block = '';
        for ($block_index = 1; Core::ourStrlen($t) < $length; ++$block_index) {
            // T(i) = HMAC-Hash(PRK, T(i-1) | info | 0x??)
            $last_block = \hash_hmac(
                $hash,
                $last_block . $info . \chr($block_index),
                $prk,
                true
            );
            // T = T(1) | T(2) | T(3) | ... | T(N)
            $t .= $last_block;
        }

        // ORM = first L octets of T
        /** @var string $orm */
        $orm = Core::ourSubstr($t, 0, $length);
        if (!\is_string($orm)) {
            throw new Ex\EnvironmentIsBrokenException();
        }
        return $orm;
    }

    /**
     * Checks if two equal-length strings are the same without leaking
     * information through side channels.
     *
     * @param string $expected
     * @param string $given
     *
     * @throws Ex\EnvironmentIsBrokenException
     *
     * @return bool
     */
    public static function hashEquals($expected, $given)
    {
        static $native = null;
        if ($native === null) {
            $native = \function_exists('hash_equals');
        }
        if ($native) {
            return \hash_equals($expected, $given);
        }

        // We can't just compare the strings with '==', since it would make
        // timing attacks possible. We could use the XOR-OR constant-time
        // comparison algorithm, but that may not be a reliable defense in an
        // interpreted language. So we use the approach of HMACing both strings
        // with a random key and comparing the HMACs.

        // We're not attempting to make variable-length string comparison
        // secure, as that's very difficult. Make sure the strings are the same
        // length.
        if (Core::ourStrlen($expected) !== Core::ourStrlen($given)) {
            throw new Ex\EnvironmentIsBrokenException();
        }

        $blind           = Core::secureRandom(32);
        $message_compare = \hash_hmac(Core::HASH_FUNCTION_NAME, $given, $blind);
        $correct_compare = \hash_hmac(Core::HASH_FUNCTION_NAME, $expected, $blind);
        return $correct_compare === $message_compare;
    }
    /**
     * Throws an exception if the constant doesn't exist.
     *
     * @param string $name
     * @return void
     *
     * @throws Ex\EnvironmentIsBrokenException
     */
    public static function ensureConstantExists($name)
    {
        if (! \defined($name)) {
            throw new Ex\EnvironmentIsBrokenException();
        }
    }

    /**
     * Throws an exception if the function doesn't exist.
     *
     * @param string $name
     * @return void
     *
     * @throws Ex\EnvironmentIsBrokenException
     */
    public static function ensureFunctionExists($name)
    {
        if (! \function_exists($name)) {
            throw new Ex\EnvironmentIsBrokenException();
        }
    }

    /*
     * We need these strlen() and substr() functions because when
     * 'mbstring.func_overload' is set in php.ini, the standard strlen() and
     * substr() are replaced by mb_strlen() and mb_substr().
     */

    /**
     * Computes the length of a string in bytes.
     *
     * @param string $str
     *
     * @throws Ex\EnvironmentIsBrokenException
     *
     * @return int
     */
    public static function ourStrlen($str)
    {
        static $exists = null;
        if ($exists === null) {
            $exists = \function_exists('mb_strlen');
        }
        if ($exists) {
            $length = \mb_strlen($str, '8bit');
            if ($length === false) {
                throw new Ex\EnvironmentIsBrokenException();
            }
            return $length;
        } else {
            return \strlen($str);
        }
    }

    /**
     * Behaves roughly like the function substr() in PHP 7 does.
     *
     * @param string $str
     * @param int    $start
     * @param int    $length
     *
     * @throws Ex\EnvironmentIsBrokenException
     *
     * @return string|bool
     */
    public static function ourSubstr($str, $start, $length = null)
    {
        static $exists = null;
        if ($exists === null) {
            $exists = \function_exists('mb_substr');
        }

        if ($exists) {
            // mb_substr($str, 0, NULL, '8bit') returns an empty string on PHP
            // 5.3, so we have to find the length ourselves.
            if (! isset($length)) {
                if ($start >= 0) {
                    $length = Core::ourStrlen($str) - $start;
                } else {
                    $length = -$start;
                }
            }

            // This is required to make mb_substr behavior identical to substr.
            // Without this, mb_substr() would return false, contra to what the
            // PHP documentation says (it doesn't say it can return false.)
            if ($start === Core::ourStrlen($str) && $length === 0) {
                return '';
            }

            if ($start > Core::ourStrlen($str)) {
                return false;
            }

            $substr = \mb_substr($str, $start, $length, '8bit');
            if (Core::ourStrlen($substr) !== $length) {
                throw new Ex\EnvironmentIsBrokenException(
                    'Your version of PHP has bug #66797. Its implementation of
                    mb_substr() is incorrect. See the details here:
                    https://bugs.php.net/bug.php?id=66797'
                );
            }
            return $substr;
        }

        // Unlike mb_substr(), substr() doesn't accept NULL for length
        if (isset($length)) {
            return \substr($str, $start, $length);
        } else {
            return \substr($str, $start);
        }
    }

    /**
     * Computes the PBKDF2 password-based key derivation function.
     *
     * The PBKDF2 function is defined in RFC 2898. Test vectors can be found in
     * RFC 6070. This implementation of PBKDF2 was originally created by Taylor
     * Hornby, with improvements from http://www.variations-of-shadow.com/.
     *
     * @param string $algorithm  The hash algorithm to use. Recommended: SHA256
     * @param string $password   The password.
     * @param string $salt       A salt that is unique to the password.
     * @param int    $count      Iteration count. Higher is better, but slower. Recommended: At least 1000.
     * @param int    $key_length The length of the derived key in bytes.
     * @param bool   $raw_output If true, the key is returned in raw binary format. Hex encoded otherwise.
     *
     * @throws Ex\EnvironmentIsBrokenException
     *
     * @return string A $key_length-byte key derived from the password and salt.
     */
    public static function pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output = false)
    {
        // Type checks:
        if (! \is_string($algorithm)) {
            throw new \Exception(
                'pbkdf2(): algorithm must be a string'
            );
        }
        if (! \is_string($password)) {
            throw new \Exception(
                'pbkdf2(): password must be a string'
            );
        }
        if (! \is_string($salt)) {
            throw new \Exception(
                'pbkdf2(): salt must be a string'
            );
        }
        // Coerce strings to integers with no information loss or overflow
        $count += 0;
        $key_length += 0;

        $algorithm = \strtolower($algorithm);
        if (! \in_array($algorithm, \hash_algos(), true)) {
            throw new Ex\EnvironmentIsBrokenException(
                'Invalid or unsupported hash algorithm.'
            );
        }

        // Whitelist, or we could end up with people using CRC32.
        $ok_algorithms = [
            'sha1', 'sha224', 'sha256', 'sha384', 'sha512',
            'ripemd160', 'ripemd256', 'ripemd320', 'whirlpool',
        ];
        if (! \in_array($algorithm, $ok_algorithms, true)) {
            throw new Ex\EnvironmentIsBrokenException(
                'Algorithm is not a secure cryptographic hash function.'
            );
        }

        if ($count <= 0 || $key_length <= 0) {
            throw new Ex\EnvironmentIsBrokenException(
                'Invalid PBKDF2 parameters.'
            );
        }

        if (\function_exists('hash_pbkdf2')) {
            // The output length is in NIBBLES (4-bits) if $raw_output is false!
            if (! $raw_output) {
                $key_length = $key_length * 2;
            }
            return \hash_pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output);
        }

        $hash_length = Core::ourStrlen(\hash($algorithm, '', true));
        $block_count = \ceil($key_length / $hash_length);

        $output = '';
        for ($i = 1; $i <= $block_count; $i++) {
            // $i encoded as 4 bytes, big endian.
            $last = $salt . \pack('N', $i);
            // first iteration
            $last = $xorsum = \hash_hmac($algorithm, $last, $password, true);
            // perform the other $count - 1 iterations
            for ($j = 1; $j < $count; $j++) {
                $xorsum ^= ($last = \hash_hmac($algorithm, $last, $password, true));
            }
            $output .= $xorsum;
        }

        if ($raw_output) {
            return (string) Core::ourSubstr($output, 0, $key_length);
        } else {
            return Encoding::binToHex((string) Core::ourSubstr($output, 0, $key_length));
        }
    }
}
components/com_jce/vendor/Defuse/Crypto/Encoding.php000060400000022130152453623450016562 0ustar00<?php

namespace Defuse\Crypto;

use Defuse\Crypto\Exception as Ex;

final class Encoding
{
    const CHECKSUM_BYTE_SIZE     = 32;
    const CHECKSUM_HASH_ALGO     = 'sha256';
    const SERIALIZE_HEADER_BYTES = 4;

    /**
     * Converts a byte string to a hexadecimal string without leaking
     * information through side channels.
     *
     * @param string $byte_string
     *
     * @throws Ex\EnvironmentIsBrokenException
     *
     * @return string
     */
    public static function binToHex($byte_string)
    {
        $hex = '';
        $len = Core::ourStrlen($byte_string);
        for ($i = 0; $i < $len; ++$i) {
            $c = \ord($byte_string[$i]) & 0xf;
            $b = \ord($byte_string[$i]) >> 4;
            $hex .= \pack(
                'CC',
                87 + $b + ((($b - 10) >> 8) & ~38),
                87 + $c + ((($c - 10) >> 8) & ~38)
            );
        }
        return $hex;
    }

    /**
     * Converts a hexadecimal string into a byte string without leaking
     * information through side channels.
     *
     * @param string $hex_string
     *
     * @throws Ex\BadFormatException
     * @throws Ex\EnvironmentIsBrokenException
     *
     * @return string
     */
    public static function hexToBin($hex_string)
    {
        $hex_pos = 0;
        $bin     = '';
        $hex_len = Core::ourStrlen($hex_string);
        $state   = 0;
        $c_acc   = 0;

        while ($hex_pos < $hex_len) {
            $c        = \ord($hex_string[$hex_pos]);
            $c_num    = $c ^ 48;
            $c_num0   = ($c_num - 10) >> 8;
            $c_alpha  = ($c & ~32) - 55;
            $c_alpha0 = (($c_alpha - 10) ^ ($c_alpha - 16)) >> 8;
            if (($c_num0 | $c_alpha0) === 0) {
                throw new Ex\BadFormatException(
                    'Encoding::hexToBin() input is not a hex string.'
                );
            }
            $c_val = ($c_num0 & $c_num) | ($c_alpha & $c_alpha0);
            if ($state === 0) {
                $c_acc = $c_val * 16;
            } else {
                $bin .= \pack('C', $c_acc | $c_val);
            }
            $state ^= 1;
            ++$hex_pos;
        }
        return $bin;
    }
    
    /**
     * Remove trialing whitespace without table look-ups or branches.
     *
     * Calling this function may leak the length of the string as well as the
     * number of trailing whitespace characters through side-channels.
     *
     * @param string $string
     * @return string
     */
    public static function trimTrailingWhitespace($string = '')
    {
        $length = Core::ourStrlen($string);
        if ($length < 1) {
            return '';
        }
        do {
            $prevLength = $length;
            $last = $length - 1;
            $chr = \ord($string[$last]);

            /* Null Byte (0x00), a.k.a. \0 */
            // if ($chr === 0x00) $length -= 1;
            $sub = (($chr - 1) >> 8 ) & 1;
            $length -= $sub;
            $last -= $sub;

            /* Horizontal Tab (0x09) a.k.a. \t */
            $chr = \ord($string[$last]);
            // if ($chr === 0x09) $length -= 1;
            $sub = (((0x08 - $chr) & ($chr - 0x0a)) >> 8) & 1;
            $length -= $sub;
            $last -= $sub;

            /* New Line (0x0a), a.k.a. \n */
            $chr = \ord($string[$last]);
            // if ($chr === 0x0a) $length -= 1;
            $sub = (((0x09 - $chr) & ($chr - 0x0b)) >> 8) & 1;
            $length -= $sub;
            $last -= $sub;

            /* Carriage Return (0x0D), a.k.a. \r */
            $chr = \ord($string[$last]);
            // if ($chr === 0x0d) $length -= 1;
            $sub = (((0x0c - $chr) & ($chr - 0x0e)) >> 8) & 1;
            $length -= $sub;
            $last -= $sub;

            /* Space */
            $chr = \ord($string[$last]);
            // if ($chr === 0x20) $length -= 1;
            $sub = (((0x1f - $chr) & ($chr - 0x21)) >> 8) & 1;
            $length -= $sub;
        } while ($prevLength !== $length && $length > 0);
        return (string) Core::ourSubstr($string, 0, $length);
    }

    /*
     * SECURITY NOTE ON APPLYING CHECKSUMS TO SECRETS:
     *
     *      The checksum introduces a potential security weakness. For example,
     *      suppose we apply a checksum to a key, and that an adversary has an
     *      exploit against the process containing the key, such that they can
     *      overwrite an arbitrary byte of memory and then cause the checksum to
     *      be verified and learn the result.
     *
     *      In this scenario, the adversary can extract the key one byte at
     *      a time by overwriting it with their guess of its value and then
     *      asking if the checksum matches. If it does, their guess was right.
     *      This kind of attack may be more easy to implement and more reliable
     *      than a remote code execution attack.
     *
     *      This attack also applies to authenticated encryption as a whole, in
     *      the situation where the adversary can overwrite a byte of the key
     *      and then cause a valid ciphertext to be decrypted, and then
     *      determine whether the MAC check passed or failed.
     *
     *      By using the full SHA256 hash instead of truncating it, I'm ensuring
     *      that both ways of going about the attack are equivalently difficult.
     *      A shorter checksum of say 32 bits might be more useful to the
     *      adversary as an oracle in case their writes are coarser grained.
     *
     *      Because the scenario assumes a serious vulnerability, we don't try
     *      to prevent attacks of this style.
     */

    /**
     * INTERNAL USE ONLY: Applies a version header, applies a checksum, and
     * then encodes a byte string into a range of printable ASCII characters.
     *
     * @param string $header
     * @param string $bytes
     *
     * @throws Ex\EnvironmentIsBrokenException
     *
     * @return string
     */
    public static function saveBytesToChecksummedAsciiSafeString($header, $bytes)
    {
        // Headers must be a constant length to prevent one type's header from
        // being a prefix of another type's header, leading to ambiguity.
        if (Core::ourStrlen($header) !== self::SERIALIZE_HEADER_BYTES) {
            throw new Ex\EnvironmentIsBrokenException(
                'Header must be ' . self::SERIALIZE_HEADER_BYTES . ' bytes.'
            );
        }

        return Encoding::binToHex(
            $header .
            $bytes .
            \hash(
                self::CHECKSUM_HASH_ALGO,
                $header . $bytes,
                true
            )
        );
    }

    /**
     * INTERNAL USE ONLY: Decodes, verifies the header and checksum, and returns
     * the encoded byte string.
     *
     * @param string $expected_header
     * @param string $string
     *
     * @throws Ex\EnvironmentIsBrokenException
     * @throws Ex\BadFormatException
     *
     * @return string
     */
    public static function loadBytesFromChecksummedAsciiSafeString($expected_header, $string)
    {
        // Headers must be a constant length to prevent one type's header from
        // being a prefix of another type's header, leading to ambiguity.
        if (Core::ourStrlen($expected_header) !== self::SERIALIZE_HEADER_BYTES) {
            throw new Ex\EnvironmentIsBrokenException(
                'Header must be 4 bytes.'
            );
        }

        /* If you get an exception here when attempting to load from a file, first pass your
           key to Encoding::trimTrailingWhitespace() to remove newline characters, etc.      */
        $bytes = Encoding::hexToBin($string);

        /* Make sure we have enough bytes to get the version header and checksum. */
        if (Core::ourStrlen($bytes) < self::SERIALIZE_HEADER_BYTES + self::CHECKSUM_BYTE_SIZE) {
            throw new Ex\BadFormatException(
                'Encoded data is shorter than expected.'
            );
        }

        /* Grab the version header. */
        $actual_header = (string) Core::ourSubstr($bytes, 0, self::SERIALIZE_HEADER_BYTES);

        if ($actual_header !== $expected_header) {
            throw new Ex\BadFormatException(
                'Invalid header.'
            );
        }

        /* Grab the bytes that are part of the checksum. */
        $checked_bytes = (string) Core::ourSubstr(
            $bytes,
            0,
            Core::ourStrlen($bytes) - self::CHECKSUM_BYTE_SIZE
        );

        /* Grab the included checksum. */
        $checksum_a = (string) Core::ourSubstr(
            $bytes,
            Core::ourStrlen($bytes) - self::CHECKSUM_BYTE_SIZE,
            self::CHECKSUM_BYTE_SIZE
        );

        /* Re-compute the checksum. */
        $checksum_b = \hash(self::CHECKSUM_HASH_ALGO, $checked_bytes, true);

        /* Check if the checksum matches. */
        if (! Core::hashEquals($checksum_a, $checksum_b)) {
            throw new Ex\BadFormatException(
                "Data is corrupted, the checksum doesn't match"
            );
        }

        return (string) Core::ourSubstr(
            $bytes,
            self::SERIALIZE_HEADER_BYTES,
            Core::ourStrlen($bytes) - self::SERIALIZE_HEADER_BYTES - self::CHECKSUM_BYTE_SIZE
        );
    }
}
components/com_jce/vendor/Defuse/Crypto/KeyOrPassword.php000060400000007571152453623450017624 0ustar00<?php

namespace Defuse\Crypto;

use Defuse\Crypto\Exception as Ex;

final class KeyOrPassword
{
    const PBKDF2_ITERATIONS    = 100000;
    const SECRET_TYPE_KEY      = 1;
    const SECRET_TYPE_PASSWORD = 2;

    /**
     * @var int
     */
    private $secret_type = 0;

    /**
     * @var Key|string
     */
    private $secret;

    /**
     * Initializes an instance of KeyOrPassword from a key.
     *
     * @param Key $key
     *
     * @return KeyOrPassword
     */
    public static function createFromKey(Key $key)
    {
        return new KeyOrPassword(self::SECRET_TYPE_KEY, $key);
    }

    /**
     * Initializes an instance of KeyOrPassword from a password.
     *
     * @param string $password
     *
     * @return KeyOrPassword
     */
    public static function createFromPassword($password)
    {
        return new KeyOrPassword(self::SECRET_TYPE_PASSWORD, $password);
    }

    /**
     * Derives authentication and encryption keys from the secret, using a slow
     * key derivation function if the secret is a password.
     *
     * @param string $salt
     *
     * @throws Ex\CryptoException
     * @throws Ex\EnvironmentIsBrokenException
     *
     * @return DerivedKeys
     */
    public function deriveKeys($salt)
    {
        if (Core::ourStrlen($salt) !== Core::SALT_BYTE_SIZE) {
            throw new Ex\EnvironmentIsBrokenException('Bad salt.');
        }

        if ($this->secret_type === self::SECRET_TYPE_KEY) {
            if (!($this->secret instanceof Key)) {
                throw new Ex\CryptoException('Expected a Key object');
            }
            $akey = Core::HKDF(
                Core::HASH_FUNCTION_NAME,
                $this->secret->getRawBytes(),
                Core::KEY_BYTE_SIZE,
                Core::AUTHENTICATION_INFO_STRING,
                $salt
            );
            $ekey = Core::HKDF(
                Core::HASH_FUNCTION_NAME,
                $this->secret->getRawBytes(),
                Core::KEY_BYTE_SIZE,
                Core::ENCRYPTION_INFO_STRING,
                $salt
            );
            return new DerivedKeys($akey, $ekey);
        } elseif ($this->secret_type === self::SECRET_TYPE_PASSWORD) {
            if (!\is_string($this->secret)) {
                throw new Ex\CryptoException('Expected a string');
            }
            /* Our PBKDF2 polyfill is vulnerable to a DoS attack documented in
             * GitHub issue #230. The fix is to pre-hash the password to ensure
             * it is short. We do the prehashing here instead of in pbkdf2() so
             * that pbkdf2() still computes the function as defined by the
             * standard. */
            $prehash = \hash(Core::HASH_FUNCTION_NAME, $this->secret, true);
            $prekey = Core::pbkdf2(
                Core::HASH_FUNCTION_NAME,
                $prehash,
                $salt,
                self::PBKDF2_ITERATIONS,
                Core::KEY_BYTE_SIZE,
                true
            );
            $akey = Core::HKDF(
                Core::HASH_FUNCTION_NAME,
                $prekey,
                Core::KEY_BYTE_SIZE,
                Core::AUTHENTICATION_INFO_STRING,
                $salt
            );
            /* Note the cryptographic re-use of $salt here. */
            $ekey = Core::HKDF(
                Core::HASH_FUNCTION_NAME,
                $prekey,
                Core::KEY_BYTE_SIZE,
                Core::ENCRYPTION_INFO_STRING,
                $salt
            );
            return new DerivedKeys($akey, $ekey);
        } else {
            throw new Ex\EnvironmentIsBrokenException('Bad secret type.');
        }
    }

    /**
     * Constructor for KeyOrPassword.
     *
     * @param int   $secret_type
     * @param mixed $secret      (either a Key or a password string)
     */
    private function __construct($secret_type, $secret)
    {
        $this->secret_type = $secret_type;
        $this->secret = $secret;
    }
}
components/com_jce/vendor/Defuse/Crypto/RuntimeTests.php000060400000021454152453623450017512 0ustar00<?php

namespace Defuse\Crypto;

use Defuse\Crypto\Exception as Ex;

/*
 * We're using static class inheritance to get access to protected methods
 * inside Crypto. To make it easy to know where the method we're calling can be
 * found, within this file, prefix calls with `Crypto::` or `RuntimeTests::`,
 * and don't use `self::`.
 */

class RuntimeTests extends Crypto
{
    /**
     * Runs the runtime tests.
     *
     * @throws Ex\EnvironmentIsBrokenException
     * @return void
     */
    public static function runtimeTest()
    {
        // 0: Tests haven't been run yet.
        // 1: Tests have passed.
        // 2: Tests are running right now.
        // 3: Tests have failed.
        static $test_state = 0;

        if ($test_state === 1 || $test_state === 2) {
            return;
        }

        if ($test_state === 3) {
            /* If an intermittent problem caused a test to fail previously, we
             * want that to be indicated to the user with every call to this
             * library. This way, if the user first does something they really
             * don't care about, and just ignores all exceptions, they won't get
             * screwed when they then start to use the library for something
             * they do care about. */
            throw new Ex\EnvironmentIsBrokenException('Tests failed previously.');
        }

        try {
            $test_state = 2;

            Core::ensureFunctionExists('openssl_get_cipher_methods');
            if (\in_array(Core::CIPHER_METHOD, \openssl_get_cipher_methods()) === false) {
                throw new Ex\EnvironmentIsBrokenException(
                    'Cipher method not supported. This is normally caused by an outdated ' .
                    'version of OpenSSL (and/or OpenSSL compiled for FIPS compliance). ' .
                    'Please upgrade to a newer version of OpenSSL that supports ' .
                    Core::CIPHER_METHOD . ' to use this library.'
                );
            }

            RuntimeTests::AESTestVector();
            RuntimeTests::HMACTestVector();
            RuntimeTests::HKDFTestVector();

            RuntimeTests::testEncryptDecrypt();
            if (Core::ourStrlen(Key::createNewRandomKey()->getRawBytes()) != Core::KEY_BYTE_SIZE) {
                throw new Ex\EnvironmentIsBrokenException();
            }

            if (Core::ENCRYPTION_INFO_STRING == Core::AUTHENTICATION_INFO_STRING) {
                throw new Ex\EnvironmentIsBrokenException();
            }
        } catch (Ex\EnvironmentIsBrokenException $ex) {
            // Do this, otherwise it will stay in the "tests are running" state.
            $test_state = 3;
            throw $ex;
        }

        // Change this to '0' make the tests always re-run (for benchmarking).
        $test_state = 1;
    }

    /**
     * High-level tests of Crypto operations.
     *
     * @throws Ex\EnvironmentIsBrokenException
     * @return void
     */
    private static function testEncryptDecrypt()
    {
        $key  = Key::createNewRandomKey();
        $data = "EnCrYpT EvErYThInG\x00\x00";

        // Make sure encrypting then decrypting doesn't change the message.
        $ciphertext = Crypto::encrypt($data, $key, true);
        try {
            $decrypted = Crypto::decrypt($ciphertext, $key, true);
        } catch (Ex\WrongKeyOrModifiedCiphertextException $ex) {
            // It's important to catch this and change it into a
            // Ex\EnvironmentIsBrokenException, otherwise a test failure could trick
            // the user into thinking it's just an invalid ciphertext!
            throw new Ex\EnvironmentIsBrokenException();
        }
        if ($decrypted !== $data) {
            throw new Ex\EnvironmentIsBrokenException();
        }

        // Modifying the ciphertext: Appending a string.
        try {
            Crypto::decrypt($ciphertext . 'a', $key, true);
            throw new Ex\EnvironmentIsBrokenException();
        } catch (Ex\WrongKeyOrModifiedCiphertextException $e) { /* expected */
        }

        // Modifying the ciphertext: Changing an HMAC byte.
        $indices_to_change = [
            0, // The header.
            Core::HEADER_VERSION_SIZE + 1, // the salt
            Core::HEADER_VERSION_SIZE + Core::SALT_BYTE_SIZE + 1, // the IV
            Core::HEADER_VERSION_SIZE + Core::SALT_BYTE_SIZE + Core::BLOCK_BYTE_SIZE + 1, // the ciphertext
        ];

        foreach ($indices_to_change as $index) {
            try {
                $ciphertext[$index] = \chr((\ord($ciphertext[$index]) + 1) % 256);
                Crypto::decrypt($ciphertext, $key, true);
                throw new Ex\EnvironmentIsBrokenException();
            } catch (Ex\WrongKeyOrModifiedCiphertextException $e) { /* expected */
            }
        }

        // Decrypting with the wrong key.
        $key        = Key::createNewRandomKey();
        $data       = 'abcdef';
        $ciphertext = Crypto::encrypt($data, $key, true);
        $wrong_key  = Key::createNewRandomKey();
        try {
            Crypto::decrypt($ciphertext, $wrong_key, true);
            throw new Ex\EnvironmentIsBrokenException();
        } catch (Ex\WrongKeyOrModifiedCiphertextException $e) { /* expected */
        }

        // Ciphertext too small.
        $key        = Key::createNewRandomKey();
        $ciphertext = \str_repeat('A', Core::MINIMUM_CIPHERTEXT_SIZE - 1);
        try {
            Crypto::decrypt($ciphertext, $key, true);
            throw new Ex\EnvironmentIsBrokenException();
        } catch (Ex\WrongKeyOrModifiedCiphertextException $e) { /* expected */
        }
    }

    /**
     * Test HKDF against test vectors.
     *
     * @throws Ex\EnvironmentIsBrokenException
     * @return void
     */
    private static function HKDFTestVector()
    {
        // HKDF test vectors from RFC 5869

        // Test Case 1
        $ikm    = \str_repeat("\x0b", 22);
        $salt   = Encoding::hexToBin('000102030405060708090a0b0c');
        $info   = Encoding::hexToBin('f0f1f2f3f4f5f6f7f8f9');
        $length = 42;
        $okm    = Encoding::hexToBin(
            '3cb25f25faacd57a90434f64d0362f2a' .
            '2d2d0a90cf1a5a4c5db02d56ecc4c5bf' .
            '34007208d5b887185865'
        );
        $computed_okm = Core::HKDF('sha256', $ikm, $length, $info, $salt);
        if ($computed_okm !== $okm) {
            throw new Ex\EnvironmentIsBrokenException();
        }

        // Test Case 7
        $ikm    = \str_repeat("\x0c", 22);
        $length = 42;
        $okm    = Encoding::hexToBin(
            '2c91117204d745f3500d636a62f64f0a' .
            'b3bae548aa53d423b0d1f27ebba6f5e5' .
            '673a081d70cce7acfc48'
        );
        $computed_okm = Core::HKDF('sha1', $ikm, $length, '', null);
        if ($computed_okm !== $okm) {
            throw new Ex\EnvironmentIsBrokenException();
        }
    }

    /**
     * Test HMAC against test vectors.
     *
     * @throws Ex\EnvironmentIsBrokenException
     * @return void
     */
    private static function HMACTestVector()
    {
        // HMAC test vector From RFC 4231 (Test Case 1)
        $key     = \str_repeat("\x0b", 20);
        $data    = 'Hi There';
        $correct = 'b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7';
        if (\hash_hmac(Core::HASH_FUNCTION_NAME, $data, $key) !== $correct) {
            throw new Ex\EnvironmentIsBrokenException();
        }
    }

    /**
     * Test AES against test vectors.
     *
     * @throws Ex\EnvironmentIsBrokenException
     * @return void
     */
    private static function AESTestVector()
    {
        // AES CTR mode test vector from NIST SP 800-38A
        $key = Encoding::hexToBin(
            '603deb1015ca71be2b73aef0857d7781' .
            '1f352c073b6108d72d9810a30914dff4'
        );
        $iv        = Encoding::hexToBin('f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff');
        $plaintext = Encoding::hexToBin(
            '6bc1bee22e409f96e93d7e117393172a' .
            'ae2d8a571e03ac9c9eb76fac45af8e51' .
            '30c81c46a35ce411e5fbc1191a0a52ef' .
            'f69f2445df4f9b17ad2b417be66c3710'
        );
        $ciphertext = Encoding::hexToBin(
            '601ec313775789a5b7a7f504bbf3d228' .
            'f443e3ca4d62b59aca84e990cacaf5c5' .
            '2b0930daa23de94ce87017ba2d84988d' .
            'dfc9c58db67aada613c2dd08457941a6'
        );

        $computed_ciphertext = Crypto::plainEncrypt($plaintext, $key, $iv);
        if ($computed_ciphertext !== $ciphertext) {
            echo \str_repeat("\n", 30);
            echo \bin2hex($computed_ciphertext);
            echo "\n---\n";
            echo \bin2hex($ciphertext);
            echo \str_repeat("\n", 30);
            throw new Ex\EnvironmentIsBrokenException();
        }

        $computed_plaintext = Crypto::plainDecrypt($ciphertext, $key, $iv, Core::CIPHER_METHOD);
        if ($computed_plaintext !== $plaintext) {
            throw new Ex\EnvironmentIsBrokenException();
        }
    }
}
components/com_jce/vendor/Defuse/Crypto/File.php000060400000061655152453623450015732 0ustar00<?php

namespace Defuse\Crypto;

use Defuse\Crypto\Exception as Ex;

final class File
{
    /**
     * Encrypts the input file, saving the ciphertext to the output file.
     *
     * @param string $inputFilename
     * @param string $outputFilename
     * @param Key    $key
     * @return void
     *
     * @throws Ex\EnvironmentIsBrokenException
     * @throws Ex\IOException
     */
    public static function encryptFile($inputFilename, $outputFilename, Key $key)
    {
        self::encryptFileInternal(
            $inputFilename,
            $outputFilename,
            KeyOrPassword::createFromKey($key)
        );
    }

    /**
     * Encrypts a file with a password, using a slow key derivation function to
     * make password cracking more expensive.
     *
     * @param string $inputFilename
     * @param string $outputFilename
     * @param string $password
     * @return void
     *
     * @throws Ex\EnvironmentIsBrokenException
     * @throws Ex\IOException
     */
    public static function encryptFileWithPassword($inputFilename, $outputFilename, $password)
    {
        self::encryptFileInternal(
            $inputFilename,
            $outputFilename,
            KeyOrPassword::createFromPassword($password)
        );
    }

    /**
     * Decrypts the input file, saving the plaintext to the output file.
     *
     * @param string $inputFilename
     * @param string $outputFilename
     * @param Key    $key
     * @return void
     *
     * @throws Ex\EnvironmentIsBrokenException
     * @throws Ex\IOException
     * @throws Ex\WrongKeyOrModifiedCiphertextException
     */
    public static function decryptFile($inputFilename, $outputFilename, Key $key)
    {
        self::decryptFileInternal(
            $inputFilename,
            $outputFilename,
            KeyOrPassword::createFromKey($key)
        );
    }

    /**
     * Decrypts a file with a password, using a slow key derivation function to
     * make password cracking more expensive.
     *
     * @param string $inputFilename
     * @param string $outputFilename
     * @param string $password
     * @return void
     *
     * @throws Ex\EnvironmentIsBrokenException
     * @throws Ex\IOException
     * @throws Ex\WrongKeyOrModifiedCiphertextException
     */
    public static function decryptFileWithPassword($inputFilename, $outputFilename, $password)
    {
        self::decryptFileInternal(
            $inputFilename,
            $outputFilename,
            KeyOrPassword::createFromPassword($password)
        );
    }

    /**
     * Takes two resource handles and encrypts the contents of the first,
     * writing the ciphertext into the second.
     *
     * @param resource $inputHandle
     * @param resource $outputHandle
     * @param Key      $key
     * @return void
     *
     * @throws Ex\EnvironmentIsBrokenException
     * @throws Ex\WrongKeyOrModifiedCiphertextException
     */
    public static function encryptResource($inputHandle, $outputHandle, Key $key)
    {
        self::encryptResourceInternal(
            $inputHandle,
            $outputHandle,
            KeyOrPassword::createFromKey($key)
        );
    }

    /**
     * Encrypts the contents of one resource handle into another with a
     * password, using a slow key derivation function to make password cracking
     * more expensive.
     *
     * @param resource $inputHandle
     * @param resource $outputHandle
     * @param string   $password
     * @return void
     *
     * @throws Ex\EnvironmentIsBrokenException
     * @throws Ex\IOException
     * @throws Ex\WrongKeyOrModifiedCiphertextException
     */
    public static function encryptResourceWithPassword($inputHandle, $outputHandle, $password)
    {
        self::encryptResourceInternal(
            $inputHandle,
            $outputHandle,
            KeyOrPassword::createFromPassword($password)
        );
    }

    /**
     * Takes two resource handles and decrypts the contents of the first,
     * writing the plaintext into the second.
     *
     * @param resource $inputHandle
     * @param resource $outputHandle
     * @param Key      $key
     * @return void
     *
     * @throws Ex\EnvironmentIsBrokenException
     * @throws Ex\IOException
     * @throws Ex\WrongKeyOrModifiedCiphertextException
     */
    public static function decryptResource($inputHandle, $outputHandle, Key $key)
    {
        self::decryptResourceInternal(
            $inputHandle,
            $outputHandle,
            KeyOrPassword::createFromKey($key)
        );
    }

    /**
     * Decrypts the contents of one resource into another with a password, using
     * a slow key derivation function to make password cracking more expensive.
     *
     * @param resource $inputHandle
     * @param resource $outputHandle
     * @param string   $password
     * @return void
     *
     * @throws Ex\EnvironmentIsBrokenException
     * @throws Ex\IOException
     * @throws Ex\WrongKeyOrModifiedCiphertextException
     */
    public static function decryptResourceWithPassword($inputHandle, $outputHandle, $password)
    {
        self::decryptResourceInternal(
            $inputHandle,
            $outputHandle,
            KeyOrPassword::createFromPassword($password)
        );
    }

    /**
     * Encrypts a file with either a key or a password.
     *
     * @param string        $inputFilename
     * @param string        $outputFilename
     * @param KeyOrPassword $secret
     * @return void
     *
     * @throws Ex\CryptoException
     * @throws Ex\IOException
     */
    private static function encryptFileInternal($inputFilename, $outputFilename, KeyOrPassword $secret)
    {
        /* Open the input file. */
        $if = @\fopen($inputFilename, 'rb');
        if ($if === false) {
            throw new Ex\IOException(
                'Cannot open input file for encrypting: ' .
                self::getLastErrorMessage()
            );
        }
        if (\is_callable('\\stream_set_read_buffer')) {
            /* This call can fail, but the only consequence is performance. */
            \stream_set_read_buffer($if, 0);
        }

        /* Open the output file. */
        $of = @\fopen($outputFilename, 'wb');
        if ($of === false) {
            \fclose($if);
            throw new Ex\IOException(
                'Cannot open output file for encrypting: ' .
                self::getLastErrorMessage()
            );
        }
        if (\is_callable('\\stream_set_write_buffer')) {
            /* This call can fail, but the only consequence is performance. */
            \stream_set_write_buffer($of, 0);
        }

        /* Perform the encryption. */
        try {
            self::encryptResourceInternal($if, $of, $secret);
        } catch (Ex\CryptoException $ex) {
            \fclose($if);
            \fclose($of);
            throw $ex;
        }

        /* Close the input file. */
        if (\fclose($if) === false) {
            \fclose($of);
            throw new Ex\IOException(
                'Cannot close input file after encrypting'
            );
        }

        /* Close the output file. */
        if (\fclose($of) === false) {
            throw new Ex\IOException(
                'Cannot close output file after encrypting'
            );
        }
    }

    /**
     * Decrypts a file with either a key or a password.
     *
     * @param string        $inputFilename
     * @param string        $outputFilename
     * @param KeyOrPassword $secret
     * @return void
     *
     * @throws Ex\CryptoException
     * @throws Ex\IOException
     */
    private static function decryptFileInternal($inputFilename, $outputFilename, KeyOrPassword $secret)
    {
        /* Open the input file. */
        $if = @\fopen($inputFilename, 'rb');
        if ($if === false) {
            throw new Ex\IOException(
                'Cannot open input file for decrypting: ' .
                self::getLastErrorMessage()
            );
        }

        if (\is_callable('\\stream_set_read_buffer')) {
            /* This call can fail, but the only consequence is performance. */
            \stream_set_read_buffer($if, 0);
        }

        /* Open the output file. */
        $of = @\fopen($outputFilename, 'wb');
        if ($of === false) {
            \fclose($if);
            throw new Ex\IOException(
                'Cannot open output file for decrypting: ' .
                self::getLastErrorMessage()
            );
        }

        if (\is_callable('\\stream_set_write_buffer')) {
            /* This call can fail, but the only consequence is performance. */
            \stream_set_write_buffer($of, 0);
        }

        /* Perform the decryption. */
        try {
            self::decryptResourceInternal($if, $of, $secret);
        } catch (Ex\CryptoException $ex) {
            \fclose($if);
            \fclose($of);
            throw $ex;
        }

        /* Close the input file. */
        if (\fclose($if) === false) {
            \fclose($of);
            throw new Ex\IOException(
                'Cannot close input file after decrypting'
            );
        }

        /* Close the output file. */
        if (\fclose($of) === false) {
            throw new Ex\IOException(
                'Cannot close output file after decrypting'
            );
        }
    }

    /**
     * Encrypts a resource with either a key or a password.
     *
     * @param resource      $inputHandle
     * @param resource      $outputHandle
     * @param KeyOrPassword $secret
     * @return void
     *
     * @throws Ex\EnvironmentIsBrokenException
     * @throws Ex\IOException
     */
    private static function encryptResourceInternal($inputHandle, $outputHandle, KeyOrPassword $secret)
    {
        if (! \is_resource($inputHandle)) {
            throw new Ex\IOException(
                'Input handle must be a resource!'
            );
        }
        if (! \is_resource($outputHandle)) {
            throw new Ex\IOException(
                'Output handle must be a resource!'
            );
        }

        $inputStat = \fstat($inputHandle);
        $inputSize = $inputStat['size'];

        $file_salt = Core::secureRandom(Core::SALT_BYTE_SIZE);
        $keys = $secret->deriveKeys($file_salt);
        $ekey = $keys->getEncryptionKey();
        $akey = $keys->getAuthenticationKey();

        $ivsize = Core::BLOCK_BYTE_SIZE;
        $iv     = Core::secureRandom($ivsize);

        /* Initialize a streaming HMAC state. */
        /** @var resource $hmac */
        $hmac = \hash_init(Core::HASH_FUNCTION_NAME, HASH_HMAC, $akey);
        if (!\is_resource($hmac)) {
            throw new Ex\EnvironmentIsBrokenException(
                'Cannot initialize a hash context'
            );
        }

        /* Write the header, salt, and IV. */
        self::writeBytes(
            $outputHandle,
            Core::CURRENT_VERSION . $file_salt . $iv,
            Core::HEADER_VERSION_SIZE + Core::SALT_BYTE_SIZE + $ivsize
        );

        /* Add the header, salt, and IV to the HMAC. */
        \hash_update($hmac, Core::CURRENT_VERSION);
        \hash_update($hmac, $file_salt);
        \hash_update($hmac, $iv);

        /* $thisIv will be incremented after each call to the encryption. */
        $thisIv = $iv;

        /* How many blocks do we encrypt at a time? We increment by this value. */
        $inc = (int) (Core::BUFFER_BYTE_SIZE / Core::BLOCK_BYTE_SIZE);

        /* Loop until we reach the end of the input file. */
        $at_file_end = false;
        while (! (\feof($inputHandle) || $at_file_end)) {
            /* Find out if we can read a full buffer, or only a partial one. */
            /** @var int */
            $pos = \ftell($inputHandle);
            if (!\is_int($pos)) {
                throw new Ex\IOException(
                    'Could not get current position in input file during encryption'
                );
            }
            if ($pos + Core::BUFFER_BYTE_SIZE >= $inputSize) {
                /* We're at the end of the file, so we need to break out of the loop. */
                $at_file_end = true;
                $read = self::readBytes(
                    $inputHandle,
                    $inputSize - $pos
                );
            } else {
                $read = self::readBytes(
                    $inputHandle,
                    Core::BUFFER_BYTE_SIZE
                );
            }

            /* Encrypt this buffer. */
            /** @var string */
            $encrypted = \openssl_encrypt(
                $read,
                Core::CIPHER_METHOD,
                $ekey,
                OPENSSL_RAW_DATA,
                $thisIv
            );

            if (!\is_string($encrypted)) {
                throw new Ex\EnvironmentIsBrokenException(
                    'OpenSSL encryption error'
                );
            }

            /* Write this buffer's ciphertext. */
            self::writeBytes($outputHandle, $encrypted, Core::ourStrlen($encrypted));
            /* Add this buffer's ciphertext to the HMAC. */
            \hash_update($hmac, $encrypted);

            /* Increment the counter by the number of blocks in a buffer. */
            $thisIv = Core::incrementCounter($thisIv, $inc);
            /* WARNING: Usually, unless the file is a multiple of the buffer
             * size, $thisIv will contain an incorrect value here on the last
             * iteration of this loop. */
        }

        /* Get the HMAC and append it to the ciphertext. */
        $final_mac = \hash_final($hmac, true);
        self::writeBytes($outputHandle, $final_mac, Core::MAC_BYTE_SIZE);
    }

    /**
     * Decrypts a file-backed resource with either a key or a password.
     *
     * @param resource      $inputHandle
     * @param resource      $outputHandle
     * @param KeyOrPassword $secret
     * @return void
     *
     * @throws Ex\EnvironmentIsBrokenException
     * @throws Ex\IOException
     * @throws Ex\WrongKeyOrModifiedCiphertextException
     */
    public static function decryptResourceInternal($inputHandle, $outputHandle, KeyOrPassword $secret)
    {
        if (! \is_resource($inputHandle)) {
            throw new Ex\IOException(
                'Input handle must be a resource!'
            );
        }
        if (! \is_resource($outputHandle)) {
            throw new Ex\IOException(
                'Output handle must be a resource!'
            );
        }

        /* Make sure the file is big enough for all the reads we need to do. */
        $stat = \fstat($inputHandle);
        if ($stat['size'] < Core::MINIMUM_CIPHERTEXT_SIZE) {
            throw new Ex\WrongKeyOrModifiedCiphertextException(
                'Input file is too small to have been created by this library.'
            );
        }

        /* Check the version header. */
        $header = self::readBytes($inputHandle, Core::HEADER_VERSION_SIZE);
        if ($header !== Core::CURRENT_VERSION) {
            throw new Ex\WrongKeyOrModifiedCiphertextException(
                'Bad version header.'
            );
        }

        /* Get the salt. */
        $file_salt = self::readBytes($inputHandle, Core::SALT_BYTE_SIZE);

        /* Get the IV. */
        $ivsize = Core::BLOCK_BYTE_SIZE;
        $iv     = self::readBytes($inputHandle, $ivsize);

        /* Derive the authentication and encryption keys. */
        $keys = $secret->deriveKeys($file_salt);
        $ekey = $keys->getEncryptionKey();
        $akey = $keys->getAuthenticationKey();

        /* We'll store the MAC of each buffer-sized chunk as we verify the
         * actual MAC, so that we can check them again when decrypting. */
        $macs = [];

        /* $thisIv will be incremented after each call to the decryption. */
        $thisIv = $iv;

        /* How many blocks do we encrypt at a time? We increment by this value. */
        $inc = (int) (Core::BUFFER_BYTE_SIZE / Core::BLOCK_BYTE_SIZE);

        /* Get the HMAC. */
        if (\fseek($inputHandle, (-1 * Core::MAC_BYTE_SIZE), SEEK_END) === false) {
            throw new Ex\IOException(
                'Cannot seek to beginning of MAC within input file'
            );
        }

        /* Get the position of the last byte in the actual ciphertext. */
        /** @var int $cipher_end */
        $cipher_end = \ftell($inputHandle);
        if (!\is_int($cipher_end)) {
            throw new Ex\IOException(
                'Cannot read input file'
            );
        }
        /* We have the position of the first byte of the HMAC. Go back by one. */
        --$cipher_end;

        /* Read the HMAC. */
        /** @var string $stored_mac */
        $stored_mac = self::readBytes($inputHandle, Core::MAC_BYTE_SIZE);

        /* Initialize a streaming HMAC state. */
        /** @var resource $hmac */
        $hmac = \hash_init(Core::HASH_FUNCTION_NAME, HASH_HMAC, $akey);
        if (!\is_resource($hmac)) {
            throw new Ex\EnvironmentIsBrokenException(
                'Cannot initialize a hash context'
            );
        }

        /* Reset file pointer to the beginning of the file after the header */
        if (\fseek($inputHandle, Core::HEADER_VERSION_SIZE, SEEK_SET) === false) {
            throw new Ex\IOException(
                'Cannot read seek within input file'
            );
        }

        /* Seek to the start of the actual ciphertext. */
        if (\fseek($inputHandle, Core::SALT_BYTE_SIZE + $ivsize, SEEK_CUR) === false) {
            throw new Ex\IOException(
                'Cannot seek input file to beginning of ciphertext'
            );
        }

        /* PASS #1: Calculating the HMAC. */

        \hash_update($hmac, $header);
        \hash_update($hmac, $file_salt);
        \hash_update($hmac, $iv);
        /** @var resource $hmac2 */
        $hmac2 = \hash_copy($hmac);

        $break = false;
        while (! $break) {
            /** @var int $pos */
            $pos = \ftell($inputHandle);
            if (!\is_int($pos)) {
                throw new Ex\IOException(
                    'Could not get current position in input file during decryption'
                );
            }

            /* Read the next buffer-sized chunk (or less). */
            if ($pos + Core::BUFFER_BYTE_SIZE >= $cipher_end) {
                $break = true;
                $read  = self::readBytes(
                    $inputHandle,
                    $cipher_end - $pos + 1
                );
            } else {
                $read = self::readBytes(
                    $inputHandle,
                    Core::BUFFER_BYTE_SIZE
                );
            }

            /* Update the HMAC. */
            \hash_update($hmac, $read);

            /* Remember this buffer-sized chunk's HMAC. */
            /** @var resource $chunk_mac */
            $chunk_mac = \hash_copy($hmac);
            if (!\is_resource($chunk_mac)) {
                throw new Ex\EnvironmentIsBrokenException(
                    'Cannot duplicate a hash context'
                );
            }
            $macs []= \hash_final($chunk_mac);
        }

        /* Get the final HMAC, which should match the stored one. */
        /** @var string $final_mac */
        $final_mac = \hash_final($hmac, true);

        /* Verify the HMAC. */
        if (! Core::hashEquals($final_mac, $stored_mac)) {
            throw new Ex\WrongKeyOrModifiedCiphertextException(
                'Integrity check failed.'
            );
        }

        /* PASS #2: Decrypt and write output. */

        /* Rewind to the start of the actual ciphertext. */
        if (\fseek($inputHandle, Core::SALT_BYTE_SIZE + $ivsize + Core::HEADER_VERSION_SIZE, SEEK_SET) === false) {
            throw new Ex\IOException(
                'Could not move the input file pointer during decryption'
            );
        }

        $at_file_end = false;
        while (! $at_file_end) {
            /** @var int $pos */
            $pos = \ftell($inputHandle);
            if (!\is_int($pos)) {
                throw new Ex\IOException(
                    'Could not get current position in input file during decryption'
                );
            }

            /* Read the next buffer-sized chunk (or less). */
            if ($pos + Core::BUFFER_BYTE_SIZE >= $cipher_end) {
                $at_file_end = true;
                $read   = self::readBytes(
                    $inputHandle,
                    $cipher_end - $pos + 1
                );
            } else {
                $read = self::readBytes(
                    $inputHandle,
                    Core::BUFFER_BYTE_SIZE
                );
            }

            /* Recalculate the MAC (so far) and compare it with the one we
             * remembered from pass #1 to ensure attackers didn't change the
             * ciphertext after MAC verification. */
            \hash_update($hmac2, $read);
            /** @var resource $calc_mac */
            $calc_mac = \hash_copy($hmac2);
            if (!\is_resource($calc_mac)) {
                throw new Ex\EnvironmentIsBrokenException(
                    'Cannot duplicate a hash context'
                );
            }
            $calc = \hash_final($calc_mac);

            if (empty($macs)) {
                throw new Ex\WrongKeyOrModifiedCiphertextException(
                    'File was modified after MAC verification'
                );
            } elseif (! Core::hashEquals(\array_shift($macs), $calc)) {
                throw new Ex\WrongKeyOrModifiedCiphertextException(
                    'File was modified after MAC verification'
                );
            }

            /* Decrypt this buffer-sized chunk. */
            /** @var string $decrypted */
            $decrypted = \openssl_decrypt(
                $read,
                Core::CIPHER_METHOD,
                $ekey,
                OPENSSL_RAW_DATA,
                $thisIv
            );
            if (!\is_string($decrypted)) {
                throw new Ex\EnvironmentIsBrokenException(
                    'OpenSSL decryption error'
                );
            }

            /* Write the plaintext to the output file. */
            self::writeBytes(
                $outputHandle,
                $decrypted,
                Core::ourStrlen($decrypted)
            );

            /* Increment the IV by the amount of blocks in a buffer. */
            /** @var string $thisIv */
            $thisIv = Core::incrementCounter($thisIv, $inc);
            /* WARNING: Usually, unless the file is a multiple of the buffer
             * size, $thisIv will contain an incorrect value here on the last
             * iteration of this loop. */
        }
    }

    /**
     * Read from a stream; prevent partial reads.
     *
     * @param resource $stream
     * @param int      $num_bytes
     * @return string
     *
     * @throws Ex\IOException
     * @throws Ex\EnvironmentIsBrokenException
     *
     * @return string
     */
    public static function readBytes($stream, $num_bytes)
    {
        if ($num_bytes < 0) {
            throw new Ex\EnvironmentIsBrokenException(
                'Tried to read less than 0 bytes'
            );
        } elseif ($num_bytes === 0) {
            return '';
        }
        $buf       = '';
        $remaining = $num_bytes;
        while ($remaining > 0 && ! \feof($stream)) {
            /** @var string $read */
            $read = \fread($stream, $remaining);
            if (!\is_string($read)) {
                throw new Ex\IOException(
                    'Could not read from the file'
                );
            }
            $buf .= $read;
            $remaining -= Core::ourStrlen($read);
        }
        if (Core::ourStrlen($buf) !== $num_bytes) {
            throw new Ex\IOException(
                'Tried to read past the end of the file'
            );
        }
        return $buf;
    }

    /**
     * Write to a stream; prevents partial writes.
     *
     * @param resource $stream
     * @param string   $buf
     * @param int      $num_bytes
     * @return int
     *
     * @throws Ex\IOException
     *
     * @return string
     */
    public static function writeBytes($stream, $buf, $num_bytes = null)
    {
        $bufSize = Core::ourStrlen($buf);
        if ($num_bytes === null) {
            $num_bytes = $bufSize;
        }
        if ($num_bytes > $bufSize) {
            throw new Ex\IOException(
                'Trying to write more bytes than the buffer contains.'
            );
        }
        if ($num_bytes < 0) {
            throw new Ex\IOException(
                'Tried to write less than 0 bytes'
            );
        }
        $remaining = $num_bytes;
        while ($remaining > 0) {
            /** @var int $written */
            $written = \fwrite($stream, $buf, $remaining);
            if (!\is_int($written)) {
                throw new Ex\IOException(
                    'Could not write to the file'
                );
            }
            $buf = (string) Core::ourSubstr($buf, $written, null);
            $remaining -= $written;
        }
        return $num_bytes;
    }

    /**
     * Returns the last PHP error's or warning's message string.
     *
     * @return string
     */
    private static function getLastErrorMessage()
    {
        $error = error_get_last();
        if ($error === null) {
            return '[no PHP error]';
        } else {
            return $error['message'];
        }
    }
}
components/com_jce/vendor/Defuse/Crypto/Key.php000060400000004437152453623450015576 0ustar00<?php

namespace Defuse\Crypto;

use Defuse\Crypto\Exception as Ex;

final class Key
{
    const KEY_CURRENT_VERSION = "\xDE\xF0\x00\x00";
    const KEY_BYTE_SIZE       = 32;

    /**
     * @var string
     */
    private $key_bytes;

    /**
     * Creates new random key.
     *
     * @throws Ex\EnvironmentIsBrokenException
     *
     * @return Key
     */
    public static function createNewRandomKey()
    {
        return new Key(Core::secureRandom(self::KEY_BYTE_SIZE));
    }

    /**
     * Loads a Key from its encoded form.
     *
     * By default, this function will call Encoding::trimTrailingWhitespace()
     * to remove trailing CR, LF, NUL, TAB, and SPACE characters, which are
     * commonly appended to files when working with text editors.
     *
     * @param string $saved_key_string
     * @param bool $do_not_trim (default: false)
     *
     * @throws Ex\BadFormatException
     * @throws Ex\EnvironmentIsBrokenException
     *
     * @return Key
     */
    public static function loadFromAsciiSafeString($saved_key_string, $do_not_trim = false)
    {
        if (!$do_not_trim) {
            $saved_key_string = Encoding::trimTrailingWhitespace($saved_key_string);
        }
        $key_bytes = Encoding::loadBytesFromChecksummedAsciiSafeString(self::KEY_CURRENT_VERSION, $saved_key_string);
        return new Key($key_bytes);
    }

    /**
     * Encodes the Key into a string of printable ASCII characters.
     *
     * @throws Ex\EnvironmentIsBrokenException
     *
     * @return string
     */
    public function saveToAsciiSafeString()
    {
        return Encoding::saveBytesToChecksummedAsciiSafeString(
            self::KEY_CURRENT_VERSION,
            $this->key_bytes
        );
    }

    /**
     * Gets the raw bytes of the key.
     *
     * @return string
     */
    public function getRawBytes()
    {
        return $this->key_bytes;
    }

    /**
     * Constructs a new Key object from a string of raw bytes.
     *
     * @param string $bytes
     *
     * @throws Ex\EnvironmentIsBrokenException
     */
    private function __construct($bytes)
    {
        if (Core::ourStrlen($bytes) !== self::KEY_BYTE_SIZE) {
            throw new Ex\EnvironmentIsBrokenException(
                'Bad key length.'
            );
        }
        $this->key_bytes = $bytes;
    }

}
components/com_jce/vendor/Defuse/Crypto/Exception/WrongKeyOrModifiedCiphertextException.php000060400000000214152453623450026417 0ustar00<?php

namespace Defuse\Crypto\Exception;

class WrongKeyOrModifiedCiphertextException extends \Defuse\Crypto\Exception\CryptoException
{
}
components/com_jce/vendor/Defuse/Crypto/Exception/EnvironmentIsBrokenException.php000060400000000203152453623450024607 0ustar00<?php

namespace Defuse\Crypto\Exception;

class EnvironmentIsBrokenException extends \Defuse\Crypto\Exception\CryptoException
{
}
components/com_jce/vendor/Defuse/Crypto/Exception/BadFormatException.php000060400000000171152453623450022511 0ustar00<?php

namespace Defuse\Crypto\Exception;

class BadFormatException extends \Defuse\Crypto\Exception\CryptoException
{
}
components/com_jce/vendor/Defuse/Crypto/Exception/CryptoException.php000060400000000130152453623450022125 0ustar00<?php

namespace Defuse\Crypto\Exception;

class CryptoException extends \Exception
{
}
components/com_jce/vendor/Defuse/Crypto/Exception/IOException.php000060400000000162152453623450021161 0ustar00<?php

namespace Defuse\Crypto\Exception;

class IOException extends \Defuse\Crypto\Exception\CryptoException
{
}
components/com_jce/vendor/Defuse/Crypto/Crypto.php000060400000033767152453623450016336 0ustar00<?php

namespace Defuse\Crypto;

use Defuse\Crypto\Exception as Ex;

class Crypto
{
    /**
     * Encrypts a string with a Key.
     *
     * @param string $plaintext
     * @param Key    $key
     * @param bool   $raw_binary
     *
     * @throws Ex\EnvironmentIsBrokenException
     *
     * @return string
     */
    public static function encrypt($plaintext, Key $key, $raw_binary = false)
    {
        if (!\is_string($plaintext)) {
            throw new \TypeError(
                'String expected for argument 1. ' . \ucfirst(\gettype($plaintext)) . ' given instead.'
            );
        }
        if (!\is_bool($raw_binary)) {
            throw new \TypeError(
                'Boolean expected for argument 3. ' . \ucfirst(\gettype($raw_binary)) . ' given instead.'
            );
        }
        return self::encryptInternal(
            $plaintext,
            KeyOrPassword::createFromKey($key),
            $raw_binary
        );
    }

    /**
     * Encrypts a string with a password, using a slow key derivation function
     * to make password cracking more expensive.
     *
     * @param string $plaintext
     * @param string $password
     * @param bool   $raw_binary
     *
     * @throws Ex\EnvironmentIsBrokenException
     *
     * @return string
     */
    public static function encryptWithPassword($plaintext, $password, $raw_binary = false)
    {
        if (!\is_string($plaintext)) {
            throw new \TypeError(
                'String expected for argument 1. ' . \ucfirst(\gettype($plaintext)) . ' given instead.'
            );
        }
        if (!\is_string($password)) {
            throw new \TypeError(
                'String expected for argument 2. ' . \ucfirst(\gettype($password)) . ' given instead.'
            );
        }
        if (!\is_bool($raw_binary)) {
            throw new \TypeError(
                'Boolean expected for argument 3. ' . \ucfirst(\gettype($raw_binary)) . ' given instead.'
            );
        }
        return self::encryptInternal(
            $plaintext,
            KeyOrPassword::createFromPassword($password),
            $raw_binary
        );
    }

    /**
     * Decrypts a ciphertext to a string with a Key.
     *
     * @param string $ciphertext
     * @param Key    $key
     * @param bool   $raw_binary
     *
     * @throws \TypeError
     * @throws Ex\EnvironmentIsBrokenException
     * @throws Ex\WrongKeyOrModifiedCiphertextException
     *
     * @return string
     */
    public static function decrypt($ciphertext, Key $key, $raw_binary = false)
    {
        if (!\is_string($ciphertext)) {
            throw new \TypeError(
                'String expected for argument 1. ' . \ucfirst(\gettype($ciphertext)) . ' given instead.'
            );
        }
        if (!\is_bool($raw_binary)) {
            throw new \TypeError(
                'Boolean expected for argument 3. ' . \ucfirst(\gettype($raw_binary)) . ' given instead.'
            );
        }
        return self::decryptInternal(
            $ciphertext,
            KeyOrPassword::createFromKey($key),
            $raw_binary
        );
    }

    /**
     * Decrypts a ciphertext to a string with a password, using a slow key
     * derivation function to make password cracking more expensive.
     *
     * @param string $ciphertext
     * @param string $password
     * @param bool   $raw_binary
     *
     * @throws Ex\EnvironmentIsBrokenException
     * @throws Ex\WrongKeyOrModifiedCiphertextException
     *
     * @return string
     */
    public static function decryptWithPassword($ciphertext, $password, $raw_binary = false)
    {
        if (!\is_string($ciphertext)) {
            throw new \TypeError(
                'String expected for argument 1. ' . \ucfirst(\gettype($ciphertext)) . ' given instead.'
            );
        }
        if (!\is_string($password)) {
            throw new \TypeError(
                'String expected for argument 2. ' . \ucfirst(\gettype($password)) . ' given instead.'
            );
        }
        if (!\is_bool($raw_binary)) {
            throw new \TypeError(
                'Boolean expected for argument 3. ' . \ucfirst(\gettype($raw_binary)) . ' given instead.'
            );
        }
        return self::decryptInternal(
            $ciphertext,
            KeyOrPassword::createFromPassword($password),
            $raw_binary
        );
    }

    /**
     * Decrypts a legacy ciphertext produced by version 1 of this library.
     *
     * @param string $ciphertext
     * @param string $key
     *
     * @throws Ex\EnvironmentIsBrokenException
     * @throws Ex\WrongKeyOrModifiedCiphertextException
     *
     * @return string
     */
    public static function legacyDecrypt($ciphertext, $key)
    {
        if (!\is_string($ciphertext)) {
            throw new \TypeError(
                'String expected for argument 1. ' . \ucfirst(\gettype($ciphertext)) . ' given instead.'
            );
        }
        if (!\is_string($key)) {
            throw new \TypeError(
                'String expected for argument 2. ' . \ucfirst(\gettype($key)) . ' given instead.'
            );
        }

        RuntimeTests::runtimeTest();

        // Extract the HMAC from the front of the ciphertext.
        if (Core::ourStrlen($ciphertext) <= Core::LEGACY_MAC_BYTE_SIZE) {
            throw new Ex\WrongKeyOrModifiedCiphertextException(
                'Ciphertext is too short.'
            );
        }
        /**
         * @var string
         */
        $hmac = Core::ourSubstr($ciphertext, 0, Core::LEGACY_MAC_BYTE_SIZE);
        if (!\is_string($hmac)) {
            throw new Ex\EnvironmentIsBrokenException();
        }
        /**
         * @var string
         */
        $messageCiphertext = Core::ourSubstr($ciphertext, Core::LEGACY_MAC_BYTE_SIZE);
        if (!\is_string($messageCiphertext)) {
            throw new Ex\EnvironmentIsBrokenException();
        }

        // Regenerate the same authentication sub-key.
        $akey = Core::HKDF(
            Core::LEGACY_HASH_FUNCTION_NAME,
            $key,
            Core::LEGACY_KEY_BYTE_SIZE,
            Core::LEGACY_AUTHENTICATION_INFO_STRING,
            null
        );

        if (self::verifyHMAC($hmac, $messageCiphertext, $akey)) {
            // Regenerate the same encryption sub-key.
            $ekey = Core::HKDF(
                Core::LEGACY_HASH_FUNCTION_NAME,
                $key,
                Core::LEGACY_KEY_BYTE_SIZE,
                Core::LEGACY_ENCRYPTION_INFO_STRING,
                null
            );

            // Extract the IV from the ciphertext.
            if (Core::ourStrlen($messageCiphertext) <= Core::LEGACY_BLOCK_BYTE_SIZE) {
                throw new Ex\WrongKeyOrModifiedCiphertextException(
                    'Ciphertext is too short.'
                );
            }
            /**
             * @var string
             */
            $iv = Core::ourSubstr($messageCiphertext, 0, Core::LEGACY_BLOCK_BYTE_SIZE);
            if (!\is_string($iv)) {
                throw new Ex\EnvironmentIsBrokenException();
            }

            /**
             * @var string
             */
            $actualCiphertext = Core::ourSubstr($messageCiphertext, Core::LEGACY_BLOCK_BYTE_SIZE);
            if (!\is_string($actualCiphertext)) {
                throw new Ex\EnvironmentIsBrokenException();
            }

            // Do the decryption.
            $plaintext = self::plainDecrypt($actualCiphertext, $ekey, $iv, Core::LEGACY_CIPHER_METHOD);
            return $plaintext;
        } else {
            throw new Ex\WrongKeyOrModifiedCiphertextException(
                'Integrity check failed.'
            );
        }
    }

    /**
     * Encrypts a string with either a key or a password.
     *
     * @param string        $plaintext
     * @param KeyOrPassword $secret
     * @param bool          $raw_binary
     *
     * @return string
     */
    private static function encryptInternal($plaintext, KeyOrPassword $secret, $raw_binary)
    {
        RuntimeTests::runtimeTest();

        $salt = Core::secureRandom(Core::SALT_BYTE_SIZE);
        $keys = $secret->deriveKeys($salt);
        $ekey = $keys->getEncryptionKey();
        $akey = $keys->getAuthenticationKey();
        $iv     = Core::secureRandom(Core::BLOCK_BYTE_SIZE);

        $ciphertext = Core::CURRENT_VERSION . $salt . $iv . self::plainEncrypt($plaintext, $ekey, $iv);
        $auth       = \hash_hmac(Core::HASH_FUNCTION_NAME, $ciphertext, $akey, true);
        $ciphertext = $ciphertext . $auth;

        if ($raw_binary) {
            return $ciphertext;
        }
        return Encoding::binToHex($ciphertext);
    }

    /**
     * Decrypts a ciphertext to a string with either a key or a password.
     *
     * @param string        $ciphertext
     * @param KeyOrPassword $secret
     * @param bool          $raw_binary
     *
     * @throws Ex\EnvironmentIsBrokenException
     * @throws Ex\WrongKeyOrModifiedCiphertextException
     *
     * @return string
     */
    private static function decryptInternal($ciphertext, KeyOrPassword $secret, $raw_binary)
    {
        RuntimeTests::runtimeTest();

        if (! $raw_binary) {
            try {
                $ciphertext = Encoding::hexToBin($ciphertext);
            } catch (Ex\BadFormatException $ex) {
                throw new Ex\WrongKeyOrModifiedCiphertextException(
                    'Ciphertext has invalid hex encoding.'
                );
            }
        }

        if (Core::ourStrlen($ciphertext) < Core::MINIMUM_CIPHERTEXT_SIZE) {
            throw new Ex\WrongKeyOrModifiedCiphertextException(
                'Ciphertext is too short.'
            );
        }

        // Get and check the version header.
        /** @var string $header */
        $header = Core::ourSubstr($ciphertext, 0, Core::HEADER_VERSION_SIZE);
        if ($header !== Core::CURRENT_VERSION) {
            throw new Ex\WrongKeyOrModifiedCiphertextException(
                'Bad version header.'
            );
        }

        // Get the salt.
        /** @var string $salt */
        $salt = Core::ourSubstr(
            $ciphertext,
            Core::HEADER_VERSION_SIZE,
            Core::SALT_BYTE_SIZE
        );
        if (!\is_string($salt)) {
            throw new Ex\EnvironmentIsBrokenException();
        }

        // Get the IV.
        /** @var string $iv */
        $iv = Core::ourSubstr(
            $ciphertext,
            Core::HEADER_VERSION_SIZE + Core::SALT_BYTE_SIZE,
            Core::BLOCK_BYTE_SIZE
        );
        if (!\is_string($iv)) {
            throw new Ex\EnvironmentIsBrokenException();
        }

        // Get the HMAC.
        /** @var string $hmac */
        $hmac = Core::ourSubstr(
            $ciphertext,
            Core::ourStrlen($ciphertext) - Core::MAC_BYTE_SIZE,
            Core::MAC_BYTE_SIZE
        );
        if (!\is_string($hmac)) {
            throw new Ex\EnvironmentIsBrokenException();
        }

        // Get the actual encrypted ciphertext.
        /** @var string $encrypted */
        $encrypted = Core::ourSubstr(
            $ciphertext,
            Core::HEADER_VERSION_SIZE + Core::SALT_BYTE_SIZE +
                Core::BLOCK_BYTE_SIZE,
            Core::ourStrlen($ciphertext) - Core::MAC_BYTE_SIZE - Core::SALT_BYTE_SIZE -
                Core::BLOCK_BYTE_SIZE - Core::HEADER_VERSION_SIZE
        );
        if (!\is_string($encrypted)) {
            throw new Ex\EnvironmentIsBrokenException();
        }

        // Derive the separate encryption and authentication keys from the key
        // or password, whichever it is.
        $keys = $secret->deriveKeys($salt);

        if (self::verifyHMAC($hmac, $header . $salt . $iv . $encrypted, $keys->getAuthenticationKey())) {
            $plaintext = self::plainDecrypt($encrypted, $keys->getEncryptionKey(), $iv, Core::CIPHER_METHOD);
            return $plaintext;
        } else {
            throw new Ex\WrongKeyOrModifiedCiphertextException(
                'Integrity check failed.'
            );
        }
    }

    /**
     * Raw unauthenticated encryption (insecure on its own).
     *
     * @param string $plaintext
     * @param string $key
     * @param string $iv
     *
     * @throws Ex\EnvironmentIsBrokenException
     *
     * @return string
     */
    protected static function plainEncrypt($plaintext, $key, $iv)
    {
        Core::ensureConstantExists('OPENSSL_RAW_DATA');
        Core::ensureFunctionExists('openssl_encrypt');
        /** @var string $ciphertext */
        $ciphertext = \openssl_encrypt(
            $plaintext,
            Core::CIPHER_METHOD,
            $key,
            OPENSSL_RAW_DATA,
            $iv
        );

        if (!\is_string($ciphertext)) {
            throw new Ex\EnvironmentIsBrokenException(
                'openssl_encrypt() failed.'
            );
        }

        return $ciphertext;
    }

    /**
     * Raw unauthenticated decryption (insecure on its own).
     *
     * @param string $ciphertext
     * @param string $key
     * @param string $iv
     * @param string $cipherMethod
     *
     * @throws Ex\EnvironmentIsBrokenException
     *
     * @return string
     */
    protected static function plainDecrypt($ciphertext, $key, $iv, $cipherMethod)
    {
        Core::ensureConstantExists('OPENSSL_RAW_DATA');
        Core::ensureFunctionExists('openssl_decrypt');

        /** @var string $plaintext */
        $plaintext = \openssl_decrypt(
            $ciphertext,
            $cipherMethod,
            $key,
            OPENSSL_RAW_DATA,
            $iv
        );
        if (!\is_string($plaintext)) {
            throw new Ex\EnvironmentIsBrokenException(
                'openssl_decrypt() failed.'
            );
        }

        return $plaintext;
    }

    /**
     * Verifies an HMAC without leaking information through side-channels.
     *
     * @param string $expected_hmac
     * @param string $message
     * @param string $key
     *
     * @throws Ex\EnvironmentIsBrokenException
     *
     * @return bool
     */
    protected static function verifyHMAC($expected_hmac, $message, $key)
    {
        $message_hmac = \hash_hmac(Core::HASH_FUNCTION_NAME, $message, $key, true);
        return Core::hashEquals($message_hmac, $expected_hmac);
    }
}
components/com_jce/index.html000060400000000054152453623450012331 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_jce/tables/profiles.php000060400000003713152453623450014147 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright     Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Table\Table;

require_once JPATH_ADMINISTRATOR . '/components/com_jce/helpers/encrypt.php';

class JceTableProfiles extends Table
{
    /**
     * Indicates that columns fully support the NULL value in the database
     *
     * @var    boolean
     * @since  4.0.0
     */
    protected $_supportNullValue = true;

    public function __construct(&$db)
    {
        parent::__construct('#__wf_profiles', 'id', $db);
    }

    public function load($id = null, $reset = true)
    {
        $return = parent::load($id, $reset);

        if ($return !== false) {
            // decrypt params
            if (!empty($this->params)) {
                $this->params = JceEncryptHelper::decrypt($this->params);
            }
        }

        return $return;
    }

    /**
     * Overloaded check function
     *
     * @return  boolean  True on success, false on failure
     *
     * @see     Table::check()
     * @since   2.9.18
     */
    public function check()
    {
        try
        {
            parent::check();
        } catch (Exception $e) {
            $this->setError($e->getMessage());

            return false;
        }

        /**
         * Ensure any new items have compulsory fields set
         */
        if (!$this->id) {
            if (!isset($this->device)) {
                $this->device = 'desktop,tablet,phone';
            }

            if (!isset($this->area)) {
                $this->area = '0';
            }

            // Params can be an empty json string for new tables
            if (empty($this->params)) {
                $this->params = '{}';
            }
        }

        return true;
    }
}
components/com_jce/tables/index.html000060400000000054152453623450013603 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_jce/helpers/encrypt/aes.php000060400000054036152453623450014754 0ustar00<?php
/**
 * @copyright Copyright (c)2009-2013 Nicholas K. Dionysopoulos
 * @license GNU General Public License version 3, or later
 *
 * @since 2.4
 */

// Protection against direct access
\defined('_JEXEC') or die;

/**
 * AES implementation in PHP (c) Chris Veness 2005-2013.
 * Right to use and adapt is granted for under a simple creative commons attribution
 * licence. No warranty of any form is offered.
 *
 * Modified for Akeeba Backup by Nicholas K. Dionysopoulos
 * Included for JCE with the kind permission of Nicholas K. Dionysopoulos
 */
class WFUtilEncrypt
{
    // Sbox is pre-computed multiplicative inverse in GF(2^8) used in SubBytes and KeyExpansion [�5.1.1]
    protected static $Sbox =
             array(0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
                   0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
                   0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
                   0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
                   0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
                   0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
                   0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
                   0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
                   0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
                   0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
                   0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
                   0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
                   0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
                   0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
                   0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
                   0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16, );

    // Rcon is Round Constant used for the Key Expansion [1st col is 2^(r-1) in GF(2^8)] [�5.2]
    protected static $Rcon = array(
                   array(0x00, 0x00, 0x00, 0x00),
                   array(0x01, 0x00, 0x00, 0x00),
                   array(0x02, 0x00, 0x00, 0x00),
                   array(0x04, 0x00, 0x00, 0x00),
                   array(0x08, 0x00, 0x00, 0x00),
                   array(0x10, 0x00, 0x00, 0x00),
                   array(0x20, 0x00, 0x00, 0x00),
                   array(0x40, 0x00, 0x00, 0x00),
                   array(0x80, 0x00, 0x00, 0x00),
                   array(0x1b, 0x00, 0x00, 0x00),
                   array(0x36, 0x00, 0x00, 0x00), );

    protected static $passwords = array();

    /**
     * AES Cipher function: encrypt 'input' with Rijndael algorithm.
     *
     * @param input message as byte-array (16 bytes)
     * @param w     key schedule as 2D byte-array (Nr+1 x Nb bytes) -
     *              generated from the cipher key by KeyExpansion()
     *
     * @return ciphertext as byte-array (16 bytes)
     */
    public static function Cipher($input, $w)
    {    // main Cipher function [�5.1]
      $Nb = 4;                 // block size (in words): no of columns in state (fixed at 4 for AES)
      $Nr = count($w) / $Nb - 1; // no of rounds: 10/12/14 for 128/192/256-bit keys

      $state = array();  // initialise 4xNb byte-array 'state' with input [�3.4]
      for ($i = 0; $i < 4 * $Nb; ++$i) {
          $state[$i % 4][floor($i / 4)] = $input[$i];
      }

        $state = self::AddRoundKey($state, $w, 0, $Nb);

        for ($round = 1; $round < $Nr; ++$round) {  // apply Nr rounds
        $state = self::SubBytes($state, $Nb);
            $state = self::ShiftRows($state, $Nb);
            $state = self::MixColumns($state, $Nb);
            $state = self::AddRoundKey($state, $w, $round, $Nb);
        }

        $state = self::SubBytes($state, $Nb);
        $state = self::ShiftRows($state, $Nb);
        $state = self::AddRoundKey($state, $w, $Nr, $Nb);

        $output = array(4 * $Nb);  // convert state to 1-d array before returning [�3.4]
      for ($i = 0; $i < 4 * $Nb; ++$i) {
          $output[$i] = $state[$i % 4][floor($i / 4)];
      }

        return $output;
    }

    protected static function AddRoundKey($state, $w, $rnd, $Nb)
    {  // xor Round Key into state S [�5.1.4]
      for ($r = 0; $r < 4; ++$r) {
          for ($c = 0; $c < $Nb; ++$c) {
              $state[$r][$c] ^= $w[$rnd * 4 + $c][$r];
          }
      }

        return $state;
    }

    protected static function SubBytes($s, $Nb)
    {    // apply SBox to state S [�5.1.1]
      for ($r = 0; $r < 4; ++$r) {
          for ($c = 0; $c < $Nb; ++$c) {
              $s[$r][$c] = self::$Sbox[$s[$r][$c]];
          }
      }

        return $s;
    }

    protected static function ShiftRows($s, $Nb)
    {    // shift row r of state S left by r bytes [�5.1.2]
      $t = array(4);
        for ($r = 1; $r < 4; ++$r) {
            for ($c = 0; $c < 4; ++$c) {
                $t[$c] = $s[$r][($c + $r) % $Nb];
            }  // shift into temp copy
        for ($c = 0; $c < 4; ++$c) {
            $s[$r][$c] = $t[$c];
        }         // and copy back
        }          // note that this will work for Nb=4,5,6, but not 7,8 (always 4 for AES):
      return $s;  // see fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.311.pdf
    }

    protected static function MixColumns($s, $Nb)
    {   // combine bytes of each col of state S [�5.1.3]
      for ($c = 0; $c < 4; ++$c) {
          $a = array(4);  // 'a' is a copy of the current column from 's'
        $b = array(4);  // 'b' is a�{02} in GF(2^8)
        for ($i = 0; $i < 4; ++$i) {
            $a[$i] = $s[$i][$c];
            $b[$i] = $s[$i][$c] & 0x80 ? $s[$i][$c] << 1 ^ 0x011b : $s[$i][$c] << 1;
        }
        // a[n] ^ b[n] is a�{03} in GF(2^8)
        $s[0][$c] = $b[0] ^ $a[1] ^ $b[1] ^ $a[2] ^ $a[3]; // 2*a0 + 3*a1 + a2 + a3
        $s[1][$c] = $a[0] ^ $b[1] ^ $a[2] ^ $b[2] ^ $a[3]; // a0 * 2*a1 + 3*a2 + a3
        $s[2][$c] = $a[0] ^ $a[1] ^ $b[2] ^ $a[3] ^ $b[3]; // a0 + a1 + 2*a2 + 3*a3
        $s[3][$c] = $a[0] ^ $b[0] ^ $a[1] ^ $a[2] ^ $b[3]; // 3*a0 + a1 + a2 + 2*a3
      }

        return $s;
    }

    /**
     * Key expansion for Rijndael Cipher(): performs key expansion on cipher key
     * to generate a key schedule.
     *
     * @param key cipher key byte-array (16 bytes)
     *
     * @return key schedule as 2D byte-array (Nr+1 x Nb bytes)
     */
    public static function KeyExpansion($key)
    {  // generate Key Schedule from Cipher Key [�5.2]
      $Nb = 4;              // block size (in words): no of columns in state (fixed at 4 for AES)
      $Nk = count($key) / 4;  // key length (in words): 4/6/8 for 128/192/256-bit keys
      $Nr = $Nk + 6;        // no of rounds: 10/12/14 for 128/192/256-bit keys

      $w = array();
        $temp = array();

        for ($i = 0; $i < $Nk; ++$i) {
            $r = array($key[4 * $i], $key[4 * $i + 1], $key[4 * $i + 2], $key[4 * $i + 3]);
            $w[$i] = $r;
        }

        for ($i = $Nk; $i < ($Nb * ($Nr + 1)); ++$i) {
            $w[$i] = array();
            for ($t = 0; $t < 4; ++$t) {
                $temp[$t] = $w[$i - 1][$t];
            }
            if ($i % $Nk == 0) {
                $temp = self::SubWord(self::RotWord($temp));
                for ($t = 0; $t < 4; ++$t) {
                    $temp[$t] ^= self::$Rcon[$i / $Nk][$t];
                }
            } elseif ($Nk > 6 && $i % $Nk == 4) {
                $temp = self::SubWord($temp);
            }
            for ($t = 0; $t < 4; ++$t) {
                $w[$i][$t] = $w[$i - $Nk][$t] ^ $temp[$t];
            }
        }

        return $w;
    }

    protected static function SubWord($w)
    {    // apply SBox to 4-byte word w
      for ($i = 0; $i < 4; ++$i) {
          $w[$i] = self::$Sbox[$w[$i]];
      }

        return $w;
    }

    protected static function RotWord($w)
    {    // rotate 4-byte word w left by one byte
      $tmp = $w[0];
        for ($i = 0; $i < 3; ++$i) {
            $w[$i] = $w[$i + 1];
        }
        $w[3] = $tmp;

        return $w;
    }

    /*
     * Unsigned right shift function, since PHP has neither >>> operator nor unsigned ints
     *
     * @param a  number to be shifted (32-bit integer)
     * @param b  number of bits to shift a to the right (0..31)
     * @return   a right-shifted and zero-filled by b bits
     */
    protected static function urs($a, $b)
    {
        $a &= 0xffffffff;
        $b &= 0x1f;  // (bounds check)
      if ($a & 0x80000000 && $b > 0) {   // if left-most bit set
        $a = ($a >> 1) & 0x7fffffff;   //   right-shift one bit & clear left-most bit
        $a = $a >> ($b - 1);           //   remaining right-shifts
      } else {                       // otherwise
        $a = ($a >> $b);               //   use normal right-shift
      }

        return $a;
    }

    /**
     * Encrypt a text using AES encryption in Counter mode of operation
     *  - see http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf.
     *
     * Unicode multi-byte character safe
     *
     * @param plaintext source text to be encrypted
     * @param password  the password to use to generate a key
     * @param nBits     number of bits to be used in the key (128, 192, or 256)
     *
     * @return encrypted text
     */
    public static function AESEncryptCtr($plaintext, $password, $nBits)
    {
        $blockSize = 16;  // block size fixed at 16 bytes / 128 bits (Nb=4) for AES
      if (!($nBits == 128 || $nBits == 192 || $nBits == 256)) {
          return '';
      }  // standard allows 128/192/256 bit keys
      // note PHP (5) gives us plaintext and password in UTF8 encoding!

      // use AES itself to encrypt password to get cipher key (using plain password as source for
      // key expansion) - gives us well encrypted key
      $nBytes = $nBits / 8;  // no bytes in key
      $pwBytes = array();
        for ($i = 0; $i < $nBytes; ++$i) {
            $pwBytes[$i] = ord(substr($password, $i, 1)) & 0xff;
        }
        $key = self::Cipher($pwBytes, self::KeyExpansion($pwBytes));
        $key = array_merge($key, array_slice($key, 0, $nBytes - 16));  // expand key to 16/24/32 bytes long

      // initialise counter block (NIST SP800-38A �B.2): millisecond time-stamp for nonce in
      // 1st 8 bytes, block counter in 2nd 8 bytes
      $counterBlock = array();
        $nonce = floor(microtime(true) * 1000);   // timestamp: milliseconds since 1-Jan-1970
      $nonceSec = floor($nonce / 1000);
        $nonceMs = $nonce % 1000;
      // encode nonce with seconds in 1st 4 bytes, and (repeated) ms part filling 2nd 4 bytes
      for ($i = 0; $i < 4; ++$i) {
          $counterBlock[$i] = self::urs($nonceSec, $i * 8) & 0xff;
      }
        for ($i = 0; $i < 4; ++$i) {
            $counterBlock[$i + 4] = $nonceMs & 0xff;
        }
      // and convert it to a string to go on the front of the ciphertext
      $ctrTxt = '';
        for ($i = 0; $i < 8; ++$i) {
            $ctrTxt .= chr($counterBlock[$i]);
        }

      // generate key schedule - an expansion of the key into distinct Key Rounds for each round
      $keySchedule = self::KeyExpansion($key);

        $blockCount = ceil(strlen($plaintext) / $blockSize);
        $ciphertxt = array();  // ciphertext as array of strings

      for ($b = 0; $b < $blockCount; ++$b) {
          // set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
        // done in two stages for 32-bit ops: using two words allows us to go past 2^32 blocks (68GB)
        for ($c = 0; $c < 4; ++$c) {
            $counterBlock[15 - $c] = self::urs($b, $c * 8) & 0xff;
        }
          for ($c = 0; $c < 4; ++$c) {
              $counterBlock[15 - $c - 4] = self::urs($b / 0x100000000, $c * 8);
          }

          $cipherCntr = self::Cipher($counterBlock, $keySchedule);  // -- encrypt counter block --

        // block size is reduced on final block
        $blockLength = $b < $blockCount - 1 ? $blockSize : (strlen($plaintext) - 1) % $blockSize + 1;
          $cipherByte = array();

          for ($i = 0; $i < $blockLength; ++$i) {  // -- xor plaintext with ciphered counter byte-by-byte --
          $cipherByte[$i] = $cipherCntr[$i] ^ ord(substr($plaintext, $b * $blockSize + $i, 1));
              $cipherByte[$i] = chr($cipherByte[$i]);
          }
          $ciphertxt[$b] = implode('', $cipherByte);  // escape troublesome characters in ciphertext
      }

      // implode is more efficient than repeated string concatenation
      $ciphertext = $ctrTxt.implode('', $ciphertxt);
        $ciphertext = base64_encode($ciphertext);

        return $ciphertext;
    }

    /**
     * Decrypt a text encrypted by AES in counter mode of operation.
     *
     * @param ciphertext source text to be decrypted
     * @param password   the password to use to generate a key
     * @param nBits      number of bits to be used in the key (128, 192, or 256)
     *
     * @return decrypted text
     */
    public static function AESDecryptCtr($ciphertext, $password, $nBits)
    {
        $blockSize = 16;  // block size fixed at 16 bytes / 128 bits (Nb=4) for AES
      if (!($nBits == 128 || $nBits == 192 || $nBits == 256)) {
          return '';
      }  // standard allows 128/192/256 bit keys
      $ciphertext = base64_decode($ciphertext);

      // use AES to encrypt password (mirroring encrypt routine)
      $nBytes = $nBits / 8;  // no bytes in key
      $pwBytes = array();
        for ($i = 0; $i < $nBytes; ++$i) {
            $pwBytes[$i] = ord(substr($password, $i, 1)) & 0xff;
        }
        $key = self::Cipher($pwBytes, self::KeyExpansion($pwBytes));
        $key = array_merge($key, array_slice($key, 0, $nBytes - 16));  // expand key to 16/24/32 bytes long

      // recover nonce from 1st element of ciphertext
      $counterBlock = array();
        $ctrTxt = substr($ciphertext, 0, 8);
        for ($i = 0; $i < 8; ++$i) {
            $counterBlock[$i] = ord(substr($ctrTxt, $i, 1));
        }

      // generate key schedule
      $keySchedule = self::KeyExpansion($key);

      // separate ciphertext into blocks (skipping past initial 8 bytes)
      $nBlocks = ceil((strlen($ciphertext) - 8) / $blockSize);
        $ct = array();
        for ($b = 0; $b < $nBlocks; ++$b) {
            $ct[$b] = substr($ciphertext, 8 + $b * $blockSize, 16);
        }
        $ciphertext = $ct;  // ciphertext is now array of block-length strings

      // plaintext will get generated block-by-block into array of block-length strings
      $plaintxt = array();

        for ($b = 0; $b < $nBlocks; ++$b) {
            // set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
        for ($c = 0; $c < 4; ++$c) {
            $counterBlock[15 - $c] = self::urs($b, $c * 8) & 0xff;
        }
            for ($c = 0; $c < 4; ++$c) {
                $counterBlock[15 - $c - 4] = self::urs(($b + 1) / 0x100000000 - 1, $c * 8) & 0xff;
            }

            $cipherCntr = self::Cipher($counterBlock, $keySchedule);  // encrypt counter block

        $plaintxtByte = array();
            for ($i = 0; $i < strlen($ciphertext[$b]); ++$i) {
                // -- xor plaintext with ciphered counter byte-by-byte --
          $plaintxtByte[$i] = $cipherCntr[$i] ^ ord(substr($ciphertext[$b], $i, 1));
                $plaintxtByte[$i] = chr($plaintxtByte[$i]);
            }
            $plaintxt[$b] = implode('', $plaintxtByte);
        }

      // join array of blocks into single plaintext string
      $plaintext = implode('', $plaintxt);

        return $plaintext;
    }

    /**
     * AES encryption in CBC mode. This is the standard mode (the CTR methods
     * actually use Rijndael-128 in CTR mode, which - technically - isn't AES).
     * The data length is tucked as a 32-bit unsigned integer (little endian)
     * after the ciphertext. It supports AES-128, AES-192 and AES-256.
     *
     * @since 3.0.1
     *
     * @author Nicholas K. Dionysopoulos
     *
     * @param string $plaintext The data to encrypt
     * @param string $password  Encryption password
     * @param int    $nBits     Encryption key size. Can be 128, 192 or 256
     *
     * @return string The ciphertext
     */
    public static function AESEncryptCBC($plaintext, $password, $nBits = 128)
    {
        if (!($nBits == 128 || $nBits == 192 || $nBits == 256)) {
            return false;
        }  // standard allows 128/192/256 bit keys
        if (!function_exists('mcrypt_module_open')) {
            return false;
        }

            // Try to fetch cached key/iv or create them if they do not exist
        $lookupKey = $password.'-'.$nBits;
        if (array_key_exists($lookupKey, self::$passwords)) {
            $key = self::$passwords[$lookupKey]['key'];
            $iv = self::$passwords[$lookupKey]['iv'];
        } else {
            // use AES itself to encrypt password to get cipher key (using plain password as source for
            // key expansion) - gives us well encrypted key
            $nBytes = $nBits / 8;  // no bytes in key
            $pwBytes = array();
            for ($i = 0; $i < $nBytes; ++$i) {
                $pwBytes[$i] = ord(substr($password, $i, 1)) & 0xff;
            }
            $key = self::Cipher($pwBytes, self::KeyExpansion($pwBytes));
            $key = array_merge($key, array_slice($key, 0, $nBytes - 16));  // expand key to 16/24/32 bytes long
            $newKey = '';
            foreach ($key as $int) {
                $newKey .= chr($int);
            }
            $key = $newKey;

            // Create an Initialization Vector (IV) based on the password, using the same technique as for the key
            $nBytes = 16;  // AES uses a 128 -bit (16 byte) block size, hence the IV size is always 16 bytes
            $pwBytes = array();
            for ($i = 0; $i < $nBytes; ++$i) {
                $pwBytes[$i] = ord(substr($password, $i, 1)) & 0xff;
            }
            $iv = self::Cipher($pwBytes, self::KeyExpansion($pwBytes));
            $newIV = '';
            foreach ($iv as $int) {
                $newIV .= chr($int);
            }
            $iv = $newIV;

            self::$passwords[$lookupKey]['key'] = $key;
            self::$passwords[$lookupKey]['iv'] = $iv;
        }

        $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
        mcrypt_generic_init($td, $key, $iv);
        $ciphertext = mcrypt_generic($td, $plaintext);
        mcrypt_generic_deinit($td);

        $ciphertext .= pack('V', strlen($plaintext));

        return $ciphertext;
    }

    /**
     * AES decryption in CBC mode. This is the standard mode (the CTR methods
     * actually use Rijndael-128 in CTR mode, which - technically - isn't AES).
     *
     * Supports AES-128, AES-192 and AES-256. It supposes that the last 4 bytes
     * contained a little-endian unsigned long integer representing the unpadded
     * data length.
     *
     * @since 3.0.1
     *
     * @author Nicholas K. Dionysopoulos
     *
     * @param string $ciphertext The data to encrypt
     * @param string $password   Encryption password
     * @param int    $nBits      Encryption key size. Can be 128, 192 or 256
     *
     * @return string The plaintext
     */
    public static function AESDecryptCBC($ciphertext, $password, $nBits = 128)
    {
        if (!($nBits == 128 || $nBits == 192 || $nBits == 256)) {
            return false;
        }  // standard allows 128/192/256 bit keys
        if (!function_exists('mcrypt_module_open')) {
            return false;
        }

        // Try to fetch cached key/iv or create them if they do not exist
        $lookupKey = $password.'-'.$nBits;
        if (array_key_exists($lookupKey, self::$passwords)) {
            $key = self::$passwords[$lookupKey]['key'];
            $iv = self::$passwords[$lookupKey]['iv'];
        } else {
            // use AES itself to encrypt password to get cipher key (using plain password as source for
            // key expansion) - gives us well encrypted key
            $nBytes = $nBits / 8;  // no bytes in key
            $pwBytes = array();
            for ($i = 0; $i < $nBytes; ++$i) {
                $pwBytes[$i] = ord(substr($password, $i, 1)) & 0xff;
            }
            $key = self::Cipher($pwBytes, self::KeyExpansion($pwBytes));
            $key = array_merge($key, array_slice($key, 0, $nBytes - 16));  // expand key to 16/24/32 bytes long
            $newKey = '';
            foreach ($key as $int) {
                $newKey .= chr($int);
            }
            $key = $newKey;

            // Create an Initialization Vector (IV) based on the password, using the same technique as for the key
            $nBytes = 16;  // AES uses a 128 -bit (16 byte) block size, hence the IV size is always 16 bytes
            $pwBytes = array();
            for ($i = 0; $i < $nBytes; ++$i) {
                $pwBytes[$i] = ord(substr($password, $i, 1)) & 0xff;
            }
            $iv = self::Cipher($pwBytes, self::KeyExpansion($pwBytes));
            $newIV = '';
            foreach ($iv as $int) {
                $newIV .= chr($int);
            }
            $iv = $newIV;

            self::$passwords[$lookupKey]['key'] = $key;
            self::$passwords[$lookupKey]['iv'] = $iv;
        }

        // Read the data size
        $data_size = unpack('V', substr($ciphertext, -4));

        // Decrypt
        $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
        mcrypt_generic_init($td, $key, $iv);
        $plaintext = mdecrypt_generic($td, substr($ciphertext, 0, -4));
        mcrypt_generic_deinit($td);

        // Trim padding, if necessary
        if (strlen($plaintext) > $data_size) {
            $plaintext = substr($plaintext, 0, $data_size);
        }

        return $plaintext;
    }
}
components/com_jce/helpers/plugins.json000060400000022627152453623450014364 0ustar00{
    "article": {
        "title": "WF_ARTICLE_TITLE",
        "description": "WF_ARTICLE_DESC",
        "icon": "readmore,pagebreak",
        "editable": 1,
        "row": 4,
        "core": 1
    },
    "anchor": {
        "title": "WF_ANCHOR_TITLE",
        "description": "WF_ANCHOR_DESC",
        "core": 1,
        "icon": "anchor",
        "row": 4,
        "editable": 0
    },
    "attributes": {
        "title": "WF_ATTRIBUTES_TITLE",
        "description": "WF_ATTRIBUTES_DESC",
        "icon": "attribs",
        "editable": 0,
        "row": 4,
        "core": 1
    },
    "autosave": {
        "title": "WF_AUTOSAVE_TITLE",
        "description": "WF_AUTOSAVE_DESC",
        "icon": "autosave",
        "editable": 1,
        "row": 4,
        "core": 1
    },
    "browser": {
        "title": "WF_BROWSER_TITLE",
        "description": "WF_BROWSER_DESC",
        "icon": "",
        "editable": 1,
        "row": 0,
        "core": 1,
        "checksum": "${checksum:browser}"
    },
    "charmap": {
        "title": "WF_CHARMAP_TITLE",
        "description": "WF_CHARMAP_DESC",
        "icon": "charmap",
        "editable": 1,
        "row": 2,
        "core": 1
    },
    "cleanup": {
        "title": "WF_CLEANUP_TITLE",
        "description": "WF_CLEANUP_DESC",
        "icon": "cleanup",
        "editable": 0,
        "row": 1,
        "core": 1
    },
    "clipboard": {
        "title": "WF_CLIPBOARD_TITLE",
        "description": "WF_CLIPBOARD_DESC",
        "icon": "cut,copy,paste,pastetext",
        "editable": 1,
        "row": 2,
        "core": 1
    },
    "code": {
        "title": "WF_CODE_TITLE",
        "description": "WF_CODE_DESC",
        "icon": "",
        "editable": 0,
        "row": 0,
        "core": 1
    },
    "colorpicker": {
        "title": "WF_COLORPICKER_TITLE",
        "description": "WF_COLORPICKER_DESC",
        "icon": "",
        "editable": 0,
        "row": 0,
        "core": 1,
        "checksum": "${checksum:colorpicker}"
    },
    "contextmenu": {
        "title": "WF_CONTEXTMENU_TITLE",
        "description": "WF_CONTEXTMENU_DESC",
        "icon": "",
        "editable": 1,
        "row": 0,
        "core": 1
    },
    "directionality": {
        "title": "WF_DIRECTIONALITY_TITLE",
        "description": "WF_DIRECTIONALITY_DESC",
        "icon": "ltr,rtl",
        "editable": 0,
        "row": 3,
        "core": 1
    },
    "format": {
        "title": "WF_FORMAT_TITLE",
        "description": "WF_FORMAT_DESC",
        "icon": "",
        "editable": 0,
        "row": 0,
        "core": 1,
        "class": "list-box"
    },
    "formatselect": {
        "title": "WF_FORMATSELECT_TITLE",
        "description": "WF_FORMATSELECT_DESC",
        "core": 1,
        "icon": "formatselect",
        "row": 1,
        "editable": 1,
        "class": "list-box"
    },
    "fontcolor": {
        "title": "WF_FONTCOLOR_TITLE",
        "description": "WF_FONTCOLOR_DESC",
        "core": 1,
        "icon": "forecolor,backcolor",
        "row": 2,
        "editable": 1,
        "class": "split-button"
    },
    "fontselect": {
        "title": "WF_FONTSELECT_TITLE",
        "description": "WF_FONTSELECT_DESC",
        "core": 1,
        "icon": "fontselect",
        "row": 2,
        "editable": 1,
        "class": "list-box"
    },
    "fontsizeselect": {
        "title": "WF_FONTSIZESELECT_TITLE",
        "description": "WF_FONTSIZESELECT_DESC",
        "core": 1,
        "icon": "fontsizeselect",
        "row": 2,
        "editable": 1,
        "class": "list-box"
    },
    "fullscreen": {
        "title": "WF_FULLSCREEN_TITLE",
        "description": "WF_FULLSCREEN_DESC",
        "icon": "fullscreen",
        "editable": 0,
        "row": 3,
        "core": 1
    },
    "help": {
        "title": "WF_HELP_TITLE",
        "description": "WF_HELP_DESC",
        "icon": "help",
        "editable": 0,
        "row": 1,
        "core": 1,
        "checksum": "${checksum:help}"
    },
    "imgmanager": {
        "title": "WF_IMGMANAGER_TITLE",
        "description": "WF_IMGMANAGER_DESC",
        "icon": "imgmanager",
        "editable": 1,
        "row": 4,
        "core": 1,
        "checksum": "${checksum:imgmanager}"
    },
    "joomla": {
        "title": "WF_JOOMLABUTTONS_TITLE",
        "description": "WF_JOOMLABUTTONS_DESC",
        "icon": "joomla",
        "editable": 0,
        "row": 4,
        "core": 1,
        "class": "split-button"
    },
    "langcode": {
        "title": "WF_LANGCODE_TITLE",
        "description": "WF_LANGCODE_DESC",
        "icon": "langcode",
        "editable": 0,
        "row": 4,
        "core": 1
    },
    "layer": {
        "title": "WF_LAYER_TITLE",
        "description": "WF_LAYER_DESC",
        "icon": "insertlayer,layerforward,layerbackward,layerabsolute",
        "editable": 0,
        "row": 4,
        "core": 1
    },
    "link": {
        "title": "WF_LINK_TITLE",
        "description": "WF_LINK_DESC",
        "icon": "link",
        "editable": 1,
        "row": 4,
        "core": 1,
        "class": "split-button",
        "checksum": "${checksum:link}"
    },
    "lists": {
        "title": "WF_LISTS_TITLE",
        "description": "WF_LISTS_DESC",
        "icon": "numlist,bullist",
        "editable": 1,
        "row": 2,
        "core": 1,
        "class": "split-button"
    },
    "media": {
        "title": "WF_MEDIA_TITLE",
        "description": "WF_MEDIA_DESC",
        "icon": "",
        "editable": 1,
        "row": 0,
        "core": 1
    },
    "nonbreaking": {
        "title": "WF_NONBREAKING_TITLE",
        "description": "WF_NONBREAKING_DESC",
        "icon": "nonbreaking",
        "editable": 0,
        "row": 4,
        "core": 1
    },
    "noneditable": {
        "title": "WF_NONEDITABLE_TITLE",
        "description": "WF_NONEDITABLE_DESC",
        "icon": "",
        "editable": 0,
        "row": 0,
        "core": 1
    },
    "preview": {
        "title": "WF_PREVIEW_TITLE",
        "description": "WF_PREVIEW_DESC",
        "icon": "",
        "editable": 1,
        "row": 0,
        "core": 1,
        "checksum": "${checksum:preview}"
    },
    "print": {
        "title": "WF_PRINT_TITLE",
        "description": "WF_PRINT_DESC",
        "icon": "print",
        "editable": 0,
        "row": 3,
        "core": 1
    },
    "searchreplace": {
        "title": "WF_SEARCHREPLACE_TITLE",
        "description": "WF_SEARCHREPLACE_DESC",
        "icon": "search",
        "editable": 0,
        "row": 2,
        "core": 1
    },
    "source": {
        "title": "WF_SOURCE_TITLE",
        "description": "WF_SOURCE_DESC",
        "icon": "",
        "editable": 1,
        "row": 0,
        "core": 1
    },
    "spellchecker": {
        "title": "WF_SPELLCHECKER_TITLE",
        "description": "WF_SPELLCHECKER_DESC",
        "icon": "spellchecker",
        "editable": 1,
        "row": 4,
        "core": 1,
        "checksum": "${checksum:spellchecker}"
    },
    "style": {
        "title": "WF_STYLE_TITLE",
        "description": "WF_STYLE_DESC",
        "icon": "style",
        "editable": 0,
        "row": 4,
        "core": 1,
        "checksum": "${checksum:style}"
    },
    "styleselect": {
        "title": "WF_STYLESELECT_TITLE",
        "description": "WF_STYLESELECT_DESC",
        "core": 1,
        "icon": "styleselect",
        "row": 1,
        "editable": 1,
        "class": "list-box"
    },
    "tabfocus": {
        "title": "WF_TABFOCUS_TITLE",
        "description": "WF_TABFOCUS_DESC",
        "icon": "",
        "editable": 0,
        "row": 0,
        "core": 1
    },
    "table": {
        "title": "WF_TABLE_TITLE",
        "description": "WF_TABLE_DESC",
        "icon": "table_insert,delete_table,row_props,cell_props,row_before,row_after,delete_row,col_before,col_after,delete_col,split_cells,merge_cells",
        "editable": 1,
        "row": 3,
        "core": 1,
        "checksum": "${checksum:table}"
    },
    "textcase": {
        "title": "WF_TEXTCASE_TITLE",
        "description": "WF_TEXTCASE_DESC",
        "icon": "textcase",
        "editable": 0,
        "row": 4,
        "core": 1,
        "class": "split-button"
    },
    "visualchars": {
        "title": "WF_VISUALCHARS_TITLE",
        "description": "WF_VISUALCHARS_DESC",
        "icon": "visualchars",
        "editable": 0,
        "row": 4,
        "core": 1
    },
    "wordcount": {
        "title": "WF_WORDCOUNT_TITLE",
        "description": "WF_WORDCOUNT_DESC",
        "icon": "",
        "editable": 0,
        "row": 0,
        "core": 1
    },
    "reference": {
        "title": "WF_REFERENCE_TITLE",
        "description": "WF_REFERENCE_DESC",
        "icon": "cite,q,abbr,acronym,del,ins",
        "editable": 1,
        "row": 4,
        "core": 1
    },
    "kitchensink": {
        "title": "WF_KITCHENSINK_TITLE",
        "description": "WF_KITCHENSINK_DESC",
        "core": 1,
        "icon": "kitchensink",
        "row": 1,
        "editable": 0
    },
    "hr": {
        "title": "WF_HR_TITLE",
        "description": "WF_HR_DESC",
        "core": 1,
        "icon": "hr",
        "row": 3,
        "editable": 0
    },
    "visualblocks": {
        "title": "WF_VISUALBLOCKS_TITLE",
        "description": "WF_VISUALBLOCKS_DESC",
        "core": 1,
        "icon": "visualblocks",
        "row": 4,
        "editable": 1
    },
    "emotions": {
        "title": "WF_EMOTIONS_TITLE",
        "description": "WF_EMOTIONS_DESC",
        "core": 1,
        "icon": "emotions",
        "row": 4,
        "editable": 1,
        "class": "split-button"
    }
}components/com_jce/helpers/commands.json000060400000007523152453623450014502 0ustar00{
    "undo": {
        "title": "WF_UNDO_TITLE",
        "description": "WF_UNDO_DESC",
        "core": 1,
        "icon": "undo",
        "row": 1,
        "editable": 0
    },
    "redo": {
        "title": "WF_REDO_TITLE",
        "description": "WF_REDO_DESC",
        "core": 1,
        "icon": "redo",
        "row": 1,
        "editable": 0
    },
    "bold": {
        "title": "WF_BOLD_TITLE",
        "description": "WF_BOLD_DESC",
        "core": 1,
        "icon": "bold",
        "row": 1,
        "editable": 0
    },
    "italic": {
        "title": "WF_ITALIC_TITLE",
        "description": "WF_ITALIC_DESC",
        "core": 1,
        "icon": "italic",
        "row": 1,
        "editable": 0
    },
    "underline": {
        "title": "WF_UNDERLINE_TITLE",
        "description": "WF_UNDERLINE_DESC",
        "core": 1,
        "icon": "underline",
        "row": 1,
        "editable": 0
    },
    "strikethrough": {
        "title": "WF_STRIKETHROUGH_TITLE",
        "description": "WF_STRIKETHROUGH_DESC",
        "core": 1,
        "icon": "strikethrough",
        "row": 1,
        "editable": 0
    },
    "justifyfull": {
        "title": "WF_JUSTIFYFULL_TITLE",
        "description": "WF_JUSTIFYFULL_DESC",
        "core": 1,
        "icon": "justifyfull",
        "row": 1,
        "editable": 0
    },
    "justifycenter": {
        "title": "WF_JUSTIFYCENTER_TITLE",
        "description": "WF_JUSTIFYCENTER_DESC",
        "core": 1,
        "icon": "justifycenter",
        "row": 1,
        "editable": 0
    },
    "justifyleft": {
        "title": "WF_JUSTIFYLEFT_TITLE",
        "description": "WF_JUSTIFYLEFT_DESC",
        "core": 1,
        "icon": "justifyleft",
        "row": 1,
        "editable": 0
    },
    "justifyright": {
        "title": "WF_JUSTIFYRIGHT_TITLE",
        "description": "WF_JUSTIFYRIGHT_DESC",
        "core": 1,
        "icon": "justifyright",
        "row": 1,
        "editable": 0
    },
    "formatselect": {
        "title": "WF_FORMATSELECT_TITLE",
        "description": "WF_FORMATSELECT_DESC",
        "core": 1,
        "icon": "formatselect",
        "row": 1,
        "editable": 0,
        "class": "list-box"
    },
    "newdocument": {
        "title": "WF_NEWDOCUMENT_TITLE",
        "description": "WF_NEWDOCUMENT_DESC",
        "core": 1,
        "icon": "newdocument",
        "row": 1,
        "editable": 0
    },
    "unlink": {
        "title": "WF_UNLINK_TITLE",
        "description": "WF_UNLINK_DESC",
                "core": 1,
        "icon": "unlink",
        "row": 4,
        "editable": 0
    },
    "indent": {
        "title": "WF_INDENT_TITLE",
        "description": "WF_INDENT_DESC",
        "core": 1,
        "icon": "indent",
        "row": 2,
        "editable": 0
    },
    "outdent": {
        "title": "WF_OUTDENT_TITLE",
        "description": "WF_OUTDENT_DESC",
        "core": 1,
        "icon": "outdent",
        "row": 2,
        "editable": 0
    },
    "blockquote": {
        "title": "WF_BLOCKQUOTE_TITLE",
        "description": "WF_BLOCKQUOTE_DESC",
        "core": 1,
        "icon": "blockquote",
        "row": 1,
        "editable": 0
    },
    "removeformat": {
        "title": "WF_REMOVEFORMAT_TITLE",
        "description": "WF_REMOVEFORMAT_DESC",
        "core": 1,
        "icon": "removeformat",
        "row": 1,
        "editable": 0
    },
    "sub": {
        "title": "WF_SUB_TITLE",
        "description": "WF_SUB_DESC",
        "core": 1,
        "icon": "sub",
        "row": 2,
        "editable": 0
    },
    "sup": {
        "title": "WF_SUP_TITLE",
        "description": "WF_SUP_DESC",
        "core": 1,
        "icon": "sup",
        "row": 2,
        "editable": 0
    },
   	"visualaid": {
        "title": "WF_VISUALAID_TITLE",
        "description": "WF_VISUALAID_DESC",
        "core": 1,
        "icon": "visualaid",
        "row": 4,
        "editable": 0
    }
}components/com_jce/helpers/encrypt.php000060400000010174152453623450014177 0ustar00<?php

/**
 * @copyright Copyright (c)2018 Ryan Demmer
 * @license GNU General Public License version 3, or later
 *
 * @since 2.7
 */
// Protection against direct access
\defined('_JEXEC') or die;

use Defuse\Crypto\Key;
use Defuse\Crypto\Encoding;
use Defuse\Crypto\Crypto;

/**
 * Implements encrypted settings handling features.
 */
class JceEncryptHelper
{
    protected static function generateKey()
    {        
        $keyObject = Key::createNewRandomKey();
        $keyAscii = $keyObject->saveToAsciiSafeString();

        $keyData = Encoding::binToHex($keyAscii);

        $filecontents = "<?php defined('WF_EDITOR') or die(); define('WF_SERVERKEY', '$keyData'); ?>";
        $filename     = JPATH_ADMINISTRATOR . '/components/com_jce/serverkey.php';

        file_put_contents($filename, $filecontents);

        return Key::loadFromAsciiSafeString($keyAscii);
    }

    /**
     * Gets the configured server key, automatically loading the server key storage file
     * if required.
     *
     * @return string
     */
    public static function getKey($legacy = false)
    {
        if (!defined('WF_SERVERKEY')) {
            $filename = JPATH_ADMINISTRATOR . '/components/com_jce/serverkey.php';

            if (is_file($filename)) {
                include_once($filename);
            }
        }

        if (defined('WF_SERVERKEY')) {
            // return key as string
            if ($legacy) {
                $key = base64_decode(WF_SERVERKEY);
                return $key;
            }

            try {
                $keyAscii = Encoding::hexToBin(WF_SERVERKEY);
                $key = Key::loadFromAsciiSafeString($keyAscii);
            } catch(Defuse\Crypto\Exception\BadFormatException $ex) {
                return "";
            }

            return $key;
        }

        return self::generateKey();
    }

    /**
     * Encrypts the settings using the automatically detected preferred algorithm.
     *
     * @param $settingsINI string The raw settings INI string
     *
     * @return string The encrypted data to store in the database
     */
    public static function encrypt($data, $key = null)
    {
        // Do we have a non-empty key to begin with?
        if (empty($key)) {
            $key = self::getKey();
        }

        if (empty($key)) {
            return $data;
        }

        $encrypted = Crypto::encrypt($data, $key);

        // base64encode
        $encoded = base64_encode($encrypted);

        // add marker
        $data = '###DEFUSE###' . $encoded;

        return $data;
    }

    /**
     * Decrypts the encrypted settings and returns the plaintext INI string.
     *
     * @param $encrypted string The encrypted data
     *
     * @return string The decrypted data
     */
    public static function decrypt($encrypted, $key = null)
    {
        $mode = substr($encrypted, 0, 12);

        if ($mode == '###AES128###' || $mode == '###CTR128###') {
            require_once(__DIR__ . '/encrypt/aes.php');
            
            $encrypted = substr($encrypted, 12);

            $key = self::getKey(true);

            switch ($mode) {
                case '###AES128###':
                    $encrypted = base64_decode($encrypted);
                    $decrypted = @WFUtilEncrypt::AESDecryptCBC($encrypted, $key, 128);
                    break;
    
                case '###CTR128###':
                    $decrypted = @WFUtilEncrypt::AESDecryptCtr($encrypted, $key, 128);
                    break;
            }

            return rtrim($decrypted, "\0");
        }

        if ($mode == '###DEFUSE###') {
            $key = self::getKey();

            if (empty($key)) {
                return $encrypted;
            }

            //get encrypted string without marker
            $encrypted = substr($encrypted, 12);
            
            // base64decode
            $decoded = base64_decode($encrypted);

            try {
                $decrypted = Crypto::decrypt($decoded, $key);
            } catch (Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException $ex) {
                return $encrypted;
            }

            return rtrim($decrypted, "\0");
        }

        return $encrypted;
    }
}
components/com_jce/helpers/admin.php000060400000003552152453623450013605 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2023 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\HTML\Helpers\Sidebar;

/**
 * Admin helper.
 *
 * @since       3.0
 */
class JceHelperAdmin
{
    /**
     * Configure the Submenu links.
     *
     * @param string $vName The view name
     *
     * @since   3.0
     */
    public static function addSubmenu($vName)
    {
        $uri = (string) Uri::getInstance();
        $return = urlencode(base64_encode($uri));

        $user = Factory::getUser();

        Sidebar::addEntry(
            Text::_('WF_CPANEL'),
            'index.php?option=com_jce&view=cpanel',
            $vName == 'cpanel'
        );

        $views = array(
            'config' => 'WF_CONFIGURATION',
            'profiles' => 'WF_PROFILES',
            'browser' => 'WF_CPANEL_BROWSER',
            'mediabox' => 'WF_MEDIABOX',
        );

        foreach ($views as $key => $label) {

            if ($key === "mediabox" && !PluginHelper::isEnabled('system', 'jcemediabox')) {
                continue;
            }

            if ($user->authorise('jce.' . $key, 'com_jce')) {
                Sidebar::addEntry(
                    Text::_($label),
                    'index.php?option=com_jce&view=' . $key,
                    $vName == $key
                );
            }
        }
    }

    public static function getTemplateStylesheets()
    {
        require_once JPATH_SITE . '/components/com_jce/editor/libraries/classes/editor.php';

        return WFEditor::getTemplateStyleSheets();
    }
}
components/com_jce/helpers/profiles.php000060400000027666152453623450014354 0ustar00<?php

/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2023 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
\defined('_JEXEC') or die;

use Joomla\CMS\Access\Access;
use Joomla\CMS\Factory;
use Joomla\Filesystem\File;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Table\Table;
use Joomla\String\StringHelper;

abstract class JceProfilesHelper
{
    /**
     * Create the Profiles table.
     *
     * @return bool
     */
    public static function createProfilesTable()
    {
        $app = Factory::getApplication();

        $db = Factory::getDBO();
        $driver = strtolower($db->name);

        switch ($driver) {
            default:
            case 'mysql':
            case 'mysqli':
                $driver = 'mysql';
                break;
            case 'sqlsrv':
            case 'sqlazure':
            case 'sqlzure':
                $driver = 'sqlsrv';
                break;
            case 'postgresql':
            case 'pgsql':
                $driver = 'postgresql';
                break;
        }

        $file = JPATH_ADMINISTRATOR . '/components/com_jce/sql/' . $driver . '.sql';
        $error = null;

        if (is_file($file)) {
            $query = file_get_contents($file);

            if ($query) {
                // replace prefix
                $query = $db->replacePrefix((string) $query);

                // set query
                $db->setQuery(trim($query));

                if (!$db->execute()) {
                    $app->enqueueMessage(Text::_('WF_INSTALL_TABLE_PROFILES_ERROR') . $db->stdErr(), 'error');

                    return false;
                } else {
                    return true;
                }
            } else {
                $error = 'NO SQL QUERY';
            }
        } else {
            $error = 'SQL FILE MISSING';
        }

        $app->enqueueMessage(Text::_('WF_INSTALL_TABLE_PROFILES_ERROR') . !is_null($error) ? ' - ' . $error : '', 'error');

        return false;
    }

    /**
     * Install Profiles.
     *
     * @return bool
     *
     * @param object $install[optional]
     */
    public static function installProfiles()
    {
        $app = Factory::getApplication();
        $db = Factory::getDBO();

        if (self::createProfilesTable()) {
            self::buildCountQuery();

            $profiles = array('Default' => false, 'Front End' => false);

            // No Profiles table data
            if (!$db->loadResult()) {
                $xml = JPATH_ADMINISTRATOR . '/components/com_jce/models/profiles.xml';

                if (is_file($xml)) {
                    if (!self::processImport($xml)) {
                        $app->enqueueMessage(Text::_('WF_INSTALL_PROFILES_ERROR'), 'error');

                        return false;
                    }
                } else {
                    $app->enqueueMessage(Text::_('WF_INSTALL_PROFILES_NOFILE_ERROR'), 'error');

                    return false;
                }
            }

            return true;
        }

        return false;
    }

    private static function buildCountQuery($name = '')
    {
        $db = Factory::getDBO();

        $query = $db->getQuery(true);

        // check for name
        $query->select('COUNT(id)')->from('#__wf_profiles');

        if ($name) {
            $query->where('name = ' . $db->Quote($name));
        }

        $db->setQuery($query);
    }

    public static function getDefaultProfile()
    {
        $mainframe = Factory::getApplication();
        $file = JPATH_ADMINISTRATOR . '/components/com_jce/models/profiles.xml';

        $xml = simplexml_load_file($file);

        Table::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_jce/tables');

        if ($xml) {
            foreach ($xml->profiles->children() as $profile) {
                if ($profile->attributes()->default) {
                    $table = Table::getInstance('Profiles', 'JceTable');

                    foreach ($profile->children() as $item) {
                        switch ($item->getName()) {
                            case 'rows':
                                $table->rows = (string) $item;
                                break;
                            case 'plugins':
                                $table->plugins = (string) $item;
                                break;
                            default:
                                $key = $item->getName();
                                $table->$key = (string) $item;

                                break;
                        }
                    }

                    // reset name and description
                    $table->name = '';
                    $table->description = '';

                    return $table;
                }
            }
        }

        return null;
    }

    /**
     * Check whether a table exists.
     *
     * @return bool
     *
     * @param string $table Table name
     */
    public static function checkTable()
    {
        $db = Factory::getDBO();

        $tables = $db->getTableList();

        if (!empty($tables)) {
            // swap array values with keys, convert to lowercase and return array keys as values
            $tables = array_keys(array_change_key_case(array_flip($tables)));
            $app = Factory::getApplication();
            $match = str_replace('#__', strtolower($app->getCfg('dbprefix', '')), '#__wf_profiles');

            return in_array($match, $tables);
        }

        // try with query
        self::buildCountQuery();

        return $db->execute();
    }

    /**
     * Check table contents.
     *
     * @return int
     *
     * @param string $table Table name
     */
    public static function checkTableContents()
    {
        $db = Factory::getDBO();

        self::buildCountQuery();

        return $db->loadResult();
    }

    public static function getUserGroups($area)
    {
        $db = Factory::getDBO();

        $query = $db->getQuery(true);

        $query->select('id')->from('#__usergroups');

        $db->setQuery($query);
        $groups = $db->loadColumn();

        $front = array();
        $back = array();

        foreach ($groups as $group) {
            $create = Access::checkGroup($group, 'core.create');
            $admin = Access::checkGroup($group, 'core.login.admin');
            $super = Access::checkGroup($group, 'core.admin');

            if ($super) {
                $back[] = $group;
            } else {
                // group can create
                if ($create) {
                    // group has admin access
                    if ($admin) {
                        $back[] = $group;
                    } else {
                        $front[] = $group;
                    }
                }
            }
        }

        switch ($area) {
            case 0:
                return array_merge($front, $back);
                break;
            case 1:
                return $front;
                break;
            case 2:
                return $back;
                break;
        }

        return array();
    }

    /**
     * Process import data from XML file.
     *
     * @param object $file    XML file
     * @param bool   $install Can be used by the package installer
     */
    public static function processImport($file)
    {
        $n = 0;

        $app = Factory::getApplication();

        // load data from file
        $data = file_get_contents($file);
        // format params data as CDATA
        $data = preg_replace('#<params>{(.+?)}<\/params>#', '<params><![CDATA[{$1}]]></params>', $data);
        // load processed string
        $xml = simplexml_load_string($data);

        $user = Factory::getUser();
        $date = Factory::getDate();

        Table::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_jce/tables');

        $language = Factory::getLanguage();
        $language->load('com_jce', JPATH_ADMINISTRATOR, null, true);

        if ($xml) {
            foreach ($xml->profiles->children() as $profile) {
                $table = Table::getInstance('Profiles', 'JceTable');

                foreach ($profile->children() as $item) {
                    $key = $item->getName();
                    $value = (string) $item;

                    switch ($key) {
                        case 'name':
                            // only if name set and table name not set
                            if ($value) {
                                // create name copy if exists
                                while ($table->load(array('name' => $value))) {
                                    if ($value === $table->name) {
                                        $value = StringHelper::increment($value);
                                    }
                                }
                            }
                            break;

                        case 'description':
                            $value = Text::_($value);
                            break;
                        case 'types':

                            if ($value === "") {
                                $area = (string) $profile->area[0] || 0;
                                $groups = self::getUserGroups($area);
                                $value = implode(',', array_unique($groups));
                            }
                            break;
                        case 'users':
                            break;
                        case 'area':
                            if ($value === "") {
                                $value = '0';
                            }

                            break;
                        case 'components':
                            break;
                        case 'params':
                            if (!empty($value)) {
                                $data = json_decode($value, true);

                                if (is_array($data)) {
                                    array_walk($data, function (&$param, $key) {
                                        if (is_string($param) && WFUtility::isJson($param)) {
                                            $param = json_decode($param, true);
                                        }
                                    });
                                }

                                $value = json_encode($data);
                            }

                            if (empty($value)) {
                                $value = "{}";
                            }

                            break;
                        case 'rows':
                            break;
                        case 'plugins':
                            break;
                        case 'area':
                        case 'published':
                        case 'ordering':
                            $value = (int) $value;
                            break;
                    }

                    $table->$key = $value;
                }

                // set new id
                $table->id = 0;

                // set checked_out
                $table->checked_out = $user->get('id');

                // set checked_out_time
                $table->checked_out_time = $date->toSQL();

                if (!$table->store()) {
                    $app->enqueueMessage($table->getError(), 'error');
                    return false;
                }

                // check-in
                $table->checkin();

                ++$n;
            }
        }

        return $n;
    }

    /**
     * CDATA encode a parameter if it contains & < > characters, eg: <![CDATA[index.php?option=com_content&view=article&id=1]]>.
     *
     * @param object $param
     *
     * @return CDATA encoded parameter or parameter
     */
    public static function encodeData($data)
    {
        if (preg_match('/[<>&]/', $data)) {
            $data = '<![CDATA[' . $data . ']]>';
        }

        $data = preg_replace('/"/', '\"', $data);

        return $data;
    }
}
components/com_jce/helpers/plugins.php000060400000034200152453623450014170 0ustar00<?php

/**
 * @copyright     Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license       GNU/GPL 2 or later - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * JCE is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses
 */
\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\Filesystem\File;
use Joomla\Filesystem\Folder;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\CMS\Table\Table;
use Joomla\CMS\Uri\Uri;

require_once JPATH_ADMINISTRATOR . '/components/com_jce/includes/base.php';

abstract class JcePluginsHelper
{
    public static function getCommands()
    {
        $data = file_get_contents(__DIR__ . '/commands.json');
        $json = json_decode($data);

        $commands = array();

        if ($json) {
            foreach ($json as $name => $attribs) {
                $attribs->type = 'command';
                $commands[$name] = $attribs;
            }
        }

        return $commands;
    }

    public static function isValidPlugin($name)
    {
        $plugins = self::getPlugins();
        return isset($plugins[$name]);
    }

    /**
     * Get a list of all code, pro and installed plugins.
     *
     * @return array $plugins
     */
    public static function getPlugins()
    {
        $app = Factory::getApplication();
        $language = Factory::getLanguage();

        static $plugins;

        if (!isset($plugins)) {
            $plugins = array();

            // get core json
            $core = file_get_contents(__DIR__ . '/plugins.json');
            // decode to object
            $data = json_decode($core);

            if ($data) {
                foreach ($data as $name => $attribs) {
                    // skip if the plugin file is missing
                    if (!is_file(WF_EDITOR_MEDIA . '/tinymce/plugins/' . $name . '/plugin.js')) {
                        continue;
                    }

                    // update attributes
                    $attribs->type = 'plugin';

                    $attribs->path = WF_EDITOR_PLUGINS . '/' . $name;
                    $attribs->manifest = WF_EDITOR_PLUGINS . '/' . $name . '/' . $name . '.xml';

                    $attribs->image = '';

                    if (!isset($attribs->class)) {
                        $attribs->class = '';
                    }

                    // compatability
                    $attribs->name = $name;
                    // pass to array
                    $plugins[$name] = $attribs;
                }
            }

            // get plugins external sources via event, eg: JCE Pro System Plugin
            $app->triggerEvent('onWfPluginsHelperGetPlugins', array(&$plugins));

            // get all installed plugins
            $installed = PluginHelper::getPlugin('jce');

            foreach ($installed as $item) {
                // check for delimiter, only load editor plugins
                if (!preg_match('/^editor[-_]/', $item->name)) {
                    continue;
                }

                // create path
                $path = JPATH_PLUGINS . '/jce/' . $item->name;

                // load language
                $language->load('plg_jce_' . $item->name, JPATH_ADMINISTRATOR);
                $language->load('plg_jce_' . $item->name, $path);

                // get xml file
                $file = $path . '/' . $item->name . '.xml';

                if (is_file($file)) {
                    // load xml data
                    $xml = simplexml_load_file($file);

                    if ($xml) {
                        // check xml file is valid
                        if ((string) $xml->getName() != 'extension') {
                            continue;
                        }

                        // remove "editor-" or "editor_"
                        $name = substr($item->name, 7);

                        $attribs = new StdClass();
                        $attribs->name = $name;
                        $attribs->manifest = $file;

                        $params = $xml->fields;

                        $attribs->title = (string) $xml->name;
                        $attribs->icon = (string) $xml->icon;
                        $attribs->editable = 0;

                        // set default values
                        $attribs->image = '';
                        $attribs->class = '';

                        if ($xml->icon->attributes()) {
                            foreach ($xml->icon->attributes() as $key => $value) {
                                $attribs->$key = $value;
                            }
                        }

                        if ($attribs->image) {
                            $attribs->image = Uri::root(true) . '/' . $attribs->image;
                        }

                        // can't be editable without parameters
                        if ($params && count($params->children())) {
                            $attribs->editable = 1;
                        }

                        $row = (int) $xml->attributes()->row;

                        // set row from passed in value or 0
                        $attribs->row = $row;

                        // if an icon is set and no row, default to 4
                        if (!empty($attribs->icon) && !$row) {
                            $attribs->row = 4;
                        }

                        $attribs->description = (string) $xml->description;
                        $attribs->core = 0;

                        // relative path
                        $attribs->path = $path;
                        $attribs->url = 'plugins/jce/' . $item->name;

                        // get snake-case name to check for media folder
                        $snake_case_name = str_replace('-', '_', $item->name);

                        // url in Joomla media folder
                        if (is_dir(JPATH_SITE . '/media/plg_jce_' . $snake_case_name)) {
                            $attribs->url = 'media/plg_jce_' . $snake_case_name;
                        }

                        $attribs->type = 'plugin';

                        $plugins[$name] = $attribs;
                    }
                }
            }
        }

        return $plugins;
    }

    /**
     * Get installed extensions.
     *
     * @return array $extensions
     */
    public static function getExtensions($type = '')
    {
        $language = Factory::getLanguage();

        static $extensions;

        if (empty($extensions)) {
            $extensions = array();

            // recursively get all extension files
            $files = Folder::files(WF_EDITOR_EXTENSIONS, '\.xml$', true, true);

            foreach ($files as $file) {
                $name = basename($file, '.xml');

                $object = new StdClass();
                $object->folder = basename(dirname($file));
                $object->manifest = $file;
                $object->plugins = array();
                $object->name = $name;
                $object->title = 'WF_' . strtoupper($object->folder) . '_' . strtoupper($name) . '_TITLE';
                $object->description = '';
                $object->id = $object->folder . '.' . $object->name;
                $object->extension = $object->name;
                // set as non-core by default
                $object->core = 0;
                // set as not editable by default
                $object->editable = 0;
                // set type
                $object->type = $object->folder;

                $extensions[$object->type][] = $object;
            }

            // get all installed plugins
            $installed = PluginHelper::getPlugin('jce');

            if (!empty($installed)) {
                foreach ($installed as $p) {
                    // check for delimiter to remove legacy extensions
                    if (!preg_match('/[-_]/', $p->name)) {
                        continue;
                    }

                    // only load "extensions", not editor plugins
                    if (preg_match('/^editor[-_]/', $p->name)) {
                        continue;
                    }

                    // set path
                    $p->path = JPATH_PLUGINS . '/jce/' . $p->name;

                    $parts = preg_split('/[-_]/', $p->name, 2);

                    // get type and name
                    $p->folder = $parts[0];
                    $p->extension = $parts[1];

                    // plugin manifest, eg: filesystem-joomla.xml
                    $p->manifest = $p->path . '/' . $p->name . '.xml';

                    $p->plugins = array();
                    $p->description = '';

                    // load language
                    $language->load('plg_jce_' . $p->name, JPATH_ADMINISTRATOR);
                    $language->load('plg_jce_' . $p->name, $p->path);

                    list($p->type, $p->name) = preg_split('/[-_]/', $p->name, 2);

                    // create title from name parts, eg: plg_jce_filesystem_joomla
                    $p->title = 'plg_jce_' . $p->type . '_' . $p->name;

                    // create plugin id, eg: filesystem.joomla
                    $p->id = $p->type . '.' . $p->name;

                    // not core
                    $p->core = 0;

                    // set as not editable by default
                    $p->editable = 0;

                    $extensions[$p->type][] = $p;
                }
            }
        }

        if ($type && isset($extensions[$type])) {
            return $extensions[$type];
        }

        return $extensions;
    }

    public static function addToProfile($id, $plugin)
    {
        Table::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_jce/tables');

        // Add to Default Group
        $profile = Table::getInstance('Profiles', 'JceTable');

        if ($profile->load($id)) {
            // Add to plugins list
            $plugins = explode(',', $profile->plugins);

            if (!in_array($plugin->name, $plugins)) {
                $plugins[] = $plugin->name;
            }

            $profile->plugins = implode(',', $plugins);

            if ($plugin->icon) {
                if (in_array($plugin->name, preg_split('/[;,]+/', $profile->rows)) === false) {
                    // get rows as array
                    $rows = explode(';', $profile->rows);

                    if (count($rows)) {
                        // get key (row number)
                        $key = count($rows) - 1;
                        // get row contents as array
                        $row = explode(',', $rows[$key]);
                        // add plugin name to end of row
                        $row[] = $plugin->name;
                        // add row data back to rows array
                        $rows[$key] = implode(',', $row);

                        $profile->rows = implode(';', $rows);
                    }
                }
            }

            if (!$profile->store()) {
                throw new Exception(Text::_('WF_INSTALLER_PLUGIN_PROFILE_ERROR'));
            }
        }

        return true;
    }

    public static function removeFromProfile($id, $plugin)
    {
        Table::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_jce/tables');

        // Add to Default Group
        $profile = Table::getInstance('Profiles', 'JceTable');

        if ($profile->load($id)) {
            // remove from plugins list
            $plugins = explode(',', $profile->plugins);
            $key = array_search($plugin->name, $plugins);

            if ($key) {
                unset($plugins[$key]);
                $profile->plugins = implode(',', array_values($plugins));
            }

            if ($plugin->icon) {
                // check if its in the profile
                if (in_array($plugin->name, preg_split('/[;,]+/', $profile->rows))) {
                    $lists = array();
                    foreach (explode(';', $profile->rows) as $list) {
                        $icons = explode(',', $list);
                        foreach ($icons as $k => $v) {
                            if ($plugin->name == $v) {
                                unset($icons[$k]);
                            }
                        }
                        $lists[] = implode(',', $icons);
                    }
                    $profile->rows = implode(';', $lists);
                }

                if (!$profile->store()) {
                    throw new Exception(Text::sprintf('WF_INSTALLER_REMOVE_FROM_GROUP_ERROR', $plugin->name));
                }
            }
        }

        return true;
    }

    /**
     * Add index.html files to each folder.
     */
    private static function addIndexfiles($path)
    {
        // get the base file
        $file = JPATH_ADMINISTRATOR . '/components/com_jce/index.html';

        if (is_file($file) && is_dir($path)) {
            File::copy($file, $path . '/' . basename($file));

            // admin component
            $folders = Folder::folders($path, '.', true, true);

            foreach ($folders as $folder) {
                File::copy($file, $folder . '/' . basename($file));
            }
        }
    }

    public static function postInstall($route, $plugin, $installer)
    {
        $db = Factory::getDBO();

        // load the plugin and enable
        if (isset($plugin->row) && $plugin->row > 0) {
            $query = $db->getQuery(true);

            $query->select('id')->from('#__wf_profiles')->where('name = ' . $db->Quote('Default') . ' OR id = 1');

            $db->setQuery($query);
            $id = $db->loadResult();

            if ($id) {
                if ($route == 'install') {
                    // add to profile
                    self::addToProfile($id, $plugin);
                } else {
                    // remove from profile
                    self::removeFromProfile($id, $plugin);
                }
            }
        }

        if ($route == 'install') {
            if ($plugin->type == 'extension') {
                $plugin->path = $plugin->path . '/' . $plugin->name;
            }

            // add index.html files
            self::addIndexfiles($plugin->path);
        }

        return true;
    }
}
components/com_jce/helpers/parameter.php000060400000001724152453623450014474 0ustar00<?php

/**
 * @package   	JCE
 * @copyright 	Copyright (c) 2009-2016 Ryan Demmer. All rights reserved.
 * @license   	GNU/GPL 2 or later - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * JCE is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses.
 */

abstract class WFParameterHelper
{
	/**
	 * Convert JSON data to JParameter Object
	 * @param $data JSON data
	 */
	public static function toObject($data) 
	{
		$param = new WFParameter('');
		$param->bind($data);

		return $param->getData();
	}
	
	public static function getComponentParams($key = '', $path = '')
	{
		require_once(JPATH_COMPONENT_ADMINISTRATOR . '/classes/parameter.php');		
		$component = JComponentHelper::getComponent('com_jce');
		
		return new WFParameter($component->params, $path, $key);
	}
}components/com_jce/helpers/browser.php000060400000012370152453623450014176 0ustar00<?php

/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2023 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
\defined('_JEXEC') or die;

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;

JLoader::register('WFApplication', JPATH_ADMINISTRATOR . '/components/com_jce/helpers/browser.php');

abstract class WfBrowserHelper
{
    public static function getBrowserLink($element = null, $mediatype = '', $callback = '', $options = array())
    {
        $options = array_merge($options, array(
            'element' => $element,
            'mediatype' => $mediatype,
            'callback' => $callback,
        ));

        $url = self::getMediaFieldUrl($options);

        return $url;
    }

    public static function getMediaFieldLink($element = null, $mediatype = 'images', $callback = '')
    {
        $url = self::getMediaFieldUrl(array(
            'element' => $element,
            'mediatype' => $mediatype,
            'callback' => $callback,
        ));

        return $url;
    }

    public static function isMediaFieldEnabled()
    {
        static $enabled = null;

        if ($enabled !== null) {
            return $enabled;
        }

        require_once JPATH_SITE . '/components/com_jce/editor/libraries/classes/application.php';

        $wf = WFApplication::getInstance();
        $profile = $wf->getActiveProfile(['plugin' => 'browser']);

        $enabled = $profile ? (bool) $wf->getParam('browser.mediafield_enable', 1) : false;

        return $enabled;
    }

    public static function getMediaFieldUrl($options = array())
    {
        $app = Factory::getApplication();
        $token = Factory::getSession()->getFormToken();

        // get component params to check for media field conversion
        $componentParams = ComponentHelper::getParams('com_jce');

        if (!isset($options['element'])) {
            $options['element'] = null;
        }

        if (!isset($options['mediatype'])) {
            $options['mediatype'] = 'images';
        }

        if (!isset($options['callback'])) {
            $options['callback'] = '';
        }

        if (!isset($options['converted'])) {
            $options['converted'] = false;
        }

        if (!isset($options['mediafolder'])) {
            $options['mediafolder'] = '';
        }

        if (self::isMediaFieldEnabled() === false) {
            return '';
        }

        // get editor instance
        $wf = WFApplication::getInstance();

        // set base url
        $url = 'index.php?option=com_jce&task=plugin.display';

        // add default context
        if (empty($options['context'])) {
            $options['context'] = $wf->getContext();
        }

        // append "caller" plugin
        if (!empty($options['plugin'])) {
            if (strpos($options['plugin'], 'browser') === false) {
                $options['plugin'] = 'browser.' . $options['plugin'];
            }
        } else {
            $options['plugin'] = 'browser';
        }

        $options['standalone'] = 1;
        $options[$token] = 1;
        $options['client'] = $app->getClientId();

        // filter options values
        $options = array_filter($options, function ($value) {
            if (is_array($value)) {
                return !empty($value);
            }

            return $value !== '' && $value !== null;
        });

        $url .= '&' . http_build_query($options);

        return $url;
    }

    public static function getMediaFieldOptions($options = array())
    {
        if (self::isMediaFieldEnabled() === false) {
            return $options;
        }

        $app = Factory::getApplication();

        // get component params to check for media field conversion
        $componentParams = ComponentHelper::getParams('com_jce');

        // merge default options
        $options = array_merge(array(
            'upload' => 0,
            'select_button' => 1,
            'convert' => 0,
            'mediafields' => array(),
        ), $options);

        // get editor instance
        $wf = WFApplication::getInstance();
        $profile = $wf->getActiveProfile(['plugin' => 'browser']);

        // is conversion enabled?
        $options['convert'] = (int) $componentParams->get('replace_media_manager', 1) && (int) $wf->getParam('browser.mediafield_conversion', 1);

        // add default context
        $options['context'] = $wf->getContext();

        // get allowed extensions
        $accept = $wf->getParam('browser.extensions', 'jpg,jpeg,png,gif,mp3,m4a,mp4a,ogg,mp4,mp4v,mpeg,mov,webm,doc,docx,odg,odp,ods,odt,pdf,ppt,pptx,txt,xcf,xls,xlsx,csv,zip,tar,gz');

        $options['accept'] = array_map(function ($value) {
            if ($value[0] != '-') {
                return $value;
            }
        }, explode(',', $accept));

        $options['accept'] = implode(',', array_filter($options['accept']));
        $options['upload'] = (int) $wf->getParam('browser.mediafield_upload', 1);
        $options['select_button'] = (int) $wf->getParam('browser.mediafield_select_button', 1);

        $app->triggerEvent('onWfMediaFieldGetOptions', array(&$options, $profile));

        return $options;
    }
}
components/com_jce/helpers/extension.php000060400000006314152453623450014530 0ustar00<?php

/**
 * @copyright 	Copyright (c) 2009-2017 Ryan Demmer. All rights reserved
 * @license   	GNU/GPL 2 or later - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * JCE is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses
 */
abstract class WFExtensionHelper
{
    protected static $component = array();
    protected static $plugin = array();

    public static function getComponent($id = null, $option = 'com_jce')
    {
        if (!isset(self::$component)) {
            self::$component = array();
        }

        $options = array($option);

        if (isset($id)) {
            $options[] = $id;
        }

        $signature = serialize($options);

        if (!isset(self::$component[$signature])) {
            if (defined('JPATH_PLATFORM')) {
                // get component table
                $component = JTable::getInstance('extension');

                if (!$id) {
                    $id = $component->find(array('type' => 'component', 'element' => $option));
                }

                $component->load($id);
            } else {
                // get component table
                $component = JTable::getInstance('component');

                if ($id) {
                    $component->load($id);
                } else {
                    $component->loadByOption($option);
                }
            }

            self::$component[$signature] = $component;
        }

        return self::$component[$signature];
    }

    public static function getPlugin($id = null, $element = 'jce', $folder = 'editors')
    {
        if (!isset(self::$plugin)) {
            self::$plugin = array();
        }

        $options = array($element, $folder);

        if (isset($id)) {
            $options[] = $id;
        }

        $signature = serialize($options);

        if (!isset(self::$plugin[$signature])) {
            if (defined('JPATH_PLATFORM')) {
                // get component table
                $plugin = JTable::getInstance('extension');

                if (!$id) {
                    $id = $plugin->find(array('type' => 'plugin', 'folder' => $folder, 'element' => $element));
                }

                $plugin->load($id);
                // map extension_id to id
                $plugin->id = $plugin->extension_id;

                // store result
                self::$plugin[$signature] = $plugin;
            } else {
                $plugin = JTable::getInstance('plugin');

                if (!$id) {
                    $db = JFactory::getDBO();
                    $query = 'SELECT id FROM #__plugins'.' WHERE folder = '.$db->Quote($folder);

                    if ($element) {
                        $query .= ' AND element = '.$db->Quote($element);
                    }

                    $db->setQuery($query);
                    $id = $db->loadResult();
                }

                $plugin->load($id);

                // store result
                self::$plugin[$signature] = $plugin;
            }
        }

        return self::$plugin[$signature];
    }
}
components/com_jce/helpers/index.html000060400000000054152453623450013773 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_jce/config.xml000060400000004214152453623450012325 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
    <fieldset name="permissions" label="JCONFIG_PERMISSIONS_LABEL" description="JCONFIG_PERMISSIONS_DESC">
        <field name="rules" type="rules" label="JCONFIG_PERMISSIONS_LABEL" class="inputbox" filter="rules" component="com_jce" section="component" />
    </fieldset>

    <fieldset name="standard" label="WF_PREFERENCES_STANDARD">

        <field name="custom_help" type="radio" default="0" label="WF_HELP_CUSTOM" class="btn-group btn-group-yesno" description="WF_HELP_CUSTOM_DESC">
            <option value="1">JYES</option>
            <option value="0">JNO</option>
        </field>

        <field name="help_url" type="text" size="50" default="" label="WF_HELP_URL" description="WF_HELP_URL_DESC" showon="custom_help:1" />

        <field name="help_method" type="list" default="reference" label="WF_HELP_URL_METHOD" description="WF_HELP_URL_METHOD_DESC" showon="custom_help:1">
            <option value="reference">WF_HELP_URL_KEYREFERENCE</option>
            <option value="sef">WF_HELP_URL_SEF</option>
        </field>

        <field name="help_pattern" type="text" size="50" default="" hint="/$1/$2/$3" label="WF_HELP_PATTERN" description="WF_HELP_PATTERN_DESC" showon="help_method:sef" />

        <field name="feed" type="radio" default="0" label="WF_CPANEL_FEED" description="WF_CPANEL_FEED_DESC" class="btn-group btn-group-yesno">
            <option value="1">WF_OPTION_YES</option>
            <option value="0">WF_OPTION_NO</option>
        </field>

        <field name="feed_limit" type="list" default="2" label="WF_CPANEL_FEED_LIMIT" description="WF_CPANEL_FEED_LIMIT_DESC">
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
            <option value="4">4</option>
            <option value="5">5</option>
        </field>

        <field name="inline_help" type="radio" default="1" label="WF_ADMIN_INLINE_HELP" description="WF_ADMIN_INLINE_HELP_DESC" class="btn-group btn-group-yesno">
            <option value="1">WF_OPTION_YES</option>
            <option value="0">WF_OPTION_NO</option>
        </field>

    </fieldset>
</config>
components/com_jce/jce.xml000060400000005773152453623450011634 0ustar00<?xml version="1.0" encoding="utf-8" ?>
<extension type="component" version="3.10" method="upgrade">
    <name>COM_JCE</name>
    <author>Ryan Demmer</author>
    <creationDate>22-04-2026</creationDate>
    <copyright>Copyright (C) 2006 - 2026 Ryan Demmer. All rights reserved</copyright>
    <license>GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html</license>
    <authorEmail>info@joomlacontenteditor.net</authorEmail>
    <authorUrl>www.joomlacontenteditor.net</authorUrl>
    <version>2.9.99.2</version>
    <description>COM_JCE_XML_DESCRIPTION</description>

    <files folder="components/com_jce">
        <folder>editor</folder>
        <folder>views</folder>
        <file>jce.php</file>
    </files>

    <!-- Component Media -->
    <media folder="media/com_jce" destination="com_jce">
        <folder>admin</folder>
        <folder>editor</folder>
        <folder>site</folder>
    </media>

    <languages folder="language/en-GB">
        <language tag="en-GB">en-GB.com_jce.ini</language>
        
    </languages>

    <!-- SQL query files to execute on installation -->
    <install>
        <sql>
            <file charset="utf8" driver="mysql">sql/mysql.sql</file>
            <file charset="utf8" driver="mysqli">sql/mysql.sql</file>
            <file charset="utf8" driver="sqlsrv">sql/sqlsrv.sql</file>
            <file charset="utf8" driver="sqlzure">sql/sqlsrv.sql</file>
            <file charset="utf8" driver="sqlazure">sql/sqlsrv.sql</file>
            <file charset="utf8" driver="postgresql">sql/postgresql.sql</file>
            <file charset="utf8" driver="pgsql">sql/postgresql.sql</file>
        </sql>
    </install>

    <administration>
        <menu view="cpanel" link="option=com_jce">COM_JCE</menu>

        <submenu>
            <menu view="cpanel" link="option=com_jce&amp;view=cpanel">COM_JCE_MENU_CPANEL</menu>
            <menu view="config" link="option=com_jce&amp;view=config">COM_JCE_MENU_CONFIG</menu>
            <menu view="profiles" link="option=com_jce&amp;view=profiles">COM_JCE_MENU_PROFILES</menu>
            <menu view="profiles" link="option=com_jce&amp;view=browser">COM_JCE_MENU_FILEBROWSER</menu>
        </submenu>

        <files folder="administrator/components/com_jce">
            <folder>controller</folder>
            <folder>helpers</folder>
            <folder>includes</folder>
            <folder>layouts</folder>
            <folder>models</folder>
            <folder>sql</folder>
            <folder>tables</folder>
            <folder>vendor</folder>
            <folder>views</folder>
            <file>access.xml</file>
            <file>config.xml</file>
            <file>controller.php</file>
            <file>index.html</file>
            <file>jce.php</file>
            <file>LICENSE.txt</file>
        </files>

        <languages folder="administrator/language/en-GB">
            <language tag="en-GB">en-GB.com_jce.ini</language>
            <language tag="en-GB">en-GB.com_jce.sys.ini</language>
        </languages>

    </administration>
</extension>
components/com_jce/jce.php000060400000002313152453623450011606 0ustar00<?php
/**
 * @copyright     Copyright (c) 2009-2022 Ryan Demmer. All rights reserved
 * @license       GNU/GPL 3 - http://www.gnu.org/copyleft/gpl.html
 * JCE is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses
 */
\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\MVC\Controller\BaseController;

// define admin base path
define('WF_ADMIN', __DIR__);

$app = Factory::getApplication();

// throw exception for legacy task
if ($app->input->get('task') === 'plugin') {
    throw new Exception('Restricted', 403);
}

$vName = $app->input->get('view');

// fix legacy plugin url
if ($vName == 'editor' && $app->input->get('layout') == 'plugin') {

    if ($app->input->get('plugin')) {
        $app->input->set('task', 'plugin.display');
    }

    $app->input->set('view', '');
}

// constants and autoload
require_once __DIR__ . '/includes/base.php';

$controller = BaseController::getInstance('Jce', array('base_path' => __DIR__));

$controller->execute($app->input->get('task'));
$controller->redirect();components/com_jce/models/forms/styleformat.xml000060400000010156152453623450016044 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
    <fields>
        <fieldset>

            <field name="title" type="text" default="" hint="WF_STYLEFORMAT_TITLE" label="" hiddenLabel="true" />

            <field name="element" type="groupedlist" default="" label="WF_STYLEFORMAT_ELEMENT" description="WF_STYLEFORMAT_ELEMENT_DESC">
                <option value="" selected="selected">WF_OPTION_SELECTED_ELEMENT</option>
                <group label="WF_OPTION_SECTION_ELEMENTS">
                    <option value="section">section</option>
                    <option value="nav">nav</option>
                    <option value="article">article</option>
                    <option value="aside">aside</option>
                    <option value="h1">h1</option>
                    <option value="h2">h2</option>
                    <option value="h3">h3</option>
                    <option value="h4">h4</option>
                    <option value="h5">h5</option>
                    <option value="h6">h6</option>
                    <option value="header">header</option>
                    <option value="footer">footer</option>
                    <option value="address">address</option>
                    <option value="main">main</option>
                </group>
                <group label="WF_OPTION_GROUPING_ELEMENTS">
                    <option value="p">p</option>
                    <option value="pre">pre</option>
                    <option value="blockquote">blockquote</option>
                    <option value="figure">figure</option>
                    <option value="figcaption">figcaption</option>
                    <option value="div">div</option>
                </group>
                <group label="WF_OPTION_TEXT_LEVEL_ELEMENTS">
                    <option value="a">a</option>
                    <option value="em">em</option>
                    <option value="strong">strong</option>
                    <option value="small">small</option>
                    <option value="s">s</option>
                    <option value="cite">cite</option>
                    <option value="q">q</option>
                    <option value="dfn">dfn</option>
                    <option value="abbr">abbr</option>
                    <option value="data">data</option>
                    <option value="time">time</option>
                    <option value="code">code</option>
                    <option value="var">var</option>
                    <option value="samp">samp</option>
                    <option value="kbd">kbd</option>
                    <option value="sub">sub</option>
                    <option value="i">i</option>
                    <option value="b">b</option>
                    <option value="u">u</option>
                    <option value="mark">mark</option>
                    <option value="ruby">ruby</option>
                    <option value="rt">rt</option>
                    <option value="rp">rp</option>
                    <option value="bdi">bdi</option>
                    <option value="bdo">bdo</option>
                    <option value="span">span</option>
                    <option value="wbr">wbr</option>
                </group>
                <group label="WF_OPTION_FORM_ELEMENTS">
                    <option value="form">form</option>
                    <option value="input">input</option>
                    <option value="button">button</option>
                    <option value="fieldset">fieldset</option>
                    <option value="legend">legend</option>
                </group>
            </field>

            <field name="styles" type="text" default="" label="WF_STYLEFORMAT_STYLES" description="WF_STYLEFORMAT_STYLES_DESC" />
            <field name="attributes" type="text" default="" label="WF_STYLEFORMAT_ATTRIBUTES" description="WF_STYLEFORMAT_ATTRIBUTES_DESC" />
            <field name="selector" type="text" default="" label="WF_STYLEFORMAT_SELECTOR" description="WF_STYLEFORMAT_SELECTOR_DESC" />
            <field name="classes" type="text" default="" label="WF_STYLEFORMAT_CLASSES" description="WF_STYLEFORMAT_CLASSES_DESC" />

        </fieldset>

    </fields>
</form>components/com_jce/models/forms/filter_profiles.xml000060400000005167152453623450016671 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset addfieldpath="/administrator/components/com_jce/models/fields" />

	<fields name="filter">
		<field
			name="search"
			type="text"
			label="COM_PLUGINS_FILTER_SEARCH_LABEL"
			description="COM_PLUGINS_SEARCH_IN_TITLE"
			hint="JSEARCH_FILTER"
		/>

		<field
			name="published"
			type="status"
			label="JOPTION_SELECT_PUBLISHED"
			description="JOPTION_SELECT_PUBLISHED_DESC"
			onchange="this.form.submit();"
			filter="0,1"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>

		<field
			name="area"
			type="list"
			label="WF_PROFILES_AREA"
			description="WF_PROFILES_AREA_DESC"
			onchange="this.form.submit();"
			>
			<option value="">WF_PROFILES_AREA_FILTER_SELECT</option>
			<option value="1">WF_PROFILES_AREA_FRONTEND</option>
            <option value="2">WF_PROFILES_AREA_BACKEND</option>
		</field>

		<field
			name="device"
			type="list"
			label="WF_PROFILES_DEVICE"
			description="WF_PROFILES_DEVICE_DESC"
			onchange="this.form.submit();"
			>
			<option value="">WF_PROFILES_DEVICE_FILTER_SELECT</option>
			<option value="phone">WF_PROFILES_DEVICE_PHONE</option>
            <option value="tablet">WF_PROFILES_DEVICE_TABLET</option>
            <option value="desktop">WF_PROFILES_DEVICE_DESKTOP</option>
		</field>

		<field
			name="components"
			type="components"
			label="WF_PROFILES_COMPONENTS"
			description="WF_PROFILES_COMPONENTS_DESC"
			onchange="this.form.submit();"
			>
			<option value="">WF_PROFILES_COMPONENTS_FILTER_SELECT</option>
		</field>

		<field
			name="usergroups"
			type="usergrouplist"
			label="WF_PROFILES_GROUPS"
			description="WF_PROFILES_GROUPS_DESC"
			onchange="this.form.submit();"
			>
			<option value="">WF_PROFILES_GROUPS_FILTER_SELECT</option>
		</field>

	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="folder ASC"
		>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="ordering ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="ordering DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="published ASC">JSTATUS_ASC</option>
			<option value="published DESC">JSTATUS_DESC</option>
			<option value="name ASC">JGLOBAL_TITLE_ASC</option>
			<option value="name DESC">JGLOBAL_TITLE_DESC</option>
			<option value="id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="id DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>components/com_jce/models/forms/config.xml000060400000013465152453623450014746 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
    <fields name="params">
        <fieldset name="config" label="Global Configuration">

            <field name="verify_html" type="radio" default="1" label="WF_PARAM_CLEANUP" description="WF_PARAM_CLEANUP_DESC" class="btn-group btn-group-yesno" filter="integer">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field>

            <field name="sanitize_html" type="radio" default="1" label="WF_PARAM_SANITIZE_HTML" description="WF_PARAM_SANITIZE_HTML_DESC" class="btn-group btn-group-yesno" filter="integer">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field>

            <field name="schema" type="list" default="mixed" label="WF_PARAM_DOCTYPE" description="WF_PARAM_DOCTYPE_DESC">
                <option value="html4">HTML4</option>
                <option value="mixed">WF_PARAM_DOCTYPE_MIXED</option>
                <option value="html5">HTML5</option>
            </field>

            <field name="entity_encoding" type="list" default="raw" label="WF_PARAM_ENTITY_ENCODING" description="WF_PARAM_ENTITY_ENCODING_DESC">
                <option value="raw">UTF-8</option>
                <option value="named">WF_PARAM_NAMED</option>
                <option value="numeric">WF_PARAM_NUMERIC</option>
            </field>

            <field name="keep_nbsp" type="radio" default="1" label="WF_PARAM_KEEP_NBSP" description="WF_PARAM_KEEP_NBSP_DESC" class="btn-group btn-group-yesno" filter="integer">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field>

            <field name="pad_empty_tags" type="radio" default="1" label="WF_PARAM_PAD_EMPTY_TAGS" description="WF_PARAM_PAD_EMPTY_TAGS_DESC" class="btn-group btn-group-yesno" filter="integer">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field>

            <field name="spacer1" type="spacer" hr="true" />

            <field name="forced_root_block" type="list" default="p" label="WF_PARAM_ROOT_BLOCK" description="WF_PARAM_ROOT_BLOCK_DESC">
                <option value="p">WF_OPTION_PARAGRAPH</option>
                <option value="div">WF_OPTION_DIV</option>
                <option value="forced_root_block:p|force_block_newlines:0">WF_OPTION_PARAGRAPH_LINEBREAK</option>
                <option value="forced_root_block:div|force_block_newlines:0">WF_OPTION_DIV_LINEBREAK</option>

                <option value="forced_root_block:0|force_block_newlines:1">WF_OPTION_PARAGRAPH_MIXED</option>
                <option value="0">WF_OPTION_LINEBREAK</option>
            </field>

            <field name="content_style_reset" type="list" default="auto" label="WF_PARAM_EDITOR_STYLE_RESET" description="WF_PARAM_EDITOR_STYLE_RESET_DESC">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
                <option value="auto">WF_OPTION_AUTO</option>
            </field>

            <field name="content_css" type="list" default="1" label="WF_PARAM_EDITOR_GLOBAL_CSS" description="WF_PARAM_EDITOR_GLOBAL_CSS_DESC" filter="integer">
                <option value="0">WF_PARAM_CSS_CUSTOM</option>
                <option value="1">WF_PARAM_CSS_TEMPLATE</option>
                <option value="2">WF_OPTION_DEFAULT</option>
            </field>

            <field name="content_css_custom" type="repeatable" default="" label="WF_PARAM_CSS_CUSTOM" description="WF_PARAM_CSS_CUSTOM_DESC" showon="content_css:0">
                <field type="text" size="50" hiddenLabel="true" hint="eg: templates/$template/css/content.css" />
            </field>

            <!--field name="content_css_custom" type="textarea" rows="2" class="input-xlarge" default="" hint="eg: templates/$template/css/content.css" label="WF_PARAM_CSS_CUSTOM" description="WF_PARAM_CSS_CUSTOM_DESC" showon="content_css:0" /-->
            <field name="body_class" type="text" default="" placeholder="eg: content" label="WF_PARAM_EDITOR_BODY_CLASS" description="WF_PARAM_EDITOR_BODY_CLASS_DESC" />

            <field name="spacer2" type="spacer" hr="true" />

            <field name="compress_javascript" type="radio" default="0" label="WF_PARAM_COMPRESS_JAVASCRIPT" description="WF_PARAM_COMPRESS_JAVASCRIPT_DESC" class="btn-group btn-group-yesno" filter="integer">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field>

            <field name="compress_css" type="radio" default="0" label="WF_PARAM_COMPRESS_CSS" description="WF_PARAM_COMPRESS_CSS_DESC" class="btn-group btn-group-yesno" filter="integer">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field>

            <field name="compress_cache_validation" type="radio" default="1" label="WF_PARAM_COMPRESS_CACHE_VALIDATION" description="WF_PARAM_COMPRESS_CACHE_VALIDATION_DESC" class="btn-group btn-group-yesno" filter="integer">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field>

            <field name="spacer3" type="spacer" hr="true" />

            <field name="use_cookies" type="radio" default="1" label="WF_PARAM_USE_COOKIES" description="WF_PARAM_USE_COOKIES_DESC" class="btn-group btn-group-yesno" filter="integer">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field>

            <field name="custom_config" type="keyvalue" default="" label="WF_PARAM_CUSTOM_CONFIG" description="WF_PARAM_CUSTOM_CONFIG_DESC">
                <field type="text" name="name" label="WF_PROFILES_CUSTOM_KEY" />
                <field type="text" name="value" label="WF_PROFILES_CUSTOM_VALUE" />
            </field>

        </fieldset>
    </fields>
</form>components/com_jce/models/forms/profile.xml000060400000005135152453623450015134 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
    <fields>
        <fieldset name="setup">
            <field name="name" type="text" class="input-xxlarge input-large-text" size="40" label="JGLOBAL_TITLE" description="WF_PROFILES_NAME_DESC" required="true" />
            
            <field name="description" type="text" class="input-xxlarge" label="JGLOBAL_DESCRIPTION" description="WF_PROFILES_DESCRIPTION_DESC" />
            
            <field name="published" type="radio" label="JSTATUS" description="WF_PROFILES_ENABLED_DESC" class="btn-group btn-group-yesno" default="1">
                <option value="1">JPUBLISHED</option>
                <option value="0">JUNPUBLISHED</option>
            </field>

            <field name="ordering" type="Profileordering" label="JFIELD_ORDERING_LABEL" description="JFIELD_ORDERING_DESC"/>

            <field name="id" type="hidden" default="0" />
        </fieldset>
        
        <fieldset name="assignment" addfieldpath="/administrator/components/com_jce/models/fields">
            <field name="area" type="checkboxes" multiple="multiple" class="inline" label="WF_PROFILES_AREA" description="WF_PROFILES_AREA_DESC" checked="1,2">
                <option value="1">WF_PROFILES_AREA_FRONTEND</option>
                <option value="2">WF_PROFILES_AREA_BACKEND</option>
            </field>
            
            <field name="device" type="checkboxes" multiple="multiple" class="inline" label="WF_PROFILES_DEVICE" description="WF_PROFILES_DEVICE_DESC" checked="desktop,tablet,phone">
                <option value="phone">WF_PROFILES_DEVICE_PHONE</option>
                <option value="tablet">WF_PROFILES_DEVICE_TABLET</option>
                <option value="desktop">WF_PROFILES_DEVICE_DESKTOP</option>
            </field>

            <field name="components_select" type="radio" label="WF_PROFILES_COMPONENTS" description="WF_PROFILES_COMPONENTS_DESC" class="extensions-select" default="0">
                <option value="0">WF_PROFILES_COMPONENTS_ALL</option>
                <option value="1">WF_PROFILES_COMPONENTS_SELECT</option>
            </field>

            <field name="components" type="componentslist" multiple="multiple" label="" layout="joomla.form.field.list-fancy-select" />
 
            <field name="types" type="usergrouplist" multiple="multiple" label="WF_PROFILES_GROUPS" description="WF_PROFILES_GROUPS_DESC" layout="joomla.form.field.list-fancy-select" />
            <field name="users" type="users" multiple="multiple" label="WF_PROFILES_USERS" description="WF_PROFILES_USERS_DESC" />

        </fieldset>
    </fields>
    <fields name="config"></fields>
</form>components/com_jce/models/forms/editor.xml000060400000043120152453623450014756 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
    <fields name="editor">
        <fieldset name="editor.features" addfieldpath="/administrator/components/com_categories/models/fields">
            <field name="width" type="text" size="5" default="" placeholder="auto" label="WF_PARAM_EDITOR_WIDTH" description="WF_PARAM_EDITOR_WIDTH_DESC" />
            <field name="height" type="text" size="5" default="" placeholder="auto" label="WF_PARAM_EDITOR_HEIGHT" description="WF_PARAM_EDITOR_HEIGHT_DESC" />
            <field name="toolbar_theme" type="list" default="modern" label="WF_PARAM_EDITOR_TOOLBAR_THEME" description="WF_PARAM_EDITOR_TOOLBAR_THEME_DESC">
                <option value="modern">WF_PARAM_EDITOR_SKIN_RETINA</option>
                <option value="modern.touch">WF_PARAM_EDITOR_SKIN_RETINA_TOUCH</option>
                <option value="modern.dark">WF_PARAM_EDITOR_SKIN_RETINA_DARK</option>
                <option value="default">WF_PARAM_EDITOR_SKIN_CLASSIC</option>
                <option value="default.touch">WF_PARAM_EDITOR_SKIN_CLASSIC_TOUCH</option>
                <option value="o2k7">WF_PARAM_EDITOR_SKIN_OFFICE_BLUE</option>
                <option value="o2k7.silver">WF_PARAM_EDITOR_SKIN_OFFICE_SILVER</option>
                <option value="o2k7.black">WF_PARAM_EDITOR_SKIN_OFFICE_BLACK</option>
            </field>
            <field name="toolbar_align" type="list" default="left" label="WF_PARAM_EDITOR_TOOLBAR_ALIGN" description="WF_PARAM_EDITOR_TOOLBAR_ALIGN_DESC">
                <option value="left">WF_OPTION_LEFT</option>
                <option value="center">WF_OPTION_CENTER</option>
                <option value="right">WF_OPTION_RIGHT</option>
            </field>
            <field name="toolbar_location" type="list" default="top" label="WF_PARAM_EDITOR_TOOLBAR_LOCATION" description="WF_PARAM_EDITOR_TOOLBAR_LOCATION_DESC">
                <option value="top">WF_OPTION_TOP</option>
                <option value="bottom">WF_OPTION_BOTTOM</option>
            </field>
            <field name="statusbar_location" type="list" default="bottom" label="WF_PARAM_EDITOR_STATUSBAR_LOCATION" description="WF_PARAM_EDITOR_STATUSBAR_LOCATION_DESC">
                <option value="top">WF_OPTION_TOP</option>
                <option value="bottom">WF_OPTION_BOTTOM</option>
                <option value="none">JNONE</option>
            </field>
            <field name="path" type="yesno" default="1" label="WF_PARAM_EDITOR_PATH" description="WF_PARAM_EDITOR_PATH_DESC" showon="statusbar_location:top[OR]statusbar_location:bottom">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field>
            <field name="wordcount" type="yesno" default="1" label="WF_PARAM_EDITOR_WORDCOUNT" description="WF_PARAM_EDITOR_WORDCOUNT_DESC" showon="statusbar_location:top[OR]statusbar_location:bottom">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field>
            <field name="resizing" type="list" default="1" label="WF_PARAM_EDITOR_RESIZING" description="WF_PARAM_EDITOR_RESIZING_DESC" showon="statusbar_location:top[OR]statusbar_location:bottom">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field>
            <field name="resize_horizontal" type="yesno" default="1" label="WF_PARAM_EDITOR_RESIZE_HORIZONTAL" description="WF_PARAM_EDITOR_RESIZE_HORIZONTAL_DESC" showon="resizing:1">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field>
            <field name="xtd_buttons" type="yesno" default="1" label="WF_PARAM_EDITOR_XTD_BUTTONS" description="WF_PARAM_EDITOR_XTD_BUTTONS_DESC">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field>
            <field name="active_tab" type="list" default="wysiwyg" label="WF_PARAM_EDITOR_ACTIVE_TAB" description="WF_PARAM_EDITOR_ACTIVE_TAB_DESC">
                <option value="wysiwyg">WF_PARAM_EDITOR_ACTIVE_TAB_WYSIWYG</option>
                <option value="source">WF_PARAM_EDITOR_ACTIVE_TAB_CODE</option>
                <option value="preview">WF_PARAM_EDITOR_ACTIVE_TAB_PREVIEW</option>
            </field>
        </fieldset>
        <fieldset name="editor.setup">
            <field name="convert_urls" type="list" default="relative" label="WF_PARAM_EDITOR_CONVERT_URLS" description="WF_PARAM_EDITOR_CONVERT_URLS_DESC">
                <option value="none">WF_OPTION_NONE</option>
                <option value="relative">WF_OPTION_RELATIVE</option>
                <option value="absolute">WF_OPTION_ABSOLUTE</option>
            </field>
            <field name="verify_html" type="list" default="" label="WF_PARAM_CLEANUP" description="WF_PARAM_EDITOR_PROFILE_CLEANUP_DESC" class="btn-group btn-group-yesno">
                <option value="">WF_OPTION_INHERIT</option>
                <option value="0">JNO</option>
                <option value="1">JYES</option>
            </field>
            <field name="sanitize_html" type="radio" default="1" label="WF_PARAM_SANITIZE_HTML" description="WF_PARAM_EDITOR_PROFILE_SANITIZE_HTML_DESC" class="btn-group btn-group-yesno">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field>
            <field name="schema" type="list" default="" label="WF_PARAM_DOCTYPE" description="WF_PARAM_EDITOR_PROFILE_DOCTYPE_DESC">
                <option value="">WF_OPTION_INHERIT</option>
                <option value="mixed">WF_PARAM_DOCTYPE_MIXED</option>
                <option value="html4">HTML4</option>
                <option value="html5">HTML5</option>
            </field>
        </fieldset>
        <fieldset name="editor.typography">
            <field name="forced_root_block" type="list" default="" label="WF_PARAM_ROOT_BLOCK" description="WF_PARAM_EDITOR_PROFILE_ROOT_BLOCK_DESC">
                <option value="">WF_OPTION_INHERIT</option>
                
                <option value="p">WF_OPTION_PARAGRAPH</option>
                <option value="div">WF_OPTION_DIV</option>
                <option value="forced_root_block:p|force_block_newlines:0">WF_OPTION_PARAGRAPH_LINEBREAK</option>
                <option value="forced_root_block:div|force_block_newlines:0">WF_OPTION_DIV_LINEBREAK</option>
                <option value="forced_root_block:0|force_block_newlines:1">WF_OPTION_PARAGRAPH_MIXED</option>
                <option value="0">WF_OPTION_LINEBREAK</option>
            </field>

            <field name="profile_content_css" type="list" default="2" label="WF_PARAM_EDITOR_PROFILE_CSS" description="WF_PARAM_EDITOR_PROFILE_CSS_DESC">
                <option value="0">WF_PARAM_CSS_ADD</option>
                <option value="1">WF_PARAM_CSS_OVERWRITE</option>
                <option value="2">WF_PARAM_CSS_INHERIT</option>
            </field>

            <field name="profile_content_css_custom" type="repeatable" default="" label="WF_PARAM_CSS_CUSTOM" description="WF_PARAM_CSS_CUSTOM_DESC" showon="profile_content_css:0[OR]profile_content_css:1">
                <field type="text" size="50" hiddenLabel="true" hint="eg: templates/$template/css/content.css" />
            </field>

            <field name="custom_css" type="repeatable" default="" label="WF_PARAM_EDITOR_CUSTOM_CSS" description="WF_PARAM_EDITOR_CUSTOM_CSS_DESC">
                <field type="text" size="50" hiddenLabel="true" />
            </field>
            
            <field name="custom_colors" type="textarea" rows="3" cols="50" default="" label="WF_PARAM_CUSTOM_COLORS" description="WF_PARAM_CUSTOM_COLORS_DESC" placeholder="eg: #CC0000,#FF0000" />
        </fieldset>
        <fieldset name="editor.filesystem">
            <field name="dir" type="filesystempath" default="" size="50" placeholder="images" label="WF_PARAM_DIRECTORY" description="WF_PARAM_DIRECTORY_DESC" />

            <field name="dir_filter" type="repeatable" default="" label="WF_PARAM_DIRECTORY_FILTER" description="WF_PARAM_DIRECTORY_FILTER_DESC">
                <field type="text" size="50" hiddenLabel="true" />
            </field>

            <field name="filesystem" type="filesystem" default="joomla" label="WF_PARAM_FILESYSTEM" description="WF_PARAM_FILESYSTEM_DESC" />

            <field name="max_size" class="input-small" hint="1024" max="" type="uploadmaxsize" step="128" default="" label="WF_PARAM_UPLOAD_SIZE" description="WF_PARAM_UPLOAD_SIZE_DESC" />

            <field name="upload_conflict" type="list" default="overwrite" label="WF_PARAM_UPLOAD_EXISTS" description="WF_PARAM_UPLOAD_EXISTS_DESC">
                <option value="unique">WF_PARAM_UPLOAD_EXISTS_UNIQUE</option>
                <option value="overwrite">WF_PARAM_UPLOAD_EXISTS_OVERWRITE</option>
            </field>

            <field name="upload_suffix" placeholder="_copy" type="text" default="" label="WF_PARAM_UPLOAD_SUFFIX" description="WF_PARAM_UPLOAD_SUFFIX_DESC" />

            <field name="browser_position" type="list" default="bottom" label="WF_PARAM_BROWSER_POSITION" description="WF_PARAM_BROWSER_POSITION_DESC">
                <option value="top">WF_LABEL_TOP</option>
                <option value="bottom">WF_LABEL_BOTTOM</option>
            </field>

            <field name="folder_tree" type="yesno" default="1" label="WF_PARAM_FOLDER_TREE" description="WF_PARAM_FOLDER_TREE_DESC">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field>
            <field name="list_limit" type="list" default="all" label="WF_PARAM_LIST_LIMIT" description="WF_PARAM_LIST_LIMIT_DESC">
                <option value="10">10</option>
                <option value="25">25</option>
                <option value="50">50</option>
                <option value="100">100</option>
                <option value="all">WF_OPTION_ALL</option>
            </field>
            <field name="validate_mimetype" type="yesno" default="1" label="WF_PARAM_VALIDATE_MIMETYPE" description="WF_PARAM_VALIDATE_MIMETYPE_DESC">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field>
            <field name="websafe_mode" type="list" default="utf-8" label="WF_PARAM_WEBSAFE_MODE" description="WF_PARAM_WEBSAFE_MODE_DESC">
                <option value="utf-8">UTF-8</option>
                <option value="ascii">ASCII</option>
            </field>
            <field name="websafe_allow_spaces" type="list" default="_" label="WF_PARAM_WEBSAFE_ALLOW_SPACES" description="WF_PARAM_WEBSAFE_ALLOW_SPACES_DESC">
                <option value="1">JYES</option>
                <option value="_">WF_OPTION_WEBSAFE_ALLOW_SPACES_UNDERSCORE</option>
                <option value="-">WF_OPTION_WEBSAFE_ALLOW_SPACES_DASH</option>
                <option value=".">WF_OPTION_WEBSAFE_ALLOW_SPACES_PERIOD</option>
            </field>
            <field name="websafe_textcase" type="checkboxes" multiple="multiple" default="uppercase,lowercase" label="WF_PARAM_WEBSAFE_TEXTCASE" description="WF_PARAM_WEBSAFE_TEXTCASE_DESC">
                <option value="uppercase">WF_OPTION_UPPERCASE</option>
                <option value="lowercase">WF_OPTION_LOWERCASE</option>
            </field>
            <field name="upload_add_random" type="yesno" default="0" label="WF_PARAM_UPLOAD_ADD_RANDOM" description="WF_PARAM_UPLOAD_ADD_RANDOM_DESC">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field>
            <field name="date_format" type="text" default="" hint="eg: %d/%m/%Y, %H:%M" label="WF_PARAM_DATE_FORMAT" description="WF_PARAM_DATE_FORMAT_DESC" />
            <field name="total_files" type="number" default="" class="input-small" step="1" label="WF_PARAM_TOTAL_FILES_LIMIT" description="WF_PARAM_TOTAL_FILES_LIMIT_DESC" />
            <field name="total_size" type="number" default="" class="input-small" step="1" label="WF_PARAM_TOTAL_FILES_SIZE_LIMIT" description="WF_PARAM_TOTAL_FILES_SIZE_LIMIT_DESC" />
        </fieldset>
        <fieldset name="editor.advanced">
            <field type="container" label="WF_PARAM_STARTUP_CONTENT" description="WF_PARAM_STARTUP_CONTENT_DESC">
				<field type="mediajce" name="startup_content_url" size="30" mediatype="html,htm,txt,md" default="" label="WF_PARAM_STARTUP_CONTENT_URL" description="WF_PARAM_STARTUP_CONTENT_URL_DESC" />

				<field type="spacer" label="WF_LABEL_OR" />

				<field type="code" name="startup_content_html" filter="JComponentHelper::filterText" rows="4" cols="3" class="input-xlarge" default="" label="WF_PARAM_STARTUP_CONTENT_HTML" spellcheck="false" description="WF_PARAM_STARTUP_CONTENT_HTML_DESC" />
            </field>

            <field type="spacer" />
            
            <field name="invalid_elements" type="repeatable" default="" label="WF_PARAM_NO_ELEMENTS" description="WF_PARAM_NO_ELEMENTS_DESC">
                <field type="text" size="50" hiddenLabel="true" />
            </field>

            <field name="invalid_attributes" type="repeatable" default="" label="WF_PARAM_INVALID_ATTRIBUTES" description="WF_PARAM_INVALID_ATTRIBUTES_DESC">
                <field type="text" size="50" hiddenLabel="true" />
            </field>
            
            <field name="invalid_attribute_values" type="repeatable" default="" label="WF_PARAM_INVALID_ATTRIBUTE_VALUES" description="WF_PARAM_INVALID_ATTRIBUTE_VALUES_DESC">
                <field type="text" size="50" hiddenLabel="true" />
            </field>
            
            <field name="extended_elements" type="repeatable" default="" label="WF_PARAM_ELEMENTS" description="WF_PARAM_ELEMENTS_DESC">
                <field type="text" size="50" hiddenLabel="true" />
            </field>

            <field name="validate_styles" type="yesno" default="1" label="WF_PARAM_VALIDATE_STYLES" description="WF_PARAM_VALIDATE_STYLES_DESC">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field>

            <field type="container" class="inset" label="WF_PARAM_CODE_BLOCKS" description="WF_PARAM_CODE_BLOCKS_DESC_WARNING" descriptionclass="alert alert-error">

                <field name="code_blocks" type="yesno" default="1" label="WF_PARAM_CODE_BLOCKS_ENABLE" description="WF_PARAM_CODE_BLOCKS_ENABLE_DESC">
                    <option value="1">JYES</option>
                    <option value="0">JNO</option>
                </field>
                
                <field name="allow_javascript" type="yesno" default="0" label="WF_PARAM_JAVASCRIPT" description="WF_PARAM_JAVASCRIPT_DESC">
                    <option value="1">JYES</option>
                    <option value="0">JNO</option>
                </field>

                <field name="allow_css" type="yesno" default="0" label="WF_PARAM_CSS" description="WF_PARAM_CSS_DESC">
                    <option value="1">JYES</option>
                    <option value="0">JNO</option>
                </field>

                <field name="allow_php" type="yesno" default="0" label="WF_PARAM_PHP" description="WF_PARAM_PHP_DESC">
                    <option value="1">JYES</option>
                    <option value="0">JNO</option>
                </field>

                <field name="allow_custom_xml" type="yesno" default="0" label="WF_PARAM_ALLOW_CUSTOM_XML" description="WF_PARAM_ALLOW_CUSTOM_XML_DESC">
                    <option value="1">JYES</option>
                    <option value="0">JNO</option>
                </field>
            </field>

            <field name="protect_shortcode" type="yesno" default="0" label="WF_PARAM_PROTECT_SHORTCODE" description="WF_PARAM_PROTECT_SHORTCODE_DESC">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field>

            <field name="allow_event_attributes" type="yesno" default="0" label="WF_PARAM_ALLOW_EVENT_ATTRIBUTES" description="WF_PARAM_ALLOW_EVENT_ATTRIBUTES_DESC" showon="allow_javascript:0">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field>

             <field name="object_resizing" type="yesno" default="1" label="WF_PARAM_OBJECT_RESIZING" description="WF_PARAM_OBJECT_RESIZING_DESC">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field>

            <field type="spacer" hr="true" />

            <field type="container" showon="wordcount:1" label="WF_PARAM_EDITOR_WORDCOUNT" description="">

                <field name="wordcount_limit" type="number" default="0" hint="0" label="WF_PARAM_WORDCOUNT_LIMIT" description="WF_PARAM_WORDCOUNT_LIMIT_DESC" class="input-small" />
                <field name="wordcount_alert" type="yesno" default="0" label="WF_PARAM_WORDCOUNT_ALERT" description="WF_PARAM_WORDCOUNT_ALERT_DESC">
                    <option value="1">JYES</option>
                    <option value="0">JNO</option>
                </field>

            </field>

            <field type="spacer" hr="true" />
           
            <field type="container" label="WF_NONEDITABLE_TITLE" description="WF_NONEDITABLE_DESC">

                <field name="noneditable_class" type="text" default="" hint="mceNonEditable" label="WF_NONEDITABLE_NONEDITABLE_CLASS" description="WF_NONEDITABLE_NONEDITABLE_CLASS_DESC" />
			    <field name="editable_class" type="text" default="" hint="mceEditable" label="WF_NONEDITABLE_EDITABLE_CLASS" description="WF_NONEDITABLE_EDITABLE_CLASS_DESC" />

            </field>

            <!--field name="figure_tag_style" type="yesno" default="1" label="WF_PARAM_FIGURE_TAG_STYLE" description="WF_PARAM_FIGURE_TAG_STYLE_DESC">
                <option value="1">JYES</option>
                <option value="0">JNO</option>
            </field-->
        </fieldset>
    </fields>
</form>components/com_jce/models/profile.php000060400000073651152453623450014005 0ustar00<?php

/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\Filesystem\File;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Form\FormHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Model\AdminModel;
use Joomla\CMS\Session\Session;
use Joomla\CMS\Table\Table;
use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Event\DispatcherAwareInterface;

require JPATH_SITE . '/components/com_jce/editor/libraries/classes/editor.php';

require JPATH_ADMINISTRATOR . '/components/com_jce/helpers/plugins.php';
require JPATH_ADMINISTRATOR . '/components/com_jce/helpers/profiles.php';

/**
 * Item Model for a Profile.
 *
 * @since       1.6
 */
class JceModelProfile extends AdminModel
{
    /**
     * The type alias for this content type.
     *
     * @var string
     *
     * @since  3.2
     */
    public $typeAlias = 'com_jce.profile';

    /**
     * The prefix to use with controller messages.
     *
     * @var string
     *
     * @since  1.6
     */
    protected $text_prefix = 'COM_JCE';

    public function __construct($config = array())
    {
        if ($this instanceof DispatcherAwareInterface) {
            $this->setDispatcher(Factory::getApplication()->getDispatcher());
        }

        parent::__construct($config);
    }

    /**
     * Returns a Table object, always creating it.
     *
     * @param type   $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 = 'Profiles', $prefix = 'JceTable', $config = array())
    {
        return Table::getInstance($type, $prefix, $config);
    }

    /* Override to prevent plugins from processing form data */
    protected function preprocessData($context, &$data, $group = 'system')
    {
        if (!isset($data->config)) {
            return;
        }

        $config = $data->config;

        if (is_string($config)) {
            $config = json_decode($config, true);
        }

        if (empty($config)) {
            return;
        }

        // editor parameters
        if (isset($config['editor'])) {
            if (!empty($config['editor']['toolbar_theme']) && $config['editor']['toolbar_theme'] === 'mobile') {
                $config['editor']['toolbar_theme'] = 'default.touch';
            }

            if (isset($config['editor']['relative_urls']) && !isset($config['editor']['convert_urls'])) {
                $config['editor']['convert_urls'] = $config['editor']['relative_urls'] == 0 ? 'absolute' : 'relative';
            }
        }

        // decode config values for display
        array_walk_recursive($config, function (&$value) {
            $value = htmlspecialchars_decode($value);
        });

        $data->config = $config;
    }

    /**
     * Method to allow derived classes 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 (defaults to "content")
     *
     * @see     JFormField
     * @since   1.6
     *
     * @throws Exception if there is an error in the form event
     */
    protected function preprocessForm(Form $form, $data, $group = 'content')
    {
        if (!empty($data)) {
            $registry = new Registry($data->config);

            // process individual fields to remove default value if required
            $fields = $form->getFieldset();

            foreach ($fields as $field) {
                $name = $field->getAttribute('name');

                // get the field group and add the field name
                $group = (string) $field->group;

                // must be a grouped parameter, eg: editor, imgmanager etc.
                if (!$group) {
                    continue;
                }

                // create key from group and name
                $group = $group . '.' . $name;

                // explode group to array
                $parts = explode('.', $group);

                // remove "config" from group name so it matches params data object
                if ($parts[0] === "config") {
                    array_shift($parts);
                    $group = implode('.', $parts);
                }

                // reset the "default" attribute value if a value is set
                if ($registry->exists($group)) {
                    $form->setFieldAttribute($name, 'default', '', (string) $field->group);
                }
            }
        }

        if ($form->getName() == 'com_jce.profile') {
            // editor manifest
            $manifest = __DIR__ . '/forms/editor.xml';

            // load editor manifest
            if (is_file($manifest)) {
                if ($editor_xml = simplexml_load_file($manifest)) {
                    $form->setField($editor_xml, 'config');
                }
            }
        }

        // Allow for additional modification of the form, and events to be triggered.
        // We pass the data because plugins may require it.
        parent::preprocessForm($form, $data);

        // Load the data into the form after the plugins have operated.
        $form->bind($data);
    }

    public function getForm($data = array(), $loadData = true)
    {
        if ($this instanceof DispatcherAwareInterface) {
            $this->setDispatcher(Factory::getApplication()->getDispatcher());
        }

        FormHelper::addFieldPath('JPATH_ADMINISTRATOR/components/com_jce/models/fields');

        // Get the setup form.
        return $this->loadForm('com_jce.profile', 'profile', array('control' => 'jform', 'load_data' => true));
    }

    /**
     * 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->getItem();

        // convert 0 value to null to force defaults
        if (empty($data->area)) {
            $data->area = null;
        }

        // convert to array if set
        if (!empty($data->device)) {
            $data->device = explode(',', $data->device);
        }

        if (!empty($data->components)) {
            $data->components = explode(',', $data->components);
            $data->components_select = 1;
        }

        if (!empty($data->types)) {
            $data->types = explode(',', $data->types);
        }

        $data->config = $data->params;

        $this->preprocessData('com_jce.profiles', $data);

        return $data;
    }

    public function getRows()
    {
        $data = $this->getItem();

        $array = array();
        $rows = empty($data->rows) ? array() : explode(';', $data->rows);

        $plugins = $this->getButtons();

        $i = 1;

        foreach ($rows as $row) {
            $groups = array();
            // remove spacers
            $row = str_replace(array('|', 'spacer'), '', $row);

            foreach (explode('spacer', $row) as $group) {
                // get items in group
                $items = explode(',', $group);
                $buttons = array();

                // remove duplicates
                $items = array_unique($items);

                foreach ($items as $x => $item) {
                    if ($item === 'spacer') {
                        unset($items[$x]);
                        continue;
                    }

                    // not in the list...
                    if (empty($item) || array_key_exists($item, $plugins) === false) {
                        continue;
                    }

                    // must be assigned...
                    if (!$plugins[$item]->active) {
                        continue;
                    }

                    // assign icon
                    $buttons[] = $plugins[$item];
                }

                $groups[] = $buttons;
            }

            $array[$i] = $groups;

            ++$i;
        }

        // allow for empty toolbar row when creating a new profile
        if (empty($array)) {
            $array[$i] = array();
        }

        return $array;
    }

    /**
     * An array of buttons not in the current editor layout.
     *
     * @return array
     */
    public function getAvailableButtons()
    {
        $plugins = $this->getButtons();

        $available = array_filter($plugins, function ($plugin) {
            return !$plugin->active;
        });

        return $available;
    }

    public function getAdditionalPlugins()
    {
        $plugins = $this->getButtons();

        $additional = array_filter($plugins, function ($plugin) {
            return $plugin->editable && !$plugin->row;
        });

        return $additional;
    }

    public function getButtons()
    {
        $commands = $this->getCommands();
        $plugins = $this->getPlugins();

        return array_merge($commands, $plugins);
    }

    public function getCommands()
    {
        static $commands;

        if (empty($commands)) {
            $data = $this->getItem();
            $rows = empty($data->rows) ? array() : preg_split('#[;,]#', $data->rows);

            $commands = array();

            foreach (JcePluginsHelper::getCommands() as $name => $command) {
                // set as active
                $command->active = in_array($name, $rows);
                $command->icon = explode(',', $command->icon);

                // set default empty value
                $command->image = '';

                // ui class, default is blank
                if (empty($command->class)) {
                    $command->class = '';
                }

                // cast row to integer
                $command->row = (int) $command->row;

                // cast editable to integer
                $command->editable = (int) $command->editable;

                // translate title
                $command->title = Text::_($command->title);

                // translate description
                $command->description = Text::_($command->description);

                $command->name = $name;

                $commands[$name] = $command;
            }
        }

        // merge plugins and commands
        return $commands;
    }

    public function getPlugins()
    {
        static $plugins;

        if (empty($plugins)) {
            $plugins = array();

            $data = $this->loadFormData();

            // array or profile plugin items
            $rows = empty($data->plugins) ? array() : explode(',', $data->plugins);

            // remove duplicates
            $rows = array_unique($rows);

            $extensions = JcePluginsHelper::getExtensions();

            // only need plugins with xml files
            foreach (JcePluginsHelper::getPlugins() as $name => $plugin) {
                $plugin->icon = empty($plugin->icon) ? array() : explode(',', $plugin->icon);

                // set as active if it is in the profile
                $plugin->active = in_array($plugin->name, $rows);

                // ui class, default is blank
                if (empty($plugin->class)) {
                    $plugin->class = '';
                }

                $plugin->class = preg_replace_callback('#\b([a-z0-9]+)-([a-z0-9]+)\b#', function ($matches) {
                    return 'mce' . ucfirst($matches[1]) . ucfirst($matches[2]);
                }, $plugin->class);

                // translate title
                $plugin->title = Text::_($plugin->title);

                // translate description
                $plugin->description = Text::_($plugin->description);

                // cast row to integer
                $plugin->row = (int) $plugin->row;

                // cast editable to integer
                $plugin->editable = (int) $plugin->editable;

                // plugin extensions
                $plugin->extensions = array();

                if (is_file($plugin->manifest)) {
                    $plugin->form = $this->loadForm('com_jce.profile.' . $plugin->name, $plugin->manifest, array('control' => 'jform[config]', 'load_data' => true), true, '//extension');
                    $plugin->formclass = 'options-grid-form options-grid-form-full';

                    $fieldsets = $plugin->form->getFieldsets();

                    // no parameter fields
                    if (empty($fieldsets)) {
                        $plugin->form = false;
                        $plugins[$name] = $plugin;
                        continue;
                    }

                    // bind data to the form
                    $plugin->form->bind($data->params);

                    foreach ($extensions as $type => $items) {

                        $item = new StdClass;
                        $item->name = '';
                        $item->title = '';
                        $item->manifest = WF_EDITOR_LIBRARIES . '/xml/config/' . $type . '.xml';
                        $item->context = '';

                        array_unshift($items, $item);

                        foreach ($items as $p) {
                            // check for plugin fieldset using xpath, as fieldset can be empty
                            $fieldset = $plugin->form->getXml()->xpath('(//fieldset[@name="plugin.' . $type . '"])');

                            // not supported, move along...
                            if (empty($fieldset)) {
                                continue;
                            }

                            $context = (string) $fieldset[0]->attributes()->context;

                            // check for a context, eg: images, web, video
                            if ($context && !in_array($p->context, explode(',', $context))) {
                                continue;
                            }

                            if (is_file($p->manifest)) {
                                $path = array($plugin->name, $type, $p->name);

                                // create new extension object
                                $extension = new StdClass;

                                // set extension name as the plugin name
                                $extension->name = $p->name;

                                // set extension title
                                $extension->title = $p->title;

                                // load form
                                $extension->form = $this->loadForm('com_jce.profile.' . implode('.', $path), $p->manifest, array('control' => 'jform[config][' . $plugin->name . '][' . $type . ']', 'load_data' => true), true, '//extension');
                                $extension->formclass = 'options-grid-form options-grid-form-full';

                                // get fieldsets if any
                                $fieldsets = $extension->form->getFieldsets();

                                foreach ($fieldsets as $fieldset) {
                                    // load form
                                    $plugin->extensions[$type][$p->name] = $extension;

                                    if (!isset($data->params[$plugin->name])) {
                                        continue;
                                    }

                                    if (!isset($data->params[$plugin->name][$type])) {
                                        continue;
                                    }

                                    // bind data to the form
                                    $extension->form->bind($data->params[$plugin->name][$type]);
                                }
                            }
                        }
                    }
                }

                // add to array
                $plugins[$name] = $plugin;
            }
        }

        return $plugins;
    }

    /**
     * Prepare and sanitise the table data prior to saving.
     *
     * @param JTable $table A reference to a JTable object
     *
     * @since   1.6
     */
    protected function prepareTable($table)
    {
        $filter = InputFilter::getInstance();

        foreach ($table->getProperties() as $key => $value) {
            switch ($key) {
                case 'name':
                case 'description':
                    $value = $filter->clean($value, 'STRING');
                    break;
                case 'device':
                    $value = $filter->clean($value, 'STRING');

                    if (is_array($value)) {
                        $value = implode(',', $value);
                    }
                    break;
                case 'area':
                    if (is_array($value)) {
                        // remove empty value
                        $value = array_filter($value, 'strlen');

                        // for simplicity, set multiple area selections as "0"
                        if (count($value) > 1) {
                            $value = 0;
                        } else {
                            $value = $value[0];
                        }
                    }

                    $value = $value;

                    break;
                case 'components':
                    $value = $filter->clean($value, 'STRING');

                    if (is_array($value)) {
                        $value = implode(',', $value);
                    }

                    break;
                case 'params':
                    break;
                case 'types':
                case 'users':

                    $value = $filter->clean($value, 'INT');

                    if (is_array($value)) {
                        $value = implode(',', $value);
                    }

                    break;
                case 'plugins':
                    $value = preg_replace('#[^\w_,]+#', '', $value);
                    break;
                case 'rows':
                    $value = preg_replace('#[^\w,;]+#', '', $value);
                    break;
                case 'params':
                    break;
            }

            $table->$key = $value;
        }

        if (empty($table->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($db->quoteName('#__wf_profiles'));

                $db->setQuery($query);
                $max = $db->loadResult();

                $table->ordering = $max + 1;
            }
        }
    }

    public function validate($form, $data, $group = null)
    {
        $filter = InputFilter::getInstance();

        // get unfiltered config data
        $config = isset($data['config']) ? $data['config'] : array();

        // get layout rows and plugins data
        $rows = isset($data['rows']) ? $data['rows'] : '';
        $plugins = isset($data['plugins']) ? $data['plugins'] : '';

        // clean layout rows and plugins data
        $data['rows'] = $filter->clean($rows, 'STRING');
        $data['plugins'] = $filter->clean($plugins, 'STRING');

        // add back config data
        $data['params'] = json_encode($filter->clean($config, 'ARRAY'));

        if (empty($data['components']) || empty($data['components_select'])) {
            $data['components'] = '';
        }

        if (empty($data['users'])) {
            $data['users'] = '';
        }

        if (empty($data['types'])) {
            $data['types'] = '';
        }

        return $data;
    }

    private static function cleanParamData($data)
    {
        // clean up link plugin parameters
        array_walk($data, function (&$params, $plugin) {
            if ($plugin === "link") {
                if (isset($params['dir'])) {

                    if (!empty($params['dir']) && empty($params['direction'])) {
                        $params['direction'] = $params['dir'];
                    }

                    unset($params['dir']);
                }
            }

            if (is_array($params) && WFUtility::is_associative_array($params)) {
                array_walk($params, function (&$value, $key) {
                    if (is_string($value) && WFUtility::isJson($value)) {
                        $value = json_decode($value, true);
                    }
                });
            }
        });

        return $data;
    }

    /**
     * Recursively normalizes parameter structures:
     * - If a string looks like JSON ({...} or [...]) and decodes cleanly, decode it.
     * - If an array entry is a key/value pair and both are empty, drop it.
     * - Recurse into arrays and keep original scalar types.
     */
    private static function normalizeParams($node)
    {
        // 1) Strings: decode JSON-in-strings when safe
        if (is_string($node)) {
            $trim = ltrim($node);

            if ($trim !== '' && ($trim[0] === '{' || $trim[0] === '[')) {
                $decoded = json_decode($node, true);

                if (json_last_error() === JSON_ERROR_NONE) {
                    return self::normalizeParams($decoded);
                }
            }

            return $node;
        }

        // 2) Arrays: handle key/value pairs & recurse
        if (is_array($node)) {
            // Drop empty key/value pair objects
            if (array_key_exists('name', $node) && array_key_exists('value', $node)) {
                $name  = trim((string) ($node['name'] ?? ''));
                $value = $node['value'] ?? '';

                $valueIsEmpty =
                    (is_string($value) && trim($value) === '') ||
                    $value === null ||
                    (is_array($value) && $value === []);

                if ($name === '' && $valueIsEmpty) {
                    return null; // signal to remove
                }
            }

            $result = [];

            // Preserve numeric indexes for lists; associative for objects
            foreach ($node as $k => $v) {
                $normalized = self::normalizeParams($v);

                // Skip nulls returned from empty key/value pairs
                if ($normalized === null) {
                    continue;
                }

                $result[$k] = $normalized;
            }

            return $result;
        }

        // 3) Other scalars / objects: return as-is
        return $node;
    }

    /**
     * Method to save the form data.
     *
     * @param   array  The form data
     *
     * @return bool True on success
     *
     * @since    2.7
     */
    public function save($data)
    {
        $app = Factory::getApplication();

        // get profile table
        $table = $this->getTable();

        // Alter the title for save as copy
        if ($app->input->get('task') == 'save2copy') {

            // Alter the title
            $name = $data['name'];

            while ($table->load(array('name' => $name))) {
                if ($name == $table->name) {
                    $name = StringHelper::increment($name);
                }
            }

            $data['name'] = $name;
            $data['published'] = 0;
        }

        $key = $table->getKeyName();
        $pk = (!empty($data[$key])) ? $data[$key] : (int) $this->getState($this->getName() . '.id');

        if ($pk && $table->load($pk)) {
            if (empty($data['rows'])) {
                $data['rows'] = $table->rows;
            }

            if (empty($data['plugins'])) {
                $data['plugins'] = $table->plugins;
            }

            $json = array();
            $params = empty($table->params) ? '' : $table->params;

            // convert params to json data array
            $params = (array) json_decode($params, true);

            $plugins = isset($data['plugins']) ? $data['plugins'] : $table->plugins;

            // get plugins
            $items = explode(',', $plugins);

            // add "editor" for editor parameters
            $items[] = 'editor';

            // add "setup" for setup parameters (via plugins, eg: jcepro)
            $items[] = 'setup';

            if (is_string($data['params'])) {
                $data['params'] = json_decode($data['params'], true);
            }

            // make sure we have a value
            if (empty($data['params'])) {
                $data['params'] = array();
            }

            $data['params'] = self::cleanParamData($data['params']);

            // data for editor and plugins
            foreach ($items as $item) {
                // add config data
                if (array_key_exists($item, $data['params'])) {
                    $value = $data['params'][$item];

                    // normalize the value
                    $value = self::normalizeParams($value);
                    
                    // Add to json array for merging
                    $json[$item] = $value;
                }
            }

            // merge and encode as json string
            $data['params'] = json_encode(WFUtility::array_merge_recursive_distinct($params, $json));
        }

        // set a default value for validation
        if (empty($data['params'])) {
            $data['params'] = '{}';
        }

        if (parent::save($data)) {
            return true;
        }

        return false;
    }

    public function copy($ids)
    {
        // Check for request forgeries
        Session::checkToken() or jexit(Text::_('JINVALID_TOKEN'));
        $table = $this->getTable();

        foreach ($ids as $id) {
            if (!$table->load($id)) {
                $this->setError($table->getError());
            } else {
                $name = Text::sprintf('WF_PROFILES_COPY_OF', $table->name);
                $table->name = $name;
                $table->id = 0;
                $table->published = 0;
            }

            // Check the row.
            if (!$table->check()) {
                $this->setError($table->getError());

                return false;
            }

            // Store the row.
            if (!$table->store()) {
                $this->setError($table->getError());

                return false;
            }
        }

        return true;
    }

    public function export($ids)
    {
        $db = Factory::getDBO();

        $buffer = '<?xml version="1.0" encoding="utf-8" standalone="yes"?>';
        $buffer .= "\n" . '<export type="profiles">';
        $buffer .= "\n\t" . '<profiles>';

        $validFields = array('name', 'description', 'users', 'types', 'components', 'area', 'device', 'rows', 'plugins', 'published', 'ordering', 'params');

        foreach ($ids as $id) {
            $table = $this->getTable();

            if (!$table->load($id)) {
                continue;
            }

            $buffer .= "\n\t\t";
            $buffer .= '<profile>';

            $fields = $table->getProperties();

            foreach ($fields as $key => $value) {
                // only allow a subset of fields
                if (false == in_array($key, $validFields)) {
                    continue;
                }

                // set published to 0
                if ($key === "published") {
                    $value = 0;
                }

                if ($key == 'params') {
                    $buffer .= "\n\t\t\t" . '<' . $key . '><![CDATA[' . trim($value) . ']]></' . $key . '>';
                } else {
                    $buffer .= "\n\t\t\t" . '<' . $key . '>' . JceProfilesHelper::encodeData($value) . '</' . $key . '>';
                }
            }

            $buffer .= "\n\t\t</profile>";
        }

        $buffer .= "\n\t</profiles>";
        $buffer .= "\n</export>";

        // set_time_limit doesn't work in safe mode
        if (!ini_get('safe_mode')) {
            @set_time_limit(0);
        }

        $name = 'jce_editor_profile_' . date('Y_m_d') . '.xml';

        $app = Factory::getApplication();

        $app->allowCache(false);
        $app->setHeader('Content-Transfer-Encoding', 'binary');
        $app->setHeader('Content-Type', 'text/xml');
        $app->setHeader('Content-Disposition', 'attachment;filename="' . $name . '";');

        // set output content
        $app->setBody($buffer);

        // stream to client
        echo $app->toString();

        jexit();
    }

    /**
     * Process XML restore file.
     *
     * @param object $xml
     *
     * @return bool
     */
    public function import()
    {
        // Check for request forgeries
        Session::checkToken() or jexit(Text::_('JINVALID_TOKEN'));

        jimport('joomla.filesystem.file');

        $app = Factory::getApplication();
        $tmp = $app->getCfg('tmp_path');

        jimport('joomla.filesystem.file');

        $file = $app->input->files->get('profile_file', null, 'raw');

        // check for valid uploaded file
        if (empty($file) || !is_uploaded_file($file['tmp_name'])) {
            $app->enqueueMessage(Text::_('WF_PROFILES_UPLOAD_NOFILE'), 'error');
            return false;
        }

        if ($file['error'] || $file['size'] < 1) {
            $app->enqueueMessage(Text::_('WF_PROFILES_UPLOAD_NOFILE'), 'error');
            return false;
        }

        // sanitize the file name
        $name = File::makeSafe($file['name']);

        if (empty($name)) {
            $app->enqueueMessage(Text::_('WF_PROFILES_IMPORT_ERROR'), 'error');
            return false;
        }

        // Build the appropriate paths.
        $config = Factory::getConfig();
        $destination = $config->get('tmp_path') . '/' . $name;
        $source = $file['tmp_name'];

        // Move uploaded file.
        File::upload($source, $destination, false, true);

        if (!is_file($destination)) {
            $app->enqueueMessage(Text::_('WF_PROFILES_UPLOAD_FAILED'), 'error');
            return false;
        }

        $result = JceProfilesHelper::processImport($destination);

        if ($result === false) {
            $app->enqueueMessage(Text::_('WF_PROFILES_IMPORT_ERROR'), 'error');
            return false;
        }

        $app->enqueueMessage(Text::sprintf('WF_PROFILES_IMPORT_SUCCESS', $result));

        return true;
    }
}components/com_jce/models/profiles.xml000060400000014367152453623450014200 0ustar00<?xml version="1.0" encoding="utf-8"?>
<profiles>
    <help>
        <topic key="admin.profiles.about" title="WF_PROFILES_HELP_ABOUT" />
        <topic key="admin.profiles.manage" title="WF_PROFILES_HELP_MANAGE">
            <subtopic key="admin.profiles.manage.copy" title="WF_PROFILES_HELP_MANAGE_COPY" />
            <subtopic key="admin.profiles.manage.delete" title="WF_PROFILES_HELP_MANAGE_DELETE" />
            <subtopic key="admin.profiles.manage.export" title="WF_PROFILES_HELP_MANAGE_EXPORT" />
            <subtopic key="admin.profiles.manage.import" title="WF_PROFILES_HELP_MANAGE_IMPORT" />
            <subtopic key="admin.profiles.manage.ordering" title="WF_PROFILES_HELP_MANAGE_ORDERING" />
            <subtopic key="admin.profiles.manage.enable" title="WF_PROFILES_HELP_MANAGE_ENABLE" />
        </topic>
        <topic key="admin.profiles.edit" title="WF_PROFILES_HELP_EDIT">
            <subtopic key="admin.profiles.edit.setup" title="WF_PROFILES_HELP_EDIT_SETUP" />
            <subtopic key="admin.profiles.edit.features" title="WF_PROFILES_HELP_EDIT_FEATURES" />
            <subtopic key="admin.profiles.edit.editor" title="WF_PROFILES_HELP_EDIT_EDITOR" />
            <subtopic key="admin.profiles.edit.plugins" title="WF_PROFILES_HELP_EDIT_PLUGINS" />
            <subtopic key="admin.profiles.edit.widgets" title="WF_PROFILES_HELP_EDIT_WIDGETS" />
        </topic>
    </help>
    <profiles>
        <profile name="Default" default="default">
            <name>Default</name>
            <description>WF_PROFILES_DEFAULT_DESC</description>
            <users></users>
            <types></types>
            <components></components>
            <area>0</area>
            <device>desktop,tablet,phone</device>
            <rows>help,newdocument,undo,redo,spacer,bold,italic,underline,strikethrough,justifyfull,justifycenter,justifyleft,justifyright,spacer,blockquote,formatselect,styleselect,removeformat,cleanup;fontselect,fontsizeselect,fontcolor,spacer,clipboard,indent,outdent,lists,sub,sup,textcase,charmap,hr;directionality,fullscreen,print,searchreplace,spacer,table,style,attributes;visualaid,visualchars,visualblocks,nonbreaking,anchor,unlink,link,imgmanager,spellchecker,article</rows>
            <plugins>formatselect,styleselect,cleanup,fontselect,fontsizeselect,fontcolor,clipboard,lists,textcase,charmap,hr,directionality,fullscreen,print,searchreplace,table,style,attributes,visualchars,visualblocks,nonbreaking,anchor,link,imgmanager,spellchecker,article,spellchecker,article,browser,contextmenu,media,preview,source</plugins>
            <published>1</published>
            <ordering>1</ordering>
            <params>{"editor":{"toolbar_theme":"modern"}}</params>
        </profile>
        <profile name="Front End">
            <name>Front End</name>
            <description>WF_PROFILES_FRONTEND_DESC</description>
            <users></users>
            <types></types>
            <components></components>
            <area>1</area>
            <device>desktop,tablet,phone</device>
            <rows>help,newdocument,undo,redo,spacer,bold,italic,underline,strikethrough,justifyfull,justifycenter,justifyleft,justifyright,spacer,formatselect,styleselect;clipboard,searchreplace,indent,outdent,lists,cleanup,charmap,removeformat,hr,sub,sup,textcase,nonbreaking,visualchars,visualblocks;fullscreen,print,visualaid,style,attributes,anchor,unlink,link,imgmanager,spellchecker,article</rows>
            <plugins>charmap,contextmenu,help,clipboard,searchreplace,fullscreen,preview,print,style,textcase,nonbreaking,visualchars,visualblocks,attributes,imgmanager,anchor,link,spellchecker,article,lists,formatselect,styleselect,hr</plugins>
            <published>0</published>
            <ordering>2</ordering>
            <params>{"editor":{"toolbar_theme":"modern"}}</params>
        </profile>
        <profile name="Blogger">
            <name>Blogger</name>
            <description>Simple Blogging Profile</description>
            <users></users>
            <types></types>
            <components></components>
            <area>0</area>
            <device>desktop,tablet,phone</device>
            <rows>bold,italic,strikethrough,lists,blockquote,spacer,justifyleft,justifycenter,justifyright,spacer,link,unlink,imgmanager,article,spellchecker,fullscreen,kitchensink;formatselect,styleselect,underline,justifyfull,clipboard,removeformat,charmap,indent,outdent,undo,redo,help</rows>
            <plugins>link,imgmanager,article,spellchecker,fullscreen,kitchensink,clipboard,contextmenu,lists,formatselect,styleselect,textpattern</plugins>
            <published>0</published>
            <ordering>3</ordering>
            <params>{"editor":{"toolbar_theme":"modern"}}</params>
        </profile>
        <profile name="Mobile">
            <name>Mobile</name>
            <description>Sample Mobile Profile</description>
            <users></users>
            <types></types>
            <components></components>
            <area>0</area>
            <device>tablet,phone</device>
            <rows>undo,redo,spacer,bold,italic,underline,formatselect,spacer,justifyleft,justifycenter,justifyfull,justifyright,spacer,fullscreen,kitchensink;styleselect,lists,spellchecker,article,link,unlink</rows>
            <plugins>fullscreen,kitchensink,spellchecker,article,link,lists,formatselect,styleselect,textpattern</plugins>
            <published>0</published>
            <ordering>4</ordering>
            <params>{"editor":{"toolbar_theme":"modern.touch","resizing":"0","resize_horizontal":"0","resizing_use_cookie":"0","links":{"popups":{"default":"","jcemediabox":{"enable":"0"},"window":{"enable":"0"}}}}}</params>
        </profile>
        <profile>
            <name>Markdown</name>
            <description>Sample Markdown Profile</description>
            <users></users>
            <types>6,7,3,4,5,8</types>
            <components></components>
            <area>0</area>
            <device>desktop,tablet,phone</device>
            <rows>fullscreen,justifyleft,justifycenter,justifyfull,justifyright,link,unlink,imgmanager,styleselect</rows>
            <plugins>fullscreen,link,imgmanager,styleselect,media,textpattern</plugins>
            <published>0</published>
            <ordering>5</ordering>
            <params>{"editor":{"toolbar_theme":"modern"}}</params>
        </profile>
    </profiles>
</profiles>components/com_jce/models/config.php000060400000013230152453623450013575 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright     Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\MVC\Model\FormModel;
use Joomla\CMS\Table\Table;
use Joomla\Event\DispatcherAwareInterface;

class JceModelConfig extends FormModel
{
    /**
     * Returns a Table object, always creating it.
     *
     * @param type   $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 = 'Extension', $prefix = 'JTable', $config = array())
    {
        return Table::getInstance($type, $prefix, $config);
    }

    /**
     * Method to get a form object.
     *
     * @param array $data     Data for the form
     * @param bool  $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    1.6
     */
    public function getForm($data = array(), $loadData = true)
    {
        if ($this instanceof DispatcherAwareInterface) {
            $this->setDispatcher(Factory::getApplication()->getDispatcher());
        }
        
        // Get the form.
        $form = $this->loadForm('com_jce.config', 'config', 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 = Factory::getApplication()->getUserState('com_jce.config.data', array());

        if (empty($data)) {
            $data = $this->getData();
        }

        $this->preprocessData('com_jce.config', $data);

        return $data;
    }

    /* Override to prevent plugins from processing form data */
    protected function preprocessData($context, &$data, $group = 'system')
    {
        if (!isset($data->params)) {
            return;
        }

        $config = $data->params;

        if (is_string($config)) {
            $config = json_decode($config, true);
        }

        if (empty($config)) {
            return;
        }

        if (!empty($config['custom_config'])) {
            // settings syntax, eg: key:value
            if (is_string($config['custom_config']) && strpos($config['custom_config'], ':') !== false) {

                if (!WFUtility::isJson($config['custom_config'])) {
                    $values = explode(';', $config['custom_config']);

                    // reset as array
                    $config['custom_config'] = array();

                    foreach ($values as $value) {
                        list($key, $val) = explode(':', $value);

                        $config['custom_config'][] = array(
                            'name' => $key,
                            'value' => trim($val, " \t\n\r\0\x0B'\""),
                        );
                    }
                }
            }
        }

        $data->params = $config;
    }

    /**
     * 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()
    {
        $table = $this->getTable();

        $id = $table->find(array(
            'type' => 'plugin',
            'element' => 'jce',
            'folder' => 'editors',
        ));

        if (!$table->load($id)) {
            $this->setError($table->getError());
            return false;
        }

        // json_decode
        $json = json_decode($table->params, true);

        if (empty($json)) {
            $json = array();
        }

        array_walk($json, function (&$value, $key) {
            if (is_numeric($value)) {
                $value = $value + 0;
            }
        });

        $data = new StdClass;
        $data->params = $json;

        return $data;
    }

    /**
     * Method to save the form data.
     *
     * @param   array  The form data
     *
     * @return bool True on success
     *
     * @since    2.7
     */
    public function save($data)
    {
        $table = $this->getTable();

        $id = $table->find(array(
            'type' => 'plugin',
            'element' => 'jce',
            'folder' => 'editors',
        ));

        if (!$id) {
            $this->setError('Invalid plugin');
            return false;
        }

        // Load the previous Data
        if (!$table->load($id)) {
            $this->setError($table->getError());
            return false;
        }

        // Bind the data.
        if (!$table->bind($data)) {
            $this->setError($table->getError());
            return false;
        }

        // Check the data.
        if (!$table->check()) {
            $this->setError($table->getError());
            return false;
        }

        // Store the data.
        if (!$table->store()) {
            $this->setError($table->getError());
            return false;
        }

        return true;
    }
}
components/com_jce/models/profiles.php000060400000017723152453623450014166 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Model\ListModel;
use Joomla\CMS\Table\Table;
use Joomla\Event\DispatcherAwareInterface;

require_once JPATH_COMPONENT_ADMINISTRATOR . '/helpers/profiles.php';

class JceModelProfiles extends ListModel
{
    /**
     * Constructor.
     *
     * @param   array  $config  An optional associative array of configuration settings.
     *
     * @see     JControllerLegacy
     * @since   1.6
     */
    public function __construct($config = array())
    {
        if ($this instanceof DispatcherAwareInterface) {
            $this->setDispatcher(Factory::getApplication()->getDispatcher());
        }
        
        if (empty($config['filter_fields'])) {
            $config['filter_fields'] = array(
                'id', 'id',
                'name', 'name',
                'checked_out', 'checked_out',
                'checked_out_time', 'checked_out_time',
                'published', 'published',
                'ordering', 'ordering',
            );
        }

        parent::__construct($config);
    }

    /**
     * Method to auto-populate the model state.
     *
     * @param   string  $ordering   An optional ordering field.
     * @param   string  $direction  An optional direction (asc|desc).
     *
     * @return  void
     *
     * @note    Calling getState in this method will result in recursion.
     * @since   1.6
     */
    protected function populateState($ordering = 'id', $direction = 'asc')
    {
        // Load the filter state.
        $this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string'));

        // Load the parameters.
        $params = ComponentHelper::getParams('com_jce');
        $this->setState('params', $params);

        // 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.
     *
     * @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.components');

        return parent::getStoreId($id);
    }

    /**
     * Method to get an array of data items.
     *
     * @return  mixed  An array of data items on success, false on failure.
     *
     * @since   1.6
     */
    public function getItems()
    {
        $items = parent::getItems();

        // Filter by device
        $device = $this->getState('filter.device');

        // Filter by component
        $components = $this->getState('filter.components');

        // Filter by user groups
        $usergroups = $this->getState('filter.usergroups');

        $items = array_filter($items, function ($item) use ($device, $components, $usergroups) {
            $state = true;

            if ($device) {
                $state = in_array($device, explode(',', $item->device));
            }

            if ($components) {
                $state = in_array($components, explode(',', $item->components));
            }

            if ($usergroups) {
                $state = in_array($usergroups, explode(',', $item->types));
            }

            return $state;
        });

        // Get a storage key.
        $store = $this->getStoreId();

        // update cache store
        $this->cache[$store] = $items;

        return $items;
    }

    /**
     * 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 = Factory::getUser();

        // Select the required fields from the table.
        $query->select(
            $this->getState(
                'list.select',
                '*'
            )
        );

        $query->from($db->quoteName('#__wf_profiles'));

        // Filter by published state
        $published = $this->getState('filter.published');

        if (is_numeric($published)) {
            $query->where($db->quoteName('published') . ' = ' . (int) $published);
        } elseif ($published === '') {
            $query->where('(' . $db->quoteName('published') . ' = 0 OR ' . $db->quoteName('published') . ' = 1)');
        }

        // Filter by area
        $area = (int) $this->getState('filter.area');

        if ($area) {
            $query->where($db->quoteName('area') . ' = ' . (int) $area);
        }

        // Filter by search in title
        $search = $this->getState('filter.search');

        if (!empty($search)) {
            if (stripos($search, 'id:') === 0) {
                $query->where($db->quoteName('id') . ' = ' . (int) substr($search, 3));
            } else {
                $search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%'));
                $query->where('(' . $db->quoteName('name') . ' LIKE ' . $search . ' OR ' . $db->quoteName('description') . ' LIKE ' . $search . ')');
            }
        }

        // Add the list ordering clause.
        $listOrder = $this->getState('list.ordering', 'ordering');
        $listDirn = $this->getState('list.direction', 'ASC');

        $query->order($db->escape($listOrder . ' ' . $listDirn));

        return $query;
    }

    public function repair()
    {
        $file = __DIR__ . '/profiles.xml';

        if (!is_file($file)) {
            $this->setError(Text::_('WF_PROFILES_REPAIR_ERROR'));
            return false;
        }

        $xml = simplexml_load_file($file);

        if (!$xml) {
            $this->setError(Text::_('WF_PROFILES_REPAIR_ERROR'));
            return false;
        }

        foreach ($xml->profiles->children() as $profile) {
            $groups = JceProfilesHelper::getUserGroups((int) $profile->children('area'));

            $table = Table::getInstance('Profiles', 'JceTable');

            foreach ($profile->children() as $item) {
                switch ((string) $item->getName()) {
                    case 'description':
                        $table->description = Text::_((string) $item);
                    case 'types':
                        $table->types = implode(',', $groups);
                        break;
                    case 'area':
                        $table->area = (int) $item;
                        break;
                    case 'rows':
                        $table->rows = (string) $item;
                        break;
                    case 'plugins':
                        $table->plugins = (string) $item;
                        break;
                    default:
                        $key = $item->getName();
                        $table->$key = (string) $item;

                        break;
                }
            }

            // default
            $table->checked_out = 0;
            $table->checked_out_time = '0000-00-00 00:00:00';

            // Check the data.
            if (!$table->check()) {
                $this->setError($table->getError());

                return false;
            }

            // Store the data.
            if (!$table->store()) {
                $this->setError($table->getError());

                return false;
            }
        }

        return true;
    }
}
components/com_jce/models/editor.php000060400000003370152453623450013622 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Factory;

class WFModelEditor
{
    private static $editor;

    public function buildEditor()
    {
        if (!isset(self::$editor)) {
            self::$editor = new WFEditor();
        }

        $settings = self::$editor->getEditorSettings();

        return self::$editor->render($settings);
    }

    public function getEditorSettings()
    {
        if (!isset(self::$editor)) {
            self::$editor = new WFEditor();
        }

        return self::$editor->getEditorSettings();
    }

    public function render($settings = array())
    {
        if (!isset(self::$editor)) {
            self::$editor = new WFEditor();
        }

        if (empty($settings)) {
            $settings = self::$editor->getEditorSettings();
        }

        self::$editor->render($settings);

        $document = Factory::getDocument();

        foreach (self::$editor->getScripts() as $script => $type) {
            $document->addScript($script, array('version' => 'auto'), array('type' => $type, 'defer' => 'defer'));
        }

        foreach (self::$editor->getStyleSheets() as $style) {
            $document->addStylesheet($style, array('version' => 'auto'));
        }

        $script = "document.addEventListener('DOMContentLoaded',function handler(){" . implode("", self::$editor->getScriptDeclaration()) . ";this.removeEventListener('DOMContentLoaded',handler);});";

        $document->addScriptDeclaration($script);
    }
}
components/com_jce/models/mediabox.php000060400000010426152453623450014124 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Form\Form;
use Joomla\CMS\MVC\Model\FormModel;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\CMS\Table\Table;

class JceModelMediabox extends FormModel
{
    /**
     * Returns a Table object, always creating it.
     *
     * @param type   $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 Joomla\CMS\Table\Table A database object
     *
     * @since   1.6
     */
    public function getTable($type = 'Extension', $prefix = 'JTable', $config = array())
    {
        return Table::getInstance($type, $prefix, $config);
    }

    /**
     * Method to get a form object.
     *
     * @param array $data     Data for the form
     * @param bool  $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    1.6
     */
    public function getForm($data = array(), $loadData = true)
    {
        Form::addFormPath(JPATH_PLUGINS . '/system/jcemediabox');

        Factory::getLanguage()->load('plg_system_jcemediabox', JPATH_PLUGINS . '/system/jcemediabox');
        Factory::getLanguage()->load('plg_system_jcemediabox', JPATH_ADMINISTRATOR);

        // Get the form.
        $form = $this->loadForm('com_jce.mediabox', 'jcemediabox', array('control' => 'jform', 'load_data' => $loadData), true, '//config');

        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 = Factory::getApplication()->getUserState('com_jce.mediabox.plugin.data', array());

        if (empty($data)) {
            $data = $this->getData();
        }

        return $data;
    }

    /**
     * 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 editor data
        $plugin = PluginHelper::getPlugin('system', 'jcemediabox');

        // json_decode
        $json = json_decode($plugin->params, true);

        array_walk($json, function (&$value, $key) {
            if (is_numeric($value)) {
                $value = $value + 0;
            }
        });

        $data = new StdClass;
        $data->params = $json;

        return $data;
    }

    /**
     * Method to save the form data.
     *
     * @param   array  The form data
     *
     * @return bool True on success
     *
     * @since    2.7
     */
    public function save($data)
    {
        $table = $this->getTable();

        $id = $table->find(array(
            'type' => 'plugin',
            'element' => 'jcemediabox',
            'folder' => 'system',
        ));

        if (!$id) {
            $this->setError('Invalid plugin');
            return false;
        }

        // Load the previous Data
        if (!$table->load($id)) {
            $this->setError($table->getError());
            return false;
        }

        // Bind the data.
        if (!$table->bind($data)) {
            $this->setError($table->getError());
            return false;
        }

        // Check the data.
        if (!$table->check()) {
            $this->setError($table->getError());
            return false;
        }

        // Store the data.
        if (!$table->store()) {
            $this->setError($table->getError());
            return false;
        }

        return true;
    }
}
components/com_jce/models/index.html000060400000000054152453623450013614 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_jce/models/mediabox.xml000060400000000230152453623450014125 0ustar00<?xml version="1.0" encoding="utf-8"?>
<mediabox>
	<help>
		<topic key="admin.mediabox.config" title="WF_MEDIABOX_HELP_CONFIG" />
	</help>
</mediabox>
 components/com_jce/models/fields/searchplugins.php000060400000005463152453623450016456 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Field\PluginsField;
use Joomla\CMS\Language\Text;

class JFormFieldSearchPlugins extends PluginsField
{
    /**
     * The form field type.
     *
     * @var string
     *
     * @since  11.1
     */
    protected $type = 'SearchPlugins';

    /**
     * Method to attach a JForm object to the field.
     *
     * @param   SimpleXMLElement  $element  The SimpleXMLElement object representing the `<field>` 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)
    {
        if (is_string($value) && strpos($value, ',') !== false) {
            $value = explode(',', $value);
        }

        $return = parent::setup($element, $value, $group);

        if ($return) {
            $this->folder = 'search';
            $this->element['useaccess'] = 'true';
        }

        return $return;
    }

    /**
     * Method to get a list of options for a list input.
     *
     * @return array An array of JHtml options
     *
     * @since   11.4
     */
    protected function getOptions()
    {
        $options = array();
        $default = explode(',', $this->default);

        foreach (parent::getOptions() as $item) {
            if (in_array($item->value, $default)) {
                continue;
            }

            // skip "newsfeeds"
            if ($item->value == 'newsfeeds') {
                continue;
            }

            $options[] = $item;
        }

        foreach ($default as $name) {
            if (!is_dir(JPATH_SITE . '/components/com_jce/editor/extensions/search/adapter/' . $name)) {
                continue;
            }

            $option = new StdClass;

            $option->text = Text::_('PLG_SEARCH_' . strtoupper($name) . '_' . strtoupper($name), true);
            $option->disable = '';
            $option->value = $name;

            $options[] = $option;
        }

        // Merge any additional options in the XML definition.
        return $options;
    }
}
components/com_jce/models/fields/profileordering.php000060400000002565152453623450017001 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Form\Field\OrderingField;

/**
 * Supports an HTML select list of plugins.
 *
 * @since       1.6
 */
class JFormFieldProfileordering extends OrderingField
{
    /**
     * The form field type.
     *
     * @var string
     *
     * @since   1.6
     */
    protected $type = 'Profileordering';

    /**
     * Builds the query for the ordering list.
     *
     * @return JDatabaseQuery The query for the ordering form field
     */
    protected function getQuery()
    {
        $db = Factory::getDbo();

        // Build the query for the ordering list.
        $query = $db->getQuery(true)
            ->select(array($db->quoteName('ordering', 'value'), $db->quoteName('name', 'text'), $db->quote('id')))
            ->from($db->quoteName('#__wf_profiles'))
            ->order('ordering');

        return $query;
    }

    /**
     * Retrieves the current Item's Id.
     *
     * @return int The current item ID
     */
    protected function getItemId()
    {
        return (int) $this->form->getValue('id');
    }
}
components/com_jce/models/fields/filesystempath.php000060400000007040152453623450016641 0ustar00<?php

/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2026 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Field\TextField;

class JFormFieldFilesystemPath extends TextField
{

    /**
     * The form field type.
     *
     * @var    string
     *
     * @since  2.8
     */
    protected $type = 'FilesystemPath';

    /**
     * Method to attach a JForm object to the field.
     *
     * @param   SimpleXMLElement  $element  The SimpleXMLElement object representing the <field /> 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 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.
     *
     * @since   2.8
     */
    public function setup(SimpleXMLElement $element, $value, $group = null)
    {
        $return = parent::setup($element, $value, $group);

        return $return;
    }

    /**
     * Method to get the field input markup.
     *
     * @return  string  The field input markup.
     *
     * @since   11.1
     */
    protected function getInput()
    {
        $values = $this->value;
        $path   = '';

        // Step 1: If it's an array, flatten the "first meaningful" item.
        if (is_array($values) && !empty($values)) {
            
            // If it's an associative array already (eg: ['path' => 'images']), use it as-is.
            if (array_key_exists('path', $values)) {
                $values = [$values];
            } else {
                // Otherwise take the first non-empty item (eg: first JSON string in the array)
                $values = reset($values);
            }
        }

        // Step 2: If it's a string, try decode JSON; if not JSON, treat as path string.
        if (is_string($values)) {
            $value = trim(htmlspecialchars_decode($values));

            if ($value !== '') {
                $decoded = json_decode($value, true);

                if (json_last_error() === JSON_ERROR_NONE && $decoded !== null && $decoded !== []) {
                    $values = $decoded;
                } else {
                    // Not valid JSON -> it’s a plain path
                    $values = [['path' => $value]];
                }
            } else {
                $values = [];
            }
        }

        // Step 3: Extract first path
        if (is_array($values) && !empty($values)) {
            // If decoded to a single associative item, normalise to a list.
            if (array_key_exists('path', $values)) {
                $values = [$values];
            }

            $first = reset($values);

            if (is_array($first) && isset($first['path'])) {
                $path = (string) $first['path'];
            }
        }

        $this->value = $path;

        // collect the layout data...
        $layoutData = $this->getLayoutData();

        // ...and reset the value to the processed value
        $layoutData['value'] = htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8');

        return $this->getRenderer($this->layout)->render($layoutData);
    }
}components/com_jce/models/fields/fonts.php000060400000010101152453623450014721 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Field\CheckboxesField;
use Joomla\CMS\Language\Text;

class JFormFieldFonts extends CheckboxesField
{
    /**
     * The form field type.
     *
     * @var string
     *
     * @since  11.1
     */
    protected $type = 'Fonts';

    /**
     * Name of the layout being used to render the field
     *
     * @var    string
     * @since  3.5
     */
    protected $layout = 'form.field.fonts';

    /**
     * Flag to tell the field to always be in multiple values mode.
     *
     * @var    boolean
     * @since  11.1
     */
    protected $forceMultiple = false;

    private static $fonts = array(
        'Andale Mono' => 'andale mono,times',
        'Arial' => 'arial,helvetica,sans-serif',
        'Arial Black' => 'arial black,avant garde',
        'Book Antiqua' => 'book antiqua,palatino',
        'Comic Sans MS' => 'comic sans ms,sans-serif',
        'Courier New' => 'courier new,courier',
        'Georgia' => 'georgia,palatino',
        'Helvetica' => 'helvetica',
        'Impact' => 'impact,chicago',
        'Symbol' => 'symbol',
        'Tahoma' => 'tahoma,arial,helvetica,sans-serif',
        'Terminal' => 'terminal,monaco',
        'Times New Roman' => 'times new roman,times',
        'Trebuchet MS' => 'trebuchet ms,geneva',
        'Verdana' => 'verdana,geneva',
        'Webdings' => 'webdings',
        'Wingdings' => 'wingdings,zapf dingbats',
    );

    /**
     * Allow to override renderer include paths in child fields
     *
     * @return  array
     *
     * @since   3.5
     */
    protected function getLayoutPaths()
    {
        return array(JPATH_ADMINISTRATOR . '/components/com_jce/layouts', JPATH_SITE . '/layouts');
    }

    protected function getOptions()
    {
        $fieldname = preg_replace('/[^a-zA-Z0-9_\-]/', '_', $this->fieldname);
        $options = array();

        if (is_string($this->value)) {
            $this->value = json_decode(htmlspecialchars_decode($this->value), true);
        }

        // cast to array
        $this->value = (array) $this->value;

        $fonts = array();

        // map associative array to array of key value pairs
        foreach ($this->value as $key => $value) {
            if (is_numeric($key) && is_array($value)) {
                $fonts[] = $value;
            } else {
                $fonts[] = array($key => $value);
            }
        }
        // array of font names to exclude from default list
        $exclude = array();
        // array of custom font key/value pairs
        $custom = array();

        foreach ($fonts as $font) {
            list($text) = array_keys($font);
            list($value) = array_values($font);

            // add to $exclude array
            $exclude[] = $text;

            $value = htmlspecialchars_decode($value, ENT_QUOTES);

            $isCustom = !in_array($value, array_values(self::$fonts));

            $item = array(
                'value' => $value,
                'text' => Text::alt($text, $fieldname),
                'checked' => true,
                'custom' => $isCustom,
            );

            $item = (object) $item;

            if ($isCustom) {
                $custom[] = $item;
            } else {
                $options[] = $item;
            }
        }

        $checked = empty($exclude) ? true : false;

        // assign empty (unchecked) options for unused fonts
        foreach (self::$fonts as $text => $value) {

            if (in_array($text, $exclude)) {
                continue;
            }

            $tmp = array(
                'value' => $value,
                'text' => Text::alt($text, $fieldname),
                'checked' => $checked,
                'custom' => false,
            );

            $options[] = (object) $tmp;
        }

        return array_merge($options, $custom);
    }
}
components/com_jce/models/fields/yesno.php000060400000002677152453623450014750 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Field\RadioField;

class JFormFieldYesNo extends RadioField
{
    /**
     * The form field type.
     *
     * @var string
     *
     * @since  11.1
     */
    protected $type = 'YesNo';

    /**
     * Method to attach a JForm object to the field.
     *
     * @param SimpleXMLElement $element The SimpleXMLElement object representing the <field /> 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 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 bool True on success
     *
     * @since   11.1
     */
    public function setup(SimpleXMLElement $element, $value, $group = null)
    {
        $return = parent::setup($element, $value, $group);

        $this->class = trim($this->class . ' btn-group btn-group-yesno');

        return $return;
    }
}
components/com_jce/models/fields/uploadmaxsize.php000060400000006273152453623450016474 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Field\NumberField;
use Joomla\CMS\Language\Text;

/**
 * Form Field class for the Joomla Platform.
 * Supports a one line text field.
 *
 * @link        http://www.w3.org/TR/html-markup/input.text.html#input.text
 * @since       11.1
 */
class JFormFieldUploadMaxSize extends NumberField
{
    /**
     * The form field type.
     *
     * @var string
     *
     * @since  11.1
     */
    protected $type = 'uploadmaxsize';

    /**
     * Method to get the field input markup.
     *
     * @return string The field input markup
     *
     * @since   11.1
     */
    protected function getInput()
    {
        $max = $this->getUploadValue();

        $this->max = (int) $max;
        $this->class = trim($this->class . ' input-small');

        $html = '<div class="input-append input-group">';
        $html .= parent::getInput();
        $html .= '  <div class="input-group-append">';
        $html .= '      <span class="add-on input-group-text">Kb</span>';
        $html .= '  </div>';
        $html .= '	<small class="help-inline form-text">&nbsp;<em>' . Text::_('WF_SERVER_UPLOAD_SIZE') . ' : ' . (string) $max . '</em></small>';
        $html .= '</div>';

        return $html;
    }

    public function getUploadValue()
    {
        $upload = trim(ini_get('upload_max_filesize'));
        $post = trim(ini_get('post_max_size'));

        $upload = $this->convertValue($upload);
        $post = $this->convertValue($post);

        if (intval($post) === 0) {
            return $upload;
        }

        if (intval($upload) < intval($post)) {
            return $upload;
        }

        return $post;
    }

    public function convertValue($value)
    {
        $unit = 'KB';
        $prefix = '';

        preg_match('#([0-9]+)\s?([a-z]*)#i', $value, $matches);

        // get unit
        if (isset($matches[2])) {
            $prefix = $matches[2];

            // extract first character only, eg: g, m, k
            if ($prefix) {
                $prefix = strtolower($prefix[0]);
            }
        }

        // get value
        if (isset($matches[1])) {
            $value = (int) $matches[1];
        }

        $value = intval($value);

        // Convert to bytes
        switch ($prefix) {
            case 'g':
                $value *= 1073741824;
                break;
            case 'm':
                $value *= 1048576;
                break;
            case 'k':
                $value *= 1024;
                break;
        }

        // Convert to unit value
        switch (strtolower($unit[0])) {
            case 'g':
                $value /= 1073741824;
                break;
            case 'm':
                $value /= 1048576;
                break;
            case 'k':
                $value /= 1024;
                break;
        }

        if ($unit) {
            return (int) $value . ' ' . $unit;
        }

        return 0;
    }
}
components/com_jce/models/fields/plugin.php000060400000007264152453623450015106 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Form\Field\FilelistField;

class JFormFieldPlugin extends FilelistField
{
    /**
     * The form field type.
     *
     * @var string
     *
     * @since  11.1
     */
    protected $type = 'Plugin';

    /**
     * Method to attach a JForm object to the field.
     *
     * @param SimpleXMLElement $element The SimpleXMLElement object representing the <field /> 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 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 bool True on success
     *
     * @since   11.1
     */
    public function setup(SimpleXMLElement $element, $value, $group = null)
    {
        $return = parent::setup($element, $value, $group);

        return $return;
    }

    /**
     * Method to get the field input markup.
     *
     * @return string The field input markup
     *
     * @since   11.1
     */
    protected function getInput()
    {
        $value = $this->value;

        // decode json string
        if (!empty($value) && is_string($value)) {
            $value = json_decode($value, true);
        }

        // default
        if (empty($value)) {
            $type = $this->default;
            $path = '';
        }

        $plugins = $this->getPlugins();

        $html = '<div class="span9">';
        foreach ($plugins as $plugin) {
            $name = (string) str_replace($this->name . '-', '', $plugin->element);

            $form = Form::getInstance('plg_jce_' . $plugin->element, $plugin->manifest, array('control' => $this->name . '[' . $name . ']'), true, '//extension');

            if ($form) {
                $html .= $form->renderFieldset('extension.' . $name . '.' . $name);
            }
        }

        $html .= '</div>';

        return $html;
    }

    /**
     * Method to get the field options.
     *
     * @return array The field option objects
     *
     * @since   11.1
     */
    protected function getPlugins()
    {
        static $plugins;

        if (!isset($plugins)) {
            $language = Factory::getLanguage();

            $db = Factory::getDbo();
            $query = $db->getQuery(true)
                ->select('name, element')
                ->from('#__extensions')
                ->where('enabled = 1')
                ->where('type =' . $db->quote('plugin'))
                ->where('state IN (0,1)')
                ->where('folder = ' . $db->quote('jce'))
                ->where('element LIKE ' . $db->quote($this->name . '-%'))
                ->order('ordering');

            $plugins = $db->setQuery($query)->loadObjectList();

            foreach ($plugins as $plugin) {
                $name = str_replace($this->name, '', $plugin->element);

                // load language file
                $language->load('plg_jce_' . $this->name . '_' . $name, JPATH_ADMINISTRATOR);

                // create manifest path
                $plugin->manifest = JPATH_PLUGINS . '/jce/' . $plugin->element . '/' . $plugin->element . '.xml';
            }
        }

        return $plugins;
    }
}
components/com_jce/models/fields/customlist.php000060400000004375152453623450016016 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Field\ListField;

class JFormFieldCustomList extends ListField
{
    /**
     * The form field type.
     *
     * @var string
     *
     * @since  11.1
     */
    protected $type = 'CustomList';

    /**
     * Method to attach a JForm object to the field.
     *
     * @param SimpleXMLElement $element The SimpleXMLElement object representing the <field /> 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 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 bool True on success
     *
     * @since   11.1
     */
    public function setup(SimpleXMLElement $element, $value, $group = null)
    {
        $return = parent::setup($element, $value, $group);

        $this->class = trim($this->class . ' com_jce_select_custom');

        return $return;
    }

    protected function getOptions()
    {
        $options = parent::getOptions();

        $this->value = is_array($this->value) ? $this->value : explode(',', $this->value);

        $custom = array();

        foreach ($this->value as $value) {
            $tmp = array(
                'value' => $value,
                'text' => $value,
                'selected' => true,
            );

            $found = false;

            foreach ($options as $option) {
                if ($option->value === $value) {
                    $found = true;
                }
            }

            if (!$found) {
                $custom[] = (object) $tmp;
            }
        }

        // Merge any additional options in the XML definition.
        $options = array_merge($options, $custom);

        return $options;
    }
}
components/com_jce/models/fields/extension.php000060400000000215152453623450015611 0ustar00<?php

defined('JPATH_PLATFORM') or die;

JFormHelper::loadFieldClass('filetype');

class JFormFieldExtension extends JFormFieldFiletype
{

}components/com_jce/models/fields/keyvalue.php000060400000017100152453623450015423 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Form;
use Joomla\CMS\Form\FormField;
use Joomla\CMS\Language\Text;

class JFormFieldKeyValue extends FormField
{

    /**
     * The form field type.
     *
     * @var    string
     *
     * @since  2.8
     */
    protected $type = 'KeyValue';

    /**
     * Method to attach a JForm object to the field.
     *
     * @param   SimpleXMLElement  $element  The SimpleXMLElement object representing the <field /> 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 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.
     *
     * @since   2.8
     */
    public function setup(SimpleXMLElement $element, $value, $group = null)
    {
        $return = parent::setup($element, $value, $group);

        return $return;
    }

    /**
     * Method to get the field input markup.
     *
     * @return  string  The field input markup.
     *
     * @since   11.1
     */
    protected function getInput()
    {
        $values = $this->value;

        if (is_string($values) && !empty($values)) {
            $value = htmlspecialchars_decode($this->value);
            $value = html_entity_decode($value, ENT_QUOTES | ENT_HTML5, 'UTF-8');

            $values = json_decode($value, true);

            // not valid json
            if (empty($values) || json_last_error() !== JSON_ERROR_NONE) {
                $values = array();

                // If the value is a string with key-value pairs, convert it to an array
                if (strpos($value, ':') !== false && strpos($value, '{') === false) {
                    foreach (explode(',', $value) as $item) {
                        $pair = explode(':', $item);

                        array_walk($pair, function (&$val) {
                            $val = trim($val, chr(0x22) . chr(0x27) . chr(0x38));
                        });

                        $values[] = array(
                            'name' => $pair[0],
                            'value' => $pair[1],
                        );
                    }
                } else {
                    // where the value is a string with no key-value pairs, use only the "name" key
                    $values = array(
                        array(
                            'name' => $value,
                            'value' => '',
                        ),
                    );
                }
            }
        }

        // default
        if (empty($values)) {
            $values = array(
                array(
                    'name' => '',
                    'value' => '',
                ),
            );
        }

        $subForm = new Form($this->name, array('control' => $this->formControl));

        $children = (array) $this->element->children();

        // if field has defined children
        if (count($children)) {
            $children = $this->element->children();

            $subForm->load($children, true);
            $subForm->setFields($children);
        } else {
            $label = $this->element['label'];

            $xml = '<form><fields name="' . $this->name . '">';

            $keyName = 'name';
            $keyLabel = 'WF_LABEL_NAME';

            if (isset($this->element['keyName'])) {
                $keyName = $this->element['keyName'];
            }

            if (isset($this->element['keyLabel'])) {
                $keyLabel = htmlspecialchars($this->element['keyLabel'], ENT_QUOTES, 'UTF-8');
            }

            $xml .= '<field name="' . $keyName . '" type="text" label="' . $keyLabel . '" description="" />';

            $valueName = 'value';
            $valueLabel = 'WF_LABEL_VALUE';

            if (isset($this->element['valueName'])) {
                $valueName = $this->element['valueName'];
            }

            if (isset($this->element['valueLabel'])) {
                $valueLabel = htmlspecialchars($this->element['valueLabel'], ENT_QUOTES, 'UTF-8');
            }

            $xml .= '<field name="' . $valueName . '" type="text" label="' . $valueLabel . '" description="" />';

            if ($this->element['boolean']) {
                $xml .= '<field name="boolean" type="checkbox" class="wf-keyvalue-boolean" label="' . Text::_('WF_LABEL_BOOLEAN') . '" description="" />';
            }

            $xml .= '</fields></form>';

            $subForm->load($xml);
        }

        $fields = $subForm->getFieldset();

        // And finaly build a main container
        $str = array();

        $sortable = '';

        if (isset($this->element['sortable'])) {
            $sortable = ' data-sortable="' . $this->element['sortable'] . '"';
        }

        $str[] = '<div class="form-field-repeatable"' . $sortable . '>';

        // the default field names for the key-value pairs
        $fieldItem = array('name', 'value');

        foreach ($values as $value) {
            $str[] = '<div class="form-field-repeatable-item wf-keyvalue">';
            $str[] = '  <div class="form-field-repeatable-item-group well p-4 card">';

            $n = 0;

            foreach ($fields as $field) {
                $tmpField = clone $field;

                $tmpField->element['multiple'] = true;

                $name = (string) $tmpField->element['name'];

                $val = is_array($value) && isset($value[$name]) ? $value[$name] : '';

                // if the original value is a string and does not match the field name, use the default field item name
                if (!isset($value[$name]) && is_string($this->value)) {
                    $key = $fieldItem[$n] ?? '';

                    if ($key) {
                        $val = $value[$key] ?? '';
                    }
                }

                // escape value
                $tmpField->value = htmlspecialchars_decode($val);

                $tmpField->setup($tmpField->element, $tmpField->value, $this->group);

                // reset id
                $tmpField->id .= '_' . $n;

                // reset name
                $tmpField->name = $name;

                $str[] = $tmpField->renderField(array('description' => $tmpField->description));

                $n++;
            }

            $str[] = '  </div>';

            $str[] = '  <div class="form-field-repeatable-item-control">';
            $str[] = '      <button class="btn btn-link form-field-repeatable-add" aria-label="' . Text::_('JGLOBAL_FIELD_ADD') . '"><i class="icon icon-plus pull-right float-right"></i></button>';
            $str[] = '      <button class="btn btn-link form-field-repeatable-remove" aria-label="' . Text::_('JGLOBAL_FIELD_REMOVE') . '"><i class="icon icon-trash pull-right float-right"></i></button>';
            $str[] = '  </div>';

            $str[] = '</div>';
        }

        if (!empty($this->value)) {
            $this->value = htmlspecialchars(json_encode($values));
        }

        $str[] = '<input type="hidden" name="' . $this->name . '" value="' . $this->value . '" />';

        $str[] = '</div>';

        return implode("", $str);
    }
}
components/com_jce/models/fields/styleformat.php000060400000010600152453623450016145 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Form;
use Joomla\CMS\Form\FormField;
use Joomla\CMS\Language\Text;

/**
 * Renders a select element.
 */
class JFormFieldStyleFormat extends FormField
{
    /*
     * Element type
     *
     * @access    protected
     * @var        string
     */
    protected $type = 'StyleFormat';

    private function loadSubForm()
    {
        $subForm = new Form($this->name);
        
        // editor manifest
        $manifest = JPATH_ADMINISTRATOR . '/components/com_jce/models/forms/styleformat.xml';
        $xml = simplexml_load_file($manifest);
        $subForm->load($xml);

        return $subForm;
    }

    private function renderFields($form, $item)
    {
        $fields = $form->getFieldset();
        
        $data = array();

        foreach ($fields as $field) {
            $tmpField = clone $field;
            
            $key = (string) $tmpField->element['name'];

            // default value
            $tmpField->value = "";

            if (array_key_exists($key, $item)) {
                $tmpField->value = htmlspecialchars_decode($item[$key], ENT_QUOTES);
            }

            $tmpField->setup($tmpField->element, $tmpField->value, $this->group);
            $tmpField->id = '';
            $tmpField->name = '';

            $data[] = '<div class="styleformat-item-' . $key . '" data-key="' . $key . '">' . $tmpField->renderField(array('description' => $tmpField->description)) . '</div>';
        }

        return implode('', $data);
    }

    protected function getInput()
    {
        $wf = WFApplication::getInstance();

        $output = array();

        // default item list (remove "attributes" for now)
        $default = array('title' => '', 'element' => '', 'selector' => '', 'classes' => '', 'styles' => '', 'attributes' => '');

        // pass to items
        $items = $this->value;

        if (is_string($items)) {
            $items = json_decode(htmlspecialchars_decode($this->value), true);
        }

        // cast to array
        $items = (array) $items;

        /* Convert legacy styles */
        $theme_advanced_styles = $wf->getParam('editor.theme_advanced_styles', '');

        if (!empty($theme_advanced_styles)) {
            foreach (explode(',', $theme_advanced_styles) as $styles) {
                $style = json_decode('{' . preg_replace('#([^=]+)=([^=]+)#', '"title":"$1","classes":"$2"', $styles) . '}', true);

                if ($style) {
                    $items[] = $style;
                }
            }
        }

        // create default array if no items
        if (empty($items)) {
            $items = array($default);
        }

        $output[] = '<div class="styleformat-list">';

        $x = 0;

        $subForm = $this->loadSubForm();

        foreach ($items as $item) {
            $elements = array('<div class="styleformat border bg-light-subtle">');

            $elements[] = $this->renderFields($subForm, $item);

            $elements[] = '<div class="styleformat-header">';

            // handle
            $elements[] = '<span class="styleformat-item-handle"></span>';
            // delete button
            $elements[] = '<button class="styleformat-item-trash btn btn-link"><i class="icon icon-trash"></i></button>';
            // collapse
            $elements[] = '<button class="close collapse btn btn-link"><i class="icon icon-chevron-up"></i><i class="icon icon-chevron-down"></i></button>';

            $elements[] = '</div>';

            $elements[] = '</div>';

            $output[] = implode('', $elements);

            $x++;
        }

        $output[] = '<button class="btn btn-link styleformat-item-plus border"><span class="text-left">' . Text::_('WF_STYLEFORMAT_NEW') . '</span><i class="icon icon-plus"></i></button>';

        // hidden field
        $output[] = '<input type="hidden" name="' . $this->name . '" value="" />';

        if (!empty($theme_advanced_styles)) {
            $output[] = '<input type="hidden" name="' . $this->getName('theme_advanced_styles') . '" value="" class="isdirty" />';
        }

        $output[] = '</div>';

        return implode("\n", $output);
    }
}components/com_jce/models/fields/filesystem.php000060400000011223152453623450015762 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Field\ListField;
use Joomla\CMS\Form\Form;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;

class JFormFieldFilesystem extends ListField
{
    /**
     * The form field type.
     *
     * @var string
     *
     * @since  11.1
     */
    protected $type = 'Filesystem';

    /**
     * Method to attach a JForm object to the field.
     *
     * @param SimpleXMLElement $element The SimpleXMLElement object representing the <field /> 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 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 bool True on success
     *
     * @since   11.1
     */
    public function setup(SimpleXMLElement $element, $value, $group = null)
    {
        $return = parent::setup($element, $value, $group);

        return $return;
    }

    /**
     * Method to get the field input markup.
     *
     * @return string The field input markup
     *
     * @since   11.1
     */
    protected function getInput()
    {
        $value = $this->value;

        // decode json string
        if (!empty($value) && is_string($value)) {
            $value = json_decode($value, true);
        }

        // default
        if (empty($value)) {
            $value = array('name' => $this->default);
        } else {
            if (!isset($value['name'])) {
                $value['name'] = $this->default;
            }
        }

        $plugins = $this->getPlugins();
        $options = $this->getOptions();

        $html = '';
        $html .= '<div class="controls-row">';

        $html .= '<div class="control-group">';
        $html .= HTMLHelper::_('select.genericlist', $options, $this->name . '[name]', 'data-toggle="filesystem-options" class="custom-select"', 'value', 'text', $value['name']);
        $html .= '</div>';

        $html .= '<div class="filesystem-options clearfix">';

        foreach ($plugins as $plugin) {
            $form = Form::getInstance('plg_jce_' . $this->name . '_' . $plugin->name, $plugin->manifest, array('control' => $this->name . '[' . $plugin->name . ']'), true, '//extension');

            if ($form) {
                // get the data for this form, if set
                $data = isset($value[$plugin->name]) ? $value[$plugin->name] : array();

                // bind data to form
                $form->bind($data);

                $html .= '<div class="well well-small p-3 card" data-toggle-target="filesystem-options-' . $plugin->name . '">';

                $fields = $form->getFieldset('filesystem.' . $plugin->name);

                foreach ($fields as $field) {
                    $html .= $field->renderField(array('description' => $field->description));
                }

                $html .= '</div>';
            }
        }

        $html .= '</div>';
        $html .= '</div>';

        return $html;
    }

    /**
     * Method to get the field options.
     *
     * @return array The field option objects
     *
     * @since   11.1
     */
    protected function getPlugins()
    {
        static $plugins;

        if (!isset($plugins)) {
            $plugins = JcePluginsHelper::getExtensions('filesystem');
        }

        return $plugins;
    }

    /**
     * Method to get the field options.
     *
     * @return array The field option objects
     *
     * @since   11.1
     */
    protected function getOptions()
    {
        $fieldname = preg_replace('/[^a-zA-Z0-9_\-]/', '_', $this->fieldname);

        $options = parent::getOptions();

        $plugins = $this->getPlugins();

        foreach ($plugins as $plugin) {
            $value = (string) $plugin->name;
            $text = (string) $plugin->title;

            $tmp = array(
                'value' => $value,
                'text' => Text::alt($text, $fieldname),
                'disable' => false,
                'class' => '',
                'selected' => false,
            );

            // Add the option object to the result set.
            $options[] = (object) $tmp;
        }

        reset($options);

        return $options;
    }
}
components/com_jce/models/fields/components.php000060400000005300152453623450015762 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('JPATH_PLATFORM') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Form\Field\ListField;
use Joomla\CMS\Language\Text;

/**
 * Form Field class for the Joomla Framework.
 *
 * @since       11.4
 */
class JFormFieldComponents extends ListField
{
    /**
     * The field type.
     *
     * @var string
     *
     * @since  11.4
     */
    protected $type = 'Components';

    /**
     * Method to get a list of options for a list input.
     *
     * @return array An array of JHtml options
     *
     * @since   11.4
     */
    protected function getOptions()
    {
        $language = Factory::getLanguage();

        $exclude = array(
            'com_admin',
            'com_cache',
            'com_checkin',
            'com_config',
            'com_cpanel',
            'com_fields',
            'com_finder',
            'com_installer',
            'com_jce',
            'com_languages',
            'com_login',
            'com_mailto',
            'com_menus',
            'com_media',
            'com_messages',
            'com_newsfeeds',
            'com_plugins',
            'com_redirect',
            'com_templates',
            'com_users',
            'com_wrapper',
            'com_search',
            'com_user',
            'com_updates',
        );

        // Get list of plugins
        $db = Factory::getDbo();
        $query = $db->getQuery(true)
            ->select('element AS value, name AS text')
            ->from('#__extensions')
            ->where('type = ' . $db->quote('component'))
            ->where('enabled = 1')
            ->order('ordering, name');
        $db->setQuery($query);

        $components = $db->loadObjectList();

        $options = array();

        // load component languages
        for ($i = 0; $i < count($components); ++$i) {
            if (!in_array($components[$i]->value, $exclude)) {
                // load system language file
                $language->load($components[$i]->value . '.sys', JPATH_ADMINISTRATOR);
                $language->load($components[$i]->value, JPATH_ADMINISTRATOR);

                // translate name
                $components[$i]->text = Text::_($components[$i]->text, true);

                $components[$i]->disable = '';

                $options[] = $components[$i];
            }
        }

        // Merge any additional options in the XML definition.
        return array_merge(parent::getOptions(), $options);
    }
}
components/com_jce/models/fields/componentslist.php000060400000005450152453623450016664 0ustar00<?php

/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Form\Field\ListField;
use Joomla\CMS\Language\Text;
use Joomla\Utilities\ArrayHelper;

/**
 * Form Field class for the Joomla Framework.
 *
 * @since       11.4
 */
class JFormFieldComponentsList extends ListField
{
    /**
     * The field type.
     *
     * @var string
     *
     * @since  11.4
     */
    protected $type = 'ComponentsList';

    /**
     * Method to get a list of options for a list input.
     *
     * @return array An array of JHtml options
     *
     * @since   11.4
     */
    protected function getOptions()
    {
        $language = Factory::getLanguage();

        $exclude = array(
            'com_admin',
            'com_cache',
            'com_checkin',
            'com_config',
            'com_cpanel',
            'com_fields',
            'com_finder',
            'com_installer',
            'com_languages',
            'com_login',
            'com_mailto',
            'com_menus',
            'com_media',
            'com_messages',
            'com_newsfeeds',
            'com_plugins',
            'com_redirect',
            'com_templates',
            'com_users',
            'com_wrapper',
            'com_search',
            'com_user',
            'com_updates',
        );

        // Get list of plugins
        $db = Factory::getDbo();
        $query = $db->getQuery(true)
            ->select('element AS value, name AS text')
            ->from('#__extensions')
            ->where('type = ' . $db->quote('component'))
            ->where('enabled = 1')
            ->order('ordering, name');
        $db->setQuery($query);

        $items = $db->loadObjectList();

        $options = array();

        foreach ($items as $item) {
            // Load language
            $extension = $item->value;

            $language->load("$extension.sys", JPATH_ADMINISTRATOR)
                || $language->load("$extension.sys", JPATH_ADMINISTRATOR . '/components/' . $extension);

            $text = strtoupper($item->text);

            if ($text === 'COM_JCE') {
                $text = 'WF_CPANEL_BROWSER';
            }

            // Translate component name
            $item->text = Text::_($text);

            $options[] = $item;
        }

        // Sort by component name
        $options = ArrayHelper::sortObjects($options, 'text', 1, true, true);

        // Merge any additional options in the XML definition.
        $options = array_merge(parent::getOptions(), $options);

        return $options;
    }
}
components/com_jce/models/fields/mediajce.php000060400000006331152453623450015343 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Field\MediaField;

/**
 * Provides a modal media selector field for the JCE File Browser
 *
 * @since  2.6.17
 */
class JFormFieldMediaJce extends MediaField
{
    /**
     * The form field type.
     *
     * @var    string
     */
    protected $type = 'MediaJce';

    /**
     * Layout to render
     *
     * @var    string
     * @since  3.5
     */
    protected $layout = 'joomla.form.field.media';

    /**
     * Default mediatype
     *
     * @var    string
     * @since  2.9.39
     */
    protected $mediatype;

    /**
     * Method to attach a JForm object to the field.
     *
     * @param   SimpleXMLElement  $element  The SimpleXMLElement object representing the `<field>` 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()
     */
    public function setup(SimpleXMLElement $element, $value, $group = null)
    {
        $result = parent::setup($element, $value, $group);

        if ($result === true) {
            $this->mediatype = isset($this->element['mediatype']) ? (string) $this->element['mediatype'] : 'images';

            if (!isset($this->element['converted'])) {
                $this->element['converted'] = 0;
            }
        }

        return $result;
    }

    /**
     * Get the data that is going to be passed to the layout
     *
     * @return  array
     */
    public function getLayoutData()
    {
        require_once JPATH_ADMINISTRATOR . '/components/com_jce/helpers/browser.php';

        $config = array(
            'element' => $this->id,
            'mediatype' => strtolower($this->mediatype),
            'converted' => (int) $this->element['converted'] ? true : false,
        );

        if (isset($this->element['plugin'])) {
            $config['plugin'] = (string) $this->element['plugin'];
        }

        // Get the basic field data
        $data = parent::getLayoutData();

        $this->link = WFBrowserHelper::getMediaFieldUrl($config);

        // not a valid file browser link
        if (!$this->link) {
            return $data;
        }
        
        $options = WFBrowserHelper::getMediaFieldOptions($config);

        $extraData = array(
            'link' => $this->link,
            'class' => $this->element['class'] . ' input-medium wf-media-input wf-media-input-active',
        );

        if ($options['upload'] == 1) {
            $extraData['class'] .= ' wf-media-input-upload';
        }

        return array_merge($data, $extraData);
    }
}
components/com_jce/models/fields/heading.php000060400000004027152453623450015201 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\FormField;
use Joomla\CMS\Language\Text;

class JFormFieldHeading extends FormField
{
    /**
     * The form field type.
     *
     * @var string
     *
     * @since  11.1
     */
    protected $type = 'Heading';

    /**
     * Method to get the field input markup for a spacer.
     * The spacer does not have accept input.
     *
     * @return string The field input markup
     *
     * @since   11.1
     */
    protected function getInput()
    {
        return ' ';
    }

    /**
     * Method to get the field label markup for a spacer.
     * Use the label text or name from the XML element as the spacer or
     * Use a hr="true" to automatically generate plain hr markup.
     *
     * @return string The field label markup
     *
     * @since   11.1
     */
    protected function getLabel()
    {
        $html = array();
        $class = !empty($this->class) ? ' class="' . $this->class . '"' : '';
        $html[] = '<h3' . $class . '>';

        // Get the label text from the XML element, defaulting to the element name.
        $text = $this->element['label'] ? (string) $this->element['label'] : (string) $this->element['name'];
        $text = $this->translateLabel ? Text::_($text) : $text;

        $html[] = $text;

        $html[] = '</h3>';

        // If a description is specified, use it to build a tooltip.
        if (!empty($this->description)) {
            $html[] = '<small>' . Text::_($this->description) . '</small>';
        }

        return implode('', $html);
    }

    /**
     * Method to get the field title.
     *
     * @return string The field title
     *
     * @since   11.1
     */
    protected function getTitle()
    {
        return $this->getLabel();
    }
}
components/com_jce/models/fields/container.php000060400000023312152453623450015562 0ustar00<?php

/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Form;
use Joomla\CMS\Form\FormField;
use Joomla\CMS\Language\Text;

/**
 * Form Field class for the JCE.
 * Display a field with a repeatable set of defined sub fields
 *
 * @since       2.8.13
 */
class JFormFieldContainer extends FormField
{
    /**
     * The form field type.
     *
     * @var    string
     * @since  2.8.13
     */
    protected $type = 'Container';

    /**
     * Method to get the field label markup for a spacer.
     * Use the label text or name from the XML element as the spacer or
     * Use a hr="true" to automatically generate plain hr markup.
     *
     * @return string The field label markup
     *
     * @since   11.1
     */
    protected function getLabel()
    {
        return '';
    }

    // Function to check if two arrays are equal
    private function arraysEqual($arr1, $arr2)
    {
        if (count($arr1) !== count($arr2)) {
            return false;
        }

        for ($i = 0; $i < count($arr1); $i++) {
            if ($arr1[$i] !== $arr2[$i]) {
                return false;
            }
        }

        return true;
    }

    // Function to check if an array exists within another array of arrays
    private function arrayExistsInContainer($container, $array)
    {
        foreach ($container as $containedArray) {
            if ($this->arraysEqual($containedArray, $array)) {
                return true;
            }
        }

        return false;
    }

    /**
     * Build a subform from a container <field> but strip nested <field> descendants.
     *
     * @param  SimpleXMLElement $container  The <field type="container" ...> element (eg. $this->element)
     * @param  array            $data       Data to bind
     * @param  string           $control    Control name
     * @param  string           $name       Form name
     * @return \Joomla\CMS\Form\Form
     */
    private function buildContainerSubForm(SimpleXMLElement $container, array $data, string $control, string $name)
    {
        // Create a minimal wrapper <form><fields/></form>
        $wrapper   = new SimpleXMLElement('<form><fields/></form>');
        $fieldsDst = $wrapper->fields;

        // Take only the container’s *direct* children (field / fieldset)
        // but strip any descendant <field> nodes inside them.
        $directNodes = $container->xpath('./field | ./fieldset');

        // Types that must KEEP their inner <field> schema
        $keepInnerFor = array('repeatable', 'subform'); // add more as needed

        foreach ($directNodes as $node) {
            // Clone the node
            $clone = new SimpleXMLElement($node->asXML());

            $type = (string) $node['type'];

            if (!in_array($type, $keepInnerFor, true)) {
                // Remove ALL descendant <field> nodes from the clone
                foreach ($clone->xpath('.//field') as $desc) {
                    $d = dom_import_simplexml($desc);
                    $d->parentNode->removeChild($d);
                }
            }

            // Append the cleaned clone to the wrapper
            $to   = dom_import_simplexml($fieldsDst);
            $from = dom_import_simplexml($clone);
            $to->appendChild($to->ownerDocument->importNode($from, true));
        }

        // Load the cleaned XML into a new Form (no setFields!)
        $subForm = new Form($name, ['control' => $control]);

        $subForm->load($wrapper);

        // Bind values
        $subForm->bind($data);

        return $subForm;
    }

    /**
     * Method to get the field input markup.
     *
     * @return  string  The field input markup.
     *
     * @since   2.8.13
     */
    protected function getInput()
    {
        $group = $this->group;

        // expand group with container name
        if ($this->element['name']) {
            $group .= '.' . (string) $this->element['name'];
        }

        $children = $this->element->children();

        // extract group data
        $data = $this->form->getData()->get($group);
        // to array
        $data = (array) $data;

        $count = 1;

        $repeatable = (string) $this->element['repeatable'];

        if ($repeatable) {
            // find number of potential repeatable fields
            foreach ($children as $child) {
                $name = (string) $child->attributes()['name'];

                if (isset($data[$name]) && is_array($data[$name])) {
                    $count = max(count($data[$name]), $count);
                }
            }
        }

        // And finaly build a main container
        $str = array();

        if ($this->class == 'inset') {
            $this->class .= ' well well-light p-4 card';
        }

        $str[] = '<div class="form-field-container ' . $this->class . '">';
        $str[] = '<fieldset class="form-field-container-group">';

        if ($this->element['label']) {
            $text = $this->element['label'];
            $text = $this->translateLabel ? Text::_($text) : $text;

            $str[] = '<legend>' . $text . '</legend>';
        }

        if ((string) $this->element['description']) {
            $text = $this->element['description'];
            $text = $this->translateLabel ? Text::_($text) : $text;

            $descriptionClass = isset($this->element['descriptionclass']) ? 'description ' . $this->element['descriptionclass'] : 'description';

            $str[] = '<small class="' . $descriptionClass . '">' . $text . '</small>';

            // reset description
            $this->description = '';
        }

        // repeatable
        if ($repeatable) {
            // collapse
            $str[] = '<div class="form-field-repeatable">';
        }

        $containerValues = array();

        for ($i = 0; $i < $count; $i++) {
            $item = array();

            if ($repeatable) {
                $item[] = '<div class="form-field-repeatable-item well p-3 card my-2">';
                $item[] = '  <div class="form-field-repeatable-item-group">';
            }

            $control = $this->formControl . '[' . str_replace('.', '][', $group) . ']';
            $subForm = $this->buildContainerSubForm($this->element, (array) $data, $control, $this->fieldname);

            $fields = $subForm->getFieldset();

            $defaultValues = array();
            $fieldValues = array();

            foreach ($fields as $field) {
                $tmpField = clone $field;

                $name = (string) $tmpField->element['name'];
                $value = (string) $tmpField->element['default'];

                $defaultValues[] = $value;

                if (empty($name)) {
                    continue;
                }

                if (is_array($data) && isset($data[$name])) {
                    $value = $data[$name];
                }

                $type = (string) $tmpField->element['type'];

                // convert checkboxes value to string
                if ($type == 'checkboxes') {
                    if (is_array($value)) {
                        $value = implode(',', $value);
                    }
                }

                // extract value if this is a repeatable container
                if (is_array($value) && $repeatable) {
                    $value = isset($value[$i]) ? $value[$i] : '';
                }

                // escape values
                if (is_array($value)) {
                    // handle nested arrays
                    array_walk_recursive($value, function (&$item) {
                        if (is_string($item)) {
                            $item = htmlspecialchars($item, ENT_COMPAT, 'UTF-8');
                        }
                    });
                } else {
                    $value = htmlspecialchars($value, ENT_COMPAT, 'UTF-8');
                }

                // store value for repeatable check
                $fieldValues[] = $value;

                $tmpField->value = $value;
                $tmpField->setup($tmpField->element, $tmpField->value);

                if ($repeatable) {
                    // reset id
                    $tmpField->id .= '_' . $i;

                    if (strpos($tmpField->name, '[]') === false) {
                        $tmpField->name .= '[]';
                    }
                }

                $item[] = $tmpField->renderField(array('description' => $tmpField->description));
            }

            if ($repeatable) {
                $item[] = '</div>';

                $item[] = '<div class="form-field-repeatable-item-control">';
                $item[] = '<button class="btn btn-link form-field-repeatable-add" aria-label="' . Text::_('JGLOBAL_FIELD_ADD') . '"><i class="icon icon-plus"></i></button>';
                $item[] = '<button class="btn btn-link form-field-repeatable-remove" aria-label="' . Text::_('JGLOBAL_FIELD_REMOVE') . '"><i class="icon icon-trash"></i></button>';
                $item[] = '</div>';

                $item[] = '</div>';
            }

            // remove empty fields with default values
            if ($count > 1 && $this->arraysEqual($defaultValues, $fieldValues)) {
                continue;
            }

            // only add if unique
            if ($this->arrayExistsInContainer($containerValues, $fieldValues)) {
                continue;
            }

            $str[] = implode('', $item);
            $containerValues[] = $fieldValues;
        }

        // repeatable
        if ($repeatable) {
            $str[] = '</div>';
        }

        $str[] = '</fieldset>';
        $str[] = '</div>';

        return implode("", $str);
    }
}
components/com_jce/models/fields/blockformats.php000060400000005566152453623450016301 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Field\CheckboxesField;
use Joomla\CMS\Language\Text;

class JFormFieldBlockformats extends CheckboxesField
{
    /**
     * The form field type.
     *
     * @var string
     *
     * @since  11.1
     */
    protected $type = 'Blockformats';

    /**
     * Name of the layout being used to render the field
     *
     * @var    string
     * @since  3.5
     */
    protected $layout = 'form.field.blockformats';

    protected static $blockformats = array(
        'p' => 'Paragraph',
        'div' => 'Div',
        'div_container' => 'Div Container',
        'h1' => 'Heading1',
        'h2' => 'Heading2',
        'h3' => 'Heading3',
        'h4' => 'Heading4',
        'h5' => 'Heading5',
        'h6' => 'Heading6',
        'blockquote' => 'Blockquote',
        'address' => 'Address',
        'code' => 'Code',
        'pre' => 'Preformatted',
        'samp' => 'Sample',
        'span' => 'Span',
        'section' => 'Section',
        'article' => 'Article',
        'aside' => 'Aside',
        'header' => 'Header',
        'footer' => 'Footer',
        'nav' => 'Nav',
        'figure' => 'Figure',
        'dl' => 'Definition List',
        'dt' => 'Definition Term',
        'dd' => 'Definition Description'
    );

    /**
     * Allow to override renderer include paths in child fields
     *
     * @return  array
     *
     * @since   3.5
     */
    protected function getLayoutPaths()
    {
        return array(JPATH_ADMINISTRATOR . '/components/com_jce/layouts', JPATH_SITE . '/layouts');
    }

    protected function getOptions()
    {
        $fieldname = preg_replace('/[^a-zA-Z0-9_\-]/', '_', $this->fieldname);
        $options = array();

        if (empty($this->value)) {
            $data = array_keys(self::$blockformats);
            $values = $data;
        } else {
            if (is_string($this->value)) {
                $this->value = explode(',', $this->value);
            }
            $values = $this->value;
            $data = array_unique(array_merge($this->value, array_keys(self::$blockformats)));
        }

        // create default font structure
        foreach ($data as $format) {
            if (array_key_exists($format, self::$blockformats) === false) {
                continue;
            }

            $text = self::$blockformats[$format];

            $tmp = array(
                'value' => $format,
                'text' => Text::alt($text, $fieldname),
                'checked' => in_array($format, $values),
            );

            $options[] = (object) $tmp;
        }

        return $options;
    }
}
components/com_jce/models/fields/popups.php000060400000002375152453623450015134 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Field\ListField;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Language\Text;

class JFormFieldPopups extends ListField
{
    /**
     * The form field type.
     *
     * @var string
     *
     * @since  11.1
     */
    protected $type = 'Popups';

    /**
     * Method to get a list of options for a list input.
     *
     * @return array An array of JHtml options
     *
     * @since   11.4
     */
    protected function getOptions()
    {
        $extensions = JcePluginsHelper::getExtensions('popups');

        $options = array();

        foreach ($extensions as $item) {
            $option = new StdClass;

            $option->text = Text::_($item->title, true);
            $option->disable = '';
            $option->value = $item->name;

            $options[] = $option;
        }

        // Merge any additional options in the XML definition.
        return array_merge(parent::getOptions(), $options);
    }
}
components/com_jce/models/fields/code.php000060400000002305152453623450014511 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Field\TextareaField;

/**
 * Color Form Field class for the Joomla Platform.
 * This implementation is designed to be compatible with HTML5's `<input type="color">`
 *
 * @link   http://www.w3.org/TR/html-markup/input.color.html
 * @since  11.3
 */
class JFormFieldCode extends TextareaField
{
    /**
     * The form field type.
     *
     * @var    string
     * @since  11.3
     */
    protected $type = 'Code';

    /**
     * Name of the layout being used to render the field
     *
     * @var    string
     * @since  3.5
     */
    protected $layout = 'form.field.code';

    /**
     * Allow to override renderer include paths in child fields
     *
     * @return  array
     *
     * @since   3.5
     */
    protected function getLayoutPaths()
    {
        return array(JPATH_ADMINISTRATOR . '/components/com_jce/layouts', JPATH_SITE . '/layouts');
    }
}components/com_jce/models/fields/color.php000060400000002325152453623450014717 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Field\ColorField;

/**
 * Color Form Field class for the Joomla Platform.
 * This implementation is designed to be compatible with HTML5's `<input type="color">`
 *
 * @link   http://www.w3.org/TR/html-markup/input.color.html
 * @since  11.3
 */
class JFormFieldColorPicker extends ColorField
{
    /**
     * The form field type.
     *
     * @var    string
     * @since  11.3
     */
    protected $type = 'ColorPicker';

    /**
     * Name of the layout being used to render the field
     *
     * @var    string
     * @since  3.5
     */
    protected $layout = 'form.field.colorpicker';

    /**
     * Allow to override renderer include paths in child fields
     *
     * @return  array
     *
     * @since   3.5
     */
    protected function getLayoutPaths()
    {
        return array(JPATH_ADMINISTRATOR . '/components/com_jce/layouts', JPATH_SITE . '/layouts');
    }
}
components/com_jce/models/fields/buttons.php000060400000004361152453623450015301 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Field\CheckboxesField;

class JFormFieldButtons extends CheckboxesField
{
    /**
     * The form field type.
     *
     * @var string
     *
     * @since  11.1
     */
    protected $type = 'Buttons';

    /**
     * Name of the layout being used to render the field
     *
     * @var    string
     * @since  3.5
     */
    protected $layout = 'form.field.buttons';

    /**
     * Method to get the field label markup for a spacer.
     * Use the label text or name from the XML element as the spacer or
     * Use a hr="true" to automatically generate plain hr markup.
     *
     * @return string The field label markup
     *
     * @since   11.1
     */
    protected function getLabel()
    {
        return '';
    }

    /**
     * Method to attach a JForm object to the field.
     *
     * @param SimpleXMLElement $element The SimpleXMLElement object representing the <field /> 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 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 bool True on success
     *
     * @since   11.1
     */
    public function setup(SimpleXMLElement $element, $value, $group = null)
    {
        $return = parent::setup($element, $value, $group);

        $this->class = trim($this->class . ' mceDefaultSkin');

        return $return;
    }

    /**
     * Allow to override renderer include paths in child fields
     *
     * @return  array
     *
     * @since   3.5
     */
    protected function getLayoutPaths()
    {
        return array(JPATH_ADMINISTRATOR . '/components/com_jce/layouts', JPATH_SITE . '/layouts');
    }
}
components/com_jce/models/fields/elementlist.php000060400000003716152453623450016133 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Field\ListField;
use Joomla\CMS\Language\Text;

class JFormFieldElementList extends ListField
{
    /**
     * The form field type.
     *
     * @var string
     *
     * @since  11.1
     */
    protected $type = 'ElementList';

    /**
     * Method to get the field options.
     *
     * @return array The field option objects
     *
     * @since   11.1
     */
    protected function getOptions()
    {
        $fieldname = preg_replace('/[^a-zA-Z0-9_\-]/', '_', $this->fieldname);
        $options = array();

        $tags = 'a,abbr,address,area,article,aside,audio,b,bdi,bdo,blockquote,br,button,canvas,caption,cite,code,col,colgroup,data,datalist,dd,del,details,dfn,dialog,div,dl,dt,em,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,i,img,input,ins,kbd,keygen,label,legend,li,main,map,mark,menu,menuitem,meter,nav,noscript,ol,optgroup,option,output,p,param,pre,progress,q,rb,rp,rt,rtc,ruby,s,samp,section,select,small,source,span,strong,sub,summary,sup,table,tbody,td,template,textarea,tfoot,th,thead,time,tr,track,u,ul,var,video,wbr';

        foreach (explode(',', $tags) as $option) {
            $value = (string) $option;
            $text = trim((string) $option);

            $tmp = array(
                'value' => $value,
                'text' => Text::alt($text, $fieldname),
                'disable' => false,
                'class' => '',
                'selected' => false,
                'checked' => false,
            );

            // Add the option object to the result set.
            $options[] = (object) $tmp;
        }

        reset($options);

        return $options;
    }
}
components/com_jce/models/fields/repeatable.php000060400000006756152453623450015721 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Form;
use Joomla\CMS\Form\FormField;
use Joomla\CMS\Language\Text;

/**
 * Form Field class for the JCE.
 * Display a field with a repeatable set of defined sub fields
 *
 * @since       2.7
 */
class JFormFieldRepeatable extends FormField
{
    /**
     * The form field type.
     *
     * @var    string
     * @since  2.7
     */
    protected $type = 'Repeatable';

    /**
     * Method to get the field input markup.
     *
     * @return  string  The field input markup.
     *
     * @since   2.7
     */
    protected function getInput()
    {
        $subForm = new Form($this->name, array('control' => $this->formControl));
        $children = $this->element->children();
        $subForm->load($children);
        $subForm->setFields($children);

        // And finaly build a main container
        $str = array();

        $values = $this->value;

        // explode to array if string
        if (is_string($values)) {
            $values = explode(',', $values);
        }

        $fields = $subForm->getFieldset();

        $str[] = '<div class="form-field-repeatable">';

        $key = 0;

        foreach ($values as $value) {
            $class = '';

            // highlight grouped fields
            if (count($fields) > 1) {
                $class = ' well p-3 card my-2';
            }

            $str[] = '<div class="form-field-repeatable-item">';
            $str[] = '  <div class="form-field-repeatable-item-group' . $class . '">';

            $n = 0;

            foreach ($fields as $field) {
                $tmpField = clone $field;

                $tmpField->element['multiple'] = true;

                // substitute for repeatable element
                if (!isset($tmpField->element['name'])) {
                    $tmpField->element['name'] = (string) $this->element['name'];
                }

                if (is_array($value)) {
                    $value = isset($value[$n]) ? $value[$n] : $value[0];
                }

                // escape value
                $tmpField->value = htmlspecialchars($value, ENT_COMPAT, 'UTF-8');

                $tmpField->setup($tmpField->element, $tmpField->value, $this->group);
                
                // reset id
                $tmpField->id = $field->id .= '_' . $key;

                // add as form array
                if (strpos($tmpField->name, '[]') === false) {
                    $tmpField->name .= '[]';
                }
        
                $str[] = $tmpField->renderField(array('description' => $field->description));

                $n++;
            }

            $str[] = '  </div>';

            $str[] = '  <div class="form-field-repeatable-item-control">';
            $str[] = '      <button class="btn btn-link form-field-repeatable-add" aria-label="' . Text::_('JGLOBAL_FIELD_ADD') . '"><i class="icon icon-plus"></i></button>';
            $str[] = '      <button class="btn btn-link form-field-repeatable-remove" aria-label="' . Text::_('JGLOBAL_FIELD_REMOVE') . '"><i class="icon icon-trash"></i></button>';
            $str[] = '  </div>';

            $str[] = '</div>';

            $key++;
        }

        $str[] = '</div>';

        return implode("", $str);
    }
}
components/com_jce/models/fields/filetype.php000060400000023067152453623450015430 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Field\TextField;
use Joomla\CMS\Language\Text;

class JFormFieldFiletype extends TextField
{
    /**
     * The form field type.
     *
     * @var string
     *
     * @since  11.1
     */
    protected $type = 'Filetype';

    /**
     * The default value for the field.
     *
     * @var string
     */
    protected $defaultValue = '';

    /**
     * Method to attach a JForm object to the field.
     *
     * @param SimpleXMLElement $element The SimpleXMLElement object representing the <field /> 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 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 bool True on success
     *
     * @since   11.1
     */
    public function setup(SimpleXMLElement $element, $value, $group = null)
    {
        $return = parent::setup($element, $value, $group);

        return $return;
    }

    private static function array_flatten($array, $return)
    {
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                $return = self::array_flatten($value, $return);
            } else {
                $return[] = $value;
            }
        }

        return $return;
    }

    private function mapValue($value, $isGrouped = false)
    {
        $data = array();

        // no grouping
        if (strpos($value, '=') === false) {
            return array(explode(',', $value));
        }

        foreach (explode(';', $value) as $group) {
            $items = explode('=', $group);
            $name = $items[0];
            $values = explode(',', $items[1]);

            array_walk($values, function (&$item) use ($name) {
                if ($name === '-') {
                    $item = '-' . $item;
                }
            });

            if ($isGrouped) {
                $data[$name] = $values;
            } else {
                // remove empty values
                $values = array_filter($values, function ($value) {
                    return !empty($value);
                });

                $data = array_merge($data, $values);
            }
        }

        if (!$isGrouped) {
            $data = array($data);
        }

        return $data;
    }

    private function cleanValue($value)
    {
        $data = $this->mapValue($value);
        // get array values only
        $values = self::array_flatten($data, array());

        // convert to string
        $string = implode(',', $values);

        // return single array
        return explode(',', $string);
    }

    private function getDefaultValues()
    {
        $defaultValues = [
            'default' => [],
        ];

        foreach ($this->element->children() as $element) {
            if ($element->getName() === 'option') {
                $defaultValues['default'][] = (string) $element;
            }

            if ($element->getName() === 'group') {
                $name = (string) $element['label'];

                $defaultValues[$name] = array();

                // Iterate through the children and build an array of options.
                foreach ($element->children() as $option) {
                    // Only add <option /> elements.
                    if ($option->getName() !== 'option') {
                        continue;
                    }

                    $defaultValues[$name][] = (string) $option;
                }
            }
        }

        return $defaultValues;
    }

    private function isGrouped($values)
    {
        $keys = array_keys($values);

        if (count($keys) == 1) {
            $firstKey = $keys[0];

            if (is_string($firstKey) && $firstKey !== 'default') {
                return true;
            }

        } else {
            return true;
        }

        return false;
    }

    private function reorderItems($items, $values)
    {
        // re-order the items so the non-default items are at the end
        usort($items, function ($a, $b) use ($values) {
            $a = strtolower($a);
            $b = strtolower($b);

            $is_default_a = !empty($values) && in_array($a, $values);
            $is_default_b = !empty($values) && in_array($b, $values);

            if ($is_default_a && !$is_default_b) {
                return -1;
            }

            if (!$is_default_a && $is_default_b) {
                return 1;
            }

            return 0;
        });

        return $items;
    }

    /**
     * Method to get the field input markup.
     *
     * @return string The field input markup
     *
     * @since   11.1
     */
    protected function getInput()
    {
        // cleanup string
        $value = htmlspecialchars_decode($this->value);

        // get default values from the manifest
        $defaultValues = $this->getDefaultValues();

        // remove leading = if any (legacy clean up)
        if ($value && $value[0] === '=') {
            $value = substr($value, 1);
        }

        // check if these values are grouped by type
        $grouped = $this->isGrouped($defaultValues);

        // map value to groups or single array
        $data = $this->mapValue($value, $grouped);

        // reset value from $data for non-grouped values
        if (!$grouped) {
            $value = implode(',', $data[0]);
        }

        $html = array();

        $html[] = '<div class="filetype">';
        $html[] = ' <div class="input-append input-group">';

        $html[] = '     <input type="text" value="' . $value . '" disabled class="form-control" />';
        $html[] = '     <input type="hidden" name="' . $this->name . '" value="' . $value . '" />';
        $html[] = '     <div class="input-group-append">';
        $html[] = '         <a class="btn btn-secondary filetype-edit add-on input-group-text" role="button"><i class="icon-edit icon-apply"></i><span role="none">Edit</span></a>';
        $html[] = '     </div>';
        $html[] = ' </div>';

        $customCount = 0;

        foreach ($data as $group => $items) {
            $custom = array();

            if (empty($items)) {
                continue;
            }

            $html[] = '<dl class="filetype-list list-group">';

            if (is_string($group)) {
                $checked = '';

                $is_default = isset($defaultValues[$group]);

                if (empty($value) || $is_default || (!$is_default && $group[0] !== '-')) {
                    $checked = ' checked="checked"';
                }

                // clear minus sign
                $group = str_replace('-', '', $group);

                $groupKey = 'WF_FILEGROUP_' . strtoupper($group);
                $groupName = Text::_('WF_FILEGROUP_' . strtoupper($group));

                // create simple label if there is no translation
                if ($groupName === $groupKey) {
                    $groupName = ucfirst($group);
                }

                $html[] = '<dt class="filetype-group list-group-item" data-filetype-group="' . $group . '"><label><input type="checkbox" value="' . $group . '"' . $checked . ' />' . $groupName . '</label></dt>';
            }

            if (is_numeric($group)) {
                $group = 'default';
            }

            $items = $this->reorderItems($items, $defaultValues[$group]);

            foreach ($items as $item) {
                $checked = '';

                $item = strtolower($item);

                // clear minus sign from beginning of item
                $mod = str_replace('-', '', $item);

                // check if this is a default value or a custom value
                $is_default = !empty($defaultValues[$group]) && in_array($mod, $defaultValues[$group]);

                $class = '';

                if (!$is_default) {
                    $customCount++;

                    $html[] = '<dd class="filetype-item filetype-custom row form-row list-group-item"><div class="file"></div><input type="text" class="span8 col-md-8 form-control" value="' . $mod . '" />';
                    $html[] = '<button class="btn btn-link filetype-remove"><span class="icon-trash"></span></button>';
                } else {
                    if (empty($value) || $mod === $item) {
                        $checked = ' checked="checked"';
                    }
                    
                    $html[] = '<dd class="filetype-item list-group-item"><label><input type="checkbox" value="' . $mod . '"' . $checked . ' /><span class="file ' . $mod . '"></span>&nbsp;' . $mod . '</label>';
                }
            }

            $html[] = '<dd class="filetype-item filetype-custom row form-row list-group-item"><div class="file"></div><input type="text" class="span8 col-md-8 form-control" value="" placeholder="' . Text::_('WF_EXTENSION_MAPPER_TYPE_NEW') . '" />';

            $html[] = '<button class="btn btn-link filetype-remove"><span class="icon-trash"></span></button>';
            $html[] = '<button class="btn btn-link filetype-add"><span class="icon-plus"></span></button>';

            $html[] = '</dl>';
        }

        $html[] = ' </div>';

        return implode("\n", $html);
    }
}components/com_jce/models/fields/checkboxes.php000060400000011461152453623450015720 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Field\ListField;

/**
 * Form Field class for the Joomla Platform.
 * Displays options as a list of checkboxes.
 * Multiselect may be forced to be true.
 *
 * @see    JFormFieldCheckbox
 * @since  1.7.0
 */
class JFormFieldCheckboxes extends ListField
{
    /**
     * The form field type.
     *
     * @var    string
     * @since  1.7.0
     */
    protected $type = 'Checkboxes';

    /**
     * Name of the layout being used to render the field
     *
     * @var    string
     * @since  3.5
     */
    protected $layout = 'form.field.checkboxes';

    /**
     * Flag to tell the field to always be in multiple values mode.
     *
     * @var    boolean
     * @since  1.7.0
     */
    protected $forceMultiple = true;

    /**
     * The comma separated list of checked checkboxes value.
     *
     * @var    mixed
     * @since  3.2
     */
    public $checkedOptions;

    /**
     * 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.2
     */
    public function __get($name)
    {
        switch ($name) {
            case 'forceMultiple':
            case 'checkedOptions':
                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.2
     */
    public function __set($name, $value)
    {
        switch ($name) {
            case 'checkedOptions':
                $this->checkedOptions = (string) $value;
                break;

            default:
                parent::__set($name, $value);
        }
    }

    /**
     * Method to get the radio button field input markup.
     *
     * @return  string  The field input markup.
     *
     * @since   1.7.0
     */
    protected function getInput()
    {
        if (empty($this->layout)) {
            throw new UnexpectedValueException(sprintf('%s has no layout assigned.', $this->name));
        }

        return $this->getRenderer($this->layout)->render($this->getLayoutData());
    }

    /**
     * Method to attach a JForm object to the field.
     *
     * @param   SimpleXMLElement  $element  The SimpleXMLElement object representing the `<field>` 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->checkedOptions = (string) $this->element['checked'];
        }

        return $return;
    }

    /**
     * Method to get the data to be passed to the layout for rendering.
     *
     * @return  array
     *
     * @since   3.5
     */
    protected function getLayoutData()
    {
        $data = parent::getLayoutData();

        // True if the field has 'value' set. In other words, it has been stored, don't use the default values.
        $hasValue = (isset($this->value) && !empty($this->value));

        // If a value has been stored, use it. Otherwise, use the defaults.
        $checkedOptions = $hasValue ? $this->value : $this->checkedOptions;

        $extraData = array(
            'checkedOptions' => is_array($checkedOptions) ? $checkedOptions : explode(',', (string) $checkedOptions),
            'hasValue' => $hasValue,
            'options' => $this->getOptions(),
        );

        return array_merge($data, $extraData);
    }

    /**
     * Allow to override renderer include paths in child fields
     *
     * @return  array
     *
     * @since   3.5
     */
    protected function getLayoutPaths()
    {
        return array(JPATH_ADMINISTRATOR . '/components/com_jce/layouts', JPATH_SITE . '/layouts');
    }
}
components/com_jce/models/fields/fontlist.php000060400000001762152453623450015447 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Field\FilelistField;

class JFormFieldFontList extends FilelistField
{
    /**
     * The form field type.
     *
     * @var string
     *
     * @since  11.1
     */
    protected $type = 'FontList';

    /**
     * Method to get the field input for a fontlist field.
     *
     * @return string The field input
     *
     * @since   3.1
     */
    protected function getInput()
    {
        if (!is_array($this->value) && !empty($this->value)) {
            // String in format 2,5,4
            if (is_string($this->value)) {
                $this->value = explode(',', $this->value);
            }
        }

        return parent::getInput();
    }
}
components/com_jce/models/fields/sortablecheckboxes.php000060400000005034152453623450017453 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Field\CheckboxesField;

class JFormFieldSortableCheckboxes extends CheckboxesField
{
    /**
     * The form field type.
     *
     * @var string
     *
     * @since  2.8.16
     */
    protected $type = 'SortableCheckboxes';

    /**
     * Method to attach a JForm object to the field.
     *
     * @param SimpleXMLElement $element The SimpleXMLElement object representing the <field /> 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 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 bool True on success
     *
     * @since  2.8.16
     */
    public function setup(SimpleXMLElement $element, $value, $group = null)
    {
        $return = parent::setup($element, $value, $group);

        $this->class = trim($this->class . ' sortable');

        return $return;
    }

    private function getOptionFromValue($value)
    {
        $options = parent::getOptions();

        foreach ($options as $option) {
            if ($option->value == $value) {
                return $option;
            }
        }

        return (object) array(
            'value' => $value,
            'text' => $value,
        );
    }

    protected function getOptions()
    {
        $options = parent::getOptions();

        $values = is_array($this->value) ? $this->value : explode(',', $this->value);

        if (!empty($values)) {
            $custom = array();

            foreach ($values as $value) {
                $tmp = $this->getOptionFromValue($value);
                $tmp->checked = true;

                $custom[] = $tmp;
            }

            // add default options not checked to the end of the options array
            foreach ($options as $option) {
                if (!in_array($option->value, $values)) {
                    $custom[] = $option;
                }
            }

            return $custom;
        }

        return $options;
    }
}
components/com_jce/models/fields/users.php000060400000006475152453623450014754 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Form\Field\UserField;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Table\Table;

/**
 * Field to select a user ID from a modal list.
 *
 * @since  1.6
 */
class JFormFieldUsers extends UserField
{
    /**
     * The form field type.
     *
     * @var    string
     * @since  2.7
     */
    public $type = 'Users';

    /**
     * Method to get the user field input markup.
     *
     * @return  string  The field input markup.
     *
     * @since   1.6
     */
    protected function getInput()
    {
        if (empty($this->layout)) {
            throw new \UnexpectedValueException(sprintf('%s has no layout assigned.', $this->name));
        }

        $options = $this->getOptions();

        $name = $this->name;

        // clear name
        $this->name = "";

        // set onchange to update
        $this->onchange = "(function(){WfSelectUsers();})();";

        // remove autocomplete
        $this->autocomplete = false;

        // clear value
        $this->value = "";

        $html = $this->getRenderer($this->layout)->render($this->getLayoutData());
        $html .= '<div class="users-select">';

        // add "joomla-field-fancy-select" manually for Joomla 4
        $html .= '<joomla-field-fancy-select placeholder="...">';
        $html .= '<select name="' . $name . '" id="' . $this->id . '_select" class="custom-select" data-placeholder="..." multiple>';

        foreach ($options as $option) {
            $html .= '<option value="' . $option->value . '" selected>' . $option->text . '</option>';
        }

        $html .= '</select>';
        $html .= '</joomla-field-fancy-select>';
        $html .= '</div>';

        return $html;

    }

    /**
     * Allow to override renderer include paths in child fields
     *
     * @return  array
     *
     * @since   3.5
     */
    protected function getLayoutPaths()
    {
        return array(JPATH_ADMINISTRATOR . '/components/com_jce/layouts', JPATH_SITE . '/layouts');
    }

    /**
     * Method to get the field options.
     *
     * @return array The field option objects
     *
     * @since   11.1
     */
    protected function getOptions()
    {
        $options = array();

        if (empty($this->value)) {
            return $options;
        }

        $fieldname = preg_replace('/[^a-zA-Z0-9_\-]/', '_', $this->fieldname);
        $table = Table::getInstance('user');

        // clean value
        $this->value = str_replace('"', '', $this->value);

        foreach (explode(',', $this->value) as $id) {
            if (empty($id)) {
                continue;
            }

            if ($table->load((int) $id)) {
                $text = htmlspecialchars($table->name, ENT_COMPAT, 'UTF-8');
                $text = Text::alt($text, $fieldname);

                $tmp = array(
                    'value' => $id,
                    'text' => $text,
                );

                // Add the option object to the result set.
                $options[] = (object) $tmp;
            }
        }

        return $options;
    }
}
components/com_jce/models/browser.php000060400000002534152453623450014020 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright     Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Model\BaseDatabaseModel;

require_once JPATH_ADMINISTRATOR . '/components/com_jce/helpers/browser.php';

class JceModelBrowser extends BaseDatabaseModel
{
    /**
     * Method to auto-populate the model state.
     *
     * Note. Calling getState in this method will result in recursion.
     *
     * @since   1.6
     */
    protected function populateState($ordering = null, $direction = null)
    {
        $app = Factory::getApplication();

        $mediatype  = $app->input->getCmd('mediatype', '');
        $folder     = $app->input->getPath('folder', '');

        $options = array();

        if ($folder) {
            $options['folder'] = $folder;
        }

        $url = WfBrowserHelper::getBrowserLink(null, $mediatype, '', $options);

        if (empty($url)) {
            $app->enqueueMessage(Text::_('JERROR_ALERTNOAUTHOR'), 'error');
            $app->redirect('index.php?option=com_jce');
        }

        $this->setState('url', $url);
    }
}
components/com_jce/models/help.xml000060400000000255152453623450013274 0ustar00<?xml version="1.0" encoding="utf-8"?>
<help>
	<topic key="admin.about" title="WF_HELP_ADMINISTRATION" />
	<topic key="admin.interface" title="WF_HELP_INTERFACE" />
</help>
components/com_jce/models/cpanel.php000060400000010346152453623450013577 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright     Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Model\BaseDatabaseModel;
use Joomla\CMS\Plugin\PluginHelper;

require_once JPATH_ADMINISTRATOR . '/components/com_jce/includes/constants.php';

class JceModelCpanel extends BaseDatabaseModel
{
    public function getIcons()
    {
        $user = Factory::getUser();

        $icons = array();

        $views = array(
            'config' => 'equalizer',
            'profiles' => 'users',
            'browser' => 'picture',
            'mediabox' => 'pictures',
        );

        foreach ($views as $name => $icon) {

            // if its mediabox, check the plugin is installed and enabled
            if ($name === "mediabox" && !PluginHelper::isEnabled('system', 'jcemediabox')) {
                continue;
            }

            // check if its allowed...
            if (!$user->authorise('jce.' . $name, 'com_jce')) {
                continue;
            }

            $link = 'index.php?option=com_jce&amp;view=' . $name;
            $title = Text::_('WF_' . strtoupper($name));

            if ($name === "browser") {
                if (!PluginHelper::isEnabled('quickicon', 'jce')) {
                    continue;
                }

                $title = Text::_('WF_' . strtoupper($name) . '_TITLE');
            }

            $icons[] = '<li class="quickicon mb-3"><a title="' . Text::_('WF_' . strtoupper($name) . '_DESC') . '" href="' . $link . '" class="card btn btn-default" role="button"><div class="quickicon-icon d-flex align-items-end" role="presentation"><span class="icon-' . $icon . '" aria-hidden="true" role="presentation"></span></div><div class="quickicon-text d-flex align-items-center"><span class="j-links-link">' . $title . '</span></div></a></li>';
        }

        return $icons;
    }

    public function getFeeds()
    {
        $app = Factory::getApplication();
        $params = ComponentHelper::getParams('com_jce');
        $limit = $params->get('feed_limit', 2);

        $feeds = array();
        $options = array(
            'rssUrl' => 'https://www.joomlacontenteditor.net/news?format=feed',
        );

        $xml = simplexml_load_file($options['rssUrl']);

        if (empty($xml)) {
            return $feeds;
        }

        jimport('joomla.filter.input');
        $filter = InputFilter::getInstance();

        $count = count($xml->channel->item);

        if ($count) {
            $count = ($count > $limit) ? $limit : $count;

            for ($i = 0; $i < $count; ++$i) {
                $feed = new StdClass();
                $item = $xml->channel->item[$i];

                $link = (string) $item->link;
                $feed->link = htmlspecialchars($filter->clean($link));

                $title = (string) $item->title;
                $feed->title = htmlspecialchars($filter->clean($title));

                $description = (string) $item->description;
                $feed->description = htmlspecialchars($filter->clean($description));

                $feeds[] = $feed;
            }
        }

        return $feeds;
    }

    /**
     * Method to auto-populate the model state.
     *
     * Note. Calling getState in this method will result in recursion.
     *
     * @since   1.6
     */
    protected function populateState($ordering = null, $direction = null)
    {
        $licence = "";
        $version = "";

        if ($xml = simplexml_load_file(JPATH_ADMINISTRATOR . '/components/com_jce/jce.xml')) {
            $licence = (string) $xml->license;
            $version = (string) $xml->version;

            if (PluginHelper::isEnabled('system', 'jcepro')) {
                $version = '<span class="badge badge-info badge-primary bg-primary">Pro</span>&nbsp;' . $version;

                $this->setState('pro', 1);
            }
        }

        $this->setState('version', $version);
        $this->setState('licence', $licence);
    }
}
components/com_jce/models/help.php000060400000013213152453623450013261 0ustar00<?php
/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Model\BaseDatabaseModel;
use Joomla\CMS\Plugin\PluginHelper;

class JceModelHelp extends BaseDatabaseModel
{
    public function getLanguage()
    {
        $language = Factory::getLanguage();
        $tag = $language->getTag();

        return substr($tag, 0, strpos($tag, '-'));
    }

    public function getTopics($file)
    {
        $result = '';

        if (file_exists($file)) {
            // load xml
            $xml = simplexml_load_file($file);

            if ($xml) {
                foreach ($xml->help->children() as $topic) {
                    $subtopics = $topic->subtopic;
                    $class = count($subtopics) ? 'subtopics' : '';

                    $key = (string) $topic->attributes()->key;
                    $title = (string) $topic->attributes()->title;
                    $file = (string) $topic->attributes()->file;

                    // if file attribute load file
                    if ($file) {
                        $result .= $this->getTopics(JPATH_SITE . '/components/com_jce/editor/' . $file);
                    } else {
                        $result .= '<li id="' . $key . '" class="nav-item ' . $class . '"><a href="#" class="nav-link"><i class="icon-copy"></i>&nbsp;' . trim(Text::_($title)) . '</a>';
                    }

                    if (count($subtopics)) {
                        $result .= '<ul class="nav nav-list hidden">';
                        foreach ($subtopics as $subtopic) {
                            $sub_subtopics = $subtopic->subtopic;

                            // if a file is set load it as sub-subtopics
                            if ($file = (string) $subtopic->attributes()->file) {
                                $result .= '<li class="nav-item subtopics"><a href="#" class="nav-link"><i class="icon-file"></i>&nbsp;' . trim(Text::_((string) $subtopic->attributes()->title)) . '</a>';
                                $result .= '<ul class="nav nav-list hidden">';
                                $result .= $this->getTopics(JPATH_SITE . '/components/com_jce/editor/' . $file);
                                $result .= '</ul>';
                                $result .= '</li>';
                            } else {
                                $id = $subtopic->attributes()->key ? ' id="' . (string) $subtopic->attributes()->key . '"' : '';

                                $class = count($sub_subtopics) ? ' class="nav-item subtopics"' : '';
                                $result .= '<li' . $class . $id . '><a href="#" class="nav-link"><i class="icon-file"></i>&nbsp;' . trim(Text::_((string) $subtopic->attributes()->title)) . '</a>';

                                if (count($sub_subtopics)) {
                                    $result .= '<ul class="nav nav-list hidden">';
                                    foreach ($sub_subtopics as $sub_subtopic) {
                                        $result .= '<li id="' . (string) $sub_subtopic->attributes()->key . '" class="nav-item"><a href="#" class="nav-link"><i class="icon-file"></i>&nbsp;' . trim(Text::_((string) $sub_subtopic->attributes()->title)) . '</a></li>';
                                    }
                                    $result .= '</ul>';
                                }

                                $result .= '</li>';
                            }
                        }
                        $result .= '</ul>';
                    }
                }
            }
        }

        return $result;
    }

    /**
     * Returns a formatted list of help topics.
     *
     * @return string
     *
     * @since 1.5
     */
    public function renderTopics()
    {
        $app = Factory::getApplication();

        $section = $app->input->getWord('section', 'admin');
        $category = $app->input->getWord('category', 'cpanel');

        $document = Factory::getDocument();
        $language = Factory::getLanguage();

        $language->load('com_jce', JPATH_SITE);
        $language->load('com_jce_pro', JPATH_SITE);

        $document->setTitle(Text::_('WF_HELP') . ' : ' . Text::_('WF_' . strtoupper($category) . '_TITLE'));

        switch ($section) {
            case 'admin':
                $file = __DIR__ . '/' . $category . '.xml';
                break;
            case 'editor':
                $file = JPATH_SITE . '/components/com_jce/editor/tiny_mce/plugins/' . $category . '/' . $category . '.xml';

                // check for installed plugin
                $plugin = PluginHelper::getPlugin('jce', 'editor-' . $category);

                if ($plugin) {
                    $file = JPATH_PLUGINS . '/jce/editor-' . $category . '/editor-' . $category . '.xml';
                    $language->load('plg_jce_editor_' . $category, JPATH_ADMINISTRATOR);
                }

                if (!is_file($file)) {
                    $file = JPATH_SITE . '/components/com_jce/editor/libraries/xml/help/editor.xml';
                } else {
                    $language->load('WF_' . $category, JPATH_SITE);
                }
                break;
        }

        $result = '';

        $result .= '<ul class="nav nav-list" id="help-menu"><li class="nav-header">' . Text::_('WF_' . strtoupper($category) . '_TITLE') . '</li>';
        $result .= $this->getTopics($file);
        $result .= '</ul>';

        return $result;
    }
}
components/com_jce/access.xml000060400000001443152453623450012322 0ustar00<?xml version="1.0" encoding="utf-8" ?>
<access component="com_jce">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="jce.config" title="WF_ACTION_CONFIG" description="WF_ACTION_CONFIG_DESC" />
		<action name="jce.profiles" title="WF_ACTION_PROFILES" description="WF_ACTION_PROFILES_DESC" />
		<action name="jce.preferences" title="WF_ACTION_PREFERENCES" description="WF_ACTION_PREFERENCES_DESC" />
		<action name="jce.browser" title="WF_ACTION_BROWSER" description="WF_ACTION_BROWSER_DESC" />
		<action name="jce.mediabox" title="WF_ACTION_MEDIABOX" description="WF_ACTION_MEDIABOX_DESC" />
	</section>
</access>components/com_jce/sql/mysql.sql000060400000001117152453623450013022 0ustar00CREATE TABLE IF NOT EXISTS `#__wf_profiles` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(255) NOT NULL,
    `description` text NOT NULL,
    `users` text NOT NULL,
    `types` text NOT NULL,
    `components` text NOT NULL,
    `area` tinyint(3) NOT NULL,
    `device` varchar(255) NOT NULL,
    `rows` text NOT NULL,
    `plugins` text NOT NULL,
    `published` tinyint(3) NOT NULL,
    `ordering` int(11) NOT NULL,
    `checked_out` int unsigned,
    `checked_out_time` datetime NULL DEFAULT NULL,
    `params` text NOT NULL,
    PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;components/com_jce/sql/index.html000060400000000054152453623450013130 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_jce/sql/sqlsrv.sql000060400000001425152453623450013211 0ustar00IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[#__wf_profiles]') AND type in (N'U'))
BEGIN
CREATE TABLE [#__wf_profiles](
	[id] [bigint] IDENTITY(1,1) NOT NULL,
	[name] [nvarchar](250) NOT NULL,
	[description] [text] NOT NULL,
	[users] [text] NOT NULL,
	[types] [text] NOT NULL,
	[components] [nvarchar](max) NOT NULL,
	[area] [smallint] NOT NULL,
    [device] [nvarchar](250) NOT NULL,
	[rows] [nvarchar](max) NOT NULL,
	[plugins] [nvarchar](max) NOT NULL,
	[published] [smallint] NOT NULL,
	[ordering] [int] NOT NULL,
	[checked_out] [int] NOT NULL,
	[checked_out_time] [datetime] NOT NULL,
	[params] [nvarchar](max) NOT NULL,
 CONSTRAINT [PK_#__wf_profiles_id] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF)
)
END;components/com_jce/sql/postgresql.sql000060400000001057152453623450014063 0ustar00CREATE TABLE IF NOT EXISTS "#__wf_profiles" (
    "id" integer GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    "name" varchar(255) NOT NULL,
    "description" text NOT NULL,
    "users" text NOT NULL,
    "types" text NOT NULL,
    "components" text NOT NULL,
    "area" smallint NOT NULL,
    "device" varchar(255) NOT NULL,
    "rows" text NOT NULL,
    "plugins" text NOT NULL,
    "published" smallint NOT NULL,
    "ordering" integer NOT NULL,
    "checked_out" integer,
    "checked_out_time" timestamp without time zone,
    "params" text NOT NULL
);components/com_installer/installer.xml000060400000001762152453623450014316 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_installer</name>
	<author>Joomla! Project</author>
	<creationDate>April 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_INSTALLER_XML_DESCRIPTION</description>
	<administration>
		<files folder="admin">
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<filename>installer.php</filename>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_installer.ini</language>
			<language tag="en-GB">language/en-GB.com_installer.sys.ini</language>
		</languages>
	</administration>
</extension>

components/com_installer/installer.php000060400000001134152453623450014276 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
JHtml::_('behavior.tabstate');

if (!JFactory::getUser()->authorise('core.manage', 'com_installer'))
{
	throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
}

$controller = JControllerLegacy::getInstance('Installer');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
components/com_installer/controllers/updatesites.php000060400000005743152453623450017213 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2014 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Installer Update Sites Controller
 *
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 * @since       3.4
 */
class InstallerControllerUpdatesites extends JControllerLegacy
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   3.4
	 */
	public function __construct($config = array())
	{
		parent::__construct($config);

		$this->registerTask('unpublish', 'publish');
		$this->registerTask('publish',   'publish');
		$this->registerTask('delete',    'delete');
		$this->registerTask('rebuild',   'rebuild');
	}

	/**
	 * Enable/Disable an extension (if supported).
	 *
	 * @return  void
	 *
	 * @since   3.4
	 *
	 * @throws  Exception on error
	 */
	public function publish()
	{
		// Check for request forgeries.
		$this->checkToken();

		$ids    = (array) $this->input->get('cid', array(), 'int');
		$values = array('publish' => 1, 'unpublish' => 0);
		$task   = $this->getTask();
		$value  = ArrayHelper::getValue($values, $task, 0, 'int');

		// Remove zero values resulting from input filter
		$ids = array_filter($ids);

		if (empty($ids))
		{
			throw new Exception(JText::_('COM_INSTALLER_ERROR_NO_UPDATESITES_SELECTED'), 500);
		}

		// Get the model.
		$model = $this->getModel('Updatesites');

		// Change the state of the records.
		if (!$model->publish($ids, $value))
		{
			throw new Exception(implode('<br />', $model->getErrors()), 500);
		}

		$ntext = ($value == 0) ? 'COM_INSTALLER_N_UPDATESITES_UNPUBLISHED' : 'COM_INSTALLER_N_UPDATESITES_PUBLISHED';

		$this->setMessage(JText::plural($ntext, count($ids)));

		$this->setRedirect(JRoute::_('index.php?option=com_installer&view=updatesites', false));
	}

	/**
	 * Deletes an update site (if supported).
	 *
	 * @return  void
	 *
	 * @since   3.6
	 *
	 * @throws  Exception on error
	 */
	public function delete()
	{
		// Check for request forgeries.
		$this->checkToken();

		$ids = (array) $this->input->get('cid', array(), 'int');

		// Remove zero values resulting from input filter
		$ids = array_filter($ids);

		if (empty($ids))
		{
			throw new Exception(JText::_('COM_INSTALLER_ERROR_NO_UPDATESITES_SELECTED'), 500);
		}

		// Delete the records.
		$this->getModel('Updatesites')->delete($ids);

		$this->setRedirect(JRoute::_('index.php?option=com_installer&view=updatesites', false));
	}

	/**
	 * Rebuild update sites tables.
	 *
	 * @return  void
	 *
	 * @since   3.6
	 */
	public function rebuild()
	{
		// Check for request forgeries.
		$this->checkToken();

		// Rebuild the update sites.
		$this->getModel('Updatesites')->rebuild();

		$this->setRedirect(JRoute::_('index.php?option=com_installer&view=updatesites', false));
	}
}
components/com_installer/controllers/discover.php000060400000002435152453623450016472 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Discover Installation Controller
 *
 * @since  1.6
 */
class InstallerControllerDiscover extends JControllerLegacy
{
	/**
	 * Refreshes the cache of discovered extensions.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function refresh()
	{
		$this->checkToken();

		$model = $this->getModel('discover');
		$model->discover();
		$this->setRedirect(JRoute::_('index.php?option=com_installer&view=discover', false));
	}

	/**
	 * Install a discovered extension.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function install()
	{
		$this->checkToken();

		$this->getModel('discover')->discover_install();
		$this->setRedirect(JRoute::_('index.php?option=com_installer&view=discover', false));
	}

	/**
	 * Clean out the discovered extension cache.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function purge()
	{
		$this->checkToken();

		$model = $this->getModel('discover');
		$model->purge();
		$this->setRedirect(JRoute::_('index.php?option=com_installer&view=discover', false), $model->_message);
	}
}
components/com_installer/controllers/install.php000060400000005133152453623450016320 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Installer controller for Joomla! installer class.
 *
 * @since  1.5
 */
class InstallerControllerInstall extends JControllerLegacy
{
	/**
	 * Install an extension.
	 *
	 * @return  boolean
	 *
	 * @since   1.5
	 */
	public function install()
	{
		// Check for request forgeries.
		$this->checkToken();

		if (!JFactory::getUser()->authorise('core.admin'))
		{
			throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
		}

		/** @var InstallerModelInstall $model */
		$model = $this->getModel('install');

		// TODO: Reset the users acl here as well to kill off any missing bits.
		$result = $model->install();

		$app = JFactory::getApplication();
		$redirect_url = $app->getUserState('com_installer.redirect_url');

		if (!$redirect_url)
		{
			$redirect_url = base64_decode($app->input->get('return', null, 'BASE64'));
		}

		// Don't redirect to an external URL.
		if (!JUri::isInternal($redirect_url))
		{
			$redirect_url = '';
		}

		if (empty($redirect_url))
		{
			$redirect_url = JRoute::_('index.php?option=com_installer&view=install', false);
		}
		else
		{
			// Wipe out the user state when we're going to redirect.
			$app->setUserState('com_installer.redirect_url', '');
			$app->setUserState('com_installer.message', '');
			$app->setUserState('com_installer.extension_message', '');
		}

		$this->setRedirect($redirect_url);

		return $result;
	}

	/**
	 * Install an extension from drag & drop ajax upload.
	 *
	 * @return  void
	 *
	 * @since   3.7.0
	 */
	public function ajax_upload()
	{
		// Check for request forgeries.
		JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

		if (!JFactory::getUser()->authorise('core.admin'))
		{
			throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
		}

		$app = JFactory::getApplication();
		$message = $app->getUserState('com_installer.message');

		// Do install
		$result = $this->install();

		// Get redirect URL
		$redirect = $this->redirect;

		// Push message queue to session because we will redirect page by Javascript, not $app->redirect().
		// The "application.queue" is only set in redirect() method, so we must manually store it.
		$app->getSession()->set('application.queue', $app->getMessageQueue());

		header('Content-Type: application/json');

		echo new JResponseJson(array('redirect' => $redirect), $message, !$result);

		exit();
	}
}
components/com_installer/controllers/update.php000060400000011347152453623450016140 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Installer Update Controller
 *
 * @since  1.6
 */
class InstallerControllerUpdate extends JControllerLegacy
{
	/**
	 * Update a set of extensions.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function update()
	{
		// Check for request forgeries.
		$this->checkToken();

		/** @var InstallerModelUpdate $model */
		$model = $this->getModel('update');
		$uid   = (array) $this->input->get('cid', array(), 'int');

		// Remove zero values resulting from input filter
		$uid = array_filter($uid);

		// Get the minimum stability.
		$component     = JComponentHelper::getComponent('com_installer');
		$params        = $component->params;
		$minimum_stability = (int) $params->get('minimum_stability', JUpdater::STABILITY_STABLE);

		$model->update($uid, $minimum_stability);

		$app          = JFactory::getApplication();
		$redirect_url = $app->getUserState('com_installer.redirect_url');

		// Don't redirect to an external URL.
		if (!JUri::isInternal($redirect_url))
		{
			$redirect_url = '';
		}

		if (empty($redirect_url))
		{
			$redirect_url = JRoute::_('index.php?option=com_installer&view=update', false);
		}
		else
		{
			// Wipe out the user state when we're going to redirect.
			$app->setUserState('com_installer.redirect_url', '');
			$app->setUserState('com_installer.message', '');
			$app->setUserState('com_installer.extension_message', '');
		}

		$this->setRedirect($redirect_url);
	}

	/**
	 * Find new updates.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function find()
	{
		$this->checkToken('request');

		// Get the caching duration.
		$component     = JComponentHelper::getComponent('com_installer');
		$params        = $component->params;
		$cache_timeout = (int) $params->get('cachetimeout', 6);
		$cache_timeout = 3600 * $cache_timeout;

		// Get the minimum stability.
		$minimum_stability = (int) $params->get('minimum_stability', JUpdater::STABILITY_STABLE);

		// Find updates.
		/** @var InstallerModelUpdate $model */
		$model = $this->getModel('update');

		$disabledUpdateSites = $model->getDisabledUpdateSites();

		if ($disabledUpdateSites)
		{
			$updateSitesUrl = JRoute::_('index.php?option=com_installer&view=updatesites');
			$this->setMessage(JText::sprintf('COM_INSTALLER_MSG_UPDATE_SITES_COUNT_CHECK', $updateSitesUrl), 'warning');
		}

		$model->findUpdates(0, $cache_timeout, $minimum_stability);
		$this->setRedirect(JRoute::_('index.php?option=com_installer&view=update', false));
	}

	/**
	 * Purges updates.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function purge()
	{
		// Check for request forgeries.
		$this->checkToken();

		$model = $this->getModel('update');
		$model->purge();

		/**
		 * We no longer need to enable update sites in Joomla! 3.4 as we now allow the users to manage update sites
		 * themselves.
		 * $model->enableSites();
		 */

		$this->setRedirect(JRoute::_('index.php?option=com_installer&view=update', false), $model->_message);
	}

	/**
	 * Fetch and report updates in JSON format, for AJAX requests
	 *
	 * @return void
	 *
	 * @since 2.5
	 */
	public function ajax()
	{
		$app = JFactory::getApplication();

		if (!JSession::checkToken('get'))
		{
			$app->setHeader('status', 403, true);
			$app->sendHeaders();
			echo JText::_('JINVALID_TOKEN_NOTICE');
			$app->close();
		}

		$eid               = $this->input->getInt('eid', 0);
		$skip              = $this->input->get('skip', array(), 'array');
		$cache_timeout     = $this->input->getInt('cache_timeout', 0);
		$minimum_stability = $this->input->getInt('minimum_stability', -1);

		$component     = JComponentHelper::getComponent('com_installer');
		$params        = $component->params;

		if ($cache_timeout == 0)
		{
			$cache_timeout = (int) $params->get('cachetimeout', 6);
			$cache_timeout = 3600 * $cache_timeout;
		}

		if ($minimum_stability < 0)
		{
			$minimum_stability = (int) $params->get('minimum_stability', JUpdater::STABILITY_STABLE);
		}

		/** @var InstallerModelUpdate $model */
		$model = $this->getModel('update');
		$model->findUpdates($eid, $cache_timeout, $minimum_stability);

		$model->setState('list.start', 0);
		$model->setState('list.limit', 0);

		if ($eid != 0)
		{
			$model->setState('filter.extension_id', $eid);
		}

		$updates = $model->getItems();

		if (!empty($skip))
		{
			$unfiltered_updates = $updates;
			$updates            = array();

			foreach ($unfiltered_updates as $update)
			{
				if (!in_array($update->extension_id, $skip))
				{
					$updates[] = $update;
				}
			}
		}

		echo json_encode($updates);

		$app->close();
	}
}
components/com_installer/controllers/database.php000060400000002121152453623450016410 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Installer Database Controller
 *
 * @since  2.5
 */
class InstallerControllerDatabase extends JControllerLegacy
{
	/**
	 * Tries to fix missing database updates
	 *
	 * @return  void
	 *
	 * @since   2.5
	 * @todo    Purge updates has to be replaced with an events system
	 */
	public function fix()
	{
		// Check for request forgeries.
		$this->checkToken();

		$model = $this->getModel('database');
		$model->fix();

		// Purge updates
		JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_joomlaupdate/models', 'JoomlaupdateModel');
		$updateModel = JModelLegacy::getInstance('default', 'JoomlaupdateModel');
		$updateModel->purge();

		// Refresh versionable assets cache
		JFactory::getApplication()->flushAssets();

		$this->setRedirect(JRoute::_('index.php?option=com_installer&view=database', false));
	}
}
components/com_installer/controllers/manage.php000060400000006150152453623450016102 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Installer Manage Controller
 *
 * @since  1.6
 */
class InstallerControllerManage extends JControllerLegacy
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		parent::__construct($config);

		$this->registerTask('unpublish', 'publish');
		$this->registerTask('publish',   'publish');
	}

	/**
	 * Enable/Disable an extension (if supported).
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function publish()
	{
		// Check for request forgeries.
		$this->checkToken();

		$ids    = (array) $this->input->get('cid', array(), 'int');
		$values = array('publish' => 1, 'unpublish' => 0);
		$task   = $this->getTask();
		$value  = ArrayHelper::getValue($values, $task, 0, 'int');

		// Remove zero values resulting from input filter
		$ids = array_filter($ids);

		if (empty($ids))
		{
			JError::raiseWarning(500, JText::_('COM_INSTALLER_ERROR_NO_EXTENSIONS_SELECTED'));
		}
		else
		{
			// Get the model.
			/** @var InstallerModelManage $model */
			$model = $this->getModel('manage');

			// Change the state of the records.
			if (!$model->publish($ids, $value))
			{
				JError::raiseWarning(500, implode('<br />', $model->getErrors()));
			}
			else
			{
				if ($value == 1)
				{
					$ntext = 'COM_INSTALLER_N_EXTENSIONS_PUBLISHED';
				}
				elseif ($value == 0)
				{
					$ntext = 'COM_INSTALLER_N_EXTENSIONS_UNPUBLISHED';
				}

				$this->setMessage(JText::plural($ntext, count($ids)));
			}
		}

		$this->setRedirect(JRoute::_('index.php?option=com_installer&view=manage', false));
	}

	/**
	 * Remove an extension (Uninstall).
	 *
	 * @return  void
	 *
	 * @since   1.5
	 */
	public function remove()
	{
		// Check for request forgeries.
		$this->checkToken();

		$eid = (array) $this->input->get('cid', array(), 'int');

		// Remove zero values resulting from input filter
		$eid = array_filter($eid);

		if (!empty($eid))
		{
			/** @var InstallerModelManage $model */
			$model = $this->getModel('manage');

			$model->remove($eid);
		}

		$this->setRedirect(JRoute::_('index.php?option=com_installer&view=manage', false));
	}

	/**
	 * Refreshes the cached metadata about an extension.
	 *
	 * Useful for debugging and testing purposes when the XML file might change.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function refresh()
	{
		// Check for request forgeries.
		$this->checkToken();

		$uid = (array) $this->input->get('cid', array(), 'int');

		// Remove zero values resulting from input filter
		$uid = array_filter($uid);

		if (!empty($uid))
		{
			/** @var InstallerModelManage $model */
			$model = $this->getModel('manage');

			$model->refresh($uid);
		}

		$this->setRedirect(JRoute::_('index.php?option=com_installer&view=manage', false));
	}
}
components/com_installer/models/updatesites.php000060400000035444152453623450016131 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2014 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('InstallerModel', __DIR__ . '/extension.php');

/**
 * Installer Update Sites Model
 *
 * @since  3.4
 */
class InstallerModelUpdatesites extends InstallerModel
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   3.4
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'update_site_name',
				'name',
				'client_id',
				'client', 'client_translated',
				'status',
				'type', 'type_translated',
				'folder', 'folder_translated',
				'update_site_id',
				'enabled',
			);
		}

		parent::__construct($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   3.4
	 */
	protected function populateState($ordering = 'name', $direction = 'asc')
	{
		// Load the filter state.
		$this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string'));
		$this->setState('filter.client_id', $this->getUserStateFromRequest($this->context . '.filter.client_id', 'filter_client_id', null, 'int'));
		$this->setState('filter.enabled', $this->getUserStateFromRequest($this->context . '.filter.enabled', 'filter_enabled', '', 'string'));
		$this->setState('filter.type', $this->getUserStateFromRequest($this->context . '.filter.type', 'filter_type', '', 'string'));
		$this->setState('filter.folder', $this->getUserStateFromRequest($this->context . '.filter.folder', 'filter_folder', '', 'string'));

		parent::populateState($ordering, $direction);
	}

	/**
	 * Enable/Disable an extension.
	 *
	 * @param   array  $eid    Extension ids to un/publish
	 * @param   int    $value  Publish value
	 *
	 * @return  boolean  True on success
	 *
	 * @since   3.4
	 *
	 * @throws  Exception on ACL error
	 */
	public function publish(&$eid = array(), $value = 1)
	{
		if (!JFactory::getUser()->authorise('core.edit.state', 'com_installer'))
		{
			throw new Exception(JText::_('JLIB_APPLICATION_ERROR_EDITSTATE_NOT_PERMITTED'), 403);
		}

		$result = true;

		// Ensure eid is an array of extension ids
		if (!is_array($eid))
		{
			$eid = array($eid);
		}

		// Get a table object for the extension type
		$table = JTable::getInstance('Updatesite');

		// Enable the update site in the table and store it in the database
		foreach ($eid as $i => $id)
		{
			$table->load($id);
			$table->enabled = $value;

			if (!$table->store())
			{
				$this->setError($table->getError());
				$result = false;
			}
		}

		return $result;
	}

	/**
	 * Deletes an update site.
	 *
	 * @param   array  $ids  Extension ids to delete.
	 *
	 * @return  void
	 *
	 * @since   3.6
	 *
	 * @throws  Exception on ACL error
	 */
	public function delete($ids = array())
	{
		if (!JFactory::getUser()->authorise('core.delete', 'com_installer'))
		{
			throw new Exception(JText::_('JLIB_APPLICATION_ERROR_DELETE_NOT_PERMITTED'), 403);
		}

		// Ensure eid is an array of extension ids
		if (!is_array($ids))
		{
			$ids = array($ids);
		}

		$db  = JFactory::getDbo();
		$app = JFactory::getApplication();

		$count = 0;

		// Gets the update site names.
		$query = $db->getQuery(true)
			->select($db->qn(array('update_site_id', 'name')))
			->from($db->qn('#__update_sites'))
			->where($db->qn('update_site_id') . ' IN (' . implode(', ', $ids) . ')');
		$db->setQuery($query);
		$updateSitesNames = $db->loadObjectList('update_site_id');

		// Gets Joomla core update sites Ids.
		$joomlaUpdateSitesIds = $this->getJoomlaUpdateSitesIds(0);

		// Enable the update site in the table and store it in the database
		foreach ($ids as $i => $id)
		{
			// Don't allow to delete Joomla Core update sites.
			if (in_array((int) $id, $joomlaUpdateSitesIds))
			{
				$app->enqueueMessage(JText::sprintf('COM_INSTALLER_MSG_UPDATESITES_DELETE_CANNOT_DELETE', $updateSitesNames[$id]->name), 'error');
				continue;
			}

			// Delete the update site from all tables.
			try
			{
				$query = $db->getQuery(true)
					->delete($db->qn('#__update_sites'))
					->where($db->qn('update_site_id') . ' = ' . (int) $id);
				$db->setQuery($query);
				$db->execute();

				$query = $db->getQuery(true)
					->delete($db->qn('#__update_sites_extensions'))
					->where($db->qn('update_site_id') . ' = ' . (int) $id);
				$db->setQuery($query);
				$db->execute();

				$query = $db->getQuery(true)
					->delete($db->qn('#__updates'))
					->where($db->qn('update_site_id') . ' = ' . (int) $id);
				$db->setQuery($query);
				$db->execute();

				$count++;
			}
			catch (RuntimeException $e)
			{
				$app->enqueueMessage(JText::sprintf('COM_INSTALLER_MSG_UPDATESITES_DELETE_ERROR', $updateSitesNames[$id]->name, $e->getMessage()), 'error');
			}
		}

		if ($count > 0)
		{
			$app->enqueueMessage(JText::plural('COM_INSTALLER_MSG_UPDATESITES_N_DELETE_UPDATESITES_DELETED', $count), 'message');
		}
	}

	/**
	 * Rebuild update sites tables.
	 *
	 * @return  void
	 *
	 * @since   3.6
	 *
	 * @throws  Exception on ACL error
	 */
	public function rebuild()
	{
		if (!JFactory::getUser()->authorise('core.admin', 'com_installer'))
		{
			throw new Exception(JText::_('COM_INSTALLER_MSG_UPDATESITES_REBUILD_NOT_PERMITTED'), 403);
		}

		$db  = JFactory::getDbo();
		$app = JFactory::getApplication();

		// Check if Joomla Extension plugin is enabled.
		if (!JPluginHelper::isEnabled('extension', 'joomla'))
		{
			$query = $db->getQuery(true)
				->select($db->quoteName('extension_id'))
				->from($db->quoteName('#__extensions'))
				->where($db->quoteName('type') . ' = ' . $db->quote('plugin'))
				->where($db->quoteName('element') . ' = ' . $db->quote('joomla'))
				->where($db->quoteName('folder') . ' = ' . $db->quote('extension'));
			$db->setQuery($query);

			$pluginId = (int) $db->loadResult();

			$link = JRoute::_('index.php?option=com_plugins&task=plugin.edit&extension_id=' . $pluginId);
			$app->enqueueMessage(JText::sprintf('COM_INSTALLER_MSG_UPDATESITES_REBUILD_EXTENSION_PLUGIN_NOT_ENABLED', $link), 'error');

			return;
		}

		$clients               = array(JPATH_SITE, JPATH_ADMINISTRATOR);
		$extensionGroupFolders = array('components', 'modules', 'plugins', 'templates', 'language', 'manifests');

		$pathsToSearch = array();

		// Identifies which folders to search for manifest files.
		foreach ($clients as $clientPath)
		{
			foreach ($extensionGroupFolders as $extensionGroupFolderName)
			{
				// Components, modules, plugins, templates, languages and manifest (files, libraries, etc)
				if ($extensionGroupFolderName != 'plugins')
				{
					foreach (glob($clientPath . '/' . $extensionGroupFolderName . '/*', GLOB_NOSORT | GLOB_ONLYDIR) as $extensionFolderPath)
					{
						$pathsToSearch[] = $extensionFolderPath;
					}
				}

				// Plugins (another directory level is needed)
				else
				{
					foreach (glob($clientPath . '/' . $extensionGroupFolderName . '/*', GLOB_NOSORT | GLOB_ONLYDIR) as $pluginGroupFolderPath)
					{
						foreach (glob($pluginGroupFolderPath . '/*', GLOB_NOSORT | GLOB_ONLYDIR) as $extensionFolderPath)
						{
							$pathsToSearch[] = $extensionFolderPath;
						}
					}
				}
			}
		}

		// Gets Joomla core update sites Ids.
		$joomlaUpdateSitesIds = implode(', ', $this->getJoomlaUpdateSitesIds(0));

		// First backup any custom extra_query for the sites
		$query = $db->getQuery(true)
			->select('TRIM(' . $db->quoteName('location') . ') AS ' . $db->quoteName('location') . ', ' . $db->quoteName('extra_query'))
			->from($db->quoteName('#__update_sites'));
		$db->setQuery($query);
		$backupExtraQuerys = $db->loadAssocList('location');

		// Delete from all tables (except joomla core update sites).
		$query = $db->getQuery(true)
			->delete($db->quoteName('#__update_sites'))
			->where($db->quoteName('update_site_id') . ' NOT IN (' . $joomlaUpdateSitesIds . ')');
		$db->setQuery($query);
		$db->execute();

		$query = $db->getQuery(true)
			->delete($db->quoteName('#__update_sites_extensions'))
			->where($db->quoteName('update_site_id') . ' NOT IN (' . $joomlaUpdateSitesIds . ')');
		$db->setQuery($query);
		$db->execute();

		$query = $db->getQuery(true)
			->delete($db->quoteName('#__updates'))
			->where($db->quoteName('update_site_id') . ' NOT IN (' . $joomlaUpdateSitesIds . ')');
		$db->setQuery($query);
		$db->execute();

		$count = 0;

		// Gets Joomla core extension Ids.
		$joomlaCoreExtensionIds = implode(', ', $this->getJoomlaUpdateSitesIds(1));

		// Search for updateservers in manifest files inside the folders to search.
		foreach ($pathsToSearch as $extensionFolderPath)
		{
			$tmpInstaller = new JInstaller;

			$tmpInstaller->setPath('source', $extensionFolderPath);

			// Main folder manifests (higher priority)
			$parentXmlfiles = JFolder::files($tmpInstaller->getPath('source'), '.xml$', false, true);

			// Search for children manifests (lower priority)
			$allXmlFiles    = JFolder::files($tmpInstaller->getPath('source'), '.xml$', 1, true);

			// Create an unique array of files ordered by priority
			$xmlfiles = array_unique(array_merge($parentXmlfiles, $allXmlFiles));

			if (!empty($xmlfiles))
			{
				foreach ($xmlfiles as $file)
				{
					// Is it a valid Joomla installation manifest file?
					$manifest = $tmpInstaller->isManifest($file);

					if (!is_null($manifest))
					{
						// Search if the extension exists in the extensions table. Excluding joomla core extensions and discovered but not yet installed extensions.
						$query = $db->getQuery(true)
							->select($db->quoteName('extension_id'))
							->from($db->quoteName('#__extensions'))
							->where('('
								. $db->quoteName('name') . ' = ' . $db->quote($manifest->name)
								. ' OR ' . $db->quoteName('name') . ' = ' . $db->quote($manifest->packagename)
								. ')' )
							->where($db->quoteName('type') . ' = ' . $db->quote($manifest['type']))
							->where($db->quoteName('extension_id') . ' NOT IN (' . $joomlaCoreExtensionIds . ')')
							->where($db->quoteName('state') . ' != -1');
						$db->setQuery($query);

						$eid = (int) $db->loadResult();

						if ($eid && $manifest->updateservers)
						{
							// Set the manifest object and path
							$tmpInstaller->manifest = $manifest;
							$tmpInstaller->setPath('manifest', $file);

							// Remove last extra_query as we are in a foreach
							$tmpInstaller->extraQuery = '';

							if ($tmpInstaller->manifest->updateservers
								&& $tmpInstaller->manifest->updateservers->server
								&& isset($backupExtraQuerys[trim((string) $tmpInstaller->manifest->updateservers->server)]))
							{
								$tmpInstaller->extraQuery = $backupExtraQuerys[trim((string) $tmpInstaller->manifest->updateservers->server)]['extra_query'];
							}

							// Load the extension plugin (if not loaded yet).
							JPluginHelper::importPlugin('extension', 'joomla');

							// Fire the onExtensionAfterUpdate
							JEventDispatcher::getInstance()->trigger('onExtensionAfterUpdate', array('installer' => $tmpInstaller, 'eid' => $eid));

							$count++;
						}
					}
				}
			}
		}

		if ($count > 0)
		{
			$app->enqueueMessage(JText::_('COM_INSTALLER_MSG_UPDATESITES_REBUILD_SUCCESS'), 'message');
		}
		else
		{
			$app->enqueueMessage(JText::_('COM_INSTALLER_MSG_UPDATESITES_REBUILD_MESSAGE'), 'message');
		}
		
		// Flush the system cache to ensure extra_query is correctly loaded next time.
		$this->cleanCache('_system', 1);
	}

	/**
	 * Fetch the Joomla update sites ids.
	 *
	 * @param   integer  $column  Column to return. 0 for update site ids, 1 for extension ids.
	 *
	 * @return  array  Array with joomla core update site ids.
	 *
	 * @since   3.6.0
	 */
	protected function getJoomlaUpdateSitesIds($column = 0)
	{
		$db  = JFactory::getDbo();

		// Fetch the Joomla core update sites ids and their extension ids. We search for all except the core joomla extension with update sites.
		$query = $db->getQuery(true)
			->select($db->quoteName(array('use.update_site_id', 'e.extension_id')))
			->from($db->quoteName('#__update_sites_extensions', 'use'))
			->join('LEFT', $db->quoteName('#__update_sites', 'us') . ' ON ' . $db->qn('us.update_site_id') . ' = ' . $db->qn('use.update_site_id'))
			->join('LEFT', $db->quoteName('#__extensions', 'e') . ' ON ' . $db->qn('e.extension_id') . ' = ' . $db->qn('use.extension_id'))
			->where('('
				. '(' . $db->qn('e.type') . ' = ' . $db->quote('file') . ' AND ' . $db->qn('e.element') . ' = ' . $db->quote('joomla') . ')'
				. ' OR (' . $db->qn('e.type') . ' = ' . $db->quote('package') . ' AND ' . $db->qn('e.element') . ' = ' . $db->quote('pkg_en-GB') . ')'
				. ' OR (' . $db->qn('e.type') . ' = ' . $db->quote('component') . ' AND ' . $db->qn('e.element') . ' = ' . $db->quote('com_joomlaupdate') . ')'
				. ')'
			);

		$db->setQuery($query);

		return $db->loadColumn($column);
	}

	/**
	 * Method to get the database query
	 *
	 * @return  JDatabaseQuery  The database query
	 *
	 * @since   3.4
	 */
	protected function getListQuery()
	{
		$query = JFactory::getDbo()->getQuery(true)
			->select(
				array(
					's.update_site_id',
					's.name AS update_site_name',
					's.type AS update_site_type',
					's.location',
					's.enabled',
					's.extra_query',
					'e.extension_id',
					'e.name',
					'e.type',
					'e.element',
					'e.folder',
					'e.client_id',
					'e.state',
					'e.manifest_cache',
				)
			)
			->from('#__update_sites AS s')
			->innerJoin('#__update_sites_extensions AS se ON (se.update_site_id = s.update_site_id)')
			->innerJoin('#__extensions AS e ON (e.extension_id = se.extension_id)')
			->where('state = 0');

		// Process select filters.
		$enabled  = $this->getState('filter.enabled');
		$type     = $this->getState('filter.type');
		$clientId = $this->getState('filter.client_id');
		$folder   = $this->getState('filter.folder');

		if ($enabled != '')
		{
			$query->where('s.enabled = ' . (int) $enabled);
		}

		if ($type)
		{
			$query->where('e.type = ' . $this->_db->quote($type));
		}

		if ($clientId != '')
		{
			$query->where('e.client_id = ' . (int) $clientId);
		}

		if ($folder != '' && in_array($type, array('plugin', 'library', '')))
		{
			$query->where('e.folder = ' . $this->_db->quote($folder == '*' ? '' : $folder));
		}

		// Process search filter (update site id).
		$search = $this->getState('filter.search');

		if (!empty($search) && stripos($search, 'id:') === 0)
		{
			$query->where('s.update_site_id = ' . (int) substr($search, 3));
		}

		// Note: The search for name, ordering and pagination are processed by the parent InstallerModel class (in extension.php).

		return $query;
	}
}
components/com_installer/models/warnings.php000060400000010006152453623450015412 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Installer Warnings Model
 *
 * @since  1.6
 */
class InstallerModelWarnings extends JModelList
{
	/**
	 * Extension Type
	 * @var	string
	 */
	public $type = 'warnings';

	/**
	 * Return the byte value of a particular string.
	 *
	 * @param   string  $val  String optionally with G, M or K suffix
	 *
	 * @return  integer   size in bytes
	 *
	 * @since 1.6
	 */
	public function return_bytes($val)
	{
		if (empty($val))
		{
			return 0;
		}

		$val = trim($val);

		preg_match('#([0-9]+)[\s]*([a-z]+)#i', $val, $matches);

		$last = '';

		if (isset($matches[2]))
		{
			$last = $matches[2];
		}

		if (isset($matches[1]))
		{
			$val = (int) $matches[1];
		}

		switch (strtolower($last))
		{
			case 'g':
			case 'gb':
				$val *= 1024;
			case 'm':
			case 'mb':
				$val *= 1024;
			case 'k':
			case 'kb':
				$val *= 1024;
		}

		return (int) $val;
	}

	/**
	 * Load the data.
	 *
	 * @return  array  Messages
	 *
	 * @since   1.6
	 */
	public function getItems()
	{
		static $messages;

		if ($messages)
		{
			return $messages;
		}

		$messages = array();
		$file_uploads = ini_get('file_uploads');

		if (!$file_uploads)
		{
			$messages[] = array('message' => JText::_('COM_INSTALLER_MSG_WARNINGS_FILEUPLOADSDISABLED'),
					'description' => JText::_('COM_INSTALLER_MSG_WARNINGS_FILEUPLOADISDISABLEDDESC'));
		}

		$upload_dir = ini_get('upload_tmp_dir');

		if (!$upload_dir)
		{
			$messages[] = array('message' => JText::_('COM_INSTALLER_MSG_WARNINGS_PHPUPLOADNOTSET'),
					'description' => JText::_('COM_INSTALLER_MSG_WARNINGS_PHPUPLOADNOTSETDESC'));
		}
		else
		{
			if (!is_writeable($upload_dir))
			{
				$messages[] = array('message' => JText::_('COM_INSTALLER_MSG_WARNINGS_PHPUPLOADNOTWRITEABLE'),
						'description' => JText::sprintf('COM_INSTALLER_MSG_WARNINGS_PHPUPLOADNOTWRITEABLEDESC', $upload_dir));
			}
		}

		$config = JFactory::getConfig();
		$tmp_path = $config->get('tmp_path');

		if (!$tmp_path)
		{
			$messages[] = array('message' => JText::_('COM_INSTALLER_MSG_WARNINGS_JOOMLATMPNOTSET'),
					'description' => JText::_('COM_INSTALLER_MSG_WARNINGS_JOOMLATMPNOTSETDESC'));
		}
		else
		{
			if (!is_writeable($tmp_path))
			{
				$messages[] = array('message' => JText::_('COM_INSTALLER_MSG_WARNINGS_JOOMLATMPNOTWRITEABLE'),
						'description' => JText::sprintf('COM_INSTALLER_MSG_WARNINGS_JOOMLATMPNOTWRITEABLEDESC', $tmp_path));
			}
		}

		$memory_limit = $this->return_bytes(ini_get('memory_limit'));

		if ($memory_limit < (8 * 1024 * 1024) && $memory_limit != -1)
		{
			// 8MB
			$messages[] = array('message' => JText::_('COM_INSTALLER_MSG_WARNINGS_LOWMEMORYWARN'),
					'description' => JText::_('COM_INSTALLER_MSG_WARNINGS_LOWMEMORYDESC'));
		}
		elseif ($memory_limit < (16 * 1024 * 1024) && $memory_limit != -1)
		{
			// 16MB
			$messages[] = array('message' => JText::_('COM_INSTALLER_MSG_WARNINGS_MEDMEMORYWARN'),
					'description' => JText::_('COM_INSTALLER_MSG_WARNINGS_MEDMEMORYDESC'));
		}

		$post_max_size = $this->return_bytes(ini_get('post_max_size'));
		$upload_max_filesize = $this->return_bytes(ini_get('upload_max_filesize'));

		if ($post_max_size < $upload_max_filesize)
		{
			$messages[] = array('message' => JText::_('COM_INSTALLER_MSG_WARNINGS_UPLOADBIGGERTHANPOST'),
					'description' => JText::_('COM_INSTALLER_MSG_WARNINGS_UPLOADBIGGERTHANPOSTDESC'));
		}

		if ($post_max_size < (8 * 1024 * 1024)) // 8MB
		{
			$messages[] = array('message' => JText::_('COM_INSTALLER_MSG_WARNINGS_SMALLPOSTSIZE'),
					'description' => JText::_('COM_INSTALLER_MSG_WARNINGS_SMALLPOSTSIZEDESC'));
		}

		if ($upload_max_filesize < (8 * 1024 * 1024)) // 8MB
		{
			$messages[] = array('message' => JText::_('COM_INSTALLER_MSG_WARNINGS_SMALLUPLOADSIZE'),
					'description' => JText::_('COM_INSTALLER_MSG_WARNINGS_SMALLUPLOADSIZEDESC'));
		}

		return $messages;
	}
}
components/com_installer/models/fields/location.php000060400000001557152453623450016653 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('InstallerHelper', JPATH_ADMINISTRATOR . '/components/com_installer/helpers/installer.php');

JFormHelper::loadFieldClass('list');

/**
 * Location field.
 *
 * @since  3.5
 */
class JFormFieldLocation extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var	   string
	 * @since  3.5
	 */
	protected $type = 'Location';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   3.5
	 */
	public function getOptions()
	{
		$options = InstallerHelper::getClientOptions();

		return array_merge(parent::getOptions(), $options);
	}
}
components/com_installer/models/fields/folder.php000060400000001554152453623450016313 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('InstallerHelper', JPATH_ADMINISTRATOR . '/components/com_installer/helpers/installer.php');

JFormHelper::loadFieldClass('list');

/**
 * Folder field.
 *
 * @since  3.5
 */
class JFormFieldFolder extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.5
	 */
	protected $type = 'Folder';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   3.5
	 */
	public function getOptions()
	{
		$options = InstallerHelper::getExtensionGroupes();

		return array_merge(parent::getOptions(), $options);
	}
}
components/com_installer/models/fields/extensionstatus.php000060400000001604152453623450020314 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('InstallerHelper', JPATH_ADMINISTRATOR . '/components/com_installer/helpers/installer.php');

JFormHelper::loadFieldClass('list');

/**
 * Extension Status field.
 *
 * @since  3.5
 */
class JFormFieldExtensionStatus extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.5
	 */
	protected $type = 'ExtensionStatus';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   3.5
	 */
	public function getOptions()
	{
		$options = InstallerHelper::getStateOptions();

		return array_merge(parent::getOptions(), $options);
	}
}
components/com_installer/models/fields/type.php000060400000001602152453623450016013 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('InstallerHelper', JPATH_ADMINISTRATOR . '/components/com_installer/helpers/installer.php');

JFormHelper::loadFieldClass('list');

/**
 * Form field for a list of extension types.
 *
 * @since  3.5
 */
class JFormFieldType extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var	   string
	 * @since  3.5
	 */
	protected $type = 'Type';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   3.5
	 */
	public function getOptions()
	{
		$options = InstallerHelper::getExtensionTypes();

		return array_merge(parent::getOptions(), $options);
	}
}
components/com_installer/models/database.php000060400000017170152453623450015337 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

JLoader::register('InstallerModel', __DIR__ . '/extension.php');
JLoader::register('JoomlaInstallerScript', JPATH_ADMINISTRATOR . '/components/com_admin/script.php');

/**
 * Installer Database Model
 *
 * @since  1.6
 */
class InstallerModelDatabase extends InstallerModel
{
	protected $_context = 'com_installer.discover';

	/**
	 * 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 = 'name', $direction = 'asc')
	{
		$app = JFactory::getApplication();
		$this->setState('message', $app->getUserState('com_installer.message'));
		$this->setState('extension_message', $app->getUserState('com_installer.extension_message'));
		$app->setUserState('com_installer.message', '');
		$app->setUserState('com_installer.extension_message', '');

		// Prepare the utf8mb4 conversion check table
		$this->prepareUtf8mb4StatusTable();

		parent::populateState($ordering, $direction);
	}

	/**
	 * Fixes database problems.
	 *
	 * @return  void
	 */
	public function fix()
	{
		if (!$changeSet = $this->getItems())
		{
			return false;
		}

		$changeSet->fix();
		$this->fixSchemaVersion($changeSet);
		$this->fixUpdateVersion();
		$installer = new JoomlaInstallerScript;
		$installer->deleteUnexistingFiles();
		$this->fixDefaultTextFilters();

		/*
		 * Finally, if the schema updates succeeded, make sure the database is
		 * converted to utf8mb4 or, if not supported by the server, compatible to it.
		 */
		$statusArray = $changeSet->getStatus();

		if (count($statusArray['error']) == 0)
		{
			$installer->convertTablesToUtf8mb4(false);
		}
	}

	/**
	 * Gets the changeset object.
	 *
	 * @return  JSchemaChangeset
	 */
	public function getItems()
	{
		$folder = JPATH_ADMINISTRATOR . '/components/com_admin/sql/updates/';

		try
		{
			$changeSet = JSchemaChangeset::getInstance($this->getDbo(), $folder);
		}
		catch (RuntimeException $e)
		{
			JFactory::getApplication()->enqueueMessage($e->getMessage(), 'warning');

			return false;
		}

		return $changeSet;
	}

	/**
	 * Method to get a JPagination object for the data set.
	 *
	 * @return  boolean
	 *
	 * @since   3.0.1
	 */
	public function getPagination()
	{
		return true;
	}

	/**
	 * Get version from #__schemas table.
	 *
	 * @return  mixed  the return value from the query, or null if the query fails.
	 *
	 * @throws Exception
	 */
	public function getSchemaVersion()
	{
		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->select('version_id')
			->from($db->quoteName('#__schemas'))
			->where('extension_id = 700');
		$db->setQuery($query);
		$result = $db->loadResult();

		return $result;
	}

	/**
	 * Fix schema version if wrong.
	 *
	 * @param   JSchemaChangeSet  $changeSet  Schema change set.
	 *
	 * @return   mixed  string schema version if success, false if fail.
	 */
	public function fixSchemaVersion($changeSet)
	{
		// Get correct schema version -- last file in array.
		$schema = $changeSet->getSchema();

		// Check value. If ok, don't do update.
		if ($schema == $this->getSchemaVersion())
		{
			return $schema;
		}

		// Delete old row.
		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->delete($db->quoteName('#__schemas'))
			->where($db->quoteName('extension_id') . ' = 700');
		$db->setQuery($query);
		$db->execute();

		// Add new row.
		$query->clear()
			->insert($db->quoteName('#__schemas'))
			->columns($db->quoteName('extension_id') . ',' . $db->quoteName('version_id'))
			->values('700, ' . $db->quote($schema));
		$db->setQuery($query);

		try
		{
			$db->execute();
		}
		catch (JDatabaseExceptionExecuting $e)
		{
			return false;
		}

		return $schema;
	}

	/**
	 * Get current version from #__extensions table.
	 *
	 * @return  mixed   version if successful, false if fail.
	 */
	public function getUpdateVersion()
	{
		$table = JTable::getInstance('Extension');
		$table->load('700');
		$cache = new Registry($table->manifest_cache);

		return $cache->get('version');
	}

	/**
	 * Fix Joomla version in #__extensions table if wrong (doesn't equal JVersion short version).
	 *
	 * @return   mixed  string update version if success, false if fail.
	 */
	public function fixUpdateVersion()
	{
		$table = JTable::getInstance('Extension');
		$table->load('700');
		$cache = new Registry($table->manifest_cache);
		$updateVersion = $cache->get('version');
		$cmsVersion = new JVersion;

		if ($updateVersion == $cmsVersion->getShortVersion())
		{
			return $updateVersion;
		}

		$cache->set('version', $cmsVersion->getShortVersion());
		$table->manifest_cache = $cache->toString();

		if ($table->store())
		{
			return $cmsVersion->getShortVersion();
		}

		return false;
	}

	/**
	 * For version 2.5.x only
	 * Check if com_config parameters are blank.
	 *
	 * @return  string  default text filters (if any).
	 */
	public function getDefaultTextFilters()
	{
		$table = JTable::getInstance('Extension');
		$table->load($table->find(array('name' => 'com_config')));

		return $table->params;
	}

	/**
	 * For version 2.5.x only
	 * Check if com_config parameters are blank. If so, populate with com_content text filters.
	 *
	 * @return  mixed  boolean true if params are updated, null otherwise.
	 */
	public function fixDefaultTextFilters()
	{
		$table = JTable::getInstance('Extension');
		$table->load($table->find(array('name' => 'com_config')));

		// Check for empty $config and non-empty content filters.
		if (!$table->params)
		{
			// Get filters from com_content and store if you find them.
			$contentParams = JComponentHelper::getParams('com_content');

			if ($contentParams->get('filters'))
			{
				$newParams = new Registry;
				$newParams->set('filters', $contentParams->get('filters'));
				$table->params = (string) $newParams;
				$table->store();

				return true;
			}
		}
	}

	/**
	 * Prepare the table to save the status of utf8mb4 conversion
	 * Make sure it contains 1 initialized record if there is not
	 * already exactly 1 record.
	 *
	 * @return  void
	 *
	 * @since   3.5
	 */
	private function prepareUtf8mb4StatusTable()
	{
		$db = JFactory::getDbo();

		$serverType = $db->getServerType();

		if ($serverType != 'mysql')
		{
			return;
		}

		$creaTabSql = 'CREATE TABLE IF NOT EXISTS ' . $db->quoteName('#__utf8_conversion')
			. ' (' . $db->quoteName('converted') . ' tinyint NOT NULL DEFAULT 0'
			. ') ENGINE=InnoDB';

		if ($db->hasUTF8mb4Support())
		{
			$creaTabSql = $creaTabSql
				. ' DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci;';
		}
		else
		{
			$creaTabSql = $creaTabSql
				. ' DEFAULT CHARSET=utf8 DEFAULT COLLATE=utf8_unicode_ci;';
		}

		$db->setQuery($creaTabSql)->execute();

		$db->setQuery('SELECT COUNT(*) FROM ' . $db->quoteName('#__utf8_conversion') . ';');

		$count = $db->loadResult();

		if ($count > 1)
		{
			// Table messed up somehow, clear it
			$db->setQuery('DELETE FROM ' . $db->quoteName('#__utf8_conversion') . ';')
				->execute();
			$db->setQuery('INSERT INTO ' . $db->quoteName('#__utf8_conversion')
				. ' (' . $db->quoteName('converted') . ') VALUES (0);'
			)->execute();
		}
		elseif ($count == 0)
		{
			// Record missing somehow, fix this
			$db->setQuery('INSERT INTO ' . $db->quoteName('#__utf8_conversion')
				. ' (' . $db->quoteName('converted') . ') VALUES (0);'
			)->execute();
		}
	}
}
components/com_installer/models/manage.php000060400000021502152453623450015015 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('InstallerModel', __DIR__ . '/extension.php');

/**
 * Installer Manage Model
 *
 * @since  1.5
 */
class InstallerModelManage extends InstallerModel
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'status',
				'name',
				'client_id',
				'client', 'client_translated',
				'type', 'type_translated',
				'folder', 'folder_translated',
				'package_id',
				'extension_id',
			);
		}

		parent::__construct($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 = 'name', $direction = 'asc')
	{
		$app = JFactory::getApplication();

		// Load the filter state.
		$this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string'));
		$this->setState('filter.client_id', $this->getUserStateFromRequest($this->context . '.filter.client_id', 'filter_client_id', null, 'int'));
		$this->setState('filter.status', $this->getUserStateFromRequest($this->context . '.filter.status', 'filter_status', '', 'string'));
		$this->setState('filter.type', $this->getUserStateFromRequest($this->context . '.filter.type', 'filter_type', '', 'string'));
		$this->setState('filter.folder', $this->getUserStateFromRequest($this->context . '.filter.folder', 'filter_folder', '', 'string'));

		$this->setState('message', $app->getUserState('com_installer.message'));
		$this->setState('extension_message', $app->getUserState('com_installer.extension_message'));
		$app->setUserState('com_installer.message', '');
		$app->setUserState('com_installer.extension_message', '');

		parent::populateState($ordering, $direction);
	}

	/**
	 * Enable/Disable an extension.
	 *
	 * @param   array  $eid    Extension ids to un/publish
	 * @param   int    $value  Publish value
	 *
	 * @return  boolean  True on success
	 *
	 * @since   1.5
	 */
	public function publish(&$eid = array(), $value = 1)
	{
		$user = JFactory::getUser();

		if (!$user->authorise('core.edit.state', 'com_installer'))
		{
			JError::raiseWarning(403, JText::_('JLIB_APPLICATION_ERROR_EDITSTATE_NOT_PERMITTED'));

			return false;
		}

		$result = true;

		/*
		 * Ensure eid is an array of extension ids
		 * TODO: If it isn't an array do we want to set an error and fail?
		 */
		if (!is_array($eid))
		{
			$eid = array($eid);
		}

		// Get a table object for the extension type
		$table = JTable::getInstance('Extension');
		JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_templates/tables');

		// Enable the extension in the table and store it in the database
		foreach ($eid as $i => $id)
		{
			$table->load($id);

			if ($table->type == 'template')
			{
				$style = JTable::getInstance('Style', 'TemplatesTable');

				if ($style->load(array('template' => $table->element, 'client_id' => $table->client_id, 'home' => 1)))
				{
					JError::raiseNotice(403, JText::_('COM_INSTALLER_ERROR_DISABLE_DEFAULT_TEMPLATE_NOT_PERMITTED'));
					unset($eid[$i]);
					continue;
				}
			}

			if ($table->protected == 1)
			{
				$result = false;
				JError::raiseWarning(403, JText::_('JLIB_APPLICATION_ERROR_EDITSTATE_NOT_PERMITTED'));
			}
			else
			{
				$table->enabled = $value;
			}
		
			$context = $this->option . '.' . $this->name;
			JPluginHelper::importPlugin('extension');
			JEventDispatcher::getInstance()->trigger('onExtensionChangeState', array($context, $eid, $value));

			if (!$table->store())
			{
				$this->setError($table->getError());
				$result = false;
			}
		}

		// Clear the cached extension data and menu cache
		$this->cleanCache('_system', 0);
		$this->cleanCache('_system', 1);
		$this->cleanCache('com_modules', 0);
		$this->cleanCache('com_modules', 1);
		$this->cleanCache('mod_menu', 0);
		$this->cleanCache('mod_menu', 1);

		return $result;
	}

	/**
	 * Refreshes the cached manifest information for an extension.
	 *
	 * @param   int  $eid  extension identifier (key in #__extensions)
	 *
	 * @return  boolean  result of refresh
	 *
	 * @since   1.6
	 */
	public function refresh($eid)
	{
		if (!is_array($eid))
		{
			$eid = array($eid => 0);
		}

		// Get an installer object for the extension type
		$installer = JInstaller::getInstance();
		$result = 0;

		// Uninstall the chosen extensions
		foreach ($eid as $id)
		{
			$result |= $installer->refreshManifestCache($id);
		}

		return $result;
	}

	/**
	 * Remove (uninstall) an extension
	 *
	 * @param   array  $eid  An array of identifiers
	 *
	 * @return  boolean  True on success
	 *
	 * @since   1.5
	 */
	public function remove($eid = array())
	{
		$user = JFactory::getUser();

		if (!$user->authorise('core.delete', 'com_installer'))
		{
			JError::raiseWarning(403, JText::_('JERROR_CORE_DELETE_NOT_PERMITTED'));

			return false;
		}

		/*
		 * Ensure eid is an array of extension ids in the form id => client_id
		 * TODO: If it isn't an array do we want to set an error and fail?
		 */
		if (!is_array($eid))
		{
			$eid = array($eid => 0);
		}

		// Get an installer object for the extension type
		$installer = JInstaller::getInstance();
		$row = JTable::getInstance('extension');

		// Uninstall the chosen extensions
		$msgs = array();
		$result = false;

		foreach ($eid as $id)
		{
			$id = trim($id);
			$row->load($id);
			$result = false;

			$langstring = 'COM_INSTALLER_TYPE_TYPE_' . strtoupper($row->type);
			$rowtype = JText::_($langstring);

			if (strpos($rowtype, $langstring) !== false)
			{
				$rowtype = $row->type;
			}

			if ($row->type)
			{
				$result = $installer->uninstall($row->type, $id);

				// Build an array of extensions that failed to uninstall
				if ($result === false)
				{
					// There was an error in uninstalling the package
					$msgs[] = JText::sprintf('COM_INSTALLER_UNINSTALL_ERROR', $rowtype);

					continue;
				}

				// Package uninstalled successfully
				$msgs[] = JText::sprintf('COM_INSTALLER_UNINSTALL_SUCCESS', $rowtype);
				$result = true;

				continue;
			}

			// There was an error in uninstalling the package
			$msgs[] = JText::sprintf('COM_INSTALLER_UNINSTALL_ERROR', $rowtype);
		}

		$msg = implode('<br />', $msgs);
		$app = JFactory::getApplication();
		$app->enqueueMessage($msg);
		$this->setState('action', 'remove');
		$this->setState('name', $installer->get('name'));
		$app->setUserState('com_installer.message', $installer->message);
		$app->setUserState('com_installer.extension_message', $installer->get('extension_message'));

		// Clear the cached extension data and menu cache
		$this->cleanCache('_system', 0);
		$this->cleanCache('_system', 1);
		$this->cleanCache('com_modules', 0);
		$this->cleanCache('com_modules', 1);
		$this->cleanCache('com_plugins', 0);
		$this->cleanCache('com_plugins', 1);
		$this->cleanCache('mod_menu', 0);
		$this->cleanCache('mod_menu', 1);

		return $result;
	}

	/**
	 * Method to get the database query
	 *
	 * @return  JDatabaseQuery  The database query
	 *
	 * @since   1.6
	 */
	protected function getListQuery()
	{
		$query = $this->getDbo()->getQuery(true)
			->select('*')
			->select('2*protected+(1-protected)*enabled AS status')
			->from('#__extensions')
			->where('state = 0');

		// Process select filters.
		$status   = $this->getState('filter.status');
		$type     = $this->getState('filter.type');
		$clientId = $this->getState('filter.client_id');
		$folder   = $this->getState('filter.folder');

		if ($status != '')
		{
			if ($status == '2')
			{
				$query->where('protected = 1');
			}
			elseif ($status == '3')
			{
				$query->where('protected = 0');
			}
			else
			{
				$query->where('protected = 0')
					->where('enabled = ' . (int) $status);
			}
		}

		if ($type)
		{
			$query->where('type = ' . $this->_db->quote($type));
		}

		if ($clientId != '')
		{
			$query->where('client_id = ' . (int) $clientId);
		}

		if ($folder != '')
		{
			$query->where('folder = ' . $this->_db->quote($folder == '*' ? '' : $folder));
		}

		// Process search filter (extension id).
		$search = $this->getState('filter.search');

		if (!empty($search) && stripos($search, 'id:') === 0)
		{
			$query->where('extension_id = ' . (int) substr($search, 3));
		}

		// Note: The search for name, ordering and pagination are processed by the parent InstallerModel class (in extension.php).

		return $query;
	}
}
components/com_installer/models/discover.php000060400000014550152453623450015410 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

JLoader::register('InstallerModel', __DIR__ . '/extension.php');

/**
 * Installer Discover Model
 *
 * @since  1.6
 */
class InstallerModelDiscover extends InstallerModel
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   3.5
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'name',
				'client_id',
				'client', 'client_translated',
				'type', 'type_translated',
				'folder', 'folder_translated',
				'extension_id',
			);
		}

		parent::__construct($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   3.1
	 */
	protected function populateState($ordering = 'name', $direction = 'asc')
	{
		$app = JFactory::getApplication();

		// Load the filter state.
		$this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string'));
		$this->setState('filter.client_id', $this->getUserStateFromRequest($this->context . '.filter.client_id', 'filter_client_id', null, 'int'));
		$this->setState('filter.type', $this->getUserStateFromRequest($this->context . '.filter.type', 'filter_type', '', 'string'));
		$this->setState('filter.folder', $this->getUserStateFromRequest($this->context . '.filter.folder', 'filter_folder', '', 'string'));

		$this->setState('message', $app->getUserState('com_installer.message'));
		$this->setState('extension_message', $app->getUserState('com_installer.extension_message'));

		$app->setUserState('com_installer.message', '');
		$app->setUserState('com_installer.extension_message', '');

		parent::populateState($ordering, $direction);
	}

	/**
	 * Method to get the database query.
	 *
	 * @return  JDatabaseQuery  the database query
	 *
	 * @since   3.1
	 */
	protected function getListQuery()
	{
		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->select('*')
			->from($db->quoteName('#__extensions'))
			->where($db->quoteName('state') . ' = -1');

		// Process select filters.
		$type     = $this->getState('filter.type');
		$clientId = $this->getState('filter.client_id');
		$folder   = $this->getState('filter.folder');

		if ($type)
		{
			$query->where($db->quoteName('type') . ' = ' . $db->quote($type));
		}

		if ($clientId != '')
		{
			$query->where($db->quoteName('client_id') . ' = ' . (int) $clientId);
		}

		if ($folder != '' && in_array($type, array('plugin', 'library', '')))
		{
			$query->where($db->quoteName('folder') . ' = ' . $db->quote($folder == '*' ? '' : $folder));
		}

		// Process search filter.
		$search = $this->getState('filter.search');

		if (!empty($search))
		{
			if (stripos($search, 'id:') === 0)
			{
				$query->where($db->quoteName('extension_id') . ' = ' . (int) substr($search, 3));
			}
		}

		// Note: The search for name, ordering and pagination are processed by the parent InstallerModel class (in extension.php).

		return $query;
	}

	/**
	 * Discover extensions.
	 *
	 * Finds uninstalled extensions
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function discover()
	{
		// Purge the list of discovered extensions and fetch them again.
		$this->purge();
		$results = JInstaller::getInstance()->discover();

		// Get all templates, including discovered ones
		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName(array('extension_id', 'element', 'folder', 'client_id', 'type')))
			->from($db->quoteName('#__extensions'));
		$db->setQuery($query);
		$installedtmp = $db->loadObjectList();

		$extensions = array();

		foreach ($installedtmp as $install)
		{
			$key = implode(':', array($install->type, $install->element, $install->folder, $install->client_id));
			$extensions[$key] = $install;
		}

		foreach ($results as $result)
		{
			// Check if we have a match on the element
			$key = implode(':', array($result->type, $result->element, $result->folder, $result->client_id));

			if (!array_key_exists($key, $extensions))
			{
				// Put it into the table
				$result->check();
				$result->store();
			}
		}
	}

	/**
	 * Installs a discovered extension.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function discover_install()
	{
		$app   = JFactory::getApplication();
		$input = $app->input;
		$eid   = $input->get('cid', 0, 'array');

		if (is_array($eid) || $eid)
		{
			if (!is_array($eid))
			{
				$eid = array($eid);
			}

			$eid = ArrayHelper::toInteger($eid);
			$failed = false;

			foreach ($eid as $id)
			{
				$installer = new JInstaller;

				$result = $installer->discover_install($id);

				if (!$result)
				{
					$failed = true;
					$app->enqueueMessage(JText::_('COM_INSTALLER_MSG_DISCOVER_INSTALLFAILED') . ': ' . $id);
				}
			}

			// TODO - We are only receiving the message for the last JInstaller instance
			$this->setState('action', 'remove');
			$this->setState('name', $installer->get('name'));
			$app->setUserState('com_installer.message', $installer->message);
			$app->setUserState('com_installer.extension_message', $installer->get('extension_message'));

			if (!$failed)
			{
				$app->enqueueMessage(JText::_('COM_INSTALLER_MSG_DISCOVER_INSTALLSUCCESSFUL'));
			}
		}
		else
		{
			$app->enqueueMessage(JText::_('COM_INSTALLER_MSG_DISCOVER_NOEXTENSIONSELECTED'));
		}
	}

	/**
	 * Cleans out the list of discovered extensions.
	 *
	 * @return  boolean  True on success
	 *
	 * @since   1.6
	 */
	public function purge()
	{
		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->delete($db->quoteName('#__extensions'))
			->where($db->quoteName('state') . ' = -1');
		$db->setQuery($query);

		try
		{
			$db->execute();
		}
		catch (JDatabaseExceptionExecuting $e)
		{
			$this->_message = JText::_('COM_INSTALLER_MSG_DISCOVER_FAILEDTOPURGEEXTENSIONS');

			return false;
		}

		$this->_message = JText::_('COM_INSTALLER_MSG_DISCOVER_PURGEDDISCOVEREDEXTENSIONS');

		return true;
	}
}
components/com_installer/models/extension.php000060400000015311152453623450015602 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Extension Manager Abstract Extension Model.
 *
 * @since  1.5
 */
class InstallerModel extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'name',
				'client_id',
				'client', 'client_translated',
				'enabled',
				'type', 'type_translated',
				'folder', 'folder_translated',
				'extension_id',
			);
		}

		parent::__construct($config);
	}

	/**
	 * Returns an object list
	 *
	 * @param   string  $query       The query
	 * @param   int     $limitstart  Offset
	 * @param   int     $limit       The number of records
	 *
	 * @return  array
	 */
	protected function _getList($query, $limitstart = 0, $limit = 0)
	{
		$listOrder = $this->getState('list.ordering', 'name');
		$listDirn  = $this->getState('list.direction', 'asc');

		// Replace slashes so preg_match will work
		$search = $this->getState('filter.search');
		$search = str_replace('/', ' ', $search);
		$db     = $this->getDbo();

		// Define which fields have to be processed in a custom way because of translation.
		$customOrderFields = array('name', 'client_translated', 'type_translated', 'folder_translated');

		// Process searching, ordering and pagination for fields that need to be translated.
		if (in_array($listOrder, $customOrderFields) || (!empty($search) && stripos($search, 'id:') !== 0))
		{
			// Get results from database and translate them.
			$db->setQuery($query);
			$result = $db->loadObjectList();
			$this->translate($result);

			// Process searching.
			if (!empty($search) && stripos($search, 'id:') !== 0)
			{
				$escapedSearchString = $this->refineSearchStringToRegex($search, '/');

				// By default search only the extension name field.
				$searchFields = array('name');

				// If in update sites view search also in the update site name field.
				if ($this instanceof InstallerModelUpdatesites)
				{
					$searchFields[] = 'update_site_name';
				}

				foreach ($result as $i => $item)
				{
					// Check if search string exists in any of the fields to be searched.
					$found = 0;

					foreach ($searchFields as $key => $field)
					{
						if (!$found && preg_match('/' . $escapedSearchString . '/i', $item->{$field}))
						{
							$found = 1;
						}
					}

					// If search string was not found in any of the fields searched remove it from results array.
					if (!$found)
					{
						unset($result[$i]);
					}
				}
			}

			// Process ordering.
			// Sort array object by selected ordering and selected direction. Sort is case insensitive and using locale sorting.
			$result = ArrayHelper::sortObjects($result, $listOrder, strtolower($listDirn) == 'desc' ? -1 : 1, false, true);

			// Process pagination.
			$total = count($result);
			$this->cache[$this->getStoreId('getTotal')] = $total;

			if ($total <= $limitstart)
			{
				$limitstart = 0;
				$this->setState('list.limitstart', 0);
			}

			return array_slice($result, $limitstart, $limit ?: null);
		}

		// Process searching, ordering and pagination for regular database fields.
		$query->order($db->quoteName($listOrder) . ' ' . $db->escape($listDirn));
		$result = parent::_getList($query, $limitstart, $limit);
		$this->translate($result);

		return $result;
	}

	/**
	 * Translate a list of objects
	 *
	 * @param   array  $items  The array of objects
	 *
	 * @return  array The array of translated objects
	 */
	protected function translate(&$items)
	{
		$lang = JFactory::getLanguage();

		foreach ($items as &$item)
		{
			if (strlen($item->manifest_cache) && $data = json_decode($item->manifest_cache))
			{
				foreach ($data as $key => $value)
				{
					if ($key == 'type')
					{
						// Ignore the type field
						continue;
					}

					$item->$key = $value;
				}
			}

			$item->author_info       = @$item->authorEmail . '<br />' . @$item->authorUrl;
			$item->client            = $item->client_id ? JText::_('JADMINISTRATOR') : JText::_('JSITE');
			$item->client_translated = $item->client;
			$item->type_translated   = JText::_('COM_INSTALLER_TYPE_' . strtoupper($item->type));
			$item->folder_translated = @$item->folder ? $item->folder : JText::_('COM_INSTALLER_TYPE_NONAPPLICABLE');

			$path = $item->client_id ? JPATH_ADMINISTRATOR : JPATH_SITE;

			switch ($item->type)
			{
				case 'component':
					$extension = $item->element;
					$source = JPATH_ADMINISTRATOR . '/components/' . $extension;
						$lang->load("$extension.sys", JPATH_ADMINISTRATOR, null, false, true)
					||	$lang->load("$extension.sys", $source, null, false, true);
				break;
				case 'file':
					$extension = 'files_' . $item->element;
						$lang->load("$extension.sys", JPATH_SITE, null, false, true);
				break;
				case 'library':
					$parts = explode('/', $item->element);
					$vendor = (isset($parts[1]) ? $parts[0] : null);
					$extension = 'lib_' . ($vendor ? implode('_', $parts) : $item->element);

					if (!$lang->load("$extension.sys", $path, null, false, true))
					{
						$source = $path . '/libraries/' . ($vendor ? $vendor . '/' . $parts[1] : $item->element);
						$lang->load("$extension.sys", $source, null, false, true);
					}
				break;
				case 'module':
					$extension = $item->element;
					$source = $path . '/modules/' . $extension;
						$lang->load("$extension.sys", $path, null, false, true)
					||	$lang->load("$extension.sys", $source, null, false, true);
				break;
				case 'plugin':
					$extension = 'plg_' . $item->folder . '_' . $item->element;
					$source = JPATH_PLUGINS . '/' . $item->folder . '/' . $item->element;
						$lang->load("$extension.sys", JPATH_ADMINISTRATOR, null, false, true)
					||	$lang->load("$extension.sys", $source, null, false, true);
				break;
				case 'template':
					$extension = 'tpl_' . $item->element;
					$source = $path . '/templates/' . $item->element;
						$lang->load("$extension.sys", $path, null, false, true)
					||	$lang->load("$extension.sys", $source, null, false, true);
				break;
				case 'package':
				default:
					$extension = $item->element;
						$lang->load("$extension.sys", JPATH_SITE, null, false, true);
				break;
			}

			// Translate the extension name if possible
			$item->name = JText::_($item->name);

			settype($item->description, 'string');

			if (!in_array($item->type, array('language')))
			{
				$item->description = JText::_($item->description);
			}
		}
	}
}
components/com_installer/models/forms/filter_languages.xml000060400000002027152453623450020240 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_INSTALLER_LANGUAGES_FILTER_SEARCH_LABEL"
			description="COM_INSTALLER_LANGUAGES_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
		/>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="name ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="name ASC">JGRID_HEADING_LANGUAGE_ASC</option>
			<option value="name DESC">JGRID_HEADING_LANGUAGE_DESC</option>
			<option value="element ASC">COM_INSTALLER_HEADING_LANGUAGE_TAG_ASC</option>
			<option value="element DESC">COM_INSTALLER_HEADING_LANGUAGE_TAG_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="JGLOBAL_LIMIT"
			description="JGLOBAL_LIMIT"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
    </fields>
</form>
components/com_installer/models/forms/filter_manage.xml000060400000005035152453623450017524 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset addfieldpath="/administrator/components/com_installer/models/fields" />

	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_INSTALLER_MANAGE_FILTER_SEARCH_LABEL"
			description="COM_INSTALLER_MANAGE_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
		/>

		<field
			name="status"
			type="extensionstatus"
			label="COM_PLUGINS_FILTER_PUBLISHED"
			description="COM_PLUGINS_FILTER_PUBLISHED_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>

		<field
			name="client_id"
			type="location"
			onchange="this.form.submit();"
			>
			<option value="">COM_INSTALLER_VALUE_CLIENT_SELECT</option>
		</field>

		<field
			name="type"
			type="type"
			onchange="this.form.submit();"
			>
			<option value="">COM_INSTALLER_VALUE_TYPE_SELECT</option>
		</field>

		<field
			name="folder"
			type="folder"
			onchange="this.form.submit();"
			>
			<option value="">COM_INSTALLER_VALUE_FOLDER_SELECT</option>
		</field>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="name ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="status ASC">JSTATUS_ASC</option>
			<option value="status DESC">JSTATUS_DESC</option>
			<option value="name ASC">COM_INSTALLER_HEADING_NAME_ASC</option>
			<option value="name DESC">COM_INSTALLER_HEADING_NAME_DESC</option>
			<option value="client_translated ASC">COM_INSTALLER_HEADING_LOCATION_ASC</option>
			<option value="client_translated DESC">COM_INSTALLER_HEADING_LOCATION_DESC</option>
			<option value="type_translated ASC">COM_INSTALLER_HEADING_TYPE_ASC</option>
			<option value="type_translated DESC">COM_INSTALLER_HEADING_TYPE_DESC</option>
			<option value="folder_translated ASC">COM_INSTALLER_HEADING_FOLDER_ASC</option>
			<option value="folder_translated DESC">COM_INSTALLER_HEADING_FOLDER_DESC</option>
			<option value="package_id ASC">COM_INSTALLER_HEADING_PACKAGE_ID_ASC</option>
			<option value="package_id DESC">COM_INSTALLER_HEADING_PACKAGE_ID_DESC</option>
			<option value="extension_id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="extension_id DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="JGLOBAL_LIMIT"
			description="JGLOBAL_LIMIT"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_installer/models/forms/filter_update.xml000060400000003625152453623450017561 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset addfieldpath="/administrator/components/com_installer/models/fields"/>

	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_INSTALLER_UPDATE_FILTER_SEARCH_LABEL"
			description="COM_INSTALLER_UPDATE_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
		/>
		<field
			name="client_id"
			type="location"
			onchange="this.form.submit();"
			>
			<option value="">COM_INSTALLER_VALUE_CLIENT_SELECT</option>
		</field>
		<field
			name="type"
			type="type"
			onchange="this.form.submit();"
			>
			<option value="">COM_INSTALLER_VALUE_TYPE_SELECT</option>
		</field>
		<field
			name="folder"
			type="folder"
			onchange="this.form.submit();"
			>
			<option value="">COM_INSTALLER_VALUE_FOLDER_SELECT</option>
		</field>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="u.name ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="u.name ASC">COM_INSTALLER_HEADING_NAME_ASC</option>
			<option value="u.name DESC">COM_INSTALLER_HEADING_NAME_DESC</option>
			<option value="client_translated ASC">COM_INSTALLER_HEADING_LOCATION_ASC</option>
			<option value="client_translated DESC">COM_INSTALLER_HEADING_LOCATION_DESC</option>
			<option value="type_translated ASC">COM_INSTALLER_HEADING_TYPE_ASC</option>
			<option value="type_translated DESC">COM_INSTALLER_HEADING_TYPE_DESC</option>
			<option value="folder_translated ASC">COM_INSTALLER_HEADING_FOLDER_ASC</option>
			<option value="folder_translated DESC">COM_INSTALLER_HEADING_FOLDER_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			label="JGLOBAL_LIMIT"
			description="JGLOBAL_LIMIT"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_installer/models/forms/filter_updatesites.xml000060400000005201152453623450020621 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset addfieldpath="/administrator/components/com_installer/models/fields"/>

	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_INSTALLER_UPDATESITES_FILTER_SEARCH_LABEL"
			description="COM_INSTALLER_UPDATESITES_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
		/>
		<field
			name="enabled"
			type="list"
			label="COM_PLUGINS_FILTER_PUBLISHED"
			description="COM_PLUGINS_FILTER_PUBLISHED_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
			<option value="0">JDISABLED</option>
			<option value="1">JENABLED</option>
		</field>
		<field
			name="client_id"
			type="location"
			onchange="this.form.submit();"
			>
			<option value="">COM_INSTALLER_VALUE_CLIENT_SELECT</option>
		</field>
		<field
			name="type"
			type="type"
			onchange="this.form.submit();"
			>
			<option value="">COM_INSTALLER_VALUE_TYPE_SELECT</option>
		</field>
		<field
			name="folder"
			type="folder"
			onchange="this.form.submit();"
			>
			<option value="">COM_INSTALLER_VALUE_FOLDER_SELECT</option>
		</field>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="name ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="enabled ASC">JSTATUS_ASC</option>
			<option value="enabled DESC">JSTATUS_DESC</option>
			<option value="update_site_name ASC">COM_INSTALLER_HEADING_UPDATESITE_NAME_ASC</option>
			<option value="update_site_name DESC">COM_INSTALLER_HEADING_UPDATESITE_NAME_DESC</option>
			<option value="name ASC">COM_INSTALLER_HEADING_NAME_ASC</option>
			<option value="name DESC">COM_INSTALLER_HEADING_NAME_DESC</option>
			<option value="client_translated ASC">COM_INSTALLER_HEADING_LOCATION_ASC</option>
			<option value="client_translated DESC">COM_INSTALLER_HEADING_LOCATION_DESC</option>
			<option value="type_translated ASC">COM_INSTALLER_HEADING_TYPE_ASC</option>
			<option value="type_translated DESC">COM_INSTALLER_HEADING_TYPE_DESC</option>
			<option value="folder_translated ASC">COM_INSTALLER_HEADING_FOLDER_ASC</option>
			<option value="folder_translated DESC">COM_INSTALLER_HEADING_FOLDER_DESC</option>
			<option value="update_site_id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="update_site_id DESC">JGRID_HEADING_ID_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			label="JGLOBAL_LIMIT"
			description="JGLOBAL_LIMIT"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_installer/models/forms/filter_discover.xml000060400000004036152453623450020112 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset addfieldpath="/administrator/components/com_installer/models/fields"/>

	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_INSTALLER_DISCOVER_FILTER_SEARCH_LABEL"
			description="COM_INSTALLER_DISCOVER_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
		/>

		<field
			name="client_id"
			type="location"
			onchange="this.form.submit();"
			>
			<option value="">COM_INSTALLER_VALUE_CLIENT_SELECT</option>
		</field>

		<field
			name="type"
			type="type"
			onchange="this.form.submit();"
			>
			<option value="">COM_INSTALLER_VALUE_TYPE_SELECT</option>
		</field>

		<field
			name="folder"
			type="folder"
			onchange="this.form.submit();"
			>
			<option value="">COM_INSTALLER_VALUE_FOLDER_SELECT</option>
		</field>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="name ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="name ASC">COM_INSTALLER_HEADING_NAME_ASC</option>
			<option value="name DESC">COM_INSTALLER_HEADING_NAME_DESC</option>
			<option value="client_translated ASC">COM_INSTALLER_HEADING_LOCATION_ASC</option>
			<option value="client_translated DESC">COM_INSTALLER_HEADING_LOCATION_DESC</option>
			<option value="type_translated ASC">COM_INSTALLER_HEADING_TYPE_ASC</option>
			<option value="type_translated DESC">COM_INSTALLER_HEADING_TYPE_DESC</option>
			<option value="folder_translated ASC">COM_INSTALLER_HEADING_FOLDER_ASC</option>
			<option value="folder_translated DESC">COM_INSTALLER_HEADING_FOLDER_DESC</option>
			<option value="extension_id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="extension_id DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="JGLOBAL_LIMIT"
			description="JGLOBAL_LIMIT"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_installer/models/install.php000060400000026246152453623450015245 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Extension Manager Install Model
 *
 * @since  1.5
 */
class InstallerModelInstall extends JModelLegacy
{
	/**
	 * @var object JTable object
	 */
	protected $_table = null;

	/**
	 * @var object JTable object
	 */
	protected $_url = null;

	/**
	 * Model context string.
	 *
	 * @var		string
	 */
	protected $_context = 'com_installer.install';

	/**
	 * 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()
	{
		$app = JFactory::getApplication('administrator');

		$this->setState('message', $app->getUserState('com_installer.message'));
		$this->setState('extension_message', $app->getUserState('com_installer.extension_message'));
		$app->setUserState('com_installer.message', '');
		$app->setUserState('com_installer.extension_message', '');

		parent::populateState();
	}

	/**
	 * Install an extension from either folder, URL or upload.
	 *
	 * @return  boolean result of install.
	 *
	 * @since   1.5
	 */
	public function install()
	{
		$this->setState('action', 'install');

		// Set FTP credentials, if given.
		JClientHelper::setCredentialsFromRequest('ftp');
		$app = JFactory::getApplication();

		// Load installer plugins for assistance if required:
		JPluginHelper::importPlugin('installer');
		$dispatcher = JEventDispatcher::getInstance();

		$package = null;

		// This event allows an input pre-treatment, a custom pre-packing or custom installation.
		// (e.g. from a JSON description).
		$results = $dispatcher->trigger('onInstallerBeforeInstallation', array($this, &$package));

		if (in_array(true, $results, true))
		{
			return true;
		}

		if (in_array(false, $results, true))
		{
			return false;
		}

		$installType = $app->input->getWord('installtype');

		if ($package === null)
		{
			switch ($installType)
			{
				case 'folder':
					// Remember the 'Install from Directory' path.
					$app->getUserStateFromRequest($this->_context . '.install_directory', 'install_directory');
					$package = $this->_getPackageFromFolder();
					break;

				case 'upload':
					$package = $this->_getPackageFromUpload();
					break;

				case 'url':
					$package = $this->_getPackageFromUrl();
					break;

				default:
					$app->setUserState('com_installer.message', JText::_('COM_INSTALLER_NO_INSTALL_TYPE_FOUND'));

					return false;
					break;
			}
		}

		// This event allows a custom installation of the package or a customization of the package:
		$results = $dispatcher->trigger('onInstallerBeforeInstaller', array($this, &$package));

		if (in_array(true, $results, true))
		{
			return true;
		}

		if (in_array(false, $results, true))
		{
			if (in_array($installType, array('upload', 'url')))
			{
				JInstallerHelper::cleanupInstall($package['packagefile'], $package['extractdir']);
			}

			return false;
		}

		// Check if package was uploaded successfully.
		if (!\is_array($package))
		{
			$app->enqueueMessage(JText::_('COM_INSTALLER_UNABLE_TO_FIND_INSTALL_PACKAGE'), 'error');

			return false;
		}

		// Get an installer instance.
		$installer = JInstaller::getInstance();

		/*
		 * Check for a Joomla core package.
		 * To do this we need to set the source path to find the manifest (the same first step as JInstaller::install())
		 *
		 * This must be done before the unpacked check because JInstallerHelper::detectType() returns a boolean false since the manifest
		 * can't be found in the expected location.
		 */
		if (isset($package['dir']) && is_dir($package['dir']))
		{
			$installer->setPath('source', $package['dir']);

			if (!$installer->findManifest())
			{
				// If a manifest isn't found at the source, this may be a Joomla package; check the package directory for the Joomla manifest
				if (file_exists($package['dir'] . '/administrator/manifests/files/joomla.xml'))
				{
					// We have a Joomla package
					if (in_array($installType, array('upload', 'url')))
					{
						JInstallerHelper::cleanupInstall($package['packagefile'], $package['extractdir']);
					}

					$app->enqueueMessage(
						JText::sprintf('COM_INSTALLER_UNABLE_TO_INSTALL_JOOMLA_PACKAGE', JRoute::_('index.php?option=com_joomlaupdate')),
						'warning'
					);

					return false;
				}
			}
		}

		// Was the package unpacked?
		if (empty($package['type']))
		{
			if (in_array($installType, array('upload', 'url')))
			{
				JInstallerHelper::cleanupInstall($package['packagefile'], $package['extractdir']);
			}

			$app->enqueueMessage(JText::_('JLIB_INSTALLER_ABORT_DETECTMANIFEST'), 'error');

			return false;
		}

		// Install the package.
		if (!$installer->install($package['dir']))
		{
			// There was an error installing the package.
			$msg = JText::sprintf('COM_INSTALLER_INSTALL_ERROR', JText::_('COM_INSTALLER_TYPE_TYPE_' . strtoupper($package['type'])));
			$result = false;
			$msgType = 'error';
		}
		else
		{
			// Package installed successfully.
			$msg = JText::sprintf('COM_INSTALLER_INSTALL_SUCCESS', JText::_('COM_INSTALLER_TYPE_TYPE_' . strtoupper($package['type'])));
			$result = true;
			$msgType = 'message';
		}

		// This event allows a custom a post-flight:
		$dispatcher->trigger('onInstallerAfterInstaller', array($this, &$package, $installer, &$result, &$msg));

		// Set some model state values.
		$app = JFactory::getApplication();
		$app->enqueueMessage($msg, $msgType);
		$this->setState('name', $installer->get('name'));
		$this->setState('result', $result);
		$app->setUserState('com_installer.message', $installer->message);
		$app->setUserState('com_installer.extension_message', $installer->get('extension_message'));
		$app->setUserState('com_installer.redirect_url', $installer->get('redirect_url'));

		// Cleanup the install files.
		if (!is_file($package['packagefile']))
		{
			$config = JFactory::getConfig();
			$package['packagefile'] = $config->get('tmp_path') . '/' . $package['packagefile'];
		}

		JInstallerHelper::cleanupInstall($package['packagefile'], $package['extractdir']);

		// Clear the cached extension data and menu cache
		$this->cleanCache('_system', 0);
		$this->cleanCache('_system', 1);
		$this->cleanCache('com_modules', 0);
		$this->cleanCache('com_modules', 1);
		$this->cleanCache('com_plugins', 0);
		$this->cleanCache('com_plugins', 1);
		$this->cleanCache('mod_menu', 0);
		$this->cleanCache('mod_menu', 1);

		return $result;
	}

	/**
	 * Works out an installation package from a HTTP upload.
	 *
	 * @return package definition or false on failure.
	 */
	protected function _getPackageFromUpload()
	{
		// Get the uploaded file information.
		$input    = JFactory::getApplication()->input;

		// Do not change the filter type 'raw'. We need this to let files containing PHP code to upload. See JInputFiles::get.
		$userfile = $input->files->get('install_package', null, 'raw');

		// Make sure that file uploads are enabled in php.
		if (!(bool) ini_get('file_uploads'))
		{
			JError::raiseWarning('', JText::_('COM_INSTALLER_MSG_INSTALL_WARNINSTALLFILE'));

			return false;
		}

		// Make sure that zlib is loaded so that the package can be unpacked.
		if (!extension_loaded('zlib'))
		{
			JError::raiseWarning('', JText::_('COM_INSTALLER_MSG_INSTALL_WARNINSTALLZLIB'));

			return false;
		}

		// If there is no uploaded file, we have a problem...
		if (!is_array($userfile))
		{
			JError::raiseWarning('', JText::_('COM_INSTALLER_MSG_INSTALL_NO_FILE_SELECTED'));

			return false;
		}

		// Is the PHP tmp directory missing?
		if ($userfile['error'] && ($userfile['error'] == UPLOAD_ERR_NO_TMP_DIR))
		{
			JError::raiseWarning(
				'',
				JText::_('COM_INSTALLER_MSG_INSTALL_WARNINSTALLUPLOADERROR') . '<br />' . JText::_('COM_INSTALLER_MSG_WARNINGS_PHPUPLOADNOTSET')
			);

			return false;
		}

		// Is the max upload size too small in php.ini?
		if ($userfile['error'] && ($userfile['error'] == UPLOAD_ERR_INI_SIZE))
		{
			JError::raiseWarning(
				'',
				JText::_('COM_INSTALLER_MSG_INSTALL_WARNINSTALLUPLOADERROR') . '<br />' . JText::_('COM_INSTALLER_MSG_WARNINGS_SMALLUPLOADSIZE')
			);

			return false;
		}

		// Check if there was a different problem uploading the file.
		if ($userfile['error'] || $userfile['size'] < 1)
		{
			JError::raiseWarning('', JText::_('COM_INSTALLER_MSG_INSTALL_WARNINSTALLUPLOADERROR'));

			return false;
		}

		// Build the appropriate paths.
		$config   = JFactory::getConfig();
		$tmp_dest = $config->get('tmp_path') . '/' . $userfile['name'];
		$tmp_src  = $userfile['tmp_name'];

		// Move uploaded file.
		jimport('joomla.filesystem.file');
		JFile::upload($tmp_src, $tmp_dest, false, true);

		// Unpack the downloaded package file.
		$package = JInstallerHelper::unpack($tmp_dest, true);

		return $package;
	}

	/**
	 * Install an extension from a directory
	 *
	 * @return  array  Package details or false on failure
	 *
	 * @since   1.5
	 */
	protected function _getPackageFromFolder()
	{
		$input = JFactory::getApplication()->input;

		// Get the path to the package to install.
		$p_dir = $input->getString('install_directory');
		$p_dir = JPath::clean($p_dir);

		// Did you give us a valid directory?
		if (!is_dir($p_dir))
		{
			JError::raiseWarning('', JText::_('COM_INSTALLER_MSG_INSTALL_PLEASE_ENTER_A_PACKAGE_DIRECTORY'));

			return false;
		}

		// Detect the package type
		$type = JInstallerHelper::detectType($p_dir);

		// Did you give us a valid package?
		if (!$type)
		{
			JError::raiseWarning('', JText::_('COM_INSTALLER_MSG_INSTALL_PATH_DOES_NOT_HAVE_A_VALID_PACKAGE'));
		}

		$package['packagefile'] = null;
		$package['extractdir'] = null;
		$package['dir'] = $p_dir;
		$package['type'] = $type;

		return $package;
	}

	/**
	 * Install an extension from a URL.
	 *
	 * @return  Package details or false on failure.
	 *
	 * @since   1.5
	 */
	protected function _getPackageFromUrl()
	{
		$input = JFactory::getApplication()->input;

		// Get the URL of the package to install.
		$url = $input->getString('install_url');

		// Did you give us a URL?
		if (!$url)
		{
			JError::raiseWarning('', JText::_('COM_INSTALLER_MSG_INSTALL_ENTER_A_URL'));

			return false;
		}

		// We only allow http & https here
		$uri = new JUri($url);

		if (!in_array($uri->getScheme(), array('http', 'https')))
		{
			JError::raiseWarning('', JText::_('COM_INSTALLER_MSG_INSTALL_INVALID_URL_SCHEME'));

			return false;
		}

		// Handle updater XML file case:
		if (preg_match('/\.xml\s*$/', $url))
		{
			jimport('joomla.updater.update');
			$update = new JUpdate;
			$update->loadFromXml($url);
			$package_url = trim($update->get('downloadurl', false)->_data);

			if ($package_url)
			{
				$url = $package_url;
			}

			unset($update);
		}

		// Download the package at the URL given.
		$p_file = JInstallerHelper::downloadPackage($url);

		// Was the package downloaded?
		if (!$p_file)
		{
			JError::raiseWarning('', JText::_('COM_INSTALLER_MSG_INSTALL_INVALID_URL'));

			return false;
		}

		$config   = JFactory::getConfig();
		$tmp_dest = $config->get('tmp_path');

		// Unpack the downloaded package file.
		$package = JInstallerHelper::unpack($tmp_dest . '/' . $p_file, true);

		return $package;
	}
}
components/com_installer/models/update.php000060400000040731152453623450015054 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

jimport('joomla.updater.update');

use Joomla\Utilities\ArrayHelper;
use Joomla\CMS\Installer\InstallerHelper;

/**
 * Installer Update Model
 *
 * @since  1.6
 */
class InstallerModelUpdate extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'name', 'u.name',
				'client_id', 'u.client_id', 'client_translated',
				'type', 'u.type', 'type_translated',
				'folder', 'u.folder', 'folder_translated',
				'extension_id', 'u.extension_id',
			);
		}

		parent::__construct($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 = 'u.name', $direction = 'asc')
	{
		$this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string'));
		$this->setState('filter.client_id', $this->getUserStateFromRequest($this->context . '.filter.client_id', 'filter_client_id', null, 'int'));
		$this->setState('filter.type', $this->getUserStateFromRequest($this->context . '.filter.type', 'filter_type', '', 'string'));
		$this->setState('filter.folder', $this->getUserStateFromRequest($this->context . '.filter.folder', 'filter_folder', '', 'string'));

		$app = JFactory::getApplication();
		$this->setState('message', $app->getUserState('com_installer.message'));
		$this->setState('extension_message', $app->getUserState('com_installer.extension_message'));
		$app->setUserState('com_installer.message', '');
		$app->setUserState('com_installer.extension_message', '');

		parent::populateState($ordering, $direction);
	}

	/**
	 * Method to get the database query
	 *
	 * @return  JDatabaseQuery  The database query
	 *
	 * @since   1.6
	 */
	protected function getListQuery()
	{
		$db = $this->getDbo();

		// Grab updates ignoring new installs
		$query = $db->getQuery(true)
			->select('u.*')
			->select($db->quoteName('e.manifest_cache'))
			->from($db->quoteName('#__updates', 'u'))
			->join('LEFT', $db->quoteName('#__extensions', 'e') . ' ON ' . $db->quoteName('e.extension_id') . ' = ' . $db->quoteName('u.extension_id'))
			->where($db->quoteName('u.extension_id') . ' != ' . $db->quote(0));

		// Process select filters.
		$clientId    = $this->getState('filter.client_id');
		$type        = $this->getState('filter.type');
		$folder      = $this->getState('filter.folder');
		$extensionId = $this->getState('filter.extension_id');

		if ($type)
		{
			$query->where($db->quoteName('u.type') . ' = ' . $db->quote($type));
		}

		if ($clientId != '')
		{
			$query->where($db->quoteName('u.client_id') . ' = ' . (int) $clientId);
		}

		if ($folder != '' && in_array($type, array('plugin', 'library', '')))
		{
			$query->where($db->quoteName('u.folder') . ' = ' . $db->quote($folder == '*' ? '' : $folder));
		}

		if ($extensionId)
		{
			$query->where($db->quoteName('u.extension_id') . ' = ' . $db->quote((int) $extensionId));
		}
		else
		{
			$query->where($db->quoteName('u.extension_id') . ' != ' . $db->quote(0))
				->where($db->quoteName('u.extension_id') . ' != ' . $db->quote(700));
		}

		// Process search filter.
		$search = $this->getState('filter.search');

		if (!empty($search))
		{
			if (stripos($search, 'eid:') !== false)
			{
				$query->where($db->quoteName('u.extension_id') . ' = ' . (int) substr($search, 4));
			}
			else
			{
				if (stripos($search, 'uid:') !== false)
				{
					$query->where($db->quoteName('u.update_site_id') . ' = ' . (int) substr($search, 4));
				}
				elseif (stripos($search, 'id:') !== false)
				{
					$query->where($db->quoteName('u.update_id') . ' = ' . (int) substr($search, 3));
				}
				else
				{
					$query->where($db->quoteName('u.name') . ' LIKE ' . $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true)) . '%'));
				}
			}
		}

		return $query;
	}

	/**
	 * Translate a list of objects
	 *
	 * @param   array  $items  The array of objects
	 *
	 * @return  array The array of translated objects
	 *
	 * @since   3.5
	 */
	protected function translate(&$items)
	{
		foreach ($items as &$item)
		{
			$item->client_translated  = $item->client_id ? JText::_('JADMINISTRATOR') : JText::_('JSITE');
			$manifest                 = json_decode($item->manifest_cache);
			$item->current_version    = isset($manifest->version) ? $manifest->version : JText::_('JLIB_UNKNOWN');
			$item->type_translated    = JText::_('COM_INSTALLER_TYPE_' . strtoupper($item->type));
			$item->folder_translated  = $item->folder ?: JText::_('COM_INSTALLER_TYPE_NONAPPLICABLE');
			$item->install_type       = $item->extension_id ? JText::_('COM_INSTALLER_MSG_UPDATE_UPDATE') : JText::_('COM_INSTALLER_NEW_INSTALL');
		}

		return $items;
	}

	/**
	 * Returns an object list
	 *
	 * @param   string  $query       The query
	 * @param   int     $limitstart  Offset
	 * @param   int     $limit       The number of records
	 *
	 * @return  array
	 *
	 * @since   3.5
	 */
	protected function _getList($query, $limitstart = 0, $limit = 0)
	{
		$db = $this->getDbo();
		$listOrder = $this->getState('list.ordering', 'u.name');
		$listDirn  = $this->getState('list.direction', 'asc');

		// Process ordering.
		if (in_array($listOrder, array('client_translated', 'folder_translated', 'type_translated')))
		{
			$db->setQuery($query);
			$result = $db->loadObjectList();
			$this->translate($result);
			$result = ArrayHelper::sortObjects($result, $listOrder, strtolower($listDirn) === 'desc' ? -1 : 1, true, true);
			$total = count($result);

			if ($total < $limitstart)
			{
				$limitstart = 0;
				$this->setState('list.start', 0);
			}

			return array_slice($result, $limitstart, $limit ?: null);
		}
		else
		{
			$query->order($db->quoteName($listOrder) . ' ' . $db->escape($listDirn));

			$result = parent::_getList($query, $limitstart, $limit);
			$this->translate($result);

			return $result;
		}
	}

	/**
	 * Get the count of disabled update sites
	 *
	 * @return  integer
	 *
	 * @since   3.4
	 */
	public function getDisabledUpdateSites()
	{
		$db = $this->getDbo();

		$query = $db->getQuery(true)
			->select('COUNT(*)')
			->from($db->quoteName('#__update_sites'))
			->where($db->quoteName('enabled') . ' = 0');

		$db->setQuery($query);

		return $db->loadResult();
	}

	/**
	 * Finds updates for an extension.
	 *
	 * @param   int  $eid               Extension identifier to look for
	 * @param   int  $cacheTimeout      Cache timeout
	 * @param   int  $minimumStability  Minimum stability for updates {@see JUpdater} (0=dev, 1=alpha, 2=beta, 3=rc, 4=stable)
	 *
	 * @return  boolean Result
	 *
	 * @since   1.6
	 */
	public function findUpdates($eid = 0, $cacheTimeout = 0, $minimumStability = JUpdater::STABILITY_STABLE)
	{
		JUpdater::getInstance()->findUpdates($eid, $cacheTimeout, $minimumStability);

		return true;
	}

	/**
	 * Removes all of the updates from the table.
	 *
	 * @return  boolean result of operation
	 *
	 * @since   1.6
	 */
	public function purge()
	{
		$db = $this->getDbo();

		// Note: TRUNCATE is a DDL operation
		// This may or may not mean depending on your database
		$db->setQuery('TRUNCATE TABLE #__updates');

		try
		{
			$db->execute();
		}
		catch (JDatabaseExceptionExecuting $e)
		{
			$this->_message = JText::_('JLIB_INSTALLER_FAILED_TO_PURGE_UPDATES');

			return false;
		}

		// Reset the last update check timestamp
		$query = $db->getQuery(true)
			->update($db->quoteName('#__update_sites'))
			->set($db->quoteName('last_check_timestamp') . ' = ' . $db->quote(0));
		$db->setQuery($query);
		$db->execute();

		// Clear the administrator cache
		$this->cleanCache('_system', 1);

		$this->_message = JText::_('JLIB_INSTALLER_PURGED_UPDATES');

		return true;
	}

	/**
	 * Enables any disabled rows in #__update_sites table
	 *
	 * @return  boolean result of operation
	 *
	 * @since   1.6
	 */
	public function enableSites()
	{
		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->update($db->quoteName('#__update_sites'))
			->set($db->quoteName('enabled') . ' = 1')
			->where($db->quoteName('enabled') . ' = 0');
		$db->setQuery($query);

		try
		{
			$db->execute();
		}
		catch (JDatabaseExceptionExecuting $e)
		{
			$this->_message .= JText::_('COM_INSTALLER_FAILED_TO_ENABLE_UPDATES');

			return false;
		}

		if ($rows = $db->getAffectedRows())
		{
			$this->_message .= JText::plural('COM_INSTALLER_ENABLED_UPDATES', $rows);
		}

		return true;
	}

	/**
	 * Update function.
	 *
	 * Sets the "result" state with the result of the operation.
	 *
	 * @param   array  $uids              Array[int] List of updates to apply
	 * @param   int    $minimumStability  The minimum allowed stability for installed updates {@see JUpdater}
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function update($uids, $minimumStability = JUpdater::STABILITY_STABLE)
	{
		$result = true;

		foreach ($uids as $uid)
		{
			$update = new JUpdate;
			$instance = JTable::getInstance('update');
			$instance->load($uid);
			$update->loadFromXml($instance->detailsurl, $minimumStability);
			
			// Find and use extra_query from update_site if available
			$updateSiteInstance = JTable::getInstance('Updatesite');
			$updateSiteInstance->load($instance->update_site_id);

			if ($updateSiteInstance->extra_query)
			{
				$update->set('extra_query', $updateSiteInstance->extra_query);
			}

			$this->preparePreUpdate($update, $instance);

			// Install sets state and enqueues messages
			$res = $this->install($update);

			if ($res)
			{
				$instance->delete($uid);
			}

			$result = $res & $result;
		}

		// Clear the cached extension data and menu cache
		$this->cleanCache('_system', 0);
		$this->cleanCache('_system', 1);
		$this->cleanCache('com_modules', 0);
		$this->cleanCache('com_modules', 1);
		$this->cleanCache('com_plugins', 0);
		$this->cleanCache('com_plugins', 1);
		$this->cleanCache('mod_menu', 0);
		$this->cleanCache('mod_menu', 1);

		// Set the final state
		$this->setState('result', $result);
	}

	/**
	 * Handles the actual update installation.
	 *
	 * @param   JUpdate  $update  An update definition
	 *
	 * @return  boolean   Result of install
	 *
	 * @since   1.6
	 */
	private function install($update)
	{
		$app = JFactory::getApplication();

		if (!isset($update->get('downloadurl')->_data))
		{
			JError::raiseWarning('', JText::_('COM_INSTALLER_INVALID_EXTENSION_UPDATE'));

			return false;
		}

		$url     = trim($update->downloadurl->_data);
		$sources = $update->get('downloadSources', array());

		if ($extra_query = $update->get('extra_query'))
		{
			$url .= (strpos($url, '?') === false) ? '?' : '&amp;';
			$url .= $extra_query;
		}

		$mirror = 0;

		while (!($p_file = InstallerHelper::downloadPackage($url)) && isset($sources[$mirror]))
		{
			$name = $sources[$mirror];
			$url  = trim($name->url);

			if ($extra_query)
			{
				$url .= (strpos($url, '?') === false) ? '?' : '&amp;';
				$url .= $extra_query;
			}

			$mirror++;
		}

		// Was the package downloaded?
		if (!$p_file)
		{
			JError::raiseWarning('', JText::sprintf('COM_INSTALLER_PACKAGE_DOWNLOAD_FAILED', $url));

			return false;
		}

		$config   = JFactory::getConfig();
		$tmp_dest = $config->get('tmp_path');

		// Unpack the downloaded package file
		$package = InstallerHelper::unpack($tmp_dest . '/' . $p_file);

		if (empty($package))
		{
			$app->enqueueMessage(JText::sprintf('COM_INSTALLER_UNPACK_ERROR', $p_file), 'error');

			return false;
		}

		// Get an installer instance
		$installer = JInstaller::getInstance();
		$update->set('type', $package['type']);

		// Check the package
		$check = InstallerHelper::isChecksumValid($package['packagefile'], $update);

		// The validation was not successful. Just a warning for now.
		// TODO: In Joomla 4 this will abort the installation
		if ($check === InstallerHelper::HASH_NOT_VALIDATED)
		{
			$app->enqueueMessage(JText::_('COM_INSTALLER_INSTALL_CHECKSUM_WRONG'), 'error');
		}

		// Install the package
		if (!$installer->update($package['dir']))
		{
			// There was an error updating the package
			$app->enqueueMessage(
				JText::sprintf('COM_INSTALLER_MSG_UPDATE_ERROR',
					JText::_('COM_INSTALLER_TYPE_TYPE_' . strtoupper($package['type']))
				), 'error'
			);
			$result = false;
		}
		else
		{
			// Package updated successfully
			$app->enqueueMessage(
				JText::sprintf('COM_INSTALLER_MSG_UPDATE_SUCCESS',
					JText::_('COM_INSTALLER_TYPE_TYPE_' . strtoupper($package['type']))
				)
			);
			$result = true;
		}

		// Quick change
		$this->type = $package['type'];

		// TODO: Reconfigure this code when you have more battery life left
		$this->setState('name', $installer->get('name'));
		$this->setState('result', $result);
		$app->setUserState('com_installer.message', $installer->message);
		$app->setUserState('com_installer.extension_message', $installer->get('extension_message'));

		// Cleanup the install files
		if (!is_file($package['packagefile']))
		{
			$config = JFactory::getConfig();
			$package['packagefile'] = $config->get('tmp_path') . '/' . $package['packagefile'];
		}

		InstallerHelper::cleanupInstall($package['packagefile'], $package['extractdir']);

		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  mixed  A JForm object on success, false on failure
	 *
	 * @since	2.5.2
	 */
	public function getForm($data = array(), $loadData = true)
	{
		// Get the form.
		JForm::addFormPath(JPATH_COMPONENT . '/models/forms');
		JForm::addFieldPath(JPATH_COMPONENT . '/models/fields');
		$form = JForm::getInstance('com_installer.update', 'update', array('load_data' => $loadData));

		// Check for an error.
		if ($form == false)
		{
			$this->setError($form->getMessage());

			return false;
		}

		// Check the session for previously entered form data.
		$data = $this->loadFormData();

		// Bind the form data if present.
		if (!empty($data))
		{
			$form->bind($data);
		}

		return $form;
	}

	/**
	 * Method to get the data that should be injected in the form.
	 *
	 * @return  mixed  The data for the form.
	 *
	 * @since	2.5.2
	 */
	protected function loadFormData()
	{
		// Check the session for previously entered form data.
		$data = JFactory::getApplication()->getUserState($this->context, array());

		return $data;
	}

	/**
	 * Method to add parameters to the update
	 *
	 * @param   JUpdate       $update  An update definition
	 * @param   JTableUpdate  $table   The update instance from the database
	 *
	 * @return  void
	 *
	 * @since   3.7.0
	 */
	protected function preparePreUpdate($update, $table)
	{
		jimport('joomla.filesystem.file');

		switch ($table->type)
		{
			// Components could have a helper which adds additional data
			case 'component':
				$ename = str_replace('com_', '', $table->element);
				$fname = $ename . '.php';
				$cname = ucfirst($ename) . 'Helper';

				$path = JPATH_ADMINISTRATOR . '/components/' . $table->element . '/helpers/' . $fname;

				if (JFile::exists($path))
				{
					require_once $path;

					if (class_exists($cname) && is_callable(array($cname, 'prepareUpdate')))
					{
						call_user_func_array(array($cname, 'prepareUpdate'), array(&$update, &$table));
					}
				}

				break;

			// Modules could have a helper which adds additional data
			case 'module':
				$cname = str_replace('_', '', $table->element) . 'Helper';
				$path = ($table->client_id ? JPATH_ADMINISTRATOR : JPATH_SITE) . '/modules/' . $table->element . '/helper.php';

				if (JFile::exists($path))
				{
					require_once $path;

					if (class_exists($cname) && is_callable(array($cname, 'prepareUpdate')))
					{
						call_user_func_array(array($cname, 'prepareUpdate'), array(&$update, &$table));
					}
				}

				break;

			// If we have a plugin, we can use the plugin trigger "onInstallerBeforePackageDownload"
			// But we should make sure, that our plugin is loaded, so we don't need a second "installer" plugin
			case 'plugin':
				$cname = str_replace('plg_', '', $table->element);
				JPluginHelper::importPlugin($table->folder, $cname);
				break;
		}
	}
}
components/com_installer/models/languages.php000060400000013625152453623450015542 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

jimport('joomla.updater.update');
use Joomla\String\StringHelper;

/**
 * Languages Installer Model
 *
 * @since  2.5.7
 */
class InstallerModelLanguages extends JModelList
{
	/**
	 * Language count
	 *
	 * @var     integer
	 * @since   3.7.0
	 */
	private $languageCount;

	/**
	 * Constructor override, defines a whitelist of column filters.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @since   2.5.7
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'name',
				'element',
			);
		}

		parent::__construct($config);
	}

	/**
	 * Get the Update Site
	 *
	 * @since   3.7.0
	 *
	 * @return  string  The URL of the Accredited Languagepack Updatesite XML
	 */
	private function getUpdateSite()
	{
		$db    = $this->getDbo();
		$query = $db->getQuery(true)
			->select($db->qn('us.location'))
			->from($db->qn('#__extensions', 'e'))
			->where($db->qn('e.type') . ' = ' . $db->q('package'))
			->where($db->qn('e.element') . ' = ' . $db->q('pkg_en-GB'))
			->where($db->qn('e.client_id') . ' = 0')
			->join('LEFT', $db->qn('#__update_sites_extensions', 'use') . ' ON ' . $db->qn('use.extension_id') . ' = ' . $db->qn('e.extension_id'))
			->join('LEFT', $db->qn('#__update_sites', 'us') . ' ON ' . $db->qn('us.update_site_id') . ' = ' . $db->qn('use.update_site_id'));

		return $db->setQuery($query)->loadResult();
	}

	/**
	 * Method to get an array of data items.
	 *
	 * @return  mixed  An array of data items on success, false on failure.
	 *
	 * @since   3.7.0
	 */
	public function getItems()
	{
		// Get a storage key.
		$store = $this->getStoreId();

		// Try to load the data from internal storage.
		if (isset($this->cache[$store]))
		{
			return $this->cache[$store];
		}

		try
		{
			// Load the list items and add the items to the internal cache.
			$this->cache[$store] = $this->getLanguages();
		}
		catch (RuntimeException $e)
		{
			$this->setError($e->getMessage());

			return false;
		}

		return $this->cache[$store];
	}

	/**
	 * Gets an array of objects from the updatesite.
	 *
	 * @return  object[]  An array of results.
	 *
	 * @since   3.0
	 * @throws  RuntimeException
	 */
	protected function getLanguages()
	{
		$updateSite = $this->getUpdateSite();

		// Check whether the updateserver is found
		if (empty($updateSite))
		{
			JFactory::getApplication()->enqueueMessage(JText::_('COM_INSTALLER_MSG_WARNING_NO_LANGUAGES_UPDATESERVER'), 'warning');

			return;
		}

		$http = new JHttp;

		try
		{
			$response = $http->get($updateSite);
		}
		catch (RuntimeException $e)
		{
			$response = null;
		}

		if ($response === null || $response->code !== 200)
		{
			JFactory::getApplication()->enqueueMessage(JText::sprintf('COM_INSTALLER_MSG_ERROR_CANT_CONNECT_TO_UPDATESERVER', $updateSite), 'error');

			return;
		}

		$updateSiteXML = simplexml_load_string($response->body);
		$languages     = array();
		$search        = strtolower($this->getState('filter.search'));

		foreach ($updateSiteXML->extension as $extension)
		{
			$language = new stdClass;

			foreach ($extension->attributes() as $key => $value)
			{
				$language->$key = (string) $value;
			}

			if ($search)
			{
				if (strpos(strtolower($language->name), $search) === false
					&& strpos(strtolower($language->element), $search) === false)
				{
					continue;
				}
			}

			$languages[$language->name] = $language;
		}

		// Workaround for php 5.3
		$that = $this;

		// Sort the array by value of subarray
		usort(
			$languages,
			function($a, $b) use ($that)
			{
				$ordering = $that->getState('list.ordering');

				if (strtolower($that->getState('list.direction')) === 'asc')
				{
					return StringHelper::strcmp($a->$ordering, $b->$ordering);
				}
				else
				{
					return StringHelper::strcmp($b->$ordering, $a->$ordering);
				}
			}
		);

		// Count the non-paginated list
		$this->languageCount = count($languages);
		$limit               = ($this->getState('list.limit') > 0) ? $this->getState('list.limit') : $this->languageCount;

		return array_slice($languages, $this->getStart(), $limit);
	}

	/**
	 * Returns a record count for the updatesite.
	 *
	 * @param   JDatabaseQuery|string  $query  The query.
	 *
	 * @return  integer  Number of rows for query.
	 *
	 * @since   3.7.0
	 */
	protected function _getListCount($query)
	{
		return $this->languageCount;
	}

	/**
	 * Method to get a store id based on model configuration state.
	 *
	 * @param   string  $id  A prefix for the store id.
	 *
	 * @return  string  A store id.
	 *
	 * @since   2.5.7
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.search');

		return parent::getStoreId($id);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @param   string  $ordering   list order
	 * @param   string  $direction  direction in the list
	 *
	 * @return  void
	 *
	 * @since   2.5.7
	 */
	protected function populateState($ordering = 'name', $direction = 'asc')
	{
		$this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string'));

		$this->setState('extension_message', JFactory::getApplication()->getUserState('com_installer.extension_message'));

		parent::populateState($ordering, $direction);
	}

	/**
	 * Method to compare two languages in order to sort them.
	 *
	 * @param   object  $lang1  The first language.
	 * @param   object  $lang2  The second language.
	 *
	 * @return  integer
	 *
	 * @since   3.7.0
	 */
	protected function compareLanguages($lang1, $lang2)
	{
		return strcmp($lang1->name, $lang2->name);
	}
}
components/com_installer/config.xml000060400000003115152453623450013560 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset
		name="preferences"
		label="COM_INSTALLER_PREFERENCES_LABEL"
		description="COM_INSTALLER_PREFERENCES_DESCRIPTION"
		>

		<field
			name="show_jed_info"
			type="radio"
			label="COM_INSTALLER_SHOW_JED_INFORMATION_LABEL"
			description="COM_INSTALLER_SHOW_JED_INFORMATION_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">COM_INSTALLER_SHOW_JED_INFORMATION_SHOW_MESSAGE</option>
			<option value="0">COM_INSTALLER_SHOW_JED_INFORMATION_HIDE_MESSAGE</option>
		</field>

		<field
			name="cachetimeout"
			type="integer"
			label="COM_INSTALLER_CACHETIMEOUT_LABEL"
			description="COM_INSTALLER_CACHETIMEOUT_DESC"
			first="0"
			last="24"
			step="1"
			default="6"
		/>

		<field
			name="minimum_stability"
			type="list"
			label="COM_INSTALLER_MINIMUM_STABILITY_LABEL"
			description="COM_INSTALLER_MINIMUM_STABILITY_DESC"
			default="4"
			>
			<option value="0">COM_INSTALLER_MINIMUM_STABILITY_DEV</option>
			<option value="1">COM_INSTALLER_MINIMUM_STABILITY_ALPHA</option>
			<option value="2">COM_INSTALLER_MINIMUM_STABILITY_BETA</option>
			<option value="3">COM_INSTALLER_MINIMUM_STABILITY_RC</option>
			<option value="4">COM_INSTALLER_MINIMUM_STABILITY_STABLE</option>
		</field>

	</fieldset>

	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
		>

		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			filter="rules"
			validate="rules"
			component="com_installer"
			section="component"
		/>

	</fieldset>
</config>
components/com_installer/access.xml000060400000001166152453623450013560 0ustar00<?xml version="1.0" encoding="utf-8" ?>
<access component="com_installer">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.options" title="JACTION_OPTIONS" description="JACTION_OPTIONS_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
	</section>
</access>
components/com_installer/helpers/installer.php000060400000010740152453623450015743 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Installer helper.
 *
 * @since  1.6
 */
class InstallerHelper
{
	/**
	 * Configure the Linkbar.
	 *
	 * @param   string  $vName  The name of the active view.
	 *
	 * @return  void
	 */
	public static function addSubmenu($vName = 'install')
	{
		if (JFactory::getUser()->authorise('core.admin'))
		{
			JHtmlSidebar::addEntry(
				JText::_('COM_INSTALLER_SUBMENU_INSTALL'),
				'index.php?option=com_installer&view=install',
				$vName == 'install'
			);
		}
		JHtmlSidebar::addEntry(
			JText::_('COM_INSTALLER_SUBMENU_UPDATE'),
			'index.php?option=com_installer&view=update',
			$vName == 'update'
		);
		JHtmlSidebar::addEntry(
			JText::_('COM_INSTALLER_SUBMENU_MANAGE'),
			'index.php?option=com_installer&view=manage',
			$vName == 'manage'
		);
		JHtmlSidebar::addEntry(
			JText::_('COM_INSTALLER_SUBMENU_DISCOVER'),
			'index.php?option=com_installer&view=discover',
			$vName == 'discover'
		);
		JHtmlSidebar::addEntry(
			JText::_('COM_INSTALLER_SUBMENU_DATABASE'),
			'index.php?option=com_installer&view=database',
			$vName == 'database'
		);
		JHtmlSidebar::addEntry(
			JText::_('COM_INSTALLER_SUBMENU_WARNINGS'),
			'index.php?option=com_installer&view=warnings',
			$vName == 'warnings'
		);

		if (JFactory::getUser()->authorise('core.admin'))
		{
			JHtmlSidebar::addEntry(
				JText::_('COM_INSTALLER_SUBMENU_LANGUAGES'),
				'index.php?option=com_installer&view=languages',
				$vName == 'languages'
			);
		}

		JHtmlSidebar::addEntry(
			JText::_('COM_INSTALLER_SUBMENU_UPDATESITES'),
			'index.php?option=com_installer&view=updatesites',
			$vName == 'updatesites'
		);
	}

	/**
	 * Get a list of filter options for the extension types.
	 *
	 * @return  array  An array of stdClass objects.
	 *
	 * @since   3.0
	 */
	public static function getExtensionTypes()
	{
		$db    = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('DISTINCT type')
			->from('#__extensions');
		$db->setQuery($query);
		$types = $db->loadColumn();

		$options = array();

		foreach ($types as $type)
		{
			$options[] = JHtml::_('select.option', $type, JText::_('COM_INSTALLER_TYPE_' . strtoupper($type)));
		}

		return $options;
	}

	/**
	 * Get a list of filter options for the extension types.
	 *
	 * @return  array  An array of stdClass objects.
	 *
	 * @since   3.0
	 */
	public static function getExtensionGroupes()
	{
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('DISTINCT folder')
			->from('#__extensions')
			->where('folder != ' . $db->quote(''))
			->order('folder');
		$db->setQuery($query);
		$folders = $db->loadColumn();

		$options = array();

		foreach ($folders as $folder)
		{
			$options[] = JHtml::_('select.option', $folder, $folder);
		}

		return $options;
	}

	/**
	 * Gets a list of the actions that can be performed.
	 *
	 * @return  JObject
	 *
	 * @since   1.6
	 * @deprecated  3.2  Use JHelperContent::getActions() instead
	 */
	public static function getActions()
	{
		// 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('com_installer');
	}

	/**
	 * Get a list of filter options for the application clients.
	 *
	 * @return  array  An array of JHtmlOption elements.
	 *
	 * @since   3.5
	 */
	public static function getClientOptions()
	{
		// Build the filter options.
		$options   = array();
		$options[] = JHtml::_('select.option', '0', JText::_('JSITE'));
		$options[] = JHtml::_('select.option', '1', JText::_('JADMINISTRATOR'));

		return $options;
	}

	/**
	 * Get a list of filter options for the application statuses.
	 *
	 * @return  array  An array of JHtmlOption elements.
	 *
	 * @since   3.5
	 */
	public static function getStateOptions()
	{
		// Build the filter options.
		$options   = array();
		$options[] = JHtml::_('select.option', '0', JText::_('JDISABLED'));
		$options[] = JHtml::_('select.option', '1', JText::_('JENABLED'));
		$options[] = JHtml::_('select.option', '2', JText::_('JPROTECTED'));
		$options[] = JHtml::_('select.option', '3', JText::_('JUNPROTECTED'));

		return $options;
	}
}
components/com_installer/helpers/html/manage.php000060400000002757152453623450016153 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Installer HTML class.
 *
 * @since  2.5
 */
abstract class InstallerHtmlManage
{
	/**
	 * Returns a published 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
	 */
	public static function state($value, $i, $enabled = true, $checkbox = 'cb')
	{
		$states = array(
			2 => array(
				'',
				'COM_INSTALLER_EXTENSION_PROTECTED',
				'',
				'COM_INSTALLER_EXTENSION_PROTECTED',
				true,
				'protected',
				'protected',
			),
			1 => array(
				'unpublish',
				'COM_INSTALLER_EXTENSION_ENABLED',
				'COM_INSTALLER_EXTENSION_DISABLE',
				'COM_INSTALLER_EXTENSION_ENABLED',
				true,
				'publish',
				'publish',
			),
			0 => array(
				'publish',
				'COM_INSTALLER_EXTENSION_DISABLED',
				'COM_INSTALLER_EXTENSION_ENABLE',
				'COM_INSTALLER_EXTENSION_DISABLED',
				true,
				'unpublish',
				'unpublish',
			),
		);

		return JHtml::_('jgrid.state', $states, $value, $i, 'manage.', $enabled, true, $checkbox);
	}
}
components/com_installer/helpers/html/updatesites.php000060400000002531152453623450017243 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Installer HTML class.
 *
 * @since  3.5
 */
abstract class InstallerHtmlUpdatesites
{
	/**
	 * Returns a published 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   3.5
	 */
	public static function state($value, $i, $enabled = true, $checkbox = 'cb')
	{
		$states	= array(
			1 => array(
				'unpublish',
				'COM_INSTALLER_UPDATESITE_ENABLED',
				'COM_INSTALLER_UPDATESITE_DISABLE',
				'COM_INSTALLER_UPDATESITE_ENABLED',
				true,
				'publish',
				'publish',
			),
			0 => array(
				'publish',
				'COM_INSTALLER_UPDATESITE_DISABLED',
				'COM_INSTALLER_UPDATESITE_ENABLE',
				'COM_INSTALLER_UPDATESITE_DISABLED',
				true,
				'unpublish',
				'unpublish',
			),
		);

		return JHtml::_('jgrid.state', $states, $value, $i, 'updatesites.', $enabled, true, $checkbox);
	}
}
components/com_installer/views/manage/view.html.php000060400000004160152453623450016605 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('InstallerViewDefault', dirname(__DIR__) . '/default/view.php');

/**
 * Extension Manager Manage View
 *
 * @since  1.6
 */
class InstallerViewManage extends InstallerViewDefault
{
	protected $items;

	protected $pagination;

	protected $form;

	protected $state;

	/**
	 * Display the view.
	 *
	 * @param   string  $tpl  Template
	 *
	 * @return  mixed|void
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		// Get data from the model.
		$this->state         = $this->get('State');
		$this->items         = $this->get('Items');
		$this->pagination    = $this->get('Pagination');
		$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);
		}

		// Include the component HTML helpers.
		JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

		// Display the view.
		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		$canDo = JHelperContent::getActions('com_installer');

		if ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::publish('manage.publish', 'JTOOLBAR_ENABLE', true);
			JToolbarHelper::unpublish('manage.unpublish', 'JTOOLBAR_DISABLE', true);
			JToolbarHelper::divider();
		}

		JToolbarHelper::custom('manage.refresh', 'refresh', 'refresh', 'JTOOLBAR_REFRESH_CACHE', true);
		JToolbarHelper::divider();

		if ($canDo->get('core.delete'))
		{
			JToolbarHelper::deleteList('COM_INSTALLER_CONFIRM_UNINSTALL', 'manage.remove', 'JTOOLBAR_UNINSTALL');
			JToolbarHelper::divider();
		}

		JHtmlSidebar::setAction('index.php?option=com_installer&view=manage');

		parent::addToolbar();
		JToolbarHelper::help('JHELP_EXTENSIONS_EXTENSION_MANAGER_MANAGE');
	}
}
components/com_installer/views/manage/tmpl/default.xml000060400000000322152453623450017275 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_INSTALLER_MANAGE_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_INSTALLER_MANAGE_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_installer/views/manage/tmpl/default.php000060400000012121152453623450017264 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('bootstrap.tooltip');

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>
<div id="installer-manage" class="clearfix">
	<form action="<?php echo JRoute::_('index.php?option=com_installer&view=manage'); ?>" method="post" name="adminForm" id="adminForm">
		<?php if (!empty( $this->sidebar)) : ?>
		<div id="j-sidebar-container" class="span2">
			<?php echo $this->sidebar; ?>
		</div>
		<div id="j-main-container" class="span10">
		<?php else : ?>
		<div id="j-main-container">
		<?php endif; ?>
			<?php if ($this->showMessage) : ?>
				<?php echo $this->loadTemplate('message'); ?>
			<?php endif; ?>
			<?php if ($this->ftp) : ?>
				<?php echo $this->loadTemplate('ftp'); ?>
			<?php endif; ?>
			<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
			<div class="clearfix"></div>
			<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('COM_INSTALLER_MSG_MANAGE_NOEXTENSION'); ?>
			</div>
			<?php else : ?>
			<table class="table table-striped" id="manageList">
				<thead>
					<tr>
						<th width="1%" class="nowrap">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'status', $listDirn, $listOrder); ?>
						</th>
						<th class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_INSTALLER_HEADING_NAME', 'name', $listDirn, $listOrder); ?>
						</th>
						<th>
							<?php echo JHtml::_('searchtools.sort', 'COM_INSTALLER_HEADING_LOCATION', 'client_translated', $listDirn, $listOrder); ?>
						</th>
						<th>
							<?php echo JHtml::_('searchtools.sort', 'COM_INSTALLER_HEADING_TYPE', 'type_translated', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="hidden-phone">
							<?php echo JText::_('JVERSION'); ?>
						</th>
						<th width="10%" class="hidden-phone hidden-tablet">
							<?php echo JText::_('JDATE'); ?>
						</th>
						<th width="15%" class="hidden-phone hidden-tablet">
							<?php echo JText::_('JAUTHOR'); ?>
						</th>
						<th class="hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_INSTALLER_HEADING_FOLDER', 'folder_translated', $listDirn, $listOrder); ?>
						</th>
						<th class="hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_INSTALLER_HEADING_PACKAGE_ID', 'package_id', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_INSTALLER_HEADING_ID', 'extension_id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="11">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
				<?php foreach ($this->items as $i => $item) : ?>
					<tr class="row<?php echo $i % 2; if ($item->status == 2) echo ' protected'; ?>">
						<td>
							<?php echo JHtml::_('grid.id', $i, $item->extension_id); ?>
						</td>
						<td class="center">
							<?php if (!$item->element) : ?>
							<strong>X</strong>
							<?php else : ?>
								<?php echo JHtml::_('InstallerHtml.Manage.state', $item->status, $i, $item->status < 2, 'cb'); ?>
							<?php endif; ?>
						</td>
						<td>
							<label for="cb<?php echo $i; ?>">
								<span class="bold hasTooltip" title="<?php echo JHtml::_('tooltipText', $item->name, $item->description, 0); ?>">
									<?php echo $item->name; ?>
								</span>
							</label>
						</td>
						<td>
							<?php echo $item->client_translated; ?>
						</td>
						<td>
							<?php echo $item->type_translated; ?>
						</td>
						<td class="hidden-phone">
							<?php echo @$item->version != '' ? $item->version : '&#160;'; ?>
						</td>
						<td class="hidden-phone hidden-tablet">
							<?php echo @$item->creationDate != '' ? $item->creationDate : '&#160;'; ?>
						</td>
						<td class="hidden-phone hidden-tablet">
							<span class="editlinktip hasTooltip" title="<?php echo JHtml::_('tooltipText', JText::_('COM_INSTALLER_AUTHOR_INFORMATION'), $item->author_info, 0); ?>">
								<?php echo @$item->author != '' ? $item->author : '&#160;'; ?>
							</span>
						</td>
						<td class="hidden-phone">
							<?php echo $item->folder_translated; ?>
						</td>
						<td class="hidden-phone">
							<?php echo $item->package_id ?: '&#160;'; ?>
						</td>
						<td class="hidden-phone">
							<?php echo $item->extension_id; ?>
						</td>
					</tr>
				<?php endforeach; ?>
				</tbody>
			</table>
			<?php endif; ?>
			<input type="hidden" name="task" value="" />
			<input type="hidden" name="boxchecked" value="0" />
			<?php echo JHtml::_('form.token'); ?>
		<!-- End Content -->
		</div>
	</form>
</div>
components/com_installer/views/warnings/tmpl/default.php000060400000003073152453623450017672 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div id="installer-warnings" class="clearfix">
	<form action="<?php echo JRoute::_('index.php?option=com_installer&view=warnings'); ?>" method="post" name="adminForm" id="adminForm">
	<?php if (!empty( $this->sidebar)) : ?>
		<div id="j-sidebar-container" class="span2">
			<?php echo $this->sidebar; ?>
		</div>
		<div id="j-main-container" class="span10">
	<?php else : ?>
		<div id="j-main-container">
	<?php endif; ?>
		<?php if (count($this->messages)) : ?>
			<?php echo JHtml::_('bootstrap.startAccordion', 'warnings', array('active' => 'warning0')); ?>
				<?php $i = 0; ?>
				<?php foreach ($this->messages as $message) : ?>
					<?php echo JHtml::_('bootstrap.addSlide', 'warnings', $message['message'], 'warning' . ($i++)); ?>
						<?php echo $message['description']; ?>
					<?php echo JHtml::_('bootstrap.endSlide'); ?>
				<?php endforeach; ?>
					<?php echo JHtml::_('bootstrap.addSlide', 'warnings', JText::_('COM_INSTALLER_MSG_WARNINGFURTHERINFO'), 'furtherinfo'); ?>
						<?php echo JText::_('COM_INSTALLER_MSG_WARNINGFURTHERINFODESC'); ?>
					<?php echo JHtml::_('bootstrap.endSlide'); ?>
			<?php echo JHtml::_('bootstrap.endAccordion'); ?>
		<?php endif; ?>
			<div>
				<input type="hidden" name="boxchecked" value="0" />
				<?php echo JHtml::_('form.token'); ?>
			</div>
		</div>
	</form>
</div>
components/com_installer/views/warnings/tmpl/default.xml000060400000000326152453623450017701 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_INSTALLER_WARNINGS_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_INSTALLER_WARNINGS_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_installer/views/warnings/view.html.php000060400000002254152453623450017207 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('InstallerViewDefault', dirname(__DIR__) . '/default/view.php');

/**
 * Extension Manager Warning View
 *
 * @since  1.6
 */
class InstallerViewWarnings extends InstallerViewDefault
{
	/**
	 * Display the view
	 *
	 * @param   string  $tpl  Template
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		$items = $this->get('Items');
		$this->messages = &$items;
		parent::display($tpl);

		if (count($items) > 0)
		{
			JFactory::getApplication()->enqueueMessage(JText::_('COM_INSTALLER_MSG_WARNINGS_NOTICE'), 'warning');
		}
		else
		{
			JFactory::getApplication()->enqueueMessage(JText::_('COM_INSTALLER_MSG_WARNINGS_NONE'), 'notice');
		}
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		parent::addToolbar();
		JToolbarHelper::help('JHELP_EXTENSIONS_EXTENSION_MANAGER_WARNINGS');
	}
}
components/com_installer/views/install/tmpl/default.php000060400000013376152453623450017517 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// MooTools is loaded for B/C for extensions generating JavaScript in their install scripts, this call will be removed at 4.0
JHtml::_('behavior.framework', true);
JHtml::_('bootstrap.tooltip');

JFactory::getDocument()->addScriptDeclaration(
	'
	Joomla.submitbutton4 = function() {
		var form = document.getElementById("adminForm");

		// do field validation
		if (form.install_url.value == "" || form.install_url.value == "http://" || form.install_url.value == "https://") {
			alert("' . JText::_('COM_INSTALLER_MSG_INSTALL_ENTER_A_URL', true) . '");
		}
		else
		{
			JoomlaInstaller.showLoading();
			
			form.installtype.value = "url";
			form.submit();
		}
	};

	Joomla.submitbuttonInstallWebInstaller = function() {
		var form = document.getElementById("adminForm");
		
		form.install_url.value = "https://appscdn.joomla.org/webapps/jedapps/webinstaller.xml";
		
		Joomla.submitbutton4();
	};

	// Add spindle-wheel for installations:
	jQuery(document).ready(function($) {
		var outerDiv = $("#installer-install");
		
		JoomlaInstaller.getLoadingOverlay()
			.css("top", outerDiv.position().top - $(window).scrollTop())
			.css("left", "0")
			.css("width", "100%")
			.css("height", "100%")
			.css("display", "none")
			.css("margin-top", "-10px");
	});
	
	var JoomlaInstaller = {
		getLoadingOverlay: function () {
			return jQuery("#loading");
		},
		showLoading: function () {
			this.getLoadingOverlay().css("display", "block");
		},
		hideLoading: function () {
			this.getLoadingOverlay().css("display", "none");
		}
	};
	'
);

JFactory::getDocument()->addStyleDeclaration(
	'
	#loading {
		background: rgba(255, 255, 255, .8) url(\'' . JHtml::_('image', 'jui/ajax-loader.gif', '', null, true, true) . '\') 50% 15% no-repeat;
		position: fixed;
		opacity: 0.8;
		-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity = 80);
		filter: alpha(opacity = 80);
		overflow: hidden;
	}
	'
);

?>

<script type="text/javascript">
	// Set the first tab to active if there is no other active tab
	jQuery(document).ready(function($) {
		var hasTab = function(href){
			return $('a[data-toggle="tab"]a[href*="' + href + '"]').length;
		};
		if (!hasTab(localStorage.getItem('tab-href')))
		{
			var tabAnchor = $("#myTabTabs li:first a");
			window.localStorage.setItem('tab-href', tabAnchor.attr('href'));
			tabAnchor.click();
		}
	});
</script>

<div id="installer-install" class="clearfix">
	<form enctype="multipart/form-data" action="<?php echo JRoute::_('index.php?option=com_installer&view=install'); ?>"
		method="post" name="adminForm" id="adminForm" class="form-horizontal">
		<?php if (!empty($this->sidebar)) : ?>
		<div id="j-sidebar-container" class="span2">
			<?php echo $this->sidebar; ?>
		</div>
		<div id="j-main-container" class="span10">
			<?php else : ?>
			<div id="j-main-container">
				<?php endif; ?>
				<!-- Render messages set by extension install scripts here -->
				<?php if ($this->showMessage) : ?>
					<?php echo $this->loadTemplate('message'); ?>
				<?php elseif ($this->showJedAndWebInstaller) : ?>
					<div class="alert alert-info j-jed-message"
						style="margin-bottom: 40px; line-height: 2em; color:#333333;">
						<?php echo JHtml::_(
							'link',
							JRoute::_('index.php?option=com_config&view=component&component=com_installer&path=&return=' . urlencode(base64_encode(JUri::getInstance()))),
							'<span class="element-invisible">' . str_replace('"', '&quot;', JText::_('COM_INSTALLER_SHOW_JED_INFORMATION_TOOLTIP')) . '</span>',
							'class="alert-options hasTooltip icon-options" data-dismiss="alert" title="' . str_replace('"', '&quot;', JText::_('COM_INSTALLER_SHOW_JED_INFORMATION_TOOLTIP')) . '"'
						);
						?>
						<p><?php echo JText::_('COM_INSTALLER_INSTALL_FROM_WEB_INFO'); ?>
							<?php echo JText::_('COM_INSTALLER_INSTALL_FROM_WEB_TOS'); ?></p>
						<input class="btn" type="button"
							value="<?php echo JText::_('COM_INSTALLER_INSTALL_FROM_WEB_ADD_TAB'); ?>"
							onclick="Joomla.submitbuttonInstallWebInstaller()"/>
					</div>
				<?php endif; ?>
				<?php echo JHtml::_('bootstrap.startTabSet', 'myTab'); ?>
				<?php // Show installation tabs at the start ?>
				<?php $firstTab = JEventDispatcher::getInstance()->trigger('onInstallerViewBeforeFirstTab', array()); ?>
				<?php // Show installation tabs ?>
				<?php $tabs = JEventDispatcher::getInstance()->trigger('onInstallerAddInstallationTab', array()); ?>
				<?php foreach ($tabs as $tab) : ?>
					<?php echo JHtml::_('bootstrap.addTab', 'myTab', $tab['name'], $tab['label']); ?>
					<fieldset class="uploadform">
						<?php echo $tab['content']; ?>
					</fieldset>
					<?php echo JHtml::_('bootstrap.endTab'); ?>
				<?php endforeach; ?>
				<?php // Show installation tabs at the end ?>
				<?php $lastTab = JEventDispatcher::getInstance()->trigger('onInstallerViewAfterLastTab', array()); ?>
				<?php $tabs = array_merge($firstTab, $tabs, $lastTab); ?>
				<?php if (!$tabs) : ?>
					<?php JFactory::getApplication()->enqueueMessage(JText::_('COM_INSTALLER_NO_INSTALLATION_PLUGINS_FOUND'), 'warning'); ?>
				<?php endif; ?>

				<?php if ($this->ftp) : ?>
					<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'ftp', JText::_('COM_INSTALLER_MSG_DESCFTPTITLE')); ?>
					<?php echo $this->loadTemplate('ftp'); ?>
					<?php echo JHtml::_('bootstrap.endTab'); ?>
				<?php endif; ?>

				<input type="hidden" name="installtype" value=""/>
				<input type="hidden" name="task" value="install.install"/>
				<?php echo JHtml::_('form.token'); ?>

				<?php echo JHtml::_('bootstrap.endTabSet'); ?>
			</div>
	</form>
</div>
<div id="loading"></div>
components/com_installer/views/install/tmpl/default.xml000060400000000324152453623450017515 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_INSTALLER_INSTALL_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_INSTALLER_INSTALL_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_installer/views/install/view.html.php000060400000002653152453623450017030 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('InstallerViewDefault', dirname(__DIR__) . '/default/view.php');

/**
 * Extension Manager Install View
 *
 * @since  1.5
 */
class InstallerViewInstall extends InstallerViewDefault
{
	/**
	 * Display the view
	 *
	 * @param   string  $tpl  Template
	 *
	 * @return  void
	 *
	 * @since   1.5
	 */
	public function display($tpl = null)
	{
		if (!JFactory::getUser()->authorise('core.admin'))
		{
			throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
		}

		$paths = new stdClass;
		$paths->first = '';
		$state = $this->get('state');

		$this->paths = &$paths;
		$this->state = &$state;

		$this->showJedAndWebInstaller = JComponentHelper::getParams('com_installer')->get('show_jed_info', 1);

		JPluginHelper::importPlugin('installer');

		$dispatcher = JEventDispatcher::getInstance();
		$dispatcher->trigger('onInstallerBeforeDisplay', array(&$this->showJedAndWebInstaller, $this));

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		parent::addToolbar();
		JToolbarHelper::help('JHELP_EXTENSIONS_EXTENSION_MANAGER_INSTALL');
	}
}
components/com_installer/views/languages/view.html.php000060400000003602152453623450017323 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('InstallerViewDefault', dirname(__DIR__) . '/default/view.php');

/**
 * Extension Manager Language Install View
 *
 * @since  2.5.7
 */
class InstallerViewLanguages extends InstallerViewDefault
{
	/**
	 * @var object item list
	 */
	protected $items;

	/**
	 * @var object pagination information
	 */
	protected $pagination;

	/**
	 * @var object model state
	 */
	protected $state;

	/**
	 * Display the view.
	 *
	 * @param   null  $tpl  template to display
	 *
	 * @return mixed|void
	 */
	public function display($tpl = null)
	{
		if (!JFactory::getUser()->authorise('core.admin'))
		{
			throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
		}

		// Get data from the model.
		$this->state         = $this->get('State');
		$this->items         = $this->get('Items');
		$this->pagination    = $this->get('Pagination');
		$this->filterForm    = $this->get('FilterForm');
		$this->activeFilters = $this->get('ActiveFilters');
		$this->installedLang = JLanguageHelper::getInstalledLanguages();

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return void
	 */
	protected function addToolbar()
	{
		$canDo = JHelperContent::getActions('com_installer');
		JToolBarHelper::title(JText::_('COM_INSTALLER_HEADER_' . $this->getName()), 'puzzle install');

		if ($canDo->get('core.admin'))
		{
			parent::addToolbar();

			// TODO: this help screen will need to be created.
			JToolBarHelper::help('JHELP_EXTENSIONS_EXTENSION_MANAGER_LANGUAGES');
		}
	}
}
components/com_installer/views/languages/tmpl/default.xml000060400000000330152453623450020012 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_INSTALLER_LANGUAGES_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_INSTALLER_LANGUAGES_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_installer/views/languages/tmpl/default.php000060400000010433152453623450020006 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('bootstrap.tooltip');

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>
<div id="installer-languages" class="clearfix">
	<form action="<?php echo JRoute::_('index.php?option=com_installer&view=languages'); ?>" method="post" name="adminForm" id="adminForm">
	<?php if (!empty( $this->sidebar)) : ?>
		<div id="j-sidebar-container" class="span2">
			<?php echo $this->sidebar; ?>
		</div>
		<div id="j-main-container" class="span10">
	<?php else : ?>
		<div id="j-main-container">
	<?php endif; ?>
			<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this, 'options' => array('filterButton' => false))); ?>
			<div class="clearfix"></div>
			<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
			<?php else : ?>
			<table class="table table-striped">
				<thead>
					<tr>
						<th width="5%"></th>
						<th class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'name', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_INSTALLER_HEADING_LANGUAGE_TAG', 'element', $listDirn, $listOrder); ?>
						</th>
						<th width="5%" class="center">
							<?php echo JText::_('JVERSION'); ?>
						</th>
						<th width="40%" class="nowrap hidden-phone">
							<?php echo JText::_('COM_INSTALLER_HEADING_DETAILS_URL'); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="6">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
				<?php
				$version = new JVersion;
				$currentShortVersion = preg_replace('#^([0-9\.]+)(|.*)$#', '$1', $version->getShortVersion());
				$i = 0;
				foreach ($this->items as $language) :
					preg_match('#^pkg_([a-z]{2,3}-[A-Z]{2})$#', $language->element, $element);
					$language->code  = $element[1];
					?>
					<tr class="row<?php echo $i % 2; ?>">
						<td>
							<?php $buttonText = (isset($this->installedLang[0][$language->code]) || isset($this->installedLang[1][$language->code])) ? 'REINSTALL' : 'INSTALL'; ?>
							<?php $onclick = 'document.getElementById(\'install_url\').value = \'' . $language->detailsurl . '\'; Joomla.submitbutton(\'install.install\');'; ?>
							<input type="button" class="btn btn-small" value="<?php echo JText::_('COM_INSTALLER_' . $buttonText . '_BUTTON'); ?>" onclick="<?php echo $onclick; ?>" />
						</td>
						<td>
							<?php echo $language->name; ?>
						</td>
						<td>
							<?php echo $language->code; ?>
						</td>
						<td class="center">
								<?php $minorVersion = $version::MAJOR_VERSION . '.' . $version::MINOR_VERSION; ?>
								<?php // Display a Note if language pack version is not equal to Joomla version ?>
								<?php if (strpos($language->version, $minorVersion) !== 0 || strpos($language->version, $currentShortVersion) !== 0) : ?>
									<span class="label label-warning hasTooltip" title="<?php echo JText::_('JGLOBAL_LANGUAGE_VERSION_NOT_PLATFORM'); ?>"><?php echo $language->version; ?></span>
								<?php else : ?>
									<span class="label label-success"><?php echo $language->version; ?></span>
								<?php endif; ?>
						</td>
						<td class="small hidden-phone">
							<a href="<?php echo $language->detailsurl; ?>" target="_blank"><?php echo $language->detailsurl; ?></a>
						</td>
					</tr>
					<?php $i++; ?>
				<?php endforeach; ?>
				</tbody>
			</table>
			<?php endif; ?>
			<input type="hidden" name="task" value="" />
			<input type="hidden" name="return" value="<?php echo base64_encode('index.php?option=com_installer&view=languages') ?>" />
			<input type="hidden" id="install_url" name="install_url" />
			<input type="hidden" name="installtype" value="url" />
			<input type="hidden" name="boxchecked" value="0" />
			<?php echo JHtml::_('form.token'); ?>
		</div>
	</form>
</div>
components/com_installer/views/database/tmpl/default.php000060400000006473152453623450017615 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

?>
<div id="installer-database" class="clearfix">
	<form action="<?php echo JRoute::_('index.php?option=com_installer&view=database'); ?>" method="post" name="adminForm" id="adminForm">

	<?php if (!empty( $this->sidebar)) : ?>
		<div id="j-sidebar-container" class="span2">
			<?php echo $this->sidebar; ?>
		</div>
		<div id="j-main-container" class="span10">
	<?php else : ?>
		<div id="j-main-container">
	<?php endif; ?>
		<?php if ($this->errorCount === 0) : ?>
			<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'other')); ?>
		<?php else : ?>
			<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'problems')); ?>
			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'problems', JText::plural('COM_INSTALLER_MSG_N_DATABASE_ERROR_PANEL', $this->errorCount)); ?>
				<fieldset class="panelform">
					<ul>
						<?php if (!$this->filterParams) : ?>
							<li><?php echo JText::_('COM_INSTALLER_MSG_DATABASE_FILTER_ERROR'); ?></li>
						<?php endif; ?>

						<?php if ($this->schemaVersion != $this->changeSet->getSchema()) : ?>
							<li><?php echo JText::sprintf('COM_INSTALLER_MSG_DATABASE_SCHEMA_ERROR', $this->schemaVersion, $this->changeSet->getSchema()); ?></li>
						<?php endif; ?>

						<?php if (version_compare($this->updateVersion, JVERSION) != 0) : ?>
							<li><?php echo JText::sprintf('COM_INSTALLER_MSG_DATABASE_UPDATEVERSION_ERROR', $this->updateVersion, JVERSION); ?></li>
						<?php endif; ?>

						<?php foreach ($this->errors as $line => $error) : ?>
							<?php $key = 'COM_INSTALLER_MSG_DATABASE_' . $error->queryType;
							$msgs = $error->msgElements;
							$file = basename($error->file);
							$msg0 = isset($msgs[0]) ? $msgs[0] : ' ';
							$msg1 = isset($msgs[1]) ? $msgs[1] : ' ';
							$msg2 = isset($msgs[2]) ? $msgs[2] : ' ';
							$message = JText::sprintf($key, $file, $msg0, $msg1, $msg2); ?>
							<li><?php echo $message; ?></li>
						<?php endforeach; ?>
					</ul>
				</fieldset>
			<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php endif; ?>
			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'other', JText::_('COM_INSTALLER_MSG_DATABASE_INFO')); ?>
				<div class="control-group" >
					<fieldset class="panelform">
						<ul>
							<li><?php echo JText::sprintf('COM_INSTALLER_MSG_DATABASE_SCHEMA_VERSION', $this->schemaVersion); ?></li>
							<li><?php echo JText::sprintf('COM_INSTALLER_MSG_DATABASE_UPDATE_VERSION', $this->updateVersion); ?></li>
							<li><?php echo JText::sprintf('COM_INSTALLER_MSG_DATABASE_DRIVER', JFactory::getDbo()->name); ?></li>
							<li><?php echo JText::sprintf('COM_INSTALLER_MSG_DATABASE_CHECKED_OK', count($this->results['ok'])); ?></li>
							<li><?php echo JText::sprintf('COM_INSTALLER_MSG_DATABASE_SKIPPED', count($this->results['skipped'])); ?></li>
						</ul>
					</fieldset>
				</div>
				<?php echo JHtml::_('bootstrap.endTab'); ?>
			<?php echo JHtml::_('bootstrap.endTabSet'); ?>

			<input type="hidden" name="task" value="" />
			<input type="hidden" name="boxchecked" value="0" />
			<?php echo JHtml::_('form.token'); ?>
		</div>
	</form>
</div>
components/com_installer/views/database/tmpl/default.xml000060400000000326152453623450017615 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_INSTALLER_DATABASE_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_INSTALLER_DATABASE_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_installer/views/database/view.html.php000060400000004215152453623450017122 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('InstallerViewDefault', dirname(__DIR__) . '/default/view.php');

/**
 * Extension Manager Database View
 *
 * @since  1.6
 */
class InstallerViewDatabase extends InstallerViewDefault
{
	/**
	 * Display the view.
	 *
	 * @param   string  $tpl  Template
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		// Set variables
		$app = JFactory::getApplication();

		// Get data from the model.
		$this->state = $this->get('State');
		$this->changeSet = $this->get('Items');
		$this->errors = $this->changeSet->check();
		$this->results = $this->changeSet->getStatus();
		$this->schemaVersion = $this->get('SchemaVersion');
		$this->updateVersion = $this->get('UpdateVersion');
		$this->filterParams  = $this->get('DefaultTextFilters');
		$this->schemaVersion = $this->schemaVersion ?: JText::_('JNONE');
		$this->updateVersion = $this->updateVersion ?: JText::_('JNONE');
		$this->pagination = $this->get('Pagination');
		$this->errorCount = count($this->errors);

		if ($this->schemaVersion != $this->changeSet->getSchema())
		{
			$this->errorCount++;
		}

		if (!$this->filterParams)
		{
			$this->errorCount++;
		}

		if (version_compare($this->updateVersion, JVERSION) != 0)
		{
			$this->errorCount++;
		}

		if ($this->errorCount === 0)
		{
			$app->enqueueMessage(JText::_('COM_INSTALLER_MSG_DATABASE_OK'), 'notice');
		}
		else
		{
			$app->enqueueMessage(JText::_('COM_INSTALLER_MSG_DATABASE_ERRORS'), 'warning');
		}

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		/*
		 * Set toolbar items for the page.
		 */
		JToolbarHelper::custom('database.fix', 'refresh', 'refresh', 'COM_INSTALLER_TOOLBAR_DATABASE_FIX', false);
		JToolbarHelper::divider();
		parent::addToolbar();
		JToolbarHelper::help('JHELP_EXTENSIONS_EXTENSION_MANAGER_DATABASE');
	}
}
components/com_installer/views/default/tmpl/default_ftp.php000060400000002207152453623450020335 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<fieldset title="<?php echo JText::_('COM_INSTALLER_MSG_DESCFTPTITLE'); ?>">
	<legend><?php echo JText::_('COM_INSTALLER_MSG_DESCFTPTITLE'); ?></legend>

	<?php echo JText::_('COM_INSTALLER_MSG_DESCFTP'); ?>

	<?php if ($this->ftp instanceof Exception) : ?>
		<p><?php echo JText::_($this->ftp->getMessage()); ?></p>
	<?php endif; ?>

	<table class="adminform">
		<tbody>
			<tr>
				<td width="120">
					<label for="username"><?php echo JText::_('JGLOBAL_USERNAME'); ?></label>
				</td>
				<td>
					<input type="text" id="username" name="username" class="input_box" size="70" value="" />
				</td>
			</tr>
			<tr>
				<td width="120">
					<label for="password"><?php echo JText::_('JGLOBAL_PASSWORD'); ?></label>
				</td>
				<td>
					<input type="password" id="password" name="password" class="input_box" size="70" value="" />
				</td>
			</tr>
		</tbody>
	</table>

</fieldset>
components/com_installer/views/default/tmpl/default_message.php000060400000001250152453623450021165 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$state    = $this->get('State');
$message1 = $state->get('message');
$message2 = $state->get('extension_message');
?>

<?php if ($message1) : ?>
	<div class="row-fluid"> 
		<div class="span12"> 
			<strong><?php echo $message1; ?></strong>
		</div>
	</div> 
<?php endif; ?> 
<?php if ($message2) : ?> 
	<div class="row-fluid">
		<div class="span12"> 
			<?php echo $message2; ?>
		</div> 
	</div>
<?php endif; ?>
components/com_installer/views/default/view.php000060400000003473152453623450016044 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Extension Manager Default View
 *
 * @since  1.5
 */
class InstallerViewDefault extends JViewLegacy
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  Configuration array
	 *
	 * @since   1.5
	 */
	public function __construct($config = null)
	{
		$app = JFactory::getApplication();
		parent::__construct($config);
		$this->_addPath('template', $this->_basePath . '/views/default/tmpl');
		$this->_addPath('template', JPATH_THEMES . '/' . $app->getTemplate() . '/html/com_installer/default');
	}

	/**
	 * Display the view.
	 *
	 * @param   string  $tpl  Template
	 *
	 * @return  void
	 *
	 * @since   1.5
	 */
	public function display($tpl = null)
	{
		// Get data from the model.
		$state = $this->get('State');

		// Are there messages to display?
		$showMessage = false;

		if (is_object($state))
		{
			$message1    = $state->get('message');
			$message2    = $state->get('extension_message');
			$showMessage = ($message1 || $message2);
		}

		$this->showMessage = $showMessage;
		$this->state       = &$state;

		$this->addToolbar();
		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		$canDo = JHelperContent::getActions('com_installer');
		JToolbarHelper::title(JText::_('COM_INSTALLER_HEADER_' . $this->getName()), 'puzzle install');

		if ($canDo->get('core.admin') || $canDo->get('core.options'))
		{
			JToolbarHelper::preferences('com_installer');
			JToolbarHelper::divider();
		}

		// Render side bar.
		$this->sidebar = JHtmlSidebar::render();
	}
}
components/com_installer/views/update/tmpl/default.xml000060400000000322152453623450017327 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_INSTALLER_UPDATE_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_INSTALLER_UPDATE_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_installer/views/update/tmpl/default.php000060400000012004152453623450017316 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('bootstrap.tooltip');

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>
<div id="installer-update" class="clearfix">
	<form action="<?php echo JRoute::_('index.php?option=com_installer&view=update'); ?>" method="post" name="adminForm" id="adminForm">
		<?php if (!empty( $this->sidebar)) : ?>
		<div id="j-sidebar-container" class="span2">
			<?php echo $this->sidebar; ?>
		</div>
		<div id="j-main-container" class="span10">
			<?php else : ?>
			<div id="j-main-container">
				<?php endif; ?>
				<?php if ($this->showMessage) : ?>
					<?php echo $this->loadTemplate('message'); ?>
				<?php endif; ?>

				<?php if ($this->ftp) : ?>
					<?php echo $this->loadTemplate('ftp'); ?>
				<?php endif; ?>

				<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
				<div class="clearfix"></div>
				<?php if (empty($this->items)) : ?>
					<div class="alert alert-no-items alert-info">
						<?php echo JText::_('COM_INSTALLER_MSG_UPDATE_NOUPDATES'); ?>
					</div>
				<?php else : ?>
					<table class="table table-striped">
						<thead>
						<tr>
							<th width="1%" class="nowrap">
								<?php echo JHtml::_('grid.checkall'); ?>
							</th>
							<th class="nowrap">
								<?php echo JHtml::_('searchtools.sort', 'COM_INSTALLER_HEADING_NAME', 'u.name', $listDirn, $listOrder); ?>
							</th>
							<th class="nowrap center">
								<?php echo JHtml::_('searchtools.sort', 'COM_INSTALLER_HEADING_LOCATION', 'client_translated', $listDirn, $listOrder); ?>
							</th>
							<th class="nowrap center">
								<?php echo JHtml::_('searchtools.sort', 'COM_INSTALLER_HEADING_TYPE', 'type_translated', $listDirn, $listOrder); ?>
							</th>
							<th class="nowrap hidden-phone center">
								<?php echo JText::_('COM_INSTALLER_CURRENT_VERSION'); ?>
							</th>
							<th class="nowrap center">
								<?php echo JText::_('COM_INSTALLER_NEW_VERSION'); ?>
							</th>
							<th class="nowrap hidden-phone center">
								<?php echo JHtml::_('searchtools.sort', 'COM_INSTALLER_HEADING_FOLDER', 'folder_translated', $listDirn, $listOrder); ?>
							</th>
							<th class="nowrap hidden-phone center">
								<?php echo JText::_('COM_INSTALLER_HEADING_INSTALLTYPE'); ?>
							</th>
							<th width="40%" class="nowrap hidden-phone hidden-tablet">
								<?php echo JText::_('COM_INSTALLER_HEADING_DETAILSURL'); ?>
							</th>
						</tr>
						</thead>
						<tfoot>
						<tr>
							<td colspan="9">
								<?php echo $this->pagination->getListFooter(); ?>
							</td>
						</tr>
						</tfoot>
						<tbody>
						<?php foreach ($this->items as $i => $item) : ?>
							<?php
							$client          = $item->client_id ? JText::_('JADMINISTRATOR') : JText::_('JSITE');
							$manifest        = json_decode($item->manifest_cache);
							$current_version = isset($manifest->version) ? $manifest->version : JText::_('JLIB_UNKNOWN');
							?>
							<tr class="row<?php echo $i % 2; ?>">
								<td>
									<?php echo JHtml::_('grid.id', $i, $item->update_id); ?>
								</td>
								<td>
									<label for="cb<?php echo $i; ?>">
								<span class="editlinktip hasTooltip" title="<?php echo JHtml::_('tooltipText', JText::_('JGLOBAL_DESCRIPTION'), $item->description ?: JText::_('COM_INSTALLER_MSG_UPDATE_NODESC'), 0); ?>">
								<?php echo $this->escape($item->name); ?>
								</span>
									</label>
								</td>
								<td class="center">
									<?php echo $item->client_translated; ?>
								</td>
								<td class="center">
									<?php echo $item->type_translated; ?>
								</td>
								<td class="hidden-phone center">
									<span class="label label-warning"><?php echo $item->current_version; ?></span>
								</td>
								<td class="center">
									<span class="label label-success"><?php echo $item->version; ?></span>
								</td>
								<td class="hidden-phone center">
									<?php echo $item->folder_translated; ?>
								</td>
								<td class="hidden-phone center">
									<?php echo $item->install_type; ?>
								</td>
								<td class="hidden-phone hidden-tablet">
							<span class="break-word">
							<?php echo $item->detailsurl; ?>
								<?php if (isset($item->infourl)) : ?>
									<br />
									<a href="<?php echo $item->infourl; ?>" target="_blank" rel="noopener noreferrer"><?php echo $this->escape($item->infourl); ?></a>
								<?php endif; ?>
							</span>
								</td>
							</tr>
						<?php endforeach; ?>
						</tbody>
					</table>
				<?php endif; ?>
				<input type="hidden" name="task" value="" />
				<input type="hidden" name="boxchecked" value="0" />
				<?php echo JHtml::_('form.token'); ?>
			</div>
	</form>
</div>
components/com_installer/views/update/view.html.php000060400000003747152453623450016651 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('InstallerViewDefault', dirname(__DIR__) . '/default/view.php');

/**
 * Extension Manager Update View
 *
 * @since  1.6
 */
class InstallerViewUpdate extends InstallerViewDefault
{
	/**
	 * List of update items.
	 *
	 * @var array
	 */
	protected $items;

	/**
	 * Model state object.
	 *
	 * @var  object
	 */
	protected $state;

	/**
	 * List pagination.
	 *
	 * @var JPagination
	 */
	protected $pagination;

	/**
	 * Display the view.
	 *
	 * @param   string  $tpl  Template
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		// Get data from the model.
		$this->state         = $this->get('State');
		$this->items         = $this->get('Items');
		$this->pagination    = $this->get('Pagination');
		$this->filterForm    = $this->get('FilterForm');
		$this->activeFilters = $this->get('ActiveFilters');

		$paths = new stdClass;
		$paths->first = '';

		$this->paths = &$paths;

		if (count($this->items) > 0)
		{
			JFactory::getApplication()->enqueueMessage(JText::_('COM_INSTALLER_MSG_WARNINGS_UPDATE_NOTICE'), 'warning');
		}

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		JToolbarHelper::custom('update.update', 'upload', 'upload', 'COM_INSTALLER_TOOLBAR_UPDATE', true);
		JToolbarHelper::custom('update.find', 'refresh', 'refresh', 'COM_INSTALLER_TOOLBAR_FIND_UPDATES', false);
		JToolbarHelper::custom('update.purge', 'purge', 'purge', 'COM_INSTALLER_TOOLBAR_PURGE', false);
		JToolbarHelper::divider();

		JHtmlSidebar::setAction('index.php?option=com_installer&view=manage');

		parent::addToolbar();
		JToolbarHelper::help('JHELP_EXTENSIONS_EXTENSION_MANAGER_UPDATE');
	}
}
components/com_installer/views/discover/tmpl/default.php000060400000010755152453623450017665 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.multiselect');
JHtml::_('bootstrap.tooltip');
JHtml::_('formbehavior.chosen', 'select');

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>
<div id="installer-discover" class="clearfix">
	<form action="<?php echo JRoute::_('index.php?option=com_installer&view=discover'); ?>" method="post" name="adminForm" id="adminForm">
		<?php if (!empty( $this->sidebar)) : ?>
		<div id="j-sidebar-container" class="span2">
			<?php echo $this->sidebar; ?>
		</div>
		<div id="j-main-container" class="span10">
		<?php else : ?>
		<div id="j-main-container">
		<?php endif; ?>
			<?php if ($this->showMessage) : ?>
				<?php echo $this->loadTemplate('message'); ?>
			<?php endif; ?>
			<?php if ($this->ftp) : ?>
				<?php echo $this->loadTemplate('ftp'); ?>
			<?php endif; ?>
			<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
			<div class="clearfix"></div>
			<div class="alert alert-no-items alert-info">
				<?php echo JText::_('COM_INSTALLER_MSG_DISCOVER_DESCRIPTION'); ?>
			</div>
			<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
			<?php else : ?>

			<table class="table table-striped">
				<thead>
					<tr>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_INSTALLER_HEADING_NAME', 'name', $listDirn, $listOrder); ?>
						</th>
						<th class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_INSTALLER_HEADING_LOCATION', 'client_translated', $listDirn, $listOrder); ?>
						</th>
						<th class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_INSTALLER_HEADING_TYPE', 'type_translated', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="hidden-phone">
							<?php echo JText::_('JVERSION'); ?>
						</th>
						<th width="10%" class="hidden-phone hidden-tablet">
							<?php echo JText::_('JDATE'); ?>
						</th>
						<th width="15%" class="hidden-phone hidden-tablet">
							<?php echo JText::_('JAUTHOR'); ?>
						</th>
						<th class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_INSTALLER_HEADING_FOLDER', 'folder_translated', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'extension_id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="9"><?php echo $this->pagination->getListFooter(); ?></td>
					</tr>
				</tfoot>
				<tbody>
				<?php foreach ($this->items as $i => $item) : ?>
					<tr class="row<?php echo $i % 2; ?>">
						<td class="center">
							<?php echo JHtml::_('grid.id', $i, $item->extension_id); ?>
						</td>
						<td>
							<label for="cb<?php echo $i;?>">
								<span class="bold hasTooltip" title="<?php echo JHtml::_('tooltipText', $item->name, $item->description, 0); ?>"><?php echo $item->name; ?></span>
							</label>
						</td>
						<td>
							<?php echo $item->client_translated; ?>
						</td>
						<td>
							<?php echo $item->type_translated; ?>
						</td>
						<td class="hidden-phone">
							<?php echo @$item->version != '' ? $item->version : '&#160;'; ?>
						</td>
						<td class="hidden-phone hidden-tablet">
							<?php echo @$item->creationDate != '' ? $item->creationDate : '&#160;'; ?>
						</td>
						<td class="hidden-phone hidden-tablet">
							<span class="editlinktip hasTooltip" title="<?php echo JHtml::_('tooltipText', JText::_('COM_INSTALLER_AUTHOR_INFORMATION'), $item->author_info, 0); ?>">
								<?php echo @$item->author != '' ? $item->author : '&#160;'; ?>
							</span>
						</td>
						<td class="hidden-phone">
							<?php echo $item->folder_translated; ?>
						</td>
						<td class="hidden-phone">
							<?php echo $item->extension_id; ?>
						</td>
					</tr>
				<?php endforeach; ?>
				</tbody>
			</table>
			<?php endif; ?>
			<input type="hidden" name="task" value="" />
			<input type="hidden" name="boxchecked" value="0" />
			<?php echo JHtml::_('form.token'); ?>
		</div>
	</form>
</div>
components/com_installer/views/discover/tmpl/default_item.php000060400000003515152453623450020677 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<tr class="<?php echo 'row' . $this->item->index % 2; ?>" <?php echo $this->item->style; ?>>
	<td>
			<input type="checkbox" id="cb<?php echo $this->item->index; ?>" name="eid[]" value="<?php echo $this->item->extension_id; ?>" onclick="Joomla.isChecked(this.checked);" <?php echo $this->item->cbd; ?> />
<!--		<input type="checkbox" id="cb<?php echo $this->item->index; ?>" name="eid" value="<?php echo $this->item->extension_id; ?>" onclick="Joomla.isChecked(this.checked);" <?php echo $this->item->cbd; ?> />-->
		<span class="bold"><?php echo $this->item->name; ?></span>
	</td>
	<td>
		<?php echo $this->item->type ?>
	</td>
	<td class="center">
		<?php if (!$this->item->element) : ?>
		<strong>X</strong>
		<?php else : ?>
		<a href="index.php?option=com_installer&amp;type=manage&amp;task=<?php echo $this->item->task; ?>&amp;eid[]=<?php echo $this->item->extension_id; ?>&amp;limitstart=<?php echo $this->pagination->limitstart; ?>&amp;<?php echo JSession::getFormToken(); ?>=1"><?php echo JHtml::_('image', 'images/' . $this->item->img, $this->item->alt, array('title' => $this->item->action)); ?></a>
		<?php endif; ?>
	</td>
	<td class="center"><?php echo @$this->item->folder != '' ? $this->item->folder : 'N/A'; ?></td>
	<td class="center"><?php echo @$this->item->client != '' ? $this->item->client : 'N/A'; ?></td>
	<td>
		<span class="editlinktip hasTooltip" title="<?php echo JHtml::_('tooltipText', JText::_('COM_INSTALLER_AUTHOR_INFORMATION'), $this->item->author_info, 0); ?>">
			<?php echo @$this->item->author != '' ? $this->item->author : '&#160;'; ?>
		</span>
	</td>
</tr>
components/com_installer/views/discover/tmpl/default.xml000060400000000326152453623450017667 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_INSTALLER_DISCOVER_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_INSTALLER_DISCOVER_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_installer/views/discover/view.html.php000060400000004401152453623450017171 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('InstallerViewDefault', dirname(__DIR__) . '/default/view.php');

/**
 * Extension Manager Discover View
 *
 * @since  1.6
 */
class InstallerViewDiscover extends InstallerViewDefault
{
	/**
	 * Display the view.
	 *
	 * @param   string  $tpl  Template
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		// Run discover from the model.
		if (!$this->checkExtensions())
		{
			$this->getModel('discover')->discover();
		}

		// Get data from the model.
		$this->state         = $this->get('State');
		$this->items         = $this->get('Items');
		$this->pagination    = $this->get('Pagination');
		$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);
		}

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   3.1
	 */
	protected function addToolbar()
	{
		/*
		 * Set toolbar items for the page.
		 */
		JToolbarHelper::custom('discover.install', 'upload', 'upload', 'JTOOLBAR_INSTALL', true);
		JToolbarHelper::custom('discover.refresh', 'refresh', 'refresh', 'COM_INSTALLER_TOOLBAR_DISCOVER', false);
		JToolbarHelper::divider();

		JHtmlSidebar::setAction('index.php?option=com_installer&view=discover');

		parent::addToolbar();
		JToolbarHelper::help('JHELP_EXTENSIONS_EXTENSION_MANAGER_DISCOVER');
	}

	/**
	 * Check extensions.
	 *
	 * Checks uninstalled extensions in extensions table.
	 *
	 * @return  boolean  True if there are discovered extensions on the database.
	 *
	 * @since   3.5
	 */
	public function checkExtensions()
	{
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('*')
			->from($db->quoteName('#__extensions'))
			->where($db->quoteName('state') . ' = -1');
		$db->setQuery($query);
		$discoveredExtensions = $db->loadObjectList();

		return (count($discoveredExtensions) === 0) ? false : true;
	}
}
components/com_installer/views/updatesites/tmpl/default.xml000060400000000334152453623450020402 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_INSTALLER_UPDATESITES_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_INSTALLER_UPDATESITES_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_installer/views/updatesites/tmpl/default.php000060400000010765152453623450020402 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2014 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('bootstrap.tooltip');

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
?>
<div id="installer-manage" class="clearfix">
	<form action="<?php echo JRoute::_('index.php?option=com_installer&view=updatesites'); ?>" method="post" name="adminForm" id="adminForm">
		<?php if (!empty( $this->sidebar)) : ?>
		<div id="j-sidebar-container" class="span2">
			<?php echo $this->sidebar; ?>
		</div>
		<div id="j-main-container" class="span10">
		<?php else : ?>
		<div id="j-main-container">
		<?php endif; ?>
			<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
			<div class="clearfix"></div>
			<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
			<?php else : ?>
			<table class="table table-striped">
				<thead>
					<tr>
						<th width="1%" class="center">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'enabled', $listDirn, $listOrder); ?>
						</th>
						<th class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_INSTALLER_HEADING_UPDATESITE_NAME', 'update_site_name', $listDirn, $listOrder); ?>
						</th>
						<th class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_INSTALLER_HEADING_NAME', 'name', $listDirn, $listOrder); ?>
						</th>
						<th class="hidden-phone hidden-tablet">
							<?php echo JHtml::_('searchtools.sort', 'COM_INSTALLER_HEADING_LOCATION', 'client_translated', $listDirn, $listOrder); ?>
						</th>
						<th class="hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_INSTALLER_HEADING_TYPE', 'type_translated', $listDirn, $listOrder); ?>
						</th>
						<th class="hidden-phone hidden-tablet">
							<?php echo JHtml::_('searchtools.sort', 'COM_INSTALLER_HEADING_FOLDER', 'folder_translated', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'update_site_id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="8">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
				<?php foreach ($this->items as $i => $item) : ?>
					<tr class="row<?php echo $i % 2; if ($item->enabled == 2) echo ' protected'; ?>">
						<td class="center">
							<?php echo JHtml::_('grid.id', $i, $item->update_site_id); ?>
						</td>
						<td class="center">
							<?php if (!$item->element) : ?>
								<strong>X</strong>
							<?php else : ?>
								<?php echo JHtml::_('InstallerHtml.Updatesites.state', $item->enabled, $i, $item->enabled < 2, 'cb'); ?>
							<?php endif; ?>
						</td>
						<td>
							<label for="cb<?php echo $i; ?>">
								<?php echo JText::_($item->update_site_name); ?>
								<br />
								<span class="small break-word">
									<a href="<?php echo $item->location; ?>" target="_blank" rel="noopener noreferrer"><?php echo $this->escape($item->location); ?></a>
									<?php if ($item->extra_query): ?>
										<br/><pre><?php echo $item->extra_query; ?></pre>
									<?php endif; ?>
								</span>
							</label>
						</td>
						<td class="hidden-phone">
							<span class="bold hasTooltip" title="<?php echo JHtml::_('tooltipText', $item->name, $item->description, 0); ?>">
								<?php echo $item->name; ?>
							</span>
						</td>
						<td class="hidden-phone hidden-tablet">
							<?php echo $item->client_translated; ?>
						</td>
						<td class="hidden-phone">
							<?php echo $item->type_translated; ?>
						</td>
						<td class="hidden-phone hidden-tablet">
							<?php echo $item->folder_translated; ?>
						</td>
						<td class="hidden-phone">
							<?php echo $item->update_site_id; ?>
						</td>
					</tr>
				<?php endforeach; ?>
				</tbody>
			</table>
			<?php endif; ?>
			<input type="hidden" name="task" value="" />
			<input type="hidden" name="boxchecked" value="0" />
			<?php echo JHtml::_('form.token'); ?>
		</div>
	</form>
</div>
components/com_installer/views/updatesites/view.html.php000060400000004451152453623450017712 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2014 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('InstallerViewDefault', dirname(__DIR__) . '/default/view.php');

/**
 * Extension Manager Update Sites View
 *
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 * @since       3.4
 */
class InstallerViewUpdatesites extends InstallerViewDefault
{
	protected $items;

	protected $pagination;

	protected $form;

	protected $state;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  Template
	 *
	 * @return  mixed|void
	 *
	 * @since   3.4
	 *
	 * @throws  Exception on errors
	 */
	public function display($tpl = null)
	{
		// Get data from the model
		$this->state         = $this->get('State');
		$this->items         = $this->get('Items');
		$this->pagination    = $this->get('Pagination');
		$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);
		}

		// Include the component HTML helpers.
		JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

		// Display the view
		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   3.4
	 */
	protected function addToolbar()
	{
		$canDo = JHelperContent::getActions('com_installer');

		if ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::publish('updatesites.publish', 'JTOOLBAR_ENABLE', true);
			JToolbarHelper::unpublish('updatesites.unpublish', 'JTOOLBAR_DISABLE', true);
			JToolbarHelper::divider();
		}

		if ($canDo->get('core.delete'))
		{
			JToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'updatesites.delete', 'JTOOLBAR_DELETE');
			JToolbarHelper::divider();
		}

		if ($canDo->get('core.admin') || $canDo->get('core.options'))
		{
			JToolbarHelper::custom('updatesites.rebuild', 'refresh.png', 'refresh_f2.png', 'JTOOLBAR_REBUILD', false);
		}

		JHtmlSidebar::setAction('index.php?option=com_installer&view=updatesites');

		parent::addToolbar();
		JToolbarHelper::help('JHELP_EXTENSIONS_EXTENSION_MANAGER_UPDATESITES');
	}
}
components/com_installer/controller.php000060400000003262152453623450014470 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_installer
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Installer Controller
 *
 * @since  1.5
 */
class InstallerController extends JControllerLegacy
{
	/**
	 * 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  JController  This object to support chaining.
	 *
	 * @since   1.5
	 */
	public function display($cachable = false, $urlparams = false)
	{
		JLoader::register('InstallerHelper', JPATH_ADMINISTRATOR . '/components/com_installer/helpers/installer.php');

		// Get the document object.
		$document = JFactory::getDocument();

		// Set the default view name and format from the Request.
		$vName   = $this->input->get('view', 'install');
		$vFormat = $document->getType();
		$lName   = $this->input->get('layout', 'default', 'string');

		// Get and render the view.
		if ($view = $this->getView($vName, $vFormat))
		{
			$ftp = JClientHelper::setCredentialsFromRequest('ftp');
			$view->ftp = &$ftp;

			// Get the model for the view.
			$model = $this->getModel($vName);

			// 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.
			InstallerHelper::addSubmenu($vName);
			$view->display();
		}

		return $this;
	}
}
components/com_cpanel/controller.php000060400000000554152453623450013736 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_cpanel
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Cpanel Controller
 *
 * @since  1.5
 */
class CpanelController extends JControllerLegacy
{
}
components/com_cpanel/cpanel.xml000060400000001547152453623450013031 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_cpanel</name>
	<author>Joomla! Project</author>
	<creationDate>Jun 2007</creationDate>
	<copyright>(C) 2007 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_CPANEL_XML_DESCRIPTION</description>
	<administration>
		<files folder="admin">
			<filename>controller.php</filename>
			<filename>cpanel.php</filename>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_cpanel.ini</language>
			<language tag="en-GB">language/en-GB.com_cpanel.sys.ini</language>
		</languages>
	</administration>
</extension>

components/com_cpanel/views/cpanel/view.html.php000060400000003121152453623450016060 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_cpanel
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * HTML View class for the Cpanel component
 *
 * @since  1.0
 */
class CpanelViewCpanel extends JViewLegacy
{
	/**
	 * Array of cpanel modules
	 *
	 * @var  array
	 */
	protected $modules = null;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		// Set toolbar items for the page
		JToolbarHelper::title(JText::_('COM_CPANEL'), 'home-2 cpanel');
		JToolbarHelper::help('screen.cpanel');

		$input = JFactory::getApplication()->input;

		/*
		 * Set the template - this will display cpanel.php
		 * from the selected admin template.
		 */
		$input->set('tmpl', 'cpanel');

		// Display the cpanel modules
		$this->modules = JModuleHelper::getModules('cpanel');

		try
		{
			$messages_model = FOFModel::getTmpInstance('Messages', 'PostinstallModel')->eid(700);
			$messages       = $messages_model->getItemList();
		}
		catch (RuntimeException $e)
		{
			$messages = array();

			// Still render the error message from the Exception object
			JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
		}

		$this->postinstall_message_count = count($messages);

		parent::display($tpl);
	}
}
components/com_cpanel/views/cpanel/tmpl/default.php000060400000003565152453623450016557 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_cpanel
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

$user = JFactory::getUser();
?>
<div class="row-fluid">
	<?php $iconmodules = JModuleHelper::getModules('icon');
	if ($iconmodules) : ?>
		<div class="span3">
			<div class="cpanel-links">
				<?php
				// Display the submenu position modules
				foreach ($iconmodules as $iconmodule)
				{
					echo JModuleHelper::renderModule($iconmodule);
				}
				?>
			</div>
		</div>
	<?php endif; ?>
	<div class="span<?php echo $iconmodules ? 9 : 12; ?>">
		<?php if ($user->authorise('core.manage', 'com_postinstall') && $this->postinstall_message_count) : ?>
			<div class="row-fluid">
				<div class="alert alert-info">
					<h3>
						<?php echo JText::_('COM_CPANEL_MESSAGES_TITLE'); ?>
					</h3>
					<p>
						<?php echo JText::_('COM_CPANEL_MESSAGES_BODY_NOCLOSE'); ?>
					</p>
					<p>
						<?php echo JText::_('COM_CPANEL_MESSAGES_BODYMORE_NOCLOSE'); ?>
					</p>
					<p>
						<a href="index.php?option=com_postinstall&amp;eid=700" class="btn btn-primary">
							<?php echo JText::_('COM_CPANEL_MESSAGES_REVIEW'); ?>
						</a>
					</p>
				</div>
			</div>
		<?php endif; ?>
		<div class="row-fluid">
			<?php
			$spans = 0;

			foreach ($this->modules as $module)
			{
				// Get module parameters
				$params = new Registry($module->params);
				$bootstrapSize = $params->get('bootstrap_size');
				if (!$bootstrapSize)
				{
					$bootstrapSize = 12;
				}
				$spans += $bootstrapSize;
				if ($spans > 12)
				{
					echo '</div><div class="row-fluid">';
					$spans = $bootstrapSize;
				}
				echo JModuleHelper::renderModule($module, array('style' => 'well'));
			}
			?>
		</div>
	</div>
</div>
components/com_cpanel/views/cpanel/tmpl/default.xml000060400000000322152453623450016554 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_CPANEL_CPANEL_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_CPANEL_CPANEL_VIEW_DEFAULT_TITLE_DESC]]>
		</message>
	</layout>
</metadata>
components/com_cpanel/cpanel.php000060400000000664152453623450013017 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_cpanel
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// No access check.

$controller = JControllerLegacy::getInstance('Cpanel');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
components/com_tags/helpers/tags.php000060400000002566152453623450013654 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_tags
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Tags helper.
 *
 * @since       3.1
 * @deprecated  4.0
 */
class TagsHelper extends JHelperContent
{
	/**
	 * Configure the Submenu links.
	 *
	 * @param   string  $extension  The extension.
	 *
	 * @return  void
	 *
	 * @since       3.1
	 * @deprecated  4.0
	 */
	public static function addSubmenu($extension)
	{
		$parts     = explode('.', $extension);
		$component = $parts[0];

		// Avoid nonsense situation.
		if ($component == 'tags')
		{
			return;
		}

		// Try to find the component helper.
		$file = JPath::clean(JPATH_ADMINISTRATOR . '/components/com_tags/helpers/tags.php');

		if (file_exists($file))
		{
			$cName = 'TagsHelper';

			JLoader::register($cName, $file);

			if (class_exists($cName))
			{
				if (is_callable(array($cName, 'addSubmenu')))
				{
					$lang = JFactory::getLanguage();

					// Loading language file from administrator/language directory then administrator/components/<extension>/language
					$lang->load($component, JPATH_BASE, null, false, true)
					||	$lang->load($component, JPath::clean(JPATH_ADMINISTRATOR . '/components/' . $component), null, false, true);
				}
			}
		}
	}
}
components/com_tags/controllers/tags.php000060400000002555152453623450014556 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_tags
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * The Tags List Controller
 *
 * @since  3.1
 */
class TagsControllerTags extends JControllerAdmin
{
	/**
	 * Proxy for getModel
	 *
	 * @param   string  $name    The model name. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  An optional associative array of configuration settings.
	 *
	 * @return  JModelLegacy  The model.
	 *
	 * @since   3.1
	 */
	public function getModel($name = 'Tag', $prefix = 'TagsModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	/**
	 * Rebuild the nested set tree.
	 *
	 * @return  boolean  False on failure or error, true on success.
	 *
	 * @since   3.1
	 */
	public function rebuild()
	{
		$this->checkToken();

		$this->setRedirect(JRoute::_('index.php?option=com_tags&view=tags', false));

		$model = $this->getModel();

		if ($model->rebuild())
		{
			// Rebuild succeeded.
			$this->setMessage(JText::_('COM_TAGS_REBUILD_SUCCESS'));

			return true;
		}
		else
		{
			// Rebuild failed.
			$this->setMessage(JText::_('COM_TAGS_REBUILD_FAILURE'));

			return false;
		}
	}
}
components/com_tags/controllers/tag.php000060400000002774152453623450014376 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_tags
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * The Tag Controller
 *
 * @since  3.1
 */
class TagsControllerTag extends JControllerForm
{
	/**
	 * Method to check if you can add a new record.
	 *
	 * @param   array  $data  An array of input data.
	 *
	 * @return  boolean
	 *
	 * @since   3.1
	 */
	protected function allowAdd($data = array())
	{
		$user = JFactory::getUser();

		return $user->authorise('core.create', 'com_tags');
	}

	/**
	 * 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   3.1
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// Since there is no asset tracking and no categories, revert to the component permissions.
		return parent::allowEdit($data, $key);
	}

	/**
	 * Method to run batch operations.
	 *
	 * @param   object  $model  The model.
	 *
	 * @return  boolean	 True if successful, false otherwise and internal error is set.
	 *
	 * @since   3.1
	 */
	public function batch($model = null)
	{
		$this->checkToken();

		// Set the model
		$model = $this->getModel('Tag');

		// Preset the redirect
		$this->setRedirect('index.php?option=com_tags&view=tags');

		return parent::batch($model);
	}
}
components/com_tags/access.xml000060400000001461152453623450012517 0ustar00<?xml version="1.0" encoding="utf-8" ?>
<access component="com_tags">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.options" title="JACTION_OPTIONS" description="JACTION_OPTIONS_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
	</section>
</access>
components/com_tags/tags.xml000060400000002605152453623450012215 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_tags</name>
	<author>Joomla! Project</author>
	<creationDate>December 2013</creationDate>
	<copyright>(C) 2013 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.1.0</version>
	<description>COM_TAGS_XML_DESCRIPTION</description>

	<files folder="site">
		<filename>controller.php</filename>
		<filename>metadata.xml</filename>
		<filename>newsfeeds.php</filename>
		<filename>router.php</filename>
		<folder>helpers</folder>
		<folder>models</folder>
		<folder>views</folder>
	</files>
	<languages folder="site">
		<language tag="en-GB">language/en-GB.com_tags.ini</language>
	</languages>
	<administration>
		<files folder="admin">
			<filename>tags.php</filename>
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_tags.ini</language>
			<language tag="en-GB">language/en-GB.com_tags.sys.ini</language>
		</languages>
		<menu link="option=com_tags" img="class:tags">com_tags</menu>

	</administration>
</extension>
components/com_tags/config.xml000060400000024647152453623450012536 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset
		name="taglist"
		label="COM_TAGS_CONFIG_TAG_SETTINGS_LABEL"
		description="COM_TAGS_CONFIG_TAG_SETTINGS_DESC">

		<field
			name="tag_layout"
			type="componentlayout"
			label="COM_TAGS_CONFIG_TAGGED_ITEMS_FIELD_LAYOUT_LABEL"
			description="COM_TAGS_CONFIG_TAGGED_ITEMS_FIELD_LAYOUT_DESC"
			menuitems="true"
			extension="com_tags"
			view="tag"
		/>

		<field
			name="save_history"
			type="radio"
			label="JGLOBAL_SAVE_HISTORY_OPTIONS_LABEL"
			description="JGLOBAL_SAVE_HISTORY_OPTIONS_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="history_limit"
			type="number"
			label="JGLOBAL_HISTORY_LIMIT_OPTIONS_LABEL"
			description="JGLOBAL_HISTORY_LIMIT_OPTIONS_DESC"
			filter="integer"
			default="5"
			showon="save_history:1"
		/>

		<field
			name="show_tag_title"
			type="radio"
			label="COM_TAGS_SHOW_TAG_TITLE_LABEL"
			description="COM_TAGS_SHOW_TAG_TITLE_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="tag_list_show_tag_image"
			type="radio"
			label="COM_TAGS_SHOW_TAG_IMAGE_LABEL"
			description="COM_TAGS_SHOW_TAG_IMAGE_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="tag_list_show_tag_description"
			type="radio"
			label="COM_TAGS_SHOW_TAG_DESCRIPTION_LABEL"
			description="COM_TAGS_SHOW_TAG_DESCRIPTION_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="tag_list_image"
			type="media"
			label="COM_TAGS_TAG_LIST_MEDIA_LABEL"
			description="COM_TAGS_TAG_LIST_MEDIA_DESC"
		/>

		<field
			name="tag_list_orderby"
			type="list"
			label="JGLOBAL_FIELD_FIELD_ORDERING_LABEL"
			description="JGLOBAL_FIELD_FIELD_ORDERING_DESC"
			default="title"
			validate="options"
			>
			<option value="c.core_title">JGLOBAL_TITLE</option>
			<option value="match_count">COM_TAGS_MATCH_COUNT</option>
			<option value="c.core_created_time">JGLOBAL_CREATED_DATE</option>
			<option value="c.core_modified_time">JGLOBAL_MODIFIED_DATE</option>
			<option value="c.core_publish_up">JGLOBAL_PUBLISHED_DATE</option>
		</field>

		<field
			name="tag_list_orderby_direction"
			type="radio"
			label="JGLOBAL_ORDER_DIRECTION_LABEL"
			description="JGLOBAL_ORDER_DIRECTION_DESC"
			class="btn-group btn-group-yesno"
			default="ASC"
			>
			<option value="ASC">JGLOBAL_ORDER_ASCENDING</option>
			<option value="DESC">JGLOBAL_ORDER_DESCENDING</option>
		</field>

		<field
			name="show_headings"
			type="radio"
			label="COM_TAGS_TAG_LIST_SHOW_HEADINGS_LABEL"
			description="COM_TAGS_TAG_LIST_SHOW_HEADINGS_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="tag_list_show_date"
			type="list"
			label="COM_TAGS_TAG_LIST_SHOW_DATE_DESC"
			description="COM_TAGS_TAG_LIST_SHOW_DATE_LABEL"
			default="0"
			validate="options"
			>
			<option value="0">JHIDE</option>
			<option value="created">JGLOBAL_CREATED</option>
			<option value="modified">JGLOBAL_MODIFIED</option>
			<option value="published">JPUBLISHED</option>
		</field>

		<field
			name="tag_list_show_item_image"
			type="radio"
			label="COM_TAGS_SHOW_ITEM_IMAGE_LABEL"
			description="COM_TAGS_SHOW_ITEM_IMAGE_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="tag_list_show_item_description"
			type="radio"
			label="COM_TAGS_TAG_LIST_SHOW_ITEM_DESCRIPTION_LABEL"
			description="COM_TAGS_TAG_LIST_SHOW_ITEM_DESCRIPTION_DESC"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="tag_list_item_maximum_characters"
			type="number"
			label="COM_TAGS_LIST_MAX_CHARACTERS_LABEL"
			description="COM_TAGS_LIST_MAX_CHARACTERS_DESC"
			filter="integer"
			showon="tag_list_show_item_description:1"
		/>

	</fieldset>

	<fieldset
		name="tagselection"
		label="COM_TAGS_CONFIG_SELECTION_SETTINGS_LABEL"
		description="COM_TAGS_CONFIG_SELECTION_SETTINGS_DESC">

		<field
			name="min_term_length"
			type="integer"
			label="COM_TAGS_CONFIG_TAG_MIN_LENGTH_LABEL"
			description="COM_TAGS_CONFIG_TAG_MIN_LENGTH_DESC"
			first="1"
			last="3"
			step="1"
			default="3"
		/>

		<field
			name="return_any_or_all"
			type="radio"
			label="COM_TAGS_SEARCH_TYPE_LABEL"
			description="COM_TAGS_SEARCH_TYPE_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">COM_TAGS_ANY</option>
			<option value="0">COM_TAGS_ALL</option>
		</field>

		<field
			name="include_children"
			type="radio"
			label="COM_TAGS_INCLUDE_CHILDREN_LABEL"
			description="COM_TAGS_INCLUDE_CHILDREN_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">COM_TAGS_INCLUDE</option>
			<option value="0">COM_TAGS_EXCLUDE</option>
		</field>

		<field
			name="maximum"
			type="number"
			label="COM_TAGS_LIST_MAX_LABEL"
			description="COM_TAGS_LIST_MAX_DESC"
			default="200"
			filter="integer"
		/>

		<field
			name="tag_list_language_filter"
			type="contentlanguage"
			label="COM_TAGS_FIELD_LANGUAGE_FILTER_LABEL"
			description="COM_TAGS_FIELD_LANGUAGE_FILTER_DESC"
			default="all"
			>
			<option value="all">JALL</option>
			<option value="current_language">JCURRENT</option>
		</field>

	</fieldset>

	<fieldset
		name="alltags"
		label="COM_TAGS_CONFIG_ALL_TAGS_SETTINGS_LABEL"
		description="COM_TAGS_CONFIG_ALL_TAGS_SETTINGS_DESC">

		<field
			name="tags_layout"
			type="componentlayout"
			label="COM_TAGS_CONFIG_ALL_TAGS_FIELD_LAYOUT_LABEL"
			description="COM_TAGS_CONFIG_ALL_TAGS_FIELD_LAYOUT_DESC"
			menuitems="true"
			extension="com_tags"
			view="tags"
		/>

		<field
			name="all_tags_orderby"
			type="list"
			label="JGLOBAL_FIELD_FIELD_ORDERING_LABEL"
			description="JGLOBAL_FIELD_FIELD_ORDERING_DESC"
			default="title"
			validate="options"
			>
			<option value="title">JGLOBAL_TITLE</option>
			<option value="hits">JGLOBAL_HITS</option>
			<option value="created_time">JGLOBAL_CREATED_DATE</option>
			<option value="modified_time">JGLOBAL_MODIFIED_DATE</option>
			<option value="publish_up">JGLOBAL_PUBLISHED_DATE</option>
		</field>

		<field
			name="all_tags_orderby_direction"
			type="radio"
			label="JGLOBAL_ORDER_DIRECTION_LABEL"
			description="JGLOBAL_ORDER_DIRECTION_DESC"
			class="btn-group btn-group-yesno"
			default="ASC"
			>
			<option value="ASC">JGLOBAL_ORDER_ASCENDING</option>
			<option value="DESC">JGLOBAL_ORDER_DESCENDING</option>
		</field>

		<field
			name="all_tags_show_tag_image"
			type="radio"
			label="COM_TAGS_SHOW_ITEM_IMAGE_LABEL"
			description="COM_TAGS_SHOW_ITEM_IMAGE_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="all_tags_show_tag_description"
			type="radio"
			label="COM_TAGS_SHOW_ITEM_DESCRIPTION_LABEL"
			description="COM_TAGS_SHOW_ITEM_DESCRIPTION_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="all_tags_tag_maximum_characters"
			type="number"
			label="COM_TAGS_LIST_MAX_CHARACTERS_LABEL"
			description="COM_TAGS_LIST_MAX_CHARACTERS_DESC"
			filter="integer"
			showon="all_tags_show_tag_description:1"
		/>

		<field
			name="all_tags_show_tag_hits"
			type="radio"
			label="JGLOBAL_HITS"
			description="COM_TAGS_FIELD_CONFIG_HITS_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

	</fieldset>

	<fieldset
		name="shared"
		label="COM_TAGS_CONFIG_SHARED_SETTINGS_LABEL"
		description="COM_TAGS_CONFIG_SHARED_SETTINGS_DESC">

		<field
			name="filter_field"
			type="radio"
			label="JGLOBAL_FILTER_FIELD_LABEL"
			description="JGLOBAL_FILTER_FIELD_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_pagination_limit"
			type="radio"
			label="JGLOBAL_DISPLAY_SELECT_LABEL"
			description="JGLOBAL_DISPLAY_SELECT_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_pagination"
			type="list"
			label="JGLOBAL_PAGINATION_LABEL"
			description="JGLOBAL_PAGINATION_DESC"
			default="2"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
			<option value="2">JGLOBAL_AUTO</option>
		</field>

		<field
			name="show_pagination_results"
			type="radio"
			label="JGLOBAL_PAGINATION_RESULTS_LABEL"
			description="JGLOBAL_PAGINATION_RESULTS_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			showon="show_pagination:1,2"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

	</fieldset>

	<fieldset
		name="data_entry"
		label="COM_TAGS_CONFIG_DATA_ENTRY_SETTINGS_LABEL"
		description="COM_TAGS_CONFIG_DATA_ENTRY_SETTINGS_DESC">

		<field
			name="tag_field_ajax_mode"
			type="radio"
			label="COM_TAGS_TAG_FIELD_MODE_LABEL"
			description="COM_TAGS_TAG_FIELD_MODE_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">COM_TAGS_TAG_FIELD_MODE_AJAX</option>
			<option value="0">COM_TAGS_TAG_FIELD_MODE_NESTED</option>
		</field>

	</fieldset>

	<fieldset
		name="integration"
		label="JGLOBAL_INTEGRATION_LABEL"
		description="COM_TAGS_CONFIG_INTEGRATION_SETTINGS_DESC"
	>
		<field
			name="integration_newsfeeds"
			type="note"
			label="JGLOBAL_FEED_TITLE"
		/>

		<field
			name="show_feed_link"
			type="radio"
			label="JGLOBAL_SHOW_FEED_LINK_LABEL"
			description="JGLOBAL_SHOW_FEED_LINK_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

	</fieldset>

	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
		>

		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			filter="rules"
			validate="rules"
			component="com_tags"
			section="component"
		/>
	</fieldset>
</config>
components/com_tags/tags.php000060400000001115152453623450012177 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_tags
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
JHtml::_('behavior.tabstate');

if (!JFactory::getUser()->authorise('core.manage', 'com_tags'))
{
	throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
}

$controller = JControllerLegacy::getInstance('Tags');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
components/com_tags/tables/tag.php000060400000014033152453623450013271 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_tags
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;

/**
 * Tags table
 *
 * @since  3.1
 */
class TagsTableTag extends JTableNested
{
	/**
	 * Constructor
	 *
	 * @param   JDatabaseDriver  $db  A database connector object
	 */
	public function __construct($db)
	{
		parent::__construct('#__tags', 'id', $db);

		JTableObserverContenthistory::createObserver($this, array('typeAlias' => 'com_tags.tag'));
	}

	/**
	 * Overloaded bind function
	 *
	 * @param   array  $array   Named array
	 * @param   mixed  $ignore  An optional array or space separated list of properties
	 * to ignore while binding.
	 *
	 * @return  mixed  Null if operation was satisfactory, otherwise returns an error string
	 *
	 * @see     JTable::bind
	 * @since   3.1
	 */
	public function bind($array, $ignore = '')
	{
		if (isset($array['params']) && is_array($array['params']))
		{
			$registry = new Registry($array['params']);
			$array['params'] = (string) $registry;
		}

		if (isset($array['metadata']) && is_array($array['metadata']))
		{
			$registry = new Registry($array['metadata']);
			$array['metadata'] = (string) $registry;
		}

		if (isset($array['urls']) && is_array($array['urls']))
		{
			$registry = new Registry($array['urls']);
			$array['urls'] = (string) $registry;
		}

		if (isset($array['images']) && is_array($array['images']))
		{
			$registry = new Registry($array['images']);
			$array['images'] = (string) $registry;
		}

		return parent::bind($array, $ignore);
	}

	/**
	 * Overloaded check method to ensure data integrity.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   3.1
	 * @throws  UnexpectedValueException
	 */
	public function check()
	{
		// Check for valid name.
		if (trim($this->title) == '')
		{
			throw new UnexpectedValueException(sprintf('The title is empty'));
		}

		if (empty($this->alias))
		{
			$this->alias = $this->title;
		}

		$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 ((int) $this->publish_down > 0 && $this->publish_down < $this->publish_up)
		{
			throw new UnexpectedValueException(sprintf('End publish date is before start publish date.'));
		}

		// Clean up keywords -- eliminate extra spaces between phrases
		// and cr (\r) and lf (\n) characters from string
		if (!empty($this->metakey))
		{
			// Only process if not empty
			// Define array of characters to remove
			$bad_characters = array("\n", "\r", "\"", '<', '>');

			// Remove bad characters
			$after_clean = StringHelper::str_ireplace($bad_characters, '', $this->metakey);

			// Create array using commas as delimiter
			$keys = explode(',', $after_clean);
			$clean_keys = array();

			foreach ($keys as $key)
			{
				if (trim($key))
				{
					// Ignore blank keywords
					$clean_keys[] = trim($key);
				}
			}

			// Put array back together delimited by ", "
			$this->metakey = implode(', ', $clean_keys);
		}

		// Clean up description -- eliminate quotes and <> brackets
		if (!empty($this->metadesc))
		{
			// Only process if not empty
			$bad_characters = array("\"", '<', '>');
			$this->metadesc = StringHelper::str_ireplace($bad_characters, '', $this->metadesc);
		}

		// Not Null sanity check
		$date = JFactory::getDate();

		if (empty($this->params))
		{
			$this->params = '{}';
		}

		if (empty($this->metadesc))
		{
			$this->metadesc = '';
		}

		if (empty($this->metakey))
		{
			$this->metakey = '';
		}

		if (empty($this->metadata))
		{
			$this->metadata = '{}';
		}

		if (empty($this->urls))
		{
			$this->urls = '{}';
		}

		if (empty($this->images))
		{
			$this->images = '{}';
		}

		if (!(int) $this->checked_out_time)
		{
			$this->checked_out_time = $date->toSql();
		}

		if (!(int) $this->modified_time)
		{
			$this->modified_time = $date->toSql();
		}

		if (!(int) $this->modified_time)
		{
			$this->modified_time = $date->toSql();
		}

		if (!(int) $this->publish_up)
		{
			$this->publish_up = $date->toSql();
		}

		if (!(int) $this->publish_down)
		{
			$this->publish_down = $date->toSql();
		}

		return true;
	}

	/**
	 * Overriden JTable::store to set modified data and user id.
	 *
	 * @param   boolean  $updateNulls  True to update fields even if they are null.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   3.1
	 */
	public function store($updateNulls = false)
	{
		$date = JFactory::getDate();
		$user = JFactory::getUser();

		$this->modified_time = $date->toSql();

		if ($this->id)
		{
			// Existing item
			$this->modified_user_id = $user->get('id');
		}
		else
		{
			// New tag. A tag 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_time)
			{
				$this->created_time = $date->toSql();
			}

			if (empty($this->created_user_id))
			{
				$this->created_user_id = $user->get('id');
			}
		}

		// Verify that the alias is unique
		$table = JTable::getInstance('Tag', 'TagsTable', array('dbo' => $this->_db));

		if ($table->load(array('alias' => $this->alias)) && ($table->id != $this->id || $this->id == 0))
		{
			$this->setError(JText::_('COM_TAGS_ERROR_UNIQUE_ALIAS'));

			return false;
		}

		return parent::store($updateNulls);
	}

	/**
	 * Method to delete a node and, optionally, its child nodes from the table.
	 *
	 * @param   integer  $pk        The primary key of the node to delete.
	 * @param   boolean  $children  True to delete child nodes, false to move them up a level.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   3.1
	 */
	public function delete($pk = null, $children = false)
	{
		$return = parent::delete($pk, $children);

		if ($return)
		{
			$helper = new JHelperTags;
			$helper->tagDeleteInstances($pk);
		}

		return $return;
	}
}
components/com_tags/controller.php000060400000002572152453623450013434 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_tags
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Tags view class for the Tags package.
 *
 * @since  3.1
 */
class TagsController extends JControllerLegacy
{
	/**
	 * 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  JControllerLegacy  This object to support chaining.
	 *
	 * @since   3.1
	 */
	public function display($cachable = false, $urlparams = false)
	{
		$view   = $this->input->get('view', 'tags');
		$layout = $this->input->get('layout', 'default');
		$id     = $this->input->getInt('id');

		// Check for edit form.
		if ($view == 'tag' && $layout == 'edit' && !$this->checkEditId('com_tags.edit.tag', $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_tags&view=tags', false));

			return false;
		}

		parent::display();

		return $this;
	}
}
components/com_tags/models/forms/filter_tags.xml000060400000005341152453623450016173 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_TAGS_FILTER_SEARCH_LABEL"
			description="COM_TAGS_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
		/>
		<field
			name="published"
			type="status"
			label="COM_TAGS_FILTER_PUBLISHED"
			description="COM_TAGS_FILTER_PUBLISHED_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>
		<field
			name="access"
			type="accesslevel"
			label="JOPTION_FILTER_ACCESS"
			description="JOPTION_FILTER_ACCESS_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_ACCESS</option>
		</field>
		<field
			name="language"
			type="contentlanguage"
			label="JOPTION_FILTER_LANGUAGE"
			description="JOPTION_FILTER_LANGUAGE_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_LANGUAGE</option>
			<option value="*">JALL</option>
		</field>
        <field
			name="level"
			type="integer"
			label="JOPTION_FILTER_LEVEL"
			description="JOPTION_FILTER_LEVEL_DESC"
			first="1"
			last="10"
			step="1"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_MAX_LEVELS</option>
        </field>
		<field
			name="extension"
			type="aliastag"
			label="COM_TAGS_FILTER_ALIASTYPE_LABEL"
			description="COM_TAGS_FIELD_ALIASTYPE_DESC"
			onchange="this.form.submit();"
			>
			<option value="">COM_TAGS_SELECT_TAGTYPE</option>
		</field>
	</fields>
	<fields name="list">
		<field
            name="fullordering"
			type="list"
			label="COM_TAGS_LIST_FULL_ORDERING"
			description="COM_TAGS_LIST_FULL_ORDERING_DESC"
			onchange="this.form.submit();"
			default="a.lft ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.lft ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.lft DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.published ASC">JSTATUS_ASC</option>
			<option value="a.published DESC">JSTATUS_DESC</option>
			<option value="a.title ASC">JGLOBAL_TITLE_ASC</option>
			<option value="a.title DESC">JGLOBAL_TITLE_DESC</option>
			<option value="a.access ASC">JGRID_HEADING_ACCESS_ASC</option>
			<option value="a.access DESC">JGRID_HEADING_ACCESS_DESC</option>
			<option value="a.language ASC">JGRID_HEADING_LANGUAGE_ASC</option>
			<option value="a.language DESC">JGRID_HEADING_LANGUAGE_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			label="COM_TAGS_LIST_LIMIT"
			description="COM_TAGS_LIST_LIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_tags/models/forms/tag.xml000060400000016201152453623450014440 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<field
		name="id"
		type="number"
		label="JGLOBAL_FIELD_ID_LABEL"
		description="JGLOBAL_FIELD_ID_DESC"
		default="0"
		class="readonly"
		readonly="true"
	/>

	<field
		name="hits"
		type="number"
		label="JGLOBAL_HITS"
		description="COM_TAGS_FIELD_HITS_DESC"
		class="readonly"
		default="0"
		readonly="true"
		filter="unset"
	/>

	<field
		name="parent_id"
		type="tag"
		label="COM_TAGS_FIELD_PARENT_LABEL"
		description="COM_TAGS_FIELD_PARENT_DESC"
		mode="nested"
		validate="notequals"
		field="id"
		parent="parent"
		>
		<option value="1">JNONE</option>
	</field>

	<field
		name="lft"
		type="hidden"
		filter="unset"
	/>

	<field
		name="rgt"
		type="hidden"
		filter="unset"
	/>

	<field
		name="level"
		type="hidden"
		filter="unset"
	/>

	<field
		name="path"
		type="text"
		label="CATEGORIES_PATH_LABEL"
		description="CATEGORIES_PATH_DESC"
		class="readonly"
		size="40"
		readonly="true"
	/>

	<field
		name="title"
		type="text"
		label="JGLOBAL_TITLE"
		description="JFIELD_TITLE_DESC"
		class="input-xxlarge input-large-text"
		size="40"
		required="true"
	/>

	<field
		name="note"
		type="text"
		label="COM_TAGS_FIELD_NOTE_LABEL"
		description="COM_TAGS_FIELD_NOTE_DESC"
		maxlength="255"
		class="span12"
		size="40"
	/>

	<field
		name="description"
		type="editor"
		label="JGLOBAL_DESCRIPTION"
		description="COM_TAGS_DESCRIPTION_DESC"
		filter="JComponentHelper::filterText"
		buttons="true"
		hide="readmore,pagebreak"
	/>

	<field
		name="published"
		type="list"
		label="JSTATUS"
		description="JFIELD_PUBLISHED_DESC"
		class="chzn-color-state"
		default="1"
		size="1"
		>
		<option value="1">JPUBLISHED</option>
		<option value="0">JUNPUBLISHED</option>
		<option value="2">JARCHIVED</option>
		<option value="-2">JTRASHED</option>
	</field>

	<field
		name="checked_out"
		type="hidden"
		filter="unset"
	/>

	<field
		name="checked_out_time"
		type="hidden"
		filter="unset"
	/>

	<field
		name="access"
		type="accesslevel"
		label="JFIELD_ACCESS_LABEL"
		description="JFIELD_ACCESS_DESC"
	/>

	<field
		name="metadesc"
		type="textarea"
		label="JFIELD_META_DESCRIPTION_LABEL"
		description="JFIELD_META_DESCRIPTION_DESC"
		rows="3"
		cols="40"
	/>

	<field
		name="metakey"
		type="textarea"
		label="JFIELD_META_KEYWORDS_LABEL"
		description="JFIELD_META_KEYWORDS_DESC"
		rows="3"
		cols="40"
	/>

	<field
		name="alias"
		type="text"
		label="JFIELD_ALIAS_LABEL"
		description="JFIELD_ALIAS_DESC"
		hint="JFIELD_ALIAS_PLACEHOLDER"
		size="40"
	/>

	<field
		name="created_user_id"
		type="user"
		label="JGLOBAL_FIELD_CREATED_BY_LABEL"
		description="JGLOBAL_FIELD_CREATED_BY_DESC"
	/>

	<field
		name="created_by_alias"
		type="text"
		label="JGLOBAL_FIELD_CREATED_BY_ALIAS_LABEL"
		description="JGLOBAL_FIELD_CREATED_BY_ALIAS_DESC"
		labelclass="control-label"
		size="20"
	/>

	<field
		name="created_time"
		type="calendar"
		label="JGLOBAL_CREATED_DATE"
		description="COM_TAGS_FIELD_CREATED_DATE_DESC"
		class="readonly"
		translateformat="true"
		showtime="true"
		filter="user_utc"
		readonly="true"
	/>

	<field
		name="modified_user_id"
		type="user"
		label="JGLOBAL_FIELD_MODIFIED_BY_LABEL"
		class="readonly"
		readonly="true"
		filter="unset"
	/>

	<field
		name="modified_time"
		type="calendar"
		label="JGLOBAL_FIELD_MODIFIED_LABEL"
		description="COM_TAGS_FIELD_MODIFIED_DESC"
		class="readonly"
		translateformat="true"
		showtime="true"
		filter="user_utc"
		readonly="true"
	/>

	<field
		name="language"
		type="contentlanguage"
		label="JFIELD_LANGUAGE_LABEL"
		description="COM_TAGS_FIELD_LANGUAGE_DESC"
		>
		<option value="*">JALL</option>
	</field>

	<field
		name="version_note"
		type="text"
		label="JGLOBAL_FIELD_VERSION_NOTE_LABEL"
		description="JGLOBAL_FIELD_VERSION_NOTE_DESC"
		maxlength="255"
		class="span12" size="45"
		labelclass="control-label"
	/>

	<fields name="params" label="JGLOBAL_FIELDSET_DISPLAY_OPTIONS">
		<fieldset
			name="basic"
			label="COM_TAGS_BASIC_FIELDSET_LABEL"
		>

			<field
				name="tag_layout"
				type="componentlayout"
				label="JFIELD_ALT_LAYOUT_LABEL"
				description="JFIELD_ALT_COMPONENT_LAYOUT_DESC"
				labelclass="control-label"
				useglobal="true"
				extension="com_tags"
				view="tag"
			/>

			<field
				name="tag_link_class"
				type="text"
				label="COM_TAGS_FIELD_TAG_LINK_CLASS"
				description="COM_TAGS_FIELD_TAG_LINK_CLASS_DESC"
				labelclass="control-label"
				size="20"
				default="label label-info"
			/>

		</fieldset>
	</fields>

	<fields name="images">
		<fieldset name="images" label="JGLOBAL_FIELDSET_IMAGE_OPTIONS">
			<field
				name="image_intro"
				type="media"
				label="COM_TAGS_FIELD_INTRO_LABEL"
				description="COM_TAGS_FIELD_INTRO_DESC"
				labelclass="control-label"
			/>

			<field
				name="float_intro"
				type="list"
				label="COM_TAGS_FLOAT_LABEL"
				description="COM_TAGS_FLOAT_DESC"
				labelclass="control-label"
				>
				<option value="">JGLOBAL_SELECT_AN_OPTION</option>
				<option value="right">COM_TAGS_RIGHT</option>
				<option value="left">COM_TAGS_LEFT</option>
				<option value="none">COM_TAGS_NONE</option>
			</field>

			<field
				name="image_intro_alt"
				type="text"
				label="COM_TAGS_FIELD_IMAGE_ALT_LABEL"
				description="COM_TAGS_FIELD_IMAGE_ALT_DESC"
				labelclass="control-label"
				size="20"
			/>

			<field
				name="image_intro_caption"
				type="text"
				label="COM_TAGS_FIELD_IMAGE_CAPTION_LABEL"
				description="COM_TAGS_FIELD_IMAGE_CAPTION_DESC"
				size="20"
				labelclass="control-label"
			/>

			<field
				name="spacer1"
				type="spacer"
				hr="true"
			/>

			<field
				name="image_fulltext"
				type="media"
				label="COM_TAGS_FIELD_FULL_LABEL"
				description="COM_TAGS_FIELD_FULL_DESC"
				labelclass="control-label"
			/>

			<field
				name="float_fulltext"
				type="list"
				label="COM_TAGS_FLOAT_LABEL"
				description="COM_TAGS_FLOAT_DESC"
				labelclass="control-label"
				>
				<option value="">JGLOBAL_SELECT_AN_OPTION</option>
				<option value="right">COM_TAGS_RIGHT</option>
				<option value="left">COM_TAGS_LEFT</option>
				<option value="none">COM_TAGS_NONE</option>
			</field>

			<field
				name="image_fulltext_alt"
				type="text"
				label="COM_TAGS_FIELD_IMAGE_ALT_LABEL"
				description="COM_TAGS_FIELD_IMAGE_ALT_DESC"
				labelclass="control-label"
				size="20"
			/>

			<field
				name="image_fulltext_caption"
				type="text"
				label="COM_TAGS_FIELD_IMAGE_CAPTION_LABEL"
				description="COM_TAGS_FIELD_IMAGE_CAPTION_DESC"
				labelclass="control-label"
				size="20"
			/>
		</fieldset>
	</fields>

	<fields name="metadata" label="JGLOBAL_FIELDSET_METADATA_OPTIONS">
		<fieldset name="jmetadata" label="JGLOBAL_FIELDSET_METADATA_OPTIONS">

			<field
				name="author"
				type="text"
				label="JAUTHOR"
				description="JFIELD_METADATA_AUTHOR_DESC"
				size="30"
			/>

			<field
				name="robots"
				type="list"
				label="JFIELD_METADATA_ROBOTS_LABEL"
				description="JFIELD_METADATA_ROBOTS_DESC"
				>
				<option value="">JGLOBAL_USE_GLOBAL</option>
				<option value="index, follow"></option>
				<option value="noindex, follow"></option>
				<option value="index, nofollow"></option>
				<option value="noindex, nofollow"></option>
			</field>
		</fieldset>
	</fields>
</form>
components/com_tags/models/tag.php000060400000023277152453623450013314 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_tags
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;

/**
 * Tags Component Tag Model
 *
 * @since  3.1
 */
class TagsModelTag extends JModelAdmin
{
	/**
	 * @var    string  The prefix to use with controller messages.
	 * @since  3.1
	 */
	protected $text_prefix = 'COM_TAGS';

	/**
	 * @var    string  The type alias for this content type.
	 * @since  3.2
	 */
	public $typeAlias = 'com_tags.tag';

	/**
	 * Allowed batch commands
	 *
	 * @var    array
	 * @since  3.7.0
	 */
	protected $batch_commands = array(
		'assetgroup_id' => 'batchAccess',
		'language_id' => 'batchLanguage',
	);

	/**
	 * 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   3.1
	 */
	protected function canDelete($record)
	{
		if (empty($record->id) || $record->published != -2)
		{
			return false;
		}

		return parent::canDelete($record);
	}

	/**
	 * 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   3.1
	 */
	public function getTable($type = 'Tag', $prefix = 'TagsTable', $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   3.1
	 */
	protected function populateState()
	{
		$app = JFactory::getApplication('administrator');

		$parentId = $app->input->getInt('parent_id');
		$this->setState('tag.parent_id', $parentId);

		// Load the User state.
		$pk = $app->input->getInt('id');
		$this->setState($this->getName() . '.id', $pk);

		// Load the parameters.
		$params = JComponentHelper::getParams('com_tags');
		$this->setState('params', $params);
	}

	/**
	 * Method to get a tag.
	 *
	 * @param   integer  $pk  An optional id of the object to get, otherwise the id from the model state is used.
	 *
	 * @return  mixed  Tag data object on success, false on failure.
	 *
	 * @since   3.1
	 */
	public function getItem($pk = null)
	{
		if ($result = parent::getItem($pk))
		{
			// Prime required properties.
			if (empty($result->id))
			{
				$result->parent_id = $this->getState('tag.parent_id');
			}

			// Convert the metadata field to an array.
			$registry = new Registry($result->metadata);
			$result->metadata = $registry->toArray();

			// Convert the images field to an array.
			$registry = new Registry($result->images);
			$result->images = $registry->toArray();

			// Convert the urls field to an array.
			$registry = new Registry($result->urls);
			$result->urls = $registry->toArray();

			// Convert the modified date to local user time for display in the form.
			$tz = new DateTimeZone(JFactory::getApplication()->get('offset'));

			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;
			}
		}

		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  mixed  A JForm object on success, false on failure
	 *
	 * @since   3.1
	 */
	public function getForm($data = array(), $loadData = true)
	{
		$jinput = JFactory::getApplication()->input;

		// Get the form.
		$form = $this->loadForm('com_tags.tag', 'tag', array('control' => 'jform', 'load_data' => $loadData));

		if (empty($form))
		{
			return false;
		}

		$user = JFactory::getUser();

		if (!$user->authorise('core.edit.state', 'com_tags' . $jinput->get('id')))
		{
			// 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;
	}

	/**
	 * Method to get the data that should be injected in the form.
	 *
	 * @return  mixed  The data for the form.
	 *
	 * @since   3.1
	 */
	protected function loadFormData()
	{
		// Check the session for previously entered form data.
		$data = JFactory::getApplication()->getUserState('com_tags.edit.tag.data', array());

		if (empty($data))
		{
			$data = $this->getItem();
		}

		$this->preprocessData('com_tags.tag', $data);

		return $data;
	}

	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   3.1
	 */
	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;

		// Include the plugins for the save events.
		JPluginHelper::importPlugin($this->events_map['save']);

		// Load the row if saving an existing tag.
		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');
		}

		if (isset($data['images']) && is_array($data['images']))
		{
			$registry = new Registry($data['images']);
			$data['images'] = (string) $registry;
		}

		if (isset($data['urls']) && is_array($data['urls']))
		{
			$registry = new Registry($data['urls']);
			$data['urls'] = (string) $registry;
		}

		// Alter the title for save as copy
		if ($input->get('task') == 'save2copy')
		{
			$origTable = $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;
			}
			elseif ($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));

		if (in_array(false, $result, true))
		{
			$this->setError($table->getError());

			return false;
		}

		// Store the data.
		if (!$table->store())
		{
			$this->setError($table->getError());

			return false;
		}

		// Trigger the after save event.
		$dispatcher->trigger($this->event_after_save, array($context, &$table, $isNew));

		// Rebuild the path for the tag:
		if (!$table->rebuildPath($table->id))
		{
			$this->setError($table->getError());

			return false;
		}

		// Rebuild the paths of the tag'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 rebuild the entire nested set tree.
	 *
	 * @return  boolean  False on failure or error, true otherwise.
	 *
	 * @since   3.1
	 */
	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  $lftArray  The lft value
	 *
	 * @return  boolean  False on failure or error, True otherwise
	 *
	 * @since   3.1
	 */
	public function saveorder($idArray = null, $lftArray = null)
	{
		// Get an instance of the table object.
		$table = $this->getTable();

		if (!$table->saveorder($idArray, $lftArray))
		{
			$this->setError($table->getError());

			return false;
		}

		// Clear the cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Method to change the title & alias.
	 *
	 * @param   integer  $parentId  The id of the parent.
	 * @param   string   $alias     The alias.
	 * @param   string   $title     The title.
	 *
	 * @return  array  Contains the modified title and alias.
	 *
	 * @since   3.1
	 */
	protected function generateNewTitle($parentId, $alias, $title)
	{
		// Alter the title & alias
		$table = $this->getTable();

		while ($table->load(array('alias' => $alias, 'parent_id' => $parentId)))
		{
			$title = ($table->title != $title) ? $title : StringHelper::increment($title);
			$alias = StringHelper::increment($alias, 'dash');
		}

		return array($title, $alias);
	}
}
components/com_tags/models/tags.php000060400000023176152453623450013475 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_tags
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Tags Component Tags Model
 *
 * @since  3.1
 */
class TagsModelTags extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see    JController
	 * @since  3.0.3
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'title', 'a.title',
				'alias', 'a.alias',
				'published', 'a.published',
				'access', 'a.access', 'access_level',
				'language', 'a.language',
				'checked_out', 'a.checked_out',
				'checked_out_time', 'a.checked_out_time',
				'created_time', 'a.created_time',
				'created_user_id', 'a.created_user_id',
				'lft', 'a.lft',
				'rgt', 'a.rgt',
				'level', 'a.level',
				'path', 'a.path',
			);
		}

		parent::__construct($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    3.1
	 */
	protected function populateState($ordering = 'a.lft', $direction = 'asc')
	{
		$search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		$level = $this->getUserStateFromRequest($this->context . '.filter.level', 'filter_level', '');
		$this->setState('filter.level', $level);

		$access = $this->getUserStateFromRequest($this->context . '.filter.access', 'filter_access', '');
		$this->setState('filter.access', $access);

		$published = $this->getUserStateFromRequest($this->context . '.filter.published', 'filter_published', '');
		$this->setState('filter.published', $published);

		$language = $this->getUserStateFromRequest($this->context . '.filter.language', 'filter_language', '');
		$this->setState('filter.language', $language);

		$extension = $this->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);

		// Load the parameters.
		$params = JComponentHelper::getParams('com_tags');
		$this->setState('params', $params);

		// 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.
	 *
	 * @since   3.1
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.extension');
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.level');
		$id .= ':' . $this->getState('filter.access');
		$id .= ':' . $this->getState('filter.published');
		$id .= ':' . $this->getState('filter.language');

		return parent::getStoreId($id);
	}

	/**
	 * Method to create a query for a list of items.
	 *
	 * @return  string
	 *
	 * @since  3.1
	 */
	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.description' .
					', 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('#__tags AS a')
			->where('a.alias <> ' . $db->quote('root'));

		// 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 users for the author.
		$query->select('ua.name AS author_name')
			->join('LEFT', '#__users AS ua ON ua.id = a.created_user_id')

			->select('ug.title AS access_title')
			->join('LEFT', '#__viewlevels AS ug on ug.id = a.access');

		// 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));
		}

		// 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);
		}

		return $query;
	}

	/**
	 * Method override to check-in a record or an array of record
	 *
	 * @param   mixed  $pks  The ID of the primary key or an array of IDs
	 *
	 * @return  mixed  Boolean false if there is an error, otherwise the count of records checked in.
	 *
	 * @since   3.0.1
	 */
	public function checkin($pks = array())
	{
		$pks = (array) $pks;
		$table = $this->getTable();
		$count = 0;

		if (empty($pks))
		{
			$pks = array((int) $this->getState($this->getName() . '.id'));
		}

		// Check in all items.
		foreach ($pks as $pk)
		{
			if ($table->load($pk))
			{
				if ($table->checked_out > 0)
				{
					// Only attempt to check the row in if it exists.
					if ($pk)
					{
						$user = JFactory::getUser();

						// Get an instance of the row to checkin.
						$table = $this->getTable();

						if (!$table->load($pk))
						{
							$this->setError($table->getError());

							return false;
						}

						// Check if this is the user having previously checked out the row.
						if ($table->checked_out > 0 && $table->checked_out != $user->get('id') && !$user->authorise('core.admin', 'com_checkin'))
						{
							$this->setError(JText::_('JLIB_APPLICATION_ERROR_CHECKIN_USER_MISMATCH'));

							return false;
						}

						// Attempt to check the row in.
						if (!$table->checkin($pk))
						{
							$this->setError($table->getError());

							return false;
						}
					}

					$count++;
				}
			}
			else
			{
				$this->setError($table->getError());

				return false;
			}
		}

		return $count;
	}

	/**
	 * 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   3.1
	 */
	public function getTable($type = 'Tag', $prefix = 'TagsTable', $config = array())
	{
		return JTable::getInstance($type, $prefix, $config);
	}

	/**
	 * Method to get an array of data items.
	 *
	 * @return  mixed  An array of data items on success, false on failure.
	 *
	 * @since   3.0.1
	 */
	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);
		$component = $parts[0];
		$section = null;

		if (count($parts) < 2)
		{
			return;
		}

		// 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) && is_callable(array($cName, 'countTagItems')))
			{
				$cName::countTagItems($items, $extension);
			}
		}
	}
}
components/com_tags/views/tags/tmpl/default_batch_body.php000060400000001175152453623450020120 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_tags
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;
$published = $this->state->get('filter.published');
?>

<div class="container-fluid">
	<div class="row-fluid">
		<div class="control-group span6">
			<div class="controls">
				<?php echo JHtml::_('batch.language'); ?>
			</div>
		</div>
		<div class="control-group span6">
			<div class="controls">
				<?php echo JHtml::_('batch.access'); ?>
			</div>
		</div>
	</div>
</div>components/com_tags/views/tags/tmpl/default.php000060400000030331152453623450015736 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_tags
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\String\Inflector;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$app       = JFactory::getApplication();
$user      = JFactory::getUser();
$userId    = $user->get('id');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$saveOrder = ($listOrder == 'a.lft' && strtolower($listDirn) == 'asc');
$extension = $this->escape($this->state->get('filter.extension'));
$parts     = explode('.', $extension);
$component = $parts[0];
$section   = null;
$mode      = false;
$columns   = 7;

if (count($parts) > 1)
{
	$section = $parts[1];
	$inflector = Inflector::getInstance();

	if (!$inflector->isPlural($section))
	{
		$section = $inflector->toPlural($section);
	}
}

if ($section === 'categories')
{
	$mode = true;
	$section = $component;
	$component = 'com_categories';
}

if ($saveOrder)
{
	$saveOrderingUrl = 'index.php?option=com_tags&task=tags.saveOrderAjax';
	JHtml::_('sortablelist.sortable', 'categoryList', 'adminForm', strtolower($listDirn), $saveOrderingUrl, false, true);
}
?>
<form action="<?php echo JRoute::_('index.php?option=com_tags&view=tags'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty($this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
		<?php
		// Search tools bar
		echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this));
		?>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped" id="categoryList">
				<thead>
					<tr>
						<th width="1%" class="nowrap hidden-phone center">
							<?php echo JHtml::_('searchtools.sort', '', 'a.lft', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING', 'icon-menu-2'); ?>
						</th>
						<th width="1%">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.published', $listDirn, $listOrder); ?>
						</th>
						<th>
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
						</th>

						<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_published')) : ?>
							<th width="1%" class="nowrap center hidden-phone">
								<span class="icon-publish hasTooltip" aria-hidden="true" title="<?php echo JText::_('COM_TAGS_COUNT_PUBLISHED_ITEMS'); ?>"><span class="element-invisible"><?php echo JText::_('COM_TAGS_COUNT_PUBLISHED_ITEMS'); ?></span></span>
							</th>
							<?php $columns++; ?>
						<?php endif; ?>
						<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_unpublished')) : ?>
							<th width="1%" class="nowrap center hidden-phone">
								<span class="icon-unpublish hasTooltip" aria-hidden="true" title="<?php echo JText::_('COM_TAGS_COUNT_UNPUBLISHED_ITEMS'); ?>"><span class="element-invisible"><?php echo JText::_('COM_TAGS_COUNT_UNPUBLISHED_ITEMS'); ?></span></span>
							</th>
							<?php $columns++; ?>
						<?php endif; ?>
						<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_archived')) : ?>
							<th width="1%" class="nowrap center hidden-phone">
								<span class="icon-archive hasTooltip" aria-hidden="true" title="<?php echo JText::_('COM_TAGS_COUNT_ARCHIVED_ITEMS'); ?>"><span class="element-invisible"><?php echo JText::_('COM_TAGS_COUNT_ARCHIVED_ITEMS'); ?></span></span>
							</th>
							<?php $columns++; ?>
						<?php endif; ?>
						<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_trashed')) : ?>
							<th width="1%" class="nowrap center hidden-phone">
								<span class="icon-trash hasTooltip" aria-hidden="true" title="<?php echo JText::_('COM_TAGS_COUNT_TRASHED_ITEMS'); ?>"><span class="element-invisible"><?php echo JText::_('COM_TAGS_COUNT_TRASHED_ITEMS'); ?></span></span>
							</th>
							<?php $columns++; ?>
						<?php endif; ?>

						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort',  'JGRID_HEADING_ACCESS', 'a.access', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'a.language', $this->state->get('list.direction'), $this->state->get('list.ordering')); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="<?php echo $columns; ?>">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
				<?php
				foreach ($this->items as $i => $item) :
					$orderkey   = array_search($item->id, $this->ordering[$item->parent_id]);
					$canCreate  = $user->authorise('core.create',     'com_tags');
					$canEdit    = $user->authorise('core.edit',       'com_tags');
					$canCheckin = $user->authorise('core.manage',     'com_checkin') || $item->checked_out == $user->get('id')|| $item->checked_out == 0;
					$canChange  = $user->authorise('core.edit.state', 'com_tags') && $canCheckin;

					// Get the parents of item for sorting
					if ($item->level > 1)
					{
						$parentsStr = '';
						$_currentParentId = $item->parent_id;
						$parentsStr = ' ' . $_currentParentId;
						for ($j = 0; $j < $item->level; $j++)
						{
							foreach ($this->ordering as $k => $v)
							{
								$v = implode('-', $v);
								$v = '-' . $v . '-';
								if (strpos($v, '-' . $_currentParentId . '-') !== false)
								{
									$parentsStr .= ' ' . $k;
									$_currentParentId = $k;
									break;
								}
							}
						}
					}
					else
					{
						$parentsStr = '';
					}
					?>
						<tr class="row<?php echo $i % 2; ?>" sortable-group-id="<?php echo $item->parent_id; ?>" item-id="<?php echo $item->id; ?>" parents="<?php echo $parentsStr; ?>" level="<?php echo $item->level; ?>">
							<td class="order nowrap center hidden-phone">
								<?php
								$iconClass = '';
								if (!$canChange)
								{
									$iconClass = ' inactive';
								}
								elseif (!$saveOrder)
								{
									$iconClass = ' inactive tip-top hasTooltip" title="' . JHtml::_('tooltipText', 'JORDERINGDISABLED');
								}
								?>
								<span class="sortable-handler<?php echo $iconClass ?>">
									<span class="icon-menu"></span>
								</span>
								<?php if ($canChange && $saveOrder) : ?>
									<input type="text" style="display:none" name="order[]" size="5" value="<?php echo $orderkey + 1; ?>" />
								<?php endif; ?>
							</td>
							<td class="center">
								<?php echo JHtml::_('grid.id', $i, $item->id); ?>
							</td>
							<td class="center">
								<div class="btn-group">
									<?php echo JHtml::_('jgrid.published', $item->published, $i, 'tags.', $canChange); ?>
									<?php // Create dropdown items and render the dropdown list.
									if ($canChange)
									{
										JHtml::_('actionsdropdown.' . ((int) $item->published === 2 ? 'un' : '') . 'archive', 'cb' . $i, 'tags');
										JHtml::_('actionsdropdown.' . ((int) $item->published === -2 ? 'un' : '') . 'trash', 'cb' . $i, 'tags');
										echo JHtml::_('actionsdropdown.render', $this->escape($item->title));
									}
									?>
								</div>
							</td>
							<td>
								<?php echo JLayoutHelper::render('joomla.html.treeprefix', array('level' => $item->level)); ?>
								<?php if ($item->checked_out) : ?>
									<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'tags.', $canCheckin); ?>
								<?php endif; ?>
								<?php if ($canEdit) : ?>
									<a href="<?php echo JRoute::_('index.php?option=com_tags&task=tag.edit&id=' . $item->id); ?>">
										<?php echo $this->escape($item->title); ?></a>
								<?php else : ?>
									<?php echo $this->escape($item->title); ?>
								<?php endif; ?>
								<span class="small" title="<?php echo $this->escape($item->path); ?>">
									<?php if (empty($item->note)) : ?>
										<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias)); ?>
									<?php else : ?>
										<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS_NOTE', $this->escape($item->alias), $this->escape($item->note)); ?>
									<?php endif; ?>
								</span>
							</td>

						<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_published')) : ?>
							<td class="center btns hidden-phone">
								<a class="badge <?php if ($item->count_published > 0) echo 'badge-success'; ?>" title="<?php echo JText::_('COM_TAGS_COUNT_PUBLISHED_ITEMS'); ?>" href="<?php echo JRoute::_('index.php?option=' . $component . ($mode ? '&extension=' . $section : '&view=' . $section) . '&filter[tag]=' . (int) $item->id . '&filter[published]=1'); ?>">
									<?php echo $item->count_published; ?></a>
							</td>
						<?php endif; ?>
						<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_unpublished')) : ?>
							<td class="center btns hidden-phone">
								<a class="badge <?php if ($item->count_unpublished > 0) echo 'badge-important'; ?>" title="<?php echo JText::_('COM_TAGS_COUNT_UNPUBLISHED_ITEMS'); ?>" href="<?php echo JRoute::_('index.php?option=' . $component . ($mode ? '&extension=' . $section : '&view=' . $section) . '&filter[tag]=' . (int) $item->id . '&filter[published]=0'); ?>">
									<?php echo $item->count_unpublished; ?></a>
							</td>
						<?php endif; ?>
						<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_archived')) : ?>
							<td class="center btns hidden-phone">
								<a class="badge <?php if ($item->count_archived > 0) echo 'badge-info'; ?>" title="<?php echo JText::_('COM_TAGS_COUNT_ARCHIVED_ITEMS'); ?>" href="<?php echo JRoute::_('index.php?option=' . $component . ($mode ? '&extension=' . $section : '&view=' . $section) . '&filter[tag]=' . (int) $item->id . '&filter[published]=2'); ?>">
									<?php echo $item->count_archived; ?></a>
							</td>
						<?php endif; ?>
						<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_trashed')) : ?>
							<td class="center btns hidden-phone">
								<a class="badge <?php if ($item->count_trashed > 0) echo 'badge-inverse'; ?>" title="<?php echo JText::_('COM_TAGS_COUNT_TRASHED_ITEMS'); ?>" href="<?php echo JRoute::_('index.php?option=' . $component . ($mode ? '&extension=' . $section : '&view=' . $section) . '&filter[tag]=' . (int) $item->id . '&filter[published]=-2'); ?>">
									<?php echo $item->count_trashed; ?></a>
							</td>
						<?php endif; ?>



						<td class="small hidden-phone">
							<?php echo $this->escape($item->access_title); ?>
						</td>
						<td class="small nowrap hidden-phone">
							<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
						</td>
						<td class="hidden-phone">
							<span title="<?php echo sprintf('%d-%d', $item->lft, $item->rgt); ?>">
								<?php echo (int) $item->id; ?></span>
						</td>
					</tr>
				<?php endforeach; ?>
				</tbody>
			</table>
			<?php // Load the batch processing form if user is allowed ?>
			<?php if ($user->authorise('core.create', 'com_tags')
				&& $user->authorise('core.edit', 'com_tags')
				&& $user->authorise('core.edit.state', 'com_tags')) : ?>
				<?php echo JHtml::_(
					'bootstrap.renderModal',
					'collapseModal',
					array(
						'title'  => JText::_('COM_TAGS_BATCH_OPTIONS'),
						'footer' => $this->loadTemplate('batch_footer'),
					),
					$this->loadTemplate('batch_body')
				); ?>
			<?php endif; ?>
		<?php endif; ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_tags/views/tags/tmpl/default_batch_footer.php000060400000001264152453623450020460 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_tags
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

?>
<button type="button" class="btn" onclick="document.getElementById('batch-tag-id').value='';document.getElementById('batch-access').value='';document.getElementById('batch-language-id').value=''" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<button type="submit" class="btn btn-success" onclick="Joomla.submitbutton('tag.batch');return false;">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>
components/com_tags/views/tags/tmpl/default.xml000060400000000303152453623450015743 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_TAGS_TAGS_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_TAGS_TAGS_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>components/com_tags/views/tags/view.html.php000060400000010557152453623450015263 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_tags
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Tags view class for the Tags package.
 *
 * @since  3.1
 */
class TagsViewTags extends JViewLegacy
{
	protected $items;

	protected $pagination;

	protected $state;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed   A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		$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);
		}

		// Preprocess the list of items to find ordering divisions.
		foreach ($this->items as &$item)
		{
			$this->ordering[$item->parent_id][] = $item->id;
		}

		// Levels filter.
		$options   = array();
		$options[] = JHtml::_('select.option', '1', JText::_('J1'));
		$options[] = JHtml::_('select.option', '2', JText::_('J2'));
		$options[] = JHtml::_('select.option', '3', JText::_('J3'));
		$options[] = JHtml::_('select.option', '4', JText::_('J4'));
		$options[] = JHtml::_('select.option', '5', JText::_('J5'));
		$options[] = JHtml::_('select.option', '6', JText::_('J6'));
		$options[] = JHtml::_('select.option', '7', JText::_('J7'));
		$options[] = JHtml::_('select.option', '8', JText::_('J8'));
		$options[] = JHtml::_('select.option', '9', JText::_('J9'));
		$options[] = JHtml::_('select.option', '10', JText::_('J10'));

		$this->f_levels = $options;

		// We don't need toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();
		}

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return void
	 *
	 * @since   3.1
	 */
	protected function addToolbar()
	{
		$state = $this->get('State');
		$canDo = JHelperContent::getActions('com_tags');
		$user  = JFactory::getUser();

		// Get the toolbar object instance
		$bar = JToolbar::getInstance('toolbar');

		JToolbarHelper::title(JText::_('COM_TAGS_MANAGER_TAGS'), 'tags');

		if ($canDo->get('core.create'))
		{
			JToolbarHelper::addNew('tag.add');
		}

		if ($canDo->get('core.edit'))
		{
			JToolbarHelper::editList('tag.edit');
		}

		if ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::publish('tags.publish', 'JTOOLBAR_PUBLISH', true);
			JToolbarHelper::unpublish('tags.unpublish', 'JTOOLBAR_UNPUBLISH', true);
			JToolbarHelper::archiveList('tags.archive');
		}

		if ($canDo->get('core.admin'))
		{
			JToolbarHelper::checkin('tags.checkin');
		}

		// Add a batch button
		if ($user->authorise('core.create', 'com_tags')
			&& $user->authorise('core.edit', 'com_tags')
			&& $user->authorise('core.edit.state', 'com_tags'))
		{
			$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 ($state->get('filter.published') == -2 && $canDo->get('core.delete'))
		{
			JToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'tags.delete', 'JTOOLBAR_EMPTY_TRASH');
		}
		elseif ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::trash('tags.trash');
		}

		if ($canDo->get('core.admin') || $canDo->get('core.options'))
		{
			JToolbarHelper::preferences('com_tags');
		}

		JToolbarHelper::help('JHELP_COMPONENTS_TAGS_MANAGER');
	}

	/**
	 * 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.state'    => JText::_('JSTATUS'),
			'a.title'    => JText::_('JGLOBAL_TITLE'),
			'a.access'   => JText::_('JGRID_HEADING_ACCESS'),
			'a.language' => JText::_('JGRID_HEADING_LANGUAGE'),
			'a.id'       => JText::_('JGRID_HEADING_ID')
		);
	}
}
components/com_tags/views/tag/tmpl/edit.php000060400000004345152453623450015062 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_tags
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');
JHtml::_('formbehavior.chosen', 'select');

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(task)
	{
		if (task == 'tag.cancel' || document.formvalidator.isValid(document.getElementById('item-form'))) {
			" . $this->form->getField('description')->save() . "
			Joomla.submitform(task, document.getElementById('item-form'));
		}
	};
");

// Fieldsets to not automatically render by /layouts/joomla/edit/params.php
$this->ignore_fieldsets = array('jmetadata');
?>

<form action="<?php echo JRoute::_('index.php?option=com_tags&layout=edit&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="item-form" class="form-validate">

	<?php echo JLayoutHelper::render('joomla.edit.title_alias', $this); ?>

	<div class="form-horizontal">
		<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'details')); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'details', JText::_('COM_TAGS_FIELDSET_DETAILS')); ?>
		<div class="row-fluid">
			<div class="span9">
				<div class="form-vertical">
					<?php echo $this->form->renderField('description'); ?>
				</div>
			</div>
			<div class="span3">
				<?php echo JLayoutHelper::render('joomla.edit.global', $this); ?>
			</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php echo JLayoutHelper::render('joomla.edit.params', $this); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'publishing', JText::_('JGLOBAL_FIELDSET_PUBLISHING')); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('joomla.edit.publishingdata', $this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('joomla.edit.metadata', $this); ?>
			</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php echo JHtml::_('bootstrap.endTabSet'); ?>
	</div>
	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>
</form>
components/com_tags/views/tag/tmpl/edit_metadata.php000060400000001537152453623450016722 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_tags
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<div class="control-group">
	<?php echo $this->form->getLabel('metadesc'); ?>
	<div class="controls">
		<?php echo $this->form->getInput('metadesc'); ?>
	</div>
</div>
<div class="control-group">
	<?php echo $this->form->getLabel('metakey'); ?>
	<div class="controls">
		<?php echo $this->form->getInput('metakey'); ?>
	</div>
</div>
<?php foreach ($this->form->getGroup('metadata') as $field) : ?>
<div class="control-group">
	<?php if (!$field->hidden) : ?>
		<?php echo $field->label; ?>
	<?php endif; ?>
	<div class="controls">
		<?php echo $field->input; ?>
	</div>
</div>
<?php endforeach; ?>
components/com_tags/views/tag/tmpl/edit_options.php000060400000003762152453623450016637 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_tags
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<?php
	echo JHtml::_('bootstrap.startAccordion', 'categoryOptions', array('active' => 'collapse0'));
	$fieldSets = $this->form->getFieldsets('params');
	$i = 0;

	foreach ($fieldSets as $name => $fieldSet) :
		$label = !empty($fieldSet->label) ? $fieldSet->label : 'COM_TAGS_' . $name . '_FIELDSET_LABEL';
		echo JHtml::_('bootstrap.addSlide', 'categoryOptions', JText::_($label), 'collapse' . ($i++));
			if (isset($fieldSet->description) && trim($fieldSet->description)) :
				echo '<p class="tip">' . $this->escape(JText::_($fieldSet->description)) . '</p>';
			endif;
			?>
				<?php foreach ($this->form->getFieldset($name) as $field) : ?>
					<div class="control-group">
						<div class="control-label">
							<?php echo $field->label; ?>
						</div>
						<div class="controls">
							<?php echo $field->input; ?>
						</div>
					</div>
				<?php endforeach; ?>

				<?php if ($name == 'basic') : ?>
					<div class="control-group">
						<div class="control-label">
							<?php echo $this->form->getLabel('note'); ?>
						</div>
						<div class="controls">
							<?php echo $this->form->getInput('note'); ?>
						</div>
					</div>
					<div class="control-group">
						<div class="control-label">
							<?php echo $this->form->getLabel('tag_layout'); ?>
						</div>
						<div class="controls">
							<?php echo $this->form->getInput('tag_layout'); ?>
						</div>
					</div>
					<div class="control-group">
						<div class="control-label">
							<?php echo $this->form->getLabel('tag_link_class'); ?>
						</div>
						<div class="controls">
							<?php echo $this->form->getInput('tag_link_class'); ?>
						</div>
					</div>
				<?php endif;
		echo JHtml::_('bootstrap.endSlide');
	endforeach;
echo JHtml::_('bootstrap.endAccordion');
components/com_tags/views/tag/view.html.php000060400000006574152453623450015104 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_tags
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * HTML View class for the Tags component
 *
 * @since  3.1
 */
class TagsViewTag extends JViewLegacy
{
	protected $form;

	protected $item;

	protected $state;

	protected $assoc;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		$this->form  = $this->get('Form');
		$this->item  = $this->get('Item');
		$this->state = $this->get('State');
		$this->canDo = JHelperContent::getActions('com_tags');
		$this->assoc = $this->get('Assoc');

		$input = JFactory::getApplication()->input;

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		$input->set('hidemainmenu', true);
		$this->addToolbar();
		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @since  3.1
	 *
	 * @return void
	 */
	protected function addToolbar()
	{
		$user       = JFactory::getUser();
		$userId     = $user->get('id');
		$isNew      = ($this->item->id == 0);
		$checkedOut = !($this->item->checked_out == 0 || $this->item->checked_out == $userId);

		// Need to load the menu language file as mod_menu hasn't been loaded yet.
		$lang = JFactory::getLanguage();
		$lang->load('com_tags', JPATH_BASE, null, false, true)
		|| $lang->load('com_tags', JPATH_ADMINISTRATOR . '/components/com_tags', null, false, true);

		// Get the results for each action.
		$canDo = $this->canDo;
		$title = JText::_('COM_TAGS_BASE_' . ($isNew ? 'ADD' : 'EDIT') . '_TITLE');

		/**
		 * Prepare the toolbar.
		 * If it is new we get: `tag tag-add add`
		 * else we get `tag tag-edit edit`
		 */
		JToolbarHelper::title($title, 'tag tag-' . ($isNew ? 'add add' : 'edit edit'));

		// For new records, check the create permission.
		if ($isNew)
		{
			JToolbarHelper::apply('tag.apply');
			JToolbarHelper::save('tag.save');
			JToolbarHelper::save2new('tag.save2new');
			JToolbarHelper::cancel('tag.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('tag.apply');
				JToolbarHelper::save('tag.save');

				if ($canDo->get('core.create'))
				{
					JToolbarHelper::save2new('tag.save2new');
				}
			}

			// If an existing item, can save to a copy.
			if ($canDo->get('core.create'))
			{
				JToolbarHelper::save2copy('tag.save2copy');
			}

			if (JComponentHelper::isEnabled('com_contenthistory') && $this->state->params->get('save_history', 0) && $itemEditable)
			{
				JToolbarHelper::versions('com_tags.tag', $this->item->id);
			}

			JToolbarHelper::cancel('tag.cancel', 'JTOOLBAR_CLOSE');
		}

		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_COMPONENTS_TAGS_MANAGER_EDIT');
		JToolbarHelper::divider();
	}
}
components/com_content/config.xml000060400000067763152453623450013260 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset
		name="articles"
		label="JGLOBAL_ARTICLES"
		description="COM_CONTENT_CONFIG_ARTICLE_SETTINGS_DESC"
	>

		<field
			name="article_layout"
			type="componentlayout"
			label="JGLOBAL_FIELD_LAYOUT_LABEL"
			description="JGLOBAL_FIELD_LAYOUT_DESC"
			menuitems="true"
			extension="com_content"
			view="article"
		/>

		<field
			name="show_title"
			type="radio"
			label="JGLOBAL_SHOW_TITLE_LABEL"
			description="JGLOBAL_SHOW_TITLE_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="link_titles"
			type="radio"
			label="JGLOBAL_LINKED_TITLES_LABEL"
			description="JGLOBAL_LINKED_TITLES_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			showon="show_title:1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="show_intro"
			type="radio"
			label="JGLOBAL_SHOW_INTRO_LABEL"
			description="JGLOBAL_SHOW_INTRO_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="info_block_position"
			type="list"
			label="COM_CONTENT_FIELD_INFOBLOCK_POSITION_LABEL"
			description="COM_CONTENT_FIELD_INFOBLOCK_POSITION_DESC"
			default="0"
			>
			<option value="0">COM_CONTENT_FIELD_OPTION_ABOVE</option>
			<option value="1">COM_CONTENT_FIELD_OPTION_BELOW</option>
			<option value="2">COM_CONTENT_FIELD_OPTION_SPLIT</option>
		</field>

		<field
			name="info_block_show_title"
			type="radio"
			label="COM_CONTENT_FIELD_INFOBLOCK_TITLE_LABEL"
			description="COM_CONTENT_FIELD_INFOBLOCK_TITLE_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_category"
			type="radio"
			label="JGLOBAL_SHOW_CATEGORY_LABEL"
			description="JGLOBAL_SHOW_CATEGORY_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="link_category"
			type="radio"
			label="JGLOBAL_LINK_CATEGORY_LABEL"
			description="JGLOBAL_LINK_CATEGORY_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			showon="show_category:1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="show_parent_category"
			type="radio"
			label="JGLOBAL_SHOW_PARENT_CATEGORY_LABEL"
			description="JGLOBAL_SHOW_PARENT_CATEGORY_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="link_parent_category"
			type="radio"
			label="JGLOBAL_LINK_PARENT_CATEGORY_LABEL"
			description="JGLOBAL_LINK_PARENT_CATEGORY_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			showon="show_parent_category:1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="spacer1"
			type="spacer"
			hr="true"
		/>

		<field
			name="show_associations"
			type="radio"
			label="JGLOBAL_SHOW_ASSOCIATIONS_LABEL"
			description="JGLOBAL_SHOW_ASSOCIATIONS_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="flags"
			type="radio"
			label="JGLOBAL_SHOW_FLAG_LABEL"
			description="JGLOBAL_SHOW_FLAG_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			showon="show_associations:1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="spacer3"
			type="spacer"
			hr="true"
		/>

		<field
			name="show_author"
			type="radio"
			label="JGLOBAL_SHOW_AUTHOR_LABEL"
			description="JGLOBAL_SHOW_AUTHOR_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="link_author"
			type="radio"
			label="JGLOBAL_LINK_AUTHOR_LABEL"
			description="JGLOBAL_LINK_AUTHOR_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			showon="show_author:1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="show_create_date"
			type="radio"
			label="JGLOBAL_SHOW_CREATE_DATE_LABEL"
			description="JGLOBAL_SHOW_CREATE_DATE_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_modify_date"
			type="radio"
			label="JGLOBAL_SHOW_MODIFY_DATE_LABEL"
			description="JGLOBAL_SHOW_MODIFY_DATE_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_publish_date"
			type="radio"
			label="JGLOBAL_SHOW_PUBLISH_DATE_LABEL"
			description="JGLOBAL_SHOW_PUBLISH_DATE_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_item_navigation"
			type="radio"
			label="JGLOBAL_SHOW_NAVIGATION_LABEL"
			description="JGLOBAL_SHOW_NAVIGATION_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_vote"
			type="radio"
			label="JGLOBAL_SHOW_VOTE_LABEL"
			description="JGLOBAL_SHOW_VOTE_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_readmore"
			type="radio"
			label="JGLOBAL_SHOW_READMORE_LABEL"
			description="JGLOBAL_SHOW_READMORE_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_readmore_title"
			type="radio"
			label="JGLOBAL_SHOW_READMORE_TITLE_LABEL"
			description="JGLOBAL_SHOW_READMORE_TITLE_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			showon="show_readmore:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="readmore_limit"
			type="number"
			label="JGLOBAL_SHOW_READMORE_LIMIT_LABEL"
			description="JGLOBAL_SHOW_READMORE_LIMIT_DESC"
			default="100"
			showon="show_readmore:1[AND]show_readmore_title:1"
		/>

		<field
			name="show_tags"
			type="radio"
			label="COM_CONTENT_FIELD_SHOW_TAGS_LABEL"
			description="COM_CONTENT_FIELD_SHOW_TAGS_DESC"
			id="show_tags"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="spacer2"
			type="spacer"
			hr="true"
		/>

		<field
			name="show_icons"
			type="radio"
			label="JGLOBAL_SHOW_ICONS_LABEL"
			description="JGLOBAL_SHOW_ICONS_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_print_icon"
			type="radio"
			label="JGLOBAL_SHOW_PRINT_ICON_LABEL"
			description="JGLOBAL_SHOW_PRINT_ICON_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_email_icon"
			type="radio"
			label="JGLOBAL_SHOW_EMAIL_ICON_LABEL"
			description="JGLOBAL_SHOW_EMAIL_ICON_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_hits"
			type="radio"
			label="JGLOBAL_SHOW_HITS_LABEL"
			description="JGLOBAL_SHOW_HITS_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="record_hits"
			type="radio"
			label="JGLOBAL_RECORD_HITS_LABEL"
			description="JGLOBAL_RECORD_HITS_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="show_noauth"
			type="radio"
			label="JGLOBAL_SHOW_UNAUTH_LINKS_LABEL"
			description="JGLOBAL_SHOW_UNAUTH_LINKS_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="urls_position"
			type="radio"
			label="COM_CONTENT_FIELD_URLSPOSITION_LABEL"
			description="COM_CONTENT_FIELD_URLSPOSITION_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="0">COM_CONTENT_FIELD_OPTION_ABOVE</option>
			<option value="1">COM_CONTENT_FIELD_OPTION_BELOW</option>
		</field>
	</fieldset>

	<fieldset 
		name="editinglayout" 
		label="COM_CONTENT_EDITING_LAYOUT"
		description="COM_CONTENT_CONFIG_EDITOR_LAYOUT"
	>

		<field
			name="captcha"
			type="plugins"
			label="COM_CONTENT_FIELD_CAPTCHA_LABEL"
			description="COM_CONTENT_FIELD_CAPTCHA_DESC"
			folder="captcha"
			filter="cmd"
			useglobal="true"
			>
			<option value="0">JOPTION_DO_NOT_USE</option>
		</field>

		<field
			name="show_publishing_options"
			type="radio"
			label="COM_CONTENT_SHOW_PUBLISHING_OPTIONS_LABEL"
			description="COM_CONTENT_SHOW_PUBLISHING_OPTIONS_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_article_options"
			type="radio"
			label="COM_CONTENT_SHOW_ARTICLE_OPTIONS_LABEL"
			description="COM_CONTENT_SHOW_ARTICLE_OPTIONS_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="save_history"
			type="radio"
			label="JGLOBAL_SAVE_HISTORY_OPTIONS_LABEL"
			description="JGLOBAL_SAVE_HISTORY_OPTIONS_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="history_limit"
			type="number"
			label="JGLOBAL_HISTORY_LIMIT_OPTIONS_LABEL"
			description="JGLOBAL_HISTORY_LIMIT_OPTIONS_DESC"
			filter="integer"
			default="10"
			showon="save_history:1"
		/>

		<field
			name="show_urls_images_frontend"
			type="radio"
			label="COM_CONTENT_SHOW_IMAGES_URLS_FRONT_LABEL"
			description="COM_CONTENT_SHOW_IMAGES_URLS_FRONT_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="show_urls_images_backend"
			type="radio"
			label="COM_CONTENT_SHOW_IMAGES_URLS_BACK_LABEL"
			description="COM_CONTENT_SHOW_IMAGES_URLS_BACK_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="spacer3"
			type="spacer"
			hr="true"
			showon="show_urls_images_backend:1[OR]show_urls_images_frontend:1"
		/>

		<field
			name="targeta"
			type="list"
			label="COM_CONTENT_URL_FIELD_A_BROWSERNAV_LABEL"
			description="COM_CONTENT_URL_FIELD_BROWSERNAV_DESC"
			default="Parent"
			filter="int"
			showon="show_urls_images_backend:1[OR]show_urls_images_frontend:1"
			>
			<option value="0">JBROWSERTARGET_PARENT</option>
			<option value="1">JBROWSERTARGET_NEW</option>
			<option value="2">JBROWSERTARGET_POPUP</option>
			<option value="3">JBROWSERTARGET_MODAL</option>
		</field>

		<field
			name="targetb"
			type="list"
			label="COM_CONTENT_URL_FIELD_B_BROWSERNAV_LABEL"
			description="COM_CONTENT_URL_FIELD_BROWSERNAV_DESC"
			default="Parent"
			filter="int"
			showon="show_urls_images_backend:1[OR]show_urls_images_frontend:1"
			>
			<option value="0">JBROWSERTARGET_PARENT</option>
			<option value="1">JBROWSERTARGET_NEW</option>
			<option value="2">JBROWSERTARGET_POPUP</option>
			<option value="3">JBROWSERTARGET_MODAL</option>
		</field>

		<field
			name="targetc"
			type="list"
			label="COM_CONTENT_URL_FIELD_C_BROWSERNAV_LABEL"
			description="COM_CONTENT_URL_FIELD_BROWSERNAV_DESC"
			default="Parent"
			filter="int"
			showon="show_urls_images_backend:1[OR]show_urls_images_frontend:1"
			>
			<option value="0">JBROWSERTARGET_PARENT</option>
			<option value="1">JBROWSERTARGET_NEW</option>
			<option value="2">JBROWSERTARGET_POPUP</option>
			<option value="3">JBROWSERTARGET_MODAL</option>
		</field>

		<field
			name="spacer4"
			type="spacer"
			hr="true"
			showon="show_urls_images_backend:1[OR]show_urls_images_frontend:1"
		/>

		<field
			name="float_intro"
			type="list"
			label="COM_CONTENT_FLOAT_INTRO_LABEL"
			description="COM_CONTENT_FLOAT_DESC"
			showon="show_urls_images_backend:1[OR]show_urls_images_frontend:1"
			>
			<option value="right">COM_CONTENT_RIGHT</option>
			<option value="left">COM_CONTENT_LEFT</option>
			<option value="none">COM_CONTENT_NONE</option>
		</field>

		<field
			name="float_fulltext"
			type="list"
			label="COM_CONTENT_FLOAT_FULLTEXT_LABEL"
			description="COM_CONTENT_FLOAT_DESC"
			showon="show_urls_images_backend:1[OR]show_urls_images_frontend:1"
			>
			<option value="right">COM_CONTENT_RIGHT</option>
			<option value="left">COM_CONTENT_LEFT</option>
			<option value="none">COM_CONTENT_NONE</option>
		</field>

	</fieldset>

	<fieldset
		name="category"
		label="JCATEGORY"
		description="COM_CONTENT_CONFIG_CATEGORY_SETTINGS_DESC"
	>

		<field
			name="category_layout" 
			type="componentlayout"
			label="JGLOBAL_FIELD_LAYOUT_LABEL"
			description="JGLOBAL_FIELD_LAYOUT_DESC"
			menuitems="true"
			extension="com_content"
			view="category"
		/>

		<field
			name="show_category_heading_title_text"
			type="radio"
			label="JGLOBAL_SHOW_CATEGORY_HEADING_TITLE_TEXT_LABEL"
			description="JGLOBAL_SHOW_CATEGORY_HEADING_TITLE_TEXT_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field 
			name="show_category_title"
			type="radio"
			label="JGLOBAL_SHOW_CATEGORY_TITLE"
			description="JGLOBAL_SHOW_CATEGORY_TITLE_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field 
			name="show_description"
			type="radio"
			label="JGLOBAL_SHOW_CATEGORY_DESCRIPTION_LABEL"
			description="JGLOBAL_SHOW_CATEGORY_DESCRIPTION_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field 
			name="show_description_image"
			type="radio"
			label="JGLOBAL_SHOW_CATEGORY_IMAGE_LABEL"
			description="JGLOBAL_SHOW_CATEGORY_IMAGE_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field 
			name="maxLevel" 
			type="list"
			label="JGLOBAL_MAXIMUM_CATEGORY_LEVELS_LABEL"
			description="JGLOBAL_MAXIMUM_CATEGORY_LEVELS_DESC"
			default="-1"
			>
			<option value="0">JNONE</option>
			<option value="-1">JALL</option>
			<option value="1">J1</option>
			<option value="2">J2</option>
			<option value="3">J3</option>
			<option value="4">J4</option>
			<option value="5">J5</option>
		</field>

		<field 
			name="show_empty_categories"
			type="radio"
			label="JGLOBAL_SHOW_EMPTY_CATEGORIES_LABEL"
			description="COM_CONTENT_SHOW_EMPTY_CATEGORIES_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field 
			name="show_no_articles"
			type="radio"
			label="COM_CONTENT_NO_ARTICLES_LABEL"
			description="COM_CONTENT_NO_ARTICLES_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field 
			name="show_subcat_desc"
			type="radio"
			label="JGLOBAL_SHOW_SUBCATEGORIES_DESCRIPTION_LABEL"
			description="JGLOBAL_SHOW_SUBCATEGORIES_DESCRIPTION_DESC"
			default="1"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field 
			name="show_cat_num_articles"
			type="radio"
			label="COM_CONTENT_NUMBER_CATEGORY_ITEMS_LABEL"
			description="COM_CONTENT_NUMBER_CATEGORY_ITEMS_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field 
			name="show_cat_tags" 
			type="radio"
			label="COM_CONTENT_FIELD_SHOW_CAT_TAGS_LABEL"
			description="COM_CONTENT_FIELD_SHOW_CAT_TAGS_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

	</fieldset>

	<fieldset 
		name="categories"
		label="JCATEGORIES"
		description="COM_CONTENT_CONFIG_CATEGORIES_SETTINGS_DESC"
	>
		<field 
			name="show_base_description"
			type="radio"
			label="JGLOBAL_FIELD_SHOW_BASE_DESCRIPTION_LABEL"
			description="JGLOBAL_FIELD_SHOW_BASE_DESCRIPTION_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field 
			name="maxLevelcat" 
			type="list"
			label="JGLOBAL_MAXIMUM_CATEGORY_LEVELS_LABEL"
			description="JGLOBAL_MAXIMUM_CATEGORY_LEVELS_DESC"
			default="-1"
			>
			<option value="0">JNONE</option>
			<option value="-1">JALL</option>
			<option value="1">J1</option>
			<option value="2">J2</option>
			<option value="3">J3</option>
			<option value="4">J4</option>
			<option value="5">J5</option>
		</field>

		<field 
			name="show_empty_categories_cat"
			type="radio"
			label="JGLOBAL_SHOW_EMPTY_CATEGORIES_LABEL"
			description="COM_CONTENT_SHOW_EMPTY_CATEGORIES_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			showon="maxLevelcat:-1,1,2,3,4,5"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field 
			name="show_subcat_desc_cat"
			type="radio"
			label="JGLOBAL_SHOW_SUBCATEGORIES_DESCRIPTION_LABEL"
			description="JGLOBAL_SHOW_SUBCATEGORIES_DESCRIPTION_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			showon="maxLevelcat:-1,1,2,3,4,5"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field 
			name="show_cat_num_articles_cat"
			type="radio"
			label="COM_CONTENT_NUMBER_CATEGORY_ITEMS_LABEL"
			description="COM_CONTENT_NUMBER_CATEGORY_ITEMS_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

	</fieldset>

	<fieldset 
		name="blog_default_parameters"
		label="COM_CONTENT_CONFIG_BLOG_SETTINGS_LABEL"
		description="COM_CONTENT_CONFIG_BLOG_SETTINGS_DESC"
	>

		<field 
			name="num_leading_articles"
			type="number"
			label="JGLOBAL_NUM_LEADING_ARTICLES_LABEL"
			description="JGLOBAL_NUM_LEADING_ARTICLES_DESC"
			default="1"			
		/>

		<field 
			name="num_intro_articles"
			type="number"
			label="JGLOBAL_NUM_INTRO_ARTICLES_LABEL"
			description="JGLOBAL_NUM_INTRO_ARTICLES_DESC"
			default="4"
		/>

		<field 
			name="num_columns"
			type="number"
			label="JGLOBAL_NUM_COLUMNS_LABEL"
			description="JGLOBAL_NUM_COLUMNS_DESC"
			default="2"
		/>

		<field 
			name="num_links"
			type="number"
			label="JGLOBAL_NUM_LINKS_LABEL"
			description="JGLOBAL_NUM_LINKS_DESC"
			default="4"
		/>

		<field 
			name="multi_column_order"
			type="list"
			label="JGLOBAL_MULTI_COLUMN_ORDER_LABEL"
			description="JGLOBAL_MULTI_COLUMN_ORDER_DESC"
			default="0"
			showon="num_columns!:,0,1"
			>
			<option value="0">JGLOBAL_DOWN</option>
			<option value="1">JGLOBAL_ACROSS</option>
		</field>

		<field 
			name="spacer1"
			type="spacer"
			hr="true"
		/>

		<field 
			name="show_subcategory_content" 
			type="list"
			label="JGLOBAL_SHOW_SUBCATEGORY_CONTENT_LABEL"
			description="JGLOBAL_SHOW_SUBCATEGORY_CONTENT_DESC"
			default="0"
			>
			<option value="0">JNONE</option>
			<option value="-1">JALL</option>
			<option value="1">J1</option>
			<option value="2">J2</option>
			<option value="3">J3</option>
			<option value="4">J4</option>
			<option value="5">J5</option>
		</field>
	</fieldset>

	<fieldset 
		name="list_default_parameters"
		label="JGLOBAL_LIST_LAYOUT_OPTIONS"
		description="COM_CONTENT_CONFIG_LIST_SETTINGS_DESC"
		addfieldpath="/administrator/components/com_content/models/fields"
	>

		<field 
			name="show_pagination_limit"
			type="radio"
			label="JGLOBAL_DISPLAY_SELECT_LABEL"
			description="JGLOBAL_DISPLAY_SELECT_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field 
			name="filter_field"
			type="list"
			label="JGLOBAL_FILTER_FIELD_LABEL"
			description="JGLOBAL_FILTER_FIELD_DESC"
			default="hide"
			>
			<option value="hide">JHIDE</option>
			<option value="title">JGLOBAL_TITLE</option>
			<option value="author">JAUTHOR</option>
			<option value="hits">JGLOBAL_HITS</option>
			<option value="tag">JTAG</option>
			<option value="month">JMONTH_PUBLISHED</option>
		</field>

		<field 
			name="show_headings"
			type="radio"
			label="JGLOBAL_SHOW_HEADINGS_LABEL"
			description="JGLOBAL_SHOW_HEADINGS_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field 
			name="list_show_date"
			type="list"
			label="JGLOBAL_SHOW_DATE_LABEL"
			description="JGLOBAL_SHOW_DATE_DESC"
			default="0"
			>
			<option value="0">JHIDE</option>
			<option value="created">JGLOBAL_CREATED</option>
			<option value="modified">JGLOBAL_MODIFIED</option>
			<option value="published">JPUBLISHED</option>
		</field>

		<field 
			name="date_format"
			type="text"
			label="JGLOBAL_DATE_FORMAT_LABEL"
			description="JGLOBAL_DATE_FORMAT_DESC"
			size="15"
			showon="list_show_date:created,modified,published"
		/>

		<field 
			name="list_show_hits"
			type="radio"
			label="JGLOBAL_LIST_HITS_LABEL"
			description="JGLOBAL_LIST_HITS_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field 
			name="list_show_author"
			type="radio"
			label="JGLOBAL_LIST_AUTHOR_LABEL"
			description="JGLOBAL_LIST_AUTHOR_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field 
			name="list_show_votes"
			type="voteradio"
			label="JGLOBAL_LIST_VOTES_LABEL"
			description="JGLOBAL_LIST_VOTES_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field 
			name="list_show_ratings"
			type="voteradio"
			label="JGLOBAL_LIST_RATINGS_LABEL"
			description="JGLOBAL_LIST_RATINGS_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

	</fieldset>

	<fieldset
		name="shared"
		label="COM_CONTENT_SHARED_LABEL"
		description="COM_CONTENT_SHARED_DESC"
	>
	
		<field 
			name="orderby_pri"
			type="list"
			label="JGLOBAL_CATEGORY_ORDER_LABEL"
			description="JGLOBAL_CATEGORY_ORDER_DESC"
			default="none"
			>
			<option value="none">JGLOBAL_NO_ORDER</option>
			<option value="alpha">JGLOBAL_TITLE_ALPHABETICAL</option>
			<option value="ralpha">JGLOBAL_TITLE_REVERSE_ALPHABETICAL</option>
			<option value="order">JGLOBAL_CATEGORY_MANAGER_ORDER</option>
		</field>

		<field 
			name="orderby_sec"
			type="list"
			label="JGLOBAL_ARTICLE_ORDER_LABEL"
			description="JGLOBAL_ARTICLE_ORDER_DESC"
			default="rdate"
			>
			<option value="rdate">JGLOBAL_MOST_RECENT_FIRST</option>
			<option value="date">JGLOBAL_OLDEST_FIRST</option>
			<option value="alpha">JGLOBAL_TITLE_ALPHABETICAL</option>
			<option value="ralpha">JGLOBAL_TITLE_REVERSE_ALPHABETICAL</option>
			<option value="author">JGLOBAL_AUTHOR_ALPHABETICAL</option>
			<option value="rauthor">JGLOBAL_AUTHOR_REVERSE_ALPHABETICAL</option>
			<option value="hits">JGLOBAL_MOST_HITS</option>
			<option value="rhits">JGLOBAL_LEAST_HITS</option>
			<option value="order">JGLOBAL_ARTICLE_MANAGER_ORDER</option>
			<option value="rorder">JGLOBAL_ARTICLE_MANAGER_REVERSE_ORDER</option>
			<option value="vote" requires="vote">JGLOBAL_VOTES_DESC</option>
			<option value="rvote" requires="vote">JGLOBAL_VOTES_ASC</option>
			<option value="rank" requires="vote">JGLOBAL_RATINGS_DESC</option>
			<option value="rrank" requires="vote">JGLOBAL_RATINGS_ASC</option>
		</field>

		<field 
			name="order_date" 
			type="list"
			label="JGLOBAL_ORDERING_DATE_LABEL"
			description="JGLOBAL_ORDERING_DATE_DESC"
			showon="orderby_sec:rdate,date"
			default="published"
			>
			<option value="created">JGLOBAL_CREATED</option>
			<option value="modified">JGLOBAL_MODIFIED</option>
			<option value="published">JPUBLISHED</option>
		</field>

		<field 
			name="show_pagination"
			type="list"
			label="JGLOBAL_PAGINATION_LABEL"
			description="JGLOBAL_PAGINATION_DESC"
			default="2"
			>
			<option value="0">JHIDE</option>
			<option value="1">JSHOW</option>
			<option value="2">JGLOBAL_AUTO</option>
		</field>

		<field 
			name="show_pagination_results"
			type="radio"
			label="JGLOBAL_PAGINATION_RESULTS_LABEL"
			description="JGLOBAL_PAGINATION_RESULTS_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			showon="show_pagination:1,2"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field 
			name="show_featured" 
			type="list" 
			label="JGLOBAL_SHOW_FEATURED_ARTICLES_LABEL"
			description="JGLOBAL_SHOW_FEATURED_ARTICLES_DESC"
			default="show"
			>
			<option value="show">JSHOW</option>
			<option value="hide">JHIDE</option>
			<option value="only">JONLY</option>
		</field>

	</fieldset>

	<fieldset 
		name="integration"
		label="JGLOBAL_INTEGRATION_LABEL"
		description="COM_CONTENT_CONFIG_INTEGRATION_SETTINGS_DESC"
	>

		<field
			name="integration_newsfeeds"
			type="note"
			label="JGLOBAL_FEED_TITLE"
		/>

		<field
			name="show_feed_link"
			type="radio"
			label="JGLOBAL_SHOW_FEED_LINK_LABEL"
			description="JGLOBAL_SHOW_FEED_LINK_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="feed_summary"
			type="list"
			label="JGLOBAL_FEED_SUMMARY_LABEL"
			description="JGLOBAL_FEED_SUMMARY_DESC"
			default="0"
			showon="show_feed_link:1"
			>
			<option value="0">JGLOBAL_INTRO_TEXT</option>
			<option value="1">JGLOBAL_FULL_TEXT</option>
		</field>

		<field
			name="feed_show_readmore"
			type="radio"
			label="JGLOBAL_FEED_SHOW_READMORE_LABEL"
			description="JGLOBAL_FEED_SHOW_READMORE_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			showon="show_feed_link:1[AND]feed_summary:0"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="integration_sef"
			type="note"
			label="JGLOBAL_SEF_TITLE"
		/>

		<field
			name="sef_advanced"
			type="radio"
			class="btn-group btn-group-yesno btn-group-reversed"
			default="0"
			label="JGLOBAL_SEF_ADVANCED_LABEL"
			description="JGLOBAL_SEF_ADVANCED_DESC"
			filter="integer"
			>
			<option value="0">JGLOBAL_SEF_ADVANCED_LEGACY</option>
			<option value="1">JGLOBAL_SEF_ADVANCED_MODERN</option>
		</field>

		<field
			name="sef_ids"
			type="radio"
			class="btn-group btn-group-yesno"
			default="0"
			label="JGLOBAL_SEF_NOIDS_LABEL"
			description="JGLOBAL_SEF_NOIDS_DESC"
			showon="sef_advanced:1"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="integration_customfields"
			type="note"
			label="JGLOBAL_FIELDS_TITLE"
		/>

		<field
			name="custom_fields_enable"
			type="radio"
			label="JGLOBAL_CUSTOM_FIELDS_ENABLE_LABEL"
			description="JGLOBAL_CUSTOM_FIELDS_ENABLE_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

	</fieldset>

	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
	>

		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			validate="rules"
			filter="rules"
			component="com_content"
			section="component"
		/>
	</fieldset>
</config>
components/com_content/content.xml000060400000002560152453623450013445 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_content</name>
	<author>Joomla! Project</author>
	<creationDate>April 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_CONTENT_XML_DESCRIPTION</description>
	<files folder="site">
		<filename>content.php</filename>
		<filename>controller.php</filename>
		<filename>router.php</filename>
		<folder>helpers</folder>
		<folder>models</folder>
	</files>
	<languages folder="site">
		<language tag="en-GB">language/en-GB.com_content.ini</language>
	</languages>
	<administration>
		<files folder="admin">
			<filename>access.xml</filename>
			<filename>config.xml</filename>
			<filename>content.php</filename>
			<filename>controller.php</filename>
			<folder>controllers</folder>
			<folder>elements</folder>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>tables</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_content.ini</language>
			<language tag="en-GB">language/en-GB.com_content.sys.ini</language>
		</languages>
	</administration>
</extension>


components/com_content/content.php000060400000001235152453623450013432 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
JHtml::_('behavior.tabstate');

if (!JFactory::getUser()->authorise('core.manage', 'com_content'))
{
	throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
}

JLoader::register('ContentHelper', __DIR__ . '/helpers/content.php');

$controller = JControllerLegacy::getInstance('Content');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
components/com_content/views/featured/view.html.php000060400000011031152453623450016624 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of featured articles.
 *
 * @since  1.6
 */
class ContentViewFeatured extends JViewLegacy
{
	/**
	 * The item authors
	 *
	 * @var  stdClass
	 *
	 * @deprecated  4.0  To be removed with Hathor
	 */
	protected $authors;

	/**
	 * An array of items
	 *
	 * @var  array
	 */
	protected $items;

	/**
	 * The pagination object
	 *
	 * @var  JPagination
	 */
	protected $pagination;

	/**
	 * The model state
	 *
	 * @var  object
	 */
	protected $state;

	/**
	 * Form object for search filters
	 *
	 * @var  JForm
	 */
	public $filterForm;

	/**
	 * The active search filters
	 *
	 * @var  array
	 */
	public $activeFilters;

	/**
	 * The sidebar markup
	 *
	 * @var  string
	 */
	protected $sidebar;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		ContentHelper::addSubmenu('featured');

		$this->items         = $this->get('Items');
		$this->pagination    = $this->get('Pagination');
		$this->state         = $this->get('State');
		$this->authors       = $this->get('Authors');
		$this->filterForm    = $this->get('FilterForm');
		$this->activeFilters = $this->get('ActiveFilters');
		$this->vote          = JPluginHelper::isEnabled('content', 'vote');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Levels filter - Used in Hathor.
		// @deprecated  4.0 To be removed with 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')),
		);

		$this->addToolbar();
		$this->sidebar = JHtmlSidebar::render();

		return parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		$state = $this->get('State');
		$canDo = JHelperContent::getActions('com_content', 'category', $this->state->get('filter.category_id'));

		JToolbarHelper::title(JText::_('COM_CONTENT_FEATURED_TITLE'), 'star featured');

		if ($canDo->get('core.create'))
		{
			JToolbarHelper::addNew('article.add');
		}

		if ($canDo->get('core.edit'))
		{
			JToolbarHelper::editList('article.edit');
		}

		if ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::publish('articles.publish', 'JTOOLBAR_PUBLISH', true);
			JToolbarHelper::unpublish('articles.unpublish', 'JTOOLBAR_UNPUBLISH', true);
			JToolbarHelper::custom('articles.unfeatured', 'unfeatured.png', 'featured_f2.png', 'JUNFEATURE', true);
			JToolbarHelper::archiveList('articles.archive');
			JToolbarHelper::checkin('articles.checkin');
		}

		if ($state->get('filter.published') == -2 && $canDo->get('core.delete'))
		{
			JToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'articles.delete', 'JTOOLBAR_EMPTY_TRASH');
		}
		elseif ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::trash('articles.trash');
		}

		if ($canDo->get('core.admin') || $canDo->get('core.options'))
		{
			JToolbarHelper::preferences('com_content');
		}

		JToolbarHelper::help('JHELP_CONTENT_FEATURED_ARTICLES');
	}

	/**
	 * 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(
			'fp.ordering'    => JText::_('JGRID_HEADING_ORDERING'),
			'a.state'        => JText::_('JSTATUS'),
			'a.title'        => JText::_('JGLOBAL_TITLE'),
			'category_title' => JText::_('JCATEGORY'),
			'access_level'   => JText::_('JGRID_HEADING_ACCESS'),
			'a.created_by'   => JText::_('JAUTHOR'),
			'language'       => JText::_('JGRID_HEADING_LANGUAGE'),
			'a.created'      => JText::_('JDATE'),
			'a.id'           => JText::_('JGRID_HEADING_ID'),
		);
	}
}
components/com_content/views/featured/tmpl/default.php000060400000032275152453623450017324 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', '.multipleAccessLevels', null, array('placeholder_text_multiple' => JText::_('JOPTION_SELECT_ACCESS')));
JHtml::_('formbehavior.chosen', '.multipleAuthors', null, array('placeholder_text_multiple' => JText::_('JOPTION_SELECT_AUTHOR')));
JHtml::_('formbehavior.chosen', '.multipleCategories', null, array('placeholder_text_multiple' => JText::_('JOPTION_SELECT_CATEGORY')));
JHtml::_('formbehavior.chosen', '.multipleTags', null, array('placeholder_text_multiple' => JText::_('JOPTION_SELECT_TAG')));
JHtml::_('formbehavior.chosen', 'select');

$user      = JFactory::getUser();
$userId    = $user->get('id');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$saveOrder = $listOrder == 'fp.ordering';
$columns   = 10;

if (strpos($listOrder, 'publish_up') !== false)
{
	$orderingColumn = 'publish_up';
}
elseif (strpos($listOrder, 'publish_down') !== false)
{
	$orderingColumn = 'publish_down';
}
else
{
	$orderingColumn = 'created';
}

if ($saveOrder)
{
	$saveOrderingUrl = 'index.php?option=com_content&task=featured.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'articleList', 'adminForm', strtolower($listDirn), $saveOrderingUrl);
}
?>

<form action="<?php echo JRoute::_('index.php?option=com_content&view=featured'); ?>" method="post" name="adminForm" id="adminForm">
	<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
		<?php else : ?>
		<div id="j-main-container">
			<?php endif; ?>
			<?php
			// Search tools bar
			echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this));
			?>
			<?php if (empty($this->items)) : ?>
				<div class="alert alert-no-items">
					<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
				</div>
			<?php else : ?>
				<table class="table table-striped" id="articleList">
					<thead>
					<tr>
						<th width="1%" class="nowrap center hidden-phone">
							<?php echo JHtml::_('searchtools.sort', '', 'fp.ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING', 'icon-menu-2'); ?>
						</th>
						<th width="1%" class="center">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th width="1%" style="min-width:55px" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
						</th>
						<th>
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ACCESS', 'a.access', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JAUTHOR', 'a.created_by', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'language', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_CONTENT_HEADING_DATE_' . strtoupper($orderingColumn), 'a.' . $orderingColumn, $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_HITS', 'a.hits', $listDirn, $listOrder); ?>
						</th>
						<?php if ($this->vote) : ?>
							<?php $columns++; ?>
							<th width="1%" class="nowrap hidden-phone">
								<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_VOTES', 'rating_count', $listDirn, $listOrder); ?>
							</th>
							<?php $columns++; ?>
							<th width="1%" class="nowrap hidden-phone">
								<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_RATINGS', 'rating', $listDirn, $listOrder); ?>
							</th>
						<?php endif; ?>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
					</thead>
					<tfoot>
					<tr>
						<td colspan="<?php echo $columns; ?>">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
					</tfoot>
					<tbody>
					<?php $count = count($this->items); ?>
					<?php foreach ($this->items as $i => $item) :
						$item->max_ordering = 0;
						$ordering         = ($listOrder == 'fp.ordering');
						$assetId          = 'com_content.article.' . $item->id;
						$canCreate        = $user->authorise('core.create', 'com_content.category.' . $item->catid);
						$canEdit          = $user->authorise('core.edit', 'com_content.article.' . $item->id);
						$canCheckin       = $user->authorise('core.manage', 'com_checkin') || $item->checked_out == $userId || $item->checked_out == 0;
						$canChange        = $user->authorise('core.edit.state', 'com_content.article.' . $item->id) && $canCheckin;
						$canEditCat       = $user->authorise('core.edit',       'com_content.category.' . $item->catid);
						$canEditOwnCat    = $user->authorise('core.edit.own',   'com_content.category.' . $item->catid) && $item->category_uid == $userId;
						$canEditParCat    = $user->authorise('core.edit',       'com_content.category.' . $item->parent_category_id);
						$canEditOwnParCat = $user->authorise('core.edit.own',   'com_content.category.' . $item->parent_category_id) && $item->parent_category_uid == $userId;
						?>
						<tr class="row<?php echo $i % 2; ?>">
							<td class="order nowrap center hidden-phone">
								<?php
								$iconClass = '';

								if (!$canChange)
								{
									$iconClass = ' inactive';
								}
								elseif (!$saveOrder)
								{
									$iconClass = ' inactive tip-top hasTooltip" title="' . JHtml::_('tooltipText', 'JORDERINGDISABLED');
								}
								?>
								<span class="sortable-handler<?php echo $iconClass ?>">
								<span class="icon-menu" aria-hidden="true"></span>
							</span>
								<?php if ($canChange && $saveOrder) : ?>
									<input type="text" style="display:none" name="order[]" size="5" value="<?php echo $item->ordering; ?>" class="width-20 text-area-order" />
								<?php endif; ?>
							</td>
							<td class="center">
								<?php echo JHtml::_('grid.id', $i, $item->id); ?>
							</td>
							<td class="center">
								<div class="btn-group">
									<?php echo JHtml::_('jgrid.published', $item->state, $i, 'articles.', $canChange, 'cb', $item->publish_up, $item->publish_down); ?>
									<?php echo JHtml::_('contentadministrator.featured', $item->featured, $i, $canChange); ?>
									<?php // Create dropdown items and render the dropdown list.
									if ($canChange)
									{
										JHtml::_('actionsdropdown.' . ((int) $item->state === 2 ? 'un' : '') . 'archive', 'cb' . $i, 'articles');
										JHtml::_('actionsdropdown.' . ((int) $item->state === -2 ? 'un' : '') . 'trash', 'cb' . $i, 'articles');
										echo JHtml::_('actionsdropdown.render', $this->escape($item->title));
									}
									?>
								</div>
							</td>
							<td class="has-context">
								<div class="pull-left break-word">
									<?php if ($item->checked_out) : ?>
										<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'articles.', $canCheckin); ?>
									<?php endif; ?>
									<?php if ($canEdit) : ?>
										<a class="hasTooltip" href="<?php echo JRoute::_('index.php?option=com_content&task=article.edit&return=featured&id=' . $item->id); ?>" title="<?php echo JText::_('JACTION_EDIT'); ?>">
											<?php echo $this->escape($item->title); ?></a>
									<?php else : ?>
										<span title="<?php echo JText::sprintf('JFIELD_ALIAS_LABEL', $this->escape($item->alias)); ?>"><?php echo $this->escape($item->title); ?></span>
									<?php endif; ?>
									<span class="small break-word">
									<?php if (empty($item->note)) : ?>
										<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias)); ?>
									<?php else : ?>
										<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS_NOTE', $this->escape($item->alias), $this->escape($item->note)); ?>
									<?php endif; ?>
									</span>
									<div class="small">
										<?php
										$ParentCatUrl = JRoute::_('index.php?option=com_categories&task=category.edit&id=' . $item->parent_category_id . '&extension=com_content');
										$CurrentCatUrl = JRoute::_('index.php?option=com_categories&task=category.edit&id=' . $item->catid . '&extension=com_content');
										$EditCatTxt = JText::_('COM_CONTENT_EDIT_CATEGORY');

										echo JText::_('JCATEGORY') . ': ';

										if ($item->category_level != '1') :
											if ($item->parent_category_level != '1') :
												echo ' &#187; ';
											endif;
										endif;

										if (JFactory::getLanguage()->isRtl())
										{
											if ($canEditCat || $canEditOwnCat) :
												echo '<a class="hasTooltip" href="' . $CurrentCatUrl . '" title="' . $EditCatTxt . '">';
											endif;
											echo $this->escape($item->category_title);
											if ($canEditCat || $canEditOwnCat) :
												echo '</a>';
											endif;

											if ($item->category_level != '1') :
												echo ' &#171; ';
												if ($canEditParCat || $canEditOwnParCat) :
													echo '<a class="hasTooltip" href="' . $ParentCatUrl . '" title="' . $EditCatTxt . '">';
												endif;
												echo $this->escape($item->parent_category_title);
												if ($canEditParCat || $canEditOwnParCat) :
													echo '</a>';
												endif;
											endif;
										}
										else
										{
											if ($item->category_level != '1') :
												if ($canEditParCat || $canEditOwnParCat) :
													echo '<a class="hasTooltip" href="' . $ParentCatUrl . '" title="' . $EditCatTxt . '">';
												endif;
												echo $this->escape($item->parent_category_title);
												if ($canEditParCat || $canEditOwnParCat) :
													echo '</a>';
												endif;
												echo ' &#187; ';
											endif;
											if ($canEditCat || $canEditOwnCat) :
												echo '<a class="hasTooltip" href="' . $CurrentCatUrl . '" title="' . $EditCatTxt . '">';
											endif;
											echo $this->escape($item->category_title);
											if ($canEditCat || $canEditOwnCat) :
												echo '</a>';
											endif;
										}
										?>
									</div>
								</div>
							</td>
							<td class="small hidden-phone">
								<?php echo $this->escape($item->access_level); ?>
							</td>
							<td class="small hidden-phone">
								<?php if ((int) $item->created_by != 0) : ?>
									<?php if ($item->created_by_alias) : ?>
										<a class="hasTooltip" href="<?php echo JRoute::_('index.php?option=com_users&task=user.edit&id=' . (int) $item->created_by); ?>" title="<?php echo JText::_('JAUTHOR'); ?>">
										<?php echo $this->escape($item->author_name); ?></a>
										<div class="smallsub"><?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->created_by_alias)); ?></div>
									<?php else : ?>
										<a class="hasTooltip" href="<?php echo JRoute::_('index.php?option=com_users&task=user.edit&id=' . (int) $item->created_by); ?>" title="<?php echo JText::_('JAUTHOR'); ?>">
										<?php echo $this->escape($item->author_name); ?></a>
									<?php endif; ?>
								<?php else : ?>
									<?php if ($item->created_by_alias) : ?>
										<?php echo JText::_('JNONE'); ?>
										<div class="smallsub"><?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->created_by_alias)); ?></div>
									<?php else : ?>
										<?php echo JText::_('JNONE'); ?>
									<?php endif; ?>
								<?php endif; ?>
							</td>
							<td class="small hidden-phone">
								<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
							</td>
							<td class="nowrap small hidden-phone">
								<?php
								$date = $item->{$orderingColumn};
								echo $date > 0 ? JHtml::_('date', $date, JText::_('DATE_FORMAT_LC4')) : '-';
								?>
							</td>
							<td class="center hidden-phone">
								<span class="badge badge-info">
								<?php echo (int) $item->hits; ?>
								</span>
							</td>
							<?php if ($this->vote) : ?>
								<td class="hidden-phone">
									<span class="badge badge-success" >
									<?php echo (int) $item->rating_count; ?>
									</span>
								</td>
								<td class="hidden-phone">
									<span class="badge badge-warning" >
									<?php echo (int) $item->rating; ?>
									</span>
								</td>
							<?php endif; ?>
							<td class="center hidden-phone">
								<?php echo (int) $item->id; ?>
							</td>
						</tr>
					<?php endforeach; ?>
					</tbody>
				</table>
			<?php endif; ?>

			<input type="hidden" name="task" value="" />
			<input type="hidden" name="featured" value="1" />
			<input type="hidden" name="boxchecked" value="0" />
			<?php echo JHtml::_('form.token'); ?>
		</div>
</form>
components/com_content/views/featured/tmpl/default.xml000060400000000322152453623450017321 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_CONTENT_FEATURED_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_CONTENT_FEATURED_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_content/views/article/view.html.php000060400000010651152453623450016457 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View to edit an article.
 *
 * @since  1.6
 */
class ContentViewArticle extends JViewLegacy
{
	/**
	 * The JForm object
	 *
	 * @var  JForm
	 */
	protected $form;

	/**
	 * The active item
	 *
	 * @var  object
	 */
	protected $item;

	/**
	 * The model state
	 *
	 * @var  object
	 */
	protected $state;

	/**
	 * The actions the user is authorised to perform
	 *
	 * @var  JObject
	 */
	protected $canDo;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		if ($this->getLayout() == 'pagebreak')
		{
			return parent::display($tpl);
		}

		$this->form  = $this->get('Form');
		$this->item  = $this->get('Item');
		$this->state = $this->get('State');
		$this->canDo = JHelperContent::getActions('com_content', 'article', $this->item->id);

		// 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);

		// Built the actions for new and existing records.
		$canDo = $this->canDo;

		JToolbarHelper::title(
			JText::_('COM_CONTENT_PAGE_' . ($checkedOut ? 'VIEW_ARTICLE' : ($isNew ? 'ADD_ARTICLE' : 'EDIT_ARTICLE'))),
			'pencil-2 article-add'
		);

		// For new records, check the create permission.
		if ($isNew && (count($user->getAuthorisedCategories('com_content', 'core.create')) > 0))
		{
			JToolbarHelper::apply('article.apply');
			JToolbarHelper::save('article.save');
			JToolbarHelper::save2new('article.save2new');
			JToolbarHelper::cancel('article.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('article.apply');
				JToolbarHelper::save('article.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('article.save2new');
				}
			}

			// If checked out, we can still save
			if ($canDo->get('core.create'))
			{
				JToolbarHelper::save2copy('article.save2copy');
			}

			if (JComponentHelper::isEnabled('com_contenthistory') && $this->state->params->get('save_history', 0) && $itemEditable)
			{
				JToolbarHelper::versions('com_content.article', $this->item->id);
			}

			if (JLanguageAssociations::isEnabled() && JComponentHelper::isEnabled('com_associations'))
			{
				JToolbarHelper::custom('article.editAssociations', 'contract', 'contract', 'JTOOLBAR_ASSOCIATIONS', false, false);
			}

			JToolbarHelper::cancel('article.cancel', 'JTOOLBAR_CLOSE');
		}

		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_CONTENT_ARTICLE_MANAGER_EDIT');
	}
}
components/com_content/views/article/tmpl/edit.xml000060400000000530152453623450016447 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_CONTENT_ARTICLE_VIEW_EDIT_TITLE">
		<message>
			<![CDATA[COM_CONTENT_ARTICLE_VIEW_EDIT_DESC]]>
		</message>
	</layout>
	<fieldset name="request">
		<fields name="request">
			<field
				name="id"
				type="hidden"
				default="0"
			/>
		</fields>
	</fieldset>
</metadata>
components/com_content/views/article/tmpl/edit.php000060400000013063152453623450016443 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');
JHtml::_('formbehavior.chosen', '#jform_catid', null, array('disable_search_threshold' => 0 ));
JHtml::_('formbehavior.chosen', '#jform_tags', null, array('placeholder_text_multiple' => JText::_('JGLOBAL_TYPE_OR_SELECT_SOME_TAGS')));
JHtml::_('formbehavior.chosen', 'select');

$this->configFieldsets  = array('editorConfig');
$this->hiddenFieldsets  = array('basic-limited');
$this->ignore_fieldsets = array('jmetadata', 'item_associations');

// Create shortcut to parameters.
$params = clone $this->state->get('params');
$params->merge(new Registry($this->item->attribs));

$app = JFactory::getApplication();
$input = $app->input;

$assoc = JLanguageAssociations::isEnabled();

JFactory::getDocument()->addScriptDeclaration('
	Joomla.submitbutton = function(task)
	{
		if (task == "article.cancel" || document.formvalidator.isValid(document.getElementById("item-form")))
		{
			jQuery("#permissions-sliders select").attr("disabled", "disabled");
			' . $this->form->getField('articletext')->save() . '
			Joomla.submitform(task, document.getElementById("item-form"));

			// @deprecated 4.0  The following js is not needed since 3.7.0.
			if (task !== "article.apply")
			{
				window.parent.jQuery("#articleEdit' . (int) $this->item->id . 'Modal").modal("hide");
			}
		}
	};
');

// In case of modal
$isModal = $input->get('layout') == 'modal' ? true : false;
$layout  = $isModal ? 'modal' : 'edit';
$tmpl    = $isModal || $input->get('tmpl', '', 'cmd') === 'component' ? '&tmpl=component' : '';
?>

<form action="<?php echo JRoute::_('index.php?option=com_content&layout=' . $layout . $tmpl . '&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="item-form" class="form-validate">

	<?php echo JLayoutHelper::render('joomla.edit.title_alias', $this); ?>

	<div class="form-horizontal">
		<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'general')); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'general', JText::_('COM_CONTENT_ARTICLE_CONTENT')); ?>
		<div class="row-fluid">
			<div class="span9">
				<fieldset class="adminform">
					<?php echo $this->form->getInput('articletext'); ?>
				</fieldset>
			</div>
			<div class="span3">
				<?php echo JLayoutHelper::render('joomla.edit.global', $this); ?>
			</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php // Do not show the images and links options if the edit form is configured not to. ?>
		<?php if ($params->get('show_urls_images_backend') == 1) : ?>
			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'images', JText::_('COM_CONTENT_FIELDSET_URLS_AND_IMAGES')); ?>
			<div class="row-fluid form-horizontal-desktop">
				<div class="span6">
					<?php echo $this->form->renderField('images'); ?>
					<?php foreach ($this->form->getGroup('images') as $field) : ?>
						<?php echo $field->renderField(); ?>
					<?php endforeach; ?>
				</div>
				<div class="span6">
					<?php foreach ($this->form->getGroup('urls') as $field) : ?>
						<?php echo $field->renderField(); ?>
					<?php endforeach; ?>
				</div>
			</div>
			<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php endif; ?>

		<?php $this->show_options = $params->get('show_article_options', 1); ?>
		<?php echo JLayoutHelper::render('joomla.edit.params', $this); ?>

		<?php // Do not show the publishing options if the edit form is configured not to. ?>
		<?php if ($params->get('show_publishing_options', 1) == 1) : ?>
			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'publishing', JText::_('COM_CONTENT_FIELDSET_PUBLISHING')); ?>
			<div class="row-fluid form-horizontal-desktop">
				<div class="span6">
					<?php echo JLayoutHelper::render('joomla.edit.publishingdata', $this); ?>
				</div>
				<div class="span6">
					<?php echo JLayoutHelper::render('joomla.edit.metadata', $this); ?>
				</div>
			</div>
			<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php endif; ?>


		<?php if ( ! $isModal && $assoc) : ?>
			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'associations', JText::_('JGLOBAL_FIELDSET_ASSOCIATIONS')); ?>
			<?php echo $this->loadTemplate('associations'); ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php elseif ($isModal && $assoc) : ?>
			<div class="hidden"><?php echo $this->loadTemplate('associations'); ?></div>
		<?php endif; ?>

		<?php if ($this->canDo->get('core.admin')) : ?>
			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'editor', JText::_('COM_CONTENT_SLIDER_EDITOR_CONFIG')); ?>
			<?php echo $this->form->renderFieldset('editorConfig'); ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php endif; ?>

		<?php if ($this->canDo->get('core.admin')) : ?>
			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'permissions', JText::_('COM_CONTENT_FIELDSET_RULES')); ?>
				<?php echo $this->form->getInput('rules'); ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php endif; ?>

		<?php echo JHtml::_('bootstrap.endTabSet'); ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="return" value="<?php echo $input->get('return', null, 'BASE64'); ?>" />
		<input type="hidden" name="forcedLanguage" value="<?php echo $input->get('forcedLanguage', '', 'cmd'); ?>" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_content/views/article/tmpl/modal.php000060400000002537152453623450016616 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip', '.hasTooltip', array('placement' => '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', 'jEditArticle_' . (int) $this->item->id);

// Function to update input title when changed
JFactory::getDocument()->addScriptDeclaration('
	function jEditArticleModal() {
		if (window.parent && document.formvalidator.isValid(document.getElementById("item-form"))) {
			return window.parent.' . $this->escape($function) . '(document.getElementById("jform_title").value);
		}
	}
');
?>
<button id="applyBtn" type="button" class="hidden" onclick="Joomla.submitbutton('article.apply'); jEditArticleModal();"></button>
<button id="saveBtn" type="button" class="hidden" onclick="Joomla.submitbutton('article.save'); jEditArticleModal();"></button>
<button id="closeBtn" type="button" class="hidden" onclick="Joomla.submitbutton('article.cancel');"></button>

<div class="container-popup">
	<?php $this->setLayout('edit'); ?>
	<?php echo $this->loadTemplate(); ?>
</div>
components/com_content/views/article/tmpl/modal_metadata.php000060400000000504152453623450020446 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

echo JLayoutHelper::render('joomla.edit.metadata', $this);
components/com_content/views/article/tmpl/modal_associations.php000060400000000510152453623450021362 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

echo JLayoutHelper::render('joomla.edit.associations', $this);
components/com_content/views/article/tmpl/edit_metadata.php000060400000000504152453623450020277 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

echo JLayoutHelper::render('joomla.edit.metadata', $this);
components/com_content/views/article/tmpl/pagebreak.php000060400000002616152453623450017441 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.core');
JHtml::_('behavior.polyfill', array('event'), 'lt IE 9');
JHtml::_('script', 'com_content/admin-article-pagebreak.min.js', array('version' => 'auto', 'relative' => true));

$document    = JFactory::getDocument();
$this->eName = JFactory::getApplication()->input->getCmd('e_name', '');
$this->eName = preg_replace('#[^A-Z0-9\-\_\[\]]#i', '', $this->eName);

$document->setTitle(JText::_('COM_CONTENT_PAGEBREAK_DOC_TITLE'));
?>
<div class="container-popup">
	<form class="form-horizontal">

		<div class="control-group">
			<label for="title" class="control-label"><?php echo JText::_('COM_CONTENT_PAGEBREAK_TITLE'); ?></label>
			<div class="controls"><input type="text" id="title" name="title" /></div>
		</div>

		<div class="control-group">
			<label for="alias" class="control-label"><?php echo JText::_('COM_CONTENT_PAGEBREAK_TOC'); ?></label>
			<div class="controls"><input type="text" id="alt" name="alt" /></div>
		</div>

		<button onclick="insertPagebreak('<?php echo $this->eName; ?>');" class="btn btn-success pull-right">
			<?php echo JText::_('COM_CONTENT_PAGEBREAK_INSERT_BUTTON'); ?>
		</button>

	</form>
</div>
components/com_content/views/article/tmpl/edit_associations.php000060400000000510152453623450021213 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

echo JLayoutHelper::render('joomla.edit.associations', $this);
components/com_content/views/articles/tmpl/modal.php000060400000015256152453623450017003 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$app = JFactory::getApplication();

if ($app->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::_('behavior.polyfill', array('event'), 'lt IE 9');
JHtml::_('script', 'com_content/admin-articles-modal.min.js', array('version' => 'auto', 'relative' => true));
JHtml::_('bootstrap.tooltip', '.hasTooltip', array('placement' => 'bottom'));
JHtml::_('bootstrap.popover', '.hasPopover', array('placement' => 'bottom'));
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', '.multipleTags', null, array('placeholder_text_multiple' => JText::_('JOPTION_SELECT_TAG')));
JHtml::_('formbehavior.chosen', '.multipleCategories', null, array('placeholder_text_multiple' => JText::_('JOPTION_SELECT_CATEGORY')));
JHtml::_('formbehavior.chosen', '.multipleAccessLevels', null, array('placeholder_text_multiple' => JText::_('JOPTION_SELECT_ACCESS')));
JHtml::_('formbehavior.chosen', '.multipleAuthors', null, array('placeholder_text_multiple' => JText::_('JOPTION_SELECT_AUTHOR')));
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'));

$function  = $app->input->getCmd('function', 'jSelectArticle');
$editor    = $app->input->getCmd('editor', '');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$onclick   = $this->escape($function);

if (!empty($editor))
{
	// This view is used also in com_menus. Load the xtd script only if the editor is set!
	JFactory::getDocument()->addScriptOptions('xtd-articles', array('editor' => $editor));
	$onclick = "jSelectArticle";
}
?>
<div class="container-popup">

	<form action="<?php echo JRoute::_('index.php?option=com_content&view=articles&layout=modal&tmpl=component&function=' . $function . '&' . JSession::getFormToken() . '=1&editor=' . $editor); ?>" method="post" name="adminForm" id="adminForm" class="form-inline">

		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>

		<div class="clearfix"></div>

		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped table-condensed">
				<thead>
					<tr>
						<th width="1%" class="center nowrap">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
						</th>
						<th class="title">
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ACCESS', 'a.access', $listDirn, $listOrder); ?>
						</th>
						<th width="15%" class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'language', $listDirn, $listOrder); ?>
						</th>
						<th width="5%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JDATE', 'a.created', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
						<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="6">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
				<?php
				$iconStates = array(
					-2 => 'icon-trash',
					0  => 'icon-unpublish',
					1  => 'icon-publish',
					2  => 'icon-archive',
				);
				?>
				<?php foreach ($this->items as $i => $item) : ?>
					<?php if ($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 = '';
					}
					?>
					<tr class="row<?php echo $i % 2; ?>">
						<td class="center">
							<span class="<?php echo $iconStates[$this->escape($item->state)]; ?>" aria-hidden="true"></span>
						</td>
						<td>
							<?php $attribs = 'data-function="' . $this->escape($onclick) . '"'
								. ' data-id="' . $item->id . '"'
								. ' data-title="' . $this->escape($item->title) . '"'
								. ' data-cat-id="' . $this->escape($item->catid) . '"'
								. ' data-uri="' . $this->escape(ContentHelperRoute::getArticleRoute($item->id, $item->catid, $item->language)) . '"'
								. ' data-language="' . $this->escape($lang) . '"';
							?>
							<a class="select-link" href="javascript:void(0)" <?php echo $attribs; ?>>
								<?php echo $this->escape($item->title); ?></a>
							<span class="small break-word">
								<?php if (empty($item->note)) : ?>
									<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias)); ?>
								<?php else : ?>
									<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS_NOTE', $this->escape($item->alias), $this->escape($item->note)); ?>
								<?php endif; ?>
 							</span>
							<div class="small">
								<?php echo JText::_('JCATEGORY') . ': ' . $this->escape($item->category_title); ?>
							</div>
						</td>
						<td class="small hidden-phone">
							<?php echo $this->escape($item->access_level); ?>
						</td>
						<td class="small">
							<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
						</td>
						<td class="nowrap small hidden-phone">
							<?php echo JHtml::_('date', $item->created, JText::_('DATE_FORMAT_LC4')); ?>
						</td>
						<td class="nowrap small hidden-phone">
							<?php echo (int) $item->id; ?>
						</td>
					</tr>
				<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif; ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<input type="hidden" name="forcedLanguage" value="<?php echo $app->input->get('forcedLanguage', '', 'CMD'); ?>" />
		<?php echo JHtml::_('form.token'); ?>

	</form>
</div>
components/com_content/views/articles/tmpl/default_batch_body.php000060400000001745152453623450021507 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;
$published = (int) $this->state->get('filter.published');
?>

<div class="container-fluid">
	<div class="row-fluid">
		<div class="control-group span6">
			<div class="controls">
				<?php echo JHtml::_('batch.language'); ?>
			</div>
		</div>
		<div class="control-group span6">
			<div class="controls">
				<?php echo JHtml::_('batch.access'); ?>
			</div>
		</div>
	</div>
	<div class="row-fluid">
		<?php if ($published >= 0) : ?>
			<div class="control-group span6">
				<div class="controls">
					<?php echo JHtml::_('batch.item', 'com_content'); ?>
				</div>
			</div>
		<?php endif; ?>
		<div class="control-group span6">
			<div class="controls">
				<?php echo JHtml::_('batch.tag'); ?>
			</div>
		</div>
	</div>
</div>
components/com_content/views/articles/tmpl/default.php000060400000034312152453623450017325 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', '.multipleTags', null, array('placeholder_text_multiple' => JText::_('JOPTION_SELECT_TAG')));
JHtml::_('formbehavior.chosen', '.multipleCategories', null, array('placeholder_text_multiple' => JText::_('JOPTION_SELECT_CATEGORY')));
JHtml::_('formbehavior.chosen', '.multipleAccessLevels', null, array('placeholder_text_multiple' => JText::_('JOPTION_SELECT_ACCESS')));
JHtml::_('formbehavior.chosen', '.multipleAuthors', null, array('placeholder_text_multiple' => JText::_('JOPTION_SELECT_AUTHOR')));
JHtml::_('formbehavior.chosen', 'select');

$app       = JFactory::getApplication();
$user      = JFactory::getUser();
$userId    = $user->get('id');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$saveOrder = $listOrder == 'a.ordering';
$columns   = 10;

if (strpos($listOrder, 'publish_up') !== false)
{
	$orderingColumn = 'publish_up';
}
elseif (strpos($listOrder, 'publish_down') !== false)
{
	$orderingColumn = 'publish_down';
}
elseif (strpos($listOrder, 'modified') !== false)
{
	$orderingColumn = 'modified';
}
else
{
	$orderingColumn = 'created';
}

if ($saveOrder)
{
	$saveOrderingUrl = 'index.php?option=com_content&task=articles.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'articleList', 'adminForm', strtolower($listDirn), $saveOrderingUrl);
}

$assoc = JLanguageAssociations::isEnabled();
?>

<form action="<?php echo JRoute::_('index.php?option=com_content&view=articles'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
		<?php
		// Search tools bar
		echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this));
		?>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped" id="articleList">
				<thead>
					<tr>
						<th width="1%" class="nowrap center hidden-phone">
							<?php echo JHtml::_('searchtools.sort', '', 'a.ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING', 'icon-menu-2'); ?>
						</th>
						<th width="1%" class="center">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
						</th>
						<th style="min-width:100px" class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort',  'JGRID_HEADING_ACCESS', 'a.access', $listDirn, $listOrder); ?>
						</th>
						<?php if ($assoc) : ?>
							<?php $columns++; ?>
							<th width="5%" class="nowrap hidden-phone">
								<?php echo JHtml::_('searchtools.sort', 'COM_CONTENT_HEADING_ASSOCIATION', 'association', $listDirn, $listOrder); ?>
							</th>
						<?php endif; ?>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort',  'JAUTHOR', 'a.created_by', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'language', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_CONTENT_HEADING_DATE_' . strtoupper($orderingColumn), 'a.' . $orderingColumn, $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_HITS', 'a.hits', $listDirn, $listOrder); ?>
						</th>
						<?php if ($this->vote) : ?>
							<?php $columns++; ?>
							<th width="1%" class="nowrap hidden-phone">
								<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_VOTES', 'rating_count', $listDirn, $listOrder); ?>
							</th>
							<?php $columns++; ?>
							<th width="1%" class="nowrap hidden-phone">
								<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_RATINGS', 'rating', $listDirn, $listOrder); ?>
							</th>
						<?php endif; ?>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="<?php echo $columns; ?>">
						</td>
					</tr>
				</tfoot>
				<tbody>
				<?php foreach ($this->items as $i => $item) :
					$item->max_ordering = 0;
					$ordering   = ($listOrder == 'a.ordering');
					$canCreate  = $user->authorise('core.create',     'com_content.category.' . $item->catid);
					$canEdit    = $user->authorise('core.edit',       'com_content.article.' . $item->id);
					$canCheckin = $user->authorise('core.manage',     'com_checkin') || $item->checked_out == $userId || $item->checked_out == 0;
					$canEditOwn = $user->authorise('core.edit.own',   'com_content.article.' . $item->id) && $item->created_by == $userId;
					$canChange  = $user->authorise('core.edit.state', 'com_content.article.' . $item->id) && $canCheckin;
					$canEditCat    = $user->authorise('core.edit',       'com_content.category.' . $item->catid);
					$canEditOwnCat = $user->authorise('core.edit.own',   'com_content.category.' . $item->catid) && $item->category_uid == $userId;
					$canEditParCat    = $user->authorise('core.edit',       'com_content.category.' . $item->parent_category_id);
					$canEditOwnParCat = $user->authorise('core.edit.own',   'com_content.category.' . $item->parent_category_id) && $item->parent_category_uid == $userId;
					?>
					<tr class="row<?php echo $i % 2; ?>" sortable-group-id="<?php echo $item->catid; ?>">
						<td class="order nowrap center hidden-phone">
							<?php
							$iconClass = '';
							if (!$canChange)
							{
								$iconClass = ' inactive';
							}
							elseif (!$saveOrder)
							{
								$iconClass = ' inactive tip-top hasTooltip" title="' . JHtml::_('tooltipText', 'JORDERINGDISABLED');
							}
							?>
							<span class="sortable-handler<?php echo $iconClass ?>">
								<span class="icon-menu" aria-hidden="true"></span>
							</span>
							<?php if ($canChange && $saveOrder) : ?>
								<input type="text" style="display:none" name="order[]" size="5" value="<?php echo $item->ordering; ?>" class="width-20 text-area-order" />
							<?php endif; ?>
						</td>
						<td class="center">
							<?php echo JHtml::_('grid.id', $i, $item->id); ?>
						</td>
						<td class="center">
							<div class="btn-group">
								<?php echo JHtml::_('jgrid.published', $item->state, $i, 'articles.', $canChange, 'cb', $item->publish_up, $item->publish_down); ?>
								<?php echo JHtml::_('contentadministrator.featured', $item->featured, $i, $canChange); ?>
								<?php // Create dropdown items and render the dropdown list.
								if ($canChange)
								{
									JHtml::_('actionsdropdown.' . ((int) $item->state === 2 ? 'un' : '') . 'archive', 'cb' . $i, 'articles');
									JHtml::_('actionsdropdown.' . ((int) $item->state === -2 ? 'un' : '') . 'trash', 'cb' . $i, 'articles');
									echo JHtml::_('actionsdropdown.render', $this->escape($item->title));
								}
								?>
							</div>
						</td>
						<td class="has-context">
							<div class="pull-left break-word">
								<?php if ($item->checked_out) : ?>
									<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'articles.', $canCheckin); ?>
								<?php endif; ?>
								<?php if ($canEdit || $canEditOwn) : ?>
									<a class="hasTooltip" href="<?php echo JRoute::_('index.php?option=com_content&task=article.edit&id=' . $item->id); ?>" title="<?php echo JText::_('JACTION_EDIT'); ?>">
										<?php echo $this->escape($item->title); ?></a>
								<?php else : ?>
									<span title="<?php echo JText::sprintf('JFIELD_ALIAS_LABEL', $this->escape($item->alias)); ?>"><?php echo $this->escape($item->title); ?></span>
								<?php endif; ?>
								<span class="small break-word">
									<?php if (empty($item->note)) : ?>
										<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias)); ?>
									<?php else : ?>
										<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS_NOTE', $this->escape($item->alias), $this->escape($item->note)); ?>
									<?php endif; ?>
								</span>
								<div class="small">
									<?php
									$ParentCatUrl = JRoute::_('index.php?option=com_categories&task=category.edit&id=' . $item->parent_category_id . '&extension=com_content');
									$CurrentCatUrl = JRoute::_('index.php?option=com_categories&task=category.edit&id=' . $item->catid . '&extension=com_content');
									$EditCatTxt = JText::_('COM_CONTENT_EDIT_CATEGORY');

										echo JText::_('JCATEGORY') . ': ';

										if ($item->category_level != '1') :
											if ($item->parent_category_level != '1') :
												echo ' &#187; ';
											endif;
										endif;

										if (JFactory::getLanguage()->isRtl())
										{
											if ($canEditCat || $canEditOwnCat) :
												echo '<a class="hasTooltip" href="' . $CurrentCatUrl . '" title="' . $EditCatTxt . '">';
											endif;
											echo $this->escape($item->category_title);
											if ($canEditCat || $canEditOwnCat) :
												echo '</a>';
											endif;

											if ($item->category_level != '1') :
												echo ' &#171; ';
												if ($canEditParCat || $canEditOwnParCat) :
													echo '<a class="hasTooltip" href="' . $ParentCatUrl . '" title="' . $EditCatTxt . '">';
												endif;
												echo $this->escape($item->parent_category_title);
												if ($canEditParCat || $canEditOwnParCat) :
													echo '</a>';
												endif;
											endif;
										}
										else
										{
											if ($item->category_level != '1') :
												if ($canEditParCat || $canEditOwnParCat) :
													echo '<a class="hasTooltip" href="' . $ParentCatUrl . '" title="' . $EditCatTxt . '">';
												endif;
												echo $this->escape($item->parent_category_title);
												if ($canEditParCat || $canEditOwnParCat) :
													echo '</a>';
												endif;
												echo ' &#187; ';
											endif;
											if ($canEditCat || $canEditOwnCat) :
												echo '<a class="hasTooltip" href="' . $CurrentCatUrl . '" title="' . $EditCatTxt . '">';
											endif;
											echo $this->escape($item->category_title);
											if ($canEditCat || $canEditOwnCat) :
												echo '</a>';
											endif;
										}
									?>
								</div>
							</div>
						</td>
						<td class="small hidden-phone">
							<?php echo $this->escape($item->access_level); ?>
						</td>
						<?php if ($assoc) : ?>
						<td class="hidden-phone">
							<?php if ($item->association) : ?>
								<?php echo JHtml::_('contentadministrator.association', $item->id); ?>
							<?php endif; ?>
						</td>
						<?php endif; ?>
						<td class="small hidden-phone">
							<?php if ((int) $item->created_by != 0) : ?>
								<?php if ($item->created_by_alias) : ?>
									<a class="hasTooltip" href="<?php echo JRoute::_('index.php?option=com_users&task=user.edit&id=' . (int) $item->created_by); ?>" title="<?php echo JText::_('JAUTHOR'); ?>">
									<?php echo $this->escape($item->author_name); ?></a>
									<div class="smallsub"><?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->created_by_alias)); ?></div>
								<?php else : ?>
									<a class="hasTooltip" href="<?php echo JRoute::_('index.php?option=com_users&task=user.edit&id=' . (int) $item->created_by); ?>" title="<?php echo JText::_('JAUTHOR'); ?>">
									<?php echo $this->escape($item->author_name); ?></a>
								<?php endif; ?>
							<?php else : ?>
								<?php if ($item->created_by_alias) : ?>
									<?php echo JText::_('JNONE'); ?>
									<div class="smallsub"><?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->created_by_alias)); ?></div>
								<?php else : ?>
									<?php echo JText::_('JNONE'); ?>
								<?php endif; ?>
							<?php endif; ?>
						</td>
						<td class="small hidden-phone">
							<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
						</td>
						<td class="nowrap small hidden-phone">
							<?php
							$date = $item->{$orderingColumn};
							echo $date > 0 ? JHtml::_('date', $date, JText::_('DATE_FORMAT_LC4')) : '-';
							?>
						</td>
						<td class="hidden-phone center">
							<span class="badge badge-info">
								<?php echo (int) $item->hits; ?>
							</span>
						</td>
						<?php if ($this->vote) : ?>
							<td class="hidden-phone center">
								<span class="badge badge-success" >
								<?php echo (int) $item->rating_count; ?>
								</span>
							</td>
							<td class="hidden-phone center">
								<span class="badge badge-warning" >
								<?php echo (int) $item->rating; ?>
								</span>
							</td>
						<?php endif; ?>
						<td class="hidden-phone">
							<?php echo (int) $item->id; ?>
						</td>
					</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
			<?php // Load the batch processing form. ?>
			<?php if ($user->authorise('core.create', 'com_content')
				&& $user->authorise('core.edit', 'com_content')
				&& $user->authorise('core.edit.state', 'com_content')) : ?>
				<?php echo JHtml::_(
					'bootstrap.renderModal',
					'collapseModal',
					array(
						'title'  => JText::_('COM_CONTENT_BATCH_OPTIONS'),
						'footer' => $this->loadTemplate('batch_footer'),
					),
					$this->loadTemplate('batch_body')
				); ?>
			<?php endif; ?>
		<?php endif; ?>

		<?php echo $this->pagination->getListFooter(); ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_content/views/articles/tmpl/default.xml000060400000003607152453623450017341 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_CONTENT_ARTICLES_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_CONTENT_ARTICLES_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
		<!-- Add fields to the request variables for the layout. -->
	<fields name="request">
		<fieldset name="request"
			addfieldpath="/administrator/components/com_categories/models/fields"
		>
			<field
				name="filter_category_id"
				type="modal_category"
				label="COM_MENUS_ADMIN_CATEGORY_LABEL"
				description="COM_MENUS_ADMIN_CATEGORY_DESC"
				extension="com_content"
				select="true"
				new="true"
				edit="true"
				clear="true"
				filter="integer"
			/>

			<field
				name="filter_level"
				type="integer"
				label="COM_MENUS_ADMIN_LEVEL_LABEL"
				description="COM_MENUS_ADMIN_LEVEL_DESC"
				first="1"
				last="10"
				step="1"
				languages="*"
				filter="integer"
				>
				<option value="">JOPTION_SELECT_MAX_LEVELS</option>
			</field>

			<field
				name="filter_author_id"
				type="author"
				label="COM_MENUS_ADMIN_AUTHOR_LABEL"
				description="COM_MENUS_ADMIN_AUTHOR_DESC"
				multiple="true"
				class="multipleAuthors"
				filter="int_array"
				>
				<option value="0">JNONE</option>
			</field>

			<field
				name="filter_tag"
				type="tag"
				label="COM_MENUS_ADMIN_TAGS_LABEL"
				description="COM_MENUS_ADMIN_TAGS_DESC"
				multiple="true"
				filter="int_array"
				mode="nested"
			/>

			<field
				name="filter_access"
				type="accesslevel"
				label="COM_MENUS_ADMIN_ACCESS_LABEL"
				description="COM_MENUS_ADMIN_ACCESS_DESC"
				multiple="true"
				filter="int_array"
			/>

			<field
				name="filter_language"
				type="contentlanguage"
				label="COM_MENUS_ADMIN_LANGUAGE_LABEL"
				description="COM_MENUS_ADMIN_LANGUAGE_DESC"
				>
				<option value="">JOPTION_SELECT_LANGUAGE</option>
				<option value="*">JALL</option>
			</field>

		</fieldset>
	</fields>

</metadata>
components/com_content/views/articles/tmpl/default_batch_footer.php000060400000001443152453623450022043 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

?>
<button type="button" class="btn" onclick="document.getElementById('batch-category-id').value='';document.getElementById('batch-access').value='';document.getElementById('batch-language-id').value='';document.getElementById('batch-user-id').value='';document.getElementById('batch-tag-id').value=''" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<button type="submit" class="btn btn-success" onclick="Joomla.submitbutton('article.batch');return false;">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>
components/com_content/views/articles/view.html.php000060400000014760152453623450016647 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of articles.
 *
 * @since  1.6
 */
class ContentViewArticles extends JViewLegacy
{
	/**
	 * The item authors
	 *
	 * @var  stdClass
	 *
	 * @deprecated  4.0  To be removed with Hathor
	 */
	protected $authors;

	/**
	 * An array of items
	 *
	 * @var  array
	 */
	protected $items;

	/**
	 * The pagination object
	 *
	 * @var  JPagination
	 */
	protected $pagination;

	/**
	 * The model state
	 *
	 * @var  object
	 */
	protected $state;

	/**
	 * Form object for search filters
	 *
	 * @var  JForm
	 */
	public $filterForm;

	/**
	 * The active search filters
	 *
	 * @var  array
	 */
	public $activeFilters;

	/**
	 * The sidebar markup
	 *
	 * @var  string
	 */
	protected $sidebar;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		if ($this->getLayout() !== 'modal')
		{
			ContentHelper::addSubmenu('articles');
		}

		$this->items         = $this->get('Items');
		$this->pagination    = $this->get('Pagination');
		$this->state         = $this->get('State');
		$this->authors       = $this->get('Authors');
		$this->filterForm    = $this->get('FilterForm');
		$this->activeFilters = $this->get('ActiveFilters');
		$this->vote          = JPluginHelper::isEnabled('content', 'vote');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Levels filter - Used in Hathor.
		// @deprecated  4.0 To be removed with 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.
			// 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('<field name="language" type="hidden" default="' . $forcedLanguage . '" />');
				$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');
			}
		}

		return parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		$canDo = JHelperContent::getActions('com_content', 'category', $this->state->get('filter.category_id'));
		$user  = JFactory::getUser();

		// Get the toolbar object instance
		$bar = JToolbar::getInstance('toolbar');

		JToolbarHelper::title(JText::_('COM_CONTENT_ARTICLES_TITLE'), 'stack article');

		if ($canDo->get('core.create') || count($user->getAuthorisedCategories('com_content', 'core.create')) > 0)
		{
			JToolbarHelper::addNew('article.add');
		}

		if ($canDo->get('core.edit') || $canDo->get('core.edit.own'))
		{
			JToolbarHelper::editList('article.edit');
		}

		if ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::publish('articles.publish', 'JTOOLBAR_PUBLISH', true);
			JToolbarHelper::unpublish('articles.unpublish', 'JTOOLBAR_UNPUBLISH', true);
			JToolbarHelper::custom('articles.featured', 'featured.png', 'featured_f2.png', 'JFEATURE', true);
			JToolbarHelper::custom('articles.unfeatured', 'unfeatured.png', 'featured_f2.png', 'JUNFEATURE', true);
			JToolbarHelper::archiveList('articles.archive');
			JToolbarHelper::checkin('articles.checkin');
		}

		// Add a batch button
		if ($user->authorise('core.create', 'com_content')
			&& $user->authorise('core.edit', 'com_content')
			&& $user->authorise('core.edit.state', 'com_content'))
		{
			$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 ($this->state->get('filter.published') == -2 && $canDo->get('core.delete'))
		{
			JToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'articles.delete', 'JTOOLBAR_EMPTY_TRASH');
		}
		elseif ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::trash('articles.trash');
		}

		if ($user->authorise('core.admin', 'com_content') || $user->authorise('core.options', 'com_content'))
		{
			JToolbarHelper::preferences('com_content');
		}

		JToolbarHelper::help('JHELP_CONTENT_ARTICLE_MANAGER');
	}

	/**
	 * 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.ordering'     => JText::_('JGRID_HEADING_ORDERING'),
			'a.state'        => JText::_('JSTATUS'),
			'a.title'        => JText::_('JGLOBAL_TITLE'),
			'category_title' => JText::_('JCATEGORY'),
			'access_level'   => JText::_('JGRID_HEADING_ACCESS'),
			'a.created_by'   => JText::_('JAUTHOR'),
			'language'       => JText::_('JGRID_HEADING_LANGUAGE'),
			'a.created'      => JText::_('JDATE'),
			'a.id'           => JText::_('JGRID_HEADING_ID'),
			'a.featured'     => JText::_('JFEATURED')
		);
	}
}
components/com_content/access.xml000060400000006077152453623450013243 0ustar00<?xml version="1.0" encoding="utf-8" ?>
<access component="com_content">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.options" title="JACTION_OPTIONS" description="JACTION_OPTIONS_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
		<action name="core.edit.own" title="JACTION_EDITOWN" description="JACTION_EDITOWN_COMPONENT_DESC" />
		<action name="core.edit.value" title="JACTION_EDITVALUE" description="JACTION_EDITVALUE_COMPONENT_DESC" />
	</section>
	<section name="category">
		<action name="core.create" title="JACTION_CREATE" description="COM_CATEGORIES_ACCESS_CREATE_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="COM_CATEGORIES_ACCESS_DELETE_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="COM_CATEGORIES_ACCESS_EDIT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_CATEGORIES_ACCESS_EDITSTATE_DESC" />
		<action name="core.edit.own" title="JACTION_EDITOWN" description="COM_CATEGORIES_ACCESS_EDITOWN_DESC" />
	</section>
	<section name="article">
		<action name="core.delete" title="JACTION_DELETE" description="COM_CONTENT_ACCESS_DELETE_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="COM_CONTENT_ACCESS_EDIT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_CONTENT_ACCESS_EDITSTATE_DESC" />
	</section>
	<section name="fieldgroup">
		<action name="core.create" title="JACTION_CREATE" description="COM_FIELDS_GROUP_PERMISSION_CREATE_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="COM_FIELDS_GROUP_PERMISSION_DELETE_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="COM_FIELDS_GROUP_PERMISSION_EDIT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_FIELDS_GROUP_PERMISSION_EDITSTATE_DESC" />
		<action name="core.edit.own" title="JACTION_EDITOWN" description="COM_FIELDS_GROUP_PERMISSION_EDITOWN_DESC" />
		<action name="core.edit.value" title="JACTION_EDITVALUE" description="COM_FIELDS_GROUP_PERMISSION_EDITVALUE_DESC" />
	</section>
	<section name="field">
		<action name="core.delete" title="JACTION_DELETE" description="COM_FIELDS_FIELD_PERMISSION_DELETE_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="COM_FIELDS_FIELD_PERMISSION_EDIT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_FIELDS_FIELD_PERMISSION_EDITSTATE_DESC" />
		<action name="core.edit.value" title="JACTION_EDITVALUE" description="COM_FIELDS_FIELD_PERMISSION_EDITVALUE_DESC" />
	</section>
</access>
components/com_content/helpers/html/contentadministrator.php000060400000007362152453623450020650 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

JLoader::register('ContentHelper', JPATH_ADMINISTRATOR . '/components/com_content/helpers/content.php');

/**
 * Content HTML helper
 *
 * @since  3.0
 */
abstract class JHtmlContentAdministrator
{
	/**
	 * Render the list of associated items
	 *
	 * @param   integer  $articleid  The article item id
	 *
	 * @return  string  The language HTML
	 *
	 * @throws  Exception
	 */
	public static function association($articleid)
	{
		// Defaults
		$html = '';

		// Get the associations
		if ($associations = JLanguageAssociations::getAssociations('com_content', '#__content', 'com_content.item', $articleid))
		{
			foreach ($associations as $tag => $associated)
			{
				$associations[$tag] = (int) $associated->id;
			}

			// Get the associated menu items
			$db = JFactory::getDbo();
			$query = $db->getQuery(true)
				->select('c.*')
				->select('l.sef as lang_sef')
				->select('l.lang_code')
				->from('#__content 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 != ' . $articleid)
				->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_content&task=article.edit&id=' . (int) $item->id);

					$tooltip = htmlspecialchars($item->title, ENT_QUOTES, 'UTF-8') . '<br />' . JText::sprintf('JCATEGORY_SPRINTF', $item->category_title);
					$classes = 'hasPopover label label-association label-' . $item->lang_sef;

					$item->link = '<a href="' . $url . '" title="' . $item->language_title . '" class="' . $classes
						. '" data-content="' . $tooltip . '" data-placement="top">'
						. $text . '</a>';
				}
			}

			JHtml::_('bootstrap.popover');

			$html = JLayoutHelper::render('joomla.content.associations', $items);
		}

		return $html;
	}

	/**
	 * Show the feature/unfeature links
	 *
	 * @param   integer  $value      The state value
	 * @param   integer  $i          Row number
	 * @param   boolean  $canChange  Is user allowed to change?
	 *
	 * @return  string       HTML code
	 */
	public static function featured($value = 0, $i = 0, $canChange = true)
	{
		JHtml::_('bootstrap.tooltip');

		// Array of image, task, title, action
		$states = array(
			0 => array('unfeatured', 'articles.featured', 'COM_CONTENT_UNFEATURED', 'JGLOBAL_TOGGLE_FEATURED'),
			1 => array('featured', 'articles.unfeatured', 'COM_CONTENT_FEATURED', 'JGLOBAL_TOGGLE_FEATURED'),
		);
		$state = ArrayHelper::getValue($states, (int) $value, $states[1]);
		$icon  = $state[0];

		if ($canChange)
		{
			$html = '<a href="#" onclick="return listItemTask(\'cb' . $i . '\',\'' . $state[1] . '\')" class="btn btn-micro hasTooltip'
				. ($value == 1 ? ' active' : '') . '" title="' . JHtml::_('tooltipText', $state[3])
				. '"><span class="icon-' . $icon . '" aria-hidden="true"></span></a>';
		}
		else
		{
			$html = '<a class="btn btn-micro hasTooltip disabled' . ($value == 1 ? ' active' : '') . '" title="'
				. JHtml::_('tooltipText', $state[2]) . '"><span class="icon-' . $icon . '" aria-hidden="true"></span></a>';
		}

		return $html;
	}
}
components/com_content/helpers/associations.php000060400000006676152453623450016137 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Association\AssociationExtensionHelper;

/**
 * Content associations helper.
 *
 * @since  3.7.0
 */
class ContentAssociationsHelper extends AssociationExtensionHelper
{
	/**
	 * The extension name
	 *
	 * @var     array   $extension
	 *
	 * @since   3.7.0
	 */
	protected $extension = 'com_content';

	/**
	 * Array of item types
	 *
	 * @var     array   $itemTypes
	 *
	 * @since   3.7.0
	 */
	protected $itemTypes = array('article', 'category');

	/**
	 * Has the extension association support
	 *
	 * @var     boolean   $associationsSupport
	 *
	 * @since   3.7.0
	 */
	protected $associationsSupport = true;

	/**
	 * Get the associated items for an item
	 *
	 * @param   string  $typeName  The item type
	 * @param   int     $id        The id of item for which we need the associated items
	 *
	 * @return  array
	 *
	 * @since   3.7.0
	 */
	public function getAssociations($typeName, $id)
	{
		$type = $this->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 'article':
				$table = JTable::getInstance('Content');
				break;

			case 'category':
				$table = JTable::getInstance('Category');
				break;
		}

		if (is_null($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 'article':

					$support['state'] = true;
					$support['acl'] = true;
					$support['checkout'] = true;
					$support['category'] = true;
					$support['save2copy'] = true;

					$tables = array(
						'a' => '#__content'
					);

					$title = 'article';
					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
		);
	}
}
components/com_content/helpers/content.php000060400000010333152453623450015073 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Content component helper.
 *
 * @since  1.6
 */
class ContentHelper extends JHelperContent
{
	public static $extension = 'com_content';

	/**
	 * Configure the Linkbar.
	 *
	 * @param   string  $vName  The name of the active view.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public static function addSubmenu($vName)
	{
		JHtmlSidebar::addEntry(
			JText::_('JGLOBAL_ARTICLES'),
			'index.php?option=com_content&view=articles',
			$vName == 'articles'
		);
		JHtmlSidebar::addEntry(
			JText::_('COM_CONTENT_SUBMENU_CATEGORIES'),
			'index.php?option=com_categories&extension=com_content',
			$vName == 'categories'
		);

		JHtmlSidebar::addEntry(
			JText::_('COM_CONTENT_SUBMENU_FEATURED'),
			'index.php?option=com_content&view=featured',
			$vName == 'featured'
		);

		if (JComponentHelper::isEnabled('com_fields') && JComponentHelper::getParams('com_content')->get('custom_fields_enable', '1'))
		{
			JHtmlSidebar::addEntry(
				JText::_('JGLOBAL_FIELDS'),
				'index.php?option=com_fields&context=com_content.article',
				$vName == 'fields.fields'
			);
			JHtmlSidebar::addEntry(
				JText::_('JGLOBAL_FIELD_GROUPS'),
				'index.php?option=com_fields&view=groups&context=com_content.article',
				$vName == 'fields.groups'
			);
		}
	}

	/**
	 * Applies the content tag filters to arbitrary text as per settings for current user group
	 *
	 * @param   text  $text  The string to filter
	 *
	 * @return  string  The filtered string
	 *
	 * @deprecated  4.0  Use JComponentHelper::filterText() instead.
	 */
	public static function filterText($text)
	{
		try
		{
			JLog::add(
				sprintf('%s() is deprecated. Use JComponentHelper::filterText() instead', __METHOD__),
				JLog::WARNING,
				'deprecated'
			);
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		return JComponentHelper::filterText($text);
	}

	/**
	 * Adds Count Items for Category Manager.
	 *
	 * @param   stdClass[]  &$items  The category objects
	 *
	 * @return  stdClass[]
	 *
	 * @since   3.5
	 */
	public static function countItems(&$items)
	{
		$config = (object) array(
			'related_tbl'   => 'content',
			'state_col'     => 'state',
			'group_col'     => 'catid',
			'relation_type' => 'category_or_group',
		);

		return parent::countRelations($items, $config);
	}

	/**
	 * Adds Count Items for Tag Manager.
	 *
	 * @param   stdClass[]  &$items     The tag objects
	 * @param   string      $extension  The name of the active view.
	 *
	 * @return  stdClass[]
	 *
	 * @since   3.6
	 */
	public static function countTagItems(&$items, $extension)
	{
		$parts   = explode('.', $extension);
		$section = count($parts) > 1 ? $parts[1] : null;

		$config = (object) array(
			'related_tbl'   => ($section === 'category' ? 'categories' : 'content'),
			'state_col'     => ($section === 'category' ? 'published' : 'state'),
			'group_col'     => 'tag_id',
			'extension'     => $extension,
			'relation_type' => 'tag_assigments',
		);

		return parent::countRelations($items, $config);
	}

	/**
	 * Returns a valid section for articles. If it is not valid then null
	 * is returned.
	 *
	 * @param   string  $section  The section to get the mapping for
	 *
	 * @return  string|null  The new section
	 *
	 * @since   3.7.0
	 */
	public static function validateSection($section)
	{
		if (JFactory::getApplication()->isClient('site'))
		{
			// On the front end we need to map some sections
			switch ($section)
			{
				// Editing an article
				case 'form':

				// Category list view
				case 'featured':
				case 'category':
					$section = 'article';
			}
		}

		if ($section != 'article')
		{
			// 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_content', JPATH_ADMINISTRATOR);

		$contexts = array(
			'com_content.article'    => JText::_('COM_CONTENT'),
			'com_content.categories' => JText::_('JCATEGORY')
		);

		return $contexts;
	}
}
components/com_content/tables/featured.php000060400000001105152453623450015025 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Featured Table class.
 *
 * @since  1.6
 */
class ContentTableFeatured extends JTable
{
	/**
	 * Constructor
	 *
	 * @param   JDatabaseDriver  $db  Database connector object
	 *
	 * @since   1.6
	 */
	public function __construct(&$db)
	{
		parent::__construct('#__content_frontpage', 'content_id', $db);
	}
}
components/com_content/models/article.php000060400000060526152453623450014676 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;

JLoader::register('ContentHelper', JPATH_ADMINISTRATOR . '/components/com_content/helpers/content.php');

/**
 * Item Model for an Article.
 *
 * @since  1.6
 */
class ContentModelArticle extends JModelAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_CONTENT';

	/**
	 * The type alias for this content type (for example, 'com_content.article').
	 *
	 * @var    string
	 * @since  3.2
	 */
	public $typeAlias = 'com_content.article';

	/**
	 * The context used for the associations table
	 *
	 * @var    string
	 * @since  3.4.4
	 */
	protected $associationsContext = 'com_content.item';

	/**
	 * Function that can be overridden to do any data cleanup after batch copying data
	 *
	 * @param   \JTableInterface  $table  The table object containing the newly created item
	 * @param   integer           $newId  The id of the new item
	 * @param   integer           $oldId  The original item id
	 *
	 * @return  void
	 *
	 * @since  3.8.12
	 */
	protected function cleanupPostBatchCopy(\JTableInterface $table, $newId, $oldId)
	{
		// Check if the article was featured and update the #__content_frontpage table
		if ($table->featured == 1)
		{
			$db = $this->getDbo();
			$query = $db->getQuery(true)
				->insert($db->quoteName('#__content_frontpage'))
				->values($newId . ', 0');
			$db->setQuery($query);
			$db->execute();
		}

		// Register FieldsHelper
		JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');

		$oldItem = $this->getTable();
		$oldItem->load($oldId);
		$fields = FieldsHelper::getFields('com_content.article', $oldItem, true);

		$fieldsData = array();

		if (!empty($fields))
		{
			$fieldsData['com_fields'] = array();

			foreach ($fields as $field)
			{
				$fieldsData['com_fields'][$field->name] = $field->rawvalue;
			}
		}

		JEventDispatcher::getInstance()->trigger('onContentAfterSave', array('com_content.article', &$this->table, true, $fieldsData));
	}

	/**
	 * 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   3.8.6
	 */
	protected function batchMove($value, $pks, $contexts)
	{
		if (empty($this->batchSet))
		{
			// Set some needed variables.
			$this->user = JFactory::getUser();
			$this->table = $this->getTable();
			$this->tableClassName = get_class($this->table);
			$this->contentType = new JUcmType;
			$this->type = $this->contentType->getTypeByTable($this->tableClassName);
		}

		$categoryId = (int) $value;

		if (!$this->checkCategoryId($categoryId))
		{
			return false;
		}

		JPluginHelper::importPlugin('system');
		$dispatcher = JEventDispatcher::getInstance();

		// Register FieldsHelper
		JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');

		// Parent exists so we proceed
		foreach ($pks as $pk)
		{
			if (!$this->user->authorise('core.edit', $contexts[$pk]))
			{
				$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT'));

				return false;
			}

			// 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;
				}
			}

			$fields = FieldsHelper::getFields('com_content.article', $this->table, true);
			$fieldsData = array();

			if (!empty($fields))
			{
				$fieldsData['com_fields'] = array();

				foreach ($fields as $field)
				{
					$fieldsData['com_fields'][$field->name] = $field->rawvalue;
				}
			}

			// Set the new category ID
			$this->table->catid = $categoryId;

			// Check the row.
			if (!$this->table->check())
			{
				$this->setError($this->table->getError());

				return false;
			}

			if (!empty($this->type))
			{
				$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;
			}

			// Run event for moved article
			$dispatcher->trigger('onContentAfterSave', array('com_content.article', &$this->table, false, $fieldsData));
		}

		// 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) || $record->state != -2)
		{
			return false;
		}

		return JFactory::getUser()->authorise('core.delete', 'com_content.article.' . (int) $record->id);
	}

	/**
	 * 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)
	{
		$user = JFactory::getUser();

		// Check for existing article.
		if (!empty($record->id))
		{
			return $user->authorise('core.edit.state', 'com_content.article.' . (int) $record->id);
		}

		// New article, so check against the category.
		if (!empty($record->catid))
		{
			return $user->authorise('core.edit.state', 'com_content.category.' . (int) $record->catid);
		}

		// Default to component settings if neither article nor category known.
		return parent::canEditState($record);
	}

	/**
	 * Prepare and sanitise the table data prior to saving.
	 *
	 * @param   JTable  $table  A JTable object.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function prepareTable($table)
	{
		// Set the publish date to now
		if ($table->state == 1 && (int) $table->publish_up == 0)
		{
			$table->publish_up = JFactory::getDate()->toSql();
		}

		if ($table->state == 1 && intval($table->publish_down) == 0)
		{
			$table->publish_down = $this->getDbo()->getNullDate();
		}

		// Increment the content version number.
		$table->version++;

		// Reorder the articles within the category so the new article is first
		if (empty($table->id))
		{
			$table->reorder('catid = ' . (int) $table->catid . ' AND state >= 0');
		}
	}

	/**
	 * 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
	 */
	public function getTable($type = 'Content', $prefix = 'JTable', $config = array())
	{
		return JTable::getInstance($type, $prefix, $config);
	}

	/**
	 * Method to get a single record.
	 *
	 * @param   integer  $pk  The id of the primary key.
	 *
	 * @return  mixed  Object on success, false on failure.
	 */
	public function getItem($pk = null)
	{
		if ($item = parent::getItem($pk))
		{
			// Convert the params field to an array.
			$registry = new Registry($item->attribs);
			$item->attribs = $registry->toArray();

			// Convert the metadata field to an array.
			$registry = new Registry($item->metadata);
			$item->metadata = $registry->toArray();

			// Convert the images field to an array.
			$registry = new Registry($item->images);
			$item->images = $registry->toArray();

			// Convert the urls field to an array.
			$registry = new Registry($item->urls);
			$item->urls = $registry->toArray();

			$item->articletext = trim($item->fulltext) != '' ? $item->introtext . "<hr id=\"system-readmore\" />" . $item->fulltext : $item->introtext;

			if (!empty($item->id))
			{
				$item->tags = new JHelperTags;
				$item->tags->getTagIds($item->id, 'com_content.article');
			}
		}

		// Load associated content items
		$assoc = JLanguageAssociations::isEnabled();

		if ($assoc)
		{
			$item->associations = array();

			if ($item->id != null)
			{
				$associations = JLanguageAssociations::getAssociations('com_content', '#__content', 'com_content.item', $item->id);

				foreach ($associations as $tag => $association)
				{
					$item->associations[$tag] = $association->id;
				}
			}
		}

		return $item;
	}

	/**
	 * 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)
	{
		$app = JFactory::getApplication();
		$user = JFactory::getUser();

		// Get the form.
		$form = $this->loadForm('com_content.article', 'article', array('control' => 'jform', 'load_data' => $loadData));

		if (empty($form))
		{
			return false;
		}

		$jinput = JFactory::getApplication()->input;

		/*
		 * The front end calls this model and uses a_id to avoid id clashes so we need to check for that first.
		 * The back end uses id so we use that the rest of the time and set it to 0 by default.
		 */
		$id = (int) $jinput->get('a_id', $jinput->get('id', 0));

		// Determine correct permissions to check.
		if ($id = $this->getState('article.id', $id))
		{
			// Existing record. Can only edit in selected categories.
			$form->setFieldAttribute('catid', 'action', 'core.edit');

			// Existing record. Can only edit own articles in selected categories.
			if ($app->isClient('administrator'))
			{
				$form->setFieldAttribute('catid', 'action', 'core.edit.own');
			}
			else
			// Existing record. We can't edit the category in frontend if not edit.state.
			{
				if ($id != 0 && (!$user->authorise('core.edit.state', 'com_content.article.' . (int) $id))
					|| ($id == 0 && !$user->authorise('core.edit.state', 'com_content')))
				{
					$form->setFieldAttribute('catid', 'readonly', 'true');
					$form->setFieldAttribute('catid', 'required', 'false');
					$form->setFieldAttribute('catid', 'filter', 'unset');
				}
			}
		}
		else
		{
			// New record. Can only create in selected categories.
			$form->setFieldAttribute('catid', 'action', 'core.create');
		}

		// Object uses for checking edit state permission of article
		$record = new stdClass;
		$record->id = $id;

		// Get the category which the article is being added to
		if (!empty($data['catid']))
		{
			$catId = (int) $data['catid'];
		}
		else
		{
			$catIds  = $form->getValue('catid');

			$catId = is_array($catIds)
				? (int) reset($catIds)
				: (int) $catIds;

			if (!$catId)
			{
				$catId = (int) $form->getFieldAttribute('catid', 'default', 0);
			}
		}

		$record->catid = $catId;

		// Modify the form based on Edit State access controls.
		if (!$this->canEditState($record))
		{
			// Disable fields for display.
			$form->setFieldAttribute('featured', 'disabled', 'true');
			$form->setFieldAttribute('ordering', 'disabled', 'true');
			$form->setFieldAttribute('publish_up', 'disabled', 'true');
			$form->setFieldAttribute('publish_down', 'disabled', 'true');
			$form->setFieldAttribute('state', 'disabled', 'true');

			// Disable fields while saving.
			// The controller has already verified this is an article you can edit.
			$form->setFieldAttribute('featured', 'filter', 'unset');
			$form->setFieldAttribute('ordering', 'filter', 'unset');
			$form->setFieldAttribute('publish_up', 'filter', 'unset');
			$form->setFieldAttribute('publish_down', 'filter', 'unset');
			$form->setFieldAttribute('state', 'filter', 'unset');
		}

		// Prevent messing with article language and category when editing existing article with associations
		$assoc = JLanguageAssociations::isEnabled();

		// Check if article is associated
		if ($this->getState('article.id') && $app->isClient('site') && $assoc)
		{
			$associations = JLanguageAssociations::getAssociations('com_content', '#__content', 'com_content.item', $id);

			// Make fields read only
			if (!empty($associations))
			{
				$form->setFieldAttribute('language', 'readonly', 'true');
				$form->setFieldAttribute('catid', 'readonly', 'true');
				$form->setFieldAttribute('language', 'filter', 'unset');
				$form->setFieldAttribute('catid', '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_content.edit.article.data', array());

		if (empty($data))
		{
			$data = $this->getItem();

			// Pre-select some filters (Status, Category, Language, Access) in edit form if those have been selected in Article Manager: Articles
			if ($this->getState('article.id') == 0)
			{
				$filters = (array) $app->getUserState('com_content.articles.filter');
				$data->set(
					'state',
					$app->input->getInt(
						'state',
						((isset($filters['published']) && $filters['published'] !== '') ? $filters['published'] : null)
					)
				);
				$data->set('catid', $app->input->getInt('catid', (!empty($filters['category_id']) ? $filters['category_id'] : 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')))
				);
			}
		}

		// If there are params fieldsets in the form it will fail with a registry object
		if (isset($data->params) && $data->params instanceof Registry)
		{
			$data->params = $data->params->toArray();
		}

		$this->preprocessData('com_content.article', $data);

		return $data;
	}

	/**
	 * Method to validate the form data.
	 *
	 * @param   JForm   $form   The form to validate against.
	 * @param   array   $data   The data to validate.
	 * @param   string  $group  The name of the field group to validate.
	 *
	 * @return  array|boolean  Array of filtered data if valid, false otherwise.
	 *
	 * @see     JFormRule
	 * @see     JFilterInput
	 * @since   3.7.0
	 */
	public function validate($form, $data, $group = null)
	{
		// Don't allow to change the users if not allowed to access com_users.
		if (!JFactory::getUser()->authorise('core.manage', 'com_users'))
		{
			if (isset($data['created_by']))
			{
				unset($data['created_by']);
			}
		}

		if (!JFactory::getUser()->authorise('core.admin', 'com_content'))
		{
			if (isset($data['rules']))
			{
				unset($data['rules']);
			}
		}

		return parent::validate($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;
		$filter = JFilterInput::getInstance();

		if (isset($data['metadata']) && isset($data['metadata']['author']))
		{
			$data['metadata']['author'] = $filter->clean($data['metadata']['author'], 'TRIM');
		}

		if (isset($data['created_by_alias']))
		{
			$data['created_by_alias'] = $filter->clean($data['created_by_alias'], 'TRIM');
		}

		if (isset($data['images']) && is_array($data['images']))
		{
			$registry = new Registry($data['images']);

			$data['images'] = (string) $registry;
		}

		JLoader::register('CategoriesHelper', JPATH_ADMINISTRATOR . '/components/com_categories/helpers/categories.php');

		// Create new category, if needed.
		$createCategory = true;

		// If category ID is provided, check if it's valid.
		if (is_numeric($data['catid']) && $data['catid'])
		{
			$createCategory = !CategoriesHelper::validateCategoryId($data['catid'], 'com_content');
		}

		// Save New Category
		if ($createCategory && $this->canCreateCategory())
		{
			$table = array();

			// Remove #new# prefix, if exists.
			$table['title'] = strpos($data['catid'], '#new#') === 0 ? substr($data['catid'], 5) : $data['catid'];
			$table['parent_id'] = 1;
			$table['extension'] = 'com_content';
			$table['language'] = $data['language'];
			$table['published'] = 1;

			// Create new category and get catid back
			$data['catid'] = CategoriesHelper::createCategory($table);
		}

		if (isset($data['urls']) && is_array($data['urls']))
		{
			$check = $input->post->get('jform', array(), 'array');

			foreach ($data['urls'] as $i => $url)
			{
				if ($url != false && ($i == 'urla' || $i == 'urlb' || $i == 'urlc'))
				{
					if (preg_match('~^#[a-zA-Z]{1}[a-zA-Z0-9-_:.]*$~', $check['urls'][$i]) == 1)
					{
						$data['urls'][$i] = $check['urls'][$i];
					}
					else
					{
						$data['urls'][$i] = JStringPunycode::urlToPunycode($url);
					}
				}
			}

			unset($check);

			$registry = new Registry($data['urls']);

			$data['urls'] = (string) $registry;
		}

		// 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['catid'], $data['alias'], $data['title']);
				$data['title'] = $title;
				$data['alias'] = $alias;
			}
			else
			{
				if ($data['alias'] == $origTable->alias)
				{
					$data['alias'] = '';
				}
			}

			$data['state'] = 0;
		}

		// Automatic handling of alias for empty fields
		if (in_array($input->get('task'), array('apply', 'save', 'save2new')) && (!isset($data['id']) || (int) $data['id'] == 0))
		{
			if ($data['alias'] == null)
			{
				if (JFactory::getConfig()->get('unicodeslugs') == 1)
				{
					$data['alias'] = JFilterOutput::stringURLUnicodeSlug($data['title']);
				}
				else
				{
					$data['alias'] = JFilterOutput::stringURLSafe($data['title']);
				}

				$table = JTable::getInstance('Content', 'JTable');

				if ($table->load(array('alias' => $data['alias'], 'catid' => $data['catid'])))
				{
					$msg = JText::_('COM_CONTENT_SAVE_WARNING');
				}

				list($title, $alias) = $this->generateNewTitle($data['catid'], $data['alias'], $data['title']);
				$data['alias'] = $alias;

				if (isset($msg))
				{
					JFactory::getApplication()->enqueueMessage($msg, 'warning');
				}
			}
		}

		if (parent::save($data))
		{
			if (isset($data['featured']))
			{
				$this->featured($this->getState($this->getName() . '.id'), $data['featured']);
			}

			return true;
		}

		return false;
	}

	/**
	 * Method to toggle the featured setting of articles.
	 *
	 * @param   array    $pks    The ids of the items to toggle.
	 * @param   integer  $value  The value to toggle to.
	 *
	 * @return  boolean  True on success.
	 */
	public function featured($pks, $value = 0)
	{
		// Sanitize the ids.
		$pks = (array) $pks;
		$pks = ArrayHelper::toInteger($pks);

		if (empty($pks))
		{
			$this->setError(JText::_('COM_CONTENT_NO_ITEM_SELECTED'));

			return false;
		}

		$table = $this->getTable('Featured', 'ContentTable');

		try
		{
			$db = $this->getDbo();
			$query = $db->getQuery(true)
				->update($db->quoteName('#__content'))
				->set('featured = ' . (int) $value)
				->where('id IN (' . implode(',', $pks) . ')');
			$db->setQuery($query);
			$db->execute();

			if ((int) $value == 0)
			{
				// Adjust the mapping table.
				// Clear the existing features settings.
				$query = $db->getQuery(true)
					->delete($db->quoteName('#__content_frontpage'))
					->where('content_id IN (' . implode(',', $pks) . ')');
				$db->setQuery($query);
				$db->execute();
			}
			else
			{
				// First, we find out which of our new featured articles are already featured.
				$query = $db->getQuery(true)
					->select('f.content_id')
					->from('#__content_frontpage AS f')
					->where('content_id IN (' . implode(',', $pks) . ')');
				$db->setQuery($query);

				$oldFeatured = $db->loadColumn();

				// We diff the arrays to get a list of the articles that are newly featured
				$newFeatured = array_diff($pks, $oldFeatured);

				// Featuring.
				$tuples = array();

				foreach ($newFeatured as $pk)
				{
					$tuples[] = $pk . ', 0';
				}

				if (count($tuples))
				{
					$columns = array('content_id', 'ordering');
					$query = $db->getQuery(true)
						->insert($db->quoteName('#__content_frontpage'))
						->columns($db->quoteName($columns))
						->values($tuples);
					$db->setQuery($query);
					$db->execute();
				}
			}
		}
		catch (Exception $e)
		{
			$this->setError($e->getMessage());

			return false;
		}

		$table->reorder();

		$this->cleanCache();

		return true;
	}

	/**
	 * A protected method to get a set of ordering conditions.
	 *
	 * @param   object  $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);
	}

	/**
	 * 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.0
	 */
	protected function preprocessForm(JForm $form, $data, $group = 'content')
	{
		if ($this->canCreateCategory())
		{
			$form->setFieldAttribute('catid', 'allowAdd', 'true');

			// Add a prefix for categories created on the fly.
			$form->setFieldAttribute('catid', 'customPrefix', '#new#');
		}

		// Association content items
		if (JLanguageAssociations::isEnabled())
		{
			$languages = JLanguageHelper::getContentLanguages(false, true, null, 'ordering', 'asc');

			if (count($languages) > 1)
			{
				$addform = new SimpleXMLElement('<form />');
				$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_article');
					$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');
					$field->addAttribute('propagate', 'true');
				}

				$form->load($addform, false);
			}
		}

		parent::preprocessForm($form, $data, $group);
	}

	/**
	 * Custom clean the cache of com_content and content modules
	 *
	 * @param   string   $group     The cache group
	 * @param   integer  $clientId  The ID of the client
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function cleanCache($group = null, $clientId = 0)
	{
		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');
	}

	/**
	 * Void hit function for pagebreak when editing content from frontend
	 *
	 * @return  void
	 *
	 * @since   3.6.0
	 */
	public function hit()
	{
		return;
	}

	/**
	 * 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_content');
	}

	/**
	 * Delete #__content_frontpage items if the deleted articles was featured
	 *
	 * @param   object  $pks  The primary key related to the contents that was deleted.
	 *
	 * @return  boolean
	 *
	 * @since   3.7.0
	 */
	public function delete(&$pks)
	{
		$return = parent::delete($pks);

		if ($return)
		{
			// Now check to see if this articles was featured if so delete it from the #__content_frontpage table
			$db = $this->getDbo();
			$query = $db->getQuery(true)
				->delete($db->quoteName('#__content_frontpage'))
				->where('content_id IN (' . implode(',', $pks) . ')');
			$db->setQuery($query);
			$db->execute();
		}

		return $return;
	}
}
components/com_content/models/feature.php000060400000002300152453623450014670 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('ContentModelArticle', __DIR__ . '/article.php');

/**
 * Feature model.
 *
 * @since  1.6
 */
class ContentModelFeature extends ContentModelArticle
{
	/**
	 * 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 = 'Featured', $prefix = 'ContentTable', $config = array())
	{
		return JTable::getInstance($type, $prefix, $config);
	}

	/**
	 * A protected method to get a set of ordering conditions.
	 *
	 * @param   object  $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();
	}
}
components/com_content/models/featured.php000060400000020404152453623450015041 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

JLoader::register('ContentModelArticles', __DIR__ . '/articles.php');

/**
 * Methods supporting a list of featured article records.
 *
 * @since  1.6
 */
class ContentModelFeatured extends ContentModelArticles
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JControllerLegacy
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'title', 'a.title',
				'alias', 'a.alias',
				'checked_out', 'a.checked_out',
				'checked_out_time', 'a.checked_out_time',
				'catid', 'a.catid', 'category_title',
				'state', 'a.state',
				'access', 'a.access', 'access_level',
				'created', 'a.created',
				'created_by', 'a.created_by',
				'created_by_alias', 'a.created_by_alias',
				'ordering', 'a.ordering',
				'featured', 'a.featured',
				'language', 'a.language',
				'hits', 'a.hits',
				'publish_up', 'a.publish_up',
				'publish_down', 'a.publish_down',
				'fp.ordering',
				'published', 'a.published',
				'author_id',
				'category_id',
				'level',
				'tag',
				'rating_count', 'rating',
			);
		}

		parent::__construct($config);
	}

	/**
	 * 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(
			$this->getState(
				'list.select',
				'a.id, a.title, a.alias, a.checked_out, a.checked_out_time, a.catid, a.state, a.access, a.created, a.hits,' .
					'a.created_by, a.featured, a.language, a.created_by_alias, a.publish_up, a.publish_down, a.note'
			)
		);
		$query->from('#__content 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 content table.
		$query->select('fp.ordering')
			->join('INNER', '#__content_frontpage AS fp ON fp.content_id = a.id');

		// 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 categories.
		$query->select('c.title AS category_title, c.created_user_id AS category_uid, c.level AS category_level')
			->join('LEFT', '#__categories AS c ON c.id = a.catid');

		// Join over the parent categories.
		$query->select('parent.title AS parent_category_title, parent.id AS parent_category_id, 
								parent.created_user_id AS parent_category_uid, parent.level AS parent_category_level')
			->join('LEFT', '#__categories AS parent ON parent.id = c.parent_id');

		// Join over the users for the author.
		$query->select('ua.name AS author_name')
			->join('LEFT', '#__users AS ua ON ua.id = a.created_by');

		// Join on voting table
		if (JPluginHelper::isEnabled('content', 'vote'))
		{
			$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.
		$access = $this->getState('filter.access');

		if (is_numeric($access))
		{
			$query->where('a.access = ' . (int) $access);
		}
		elseif (is_array($access))
		{
			$access = ArrayHelper::toInteger($access);
			$access = implode(',', $access);
			$query->where('a.access IN (' . $access . ')');
		}

		// Filter by access level on categories.
		if (!$user->authorise('core.admin'))
		{
			$groups = implode(',', $user->getAuthorisedViewLevels());
			$query->where('a.access IN (' . $groups . ')');
			$query->where('c.access IN (' . $groups . ')');
		}

		// Filter by published state
		$published = $this->getState('filter.published');

		if (is_numeric($published))
		{
			$query->where('a.state = ' . (int) $published);
		}
		elseif ($published === '')
		{
			$query->where('(a.state = 0 OR a.state = 1)');
		}

		// Filter by a single or group of categories.
		$baselevel = 1;
		$categoryId = $this->getState('filter.category_id');

		if (is_array($categoryId) && count($categoryId) === 1)
		{
			$cat_tbl = JTable::getInstance('Category', 'JTable');
			$cat_tbl->load($categoryId[0]);
			$rgt = $cat_tbl->rgt;
			$lft = $cat_tbl->lft;
			$baselevel = (int) $cat_tbl->level;
			$query->where('c.lft >= ' . (int) $lft)
				->where('c.rgt <= ' . (int) $rgt);
		}
		elseif (is_array($categoryId))
		{
			$categoryId = implode(',', ArrayHelper::toInteger($categoryId));
			$query->where('a.catid IN (' . $categoryId . ')');
		}

		// Filter on the level.
		if ($level = $this->getState('filter.level'))
		{
			$query->where('c.level <= ' . ((int) $level + (int) $baselevel - 1));
		}

		// Filter by author
		$authorId = $this->getState('filter.author_id');

		if (is_numeric($authorId))
		{
			$type = $this->getState('filter.author_id.include', true) ? '= ' : '<>';
			$query->where('a.created_by ' . $type . (int) $authorId);
		}
		elseif (is_array($authorId))
		{
			$authorId = ArrayHelper::toInteger($authorId);
			$authorId = implode(',', $authorId);
			$query->where('a.created_by IN (' . $authorId . ')');
		}

		// 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));
			}
			elseif (stripos($search, 'author:') === 0)
			{
				$search = $db->quote('%' . $db->escape(substr($search, 7), true) . '%');
				$query->where('(ua.name LIKE ' . $search . ' OR ua.username LIKE ' . $search . ')');
			}
			elseif (stripos($search, 'content:') === 0)
			{
				$search = $db->quote('%' . $db->escape(substr($search, 8), true) . '%');
				$query->where('(a.introtext LIKE ' . $search . ' OR a.fulltext LIKE ' . $search . ')');
			}
			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 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->join('INNER', '(' . (string) $subQuery . ') AS tagmap ON tagmap.content_item_id = a.id');
			}
		}
		elseif ($tagId)
		{
			$query->join(
				'INNER',
				$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.
		$orderCol  = $this->state->get('list.ordering', 'a.title');
		$orderDirn = $this->state->get('list.direction', 'ASC');

		$query->order($db->escape($orderCol) . ' ' . $db->escape($orderDirn));

		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.5
	 */
	protected function populateState($ordering = 'a.title', $direction = 'asc')
	{
		parent::populateState($ordering, $direction);
	}
}
components/com_content/models/forms/article.xml000060400000055206152453623450016034 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset addfieldpath="/administrator/components/com_categories/models/fields" >
		<field
			name="id"
			type="number"
			label="JGLOBAL_FIELD_ID_LABEL"
			description="JGLOBAL_FIELD_ID_DESC"
			class="readonly"
			size="10"
			default="0"
			readonly="true"
		/>

		<field
			name="asset_id"
			type="hidden"
			filter="unset"
		/>

		<field
			name="title"
			type="text"
			label="JGLOBAL_TITLE"
			description="JFIELD_TITLE_DESC"
			class="input-xxlarge input-large-text"
			size="40"
			required="true"
		/>

		<field
			name="alias"
			type="text"
			label="JFIELD_ALIAS_LABEL"
			description="JFIELD_ALIAS_DESC"
			hint="JFIELD_ALIAS_PLACEHOLDER"
			size="40"
		/>

		<field
			name="note"
			type="text"
			label="COM_CONTENT_FIELD_NOTE_LABEL"
			description="COM_CONTENT_FIELD_NOTE_DESC"
			class="span12"
			size="40"
			maxlength="255"
		/>

		<field
			name="version_note"
			type="text"
			label="JGLOBAL_FIELD_VERSION_NOTE_LABEL"
			description="JGLOBAL_FIELD_VERSION_NOTE_DESC"
			class="span12"
			maxlength="255"
			size="45"
		/>

		<field
			name="articletext"
			type="editor"
			label="COM_CONTENT_FIELD_ARTICLETEXT_LABEL"
			description="COM_CONTENT_FIELD_ARTICLETEXT_DESC"
			filter="JComponentHelper::filterText"
			buttons="true"
		/>

		<field
			name="state"
			type="list"
			label="JSTATUS"
			description="JFIELD_PUBLISHED_DESC"
			class="chzn-color-state"
			filter="intval"
			size="1"
			default="1"
			>
			<option value="1">JPUBLISHED</option>
			<option value="0">JUNPUBLISHED</option>
			<option value="2">JARCHIVED</option>
			<option value="-2">JTRASHED</option>
		</field>

		<field
			name="catid"
			type="categoryedit"
			label="JCATEGORY"
			description="JFIELD_CATEGORY_DESC"
			required="true"
			default=""
		/>

		<field
			name="tags"
			type="tag"
			label="JTAG"
			description="JTAG_DESC"
			class="span12"
			multiple="true"
		/>

		<field
			name="buttonspacer"
			type="spacer"
			description="JGLOBAL_ACTION_PERMISSIONS_DESCRIPTION"
		/>

		<field
			name="created"
			type="calendar"
			label="COM_CONTENT_FIELD_CREATED_LABEL"
			description="COM_CONTENT_FIELD_CREATED_DESC"
			translateformat="true"
			showtime="true"
			size="22"
			filter="user_utc"
		/>

		<field
			name="created_by"
			type="user"
			label="COM_CONTENT_FIELD_CREATED_BY_LABEL"
			description="COM_CONTENT_FIELD_CREATED_BY_DESC"
		/>

		<field
			name="created_by_alias"
			type="text"
			label="COM_CONTENT_FIELD_CREATED_BY_ALIAS_LABEL"
			description="COM_CONTENT_FIELD_CREATED_BY_ALIAS_DESC"
			size="20"
		/>

		<field
			name="modified"
			type="calendar"
			label="JGLOBAL_FIELD_MODIFIED_LABEL"
			description="COM_CONTENT_FIELD_MODIFIED_DESC"
			class="readonly"
			translateformat="true"
			showtime="true"
			size="22"
			readonly="true"
			filter="user_utc"
		/>

		<field
			name="modified_by"
			type="user"
			label="JGLOBAL_FIELD_MODIFIED_BY_LABEL"
			class="readonly"
			readonly="true"
			filter="unset"
		/>

		<field
			name="checked_out"
			type="hidden"
			filter="unset"
		/>

		<field
			name="checked_out_time"
			type="hidden"
			filter="unset"
		/>

		<field
			name="publish_up"
			type="calendar"
			label="COM_CONTENT_FIELD_PUBLISH_UP_LABEL"
			description="COM_CONTENT_FIELD_PUBLISH_UP_DESC"
			translateformat="true"
			showtime="true"
			size="22"
			filter="user_utc"
		/>

		<field
			name="publish_down"
			type="calendar"
			label="COM_CONTENT_FIELD_PUBLISH_DOWN_LABEL"
			description="COM_CONTENT_FIELD_PUBLISH_DOWN_DESC"
			translateformat="true"
			showtime="true"
			size="22"
			filter="user_utc"
		/>

		<field
			name="version"
			type="text"
			label="COM_CONTENT_FIELD_VERSION_LABEL"
			description="COM_CONTENT_FIELD_VERSION_DESC"
			size="6"
			class="readonly"
			readonly="true"
			filter="unset"
		/>

		<field
			name="ordering"
			type="text"
			label="JFIELD_ORDERING_LABEL"
			description="JFIELD_ORDERING_DESC"
			size="6"
			default="0"
		/>

		<field
			name="metakey"
			type="textarea"
			label="JFIELD_META_KEYWORDS_LABEL"
			description="JFIELD_META_KEYWORDS_DESC"
			rows="3"
			cols="30"
		/>

		<field
			name="metadesc"
			type="textarea"
			label="JFIELD_META_DESCRIPTION_LABEL"
			description="JFIELD_META_DESCRIPTION_DESC"
			rows="3"
			cols="30"
		/>

		<field
			name="access"
			type="accesslevel"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			size="1"
		/>

		<field
			name="hits"
			type="number"
			label="JGLOBAL_HITS"
			description="COM_CONTENT_FIELD_HITS_DESC"
			class="readonly"
			size="6"
			readonly="true"
			filter="unset"
		/>

		<field
			name="language"
			type="contentlanguage"
			label="JFIELD_LANGUAGE_LABEL"
			description="COM_CONTENT_FIELD_LANGUAGE_DESC"
			>
			<option value="*">JALL</option>
		</field>

		<field
			name="featured"
			type="radio"
			label="JFEATURED"
			description="COM_CONTENT_FIELD_FEATURED_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="rules"
			type="rules"
			label="JFIELD_RULES_LABEL"
			translate_label="false"
			filter="rules"
			component="com_content"
			section="article"
			validate="rules"
		/>

	</fieldset>

	<fields name="attribs" label="COM_CONTENT_ATTRIBS_FIELDSET_LABEL">
		<fieldset name="basic" label="COM_CONTENT_ATTRIBS_FIELDSET_LABEL">

			<field
				name="article_layout"
				type="componentlayout"
				label="JFIELD_ALT_LAYOUT_LABEL"
				description="JFIELD_ALT_COMPONENT_LAYOUT_DESC"
				useglobal="true"
				extension="com_content"
				view="article"
			/>

			<field
				name="show_title"
				type="list"
				label="JGLOBAL_SHOW_TITLE_LABEL"
				description="JGLOBAL_SHOW_TITLE_DESC"
				class="chzn-color"
				useglobal="true"
				>
				<option value="1">JSHOW</option>
				<option value="0">JHIDE</option>
			</field>

			<field
				name="link_titles"
				type="list"
				label="JGLOBAL_LINKED_TITLES_LABEL"
				description="JGLOBAL_LINKED_TITLES_DESC"
				class="chzn-color"
				useglobal="true"
				>
				<option	value="0">JNO</option>
				<option value="1">JYES</option>
			</field>

			<field
				name="show_tags"
				type="list"
				label="COM_CONTENT_FIELD_SHOW_TAGS_LABEL"
				description="COM_CONTENT_FIELD_SHOW_TAGS_DESC"
				class="chzn-color"
				useglobal="true"
				>
				<option value="1">JSHOW</option>
				<option value="0">JHIDE</option>
			</field>

			<field
				name="show_intro"
				type="list"
				label="JGLOBAL_SHOW_INTRO_LABEL"
				description="JGLOBAL_SHOW_INTRO_DESC"
				class="chzn-color"
				useglobal="true"
				>
				<option value="1">JSHOW</option>
				<option value="0">JHIDE</option>
			</field>

			<field
				name="info_block_position"
				type="list"
				label="COM_CONTENT_FIELD_INFOBLOCK_POSITION_LABEL"
				description="COM_CONTENT_FIELD_INFOBLOCK_POSITION_DESC"
				useglobal="true"
				>
				<option value="0">COM_CONTENT_FIELD_OPTION_ABOVE</option>
				<option value="1">COM_CONTENT_FIELD_OPTION_BELOW</option>
				<option value="2">COM_CONTENT_FIELD_OPTION_SPLIT</option>
			</field>

			<field
				name="info_block_show_title"
				type="list"
				label="COM_CONTENT_FIELD_INFOBLOCK_TITLE_LABEL"
				description="COM_CONTENT_FIELD_INFOBLOCK_TITLE_DESC"
				class="chzn-color"
				useglobal="true"
				>
				<option	value="0">JHIDE</option>
				<option	value="1">JSHOW</option>
			</field>

			<field
				name="show_category"
				type="list"
				label="JGLOBAL_SHOW_CATEGORY_LABEL"
				description="JGLOBAL_SHOW_CATEGORY_DESC"
				useglobal="true"
				class="chzn-color"
				>
				<option	value="0">JHIDE</option>
				<option	value="1">JSHOW</option>
			</field>

			<field
				name="link_category"
				type="list"
				label="JGLOBAL_LINK_CATEGORY_LABEL"
				description="JGLOBAL_LINK_CATEGORY_DESC"
				useglobal="true"
				class="chzn-color"
				>
				<option	value="0">JNO</option>
				<option	value="1">JYES</option>
			</field>

			<field
				name="show_parent_category"
				type="list"
				label="JGLOBAL_SHOW_PARENT_CATEGORY_LABEL"
				description="JGLOBAL_SHOW_PARENT_CATEGORY_DESC"
				useglobal="true"
				class="chzn-color"
				>
				<option	value="0">JHIDE</option>
				<option	value="1">JSHOW</option>
			</field>

			<field
				name="link_parent_category"
				type="list"
				label="JGLOBAL_LINK_PARENT_CATEGORY_LABEL"
				description="JGLOBAL_LINK_PARENT_CATEGORY_DESC"
				useglobal="true"
				class="chzn-color"
				>
				<option	value="0">JNO</option>
				<option	value="1">JYES</option>
			</field>

			<field
				name="show_associations"
				type="list"
				label="JGLOBAL_SHOW_ASSOCIATIONS_LABEL"
				description="JGLOBAL_SHOW_ASSOCIATIONS_DESC"
				class="chzn-color"
				useglobal="true"
				>
				<option value="1">JSHOW</option>
				<option value="0">JHIDE</option>
			</field>

			<field
				name="show_author"
				type="list"
				label="JGLOBAL_SHOW_AUTHOR_LABEL"
				description="JGLOBAL_SHOW_AUTHOR_DESC"
				useglobal="true"
				class="chzn-color"
				>
				<option	value="0">JHIDE</option>
				<option	value="1">JSHOW</option>
			</field>

			<field
				name="link_author"
				type="list"
				label="JGLOBAL_LINK_AUTHOR_LABEL"
				description="JGLOBAL_LINK_AUTHOR_DESC"
				useglobal="true"
				class="chzn-color"
				>
				<option	value="0">JNO</option>
				<option	value="1">JYES</option>
			</field>

			<field
				name="show_create_date"
				type="list"
				label="JGLOBAL_SHOW_CREATE_DATE_LABEL"
				description="JGLOBAL_SHOW_CREATE_DATE_DESC"
				useglobal="true"
				class="chzn-color"
				>
				<option	value="0">JHIDE</option>
				<option	value="1">JSHOW</option>
			</field>

			<field
				name="show_modify_date"
				type="list"
				label="JGLOBAL_SHOW_MODIFY_DATE_LABEL"
				description="JGLOBAL_SHOW_MODIFY_DATE_DESC"
				useglobal="true"
				class="chzn-color"
				>
				<option	value="0">JHIDE</option>
				<option	value="1">JSHOW</option>
			</field>

			<field
				name="show_publish_date"
				type="list"
				label="JGLOBAL_SHOW_PUBLISH_DATE_LABEL"
				description="JGLOBAL_SHOW_PUBLISH_DATE_DESC"
				class="chzn-color"
				useglobal="true"
				>
				<option	value="0">JHIDE</option>
				<option	value="1">JSHOW</option>
			</field>

			<field
				name="show_item_navigation"
				type="list"
				label="JGLOBAL_SHOW_NAVIGATION_LABEL"
				description="JGLOBAL_SHOW_NAVIGATION_DESC"
				useglobal="true"
				class="chzn-color"
				>
				<option value="0">JHIDE</option>
				<option	value="1">JSHOW</option>
			</field>

			<field
				name="show_icons"
				type="list"
				label="JGLOBAL_SHOW_ICONS_LABEL"
				description="JGLOBAL_SHOW_ICONS_DESC"
				useglobal="true"
				class="chzn-color"
				>
				<option	value="0">JHIDE</option>
				<option	value="1">JSHOW</option>
			</field>

			<field
				name="show_print_icon"
				type="list"
				label="JGLOBAL_SHOW_PRINT_ICON_LABEL"
				description="JGLOBAL_SHOW_PRINT_ICON_DESC"
				useglobal="true"
				class="chzn-color"
				>
				<option	value="0">JHIDE</option>
				<option	value="1">JSHOW</option>
			</field>

			<field
				name="show_email_icon"
				type="list"
				label="JGLOBAL_SHOW_EMAIL_ICON_LABEL"
				description="JGLOBAL_SHOW_EMAIL_ICON_DESC"
				useglobal="true"
				class="chzn-color"
				>
				<option	value="0">JHIDE</option>
				<option	value="1">JSHOW</option>
			</field>

			<field
				name="show_vote"
				type="list"
				label="JGLOBAL_SHOW_VOTE_LABEL"
				description="JGLOBAL_SHOW_VOTE_DESC"
				useglobal="true"
				class="chzn-color"
				>
				<option value="0">JHIDE</option>
				<option	value="1">JSHOW</option>
			</field>

			<field
				name="show_hits"
				type="list"
				label="JGLOBAL_SHOW_HITS_LABEL"
				description="JGLOBAL_SHOW_HITS_DESC"
				useglobal="true"
				class="chzn-color"
				>
				<option	value="0">JHIDE</option>
				<option	value="1">JSHOW</option>
			</field>

			<field
				name="show_noauth"
				type="list"
				label="JGLOBAL_SHOW_UNAUTH_LINKS_LABEL"
				description="JGLOBAL_SHOW_UNAUTH_LINKS_DESC"
				useglobal="true"
				class="chzn-color"
				>
				<option value="0">JNO</option>
				<option value="1">JYES</option>
			</field>

			<field
				name="urls_position"
				type="list"
				label="COM_CONTENT_FIELD_URLSPOSITION_LABEL"
				description="COM_CONTENT_FIELD_URLSPOSITION_DESC"
				useglobal="true"
				class="chzn-color"
				>
				<option value="0">COM_CONTENT_FIELD_OPTION_ABOVE</option>
				<option value="1">COM_CONTENT_FIELD_OPTION_BELOW</option>
			</field>

			<field
				name="spacer2"
				type="spacer"
				hr="true"
			/>

			<field
				name="alternative_readmore"
				type="text"
				label="JFIELD_READMORE_LABEL"
				description="JFIELD_READMORE_DESC"
				size="25"
			/>

			<field
				name="article_page_title"
				type="text"
				label="COM_CONTENT_FIELD_BROWSER_PAGE_TITLE_LABEL"
				description="COM_CONTENT_FIELD_BROWSER_PAGE_TITLE_DESC"
				size="25"
			/>
		</fieldset>

		<fieldset name="editorConfig" label="COM_CONTENT_EDITORCONFIG_FIELDSET_LABEL">
			<field
				name="show_publishing_options"
				type="list"
				label="COM_CONTENT_SHOW_PUBLISHING_OPTIONS_LABEL"
				description="COM_CONTENT_SHOW_PUBLISHING_OPTIONS_DESC"
				default=""
				useglobal="true"
				class="chzn-color"
				>
				<option value="0">JNO</option>
				<option value="1">JYES</option>
			</field>

			<field
				name="show_article_options"
				type="list"
				label="COM_CONTENT_SHOW_ARTICLE_OPTIONS_LABEL"
				description="COM_CONTENT_SHOW_ARTICLE_OPTIONS_DESC"
				default=""
				useglobal="true"
				class="chzn-color"
				>
				<option value="0">JNO</option>
				<option value="1">JYES</option>
			</field>

			<field
				name="show_urls_images_backend"
				type="list"
				label="COM_CONTENT_SHOW_IMAGES_URLS_BACK_LABEL"
				description="COM_CONTENT_SHOW_IMAGES_URLS_BACK_DESC"
				useglobal="true"
				class="chzn-color"
				default=""
				>
				<option value="0">JNO</option>
				<option value="1">JYES</option>
			</field>

			<field
				name="show_urls_images_frontend"
				type="list"
				label="COM_CONTENT_SHOW_IMAGES_URLS_FRONT_LABEL"
				description="COM_CONTENT_SHOW_IMAGES_URLS_FRONT_DESC"
				useglobal="true"
				class="chzn-color"
				default=""
				>
				<option value="0">JNO</option>
				<option value="1">JYES</option>
			</field>
		</fieldset>

		<fieldset name="basic-limited" label="COM_CONTENT_ATTRIBS_FIELDSET_LABEL">
			<field
				name="show_title"
				type="hidden"
				label="JGLOBAL_SHOW_TITLE_LABEL"
				description="JGLOBAL_SHOW_TITLE_DESC"
			/>

			<field
				name="link_titles"
				type="hidden"
				label="JGLOBAL_LINKED_TITLES_LABEL"
				description="JGLOBAL_LINKED_TITLES_DESC"
			/>

			<field
				name="show_intro"
				type="hidden"
				label="JGLOBAL_SHOW_INTRO_LABEL"
				description="JGLOBAL_SHOW_INTRO_DESC"
			/>

			<field
				name="show_category"
				type="hidden"
				label="JGLOBAL_SHOW_CATEGORY_LABEL"
				description="JGLOBAL_SHOW_CATEGORY_DESC"
			/>

			<field
				name="link_category"
				type="hidden"
				label="JGLOBAL_LINK_CATEGORY_LABEL"
				description="JGLOBAL_LINK_CATEGORY_DESC"
			/>

			<field
				name="show_parent_category"
				type="hidden"
				label="JGLOBAL_SHOW_PARENT_CATEGORY_LABEL"
				description="JGLOBAL_SHOW_PARENT_CATEGORY_DESC"
			/>

			<field
				name="link_parent_category"
				type="hidden"
				label="JGLOBAL_LINK_PARENT_CATEGORY_LABEL"
				description="JGLOBAL_LINK_PARENT_CATEGORY_DESC"
			/>

			<field
				name="show_author"
				type="hidden"
				label="JGLOBAL_SHOW_AUTHOR_LABEL"
				description="JGLOBAL_SHOW_AUTHOR_DESC"
			/>

			<field
				name="link_author"
				type="hidden"
				label="JGLOBAL_LINK_AUTHOR_LABEL"
				description="JGLOBAL_LINK_AUTHOR_DESC"
			/>

			<field
				name="show_create_date"
				type="hidden"
				label="JGLOBAL_SHOW_CREATE_DATE_LABEL"
				description="JGLOBAL_SHOW_CREATE_DATE_DESC"
			/>

			<field
				name="show_modify_date"
				type="hidden"
				label="JGLOBAL_SHOW_MODIFY_DATE_LABEL"
				description="JGLOBAL_SHOW_MODIFY_DATE_DESC"
			/>

			<field
				name="show_publish_date"
				type="hidden"
				label="JGLOBAL_SHOW_PUBLISH_DATE_LABEL"
				description="JGLOBAL_SHOW_PUBLISH_DATE_DESC"
			/>

			<field
				name="show_item_navigation"
				type="hidden"
				label="JGLOBAL_SHOW_NAVIGATION_LABEL"
				description="JGLOBAL_SHOW_NAVIGATION_DESC"
			/>

			<field
				name="show_icons"
				type="hidden"
				label="JGLOBAL_SHOW_ICONS_LABEL"
				description="JGLOBAL_SHOW_ICONS_DESC"
			/>

			<field
				name="show_print_icon"
				type="hidden"
				label="JGLOBAL_SHOW_PRINT_ICON_LABEL"
				description="JGLOBAL_SHOW_PRINT_ICON_DESC"
			/>

			<field
				name="show_email_icon"
				type="hidden"
				label="JGLOBAL_SHOW_EMAIL_ICON_LABEL"
				description="JGLOBAL_SHOW_EMAIL_ICON_DESC"
			/>

			<field
				name="show_vote"
				type="hidden"
				label="JGLOBAL_SHOW_VOTE_LABEL"
				description="JGLOBAL_SHOW_VOTE_DESC"
			/>

			<field
				name="show_hits"
				type="hidden"
				label="JGLOBAL_SHOW_HITS_LABEL"
				description="JGLOBAL_SHOW_HITS_DESC"
			/>

			<field
				name="show_noauth"
				type="hidden"
				label="JGLOBAL_SHOW_UNAUTH_LINKS_LABEL"
				description="JGLOBAL_SHOW_UNAUTH_LINKS_DESC"
			/>

			<field
				name="alternative_readmore"
				type="hidden"
				label="JFIELD_READMORE_LABEL"
				description="JFIELD_READMORE_DESC"
				size="25"
			/>

			<field
				name="article_layout"
				type="hidden"
				label="JFIELD_ALT_LAYOUT_LABEL"
				description="JFIELD_ALT_COMPONENT_LAYOUT_DESC"
				useglobal="true"
				extension="com_content" view="article"
			/>
		</fieldset>
	</fields>

	<field
		name="xreference"
		type="text"
		label="JFIELD_KEY_REFERENCE_LABEL"
		description="JFIELD_KEY_REFERENCE_DESC"
		size="20"
	/>

	<fields name="images" label="COM_CONTENT_FIELD_IMAGE_OPTIONS">
		<field
			name="image_intro"
			type="media"
			label="COM_CONTENT_FIELD_INTRO_LABEL"
			description="COM_CONTENT_FIELD_INTRO_DESC"
		/>

		<field
			name="float_intro"
			type="list"
			label="COM_CONTENT_FLOAT_LABEL"
			description="COM_CONTENT_FLOAT_DESC"
			useglobal="true"
			>
			<option value="right">COM_CONTENT_RIGHT</option>
			<option value="left">COM_CONTENT_LEFT</option>
			<option value="none">COM_CONTENT_NONE</option>
		</field>

		<field
			name="image_intro_alt"
			type="text"
			label="COM_CONTENT_FIELD_IMAGE_ALT_LABEL"
			description="COM_CONTENT_FIELD_IMAGE_ALT_DESC"
			size="20"
		/>

		<field
			name="image_intro_caption"
			type="text"
			label="COM_CONTENT_FIELD_IMAGE_CAPTION_LABEL"
			description="COM_CONTENT_FIELD_IMAGE_CAPTION_DESC"
			size="20"
		/>

		<field
			name="spacer1"
			type="spacer"
			hr="true"
		/>

		<field
			name="image_fulltext"
			type="media"
			label="COM_CONTENT_FIELD_FULL_LABEL"
			description="COM_CONTENT_FIELD_FULL_DESC"
		/>

		<field
			name="float_fulltext"
			type="list"
			label="COM_CONTENT_FLOAT_LABEL"
			description="COM_CONTENT_FLOAT_DESC"
			useglobal="true"
			>
			<option value="right">COM_CONTENT_RIGHT</option>
			<option value="left">COM_CONTENT_LEFT</option>
			<option value="none">COM_CONTENT_NONE</option>
		</field>

		<field
			name="image_fulltext_alt"
			type="text"
			label="COM_CONTENT_FIELD_IMAGE_ALT_LABEL"
			description="COM_CONTENT_FIELD_IMAGE_ALT_DESC"
			size="20"
		/>

		<field
			name="image_fulltext_caption"
			type="text"
			label="COM_CONTENT_FIELD_IMAGE_CAPTION_LABEL"
			description="COM_CONTENT_FIELD_IMAGE_CAPTION_DESC"
			size="20"
		/>
	</fields>
	<fields name="urls" label="COM_CONTENT_FIELD_URLS_OPTIONS">
		<field
			name="urla"
			type="url"
			label="COM_CONTENT_FIELD_URLA_LABEL"
			description="COM_CONTENT_FIELD_URL_DESC"
			validate="url"
			filter="url"
			relative="true"
		/>

		<field
			name="urlatext"
			type="text"
			label="COM_CONTENT_FIELD_URLA_LINK_TEXT_LABEL"
			description="COM_CONTENT_FIELD_URL_LINK_TEXT_DESC"
			size="20"
		/>

		<field
			name="targeta"
			type="list"
			label="COM_CONTENT_URL_FIELD_BROWSERNAV_LABEL"
			description="COM_CONTENT_URL_FIELD_BROWSERNAV_DESC"
			default=""
			filter="options"
			useglobal="true"
			>
			<option value="0">JBROWSERTARGET_PARENT</option>
			<option value="1">JBROWSERTARGET_NEW</option>
			<option value="2">JBROWSERTARGET_POPUP</option>
			<option value="3">JBROWSERTARGET_MODAL</option>
		</field>

		<field
			name="spacer3"
			type="spacer"
			hr="true"
		/>

		<field
			name="urlb"
			type="url"
			label="COM_CONTENT_FIELD_URLB_LABEL"
			description="COM_CONTENT_FIELD_URL_DESC"
			validate="url"
			filter="url"
			relative="true"
		/>

		<field
			name="urlbtext"
			type="text"
			label="COM_CONTENT_FIELD_URLB_LINK_TEXT_LABEL"
			description="COM_CONTENT_FIELD_URL_LINK_TEXT_DESC"
			size="20"
		/>

		<field
			name="targetb"
			type="list"
			label="COM_CONTENT_URL_FIELD_BROWSERNAV_LABEL"
			description="COM_CONTENT_URL_FIELD_BROWSERNAV_DESC"
			default=""
			filter="options"
			useglobal="true"
			>
			<option value="0">JBROWSERTARGET_PARENT</option>
			<option value="1">JBROWSERTARGET_NEW</option>
			<option value="2">JBROWSERTARGET_POPUP</option>
			<option value="3">JBROWSERTARGET_MODAL</option>
		</field>

		<field
			name="spacer4"
			type="spacer"
			hr="true"
		/>

		<field
			name="urlc"
			type="url"
			label="COM_CONTENT_FIELD_URLC_LABEL"
			description="COM_CONTENT_FIELD_URL_DESC"
			validate="url"
			filter="url"
			relative="true"
		/>

		<field
			name="urlctext"
			type="text"
			label="COM_CONTENT_FIELD_URLC_LINK_TEXT_LABEL"
			description="COM_CONTENT_FIELD_URL_LINK_TEXT_DESC"
			size="20"
		/>

		<field
			name="targetc"
			type="list"
			label="COM_CONTENT_URL_FIELD_BROWSERNAV_LABEL"
			description="COM_CONTENT_URL_FIELD_BROWSERNAV_DESC"
			default=""
			filter="options"
			useglobal="true"
			>
			<option value="0">JBROWSERTARGET_PARENT</option>
			<option value="1">JBROWSERTARGET_NEW</option>
			<option value="2">JBROWSERTARGET_POPUP</option>
			<option value="3">JBROWSERTARGET_MODAL</option>
		</field>

	</fields>

	<fields name="metadata" label="JGLOBAL_FIELDSET_METADATA_OPTIONS">
		<fieldset name="jmetadata"
			label="JGLOBAL_FIELDSET_METADATA_OPTIONS">

			<field
				name="robots"
				type="list"
				label="JFIELD_METADATA_ROBOTS_LABEL"
				description="JFIELD_METADATA_ROBOTS_DESC"
				>
				<option value="">JGLOBAL_USE_GLOBAL</option>
				<option value="index, follow"></option>
				<option value="noindex, follow"></option>
				<option value="index, nofollow"></option>
				<option value="noindex, nofollow"></option>
			</field>

			<field
				name="author"
				type="text"
				label="JAUTHOR"
				description="JFIELD_METADATA_AUTHOR_DESC"
				size="20"
			/>

			<field
				name="rights"
				type="textarea"
				label="JFIELD_META_RIGHTS_LABEL"
				description="JFIELD_META_RIGHTS_DESC"
				filter="string"
				cols="30"
				rows="2"
			/>

			<field
				name="xreference"
				type="text"
				label="COM_CONTENT_FIELD_XREFERENCE_LABEL"
				description="COM_CONTENT_FIELD_XREFERENCE_DESC"
				size="20"
			/>

		</fieldset>
	</fields>
	<!-- These fields are used to get labels for the Content History Preview and Compare Views -->
	<fields>
		<field
			name="introtext"
			label="COM_CONTENT_FIELD_INTROTEXT"
		/>

		<field
			name="fulltext"
			label="COM_CONTENT_FIELD_FULLTEXT"
		/>
	</fields>

</form>
components/com_content/models/forms/filter_articles.xml000060400000011366152453623450017563 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_CONTENT_FILTER_SEARCH_LABEL"
			description="COM_CONTENT_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
		/>

		<field
			name="published"
			type="status"
			label="COM_CONTENT_FILTER_PUBLISHED"
			description="COM_CONTENT_FILTER_PUBLISHED_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>

		<field
			name="category_id"
			type="category"
			label="JOPTION_FILTER_CATEGORY"
			description="JOPTION_FILTER_CATEGORY_DESC"
			multiple="true"
			class="multipleCategories"
			extension="com_content"
			onchange="this.form.submit();"
			published="0,1,2"
		/>

		<field
			name="access"
			type="accesslevel"
			label="JOPTION_FILTER_ACCESS"
			description="JOPTION_FILTER_ACCESS_DESC"
			multiple="true"
			class="multipleAccessLevels"
			onchange="this.form.submit();"
		/>

		<field
			name="author_id"
			type="author"
			label="COM_CONTENT_FILTER_AUTHOR"
			description="COM_CONTENT_FILTER_AUTHOR_DESC"
			multiple="true"
			class="multipleAuthors"
			onchange="this.form.submit();"
			>
			<option value="0">JNONE</option>
		</field>

		<field
			name="language"
			type="contentlanguage"
			label="JOPTION_FILTER_LANGUAGE"
			description="JOPTION_FILTER_LANGUAGE_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_LANGUAGE</option>
			<option value="*">JALL</option>
		</field>

		<field
			name="tag"
			type="tag"
			label="JOPTION_FILTER_TAG"
			description="JOPTION_FILTER_TAG_DESC"
			multiple="true"
			class="multipleTags"
			mode="nested"
			onchange="this.form.submit();"
		/>

		<field
			name="level"
			type="integer"
			label="JOPTION_FILTER_LEVEL"
			description="JOPTION_FILTER_LEVEL_DESC"
			first="1"
			last="10"
			step="1"
			languages="*"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_MAX_LEVELS</option>
			</field>
		<input type="hidden" name="form_submited" value="1"/>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="COM_CONTENT_LIST_FULL_ORDERING"
			description="COM_CONTENT_LIST_FULL_ORDERING_DESC"
			onchange="this.form.submit();"
			default="a.id DESC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.state ASC">JSTATUS_ASC</option>
			<option value="a.state DESC">JSTATUS_DESC</option>
			<option value="a.featured ASC">JFEATURED_ASC</option>
			<option value="a.featured DESC">JFEATURED_DESC</option>
			<option value="a.title ASC">JGLOBAL_TITLE_ASC</option>
			<option value="a.title DESC">JGLOBAL_TITLE_DESC</option>
			<option value="category_title ASC">JCATEGORY_ASC</option>
			<option value="category_title DESC">JCATEGORY_DESC</option>
			<option value="a.access ASC">JGRID_HEADING_ACCESS_ASC</option>
			<option value="a.access DESC">JGRID_HEADING_ACCESS_DESC</option>
			<option value="association ASC" requires="associations">JASSOCIATIONS_ASC</option>
			<option value="association DESC" requires="associations">JASSOCIATIONS_DESC</option>
			<option value="a.created_by ASC">JAUTHOR_ASC</option>
			<option value="a.created_by DESC">JAUTHOR_DESC</option>
			<option value="language ASC">JGRID_HEADING_LANGUAGE_ASC</option>
			<option value="language DESC">JGRID_HEADING_LANGUAGE_DESC</option>
			<option value="a.created ASC">JDATE_ASC</option>
			<option value="a.created DESC">JDATE_DESC</option>
			<option value="a.modified ASC">COM_CONTENT_MODIFIED_ASC</option>
			<option value="a.modified DESC">COM_CONTENT_MODIFIED_DESC</option>
			<option value="a.publish_up ASC">COM_CONTENT_PUBLISH_UP_ASC</option>
			<option value="a.publish_up DESC">COM_CONTENT_PUBLISH_UP_DESC</option>
			<option value="a.publish_down ASC">COM_CONTENT_PUBLISH_DOWN_ASC</option>
			<option value="a.publish_down DESC">COM_CONTENT_PUBLISH_DOWN_DESC</option>
			<option value="a.hits ASC">JGLOBAL_HITS_ASC</option>
			<option value="a.hits DESC">JGLOBAL_HITS_DESC</option>
			<option value="rating_count ASC" requires="vote">JGLOBAL_VOTES_ASC</option>
			<option value="rating_count DESC" requires="vote">JGLOBAL_VOTES_DESC</option>
			<option value="rating ASC" requires="vote">JGLOBAL_RATINGS_ASC</option>
			<option value="rating DESC" requires="vote">JGLOBAL_RATINGS_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="COM_CONTENT_LIST_LIMIT"
			description="COM_CONTENT_LIST_LIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_content/models/forms/filter_featured.xml000060400000010400152453623450017540 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_CONTENT_FILTER_SEARCH_LABEL"
			description="COM_CONTENT_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
		/>

		<field
			name="published"
			type="status"
			label="COM_CONTENT_FILTER_PUBLISHED"
			description="COM_CONTENT_FILTER_PUBLISHED_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>

		<field
			name="category_id"
			type="category"
			label="JOPTION_FILTER_CATEGORY"
			description="JOPTION_FILTER_CATEGORY_DESC"
			multiple="true"
			class="multipleCategories"
			extension="com_content"
			onchange="this.form.submit();"
		/>

		<field
			name="level"
			type="integer"
			label="JOPTION_FILTER_LEVEL"
			description="JOPTION_FILTER_LEVEL_DESC"
			first="1"
			last="10"
			step="1"
			languages="*"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_MAX_LEVELS</option>
		</field>

		<field
			name="access"
			type="accesslevel"
			label="JOPTION_FILTER_ACCESS"
			description="JOPTION_FILTER_ACCESS_DESC"
			multiple="true"
			class="multipleAccessLevels"
			onchange="this.form.submit();"
		/>

		<field
			name="author_id"
			type="author"
			label="COM_CONTENT_FILTER_AUTHOR"
			description="COM_CONTENT_FILTER_AUTHOR_DESC"
			multiple="true"
			class="multipleAuthors"
			onchange="this.form.submit();"
			>
			<option value="0">JNONE</option>
		</field>

		<field
			name="language"
			type="contentlanguage"
			label="JOPTION_FILTER_LANGUAGE"
			description="JOPTION_FILTER_LANGUAGE_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_LANGUAGE</option>
			<option value="*">JALL</option>
		</field>

		<field
			name="tag"
			type="tag"
			label="JOPTION_FILTER_TAG"
			description="JOPTION_FILTER_TAG_DESC"
			multiple="true"
			class="multipleTags"
			mode="nested"
			onchange="this.form.submit();"
		/>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="COM_CONTENT_LIST_FULL_ORDERING"
			description="COM_CONTENT_LIST_FULL_ORDERING_DESC"
			onchange="this.form.submit();"
			default="a.title ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="fp.ordering ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="fp.ordering DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.state ASC">JSTATUS_ASC</option>
			<option value="a.state DESC">JSTATUS_DESC</option>
			<option value="a.title ASC">JGLOBAL_TITLE_ASC</option>
			<option value="a.title DESC">JGLOBAL_TITLE_DESC</option>
			<option value="category_title ASC">JCATEGORY_ASC</option>
			<option value="category_title DESC">JCATEGORY_DESC</option>
			<option value="a.access ASC">JGRID_HEADING_ACCESS_ASC</option>
			<option value="a.access DESC">JGRID_HEADING_ACCESS_DESC</option>
			<option value="a.created_by ASC">JAUTHOR_ASC</option>
			<option value="a.created_by DESC">JAUTHOR_DESC</option>
			<option value="a.publish_up ASC">COM_CONTENT_PUBLISH_UP_ASC</option>
			<option value="a.publish_up DESC">COM_CONTENT_PUBLISH_UP_DESC</option>
			<option value="a.publish_down ASC">COM_CONTENT_PUBLISH_DOWN_ASC</option>
			<option value="a.publish_down DESC">COM_CONTENT_PUBLISH_DOWN_DESC</option>
			<option value="language ASC">JGRID_HEADING_LANGUAGE_ASC</option>
			<option value="language DESC">JGRID_HEADING_LANGUAGE_DESC</option>
			<option value="a.created ASC">JDATE_ASC</option>
			<option value="a.created DESC">JDATE_DESC</option>
			<option value="a.hits ASC">JGLOBAL_HITS_ASC</option>
			<option value="a.hits DESC">JGLOBAL_HITS_DESC</option>
			<option value="rating_count ASC" requires="vote">JGLOBAL_VOTES_ASC</option>
			<option value="rating_count DESC" requires="vote">JGLOBAL_VOTES_DESC</option>
			<option value="rating ASC" requires="vote">JGLOBAL_RATINGS_ASC</option>
			<option value="rating DESC" requires="vote">JGLOBAL_RATINGS_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="COM_CONTENT_LIST_LIMIT"
			description="COM_CONTENT_LIST_LIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_content/models/fields/modal/article.php000060400000023130152453623450017226 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Language\LanguageHelper;

/**
 * Supports a modal article picker.
 *
 * @since  1.6
 */
class JFormFieldModal_Article extends JFormField
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $type = 'Modal_Article';

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string  The field input markup.
	 *
	 * @since   1.6
	 */
	protected function getInput()
	{
		$allowNew       = ((string) $this->element['new'] == 'true');
		$allowEdit      = ((string) $this->element['edit'] == 'true');
		$allowClear     = ((string) $this->element['clear'] != 'false');
		$allowSelect    = ((string) $this->element['select'] != 'false');
		$allowPropagate = ((string) $this->element['propagate'] == 'true');

		$languages = LanguageHelper::getContentLanguages(array(0, 1));

		// Load language
		JFactory::getLanguage()->load('com_content', JPATH_ADMINISTRATOR);

		// The active article id field.
		$value = (int) $this->value > 0 ? (int) $this->value : '';

		// Create the modal id.
		$modalId = 'Article_' . $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 jSelectArticle_" . $this->id . "(id, title, catid, object, url, language) {
					window.processModalSelect('Article', '" . $this->id . "', id, title, catid, object, url, language);
				}
				");

				JText::script('JGLOBAL_ASSOCIATIONS_PROPAGATE_FAILED');

				$scriptSelect[$this->id] = true;
			}
		}

		// Setup variables for display.
		$linkArticles = 'index.php?option=com_content&amp;view=articles&amp;layout=modal&amp;tmpl=component&amp;' . JSession::getFormToken() . '=1';
		$linkArticle  = 'index.php?option=com_content&amp;view=article&amp;layout=modal&amp;tmpl=component&amp;' . JSession::getFormToken() . '=1';

		if (isset($this->element['language']))
		{
			$linkArticles .= '&amp;forcedLanguage=' . $this->element['language'];
			$linkArticle  .= '&amp;forcedLanguage=' . $this->element['language'];
			$modalTitle    = JText::_('COM_CONTENT_CHANGE_ARTICLE') . ' &#8212; ' . $this->element['label'];
		}
		else
		{
			$modalTitle    = JText::_('COM_CONTENT_CHANGE_ARTICLE');
		}

		$urlSelect = $linkArticles . '&amp;function=jSelectArticle_' . $this->id;
		$urlEdit   = $linkArticle . '&amp;task=article.edit&amp;id=\' + document.getElementById("' . $this->id . '_id").value + \'';
		$urlNew    = $linkArticle . '&amp;task=article.add';

		if ($value)
		{
			$db    = JFactory::getDbo();
			$query = $db->getQuery(true)
				->select($db->quoteName('title'))
				->from($db->quoteName('#__content'))
				->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_CONTENT_SELECT_AN_ARTICLE') : htmlspecialchars($title, ENT_QUOTES, 'UTF-8');

		// The current article display field.
		$html  = '<span class="input-append">';
		$html .= '<input class="input-medium" id="' . $this->id . '_name" type="text" value="' . $title . '" disabled="disabled" size="35" />';

		// Select article button
		if ($allowSelect)
		{
			$html .= '<button'
				. ' type="button"'
				. ' class="btn hasTooltip' . ($value ? ' hidden' : '') . '"'
				. ' id="' . $this->id . '_select"'
				. ' data-toggle="modal"'
				. ' data-target="#ModalSelect' . $modalId . '"'
				. ' title="' . JHtml::tooltipText('COM_CONTENT_CHANGE_ARTICLE') . '">'
				. '<span class="icon-file" aria-hidden="true"></span> ' . JText::_('JSELECT')
				. '</button>';
		}

		// New article button
		if ($allowNew)
		{
			$html .= '<button'
				. ' type="button"'
				. ' class="btn hasTooltip' . ($value ? ' hidden' : '') . '"'
				. ' id="' . $this->id . '_new"'
				. ' data-toggle="modal"'
				. ' data-target="#ModalNew' . $modalId . '"'
				. ' title="' . JHtml::tooltipText('COM_CONTENT_NEW_ARTICLE') . '">'
				. '<span class="icon-new" aria-hidden="true"></span> ' . JText::_('JACTION_CREATE')
				. '</button>';
		}

		// Edit article button
		if ($allowEdit)
		{
			$html .= '<button'
				. ' type="button"'
				. ' class="btn hasTooltip' . ($value ? '' : ' hidden') . '"'
				. ' id="' . $this->id . '_edit"'
				. ' data-toggle="modal"'
				. ' data-target="#ModalEdit' . $modalId . '"'
				. ' title="' . JHtml::tooltipText('COM_CONTENT_EDIT_ARTICLE') . '">'
				. '<span class="icon-edit" aria-hidden="true"></span> ' . JText::_('JACTION_EDIT')
				. '</button>';
		}

		// Clear article button
		if ($allowClear)
		{
			$html .= '<button'
				. ' type="button"'
				. ' class="btn' . ($value ? '' : ' hidden') . '"'
				. ' id="' . $this->id . '_clear"'
				. ' onclick="window.processModalParent(\'' . $this->id . '\'); return false;">'
				. '<span class="icon-remove" aria-hidden="true"></span>' . JText::_('JCLEAR')
				. '</button>';
		}

		// Propagate article button
		if ($allowPropagate && count($languages) > 2)
		{
			// Strip off language tag at the end
			$tagLength = (int) strlen($this->element['language']);
			$callbackFunctionStem = substr("jSelectArticle_" . $this->id, 0, -$tagLength);

			$html .= '<a'
			. ' class="btn hasTooltip' . ($value ? '' : ' hidden') . '"'
			. ' id="' . $this->id . '_propagate"'
			. ' href="#"'
			. ' title="' . JHtml::tooltipText('JGLOBAL_ASSOCIATIONS_PROPAGATE_TIP') . '"'
			. ' onclick="Joomla.propagateAssociation(\'' . $this->id . '\', \'' . $callbackFunctionStem . '\');">'
			. '<span class="icon-refresh" aria-hidden="true"></span>' . JText::_('JGLOBAL_ASSOCIATIONS_PROPAGATE_BUTTON')
			. '</a>';
		}

		$html .= '</span>';

		// Select article modal
		if ($allowSelect)
		{
			$html .= JHtml::_(
				'bootstrap.renderModal',
				'ModalSelect' . $modalId,
				array(
					'title'       => $modalTitle,
					'url'         => $urlSelect,
					'height'      => '400px',
					'width'       => '800px',
					'bodyHeight'  => '70',
					'modalWidth'  => '80',
					'footer'      => '<button type="button" class="btn" data-dismiss="modal">' . JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>',
				)
			);
		}

		// New article modal
		if ($allowNew)
		{
			$html .= JHtml::_(
				'bootstrap.renderModal',
				'ModalNew' . $modalId,
				array(
					'title'       => JText::_('COM_CONTENT_NEW_ARTICLE'),
					'backdrop'    => 'static',
					'keyboard'    => false,
					'closeButton' => false,
					'url'         => $urlNew,
					'height'      => '400px',
					'width'       => '800px',
					'bodyHeight'  => '70',
					'modalWidth'  => '80',
					'footer'      => '<button type="button" class="btn"'
							. ' onclick="window.processModalEdit(this, \'' . $this->id . '\', \'add\', \'article\', \'cancel\', \'item-form\'); return false;">'
							. JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>'
							. '<button type="button" class="btn btn-primary"'
							. ' onclick="window.processModalEdit(this, \'' . $this->id . '\', \'add\', \'article\', \'save\', \'item-form\'); return false;">'
							. JText::_('JSAVE') . '</button>'
							. '<button type="button" class="btn btn-success"'
							. ' onclick="window.processModalEdit(this, \'' . $this->id . '\', \'add\', \'article\', \'apply\', \'item-form\'); return false;">'
							. JText::_('JAPPLY') . '</button>',
				)
			);
		}

		// Edit article modal
		if ($allowEdit)
		{
			$html .= JHtml::_(
				'bootstrap.renderModal',
				'ModalEdit' . $modalId,
				array(
					'title'       => JText::_('COM_CONTENT_EDIT_ARTICLE'),
					'backdrop'    => 'static',
					'keyboard'    => false,
					'closeButton' => false,
					'url'         => $urlEdit,
					'height'      => '400px',
					'width'       => '800px',
					'bodyHeight'  => '70',
					'modalWidth'  => '80',
					'footer'      => '<button type="button" class="btn"'
							. ' onclick="window.processModalEdit(this, \'' . $this->id . '\', \'edit\', \'article\', \'cancel\', \'item-form\'); return false;">'
							. JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>'
							. '<button type="button" class="btn btn-primary"'
							. ' onclick="window.processModalEdit(this, \'' . $this->id . '\', \'edit\', \'article\', \'save\', \'item-form\'); return false;">'
							. JText::_('JSAVE') . '</button>'
							. '<button type="button" class="btn btn-success"'
							. ' onclick="window.processModalEdit(this, \'' . $this->id . '\', \'edit\', \'article\', \'apply\', \'item-form\'); return false;">'
							. JText::_('JAPPLY') . '</button>',
				)
			);
		}

		// Note: class='required' for client side validation.
		$class = $this->required ? ' class="required modal-value"' : '';

		$html .= '<input type="hidden" id="' . $this->id . '_id" ' . $class . ' data-required="' . (int) $this->required . '" name="' . $this->name
			. '" data-text="' . htmlspecialchars(JText::_('COM_CONTENT_SELECT_AN_ARTICLE'), ENT_COMPAT, 'UTF-8') . '" value="' . $value . '" />';

		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());
	}
}
components/com_content/models/fields/voteradio.php000060400000002132152453623450016502 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JFormHelper::loadFieldClass('radio');

/**
 * Voteradio Field class.
 *
 * @since  3.8.0
 */
class JFormFieldVoteradio extends JFormFieldRadio
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.7.1
	 */
	protected $type = 'Voteradio';

	/**
	 * Method to get the field Label.
	 *
	 * @return array The field label objects.
	 *
	 * @throws \Exception
	 *
	 * @since  3.8.2
	 */
	public function getLabel()
	{
		// Requires vote plugin enabled
		return JPluginHelper::isEnabled('content', 'vote') ? parent::getLabel() : null;
	}

	/**
	 * Method to get the field options.
	 *
	 * @return array The field option objects.
	 *
	 * @throws \Exception
	 *
	 * @since  3.7.1
	 */
	public function getOptions()
	{
		// Requires vote plugin enabled
		return JPluginHelper::isEnabled('content', 'vote') ? parent::getOptions() : array();
	}
}
components/com_content/models/articles.php000060400000031630152453623450015053 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Methods supporting a list of article records.
 *
 * @since  1.6
 */
class ContentModelArticles extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @since   1.6
	 * @see     JControllerLegacy
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'title', 'a.title',
				'alias', 'a.alias',
				'checked_out', 'a.checked_out',
				'checked_out_time', 'a.checked_out_time',
				'catid', 'a.catid', 'category_title',
				'state', 'a.state',
				'access', 'a.access', 'access_level',
				'created', 'a.created',
				'modified', 'a.modified',
				'created_by', 'a.created_by',
				'created_by_alias', 'a.created_by_alias',
				'ordering', 'a.ordering',
				'featured', 'a.featured',
				'language', 'a.language',
				'hits', 'a.hits',
				'publish_up', 'a.publish_up',
				'publish_down', 'a.publish_down',
				'published', 'a.published',
				'author_id',
				'category_id',
				'level',
				'tag',
				'rating_count', 'rating',
			);

			if (JLanguageAssociations::isEnabled())
			{
				$config['filter_fields'][] = 'association';
			}
		}

		parent::__construct($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.id', $direction = 'desc')
	{
		$app = JFactory::getApplication();

		$forcedLanguage = $app->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;
		}

		$search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		$published = $this->getUserStateFromRequest($this->context . '.filter.published', 'filter_published', '');
		$this->setState('filter.published', $published);

		$level = $this->getUserStateFromRequest($this->context . '.filter.level', 'filter_level');
		$this->setState('filter.level', $level);

		$language = $this->getUserStateFromRequest($this->context . '.filter.language', 'filter_language', '');
		$this->setState('filter.language', $language);

		$formSubmited = $app->input->post->get('form_submited');

		$access     = $this->getUserStateFromRequest($this->context . '.filter.access', 'filter_access');
		$authorId   = $this->getUserStateFromRequest($this->context . '.filter.author_id', 'filter_author_id');
		$categoryId = $this->getUserStateFromRequest($this->context . '.filter.category_id', 'filter_category_id');
		$tag        = $this->getUserStateFromRequest($this->context . '.filter.tag', 'filter_tag', '');

		if ($formSubmited)
		{
			$access = $app->input->post->get('access');
			$this->setState('filter.access', $access);

			$authorId = $app->input->post->get('author_id');
			$this->setState('filter.author_id', $authorId);

			$categoryId = $app->input->post->get('category_id');
			$this->setState('filter.category_id', $categoryId);

			$tag = $app->input->post->get('tag');
			$this->setState('filter.tag', $tag);
		}

		// List state information.
		parent::populateState($ordering, $direction);

		// Force a language
		if (!empty($forcedLanguage))
		{
			$this->setState('filter.language', $forcedLanguage);
			$this->setState('filter.forcedLanguage', $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 .= ':' . serialize($this->getState('filter.access'));
		$id .= ':' . $this->getState('filter.published');
		$id .= ':' . serialize($this->getState('filter.category_id'));
		$id .= ':' . serialize($this->getState('filter.author_id'));
		$id .= ':' . $this->getState('filter.language');
		$id .= ':' . serialize($this->getState('filter.tag'));

		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(
			$this->getState(
				'list.select',
				'a.id, a.title, a.alias, a.checked_out, a.checked_out_time, a.catid' .
				', a.state, a.access, a.created, a.created_by, a.created_by_alias, a.modified, a.ordering, a.featured, a.language, a.hits' .
				', a.publish_up, a.publish_down, a.note'
			)
		);
		$query->from('#__content 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 categories.
		$query->select('c.title AS category_title, c.created_user_id AS category_uid, c.level AS category_level')
			->join('LEFT', '#__categories AS c ON c.id = a.catid');

		// Join over the parent categories.
		$query->select('parent.title AS parent_category_title, parent.id AS parent_category_id,
								parent.created_user_id AS parent_category_uid, parent.level AS parent_category_level')
			->join('LEFT', '#__categories AS parent ON parent.id = c.parent_id');

		// Join over the users for the author.
		$query->select('ua.name AS author_name')
			->join('LEFT', '#__users AS ua ON ua.id = a.created_by');

		// Join on voting table
		if (JPluginHelper::isEnabled('content', 'vote'))
		{
			$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');
		}

		// Join over the associations.
		if (JLanguageAssociations::isEnabled())
		{
			$subQuery = $db->getQuery(true)
				->select('COUNT(' . $db->quoteName('asso1.id') . ') > 1')
				->from($db->quoteName('#__associations', 'asso1'))
				->join('INNER', $db->quoteName('#__associations', 'asso2') . ' ON ' . $db->quoteName('asso1.key') . ' = ' . $db->quoteName('asso2.key'))
				->where(
					array(
						$db->quoteName('asso1.id') . ' = ' . $db->quoteName('a.id'),
						$db->quoteName('asso1.context') . ' = ' . $db->quote('com_content.item'),
					)
				);

			$query->select('(' . $subQuery . ') AS ' . $db->quoteName('association'));
		}

		// Filter by access level.
		$access = $this->getState('filter.access');

		if (is_numeric($access))
		{
			$query->where('a.access = ' . (int) $access);
		}
		elseif (is_array($access))
		{
			$access = ArrayHelper::toInteger($access);
			$access = implode(',', $access);
			$query->where('a.access IN (' . $access . ')');
		}

		// Filter by access level on categories.
		if (!$user->authorise('core.admin'))
		{
			$groups = implode(',', $user->getAuthorisedViewLevels());
			$query->where('a.access IN (' . $groups . ')');
			$query->where('c.access IN (' . $groups . ')');
		}

		// Filter by published state
		$published = $this->getState('filter.published');

		if (is_numeric($published))
		{
			$query->where('a.state = ' . (int) $published);
		}
		elseif ($published === '')
		{
			$query->where('(a.state = 0 OR a.state = 1)');
		}

		// Filter by categories and by level
		$categoryId = $this->getState('filter.category_id', array());
		$level = $this->getState('filter.level');

		if (!is_array($categoryId))
		{
			$categoryId = $categoryId ? array($categoryId) : array();
		}

		// Case: Using both categories filter and by level filter
		if (count($categoryId))
		{
			$categoryId = ArrayHelper::toInteger($categoryId);
			$categoryTable = JTable::getInstance('Category', 'JTable');
			$subCatItemsWhere = array();

			foreach ($categoryId as $filter_catid)
			{
				$categoryTable->load($filter_catid);
				$subCatItemsWhere[] = '(' .
					($level ? 'c.level <= ' . ((int) $level + (int) $categoryTable->level - 1) . ' AND ' : '') .
					'c.lft >= ' . (int) $categoryTable->lft . ' AND ' .
					'c.rgt <= ' . (int) $categoryTable->rgt . ')';
			}

			$query->where('(' . implode(' OR ', $subCatItemsWhere) . ')');
		}

		// Case: Using only the by level filter
		elseif ($level)
		{
			$query->where('c.level <= ' . (int) $level);
		}

		// Filter by author
		$authorId = $this->getState('filter.author_id');

		if (is_numeric($authorId))
		{
			$type = $this->getState('filter.author_id.include', true) ? '= ' : '<>';
			$query->where('a.created_by ' . $type . (int) $authorId);
		}
		elseif (is_array($authorId))
		{
			$authorId = ArrayHelper::toInteger($authorId);
			$authorId = implode(',', $authorId);
			$query->where('a.created_by IN (' . $authorId . ')');
		}

		// 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));
			}
			elseif (stripos($search, 'author:') === 0)
			{
				$search = $db->quote('%' . $db->escape(substr($search, 7), true) . '%');
				$query->where('(ua.name LIKE ' . $search . ' OR ua.username LIKE ' . $search . ')');
			}
			elseif (stripos($search, 'content:') === 0)
			{
				$search = $db->quote('%' . $db->escape(substr($search, 8), true) . '%');
				$query->where('(a.introtext LIKE ' . $search . ' OR a.fulltext LIKE ' . $search . ')');
			}
			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));
		}

		$tag = $this->getState('filter.tag');

		// Run simplified query when filtering by one tag.
		if (\is_array($tag) && \count($tag) === 1)
		{
			$tag = $tag[0];
		}

		if ($tag && \is_array($tag))
		{
			$tag = ArrayHelper::toInteger($tag);

			$subQuery = $db->getQuery(true)
				->select('DISTINCT ' . $db->quoteName('content_item_id'))
				->from($db->quoteName('#__contentitem_tag_map'))
				->where(
					array(
						$db->quoteName('tag_id') . ' IN (' . implode(',', $tag) . ')',
						$db->quoteName('type_alias') . ' = ' . $db->quote('com_content.article'),
					)
				);

			$query->join(
				'INNER',
				'(' . $subQuery . ') AS ' . $db->quoteName('tagmap')
					. ' ON ' . $db->quoteName('tagmap.content_item_id') . ' = ' . $db->quoteName('a.id')
			);
		}
		elseif ($tag = (int) $tag)
		{
			$query->join(
				'INNER',
				$db->quoteName('#__contentitem_tag_map', 'tagmap')
					. ' ON ' . $db->quoteName('tagmap.content_item_id') . ' = ' . $db->quoteName('a.id')
			)
				->where(
					array(
						$db->quoteName('tagmap.tag_id') . ' = ' . $tag,
						$db->quoteName('tagmap.type_alias') . ' = ' . $db->quote('com_content.article'),
					)
				);
		}

		// Add the list ordering clause.
		$orderCol  = $this->state->get('list.ordering', 'a.id');
		$orderDirn = $this->state->get('list.direction', 'DESC');

		if ($orderCol == 'a.ordering' || $orderCol == 'category_title')
		{
			$orderCol = $db->quoteName('c.title') . ' ' . $orderDirn . ', ' . $db->quoteName('a.ordering');
		}

		$query->order($db->escape($orderCol) . ' ' . $db->escape($orderDirn));

		return $query;
	}

	/**
	 * Build a list of authors
	 *
	 * @return  stdClass
	 *
	 * @since   1.6
	 *
	 * @deprecated  4.0  To be removed with Hathor
	 */
	public function getAuthors()
	{
		// Create a new query object.
		$db    = $this->getDbo();
		$query = $db->getQuery(true);

		// Construct the query
		$query->select('u.id AS value, u.name AS text')
			->from('#__users AS u')
			->join('INNER', '#__content AS c ON c.created_by = u.id')
			->group('u.id, u.name')
			->order('u.name');

		// Setup the query
		$db->setQuery($query);

		// Return the result
		return $db->loadObjectList();
	}
}
components/com_content/controllers/article.php000060400000006357152453623450015763 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * The article controller
 *
 * @since  1.6
 */
class ContentControllerArticle extends JControllerForm
{
	/**
	 * Class constructor.
	 *
	 * @param   array  $config  A named array of configuration variables.
	 *
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		parent::__construct($config);

		// An article edit form can come from the articles or featured view.
		// Adjust the redirect view on the value of 'return' in the request.
		if ($this->input->get('return') == 'featured')
		{
			$this->view_list = 'featured';
			$this->view_item = 'article&return=featured';
		}
	}

	/**
	 * 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())
	{
		$categoryId = ArrayHelper::getValue($data, 'catid', $this->input->getInt('filter_category_id'), 'int');
		$allow = null;

		if ($categoryId)
		{
			// If the category has been passed in the data or URL check it.
			$allow = JFactory::getUser()->authorise('core.create', 'com_content.category.' . $categoryId);
		}

		if ($allow === null)
		{
			// In the absence of better information, revert to the component permissions.
			return parent::allowAdd();
		}

		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;
		$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->id == $record->created_by;
		}

		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)
	{
		$this->checkToken();

		// Set the model
		/** @var ContentModelArticle $model */
		$model = $this->getModel('Article', '', array());

		// Preset the redirect
		$this->setRedirect(JRoute::_('index.php?option=com_content&view=articles' . $this->getRedirectToListAppend(), false));

		return parent::batch($model);
	}
}
components/com_content/controllers/ajax.json.php000060400000004343152453623450016224 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Language\LanguageHelper;

/**
 * The article controller for ajax requests
 *
 * @since  3.9.0
 */
class ContentControllerAjax extends JControllerLegacy
{
	/**
	 * Method to fetch associations of an article
	 *
	 * The method assumes that the following http parameters are passed in an Ajax Get request:
	 * token: the form token
	 * assocId: the id of the article whose associations are to be returned
	 * excludeLang: the association for this language is to be excluded
	 *
	 * @return  null
	 *
	 * @since  3.9.0
	 */
	public function fetchAssociations()
	{
		if (!JSession::checkToken('get'))
		{
			echo new JResponseJson(null, JText::_('JINVALID_TOKEN'), true);
		}
		else
		{
			$input = JFactory::getApplication()->input;

			$assocId = $input->getInt('assocId', 0);

			if ($assocId == 0)
			{
				echo new JResponseJson(null, JText::sprintf('JLIB_FORM_VALIDATE_FIELD_INVALID', 'assocId'), true);

				return;
			}

			$excludeLang = $input->get('excludeLang', '', 'STRING');

			$associations = JLanguageAssociations::getAssociations('com_content', '#__content', 'com_content.item', (int) $assocId);

			unset($associations[$excludeLang]);

			// Add the title to each of the associated records
			$contentTable = JTable::getInstance('Content', 'JTable');

			foreach ($associations as $lang => $association)
			{
				$contentTable->load($association->id);
				$associations[$lang]->title = $contentTable->title;
			}

			$countContentLanguages = count(LanguageHelper::getContentLanguages(array(0, 1)));

			if (count($associations) == 0)
			{
				$message = JText::_('JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_NONE');
			}
			elseif ($countContentLanguages > count($associations) + 2)
			{
				$tags    = implode(', ', array_keys($associations));
				$message = JText::sprintf('JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_SOME', $tags);
			}
			else
			{
				$message = JText::_('JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_ALL');
			}

			echo new JResponseJson($associations, $message);
		}
	}
}
components/com_content/controllers/featured.php000060400000004276152453623450016135 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('ContentControllerArticles', __DIR__ . '/articles.php');

/**
 * Featured content controller class.
 *
 * @since  1.6
 */
class ContentControllerFeatured extends ContentControllerArticles
{
	/**
	 * Removes an item.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function delete()
	{
		// Check for request forgeries
		$this->checkToken();

		$user = JFactory::getUser();
		$ids  = (array) $this->input->get('cid', array(), 'int');

		// Access checks.
		foreach ($ids as $i => $id)
		{
			// Remove zero value resulting from input filter
			if ($id === 0)
			{
				unset($ids[$i]);

				continue;
			}

			if (!$user->authorise('core.delete', 'com_content.article.' . (int) $id))
			{
				// Prune items that you can't delete.
				unset($ids[$i]);
				JError::raiseNotice(403, JText::_('JERROR_CORE_DELETE_NOT_PERMITTED'));
			}
		}

		if (empty($ids))
		{
			JError::raiseWarning(500, JText::_('JERROR_NO_ITEMS_SELECTED'));
		}
		else
		{
			// Get the model.
			/** @var ContentModelFeature $model */
			$model = $this->getModel();

			// Remove the items.
			if (!$model->featured($ids, 0))
			{
				JError::raiseWarning(500, $model->getError());
			}
		}

		$this->setRedirect('index.php?option=com_content&view=featured');
	}

	/**
	 * Method to publish a list of articles.
	 *
	 * @return  void
	 *
	 * @since   1.0
	 */
	public function publish()
	{
		parent::publish();

		$this->setRedirect('index.php?option=com_content&view=featured');
	}

	/**
	 * 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 = 'Feature', $prefix = 'ContentModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}
}
components/com_content/controllers/articles.php000060400000006063152453623450016140 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Articles list controller class.
 *
 * @since  1.6
 */
class ContentControllerArticles extends JControllerAdmin
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JControllerLegacy
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		parent::__construct($config);

		// Articles default form can come from the articles or featured view.
		// Adjust the redirect view on the value of 'view' in the request.
		if ($this->input->get('view') == 'featured')
		{
			$this->view_list = 'featured';
		}

		$this->registerTask('unfeatured', 'featured');
	}

	/**
	 * Method to toggle the featured setting of a list of articles.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function featured()
	{
		// Check for request forgeries
		$this->checkToken();

		$user   = JFactory::getUser();
		$ids    = (array) $this->input->get('cid', array(), 'int');
		$values = array('featured' => 1, 'unfeatured' => 0);
		$task   = $this->getTask();
		$value  = ArrayHelper::getValue($values, $task, 0, 'int');

		// Access checks.
		foreach ($ids as $i => $id)
		{
			// Remove zero value resulting from input filter
			if ($id === 0)
			{
				unset($ids[$i]);

				continue;
			}

			if (!$user->authorise('core.edit.state', 'com_content.article.' . (int) $id))
			{
				// Prune items that you can't change.
				unset($ids[$i]);
				JError::raiseNotice(403, JText::_('JLIB_APPLICATION_ERROR_EDITSTATE_NOT_PERMITTED'));
			}
		}

		if (empty($ids))
		{
			$message = null;

			JError::raiseWarning(500, JText::_('JERROR_NO_ITEMS_SELECTED'));
		}
		else
		{
			// Get the model.
			/** @var ContentModelArticle $model */
			$model = $this->getModel();

			// Publish the items.
			if (!$model->featured($ids, $value))
			{
				JError::raiseWarning(500, $model->getError());
			}

			if ($value == 1)
			{
				$message = JText::plural('COM_CONTENT_N_ITEMS_FEATURED', count($ids));
			}
			else
			{
				$message = JText::plural('COM_CONTENT_N_ITEMS_UNFEATURED', count($ids));
			}
		}

		$view = $this->input->get('view', '');

		if ($view == 'featured')
		{
			$this->setRedirect(JRoute::_('index.php?option=com_content&view=featured', false), $message);
		}
		else
		{
			$this->setRedirect(JRoute::_('index.php?option=com_content&view=articles', false), $message);
		}
	}

	/**
	 * Proxy for getModel.
	 *
	 * @param   string  $name    The model name. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  The array of possible config values. Optional.
	 *
	 * @return  JModelLegacy
	 *
	 * @since   1.6
	 */
	public function getModel($name = 'Article', $prefix = 'ContentModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}
}
components/com_content/controller.php000060400000002755152453623450014153 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Component Controller
 *
 * @since  1.5
 */
class ContentController extends JControllerLegacy
{
	/**
	 * The default view.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $default_view = 'articles';

	/**
	 * 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  ContentController  This object to support chaining.
	 *
	 * @since   1.5
	 */
	public function display($cachable = false, $urlparams = array())
	{
		$view   = $this->input->get('view', 'articles');
		$layout = $this->input->get('layout', 'articles');
		$id     = $this->input->getInt('id');

		// Check for edit form.
		if ($view == 'article' && $layout == 'edit' && !$this->checkEditId('com_content.edit.article', $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_content&view=articles', false));

			return false;
		}

		return parent::display();
	}
}
components/com_search/helpers/search.php000060400000021534152453623460014467 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_search
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\String\StringHelper;

/**
 * Search component helper.
 *
 * @since  1.5
 */
class SearchHelper
{
	/**
	 * Configure the Linkbar.
	 *
	 * @param   string  $vName  The name of the active view.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public static function addSubmenu($vName)
	{
		// Not required.
	}

	/**
	 * Gets a list of the actions that can be performed.
	 *
	 * @return  JObject
	 *
	 * @deprecated  3.2  Use JHelperContent::getActions() instead.
	 */
	public static function getActions()
	{
		// 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('com_search');
	}

	/**
	 * Sanitise search word.
	 *
	 * @param   string  &$searchword   Search word to be sanitised.
	 * @param   string  $searchphrase  Either 'all', 'any' or 'exact'.
	 *
	 * @return  boolean  True if search word needs to be sanitised.
	 */
	public static function santiseSearchWord(&$searchword, $searchphrase)
	{
		$ignored = false;

		$lang          = JFactory::getLanguage();
		$tag           = $lang->getTag();
		$search_ignore = $lang->getIgnoredSearchWords();

		// Deprecated in 1.6 use $lang->getIgnoredSearchWords instead.
		$ignoreFile = JLanguageHelper::getLanguagePath() . '/' . $tag . '/' . $tag . '.ignore.php';

		if (file_exists($ignoreFile))
		{
			include $ignoreFile;
		}

		// Check for words to ignore.
		$aterms = explode(' ', StringHelper::strtolower($searchword));

		// First case is single ignored word.
		if (count($aterms) == 1 && in_array(StringHelper::strtolower($searchword), $search_ignore))
		{
			$ignored = true;
		}

		// Filter out search terms that are too small.
		$lower_limit = $lang->getLowerLimitSearchWord();

		foreach ($aterms as $aterm)
		{
			if (StringHelper::strlen($aterm) < $lower_limit)
			{
				$search_ignore[] = $aterm;
			}
		}

		// Next is to remove ignored words from type 'all' or 'any' (not exact) searches with multiple words.
		if (count($aterms) > 1 && $searchphrase != 'exact')
		{
			$pruned     = array_diff($aterms, $search_ignore);
			$searchword = implode(' ', $pruned);
		}

		return $ignored;
	}

	/**
	 * Does search word need to be limited?
	 *
	 * @param   string  &$searchword  Search word to be checked.
	 *
	 * @return  boolean  True if search word should be limited; false otherwise.
	 *
	 * @since  1.5
	 */
	public static function limitSearchWord(&$searchword)
	{
		$restriction = false;

		$lang = JFactory::getLanguage();

		// Limit searchword to a maximum of characters.
		$upper_limit = $lang->getUpperLimitSearchWord();

		if (StringHelper::strlen($searchword) > $upper_limit)
		{
			$searchword  = StringHelper::substr($searchword, 0, $upper_limit - 1);
			$restriction = true;
		}

		// Searchword must contain a minimum of characters.
		if ($searchword && StringHelper::strlen($searchword) < $lang->getLowerLimitSearchWord())
		{
			$searchword  = '';
			$restriction = true;
		}

		return $restriction;
	}

	/**
	 * Logs a search term.
	 *
	 * @param   string  $searchTerm  The term being searched.
	 *
	 * @return  void
	 *
	 * @since   1.5
	 * @deprecated  4.0  Use \Joomla\CMS\Helper\SearchHelper::logSearch() instead.
	 */
	public static function logSearch($searchTerm)
	{
		try
		{
			JLog::add(
				sprintf('%s() is deprecated. Use \Joomla\CMS\Helper\SearchHelper::logSearch() instead.', __METHOD__),
				JLog::WARNING,
				'deprecated'
			);
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		\Joomla\CMS\Helper\SearchHelper::logSearch($searchTerm, 'com_search');
	}

	/**
	 * Prepares results from search for display.
	 *
	 * @param   string  $text        The source string.
	 * @param   string  $searchword  The searchword to select around.
	 *
	 * @return  string
	 *
	 * @since   1.5
	 */
	public static function prepareSearchContent($text, $searchword)
	{
		// Strips tags won't remove the actual jscript.
		$text = preg_replace("'<script[^>]*>.*?</script>'si", '', $text);
		$text = preg_replace('/{.+?}/', '', $text);

		// $text = preg_replace('/<a\s+.*?href="([^"]+)"[^>]*>([^<]+)<\/a>/is','\2', $text);

		// Replace line breaking tags with whitespace.
		$text = preg_replace("'<(br[^/>]*?/|hr[^/>]*?/|/(div|h[1-6]|li|p|td))>'si", ' ', $text);

		return self::_smartSubstr(strip_tags($text), $searchword);
	}

	/**
	 * Checks an object for search terms (after stripping fields of HTML).
	 *
	 * @param   object  $object      The object to check.
	 * @param   string  $searchTerm  Search words to check for.
	 * @param   array   $fields      List of object variables to check against.
	 *
	 * @return  boolean True if searchTerm is in object, false otherwise.
	 */
	public static function checkNoHtml($object, $searchTerm, $fields)
	{
		$searchRegex = array(
			'#<script[^>]*>.*?</script>#si',
			'#<style[^>]*>.*?</style>#si',
			'#<!.*?(--|]])>#si',
			'#<[^>]*>#i'
		);
		$terms = explode(' ', $searchTerm);

		if (empty($fields))
		{
			return false;
		}

		foreach ($fields as $field)
		{
			if (!isset($object->$field))
			{
				continue;
			}

			$text = self::remove_accents($object->$field);

			foreach ($searchRegex as $regex)
			{
				$text = preg_replace($regex, '', $text);
			}

			foreach ($terms as $term)
			{
				$term = self::remove_accents($term);

				if (StringHelper::stristr($text, $term) !== false)
				{
					return true;
				}
			}
		}

		return false;
	}

	/**
	 * Transliterates given text to ASCII.
	 *
	 * @param   string  $str  String to remove accents from.
	 *
	 * @return  string
	 *
	 * @since   3.2
	 */
	public static function remove_accents($str)
	{
		$str = JLanguageTransliterate::utf8_latin_to_ascii($str);

		// @TODO: remove other prefixes as well?
		return preg_replace("/[\"'^]([a-z])/ui", '\1', $str);
	}

	/**
	 * Returns substring of characters around a searchword.
	 *
	 * @param   string   $text        The source string.
	 * @param   integer  $searchword  Number of chars to return.
	 *
	 * @return  string
	 *
	 * @since   1.5
	 */
	public static function _smartSubstr($text, $searchword)
	{
		$lang        = JFactory::getLanguage();
		$length      = $lang->getSearchDisplayedCharactersNumber();
		$ltext       = self::remove_accents($text);
		$textlen     = StringHelper::strlen($ltext);
		$lsearchword = StringHelper::strtolower(self::remove_accents($searchword));
		$wordfound   = false;
		$pos         = 0;
		$length      = $length > $textlen ? $textlen : $length;

		while ($wordfound === false && $pos + $length < $textlen)
		{
			if (($wordpos = @StringHelper::strpos($ltext, ' ', $pos + $length)) !== false)
			{
				$chunk_size = $wordpos - $pos;
			}
			else
			{
				$chunk_size = $length;
			}

			$chunk     = StringHelper::substr($ltext, $pos, $chunk_size);
			$wordfound = StringHelper::strpos(StringHelper::strtolower($chunk), $lsearchword);

			if ($wordfound === false)
			{
				$pos += $chunk_size + 1;
			}
		}

		if ($wordfound !== false)
		{
			// Check if original text is different length than searched text (changed by function self::remove_accents)
			// Displayed text only, adjust $chunk_size
			if ($pos === 0)
			{
				$iOriLen = StringHelper::strlen(StringHelper::substr($text, 0, $pos + $chunk_size));
				$iModLen = StringHelper::strlen(self::remove_accents(StringHelper::substr($text, 0, $pos + $chunk_size)));

				$chunk_size += $iOriLen - $iModLen;
			}
			else
			{
				$iOriSkippedLen = StringHelper::strlen(StringHelper::substr($text, 0, $pos));
				$iModSkippedLen = StringHelper::strlen(self::remove_accents(StringHelper::substr($text, 0, $pos)));

				// Adjust starting position $pos
				if ($iOriSkippedLen !== $iModSkippedLen)
				{
					$pos += $iOriSkippedLen - $iModSkippedLen;
				}

				$iOriReturnLen = StringHelper::strlen(StringHelper::substr($text, $pos, $chunk_size));
				$iModReturnLen = StringHelper::strlen(self::remove_accents(StringHelper::substr($text, $pos, $chunk_size)));

				if ($iOriReturnLen !== $iModReturnLen)
				{
					$chunk_size += $iOriReturnLen - $iModReturnLen;
				}
			}

			$sPre = $pos > 0 ? '...&#160;' : '';
			$sPost = ($pos + $chunk_size) >= StringHelper::strlen($text) ? '' : '&#160;...';

			return $sPre . StringHelper::substr($text, $pos, $chunk_size) . $sPost;
		}
		else
		{
			if (($mbtextlen = StringHelper::strlen($text)) < $length)
			{
				$length = $mbtextlen;
			}

			if (($wordpos = StringHelper::strpos($text, ' ', $length)) !== false)
			{
				return StringHelper::substr($text, 0, $wordpos) . '&#160;...';
			}
			else
			{
				return StringHelper::substr($text, 0, $length);
			}
		}
	}
}
components/com_search/helpers/site.php000060400000001365152453623460014166 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_search
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Mock JSite class used to fool the frontend search plugins because they route the results.
 *
 * @since  1.5
 */
class JSite extends JObject
{
	/**
	 * False method to fool the frontend search plugins.
	 *
	 * @return  JSite
	 *
	 * @since  1.5
	 */
	public function getMenu()
	{
		$result = new JSite;

		return $result;
	}

	/**
	 * False method to fool the frontend search plugins.
	 *
	 * @return  array
	 *
	 * @since  1.5
	 */
	public function getItems()
	{
		return array();
	}
}
components/com_search/search.xml000060400000002514152453623460013033 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_search</name>
	<author>Joomla! Project</author>
	<creationDate>April 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_SEARCH_XML_DESCRIPTION</description>
	<files folder="site">
		<filename>controller.php</filename>
		<filename>router.php</filename>
		<filename>search.php</filename>
		<folder>models</folder>
		<folder>views</folder>
	</files>
	<languages folder="site">
		<language tag="en-GB">language/en-GB.com_search.ini</language>
	</languages>
	<administration>
		<menu link="option=com_search" img="class:search">Search</menu>
		<files folder="admin">
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<filename>search.php</filename>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_search.ini</language>
			<language tag="en-GB">language/en-GB.com_search.sys.ini</language>
		</languages>
	</administration>
</extension>
components/com_search/search.php000060400000001064152453623460013021 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_search
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

if (!JFactory::getUser()->authorise('core.manage', 'com_search'))
{
	throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
}

$controller = JControllerLegacy::getInstance('Search');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
components/com_search/config.xml000060400000004014152453623460013030 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset 
		name="component"
		label="COM_SEARCH_FIELDSET_SEARCH_OPTIONS_LABEL">
		<field
			name="enabled"
			type="radio"
			label="COM_SEARCH_CONFIG_GATHER_SEARCH_STATISTICS_LABEL"
			description="COM_SEARCH_CONFIG_GATHER_SEARCH_STATISTICS_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="search_phrases"
			type="radio"
			label="COM_SEARCH_FIELD_SEARCH_PHRASES_LABEL"
			description="COM_SEARCH_FIELD_SEARCH_PHRASES_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="search_areas"
			type="radio"
			label="COM_SEARCH_FIELD_SEARCH_AREAS_LABEL"
			description="COM_SEARCH_FIELD_SEARCH_AREAS_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="show_date"
			type="radio"
			label="COM_SEARCH_CONFIG_FIELD_CREATED_DATE_LABEL"
			description="COM_SEARCH_CONFIG_FIELD_CREATED_DATE_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="opensearch_name"
			type="text"
			label="COM_SEARCH_CONFIG_FIELD_OPENSEARCH_NAME_LABEL"
			description="COM_SEARCH_CONFIG_FIELD_OPENSEARCH_NAME_DESC"
			default=""
		/>

		<field
			name="opensearch_description"
			type="textarea"
			label="COM_SEARCH_CONFIG_FIELD_OPENSEARCH_DESCRIPTON_LABEL"
			description="COM_SEARCH_CONFIG_FIELD_OPENSEARCH_DESCRIPTON_DESC"
			default=""
			cols="30"
			rows="2"
		/>

	</fieldset>

	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
		>

		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			filter="rules"
			validate="rules"
			component="com_search"
			section="component"
		/>

	</fieldset>
</config>
components/com_search/views/searches/view.html.php000060400000004747152453623460016436 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_search
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of search terms.
 *
 * @since  1.5
 */
class SearchViewSearches extends JViewLegacy
{
	protected $enabled;

	protected $items;

	protected $pagination;

	protected $state;

	/**
	 * Display the view.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		$app                 = JFactory::getApplication();
		$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');
		$this->enabled       = $this->state->params->get('enabled');
		$this->canDo         = JHelperContent::getActions('com_search');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Check if plugin is enabled
		if ($this->enabled)
		{
			$app->enqueueMessage(JText::_('COM_SEARCH_LOGGING_ENABLED'), 'notice');
		}
		else
		{
			$app->enqueueMessage(JText::_('COM_SEARCH_LOGGING_DISABLED'), 'warning');
		}

		$this->addToolbar();
		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		$canDo = $this->canDo;

		JToolbarHelper::title(JText::_('COM_SEARCH_MANAGER_SEARCHES'), 'search');

		$showResults = $this->state->get('show_results', 1, 'int');

		if ($showResults === 0)
		{
			JToolbarHelper::custom('searches.toggleresults', 'zoom-in.png', null, 'COM_SEARCH_SHOW_SEARCH_RESULTS', false);
		}
		else
		{
			JToolbarHelper::custom('searches.toggleresults', 'zoom-out.png', null, 'COM_SEARCH_HIDE_SEARCH_RESULTS', false);
		}

		if ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::custom('searches.reset', 'refresh.png', 'refresh_f2.png', 'JSEARCH_RESET', false);
		}

		JToolbarHelper::divider();

		if ($canDo->get('core.admin') || $canDo->get('core.options'))
		{
			JToolbarHelper::preferences('com_search');
		}

		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_COMPONENTS_SEARCH');
	}
}
components/com_search/views/searches/tmpl/default.xml000060400000000313152453623460017113 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_SEARCH_SEARCH_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_SEARCH_SEARCH_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>components/com_search/views/searches/tmpl/default.php000060400000006003152453623460017104 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_search
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn = $this->escape($this->state->get('list.direction'));
?>
<form action="<?php echo JRoute::_('index.php?option=com_search&view=searches'); ?>" method="post" name="adminForm" id="adminForm">
	<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
	<?php else : ?>
	<div id="j-main-container">
	<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this, 'options' => array('filterButton' => false))); ?>
		<div class="clearfix"> </div>
		<?php if (empty($this->items)) : ?>
		<div class="alert alert-no-items">
			<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
		</div>
		<?php else : ?>
		<table class="table table-striped">
			<thead>
				<tr>
					<th class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'COM_SEARCH_HEADING_PHRASE', 'a.search_term', $listDirn, $listOrder); ?>
					</th>
					<th width="15%" class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_HITS', 'a.hits', $listDirn, $listOrder); ?>
					</th>
					<th width="1%" class="nowrap center">
						<?php echo JText::_('COM_SEARCH_HEADING_RESULTS'); ?>
					</th>
				</tr>
			</thead>
			<tfoot>
				<tr>
					<td colspan="3">
						<?php echo $this->pagination->getListFooter(); ?>
					</td>
				</tr>
			</tfoot>
			<tbody>
			<?php foreach ($this->items as $i => $item) : ?>
				<tr class="row<?php echo $i % 2; ?>">
					<td class="break-word">
						<?php echo $this->escape($item->search_term); ?>
					</td>
					<td>
						<?php echo (int) $item->hits; ?>
					</td>
					<?php if ($this->state->get('show_results')) : ?>

					<td class="center btns">
						<a class="badge <?php if ($item->returns > 0) echo 'badge-success'; ?>" target="_blank" href="<?php echo JUri::root(); ?>index.php?option=com_search&amp;view=search&amp;searchword=<?php echo JFilterOutput::stringURLSafe($item->search_term); ?>">
							<?php echo $item->returns; ?><span class="icon-out-2" aria-hidden="true"></span><span class="element-invisible"><?php echo JText::_('JBROWSERTARGET_NEW'); ?></span></a>
					</td>
					<?php else : ?>
					<td class="center">
						<?php echo JText::_('COM_SEARCH_NO_RESULTS'); ?>
					</td>
					<?php endif; ?>
				</tr>
			<?php endforeach; ?>
			</tbody>
		</table>
		<?php endif; ?>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_search/models/searches.php000060400000010650152453623460014635 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_search
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Methods supporting a list of search terms.
 *
 * @since  1.6
 */
class SearchModelSearches extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'search_term', 'a.search_term',
				'hits', 'a.hits',
			);
		}

		parent::__construct($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.hits', $direction = 'asc')
	{
		// Load the filter state.
		$this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string'));

		// Special state for toggle results button.
		$this->setState('show_results', $this->getUserStateFromRequest($this->context . '.show_results', 'show_results', 1, 'int'));

		// Load the parameters.
		$params = JComponentHelper::getParams('com_search');
		$this->setState('params', $params);

		// 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.
	 *
	 * @since   1.6
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('show_results');
		$id .= ':' . $this->getState('filter.search');

		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);

		// Select the required fields from the table.
		$query->select(
			$this->getState(
				'list.select',
				'a.*'
			)
		);
		$query->from($db->quoteName('#__core_log_searches', 'a'));

		// Filter by search in title
		if ($search = $this->getState('filter.search'))
		{
			$search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%'));
			$query->where($db->quoteName('a.search_term') . ' LIKE ' . $search);
		}

		// Add the list ordering clause.
		$query->order($db->escape($this->getState('list.ordering', 'a.hits')) . ' ' . $db->escape($this->getState('list.direction', 'ASC')));

		return $query;
	}

	/**
	 * Override the parent getItems to inject optional data.
	 *
	 * @return  mixed  An array of objects on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function getItems()
	{
		$items = parent::getItems();

		// Determine if number of results for search item should be calculated
		// by default it is `off` as it is highly query intensive
		if ($this->getState('show_results'))
		{
			JPluginHelper::importPlugin('search');
			$app = JFactory::getApplication();

			if (!class_exists('JSite'))
			{
				// This fools the routers in the search plugins into thinking it's in the frontend
				JLoader::register('JSite', JPATH_ADMINISTRATOR . '/components/com_search/helpers/site.php');
			}

			foreach ($items as &$item)
			{
				$results = $app->triggerEvent('onContentSearch', array($item->search_term));
				$item->returns = 0;

				foreach ($results as $result)
				{
					$item->returns += count($result);
				}
			}
		}

		return $items;
	}

	/**
	 * Method to reset the search log table.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	public function reset()
	{
		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->delete($db->quoteName('#__core_log_searches'));
		$db->setQuery($query);

		try
		{
			$db->execute();
		}
		catch (RuntimeException $e)
		{
			$this->setError($e->getMessage());

			return false;
		}

		return true;
	}
}
components/com_search/models/forms/filter_searches.xml000060400000001566152453623460017347 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_SEARCH_SEARCH_IN_PHRASE"
			description="COM_SEARCH_SEARCH_IN_PHRASE"
			hint="JSEARCH_FILTER"
		/>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			onchange="this.form.submit();"
			default="a.hits ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.search_term ASC">COM_SEARCH_HEADING_SEARCH_TERM_ASC</option>
			<option value="a.search_term DESC">COM_SEARCH_HEADING_SEARCH_TERM_DESC</option>
			<option value="a.hits ASC">JGLOBAL_HITS_ASC</option>
			<option value="a.hits DESC">JGLOBAL_HITS_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_search/access.xml000060400000001020152453623460013016 0ustar00<?xml version="1.0" encoding="utf-8" ?>
<access component="com_search">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.options" title="JACTION_OPTIONS" description="JACTION_OPTIONS_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
	</section>
</access>
components/com_search/controller.php000060400000002147152453623460013742 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_search
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Search master display controller.
 *
 * @since  1.6
 */
class SearchController extends JControllerLegacy
{
	/**
	 * @var		string	The default view.
	 * @since   1.6
	 */
	protected $default_view = 'searches';

	/**
	 * 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  SearchController  This object to support chaining.
	 *
	 * @since   1.5
	 */
	public function display($cachable = false, $urlparams = false)
	{
		JLoader::register('SearchHelper', JPATH_ADMINISTRATOR . '/components/com_search/helpers/search.php');

		// Load the submenu.
		SearchHelper::addSubmenu($this->input->get('view', 'searches'));

		return parent::display();
	}
}
components/com_search/controllers/searches.php000060400000002253152453623460015720 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_search
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Methods supporting a list of search terms.
 *
 * @since  1.6
 */
class SearchControllerSearches extends JControllerLegacy
{
	/**
	 * Method to reset the search log table.
	 *
	 * @return  boolean
	 */
	public function reset()
	{
		// Check for request forgeries.
		$this->checkToken();

		$model = $this->getModel('Searches');

		if (!$model->reset())
		{
			JError::raiseWarning(500, $model->getError());
		}

		$this->setRedirect('index.php?option=com_search&view=searches');
	}

	/**
	 * Method to toggle the view of results.
	 *
	 * @return  boolean
	 */
	public function toggleResults()
	{
		// Check for request forgeries.
		$this->checkToken();

		if ($this->getModel('Searches')->getState('show_results', 1, 'int') === 0)
		{
			$this->setRedirect('index.php?option=com_search&view=searches&show_results=1');
		}
		else
		{
			$this->setRedirect('index.php?option=com_search&view=searches&show_results=0');
		}
	}
}
components/com_modules/layouts/toolbar/newmodule.php000060400000001034152453623460017115 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$text = JText::_('JTOOLBAR_NEW');
?>
<button onclick="location.href='index.php?option=com_modules&amp;view=select'" class="btn btn-small btn-success" title="<?php echo $text; ?>">
	<span class="icon-plus icon-white" aria-hidden="true"></span>
	<?php echo $text; ?>
</button>
components/com_modules/layouts/toolbar/cancelselect.php000060400000000757152453623460017556 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$text = JText::_('JTOOLBAR_CANCEL');
?>
<button onclick="location.href='index.php?option=com_modules'" class="btn" title="<?php echo $text; ?>">
	<span class="icon-remove" aria-hidden="true"></span> <?php echo $text; ?>
</button>
components/com_modules/modules.xml000060400000001747152453623460013450 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_modules</name>
	<author>Joomla! Project</author>
	<creationDate>April 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_MODULES_XML_DESCRIPTION</description>
	<administration>
		<files folder="admin">
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<filename>modules.php</filename>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_modules.ini</language>
			<language tag="en-GB">language/en-GB.com_modules.sys.ini</language>
		</languages>
	</administration>
</extension>
components/com_modules/controller.php000060400000006706152453623460014152 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Modules manager master display controller.
 *
 * @since  1.6
 */
class ModulesController extends JControllerLegacy
{
	/**
	 * Method to display a view.
	 *
	 * @param   boolean        $cachable   If true, the view output will be cached
	 * @param   array|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)
	{
		$id     = $this->input->getInt('id');

		$document = JFactory::getDocument();

		// For JSON requests
		if ($document->getType() == 'json')
		{
			$view = new ModulesViewModule;

			// Get/Create the model
			if ($model = new ModulesModelModule)
			{
				// Checkin table entry
				if (!$model->checkout($id))
				{
					JFactory::getApplication()->enqueueMessage(JText::_('JLIB_APPLICATION_ERROR_CHECKIN_USER_MISMATCH'), 'error');

					return false;
				}

				// Push the model into the view (as default)
				$view->setModel($model, true);
			}

			$view->document = $document;

			return $view->display();
		}

		JLoader::register('ModulesHelper', JPATH_ADMINISTRATOR . '/components/com_modules/helpers/modules.php');

		$layout = $this->input->get('layout', 'edit');
		$id     = $this->input->getInt('id');

		// Check for edit form.
		if ($layout == 'edit' && !$this->checkEditId('com_modules.edit.module', $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_modules&view=modules', false));

			return false;
		}

		// Load the submenu.
		ModulesHelper::addSubmenu($this->input->get('view', 'modules'));

		// Check custom administrator menu modules
		if (JModuleHelper::isAdminMultilang())
		{
			$languages = JLanguageHelper::getInstalledLanguages(1, true);
			$langCodes = array();

			foreach ($languages as $language)
			{
				if (isset($language->metadata['nativeName']))
				{
					$languageName = $language->metadata['nativeName'];
				}
				else
				{
					$languageName = $language->metadata['name'];
				}

				$langCodes[$language->metadata['tag']] = $languageName;
			}

			$db    = JFactory::getDbo();
			$query = $db->getQuery(true);

			$query->select($db->qn('m.language'))
				->from($db->qn('#__modules', 'm'))
				->where($db->qn('m.module') . ' = ' . $db->quote('mod_menu'))
				->where($db->qn('m.published') . ' = 1')
				->where($db->qn('m.client_id') . ' = 1')
				->group($db->qn('m.language'));

			$mLanguages = $db->setQuery($query)->loadColumn();

			// Check if we have a mod_menu module set to All languages or a mod_menu module for each admin language.
			if (!in_array('*', $mLanguages) && count($langMissing = array_diff(array_keys($langCodes), $mLanguages)))
			{
				$app         = JFactory::getApplication();
				$langMissing = array_intersect_key($langCodes, array_flip($langMissing));

				$app->enqueueMessage(JText::sprintf('JMENU_MULTILANG_WARNING_MISSING_MODULES', implode(', ', $langMissing)), 'warning');
			}
		}

		return parent::display();
	}
}
components/com_modules/modules.php000060400000001340152453623460013424 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
JHtml::_('behavior.tabstate');

$user  = JFactory::getUser();
$input = JFactory::getApplication()->input;

if (($input->get('layout') !== 'modal' && $input->get('view') !== 'modules')
	&& !$user->authorise('core.manage', 'com_modules'))
{
	throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
}

$controller = JControllerLegacy::getInstance('Modules');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
components/com_modules/models/forms/filter_modules.xml000060400000007374152453623460017430 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset addfieldpath="/administrator/components/com_modules/models/fields" />

	<field
		name="client_id"
		type="list"
		label=""
		filtermode="selector"
		layout="default"
		onchange="jQuery('#filter_position, #filter_module, #filter_language, #filter_menuitem').val('');this.form.submit();"
		>
		<option value="0">JSITE</option>
		<option value="1">JADMINISTRATOR</option>
	</field>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_MODULES_MODULES_FILTER_SEARCH_LABEL"
			description="COM_MODULES_MODULES_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
			noresults="COM_MODULES_MSG_MANAGE_NO_MODULES"
		/>
		<field
			name="state"
			type="status"
			label="JSTATUS"
			filter="*,-2,0,1"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>
		<field
			name="position"
			type="modulesposition"
			label="COM_MODULES_FIELD_POSITION_LABEL"
			onchange="this.form.submit();"
			>
			<option value="">COM_MODULES_OPTION_SELECT_POSITION</option>
		</field>
		<field
			name="module"
			type="ModulesModule"
			label="COM_MODULES_OPTION_SELECT_MODULE"
			onchange="this.form.submit();"
			>
			<option value="">COM_MODULES_OPTION_SELECT_MODULE</option>
		</field>
		<field
			name="menuitem"
			type="menuitem"
			label="COM_MODULES_OPTION_SELECT_MENU_ITEM"
			disable="separator,alias,heading,url"
			onchange="this.form.submit();"
			>
			<option	value="">COM_MODULES_OPTION_SELECT_MENU_ITEM</option>
			<option	value="-1">COM_MODULES_NONE</option>
		</field>
		<field
			name="access"
			type="accesslevel"
			label="JOPTION_FILTER_ACCESS"
			description="JOPTION_FILTER_ACCESS_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_ACCESS</option>
		</field>
		<field
			name="language"
			type="contentlanguage"
			label="JOPTION_FILTER_LANGUAGE"
			description="JOPTION_FILTER_LANGUAGE_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_LANGUAGE</option>
			<option value="*">JALL</option>
		</field>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			statuses="*,0,1,-2"
			onchange="this.form.submit();"
			default="a.position ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.published ASC">JSTATUS_ASC</option>
			<option value="a.published DESC">JSTATUS_DESC</option>
			<option value="a.title ASC">JGLOBAL_TITLE_ASC</option>
			<option value="a.title DESC">JGLOBAL_TITLE_DESC</option>
			<option value="a.position ASC">COM_MODULES_HEADING_POSITION_ASC</option>
			<option value="a.position DESC">COM_MODULES_HEADING_POSITION_DESC</option>
			<option value="name ASC">COM_MODULES_HEADING_MODULE_ASC</option>
			<option value="name DESC">COM_MODULES_HEADING_MODULE_DESC</option>
			<option value="pages ASC">COM_MODULES_HEADING_PAGES_ASC</option>
			<option value="pages DESC">COM_MODULES_HEADING_PAGES_DESC</option>
			<option value="ag.title ASC">JGRID_HEADING_ACCESS_ASC</option>
			<option value="ag.title DESC">JGRID_HEADING_ACCESS_DESC</option>
			<option value="l.title ASC">JGRID_HEADING_LANGUAGE_ASC</option>
			<option value="l.title DESC">JGRID_HEADING_LANGUAGE_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			label="COM_MODULES_LIST_LIMIT"
			description="JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_modules/models/forms/advanced.xml000060400000002050152453623460016142 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="params">
		<fieldset
			name="advanced">

			<field
				name="module_tag"
				type="moduletag"
				label="COM_MODULES_FIELD_MODULE_TAG_LABEL"
				description="COM_MODULES_FIELD_MODULE_TAG_DESC"
				default="div"
				validate="options"
			/>

			<field
				name="bootstrap_size"
				type="integer"
				label="COM_MODULES_FIELD_BOOTSTRAP_SIZE_LABEL"
				description="COM_MODULES_FIELD_BOOTSTRAP_SIZE_DESC"
				first="0"
				last="12"
				step="1"
			/>

			<field
				name="header_tag"
				type="headertag"
				label="COM_MODULES_FIELD_HEADER_TAG_LABEL"
				description="COM_MODULES_FIELD_HEADER_TAG_DESC"
				default="h3"
				validate="options"
			/>

			<field
				name="header_class"
				type="text"
				label="COM_MODULES_FIELD_HEADER_CLASS_LABEL"
				description="COM_MODULES_FIELD_HEADER_CLASS_DESC"
			/>

			<field
				name="style"
				type="chromestyle"
				label="COM_MODULES_FIELD_MODULE_STYLE_LABEL"
				description="COM_MODULES_FIELD_MODULE_STYLE_DESC"
			/>
		</fieldset>
	</fields>
</form>
components/com_modules/models/forms/module.xml000060400000006371152453623460015674 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<field 
			name="id" 
			type="number"
			label="JGLOBAL_FIELD_ID_LABEL"
			description="JGLOBAL_FIELD_ID_DESC"
			default="0"
			readonly="true"
		/>

		<field 
			name="title" 
			type="text"
			label="JGLOBAL_TITLE"
			description="COM_MODULES_FIELD_TITLE_DESC"
			class="input-xxlarge input-large-text"
			size="40"
			maxlength="100"
			required="true"
		/>

		<field 
			name="note" 
			type="text"
			label="COM_MODULES_FIELD_NOTE_LABEL"
			description="COM_MODULES_FIELD_NOTE_DESC"
			maxlength="255"
			size="40"
			class="span12"
		/>

		<field 
			name="module" 
			type="hidden"
			label="COM_MODULES_FIELD_MODULE_LABEL"
			description="COM_MODULES_FIELD_MODULE_DESC"
			readonly="readonly"
			size="20"
		/>

		<field 
			name="showtitle" 
			type="radio"
			label="COM_MODULES_FIELD_SHOWTITLE_LABEL"
			description="COM_MODULES_FIELD_SHOWTITLE_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			size="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field 
			name="published" 
			type="list"
			label="JSTATUS"
			description="COM_MODULES_FIELD_PUBLISHED_DESC"
			class="chzn-color-state"
			default="1"
			size="1"
			>
			<option value="1">JPUBLISHED</option>
			<option value="0">JUNPUBLISHED</option>
			<option value="-2">JTRASHED</option>
		</field>

		<field
			name="publish_up"
			type="calendar"
			label="COM_MODULES_FIELD_PUBLISH_UP_LABEL"
			description="COM_MODULES_FIELD_PUBLISH_UP_DESC"
			filter="user_utc"
			translateformat="true"
			showtime="true"
			size="22"
		/>

		<field
			name="publish_down"
			type="calendar"
			label="COM_MODULES_FIELD_PUBLISH_DOWN_LABEL"
			description="COM_MODULES_FIELD_PUBLISH_DOWN_DESC"
			filter="user_utc"
			translateformat="true"
			showtime="true"
			size="22"
		/>

		<field 
			name="client_id" 
			type="hidden"
			label="COM_MODULES_FIELD_CLIENT_ID_LABEL"
			description="COM_MODULES_FIELD_CLIENT_ID_DESC"
			readonly="true"
			size="1"
		/>

		<field 
			name="position" 
			type="moduleposition"
			label="COM_MODULES_FIELD_POSITION_LABEL"
			description="COM_MODULES_FIELD_POSITION_DESC"
			default=""
			maxlength="50"
		/>

		<field 
			name="access" 
			type="accesslevel"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			size="1"
		/>

		<field 
			name="ordering" 
			type="moduleorder"
			label="JFIELD_ORDERING_LABEL"
			description="JFIELD_ORDERING_DESC"
			linked="position"
		/>

		<field 
			name="content" 
			type="editor"
			label="COM_MODULES_FIELD_CONTENT_LABEL"
			description="COM_MODULES_FIELD_CONTENT_DESC"
			buttons="true"
			filter="JComponentHelper::filterText"
			hide="readmore,pagebreak,module"
		/>

		<field 
			name="language" 
			type="contentlanguage"
			label="JFIELD_LANGUAGE_LABEL"
			description="JFIELD_MODULE_LANGUAGE_DESC"
			>
			<option value="*">JALL</option>
		</field>

		<field 
			name="assignment" 
			type="hidden"
		/>

		<field 
			name="assigned" 
			type="hidden"
		/>

		<field 
			name="asset_id" 
			type="hidden"
			filter="unset"
		/>

		<field 
			name="rules" 
			type="rules"
			label="JFIELD_RULES_LABEL"
			translate_label="false"
			filter="rules"
			component="com_modules"
			section="module"
			validate="rules"
		/>
	</fieldset>
</form>
components/com_modules/models/forms/moduleadmin.xml000060400000006375152453623460016711 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<field 
			name="id" 
			type="number"
			label="JGLOBAL_FIELD_ID_LABEL"
			description="JGLOBAL_FIELD_ID_DESC"
			default="0"
			readonly="true"
		/>

		<field 
			name="title" 
			type="text"
			label="JGLOBAL_TITLE"
			description="COM_MODULES_FIELD_TITLE_DESC"
			class="input-xxlarge input-large-text"
			size="40"
			maxlength="100"
			required="true"
		/>

		<field 
			name="note" 
			type="text"
			label="COM_MODULES_FIELD_NOTE_LABEL"
			description="COM_MODULES_FIELD_NOTE_DESC"
			maxlength="255"
			size="40"
			class="span12"
		/>

		<field 
			name="module" 
			type="hidden"
			label="COM_MODULES_FIELD_MODULE_LABEL"
			description="COM_MODULES_FIELD_MODULE_DESC"
			readonly="readonly"
			size="20"
		/>

		<field 
			name="showtitle" 
			type="radio"
			label="COM_MODULES_FIELD_SHOWTITLE_LABEL"
			description="COM_MODULES_FIELD_SHOWTITLE_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			size="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field 
			name="published" 
			type="list"
			label="JSTATUS"
			description="COM_MODULES_FIELD_PUBLISHED_DESC"
			class="chzn-color-state"
			default="1"
			size="1"
			>
			<option value="1">JPUBLISHED</option>
			<option value="0">JUNPUBLISHED</option>
			<option value="-2">JTRASHED</option>
		</field>

		<field
			name="publish_up"
			type="calendar"
			label="COM_MODULES_FIELD_PUBLISH_UP_LABEL"
			description="COM_MODULES_FIELD_PUBLISH_UP_DESC"
			filter="user_utc"
			translateformat="true"
			showtime="true"
			size="22"
		/>

		<field
			name="publish_down"
			type="calendar"
			label="COM_MODULES_FIELD_PUBLISH_DOWN_LABEL"
			description="COM_MODULES_FIELD_PUBLISH_DOWN_DESC"
			filter="user_utc"
			translateformat="true"
			showtime="true"
			size="22"
		/>

		<field 
			name="client_id" 
			type="hidden"
			label="COM_MODULES_FIELD_CLIENT_ID_LABEL"
			description="COM_MODULES_FIELD_CLIENT_ID_DESC"
			readonly="true"
			size="1"
		/>

		<field 
			name="position" 
			type="moduleposition"
			label="COM_MODULES_FIELD_POSITION_LABEL"
			description="COM_MODULES_FIELD_POSITION_DESC"
			default=""
			maxlength="50"
		/>

		<field 
			name="access" 
			type="accesslevel"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
			size="1"
		/>

		<field 
			name="ordering" 
			type="moduleorder"
			label="JFIELD_ORDERING_LABEL"
			description="JFIELD_ORDERING_DESC"
			linked="position"
		/>

		<field
			name="language"
			type="language"
			label="JFIELD_LANGUAGE_LABEL"
			description="JFIELD_MODULE_LANGUAGE_DESC"
			default="*"
			client="administrator"
			>
			<option value="*">JALL</option>
		</field>

		<field 
			name="content" 
			type="editor"
			label="COM_MODULES_FIELD_CONTENT_LABEL"
			description="COM_MODULES_FIELD_CONTENT_DESC"
			buttons="true"
			filter="JComponentHelper::filterText"
			hide="readmore,pagebreak,module"
		/>

		<field name="assignment" type="hidden" />

		<field name="assigned" type="hidden" />

		<field name="asset_id" type="hidden"
			filter="unset"
		/>

		<field 
			name="rules" 
			type="rules"
			label="JFIELD_RULES_LABEL"
			translate_label="false"
			filter="rules"
			component="com_modules"
			section="module"
			validate="rules"
		/>
	</fieldset>
</form>
components/com_modules/models/forms/filter_modulesadmin.xml000060400000006601152453623460020431 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset addfieldpath="/administrator/components/com_modules/models/fields" />

	<field
		name="client_id"
		type="list"
		label=""
		filtermode="selector"
		layout="default"
		onchange="jQuery('#filter_position, #filter_module, #filter_language').val('');this.form.submit();"
		>
		<option value="0">JSITE</option>
		<option value="1">JADMINISTRATOR</option>
	</field>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_MODULES_MODULES_FILTER_SEARCH_LABEL"
			description="COM_MODULES_MODULES_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
			noresults="COM_MODULES_MSG_MANAGE_NO_MODULES"
		/>
		<field
			name="state"
			type="status"
			label="JSTATUS"
			filter="*,-2,0,1"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>
		<field
			name="position"
			type="modulesposition"
			label="COM_MODULES_FIELD_POSITION_LABEL"
			onchange="this.form.submit();"
			>
			<option value="">COM_MODULES_OPTION_SELECT_POSITION</option>
		</field>
		<field
			name="module"
			type="ModulesModule"
			label="COM_MODULES_OPTION_SELECT_MODULE"
			onchange="this.form.submit();"
			>
			<option value="">COM_MODULES_OPTION_SELECT_MODULE</option>
		</field>
		<field
			name="access"
			type="accesslevel"
			label="JOPTION_FILTER_ACCESS"
			description="JOPTION_FILTER_ACCESS_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_ACCESS</option>
		</field>
		<field
			name="language"
			type="language"
			label="JOPTION_FILTER_LANGUAGE"
			description="JOPTION_FILTER_LANGUAGE_DESC"
			client="administrator"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_LANGUAGE</option>
			<option value="*">JALL</option>
		</field>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			statuses="*,0,1,-2"
			onchange="this.form.submit();"
			default="a.position ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.published ASC">JSTATUS_ASC</option>
			<option value="a.published DESC">JSTATUS_DESC</option>
			<option value="a.title ASC">JGLOBAL_TITLE_ASC</option>
			<option value="a.title DESC">JGLOBAL_TITLE_DESC</option>
			<option value="a.position ASC">COM_MODULES_HEADING_POSITION_ASC</option>
			<option value="a.position DESC">COM_MODULES_HEADING_POSITION_DESC</option>
			<option value="name ASC">COM_MODULES_HEADING_MODULE_ASC</option>
			<option value="name DESC">COM_MODULES_HEADING_MODULE_DESC</option>
			<option value="ag.title ASC">JGRID_HEADING_ACCESS_ASC</option>
			<option value="ag.title DESC">JGRID_HEADING_ACCESS_DESC</option>
			<option value="a.language ASC" requires="adminlanguage">JGRID_HEADING_LANGUAGE_ASC</option>
			<option value="a.language DESC" requires="adminlanguage">JGRID_HEADING_LANGUAGE_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			label="COM_MODULES_LIST_LIMIT"
			description="JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_modules/models/module.php000060400000066721152453623460014542 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Module model.
 *
 * @since  1.6
 */
class ModulesModelModule extends JModelAdmin
{
	/**
	 * The type alias for this content type.
	 *
	 * @var      string
	 * @since    3.4
	 */
	public $typeAlias = 'com_modules.module';

	/**
	 * @var    string  The prefix to use with controller messages.
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_MODULES';

	/**
	 * @var    string  The help screen key for the module.
	 * @since  1.6
	 */
	protected $helpKey = 'JHELP_EXTENSIONS_MODULE_MANAGER_EDIT';

	/**
	 * @var    string  The help screen base URL for the module.
	 * @since  1.6
	 */
	protected $helpURL;

	/**
	 * Batch copy/move command. If set to false,
	 * the batch copy/move command is not supported
	 *
	 * @var string
	 */
	protected $batch_copymove = 'position_id';

	/**
	 * Allowed batch commands
	 *
	 * @var array
	 */
	protected $batch_commands = array(
		'assetgroup_id' => 'batchAccess',
		'language_id' => 'batchLanguage',
	);

	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 */
	public function __construct($config = array())
	{
		$config = array_merge(
			array(
				'event_after_delete'  => 'onExtensionAfterDelete',
				'event_after_save'    => 'onExtensionAfterSave',
				'event_before_delete' => 'onExtensionBeforeDelete',
				'event_before_save'   => 'onExtensionBeforeSave',
				'events_map'          => array(
					'save'   => 'extension',
					'delete' => 'extension'
				)
			), $config
		);

		parent::__construct($config);
	}

	/**
	 * 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()
	{
		$app = JFactory::getApplication('administrator');

		// Load the User state.
		$pk = $app->input->getInt('id');

		if (!$pk)
		{
			if ($extensionId = (int) $app->getUserState('com_modules.add.module.extension_id'))
			{
				$this->setState('extension.id', $extensionId);
			}
		}

		$this->setState('module.id', $pk);

		// Load the parameters.
		$params = JComponentHelper::getParams('com_modules');
		$this->setState('params', $params);
	}

	/**
	 * Batch copy modules to a new position or current.
	 *
	 * @param   integer  $value     The new value matching a module position.
	 * @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 batchCopy($value, $pks, $contexts)
	{
		// Set the variables
		$user = JFactory::getUser();
		$table = $this->getTable();
		$newIds = array();

		foreach ($pks as $pk)
		{
			if ($user->authorise('core.create', 'com_modules'))
			{
				$table->reset();
				$table->load($pk);

				// Set the new position
				if ($value == 'noposition')
				{
					$position = '';
				}
				elseif ($value == 'nochange')
				{
					$position = $table->position;
				}
				else
				{
					$position = $value;
				}

				$table->position = $position;

				// Copy of the Asset ID
				$oldAssetId = $table->asset_id;

				// Alter the title if necessary
				$data = $this->generateNewTitle(0, $table->title, $table->position);
				$table->title = $data['0'];

				// Reset the ID because we are making a copy
				$table->id = 0;

				// Unpublish the new module
				$table->published = 0;

				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;

				// Now we need to handle the module assignments
				$db = $this->getDbo();
				$query = $db->getQuery(true)
					->select($db->quoteName('menuid'))
					->from($db->quoteName('#__modules_menu'))
					->where($db->quoteName('moduleid') . ' = ' . $pk);
				$db->setQuery($query);
				$menus = $db->loadColumn();

				// Insert the new records into the table
				foreach ($menus as $menu)
				{
					$query->clear()
						->insert($db->quoteName('#__modules_menu'))
						->columns(array($db->quoteName('moduleid'), $db->quoteName('menuid')))
						->values($newId . ', ' . $menu);
					$db->setQuery($query);
					$db->execute();
				}

				// Copy rules
				$query->clear()
					->update($db->quoteName('#__assets', 't'))
					->join('INNER', $db->quoteName('#__assets', 's') .
						' ON ' . $db->quoteName('s.id') . ' = ' . $oldAssetId
					)
					->set($db->quoteName('t.rules') . ' = ' . $db->quoteName('s.rules'))
					->where($db->quoteName('t.id') . ' = ' . $table->asset_id);

				$db->setQuery($query)->execute();
			}
			else
			{
				$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_CREATE'));

				return false;
			}
		}

		// Clean the cache
		$this->cleanCache();

		return $newIds;
	}

	/**
	 * Batch move modules to a new position or current.
	 *
	 * @param   integer  $value     The new value matching a module position.
	 * @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 batchMove($value, $pks, $contexts)
	{
		// Set the variables
		$user = JFactory::getUser();
		$table = $this->getTable();

		foreach ($pks as $pk)
		{
			if ($user->authorise('core.edit', 'com_modules'))
			{
				$table->reset();
				$table->load($pk);

				// Set the new position
				if ($value == 'noposition')
				{
					$position = '';
				}
				elseif ($value == 'nochange')
				{
					$position = $table->position;
				}
				else
				{
					$position = $value;
				}

				$table->position = $position;

				if (!$table->store())
				{
					$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;
	}

	/**
	 * 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   3.2
	 */
	protected function canEditState($record)
	{
		// Check for existing module.
		if (!empty($record->id))
		{
			return JFactory::getUser()->authorise('core.edit.state', 'com_modules.module.' . (int) $record->id);
		}

		// Default to component settings if module not known.
		return parent::canEditState($record);
	}

	/**
	 * Method to delete rows.
	 *
	 * @param   array  &$pks  An array of item ids.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   1.6
	 * @throws  Exception
	 */
	public function delete(&$pks)
	{
		$dispatcher = JEventDispatcher::getInstance();
		$pks        = (array) $pks;
		$user       = JFactory::getUser();
		$table      = $this->getTable();
		$context    = $this->option . '.' . $this->name;

		// Include the plugins for the on delete events.
		JPluginHelper::importPlugin($this->events_map['delete']);

		// Iterate the items to delete each one.
		foreach ($pks as $pk)
		{
			if ($table->load($pk))
			{
				// Access checks.
				if (!$user->authorise('core.delete', 'com_modules.module.' . (int) $pk) || $table->published != -2)
				{
					JError::raiseWarning(403, JText::_('JERROR_CORE_DELETE_NOT_PERMITTED'));

					return;
				}

				// Trigger the before delete event.
				$result = $dispatcher->trigger($this->event_before_delete, array($context, $table));

				if (in_array(false, $result, true) || !$table->delete($pk))
				{
					throw new Exception($table->getError());
				}
				else
				{
					// Delete the menu assignments
					$db    = $this->getDbo();
					$query = $db->getQuery(true)
						->delete('#__modules_menu')
						->where('moduleid=' . (int) $pk);
					$db->setQuery($query);
					$db->execute();

					// Trigger the after delete event.
					$dispatcher->trigger($this->event_after_delete, array($context, $table));
				}

				// Clear module cache
				parent::cleanCache($table->module, $table->client_id);
			}
			else
			{
				throw new Exception($table->getError());
			}
		}

		// Clear modules cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Method to duplicate modules.
	 *
	 * @param   array  &$pks  An array of primary key IDs.
	 *
	 * @return  boolean|JException  Boolean true on success, JException instance on error
	 *
	 * @since   1.6
	 * @throws  Exception
	 */
	public function duplicate(&$pks)
	{
		$user = JFactory::getUser();
		$db   = $this->getDbo();

		// Access checks.
		if (!$user->authorise('core.create', 'com_modules'))
		{
			throw new Exception(JText::_('JERROR_CORE_CREATE_NOT_PERMITTED'));
		}

		$table = $this->getTable();

		foreach ($pks as $pk)
		{
			if ($table->load($pk, true))
			{
				// Reset the id to create a new record.
				$table->id = 0;

				// Alter the title.
				$m = null;

				if (preg_match('#\((\d+)\)$#', $table->title, $m))
				{
					$table->title = preg_replace('#\(\d+\)$#', '(' . ($m[1] + 1) . ')', $table->title);
				}

				$data = $this->generateNewTitle(0, $table->title, $table->position);
				$table->title = $data[0];

				// Unpublish duplicate module
				$table->published = 0;

				if (!$table->check() || !$table->store())
				{
					throw new Exception($table->getError());
				}

				$query = $db->getQuery(true)
					->select($db->quoteName('menuid'))
					->from($db->quoteName('#__modules_menu'))
					->where($db->quoteName('moduleid') . ' = ' . (int) $pk);

				$db->setQuery($query);
				$rows = $db->loadColumn();

				foreach ($rows as $menuid)
				{
					$tuples[] = (int) $table->id . ',' . (int) $menuid;
				}
			}
			else
			{
				throw new Exception($table->getError());
			}
		}

		if (!empty($tuples))
		{
			// Module-Menu Mapping: Do it in one query
			$query = $db->getQuery(true)
				->insert($db->quoteName('#__modules_menu'))
				->columns($db->quoteName(array('moduleid', 'menuid')))
				->values($tuples);

			$db->setQuery($query);

			try
			{
				$db->execute();
			}
			catch (RuntimeException $e)
			{
				return JError::raiseWarning(500, $e->getMessage());
			}
		}

		// Clear modules cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Method to change the title.
	 *
	 * @param   integer  $categoryId  The id of the category. Not used here.
	 * @param   string   $title       The title.
	 * @param   string   $position    The position.
	 *
	 * @return  array  Contains the modified title.
	 *
	 * @since   2.5
	 */
	protected function generateNewTitle($categoryId, $title, $position)
	{
		// Alter the title & alias
		$table = $this->getTable();

		while ($table->load(array('position' => $position, 'title' => $title)))
		{
			$title = StringHelper::increment($title);
		}

		return array($title);
	}

	/**
	 * Method to get the client object
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function &getClient()
	{
		return $this->_client;
	}

	/**
	 * 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  A JForm object on success, false on failure
	 *
	 * @since   1.6
	 */
	public function getForm($data = array(), $loadData = true)
	{
		// The folder and element vars are passed when saving the form.
		if (empty($data))
		{
			$item     = $this->getItem();
			$clientId = $item->client_id;
			$module   = $item->module;
			$id       = $item->id;
		}
		else
		{
			$clientId = ArrayHelper::getValue($data, 'client_id');
			$module   = ArrayHelper::getValue($data, 'module');
			$id       = ArrayHelper::getValue($data, 'id');
		}

		// Add the default fields directory
		$baseFolder = $clientId ? JPATH_ADMINISTRATOR : JPATH_SITE;
		JForm::addFieldPath($baseFolder . '/modules' . '/' . $module . '/field');

		// These variables are used to add data from the plugin XML files.
		$this->setState('item.client_id', $clientId);
		$this->setState('item.module', $module);

		// Get the form.
		if ($clientId == 1)
		{
			$form = $this->loadForm('com_modules.module.admin', 'moduleadmin', array('control' => 'jform', 'load_data' => $loadData), true);

			// Display language field to filter admin custom menus per language
			if (!JModuleHelper::isAdminMultilang())
			{
				$form->setFieldAttribute('language', 'type', 'hidden');
			}
		}
		else
		{
			$form = $this->loadForm('com_modules.module', 'module', array('control' => 'jform', 'load_data' => $loadData), true);
		}

		if (empty($form))
		{
			return false;
		}

		$form->setFieldAttribute('position', 'client', $this->getState('item.client_id') == 0 ? 'site' : 'administrator');

		$user = JFactory::getUser();

		/**
		 * Check for existing module
		 * Modify the form based on Edit State access controls.
		 */
		if ($id != 0 && (!$user->authorise('core.edit.state', 'com_modules.module.' . (int) $id))
			|| ($id == 0 && !$user->authorise('core.edit.state', 'com_modules'))		)
		{
			// Disable fields for display.
			$form->setFieldAttribute('ordering', 'disabled', 'true');
			$form->setFieldAttribute('published', 'disabled', 'true');
			$form->setFieldAttribute('publish_up', 'disabled', 'true');
			$form->setFieldAttribute('publish_down', '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');
			$form->setFieldAttribute('publish_up', 'filter', 'unset');
			$form->setFieldAttribute('publish_down', '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()
	{
		$app = JFactory::getApplication();

		// Check the session for previously entered form data.
		$data = $app->getUserState('com_modules.edit.module.data', array());

		if (empty($data))
		{
			$data = $this->getItem();

			// Pre-select some filters (Status, Module Position, Language, Access Level) in edit form if those have been selected in Module Manager
			if (!$data->id)
			{
				$filters = (array) $app->getUserState('com_modules.modules.filter');
				$data->set('published', $app->input->getInt('published', ((isset($filters['state']) && $filters['state'] !== '') ? $filters['state'] : null)));
				$data->set('position', $app->input->getInt('position', (!empty($filters['position']) ? $filters['position'] : 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'))));
			}

			// Avoid to delete params of a second module opened in a new browser tab while new one is not saved yet.
			if (empty($data->params))
			{
				// This allows us to inject parameter settings into a new module.
				$params = $app->getUserState('com_modules.add.module.params');

				if (is_array($params))
				{
					$data->set('params', $params);
				}
			}
		}

		$this->preprocessData('com_modules.module', $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)
	{
		$pk = (!empty($pk)) ? (int) $pk : (int) $this->getState('module.id');
		$db = $this->getDbo();

		if (!isset($this->_cache[$pk]))
		{
			// Get a row instance.
			$table = $this->getTable();

			// Attempt to load the row.
			$return = $table->load($pk);

			// Check for a table object error.
			if ($return === false && $error = $table->getError())
			{
				$this->setError($error);

				return false;
			}

			// Check if we are creating a new extension.
			if (empty($pk))
			{
				if ($extensionId = (int) $this->getState('extension.id'))
				{
					$query = $db->getQuery(true)
						->select('element, client_id')
						->from('#__extensions')
						->where('extension_id = ' . $extensionId)
						->where('type = ' . $db->quote('module'));
					$db->setQuery($query);

					try
					{
						$extension = $db->loadObject();
					}
					catch (RuntimeException $e)
					{
						$this->setError($e->getMessage());

						return false;
					}

					if (empty($extension))
					{
						$this->setError('COM_MODULES_ERROR_CANNOT_FIND_MODULE');

						return false;
					}

					// Extension found, prime some module values.
					$table->module    = $extension->element;
					$table->client_id = $extension->client_id;
				}
				else
				{
					JFactory::getApplication()->redirect(JRoute::_('index.php?option=com_modules&view=modules', false));

					return false;
				}
			}

			// Convert to the JObject before adding other data.
			$properties        = $table->getProperties(1);
			$this->_cache[$pk] = ArrayHelper::toObject($properties, 'JObject');

			// Convert the params field to an array.
			$registry = new Registry($table->params);
			$this->_cache[$pk]->params = $registry->toArray();

			// Determine the page assignment mode.
			$query = $db->getQuery(true)
				->select($db->quoteName('menuid'))
				->from($db->quoteName('#__modules_menu'))
				->where($db->quoteName('moduleid') . ' = ' . (int) $pk);
			$db->setQuery($query);
			$assigned = $db->loadColumn();

			if (empty($pk))
			{
				// If this is a new module, assign to all pages.
				$assignment = 0;
			}
			elseif (empty($assigned))
			{
				// For an existing module it is assigned to none.
				$assignment = '-';
			}
			else
			{
				if ($assigned[0] > 0)
				{
					$assignment = 1;
				}
				elseif ($assigned[0] < 0)
				{
					$assignment = -1;
				}
				else
				{
					$assignment = 0;
				}
			}

			$this->_cache[$pk]->assigned   = $assigned;
			$this->_cache[$pk]->assignment = $assignment;

			// Get the module XML.
			$client = JApplicationHelper::getClientInfo($table->client_id);
			$path   = JPath::clean($client->path . '/modules/' . $table->module . '/' . $table->module . '.xml');

			if (file_exists($path))
			{
				$this->_cache[$pk]->xml = simplexml_load_file($path);
			}
			else
			{
				$this->_cache[$pk]->xml = null;
			}
		}

		return $this->_cache[$pk];
	}

	/**
	 * Get the necessary data to load an item help screen.
	 *
	 * @return  object  An object with key, url, and local properties for loading the item help screen.
	 *
	 * @since   1.6
	 */
	public function getHelp()
	{
		return (object) array('key' => $this->helpKey, 'url' => $this->helpURL);
	}

	/**
	 * 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 database object
	 *
	 * @since   1.6
	 */
	public function getTable($type = 'Module', $prefix = 'JTable', $config = array())
	{
		return JTable::getInstance($type, $prefix, $config);
	}

	/**
	 * Prepare and sanitise the table prior to saving.
	 *
	 * @param   JTable  $table  The database object
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function prepareTable($table)
	{
		$table->title    = htmlspecialchars_decode($table->title, ENT_QUOTES);
		$table->position = trim($table->position);
	}

	/**
	 * Method to preprocess the form
	 *
	 * @param   JForm   $form   A form 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 loading the form.
	 */
	protected function preprocessForm(JForm $form, $data, $group = 'content')
	{
		jimport('joomla.filesystem.path');

		$lang     = JFactory::getLanguage();
		$clientId = $this->getState('item.client_id');
		$module   = $this->getState('item.module');

		$client   = JApplicationHelper::getClientInfo($clientId);
		$formFile = JPath::clean($client->path . '/modules/' . $module . '/' . $module . '.xml');

		// Load the core and/or local language file(s).
		$lang->load($module, $client->path, null, false, true)
		||	$lang->load($module, $client->path . '/modules/' . $module, null, false, true);

		if (file_exists($formFile))
		{
			// Get the module form.
			if (!$form->loadFile($formFile, false, '//config'))
			{
				throw new Exception(JText::_('JERROR_LOADFILE_FAILED'));
			}

			// Attempt to load the xml file.
			if (!$xml = simplexml_load_file($formFile))
			{
				throw new Exception(JText::_('JERROR_LOADFILE_FAILED'));
			}

			// Get the help data from the XML file if present.
			$help = $xml->xpath('/extension/help');

			if (!empty($help))
			{
				$helpKey = trim((string) $help[0]['key']);
				$helpURL = trim((string) $help[0]['url']);

				$this->helpKey = $helpKey ?: $this->helpKey;
				$this->helpURL = $helpURL ?: $this->helpURL;
			}
		}

		// Load the default advanced params
		JForm::addFormPath(JPATH_ADMINISTRATOR . '/components/com_modules/models/forms');
		$form->loadFile('advanced', false);

		// Trigger the default form events.
		parent::preprocessForm($form, $data, $group);
	}

	/**
	 * Loads ContentHelper for filters before validating data.
	 *
	 * @param   object  $form   The form to validate against.
	 * @param   array   $data   The data to validate.
	 * @param   string  $group  The name of the group(defaults to null).
	 *
	 * @return  mixed  Array of filtered data if valid, false otherwise.
	 *
	 * @since   1.1
	 */
	public function validate($form, $data, $group = null)
	{
		JLoader::register('ContentHelper', JPATH_ADMINISTRATOR . '/components/com_content/helpers/content.php');

		if (!JFactory::getUser()->authorise('core.admin', 'com_modules'))
		{
			if (isset($data['rules']))
			{
				unset($data['rules']);
			}
		}

		return parent::validate($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();
		$input      = JFactory::getApplication()->input;
		$table      = $this->getTable();
		$pk         = (!empty($data['id'])) ? $data['id'] : (int) $this->getState('module.id');
		$isNew      = true;
		$context    = $this->option . '.' . $this->name;

		// Include the plugins for the save event.
		JPluginHelper::importPlugin($this->events_map['save']);

		// Load the row if saving an existing record.
		if ($pk > 0)
		{
			$table->load($pk);
			$isNew = false;
		}

		// Alter the title and published state for Save as Copy
		if ($input->get('task') == 'save2copy')
		{
			$orig_table = clone $this->getTable();
			$orig_table->load((int) $input->getInt('id'));
			$data['published'] = 0;

			if ($data['title'] == $orig_table->title)
			{
				$data['title'] = StringHelper::increment($data['title']);
			}
		}

		// Bind the data.
		if (!$table->bind($data))
		{
			$this->setError($table->getError());

			return false;
		}

		// Prepare the row for saving
		$this->prepareTable($table);

		// 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));

		if (in_array(false, $result, true))
		{
			$this->setError($table->getError());

			return false;
		}

		// Store the data.
		if (!$table->store())
		{
			$this->setError($table->getError());

			return false;
		}

		// Process the menu link mappings.
		$assignment = isset($data['assignment']) ? $data['assignment'] : 0;

		// Delete old module to menu item associations
		$db    = $this->getDbo();
		$query = $db->getQuery(true)
			->delete('#__modules_menu')
			->where('moduleid = ' . (int) $table->id);
		$db->setQuery($query);

		try
		{
			$db->execute();
		}
		catch (RuntimeException $e)
		{
			$this->setError($e->getMessage());

			return false;
		}

		// If the assignment is numeric, then something is selected (otherwise it's none).
		if (is_numeric($assignment))
		{
			// Variable is numeric, but could be a string.
			$assignment = (int) $assignment;

			// Logic check: if no module excluded then convert to display on all.
			if ($assignment == -1 && empty($data['assigned']))
			{
				$assignment = 0;
			}

			// Check needed to stop a module being assigned to `All`
			// and other menu items resulting in a module being displayed twice.
			if ($assignment === 0)
			{
				// Assign new module to `all` menu item associations.
				$query->clear()
					->insert('#__modules_menu')
					->columns(array($db->quoteName('moduleid'), $db->quoteName('menuid')))
					->values((int) $table->id . ', 0');
				$db->setQuery($query);

				try
				{
					$db->execute();
				}
				catch (RuntimeException $e)
				{
					$this->setError($e->getMessage());

					return false;
				}
			}
			elseif (!empty($data['assigned']))
			{
				// Get the sign of the number.
				$sign = $assignment < 0 ? -1 : 1;

				$query->clear()
					->insert($db->quoteName('#__modules_menu'))
					->columns($db->quoteName(array('moduleid', 'menuid')));

				foreach ($data['assigned'] as &$pk)
				{
					$query->values((int) $table->id . ',' . (int) $pk * $sign);
				}

				$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));

		// Compute the extension id of this module in case the controller wants it.
		$query->clear()
			->select($db->quoteName('extension_id'))
			->from($db->quoteName('#__extensions', 'e'))
			->join(
				'LEFT',
				$db->quoteName('#__modules', 'm') . ' ON ' . $db->quoteName('e.client_id') . ' = ' . (int) $table->client_id .
				' AND ' . $db->quoteName('e.element') . ' = ' . $db->quoteName('m.module')
			)
			->where($db->quoteName('m.id') . ' = ' . (int) $table->id);
		$db->setQuery($query);

		try
		{
			$extensionId = $db->loadResult();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $e->getMessage());

			return false;
		}

		$this->setState('module.extension_id', $extensionId);
		$this->setState('module.id', $table->id);

		// Clear modules cache
		$this->cleanCache();

		// Clean module cache
		parent::cleanCache($table->module, $table->client_id);

		return true;
	}

	/**
	 * A protected method to get a set of ordering conditions.
	 *
	 * @param   object  $table  A record object.
	 *
	 * @return  array  An array of conditions to add to add to ordering queries.
	 *
	 * @since   1.6
	 */
	protected function getReorderConditions($table)
	{
		$condition = array();
		$condition[] = 'client_id = ' . (int) $table->client_id;
		$condition[] = 'position = ' . $this->_db->quote($table->position);

		return $condition;
	}

	/**
	 * Custom clean cache method for different clients
	 *
	 * @param   string   $group     The name of the plugin group to import (defaults to null).
	 * @param   integer  $clientId  The client ID. [optional]
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function cleanCache($group = null, $clientId = 0)
	{
		parent::cleanCache('com_modules', $this->getClient());
	}
}
components/com_modules/models/modules.php000060400000032241152453623460014713 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Modules Component Module Model
 *
 * @since  1.5
 */
class ModulesModelModules extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'title', 'a.title',
				'checked_out', 'a.checked_out',
				'checked_out_time', 'a.checked_out_time',
				'published', 'a.published', 'state',
				'access', 'a.access',
				'ag.title', 'access_level',
				'ordering', 'a.ordering',
				'module', 'a.module',
				'language', 'a.language',
				'l.title', 'language_title',
				'publish_up', 'a.publish_up',
				'publish_down', 'a.publish_down',
				'client_id', 'a.client_id',
				'position', 'a.position',
				'pages',
				'name', 'e.name',
				'menuitem',
			);
		}

		parent::__construct($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.position', $direction = 'asc')
	{
		$app = JFactory::getApplication();

		$layout = $app->input->get('layout', '', 'cmd');

		// Adjust the context to support modal layouts.
		if ($layout)
		{
			$this->context .= '.' . $layout;
		}

		// Load the filter state.
		$this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string'));
		$this->setState('filter.position', $this->getUserStateFromRequest($this->context . '.filter.position', 'filter_position', '', 'string'));
		$this->setState('filter.module', $this->getUserStateFromRequest($this->context . '.filter.module', 'filter_module', '', 'string'));
		$this->setState('filter.menuitem', $this->getUserStateFromRequest($this->context . '.filter.menuitem', 'filter_menuitem', '', 'cmd'));
		$this->setState('filter.access', $this->getUserStateFromRequest($this->context . '.filter.access', 'filter_access', '', 'cmd'));

		// If in modal layout on the frontend, state and language are always forced.
		if ($app->isClient('site') && $layout === 'modal')
		{
			$this->setState('filter.language', 'current');
			$this->setState('filter.state', 1);
		}
		// If in backend (modal or not) we get the same fields from the user request.
		else
		{
			$this->setState('filter.language', $this->getUserStateFromRequest($this->context . '.filter.language', 'filter_language', '', 'string'));
			$this->setState('filter.state', $this->getUserStateFromRequest($this->context . '.filter.state', 'filter_state', '', 'string'));
		}

		// Special case for the client id.
		if ($app->isClient('site') || $layout === 'modal')
		{
			$this->setState('client_id', 0);
			$clientId = 0;
		}
		else
		{
			$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);
		}

		// Use a different filter file when client is administrator
		if ($clientId == 1)
		{
			$this->filterFormName = 'filter_modulesadmin';
		}

		// Load the parameters.
		$params = JComponentHelper::getParams('com_modules');
		$this->setState('params', $params);

		// 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('client_id');
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.state');
		$id .= ':' . $this->getState('filter.position');
		$id .= ':' . $this->getState('filter.module');
		$id .= ':' . $this->getState('filter.menuitem');
		$id .= ':' . $this->getState('filter.access');
		$id .= ':' . $this->getState('filter.language');

		return parent::getStoreId($id);
	}

	/**
	 * Returns an object list
	 *
	 * @param   string  $query       The query
	 * @param   int     $limitstart  Offset
	 * @param   int     $limit       The number of records
	 *
	 * @return  array
	 */
	protected function _getList($query, $limitstart = 0, $limit = 0)
	{
		$listOrder = $this->getState('list.ordering', 'a.position');
		$listDirn  = $this->getState('list.direction', 'asc');

		// If ordering by fields that need translate we need to sort the array of objects after translating them.
		if (in_array($listOrder, array('pages', 'name')))
		{
			// Fetch the results.
			$this->_db->setQuery($query);
			$result = $this->_db->loadObjectList();

			// Translate the results.
			$this->translate($result);

			// Sort the array of translated objects.
			$result = ArrayHelper::sortObjects($result, $listOrder, strtolower($listDirn) == 'desc' ? -1 : 1, true, true);

			// Process pagination.
			$total = count($result);
			$this->cache[$this->getStoreId('getTotal')] = $total;

			if ($total < $limitstart)
			{
				$limitstart = 0;
				$this->setState('list.start', 0);
			}

			return array_slice($result, $limitstart, $limit ?: null);
		}

		// If ordering by fields that doesn't need translate just order the query.
		if ($listOrder === 'a.ordering')
		{
			$query->order($this->_db->quoteName('a.position') . ' ASC')
				->order($this->_db->quoteName($listOrder) . ' ' . $this->_db->escape($listDirn));
		}
		elseif ($listOrder === 'a.position')
		{
			$query->order($this->_db->quoteName($listOrder) . ' ' . $this->_db->escape($listDirn))
				->order($this->_db->quoteName('a.ordering') . ' ASC');
		}
		else
		{
			$query->order($this->_db->quoteName($listOrder) . ' ' . $this->_db->escape($listDirn));
		}

		// Process pagination.
		$result = parent::_getList($query, $limitstart, $limit);

		// Translate the results.
		$this->translate($result);

		return $result;
	}

	/**
	 * Translate a list of objects
	 *
	 * @param   array  &$items  The array of objects
	 *
	 * @return  array The array of translated objects
	 */
	protected function translate(&$items)
	{
		$lang = JFactory::getLanguage();
		$clientPath = $this->getState('client_id') ? JPATH_ADMINISTRATOR : JPATH_SITE;

		foreach ($items as $item)
		{
			$extension = $item->module;
			$source = $clientPath . "/modules/$extension";
			$lang->load("$extension.sys", $clientPath, null, false, true)
				|| $lang->load("$extension.sys", $source, null, false, true);
			$item->name = JText::_($item->name);

			if (is_null($item->pages))
			{
				$item->pages = JText::_('JNONE');
			}
			elseif ($item->pages < 0)
			{
				$item->pages = JText::_('COM_MODULES_ASSIGNED_VARIES_EXCEPT');
			}
			elseif ($item->pages > 0)
			{
				$item->pages = JText::_('COM_MODULES_ASSIGNED_VARIES_ONLY');
			}
			else
			{
				$item->pages = JText::_('JALL');
			}
		}
	}

	/**
	 * Build an SQL query to load the list data.
	 *
	 * @return  JDatabaseQuery
	 */
	protected function getListQuery()
	{
		$app = JFactory::getApplication();

		// Create a new query object.
		$db = $this->getDbo();
		$query = $db->getQuery(true);

		// Select the required fields.
		$query->select(
			$this->getState(
				'list.select',
				'a.id, a.title, a.note, a.position, a.module, a.language,' .
					'a.checked_out, a.checked_out_time, a.published AS published, e.enabled AS enabled, a.access, a.ordering, a.publish_up, a.publish_down'
			)
		);

		// From modules table.
		$query->from($db->quoteName('#__modules', 'a'));

		// 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 module menus
		$query->select('MIN(mm.menuid) AS pages')
			->join('LEFT', $db->quoteName('#__modules_menu', 'mm') . ' ON ' . $db->quoteName('mm.moduleid') . ' = ' . $db->quoteName('a.id'));

		// Join over the extensions
		$query->select($db->quoteName('e.name', 'name'))
			->join('LEFT', $db->quoteName('#__extensions', 'e') . ' ON ' . $db->quoteName('e.element') . ' = ' . $db->quoteName('a.module'));

		// Group (careful with PostgreSQL)
		$query->group(
			'a.id, a.title, a.note, a.position, a.module, a.language, a.checked_out, '
			. 'a.checked_out_time, a.published, a.access, a.ordering, l.title, l.image, uc.name, ag.title, e.name, '
			. 'l.lang_code, uc.id, ag.id, mm.moduleid, e.element, a.publish_up, a.publish_down, e.enabled'
		);

		// Filter by client.
		$clientId = $this->getState('client_id');
		$query->where($db->quoteName('a.client_id') . ' = ' . (int) $clientId . ' AND ' . $db->quoteName('e.client_id') . ' = ' . (int) $clientId);

		// Filter by current user access level.
		$user = JFactory::getUser();

		// Get the current user for authorisation checks
		if ($user->authorise('core.admin') !== true)
		{
			$groups = implode(',', $user->getAuthorisedViewLevels());
			$query->where('a.access IN (' . $groups . ')');
		}

		// Filter by access level.
		if ($access = $this->getState('filter.access'))
		{
			$query->where($db->quoteName('a.access') . ' = ' . (int) $access);
		}

		// Filter by published state.
		$state = $this->getState('filter.state');

		if (is_numeric($state))
		{
			$query->where($db->quoteName('a.published') . ' = ' . (int) $state);
		}
		elseif ($state === '')
		{
			$query->where($db->quoteName('a.published') . ' IN (0, 1)');
		}

		// Filter by position.
		if ($position = $this->getState('filter.position'))
		{
			$query->where($db->quoteName('a.position') . ' = ' . $db->quote(($position === 'none') ? '' : $position));
		}

		// Filter by module.
		if ($module = $this->getState('filter.module'))
		{
			$query->where($db->quoteName('a.module') . ' = ' . $db->quote($module));
		}

		// Filter by menuitem id (only for site client).
		if ((int) $clientId === 0 && $menuItemId = $this->getState('filter.menuitem'))
		{
			// If user selected the modules not assigned to any page (menu item).
			if ((int) $menuItemId === -1)
			{
				$query->having('MIN(' . $db->quoteName('mm.menuid') . ') IS NULL');
			}
			// If user selected the modules assigned to some particular page (menu item).
			else
			{
				// Modules in "All" pages.
				$subQuery1 = $db->getQuery(true);
				$subQuery1->select('MIN(' . $db->quoteName('menuid') . ')')
					->from($db->quoteName('#__modules_menu'))
					->where($db->quoteName('moduleid') . ' = ' . $db->quoteName('a.id'));

				// Modules in "Selected" pages that have the chosen menu item id.
				$subQuery2 = $db->getQuery(true);
				$subQuery2->select($db->quoteName('moduleid'))
					->from($db->quoteName('#__modules_menu'))
					->where($db->quoteName('menuid') . ' = ' . (int) $menuItemId);

				// Modules in "All except selected" pages that doesn't have the chosen menu item id.
				$subQuery3 = $db->getQuery(true);
				$subQuery3->select($db->quoteName('moduleid'))
					->from($db->quoteName('#__modules_menu'))
					->where($db->quoteName('menuid') . ' = -' . (int) $menuItemId);

				// Filter by modules assigned to the selected menu item.
				$query->where('(
					(' . $subQuery1 . ') = 0
					OR ((' . $subQuery1 . ') > 0 AND ' . $db->quoteName('a.id') . ' IN (' . $subQuery2 . '))
					OR ((' . $subQuery1 . ') < 0 AND ' . $db->quoteName('a.id') . ' NOT IN (' . $subQuery3 . '))
					)'
				);
			}
		}

		// Filter by search in title or note or id:.
		$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('%' . StringHelper::strtolower($search) . '%');
				$query->where('(LOWER(a.title) LIKE ' . $search . ' OR LOWER(a.note) LIKE ' . $search . ')');
			}
		}

		// Filter on the language.
		if ($language = $this->getState('filter.language'))
		{
			if ($language === 'current')
			{
				$query->where($db->quoteName('a.language') . ' IN (' . $db->quote(JFactory::getLanguage()->getTag()) . ',' . $db->quote('*') . ')');
			}
			else
			{
				$query->where($db->quoteName('a.language') . ' = ' . $db->quote($language));
			}
		}

		return $query;
	}
}
components/com_modules/models/fields/modulesposition.php000060400000001711152453623460017744 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('ModulesHelper', JPATH_ADMINISTRATOR . '/components/com_modules/helpers/modules.php');

JFormHelper::loadFieldClass('list');

/**
 * Modules Position field.
 *
 * @since  3.4.2
 */
class JFormFieldModulesPosition extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.4.2
	 */
	protected $type = 'ModulesPosition';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   3.4.2
	 */
	public function getOptions()
	{
		$options = ModulesHelper::getPositions(JFactory::getApplication()->getUserState('com_modules.modules.client_id', 0));

		return array_merge(parent::getOptions(), $options);
	}
}
components/com_modules/models/fields/modulesmodule.php000060400000001701152453623460017364 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('ModulesHelper', JPATH_ADMINISTRATOR . '/components/com_modules/helpers/modules.php');

JFormHelper::loadFieldClass('list');

/**
 * Modules Module field.
 *
 * @since  3.4.2
 */
class JFormFieldModulesModule extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.4.2
	 */
	protected $type = 'ModulesModule';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   3.4.2
	 */
	public function getOptions()
	{
		$options = ModulesHelper::getModules(JFactory::getApplication()->getUserState('com_modules.modules.client_id', 0));

		return array_merge(parent::getOptions(), $options);
	}
}
components/com_modules/models/positions.php000060400000014256152453623460015300 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Modules Component Positions Model
 *
 * @since  1.6
 */
class ModulesModelPositions extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'value',
				'templates',
			);
		}

		parent::__construct($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 = 'value', $direction = 'asc')
	{
		$app = JFactory::getApplication('administrator');

		// Load the filter state.
		$search = $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		$state = $this->getUserStateFromRequest($this->context . '.filter.state', 'filter_state', '', 'string');
		$this->setState('filter.state', $state);

		$template = $this->getUserStateFromRequest($this->context . '.filter.template', 'filter_template', '', 'string');
		$this->setState('filter.template', $template);

		$type = $this->getUserStateFromRequest($this->context . '.filter.type', 'filter_type', '', 'string');
		$this->setState('filter.type', $type);

		// Special case for the client id.
		$clientId = (int) $this->getUserStateFromRequest($this->context . '.client_id', 'client_id', 0, 'int');
		$clientId = (!in_array((int) $clientId, array (0, 1))) ? 0 : (int) $clientId;
		$this->setState('client_id', $clientId);

		// Load the parameters.
		$params = JComponentHelper::getParams('com_modules');
		$this->setState('params', $params);

		// List state information.
		parent::populateState($ordering, $direction);
	}

	/**
	 * Method to get an array of data items.
	 *
	 * @return  mixed  An array of data items on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function getItems()
	{
		if (!isset($this->items))
		{
			$lang            = JFactory::getLanguage();
			$search          = $this->getState('filter.search');
			$state           = $this->getState('filter.state');
			$clientId        = $this->getState('client_id');
			$filter_template = $this->getState('filter.template');
			$type            = $this->getState('filter.type');
			$ordering        = $this->getState('list.ordering');
			$direction       = $this->getState('list.direction');
			$limitstart      = $this->getState('list.start');
			$limit           = $this->getState('list.limit');
			$client          = JApplicationHelper::getClientInfo($clientId);

			if ($type != 'template')
			{
				// Get the database object and a new query object.
				$query = $this->_db->getQuery(true)
					->select('DISTINCT(position) as value')
					->from('#__modules')
					->where($this->_db->quoteName('client_id') . ' = ' . (int) $clientId);

				if ($search)
				{
					$search = $this->_db->quote('%' . str_replace(' ', '%', $this->_db->escape(trim($search), true) . '%'));
					$query->where('position LIKE ' . $search);
				}

				$this->_db->setQuery($query);

				try
				{
					$positions = $this->_db->loadObjectList('value');
				}
				catch (RuntimeException $e)
				{
					$this->setError($e->getMessage());

					return false;
				}

				foreach ($positions as $value => $position)
				{
					$positions[$value] = array();
				}
			}
			else
			{
				$positions = array();
			}

			// Load the positions from the installed templates.
			foreach (ModulesHelper::getTemplates($clientId) as $template)
			{
				$path = JPath::clean($client->path . '/templates/' . $template->element . '/templateDetails.xml');

				if (file_exists($path))
				{
					$xml = simplexml_load_file($path);

					if (isset($xml->positions[0]))
					{
						$lang->load('tpl_' . $template->element . '.sys', $client->path, null, false, true)
						|| $lang->load('tpl_' . $template->element . '.sys', $client->path . '/templates/' . $template->element, null, false, true);

						foreach ($xml->positions[0] as $position)
						{
							$value = (string) $position['value'];
							$label = (string) $position;

							if (!$value)
							{
								$value = $label;
								$label = preg_replace('/[^a-zA-Z0-9_\-]/', '_', 'TPL_' . $template->element . '_POSITION_' . $value);
								$altlabel = preg_replace('/[^a-zA-Z0-9_\-]/', '_', 'COM_MODULES_POSITION_' . $value);

								if (!$lang->hasKey($label) && $lang->hasKey($altlabel))
								{
									$label = $altlabel;
								}
							}

							if ($type == 'user' || ($state != '' && $state != $template->enabled))
							{
								unset($positions[$value]);
							}
							elseif (preg_match(chr(1) . $search . chr(1) . 'i', $value) && ($filter_template == '' || $filter_template == $template->element))
							{
								if (!isset($positions[$value]))
								{
									$positions[$value] = array();
								}

								$positions[$value][$template->name] = $label;
							}
						}
					}
				}
			}

			$this->total = count($positions);

			if ($limitstart >= $this->total)
			{
				$limitstart = $limitstart < $limit ? 0 : $limitstart - $limit;
				$this->setState('list.start', $limitstart);
			}

			if ($ordering == 'value')
			{
				if ($direction == 'asc')
				{
					ksort($positions);
				}
				else
				{
					krsort($positions);
				}
			}
			else
			{
				if ($direction == 'asc')
				{
					asort($positions);
				}
				else
				{
					arsort($positions);
				}
			}

			$this->items = array_slice($positions, $limitstart, $limit ?: null);
		}

		return $this->items;
	}

	/**
	 * Method to get the total number of items.
	 *
	 * @return  integer  The total number of items.
	 *
	 * @since   1.6
	 */
	public function getTotal()
	{
		if (!isset($this->total))
		{
			$this->getItems();
		}

		return $this->total;
	}
}
components/com_modules/models/select.php000060400000007674152453623460014536 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Module model.
 *
 * @since  1.6
 */
class ModulesModelSelect extends JModelList
{
	/**
	 * 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 = null, $direction = null)
	{
		$app = JFactory::getApplication('administrator');

		// Load the filter state.
		$clientId = $app->getUserState('com_modules.modules.client_id', 0);
		$this->setState('client_id', (int) $clientId);

		// Load the parameters.
		$params = JComponentHelper::getParams('com_modules');
		$this->setState('params', $params);

		// Manually set limits to get all modules.
		$this->setState('list.limit', 0);
		$this->setState('list.start', 0);
		$this->setState('list.ordering', 'a.name');
		$this->setState('list.direction', 'ASC');
	}

	/**
	 * 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('client_id');

		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);

		// Select the required fields from the table.
		$query->select(
			$this->getState(
				'list.select',
				'a.extension_id, a.name, a.element AS module'
			)
		);
		$query->from($db->quoteName('#__extensions') . ' AS a');

		// Filter by module
		$query->where('a.type = ' . $db->quote('module'));

		// Filter by client.
		$clientId = $this->getState('client_id');
		$query->where('a.client_id = ' . (int) $clientId);

		// Filter by enabled
		$query->where('a.enabled = 1');

		// 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 get a list of items.
	 *
	 * @return  mixed  An array of objects on success, false on failure.
	 */
	public function getItems()
	{
		// Get the list of items from the database.
		$items = parent::getItems();

		$client = JApplicationHelper::getClientInfo($this->getState('client_id', 0));
		$lang = JFactory::getLanguage();

		// Loop through the results to add the XML metadata,
		// and load language support.
		foreach ($items as &$item)
		{
			$path = JPath::clean($client->path . '/modules/' . $item->module . '/' . $item->module . '.xml');

			if (file_exists($path))
			{
				$item->xml = simplexml_load_file($path);
			}
			else
			{
				$item->xml = null;
			}

			// 1.5 Format; Core files or language packs then
			// 1.6 3PD Extension Support
			$lang->load($item->module . '.sys', $client->path, null, false, true)
				|| $lang->load($item->module . '.sys', $client->path . '/modules/' . $item->module, null, false, true);
			$item->name = JText::_($item->name);

			if (isset($item->xml) && $text = trim($item->xml->description))
			{
				$item->desc = JText::_($text);
			}
			else
			{
				$item->desc = JText::_('COM_MODULES_NODESCRIPTION');
			}
		}

		$items = ArrayHelper::sortObjects($items, 'name', 1, true, true);

		// TODO: Use the cached XML from the extensions table?

		return $items;
	}
}
components/com_modules/config.xml000060400000002236152453623460013237 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset
		name="modules"
		label="COM_MODULES_GENERAL"
		description="COM_MODULES_GENERAL_FIELDSET_DESC"
		>
		<field
			name="redirect_edit"
			type="list"
			class="advancedSelect"
			default="site"
			label="COM_MODULES_REDIRECT_EDIT_LABEL"
			description="COM_MODULES_REDIRECT_EDIT_DESC"
			>
			<option value="admin">JADMINISTRATOR</option>
			<option value="site">JSITE</option>
		</field>
	</fieldset>

	<fieldset
		name="admin_modules"
		label="COM_MODULES_ADMIN_LANG_FILTER_FIELDSET_LABEL"
		>
		<field
			name="adminlangfilter"
			type="radio"
			label="COM_MODULES_ADMIN_LANG_FILTER_LABEL"
			description="COM_MODULES_ADMIN_LANG_FILTER_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			filter="integer"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>
	</fieldset>

	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
		>
		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			filter="rules"
			validate="rules"
			component="com_modules"
			section="component"
		/>
	</fieldset>
</config>
components/com_modules/access.xml000060400000002473152453623460013236 0ustar00<?xml version="1.0" encoding="utf-8" ?>
<access component="com_modules">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
		<action name="module.edit.frontend" title="COM_MODULES_ACTION_EDITFRONTEND" description="COM_MODULES_ACTION_EDITFRONTEND_COMPONENT_DESC" />
	</section>
	<section name="module">
		<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
		<action name="module.edit.frontend" title="COM_MODULES_ACTION_EDITFRONTEND" description="COM_MODULES_ACTION_EDITFRONTEND_COMPONENT_DESC" />
	</section>
</access>components/com_modules/views/module/view.html.php000060400000005445152453623460016325 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View to edit a module.
 *
 * @since  1.6
 */
class ModulesViewModule extends JViewLegacy
{
	protected $form;

	protected $item;

	protected $state;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		$this->form  = $this->get('Form');
		$this->item  = $this->get('Item');
		$this->state = $this->get('State');
		$this->canDo = JHelperContent::getActions('com_modules', 'module', $this->item->id);

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		$this->addToolbar();
		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->get('id'));
		$canDo      = $this->canDo;

		JToolbarHelper::title(JText::sprintf('COM_MODULES_MANAGER_MODULE', JText::_($this->item->module)), 'cube module');

		// For new records, check the create permission.
		if ($isNew && $canDo->get('core.create'))
		{
			JToolbarHelper::apply('module.apply');
			JToolbarHelper::save('module.save');
			JToolbarHelper::save2new('module.save2new');
			JToolbarHelper::cancel('module.cancel');
		}
		else
		{
			// Can't save the record if it's checked out.
			if (!$checkedOut)
			{
				// Since it's an existing record, check the edit permission.
				if ($canDo->get('core.edit'))
				{
					JToolbarHelper::apply('module.apply');
					JToolbarHelper::save('module.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('module.save2new');
					}
				}
			}

			// If checked out, we can still save
			if ($canDo->get('core.create'))
			{
				JToolbarHelper::save2copy('module.save2copy');
			}

			JToolbarHelper::cancel('module.cancel', 'JTOOLBAR_CLOSE');
		}

		// Get the help information for the menu item.
		$lang = JFactory::getLanguage();

		$help = $this->get('Help');

		if ($lang->hasKey($help->url))
		{
			$debug = $lang->setDebug(false);
			$url = JText::_($help->url);
			$lang->setDebug($debug);
		}
		else
		{
			$url = null;
		}

		JToolbarHelper::help($help->key, false, $url);
	}
}
components/com_modules/views/module/view.json.php000060400000002030152453623460016315 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2014 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View to edit a module.
 *
 * @package     Joomla.Administrator
 * @subpackage  com_templates
 * @since       3.2
 */
class ModulesViewModule extends JViewLegacy
{
	protected $item;

	protected $form;

	protected $state;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		$app = JFactory::getApplication();

		try
		{
			$this->item = $this->get('Item');
		}
		catch (Exception $e)
		{
			$app->enqueueMessage($e->getMessage(), 'error');

			return false;
		}

		$paramsList = $this->item->getProperties();

		unset($paramsList['xml']);

		$paramsList = json_encode($paramsList);

		return $paramsList;

	}
}
components/com_modules/views/module/tmpl/edit.php000060400000025414152453623460016307 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.combobox');
JHtml::_('behavior.keepalive');
JHtml::_('formbehavior.chosen', '#jform_position', null, array('disable_search_threshold' => 0 ));
JHtml::_('formbehavior.chosen', '.multipleCategories', null, array('placeholder_text_multiple' => JText::_('JOPTION_SELECT_CATEGORY')));
JHtml::_('formbehavior.chosen', '.multipleTags', null, array('placeholder_text_multiple' => JText::_('JOPTION_SELECT_TAG')));
JHtml::_('formbehavior.chosen', '.multipleAuthors', null, array('placeholder_text_multiple' => JText::_('JOPTION_SELECT_AUTHOR')));
JHtml::_('formbehavior.chosen', '.multipleAuthorAliases', null, array('placeholder_text_multiple' => JText::_('JOPTION_SELECT_AUTHOR_ALIAS')));
JHtml::_('formbehavior.chosen', 'select');

$hasContent = isset($this->item->xml->customContent);
$hasContentFieldName = 'content';

// For a later improvement
if ($hasContent)
{
	$hasContentFieldName = 'content';
}

// Get Params Fieldsets
$this->fieldsets = $this->form->getFieldsets('params');

$script = "
	Joomla.submitbutton = function(task) {
			if (task == 'module.cancel' || document.formvalidator.isValid(document.getElementById('module-form')))
			{
";
if ($hasContent)
{
	$script .= $this->form->getField($hasContentFieldName)->save();
}
$script .= "
			Joomla.submitform(task, document.getElementById('module-form'));

				jQuery('#permissions-sliders select').attr('disabled', 'disabled');

				if (self != top)
				{
					if (parent.viewLevels)
					{
						var updPosition = jQuery('#jform_position').chosen().val(),
							updTitle = jQuery('#jform_title').val(),
							updMenus = jQuery('#jform_assignment').chosen().val(),
							updStatus = jQuery('#jform_published').chosen().val(),
							updAccess = jQuery('#jform_access').chosen().val(),
							tmpMenu = jQuery('#menus-" . $this->item->id . "', parent.document),
							tmpRow = jQuery('#tr-" . $this->item->id . "', parent.document);
							tmpStatus = jQuery('#status-" . $this->item->id . "', parent.document);
							window.parent.inMenus = new Array();
							window.parent.numMenus = jQuery(':input[name=\"jform[assigned][]\"]').length;

						jQuery('input[name=\"jform[assigned][]\"]').each(function(){
							if (updMenus > 0 )
							{
								if (jQuery(this).is(':checked'))
								{
									window.parent.inMenus.push(parseInt(jQuery(this).val()));
								}
							}
							if (updMenus < 0 )
							{
								if (!jQuery(this).is(':checked'))
								{
									window.parent.inMenus.push(parseInt(jQuery(this).val()));
								}
							}
						});
						if (updMenus == 0) {
							tmpMenu.html('<span class=\"label label-info\">" . JText::_('JALL') . "</span>');
							if (tmpRow.hasClass('no')) { tmpRow.removeClass('no '); }
						}
						if (updMenus == '-') {
							tmpMenu.html('<span class=\"label label-important\">" . JText::_('JNO') . "</span>');
							if (!tmpRow.hasClass('no') || tmpRow.hasClass('')) { tmpRow.addClass('no '); }
						}
						if (updMenus > 0) {
							if (window.parent.inMenus.indexOf(parent.menuId) >= 0)
							{
								if (window.parent.numMenus == window.parent.inMenus.length)
								{
									tmpMenu.html('<span class=\"label label-info\">" . JText::_('JALL') . "</span>');
									if (tmpRow.hasClass('no') || tmpRow.hasClass('')) { tmpRow.removeClass('no'); }
								}
								else
								{
									tmpMenu.html('<span class=\"label label-success\">" . JText::_('JYES') . "</span>');
									if (tmpRow.hasClass('no')) { tmpRow.removeClass('no'); }
								}
							}
							if (window.parent.inMenus.indexOf(parent.menuId) < 0)
							{
								tmpMenu.html('<span class=\"label label-important\">" . JText::_('JNO') . "</span>');
								if (!tmpRow.hasClass('no')) { tmpRow.addClass('no'); }
							}
						}
						if (updMenus < 0) {
							if (window.parent.inMenus.indexOf(parent.menuId) >= 0)
							{
								if (window.parent.numMenus == window.parent.inMenus.length)
								{
									tmpMenu.html('<span class=\"label label-info\">" . JText::_('JALL') . "</span>');
									if (tmpRow.hasClass('no')) { tmpRow.removeClass('no'); }
								}
								else
								{
									tmpMenu.html('<span class=\"label label-success\">" . JText::_('JYES') . "</span>');
									if (tmpRow.hasClass('no')) { tmpRow.removeClass('no'); }
								}
							}
							if (window.parent.inMenus.indexOf(parent.menuId) < 0)
							{
								tmpMenu.html('<span class=\"label label-important\">" . JText::_('JNO') . "</span>');
								if (!tmpRow.hasClass('no') || tmpRow.hasClass('')) { tmpRow.addClass('no'); }
							}
						}
						if (updStatus == 1) {
							tmpStatus.html('<span class=\"label label-success\">" . JText::_('JYES') . "</span>');
							if (tmpRow.hasClass('unpublished')) { tmpRow.removeClass('unpublished '); }
						}
						if (updStatus == 0) {
							tmpStatus.html('<span class=\"label label-important\">" . JText::_('JNO') . "</span>');
							if (!tmpRow.hasClass('unpublished') || tmpRow.hasClass('')) { tmpRow.addClass('unpublished'); }
						}
						if (updStatus == -2) {
							tmpStatus.html('<span class=\"label label-default\">" . JText::_('JTRASHED') . "</span>');
							if (!tmpRow.hasClass('unpublished') || tmpRow.hasClass('')) { tmpRow.addClass('unpublished'); }
						}
						if (document.formvalidator.isValid(document.getElementById('module-form'))) {
							jQuery('#title-" . $this->item->id . "', parent.document).text(updTitle);
							jQuery('#position-" . $this->item->id . "', parent.document).text(updPosition);
							jQuery('#access-" . $this->item->id . "', parent.document).html(parent.viewLevels[updAccess]);
						}
					}
				}

				if (task !== 'module.apply')
				{
					window.parent.jQuery('#module" . ((int) $this->item->id == 0 ? 'Add' : 'Edit' . (int) $this->item->id) . "Modal').modal('hide');
				}
			}
	};";

JFactory::getDocument()->addScriptDeclaration($script);

$input = JFactory::getApplication()->input;

// In case of modal
$isModal = $input->get('layout') == 'modal' ? true : false;
$layout  = $isModal ? 'modal' : 'edit';
$tmpl    = $isModal || $input->get('tmpl', '', 'cmd') === 'component' ? '&tmpl=component' : '';
?>

<form action="<?php echo JRoute::_('index.php?option=com_modules&layout=' . $layout . $tmpl . '&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="module-form" class="form-validate">

	<?php echo JLayoutHelper::render('joomla.edit.title_alias', $this); ?>

	<div class="form-horizontal">
		<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'general')); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'general', JText::_('COM_MODULES_MODULE')); ?>

		<div class="row-fluid">
			<div class="span9">
				<?php if ($this->item->xml) : ?>
					<?php if ($this->item->xml->description) : ?>
						<h2>
							<?php
							if ($this->item->xml)
							{
								echo ($text = (string) $this->item->xml->name) ? JText::_($text) : $this->item->module;
							}
							else
							{
								echo JText::_('COM_MODULES_ERR_XML');
							}
							?>
						</h2>
						<div class="info-labels">
							<span class="label hasTooltip" title="<?php echo JHtml::_('tooltipText', 'COM_MODULES_FIELD_CLIENT_ID_LABEL'); ?>">
								<?php echo $this->item->client_id == 0 ? JText::_('JSITE') : JText::_('JADMINISTRATOR'); ?>
							</span>
						</div>
						<div>
							<?php
							$short_description = JText::_($this->item->xml->description);
							$this->fieldset = 'description';
							$long_description = JLayoutHelper::render('joomla.edit.fieldset', $this);
							if (!$long_description) {
								$truncated = JHtml::_('string.truncate', $short_description, 550, true, false);
								if (strlen($truncated) > 500) {
									$long_description = $short_description;
									$short_description = JHtml::_('string.truncate', $truncated, 250);
									if ($short_description == $long_description) {
										$long_description = '';
									}
								}
							}
							?>
							<p><?php echo $short_description; ?></p>
							<?php if ($long_description) : ?>
								<p class="readmore">
									<a href="#" onclick="jQuery('.nav-tabs a[href=\'#description\']').tab('show');">
										<?php echo JText::_('JGLOBAL_SHOW_FULL_DESCRIPTION'); ?>
									</a>
								</p>
							<?php endif; ?>
						</div>
					<?php endif; ?>
				<?php else : ?>
					<div class="alert alert-error"><?php echo JText::_('COM_MODULES_ERR_XML'); ?></div>
				<?php endif; ?>
				<?php
				if ($hasContent)
				{
					echo $this->form->getInput($hasContentFieldName);
				}
				$this->fieldset = 'basic';
				$html = JLayoutHelper::render('joomla.edit.fieldset', $this);
				echo $html ? '<hr />' . $html : '';
				?>
			</div>
			<div class="span3">
				<fieldset class="form-vertical">
					<?php echo $this->form->renderField('showtitle'); ?>
					<div class="control-group">
						<div class="control-label">
							<?php echo $this->form->getLabel('position'); ?>
						</div>
						<div class="controls">
							<?php echo $this->loadTemplate('positions'); ?>
						</div>
					</div>
				</fieldset>
				<?php
				// Set main fields.
				$this->fields = array(
					'published',
					'publish_up',
					'publish_down',
					'access',
					'ordering',
					'language',
					'note'
				);

				?>
				<?php echo JLayoutHelper::render('joomla.edit.global', $this); ?>
			</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php if (isset($long_description) && $long_description != '') : ?>
			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'description', JText::_('JGLOBAL_FIELDSET_DESCRIPTION')); ?>
			<?php echo $long_description; ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php endif; ?>

		<?php if ($this->item->client_id == 0) : ?>
			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'assignment', JText::_('COM_MODULES_MENU_ASSIGNMENT')); ?>
			<?php echo $this->loadTemplate('assignment'); ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php endif; ?>

		<?php
		$this->fieldsets = array();
		$this->ignore_fieldsets = array('basic', 'description');
		echo JLayoutHelper::render('joomla.edit.params', $this);
		?>

		<?php if ($this->canDo->get('core.admin')) : ?>
			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'permissions', JText::_('COM_MODULES_FIELDSET_RULES')); ?>
			<?php echo $this->form->getInput('rules'); ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php endif; ?>

		<?php echo JHtml::_('bootstrap.endTabSet'); ?>

		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
		<?php echo $this->form->getInput('module'); ?>
		<?php echo $this->form->getInput('client_id'); ?>
	</div>
</form>
components/com_modules/views/module/tmpl/edit_assignment.php000060400000015315152453623460020536 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Initialise related data.
JLoader::register('MenusHelper', JPATH_ADMINISTRATOR . '/components/com_menus/helpers/menus.php');
$menuTypes = MenusHelper::getMenuLinks();

JHtml::_('script', 'jui/treeselectmenu.jquery.min.js', array('version' => 'auto', 'relative' => true));

$script = "
	jQuery(document).ready(function()
	{
		menuHide(jQuery('#jform_assignment').val());
		jQuery('#jform_assignment').change(function()
		{
			menuHide(jQuery(this).val());
		})
	});
	function menuHide(val)
	{
		if (val == 0 || val == '-')
		{
			jQuery('#menuselect-group').hide();
		}
		else
		{
			jQuery('#menuselect-group').show();
		}
	}
";

// Add the script to the document head
JFactory::getDocument()->addScriptDeclaration($script);
?>
<div class="control-group">
	<label id="jform_menus-lbl" class="control-label" for="jform_menus"><?php echo JText::_('COM_MODULES_MODULE_ASSIGN'); ?></label>

	<div id="jform_menus" class="controls">
		<select name="jform[assignment]" id="jform_assignment">
			<?php echo JHtml::_('select.options', ModulesHelper::getAssignmentOptions($this->item->client_id), 'value', 'text', $this->item->assignment, true); ?>
		</select>
	</div>
</div>
<div id="menuselect-group" class="control-group">
	<label id="jform_menuselect-lbl" class="control-label" for="jform_menuselect"><?php echo JText::_('JGLOBAL_MENU_SELECTION'); ?></label>

	<div id="jform_menuselect" class="controls">
		<?php if (!empty($menuTypes)) : ?>
		<?php $id = 'jform_menuselect'; ?>

		<div class="well well-small">
			<div class="form-inline">
				<span class="small"><?php echo JText::_('JSELECT'); ?>:
					<a id="treeCheckAll" href="javascript://"><?php echo JText::_('JALL'); ?></a>,
					<a id="treeUncheckAll" href="javascript://"><?php echo JText::_('JNONE'); ?></a>
				</span>
				<span class="width-20">|</span>
				<span class="small"><?php echo JText::_('COM_MODULES_EXPAND'); ?>:
					<a id="treeExpandAll" href="javascript://"><?php echo JText::_('JALL'); ?></a>,
					<a id="treeCollapseAll" href="javascript://"><?php echo JText::_('JNONE'); ?></a>
				</span>
				<input type="text" id="treeselectfilter" name="treeselectfilter" class="input-medium search-query pull-right" size="16"
					autocomplete="off" placeholder="<?php echo JText::_('JSEARCH_FILTER'); ?>" aria-invalid="false" tabindex="-1">
			</div>

			<div class="clearfix"></div>

			<hr class="hr-condensed" />

			<ul class="treeselect">
				<?php foreach ($menuTypes as &$type) : ?>
				<?php if (count($type->links)) : ?>
					<?php $prevlevel = 0; ?>
					<li>
						<div class="treeselect-item pull-left">
							<label class="pull-left nav-header"><?php echo $type->title; ?></label></div>
					<?php foreach ($type->links as $i => $link) : ?>
						<?php
						if ($prevlevel < $link->level)
						{
							echo '<ul class="treeselect-sub">';
						} elseif ($prevlevel > $link->level)
						{
							echo str_repeat('</li></ul>', $prevlevel - $link->level);
						} else {
							echo '</li>';
						}
						$selected = 0;
						if ($this->item->assignment == 0)
						{
							$selected = 1;
						} elseif ($this->item->assignment < 0)
						{
							$selected = in_array(-$link->value, $this->item->assigned);
						} elseif ($this->item->assignment > 0)
						{
							$selected = in_array($link->value, $this->item->assigned);
						}
						?>
							<li>
								<div class="treeselect-item pull-left">
									<?php
									$uselessMenuItem = in_array($link->type, array('separator', 'heading', 'alias', 'url'));
									?>
									<input type="checkbox" class="pull-left novalidate" name="jform[assigned][]" id="<?php echo $id . $link->value; ?>" value="<?php echo (int) $link->value; ?>"<?php echo $selected ? ' checked="checked"' : ''; echo $uselessMenuItem ? ' disabled="disabled"' : ''; ?> />
									<label for="<?php echo $id . $link->value; ?>" class="pull-left">
										<?php echo $link->text; ?> <span class="small"><?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($link->alias)); ?></span>
										<?php if (JLanguageMultilang::isEnabled() && $link->language != '' && $link->language != '*') : ?>
											<?php if ($link->language_image) : ?>
												<?php echo JHtml::_('image', 'mod_languages/' . $link->language_image . '.gif', $link->language_title, array('title' => $link->language_title), true); ?>
											<?php else : ?>
												<?php echo '<span class="label" title="' . $link->language_title . '">' . $link->language_sef . '</span>'; ?>
											<?php endif; ?>
										<?php endif; ?>
										<?php if ($link->published == 0) : ?>
											<?php echo ' <span class="label">' . JText::_('JUNPUBLISHED') . '</span>'; ?>
										<?php endif; ?>
										<?php if ($uselessMenuItem) : ?>
											<?php echo ' <span class="label">' . JText::_('COM_MODULES_MENU_ITEM_' . strtoupper($link->type)) . '</span>'; ?>
										<?php endif; ?>
									</label>
								</div>
						<?php

						if (!isset($type->links[$i + 1]))
						{
							echo str_repeat('</li></ul>', $link->level);
						}
						$prevlevel = $link->level;
						?>
						<?php endforeach; ?>
					</li>
					<?php endif; ?>
				<?php endforeach; ?>
			</ul>
			<div id="noresultsfound" style="display:none;" class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
			<div style="display:none;" id="treeselectmenu">
				<div class="pull-left nav-hover treeselect-menu">
					<div class="btn-group">
						<a href="#" data-toggle="dropdown" class="dropdown-toggle btn btn-micro">
							<span class="caret"></span>
						</a>
						<ul class="dropdown-menu">
							<li class="nav-header"><?php echo JText::_('COM_MODULES_SUBITEMS'); ?></li>
							<li class="divider"></li>
							<li class=""><a class="checkall" href="javascript://"><span class="icon-checkbox" aria-hidden="true"></span> <?php echo JText::_('JSELECT'); ?></a>
							</li>
							<li><a class="uncheckall" href="javascript://"><span class="icon-checkbox-unchecked" aria-hidden="true"></span> <?php echo JText::_('COM_MODULES_DESELECT'); ?></a>
							</li>
							<div class="treeselect-menu-expand">
							<li class="divider"></li>
							<li><a class="expandall" href="javascript://"><span class="icon-plus" aria-hidden="true"></span> <?php echo JText::_('COM_MODULES_EXPAND'); ?></a></li>
							<li><a class="collapseall" href="javascript://"><span class="icon-minus" aria-hidden="true"></span> <?php echo JText::_('COM_MODULES_COLLAPSE'); ?></a></li>
							</div>
						</ul>
					</div>
				</div>
			</div>
		</div>
		<?php endif; ?>
	</div>
</div>
components/com_modules/views/module/tmpl/modal.php000060400000001415152453623460016451 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip', '.hasTooltip', array('placement' => 'bottom'));
?>
<button id="applyBtn" type="button" class="hidden" onclick="Joomla.submitbutton('module.apply');"></button>
<button id="saveBtn" type="button" class="hidden" onclick="Joomla.submitbutton('module.save');"></button>
<button id="closeBtn" type="button" class="hidden" onclick="Joomla.submitbutton('module.cancel');"></button>

<div class="container-popup">
	<?php $this->setLayout('edit'); ?>
	<?php echo $this->loadTemplate(); ?>
</div>
components/com_modules/views/module/tmpl/edit_positions.php000060400000002223152453623460020407 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('TemplatesHelper', JPATH_ADMINISTRATOR . '/components/com_templates/helpers/templates.php');

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');
$clientId       = $this->item->client_id;
$state          = 1;
$selectedPosition = $this->item->position;
$positions = JHtml::_('modules.positions', $clientId, $state, $selectedPosition);


// Add custom position to options
$customGroupText = JText::_('COM_MODULES_CUSTOM_POSITION');

// Build field
$attr = array(
	'id'          => 'jform_position',
	'list.select' => $this->item->position,
	'list.attr'   => 'class="chzn-custom-value" '
	. 'data-custom_group_text="' . $customGroupText . '" '
	. 'data-no_results_text="' . JText::_('COM_MODULES_ADD_CUSTOM_POSITION') . '" '
	. 'data-placeholder="' . JText::_('COM_MODULES_TYPE_OR_SELECT_POSITION') . '" '
);

echo JHtml::_('select.groupedlist', $positions, 'jform[position]', $attr);
components/com_modules/views/module/tmpl/edit_options.php000060400000002461152453623460020057 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<?php
	echo JHtml::_('bootstrap.startAccordion', 'moduleOptions', array('active' => 'collapse0'));
	$fieldSets = $this->form->getFieldsets('params');
	$i = 0;

	foreach ($fieldSets as $name => $fieldSet) :
		$label = !empty($fieldSet->label) ? $fieldSet->label : 'COM_MODULES_' . $name . '_FIELDSET_LABEL';
		$class = isset($fieldSet->class) && !empty($fieldSet->class) ? $fieldSet->class : '';

		echo JHtml::_('bootstrap.addSlide', 'moduleOptions', JText::_($label), 'collapse' . ($i++), $class);
			if (isset($fieldSet->description) && trim($fieldSet->description)) :
				echo '<p class="tip">' . $this->escape(JText::_($fieldSet->description)) . '</p>';
			endif;
			?>
				<?php foreach ($this->form->getFieldset($name) as $field) : ?>
					<div class="control-group">
						<div class="control-label">
							<?php echo $field->label; ?>
						</div>
						<div class="controls">
							<?php echo $field->input; ?>
						</div>
					</div>
				<?php endforeach;
		echo JHtml::_('bootstrap.endSlide');
	endforeach;
echo JHtml::_('bootstrap.endAccordion');
components/com_modules/views/modules/view.html.php000060400000015044152453623460016504 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of modules.
 *
 * @since  1.6
 */
class ModulesViewModules extends JViewLegacy
{
	protected $items;

	protected $pagination;

	protected $state;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @since   1.6
	 */
	public function display($tpl = null)
	{
		$this->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');
		$this->clientId      = $this->state->get('client_id');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// We do not need the Language filter when modules are not filtered
		if ($this->clientId == 1 && !JModuleHelper::isAdminMultilang())
		{
			unset($this->activeFilters['language']);
			$this->filterForm->removeField('language', 'filter');
		}

		// We don't need the toolbar in the modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();
		}
		// If in modal layout.
		else
		{
			// Client id selector should not exist.
			$this->filterForm->removeField('client_id', '');

			// If in the frontend state and language should not activate the search tools.
			if (JFactory::getApplication()->isClient('site'))
			{
				unset($this->activeFilters['state']);
				unset($this->activeFilters['language']);
			}
		}

		// Include the component HTML helpers.
		JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

		return parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		$state = $this->get('State');
		$canDo = JHelperContent::getActions('com_modules');
		$user  = JFactory::getUser();

		// Get the toolbar object instance
		$bar = JToolbar::getInstance('toolbar');

		if ($state->get('client_id') == 1)
		{
			JToolbarHelper::title(JText::_('COM_MODULES_MANAGER_MODULES_ADMIN'), 'cube module');
		}
		else
		{
			JToolbarHelper::title(JText::_('COM_MODULES_MANAGER_MODULES_SITE'), 'cube module');
		}

		if ($canDo->get('core.create'))
		{
			// Instantiate a new JLayoutFile instance and render the layout
			$layout = new JLayoutFile('toolbar.newmodule');

			$bar->appendButton('Custom', $layout->render(array()), 'new');
		}

		if ($canDo->get('core.edit'))
		{
			JToolbarHelper::editList('module.edit');
		}

		if ($canDo->get('core.create'))
		{
			JToolbarHelper::custom('modules.duplicate', 'copy.png', 'copy_f2.png', 'JTOOLBAR_DUPLICATE', true);
		}

		if ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::publish('modules.publish', 'JTOOLBAR_PUBLISH', true);
			JToolbarHelper::unpublish('modules.unpublish', 'JTOOLBAR_UNPUBLISH', true);
			JToolbarHelper::checkin('modules.checkin');
		}

		// Add a batch button
		if ($user->authorise('core.create', 'com_modules') && $user->authorise('core.edit', 'com_modules')
			&& $user->authorise('core.edit.state', 'com_modules'))
		{
			JHtml::_('bootstrap.renderModal', 'collapseModal');
			$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 ($state->get('filter.state') == -2 && $canDo->get('core.delete'))
		{
			JToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'modules.delete', 'JTOOLBAR_EMPTY_TRASH');
		}
		elseif ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::trash('modules.trash');
		}

		if ($canDo->get('core.admin'))
		{
			JToolbarHelper::preferences('com_modules');
		}

		JToolbarHelper::help('JHELP_EXTENSIONS_MODULE_MANAGER');

		if (JHtmlSidebar::getEntries())
		{
			$this->sidebar = JHtmlSidebar::render();
		}
	}

	/**
	 * 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()
	{
		$this->state = $this->get('State');

		if ($this->state->get('client_id') == 0)
		{
			if ($this->getLayout() == 'default')
			{
				return array(
					'ordering'       => JText::_('JGRID_HEADING_ORDERING'),
					'a.published'    => JText::_('JSTATUS'),
					'a.title'        => JText::_('JGLOBAL_TITLE'),
					'position'       => JText::_('COM_MODULES_HEADING_POSITION'),
					'name'           => JText::_('COM_MODULES_HEADING_MODULE'),
					'pages'          => JText::_('COM_MODULES_HEADING_PAGES'),
					'a.access'       => JText::_('JGRID_HEADING_ACCESS'),
					'language_title' => JText::_('JGRID_HEADING_LANGUAGE'),
					'a.id'           => JText::_('JGRID_HEADING_ID')
				);
			}

			return array(
				'a.title'        => JText::_('JGLOBAL_TITLE'),
				'position'       => JText::_('COM_MODULES_HEADING_POSITION'),
				'name'           => JText::_('COM_MODULES_HEADING_MODULE'),
				'pages'          => JText::_('COM_MODULES_HEADING_PAGES'),
				'a.access'       => JText::_('JGRID_HEADING_ACCESS'),
				'language_title' => JText::_('JGRID_HEADING_LANGUAGE'),
				'a.id'           => JText::_('JGRID_HEADING_ID')
			);
		}
		else
		{
			if ($this->getLayout() == 'default')
			{
				return array(
					'ordering'       => JText::_('JGRID_HEADING_ORDERING'),
					'a.published'    => JText::_('JSTATUS'),
					'a.title'        => JText::_('JGLOBAL_TITLE'),
					'position'       => JText::_('COM_MODULES_HEADING_POSITION'),
					'name'           => JText::_('COM_MODULES_HEADING_MODULE'),
					'a.access'       => JText::_('JGRID_HEADING_ACCESS'),
					'a.language'     => JText::_('JGRID_HEADING_LANGUAGE'),
					'a.id'           => JText::_('JGRID_HEADING_ID')
				);
			}

			return array(
					'a.title'        => JText::_('JGLOBAL_TITLE'),
					'position'       => JText::_('COM_MODULES_HEADING_POSITION'),
					'name'           => JText::_('COM_MODULES_HEADING_MODULE'),
					'a.access'       => JText::_('JGRID_HEADING_ACCESS'),
					'a.language'     => JText::_('JGRID_HEADING_LANGUAGE'),
					'a.id'           => JText::_('JGRID_HEADING_ID')
			);
		}
	}
}
components/com_modules/views/modules/tmpl/modal.php000060400000012302152453623460016631 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

if (JFactory::getApplication()->isClient('site'))
{
	JSession::checkToken('get') or die(JText::_('JINVALID_TOKEN'));
}

// Load needed scripts
JHtml::_('behavior.core');
JHtml::_('bootstrap.tooltip', '.hasTooltip', array('placement' => 'bottom'));
JHtml::_('bootstrap.popover', '.hasPopover', array('placement' => 'bottom'));
JHtml::_('formbehavior.chosen', 'select');

// Scripts for the modules xtd-button
JHtml::_('behavior.polyfill', array('event'), 'lt IE 9');
JHtml::_('script', 'com_modules/admin-modules-modal.min.js', array('version' => 'auto', 'relative' => true));

// 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'));

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$editor    = JFactory::getApplication()->input->get('editor', '', 'cmd');
$link      = 'index.php?option=com_modules&view=modules&layout=modal&tmpl=component&' . JSession::getFormToken() . '=1';

if (!empty($editor))
{
	$link = 'index.php?option=com_modules&view=modules&layout=modal&tmpl=component&editor=' . $editor . '&' . JSession::getFormToken() . '=1';
}
?>
<div class="container-popup">

	<form action="<?php echo JRoute::_($link); ?>" method="post" name="adminForm" id="adminForm">

		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<?php if ($this->total > 0) : ?>
		<table class="table table-striped" id="moduleList">
			<thead>
				<tr>
					<th width="1%" class="nowrap center">
						<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.published', $listDirn, $listOrder); ?>
					</th>
					<th class="title">
						<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
					</th>
					<th width="15%" class="nowrap hidden-phone">
						<?php echo JHtml::_('searchtools.sort', 'COM_MODULES_HEADING_POSITION', 'a.position', $listDirn, $listOrder); ?>
					</th>
					<th width="10%" class="nowrap hidden-phone">
						<?php echo JHtml::_('searchtools.sort', 'COM_MODULES_HEADING_MODULE', 'name', $listDirn, $listOrder); ?>
					</th>
					<th width="10%" class="nowrap hidden-phone hidden-tablet">
						<?php echo JHtml::_('searchtools.sort', 'COM_MODULES_HEADING_PAGES', 'pages', $listDirn, $listOrder); ?>
					</th>
					<th width="10%" class="nowrap hidden-phone">
						<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ACCESS', 'ag.title', $listDirn, $listOrder); ?>
					</th>
					<th width="10%" class="nowrap hidden-phone">
						<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'l.title', $listDirn, $listOrder); ?>
					</th>
					<th width="1%" class="nowrap hidden-phone">
						<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
					</th>
				</tr>
			</thead>
			<tfoot>
				<tr>
					<td colspan="8">
						<?php echo $this->pagination->getListFooter(); ?>
					</td>
				</tr>
			</tfoot>
			<tbody>
				<?php
				$iconStates = array(
					-2 => 'icon-trash',
					0  => 'icon-unpublish',
					1  => 'icon-publish',
					2  => 'icon-archive',
				);
				foreach ($this->items as $i => $item) :
				?>
				<tr class="row<?php echo $i % 2; ?>">
					<td class="center">
						<span class="<?php echo $iconStates[$this->escape($item->published)]; ?>" aria-hidden="true"></span>
					</td>
					<td class="has-context">
						<a class="js-module-insert btn btn-small btn-block btn-success" href="#" data-module="<?php echo $item->id; ?>" data-editor="<?php echo $this->escape($editor); ?>">
							<?php echo $this->escape($item->title); ?>
						</a>
					</td>
					<td class="small hidden-phone">
						<?php if ($item->position) : ?>
						<a class="js-position-insert btn btn-small btn-block btn-warning" href="#" data-position="<?php echo $this->escape($item->position); ?>" data-editor="<?php echo $this->escape($editor); ?>"><?php echo $this->escape($item->position); ?></a>
						<?php else : ?>
						<span class="label"><?php echo JText::_('JNONE'); ?></span>
						<?php endif; ?>
					</td>
					<td class="small hidden-phone">
						<?php echo $item->name; ?>
					</td>
					<td class="small hidden-phone hidden-tablet">
						<?php echo $item->pages; ?>
					</td>
					<td class="small hidden-phone">
						<?php echo $this->escape($item->access_level); ?>
					</td>
					<td class="small hidden-phone">
						<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
					</td>
					<td class="hidden-phone">
						<?php echo (int) $item->id; ?>
					</td>
				</tr>
			<?php endforeach; ?>
			</tbody>
		</table>
		<?php endif; ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<input type="hidden" name="editor" value="<?php echo $editor; ?>" />
		<?php echo JHtml::_('form.token'); ?>

	</form>
</div>
components/com_modules/views/modules/tmpl/default_batch_footer.php000060400000001277152453623460021711 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

?>
<button type="button" class="btn" onclick="document.getElementById('batch-position-id').value='';document.getElementById('batch-access').value='';document.getElementById('batch-language-id').value=''" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<button type="submit" class="btn btn-success" onclick="Joomla.submitbutton('module.batch');return false;">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>
components/com_modules/views/modules/tmpl/default_batch_body.php000060400000004616152453623460021350 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$clientId  = $this->state->get('client_id');

// Show only Module Positions of published Templates
$published = 1;
$positions = JHtml::_('modules.positions', $clientId, $published);
$positions['']['items'][] = ModulesHelper::createOption('nochange', JText::_('COM_MODULES_BATCH_POSITION_NOCHANGE'));
$positions['']['items'][] = ModulesHelper::createOption('noposition', JText::_('COM_MODULES_BATCH_POSITION_NOPOSITION'));

// Add custom position to options
$customGroupText = JText::_('COM_MODULES_CUSTOM_POSITION');

// Build field
$attr = array(
	'id'        => 'batch-position-id',
	'list.attr' => 'class="chzn-custom-value input-xlarge" '
		. 'data-custom_group_text="' . $customGroupText . '" '
		. 'data-no_results_text="' . JText::_('COM_MODULES_ADD_CUSTOM_POSITION') . '" '
		. 'data-placeholder="' . JText::_('COM_MODULES_TYPE_OR_SELECT_POSITION') . '" '
);

?>
<div class="container-fluid">
	<p><?php echo JText::_('COM_MODULES_BATCH_TIP'); ?></p>
	<div class="row-fluid">
		<?php if ($clientId != 1) : ?>
			<div class="control-group span6">
				<div class="controls">
					<?php echo JLayoutHelper::render('joomla.html.batch.language', array()); ?>
				</div>
			</div>
		<?php elseif ($clientId == 1 && JModuleHelper::isAdminMultilang()) : ?>
			<div class="control-group span6">
				<div class="controls">
					<?php echo JLayoutHelper::render('joomla.html.batch.adminlanguage', array()); ?>
				</div>
			</div>
		<?php endif; ?>
		<div class="control-group span6">
			<div class="controls">
				<?php echo JHtml::_('batch.access'); ?>
			</div>
		</div>
	</div>
	<div class="row-fluid">
		<?php if ($published >= 0) : ?>
			<div class="span6">
				<div class="controls">
					<label id="batch-choose-action-lbl" for="batch-choose-action">
						<?php echo JText::_('COM_MODULES_BATCH_POSITION_LABEL'); ?>
					</label>
					<div id="batch-choose-action" class="control-group">
						<?php echo JHtml::_('select.groupedlist', $positions, 'batch[position_id]', $attr); ?>
						<div id="batch-copy-move" class="control-group radio">
							<?php echo JHtml::_('modules.batchOptions'); ?>
						</div>
					</div>
				</div>
			</div>
		<?php endif; ?>
	</div>
</div>
components/com_modules/views/modules/tmpl/default.php000060400000022105152453623460017163 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$clientId   = (int) $this->state->get('client_id', 0);
$user		= JFactory::getUser();
$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_modules&task=modules.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'moduleList', 'adminForm', strtolower($listDirn), $saveOrderingUrl);
}
$colSpan = $clientId === 1 ? 8 : 10;
?>
<form action="<?php echo JRoute::_('index.php?option=com_modules'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif;?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<?php if ($this->total > 0) : ?>
			<table class="table table-striped" id="moduleList">
				<thead>
					<tr>
						<th width="1%" class="nowrap center hidden-phone">
							<?php echo JHtml::_('searchtools.sort', '', 'a.ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING', 'icon-menu-2'); ?>
						</th>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th width="1%" class="nowrap center" style="min-width:55px">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.published', $listDirn, $listOrder); ?>
						</th>
						<th class="title">
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
						</th>
						<th width="15%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_MODULES_HEADING_POSITION', 'a.position', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone hidden-tablet">
							<?php echo JHtml::_('searchtools.sort', 'COM_MODULES_HEADING_MODULE', 'name', $listDirn, $listOrder); ?>
						</th>
						<?php if ($clientId === 0) : ?>
						<th width="10%" class="nowrap hidden-phone hidden-tablet">
							<?php echo JHtml::_('searchtools.sort', 'COM_MODULES_HEADING_PAGES', 'pages', $listDirn, $listOrder); ?>
						</th>
						<?php endif; ?>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ACCESS', 'ag.title', $listDirn, $listOrder); ?>
						</th>
						<?php if ($clientId === 0) : ?>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'l.title', $listDirn, $listOrder); ?>
						</th>
						<?php elseif ($clientId === 1 && JModuleHelper::isAdminMultilang()) : ?>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'a.language', $listDirn, $listOrder); ?>
						</th>
						<?php endif; ?>
						<th width="1%" class="nowrap center hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="<?php echo $colSpan; ?>">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
				<?php foreach ($this->items as $i => $item) :
					$ordering   = ($listOrder == 'a.ordering');
					$canCreate  = $user->authorise('core.create',     'com_modules');
					$canEdit	= $user->authorise('core.edit',		  'com_modules.module.' . $item->id);
					$canCheckin = $user->authorise('core.manage',     'com_checkin') || $item->checked_out == $user->get('id')|| $item->checked_out == 0;
					$canChange  = $user->authorise('core.edit.state', 'com_modules.module.' . $item->id) && $canCheckin;
				?>
					<tr class="row<?php echo $i % 2; ?>" sortable-group-id="<?php echo $item->position ?: 'none'; ?>">
						<td class="order nowrap center hidden-phone">
							<?php
							$iconClass = '';
							if (!$canChange)
							{
								$iconClass = ' inactive';
							}
							elseif (!$saveOrder)
							{
								$iconClass = ' inactive tip-top hasTooltip" title="' . JHtml::_('tooltipText', 'JORDERINGDISABLED');
							}
							?>
							<span class="sortable-handler<?php echo $iconClass; ?>">
								<span class="icon-menu"></span>
							</span>
							<?php if ($canChange && $saveOrder) : ?>
								<input type="text" style="display:none" name="order[]" size="5" value="<?php echo $item->ordering; ?>" class="width-20 text-area-order" />
							<?php endif; ?>
						</td>
						<td class="center">
							<?php if ($item->enabled > 0) : ?>
								<?php echo JHtml::_('grid.id', $i, $item->id); ?>
							<?php endif; ?>
						</td>
						<td class="center">
							<div class="btn-group">
							<?php // Check if extension is enabled ?>
							<?php if ($item->enabled > 0) : ?>
								<?php echo JHtml::_('jgrid.published', $item->published, $i, 'modules.', $canChange, 'cb', $item->publish_up, $item->publish_down); ?>
								<?php // Create dropdown items and render the dropdown list.
								if ($canCreate)
								{
									JHtml::_('actionsdropdown.duplicate', 'cb' . $i, 'modules');
								}
								if ($canChange)
								{
									JHtml::_('actionsdropdown.' . ((int) $item->published === -2 ? 'un' : '') . 'trash', 'cb' . $i, 'modules');
								}
								if ($canCreate || $canChange)
								{
									echo JHtml::_('actionsdropdown.render', $this->escape($item->title));
								}
								?>
							<?php else : ?>
								<?php // Extension is not enabled, show a message that indicates this. ?>
								<button class="btn btn-micro hasTooltip" title="<?php echo JText::_('COM_MODULES_MSG_MANAGE_EXTENSION_DISABLED'); ?>">
									<span class="icon-ban-circle" aria-hidden="true"></span>
								</button>
							<?php endif; ?>
							</div>
						</td>
						<td class="has-context">
							<div class="pull-left">
								<?php if ($item->checked_out) : ?>
									<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'modules.', $canCheckin); ?>
								<?php endif; ?>
								<?php if ($canEdit) : ?>
									<a class="hasTooltip" href="<?php echo JRoute::_('index.php?option=com_modules&task=module.edit&id=' . (int) $item->id); ?>" title="<?php echo JText::_('JACTION_EDIT'); ?>">
										<?php echo $this->escape($item->title); ?></a>
								<?php else : ?>
									<?php echo $this->escape($item->title); ?>
								<?php endif; ?>

								<?php if (!empty($item->note)) : ?>
									<div class="small">
										<?php echo JText::sprintf('JGLOBAL_LIST_NOTE', $this->escape($item->note)); ?>
									</div>
								<?php endif; ?>
							</div>
						</td>
						<td class="small hidden-phone">
							<?php if ($item->position) : ?>
								<span class="label label-info">
									<?php echo $item->position; ?>
								</span>
							<?php else : ?>
								<span class="label">
									<?php echo JText::_('JNONE'); ?>
								</span>
							<?php endif; ?>
						</td>
						<td class="small hidden-phone hidden-tablet">
							<?php echo $item->name; ?>
						</td>
						<?php if ($clientId === 0) : ?>
						<td class="small hidden-phone hidden-tablet">
							<?php echo $item->pages; ?>
						</td>
						<?php endif; ?>
						<td class="small hidden-phone">
							<?php echo $this->escape($item->access_level); ?>
						</td>
						<?php if ($clientId === 0) : ?>
						<td class="small hidden-phone">
							<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
						</td>
						<?php elseif ($clientId === 1 && JModuleHelper::isAdminMultilang()) : ?>
							<td class="small hidden-phone">
								<?php if ($item->language == ''):?>
									<?php echo JText::_('JUNDEFINED'); ?>
								<?php elseif ($item->language == '*'):?>
									<?php echo JText::alt('JALL', 'language'); ?>
								<?php else:?>
									<?php echo $this->escape($item->language); ?>
								<?php endif; ?>
							</td>
						<?php endif; ?>
						<td class="hidden-phone">
							<?php echo (int) $item->id; ?>
						</td>
					</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif; ?>

		<?php // Load the batch processing form. ?>
		<?php if ($user->authorise('core.create', 'com_modules')
			&& $user->authorise('core.edit', 'com_modules')
			&& $user->authorise('core.edit.state', 'com_modules')) : ?>
			<?php echo JHtml::_(
				'bootstrap.renderModal',
				'collapseModal',
				array(
					'title'  => JText::_('COM_MODULES_BATCH_OPTIONS'),
					'footer' => $this->loadTemplate('batch_footer'),
				),
				$this->loadTemplate('batch_body')
			); ?>
		<?php endif; ?>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_modules/views/modules/tmpl/default.xml000060400000000320152453623460017167 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_MODULES_MODULES_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_MODULES_MODULES_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_modules/views/positions/tmpl/modal.php000060400000010167152453623460017217 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// @deprecated  4.0 without replacement only used in hathor

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('formbehavior.chosen', 'select');

$function  = JFactory::getApplication()->input->getCmd('function', 'jSelectPosition');
$lang      = JFactory::getLanguage();
$ordering  = $this->escape($this->state->get('list.ordering'));
$direction = $this->escape($this->state->get('list.direction'));
$clientId  = $this->state->get('client_id');
$state     = $this->state->get('filter.state');
$template  = $this->state->get('filter.template');
$type      = $this->state->get('filter.type');
?>
<form action="<?php echo JRoute::_('index.php?option=com_modules&view=positions&layout=modal&tmpl=component&function=' . $function . '&client_id=' . $clientId); ?>" method="post" name="adminForm" id="adminForm">
	<fieldset class="filter clearfix">
		<div class="left">
			<label for="filter_search">
				<?php echo JText::_('JSEARCH_FILTER_LABEL'); ?>
			</label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" size="30" title="<?php echo JText::_('COM_MODULES_FILTER_SEARCH_DESC'); ?>" />

			<button type="submit">
				<?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" onclick="document.getElementById('filter_search').value='';this.form.submit();">
				<?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>

		<div class="right">
			<select name="filter_state" onchange="this.form.submit()">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('modules.templateStates'), 'value', 'text', $state, true); ?>
			</select>

			<select name="filter_type" onchange="this.form.submit()">
				<option value=""><?php echo JText::_('COM_MODULES_OPTION_SELECT_TYPE'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('modules.types'), 'value', 'text', $type, true); ?>
			</select>

			<select name="filter_template" onchange="this.form.submit()">
				<option value=""><?php echo JText::_('JOPTION_SELECT_TEMPLATE'); ?></option>
				<?php echo JHtml::_('select.options', JHtml::_('modules.templates', $clientId), 'value', 'text', $template, true); ?>
			</select>
		</div>
	</fieldset>

	<table class="adminlist">
		<thead>
			<tr>
				<th class="title" width="20%">
					<?php echo JHtml::_('grid.sort', 'JGLOBAL_TITLE', 'value', $direction, $ordering); ?>
				</th>
				<th>
					<?php echo JHtml::_('grid.sort', 'COM_MODULES_HEADING_TEMPLATES', 'templates', $direction, $ordering); ?>
				</th>
			</tr>
		</thead>
		<tfoot>
			<tr>
				<td colspan="15">
					<?php echo $this->pagination->getListFooter(); ?>
				</td>
			</tr>
		</tfoot>
		<tbody>
		<?php $i = 1; foreach ($this->items as $value => $templates) : ?>
			<tr class="row<?php echo $i = 1 - $i; ?>">
				<td>
					<a class="pointer" onclick="if (window.parent) window.parent.<?php echo $function; ?>('<?php echo $value; ?>');"><?php echo $this->escape($value); ?></a>
				</td>
				<td>
					<?php if (!empty($templates)) : ?>
					<a class="pointer" onclick="if (window.parent) window.parent.<?php echo $function; ?>('<?php echo $value; ?>');">
						<ul>
						<?php foreach ($templates as $template => $label) : ?>
							<li><?php echo $lang->hasKey($label) ? JText::sprintf('COM_MODULES_MODULE_TEMPLATE_POSITION', JText::_($template), JText::_($label)) : JText::_($template); ?></li>
						<?php endforeach; ?>
						</ul>
					</a>
					<?php endif; ?>
				</td>
			</tr>
			<?php endforeach; ?>
		</tbody>
	</table>

	<div>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<input type="hidden" name="filter_order" value="<?php echo $ordering; ?>" />
		<input type="hidden" name="filter_order_Dir" value="<?php echo $direction; ?>" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_modules/views/positions/view.html.php000060400000001761152453623460017064 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// @deprecated  4.0 without replacement only used in hathor

defined('_JEXEC') or die;

/**
 * View Module positions class.
 *
 * @since  1.6
 */
class ModulesViewPositions extends JViewLegacy
{
	protected $items;

	protected $pagination;

	protected $state;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		$this->items      = $this->get('Items');
		$this->pagination = $this->get('Pagination');
		$this->state      = $this->get('State');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		parent::display($tpl);
	}
}
components/com_modules/views/select/view.html.php000060400000003127152453623460016312 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * HTML View class for the Modules component
 *
 * @since  1.6
 */
class ModulesViewSelect extends JViewLegacy
{
	protected $state;

	protected $items;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		$state = $this->get('State');
		$items = $this->get('Items');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		$this->state = &$state;
		$this->items = &$items;

		$this->addToolbar();
		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		$state = $this->get('State');

		// Add page title
		if ($state->get('client_id') == 1)
		{
			JToolbarHelper::title(JText::_('COM_MODULES_MANAGER_MODULES_ADMIN'), 'cube module');
		}
		else
		{
			JToolbarHelper::title(JText::_('COM_MODULES_MANAGER_MODULES_SITE'), 'cube module');
		}

		// Get the toolbar object instance
		$bar = JToolbar::getInstance('toolbar');

		// Instantiate a new JLayoutFile instance and render the layout
		$layout = new JLayoutFile('toolbar.cancelselect');

		$bar->appendButton('Custom', $layout->render(array()), 'new');
	}
}
components/com_modules/views/select/tmpl/default.php000060400000002341152453623460016772 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.popover');
$document = JFactory::getDocument();
?>

<h2><?php echo JText::_('COM_MODULES_TYPE_CHOOSE'); ?></h2>
<ul id="new-modules-list" class="list list-striped">
<?php foreach ($this->items as &$item) : ?>
	<?php // Prepare variables for the link. ?>
	<?php $link       = 'index.php?option=com_modules&task=module.add&eid=' . $item->extension_id; ?>
	<?php $name       = $this->escape($item->name); ?>
	<?php $desc       = JHtml::_('string.truncate', $this->escape(strip_tags($item->desc)), 200); ?>
	<?php $short_desc = JHtml::_('string.truncate', $this->escape(strip_tags($item->desc)), 90); ?>
	<li>
		<a href="<?php echo JRoute::_($link); ?>">
			<strong><?php echo $name; ?></strong></a>
		<small class="hasPopover" data-placement="right" title="<?php echo $name; ?>" data-content="<?php echo $desc; ?>"><?php echo $short_desc; ?></small>
	</li>
<?php endforeach; ?>
</ul>
<div class="clr"></div>
components/com_modules/views/preview/view.html.php000060400000001410152453623460016505 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// @deprecated  4.0 not used for a long time

defined('_JEXEC') or die;

/**
 * HTML View class for the Modules component
 *
 * @since  1.6
 */
class ModulesViewPreview extends JViewLegacy
{
	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		$editor = JFactory::getConfig()->get('editor');

		$this->editor = JEditor::getInstance($editor);

		parent::display($tpl);
	}
}
components/com_modules/views/preview/tmpl/default.php000060400000001534152453623460017177 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// @deprecated  4.0 not used for a long time

defined('_JEXEC') or die;

JFactory::getDocument()->addScriptDeclaration(
	'
	var form = window.top.document.adminForm
	var title = form.title.value;
	var alltext = window.top.' . $this->editor->getContent('text') . ';

	jQuery(document).ready(function() {
		document.getElementById("td-title").innerHTML = title;
		document.getElementById("td-text").innerHTML = alltext;
	});'
);
?>

<table class="center" width="90%">
	<tr>
		<td class="contentheading" colspan="2" id="td-title"></td>
	</tr>
<tr>
	<td valign="top" height="90%" colspan="2" id="td-text"></td>
</tr>
</table>
components/com_modules/controllers/modules.php000060400000003121152453623460015771 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Modules list controller class.
 *
 * @since  1.6
 */
class ModulesControllerModules extends JControllerAdmin
{
	/**
	 * Method to clone an existing module.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function duplicate()
	{
		// Check for request forgeries
		$this->checkToken();

		$pks = (array) $this->input->post->get('cid', array(), 'int');

		// Remove zero values resulting from input filter
		$pks = array_filter($pks);

		try
		{
			if (empty($pks))
			{
				throw new Exception(JText::_('COM_MODULES_ERROR_NO_MODULES_SELECTED'));
			}

			$model = $this->getModel();
			$model->duplicate($pks);
			$this->setMessage(JText::plural('COM_MODULES_N_MODULES_DUPLICATED', count($pks)));
		}
		catch (Exception $e)
		{
			JError::raiseWarning(500, $e->getMessage());
		}

		$this->setRedirect('index.php?option=com_modules&view=modules');
	}

	/**
	 * 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.6
	 */
	public function getModel($name = 'Module', $prefix = 'ModulesModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}
}
components/com_modules/controllers/module.php000060400000017235152453623460015621 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Module controller class.
 *
 * @since  1.6
 */
class ModulesControllerModule extends JControllerForm
{
	/**
	 * Override parent add method.
	 *
	 * @return  mixed  True if the record can be added, a JError object if not.
	 *
	 * @since   1.6
	 */
	public function add()
	{
		$app = JFactory::getApplication();

		// Get the result of the parent method. If an error, just return it.
		$result = parent::add();

		if ($result instanceof Exception)
		{
			return $result;
		}

		// Look for the Extension ID.
		$extensionId = $app->input->get('eid', 0, 'int');

		if (empty($extensionId))
		{
			$redirectUrl = 'index.php?option=' . $this->option . '&view=' . $this->view_item . '&layout=edit';

			$this->setRedirect(JRoute::_($redirectUrl, false));

			return JError::raiseWarning(500, JText::_('COM_MODULES_ERROR_INVALID_EXTENSION'));
		}

		$app->setUserState('com_modules.add.module.extension_id', $extensionId);
		$app->setUserState('com_modules.add.module.params', null);

		// Parameters could be coming in for a new item, so let's set them.
		$params = $app->input->get('params', array(), 'array');
		$app->setUserState('com_modules.add.module.params', $params);
	}

	/**
	 * Override parent cancel method to reset the add module state.
	 *
	 * @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)
	{
		$app = JFactory::getApplication();

		$result = parent::cancel();

		$app->setUserState('com_modules.add.module.extension_id', null);
		$app->setUserState('com_modules.add.module.params', null);

		return $result;
	}

	/**
	 * Override parent allowSave method.
	 *
	 * @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 allowSave($data, $key = 'id')
	{
		// Use custom position if selected
		if (isset($data['custom_position']))
		{
			if (empty($data['position']))
			{
				$data['position'] = $data['custom_position'];
			}

			unset($data['custom_position']);
		}

		return parent::allowSave($data, $key);
	}

	/**
	 * 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   3.2
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// Initialise variables.
		$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_modules.module.' . $recordId))
		{
			return true;
		}

		return false;
	}

	/**
	 * Method to run batch operations.
	 *
	 * @param   string  $model  The model
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.7
	 */
	public function batch($model = null)
	{
		$this->checkToken();

		// Set the model
		$model = $this->getModel('Module', '', array());

		// Preset the redirect
		$redirectUrl = 'index.php?option=com_modules&view=modules' . $this->getRedirectToListAppend();

		$this->setRedirect(JRoute::_($redirectUrl, false));

		return parent::batch($model);
	}

	/**
	 * 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   1.6
	 */
	protected function postSaveHook(JModelLegacy $model, $validData = array())
	{
		$app = JFactory::getApplication();
		$task = $this->getTask();

		switch ($task)
		{
			case 'save2new':
				$app->setUserState('com_modules.add.module.extension_id', $model->getState('module.extension_id'));
				break;

			default:
				$app->setUserState('com_modules.add.module.extension_id', null);
				break;
		}

		$app->setUserState('com_modules.add.module.params', null);
	}

	/**
	 * 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
	 *
	 * @return  boolean  True if successful, false otherwise.
	 */
	public function save($key = null, $urlVar = null)
	{
		$this->checkToken();

		if (JFactory::getDocument()->getType() == 'json')
		{
			$model = $this->getModel();
			$data  = $this->input->post->get('jform', array(), 'array');
			$item = $model->getItem($this->input->get('id'));
			$properties = $item->getProperties();

			if (isset($data['params']))
			{
				unset($properties['params']);
			}

			// Replace changed properties
			$data = array_replace_recursive($properties, $data);

			if (!empty($data['assigned']))
			{
				$data['assigned'] = array_map('abs', $data['assigned']);
			}

			// Add new data to input before process by parent save()
			$this->input->post->set('jform', $data);

			// Add path of forms directory
			JForm::addFormPath(JPATH_ADMINISTRATOR . '/components/com_modules/models/forms');
		}

		parent::save($key, $urlVar);

	}

	/**
	 * Method to get the other modules in the same position
	 *
	 * @return  string  The data for the Ajax request.
	 *
	 * @since   3.6.3
	 */
	public function orderPosition()
	{
		$app = JFactory::getApplication();

		// Send json mime type.
		$app->mimeType = 'application/json';
		$app->setHeader('Content-Type', $app->mimeType . '; charset=' . $app->charSet);
		$app->sendHeaders();

		// Check if user token is valid.
		if (!JSession::checkToken('get'))
		{
			$app->enqueueMessage(JText::_('JINVALID_TOKEN_NOTICE'), 'error');
			echo new JResponseJson;
			$app->close();
		}

		$jinput   = $app->input;
		$clientId = $jinput->getValue('client_id');
		$position = $jinput->getValue('position');
		$moduleId = $jinput->getValue('module_id');

		// Access check.
		if (!JFactory::getUser()->authorise('core.create', 'com_modules')
			&& !JFactory::getUser()->authorise('core.edit.state', 'com_modules')
			&& ($moduleId && !JFactory::getUser()->authorise('core.edit.state', 'com_modules.module.' . $moduleId)))
		{
			$app->enqueueMessage(\JText::_('JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN'), 'error');
			echo new JResponseJson;
			$app->close();
		}

		$db    = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('position, ordering, title')
			->from('#__modules')
			->where('client_id = ' . (int) $clientId . ' AND position = ' . $db->q($position))
			->order('ordering');

		$db->setQuery($query);

		try
		{
			$orders = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $e->getMessage());

			return '';
		}

		$orders2 = array();
		$n = count($orders);

		if ($n > 0)
		{
			for ($i = 0, $n; $i < $n; $i++)
			{
				if (!isset($orders2[$orders[$i]->position]))
				{
					$orders2[$orders[$i]->position] = 0;
				}

				$orders2[$orders[$i]->position]++;
				$ord = $orders2[$orders[$i]->position];
				$title = JText::sprintf('COM_MODULES_OPTION_ORDER_POSITION', $ord, htmlspecialchars($orders[$i]->title, ENT_QUOTES, 'UTF-8'));

				$html[] = $orders[$i]->position . ',' . $ord . ',' . $title;
			}
		}
		else
		{
			$html[] = $position . ',' . 1 . ',' . JText::_('JNONE');
		}

		echo new JResponseJson($html);
		$app->close();
	}
}
components/com_modules/helpers/html/modules.php000060400000014162152453623460016040 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * JHtml module helper class.
 *
 * @since  1.6
 */
abstract class JHtmlModules
{
	/**
	 * Builds an array of template options
	 *
	 * @param   integer  $clientId  The client id.
	 * @param   string   $state     The state of the template.
	 *
	 * @return  array
	 */
	public static function templates($clientId = 0, $state = '')
	{
		$options   = array();
		$templates = ModulesHelper::getTemplates($clientId, $state);

		foreach ($templates as $template)
		{
			$options[] = JHtml::_('select.option', $template->element, $template->name);
		}

		return $options;
	}

	/**
	 * Builds an array of template type options
	 *
	 * @return  array
	 */
	public static function types()
	{
		$options = array();
		$options[] = JHtml::_('select.option', 'user', 'COM_MODULES_OPTION_POSITION_USER_DEFINED');
		$options[] = JHtml::_('select.option', 'template', 'COM_MODULES_OPTION_POSITION_TEMPLATE_DEFINED');

		return $options;
	}

	/**
	 * Builds an array of template state options
	 *
	 * @return  array
	 */
	public static function templateStates()
	{
		$options = array();
		$options[] = JHtml::_('select.option', '1', 'JENABLED');
		$options[] = JHtml::_('select.option', '0', 'JDISABLED');

		return $options;
	}

	/**
	 * Returns a published 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   1.7.1
	 */
	public static function state($value, $i, $enabled = true, $checkbox = 'cb')
	{
		$states = array(
			1  => array(
				'unpublish',
				'COM_MODULES_EXTENSION_PUBLISHED_ENABLED',
				'COM_MODULES_HTML_UNPUBLISH_ENABLED',
				'COM_MODULES_EXTENSION_PUBLISHED_ENABLED',
				true,
				'publish',
				'publish',
			),
			0  => array(
				'publish',
				'COM_MODULES_EXTENSION_UNPUBLISHED_ENABLED',
				'COM_MODULES_HTML_PUBLISH_ENABLED',
				'COM_MODULES_EXTENSION_UNPUBLISHED_ENABLED',
				true,
				'unpublish',
				'unpublish',
			),
			-1 => array(
				'unpublish',
				'COM_MODULES_EXTENSION_PUBLISHED_DISABLED',
				'COM_MODULES_HTML_UNPUBLISH_DISABLED',
				'COM_MODULES_EXTENSION_PUBLISHED_DISABLED',
				true,
				'warning',
				'warning',
			),
			-2 => array(
				'publish',
				'COM_MODULES_EXTENSION_UNPUBLISHED_DISABLED',
				'COM_MODULES_HTML_PUBLISH_DISABLED',
				'COM_MODULES_EXTENSION_UNPUBLISHED_DISABLED',
				true,
				'unpublish',
				'unpublish',
			),
		);

		return JHtml::_('jgrid.state', $states, $value, $i, 'modules.', $enabled, true, $checkbox);
	}

	/**
	 * Display a batch widget for the module position selector.
	 *
	 * @param   integer  $clientId          The client ID.
	 * @param   integer  $state             The state of the module (enabled, unenabled, trashed).
	 * @param   string   $selectedPosition  The currently selected position for the module.
	 *
	 * @return  string   The necessary positions for the widget.
	 *
	 * @since   2.5
	 */
	public static function positions($clientId, $state = 1, $selectedPosition = '')
	{
		JLoader::register('TemplatesHelper', JPATH_ADMINISTRATOR . '/components/com_templates/helpers/templates.php');

		$templates      = array_keys(ModulesHelper::getTemplates($clientId, $state));
		$templateGroups = array();

		// Add an empty value to be able to deselect a module position
		$option = ModulesHelper::createOption();
		$templateGroups[''] = ModulesHelper::createOptionGroup('', array($option));

		// Add positions from templates
		$isTemplatePosition = false;

		foreach ($templates as $template)
		{
			$options = array();

			$positions = TemplatesHelper::getPositions($clientId, $template);

			if (is_array($positions))
			{
				foreach ($positions as $position)
				{
					$text = ModulesHelper::getTranslatedModulePosition($clientId, $template, $position) . ' [' . $position . ']';
					$options[] = ModulesHelper::createOption($position, $text);

					if (!$isTemplatePosition && $selectedPosition === $position)
					{
						$isTemplatePosition = true;
					}
				}

				$options = ArrayHelper::sortObjects($options, 'text');
			}

			$templateGroups[$template] = ModulesHelper::createOptionGroup(ucfirst($template), $options);
		}

		// Add custom position to options
		$customGroupText = JText::_('COM_MODULES_CUSTOM_POSITION');

		$editPositions = true;
		$customPositions = ModulesHelper::getPositions($clientId, $editPositions);
		$templateGroups[$customGroupText] = ModulesHelper::createOptionGroup($customGroupText, $customPositions);

		return $templateGroups;
	}

	/**
	 * Get a select with the batch action options
	 *
	 * @return  void
	 */
	public static function batchOptions()
	{
		// Create the copy/move options.
		$options = array(
			JHtml::_('select.option', 'c', JText::_('JLIB_HTML_BATCH_COPY')),
			JHtml::_('select.option', 'm', JText::_('JLIB_HTML_BATCH_MOVE'))
		);

		echo JHtml::_('select.radiolist', $options, 'batch[move_copy]', '', 'value', 'text', 'm');
	}

	/**
	 * Method to get the field options.
	 *
	 * @param   integer  $clientId  The client ID
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   2.5
	 */
	public static function positionList($clientId = 0)
	{
		$db    = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('DISTINCT(position) as value')
			->select('position as text')
			->from($db->quoteName('#__modules'))
			->where($db->quoteName('client_id') . ' = ' . (int) $clientId)
			->order('position');

		// Get the options.
		$db->setQuery($query);

		try
		{
			$options = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $e->getMessage());
		}

		// Pop the first item off the array if it's blank
		if (count($options))
		{
			if (strlen($options[0]->text) < 1)
			{
				array_shift($options);
			}
		}

		return $options;
	}
}
components/com_modules/helpers/modules.php000060400000021446152453623460015077 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Modules component helper.
 *
 * @since  1.6
 */
abstract class ModulesHelper
{
	/**
	 * Configure the Linkbar.
	 *
	 * @param   string  $vName  The name of the active view.
	 *
	 * @return  void
	 */
	public static function addSubmenu($vName)
	{
		// Not used in this component.
	}

	/**
	 * Gets a list of the actions that can be performed.
	 *
	 * @param   integer  $moduleId  The module ID.
	 *
	 * @return  JObject
	 *
	 * @deprecated  3.2  Use JHelperContent::getActions() instead
	 */
	public static function getActions($moduleId = 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
		if (empty($moduleId))
		{
			$result = JHelperContent::getActions('com_modules');
		}
		else
		{
			$result = JHelperContent::getActions('com_modules', 'module', $moduleId);
		}

		return $result;
	}

	/**
	 * Get a list of filter options for the state of a module.
	 *
	 * @return  array  An array of JHtmlOption elements.
	 */
	public static function getStateOptions()
	{
		// Build the filter options.
		$options   = array();
		$options[] = JHtml::_('select.option', '1', JText::_('JPUBLISHED'));
		$options[] = JHtml::_('select.option', '0', JText::_('JUNPUBLISHED'));
		$options[] = JHtml::_('select.option', '-2', JText::_('JTRASHED'));
		$options[] = JHtml::_('select.option', '*', JText::_('JALL'));

		return $options;
	}

	/**
	 * Get a list of filter options for the application clients.
	 *
	 * @return  array  An array of JHtmlOption elements.
	 */
	public static function getClientOptions()
	{
		// Build the filter options.
		$options   = array();
		$options[] = JHtml::_('select.option', '0', JText::_('JSITE'));
		$options[] = JHtml::_('select.option', '1', JText::_('JADMINISTRATOR'));

		return $options;
	}

	/**
	 * Get a list of modules positions
	 *
	 * @param   integer  $clientId       Client ID
	 * @param   boolean  $editPositions  Allow to edit the positions
	 *
	 * @return  array  A list of positions
	 */
	public static function getPositions($clientId, $editPositions = false)
	{
		$db    = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('DISTINCT(position)')
			->from('#__modules')
			->where($db->quoteName('client_id') . ' = ' . (int) $clientId)
			->order('position');

		$db->setQuery($query);

		try
		{
			$positions = $db->loadColumn();
			$positions = is_array($positions) ? $positions : array();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $e->getMessage());

			return;
		}

		// Build the list
		$options = array();

		foreach ($positions as $position)
		{
			if (!$position && !$editPositions)
			{
				$options[] = JHtml::_('select.option', 'none', JText::_('COM_MODULES_NONE'));
			}
			else
			{
				$options[] = JHtml::_('select.option', $position, $position);
			}
		}

		return $options;
	}

	/**
	 * Return a list of templates
	 *
	 * @param   integer  $clientId  Client ID
	 * @param   string   $state     State
	 * @param   string   $template  Template name
	 *
	 * @return  array  List of templates
	 */
	public static function getTemplates($clientId = 0, $state = '', $template = '')
	{
		$db = JFactory::getDbo();

		// Get the database object and a new query object.
		$query = $db->getQuery(true);

		// Build the query.
		$query->select('element, name, enabled')
			->from('#__extensions')
			->where('client_id = ' . (int) $clientId)
			->where('type = ' . $db->quote('template'));

		if ($state != '')
		{
			$query->where('enabled = ' . $db->quote($state));
		}

		if ($template != '')
		{
			$query->where('element = ' . $db->quote($template));
		}

		// Set the query and load the templates.
		$db->setQuery($query);
		$templates = $db->loadObjectList('element');

		return $templates;
	}

	/**
	 * Get a list of the unique modules installed in the client application.
	 *
	 * @param   int  $clientId  The client id.
	 *
	 * @return  array  Array of unique modules
	 */
	public static function getModules($clientId)
	{
		$db    = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('element AS value, name AS text')
			->from('#__extensions as e')
			->where('e.client_id = ' . (int) $clientId)
			->where('type = ' . $db->quote('module'))
			->join('LEFT', '#__modules as m ON m.module=e.element AND m.client_id=e.client_id')
			->where('m.module IS NOT NULL')
			->group('element,name');

		$db->setQuery($query);
		$modules = $db->loadObjectList();
		$lang = JFactory::getLanguage();

		foreach ($modules as $i => $module)
		{
			$extension = $module->value;
			$path = $clientId ? JPATH_ADMINISTRATOR : JPATH_SITE;
			$source = $path . "/modules/$extension";
				$lang->load("$extension.sys", $path, null, false, true)
			||	$lang->load("$extension.sys", $source, null, false, true);
			$modules[$i]->text = JText::_($module->text);
		}

		$modules = ArrayHelper::sortObjects($modules, 'text', 1, true, true);

		return $modules;
	}

	/**
	 * Get a list of the assignment options for modules to menus.
	 *
	 * @param   int  $clientId  The client id.
	 *
	 * @return  array
	 */
	public static function getAssignmentOptions($clientId)
	{
		$options = array();
		$options[] = JHtml::_('select.option', '0', 'COM_MODULES_OPTION_MENU_ALL');
		$options[] = JHtml::_('select.option', '-', 'COM_MODULES_OPTION_MENU_NONE');

		if ($clientId == 0)
		{
			$options[] = JHtml::_('select.option', '1', 'COM_MODULES_OPTION_MENU_INCLUDE');
			$options[] = JHtml::_('select.option', '-1', 'COM_MODULES_OPTION_MENU_EXCLUDE');
		}

		return $options;
	}

	/**
	 * Return a translated module position name
	 *
	 * @param   integer  $clientId  Application client id 0: site | 1: admin
	 * @param   string   $template  Template name
	 * @param   string   $position  Position name
	 *
	 * @return  string  Return a translated position name
	 *
	 * @since   3.0
	 */
	public static function getTranslatedModulePosition($clientId, $template, $position)
	{
		// Template translation
		$lang = JFactory::getLanguage();
		$path = $clientId ? JPATH_ADMINISTRATOR : JPATH_SITE;

		$loaded = $lang->getPaths('tpl_' . $template . '.sys');

		// Only load the template's language file if it hasn't been already
		if (!$loaded)
		{
			$lang->load('tpl_' . $template . '.sys', $path, null, false, false)
			||	$lang->load('tpl_' . $template . '.sys', $path . '/templates/' . $template, null, false, false)
			||	$lang->load('tpl_' . $template . '.sys', $path, $lang->getDefault(), false, false)
			||	$lang->load('tpl_' . $template . '.sys', $path . '/templates/' . $template, $lang->getDefault(), false, false);
		}

		$langKey = strtoupper('TPL_' . $template . '_POSITION_' . $position);
		$text = JText::_($langKey);

		// Avoid untranslated strings
		if (!self::isTranslatedText($langKey, $text))
		{
			// Modules component translation
			$langKey = strtoupper('COM_MODULES_POSITION_' . $position);
			$text = JText::_($langKey);

			// Avoid untranslated strings
			if (!self::isTranslatedText($langKey, $text))
			{
				// Try to humanize the position name
				$text = ucfirst(preg_replace('/^' . $template . '\-/', '', $position));
				$text = ucwords(str_replace(array('-', '_'), ' ', $text));
			}
		}

		return $text;
	}

	/**
	 * Check if the string was translated
	 *
	 * @param   string  $langKey  Language file text key
	 * @param   string  $text     The "translated" text to be checked
	 *
	 * @return  boolean  Return true for translated text
	 *
	 * @since   3.0
	 */
	public static function isTranslatedText($langKey, $text)
	{
		return $text !== $langKey;
	}

	/**
	 * Create and return a new Option
	 *
	 * @param   string  $value  The option value [optional]
	 * @param   string  $text   The option text [optional]
	 *
	 * @return  object  The option as an object (stdClass instance)
	 *
	 * @since   3.0
	 */
	public static function createOption($value = '', $text = '')
	{
		if (empty($text))
		{
			$text = $value;
		}

		$option = new stdClass;
		$option->value = $value;
		$option->text  = $text;

		return $option;
	}

	/**
	 * Create and return a new Option Group
	 *
	 * @param   string  $label    Value and label for group [optional]
	 * @param   array   $options  Array of options to insert into group [optional]
	 *
	 * @return  array  Return the new group as an array
	 *
	 * @since   3.0
	 */
	public static function createOptionGroup($label = '', $options = array())
	{
		$group = array();
		$group['value'] = $label;
		$group['text']  = $label;
		$group['items'] = $options;

		return $group;
	}
}
components/com_modules/helpers/xml.php000060400000002324152453623460014221 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_modules
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

try
{
	JLog::add('ModulesHelperXML is deprecated. Do not use.', JLog::WARNING, 'deprecated');
}
catch (RuntimeException $exception)
{
	// Informational log only
}

/**
 * Helper for parse XML module files
 *
 * @since       1.5
 * @deprecated  3.2  Do not use.
 */
class ModulesHelperXML
{
	/**
	 * Parse the module XML file
	 *
	 * @param   array  &$rows  XML rows
	 *
	 * @return  void
	 *
	 * @since       1.5
	 *
	 * @deprecated  3.2  Do not use.
	 */
	public function parseXMLModuleFile(&$rows)
	{
		foreach ($rows as $i => $row)
		{
			if ($row->module == '')
			{
				$rows[$i]->name    = 'custom';
				$rows[$i]->module  = 'custom';
				$rows[$i]->descrip = 'Custom created module, using Module Manager New function';
			}
			else
			{
				$data = JInstaller::parseXMLInstallFile($row->path . '/' . $row->file);

				if ($data['type'] == 'module')
				{
					$rows[$i]->name    = $data['name'];
					$rows[$i]->descrip = $data['description'];
				}
			}
		}
	}
}
components/com_categories/controllers/categories.php000060400000007617152453623460017141 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * The Categories List Controller
 *
 * @since  1.6
 */
class CategoriesControllerCategories extends JControllerAdmin
{
	/**
	 * Proxy for getModel
	 *
	 * @param   string  $name    The model name. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  The array of possible config values. Optional.
	 *
	 * @return  JModelLegacy  The model.
	 *
	 * @since   1.6
	 */
	public function getModel($name = 'Category', $prefix = 'CategoriesModel', $config = array('ignore_request' => 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()
	{
		$this->checkToken();

		$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()
	{
		$this->checkToken();

		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()
	{
		$this->checkToken();

		// Get items to remove from the request.
		$cid = (array) $this->input->get('cid', array(), 'int');
		$extension = $this->input->getCmd('extension', null);

		// Remove zero values resulting from input filter
		$cid = array_filter($cid);

		if (empty($cid))
		{
			JError::raiseWarning(500, JText::_($this->text_prefix . '_NO_ITEM_SELECTED'));
		}
		else
		{
			// Get the model.
			/** @var CategoriesModelCategory $model */
			$model = $this->getModel();

			// 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;
	}
}
components/com_categories/controllers/ajax.json.php000060400000004615152453623460016702 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Language\LanguageHelper;

/**
 * The categories controller for ajax requests
 *
 * @since  3.9.0
 */
class CategoriesControllerAjax extends JControllerLegacy
{
	/**
	 * Method to fetch associations of a category
	 *
	 * The method assumes that the following http parameters are passed in an Ajax Get request:
	 * token: the form token
	 * assocId: the id of the category whose associations are to be returned
	 * excludeLang: the association for this language is to be excluded
	 *
	 * @return  null
	 *
	 * @since  3.9.0
	 */
	public function fetchAssociations()
	{
		if (!JSession::checkToken('get'))
		{
			echo new JResponseJson(null, JText::_('JINVALID_TOKEN'), true);
		}
		else
		{
			$input     = JFactory::getApplication()->input;
			$extension = $input->get('extension');

			$assocId   = $input->getInt('assocId', 0);

			if ($assocId == 0)
			{
				echo new JResponseJson(null, JText::sprintf('JLIB_FORM_VALIDATE_FIELD_INVALID', 'assocId'), true);

				return;
			}

			$excludeLang = $input->get('excludeLang', '', 'STRING');

			$associations = JLanguageAssociations::getAssociations($extension, '#__categories', 'com_categories.item', (int) $assocId, 'id', 'alias', '');

			unset($associations[$excludeLang]);

			// Add the title to each of the associated records
			JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_categories/tables');
			$categoryTable = JTable::getInstance('Category', 'JTable');

			foreach ($associations as $lang => $association)
			{
				$categoryTable->load($association->id);
				$associations[$lang]->title = $categoryTable->title;
			}

			$countContentLanguages = count(LanguageHelper::getContentLanguages(array(0, 1)));

			if (count($associations) == 0)
			{
				$message = JText::_('JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_NONE');
			}
			elseif ($countContentLanguages > count($associations) + 2)
			{
				$tags    = implode(', ', array_keys($associations));
				$message = JText::sprintf('JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_SOME', $tags);
			}
			else
			{
				$message = JText::_('JGLOBAL_ASSOCIATIONS_PROPAGATE_MESSAGE_ALL');
			}

			echo new JResponseJson($associations, $message);
		}
	}
}
components/com_categories/controllers/category.php000060400000013160152453623460016617 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

/**
 * The Category Controller
 *
 * @since  1.6
 */
class CategoriesControllerCategory extends JControllerForm
{
	/**
	 * The extension for which the categories apply.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $extension;

	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @since  1.6
	 * @see    JControllerLegacy
	 */
	public function __construct($config = array())
	{
		parent::__construct($config);

		// Guess the JText message prefix. Defaults to the option.
		if (empty($this->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;
	}

	/**
	 * Override parent save method to store form data with right key as expected by edit category page
	 *
	 * @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.10.3
	 */
	public function save($key = null, $urlVar = null)
	{
		$result = parent::save($key, $urlVar);

		$oldKey = $this->option . '.edit.category.data';
		$newKey = $this->option . '.edit.category.' . substr($this->extension, 4) . '.data';
		$app    = JFactory::getApplication();
		$app->setUserState($newKey, $app->getUserState($oldKey));

		return $result;
	}

	/**
	 * Override cancel method to clear form data for a failed edit action
	 *
	 * @param   string  $key  The name of the primary key of the URL variable.
	 *
	 * @return  boolean  True if access level checks pass, false otherwise.
	 *
	 * @since   3.10.3
	 */
	public function cancel($key = null)
	{
		$result = parent::cancel($key);

		$newKey = $this->option . '.edit.category.' . substr($this->extension, 4) . '.data';
		JFactory::getApplication()->setUserState($newKey, null);

		return $result;
	}

	/**
	 * 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)
	{
		$this->checkToken();

		// 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;
		}
	}
}
components/com_categories/views/category/tmpl/edit_metadata.php000060400000000507152453623460021150 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

echo JLayoutHelper::render('joomla.edit.metadata', $this);
components/com_categories/views/category/tmpl/edit.php000060400000010212152453623460017302 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');
JHtml::_('formbehavior.chosen', '#jform_tags', null, array('placeholder_text_multiple' => JText::_('JGLOBAL_TYPE_OR_SELECT_SOME_TAGS')));
JHtml::_('formbehavior.chosen', 'select');

$app = JFactory::getApplication();
$input = $app->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' : '';
?>

<form action="<?php echo JRoute::_('index.php?option=com_categories&extension=' . $input->getCmd('extension', 'com_content') . '&layout=' . $layout . $tmpl . '&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="item-form" class="form-validate">

	<?php echo JLayoutHelper::render('joomla.edit.title_alias', $this); ?>

	<div class="form-horizontal">
		<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'general')); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'general', JText::_('JCATEGORY')); ?>
		<div class="row-fluid">
			<div class="span9">
				<?php echo $this->form->getLabel('description'); ?>
				<?php echo $this->form->getInput('description'); ?>
			</div>
			<div class="span3">
				<?php echo JLayoutHelper::render('joomla.edit.global', $this); ?>
			</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php echo JLayoutHelper::render('joomla.edit.params', $this); ?>

		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'publishing', JText::_('COM_CATEGORIES_FIELDSET_PUBLISHING')); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('joomla.edit.publishingdata', $this); ?>
			</div>
			<div class="span6">
				<?php echo JLayoutHelper::render('joomla.edit.metadata', $this); ?>
			</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>

		<?php if ( ! $isModal && $assoc && $extensionassoc) : ?>
			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'associations', JText::_('JGLOBAL_FIELDSET_ASSOCIATIONS')); ?>
			<?php echo $this->loadTemplate('associations'); ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php elseif ($isModal && $assoc && $extensionassoc) : ?>
			<div class="hidden"><?php echo $this->loadTemplate('associations'); ?></div>
		<?php endif; ?>

		<?php if ($this->canDo->get('core.admin')) : ?>
			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'rules', JText::_('COM_CATEGORIES_FIELDSET_RULES')); ?>
			<?php echo $this->form->getInput('rules'); ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php endif; ?>

		<?php echo JHtml::_('bootstrap.endTabSet'); ?>

		<?php echo $this->form->getInput('extension'); ?>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="forcedLanguage" value="<?php echo $input->get('forcedLanguage', '', 'cmd'); ?>" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_categories/views/category/tmpl/edit.xml000060400000001154152453623460017320 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_CATEGORIES_CATEGORY_VIEW_EDIT_TITLE">
		<message>
			<![CDATA[COM_CATEGORIES_CATEGORY_VIEW_EDIT_DESC]]>
		</message>
	</layout>
	<fieldset name="request">
		<fields name="request">
			<field
				name="extension"
				type="componentscategory"
				label="COM_CATEGORIES_CHOOSE_COMPONENT_LABEL"
				description="COM_CATEGORIES_CHOOSE_COMPONENT_DESC"
				required="true"
				>
				<option value="">COM_MENUS_OPTION_SELECT_COMPONENT</option>
			</field>
			<field
				name="id"
				type="hidden"
				default="0"
			/>
		</fields>
	</fieldset>
</metadata>
components/com_categories/views/category/tmpl/modal_metadata.php000060400000000507152453623460021317 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

echo JLayoutHelper::render('joomla.edit.metadata', $this);
components/com_categories/views/category/tmpl/modal.php000060400000002551152453623460017460 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip', '.hasTooltip', array('placement' => '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);
		}
	}
');
?>
<button id="applyBtn" type="button" class="hidden" onclick="Joomla.submitbutton('category.apply'); jEditCategoryModal();"></button>
<button id="saveBtn" type="button" class="hidden" onclick="Joomla.submitbutton('category.save'); jEditCategoryModal();"></button>
<button id="closeBtn" type="button" class="hidden" onclick="Joomla.submitbutton('category.cancel');"></button>

<div class="container-popup">
	<?php $this->setLayout('edit'); ?>
	<?php echo $this->loadTemplate(); ?>
</div>
components/com_categories/views/category/tmpl/modal_extrafields.php000060400000000413152453623460022045 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
components/com_categories/views/category/tmpl/modal_associations.php000060400000000513152453623460022233 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

echo JLayoutHelper::render('joomla.edit.associations', $this);
components/com_categories/views/category/tmpl/edit_associations.php000060400000000513152453623460022064 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

echo JLayoutHelper::render('joomla.edit.associations', $this);
components/com_categories/views/category/tmpl/modal_options.php000060400000002732152453623460021234 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

echo JHtml::_('bootstrap.startAccordion', 'categoryOptions', array('active' => 'collapse0'));
$fieldSets = $this->form->getFieldsets('params');
$i = 0;
?>
<?php foreach ($fieldSets as $name => $fieldSet) : ?>
	<?php
	$label = !empty($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 '<p class="tip">' . $this->escape(JText::_($fieldSet->description)) . '</p>';
	}
	?>
	<?php foreach ($this->form->getFieldset($name) as $field) : ?>
		<div class="control-group">
			<div class="control-label">
				<?php echo $field->label; ?>
			</div>
			<div class="controls">
				<?php echo $field->input; ?>
			</div>
		</div>
	<?php endforeach; ?>

	<?php if ($name == 'basic') : ?>
		<div class="control-group">
			<div class="control-label">
				<?php echo $this->form->getLabel('note'); ?>
			</div>
			<div class="controls">
				<?php echo $this->form->getInput('note'); ?>
			</div>
		</div>
	<?php endif; ?>
	<?php echo JHtml::_('bootstrap.endSlide'); ?>
<?php endforeach; ?>
<?php echo JHtml::_('bootstrap.endAccordion'); ?>
components/com_categories/views/category/view.html.php000060400000017026152453623460017330 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * HTML View class for the Categories component
 *
 * @since  1.6
 */
class CategoriesViewCategory extends JViewLegacy
{
	/**
	 * The JForm object
	 *
	 * @var  JForm
	 */
	protected $form;

	/**
	 * The active item
	 *
	 * @var  object
	 */
	protected $item;

	/**
	 * The model state
	 *
	 * @var  object
	 */
	protected $state;

	/**
	 * Flag if an association exists
	 *
	 * @var  boolean
	 */
	protected $assoc;

	/**
	 * The actions the user is authorised to perform
	 *
	 * @var  JObject
	 */
	protected $canDo;

	/**
	 * Display the view.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		$this->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);
			}

			if (JLanguageAssociations::isEnabled() && JComponentHelper::isEnabled('com_associations'))
			{
				JToolbarHelper::custom('category.editAssociations', 'contract', 'contract', 'JTOOLBAR_ASSOCIATIONS', false, false);
			}

			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);
	}
}
components/com_categories/views/categories/tmpl/default.xml000060400000001065152453623460020330 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_CATEGORIES_CATEGORIES_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_CATEGORIES_CATEGORIES_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
	<fieldset name="request">
		<fields name="request">
			<field
				name="extension"
				type="componentscategory"
				label="COM_CATEGORIES_CHOOSE_COMPONENT_LABEL"
				description="COM_CATEGORIES_CHOOSE_COMPONENT_DESC"
				required="true"
			>
				<option value="">COM_MENUS_OPTION_SELECT_COMPONENT</option>
			</field>
		</fields>
	</fieldset>
</metadata>
components/com_categories/views/categories/tmpl/default.php000060400000032073152453623460020322 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\String\Inflector;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$app       = JFactory::getApplication();
$user      = JFactory::getUser();
$userId    = $user->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);
}
?>
<form action="<?php echo JRoute::_('index.php?option=com_categories&view=categories'); ?>" method="post" name="adminForm" id="adminForm">
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
		<?php
		// Search tools bar
		echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this));
		?>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped" id="categoryList">
				<thead>
					<tr>
						<th width="1%" class="nowrap center hidden-phone">
							<?php echo JHtml::_('searchtools.sort', '', 'a.lft', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING', 'icon-menu-2'); ?>
						</th>
						<th width="1%" class="center">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.published', $listDirn, $listOrder); ?>
						</th>
						<th class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
						</th>
						<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_published')) :
							$columns++; ?>
							<th width="1%" class="nowrap center hidden-phone hidden-tablet">
								<span class="icon-publish hasTooltip" aria-hidden="true" title="<?php echo JText::_('COM_CATEGORY_COUNT_PUBLISHED_ITEMS'); ?>"><span class="element-invisible"><?php echo JText::_('COM_CATEGORY_COUNT_PUBLISHED_ITEMS'); ?></span></span>
							</th>
						<?php endif; ?>
						<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_unpublished')) :
							$columns++; ?>
							<th width="1%" class="nowrap center hidden-phone hidden-tablet">
								<span class="icon-unpublish hasTooltip" aria-hidden="true" title="<?php echo JText::_('COM_CATEGORY_COUNT_UNPUBLISHED_ITEMS'); ?>"><span class="element-invisible"><?php echo JText::_('COM_CATEGORY_COUNT_UNPUBLISHED_ITEMS'); ?></span></span>
							</th>
						<?php endif; ?>
						<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_archived')) :
							$columns++; ?>
							<th width="1%" class="nowrap center hidden-phone hidden-tablet">
								<span class="icon-archive hasTooltip" aria-hidden="true" title="<?php echo JText::_('COM_CATEGORY_COUNT_ARCHIVED_ITEMS'); ?>"><span class="element-invisible"><?php echo JText::_('COM_CATEGORY_COUNT_ARCHIVED_ITEMS'); ?></span></span>
							</th>
						<?php endif; ?>
						<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_trashed')) :
							$columns++; ?>
							<th width="1%" class="nowrap center hidden-phone hidden-tablet">
								<span class="icon-trash hasTooltip" aria-hidden="true" title="<?php echo JText::_('COM_CATEGORY_COUNT_TRASHED_ITEMS'); ?>"><span class="element-invisible"><?php echo JText::_('COM_CATEGORY_COUNT_TRASHED_ITEMS'); ?></span></span>
							</th>
						<?php endif; ?>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ACCESS', 'access_level', $listDirn, $listOrder); ?>
						</th>
						<?php if ($this->assoc) :
							$columns++; ?>
							<th width="5%" class="nowrap hidden-phone hidden-tablet">
								<?php echo JHtml::_('searchtools.sort', 'COM_CATEGORY_HEADING_ASSOCIATION', 'association', $listDirn, $listOrder); ?>
							</th>
						<?php endif; ?>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'language_title', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="<?php echo $columns; ?>">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
					<?php foreach ($this->items as $i => $item) : ?>
						<?php
						$canEdit    = $user->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 = '';
						}
						?>
						<tr class="row<?php echo $i % 2; ?>" sortable-group-id="<?php echo $item->parent_id; ?>" item-id="<?php echo $item->id ?>" parents="<?php echo $parentsStr ?>" level="<?php echo $item->level ?>">
							<td class="order nowrap center hidden-phone">
								<?php
								$iconClass = '';
								if (!$canChange)
								{
									$iconClass = ' inactive';
								}
								elseif (!$saveOrder)
								{
									$iconClass = ' inactive tip-top hasTooltip" title="' . JHtml::_('tooltipText', 'JORDERINGDISABLED');
								}
								?>
								<span class="sortable-handler<?php echo $iconClass ?>">
									<span class="icon-menu"></span>
								</span>
								<?php if ($canChange && $saveOrder) : ?>
									<input type="text" style="display:none" name="order[]" size="5" value="<?php echo $item->lft; ?>" />
								<?php endif; ?>
							</td>
							<td class="center">
								<?php echo JHtml::_('grid.id', $i, $item->id); ?>
							</td>
							<td class="center">
								<div class="btn-group">
									<?php echo JHtml::_('jgrid.published', $item->published, $i, 'categories.', $canChange); ?>
									<?php
									if ($canChange)
									{
										// Create dropdown items
										JHtml::_('actionsdropdown.' . ((int) $item->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));
									}
									?>
								</div>
							</td>
							<td>
								<?php echo JLayoutHelper::render('joomla.html.treeprefix', array('level' => $item->level)); ?>
								<?php if ($item->checked_out) : ?>
									<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'categories.', $canCheckin); ?>
								<?php endif; ?>
								<?php if ($canEdit || $canEditOwn) : ?>
									<a class="hasTooltip" href="<?php echo JRoute::_('index.php?option=com_categories&task=category.edit&id=' . $item->id . '&extension=' . $extension); ?>" title="<?php echo JText::_('JACTION_EDIT'); ?>">
										<?php echo $this->escape($item->title); ?></a>
								<?php else : ?>
									<?php echo $this->escape($item->title); ?>
								<?php endif; ?>
								<span class="small" title="<?php echo $this->escape($item->path); ?>">
									<?php if (empty($item->note)) : ?>
										<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias)); ?>
									<?php else : ?>
										<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS_NOTE', $this->escape($item->alias), $this->escape($item->note)); ?>
									<?php endif; ?>
								</span>
							</td>
							<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_published')) : ?>
								<td class="center btns hidden-phone hidden-tablet">
									<a class="badge <?php if ($item->count_published > 0) echo 'badge-success'; ?>" title="<?php echo JText::_('COM_CATEGORY_COUNT_PUBLISHED_ITEMS'); ?>" href="<?php echo JRoute::_('index.php?option=' . $component . ($section ? '&view=' . $section : '') . '&filter[category_id]=' . (int) $item->id . '&filter[published]=1' . '&filter[level]=1'); ?>">
										<?php echo $item->count_published; ?></a>
								</td>
							<?php endif; ?>
							<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_unpublished')) : ?>
								<td class="center btns hidden-phone hidden-tablet">
									<a class="badge <?php if ($item->count_unpublished > 0) echo 'badge-important'; ?>" title="<?php echo JText::_('COM_CATEGORY_COUNT_UNPUBLISHED_ITEMS'); ?>" href="<?php echo JRoute::_('index.php?option=' . $component . ($section ? '&view=' . $section : '') . '&filter[category_id]=' . (int) $item->id . '&filter[published]=0' . '&filter[level]=1'); ?>">
										<?php echo $item->count_unpublished; ?></a>
								</td>
							<?php endif; ?>
							<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_archived')) : ?>
								<td class="center btns hidden-phone hidden-tablet">
									<a class="badge <?php if ($item->count_archived > 0) echo 'badge-info'; ?>" title="<?php echo JText::_('COM_CATEGORY_COUNT_ARCHIVED_ITEMS'); ?>" href="<?php echo JRoute::_('index.php?option=' . $component . ($section ? '&view=' . $section : '') . '&filter[category_id]=' . (int) $item->id . '&filter[published]=2' . '&filter[level]=1'); ?>">
										<?php echo $item->count_archived; ?></a>
								</td>
							<?php endif; ?>
							<?php if (isset($this->items[0]) && property_exists($this->items[0], 'count_trashed')) : ?>
								<td class="center btns hidden-phone hidden-tablet">
									<a class="badge <?php if ($item->count_trashed > 0) echo 'badge-inverse'; ?>" title="<?php echo JText::_('COM_CATEGORY_COUNT_TRASHED_ITEMS'); ?>" href="<?php echo JRoute::_('index.php?option=' . $component . ($section ? '&view=' . $section : '') . '&filter[category_id]=' . (int) $item->id . '&filter[published]=-2' . '&filter[level]=1'); ?>">
										<?php echo $item->count_trashed; ?></a>
								</td>
							<?php endif; ?>

							<td class="small hidden-phone">
								<?php echo $this->escape($item->access_level); ?>
							</td>
							<?php if ($this->assoc) : ?>
								<td class="hidden-phone hidden-tablet">
									<?php if ($item->association) : ?>
										<?php echo JHtml::_('CategoriesAdministrator.association', $item->id, $extension); ?>
									<?php endif; ?>
								</td>
							<?php endif; ?>
							<td class="small nowrap hidden-phone">
								<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
							</td>
							<td class="hidden-phone">
								<span title="<?php echo sprintf('%d-%d', $item->lft, $item->rgt); ?>">
									<?php echo (int) $item->id; ?></span>
							</td>
						</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
			<?php // Load the batch processing form. ?>
			<?php if ($user->authorise('core.create', $extension)
				&& $user->authorise('core.edit', $extension)
				&& $user->authorise('core.edit.state', $extension)) : ?>
				<?php echo JHtml::_(
					'bootstrap.renderModal',
					'collapseModal',
					array(
						'title'  => JText::_('COM_CATEGORIES_BATCH_OPTIONS'),
						'footer' => $this->loadTemplate('batch_footer'),
					),
					$this->loadTemplate('batch_body')
				); ?>
			<?php endif; ?>
		<?php endif; ?>

		<input type="hidden" name="extension" value="<?php echo $extension; ?>" />
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_categories/views/categories/tmpl/modal.php000060400000012643152453623460017773 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$app = JFactory::getApplication();

if ($app->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'));
?>
<div class="container-popup">

	<form action="<?php echo JRoute::_('index.php?option=com_categories&view=categories&layout=modal&tmpl=component&function=' . $function . '&' . JSession::getFormToken() . '=1'); ?>" method="post" name="adminForm" id="adminForm">

		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>

		<div class="clearfix"></div>

		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped" id="categoryList">
				<thead>
					<tr>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.published', $listDirn, $listOrder); ?>
						</th>
						<th class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ACCESS', 'access_level', $listDirn, $listOrder); ?>
						</th>
						<th width="15%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'language_title', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="5">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
					<?php
					$iconStates = array(
						-2 => 'icon-trash',
						0  => 'icon-unpublish',
						1  => 'icon-publish',
						2  => 'icon-archive',
					);
					?>
					<?php foreach ($this->items as $i => $item) : ?>
						<?php if ($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 = '';
						}
						?>
						<tr class="row<?php echo $i % 2; ?>">
							<td class="center">
								<span class="<?php echo $iconStates[$this->escape($item->published)]; ?>" aria-hidden="true"></span>
							</td>
							<td>
								<?php echo JLayoutHelper::render('joomla.html.treeprefix', array('level' => $item->level)); ?>
								<a href="javascript:void(0)" onclick="if (window.parent) window.parent.<?php echo $this->escape($function); ?>('<?php echo $item->id; ?>', '<?php echo $this->escape(addslashes($item->title)); ?>', null, '<?php echo $this->escape(ContentHelperRoute::getCategoryRoute($item->id, $item->language)); ?>', '<?php echo $this->escape($lang); ?>', null);">
									<?php echo $this->escape($item->title); ?></a>
								<span class="small" title="<?php echo $this->escape($item->path); ?>">
									<?php if (empty($item->note)) : ?>
										<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS', $this->escape($item->alias)); ?>
									<?php else : ?>
										<?php echo JText::sprintf('JGLOBAL_LIST_ALIAS_NOTE', $this->escape($item->alias), $this->escape($item->note)); ?>
									<?php endif; ?>
								</span>
							</td>
							<td class="small hidden-phone">
								<?php echo $this->escape($item->access_level); ?>
							</td>
							<td class="small hidden-phone">
								<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
							</td>
							<td class="hidden-phone">
								<?php echo (int) $item->id; ?>
							</td>
						</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif; ?>

		<input type="hidden" name="extension" value="<?php echo $extension; ?>" />
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<input type="hidden" name="forcedLanguage" value="<?php echo $app->input->get('forcedLanguage', '', 'CMD'); ?>" />
		<?php echo JHtml::_('form.token'); ?>

	</form>
</div>
components/com_categories/views/categories/tmpl/default_batch_footer.php000060400000001304152453623460023032 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

?>
<button type="button" class="btn" onclick="document.getElementById('batch-category-id').value='';document.getElementById('batch-access').value='';document.getElementById('batch-language-id').value=''" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<button type="submit" class="btn btn-success" onclick="Joomla.submitbutton('category.batch');return false;">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>
components/com_categories/views/categories/tmpl/default_batch_body.php000060400000004561152453623460022501 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

$options = array(
	JHtml::_('select.option', 'c', JText::_('JLIB_HTML_BATCH_COPY')),
	JHtml::_('select.option', 'm', JText::_('JLIB_HTML_BATCH_MOVE'))
);
$published = (int) $this->state->get('filter.published');
$extension = $this->escape($this->state->get('filter.extension'));
?>

<div class="container-fluid">
	<div class="row-fluid">
		<div class="control-group span6">
			<div class="controls">
				<?php echo JHtml::_('batch.language'); ?>
			</div>
		</div>
		<div class="control-group span6">
			<div class="controls">
				<?php echo JHtml::_('batch.access'); ?>
			</div>
		</div>
	</div>
	<div class="row-fluid">
		<?php if ($published >= 0) : ?>
			<div class="span6">
				<div class="control-group">
					<label id="batch-choose-action-lbl" for="batch-category-id" class="control-label">
						<?php echo JText::_('JLIB_HTML_BATCH_MENU_LABEL'); ?>
					</label>
					<div id="batch-choose-action" class="combo controls">
						<select name="batch[category_id]" id="batch-category-id">
							<option value=""><?php echo JText::_('JLIB_HTML_BATCH_NO_CATEGORY') ?></option>
							<?php echo JHtml::_('select.options', JHtml::_('category.categories', $extension, array('filter.published' => $this->state->get('filter.published')))); ?>
						</select>
					</div>
				</div>
				<div id="batch-copy-move" class="control-group radio">
					<?php echo JText::_('JLIB_HTML_BATCH_MOVE_QUESTION'); ?>
					<?php echo JHtml::_('select.radiolist', $options, 'batch[move_copy]', '', 'value', 'text', 'm'); ?>
				</div>
			</div>
		<?php endif; ?>
		<div class="control-group span6">
			<div class="controls">
				<?php echo JHtml::_('batch.tag'); ?>
			</div>
		</div>
	</div>
	<?php if ($extension === 'com_content') : ?>
		<div class="row-fluid">
			<div class="span6">
				<div class="control-group">
					<label id="flip-ordering-id-lbl" for="flip-ordering-id" class="control-label">
						<?php echo JText::_('JLIB_HTML_BATCH_FLIPORDERING_LABEL'); ?>
					</label>
					<?php echo JHtml::_('select.booleanlist', 'batch[flip_ordering]', array(), 0, 'JYES', 'JNO', 'flip-ordering-id'); ?>
				</div>
			</div>
		</div>
	<?php endif; ?>
</div>

components/com_categories/views/categories/view.html.php000060400000020311152453623460017627 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Categories view class for the Category package.
 *
 * @since  1.6
 */
class CategoriesViewCategories extends JViewLegacy
{
	/**
	 * An array of items
	 *
	 * @var  array
	 */
	protected $items;

	/**
	 * The pagination object
	 *
	 * @var  JPagination
	 */
	protected $pagination;

	/**
	 * The model state
	 *
	 * @var  object
	 */
	protected $state;

	/**
	 * Flag if an association exists
	 *
	 * @var  boolean
	 */
	protected $assoc;

	/**
	 * Form object for search filters
	 *
	 * @var  JForm
	 */
	public $filterForm;

	/**
	 * The active search filters
	 *
	 * @var  array
	 */
	public $activeFilters;

	/**
	 * The sidebar markup
	 *
	 * @var  string
	 */
	protected $string;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 */
	public function display($tpl = null)
	{
		$this->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('<field name="language" type="hidden" default="' . $forcedLanguage . '" />');
				$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'),
		);
	}
}
components/com_categories/models/category.php000060400000104040152453623460015532 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Categories Component Category Model
 *
 * @since  1.6
 */
class CategoriesModelCategory extends JModelAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_CATEGORIES';

	/**
	 * The type alias for this content type. Used for content version history.
	 *
	 * @var      string
	 * @since    3.2
	 */
	public $typeAlias = null;

	/**
	 * The context used for the associations table
	 *
	 * @var      string
	 * @since    3.4.4
	 */
	protected $associationsContext = 'com_categories.item';

	/**
	 * Does an association exist? Caches the result of getAssoc().
	 *
	 * @var   boolean|null
	 * @since 3.10.4
	 */
	private $hasAssociation;

	/**
	 * Override parent constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JModelLegacy
	 * @since   3.2
	 */
	public function __construct($config = array())
	{
		parent::__construct($config);
		$extension = JFactory::getApplication()->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();

			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 validate the form data.
	 *
	 * @param   JForm   $form   The form to validate against.
	 * @param   array   $data   The data to validate.
	 * @param   string  $group  The name of the field group to validate.
	 *
	 * @return  array|boolean  Array of filtered data if valid, false otherwise.
	 *
	 * @see     JFormRule
	 * @see     JFilterInput
	 * @since   3.9.23
	 */
	public function validate($form, $data, $group = null)
	{
		// Don't allow to change the users if not allowed to access com_users.
		if (!JFactory::getUser()->authorise('core.manage', 'com_users'))
		{
			if (isset($data['created_user_id']))
			{
				unset($data['created_user_id']);
			}
		}

		if (!JFactory::getUser()->authorise('core.admin', $data['extension']))
		{
			if (isset($data['rules']))
			{
				unset($data['rules']);
			}
		}

		return parent::validate($form, $data, $group);
	}

	/**
	 * 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('<form />');
				$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');
					$field->addAttribute('propagate', '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);

		if (Factory::getApplication()->input->get('task') == 'editAssociations')
		{
			return $this->redirectToAssociations($data);
		}

		// 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  $lftArray  The lft value
	 *
	 * @return  boolean  False on failure or error, True otherwise
	 *
	 * @since   1.6
	 */
	public function saveorder($idArray = null, $lftArray = null)
	{
		// Get an instance of the table object.
		$table = $this->getTable();

		if (!$table->saveorder($idArray, $lftArray))
		{
			$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, Parent ID and Asset ID
			$oldId       = $this->table->id;
			$oldParentId = $this->table->parent_id;
			$oldAssetId  = $this->table->asset_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;

			// Copy rules
			$query->clear()
				->update($db->quoteName('#__assets', 't'))
				->join('INNER', $db->quoteName('#__assets', 's') .
					' ON ' . $db->quoteName('s.id') . ' = ' . $oldAssetId
				)
				->set($db->quoteName('t.rules') . ' = ' . $db->quoteName('s.rules'))
				->where($db->quoteName('t.id') . ' = ' . $this->table->asset_id);
			$db->setQuery($query)->execute();

			// 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  $clientId  Application client id.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function cleanCache($group = null, $clientId = 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  $parentId  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($parentId, $alias, $title)
	{
		// Alter the title & alias
		$table = $this->getTable();

		while ($table->load(array('alias' => $alias, 'parent_id' => $parentId)))
		{
			$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()
	{
		if (!is_null($this->hasAssociation))
		{
			return $this->hasAssociation;
		}

		$extension = $this->getState('category.extension');

		$this->hasAssociation = JLanguageAssociations::isEnabled();
		$extension = explode('.', $extension);
		$component = array_shift($extension);
		$cname = str_replace('com_', '', $component);

		if (!$this->hasAssociation || !$component || !$cname)
		{
			$this->hasAssociation = false;
		}
		else
		{
			$hname = $cname . 'HelperAssociation';
			JLoader::register($hname, JPATH_SITE . '/components/' . $component . '/helpers/association.php');

			$this->hasAssociation = class_exists($hname) && !empty($hname::$category_association);
		}

		return $this->hasAssociation;
	}
}
components/com_categories/models/categories.php000060400000025240152453623460016046 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Categories Component Categories Model
 *
 * @since  1.6
 */
class CategoriesModelCategories extends JModelList
{
	/**
	 * Does an association exist? Caches the result of getAssoc().
	 *
	 * @var   boolean|null
	 * @since 3.10.4
	 */
	private $hasAssociation;

	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JControllerLegacy
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'title', 'a.title',
				'alias', 'a.alias',
				'published', 'a.published',
				'access', 'a.access', 'access_level',
				'language', 'a.language', 'language_title',
				'checked_out', 'a.checked_out',
				'checked_out_time', 'a.checked_out_time',
				'created_time', 'a.created_time',
				'created_user_id', 'a.created_user_id',
				'lft', 'a.lft',
				'rgt', 'a.rgt',
				'level', 'a.level',
				'path', 'a.path',
				'tag',
			);
		}

		if (JLanguageAssociations::isEnabled())
		{
			$config['filter_fields'][] = 'association';
		}

		parent::__construct($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.lft', $direction = 'asc')
	{
		$app = JFactory::getApplication();

		$forcedLanguage = $app->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.
		$this->hasAssociation = $this->getAssoc();

		if ($this->hasAssociation)
		{
			$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()
	{
		if (!is_null($this->hasAssociation))
		{
			return $this->hasAssociation;
		}

		$extension = $this->getState('filter.extension');

		$this->hasAssociation = JLanguageAssociations::isEnabled();
		$extension = explode('.', $extension);
		$component = array_shift($extension);
		$cname = str_replace('com_', '', $component);

		if (!$this->hasAssociation || !$component || !$cname)
		{
			$this->hasAssociation = false;
		}
		else
		{
			$hname = $cname . 'HelperAssociation';
			JLoader::register($hname, JPATH_SITE . '/components/' . $component . '/helpers/association.php');

			$this->hasAssociation = class_exists($hname) && !empty($hname::$category_association);
		}

		return $this->hasAssociation;
	}

	/**
	 * Method to get an array of data items.
	 *
	 * @return  mixed  An array of data items on success, false on failure.
	 *
	 * @since   3.0.1
	 */
	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);
			}
		}
	}
}
components/com_categories/models/fields/modal/category.php000060400000023564152453623460020107 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Language\LanguageHelper;

/**
 * Supports a modal category picker.
 *
 * @since  3.1
 */
class JFormFieldModal_Category extends JFormField
{
	/**
	 * The form field type.
	 *
	 * @var     string
	 * @since   1.6
	 */
	protected $type = 'Modal_Category';

	/**
	 * Method to get the field input markup.
	 *
	 * @return  string  The field input markup.
	 *
	 * @since   1.6
	 */
	protected function getInput()
	{
		if ($this->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');
		$allowPropagate = ((string) $this->element['propagate'] == 'true');

		$languages = LanguageHelper::getContentLanguages(array(0, 1));

		// 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);
				}
				");

				JText::script('JGLOBAL_ASSOCIATIONS_PROPAGATE_FAILED');

				$scriptSelect[$this->id] = true;
			}
		}

		// Setup variables for display.
		$linkCategories = 'index.php?option=com_categories&amp;view=categories&amp;layout=modal&amp;tmpl=component&amp;' . JSession::getFormToken() . '=1'
			. '&amp;extension=' . $extension;
		$linkCategory  = 'index.php?option=com_categories&amp;view=category&amp;layout=modal&amp;tmpl=component&amp;' . JSession::getFormToken() . '=1'
			. '&amp;extension=' . $extension;
		$modalTitle    = JText::_('COM_CATEGORIES_CHANGE_CATEGORY');

		if (isset($this->element['language']))
		{
			$linkCategories .= '&amp;forcedLanguage=' . $this->element['language'];
			$linkCategory   .= '&amp;forcedLanguage=' . $this->element['language'];
			$modalTitle     .= ' &#8212; ' . $this->element['label'];
		}

		$urlSelect = $linkCategories . '&amp;function=jSelectCategory_' . $this->id;
		$urlEdit   = $linkCategory . '&amp;task=category.edit&amp;id=\' + document.getElementById("' . $this->id . '_id").value + \'';
		$urlNew    = $linkCategory . '&amp;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  = '<span class="input-append">';
		$html .= '<input class="input-medium" id="' . $this->id . '_name" type="text" value="' . $title . '" disabled="disabled" size="35" />';

		// Select category button.
		if ($allowSelect)
		{
			$html .= '<button'
				. ' type="button"'
				. ' class="btn hasTooltip' . ($value ? ' hidden' : '') . '"'
				. ' id="' . $this->id . '_select"'
				. ' data-toggle="modal"'
				. ' data-target="#ModalSelect' . $modalId . '"'
				. ' title="' . JHtml::tooltipText('COM_CATEGORIES_CHANGE_CATEGORY') . '">'
				. '<span class="icon-file" aria-hidden="true"></span> ' . JText::_('JSELECT')
				. '</button>';
		}

		// New category button.
		if ($allowNew)
		{
			$html .= '<button'
				. ' type="button"'
				. ' class="btn hasTooltip' . ($value ? ' hidden' : '') . '"'
				. ' id="' . $this->id . '_new"'
				. ' data-toggle="modal"'
				. ' data-target="#ModalNew' . $modalId . '"'
				. ' title="' . JHtml::tooltipText('COM_CATEGORIES_NEW_CATEGORY') . '">'
				. '<span class="icon-new" aria-hidden="true"></span> ' . JText::_('JACTION_CREATE')
				. '</button>';
		}

		// Edit category button.
		if ($allowEdit)
		{
			$html .= '<button'
				. ' type="button"'
				. ' class="btn hasTooltip' . ($value ? '' : ' hidden') . '"'
				. ' id="' . $this->id . '_edit"'
				. ' data-toggle="modal"'
				. ' data-target="#ModalEdit' . $modalId . '"'
				. ' title="' . JHtml::tooltipText('COM_CATEGORIES_EDIT_CATEGORY') . '">'
				. '<span class="icon-edit" aria-hidden="true"></span> ' . JText::_('JACTION_EDIT')
				. '</button>';
		}

		// Clear category button.
		if ($allowClear)
		{
			$html .= '<button'
				. ' type="button"'
				. ' class="btn' . ($value ? '' : ' hidden') . '"'
				. ' id="' . $this->id . '_clear"'
				. ' onclick="window.processModalParent(\'' . $this->id . '\'); return false;">'
				. '<span class="icon-remove" aria-hidden="true"></span>' . JText::_('JCLEAR')
				. '</button>';
		}

		// Propagate category button
		if ($allowPropagate && count($languages) > 2)
		{
			// Strip off language tag at the end
			$tagLength = (int) strlen($this->element['language']);
			$callbackFunctionStem = substr("jSelectCategory_" . $this->id, 0, -$tagLength);

			$html .= '<a'
			. ' class="btn hasTooltip' . ($value ? '' : ' hidden') . '"'
			. ' id="' . $this->id . '_propagate"'
			. ' href="#"'
			. ' title="' . JHtml::tooltipText('JGLOBAL_ASSOCIATIONS_PROPAGATE_TIP') . '"'
			. ' onclick="Joomla.propagateAssociation(\'' . $this->id . '\', \'' . $callbackFunctionStem . '\');">'
			. '<span class="icon-refresh" aria-hidden="true"></span>' . JText::_('JGLOBAL_ASSOCIATIONS_PROPAGATE_BUTTON')
			. '</a>';
		}

		$html .= '</span>';

		// 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'      => '<button type="button" class="btn" data-dismiss="modal">' . JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>',
				)
			);
		}

		// 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'      => '<button type="button" class="btn"'
							. ' onclick="window.processModalEdit(this, \'' . $this->id . '\', \'add\', \'category\', \'cancel\', \'item-form\'); return false;">'
							. JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>'
							. '<button type="button" class="btn btn-primary"'
							. ' onclick="window.processModalEdit(this, \'' . $this->id . '\', \'add\', \'category\', \'save\', \'item-form\'); return false;">'
							. JText::_('JSAVE') . '</button>'
							. '<button type="button" class="btn btn-success"'
							. ' onclick="window.processModalEdit(this, \'' . $this->id . '\', \'add\', \'category\', \'apply\', \'item-form\'); return false;">'
							. JText::_('JAPPLY') . '</button>',
				)
			);
		}

		// 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'      => '<button type="button" class="btn"'
							. ' onclick="window.processModalEdit(this, \'' . $this->id . '\', \'edit\', \'category\', \'cancel\', \'item-form\'); return false;">'
							. JText::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>'
							. '<button type="button" class="btn btn-primary"'
							. ' onclick="window.processModalEdit(this, \'' . $this->id . '\', \'edit\', \'category\', \'save\', \'item-form\'); return false;">'
							. JText::_('JSAVE') . '</button>'
							. '<button type="button" class="btn btn-success"'
							. ' onclick="window.processModalEdit(this, \'' . $this->id . '\', \'edit\', \'category\', \'apply\', \'item-form\'); return false;">'
							. JText::_('JAPPLY') . '</button>',
				)
			);
		}

		// Note: class='required' for client side validation
		$class = $this->required ? ' class="required modal-value"' : '';

		$html .= '<input type="hidden" id="' . $this->id . '_id"' . $class . ' data-required="' . (int) $this->required . '" name="' . $this->name
			. '" data-text="' . htmlspecialchars(JText::_('COM_CATEGORIES_SELECT_A_CATEGORY', true), ENT_COMPAT, 'UTF-8') . '" value="' . $value . '" />';

		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());
	}
}
components/com_categories/models/fields/categoryparent.php000060400000012155152453623460020217 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JFormHelper::loadFieldClass('list');

/**
 * Category Parent field.
 *
 * @since       1.6
 * @deprecated  4.0  Use categoryedit instead.
 */
class JFormFieldCategoryParent extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $type = 'CategoryParent';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   1.6
	 */
	protected function getOptions()
	{
		// Initialise variables.
		$options = array();
		$name = (string) $this->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);
	}
}
components/com_categories/models/fields/categoryedit.php000060400000031524152453623460017654 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

JFormHelper::loadFieldClass('list');

/**
 * Category Edit field..
 *
 * @since  1.6
 */
class JFormFieldCategoryEdit extends JFormFieldList
{
	/**
	 * To allow creation of new categories.
	 *
	 * @var    integer
	 * @since  3.6
	 */
	protected $allowAdd;

	/**
	 * Optional prefix for new categories.
	 *
	 * @var    string
	 * @since  3.9.11
	 */
	protected $customPrefix;

	/**
	 * A flexible category list that respects access controls
	 *
	 * @var    string
	 * @since  1.6
	 */
	public $type = 'CategoryEdit';

	/**
	 * Method to attach a JForm object to the field.
	 *
	 * @param   SimpleXMLElement  $element  The SimpleXMLElement object representing the <field /> 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'] : '';
			$this->customPrefix = (string) $this->element['customPrefix'];
		}

		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':
			case 'customPrefix':
				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;
			case 'customPrefix':
				$this->$name = (string) $value;
				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 ($this->customPrefix !== '')
			{
				$attr .= 'data-custom_value_prefix="' . $this->customPrefix . '" ';
			}
		}

		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[] = '<input type="hidden" name="' . $this->name . '" value="' . htmlspecialchars($value, ENT_COMPAT, 'UTF-8') . '"/>';
				}
			}
			else
			{
				$html[] = '<input type="hidden" name="' . $this->name . '" value="' . htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8') . '"/>';
			}
		}
		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);
	}
}
components/com_categories/models/forms/category.xml000060400000012522152453623460016674 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>

	<field
		name="id"
		type="number"
		label="JGLOBAL_FIELD_ID_LABEL"
		description="JGLOBAL_FIELD_ID_DESC"
		default="0"
		class="readonly"
		readonly="true"
	/>

	<field
		name="hits"
		type="number"
		label="JGLOBAL_HITS"
		description="COM_CATEGORIES_FIELD_HITS_DESC"
		default="0"
		class="readonly"
		readonly="true"
		filter="unset"
	/>

	<field
		name="asset_id"
		type="hidden"
		filter="unset"
		label="JFIELD_ASSET_ID_LABEL"
		description="JFIELD_ASSET_ID_DESC"
	/>

	<field
		name="parent_id"
		type="categoryedit"
		label="COM_CATEGORIES_FIELD_PARENT_LABEL"
		description="COM_CATEGORIES_FIELD_PARENT_DESC"
	/>

	<field
		name="lft"
		type="hidden"
		filter="unset"
	/>

	<field
		name="rgt"
		type="hidden"
		filter="unset"
	/>

	<field
		name="level"
		type="hidden"
		filter="unset"
	/>

	<field
		name="path"
		type="text"
		label="COM_CATEGORIES_PATH_LABEL"
		description="COM_CATEGORIES_PATH_DESC"
		class="readonly"
		size="40"
		readonly="true"
	/>

	<field
		name="extension"
		type="hidden"
	/>

	<field
		name="title"
		type="text"
		label="JGLOBAL_TITLE"
		description="JFIELD_TITLE_DESC"
		class="input-xxlarge input-large-text"
		size="40"
		required="true"
	/>

	<field
		name="alias"
		type="text"
		label="JFIELD_ALIAS_LABEL"
		description="JFIELD_ALIAS_DESC"
		size="45"
		hint="JFIELD_ALIAS_PLACEHOLDER"
	/>

	<field
		name="version_note"
		type="text"
		label="JGLOBAL_FIELD_VERSION_NOTE_LABEL"
		description="JGLOBAL_FIELD_VERSION_NOTE_DESC"
		class="span12"
		size="45"
		maxlength="255"
	/>

	<field
		name="note"
		type="text"
		label="COM_CATEGORIES_FIELD_NOTE_LABEL"
		description="COM_CATEGORIES_FIELD_NOTE_DESC"
		class="span12"
		size="40"
		maxlength="255"
	/>

	<field
		name="description"
		type="editor"
		label="JGLOBAL_DESCRIPTION"
		description="COM_CATEGORIES_DESCRIPTION_DESC"
		filter="JComponentHelper::filterText"
		buttons="true"
		hide="readmore,pagebreak"
	/>

	<field
		name="published"
		type="list"
		label="JSTATUS"
		description="JFIELD_PUBLISHED_DESC"
		default="1"
		class="chzn-color-state"
		size="1"
		>
		<option value="1">JPUBLISHED</option>
		<option value="0">JUNPUBLISHED</option>
		<option value="2">JARCHIVED</option>
		<option value="-2">JTRASHED</option>
	</field>

	<field
		name="buttonspacer"
		type="spacer"
		label="JGLOBAL_ACTION_PERMISSIONS_LABEL"
		description="JGLOBAL_ACTION_PERMISSIONS_DESCRIPTION"
	/>

	<field
		name="checked_out"
		type="hidden"
		filter="unset"
	/>

	<field
		name="checked_out_time"
		type="hidden"
		filter="unset"
	/>

	<field
		name="access"
		type="accesslevel"
		label="JFIELD_ACCESS_LABEL"
		description="JFIELD_ACCESS_DESC"
	/>

	<field
		name="metadesc"
		type="textarea"
		label="JFIELD_META_DESCRIPTION_LABEL"
		description="JFIELD_META_DESCRIPTION_DESC"
		rows="3"
		cols="40"
	/>

	<field
		name="metakey"
		type="textarea"
		label="JFIELD_META_KEYWORDS_LABEL"
		description="JFIELD_META_KEYWORDS_DESC"
		rows="3"
		cols="40"
	/>

	<field
		name="created_user_id"
		type="user"
		label="JGLOBAL_FIELD_CREATED_BY_LABEL"
		desc="JGLOBAL_FIELD_CREATED_BY_DESC"
	/>

	<field
		name="created_time"
		type="calendar"
		label="JGLOBAL_CREATED_DATE"
		translateformat="true"
		showtime="true"
		size="22"
		filter="user_utc"
	/>

	<field
		name="modified_user_id"
		type="user"
		label="JGLOBAL_FIELD_MODIFIED_BY_LABEL"
		class="readonly"
		readonly="true"
		filter="unset"
	/>

	<field
		name="modified_time"
		type="calendar"
		label="JGLOBAL_FIELD_MODIFIED_LABEL"
		class="readonly"
		translateformat="true"
		showtime="true"
		size="22"
		readonly="true"
		filter="user_utc"
	/>

	<field
		name="language"
		type="contentlanguage"
		label="JFIELD_LANGUAGE_LABEL"
		description="COM_CATEGORIES_FIELD_LANGUAGE_DESC"
		>
		<option value="*">JALL</option>
	</field>

	<field
		name="tags"
		type="tag"
		label="JTAG"
		description="JTAG_DESC"
		class="span12"
		multiple="true"
	/>

	<field
		name="rules"
		type="rules"
		label="JFIELD_RULES_LABEL"
		id="rules"
		translate_label="false"
		filter="rules"
		validate="rules"
		component="com_content"
		section="category"
	/>

	<fields name="params" label="COM_CATEGORIES_FIELD_BASIC_LABEL">

		<fieldset name="basic">

			<field
				name="category_layout"
				type="componentlayout"
				label="JFIELD_ALT_LAYOUT_LABEL"
				description="JFIELD_ALT_COMPONENT_LAYOUT_DESC"
				view="category"
				useglobal="true"
			/>

			<field
				name="image"
				type="media"
				label="COM_CATEGORIES_FIELD_IMAGE_LABEL"
				description="COM_CATEGORIES_FIELD_IMAGE_DESC"
			/>

			<field
				name="image_alt"
				type="text"
				label="COM_CATEGORIES_FIELD_IMAGE_ALT_LABEL"
				description="COM_CATEGORIES_FIELD_IMAGE_ALT_DESC"
				size="20"
			/>
		</fieldset>
	</fields>

	<fields name="metadata" label="JGLOBAL_FIELDSET_METADATA_OPTIONS">

		<fieldset name="jmetadata" label="JGLOBAL_FIELDSET_METADATA_OPTIONS">

			<field
				name="author"
				type="text"
				label="JAUTHOR"
				description="JFIELD_METADATA_AUTHOR_DESC"
				size="30"
			/>

			<field
				name="robots"
				type="list"
				label="JFIELD_METADATA_ROBOTS_LABEL"
				description="JFIELD_METADATA_ROBOTS_DESC"
				>
				<option value="">JGLOBAL_USE_GLOBAL</option>
				<option value="index, follow"></option>
				<option value="noindex, follow"></option>
				<option value="index, nofollow"></option>
				<option value="noindex, nofollow"></option>
			</field>
		</fieldset>
	</fields>
</form>
components/com_categories/models/forms/filter_categories.xml000060400000005663152453623460020561 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>

	<fields name="filter">

		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_CATEGORIES_FILTER_SEARCH_LABEL"
			description="COM_CATEGORIES_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
		/>

		<field
			name="published"
			type="status"
			label="COM_CATEGORIES_FILTER_PUBLISHED"
			description="COM_CATEGORIES_FILTER_PUBLISHED_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>

		<field
			name="access"
			type="accesslevel"
			label="JOPTION_FILTER_ACCESS"
			description="JOPTION_FILTER_ACCESS_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_ACCESS</option>
		</field>

		<field
			name="language"
			type="contentlanguage"
			label="JOPTION_FILTER_LANGUAGE"
			description="JOPTION_FILTER_LANGUAGE_DESC"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_LANGUAGE</option>
			<option value="*">JALL</option>
		</field>

		<field
			name="tag"
			type="tag"
			label="JOPTION_FILTER_TAG"
			description="JOPTION_FILTER_TAG_DESC"
			mode="nested"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_TAG</option>
		</field>

		<field
			name="level"
			type="integer"
			label="JOPTION_FILTER_LEVEL"
			description="JOPTION_FILTER_LEVEL_DESC"
			first="1"
			last="10"
			step="1"
			languages="*"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_MAX_LEVELS</option>
		</field>
	</fields>

	<fields name="list">

		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			default="a.lft ASC"
			statuses="*,0,1,2,-2"
			onchange="this.form.submit();"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.lft ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.lft DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.published ASC">JSTATUS_ASC</option>
			<option value="a.published DESC">JSTATUS_DESC</option>
			<option value="a.title ASC">JGLOBAL_TITLE_ASC</option>
			<option value="a.title DESC">JGLOBAL_TITLE_DESC</option>
			<option value="access_level ASC">JGRID_HEADING_ACCESS_ASC</option>
			<option value="access_level DESC">JGRID_HEADING_ACCESS_DESC</option>
			<option value="association ASC" requires="associations">JASSOCIATIONS_ASC</option>
			<option value="association DESC" requires="associations">JASSOCIATIONS_DESC</option>
			<option value="language_title ASC">JGRID_HEADING_LANGUAGE_ASC</option>
			<option value="language_title DESC">JGRID_HEADING_LANGUAGE_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="COM_CATEGORIES_LIST_LIMIT"
			description="COM_CATEGORIES_LIST_LIMIT_DESC"
			default="25"
			class="input-mini"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_categories/helpers/association.php000060400000003206152453623460016412 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('CategoriesHelper', JPATH_ADMINISTRATOR . '/components/com_categories/helpers/categories.php');

/**
 * Category Component Association Helper
 *
 * @since  3.0
 */
abstract class CategoryHelperAssociation
{
	public static $category_association = true;

	/**
	 * Method to get the associations for a given category
	 *
	 * @param   integer  $id         Id of the item
	 * @param   string   $extension  Name of the component
	 * @param   string   $layout     Category layout
	 *
	 * @return  array    Array of associations for the component categories
	 *
	 * @since  3.0
	 */
	public static function getCategoryAssociations($id = 0, $extension = 'com_content', $layout = null)
	{
		$return = array();

		if ($id)
		{
			// Load route helper
			jimport('helper.route', JPATH_COMPONENT_SITE);
			$helperClassname = ucfirst(substr($extension, 4)) . 'HelperRoute';

			$associations = CategoriesHelper::getAssociations($id, $extension);

			foreach ($associations as $tag => $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;
	}
}
components/com_categories/helpers/html/categoriesadministrator.php000060400000004573152453623460022000 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

JLoader::register('CategoriesHelper', JPATH_ADMINISTRATOR . '/components/com_categories/helpers/categories.php');

/**
 * Administrator category HTML
 *
 * @since  3.2
 */
abstract class JHtmlCategoriesAdministrator
{
	/**
	 * Render the list of associated items
	 *
	 * @param   integer  $catid      Category identifier to search its associations
	 * @param   string   $extension  Category Extension
	 *
	 * @return  string   The language HTML
	 *
	 * @since   3.2
	 * @throws  Exception
	 */
	public static function association($catid, $extension = 'com_content')
	{
		// Defaults
		$html = '';

		// Get the associations
		if ($associations = CategoriesHelper::getAssociations($catid, $extension))
		{
			$associations = ArrayHelper::toInteger($associations);

			// Get the associated categories
			$db = JFactory::getDbo();
			$query = $db->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 = '<a href="' . $url . '" title="' . $item->language_title . '" class="' . $classes
						. '" data-content="' . htmlspecialchars($item->title, ENT_QUOTES, 'UTF-8') . '" data-placement="top">'
						. $text . '</a>';
				}
			}

			JHtml::_('bootstrap.popover');

			$html = JLayoutHelper::render('joomla.content.associations', $items);
		}

		return $html;
	}
}
components/com_categories/helpers/categories.php000060400000011423152453623460016223 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Categories helper.
 *
 * @since  1.6
 */
class CategoriesHelper
{
	/**
	 * Configure the Submenu links.
	 *
	 * @param   string  $extension  The extension being used for the categories.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public static function addSubmenu($extension)
	{
		// Avoid nonsense situation.
		if ($extension == 'com_categories')
		{
			return;
		}

		$parts = explode('.', $extension);
		$component = $parts[0];

		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(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;
	}
}
components/com_categories/tables/category.php000060400000001426152453623460015525 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Category table
 *
 * @since  1.6
 */
class CategoriesTableCategory extends JTableCategory
{
	/**
	 * Method to delete a node and, optionally, its child nodes from the table.
	 *
	 * @param   integer  $pk        The primary key of the node to delete.
	 * @param   boolean  $children  True to delete child nodes, false to move them up a level.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 */
	public function delete($pk = null, $children = false)
	{
		return parent::delete($pk, $children);
	}
}
components/com_categories/categories.php000060400000001647152453623460014570 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
JHtml::_('behavior.tabstate');

$input = JFactory::getApplication()->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();
components/com_categories/categories.xml000060400000001771152453623460014577 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_categories</name>
	<author>Joomla! Project</author>
	<creationDate>December 2007</creationDate>
	<copyright>(C) 2007 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_CATEGORIES_XML_DESCRIPTION</description>
	<administration>
		<files folder="admin">
			<filename>categories.php</filename>
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_categories.ini</language>
			<language tag="en-GB">language/en-GB.com_categories.sys.ini</language>
		</languages>
	</administration>
</extension>
components/com_categories/controller.php000060400000005453152453623460014625 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_categories
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Categories view class for the Category package.
 *
 * @since  1.6
 */
class CategoriesController extends JControllerLegacy
{
	/**
	 * The extension for which the categories apply.
	 *
	 * @var    string
	 * @since  1.6
	 */
	protected $extension;

	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JControllerLegacy
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		parent::__construct($config);

		// Guess the JText message prefix. Defaults to the option.
		if (empty($this->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;
	}
}
components/com_djimageslider/djimageslider.xml000060400000003133152453623460015725 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.8" method="upgrade" client="admin">
    <name>com_djimageslider</name>
    <creationDate>2018-12-19</creationDate>
    <author>DJ-Extensions.com</author>
	<copyright>Copyright (C) 2017 DJ-Extensions.com, All rights reserved.</copyright>
	<license>http://www.gnu.org/licenses GNU/GPL</license>
	<authorEmail>contact@dj-extensions.com</authorEmail>
	<authorUrl>http://dj-extensions.com</authorUrl>
    <version>4.5.1</version>
	<description>DJ-ImageSlider component</description>
	<scriptfile>script.djimageslider.php</scriptfile>

	<install>
		<sql>
            <file charset="utf8" driver="mysql">sql/install.sql</file>
        </sql>
    </install>
	<uninstall>
		<sql>
            <file charset="utf8" driver="mysql">sql/uninstall.sql</file>
        </sql>
    </uninstall>
    <update>
		<schemas>
			<schemapath type="mysql">sql/updates</schemapath>
		</schemas>
	</update>

    <administration>
    	<menu img="components/com_djimageslider/assets/icon-16-djimageslider.png">COM_DJIMAGESLIDER</menu>
    	<files folder="administrator">
        	<filename>djimageslider.php</filename>
            <filename>controller.php</filename>
			<filename>index.html</filename>
			<filename>config.xml</filename>
			<filename>access.xml</filename>
			<folder>assets</folder>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>language</folder>
            <folder>models</folder>
            <folder>sql</folder>
            <folder>tables</folder>
            <folder>views</folder>
        </files>
    </administration>
</extension>
components/com_djimageslider/djimageslider.php000060400000004335152453623460015721 0ustar00<?php
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */

// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );
defined('DS') or define('DS', DIRECTORY_SEPARATOR);

// Include dependancies
jimport('joomla.application.component.controller');

$db = JFactory::getDBO();
$db->setQuery("SELECT manifest_cache FROM #__extensions WHERE element='com_djimageslider' LIMIT 1");
$version = json_decode($db->loadResult());
$version = $version->version;

define('DJIMAGESLIDERFOOTER', '<div style="text-align: center; margin: 10px 0;">DJ-ImageSlider (version '.$version.'), &copy; 2010-'.JFactory::getDate()->format('Y').' Copyright by <a target="_blank" href="http://dj-extensions.com">DJ-Extensions.com</a>, All Rights Reserved.<br /><a target="_blank" href="http://dj-extensions.com"><img src="'.JURI::base().'components/com_djimageslider/assets/logo.png" alt="DJ-Extensions.com" style="margin: 20px 0 0;" /></a></div>');

$document = JFactory::getDocument();
if ($document->getType() == 'html') {
	$document->addStyleSheet(JURI::base(true).'/components/com_djimageslider/assets/admin.css');
}

$controller	= JControllerLegacy::getInstance('djimageslider');

// Perform the Request task
$controller->execute( JFactory::getApplication()->input->get('task') );
$controller->redirect();

?>components/com_djimageslider/views/cpanel/index.html000060400000000054152453623460016773 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_djimageslider/views/cpanel/tmpl/legacy.php000060400000014473152453623460017741 0ustar00<?php 
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */


defined('_JEXEC') or die('Restricted access'); ?>

<?php if (version_compare(JVERSION, '3.0', '>=')) { ?>

<div class="<?php echo $this->classes->row ?>">

<?php if(!empty( $this->sidebar)): ?>
<div id="j-sidebar-container" class="<?php echo $this->classes->col ?>2">
	<?php echo $this->sidebar; ?>
</div>
<div id="j-main-container" class="<?php echo $this->classes->col ?>10">
<?php else: ?>
<div id="j-main-container">
<?php endif;?>
	
	<div class="<?php echo $this->classes->row ?>">
		<div class="cpanel-left <?php echo $this->classes->col ?>8">
			<div class="cpanel3">
			
				<h3><?php echo JText::_('COM_DJIMAGESLIDER_SUBMENU_CPANEL') ?></h3>
			
				<div class="icon">
					<a href="index.php?option=com_categories&extension=com_djimageslider">
						<img src="components/com_djimageslider/assets/icon-48-category.png" alt="<?php echo JText::_('COM_DJIMAGESLIDER_SUBMENU_CATEGORIES') ?>" />
						<span><?php echo JText::_('COM_DJIMAGESLIDER_SUBMENU_CATEGORIES'); ?></span>
					</a>
				</div>
					
				<div class="icon">
					<a href="index.php?option=com_djimageslider&view=items">
						<img src="components/com_djimageslider/assets/icon-48-slides.png" alt="<?php echo JText::_('COM_DJIMAGESLIDER_SUBMENU_SLIDES') ?>" />
						<span><?php echo JText::_('COM_DJIMAGESLIDER_SUBMENU_SLIDES'); ?></span>
					</a>
				</div>
				
				<div class="icon">
					<a href="index.php?option=com_categories&view=category&layout=edit&extension=com_djimageslider">
						<img src="components/com_djimageslider/assets/icon-48-category-add.png" alt="<?php echo JText::_('COM_DJIMAGESLIDER_NEW_CATEGORY') ?>" />
						<span><?php echo JText::_('COM_DJIMAGESLIDER_NEW_CATEGORY'); ?></span>
					</a>
				</div>

				<div class="icon">
					<a href="index.php?option=com_djimageslider&view=item&layout=edit">
						<img src="components/com_djimageslider/assets/icon-48-slide-add.png" alt="<?php echo JText::_('COM_DJIMAGESLIDER_NEW_SLIDE') ?>" />
						<span><?php echo JText::_('COM_DJIMAGESLIDER_NEW_SLIDE'); ?></span>
					</a>
				</div>
				
				<div class="icon">
					<a href="https://dj-extensions.com/extensions/dj-image-slider.html" target="_blank">
						<img src="components/com_djimageslider/assets/icon-48-help.png" alt="<?php echo JText::_('COM_DJIMAGESLIDER_DOCUMENTATION') ?>" />
						<span><?php echo JText::_('COM_DJIMAGESLIDER_DOCUMENTATION'); ?></span>
					</a>
				</div>
			</div>
		</div>
			
		<div class="cpanel-right <?php echo $this->classes->col ?>4">
			<div class="cpanel well">
				<div class="<?php echo $this->classes->row ?>">
					<iframe src="https://dj-extensions.com/index.php?option=com_content&view=article&tmpl=component&id=437" style="border:0; width: 100%; max-width: 450px; height: 370px; margin: -10px 0; padding: 0;"></iframe>
				</div>
			</div>
		</div>

	</div>
</div>
</div>

<?php } else { ?>

<table class="adminform">
	<tr>
		<td width="55%" valign="top">
			<div class="cpanel-left">
				<div id="cpanel">
					<div style="float:left;">
						<div class="icon">
							<a href="index.php?option=com_categories&extension=com_djimageslider">
								<img src="components/com_djimageslider/assets/icon-48-category.png" alt="<?php echo JText::_('COM_DJIMAGESLIDER_SUBMENU_CATEGORIES') ?>" />
								<span><?php echo JText::_('COM_DJIMAGESLIDER_SUBMENU_CATEGORIES'); ?></span>
							</a>
						</div>
					</div>
					<div style="float:left;">
						<div class="icon">
							<a href="index.php?option=com_djimageslider&view=items">
								<img src="components/com_djimageslider/assets/icon-48-slides.png" alt="<?php echo JText::_('COM_DJIMAGESLIDER_SUBMENU_SLIDES') ?>" />
								<span><?php echo JText::_('COM_DJIMAGESLIDER_SUBMENU_SLIDES'); ?></span>
							</a>
						</div>
					</div>
					<div style="float:left;">
						<div class="icon">
							<a href="index.php?option=com_categories&view=category&layout=edit&extension=com_djimageslider">
								<img src="components/com_djimageslider/assets/icon-48-category-add.png" alt="<?php echo JText::_('COM_DJIMAGESLIDER_NEW_CATEGORY') ?>" />
								<span><?php echo JText::_('COM_DJIMAGESLIDER_NEW_CATEGORY'); ?></span>
							</a>
						</div>
					</div>
					<div style="float:left;">
						<div class="icon">
							<a href="index.php?option=com_djimageslider&view=item&layout=edit">
								<img src="components/com_djimageslider/assets/icon-48-slide-add.png" alt="<?php echo JText::_('COM_DJIMAGESLIDER_NEW_SLIDE') ?>" />
								<span><?php echo JText::_('COM_DJIMAGESLIDER_NEW_SLIDE'); ?></span>
							</a>
						</div>
					</div>
					<div style="float:left;">
						<div class="icon">
							<a href="https://dj-extensions.com/extensions/dj-image-slider.html" target="_blank">
								<img src="components/com_djimageslider/assets/icon-48-help.png" alt="<?php echo JText::_('COM_DJIMAGESLIDER_DOCUMENTATION') ?>" />
								<span><?php echo JText::_('COM_DJIMAGESLIDER_DOCUMENTATION'); ?></span>
							</a>
						</div>
					</div>
			
				</div>
			</div>
			<div class="cpanel-right">
				<div class="cpanel">					
						<iframe src="https://dj-extensions.com/index.php?option=com_content&view=article&tmpl=component&id=437" style="border:0; width: 100%; max-width: 450px; height: 370px; margin: -10px 0; padding: 0;"></iframe>
					<div style="clear: both;" ></div>
				</div>
			</div>
		</td>
	</tr>
</table>
<?php } ?>

<div class="clr" style="clear: both"></div>
<?php echo DJIMAGESLIDERFOOTER; ?>components/com_djimageslider/views/cpanel/tmpl/index.html000060400000000054152453623460017747 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_djimageslider/views/cpanel/tmpl/default.php000060400000013664152453623460020122 0ustar00<?php 
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */


defined('_JEXEC') or die('Restricted access'); ?>

<?php if (version_compare(JVERSION, '3.0', '>=')) { ?>

<div class="<?php echo $this->classes->row ?>">

<?php if(!empty( $this->sidebar)): ?>
<div id="j-sidebar-container" class="<?php echo $this->classes->col ?>2">
	<?php echo $this->sidebar; ?>
</div>
<div id="j-main-container" class="<?php echo $this->classes->col ?>10">
<?php else: ?>
<div id="j-main-container">
<?php endif;?>
	
	<div class="<?php echo $this->classes->row ?>">
		<div class="cpanel-left <?php echo $this->classes->col ?>8">
			<div class="cpanel">
			
				<h3><?php echo JText::_('COM_DJIMAGESLIDER_SUBMENU_CPANEL') ?></h3>
			
				<div class="icon">
					<a href="index.php?option=com_categories&extension=com_djimageslider">
						<img src="components/com_djimageslider/assets/icon-48-category.png" alt="<?php echo JText::_('COM_DJIMAGESLIDER_SUBMENU_CATEGORIES') ?>" />
						<span><?php echo JText::_('COM_DJIMAGESLIDER_SUBMENU_CATEGORIES'); ?></span>
					</a>
				</div>
					
				<div class="icon">
					<a href="index.php?option=com_djimageslider&view=items">
						<img src="components/com_djimageslider/assets/icon-48-slides.png" alt="<?php echo JText::_('COM_DJIMAGESLIDER_SUBMENU_SLIDES') ?>" />
						<span><?php echo JText::_('COM_DJIMAGESLIDER_SUBMENU_SLIDES'); ?></span>
					</a>
				</div>
				
				<div class="icon">
					<a href="index.php?option=com_categories&view=category&layout=edit&extension=com_djimageslider">
						<img src="components/com_djimageslider/assets/icon-48-category-add.png" alt="<?php echo JText::_('COM_DJIMAGESLIDER_NEW_CATEGORY') ?>" />
						<span><?php echo JText::_('COM_DJIMAGESLIDER_NEW_CATEGORY'); ?></span>
					</a>
				</div>

				<div class="icon">
					<a href="index.php?option=com_djimageslider&view=item&layout=edit">
						<img src="components/com_djimageslider/assets/icon-48-slide-add.png" alt="<?php echo JText::_('COM_DJIMAGESLIDER_NEW_SLIDE') ?>" />
						<span><?php echo JText::_('COM_DJIMAGESLIDER_NEW_SLIDE'); ?></span>
					</a>
				</div>
				
				<div class="icon">
					<a href="https://dj-extensions.com/extensions/dj-image-slider.html" target="_blank">
						<img src="components/com_djimageslider/assets/icon-48-help.png" alt="<?php echo JText::_('COM_DJIMAGESLIDER_DOCUMENTATION') ?>" />
						<span><?php echo JText::_('COM_DJIMAGESLIDER_DOCUMENTATION'); ?></span>
					</a>
				</div>
			</div>
		</div>


	</div>
</div>
</div>

<?php } else { ?>

<table class="adminform">
	<tr>
		<td width="55%" valign="top">
			<div class="cpanel-left">
				<div id="cpanel">
					<div style="float:left;">
						<div class="icon">
							<a href="index.php?option=com_categories&extension=com_djimageslider">
								<img src="components/com_djimageslider/assets/icon-48-category.png" alt="<?php echo JText::_('COM_DJIMAGESLIDER_SUBMENU_CATEGORIES') ?>" />
								<span><?php echo JText::_('COM_DJIMAGESLIDER_SUBMENU_CATEGORIES'); ?></span>
							</a>
						</div>
					</div>
					<div style="float:left;">
						<div class="icon">
							<a href="index.php?option=com_djimageslider&view=items">
								<img src="components/com_djimageslider/assets/icon-48-slides.png" alt="<?php echo JText::_('COM_DJIMAGESLIDER_SUBMENU_SLIDES') ?>" />
								<span><?php echo JText::_('COM_DJIMAGESLIDER_SUBMENU_SLIDES'); ?></span>
							</a>
						</div>
					</div>
					<div style="float:left;">
						<div class="icon">
							<a href="index.php?option=com_categories&view=category&layout=edit&extension=com_djimageslider">
								<img src="components/com_djimageslider/assets/icon-48-category-add.png" alt="<?php echo JText::_('COM_DJIMAGESLIDER_NEW_CATEGORY') ?>" />
								<span><?php echo JText::_('COM_DJIMAGESLIDER_NEW_CATEGORY'); ?></span>
							</a>
						</div>
					</div>
					<div style="float:left;">
						<div class="icon">
							<a href="index.php?option=com_djimageslider&view=item&layout=edit">
								<img src="components/com_djimageslider/assets/icon-48-slide-add.png" alt="<?php echo JText::_('COM_DJIMAGESLIDER_NEW_SLIDE') ?>" />
								<span><?php echo JText::_('COM_DJIMAGESLIDER_NEW_SLIDE'); ?></span>
							</a>
						</div>
					</div>
					<div style="float:left;">
						<div class="icon">
							<a href="https://dj-extensions.com/extensions/dj-image-slider.html" target="_blank">
								<img src="components/com_djimageslider/assets/icon-48-help.png" alt="<?php echo JText::_('COM_DJIMAGESLIDER_DOCUMENTATION') ?>" />
								<span><?php echo JText::_('COM_DJIMAGESLIDER_DOCUMENTATION'); ?></span>
							</a>
						</div>
					</div>
			
				</div>
			</div>
			<div class="cpanel-right">
				<div class="cpanel">					
						<iframe src="https://dj-extensions.com/index.php?option=com_content&view=article&tmpl=component&id=437" style="border:0; width: 100%; max-width: 450px; height: 370px; margin: -10px 0; padding: 0;"></iframe>
					<div style="clear: both;" ></div>
				</div>
			</div>
		</td>
	</tr>
</table>
<?php } ?>

<div class="clr" style="clear: both"></div>
<?php echo DJIMAGESLIDERFOOTER; ?>components/com_djimageslider/views/cpanel/view.html.php000060400000003067152453623460017433 0ustar00<?php 
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */

defined('_JEXEC') or die( 'Restricted access' );

jimport( 'joomla.application.component.view');
jimport( 'joomla.application.categories');
jimport('joomla.html.pane');

class DJImageSliderViewCpanel extends JViewLegacy
{
	function display($tpl = null)
	{
		JToolBarHelper::title( JText::_('COM_DJIMAGESLIDER'));
		
		JToolBarHelper::preferences('com_djimageslider', 550, 875);
		
		if (class_exists('JHtmlSidebar')){
			$this->sidebar = JHtmlSidebar::render();
		}
		
		$this->classes = DJImageSliderHelper::getBSClasses();
		
		parent::display($tpl);
	}
}
components/com_djimageslider/views/index.html000060400000000054152453623460015531 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_djimageslider/views/item/tmpl/edit_params.php000060400000003137152453623460020454 0ustar00<?php
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */

// No direct access.
defined('_JEXEC') or die;

$fieldSets = $this->form->getFieldsets('params');
foreach ($fieldSets as $name => $fieldSet) : ?>
	
	<fieldset class="panelform well" >
		
			<h3><?php echo JText::_($fieldSet->label); ?></h3>
			<?php if (isset($fieldSet->description) && trim($fieldSet->description)) :
				echo '<p class="tip alert alert-info">'.$this->escape(JText::_($fieldSet->description)).'</p>';
			endif; ?>
			<?php foreach ($this->form->getFieldset($name) as $field) : ?>
				<?php echo $field->renderField(); ?>
			<?php endforeach; ?>
		
	</fieldset>
<?php endforeach; ?>components/com_djimageslider/views/item/tmpl/edit.php000060400000010570152453623460017110 0ustar00<?php
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */

// No direct access.
defined('_JEXEC') or die;


if(version_compare(JVERSION, '4', '<')) { // Joomla 3) { // first must be the zoomer script
    JHtml::_('behavior.framework');
    JHtml::_('behavior.tooltip');
    JHtml::_('behavior.formvalidation');
}else {
    JHtml::_('behavior.formvalidator');
}

if(version_compare(JVERSION, '3.0', '>=')) JHtml::_('formbehavior.chosen', 'select'); /* J!3.0 only */
?>

<script type="text/javascript">
	Joomla.submitbutton = function(task)
	{
		if (task == 'item.cancel' || document.formvalidator.isValid(document.getElementById('item-form'))) {
			Joomla.submitform(task, document.getElementById('item-form'));
		}
		else {
			alert("<?php echo $this->escape(JText::_('COM_DJIMAGESLIDER_VALIDATION_FORM_FAILED'));?>");
		}
	}
</script>

<form action="<?php echo JRoute::_('index.php?option=com_djimageslider&layout=edit&id='.(int) $this->item->id); ?>" method="post" name="adminForm" id="item-form" class="form-validate form-horizontal">
	<div class="<?php echo $this->classes->row ?>">	
	<div class="<?php echo $this->classes->col ?>7">
		<fieldset class="adminform">
		
			<h3><?php echo empty($this->item->id) ? JText::_('COM_DJIMAGESLIDER_NEW') : JText::sprintf('COM_DJIMAGESLIDER_EDIT', $this->item->id); ?></h3>				
			
			<div class="tab-content">
				
				<div class="control-group">
					<div class="control-label"><?php echo $this->form->getLabel('title'); ?></div>
					<div class="controls"><?php echo $this->form->getInput('title'); ?></div>
				</div>
				<div class="control-group">
					<div class="control-label"><?php echo $this->form->getLabel('catid'); ?></div>
					<div class="controls"><?php echo $this->form->getInput('catid'); ?></div>
				</div>
				<div class="control-group">
					<div class="control-label"><?php echo $this->form->getLabel('image'); ?></div>
					<div class="controls"><?php echo $this->form->getInput('image'); ?></div>
				</div>
				<div style="clear:both"></div>
				<div class="control-group">
					<div class="control-label"><?php echo $this->form->getLabel('description'); ?></div>
					<div class="controls"><?php echo $this->form->getInput('description'); ?></div>
				</div>
				
			</div>
		</fieldset>
	</div>

	<div class="<?php echo $this->classes->col ?>5">
		
		<fieldset class="panelform well" >
		
			<h3><?php echo JText::_('COM_DJIMAGESLIDER_PUBLISHING_OPTIONS'); ?></h3>
			
				<div class="control-group">
					<div class="control-label"><?php echo $this->form->getLabel('published'); ?></div>
					<div class="controls"><?php echo $this->form->getInput('published'); ?></div>
				</div>
				<div class="control-group">
					<div class="control-label"><?php echo $this->form->getLabel('publish_up'); ?></div>
					<div class="controls"><?php echo $this->form->getInput('publish_up'); ?></div>
				</div>
				<div class="control-group">
					<div class="control-label"><?php echo $this->form->getLabel('publish_down'); ?></div>
					<div class="controls"><?php echo $this->form->getInput('publish_down'); ?></div>
				</div>
				<div class="control-group">
					<div class="control-label"><?php echo $this->form->getLabel('id'); ?></div>
					<div class="controls"><?php echo $this->form->getInput('id'); ?></div>
				</div>
			
		</fieldset>
		
		<?php echo $this->loadTemplate('params'); ?>
		
		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
	</div>
</form>

<div class="clr"></div>
components/com_djimageslider/views/item/tmpl/legacy.php000060400000010570152453623460017427 0ustar00<?php
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */

// No direct access.
defined('_JEXEC') or die;


if(version_compare(JVERSION, '4', '<')) { // Joomla 3) { // first must be the zoomer script
    JHtml::_('behavior.framework');
    JHtml::_('behavior.tooltip');
    JHtml::_('behavior.formvalidation');
}else {
    JHtml::_('behavior.formvalidator');
}

if(version_compare(JVERSION, '3.0', '>=')) JHtml::_('formbehavior.chosen', 'select'); /* J!3.0 only */
?>

<script type="text/javascript">
	Joomla.submitbutton = function(task)
	{
		if (task == 'item.cancel' || document.formvalidator.isValid(document.getElementById('item-form'))) {
			Joomla.submitform(task, document.getElementById('item-form'));
		}
		else {
			alert("<?php echo $this->escape(JText::_('COM_DJIMAGESLIDER_VALIDATION_FORM_FAILED'));?>");
		}
	}
</script>

<form action="<?php echo JRoute::_('index.php?option=com_djimageslider&layout=edit&id='.(int) $this->item->id); ?>" method="post" name="adminForm" id="item-form" class="form-validate form-horizontal">
	<div class="<?php echo $this->classes->row ?>">	
	<div class="<?php echo $this->classes->col ?>7">
		<fieldset class="adminform">
		
			<h3><?php echo empty($this->item->id) ? JText::_('COM_DJIMAGESLIDER_NEW') : JText::sprintf('COM_DJIMAGESLIDER_EDIT', $this->item->id); ?></h3>				
			
			<div class="tab-content">
				
				<div class="control-group">
					<div class="control-label"><?php echo $this->form->getLabel('title'); ?></div>
					<div class="controls"><?php echo $this->form->getInput('title'); ?></div>
				</div>
				<div class="control-group">
					<div class="control-label"><?php echo $this->form->getLabel('catid'); ?></div>
					<div class="controls"><?php echo $this->form->getInput('catid'); ?></div>
				</div>
				<div class="control-group">
					<div class="control-label"><?php echo $this->form->getLabel('image'); ?></div>
					<div class="controls"><?php echo $this->form->getInput('image'); ?></div>
				</div>
				<div style="clear:both"></div>
				<div class="control-group">
					<div class="control-label"><?php echo $this->form->getLabel('description'); ?></div>
					<div class="controls"><?php echo $this->form->getInput('description'); ?></div>
				</div>
				
			</div>
		</fieldset>
	</div>

	<div class="<?php echo $this->classes->col ?>5">
		
		<fieldset class="panelform well" >
		
			<h3><?php echo JText::_('COM_DJIMAGESLIDER_PUBLISHING_OPTIONS'); ?></h3>
			
				<div class="control-group">
					<div class="control-label"><?php echo $this->form->getLabel('published'); ?></div>
					<div class="controls"><?php echo $this->form->getInput('published'); ?></div>
				</div>
				<div class="control-group">
					<div class="control-label"><?php echo $this->form->getLabel('publish_up'); ?></div>
					<div class="controls"><?php echo $this->form->getInput('publish_up'); ?></div>
				</div>
				<div class="control-group">
					<div class="control-label"><?php echo $this->form->getLabel('publish_down'); ?></div>
					<div class="controls"><?php echo $this->form->getInput('publish_down'); ?></div>
				</div>
				<div class="control-group">
					<div class="control-label"><?php echo $this->form->getLabel('id'); ?></div>
					<div class="controls"><?php echo $this->form->getInput('id'); ?></div>
				</div>
			
		</fieldset>
		
		<?php echo $this->loadTemplate('params'); ?>
		
		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
	</div>
</form>

<div class="clr"></div>
components/com_djimageslider/views/item/tmpl/legacy_params.php000060400000003137152453623460020773 0ustar00<?php
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */

// No direct access.
defined('_JEXEC') or die;

$fieldSets = $this->form->getFieldsets('params');
foreach ($fieldSets as $name => $fieldSet) : ?>
	
	<fieldset class="panelform well" >
		
			<h3><?php echo JText::_($fieldSet->label); ?></h3>
			<?php if (isset($fieldSet->description) && trim($fieldSet->description)) :
				echo '<p class="tip alert alert-info">'.$this->escape(JText::_($fieldSet->description)).'</p>';
			endif; ?>
			<?php foreach ($this->form->getFieldset($name) as $field) : ?>
				<?php echo $field->renderField(); ?>
			<?php endforeach; ?>
		
	</fieldset>
<?php endforeach; ?>components/com_djimageslider/views/item/tmpl/index.html000060400000000054152453623460017443 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_djimageslider/views/item/view.html.php000060400000007263152453623460017131 0ustar00<?php
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */

// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die( 'Restricted access' );

jimport('joomla.application.component.view');
class DJImageSliderViewItem extends JViewLegacy
{
	protected $form;
	protected $item;
	protected $state;

	public function display($tpl = null)
	{
		// Initialiase variables.
		$this->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);
			return false;
		}

		$this->classes = DJImageSliderHelper::getBSClasses();
		
		$this->addToolbar();
		parent::display($tpl);
	}
	
	protected function addToolbar()
	{
		JFactory::getApplication()->input->set('hidemainmenu', true);

		$user		= JFactory::getUser();
		$userId		= $user->get('id');
		$isNew		= ($this->item->id == 0);
		$checkedOut	= !($this->item->checked_out == 0 || $this->item->checked_out == $userId);
		$canDo		= true; //ContactHelper::getActions($this->state->get('filter.category'));

		$text = $isNew ? JText::_( 'COM_DJIMAGESLIDER_NEW' ) : JText::_( 'COM_DJIMAGESLIDER_EDIT' );
		JToolBarHelper::title(   JText::_( 'COM_DJIMAGESLIDER_ITEM' ).': <small><small>[ ' . $text.' ]</small></small>', 'generic.png' );
		
		// Built the actions for new and existing records.
		if ($isNew)  {
			// For new records, check the create permission.
			//if ($canDo->get('core.create')) {
				JToolBarHelper::apply('item.apply', 'JTOOLBAR_APPLY');
				JToolBarHelper::save('item.save', 'JTOOLBAR_SAVE');
				JToolBarHelper::custom('item.save2new', 'save-new.png', 'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false);
			//}

			JToolBarHelper::cancel('item.cancel', 'JTOOLBAR_CANCEL');
		}
		else {
			// Can't save the record if it's checked out.
			if (!$checkedOut) {
				// Since it's an existing record, check the edit permission, or fall back to edit own if the owner.
				//if ($canDo->get('core.edit') || ($canDo->get('core.edit.own') && $this->item->created_by == $userId)) {
					JToolBarHelper::apply('item.apply', 'JTOOLBAR_APPLY');
					JToolBarHelper::save('item.save', 'JTOOLBAR_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::custom('item.save2new', 'save-new.png', 'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false);
					//}
				//}
			}

			// If checked out, we can still save
			//if ($canDo->get('core.create')) {
				JToolBarHelper::custom('item.save2copy', 'save-copy.png', 'save-copy_f2.png', 'JTOOLBAR_SAVE_AS_COPY', false);
			//}

			JToolBarHelper::cancel('item.cancel', 'JTOOLBAR_CLOSE');
		}

	}
}
components/com_djimageslider/views/item/index.html000060400000000054152453623460016467 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_djimageslider/views/items/index.html000060400000000054152453623460016652 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_djimageslider/views/items/view.html.php000060400000006153152453623460017311 0ustar00<?php
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */

// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die( 'Restricted access' );

jimport('joomla.application.component.view');

class DJImageSliderViewItems extends JViewLegacy
{
	protected $items;
	protected $pagination;
	protected $state;
	
	public function display($tpl = null)
	{
		$this->items		= $this->get('Items');
		$this->pagination	= $this->get('Pagination');
		$this->state		= $this->get('State');
		
		// Check for errors.
		if (count($errors = $this->get('Errors'))) {
			throw new \Exception(implode("\n", $errors), 500);
			return false;
		}

		if (class_exists('JHtmlSidebar')){
			$this->sidebar = JHtmlSidebar::render();
		}
		
		foreach($this->items as $item) {
			$item->thumb = 'components/com_djimageslider/assets/icon-image.png';						
			if(strcasecmp(substr($item->image, 0, 4), 'http') != 0 && !empty($item->image)) {
				$item->image = JURI::root(true).'/'.$item->image;
			}
			$item->preview = '<img src="'.$item->image.'" alt="'.$this->escape($item->title).'" width="300" />';
		}
		
		$this->classes = DJImageSliderHelper::getBSClasses();
		
		$this->addToolbar();		
		parent::display($tpl);
	}
	
	protected function addToolbar()
	{
		$doc = JFactory::getDocument();

		JHTML::_('jquery.framework');
		$doc->addStyleSheet(JURI::root(true).'/media/djextensions/magnific/magnific.css');
		$doc->addScript(JURI::root(true).'/media/djextensions/magnific/magnific.js', 'text/javascript');
		$doc->addScript(JURI::base(true).'/components/com_djimageslider/assets/magnific-init.js', 'text/javascript');
		
		JToolBarHelper::title(JText::_('COM_DJIMAGESLIDER_SLIDES'), 'generic.png');

		JToolBarHelper::addNew('item.add','JTOOLBAR_NEW');
		JToolBarHelper::editList('item.edit','JTOOLBAR_EDIT');
		JToolBarHelper::deleteList('', 'items.delete','JTOOLBAR_DELETE');
		JToolBarHelper::divider();
		JToolBarHelper::custom('items.publish', 'publish.png', 'publish_f2.png','JTOOLBAR_PUBLISH', true);
		JToolBarHelper::custom('items.unpublish', 'unpublish.png', 'unpublish_f2.png', 'JTOOLBAR_UNPUBLISH', true);
		JToolBarHelper::divider();
		JToolBarHelper::preferences('com_djimageslider', 550, 875);
		
	}
}components/com_djimageslider/views/items/tmpl/emptystate.php000060400000001523152453623460020543 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   (C) 2021 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Layout\LayoutHelper;

$displayData = [
	'textPrefix' => 'COM_DJIMAGESLIDER_ITEMS',
	'formURL'    => 'index.php?option=com_djimageslider&view=items',
	'helpURL'    => 'https://support.dj-extensions.com/portal/en/kb/articles/creating-new-custom-item',
	'icon'       => 'generic',
];

$user = Factory::getApplication()->getIdentity();

if ($user->authorise('core.create', 'com_djimageslider'))
{
	$displayData['createURL'] = 'index.php?option=com_djimageslider&task=item.add';
}

echo LayoutHelper::render('joomla.content.emptystate', $displayData);
components/com_djimageslider/views/items/tmpl/legacy.php000060400000021575152453623460017621 0ustar00<?php 
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */

defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Session\Session;


JHtml::_('formbehavior.chosen', 'select');

if(version_compare(JVERSION, '4', '<')) { // Joomla 3) { // first must be the zoomer script
    JHTML::_('behavior.tooltip');
}
$user		= JFactory::getUser();
$userId		= $user->get('id');
$listOrder	= $this->state->get('list.ordering');
$listDirn	= $this->state->get('list.direction');
$canOrder	= $user->authorise('core.edit.state', 'com_djimageslider.category');
$saveOrder	= $listOrder == 'a.ordering';

$joomla4 = version_compare(JVERSION, '4', '>=') ? true : false;

if($saveOrder) {
	if($joomla4) {
		$saveOrderingUrl = 'index.php?option=com_djimageslider&task=items.saveOrderAjax&tmpl=component&' . Session::getFormToken() . '=1';
		HTMLHelper::_('draggablelist.draggable');
	} else {
		$saveOrderingUrl = 'index.php?option=com_djimageslider&task=items.saveOrderAjax&tmpl=component';
		JHtml::_('sortablelist.sortable', 'itemsList', 'adminForm', strtolower($listDirn), $saveOrderingUrl);
	}
}
?>

<div class="<?php echo $this->classes->row ?>">

<?php if(!empty( $this->sidebar)): ?>
<div id="j-sidebar-container" class="<?php echo $this->classes->col ?>2">
	<?php echo $this->sidebar; ?>
</div>
<div id="j-main-container" class="<?php echo $this->classes->col ?>10">
<?php else: ?>
<div id="j-main-container">
<?php endif;?>
	
<form action="<?php echo JRoute::_('index.php?option=com_djimageslider&view=items'); ?>" method="post" name="adminForm" id="adminForm">
	<div id="filter-bar" class="btn-toolbar">
		<div class="filter-search fltlft btn-group pull-left">
			<label class="filter-search-lbl element-invisible" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" placeholder="<?php echo JText::_('COM_DJIMAGESLIDER_SEARCH_IN_TITLE'); ?>" />
		</div>
		<div class="filter-search fltlft btn-group pull-left">
			<button type="submit" class="btn"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" class="btn" onclick="document.id('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>
		<div class="btn-group pull-right hidden-phone">
			<?php echo $this->pagination->getLimitBox(); ?>
		</div>
		<div class="filter-select fltrt btn-group pull-right">
			<select name="filter_published" class="inputbox input-medium" onchange="this.form.submit()">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED');?></option>
				<?php echo JHtml::_('select.options', array(JHtml::_('select.option', '1', 'JPUBLISHED'),JHtml::_('select.option', '0', 'JUNPUBLISHED')), 'value', 'text', $this->state->get('filter.published'), true);?>
			</select>
		</div>
		<div class="filter-select fltrt btn-group pull-right">
			<select name="filter_category" class="inputbox" onchange="this.form.submit()">
				<option value=""><?php echo JText::_('JOPTION_SELECT_CATEGORY');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('category.options', 'com_djimageslider'), 'value', 'text', $this->state->get('filter.category'));?>
			</select>
		</div>
	</div>
	<div class="clr"> </div>
	
	<table class="adminlist table table-striped" id="itemsList">
		<thead>
			<tr>
				<th width="1%" class="nowrap center hidden-phone">
					<?php echo JHtml::_('grid.sort', '<i class="icon-menu-2"></i>', 'a.ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING'); ?>
				</th>
				<th width="1%">
					<input type="checkbox" name="checkall-toggle" value="" onclick="checkAll(this)" />
				</th>
				<th width="8%">
					<?php echo JText::_('COM_DJIMAGESLIDER_IMAGE'); ?>
				</th>
				<th>
					<?php echo JHtml::_('grid.sort',  'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
				</th>				
				<th width="5%">
					<?php echo JHtml::_('grid.sort', 'JPUBLISHED', 'a.published', $listDirn, $listOrder); ?>
				</th>
				<th width="10%">
					<?php echo JHtml::_('grid.sort', 'JCATEGORY', 'category_title', $listDirn, $listOrder); ?>
				</th>
				<th width="1%">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>
		<tfoot>
			<tr>
				<td colspan="10">
					<?php echo $this->pagination->getListFooter(); ?>
				</td>
			</tr>
		</tfoot>
		<tbody <?php if ($saveOrder && $joomla4) :?> class="js-draggable" data-url="<?php echo $saveOrderingUrl; ?>" data-direction="<?php echo strtolower($listDirn); ?>" data-nested="false"<?php endif; ?>>
		<?php 
		$n = count($this->items);
		foreach ($this->items as $i => $item) :
			$ordering	= ($listOrder == 'a.ordering');
			$canCreate	= $user->authorise('core.create',		'com_djimageslider.category.'.$item->catid);
			$canEdit	= $user->authorise('core.edit',			'com_djimageslider.category.'.$item->catid);
			$canCheckin	= $user->authorise('core.manage',		'com_checkin') || $item->checked_out == $userId || $item->checked_out == 0;
			$canEditOwn	= true; //$user->authorise('core.edit.own',		'com_djimageslider.category.'.$item->catid) && $item->created_by == $userId;
			$canChange	= $user->authorise('core.edit.state',	'com_djimageslider.category.'.$item->catid) && $canCheckin;

			?>
			<tr class="row<?php echo $i % 2; ?>" sortable-group-id="<?php echo $item->catid ?>" data-dragable-group="<?php echo $item->catid ?>">
			
				<td class="order nowrap center hidden-phone">
					<?php $iconClass = '';
					if (!$canChange) {
						$iconClass = ' inactive';
					} elseif (!$saveOrder) {
						$iconClass = ' inactive tip-top hasTooltip" title="' . JHtml::tooltipText('JORDERINGDISABLED');
					} ?>
					<span class="sortable-handler<?php echo $iconClass ?>">
						<i class="icon-move"></i>
					</span>
					<?php if ($canChange && $saveOrder) : ?>
						<input type="text" style="display:none" name="order[]" size="5" value="<?php echo $item->ordering; ?>" class="width-20 text-area-order " />
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				</td>
				<td align="center">
					<?php if ($item->image) : ?>
						<a class="mf-popup" href="<?php echo $item->image; ?>"><img src="<?php echo $item->image; ?>" alt="<?php echo $this->escape($item->title); ?>" style="border: 1px solid #ccc; padding: 1px; max-height: 40px; max-width: 60px;" /></a>
					<?php endif; ?>
				</td>
				<td>
					<?php if ($item->checked_out) : ?>
						<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'items.', $canCheckin); ?>
					<?php endif; ?>
					<?php if ($canEdit || $canEditOwn) : ?>
						<a href="<?php echo JRoute::_('index.php?option=com_djimageslider&task=item.edit&id='.(int) $item->id); ?>">
							<?php echo $this->escape($item->title); ?></a>
					<?php else : ?>
						<?php echo $this->escape($item->title); ?>
					<?php endif; ?>
					<div class="smallsub small">
						<?php 
						$desc = strip_tags($item->description);
						if(function_exists('mb_substr')) {
							echo mb_substr($desc,0,120); if(strlen($desc) > 120) echo '...';
						} else {
							echo substr($desc,0,120); if(strlen($desc) > 120) echo '...';
						} ?>
					</div>
				</td>
				<td class="center">
					<?php echo JHtml::_('jgrid.published', $item->published, $i, 'items.', true, 'cb'	); ?>
				</td>
			
				<td align="center">
					<?php echo $item->category_title; ?>
				</td>
				<td align="center">
					<?php echo $item->id; ?>
				</td>
			</tr>
		<?php endforeach; ?>
		</tbody>
	</table>
	<div>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
		<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
</div>

</div>

<div class="clr" style="clear: both"></div>
<?php echo DJIMAGESLIDERFOOTER; ?>
components/com_djimageslider/views/items/tmpl/default.php000060400000021576152453623460020002 0ustar00<?php 
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */

defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Session\Session;


JHtml::_('formbehavior.chosen', 'select');

if(version_compare(JVERSION, '4', '<')) { // Joomla 3) { // first must be the zoomer script
    JHTML::_('behavior.tooltip');
}
$user		= JFactory::getUser();
$userId		= $user->get('id');
$listOrder	= $this->state->get('list.ordering');
$listDirn	= $this->state->get('list.direction');
$canOrder	= $user->authorise('core.edit.state', 'com_djimageslider.category');
$saveOrder	= $listOrder == 'a.ordering';

$joomla4 = version_compare(JVERSION, '4', '>=') ? true : false;

if($saveOrder) {
	if($joomla4) {
		$saveOrderingUrl = 'index.php?option=com_djimageslider&task=items.saveOrderAjax&tmpl=component&' . Session::getFormToken() . '=1';
		HTMLHelper::_('draggablelist.draggable');
	} else {
		$saveOrderingUrl = 'index.php?option=com_djimageslider&task=items.saveOrderAjax&tmpl=component';
		JHtml::_('sortablelist.sortable', 'itemsList', 'adminForm', strtolower($listDirn), $saveOrderingUrl);
	}
}
?>

<div class="<?php echo $this->classes->row ?>">

<?php if(!empty( $this->sidebar)): ?>
<div id="j-sidebar-container" class="<?php echo $this->classes->col ?>2">
	<?php echo $this->sidebar; ?>
</div>
<div id="j-main-container" class="<?php echo $this->classes->col ?>10">
<?php else: ?>
<div id="j-main-container">
<?php endif;?>
	
<form action="<?php echo JRoute::_('index.php?option=com_djimageslider&view=items'); ?>" method="post" name="adminForm" id="adminForm">
	<div id="filter-bar" class="btn-toolbar">
		<div class="filter-search fltlft btn-group pull-left">
			<label class="filter-search-lbl element-invisible" for="filter_search"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></label>
			<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" placeholder="<?php echo JText::_('COM_DJIMAGESLIDER_SEARCH_IN_TITLE'); ?>" />
		</div>
		<div class="filter-search fltlft btn-group pull-left">
			<button type="submit" class="btn"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
			<button type="button" class="btn" onclick="document.id('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
		</div>
		<div class="btn-group pull-right hidden-phone">
			<?php echo $this->pagination->getLimitBox(); ?>
		</div>
		<div class="filter-select fltrt btn-group pull-right">
			<select name="filter_published" class="inputbox input-medium" onchange="this.form.submit()">
				<option value=""><?php echo JText::_('JOPTION_SELECT_PUBLISHED');?></option>
				<?php echo JHtml::_('select.options', array(JHtml::_('select.option', '1', 'JPUBLISHED'),JHtml::_('select.option', '0', 'JUNPUBLISHED')), 'value', 'text', $this->state->get('filter.published'), true);?>
			</select>
		</div>
		<div class="filter-select fltrt btn-group pull-right">
			<select name="filter_category" class="inputbox" onchange="this.form.submit()">
				<option value=""><?php echo JText::_('JOPTION_SELECT_CATEGORY');?></option>
				<?php echo JHtml::_('select.options', JHtml::_('category.options', 'com_djimageslider'), 'value', 'text', $this->state->get('filter.category'));?>
			</select>
		</div>
	</div>
	<div class="clr"> </div>
	
	<table class="adminlist table table-striped" id="itemsList">
		<thead>
			<tr>
				<th width="1%" class="nowrap center hidden-phone">
					<?php echo JHtml::_('grid.sort', '<i class="icon-menu-2"></i>', 'a.ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING'); ?>
				</th>
				<th width="1%">
					<input type="checkbox" name="checkall-toggle" value="" onclick="checkAll(this)" />
				</th>
				<th width="8%">
					<?php echo JText::_('COM_DJIMAGESLIDER_IMAGE'); ?>
				</th>
				<th>
					<?php echo JHtml::_('grid.sort',  'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
				</th>				
				<th width="5%">
					<?php echo JHtml::_('grid.sort', 'JPUBLISHED', 'a.published', $listDirn, $listOrder); ?>
				</th>
				<th width="10%">
					<?php echo JHtml::_('grid.sort', 'JCATEGORY', 'category_title', $listDirn, $listOrder); ?>
				</th>
				<th width="1%">
					<?php echo JHtml::_('grid.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
				</th>
			</tr>
		</thead>
		<tfoot>
			<tr>
				<td colspan="10">
					<?php echo $this->pagination->getListFooter(); ?>
				</td>
			</tr>
		</tfoot>
		<tbody <?php if ($saveOrder && $joomla4) :?> class="js-draggable" data-url="<?php echo $saveOrderingUrl; ?>" data-direction="<?php echo strtolower($listDirn); ?>" data-nested="false"<?php endif; ?>>
		<?php 
		$n = count($this->items);
		foreach ($this->items as $i => $item) :
			$ordering	= ($listOrder == 'a.ordering');
			$canCreate	= $user->authorise('core.create',		'com_djimageslider.category.'.$item->catid);
			$canEdit	= $user->authorise('core.edit',			'com_djimageslider.category.'.$item->catid);
			$canCheckin	= $user->authorise('core.manage',		'com_checkin') || $item->checked_out == $userId || $item->checked_out == 0;
			$canEditOwn	= true; //$user->authorise('core.edit.own',		'com_djimageslider.category.'.$item->catid) && $item->created_by == $userId;
			$canChange	= $user->authorise('core.edit.state',	'com_djimageslider.category.'.$item->catid) && $canCheckin;

			?>
			<tr class="row<?php echo $i % 2; ?>" sortable-group-id="<?php echo $item->catid ?>" data-draggable-group="<?php echo $item->catid ?>">
			
				<td class="order nowrap center hidden-phone">
					<?php $iconClass = '';
					if (!$canChange) {
						$iconClass = ' inactive';
					} elseif (!$saveOrder) {
						$iconClass = ' inactive tip-top hasTooltip" title="' . JHtml::tooltipText('JORDERINGDISABLED');
					} ?>
					<span class="sortable-handler<?php echo $iconClass ?>">
						<i class="icon-move"></i>
					</span>
					<?php if ($canChange && $saveOrder) : ?>
						<input type="text" style="display:none" name="order[]" size="5" value="<?php echo $item->ordering; ?>" class="width-20 text-area-order " />
					<?php endif; ?>
				</td>
				<td class="center">
					<?php echo JHtml::_('grid.id', $i, $item->id); ?>
				</td>
				<td align="center">
					<?php if ($item->image) : ?>
						<a class="mf-popup" href="<?php echo $item->image; ?>"><img src="<?php echo $item->image; ?>" alt="<?php echo $this->escape($item->title); ?>" style="border: 1px solid #ccc; padding: 1px; max-height: 40px; max-width: 60px;" /></a>
					<?php endif; ?>
				</td>
				<td>
					<?php if ($item->checked_out) : ?>
						<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'items.', $canCheckin); ?>
					<?php endif; ?>
					<?php if ($canEdit || $canEditOwn) : ?>
						<a href="<?php echo JRoute::_('index.php?option=com_djimageslider&task=item.edit&id='.(int) $item->id); ?>">
							<?php echo $this->escape($item->title); ?></a>
					<?php else : ?>
						<?php echo $this->escape($item->title); ?>
					<?php endif; ?>
					<div class="smallsub small">
						<?php 
						$desc = strip_tags($item->description);
						if(function_exists('mb_substr')) {
							echo mb_substr($desc,0,120); if(strlen($desc) > 120) echo '...';
						} else {
							echo substr($desc,0,120); if(strlen($desc) > 120) echo '...';
						} ?>
					</div>
				</td>
				<td class="center">
					<?php echo JHtml::_('jgrid.published', $item->published, $i, 'items.', true, 'cb'	); ?>
				</td>
			
				<td align="center">
					<?php echo $item->category_title; ?>
				</td>
				<td align="center">
					<?php echo $item->id; ?>
				</td>
			</tr>
		<?php endforeach; ?>
		</tbody>
	</table>
	<div>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
		<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
</div>

</div>

<div class="clr" style="clear: both"></div>
<?php echo DJIMAGESLIDERFOOTER; ?>
components/com_djimageslider/views/items/tmpl/index.html000060400000000054152453623460017626 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_djimageslider/config.xml000060400000001025152453623460014365 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>

	<!-- fieldset name="component"
		label="COM_DJIMAGESLIDER_CONFIG_GLOBAL_SETTINGS_LABEL"
		description="COM_DJIMAGESLIDER_CONFIG_GLOBAL_SETTINGS_DESC">
		
 	</fieldset-->
 	
 	<fieldset name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
	>

		<field name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			validate="rules"
			filter="rules"
			component="com_djimageslider"
			section="component" />
	</fieldset>
 	
</config>
components/com_djimageslider/access.xml000060400000002405152453623460014364 0ustar00<?xml version="1.0" encoding="utf-8"?>
<access component="com_djimageslider">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
	</section>
	<section name="category">
		<action name="core.create" title="JACTION_CREATE" description="COM_CATEGORIES_ACCESS_CREATE_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="COM_CATEGORIES_ACCESS_DELETE_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="COM_CATEGORIES_ACCESS_EDIT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_CATEGORIES_ACCESS_EDITSTATE_DESC" />
		<action name="core.edit.own" title="JACTION_EDITOWN" description="COM_CATEGORIES_ACCESS_EDITOWN_DESC" />
	</section>
</access>
components/com_djimageslider/controllers/cpanel.php000060400000002410152453623460016716 0ustar00<?php
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */

// No direct access
defined('_JEXEC') or die;

jimport('joomla.application.component.controllerform');

class DJImageSliderControllerCPanel extends JControllerLegacy {
	
	function __construct($config = array())
	{
		parent::__construct($config);
	}
	
}

?>components/com_djimageslider/controllers/item.php000060400000002261152453623460016416 0ustar00<?php
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */

// No direct access
defined('_JEXEC') or die;

jimport('joomla.application.component.controllerform');

class DJImageSliderControllerItem extends JControllerForm {
}

?>components/com_djimageslider/controllers/index.html000060400000000000152453623460016731 0ustar00components/com_djimageslider/controllers/items.php000060400000002564152453623460016607 0ustar00<?php
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */

// No direct access.
defined('_JEXEC') or die;

jimport('joomla.application.component.controlleradmin');

class DJImageSliderControllerItems extends JControllerAdmin
{
	public function getModel($name = 'Item', $prefix = 'DJImageSliderModel', $config = array('ignore_request' => true))
	{
		$model = parent::getModel($name, $prefix, $config);

		return $model;
	}
}components/com_djimageslider/tables/index.html000060400000000054152453623460015646 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_djimageslider/tables/item.php000060400000004027152453623460015324 0ustar00<?php
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */

// no direct access
defined('_JEXEC') or die('Restricted access');

class DJImageSliderTableItem extends JTable
{
	public function __construct(&$db) {
		parent::__construct('#__djimageslider', 'id', $db);
	}

	function bind($array, $ignore = '')
	{
		if (isset($array['params']) && is_array($array['params'])) {
			$registry = new JRegistry();
			$registry->loadArray($array['params']);
			$array['params'] = (string)$registry;
		}
		
		if(empty($array['alias'])) {
			$array['alias'] = $array['title'];
		}
		$array['alias'] = JFilterOutput::stringURLSafe($array['alias']);
		if(trim(str_replace('-','',$array['alias'])) == '') {
			$array['alias'] = JFactory::getDate()->format("Y-m-d-H-i-s");
		}
		
		return parent::bind($array, $ignore);
	}
	
	public function store($updateNulls = false)
	{
		$isNew = ($this->id==0 ? true : false);
		$success = parent::store($updateNulls);
		if($isNew && $success && JFactory::getApplication()->input->get('view') == 'item') {
			$this->reorder('catid = '.$this->catid);
		}
		return $success;
	}
}
components/com_djimageslider/language/index.html000060400000000000152453623460016146 0ustar00components/com_djimageslider/language/ru-RU/ru-RU.com_djimageslider.sys.ini000060400000001544152453623460023071 0ustar00; Note : All ini files need to be saved as UTF-8

COM_DJIMAGESLIDER="DJ-ImageSlider"
COM_DJIMAGESLIDER_SLIDES="Слайды категории"
COM_DJIMAGESLIDER_CATEGORIES="Категории"

COM_DJIMAGESLIDER_DESCRIPTION="<strong>Thank you for installing DJ-ImageSlider!</strong><br /><br />The DJ-ImageSlider extension allows you to display image slides with title and short description linked to any menu item, article or custom url address. If you want to learn how to use DJ-ImageSlider please read <a href="_QQ_"http://dj-extensions.com/documentation"_QQ_">Documentation</a> and search our <a href="_QQ_"http://dj-extensions.com/forum"_QQ_">Support Forum</a><br /><br />Check out our other extensions at <a href="_QQ_"http://dj-extensions.com"_QQ_"><img scr="_QQ_"components/com_djimageslider/assets/logo.png"_QQ_" alt="_QQ_"DJ-Extensions.com"_QQ_" /></a>"components/com_djimageslider/language/ru-RU/ru-RU.com_djimageslider.ini000060400000005126152453623460022254 0ustar00; Note : All ini files need to be saved as UTF-8
; Translation is incomplete
COM_DJIMAGESLIDER="DJ-ImageSlider"
COM_DJIMAGESLIDER_SUBMENU_CPANEL="Control Panel"
COM_DJIMAGESLIDER_SUBMENU_SLIDES="Слайды"
COM_DJIMAGESLIDER_SUBMENU_CATEGORIES="Категории"
COM_DJIMAGESLIDER_NEW_SLIDE="New Slide"
COM_DJIMAGESLIDER_NEW_CATEGORY="New Category"
COM_DJIMAGESLIDER_DOCUMENTATION="Documentation"
COM_DJIMAGESLIDER_CONFIGURATION="DJ-ImageSlider Options"
COM_DJIMAGESLIDER_SLIDES="Слайды"

COM_DJIMAGESLIDER_ITEM="Слайд"
COM_DJIMAGESLIDER_NEW="New"
COM_DJIMAGESLIDER_EDIT="Edit"
COM_DJIMAGESLIDER_IMAGE="Slide image"
COM_DJIMAGESLIDER_DESCRIPTION="Slide description"
COM_DJIMAGESLIDER_DESCRIPTION_DESC="Use introtext of linked article or product as a slide description by leaving this field empty"
COM_DJIMAGESLIDER_PUBLISH_UP="Start Publishing"
COM_DJIMAGESLIDER_PUBLISH_UP_DESC="An optional date to Start Publishing the slide"
COM_DJIMAGESLIDER_PUBLISH_DOWN="Finish Publishing"
COM_DJIMAGESLIDER_PUBLISH_DOWN_DESC="An optional date to Finish Publishing the slide"

COM_DJIMAGESLIDER_LINK_TYPE="Link type"
COM_DJIMAGESLIDER_DO_NOT_LINK="Don't link"
COM_DJIMAGESLIDER_LINK_TYPE_DESC="Choose the link target of this slide"
COM_DJIMAGESLIDER_MENU="Menu item"
COM_DJIMAGESLIDER_URL="Адрес URL"
COM_DJIMAGESLIDER_ARTICLE="Article"
COM_DJIMAGESLIDER_DJCATALOG2_ITEM="DJCatalog2 Product"
COM_DJIMAGESLIDER_LINK_TARGET="Target Window"
COM_DJIMAGESLIDER_LINK_TARGET_DESC="Target browser window when the link is clicked. Leave 'Auto' to let the module choose based on link."
COM_DJIMAGESLIDER_AUTO="Auto"
COM_DJIMAGESLIDER_PARENT_WINDOW="Parent Window"
COM_DJIMAGESLIDER_NEW_WINDOW="New Window"

COM_DJIMAGESLIDER_SEARCH_IN_TITLE="Search in title"

COM_DJIMAGESLIDER_N_ITEMS_DELETED="%s slides deleted."
COM_DJIMAGESLIDER_N_ITEMS_DELETED_1="%s slide deleted."
COM_DJIMAGESLIDER_N_ITEMS_PUBLISHED="%s slides published."
COM_DJIMAGESLIDER_N_ITEMS_PUBLISHED_1="%s slide published."
COM_DJIMAGESLIDER_N_ITEMS_UNPUBLISHED="%s slides unpublished."
COM_DJIMAGESLIDER_N_ITEMS_UNPUBLISHED_1="%s slide unpublished."
COM_DJIMAGESLIDER_N_ITEMS_CHECKED_IN="%s slides checked in."
COM_DJIMAGESLIDER_N_ITEMS_CHECKED_IN_1="%s slide checked in."

COM_DJIMAGESLIDER_VALIDATION_FORM_FAILED="Please fill in the required fields"

COM_CONTENT_CHANGE_ARTICLE_BUTTON="Select / Change"
COM_CONTENT_SELECT_AN_ARTICLE="Select an article"

COM_DJIMAGESLIDER_CONFIG_GLOBAL_SETTINGS_LABEL="Ustawienia"
COM_DJIMAGESLIDER_CONFIG_GLOBAL_SETTINGS_DESC="Nie ma żadnych ustawień dla komponentu DJ-ImageSlider. Cała konfiguracja znajduje się w parametrach modułu."
components/com_djimageslider/language/ru-RU/index.html000060400000000000152453623460017120 0ustar00components/com_djimageslider/language/en-GB/en-GB.com_djimageslider.ini000060400000006254152453623460022113 0ustar00; Note : All ini files need to be saved as UTF-8

COM_DJIMAGESLIDER="DJ-ImageSlider"
COM_DJIMAGESLIDER_SUBMENU_CPANEL="Control Panel"
COM_DJIMAGESLIDER_SUBMENU_SLIDES="Slides"
COM_DJIMAGESLIDER_SUBMENU_CATEGORIES="Categories"
COM_DJIMAGESLIDER_NEW_SLIDE="New Slide"
COM_DJIMAGESLIDER_NEW_CATEGORY="New Category"
COM_DJIMAGESLIDER_DOCUMENTATION="Documentation"
COM_DJIMAGESLIDER_CONFIGURATION="DJ-ImageSlider Options"
COM_DJIMAGESLIDER_SLIDES="Slides"

COM_DJIMAGESLIDER_ITEM="Slide"
COM_DJIMAGESLIDER_NEW="New"
COM_DJIMAGESLIDER_NEW_SLIDE="New Slide"
COM_DJIMAGESLIDER_EDIT="Edit"
COM_DJIMAGESLIDER_EDIT_SLIDE="Edit Slide"
COM_DJIMAGESLIDER_IMAGE="Slide image"
COM_DJIMAGESLIDER_DESCRIPTION="Slide description"
COM_DJIMAGESLIDER_DESCRIPTION_DESC="Use introtext of linked article or product as a slide description by leaving this field empty"
COM_DJIMAGESLIDER_PUBLISHING_OPTIONS="Publishing Options"
COM_DJIMAGESLIDER_PUBLISH_UP="Start Publishing"
COM_DJIMAGESLIDER_PUBLISH_UP_DESC="An optional date to Start Publishing the slide"
COM_DJIMAGESLIDER_PUBLISH_DOWN="Finish Publishing"
COM_DJIMAGESLIDER_PUBLISH_DOWN_DESC="An optional date to Finish Publishing the slide"

COM_DJIMAGESLIDER_LINKING_OPTIONS="Linking Options"
COM_DJIMAGESLIDER_LINK_TYPE="Link type"
COM_DJIMAGESLIDER_DO_NOT_LINK="Don't link"
COM_DJIMAGESLIDER_LINK_TYPE_DESC="Choose the link target of this slide"
COM_DJIMAGESLIDER_MENU="Menu item"
COM_DJIMAGESLIDER_URL="URL address"
COM_DJIMAGESLIDER_ARTICLE="Article"
COM_DJIMAGESLIDER_DJCATALOG2_ITEM="DJCatalog2 Product"
COM_DJIMAGESLIDER_LINK_TARGET="Target Window"
COM_DJIMAGESLIDER_LINK_TARGET_DESC="Target browser window when the link is clicked. Leave 'Auto' to let the module choose based on link."
COM_DJIMAGESLIDER_AUTO="Auto"
COM_DJIMAGESLIDER_PARENT_WINDOW="Parent Window"
COM_DJIMAGESLIDER_NEW_WINDOW="New Window"

COM_DJIMAGESLIDER_SEARCH_IN_TITLE="Search in title"

COM_DJIMAGESLIDER_N_ITEMS_DELETED="%s slides deleted."
COM_DJIMAGESLIDER_N_ITEMS_DELETED_1="%s slide deleted."
COM_DJIMAGESLIDER_N_ITEMS_PUBLISHED="%s slides published."
COM_DJIMAGESLIDER_N_ITEMS_PUBLISHED_1="%s slide published."
COM_DJIMAGESLIDER_N_ITEMS_UNPUBLISHED="%s slides unpublished."
COM_DJIMAGESLIDER_N_ITEMS_UNPUBLISHED_1="%s slide unpublished."
COM_DJIMAGESLIDER_N_ITEMS_CHECKED_IN="%s slides checked in."
COM_DJIMAGESLIDER_N_ITEMS_CHECKED_IN_1="%s slide checked in."

COM_DJIMAGESLIDER_VALIDATION_FORM_FAILED="Please fill in the required fields"

COM_CONTENT_CHANGE_ARTICLE_BUTTON="Select / Change"
COM_CONTENT_SELECT_AN_ARTICLE="Select an article"

COM_DJIMAGESLIDER_CONFIG_GLOBAL_SETTINGS_LABEL="Preferences"
COM_DJIMAGESLIDER_CONFIG_GLOBAL_SETTINGS_DESC="There's no options for DJ-ImageSlider component. All settings can be done with module parameters."

COM_DJIMAGESLIDER_LINK_REL="REL Attribute"
COM_DJIMAGESLIDER_LINK_REL_DESC="The rel attribute specifies the relationship between the current document and the linked document"

COM_DJIMAGESLIDER_IMAGE_ATTR_OPTIONS="Image attributes"
COM_DJIMAGESLIDER_ALT_ATTR="ALT attribute"
COM_DJIMAGESLIDER_ALT_ATTR_DESC="If empty then slide title will be used"
COM_DJIMAGESLIDER_TITLE_ATTR="TITLE attribute"
COM_DJIMAGESLIDER_TITLE_ATTR_DESC="If empty then no title attribute will be used"
components/com_djimageslider/language/en-GB/en-GB.com_djimageslider.sys.ini000060400000001500152453623460022715 0ustar00; Note : All ini files need to be saved as UTF-8

COM_DJIMAGESLIDER="DJ-ImageSlider"
COM_DJIMAGESLIDER_SLIDES="Slides"
COM_DJIMAGESLIDER_CATEGORIES="Categories"

COM_DJIMAGESLIDER_DESCRIPTION="<strong>Thank you for installing DJ-ImageSlider!</strong><br /><br />The DJ-ImageSlider extension allows you to display image slides with title and short description linked to any menu item, article or custom url address. If you want to learn how to use DJ-ImageSlider please read <a href="_QQ_"http://dj-extensions.com/documentation"_QQ_">Documentation</a> and search our <a href="_QQ_"http://dj-extensions.com/forum"_QQ_">Support Forum</a><br /><br />Check out our other extensions at <a href="_QQ_"http://dj-extensions.com"_QQ_"><img scr="_QQ_"components/com_djimageslider/assets/logo.png"_QQ_" alt="_QQ_"DJ-Extensions.com"_QQ_" /></a>"components/com_djimageslider/language/en-GB/index.html000060400000000000152453623460017036 0ustar00components/com_djimageslider/language/pl-PL/index.html000060400000000000152453623460017072 0ustar00components/com_djimageslider/language/pl-PL/pl-PL.com_djimageslider.ini000060400000005100152453623460022170 0ustar00; Note : All ini files need to be saved as UTF-8

COM_DJIMAGESLIDER="DJ-ImageSlider"
COM_DJIMAGESLIDER_SUBMENU_CPANEL="Pulpit"
COM_DJIMAGESLIDER_SUBMENU_SLIDES="Slajdy"
COM_DJIMAGESLIDER_SUBMENU_CATEGORIES="Kategorie"
COM_DJIMAGESLIDER_NEW_SLIDE="Nowy slajd"
COM_DJIMAGESLIDER_NEW_CATEGORY="Nowa kategoria"
COM_DJIMAGESLIDER_DOCUMENTATION="Documentation"
COM_DJIMAGESLIDER_CONFIGURATION="Ustawienia DJ-ImageSlider"
COM_DJIMAGESLIDER_SLIDES="Slajdy"

COM_DJIMAGESLIDER_ITEM="Slajd"
COM_DJIMAGESLIDER_NEW="Nowy"
COM_DJIMAGESLIDER_EDIT="Edycja"
COM_DJIMAGESLIDER_IMAGE="Obraz"
COM_DJIMAGESLIDER_DESCRIPTION="Opis slajdu"
COM_DJIMAGESLIDER_DESCRIPTION_DESC="Użyj wstępu artykułu lub produktu jako opis slajdu pozostawiając puste pole opisu."
COM_DJIMAGESLIDER_PUBLISH_UP="Start Publishing"
COM_DJIMAGESLIDER_PUBLISH_UP_DESC="An optional date to Start Publishing the slide"
COM_DJIMAGESLIDER_PUBLISH_DOWN="Finish Publishing"
COM_DJIMAGESLIDER_PUBLISH_DOWN_DESC="An optional date to Finish Publishing the slide"

COM_DJIMAGESLIDER_LINK_TYPE="Rodzaj odnośnika"
COM_DJIMAGESLIDER_DO_NOT_LINK="Bez odnośnika"
COM_DJIMAGESLIDER_LINK_TYPE_DESC="Wybierz rodzaj odnośnika"
COM_DJIMAGESLIDER_MENU="Element menu"
COM_DJIMAGESLIDER_URL="Adres URL"
COM_DJIMAGESLIDER_ARTICLE="Artykuł"
COM_DJIMAGESLIDER_DJCATALOG2_ITEM="Produkt z DJCatalog2"
COM_DJIMAGESLIDER_LINK_TARGET="Otwórz w"
COM_DJIMAGESLIDER_LINK_TARGET_DESC="Określ, gdzie otworzyć ten link po jego kliknięciu. Ustaw na 'Auto', aby moduł wybrał automatycznie na podstawie linku."
COM_DJIMAGESLIDER_AUTO="Auto"
COM_DJIMAGESLIDER_PARENT_WINDOW="W tym samym oknie"
COM_DJIMAGESLIDER_NEW_WINDOW="W nowym oknie"

COM_DJIMAGESLIDER_SEARCH_IN_TITLE="Szukaj w tytule"

COM_DJIMAGESLIDER_N_ITEMS_DELETED="Usunięto %s slajdów."
COM_DJIMAGESLIDER_N_ITEMS_DELETED_1="Usunięto %s slajd."
COM_DJIMAGESLIDER_N_ITEMS_PUBLISHED="Opublikowano %s slajdów."
COM_DJIMAGESLIDER_N_ITEMS_PUBLISHED_1="Opublikowano %s slajd."
COM_DJIMAGESLIDER_N_ITEMS_UNPUBLISHED="Odpublikowano %s slajdów."
COM_DJIMAGESLIDER_N_ITEMS_UNPUBLISHED_1="Odpublikowano %s slajd."
COM_DJIMAGESLIDER_N_ITEMS_CHECKED_IN="Odblokowano %s slajdów."
COM_DJIMAGESLIDER_N_ITEMS_CHECKED_IN_1="Odblokowano %s slajd."

COM_DJIMAGESLIDER_VALIDATION_FORM_FAILED="Proszę wypełnić wymagane pola"

COM_CONTENT_CHANGE_ARTICLE_BUTTON="Wybierz / Zmień"
COM_CONTENT_SELECT_AN_ARTICLE="Wybierz artykuł"

COM_DJIMAGESLIDER_CONFIG_GLOBAL_SETTINGS_LABEL="Ustawienia"
COM_DJIMAGESLIDER_CONFIG_GLOBAL_SETTINGS_DESC="Nie ma żadnych ustawień dla komponentu DJ-ImageSlider. Cała konfiguracja znajduje się w parametrach modułu."
components/com_djimageslider/language/pl-PL/pl-PL.com_djimageslider.sys.ini000060400000001477152453623460023022 0ustar00; Note : All ini files need to be saved as UTF-8

COM_DJIMAGESLIDER="DJ-ImageSlider"
COM_DJIMAGESLIDER_SLIDES="Slajdy"
COM_DJIMAGESLIDER_CATEGORIES="Kategorie"

COM_DJIMAGESLIDER_DESCRIPTION="<strong>Thank you for installing DJ-ImageSlider!</strong><br /><br />The DJ-ImageSlider extension allows you to display image slides with title and short description linked to any menu item, article or custom url address. If you want to learn how to use DJ-ImageSlider please read <a href="_QQ_"http://dj-extensions.com/documentation"_QQ_">Documentation</a> and search our <a href="_QQ_"http://dj-extensions.com/forum"_QQ_">Support Forum</a><br /><br />Check out our other extensions at <a href="_QQ_"http://dj-extensions.com"_QQ_"><img scr="_QQ_"components/com_djimageslider/assets/logo.png"_QQ_" alt="_QQ_"DJ-Extensions.com"_QQ_" /></a>"components/com_djimageslider/sql/updates/4.0.sql000060400000000203152453623460015661 0ustar00ALTER TABLE #__djimageslider 
CHANGE `description` `description` text DEFAULT NULL,
CHANGE `params` `params` text DEFAULT NULL;
components/com_djimageslider/sql/updates/1.3.sql000060400000000000152453623460015654 0ustar00components/com_djimageslider/sql/updates/2.0.sql000060400000000247152453623460015667 0ustar00ALTER TABLE `#__djimageslider` ADD `publish_up` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
ADD `publish_down` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00';
components/com_djimageslider/sql/updates/4.1.1.sql000060400000004517152453623460016035 0ustar00INSERT INTO `#__content_types` (`type_title`, `type_alias`, `table`, `rules`, `field_mappings`, `router`,
                                   `content_history_options`)
VALUES ('DJ-ImageSlider Category', 'com_djimageslider.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\"}}',
        'ContentHelperRoute::getCategoryRoute',
        '{\"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\"}]}');
components/com_djimageslider/sql/install.sql000060400000001376152453623460015375 0ustar00CREATE TABLE IF NOT EXISTS `#__djimageslider` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `catid` int(10) unsigned NOT NULL default '0',
  `title` varchar(255) NOT NULL,
  `alias` varchar(255) NOT NULL default '',
  `image` varchar(255) NOT NULL,
  `description` text DEFAULT NULL,
  `published` tinyint(1) NOT NULL default '0',
  `publish_up` datetime NOT NULL default '0000-00-00 00:00:00',
  `publish_down` datetime NOT NULL default '0000-00-00 00:00:00',
  `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 DEFAULT NULL,
  PRIMARY KEY  (`id`),
  KEY `catid` (`catid`,`published`)
) DEFAULT CHARSET=utf8;
components/com_djimageslider/sql/index.html000060400000000000152453623460015162 0ustar00components/com_djimageslider/sql/uninstall.sql000060400000000040152453623460015723 0ustar00DROP TABLE `#__djimageslider`;
components/com_djimageslider/helpers/djimageslider.php000060400000005377152453623460017372 0ustar00<?php
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */

defined('_JEXEC') or die;

abstract class DJImageSliderHelper
{
	
	public static function addSubmenu($vName)
	{
		if($vName=='item' || $vName=='category') return;
		$version = new JVersion;
		
		if (version_compare($version->getShortVersion(), '3.0.0', '<')) {
			
			JSubMenuHelper::addEntry(
				JText::_('COM_DJIMAGESLIDER_SUBMENU_CPANEL'),
				'index.php?option=com_djimageslider',
				$vName == 'cpanel'
			);
			JSubMenuHelper::addEntry(
				JText::_('COM_DJIMAGESLIDER_SUBMENU_SLIDES'),
				'index.php?option=com_djimageslider&view=items',
				$vName == 'items'
			);
			JSubMenuHelper::addEntry(
				JText::_('COM_DJIMAGESLIDER_SUBMENU_CATEGORIES'),
				'index.php?option=com_categories&extension=com_djimageslider',
				$vName == 'categories'
			);
	
			
		} else {
			
			JHtmlSidebar::addEntry(
				JText::_('COM_DJIMAGESLIDER_SUBMENU_CPANEL'),
				'index.php?option=com_djimageslider',
				$vName == 'cpanel'
			);
			JHtmlSidebar::addEntry(
				JText::_('COM_DJIMAGESLIDER_SUBMENU_SLIDES'),
				'index.php?option=com_djimageslider&view=items',
				$vName == 'items'
			);
			JHtmlSidebar::addEntry(
				JText::_('COM_DJIMAGESLIDER_SUBMENU_CATEGORIES'),
				'index.php?option=com_categories&extension=com_djimageslider',
				$vName == 'categories'
			);
		}
		
		if ($vName=='categories') {
			JToolBarHelper::title(
			JText::sprintf('COM_DJIMAGESLIDER_CATEGORIES_TITLE',JText::_('com_djimageslider')),
			'slider-categories');
		}
	}
	
	public static function getBSClasses() {
	
		$classes = new JObject;
	
		if(version_compare(JVERSION, '4', '>=')) { // Bootstrap 4
			$classes->set('row', 'row');
			$classes->set('col', 'col-md-');
		} else { // Boostrap 2.3.2
			$classes->set('row', 'row-fluid');
			$classes->set('col', 'span');
		}
	
		return $classes;
	}
	
}
?>components/com_djimageslider/helpers/index.html000060400000000000152453623460016025 0ustar00components/com_djimageslider/helpers/category.php000060400000002713152453623460016373 0ustar00<?php
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */


defined('_JEXEC') or die;


class DJImageSliderCategories extends JCategories
{
    /**
     * Class constructor
     *
     * @param   array  $options  Array of options
     *
     * @since   11.1
     */
    public function __construct($options = array())
    {
        $options['table'] = '#__djimageslider` ';
        $options['extension'] = 'com_djimageslider';
        $options['field'] = 'catid';
        parent::__construct($options);
    }
}components/com_djimageslider/controller.php000060400000002721152453623460015276 0ustar00<?php
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */

// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die;

class DJImageSliderController extends JControllerLegacy
{
	protected $default_view = 'cpanel';
	
	public function display($cachable = false, $urlparams = false)
	{
		$app = JFactory::getApplication();
		require_once JPATH_COMPONENT.'/helpers/djimageslider.php';
		DJImageSliderHelper::addSubmenu($app->input->getCmd('view', 'cpanel'));
		parent::display();

		return $this;
	}
}components/com_djimageslider/models/items.php000060400000010606152453623460015520 0ustar00<?php
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */

// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die( 'Restricted access' );

jimport('joomla.application.component.modellist');

class DJImageSliderModelItems extends JModelList
{
	public function __construct($config = array())
	{
		if (empty($config['filter_fields'])) {
			$config['filter_fields'] = array(
				'id', 'a.id',
				'title', 'a.title',
				'alias', 'a.alias',
				'catid', 'a.catid', 'category_title',
				'ordering', 'a.ordering',
				'checked_out', 'a.checked_out',
				'checked_out_time', 'a.checked_out_time',
				'published', 'a.published',
				'access', 'a.access', 'access_level',
				'created', 'a.created',
				'created_by', 'a.created_by',
				'language', 'a.language'
			);
		}

		parent::__construct($config);
	}
	
	protected function populateState($ordering = null, $direction = null)
	{
		// Initialise variables.
		$app = JFactory::getApplication();

		$search = $this->getUserStateFromRequest($this->context.'.filter.search', 'filter_search');
		$this->setState('filter.search', $search);

		$published = $this->getUserStateFromRequest($this->context.'.filter.published', 'filter_published', '');
		$this->setState('filter.published', $published);

		$category = $this->getUserStateFromRequest($this->context.'.filter.category', 'filter_category', '');
		$this->setState('filter.category', $category);
		
		// List state information.
		parent::populateState('a.ordering', 'asc');
	}

	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id	.= ':'.$this->getState('filter.search');
		$id	.= ':'.$this->getState('filter.published');
		$id	.= ':'.$this->getState('filter.category');
		
		return parent::getStoreId($id);
	}
	
	protected function getListQuery()
	{
		// 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.*'
			)
		);
		$query->from('#__djimageslider AS a');
		
		// Join over the categories.
		$query->select('c.title AS category_title');
		$query->join('LEFT', '#__categories AS c ON c.id = a.catid');
		
		// Join over the users for the checked out user.
		$query->select('uc.name AS editor');
		$query->join('LEFT', '#__users AS uc ON uc.id=a.checked_out');
		
		// Filter by published state
		$published = $this->getState('filter.published');
		if (is_numeric($published)) {
			$query->where('a.published = ' . (int) $published);
		}
		else if ($published === '') {
			$query->where('(a.published = 0 OR a.published = 1)');
		}
		
		// Filter by category state
		$category = $this->getState('filter.category');
		if (is_numeric($category)) {
			$query->where('a.catid = ' . (int) $category);
		}
		
		// 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('%'.$db->escape($search, true).'%');
				$query->where('(a.title LIKE '.$search.' OR a.alias LIKE '.$search.')');
			}
		}
		
		// Add the list ordering clause.
		$orderCol	= $this->state->get('list.ordering');
		$orderDirn	= $this->state->get('list.direction');
		if ($orderCol == 'a.ordering' || $orderCol == 'category_title') {
			$orderCol = 'category_title '.$orderDirn.', a.ordering';
		}
		$query->order($db->escape($orderCol.' '.$orderDirn));
		
		return $query;
	}
	
}
components/com_djimageslider/models/index.html000060400000000054152453623460015657 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_djimageslider/models/cpanel.php000060400000002310152453623460015632 0ustar00<?php
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */

defined('_JEXEC') or die;

jimport( 'joomla.application.component.model');


class DJImageSliderModelCPanel extends JModelLegacy {

	function __construct()
	{
		parent::__construct();
	}
}
?>
components/com_djimageslider/models/forms/item.xml000060400000011537152453623460016500 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form
	addfieldpath="/administrator/components/com_djcatalog2/models/fields">
	<fieldset addfieldpath="/administrator/components/com_categories/models/fields">
		<field name="id"
			type="text"
			label="JGLOBAL_FIELD_ID_LABEL"
			description="JGLOBAL_FIELD_ID_DESC"
			size="10"
			default="0"
			readonly="true"
			class="readonly"
		/>
		
		<field name="catid"
			type="category"
			extension="com_djimageslider"
			label="JCATEGORY"
			description="JFIELD_CATEGORY_DESC"
			class="inputbox"
			required="true"
		/>
		
		<field name="title"
			type="text"
			label="JGLOBAL_TITLE"
			description="JGLOBAL_TITLE"
			class="inputbox"
			size="30"
			required="true"
		 />
		 
		 <field name="alias"
			type="text"
			label="JFIELD_ALIAS_LABEL"
			description="JFIELD_ALIAS_DESC"
			class="inputbox"
			size="30"
		/>
		
		<field name="image"
			type="media"
			hide_none="1"
			label="COM_DJIMAGESLIDER_IMAGE"
			description="COM_DJIMAGESLIDER_IMAGE"
			
		/>
		
		<field name="description" type="editor"
			label="COM_DJIMAGESLIDER_DESCRIPTION"
			description="COM_DJIMAGESLIDER_DESCRIPTION_DESC"
			class="inputbox"
			filter="JComponentHelper::filterText"
			buttons="false"
		/>
		
		<field id="published"
			name="published"
			type="list"
			label="JSTATUS"
			description="JFIELD_PUBLISHED_DESC"
			class="inputbox"
			size="1"
			default="1"
		>
			<option value="1">
				JPUBLISHED</option>
			<option value="0">
				JUNPUBLISHED</option>			
		</field>
		
		<field name="publish_up" type="calendar"
			label="COM_DJIMAGESLIDER_PUBLISH_UP" description="COM_DJIMAGESLIDER_PUBLISH_UP_DESC"
			class="inputbox" format="%Y-%m-%d %H:%M:%S" size="22"
			filter="user_utc" />

		<field name="publish_down" type="calendar"
			label="COM_DJIMAGESLIDER_PUBLISH_DOWN" description="COM_DJIMAGESLIDER_PUBLISH_DOWN_DESC"
			class="inputbox" format="%Y-%m-%d %H:%M:%S" size="22"
			filter="user_utc" />
		
		<field name="checked_out"
			type="hidden"
			filter="unset"
		/>

		<field name="checked_out_time"
			type="hidden"
			filter="unset"
		/>
			
	</fieldset>
	
	<fields name="params">
		<fieldset name="jbasic"	label="COM_DJIMAGESLIDER_LINKING_OPTIONS"
			addfieldpath="/administrator/components/com_content/models/fields" >
		
			<field name="link_type" 
				type="list" 
				label="COM_DJIMAGESLIDER_LINK_TYPE"
				description="COM_DJIMAGESLIDER_LINK_TYPE_DESC" 
				default=""
			>
				<option value="">COM_DJIMAGESLIDER_DO_NOT_LINK</option>
				<option value="menu">COM_DJIMAGESLIDER_MENU</option>
				<option value="url">COM_DJIMAGESLIDER_URL</option>
				<option value="article">COM_DJIMAGESLIDER_ARTICLE</option>
				<!--option value="djc2_item">COM_DJIMAGESLIDER_DJCATALOG2_ITEM</option-->
			</field>
			
			<field name="link_menu" 
				type="menuitem"
				label="COM_DJIMAGESLIDER_MENU"
				description="COM_DJIMAGESLIDER_MENU"
				disable="separator,heading,alias"
				showon="link_type:menu"
			/>
			<field name="link_url"
				type="text"
				label="COM_DJIMAGESLIDER_URL"
				description="COM_DJIMAGESLIDER_URL"
				class="inputbox"
				size="30"
				showon="link_type:url"
			/>
			<field name="link_article" 
				type="modal_article"
				label="COM_DJIMAGESLIDER_ARTICLE" 
				description="COM_DJIMAGESLIDER_ARTICLE"
				showon="link_type:article"
			/>
			
			<field name="link_target" 
				type="list" 
				label="COM_DJIMAGESLIDER_LINK_TARGET"
				description="COM_DJIMAGESLIDER_LINK_TARGET_DESC" 
				default=""
				showon="link_type:menu,url,article"
			>
				<option value="">COM_DJIMAGESLIDER_AUTO</option>
				<option value="_self">COM_DJIMAGESLIDER_PARENT_WINDOW</option>
				<option value="_blank">COM_DJIMAGESLIDER_NEW_WINDOW</option>
			</field>
			
			<field name="link_rel" 
				type="list" 
				label="COM_DJIMAGESLIDER_LINK_REL"
				description="COM_DJIMAGESLIDER_LINK_REL_DESC" 
				default=""
				showon="link_type:menu,url,article"
			>
				<option value="">JNONE</option>
				<option value="alternate">alternate</option>
				<option value="author">author</option>
				<option value="bookmark">bookmark</option>
				<option value="help">help</option>
				<option value="license">license</option>
				<option value="next">next</option>
				<option value="nofollow">nofollow</option>
				<option value="noreferrer">noreferrer</option>
				<option value="prefetch">prefetch</option>
				<option value="prev">prev</option>
				<option value="search">search</option>
				<option value="tag">tag</option>
			</field>
			
		</fieldset>
		
		<fieldset name="attrs"	label="COM_DJIMAGESLIDER_IMAGE_ATTR_OPTIONS">
			<field name="alt_attr"
				type="text"
				label="COM_DJIMAGESLIDER_ALT_ATTR"
				description="COM_DJIMAGESLIDER_ALT_ATTR_DESC"
				class="inputbox"
				size="30"
			/>
			<field name="title_attr"
				type="text"
				label="COM_DJIMAGESLIDER_TITLE_ATTR"
				description="COM_DJIMAGESLIDER_TITLE_ATTR_DESC"
				class="inputbox"
				size="30"
			/>
		</fieldset>
	</fields>
</form>components/com_djimageslider/models/forms/index.html000060400000000054152453623460017005 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_djimageslider/models/forms/filter_items.xml000060400000001415152453623460020222 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			hint="COM_DJIMAGESLIDER_SEARCH_IN_TITLE"
		/>


		<field
				name="published"
				type="status"
				label="JOPTION_SELECT_PUBLISHED"
				onchange="this.form.submit();"
		>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>

		<field
				name="category"
				type="category"
				extension="com_djimageslider"
				class="inputbox"
				default=""
				onchange="this.form.submit();"

		>
			<option value="">JOPTION_SELECT_CATEGORY</option>
		</field>

	</fields>

	<fields name="list">

		<field
			name="limit"
			type="limitbox"
			label="JGLOBAL_LIST_LIMIT"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_djimageslider/models/item.php000060400000007344152453623460015342 0ustar00<?php
/**
 * @version $Id$
 * @package DJ-ImageSlider
 * @subpackage DJ-ImageSlider Component
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 *
 * DJ-ImageSlider 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-ImageSlider 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 DJ-ImageSlider. If not, see <http://www.gnu.org/licenses/>.
 *
 */

// No direct access
defined('_JEXEC') or die;

jimport('joomla.application.component.modeladmin');

class DJImageSliderModelItem extends JModelAdmin
{
	public function getTable($type = 'Item', $prefix = 'DJImageSliderTable', $config = array())
	{
		return JTable::getInstance($type, $prefix, $config);
	}
	
	public function getForm($data = array(), $loadData = true)
	{
		jimport('joomla.form.form');
		JForm::addFieldPath('JPATH_ADMINISTRATOR/components/com_djcatalog2/models/fields');

		// Get the form.
		$form = $this->loadForm('com_djimageslider.item', 'item', array('control' => 'jform', 'load_data' => $loadData));
		if (empty($form)) {
			return false;
		}
		/* not implemented yet
		// Modify the form based on access controls.
		if (!$this->canEditState((object) $data)) {
			// 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;
	}
	
	protected function loadFormData()
	{
		// Check the session for previously entered form data.
		$data = JFactory::getApplication()->getUserState('com_djimageslider.edit.item.data', array());

		if (empty($data)) {
			$data = $this->getItem();

			// Prime some default values.
			if ($this->getState('item.id') == 0) {
				$app = JFactory::getApplication();
				$data->set('catid', $app->input->getInt('catid', $app->getUserState('com_djimageslider.items.filter.category')));
			}
		}

		return $data;
	}
	
	protected function prepareTable($table)
	{
		jimport('joomla.filter.output');
		$date = JFactory::getDate();
		$user = JFactory::getUser();

		$table->title		= htmlspecialchars_decode($table->title, ENT_QUOTES);
		$table->alias		= JFilterOutput::stringURLSafe($table->alias);

		if (empty($table->alias)) {
			$table->alias = JFilterOutput::stringURLSafe($table->title);
		}
		
		// Set the publish date to now
		if($table->published == 1 && intval($table->publish_up) == 0) {
			$table->publish_up = $date->toSql();
		}
		
		if(empty($table->publish_down)) {
			$table->publish_down = JFactory::getDbo()->getNullDate();
		}
		
		/*
		if (empty($table->id)) {

			// Set ordering to the last item if not set
			if (empty($table->ordering)) {
				$db = JFactory::getDbo();
				$db->setQuery('SELECT MAX(ordering) FROM #__djimageslider');
				$max = $db->loadResult();

				$table->ordering = $max+1;
			}
		}
		*/
	}
	
	protected function getReorderConditions($table)
	{
		$condition = array();
		$condition[] = 'catid = '.(int) $table->catid;

		return $condition;
	}
	
}
components/com_djimageslider/models/fields/djfolderlist.php000060400000012414152453623460020331 0ustar00<?php
/**
 * @package     Joomla.Platform
 * @subpackage  Form
 *
 * @copyright   Copyright (C) 2005 - 2016 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

defined('JPATH_PLATFORM') or die;

jimport('joomla.filesystem.folder');
JFormHelper::loadFieldClass('list');

/**
 * Supports an HTML select list of folder
 *
 * @since  11.1
 */
class JFormFieldDJFolderList extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  11.1
	 */
	protected $type = 'DJFolderList';

	/**
	 * The filter.
	 *
	 * @var    string
	 * @since  3.2
	 */
	protected $filter;

	/**
	 * The exclude.
	 *
	 * @var    string
	 * @since  3.2
	 */
	protected $exclude;

	/**
	 * The recursive.
	 *
	 * @var    string
	 * @since  3.6
	 */
	protected $recursive;

	/**
	 * The hideNone.
	 *
	 * @var    boolean
	 * @since  3.2
	 */
	protected $hideNone = false;

	/**
	 * The hideDefault.
	 *
	 * @var    boolean
	 * @since  3.2
	 */
	protected $hideDefault = false;

	/**
	 * The directory.
	 *
	 * @var    string
	 * @since  3.2
	 */
	protected $directory;

	/**
	 * Method to get certain otherwise inaccessible properties from the form field object.
	 *
	 * @param   string  $name  The property name for which to the the value.
	 *
	 * @return  mixed  The property value or null.
	 *
	 * @since   3.2
	 */
	public function __get($name)
	{
		switch ($name)
		{
			case 'filter':
			case 'exclude':
			case 'recursive':
			case 'hideNone':
			case 'hideDefault':
			case 'directory':
				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 the the value.
	 * @param   mixed   $value  The value of the property.
	 *
	 * @return  void
	 *
	 * @since   3.2
	 */
	public function __set($name, $value)
	{
		switch ($name)
		{
			case 'filter':
			case 'directory':
			case 'exclude':
			case 'recursive':
				$this->$name = (string) $value;
				break;

			case 'hideNone':
			case 'hideDefault':
				$value = (string) $value;
				$this->$name = ($value === 'true' || $value === $name || $value === '1');
				break;

			default:
				parent::__set($name, $value);
		}
	}

	/**
	 * Method to attach a JForm object to the field.
	 *
	 * @param   SimpleXMLElement  $element  The SimpleXMLElement object representing the `<field>` 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 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->filter  = (string) $this->element['filter'];
			$this->exclude = (string) $this->element['exclude'];

			$recursive       = (string) $this->element['recursive'];
			$this->recursive = ($recursive == 'true' || $recursive == 'recursive' || $recursive == '1');

			$hideNone       = (string) $this->element['hide_none'];
			$this->hideNone = ($hideNone == 'true' || $hideNone == 'hideNone' || $hideNone == '1');

			$hideDefault       = (string) $this->element['hide_default'];
			$this->hideDefault = ($hideDefault == 'true' || $hideDefault == 'hideDefault' || $hideDefault == '1');

			// Get the path in which to search for file options.
			$this->directory = (string) $this->element['directory'];
		}

		return $return;
	}

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   11.1
	 */
	protected function getOptions()
	{
		$options = array();

		$path = JPath::clean($this->directory);

		if (!is_dir($path))
		{
			$path = JPATH_ROOT . DIRECTORY_SEPARATOR . $path;
		}

		// Prepend some default options based on field attributes.
		if (!$this->hideNone)
		{
			$options[] = JHtml::_('select.option', '-1', JText::alt('JOPTION_DO_NOT_USE', preg_replace('/[^a-zA-Z0-9_\-]/', '_', $this->fieldname)));
		}

		if (!$this->hideDefault)
		{
			$options[] = JHtml::_('select.option', '', JText::alt('JOPTION_USE_DEFAULT', preg_replace('/[^a-zA-Z0-9_\-]/', '_', $this->fieldname)));
		}

		// Get a list of folders in the search path with the given filter.
		$folders = JFolder::folders($path, $this->filter, $this->recursive, true);

		// Build the options list from the list of folders.
		if (is_array($folders))
		{
			foreach ($folders as $folder)
			{
				// Check to see if the file is in the exclude mask.
				if ($this->exclude)
				{
					if (preg_match(chr(1) . $this->exclude . chr(1), $folder))
					{
						continue;
					}
				}

				// Remove the root part and the leading /
				$folder = trim(str_replace($path, '', $folder), '/');

				$options[] = JHtml::_('select.option', $folder, $folder);
			}
		}

		// Merge any additional options in the XML definition.
		$options = array_merge(parent::getOptions(), $options);

		return $options;
	}
}
components/com_djimageslider/models/fields/djspacer.php000060400000007401152453623460017437 0ustar00<?php
/**
 * @version $Id: djspacer.php 31 2015-04-29 14:25:09Z szymon $
 * @package DJ-MediaTools
 * @copyright Copyright (C) 2017 DJ-Extensions.com, All rights reserved.
 * @license http://www.gnu.org/licenses GNU/GPL
 * @author url: http://dj-extensions.com
 * @author email contact@dj-extensions.com
 * @developer Szymon Woronowski - szymon.woronowski@design-joomla.eu
 *
 * DJ-MediaTools 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 3 of the License, or
 * (at your option) any later version.
 *
 * DJ-MediaTools 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 DJ-MediaTools. If not, see <http://www.gnu.org/licenses/>.
 *
 */

defined('JPATH_PLATFORM') or die;

JFormHelper::loadFieldClass('Spacer');

/**
 * Form Field class for the Joomla Platform.
 * Provides spacer markup to be used in form layouts.
 *
 * @package     Joomla.Platform
 * @subpackage  Form
 * @since       11.1
 */
class JFormFieldDJSpacer extends JFormFieldSpacer
{
    /**
     * The form field type.
     *
     * @var    string
     * @since  11.1
     */
    protected $type = 'DJSpacer';

    /**
     * Method to get the field input markup for a spacer.
     * The spacer does not have accept input.
     *
     * @return  string  The field input markup.
     *
     * @since   11.1
     */
    protected function getInput()
    {
        return '';
    }

    /**
     * Method to get the field label markup for a spacer.
     * Use the label text or name from the XML element as the spacer or
     * Use a hr="true" to automatically generate plain hr markup
     *
     * @return  string  The field label markup.
     *
     * @since   11.1
     */
    protected function getLabel()
    {
    	$module = $this->form->getData()->get('module');
    	
    	if($module) {
	    	$lang = JFactory::getLanguage();
			$lang->load($module, JPATH_ROOT, 'en-GB', true, false);
	    	$lang->load($module, JPATH_ROOT . '/modules/'.$module, 'en-GB', true, false);
	    	$lang->load($module, JPATH_ROOT, null, true, false);
	    	$lang->load($module, JPATH_ROOT . '/modules/'.$module, null, true, false);
    	}
    	
    	JFactory::getDocument()->addStyleSheet(JURI::base(true).'/components/com_djimageslider/assets/admin.css');
    	
        $html = array();
        $class = $this->element['class'] ? (string) $this->element['class'] : '';
        $type = $this->element['alert_type'] ? (string) $this->element['alert_type'] : 'info';
        
        $html[] = '<div class="' . $class . ' djspacer alert alert-'.$type.'">';
        
        // Get the label text from the XML element, defaulting to the element name.
        $text = $this->element['label'] ? (string) $this->element['label'] : (string) $this->element['name'];
        $text = $this->translateLabel ? JText::_($text) : $text;

		$html[] = '<strong id="' . $this->id . '-lbl">' . $text . '</strong>';
		
        // If a description is specified, use it to build a tooltip.
        if (!empty($this->description))
        {
            $html[] = '<div class="small">'
                . ($this->translateDescription ? JText::_($this->description) : $this->description)
            	. '</div> ';
        }
        
        $html[] = '</div>';
        
        return implode('', $html);
    }

    /**
     * Method to get the field title.
     *
     * @return  string  The field title.
     *
     * @since   11.1
     */
    protected function getTitle()
    {
        return $this->getLabel();
    }
}
components/com_djimageslider/assets/magnific-init.js000060400000001054152453623460016756 0ustar00// initialization of magnific popup for all album instances
!function($){

$(document).ready(function(){
	$('#adminForm').each(function() {
		
		$(this).magnificPopup({
	        delegate: '.mf-popup', // the selector for gallery item
	        type: 'image',
	        mainClass: 'mfp-img-mobile',
	        gallery: {
	          enabled: true
	        },
			image: {
				verticalFit: true
			},
			iframe: {
				patterns: {
					youtube: null,
					vimeo: null,
					link: {
						index: '/',
						src: '%id%'
					}
				}
			}
	    });
	});
});

}(jQuery);components/com_djimageslider/assets/ex_slider.png000060400000012114152453623460016365 0ustar00�PNG


IHDRPXbBp�tEXtSoftwareAdobe ImageReadyq�e<!iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.154911, 2013/10/29-11:47:16        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC (Windows)" xmpMM:InstanceID="xmp.iid:D17F49ADE35511E4B014FD84D6C69717" xmpMM:DocumentID="xmp.did:D17F49AEE35511E4B014FD84D6C69717"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:D17F49ABE35511E4B014FD84D6C69717" stRef:documentID="xmp.did:D17F49ACE35511E4B014FD84D6C69717"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�/8��IDATx��]	tT��͛-�}�'��HB@KA@�P��
]N]�����u��JETl�V�uO�ߧ��_>+�ZJqa5@ �}�d�I&�df��w�ę�7a2�L �9�3��n��{���{G�t:b4�x�e"3: rqy(uV"
�7�#^x���o#�I���!^+7i��{Nr;��b0��.�� �U)��e��[u�ﶫ��U��z�,�6�>'j�:P�����U�H�6i���Ҩ|]�����O�!�ilH� J�l��U6�{�
U��h?�#{��|=�o����caH��*֡mԯ�/�����͕;�UiÙm&T�4�Zm��;
�ȸ)���!<�'�GD _�Rǖ���ʝ����WL8�݄�{@߭�Wc��8d��CX��W���_�~�R����/��k��jG�V���D2���3�}5c*���<$����ۯ�7K�nu���V�mm�n8��Ŝ��u�j� +��[��O��ԉ;��Cb!�ڷ;p��F����"vN�=����|59F�<����p���7ȝl��%�oB�{#�qJ�&��LD��p_Mv��?5>)��$0�����&�mp�r�%hUȠ�'�	����FP�O�<"�(:�B���r���8��	�6;B��	j�<��)��sPe� �o�?.u�]���ɚ��8�D��t#�)n��6'!ee��&ϊ@�*	�m��<�q�ǥ���K�y�y}�u)��į+��&�dy_h��ǛBN]�V�$
�mJD��8_M�'�/P�U��O�}Սo�G�G��(��H�x&�ar��SуC�n�?<��q��f������HЫ��H"r�A'�d�!~�w��֋ZY���h��2%,	���R`,4ȝ�W��'�,�^#��$u'k��n0i�<	�'ȝ��g�����J�[�jC��nj������Ry�gm��0��r�<[����V�z��L�޸�t? �����e^��WU^��1b0,&�c�ЫP��F�4�a�\İ8�H��7��&��>���@{q�8j�L��Y�*#�Q��Ԭ�=��q�$RhGG�d�+��5/k%�wڝ�
�\	������J�)^X����a�hɮ��-dװ�+����	La�x��ì
)�t����趰;\%�����C�u	�u�8U�D1&֌G�>�[�%�Nds���G�c,�̏��P�3�}m��9t���Y�
�u�|��J�:��N�E	��k�e��C�ہM*k�[�R�����*���Ab�����$R�:#E2'bŞ	�baH�Nr8	��$eq�K5��y�ɠ,�l<
iZ/��>5	a�z�6����D5,�m����C�����_�`*b�ϼS�ҽ�X��BE�F�n�H-���۷�u�Y(�2��=��T�>���OsPt�}����w11/Q���龖�[
���_��T^S
��F̢�kIѕ)��i�λ���/��Tkx_��Ư[�����0����_��Y*a��>T����)<^V���x㚽0�ÊL
��>3vo����}4ԘȼSk�(jN�����c/�h�OB�Ӑ$��ފ׿��f3�Zq~˔*��i��/�����F��{Vބ���W�N���fa��S�f�	"�^7�1�u�����t��&�V�3�j�_W~��Ӎ��E�8l�����g-?o���\�u>��Z�p+�<��ƿ����y��lVs��;���6��8�0d�H���!o��U�/݋�#�\/�C��E��'O�C*�8"(*;R�����G���O�V@��w7}F��C�g����"=b"#$�,!/&vB��
��E���q�[(btP/2��%�_���8u��"�n[mt
�!
�zW���F��V��@j����΂>J��߷��'&��gc�[WH�����:��m�Ν}NJ6J�
<�c 2Id�p�(��Ь[��}��qa��Xnxd)
���F�}�ES�g'�V��ܛA#`����c��L��e�ꁣ�wEEK�w_U�-��0;��,�?t�-�����uR�H��{B�ewj�K�󴫳�G1/��r�G�0��a�j@��@3�58=$�2gm�{b�K
[|�C�VF�Ҽ
��Q����Y1Y��r�d,�V�?x�*��q��"�ԑ2�,�94���-!�TK�t��pH�TByՋ��?fR@&	�k��\`���2�¦�^Y� 2��JaC����u~?@ec*�w)q�h$����$�ݨ��T�T�*�B�b�H��;j���(IG�x�d=l'�݋�Q���m�Lv
0�s��f"��PQw��+�lk�6�\M�)-���ZŋJ�Ꙋk�����N
�<��D���.aٝ�Y�%���R,
V�R.6ee.c��,p;�+X�9܊��
��#=q�2�~k4������݊�m��a�k�<u0[=��S(��A-��H����B����*�J�R+�T�1�d\��B&lT���X%%��#%aU�0P��Q*>�������N:0��%#}��Dff�U�e�R\v�F�u*%�,%��#ʥ�c�"S$*\�9�y$<S��	�	�d����8�+�B�<İ�51��c��6�fjy+A6[�q�pr���ȁa�!ɿ+�7�z�\=���~C�ԙI"��:���ea��J�=tc�2b�:5�e�5U<9w�I�4b�a�`��۸���I���:�gl�b�B�H
C|��9�2w�6a(�N$R@̌0t�ZD�`�l"�\�wX
L������Xx��
g>�Ş[����M�M99+�,��{�G��j�}ǧ��{�4��2�ʉ�]�����mJߩ�۷���^�FiJ�a�.��~��@����<3�wI$����
>��3��N�F��<{u�m���S��~?W?�v���I�
o���g��6�k2q�3�y���ł.̿%�>0��͌g��-�܌�җl���K6^���.:�U��k����m����0�8���D'�W�ri�9��DD\>�c��+d�,J�5c��4Y�&kEj�)P���I�
�Ε<�s�@���Vϳlm؊��|���$ڹ$fP��@��D�&�ц���حܙ0��m�K�F���H��~ެh�k:I�/��„���V��a��͛����L~L.`šh�['촻@T�T���y;OdT~o&
%�����ٮ;��	Ew���Q�/�+n�1#
)�\�/��Dwk/oüm�q��p�ģ�ϛ�:���ǯ��j,j�~~�ܼ4[�zG�ct����������*���{\ד���q�U�I,6+��p��]���xE����r�Pv�o��
��ɋ�x������M���$W=W��B���]p�&�%��N�>�ݒA|ա��<+�*�ʰyd�����a�V҆��.Rl�#�m�*uK�����e��%�n��ın?܀�}˕k�$V�S9#_
�����B2+��bm:�I�۞�~��7۱5��b�r�DA��e�Kg�:,{�~��+7j�O����$�tV�}��Q�����.�xN����'c	Ś	�d�0Yv���7���O[��;Y�ׂ���h����4b�(��P��F,�T�i�}>M�G�6USt�'O�Br���؜8��	�hEe�)��J�ܔ:l"SW�����둹C�/����>���6�,Y&�UaC����Qe;���q��/��<���\�*S��)��ڣ]?�
�?606r���>Y���C��<��)�L�����$���#�e�/�;�խS�U�o�̱�'��l�T�ٳIsFnQh�x����{��{~��O�^_xJH��.���әJ���$�l���W�����h���d;��j���K�w�BcP�W�\�4��w���!�"{���p�A��E����%8�J)ګ;0zb��ż�y3�|��U�$���C@ ݈����@$ ���~"�<d��h�<D��\�7�&�d7�Y=�t+xse'o+��;�H$r0�c�u޺<�y
7��	�A��y�s
T��|�#`v�7O��]g�t�M�Z���<��ys6�w>��_?F0fdK��8מ��0}�U���(�wF9��1�ډȥw�*�����F�i�Y��R���JAS?��o�,v�s��GIEND�B`�components/com_djimageslider/assets/icon-48-category.png000060400000001322152453623460017402 0ustar00�PNG


IHDR00W���IDATx^�AkA�o��ԓ�Q�փ"x����"��~�����AA�E��~�&���HAA�i�PPpi�"i�C�ðۤ��Y��Y�.���,�U%�d��@O�'�qB!
��0
؞H����2�J�M�!`�ex���
�ؗ���m1L�e”�,���Ƴ�7čjF	:g�HY��j�Ld�-��7D&wV�3�u�ܔ����'�jxHȪ���-z�X����X_�C�"����“=T�p�&�kV��C@�p��HP`�a�	��xM�����"�%����`�%�Ar��n�*��dW1�0L&Њ���:��@!�
���@�+���D�	-$d��
ȍ�X��T�~���f��0��(%�}เPH���D�r�sE����<�"W?��������O�}�@�u�+ $�3g/q�2�>n}�<�c���wq{gbɕ�-�@��N.(�9�'�ν����6�$����(y|@���{jVi�T�����^�(�%XZ��]������Q1�Y��B�u�8���9A�A`��6�����6
�ub`&tz�-�&����jI�G6g���t��֗9�6\�����dѦ��&�:m�D����������)�Ӽ��ڴP�IEND�B`�components/com_djimageslider/assets/icon-16-dj.png000060400000006021152453623460016156 0ustar00�PNG


IHDR��h6	pHYs��
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-� cHRMz%������u0�`:�o�_�F<IDATxڌ��Ka�?/��H
�'��;wQ7nuC��?��"����ԢK���B�54��
5��H6�[�E����|���<Y|,�2+��94� ���o'"�F�9���;���$S�X��29j��z+~/|�O�i�*1F�q����LT��=�Fhv���@�J���)�*��"��	h�*C}�㫘Cؽ�T�M#m�!��\#���+jz�ʐ	���k�d�����a��f_�p%�x�Xf�88׌��N<ω~:\�+�6�\������f~��x4	����h"r�����x����(eĂ*�IEND�B`�components/com_djimageslider/assets/icon-48-slide-add.png000060400000005063152453623460017421 0ustar00�PNG


IHDR00W��tEXtSoftwareAdobe ImageReadyq�e<	�IDATx��Z]l�>3�?����v���_Lc��)4E	QS!E}��h�TDJ�J}�ڷ��D�S%��(RR��4Q@�HEj�Z5�1���NL�q�q�^����Ͻ=����x1���H\8����{�w�w~�EJ	�P�!�<��C>B�.]���o�s�εF"��p8ܧ�jm(zRQ�Z�.��[|���x�b����C��d���:R��~��D�w���F!���iPUUlۆ��q����恠%Ϝ9ӖH$ZQ�}X�H�^T��l&�H�r%�3�`A��B�]�g�:\+���8;v�c��ͣdIR��$��3Y�>JB�P�q@I�R��X=��4������|����$q��z���Za�Dss�������x%��4@v��4@~t{T��e�_��G������W��� ��.--���
���2H�p�˕ �VݹsGg��$��;
Z�ŠJ��ᣄ�3da��O��`Y{��@��u��8~�bFK&�y�!���Dڒ�|y 
EGGGo�޽�hmm�4$R��S���{�L_��i��bPV����_���v|����%���:��&P�����(U�U�z���@�5H�2+���
�P�Y�f2�5��<Œ@�^7�p�8:TA�耞��`JO�	���6��"��A�C�� �$�͛��Qn���(_Fy3�`wO�޼�����bh]ۑp��%XH�_�Lr1v���p7�"@u�z��]�_�����033s����M���$gmQ�'�B(H		FA�B�~. k9�ǫៅ���.��~ �Gn���"��H�P u��>�i��Z=�ߨL�B�
	�i�suMP�Pq-�R��J)e��B4\���lz��̋�bgzz�Jgg�v]��{H�*P�,�R(@:#Ac.��O|
#�FEJo���݁��[��b쑎�% |�*�����g�ȁ�r�,L}K6�m���"��C�iKp,�@�-�z�§xcl�"��4x�_�<��\yI��g]�=�.Q;�̀�b� ��o7��D!"M�-N��U)R��AA�U$d(oP\C%
�D%�޻���9�8�����!�{lll�
�DW����(+/}.�$U�J�@k��U����ᄣ��WxI	�Z;�D�ĩ8��������41!%vb���/B)*΂�|�U��m���@6K�t��ҹ@�wy�Si�,Po��(Y>@!�;�Q�pDq�ŀ�f!�,��t/�+�.��Ԣ{�/�]���Jb�v�G!pi$�($\TF�P�B��'k��@&~�h'3�`�i��vB
4셹����@K!�D�>��K�
D.�*b���ӆ�T��5D7�{F.�
^��)��E+�u��K�3���n
U����x���+��?޷W��7�ݼ`�^8������/��������e
gf`+^�P�1�F*����/����;����>?������g�V��9NuA�V\�A�1H���X���z�D�V:V)�Ǐ���X�orD��b����OY-O����;����Xi�s��߳�R�W����+�{�b�n%��Ni��۟3�V�/v��y1&~���!�8�w�qP�;1�S)�p���ZW��/�2���cg�u@3�}����-XI��lW"I�6�h����_�_��@��zS����v��c�vд�"�h4UE`�1Q���:�oC��à�,p�3�Z���ҕb
M�Ccz�m�ww�O�m��ٳom��<`��
ֆ����y�7��tw?����JǺO^� ̣���R���*(z-8W~2u�)�D� �FZ�4��s%���)䡆��'&''S�N�Z�N.�j��_�
M|�<D�[�,,�,��j��u�7���)�wƸ�dg�Q��}ߋ��N��),�W��G���g$�w~d@`?����~"�&~�y�+h��@1 ߳'�GF�~Z���@����H5/>D0�fD���mN�:$z�~����~�Xq��?�L�����^�BA +n]���5�[�� m����e�WACa0ρy�֠`�2_�O�*��⽫��M�����<����N�J��@�811��{5�cs&����:�l�]�w�ڴ�]��ע�!/^�]�� �N�j^�^F�V��׻ޏ{o0@I�Ю��AŅ߀5��eVw0���bj�h��?p�y��Rmn-΂D�<�衽�:L��K���r;�e�[0�E��g��t��Kk5�>���w��@�V�xh�=P�c����~�5�c���
�8�dmr�z���2}
�<[:;�n2�p���7�Ŵ�)>ϑ{��{������V�ؾ��l���Q���i����
d^kyA�"R�6>g	���f�O��`�o�/x�W�P�HV�PIEND�B`�components/com_djimageslider/assets/icon-16-menu-slides.png000060400000001343152453623460020010 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<�IDATx�ē[kA��;��l��6%54M�A
��j����>��~�^*�~l�,�T�Jz3J���
���4!��^g�MQ0���3��3�8��9�<��#�J���rn�|w| ����_�~cH�S�ջ�C�<�����������sB�!Yb=!�
��}P5C9��]��,HK��2-���mp``Dȱ���Ŏ����4`�M�R�>:"��PvZ�}�CTL߆ٴVj��m����pz%�8�����AO����������=��Ji�P�sH�㘒/a�G�1M�Rޫ�VҐ�q����7��¥�M��k��Y\�ȑI���Aǩm~�ܝ�8��m����XީB&<ZC����H>G�R�Dg�f�ܵi���R��c���(@��{�^��S�Ա�59�U�h`��oQ��[��Z�5BWP:}]�GCUѨ����0MH��" ?�0V�)8-r��6L
�R����s����I5��.�/�D��84]�x����c333ӅB��񓧏B��e���^^@��u��j���:ȴɊ2�^ZZ���_1?��e>�W���J�W=YmA�����]�ms�$I����r��yu���eψ�w�/��)�J���IEND�B`�components/com_djimageslider/assets/admin.css000060400000001311152453623460015500 0ustar00/**
* CPanel
*/
.cpanel {
}

.cpanel div.icon {
    text-align: center;
    margin: 0 10px 10px 0;
	width: 108px;
	height: 100px;
	float: left;
}

.cpanel div.icon a {
	background-color: #FFFFFF;
    border: 1px solid #CCCCCC;
    border-radius: 5px 5px 5px 5px;
    color: #565656;
    display: block;
    float: left;
    height: 97px;
    text-decoration: none;
    vertical-align: middle;
    width: 108px;
}
.cpanel div.icon img {
	margin: 0 auto;
    padding: 10px 0;
}

.cpanel div.icon span {
	display: block;
    text-align: center;
}

.control-group.field-spacer .control-label {
	display: inline-block;
	width: auto;
	float: none;
}
.control-group.field-spacer .form-text.text-muted {
	display: none;
}components/com_djimageslider/assets/icon-48-slides.png000060400000004172152453623460017056 0ustar00�PNG


IHDR00W��AIDATx^�Z[lT�]����'��(�m�0���P���ߤBB�HU�j�Q�*R��O��Z���*U�!�&VN����M���Ʋ<��y�9]��}L�H3����h�^�G箵��\�mH)�U���%`K�1==�Fbbb��3<�*l 󆛄۷o'��p_(:h�fG0|�0�)�?���?��F�M���t)�$�955uD�$�$�H$�X,�@ ���VP,���<�}i���7���x�d�ң��I�&�IN��&�'<-�B���d���J5����|���ÇgI^�#IM�b�oJҍB�۶a��hE(����{�c0��>�Y�
���ާ�
kX@��߼y�ͱ��tww�&�v�����"�_D�zSnhe��`���|sssضm��݋\.���u�J�ܥ�I%H��#���z��=����^���G��F ��SI��ҿ���QJ��t���׍R��l6�L&�
KQ�?��䠶�Nb�s�}���_�����}�M�Sؔd���,�K�ac����H�V122����rS�?�@x?��Ep%	!\A�(U
���#(U-���u�ر�.\���g�@��ojj52�9<��6����&FGGf/�s��Y�5Dъ1���7��
BKK��Hܭ�'�^�6q�x���/��&G�0�F���>��2/i��%��v
��W�̘���\�o��`����lW�w-�XYY����[~`�=��\6��F˽kNi
�ق�j��G3�m�
�
���=�d��]r�̗=A=��j"V��1� �F�@XXm�0�-��g%V���j3�>�)L%CgY@�HbJ�L܈�-��.�؊1�
йVX\\�dppp4�F���0�
K�P ��h*>��%��'vEL|w"/,�4!M�QZ�so�S��Jf���J���m��@ D>ԏ��,�%a�����Θ��e��5��;xc\��CU��"y�{pmo�7�s	`c#���G��,"�=��?�U�=���\=!�/Z��3L�p{�j�vǬG��O�%u�H�U�l
 yB��K·���Z}���#G����.L�<x���=�
BJf��W_�ϟ?�eƊ�Q�}G��+`�]���`�F�N�
S��M=�(ݤ���bA�����-��Ȼ�z+@��B�l��a8�Mu/���Z�A�S��^�o�n��Qj�&�:8!Qe!�@D��BR�7K�~�	-�72�m](��3�TU�>X^^�<����PU��)v��δsä�-��+�PGx'vDz�g���g�M���I�\^n��&�$*F^@��<F�g�Fz@��H	�X>y}��zP	ҟ͗Ln&@����ݗ��߈�H��|�'ذX[Kami	]jյP#=��$�
(�M�:�0@����Z�����մ~vi��9H�{�?�U�ĺ*G(Y�'6��Zv	������\���ٳg�=��NJ�U=��9`W�Q�.T9B#�8z��s�|��3-D�|�NZ���T~t�"��j�������!�s�O�����D2��;�9��(��}f�*�b�Z
����WW��4�O�ˢ݌s@�l�0�}H�{F*���Q(<���@�}�YO��M��$-P��B��zZØ莣��u�q5�D�������k���R
\K@�X�7��|�X,�y6L'����������n鏿�[�����>#y8S�k�R,���?K�M��Ύ;=x� u���Ua��x���� ����A$����fj	�D��ً/�Ԛ�("��zX��WZ�p��'�*ծ�nd�jf�����n�$��fշ�D�`�*�*��T	�4Qeͯ��[�Nq҄�����o�����!b�K�$�5�axrB�Dc-cM �s��>}�S7��ҵk��Dw$�c��N��ݿ��z[�.�Z��@�0	�'N��`�hT�M䈕3g���h,Qr�R$�!b԰t�(zB���$euƛ!@:��/㗄~_��֟l	������Ci��r�IEND�B`�components/com_djimageslider/assets/icon-image.png000060400000001071152453623460016417 0ustar00�PNG


IHDR!�1�&tEXtSoftwareAdobe ImageReadyq�e<�IDATxڴU��Q�w�"��P�-V��35�x!/��,�X��l��XP�4����q�&�̝;��-Ngν�|�~s���L&��Z�YB�P,{�\.���j���6�|�l�ݤ��H$��^/��
k�6���@ �H$@y>�7��r���r��L?:A:�|����A�Z�i��Z��A��$��}��4b��n�[(dY��v4Ѐ��LG�e�t:m4�\`����i���hv:���fӜ�c�Zy�X��zt!,�L��l�_
}0N]�q:���1�E�S���)��(�����@�0k���2Ȼ�):�����p��S�T�Xd��|�8��e���yQ+���=��{��]������b����l���p�@vX�e�A������wU��S*��[Ai���z���?#��N&�ߏ�G5�ĸ��P�͗^�~�r`zh�T�z�2IEND�B`�components/com_djimageslider/assets/icon-48-category-add.png000060400000002200152453623460020124 0ustar00�PNG


IHDR00W��GIDATx^�]�Te��9g�Udgw�TJv"�eWH��B!��-�Bw#�P	E$�K����IԠ�Y�v�	�M��UA����9�}ZZ�0;gg�g�����yn���<��QU*�
gJ`J`J��q�SM-@�������"oR���E���!�\Z�=~l�v&Q��f3	\bb�����ev�-�d�tr�8��{�D>��]��5$��ހ��[I-��K�tߝ��(C�@�
�L	L	�� ;h5��h���"�!MG��8K��b��k����j���)����:��d��{��e�3�៮f �a�/�r��A�l��x�7͑j*�B�4���@�i�q�,"�!�������J% ���Be��ѿȎϻ$)o\�]���P���%
ȭ��#pY�g�����5l���{X=������� d�����{�����C}T��fp�j5_�V�V��|jd���{7�,p�&���%g���?@)�m�/���_n�`q�U�]�Bh����d��
x����U�s��*\��3"b���g��m��l�
����̓<�/~��ȯk�A��̍>V�x����ky����`���}�\x���/|h��OU0f��d��%���OB0���D�E��aR���s`Y�����kE�YDZ�(hDz�R_쪮cP�9~��Ǯ���@���r�XB�e�8��ؙR�믾�	��&nϼ�%��JX���8�PJ��	9ysM]q������ܬ���7W�P���Aj�M�t��m�6�Ö��d���d���܉\ی@Q׼�T��n\�����N0���UN��}ˉl�2@5��+;"-�?�|�7��sX
�j���0���A�t�>ƒ#����`�n�Mm�ܾ����n�[�+��e'��Gl��6b�M�:�Ts�^�њm�:L����Kxm�v�vy�^��݅GϘ���]�@��y�⵵>�l?�1����0��|�i{�[4X4t�Y�
o�Kݬw���۰����������P(0V�t�n�����f|�IEND�B`�components/com_djimageslider/assets/icon-48-help.png000060400000005627152453623460016531 0ustar00�PNG


IHDR00W��^IDATx^�Y{�\e�}�13;3۝B[P�p5QZ�h(;[Z��51b�tK��<AD\�ADZ5H�I)�JLlW�W�mibK�ݾ�@��mE���y�{��9'_�����L���ߞ��s��s�w��^�!ؔR8];��Ý�4F7�K)t)(@�OH�C_rCsa�/�ۏsw0;x%z��^�k�ڷ`�6l˂E !F�I�:����@�������u��Nì�%N8
`=!o�>�l&-�d��gdm��?�$	{i�BN�N�@H���l�.��h��-k2��]0��$Ri��C�7B�裊fV�8�[8�g�N"�Nf��3�&Z���8����i�t^2�.��n��8�W�j��d�AQl;8���M�A�6j���U>��o�Xv"AB�f�4�o��dD�g,���R�9��2�VE�@XC�bY��x/)B\������T@s�eRi�m�9(&n�H��[��Su����M�Q������j��y�:y�x	��m#��>�!���L:�o'RH�I��+�ٲVlz�ᬰ�J:FB1}�#4���gNJ�&9O�1g��֟�4�~�M���JYum��u��B�� �������cfo�� �C%wg��!��%�M�p�C3N��<wM�kc��]�T)䣶��O)���O��w�X,b||�	E:f?zd���0َWC�J�����M�r�Z�n�:r��x�(ӑ s�z���`佷1nD�q���6��x��*�5V����X�-<l�1��[�`��I�$�2�HŞ0���Zb�TC�X�	<��(�J��r�OP.�-�JC��� �X�
_cre��212��"U�ͦ
�k@-Z�
�=
˯�IfP���V-�-�0F��(�^����m��5�Ė{fwZ������E�C�7f����쓟J��C&Ԫ?����`���Q# Z۶����g���2���"�D��#ej��7���;/0��>`�ƞ�_��Z��I[)��51>�'���e:�v�7��\�ʜNPU�:yDZ������-_���u�M��iɼ���A�ʁB��Ʌ���й��r�}�b��!�ɅK�.�A��V�<�����b-ě��L9�3?���7�#���z^i��(�m(�|�Fb�����`±�t�����H,��:�Ө7��M�`�x��y����7#S�9�BA@�Gv��`�&T������i����O.�}suV�S���+W!�����M�[�%|Y�	@�G�H��Z�Y7��n������V��7�ǐ^~;¹���ִ&7C��r�D���1���%�r��uf`���D����: ���g��w�03��dG%�x�؆�%_|L˘ƣ����0?���ۘ�x47It�N�����a?��[DJ�V��@6����X�\���3��;w��!PJ|#3ǦT ,hӇ�L�2B8�1
�>�����o�wUy�%�Z9�5x��M�ߙ, Đ�:�@�d��}凾�����Χ�k��=z٬\�ЎޱͿ��Gm���wzᨅ���6�ཱུ�'~��_]�ғ����(R������c�Ҳ`N��ZOc�d���{��!Ź�-���d���
t`�x��(=�;��r���EuW?ti�G��
�#Ȥ\��D���Xw�_�M��$$��b"�+my�w-���?F��@f�\�c_>����~��
����}���R�Z�BX�9�R�l*�v�����-��
}ns&��ɹ�R�-�B
��F���;�5Px�&T��g�'��?���zm7!O�`�B\E��+(�m���i�n����m�,�;kŝ�|���m���U�m�r�йB�Ed��!-�	�� ;���F譏�lCL��:B��}^
��@IYBC\���aތp��W�e���]r�d"�={�a.=�q�����K�%�H	yX
���8��ɓ
�'��-��� g�����5���CmqH�Τs��܋�@&�E6���/Z�3�)�A���S.0�3����ׄ��5{�r+a��=��Y�
�ܨ}�ɩ�¢�鄬灅W�%��Œ`��]��K��k[\��d��D�_�����KI~4���Wa-��_��Qvț &h0�B�_p���2O>c����]�ß3���c14�:�
g?Jn���y�˯�e	�$R�]���	�dX�,�g�N�ͶqRK̿��[�g4# &D:�#$R8qr[z�h^.�&σW)#�J�gO��{^7��;?�90~
y��W)I���_���]�v9Af�Z��Ӥ� ����T[;��D��bz��S<�D�Ә�����졷q�G�Ȣ)OR��G`3
���CK�UPz�d�L��
�e���=Ӽn��
�+���8
��Z.2�Z��@���2�X��S��s������h�JI~��q�)�HÊ�������Mb��E��-�����̢��kA�h�FiyP��g��&�4rl�z����8f�tdU�=Kp�c�.9���w��ĜvM�#f�j�7�fUYڳ�u7yO����y�m�����TJ]�j:!�������'��(t$�FvE��C'�R���dä���i��(��G<ܻd�7&��Z*�q1��X�q��W';ϻ��rH�!oY�m�!?�����[�yw�K�ۉ����u©�U����X�����ܥ�'\w�㺋X�1�;:�-��=z��ս���m"@�`b:hn��&v�U_�6�gТ5��LQ��%C�$hGs
[3^�x'N�oV����g����V������5�tIEND�B`�components/com_djimageslider/assets/index.html000060400000000000152453623460015665 0ustar00components/com_djimageslider/assets/logo.png000060400000012230152453623460015346 0ustar00�PNG


IHDR/�KtEXtSoftwareAdobe ImageReadyq�e<!iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c021 79.154911, 2013/10/29-11:47:16        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC (Windows)" xmpMM:InstanceID="xmp.iid:C1407BE4375811E49624DE1AEA0D23AB" xmpMM:DocumentID="xmp.did:C1407BE5375811E49624DE1AEA0D23AB"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:C1407BE2375811E49624DE1AEA0D23AB" stRef:documentID="xmp.did:C1407BE3375811E49624DE1AEA0D23AB"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�
IDATx��]	p��=%K�e�8f�
v��H�
��	I�H���G	Đ�H$�p����8gb���(��҆`(s��p����m{���߫V{fv%�l��W�kwg��������^�4M6T$�Z�C�r#ȡ �A�d�S!��1�����y�����A&�\�!��+(|�	a�s �kS/�m ��ԪK����$�_�������$!m�*�R�w@�P�@A��A3ɨR*�[r�2��AR�1�(��iB�]HK@�'��	��i w��A~2��1�X6�!y


����*!��6e>9�D�m��u;�'!x�<�9 ��(��KD��ru;�'!��A�
��6�3A�A��L"֏�l��ݥn���'�m#(�/|���PP߄��Dc��((���S���R=������[�N�Y2io��W��=��X��4��

��C���g=q���#�2�)�/�&|���PC��q�!�̽���Y�o
+��Þ.L�Lg�ƺg�Ì�Y^u;ơ��.��z,aݓ�`=	c��6ޕ.��5�
�;�d��n�TTP��+���)���zf��t�}L91�:�|�Hh��$&���y!;�V�:EJ �p{{{ߨi�y���㫶������Ce
E�����s�G�rG=3��TG!��2,B��$N5V0��z�-<��-o��9;���O����]�N=-흘��W:�}�\���FȣH�f�$�R�q#1f4�6���<�E)Ϥ[�[~��c&0����3n��qʼn�S��w��=���`O�7�L0�U��o,\0�Z/�>�@��&�c���pG�/!�D\
c-���4=�q.��)g@�{����[�+$M�m�F�Ҟ5�j��rܷw�t#nA<d�#������g�#rH!��ЮcH��c�C <g�Jހϫ5#y��{|o�d?�<�ʺV���e=e���0sP�W����:6���h��X�]��c�.�DV�xb�~$���:7��B�"���m���<�h�F�F8.j�+��r!
�x��^�UP���B��%�C���:y��U¢ݘp^���	��w�ݵ�z/^�(�v�¹�څ21��̹�6
��k��i�6���:~o�.]��7�\rId�O*n���(W����F.C��O-���[3�W����r7ѝ�6*���T�^������7�:A�ԡ+�,���
,e~�%iH������A$$����[O��W+���
Q#@��S;1j��� ��Ry�c�����N����F�ZT���2&\���8f�T��[���n�+��@�y�0�ъuq�&��C��CX�j���h�A^�@�u��	���z��R���)A�Nm�}���9��M��j�u��Lփ��W@6�}���K�C�&�c���	�
�v5�A�q0��<��]N�6��e2�@����{D��h�\(aX0^�����gZm��Y��	���Zҁ_�V��NU1u�J}e!�%�!�'|o�Q������E�2Aڏ�d�p�L�{���`�28�D��7�ܧ?gV��v參�ܟ�L���>߂�߂̐�g�?&�Y��.�zw�]~Pj����6��>_y���\ә�_��w�f�Rv3F�2�|H��F�:�d�Ar��C?���o� �y�
��ǪLD��&Ҳs��ٰ�|�����QkS��:2r���.�����^��jd2�2m�-�~�"��ս�P�����������%Tz�\h���$�4m�
��=����+���2ї��8.�'�\�1WХ�r�ɥ~VyV,=����.@�b���B��NSC��C��[(��x9ch�Z�MQ��:&�h���5�!#t.XG�� ?�ALj���{�k^,�kiK�d�3�s��+Hz5бa�.۾�Pg�.��u4���qfG2�Yn���;f�[>��qil���7�
�֧��A���O�;n�jeAM���Ku�u�o�
}ﱾ�.�v3+a�î�����pAL
�5�����7+���� �Eo��m�G�5PϨ�$��"A�5�TkC0V�4dt$��<:�(<���Eʣv���%Z�K	(��eWK����^�b�$����HW����<�
�vx
v2�=z%N�m?��	���K�dP!�H���i�Ww=�a]�����hF�x�p�$�~�9!(%��{���m��qP�@ƐI�j+79���$��y<��p%HƗ��m=P �EGI��f1�)��8���"�����rB���/D��@Ӣ�����{xV����n�ϛV��0۟���>O�a�h-��¬�W<ƒ_B�#u���f׶��g��均���j�X��w�մ��{�Qt����/��9LbW2=��\j��IɭAn�Pa�T��'�Z�
�@�Q'����a�ɧ�j�N����0��0���+_e6P�00i������9=Q�i�1n>e�g2e`{����3�:��/Id�F�'�PO̊��d�p���ܒԜ�~N��}���B�?M�ӷ�
����d��p2ӈ��a�6i.��b&��t|�����XF�"��	��U�d�Ͼ��J�M	�LÍʍ��BF;�l#��%����'ʚB�"��F��ېù8��|
��JG�G�#�&�� ��9~���}��ב �A�
LG��s�x�6S����(�_T�{ S�m���π��Wx��x>^R�	�e���ݸ J�`ߑ��O���N�*<�u\��=�6�ާM|��
 \f�Wv\�]8���J�B����\O~C��ι�:'*׷�*[_���
���l`��V�1N��m3������S"����2�5tN��
Z�3D7<L�@!NDpB�PcS>
�j)q�F��<�R}�C�d��M���c�	�A2jF�Z�KéE���R�W���s��-TF�SQ6
� !|E����t*�P��ys�f\�r���K�0��f����fl�x'�H���Y�w����)��X���+���9�mDm���
<U� [���t�GvK�H,�1�E��HzF�U�Б[hA<��@>m�L����CHH��OC:�" qE��
B�F&=�8��,�H�1Rh�����Q�^��-P&"\�Eb�bғ�ł6�Ϟ'@��+0�
� �Je�+��P�/�4���M'|�Z�:�k�~q�_�|~�574�j{��v����*�b��׳���^ud����P4A�_ƂGl\/���O=�elI�����J����G����Z�ZN&X'��:&�;PK�+(�D��?_�02��+PY\ѕb;��R�LOOn;ԃ�!9d�y_��'"Ӥ��s�"�hTi���"!�9
ƿ�����
�SV�c~	��!�0�MPU


E�.�qq���Nd�1N�@M%�#�s�@�-l�Ag�Q"��r� �q��w�5���dF΃H�{�>n�Iu��rj�v�"��H,�	�"W`���8}�}	JL2Ԑ;��)#>��:�mB(�)u�Kۅ߸�Yn������).z����}��1��C
��B��$�n��Bq	a��X��dt��N	:�ǟ�Sz��emJ�q+-э����s��@����|cӛ�f9Սm�E3��F�,�-TP(.!�.m��g}\y��Q�d�#�3 �L�����΁Ŋr�i���^z+u�9Vu�d�ʎk����
d�p؛�*(hqO�\Ȳo(~���#�)��8�ʇ��OD�~�\�D`i6�$�o������em��`��4K,)s�]R�Mf)s�0�G���?���}[�.نu���'���_Hg�"]f	,9O:���B	\[
_(:��e�M�}5��]���g�{�{��g-�U�r�ʬ%���Ov�?	D���3ǧ����t����CFK�I^�ϸwpՑj�~�bzQ
0�7�y��7�ͪ&���2����~�ܕ�s/=��|
N�f�b;��]��$���I�e6���!�Sq2�����V�e����)(�.!d�{�]tR=�B	�D���Һ�iy�����h�`�AX {7@m&\Dr�@���N<�Ȼ�)(��C#��D�M�m���4�c�	F#h���wTׯA:�}��£��:E

��C��+%�̲+*]Ly��@g���8��{x����D˙�Rl


���0�!3w+$IEND�B`�components/com_djimageslider/assets/icon-16-djimageslider.png000060400000001140152453623460020361 0ustar00�PNG


IHDR��h6tEXtSoftwareAdobe ImageReadyq�e<IDATx�TR�n�@=���EI��P��tÖ|B��������c�
		"*���Ȣ�y�Wv<��ýN,��x|=����_��ס#�T(P.8� ���&i?��t\4�B�9x��p��l^h�]�"�$��O�Lh�U���/szŁٻ��.��!{TA��Ǐ�;��:Gdg�d��m�܀l�p�!�'C�][
���{�iw��
_-��Lbs���5R��eg�7L?�7�1q��G��|��q��ә��d�s�uv"�~<���+i1}[��2��G�o�?E�F�Ha���<���y �P�u��Rt��>V��$~*�'��,[�Yu_����@wU�5{5>X��9��a�P1�����dp�A2GR���2�i�/����Wkn�[ʼn[�0xJS�.1���WL>�R�B����aG�80�#��1XK�j�D&N�3C��j�$p#�k�dJ2�6�+���gXa$��*��MyEȅ`5���1�A��V��-�+�%�:�`��5��IEND�B`�components/com_djimageslider/index.html000060400000000000152453623460014363 0ustar00components/com_djimageslider/script.djimageslider.php000060400000004005152453623460017216 0ustar00<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
 
class Com_DJImageSliderInstallerScript
{
	/*
	 * $parent is the class calling this method.
	 * $type is the type of change (install, update or discover_install, not uninstall).
	 * preflight runs before anything else and while the extracted files are in the uploaded temp folder.
	 * If preflight returns false, Joomla will abort the update and undo everything already done.
	 */
	function preflight( $type, $parent ) {
		
		if($type == 'update') { 

			$jversion = new JVersion();
			
			if(version_compare($this->getParam('version'), '2.0', 'lt')) {
				
				$db = JFactory::getDBO();
				$db->setQuery('SELECT extension_id FROM #__extensions WHERE name = "com_djimageslider"');
				$ext_id = $db->loadResult();
				// adding the schema version before update to 2.0+
				if($ext_id) {
					$db->setQuery("INSERT INTO #__schemas (extension_id, version_id) VALUES (".$ext_id.", '1.3')");
					$db->execute();
				}
			}
		}
	}
	
	function getParam( $name ) {
		$db = JFactory::getDbo();
		$db->setQuery('SELECT manifest_cache FROM #__extensions WHERE name = "com_djimageslider"');
		$manifest = json_decode( $db->loadResult(), true );
		return $manifest[ $name ];
	}
 
	/*
	 * sets parameter values in the component's row of the extension table
	 */
	function setParams($param_array) {
		if ( count($param_array) > 0 ) {
			// read the existing component value(s)
			$db = JFactory::getDbo();
			$db->setQuery('SELECT params FROM #__extensions WHERE name = "com_djimageslider"');
			$params = json_decode( $db->loadResult(), true );
			// add the new variable(s) to the existing one(s)
			foreach ( $param_array as $name => $value ) {
				$params[ (string) $name ] = (string) $value;
			}
			// store the combined new and existing values back as a JSON string
			$paramsString = json_encode( $params );
			$db->setQuery('UPDATE #__extensions SET params = ' .
				$db->quote( $paramsString ) .
				' WHERE name = "com_djimageslider"' );
				$db->execute();
		}
	}
}
components/com_users/views/user/view.html.php000060400000005040152453623460015476 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * User view class.
 *
 * @since  1.5
 */
class UsersViewUser extends JViewLegacy
{
	protected $form;

	protected $item;

	protected $grouplist;

	protected $groups;

	protected $state;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 *
	 * @since   1.5
	 */
	public function display($tpl = null)
	{
		$this->form      = $this->get('Form');
		$this->item      = $this->get('Item');
		$this->state     = $this->get('State');
		$this->tfaform   = $this->get('Twofactorform');
		$this->otpConfig = $this->get('otpConfig');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Prevent user from modifying own group(s)
		$user = JFactory::getUser();

		if ((int) $user->id != (int) $this->item->id || $user->authorise('core.admin'))
		{
			$this->grouplist = $this->get('Groups');
			$this->groups    = $this->get('AssignedGroups');
		}

		$this->form->setValue('password', null);
		$this->form->setValue('password2', null);

		parent::display($tpl);
		$this->addToolbar();
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		JFactory::getApplication()->input->set('hidemainmenu', true);

		$user      = JFactory::getUser();
		$canDo     = JHelperContent::getActions('com_users');
		$isNew     = ($this->item->id == 0);
		$isProfile = $this->item->id == $user->id;

		JToolbarHelper::title(
			JText::_(
				$isNew ? 'COM_USERS_VIEW_NEW_USER_TITLE' : ($isProfile ? 'COM_USERS_VIEW_EDIT_PROFILE_TITLE' : 'COM_USERS_VIEW_EDIT_USER_TITLE')
			),
			'user ' . ($isNew ? 'user-add' : ($isProfile ? 'user-profile' : 'user-edit'))
		);

		if ($canDo->get('core.edit') || $canDo->get('core.create'))
		{
			JToolbarHelper::apply('user.apply');
			JToolbarHelper::save('user.save');
		}

		if ($canDo->get('core.create') && $canDo->get('core.manage'))
		{
			JToolbarHelper::save2new('user.save2new');
		}

		if (empty($this->item->id))
		{
			JToolbarHelper::cancel('user.cancel');
		}
		else
		{
			JToolbarHelper::cancel('user.cancel', 'JTOOLBAR_CLOSE');
		}

		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_USERS_USER_MANAGER_EDIT');
	}
}
components/com_users/views/user/tmpl/edit.xml000060400000000300152453623460015465 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_USERS_USER_VIEW_EDIT_TITLE">
		<message>
			<![CDATA[COM_USERS_USER_VIEW_EDIT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_users/views/user/tmpl/edit.php000060400000011156152453623460015467 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('formbehavior.chosen', 'select');

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(task)
	{
		if (task == 'user.cancel' || document.formvalidator.isValid(document.getElementById('user-form')))
		{
			Joomla.submitform(task, document.getElementById('user-form'));
		}
	};

	Joomla.twoFactorMethodChange = function(e)
	{
		var selectedPane = 'com_users_twofactor_' + jQuery('#jform_twofactor_method').val();

		jQuery.each(jQuery('#com_users_twofactor_forms_container>div'), function(i, el) {
			if (el.id != selectedPane)
			{
				jQuery('#' + el.id).hide(0);
			}
			else
			{
				jQuery('#' + el.id).show(0);
			}
		});
	};
");

// Get the form fieldsets.
$fieldsets = $this->form->getFieldsets();
?>

<form action="<?php echo JRoute::_('index.php?option=com_users&layout=edit&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="user-form" class="form-validate form-horizontal" enctype="multipart/form-data">

	<?php echo JLayoutHelper::render('joomla.edit.item_title', $this); ?>

	<fieldset>
		<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'details')); ?>

			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'details', JText::_('COM_USERS_USER_ACCOUNT_DETAILS')); ?>
				<?php foreach ($this->form->getFieldset('user_details') as $field) : ?>
					<div class="control-group">
						<div class="control-label">
							<?php echo $field->label; ?>
						</div>
						<div class="controls">
							<?php if ($field->fieldname == 'password') : ?>
								<?php // Disables autocomplete ?> <input type="password" style="display:none">
							<?php endif; ?>
							<?php echo $field->input; ?>
						</div>
					</div>
				<?php endforeach; ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>

			<?php if ($this->grouplist) : ?>
				<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'groups', JText::_('COM_USERS_ASSIGNED_GROUPS')); ?>
					<?php echo $this->loadTemplate('groups'); ?>
				<?php echo JHtml::_('bootstrap.endTab'); ?>
			<?php endif; ?>

			<?php
			$this->ignore_fieldsets = array('user_details');
			echo JLayoutHelper::render('joomla.edit.params', $this);
			?>

		<?php if (!empty($this->tfaform) && $this->item->id) : ?>
		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'twofactorauth', JText::_('COM_USERS_USER_TWO_FACTOR_AUTH')); ?>
		<div class="control-group">
			<div class="control-label">
				<label id="jform_twofactor_method-lbl" for="jform_twofactor_method" class="hasTooltip"
						title="<?php echo '<strong>' . JText::_('COM_USERS_USER_FIELD_TWOFACTOR_LABEL') . '</strong><br />' . JText::_('COM_USERS_USER_FIELD_TWOFACTOR_DESC'); ?>">
					<?php echo JText::_('COM_USERS_USER_FIELD_TWOFACTOR_LABEL'); ?>
				</label>
			</div>
			<div class="controls">
				<?php echo JHtml::_('select.genericlist', Usershelper::getTwoFactorMethods(), 'jform[twofactor][method]', array('onchange' => 'Joomla.twoFactorMethodChange()'), 'value', 'text', $this->otpConfig->method, 'jform_twofactor_method', false); ?>
			</div>
		</div>
		<div id="com_users_twofactor_forms_container">
			<?php foreach ($this->tfaform as $form) : ?>
			<?php $style = $form['method'] == $this->otpConfig->method ? 'display: block' : 'display: none'; ?>
			<div id="com_users_twofactor_<?php echo $form['method'] ?>" style="<?php echo $style; ?>">
				<?php echo $form['form'] ?>
			</div>
			<?php endforeach; ?>
		</div>

		<fieldset>
			<legend>
				<?php echo JText::_('COM_USERS_USER_OTEPS'); ?>
			</legend>
			<div class="alert alert-info">
				<?php echo JText::_('COM_USERS_USER_OTEPS_DESC'); ?>
			</div>
			<?php if (empty($this->otpConfig->otep)) : ?>
			<div class="alert alert-warning">
				<?php echo JText::_('COM_USERS_USER_OTEPS_WAIT_DESC'); ?>
			</div>
			<?php else : ?>
			<?php foreach ($this->otpConfig->otep as $otep) : ?>
			<span class="span3">
				<?php echo substr($otep, 0, 4); ?>-<?php echo substr($otep, 4, 4); ?>-<?php echo substr($otep, 8, 4); ?>-<?php echo substr($otep, 12, 4); ?>
			</span>
			<?php endforeach; ?>
			<div class="clearfix"></div>
			<?php endif; ?>
		</fieldset>

		<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php endif; ?>

		<?php echo JHtml::_('bootstrap.endTabSet'); ?>
	</fieldset>

	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>
</form>
components/com_users/views/user/tmpl/edit_groups.php000060400000000676152453623460017073 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');
?>
<?php echo JHtml::_('access.usergroups', 'jform[groups]', $this->groups, true); ?>
components/com_users/views/debuguser/view.html.php000060400000004532152453623460016512 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of User ACL permissions.
 *
 * @since  1.6
 */
class UsersViewDebuguser extends JViewLegacy
{
	protected $actions;

	/**
	 * The item data.
	 *
	 * @var   object
	 * @since 1.6
	 */
	protected $items;

	/**
	 * The pagination object.
	 *
	 * @var   JPagination
	 * @since 1.6
	 */
	protected $pagination;

	/**
	 * The model state.
	 *
	 * @var   JObject
	 * @since 1.6
	 */
	protected $state;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		// Access check.
		if (!JFactory::getUser()->authorise('core.manage', 'com_users'))
		{
			throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
		}

		$this->actions       = $this->get('DebugActions');
		$this->items         = $this->get('Items');
		$this->pagination    = $this->get('Pagination');
		$this->state         = $this->get('State');
		$this->user          = $this->get('User');
		$this->filterForm    = $this->get('FilterForm');
		$this->activeFilters = $this->get('ActiveFilters');

		// Vars only used in hathor.
		// @deprecated  4.0 To be removed with Hathor
		$this->levels        = UsersHelperDebug::getLevelsOptions();
		$this->components    = UsersHelperDebug::getComponents();

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		$this->addToolbar();

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		$canDo = JHelperContent::getActions('com_users');

		JToolbarHelper::title(JText::sprintf('COM_USERS_VIEW_DEBUG_USER_TITLE', $this->user->id, $this->escape($this->user->name)), 'users user');
		JToolbarHelper::cancel('user.cancel', 'JTOOLBAR_CLOSE');

		if ($canDo->get('core.admin') || $canDo->get('core.options'))
		{
			JToolbarHelper::preferences('com_users');
			JToolbarHelper::divider();
		}

		JToolbarHelper::help('JHELP_USERS_DEBUG_USERS');
	}
}
components/com_users/views/debuguser/tmpl/default.php000060400000007724152453623460017203 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('formbehavior.chosen', 'select');

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$colSpan   = 4 + count($this->actions);
?>
<form action="<?php echo JRoute::_('index.php?option=com_users&view=debuguser&user_id=' . (int) $this->state->get('user_id')); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<div class="clearfix"> </div>
		<table class="table table-striped">
			<thead>
				<tr>
					<th class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'COM_USERS_HEADING_ASSET_TITLE', 'a.title', $listDirn, $listOrder); ?>
					</th>
					<th class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'COM_USERS_HEADING_ASSET_NAME', 'a.name', $listDirn, $listOrder); ?>
					</th>
					<?php foreach ($this->actions as $key => $action) : ?>
					<th width="5%" class="center">
						<span class="hasTooltip" title="<?php echo JHtml::_('tooltipText', $key, $action[1]); ?>"><?php echo JText::_($key); ?></span>
					</th>
					<?php endforeach; ?>
					<th width="5%" class="nowrap center">
						<?php echo JHtml::_('searchtools.sort', 'COM_USERS_HEADING_LFT', 'a.lft', $listDirn, $listOrder); ?>
					</th>
					<th width="1%" class="nowrap center">
						<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
					</th>
				</tr>
			</thead>
			<tfoot>
				<tr>
					<td colspan="<?php echo $colSpan; ?>">
						<?php echo $this->pagination->getListFooter(); ?>
					</td>
				</tr>
			</tfoot>
			<tbody>
				<?php foreach ($this->items as $i => $item) : ?>
					<tr class="row0">
						<td>
							<?php echo $this->escape($item->title); ?>
						</td>
						<td class="nowrap">
							<?php echo JLayoutHelper::render('joomla.html.treeprefix', array('level' => $item->level + 1)) . $this->escape($item->name); ?>
						</td>
						<?php foreach ($this->actions as $action) : ?>
							<?php
							$name  = $action[0];
							$check = $item->checks[$name];
							if ($check === true) :
								$class  = 'icon-ok';
								$button = 'btn-success';
							elseif ($check === false) :
								$class  = 'icon-remove';
								$button = 'btn-danger';
							elseif ($check === null) :
								$class  = 'icon-ban-circle';
								$button = 'btn-warning';
							else :
								$class  = '';
								$button = '';
							endif;
							?>
						<td class="center">
							<span class="icon-white <?php echo $class; ?>"></span>
						</td>
						<?php endforeach; ?>
						<td class="center">
							<?php echo (int) $item->lft; ?>
							- <?php echo (int) $item->rgt; ?>
						</td>
						<td class="center">
							<?php echo (int) $item->id; ?>
						</td>
					</tr>
				<?php endforeach; ?>
			</tbody>
		</table>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
		<div>
			<?php echo JText::_('COM_USERS_DEBUG_LEGEND'); ?>
			<span class="icon-white icon-ban-circle"></span><?php echo JText::_('COM_USERS_DEBUG_IMPLICIT_DENY'); ?>&nbsp;
			<span class="icon-white icon-ok"></span><?php echo JText::_('COM_USERS_DEBUG_EXPLICIT_ALLOW'); ?>&nbsp;
			<span class="icon-white icon-remove"></span><?php echo JText::_('COM_USERS_DEBUG_EXPLICIT_DENY'); ?>
			<br /><br />
		</div>
	</div>
</form>
components/com_users/views/groups/view.html.php000060400000005006152453623460016041 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of user groups.
 *
 * @since  1.6
 */
class UsersViewGroups extends JViewLegacy
{
	/**
	 * The item data.
	 *
	 * @var   object
	 * @since 1.6
	 */
	protected $items;

	/**
	 * The pagination object.
	 *
	 * @var   JPagination
	 * @since 1.6
	 */
	protected $pagination;

	/**
	 * The model state.
	 *
	 * @var   JObject
	 * @since 1.6
	 */
	protected $state;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		$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');

		UsersHelper::addSubmenu('groups');

		// 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()
	{
		$canDo = JHelperContent::getActions('com_users');

		JToolbarHelper::title(JText::_('COM_USERS_VIEW_GROUPS_TITLE'), 'users groups');

		if ($canDo->get('core.create'))
		{
			JToolbarHelper::addNew('group.add');
		}

		if ($canDo->get('core.edit'))
		{
			JToolbarHelper::editList('group.edit');
			JToolbarHelper::divider();
		}

		if ($canDo->get('core.delete'))
		{
			JToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'groups.delete', 'JTOOLBAR_DELETE');
			JToolbarHelper::divider();
		}

		if ($canDo->get('core.admin') || $canDo->get('core.options'))
		{
			JToolbarHelper::preferences('com_users');
			JToolbarHelper::divider();
		}

		JToolbarHelper::help('JHELP_USERS_GROUPS');
	}

	/**
	 * 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.title' => JText::_('COM_USERS_HEADING_GROUP_TITLE'),
			'a.id'    => JText::_('JGRID_HEADING_ID'),
		);
	}
}
components/com_users/views/groups/tmpl/default.php000060400000012710152453623460016524 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$user        = JFactory::getUser();
$listOrder   = $this->escape($this->state->get('list.ordering'));
$listDirn    = $this->escape($this->state->get('list.direction'));
$debugGroups = $this->state->get('params')->get('debugGroups', 1);

JText::script('COM_USERS_GROUPS_CONFIRM_DELETE');

JFactory::getDocument()->addScriptDeclaration('
		Joomla.submitbutton = function(task) {
			if (task == "groups.delete") {
				var i, cids = document.getElementsByName("cid[]");
				for (i = 0; i < cids.length; i++) {
					if (cids[i].checked && cids[i].parentNode.getAttribute("data-usercount") != 0) {
						if (confirm(Joomla.JText._("COM_USERS_GROUPS_CONFIRM_DELETE"))) {
							Joomla.submitform(task);
						}
						return false;
					}
				}
			}

			Joomla.submitform(task);
			return false;
		};
');
?>
<form action="<?php echo JRoute::_('index.php?option=com_users&view=groups'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this, 'options' => array('filterButton' => false))); ?>
		<div class="clearfix"> </div>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped" id="groupList">
				<thead>
					<tr>
						<th width="1%" class="nowrap">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_USERS_HEADING_GROUP_TITLE', 'a.title', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap center">
							<span class="icon-publish hasTooltip" aria-hidden="true" title="<?php echo JText::_('COM_USERS_COUNT_ENABLED_USERS'); ?>">
								<span class="element-invisible"><?php echo JText::_('COM_USERS_COUNT_ENABLED_USERS'); ?></span>
							</span>
						</th>
						<th width="1%" class="nowrap center">
							<span class="icon-unpublish hasTooltip" aria-hidden="true" title="<?php echo JText::_('COM_USERS_COUNT_DISABLED_USERS'); ?>">
								<span class="element-invisible"><?php echo JText::_('COM_USERS_COUNT_DISABLED_USERS'); ?></span>
							</span>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="5">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
				<?php foreach ($this->items as $i => $item) :
					$canCreate = $user->authorise('core.create', 'com_users');
					$canEdit   = $user->authorise('core.edit', 'com_users');

					// If this group is super admin and this user is not super admin, $canEdit is false
					if (!$user->authorise('core.admin') && JAccess::checkGroup($item->id, 'core.admin'))
					{
						$canEdit = false;
					}
					$canChange = $user->authorise('core.edit.state', 'com_users');
				?>
					<tr class="row<?php echo $i % 2; ?>">
						<td class="center" data-usercount="<?php echo $item->user_count; ?>">
							<?php if ($canEdit) : ?>
								<?php echo JHtml::_('grid.id', $i, $item->id); ?>
							<?php endif; ?>
						</td>
						<td>
							<?php echo JLayoutHelper::render('joomla.html.treeprefix', array('level' => $item->level + 1)); ?>
							<?php if ($canEdit) : ?>
							<a href="<?php echo JRoute::_('index.php?option=com_users&task=group.edit&id=' . $item->id); ?>">
								<?php echo $this->escape($item->title); ?></a>
							<?php else : ?>
								<?php echo $this->escape($item->title); ?>
							<?php endif; ?>
							<?php if ($debugGroups) : ?>
								<div class="small"><a href="<?php echo JRoute::_('index.php?option=com_users&view=debuggroup&group_id=' . (int) $item->id); ?>">
								<?php echo JText::_('COM_USERS_DEBUG_GROUP'); ?></a></div>
							<?php endif; ?>
						</td>
						<td class="center btns">
							<a class="badge <?php if ($item->count_enabled > 0) echo 'badge-success'; ?>" href="<?php echo JRoute::_('index.php?option=com_users&view=users&filter[group_id]=' . (int) $item->id . '&filter[state]=0'); ?>">
								<?php echo $item->count_enabled; ?></a>
						</td>
						<td class="center btns">
							<a class="badge <?php if ($item->count_disabled > 0) echo 'badge-important'; ?>" href="<?php echo JRoute::_('index.php?option=com_users&view=users&filter[group_id]=' . (int) $item->id . '&filter[state]=1'); ?>">
								<?php echo $item->count_disabled; ?></a>
						</td>
						<td class="hidden-phone">
							<?php echo (int) $item->id; ?>
						</td>
					</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif; ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_users/views/groups/tmpl/default.xml000060400000000312152453623460016530 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_USERS_GROUPS_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_USERS_GROUPS_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_users/views/group/tmpl/edit.xml000060400000000302152453623460015645 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_USERS_GROUP_VIEW_EDIT_TITLE">
		<message>
			<![CDATA[COM_USERS_GROUP_VIEW_EDIT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_users/views/group/tmpl/edit.php000060400000003034152453623460015641 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('formbehavior.chosen', 'select');

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(task)
	{
		if (task == 'group.cancel' || document.formvalidator.isValid(document.getElementById('group-form')))
		{
			Joomla.submitform(task, document.getElementById('group-form'));
		}
	};
");
?>

<form action="<?php echo JRoute::_('index.php?option=com_users&layout=edit&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="group-form" class="form-validate form-horizontal">
	<fieldset>
		<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'details')); ?>
		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'details', JText::_('COM_USERS_USERGROUP_DETAILS')); ?>
			<?php echo $this->form->renderField('title'); ?>
			<?php echo $this->form->renderField('parent_id'); ?>
		<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php $this->ignore_fieldsets = array('group_details'); ?>
		<?php echo JLayoutHelper::render('joomla.edit.params', $this); ?>
		<?php echo JHtml::_('bootstrap.endTabSet'); ?>
	</fieldset>

	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>
</form>
components/com_users/views/group/view.html.php000060400000004100152453623460015650 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View to edit a user group.
 *
 * @since  1.6
 */
class UsersViewGroup extends JViewLegacy
{
	protected $form;

	/**
	 * The item data.
	 *
	 * @var   object
	 * @since 1.6
	 */
	protected $item;

	/**
	 * The model state.
	 *
	 * @var   JObject
	 * @since 1.6
	 */
	protected $state;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		$this->state = $this->get('State');
		$this->item  = $this->get('Item');
		$this->form  = $this->get('Form');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		$this->addToolbar();
		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		JFactory::getApplication()->input->set('hidemainmenu', true);

		$isNew = ($this->item->id == 0);
		$canDo = JHelperContent::getActions('com_users');

		JToolbarHelper::title(JText::_($isNew ? 'COM_USERS_VIEW_NEW_GROUP_TITLE' : 'COM_USERS_VIEW_EDIT_GROUP_TITLE'), 'users groups-add');

		if ($canDo->get('core.edit') || $canDo->get('core.create'))
		{
			JToolbarHelper::apply('group.apply');
			JToolbarHelper::save('group.save');
		}

		if ($canDo->get('core.create'))
		{
			JToolbarHelper::save2new('group.save2new');
		}

		// If an existing item, can save to a copy.
		if (!$isNew && $canDo->get('core.create'))
		{
			JToolbarHelper::save2copy('group.save2copy');
		}

		if (empty($this->item->id))
		{
			JToolbarHelper::cancel('group.cancel');
		}
		else
		{
			JToolbarHelper::cancel('group.cancel', 'JTOOLBAR_CLOSE');
		}

		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_USERS_GROUPS_EDIT');
	}
}
components/com_users/views/users/view.html.php000060400000010630152453623460015662 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of users.
 *
 * @since  1.6
 */
class UsersViewUsers extends JViewLegacy
{
	/**
	 * The item data.
	 *
	 * @var   object
	 * @since 1.6
	 */
	protected $items;

	/**
	 * The pagination object.
	 *
	 * @var   JPagination
	 * @since 1.6
	 */
	protected $pagination;

	/**
	 * The model state.
	 *
	 * @var   JObject
	 * @since 1.6
	 */
	protected $state;

	/**
	 * A JForm instance with filter fields.
	 *
	 * @var    JForm
	 * @since  3.6.3
	 */
	public $filterForm;

	/**
	 * An array with active filters.
	 *
	 * @var    array
	 * @since  3.6.3
	 */
	public $activeFilters;

	/**
	 * An ACL object to verify user rights.
	 *
	 * @var    JObject
	 * @since  3.6.3
	 */
	protected $canDo;

	/**
	 * An instance of JDatabaseDriver.
	 *
	 * @var    JDatabaseDriver
	 * @since  3.6.3
	 */
	protected $db;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		$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');
		$this->canDo         = JHelperContent::getActions('com_users');
		$this->db            = JFactory::getDbo();

		UsersHelper::addSubmenu('users');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Include the component HTML helpers.
		JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

		$this->addToolbar();
		$this->sidebar = JHtmlSidebar::render();

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		$canDo = $this->canDo;
		$user  = JFactory::getUser();

		// Get the toolbar object instance
		$bar = JToolbar::getInstance('toolbar');

		JToolbarHelper::title(JText::_('COM_USERS_VIEW_USERS_TITLE'), 'users user');

		if ($canDo->get('core.create'))
		{
			JToolbarHelper::addNew('user.add');
		}

		if ($canDo->get('core.edit'))
		{
			JToolbarHelper::editList('user.edit');
		}

		if ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::divider();
			JToolbarHelper::publish('users.activate', 'COM_USERS_TOOLBAR_ACTIVATE', true);
			JToolbarHelper::unpublish('users.block', 'COM_USERS_TOOLBAR_BLOCK', true);
			JToolbarHelper::custom('users.unblock', 'unblock.png', 'unblock_f2.png', 'COM_USERS_TOOLBAR_UNBLOCK', true);
			JToolbarHelper::divider();
		}

		if ($canDo->get('core.delete'))
		{
			JToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'users.delete', 'JTOOLBAR_DELETE');
			JToolbarHelper::divider();
		}

		// Add a batch button
		if ($user->authorise('core.create', 'com_users')
			&& $user->authorise('core.edit', 'com_users')
			&& $user->authorise('core.edit.state', 'com_users'))
		{
			$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') || $canDo->get('core.options'))
		{
			JToolbarHelper::preferences('com_users');
			JToolbarHelper::divider();
		}

		JToolbarHelper::help('JHELP_USERS_USER_MANAGER');
	}

	/**
	 * 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.name'          => JText::_('COM_USERS_HEADING_NAME'),
			'a.username'      => JText::_('JGLOBAL_USERNAME'),
			'a.block'         => JText::_('COM_USERS_HEADING_ENABLED'),
			'a.activation'    => JText::_('COM_USERS_HEADING_ACTIVATED'),
			'a.email'         => JText::_('JGLOBAL_EMAIL'),
			'a.lastvisitDate' => JText::_('COM_USERS_HEADING_LAST_VISIT_DATE'),
			'a.registerDate'  => JText::_('COM_USERS_HEADING_REGISTRATION_DATE'),
			'a.id'            => JText::_('JGRID_HEADING_ID'),
		);
	}
}
components/com_users/views/users/tmpl/modal.php000060400000012213152453623460016014 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip', '.hasTooltip', array('placement' => 'bottom'));
JHtml::_('bootstrap.popover', '.hasPopover', array('placement' => 'bottom'));
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('behavior.multiselect');

// 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'));

$input           = JFactory::getApplication()->input;
$field           = $input->getCmd('field');
$listOrder       = $this->escape($this->state->get('list.ordering'));
$listDirn        = $this->escape($this->state->get('list.direction'));
$enabledStates   = array(0 => 'icon-publish', 1 => 'icon-unpublish');
$activatedStates = array(0 => 'icon-publish', 1 => 'icon-unpublish');
$userRequired    = (int) $input->get('required', 0, 'int');

/**
 * Mootools compatibility
 *
 * There is an extra option passed in the URL for the iframe &ismoo=0 for the bootstraped field.
 * By default the value will be 1 or defaults to mootools behaviour using function jSelectUser()
 *
 * This should be removed when mootools won't be shipped by Joomla.
 */
$isMoo = $input->getInt('ismoo', 1);

if ($isMoo)
{
	$onClick = "window.parent.jSelectUser(this);window.parent.jQuery('.modal.in').modal('hide');";
}

?>
<div class="container-popup">
	<form action="<?php echo JRoute::_('index.php?option=com_users&view=users&layout=modal&tmpl=component&groups=' . $input->get('groups', '', 'BASE64') . '&excluded=' . $input->get('excluded', '', 'BASE64')); ?>" method="post" name="adminForm" id="adminForm">
		<?php if (!$userRequired) : ?>
		<div class="pull-left">
			<button type="button" class="btn button-select" data-user-value="0" data-user-name="<?php echo $this->escape(JText::_('JLIB_FORM_SELECT_USER')); ?>"
				data-user-field="<?php echo $this->escape($field); ?>" <?php if ($isMoo) : ?>value="" onclick="window.parent.jSelectUser(this)"<?php endif; ?>><?php echo JText::_('JOPTION_NO_USER'); ?></button>&nbsp;
		</div>
		<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<?php if (empty($this->items)) : ?>
		<div class="alert alert-no-items">
			<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
		</div>
		<?php else : ?>
		<table class="table table-striped table-condensed">
			<thead>
				<tr>
					<th class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'COM_USERS_HEADING_NAME', 'a.name', $listDirn, $listOrder); ?>
					</th>
					<th width="25%" class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_USERNAME', 'a.username', $listDirn, $listOrder); ?>
					</th>
					<th width="1%" class="nowrap center">
						<?php echo JHtml::_('searchtools.sort', 'COM_USERS_HEADING_ENABLED', 'a.block', $listDirn, $listOrder); ?>
					</th>
					<th width="1%" class="nowrap center">
						<?php echo JHtml::_('searchtools.sort', 'COM_USERS_HEADING_ACTIVATED', 'a.activation', $listDirn, $listOrder); ?>
					</th>
					<th width="25%" class="nowrap">
						<?php echo JText::_('COM_USERS_HEADING_GROUPS'); ?>
					</th>
					<th width="1%" class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
					</th>
				</tr>
			</thead>
			<tfoot>
				<tr>
					<td colspan="6">
						<?php echo $this->pagination->getListFooter(); ?>
					</td>
				</tr>
			</tfoot>
			<tbody>
				<?php $i = 0; ?>
				<?php foreach ($this->items as $item) : ?>
					<tr class="row<?php echo $i % 2; ?>">
						<td>
							<a class="pointer button-select" href="#" data-user-value="<?php echo $item->id; ?>" data-user-name="<?php echo $this->escape($item->name); ?>"
								data-user-field="<?php echo $this->escape($field); ?>" <?php if ($isMoo) : ?>onclick="<?php echo $onClick; ?>"<?php endif; ?>>
								<?php echo $this->escape($item->name); ?>
							</a>
						</td>
						<td>
							<?php echo $this->escape($item->username); ?>
						</td>
						<td class="center">
							<span class="<?php echo $enabledStates[(int) $this->escape($item->block)]; ?>"></span>
						</td>
						<td class="center">
							<span class="<?php echo $activatedStates[(empty($item->activation) ? 0 : 1)]; ?>"></span>
						</td>
						<td>
							<?php echo nl2br($item->group_names); ?>
						</td>
						<td>
							<?php echo (int) $item->id; ?>
						</td>
					</tr>
				<?php endforeach; ?>
			</tbody>
		</table>
		<?php endif; ?>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="field" value="<?php echo $this->escape($field); ?>" />
		<input type="hidden" name="boxchecked" value="0" />
		<input type="hidden" name="required" value="<?php echo $userRequired; ?>" />
		<input type="hidden" name="ismoo" value="<?php echo $isMoo; ?>" />
		<?php echo JHtml::_('form.token'); ?>
	</form>
</div>
components/com_users/views/users/tmpl/default_batch_body.php000060400000003334152453623460020526 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

// Create the copy/move options.
$options = array(
	JHtml::_('select.option', 'add', JText::_('COM_USERS_BATCH_ADD')),
	JHtml::_('select.option', 'del', JText::_('COM_USERS_BATCH_DELETE')),
	JHtml::_('select.option', 'set', JText::_('COM_USERS_BATCH_SET'))
);

// Create the reset password options.
$resetOptions = array(
	JHtml::_('select.option', '', JText::_('COM_USERS_NO_ACTION')),
	JHtml::_('select.option', 'yes', JText::_('JYES')),
	JHtml::_('select.option', 'no', JText::_('JNO'))
);
JHtml::_('formbehavior.chosen', 'select');
?>

<div class="container-fluid">
	<div class="row-fluid">
		<div class="controls">
			<label id="batch-choose-action-lbl" class="control-label" for="batch-group-id">
				<?php echo JText::_('COM_USERS_BATCH_GROUP'); ?>
			</label>
			<div id="batch-choose-action" class="combo controls">
				<div class="control-group">
					<select name="batch[group_id]" id="batch-group-id">
						<option value=""><?php echo JText::_('JSELECT'); ?></option>
						<?php echo JHtml::_('select.options', JHtml::_('user.groups')); ?>
					</select>
				</div>
			</div>
			<div class="control-group radio">
				<?php echo JHtml::_('select.radiolist', $options, 'batch[group_action]', '', 'value', 'text', 'add'); ?>
			</div>
		</div>
	</div>
	<label><?php echo JText::_('COM_USERS_REQUIRE_PASSWORD_RESET'); ?></label>
	<div class="control-group radio">
		<?php echo JHtml::_('select.radiolist', $resetOptions, 'batch[reset_id]', '', 'value', 'text', ''); ?>
	</div>
</div>
components/com_users/views/users/tmpl/default_batch_footer.php000060400000001121152453623460021057 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2015 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

?>
<button type="button" class="btn" onclick="document.getElementById('batch-group-id').value=''" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<button type="submit" class="btn btn-success" onclick="Joomla.submitbutton('user.batch');return false;">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>
components/com_users/views/users/tmpl/default.php000060400000016652152453623460016357 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$listOrder  = $this->escape($this->state->get('list.ordering'));
$listDirn   = $this->escape($this->state->get('list.direction'));
$loggeduser = JFactory::getUser();
$debugUsers = $this->state->get('params')->get('debugUsers', 1);
?>
<form action="<?php echo JRoute::_('index.php?option=com_users&view=users'); ?>" method="post" name="adminForm" id="adminForm">
	<?php if (!empty( $this->sidebar)) : ?>
		<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
		</div>
		<div id="j-main-container" class="span10">
	<?php else : ?>
		<div id="j-main-container">
	<?php endif; ?>
		<?php
		// Search tools bar
		echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this));
		?>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped" id="userList">
				<thead>
					<tr>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'COM_USERS_HEADING_NAME', 'a.name', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap">
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_USERNAME', 'a.username', $listDirn, $listOrder); ?>
						</th>
						<th width="5%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'COM_USERS_HEADING_ENABLED', 'a.block', $listDirn, $listOrder); ?>
						</th>
						<th width="5%" class="nowrap center hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_USERS_HEADING_ACTIVATED', 'a.activation', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap">
							<?php echo JText::_('COM_USERS_HEADING_GROUPS'); ?>
						</th>
						<th width="15%" class="nowrap hidden-phone hidden-tablet">
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_EMAIL', 'a.email', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone hidden-tablet">
							<?php echo JHtml::_('searchtools.sort', 'COM_USERS_HEADING_LAST_VISIT_DATE', 'a.lastvisitDate', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone hidden-tablet">
							<?php echo JHtml::_('searchtools.sort', 'COM_USERS_HEADING_REGISTRATION_DATE', 'a.registerDate', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="10">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
				<?php foreach ($this->items as $i => $item) :
					$canEdit   = $this->canDo->get('core.edit');
					$canChange = $loggeduser->authorise('core.edit.state',	'com_users');

					// If this group is super admin and this user is not super admin, $canEdit is false
					if ((!$loggeduser->authorise('core.admin')) && JAccess::check($item->id, 'core.admin'))
					{
						$canEdit   = false;
						$canChange = false;
					}
				?>
					<tr class="row<?php echo $i % 2; ?>">
						<td class="center">
							<?php if ($canEdit || $canChange) : ?>
								<?php echo JHtml::_('grid.id', $i, $item->id); ?>
							<?php endif; ?>
						</td>
						<td>
							<div class="name break-word">
							<?php if ($canEdit) : ?>
								<a href="<?php echo JRoute::_('index.php?option=com_users&task=user.edit&id=' . (int) $item->id); ?>" title="<?php echo JText::sprintf('COM_USERS_EDIT_USER', $this->escape($item->name)); ?>">
									<?php echo $this->escape($item->name); ?></a>
							<?php else : ?>
								<?php echo $this->escape($item->name); ?>
							<?php endif; ?>
							</div>
							<div class="btn-group">
								<?php echo JHtml::_('users.filterNotes', $item->note_count, $item->id); ?>
								<?php echo JHtml::_('users.notes', $item->note_count, $item->id); ?>
								<?php echo JHtml::_('users.addNote', $item->id); ?>
							</div>
							<?php echo JHtml::_('users.notesModal', $item->note_count, $item->id); ?>
							<?php if ($item->requireReset == '1') : ?>
								<span class="label label-warning"><?php echo JText::_('COM_USERS_PASSWORD_RESET_REQUIRED'); ?></span>
							<?php endif; ?>
							<?php if ($debugUsers) : ?>
								<div class="small"><a href="<?php echo JRoute::_('index.php?option=com_users&view=debuguser&user_id=' . (int) $item->id); ?>">
								<?php echo JText::_('COM_USERS_DEBUG_USER'); ?></a></div>
							<?php endif; ?>
						</td>
						<td class="break-word">
							<?php echo $this->escape($item->username); ?>
						</td>
						<td class="center">
							<?php
							$self = $loggeduser->id == $item->id;

							if ($canChange) :
								echo JHtml::_('jgrid.state', JHtml::_('users.blockStates', $self), $item->block, $i, 'users.', !$self);
							else :
								echo JHtml::_('jgrid.state', JHtml::_('users.blockStates', $self), $item->block, $i, 'users.', false);
							endif; ?>
						</td>
						<td class="center hidden-phone">
							<?php
							$activated = empty( $item->activation) ? 0 : 1;
							echo JHtml::_('jgrid.state', JHtml::_('users.activateStates'), $activated, $i, 'users.', (boolean) $activated);
							?>
						</td>
						<td>
							<?php if (substr_count($item->group_names, "\n") > 1) : ?>
								<span class="hasTooltip" title="<?php echo JHtml::_('tooltipText', JText::_('COM_USERS_HEADING_GROUPS'), nl2br($item->group_names), 0); ?>"><?php echo JText::_('COM_USERS_USERS_MULTIPLE_GROUPS'); ?></span>
							<?php else : ?>
								<?php echo nl2br($item->group_names); ?>
							<?php endif; ?>
						</td>
						<td class="hidden-phone break-word hidden-tablet">
							<?php echo JStringPunycode::emailToUTF8($this->escape($item->email)); ?>
						</td>
						<td class="hidden-phone hidden-tablet">
							<?php if ($item->lastvisitDate != $this->db->getNullDate()) : ?>
								<?php echo JHtml::_('date', $item->lastvisitDate, JText::_('DATE_FORMAT_LC6')); ?>
							<?php else : ?>
								<?php echo JText::_('JNEVER'); ?>
							<?php endif; ?>
						</td>
						<td class="hidden-phone hidden-tablet">
							<?php echo JHtml::_('date', $item->registerDate, JText::_('DATE_FORMAT_LC6')); ?>
						</td>
						<td class="hidden-phone">
							<?php echo (int) $item->id; ?>
						</td>
					</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
			<?php // Load the batch processing form if user is allowed ?>
			<?php if ($loggeduser->authorise('core.create', 'com_users')
				&& $loggeduser->authorise('core.edit', 'com_users')
				&& $loggeduser->authorise('core.edit.state', 'com_users')) : ?>
				<?php echo JHtml::_(
					'bootstrap.renderModal',
					'collapseModal',
					array(
						'title'  => JText::_('COM_USERS_BATCH_OPTIONS'),
						'footer' => $this->loadTemplate('batch_footer'),
					),
					$this->loadTemplate('batch_body')
				); ?>
			<?php endif; ?>
		<?php endif; ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_users/views/users/tmpl/default.xml000060400000000310152453623460016350 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_USERS_USERS_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_USERS_USERS_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_users/views/notes/view.html.php000060400000007536152453623460015664 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

/**
 * User notes list view
 *
 * @since  2.5
 */
class UsersViewNotes extends JViewLegacy
{
	/**
	 * A list of user note objects.
	 *
	 * @var    array
	 * @since  2.5
	 */
	protected $items;

	/**
	 * The pagination object.
	 *
	 * @var    JPagination
	 * @since  2.5
	 */
	protected $pagination;

	/**
	 * The model state.
	 *
	 * @var    JObject
	 * @since  2.5
	 */
	protected $state;

	/**
	 * The model state.
	 *
	 * @var    JUser
	 * @since  2.5
	 */
	protected $user;

	/**
	 * Override the display method for the view.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise a JError object.
	 *
	 * @since   2.5
	 */
	public function display($tpl = null)
	{
		// Initialise view variables.
		$this->items         = $this->get('Items');
		$this->pagination    = $this->get('Pagination');
		$this->state         = $this->get('State');
		$this->user          = $this->get('User');
		$this->filterForm    = $this->get('FilterForm');
		$this->activeFilters = $this->get('ActiveFilters');

		UsersHelper::addSubmenu('notes');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Get the component HTML helpers
		JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

		// Turn parameters into registry objects
		foreach ($this->items as $item)
		{
			$item->cparams = new Registry($item->category_params);
		}

		$this->addToolbar();
		$this->sidebar = JHtmlSidebar::render();
		parent::display($tpl);
	}

	/**
	 * Display the toolbar.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	protected function addToolbar()
	{
		$canDo = JHelperContent::getActions('com_users', 'category', $this->state->get('filter.category_id'));

		JToolbarHelper::title(JText::_('COM_USERS_VIEW_NOTES_TITLE'), 'users user');

		if ($canDo->get('core.create'))
		{
			JToolbarHelper::addNew('note.add');
		}

		if ($canDo->get('core.edit'))
		{
			JToolbarHelper::editList('note.edit');
		}

		if ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::divider();
			JToolbarHelper::publish('notes.publish', 'JTOOLBAR_PUBLISH', true);
			JToolbarHelper::unpublish('notes.unpublish', 'JTOOLBAR_UNPUBLISH', true);

			JToolbarHelper::divider();
			JToolbarHelper::archiveList('notes.archive');
			JToolbarHelper::checkin('notes.checkin');
		}

		if ($this->state->get('filter.published') == -2 && $canDo->get('core.delete'))
		{
			JToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'notes.delete', 'JTOOLBAR_EMPTY_TRASH');
			JToolbarHelper::divider();
		}
		elseif ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::trash('notes.trash');
			JToolbarHelper::divider();
		}

		if ($canDo->get('core.admin') || $canDo->get('core.options'))
		{
			JToolbarHelper::preferences('com_users');
			JToolbarHelper::divider();
		}

		JToolbarHelper::help('JHELP_USERS_USER_NOTES');

		JHtmlSidebar::setAction('index.php?option=com_users&view=notes');
	}

	/**
	 * 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(
			'u.name'        => JText::_('COM_USERS_USER_HEADING'),
			'a.subject'     => JText::_('COM_USERS_SUBJECT_HEADING'),
			'c.title'       => JText::_('COM_USERS_CATEGORY_HEADING'),
			'a.state'       => JText::_('JSTATUS'),
			'a.review_time' => JText::_('COM_USERS_REVIEW_HEADING'),
			'a.id'          => JText::_('JGRID_HEADING_ID')
		);
	}
}
components/com_users/views/notes/tmpl/default.php000060400000011560152453623460016337 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$user       = JFactory::getUser();
$listOrder  = $this->escape($this->state->get('list.ordering'));
$listDirn   = $this->escape($this->state->get('list.direction'));
?>
<form action="<?php echo JRoute::_('index.php?option=com_users&view=notes'); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>

		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
		<table class="table table-striped">
			<thead>
				<tr>
					<th width="1%" class="nowrap center">
						<?php echo JHtml::_('grid.checkall'); ?>
					</th>
					<th width="1%" class="nowrap center">
						<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
					</th>
					<th class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'COM_USERS_HEADING_SUBJECT', 'a.subject', $listDirn, $listOrder); ?>
					</th>
					<th width="20%" class="nowrap hidden-phone">
						<?php echo JHtml::_('searchtools.sort', 'COM_USERS_HEADING_USER', 'u.name', $listDirn, $listOrder); ?>
					</th>
					<th width="10%" class="nowrap hidden-phone hidden-tablet">
						<?php echo JHtml::_('searchtools.sort', 'COM_USERS_HEADING_REVIEW', 'a.review_time', $listDirn, $listOrder); ?>
					</th>
					<th width="1%" class="nowrap hidden-phone">
						<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
					</th>
				</tr>
			</thead>
			<tfoot>
				<tr>
					<td colspan="6">
						<?php echo $this->pagination->getListFooter(); ?>
					</td>
				</tr>
			</tfoot>
			<tbody>
			<?php foreach ($this->items as $i => $item) :
				$canEdit    = $user->authorise('core.edit',       'com_users.category.' . $item->catid);
				$canCheckin = $user->authorise('core.admin',      'com_checkin') || $item->checked_out == $user->get('id') || $item->checked_out == 0;
				$canChange  = $user->authorise('core.edit.state', 'com_users.category.' . $item->catid) && $canCheckin;
				$subject    = $item->subject ?: JText::_('COM_USERS_EMPTY_SUBJECT');
				?>
				<tr class="row<?php echo $i % 2; ?>">
					<td class="center checklist">
						<?php echo JHtml::_('grid.id', $i, $item->id); ?>
					</td>
					<td class="center">
						<div class="btn-group">
							<?php echo JHtml::_('jgrid.published', $item->state, $i, 'notes.', $canChange, 'cb', $item->publish_up, $item->publish_down); ?>
							<?php // Create dropdown items and render the dropdown list.
							if ($canChange)
							{
								JHtml::_('actionsdropdown.' . ((int) $item->state === 2 ? 'un' : '') . 'archive', 'cb' . $i, 'notes');
								JHtml::_('actionsdropdown.' . ((int) $item->state === -2 ? 'un' : '') . 'trash', 'cb' . $i, 'notes');
								echo JHtml::_('actionsdropdown.render', $this->escape($subject));
							}
							?>
						</div>
					</td>
					<td>
						<?php if ($item->checked_out) : ?>
							<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'notes.', $canCheckin); ?>
						<?php endif; ?>
						<?php $subject = $item->subject ?: JText::_('COM_USERS_EMPTY_SUBJECT'); ?>
						<?php if ($canEdit) : ?>
							<a href="<?php echo JRoute::_('index.php?option=com_users&task=note.edit&id=' . $item->id); ?>"><?php echo $this->escape($subject); ?></a>
						<?php else : ?>
							<?php echo $this->escape($subject); ?>
						<?php endif; ?>
						<div class="small">
							<?php echo JText::_('JCATEGORY') . ': ' . $this->escape($item->category_title); ?>
						</div>
					</td>
					<td class="hidden-phone">
						<?php echo $this->escape($item->user_name); ?>
					</td>
					<td class="hidden-phone hidden-tablet">
						<?php if ($item->review_time !== JFactory::getDbo()->getNullDate()) : ?>
							<?php echo JHtml::_('date', $item->review_time, JText::_('DATE_FORMAT_LC4')); ?>
						<?php else : ?>
							<?php echo JText::_('COM_USERS_EMPTY_REVIEW'); ?>
						<?php endif; ?>
					</td>
					<td class="hidden-phone">
						<?php echo (int) $item->id; ?>
					</td>
				</tr>
			<?php endforeach; ?>
			</tbody>
		</table>
		<?php endif; ?>

		<div>
			<input type="hidden" name="task" value="" />
			<input type="hidden" name="boxchecked" value="0" />
			<?php echo JHtml::_('form.token'); ?>
		</div>
	</div>
</form>
components/com_users/views/notes/tmpl/default.xml000060400000000310152453623460016337 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_USERS_NOTES_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_USERS_NOTES_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_users/views/notes/tmpl/modal.php000060400000003207152453623460016006 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');
?>
<div class="unotes">
	<h1><?php echo JText::sprintf('COM_USERS_NOTES_FOR_USER', $this->user->name, $this->user->id); ?></h1>
<?php if (empty($this->items)) : ?>
	<?php echo JText::_('COM_USERS_NO_NOTES'); ?>
<?php else : ?>
	<ul class="alternating">
	<?php foreach ($this->items as $item) : ?>
		<li>
			<div class="fltlft utitle">
				<?php if ($item->subject) : ?>
					<h4><?php echo JText::sprintf('COM_USERS_NOTE_N_SUBJECT', (int) $item->id, $this->escape($item->subject)); ?></h4>
				<?php else : ?>
					<h4><?php echo JText::sprintf('COM_USERS_NOTE_N_SUBJECT', (int) $item->id, JText::_('COM_USERS_EMPTY_SUBJECT')); ?></h4>
				<?php endif; ?>
			</div>

			<div class="fltlft utitle">
				<?php echo JHtml::_('date', $item->created_time, JText::_('DATE_FORMAT_LC2')); ?>
			</div>

			<?php $category_image = $item->cparams->get('image'); ?>

			<?php if ($item->catid && isset($category_image)) : ?>
			<div class="fltlft utitle">
				<?php echo JHtml::_('users.image', $category_image); ?>
			</div>

			<div class="fltlft utitle">
				<em><?php echo $this->escape($item->category_title); ?></em>
			</div>
			<?php endif; ?>

			<div class="clr"></div>
			<div class="ubody">
				<?php echo (isset($item->body) ? JHtml::_('content.prepare', $item->body) : ''); ?>
			</div>
		</li>
	<?php endforeach; ?>
	</ul>
<?php endif; ?>
</div>
components/com_users/views/levels/tmpl/default.php000060400000011420152453623460016474 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$user       = JFactory::getUser();
$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_users&task=levels.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'levelList', 'adminForm', strtolower($listDirn), $saveOrderingUrl);
}

?>
<form action="<?php echo JRoute::_('index.php?option=com_users&view=levels'); ?>" method="post" id="adminForm" name="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this, 'options' => array('filterButton' => false))); ?>
		<div class="clearfix"> </div>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped" id="levelList">
				<thead>
					<tr>
						<th width="1%" class="nowrap center hidden-phone">
							<?php echo JHtml::_('searchtools.sort', '', 'a.ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING', 'icon-menu-2'); ?>
						</th>
						<th width="1%">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th>
							<?php echo JHtml::_('searchtools.sort', 'COM_USERS_HEADING_LEVEL_NAME', 'a.title', $listDirn, $listOrder); ?>
						</th>
						<th class="nowrap hidden-phone">
							<?php echo JText::_('COM_USERS_USER_GROUPS_HAVING_ACCESS'); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="5">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
				<?php $count = count($this->items); ?>
				<?php foreach ($this->items as $i => $item) :
					$ordering  = ($listOrder == 'a.ordering');
					$canCreate = $user->authorise('core.create',     'com_users');
					$canEdit   = $user->authorise('core.edit',       'com_users');
					$canChange = $user->authorise('core.edit.state', 'com_users');

					// Decode level groups
					$groups = json_decode($item->rules);

					// If this group is super admin and this user is not super admin, $canEdit is false
					if (!JFactory::getUser()->authorise('core.admin') && JAccess::checkGroup($groups[0], 'core.admin'))
					{
						$canEdit   = false;
						$canChange = false;
					}
					?>
					<tr class="row<?php echo $i % 2; ?>">
						<td class="order nowrap center hidden-phone">
							<?php
							$iconClass = '';
							if (!$canChange)
							{
								$iconClass = ' inactive';
							}
							elseif (!$saveOrder)
							{
								$iconClass = ' inactive tip-top hasTooltip" title="' . JHtml::_('tooltipText', 'JORDERINGDISABLED');
							}
							?>
							<span class="sortable-handler<?php echo $iconClass ?>">
								<span class="icon-menu" aria-hidden="true"></span>
							</span>
							<?php if ($canChange && $saveOrder) : ?>
								<input type="text" style="display:none" name="order[]" size="5" value="<?php echo $item->ordering; ?>" class="width-20 text-area-order" />
							<?php endif; ?>
						</td>
						<td class="center">
							<?php if ($canEdit) : ?>
								<?php echo JHtml::_('grid.id', $i, $item->id); ?>
							<?php endif; ?>
						</td>
						<td>
							<?php if ($canEdit) : ?>
							<a href="<?php echo JRoute::_('index.php?option=com_users&task=level.edit&id=' . $item->id); ?>">
								<?php echo $this->escape($item->title); ?></a>
							<?php else : ?>
								<?php echo $this->escape($item->title); ?>
							<?php endif; ?>
						</td>
						<td class="hidden-phone">
							<?php echo UsersHelper::getVisibleByGroups($item->rules); ?>
						</td>
						<td class="hidden-phone">
							<?php echo (int) $item->id; ?>
						</td>
					</tr>
				<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif; ?>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_users/views/levels/tmpl/default.xml000060400000000312152453623460016503 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_USERS_LEVELS_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_USERS_LEVELS_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_users/views/levels/view.html.php000060400000005107152453623460016016 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of view levels.
 *
 * @since  1.6
 */
class UsersViewLevels extends JViewLegacy
{
	/**
	 * The item data.
	 *
	 * @var   object
	 * @since 1.6
	 */
	protected $items;

	/**
	 * The pagination object.
	 *
	 * @var   JPagination
	 * @since 1.6
	 */
	protected $pagination;

	/**
	 * The model state.
	 *
	 * @var   JObject
	 * @since 1.6
	 */
	protected $state;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		$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');

		UsersHelper::addSubmenu('levels');

		// 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()
	{
		$canDo = JHelperContent::getActions('com_users');

		JToolbarHelper::title(JText::_('COM_USERS_VIEW_LEVELS_TITLE'), 'users levels');

		if ($canDo->get('core.create'))
		{
			JToolbarHelper::addNew('level.add');
		}

		if ($canDo->get('core.edit'))
		{
			JToolbarHelper::editList('level.edit');
			JToolbarHelper::divider();
		}

		if ($canDo->get('core.delete'))
		{
			JToolbarHelper::deleteList('JGLOBAL_CONFIRM_DELETE', 'level.delete', 'JTOOLBAR_DELETE');
			JToolbarHelper::divider();
		}

		if ($canDo->get('core.admin') || $canDo->get('core.options'))
		{
			JToolbarHelper::preferences('com_users');
			JToolbarHelper::divider();
		}

		JToolbarHelper::help('JHELP_USERS_ACCESS_LEVELS');
	}

	/**
	 * 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.ordering' => JText::_('JGRID_HEADING_ORDERING'),
			'a.title'    => JText::_('COM_USERS_HEADING_LEVEL_NAME'),
			'a.id'       => JText::_('JGRID_HEADING_ID'),
		);
	}
}
components/com_users/views/level/tmpl/edit.xml000060400000000302152453623460015620 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_USERS_LEVEL_VIEW_EDIT_TITLE">
		<message>
			<![CDATA[COM_USERS_LEVEL_VIEW_EDIT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_users/views/level/tmpl/edit.php000060400000002666152453623460015626 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.formvalidator');

JFactory::getDocument()->addScriptDeclaration("
	Joomla.submitbutton = function(task)
	{
		if (task == 'level.cancel' || document.formvalidator.isValid(document.getElementById('level-form')))
		{
			Joomla.submitform(task, document.getElementById('level-form'));
		}
	};
");
?>

<form action="<?php echo JRoute::_('index.php?option=com_users&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="level-form" class="form-validate form-horizontal">
	<fieldset>
		<legend><?php echo JText::_('COM_USERS_LEVEL_DETAILS'); ?></legend>
		<div class="control-group">
			<div class="control-label">
				<?php echo $this->form->getLabel('title'); ?>
			</div>
			<div class="controls">
				<?php echo $this->form->getInput('title'); ?>
			</div>
		</div>
	</fieldset>

	<fieldset>
		<legend><?php echo JText::_('COM_USERS_USER_GROUPS_HAVING_ACCESS'); ?></legend>
		<?php echo JHtml::_('access.usergroups', 'jform[rules]', $this->item->rules, true); ?>
	</fieldset>
	<input type="hidden" name="task" value="" />
	<?php echo JHtml::_('form.token'); ?>
</form>
components/com_users/views/level/view.html.php000060400000004114152453623460015630 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View to edit a user view level.
 *
 * @since  1.6
 */
class UsersViewLevel extends JViewLegacy
{
	protected $form;

	/**
	 * The item data.
	 *
	 * @var   object
	 * @since 1.6
	 */
	protected $item;

	/**
	 * The model state.
	 *
	 * @var   JObject
	 * @since 1.6
	 */
	protected $state;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		$this->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();
		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		JFactory::getApplication()->input->set('hidemainmenu', true);

		$isNew = ($this->item->id == 0);
		$canDo = JHelperContent::getActions('com_users');

		JToolbarHelper::title(JText::_($isNew ? 'COM_USERS_VIEW_NEW_LEVEL_TITLE' : 'COM_USERS_VIEW_EDIT_LEVEL_TITLE'), 'users levels-add');

		if ($canDo->get('core.edit') || $canDo->get('core.create'))
		{
			JToolbarHelper::apply('level.apply');
			JToolbarHelper::save('level.save');
		}

		if ($canDo->get('core.create'))
		{
			JToolbarHelper::save2new('level.save2new');
		}

		// If an existing item, can save to a copy.
		if (!$isNew && $canDo->get('core.create'))
		{
			JToolbarHelper::save2copy('level.save2copy');
		}

		if (empty($this->item->id))
		{
			JToolbarHelper::cancel('level.cancel');
		}
		else
		{
			JToolbarHelper::cancel('level.cancel', 'JTOOLBAR_CLOSE');
		}

		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_USERS_ACCESS_LEVELS_EDIT');
	}
}
components/com_users/views/mail/tmpl/default.xml000060400000000306152453623460016136 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_USERS_MAIL_VIEW_DEFAULT_TITLE">
		<message>
			<![CDATA[COM_USERS_MAIL_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_users/views/mail/tmpl/default.php000060400000006604152453623460016134 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$script = "\t" . 'Joomla.submitbutton = function(pressbutton) {' . "\n";
$script .= "\t\t" . 'var form = document.adminForm;' . "\n";
$script .= "\t\t" . 'if (pressbutton == \'mail.cancel\') {' . "\n";
$script .= "\t\t\t" . 'Joomla.submitform(pressbutton);' . "\n";
$script .= "\t\t\t" . 'return;' . "\n";
$script .= "\t\t" . '}' . "\n";
$script .= "\t\t" . '// do field validation' . "\n";
$script .= "\t\t" . 'if (form.jform_subject.value == ""){' . "\n";
$script .= "\t\t\t" . 'alert("' . JText::_('COM_USERS_MAIL_PLEASE_FILL_IN_THE_SUBJECT', true) . '");' . "\n";
$script .= "\t\t" . '} else if (getSelectedValue(\'adminForm\',\'jform[group]\') < 0){' . "\n";
$script .= "\t\t\t" . 'alert("' . JText::_('COM_USERS_MAIL_PLEASE_SELECT_A_GROUP', true) . '");' . "\n";
$script .= "\t\t" . '} else if (form.jform_message.value == ""){' . "\n";
$script .= "\t\t\t" . 'alert("' . JText::_('COM_USERS_MAIL_PLEASE_FILL_IN_THE_MESSAGE', true) . '");' . "\n";
$script .= "\t\t" . '} else {' . "\n";
$script .= "\t\t\t" . 'Joomla.submitform(pressbutton);' . "\n";
$script .= "\t\t" . '}' . "\n";
$script .= "\t\t" . '}' . "\n";

JHtml::_('behavior.core');
JHtml::_('formbehavior.chosen', 'select');

JFactory::getDocument()->addScriptDeclaration($script);
?>

<form action="<?php echo JRoute::_('index.php?option=com_users&view=mail'); ?>" name="adminForm" method="post" id="adminForm">
	<div class="row-fluid">
		<div class="span9">
			<fieldset class="adminform">
				<div class="control-group">
					<div class="control-label"><?php echo $this->form->getLabel('subject'); ?></div>
					<div class="controls"><?php echo JComponentHelper::getParams('com_users')->get('mailSubjectPrefix'); ?>
						<?php echo $this->form->getInput('subject'); ?></div>
				</div>
				<div class="control-group">
					<div class="control-label"><?php echo $this->form->getLabel('message'); ?></div>
					<div class="controls"><?php echo $this->form->getInput('message'); ?><br>
						<?php echo JComponentHelper::getParams('com_users')->get('mailBodySuffix'); ?></div>
				</div>
			</fieldset>
			<input type="hidden" name="task" value="" />
			<?php echo JHtml::_('form.token'); ?>
		</div>
		<div class="span3">
			<fieldset class="form-inline">
				<div class="control-group checkbox">
					<div class="controls"><?php echo $this->form->getInput('recurse'); ?> <?php echo $this->form->getLabel('recurse'); ?></div>
				</div>
				<div class="control-group checkbox">
					<div class="control-label"><?php echo $this->form->getInput('mode'); ?> <?php echo $this->form->getLabel('mode'); ?></div>
				</div>
				<div class="control-group checkbox">
					<div class="control-label"><?php echo $this->form->getInput('disabled'); ?> <?php echo $this->form->getLabel('disabled'); ?></div>
				</div>
				<div class="control-group checkbox">
					<div class="control-label"><?php echo $this->form->getInput('bcc'); ?> <?php echo $this->form->getLabel('bcc'); ?></div>
				</div>
				<div class="control-group">
					<div class="control-label"><?php echo $this->form->getLabel('group'); ?></div>
					<div class="controls"><?php echo $this->form->getInput('group'); ?></div>
				</div>
			</fieldset>
		</div>
	</div>
</form>
components/com_users/views/mail/view.html.php000060400000002770152453623460015451 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Users mail view.
 *
 * @since  1.6
 */
class UsersViewMail extends JViewLegacy
{
	/**
	 * @var object form object
	 */
	protected $form;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		// Redirect to admin index if mass mailer disabled in conf
		if (JFactory::getApplication()->get('massmailoff', 0) == 1)
		{
			JFactory::getApplication()->redirect(JRoute::_('index.php', false));
		}

		// Get data from the model
		$this->form = $this->get('Form');

		$this->addToolbar();
		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		JFactory::getApplication()->input->set('hidemainmenu', true);

		JToolbarHelper::title(JText::_('COM_USERS_MASS_MAIL'), 'users massmail');
		JToolbarHelper::custom('mail.send', 'envelope.png', 'send_f2.png', 'COM_USERS_TOOLBAR_MAIL_SEND_MAIL', false);
		JToolbarHelper::cancel('mail.cancel');
		JToolbarHelper::divider();
		JToolbarHelper::preferences('com_users');
		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_USERS_MASS_MAIL_USERS');
	}
}
components/com_users/views/note/view.html.php000060400000005673152453623460015501 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * User note edit view
 *
 * @since  2.5
 */
class UsersViewNote extends JViewLegacy
{
	/**
	 * The edit form.
	 *
	 * @var    JForm
	 * @since  2.5
	 */
	protected $form;

	/**
	 * The item data.
	 *
	 * @var    object
	 * @since  2.5
	 */
	protected $item;

	/**
	 * The model state.
	 *
	 * @var    JObject
	 * @since  2.5
	 */
	protected $state;

	/**
	 * Override the display method for the view.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise a JError object.
	 *
	 * @since   2.5
	 */
	public function display($tpl = null)
	{
		// Initialise view variables.
		$this->state = $this->get('State');
		$this->item  = $this->get('Item');
		$this->form  = $this->get('Form');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		// Get the component HTML helpers
		JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

		parent::display($tpl);
		$this->addToolbar();
	}

	/**
	 * Display the toolbar.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	protected function addToolbar()
	{
		$input = JFactory::getApplication()->input;
		$input->set('hidemainmenu', 1);

		$user       = JFactory::getUser();
		$isNew      = ($this->item->id == 0);
		$checkedOut = !($this->item->checked_out == 0 || $this->item->checked_out == $user->get('id'));

		// Since we don't track these assets at the item level, use the category id.
		$canDo = JHelperContent::getActions('com_users', 'category', $this->item->catid);

		JToolbarHelper::title(JText::_('COM_USERS_NOTES'), 'users user');

		// If not checked out, can save the item.
		if (!$checkedOut && ($canDo->get('core.edit') || count($user->getAuthorisedCategories('com_users', 'core.create'))))
		{
			JToolbarHelper::apply('note.apply');
			JToolbarHelper::save('note.save');
		}

		if (!$checkedOut && count($user->getAuthorisedCategories('com_users', 'core.create')))
		{
			JToolbarHelper::save2new('note.save2new');
		}

		// If an existing item, can save to a copy.
		if (!$isNew && (count($user->getAuthorisedCategories('com_users', 'core.create')) > 0))
		{
			JToolbarHelper::save2copy('note.save2copy');
		}

		if (empty($this->item->id))
		{
			JToolbarHelper::cancel('note.cancel');
		}
		else
		{
			if (JComponentHelper::isEnabled('com_contenthistory') && $this->state->params->get('save_history', 0) && $canDo->get('core.edit'))
			{
				JToolbarHelper::versions('com_users.note', $this->item->id);
			}

			JToolbarHelper::cancel('note.cancel', 'JTOOLBAR_CLOSE');
		}

		JToolbarHelper::divider();
		JToolbarHelper::help('JHELP_USERS_USER_NOTES_EDIT');
	}
}
components/com_users/views/note/tmpl/edit.xml000060400000000300152453623460015454 0ustar00<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="COM_USERS_NOTE_VIEW_EDIT_TITLE">
		<message>
			<![CDATA[COM_USERS_NOTE_VIEW_EDIT_DESC]]>
		</message>
	</layout>
</metadata>
components/com_users/views/note/tmpl/edit.php000060400000005122152453623460015452 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.formvalidator');
JHtml::_('formbehavior.chosen', 'select');

JFactory::getDocument()->addScriptDeclaration('
jQuery(document).ready(function() {
	Joomla.submitbutton = function(task)
	{
		if (task == "note.cancel" || document.formvalidator.isValid(document.getElementById("note-form")))
		{
			' . $this->form->getField('body')->save() . '
			Joomla.submitform(task, document.getElementById("note-form"));
		}
	}
});');
?>
<form action="<?php echo JRoute::_('index.php?option=com_users&view=note&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="note-form" class="form-validate form-horizontal">
		<fieldset class="adminform">
			<div class="control-group">
				<div class="control-label">
					<?php echo $this->form->getLabel('subject'); ?>
				</div>
				<div class="controls">
					<?php echo $this->form->getInput('subject'); ?>
				</div>
			</div>
			<div class="control-group">
				<div class="control-label">
					<?php echo $this->form->getLabel('user_id'); ?>
				</div>
				<div class="controls">
					<?php echo $this->form->getInput('user_id'); ?>
				</div>
			</div>
			<div class="control-group">
				<div class="control-label">
					<?php echo $this->form->getLabel('catid'); ?>
				</div>
				<div class="controls">
					<?php echo $this->form->getInput('catid'); ?>
				</div>
			</div>
			<div class="control-group">
				<div class="control-label">
					<?php echo $this->form->getLabel('state'); ?>
				</div>
				<div class="controls">
					<?php echo $this->form->getInput('state'); ?>
				</div>
			</div>
			<div class="control-group">
				<div class="control-label">
					<?php echo $this->form->getLabel('review_time'); ?>
				</div>
				<div class="controls">
					<?php echo $this->form->getInput('review_time'); ?>
				</div>
			</div>
			<div class="control-group">
				<div class="control-label">
					<?php echo $this->form->getLabel('version_note'); ?>
				</div>
				<div class="controls">
					<?php echo $this->form->getInput('version_note'); ?>
				</div>
			</div>

			<div class="control-group">
				<div class="control-label">
					<?php echo $this->form->getLabel('body'); ?>
				</div>
				<div class="controls">
					<?php echo $this->form->getInput('body'); ?>
				</div>
			</div>

			<input type="hidden" name="task" value="" />
			<?php echo JHtml::_('form.token'); ?>
		</fieldset>
</form>
components/com_users/views/debuggroup/view.html.php000060400000004552152453623460016672 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * View class for a list of User Group ACL permissions.
 *
 * @since  1.6
 */
class UsersViewDebuggroup extends JViewLegacy
{
	protected $actions;

	/**
	 * The item data.
	 *
	 * @var   object
	 * @since 1.6
	 */
	protected $items;

	/**
	 * The pagination object.
	 *
	 * @var   JPagination
	 * @since 1.6
	 */
	protected $pagination;

	/**
	 * The model state.
	 *
	 * @var   JObject
	 * @since 1.6
	 */
	protected $state;

	/**
	 * Display the view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 */
	public function display($tpl = null)
	{
		// Access check.
		if (!JFactory::getUser()->authorise('core.manage', 'com_users'))
		{
			throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
		}

		$this->actions       = $this->get('DebugActions');
		$this->items         = $this->get('Items');
		$this->pagination    = $this->get('Pagination');
		$this->state         = $this->get('State');
		$this->group         = $this->get('Group');
		$this->filterForm    = $this->get('FilterForm');
		$this->activeFilters = $this->get('ActiveFilters');

		// Vars only used in hathor.
		// @deprecated  4.0 To be removed with Hathor
		$this->levels        = UsersHelperDebug::getLevelsOptions();
		$this->components    = UsersHelperDebug::getComponents();

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		$this->addToolbar();

		parent::display($tpl);
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolbar()
	{
		$canDo = JHelperContent::getActions('com_users');

		JToolbarHelper::title(JText::sprintf('COM_USERS_VIEW_DEBUG_GROUP_TITLE', $this->group->id, $this->escape($this->group->title)), 'users groups');
		JToolbarHelper::cancel('group.cancel', 'JTOOLBAR_CLOSE');

		if ($canDo->get('core.admin') || $canDo->get('core.options'))
		{
			JToolbarHelper::preferences('com_users');
			JToolbarHelper::divider();
		}

		JToolbarHelper::help('JHELP_USERS_DEBUG_GROUPS');
	}
}
components/com_users/views/debuggroup/tmpl/default.php000060400000007727152453623460017364 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('formbehavior.chosen', 'select');

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$colSpan   = 4 + count($this->actions);
?>
<form action="<?php echo JRoute::_('index.php?option=com_users&view=debuggroup&group_id=' . (int) $this->state->get('group_id')); ?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)) : ?>
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
<?php else : ?>
	<div id="j-main-container">
<?php endif; ?>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<div class="clearfix"> </div>
		<table class="table table-striped">
			<thead>
				<tr>
					<th class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'COM_USERS_HEADING_ASSET_TITLE', 'a.title', $listDirn, $listOrder); ?>
					</th>
					<th class="nowrap">
						<?php echo JHtml::_('searchtools.sort', 'COM_USERS_HEADING_ASSET_NAME', 'a.name', $listDirn, $listOrder); ?>
					</th>
					<?php foreach ($this->actions as $key => $action) : ?>
					<th width="5%" class="center">
						<span class="hasTooltip" title="<?php echo JHtml::_('tooltipText', $key, $action[1]); ?>"><?php echo JText::_($key); ?></span>
					</th>
					<?php endforeach; ?>
					<th width="5%" class="nowrap center">
						<?php echo JHtml::_('searchtools.sort', 'COM_USERS_HEADING_LFT', 'a.lft', $listDirn, $listOrder); ?>
					</th>
					<th width="1%" class="nowrap center">
						<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
					</th>
				</tr>
			</thead>
			<tfoot>
				<tr>
					<td colspan="<?php echo $colSpan; ?>">
						<?php echo $this->pagination->getListFooter(); ?>
					</td>
				</tr>
			</tfoot>
			<tbody>
				<?php foreach ($this->items as $i => $item) : ?>
					<tr class="row0">
						<td>
							<?php echo $this->escape($item->title); ?>
						</td>
						<td class="nowrap">
							<?php echo JLayoutHelper::render('joomla.html.treeprefix', array('level' => $item->level + 1)) . $this->escape($item->name); ?>
						</td>
						<?php foreach ($this->actions as $action) : ?>
							<?php
							$name  = $action[0];
							$check = $item->checks[$name];
							if ($check === true) :
								$class  = 'icon-ok';
								$button = 'btn-success';
							elseif ($check === false) :
								$class  = 'icon-remove';
								$button = 'btn-danger';
							elseif ($check === null) :
								$class  = 'icon-ban-circle';
								$button = 'btn-warning';
							else :
								$class  = '';
								$button = '';
							endif;
							?>
						<td class="center">
							<span class="icon-white <?php echo $class; ?>"></span>
						</td>
						<?php endforeach; ?>
						<td class="center">
							<?php echo (int) $item->lft; ?>
							- <?php echo (int) $item->rgt; ?>
						</td>
						<td class="center">
							<?php echo (int) $item->id; ?>
						</td>
					</tr>
				<?php endforeach; ?>
			</tbody>
		</table>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
		<div>
			<?php echo JText::_('COM_USERS_DEBUG_LEGEND'); ?>
			<span class="icon-white icon-ban-circle"></span><?php echo JText::_('COM_USERS_DEBUG_IMPLICIT_DENY'); ?>&nbsp;
			<span class="icon-white icon-ok"></span><?php echo JText::_('COM_USERS_DEBUG_EXPLICIT_ALLOW'); ?>&nbsp;
			<span class="icon-white icon-remove"></span><?php echo JText::_('COM_USERS_DEBUG_EXPLICIT_DENY'); ?>
			<br /><br />
		</div>
	</div>
</form>
components/com_users/tables/note.php000060400000007406152453623460013675 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * User notes table class
 *
 * @since  2.5
 */
class UsersTableNote extends JTable
{
	/**
	 * Constructor
	 *
	 * @param   JDatabaseDriver  &$db  Database object
	 *
	 * @since  2.5
	 */
	public function __construct(&$db)
	{
		parent::__construct('#__user_notes', 'id', $db);

		$this->setColumnAlias('published', 'state');

		JTableObserverContenthistory::createObserver($this, array('typeAlias' => 'com_users.note'));
	}

	/**
	 * Overloaded store method for the notes table.
	 *
	 * @param   boolean  $updateNulls  Toggle whether null values should be updated.
	 *
	 * @return  boolean  True on success, false on failure.
	 *
	 * @since   2.5
	 */
	public function store($updateNulls = false)
	{
		$date = JFactory::getDate()->toSql();
		$userId = JFactory::getUser()->get('id');

		$this->modified_time = $date;
		$this->modified_user_id = $userId;

		if (!((int) $this->review_time))
		{
			// Null date.
			$this->review_time = $this->_db->getNullDate();
		}

		if (empty($this->id))
		{
			// New record.
			$this->created_time = $date;
			$this->created_user_id = $userId;
		}

		// Attempt to store the data.
		return parent::store($updateNulls);
	}

	/**
	 * 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 check-in 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]
	 * @param   integer  $userId  The user id of the user performing the operation.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   2.5
	 */
	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;
			}
		}

		$query = $this->_db->getQuery(true)
			->update($this->_db->quoteName($this->_tbl))
			->set($this->_db->quoteName('state') . ' = ' . (int) $state);

		// Build the WHERE clause for the primary keys.
		$query->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 = false;
		}
		else
		{
			$query->where('(checked_out = 0 OR checked_out = ' . (int) $userId . ')');
			$checkin = true;
		}

		// Update the publishing state for rows with the given primary keys.
		$this->_db->setQuery($query);

		try
		{
			$this->_db->execute();
		}
		catch (RuntimeException $e)
		{
			$this->setError($this->_db->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;
	}
}
components/com_users/models/fields/groupparent.php000060400000005316152453623460016553 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Access\Access;
use Joomla\CMS\Factory;
use Joomla\CMS\Form\FormHelper;
use Joomla\CMS\Helper\UserGroupsHelper;

FormHelper::loadFieldClass('list');

/**
 * User Group Parent field..
 *
 * @since  1.6
 */
class JFormFieldGroupParent extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var        string
	 * @since   1.6
	 */
	protected $type = 'GroupParent';

	/**
	 * Method to clean the Usergroup Options from all children starting by a given father
	 *
	 * @param   array    $userGroupsOptions  The usergroup options to clean
	 * @param   integer  $fatherId           The father ID to start with
	 *
	 * @return  array  The cleaned field options
	 *
	 * @since   3.9.4
	 */
	private function cleanOptionsChildrenByFather($userGroupsOptions, $fatherId)
	{
		foreach ($userGroupsOptions as $userGroupsOptionsId => $userGroupsOptionsData)
		{
			if ((int) $userGroupsOptionsData->parent_id === (int) $fatherId)
			{
				unset($userGroupsOptions[$userGroupsOptionsId]);

				$userGroupsOptions = $this->cleanOptionsChildrenByFather($userGroupsOptions, $userGroupsOptionsId);
			}
		}

		return $userGroupsOptions;
	}

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects
	 *
	 * @since   1.6
	 */
	protected function getOptions()
	{
		$options        = UserGroupsHelper::getInstance()->getAll();
		$currentGroupId = (int) Factory::getApplication()->input->get('id', 0, 'int');

		// Prevent to set yourself as parent
		if ($currentGroupId)
		{
			unset($options[$currentGroupId]);
		}

		// We should not remove any groups when we are creating a new group
		if ($currentGroupId !== 0)
		{
			// Prevent parenting direct children and children of children of this item.
			$options = $this->cleanOptionsChildrenByFather($options, $currentGroupId);
		}

		$options      = array_values($options);
		$isSuperAdmin = Factory::getUser()->authorise('core.admin');

		// Pad the option text with spaces using depth level as a multiplier.
		for ($i = 0, $n = count($options); $i < $n; $i++)
		{
			// Show groups only if user is super admin or group is not super admin
			if ($isSuperAdmin || !Access::checkGroup($options[$i]->id, 'core.admin'))
			{
				$options[$i]->value = $options[$i]->id;
				$options[$i]->text = str_repeat('- ', $options[$i]->level) . $options[$i]->title;
			}
			else
			{
				unset($options[$i]);
			}
		}

		// Merge any additional options in the XML definition.
		return array_merge(parent::getOptions(), $options);
	}
}
components/com_users/models/fields/levels.php000060400000001450152453623460015472 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JFormHelper::loadFieldClass('list');

/**
 * Access Levels field.
 *
 * @since  3.6.0
 */
class JFormFieldLevels extends JFormFieldList
{
	/**
	 * The form field type.
	 *
	 * @var     string
	 * @since   3.6.0
	 */
	protected $type = 'Levels';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects
	 *
	 * @since   3.6.0
	 */
	protected function getOptions()
	{
		// Merge any additional options in the XML definition.
		return array_merge(parent::getOptions(), UsersHelperDebug::getLevelsOptions());
	}
}
components/com_users/models/level.php000060400000016426152453623460014052 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;


use Joomla\CMS\Access\Access;
use Joomla\CMS\Factory;
use Joomla\CMS\Helper\UserGroupsHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Model\AdminModel;
use Joomla\Utilities\ArrayHelper;

/**
 * User view level model.
 *
 * @since  1.6
 */
class UsersModelLevel extends AdminModel
{
	/**
	 * @var	array	A list of the access levels in use.
	 * @since   1.6
	 */
	protected $levelsInUse = null;

	/**
	 * 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)
	{
		$groups = json_decode($record->rules);

		if ($groups === null)
		{
			throw new RuntimeException('Invalid rules schema');
		}

		$isAdmin = JFactory::getUser()->authorise('core.admin');

		// Check permissions
		foreach ($groups as $group)
		{
			if (!$isAdmin && JAccess::checkGroup($group, 'core.admin'))
			{
				$this->setError(JText::_('JERROR_ALERTNOAUTHOR'));

				return false;
			}
		}

		// Check if the access level is being used by any content.
		if ($this->levelsInUse === null)
		{
			// Populate the list once.
			$this->levelsInUse = array();

			$db    = $this->getDbo();
			$query = $db->getQuery(true)
				->select('DISTINCT access');

			// Get all the tables and the prefix
			$tables = $db->getTableList();
			$prefix = $db->getPrefix();

			foreach ($tables as $table)
			{
				// Get all of the columns in the table
				$fields = $db->getTableColumns($table);

				/**
				 * We are looking for the access field.  If custom tables are using something other
				 * than the 'access' field they are on their own unfortunately.
				 * Also make sure the table prefix matches the live db prefix (eg, it is not a "bak_" table)
				 */
				if (strpos($table, $prefix) === 0 && isset($fields['access']))
				{
					// Lookup the distinct values of the field.
					$query->clear('from')
						->from($db->quoteName($table));
					$db->setQuery($query);

					try
					{
						$values = $db->loadColumn();
					}
					catch (RuntimeException $e)
					{
						$this->setError($e->getMessage());

						return false;
					}

					$this->levelsInUse = array_merge($this->levelsInUse, $values);

					// TODO Could assemble an array of the tables used by each view level list those,
					// giving the user a clue in the error where to look.
				}
			}

			// Get uniques.
			$this->levelsInUse = array_unique($this->levelsInUse);

			// Ok, after all that we are ready to check the record :)
		}

		if (in_array($record->id, $this->levelsInUse))
		{
			$this->setError(JText::sprintf('COM_USERS_ERROR_VIEW_LEVEL_IN_USE', $record->id, $record->title));

			return false;
		}

		return parent::canDelete($record);
	}

	/**
	 * 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 database object
	 *
	 * @since   1.6
	 */
	public function getTable($type = 'Viewlevel', $prefix = 'JTable', $config = array())
	{
		$return = JTable::getInstance($type, $prefix, $config);

		return $return;
	}

	/**
	 * 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)
	{
		$result = parent::getItem($pk);

		// Convert the params field to an array.
		$result->rules = json_decode($result->rules);

		return $result;
	}

	/**
	 * Method to get the record form.
	 *
	 * @param   array    $data      An optional array of data for the form to interrogate.
	 * @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.level', 'level', 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_users.edit.level.data', array());

		if (empty($data))
		{
			$data = $this->getItem();
		}

		$this->preprocessData('com_users.level', $data);

		return $data;
	}

	/**
	 * Method to preprocess the form
	 *
	 * @param   JForm   $form   A form 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 loading the form.
	 */
	protected function preprocessForm(JForm $form, $data, $group = '')
	{
		parent::preprocessForm($form, $data, 'user');
	}

	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function save($data)
	{
		if (!isset($data['rules']))
		{
			$data['rules'] = array();
		}

		$data['title'] = JFilterInput::getInstance()->clean($data['title'], 'TRIM');

		return parent::save($data);
	}

	/**
	 * Method to validate the form data.
	 *
	 * @param   \JForm  $form   The form to validate against.
	 * @param   array   $data   The data to validate.
	 * @param   string  $group  The name of the field group to validate.
	 *
	 * @return  array|boolean  Array of filtered data if valid, false otherwise.
	 *
	 * @see     \JFormRule
	 * @see     \JFilterInput
	 * @since   3.8.8
	 */
	public function validate($form, $data, $group = null)
	{
		$isSuperAdmin = Factory::getUser()->authorise('core.admin');

		// Non Super user should not be able to change the access levels of super user groups
		if (!$isSuperAdmin)
		{
			if (!isset($data['rules']) || !is_array($data['rules']))
			{
				$data['rules'] = array();
			}

			$groups = array_values(UserGroupsHelper::getInstance()->getAll());

			$rules = array();

			if (!empty($data['id']))
			{
				$table = $this->getTable();

				$table->load($data['id']);

				$rules = json_decode($table->rules);
			}

			$rules = ArrayHelper::toInteger($rules);

			for ($i = 0, $n = count($groups); $i < $n; ++$i)
			{
				if (Access::checkGroup((int) $groups[$i]->id, 'core.admin'))
				{
					if (in_array((int) $groups[$i]->id, $rules) && !in_array((int) $groups[$i]->id, $data['rules']))
					{
						$data['rules'][] = (int) $groups[$i]->id;
					}
					elseif (!in_array((int) $groups[$i]->id, $rules) && in_array((int) $groups[$i]->id, $data['rules']))
					{
						$this->setError(Text::_('JLIB_USER_ERROR_NOT_SUPERADMIN'));

						return false;
					}
				}
			}
		}

		return parent::validate($form, $data, $group);
	}
}
components/com_users/models/mail.php000060400000013236152453623460013661 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Users mail model.
 *
 * @since  1.6
 */
class UsersModelMail extends JModelAdmin
{
	/**
	 * Method to get the row form.
	 *
	 * @param   array    $data      An optional array of data for the form to interrogate.
	 * @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.mail', 'mail', 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_users.display.mail.data', array());

		$this->preprocessData('com_users.mail', $data);

		return $data;
	}

	/**
	 * Method to preprocess the form
	 *
	 * @param   JForm   $form   A form 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 loading the form.
	 */
	protected function preprocessForm(JForm $form, $data, $group = 'user')
	{
		parent::preprocessForm($form, $data, $group);
	}

	/**
	 * Send the email
	 *
	 * @return  boolean
	 */
	public function send()
	{
		$app    = JFactory::getApplication();
		$data   = $app->input->post->get('jform', array(), 'array');
		$user   = JFactory::getUser();
		$access = new JAccess;
		$db     = $this->getDbo();

		$mode         = array_key_exists('mode', $data) ? (int) $data['mode'] : 0;
		$subject      = array_key_exists('subject', $data) ? $data['subject'] : '';
		$grp          = array_key_exists('group', $data) ? (int) $data['group'] : 0;
		$recurse      = array_key_exists('recurse', $data) ? (int) $data['recurse'] : 0;
		$bcc          = array_key_exists('bcc', $data) ? (int) $data['bcc'] : 0;
		$disabled     = array_key_exists('disabled', $data) ? (int) $data['disabled'] : 0;
		$message_body = array_key_exists('message', $data) ? $data['message'] : '';

		// Automatically removes html formatting
		if (!$mode)
		{
			$message_body = JFilterInput::getInstance()->clean($message_body, 'string');
		}

		// Check for a message body and subject
		if (!$message_body || !$subject)
		{
			$app->setUserState('com_users.display.mail.data', $data);
			$this->setError(JText::_('COM_USERS_MAIL_PLEASE_FILL_IN_THE_FORM_CORRECTLY'));

			return false;
		}

		// Get users in the group out of the ACL, if group is provided.
		$to = $grp !== 0 ? $access->getUsersByGroup($grp, $recurse) : array();

		// When group is provided but no users are found in the group.
		if ($grp !== 0 && !$to)
		{
			$rows = array();
		}
		else
		{
			// Get all users email and group except for senders
			$query = $db->getQuery(true)
				->select($db->quoteName('email'))
				->from($db->quoteName('#__users'))
				->where($db->quoteName('id') . ' != ' . (int) $user->id);

			if ($grp !== 0)
			{
				$query->where($db->quoteName('id') . ' IN (' . implode(',', $to) . ')');
			}

			if ($disabled === 0)
			{
				$query->where($db->quoteName('block') . ' = 0');
			}

			$db->setQuery($query);
			$rows = $db->loadColumn();
		}

		// Check to see if there are any users in this group before we continue
		if (!$rows)
		{
			$app->setUserState('com_users.display.mail.data', $data);

			if (in_array($user->id, $to))
			{
				$this->setError(JText::_('COM_USERS_MAIL_ONLY_YOU_COULD_BE_FOUND_IN_THIS_GROUP'));
			}
			else
			{
				$this->setError(JText::_('COM_USERS_MAIL_NO_USERS_COULD_BE_FOUND_IN_THIS_GROUP'));
			}

			return false;
		}

		// Get the Mailer
		$mailer = JFactory::getMailer();
		$params = JComponentHelper::getParams('com_users');

		// Build email message format.
		$mailer->setSender(array($app->get('mailfrom'), $app->get('fromname')));
		$mailer->setSubject($params->get('mailSubjectPrefix') . stripslashes($subject));
		$mailer->setBody($message_body . $params->get('mailBodySuffix'));
		$mailer->IsHtml($mode);

		// Add recipients
		if ($bcc)
		{
			$mailer->addBcc($rows);
			$mailer->addRecipient($app->get('mailfrom'));
		}
		else
		{
			$mailer->addRecipient($rows);
		}

		// Send the Mail
		$rs = $mailer->Send();

		// Check for an error
		if ($rs instanceof Exception)
		{
			$app->setUserState('com_users.display.mail.data', $data);
			$this->setError($rs->getError());

			return false;
		}
		elseif (empty($rs))
		{
			$app->setUserState('com_users.display.mail.data', $data);
			$this->setError(JText::_('COM_USERS_MAIL_THE_MAIL_COULD_NOT_BE_SENT'));

			return false;
		}
		else
		{
			/**
			 * Fill the data (specially for the 'mode', 'group' and 'bcc': they could not exist in the array
			 * when the box is not checked and in this case, the default value would be used instead of the '0'
			 * one)
			 */
			$data['mode']    = $mode;
			$data['subject'] = $subject;
			$data['group']   = $grp;
			$data['recurse'] = $recurse;
			$data['bcc']     = $bcc;
			$data['message'] = $message_body;
			$app->setUserState('com_users.display.mail.data', array());
			$app->enqueueMessage(JText::plural('COM_USERS_MAIL_EMAIL_SENT_TO_N_USERS', count($rows)), 'message');

			return true;
		}
	}
}
components/com_users/models/forms/filter_users.xml000060400000006175152453623460016610 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_USERS_SEARCH_USERS"
			description="COM_USERS_SEARCH_IN_NAME"
			hint="JSEARCH_FILTER"
		/>
		<field
			name="state"
			type="userstate"
			label="COM_USERS_FILTER_STATE"
			description="COM_USERS_FILTER_STATE_DESC"
			onchange="this.form.submit();"
			>
			<option value="">COM_USERS_FILTER_STATE</option>
		</field>
		<field
			name="active"
			type="useractive"
			label="COM_USERS_FILTER_ACTIVE"
			description="COM_USERS_FILTER_ACTIVE_DESC"
			onchange="this.form.submit();"
			>
			<option value="">COM_USERS_FILTER_ACTIVE</option>
		</field>
		<field
			name="group_id"
			type="usergrouplist"
			label="COM_USERS_FILTER_GROUP"
			description="COM_USERS_FILTER_GROUP_DESC"
			onchange="this.form.submit();"
			>
			<option value="">COM_USERS_FILTER_USERGROUP</option>
		</field>
		<field
			name="lastvisitrange"
			type="lastvisitdaterange"
			label="COM_USERS_OPTION_FILTER_LAST_VISIT_DATE"
			description="COM_USERS_OPTION_FILTER_LAST_VISIT_DATE"
			onchange="this.form.submit();"
			>
			<option value="">COM_USERS_OPTION_FILTER_LAST_VISIT_DATE</option>
		</field>
		<field
			name="range"
			type="registrationdaterange"
			label="COM_USERS_OPTION_FILTER_DATE"
			description="COM_USERS_OPTION_FILTER_DATE"
			onchange="this.form.submit();"
			>
			<option value="">COM_USERS_OPTION_FILTER_DATE</option>
		</field>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="COM_CONTENT_LIST_FULL_ORDERING"
			description="COM_CONTENT_LIST_FULL_ORDERING_DESC"
			onchange="this.form.submit();"
			default="a.name ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.name ASC">COM_USERS_HEADING_NAME_ASC</option>
			<option value="a.name DESC">COM_USERS_HEADING_NAME_DESC</option>
			<option value="a.username ASC">COM_USERS_HEADING_USERNAME_ASC</option>
			<option value="a.username DESC">COM_USERS_HEADING_USERNAME_DESC</option>
			<option value="a.block ASC">COM_USERS_HEADING_ENABLED_ASC</option>
			<option value="a.block DESC">COM_USERS_HEADING_ENABLED_DESC</option>
			<option value="a.activation ASC">COM_USERS_HEADING_ACTIVATED_ASC</option>
			<option value="a.activation DESC">COM_USERS_HEADING_ACTIVATED_DESC</option>
			<option value="a.email ASC">COM_USERS_HEADING_EMAIL_ASC</option>
			<option value="a.email DESC">COM_USERS_HEADING_EMAIL_DESC</option>
			<option value="a.lastvisitDate ASC">COM_USERS_HEADING_LAST_VISIT_DATE_ASC</option>
			<option value="a.lastvisitDate DESC">COM_USERS_HEADING_LAST_VISIT_DATE_DESC</option>
			<option value="a.registerDate ASC">COM_USERS_HEADING_REGISTRATION_DATE_ASC</option>
			<option value="a.registerDate DESC">COM_USERS_HEADING_REGISTRATION_DATE_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			label="COM_CONTENT_LIST_LIMIT"
			description="COM_CONTENT_LIST_LIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_users/models/forms/filter_debuggroup.xml000060400000003577152453623460017615 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_USERS_SEARCH_ASSETS"
			description="COM_USERS_SEARCH_IN_ASSETS"
			hint="JSEARCH_FILTER"
		/>

		<field
			name="component"
			type="Components"
			label="COM_USERS_FILTER_COMPONENT_LABEL"
			description="COM_USERS_FILTER_COMPONENT_DESC"
			onchange="this.form.submit();"
			>
			<option value="">COM_USERS_OPTION_SELECT_COMPONENT</option>
		</field>

		<field
			name="level_start"
			type="Levels"
			label="COM_USERS_FILTER_LEVEL_START_LABEL"
			description="COM_USERS_FILTER_LEVEL_START_DESC"
			onchange="this.form.submit();"
			>
			<option value="">COM_USERS_OPTION_SELECT_LEVEL_START</option>
		</field>

		<field
			name="level_end"
			type="Levels"
			label="COM_USERS_FILTER_LEVEL_END_LABEL"
			description="COM_USERS_FILTER_LEVEL_END_DESC"
			onchange="this.form.submit();"
			>
			<option value="">COM_USERS_OPTION_SELECT_LEVEL_END</option>
		</field>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			onchange="this.form.submit();"
			default="a.lft ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.title ASC">COM_USERS_HEADING_ASSET_TITLE_ASC</option>
			<option value="a.title DESC">COM_USERS_HEADING_ASSET_TITLE_DESC</option>
			<option value="a.name ASC">COM_USERS_HEADING_ASSET_NAME_ASC</option>
			<option value="a.name DESC">COM_USERS_HEADING_ASSET_NAME_DESC</option>
			<option value="a.lft ASC">COM_USERS_HEADING_LFT_ASC</option>
			<option value="a.lft DESC">COM_USERS_HEADING_LFT_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_users/models/forms/group.xml000060400000001347152453623460015232 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset name="group_details">
		<field
			name="id"
			type="hidden"
			default="0"
			required="true"
			readonly="true"
		/>

		<field
			name="title"
			type="text"
			label="COM_USERS_GROUP_FIELD_TITLE_LABEL"
			description="COM_USERS_GROUP_FIELD_TITLE_DESC"
			required="true"
			size="40"
		/>

		<field
			name="parent_id"
			type="groupparent"
			label="COM_USERS_GROUP_FIELD_PARENT_LABEL"
			description="COM_USERS_GROUP_FIELD_PARENT_DESC"
			validate="options"
		/>

		<field
			name="actions"
			type="hidden"
			multiple="true"
		/>

		<field
			name="lft"
			type="hidden"
			filter="unset"
		/>

		<field
			name="rgt"
			type="hidden"
			filter="unset"
		/>
	</fieldset>
</form>
components/com_users/models/forms/fields/user.xml000060400000000357152453623460016322 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="params" label="COM_FIELDS_FIELD_BASIC_LABEL">
		<fieldset name="basic">
			<field
				name="display"
				type="hidden"
			    	default="2"
			/>
		</fieldset>
	</fields>
</form>
components/com_users/models/forms/note.xml000060400000005452152453623460015044 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset
		addfieldpath="/administrator/components/com_categories/models/fields"
	>
		<field
			name="id"
			type="hidden"
			label="COM_USERS_FIELD_ID_LABEL"
			class="readonly"
			size="6"
			default="0"
			readonly="true"
		/>

		<field
			name="user_id"
			type="user"
			label="COM_USERS_FIELD_USER_ID_LABEL"
			description="JLIB_FORM_SELECT_USER"
			size="50"
			class="input-medium"
			required="true"
		/>

		<field
			name="catid"
			type="modal_category"
			label="COM_USERS_FIELD_CATEGORY_ID_LABEL"
			description="JFIELD_CATEGORY_DESC"
			extension="com_users"
			required="true"
			select="true"
			new="true"
			edit="true"
			clear="true"
		/>

		<field
			name="subject"
			type="text"
			label="COM_USERS_FIELD_SUBJECT_LABEL"
			description="COM_USERS_FIELD_SUBJECT_DESC"
			size="80"
		/>

		<field
			name="body"
			type="editor"
			label="COM_USERS_FIELD_NOTEBODY_LABEL"
			description="COM_USERS_FIELD_NOTEBODY_DESC"
			rows="10"
			cols="80"
			filter="safehtml"
		/>

		<field
			name="state"
			type="list"
			label="JSTATUS"
			description="COM_USERS_FIELD_STATE_DESC"
			size="1"
			default="1"
			>
			<option value="1">JPUBLISHED</option>
			<option value="0">JUNPUBLISHED</option>
			<option value="2">JARCHIVED</option>
			<option value="-2">JTRASHED</option>
		</field>

		<field
			name="review_time"
			type="calendar"
			label="COM_USERS_FIELD_REVIEW_TIME_LABEL"
			description="COM_USERS_FIELD_REVIEW_TIME_DESC"
			default="NOW"
			translateformat="true"
			filter="user_utc"
		/>

		<field
			name="checked_out"
			type="hidden"
			filter="unset"
		/>

		<field
			name="checked_out_time"
			type="hidden"
			filter="unset"
		/>

		<field
			name="created_user_id"
			type="hidden"
			label="JGLOBAL_FIELD_CREATED_BY_LABEL"
			filter="unset"
		/>

		<field
			name="created_time"
			type="hidden"
			label="JGLOBAL_FIELD_CREATED_LABEL"
			filter="unset"
		/>

		<field
			name="modified_user_id"
			type="hidden"
			label="JGLOBAL_FIELD_MODIFIED_BY_LABEL"
			filter="unset"
		/>

		<field
			name="modified_time"
			type="hidden"
			label="JGLOBAL_FIELD_MODIFIED_LABEL"
			filter="unset"
		/>

		<field
			name="publish_up"
			type="calendar"
			label="JGLOBAL_FIELD_PUBLISH_UP_LABEL"
			description="JGLOBAL_FIELD_PUBLISH_UP_DESC"
			translateformat="true"
			showtime="true"
			size="22"
			filter="user_utc"
		/>

		<field
			name="publish_down"
			type="calendar"
			label="JGLOBAL_FIELD_PUBLISH_DOWN_LABEL"
			description="JGLOBAL_FIELD_PUBLISH_DOWN_DESC"
			translateformat="true"
			showtime="true"
			size="22"
			filter="user_utc"
		/>

		<field
			name="version_note"
			type="text"
			label="JGLOBAL_FIELD_VERSION_NOTE_LABEL"
			description="JGLOBAL_FIELD_VERSION_NOTE_DESC"
			maxlength="255"
			size="45"
			labelclass="control-label"
		/>
	</fieldset>
</form>
components/com_users/models/forms/level.xml000060400000001062152453623460015177 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<field 
			name="id" 
			type="hidden"
			default="0"
			readonly="true"
			required="true"
		/>

		<field 
			name="title" 
			type="text"
			label="COM_USERS_LEVEL_FIELD_TITLE_LABEL"
			description="COM_USERS_LEVEL_FIELD_TITLE_DESC"
			required="true"
			size="50"
		/>

		<field 
			name="ordering" 
			type="text"
			label="JFIELD_ORDERING_LABEL"
			description="JFIELD_ORDERING_DESC"
			default="0"
		/>

		<field 
			name="rules" 
			type="hidden"
			filter="int_array"
		/>
	</fieldset>
</form>
components/com_users/models/forms/filter_notes.xml000060400000004256152453623460016575 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_USERS_SEARCH_USER_NOTES"
			description="COM_USERS_SEARCH_IN_NOTE_TITLE"
			hint="JSEARCH_FILTER"
		/>
		<field
			name="published"
			type="status"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>
		<field
			name="category_id"
			type="category"
			label="JOPTION_FILTER_CATEGORY"
			description="JOPTION_FILTER_CATEGORY_DESC"
			extension="com_users"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_CATEGORY</option>
		</field>
		<field
			name="level"
			type="integer"
			label="JOPTION_FILTER_LEVEL"
			description="JOPTION_FILTER_LEVEL_DESC"
			first="1"
			last="10"
			step="1"
			languages="*"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_MAX_LEVELS</option>
		</field>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="a.review_time DESC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.state ASC">JSTATUS_ASC</option>
			<option value="a.state DESC">JSTATUS_DESC</option>
			<option value="a.subject ASC">COM_USERS_HEADING_SUBJECT_ASC</option>
			<option value="a.subject DESC">COM_USERS_HEADING_SUBJECT_DESC</option>
			<option value="c.title ASC">COM_USERS_HEADING_CATEGORY_ASC</option>
			<option value="c.title DESC">COM_USERS_HEADING_CATEGORY_DESC</option>
			<option value="u.name ASC">COM_USERS_HEADING_USER_ASC</option>
			<option value="u.name DESC">COM_USERS_HEADING_USER_DESC</option>
			<option value="a.review_time ASC">COM_USERS_HEADING_REVIEW_ASC</option>
			<option value="a.review_time DESC">COM_USERS_HEADING_REVIEW_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			label="JGLOBAL_LIMIT"
			description="JGLOBAL_LIMIT"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_users/models/forms/filter_groups.xml000060400000002144152453623460016756 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_USERS_SEARCH_GROUPS_LABEL"
			description="COM_USERS_SEARCH_IN_GROUPS"
			hint="JSEARCH_FILTER"
		/>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="a.lft ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.lft ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.lft DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.title ASC">COM_USERS_HEADING_GROUP_TITLE_ASC</option>
			<option value="a.title DESC">COM_USERS_HEADING_GROUP_TITLE_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			label="JGLOBAL_LIMIT"
			description="JGLOBAL_LIMIT"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_users/models/forms/user.xml000060400000011401152453623460015044 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset name="user_details">
		<field
			name="name"
			type="text"
			label="COM_USERS_USER_FIELD_NAME_LABEL"
			description="COM_USERS_USER_FIELD_NAME_DESC"
			required="true"
			size="30"
		/>

		<field
			name="username"
			type="text"
			label="COM_USERS_USER_FIELD_USERNAME_LABEL"
			description="COM_USERS_USER_FIELD_USERNAME_DESC"
			required="true"
			size="30"
		/>

		<field
			name="password"
			type="password"
			label="JGLOBAL_PASSWORD"
			description="COM_USERS_USER_FIELD_PASSWORD_DESC"
			autocomplete="off"
			class="validate-password"
			filter="raw"
			validate="password"
			size="30"
		/>

		<field
			name="password2"
			type="password"
			label="COM_USERS_USER_FIELD_PASSWORD2_LABEL"
			description="COM_USERS_USER_FIELD_PASSWORD2_DESC"
			autocomplete="off"
			class="validate-password"
			filter="raw"
			message="COM_USERS_USER_FIELD_PASSWORD1_MESSAGE"
			size="30"
			validate="equals"
			field="password"
		/>

		<field
			name="email"
			type="email"
			label="JGLOBAL_EMAIL"
			description="COM_USERS_USER_FIELD_EMAIL_DESC"
			required="true"
			size="30"
			validate="email"
			validDomains="com_users.domains"
		/>

		<field
			name="registerDate"
			type="calendar"
			label="COM_USERS_USER_FIELD_REGISTERDATE_LABEL"
			description="COM_USERS_USER_FIELD_REGISTERDATE_DESC"
			class="readonly"
			readonly="true"
			translateformat="true"
			showtime="true"
			size="22"
			filter="user_utc"
		/>

		<field
			name="lastvisitDate"
			type="calendar"
			label="COM_USERS_USER_FIELD_LASTVISIT_LABEL"
			description="COM_USERS_USER_FIELD_LASTVISIT_DESC"
			class="readonly"
			readonly="true"
			translateformat="true"
			showtime="true"
			size="22"
			filter="user_utc"
		/>

		<field
			name="lastResetTime"
			type="calendar"
			label="COM_USERS_USER_FIELD_LASTRESET_LABEL"
			description="COM_USERS_USER_FIELD_LASTRESET_DESC"
			class="readonly"
			readonly="true"
			translateformat="true"
			showtime="true"
			size="22"
			filter="user_utc"
		/>

		<field
			name="resetCount"
			type="number"
			label="COM_USERS_USER_FIELD_RESETCOUNT_LABEL"
			description="COM_USERS_USER_FIELD_RESETCOUNT_DESC"
			class="readonly"
			default="0"
			readonly="true"
		/>

		<field
			name="sendEmail"
			type="radio"
			label="COM_USERS_USER_FIELD_SENDEMAIL_LABEL"
			description="COM_USERS_USER_FIELD_SENDEMAIL_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="block"
			type="radio"
			label="COM_USERS_USER_FIELD_BLOCK_LABEL"
			description="COM_USERS_USER_FIELD_BLOCK_DESC"
			class="btn-group btn-group-yesno btn-group-reversed"
			default="0"
			>
			<option value="1">COM_USERS_USER_FIELD_BLOCK</option>
			<option value="0">COM_USERS_USER_FIELD_ENABLE</option>
		</field>

		<field
			name="requireReset"
			type="radio"
			label="COM_USERS_USER_FIELD_REQUIRERESET_LABEL"
			description="COM_USERS_USER_FIELD_REQUIRERESET_DESC"
			default="0"
			class="btn-group btn-group-yesno"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="id"
			type="number"
			label="JGLOBAL_FIELD_ID_LABEL"
			description="JGLOBAL_FIELD_ID_DESC"
			class="readonly"
			default="0"
			readonly="true"
		/>

	</fieldset>
	<field name="groups" type="hidden" />
	<field name="twofactor" type="hidden" />

	<fields name="params">

		<!--  Basic user account settings. -->
		<fieldset name="settings" label="COM_USERS_SETTINGS_FIELDSET_LABEL">

			<field
				name="admin_style"
				type="templatestyle"
				label="COM_USERS_USER_FIELD_BACKEND_TEMPLATE_LABEL"
				description="COM_USERS_USER_FIELD_BACKEND_TEMPLATE_DESC"
				client="administrator"
				filter="uint"
				>
				<option value="">JOPTION_USE_DEFAULT</option>
			</field>

			<field
				name="admin_language"
				type="language"
				label="COM_USERS_USER_FIELD_BACKEND_LANGUAGE_LABEL"
				description="COM_USERS_USER_FIELD_BACKEND_LANGUAGE_DESC"
				client="administrator"
				>
				<option value="">JOPTION_USE_DEFAULT</option>
			</field>

			<field
				name="language"
				type="language"
				label="COM_USERS_USER_FIELD_FRONTEND_LANGUAGE_LABEL"
				description="COM_USERS_USER_FIELD_FRONTEND_LANGUAGE_DESC"
				client="site"
				>
				<option value="">JOPTION_USE_DEFAULT</option>
			</field>

			<field
				name="editor"
				type="plugins"
				label="COM_USERS_USER_FIELD_EDITOR_LABEL"
				description="COM_USERS_USER_FIELD_EDITOR_DESC"
				folder="editors"
				>
				<option value="">JOPTION_USE_DEFAULT</option>
			</field>

			<field
				name="timezone"
				type="timezone"
				label="COM_USERS_USER_FIELD_TIMEZONE_LABEL"
				description="COM_USERS_USER_FIELD_TIMEZONE_DESC"
				>
				<option value="">JOPTION_USE_DEFAULT</option>
			</field>
		</fieldset>

	</fields>
</form>
components/com_users/models/forms/mail.xml000060400000002734152453623460015021 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>

		<field 
			name="recurse" 
			type="checkbox"
			label="COM_USERS_MAIL_FIELD_RECURSE_LABEL"
			description="COM_USERS_MAIL_FIELD_RECURSE_DESC"
			value="1"
		/>

		<field 
			name="mode" 
			type="checkbox"
			label="COM_USERS_MAIL_FIELD_SEND_IN_HTML_MODE_LABEL"
			description="COM_USERS_MAIL_FIELD_SEND_IN_HTML_MODE_DESC"
			value="1"
		/>

		<field 
			name="disabled" 
			type="checkbox"
			label="COM_USERS_MAIL_FIELD_EMAIL_DISABLED_USERS_LABEL"
			description="COM_USERS_MAIL_FIELD_EMAIL_DISABLED_USERS_DESC"
			value="1"
		/>

		<field 
			name="group" 
			type="usergrouplist"
			label="COM_USERS_MAIL_FIELD_GROUP_LABEL"
			description="COM_USERS_MAIL_FIELD_GROUP_DESC"
			default="0"
			size="10"
			>
			<option value="0">COM_USERS_MAIL_FIELD_VALUE_ALL_USERS_GROUPS</option>
		</field>

		<field 
			name="bcc" 
			type="checkbox"
			label="COM_USERS_MAIL_FIELD_SEND_AS_BLIND_CARBON_COPY_LABEL"
			description="COM_USERS_MAIL_FIELD_SEND_AS_BLIND_CARBON_COPY_DESC"
			default="1"
			value="1"
			checked="1"
		/>

		<field 
			name="subject" 
			type="text"
			label="COM_USERS_MAIL_FIELD_SUBJECT_LABEL"
			description="COM_USERS_MAIL_FIELD_SUBJECT_DESC"
			class="span8"
			maxlength="150"
			size="30"
		/>

		<field 
			name="message" 
			type="textarea"
			label="COM_USERS_MAIL_FIELD_MESSAGE_LABEL"
			description="COM_USERS_MAIL_FIELD_MESSAGE_DESC"
			class="span11 vert"
			cols="70"
			rows="20"
		/>
	</fieldset>
</form>
components/com_users/models/forms/filter_levels.xml000060400000002166152453623460016735 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_USERS_SEARCH_ACCESS_LEVELS"
			description="COM_USERS_SEARCH_IN_LEVEL_NAME"
			hint="JSEARCH_FILTER"
		/>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="a.ordering ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.title ASC">COM_USERS_HEADING_LEVEL_NAME_ASC</option>
			<option value="a.title DESC">COM_USERS_HEADING_LEVEL_NAME_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			label="JGLOBAL_LIMIT"
			description="JGLOBAL_LIMIT"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_users/models/forms/config_domain.xml000060400000001165152453623460016670 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<field
			name="name"
			type="text"
			label="COM_USERS_CONFIG_FIELD_DOMAIN_NAME_LABEL"
			description="COM_USERS_CONFIG_FIELD_DOMAIN_NAME_DESC"
			required="true"
		/>

		<field
			name="rule"
			type="list"
			label="COM_USERS_CONFIG_FIELD_DOMAIN_RULE_LABEL"
			description="COM_USERS_CONFIG_FIELD_DOMAIN_RULE_DESC"
			required="true"
			default="0"
			filter="integer"
			>
			<option value="1">COM_USERS_CONFIG_FIELD_DOMAIN_RULE_OPTION_ALLOW</option>
			<option value="0">COM_USERS_CONFIG_FIELD_DOMAIN_RULE_OPTION_DISALLOW</option>
		</field>
	</fieldset>
</form>
components/com_users/models/forms/filter_debuguser.xml000060400000003572152453623460017432 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label="COM_USERS_SEARCH_ASSETS"
			description="COM_USERS_SEARCH_IN_ASSETS"
			hint="JSEARCH_FILTER"
		/>
		<field
			name="component"
			type="Components"
			label="COM_USERS_FILTER_COMPONENT_LABEL"
			description="COM_USERS_FILTER_COMPONENT_DESC"
			onchange="this.form.submit();"
			>
			<option value="">COM_USERS_OPTION_SELECT_COMPONENT</option>
		</field>
		<field
			name="level_start"
			type="Levels"
			label="COM_USERS_FILTER_LEVEL_START_LABEL"
			description="COM_USERS_FILTER_LEVEL_START_DESC"
			onchange="this.form.submit();"
			>
			<option value="">COM_USERS_OPTION_SELECT_LEVEL_START</option>
		</field>
		<field
			name="level_end"
			type="Levels"
			label="COM_USERS_FILTER_LEVEL_END_LABEL"
			description="COM_USERS_FILTER_LEVEL_END_DESC"
			onchange="this.form.submit();"
			>
			<option value="">COM_USERS_OPTION_SELECT_LEVEL_END</option>
		</field>
	</fields>
	<fields name="list">
		<field
			name="fullordering"
			type="list"
			onchange="this.form.submit();"
			default="a.lft ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.title ASC">COM_USERS_HEADING_ASSET_TITLE_ASC</option>
			<option value="a.title DESC">COM_USERS_HEADING_ASSET_TITLE_DESC</option>
			<option value="a.name ASC">COM_USERS_HEADING_ASSET_NAME_ASC</option>
			<option value="a.name DESC">COM_USERS_HEADING_ASSET_NAME_DESC</option>
			<option value="a.lft ASC">COM_USERS_HEADING_LFT_ASC</option>
			<option value="a.lft DESC">COM_USERS_HEADING_LFT_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>
		<field
			name="limit"
			type="limitbox"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_users/models/user.php000060400000102133152453623460013710 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\User\UserHelper;
use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;

/**
 * User model.
 *
 * @since  1.6
 */
class UsersModelUser extends JModelAdmin
{
	/**
	 * An item.
	 *
	 * @var    array
	 */
	protected $_item = null;

	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @since   3.2
	 */
	public function __construct($config = array())
	{
		$config = array_merge(
			array(
				'event_after_delete'  => 'onUserAfterDelete',
				'event_after_save'    => 'onUserAfterSave',
				'event_before_delete' => 'onUserBeforeDelete',
				'event_before_save'   => 'onUserBeforeSave',
				'events_map'          => array('save' => 'user', 'delete' => 'user', 'validate' => 'user')
			), $config
		);

		parent::__construct($config);
	}

	/**
	 * 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 database object
	 *
	 * @since   1.6
	 */
	public function getTable($type = 'User', $prefix = 'JTable', $config = array())
	{
		$table = JTable::getInstance($type, $prefix, $config);

		return $table;
	}

	/**
	 * 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)
	{
		$pk = (!empty($pk)) ? $pk : (int) $this->getState('user.id');

		if ($this->_item === null)
		{
			$this->_item = array();
		}

		if (!isset($this->_item[$pk]))
		{
			$this->_item[$pk] = parent::getItem($pk);
		}

		return $this->_item[$pk];
	}

	/**
	 * Method to get the record form.
	 *
	 * @param   array    $data      An optional array of data for the form to interrogate.
	 * @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   1.6
	 */
	public function getForm($data = array(), $loadData = true)
	{
		// Get the form.
		$form = $this->loadForm('com_users.user', 'user', array('control' => 'jform', 'load_data' => $loadData));

		if (empty($form))
		{
			return false;
		}

		// 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');
		}

		// 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');
		}

		$userId = $form->getValue('id');

		// The user should not be able to set the requireReset value on their own account
		if ((int) $userId === (int) JFactory::getUser()->id)
		{
			$form->removeField('requireReset');
		}

		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();
		}

		$this->preprocessData('com_users.profile', $data, 'user');

		return $data;
	}

	/**
	 * 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);
	}

	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function save($data)
	{
		$pk   = (!empty($data['id'])) ? $data['id'] : (int) $this->getState('user.id');
		$user = JUser::getInstance($pk);

		$my = JFactory::getUser();
		$iAmSuperAdmin = $my->authorise('core.admin');

		// User cannot modify own user groups
		if ((int) $user->id == (int) $my->id && !$iAmSuperAdmin && isset($data['groups']))
		{
			// Form was probably tampered with
			JFactory::getApplication()->enqueueMessage(JText::_('COM_USERS_USERS_ERROR_CANNOT_EDIT_OWN_GROUP'), 'warning');

			$data['groups'] = null;
		}

		if ($data['block'] && $pk == $my->id && !$my->block)
		{
			$this->setError(JText::_('COM_USERS_USERS_ERROR_CANNOT_BLOCK_SELF'));

			return false;
		}

		// Make sure user groups is selected when add/edit an account
		if (empty($data['groups']) && ((int) $user->id != (int) $my->id || $iAmSuperAdmin))
		{
			$this->setError(JText::_('COM_USERS_USERS_ERROR_CANNOT_SAVE_ACCOUNT_WITHOUT_GROUPS'));

			return false;
		}

		// Make sure that we are not removing ourself from Super Admin group
		if ($iAmSuperAdmin && $my->get('id') == $pk)
		{
			// Check that at least one of our new groups is Super Admin
			$stillSuperAdmin = false;
			$myNewGroups = $data['groups'];

			foreach ($myNewGroups as $group)
			{
				$stillSuperAdmin = $stillSuperAdmin ?: JAccess::checkGroup($group, 'core.admin');
			}

			if (!$stillSuperAdmin)
			{
				$this->setError(JText::_('COM_USERS_USERS_ERROR_CANNOT_DEMOTE_SELF'));

				return false;
			}
		}

		// Handle the two factor authentication setup
		if (array_key_exists('twofactor', $data))
		{
			$twoFactorMethod = $data['twofactor']['method'];

			// Get the current One Time Password (two factor auth) configuration
			$otpConfig = $this->getOtpConfig($pk);

			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.
				$this->setOtpConfig($pk, $otpConfig);

				// Generate one time emergency passwords if required (depleted or not set)
				if (empty($otpConfig->otep))
				{
					$oteps = $this->generateOteps($pk);
				}
			}
			else
			{
				$otpConfig->method = 'none';
				$otpConfig->config = array();
				$this->setOtpConfig($pk, $otpConfig);
			}

			// Unset the raw data
			unset($data['twofactor']);

			// Reload the user record with the updated OTP configuration
			$user->load($pk);
		}

		// Bind the data.
		if (!$user->bind($data))
		{
			$this->setError($user->getError());

			return false;
		}

		// Store the data.
		if (!$user->save())
		{
			$this->setError($user->getError());

			return false;
		}

		// Destroy all active sessions for the user after changing the password or blocking him
		if ($data['password2'] || $data['block'])
		{
			UserHelper::destroyUserSessions($user->id, true);
		}

		$this->setState('user.id', $user->id);

		return true;
	}

	/**
	 * Method to delete rows.
	 *
	 * @param   array  &$pks  An array of item ids.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function delete(&$pks)
	{
		$user  = JFactory::getUser();
		$table = $this->getTable();
		$pks   = (array) $pks;

		// Check if I am a Super Admin
		$iAmSuperAdmin = $user->authorise('core.admin');

		JPluginHelper::importPlugin($this->events_map['delete']);
		$dispatcher = JEventDispatcher::getInstance();

		if (in_array($user->id, $pks))
		{
			$this->setError(JText::_('COM_USERS_USERS_ERROR_CANNOT_DELETE_SELF'));

			return false;
		}

		// Iterate the items to delete each one.
		foreach ($pks as $i => $pk)
		{
			if ($table->load($pk))
			{
				// Access checks.
				$allow = $user->authorise('core.delete', 'com_users');

				// Don't allow non-super-admin to delete a super admin
				$allow = (!$iAmSuperAdmin && JAccess::check($pk, 'core.admin')) ? false : $allow;

				if ($allow)
				{
					// Get users data for the users to delete.
					$user_to_delete = JFactory::getUser($pk);

					// Fire the before delete event.
					$dispatcher->trigger($this->event_before_delete, array($table->getProperties()));

					if (!$table->delete($pk))
					{
						$this->setError($table->getError());

						return false;
					}
					else
					{
						// Trigger the after delete event.
						$dispatcher->trigger($this->event_after_delete, array($user_to_delete->getProperties(), true, $this->getError()));
					}
				}
				else
				{
					// Prune items that you can't change.
					unset($pks[$i]);
					JError::raiseWarning(403, JText::_('JERROR_CORE_DELETE_NOT_PERMITTED'));
				}
			}
			else
			{
				$this->setError($table->getError());

				return false;
			}
		}

		return true;
	}

	/**
	 * Method to block user 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 block(&$pks, $value = 1)
	{
		$app        = JFactory::getApplication();
		$dispatcher = JEventDispatcher::getInstance();
		$user       = JFactory::getUser();

		// Check if I am a Super Admin
		$iAmSuperAdmin = $user->authorise('core.admin');
		$table         = $this->getTable();
		$pks           = (array) $pks;

		JPluginHelper::importPlugin($this->events_map['save']);

		// Prepare the logout options.
		$options = array(
			'clientid' => $app->get('shared_session', '0') ? null : 0,
		);

		// Access checks.
		foreach ($pks as $i => $pk)
		{
			if ($value == 1 && $pk == $user->get('id'))
			{
				// Cannot block yourself.
				unset($pks[$i]);
				JError::raiseWarning(403, JText::_('COM_USERS_USERS_ERROR_CANNOT_BLOCK_SELF'));
			}
			elseif ($table->load($pk))
			{
				$old   = $table->getProperties();
				$allow = $user->authorise('core.edit.state', 'com_users');

				// Don't allow non-super-admin to delete a super admin
				$allow = (!$iAmSuperAdmin && JAccess::check($pk, 'core.admin')) ? false : $allow;

				if ($allow)
				{
					// Skip changing of same state
					if ($table->block == $value)
					{
						unset($pks[$i]);
						continue;
					}

					$table->block = (int) $value;

					// If unblocking, also change password reset count to zero to unblock reset
					if ($table->block === 0)
					{
						$table->resetCount = 0;
					}

					// Allow an exception to be thrown.
					try
					{
						if (!$table->check())
						{
							$this->setError($table->getError());

							return false;
						}

						// Trigger the before save event.
						$result = $dispatcher->trigger($this->event_before_save, array($old, false, $table->getProperties()));

						if (in_array(false, $result, true))
						{
							// Plugin will have to raise its own error or throw an exception.
							return false;
						}

						// Store the table.
						if (!$table->store())
						{
							$this->setError($table->getError());

							return false;
						}

						if ($table->block)
						{
							UserHelper::destroyUserSessions($table->id);
						}

						// Trigger the after save event
						$dispatcher->trigger($this->event_after_save, array($table->getProperties(), false, true, null));
					}
					catch (Exception $e)
					{
						$this->setError($e->getMessage());

						return false;
					}

					// Log the user out.
					if ($value)
					{
						$app->logout($table->id, $options);
					}
				}
				else
				{
					// Prune items that you can't change.
					unset($pks[$i]);
					JError::raiseWarning(403, JText::_('JLIB_APPLICATION_ERROR_EDITSTATE_NOT_PERMITTED'));
				}
			}
		}

		return true;
	}

	/**
	 * Method to activate user records.
	 *
	 * @param   array  &$pks  The ids of the items to activate.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function activate(&$pks)
	{
		$dispatcher = JEventDispatcher::getInstance();
		$user       = JFactory::getUser();

		// Check if I am a Super Admin
		$iAmSuperAdmin = $user->authorise('core.admin');
		$table         = $this->getTable();
		$pks           = (array) $pks;

		JPluginHelper::importPlugin($this->events_map['save']);

		// Access checks.
		foreach ($pks as $i => $pk)
		{
			if ($table->load($pk))
			{
				$old   = $table->getProperties();
				$allow = $user->authorise('core.edit.state', 'com_users');

				// Don't allow non-super-admin to delete a super admin
				$allow = (!$iAmSuperAdmin && JAccess::check($pk, 'core.admin')) ? false : $allow;

				if (empty($table->activation))
				{
					// Ignore activated accounts.
					unset($pks[$i]);
				}
				elseif ($allow)
				{
					$table->block      = 0;
					$table->activation = '';

					// Allow an exception to be thrown.
					try
					{
						if (!$table->check())
						{
							$this->setError($table->getError());

							return false;
						}

						// Trigger the before save event.
						$result = $dispatcher->trigger($this->event_before_save, array($old, false, $table->getProperties()));

						if (in_array(false, $result, true))
						{
							// Plugin will have to raise it's own error or throw an exception.
							return false;
						}

						// Store the table.
						if (!$table->store())
						{
							$this->setError($table->getError());

							return false;
						}

						// Fire the after save event
						$dispatcher->trigger($this->event_after_save, array($table->getProperties(), false, true, null));
					}
					catch (Exception $e)
					{
						$this->setError($e->getMessage());

						return false;
					}
				}
				else
				{
					// Prune items that you can't change.
					unset($pks[$i]);
					JError::raiseWarning(403, JText::_('JLIB_APPLICATION_ERROR_EDITSTATE_NOT_PERMITTED'));
				}
			}
		}

		return true;
	}

	/**
	 * Method to perform batch operations on an item or a set of items.
	 *
	 * @param   array  $commands  An array of commands to perform.
	 * @param   array  $pks       An array of item ids.
	 * @param   array  $contexts  An array of item contexts.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   2.5
	 */
	public function batch($commands, $pks, $contexts)
	{
		// Sanitize user ids.
		$pks = array_unique($pks);
		$pks = ArrayHelper::toInteger($pks);

		// Remove any values of zero.
		if (array_search(0, $pks, true))
		{
			unset($pks[array_search(0, $pks, true)]);
		}

		if (empty($pks))
		{
			$this->setError(JText::_('COM_USERS_USERS_NO_ITEM_SELECTED'));

			return false;
		}

		$done = false;

		if (!empty($commands['group_id']))
		{
			$cmd = ArrayHelper::getValue($commands, 'group_action', 'add');

			if (!$this->batchUser((int) $commands['group_id'], $pks, $cmd))
			{
				return false;
			}

			$done = true;
		}

		if (!empty($commands['reset_id']))
		{
			if (!$this->batchReset($pks, $commands['reset_id']))
			{
				return false;
			}

			$done = true;
		}

		if (!$done)
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION'));

			return false;
		}

		// Clear the cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Batch flag users as being required to reset their passwords
	 *
	 * @param   array   $userIds  An array of user IDs on which to operate
	 * @param   string  $action   The action to perform
	 *
	 * @return  boolean  True on success, false on failure
	 *
	 * @since   3.2
	 */
	public function batchReset($userIds, $action)
	{
		$userIds = ArrayHelper::toInteger($userIds);

		// Check if I am a Super Admin
		$iAmSuperAdmin = JFactory::getUser()->authorise('core.admin');

		// Non-super super user cannot work with super-admin user.
		if (!$iAmSuperAdmin && JUserHelper::checkSuperUserInUsers($userIds))
		{
			$this->setError(JText::_('COM_USERS_ERROR_CANNOT_BATCH_SUPERUSER'));

			return false;
		}

		// Set the action to perform
		if ($action === 'yes')
		{
			$value = 1;
		}
		else
		{
			$value = 0;
		}

		// Prune out the current user if they are in the supplied user ID array
		$userIds = array_diff($userIds, array(JFactory::getUser()->id));

		if (empty($userIds))
		{
			$this->setError(JText::_('COM_USERS_USERS_ERROR_CANNOT_REQUIRERESET_SELF'));

			return false;
		}

		// Get the DB object
		$db = $this->getDbo();

		$userIds = ArrayHelper::toInteger($userIds);

		$query = $db->getQuery(true);

		// Update the reset flag
		$query->update($db->quoteName('#__users'))
			->set($db->quoteName('requireReset') . ' = ' . $value)
			->where($db->quoteName('id') . ' IN (' . implode(',', $userIds) . ')');

		$db->setQuery($query);

		try
		{
			$db->execute();
		}
		catch (RuntimeException $e)
		{
			$this->setError($e->getMessage());

			return false;
		}

		return true;
	}

	/**
	 * Perform batch operations
	 *
	 * @param   integer  $groupId  The group ID which assignments are being edited
	 * @param   array    $userIds  An array of user IDs on which to operate
	 * @param   string   $action   The action to perform
	 *
	 * @return  boolean  True on success, false on failure
	 *
	 * @since   1.6
	 */
	public function batchUser($groupId, $userIds, $action)
	{
		$userIds = ArrayHelper::toInteger($userIds);

		// Check if I am a Super Admin
		$iAmSuperAdmin = JFactory::getUser()->authorise('core.admin');

		// Non-super super user cannot work with super-admin user.
		if (!$iAmSuperAdmin && JUserHelper::checkSuperUserInUsers($userIds))
		{
			$this->setError(JText::_('COM_USERS_ERROR_CANNOT_BATCH_SUPERUSER'));

			return false;
		}

		// Non-super admin cannot work with super-admin group.
		if ((!$iAmSuperAdmin && JAccess::checkGroup($groupId, 'core.admin')) || $groupId < 1)
		{
			$this->setError(JText::_('COM_USERS_ERROR_INVALID_GROUP'));

			return false;
		}

		// Get the DB object
		$db = $this->getDbo();

		switch ($action)
		{
			// Sets users to a selected group
			case 'set':
				$doDelete = 'all';
				$doAssign = true;
				break;

			// Remove users from a selected group
			case 'del':
				$doDelete = 'group';
				break;

			// Add users to a selected group
			case 'add':
			default:
				$doAssign = true;
				break;
		}

		// Remove the users from the group if requested.
		if (isset($doDelete))
		{
			$query = $db->getQuery(true);

			// Remove users from the group
			$query->delete($db->quoteName('#__user_usergroup_map'))
				->where($db->quoteName('user_id') . ' IN (' . implode(',', $userIds) . ')');

			// Only remove users from selected group
			if ($doDelete == 'group')
			{
				$query->where($db->quoteName('group_id') . ' = ' . (int) $groupId);
			}

			$db->setQuery($query);

			try
			{
				$db->execute();
			}
			catch (RuntimeException $e)
			{
				$this->setError($e->getMessage());

				return false;
			}
		}

		// Assign the users to the group if requested.
		if (isset($doAssign))
		{
			$query = $db->getQuery(true);

			// First, we need to check if the user is already assigned to a group
			$query->select($db->quoteName('user_id'))
				->from($db->quoteName('#__user_usergroup_map'))
				->where($db->quoteName('group_id') . ' = ' . (int) $groupId);
			$db->setQuery($query);
			$users = $db->loadColumn();

			// Build the values clause for the assignment query.
			$query->clear();
			$groups = false;

			foreach ($userIds as $id)
			{
				if (!in_array($id, $users))
				{
					$query->values($id . ',' . $groupId);
					$groups = true;
				}
			}

			// If we have no users to process, throw an error to notify the user
			if (!$groups)
			{
				$this->setError(JText::_('COM_USERS_ERROR_NO_ADDITIONS'));

				return false;
			}

			$query->insert($db->quoteName('#__user_usergroup_map'))
				->columns(array($db->quoteName('user_id'), $db->quoteName('group_id')));
			$db->setQuery($query);

			try
			{
				$db->execute();
			}
			catch (RuntimeException $e)
			{
				$this->setError($e->getMessage());

				return false;
			}
		}

		return true;
	}

	/**
	 * Gets the available groups.
	 *
	 * @return  array  An array of groups
	 *
	 * @since   1.6
	 */
	public function getGroups()
	{
		$user = JFactory::getUser();

		if ($user->authorise('core.edit', 'com_users') && $user->authorise('core.manage', 'com_users'))
		{
			$model = JModelLegacy::getInstance('Groups', 'UsersModel', array('ignore_request' => true));

			return $model->getItems();
		}
		else
		{
			return null;
		}
	}

	/**
	 * Gets the groups this object is assigned to
	 *
	 * @param   integer  $userId  The user ID to retrieve the groups for
	 *
	 * @return  array  An array of assigned groups
	 *
	 * @since   1.6
	 */
	public function getAssignedGroups($userId = null)
	{
		$userId = (!empty($userId)) ? $userId : (int) $this->getState('user.id');

		if (empty($userId))
		{
			$result   = array();
			$form     = $this->getForm();

			if ($form)
			{
				$groupsIDs = $form->getValue('groups');
			}

			if (!empty($groupsIDs))
			{
				$result = $groupsIDs;
			}
			else
			{
				$params = JComponentHelper::getParams('com_users');

				if ($groupId = $params->get('new_usertype', $params->get('guest_usergroup', 1)))
				{
					$result[] = $groupId;
				}
			}
		}
		else
		{
			$result = JUserHelper::getUserGroups($userId);
		}

		return $result;
	}

	/**
	 * Returns the one time password (OTP) – a.k.a. two factor authentication –
	 * configuration for a particular user.
	 *
	 * @param   integer  $userId  The numeric ID of the user
	 *
	 * @return  stdClass  An object holding the OTP configuration for this user
	 *
	 * @since   3.2
	 */
	public function getOtpConfig($userId = null)
	{
		$userId = (!empty($userId)) ? $userId : (int) $this->getState('user.id');

		// Initialise
		$otpConfig = (object) array(
			'method' => 'none',
			'config' => array(),
			'otep'   => array()
		);

		/**
		 * Get the raw data, without going through JUser (required in order to
		 * be able to modify the user record before logging in the user).
		 */
		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->select('*')
			->from($db->qn('#__users'))
			->where($db->qn('id') . ' = ' . (int) $userId);
		$db->setQuery($query);
		$item = $db->loadObject();

		// Make sure this user does have OTP enabled
		if (empty($item->otpKey))
		{
			return $otpConfig;
		}

		// Get the encrypted data
		list($method, $config) = explode(':', $item->otpKey, 2);
		$encryptedOtep = $item->otep;

		// Get the secret key, yes the thing that is saved in the configuration file
		$key = $this->getOtpConfigEncryptionKey();

		if (strpos($config, '{') === false)
		{
			$openssl         = new FOFEncryptAes($key, 256);
			$mcrypt          = new FOFEncryptAes($key, 256, 'cbc', null, 'mcrypt');

			$decryptedConfig = $mcrypt->decryptString($config);

			if (strpos($decryptedConfig, '{') !== false)
			{
				// Data encrypted with mcrypt
				$decryptedOtep = $mcrypt->decryptString($encryptedOtep);
				$encryptedOtep = $openssl->encryptString($decryptedOtep);
			}
			else
			{
				// Config data seems to be save encrypted, this can happen with 3.6.3 and openssl, lets get the data
				$decryptedConfig = $openssl->decryptString($config);
			}

			$otpKey = $method . ':' . $decryptedConfig;

			$query = $db->getQuery(true)
				->update($db->qn('#__users'))
				->set($db->qn('otep') . '=' . $db->q($encryptedOtep))
				->set($db->qn('otpKey') . '=' . $db->q($otpKey))
				->where($db->qn('id') . ' = ' . $db->q($userId));
			$db->setQuery($query);
			$db->execute();
		}
		else
		{
			$decryptedConfig = $config;
		}

		// Create an encryptor class
		$aes = new FOFEncryptAes($key, 256);

		// Decrypt the data
		$decryptedOtep = $aes->decryptString($encryptedOtep);

		// Remove the null padding added during encryption
		$decryptedConfig = rtrim($decryptedConfig, "\0");
		$decryptedOtep = rtrim($decryptedOtep, "\0");

		// Update the configuration object
		$otpConfig->method = $method;
		$otpConfig->config = @json_decode($decryptedConfig);
		$otpConfig->otep = @json_decode($decryptedOtep);

		/*
		 * If the decryption failed for any reason we essentially disable the
		 * two-factor authentication. This prevents impossible to log in sites
		 * if the site admin changes the site secret for any reason.
		 */
		if (is_null($otpConfig->config))
		{
			$otpConfig->config = array();
		}

		if (is_object($otpConfig->config))
		{
			$otpConfig->config = (array) $otpConfig->config;
		}

		if (is_null($otpConfig->otep))
		{
			$otpConfig->otep = array();
		}

		if (is_object($otpConfig->otep))
		{
			$otpConfig->otep = (array) $otpConfig->otep;
		}

		// Return the configuration object
		return $otpConfig;
	}

	/**
	 * Sets the one time password (OTP) – a.k.a. two factor authentication –
	 * configuration for a particular user. The $otpConfig object is the same as
	 * the one returned by the getOtpConfig method.
	 *
	 * @param   integer   $userId     The numeric ID of the user
	 * @param   stdClass  $otpConfig  The OTP configuration object
	 *
	 * @return  boolean  True on success
	 *
	 * @since   3.2
	 */
	public function setOtpConfig($userId, $otpConfig)
	{
		$userId = (!empty($userId)) ? $userId : (int) $this->getState('user.id');

		$updates = (object) array(
			'id'     => $userId,
			'otpKey' => '',
			'otep'   => ''
		);

		// Create an encryptor class
		$key = $this->getOtpConfigEncryptionKey();
		$aes = new FOFEncryptAes($key, 256);

		// Create the encrypted option strings
		if (!empty($otpConfig->method) && ($otpConfig->method != 'none'))
		{
			$decryptedConfig = json_encode($otpConfig->config);
			$decryptedOtep = json_encode($otpConfig->otep);
			$updates->otpKey = $otpConfig->method . ':' . $decryptedConfig;
			$updates->otep = $aes->encryptString($decryptedOtep);
		}

		$db = $this->getDbo();
		$result = $db->updateObject('#__users', $updates, 'id');

		return $result;
	}

	/**
	 * Gets the symmetric encryption key for the OTP configuration data. It
	 * currently returns the site's secret.
	 *
	 * @return  string  The encryption key
	 *
	 * @since   3.2
	 */
	public function getOtpConfigEncryptionKey()
	{
		return JFactory::getConfig()->get('secret');
	}

	/**
	 * Gets the configuration forms for all two-factor authentication methods
	 * in an array.
	 *
	 * @param   integer  $userId  The user ID to load the forms for (optional)
	 *
	 * @return  array
	 *
	 * @since   3.2
	 */
	public function getTwofactorform($userId = null)
	{
		$userId = (!empty($userId)) ? $userId : (int) $this->getState('user.id');

		$otpConfig = $this->getOtpConfig($userId);

		FOFPlatform::getInstance()->importPlugin('twofactorauth');

		return FOFPlatform::getInstance()->runPlugins('onUserTwofactorShowConfiguration', array($otpConfig, $userId));
	}

	/**
	 * Generates a new set of One Time Emergency Passwords (OTEPs) for a given user.
	 *
	 * @param   integer  $userId  The user ID
	 * @param   integer  $count   How many OTEPs to generate? Default: 10
	 *
	 * @return  array  The generated OTEPs
	 *
	 * @since   3.2
	 */
	public function generateOteps($userId, $count = 10)
	{
		$userId = (!empty($userId)) ? $userId : (int) $this->getState('user.id');

		// Initialise
		$oteps = array();

		// Get the OTP configuration for the user
		$otpConfig = $this->getOtpConfig($userId);

		// If two factor authentication is not enabled, abort
		if (empty($otpConfig->method) || ($otpConfig->method == 'none'))
		{
			return $oteps;
		}

		$salt = '0123456789';
		$base = strlen($salt);
		$length = 16;

		for ($i = 0; $i < $count; $i++)
		{
			$makepass = '';
			$random = JCrypt::genRandomBytes($length + 1);
			$shift = ord($random[0]);

			for ($j = 1; $j <= $length; ++$j)
			{
				$makepass .= $salt[($shift + ord($random[$j])) % $base];
				$shift += ord($random[$j]);
			}

			$oteps[] = $makepass;
		}

		$otpConfig->otep = $oteps;

		// Save the now modified OTP configuration
		$this->setOtpConfig($userId, $otpConfig);

		return $oteps;
	}

	/**
	 * Checks if the provided secret key is a valid two factor authentication
	 * secret key. If not, it will check it against the list of one time
	 * emergency passwords (OTEPs). If it's a valid OTEP it will also remove it
	 * from the user's list of OTEPs.
	 *
	 * This method will return true in the following conditions:
	 * - The two factor authentication is not enabled
	 * - You have provided a valid secret key for
	 * - You have provided a valid OTEP
	 *
	 * You can define the following options in the $options array:
	 * otp_config		The OTP (one time password, a.k.a. two factor auth)
	 *				    configuration object. If not set we'll load it automatically.
	 * warn_if_not_req	Issue a warning if you are checking a secret key against
	 *					a user account which doesn't have any two factor
	 *					authentication method enabled.
	 * warn_irq_msg		The string to use for the warn_if_not_req warning
	 *
	 * @param   integer  $userId     The user's numeric ID
	 * @param   string   $secretKey  The secret key you want to check
	 * @param   array    $options    Options; see above
	 *
	 * @return  boolean  True if it's a valid secret key for this user.
	 *
	 * @since   3.2
	 */
	public function isValidSecretKey($userId, $secretKey, $options = array())
	{
		// Load the user's OTP (one time password, a.k.a. two factor auth) configuration
		if (!array_key_exists('otp_config', $options))
		{
			$otpConfig = $this->getOtpConfig($userId);
			$options['otp_config'] = $otpConfig;
		}
		else
		{
			$otpConfig = $options['otp_config'];
		}

		// Check if the user has enabled two factor authentication
		if (empty($otpConfig->method) || ($otpConfig->method == 'none'))
		{
			// Load language
			$lang = JFactory::getLanguage();
			$extension = 'com_users';
			$source = JPATH_ADMINISTRATOR . '/components/' . $extension;

			$lang->load($extension, JPATH_ADMINISTRATOR, null, false, true)
				|| $lang->load($extension, $source, null, false, true);

			$warn = true;
			$warnMessage = JText::_('COM_USERS_ERROR_SECRET_CODE_WITHOUT_TFA');

			if (array_key_exists('warn_if_not_req', $options))
			{
				$warn = $options['warn_if_not_req'];
			}

			if (array_key_exists('warn_irq_msg', $options))
			{
				$warnMessage = $options['warn_irq_msg'];
			}

			// Warn the user if they are using a secret code but they have not
			// enabled two factor auth in their account.
			if (!empty($secretKey) && $warn)
			{
				try
				{
					$app = JFactory::getApplication();
					$app->enqueueMessage($warnMessage, 'warning');
				}
				catch (Exception $exc)
				{
					// This happens when we are in CLI mode. In this case
					// no warning is issued
					return true;
				}
			}

			return true;
		}

		$credentials = array(
			'secretkey' => $secretKey,
		);

		// Try to validate the OTP
		FOFPlatform::getInstance()->importPlugin('twofactorauth');

		$otpAuthReplies = FOFPlatform::getInstance()->runPlugins('onUserTwofactorAuthenticate', array($credentials, $options));

		$check = false;

		/*
		 * This looks like noob code but DO NOT TOUCH IT and do not convert
		 * to in_array(). During testing in_array() inexplicably returned
		 * null when the OTEP begins with a zero! o_O
		 */
		if (!empty($otpAuthReplies))
		{
			foreach ($otpAuthReplies as $authReply)
			{
				$check = $check || $authReply;
			}
		}

		// Fall back to one time emergency passwords
		if (!$check)
		{
			$check = $this->isValidOtep($userId, $secretKey, $otpConfig);
		}

		return $check;
	}

	/**
	 * Checks if the supplied string is a valid one time emergency password
	 * (OTEP) for this user. If it is it will be automatically removed from the
	 * user's list of OTEPs.
	 *
	 * @param   integer  $userId     The user ID against which you are checking
	 * @param   string   $otep       The string you want to test for validity
	 * @param   object   $otpConfig  Optional; the two factor authentication configuration (automatically fetched if not set)
	 *
	 * @return  boolean  True if it's a valid OTEP or if two factor auth is not
	 *                   enabled in this user's account.
	 *
	 * @since   3.2
	 */
	public function isValidOtep($userId, $otep, $otpConfig = null)
	{
		if (is_null($otpConfig))
		{
			$otpConfig = $this->getOtpConfig($userId);
		}

		// Did the user use an OTEP instead?
		if (empty($otpConfig->otep))
		{
			if (empty($otpConfig->method) || ($otpConfig->method == 'none'))
			{
				// Two factor authentication is not enabled on this account.
				// Any string is assumed to be a valid OTEP.
				return true;
			}
			else
			{
				/**
				 * Two factor authentication enabled and no OTEPs defined. The
				 * user has used them all up. Therefore anything they enter is
				 * an invalid OTEP.
				 */
				return false;
			}
		}

		// Clean up the OTEP (remove dashes, spaces and other funny stuff
		// our beloved users may have unwittingly stuffed in it)
		$otep = filter_var($otep, FILTER_SANITIZE_NUMBER_INT);
		$otep = str_replace('-', '', $otep);

		$check = false;

		// Did we find a valid OTEP?
		if (in_array($otep, $otpConfig->otep))
		{
			// Remove the OTEP from the array
			$otpConfig->otep = array_diff($otpConfig->otep, array($otep));

			$this->setOtpConfig($userId, $otpConfig);

			// Return true; the OTEP was a valid one
			$check = true;
		}

		return $check;
	}
}
components/com_users/models/users.php000060400000031767152453623460014111 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Methods supporting a list of user records.
 *
 * @since  1.6
 */
class UsersModelUsers extends JModelList
{
	/**
	 * A blacklist of filter variables to not merge into the model's state
	 *
	 * @var    array
	 */
	protected $filterBlacklist = array('groups', 'excluded');

	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'name', 'a.name',
				'username', 'a.username',
				'email', 'a.email',
				'block', 'a.block',
				'sendEmail', 'a.sendEmail',
				'registerDate', 'a.registerDate',
				'lastvisitDate', 'a.lastvisitDate',
				'activation', 'a.activation',
				'active',
				'group_id',
				'range',
				'lastvisitrange',
				'state',
			);
		}

		parent::__construct($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')
	{
		$app = JFactory::getApplication('administrator');

		// Adjust the context to support modal layouts.
		if ($layout = $app->input->get('layout', 'default', 'cmd'))
		{
			$this->context .= '.' . $layout;
		}

		// Load the filter state.
		$this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string'));
		$this->setState('filter.active', $this->getUserStateFromRequest($this->context . '.filter.active', 'filter_active', '', 'cmd'));
		$this->setState('filter.state', $this->getUserStateFromRequest($this->context . '.filter.state', 'filter_state', '', 'cmd'));
		$this->setState('filter.group_id', $this->getUserStateFromRequest($this->context . '.filter.group_id', 'filter_group_id', null, 'int'));
		$this->setState('filter.range', $this->getUserStateFromRequest($this->context . '.filter.range', 'filter_range', '', 'cmd'));
		$this->setState(
			'filter.lastvisitrange', $this->getUserStateFromRequest($this->context . '.filter.lastvisitrange', 'filter_lastvisitrange', '', 'cmd')
		);

		$groups = json_decode(base64_decode($app->input->get('groups', '', 'BASE64')));

		if (isset($groups))
		{
			$groups = ArrayHelper::toInteger($groups);
		}

		$this->setState('filter.groups', $groups);

		$excluded = json_decode(base64_decode($app->input->get('excluded', '', 'BASE64')));

		if (isset($excluded))
		{
			$excluded = ArrayHelper::toInteger($excluded);
		}

		$this->setState('filter.excluded', $excluded);

		// Load the parameters.
		$params = JComponentHelper::getParams('com_users');
		$this->setState('params', $params);

		// 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.
	 *
	 * @since   1.6
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.active');
		$id .= ':' . $this->getState('filter.state');
		$id .= ':' . $this->getState('filter.group_id');
		$id .= ':' . $this->getState('filter.range');

		return parent::getStoreId($id);
	}

	/**
	 * Gets the list of users and adds expensive joins to the result set.
	 *
	 * @return  mixed  An array of data items on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function getItems()
	{
		// Get a storage key.
		$store = $this->getStoreId();

		// Try to load the data from internal storage.
		if (empty($this->cache[$store]))
		{
			$groups  = $this->getState('filter.groups');
			$groupId = $this->getState('filter.group_id');

			if (isset($groups) && (empty($groups) || $groupId && !in_array($groupId, $groups)))
			{
				$items = array();
			}
			else
			{
				$items = parent::getItems();
			}

			// Bail out on an error or empty list.
			if (empty($items))
			{
				$this->cache[$store] = $items;

				return $items;
			}

			// Joining the groups with the main query is a performance hog.
			// Find the information only on the result set.

			// First pass: get list of the user id's and reset the counts.
			$userIds = array();

			foreach ($items as $item)
			{
				$userIds[] = (int) $item->id;
				$item->group_count = 0;
				$item->group_names = '';
				$item->note_count = 0;
			}

			// Get the counts from the database only for the users in the list.
			$db    = $this->getDbo();
			$query = $db->getQuery(true);

			// Join over the group mapping table.
			$query->select('map.user_id, COUNT(map.group_id) AS group_count')
				->from('#__user_usergroup_map AS map')
				->where('map.user_id IN (' . implode(',', $userIds) . ')')
				->group('map.user_id')
				// Join over the user groups table.
				->join('LEFT', '#__usergroups AS g2 ON g2.id = map.group_id');

			$db->setQuery($query);

			// Load the counts into an array indexed on the user id field.
			try
			{
				$userGroups = $db->loadObjectList('user_id');
			}
			catch (RuntimeException $e)
			{
				$this->setError($e->getMessage());

				return false;
			}

			$query->clear()
				->select('n.user_id, COUNT(n.id) As note_count')
				->from('#__user_notes AS n')
				->where('n.user_id IN (' . implode(',', $userIds) . ')')
				->where('n.state >= 0')
				->group('n.user_id');

			$db->setQuery($query);

			// Load the counts into an array indexed on the aro.value field (the user id).
			try
			{
				$userNotes = $db->loadObjectList('user_id');
			}
			catch (RuntimeException $e)
			{
				$this->setError($e->getMessage());

				return false;
			}

			// Second pass: collect the group counts into the master items array.
			foreach ($items as &$item)
			{
				if (isset($userGroups[$item->id]))
				{
					$item->group_count = $userGroups[$item->id]->group_count;

					// Group_concat in other databases is not supported
					$item->group_names = $this->_getUserDisplayedGroups($item->id);
				}

				if (isset($userNotes[$item->id]))
				{
					$item->note_count = $userNotes[$item->id]->note_count;
				}
			}

			// Add the items to the internal cache.
			$this->cache[$store] = $items;
		}

		return $this->cache[$store];
	}

	/**
	 * 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(
			$this->getState(
				'list.select',
				'a.*'
			)
		);

		$query->from($db->quoteName('#__users') . ' AS a');

		// If the model is set to check item state, add to the query.
		$state = $this->getState('filter.state');

		if (is_numeric($state))
		{
			$query->where('a.block = ' . (int) $state);
		}

		// If the model is set to check the activated state, add to the query.
		$active = $this->getState('filter.active');

		if (is_numeric($active))
		{
			if ($active == '0')
			{
				$query->where('a.activation IN (' . $db->quote('') . ', ' . $db->quote('0') . ')');
			}
			elseif ($active == '1')
			{
				$query->where($query->length('a.activation') . ' > 1');
			}
		}

		// Filter the items over the group id if set.
		$groupId = $this->getState('filter.group_id');
		$groups  = $this->getState('filter.groups');

		if ($groupId || isset($groups))
		{
			$query->join('LEFT', '#__user_usergroup_map AS map2 ON map2.user_id = a.id')
				->group(
					$db->quoteName(
						array(
							'a.id',
							'a.name',
							'a.username',
							'a.password',
							'a.block',
							'a.sendEmail',
							'a.registerDate',
							'a.lastvisitDate',
							'a.activation',
							'a.params',
							'a.email'
						)
					)
				);

			if ($groupId)
			{
				$query->where('map2.group_id = ' . (int) $groupId);
			}

			if (isset($groups))
			{
				$query->where('map2.group_id IN (' . implode(',', $groups) . ')');
			}
		}

		// Filter the items over the search string if set.
		$search = $this->getState('filter.search');

		if (!empty($search))
		{
			if (stripos($search, 'id:') === 0)
			{
				$query->where('a.id = ' . (int) substr($search, 3));
			}
			elseif (stripos($search, 'username:') === 0)
			{
				$search = $db->quote('%' . $db->escape(substr($search, 9), true) . '%');
				$query->where('a.username LIKE ' . $search);
			}
			else
			{
				// Escape the search token.
				$search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%'));

				// Compile the different search clauses.
				$searches   = array();
				$searches[] = 'a.name LIKE ' . $search;
				$searches[] = 'a.username LIKE ' . $search;
				$searches[] = 'a.email LIKE ' . $search;

				// Add the clauses to the query.
				$query->where('(' . implode(' OR ', $searches) . ')');
			}
		}

		// Add filter for registration ranges select list
		$range = $this->getState('filter.range');

		// Apply the range filter.
		if ($range)
		{
			$dates = $this->buildDateRange($range);

			if ($dates['dNow'] === false)
			{
				$query->where(
					$db->qn('a.registerDate') . ' < ' . $db->quote($dates['dStart']->format('Y-m-d H:i:s'))
				);
			}
			else
			{
				$query->where(
					$db->qn('a.registerDate') . ' >= ' . $db->quote($dates['dStart']->format('Y-m-d H:i:s')) .
					' AND ' . $db->qn('a.registerDate') . ' <= ' . $db->quote($dates['dNow']->format('Y-m-d H:i:s'))
				);
			}
		}

		// Add filter for registration ranges select list
		$lastvisitrange = $this->getState('filter.lastvisitrange');

		// Apply the range filter.
		if ($lastvisitrange)
		{
			$dates = $this->buildDateRange($lastvisitrange);

			if (is_string($dates['dStart']))
			{
				$query->where(
					$db->qn('a.lastvisitDate') . ' = ' . $db->quote($dates['dStart'])
				);
			}
			elseif ($dates['dNow'] === false)
			{
				$query->where(
					$db->qn('a.lastvisitDate') . ' < ' . $db->quote($dates['dStart']->format('Y-m-d H:i:s'))
				);
			}
			else
			{
				$query->where(
					$db->qn('a.lastvisitDate') . ' >= ' . $db->quote($dates['dStart']->format('Y-m-d H:i:s')) .
					' AND ' . $db->qn('a.lastvisitDate') . ' <= ' . $db->quote($dates['dNow']->format('Y-m-d H:i:s'))
				);
			}
		}

		// Filter by excluded users
		$excluded = $this->getState('filter.excluded');

		if (!empty($excluded))
		{
			$query->where('id NOT IN (' . implode(',', $excluded) . ')');
		}

		// Add the list ordering clause.
		$query->order($db->qn($db->escape($this->getState('list.ordering', 'a.name'))) . ' ' . $db->escape($this->getState('list.direction', 'ASC')));

		return $query;
	}

	/**
	 * Construct the date range to filter on.
	 *
	 * @param   string  $range  The textual range to construct the filter for.
	 *
	 * @return  string  The date range to filter on.
	 *
	 * @since   3.6.0
	 */
	private function buildDateRange($range)
	{
		// Get UTC for now.
		$dNow   = new JDate;
		$dStart = clone $dNow;

		switch ($range)
		{
			case 'past_week':
				$dStart->modify('-7 day');
				break;

			case 'past_1month':
				$dStart->modify('-1 month');
				break;

			case 'past_3month':
				$dStart->modify('-3 month');
				break;

			case 'past_6month':
				$dStart->modify('-6 month');
				break;

			case 'post_year':
				$dNow = false;
			case 'past_year':
				$dStart->modify('-1 year');
				break;

			case 'today':
				// Ranges that need to align with local 'days' need special treatment.
				$app    = JFactory::getApplication();
				$offset = $app->get('offset');

				// Reset the start time to be the beginning of today, local time.
				$dStart = new JDate('now', $offset);
				$dStart->setTime(0, 0, 0);

				// Now change the timezone back to UTC.
				$tz = new DateTimeZone('GMT');
				$dStart->setTimezone($tz);
				break;
			case 'never':
				$dNow = false;
				$dStart = $this->_db->getNullDate();
				break;
		}

		return array('dNow' => $dNow, 'dStart' => $dStart);
	}

	/**
	 * SQL server change
	 *
	 * @param   integer  $userId  User identifier
	 *
	 * @return  string   Groups titles imploded :$
	 */
	protected function _getUserDisplayedGroups($userId)
	{
		$db    = $this->getDbo();
		$query = $db->getQuery(true)
			->select($db->qn('title'))
			->from($db->qn('#__usergroups', 'ug'))
			->join('LEFT', $db->qn('#__user_usergroup_map', 'map') . ' ON (ug.id = map.group_id)')
			->where($db->qn('map.user_id') . ' = ' . (int) $userId);

		try
		{
			$result = $db->setQuery($query)->loadColumn();
		}
		catch (RunTimeException $e)
		{
			$result = array();
		}

		return implode("\n", $result);
	}
}
components/com_users/models/note.php000060400000006416152453623460013706 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * User note model.
 *
 * @since  2.5
 */
class UsersModelNote extends JModelAdmin
{
	/**
	 * The type alias for this content type.
	 *
	 * @var      string
	 * @since    3.2
	 */
	public $typeAlias = 'com_users.note';

	/**
	 * 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  mixed  A JForm object on success, false on failure
	 *
	 * @since   2.5
	 */
	public function getForm($data = array(), $loadData = true)
	{
		// Get the form.
		$form = $this->loadForm('com_users.note', 'note', array('control' => 'jform', 'load_data' => $loadData));

		if (empty($form))
		{
			return false;
		}

		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   2.5
	 */
	public function getItem($pk = null)
	{
		$result = parent::getItem($pk);

		// Get the dispatcher and load the content plugins.
		$dispatcher = JEventDispatcher::getInstance();
		JPluginHelper::importPlugin('content');

		// Load the user plugins for backward compatibility (v3.3.3 and earlier).
		JPluginHelper::importPlugin('user');

		// Trigger the data preparation event.
		$dispatcher->trigger('onContentPrepareData', array('com_users.note', $result));

		return $result;
	}

	/**
	 * Method to get a table object, load it if necessary.
	 *
	 * @param   string  $name     The table name. Optional.
	 * @param   string  $prefix   The class prefix. Optional.
	 * @param   array   $options  Configuration array for model. Optional.
	 *
	 * @return  JTable  The table object
	 *
	 * @since   2.5
	 */
	public function getTable($name = 'Note', $prefix = 'UsersTable', $options = array())
	{
		return JTable::getInstance($name, $prefix, $options);
	}

	/**
	 * 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()
	{
		// Get the application
		$app = JFactory::getApplication();

		// Check the session for previously entered form data.
		$data = $app->getUserState('com_users.edit.note.data', array());

		if (empty($data))
		{
			$data = $this->getItem();

			// Prime some default values.
			if ($this->getState('note.id') == 0)
			{
				$data->set('catid', $app->input->get('catid', $app->getUserState('com_users.notes.filter.category_id'), 'int'));
			}

			$userId = $app->input->get('u_id', 0, 'int');

			if ($userId != 0)
			{
				$data->user_id = $userId;
			}
		}

		$this->preprocessData('com_users.note', $data);

		return $data;
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @return  void
	 *
	 * @since   2.5
	 */
	protected function populateState()
	{
		parent::populateState();

		$userId = JFactory::getApplication()->input->get('u_id', 0, 'int');
		$this->setState('note.user_id', $userId);
	}
}
components/com_users/models/groups.php000060400000013436152453623460014260 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Methods supporting a list of user group records.
 *
 * @since  1.6
 */
class UsersModelGroups extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'parent_id', 'a.parent_id',
				'title', 'a.title',
				'lft', 'a.lft',
				'rgt', 'a.rgt',
			);
		}

		parent::__construct($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.lft', $direction = 'asc')
	{
		// Load the filter state.
		$this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string'));

		// Load the parameters.
		$params = JComponentHelper::getParams('com_users');
		$this->setState('params', $params);

		// 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');

		return parent::getStoreId($id);
	}

	/**
	 * Gets the list of groups and adds expensive joins to the result set.
	 *
	 * @return  mixed  An array of data items on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function getItems()
	{
		// Get a storage key.
		$store = $this->getStoreId();

		// Try to load the data from internal storage.
		if (empty($this->cache[$store]))
		{
			$items = parent::getItems();

			// Bail out on an error or empty list.
			if (empty($items))
			{
				$this->cache[$store] = $items;

				return $items;
			}

			try
			{
				$items = $this->populateExtraData($items);
			}
			catch (RuntimeException $e)
			{
				$this->setError($e->getMessage());

				return false;
			}

			// Add the items to the internal cache.
			$this->cache[$store] = $items;
		}

		return $this->cache[$store];
	}

	/**
	 * 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);

		// Select the required fields from the table.
		$query->select(
			$this->getState(
				'list.select',
				'a.*'
			)
		);
		$query->from($db->quoteName('#__usergroups') . ' AS a');

		// Filter the comments over the search string if set.
		$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);
			}
		}

		// Add the list ordering clause.
		$query->order($db->escape($this->getState('list.ordering', 'a.lft')) . ' ' . $db->escape($this->getState('list.direction', 'ASC')));

		return $query;
	}

	/**
	 * Populate level & path for items.
	 *
	 * @param   array  $items  Array of stdClass objects
	 *
	 * @return  array
	 *
	 * @since   3.6.3
	 */
	private function populateExtraData(array $items)
	{
		// First pass: get list of the group id's and reset the counts.
		$groupsByKey = array();

		foreach ($items as $item)
		{
			$groupsByKey[(int) $item->id] = $item;
		}

		$groupIds = array_keys($groupsByKey);

		$db = $this->getDbo();

		// Get total enabled users in group.
		$query = $db->getQuery(true);

		// Count the objects in the user group.
		$query->select('map.group_id, COUNT(DISTINCT map.user_id) AS user_count')
			->from($db->quoteName('#__user_usergroup_map', 'map'))
			->join('LEFT', $db->quoteName('#__users', 'u') . ' ON ' . $db->quoteName('u.id') . ' = ' . $db->quoteName('map.user_id'))
			->where($db->quoteName('map.group_id') . ' IN (' . implode(',', $groupIds) . ')')
			->where($db->quoteName('u.block') . ' = 0')
			->group($db->quoteName('map.group_id'));
		$db->setQuery($query);

		try
		{
			$countEnabled = $db->loadAssocList('group_id', 'count_enabled');
		}
		catch (RuntimeException $e)
		{
			$this->setError($e->getMessage());

			return false;
		}

		// Get total disabled users in group.
		$query->clear('where')
			->where('map.group_id IN (' . implode(',', $groupIds) . ')')
			->where('u.block = 1');
		$db->setQuery($query);

		try
		{
			$countDisabled = $db->loadAssocList('group_id', 'count_disabled');
		}
		catch (RuntimeException $e)
		{
			$this->setError($e->getMessage());

			return false;
		}

		// Inject the values back into the array.
		foreach ($groupsByKey as &$item)
		{
			$item->count_enabled   = isset($countEnabled[$item->id]) ? (int) $countEnabled[$item->id]['user_count'] : 0;
			$item->count_disabled  = isset($countDisabled[$item->id]) ? (int) $countDisabled[$item->id]['user_count'] : 0;
			$item->user_count      = $item->count_enabled + $item->count_disabled;
		}

		$groups = new JHelperUsergroups($groupsByKey);

		return array_values($groups->getAll());
	}
}
components/com_users/models/debuggroup.php000060400000014314152453623460015100 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('UsersHelperDebug', JPATH_ADMINISTRATOR . '/components/com_users/helpers/debug.php');

/**
 * Methods supporting a list of User ACL permissions
 *
 * @since  1.6
 */
class UsersModelDebuggroup extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   3.6.0
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'a.title',
				'component', 'a.name',
				'a.lft',
				'a.id',
				'level_start', 'level_end', 'a.level',
			);
		}

		parent::__construct($config);
	}

	/**
	 * Get a list of the actions.
	 *
	 * @return  array
	 *
	 * @since   1.6
	 */
	public function getDebugActions()
	{
		$component = $this->getState('filter.component');

		return UsersHelperDebug::getDebugActions($component);
	}

	/**
	 * Override getItems method.
	 *
	 * @return  array
	 *
	 * @since   1.6
	 */
	public function getItems()
	{
		$groupId = $this->getState('group_id');

		if (($assets = parent::getItems()) && $groupId)
		{
			$actions = $this->getDebugActions();

			foreach ($assets as &$asset)
			{
				$asset->checks = array();

				foreach ($actions as $action)
				{
					$name = $action[0];

					$asset->checks[$name] = JAccess::checkGroup($groupId, $name, $asset->name);
				}
			}
		}

		return $assets;
	}

	/**
	 * 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.lft', $direction = 'asc')
	{
		$app = JFactory::getApplication('administrator');

		// Adjust the context to support modal layouts.
		$layout = $app->input->get('layout', 'default');

		if ($layout)
		{
			$this->context .= '.' . $layout;
		}

		// Load the filter state.
		$this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string'));
		$this->setState('group_id', $this->getUserStateFromRequest($this->context . '.group_id', 'group_id', 0, 'int', false));

		$levelStart = $this->getUserStateFromRequest($this->context . '.filter.level_start', 'filter_level_start', '', 'cmd');
		$this->setState('filter.level_start', $levelStart);

		$value = $this->getUserStateFromRequest($this->context . '.filter.level_end', 'filter_level_end', '', 'cmd');

		if ($value > 0 && $value < $levelStart)
		{
			$value = $levelStart;
		}

		$this->setState('filter.level_end', $value);

		$this->setState('filter.component', $this->getUserStateFromRequest($this->context . '.filter.component', 'filter_component', '', 'string'));

		// Load the parameters.
		$params = JComponentHelper::getParams('com_users');
		$this->setState('params', $params);

		// 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('group_id');
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.level_start');
		$id .= ':' . $this->getState('filter.level_end');
		$id .= ':' . $this->getState('filter.component');

		return parent::getStoreId($id);
	}

	/**
	 * Get the group being debugged.
	 *
	 * @return  JObject
	 *
	 * @since   1.6
	 */
	public function getGroup()
	{
		$groupId = (int) $this->getState('group_id');

		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->select('id, title')
			->from('#__usergroups')
			->where('id = ' . $groupId);

		$db->setQuery($query);

		try
		{
			$group = $db->loadObject();
		}
		catch (RuntimeException $e)
		{
			$this->setError($e->getMessage());

			return false;
		}

		return $group;
	}

	/**
	 * 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(
			$this->getState(
				'list.select',
				'a.id, a.name, a.title, a.level, a.lft, a.rgt'
			)
		);
		$query->from($db->quoteName('#__assets', 'a'));

		// Filter the items over the search string if set.
		if ($this->getState('filter.search'))
		{
			// Escape the search token.
			$search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($this->getState('filter.search')), true) . '%'));

			// Compile the different search clauses.
			$searches = array();
			$searches[] = 'a.name LIKE ' . $search;
			$searches[] = 'a.title LIKE ' . $search;

			// Add the clauses to the query.
			$query->where('(' . implode(' OR ', $searches) . ')');
		}

		// Filter on the start and end levels.
		$levelStart = (int) $this->getState('filter.level_start');
		$levelEnd = (int) $this->getState('filter.level_end');

		if ($levelEnd > 0 && $levelEnd < $levelStart)
		{
			$levelEnd = $levelStart;
		}

		if ($levelStart > 0)
		{
			$query->where('a.level >= ' . $levelStart);
		}

		if ($levelEnd > 0)
		{
			$query->where('a.level <= ' . $levelEnd);
		}

		// Filter the items over the component if set.
		if ($this->getState('filter.component'))
		{
			$component = $this->getState('filter.component');
			$query->where('(a.name = ' . $db->quote($component) . ' OR a.name LIKE ' . $db->quote($component . '.%') . ')');
		}

		// Add the list ordering clause.
		$query->order($db->escape($this->getState('list.ordering', 'a.lft')) . ' ' . $db->escape($this->getState('list.direction', 'ASC')));

		return $query;
	}
}
components/com_users/models/levels.php000060400000012342152453623460014226 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Methods supporting a list of user access level records.
 *
 * @since  1.6
 */
class UsersModelLevels extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'title', 'a.title',
				'ordering', 'a.ordering',
			);
		}

		parent::__construct($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.ordering', $direction = 'asc')
	{
		// Load the filter state.
		$this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search'));

		// Load the parameters.
		$params = JComponentHelper::getParams('com_users');
		$this->setState('params', $params);

		// 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');

		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);

		// Select the required fields from the table.
		$query->select(
			$this->getState(
				'list.select',
				'a.*'
			)
		);
		$query->from($db->quoteName('#__viewlevels') . ' AS a');

		// Add the level in the tree.
		$query->group('a.id, a.title, a.ordering, a.rules');

		// Filter the items over the search string if set.
		$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);
			}
		}

		$query->group('a.id');

		// 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 adjust the ordering of a row.
	 *
	 * @param   integer  $pk         The ID of the primary key to move.
	 * @param   integer  $direction  Increment, usually +1 or -1
	 *
	 * @return  boolean  False on failure or error, true otherwise.
	 */
	public function reorder($pk, $direction = 0)
	{
		// Sanitize the id and adjustment.
		$pk = (!empty($pk)) ? $pk : (int) $this->getState('level.id');
		$user = JFactory::getUser();

		// Get an instance of the record's table.
		$table = JTable::getInstance('viewlevel');

		// Load the row.
		if (!$table->load($pk))
		{
			$this->setError($table->getError());

			return false;
		}

		// Access checks.
		$allow = $user->authorise('core.edit.state', 'com_users');

		if (!$allow)
		{
			$this->setError(JText::_('JLIB_APPLICATION_ERROR_EDITSTATE_NOT_PERMITTED'));

			return false;
		}

		// Move the row.
		// TODO: Where clause to restrict category.
		$table->move($pk);

		return true;
	}

	/**
	 * Saves the manually set order of records.
	 *
	 * @param   array    $pks    An array of primary key ids.
	 * @param   integer  $order  Order position
	 *
	 * @return  boolean|JException  Boolean true on success, boolean false or JException instance on error
	 */
	public function saveorder($pks, $order)
	{
		$table = JTable::getInstance('viewlevel');
		$user = JFactory::getUser();
		$conditions = array();

		if (empty($pks))
		{
			return JError::raiseWarning(500, JText::_('COM_USERS_ERROR_LEVELS_NOLEVELS_SELECTED'));
		}

		// Update ordering values
		foreach ($pks as $i => $pk)
		{
			$table->load((int) $pk);

			// Access checks.
			$allow = $user->authorise('core.edit.state', 'com_users');

			if (!$allow)
			{
				// Prune items that you can't change.
				unset($pks[$i]);
				JError::raiseWarning(403, JText::_('JLIB_APPLICATION_ERROR_EDITSTATE_NOT_PERMITTED'));
			}
			elseif ($table->ordering != $order[$i])
			{
				$table->ordering = $order[$i];

				if (!$table->store())
				{
					$this->setError($table->getError());

					return false;
				}
			}
		}

		// Execute reorder for each category.
		foreach ($conditions as $cond)
		{
			$table->load($cond[0]);
			$table->reorder($cond[1]);
		}

		return true;
	}
}
components/com_users/models/debuguser.php000060400000013664152453623460014731 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('UsersHelperDebug', JPATH_ADMINISTRATOR . '/components/com_users/helpers/debug.php');

/**
 * Methods supporting a list of User ACL permissions
 *
 * @since  1.6
 */
class UsersModelDebugUser extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   3.6.0
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'a.title',
				'component', 'a.name',
				'a.lft',
				'a.id',
				'level_start', 'level_end', 'a.level',
			);
		}

		parent::__construct($config);
	}

	/**
	 * Get a list of the actions.
	 *
	 * @return  array
	 *
	 * @since   1.6
	 */
	public function getDebugActions()
	{
		$component = $this->getState('filter.component');

		return UsersHelperDebug::getDebugActions($component);
	}

	/**
	 * Override getItems method.
	 *
	 * @return  array
	 *
	 * @since   1.6
	 */
	public function getItems()
	{
		$userId = $this->getState('user_id');
		$user   = JFactory::getUser($userId);

		if (($assets = parent::getItems()) && $userId)
		{
			$actions = $this->getDebugActions();

			foreach ($assets as &$asset)
			{
				$asset->checks = array();

				foreach ($actions as $action)
				{
					$name = $action[0];

					$asset->checks[$name] = $user->authorise($name, $asset->name);
				}
			}
		}

		return $assets;
	}

	/**
	 * 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.lft', $direction = 'asc')
	{
		$app = JFactory::getApplication('administrator');

		// Adjust the context to support modal layouts.
		$layout = $app->input->get('layout', 'default');

		if ($layout)
		{
			$this->context .= '.' . $layout;
		}

		// Load the filter state.
		$this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search', '', 'string'));
		$this->setState('user_id', $this->getUserStateFromRequest($this->context . '.user_id', 'user_id', 0, 'int', false));

		$levelStart = $this->getUserStateFromRequest($this->context . '.filter.level_start', 'filter_level_start', '', 'cmd');
		$this->setState('filter.level_start', $levelStart);

		$value = $this->getUserStateFromRequest($this->context . '.filter.level_end', 'filter_level_end', '', 'cmd');

		if ($value > 0 && $value < $levelStart)
		{
			$value = $levelStart;
		}

		$this->setState('filter.level_end', $value);

		$this->setState('filter.component', $this->getUserStateFromRequest($this->context . '.filter.component', 'filter_component', '', 'string'));

		// Load the parameters.
		$params = JComponentHelper::getParams('com_users');
		$this->setState('params', $params);

		// 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('user_id');
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.level_start');
		$id .= ':' . $this->getState('filter.level_end');
		$id .= ':' . $this->getState('filter.component');

		return parent::getStoreId($id);
	}

	/**
	 * Get the user being debugged.
	 *
	 * @return  JUser
	 *
	 * @since   1.6
	 */
	public function getUser()
	{
		$userId = $this->getState('user_id');

		return JFactory::getUser($userId);
	}

	/**
	 * 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(
			$this->getState(
				'list.select',
				'a.id, a.name, a.title, a.level, a.lft, a.rgt'
			)
		);
		$query->from($db->quoteName('#__assets', 'a'));

		// Filter the items over the search string if set.
		if ($this->getState('filter.search'))
		{
			// Escape the search token.
			$search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($this->getState('filter.search')), true) . '%'));

			// Compile the different search clauses.
			$searches = array();
			$searches[] = 'a.name LIKE ' . $search;
			$searches[] = 'a.title LIKE ' . $search;

			// Add the clauses to the query.
			$query->where('(' . implode(' OR ', $searches) . ')');
		}

		// Filter on the start and end levels.
		$levelStart = (int) $this->getState('filter.level_start');
		$levelEnd = (int) $this->getState('filter.level_end');

		if ($levelEnd > 0 && $levelEnd < $levelStart)
		{
			$levelEnd = $levelStart;
		}

		if ($levelStart > 0)
		{
			$query->where('a.level >= ' . $levelStart);
		}

		if ($levelEnd > 0)
		{
			$query->where('a.level <= ' . $levelEnd);
		}

		// Filter the items over the component if set.
		if ($this->getState('filter.component'))
		{
			$component = $this->getState('filter.component');
			$query->where('(a.name = ' . $db->quote($component) . ' OR a.name LIKE ' . $db->quote($component . '.%') . ')');
		}

		// Add the list ordering clause.
		$query->order($db->escape($this->getState('list.ordering', 'a.lft')) . ' ' . $db->escape($this->getState('list.direction', 'ASC')));

		return $query;
	}
}
components/com_users/models/group.php000060400000021014152453623460014064 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * User group model.
 *
 * @since  1.6
 */
class UsersModelGroup extends JModelAdmin
{
	/**
	 * Constructor
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 */
	public function __construct($config = array())
	{
		$config = array_merge(
			array(
				'event_after_delete'  => 'onUserAfterDeleteGroup',
				'event_after_save'    => 'onUserAfterSaveGroup',
				'event_before_delete' => 'onUserBeforeDeleteGroup',
				'event_before_save'   => 'onUserBeforeSaveGroup',
				'events_map'          => array('delete' => 'user', 'save' => 'user')
			), $config
		);

		parent::__construct($config);
	}

	/**
	 * 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 database object
	 *
	 * @since   1.6
	 */
	public function getTable($type = 'Usergroup', $prefix = 'JTable', $config = array())
	{
		$return = JTable::getInstance($type, $prefix, $config);

		return $return;
	}

	/**
	 * Method to get the record form.
	 *
	 * @param   array    $data      An optional array of data for the form to interrogate.
	 * @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.group', 'group', 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_users.edit.group.data', array());

		if (empty($data))
		{
			$data = $this->getItem();
		}

		$this->preprocessData('com_users.group', $data);

		return $data;
	}

	/**
	 * Override preprocessForm to load the user plugin group instead of content.
	 *
	 * @param   JForm   $form   A form 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 loading the form.
	 */
	protected function preprocessForm(JForm $form, $data, $group = '')
	{
		$obj = is_array($data) ? ArrayHelper::toObject($data, 'JObject') : $data;

		if (isset($obj->parent_id) && $obj->parent_id == 0 && $obj->id > 0)
		{
			$form->setFieldAttribute('parent_id', 'type', 'hidden');
			$form->setFieldAttribute('parent_id', 'hidden', 'true');
		}

		parent::preprocessForm($form, $data, 'user');
	}

	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success.
	 *
	 * @since   1.6
	 */
	public function save($data)
	{
		// Include the user plugins for events.
		JPluginHelper::importPlugin($this->events_map['save']);

		/**
		 * Check the super admin permissions for group
		 * We get the parent group permissions and then check the group permissions manually
		 * We have to calculate the group permissions manually because we haven't saved the group yet
		 */
		$parentSuperAdmin = JAccess::checkGroup($data['parent_id'], 'core.admin');

		// Get core.admin rules from the root asset
		$rules = JAccess::getAssetRules('root.1')->getData('core.admin');

		// Get the value for the current group (will be true (allowed), false (denied), or null (inherit)
		$groupSuperAdmin = $rules['core.admin']->allow($data['id']);

		// We only need to change the $groupSuperAdmin if the parent is true or false. Otherwise, the value set in the rule takes effect.
		if ($parentSuperAdmin === false)
		{
			// If parent is false (Denied), effective value will always be false
			$groupSuperAdmin = false;
		}
		elseif ($parentSuperAdmin === true)
		{
			// If parent is true (allowed), group is true unless explicitly set to false
			$groupSuperAdmin = ($groupSuperAdmin === false) ? false : true;
		}

		// Check for non-super admin trying to save with super admin group
		$iAmSuperAdmin = JFactory::getUser()->authorise('core.admin');

		if (!$iAmSuperAdmin && $groupSuperAdmin)
		{
			$this->setError(JText::_('JLIB_USER_ERROR_NOT_SUPERADMIN'));

			return false;
		}

		/**
		 * Check for super-admin changing self to be non-super-admin
		 * First, are we a super admin
		 */
		if ($iAmSuperAdmin)
		{
			// Next, are we a member of the current group?
			$myGroups = JAccess::getGroupsByUser(JFactory::getUser()->get('id'), false);

			if (in_array($data['id'], $myGroups))
			{
				// Now, would we have super admin permissions without the current group?
				$otherGroups = array_diff($myGroups, array($data['id']));
				$otherSuperAdmin = false;

				foreach ($otherGroups as $otherGroup)
				{
					$otherSuperAdmin = $otherSuperAdmin ?: JAccess::checkGroup($otherGroup, 'core.admin');
				}

				/**
				 * If we would not otherwise have super admin permissions
				 * and the current group does not have super admin permissions, throw an exception
				 */
				if ((!$otherSuperAdmin) && (!$groupSuperAdmin))
				{
					$this->setError(JText::_('JLIB_USER_ERROR_CANNOT_DEMOTE_SELF'));

					return false;
				}
			}
		}

		if (JFactory::getApplication()->input->get('task') == 'save2copy')
		{
			$data['title'] = $this->generateGroupTitle($data['parent_id'], $data['title']);
		}

		// Proceed with the save
		return parent::save($data);
	}

	/**
	 * Method to delete rows.
	 *
	 * @param   array  &$pks  An array of item ids.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   1.6
	 * @throws  Exception
	 */
	public function delete(&$pks)
	{
		// Typecast variable.
		$pks    = (array) $pks;
		$user   = JFactory::getUser();
		$groups = JAccess::getGroupsByUser($user->get('id'));

		// Get a row instance.
		$table = $this->getTable();

		// Load plugins.
		JPluginHelper::importPlugin($this->events_map['delete']);
		$dispatcher = JEventDispatcher::getInstance();

		// Check if I am a Super Admin
		$iAmSuperAdmin = $user->authorise('core.admin');

		foreach ($pks as $pk)
		{
			// Do not allow to delete groups to which the current user belongs
			if (in_array($pk, $groups))
			{
				JError::raiseWarning(403, JText::_('COM_USERS_DELETE_ERROR_INVALID_GROUP'));

				return false;
			}
			// Check if the item exists.
			elseif (!$table->load($pk))
			{
				$this->setError($table->getError());

				return false;
			}
		}

		// Iterate the items to delete each one.
		foreach ($pks as $i => $pk)
		{
			if ($table->load($pk))
			{
				// Access checks.
				$allow = $user->authorise('core.edit.state', 'com_users');

				// Don't allow non-super-admin to delete a super admin
				$allow = (!$iAmSuperAdmin && JAccess::checkGroup($pk, 'core.admin')) ? false : $allow;

				if ($allow)
				{
					// Fire the before delete event.
					$dispatcher->trigger($this->event_before_delete, array($table->getProperties()));

					if (!$table->delete($pk))
					{
						$this->setError($table->getError());

						return false;
					}
					else
					{
						// Trigger the after delete event.
						$dispatcher->trigger($this->event_after_delete, array($table->getProperties(), true, $this->getError()));
					}
				}
				else
				{
					// Prune items that you can't change.
					unset($pks[$i]);
					JError::raiseWarning(403, JText::_('JERROR_CORE_DELETE_NOT_PERMITTED'));
				}
			}
		}

		return true;
	}

	/**
	 * Method to generate the title of group on Save as Copy action
	 *
	 * @param   integer  $parentId  The id of the parent.
	 * @param   string   $title     The title of group
	 *
	 * @return  string  Contains the modified title.
	 *
	 * @since   3.3.7
	 */
	protected function generateGroupTitle($parentId, $title)
	{
		// Alter the title & alias
		$table = $this->getTable();

		while ($table->load(array('title' => $title, 'parent_id' => $parentId)))
		{
			if ($title == $table->title)
			{
				$title = StringHelper::increment($title);
			}
		}

		return $title;
	}
}
components/com_users/models/notes.php000060400000013433152453623460014066 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * User notes model class.
 *
 * @since  2.5
 */
class UsersModelNotes extends JModelList
{
	/**
	 * Class constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @since  2.5
	 */
	public function __construct($config = array())
	{
		// Set the list ordering fields.
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'user_id', 'a.user_id',
				'u.name',
				'subject', 'a.subject',
				'catid', 'a.catid', 'category_id',
				'state', 'a.state', 'published',
				'c.title',
				'review_time', 'a.review_time',
				'publish_up', 'a.publish_up',
				'publish_down', 'a.publish_down',
				'level', 'c.level',
			);
		}

		parent::__construct($config);
	}

	/**
	 * Build an SQL query to load the list data.
	 *
	 * @return  JDatabaseQuery  A JDatabaseQuery object to retrieve the data set.
	 *
	 * @since   2.5
	 */
	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, a.subject, a.checked_out, a.checked_out_time,' .
				'a.catid, a.created_time, a.review_time,' .
				'a.state, a.publish_up, a.publish_down'
			)
		);
		$query->from('#__user_notes AS a');

		// Join over the category
		$query->select('c.title AS category_title, c.params AS category_params')
			->join('LEFT', '#__categories AS c ON c.id = a.catid');

		// Join over the users for the note user.
		$query->select('u.name AS user_name')
			->join('LEFT', '#__users AS u ON u.id = a.user_id');

		// 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 search in title
		$search = $this->getState('filter.search');

		if (!empty($search))
		{
			if (stripos($search, 'id:') === 0)
			{
				$query->where('a.id = ' . (int) substr($search, 3));
			}
			elseif (stripos($search, 'uid:') === 0)
			{
				$query->where('a.user_id = ' . (int) substr($search, 4));
			}
			else
			{
				$search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%'));
				$query->where('((a.subject LIKE ' . $search . ') OR (u.name LIKE ' . $search . ') OR (u.username LIKE ' . $search . '))');
			}
		}

		// Filter by published state
		$published = $this->getState('filter.published');

		if (is_numeric($published))
		{
			$query->where('a.state = ' . (int) $published);
		}
		elseif ($published === '')
		{
			$query->where('(a.state IN (0, 1))');
		}

		// Filter by a single category.
		$categoryId = (int) $this->getState('filter.category_id');

		if ($categoryId)
		{
			$query->where('a.catid = ' . $categoryId);
		}

		// Filter by a single user.
		$userId = (int) $this->getState('filter.user_id');

		if ($userId)
		{
			// Add the body and where filter.
			$query->select('a.body')
				->where('a.user_id = ' . $userId);
		}

		// Filter on the level.
		if ($level = $this->getState('filter.level'))
		{
			$query->where($db->quoteName('c.level') . ' <= ' . (int) $level);
		}

		// Add the list ordering clause.
		$query->order($db->escape($this->getState('list.ordering', 'a.review_time')) . ' ' . $db->escape($this->getState('list.direction', 'DESC')));

		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   2.5
	 */
	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.user_id');
		$id .= ':' . $this->getState('filter.level');

		return parent::getStoreId($id);
	}

	/**
	 * Gets a user object if the user filter is set.
	 *
	 * @return  JUser  The JUser object
	 *
	 * @since   2.5
	 */
	public function getUser()
	{
		$user = new JUser;

		// Filter by search in title
		$search = (int) $this->getState('filter.user_id');

		if ($search != 0)
		{
			$user->load((int) $search);
		}

		return $user;
	}

	/**
	 * 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.review_time', $direction = 'desc')
	{
		// Adjust the context to support modal layouts.
		if ($layout = JFactory::getApplication()->input->get('layout'))
		{
			$this->context .= '.' . $layout;
		}

		$this->setState('filter.search', $this->getUserStateFromRequest($this->context . '.filter.search', 'filter_search'));
		$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'));
		$this->setState('filter.user_id', $this->getUserStateFromRequest($this->context . '.filter.user_id', 'filter_user_id'));
		$this->setState('filter.level', $this->getUserStateFromRequest($this->context . '.filter.level', 'filter_level', '', 'cmd'));

		parent::populateState($ordering, $direction);
	}
}
components/com_users/helpers/users.php000060400000015411152453623460014254 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Users component helper.
 *
 * @since  1.6
 */
class UsersHelper
{
	/**
	 * @var    JObject  A cache for the available actions.
	 * @since  1.6
	 */
	protected static $actions;

	/**
	 * Configure the Linkbar.
	 *
	 * @param   string  $vName  The name of the active view.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public static function addSubmenu($vName)
	{
		JHtmlSidebar::addEntry(
			JText::_('COM_USERS_SUBMENU_USERS'),
			'index.php?option=com_users&view=users',
			$vName == 'users'
		);

		// Groups and Levels are restricted to core.admin
		$canDo = JHelperContent::getActions('com_users');

		if ($canDo->get('core.admin'))
		{
			JHtmlSidebar::addEntry(
				JText::_('COM_USERS_SUBMENU_GROUPS'),
				'index.php?option=com_users&view=groups',
				$vName == 'groups'
			);
			JHtmlSidebar::addEntry(
				JText::_('COM_USERS_SUBMENU_LEVELS'),
				'index.php?option=com_users&view=levels',
				$vName == 'levels'
			);
		}

		if (JComponentHelper::isEnabled('com_fields') && JComponentHelper::getParams('com_users')->get('custom_fields_enable', '1'))
		{
			JHtmlSidebar::addEntry(
				JText::_('JGLOBAL_FIELDS'),
				'index.php?option=com_fields&context=com_users.user',
				$vName == 'fields.fields'
			);
			JHtmlSidebar::addEntry(
				JText::_('JGLOBAL_FIELD_GROUPS'),
				'index.php?option=com_fields&view=groups&context=com_users.user',
				$vName == 'fields.groups'
			);
		}

		JHtmlSidebar::addEntry(
			JText::_('COM_USERS_SUBMENU_NOTES'),
			'index.php?option=com_users&view=notes',
			$vName == 'notes'
		);

		JHtmlSidebar::addEntry(
			JText::_('COM_USERS_SUBMENU_NOTE_CATEGORIES'),
			'index.php?option=com_categories&extension=com_users',
			$vName == 'categories'
		);
	}

	/**
	 * Gets a list of the actions that can be performed.
	 *
	 * @return  JObject
	 *
	 * @deprecated  3.2  Use JHelperContent::getActions() instead
	 */
	public static function getActions()
	{
		// 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('com_users');
	}

	/**
	 * Get a list of filter options for the blocked state of a user.
	 *
	 * @return  array  An array of JHtmlOption elements.
	 *
	 * @since   1.6
	 */
	public static function getStateOptions()
	{
		// Build the filter options.
		$options = array();
		$options[] = JHtml::_('select.option', '0', JText::_('JENABLED'));
		$options[] = JHtml::_('select.option', '1', JText::_('JDISABLED'));

		return $options;
	}

	/**
	 * Get a list of filter options for the activated state of a user.
	 *
	 * @return  array  An array of JHtmlOption elements.
	 *
	 * @since   1.6
	 */
	public static function getActiveOptions()
	{
		// Build the filter options.
		$options = array();
		$options[] = JHtml::_('select.option', '0', JText::_('COM_USERS_ACTIVATED'));
		$options[] = JHtml::_('select.option', '1', JText::_('COM_USERS_UNACTIVATED'));

		return $options;
	}

	/**
	 * Get a list of the user groups for filtering.
	 *
	 * @return  array  An array of JHtmlOption elements.
	 *
	 * @since   1.6
	 */
	public static function getGroups()
	{
		$options = JHelperUsergroups::getInstance()->getAll();

		foreach ($options as &$option)
		{
			$option->value = $option->id;
			$option->text = str_repeat('- ', $option->level) . $option->title;
		}

		return $options;
	}

	/**
	 * Creates a list of range options used in filter select list
	 * used in com_users on users view
	 *
	 * @return  array
	 *
	 * @since   2.5
	 */
	public static function getRangeOptions()
	{
		$options = array(
			JHtml::_('select.option', 'today', JText::_('COM_USERS_OPTION_RANGE_TODAY')),
			JHtml::_('select.option', 'past_week', JText::_('COM_USERS_OPTION_RANGE_PAST_WEEK')),
			JHtml::_('select.option', 'past_1month', JText::_('COM_USERS_OPTION_RANGE_PAST_1MONTH')),
			JHtml::_('select.option', 'past_3month', JText::_('COM_USERS_OPTION_RANGE_PAST_3MONTH')),
			JHtml::_('select.option', 'past_6month', JText::_('COM_USERS_OPTION_RANGE_PAST_6MONTH')),
			JHtml::_('select.option', 'past_year', JText::_('COM_USERS_OPTION_RANGE_PAST_YEAR')),
			JHtml::_('select.option', 'post_year', JText::_('COM_USERS_OPTION_RANGE_POST_YEAR')),
		);

		return $options;
	}

	/**
	 * Creates a list of two factor authentication methods used in com_users
	 * on user view
	 *
	 * @return  array
	 *
	 * @since   3.2.0
	 */
	public static function getTwoFactorMethods()
	{
		FOFPlatform::getInstance()->importPlugin('twofactorauth');
		$identities = FOFPlatform::getInstance()->runPlugins('onUserTwofactorIdentify', array());

		$options = array(
			JHtml::_('select.option', 'none', JText::_('JGLOBAL_OTPMETHOD_NONE'), 'value', 'text'),
		);

		if (!empty($identities))
		{
			foreach ($identities as $identity)
			{
				if (!is_object($identity))
				{
					continue;
				}

				$options[] = JHtml::_('select.option', $identity->method, $identity->title, 'value', 'text');
			}
		}

		return $options;
	}

	/**
	 * Get a list of the User Groups for Viewing Access Levels
	 *
	 * @param   string  $rules  User Groups in JSON format
	 *
	 * @return  string  $groups  Comma separated list of User Groups
	 *
	 * @since   3.6
	 */
	public static function getVisibleByGroups($rules)
	{
		$rules = json_decode($rules);

		if (!$rules)
		{
			return false;
		}

		$rules = implode(',', $rules);

		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('a.title AS text')
			->from('#__usergroups as a')
			->where('a.id IN (' . $rules . ')');
		$db->setQuery($query);

		$groups = $db->loadColumn();
		$groups = implode(', ', $groups);

		return $groups;
	}

	/**
	 * Returns a valid section for users. If it is not valid then null
	 * is returned.
	 *
	 * @param   string  $section  The section to get the mapping for
	 *
	 * @return  string|null  The new section
	 *
	 * @since   3.7.0
	 */
	public static function validateSection($section)
	{
		if (JFactory::getApplication()->isClient('site'))
		{
			switch ($section)
			{
				case 'registration':
				case 'profile':
					$section = 'user';
			}
		}

		if ($section != 'user')
		{
			// 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_users', JPATH_ADMINISTRATOR);

		$contexts = array(
			'com_users.user' => JText::_('COM_USERS'),
		);

		return $contexts;
	}
}
components/com_users/helpers/html/users.php000060400000013701152453623460015220 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Extended Utility class for the Users component.
 *
 * @since  2.5
 */
class JHtmlUsers
{
	/**
	 * Display an image.
	 *
	 * @param   string  $src  The source of the image
	 *
	 * @return  string  A <img> element if the specified file exists, otherwise, a null string
	 *
	 * @since   2.5
	 */
	public static function image($src)
	{
		$src = preg_replace('#[^A-Z0-9\-_\./]#i', '', $src);
		$file = JPATH_SITE . '/' . $src;

		jimport('joomla.filesystem.path');
		JPath::check($file);

		if (!file_exists($file))
		{
			return '';
		}

		return '<img src="' . JUri::root() . $src . '" alt="" />';
	}

	/**
	 * Displays an icon to add a note for this user.
	 *
	 * @param   integer  $userId  The user ID
	 *
	 * @return  string  A link to add a note
	 *
	 * @since   2.5
	 */
	public static function addNote($userId)
	{
		$title = JText::_('COM_USERS_ADD_NOTE');

		return '<a href="' . JRoute::_('index.php?option=com_users&task=note.add&u_id=' . (int) $userId) . '" class="hasTooltip btn btn-mini" title="'
			. $title . '"><span class="icon-vcard" aria-hidden="true"></span><span class="hidden-phone">' . $title . '</span></a>';
	}

	/**
	 * Displays an icon to filter the notes list on this user.
	 *
	 * @param   integer  $count   The number of notes for the user
	 * @param   integer  $userId  The user ID
	 *
	 * @return  string  A link to apply a filter
	 *
	 * @since   2.5
	 */
	public static function filterNotes($count, $userId)
	{
		if (empty($count))
		{
			return '';
		}

		$title = JText::_('COM_USERS_FILTER_NOTES');

		return '<a href="' . JRoute::_('index.php?option=com_users&view=notes&filter[search]=uid:' . (int) $userId)
			. '" class="hasTooltip btn btn-mini" title="' . $title . '"><span class="icon-filter"></span></a>';
	}

	/**
	 * Displays a note icon.
	 *
	 * @param   integer  $count   The number of notes for the user
	 * @param   integer  $userId  The user ID
	 *
	 * @return  string  A link to a modal window with the user notes
	 *
	 * @since   2.5
	 */
	public static function notes($count, $userId)
	{
		if (empty($count))
		{
			return '';
		}

		$title = JText::plural('COM_USERS_N_USER_NOTES', $count);

		return '<button type="button" data-target="#userModal_' . (int) $userId . '" id="modal-' . (int) $userId . '" data-toggle="modal"'
			. ' class="hasTooltip btn btn-mini" title="' . $title . '">'
			. '<span class="icon-drawer-2" aria-hidden="true"></span><span class="hidden-phone">' . $title . '</span></button>';
	}

	/**
	 * Renders the modal html.
	 *
	 * @param   integer  $count   The number of notes for the user
	 * @param   integer  $userId  The user ID
	 *
	 * @return  string   The html for the rendered modal
	 *
	 * @since   3.4.1
	 */
	public static function notesModal($count, $userId)
	{
		if (empty($count))
		{
			return '';
		}

		$title = JText::plural('COM_USERS_N_USER_NOTES', $count);
		$footer = '<button type="button" class="btn" data-dismiss="modal">'
			. JText::_('JTOOLBAR_CLOSE') . '</button>';

		return JHtml::_(
			'bootstrap.renderModal',
			'userModal_' . (int) $userId,
			array(
				'title'       => $title,
				'backdrop'    => 'static',
				'keyboard'    => true,
				'closeButton' => true,
				'footer'      => $footer,
				'url'         => JRoute::_('index.php?option=com_users&view=notes&tmpl=component&layout=modal&filter[user_id]=' . (int) $userId),
				'height'      => '300px',
				'width'       => '800px',
			)
		);

	}

	/**
	 * Build an array of block/unblock user states to be used by jgrid.state,
	 * State options will be different for any user
	 * and for currently logged in user
	 *
	 * @param   boolean  $self  True if state array is for currently logged in user
	 *
	 * @return  array  a list of possible states to display
	 *
	 * @since  3.0
	 */
	public static function blockStates( $self = false)
	{
		if ($self)
		{
			$states = array(
				1 => array(
					'task'           => 'unblock',
					'text'           => '',
					'active_title'   => 'COM_USERS_USER_FIELD_BLOCK_DESC',
					'inactive_title' => '',
					'tip'            => true,
					'active_class'   => 'unpublish',
					'inactive_class' => 'unpublish',
				),
				0 => array(
					'task'           => 'block',
					'text'           => '',
					'active_title'   => '',
					'inactive_title' => 'COM_USERS_USERS_ERROR_CANNOT_BLOCK_SELF',
					'tip'            => true,
					'active_class'   => 'publish',
					'inactive_class' => 'publish',
				)
			);
		}
		else
		{
			$states = array(
				1 => array(
					'task'           => 'unblock',
					'text'           => '',
					'active_title'   => 'COM_USERS_TOOLBAR_UNBLOCK',
					'inactive_title' => '',
					'tip'            => true,
					'active_class'   => 'unpublish',
					'inactive_class' => 'unpublish',
				),
				0 => array(
					'task'           => 'block',
					'text'           => '',
					'active_title'   => 'COM_USERS_USER_FIELD_BLOCK_DESC',
					'inactive_title' => '',
					'tip'            => true,
					'active_class'   => 'publish',
					'inactive_class' => 'publish',
				)
			);
		}

		return $states;
	}

	/**
	 * Build an array of activate states to be used by jgrid.state,
	 *
	 * @return  array  a list of possible states to display
	 *
	 * @since  3.0
	 */
	public static function activateStates()
	{
		$states = array(
			1 => array(
				'task'           => 'activate',
				'text'           => '',
				'active_title'   => 'COM_USERS_TOOLBAR_ACTIVATE',
				'inactive_title' => '',
				'tip'            => true,
				'active_class'   => 'unpublish',
				'inactive_class' => 'unpublish',
			),
			0 => array(
				'task'           => '',
				'text'           => '',
				'active_title'   => '',
				'inactive_title' => 'COM_USERS_ACTIVATED',
				'tip'            => true,
				'active_class'   => 'publish',
				'inactive_class' => 'publish',
			)
		);

		return $states;
	}
}
components/com_users/helpers/debug.php000060400000007513152453623460014205 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Users component debugging helper.
 *
 * @since  1.6
 */
class UsersHelperDebug
{
	/**
	 * Get a list of the components.
	 *
	 * @return  array
	 *
	 * @since   1.6
	 */
	public static function getComponents()
	{
		// Initialise variable.
		$db = JFactory::getDbo();
		$query = $db->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 (count($items))
		{
			$lang = JFactory::getLanguage();

			foreach ($items as &$item)
			{
				// Load language
				$extension = $item->value;
				$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);
			}

			// Sort by component name
			$items = ArrayHelper::sortObjects($items, 'text', 1, true, true);
		}

		return $items;
	}

	/**
	 * Get a list of the actions for the component or code actions.
	 *
	 * @param   string  $component  The name of the component.
	 *
	 * @return  array
	 *
	 * @since   1.6
	 */
	public static function getDebugActions($component = null)
	{
		$actions = array();

		// Try to get actions for the component
		if (!empty($component))
		{
			$component_actions = JAccess::getActions($component);

			if (!empty($component_actions))
			{
				foreach ($component_actions as &$action)
				{
					$actions[$action->title] = array($action->name, $action->description);
				}
			}
		}

		// Use default actions from configuration if no component selected or component doesn't have actions
		if (empty($actions))
		{
			$filename = JPATH_ADMINISTRATOR . '/components/com_config/model/form/application.xml';

			if (is_file($filename))
			{
				$xml = simplexml_load_file($filename);

				foreach ($xml->children()->fieldset as $fieldset)
				{
					if ('permissions' == (string) $fieldset['name'])
					{
						foreach ($fieldset->children() as $field)
						{
							if ('rules' == (string) $field['name'])
							{
								foreach ($field->children() as $action)
								{
									$actions[(string) $action['title']] = array(
										(string) $action['name'],
										(string) $action['description']
									);
								}

								break;
							}
						}
					}
				}

				// Load language
				$lang = JFactory::getLanguage();
				$extension = 'com_config';
				$source = JPATH_ADMINISTRATOR . '/components/' . $extension;

				$lang->load($extension, JPATH_ADMINISTRATOR, null, false, false)
					|| $lang->load($extension, $source, null, false, false)
					|| $lang->load($extension, JPATH_ADMINISTRATOR, $lang->getDefault(), false, false)
					|| $lang->load($extension, $source, $lang->getDefault(), false, false);
			}
		}

		return $actions;
	}

	/**
	 * Get a list of filter options for the levels.
	 *
	 * @return  array  An array of JHtmlOption elements.
	 */
	public static function getLevelsOptions()
	{
		// Build the filter options.
		$options = array();
		$options[] = JHtml::_('select.option', '1', JText::sprintf('COM_USERS_OPTION_LEVEL_COMPONENT', 1));
		$options[] = JHtml::_('select.option', '2', JText::sprintf('COM_USERS_OPTION_LEVEL_CATEGORY', 2));
		$options[] = JHtml::_('select.option', '3', JText::sprintf('COM_USERS_OPTION_LEVEL_DEEPER', 3));
		$options[] = JHtml::_('select.option', '4', '4');
		$options[] = JHtml::_('select.option', '5', '5');
		$options[] = JHtml::_('select.option', '6', '6');

		return $options;
	}
}
components/com_users/users.xml000060400000002476152453623460012632 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1" method="upgrade">
	<name>com_users</name>
	<author>Joomla! Project</author>
	<creationDate>April 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>COM_USERS_XML_DESCRIPTION</description>

	<files folder="site">
		<filename>controller.php</filename>
		<filename>router.php</filename>
		<filename>users.php</filename>
		<folder>controllers</folder>
		<folder>helpers</folder>
		<folder>models</folder>
		<folder>views</folder>
	</files>
	<languages folder="site">
		<language tag="en-GB">language/en-GB.com_users.ini</language>
	</languages>
	<administration>
		<files folder="admin">
			<filename>config.xml</filename>
			<filename>controller.php</filename>
			<filename>users.php</filename>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>models</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_users.ini</language>
			<language tag="en-GB">language/en-GB.com_users.sys.ini</language>
		</languages>
	</administration>
</extension>
components/com_users/users.php000060400000001223152453623460012606 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
JHtml::_('behavior.tabstate');

if (!JFactory::getUser()->authorise('core.manage', 'com_users'))
{
	throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
}

JLoader::register('UsersHelper', __DIR__ . '/helpers/users.php');

$controller = JControllerLegacy::getInstance('Users');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
components/com_users/access.xml000060400000005200152453623460012716 0ustar00<?xml version="1.0" encoding="utf-8" ?>
<access component="com_users">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.options" title="JACTION_OPTIONS" description="JACTION_OPTIONS_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="JACTION_EDITSTATE_COMPONENT_DESC" />
		<action name="core.edit.value" title="JACTION_EDITVALUE" description="JACTION_EDITVALUE_COMPONENT_DESC" />
	</section>
	<section name="category">
		<action name="core.create" title="JACTION_CREATE" description="COM_CATEGORIES_ACCESS_CREATE_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="COM_CATEGORIES_ACCESS_DELETE_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="COM_CATEGORIES_ACCESS_EDIT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_CATEGORIES_ACCESS_EDITSTATE_DESC" />
		<action name="core.edit.own" title="JACTION_EDITOWN" description="COM_CATEGORIES_ACCESS_EDITOWN_DESC" />
	</section>
	<section name="fieldgroup">
		<action name="core.create" title="JACTION_CREATE" description="COM_FIELDS_GROUP_PERMISSION_CREATE_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="COM_FIELDS_GROUP_PERMISSION_DELETE_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="COM_FIELDS_GROUP_PERMISSION_EDIT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_FIELDS_GROUP_PERMISSION_EDITSTATE_DESC" />
		<action name="core.edit.own" title="JACTION_EDITOWN" description="COM_FIELDS_GROUP_PERMISSION_EDITOWN_DESC" />
		<action name="core.edit.value" title="JACTION_EDITVALUE" description="COM_FIELDS_GROUP_PERMISSION_EDITVALUE_DESC" />
	</section>
	<section name="field">
		<action name="core.delete" title="JACTION_DELETE" description="COM_FIELDS_FIELD_PERMISSION_DELETE_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="COM_FIELDS_FIELD_PERMISSION_EDIT_DESC" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_FIELDS_FIELD_PERMISSION_EDITSTATE_DESC" />
		<action name="core.edit.value" title="JACTION_EDITVALUE" description="COM_FIELDS_FIELD_PERMISSION_EDITVALUE_DESC" />
	</section>
</access>
components/com_users/config.xml000060400000020120152453623460012720 0ustar00<?xml version="1.0" encoding="utf-8"?>
<config>
	<fieldset 
		name="user_options"
		label="COM_USERS_CONFIG_USER_OPTIONS" >
		<field
			name="allowUserRegistration"
			type="radio"
			label="COM_USERS_CONFIG_FIELD_ALLOWREGISTRATION_LABEL"
			description="COM_USERS_CONFIG_FIELD_ALLOWREGISTRATION_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="new_usertype"
			type="usergrouplist"
			label="COM_USERS_CONFIG_FIELD_NEW_USER_TYPE_LABEL"
			description="COM_USERS_CONFIG_FIELD_NEW_USER_TYPE_DESC"
			default="2"
			checksuperusergroup="1"
		/>

		<field
			name="guest_usergroup"
			type="usergrouplist"
			label="COM_USERS_CONFIG_FIELD_GUEST_USER_GROUP_LABEL"
			description="COM_USERS_CONFIG_FIELD_GUEST_USER_GROUP_DESC"
			default="1"
			checksuperusergroup="1"
		/>

		<field
			name="sendpassword"
			type="radio"
			label="COM_USERS_CONFIG_FIELD_SENDPASSWORD_LABEL"
			description="COM_USERS_CONFIG_FIELD_SENDPASSWORD_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="useractivation"
			type="list"
			label="COM_USERS_CONFIG_FIELD_USERACTIVATION_LABEL"
			description="COM_USERS_CONFIG_FIELD_USERACTIVATION_DESC"
			default="2"
			>
			<option value="0">JNONE</option>
			<option value="1">COM_USERS_CONFIG_FIELD_USERACTIVATION_OPTION_SELFACTIVATION</option>
			<option value="2">COM_USERS_CONFIG_FIELD_USERACTIVATION_OPTION_ADMINACTIVATION</option>
		</field>

		<field
			name="mail_to_admin"
			type="radio"
			label="COM_USERS_CONFIG_FIELD_MAILTOADMIN_LABEL"
			description="COM_USERS_CONFIG_FIELD_MAILTOADMIN_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="captcha"
			type="plugins"
			label="COM_USERS_CONFIG_FIELD_CAPTCHA_LABEL"
			description="COM_USERS_CONFIG_FIELD_CAPTCHA_DESC"
			folder="captcha"
			filter="cmd"
			useglobal="true"
			>
			<option value="0">JOPTION_DO_NOT_USE</option>
		</field>

		<field
			name="frontend_userparams"
			type="radio"
			label="COM_USERS_CONFIG_FIELD_FRONTEND_USERPARAMS_LABEL"
			description="COM_USERS_CONFIG_FIELD_FRONTEND_USERPARAMS_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="site_language"
			type="radio"
			label="COM_USERS_CONFIG_FIELD_FRONTEND_LANG_LABEL"
			description="COM_USERS_CONFIG_FIELD_FRONTEND_LANG_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			showon="frontend_userparams:1"
			>
			<option value="1">JSHOW</option>
			<option value="0">JHIDE</option>
		</field>

		<field
			name="change_login_name"
			type="radio"
			label="COM_USERS_CONFIG_FIELD_CHANGEUSERNAME_LABEL"
			description="COM_USERS_CONFIG_FIELD_CHANGEUSERNAME_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

	</fieldset>

	<fieldset
		name="domain_options"
		label="COM_USERS_CONFIG_DOMAIN_OPTIONS"
		>

		<field
			name="domains"
			type="subform"
			label="COM_USERS_CONFIG_FIELD_DOMAINS_LABEL"
			description="COM_USERS_CONFIG_FIELD_DOMAINS_DESC"
			multiple="true"
			layout="joomla.form.field.subform.repeatable-table"
			formsource="administrator/components/com_users/models/forms/config_domain.xml"
		/>
	</fieldset>

	<fieldset
		name="password_options"
		label="COM_USERS_CONFIG_PASSWORD_OPTIONS" >
		<field
			name="reset_count"
			type="integer"
			label="COM_USERS_CONFIG_FIELD_FRONTEND_RESET_COUNT_LABEL"
			description="COM_USERS_CONFIG_FIELD_FRONTEND_RESET_COUNT_DESC"
			first="0"
			last="20"
			step="1"
			default="10"
		/>

		<field
			name="reset_time"
			type="integer"
			label="COM_USERS_CONFIG_FIELD_FRONTEND_RESET_TIME_LABEL"
			description="COM_USERS_CONFIG_FIELD_FRONTEND_RESET_TIME_DESC"
			first="1"
			last="24"
			step="1"
			default="1"
		/>

		<field
			name="minimum_length"
			type="integer"
			label="COM_USERS_CONFIG_FIELD_MINIMUM_PASSWORD_LENGTH"
			description="COM_USERS_CONFIG_FIELD_MINIMUM_PASSWORD_LENGTH_DESC"
			first="4"
			last="99"
			step="1"
			default="4"
		/>

		<field
			name="minimum_integers"
			type="integer"
			label="COM_USERS_CONFIG_FIELD_MINIMUM_INTEGERS"
			description="COM_USERS_CONFIG_FIELD_MINIMUM_INTEGERS_DESC"
			first="0"
			last="98"
			step="1"
			default="0"
		/>

		<field
			name="minimum_symbols"
			type="integer"
			label="COM_USERS_CONFIG_FIELD_MINIMUM_SYMBOLS"
			description="COM_USERS_CONFIG_FIELD_MINIMUM_SYMBOLS_DESC"
			first="0"
			last="98"
			step="1"
			default="0"
		/>

		<field
			name="minimum_uppercase"
			type="integer"
			label="COM_USERS_CONFIG_FIELD_MINIMUM_UPPERCASE"
			description="COM_USERS_CONFIG_FIELD_MINIMUM_UPPERCASE_DESC"
			first="0"
			last="98"
			step="1"
			default="0"
		/>

		<field
			name="minimum_lowercase"
			type="integer"
			label="COM_USERS_CONFIG_FIELD_MINIMUM_LOWERCASE"
			description="COM_USERS_CONFIG_FIELD_MINIMUM_LOWERCASE_DESC"
			first="0"
			last="98"
			step="1"
			default="0"
		/>

	</fieldset>

	<fieldset
		name="user_notes_history"
		label="COM_USERS_CONFIG_FIELD_NOTES_HISTORY" >

		<field
			name="save_history"
			type="radio"
			label="JGLOBAL_SAVE_HISTORY_OPTIONS_LABEL"
			description="JGLOBAL_SAVE_HISTORY_OPTIONS_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="history_limit"
			type="number"
			label="JGLOBAL_HISTORY_LIMIT_OPTIONS_LABEL"
			description="JGLOBAL_HISTORY_LIMIT_OPTIONS_DESC"
			filter="integer"
			default="5"
			showon="save_history:1"
		/>

	</fieldset>

 	<fieldset
		name="massmail"
		label="COM_USERS_MASS_MAIL"
		description="COM_USERS_MASS_MAIL_DESC">

		<field
 			name="mailSubjectPrefix"
 			type="text"
			label="COM_USERS_CONFIG_FIELD_SUBJECT_PREFIX_LABEL"
			description="COM_USERS_CONFIG_FIELD_SUBJECT_PREFIX_DESC"
		/>

 		<field
 			name="mailBodySuffix"
			type="textarea"
			label="COM_USERS_CONFIG_FIELD_MAILBODY_SUFFIX_LABEL"
			description="COM_USERS_CONFIG_FIELD_MAILBODY_SUFFIX_DESC"
 			rows="5"
 			cols="30"
		/>

	</fieldset>

	<fieldset
		name="debug"
		label="COM_USERS_DEBUG_LABEL"
		description="COM_USERS_DEBUG_DESC">

		<field
			name="debugUsers"
			type="radio"
			label="COM_USERS_DEBUG_USERS_LABEL"
			description="COM_USERS_DEBUG_USERS_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="debugGroups"
			type="radio"
			label="COM_USERS_DEBUG_GROUPS_LABEL"
			description="COM_USERS_DEBUG_GROUPS_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

	</fieldset>

	<fieldset name="integration"
		label="JGLOBAL_INTEGRATION_LABEL"
		description="COM_USERS_CONFIG_INTEGRATION_SETTINGS_DESC"
	>

		<field
			name="integration_sef"
			type="note"
			label="JGLOBAL_SEF_TITLE"
		/>

		<field
			name="sef_advanced"
			type="radio"
			class="btn-group btn-group-yesno btn-group-reversed"
			default="0"
			label="JGLOBAL_SEF_ADVANCED_LABEL"
			description="JGLOBAL_SEF_ADVANCED_DESC"
			filter="integer"
			>
			<option value="0">JGLOBAL_SEF_ADVANCED_LEGACY</option>
			<option value="1">JGLOBAL_SEF_ADVANCED_MODERN</option>
		</field>

		<field
			name="integration_customfields"
			type="note"
			label="JGLOBAL_FIELDS_TITLE"
		/>

		<field
			name="custom_fields_enable"
			type="radio"
			label="JGLOBAL_CUSTOM_FIELDS_ENABLE_LABEL"
			description="JGLOBAL_CUSTOM_FIELDS_ENABLE_DESC"
			class="btn-group btn-group-yesno"
			default="1"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

	</fieldset>

	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
		>

		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			filter="rules"
			validate="rules"
			component="com_users"
			section="component"
		/>

	</fieldset>
</config>
components/com_users/controllers/level.php000060400000006065152453623460015133 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * User view level controller class.
 *
 * @since  1.6
 */
class UsersControllerLevel extends JControllerForm
{
	/**
	 * @var     string  The prefix to use with controller messages.
	 * @since   1.6
	 */
	protected $text_prefix = 'COM_USERS_LEVEL';

	/**
	 * Method to check if you can save a new or existing record.
	 *
	 * Overrides JControllerForm::allowSave to check the core.admin permission.
	 *
	 * @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 allowSave($data, $key = 'id')
	{
		return (JFactory::getUser()->authorise('core.admin', $this->option) && parent::allowSave($data, $key));
	}

	/**
	 * Overrides JControllerForm::allowEdit
	 *
	 * Checks that non-Super Admins are not editing Super Admins.
	 *
	 * @param   array   $data  An array of input data.
	 * @param   string  $key   The name of the key for the primary key.
	 *
	 * @return  boolean
	 *
	 * @since   3.8.8
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// Get user instance
		$user = JFactory::getUser();

		// Check for if Super Admin can edit
		$db = JFactory::getDbo();
		$query = $db->getQuery(true)
			->select('*')
			->from($db->quoteName('#__viewlevels'))
			->where($db->quoteName('id') . ' = ' . (int) $data['id']);
		$db->setQuery($query);

		$viewlevel = $db->loadAssoc();

		// Decode level groups
		$groups = json_decode($viewlevel['rules']);

		// If this group is super admin and this user is not super admin, canEdit is false
		if (!$user->authorise('core.admin') && JAccess::checkGroup($groups[0], 'core.admin'))
		{
			$this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_EDIT_NOT_PERMITTED'));

			return false;
		}

		return parent::allowEdit($data, $key);
	}

	/**
	 * Removes an item.
	 *
	 * Overrides JControllerAdmin::delete to check the core.admin permission.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function delete()
	{
		// Check for request forgeries.
		$this->checkToken();

		$ids = (array) $this->input->get('cid', array(), 'int');

		// Remove zero values resulting from input filter
		$ids = array_filter($ids);

		if (!JFactory::getUser()->authorise('core.admin', $this->option))
		{
			JError::raiseError(500, JText::_('JERROR_ALERTNOAUTHOR'));
			jexit();
		}
		elseif (empty($ids))
		{
			JError::raiseWarning(500, JText::_('COM_USERS_NO_LEVELS_SELECTED'));
		}
		else
		{
			// Get the model.
			$model = $this->getModel();

			// Remove the items.
			if (!$model->delete($ids))
			{
				JError::raiseWarning(500, $model->getError());
			}
			else
			{
				$this->setMessage(JText::plural('COM_USERS_N_LEVELS_DELETED', count($ids)));
			}
		}

		$this->setRedirect('index.php?option=com_users&view=levels');
	}
}
components/com_users/controllers/user.php000060400000003746152453623460015005 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * User controller class.
 *
 * @since  1.6
 */
class UsersControllerUser extends JControllerForm
{
	/**
	 * @var    string  The prefix to use with controller messages.
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_USERS_USER';

	/**
	 * Overrides JControllerForm::allowEdit
	 *
	 * Checks that non-Super Admins are not editing Super Admins.
	 *
	 * @param   array   $data  An array of input data.
	 * @param   string  $key   The name of the key for the primary key.
	 *
	 * @return  boolean  True if allowed, false otherwise.
	 *
	 * @since   1.6
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		// Check if this person is a Super Admin
		if (JAccess::check($data[$key], 'core.admin'))
		{
			// If I'm not a Super Admin, then disallow the edit.
			if (!JFactory::getUser()->authorise('core.admin'))
			{
				return false;
			}
		}

		return parent::allowEdit($data, $key);
	}

	/**
	 * Method to run batch operations.
	 *
	 * @param   object  $model  The model.
	 *
	 * @return  boolean  True on success, false on failure
	 *
	 * @since   2.5
	 */
	public function batch($model = null)
	{
		$this->checkToken();

		// Set the model
		$model = $this->getModel('User', '', array());

		// Preset the redirect
		$this->setRedirect(JRoute::_('index.php?option=com_users&view=users' . $this->getRedirectToListAppend(), false));

		return parent::batch($model);
	}

	/**
	 * 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())
	{
		return;
	}
}
components/com_users/controllers/mail.php000060400000002407152453623460014742 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Users mail controller.
 *
 * @since  1.6
 */
class UsersControllerMail extends JControllerLegacy
{
	/**
	 * Send the mail
	 *
	 * @return void
	 *
	 * @since 1.6
	 */
	public function send()
	{
		// Redirect to admin index if mass mailer disabled in conf
		if (JFactory::getApplication()->get('massmailoff', 0) == 1)
		{
			JFactory::getApplication()->redirect(JRoute::_('index.php', false));
		}

		// Check for request forgeries.
		$this->checkToken('request');

		$model = $this->getModel('Mail');

		if ($model->send())
		{
			$type = 'message';
		}
		else
		{
			$type = 'error';
		}

		$msg = $model->getError();
		$this->setRedirect('index.php?option=com_users&view=mail', $msg, $type);
	}

	/**
	 * Cancel the mail
	 *
	 * @return void
	 *
	 * @since 1.6
	 */
	public function cancel()
	{
		// Check for request forgeries.
		$this->checkToken('request');

		// Clear data from session.
		\JFactory::getApplication()->setUserState('com_users.display.mail.data', null);

		$this->setRedirect('index.php');
	}
}
components/com_users/controllers/users.php000060400000006247152453623460015167 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

/**
 * Users list controller class.
 *
 * @since  1.6
 */
class UsersControllerUsers extends JControllerAdmin
{
	/**
	 * @var    string  The prefix to use with controller messages.
	 * @since  1.6
	 */
	protected $text_prefix = 'COM_USERS_USERS';

	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @since   1.6
	 * @see     JController
	 */
	public function __construct($config = array())
	{
		parent::__construct($config);

		$this->registerTask('block', 'changeBlock');
		$this->registerTask('unblock', 'changeBlock');
	}

	/**
	 * Proxy for getModel.
	 *
	 * @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.6
	 */
	public function getModel($name = 'User', $prefix = 'UsersModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}

	/**
	 * Method to change the block status on a record.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function changeBlock()
	{
		// Check for request forgeries.
		$this->checkToken();

		$ids    = (array) $this->input->get('cid', array(), 'int');
		$values = array('block' => 1, 'unblock' => 0);
		$task   = $this->getTask();
		$value  = ArrayHelper::getValue($values, $task, 0, 'int');

		// Remove zero values resulting from input filter
		$ids = array_filter($ids);

		if (empty($ids))
		{
			JError::raiseWarning(500, JText::_('COM_USERS_USERS_NO_ITEM_SELECTED'));
		}
		else
		{
			// Get the model.
			$model = $this->getModel();

			// Change the state of the records.
			if (!$model->block($ids, $value))
			{
				JError::raiseWarning(500, $model->getError());
			}
			else
			{
				if ($value == 1)
				{
					$this->setMessage(JText::plural('COM_USERS_N_USERS_BLOCKED', count($ids)));
				}
				elseif ($value == 0)
				{
					$this->setMessage(JText::plural('COM_USERS_N_USERS_UNBLOCKED', count($ids)));
				}
			}
		}

		$this->setRedirect('index.php?option=com_users&view=users');
	}

	/**
	 * Method to activate a record.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function activate()
	{
		// Check for request forgeries.
		$this->checkToken();

		$ids = (array) $this->input->get('cid', array(), 'int');

		// Remove zero values resulting from input filter
		$ids = array_filter($ids);

		if (empty($ids))
		{
			JError::raiseWarning(500, JText::_('COM_USERS_USERS_NO_ITEM_SELECTED'));
		}
		else
		{
			// Get the model.
			$model = $this->getModel();

			// Change the state of the records.
			if (!$model->activate($ids))
			{
				JError::raiseWarning(500, $model->getError());
			}
			else
			{
				$this->setMessage(JText::plural('COM_USERS_N_USERS_ACTIVATED', count($ids)));
			}
		}

		$this->setRedirect('index.php?option=com_users&view=users');
	}
}
components/com_users/controllers/levels.php000060400000001720152453623460015307 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * User view levels list controller class.
 *
 * @since  1.6
 */
class UsersControllerLevels extends JControllerAdmin
{
	/**
	 * @var     string  The prefix to use with controller messages.
	 * @since   1.6
	 */
	protected $text_prefix = 'COM_USERS_LEVELS';

	/**
	 * Proxy for getModel.
	 *
	 * @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.6
	 */
	public function getModel($name = 'Level', $prefix = 'UsersModel', $config = array())
	{
		return parent::getModel($name, $prefix, array('ignore_request' => true));
	}
}
components/com_users/controllers/notes.php000060400000001751152453623460015151 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * User notes controller class.
 *
 * @since  2.5
 */
class UsersControllerNotes extends JControllerAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $text_prefix = 'COM_USERS_NOTES';

	/**
	 * 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   2.5
	 */
	public function getModel($name = 'Note', $prefix = 'UsersModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}
}
components/com_users/controllers/group.php000060400000003155152453623460015155 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * User view level controller class.
 *
 * @since  1.6
 */
class UsersControllerGroup extends JControllerForm
{
	/**
	 * @var	    string  The prefix to use with controller messages.
	 * @since   1.6
	 */
	protected $text_prefix = 'COM_USERS_GROUP';

	/**
	 * Method to check if you can save a new or existing record.
	 *
	 * Overrides JControllerForm::allowSave to check the core.admin permission.
	 *
	 * @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 allowSave($data, $key = 'id')
	{
		return (JFactory::getUser()->authorise('core.admin', $this->option) && parent::allowSave($data, $key));
	}

	/**
	 * Overrides JControllerForm::allowEdit
	 *
	 * Checks that non-Super Admins are not editing Super Admins.
	 *
	 * @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')
	{
		// Check if this group is a Super Admin
		if (JAccess::checkGroup($data[$key], 'core.admin'))
		{
			// If I'm not a Super Admin, then disallow the edit.
			if (!JFactory::getUser()->authorise('core.admin'))
			{
				return false;
			}
		}

		return parent::allowEdit($data, $key);
	}
}
components/com_users/controllers/groups.php000060400000005712152453623460015341 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * User groups list controller class.
 *
 * @since  1.6
 */
class UsersControllerGroups extends JControllerAdmin
{
	/**
	 * @var     string  The prefix to use with controller messages.
	 * @since   1.6
	 */
	protected $text_prefix = 'COM_USERS_GROUPS';

	/**
	 * Proxy for getModel.
	 *
	 * @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.6
	 */
	public function getModel($name = 'Group', $prefix = 'UsersModel', $config = array())
	{
		return parent::getModel($name, $prefix, array('ignore_request' => true));
	}

	/**
	 * Removes an item.
	 *
	 * Overrides JControllerAdmin::delete to check the core.admin permission.
	 *
	 * @return  boolean  Returns true on success, false on failure.
	 *
	 * @since   1.6
	 */
	public function delete()
	{
		if (!JFactory::getUser()->authorise('core.admin', $this->option))
		{
			JError::raiseError(500, JText::_('JERROR_ALERTNOAUTHOR'));
			jexit();
		}

		return parent::delete();
	}

	/**
	 * Method to publish a list of records.
	 *
	 * Overrides JControllerAdmin::publish to check the core.admin permission.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	public function publish()
	{
		if (!JFactory::getUser()->authorise('core.admin', $this->option))
		{
			JError::raiseError(500, JText::_('JERROR_ALERTNOAUTHOR'));
			jexit();
		}

		return parent::publish();
	}

	/**
	 * Changes the order of one or more records.
	 *
	 * Overrides JControllerAdmin::reorder to check the core.admin permission.
	 *
	 * @return  boolean  True on success
	 *
	 * @since   1.6
	 */
	public function reorder()
	{
		if (!JFactory::getUser()->authorise('core.admin', $this->option))
		{
			JError::raiseError(500, JText::_('JERROR_ALERTNOAUTHOR'));
			jexit();
		}

		return parent::reorder();
	}

	/**
	 * Method to save the submitted ordering values for records.
	 *
	 * Overrides JControllerAdmin::saveorder to check the core.admin permission.
	 *
	 * @return  boolean  True on success
	 *
	 * @since   1.6
	 */
	public function saveorder()
	{
		if (!JFactory::getUser()->authorise('core.admin', $this->option))
		{
			JError::raiseError(500, JText::_('JERROR_ALERTNOAUTHOR'));
			jexit();
		}

		return parent::saveorder();
	}

	/**
	 * Check in of one or more records.
	 *
	 * Overrides JControllerAdmin::checkin to check the core.admin permission.
	 *
	 * @return  boolean  True on success
	 *
	 * @since   1.6
	 */
	public function checkin()
	{
		if (!JFactory::getUser()->authorise('core.admin', $this->option))
		{
			JError::raiseError(500, JText::_('JERROR_ALERTNOAUTHOR'));
			jexit();
		}

		return parent::checkin();
	}
}
components/com_users/controllers/note.php000060400000002123152453623460014760 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * User note controller class.
 *
 * @since  2.5
 */
class UsersControllerNote extends JControllerForm
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 * @since  2.5
	 */
	protected $text_prefix = 'COM_USERS_NOTE';

	/**
	 * Gets the URL arguments to append to an item redirect.
	 *
	 * @param   integer  $recordId  The primary key id for the item.
	 * @param   string   $key       The name of the primary key variable.
	 *
	 * @return  string  The arguments to append to the redirect URL.
	 *
	 * @since   2.5
	 */
	protected function getRedirectToItemAppend($recordId = null, $key = 'id')
	{
		$append = parent::getRedirectToItemAppend($recordId, $key);

		$userId = JFactory::getApplication()->input->get('u_id', 0, 'int');

		if ($userId)
		{
			$append .= '&u_id=' . $userId;
		}

		return $append;
	}
}
components/com_users/controller.php000060400000006175152453623460013643 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Users master display controller.
 *
 * @since  1.6
 */
class UsersController extends JControllerLegacy
{
	/**
	 * Checks whether a user can see this view.
	 *
	 * @param   string  $view  The view name.
	 *
	 * @return  boolean
	 *
	 * @since   1.6
	 */
	protected function canView($view)
	{
		$canDo = JHelperContent::getActions('com_users');

		switch ($view)
		{
			// Special permissions.
			case 'groups':
			case 'group':
			case 'levels':
			case 'level':
				return $canDo->get('core.admin');
				break;

			// Default permissions.
			default:
				return true;
		}
	}

	/**
	 * 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  JController	 This object to support chaining.
	 *
	 * @since   1.5
	 */
	public function display($cachable = false, $urlparams = false)
	{
		$view   = $this->input->get('view', 'users');
		$layout = $this->input->get('layout', 'default');
		$id     = $this->input->getInt('id');

		if (!$this->canView($view))
		{
			throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
		}

		// Check for edit form.
		if ($view == 'user' && $layout == 'edit' && !$this->checkEditId('com_users.edit.user', $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_users&view=users', false));

			return false;
		}
		elseif ($view == 'group' && $layout == 'edit' && !$this->checkEditId('com_users.edit.group', $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_users&view=groups', false));

			return false;
		}
		elseif ($view == 'level' && $layout == 'edit' && !$this->checkEditId('com_users.edit.level', $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_users&view=levels', false));

			return false;
		}
		elseif ($view == 'note' && $layout == 'edit' && !$this->checkEditId('com_users.edit.note', $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_users&view=notes', false));

			return false;
		}

		return parent::display();
	}
}
components/com_fields/controller.php000060400000003314152453623460013740 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

/**
 * Fields Controller
 *
 * @since  3.7.0
 */
class FieldsController extends JControllerLegacy
{
	/**
	 * The default view.
	 *
	 * @var    string
	 *
	 * @since   3.7.0
	 */
	protected $default_view = 'fields';

	/**
	 * Typical view method for MVC based architecture
	 *
	 * This function is provide as a default implementation, in most cases
	 * you will need to override it in your own controllers.
	 *
	 * @param   boolean     $cachable   If true, the view output will be cached
	 * @param   array|bool  $urlparams  An array of safe URL parameters and their variable types, for valid values see {@link JFilterInput::clean()}
	 *
	 * @return JControllerLegacy|boolean  A JControllerLegacy object to support chaining.
	 *
	 * @since   3.7.0
	 */
	public function display($cachable = false, $urlparams = false)
	{
		// Set the default view name and format from the Request.
		$vName   = $this->input->get('view', 'fields');
		$id      = $this->input->getInt('id');

		// Check for edit form.
		if ($vName == 'field' && !$this->checkEditId('com_fields.edit.field', $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_fields&view=fields&context=' . $this->input->get('context'), false));

			return false;
		}

		return parent::display($cachable, $urlparams);
	}
}
components/com_fields/models/field.php000060400000067254152453623460014140 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;

/**
 * Field Model
 *
 * @since  3.7.0
 */
class FieldsModelField extends JModelAdmin
{
	/**
	 * @var null|string
	 *
	 * @since   3.7.0
	 */
	public $typeAlias = null;

	/**
	 * @var string
	 *
	 * @since   3.7.0
	 */
	protected $text_prefix = 'COM_FIELDS';

	/**
	 * Batch copy/move command. If set to false,
	 * the batch copy/move command is not supported
	 *
	 * @var    string
	 * @since  3.4
	 */
	protected $batch_copymove = 'group_id';

	/**
	 * Allowed batch commands
	 *
	 * @var array
	 */
	protected $batch_commands = array(
		'assetgroup_id' => 'batchAccess',
		'language_id'   => 'batchLanguage'
	);

	/**
	 * @var array
	 *
	 * @since   3.7.0
	 */
	private $valueCache = array();

	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JModelLegacy
	 * @since   3.7.0
	 */
	public function __construct($config = array())
	{
		parent::__construct($config);

		$this->typeAlias = JFactory::getApplication()->input->getCmd('context', 'com_content.article') . '.field';
	}

	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success, False on error.
	 *
	 * @since   3.7.0
	 */
	public function save($data)
	{
		$field = null;

		if (isset($data['id']) && $data['id'])
		{
			$field = $this->getItem($data['id']);
		}

		if (!isset($data['label']) && isset($data['params']['label']))
		{
			$data['label'] = $data['params']['label'];

			unset($data['params']['label']);
		}

		// Alter the title for save as copy
		$input = JFactory::getApplication()->input;

		if ($input->get('task') == 'save2copy')
		{
			$origTable = clone $this->getTable();
			$origTable->load($input->getInt('id'));

			if ($data['title'] == $origTable->title)
			{
				list($title, $name) = $this->generateNewTitle($data['group_id'], $data['name'], $data['title']);
				$data['title'] = $title;
				$data['label'] = $title;
				$data['name'] = $name;
			}
			else
			{
				if ($data['name'] == $origTable->name)
				{
					$data['name'] = '';
				}
			}

			$data['state'] = 0;
		}

		// Load the fields plugins, perhaps they want to do something
		JPluginHelper::importPlugin('fields');

		$message = $this->checkDefaultValue($data);

		if ($message !== true)
		{
			$this->setError($message);

			return false;
		}

		if (!parent::save($data))
		{
			return false;
		}

		// Save the assigned categories into #__fields_categories
		$db = $this->getDbo();
		$id = (int) $this->getState('field.id');
		$cats = isset($data['assigned_cat_ids']) ? (array) $data['assigned_cat_ids'] : array();
		$cats = ArrayHelper::toInteger($cats);

		$assignedCatIds = array();

		foreach ($cats as $cat)
		{
			if ($cat)
			{
				$assignedCatIds[] = $cat;
			}
		}

		// First delete all assigned categories
		$query = $db->getQuery(true);
		$query->delete('#__fields_categories')
			->where('field_id = ' . $id);
		$db->setQuery($query);
		$db->execute();

		// Inset new assigned categories
		$tupel = new stdClass;
		$tupel->field_id = $id;

		foreach ($assignedCatIds as $catId)
		{
			$tupel->category_id = $catId;
			$db->insertObject('#__fields_categories', $tupel);
		}

		// If the options have changed delete the values
		if ($field && isset($data['fieldparams']['options']) && isset($field->fieldparams['options']))
		{
			$oldParams = $this->getParams($field->fieldparams['options']);
			$newParams = $this->getParams($data['fieldparams']['options']);

			if (is_object($oldParams) && is_object($newParams) && $oldParams != $newParams)
			{
				$names = array();

				foreach ($newParams as $param)
				{
					$names[] = $db->q($param['value']);
				}

				$query = $db->getQuery(true);
				$query->delete('#__fields_values')->where('field_id = ' . (int) $field->id);

				// If new values are set, delete only old values. Otherwise delete all values.
				if ($names)
				{
					$query->where('value NOT IN (' . implode(',', $names) . ')');
				}

				$db->setQuery($query);
				$db->execute();
			}
		}

		FieldsHelper::clearFieldsCache();

		return true;
	}


	/**
	 * Checks if the default value is valid for the given data. If a string is returned then
	 * it can be assumed that the default value is invalid.
	 *
	 * @param   array  $data  The data.
	 *
	 * @return  true|string  true if valid, a string containing the exception message when not.
	 *
	 * @since   3.7.0
	 */
	private function checkDefaultValue($data)
	{
		// Empty default values are correct
		if (empty($data['default_value']) && $data['default_value'] !== '0')
		{
			return true;
		}

		$types = FieldsHelper::getFieldTypes();

		// Check if type exists
		if (!key_exists($data['type'], $types))
		{
			return true;
		}

		$path = $types[$data['type']]['rules'];

		// Add the path for the rules of the plugin when available
		if ($path)
		{
			// Add the lookup path for the rule
			JFormHelper::addRulePath($path);
		}

		// Create the fields object
		$obj              = (object) $data;
		$obj->params      = new Registry($obj->params);
		$obj->fieldparams = new Registry(!empty($obj->fieldparams) ? $obj->fieldparams : array());

		// Prepare the dom
		$dom  = new DOMDocument;
		$node = $dom->appendChild(new DOMElement('form'));

		// Trigger the event to create the field dom node
		JEventDispatcher::getInstance()->trigger('onCustomFieldsPrepareDom', array($obj, $node, new JForm($data['context'])));

		// Check if a node is created
		if (!$node->firstChild)
		{
			return true;
		}

		// Define the type either from the field or from the data
		$type = $node->firstChild->getAttribute('validate') ? : $data['type'];

		// Load the rule
		$rule = JFormHelper::loadRuleType($type);

		// When no rule exists, we allow the default value
		if (!$rule)
		{
			return true;
		}

		try
		{
			// Perform the check
			$result = $rule->test(simplexml_import_dom($node->firstChild), $data['default_value']);

			// Check if the test succeeded
			return $result === true ? : JText::_('COM_FIELDS_FIELD_INVALID_DEFAULT_VALUE');
		}
		catch (UnexpectedValueException $e)
		{
			return $e->getMessage();
		}
	}

	/**
	 * Converts the unknown params into an object.
	 *
	 * @param   mixed  $params  The params.
	 *
	 * @return  stdClass  Object on success, false on failure.
	 *
	 * @since   3.7.0
	 */
	private function getParams($params)
	{
		if (is_string($params))
		{
			$params = json_decode($params);
		}

		if (is_array($params))
		{
			$params = (object) $params;
		}

		return $params;
	}

	/**
	 * Method to get a single record.
	 *
	 * @param   integer  $pk  The id of the primary key.
	 *
	 * @return  mixed    Object on success, false on failure.
	 *
	 * @since   3.7.0
	 */
	public function getItem($pk = null)
	{
		$result = parent::getItem($pk);

		if ($result)
		{
			// Prime required properties.
			if (empty($result->id))
			{
				$result->context = JFactory::getApplication()->input->getCmd('context', $this->getState('field.context'));
			}

			if (property_exists($result, 'fieldparams') && $result->fieldparams !== null)
			{
				$registry = new Registry;
				$registry->loadString($result->fieldparams);
				$result->fieldparams = $registry->toArray();
			}

			$db = $this->getDbo();
			$query = $db->getQuery(true);
			$query->select('category_id')
				->from('#__fields_categories')
				->where('field_id = ' . (int) $result->id);

			$db->setQuery($query);
			$result->assigned_cat_ids = $db->loadColumn() ?: array(0);
		}

		return $result;
	}

	/**
	 * Method to get a table object, load it if necessary.
	 *
	 * @param   string  $name     The table name. Optional.
	 * @param   string  $prefix   The class prefix. Optional.
	 * @param   array   $options  Configuration array for model. Optional.
	 *
	 * @return  JTable  A JTable object
	 *
	 * @since   3.7.0
	 * @throws  Exception
	 */
	public function getTable($name = 'Field', $prefix = 'FieldsTable', $options = array())
	{
		if (strpos(JPATH_COMPONENT, 'com_fields') === false)
		{
			$this->addTablePath(JPATH_ADMINISTRATOR . '/components/com_fields/tables');
		}

		// Default to text type
		$table       = JTable::getInstance($name, $prefix, $options);
		$table->type = 'text';

		return $table;
	}

	/**
	 * Method to change the title & name.
	 *
	 * @param   integer  $categoryId  The id of the category.
	 * @param   string   $name        The name.
	 * @param   string   $title       The title.
	 *
	 * @return  array  Contains the modified title and name.
	 *
	 * @since    3.7.0
	 */
	protected function generateNewTitle($categoryId, $name, $title)
	{
		// Alter the title & name
		$table = $this->getTable();

		while ($table->load(array('name' => $name)))
		{
			$title = StringHelper::increment($title);
			$name = StringHelper::increment($name, 'dash');
		}

		return array(
			$title,
			$name,
		);
	}

	/**
	 * Method to delete one or more records.
	 *
	 * @param   array  $pks  An array of record primary keys.
	 *
	 * @return  boolean  True if successful, false if an error occurs.
	 *
	 * @since   3.7.0
	 */
	public function delete(&$pks)
	{
		$success = parent::delete($pks);

		if ($success)
		{
			$pks = (array) $pks;
			$pks = ArrayHelper::toInteger($pks);
			$pks = array_filter($pks);

			if (!empty($pks))
			{
				// Delete Values
				$query = $this->getDbo()->getQuery(true);

				$query->delete($query->qn('#__fields_values'))
					->where($query->qn('field_id') . ' IN(' . implode(',', $pks) . ')');

				$this->getDbo()->setQuery($query)->execute();

				// Delete Assigned Categories
				$query = $this->getDbo()->getQuery(true);

				$query->delete($query->qn('#__fields_categories'))
					->where($query->qn('field_id') . ' IN(' . implode(',', $pks) . ')');

				$this->getDbo()->setQuery($query)->execute();
			}
		}

		return $success;
	}

	/**
	 * Abstract method for getting the form from the model.
	 *
	 * @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.7.0
	 */
	public function getForm($data = array(), $loadData = true)
	{
		$context = $this->getState('field.context');
		$jinput  = JFactory::getApplication()->input;

		// A workaround to get the context into the model for save requests.
		if (empty($context) && isset($data['context']))
		{
			$context = $data['context'];
			$parts   = FieldsHelper::extract($context);

			$this->setState('field.context', $context);

			if ($parts)
			{
				$this->setState('field.component', $parts[0]);
				$this->setState('field.section', $parts[1]);
			}
		}

		if (isset($data['type']))
		{
			// This is needed that the plugins can determine the type
			$this->setState('field.type', $data['type']);
		}

		// Load the fields plugin that they can add additional parameters to the form
		JPluginHelper::importPlugin('fields');

		// Get the form.
		$form = $this->loadForm(
			'com_fields.field.' . $context, 'field',
			array(
				'control'   => 'jform',
				'load_data' => true,
			)
		);

		if (empty($form))
		{
			return false;
		}

		// Modify the form based on Edit State access controls.
		if (empty($data['context']))
		{
			$data['context'] = $context;
		}

		$fieldId  = $jinput->get('id');
		$assetKey = $this->state->get('field.component') . '.field.' . $fieldId;

		if (!JFactory::getUser()->authorise('core.edit.state', $assetKey))
		{
			// Disable fields for display.
			$form->setFieldAttribute('ordering', 'disabled', 'true');
			$form->setFieldAttribute('state', '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('state', 'filter', 'unset');
		}

		return $form;
	}

	/**
	 * Setting the value for the given field id, context and item id.
	 *
	 * @param   string  $fieldId  The field ID.
	 * @param   string  $itemId   The ID of the item.
	 * @param   string  $value    The value.
	 *
	 * @return  boolean
	 *
	 * @since   3.7.0
	 */
	public function setFieldValue($fieldId, $itemId, $value)
	{
		$field  = $this->getItem($fieldId);
		$params = $field->params;

		if (is_array($params))
		{
			$params = new Registry($params);
		}

		// Don't save the value when the user is not authorized to change it
		if (!$field || !FieldsHelper::canEditFieldValue($field))
		{
			return false;
		}

		$needsDelete = false;
		$needsInsert = false;
		$needsUpdate = false;

		$oldValue = $this->getFieldValue($fieldId, $itemId);
		$value    = (array) $value;

		if ($oldValue === null)
		{
			// No records available, doing normal insert
			$needsInsert = true;
		}
		elseif (count($value) == 1 && count((array) $oldValue) == 1)
		{
			// Only a single row value update can be done when not empty
			$needsUpdate = is_array($value[0]) ? count($value[0]) : strlen($value[0]);
			$needsDelete = !$needsUpdate;
		}
		else
		{
			// Multiple values, we need to purge the data and do a new
			// insert
			$needsDelete = true;
			$needsInsert = true;
		}

		if ($needsDelete)
		{
			// Deleting the existing record as it is a reset
			$query = $this->getDbo()->getQuery(true);

			$query->delete($query->qn('#__fields_values'))
				->where($query->qn('field_id') . ' = ' . (int) $fieldId)
				->where($query->qn('item_id') . ' = ' . $query->q($itemId));

			$this->getDbo()->setQuery($query)->execute();
		}

		if ($needsInsert)
		{
			$newObj = new stdClass;

			$newObj->field_id = (int) $fieldId;
			$newObj->item_id  = $itemId;

			foreach ($value as $v)
			{
				$newObj->value = $v;

				$this->getDbo()->insertObject('#__fields_values', $newObj);
			}
		}

		if ($needsUpdate)
		{
			$updateObj = new stdClass;

			$updateObj->field_id = (int) $fieldId;
			$updateObj->item_id  = $itemId;
			$updateObj->value    = reset($value);

			$this->getDbo()->updateObject('#__fields_values', $updateObj, array('field_id', 'item_id'));
		}

		$this->valueCache = array();
		FieldsHelper::clearFieldsCache();

		return true;
	}

	/**
	 * Returning the value for the given field id, context and item id.
	 *
	 * @param   string  $fieldId  The field ID.
	 * @param   string  $itemId   The ID of the item.
	 *
	 * @return  NULL|string
	 *
	 * @since  3.7.0
	 */
	public function getFieldValue($fieldId, $itemId)
	{
		$values = $this->getFieldValues(array($fieldId), $itemId);

		if (key_exists($fieldId, $values))
		{
			return $values[$fieldId];
		}

		return null;
	}

	/**
	 * Returning the values for the given field ids, context and item id.
	 *
	 * @param   array   $fieldIds  The field Ids.
	 * @param   string  $itemId    The ID of the item.
	 *
	 * @return  NULL|array
	 *
	 * @since  3.7.0
	 */
	public function getFieldValues(array $fieldIds, $itemId)
	{
		if (!$fieldIds)
		{
			return array();
		}

		// Create a unique key for the cache
		$key = md5(serialize($fieldIds) . $itemId);

		// Fill the cache when it doesn't exist
		if (!key_exists($key, $this->valueCache))
		{
			// Create the query
			$query = $this->getDbo()->getQuery(true);

			$query->select(array($query->qn('field_id'), $query->qn('value')))
				->from($query->qn('#__fields_values'))
				->where($query->qn('field_id') . ' IN (' . implode(',', ArrayHelper::toInteger($fieldIds)) . ')')
				->where($query->qn('item_id') . ' = ' . $query->q($itemId));

			// Fetch the row from the database
			$rows = $this->getDbo()->setQuery($query)->loadObjectList();

			$data = array();

			// Fill the data container from the database rows
			foreach ($rows as $row)
			{
				// If there are multiple values for a field, create an array
				if (key_exists($row->field_id, $data))
				{
					// Transform it to an array
					if (!is_array($data[$row->field_id]))
					{
						$data[$row->field_id] = array($data[$row->field_id]);
					}

					// Set the value in the array
					$data[$row->field_id][] = $row->value;

					// Go to the next row, otherwise the value gets overwritten in the data container
					continue;
				}

				// Set the value
				$data[$row->field_id] = $row->value;
			}

			// Assign it to the internal cache
			$this->valueCache[$key] = $data;
		}

		// Return the value from the cache
		return $this->valueCache[$key];
	}

	/**
	 * Cleaning up the values for the given item on the context.
	 *
	 * @param   string  $context  The context.
	 * @param   string  $itemId   The Item ID.
	 *
	 * @return  void
	 *
	 * @since   3.7.0
	 */
	public function cleanupValues($context, $itemId)
	{
		// Delete with inner join is not possible so we need to do a subquery
		$fieldsQuery = $this->getDbo()->getQuery(true);
		$fieldsQuery->select($fieldsQuery->qn('id'))
			->from($fieldsQuery->qn('#__fields'))
			->where($fieldsQuery->qn('context') . ' = ' . $fieldsQuery->q($context));

		$query = $this->getDbo()->getQuery(true);

		$query->delete($query->qn('#__fields_values'))
			->where($query->qn('field_id') . ' IN (' . $fieldsQuery . ')')
			->where($query->qn('item_id') . ' = ' . $query->q($itemId));

		$this->getDbo()->setQuery($query)->execute();
	}

	/**
	 * 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 for the component.
	 *
	 * @since   3.7.0
	 */
	protected function canDelete($record)
	{
		if (empty($record->id) || $record->state != -2)
		{
			return false;
		}

		$parts = FieldsHelper::extract($record->context);

		return JFactory::getUser()->authorise('core.delete', $parts[0] . '.field.' . (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 for the
	 *                   component.
	 *
	 * @since   3.7.0
	 */
	protected function canEditState($record)
	{
		$user  = JFactory::getUser();
		$parts = FieldsHelper::extract($record->context);

		// Check for existing field.
		if (!empty($record->id))
		{
			return $user->authorise('core.edit.state', $parts[0] . '.field.' . (int) $record->id);
		}

		return $user->authorise('core.edit.state', $parts[0]);
	}

	/**
	 * Stock method to auto-populate the model state.
	 *
	 * @return  void
	 *
	 * @since   3.7.0
	 */
	protected function populateState()
	{
		$app = JFactory::getApplication('administrator');

		// Load the User state.
		$pk = $app->input->getInt('id');
		$this->setState($this->getName() . '.id', $pk);

		$context = $app->input->get('context', 'com_content.article');
		$this->setState('field.context', $context);
		$parts = FieldsHelper::extract($context);

		// Extract the component name
		$this->setState('field.component', $parts[0]);

		// Extract the optional section name
		$this->setState('field.section', (count($parts) > 1) ? $parts[1] : null);

		// Load the parameters.
		$params = JComponentHelper::getParams('com_fields');
		$this->setState('params', $params);
	}

	/**
	 * A protected method to get a set of ordering conditions.
	 *
	 * @param   JTable  $table  A JTable object.
	 *
	 * @return  array  An array of conditions to add to ordering queries.
	 *
	 * @since   3.7.0
	 */
	protected function getReorderConditions($table)
	{
		return 'context = ' . $this->_db->quote($table->context);
	}

	/**
	 * Method to get the data that should be injected in the form.
	 *
	 * @return  array  The default data is an empty array.
	 *
	 * @since   3.7.0
	 */
	protected function loadFormData()
	{
		// Check the session for previously entered form data.
		$app  = JFactory::getApplication();
		$data = $app->getUserState('com_fields.edit.field.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 context the Category Manager is used and
				// get selected fields
				$filters = (array) $app->getUserState('com_fields.fields.filter');

				$data->set('state', $app->input->getInt('state', ((isset($filters['state']) && $filters['state'] !== '') ? $filters['state'] : null)));
				$data->set('language', $app->input->getString('language', (!empty($filters['language']) ? $filters['language'] : null)));
				$data->set('group_id', $app->input->getString('group_id', (!empty($filters['group_id']) ? $filters['group_id'] : null)));
				$data->set(
					'access',
					$app->input->getInt('access', (!empty($filters['access']) ? $filters['access'] : JFactory::getConfig()->get('access')))
				);

				// Set the type if available from the request
				$data->set('type', $app->input->getWord('type', $this->state->get('field.type', $data->get('type'))));
			}

			if ($data->label && !isset($data->params['label']))
			{
				$data->params['label'] = $data->label;
			}
		}

		$this->preprocessData('com_fields.field', $data);

		return $data;
	}

	/**
	 * Method to validate the form data.
	 *
	 * @param   JForm   $form   The form to validate against.
	 * @param   array   $data   The data to validate.
	 * @param   string  $group  The name of the field group to validate.
	 *
	 * @return  array|boolean  Array of filtered data if valid, false otherwise.
	 *
	 * @see     JFormRule
	 * @see     JFilterInput
	 * @since   3.9.23
	 */
	public function validate($form, $data, $group = null)
	{
		// Don't allow to change the users if not allowed to access com_users.
		if (!JFactory::getUser()->authorise('core.manage', 'com_users'))
		{
			if (isset($data['created_user_id']))
			{
				unset($data['created_user_id']);
			}
		}

		if (!JFactory::getUser()->authorise('core.admin', 'com_fields'))
		{
			if (isset($data['rules']))
			{
				unset($data['rules']);
			}
		}

		return parent::validate($form, $data, $group);
	}

	/**
	 * Method to allow derived classes 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 (defaults to "content").
	 *
	 * @return  void
	 *
	 * @see     JFormField
	 * @since   3.7.0
	 * @throws  Exception if there is an error in the form event.
	 */
	protected function preprocessForm(JForm $form, $data, $group = 'content')
	{
		$component  = $this->state->get('field.component');
		$section    = $this->state->get('field.section');
		$dataObject = $data;

		if (is_array($dataObject))
		{
			$dataObject = (object) $dataObject;
		}

		if (isset($dataObject->type))
		{
			$form->setFieldAttribute('type', 'component', $component);

			// Not allowed to change the type of an existing record
			if ($dataObject->id)
			{
				$form->setFieldAttribute('type', 'readonly', 'true');
			}

			// Allow to override the default value label and description through the plugin
			$key = 'PLG_FIELDS_' . strtoupper($dataObject->type) . '_DEFAULT_VALUE_LABEL';

			if (JFactory::getLanguage()->hasKey($key))
			{
				$form->setFieldAttribute('default_value', 'label', $key);
			}

			$key = 'PLG_FIELDS_' . strtoupper($dataObject->type) . '_DEFAULT_VALUE_DESC';

			if (JFactory::getLanguage()->hasKey($key))
			{
				$form->setFieldAttribute('default_value', 'description', $key);
			}

			// Remove placeholder field on list fields
			if ($dataObject->type == 'list')
			{
				$form->removeField('hint', 'params');
			}
		}

		// Setting the context for the category field
		$cat = JCategories::getInstance(str_replace('com_', '', $component) . '.' . $section);

		// If there is no category for the component and section, so check the component only
		if (!$cat)
		{
			$cat = JCategories::getInstance(str_replace('com_', '', $component));
		}

		if ($cat && $cat->get('root')->hasChildren())
		{
			$form->setFieldAttribute('assigned_cat_ids', 'extension', $cat->getExtension());
		}
		else
		{
			$form->removeField('assigned_cat_ids');
		}

		$form->setFieldAttribute('type', 'component', $component);
		$form->setFieldAttribute('group_id', 'context', $this->state->get('field.context'));
		$form->setFieldAttribute('rules', 'component', $component);

		// Looking first in the component models/forms folder
		$path = JPath::clean(JPATH_ADMINISTRATOR . '/components/' . $component . '/models/forms/fields/' . $section . '.xml');

		if (file_exists($path))
		{
			$lang = JFactory::getLanguage();
			$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'));
			}
		}

		// Trigger the default form events.
		parent::preprocessForm($form, $data, $group);
	}

	/**
	 * Clean the cache
	 *
	 * @param   string   $group     The cache group
	 * @param   integer  $clientId  The ID of the client
	 *
	 * @return  void
	 *
	 * @since   3.7.0
	 */
	protected function cleanCache($group = null, $clientId = 0)
	{
		$context = JFactory::getApplication()->input->get('context');

		switch ($context)
		{
			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($context);
				break;
		}
	}

	/**
	 * Batch copy fields to a new group.
	 *
	 * @param   integer  $value     The new value matching a fields group.
	 * @param   array    $pks       An array of row IDs.
	 * @param   array    $contexts  An array of item contexts.
	 *
	 * @return  array|boolean  new IDs if successful, false otherwise and internal error is set.
	 *
	 * @since   3.7.0
	 */
	protected function batchCopy($value, $pks, $contexts)
	{
		// Set the variables
		$user      = JFactory::getUser();
		$table     = $this->getTable();
		$newIds    = array();
		$component = $this->state->get('filter.component');
		$value     = (int) $value;

		foreach ($pks as $pk)
		{
			if ($user->authorise('core.create', $component . '.fieldgroup.' . $value))
			{
				$table->reset();
				$table->load($pk);

				$table->group_id = $value;

				// Reset the ID because we are making a copy
				$table->id = 0;

				// Unpublish the new field
				$table->state = 0;

				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;
			}
			else
			{
				$this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_CREATE'));

				return false;
			}
		}

		// Clean the cache
		$this->cleanCache();

		return $newIds;
	}

	/**
	 * Batch move fields to a new group.
	 *
	 * @param   integer  $value     The new value matching a fields group.
	 * @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   3.7.0
	 */
	protected function batchMove($value, $pks, $contexts)
	{
		// Set the variables
		$user      = JFactory::getUser();
		$table     = $this->getTable();
		$context   = explode('.', JFactory::getApplication()->getUserState('com_fields.fields.context'));
		$value     = (int) $value;

		foreach ($pks as $pk)
		{
			if ($user->authorise('core.edit', $context[0] . '.fieldgroup.' . $value))
			{
				$table->reset();
				$table->load($pk);

				$table->group_id = $value;

				if (!$table->store())
				{
					$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;
	}
}
components/com_fields/models/fields.php000060400000025411152453623460014310 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;

/**
 * Fields Model
 *
 * @since  3.7.0
 */
class FieldsModelFields extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JModelLegacy
	 * @since   3.7.0
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'title', 'a.title',
				'type', 'a.type',
				'name', 'a.name',
				'state', 'a.state',
				'access', 'a.access',
				'access_level',
				'language', 'a.language',
				'ordering', 'a.ordering',
				'checked_out', 'a.checked_out',
				'checked_out_time', 'a.checked_out_time',
				'created_time', 'a.created_time',
				'created_user_id', 'a.created_user_id',
				'group_title', 'g.title',
				'category_id', 'a.category_id',
				'group_id', 'a.group_id',
				'assigned_cat_ids'
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * This method should only be called once per instantiation and is designed
	 * to be called on the first call to the getState() method unless the model
	 * configuration flag to ignore the request is set.
	 *
	 * 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.7.0
	 */
	protected function populateState($ordering = null, $direction = null)
	{
		// List state information.
		parent::populateState('a.ordering', 'asc');

		$context = $this->getUserStateFromRequest($this->context . '.context', 'context', 'com_content.article', 'CMD');
		$this->setState('filter.context', $context);

		// Split context into component and optional section
		$parts = FieldsHelper::extract($context);

		if ($parts)
		{
			$this->setState('filter.component', $parts[0]);
			$this->setState('filter.section', $parts[1]);
		}
	}

	/**
	 * Method to get a store id based on the 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  An identifier string to generate the store id.
	 *
	 * @return  string  A store id.
	 *
	 * @since   3.7.0
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.context');
		$id .= ':' . serialize($this->getState('filter.assigned_cat_ids'));
		$id .= ':' . $this->getState('filter.state');
		$id .= ':' . $this->getState('filter.group_id');
		$id .= ':' . serialize($this->getState('filter.language'));

		return parent::getStoreId($id);
	}

	/**
	 * Method to get a JDatabaseQuery object for retrieving the data set from a database.
	 *
	 * @return  JDatabaseQuery   A JDatabaseQuery object to retrieve the data set.
	 *
	 * @since   3.7.0
	 */
	protected function getListQuery()
	{
		// Create a new query object.
		$db    = $this->getDbo();
		$query = $db->getQuery(true);
		$user  = JFactory::getUser();
		$app   = JFactory::getApplication();

		// Select the required fields from the table.
		$query->select(
			$this->getState(
				'list.select',
				'DISTINCT a.id, a.title, a.name, a.checked_out, a.checked_out_time, a.note' .
				', a.state, a.access, a.created_time, a.created_user_id, a.ordering, a.language' .
				', a.fieldparams, a.params, a.type, a.default_value, a.context, a.group_id' .
				', a.label, a.description, a.required'
			)
		);
		$query->from('#__fields 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 field groups.
		$query->select('g.title AS group_title, g.access as group_access, g.state AS group_state, g.note as group_note');
		$query->join('LEFT', '#__fields_groups AS g ON g.id = a.group_id');

		// Filter by context
		if ($context = $this->getState('filter.context'))
		{
			$query->where('a.context = ' . $db->quote($context));
		}

		// Filter by access level.
		if ($access = $this->getState('filter.access'))
		{
			if (is_array($access))
			{
				$access = ArrayHelper::toInteger($access);
				$query->where('a.access in (' . implode(',', $access) . ')');
			}
			else
			{
				$query->where('a.access = ' . (int) $access);
			}
		}

		if (($categories = $this->getState('filter.assigned_cat_ids')) && $context)
		{
			$categories = (array) $categories;
			$categories = ArrayHelper::toInteger($categories);
			$parts = FieldsHelper::extract($context);

			if ($parts)
			{
				// Get the category
				$cat = JCategories::getInstance(str_replace('com_', '', $parts[0]) . '.' . $parts[1]);

				// If there is no category for the component and section, so check the component only
				if (!$cat)
				{
					$cat = JCategories::getInstance(str_replace('com_', '', $parts[0]));
				}

				if ($cat)
				{
					foreach ($categories as $assignedCatIds)
					{
						// Check if we have the actual category
						$parent = $cat->get($assignedCatIds);

						if ($parent)
						{
							$categories[] = (int) $parent->id;

							// Traverse the tree up to get all the fields which are attached to a parent
							while ($parent->getParent() && $parent->getParent()->id != 'root')
							{
								$parent = $parent->getParent();
								$categories[] = (int) $parent->id;
							}
						}
					}
				}
			}

			$categories = array_unique($categories);

			// Join over the assigned categories
			$query->join('LEFT', $db->quoteName('#__fields_categories') . ' AS fc ON fc.field_id = a.id');

			if (in_array('0', $categories))
			{
				$query->where('(fc.category_id IS NULL OR fc.category_id IN (' . implode(',', $categories) . '))');
			}
			else
			{
				$query->where('fc.category_id IN (' . implode(',', $categories) . ')');
			}
		}

		// Implement View Level Access
		if (!$app->isClient('administrator') || !$user->authorise('core.admin'))
		{
			$groups = implode(',', $user->getAuthorisedViewLevels());
			$query->where('a.access IN (' . $groups . ') AND (a.group_id = 0 OR g.access IN (' . $groups . '))');
		}

		// Filter by state
		$state = $this->getState('filter.state');

		// Include group state only when not on on back end list
		$includeGroupState = !$app->isClient('administrator') ||
			$app->input->get('option') != 'com_fields' ||
			$app->input->get('view') != 'fields';

		if (is_numeric($state))
		{
			$query->where('a.state = ' . (int) $state);

			if ($includeGroupState)
			{
				$query->where('(a.group_id = 0 OR g.state = ' . (int) $state . ')');
			}
		}
		elseif (!$state)
		{
			$query->where('a.state IN (0, 1)');

			if ($includeGroupState)
			{
				$query->where('(a.group_id = 0 OR g.state IN (0, 1))');
			}
		}

		$groupId = $this->getState('filter.group_id');

		if (is_numeric($groupId))
		{
			$query->where('a.group_id = ' . (int) $groupId);
		}

		// 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));
			}
			elseif (stripos($search, 'author:') === 0)
			{
				$search = $db->quote('%' . $db->escape(substr($search, 7), true) . '%');
				$query->where('(ua.name LIKE ' . $search . ' OR ua.username LIKE ' . $search . ')');
			}
			else
			{
				$search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%'));
				$query->where('(a.title LIKE ' . $search . ' OR a.name LIKE ' . $search . ' OR a.note LIKE ' . $search . ')');
			}
		}

		// Filter on the language.
		if ($language = $this->getState('filter.language'))
		{
			$language = (array) $language;

			foreach ($language as $key => $l)
			{
				$language[$key] = $db->quote($l);
			}

			$query->where('a.language in (' . implode(',', $language) . ')');
		}

		// Add the list ordering clause
		$listOrdering  = $this->state->get('list.ordering', 'a.ordering');
		$orderDirn     = $this->state->get('list.direction', 'ASC');

		$query->order($db->escape($listOrdering) . ' ' . $db->escape($orderDirn));

		return $query;
	}

	/**
	 * Gets an array of objects from the results of database query.
	 *
	 * @param   string   $query       The query.
	 * @param   integer  $limitstart  Offset.
	 * @param   integer  $limit       The number of records.
	 *
	 * @return  array  An array of results.
	 *
	 * @since   3.7.0
	 * @throws  RuntimeException
	 */
	protected function _getList($query, $limitstart = 0, $limit = 0)
	{
		$result = parent::_getList($query, $limitstart, $limit);

		if (is_array($result))
		{
			foreach ($result as $field)
			{
				$field->fieldparams = new Registry($field->fieldparams);
				$field->params = new Registry($field->params);
			}
		}

		return $result;
	}

	/**
	 * Get the filter form
	 *
	 * @param   array    $data      data
	 * @param   boolean  $loadData  load current data
	 *
	 * @return  JForm|false  the JForm object or false
	 *
	 * @since   3.7.0
	 */
	public function getFilterForm($data = array(), $loadData = true)
	{
		$form = parent::getFilterForm($data, $loadData);

		if ($form)
		{
			$form->setValue('context', null, $this->getState('filter.context'));
			$form->setFieldAttribute('group_id', 'context', $this->getState('filter.context'), 'filter');
			$form->setFieldAttribute('assigned_cat_ids', 'extension', $this->state->get('filter.component'), 'filter');
		}

		return $form;
	}

	/**
	 * Get the groups for the batch method
	 *
	 * @return  array  An array of groups
	 *
	 * @since   3.7.0
	 */
	public function getGroups()
	{
		$user       = JFactory::getUser();
		$viewlevels = ArrayHelper::toInteger($user->getAuthorisedViewLevels());

		$db    = $this->getDbo();
		$query = $db->getQuery(true);
		$query->select('title AS text, id AS value, state');
		$query->from('#__fields_groups');
		$query->where('state IN (0,1)');
		$query->where('context = ' . $db->quote($this->state->get('filter.context')));
		$query->where('access IN (' . implode(',', $viewlevels) . ')');

		$db->setQuery($query);

		return $db->loadObjectList();
	}
}
components/com_fields/models/fields/fieldlayout.php000060400000011051152453623460016624 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

jimport('joomla.filesystem.folder');

/**
 * Form Field to display a list of the layouts for a field from
 * the extension or template overrides.
 *
 * @since  3.9.0
 */
class JFormFieldFieldlayout extends JFormField
{
	/**
	 * The form field type.
	 *
	 * @var    string
	 * @since  3.9.0
	 */
	protected $type = 'FieldLayout';

	/**
	 * Method to get the field input for a field layout field.
	 *
	 * @return  string   The field input.
	 *
	 * @since   3.9.0
	 */
	protected function getInput()
	{
		$extension = explode('.', $this->form->getValue('context'));
		$extension = $extension[0];

		if ($extension)
		{
			// Get the database object and a new query object.
			$db = JFactory::getDbo();
			$query = $db->getQuery(true);

			// Build the query.
			$query->select('element, name')
				->from('#__extensions')
				->where('client_id = 0')
				->where('type = ' . $db->quote('template'))
				->where('enabled = 1');

			// Set the query and load the templates.
			$db->setQuery($query);
			$templates = $db->loadObjectList('element');

			// Build the search paths for component layouts.
			$component_path = JPath::clean(JPATH_SITE . '/components/' . $extension . '/layouts/field');

			// Prepare array of component layouts
			$component_layouts = array();

			// Prepare the grouped list
			$groups = array();

			// Add "Use Default"
			$groups[]['items'][] = JHtml::_('select.option', '', JText::_('JOPTION_USE_DEFAULT'));

			// Add the layout options from the component path.
			if (is_dir($component_path) && ($component_layouts = JFolder::files($component_path, '^[^_]*\.php$', false, true)))
			{
				// Create the group for the component
				$groups['_'] = array();
				$groups['_']['id'] = $this->id . '__';
				$groups['_']['text'] = JText::sprintf('JOPTION_FROM_COMPONENT');
				$groups['_']['items'] = array();

				foreach ($component_layouts as $i => $file)
				{
					// Add an option to the component group
					$value = basename($file, '.php');
					$component_layouts[$i] = $value;

					if ($value === 'render')
					{
						continue;
					}

					$groups['_']['items'][] = JHtml::_('select.option', $value, $value);
				}
			}

			// Loop on all templates
			if ($templates)
			{
				foreach ($templates as $template)
				{
					$files = array();
					$template_paths = array(
						JPath::clean(JPATH_SITE . '/templates/' . $template->element . '/html/layouts/' . $extension . '/field'),
						JPath::clean(JPATH_SITE . '/templates/' . $template->element . '/html/layouts/com_fields/field'),
						JPath::clean(JPATH_SITE . '/templates/' . $template->element . '/html/layouts/field'),
					);

					// Add the layout options from the template paths.
					foreach ($template_paths as $template_path)
					{
						if (is_dir($template_path))
						{
							$files = array_merge($files, JFolder::files($template_path, '^[^_]*\.php$', false, true));
						}
					}

					foreach ($files as $i => $file)
					{
						$value = basename($file, '.php');

						// Remove the default "render.php" or layout files that exist in the component folder
						if ($value === 'render' || in_array($value, $component_layouts))
						{
							unset($files[$i]);
						}
					}

					if (count($files))
					{
						// Create the group for the template
						$groups[$template->name] = array();
						$groups[$template->name]['id'] = $this->id . '_' . $template->element;
						$groups[$template->name]['text'] = JText::sprintf('JOPTION_FROM_TEMPLATE', $template->name);
						$groups[$template->name]['items'] = array();

						foreach ($files as $file)
						{
							// Add an option to the template group
							$value = basename($file, '.php');
							$groups[$template->name]['items'][] = JHtml::_('select.option', $value, $value);
						}
					}
				}
			}

			// Compute attributes for the grouped list
			$attr = $this->element['size'] ? ' size="' . (int) $this->element['size'] . '"' : '';
			$attr .= $this->element['class'] ? ' class="' . (string) $this->element['class'] . '"' : '';

			// Prepare HTML code
			$html = array();

			// Compute the current selected values
			$selected = array($this->value);

			// Add a grouped list
			$html[] = JHtml::_(
				'select.groupedlist', $groups, $this->name,
				array('id' => $this->id, 'group.id' => 'id', 'list.attr' => $attr, 'list.select' => $selected)
			);

			return implode($html);
		}

		return '';
	}
}
components/com_fields/models/fields/type.php000060400000004163152453623460015272 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

JFormHelper::loadFieldClass('list');

/**
 * Fields Type
 *
 * @since  3.7.0
 */
class JFormFieldType extends JFormFieldList
{
	public $type = 'Type';

	/**
	 * Method to attach a JForm object to the field.
	 *
	 * @param   SimpleXMLElement  $element  The SimpleXMLElement object representing the `<field>` 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.
	 *
	 * @since   3.7.0
	 */
	public function setup(SimpleXMLElement $element, $value, $group = null)
	{
		$return = parent::setup($element, $value, $group);

		$this->onchange = 'typeHasChanged(this);';

		return $return;
	}

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   3.7.0
	 */
	protected function getOptions()
	{
		$options = parent::getOptions();

		$fieldTypes = FieldsHelper::getFieldTypes();

		foreach ($fieldTypes as $fieldType)
		{
			$options[] = JHtml::_('select.option', $fieldType['type'], $fieldType['label']);
		}

		// Sorting the fields based on the text which is displayed
		usort(
			$options,
			function ($a, $b)
			{
				return strcmp($a->text, $b->text);
			}
		);

		JFactory::getDocument()->addScriptDeclaration("
			jQuery( document ).ready(function() {
				Joomla.loadingLayer('load');
			});
			function typeHasChanged(element){
				Joomla.loadingLayer('show');
				var cat = jQuery(element);
				jQuery('input[name=task]').val('field.reload');
				element.form.submit();
			}
		"
		);

		return $options;
	}
}
components/com_fields/models/fields/section.php000060400000004032152453623460015750 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

JFormHelper::loadFieldClass('list');

/**
 * Fields Section
 *
 * @since  3.7.0
 */
class JFormFieldSection extends JFormFieldList
{
	public $type = 'Section';

	/**
	 * Method to attach a JForm object to the field.
	 *
	 * @param   SimpleXMLElement  $element  The SimpleXMLElement object representing the `<field>` 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.
	 *
	 * @since   3.7.0
	 */
	public function setup(SimpleXMLElement $element, $value, $group = null)
	{
		$return = parent::setup($element, $value, $group);

		// Onchange must always be the change context function
		$this->onchange = 'fieldsChangeContext(jQuery(this).val());';

		return $return;
	}

	/**
	 * 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.7.0
	 */
	protected function getInput()
	{
		// Add the change context function to the document
		JFactory::getDocument()->addScriptDeclaration(
			"function fieldsChangeContext(context)
				{
					var regex = new RegExp(\"([?;&])context[^&;]*[;&]?\");
					var url = window.location.href;
					var query = url.replace(regex, \"$1\").replace(/&$/, '');
    					window.location.href = (query.length > 2 ? query + \"&\" : \"?\") + (context ? \"context=\" + context : '');
				}"
		);

		return parent::getInput();
	}
}
components/com_fields/models/fields/fieldcontexts.php000060400000002725152453623460017166 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

JFormHelper::loadFieldClass('list');

/**
 * Fields Contexts
 *
 * @since  3.7.0
 */
class JFormFieldFieldcontexts extends JFormFieldList
{
	public $type = 'Fieldcontexts';

	/**
	 * 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.7.0
	 */
	protected function getInput()
	{
		return $this->getOptions() ? parent::getInput() : '';
	}

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   3.7.0
	 */
	protected function getOptions()
	{
		$parts = explode('.', $this->value);
		$eName = str_replace('com_', '', $parts[0]);
		$file = JPath::clean(JPATH_ADMINISTRATOR . '/components/' . $parts[0] . '/helpers/' . $eName . '.php');
		$contexts = array();

		if (!file_exists($file))
		{
			return array();
		}

		$prefix = ucfirst($eName);
		$cName = $prefix . 'Helper';

		JLoader::register($cName, $file);

		if (class_exists($cName) && is_callable(array($cName, 'getContexts')))
		{
			$contexts = $cName::getContexts();
		}

		if (!$contexts || !is_array($contexts) || count($contexts) == 1)
		{
			return array();
		}

		return $contexts;
	}
}
components/com_fields/models/fields/fieldgroups.php000060400000003105152453623460016627 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

use Joomla\Utilities\ArrayHelper;

JFormHelper::loadFieldClass('list');

/**
 * Fields Groups
 *
 * @since  3.7.0
 */
class JFormFieldFieldgroups extends JFormFieldList
{
	public $type = 'Fieldgroups';

	/**
	 * Method to get the field options.
	 *
	 * @return  array  The field option objects.
	 *
	 * @since   3.7.0
	 */
	protected function getOptions()
	{
		$context = (string) $this->element['context'];
		$states    = $this->element['state'] ?: '0,1';
		$states    = ArrayHelper::toInteger(explode(',', $states));

		$user       = JFactory::getUser();
		$viewlevels = ArrayHelper::toInteger($user->getAuthorisedViewLevels());

		$db    = JFactory::getDbo();
		$query = $db->getQuery(true);
		$query->select('title AS text, id AS value, state');
		$query->from('#__fields_groups');
		$query->where('state IN (' . implode(',', $states) . ')');
		$query->where('context = ' . $db->quote($context));
		$query->where('access IN (' . implode(',', $viewlevels) . ')');
		$query->order('ordering asc, id asc');

		$db->setQuery($query);
		$options = $db->loadObjectList();

		foreach ($options AS $option)
		{
			if ($option->state == 0)
			{
				$option->text = '[' . $option->text . ']';
			}

			if ($option->state == 2)
			{
				$option->text = '{' . $option->text . '}';
			}
		}

		return array_merge(parent::getOptions(), $options);
	}
}
components/com_fields/models/group.php000060400000022410152453623460014172 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

use Joomla\Registry\Registry;

/**
 * Group Model
 *
 * @since  3.7.0
 */
class FieldsModelGroup extends JModelAdmin
{
	/**
	 * @var null|string
	 *
	 * @since   3.7.0
	 */
	public $typeAlias = null;

	/**
	 * Allowed batch commands
	 *
	 * @var array
	 */
	protected $batch_commands = array(
		'assetgroup_id' => 'batchAccess',
		'language_id'   => 'batchLanguage'
	);

	/**
	 * Method to save the form data.
	 *
	 * @param   array  $data  The form data.
	 *
	 * @return  boolean  True on success, False on error.
	 *
	 * @since   3.7.0
	 */
	public function save($data)
	{
		// Alter the title for save as copy
		$input = JFactory::getApplication()->input;

		// Save new group as unpublished
		if ($input->get('task') == 'save2copy')
		{
			$data['state'] = 0;
		}

		return parent::save($data);
	}

	/**
	 * Method to get a table object, load it if necessary.
	 *
	 * @param   string  $name     The table name. Optional.
	 * @param   string  $prefix   The class prefix. Optional.
	 * @param   array   $options  Configuration array for model. Optional.
	 *
	 * @return  JTable  A JTable object
	 *
	 * @since   3.7.0
	 * @throws  Exception
	 */
	public function getTable($name = 'Group', $prefix = 'FieldsTable', $options = array())
	{
		$this->addTablePath(JPATH_ADMINISTRATOR . '/components/com_fields/tables');

		return JTable::getInstance($name, $prefix, $options);
	}

	/**
	 * Abstract method for getting the form from the model.
	 *
	 * @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.7.0
	 */
	public function getForm($data = array(), $loadData = true)
	{
		$context = $this->getState('filter.context');
		$jinput = JFactory::getApplication()->input;

		if (empty($context) && isset($data['context']))
		{
			$context = $data['context'];
			$this->setState('filter.context', $context);
		}

		// Get the form.
		$form = $this->loadForm(
			'com_fields.group.' . $context, 'group',
			array(
				'control'   => 'jform',
				'load_data' => $loadData,
			)
		);

		if (empty($form))
		{
			return false;
		}

		// Modify the form based on Edit State access controls.
		if (empty($data['context']))
		{
			$data['context'] = $context;
		}

		if (!JFactory::getUser()->authorise('core.edit.state', $context . '.fieldgroup.' . $jinput->get('id')))
		{
			// Disable fields for display.
			$form->setFieldAttribute('ordering', 'disabled', 'true');
			$form->setFieldAttribute('state', '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('state', 'filter', 'unset');
		}

		return $form;
	}

	/**
	 * 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 for the component.
	 *
	 * @since   3.7.0
	 */
	protected function canDelete($record)
	{
		if (empty($record->id) || $record->state != -2)
		{
			return false;
		}

		return JFactory::getUser()->authorise('core.delete', $record->context . '.fieldgroup.' . (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 for the
	 *                   component.
	 *
	 * @since   3.7.0
	 */
	protected function canEditState($record)
	{
		$user = JFactory::getUser();

		// Check for existing fieldgroup.
		if (!empty($record->id))
		{
			return $user->authorise('core.edit.state', $record->context . '.fieldgroup.' . (int) $record->id);
		}

		// Default to component settings.
		return $user->authorise('core.edit.state', $record->context);
	}

	/**
	 * Auto-populate the model state.
	 *
	 * Note. Calling getState in this method will result in recursion.
	 *
	 * @return  void
	 *
	 * @since   3.7.0
	 */
	protected function populateState()
	{
		parent::populateState();

		$context = JFactory::getApplication()->getUserStateFromRequest('com_fields.groups.context', 'context', 'com_fields', 'CMD');
		$this->setState('filter.context', $context);
	}

	/**
	 * A protected method to get a set of ordering conditions.
	 *
	 * @param   JTable  $table  A JTable object.
	 *
	 * @return  array  An array of conditions to add to ordering queries.
	 *
	 * @since   3.7.0
	 */
	protected function getReorderConditions($table)
	{
		return 'context = ' . $this->_db->quote($table->context);
	}

	/**
	 * 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 (defaults to "content").
	 *
	 * @return  void
	 *
	 * @see     JFormField
	 * @since   3.7.0
	 * @throws  Exception if there is an error in the form event.
	 */
	protected function preprocessForm(JForm $form, $data, $group = 'content')
	{
		parent::preprocessForm($form, $data, $group);

		$parts = FieldsHelper::extract($this->state->get('filter.context'));

		// Extract the component name
		$component = $parts[0];

		// Extract the optional section name
		$section = (count($parts) > 1) ? $parts[1] : null;

		if ($parts)
		{
			// Set the access control rules field component value.
			$form->setFieldAttribute('rules', 'component', $component);
		}

		if ($section !== null)
		{
			// Looking first in the component models/forms folder
			$path = JPath::clean(JPATH_ADMINISTRATOR . '/components/' . $component . '/models/forms/fieldgroup/' . $section . '.xml');

			if (file_exists($path))
			{
				$lang = JFactory::getLanguage();
				$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'));
				}
			}
		}
	}

	/**
	 * Method to validate the form data.
	 *
	 * @param   JForm   $form   The form to validate against.
	 * @param   array   $data   The data to validate.
	 * @param   string  $group  The name of the field group to validate.
	 *
	 * @return  array|boolean  Array of filtered data if valid, false otherwise.
	 *
	 * @see     JFormRule
	 * @see     JFilterInput
	 * @since   3.9.23
	 */
	public function validate($form, $data, $group = null)
	{
		// Don't allow to change the users if not allowed to access com_users.
		if (!JFactory::getUser()->authorise('core.manage', 'com_users'))
		{
			if (isset($data['created_by']))
			{
				unset($data['created_by']);
			}
		}

		if (!JFactory::getUser()->authorise('core.admin', 'com_fields'))
		{
			if (isset($data['rules']))
			{
				unset($data['rules']);
			}
		}

		return parent::validate($form, $data, $group);
	}

	/**
	 * Method to get the data that should be injected in the form.
	 *
	 * @return  array    The default data is an empty array.
	 *
	 * @since   3.7.0
	 */
	protected function loadFormData()
	{
		// Check the session for previously entered form data.
		$app = JFactory::getApplication();
		$data = $app->getUserState('com_fields.edit.group.data', array());

		if (empty($data))
		{
			$data = $this->getItem();

			// Pre-select some filters (Status, Language, Access) in edit form if those have been selected in Field Group Manager
			if (!$data->id)
			{
				// Check for which context the Field Group Manager is used and get selected fields
				$context = substr($app->getUserState('com_fields.groups.filter.context'), 4);
				$filters = (array) $app->getUserState('com_fields.groups.' . $context . '.filter');

				$data->set(
					'state',
					$app->input->getInt('state', (!empty($filters['state']) ? $filters['state'] : 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_fields.group', $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   3.7.0
	 */
	public function getItem($pk = null)
	{
		if ($item = parent::getItem($pk))
		{
			// Prime required properties.
			if (empty($item->id))
			{
				$item->context = $this->getState('filter.context');
			}

			if (property_exists($item, 'params'))
			{
				$item->params = new Registry($item->params);
			}
		}

		return $item;
	}

	/**
	 * Clean the cache
	 *
	 * @param   string   $group     The cache group
	 * @param   integer  $clientId  The ID of the client
	 *
	 * @return  void
	 *
	 * @since   3.7.0
	 */
	protected function cleanCache($group = null, $clientId = 0)
	{
		$context = JFactory::getApplication()->input->get('context');

		parent::cleanCache($context);
	}
}
components/com_fields/models/groups.php000060400000014374152453623460014367 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;

/**
 * Groups Model
 *
 * @since  3.7.0
 */
class FieldsModelGroups extends JModelList
{
	/**
	 * Context string for the model type.  This is used to handle uniqueness
	 * when dealing with the getStoreId() method and caching data structures.
	 *
	 * @var    string
	 * @since   3.7.0
	 */
	protected $context = 'com_fields.groups';

	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JModelLegacy
	 * @since   3.7.0
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id', 'a.id',
				'title', 'a.title',
				'type', 'a.type',
				'state', 'a.state',
				'access', 'a.access',
				'access_level',
				'language', 'a.language',
				'ordering', 'a.ordering',
				'checked_out', 'a.checked_out',
				'checked_out_time', 'a.checked_out_time',
				'created', 'a.created',
				'created_by', 'a.created_by',
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to auto-populate the model state.
	 *
	 * This method should only be called once per instantiation and is designed
	 * to be called on the first call to the getState() method unless the model
	 * configuration flag to ignore the request is set.
	 *
	 * 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.7.0
	 */
	protected function populateState($ordering = null, $direction = null)
	{
		// List state information.
		parent::populateState('a.ordering', 'asc');

		$context = $this->getUserStateFromRequest($this->context . '.context', 'context', 'com_content', 'CMD');
		$this->setState('filter.context', $context);
	}

	/**
	 * Method to get a store id based on the 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  An identifier string to generate the store id.
	 *
	 * @return  string  A store id.
	 *
	 * @since   3.7.0
	 */
	protected function getStoreId($id = '')
	{
		// Compile the store id.
		$id .= ':' . $this->getState('filter.search');
		$id .= ':' . $this->getState('filter.context');
		$id .= ':' . $this->getState('filter.state');
		$id .= ':' . print_r($this->getState('filter.language'), true);

		return parent::getStoreId($id);
	}

	/**
	 * Method to get a JDatabaseQuery object for retrieving the data set from a database.
	 *
	 * @return  JDatabaseQuery   A JDatabaseQuery object to retrieve the data set.
	 *
	 * @since   3.7.0
	 */
	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.*'));
		$query->from('#__fields_groups 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_by');

		// Filter by context
		if ($context = $this->getState('filter.context', 'com_fields'))
		{
			$query->where('a.context = ' . $db->quote($context));
		}

		// Filter by access level.
		if ($access = $this->getState('filter.access'))
		{
			if (is_array($access))
			{
				$access = ArrayHelper::toInteger($access);
				$query->where('a.access in (' . implode(',', $access) . ')');
			}
			else
			{
				$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
		$state = $this->getState('filter.state');

		if (is_numeric($state))
		{
			$query->where('a.state = ' . (int) $state);
		}
		elseif (!$state)
		{
			$query->where('a.state 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);
			}
		}

		// Filter on the language.
		if ($language = $this->getState('filter.language'))
		{
			$language = (array) $language;

			foreach ($language as $key => $l)
			{
				$language[$key] = $db->quote($l);
			}

			$query->where('a.language in (' . implode(',', $language) . ')');
		}

		// Add the list ordering clause
		$listOrdering = $this->getState('list.ordering', 'a.ordering');
		$listDirn = $db->escape($this->getState('list.direction', 'ASC'));

		$query->order($db->escape($listOrdering) . ' ' . $listDirn);

		return $query;
	}

	/**
	 * Gets an array of objects from the results of database query.
	 *
	 * @param   string   $query       The query.
	 * @param   integer  $limitstart  Offset.
	 * @param   integer  $limit       The number of records.
	 *
	 * @return  array  An array of results.
	 *
	 * @since   3.8.7
	 * @throws  RuntimeException
	 */
	protected function _getList($query, $limitstart = 0, $limit = 0)
	{
		$result = parent::_getList($query, $limitstart, $limit);

		if (is_array($result))
		{
			foreach ($result as $group)
			{
				$group->params = new Registry($group->params);
			}
		}

		return $result;
	}
}
components/com_fields/models/forms/filter_groups.xml000060400000003705152453623460017067 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset name="group">
		<field
			name="context"
			type="fieldcontexts"
			onchange="this.form.submit();"
		/>
	</fieldset>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			description="COM_FIELDS_GROUPS_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
			class="js-stools-search-string"
		/>

		<field
			name="state"
			type="status"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>

		<field
			name="access"
			type="accesslevel"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_ACCESS</option>
		</field>

		<field
			name="language"
			type="contentlanguage"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_LANGUAGE</option>
		</field>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			onchange="this.form.submit();"
			default="a.ordering ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.state ASC">JSTATUS_ASC</option>
			<option value="a.state DESC">JSTATUS_DESC</option>
			<option value="a.title ASC">JGLOBAL_TITLE_ASC</option>
			<option value="a.title DESC">JGLOBAL_TITLE_DESC</option>
			<option value="a.access ASC">JGRID_HEADING_ACCESS_ASC</option>
			<option value="a.access DESC">JGRID_HEADING_ACCESS_DESC</option>
			<option value="a.language ASC">JGRID_HEADING_LANGUAGE_ASC</option>
			<option value="a.language DESC">JGRID_HEADING_LANGUAGE_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_fields/models/forms/filter_fields.xml000060400000005365152453623460017022 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset name="group">
		<field
			name="context"
			type="fieldcontexts"
			onchange="this.form.submit();"
		/>
	</fieldset>
	<fields name="filter">
		<field
			name="search"
			type="text"
			inputmode="search"
			label=""
			description="COM_FIELDS_FIELDS_FILTER_SEARCH_DESC"
			hint="JSEARCH_FILTER"
			class="js-stools-search-string"
		/>

		<field
			name="state"
			type="status"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_PUBLISHED</option>
		</field>

		<field
			name="group_id"
			type="fieldgroups"
			state="0,1,2"
			onchange="this.form.submit();"
			>
			<option value="">COM_FIELDS_VIEW_FIELDS_SELECT_GROUP</option>
		</field>

		<field
			name="assigned_cat_ids"
			type="category"
			onchange="this.form.submit();"
			>
			<option value="">COM_FIELDS_VIEW_FIELDS_SELECT_CATEGORY</option>
		</field>

		<field
			name="access"
			type="accesslevel"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_ACCESS</option>
		</field>

		<field
			name="language"
			type="contentlanguage"
			onchange="this.form.submit();"
			>
			<option value="">JOPTION_SELECT_LANGUAGE</option>
		</field>
	</fields>

	<fields name="list">
		<field
			name="fullordering"
			type="list"
			label="JGLOBAL_SORT_BY"
			description="JGLOBAL_SORT_BY"
			statuses="*,0,1,2,-2"
			onchange="this.form.submit();"
			default="a.ordering ASC"
			validate="options"
			>
			<option value="">JGLOBAL_SORT_BY</option>
			<option value="a.ordering ASC">JGRID_HEADING_ORDERING_ASC</option>
			<option value="a.ordering DESC">JGRID_HEADING_ORDERING_DESC</option>
			<option value="a.state ASC">JSTATUS_ASC</option>
			<option value="a.state DESC">JSTATUS_DESC</option>
			<option value="a.title ASC">JGLOBAL_TITLE_ASC</option>
			<option value="a.title DESC">JGLOBAL_TITLE_DESC</option>
			<option value="a.type ASC">COM_FIELDS_VIEW_FIELDS_SORT_TYPE_ASC</option>
			<option value="a.type DESC">COM_FIELDS_VIEW_FIELDS_SORT_TYPE_DESC</option>
			<option value="g.title ASC">COM_FIELDS_VIEW_FIELDS_SORT_GROUP_ASC</option>
			<option value="g.title DESC">COM_FIELDS_VIEW_FIELDS_SORT_GROUP_DESC</option>
			<option value="a.access ASC">JGRID_HEADING_ACCESS_ASC</option>
			<option value="a.access DESC">JGRID_HEADING_ACCESS_DESC</option>
			<option value="a.language ASC">JGRID_HEADING_LANGUAGE_ASC</option>
			<option value="a.language DESC">JGRID_HEADING_LANGUAGE_DESC</option>
			<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
			<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
		</field>

		<field
			name="limit"
			type="limitbox"
			label="COM_FIELDS_LIST_LIMIT"
			description="COM_FIELDS_LIST_LIMIT_DESC"
			class="input-mini"
			default="25"
			onchange="this.form.submit();"
		/>
	</fields>
</form>
components/com_fields/models/forms/field.xml000060400000016726152453623460015275 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset addfieldpath="/administrator/components/com_categories/models/fields" >
		<field
			name="id"
			type="number"
			label="JGLOBAL_FIELD_ID_LABEL"
			description="JGLOBAL_FIELD_ID_DESC"
			default="0"
			class="readonly"
			readonly="true"
		/>

		<field
			name="asset_id"
			type="hidden"
			filter="unset"
		/>

		<field
			name="context"
			type="hidden"
		/>

		<field
			name="group_id"
			type="fieldgroups"
			label="COM_FIELDS_FIELD_GROUP_LABEL"
			description="COM_FIELDS_FIELD_GROUP_DESC"
			>
			<option value="0">JNONE</option>
		</field>

		<field
			name="assigned_cat_ids"
			type="category"
			label="JCATEGORY"
			description="JFIELD_FIELDS_CATEGORY_DESC"
			extension="com_content"
			multiple="true"
			>
			<option value="">JALL</option>
		</field>

		<field
			name="title"
			type="text"
			label="JGLOBAL_TITLE"
			description="JFIELD_TITLE_DESC"
			class="input-xxlarge input-large-text"
			size="40"
			required="true"
		/>

		<field
			name="name"
			type="text"
			label="JFIELD_NAME_LABEL"
			description="JFIELD_NAME_DESC"
			hint="JFIELD_NAME_PLACEHOLDER"
			size="45"
		/>

		<field
			name="type"
			type="type"
			label="COM_FIELDS_FIELD_TYPE_LABEL"
			description="COM_FIELDS_FIELD_TYPE_DESC"
			default="text"
			required="true"
		/>

		<field
			name="required"
			type="radio"
			label="COM_FIELDS_FIELD_REQUIRED_LABEL"
			description="COM_FIELDS_FIELD_REQUIRED_DESC"
			class="btn-group btn-group-yesno"
			default="0"
			>
			<option value="1">JYES</option>
			<option value="0">JNO</option>
		</field>

		<field
			name="default_value"
			type="textarea"
			label="COM_FIELDS_FIELD_DEFAULT_VALUE_LABEL"
			description="COM_FIELDS_FIELD_DEFAULT_VALUE_DESC"
			filter="raw"
		/>

		<field
			name="state"
			type="list"
			label="JSTATUS"
			description="JFIELD_PUBLISHED_DESC"
			class="chzn-color-state"
			default="1"
			size="1"
			>
			<option value="1">JPUBLISHED</option>
			<option value="0">JUNPUBLISHED</option>
			<option value="2">JARCHIVED</option>
			<option value="-2">JTRASHED</option>
		</field>

		<field
			name="buttonspacer"
			type="spacer"
			label="JGLOBAL_ACTION_PERMISSIONS_LABEL"
			description="JGLOBAL_ACTION_PERMISSIONS_DESCRIPTION"
		/>

		<field
			name="checked_out"
			type="hidden"
			filter="unset"
		/>

		<field
			name="checked_out_time"
			type="hidden"
			filter="unset"
		/>

		<field
			name="created_user_id"
			type="user"
			label="JGLOBAL_FIELD_CREATED_BY_LABEL"
			description="JGLOBAL_FIELD_CREATED_BY_DESC"
		/>

		<field
			name="created_time"
			type="calendar"
			label="JGLOBAL_CREATED_DATE"
			translateformat="true"
			showtime="true"
			size="22"
			filter="user_utc"
		/>

		<field
			name="modified_by"
			type="user"
			label="JGLOBAL_FIELD_MODIFIED_BY_LABEL"
			class="readonly"
			readonly="true"
			filter="unset"
		/>

		<field
			name="modified_time"
			type="calendar"
			label="JGLOBAL_FIELD_MODIFIED_LABEL"
			class="readonly"
			translateformat="true"
			showtime="true"
			size="22"
			readonly="true"
			filter="user_utc"
		/>

		<field
			name="language"
			type="contentlanguage"
			label="JFIELD_LANGUAGE_LABEL"
			description="COM_FIELDS_FIELD_LANGUAGE_DESC"
			>
			<option value="*">JALL</option>
		</field>

		<field
			name="note"
			type="text"
			label="COM_FIELDS_FIELD_NOTE_LABEL"
			description="COM_FIELDS_FIELD_NOTE_DESC"
			class="span12"
			size="40"
		/>

		<field
			name="label"
			type="text"
			label="COM_FIELDS_FIELD_LABEL_LABEL"
			description="COM_FIELDS_FIELD_LABEL_DESC"
			size="40"
			hint="JFIELD_ALIAS_PLACEHOLDER"
		/>

		<field
			name="description"
			type="textarea"
			label="JGLOBAL_DESCRIPTION"
			description="COM_FIELDS_FIELD_DESCRIPTION_DESC"
			size="40"
			filter="HTML"
		/>

		<field
			name="access"
			type="accesslevel"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
		/>

		<field
			name="rules"
			type="rules"
			label="JFIELD_RULES_LABEL"
			id="rules"
			translate_label="false"
			filter="rules"
			validate="rules"
			section="field"
		/>

		<field
			name="ordering"
			type="text"
			label="JFIELD_ORDERING_LABEL"
			description="JFIELD_ORDERING_DESC"
			class="inputbox"
		/>
	</fieldset>

	<fields name="params" label="COM_FIELDS_FIELD_BASIC_LABEL">
		<fieldset name="basic">

			<field
				name="formoptions"
				type="note"
				label="COM_FIELDS_FIELD_FORMOPTIONS_HEADING"
			/>

			<field
				name="hint"
				type="text"
				label="COM_FIELDS_FIELD_PLACEHOLDER_LABEL"
				description="COM_FIELDS_FIELD_PLACEHOLDER_DESC"
				class="input-xxlarge"
				size="40"
			/>

			<field
				name="class"
				type="textarea"
				label="COM_FIELDS_FIELD_CLASS_LABEL"
				description="COM_FIELDS_FIELD_CLASS_DESC"
				class="input-xxlarge"
				validate="CssIdentifierSubstring"
				size="40"
			/>

			<field
				name="label_class"
				type="textarea"
				label="COM_FIELDS_FIELD_LABEL_FORM_CLASS_LABEL"
				description="COM_FIELDS_FIELD_LABEL_FORM_CLASS_DESC"
				class="input-xxlarge"
				validate="CssIdentifierSubstring"
				size="40"
			/>

			<field
				name="show_on"
				type="radio"
				label="COM_FIELDS_FIELD_EDITABLE_IN_LABEL"
				description="COM_FIELDS_FIELD_EDITABLE_IN_DESC"
				class="btn-group btn-group-yesno"
				default=""
				>
				<option value="1">COM_FIELDS_FIELD_EDITABLE_IN_SITE</option>
				<option value="2">COM_FIELDS_FIELD_EDITABLE_IN_ADMIN</option>
				<option value="">COM_FIELDS_FIELD_EDITABLE_IN_BOTH</option>
			</field>

			<field
				name="renderoptions"
				type="note"
				label="COM_FIELDS_FIELD_RENDEROPTIONS_HEADING"
			/>

			<field
				name="render_class"
				type="textarea"
				label="COM_FIELDS_FIELD_RENDER_CLASS_LABEL"
				description="COM_FIELDS_FIELD_RENDER_CLASS_DESC"
				class="input-xxlarge"
				validate="CssIdentifierSubstring"
				size="40"
			/>
			
			<field
				name="value_render_class"
				type="textarea"
				label="COM_FIELDS_FIELD_VALUE_RENDER_CLASS_LABEL"
				description="COM_FIELDS_FIELD_VALUE_RENDER_CLASS_DESC"
				class="input-xxlarge"
				validate="CssIdentifierSubstring"
				size="40"
			/>

			<field
				name="showlabel"
				type="radio"
				label="COM_FIELDS_FIELD_SHOWLABEL_LABEL"
				description="COM_FIELDS_FIELD_SHOWLABEL_DESC"
				class="btn-group btn-group-yesno"
				default="1"
				>
				<option value="1">JSHOW</option>
				<option value="0">JHIDE</option>
			</field>

			<field
				name="label_render_class"
				type="textarea"
				label="COM_FIELDS_FIELD_LABEL_RENDER_CLASS_LABEL"
				description="COM_FIELDS_FIELD_LABEL_RENDER_CLASS_DESC"
				class="input-xxlarge"
				size="40"
				validate="CssIdentifierSubstring"
				showon="showlabel:1"
			/>

			<field
				name="display"
				type="list"
				label="COM_FIELDS_FIELD_DISPLAY_LABEL"
				description="COM_FIELDS_FIELD_DISPLAY_DESC"
				default="2"
				>
				<option value="1">COM_FIELDS_FIELD_DISPLAY_AFTER_TITLE</option>
				<option value="2">COM_FIELDS_FIELD_DISPLAY_BEFORE_DISPLAY</option>
				<option value="3">COM_FIELDS_FIELD_DISPLAY_AFTER_DISPLAY</option>
				<option value="0">COM_FIELDS_FIELD_DISPLAY_NO_DISPLAY</option>
			</field>

			<field
				name="layout"
				type="fieldlayout"
				label="COM_FIELDS_FIELD_LAYOUT_LABEL"
				description="COM_FIELDS_FIELD_LAYOUT_DESC"
			/>

			<field
				name="display_readonly"
				type="radio"
				label="JFIELD_DISPLAY_READONLY_LABEL"
				description="JFIELD_DISPLAY_READONLY_DESC"
				class="btn-group btn-group-yesno"
				default="2"
				>
				<option value="2">JGLOBAL_INHERIT</option>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>
		</fieldset>
	</fields>
</form>
components/com_fields/models/forms/group.xml000060400000005725152453623460015343 0ustar00<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset>
		<field
			name="id"
			type="number"
			label="JGLOBAL_FIELD_ID_LABEL"
			description="JGLOBAL_FIELD_ID_DESC"
			default="0"
			class="readonly"
			readonly="true"
		/>

		<field
			name="asset_id"
			type="hidden"
			filter="unset"
		/>

		<field
			name="context"
			type="hidden"
			class="readonly"
			readonly="true"
		/>

		<field
			name="title"
			type="text"
			label="JGLOBAL_TITLE"
			description="JFIELD_TITLE_DESC"
			class="input-xxlarge input-large-text"
			size="40"
			required="true"
		/>

		<field
			name="state"
			type="list"
			label="JSTATUS"
			description="JFIELD_PUBLISHED_DESC"
			class="chzn-color-state"
			default="1"
			>
			<option value="1">JPUBLISHED</option>
			<option value="0">JUNPUBLISHED</option>
			<option value="2">JARCHIVED</option>
			<option value="-2">JTRASHED</option>
		</field>

		<field
			name="checked_out"
			type="hidden"
			filter="unset"
		/>

		<field
			name="checked_out_time"
			type="hidden"
			filter="unset"
		/>

		<field
			name="created"
			type="calendar"
			label="JGLOBAL_CREATED_DATE"
			translateformat="true"
			showtime="true"
			size="22"
			filter="user_utc"
		/>

		<field
			name="created_by"
			type="user"
			label="JGLOBAL_FIELD_CREATED_BY_LABEL"
			description="JGLOBAL_FIELD_CREATED_BY_DESC"
		/>

		<field
			name="modified"
			type="calendar"
			label="JGLOBAL_FIELD_MODIFIED_LABEL"
			translateformat="true"
			showtime="true"
			size="22"
			class="readonly"
			readonly="true"
			filter="user_utc"
		/>

		<field
			name="modified_by"
			type="user"
			label="JGLOBAL_FIELD_MODIFIED_BY_LABEL"
			class="readonly"
			readonly="true"
			filter="unset"
		/>

		<field
			name="language"
			type="contentlanguage"
			label="JFIELD_LANGUAGE_LABEL"
			description="COM_FIELDS_FIELD_LANGUAGE_DESC"
			>
			<option value="*">JALL</option>
		</field>

		<field
			name="note"
			type="text"
			label="COM_FIELDS_FIELD_NOTE_LABEL"
			description="COM_FIELDS_FIELD_NOTE_DESC"
			class="span12"
			size="40"
		/>

		<field
			name="description"
			type="textarea"
			label="JGLOBAL_DESCRIPTION"
			size="40"
			filter="HTML"
		/>

		<field
			name="access"
			type="accesslevel"
			label="JFIELD_ACCESS_LABEL"
			description="JFIELD_ACCESS_DESC"
		/>

		<field
			name="rules"
			type="rules"
			label="JFIELD_RULES_LABEL"
			id="rules"
			translate_label="false"
			filter="rules"
			validate="rules"
			section="fieldgroup"
		/>

		<field
			name="ordering"
			type="text"
			label="JFIELD_ORDERING_LABEL"
			description="JFIELD_ORDERING_DESC"
			class="inputbox"
		/>
	</fieldset>

	<fields name="params" label="COM_FIELDS_FIELD_BASIC_LABEL">
		<fieldset name="basic">
			<field
				name="display_readonly"
				type="radio"
				label="JFIELD_DISPLAY_READONLY_LABEL"
				description="JFIELD_DISPLAY_READONLY_DESC"
				class="btn-group btn-group-yesno"
				default="1"
				>
				<option value="1">JYES</option>
				<option value="0">JNO</option>
			</field>
		</fieldset>
	</fields>
</form>
components/com_fields/helpers/fields.php000060400000046764152453623460014505 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

JLoader::register('JFolder', JPATH_LIBRARIES . '/joomla/filesystem/folder.php');

/**
 * FieldsHelper
 *
 * @since  3.7.0
 */
class FieldsHelper
{
	private static $fieldsCache = null;

	private static $fieldCache = null;

	/**
	 * Extracts the component and section from the context string which has to
	 * be in the format component.context.
	 *
	 * @param   string  $contextString  contextString
	 * @param   object  $item           optional item object
	 *
	 * @return  array|null
	 *
	 * @since   3.7.0
	 */
	public static function extract($contextString, $item = null)
	{
		$parts = explode('.', $contextString, 2);

		if (count($parts) < 2)
		{
			return null;
		}

		$component = $parts[0];
		$eName = str_replace('com_', '', $component);

		$path = JPath::clean(JPATH_ADMINISTRATOR . '/components/' . $component . '/helpers/' . $eName . '.php');

		if (file_exists($path))
		{
			$cName = ucfirst($eName) . 'Helper';

			JLoader::register($cName, $path);

			if (class_exists($cName) && is_callable(array($cName, 'validateSection')))
			{
				$section = call_user_func_array(array($cName, 'validateSection'), array($parts[1], $item));

				if ($section)
				{
					$parts[1] = $section;
				}
			}
		}

		return $parts;
	}

	/**
	 * Returns the fields for the given context.
	 * If the item is an object the returned fields do have an additional field
	 * "value" which represents the value for the given item. If the item has an
	 * assigned_cat_ids field, then additionally fields which belong to that
	 * category will be returned.
	 * Should the value being prepared to be shown in an HTML context then
	 * prepareValue must be set to true. No further escaping needs to be done.
	 * The values of the fields can be overridden by an associative array where the keys
	 * have to be a name and its corresponding value.
	 *
	 * @param   string    $context           The context of the content passed to the helper
	 * @param   stdClass  $item              item
	 * @param   int|bool  $prepareValue      (if int is display event): 1 - AfterTitle, 2 - BeforeDisplay, 3 - AfterDisplay, 0 - OFF
	 * @param   array     $valuesToOverride  The values to override
	 *
	 * @return  array
	 *
	 * @since   3.7.0
	 */
	public static function getFields($context, $item = null, $prepareValue = false, array $valuesToOverride = null)
	{
		if (self::$fieldsCache === null)
		{
			// Load the model			
			JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_fields/models', 'FieldsModel');

			self::$fieldsCache = JModelLegacy::getInstance('Fields', 'FieldsModel', array(
				'ignore_request' => true)
			);

			self::$fieldsCache->setState('filter.state', 1);
			self::$fieldsCache->setState('list.limit', 0);
		}

		if (is_array($item))
		{
			$item = (object) $item;
		}

		if (JLanguageMultilang::isEnabled() && isset($item->language) && $item->language != '*')
		{
			self::$fieldsCache->setState('filter.language', array('*', $item->language));
		}

		self::$fieldsCache->setState('filter.context', $context);
		self::$fieldsCache->setState('filter.assigned_cat_ids', array());

		/*
		 * If item has assigned_cat_ids parameter display only fields which
		 * belong to the category
		 */
		if ($item && (isset($item->catid) || isset($item->fieldscatid)))
		{
			$assignedCatIds = isset($item->catid) ? $item->catid : $item->fieldscatid;

			if (!is_array($assignedCatIds))
			{
				$assignedCatIds = explode(',', $assignedCatIds);
			}

			// Fields without any category assigned should show as well
			$assignedCatIds[] = 0;

			self::$fieldsCache->setState('filter.assigned_cat_ids', $assignedCatIds);
		}

		$fields = self::$fieldsCache->getItems();

		if ($fields === false)
		{
			return array();
		}

		if ($item && isset($item->id))
		{
			if (self::$fieldCache === null)
			{
				self::$fieldCache = JModelLegacy::getInstance('Field', 'FieldsModel', array('ignore_request' => true));
			}

			$fieldIds = array_map(
				function ($f)
				{
					return $f->id;
				},
				$fields
			);

			$fieldValues = self::$fieldCache->getFieldValues($fieldIds, $item->id);

			$new = array();

			foreach ($fields as $key => $original)
			{
				/*
				 * Doing a clone, otherwise fields for different items will
				 * always reference to the same object
				 */
				$field = clone $original;

				if ($valuesToOverride && key_exists($field->name, $valuesToOverride))
				{
					$field->value = $valuesToOverride[$field->name];
				}
				elseif ($valuesToOverride && key_exists($field->id, $valuesToOverride))
				{
					$field->value = $valuesToOverride[$field->id];
				}
				elseif (key_exists($field->id, $fieldValues))
				{
					$field->value = $fieldValues[$field->id];
				}

				if (!isset($field->value) || $field->value === '')
				{
					$field->value = $field->default_value;
				}

				$field->rawvalue = $field->value;

				// If boolean prepare, if int, it is the event type: 1 - After Title, 2 - Before Display, 3 - After Display, 0 - Do not prepare
				if ($prepareValue && (is_bool($prepareValue) || $prepareValue === (int) $field->params->get('display', '2')))
				{
					JPluginHelper::importPlugin('fields');

					$dispatcher = JEventDispatcher::getInstance();

					// Event allow plugins to modify the output of the field before it is prepared
					$dispatcher->trigger('onCustomFieldsBeforePrepareField', array($context, $item, &$field));

					// Gathering the value for the field
					$value = $dispatcher->trigger('onCustomFieldsPrepareField', array($context, $item, &$field));

					if (is_array($value))
					{
						$value = implode(' ', $value);
					}

					// Event allow plugins to modify the output of the prepared field
					$dispatcher->trigger('onCustomFieldsAfterPrepareField', array($context, $item, $field, &$value));

					// Assign the value
					$field->value = $value;
				}

				$new[$key] = $field;
			}

			$fields = $new;
		}

		return $fields;
	}

	/**
	 * Renders the layout file and data on the context and does a fall back to
	 * Fields afterwards.
	 *
	 * @param   string  $context      The context of the content passed to the helper
	 * @param   string  $layoutFile   layoutFile
	 * @param   array   $displayData  displayData
	 *
	 * @return  NULL|string
	 *
	 * @since  3.7.0
	 */
	public static function render($context, $layoutFile, $displayData)
	{
		$value = '';

		/*
		 * Because the layout refreshes the paths before the render function is
		 * called, so there is no way to load the layout overrides in the order
		 * template -> context -> fields.
		 * If there is no override in the context then we need to call the
		 * layout from Fields.
		 */
		if ($parts = self::extract($context))
		{
			// Trying to render the layout on the component from the context
			$value = JLayoutHelper::render($layoutFile, $displayData, null, array('component' => $parts[0], 'client' => 0));
		}

		if ($value == '')
		{
			// Trying to render the layout on Fields itself
			$value = JLayoutHelper::render($layoutFile, $displayData, null, array('component' => 'com_fields','client' => 0));
		}

		return $value;
	}

	/**
	 * PrepareForm
	 *
	 * @param   string  $context  The context of the content passed to the helper
	 * @param   JForm   $form     form
	 * @param   object  $data     data.
	 *
	 * @return  boolean
	 *
	 * @since   3.7.0
	 */
	public static function prepareForm($context, JForm $form, $data)
	{
		// Extracting the component and section
		$parts = self::extract($context);

		if (! $parts)
		{
			return true;
		}

		$context = $parts[0] . '.' . $parts[1];

		// When no fields available return here
		$fields = self::getFields($parts[0] . '.' . $parts[1], new JObject);

		if (! $fields)
		{
			return true;
		}

		$component = $parts[0];
		$section   = $parts[1];

		$assignedCatids = isset($data->catid) ? $data->catid : (isset($data->fieldscatid) ? $data->fieldscatid : $form->getValue('catid'));

		// Account for case that a submitted form has a multi-value category id field (e.g. a filtering form), just use the first category
		$assignedCatids = is_array($assignedCatids)
			? (int) reset($assignedCatids)
			: (int) $assignedCatids;

		if (!$assignedCatids && $formField = $form->getField('catid'))
		{
			$assignedCatids = $formField->getAttribute('default', null);

			// Choose the first category available
			$xml = new DOMDocument;
			$xml->loadHTML($formField->__get('input'));
			$options = $xml->getElementsByTagName('option');

			if (!$assignedCatids && $firstChoice = $options->item(0))
			{
				$assignedCatids = $firstChoice->getAttribute('value');
			}

			$data->fieldscatid = $assignedCatids;
		}

		/*
		 * If there is a catid field we need to reload the page when the catid
		 * is changed
		 */
		if ($form->getField('catid') && $parts[0] != 'com_fields')
		{
			/*
			 * Setting the onchange event to reload the page when the category
			 * has changed
			*/
			$form->setFieldAttribute('catid', 'onchange', 'categoryHasChanged(this);');

			// Preload spindle-wheel when we need to submit form due to category selector changed
			JFactory::getDocument()->addScriptDeclaration("
			function categoryHasChanged(element) {
				var cat = jQuery(element);
				if (cat.val() == '" . $assignedCatids . "')return;
				Joomla.loadingLayer('show');
				jQuery('input[name=task]').val('" . $section . ".reload');
				Joomla.submitform('" . $section . ".reload', element.form);
			}
			jQuery( document ).ready(function() {
				Joomla.loadingLayer('load');
				var formControl = '#" . $form->getFormControl() . "_catid';
				if (!jQuery(formControl).val() != '" . $assignedCatids . "'){jQuery(formControl).val('" . $assignedCatids . "');}
			});"
			);
		}

		// Getting the fields
		$fields = self::getFields($parts[0] . '.' . $parts[1], $data);

		if (!$fields)
		{
			return true;
		}

		$fieldTypes = self::getFieldTypes();

		// Creating the dom
		$xml = new DOMDocument('1.0', 'UTF-8');
		$fieldsNode = $xml->appendChild(new DOMElement('form'))->appendChild(new DOMElement('fields'));
		$fieldsNode->setAttribute('name', 'com_fields');

		// Organizing the fields according to their group
		$fieldsPerGroup = array(0 => array());

		foreach ($fields as $field)
		{
			if (!array_key_exists($field->type, $fieldTypes))
			{
				// Field type is not available
				continue;
			}

			if (!array_key_exists($field->group_id, $fieldsPerGroup))
			{
				$fieldsPerGroup[$field->group_id] = array();
			}

			if ($path = $fieldTypes[$field->type]['path'])
			{
				// Add the lookup path for the field
				JFormHelper::addFieldPath($path);
			}

			if ($path = $fieldTypes[$field->type]['rules'])
			{
				// Add the lookup path for the rule
				JFormHelper::addRulePath($path);
			}

			$fieldsPerGroup[$field->group_id][] = $field;
		}

		// On the front, sometimes the admin fields path is not included
		JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_fields/tables');

		$model = JModelLegacy::getInstance('Groups', 'FieldsModel', array('ignore_request' => true));
		$model->setState('filter.context', $context);

		/**
		 * $model->getItems() would only return existing groups, but we also
		 * have the 'default' group with id 0 which is not in the database,
		 * so we create it virtually here.
		 */
		$defaultGroup = new \stdClass;
		$defaultGroup->id = 0;
		$defaultGroup->title = '';
		$defaultGroup->description = '';
		$iterateGroups = array_merge(array($defaultGroup), $model->getItems());

		// Looping through the groups
		foreach ($iterateGroups as $group)
		{
			if (empty($fieldsPerGroup[$group->id]))
			{
				continue;
			}

			// Defining the field set
			/** @var DOMElement $fieldset */
			$fieldset = $fieldsNode->appendChild(new DOMElement('fieldset'));
			$fieldset->setAttribute('name', 'fields-' . $group->id);
			$fieldset->setAttribute('addfieldpath', '/administrator/components/' . $component . '/models/fields');
			$fieldset->setAttribute('addrulepath', '/administrator/components/' . $component . '/models/rules');

			$label       = $group->title;
			$description = $group->description;

			if (!$label)
			{
				$key = strtoupper($component . '_FIELDS_' . $section . '_LABEL');

				if (!JFactory::getLanguage()->hasKey($key))
				{
					$key = 'JGLOBAL_FIELDS';
				}

				$label = $key;
			}

			if (!$description)
			{
				$key = strtoupper($component . '_FIELDS_' . $section . '_DESC');

				if (JFactory::getLanguage()->hasKey($key))
				{
					$description = $key;
				}
			}

			$fieldset->setAttribute('label', $label);
			$fieldset->setAttribute('description', strip_tags($description));

			// Looping through the fields for that context
			foreach ($fieldsPerGroup[$group->id] as $field)
			{
				try
				{
					JFactory::getApplication()->triggerEvent('onCustomFieldsPrepareDom', array($field, $fieldset, $form));

					/*
					 * If the field belongs to an assigned_cat_id but the assigned_cat_ids in the data
					 * is not known, set the required flag to false on any circumstance.
					 */
					if (!$assignedCatids && !empty($field->assigned_cat_ids) && $form->getField($field->name))
					{
						$form->setFieldAttribute($field->name, 'required', 'false');
					}
				}
				catch (Exception $e)
				{
					JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
				}
			}

			// When the field set is empty, then remove it
			if (!$fieldset->hasChildNodes())
			{
				$fieldsNode->removeChild($fieldset);
			}
		}

		// Loading the XML fields string into the form
		$form->load($xml->saveXML());

		$model = JModelLegacy::getInstance('Field', 'FieldsModel', array('ignore_request' => true));

		if ((!isset($data->id) || !$data->id) && JFactory::getApplication()->input->getCmd('controller') == 'config.display.modules'
			&& JFactory::getApplication()->isClient('site'))
		{
			// Modules on front end editing don't have data and an id set
			$data->id = JFactory::getApplication()->input->getInt('id');
		}

		// Looping through the fields again to set the value
		if (!isset($data->id) || !$data->id)
		{
			return true;
		}

		foreach ($fields as $field)
		{
			$value = $model->getFieldValue($field->id, $data->id);

			if ($value === null)
			{
				continue;
			}

			if (!is_array($value) && $value !== '')
			{
				// Function getField doesn't cache the fields, so we try to do it only when necessary
				$formField = $form->getField($field->name, 'com_fields');

				if ($formField && $formField->forceMultiple)
				{
					$value = (array) $value;
				}
			}

			// Setting the value on the field
			$form->setValue($field->name, 'com_fields', $value);
		}

		return true;
	}

	/**
	 * Return a boolean if the actual logged in user can edit the given field value.
	 *
	 * @param   stdClass  $field  The field
	 *
	 * @return  boolean
	 *
	 * @since   3.7.0
	 */
	public static function canEditFieldValue($field)
	{
		$parts = self::extract($field->context);

		return JFactory::getUser()->authorise('core.edit.value', $parts[0] . '.field.' . (int) $field->id);
	}

	/**
	 * Return a boolean based on field (and field group) display / show_on settings
	 *
	 * @param   stdClass  $field  The field
	 *
	 * @return  boolean
	 *
	 * @since   3.8.7
	 */
	public static function displayFieldOnForm($field)
	{
		$app = JFactory::getApplication();

		// Detect if the field should be shown at all
		if ($field->params->get('show_on') == 1 && $app->isClient('administrator'))
		{
			return false;
		}
		elseif ($field->params->get('show_on') == 2 && $app->isClient('site'))
		{
			return false;
		}

		if (!self::canEditFieldValue($field))
		{
			$fieldDisplayReadOnly = $field->params->get('display_readonly', '2');

			if ($fieldDisplayReadOnly == '2')
			{
				// Inherit from field group display read-only setting
				$groupModel = JModelLegacy::getInstance('Group', 'FieldsModel', array('ignore_request' => true));
				$groupDisplayReadOnly = $groupModel->getItem($field->group_id)->params->get('display_readonly', '1');
				$fieldDisplayReadOnly = $groupDisplayReadOnly;
			}

			if ($fieldDisplayReadOnly == '0')
			{
				// Do not display field on form when field is read-only
				return false;
			}
		}

		// Display field on form
		return true;
	}

	/**
	 * Gets assigned categories titles for a field
	 *
	 * @param   stdClass[]  $fieldId  The field ID
	 *
	 * @return  array  Array with the assigned categories
	 *
	 * @since   3.7.0
	 */
	public static function getAssignedCategoriesTitles($fieldId)
	{
		$fieldId = (int) $fieldId;

		if (!$fieldId)
		{
			return array();
		}

		$db    = JFactory::getDbo();
		$query = $db->getQuery(true);

		$query->select($db->quoteName('c.title'))
			->from($db->quoteName('#__fields_categories', 'a'))
			->join('INNER', $db->quoteName('#__categories', 'c') . ' ON a.category_id = c.id')
			->where('field_id = ' . $fieldId);

		$db->setQuery($query);

		return $db->loadColumn();
	}

	/**
	 * Gets the fields system plugin extension id.
	 *
	 * @return  integer  The fields system plugin extension id.
	 *
	 * @since   3.7.0
	 */
	public static function getFieldsPluginId()
	{
		$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('fields'));
		$db->setQuery($query);

		try
		{
			$result = (int) $db->loadResult();
		}
		catch (RuntimeException $e)
		{
			JError::raiseWarning(500, $e->getMessage());
			$result = 0;
		}

		return $result;
	}

	/**
	 * Configure the Linkbar.
	 *
	 * @param   string  $context  The context the fields are used for
	 * @param   string  $vName    The view currently active
	 *
	 * @return  void
	 *
	 * @since    3.7.0
	 */
	public static function addSubmenu($context, $vName)
	{
		$parts = self::extract($context);

		if (!$parts)
		{
			return;
		}

		$component = $parts[0];

		// Avoid nonsense situation.
		if ($component == 'com_fields')
		{
			return;
		}

		// 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))
		{
			return;
		}

		require_once $file;

		$cName = ucfirst($eName) . 'Helper';

		if (class_exists($cName) && is_callable(array($cName, 'addSubmenu')))
		{
			$lang = JFactory::getLanguage();
			$lang->load($component, JPATH_ADMINISTRATOR)
			|| $lang->load($component, JPATH_ADMINISTRATOR . '/components/' . $component);

			$cName::addSubmenu('fields.' . $vName);
		}
	}

	/**
	 * Loads the fields plugins and returns an array of field types from the plugins.
	 *
	 * The returned array contains arrays with the following keys:
	 * - label: The label of the field
	 * - type:  The type of the field
	 * - path:  The path of the folder where the field can be found
	 *
	 * @return  array
	 *
	 * @since   3.7.0
	 */
	public static function getFieldTypes()
	{
		JPluginHelper::importPlugin('fields');
		$eventData = JEventDispatcher::getInstance()->trigger('onCustomFieldsGetTypes');

		$data = array();

		foreach ($eventData as $fields)
		{
			foreach ($fields as $fieldDescription)
			{
				if (!array_key_exists('path', $fieldDescription))
				{
					$fieldDescription['path'] = null;
				}

				if (!array_key_exists('rules', $fieldDescription))
				{
					$fieldDescription['rules'] = null;
				}

				$data[$fieldDescription['type']] = $fieldDescription;
			}
		}

		return $data;
	}

	/**
	 * Clears the internal cache for the custom fields.
	 *
	 * @return  void
	 *
	 * @since   3.8.0
	 */
	public static function clearFieldsCache()
	{
		self::$fieldCache  = null;
		self::$fieldsCache = null;
	}
}
components/com_fields/tables/group.php000060400000010704152453623460014164 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

use Joomla\Registry\Registry;

/**
 * Groups Table
 *
 * @since  3.7.0
 */
class FieldsTableGroup extends JTable
{
	/**
	 * Class constructor.
	 *
	 * @param   JDatabaseDriver  $db  JDatabaseDriver object.
	 *
	 * @since   3.7.0
	 */
	public function __construct($db = null)
	{
		parent::__construct('#__fields_groups', 'id', $db);

		$this->setColumnAlias('published', 'state');
	}

	/**
	 * Method to bind an associative array or object to the JTable instance.This
	 * method only binds properties that are publicly accessible and optionally
	 * takes an array of properties to ignore when binding.
	 *
	 * @param   mixed  $src     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   3.7.0
	 * @throws  InvalidArgumentException
	 */
	public function bind($src, $ignore = '')
	{
		if (isset($src['params']) && is_array($src['params']))
		{
			$registry = new Registry;
			$registry->loadArray($src['params']);
			$src['params'] = (string) $registry;
		}

		// Bind the rules.
		if (isset($src['rules']) && is_array($src['rules']))
		{
			$rules = new JAccessRules($src['rules']);
			$this->setRules($rules);
		}

		return parent::bind($src, $ignore);
	}

	/**
	 * Method to perform sanity checks on the JTable instance properties to ensure
	 * they are safe to store in the database.  Child classes should override this
	 * method to make sure the data they are storing in the database is safe and
	 * as expected before storage.
	 *
	 * @return  boolean  True if the instance is sane and able to be stored in the database.
	 *
	 * @link    https://docs.joomla.org/Special:MyLanguage/JTable/check
	 * @since   3.7.0
	 */
	public function check()
	{
		// Check for a title.
		if (trim($this->title) == '')
		{
			$this->setError(JText::_('COM_FIELDS_MUSTCONTAIN_A_TITLE_GROUP'));

			return false;
		}

		$date = JFactory::getDate();
		$user = JFactory::getUser();

		if ($this->id)
		{
			$this->modified = $date->toSql();
			$this->modified_by = $user->get('id');
		}
		else
		{
			if (!(int) $this->created)
			{
				$this->created = $date->toSql();
			}

			if (empty($this->created_by))
			{
				$this->created_by = $user->get('id');
			}
		}

		return true;
	}

	/**
	 * Method to compute the default name of the asset.
	 * The default name is in the form table_name.id
	 * where id is the value of the primary key of the table.
	 *
	 * @return  string
	 *
	 * @since   3.7.0
	 */
	protected function _getAssetName()
	{
		$component = explode('.', $this->context);

		return $component[0] . '.fieldgroup.' . (int) $this->id;
	}

	/**
	 * Method to return the title to use for the asset table.  In
	 * tracking the assets a title is kept for each asset so that there is some
	 * context available in a unified access manager.  Usually this would just
	 * return $this->title or $this->name or whatever is being used for the
	 * primary name of the row. If this method is not overridden, the asset name is used.
	 *
	 * @return  string  The string to use as the title in the asset table.
	 *
	 * @link    https://docs.joomla.org/Special:MyLanguage/JTable/getAssetTitle
	 * @since   3.7.0
	 */
	protected function _getAssetTitle()
	{
		return $this->title;
	}

	/**
	 * Method to get the parent asset under which to register this one.
	 * By default, all assets are registered to the ROOT node with ID,
	 * which will default to 1 if none exists.
	 * The extended class can define a table and id to lookup.  If the
	 * asset does not exist it will be created.
	 *
	 * @param   JTable   $table  A JTable object for the asset parent.
	 * @param   integer  $id     Id to look up
	 *
	 * @return  integer
	 *
	 * @since   3.7.0
	 */
	protected function _getAssetParentId(JTable $table = null, $id = null)
	{
		$component = explode('.', $this->context);
		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('id'))
			->from($db->quoteName('#__assets'))
			->where($db->quoteName('name') . ' = ' . $db->quote($component[0]));
		$db->setQuery($query);

		if ($assetId = (int) $db->loadResult())
		{
			return $assetId;
		}

		return parent::_getAssetParentId($table, $id);
	}
}
components/com_fields/tables/field.php000060400000014153152453623460014115 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

use Joomla\Registry\Registry;

/**
 * Fields Table
 *
 * @since  3.7.0
 */
class FieldsTableField extends JTable
{
	/**
	 * Class constructor.
	 *
	 * @param   JDatabaseDriver  $db  JDatabaseDriver object.
	 *
	 * @since   3.7.0
	 */
	public function __construct($db = null)
	{
		parent::__construct('#__fields', 'id', $db);

		$this->setColumnAlias('published', 'state');
	}

	/**
	 * Method to bind an associative array or object to the JTable instance.This
	 * method only binds properties that are publicly accessible and optionally
	 * takes an array of properties to ignore when binding.
	 *
	 * @param   mixed  $src     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   3.7.0
	 * @throws  InvalidArgumentException
	 */
	public function bind($src, $ignore = '')
	{
		if (isset($src['params']) && is_array($src['params']))
		{
			$registry = new Registry;
			$registry->loadArray($src['params']);
			$src['params'] = (string) $registry;
		}

		if (isset($src['fieldparams']) && is_array($src['fieldparams']))
		{
			$registry = new Registry;
			$registry->loadArray($src['fieldparams']);
			$src['fieldparams'] = (string) $registry;
		}

		// Bind the rules.
		if (isset($src['rules']) && is_array($src['rules']))
		{
			$rules = new JAccessRules($src['rules']);
			$this->setRules($rules);
		}

		return parent::bind($src, $ignore);
	}

	/**
	 * Method to perform sanity checks on the JTable instance properties to ensure
	 * they are safe to store in the database.  Child classes should override this
	 * method to make sure the data they are storing in the database is safe and
	 * as expected before storage.
	 *
	 * @return  boolean  True if the instance is sane and able to be stored in the database.
	 *
	 * @link    https://docs.joomla.org/Special:MyLanguage/JTable/check
	 * @since   3.7.0
	 */
	public function check()
	{
		// Check for valid name
		if (trim($this->title) == '')
		{
			$this->setError(JText::_('COM_FIELDS_MUSTCONTAIN_A_TITLE_FIELD'));

			return false;
		}

		if (empty($this->name))
		{
			$this->name = $this->title;
		}

		$this->name = JApplicationHelper::stringURLSafe($this->name, $this->language);

		if (trim(str_replace('-', '', $this->name)) == '')
		{
			$this->name = Joomla\String\StringHelper::increment($this->name, 'dash');
		}

		$this->name = str_replace(',', '-', $this->name);

		// Verify that the name is unique
		$table = JTable::getInstance('Field', 'FieldsTable', array('dbo' => $this->_db));

		if ($table->load(array('name' => $this->name)) && ($table->id != $this->id || $this->id == 0))
		{
			$this->setError(JText::_('COM_FIELDS_ERROR_UNIQUE_NAME'));

			return false;
		}

		$this->name = str_replace(',', '-', $this->name);

		if (empty($this->type))
		{
			$this->type = 'text';
		}

		$date = JFactory::getDate();
		$user = JFactory::getUser();

		if ($this->id)
		{
			// Existing item
			$this->modified_time = $date->toSql();
			$this->modified_by = $user->get('id');
		}
		else
		{
			if (!(int) $this->created_time)
			{
				$this->created_time = $date->toSql();
			}

			if (empty($this->created_user_id))
			{
				$this->created_user_id = $user->get('id');
			}
		}

		if (empty($this->group_id))
		{
			$this->group_id = 0;
		}

		return true;
	}

	/**
	 * Method to compute the default name of the asset.
	 * The default name is in the form table_name.id
	 * where id is the value of the primary key of the table.
	 *
	 * @return  string
	 *
	 * @since   3.7.0
	 */
	protected function _getAssetName()
	{
		$contextArray = explode('.', $this->context);

		return $contextArray[0] . '.field.' . (int) $this->id;
	}

	/**
	 * Method to return the title to use for the asset table.  In
	 * tracking the assets a title is kept for each asset so that there is some
	 * context available in a unified access manager.  Usually this would just
	 * return $this->title or $this->name or whatever is being used for the
	 * primary name of the row. If this method is not overridden, the asset name is used.
	 *
	 * @return  string  The string to use as the title in the asset table.
	 *
	 * @link    https://docs.joomla.org/Special:MyLanguage/JTable/getAssetTitle
	 * @since   3.7.0
	 */
	protected function _getAssetTitle()
	{
		return $this->title;
	}

	/**
	 * Method to get the parent asset under which to register this one.
	 * By default, all assets are registered to the ROOT node with ID,
	 * which will default to 1 if none exists.
	 * The extended class can define a table and id to lookup.  If the
	 * asset does not exist it will be created.
	 *
	 * @param   JTable   $table  A JTable object for the asset parent.
	 * @param   integer  $id     Id to look up
	 *
	 * @return  integer
	 *
	 * @since   3.7.0
	 */
	protected function _getAssetParentId(JTable $table = null, $id = null)
	{
		$contextArray = explode('.', $this->context);
		$component = $contextArray[0];

		if ($this->group_id)
		{
			$assetId = $this->getAssetId($component . '.fieldgroup.' . (int) $this->group_id);

			if ($assetId)
			{
				return $assetId;
			}
		}
		else
		{
			$assetId = $this->getAssetId($component);

			if ($assetId)
			{
				return $assetId;
			}
		}

		return parent::_getAssetParentId($table, $id);
	}

	/**
	 * Returns an asset id for the given name or false.
	 *
	 * @param   string  $name  The asset name
	 *
	 * @return  number|boolean
	 *
	 * @since    3.7.0
	 */
	private function getAssetId($name)
	{
		$db = $this->getDbo();
		$query = $db->getQuery(true)
			->select($db->quoteName('id'))
			->from($db->quoteName('#__assets'))
			->where($db->quoteName('name') . ' = ' . $db->quote($name));

		// Get the asset id from the database.
		$db->setQuery($query);

		$assetId = null;

		if ($result = $db->loadResult())
		{
			$assetId = (int) $result;

			if ($assetId)
			{
				return $assetId;
			}
		}

		return false;
	}
}
components/com_fields/views/group/view.html.php000060400000007101152453623460015761 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

/**
 * Group View
 *
 * @since  3.7.0
 */
class FieldsViewGroup extends JViewLegacy
{
	/**
	 * @var  JForm
	 *
	 * @since  3.7.0
	 */
	protected $form;

	/**
	 * @var  JObject
	 *
	 * @since  3.7.0
	 */
	protected $item;

	/**
	 * @var  JObject
	 *
	 * @since  3.7.0
	 */
	protected $state;

	/**
	 * The actions the user is authorised to perform
	 *
	 * @var  JObject
	 *
	 * @since  3.7.0
	 */
	protected $canDo;


	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @see     JViewLegacy::loadTemplate()
	 * @since   3.7.0
	 */
	public function display($tpl = null)
	{
		$this->form  = $this->get('Form');
		$this->item  = $this->get('Item');
		$this->state = $this->get('State');

		$component = '';
		$parts     = FieldsHelper::extract($this->state->get('filter.context'));

		if ($parts)
		{
			$component = $parts[0];
		}

		$this->canDo = JHelperContent::getActions($component, 'fieldgroup', $this->item->id);

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		JFactory::getApplication()->input->set('hidemainmenu', true);

		$this->addToolbar();

		return parent::display($tpl);
	}

	/**
	 * Adds the toolbar.
	 *
	 * @return  void
	 *
	 * @since   3.7.0
	 */
	protected function addToolbar()
	{
		$component = '';
		$parts     = FieldsHelper::extract($this->state->get('filter.context'));

		if ($parts)
		{
			$component = $parts[0];
		}

		$userId    = JFactory::getUser()->get('id');
		$canDo     = $this->canDo;

		$isNew      = ($this->item->id == 0);
		$checkedOut = !($this->item->checked_out == 0 || $this->item->checked_out == $userId);

		// Avoid nonsense situation.
		if ($component == 'com_fields')
		{
			return;
		}

		// Load component language file
		$lang = JFactory::getLanguage();
		$lang->load($component, JPATH_ADMINISTRATOR)
		|| $lang->load($component, JPath::clean(JPATH_ADMINISTRATOR . '/components/' . $component));

		$title = JText::sprintf('COM_FIELDS_VIEW_GROUP_' . ($isNew ? 'ADD' : 'EDIT') . '_TITLE', JText::_(strtoupper($component)));

		// Prepare the toolbar.
		JToolbarHelper::title(
			$title,
			'puzzle field-' . ($isNew ? 'add' : 'edit') . ' ' . substr($component, 4) . '-group-' .
			($isNew ? 'add' : 'edit')
		);

		// For new records, check the create permission.
		if ($isNew)
		{
			JToolbarHelper::apply('group.apply');
			JToolbarHelper::save('group.save');
			JToolbarHelper::save2new('group.save2new');
		}

		// If not checked out, can save the item.
		elseif (!$checkedOut && ($canDo->get('core.edit') || ($canDo->get('core.edit.own') && $this->item->created_by == $userId)))
		{
			JToolbarHelper::apply('group.apply');
			JToolbarHelper::save('group.save');

			if ($canDo->get('core.create'))
			{
				JToolbarHelper::save2new('group.save2new');
			}
		}

		// If an existing item, can save to a copy.
		if (!$isNew && $canDo->get('core.create'))
		{
			JToolbarHelper::save2copy('group.save2copy');
		}

		if (empty($this->item->id))
		{
			JToolbarHelper::cancel('group.cancel');
		}
		else
		{
			JToolbarHelper::cancel('group.cancel', 'JTOOLBAR_CLOSE');
		}

		JToolbarHelper::help('JHELP_COMPONENTS_FIELDS_FIELD_GROUPS_EDIT');
	}
}
components/com_fields/views/group/tmpl/edit.php000060400000005501152453623460015747 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');
JHtml::_('behavior.tabstate');
JHtml::_('formbehavior.chosen', 'select');

$app = JFactory::getApplication();
$input = $app->input;

JFactory::getDocument()->addScriptDeclaration('
	Joomla.submitbutton = function(task)
	{
		if (task == "group.cancel" || document.formvalidator.isValid(document.getElementById("item-form")))
		{
			Joomla.submitform(task, document.getElementById("item-form"));
		}
	};
');
?>

<form action="<?php echo JRoute::_('index.php?option=com_fields&layout=edit&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="item-form" class="form-validate">
	<?php echo JLayoutHelper::render('joomla.edit.title_alias', $this); ?>
	<div class="form-horizontal">
		<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'general')); ?>
		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'general', JText::_('COM_FIELDS_VIEW_FIELD_FIELDSET_GENERAL', true)); ?>
		<div class="row-fluid">
			<div class="span9">
				<?php echo $this->form->renderField('label'); ?>
				<?php echo $this->form->renderField('description'); ?>
			</div>
			<div class="span3">
				<?php $this->set('fields',
						array(
							array(
								'published',
								'state',
								'enabled',
							),
							'access',
							'language',
							'note',
						)
				); ?>
				<?php echo JLayoutHelper::render('joomla.edit.global', $this); ?>
				<?php $this->set('fields', null); ?>
			</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'publishing', JText::_('JGLOBAL_FIELDSET_PUBLISHING', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('joomla.edit.publishingdata', $this); ?>
			</div>
			<div class="span6">
			</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php $this->set('ignore_fieldsets', array('fieldparams')); ?>
		<?php echo JLayoutHelper::render('joomla.edit.params', $this); ?>
		<?php if ($this->canDo->get('core.admin')) : ?>
			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'rules', JText::_('JGLOBAL_ACTION_PERMISSIONS_LABEL', true)); ?>
			<?php echo $this->form->getInput('rules'); ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php endif; ?>
		<?php echo JHtml::_('bootstrap.endTabSet'); ?>
		<?php echo $this->form->getInput('context'); ?>
		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_fields/views/fields/view.html.php000060400000011676152453623460016107 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

/**
 * Fields View
 *
 * @since  3.7.0
 */
class FieldsViewFields extends JViewLegacy
{
	/**
	 * @var  JForm
	 *
	 * @since  3.7.0
	 */
	public $filterForm;

	/**
	 * @var  array
	 *
	 * @since  3.7.0
	 */
	public $activeFilters;

	/**
	 * @var  array
	 *
	 * @since  3.7.0
	 */
	protected $items;

	/**
	 * @var  JPagination
	 *
	 * @since  3.7.0
	 */
	protected $pagination;

	/**
	 * @var  JObject
	 *
	 * @since  3.7.0
	 */
	protected $state;

	/**
	 * @var  string
	 *
	 * @since  3.7.0
	 */
	protected $sidebar;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @see     JViewLegacy::loadTemplate()
	 * @since   3.7.0
	 */
	public function display($tpl = null)
	{
		$this->state         = $this->get('State');
		$this->items         = $this->get('Items');
		$this->pagination    = $this->get('Pagination');
		$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);
		}

		// Display a warning if the fields system plugin is disabled
		if (!JPluginHelper::isEnabled('system', 'fields'))
		{
			$link = JRoute::_('index.php?option=com_plugins&task=plugin.edit&extension_id=' . FieldsHelper::getFieldsPluginId());
			JFactory::getApplication()->enqueueMessage(JText::sprintf('COM_FIELDS_SYSTEM_PLUGIN_NOT_ENABLED', $link), 'warning');
		}

		// Only add toolbar when not in modal window.
		if ($this->getLayout() !== 'modal')
		{
			$this->addToolbar();
			FieldsHelper::addSubmenu($this->state->get('filter.context'), 'fields');
			$this->sidebar = JHtmlSidebar::render();
		}

		return parent::display($tpl);
	}

	/**
	 * Adds the toolbar.
	 *
	 * @return  void
	 *
	 * @since   3.7.0
	 */
	protected function addToolbar()
	{
		$fieldId   = $this->state->get('filter.field_id');
		$component = $this->state->get('filter.component');
		$section   = $this->state->get('filter.section');
		$canDo     = JHelperContent::getActions($component, 'field', $fieldId);

		// Get the toolbar object instance
		$bar = JToolBar::getInstance('toolbar');

		// Avoid nonsense situation.
		if ($component == 'com_fields')
		{
			return;
		}

		// Load extension language file
		$lang = JFactory::getLanguage();
		$lang->load($component, JPATH_ADMINISTRATOR)
		|| $lang->load($component, JPath::clean(JPATH_ADMINISTRATOR . '/components/' . $component));

		$title = JText::sprintf('COM_FIELDS_VIEW_FIELDS_TITLE', JText::_(strtoupper($component)));

		// Prepare the toolbar.
		JToolbarHelper::title($title, 'puzzle fields ' . substr($component, 4) . ($section ? "-$section" : '') . '-fields');

		if ($canDo->get('core.create'))
		{
			JToolbarHelper::addNew('field.add');
		}

		if ($canDo->get('core.edit') || $canDo->get('core.edit.own'))
		{
			JToolbarHelper::editList('field.edit');
		}

		if ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::publish('fields.publish', 'JTOOLBAR_PUBLISH', true);
			JToolbarHelper::unpublish('fields.unpublish', 'JTOOLBAR_UNPUBLISH', true);
			JToolbarHelper::archiveList('fields.archive');
		}

		if (JFactory::getUser()->authorise('core.admin'))
		{
			JToolbarHelper::checkin('fields.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') || $canDo->get('core.options'))
		{
			JToolbarHelper::preferences($component);
		}

		if ($this->state->get('filter.state') == -2 && $canDo->get('core.delete', $component))
		{
			JToolbarHelper::deleteList('', 'fields.delete', 'JTOOLBAR_EMPTY_TRASH');
		}
		elseif ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::trash('fields.trash');
		}

		JToolbarHelper::help('JHELP_COMPONENTS_FIELDS_FIELDS');
	}

	/**
	 * Returns the sort fields.
	 *
	 * @return  array
	 *
	 * @since   3.7.0
	 */
	protected function getSortFields()
	{
		return array(
			'a.ordering' => JText::_('JGRID_HEADING_ORDERING'),
			'a.state'    => JText::_('JSTATUS'),
			'a.title'    => JText::_('JGLOBAL_TITLE'),
			'a.type'     => JText::_('COM_FIELDS_FIELD_TYPE_LABEL'),
			'a.access'   => JText::_('JGRID_HEADING_ACCESS'),
			'a.language' => JText::_('JGRID_HEADING_LANGUAGE'),
			'a.id'       => JText::_('JGRID_HEADING_ID'),
		);
	}
}
components/com_fields/views/fields/tmpl/default.php000060400000020764152453623460016570 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$app       = JFactory::getApplication();
$user      = JFactory::getUser();
$userId    = $user->get('id');
$context   = $this->escape($this->state->get('filter.context'));
$component = $this->state->get('filter.component');
$section   = $this->state->get('filter.section');
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$ordering  = ($listOrder == 'a.ordering');
$saveOrder = ($listOrder == 'a.ordering' && strtolower($listDirn) == 'asc');

// The category object of the component
$category = JCategories::getInstance(str_replace('com_', '', $component) . '.' . $section);

// If there is no category for the component and section, so check the component only
if (!$category)
{
	$category = JCategories::getInstance(str_replace('com_', '', $component));
}

if ($saveOrder)
{
	$saveOrderingUrl = 'index.php?option=com_fields&task=fields.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'fieldList', 'adminForm', strtolower($listDirn), $saveOrderingUrl, false, true);
}
?>

<form action="<?php echo JRoute::_('index.php?option=com_fields&view=fields'); ?>" method="post" name="adminForm" id="adminForm">
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
		<div id="filter-bar" class="js-stools-container-bar pull-left">
			<div class="btn-group pull-left">
				<?php echo $this->filterForm->getField('context')->input; ?>
			</div>&nbsp;
		</div>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped" id="fieldList">
				<thead>
					<tr>
						<th width="1%" class="nowrap center hidden-phone">
							<?php echo JHtml::_('searchtools.sort', '', 'a.ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING', 'icon-menu-2'); ?>
						</th>
						<th width="1%" class="center">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
						</th>
						<th>
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
						</th>
						<th>
							<?php echo JHtml::_('searchtools.sort', 'COM_FIELDS_FIELD_TYPE_LABEL', 'a.type', $listDirn, $listOrder); ?>
						</th>
						<th>
							<?php echo JHtml::_('searchtools.sort', 'COM_FIELDS_FIELD_GROUP_LABEL', 'g.title', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ACCESS', 'a.access', $listDirn, $listOrder); ?>
						</th>
						<th width="5%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'a.language', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="9">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
					<?php foreach ($this->items as $i => $item) : ?>
						<?php $ordering   = ($listOrder == 'a.ordering'); ?>
						<?php $canEdit    = $user->authorise('core.edit', $component . '.field.' . $item->id); ?>
						<?php $canCheckin = $user->authorise('core.admin', 'com_checkin') || $item->checked_out == $userId || $item->checked_out == 0; ?>
						<?php $canEditOwn = $user->authorise('core.edit.own', $component . '.field.' . $item->id) && $item->created_user_id == $userId; ?>
						<?php $canChange  = $user->authorise('core.edit.state', $component . '.field.' . $item->id) && $canCheckin; ?>
						<tr class="row<?php echo $i % 2; ?>" item-id="<?php echo $item->id ?>">
							<td class="order nowrap center hidden-phone">
								<?php $iconClass = ''; ?>
								<?php if (!$canChange) : ?>
									<?php $iconClass = ' inactive'; ?>
								<?php elseif (!$saveOrder) : ?>
									<?php $iconClass = ' inactive tip-top hasTooltip" title="' . JHtml::tooltipText('JORDERINGDISABLED'); ?>
								<?php endif; ?>
								<span class="sortable-handler<?php echo $iconClass; ?>">
									<span class="icon-menu" aria-hidden="true"></span>
								</span>
								<?php if ($canChange && $saveOrder) : ?>
									<input type="text" style="display:none" name="order[]" size="5" value="<?php echo $item->ordering; ?>" />
								<?php endif; ?>
							</td>
							<td class="center">
								<?php echo JHtml::_('grid.id', $i, $item->id); ?>
							</td>
							<td class="center">
								<div class="btn-group">
									<?php echo JHtml::_('jgrid.published', $item->state, $i, 'fields.', $canChange, 'cb'); ?>
									<?php // Create dropdown items and render the dropdown list. ?>
									<?php if ($canChange) : ?>
										<?php JHtml::_('actionsdropdown.' . ((int) $item->state === 2 ? 'un' : '') . 'archive', 'cb' . $i, 'fields'); ?>
										<?php JHtml::_('actionsdropdown.' . ((int) $item->state === -2 ? 'un' : '') . 'trash', 'cb' . $i, 'fields'); ?>
										<?php echo JHtml::_('actionsdropdown.render', $this->escape($item->title)); ?>
									<?php endif; ?>
								</div>
							</td>
							<td>
								<div class="pull-left break-word">
									<?php if ($item->checked_out) : ?>
										<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'fields.', $canCheckin); ?>
									<?php endif; ?>
									<?php if ($canEdit || $canEditOwn) : ?>
										<a href="<?php echo JRoute::_('index.php?option=com_fields&task=field.edit&id=' . $item->id . '&context=' . $context); ?>">
											<?php echo $this->escape($item->title); ?></a>
									<?php else : ?>
										<?php echo $this->escape($item->title); ?>
									<?php endif; ?>
									<span class="small break-word">
										<?php if (empty($item->note)) : ?>
											<?php echo JText::sprintf('JGLOBAL_LIST_NAME', $this->escape($item->name)); ?>
										<?php else : ?>
											<?php echo JText::sprintf('JGLOBAL_LIST_NAME_NOTE', $this->escape($item->name), $this->escape($item->note)); ?>
										<?php endif; ?>
									</span>
									<div class="small">
										<?php if ($category) : ?>
											<?php echo JText::_('JCATEGORY') . ': '; ?>
											<?php $categories = FieldsHelper::getAssignedCategoriesTitles($item->id); ?>
											<?php if ($categories) : ?>
												<?php echo implode(', ', $categories); ?>
											<?php else : ?>
												<?php echo JText::_('JALL'); ?>
											<?php endif; ?>
										<?php endif; ?>
									</div>
								</div>
							</td>
							<td class="small">
								<?php echo $this->escape($item->type); ?>
							</td>
							<td>
								<?php echo $this->escape($item->group_title); ?>
							</td>
							<td class="small hidden-phone">
								<?php echo $this->escape($item->access_level); ?>
							</td>
							<td class="small nowrap hidden-phone">
								<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
							</td>
							<td class="center hidden-phone">
								<span><?php echo (int) $item->id; ?></span>
							</td>
						</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
			<?php //Load the batch processing form. ?>
			<?php if ($user->authorise('core.create', $component)
				&& $user->authorise('core.edit', $component)
				&& $user->authorise('core.edit.state', $component)) : ?>
				<?php echo JHtml::_(
						'bootstrap.renderModal',
						'collapseModal',
						array(
							'title' => JText::_('COM_FIELDS_VIEW_FIELDS_BATCH_OPTIONS'),
							'footer' => $this->loadTemplate('batch_footer')
						),
						$this->loadTemplate('batch_body')
					); ?>
			<?php endif; ?>
		<?php endif; ?>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_fields/views/fields/tmpl/modal.php000060400000011173152453623460016232 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

if (JFactory::getApplication()->isClient('site'))
{
	JSession::checkToken('get') or die(JText::_('JINVALID_TOKEN'));
}

JHtml::_('behavior.core');
JHtml::_('bootstrap.tooltip', '.hasTooltip', array('placement' => 'bottom'));
JHtml::_('bootstrap.popover', '.hasPopover', array('placement' => 'bottom'));
JHtml::_('formbehavior.chosen', 'select');
JHtml::_('script', 'com_fields/admin-fields-modal.js', array('version' => 'auto', 'relative' => true));

// 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'));

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$editor    = JFactory::getApplication()->input->get('editor', '', 'cmd');
?>
<div class="container-popup">

	<form action="<?php echo JRoute::_('index.php?option=com_fields&view=fields&layout=modal&tmpl=component&editor=' . $editor . '&' . JSession::getFormToken() . '=1'); ?>" method="post" name="adminForm" id="adminForm">

		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped" id="moduleList">
				<thead>
					<tr>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
						</th>
						<th class="title">
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
						</th>
						<th width="15%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_FIELDS_FIELD_GROUP_LABEL', 'g.title', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'COM_FIELDS_FIELD_TYPE_LABEL', 'a.type', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ACCESS', 'a.access', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'a.language', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="8">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
					<?php
					$iconStates = array(
						-2 => 'icon-trash',
						0  => 'icon-unpublish',
						1  => 'icon-publish',
						2  => 'icon-archive',
					);
					foreach ($this->items as $i => $item) :
					?>
					<tr class="row<?php echo $i % 2; ?>">
						<td class="center">
							<span class="<?php echo $iconStates[$this->escape($item->state)]; ?>" aria-hidden="true"></span>
						</td>
						<td class="has-context">
							<a class="btn btn-small btn-block btn-success" href="#" onclick="Joomla.fieldIns('<?php echo $this->escape($item->id); ?>', '<?php echo $this->escape($editor); ?>');"><?php echo $this->escape($item->title); ?></a>
						</td>
						<td class="small hidden-phone">
							<a class="btn btn-small btn-block btn-warning" href="#" onclick="Joomla.fieldgroupIns('<?php echo $this->escape($item->group_id); ?>', '<?php echo $this->escape($editor); ?>');"><?php echo $item->group_id ? $this->escape($item->group_title) : JText::_('JNONE'); ?></a>
						</td>
						<td class="small hidden-phone">
							<?php echo $item->type; ?>
						</td>
						<td class="small hidden-phone">
							<?php echo $this->escape($item->access_level); ?>
						</td>
						<td class="small hidden-phone">
							<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
						</td>
						<td class="hidden-phone">
							<?php echo (int) $item->id; ?>
						</td>
					</tr>
				<?php endforeach; ?>
				</tbody>
			</table>
		<?php endif; ?>

		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>

	</form>
</div>
components/com_fields/views/fields/tmpl/default_batch_body.php000060400000004433152453623460020741 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

JHtml::_('formbehavior.chosen', 'select');
JFactory::getDocument()->addScriptDeclaration(
	'
		jQuery(document).ready(function($){
			if ($("#batch-group-id").length){var batchSelector = $("#batch-group-id");}
			if ($("#batch-copy-move").length) {
				$("#batch-copy-move").hide();
				batchSelector.on("change", function(){
					if (batchSelector.val() != 0 || batchSelector.val() != "") {
						$("#batch-copy-move").show();
					} else {
						$("#batch-copy-move").hide();
					}
				});
			}
		});
			'
);

$context   = $this->escape($this->state->get('filter.context'));
?>

<div class="container-fluid">
	<div class="row-fluid">
		<div class="control-group span6">
			<div class="controls">
				<?php echo JLayoutHelper::render('joomla.html.batch.language', array()); ?>
			</div>
		</div>
		<div class="control-group span6">
			<div class="controls">
				<?php echo JLayoutHelper::render('joomla.html.batch.access', array()); ?>
			</div>
		</div>
	</div>
	<div class="row-fluid">
		<div class="control-group span6">
			<div class="controls">
				<?php $options = array(
					JHtml::_('select.option', 'c', JText::_('JLIB_HTML_BATCH_COPY')),
					JHtml::_('select.option', 'm', JText::_('JLIB_HTML_BATCH_MOVE'))
				);
				?>
				<label id="batch-choose-action-lbl" for="batch-choose-action"><?php echo JText::_('COM_FIELDS_BATCH_GROUP_LABEL'); ?></label>
				<div id="batch-choose-action" class="control-group">
					<select name="batch[group_id]" class="inputbox" id="batch-group-id">
						<option value=""><?php echo JText::_('JLIB_HTML_BATCH_NO_CATEGORY'); ?></option>
						<option value="nogroup"><?php echo JText::_('COM_FIELDS_BATCH_GROUP_OPTION_NONE'); ?></option>
						<?php echo JHtml::_('select.options', $this->get('Groups'), 'value', 'text'); ?>
					</select>
				</div>
				<div id="batch-copy-move" class="control-group radio">
					<?php echo JText::_('JLIB_HTML_BATCH_MOVE_QUESTION'); ?>
					<?php echo JHtml::_('select.radiolist', $options, 'batch[move_copy]', '', 'value', 'text', 'm'); ?>
				</div>
			</div>
		</div>
	</div>
</div>
components/com_fields/views/fields/tmpl/default_batch_footer.php000060400000001272152453623460021300 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

?>
<button type="button" class="btn" onclick="document.getElementById('batch-field-id').value='';document.getElementById('batch-access').value='';document.getElementById('batch-language-id').value=''" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<button type="submit" class="btn btn-success" onclick="Joomla.submitbutton('field.batch');return false;">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>
components/com_fields/views/groups/tmpl/default_batch_footer.php000060400000001272152453623460021351 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

?>
<button type="button" class="btn" onclick="document.getElementById('batch-field-id').value='';document.getElementById('batch-access').value='';document.getElementById('batch-language-id').value=''" data-dismiss="modal">
	<?php echo JText::_('JCANCEL'); ?>
</button>
<button type="submit" class="btn btn-success" onclick="Joomla.submitbutton('group.batch');return false;">
	<?php echo JText::_('JGLOBAL_BATCH_PROCESS'); ?>
</button>
components/com_fields/views/groups/tmpl/default_batch_body.php000060400000001274152453623460021012 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

JHtml::_('formbehavior.chosen', 'select');
?>

<div class="container-fluid">
	<div class="row-fluid">
		<div class="control-group span6">
			<div class="controls">
				<?php echo JLayoutHelper::render('joomla.html.batch.language', array()); ?>
			</div>
		</div>
		<div class="control-group span6">
			<div class="controls">
				<?php echo JLayoutHelper::render('joomla.html.batch.access', array()); ?>
			</div>
		</div>
	</div>
</div>
components/com_fields/views/groups/tmpl/default.php000060400000016201152453623460016630 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.multiselect');
JHtml::_('formbehavior.chosen', 'select');

$app       = JFactory::getApplication();
$user      = JFactory::getUser();
$userId    = $user->get('id');

$component = '';
$parts     = FieldsHelper::extract($this->state->get('filter.context'));

if ($parts)
{
	$component = $this->escape($parts[0]);
}

$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn  = $this->escape($this->state->get('list.direction'));
$ordering  = ($listOrder == 'a.ordering');
$saveOrder = ($listOrder == 'a.ordering' && strtolower($listDirn) == 'asc');

if ($saveOrder)
{
	$saveOrderingUrl = 'index.php?option=com_fields&task=groups.saveOrderAjax&tmpl=component';
	JHtml::_('sortablelist.sortable', 'groupList', 'adminForm', strtolower($listDirn), $saveOrderingUrl, false, true);
}
?>

<form action="<?php echo JRoute::_('index.php?option=com_fields&view=groups'); ?>" method="post" name="adminForm" id="adminForm">
	<div id="j-sidebar-container" class="span2">
		<?php echo $this->sidebar; ?>
	</div>
	<div id="j-main-container" class="span10">
		<div id="filter-bar" class="js-stools-container-bar pull-left">
			<div class="btn-group pull-left">
				<?php echo $this->filterForm->getField('context')->input; ?>
			</div>&nbsp;
		</div>
		<?php echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this)); ?>
		<?php if (empty($this->items)) : ?>
			<div class="alert alert-no-items">
				<?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
			</div>
		<?php else : ?>
			<table class="table table-striped" id="groupList">
				<thead>
					<tr>
						<th width="1%" class="nowrap center hidden-phone">
							<?php echo JHtml::_('searchtools.sort', '', 'a.ordering', $listDirn, $listOrder, null, 'asc', 'JGRID_HEADING_ORDERING', 'icon-menu-2'); ?>
						</th>
						<th width="1%" class="center">
							<?php echo JHtml::_('grid.checkall'); ?>
						</th>
						<th width="1%" class="nowrap center">
							<?php echo JHtml::_('searchtools.sort', 'JSTATUS', 'a.state', $listDirn, $listOrder); ?>
						</th>
						<th>
							<?php echo JHtml::_('searchtools.sort', 'JGLOBAL_TITLE', 'a.title', $listDirn, $listOrder); ?>
						</th>
						<th width="10%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ACCESS', 'a.access', $listDirn, $listOrder); ?>
						</th>
						<th width="5%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_LANGUAGE', 'a.language', $listDirn, $listOrder); ?>
						</th>
						<th width="1%" class="nowrap hidden-phone">
							<?php echo JHtml::_('searchtools.sort', 'JGRID_HEADING_ID', 'a.id', $listDirn, $listOrder); ?>
						</th>
					</tr>
				</thead>
				<tfoot>
					<tr>
						<td colspan="9">
							<?php echo $this->pagination->getListFooter(); ?>
						</td>
					</tr>
				</tfoot>
				<tbody>
					<?php foreach ($this->items as $i => $item) : ?>
						<?php $ordering   = ($listOrder == 'a.ordering'); ?>
						<?php $canEdit    = $user->authorise('core.edit', $component . '.fieldgroup.' . $item->id); ?>
						<?php $canCheckin = $user->authorise('core.admin', 'com_checkin') || $item->checked_out == $userId || $item->checked_out == 0; ?>
						<?php $canEditOwn = $user->authorise('core.edit.own', $component . '.fieldgroup.' . $item->id) && $item->created_by == $userId; ?>
						<?php $canChange  = $user->authorise('core.edit.state', $component . '.fieldgroup.' . $item->id) && $canCheckin; ?>
						<tr class="row<?php echo $i % 2; ?>" item-id="<?php echo $item->id ?>">
							<td class="order nowrap center hidden-phone">
								<?php $iconClass = ''; ?>
								<?php if (!$canChange) : ?>
									<?php $iconClass = ' inactive'; ?>
								<?php elseif (!$saveOrder) : ?>
									<?php $iconClass = ' inactive tip-top hasTooltip" title="' . JHtml::tooltipText('JORDERINGDISABLED'); ?>
								<?php endif; ?>
								<span class="sortable-handler<?php echo $iconClass; ?>">
									<span class="icon-menu" aria-hidden="true"></span>
								</span>
								<?php if ($canChange && $saveOrder) : ?>
									<input type="text" style="display:none" name="order[]" size="5" value="<?php echo $item->ordering; ?>" />
								<?php endif; ?>
							</td>
							<td class="center">
								<?php echo JHtml::_('grid.id', $i, $item->id); ?>
							</td>
							<td class="center">
								<div class="btn-group">
									<?php echo JHtml::_('jgrid.published', $item->state, $i, 'groups.', $canChange, 'cb'); ?>
									<?php // Create dropdown items and render the dropdown list. ?>
									<?php if ($canChange) : ?>
										<?php JHtml::_('actionsdropdown.' . ((int) $item->state === 2 ? 'un' : '') . 'archive', 'cb' . $i, 'groups'); ?>
										<?php JHtml::_('actionsdropdown.' . ((int) $item->state === -2 ? 'un' : '') . 'trash', 'cb' . $i, 'groups'); ?>
										<?php echo JHtml::_('actionsdropdown.render', $this->escape($item->title)); ?>
									<?php endif; ?>
								</div>
							</td>
							<td>
								<div class="pull-left break-word">
									<?php if ($item->checked_out) : ?>
										<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'groups.', $canCheckin); ?>
									<?php endif; ?>
									<?php if ($canEdit || $canEditOwn) : ?>
										<a href="<?php echo JRoute::_('index.php?option=com_fields&task=group.edit&id=' . $item->id); ?>">
											<?php echo $this->escape($item->title); ?></a>
									<?php else : ?>
										<?php echo $this->escape($item->title); ?>
									<?php endif; ?>
									<span class="small break-word">
										<?php if ($item->note) : ?>
											<?php echo JText::sprintf('JGLOBAL_LIST_NOTE', $this->escape($item->note)); ?>
										<?php endif; ?>
									</span>
								</div>
							</td>
							<td class="small hidden-phone">
								<?php echo $this->escape($item->access_level); ?>
							</td>
							<td class="small nowrap hidden-phone">
								<?php echo JLayoutHelper::render('joomla.content.language', $item); ?>
							</td>
							<td class="center hidden-phone">
								<span><?php echo (int) $item->id; ?></span>
							</td>
						</tr>
					<?php endforeach; ?>
				</tbody>
			</table>
			<?php //Load the batch processing form. ?>
			<?php if ($user->authorise('core.create', $component)
				&& $user->authorise('core.edit', $component)
				&& $user->authorise('core.edit.state', $component)) : ?>
				<?php echo JHtml::_(
						'bootstrap.renderModal',
						'collapseModal',
						array(
							'title' => JText::_('COM_FIELDS_VIEW_GROUPS_BATCH_OPTIONS'),
							'footer' => $this->loadTemplate('batch_footer')
						),
						$this->loadTemplate('batch_body')
					); ?>
			<?php endif; ?>
		<?php endif; ?>
		<input type="hidden" name="task" value="" />
		<input type="hidden" name="boxchecked" value="0" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_fields/views/groups/view.html.php000060400000011561152453623460016151 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

/**
 * Groups View
 *
 * @since  3.7.0
 */
class FieldsViewGroups extends JViewLegacy
{
	/**
	 * @var  JForm
	 *
	 * @since  3.7.0
	 */
	public $filterForm;

	/**
	 * @var  array
	 *
	 * @since  3.7.0
	 */
	public $activeFilters;

	/**
	 * @var  array
	 *
	 * @since  3.7.0
	 */
	protected $items;

	/**
	 * @var  JPagination
	 *
	 * @since  3.7.0
	 */
	protected $pagination;

	/**
	 * @var  JObject
	 *
	 * @since  3.7.0
	 */
	protected $state;

	/**
	 * @var  string
	 *
	 * @since  3.7.0
	 */
	protected $sidebar;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @see     JViewLegacy::loadTemplate()
	 * @since   3.7.0
	 */
	public function display($tpl = null)
	{
		$this->state         = $this->get('State');
		$this->items         = $this->get('Items');
		$this->pagination    = $this->get('Pagination');
		$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);
		}

		// Display a warning if the fields system plugin is disabled
		if (!JPluginHelper::isEnabled('system', 'fields'))
		{
			$link = JRoute::_('index.php?option=com_plugins&task=plugin.edit&extension_id=' . FieldsHelper::getFieldsPluginId());
			JFactory::getApplication()->enqueueMessage(JText::sprintf('COM_FIELDS_SYSTEM_PLUGIN_NOT_ENABLED', $link), 'warning');
		}

		$this->addToolbar();

		FieldsHelper::addSubmenu($this->state->get('filter.context'), 'groups');
		$this->sidebar = JHtmlSidebar::render();

		return parent::display($tpl);
	}

	/**
	 * Adds the toolbar.
	 *
	 * @return  void
	 *
	 * @since   3.7.0
	 */
	protected function addToolbar()
	{
		$groupId   = $this->state->get('filter.group_id');
		$component = '';
		$parts     = FieldsHelper::extract($this->state->get('filter.context'));

		if ($parts)
		{
			$component = $parts[0];
		}

		$canDo     = JHelperContent::getActions($component, 'fieldgroup', $groupId);

		// Get the toolbar object instance
		$bar = JToolbar::getInstance('toolbar');

		// Avoid nonsense situation.
		if ($component == 'com_fields')
		{
			return;
		}

		// Load component language file
		$lang = JFactory::getLanguage();
		$lang->load($component, JPATH_ADMINISTRATOR)
		|| $lang->load($component, JPath::clean(JPATH_ADMINISTRATOR . '/components/' . $component));

		$title = JText::sprintf('COM_FIELDS_VIEW_GROUPS_TITLE', JText::_(strtoupper($component)));

		// Prepare the toolbar.
		JToolbarHelper::title($title, 'puzzle fields ' . substr($component, 4) . '-groups');

		if ($canDo->get('core.create'))
		{
			JToolbarHelper::addNew('group.add');
		}

		if ($canDo->get('core.edit') || $canDo->get('core.edit.own'))
		{
			JToolbarHelper::editList('group.edit');
		}

		if ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::publish('groups.publish', 'JTOOLBAR_PUBLISH', true);
			JToolbarHelper::unpublish('groups.unpublish', 'JTOOLBAR_UNPUBLISH', true);
			JToolbarHelper::archiveList('groups.archive');
		}

		if (JFactory::getUser()->authorise('core.admin'))
		{
			JToolbarHelper::checkin('groups.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') || $canDo->get('core.options'))
		{
			JToolbarHelper::preferences($component);
		}

		if ($this->state->get('filter.state') == -2 && $canDo->get('core.delete', $component))
		{
			JToolbarHelper::deleteList('', 'groups.delete', 'JTOOLBAR_EMPTY_TRASH');
		}
		elseif ($canDo->get('core.edit.state'))
		{
			JToolbarHelper::trash('groups.trash');
		}

		JToolbarHelper::help('JHELP_COMPONENTS_FIELDS_FIELD_GROUPS');
	}

	/**
	 * Returns the sort fields.
	 *
	 * @return  array
	 *
	 * @since   3.7.0
	 */
	protected function getSortFields()
	{
		return array(
			'a.ordering'  => JText::_('JGRID_HEADING_ORDERING'),
			'a.state'     => JText::_('JSTATUS'),
			'a.title'     => JText::_('JGLOBAL_TITLE'),
			'a.access'    => JText::_('JGRID_HEADING_ACCESS'),
			'language'    => JText::_('JGRID_HEADING_LANGUAGE'),
			'a.context'   => JText::_('JGRID_HEADING_CONTEXT'),
			'a.id'        => JText::_('JGRID_HEADING_ID'),
		);
	}
}
components/com_fields/views/field/view.html.php000060400000006501152453623460015713 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

/**
 * Field View
 *
 * @since  3.7.0
 */
class FieldsViewField extends JViewLegacy
{
	/**
	 * @var  JForm
	 *
	 * @since   3.7.0
	 */
	protected $form;

	/**
	 * @var  JObject
	 *
	 * @since   3.7.0
	 */
	protected $item;

	/**
	 * @var  JObject
	 *
	 * @since   3.7.0
	 */
	protected $state;

	/**
	 * Execute and display a template script.
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  mixed  A string if successful, otherwise an Error object.
	 *
	 * @see     JViewLegacy::loadTemplate()
	 * @since   3.7.0
	 */
	public function display($tpl = null)
	{
		$this->form  = $this->get('Form');
		$this->item  = $this->get('Item');
		$this->state = $this->get('State');

		$this->canDo = JHelperContent::getActions($this->state->get('field.component'), 'field', $this->item->id);

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			throw new Exception(implode("\n", $errors), 500);
		}

		JFactory::getApplication()->input->set('hidemainmenu', true);

		$this->addToolbar();

		return parent::display($tpl);
	}

	/**
	 * Adds the toolbar.
	 *
	 * @return  void
	 *
	 * @since   3.7.0
	 */
	protected function addToolbar()
	{
		$component = $this->state->get('field.component');
		$section   = $this->state->get('field.section');
		$userId    = JFactory::getUser()->get('id');
		$canDo     = $this->canDo;

		$isNew      = ($this->item->id == 0);
		$checkedOut = !($this->item->checked_out == 0 || $this->item->checked_out == $userId);

		// Avoid nonsense situation.
		if ($component == 'com_fields')
		{
			return;
		}

		// Load component language file
		$lang = JFactory::getLanguage();
		$lang->load($component, JPATH_ADMINISTRATOR)
		|| $lang->load($component, JPath::clean(JPATH_ADMINISTRATOR . '/components/' . $component));

		$title = JText::sprintf('COM_FIELDS_VIEW_FIELD_' . ($isNew ? 'ADD' : 'EDIT') . '_TITLE', JText::_(strtoupper($component)));

		// Prepare the toolbar.
		JToolbarHelper::title(
			$title,
			'puzzle field-' . ($isNew ? 'add' : 'edit') . ' ' . substr($component, 4) . ($section ? "-$section" : '') . '-field-' .
			($isNew ? 'add' : 'edit')
		);

		// For new records, check the create permission.
		if ($isNew)
		{
			JToolbarHelper::apply('field.apply');
			JToolbarHelper::save('field.save');
			JToolbarHelper::save2new('field.save2new');
		}

		// If not checked out, can save the item.
		elseif (!$checkedOut && ($canDo->get('core.edit') || ($canDo->get('core.edit.own') && $this->item->created_user_id == $userId)))
		{
			JToolbarHelper::apply('field.apply');
			JToolbarHelper::save('field.save');

			if ($canDo->get('core.create'))
			{
				JToolbarHelper::save2new('field.save2new');
			}
		}

		// If an existing item, can save to a copy.
		if (!$isNew && $canDo->get('core.create'))
		{
			JToolbarHelper::save2copy('field.save2copy');
		}

		if (empty($this->item->id))
		{
			JToolbarHelper::cancel('field.cancel');
		}
		else
		{
			JToolbarHelper::cancel('field.cancel', 'JTOOLBAR_CLOSE');
		}

		JToolbarHelper::help('JHELP_COMPONENTS_FIELDS_FIELDS_EDIT');
	}
}
components/com_fields/views/field/tmpl/edit.php000060400000007600152453623460015700 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

JHtml::_('behavior.formvalidator');
JHtml::_('behavior.keepalive');
JHtml::_('behavior.tabstate');
JHtml::_('formbehavior.chosen', '#jform_catid', null, array('disable_search_threshold' => 0 ));
JHtml::_('formbehavior.chosen', 'select');

$app = JFactory::getApplication();
$input = $app->input;

JFactory::getDocument()->addScriptDeclaration('
	Joomla.submitbutton = function(task)
	{
		if (task == "field.cancel" || document.formvalidator.isValid(document.getElementById("item-form")))
		{
			Joomla.submitform(task, document.getElementById("item-form"));
		}
	};
	jQuery(document).ready(function() {
		jQuery("#jform_title").data("dp-old-value", jQuery("#jform_title").val());
		jQuery("#jform_title").change(function(data, handler) {
			if(jQuery("#jform_title").data("dp-old-value") == jQuery("#jform_label").val()) {
				jQuery("#jform_label").val(jQuery("#jform_title").val());
			}

			jQuery("#jform_title").data("dp-old-value", jQuery("#jform_title").val());
		});
	});
');

?>

<form action="<?php echo JRoute::_('index.php?option=com_fields&context=' . $input->getCmd('context', 'com_content') . '&layout=edit&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="item-form" class="form-validate">
	<?php echo JLayoutHelper::render('joomla.edit.title_alias', $this); ?>
	<div class="form-horizontal">
		<?php echo JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'general')); ?>
		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'general', JText::_('COM_FIELDS_VIEW_FIELD_FIELDSET_GENERAL', true)); ?>
		<div class="row-fluid">
			<div class="span9">
				<?php echo $this->form->renderField('type'); ?>
				<?php echo $this->form->renderField('name'); ?>
				<?php echo $this->form->renderField('label'); ?>
				<?php echo $this->form->renderField('description'); ?>
				<?php echo $this->form->renderField('required'); ?>
				<?php echo $this->form->renderField('default_value'); ?>

				<?php foreach ($this->form->getFieldsets('fieldparams') as $name => $fieldSet) : ?>
					<?php foreach ($this->form->getFieldset($name) as $field) : ?>
						<?php echo $field->renderField(); ?>
					<?php endforeach; ?>
				<?php endforeach; ?>

			</div>
			<div class="span3">
				<?php $this->set('fields',
						array(
							array(
								'published',
								'state',
								'enabled',
							),
							'group_id',
							'assigned_cat_ids',
							'access',
							'language',
							'note',
						)
				); ?>
				<?php echo JLayoutHelper::render('joomla.edit.global', $this); ?>
				<?php $this->set('fields', null); ?>
			</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php $this->set('ignore_fieldsets', array('fieldparams')); ?>
		<?php echo JLayoutHelper::render('joomla.edit.params', $this); ?>
		<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'publishing', JText::_('JGLOBAL_FIELDSET_PUBLISHING', true)); ?>
		<div class="row-fluid form-horizontal-desktop">
			<div class="span6">
				<?php echo JLayoutHelper::render('joomla.edit.publishingdata', $this); ?>
			</div>
			<div class="span6">
			</div>
		</div>
		<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php if ($this->canDo->get('core.admin')) : ?>
			<?php echo JHtml::_('bootstrap.addTab', 'myTab', 'rules', JText::_('JGLOBAL_ACTION_PERMISSIONS_LABEL', true)); ?>
			<?php echo $this->form->getInput('rules'); ?>
			<?php echo JHtml::_('bootstrap.endTab'); ?>
		<?php endif; ?>
		<?php echo JHtml::_('bootstrap.endTabSet'); ?>
		<?php echo $this->form->getInput('context'); ?>
		<input type="hidden" name="task" value="" />
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>
components/com_fields/libraries/fieldsplugin.php000060400000014444152453623460016224 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

/**
 * Abstract Fields Plugin
 *
 * @since  3.7.0
 */
abstract class FieldsPlugin extends JPlugin
{
	protected $autoloadLanguage = true;

	/**
	 * Returns the custom fields types.
	 *
	 * @return  string[][]
	 *
	 * @since   3.7.0
	 */
	public function onCustomFieldsGetTypes()
	{
		// Cache filesystem access / checks
		static $types_cache = array();

		if (isset($types_cache[$this->_type . $this->_name]))
		{
			return $types_cache[$this->_type . $this->_name];
		}

		$types = array();

		// The root of the plugin
		$root = JPATH_PLUGINS . '/' . $this->_type . '/' . $this->_name;

		foreach (JFolder::files($root . '/tmpl', '.php') as $layout)
		{
			// Strip the extension
			$layout = str_replace('.php', '', $layout);

			// The data array
			$data = array();

			// The language key
			$key = strtoupper($layout);

			if ($key != strtoupper($this->_name))
			{
				$key = strtoupper($this->_name) . '_' . $layout;
			}

			// Needed attributes
			$data['type'] = $layout;

			if (JFactory::getLanguage()->hasKey('PLG_FIELDS_' . $key . '_LABEL'))
			{
				$data['label'] = JText::sprintf('PLG_FIELDS_' . $key . '_LABEL', strtolower($key));

				// Fix wrongly set parentheses in RTL languages
				if (JFactory::getLanguage()->isRTL())
				{
					$data['label'] = $data['label'] . '&#x200E;';
				}
			}
			else
			{
				$data['label'] = $key;
			}

			$path = $root . '/fields';

			// Add the path when it exists
			if (file_exists($path))
			{
				$data['path'] = $path;
			}

			$path = $root . '/rules';

			// Add the path when it exists
			if (file_exists($path))
			{
				$data['rules'] = $path;
			}

			$types[] = $data;
		}

		// Add to cache and return the data
		$types_cache[$this->_type . $this->_name] = $types;

		return $types;
	}

	/**
	 * Prepares the field value.
	 *
	 * @param   string    $context  The context.
	 * @param   stdclass  $item     The item.
	 * @param   stdclass  $field    The field.
	 *
	 * @return  string
	 *
	 * @since   3.7.0
	 */
	public function onCustomFieldsPrepareField($context, $item, $field)
	{
		// Check if the field should be processed by us
		if (!$this->isTypeSupported($field->type))
		{
			return;
		}

		// Merge the params from the plugin and field which has precedence
		$fieldParams = clone $this->params;
		$fieldParams->merge($field->fieldparams);

		// Get the path for the layout file
		$path = JPluginHelper::getLayoutPath('fields', $field->type, $field->type);

		if (!file_exists($path))
		{
			$path = JPluginHelper::getLayoutPath('fields', $this->_name, $field->type);
		}

		// Render the layout
		ob_start();
		include $path;
		$output = ob_get_clean();

		// Return the output
		return $output;
	}

	/**
	 * Transforms the field into a DOM XML element and appends it as a child on the given parent.
	 *
	 * @param   stdClass    $field   The field.
	 * @param   DOMElement  $parent  The field node parent.
	 * @param   JForm       $form    The form.
	 *
	 * @return  DOMElement
	 *
	 * @since   3.7.0
	 */
	public function onCustomFieldsPrepareDom($field, DOMElement $parent, JForm $form)
	{
		// Check if the field should be processed by us
		if (!$this->isTypeSupported($field->type))
		{
			return null;
		}

		// Detect if the field is configured to be displayed on the form
		if (!FieldsHelper::displayFieldOnForm($field))
		{
			return null;
		}

		// Create the node
		$node = $parent->appendChild(new DOMElement('field'));

		// Set the attributes
		$node->setAttribute('name', $field->name);
		$node->setAttribute('type', $field->type);
		$node->setAttribute('label', $field->label);
		$node->setAttribute('labelclass', $field->params->get('label_class'));
		$node->setAttribute('description', $field->description);
		$node->setAttribute('class', $field->params->get('class'));
		$node->setAttribute('hint', $field->params->get('hint'));
		$node->setAttribute('required', $field->required ? 'true' : 'false');

		if ($field->default_value !== '')
		{
			$defaultNode = $node->appendChild(new DOMElement('default'));
			$defaultNode->appendChild(new DOMCdataSection($field->default_value));
		}

		// Combine the two params
		$params = clone $this->params;
		$params->merge($field->fieldparams);

		// Set the specific field parameters
		foreach ($params->toArray() as $key => $param)
		{
			if (is_array($param))
			{
				// Multidimensional arrays (eg. list options) can't be transformed properly
				$param = count($param) == count($param, COUNT_RECURSIVE) ? implode(',', $param) : '';
			}

			if ($param === '' || (!is_string($param) && !is_numeric($param)))
			{
				continue;
			}

			$node->setAttribute($key, $param);
		}

		// Check if it is allowed to edit the field
		if (!FieldsHelper::canEditFieldValue($field))
		{
			$node->setAttribute('disabled', 'true');
		}

		// Return the node
		return $node;
	}

	/**
	 * The form event. Load additional parameters when available into the field form.
	 * Only when the type of the form is of interest.
	 *
	 * @param   JForm     $form  The form
	 * @param   stdClass  $data  The data
	 *
	 * @return  void
	 *
	 * @since   3.7.0
	 */
	public function onContentPrepareForm(JForm $form, $data)
	{
		// Check if the field form is calling us
		if (strpos($form->getName(), 'com_fields.field') !== 0)
		{
			return;
		}

		// Ensure it is an object
		$formData = (object) $data;

		// Gather the type
		$type = $form->getValue('type');

		if (!empty($formData->type))
		{
			$type = $formData->type;
		}

		// Not us
		if (!$this->isTypeSupported($type))
		{
			return;
		}

		$path = JPATH_PLUGINS . '/' . $this->_type . '/' . $this->_name . '/params/' . $type . '.xml';

		// Check if params file exists
		if (!file_exists($path))
		{
			return;
		}

		// Load the specific plugin parameters
		$form->load(file_get_contents($path), true, '/form/*');
	}

	/**
	 * Returns true if the given type is supported by the plugin.
	 *
	 * @param   string  $type  The type
	 *
	 * @return  boolean
	 *
	 * @since   3.7.0
	 */
	protected function isTypeSupported($type)
	{
		foreach ($this->onCustomFieldsGetTypes() as $typeSpecification)
		{
			if ($type == $typeSpecification['type'])
			{
				return true;
			}
		}

		return false;
	}
}
components/com_fields/libraries/fieldslistplugin.php000060400000003552152453623460017116 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

JLoader::import('components.com_fields.libraries.fieldsplugin', JPATH_ADMINISTRATOR);

/**
 * Base plugin for all list based plugins
 *
 * @since  3.7.0
 */
class FieldsListPlugin extends FieldsPlugin
{
	/**
	 * Transforms the field into a DOM XML element and appends it as a child on the given parent.
	 *
	 * @param   stdClass    $field   The field.
	 * @param   DOMElement  $parent  The field node parent.
	 * @param   JForm       $form    The form.
	 *
	 * @return  DOMElement
	 *
	 * @since   3.7.0
	 */
	public function onCustomFieldsPrepareDom($field, DOMElement $parent, JForm $form)
	{
		$fieldNode = parent::onCustomFieldsPrepareDom($field, $parent, $form);

		if (!$fieldNode)
		{
			return $fieldNode;
		}

		$fieldNode->setAttribute('validate', 'options');

		foreach ($this->getOptionsFromField($field) as $value => $name)
		{
			$option = new DOMElement('option', htmlspecialchars($value, ENT_COMPAT, 'UTF-8'));
			$option->textContent = htmlspecialchars(JText::_($name), ENT_COMPAT, 'UTF-8');

			$element = $fieldNode->appendChild($option);
			$element->setAttribute('value', $value);
		}

		return $fieldNode;
	}

	/**
	 * Returns an array of key values to put in a list from the given field.
	 *
	 * @param   stdClass  $field  The field.
	 *
	 * @return  array
	 *
	 * @since   3.7.0
	 */
	public function getOptionsFromField($field)
	{
		$data = array();

		// Fetch the options from the plugin
		$params = clone $this->params;
		$params->merge($field->fieldparams);

		foreach ($params->get('options', array()) as $option)
		{
			$op = (object) $option;
			$data[$op->value] = $op->name;
		}

		return $data;
	}
}
components/com_fields/fields.php000060400000001647152453623460013032 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');

$app       = JFactory::getApplication();
$context   = $app->getUserStateFromRequest(
	'com_fields.groups.context',
	'context',
	$app->getUserStateFromRequest('com_fields.fields.context', 'context', 'com_content.article', 'CMD'),
	'CMD'
);

$parts = FieldsHelper::extract($context);

if (!$parts || !JFactory::getUser()->authorise('core.manage', $parts[0]))
{
	throw new JAccessExceptionNotallowed(JText::_('JERROR_ALERTNOAUTHOR'), 403);
}

$controller = JControllerLegacy::getInstance('Fields');
$controller->execute($app->input->get('task'));
$controller->redirect();
components/com_fields/fields.xml000060400000002302152453623460013030 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.7.0" method="upgrade">
	<name>com_fields</name>
	<author>Joomla! Project</author>
	<creationDate>March 2016</creationDate>
	<copyright>(C) 2016 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.7.0</version>
	<description>COM_FIELDS_XML_DESCRIPTION</description>
	<files folder="site">
		<filename>controller.php</filename>
		<filename>fields.php</filename>
		<folder>controllers</folder>
		<folder>layouts</folder>
	</files>
	<administration>
		<files folder="admin">
			<filename>access.xml</filename>
			<filename>controller.php</filename>
			<filename>fields.php</filename>
			<folder>controllers</folder>
			<folder>helpers</folder>
			<folder>libraries</folder>
			<folder>models</folder>
			<folder>tables</folder>
			<folder>views</folder>
		</files>
		<languages folder="admin">
			<language tag="en-GB">language/en-GB.com_fields.ini</language>
			<language tag="en-GB">language/en-GB.com_fields.sys.ini</language>
		</languages>
	</administration>
</extension>


components/com_fields/controllers/groups.php000060400000002026152453623460015441 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

/**
 * Groups list controller class.
 *
 * @since  3.7.0
 */
class FieldsControllerGroups extends JControllerAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 *
	 * @since   3.7.0
	 */
	protected $text_prefix = 'COM_FIELDS_GROUP';

	/**
	 * Proxy for getModel.
	 *
	 * @param   string  $name    The model name. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  The array of possible config values. Optional.
	 *
	 * @return  JModelLegacy|boolean  Model object on success; otherwise false on failure.
	 *
	 * @since   3.7.0
	 */
	public function getModel($name = 'Group', $prefix = 'FieldsModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}
}
components/com_fields/controllers/fields.php000060400000001744152453623460015376 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

/**
 * Fields list controller class.
 *
 * @since  3.7.0
 */
class FieldsControllerFields extends JControllerAdmin
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string
	 *
	 * @since   3.7.0
	 */
	protected $text_prefix = 'COM_FIELDS_FIELD';

	/**
	 * Proxy for getModel.
	 *
	 * @param   string  $name    The model name. Optional.
	 * @param   string  $prefix  The class prefix. Optional.
	 * @param   array   $config  The array of possible config values. Optional.
	 *
	 * @return  FieldsModelField|boolean
	 *
	 * @since   3.7.0
	 */
	public function getModel($name = 'Field', $prefix = 'FieldsModel', $config = array('ignore_request' => true))
	{
		return parent::getModel($name, $prefix, $config);
	}
}
components/com_fields/controllers/group.php000060400000006762152453623460015271 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

use Joomla\Registry\Registry;

/**
 * The Group controller
 *
 * @since  3.7.0
 */
class FieldsControllerGroup extends JControllerForm
{
	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string

	 * @since   3.7.0
	 */
	protected $text_prefix = 'COM_FIELDS_GROUP';

	/**
	 * The component for which the group applies.
	 *
	 * @var    string
	 * @since   3.7.0
	 */
	private $component = '';

	/**
	 * Class constructor.
	 *
	 * @param   array  $config  A named array of configuration variables.
	 *
	 * @since   3.7.0
	 */
	public function __construct($config = array())
	{
		parent::__construct($config);

		$parts = FieldsHelper::extract($this->input->getCmd('context'));

		if ($parts)
		{
			$this->component = $parts[0];
		}
	}

	/**
	 * Method to run batch operations.
	 *
	 * @param   object  $model  The model.
	 *
	 * @return  boolean   True if successful, false otherwise and internal error is set.
	 *
	 * @since   3.7.0
	 */
	public function batch($model = null)
	{
		$this->checkToken();

		// Set the model
		$model = $this->getModel('Group');

		// Preset the redirect
		$this->setRedirect('index.php?option=com_fields&view=groups');

		return parent::batch($model);
	}

	/**
	 * Method override to check if you can add a new record.
	 *
	 * @param   array  $data  An array of input data.
	 *
	 * @return  boolean
	 *
	 * @since   3.7.0
	 */
	protected function allowAdd($data = array())
	{
		return JFactory::getUser()->authorise('core.create', $this->component);
	}

	/**
	 * 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   3.7.0
	 */
	protected function allowEdit($data = array(), $key = 'parent_id')
	{
		$recordId = (int) isset($data[$key]) ? $data[$key] : 0;
		$user = JFactory::getUser();

		// Zero record (parent_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', $this->component . '.fieldgroup.' . $recordId))
		{
			return true;
		}

		// Check edit own on the record asset (explicit or inherited)
		if ($user->authorise('core.edit.own', $this->component . '.fieldgroup.' . $recordId) || $user->authorise('core.edit.own', $this->component))
		{
			// 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->id == $record->created_by;
		}

		return false;
	}

	/**
	 * 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.7.0
	 */
	protected function postSaveHook(JModelLegacy $model, $validData = array())
	{
		$item = $model->getItem();

		if (isset($item->params) && is_array($item->params))
		{
			$registry = new Registry;
			$registry->loadArray($item->params);
			$item->params = (string) $registry;
		}

		return;
	}
}
components/com_fields/controllers/field.php000060400000010413152453623460015204 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_fields
 *
 * @copyright   (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
defined('_JEXEC') or die;

use Joomla\Registry\Registry;

/**
 * The Field controller
 *
 * @since  3.7.0
 */
class FieldsControllerField extends JControllerForm
{
	private $internalContext;

	private $component;

	/**
	 * The prefix to use with controller messages.
	 *
	 * @var    string

	 * @since   3.7.0
	 */
	protected $text_prefix = 'COM_FIELDS_FIELD';

	/**
	 * Class constructor.
	 *
	 * @param   array  $config  A named array of configuration variables.
	 *
	 * @since   3.7.0
	 */
	public function __construct($config = array())
	{
		parent::__construct($config);

		$this->internalContext = JFactory::getApplication()->getUserStateFromRequest('com_fields.fields.context', 'context', 'com_content.article', 'CMD');
		$parts = FieldsHelper::extract($this->internalContext);
		$this->component = $parts ? $parts[0] : null;
	}

	/**
	 * Method override to check if you can add a new record.
	 *
	 * @param   array  $data  An array of input data.
	 *
	 * @return  boolean
	 *
	 * @since   3.7.0
	 */
	protected function allowAdd($data = array())
	{
		return JFactory::getUser()->authorise('core.create', $this->component);
	}

	/**
	 * 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;
		$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', $this->component . '.field.' . $recordId))
		{
			return true;
		}

		// Check edit own on the record asset (explicit or inherited)
		if ($user->authorise('core.edit.own', $this->component . '.field.' . $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->id == $record->created_user_id;
		}

		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   3.7.0
	 */
	public function batch($model = null)
	{
		$this->checkToken();

		// Set the model
		$model = $this->getModel('Field');

		// Preset the redirect
		$this->setRedirect('index.php?option=com_fields&view=fields&context=' . $this->internalContext);

		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   3.7.0
	 */
	protected function getRedirectToItemAppend($recordId = null, $urlVar = 'id')
	{
		return parent::getRedirectToItemAppend($recordId) . '&context=' . $this->internalContext;
	}

	/**
	 * Gets the URL arguments to append to a list redirect.
	 *
	 * @return  string  The arguments to append to the redirect URL.
	 *
	 * @since   3.7.0
	 */
	protected function getRedirectToListAppend()
	{
		return parent::getRedirectToListAppend() . '&context=' . $this->internalContext;
	}

	/**
	 * 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.7.0
	 */
	protected function postSaveHook(JModelLegacy $model, $validData = array())
	{
		$item = $model->getItem();

		if (isset($item->params) && is_array($item->params))
		{
			$registry = new Registry;
			$registry->loadArray($item->params);
			$item->params = (string) $registry;
		}

		return;
	}
}
components/com_mailjet/models/mailjet.php000060400000006641152453623460014652 0ustar00<?php
/**
 * @author Mailjet SAS
 *
 * @copyright  Copyright (C) 2014 Mailjet SAS.
 * @license    GNU General Public License version 2 or later; see LICENSE
 */
// No direct access
defined( '_JEXEC' ) or die( 'Restricted access' );

jimport( 'joomla.application.component.model' );

if (!function_exists('class_alias')) { // For php older then 5.3
  function class_alias($orig, $alias) {
    eval('abstract class ' . $alias . ' extends ' . $orig . ' {}');
  }
}

if (!class_exists('JModelLegacy')) {
  class_alias('JModel','JModelLegacy');
}

class MailjetModelMailjet extends JModelLegacy
{
    public function getAsPost ()
    {
        $post = JRequest::get ('post');

        $data ['enable'] = isSet ($post ['enable']);
        $data ['test'] = isSet ($post ['test']);
        $data ['test_address'] = $post ['test_address'];
        $data ['username'] = $post ['username'];
        $data ['password'] = $post ['password'];
        $data ['api_token'] = serialize(false);

        return $data;
    }

    public function getAsRecord ()
    {
        $mailjetConfig = sPrintF ('%s/config.php', JPATH_COMPONENT);

        require_once ($mailjetConfig);

        $conf = new JMailjetConfig ();

        $host = $conf->host;

        $prev = new JConfig();
        $prev = JArrayHelper::fromObject($prev);

        $fields ['bak_mailer'] = $prev ['mailer'];
        $fields ['bak_smtpauth'] = $prev ['smtpauth'];
        $fields ['bak_smtpuser'] = $prev ['smtpuser'];
        $fields ['bak_smtppass'] = $prev ['smtppass'];
        $fields ['bak_smtphost'] = $prev ['smtphost'];
        $fields ['bak_smtpsecure'] = $prev ['smtpsecure'];
        $fields ['bak_smtpport'] = $prev ['smtpport'];

        $data ['enable'] = $conf->enable && 'smtp' == $prev ['mailer'] && $conf->host == $prev ['smtphost'];
        $data ['test'] = $conf->test;
        $data ['test_address'] = $conf->test_address;
        $data ['username'] = $conf->username;
        $data ['password'] = $conf->password;
        $data ['host'] = $host;
        if(isset($data['api_token']) && $data['api_token']) {
            $data['api_token'] = unserialize($conf->api_token);
        }

        return $data;
    }

    public function saveRecord($key, $value)
    {
        jimport ('joomla.filesystem.path');
        jimport ('joomla.filesystem.file');
        $mailjetConfig = sPrintF ('%s/components/%s/config.php', JPATH_ADMINISTRATOR, 'com_mailjet');
        require_once ($mailjetConfig);
        $config = new JRegistry ('config');
        $config->loadArray ($this->getAsRecord());
        $jversion = new JVersion();
        if (version_compare($jversion->getShortVersion(), '2.5.6', 'lt')) {
            $config->setValue($key, $value);
        } else {
            $config->set($key, $value);
        }
        $configString = $config->toString ('PHP', array ('class' => 'JMailjetConfig', 'closingtag' => false));

        if (! JFile::write ($mailjetConfig, $configString))
        {
            JError::raiseWarning (0, JText::_ ('Unable to write configuration file for Mailjet\'s settings.'));
        }

        $mailjetData = sPrintF ('%s/components/%s/lib/db/data', JPATH_ADMINISTRATOR, 'com_mailjet');
        $JSONString = '{"apiKey":"'.$post ['username'].'","apiSecret":"'.$post ['password'].'","token":null}';
        if (! JFile::write ($mailjetData, $JSONString))
        {
            JError::raiseWarning (0, JText::_ ('Unable to write data file for Mailjet\'s settings.'));
        }
    }
}
components/com_mailjet/views/campaigns/view.html.php000060400000002420152453623460016745 0ustar00<?php
/**
 * @author Mailjet SAS
 *
 * @copyright  Copyright (C) 2014 Mailjet SAS.
 * @license    GNU General Public License version 2 or later; see LICENSE
 */
// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// import Joomla view library
jimport('joomla.application.component.view');

if (!function_exists('class_alias')) { // For php older then 5.3
  function class_alias($orig, $alias) {
    eval('abstract class ' . $alias . ' extends ' . $orig . ' {}');
  }
}

if (!class_exists('JViewLegacy')) {
  class_alias('JView','JViewLegacy');
}

if (!class_exists('JModelLegacy')) {
  class_alias('JModel','JModelLegacy');
}

$jversion = new JVersion;
$jshort = $jversion->getShortVersion();

$lang = JFactory::getLanguage();
$extension = 'com_mailjet';
$base_dir = JPATH_SITE;
$language_tag =  $lang->getTag();
$reload = true;
$lang->load($extension, $base_dir, $language_tag, $reload);

class MailjetViewCampaigns extends JViewLegacy
{
    /**
     * HelloWorlds view display method
     * @return void
     */
    function display($tpl = null)
    {
        JToolBarHelper::title (JText::_("COM_MAILJET_CAMPAIGNS"), 'logo.png' );
        //JToolBarHelper::save ();

        $this->sidebar = JHtmlSidebar::render();
        
        parent::display ($tpl);
    }
}components/com_mailjet/views/campaigns/tmpl/default.php000060400000002023152453623460017427 0ustar00<?php
/**
 * @author Mailjet SAS
 *
 * @copyright  Copyright (C) 2014 Mailjet SAS.
 * @license    GNU General Public License version 2 or later; see LICENSE
 */
defined('_JEXEC') or die('Restricted access'); 

$lib_dir = __DIR__.'/../../../lib/';

require_once ($lib_dir.'config.php');
require_once ($lib_dir.'lib/Auth.php');
require_once ($lib_dir.'lib/mailjet-api-strategy.php');

$auth = new Auth();

$nextStepUrl = $auth->haveToken() ? 'campaigns' : 'reseller/signup';

//$address = "{$mailjetUrl}/{$nextStepUrl}?r={$resellerName}&show_menu=none&u=Joomla-3.0&f=amc";
$address = "https://".(($auth->getApiVersion == '0.1')?"www":(($auth->getApiVersion == 'REST')?"app":"www")).".mailjet.com/{$nextStepUrl}?r={$resellerName}&show_menu=none&u=Joomla-3.0&f=amc";

if ($auth->haveToken()) {
    $address .= "&t=" . $auth->getToken();  
}
?>

<div id="j-sidebar-container" class="span2">
	<?php echo $this->sidebar; ?>
</div>
<div id="j-main-container" class="span10">
    <iframe width="1000" height="1300" src="<?php echo $address; ?>">
</div>components/com_mailjet/views/statistics/view.html.php000060400000002415152453623460017201 0ustar00<?php
/**
 * @author Mailjet SAS
 *
 * @copyright  Copyright (C) 2014 Mailjet SAS.
 * @license    GNU General Public License version 2 or later; see LICENSE
 */
// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// import Joomla view library
jimport('joomla.application.component.view');

if (!function_exists('class_alias')) { // For php older then 5.3
  function class_alias($orig, $alias) {
    eval('abstract class ' . $alias . ' extends ' . $orig . ' {}');
  }
}

if (!class_exists('JViewLegacy')) {
  class_alias('JView','JViewLegacy');
}

if (!class_exists('JModelLegacy')) {
  class_alias('JModel','JModelLegacy');
}

$jversion = new JVersion;
$jshort = $jversion->getShortVersion();

$lang = JFactory::getLanguage();
$extension = 'com_mailjet';
$base_dir = JPATH_SITE;
$language_tag =  $lang->getTag();
$reload = true;
$lang->load($extension, $base_dir, $language_tag, $reload);

class MailjetViewStatistics extends JViewLegacy
{
    /**
     * HelloWorlds view display method
     * @return void
     */
    function display($tpl = null)
    {
        JToolBarHelper::title (JText::_("COM_MAILJET_STATS"), 'logo.png' );
        //JToolBarHelper::save ();
        
        $this->sidebar = JHtmlSidebar::render();

        parent::display ($tpl);
    }
}components/com_mailjet/views/statistics/tmpl/default.php000060400000002017152453623460017662 0ustar00<?php
/**
 * @author Mailjet SAS
 *
 * @copyright  Copyright (C) 2014 Mailjet SAS.
 * @license    GNU General Public License version 2 or later; see LICENSE
 */
defined('_JEXEC') or die('Restricted access'); 

$lib_dir = __DIR__.'/../../../lib/';

require_once ($lib_dir.'config.php');
require_once ($lib_dir.'lib/Auth.php');
require_once ($lib_dir.'lib/mailjet-api-strategy.php');

$auth = new Auth();

$nextStepUrl = $auth->haveToken() ? 'stats' : 'reseller/signup';

//$address = "{$mailjetUrl}/{$nextStepUrl}?r={$resellerName}&show_menu=none&u=Joomla-3.0&f=amc";
$address = "https://".(($auth->getApiVersion == '0.1')?"www":(($auth->getApiVersion == 'REST')?"app":"www")).".mailjet.com/{$nextStepUrl}?r={$resellerName}&show_menu=none&u=Joomla-3.0&f=amc";

if ($auth->haveToken()) {
    $address .= "&t=" . $auth->getToken();  
}
?>

<div id="j-sidebar-container" class="span2">
	<?php echo $this->sidebar; ?>
</div>
<div id="j-main-container" class="span10">
    <iframe width="1000" height="1300" src="<?php echo $address; ?>">
</div>components/com_mailjet/views/mailjet/tmpl/default.php000060400000007143152453623460017122 0ustar00<?php 
/**
 * @author Mailjet SAS
 *
 * @copyright  Copyright (C) 2014 Mailjet SAS.
 * @license    GNU General Public License version 2 or later; see LICENSE
 */
 defined('_JEXEC') or die('Restricted access'); ?>

<div id="j-sidebar-container" class="span2">
    <?php echo $this->sidebar; ?>
</div>
<div id="j-main-container" class="span10 iframe">
    <form action="<?php echo JRoute::_('index.php?option=com_mailjet&layout=edit') ?>" method="post" id="adminForm" name="adminForm">
        <div class="social" style="width:25%;float:right;border: 1px #CCC solid; border-radius: 6px; padding:8px">
            <h3><?php echo JText::_ ('COM_MAILJET_PLUGIN_INSTRUCTIONS_SHARE'); ?></h3>
            <div style="margin-bottom:10px">
                <?php echo JText::_ ('COM_MAILJET_PLUGIN_INSTRUCTIONS_FACEBOOK_LINK'); ?>
            </div>
            <div>
                <?php echo JText::_ ('COM_MAILJET_PLUGIN_INSTRUCTIONS_TWITTER_LINK'); ?>
            </div>
        </div>
        <div id="editcell"style="width:70%">
            <fieldset class="adminform">
                <legend><?php echo JText::_ ('COM_MAILJET_PLUGIN_INSTRUCTIONS_TITLE'); ?></legend>

                <ol>
                    <li>
                        <?php echo JText::_ ('COM_MAILJET_PLUGIN_INSTRUCTIONS_CREATE_ACCOUNT'); ?>
                    </li>
                    <li>
                        <?php echo JText::_ ('COM_MAILJET_PLUGIN_INSTRUCTIONS_CREATE_LIST'); ?>
                    </li>
                    <li>
                        <?php echo JText::_ ('COM_MAILJET_PLUGIN_INSTRUCTIONS_CREATE_WIDGET'); ?>
                    </li>
                    <li>
                        <?php echo JText::_ ('COM_MAILJET_PLUGIN_INSTRUCTIONS_CREATE_CAMPAIGN'); ?>
                    </li>
                </ol>

            </fieldset>
            <fieldset class="adminform">
                <legend><?php echo JText::_ ('COM_MAILJET_GENERAL_SETTINGS'); ?></legend>
                <p><?php echo JText::_ ('COM_MAILJET_MAILJET_SETTINGS_API_KEYS_HELP'); ?></p>

                <label for="enable"><?php echo JText::_ ('COM_MAILJET_GENERAL_SETTINGS_ENABLED'); ?></label> <input type="checkbox" name="enable" id="enable" <?php if ($this->params ['enable']) echo 'checked="checked"'; ?> />
                <label for="test"><?php echo JText::_ ('COM_MAILJET_GENERAL_SETTINGS_SEND_TEST'); ?></label> <input type="checkbox" name="test" id="test" <?php if ($this->params ['test']) echo 'checked="checked"'; ?> />
                <label for="test_address"><?php echo JText::_ ('COM_MAILJET_GENERAL_SETTINGS_TEST_RECIPIENT'); ?></label> <input type="text" name="test_address" id="test_address" value="<?php echo $this->params ['test_address']; ?>" style="width:220px;" />
            </fieldset>

            <fieldset class="adminform">
                <legend><?php echo JText::_ ('COM_MAILJET_MAILJET_SETTINGS'); ?></legend>

                <label for="username"><?php echo JText::_ ('COM_MAILJET_MAILJET_SETTINGS_API_KEY'); ?></label> <input type="text" name="username" id="username" value="<?php echo $this->params ['username']; ?>" style="width:220px;" />
                <label for="password"><?php echo JText::_ ('COM_MAILJET_MAILJET_SETTINGS_SECRET_KEY'); ?></label> <input type="text" name="password" id="password" value="<?php echo $this->params ['password']; ?>" style="width:220px;" />
            </fieldset>
        </div>
        <?php echo JHTML::_( 'form.token' ); ?>
        <input type="hidden" name="option" value="com_mailjet" />
        <input type="hidden" name="task" value="" />
        <input type="hidden" name="controller" value="mailjetedit" />
    </form>
</div>components/com_mailjet/views/mailjet/view.html.php000060400000002521152453623460016432 0ustar00<?php
/**
 * @author Mailjet SAS
 *
 * @copyright  Copyright (C) 2014 Mailjet SAS.
 * @license    GNU General Public License version 2 or later; see LICENSE
 */
// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// import Joomla view library
jimport('joomla.application.component.view');

if (!function_exists('class_alias')) { // For php older then 5.3
  function class_alias($orig, $alias) {
    eval('abstract class ' . $alias . ' extends ' . $orig . ' {}');
  }
}

if (!class_exists('JViewLegacy')) {
  class_alias('JView','JViewLegacy');
}

/**
 * HelloWorlds View
 */
class MailjetViewMailjet extends JViewLegacy
{
    /**
     * HelloWorlds view display method
     * @return void
     */
    function display($tpl = null)
    {
        JToolBarHelper::title (JText::_( 'COM_MAILJET_MAILJET_SETTINGS' ), 'logo.png' );
        JToolBarHelper::save('save');

        $model = $this->getModel('mailjet');

        if (count (JRequest::get ('post')))
        {
            $params = $model->getAsPost ();
        }
        else
        {
            $params = $model->getAsRecord ();
        }
        $this->assignRef ('params', $params);
        JFactory::getDocument()->addStyleSheet(JURI::base(). "components/com_mailjet/styles.css");
        $this->sidebar = JHtmlSidebar::render();
        parent::display ($tpl);
    }
}
components/com_mailjet/views/contacts/tmpl/default.php000060400000002030152453623460017301 0ustar00<?php
/**
 * @author Mailjet SAS
 *
 * @copyright  Copyright (C) 2014 Mailjet SAS.
 * @license    GNU General Public License version 2 or later; see LICENSE
 */
defined('_JEXEC') or die('Restricted access'); 

$lib_dir = __DIR__.'/../../../lib/';

require_once ($lib_dir.'config.php');
require_once ($lib_dir.'lib/Auth.php');
require_once ($lib_dir.'lib/mailjet-api-strategy.php');

$auth = new Auth();

$nextStepUrl = $auth->haveToken() ? 'contacts/lists' : 'reseller/signup';

//$address = "{$mailjetUrl}/{$nextStepUrl}?r={$resellerName}&show_menu=none&u=Joomla-3.0&f=amc";
$address = "https://".(($auth->getApiVersion == '0.1')?"www":(($auth->getApiVersion == 'REST')?"app":"www")).".mailjet.com/{$nextStepUrl}?r={$resellerName}&show_menu=none&u=Joomla-3.0&f=amc";

if ($auth->haveToken()) {
    $address .= "&t=" . $auth->getToken();  
}
?>

<div id="j-sidebar-container" class="span2">
	<?php echo $this->sidebar; ?>
</div>
<div id="j-main-container" class="span10">
    <iframe width="1000" height="1300" src="<?php echo $address; ?>">
</div>components/com_mailjet/views/contacts/view.html.php000060400000002416152453623460016626 0ustar00<?php
/**
 * @author Mailjet SAS
 *
 * @copyright  Copyright (C) 2014 Mailjet SAS.
 * @license    GNU General Public License version 2 or later; see LICENSE
 */
// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// import Joomla view library
jimport('joomla.application.component.view');

if (!function_exists('class_alias')) { // For php older then 5.3
  function class_alias($orig, $alias) {
    eval('abstract class ' . $alias . ' extends ' . $orig . ' {}');
  }
}

if (!class_exists('JViewLegacy')) {
  class_alias('JView','JViewLegacy');
}

if (!class_exists('JModelLegacy')) {
  class_alias('JModel','JModelLegacy');
}

$jversion = new JVersion;
$jshort = $jversion->getShortVersion();

$lang = JFactory::getLanguage();
$extension = 'com_mailjet';
$base_dir = JPATH_SITE;
$language_tag =  $lang->getTag();
$reload = true;
$lang->load($extension, $base_dir, $language_tag, $reload);

class MailjetViewContacts extends JViewLegacy
{
    /**
     * HelloWorlds view display method
     * @return void
     */
    function display($tpl = null)
    {
        JToolBarHelper::title (JText::_("COM_MAILJET_CONTACTS"), 'logo.png' );
        //JToolBarHelper::save ();
        
        $this->sidebar = JHtmlSidebar::render();

        parent::display ($tpl);
    }
}components/com_mailjet/lib/lib/mailjet-api-strategy.php000060400000047635152453623460017322 0ustar00<?php

/*
 * LICENSE BLOCK
 * 
 * This program is free software. It comes without any warranty, to the extent permitted by applicable law. You can redistribute it
 * and/or modify it under the terms of the Do What The Fuck You Want To Public License, Version 2, as published by Sam Hocevar. See
 * http://sam.zoy.org/wtfpl/COPYING for more details.
 * 
 */
 
defined('_JEXEC') or die('Restricted access');

/* Require the mailjet API libraries */
require_once (__DIR__ . '/api/mailjet-api-v1.php');
require_once (__DIR__ . '/api/mailjet-api-v3.php');
 
 /**
 * This is Api Strategy Interface
 * @author		Pavel Tashev  
 * @author		Mailjet
 * @link		http://www.mailjet.com/
 */
 
 # ============================================== Interface ============================================== #
 interface Mailjet_Api_Interface 
 {
	public function getSenders($params);
 	public function getContactLists($params);
 	public function addContact($params);
	public function removeContact($params);
	public function unsubContact($params);
	public function subContact($params);	
	public function getAuthToken($params);	
	public function validateEmail($email);
 }
 
 
 
 
 
 # ============================================== Strategy ============================================== #
 # Strategy ApiV1
 class Mailjet_Api_Strategy_V1 extends Mailjet_Api_V1 implements Mailjet_Api_Interface
 {
	/**
	 * Get full list of senders
	 * 
	 * @param (array) $param = array('limit', ...) 
	 * @return (object)
	 */
 	public function getSenders($params)
	{
		// Set input parameters
		$input = array();
		if(isset($params['limit'])) $input['limit'] = $params['limit'];

		// Get the list
		$response = $this->userSenderList()->senders;
					
		// Check if the list exists
		if(isset($response))
		{
			$senders = array();
			$senders['domain'] = array();
			$senders['email'] = array();
			
			foreach ($response as $sender)
			{
				if($sender->status == 'active')
				{
					if(substr($sender->email, 0, 2) == '*@') 
						$senders['domain'][] = substr($sender->email, 2, strlen($sender->email)); // This is domain
					else						
						$senders['email'][] = $sender->email; // This is email
				}
			}
			return $senders;
		}		
		
		return (object) array('Status' => 'ERROR');
	}
	
 	/**
	 * Get full list of contact lists
	 * 
	 * @param (array) $param = array('limit', ...) 
	 * @return (object)
	 */
 	public function getContactLists($params)
	{
		// Set input parameters
		$input = array();
		if(isset($params['limit'])) $input['limit'] = $params['limit'];
		
		// Get the list
		$response = $this->listsAll($input);

		// Check if the list exists
		if(isset($response->status) && $response->status == 'OK')
		{
			$lists = array();
			foreach ($response->lists as $list)
			{
				$lists[] = array(
					'value' 		=> $list->id,
					'label' 		=> $list->label,
					'subscribers'	=> $list->subscribers,
				);
			}
			return $lists;
		}		
		
		return (object) array('Status' => 'ERROR');
	}
	
	/**
	 * Add a contact to a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
 	public function addContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
		
		// Add the contact
		$response = $this->listsAddContact(array(
			'method'	=> 'POST',
			'contact'	=> $params['Email'],
			'id'		=> $params['ListID']
		));
				
		// Check if the contact is added 
		if($response)
			return (object) array('Status' => 'OK');
		
		return (object) array('Status' => 'ERROR');
	}
	
	/**
	 * Remove a contact from a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
	public function removeContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
		
		// Unsubscribe the contact
		$response = $this->listsRemoveContact(array(
			'method'	=> 'POST',
			'contact'	=> $params['Email'],
			'id'		=> $params['ListID']
		));
		
		// Check if the contact is added 
		if($response)
			return (object) array('Status' => 'OK');
		
		return (object) array('Status' => 'OK');
	}
	
	/**
	 * Unsubscribe a contact from a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	*/
	public function unsubContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
			
		// Unsubscribe the contact
		$response = $this->listsUnsubContact(array(
			'method'	=> 'POST',
			'contact'	=> $params['Email'],
			'id'		=> $params['ListID']
		));
		
		// Check if the contact is added 
		if($response)
			return (object) array('Status' => 'OK');
		
		return (object) array('Status' => 'OK');
	}
	
	/**
	 * Subscribe a contact to a contact list with ID = ListID
	 *
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
	public function subContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
		
		// Subscribe the user
		$response = $this->listsAddContact(array(
			'method'	=> 'POST',
			'id'		=> $params['ListID'],
			'contact'	=> $params['Email'],
			'force'		=> 1,
		));
		
		// Check if the contact is added 
		if($response)
			return (object) array('Status' => 'OK');
		
		return (object) array('Status' => 'OK');
	}
	
	/**
	 * Get the authentication token for the iframes
	 * 
	 * @param (array) $param = array('APIKey', 'SecretKey', ...) 
	 * @return (object)
	*/
	public function getAuthToken($params)
	{		
		// Check if the input data is OK
		if(strlen(trim($params['APIKey'])) == 0 || strlen(trim($params['SecretKey'])) == 0)
			return (object) array('Status' => 'ERROR');	
			
	 	if (isset($params['MailjetToken']))
		{
			$op = json_decode($params['MailjetToken']);
			if ($op->timestamp > time() - 3600)
				return $op->token;
		}

		// Get the culture
		if(isset($lang) && $lang != null)
		{
			$locale = substr($lang->getTag(), 0, 2);
			if (!in_array($locale, array('en', 'fr', 'es', 'de')))
				$locale = 'en';
		} else {
			$locale = 'en';
		}

		// Define some required data
		$url = $this->apiUrl.'/apiKeyauthenticate?output=json';
		$data = array(
			'allowed_access[0]' => 'stats',
			'allowed_access[1]' => 'contacts',
			'allowed_access[2]' => 'campaigns',
			'lang' 				=> $locale,
			'default_page'		=> 'campaigns',
			'type' 				=> 'page',
			'apikey' 			=> $params['APIKey']
		);
		
		// Execute POST request
		$curl = curl_init();
		curl_setopt_array($curl, array(
		    CURLOPT_RETURNTRANSFER => 1,
		    CURLOPT_URL => $url,
		    CURLOPT_USERAGENT => 'Codular Sample cURL Request',
		    CURLOPT_POST => 1,
		    CURLOPT_POSTFIELDS => $data
		));
		curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    		"Authorization: Basic ".base64_encode($params['APIKey'] . ':' . $params['SecretKey'])
    	));
		$result = curl_exec($curl);
		$resp = json_decode($result);
		
		if (is_object($resp))
			if ($resp->status == 'OK')
				return $resp->token;
		
		return (object) array('Status' => 'ERROR'); 
	}	

	/**
	 * Validate if $email is real email
	 * 
	 * @param (string) $email 
	 * @return (boolean) TRUE|FALSE 
	 */
	public function validateEmail($email) {
		return (preg_match("/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/", $email) || !preg_match("/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/", $email)) ? FALSE : TRUE;
	}
 }


 # Strategy ApiV3
 class Mailjet_Api_Strategy_V3 extends Mailjet_Api_V3 implements Mailjet_Api_Interface
 {
	/**
	 * Get full list of senders
	 * 
	 * @param (array) $param = array('limit', ...) 
	 * @return (object)
	 */
 	public function getSenders($params)
	{
		// Set input parameters
		$input = array();
		if(isset($params['limit'])) $input['limit'] = $params['limit'];

		// Get the list
		$response = $this->sender($input);

		// Check if the list exists
		if(isset($response->Data))
		{
			$senders = array();
			$senders['domain'] = array();
			$senders['email'] = array();
			
			foreach ($response->Data as $sender)
			{
				if($sender->Status == 'Active')
				{
					if(substr($sender->Email, 0, 2) == '*@') 
						$senders['domain'][] = substr($sender->Email, 2, strlen($sender->Email)); // This is domain
					else						
						$senders['email'][] = $sender->Email; // This is email
				}
			}
			return $senders;
		}		
		
		return (object) array('Status' => 'ERROR');
	}
	
 	/**
	 * Get full list of contact lists
	 * 
	 * @param (array) $param = array('limit', ...) 
	 * @return (object)
	 */
 	public function getContactLists($params)
	{
		// Set input parameters
		$input = array(
			'akid'	=> $this->_akid
		);
		if(isset($params['limit'])) $input['limit'] = $params['limit'];
		
		// Get the list
		$response = $this->liststatistics($input);

		// Check if the list exists
		if(isset($response->Data))
		{
			$lists = array();
			foreach ($response->Data as $list)
			{
				$lists[] = array(
					'value' 		=> $list->ID,
					'label' 		=> $list->Name,
					'subscribers'	=> $list->SubscriberCount,
				);
			}
			return $lists;
		}		
		
		return (object) array('Status' => 'ERROR');
	}
	
	/**
	 * Add a contact to a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
 	public function addContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
		
		// Add the contact
		$result = $this->manycontacts(array(
			'method'			=> 'POST',
			'Action'			=> 'Add',
			'Addresses'			=> array($params['Email']),
			'ListID'			=> $params['ListID'],
		));

		// Check if any error
		if(isset($result->Data['0']->Errors->Items)) {
			if( strpos($result->Data['0']->Errors->Items[0]->ErrorMessage, 'duplicate') !== FALSE )
				return (object) array('Status' => 'DUPLICATE');
			else
				return (object) array('Status' => 'ERROR');	
		}		
		
		$this->subContact($params);
		return (object) array('Status' => 'OK');
	}
	
	/**
	 * Remove a contact from a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
	public function removeContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
			
		// Get the contact	
		$result = $this->listrecipient(array(
			'akid'          => $this->_akid,
			'method'        => 'GET',
			'ListID'		=> $params['ListID'],
			'ContactEmail'  => $params['Email']
        ));
        if($result->Count > 0) 
        {
            foreach($result->Data as $contact) 
			{
				// Remove the contact
				$response = $this->listrecipient(array(
					'akid'				=> $this->_akid,
					'method'			=> 'delete',
					'ID'				=> $contact->ID
				));
            }
			
			// Check if the unsubscribe is done correctly
			if(isset($response->Data[0]->ID))
				return (object) array('Status' => 'OK');
        }

		return (object) array('Status' => 'ERROR');
	}
	 
	/**
	 * Unsubscribe a contact from a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	*/
	public function unsubContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
		
		// Get the contact	
		$result = $this->listrecipient(array(
			'akid'          => $this->_akid,
			'method'        => 'GET',
			'ListID'		=> $params['ListID'],
			'ContactEmail'  => $params['Email']
        ));
        if($result->Count > 0) 
        {
            foreach($result->Data as $contact) 
            {
                if($contact->IsUnsubscribed !== TRUE)
                {
                      $response = $this->listrecipient(array(
                            'akid'    			=> $this->_akid,
                            'method'   			=> 'PUT',
                            'ID'       			=> $contact->ID,
                            'IsUnsubscribed' 	=> 'true',
                            'UnsubscribedAt' 	=> date("Y-m-d\TH:i:s\Z", time()),
                      ));
                } 
            }
			
			// Check if the unsubscribe is done correctly
			if(isset($response->Data[0]->ID))
				return (object) array('Status' => 'OK');
        }
		
		return (object) array('Status' => 'ERROR');
	}
	
	/**
	 * Subscribe a contact to a contact list with ID = ListID
	 *
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
	public function subContact($params)
	{
		// Check if the input data is OK
		if(!is_numeric($params['ListID']) || !$this->validateEmail($params['Email']))
			return (object) array('Status' => 'ERROR');	
		
		// Get the contact	
		$result = $this->listrecipient(array(
			'akid'          => $this->_akid,
			'method'        => 'GET',
			'ListID'		=> $params['ListID'],
			'ContactEmail'  => $params['Email']
        ));		
		
        if($result->Count > 0) 
        {
            foreach($result->Data as $contact) 
            {
                if($contact->IsUnsubscribed === TRUE)
                {
	                  $response = $this->listrecipient(array(
	                        'akid'    			=> $this->_akid,
	                        'method'   			=> 'PUT',
	                        'ID'       			=> $contact->ID,
	                        'IsUnsubscribed' 	=> 'false',	                        
	                  ));
                } 
            }
			
			// Check if the subscribe is done correctly
			if(isset($response->Data[0]->ID))
				return (object) array('Status' => 'OK');
        }
		
		return (object) array('Status' => 'ERROR');
	}
	
	/**
	 * Get the authentication token for the iframes
	 * 
	 * @param (array) $param = array('APIKey', 'SecretKey', ...) 
	 * @return (object)
	*/
	public function getAuthToken($params)
	{
		// Check if the input data is OK
		if(strlen(trim($params['APIKey'])) == 0 || strlen(trim($params['SecretKey'])) == 0)
			return (object) array('Status' => 'ERROR');	

		// Get the ID of the Api Key
	 	$api_key_response = $this->apikey(array(
			'method' => 'GET',
			'APIKey' => $params['APIKey']
		));

		// Check if the response contains data
		if(!isset($api_key_response->Data[0]->ID))
			return (object) array('Status' => 'ERROR');

		// Get token
		$response = $this->apitoken(array(
			'AllowedAccess' =>  'campaigns,contacts,reports,stats,preferences,pricing,account',
			'method' 		=> 'POST',			
			'APIKeyID' 		=> $api_key_response->Data[0]->ID,
			'TokenType' 	=> 'iframe',			
			'CatchedIp'  	=> $_SERVER['REMOTE_ADDR'],
			'log_once' 		=> TRUE,
			'IsActive'		=> TRUE
		));	

	 	// Get and return the token
		if(isset($response->Data) && count($response->Data) > 0)
			return $response->Data[0]->Token;
		
		return (object) array('Status' => 'ERROR');
	}	
	
	/**
	 * Validate if $email is real email
	 * 
	 * @param (string) $email 
	 * @return (boolean) TRUE|FALSE 
	 */
	public function validateEmail($email) {
		return (preg_match("/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/", $email) || !preg_match("/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/", $email)) ? FALSE : TRUE;
	}
 }
 
 
 
 
 
 # ============================================== Context ============================================== #
 class Mailjet_Api
 {
 	private $context;
	public $version; 
	public $apiUrl;
	
	public function __construct($mailjet_username, $mailjet_password)
  	{
  		# Check the type of the user and set the corresponding Context/Strategy
  		// Set API V3 context and get the user and check if it's V3   		
		$this->setContext(new Mailjet_Api_Strategy_V3($mailjet_username, $mailjet_password));
		//$response = $this->context->getContactLists(array('limit' => 1));
		$response = $this->context->getSenders(array('limit' => 1));
		if(isset($response->Status) && $response->Status == 'ERROR')
		{
			// Set API V1 context and get the contact lists of this user and check if it's V1
			$this->setContext(new Mailjet_Api_Strategy_V1($mailjet_username, $mailjet_password));	
			$response = $this->context->getSenders(array('limit' => 1));
			if(isset($response->Status) && $response->Status == 'ERROR')
			{				
				$this->clearContext();			
			} 
			else {			
				// Get the version and the apiUrl of the API
				$this->version = $this->context->version;
				$this->apiUrl = 'in.mailjet.com';
			}
		} else {
			// Get the version and the apiUrl of the API
			$this->version = $this->context->getVersion();
			$this->apiUrl = 'in-v3.mailjet.com';
		}		
	}
	
	/**
	 * Set the context of the Api - V1 or V3 
	 *
     * @param Mailjet_Api_Interface $context
     * @return void
     */
	private function setContext(Mailjet_Api_Interface $context)
    {
        $this->context = $context;
    }
	
	/**
	 * Clear the context
	 *
     * @param void
     * @return void
     */
	private function clearContext()
    {
        $this->context = FALSE;
    }
	
	
	/**
	 * Get full list of senders
	 * 
	 * @param (array) $param = array('limit', ...) 
	 * @return (object)
	 */
	public function getSenders($params)
	{	
		// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
			
		return $this->context->getSenders($params);
	}	
	
	/**
	 * Get full list of contact lists
	 * 
	 * @param (array) $param = array('limit', ...) 
	 * @return (object)
	 */
	public function getContactLists($params)
	{	
		// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
			
		return $this->context->getContactLists($params);
	}
	
	/**
	 * Add a contact to a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
	 public function addContact($params)
	 {
	 	// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
		
	 	return $this->context->addContact($params);
	 }
	 
	 /**
	 * Remove a contact from a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
	 public function removeContact($params)
	 {
	 	// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
		
	 	return $this->context->removeContact($params);
	 }
	 
	 /**
	 * Unsubscribe a contact from a contact list with ID = ListID
	 * 
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	*/
	  public function unsubContact($params)
	  {
	  	// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
		
	  	return $this->context->unsubContact($params);
	  }
	  
	 /**
	 * Subscribe a contact to a contact list with ID = ListID
	 *
	 * @param (array) $param = array('Email', 'ListID', ...) 
	 * @return (object)
	 */
	  public function subContact($params)
	  {
	  	// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
		
	  	return $this->context->subContact($params);
	  }
	  
	  /**
		* Get the authentication token for the iframes
		* 
		* @param (array) $param = array('APIKey', 'SecretKey', ...) 
		* @return (object)
	  */
	  public function getAuthToken($params)
	  {
	  	// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
		
	  	return $this->context->getAuthToken($params);
	  }	
	  
	  /**
	  * Validate if $email is real email
	  * 
	  * @param (string) $email 
	  * @return (boolean) TRUE|FALSE 
	  */
	  public function validateEmail($email) {
	  	// Check if we have context, if no, return error
        if($this->context === FALSE)
			return (object) array('Status' => 'ERROR');
		
		return $this->context->validateEmail($email);
	  }
 }
 components/com_mailjet/lib/lib/api/mailjet-api-v3.php000060400000067407152453623460016560 0ustar00<?php

/**
 * Mailjet Public API / The real-time Cloud Emailing platform
 *
 * Connect your Apps and Make our product yours with our powerful API
 * http://www.mailjet.com/ Mailjet SAS Website
 *
 * @package		API v0.3
 * @author		David Coullet
 * @author		Mailjet Dev team
 * @copyright	Copyright (c) 2012-2013, Mailjet SAS, http://www.mailjet.com/Terms-of-use.htm
 * @file
 */

// ---------------------------------------------------------------------

/**
 * Mailjet Public API Main Class
 *
 * This class enables you to connect your Apps and use our powerful API.
 * You can use the 'metadata' call to retrieve a list of each object available
 * or implemented a live discovery.
 * http://www.mailjet.com/docs/api
 *
 * updated on 2013-09-03
 *
 * @class		MailjetApi
 * @author		David Coullet
 * @author		Mailjet Dev team
 * @version		0.1
 */
class Mailjet_Api_V3
{
    /**
     * Mailjet API Key to use.
     * You can edit directly and add here your Mailjet infos
     *
     * @access	private
     * @var		string $_apiKey
     */
    private $_apiKey = '';

    /**
     * Mailjet API Secret Key to use.
     * You can edit directly and add here your Mailjet infos
     *
     * @access	private
     * @var		string $_secretKey
     */
    private $_secretKey = '';

    /**
     * Seconds before updating the cache object
     * If set to 0, Object caching will be disabled
     *
     * @access	private
     * @var		integer $_cache
     */
    private $_cache = 0;//600;

// ---------------------------------------------------------------------

    /**
     * API URL
     *
     * @access	private
     * @var		string
     */
    private $_apiUrl = 'api.mailjet.com/v3/';

    /**
     * API version to use
     *
     * @access	private
     * @var		string
     */
    private $_version = 'REST';

    /**
     * Debug internal flag
     *
     * @access	private
     * @var		boolean
     */
    private $_debug = false;

    /**
     * Debug Label
     *
     * @access	private
     * @var		string
     */
    private $_debug_info = '';

    /**
     * Debug buffer copy
     *
     * @access	private
     * @var		string
     */
    private $_buffer = '';

    /**
     * Debug method copy
     *
     * @access	private
     * @var		string
     */
    private $_method = '';

    /**
     * Debug by cURL
     *
     * @access	private
     * @var		array
     */
    private $_info = NULL;

    /**
     * cURL handle resource
     *
     * @access	private
     * @var		resource
     */
    private $_curl_handle = NULL;

    /**
     * 
     * @var Boolean
     */
    protected $_log_allowed = false;
    
    /**
     * 
     * @var Boolean
     */
    protected $_log = false;
    
    /**
     * 
     * @var Boolean
     */
    protected $_log_once = false;
    
    /**
     *
     * @var Boolean
     */
    protected $_extra_err = false;
    
    /**
     * 
     * @var String
     */
    protected $_log_path = 'logs/api/current.log';
    
    /**
     * Singleton pattern : Current instance
     *
     * @access	private
     * @var		resource
     */
    private static $_instance = NULL;

    /**
     * Constructor
     *
     * Set $_apiKey and $_secretKey if provided & Update $_apiUrl with protocol
     *
     * @access	public
     * @uses	MailjetApi::$_apiKey
     * @uses	MailjetApi::$_secretKey
     * @param string  $_apiKey    Mailjet API Key
     * @param string  $_secretKey Mailjet API Secret Key
     * @param boolean $secure     TRUE to secure the transaction, FALSE otherwise
     */
    public function __construct($apiKey = NULL, $secretKey = NULL, $secure = FALSE)
    {
        if (isset($apiKey))
            $this->_apiKey = $apiKey;
        if (isset($secretKey))
            $this->_secretKey = $secretKey;
        $this->_apiUrl = 'http://'.$this->_apiUrl.$this->_version.'/';
        $this->secure($secure);
        
        $this->_log_allowed = get_cfg_var('MAILJET_ENVIRONMENT') == 'dev';
        
        $this->_fixLogPath();
    }

    /**
     * Singleton pattern :
     * Get the instance of the object if it already exists
     * or create a new one.
     *
     * @access	public
     * @uses	MailjetApi::$_instance
     */
    public static function getInstance()
    {
        if (!(self::$_instance instanceof self))
            self::$_instance = new self();

        return self::$_instance;
    }

    /**
     * Destructor
     *
     * Close the cURL handle resource
     *
     * @access	public
     * @uses	MailjetApi::$_curl_handle
     */
    public function __destruct()
    {
        if(!is_null($this->_curl_handle))
            curl_close($this->_curl_handle);
        $this->_curl_handle = NULL;
    }

    /**
     * Set new Api Key and Secret Key
     *
     * @access	public
     * @uses	MailjetApi::$_apiKey
     * @uses	MailjetApi::$_secretKey
     * @param string $apiKey    Mailjet API Key
     * @param string $secretKey Mailjet API Secret Key
     */
    public function setKeys($apiKey, $secretKey)
    {
        $this->_apiKey = $apiKey;
        $this->_secretKey = $secretKey;
    }

    /**
     * Set the seconds before updating the cache object
     * If set to 0, Object caching will be disabled
     *
     * @access	public
     * @uses	MailjetApi::$_cache
     * @param integer $cache Cache to set in seconds
     */
    public function setCache($cache)
    {
        $this->_cache = $cache;
    }

    /**
     * Get the seconds before updating the cache object
     * If set to 0, Object caching will be disabled
     *
     * @access	public
     * @uses	MailjetApi::$_cache
     *
     * @return integer Cache in seconds
     */
    public function getCache()
    {
        return ($this->_cache);
    }

    /**
     * 
     * @param Boolean $flag
     * @return mailjetapi
     */
    public function setLog($flag)
    {
    	$this->_log = (boolean) $flag;
    	return $this;
    }
    
    /**
     * 
     * @return boolean
     */
    public function getLog()
    {
    	return $this->_log;
    }
    
    /**
     * 
     * @param Boolean $flag
     * @return mailjetapi
     */
    public function setLogOnce($flag)
    {
    	$this->_log_once = (boolean) $flag;
    	return $this;
    }
    
    /**
     * 
     * @return boolean
     */
    public function getLogOnce()
    {
    	return $this->_log_once;
    }
    
	/**
     * 
     * @return string
     */
    public function getVersion()
    {
    	return $this->_version;
    }
	
    /**
     *
     * @param Boolean $flag
     * @return mailjetapi
     */
    public function setExtraError($flag)
    {
    	$this->_extra_err = (boolean) $flag;
    	return $this;
    }
    
    /**
     *
     * @return boolean
     */
    public function getExtraError()
    {
    	return $this->_extra_err;
    }

    /**
     * Enable log only if MAILJET_ENVIRONMENT == 'dev'
     * @return boolean
     */
    public function logAllowed()
    {
    	return $this->_log_allowed;
    }
    
    /**
     * 
     * @param String $path
     * @return mailjetapi
     */
    public function setLogPath($path)
    {
    	if ($real_path = realpath($path)) {
    		$this->_log_path = $real_path;
    	}
    	return $this;
    }
    
    /**
     * 
     * @return String
     */
    public function getLogPath()
    {
    	return $this->_log_path;
    }
    
    /**
     * 
     * @return mailjetapi
     */
    protected function _fixLogPath()
    {
    	//fix log path
		if(!defined('SYSTEMPATH')) define('SYSTEMPATH', dirname(__FILE__).'/../');
    	$this->_log_path = realpath(SYSTEMPATH.$this->_log_path);
    	$logFilename = 'daily-'.date('Ymd').'.log';
    	$this->_log_path = str_replace('current.log', $logFilename, $this->_log_path);
		return $this;
    }
    
    /**
     * Secure or not the transaction through https
     *
     * @access	public
     * @uses	MailjetApi::$_apiUrl
     * @param boolean $secure TRUE to secure the transaction, FALSE otherwise
     */
    public function secure($secure = TRUE)
    {
        $protocol = 'http';
        if ($secure)
            $protocol = 'https';
        $this->_apiUrl = preg_replace('/http(s)?:\/\//', $protocol.'://', $this->_apiUrl);
    }

    /**
     * Make the magic call ;)
     *
     * Check for some arguments and order them before sending the request.
     * If '_debug_info' is found, some data are stored and can be retrieved
     * with a call to MailjetApi::getDebugInfo().
     *
     * @access	public
     * @uses	MailjetApi::$_debug
     * @uses	MailjetApi::$_debug_info
     * @uses	MailjetApi::sendRequest() to send the request
     * @param string $object Method to call
     * @param array  $args   Array of parameters
     *
     * @return string JSON string by default (format can be change with the 'format' parameter)
     */
    public function __call($object, $args)
    {
        if (sizeof($args) > 0)
            $params = $args[0];
        else
            $params = array();

        if (isset($params['method'])) {
            $method = strtoupper($params['method']);
            unset($params['method']);
        }
        if (!isset($method) || !in_array($method, array('GET', 'POST', 'PUT', 'DELETE', 'JSON')))
            $method = 'GET';

        if (isset($params['debug_info'])) {
            $this->_debug = TRUE;
            $this->_debug_info = $params['debug_info'];
            unset($params['debug_info']);
        }
        
        /**
         * Logging
         */
        if (isset($params['log'])) {
        	$this->setLog($params['log']);
        	unset($params['log']);
        }
        
        if (isset($params['log_once'])) {
        	$this->setLogOnce($params['log_once']);
        	unset($params['log_once']);
        }
        
        if (isset($params['log_path'])) {
        	$this->setLogPath($params['log_path']);
        	unset($params['log_path']);
        }
        
        // Extra Error
        if (isset($params['extra_err'])) {
        	$this->setExtraError($params['extra_err']);
        	unset($params['extra_err']);
        }
        
        /**
         * Fallback logging when debug is true
         */
        if ($this->_debug) {
        	$this->setLogOnce(true);
        }

        return (json_decode($this->sendRequest($object, $params, $method)));
    }

    /**
     * Send Request
     *
     * Send the request to the Mailjet API server and get back the result
     * Basically, setup and execute the curl process.
     * Cache management added
     *
     * @access	private
     * @uses	MailjetApi::$_info
     * @uses	MailjetApi::$_debug
     * @uses	MailjetApi::$_buffer
     * @uses	MailjetApi::$_method
     * @uses	MailjetApi::$_apiKey
     * @uses	MailjetApi::$_secretKey
     * @uses	MailjetApi::$_curl_handle
     * @uses	MailjetApi::buildURL() to build the full Url for the request and update the list of parameters accordingly
     * @param string $object Object or collection of resources you want to access
     * @param array  $params Additional parameters for the request
     * @param string $method POST:	Create a resource
     * 							GET:	Read one or multiple resources
     * 							PUT:	Update one or multiple resources
     * 							DELETE:	Delete one or multiple resources
     *
     * @return string the result of the request
     */
    private function sendRequest($object, $params, $method)
    {

    	// Log if this is a JSON call with an ID inside params
    	$is_json_put = (isset($params['ID']) && !empty($params['ID']));
    
        list($url, $params) = $this->buildURL($object, $params, $method);

        if ($this->_cache != 0 && $method == 'GET' && !$this->_akid) {
            $file = $method.'.'.$object.'.'.hash('md5', $this->_apiKey.http_build_query($params, '', '')).'.cache';
        }

        if(is_null($this->_curl_handle))
            $this->_curl_handle = curl_init();

        curl_setopt($this->_curl_handle, CURLOPT_URL, $url);
        curl_setopt($this->_curl_handle, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($this->_curl_handle, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($this->_curl_handle, CURLOPT_SSL_VERIFYHOST, 2);
        curl_setopt($this->_curl_handle, CURLOPT_USERPWD, $this->_apiKey.':'.$this->_secretKey);
        curl_setopt($this->_curl_handle, CURLOPT_CUSTOMREQUEST, $method);
        curl_setopt($this->_curl_handle, CURLOPT_USERAGENT, 'joomla-3.0');
    	
        switch ($method) {
            case 'GET' :
                curl_setopt($this->_curl_handle, CURLOPT_HTTPGET, TRUE);
                curl_setopt($this->_curl_handle, CURLOPT_POSTFIELDS, NULL);
            break;

            case 'POST':
                if(isset($params['Action']) && $params['Action']=='Add'){
                    curl_setopt($this->_curl_handle, CURLOPT_POST, count($params));
                    curl_setopt($this->_curl_handle, CURLOPT_POSTFIELDS, json_encode($params));
                    curl_setopt($this->_curl_handle, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
                }
                else{
                    curl_setopt($this->_curl_handle, CURLOPT_POST, count($params));
                    curl_setopt($this->_curl_handle, CURLOPT_POSTFIELDS, $this->curl_build_query($params));
                }
            break;

            case 'PUT':
                curl_setopt($this->_curl_handle, CURLOPT_POSTFIELDS, $this->curl_build_query($params));
            break;
            
            case 'JSON':
            	if($is_json_put)
            		curl_setopt($this->_curl_handle, CURLOPT_CUSTOMREQUEST, "PUT");            		
            	else
            		curl_setopt($this->_curl_handle, CURLOPT_CUSTOMREQUEST, "POST");
            	
            	$params = json_encode($params);
				curl_setopt($this->_curl_handle, CURLOPT_POSTFIELDS, $params);
				curl_setopt($this->_curl_handle, CURLOPT_RETURNTRANSFER, TRUE);
				curl_setopt($this->_curl_handle, CURLOPT_HTTPHEADER, array(
				    'Content-Type: application/json',
				    'Content-Length: ' . strlen($params))
				);
            break;
            	
        }

        $buffer = curl_exec($this->_curl_handle);

        $this->_info = curl_getinfo($this->_curl_handle);
        $this->_response_code = $this->_info['http_code'];
        
		curl_close($this->_curl_handle);
		$this->_curl_handle = null;
        
        if ($this->_debug) {
            $this->_buffer = $buffer;
            $this->_method = $method;
            $this->_debug = FALSE;
        }

        if ($this->_cache != 0 && $method == 'GET' && !$this->_akid) {
            $data = array('timestamp' => time(), 'result' => $buffer, 'http_code' => $this->_info['http_code']);
        }
        
        if( $this->getExtraError() ){
        	$this->getExtraErr( $buffer );
        	$this->setExtraError( false );
        }
        
        if ($this->logAllowed() && ($this->getLog() || $this->getLogOnce())) {

        	if ($this->_info) {
	        	$moreInfo = print_r(array(
	       			'content_type'	=> $this->_info['content_type'],
	        		'http_code'		=> $this->_info['http_code'],
	        		'total_time'	=> $this->_info['total_time'],
	        	), true);
	        	$moreInfo = substr($moreInfo, 6);
        	} else {
        		$moreInfo = 'none';
        	}
        	
        	$date = DateTime::createFromFormat('U.u', microtime(true));
        	
            if (is_array($params)) {
        		$jsonParams = json_encode($params);
        	} else {
        		$jsonParams = $params;
        	}
        	        	
        	$logLines = array();
        	
			$logLines[] = '';
        	$logLines[] = $date->format('Y-m-d H:i:s.u')." > {$object} :: {$method}";
			$logLines[] = '';
			$logLines[] = $this->_info['url'];
			$logLines[] = '';
			$logLines[] = "Request";
			$logLines[] = $jsonParams;
			$logLines[] = '';
			$logLines[] = "Response";
			$logLines[] = $buffer;
			$logLines[] = '';
			$logLines[] = 'Info';
			$logLines[] = $moreInfo;
			$logLines[] = '';
			$logLines[] = str_repeat("=", 100);
			$logLines[] = '';
				
			$logText = implode(PHP_EOL, $logLines);

			file_put_contents($this->getLogPath(), $logText, FILE_APPEND);
        	
			$this->setLogOnce(false);
			
        }
        
        return $buffer;
    }

    /**
     * Build the full Url for the request and update the parameters if needed
     *
     * @access	private
     * @uses	MailjetApi::$_apiUrl
     * @param string $object Object or collection of resources you want to access
     * @param array  $params Additional parameters for the request
     * @param string $method POST:	Create a resource
     * 							GET:	Read one or multiple resources
     * 							PUT:	Update one or multiple resources
     * 							DELETE:	Delete one or multiple resources
     *
     * @return array Full built Url for the request and new params
     */
    private function buildURL($object, $params, $method = 'GET')
    {
        $url = $this->_apiUrl.$object;

        if (isset($params['ID'])) {
            $url .= '/'.$params['ID'];
            unset($params['ID']);
        }

        $this->_akid = array_key_exists('akid', $params);

        if ($method == 'GET')
            $url .= '?'.http_build_query($params, '', '&');
        elseif ($method == 'PUT' || $method == 'POST' || $method == 'DELETE' || $method == 'JSON') {
            $tocheck = array('format', 'style', 'countrecords', 'recurse', 'akid', 'DuplicateFrom');
            $query = array();
            foreach ($params as $key => $value)
                if (in_array($key, $tocheck)) {
                    $query[$key] = $value;
                    unset($params[$key]);
                }
            if(count($query))
            	$url .= '?'.http_build_query($query, '', '&');
            	
        } 

        return (array($url, $params));
    }

    /**
     * Build query for cURL
     * Beware of the Boolean !
     *
     * @access	private
     * @param array $params Post parameters for the request
     *
     * @return string URL-encoded query string from the associative array provided
     */
    private function curl_build_query($params)
    {
    	foreach($params as $key => $value) {
	    	if($value === TRUE)
	    		$value = 'true';
	    	elseif($value === FALSE)
	    		$value = 'false';
    	}
        /*array_walk($params, function(&$value, &$key) {
            if ($value === TRUE) {
                $value = 'true';
            } elseif ($value === FALSE) {
                $value = 'false';
            }
        });*/

        return (http_build_query($params, '', '&'));
    }

    /**
     * Get the last HTTP code retrieved by cURL
     *
     * Warning : Information returned by this function is kept.
     * So, if you call it again, the previous info is returned.
     *
     * @access	public
     * @uses	MailjetApi::$_info
     *
     * @return integer last HTTP code retrieved by cURL or 0 if not set
     */
    public function getLastHTTPCode()
    {
        if (isset($this->_info['http_code']))
            return ($this->_info['http_code']);

        return (0);
    }

    /**
     * Set some info if the object came from the cache
     *
     * @access	private
     * @uses	MailjetApi::$_info
     * @uses	MailjetApi::$_buffer
     * @uses	MailjetApi::$_method
     * @uses	MailjetApi::$_debug_info
     */
    private function setCacheDebugInfo($method, $url, $data)
    {
        $this->_debug_info .= ' /* LAST CACHED AT '.date('Y/m/d H:i:s', $data['timestamp']).' - UPDATING EVERY '.$this->_cache.'s */';
        $this->_buffer = $data['result'];
        $this->_method = $method;
        $this->_info = array();
        $this->_info['url'] = $url;
        $this->_info['http_code'] = $data['http_code'];
        $this->_info['total_time'] = $this->_info['pretransfer_time'] = 0;
        $this->_debug = FALSE;
    }

    /**
     * Get some info for debugging purpose
     *
     * Warning : Information returned by this function is kept.
     * So, if you call it again, the previous info is returned.
     * To update this array, you need to add the key 'debug_info'
     * to the list of parameters. You can specified a value to
     * identify the returned array.
     *
     * @access	public
     * @uses	MailjetApi::$_info
     * @uses	MailjetApi::$_method
     * @uses	MailjetApi::$_debug_info
     *
     * @return array with some debug info
     */
    public function getDebugInfo()
    {
        $status_code = array (
            200 => 'OK - Everything went fine.',
            201 => 'OK - Created : The POST request was successfully executed.',
            204 => 'OK - No Content : The Delete request was successful.',
            304 => 'OK - Not Modified : The PUT request didn’t affect any record.',
            400 => 'KO - Bad Request : Please check the parameters.',
            401 => 'KO - Unauthorized : A problem occurred with the apiKey/secretKey. You may be not authorized to access the API or your apiKey may have expired.',
            403 => 'KO - Forbidden : You are not authorized to call that function.',
            404 => 'KO - Not Found : The resource with the specified ID does not exist.',
            405 => 'KO - Method not allowed : Attempt to put/post multiple resources in 1 request.',
            500 => 'KO - Internal Server Error.',
            503 => 'KO - Service unavailable.'
        );

        if (array_key_exists($this->_info['http_code'], $status_code))
            $http_code_text = $status_code[$this->_info['http_code']];
        else
            $http_code_text = 'KO - Service unavailable.';

        $status_message = '';
        if ($this->_info['http_code'] >= 400) {
            $buffer = json_decode($this->_buffer);
            if (!is_null($buffer) && isset($buffer->StatusCode) && isset($buffer->ErrorMessage)) {
                $status_message = $buffer->StatusCode.' - '.$buffer->ErrorMessage;
                if (isset($buffer->ErrorInfo) && !empty($buffer->ErrorInfo))
                    $status_message .= ' ('.$buffer->ErrorInfo.')';
            }
        }

        $res = array(
            'debug_info'	=> $this->_debug_info,
            'method'		=> $this->_method,
            'url'			=> $this->_info['url'],
            'duration'		=> $this->_info['total_time'] - $this->_info['pretransfer_time'],
            'http_code'		=> $this->_info['http_code'],
            'http_code_text'=> $http_code_text,
            'status_message'=> $status_message,
            'curl_info'		=> $this->_info,
            'buffer'		=> $this->_buffer
        );

        return $res;
    }
    
    protected function getExtraErr( &$buffer )
    {   
    	$bufferCheck = json_decode($buffer);
    	
    	if( is_null( $bufferCheck ) )
    		return;
    	
    	$buffer = $bufferCheck;   	
    	
    	if( $this->_info['http_code'] < 400 )
    	{
    		$response = array( (object)array( "ExtraErrCode" => $this->_info['http_code'], "ExtraErrKey" => "", "ExtraErrMsg" => "" ) );
    		$buffer->ExtraError = $response ;
    		$buffer = json_encode( $buffer );
    		return;
    	}
    	
    	$internalErrors = array(  
    			'MJ01' => 'Could not determine APIKey', 								// SERRCouldNotDetermineAPIKey
    			'MJ02' => 'No persister object found for class: "%s"', 					// SErrNoPersister
    			'MJ03' => 'A non-empty value is required', 								// SErrValueRequired
    			'MJ04' => 'Value must have at least length %d',							// SErrMinLength
    			'MJ05' => 'Value may have at most length %d',							// SErrMaxLength
    			'MJ06' => 'Value must be larger than or equal to %s',					// SErrMinValue
    			'MJ07' => 'Value must be less than or equal to %s',						// SErrMaxValue
    			'MJ08' => 'Property %s is invalid: %s', 								// SErrInProperty
    			'MJ09' => 'Value is not in list of allowed values: (%s)',				// SErrValueNotInList
    			'MJ10' => 'Value must be positive',										// SErrPositiveValueRequired
    			'MJ11' => 'Unknown object type "%s".',									// SErrUnknownObject
    			'MJ12' => 'Cannot save object of type %s',								// SerrCannotSaveObjectType
    			'MJ13' => 'Invalid characters in MD5 hash: "%s"',						// SErrInvalidHashCharacters
    			'MJ14' => 'Invalid length for MD5 hash: %d',							// SErrInvalidHashLength
    			'MJ15' => 'Unknown relation name : "%s"',								// SErrUnkownRelation
    			'MJ16' => 'Class "%s" does not support a unique key.',					// SErrNoAlternateKey
    			'MJ17' => '(%s) Cannot search unique key: unique key value is empty.',	// SErrNoAlternateKeyValue
    			'MJ18' => 'A %s resource with value "%s" for %s already exists.',		// SErrDuplicateKey
    			'MJ19' => 'Setting a value for property "%s" is not allowed',			// SErrCannotWriteProperty
    			'MJ20' => 'Setting a value for properties is not allowed',				// SErrCannotWriteProperties   			
    			// ContactMetadata
    			'CM01' => 'Property "%s" already exists',								// sERRCMPropertyAlreadyExists
    			'CM02' => 'Unknown namespace : %s',										// SERRCMUnknownNamespace
    			'CM03' => '"%s" is not a valid integer value for key %s',				// SERRCMNotAValidIntegerValueForKey
    			'CM04' => '"%s" is not a valid bool value for key %s',					// SERRCMNotAValidBoolValueForKey
    			'CM05' => '"%s" is not a valid float value for key %s',					// SERRCMNotAValidFloatValue
    			'CM06' => 'Length of value (%d bytes) exceeds maximum data length (%d bytes) ',	// SERRCMLengthOfValueExceedsMaxDataLength
    			'CM07' => 'Internal error: invalid data type %d',						// SERRCMInternalErrorInvalidDataType
    			'CM08' => '"%s" is not a valid datatype'								// SERRCMNotAValidDataType
    	); 	
    	
    	$response = array();
    	
    		// We expect here $this->_info['http_code']  to be >= 400   	
    	if ( isset($buffer->StatusCode) ) {
    		if( ( isset($buffer->ErrorInfo) && !empty($buffer->ErrorInfo) ) || ( isset($buffer->ErrorMessage) && !empty($buffer->ErrorMessage) ) )
    		{	
    			$comeFromString = false;
    			if( !empty( $buffer->ErrorInfo ) )
    			{  	
    				$info = json_decode( $buffer->ErrorInfo );
    				if( empty( $info) ) // message is type=string
    				{   	
    					$comeFromString = true ;
    					$errInfos = array( (object)$buffer->ErrorInfo );
    				}else{   					
    					$errInfos =  $info;
    				}
    			}else{  // ( !empty( $buffer->ErrorMessage ) )
    				$info = json_decode( $buffer->ErrorMessage );
    				if( empty( $info ) ) // message is type=string
    				{
    					$comeFromString = true ;
    					$errInfos = array( (object)$buffer->ErrorMessage );
    				}else{   					
    					$errInfos = $info;
    				}
    			}	
    			/**
    			*  Default response. Most of the ErrorInfo/ErrorMessage will come as they are - without specific err code in front!
    			*  We keep the ExtraErrors = ErrorInfo/ErrorMessage. 
    			*  
    			*  In the feature all the responses will consist these special codes.
    			*  When this happen (!!! ToDo !!!) -> we have to override coming StatusCode and ErrorInfo with parsed error results. And remove this ExtraError from the buffer
    			*  $internalErrors array and preg_match -> should be removed. We should catch the first 4 symbols from the string (this will be StatusCode), 
    			*  all the remaining string will be ErrorInfo 
    			*/  			   			 			 			    			
    			$errCodes = array_keys( $internalErrors );   			
    			$regexp = '/^(' . implode( '|',array_values( $errCodes ) ).')/i';   
    			foreach( $errInfos as $errInfoObj )
    			{    
    				foreach( $errInfoObj as $key => $errInfo )	
    				{			
	    				$tempResp = array();
	    				$tempResp["ExtraErrCode"] = $buffer->StatusCode;
	    				$tempResp["ExtraErrKey"] = "";
	    				$tempResp["ExtraErrMsg"] = $errInfo;
	    				
	    				preg_match($regexp, $errInfo, $matches);   	
	    				if( !empty( $matches ))
	    				{
	    					$tempResp["ExtraErrCode"] = $matches[1];
	    					if( $comeFromString )
	    						$tempResp["ExtraErrKey"] = '';
	    					else 
	    						$tempResp["ExtraErrKey"] = $key;
	    					$tempResp["ExtraErrMsg"] = $internalErrors[$matches[1]];
	    				}
	    				$response[] = $tempResp ;
    				}
    			}   			 			   			
    		}
    	}
    		// Check if is $response empty !    
    	if( empty( $response ) )
    	{
    		$response = array( (object)array( "ExtraErrCode" => $this->_info['http_code'], "ExtraErrKey" => "", "ExtraErrMsg" => "" ) );
    	}	
    	
    	$buffer->ExtraError = $response ;
    	$buffer = json_encode( $buffer );
    }

}components/com_mailjet/lib/lib/api/mailjet-api-v1.php000060400000014414152453623460016544 0ustar00<?php

/**
 * Mailjet Public API
 *
 * @package		API v0.1
 * @author		Mailjet
 * @link		http://api.mailjet.com/
 *
 */

class Mailjet_Api_V1
{
	var $version = '0.1';

	// Choose your weapon : php, json, xml, serialize, html, csv
	var $output = 'json';

	// Connect thru https protocol
	var $secure = false;

	// Mode debug ? 0 none / 1 errors only / 2 all
	var $debug = 0;
	
	// Edit with your Mailjet Infos
	var $apiKey = '';
	var $secretKey = '';

	// Constructor function
	public function __construct($apiKey = false, $secretKey = false)
	{
		if ($apiKey)
			$this->apiKey = $apiKey;
		if ($secretKey)
			$this->secretKey = $secretKey;

		$this->apiUrl = (($this->secure) ? 'https' : 'http') . '://api.mailjet.com/' . $this->version . '';
	}

	public function __call($method, $args)
	{
		// params
		$params = (sizeof($args) > 0) ? $args[0] : array();

		// request method
		$request = isset($params["method"]) ? strtoupper($params["method"]) : 'GET';

		// unset useless params
		if (isset($params["method"]))
			unset($params["method"]);

		// Make request
		$result = $this->sendRequest($method, $params, $request);

		// Return result
		$return = ($result === true) ? $this->_response : false;

		if ($this->debug == 2 || ( $this->debug == 1 && $return == false))
			$this->debug();

		return $return;
	}

	public function requestUrlBuilder($method,$params=array(),$request)
	{
		$query_string = array('output' => 'output=' . $this->output);

		foreach ($params as $key => $value)
		{
			if ($request == 'GET' || in_array($key, array('apikey', 'output')))
				$query_string[$key] = $key . '=' . urlencode($value);
			if ($key == 'output')
				$this->output = $value;
		}

		$this->call_url = $this->apiUrl . '/' . $method . '/?' . join('&', $query_string);

		return $this->call_url;
	}

	public function sendRequest($method = false, $params = array(), $request = 'GET')
	{
		// Method
		$this->_method = $method;
		$this->_request = $request;

		// Build request URL
		$url = $this->requestUrlBuilder($method, $params, $request);

		if (!in_array('curl', get_loaded_extensions()))
			die('Error: You must have cURL extension enabled !');

		// Set up and execute the curl process
		$curl_handle = curl_init();
		curl_setopt($curl_handle, CURLOPT_URL, $url);
		curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, FALSE);
		curl_setopt($curl_handle, CURLOPT_SSL_VERIFYHOST, 2);
		curl_setopt($curl_handle, CURLOPT_USERPWD, $this->apiKey . ':' . $this->secretKey);
		curl_setopt($curl_handle, CURLOPT_VERBOSE, true);
		curl_setopt($curl_handle, CURLINFO_HEADER_OUT, true);
        curl_setopt($curl_handle, CURLOPT_USERAGENT, 'joomla-1.0');
    	

		$this->_request_post = false;
		if ($request == 'POST')
		{
			curl_setopt($curl_handle, CURLOPT_POST, count($params));
			curl_setopt($curl_handle, CURLOPT_POSTFIELDS, http_build_query($params));
			$this->_request_post = $params;
		}

		$buffer = curl_exec($curl_handle);

		if ($this->debug > 2)
		{
			$this->debug();
			// var_dump($buffer);
			// var_dump(curl_getinfo($curl_handle));
		}

		// Response code
		$this->_response_code = curl_getinfo($curl_handle, CURLINFO_HTTP_CODE);

		// Close curl process
		curl_close($curl_handle);

		// RESPONSE
		$this->_response = ($this->output == 'json') ? json_decode($buffer) : $buffer;

		return ($this->_response_code == 200) ? true : false;
	}

	public function debug()
	{
		echo '<style type="text/css">';
		echo '
		#debugger {width: 100%; font-family: arial;}
		#debugger table {padding: 0; margin: 0 0 20px; width: 100%; font-size: 11px; text-align: left;border-collapse: collapse;}
		#debugger th, #debugger td {padding: 2px 4px;}
		#debugger tr.h {background: #999; color: #fff;}
		#debugger tr.Success {background:#90c306; color: #fff;}
		#debugger tr.Error {background:#c30029 ; color: #fff;}
		#debugger tr.Not-modified {background:orange ; color: #fff;}
		#debugger th {width: 20%; vertical-align:top; padding-bottom: 8px;}

		';
		echo '</style>';

		echo '<div id="debugger">';

		if (isset($this->_response_code))
		{
			if ($this->_response_code == 200)
			{
				echo '<table>';
				echo '<tr class="Success"><th>Success</th><td></td></tr>';
				echo '<tr><th>Status code</th><td>' . $this->_response_code . '</td></tr>';

				if (isset($this->_response))
					echo '<tr><th>Response</th><td><pre>' . utf8_decode(print_r($this->_response, 1)) . '</pre></td></tr>';

				echo '</table>';
			}
			elseif($this->_response_code == 304)
			{
				echo '<table>';
				echo '<tr class="Not-modified"><th>Error</th><td></td></tr>';
				echo '<tr><th>Error no</th><td>' . $this->_response_code . '</td></tr>';
				echo '<tr><th>Message</th><td>Not Modified</td></tr>';
				echo '</table>';
			}
			else
			{
				echo '<table>';
				echo '<tr class="Error"><th>Error</th><td></td></tr>';
				echo '<tr><th>Error no</th><td>' . $this->_response_code . '</td></tr>';

				if (isset($this->_response))
				{
					if (is_array($this->_response) || is_object($this->_response))
						echo '<tr><th>Status</th><td><pre>' . print_r($this->_response, true) . '</pre></td></tr>';
					else
						echo '<tr><th>Status</th><td><pre>' . $this->_response . '</pre></td></tr>';
				}
			}
			echo '</table>';
		}

		$call_url = parse_url($this->call_url);

		echo '<table>';
		echo '<tr class="h"><th>API config</th><td></td></tr>';
		echo '<tr><th>Protocole</th><td>' . $call_url['scheme'] . '</td></tr>';
		echo '<tr><th>Host</th><td>' . $call_url['host'] . '</td></tr>';
		echo '<tr><th>Version</th><td>' . $this->version . '</td></tr>';
		echo '</table>';

		echo '<table>';
		echo '<tr class="h"><th>Call infos</th><td></td></tr>';
		echo '<tr><th>Method</th><td>' . $this->_method . '</td></tr>';
		echo '<tr><th>Request type</th><td>' . $this->_request . '</td></tr>';
		echo '<tr><th>Get Arguments</th><td>';

		$args = explode("&", $call_url['query']);
		foreach ($args as $arg)
		{
			$arg = explode('=', $arg);
			echo ''.$arg[0].' = <span style="color:#ff6e56;">' . $arg[1] . '</span><br/>';
		}

		echo '</td></tr>';

		if ($this->_request_post)
		{
			echo '<tr><th>Post Arguments</th><td>';

			foreach ($this->_request_post as $k => $v)
				echo $k.' = <span style="color:#ff6e56;">' . $v . '</span><br/>';

			echo '</td></tr>';
		}

		echo '<tr><th>Call url</th><td>' . $this->call_url . '</td></tr>';
		echo '</table>';
		echo '</div>';
	}
}components/com_mailjet/lib/lib/Auth.php000060400000016030152453623460014150 0ustar00<?php

defined('_JEXEC') or die('Restricted access');
 
/**
 * @author Mailjet SAS
 *
 * @copyright  Copyright (C) 2014 Mailjet SAS.
 * @license    GNU General Public License version 2 or later; see LICENSE
 */

class Auth
{

	/**
	 * 
	 * @var String
	 */
	private $_dbData;

	/**
	 * 
	 * @var String
	 */
	private $_apiKey;
	
	/**
	 * 
	 * @var String
	 */
	private $_apiSecret;
	
	/**
	 * 
	 * @var String
	 */
	private $_token;
	
	/**
	 * 
	 * @var String
	 */
	private $_apiUrl;
	
	/**
	 * 
	 * @var String
	 */
	private $_apiVersion;

    /**
     *
     * @var Boolean
     */
    private $_enable = false;

    /**
     *
     * @var String
     */
    private $_testAddress = 'test@emailaddress';
	
	/**
	 * 
	 */
	public function __construct()
	{
		$this->_initData();
	}
	
	/**
	 * 
	 * @return Auth
	 */
	protected function _initData()
	{
		$this->_dbData = realpath(__DIR__.'/../db/data');
		touch($this->_dbData);
		
		$data = null;
		$content = trim(file_get_contents($this->_dbData));
		
		if ($content) {
			$data = json_decode($content);
		}

		if (!$data) {
			$this->saveData();
		}

		if (isset($data->apiKey) && $data->apiKey) {
			$this->setApiKey($data->apiKey);
		}

		if (isset($data->apiSecret) && $data->apiSecret) {
			$this->setApiSecret($data->apiSecret);
		}

		if (isset($data->token) && $data->token) {
			$this->setToken($data->token);
		}
		
		if (isset($data->apiUrl) && $data->apiUrl) {
			$this->setApiUrl($data->apiUrl);
		}
		
		if (isset($data->apiVersion) && $data->apiVersion) {
			$this->setApiVersion($data->apiVersion);
		}

        if(!empty($data->enable)) {
            $this->setEnable($data->enable);
        }

        if(!empty($data->test_address)) {
            $this->setTestAddress($data->test_address);
        }
		
		return $this;
	}

	/**
	 * 
	 * @return Auth
	 */
	public function saveData()
	{
		$data = array(
			'apiKey'		=> $this->getApiKey(),
			'apiSecret'		=> $this->getApiSecret(),
			'token'			=> $this->getToken(),
			'apiUrl'		=> $this->getApiUrl(),
			'apiVersion'	=> $this->getApiVersion(),
            'enable'        => $this->getEnable(),
            'test_address'  => $this->getTestAddress()
		);
			
		file_put_contents($this->_dbData, json_encode($data));

		$mailjetConfig = realpath(__DIR__.'/../../config.php');
        $dataConf = '<?php
class JMailjetConfig {
	public $bak_mailer = "smtp";
	public $bak_smtpauth = "1";
	public $bak_smtpuser = "your API key";
	public $bak_smtppass = "your API secret";
	public $bak_smtphost = "'.(($this->getApiUrl())?$this->getApiUrl():"in-v3.mailjet.com").'";
	public $bak_smtpsecure = "tls";
	public $bak_smtpport = "587";
	public $test = "";
	public $test_address = "'.$this->getTestAddress().'";
	public $enable = "'.$this->getEnable().'";
	public $username = "'.(($this->getApiKey())?$this->getApiKey():"your API key").'";
	public $password = "'.(($this->getApiSecret())?$this->getApiSecret():"your API secret").'";
	public $host = "'.(($this->getApiUrl())?$this->getApiUrl():"in-v3.mailjet.com").'";
	public $secure = "tls";
	public $port = "587";
}';
        file_put_contents($mailjetConfig, $dataConf);
		
		return $this;
	}
	
	/**
	 * 
	 * @return Auth
	 */
	public function deleteData()
	{
		$content = trim(file_get_contents($this->_dbData));
		$data = array(
			'apiKey'		=> null,
			'apiSecret'		=> null,
			'token'			=> null,
			'apiUrl'		=> null,
			'apiVersion'	=> null,
            'enable'        => null,
            'test_address'  => null,
		);

		file_put_contents($this->_dbData, json_encode($data));

		$this->_apiKey = null;
		$this->_apiSecret = null;
		$this->_token = null;
		$this->_apiUrl = null;
		$this->_apiVersion = null;
        $this->_enable = null;
        $this->_testAddress = null;
		
		return $this;
	}
	
	/**
	 * 
	 * @param String $apiKey
	 * @return Auth
	 */
	public function setApiKey($apiKey)
	{
		$this->_apiKey = $apiKey;
		return $this;
	}
	
	/**
	 * 
	 * @return String
	 */
	public function getApiKey()
	{
		return $this->_apiKey;
	}
	
	/**
	 * 
	 * @param String $apiSecret
	 * @return Auth
	 */
	public function setApiSecret($apiSecret)
	{
		$this->_apiSecret = $apiSecret;
		return $this;
	}
	
	/**
	 * 
	 * @return String
	 */
	public function getApiSecret()
	{
		return $this->_apiSecret;
	}
	
	/**
	 * 
	 * @param String $token
	 * @return Auth
	 */
	public function setToken($token)
	{
		$this->_token = $token;
		return $this;
	}
	
	/**
	 * 
	 * @return String
	 */
	public function getToken()
	{
		if (($this->_token == NULL || strlen($this->_token) == 0) && $this->getApiKey() && $this->getApiSecret())
			$this->generateToken();
		return $this->_token;
	}

    /**
     *
     * @return Boolean
     */
    public function getEnable()
    {
        return $this->_enable;
    }

    /**
     *
     * @param Boolean
     * @return Boolean
     */
    public function setEnable($val)
    {
        return $this->_enable = $val;
    }

    /**
     *
     * @return String
     */
    public function getTestAddress()
    {
        return $this->_testAddress;
    }

    /**
     *
     * @param String
     * @return String
     */
    public function setTestAddress($val)
    {
        return $this->_testAddress = $val;
    }
	
	/**
	 * 
	 * @param String $apiUrl
	 * @return Auth
	 */
	public function setApiUrl($apiUrl)
	{
		$this->_apiUrl = $apiUrl;
		return $this;
	}
	
	/**
	 * 
	 * @return String
	 */
	public function getApiUrl()
	{
		return $this->_apiUrl;
	}
	
	/**
	 * 
	 * @param String $apiVersion
	 * @return Auth
	 */
	public function setApiVersion($apiVersion)
	{
		$this->_apiVersion = $apiVersion;
		return $this;
	}
	
	/**
	 * 
	 * @return String
	 */
	public function getApiVersion()
	{
		return $this->_apiVersion;
	}

	/**
	 * 
	 * @return boolean
	 */
	public function haveToken()
	{		
		return (boolean) $this->getToken();
	}
	
	/**
	 * 
	 * @return boolean
	 */
	public function canGenerateToken()
	{
		return $this->getApiKey() && $this->getApiSecret();
	}

	/**
	 * 
	 * @return boolean
	 */
	public function generateToken()
	{	
		if (!$this->canGenerateToken()) {
			return false;
		}
			
		$mj = new Mailjet_Api($this->getApiKey(), $this->getApiSecret());
		$this->setApiUrl($mj->apiUrl);
		$this->setApiVersion($mj->version);

		$response = $mj->getAuthToken(array(
			'APIKey'		=> $this->getApiKey(),
			'SecretKey'	 	=> $this->getApiSecret()
		));
		
		// Log the response
		$this->_log($mj);
		
		// Check if the response is correct
		if (!isset($response->Status) || (isset($response->Status) && $response->Status != 'ERROR')) {
			$this->setToken($response);
			$this->saveData();
		}
		
		return true;
	}

	public function __destruct()
	{
		$this->saveData();
	}
	
	private function _log($response)
	{
		$log = realpath(__DIR__.'/../tmp/log');
		
		touch($log);
		
		$delimiter = str_repeat('=', 100);
		
		$content = file_get_contents($log);
		
		$prepend = '';
		
		$prepend .= $delimiter;
		$prepend .= PHP_EOL;
		$prepend .= date('Y-m-d H:i:s');
		$prepend .= PHP_EOL;
		$prepend .= 'RESPONSE';
		$prepend .= PHP_EOL;
		$prepend .= print_r($response, true);
		$prepend .= PHP_EOL;

		
		$content = $prepend.$content;
		file_put_contents($log, $content);
	}
	
}

?>components/com_mailjet/lib/hook.php000060400000003474152453623460013451 0ustar00<?php
/**
 * @author Mailjet SAS
 *
 * @copyright  Copyright (C) 2014 Mailjet SAS.
 * @license    GNU General Public License version 2 or later; see LICENSE
 */
// No direct access to this file
defined('_JEXEC') or die('Restricted access');

require_once realpath(__DIR__.'/lib/Auth.php');
require_once realpath(__DIR__.'/lib/mailjet-api-strategy.php');

$auth = new Auth();

$log = realpath(__DIR__.'/tmp/log');

touch($log);

$delimiter = str_repeat('=', 100);

$content = file_get_contents($log);

$prepend = '';

$prepend .= $delimiter;
$prepend .= PHP_EOL;
$prepend .= date('Y-m-d H:i:s');
$prepend .= PHP_EOL;
$prepend .= 'POST';
$prepend .= PHP_EOL;
$prepend .= print_r($_POST, true);
$prepend .= PHP_EOL;
$prepend .= 'GET';
$prepend .= PHP_EOL;
$prepend .= print_r($_GET, true);

if (isset($_POST['data'])) {
	$data = (object) $_POST['data'];
} else if (isset($_POST['mailjet'])) {
	$mailjet = json_decode($_POST['mailjet']);
	$data = $mailjet->data;
}

if (isset($data->next_step_url) && $data->next_step_url) {

	//we have api key and secret but no token so generate it
	if (
		isset($data->apikey) 
		&& $data->apikey 
		&& isset($data->secretkey) 
		&& $data->secretkey
		&& !$auth->haveToken()
	) {		
		$auth->setApiKey($data->apikey);
		$auth->setApiSecret($data->secretkey);
		$auth->generateToken();
		$auth->saveData();
	} 

	$response = array(
		"code"				=> 1,
		"continue"			=> true,
		"continue_address"	=> $data->next_step_url,
	);
	
} else {

	$response = array(		
		"code"		=> 0,		
		"continue"	=> false,		
		"exit_url"	=> 'http://prestashop.com/exit.php',
	);
	
}

$json = json_encode($response);

$prepend .= PHP_EOL;
$prepend .= 'RESPONSE';
$prepend .= PHP_EOL;
$prepend .= $json;
$prepend .= PHP_EOL;
$prepend .= $delimiter;
$prepend .= PHP_EOL;

$content = $prepend.$content;
file_put_contents($log, $content);

echo $json;components/com_mailjet/lib/config.php000060400000000630152453623460013745 0ustar00<?php
/**
 * @author Mailjet SAS
 *
 * @copyright  Copyright (C) 2014 Mailjet SAS.
 * @license    GNU General Public License version 2 or later; see LICENSE
 */
// No direct access to this file
defined('_JEXEC') or die('Restricted access');

$myHookUrl      = JURI::base().'components/com_mailjet/lib/hook.php';
$myExitUrl      = JURI::base().'components/com_mailjet/lib/exit.php'; 
$resellerName   = 'test';components/com_mailjet/lib/tmp/log000060400000102250152453623460013274 0ustar00====================================================================================================
2014-09-24 18:22:51
RESPONSE
Mailjet_Api Object
(
    [context:Mailjet_Api:private] => Mailjet_Api_Strategy_V1 Object
        (
            [version] => 0.1
            [output] => json
            [secure] => 
            [debug] => 0
            [apiKey] => 6363e9d3b0fbcc689c98e18a1a0ba9b5
            [secretKey] => ea3818da6ef29051a081297d4e4ea6cb
            [apiUrl] => http://api.mailjet.com/0.1
            [_method] => listsAll
            [_request] => GET
            [call_url] => http://api.mailjet.com/0.1/listsAll/?output=json&limit=1
            [_request_post] => 
            [_response_code] => 200
            [_response] => stdClass Object
                (
                    [lists] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [id] => 830045
                                    [name] => bugise2794a59
                                    [label] => Bug issue 562
                                    [created_at] => 1402918673
                                    [subscribers] => 201
                                    [sent] => 0
                                    [open] => 0
                                    [click] => 0
                                    [bounce] => 0
                                    [blocked] => 400
                                    [spam] => 0
                                    [unsub] => 0
                                    [last_activity] => 1403006589
                                    [handled] => 1
                                )

                        )

                    [status] => OK
                )

        )

    [version] => 0.1
    [apiUrl] => in.mailjet.com
)

====================================================================================================
2014-09-24 18:02:39
RESPONSE
Mailjet_Api Object
(
    [context:Mailjet_Api:private] => Mailjet_Api_Strategy_V1 Object
        (
            [version] => 0.1
            [output] => json
            [secure] => 
            [debug] => 0
            [apiKey] => 6363e9d3b0fbcc689c98e18a1a0ba9b5
            [secretKey] => ea3818da6ef29051a081297d4e4ea6cb
            [apiUrl] => http://api.mailjet.com/0.1
            [_method] => listsAll
            [_request] => GET
            [call_url] => http://api.mailjet.com/0.1/listsAll/?output=json&limit=1
            [_request_post] => 
            [_response_code] => 200
            [_response] => stdClass Object
                (
                    [lists] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [id] => 830045
                                    [name] => bugise2794a59
                                    [label] => Bug issue 562
                                    [created_at] => 1402918673
                                    [subscribers] => 201
                                    [sent] => 0
                                    [open] => 0
                                    [click] => 0
                                    [bounce] => 0
                                    [blocked] => 400
                                    [spam] => 0
                                    [unsub] => 0
                                    [last_activity] => 1403006589
                                    [handled] => 1
                                )

                        )

                    [status] => OK
                )

        )

    [version] => 0.1
    [apiUrl] => in.mailjet.com
)

====================================================================================================
2014-09-24 18:02:06
RESPONSE
Mailjet_Api Object
(
    [context:Mailjet_Api:private] => Mailjet_Api_Strategy_V3 Object
        (
            [_apiKey:Mailjet_Api_V3:private] => 7ee8e423df320c5c3ecb314ad45c0b19
            [_secretKey:Mailjet_Api_V3:private] => 112f3d6bd2e3059db345a35cd2dfe5bb
            [_cache:Mailjet_Api_V3:private] => 0
            [_apiUrl:Mailjet_Api_V3:private] => http://api.mailjet.com/v3/REST/
            [_version:Mailjet_Api_V3:private] => REST
            [_debug:Mailjet_Api_V3:private] => 
            [_debug_info:Mailjet_Api_V3:private] => 
            [_buffer:Mailjet_Api_V3:private] => 
            [_method:Mailjet_Api_V3:private] => 
            [_info:Mailjet_Api_V3:private] => Array
                (
                    [url] => http://api.mailjet.com/v3/REST/apitoken
                    [content_type] => text/html; charset=utf-8
                    [http_code] => 201
                    [header_size] => 184
                    [request_size] => 405
                    [filetime] => -1
                    [ssl_verify_result] => 0
                    [redirect_count] => 0
                    [total_time] => 0.075868
                    [namelookup_time] => 3.1E-5
                    [connect_time] => 0.031974
                    [pretransfer_time] => 0.032039
                    [size_upload] => 153
                    [size_download] => 643
                    [speed_download] => 8475
                    [speed_upload] => 2016
                    [download_content_length] => 643
                    [upload_content_length] => 153
                    [starttransfer_time] => 0.075834
                    [redirect_time] => 0
                    [certinfo] => Array
                        (
                        )

                    [primary_ip] => 5.135.120.255
                    [primary_port] => 80
                    [local_ip] => 193.107.71.62
                    [local_port] => 47087
                    [redirect_url] => 
                )

            [_curl_handle:Mailjet_Api_V3:private] => 
            [_log_allowed:protected] => 
            [_log:protected] => 
            [_log_once:protected] => 1
            [_extra_err:protected] => 
            [_log_path:protected] => 
            [_akid] => 
            [_response_code] => 201
        )

    [version] => 
    [apiUrl] => in-v3.mailjet.com
)

====================================================================================================
2014-09-24 17:39:54
RESPONSE
Mailjet_Api Object
(
    [context:Mailjet_Api:private] => Mailjet_Api_Strategy_V1 Object
        (
            [version] => 0.1
            [output] => json
            [secure] => 
            [debug] => 0
            [apiKey] => 709aa262a03f2279127672eadd59dc50
            [secretKey] => bbd975cfe881a7cd349726049b2b022d
            [apiUrl] => http://api.mailjet.com/0.1
            [_method] => listsAll
            [_request] => GET
            [call_url] => http://api.mailjet.com/0.1/listsAll/?output=json&limit=1
            [_request_post] => 
            [_response_code] => 200
            [_response] => stdClass Object
                (
                    [lists] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [id] => 833189
                                    [name] => test9132f737
                                    [label] => Test
                                    [created_at] => 1403004329
                                    [subscribers] => 99
                                    [sent] => 0
                                    [open] => 0
                                    [click] => 0
                                    [bounce] => 0
                                    [blocked] => 0
                                    [spam] => 0
                                    [unsub] => 0
                                    [last_activity] => 
                                    [handled] => 1
                                )

                        )

                    [status] => OK
                )

        )

    [version] => 0.1
    [apiUrl] => in.mailjet.com
)

====================================================================================================
2014-09-24 17:26:25
RESPONSE
Mailjet_Api Object
(
    [context:Mailjet_Api:private] => Mailjet_Api_Strategy_V1 Object
        (
            [version] => 0.1
            [output] => json
            [secure] => 
            [debug] => 0
            [apiKey] => 6363e9d3b0fbcc689c98e18a1a0ba9b5
            [secretKey] => ea3818da6ef29051a081297d4e4ea6cb
            [apiUrl] => http://api.mailjet.com/0.1
            [_method] => listsAll
            [_request] => GET
            [call_url] => http://api.mailjet.com/0.1/listsAll/?output=json&limit=1
            [_request_post] => 
            [_response_code] => 200
            [_response] => stdClass Object
                (
                    [lists] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [id] => 830045
                                    [name] => bugise2794a59
                                    [label] => Bug issue 562
                                    [created_at] => 1402918673
                                    [subscribers] => 201
                                    [sent] => 0
                                    [open] => 0
                                    [click] => 0
                                    [bounce] => 0
                                    [blocked] => 400
                                    [spam] => 0
                                    [unsub] => 0
                                    [last_activity] => 1403006589
                                    [handled] => 1
                                )

                        )

                    [status] => OK
                )

        )

    [version] => 0.1
    [apiUrl] => in.mailjet.com
)

====================================================================================================
2014-09-24 17:26:09
RESPONSE
Mailjet_Api Object
(
    [context:Mailjet_Api:private] => Mailjet_Api_Strategy_V1 Object
        (
            [version] => 0.1
            [output] => json
            [secure] => 
            [debug] => 0
            [apiKey] => 709aa262a03f2279127672eadd59dc50
            [secretKey] => bbd975cfe881a7cd349726049b2b022d
            [apiUrl] => http://api.mailjet.com/0.1
            [_method] => listsAll
            [_request] => GET
            [call_url] => http://api.mailjet.com/0.1/listsAll/?output=json&limit=1
            [_request_post] => 
            [_response_code] => 200
            [_response] => stdClass Object
                (
                    [lists] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [id] => 833189
                                    [name] => test9132f737
                                    [label] => Test
                                    [created_at] => 1403004329
                                    [subscribers] => 99
                                    [sent] => 0
                                    [open] => 0
                                    [click] => 0
                                    [bounce] => 0
                                    [blocked] => 0
                                    [spam] => 0
                                    [unsub] => 0
                                    [last_activity] => 
                                    [handled] => 1
                                )

                        )

                    [status] => OK
                )

        )

    [version] => 0.1
    [apiUrl] => in.mailjet.com
)

====================================================================================================
2014-09-24 17:25:55
RESPONSE
Mailjet_Api Object
(
    [context:Mailjet_Api:private] => Mailjet_Api_Strategy_V1 Object
        (
            [version] => 0.1
            [output] => json
            [secure] => 
            [debug] => 0
            [apiKey] => 709aa262a03f2279127672eadd59dc50
            [secretKey] => bbd975cfe881a7cd349726049b2b022d
            [apiUrl] => http://api.mailjet.com/0.1
            [_method] => listsAll
            [_request] => GET
            [call_url] => http://api.mailjet.com/0.1/listsAll/?output=json&limit=1
            [_request_post] => 
            [_response_code] => 200
            [_response] => stdClass Object
                (
                    [lists] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [id] => 833189
                                    [name] => test9132f737
                                    [label] => Test
                                    [created_at] => 1403004329
                                    [subscribers] => 99
                                    [sent] => 0
                                    [open] => 0
                                    [click] => 0
                                    [bounce] => 0
                                    [blocked] => 0
                                    [spam] => 0
                                    [unsub] => 0
                                    [last_activity] => 
                                    [handled] => 1
                                )

                        )

                    [status] => OK
                )

        )

    [version] => 0.1
    [apiUrl] => in.mailjet.com
)

====================================================================================================
2014-09-24 16:34:26
RESPONSE
Mailjet_Api Object
(
    [context:Mailjet_Api:private] => Mailjet_Api_Strategy_V3 Object
        (
            [_apiKey:Mailjet_Api_V3:private] => 7ee8e423df320c5c3ecb314ad45c0b19
            [_secretKey:Mailjet_Api_V3:private] => 112f3d6bd2e3059db345a35cd2dfe5bb
            [_cache:Mailjet_Api_V3:private] => 0
            [_apiUrl:Mailjet_Api_V3:private] => http://api.mailjet.com/v3/REST/
            [_version:Mailjet_Api_V3:private] => REST
            [_debug:Mailjet_Api_V3:private] => 
            [_debug_info:Mailjet_Api_V3:private] => 
            [_buffer:Mailjet_Api_V3:private] => 
            [_method:Mailjet_Api_V3:private] => 
            [_info:Mailjet_Api_V3:private] => Array
                (
                    [url] => http://api.mailjet.com/v3/REST/apitoken
                    [content_type] => text/html; charset=utf-8
                    [http_code] => 201
                    [header_size] => 184
                    [request_size] => 405
                    [filetime] => -1
                    [ssl_verify_result] => 0
                    [redirect_count] => 0
                    [total_time] => 0.0752
                    [namelookup_time] => 3.5E-5
                    [connect_time] => 0.03224
                    [pretransfer_time] => 0.03231
                    [size_upload] => 153
                    [size_download] => 643
                    [speed_download] => 8550
                    [speed_upload] => 2034
                    [download_content_length] => 643
                    [upload_content_length] => 153
                    [starttransfer_time] => 0.075164
                    [redirect_time] => 0
                    [certinfo] => Array
                        (
                        )

                    [primary_ip] => 5.135.120.255
                    [primary_port] => 80
                    [local_ip] => 193.107.71.62
                    [local_port] => 41085
                    [redirect_url] => 
                )

            [_curl_handle:Mailjet_Api_V3:private] => 
            [_log_allowed:protected] => 
            [_log:protected] => 
            [_log_once:protected] => 1
            [_extra_err:protected] => 
            [_log_path:protected] => 
            [_akid] => 
            [_response_code] => 201
        )

    [version] => 
    [apiUrl] => in-v3.mailjet.com
)

====================================================================================================
2014-09-24 16:19:47
RESPONSE
Mailjet_Api Object
(
    [context:Mailjet_Api:private] => Mailjet_Api_Strategy_V3 Object
        (
            [_apiKey:Mailjet_Api_V3:private] => 7ee8e423df320c5c3ecb314ad45c0b19
            [_secretKey:Mailjet_Api_V3:private] => 112f3d6bd2e3059db345a35cd2dfe5bb
            [_cache:Mailjet_Api_V3:private] => 0
            [_apiUrl:Mailjet_Api_V3:private] => http://api.mailjet.com/v3/REST/
            [_version:Mailjet_Api_V3:private] => REST
            [_debug:Mailjet_Api_V3:private] => 
            [_debug_info:Mailjet_Api_V3:private] => 
            [_buffer:Mailjet_Api_V3:private] => 
            [_method:Mailjet_Api_V3:private] => 
            [_info:Mailjet_Api_V3:private] => Array
                (
                    [url] => http://api.mailjet.com/v3/REST/apitoken
                    [content_type] => text/html; charset=utf-8
                    [http_code] => 201
                    [header_size] => 184
                    [request_size] => 405
                    [filetime] => -1
                    [ssl_verify_result] => 0
                    [redirect_count] => 0
                    [total_time] => 0.077033
                    [namelookup_time] => 3.0E-5
                    [connect_time] => 0.032484
                    [pretransfer_time] => 0.032563
                    [size_upload] => 153
                    [size_download] => 643
                    [speed_download] => 8347
                    [speed_upload] => 1986
                    [download_content_length] => 643
                    [upload_content_length] => 153
                    [starttransfer_time] => 0.076998
                    [redirect_time] => 0
                    [certinfo] => Array
                        (
                        )

                    [primary_ip] => 5.135.120.255
                    [primary_port] => 80
                    [local_ip] => 193.107.71.62
                    [local_port] => 39552
                    [redirect_url] => 
                )

            [_curl_handle:Mailjet_Api_V3:private] => 
            [_log_allowed:protected] => 
            [_log:protected] => 
            [_log_once:protected] => 1
            [_extra_err:protected] => 
            [_log_path:protected] => 
            [_akid] => 
            [_response_code] => 201
        )

    [version] => 
    [apiUrl] => http://api.mailjet.com/v3/REST/
)

====================================================================================================
2014-09-24 14:40:57
RESPONSE
Mailjet_Api Object
(
    [context:Mailjet_Api:private] => Mailjet_Api_Strategy_V3 Object
        (
            [_apiKey:Mailjet_Api_V3:private] => 7ee8e423df320c5c3ecb314ad45c0b19
            [_secretKey:Mailjet_Api_V3:private] => 112f3d6bd2e3059db345a35cd2dfe5bb
            [_cache:Mailjet_Api_V3:private] => 0
            [_apiUrl:Mailjet_Api_V3:private] => http://api.mailjet.com/v3/REST/
            [_version:Mailjet_Api_V3:private] => REST
            [_debug:Mailjet_Api_V3:private] => 
            [_debug_info:Mailjet_Api_V3:private] => 
            [_buffer:Mailjet_Api_V3:private] => 
            [_method:Mailjet_Api_V3:private] => 
            [_info:Mailjet_Api_V3:private] => Array
                (
                    [url] => http://api.mailjet.com/v3/REST/apitoken
                    [content_type] => text/html; charset=utf-8
                    [http_code] => 201
                    [header_size] => 184
                    [request_size] => 405
                    [filetime] => -1
                    [ssl_verify_result] => 0
                    [redirect_count] => 0
                    [total_time] => 0.383548
                    [namelookup_time] => 2.9E-5
                    [connect_time] => 0.031834
                    [pretransfer_time] => 0.031893
                    [size_upload] => 153
                    [size_download] => 643
                    [speed_download] => 1676
                    [speed_upload] => 398
                    [download_content_length] => 643
                    [upload_content_length] => 153
                    [starttransfer_time] => 0.383513
                    [redirect_time] => 0
                    [certinfo] => Array
                        (
                        )

                    [primary_ip] => 5.135.46.177
                    [primary_port] => 80
                    [local_ip] => 193.107.71.62
                    [local_port] => 53699
                    [redirect_url] => 
                )

            [_curl_handle:Mailjet_Api_V3:private] => 
            [_log_allowed:protected] => 
            [_log:protected] => 
            [_log_once:protected] => 1
            [_extra_err:protected] => 
            [_log_path:protected] => 
            [_akid] => 
            [_response_code] => 201
        )

    [version] => 
)

====================================================================================================
2014-09-24 13:55:44
RESPONSE
MailjetApi Object
(
    [version] => REST
    [output] => json
    [secure] => 1
    [debug] => 0
    [apiKey] => 7ee8e423df320c5c3ecb314ad45c0b19
    [secretKey] => 112f3d6bd2e3059db345a35cd2dfe5bb
    [apiUrl] => https://api.mailjet.com/v3/REST
    [_method] => apitoken
    [_request] => POST
    [call_url] => https://api.mailjet.com/v3/REST/apitoken/?output=json
    [_request_post] => Array
        (
            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
            [APIKeyALT] => 7ee8e423df320c5c3ecb314ad45c0b19
            [TokenType] => iframe
            [IsActive] => 1
        )

    [_response_code] => 201
    [_response] => stdClass Object
        (
            [Count] => 1
            [Data] => Array
                (
                    [0] => stdClass Object
                        (
                            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
                            [APIKeyID] => 176517
                            [CatchedIp] => 172.16.0.11
                            [CreatedAt] => 2014-09-24T10:55:44Z
                            [FirstUsedAt] => 
                            [ID] => 1531814
                            [IsActive] => 1
                            [Lang] => 
                            [LastUsedAt] => 
                            [SentData] => 
                            [Timezone] => 
                            [Token] => E2A2E8E4155971C09461056DB4A2E84A88641773F890CBA6D7E4940EFFE4E0CED009FF388848B7E68C89C340F0A39B7C22273723A53A2CF57E6CEFE34173D2B4970DE3C56F369116250864C4773A02E548A9583A393C896E58453FDEA6BA76E5E0B3DFDC4E6A165CBDE3D5EB1B7702F6559323ABE83B876F9AED3CB4C7BA087
                            [TokenType] => iframe
                            [ValidFor] => 0
                        )

                )

            [Total] => 1
        )

)

====================================================================================================
2014-09-24 13:55:37
RESPONSE
MailjetApi Object
(
    [version] => REST
    [output] => json
    [secure] => 1
    [debug] => 0
    [apiKey] => 7ee8e423df320c5c3ecb314ad45c0b19
    [secretKey] => 112f3d6bd2e3059db345a35cd2dfe5bb
    [apiUrl] => https://api.mailjet.com/v3/REST
    [_method] => apitoken
    [_request] => POST
    [call_url] => https://api.mailjet.com/v3/REST/apitoken/?output=json
    [_request_post] => Array
        (
            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
            [APIKeyALT] => 7ee8e423df320c5c3ecb314ad45c0b19
            [TokenType] => iframe
            [IsActive] => 1
        )

    [_response_code] => 201
    [_response] => stdClass Object
        (
            [Count] => 1
            [Data] => Array
                (
                    [0] => stdClass Object
                        (
                            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
                            [APIKeyID] => 176517
                            [CatchedIp] => 172.16.0.11
                            [CreatedAt] => 2014-09-24T10:55:37Z
                            [FirstUsedAt] => 
                            [ID] => 1531813
                            [IsActive] => 1
                            [Lang] => 
                            [LastUsedAt] => 
                            [SentData] => 
                            [Timezone] => 
                            [Token] => FDBE4EAB1136F8B5CE0CC150D2711138180B16C46B51E6C99B873B063038E373C54686FAFABB85D3F6FED5A02B881C4649A017D30787A3D1BDCD2976CE681FAC75E67FDFE2D5D49740453999BC10FB5A92358730733F15ADF153C1CDEADCF5DC8A3A67BC8D8665921DBEBDAED395F1C56AD056332572BB5E6F48B9887D40999
                            [TokenType] => iframe
                            [ValidFor] => 0
                        )

                )

            [Total] => 1
        )

)

====================================================================================================
2014-09-23 18:23:25
RESPONSE
MailjetApi Object
(
    [version] => REST
    [output] => json
    [secure] => 1
    [debug] => 0
    [apiKey] => 7ee8e423df320c5c3ecb314ad45c0b19
    [secretKey] => 112f3d6bd2e3059db345a35cd2dfe5bb
    [apiUrl] => https://api.mailjet.com/v3/REST
    [_method] => apitoken
    [_request] => POST
    [call_url] => https://api.mailjet.com/v3/REST/apitoken/?output=json
    [_request_post] => Array
        (
            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
            [APIKeyALT] => 7ee8e423df320c5c3ecb314ad45c0b19
            [TokenType] => iframe
            [IsActive] => 1
        )

    [_response_code] => 201
    [_response] => stdClass Object
        (
            [Count] => 1
            [Data] => Array
                (
                    [0] => stdClass Object
                        (
                            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
                            [APIKeyID] => 176517
                            [CatchedIp] => 172.16.0.11
                            [CreatedAt] => 2014-09-23T15:23:25Z
                            [FirstUsedAt] => 
                            [ID] => 1531747
                            [IsActive] => 1
                            [Lang] => 
                            [LastUsedAt] => 
                            [SentData] => 
                            [Timezone] => 
                            [Token] => 31780227E49D32BD990E9A4B129DF4E8A3CAAA0228336F28CF14D9EC57EB1FCED69A17D464F93374298496DCF7412B28FBFA1ADE1E4262C6DC6B1326B0EAD0ADC3517AC082CCF2F90B25E5006F38C9E50551E9385FA1430A1D2E423E67658245FF5AA97DBDFC3A5671DE309656D002EA6066A1F8A42134A689ADCCC1964165D
                            [TokenType] => iframe
                            [ValidFor] => 0
                        )

                )

            [Total] => 1
        )

)

====================================================================================================
2014-09-23 12:38:08
RESPONSE
MailjetApi Object
(
    [version] => REST
    [output] => json
    [secure] => 1
    [debug] => 0
    [apiKey] => ff504f5e4e6fb57e9747fc09d7a7c6ff
    [secretKey] => fa24b97126e6371d0e2c6c6266bc7f3b
    [apiUrl] => https://api.mailjet.com/v3/REST
    [_method] => apitoken
    [_request] => POST
    [call_url] => https://api.mailjet.com/v3/REST/apitoken/?output=json
    [_request_post] => Array
        (
            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
            [APIKeyALT] => ff504f5e4e6fb57e9747fc09d7a7c6ff
            [TokenType] => iframe
            [IsActive] => 1
        )

    [_response_code] => 201
    [_response] => stdClass Object
        (
            [Count] => 1
            [Data] => Array
                (
                    [0] => stdClass Object
                        (
                            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
                            [APIKeyID] => 128127
                            [CatchedIp] => 172.16.0.11
                            [CreatedAt] => 2014-09-23T09:38:08Z
                            [FirstUsedAt] => 
                            [ID] => 1531715
                            [IsActive] => 1
                            [Lang] => 
                            [LastUsedAt] => 
                            [SentData] => 
                            [Timezone] => 
                            [Token] => C7470DD9910D1A4885F2E0669861165180EEE5C18ABBD23956E27E9FC14F356BB495B8D9F9E9636965404732A6675C986982832E4DCA6014B6600364286E0678B5392A1D5E30EDA650F75A8607D28257B023E2166EEACF1868337B1B218C952D997185A5128F5C80F01EA446EE63E6430C1AFFC0F2C4BBA9EA374B2A16ADDF4
                            [TokenType] => iframe
                            [ValidFor] => 0
                        )

                )

            [Total] => 1
        )

)

====================================================================================================
2014-09-23 12:26:27
RESPONSE
MailjetApi Object
(
    [version] => REST
    [output] => json
    [secure] => 1
    [debug] => 0
    [apiKey] => ff504f5e4e6fb57e9747fc09d7a7c6ff
    [secretKey] => fa24b97126e6371d0e2c6c6266bc7f3b
    [apiUrl] => https://api.mailjet.com/v3/REST
    [_method] => apitoken
    [_request] => POST
    [call_url] => https://api.mailjet.com/v3/REST/apitoken/?output=json
    [_request_post] => Array
        (
            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
            [APIKeyALT] => ff504f5e4e6fb57e9747fc09d7a7c6ff
            [TokenType] => iframe
            [IsActive] => 1
        )

    [_response_code] => 201
    [_response] => stdClass Object
        (
            [Count] => 1
            [Data] => Array
                (
                    [0] => stdClass Object
                        (
                            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
                            [APIKeyID] => 128127
                            [CatchedIp] => 172.16.0.12
                            [CreatedAt] => 2014-09-23T09:26:27Z
                            [FirstUsedAt] => 
                            [ID] => 1531706
                            [IsActive] => 1
                            [Lang] => 
                            [LastUsedAt] => 
                            [SentData] => 
                            [Timezone] => 
                            [Token] => 255B5D469EF20EECB4C56EF1D5CEADE84E0DC6E4B05AD137B8D7AE91428DDC7547C9C14573B78830BDF1911C4567115EAB21D2E524BFC7E5702601FB9E16DFF7A272A9E5C71D7BDE0B584132FC3ED6AFA6133BFE475B39A157FD2A21B663BDE3EF9D9D3904D32299949CEB4971C68EE337638A4EFAADE99ACE71DCD4F286DE8
                            [TokenType] => iframe
                            [ValidFor] => 0
                        )

                )

            [Total] => 1
        )

)

====================================================================================================
2014-09-19 17:23:02
RESPONSE
MailjetApi Object
(
    [version] => REST
    [output] => json
    [secure] => 1
    [debug] => 0
    [apiKey] => ff504f5e4e6fb57e9747fc09d7a7c6ff
    [secretKey] => fa24b97126e6371d0e2c6c6266bc7f3b
    [apiUrl] => https://api.mailjet.com/v3/REST
    [_method] => apitoken
    [_request] => POST
    [call_url] => https://api.mailjet.com/v3/REST/apitoken/?output=json
    [_request_post] => Array
        (
            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
            [APIKeyALT] => ff504f5e4e6fb57e9747fc09d7a7c6ff
            [TokenType] => iframe
            [IsActive] => 1
        )

    [_response_code] => 201
    [_response] => stdClass Object
        (
            [Count] => 1
            [Data] => Array
                (
                    [0] => stdClass Object
                        (
                            [AllowedAccess] => campaigns,contacts,stats,pricing,account,reports
                            [APIKeyID] => 128127
                            [CatchedIp] => 172.16.0.12
                            [CreatedAt] => 2014-09-19T14:23:02Z
                            [FirstUsedAt] => 
                            [ID] => 1531571
                            [IsActive] => 1
                            [Lang] => 
                            [LastUsedAt] => 
                            [SentData] => 
                            [Timezone] => 
                            [Token] => FACB508DBC7E98D9D08F66A59B0C560CFB78AD000B724981284A7612AA773B31E3EFFAFEB3308A37336D24F24FD8CD88CD06A2A8A3C9C04DCD2A5C4658626E91F4874F180DF513EC0B853988CFCC708F4F02283D7230E69A6097C8EE243A0B9D2BC0E31ACC373B57D0E2441A6684CA2129139DED2322FB9E417EFA1DF60588A
                            [TokenType] => iframe
                            [ValidFor] => 0
                        )

                )

            [Total] => 1
        )

)

components/com_mailjet/lib/exit.php000060400000000370152453623460013452 0ustar00<?php
/**
 * @author Mailjet SAS
 *
 * @copyright  Copyright (C) 2014 Mailjet SAS.
 * @license    GNU General Public License version 2 or later; see LICENSE
 */
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
?>
EXITcomponents/com_mailjet/lib/db/data000060400000000241152453623460013206 0ustar00{"apiKey":"6363e9d3b0fbcc689c98e18a1a0ba9b5","apiSecret":"ea3818da6ef29051a081297d4e4ea6cb","token":null,"test_address":"vincent.halle@eliosa.com","enable":true}components/com_mailjet/com_mailjet.xml000060400000003631152453623460014232 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.1">
    <name>Mailjet</name>
    <author>Mailjet SAS</author>
    <authorUrl>http://www.mailjet.com</authorUrl>
    <authorEmail>plugins@mailjet.com</authorEmail>
    <creationDate>June 2014</creationDate>
    <url>http://www.mailjet.com/</url>
    <version>3.1.6</version>
    <copyright>Copyright (C) 2014 Mailjet SAS.</copyright>
    <license>GNU General Public License version 2 or later; see LICENSE</license>
    <description>Mailjet Email component.</description>

    <scriptfile>installer.php</scriptfile>
    <files folder="front">
        <filename>mailjet.php</filename>
        <filename>controller.php</filename>
        <folder>models</folder>
        <folder>views</folder>
    </files>

    <administration>
        <menu img="../administrator/components/com_mailjet/images/logo-16x16.png">COM_MAILJET_MENU</menu>
        <submenu>
            <menu view="mailjet" img="../administrator/components/com_mailjet/images/logo-16x16.png">COM_MAILJET_SETTINGS</menu>
            <menu view="contacts" img="../administrator/components/com_mailjet/images/logo-16x16.png">COM_MAILJET_CONTACTS</menu>
            <menu view="campaigns" img="../administrator/components/com_mailjet/images/logo-16x16.png">COM_MAILJET_CAMPAIGNS</menu>
            <menu view="statistics" img="../administrator/components/com_mailjet/images/logo-16x16.png">COM_MAILJET_STATS</menu>
        </submenu>
        <files folder="admin">
            <filename>mailjet.php</filename>
            <filename>controller.php</filename>
            <filename>config.php</filename>
            <filename>styles.css</filename>
            <folder>views</folder>
            <folder>models</folder>
            <folder>language</folder>
            <folder>images</folder>
            <folder>lib</folder>
            <folder>helpers</folder>
        </files>
    </administration>
</extension>
components/com_mailjet/mailjet.php000060400000003146152453623460013364 0ustar00<?php
/**
 * @author Mailjet SAS
 *
 * @copyright  Copyright (C) 2014 Mailjet SAS.
 * @license    GNU General Public License version 2 or later; see LICENSE
 */
// No direct access to this file
defined('_JEXEC') or die('Restricted access');

if (!function_exists('class_alias')) { // For php older then 5.3
  function class_alias($orig, $alias) {
    eval('abstract class ' . $alias . ' extends ' . $orig . ' {}');
  }
}

error_reporting(E_ALL ^ E_STRICT);

if (!class_exists('JControllerLegacy')) {
  class_alias('JController','JControllerLegacy');
}

$document = JFactory::getDocument();
$document->addStyleDeclaration('.icon-48-logo {background-image: url('.sprintf('%s/components/%s/images/%s', '../administrator', 'com_mailjet', 'logo-48x48.png').');}');
$document->addStyleDeclaration('.icon-48-campaigns {background-image: url('.sprintf('%s/components/%s/images/%s', '../administrator', 'com_mailjet', 'campaigns-48x48.png').');}');
$document->addStyleDeclaration('.icon-48-stats {background-image: url('.sprintf('%s/components/%s/images/%s', '../administrator', 'com_mailjet', 'stats-48x48.png').');}');
$document->addStyleDeclaration('.icon-48-contacts {background-image: url('.sprintf('%s/components/%s/images/%s', '../administrator', 'com_mailjet', 'contacts-48x48.png').');}');


// import joomla controller library
jimport('joomla.application.component.controller');

// Get an instance of the controller prefixed by HelloWorld
$controller = JControllerLegacy::getInstance('Mailjet');

// Perform the Request task
$controller->execute(JRequest::getCmd('task'));

// Redirect if set by the controller
$controller->redirect();
components/com_mailjet/helpers/index.html000060400000000037152453623460014661 0ustar00<!DOCTYPE html><title></title>
components/com_mailjet/helpers/mailjet.php000060400000002167152453623460015030 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_messages
 *
 * @copyright   Copyright (C) 2005 - 2014 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * @package     Joomla.Administrator
 * @subpackage  com_mailjet
 * @since       1.6
 */
class MailjetHelper
{
	/**
	 * Configure the Linkbar.
	 *
	 * @param   string	The name of the active view.
	 *
	 * @return  void
	 * @since   1.6
	 */
	public static function addSubmenu($vName)
	{
		JHtmlSidebar::addEntry(
			JText::_('COM_MAILJET_SETTINGS'),
			'index.php?option=com_mailjet&view=mailjet',
			$vName == 'mailjet'
		);

		JHtmlSidebar::addEntry(
			JText::_('COM_MAILJET_CONTACTS'),
			'index.php?option=com_mailjet&view=contacts',
			$vName == 'contacts'
		);

		JHtmlSidebar::addEntry(
			JText::_('COM_MAILJET_CAMPAIGNS'),
			'index.php?option=com_mailjet&view=campaigns',
			$vName == 'campaigns'
		);

		JHtmlSidebar::addEntry(
			JText::_('COM_MAILJET_STATS'),
			'index.php?option=com_mailjet&view=statistics',
			$vName == 'statistics'
		);
	}
}
components/com_mailjet/controller.php000060400000020737152453623460014127 0ustar00<?php
/**
 * @author Mailjet SAS
 *
 * @copyright  Copyright (C) 2014 Mailjet SAS.
 * @license    GNU General Public License version 2 or later; see LICENSE
 */
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
ini_set('display_errors', 0);

// import Joomla controller library
jimport('joomla.application.component.controller');

if (!function_exists('class_alias')) { // For php older then 5.3
  function class_alias($orig, $alias) {
    eval('abstract class ' . $alias . ' extends ' . $orig . ' {}');
  }
}

if (!class_exists('JControllerLegacy')) {
  class_alias('JController','JControllerLegacy');
}

/**
 * General Controller of HelloWorld component
 */
class MailjetController extends JControllerLegacy
{
    /**
     * display task
     *
     * @return void
     */
    function display($cachable = false, $urlparams = false)
    {
        require_once JPATH_COMPONENT.'/helpers/mailjet.php';

        // set default view if not set
        JRequest::setVar('view', JRequest::getCmd('view', 'mailjet'));

        $view   = $this->input->get('view', 'messages');
        $layout = $this->input->get('layout', 'default');
        $id     = $this->input->getInt('id');

        MailjetHelper::addSubmenu($this->input->get('view', 'mailjet'));
        // call parent behavior
        parent::display($cachable);
    }



    function save ()
    {		
        JRequest::checkToken () or jexit ('Invalid Token');

        $error = FALSE;
        $mailjetConfig = sPrintF ('%s/components/%s/config.php', JPATH_ADMINISTRATOR, 'com_mailjet');
        $fileConfig = JPATH_ROOT.'/configuration.php';

        require_once ($mailjetConfig);

        $conf = new JMailjetConfig ();

        $host = $conf->host;

        $prev = new JConfig();
        $prev = JArrayHelper::fromObject($prev);

        $fields ['bak_mailer'] = $prev ['mailer'];
        $fields ['bak_smtpauth'] = $prev ['smtpauth'];
        $fields ['bak_smtpuser'] = $prev ['smtpuser'];
        $fields ['bak_smtppass'] = $prev ['smtppass'];
        $fields ['bak_smtphost'] = $prev ['smtphost'];
        $fields ['bak_smtpsecure'] = $prev ['smtpsecure'];
        $fields ['bak_smtpport'] = $prev ['smtpport'];

        $data = JRequest::get ('post');

        $fields ['enable'] = isSet ($data ['enable']);
        $fields ['test'] = isSet ($data ['test']);
        $fields ['test_address'] = $data ['test_address'];
        $fields ['username'] = $data ['username'];
        $fields ['password'] = $data ['password'];
        $fields ['host'] = $host;

        $configs = array (array ('ssl://', 465),
            array ('tls://', 587),
            array ('', 587),
            array ('', 588),
            array ('tls://', 25),
            array ('', 25),
            array ('', 80));

        $connected = FALSE;

        for ($i = 0; $i < count ($configs); ++$i)
        {
            $soc = @ fSockOpen ($configs [$i] [0].$host, $configs [$i] [1], $errno, $errstr, 5);

            if ($soc)
            {
                fClose ($soc);

                $connected = TRUE;

                break;
            }
        }

        if ($connected)
        {
            if ('ssl://' == $configs [$i] [0])
            {
                $fields ['secure'] = 'ssl';
            }
            elseif ('tls://' == $configs [$i] [0])
            {
                $fields ['secure'] = 'tls';
            }
            else
            {
                $fields ['secure'] = 'none';
            }

            $fields ['port'] = $configs [$i] [1];
        }
        else
        {
            JError::raiseWarning (0, sPrintF (JText::_('COM_MAILJET_CONTACT_SUPPORT_ERROR'), $errno, $errstr));
        }

        jimport ('joomla.mail.helper');

        if ($fields ['test'] && (empty ($fields ['test_address']) || ! JMailHelper::isEmailAddress ($fields ['test_address'])))
        {
            JError::raiseWarning (0, JText::_('COM_MAILJET_RECIPIENT_INVALID', $fields ['test_address']));

            $error = TRUE;
        }

        if (empty ($fields ['username']) || empty ($fields ['password']))
        {
            JError::raiseWarning (0, JText::_('COM_MAILJET_SETTINGS_MANDATORY'));

            $error = TRUE;
        }

        if (! $error)
        {
            jimport ('joomla.filesystem.path');
            jimport ('joomla.filesystem.file');

            $config = new JRegistry ('config');
            $config->loadArray ($fields);

            $configString = $config->toString ('PHP', array ('class' => 'JMailjetConfig', 'closingtag' => false));

            if (! JFile::write ($mailjetConfig, $configString))
            {
                JError::raiseWarning (0, JText::_ ('COM_MAILJET_CONFIG_FILE_UNWRITABLE'));
            }

            $mailjetData = sPrintF ('%s/components/%s/lib/db/data', JPATH_ADMINISTRATOR, 'com_mailjet');
            $JSONString = json_encode(array(
                'apiKey' => $fields['username'],
                'apiSecret' => $fields['password'],
                'token' => null,
                'test_address' => $fields['test_address'],
                'enable' => $fields['enable'],
            ));
            if (! JFile::write ($mailjetData, $JSONString))
            {
                JError::raiseWarning (0, JText::_ ('Unable to write data file for Mailjet\'s settings.'));
            }

            if ($fields ['enable'])
            {
                $prev ['mailer'] = 'smtp';
                $prev ['smtpauth'] = '1';
                $prev ['smtpuser'] = $fields ['username'];
                $prev ['smtppass'] = $fields ['password'];
                $prev ['smtphost'] = $fields ['host'];
                $prev ['smtpsecure'] = $fields ['secure'];
                $prev ['smtpport'] = $fields ['port'];
            }
            else
            {
                $prev ['mailer'] = $fields ['bak_mailer'];
                $prev ['smtpauth'] = $fields ['bak_smtpauth'];
                $prev ['smtpuser'] = $fields ['bak_smtpuser'];
                $prev ['smtppass'] = $fields ['bak_smtppass'];
                $prev ['smtphost'] = $fields ['bak_smtphost'];
                $prev ['smtpsecure'] = $fields ['bak_smtpsecure'];
                $prev ['smtpport'] = $fields ['bak_smtpport'];
            }

            $config = new JRegistry ('config');

            $config->loadArray ($prev);

            if (!JPath::setPermissions ($fileConfig, '0644'))
            {
                JError::raiseNotice ('SOME_ERROR_CODE', JText::_ ('COM_CONFIG_ERROR_CONFIGURATION_PHP_NOTWRITABLE'));
            }

            $configString = $config->toString('PHP', array ('class' => 'JConfig', 'closingtag' => false));
            if (!JFile::write($fileConfig, $configString))
            {
                JError::raiseWarning (0, JText::_ ('COM_CONFIG_ERROR_WRITE_FAILED'));
            }

            if (!JPath::setPermissions($fileConfig, '0444'))
            {
                JError::raiseNotice ('SOME_ERROR_CODE', JText::_ ('COM_CONFIG_ERROR_CONFIGURATION_PHP_NOTUNWRITABLE'));
            }

            // Extablish API connection because we will need it to check if the API Key and Secrect Key are correct
            require_once(dirname(__FILE__).'/lib/lib/mailjet-api-strategy.php');
            $api = new Mailjet_Api($fields['username'], $fields['password']);
            if($api->apiUrl === null){
                JError::raiseWarning (0, JText::_ ('COM_MAILJET_API_KEY_ERROR'));
            }

            if ($fields ['test'])
            {
	        $jversion = new JVersion();
	        if (version_compare($jversion->getShortVersion(), '2.5.6', 'lt')) {
                  if (JUtility::sendMail ($prev ['mailfrom'], $prev ['fromname'], $fields ['test_address'], JText::_ ('Your test mail from Mailjet and Joomla'), JText::_ ('COM_MAILJET_CONFIG_OK')) !== TRUE)
                  {
                    JError::raiseNotice (500, JText:: _ ('COM_MAILJET_TEST_EMAIL_NOT_SENT'));
                  }
                } else {
                  $mail = JMail::getInstance();
                  $mail->useSMTP(true, $prev ['smtphost'], $prev ['smtpuser'], $prev ['smtppass'], 'tls', 587);
                  if ($mail->sendMail ($prev ['mailfrom'], $prev ['fromname'], $fields ['test_address'], JText::_ ('Your test mail from Mailjet and Joomla'), JText::_ ('COM_MAILJET_CONFIG_OK')) !== TRUE)
                  {
                    JError::raiseNotice (500, JText:: _ ('COM_MAILJET_TEST_EMAIL_NOT_SENT'));
                  }
                }
            }
            JFactory::getApplication()->enqueueMessage(JText:: _ ('COM_MAILJET_SETTINGS_SAVED'));
        }
        $this->display();
    }

}
components/com_mailjet/config.php000060400000001030152453623460013172 0ustar00<?php
class JMailjetConfig {
	public $bak_mailer = 'mail';
	public $bak_smtpauth = '0';
	public $bak_smtpuser = '';
	public $bak_smtppass = '';
	public $bak_smtphost = 'localhost';
	public $bak_smtpsecure = 'none';
	public $bak_smtpport = '25';
	public $enable = '1';
	public $test = '1';
	public $test_address = 'vincent.halle@eliosa.com';
	public $username = '6363e9d3b0fbcc689c98e18a1a0ba9b5';
	public $password = 'ea3818da6ef29051a081297d4e4ea6cb';
	public $host = 'in.mailjet.com';
	public $secure = 'ssl';
	public $port = '465';
}components/com_mailjet/language/en-GB/en-GB.com_mailjet.sys.ini000060400000000563152453623460020371 0ustar00COM_MAILJET_MENU="Mailjet"
COM_MAILJET_SETTINGS="Settings"
COM_MAILJET_STATS="Statistics"
COM_MAILJET_CONTACTS="Contacts"
COM_MAILJET_CAMPAIGNS="Campaigns"
COM_MAILJET_PRICING="Pricing"
COM_MAILJET_SETTINGS_SAVED="Your settings have been saved successfully"
COM_MAILJET_CONTACT_SUPPORT_ERROR = "Please contact Mailjet support to sort this out.<br /><br />Error %d - %s"

components/com_mailjet/language/en-GB/en-GB.com_mailjet.ini000060400000007517152453623460017562 0ustar00COM_MAILJET_MENU="Mailjet"
COM_MAILJET_SETTINGS="Settings"
COM_MAILJET_STATS="Statistics"
COM_MAILJET_CONTACTS="Contacts"
COM_MAILJET_CAMPAIGNS="Campaigns"
COM_MAILJET_PRICING="Pricing"
COM_MAILJET_SETTINGS_SAVED="Your settings have been saved successfully"

COM_MAILJET_SENDER_ERROR = "Please make sure that you are using the correct API key and secret key associated to your mailjet account (from email)."
COM_MAILJET_API_KEY_ERROR = "Please verify that you have entered your API and secret key correctly. If this is the case and you have still this error message, please go to Account API keys (<a href=\"https://www.mailjet.com/account/api_keys\" target=\"_blank\">https://www.mailjet.com/account/api_keys</a>) to regenerate a new Secret Key for the plug-in."
COM_MAILJET_CONTACT_SUPPORT_ERROR = "Please contact Mailjet support to sort this out.<br /><br />Error %d - %s"
COM_MAILJET_CONFIG_FILE_UNWRITABLE="Unable to write configuration file for Mailjet's settings."
COM_MAILJET_RECIPIENT_INVALID="The recipient of the test mail is invalid."
COM_MAILJET_TEST_EMAIL_NOT_SENT="The test mail could not be sent."
COM_MAILJET_CONFIG_OK="Mailjet configuration saved successfully"
COM_MAILJET_SETTINGS_MANDATORY="Your Mailjet settings are mandatory."

COM_MAILJET_PLUGIN_INSTRUCTIONS_TITLE="Mailjet Module"

COM_MAILJET_MAILJET_SETTINGS_API_KEYS_HELP="You can get your API keys from <a href=\"https://www.mailjet.com/account/api_keys\">your mailjet account</a>. Please also make sure the sender address is active in <a href=\"https://www.mailjet.com/account/sender\">your account</a>"

COM_MAILJET_PLUGIN_INSTRUCTIONS_CREATE_ACCOUNT="<a href=\"https://www.mailjet.com/signup?p=joomla-3.0\">Create your Mailjet account</a> or visit your <a href=\"https://fr.mailjet.com/account/api_keys\">account page</a> to get your API keys."
COM_MAILJET_PLUGIN_INSTRUCTIONS_CREATE_LIST="<a href=\"index.php?option=com_mailjet&view=contacts\">Create a new list</a> if you don't have one or need a new one."
COM_MAILJET_PLUGIN_INSTRUCTIONS_CREATE_WIDGET="<a href=\"index.php?option=com_modules\">Add</a> the email collection widget to your sidebar or footer."
COM_MAILJET_PLUGIN_INSTRUCTIONS_CREATE_CAMPAIGN="<a href=\"index.php?option=com_mailjet&view=campaigns\">Create a campaign</a> on mailjet.com to send your newsletter."

COM_MAILJET_PLUGIN_INSTRUCTIONS_FACEBOOK_LINK="<iframe src=\"//www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FMailjet&amp;send=false&amp;layout=button_count&amp;width=150&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font&amp;height=21&amp;appId=352489811497917\" scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden; width:150px; height:21px;\" allowTransparency=\"true\"></iframe>"
COM_MAILJET_PLUGIN_INSTRUCTIONS_TWITTER_LINK="<a href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-url=\"http://www.mailjet.com\" data-text=\"Improve your email deliverability and monitor action in real time.\" data-via=\"mailjet_fr\">Tweet</a>
<a href=\"https://twitter.com/mailjet\" class=\"twitter-follow-button\" data-show-count=\"false\">Follow @mailjet</a>
                                              <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=\"//platform.twitter.com/widgets.js\";fjs.parentNode.insertBefore(js,fjs);}}(document,\"script\",\"twitter-wjs\");</script>"
COM_MAILJET_PLUGIN_INSTRUCTIONS_SHARE="Share the love!"

COM_MAILJET_GENERAL_SETTINGS="General Settings"
COM_MAILJET_MAILJET_SETTINGS="Mailjet Settings"
COM_MAILJET_GENERAL_SETTINGS_ENABLED="Enabled:"
COM_MAILJET_GENERAL_SETTINGS_SEND_TEST="Send test mail now:"
COM_MAILJET_GENERAL_SETTINGS_TEST_RECIPIENT="Recipient of test mail:"
COM_MAILJET_MAILJET_SETTINGS_API_KEY="API key:"
COM_MAILJET_MAILJET_SETTINGS_SECRET_KEY="Secret key:"

COM_MAILJET_NO_LISTS="You have no lists."

components/com_mailjet/language/fr-FR/fr-FR.com_mailjet.ini000060400000007732152453623460017631 0ustar00COM_MAILJET_MENU="Mailjet"
COM_MAILJET_SETTINGS="Préférences"
COM_MAILJET_STATS="Statistiques"
COM_MAILJET_CONTACTS="Contacts"
COM_MAILJET_CAMPAIGNS="Campagnes"
COM_MAILJET_CONTACT_SUPPORT_ERROR = "Veuillez contacter le support Mailjet pour régler ce problème.<br /><br />Error %d - %s"
COM_MAILJET_SETTINGS_SAVED="Vos préférences ont été enregistrées avec succès"
COM_MAILJET_CONFIG_FILE_UNWRITABLE="Impossible d'écrire le fichier de préférences."
COM_MAILJET_RECIPIENT_INVALID="Le destinataire du message de test est invalide."
COM_MAILJET_TEST_EMAIL_NOT_SENT="Impossible d'envoyer l'email de test."
COM_MAILJET_SETTINGS_MANDATORY="Les préférences de Mailjet sont obligatoires"
COM_MAILJET_CONFIG_OK="Configuration Mailjet enregistrée avec succès"

COM_MAILJET_SENDER_ERROR = "Please make sure that you are using the correct API key and secret key associated to your mailjet account (from email)."
COM_MAILJET_API_KEY_ERROR = "Merci de vérifier que vous avez correctement saisi votre clé d'API et votre clé secrète. Si vous obtenez toujours ce message d'erreur après vérification, rendez-vous dans la section Account API keys (« Clés d'API de compte ») (<a href=\"https://www.mailjet.com/account/api_keys\" target=\"_blank\">https://www.mailjet.com/account/api_keys</a>) pour générer un nouvelle clé secrète pour le plug-in."
COM_MAILJET_PLUGIN_INSTRUCTIONS_TITLE="Module Mailjet"
COM_MAILJET_PLUGIN_INSTRUCTIONS_CREATE_ACCOUNT="<a href=\"https://fr.mailjet.com/signup?p=joomla-3.0\">Créer votre compte Mailjet</a> ou visitez votre <a href=\"https://fr.mailjet.com/account/api_keys\">page compte</a> pour obtenir vos clés API."
COM_MAILJET_PLUGIN_INSTRUCTIONS_CREATE_LIST="<a href=\"index.php?option=com_mailjet&view=contacts\">Créez une nouvelle liste</a> si vous n'en avez pas ou que vous en voulez en ajouter une."
COM_MAILJET_PLUGIN_INSTRUCTIONS_CREATE_WIDGET="<a href=\"index.php?option=com_modules\">Ajoutez</a> le widget de collecte d'adresses emails dans votre barre latérale, ou votre footer."
COM_MAILJET_PLUGIN_INSTRUCTIONS_CREATE_CAMPAIGN="<a href=\"index.php?option=com_mailjet&view=campaigns\">Créer une campagne</a> sur mailjet.com ou envoyer une newsletter."

COM_MAILJET_PLUGIN_INSTRUCTIONS_FACEBOOK_LINK="<iframe src=\"//www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FMailjetFrance&amp;send=false&amp;layout=button_count&amp;width=150&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font&amp;height=21&amp;appId=352489811497917\" scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden; width:150px; height:21px;\" allowTransparency=\"true\"></iframe>"
COM_MAILJET_PLUGIN_INSTRUCTIONS_SHARE="Partagez !"
COM_MAILJET_PLUGIN_INSTRUCTIONS_TWITTER_LINK="<a href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-url=\"http://www.mailjet.com\" data-text=\"Améliorez votre délivrabilité et suivez vos emails en temps réel\" data-via=\"mailjet\">Tweet</a><a href=\"https://twitter.com/mailjet_fr\" class=\"twitter-follow-button\" data-show-count=\"false\">Suivre @mailjet_fr</a><script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=\"//platform.twitter.com/widgets.js\";fjs.parentNode.insertBefore(js,fjs);}}(document,\"script\",\"twitter-wjs\");</script>"

COM_MAILJET_GENERAL_SETTINGS="Préférences Générales"
COM_MAILJET_MAILJET_SETTINGS_API_KEYS_HELP="Vous pouvez obtenir vos clés API depuis <a href=\"https://fr.mailjet.com/account/api_keys\">votre compte Mailjet</a>. Assurez-vous que l'adresse d'expéditeur  est bien activée dans <a href=\"https://fr.mailjet.com/account/sender\">votre compte</a>"
COM_MAILJET_MAILJET_SETTINGS="Préférences Mailjet"
COM_MAILJET_GENERAL_SETTINGS_ENABLED="Activé :"
COM_MAILJET_GENERAL_SETTINGS_SEND_TEST="Envoyer un email de test :"
COM_MAILJET_GENERAL_SETTINGS_TEST_RECIPIENT="Destinataire du test :"
COM_MAILJET_MAILJET_SETTINGS_API_KEY="Clé API:"
COM_MAILJET_MAILJET_SETTINGS_SECRET_KEY="Clé secrète:"
components/com_mailjet/language/fr-FR/fr-FR.com_mailjet.sys.ini000060400000000444152453623460020437 0ustar00COM_MAILJET_MENU="Mailjet"
COM_MAILJET_SETTINGS="Préférences"
COM_MAILJET_STATS="Statistiques"
COM_MAILJET_CONTACTS="Contacts"
COM_MAILJET_CAMPAIGNS="Campagnes"
COM_MAILJET_CONTACT_SUPPORT_ERROR = "Veuilliez contacter le support Mailjet pour régler ce problème.<br /><br />Error %d - %s"
components/com_mailjet/language/es-ES/es-ES.com_mailjet.ini000060400000007641152453623460017630 0ustar00COM_MAILJET_MENU="Mailjet"
COM_MAILJET_SETTINGS="Parámetros"
COM_MAILJET_STATS="Estadísticas"
COM_MAILJET_CONTACTS="Contactos"
COM_MAILJET_CAMPAIGNS="Campañas"
COM_MAILJET_SETTINGS_SAVED="Su configuración ha sido guardada"

COM_MAILJET_SENDER_ERROR = "Please make sure that you are using the correct API key and secret key associated to your mailjet account (from email)."
COM_MAILJET_API_KEY_ERROR = "Por favor, compruebe que ha introducido correctamente su API y su clave secreta. Si es así y sigue apareciendo este mensaje de error, le rogamos que acceda a la sección Account API keys (<a href=\"https://www.mailjet.com/account/api_keys\" target=\"_blank\">https://www.mailjet.com/account/api_keys</a>) y vuelva a generar una clave secreta para el plugin."
COM_MAILJET_CONTACT_SUPPORT_ERROR = "Por favor póngase en contacto con el Soporte de Mailjet para resolver este problema.<br /><br />Error %d - %s"
COM_MAILJET_CONFIG_FILE_UNWRITABLE="No ha sido posible escribir el fichero de configuración"
COM_MAILJET_RECIPIENT_INVALID="El destinatario del email de prueba es invalido"
COM_MAILJET_TEST_EMAIL_NOT_SENT="El correo de prueba no se ha podido enviar."
COM_MAILJET_CONFIG_OK="¡Su configuración de Mailjet está bien!"
COM_MAILJET_SETTINGS_MANDATORY="Les preferencias son obligatorias."

COM_MAILJET_PLUGIN_INSTRUCTIONS_TITLE="Modulo Mailjet"
COM_MAILJET_PLUGIN_INSTRUCTIONS_CREATE_ACCOUNT="<a href=\"https://es.mailjet.com/signup?p=joomla-3.0\">Cree su cuenta Mailjet</a> o visite su <a href=\"https://fr.mailjet.com/account/api_keys\">cuenta</a> para conseguir sus claves de API."
COM_MAILJET_PLUGIN_INSTRUCTIONS_CREATE_LIST="<a href=\"index.php?option=com_mailjet&view=contacts\">Cree una nueva lista</a> si no tiene o necesita una nueva."
COM_MAILJET_PLUGIN_INSTRUCTIONS_CREATE_WIDGET="<a href=\"index.php?option=com_modules\">Añada</a> el widget de suscripción de emails en su barra lateral o footer."
COM_MAILJET_PLUGIN_INSTRUCTIONS_CREATE_CAMPAIGN="<a href=\"index.php?option=com_mailjet&view=campaigns\">Cree una campaña</a> en mailjet.com para enviar su newsletter."

COM_MAILJET_PLUGIN_INSTRUCTIONS_FACEBOOK_LINK="<iframe src=\"//www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2FMailjet&amp;send=false&amp;layout=button_count&amp;width=150&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font&amp;height=21&amp;appId=352489811497917\" scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden; width:150px; height:21px;\" allowTransparency=\"true\"></iframe>"
COM_MAILJET_PLUGIN_INSTRUCTIONS_TWITTER_LINK="<a href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-url=\"http://www.mailjet.com\" data-text=\"Mejore su entregabilidad de emails y haga seguimiento de las acciones en tiempo real\" data-via=\"mailjet\">Tweet</a>
<a href=\"https://twitter.com/mailjet\" class=\"twitter-follow-button\" data-show-count=\"false\">Seguir @mailjet</a>
                                              <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=\"//platform.twitter.com/widgets.js\";fjs.parentNode.insertBefore(js,fjs);}}(document,\"script\",\"twitter-wjs\");</script>"
COM_MAILJET_PLUGIN_INSTRUCTIONS_SHARE="Comparte!"

COM_MAILJET_GENERAL_SETTINGS="Configuración general"
COM_MAILJET_MAILJET_SETTINGS="Parámetros de API"
COM_MAILJET_MAILJET_SETTINGS_API_KEYS_HELP="Puede conseguir sus claves de API desde <a href=\"https://es.mailjet.com/account/api_keys\">su cuenta mailjet</a>. Por favor, asegurese que la dirección de remitente esté activa en <a href=\"https://es.mailjet.com/account/sender\">su cuenta</a>"
COM_MAILJET_GENERAL_SETTINGS_ENABLED="Enabled:"
COM_MAILJET_GENERAL_SETTINGS_SEND_TEST="Enviar email de prueba ahora:"
COM_MAILJET_GENERAL_SETTINGS_TEST_RECIPIENT="Destinatario del email de prueba:"
COM_MAILJET_MAILJET_SETTINGS_API_KEY="Clave de API:"
COM_MAILJET_MAILJET_SETTINGS_SECRET_KEY="Contraseña de API:"
components/com_mailjet/language/es-ES/es-ES.com_mailjet.sys.ini000060400000000523152453623460020435 0ustar00COM_MAILJET_MENU="Mailjet"
COM_MAILJET_SETTINGS="Settings"
COM_MAILJET_STATS="Statistics"
COM_MAILJET_CONTACTS="Contacts"
COM_MAILJET_CAMPAIGNS="Campaigns"
COM_MAILJET_SETTINGS_SAVED="Your settings have been saved successfully"
COM_MAILJET_CONTACT_SUPPORT_ERROR = "Please contact Mailjet support to sort this out.<br /><br />Error %d - %s"components/com_mailjet/styles.css000060400000001155152453623460013261 0ustar00.iframe{
    border-bottom-color: rgb(238, 238, 238);
    border-bottom-style: inset;
    border-bottom-width: 2px;
    border-image-outset: 0px;
    border-image-repeat: stretch;
    border-image-slice: 100%;
    border-image-source: none;
    border-image-width: 1;
    border-left-color: rgb(238, 238, 238);
    border-left-style: inset;
    border-left-width: 2px;
    border-right-color: rgb(238, 238, 238);
    border-right-style: inset;
    border-right-width: 2px;
    border-top-color: rgb(238, 238, 238);
    border-top-style: inset;
    border-top-width: 2px;
    padding: 10px;
    width: 1000px !important;
}components/com_mailjet/images/stats-48x48.png000060400000006027152453623460015135 0ustar00�PNG


IHDR00W��bKGD�C�	pHYsHHF�k>	vpAg00��WIDATh��YipTU�ν���k���,l!$0H���q\FQ��e�����*.)u�(kj�*D\-g�B	�(.�U!��@����@����y�޻�Cd�4��Su��^�{���%$��-5�Q8f�k\VV���HR�mYz]{{�κ��ښ�#@&jS�bWr���)Sr�}�	^�'��@�F��axXo������4��P��E��d��6ڱ��jo�Νm�f3M]?�hZ~~����������3����������@�eR��@����OI���tD<��m�����ǯWT���.<�&�:���<�6GK����etuA�b}�(Χ")�Ln�CfY99
m���wt�륯���xb��������@@,�9�x��}rKK�UW�2zz~Vz�dY !�ddHs���:����_�MU�������J�N�� y�WW�ŎXg(����S���#]��e�wu�u�֭;�BX���K��eJ��.�kk[&�)�O&�!"H˂G08~�a��ʪ�����V������~�gQn\b��8�i&^���a���L��=%YU�Z9v��'jkO����|i)2��������i�QW�I���}z,���h��h���4O�~?]����vu�ԩw�wv>a56���Ck�v�����o�B�}VS�|Įg�^:�0�!��s�I�!)A.�y��kMoTU5/�o��L�k�s��������%',�!���83�_L�z�P,�X��m��n���_�6~쓪��%��N{~����{o{+������{��9¦)��0គ����ѡ�����i�fd��6.-��nX|��)W]��tɪi�#&F6��R���/�Ǥ$��w�w99#G�bX0�c8W�\.��_�)��nX4R���V$Ӂi0C H������ٿ�α��dž�U�د�ٮP���c��3��%~���u����}Ѥ�����vYA�!8C�E�&�&�EJZ�����\LLKKϲ�ky$�ϩ�>߇�t��{k﹥�p�E���"f� ��E?+����sF�w-���|�Y�m�ra�i.�Ѩ�\$-s:e��W�N�|{Ϟ�{n.�0�j�%dt�3��1̈�)�n�9�.]�g$�-X�Gr>M3�T�9�*3�t"��}���?�f���7O�e��}��K���(\��5c#���E���4�/�U��r�8�ϝN�ލ�oVV�_xSq�-��,ϴ7^.��P �8%+���4&Ι�T��+7Ĭ��t������r�I	��О���P�7*+��}c���2���
W�h�D��L���DO~@�\E�ۉ�1���zh���7���K_����7Lλ�j�߲�M��p�&��Me�ƹO!r��e}MC���EY8���;v�c��1w�d=��:x5b�ؾD@�#2��μ,Ɍ�	�T��GJP\��6��K^پ}���M}��G$��b��%ڮ�[<��򼤀ЈTN��1������%/n۶���nj���QόHi��b�;%�h���WmMtA��L�<�D�jm]�¾};��r��ްn��wȹ\J�7#��ý�΀ɒ B�u���RM$)�d�`Qܻ���K�x���M�R�H!Bܲo��1�Kq�s<9^�4�m�������w��EāX��།�@}&b�Ł���2�eY���@������
��7��U|^��y��O���w*B֠78��lC7A
�1�$��!�B�����B�f��P�2I 0�l��xS�'�K:�I)�Z��b�jOBg�AGH�$�!�b���I��JJ���mGP��<�����CCg;iA�S�zF>e���q#"�y��ѣ7Ӵx,���vt��A*�w?g�^�)���5kㆉ�&d}�q�ܹ�ed�O5��V#�q9@��(`*
A	A��������;� {�x4��.�5�d�m�F��m�z�T\�����:��:*�RF�+4��RF��1b�ϲ�
�P����x�4B��+! `�6�xm�֢�	���E(�ð���^�3�;����P�P�D�T��o��*P�3�h99uws��x�����Ǘv�?�ò�|I�u���^0�(;R�s�s�`WU�m*��٦"UM6�fǫ�Om�(�*�`ǘ侲2H){/;���L��=���:����#ްi*l�p
(P�5�>�\s�U)�NDž�	>�{��E������\�nb������fS�Ă�VwE�ƶe��6�Ir�A��퍒�{��Cy�-PB!m�C<��6� �Bkumm�X�Ŋ-��¥;�����~hl	{���nBJ�bW0蕱؀���
M9	�Zv�7;6���G?z���M�"z�+N[�K�?�}��n�ooJI��p�c�؀:*�rgqj�R��N����ܽ�/ �)�?���ի"����7Λ2e�-yy����nM�	Jo�ӌ�w��+Dc�7��;c�Q�N�Zy�w��6=�eScMs�� ���ܙ渵��{�6��m��>���ï�x�F�-I��(#��F��\Q�#1��X\��e���kO�{?���ӭ��BD��0L�Y���N����7��WM��];�� �W����"70F�,�bYniYB�z$�,{���
��Q7"���A�~��𮮊m��ٳGM'��3����"EъF�rO�zS�.�;E�Ԇ��ڕ-j
s�^>F!-��%�spw[�ފ���E�e���f�*���)%tEXtcreate-date2009-09-28T11:27:54-04:00J��=%tEXtmodify-date2009-05-18T16:10:00-04:00�ֽtEXtSoftwareAdobe ImageReadyq�e<IEND�B`�components/com_mailjet/images/logo-16x16.png000060400000000777152453623460014733 0ustar00�PNG


IHDR�asRGB���bKGD�������	pHYs��tIME�95;��IDAT8��M+Da����w��|JL��8QF6MȂƊl,����?�,d�P�Q�?@VV&c�a2i� s�9��+�U����}?�����O�3���I��3D�'"����(�����6��^Q�ɥw�`����$��4!�1M�I����
�@wh�/غ�n�@��fdYY�l{b�s	��b�"��ĕ۝
���%�X��Ƃ�^VX�2S���F�D�W���r�J�qE�柱�H��%�;����jWz�M.EMݒCYe���;��rQݠ�8��p�7�)7_L�b����wd�t-�MCۅ��j�	�B^�Mp�o����ꯏ�=S��Q�8�S��'�S#)�\&ȝe��<|���wꂣCPERIEND�B`�components/com_mailjet/images/logo.png000060400000034747152453623460014154 0ustar00�PNG


IHDR�Fx逻tEXtSoftwareAdobe ImageReadyq�e<
4iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.2-c063 53.352624, 2008/07/30-18:05:41        ">
 <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <rdf:Description rdf:about=""
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:xmpRights="http://ns.adobe.com/xap/1.0/rights/"
    xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/"
    xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/"
   xmpRights:WebStatement=""
   photoshop:AuthorsPosition="">
   <dc:rights>
    <rdf:Alt>
     <rdf:li xml:lang="x-default"/>
    </rdf:Alt>
   </dc:rights>
   <dc:creator>
    <rdf:Seq>
     <rdf:li/>
    </rdf:Seq>
   </dc:creator>
   <dc:title>
    <rdf:Alt>
     <rdf:li xml:lang="x-default">Imprimer</rdf:li>
    </rdf:Alt>
   </dc:title>
   <xmpRights:UsageTerms>
    <rdf:Alt>
     <rdf:li xml:lang="x-default"/>
    </rdf:Alt>
   </xmpRights:UsageTerms>
   <Iptc4xmpCore:CreatorContactInfo
    Iptc4xmpCore:CiAdrExtadr=""
    Iptc4xmpCore:CiAdrCity=""
    Iptc4xmpCore:CiAdrRegion=""
    Iptc4xmpCore:CiAdrPcode=""
    Iptc4xmpCore:CiAdrCtry=""
    Iptc4xmpCore:CiTelWork=""
    Iptc4xmpCore:CiEmailWork=""
    Iptc4xmpCore:CiUrlWork=""/>
  </rdf:Description>
 </rdf:RDF>
</x:xmpmeta>
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                                                                                                    
                           
<?xpacket end="w"?>PO��,IIDATx��}	xՕ��˒,Y2���{�`�!<$/d���$y�$���$!	I�$3IH�LYy� `���x��ɶlI�,��"k��9�N�K���,	��K���nU�:�=�?��[ҧ?�Y0M4M����M���^�� �F�~?O��Y��ұ��'{}�5y{�1�~Oц�?��6�;��c���:��߿��u���j.h���a0�\0
</6mR��	�Y��O����@T�%��6�SW�Ý�TzĀ����n��[w@ӱ a;@�}�}X�Uv׃�$VIV�a�6�����N��3�n��_�$2C��ڃ�O�������qy\��\��cm�z��s������u�X���DQcH`�d*��w^�:���f��*�(��w	��~0C���Xߝ�[��8��$�{,c��m�� yׂ:�5�54�����0�3g;-�3��>��C��Z��7S�ضƙ�8�qNc=�jgӭ��D���:ceT��h���B�,�;�{z�#B�46���`��"����Q<d�p\��mk�ɩ���:��v�+��u�\+#
��!@"\V>/,]4/��N�En���?�z�h4�3�&�C�d#����\�b�)̵�$i�f�~�� ������4�`��\9*t��+emL���1(Œ��R��,���X-m�}{������>s���H���o�}��6�k��AsʹyN���X,�x��h��r����}>ĸ�I��"�5�l�}+��{äm^x���ȅ�m�º$e(�69|
��z0����俕Ƅx���v���uXs�ƹR�+��:�F!QT'E�{{�z�4�r���?y�p�p��+�H�c��M$�9\�%����A*���	�
((ȃ��B(-)���b(*ȇ��<(,,������iFP���z�FÔߒL���*��ڲ ����q?*�:T�1�{A�r��G� �+�K���{E��9FFst0 � ߈�*㘅…���yB�d֌)�ºM��h��"��b�������P���A�����=��;I�������	�x<Zk(y�|W�	U����P(���YR_3�
�T�T�5L�L˰�D������/t]>���txzg��'*b��<6ʏ8�_�Ճu1�1P�C�MG�@�t�0��
�98}��^��z뒸f�v��1�1����:4��
�j;�*���9��p溉mPr�
��躄�A�fʾ+�(��w�|�ǰ~Os�bp.@����8<�-Ơ'd���0F�s�-���X�c}/X��:%�P8s�C�rxl�ص�G`Mr��/�:���yM�)�a=�a{\77�ؑ�c4M)���j�Y�&ԖP^`��\�h+P7.�#��˗�(`��:�I��i�$�-S��@�EMA�Ҧ��"[�35!A���قh.�r�ȅ�uۙx��C`�ƭh�ĭ��Tf�68�[&+�`���p.�hImA���o|F[u�aά���	:\�`�o�Uc�+c1iy<f�C�>5���+�>�x��[A)���;�%�?�4�gA�k#x�h�z��@����o��o7��}1��)�iԸ����B��D�W�]M\eܠ��\A[]�X�����W��e�c��(����7P�_UU8��[����jt���j�%�S�kN�*�rC`�C0Ԙ�Y"�4$�<h}'U�%I.:%�g<��L=!i�*A����$9fZY�=�2�Nn�}�i;��i���:�j�@�)li
�QcะR��*��z-$E�)N����V���l�(L�!�ÎM���&qs;�aoL�6�ln�j���|���B7gNB�0р�2J
�O5f�>��
=n.Dy���Ȧ�3-&<����AE��
�S���yAP�=���ǃ��`���my$��ډD��1~�)`�"(�o���[�V]l9����X�d�r��D�}H�?�񿇊�q�̚� ��G����0���f�qݐw _@[����Ǘ�]��:L��Cm
��€€����|����F$��0�L�4f�U@�#Q�Qĉ����)_
��O��z�<�.6�23�_��CC��y*(x�i�8�_8����T�X���uØt�u+�����jhii��ci���9BXB�)5���
5�I2w�<Ƒ�R=2eB���a
��q��$曦�5���ba�B��t-��@0�A��"��1�$�Z˛��+PQ�`3��i�VZ�ɡti����p�3A8�c@���������G�ga(�j���7|��^���W|6n
(hl��"�h6!y����[�W5��IQ��2
�K�/ġb���@�$�ϼ�)MG�9H|�%���X�2b(�Q�&�ňY�"�c�IG�w�&E�@+y�
aH&j�G�r)��P;�������B�a�9W��L�M��YB��8��(����t����x���W��B>Y���9Dikܐ����B04�ˏG'�E`���U�1(�7
4�Yg�|y�e:H�CQ�A I$u��k���0�6�%�?���ř��d�m��O�ՠ�ϰ��cHЌo��]�SVv4mk������
aaFyTx�C7�1bͬF=����;p�y���}�~Mo�*��5%Q�-���8�z���l�eq��#�^�H�B�l�#�c�*gz��%X$+%Eb	5l���?i�(HZx˖"�^���m�<��ᗸs81��\�٨x�W��_R$q:�د_	��¬E�M����q���	�RذdWokR�׺���S�)T.��c�h�
��0�7%���gt�]m�Ē0�Ƥ�Y.+0��teD��`�����k�w�L�%��40�H�&%qg2��WH~$�+@+Z��X ���x�As�۲aE�S5BH�_��<�e45�\�<\1�U���<͸͟�-z��	�$�X?� *+k��T�?���pӒ�5�X���)���ǐA�#�B
��s7��߀��e�2��|]�H�pL�
:�Y�Y6ȝʁ7ӹX��LE!S̄�٪&��YSࠨ���p(�	¤B^���=��g��8U���yؾ�	�{|�>x�ZM��LVf;��Y5���E0xr�#��y+�9)�}K�~�(TaB�j���,�ߏ��UCf�~�@k{
Զ�8�v�.��X8.?�#���@��H�ƺ�@��5�Ð�KD��´1ⴑMňY��"�����Al�[@	�A��=�æm���;aˮ8}�[��Gfե��&�Ѣ]���Cb��䲛��5���ʨ��q�h�8.�_�����ҵ<���ۀۼ`X,�	L5��*�gX�G%C�PAr��7�!Zh �B�U!(�F�Ne�
��w�^�c
�ߐi���;k^�
xf3j�F�;&����Ovi=�:��IS�d�˾�x��5��rjX���kx��M�休
�)��֧@9��J̓s�ˣ�$l�~�֣���Iv�a*�o�(��H�e�T���L���"(����<¬½V��FW��ȽL�d��3��>B?���`��-�Ua��V��s���C�����g��G��f��
��2&�Th�W�(��_��e���z���H���Ak]*C��AM��PJ
��9��!�EC8��	jb��J��-o���t�+����Y�Y��*	9����7��7�5BӉ�hJ�a���B�⑗a��c�)
��K�:�=N�J��j��~ǰ{N�$���5{��IX�m����F�Д����K��J�Z9���'Є:b�UJn��f�X�_��t�3�����yV����򖀒�I{��3nZ��X��!(���`�7a��]p��N��p�
R��B�r���b:�d��5�$k�=Y�_��w!��M�LZ�b9�o�G���;�7^��&��#��<�m���AfN*7�$%i
'�8Ҡ�P�/M�d��P󗃤����5�~��?�vh
٫A��s�,���_���[�<5C^����J��4�g�tw���a-���\�&���+f��Κ֊/oOv.&x��k=�GA=�
Ǧ�J�Ŕ	Xd�[N�B��%kZØd�
NO��2{�D��?kD�E�n#��E���@s�d�Y�ӳ��ѿ�-��An3����:�L��F�3q�n� ��o��X�̅�,�A~x���s�^�"b�l�� 
p�=�&h�k����l3[pN�}�z�
�����i>�8�� L%O_Z�rPsDӦN������◇���\7�\�*���p�y��/Yx�y,�͠IX_��P<3��]�$�G��M:
4�I�wXϰYI��ú�]��G�~��AvdEW=(�ςrv��S6���ф�TUB�u�I%9Va~�ĺ�|B���ɾ21�B+����p��0#�lB݋ǟ� G�<�O=�D`ll�@�u���k����*]�u}����^�Zͣ��b�N�,��F��l6Tr�$�~>w$V�<����fR:e���U�v�a/ϛ��f�Of��0�,σwM�Q�2��d=�3<y��k����)��S�����Z�����;�W�.�A�7�y�6ꧭ�xx�������}��.��8�SP|@�=
�u��z	/9diZ�fh*v>�B騕".��`/�� �9P�<y�)���$5_l3-Wן�R ��f#J��7���؃�<�AA�n��ȣI��uR[wc��c����V�%.�Ҩ�X�nseI��3���ko�+e7�������#�b�_�$��
�D�oZ���(���/ы~�B�{n+���*��~�ױ�KX���Iw�8��)~�������z?��5rU���'#O�v�rz(�ܹO�i���b�E؞��5������=P�#�V=�-Y��+�֠m
��5�M6�hj<	w=��Z��H;)�@�aw�7x4˦|�5�v#~)M� ���‚��[�h�&k=��*�s�e�K�dJ��Su�L*J�t���u�y�\��I�����A���"�L�{x�O�c��(�L�9lmK�� �k��8V�`pp���}'�An߈�-��)̪���P��K8���c�9&[Sfb�!�OJ�u�(��Ԃ��Z��.�n��u�i�;~��pFK������}���g�!�㵧�~����ʵ�X+�_hyO
pL��~�0��Y�-N��	Z~H,)4��S俲H��g�M.����.d�PV�f��cl�T;�}��,�m��Φ�m�?�3)K��Tk'W����$��Yoa�A�hg� HSD�!�؉�b+�g�����o>�����A�~hk�5����p�U��j��U,C�]'v4����M��f㵒�{r�p��|��M;B��y�>�Ġ	Jh�^tǦ���F`Pٗ%8����U��b~b�l�KU���ϩ��ʓ�(N��XK�)L�#��J��+�&��V|
���Ś�BJ	L��k"��Z�j��B8���!f�H=ͨ!6#��R�ՒR�94���P@�l���¸)�T�.k�Q�b1P�ƃ��P�g�.���!���Gy��7aF!V>��w���Շ&T�M�i�,��99|~{4�:�\&��'�fHE���/�S�v>�k8B�cF^�&r�JZ&�#��xy���O���Tcp@Sw��:
�s�ڻ�^ǵ�U�j��
 ���!�WD��醷H�!�_`��X���ޟYB���#���U^��K@��^(��U�~��@L7����y�����Y�Vd�(��j1��d��͞���R'��<VK��Щ�lDr���$�Y�)n��o�8M�֔
���b�_}�,�9�$��۳��p����8�>�es�IZ#��F��y���x/�`g�\�6�-6�(�w��uK�B�_�|�H���ٶxE'�{��5K3�K�z���՛� /Gl��s�Ug��l?�$��ʻ"ñ�&�
�UL0�BA��\�|3�ӕ���p�����w-k�T%[2~��8-4u���3�̳��:���n��8�]N��S���֢��$��~G4��CL���h\;h@<hXs7PS���S:
���!�nc3�ݕ�	5(�S��OOn�G�l�B�cM�t��-�RH�JIl�xA�K��V�8����ݓ�������8#��5�?���nm79
L(QmG��4�w.{�l�k���g�L�L��~�a��!�"�FK��-�$�)��|&xk���d�����i�/�?`���{�=G�ǿY-z`�B�7D�1�;�}�:.s�����
R�7ws-�eq��=Cg֥���uٯ�M0�����1�,_�g`�IsΙ��۟BC�*~��78xӓ.\u�Älqp?�HYn4e�U�CR��H�Ҋ�!gڵ�)����2���o�t��1�gt!�Ɲ����="'���b�>�'�L�DkryҿZ�4f�3Ana.��i���S5+
f��[s?Mp�T�����a`�!ٴ����Z����:�qғb�j�Q����_8JpH����	Ѯ��b�OF^1��v�"b�t$�?��u~iYS�{�<�돉�(3;3�
2/�03���9ñ�TK��
6
ApS�o��t��X��[_Q:�Q��h�uWy�X�5Ud���b���c��F���\L��HcC"a7��(ģ9�3�ݐS���b�)�	eZ��oP���U���Ͻy9)�U���gr���-ٌVn�uzu��n&�MϢ}�ܖe	@����N�0A��~Wj�C���h+��bE�d��$y�h��g�ߺ4p�#�9>���g���,�@�”=f�mB�H�IYh	�7�<��*�h�ۻ?�d9j^����X��68�:$�i<N���4�O����N�p��C(�<�d�Ox�TBL��4�����X��L
2�۟�
�]H��%p�X�sЎ�o�d�����Tk4r'@!F$���Β ����[��1���B�gIZS��!��1Q�%�m�:��nɁ{ӸE��%I�a��!g�C|��X����9U�Sp�*G_|&�&��JT\��@0�Hh�H�D�*]�f)kV��;�]_��|߿ �����n�[>�u���hp�=O#�vJH�R�ٵ�F2E������ޗ�fj�0�� ��j�h�H�}���⡴�@"m�.�9}IZj�%�C�gN�Ş�t*KMs��<��ߪ������G�ԗ[�[�Qƿ��.�Ù7�g�\�xr�H"LS�@�T��Y�Ve.�f��sN:P����|��#އ��r�+�ô�۔���še"0x7'p�T�2s���'Ab"�Q��Լe�:"
���L#�NR$�J����g>|n��Ӡ*r�w�!��!un�G$›��	d��S��1c2E|�C�
���vɅ�ݽ��L)w�k�����s0��.8��z���+u��z�r�Π$�Π�JCMq�/|�A8��
9����n�"Z!}�"�M(����M�HO��`��)h�K���&	�D�>���pL;�G�!-�j{���qd7'��e?
3�0���h��C`�PC֐��W
�v�*x��q��lG��6�⨞Ns8�;!����i(�4���KzN��g���s/�ꀎ�(�U�:�62+�*rh� �R=uo���|���HS.>ef���ƈg<��m�r��������3	xNs$ӱ$���8v��>��ۛ�c�V�8]���Tj��i#i���xU�
�i#�Ӏ��h�lJWq>�np�\5����"��z)t���l���S"oJs�g$�� ��PoS%$�2	`r�Y,k�pC���D�2���H�H&�֥1
��+"��#��Ya`�@}��W@�Tq9�\�
�=p��8�f��ᝠ�}�0|�G���d�䦛`tg�mJ7��h�j.�`R[n�c�~��[q�8�4�ݞ�T���a��ŴX�3��8���:��wY��A�$|�9�-.���-p���V�p�4����_=
�v�`Pq� �9��Fs6t��EK��=���/���R��`�)T����a�8Վ�:��M�_����`Douh�QV��Ki���r����Lp|����dz�|)�U�R�X�
zzS�<#�ѐ�����9���	d�O������'~��xw
��Pi�T�I8���B�g-�g�Ns�Mn����Z;XX�kq��A�ٔ����*�"��򌜓Ш�_���M�V�����t\R�Z���߽g�0��{�Q���d�S����B�����*)��=��.��D���f���h�^C�� �*���l����O2-AZ��<@�enK��:	Y��>2bSz���~�_H3�
�<_2�  в<?��p�|�P��<�u#i���c6�'�1��56�bIm>��y�!zՇ�U���6=�ǣ�����ME���	3�F
k.I���j�΁킢(<z��rk����E[X�%���h܄Y<�[e~���"$�B���^bgk1;0EN{�F���_CH�uk:����Z�
aEY#xB��	w�L�)���D��^6�(��~���B;�֒������������t7�9t|^
މ�aW����-(���0�n6h��m���j������&XР7���!�©�6Ԥ�qL��i1���%˖Csc#on���z]��`vMU�#��P�0@��ĻY{�5��{ţE`�)��.�k���瑝́�BaH�z�ր!!0��`����h
��@S$j>t�[09�޳j[y���i�es���cV�"���N��Sg̃���&�L��c���m���:�����ʸ��������p����K�_�f�@ظ�e8�?i@�+�CAQ!���’˗AݜyP;u��a��8FA-e� dI���B��HX��
'�z�|��<��k�m�L����S����L�[|���x7��·�HQ�����C�eY,r��+CL�a�)��E�!# 4���x��ƅ�'���>�2i�`�-]�ב�� x<��4���KGs�4��#_�vh~Gi2k�>
��5{���:�U�Q,���gN�Þݻ�L{;����8��]�ɵS���b�h�݃��_�Ǐ5ì9s`��YBcP;~������w��Zp���N��b��8�mĠ��T�@@���B� ����`=�D��0�Ee��L��n�ٸzL\7�#�G�U� %n�83�:>Ws�F�Oj�΁�����r��X���yg!G���g���{���@�
�b�d�Q�[�C3�M�˯���F��O����v�ouTACO)tF��y�����8�>
A&�C�(]9a���Z!��Fޝ��V�S&�¤"A
�C����x��9Ѧh���VH�YBۃ����{=^�݇���i7�����x������\��9���k ����&�߻T��[3k�bao6c^e[��=���	�o/�`\B�p�I�2)QH�7n�Rox�8�������i?�_a���L�?G\�8M�T��2�`[0_,�Iz��g�ûX�
c%�B�0��g��6�J��p�A�%⌷���M��D&X1�5��vб�h4R���9&���>�I��qC������:�b;?�i���t-x�;	쑘���m�[A�P|�����	W�.��3�ua�00����8��|o(��'�Ќ�#|�u����kf�-�,E=�N�J�ѽ�~@�H�0N�v�R���P��/|�+�v�o�;"9!nK��at���y���a��#w�Ñ�I��x�F{b�全7�=9
��i�3x&�~$_+W��@�,>e�žii�4
�����=��e��ɟ_a�����4�#���9�'P��j"��=X���Ez��#�[fCso��Sb�caUYÙ|ݝ|n$��~�tX�0nc����qL��A����Fv��������Ό\���3���>[­ÂE�!77Oh"�v5g6�;�
d��g��"T�DC�-fᡇN)w@b&b-�PD���΂p7�o�u���s��X[π�]��g�~��j�=u'Y�E��e0hT������l
���?�&�6�&2pW1Hf�����z�������B"�k!�f�!�v���M���۹�t����"���8�4�*�& �i�5���̪��C{�c4J.�J���f�̱�����C��g0���=߄L&{Vc��j�г8����*ۄ�ƂJ�nr�]KJ���r������q�~�+�����l�fc�5��E6�����;�T�Yn���\�6��;~'�1K'�s�o6CY�E��>v-op�ul����Y��Ì���EK�	o%C���y�~�Z��6�(��V9�N��e�C#��Z�r�q>�*p		�&��ؔ)��ݔ�ha�����zY7�;!1Q���~Zhل���Q?j����X{�i�������ͯ���}�3 4��b:$���������J�};4k;�4Ǩ�i��ϙU������m�ȣ��#��yT��_ʣ����ţ��`�#����a�؂��0Q�9qıO�CːF3ɜMn�7N�C�	�*�[(zM����&��/b1����������
��sU��i�χY�Mw�R����D��G[�s�o�b�Ǩ�H�gϛ/ܫYz�Δ�gY0=l^Q�ŏ�\2(侼��I�+.�`
�Un���y��۵ͭ.J+��4���AHo���]��U
�ѫ��!�����kDpP��l=<J��5Z9���7�$��$a�5�\��y�_���}��|��C��8��L�����c����*)7}�C��_��Kf۲�i�b��x9=�٩�D�LZCLA3jC�tx�m�mR
��/�8g�p;dnf3v�s�6� 
B|c���rۅ�1b�K�{
�1�T���;1��g��/F�J�<IEND�B`�components/com_mailjet/images/mj_logo_med.png000060400000002407152453623460015453 0ustar00�PNG


IHDR$.&L�tEXtSoftwareAdobe ImageReadyq�e<�IDATHǽ�KlUU��}��{����}S(J)mi�R(�R�:��D&&&������8��(1!HIP$�bBA%�")р�H�ϔZBio�gv��W����ɟo��w~�Q^x�0�+!�n$�V"��Nb���=Dt���A�iF<zرcG��m��J)�uB! �83Q?3w1Q;�$����cǎޟr�;z����?
�A�m["3��@D f03s�z���ȶs�ȮH4��Skhޓ%���B##5�0B	_y��-((�B=��X`'�+b����]r�ܥ��/�8�a�4M��`b034�QA�֣��`0��m��+,��h�K�d���l���i�ު���2j޼�y]���N��q�0�:OX �qB�sZ��W�a(�
��AL ��B���� b��5�'5����1y�l�����Ҋ2�.���}u*�FX����!H����z:��JmB����m�]��g��ۍ�p�s�Pjd��q�ulj���[8��>�5#�eԥ��A-�a��˲ �,	h,���H)9e��|C��E,s]g�p�_w����8o�ڄ/[P_��ZA�/�_I�r��"X[�+d�*�
JW��P��H�aEjʬ9%��N�8�Uo�q�����sé+��\^��#��3��ʕ?g�����
e)!�b1^G�f��DRx�'pBC'|@�0��e��2���Lr���`�_6-/+��C�Y�j�N����l ����`S`�%ðgÊ�',�����]��s��~,����^��*�&�0,��&CA@f!�:�޼o��b�ű��
I##�$�X1( �_�ǤHf6��e0�U�
�y�-��4��I�)0rh��Ai�������V�g��=L�>�|�݉�?�f���NF�,}���Z
;s�4CYML�.�|Ӎ��OJ���"��( �f�`NV9��^�`��)�x�q�lrx�57�+V������N�s+��S^��Ɲ��u0�9��{F8ᒕp�%��r���ۭ��6mm�wn�Hg�fB�b'	�s��p�O�
�v+���2����7���Nq=�hN+�z�e�ɭܦ0Ō+�w`C(T�p�SP3R{X&����a�Sȿ�#L�u��nR���mW1͌)�21��h
/|~�'��py�tFRIEND�B`�components/com_mailjet/images/campaigns-48x48.png000060400000005151152453623460015736 0ustar00�PNG


IHDR00W��sRGB���bKGD�������	pHYs��tIME�

0+�#��	�IDATh���o\�u�?��k�rHS)˪�ȭH%nPI
Ȣ�誫�Ȧp����lj�AvEѦ�$6ǿR'�۲D��3$�����.�p<�!Z��ʋ^����;�s�9��Ox���?5���A�V^���I�G=��?���Z�4�W����c���M��U��Ç����6ai}��ŋ׀��v*���UZ�<-"�V��j��m�aNz��/�*�O�O=������0pU$xA�ie� !�d��xI�fCգ�BPR�#�dH����K|1��X1�����
�G�@tU���"���748Z׿C����"r>~F�2(�ɛ���D1����:���z�MV_~Tn���c9�aUH�v3&��(�ȗ5�r��9�q�*�)��#O�эC6����/KE�X[�DU1�<qc�$I�h��4�)B��I�&D	��"�C@�&�U�$�ꬍ�.84�~���]���'���N�r^���'�Z��AĜ?��J^:��,���b�����q��5���<P^���Ss@T�I\Q�*6�>�%���Q��)r^	���*F��9�>�kQW ���:p:UY!qy^���/���V�lq���>Xk�@�ҕ,��q�n\��)���\
���UH�EL�
����/����3�=ʲd0̉"{.R��w���U��\'��F�\�#"�jX��2*�%
!rE����a�kߢ�����Fm�9���	���/�1�w� �
��U��t*���|Mp����X����F���4R�$#͒s���Q:G��caq������,1I��ٛ���~�'j��I��%��(�!!`M���"�W�E����,˒b<fee��k	AQ�*
@.EN�G� � ��?g.�r��
e�� �u:*�Kh����v�W�a�?��(HZ���;�J�W� ���Y��
.j��J�f�����Ƥ")�Ii�S�v�*.�d����$A�T�sT�L<�	���h4���c�I稔E��
�>� u%��@���Nz��\|�����M��Ld�5�x���cc��y�z-���9�4�5�(�����ՙ��hCs�W�UEL�p��y���@������91�FQ���@��SE�'8�S:2�UE�ul
�F�gb~ii��hD^{d�c���"P�%�~���k��T���jucs2Q6]UAL�P�(:d���2��6�Dn<I5:x�9G��aee���,�H�pU�(�t޸yPG7|YB�S@[sB���˗�t:�p
�lSU�󜭭-�\�rl}�D�AU^	e�Ƭ�`z���e�j@���0!5��38�y��evz;�����3���0�nw���s8��}�.'fh�W(7fm6+���ݷ~�j���u���tHG��i-.��G3�c#��‰�y���ѐ?���ܡ�fgP�D �.��
 ����W��ѴJ����o�y��X��iO0;���������Cz�qB�{h������>����o|���p�_;|PTl]	TkU����G�بlj�qN��QA�P�V�*� Ʋ��g�5��r��ﱻ�瓻w�Ҕ�ک7��di�ݭ-�{]�>�<!Z�����뫩)��5e�@�������+Q4sz�m�V1B6���&�_B�Sff�s��DC /J��.2y����ܠ�e�J��{ﳶ�ƅ�UU�&)��A����'oM�Ĥ��=�qֆ(F} nd����5cb���zH���OO,����.^F�6Ѥ;[Z\�5?ϭ[�XZZˆ��v�v�I�LK�uc����%�	��)������AA��cLl)!��]ʉ��B�2�����w���{ld���`ggUess�W((o��I���*=T���:��y�nd�P)&)�8��}J���Cd'"Sr:��"�r�U�7�rB1�,�d�W���,e����P��&b�7?fy�'-�c���T�[��z��G�RD�͋N<��_�A�$T�8�6[ċWX��cY����ڹ��hY������N��K�ܾף*ݧ֘g�$ʪ17��[�ۤ�\=����j��9����:�p`y�IooT�}�U,~�L�gϪ-�n�l�9�{��/#��޾bt�m��v��3lPկz{�c=����.���ٵ1��C�,���))�X
����Z���^�[��(�h���B��D��
<$o�N�o4���Ov�$�ݏ��$�۷��|��Z̈́O0Ɲ��Kx�F�wnmݙ�g���[����N$�����?Y��/�gk0`�p@�?��Q�;��m��c��{;�����hF�F�������i�W�x���^wl&; GC(�����p�2���W���v���L�Y�s�����$پ"�O|�;������2�Y��&��<�c���@	�&߉_�̞���x����y!��oIEND�B`�components/com_mailjet/images/index.html000060400000000054152453623460014463 0ustar00<html><body bgcolor="#FFFFFF"></body></html>components/com_mailjet/images/contacts-48x48.png000060400000011436152453623460015615 0ustar00�PNG


IHDR00W��	pHYs��~�
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-� cHRMz%������u0�`:�o�_�FIIDATx�ԚIl��of��%h�%��Y
��u��n��p�.)j����z)�\���Kѫ�C/E�\�+�.(R�m��ؑۨc[q,K�6Z�,Q\潯�C��(!"�(��}���H������绺�|����u�>�l��۟}��w}�4~����}���F��CO<7rpt�VK�Ưn�*��y`ph胑���߾~�Tw7�U߿�����	9o����-y���;�رs�����9b�8/�9�éi^9��m��
F�B��7��R�y�n\��J�<IJl,��q�2(�{W��b�(`��:$����Or""
@L��"�14J��_C��,���/�~��"�ޔ?EO�v-������祩�D���"R޴Or1`<˥R��`�6}��k_�:g5W����ǾJ)����r�9�j�6�Ź�'��¨]����qM=��$�oi����4�\�F��>/�o39 �(�C(�PFۓ��---m0�E*@�RX�P�V�Xˮ�]�1ض�r�'b����ЩS�T�!$JU`4����RDXz��,�FS���#�-D2��iҙW'2\��h2��"롐�0�}���ťv5�y^~���ٍR0��g!S�B��d��}qƆ���7/Lsg~�Twg��\���p꣏Wu�`��F� C���2�G�~f�]�1.}��߮<bn٠�"	c��Xt�p�3�|㋻��_����F,[�R��y`�c�*����Y\�+���?Ư�1�o�Y$�X����H������]�9Ïޚ$�)�S��l4\!c<�����BZk�{l��&y�"��q,ë_�p���+�������܅^;=ı�$�‘p�2�i%�K@!D=�Ĺ�<�w�˻�=��B��綳�7���\x?C_g���Ѓ1���+�3��E��Ǹ8�L(�Bf����Aij�k���p�\mq`g��n�9~��E�Vwf
7'W�Z35�CY6�m�0��#�0���Fes����%�r$5| ��Q��
��O`�a|b�H<Ja�6ڔ25��	� ��Y�qv�F6��}��3�	(b��3n��f9��,Ew�Bk�l��v��sZӓ��Z3�.b�C�6���"�mU��mK˕X<k[���j`T�Ȼ��D�m),ZC�X�/�HFK��,�B����/y���mP�+9�J�^�P%6R�%����+.�g�J��N��C��r���bw�å�lex���b�\�OیlW�;Q`M�pB�������ѣ�P3�RU9Pޭ���̓G.c;��c��.�?ls|���!�	;���͓��S�O��`L�,5k�Z��A"Q���R
�mq}���ӊc{�ޅ?�kB$7���4�xJHD ��f�i�KB"\��؎�^4��N����S*s��vZ)n����u��`��r���"�@J)�����C�O��<�X�[tJ�[�h�?���J(S�xyXlq+:X\���Xk|b��S����+6+y��a[z;�]ERQ��c���QP�.ޗs�^x5U� `@YFfhTk�3���	�t��1ֻ�Xo��W67�L���-�
酈��F= eF�@�js4!�"0�.�Y����7������d���XZ����j�m��7��M뀈�H%������\��Y�X�"QhŢ���]�m�ԗѧ�kS!�-�b-��Pt7Ǣ�ge�N,�+Z�8ȉ�5W��
pb��7:`	���m�Y�&s�$��S�NRm�d�l��W�:�#
�ֆP��o�r �F�o=�X~�^��è�9���mO@DT՘�FV��:]�t�}�P
Q`d��}?U��Tͅ�6��n	@ʡ�*
Y��O��E�P2����m�彑���T��?|��|Ƕ���f�$J�8N5�ٲw�
	[��""ے����ss�w��.�"��I{���R�ToC�R�@�?��W?u���/��	��
��?�bz�^�;�k�h�{���5�I��U#�Ac��³���@��d �J�a��K�(��ۯ�,o���J������x�Zˮ�r�G"r�J�������
o8IEND�B`�components/com_mailjet/images/contacts-16x16.png000060400000006440152453623460015602 0ustar00�PNG


IHDR�a
OiCCPPhotoshop ICC profilexڝSgTS�=���BK���KoR RB���&*!	J�!��Q�EEȠ�����Q,�
��!��������{�kּ�����>�����H3Q5��B������.@�
$p�d!s�#�~<<+"��x��M��0���B�\���t�8K�@z�B�@F���&S�`�cb�P-`'������{[�!�� e�Dh;��V�EX0fK�9�-0IWfH�����0Q��){`�##x��F�W<�+��*x��<�$9E�[-qWW.(�I+6aa�@.�y�2�4�������x����6��_-��"bb��ϫp@�t~�,/��;�m��%�h^�u��f�@����W�p�~<<E���������J�B[a�W}�g�_�W�l�~<�����$�2]�G�����L�ϒ	�b��G�����"�Ib�X*�Qq�D���2�"�B�)�%�d��,�>�5�j>{�-�]c�K'Xt���o��(�h���w��?�G�%�fI�q^D$.Tʳ?�D��*�A�,����`6�B$��BB
d�r`)��B(�Ͱ*`/�@4�Qh��p.�U�=p�a��(��	A�a!ڈb�X#����!�H�$ ɈQ"K�5H1R�T UH�=r9�\F��;�2����G1���Q=��C��7�F��dt1�����r�=�6��Ыhڏ>C�0��3�l0.��B�8,	�c˱"����V����cϱw�E�	6wB aAHXLXN�H� $4�	7	�Q�'"��K�&���b21�XH,#��/{�C�7$�C2'��I��T��F�nR#�,��4H#���dk�9�, +ȅ����3��!�[
�b@q��S�(R�jJ��4�e�2AU��Rݨ�T5�ZB���R�Q��4u�9̓IK�����hh�i��t�ݕN��W���G���w
��Ljg(�gw��L�Ӌ�T071���oUX*�*|��
�J�&�*/T����ުU�U�T��^S}�FU3S�	Ԗ�U��P�SSg�;���g�oT?�~Y��Y�L�OC�Q��_�� c�x,!k
��u�5�&���|v*�����=���9C3J3W�R�f?�q��tN	�(���~���)�)�4L�1e\k����X�H�Q�G�6����E�Y��A�J'\'Gg����S�Sݧ
�M=:��.�k���Dw�n��^��Lo��y��}/�T�m���GX�$��<�5qo</���QC]�@C�a�a�ᄑ��<��F�F�i�\�$�m�mƣ&&!&KM�M�RM��)�;L;L���͢�֙5�=1�2��כ߷`ZxZ,����eI��Z�Yn�Z9Y�XUZ]�F���%ֻ�����N�N���gð�ɶ�����ۮ�m�}agbg�Ů��}�}��=
���Z~s�r:V:ޚΜ�?}���/gX���3��)�i�S��Ggg�s�󈋉K��.�>.���Ƚ�Jt�q]�z�������ۯ�6�i�ܟ�4�)�Y3s���C�Q��?��0k߬~OCO�g��#/c/�W�װ��w��a�>�>r��>�<7�2�Y_�7��ȷ�O�o�_��C#�d�z����%g��A�[��z|!��?:�e����A���AA�����!h�쐭!��Α�i�P~���a�a��~'���W�?�p�X�1�5w��Cs�D�D�Dޛg1O9�-J5*>�.j<�7�4�?�.fY��X�XIlK9.*�6nl�������{�/�]py�����.,:�@L�N8��A*��%�w%�
y��g"/�6ш�C\*N�H*Mz�쑼5y$�3�,幄'���L
Lݛ:��v m2=:�1����qB�!M��g�g�fvˬe����n��/��k���Y-
�B��TZ(�*�geWf�͉�9���+��̳�ې7����ᒶ��KW-X潬j9�<qy�
�+�V�<���*m�O��W��~�&zMk�^�ʂ��k�U
�}����]OX/Yߵa���>������(�x��oʿ�ܔ���Ĺd�f�f���-�[����n
�ڴ
�V��E�/��(ۻ��C���<��e����;?T�T�T�T6��ݵa�n��{��4���[���>ɾ�UUM�f�e�I���?�����m]�Nmq����#�׹���=TR��+�G�����w-
6
U����#pDy��	�
:�v�{���vg/jB��F�S��[b[�O�>����z�G��4<YyJ�T�i��ӓg�ό���}~.��`ۢ�{�c��jo�t��E���;�;�\�t���W�W��:_m�t�<���Oǻ�����\k��z��{f���7���y���՞9=ݽ�zo�����~r'��˻�w'O�_�@�A�C݇�?[�����j�w����G�������C���ˆ
��8>99�?r��C�d�&����ˮ/~�����јѡ�򗓿m|�����������x31^�V��w�w��O�| (�h���SЧ�������c3-�bKGD�������	pHYs��~�tIME�

33�]�RIDAT8�}�Mk�U��}�{?��mn
��X�BF��"ڀt��qg����?ЩtС#�[(�?Q�5%)�M�Dͽor޽����Iݰ9���g���:F��;w���×�f�>\X��U7�?��_�Ww�x��WG���G?J�j����w>~?����4�VL٧+�����vww��,Bx��͐��JKg�W����l``���sÛ���1����!���� <8�5B�.F�	�0���Nf7��ń�^x���T�f~*xs>Q'�k�S��>Au�u�Ʃ�O�GO�;^q�6/�!J#��aq��-�ܝP�$����}n�����1LNH�K��g<P���¨.�t��تy�db�6…<�f狷��&
o�I��&<�;�=���D6��DH�NM���?�t+A�D�;H��'v"sv�pf�Y�����p��mc�'�K���h��߭���¬��ɾ_�˟|�٣�����)x�GKW������ \�u��։�ꥈv

!��E��&NL�*>A�t;쌶�⹟)w{l��Är�������e��p�823����(<媓�~���w�����'”IEND�B`�components/com_mailjet/images/stats-16x16.png000060400000001523152453623460015117 0ustar00�PNG


IHDR�asRGB���bKGD�������	pHYs��tIME�

38x����IDAT8�u�KHTa����νw|�4�8�C�$jDET�h
2]8�� d-���A�X=v�I�M.�B��Y��C��I����3k�if�f5b8���� ̊��Z�5:���u�m�KM���H2?hhlA$�:�����@pa�j��pxO֋g�H!���v�)YPp���b�Ֆ�/3@�)�KJN�Qڶ"����P�mR��耵h�&s������y��.�RB��i�i2��('�<�J�rUiM/b�7�.����b�8�
�A�&�t=1�/���Y���G�|U5�}�k�P�d���R�1�r����^q��iɏu�DJ��n=�Y̕�a̽3@�99�ɫ]s��^�TGp+dK,�X/�B,1��f�	 )^��
�bw.�o!X@R!k�]$�i&
�&Ǥ�O��w\���P��̮��׉a��7��9&��8�6.>o�k!�B���aD�)��d�A�m�� !}�I��2�I1���\��t�D�p�\����HO/���؝;?D";�&�w5�3�
��!$=��%E�h�D�'Y�>�m��oLs�4�3k�bM3#�c~���<U�"��C~<?�����s�m�J����k�������yB2C1��r�k��k��|<�i�p0ܾ)zs�0�����Ç���误/t�����iL-srV��a��޶�v�c�T�kj�B��IEND�B`�components/com_mailjet/images/campaigns-16x16.png000060400000001354152453623460015725 0ustar00�PNG


IHDR�asRGB���bKGD�������	pHYs��tIME�

3�֤�lIDAT8˅�MkUg������s�����@�F�����-(R)�w�yqЎ��L����A+���Hɠ��	�N��xO��� *�ݰF{�
{�d��U&�/�y��MYzAxW�̌:�ח��^EO�_��N��\�o!���"�4��-B�$"h����lolຆC�}A/�wm�??\�[�ν��+@BX6uE:9�������x�;�f	aXQ{w�	߶9}�$��J���Y8u�u��0Uu�ZG��3o�ێ��8lS��-�E`f�X�{b	� �q�Q���"�j�LlU�$��0ˈ"!�'��
���H	�,C)��տ�HTW�ö�g���@�5�<�Z�s��Z�yN�5�P�����j�]�eޘ,��b��<�^�i��PU�t@W��M��c|[f�v�v���j�Ǭ� O��'��?��s 0�Q�}��QL�@���Ѻ�y��R9H�ʬn���Q�ㅽ��R>�	o����@Ƚ��^}�Wq��|!"��]�%�[�Z�b�����^,���?�
��k_��&�a��E^�����5�~�問5���ߓ��̆��ϔ��v��4���qa4�}�3�(�)�]�}C�#z�tu�IEND�B`�components/com_mailjet/images/logo-48x48.png000060400000003303152453623460014731 0ustar00�PNG


IHDR00W��sRGB���bKGD�������	pHYs��tIME�

&#�`�mCIDATh��{�UW��uιs��%*S
��v��hC5���Va�BZ�m�M�G��4&���&���VQm��!�B���-��U��0�u���ǝ�L�����Nn�Ovr��Z{�}ԨQ�F�5�6�f�Ïf���&I�}��7��t���=[���EY%i�$�$�{7���(i��CH�ݽ���t]7_\��)�SR��IH��U�]�O�I��}�I�]�Tڰa}��
�q��v�e���O@��(�z�$�%��}�Yw�lwx���Խy�oq�:v�$af��̚�N�w	?��63��%Pƌ�D&I��$����K[v���P�4 2�}�O�j[�z�V͢$*�^��țG�n�8����Z�M���F�QO�Xܑ�nx�P�>z쭅��?���-v���`��{1[����K��q�ٳ��U�����A�P�UMCU��\��w��*����"�Ѻ��Vo۶���Y�6O���|�S\�g�UB'��6	l���+"3�8����~�������`p���zo0�%&U3VIy����W2�H7uJ3�z5�����Q�<e��%��$���|�����G��-[�%���<����_�]Oǃ���ԗ-u�l�\�;O�ow�a�tb���I>fA�Rj
e!���ST��̨���^R�|������8~�53��/Df��Ͼ]��S?�����(2��Z��HG�,�m����;�<Z���M���i�i��+J�E8H����Y��x8��v4�z���/���yÇ5}�{��m��CM��9�S���]��oټv���n�9����Q!�ǣh��@�PH��	��Cx�\�<˼of�����}�ӗ����~}��C;v��/�~�k��8���ԒGCD��rIe7/��]pA0<J�
u#�R7�ny�Y[?���zmjMJQ��ɗ�m6FVR�PP5JdX��b �0������T������Է.>y���P�)e�Z̆(�3).�,1�8�0�$0C��
%��8�\�1yږo]�g���D�DK_;��(6���z��.��p��27���(iF*}|e�uq���C" q�ɨt� �dȫ;ZP!��F,P��l�򯠼<߲���;�#�ڄz���I"��E2|��F~�
�	�%����W�0w!:�i3k�KF� �#�:=2�b���\�}FH�Qx<7��ɡ����@>|"*])f�"L�#i nlV�-�dJ/榵Ͽ������h wcR�l0�Q����i�����H���
f�-��P�\Vd�C��33��8�!�a7C&O��O[��+�%�z��+��i���Qᆩ���&䦴����2W�K*����)�D�BɓJw�&�M~�\Y�1��3{,7}щ��N�\�������'0��)�
7��q<,ͷ�o��/�-��S�~�LӇ[��q^.���-�+��W��8���qv̜7�畕�����s
��5P�˺X��{�&��h?�5f�={�f1��Y�3;v_/_�UB�?��#-V_?������g�Q�F�5j�z�
��T~ҼIEND�B`�components/com_xmap/tables/index.html000060400000000036152453623460014010 0ustar00<!DOCTYPE html><title></title>components/com_xmap/tables/sitemap.php000060400000014415152453623460014174 0ustar00<?php
/**
 * @version       $Id$
 * @copyright     Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
 * @license       GNU General Public License version 2 or later; see LICENSE.txt
 * @author        Guillermo Vargas (guille@vargas.co.cr)
 */
// no direct access
defined('_JEXEC') or die;

/**
 * @package         Xmap
 * @subpackage      com_xmap
 * @since           2.0
 */
class XmapTableSitemap extends JTable
{

    /**
     * @var int Primary key
     */
    var $id = null;
    /**
     * @var string
     */
    var $title = null;
    /**
     * @var string
     */
    var $alias = null;
    /**
     * @var string
     */
    var $introtext = null;
    /**
     * @var string
     */
    var $metakey = null;
    /**
     * @var string
     */
    var $attribs = null;
    /**
     * @var string
     */
    var $selections = null;
    /**
     * @var string
     */
    var $created = null;
    /**
     * @var string
     */
    var $metadesc = null;
    /**
     * @var string
     */
    var $excluded_items = null;
    /**
     * @var int
     */
    var $is_default = 0;
    /**
     * @var int
     */
    var $state = 0;
    /**
     * @var int
     */
    var $access = 0;
    /**
     * @var int
     */
    var $count_xml = 0;
    /**
     * @var int
     */
    var $count_html = 0;
    /**
     * @var int
     */
    var $views_xml = 0;
    /**
     * @var int
     */
    var $views_html = 0;
    /**
     * @var int
     */
    var $lastvisit_xml = 0;
    /**
     * @var int
     */
    var $lastvisit_html = 0;

    /**
     * @param    JDatabase    A database connector object
     */
    function __construct(&$db)
    {
        parent::__construct('#__xmap_sitemap', 'id', $db);
    }

    /**
     * Overloaded bind function
     *
     * @access      public
     * @param       array $hash named array
     * @return      null|string  null is operation was satisfactory, otherwise returns an error
     * @see         JTable:bind
     * @since       2.0
     */
    function bind($array, $ignore = '')
    {
        if (isset($array['attribs']) && is_array($array['attribs'])) {
            $registry = new JRegistry();
            $registry->loadArray($array['attribs']);
            $array['attribs'] = $registry->toString();
        }

        if (isset($array['selections']) && is_array($array['selections'])) {
            $selections = array();
            foreach ($array['selections'] as $i => $menu) {
                $selections[$menu] = array(
                    'priority' => $array['selections_priority'][$i],
                    'changefreq' => $array['selections_changefreq'][$i],
                    'ordering' => $i
                );
            }

            $registry = new JRegistry();
            $registry->loadArray($selections);
            $array['selections'] = $registry->toString();
        }

        if (isset($array['metadata']) && is_array($array['metadata'])) {
            $registry = new JRegistry();
            $registry->loadArray($array['metadata']);
            $array['metadata'] = $registry->toString();
        }

        return parent::bind($array, $ignore);
    }

    /**
     * Overloaded check function
     *
     * @access      public
     * @return      boolean
     * @see         JTable::check
     * @since       2.0
     */
    function check()
    {

        if (empty($this->title)) {
            $this->setError(JText::_('Sitemap must have a title'));
            return false;
        }

        if (empty($this->alias)) {
            $this->alias = $this->title;
        }
        $this->alias = JApplication::stringURLSafe($this->alias);

        if (trim(str_replace('-', '', $this->alias)) == '') {
            $datenow = &JFactory::getDate();
            $this->alias = $datenow->format("Y-m-d-H-i-s");
        }

        return true;
    }

    /**
     * Overriden JTable::store to set modified data and user id.
     *
     * @param       boolean True to update fields even if they are null.
     * @return      boolean True on success.
     * @since       2.0
     */
    public function store($updateNulls = false)
    {
        $date = JFactory::getDate();
        if (!$this->id) {
            $this->created = $date->toSql();
        }
        return parent::store($updateNulls);
    }

    /**
     * Method to set the publishing state for a row or list of rows in the database
     * table.
     *
     * @param       mixed   An optional array of primary key values to update.  If not
     *                      set the instance property value is used.
     * @param       integer The publishing state. eg. [0 = unpublished, 1 = published]
     * @param       integer The user id of the user performing the operation.
     * @return      boolean True on success.
     * @since       2.0
     */
    public function publish($pks = null, $state = 1, $userId = 0)
    {
        // Initialize variables.
        $k = $this->_tbl_key;

        // Sanitize input.
        JArrayHelper::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::_('No_Rows_Selected'));
                return false;
            }
        }

        // Build the WHERE clause for the primary keys.
        $where = $k . '=' . implode(' OR ' . $k . '=', $pks);


        // Update the publishing state for rows with the given primary keys.
        $query =  $this->_db->getQuery(true)
                       ->update($this->_db->quoteName('#__xmap_sitemap'))
                       ->set($this->_db->quoteName('state').' = '. (int) $state)
                       ->where($where);

        $this->_db->setQuery($query);
        $this->_db->query();

        // Check for a database error.
        if ($this->_db->getErrorNum()) {
            $this->setError($this->_db->getErrorMsg());
            return false;
        }

        // 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;
    }

}
components/com_xmap/LICENSE.txt000060400000042630152453623460012372 0ustar00GNU GENERAL PUBLIC LICENSE
				Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
 59 Temple Place, Suite 330, Boston, MA  02111-1307  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 Library 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.

	<one line to give the program's name and a brief idea of what it does.>
	Copyright (C) <year>  <name of author>

	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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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.

  <signature of Ty Coon>, 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 Library General
Public License instead of this License.
components/com_xmap/helpers/html/index.html000060400000000036152453623460015144 0ustar00<!DOCTYPE html><title></title>components/com_xmap/helpers/html/xmap.php000060400000003061152453623460014626 0ustar00<?php
/**
 * @version     $Id$
 * @copyright   Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 * @author      Guillermo Vargas (guille@vargas.co.cr)
 */

// no direct access
defined('_JEXEC') or die;

JTable::addIncludePath( JPATH_COMPONENT . '/tables' );

/**
 * @package       Xmap
 * @subpackage    com_xmap
 */
abstract class JHtmlXmap
{

    /**
     * @param    string  $name
     * @param    string  $value
     * @param    int     $j
     */
    public static function priorities($name, $value = '0.5', $j)
    {
        // Array of options
        for ($i=0.1; $i<=1;$i+=0.1) {
            $options[] = JHTML::_('select.option',$i,$i);;
        }
        return JHtml::_('select.genericlist', $options, $name, null, 'value', 'text', $value, $name.$j);
    }

    /**
     * @param    string  $name
     * @param    string  $value
     * @param    int     $j
     */
    public static function changefrequency($name, $value = 'weekly', $j)
    {
        // Array of options
        $options[] = JHTML::_('select.option','hourly','hourly');
        $options[] = JHTML::_('select.option','daily','daily');
        $options[] = JHTML::_('select.option','weekly','weekly');
        $options[] = JHTML::_('select.option','monthly','monthly');
        $options[] = JHTML::_('select.option','yearly','yearly');
        $options[] = JHTML::_('select.option','never','never');
        return JHtml::_('select.genericlist', $options, $name, null, 'value', 'text', $value, $name.$j);
    }

}
components/com_xmap/helpers/index.html000060400000000036152453623460014200 0ustar00<!DOCTYPE html><title></title>components/com_xmap/helpers/xmap.php000060400000002751152453623460013667 0ustar00<?php
/**
 * @version     $Id$
 * @copyright   Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 * @author      Guillermo Vargas (guille@vargas.co.cr)
 */


// No direct access
defined('_JEXEC') or die;

/**
 * Xmap component helper.
 *
 * @package     Xmap
 * @subpackage  com_xmap
 * @since       2.0
 */
class XmapHelper
{
    /**
     * Configure the Linkbar.
     *
     * @param    string  The name of the active view.
     */
    public static function addSubmenu($vName)
    {
        $version = new JVersion;

        if (version_compare($version->getShortVersion(), '3.0.0', '<')) {
            JSubMenuHelper::addEntry(
                JText::_('Xmap_Submenu_Sitemaps'),
                'index.php?option=com_xmap',
                $vName == 'sitemaps'
            );
            JSubMenuHelper::addEntry(
                JText::_('Xmap_Submenu_Extensions'),
                'index.php?option=com_plugins&view=plugins&filter_folder=xmap',
                $vName == 'extensions');
        } else {
            JHtmlSidebar::addEntry(
                JText::_('Xmap_Submenu_Sitemaps'),
                'index.php?option=com_xmap',
                $vName == 'sitemaps'
            );
            JHtmlSidebar::addEntry(
                JText::_('Xmap_Submenu_Extensions'),
                'index.php?option=com_plugins&view=plugins&filter_folder=xmap',
                $vName == 'extensions');
        }
    }
}
components/com_xmap/controllers/sitemaps.php000060400000004110152453623460015442 0ustar00<?php
/**
 * @version     $Id$
 * @copyright   Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 * @author      Guillermo Vargas (guille@vargas.co.cr)
 */

// no direct access
defined('_JEXEC') or die;

jimport('joomla.application.component.controlleradmin');

/**
 * @package     Xmap
 * @subpackage  com_xmap
 * @since       2.0
 */
class XmapControllerSitemaps extends JControllerAdmin
{

    protected $text_prefix = 'COM_XMAP_SITEMAPS';

    /**
     * Constructor
     */
    public function __construct($config = array())
    {
        parent::__construct($config);

        $this->registerTask('unpublish',    'publish');
        $this->registerTask('trash',        'publish');
        $this->registerTask('unfeatured',   'featured');
    }


    /**
     * Method to toggle the default sitemap.
     *
     * @return      void
     * @since       2.0
     */
    function setDefault()
    {
        // Check for request forgeries
        JRequest::checkToken() or die('Invalid Token');

        // Get items to publish from the request.
        $cid = JRequest::getVar('cid', 0, '', 'array');
        $id  = @$cid[0];

        if (!$id) {
            JError::raiseWarning(500, JText::_('Select an item to set as default'));
        }
        else
        {
            // Get the model.
            $model = $this->getModel();

            // Publish the items.
            if (!$model->setDefault($id)) {
                JError::raiseWarning(500, $model->getError());
            }
        }

        $this->setRedirect('index.php?option=com_xmap&view=sitemaps');
    }

    /**
     * Proxy for getModel.
     *
     * @param    string    $name    The name of the model.
     * @param    string    $prefix    The prefix for the PHP class name.
     *
     * @return    JModel
     * @since    2.0
     */
    public function getModel($name = 'Sitemap', $prefix = 'XmapModel', $config = array('ignore_request' => true))
    {
        $model = parent::getModel($name, $prefix, $config);

        return $model;
    }
}components/com_xmap/controllers/sitemap.php000060400000002053152453623460015263 0ustar00<?php
/**
 * @version     $Id$
 * @copyright   Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 * @author      Guillermo Vargas (guille@vargas.co.cr)
 */

// No direct access
defined('_JEXEC') or die;

jimport('joomla.application.component.controllerform');

/**
 * @package     Xmap
 * @subpackage  com_xmap
 * @since       2.0
 */
class XmapControllerSitemap extends JControllerForm
{
    /**
     * Method override to check if the user can edit an existing record.
     *
     * @param    array    An array of input data.
     * @param    string   The name of the key for the primary key.
     *
     * @return   boolean
     */
    protected function _allowEdit($data = array(), $key = 'id')
    {
        // Initialise variables.
        $recordId = (int) isset($data[$key]) ? $data[$key] : 0;

        // Assets are being tracked, so no need to look into the category.
        return JFactory::getUser()->authorise('core.edit', 'com_xmap.sitemap.'.$recordId);
    }
}components/com_xmap/controllers/index.html000060400000000036152453623460015104 0ustar00<!DOCTYPE html><title></title>components/com_xmap/install/install.utf8.sql000060400000002164152453623460015267 0ustar00CREATE TABLE IF NOT EXISTS `#__xmap_sitemap` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT NULL,
  `alias` varchar(255) DEFAULT NULL,
  `introtext` text DEFAULT NULL,
  `metadesc` text DEFAULT NULL,
  `metakey` text DEFAULT NULL,
  `attribs` text DEFAULT NULL,
  `selections` text DEFAULT NULL,
  `excluded_items` text DEFAULT NULL,
  `is_default` int(1) DEFAULT 0,
  `state` int(2) DEFAULT NULL,
  `access` int DEFAULT NULL,
  `created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `count_xml` int(11) DEFAULT NULL,
  `count_html` int(11) DEFAULT NULL,
  `views_xml` int(11) DEFAULT NULL,
  `views_html` int(11) DEFAULT NULL,
  `lastvisit_xml` int(11) DEFAULT NULL,
  `lastvisit_html` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `#__xmap_items` (
  `uid` varchar(100) NOT NULL,
  `itemid` int(11) NOT NULL,
  `view` varchar(10) NOT NULL,
  `sitemap_id` int(11) NOT NULL,
  `properties` varchar(300) DEFAULT NULL,
  PRIMARY KEY (`uid`,`itemid`,`view`,`sitemap_id`),
  KEY `uid` (`uid`,`itemid`),
  KEY `view` (`view`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8components/com_xmap/install/uninstall.utf8.sql000060400000000071152453623460015625 0ustar00drop table `#__xmap_items`;
drop table `#__xmap_sitemap`;components/com_xmap/install/uninstall.postgresql.sql000060400000000071152453623460017142 0ustar00drop table "#__xmap_items";
drop table "#__xmap_sitemap";components/com_xmap/install/install.postgresql.sql000060400000002253152453623460016603 0ustar00CREATE TABLE "#__xmap_sitemap" (
  "id" serial NOT NULL,
  "title" character varying(255) DEFAULT NULL,
  "alias" character varying(255) DEFAULT NULL,
  "introtext" text DEFAULT NULL,
  "metadesc" text DEFAULT NULL,
  "metakey" text DEFAULT NULL,
  "attribs" text DEFAULT NULL,
  "selections" text DEFAULT NULL,
  "excluded_items" text DEFAULT NULL,
  "is_default" integer DEFAULT 0,
  "state" integer DEFAULT NULL,
  "access" integer DEFAULT NULL,
  "created" timestamp without time zone DEFAULT '1970-01-01 00:00:00' NOT NULL,
  "count_xml" integer DEFAULT NULL,
  "count_html" integer DEFAULT NULL,
  "views_xml" integer DEFAULT NULL,
  "views_html" integer DEFAULT NULL,
  "lastvisit_xml" integer DEFAULT NULL,
  "lastvisit_html" integer DEFAULT NULL,
  PRIMARY KEY ("id")
);

CREATE TABLE "#__xmap_items" (
  "uid" character varying(100) NOT NULL,
  "itemid" integer NOT NULL,
  "view" character varying(10) NOT NULL,
  "sitemap_id" integer NOT NULL,
  "properties" varchar(300) DEFAULT NULL,
  PRIMARY KEY ("uid","itemid","view","sitemap_id")
);

CREATE INDEX "#__xmap_items_idx_uid" on "#__xmap_items" ("uid", "itemid");
CREATE INDEX "#__xmap_items_idx_view" on "#__xmap_items" ("view");
components/com_xmap/install/index.html000060400000000036152453623460014204 0ustar00<!DOCTYPE html><title></title>components/com_xmap/models/sitemap.php000060400000017172152453623460014210 0ustar00<?php
/**
 * @version      $Id$
 * @copyright    Copyright (C) 2005 - 2010 Open Source Matters, Inc. All rights reserved.
 * @license      GNU General Public License version 2 or later; see LICENSE.txt
 */

// No direct access
defined('_JEXEC') or die;

jimport('joomla.application.component.modeladmin');

/**
 * Sitemap model.
 *
 * @package       Xmap
 * @subpackage    com_xmap
 */
class XmapModelSitemap extends JModelAdmin
{
    protected $_context = 'com_xmap';

    /**
     * Constructor.
     *
     * @param    array An optional associative array of configuration settings.
     * @see      JController
     */
    public function __construct($config = array())
    {
        parent::__construct($config);

        $this->_item = 'sitemap';
        $this->_option = 'com_xmap';
    }

    /**
     * Method to auto-populate the model state.
     */
    protected function _populateState()
    {
        $app = JFactory::getApplication('administrator');

        // Load the User state.
        if (!($pk = (int) $app->getUserState('com_xmap.edit.sitemap.id'))) {
            $pk = (int) JRequest::getInt('id');
        }
        $this->setState('sitemap.id', $pk);

        // Load the parameters.
        $params    = JComponentHelper::getParams('com_xmap');
        $this->setState('params', $params);
    }

    /**
     * Returns a Table object, always creating it.
     *
     * @param    type                The table type to instantiate
     * @param    string              A prefix for the table class name. Optional.
     * @param    array               Configuration array for model. Optional.
     * @return   XmapTableSitemap    A database object
    */
    public function getTable($type = 'Sitemap', $prefix = 'XmapTable', $config = array())
    {
        return JTable::getInstance($type, $prefix, $config);
    }

    /**
     * Method to get a single record.
     *
     * @param    integer    The id of the primary key.
     *
     * @return   mixed      Object on success, false on failure.
     */
    public function getItem($pk = null)
    {
        // Initialise variables.
        $pk = (!empty($pk)) ? $pk : (int)$this->getState('sitemap.id');
        $false = false;

        // Get a row instance.
        $table = $this->getTable();

        // Attempt to load the row.
        $return = $table->load($pk);

        // Check for a table object error.
        if ($return === false && $table->getError()) {
            $this->setError($table->getError());
            return $false;
        }

        // Prime required properties.
        if (empty($table->id))
        {
            // Prepare data for a new record.
        }

        // Convert to the JObject before adding other data.
        $value = $table->getProperties(1);
        $value = JArrayHelper::toObject($value, 'JObject');

        // Convert the params field to an array.
        $registry = new JRegistry;
        $registry->loadString($table->attribs);
        $value->attribs = $registry->toArray();

        return $value;
    }

    /**
     * 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   mixed                   A JForm object on success, false on failure
     * @since    2.0
     */
    public function getForm($data = array(), $loadData = true)
    {
        // Get the form.
        $form = $this->loadForm('com_xmap.sitemap', 'sitemap', 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_xmap.edit.sitemap.data', array());

        if (empty($data)) {
            $data = $this->getItem();
        }

        return $data;
    }


    /**
     * Method to save the form data.
     *
     * @param    array    The form data.
     * @return    boolean    True on success.
     * @since    1.6
     */
    public function save($data)
    {
        // Initialise variables;
        $dispatcher = JDispatcher::getInstance();
        $table      = $this->getTable();
        $pk         = (!empty($data['id'])) ? $data['id'] : (int)$this->getState('sitemap.id');
        $isNew      = true;

        // Load the row if saving an existing record.
        if ($pk > 0) {
            $table->load($pk);
            $isNew = false;
        }

        // Bind the data.
        if (!$table->bind($data)) {
            $this->setError(JText::sprintf('JERROR_TABLE_BIND_FAILED', $table->getError()));
            return false;
        }

        // Prepare the row for saving
        $this->_prepareTable($table);

        // Check the data.
        if (!$table->check()) {
            $this->setError($table->getError());
            return false;
        }

        if (!$table->is_default) {
            // Check if there is no default sitemap. Then, set it as default if not
            $result = $this->getDefaultSitemapId();
            if (!$result) {
                $table->is_default=1;
            }
        }

        // Store the data.
        if (!$table->store()) {
            $this->setError($table->getError());
            return false;
        }

        if ($table->is_default) {
            $query =  $this->_db->getQuery(true)
                           ->update($this->_db->quoteName('#__xmap_sitemap'))
                           ->set($this->_db->quoteName('is_default').' = 0')
                           ->where($this->_db->quoteName('id').' <> '.$table->id);

            $this->_db->setQuery($query);
            if (!$this->_db->query()) {
                $this->setError($table->_db->getErrorMsg());
                return false;
            }
        }

        // Clean the cache.
        $cache = JFactory::getCache('com_xmap');
        $cache->clean();

        $this->setState('sitemap.id', $table->id);

        return true;
    }

    /**
     * Prepare and sanitise the table prior to saving.
     */
    protected function _prepareTable(&$table)
    {
        // TODO.
    }

    function _orderConditions($table = null)
    {
        $condition = array();
        return $condition;
    }

    function setDefault($id)
    {
        $table = $this->getTable();
        if ($table->load($id)) {
            $db = JFactory::getDbo();
            $query = $db->getQuery(true)
                        ->update($db->quoteName('#__xmap_sitemap'))
                        ->set($db->quoteName('is_default').' = 0')
                        ->where($db->quoteName('id').' <> '.$table->id);
            $this->_db->setQuery($query);
            if (!$this->_db->query()) {
                $this->setError($table->_db->getErrorMsg());
                return false;
            }
            $table->is_default = 1;
            $table->store();

            // Clean the cache.
            $cache = JFactory::getCache('com_xmap');
            $cache->clean();
            return true;
        }
    }

    /**
     * Override to avoid warnings
     *
     */
    public function checkout($pk = null)
    {
        return true;
    }

    private function getDefaultSitemapId()
    {
        $db = JFactory::getDBO();
        $query  = $db->getQuery(true);
        $query->select('id');
        $query->from($db->quoteName('#__xmap_sitemap'));
        $query->where('is_default=1');
        $db->setQuery($query);
        return $db->loadResult();
    }
}components/com_xmap/models/fields/xmapmenus.php000060400000014304152453623460016023 0ustar00<?php
/**
 * @version          $Id$
 * @copyright        Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
 * @license          GNU General Public License version 2 or later; see LICENSE.txt
 * @author           Guillermo Vargas (guille@vargas.co.cr)
 */
defined('_JEXEC') or die;

jimport('joomla.html.html');
require_once JPATH_LIBRARIES . '/joomla/form/fields/list.php';

/**
 * Menus Form Field class for the Xmap Component
 *
 * @package      Xmap
 * @subpackage   com_xmap
 * @since        2.0
 */
class JFormFieldXmapmenus extends JFormFieldList
{

    /**
     * The field type.
     *
     * @var      string
     */
    public $type = 'Xmapmenus';

    /**
     * Method to get a list of options for a list input.
     *
     * @return   array        An array of JHtml options.
     */
    protected function _getOptions()
    {
        $db = JFactory::getDbo();
        $query = $db->getQuery(true);

        //$currentMenus = array_keys(get_object_vars($this->value));
        $currentMenus = array();

        $query->select('menutype As value, title As text');
        $query->from('#__menu_types AS a');
        $query->order('a.title');

        // Get the options.
        $db->setQuery($query);
        // echo $db->getQuery();
        $menus = $db->loadObjectList('value');
        $options = array();

        // Add the current sitemap menus in the defined order to the list
        foreach ($currentMenus as $menutype) {
            if (!empty($menus[$menutype])) {
                $options[] = $menus[$menutype];
            }
        }

        // Add the rest of the menus to the list (if any)
        foreach ($menus as $menutype => $menu) {
            if (!in_array($menutype, $currentMenus)) {
                $options[] = $menu;
            }
        }

        // Check for a database error.
        if ($db->getErrorNum()) {
            JError::raiseWarning(500, $db->getErrorMsg());
        }

        $options = array_merge(
                       parent::getOptions(),
                       $options
        );
        return $options;
    }

    /**
     * Method to get the field input.
     *
     * @return      string      The field input.
     */
    protected function getInput()
    {
        $disabled = $this->element['disabled'] == 'true' ? true : false;
        $readonly = $this->element['readonly'] == 'true' ? true : false;
        $attributes = ' ';

        $type = 'radio';
        if ($v = $this->element['size']) {
            $attributes .= 'size="' . $v . '" ';
        }
        if ($v = $this->element['class']) {
            $attributes .= 'class="' . $v . '" ';
        } else {
            $attributes .= 'class="inputbox" ';
        }
        if ($m = $this->element['multiple']) {
            $type = 'checkbox';
        }

        $value = $this->value;
        if (!is_array($value)) {
            // Convert the selections field to an array.
            $registry = new JRegistry;
            $registry->loadString($value);
            $value = $registry->toArray();
        }

        $doc = JFactory::getDocument();
        $doc->addScriptDeclaration("
        window.addEvent('domready',function(){
            \$\$('div.xmap-menu-options select').addEvent('mouseover',function(event){xmapMenusSortable.detach();})
            \$\$('div.xmap-menu-options select').addEvent('mouseout',function(event){xmapMenusSortable.attach();})
            var xmapMenusSortable = new Sortables(\$('ul_" . $this->inputId . "'),{
                clone:true,
                revert: true,
                preventDefault: true,
                onStart: function(el) {
                    el.setStyle('background','#bbb');
                },
                onComplete: function(el) {
                    el.setStyle('background','#eee');
                }
            });
        });");

        if ($disabled || $readonly) {
            $attributes .= 'disabled="disabled"';
        }
        $options = (array) $this->_getOptions();
        $return = '<ul id="ul_' . $this->inputId . '" class="ul_sortable">';

        // Create a regular list.
        $i = 0;

        //Lets show the enabled menus first
        $this->currentItems = array_keys($value);
        // Sort the menu options
        uasort($options, array($this, 'myCompare'));

        foreach ($options as $option) {
            $prioritiesName = preg_replace('/(jform\[[^\]]+)(\].*)/', '$1_priority$2', $this->name);
            $changefreqName = preg_replace('/(jform\[[^\]]+)(\].*)/', '$1_changefreq$2', $this->name);
            $selected = (isset($value[$option->value]) ? ' checked="checked"' : '');
            $i++;
            $return .= '<li id="menu_' . $i . '">';
            $return .= '<input type="' . $type . '" id="' . $this->id . '_' . $i . '" name="' . $this->name . '" value="' . $option->value . '"' . $attributes . $selected . ' />';
            $return .= '<label for="' . $this->id . '_' . $i . '" class="menu_label">' . $option->text . '</label>';
            $return .= '<div class="xmap-menu-options" id="menu_options_' . $i . '">';
            $return .= '<label class="control-label">' . JText::_('XMAP_PRIORITY') . '</label>';
            $return .= '<div class="controls">' . JHTML::_('xmap.priorities', $prioritiesName, ($selected ? $value[$option->value]['priority'] : '0.5'), $i) . '</div>';
            $return .= '<label class="control-label">' . JText::_('XMAP_CHANGE_FREQUENCY') . '</label>';
            $return .= '<div class="controls">' . JHTML::_('xmap.changefrequency', $changefreqName, ($selected ? $value[$option->value]['changefreq'] : 'weekly'), $i) . '</div>';
            $return .= '</div>';
            $return .= '</li>';
        }
        $return .= "</ul>";
        return $return;
    }

    public function myCompare($a, $b) {
        $indexA = array_search($a->value, $this->currentItems);
        $indexB = array_search($b->value, $this->currentItems);
        if ($indexA === $indexB && $indexA !== false) {
            return 0;
        }
        if ($indexA === false && $indexA === $indexB) {
            return ($a->value < $b->value) ? -1 : 1;
        }

        if ($indexA === false) {
            return 1;
        }
        if ($indexB === false) {
            return -1;
        }

        return ($indexA < $indexB) ? -1 : 1;
    }

}
components/com_xmap/models/fields/modal/sitemaps.php000060400000006102152453623460016724 0ustar00<?php
/**
 * @version          $Id$
 * @copyright        Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
 * @license          GNU General Public License version 2 or later; see LICENSE.txt
 * @author           Guillermo Vargas (guille@vargas.co.cr)
 */
defined('_JEXEC') or die;

jimport('joomla.form.field');

/**
 * Supports a modal sitemap picker.
 *
 * @package             Xmap
 * @subpackage          com_xmap
 * @since               2.0
 */
class JFormFieldModal_Sitemaps extends JFormField
{

    /**
     * The field type.
     *
     * @var    string
     */
    protected $type = 'Modal_Sitemaps';

    /**
     * Method to get a list of options for a sitemaps list input.
     *
     * @return    array        An array of JHtml options.
     */
    protected function getInput()
    {
        // Initialise variables.
        $db  = JFactory::getDBO();
        $doc = JFactory::getDocument();

        // Load the modal behavior.
        JHtml::_('behavior.modal', 'a.modal');

        // Get the title of the linked chart
        if ($this->value) {
            $db->setQuery(
                    'SELECT title' .
                    ' FROM #__xmap_sitemap' .
                    ' WHERE id = ' . (int) $this->value
            );
            $title = $db->loadResult();

            if ($error = $db->getErrorMsg()) {
                JError::raiseWarning(500, $error);
            }
        } else {
            $title = '';
        }

        if (empty($title)) {
            $title = JText::_('COM_XMAP_SELECT_AN_SITEMAP');
        }

        $doc->addScriptDeclaration(
                  "function jSelectSitemap_" . $this->id . "(id, title, object) {
                       $('" . $this->id . "_id').value = id;
                       $('" . $this->id . "_name').value = title;
                       SqueezeBox.close();
                  }"
        );

        $link = 'index.php?option=com_xmap&amp;view=sitemaps&amp;layout=modal&amp;tmpl=component&amp;function=jSelectSitemap_' . $this->id;

        JHTML::_('behavior.modal', 'a.modal');
        $html = '<span class="input-append">';
        $html .= "\n" . '<input class="input-medium" type="text" id="' . $this->id . '_name" value="' . htmlspecialchars($title, ENT_QUOTES, 'UTF-8') . '" disabled="disabled" />';
        if(version_compare(JVERSION,'3.0.0','ge'))
            $html .= '<a class="modal btn" title="' . JText::_('COM_XMAP_CHANGE_SITEMAP') . '"  href="' . $link . '" rel="{handler: \'iframe\', size: {x: 800, y: 450}}"><i class="icon-file"></i> ' . JText::_('COM_XMAP_CHANGE_SITEMAP_BUTTON') . '</a>' . "\n";
        else
            $html .= '<div class="button2-left"><div class="blank"><a class="modal btn" title="' . JText::_('COM_XMAP_CHANGE_SITEMAP') . '"  href="' . $link . '" rel="{handler: \'iframe\', size: {x: 800, y: 450}}"><i class="icon-file"></i> ' . JText::_('COM_XMAP_CHANGE_SITEMAP_BUTTON') . '</a></div></div>' . "\n";
        $html .= '</span>';
        $html .= "\n" . '<input type="hidden" id="' . $this->id . '_id" name="' . $this->name . '" value="' . (int) $this->value . '" />';
        return $html;
    }

}components/com_xmap/models/fields/modal/index.html000060400000000036152453623460016363 0ustar00<!DOCTYPE html><title></title>components/com_xmap/models/fields/index.html000060400000000036152453623460015267 0ustar00<!DOCTYPE html><title></title>components/com_xmap/models/sitemaps.php000060400000013570152453623460014371 0ustar00<?php
/**
 * @version       $Id$
 * @copyright     Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
 * @license       GNU General Public License version 2 or later; see LICENSE.txt
 * @author        Guillermo Vargas (guille@vargas.co.cr)
 */
// no direct access
defined('_JEXEC') or die;

jimport('joomla.application.component.modellist');
jimport('joomla.database.query');

/**
 * Sitemaps Model Class
 *
 * @package         Xmap
 * @subpackage      com_xmap
 * @since           2.0
 */
class XmapModelSitemaps extends JModelList
{
    /**
     * Constructor.
     *
     * @param    array    An optional associative array of configuration settings.
     * @see      JController
     * @since    1.6
     */
    public function __construct($config = array())
    {
        if (empty($config['filter_fields'])) {
            $config['filter_fields'] = array(
                'id', 'a.id',
                'title', 'a.title',
                'alias', 'a.alias',
                'checked_out', 'a.checked_out',
                'checked_out_time', 'a.checked_out_time',
                'catid', 'a.catid', 'category_title',
                'state', 'a.state',
                'access', 'a.access', 'access_level',
                'created', 'a.created',
                'created_by', 'a.created_by',
                'ordering', 'a.ordering',
                'featured', 'a.featured',
                'language', 'a.language',
                'hits', 'a.hits',
                'publish_up', 'a.publish_up',
                'publish_down', 'a.publish_down',
            );
        }

        parent::__construct($config);
    }

    /**
     * Method to auto-populate the model state.
     *
     * @since       2.0
     */
    protected function populateState($ordering = null, $direction = null)
    {
        // Adjust the context to support modal layouts.
        if ($layout = JRequest::getVar('layout')) {
            $this->context .= '.'.$layout;
        }

        $access = $this->getUserStateFromRequest($this->context.'.filter.access', 'filter_access', 0, 'int');
        $this->setState('filter.access', $access);

        $published = $this->getUserStateFromRequest($this->context.'.filter.published', 'filter_published', '');
        $this->setState('filter.published', $published);

        $search = $this->getUserStateFromRequest($this->context.'.filter.search', 'filter_search');
        $this->setState('filter.search', $search);

        // List state information.
        parent::populateState('a.title', 'asc');
    }

    /**
     * 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.access');
        $id .= ':'.$this->getState('filter.published');

        return parent::getStoreId($id);
    }

    /**
     * @param       boolean True to join selected foreign information
     *
     * @return      string
     */
    protected function getListQuery($resolveFKs = true)
    {
        $db     = $this->getDbo();
        // Create a new query object.
        $query = $db->getQuery(true);

        // Select the required fields from the table.
        $query->select(
                $this->getState(
                          'list.select',
                          'a.*')
        );
        $query->from('#__xmap_sitemap AS a');

        // Join over the asset groups.
        $query->select('ag.title AS access_level');
        $query->join('LEFT', '#__viewlevels AS ag ON ag.id = a.access');

        // Filter by access level.
        if ($access = $this->getState('filter.access')) {
            $query->where('a.access = ' . (int) $access);
        }

        // Filter by published state
        $published = $this->getState('filter.published');
        if (is_numeric($published)) {
            $query->where('a.state = ' . (int) $published);
        } else if ($published === '') {
            $query->where('(a.state = 0 OR a.state = 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('%'.$db->escape($search, true).'%');
                $query->where('(a.title LIKE '.$search.' OR a.alias LIKE '.$search.')');
            }
        }

        // Add the list ordering clause.
        $query->order($db->escape($this->state->get('list.ordering', 'a.title')) . ' ' . $db->escape($this->state->get('list.direction', 'ASC')));
        //echo nl2br(str_replace('#__','jos_',$query));
        return $query;
    }

    public function getExtensionsMessage()
    {
        $db    = $this->getDbo();
        $query = $db->getQuery(true);
        $query->select('e.*');
        $query->from($db->quoteName('#__extensions'). 'AS e');
        $query->join('INNER', '#__extensions AS p ON e.element=p.element and p.enabled=0 and p.type=\'plugin\' and p.folder=\'xmap\'');
        $query->where('e.type=\'component\' and e.enabled=1');

        $db->setQuery($query);
        $extensions = $db->loadObjectList();
        if ( count($extensions) ) {
            $sep = $extensionsNameList = '';
            foreach ($extensions as $extension) {
                $extensionsNameList .= "$sep$extension->element";
                $sep = ', ';
            }

            return JText::sprintf('XMAP_MESSAGE_EXTENSIONS_DISABLED',$extensionsNameList);
        } else {
            return "";
        }
    }

}
components/com_xmap/models/forms/sitemap.xml000060400000023173152453623460015345 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!-- $Id$ -->
<form>
    <fields addpath="administrator/components/com_xmap/elements">
        <field
            id="id"
            name="id"
            type="hidden"
            label="XMAP_ID_LABEL"
            size="10"
            default="0"
            required="true"
            readonly="true"/>

        <field
            id="title"
            name="title"
            type="text"
            label="JGLOBAL_TITLE"
            description="JFIELD_TITLE_DESC"
            class="inputbox input-xlarge"
            labelclass="control-label"
            size="30"
            required="true" />

        <field
            id="alias"
            name="alias"
            type="text"
            label="JFIELD_ALIAS_LABEL"
            description="JFIELD_ALIAS_DESC"
            class="inputbox"
            labelclass="control-label"
            size="30"
            default=""/>

        <field
            id="introtext"
            name="introtext"
            type="editor"
            class="inputbox"
            labelclass="control-label"
            label="XMAP_INTROTEXT_LABEL"
            description="XMAP_INTROTEXT_DESC"
            filter="safehtml"
            default=""/>

        <field
            id="is_default"
            name="is_default"
            type="hidden"
            class="inputbox"
            size="1"
            default="0" />

        <field
            id="state"
            name="state"
            type="list"
            label="JSTATUS"
            description="JFIELD_PUBLISHED_DESC"
            class="inputbox"
            labelclass="control-label"
            size="1"
            default="1">
            <option
                value="1">
                JPUBLISHED</option>
            <option
                value="0">
                JUNPUBLISHED</option>
        </field>

        <field
            id="created"
            name="created"
            type="calendar"
            label="XMAP_CREATED_LABEL"
            description="XMAP_CREATED_DESC"
            class="inputbox"
            labelclass="control-label"
            size="16"
            format="%Y-%m-%d %H-%M-%S" />

        <field
            id="access"
            name="access"
            type="accesslevel"
            label="JFIELD_ACCESS_LABEL"
            description="JFIELD_ACCESS_DESC"
            class="inputbox"
            labelclass="control-label"
            size="1" />

        <field
            id="count_html"
            name="hits"
            type="text"
            label="XMAP_HITSHTML_LABEL"
            description="XMAP_HITS_DESC"
            class="readonly"
            labelclass="control-label"
            size="6"
            readonly="true"
            filter="unset"/>

        <field
            id="count_xml"
            name="hits"
            type="text"
            label="XMAP_HITSXML_LABEL"
            description="XMAP_HITS_DESC"
            class="readonly"
            labelclass="control-label"
            size="6"
            readonly="true"
            filter="unset"/>

        <field
            id="visits_html"
            name="visits_html"
            type="text"
            label="XMAP_VISITSHTML_LABEL"
            description="XMAP_HITS_DESC"
            class="readonly"
            labelclass="control-label"
            size="6"
            readonly="true"
            filter="unset"/>

        <field
            id="visits_xml"
            name="visits_xml"
            type="text"
            label="XMAP_VISITSXML_LABEL"
            description="XMAP_HITS_DESC"
            class="readonly"
            labelclass="control-label"
            size="6"
            readonly="true"
            filter="unset"/>

        <field
            id="selections"
            name="selections"
            type="xmapmenus"
            label="XMAP_MENUASSIGMENT_LABEL"
            description="XMAP_MENUASSIGMENT_DESC"
            class="inputbox"
            labelclass="control-label"
            multiple="multiple"
            array="true"
            size="5"/>

        <field
            id="selections_priority"
            name="selections_priority"
            type="hidden"
            class="inputbox"
            labelclass="control-label"
            multiple="multiple"
            size="5"/>

        <field
            id="selections_changefreq"
            name="selections_changefreq"
            type="hidden"
            class="inputbox"
            labelclass="control-label"
            multiple="multiple"
            size="5"/>
    </fields>

    <fields name="attribs">
        <fieldset name="general" label="XMAP_FIELDSET_OPTIONS">

            <field
                name="showintro"
                type="radio"
                class="btn-group"
                labelclass="control-label"
                label="XMAP_ATTRIBS_SHOW_INTRO_LABEL"
                description="XMAP_ATTRIBS_SHOW_INTRO_DESC"
                default="1">
                <option
                    value="0">JNO</option>
                <option
                    value="1">JYES</option>
            </field>

            <field
                name="show_menutitle"
                type="radio"
                class="btn-group"
                label="XMAP_ATTRIBS_SHOW_MENU_TITLE_LABEL"
                description="XMAP_ATTRIBS_SHOW_MENU_TITLE_DESC"
                labelclass="control-label"
                default="1">
                <option
                    value="0">JNO</option>
                <option
                    value="1">JYES</option>
            </field>

            <field
                name="classname"
                type="text"
                default=""
                label="XMAP_ATTRIBS_CLASSNAME_LABEL"
                labelclass="control-label"
                description="XMAP_ATTRIBS_CLASSNAME_DESC" />

            <field
                name="columns"
                type="text"
                default=""
                labelclass="control-label"
                label="XMAP_ATTRIBS_COLUMNS_LABEL"
                description="XMAP_ATTRIBS_COLUMNS_DESC" />

            <field
                name="exlinks"
                type="radio"
                class="btn-group"
                labelclass="control-label"
                label="XMAP_ATTRIBS_EXTERNAL_LINKS_LABEL"
                description="XMAP_ATTRIBS_EXTERNAL_LINKS_DESC"
                default="1">
                <option
                    value="0">JNO</option>
                <option
                    value="1">JYES</option>
            </field>

            <field
                name="exlinks"
                type="list"
                label="XMAP_ATTRIBS_EXTERNAL_LINKS_IMAGE_LABEL"
                description="XMAP_ATTRIBS_EXTERNAL_LINKS_IMAGE_DESC"
                labelclass="control-label"
                default="1">
                <option
                    value="img_blue.gif">img_blue.gif</option>
                <option
                    value="img_green.gif">img_green.gif</option>
                <option
                    value="img_grey.gif">img_grey.gif</option>
                <option
                    value="img_orange.gif">img_orange.gif</option>
                <option
                    value="img_red.gif">img_red.gif</option>
                <option
                    value="txt_blue.gif">txt_blue.gif</option>
                <option
                    value="txt_green.gif">txt_green.gif</option>
                <option
                    value="txt_grey.gif">txt_grey.gif</option>
                <option
                    value="txt_orange.gif">txt_orange.gif</option>
                <option
                    value="txt_red.gif">txt_red.gif</option>
            </field>

            <field
                name="compress_xml"
                type="radio"
                class="btn-group"
                label="XMAP_ATTRIBS_COMPRESS_XML_LABEL"
                description="XMAP_ATTRIBS_COMPRESS_XML_DESC"
                labelclass="control-label"
                default="1">
                <option
                    value="0">JNO</option>
                <option
                    value="1">JYES</option>
            </field>

            <field
                name="beautify_xml"
                type="radio"
                class="btn-group"
                label="XMAP_ATTRIBS_BEAUTIFY_XML_LABEL"
                description="XMAP_ATTRIBS_BEAUTIFY_XML_DESC"
                labelclass="control-label"
                default="1">
                <option
                    value="0">JNO</option>
                <option
                    value="1">JYES</option>
            </field>

            <field
                name="include_link"
                type="radio"
                class="btn-group"
                label="XMAP_ATTRIBS_INCLUDE_LINK_LABEL"
                description="XMAP_ATTRIBS_INCLUDE_LINK_DESC"
                labelclass="control-label"
                default="1">
                <option
                    value="0">JNO</option>
                <option
                    value="1">JYES</option>
            </field>
        </fieldset>

        <fieldset name="news" label="XMAP_FIELDSET_NEWS_OPTIONS">
          <field
              name="news_publication_name"
              type="text"
              default=""
              labelclass="control-label"
              label="XMAP_ATTRIBS_NEWS_PUBLICATION_NAME_LABEL"
              description="XMAP_ATTRIBS_NEWS_PUBLICATION_NAME_DESC" />
<!--
          <field
              name="news_posts_keywords"
              type="text"
              default=""
              label="XMAP_ATTRIBS_NEWS_POSTS_KEYWORDS_LABEL"
              description="XMAP_ATTRIBS_NEWS_POSTS_KEYWORDS_DESC" />
-->
        </fieldset>
    </fields>

</form>
components/com_xmap/models/forms/extension.xml000060400000002766152453623460015724 0ustar00<?xml version="1.0" encoding="utf-8"?>
<!-- $Id$ -->
<form>
    <fieldset addpath="administrator/components/com_xmap/elements">

        <field
            name="extension_id"
            label="JGLOBAL_FIELD_ID_LABEL"
            description ="JGLOBAL_FIELD_ID_DESC"
            type="text"
            default="0"
            required="true"
            readonly="true"
            class="readonly" />

        <field
            id="name"
            name="name"
            type="text"
            label="JGLOBAL_TITLE"
            description="JFIELD_TITLE_DESC"
            class="inputbox"
            size="29"
            required="true" />

        <field
            name="enabled"
            type="list"
            label="JFIELD_PUBLISHED_LABEL"
            description="JFIELD_PUBLISHED_DESC"
            default="1">
            <option
                value="0">JNO</option>
            <option
                value="1">Yes</option>
        </field>
        
        <field
            name="folder"
            type="hidden"
            class="readonly"
            size="20"
            label="COM_PLUGINS_FIELD_FOLDER_LABEL"
            description="COM_PLUGINS_FIELD_FOLDER_DESC"
            readonly="true" />

        <field
            name="element"
            type="hidden"
            class="readonly"
            size="20"
            label="COM_PLUGINS_FIELD_ELEMENT_LABEL"
            description="COM_PLUGINS_FIELD_ELEMENT_DESC"
            readonly="true" />
        
    </fieldset>
</form>
components/com_xmap/models/forms/index.html000060400000000036152453623460015147 0ustar00<!DOCTYPE html><title></title>components/com_xmap/models/index.html000060400000000036152453623460014021 0ustar00<!DOCTYPE html><title></title>components/com_xmap/views/index.html000060400000000036152453623460013673 0ustar00<!DOCTYPE html><title></title>components/com_xmap/views/sitemap/index.html000060400000000036152453623460015335 0ustar00<!DOCTYPE html><title></title>components/com_xmap/views/sitemap/view.html.php000060400000014126152453623460015773 0ustar00<?php
/**
 * @version             $Id$
 * @copyright           Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
 * @license             GNU General Public License version 2 or later; see LICENSE.txt
 * @author              Guillermo Vargas (guille@vargas.co.cr)
 */
// no direct access
defined('_JEXEC') or die;

jimport('joomla.application.component.view');

# For compatibility with older versions of Joola 2.5
if (!class_exists('JViewLegacy')){
    class JViewLegacy extends JView {

    }
}

/**
 * @package    Xmap
 * @subpackage com_xmap
 */
class XmapViewSitemap extends JViewLegacy
{

    protected $item;
    protected $list;
    protected $form;
    protected $state;

    /**
     * Display the view
     *
     * @access    public
     */
    function display($tpl = null)
    {
        $app = JFactory::getApplication();
        $this->state = $this->get('State');
        $this->item = $this->get('Item');
        $this->form = $this->get('Form');

        $version = new JVersion;

        // Check for errors.
        if (count($errors = $this->get('Errors'))) {
            JError::raiseError(500, implode("\n", $errors));
            return false;
        }

        JHTML::stylesheet('administrator/components/com_xmap/css/xmap.css');
        // Convert dates from UTC
        $offset = $app->getCfg('offset');
        if (intval($this->item->created)) {
            $this->item->created = JHtml::date($this->item->created, '%Y-%m-%d %H-%M-%S', $offset);
        }

        $this->_setToolbar();

        if (version_compare($version->getShortVersion(), '3.0.0', '<')) {
            $tpl = 'legacy';
        }
        parent::display($tpl);
        JRequest::setVar('hidemainmenu', true);
    }

    /**
     * Display the view
     *
     * @access    public
     */
    function navigator($tpl = null)
    {
        require_once(JPATH_COMPONENT_SITE . '/helpers/xmap.php');
        $app = JFactory::getApplication();
        $this->state = $this->get('State');
        $this->item = $this->get('Item');

        # $menuItems = XmapHelper::getMenuItems($item->selections);
        # $extensions = XmapHelper::getExtensions();
        // Check for errors.
        if (count($errors = $this->get('Errors'))) {
            JError::raiseError(500, implode("\n", $errors));
            return false;
        }

        JHTML::script('mootree.js', 'media/system/js/');
        JHTML::stylesheet('mootree.css', 'media/system/css/');

        $this->loadTemplate('class');
        $displayer = new XmapNavigatorDisplayer($state->params, $this->item);

        parent::display($tpl);
    }

    function navigatorLinks($tpl = null)
    {

        require_once(JPATH_COMPONENT_SITE . '/helpers/xmap.php');
        $link = urldecode(JRequest::getVar('link', ''));
        $name = JRequest::getCmd('e_name', '');
        $Itemid = JRequest::getInt('Itemid');

        $this->item = $this->get('Item');
        $this->state = $this->get('State');
        $menuItems = XmapHelper::getMenuItems($item->selections);
        $extensions = XmapHelper::getExtensions();

        $this->loadTemplate('class');
        $nav = new XmapNavigatorDisplayer($state->params, $item);
        $nav->setExtensions($extensions);

        $this->list = array();
        // Show the menu list
        if (!$link && !$Itemid) {
            foreach ($menuItems as $menutype => &$menu) {
                $menu = new stdclass();
                #$menu->id = 0;
                #$menu->menutype = $menutype;

                $node = new stdClass;
                $node->uid = "menu-" . $menutype;
                $node->menutype = $menutype;
                $node->ordering = $item->selections->$menutype->ordering;
                $node->priority = $item->selections->$menutype->priority;
                $node->changefreq = $item->selections->$menutype->changefreq;
                $node->browserNav = 3;
                $node->type = 'separator';
                if (!$node->name = $nav->getMenuTitle($menutype, @$menu->module)) {
                    $node->name = $menutype;
                }
                $node->link = '-menu-' . $menutype;
                $node->expandible = true;
                $node->selectable = false;
                //$node->name = $this->getMenuTitle($menutype,@$menu->module);    // get the mod_mainmenu title from modules table

                $this->list[] = $node;
            }
        } else {
            $parent = new stdClass;
            if ($Itemid) {
                // Expand a menu Item
                $items = &JSite::getMenu();
                $node = & $items->getItem($Itemid);
                if (isset($menuItems[$node->menutype])) {
                    $parent->name = $node->title;
                    $parent->id = $node->id;
                    $parent->uid = 'itemid' . $node->id;
                    $parent->link = $link;
                    $parent->type = $node->type;
                    $parent->browserNav = $node->browserNav;
                    $parent->priority = $item->selections->{$node->menutype}->priority;
                    $parent->changefreq = $item->selections->{$node->menutype}->changefreq;
                    $parent->menutype = $node->menutype;
                    $parent->selectable = false;
                    $parent->expandible = true;
                }
            } else {
                $parent->id = 1;
                $parent->link = $link;
            }
            $this->list = $nav->expandLink($parent);
        }

        parent::display('links');
        exit;
    }

    /**
     * Display the toolbar
     *
     * @access    private
     */
    function _setToolbar()
    {
        $user = JFactory::getUser();
        $isNew = ($this->item->id == 0);

        JToolBarHelper::title(JText::_('XMAP_PAGE_' . ($isNew ? 'ADD_SITEMAP' : 'EDIT_SITEMAP')), 'article-add.png');

        JToolBarHelper::apply('sitemap.apply', 'JTOOLBAR_APPLY');
        JToolBarHelper::save('sitemap.save', 'JTOOLBAR_SAVE');
        JToolBarHelper::save2new('sitemap.save2new');
        if (!$isNew) {
            JToolBarHelper::save2copy('sitemap.save2copy');
        }
        JToolBarHelper::cancel('sitemap.cancel', 'JTOOLBAR_CLOSE');
    }

}
components/com_xmap/views/sitemap/tmpl/edit_legacy.php000060400000006324152453623460017304 0ustar00<?php
/**
 * @version          $Id$
 * @copyright        Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
 * @license          GNU General Public License version 2 or later; see LICENSE.txt
 * @author           Guillermo Vargas (guille@vargas.co.cr)
 */
defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

jimport('joomla.html.pane');

// Load the tooltip behavior.
JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
?>
<script type="text/javascript">
<!--
    function submitbutton(task)
    {
        if (task == 'sitemap.cancel' || document.formvalidator.isValid($('adminForm'))) {
            submitform(task);
        }
    }
// -->
</script>

<form action="<?php echo JRoute::_('index.php?option=com_xmap&layout=edit&id='.$this->item->id); ?>" method="post" name="adminForm" id="adminForm" class="form-validate">

    <div class="width-60 fltlft">
        <fieldset class="adminform">
            <?php echo $this->form->getLabel('id'); ?>
            <?php echo $this->form->getInput('id'); ?>

            <?php echo $this->form->getLabel('title'); ?>
            <?php echo $this->form->getInput('title'); ?>

            <?php echo $this->form->getLabel('alias'); ?>
            <?php echo $this->form->getInput('alias'); ?>

            <?php echo $this->form->getLabel('state'); ?>
            <?php echo $this->form->getInput('state'); ?>

            <?php echo $this->form->getLabel('access'); ?>
            <?php echo $this->form->getInput('access'); ?>

            <div class="clr"></div>
            <?php echo $this->form->getLabel('introtext'); ?><br />
            <div class="clr"></div>
            <?php echo $this->form->getInput('introtext'); ?>
        </fieldset>
    </div>

    <div class="width-40" style="float:left">
        <?php echo JHtml::_('sliders.start', 'xmap-sliders-' . $this->item->id, array('useCookie' => 1)); ?>
        <?php echo JHtml::_('sliders.panel', JText::_('XMAP_FIELDSET_MENUS'), 'menus-details'); ?>
        <?php echo $this->form->getInput('selections'); ?>
        <?php
            $fieldSets = $this->form->getFieldsets('attribs');
            foreach ($fieldSets as $name => $fieldSet) :
                echo JHtml::_('sliders.panel', JText::_($fieldSet->label), $name . '-options');
                if (isset($fieldSet->description) && trim($fieldSet->description)) :
                    echo '<p class="tip">' . $this->escape(JText::_($fieldSet->description)) . '</p>';
                endif;
        ?>
                <fieldset class="panelform">
                    <ul class="adminformlist">
                    <?php foreach ($this->form->getFieldset($name) as $field) : ?>
                        <li>
                            <?php echo $field->label; ?>
                            <?php echo $field->input; ?>
                        </li>
                    <?php endforeach; ?>
                    </ul>
                </fieldset>
        <?php endforeach; ?>

        <?php echo JHtml::_('sliders.end'); ?>
    </div>

    <input type="hidden" name="task" value="" />
    <?php echo $this->form->getInput('is_default'); ?>
    <?php echo JHtml::_('form.token'); ?>
</form>
<div class="clr"></div>
components/com_xmap/views/sitemap/tmpl/navigator.php000060400000007537152453623460017034 0ustar00<?php
/**
 * @version             $Id$
 * @copyright        Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
 * @license             GNU General Public License version 2 or later; see LICENSE.txt
 * @author              Guillermo Vargas (guille@vargas.co.cr)
 */

defined('_JEXEC') or die;

$name = JRequest::getCmd('e_name');

$doc =& JFactory::getDocument();
$doc->addScriptDeclaration('
    var tree;
    var autotext = \'\';
    insertLink = function (){
        var link = $(\'f_link\').get(\'value\');
        var text = $(\'f_text\').get(\'value\');
        var title = $(\'f_title\').get(\'value\');
        var cssstyle = $(\'f_cssstyle\').get(\'value\');
        var cssclass = $(\'f_cssclass\').get(\'value\');
        if (link != \'\' && text != \'\') {
            var extra =\'\';
            if (title != \'\') {
                extra = extra + \' title=\'+title.replace(\'"\',\'&quot;\')+\'"\';
            }
            if (cssclass != \'\') {
                extra = extra + \' class=\'+cssclass.replace(\'"\',\'&quot;\')+\'"\';
            }
            if (cssstyle != \'\') {
                extra = extra + \' style=\'+cssstyle.replace(\'"\',\'&quot;\')+\'"\';
            }
            var tag = "<a href=\""+link+"\" "+extra+">"+text+"</a>";
            window.parent.jInsertEditorText(tag, "'.htmlspecialchars($name).'");
        }
        window.parent.SqueezeBox.close();
    };
    window.addEvent("domready",function(){
        tree =  new MooTreeControl({ 
        div: \'xmap-nav_tree\', 
        mode: \'files\',
        grid: true,
        theme: \'../media/media/images/mootree.gif\',
        onSelect: function (node,state) {
            if (typeof node.data.link != \'undefined\' && node.data.selectable == \'true\') {
                document.adminForm.link.value = node.data.link;
                if (document.adminForm.text.value == autotext ) {
                    document.adminForm.text.value = node.text;
                    autotext =  node.text;
                }
            }
        }
    },{
        text: \'Home\',
        open: true
    });
    tree.root.load(\'index.php?option=com_xmap&task=navigator-links&sitemap='.$this->item->id.'&e_name='.$name.'&tmpl=component\');
    });
    ');
?>
<div id="xmap-nav_tree" style="height:250px;overflow:auto;border:1px solid #CCC;"></div>
    <div id="xmap-nav_linkinfo" style="margin-top:3px;border:1px solid #CCC;height:120px;">
        <form name="adminForm" action="#" onSubmit="return false;">
        <table width="100%">
            <tr>
                <td><?php echo JText::_('Xmap_Link_Text'); ?></td>
                <td colspan="3"><input type="text" name="text" id="f_text" value="" size="30" /></td>
            </tr>
            <tr>
                <td><?php echo JText::_('Xmap_Link_Title'); ?></td>
                <td colspan="3"><input type="text" name="title" id="f_title"  value="" size="30" /></td>
            </tr>
            <tr>
                <td><?php echo JText::_('Xmap_Link_Link'); ?></td>
                <td colspan="3"><input type="text" name="link" id="f_link"  value="" size="50" /></td>
            </tr>
            <tr>
                <td><?php echo JText::_('Xmap_Link_Style'); ?></td>
                <td><input type="text" name="cssstyle" id="f_cssstyle"  value="" /></td>
                <td><?php echo JText::_('Xmap_Link_Class'); ?></td>
                <td><input type="text" name="cssclass" id="f_cssclass"  value="" /></td>
            </tr>
            <tr>
                <td colspan="4" align="right">
                    <button name="cssstyle" id="f_cssstyle" onclick="insertLink();"><?php echo JText::_('OK'); ?></button> 
                    <button name="cssstyle" id="f_cssstyle" onclick="window.parent.SqueezeBox.close();"><?php echo JText::_('Cancel'); ?></button>
                </td>
           </tr>
        </table>
    </form>
</div>
<ul id="xmap-nav"></ul>
components/com_xmap/views/sitemap/tmpl/edit.php000060400000012250152453623460015753 0ustar00<?php
/**
 * @version          $Id$
 * @copyright        Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
 * @license          GNU General Public License version 2 or later; see LICENSE.txt
 * @author           Guillermo Vargas (guille@vargas.co.cr)
 */
defined('_JEXEC') or die;

// Include the component HTML helpers.
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html');

// Load the tooltip behavior.
JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
if(version_compare(JVERSION,'3.0.0','ge')) {
    JHtml::_('formbehavior.chosen', 'select');
}
?>
<script type="text/javascript">
<!--
    function submitbutton(task)
    {
        if (task == 'sitemap.cancel' || document.formvalidator.isValid($('adminForm'))) {
            submitform(task);
        }
    }
// -->
</script>
<form action="<?php echo JRoute::_('index.php?option=com_xmap&layout=edit&id='.$this->item->id); ?>" method="post" name="adminForm" id="adminForm" class="form-validate">
    <div class="row-fluid">
        <!-- Begin Content -->
        <div class="span10 form-horizontal">
            <ul class="nav nav-tabs">
                <li class="active"><a href="#general" data-toggle="tab"><?php echo JText::_('XMAP_SITEMAP_DETAILS_FIELDSET');?></a></li>
                <li><a href="#attrib-menus" data-toggle="tab"><?php echo JText::_('XMAP_FIELDSET_MENUS');?></a></li>
                <?php
                $fieldSets = $this->form->getFieldsets('attribs');
                foreach ($fieldSets as $name => $fieldSet) :
                ?>
                <li><a href="#attrib-<?php echo $name;?>" data-toggle="tab"><?php echo JText::_($fieldSet->label);?></a></li>
                <?php
                endforeach;
                ?>
            </ul>

            <div class="tab-content">
                <div class="tab-pane active" id="general">
                    <div class="row-fluid">
                        <div class="span10">
                            <div class="control-group">
                                <?php echo $this->form->getLabel('title'); ?>
                                <div class="controls">
                                    <?php echo $this->form->getInput('title'); ?>
                                </div>
                            </div>
                            <div class="control-group">
                                <?php echo $this->form->getLabel('alias'); ?>
                                <div class="controls">
                                    <?php echo $this->form->getInput('alias'); ?>
                                </div>
                            </div>
                            <div class="control-group">
                                <?php echo $this->form->getLabel('state'); ?>
                                <div class="controls">
                                    <?php echo $this->form->getInput('state'); ?>
                                </div>
                            </div>
                            <div class="control-group">
                                <?php echo $this->form->getLabel('access'); ?>
                                <div class="controls">
                                    <?php echo $this->form->getInput('access'); ?>
                                </div>
                            </div>
                            <div class="control-group">
                                <div class="clr"></div>
                                <?php echo $this->form->getLabel('introtext'); ?><br />
                                <div class="clr"></div>
                                <div class="controls">
                                    <?php echo $this->form->getInput('introtext'); ?>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>

                <div class="tab-pane" id="attrib-menus">
                    <div style="width:500px">
                        <?php echo $this->form->getInput('selections'); ?>
                    </div>
                </div>
                <?php
                $fieldSets = $this->form->getFieldsets('attribs');
                foreach ($fieldSets as $name => $fieldSet) :
                ?>
                <div class="tab-pane" id="attrib-<?php echo $name;?>">
                    <?php
                    if (isset($fieldSet->description) && trim($fieldSet->description)) :
                        echo '<p class="tip">' . $this->escape(JText::_($fieldSet->description)) . '</p>';
                    endif;

                    foreach ($this->form->getFieldset($name) as $field) :
                    ?>
                    <div class="control-group">
                        <?php echo $field->label; ?>
                        <div class="controls">
                            <?php echo $field->input; ?>
                        </div>
                    </div>
                    <?php endforeach; ?>
                </div>
                <?php endforeach; ?>
            </div>
        </div>
    </div>

    <input type="hidden" name="task" value="" />
    <?php echo $this->form->getInput('is_default'); ?>
    <?php echo JHtml::_('form.token'); ?>
</form>
<div class="clr"></div>
components/com_xmap/views/sitemap/tmpl/navigator_class.php000060400000010063152453623460020205 0ustar00<?php
/**
 * @version             $Id$
 * @copyright           Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
 * @license             GNU General Public License version 2 or later; see LICENSE.txt
 * @author              Guillermo Vargas (guille@vargas.co.cr)
 */

// No direct access
defined('_JEXEC') or die;

require_once(JPATH_COMPONENT_SITE.'/displayer.php');

class XmapNavigatorDisplayer extends XmapDisplayer {

    function __construct(&$config, &$sitemap) {
        $this->_list=array();
        $this->view='navigator';
    
        parent::__construct( $config, $sitemap);    
    }
    
    function printNode( &$node ) {
        if (!isset($node->selectable )) {
            $node->selectable=true;
        }
        // For extentions that doesn't set this property as this is new in Xmap 1.2.3
        if (!isset($node->expandible )) { 
            $node->expandible = true;
        }
        if ( empty($this->_list[$node->uid]) ) { // Avoid duplicated items
            $this->_list[$node->uid] = $node;
        }
        return false;
    }

    function &expandLink(&$parent)    {
        $items = &JSite::getMenu();
        $extensions = &$this->_extensions;
        $rows = null;
        if (strpos($parent->link,'-menu-') === 0 ) {
            $menutype = str_replace('-menu-','',$parent->link);
            // Get Menu Items
            $rows = $items->getItems('menutype', $menutype);
        } elseif ($parent->id) {
            $rows = $items->getItems('parent_id', $parent->id);
        }

        if ( $rows ) {
            foreach ($rows as $item) {
                if ($item->parent_id == $parent->id) {
                    $node = new stdclass;
                    $node->name = $item->title;
                    $node->id   = $item->id;
                    $node->uid  = 'itemid'.$item->id;
                    $node->link = $item->link;
                    $node->expandible = true;
                    $node->selectable=true;
                    // Prepare the node link
                    XmapHelper::prepareMenuItem($node);
                    if ( $item->home ) {
                        $node->link = JURI::root();
                    } elseif (substr($item->link,0,9) == 'index.php' && $item->type != 'url' ) {
                        if ($item->type == 'menulink') {// For Joomla 1.5 SEF compatibility
                            $params = new JParameter($item->params);
                            $node->link     = 'index.php?Itemid=' . $params->get('menu_item');
                        } elseif ( strpos($item->link,'Itemid=') === FALSE ){
                            $node->link     = 'index.php?Itemid=' . $node->id;
                        }
                    } elseif ($item->type == 'separator') {
                        $node->selectable=false;
                    }
                    $this->printNode($node);  // Add to the internal list
                }
            }

        }
        if ($parent->id) {
            $option = null;
            if ( preg_match('#^/?index.php.*option=(com_[^&]+)#',$parent->link,$matches) ) {
                $option = $matches[1];
            }
            $Itemid = JRequest::getInt('Itemid');
            if (!$option && $Itemid) {
                $item = $items->getItem($Itemid);
                $link_query = parse_url( $item->link );
                parse_str( html_entity_decode($link_query['query']), $link_vars);
                $option = JArrayHelper::getValue($link_vars,'option','');
                if ( $option ) {
                    $parent->link = $item->link;
                }
            }
            if ( $option ) {
                if ( !empty($extensions[$option]) ) {
                    $parent->uid = $option;
                    $className = 'xmap_'.$option;
                    $result = call_user_func_array(array($className, 'getTree'),array(&$this,&$parent,$extensions[$option]->params));
                }
            }
        }
        return $this->_list;;
    }

    function &getParam($arr, $name, $def) {
        $var = JArrayHelper::getValue( $arr, $name, $def, '' );
        return $var;
    }
}
components/com_xmap/views/sitemap/tmpl/index.html000060400000000036152453623460016311 0ustar00<!DOCTYPE html><title></title>components/com_xmap/views/sitemap/tmpl/navigator_links.php000060400000002051152453623460020216 0ustar00<?php
/**
 * @version          $Id$
 * @copyright        Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
 * @license          GNU General Public License version 2 or later; see LICENSE.txt
 * @author           Guillermo Vargas (guille@vargas.co.cr)
 */

defined('_JEXEC') or die;

header('Content-type: text/xml');

$name = JRequest::getCmd('e_name');
?>
<?xml version="1.0" encoding="UTF-8" ?>
<nodes>
<?php foreach ($this->list as $node) {
    $load = 'index.php?option=com_xmap&amp;task=navigator-links&amp;sitemap='.$this->item->id.'&amp;e_name='.$name.(isset($node->id)?'&amp;Itemid='.$node->id:'').(isset($node->link)?'&amp;link='.urlencode($node->link):'').'&amp;tmpl=component';
?>
    <node text="<?php echo htmlentities($node->name); ?>" <?php echo ($node->expandible?" openicon=\"_open\" icon=\"_closed\" load=\"$load\"":' icon="_doc"'); ?> uid="<?php $node->uid; ?>" link="<?php echo str_replace(array('&amp;','&'),array('&','&amp;'),$node->link); ?>" selectable="<?php echo ($node->selectable?'true':'false'); ?>" />
<?php } ?>
</nodes>
components/com_xmap/views/sitemaps/tmpl/index.html000060400000000036152453623460016474 0ustar00<!DOCTYPE html><title></title>components/com_xmap/views/sitemaps/tmpl/default_legacy.php000060400000021765152453623460020174 0ustar00<?php
/**
 * @version     $Id$
 * @copyright   Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 * @author      Guillermo Vargas (guille@vargas.co.cr)
 */

// no direct access
defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');
JHtml::_('behavior.tooltip');

$n = count($this->items);

$baseUrl = JUri::root();

$version = new JVersion;

?>
<form action="<?php echo JRoute::_('index.php?option=com_xmap&view=sitemaps');?>" method="post" name="adminForm" id="adminForm">
    <fieldset class="filter clearfix">
        <div class="left">
            <label for="search">
                <?php echo JText::_('JSearch_Filter_Label'); ?>
            </label>
            <input type="text" name="filter_search" id="filter_search" value="<?php echo $this->state->get('filter.search'); ?>" size="60" title="<?php echo JText::_('Xmap_Filter_Search_Desc'); ?>" />

            <button type="submit">
                <?php echo JText::_('JSearch_Filter_Submit'); ?></button>
            <button type="button" onclick="$('filter_search').value='';this.form.submit();">
                <?php echo JText::_('JSearch_Filter_Clear'); ?></button>
        </div>

        <div class="right">
            <select name="filter_access" class="inputbox" onchange="this.form.submit()">
                <option value=""><?php echo JText::_('JOption_Select_Access');?></option>
                <?php echo JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text', $this->state->get('filter.access'));?>
            </select>

            <select name="filter_published" class="inputbox" onchange="this.form.submit()">
                <option value=""><?php echo JText::_('JOption_Select_Published');?></option>
                <?php echo JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.published'), true);?>
            </select>

        </div>
    </fieldset>

    <table class="adminlist">
        <thead>
            <tr>
                <th width="20">
                    <input type="checkbox" name="toggle" value="" onclick="checkAll(this)" />
                </th>
                <th class="title">
                    <?php echo JHtml::_('grid.sort', 'Xmap_Heading_Sitemap', 'a.title', $this->state->get('list.direction'), $this->state->get('list.ordering')); ?>
                </th>
                <th width="5%">
                    <?php echo JHtml::_('grid.sort', 'Xmap_Heading_Published', 'a.state', $this->state->get('list.direction'), $this->state->get('list.ordering')); ?>
                </th>
                <th width="10%">
                    <?php echo JHtml::_('grid.sort',  'Xmap_Heading_Access', 'access_level', $this->state->get('list.direction'), $this->state->get('list.ordering')); ?>
                </th>
                <th width="10%" class="nowrap">
                    <?php echo JText::_('Xmap_Heading_Html_Stats'); ?><br />
                    (<?php echo JText::_('Xmap_Heading_Num_Links') . ' / '. JText::_('Xmap_Heading_Num_Hits') . ' / ' . JText::_('Xmap_Heading_Last_Visit'); ?>)
                </th>
                <th width="10%" class="nowrap">
                    <?php echo JText::_('Xmap_Heading_Xml_Stats'); ?><br />
                    <?php echo JText::_('Xmap_Heading_Num_Links') . '/'. JText::_('Xmap_Heading_Num_Hits') . '/' . JText::_('Xmap_Heading_Last_Visit'); ?>
                </th>
                <th width="1%" class="nowrap">
                    <?php echo JHtml::_('grid.sort', 'Xmap_Heading_ID', 'a.id', $this->state->get('list.direction'), $this->state->get('list.ordering')); ?>
                </th>
            </tr>
        </thead>
        <tfoot>
            <tr>
                <td colspan="15">
                    <?php echo $this->pagination->getListFooter(); ?>
                </td>
            </tr>
        </tfoot>
        <tbody>
        <?php foreach ($this->items as $i => $item) :

            $now = JFactory::getDate()->toUnix();
            if ( !$item->lastvisit_html ) {
                $htmlDate = JText::_('Date_Never');
            }elseif ( $item->lastvisit_html > ($now-3600)) { // Less than one hour
                $htmlDate = JText::sprintf('Date_Minutes_Ago',intval(($now-$item->lastvisit_html)/60));
            } elseif ( $item->lastvisit_html > ($now-86400)) { // Less than one day
                $hours = intval (($now-$item->lastvisit_html)/3600 );
                $htmlDate = JText::sprintf('Date_Hours_Minutes_Ago',$hours,($now-($hours*3600)-$item->lastvisit_html)/60);
            } elseif ( $item->lastvisit_html > ($now-259200)) { // Less than three days
                $days = intval(($now-$item->lastvisit_html)/86400);
                $htmlDate = JText::sprintf('Date_Days_Hours_Ago',$days,intval(($now-($days*86400)-$item->lastvisit_html)/3600));
            } else {
                $date = new JDate($item->lastvisit_html);
                $htmlDate = $date->format('Y-m-d H:i');
            }

            if ( !$item->lastvisit_xml ) {
                $xmlDate = JText::_('Date_Never');
            } elseif ( $item->lastvisit_xml > ($now-3600)) { // Less than one hour
                $xmlDate = JText::sprintf('Date_Minutes_Ago',intval(($now-$item->lastvisit_xml)/60));
            } elseif ( $item->lastvisit_xml > ($now-86400)) { // Less than one day
                $hours = intval (($now-$item->lastvisit_xml)/3600 );
                $xmlDate = JText::sprintf('Date_Hours_Minutes_Ago',$hours,($now-($hours*3600)-$item->lastvisit_xml)/60);
            } elseif ( $item->lastvisit_xml > ($now-259200)) { // Less than three days
                $days = intval(($now-$item->lastvisit_xml)/86400);
                $xmlDate = JText::sprintf('Date_Days_Hours_Ago',$days,intval(($now-($days*86400)-$item->lastvisit_xml)/3600));
            } else {
                $date = new JDate($item->lastvisit_xml);
                $xmlDate = $date->format('Y-m-d H:i');
            }

        ?>
            <tr class="row<?php echo $i % 2; ?>">
                <td class="center">
                    <?php echo JHtml::_('grid.id', $i, $item->id); ?>
                </td>
                <td>
                    <a href="<?php echo JRoute::_('index.php?option=com_xmap&task=sitemap.edit&id='.$item->id);?>">
                        <?php echo $this->escape($item->title); ?></a>
                        <?php if ($item->is_default == 1) : ?>
                            <?php if (version_compare($version->getShortVersion(), '3.0.0', '>=')): ?>
                                <span class="icon-featured"></span>
                            <?php else: ?>
                                <img src="templates/bluestork/images/menu/icon-16-default.png" alt="<?php echo JText::_('Default'); ?>" />
                            <?php endif; ?>
                        <?php endif; ?>
                            <?php if ($item->state): ?>
                                <small>[<a href="<?php echo $baseUrl. 'index.php?option=com_xmap&amp;view=xml&tmpl=component&id='.$item->id; ?>" target="_blank" title="<?php echo JText::_('XMAP_XML_LINK_TOOLTIP',true); ?>"><?php echo JText::_('XMAP_XML_LINK'); ?></a>]</small>
                                <small>[<a href="<?php echo $baseUrl. 'index.php?option=com_xmap&amp;view=xml&tmpl=component&news=1&id='.$item->id; ?>" target="_blank" title="<?php echo JText::_('XMAP_NEWS_LINK_TOOLTIP',true); ?>"><?php echo JText::_('XMAP_NEWS_LINK'); ?></a>]</small>
                                <small>[<a href="<?php echo $baseUrl. 'index.php?option=com_xmap&amp;view=xml&tmpl=component&images=1&id='.$item->id; ?>" target="_blank" title="<?php echo JText::_('XMAP_IMAGES_LINK_TOOLTIP',true); ?>"><?php echo JText::_('XMAP_IMAGES_LINK'); ?></a>]</small>
                            <?php endif; ?>
                                <br />
								<small>(<?php echo $this->escape($item->alias); ?>)</small>
                </td>
                <td class="center">
                    <?php echo JHtml::_('jgrid.published', $item->state, $i, 'sitemaps.'); ?>
                </td>
                <td class="center">
                    <?php echo $this->escape($item->access_level); ?>
                </td>
                <td class="center">
                    <?php echo $item->count_html .' / '.$item->views_html. ' / ' . $htmlDate; ?>
                </td>
                <td class="center">
                    <?php echo $item->count_xml .' / '.$item->views_xml. ' / ' . $xmlDate; ?>
                </td>
                <td class="center">
                    <?php echo (int) $item->id; ?>
                </td>
            </tr>
        <?php endforeach; ?>
        </tbody>
    </table>

    <input type="hidden" name="task" value="" />
    <input type="hidden" name="boxchecked" value="0" />
    <input type="hidden" name="filter_order" value="<?php echo $this->state->get('list.ordering'); ?>" />
    <input type="hidden" name="filter_order_Dir" value="<?php echo $this->state->get('list.direction'); ?>" />
    <?php echo JHtml::_('form.token'); ?>
</form>
components/com_xmap/views/sitemaps/tmpl/modal.php000060400000016577152453623460016325 0ustar00<?php
/**
 * @version             $Id$
 * @copyright            Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
 * @license             GNU General Public License version 2 or later; see LICENSE.txt
 * @author              Guillermo Vargas (guille@vargas.co.cr)
 */

// no direct access
defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');
JHtml::_('behavior.tooltip');

$function = JRequest::getVar('function', 'jSelectSitemap');
$n = count($this->items);
?>
<form action="<?php echo JRoute::_('index.php?option=com_xmap&view=sitemaps');?>" method="post" name="adminForm">
    <fieldset class="filter clearfix">
        <div class="left">
            <label for="search">
                <?php echo JText::_('JSearch_Filter_Label'); ?>
            </label>
            <input type="text" name="filter_search" id="filter_search" value="<?php echo $this->state->get('filter.search'); ?>" size="60" title="<?php echo JText::_('Xmap_Filter_Search_Desc'); ?>" />

            <button type="submit">
                <?php echo JText::_('JSearch_Filter_Submit'); ?></button>
            <button type="button" onclick="$('filter_search').value='';this.form.submit();">
                <?php echo JText::_('JSearch_Filter_Clear'); ?></button>
        </div>

        <div class="right">
            <select name="filter_access" class="inputbox" onchange="this.form.submit()">
                <option value=""><?php echo JText::_('JOption_Select_Access');?></option>
                <?php echo JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text', $this->state->get('filter.access'));?>
            </select>

            <select name="filter_published" class="inputbox" onchange="this.form.submit()">
                <option value=""><?php echo JText::_('JOption_Select_Published');?></option>
                <?php echo JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.published'), true);?>
            </select>

        </div>
    </fieldset>

    <table class="adminlist">
        <thead>
            <tr>
                <th class="title">
                    <?php echo JHtml::_('grid.sort', 'Xmap_Heading_Sitemap', 'a.title', $this->state->get('list.direction'), $this->state->get('list.ordering')); ?>
                </th>
                <th width="5%">
                    <?php echo JHtml::_('grid.sort', 'Xmap_Heading_Published', 'a.state', $this->state->get('list.direction'), $this->state->get('list.ordering')); ?>
                </th>
                <th width="10%">
                    <?php echo JHtml::_('grid.sort',  'JGrid_Heading_Access', 'access_level', $this->state->get('list.direction'), $this->state->get('list.ordering')); ?>
                </th>
                <th width="10%" nowrap="nowrap">
                    <?php echo JText::_('Xmap_Heading_Html_Stats'); ?><br />
                    (<?php echo JText::_('Xmap_Heading_Num_Links') . ' / '. JText::_('Xmap_Heading_Num_Hits') . ' / ' . JText::_('Xmap_Heading_Last_Visit'); ?>)
                </th>
                <th width="10%" nowrap="nowrap">
                    <?php echo JText::_('Xmap_Heading_Xml_Stats'); ?><br />
                    <?php echo JText::_('Xmap_Heading_Num_Links') . '/'. JText::_('Xmap_Heading_Num_Hits') . '/' . JText::_('Xmap_Heading_Last_Visit'); ?>
                </th>
                <th width="1%" nowrap="nowrap">
                    <?php echo JHtml::_('grid.sort', 'JGrid_Heading_ID', 'a.id', $this->state->get('list.direction'), $this->state->get('list.ordering')); ?>
                </th>
            </tr>
        </thead>
        <tfoot>
            <tr>
                <td colspan="15">
                    <?php echo $this->pagination->getListFooter(); ?>
                </td>
            </tr>
        </tfoot>
        <tbody>
        <?php
        foreach ($this->items as $i => $item) :

            $now = JFactory::getDate()->toUnix();
            if ( !$item->lastvisit_html ) {
                $htmlDate = JText::_('Date_Never');
            }elseif ( $item->lastvisit_html > ($now-3600)) { // Less than one hour
                $htmlDate = JText::sprintf('Date_Minutes_Ago',intval(($now-$item->lastvisit_html)/60));
            } elseif ( $item->lastvisit_html > ($now-86400)) { // Less than one day
                $hours = intval (($now-$item->lastvisit_html)/3600 );
                $htmlDate = JText::sprintf('Date_Hours_Minutes_Ago',$hours,($now-($hours*3600)-$item->lastvisit_html)/60);
            } elseif ( $item->lastvisit_html > ($now-259200)) { // Less than three days
                $days = intval(($now-$item->lastvisit_html)/86400);
                $htmlDate = JText::sprintf('Date_Days_Hours_Ago',$days,intval(($now-($days*86400)-$item->lastvisit_html)/3600));
            } else {
                $date = new JDate($item->lastvisit_html);
                $htmlDate = $date->toFormat('%Y-%m-%d %H:%M');
            }

            if ( !$item->lastvisit_xml ) {
                $xmlDate = JText::_('Date_Never');
            } elseif ( $item->lastvisit_xml > ($now-3600)) { // Less than one hour
                $xmlDate = JText::sprintf('Date_Minutes_Ago',intval(($now-$item->lastvisit_xml)/60));
            } elseif ( $item->lastvisit_xml > ($now-86400)) { // Less than one day
                $hours = intval (($now-$item->lastvisit_xml)/3600 );
                $xmlDate = JText::sprintf('Date_Hours_Minutes_Ago',$hours,($now-($hours*3600)-$item->lastvisit_xml)/60);
            } elseif ( $item->lastvisit_xml > ($now-259200)) { // Less than three days
                $days = intval(($now-$item->lastvisit_xml)/86400);
                $xmlDate = JText::sprintf('Date_Days_Hours_Ago',$days,intval(($now-($days*86400)-$item->lastvisit_xml)/3600));
            } else {
                $date = new JDate($item->lastvisit_xml);
                $xmlDate = $date->toFormat('%Y-%m-%d %H:%M');
            }

        ?>
            <tr class="row<?php echo $i % 2; ?>">
                <td>
                    <a style="cursor: pointer;" onclick="if (window.parent) window.parent.<?php echo $function;?>('<?php echo $item->id; ?>', '<?php echo $this->escape($item->title); ?>');">
                        <?php echo $this->escape($item->title); ?></a>
                </td>
                <td align="center">
                    <?php echo JHtml::_('jgrid.published', $item->state, $i, 'sitemaps.'); ?>
                </td>
                <td align="center">
                    <?php echo $this->escape($item->access_level); ?>
                </td>
                <td class="center">
                    <?php echo $item->count_html .' / '.$item->views_html. ' / ' . $htmlDate; ?>
                </td>
                <td class="center">
                    <?php echo $item->count_xml .' / '.$item->views_xml. ' / ' . $xmlDate; ?>
                </td>
                <td align="center">
                    <?php echo (int) $item->id; ?>
                </td>
            </tr>
        <?php endforeach; ?>
        </tbody>
    </table>
    <input type="hidden" name="tmpl" value="component" />
    <input type="hidden" name="task" value="" />
    <input type="hidden" name="boxchecked" value="0" />
    <input type="hidden" name="filter_order" value="<?php echo $this->state->get('list.ordering'); ?>" />
    <input type="hidden" name="filter_order_Dir" value="<?php echo $this->state->get('list.direction'); ?>" />
    <?php echo JHtml::_('form.token'); ?>
</form>
components/com_xmap/views/sitemaps/tmpl/form.php000060400000000000152453623460016142 0ustar00components/com_xmap/views/sitemaps/tmpl/default.php000060400000022465152453623460016646 0ustar00<?php
/**
 * @version     $Id$
 * @copyright   Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 * @author      Guillermo Vargas (guille@vargas.co.cr)
 */

// no direct access
defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');
JHtml::_('bootstrap.tooltip');
if(version_compare(JVERSION,'3.0.0','ge')) {
    JHtml::_('formbehavior.chosen', 'select');
}

$n = count($this->items);

$baseUrl = JUri::root();

$version = new JVersion;

?>
<form action="<?php echo JRoute::_('index.php?option=com_xmap&view=sitemaps');?>" method="post" name="adminForm" id="adminForm">
<?php if (!empty( $this->sidebar)): ?>
    <div id="j-sidebar-container" class="span2">
        <?php echo $this->sidebar; ?>
    </div>
    <div id="j-main-container" class="span10">
<?php else : ?>
    <div id="j-main-container">
<?php endif;?>
        <div id="filter-bar" class="btn-toolbar">
            <div class="filter-search btn-group pull-left">
                <input type="text" name="filter_search" id="filter_search" value="<?php echo $this->state->get('filter.search'); ?>" size="60" title="<?php echo JText::_('Xmap_Filter_Search_Desc'); ?>" />
            </div>

            <div class="btn-group pull-left hidden-phone">
                <button class="btn tip hasTooltip" type="submit" title="<?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?>"><i class="icon-search"></i></button>
                <button class="btn tip hasTooltip" type="button" onclick="document.id('filter_search').value='';this.form.submit();" title="<?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?>"><i class="icon-remove"></i></button>
            </div>
        </div>

        <table class="adminlist table table-striped">
            <thead>
                <tr>
                    <th width="20">
                        <input type="checkbox" name="checkall-toggle" value="" title="<?php echo JText::_('JGLOBAL_CHECK_ALL'); ?>" onclick="if (typeof Joomla != 'undefined'){Joomla.checkAll(this)} else {checkAll(this)}" />
                    </th>
                    <th class="title">
                        <?php echo JHtml::_('grid.sort', 'Xmap_Heading_Sitemap', 'a.title', $this->state->get('list.direction'), $this->state->get('list.ordering')); ?>
                    </th>
                    <th width="5%">
                        <?php echo JHtml::_('grid.sort', 'Xmap_Heading_Published', 'a.state', $this->state->get('list.direction'), $this->state->get('list.ordering')); ?>
                    </th>
                    <th width="10%">
                        <?php echo JHtml::_('grid.sort',  'Xmap_Heading_Access', 'access_level', $this->state->get('list.direction'), $this->state->get('list.ordering')); ?>
                    </th>
                    <th width="10%" class="nowrap">
                        <?php echo JText::_('Xmap_Heading_Html_Stats'); ?><br />
                        (<?php echo JText::_('Xmap_Heading_Num_Links') . ' / '. JText::_('Xmap_Heading_Num_Hits') . ' / ' . JText::_('Xmap_Heading_Last_Visit'); ?>)
                    </th>
                    <th width="10%" class="nowrap">
                        <?php echo JText::_('Xmap_Heading_Xml_Stats'); ?><br />
                        <?php echo JText::_('Xmap_Heading_Num_Links') . '/'. JText::_('Xmap_Heading_Num_Hits') . '/' . JText::_('Xmap_Heading_Last_Visit'); ?>
                    </th>
                    <th width="1%" class="nowrap">
                        <?php echo JHtml::_('grid.sort', 'Xmap_Heading_ID', 'a.id', $this->state->get('list.direction'), $this->state->get('list.ordering')); ?>
                    </th>
                </tr>
            </thead>
            <tfoot>
                <tr>
                    <td colspan="15">
                        <?php echo $this->pagination->getListFooter(); ?>
                    </td>
                </tr>
            </tfoot>
            <tbody>
            <?php foreach ($this->items as $i => $item) :

                $now = JFactory::getDate()->toUnix();
                if ( !$item->lastvisit_html ) {
                    $htmlDate = JText::_('Date_Never');
                }elseif ( $item->lastvisit_html > ($now-3600)) { // Less than one hour
                    $htmlDate = JText::sprintf('Date_Minutes_Ago',intval(($now-$item->lastvisit_html)/60));
                } elseif ( $item->lastvisit_html > ($now-86400)) { // Less than one day
                    $hours = intval (($now-$item->lastvisit_html)/3600 );
                    $htmlDate = JText::sprintf('Date_Hours_Minutes_Ago',$hours,($now-($hours*3600)-$item->lastvisit_html)/60);
                } elseif ( $item->lastvisit_html > ($now-259200)) { // Less than three days
                    $days = intval(($now-$item->lastvisit_html)/86400);
                    $htmlDate = JText::sprintf('Date_Days_Hours_Ago',$days,intval(($now-($days*86400)-$item->lastvisit_html)/3600));
                } else {
                    $date = new JDate($item->lastvisit_html);
                    $htmlDate = $date->format('Y-m-d H:i');
                }

                if ( !$item->lastvisit_xml ) {
                    $xmlDate = JText::_('Date_Never');
                } elseif ( $item->lastvisit_xml > ($now-3600)) { // Less than one hour
                    $xmlDate = JText::sprintf('Date_Minutes_Ago',intval(($now-$item->lastvisit_xml)/60));
                } elseif ( $item->lastvisit_xml > ($now-86400)) { // Less than one day
                    $hours = intval (($now-$item->lastvisit_xml)/3600 );
                    $xmlDate = JText::sprintf('Date_Hours_Minutes_Ago',$hours,($now-($hours*3600)-$item->lastvisit_xml)/60);
                } elseif ( $item->lastvisit_xml > ($now-259200)) { // Less than three days
                    $days = intval(($now-$item->lastvisit_xml)/86400);
                    $xmlDate = JText::sprintf('Date_Days_Hours_Ago',$days,intval(($now-($days*86400)-$item->lastvisit_xml)/3600));
                } else {
                    $date = new JDate($item->lastvisit_xml);
                    $xmlDate = $date->format('Y-m-d H:i');
                }

            ?>
                <tr class="row<?php echo $i % 2; ?>">
                    <td class="center">
                        <?php echo JHtml::_('grid.id', $i, $item->id); ?>
                    </td>
                    <td>
                        <a href="<?php echo JRoute::_('index.php?option=com_xmap&task=sitemap.edit&id='.$item->id);?>">
                            <?php echo $this->escape($item->title); ?></a>
                            <?php if ($item->is_default == 1) : ?>
                                <?php if (version_compare($version->getShortVersion(), '3.0.0', '>=')): ?>
                                    <span class="icon-featured"></span>
                                <?php else: ?>
                                    <img src="templates/bluestork/images/menu/icon-16-default.png" alt="<?php echo JText::_('Default'); ?>" />
                                <?php endif; ?>
                            <?php endif; ?>
                                <?php if ($item->state): ?>
                                    <small>[<a href="<?php echo $baseUrl. 'index.php?option=com_xmap&amp;view=xml&tmpl=component&id='.$item->id; ?>" target="_blank" title="<?php echo JText::_('XMAP_XML_LINK_TOOLTIP',true); ?>"><?php echo JText::_('XMAP_XML_LINK'); ?></a>]</small>
                                    <small>[<a href="<?php echo $baseUrl. 'index.php?option=com_xmap&amp;view=xml&tmpl=component&news=1&id='.$item->id; ?>" target="_blank" title="<?php echo JText::_('XMAP_NEWS_LINK_TOOLTIP',true); ?>"><?php echo JText::_('XMAP_NEWS_LINK'); ?></a>]</small>
                                    <small>[<a href="<?php echo $baseUrl. 'index.php?option=com_xmap&amp;view=xml&tmpl=component&images=1&id='.$item->id; ?>" target="_blank" title="<?php echo JText::_('XMAP_IMAGES_LINK_TOOLTIP',true); ?>"><?php echo JText::_('XMAP_IMAGES_LINK'); ?></a>]</small>
                                <?php endif; ?>
                                     <br />
									 <small>(<?php echo $this->escape($item->alias); ?>)</small>
                    </td>
                    <td class="center">
                        <?php echo JHtml::_('jgrid.published', $item->state, $i, 'sitemaps.'); ?>
                    </td>
                    <td class="center">
                        <?php echo $this->escape($item->access_level); ?>
                    </td>
                    <td class="center">
                        <?php echo $item->count_html .' / '.$item->views_html. ' / ' . $htmlDate; ?>
                    </td>
                    <td class="center">
                        <?php echo $item->count_xml .' / '.$item->views_xml. ' / ' . $xmlDate; ?>
                    </td>
                    <td class="center">
                        <?php echo (int) $item->id; ?>
                    </td>
                </tr>
            <?php endforeach; ?>
            </tbody>
        </table>

        <input type="hidden" name="task" value="" />
        <input type="hidden" name="boxchecked" value="0" />
        <input type="hidden" name="filter_order" value="<?php echo $this->state->get('list.ordering'); ?>" />
        <input type="hidden" name="filter_order_Dir" value="<?php echo $this->state->get('list.direction'); ?>" />
        <?php echo JHtml::_('form.token'); ?>
    </div>
</form>
components/com_xmap/views/sitemaps/view.html.php000060400000007327152453623460016163 0ustar00<?php
/**
 * @version     $Id$
 * @copyright   Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 * @author      Guillermo Vargas (guille@vargas.co.cr)
 */

// no direct access
defined('_JEXEC') or die;

jimport('joomla.application.component.view');

# For compatibility with older versions of Joola 2.5
if (!class_exists('JViewLegacy')){
    class JViewLegacy extends JView {

    }
}

/**
 * @package     Xmap
 * @subpackage  com_xmap
 * @since       2.0
 */
class XmapViewSitemaps extends JViewLegacy
{
    protected $state;
    protected $items;
    protected $pagination;

    /**
     * Display the view
     */
    public function display($tpl = null)
    {
        if ($this->getLayout() !== 'modal') {
            XmapHelper::addSubmenu('sitemaps');
        }

        $this->state      = $this->get('State');
        $this->items      = $this->get('Items');
        $this->pagination = $this->get('Pagination');

        $version = new JVersion;

        $message = $this->get('ExtensionsMessage');
        if ( $message ) {
            JFactory::getApplication()->enqueueMessage($message);
        }

        // Check for errors.
        if (count($errors = $this->get('Errors'))) {
            JError::raiseError(500, implode("\n", $errors));
            return false;
        }

        // We don't need toolbar in the modal window.
        if ($this->getLayout() !== 'modal') {
            if (version_compare($version->getShortVersion(), '3.0.0', '<')) {
                $tpl = 'legacy';
            }
            $this->addToolbar();
        }

        parent::display($tpl);
    }

    /**
     * Display the toolbar
     *
     * @access      private
     */
    protected function addToolbar()
    {
        $state = $this->get('State');
        $doc = JFactory::getDocument();
        $version = new JVersion;

        JToolBarHelper::addNew('sitemap.add');
        JToolBarHelper::custom('sitemap.edit', 'edit.png', 'edit_f2.png', 'JTOOLBAR_EDIT', true);

        $doc->addStyleDeclaration('.icon-48-sitemap {background-image: url(components/com_xmap/images/sitemap-icon.png);}');
        JToolBarHelper::title(JText::_('XMAP_SITEMAPS_TITLE'), 'sitemap.png');
        JToolBarHelper::custom('sitemaps.publish', 'publish.png', 'publish_f2.png', 'JTOOLBAR_Publish', true);
        JToolBarHelper::custom('sitemaps.unpublish', 'unpublish.png', 'unpublish_f2.png', 'JTOOLBAR_UNPUBLISH', true);

        if (version_compare($version->getShortVersion(), '3.0.0', '>=')) {
            JToolBarHelper::custom('sitemaps.setdefault', 'featured.png', 'featured_f2.png', 'XMAP_TOOLBAR_SET_DEFAULT', true);
        } else {
            JToolBarHelper::custom('sitemaps.setdefault', 'default.png', 'default_f2.png', 'XMAP_TOOLBAR_SET_DEFAULT', true);
        }
        if ($state->get('filter.published') == -2) {
            JToolBarHelper::deleteList('', 'sitemaps.delete','JTOOLBAR_DELETE');
        }
        else {
            JToolBarHelper::trash('sitemaps.trash','JTOOLBAR_TRASH');
        }
        JToolBarHelper::divider();


        if (class_exists('JHtmlSidebar')){
            JHtmlSidebar::addFilter(
                JText::_('JOPTION_SELECT_PUBLISHED'),
                'filter_published',
                JHtml::_('select.options', JHtml::_('jgrid.publishedOptions'), 'value', 'text', $this->state->get('filter.published'), true)
            );

            JHtmlSidebar::addFilter(
                JText::_('JOPTION_SELECT_ACCESS'),
                'filter_access',
                JHtml::_('select.options', JHtml::_('access.assetgroups'), 'value', 'text', $this->state->get('filter.access'))
            );

            $this->sidebar = JHtmlSidebar::render();
        }
    }
}
components/com_xmap/views/sitemaps/index.html000060400000000036152453623460015520 0ustar00<!DOCTYPE html><title></title>components/com_xmap/css/index.html000060400000000036152453623460013326 0ustar00<!DOCTYPE html><title></title>components/com_xmap/css/xmap.css000060400000001055152453623460013012 0ustar00.xmap-menu-options {
    border-bottom: 1px solid #CCC;
    padding:10px;
}
.xmap-menu-options label {
    cursor:move;
}
.xmap-menu-options input, .xmap-menu-options select {
    margin: 5px 5px 2px 0px;
}
ul.ul_sortable {
    list-style:none;
    margin:0;
    padding:0;
}
ul.ul_sortable li {
    cursor:move;
    background-color: #eee;
    margin:5px;
    padding: 5px;
}
ul.ul_sortable li label.menu_label {
    font-weight: bold;
    display: inline-block;
    margin-bottom: 0px;
}
ul.ul_sortable input[type="checkbox"] {
    margin: 0 3px 0 3px;
}
components/com_xmap/images/xmap-favicon.png000060400000001450152453623460015105 0ustar00�PNG


IHDR�atEXtSoftwareAdobe ImageReadyq�e<�IDATxڤS_HSQ�νww��]��ڒ�E5S�2�R�(����@�����z�=,��-�!,�/F�6����Z]��N�{w�m�}g��=z�9���~��;�0���f��a`v!Q�o��6gqI&���B@�4�AG�-1�~e�^�t�m��F�’تh:�3+
h���b6�p}��	i#*����/�ƃU�@8:
݁A ���Q m�5�Y��q��x��H)�Q2� ?�Dz�9��x��Q���!|���t2��V��c:��$���1��2��tvk�X��QX�_:��{\��dJ�������`hj*}���*l�hHM�{np��z[����œ��?$E�$�dE^����Yx�y�����Խ��_6U�У�1\r�n���A �f�
�%���eI��v��rj�88�~dYWC�_K)��ClI��<U�J�f�5�}����Ŕr%���o�!*G&�j'��<�t��s���95������*r"��UO��!��r`*w�k���f�;{�#-#�3^���=�s;����>z<�Z���;8i1��ND��:k�)�w?!)��{��L�>�뾡}߆�E�-)�-v�r_���<	Q~��+X�=��:ʗ>Yu��g�ˢz:��CV5�(�k>�G���{z�t9�@A�����
�"W�~�lO�4E}>��~��5Jȿ�-�IEND�B`�components/com_xmap/images/sitemap-icon.png000060400000000753152453623460015112 0ustar00�PNG


IHDR00W��tEXtSoftwareAdobe ImageReadyq�e<�IDATx�b���?�PLC�z`��<~�����/��� ���Hw|����QD=��u-dy���RH#����9��ģ�Rl�ZAP�_v�h�,���Ih4	����
�,���Cέh$K#�]ʛϾRܨS��&�9�H�>��/�_��̶3Rc�U��Л��G3��.�~���oYt��-��*1y��<�@Z�"��쬚8�<rtX��A�L�B|�������o��g����sj!���0#Q�6��RRzr�T?����LLf����f'QC7����h�P�5TM[�����S��Yk���J[�D���Ę�����V�T����5.ȱ�b�0�X�#�%+Sڰ�����F=0R=��&K���0��5�h���G��/��FIEND�B`�components/com_xmap/images/index.html000060400000000036152453623460014003 0ustar00<!DOCTYPE html><title></title>components/com_xmap/elements/index.html000060400000000036152453623460014352 0ustar00<!DOCTYPE html><title></title>components/com_xmap/elements/sitemap.php000060400000001576152453623460014542 0ustar00<?php
/**
 * @version     $Id$
 * @copyright   Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 * @author      Guillermo Vargas (guille@vargas.co.cr)
 */
 
// no direct access
defined('_JEXEC') or die;

class JElementSitemap extends JElement
{
    /**
     * Element name
     *
     * @var    string
     */
    var $_name = 'Sitemap';

    public function fetchElement($name, $value, &$node, $control_name)
    {
        global $mainframe;

        $db        = JFactory::getDBO();
        $fieldName = $control_name.'['.$name.']';
        
        $sql = "SELECT id, name from #__xmap_sitemap order by name";
        $db->setQuery($sql);
        $rows = $db->loadObjectList();

        $html = JHTML::_('select.genericlist',$rows,$fieldName,'','id','name',$value);

        return $html;
    }

}
components/com_xmap/controller.php000060400000007227152453623460013446 0ustar00<?php
/**
 * @version     $Id$
 * @copyright   Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 * @author      Guillermo Vargas (guille@vargas.co.cr)
 */
// no direct access
defined('_JEXEC') or die;

jimport('joomla.application.component.controller');

/**
 * Component Controller
 *
 * @package     Xmap
 * @subpackage  com_xmap
 */
class XmapController extends JControllerLegacy
{

    function __construct()
    {
        parent::__construct();

        $this->registerTask('navigator-links', 'navigatorLinks');
    }

    /**
     * Display the view
     */
    public function display($cachable = false, $urlparams = false)
    {
        require_once JPATH_COMPONENT . '/helpers/xmap.php';

        // Get the document object.
        $document = JFactory::getDocument();

        // Set the default view name and format from the Request.
        $vName = JRequest::getWord('view', 'sitemaps');
        $vFormat = $document->getType();
        $lName = JRequest::getWord('layout', 'default');

        // Get and render the view.
        if ($view = $this->getView($vName, $vFormat)) {
            // Get the model for the view.
            $model = $this->getModel($vName);

            // Push the model into the view (as default).
            $view->setModel($model, true);
            $view->setLayout($lName);

            // Push document object into the view.
            $view->assignRef('document', $document);

            $view->display();

        }
    }

    function navigator()
    {
        $db = JFactory::getDBO();
        $document = JFactory::getDocument();
        $app = JFactory::getApplication('administrator');

        $id = JRequest::getInt('sitemap', 0);
        $link = urldecode(JRequest::getVar('link', ''));
        $name = JRequest::getCmd('e_name', '');
        if (!$id) {
            $id = $this->getDefaultSitemapId();
        }

        if (!$id) {
            JError::raiseWarning(500, JText::_('Xmap_Not_Sitemap_Selected'));
            return false;
        }

        $app->setUserState('com_xmap.edit.sitemap.id', $id);

        $view = $this->getView('sitemap', $document->getType());
        $model = $this->getModel('Sitemap');
        $view->setLayout('navigator');
        $view->setModel($model, true);

        // Push document object into the view.
        $view->assignRef('document', $document);

        $view->navigator();
    }

    function navigatorLinks()
    {

        $db = JFactory::getDBO();
        $document = JFactory::getDocument();
        $app = JFactory::getApplication('administrator');

        $id = JRequest::getInt('sitemap', 0);
        $link = urldecode(JRequest::getVar('link', ''));
        $name = JRequest::getCmd('e_name', '');
        if (!$id) {
            $id = $this->getDefaultSitemapId();
        }

        if (!$id) {
            JError::raiseWarning(500, JText::_('Xmap_Not_Sitemap_Selected'));
            return false;
        }

        $app->setUserState('com_xmap.edit.sitemap.id', $id);

        $view = $this->getView('sitemap', $document->getType());
        $model = $this->getModel('Sitemap');
        $view->setLayout('navigator');
        $view->setModel($model, true);

        // Push document object into the view.
        $view->assignRef('document', $document);

        $view->navigatorLinks();
    }

    private function getDefaultSitemapId()
    {
        $db = JFactory::getDBO();
        $query  = $db->getQuery(true);
        $query->select('id');
        $query->from($db->quoteName('#__xmap_sitemap'));
        $query->where('is_default=1');
        $db->setQuery($query);
        return $db->loadResult();
    }

}components/com_xmap/xmap.xml000060400000007651152453623460012242 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension method="upgrade" version="1.5" type="component">
    <name>com_xmap</name>
    <creationDate>2013-11-10</creationDate>
    <author>Guillermo Vargas</author>
    <copyright>This component is released under the GNU/GPL License</copyright>
    <authorEmail>guille@vargas.co.cr</authorEmail>
    <authorUrl>http://www.jooxmap.com</authorUrl>
    <version>2.3.4</version>
    <license>GNU/GPL</license>
    <description>COM_XMAP_XML_DESC</description>
    <install folder="admin">
        <sql>
            <file driver="mysql" charset="utf8">install/install.utf8.sql</file>
            <file driver="postgresql" charset="utf8">install/install.postgresql.sql</file>
        </sql>
    </install>
    <uninstall>
        <sql>
            <file driver="mysql" charset="utf8">install/uninstall.utf8.sql</file>
            <file driver="postgresql" charset="utf8">install/uninstall.postgresql.sql</file>
        </sql>
    </uninstall>
    <files folder="front">
        <filename>controller.php</filename>
        <filename>displayer.php</filename>
        <filename>index.html</filename>
        <filename>metadata.xml</filename>
        <filename>router.php</filename>
        <filename>xmap.php</filename>
        <folder>assets</folder>
        <folder>controllers</folder>
        <folder>helpers</folder>
        <folder>models</folder>
        <folder>views</folder>
    </files>
    <languages folder="front/language">
        <language tag="en-GB">en-GB.com_xmap.ini</language>
        <language tag="es-ES">es-ES.com_xmap.ini</language>
        <language tag="fa-IR">fa-IR.com_xmap.ini</language>
        <language tag="fr-FR">fr-FR.com_xmap.ini</language>
        <language tag="cs-CZ">cs-CZ.com_xmap.ini</language>
        <language tag="nl-NL">nl-NL.com_xmap.ini</language>
        <language tag="ru-RU">ru-RU.com_xmap.ini</language>
    </languages>
    <images folder="admin">
        <folder>images</folder>
    </images>
    <administration>
        <menu img="components/com_xmap/images/xmap-favicon.png">COM_XMAP_TITLE</menu>
        <files folder="admin">
            <filename>xmap.php</filename>
            <filename>controller.php</filename>
            <filename>index.html</filename>
            <filename>LICENSE.txt</filename>
            <folder>css</folder>
            <folder>elements</folder>
            <folder>images</folder>
            <folder>install</folder>
            <folder>helpers</folder>
            <folder>controllers</folder>
            <folder>tables</folder>
            <folder>views</folder>
            <folder>models</folder>
        </files>
        <languages folder="admin/language">
            <language tag="en-GB">en-GB/en-GB.com_xmap.ini</language>
            <language tag="en-GB">en-GB/en-GB.com_xmap.sys.ini</language>
            <language tag="es-ES">es-ES/es-ES.com_xmap.ini</language>
            <language tag="es-ES">es-ES/es-ES.com_xmap.sys.ini</language>
            <language tag="fa-IR">fa-IR/fa-IR.com_xmap.ini</language>
            <language tag="fa-IR">fa-IR/fa-IR.com_xmap.sys.ini</language>
            <language tag="fr-FR">fr-FR/fr-FR.com_xmap.ini</language>
            <language tag="fr-FR">fr-FR/fr-FR.com_xmap.sys.ini</language>
			<language tag="cs-CZ">cs-CZ/cs-CZ.com_xmap.ini</language>
            <language tag="cs-CZ">cs-CZ/cs-CZ.com_xmap.sys.ini</language>
            <language tag="nl-NL">nl-NL/nl-NL.com_xmap.ini</language>
            <language tag="nl-NL">nl-NL/nl-NL.com_xmap.sys.ini</language>
            <language tag="ru-RU">ru-RU/ru-RU.com_xmap.ini</language>
            <language tag="ru-RU">ru-RU/ru-RU.com_xmap.sys.ini</language>
        </languages>
        <images folder="admin">
            <folder>images</folder>
        </images>
    </administration>
    <updateservers>
        <server type="extension" priority="1" name="Xmap Update Site">https://raw.github.com/guilleva/Xmap/master/xmap-update.xml</server>
    </updateservers>
</extension>
components/com_xmap/index.html000060400000000036152453623460012536 0ustar00<!DOCTYPE html><title></title>components/com_xmap/xmap.php000060400000001634152453623460012224 0ustar00<?php
/**
 * @version       $Id$
 * @copyright     Copyright (C) 2007 - 2009 Joomla! Vargas. All rights reserved.
 * @license       GNU General Public License version 2 or later; see LICENSE.txt
 * @author        Guillermo Vargas (guille@vargas.co.cr)
 */

// no direct access
defined('_JEXEC') or die;

JTable::addIncludePath( JPATH_COMPONENT.'/tables' );

jimport('joomla.form.form');
JForm::addFieldPath( JPATH_COMPONENT.'/models/fields' );

// Register helper class
JLoader::register('XmapHelper', dirname(__FILE__) . '/helpers/xmap.php');

// Include dependancies
jimport('joomla.application.component.controller');

# For compatibility with older versions of Joola 2.5
if (!class_exists('JControllerLegacy')){
    class JControllerLegacy extends JController {

    }
}

$controller = JControllerLegacy::getInstance('Xmap');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();cache/index.html000060400000000037152453623460007612 0ustar00<!DOCTYPE html><title></title>
cache/com_akeeba/compiled_templates/ab19ecf877fd1c01445a71e9d82339b2bfd6ac97.php000064400000002153152453623460022065 0ustar00<?php /* /home/wuectly/www/administrator/components/com_akeeba/tmpl/ControlPanel/oneclick.blade.php */ ?>
<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

?>
<section class="akeeba-panel--primary">

    <header class="akeeba-block-header">
        <h3><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_HEADER_QUICKBACKUP'); ?></h3>
    </header>

    <div class=" akeeba-grid">
	    <?php foreach($this->quickIconProfiles as $qiProfile): ?>
            <a class="akeeba-action--green"
               href="index.php?option=com_akeeba&view=Backup&autostart=1&profileid=<?php echo (int) $qiProfile->id; ?>&<?php echo $this->container->platform->getToken(true); ?>=1">
                <span class="akion-play"></span>
                <span><?php echo $this->escape($qiProfile->description); ?></span>
            </a>
	    <?php endforeach; ?>
    </div>

</section>
cache/com_akeeba/compiled_templates/5489815a7b347e8121074d07ce6143ad64254436.php000064400000005322152453623460021177 0ustar00<?php /* /home/wuectly/www/administrator/components/com_akeeba/tmpl/ControlPanel/sidebar_status.blade.php */ ?>
<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

?>
<div class="akeeba-panel">
    <header class="akeeba-block-header">
        <h3><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_LABEL_STATUSSUMMARY'); ?></h3>
    </header>

    <div>
        <?php /* Backup status summary */ ?>
        <?php echo $this->statusCell; ?>


        <?php /* Warnings */ ?>
        <?php if($this->countWarnings): ?>
            <div>
                <?php echo $this->detailsCell; ?>

            </div>
            <hr />
        <?php endif; ?>

        <?php /* Version */ ?>
        <p class="ak_version">
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA'); ?> <?php echo AKEEBA_PRO ? 'Professional ' : 'Core';; ?> <?php echo AKEEBA_VERSION; ?> (<?php echo AKEEBA_DATE; ?>)
        </p>

        <?php /* Changelog */ ?>
        <a href="#" id="btnchangelog" class="akeeba-btn--primary">CHANGELOG</a>

        <div id="akeeba-changelog" tabindex="-1" role="dialog" aria-hidden="true" style="display:none;">
            <div class="akeeba-renderer-fef">
                <div class="akeeba-panel--info">
                    <header class="akeeba-block-header">
                        <h3>
                            <?php echo \Joomla\CMS\Language\Text::_('CHANGELOG'); ?>
                        </h3>
                    </header>
                    <div id="DialogBody">
                        <?php echo $this->formattedChangelog; ?>

                    </div>
                </div>
            </div>
        </div>

        <?php /* Donation CTA */ ?>
        <?php if( ! (AKEEBA_PRO)): ?>
            <a
                    href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=KDVQPB4EREBPY&source=url"
                    class="akeeba-btn-green">
                Donate via PayPal
            </a>
        <?php endif; ?>

        <?php /* Pro upsell */ ?>
        <?php if(!AKEEBA_PRO && (time() - $this->lastUpsellDismiss < 1296000)): ?>
            <p style="margin: 0.5em 0">
                <a href="https://www.akeeba.com/landing/akeeba-backup.html"
                   class="akeeba-btn--ghost--small">
                    <span class="aklogo-backup-j"></span>
                    <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CONTROLPANEL_BTN_LEARNMORE'); ?>
                </a>
            </p>
        <?php endif; ?>
    </div>
</div>
cache/com_akeeba/compiled_templates/3c3dbe0e604928a91d90ad125121adf3262a5888.php000064400000035004152453623460021540 0ustar00<?php /* /home/wuectly/www/administrator/components/com_akeeba/tmpl/Manage/default.blade.php */ ?>
<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') || die();

/** @var  \Akeeba\Backup\Admin\View\Manage\Html $this */

\AkeebaFEFHelper::loadFEFScript('Tooltip');
?>
<?php echo \Joomla\CMS\HTML\HTMLHelper::_('formbehavior.chosen'); ?>

<?php if(class_exists('Joomla\CMS\Component\ComponentHelper') && \Joomla\CMS\Component\ComponentHelper::isEnabled('com_akeebabackup')): ?>
    <?php echo $this->loadAnyTemplate('admin:com_akeeba/ControlPanel/backup8_uninstall'); ?>
	<?php return; ?>
<?php elseif(version_compare(JVERSION, '3.999.999', 'gt')): ?>
    <?php echo $this->loadAnyTemplate('admin:com_akeeba/ControlPanel/backup9_install'); ?>
<?php endif; ?>

<div id="akeebaBackup8Wrapper">
    <?php if($this->promptForBackupRestoration && version_compare(JVERSION, '3.999.999', 'le')): ?>
        <?php echo $this->loadAnyTemplate('admin:com_akeeba/Manage/howtorestore_modal'); ?>
    <?php endif; ?>

    <div class="akeeba-block--info">
        <h4><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LABEL_HOWDOIRESTORE_LEGEND'); ?></h4>
        <p>
            <?php echo \Joomla\CMS\Language\Text::sprintf('COM_AKEEBA_BUADMIN_LABEL_HOWDOIRESTORE_TEXT_' . (AKEEBA_PRO ? 'PRO' : 'CORE'), 'http://akee.ba/abrestoreanywhere', 'index.php?option=com_akeeba&view=Transfer', 'https://www.akeeba.com/latest-kickstart-core.zip'); ?>
        </p>
        <p>
            <?php if(!AKEEBA_PRO): ?>
                <?php echo \Joomla\CMS\Language\Text::sprintf('COM_AKEEBA_BUADMIN_LABEL_HOWDOIRESTORE_TEXT_CORE_INFO_ABOUT_PRO', 'https://www.akeeba.com/products/akeeba-backup.html'); ?>
            <?php endif; ?>
        </p>
    </div>

    <div id="j-main-container">
        <form action="index.php" method="post" name="adminForm" id="adminForm" class="akeeba-form">

            <section class="akeeba-panel--33-66 akeeba-filter-bar-container">
                <div class="akeeba-filter-bar akeeba-filter-bar--left akeeba-form-section akeeba-form--inline">
                    <div class="akeeba-filter-element akeeba-form-group">
                        <input type="text" name="description" placeholder="<?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LABEL_DESCRIPTION'); ?>"
                                id="filter_description"
                                value="<?php echo $this->escape($this->fltDescription); ?>"
                                title="<?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LABEL_DESCRIPTION'); ?>" />
                    </div>

                    <div class="akeeba-filter-element akeeba-form-group akeeba-filter-joomlacalendarfix">
                        <?php if(version_compare(JVERSION, '3.999.999', 'le')): ?>
                            <?php echo \Joomla\CMS\HTML\HTMLHelper::_('calendar', $this->fltFrom, 'from', 'from', '%Y-%m-%d', array('class' => 'input-small')); ?>
                        <?php else: ?>
                            <input
                                    type="datetime-local"
                                    pattern="[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}"
                                    name="from"
                                    id="from"
                                    value="<?php echo $this->escape($this->fltFrom); ?>"
                            >
                        <?php endif; ?>
                    </div>

                    <div class="akeeba-filter-element akeeba-form-group akeeba-filter-joomlacalendarfix">
                        <?php if(version_compare(JVERSION, '3.999.999', 'le')): ?>
                            <?php echo \Joomla\CMS\HTML\HTMLHelper::_('calendar', $this->fltTo, 'to', 'to', '%Y-%m-%d', array('class' => 'input-small')); ?>
                        <?php else: ?>
                            <input
                                    type="datetime-local"
                                    pattern="[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}"
                                    name="to"
                                    id="to"
                                    value="<?php echo $this->escape($this->fltTo); ?>"
                            >
                        <?php endif; ?>
                    </div>

                    <div class="akeeba-filter-element akeeba-form-group">
                        <button class="akeeba-btn--grey akeeba-btn--icon-only akeeba-btn--small akeeba-hidden-phone"
                                type="submit" title="<?php echo \Joomla\CMS\Language\Text::_('JSEARCH_FILTER_SUBMIT'); ?>">
                            <span class="akion-search"></span>
                        </button>
                    </div>

                    <div class="akeeba-filter-element akeeba-form-group">
                        <?php /* Joomla 3.x: Chosen does not work with attached event handlers, only with inline event scripts (e.g. onchange) */ ?>
                        <?php echo \Joomla\CMS\HTML\HTMLHelper::_('select.genericlist', $this->profilesList, 'profile', ['list.select' => $this->fltProfile, 'list.attr' => ['class' => 'advancedSelect', 'onchange' => 'document.forms.adminForm.submit();'], 'id' => 'comAkeebaManageProfileSelector']); ?>
                    </div>

                    <div class="akeeba-filter-element akeeba-form-group">
                        <?php /* Joomla 3.x: Chosen does not work with attached event handlers, only with inline event scripts (e.g. onchange) */ ?>
                        <?php echo \Joomla\CMS\HTML\HTMLHelper::_('select.genericlist', $this->frozenList, 'frozen', ['list.select' => $this->fltFrozen, 'list.attr' => ['class' => 'advancedSelect', 'onchange' => 'document.forms.adminForm.submit();'], 'id' => 'comAkeebaManageFrozenSelector']); ?>
                    </div>
                </div>

                <div class="akeeba-filter-bar akeeba-filter-bar--right">
                    <?php echo \Joomla\CMS\HTML\HTMLHelper::_('FEFHelp.browse.orderheader', null, $this->sortFields, $this->getPagination(), $this->lists->order, $this->lists->order_Dir); ?>
                </div>
            </section>

            <table class="akeeba-table akeeba-table--striped" id="itemsList">
                <thead>
                <tr>
                    <th width="32">
                        <?php echo \Joomla\CMS\HTML\HTMLHelper::_('FEFHelp.browse.checkall'); ?>
                    </th>
                    <th width="48" class="akeeba-hidden-phone">
                        <?php echo \FOF40\Html\FEFHelper\BrowseView::sortGrid('id', 'COM_AKEEBA_BUADMIN_LABEL_ID') ?>
                    </th>
                    <th>
                        <?php echo \FOF40\Html\FEFHelper\BrowseView::sortGrid('frozen', 'COM_AKEEBA_BUADMIN_LABEL_FROZEN') ?>
                    </th>
                    <th>
                        <?php echo \FOF40\Html\FEFHelper\BrowseView::sortGrid('description', 'COM_AKEEBA_BUADMIN_LABEL_DESCRIPTION') ?>
                    </th>
                    <th class="akeeba-hidden-phone">
                        <?php echo \FOF40\Html\FEFHelper\BrowseView::sortGrid('profile_id', 'COM_AKEEBA_BUADMIN_LABEL_PROFILEID') ?>
                    </th>
                    <th width="80">
                        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LABEL_DURATION'); ?>
                    </th>
                    <th width="40">
                        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LABEL_STATUS'); ?>
                    </th>
                    <th width="80" class="akeeba-hidden-phone">
                        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LABEL_SIZE'); ?>
                    </th>
                    <th class="akeeba-hidden-phone">
                        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LABEL_MANAGEANDDL'); ?>
                    </th>
                </tr>
                </thead>
                <tfoot>
                <tr>
                    <td colspan="11" class="center">
                        <?php echo $this->pagination->getListFooter(); ?>

                    </td>
                </tr>
                </tfoot>
                <tbody>
                <?php if(empty($this->items)): ?>
                    <tr>
                        <td colspan="11" class="center">
                            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_STATUS_NONE'); ?>
                        </td>
                    </tr>
                <?php endif; ?>
                <?php if( ! (empty($this->items))): ?>
					<?php $id = 1; $i = 0; ?>
                    <?php foreach($this->items as $record): ?>
						<?php
						$id = 1 - $id;
						[$originDescription, $originIcon] = $this->getOriginInformation($record);
						[$startTime, $duration, $timeZoneText] = $this->getTimeInformation($record);
						[$statusClass, $statusIcon] = $this->getStatusInformation($record);
						$profileName = $this->getProfileName($record);

						$frozenIcon  = 'akion-waterdrop';
						$frozenTask  = 'freeze';
						$frozenTitle = \JText::_('COM_AKEEBA_BUADMIN_LABEL_ACTION_FREEZE');

						if ($record['frozen'])
						{
							$frozenIcon  = 'akion-ios-snowy';
							$frozenTask  = 'unfreeze';
							$frozenTitle = \JText::_('COM_AKEEBA_BUADMIN_LABEL_ACTION_UNFREEZE');
						}
						?>
                        <tr class="row<?php echo $id; ?>">
                            <td><?php echo \Joomla\CMS\HTML\HTMLHelper::_('grid.id', ++$i, $record['id']); ?></td>
                            <td class="akeeba-hidden-phone">
                                <?php echo $this->escape($record['id']); ?>

                            </td>
                            <td>
                                <a href="#" onclick="return Joomla.listItemTask('cb<?php echo $i; ?>', '<?php echo $frozenTask; ?>')" title="<?php echo $frozenTitle; ?>">
                                    <span class="<?php echo $frozenIcon; ?>"></span>
                                </a>
                            </td>
                            <td>
						<span class="<?php echo $originIcon; ?> akeebaCommentPopover" rel="popover"
                                title="<?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LABEL_ORIGIN'); ?>"
                                data-content="<?php echo $this->escape($originDescription); ?>"></span>
                                <?php if( ! (empty($record['comment']))): ?>
                                    <span class="akion-help-circled akeebaCommentPopover" rel="popover"
                                            data-content="<?php echo $this->escape($record['comment']); ?>"></span>
                                <?php endif; ?>
                                <a href="<?php echo $this->escape(JUri::base()); ?>index.php?option=com_akeeba&view=Manage&task=showcomment&id=<?php echo $this->escape($record['id']); ?>">
                                    <?php echo $this->escape(empty($record['description']) ? JText::_('COM_AKEEBA_BUADMIN_LABEL_NODESCRIPTION') : $record['description']); ?>


                                </a>
                                <br />
                                <div class="akeeba-buadmin-startdate" title="<?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LABEL_START'); ?>">
                                    <small>
                                        <span class="akion-calendar"></span>
                                        <?php echo $this->escape($startTime); ?> <?php echo $this->escape($timeZoneText); ?>

                                    </small>
                                </div>
                            </td>
                            <td class="akeeba-hidden-phone">
                                #<?php echo $this->escape((int)$record['profile_id']); ?>. <?php echo $this->escape($profileName); ?>


                                <br />
                                <small>
                                    <em><?php echo $this->escape($this->translateBackupType($record['type'])); ?></em>
                                </small>
                            </td>
                            <td>
                                <?php echo $this->escape($duration); ?>

                            </td>
                            <td>
						<span class="<?php echo $statusClass; ?> akeebaCommentPopover" rel="popover"
                                title="<?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LABEL_STATUS'); ?>"
                                data-content="<?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LABEL_STATUS_' . $record['meta']); ?>">
							<span class="<?php echo $statusIcon; ?>"></span>
						</span>
                            </td>
                            <td class="akeeba-hidden-phone">
                                <?php if($record['meta'] == 'ok'): ?>
                                    <?php echo $this->escape($this->formatFilesize($record['size'])); ?>


                                <?php elseif($record['total_size'] > 0): ?>
                                    <i><?php echo $this->formatFilesize($record['total_size']); ?></i>
                                    <?php else: ?>
                                    &mdash;
                                <?php endif; ?>
                            </td>
                            <td class="akeeba-hidden-phone">
                                <?php echo $this->loadAnyTemplate('admin:com_akeeba/Manage/manage_column', ['record' => &$record]); ?>
                            </td>
                        </tr>
                    <?php endforeach; ?>
                <?php endif; ?>
                </tbody>
            </table>

            <div class="akeeba-hidden-fields-container">
                <input type="hidden" name="option" id="option" value="com_akeeba" />
                <input type="hidden" name="view" id="view" value="Manage" />
                <input type="hidden" name="boxchecked" id="boxchecked" value="0" />
                <input type="hidden" name="task" id="task" value="default" />
                <input type="hidden" name="filter_order" id="filter_order" value="<?php echo $this->escape($this->lists->order); ?>" />
                <input type="hidden" name="filter_order_Dir" id="filter_order_Dir" value="<?php echo $this->escape($this->lists->order_Dir); ?>" />
                <input type="hidden" name="<?php echo $this->container->platform->getToken(true); ?>" value="1" />
            </div>
        </form>
    </div>
</div>cache/com_akeeba/compiled_templates/2cbf7df740a76d63e3d29806d05b3af94b17d91e.php000064400000004002152453623460021775 0ustar00<?php /* /home/wuectly/www/administrator/components/com_akeeba/tmpl/ControlPanel/profile.blade.php */ ?>
<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

/**
 * Call this template with:
 * [
 * 	'returnURL' => 'index.php?......'
 * ]
 * to set up a custom return URL
 */
?>
<?php echo \Joomla\CMS\HTML\HTMLHelper::_('formbehavior.chosen'); ?>

<div class="akeeba-panel">
	<form action="index.php" method="post" name="switchActiveProfileForm" id="switchActiveProfileForm" class="akeeba-form--inline">
		<input type="hidden" name="option" value="com_akeeba" />
		<input type="hidden" name="view" value="ControlPanel" />
		<input type="hidden" name="task" value="SwitchProfile" />
		<?php if(isset($returnURL)): ?>
		<input type="hidden" name="returnurl" value="<?php echo $returnURL; ?>" />
		<?php endif; ?>
		<input type="hidden" name="<?php echo $this->container->platform->getToken(true); ?>" value="1" />

		<div class="akeeba-form-group">
			<label>
				<?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_PROFILE_TITLE'); ?>: #<?php echo $this->profileId; ?>

			</label>

			<?php /* Joomla 3.x: Chosen does not work with attached event handlers, only with inline event scripts (e.g. onchange) */ ?>
			<?php echo \Joomla\CMS\HTML\HTMLHelper::_('select.genericlist', $this->profileList, 'profileid', ['list.select' => $this->profileId, 'id' => 'comAkeebaControlPanelProfileSwitch', 'list.attr' => ['class' => 'advancedSelect', 'onchange' => 'document.forms.switchActiveProfileForm.submit();']]); ?>
		</div>

		<div class="akeeba-form-group--actions">
			<button class="akeeba-btn akeeba-hidden-phone" type="submit">
				<span class="akion-forward"></span>
				<?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_PROFILE_BUTTON'); ?>
			</button>
		</div>
	</form>
</div>
cache/com_akeeba/compiled_templates/b58189968c6320cc93735b85e831172e1e0eecbd.php000064400000027150152453623460021575 0ustar00<?php /* /home/wuectly/www/administrator/components/com_akeeba/tmpl/ControlPanel/warnings.blade.php */ ?>
<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

$cloudFlareTestFile = 'CLOUDFLARE::' . $this->getContainer()->template->parsePath('media://com_akeeba/js/ControlPanel.min.js');
$cloudFlareTestFile .= '?' . $this->getContainer()->mediaVersion;

?>

<?php /* Configuration Wizard pop-up */ ?>
<?php if($this->promptForConfigurationWizard): ?>
    <?php echo $this->loadAnyTemplate('admin:com_akeeba/Configuration/confwiz_modal'); ?>
<?php endif; ?>

<?php /* Stuck database updates warning */ ?>
<?php if($this->stuckUpdates): ?>
    <div class="akeeba-block--warning">
        <p>
            <?php echo \Joomla\CMS\Language\Text::sprintf('COM_AKEEBA_CPANEL_ERR_UPDATE_STUCK', $this->getContainer()->db->getPrefix(), 'index.php?option=com_akeeba&view=ControlPanel&task=forceUpdateDb'); ?>
        </p>
    </div>
<?php endif; ?>

<?php /* Potentially web accessible output directory */ ?>
<?php if($this->isOutputDirectoryUnderSiteRoot): ?>
    <!--
    Oh, hi there! It looks like you got curious and are peeking around your browser's developer tools – or just the
    source code of the page that loaded on your browser. Cool! May I explain what we are seeing here?

    Just to let you know, the next three DIVs (outDirSystem, insecureOutputDirectory and missingRandomFromFilename) are
    HIDDEN and their existence doesn't mean that your site has an insurmountable security issue. To the contrary.
    Whenever Akeeba Backup detects that the backup output directory is under your site's root it will CHECK its security
    i.e. if it's really accessible over the web. This check is performed with an AJAX call to your browser so if it
    takes forever or gets stuck you won't see a frustrating blank page in your browser. If AND ONLY IF a problem is
    detected said JavaScript will display one of the following DIVs, depending on what is applicable.

    So, to recap. These hidden DIVs? They don't indicate a problem with your site. If one becomes visible then – and
    ONLY then – should you do something about it, as instructed. But thank you for being curious. Curiosity is how you
    get involved with and better at web development. Stay curious!
    -->
    <?php /* Web accessible output directory that coincides with or is inside in a CMS system folder */ ?>
    <details class="akeeba-block--failure" id="outDirSystem" style="display: none">
        <summary><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_HEAD_OUTDIR_INVALID'); ?></summary>
        <p>
            <?php echo \Joomla\CMS\Language\Text::sprintf('COM_AKEEBA_CPANEL_LBL_OUTDIR_LISTABLE', realpath($this->getModel()->getOutputDirectory())); ?>
        </p>
        <p>
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_LBL_OUTDIR_ISSYSTEM'); ?>
        </p>
        <p>
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_LBL_OUTDIR_ISSYSTEM_FIX'); ?>
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_LBL_OUTDIR_DELETEORBEHACKED'); ?>
        </p>
    </details>

    <?php /* Output directory can be listed over the web */ ?>
    <details class="akeeba-block--<?php echo $this->hasOutputDirectorySecurityFiles ? 'failure' : 'warning'; ?>" id="insecureOutputDirectory" style="display: none">
        <summary>
            <?php if($this->hasOutputDirectorySecurityFiles): ?>
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_HEAD_OUTDIR_UNFIXABLE'); ?>
            <?php else: ?>
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_HEAD_OUTDIR_INSECURE'); ?>
            <?php endif; ?>
        </summary>
        <p>
            <?php echo \Joomla\CMS\Language\Text::sprintf('COM_AKEEBA_CPANEL_LBL_OUTDIR_LISTABLE', realpath($this->getModel()->getOutputDirectory())); ?>
        </p>
        <?php if(!$this->hasOutputDirectorySecurityFiles): ?>
        <p>
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_LBL_OUTDIR_CLICKTHEBUTTON'); ?>
        </p>
        <p>
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_LBL_OUTDIR_FIX_SECURITYFILES'); ?>
        </p>

        <form action="index.php" method="POST" class="akeeba-form--inline">
            <input type="hidden" name="option" value="com_akeeba">
            <input type="hidden" name="view" value="ControlPanel">
            <input type="hidden" name="task" value="fixOutputDirectory">
            <input type="hidden" name="<?php echo $this->container->platform->getToken(true); ?>" value="1">

            <button type="submit" class="akeeba-btn--block--green">
                <span class="akion-hammer"></span>
                <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_BTN_FIXSECURITY'); ?>
            </button>
        </form>
        <?php else: ?>
        <p>
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_LBL_OUTDIR_TRASHHOST'); ?>
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_LBL_OUTDIR_DELETEORBEHACKED'); ?>
        </p>
        <?php endif; ?>
    </details>

    <?php /* Output directory cannot be listed over the web but I can download files */ ?>
    <details class="akeeba-block--warning" id="missingRandomFromFilename" style="display: none">
        <summary>
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_HEAD_OUTDIR_INSECURE_ALT'); ?>
        </summary>
        <p>
            <?php echo \Joomla\CMS\Language\Text::sprintf('COM_AKEEBA_CPANEL_LBL_OUTDIR_FILEREADABLE', realpath($this->getModel()->getOutputDirectory())); ?>
        </p>
        <p>
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_LBL_OUTDIR_CLICKTHEBUTTON'); ?>
        </p>
        <p>
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_LBL_OUTDIR_FIX_RANDOM'); ?>
        </p>

        <form action="index.php" method="POST" class="akeeba-form--inline">
            <input type="hidden" name="option" value="com_akeeba">
            <input type="hidden" name="view" value="ControlPanel">
            <input type="hidden" name="task" value="addRandomToFilename">
            <input type="hidden" name="<?php echo $this->container->platform->getToken(true); ?>" value="1">

            <button type="submit" class="akeeba-btn--block--green">
                <span class="akion-hammer"></span>
                <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_BTN_FIXSECURITY'); ?>
            </button>
        </form>
    </details>

<?php endif; ?>

<?php /* mbstring warning */ ?>
<?php if ( ! ($this->checkMbstring)): ?>
    <div class="akeeba-block--warning">
        <?php echo \Joomla\CMS\Language\Text::sprintf('COM_AKEEBA_CPANL_ERR_MBSTRING', PHP_VERSION); ?>
    </div>
<?php endif; ?>

<?php /* Front-end backup secret word reminder */ ?>
<?php if ( ! (empty($this->frontEndSecretWordIssue))): ?>
    <details class="akeeba-block--failure">
        <summary><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_ERR_FESECRETWORD_HEADER'); ?></summary>
        <p><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_ERR_FESECRETWORD_INTRO'); ?></p>
        <p><?php echo $this->frontEndSecretWordIssue; ?></p>
        <p>
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_ERR_FESECRETWORD_WHATTODO_JOOMLA'); ?>
            <?php echo \Joomla\CMS\Language\Text::sprintf('COM_AKEEBA_CPANEL_ERR_FESECRETWORD_WHATTODO_COMMON', $this->newSecretWord); ?>
        </p>
        <p>
            <a class="akeeba-btn--green akeeba-btn--big"
               href="index.php?option=com_akeeba&view=ControlPanel&task=resetSecretWord&<?php echo $this->container->platform->getToken(true); ?>=1">
                <span class="akion-refresh"></span>
                <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_BTN_FESECRETWORD_RESET'); ?>
            </a>
        </p>
    </details>
<?php endif; ?>

<?php /* Wrong media directory permissions */ ?>
<?php if ( ! ($this->areMediaPermissionsFixed)): ?>
    <details id="notfixedperms" class="akeeba-block--failure">
        <summary><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CONTROLPANEL_WARN_WARNING'); ?></summary>
        <p><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CONTROLPANEL_WARN_PERMS_L1'); ?></p>
        <p><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CONTROLPANEL_WARN_PERMS_L2'); ?></p>
        <ol>
            <li><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CONTROLPANEL_WARN_PERMS_L3A'); ?></li>
            <li><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CONTROLPANEL_WARN_PERMS_L3B'); ?></li>
        </ol>
        <p><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CONTROLPANEL_WARN_PERMS_L4'); ?></p>
    </details>
<?php endif; ?>

<?php /* You need to enter your Download ID */ ?>
<?php if($this->needsDownloadID): ?>
    <details class="akeeba-block--warning">
        <summary>
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_MSG_MUSTENTERDLID'); ?>
        </summary>
        <p>
            <?php echo \Joomla\CMS\Language\Text::sprintf('COM_AKEEBA_LBL_CPANEL_NEEDSDLID','https://www.akeeba.com/download/official/add-on-dlid.html'); ?>
        </p>
        <form name="dlidform" action="index.php" method="post" class="akeeba-form--inline">
            <input type="hidden" name="option" value="com_akeeba" />
            <input type="hidden" name="view" value="ControlPanel" />
            <input type="hidden" name="task" value="applydlid" />
            <input type="hidden" name="<?php echo $this->container->platform->getToken(true); ?>" value="1" />
            <div class="akeeba-form-group">
                <label for="dlid"><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_MSG_PASTEDLID'); ?></label>
                <input type="text" name="dlid" placeholder="<?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CONFIG_DOWNLOADID_LABEL'); ?>"
                       class="akeeba-input--wide">

                <button type="submit" class="akeeba-btn--green">
                    <span class="akion-checkmark-round"></span>
                    <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_MSG_APPLYDLID'); ?>
                </button>
            </div>
        </form>
    </details>
<?php endif; ?>

<?php /* You have CORE; you need to upgrade, not just enter a Download ID */ ?>
<?php if($this->coreWarningForDownloadID): ?>
    <div class="akeeba-block--warning">
        <?php echo \Joomla\CMS\Language\Text::sprintf('COM_AKEEBA_LBL_CPANEL_NEEDSUPGRADE','http://akee.ba/abcoretopro'); ?>
    </div>
<?php endif; ?>

<?php /* Warn about CloudFlare Rocket Loader */ ?>
<details class="akeeba-block--failure" style="display: none;" id="cloudFlareWarn">
    <summary><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_MSG_CLOUDFLARE_WARN'); ?></summary>
    <p><?php echo \Joomla\CMS\Language\Text::sprintf('COM_AKEEBA_CPANEL_MSG_CLOUDFLARE_WARN1', 'https://support.cloudflare.com/hc/en-us/articles/200169456-Why-is-JavaScript-or-jQuery-not-working-on-my-site-'); ?></p>
</details>
<?php
/**
 * DO NOT USE INLINE JAVASCRIPT FOR THIS SCRIPT. DO NOT REMOVE THE ATTRIBUTES.
 *
 * This is a specialised test which looks for CloudFlare's completely broken RocketLoader feature and warns the user
 * about it.
 */
?>
<script type="text/javascript" data-cfasync="true">
    var test = localStorage.getItem('<?php echo $cloudFlareTestFile?>');
    if (test)
    {
        document.getElementById("cloudFlareWarn").style.display = "block";
    }
</script>
cache/com_akeeba/compiled_templates/f67ce1697bbd9ea82cff640cb736f2e3e31696d0.php000064400000003552152453623460022101 0ustar00<?php /* /home/wuectly/www/administrator/components/com_akeeba/tmpl/ControlPanel/upgrade.blade.php */ ?>
<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

// Only show in the Core version with a 10% probability
if (AKEEBA_PRO) return;

// Only show if it's at least 15 days since the last time the user dismissed the upsell
if (time() - $this->lastUpsellDismiss < 1296000) return;

?>
<div class="akeeba-panel--orange">
    <header class="akeeba-block-header">
        <h3>
            <span class="akion-ios-star"></span>
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CONTROLPANEL_HEAD_PROUPSELL'); ?>
        </h3>
    </header>

    <p><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CONTROLPANEL_HEAD_LBL_PROUPSELL_1'); ?></p>

    <p class="akeeba-block--info"><?php echo \Joomla\CMS\Language\Text::sprintf('COM_AKEEBA_CONTROLPANEL_HEAD_LBL_DISCOUNT',
        base64_decode('SVdBTlRJVEFMTA==')); ?></p>

    <p><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CONTROLPANEL_HEAD_LBL_PROUPSELL_2'); ?></p>

    <p>
        <a href="https://www.akeeba.com/landing/akeeba-backup.html"
           class="akeeba-btn--large--primary">
            <span class="aklogo-backup-j"></span>
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CONTROLPANEL_BTN_LEARNMORE'); ?>
        </a>

        <a href="<?php echo $this->container->template->route('index.php?view=ControlPanel&task=dismissUpsell'); ?>" class="akeeba-btn--ghost--small">
            <span class="akion-ios-alarm"></span>
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CONTROLPANEL_BTN_HIDE'); ?>
        </a>
    </p>
</div>
cache/com_akeeba/compiled_templates/05524c06e0e3a64fdec273a4730b4d7543a0d8e7.php000064400000002500152453623460021612 0ustar00<?php /* /home/wuectly/www/administrator/components/com_akeeba/tmpl/ControlPanel/icons_troubleshooting.blade.php */ ?>
<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

?>
<section class="akeeba-panel--info">
    <header class="akeeba-block-header">
        <h3><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_HEADER_TROUBLESHOOTING'); ?></h3>
    </header>

    <div class="akeeba-grid">
	    <?php if($this->permissions['backup']): ?>
            <a class="akeeba-action--teal"
                href="index.php?option=com_akeeba&view=Log">
                <span class="akion-ios-search-strong"></span>
	            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_LOG'); ?>
            </a>
	    <?php endif; ?>

	    <?php if(AKEEBA_PRO && $this->permissions['configure']): ?>
            <a class="akeeba-action--teal"
                href="index.php?option=com_akeeba&view=Alice">
                <span class="akion-medkit"></span>
	            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_ALICE'); ?>
            </a>
	    <?php endif; ?>
    </div>
</section>
cache/com_akeeba/compiled_templates/f03fe16063ddf18b1fdd636e65e62d06b4410122.php000064400000036404152453623460021622 0ustar00<?php /* /home/wuectly/www/administrator/components/com_akeeba/tmpl/Backup/default.blade.php */ ?>
<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') || die();

/** @var  $this  \Akeeba\Backup\Admin\View\Backup\Html */

?>
<?php if(class_exists('Joomla\CMS\Component\ComponentHelper') && \Joomla\CMS\Component\ComponentHelper::isEnabled('com_akeebabackup')): ?>
    <?php echo $this->loadAnyTemplate('admin:com_akeeba/ControlPanel/backup8_uninstall'); ?>
	<?php return; ?>
<?php elseif(version_compare(JVERSION, '3.999.999', 'gt')): ?>
    <?php echo $this->loadAnyTemplate('admin:com_akeeba/ControlPanel/backup9_install'); ?>
<?php endif; ?>

<?php /* Configuration Wizard pop-up */ ?>
<?php if($this->promptForConfigurationWizard): ?>
	<?php echo $this->loadAnyTemplate('admin:com_akeeba/Configuration/confwiz_modal'); ?>
<?php endif; ?>

<?php /* The Javascript of the page */ ?>
<?php echo $this->loadAnyTemplate('admin:com_akeeba/Backup/script'); ?>

<div id="akeebaBackup8Wrapper">
    <?php /* Backup Setup */ ?>
    <div id="backup-setup" class="akeeba-panel--primary">
        <header class="akeeba-block-header">
            <h3>
                <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_HEADER_STARTNEW'); ?>
            </h3>
        </header>

        <?php if($this->hasWarnings && !$this->unwriteableOutput): ?>
            <div id="quirks" class="akeeba-block--<?php echo $this->hasErrors ? 'failure' : 'warning'; ?>">
                <h3 class="alert-heading">
                    <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_LABEL_DETECTEDQUIRKS'); ?>
                </h3>
                <p>
                    <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_LABEL_QUIRKSLIST'); ?>
                </p>
                <?php echo $this->warningsCell; ?>


            </div>
        <?php endif; ?>

        <?php if($this->unwriteableOutput): ?>
            <div id="akeeba-fatal-outputdirectory" class="akeeba-block--failure">
                <h3>
                    <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_ERROR_UNWRITABLEOUTPUT_' . ($this->autoStart ? 'AUTOBACKUP' : 'NORMALBACKUP')); ?>
                </h3>
                <p>
                    <?php echo \Joomla\CMS\Language\Text::sprintf('COM_AKEEBA_BACKUP_ERROR_UNWRITABLEOUTPUT_COMMON', 'index.php?option=com_akeeba&view=Configuration', 'https://www.akeeba.com/warnings/q001.html'); ?>
                </p>
            </div>
        <?php endif; ?>

        <form action="index.php" method="post" name="flipForm" id="flipForm"
                class="akeeba-formstyle-reset akeeba-form--inline akeeba-panel--information"
                autocomplete="off">

            <div class="akeeba-form-group">
                <label>
                    <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_PROFILE_TITLE'); ?>: #<?php echo $this->profileId; ?>


                </label>
                <?php echo \Joomla\CMS\HTML\HTMLHelper::_('formbehavior.chosen'); ?>
                <?php echo \Joomla\CMS\HTML\HTMLHelper::_('select.genericlist', $this->profileList, 'profileid', ['list.select' => $this->profileId, 'id' => 'comAkeebaBackupProfileDropdown', 'list.attr' => ['class' => 'advancedSelect']]); ?>
            </div>

            <div class="akeeba-form-group--actions">
                <button class="akeeba-btn--grey" id="comAkeebaBackupFlipProfile">
                    <span class="akion-refresh"></span>
                    <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_PROFILE_BUTTON'); ?>
                </button>
            </div>

            <div class="akeeba-hidden-fields-container">
                <input type="hidden" name="option" value="com_akeeba"/>
                <input type="hidden" name="view" value="Backup"/>
                <input type="hidden" name="returnurl" value="<?php echo $this->escape($this->returnURL); ?>"/>
                <input type="hidden" name="description" id="flipDescription" value=""/>
                <input type="hidden" name="comment" id="flipComment" value=""/>
                <input type="hidden" name="<?php echo $this->container->platform->getToken(true); ?>" value="1"/>
            </div>
        </form>

        <form id="dummyForm" class="akeeba-form--horizontal" style="display: <?php echo $this->unwriteableOutput ? 'none' : 'block'; ?>;">
            <div class="akeeba-form-group">
                <label for="backup-description">
                    <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_LABEL_DESCRIPTION'); ?>
                </label>
                <input type="text" name="description" value="<?php echo $this->escape(empty($this->description) ? $this->defaultDescription : $this->description); ?>"
                        maxlength="255" size="80" id="backup-description" class="input-xxlarge" autocomplete="off" />
                <span class="akeeba-help-text"><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_LABEL_DESCRIPTION_HELP'); ?></span>
            </div>

            <div class="akeeba-form-group">
                <label for="comment">
                    <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_LABEL_COMMENT'); ?>
                </label>
                <textarea id="comment" rows="5" cols="73" class="input-xxlarge"><?php echo $this->comment; ?></textarea>
                <span class="akeeba-help-text"><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_LABEL_COMMENT_HELP'); ?></span>
            </div>

            <div class="akeeba-form-group--pull-right">
                <div class="akeeba-form-group--actions">
                    <button class="akeeba-btn--primary" id="backup-start">
                        <span class="akion-play"></span>
                        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_LABEL_START'); ?>
                    </button>

                    <a class="akeeba-btn--orange" id="backup-default" href="#">
                        <span class="akion-refresh"></span>
                        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_LABEL_RESTORE_DEFAULT'); ?>
                    </a>
                </div>
            </div>
        </form>
    </div>

    <?php /* Warning for having set an ANGIE password */ ?>
    <div id="angie-password-warning" class="akeeba-block--warning" style="display: none">
        <h3><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_ANGIE_PASSWORD_WARNING_HEADER'); ?></h3>
        <p><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_ANGIE_PASSWORD_WARNING_1'); ?></p>
        <p><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_ANGIE_PASSWORD_WARNING_2'); ?></p>
    </div>

    <?php /* Backup in progress */ ?>
    <div id="backup-progress-pane" style="display: none">
        <div class="akeeba-block--info">
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_TEXT_BACKINGUP'); ?>
        </div>

        <div class="akeeba-panel--primary">
            <header class="akeeba-block-header">
                <h3>
                    <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_LABEL_PROGRESS'); ?>
                </h3>
            </header>

            <div id="backup-progress-content">
                <div id="backup-steps"></div>
                <div id="backup-status" class="backup-steps-container">
                    <div id="backup-step"></div>
                    <div id="backup-substep"></div>
                </div>
                <div id="backup-percentage" class="akeeba-progress">
                    <div class="akeeba-progress-fill" style="width: 0"></div>
                </div>
                <div id="response-timer">
                    <div class="color-overlay"></div>
                    <div class="text"></div>
                </div>
            </div>
            <span id="ajax-worker"></span>
        </div>

        <?php if(!AKEEBA_PRO): ?>
            <div>
                <p>
                    <em><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_LBL_UPGRADENAG'); ?></em>
                </p>
            </div>
        <?php endif; ?>
    </div>

    <?php /* Backup complete */ ?>
    <div id="backup-complete" style="display: none">
        <div class="akeeba-panel--success">
            <header class="akeeba-block-header">
                <h3>
                    <?php if(empty($this->returnURL)): ?>
                        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_HEADER_BACKUPFINISHED'); ?>
                    <?php else: ?>
                        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_HEADER_BACKUPWITHRETURNURLFINISHED'); ?>
                    <?php endif; ?>
                </h3>
            </header>

            <div id="finishedframe">
                <p>
                    <?php if(empty($this->returnURL)): ?>
                        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_TEXT_CONGRATS'); ?>
                    <?php else: ?>
                        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_TEXT_PLEASEWAITFORREDIRECTION'); ?>
                    <?php endif; ?>
                </p>

                <?php if(empty($this->returnURL)): ?>
                    <a class="akeeba-btn--primary--big" href="index.php?option=com_akeeba&view=Manage">
                        <span class="akion-ios-list"></span>
                        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN'); ?>
                    </a>
                    <a class="akeeba-btn--grey" id="ab-viewlog-success" href="index.php?option=com_akeeba&view=Log&latest=1">
                        <span class="akion-ios-search-strong"></span>
                        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_LOG'); ?>
                    </a>
                <?php endif; ?>
            </div>
        </div>
    </div>

    <?php /* Backup warnings */ ?>
    <div id="backup-warnings-panel" style="display:none">
        <div class="akeeba-panel--warning">
            <header class="akeeba-block-header">
                <h3>
                    <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_LABEL_WARNINGS'); ?>
                </h3>
            </header>
            <div id="warnings-list">
            </div>
        </div>
    </div>

    <?php /* Backup retry after error */ ?>
    <div id="retry-panel" style="display: none">
        <div class="akeeba-panel--warning">
            <header class="akeeba-block-header">
                <h3>
                    <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_HEADER_BACKUPRETRY'); ?>
                </h3>
            </header>
            <div id="retryframe">
                <p><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_TEXT_BACKUPFAILEDRETRY'); ?></p>
                <p>
                    <strong>
                        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_TEXT_WILLRETRY'); ?>
                        <span id="akeeba-retry-timeout">0</span>
                        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_TEXT_WILLRETRYSECONDS'); ?>
                    </strong>
                    <br/>
                    <button class="akeeba-btn--red--small" id="comAkeebaBackupCancelResume">
                        <span class="akion-android-cancel"></span>
                        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_MULTIDB_GUI_LBL_CANCEL'); ?>
                    </button>
                    <button class="akeeba-btn--green--small" id="comAkeebaBackupResumeBackup">
                        <span class="akion-ios-redo"></span>
                        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_TEXT_BTNRESUME'); ?>
                    </button>
                </p>

                <p><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_TEXT_LASTERRORMESSAGEWAS'); ?></p>
                <p id="backup-error-message-retry"></p>
            </div>
        </div>
    </div>

    <?php /* Backup error (halt) */ ?>
    <div id="error-panel" style="display: none">
        <div class="akeeba-panel--red">
            <header class="akeeba-block-header">
                <h3>
                    <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_HEADER_BACKUPFAILED'); ?>
                </h3>
            </header>

            <div id="errorframe">
                <p>
                    <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_TEXT_BACKUPFAILED'); ?>
                </p>
                <p id="backup-error-message"></p>

                <p>
                    <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_TEXT_READLOGFAIL' . (AKEEBA_PRO ? 'PRO' : '')); ?>
                </p>

                <div class="akeeba-block--info" id="error-panel-troubleshooting">
                    <p>
                        <?php if(AKEEBA_PRO): ?>
                            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_TEXT_RTFMTOSOLVEPRO'); ?>
                        <?php endif; ?>

                        <?php echo \Joomla\CMS\Language\Text::sprintf('COM_AKEEBA_BACKUP_TEXT_RTFMTOSOLVE', 'https://www.akeeba.com/documentation/akeeba-backup-documentation/backup-now.html?utm_source=akeeba_backup&utm_campaign=backuperrorlink#troubleshoot-backup'); ?>
                    </p>
                    <p>
                        <?php if(AKEEBA_PRO): ?>
                            <?php echo \Joomla\CMS\Language\Text::sprintf('COM_AKEEBA_BACKUP_TEXT_SOLVEISSUE_PRO', 'https://www.akeeba.com/support.html?utm_source=akeeba_backup&utm_campaign=backuperrorpro'); ?>
                        <?php else: ?>
                            <?php echo \Joomla\CMS\Language\Text::sprintf('COM_AKEEBA_BACKUP_TEXT_SOLVEISSUE_CORE', 'https://www.akeeba.com/subscribe.html?utm_source=akeeba_backup&utm_campaign=backuperrorcore','https://www.akeeba.com/support.html?utm_source=akeeba_backup&utm_campaign=backuperrorcore'); ?>
                        <?php endif; ?>

                        <?php echo \Joomla\CMS\Language\Text::sprintf('COM_AKEEBA_BACKUP_TEXT_SOLVEISSUE_LOG', 'index.php?option=com_akeeba&view=Log&latest=1'); ?>
                    </p>
                </div>

                <?php if(AKEEBA_PRO): ?>
                    <a class="akeeba-btn--green" id="ab-alice-error" href="index.php?option=com_akeeba&view=Alice">
                        <span class="akion-medkit"></span>
                        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_ANALYSELOG'); ?>
                    </a>
                <?php endif; ?>

                <a class="akeeba-btn--primary" href="https://www.akeeba.com/documentation/akeeba-backup-documentation/troubleshoot-backup.html?utm_source=akeeba_backup&utm_campaign=backuperrorbutton">
                    <span class="akion-ios-book"></span>
                    <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_TROUBLESHOOTINGDOCS'); ?>
                </a>

                <a class="akeeba-btn-grey" id="ab-viewlog-error" href="index.php?option=com_akeeba&view=Log&latest=1">
                    <span class="akion-ios-search-strong"></span>
                    <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_LOG'); ?>
                </a>
            </div>
        </div>
    </div>
</div>cache/com_akeeba/compiled_templates/9df20b682f03cb39f0429cd3a11e109fcf256851.php000064400000005314152453623460021630 0ustar00<?php /* /home/wuectly/www/administrator/components/com_akeeba/tmpl/ControlPanel/default.blade.php */ ?>
<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

?>
<?php if(class_exists('Joomla\CMS\Component\ComponentHelper') && \Joomla\CMS\Component\ComponentHelper::isEnabled('com_akeebabackup')): ?>
	<?php echo $this->loadAnyTemplate('admin:com_akeeba/ControlPanel/backup8_uninstall'); ?>
	<?php return; ?>
<?php elseif(version_compare(JVERSION, '3.999.999', 'gt')): ?>
	<?php echo $this->loadAnyTemplate('admin:com_akeeba/ControlPanel/backup9_install'); ?>
<?php endif; ?>

<div id="akeebaBackup8Wrapper">
<?php /* Display various possible warnings about issues which directly affect the user's experience */ ?>
<?php echo $this->loadAnyTemplate('admin:com_akeeba/ControlPanel/warnings'); ?>

<?php /* Main area */ ?>
<div class="akeeba-container--66-33">
	<?php /* LEFT COLUMN (66% desktop width) */ ?>
	<div>
		<?php /* Active profile switch */ ?>
		<?php echo $this->loadAnyTemplate('admin:com_akeeba/ControlPanel/profile'); ?>

		<?php /* One Click Backup icons */ ?>
		<?php if( ! (empty($this->quickIconProfiles)) && $this->permissions['backup']): ?>
			<?php echo $this->loadAnyTemplate('admin:com_akeeba/ControlPanel/oneclick'); ?>
		<?php endif; ?>

		<?php /* Basic operations */ ?>
		<?php echo $this->loadAnyTemplate('admin:com_akeeba/ControlPanel/icons_basic'); ?>

		<?php /* Core Upgrade */ ?>
		<?php echo $this->loadAnyTemplate('admin:com_akeeba/ControlPanel/upgrade'); ?>

		<?php /* Troubleshooting */ ?>
		<?php echo $this->loadAnyTemplate('admin:com_akeeba/ControlPanel/icons_troubleshooting'); ?>

		<?php /* Advanced operations */ ?>
		<?php echo $this->loadAnyTemplate('admin:com_akeeba/ControlPanel/icons_advanced'); ?>

		<?php /* Include / Exclude data */ ?>
		<?php if($this->permissions['configure']): ?>
			<?php echo $this->loadAnyTemplate('admin:com_akeeba/ControlPanel/icons_includeexclude'); ?>
		<?php endif; ?>
	</div>
	<?php /* RIGHT COLUMN (33% desktop width) */ ?>
	<div>
		<?php /* Status Summary */ ?>
		<?php echo $this->loadAnyTemplate('admin:com_akeeba/ControlPanel/sidebar_status'); ?>

		<?php /* Backup stats */ ?>
		<?php echo $this->loadAnyTemplate('admin:com_akeeba/ControlPanel/sidebar_backup'); ?>
	</div>
</div>

<?php /* Footer */ ?>
<?php echo $this->loadAnyTemplate('admin:com_akeeba/ControlPanel/footer'); ?>
</div>

<?php /* Usage statistics collection IFRAME */ ?>
<?php if($this->statsIframe): ?>
	<?php echo $this->statsIframe; ?>

<?php endif; ?>cache/com_akeeba/compiled_templates/aa5fca57af2fb2a3fb8646a686cced8c1825ff9c.php000064400000017014152453623460022367 0ustar00<?php /* /home/wuectly/www/administrator/components/com_akeeba/tmpl/Manage/manage_column.blade.php */ ?>
<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') || die();

use Akeeba\Backup\Admin\Helper\Utils;

/** @var  \Akeeba\Backup\Admin\View\Manage\Html $this */
/** @var  array $record */

if (!isset($record['remote_filename']))
{
	$record['remote_filename'] = '';
}

$archiveExists    = $record['meta'] == 'ok';
$showManageRemote = $record['hasRemoteFiles'] && (AKEEBA_PRO == 1);
$engineForProfile = array_key_exists($record['profile_id'], $this->enginesPerProfile) ? $this->enginesPerProfile[$record['profile_id']] : 'none';
$showUploadRemote = $this->permissions['backup'] && $archiveExists && !$showManageRemote && ($engineForProfile != 'none') && ($record['meta'] != 'obsolete') && (AKEEBA_PRO == 1);
$showDownload     = $this->permissions['download'] && $archiveExists;
$showViewLog      = $this->permissions['backup'] && isset($record['backupid']) && !empty($record['backupid']);
$postProcEngine   = '';
$thisPart         = '';
$thisID           = urlencode($record['id']);

if ($showUploadRemote)
{
	$postProcEngine   = $engineForProfile ?: 'none';
	$showUploadRemote = !empty($postProcEngine);
}

\AkeebaFEFHelper::loadFEFScript('Tooltip');
?>
<div style="display: none">
    <div id="akeeba-buadmin-<?php echo (int)$record['id']; ?>" tabindex="-1">
        <div class="akeeba-renderer-fef">
            <h4><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LBL_BACKUPINFO'); ?></h4>

            <p>
                <strong><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LBL_ARCHIVEEXISTS'); ?></strong>
                <br />
                <?php if($record['meta'] == 'ok'): ?>
                    <span class="akeeba-label--success">
				<?php echo \Joomla\CMS\Language\Text::_('JYES'); ?>
			</span>
                <?php else: ?>
                    <span class="akeeba-label--failure">
				<?php echo \Joomla\CMS\Language\Text::_('JNO'); ?>
			</span>
                <?php endif; ?>
            </p>
            <p>
                <strong><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LBL_ARCHIVEPATH' . ($archiveExists ? '' : '_PAST')); ?></strong>
                <br />
                <span class="akeeba-label--information">
				<?php echo $this->escape(Utils::getRelativePath(JPATH_SITE, dirname($record['absolute_path']))); ?>

				</span>
            </p>
            <p>
                <strong><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LBL_ARCHIVENAME' . ($archiveExists ? '' : '_PAST')); ?></strong>
                <br />
                <code>
                    <?php echo $this->escape($record['archivename']); ?>

                </code>
            </p>
        </div>

    </div>

    <?php if($showDownload): ?>
        <div id="akeeba-buadmin-download-<?php echo (int)$record['id']; ?>" tabindex="-2" role="dialog">
            <div class="akeeba-renderer-fef">
                <div class="akeeba-block--warning">
                    <h4>
                        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LBL_DOWNLOAD_TITLE'); ?>
                    </h4>
                    <p>
                        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LBL_DOWNLOAD_WARNING'); ?>
                    </p>
                </div>

                <?php if($record['multipart'] < 2): ?>
                    <a class="akeeba-btn--primary--small comAkeebaManageDownloadButton"
                       data-id="<?php echo $this->escape($record['id']); ?>">
                        <span class="akion-ios-download"></span>
                        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LOG_DOWNLOAD'); ?>
                    </a>
                <?php endif; ?>
                <?php if($record['multipart'] >= 2): ?>
                    <div>
                        <?php echo \Joomla\CMS\Language\Text::sprintf('COM_AKEEBA_BUADMIN_LBL_DOWNLOAD_PARTS', (int)$record['multipart']); ?>
                    </div>
                    <?php for($count = 0; $count < $record['multipart']; $count++): ?>
                    <?php if($count > 0): ?>
                    &bull;
                <?php endif; ?>
                <a class="akeeba-btn--small--dark comAkeebaManageDownloadButton"
                   data-id="<?php echo $this->escape($record['id']); ?>"
                   data-part="<?php echo $this->escape($count); ?>">
                    <span class="akion-android-download"></span>
                    <?php echo \Joomla\CMS\Language\Text::sprintf('COM_AKEEBA_BUADMIN_LABEL_PART', $count); ?>
                </a>
                <?php endfor; ?>
                <?php endif; ?>
            </div>
        </div>
    <?php endif; ?>
</div>

<?php if($showManageRemote): ?>
    <div style="padding-bottom: 3pt;">
        <a class="akeeba-btn--primary akeeba_remote_management_link"
           data-management="index.php?option=com_akeeba&view=RemoteFiles&tmpl=component&task=listactions&id=<?php echo (int)$record['id']; ?>"
           data-reload="index.php?option=com_akeeba&view=Manage"
        >
            <span class="akion-cloud"></span>
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LABEL_REMOTEFILEMGMT'); ?>
        </a>
    </div>
<?php elseif($showUploadRemote): ?>
    <a class="akeeba-btn--primary akeeba_upload"
       data-upload="index.php?option=com_akeeba&view=Upload&tmpl=component&task=start&id=<?php echo (int)$record['id']; ?>"
       data-reload="index.php?option=com_akeeba&view=Manage"
       title="<?php echo \Joomla\CMS\Language\Text::sprintf('COM_AKEEBA_TRANSFER_DESC', JText::_("ENGINE_POSTPROC_{$postProcEngine}_TITLE")); ?>">
        <span class="akion-android-upload"></span>
        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_TRANSFER_TITLE'); ?>
        (<em><?php echo $this->escape($postProcEngine); ?></em>)
    </a>
<?php endif; ?>

<div style="padding-bottom: 3pt">
    <?php if($showDownload): ?>
        <a class="akeeba-btn--<?php echo $showManageRemote || $showUploadRemote ? 'small--grey' : 'green'; ?> akeeba_download_button"
           data-dltarget="#akeeba-buadmin-download-<?php echo (int)$record['id']; ?>"
        >
            <span class="akion-android-download"></span>
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LOG_DOWNLOAD'); ?>
        </a>
    <?php endif; ?>

    <?php if($showViewLog): ?>
        <a class="akeeba-btn--grey akeebaCommentPopover"
           <?php echo ($record['meta'] != 'obsolete') ? '' : 'disabled="disabled"'; ?>

           href="index.php?option=com_akeeba&view=Log&tag=<?php echo $this->escape($record['tag']); ?>.<?php echo $this->escape($record['backupid']); ?>&profileid=<?php echo (int)$record['profile_id']; ?>"
           data-original-title="<?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LBL_LOGFILEID'); ?>"
           data-content="<?php echo $this->escape($record['backupid']); ?>">
            <span class="akion-ios-search-strong"></span>
            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_LOG'); ?>
        </a>
    <?php endif; ?>

    <a class="akeeba-btn--grey--small akeebaCommentPopover akeeba_showinfo_link"
       data-infotarget="#akeeba-buadmin-<?php echo (int)$record['id']; ?>"
       data-content="<?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN_LBL_BACKUPINFO'); ?>"
    >
        <span class="akion-information-circled"></span>
    </a>
</div>
cache/com_akeeba/compiled_templates/7e637a70fe7957d5dbdff9deca7a459a9b426cf4.php000064400000006113152453623460022251 0ustar00<?php /* /home/wuectly/www/administrator/components/com_akeeba/tmpl/Backup/script.blade.php */ ?>
<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

// Protect from unauthorized access
defined('_JEXEC') || die();

use Joomla\CMS\Language\Text;
use Joomla\CMS\Uri\Uri;

/**
 * This file passes parameters to the Backup.js script using Joomla's script options API
 *
 * @var  $this  \Akeeba\Backup\Admin\View\Backup\Html
 */

$escapedBaseURL = addslashes(Uri::base());
$platform       = $this->container->platform;

// Initialization
$platform->addScriptOptions('akeeba.Backup.defaultDescription', addslashes($this->defaultDescription));
$platform->addScriptOptions('akeeba.Backup.currentDescription', addslashes(empty($this->description) ? $this->defaultDescription : $this->description));
$platform->addScriptOptions('akeeba.Backup.currentComment', addslashes($this->comment));
$platform->addScriptOptions('akeeba.Backup.hasAngieKey', $this->hasANGIEPassword);

// Auto-resume setup
$platform->addScriptOptions('akeeba.Backup.resume.enabled', (bool) $this->autoResume);
$platform->addScriptOptions('akeeba.Backup.resume.timeout', (int) $this->autoResumeTimeout);
$platform->addScriptOptions('akeeba.Backup.resume.maxRetries', (int) $this->autoResumeRetries);

// The return URL
$platform->addScriptOptions('akeeba.Backup.returnUrl', addcslashes($this->returnURL, "'\\"));

// Used as parameters to start_timeout_bar()
$platform->addScriptOptions('akeeba.Backup.maxExecutionTime', (int) $this->maxExecutionTime);
$platform->addScriptOptions('akeeba.Backup.runtimeBias', (int) $this->runtimeBias);

// Notifications
$platform->addScriptOptions('akeeba.System.notification.iconURL', sprintf("%s../media/com_akeeba/icons/logo-48.png", $escapedBaseURL));
$platform->addScriptOptions('akeeba.System.notification.hasDesktopNotification', (bool) $this->desktopNotifications);

// Domain keys
$platform->addScriptOptions('akeeba.Backup.domains', $this->domains);

// AJAX proxy, View Log and ALICE URLs
$platform->addScriptOptions('akeeba.System.params.AjaxURL', 'index.php?option=com_akeeba&view=Backup&task=ajax');
$platform->addScriptOptions('akeeba.Backup.URLs.LogURL', sprintf("%sindex.php?option=com_akeeba&view=Log", $escapedBaseURL));
$platform->addScriptOptions('akeeba.Backup.URLs.AliceURL', sprintf("%sindex.php?option=com_akeeba&view=Alice", $escapedBaseURL));

// Behavior triggers
$platform->addScriptOptions('akeeba.Backup.autostart', (!$this->unwriteableOutput && $this->autoStart) ? 1 : 0);

// Push language strings to Javascript
Text::script('COM_AKEEBA_BACKUP_TEXT_LASTRESPONSE');
Text::script('COM_AKEEBA_BACKUP_TEXT_BACKUPSTARTED');
Text::script('COM_AKEEBA_BACKUP_TEXT_BACKUPFINISHED');
Text::script('COM_AKEEBA_BACKUP_TEXT_BACKUPHALT');
Text::script('COM_AKEEBA_BACKUP_TEXT_BACKUPRESUME');
Text::script('COM_AKEEBA_BACKUP_TEXT_BACKUPHALT_DESC');
Text::script('COM_AKEEBA_BACKUP_TEXT_BACKUPFAILED');
Text::script('COM_AKEEBA_BACKUP_TEXT_BACKUPWARNING');
Text::script('COM_AKEEBA_BACKUP_TEXT_AVGWARNING');
cache/com_akeeba/compiled_templates/1ef08c8bbb6678db8917d463cedbe821d81c6991.php000064400000002271152453623460022022 0ustar00<?php /* /home/wuectly/www/administrator/components/com_akeeba/tmpl/ControlPanel/footer.blade.php */ ?>
<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

?>
<div class="row-fluid footer akeebabackup-footer">
	<div class="span12">
		<p style="height: 6em">
			<?php echo \Joomla\CMS\Language\Text::sprintf('Copyright &copy;2006-%s <a href="https://www.akeeba.com">Akeeba Ltd</a>. All Rights Reserved.', date('Y')); ?>
			<br/>
			Akeeba Backup is Free Software and is distributed under the terms of the <a
					href="http://www.gnu.org/licenses/gpl-3.0.html">GNU General Public License</a>, version 3 or - at
			your option - any later version.
			<?php if(AKEEBA_PRO != 1): ?>
				<br/>If you use Akeeba Backup Core, please post a rating and a review at the <a
						href="https://extensions.joomla.org/extensions/extension/access-a-security/site-security/akeeba-backup/">Joomla!
					Extensions Directory</a>.
			<?php endif; ?>
		</p>
	</div>
</div>
cache/com_akeeba/compiled_templates/152b78b8aafd56eec39ac651f217ab161e3fcb83.php000064400000001215152453623460022124 0ustar00<?php /* /home/wuectly/www/administrator/components/com_akeeba/tmpl/ControlPanel/sidebar_backup.blade.php */ ?>
<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

?>
<div class="akeeba-panel">
    <header class="akeeba-block-header">
        <h3><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP_STATS'); ?></h3>
    </header>
    <div><?php echo $this->latestBackupCell; ?></div>
</div>
cache/com_akeeba/compiled_templates/4eea111bad08e825f780fbde90a7639071b10d7d.php000064400000004302152453623460021760 0ustar00<?php /* /home/wuectly/www/administrator/components/com_akeeba/tmpl/ControlPanel/icons_basic.blade.php */ ?>
<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

?>
<section class="akeeba-panel--info">
    <header class="akeeba-block-header">
        <h3><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_HEADER_BASICOPS'); ?></h3>
    </header>

    <div class="akeeba-grid">
	    <?php if($this->permissions['backup']): ?>
            <a class="akeeba-action--green"
               href="index.php?option=com_akeeba&view=Backup">
                <span class="akion-play"></span>
	            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BACKUP'); ?>
            </a>
	    <?php endif; ?>

	    <?php if($this->permissions['download'] && AKEEBA_PRO): ?>
            <a class="akeeba-action--green"
                href="index.php?option=com_akeeba&view=Transfer">
                <span class="akion-android-open"></span>
	            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_TRANSFER'); ?>
            </a>
	    <?php endif; ?>

        <a class="akeeba-action--teal"
            href="index.php?option=com_akeeba&view=Manage">
            <span class="akion-ios-list"></span>
	        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_BUADMIN'); ?>
        </a>

	    <?php if($this->permissions['configure']): ?>
            <a class="akeeba-action--teal"
                href="index.php?option=com_akeeba&view=Configuration">
                <span class="akion-ios-gear"></span>
	            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CONFIG'); ?>
            </a>
	    <?php endif; ?>

	    <?php if($this->permissions['configure']): ?>
            <a class="akeeba-action--teal"
                href="index.php?option=com_akeeba&view=Profiles">
                <span class="akion-person-stalker"></span>
	            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_PROFILES'); ?>
            </a>
	    <?php endif; ?>
    </div>
</section>
cache/com_akeeba/compiled_templates/7e95d104faff8ea3b40e36e17db3a627765164ba.php000064400000004511152453623460021773 0ustar00<?php /* /home/wuectly/www/administrator/components/com_akeeba/tmpl/ControlPanel/icons_includeexclude.blade.php */ ?>
<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

?>

<section class="akeeba-panel--info">
    <header class="akeeba-block-header">
        <h3><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_HEADER_INCLUDEEXCLUDE'); ?></h3>
    </header>

    <div class="akeeba-grid">
        <?php if(AKEEBA_PRO): ?>
            <a class="akeeba-action--green"
                href="index.php?option=com_akeeba&view=MultipleDatabases">
                <span class="akion-arrow-swap"></span>
	            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_MULTIDB'); ?>
            </a>

            <a class="akeeba-action--green"
                href="index.php?option=com_akeeba&view=IncludeFolders">
                <span class="akion-folder"></span>
	            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_INCLUDEFOLDER'); ?>
            </a>
        <?php endif; ?>

        <a class="akeeba-action--red"
            href="index.php?option=com_akeeba&view=FileFilters">
            <span class="akion-filing"></span>
	        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_FILEFILTERS'); ?>
        </a>

        <a class="akeeba-action--red"
            href="index.php?option=com_akeeba&view=DatabaseFilters">
            <span class="akion-ios-grid-view"></span>
	        <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_DBFILTER'); ?>
        </a>

        <?php if(AKEEBA_PRO): ?>
            <a class="akeeba-action--red"
                href="index.php?option=com_akeeba&view=RegExFileFilters">
                <span class="akion-ios-folder"></span>
	            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_REGEXFSFILTERS'); ?>
            </a>

            <a class="akeeba-action--red"
                href="index.php?option=com_akeeba&view=RegExDatabaseFilters">
                <span class="akion-ios-box"></span>
	            <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_REGEXDBFILTERS'); ?>
            </a>
        <?php endif; ?>

    </div></section>
cache/com_akeeba/compiled_templates/3a5700c3c7114f5da93f407c31a4b1d3112ad402.php000064400000003666152453623460021514 0ustar00<?php /* /home/wuectly/www/administrator/components/com_akeeba/tmpl/ControlPanel/icons_advanced.blade.php */ ?>
<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

/** @var $this \Akeeba\Backup\Admin\View\ControlPanel\Html */

// Protect from unauthorized access
defined('_JEXEC') || die();

// All of the buttons in this panel require the Configure privilege
if (!$this->permissions['configure'])
{
	return;
}
?>
<?php if(AKEEBA_PRO): ?>
    <section class="akeeba-panel--info">
        <header class="akeeba-block-header">
            <h3><?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_CPANEL_HEADER_ADVANCED'); ?></h3>
        </header>

        <div class="akeeba-grid">
            <?php if($this->permissions['configure']): ?>
                <a class="akeeba-action--teal"
                   href="index.php?option=com_akeeba&view=Schedule">
                    <span class="akion-calendar"></span>
                    <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_SCHEDULE'); ?>
                </a>
            <?php endif; ?>

            <?php if($this->permissions['configure']): ?>
                <a class="akeeba-action--orange"
                   href="index.php?option=com_akeeba&view=Discover">
                    <span class="akion-ios-download"></span>
                    <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_DISCOVER'); ?>
                </a>
            <?php endif; ?>

            <?php if($this->permissions['configure']): ?>
                <a class="akeeba-action--orange"
                   href="index.php?option=com_akeeba&view=S3Import">
                    <span class="akion-ios-cloud-download"></span>
                    <?php echo \Joomla\CMS\Language\Text::_('COM_AKEEBA_S3IMPORT'); ?>
                </a>
            <?php endif; ?>
        </div>
    </section>
<?php endif; ?>
modules/mod_logged/tmpl/default.php000060400000003512152453623460013434 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_logged
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip');
?>
<div class="row-striped">
	<?php foreach ($users as $user) : ?>
		<div class="row-fluid">
			<div class="span8">
				<?php if ($user->client_id == 0) : ?>
					<a title="<?php echo JHtml::_('tooltipText', 'MOD_LOGGED_LOGOUT'); ?>" href="<?php echo $user->logoutLink; ?>" class="btn btn-danger btn-mini hasTooltip">
						<span class="icon-remove icon-white" aria-hidden="true"><span class="element-invisible"><?php echo JText::_('JLOGOUT'); ?></span></span>
					</a>
				<?php endif; ?>

				<strong class="row-title">
					<?php if (isset($user->editLink)) : ?>
						<a href="<?php echo $user->editLink; ?>" class="hasTooltip" title="<?php echo JHtml::_('tooltipText', 'JGRID_HEADING_ID'); ?> : <?php echo $user->id; ?>">
							<?php echo $user->name; ?></a>
					<?php else : ?>
						<?php echo $user->name; ?>
					<?php endif; ?>
				</strong>

				<small class="small hasTooltip" title="<?php echo JHtml::_('tooltipText', 'JCLIENT'); ?>">
					<?php if ($user->client_id === null) : ?>
						<?php // Don't display a client ?>
					<?php elseif ($user->client_id) : ?>
						<?php echo JText::_('JADMINISTRATION'); ?>
					<?php else : ?>
						<?php echo JText::_('JSITE'); ?>
					<?php endif; ?>
				</small>
			</div>
			<div class="span4">
				<div class="small pull-right hasTooltip" title="<?php echo JHtml::_('tooltipText', 'MOD_LOGGED_LAST_ACTIVITY'); ?>">
					<span class="icon-calendar" aria-hidden="true"></span> <?php echo JHtml::_('date', $user->time, JText::_('DATE_FORMAT_LC5')); ?>
				</div>
			</div>
		</div>
	<?php endforeach; ?>
</div>
modules/mod_logged/helper.php000060400000003500152453623460012310 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_logged
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Helper for mod_logged
 *
 * @since  1.5
 */
abstract class ModLoggedHelper
{
	/**
	 * Get a list of logged users.
	 *
	 * @param   \Joomla\Registry\Registry  &$params  The module parameters.
	 *
	 * @return  mixed  An array of users, or false on error.
	 *
	 * @throws  RuntimeException
	 */
	public static function getList(&$params)
	{
		$db    = JFactory::getDbo();
		$user  = JFactory::getUser();
		$query = $db->getQuery(true)
			->select('s.time, s.client_id, u.id, u.name, u.username')
			->from('#__session AS s')
			->join('LEFT', '#__users AS u ON s.userid = u.id')
			->where('s.guest = 0');
		$db->setQuery($query, 0, $params->get('count', 5));

		try
		{
			$results = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			throw $e;
		}

		foreach ($results as $k => $result)
		{
			$results[$k]->logoutLink = '';

			if ($user->authorise('core.manage', 'com_users'))
			{
				$results[$k]->editLink   = JRoute::_('index.php?option=com_users&task=user.edit&id=' . $result->id);
				$results[$k]->logoutLink = JRoute::_('index.php?option=com_login&task=logout&uid=' . $result->id . '&' . JSession::getFormToken() . '=1');
			}

			if ($params->get('name', 1) == 0)
			{
				$results[$k]->name = $results[$k]->username;
			}
		}

		return $results;
	}

	/**
	 * Get the alternate title for the module
	 *
	 * @param   \Joomla\Registry\Registry  $params  The module parameters.
	 *
	 * @return  string    The alternate title for the module.
	 */
	public static function getTitle($params)
	{
		return JText::plural('MOD_LOGGED_TITLE', $params->get('count', 5));
	}
}
modules/mod_logged/mod_logged.xml000060400000004161152453623460013146 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1" client="administrator" method="upgrade">
	<name>mod_logged</name>
	<author>Joomla! Project</author>
	<creationDate>January 2005</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>MOD_LOGGED_XML_DESCRIPTION</description>
	<files>
		<filename module="mod_logged">mod_logged.php</filename>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.mod_logged.ini</language>
		<language tag="en-GB">en-GB.mod_logged.sys.ini</language>
	</languages>
	<help key="JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_LOGGED" />
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="count"
					type="number"
					label="MOD_LOGGED_FIELD_COUNT_LABEL"
					description="MOD_LOGGED_FIELD_COUNT_DESC"
					default="5"
					filter="integer"
				/>

				<field
					name="name"
					type="list"
					label="MOD_LOGGED_NAME"
					description="MOD_LOGGED_FIELD_NAME_DESC"
					default="1"
					filter="integer"
					>
					<option value="1">MOD_LOGGED_NAME</option>
					<option value="0">JGLOBAL_USERNAME</option>
				</field>
			</fieldset>
			<fieldset name="advanced">
				<field
					name="layout"
					type="modulelayout"
					label="JFIELD_ALT_LAYOUT_LABEL"
					description="JFIELD_ALT_MODULE_LAYOUT_DESC"
					validate="moduleLayout"
				/>

				<field
					name="moduleclass_sfx"
					type="textarea"
					label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
					description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC"
					rows="3"
				/>

				<field
					name="automatic_title"
					type="radio"
					label="COM_MODULES_FIELD_AUTOMATIC_TITLE_LABEL"
					description="COM_MODULES_FIELD_AUTOMATIC_TITLE_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
modules/mod_logged/mod_logged.php000060400000001110152453623460013124 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_logged
 *
 * @copyright   (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include dependencies.
JLoader::register('ModLoggedHelper', __DIR__ . '/helper.php');

$users = ModLoggedHelper::getList($params);

if ($params->get('automatic_title', 0))
{
	$module->title = ModLoggedHelper::getTitle($params);
}

require JModuleHelper::getLayoutPath('mod_logged', $params->get('layout', 'default'));
modules/mod_stats_admin/mod_stats_admin.xml000060400000006245152453623460015265 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1" client="administrator" method="upgrade">
	<name>mod_stats_admin</name>
	<author>Joomla! Project</author>
	<creationDate>July 2004</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>MOD_STATS_XML_DESCRIPTION</description>
	<files>
		<filename module="mod_stats_admin">mod_stats_admin.php</filename>
		<folder>tmpl</folder>
		<folder>language</folder>
		<filename>helper.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.mod_stats.ini</language>
		<language tag="en-GB">en-GB.mod_stats.sys.ini</language>
	</languages>
	<help key="JHELP_EXTENSIONS_MODULE_MANAGER_STATISTICS" />
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="serverinfo"
					type="radio"
					label="MOD_STATS_FIELD_SERVERINFO_LABEL"
					description="MOD_STATS_FIELD_SERVERINFO_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="siteinfo"
					type="radio"
					label="MOD_STATS_FIELD_SITEINFO_LABEL"
					description="MOD_STATS_FIELD_SITEINFO_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="counter"
					type="radio"
					label="MOD_STATS_FIELD_COUNTER_LABEL"
					description="MOD_STATS_FIELD_COUNTER_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="increase"
					type="number"
					label="MOD_STATS_FIELD_INCREASECOUNTER_LABEL"
					description="MOD_STATS_FIELD_INCREASECOUNTER_DESC"
					default="0"
					filter="integer"
				/>
			</fieldset>
			<fieldset name="advanced">
				<field
					name="layout"
					type="modulelayout"
					label="JFIELD_ALT_LAYOUT_LABEL"
					description="JFIELD_ALT_MODULE_LAYOUT_DESC"
					validate="moduleLayout"
				/>

				<field
					name="moduleclass_sfx"
					type="textarea"
					label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
					description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC"
				 	rows="3"
				/>

				<field
					name="cache"
					type="list"
					label="COM_MODULES_FIELD_CACHING_LABEL"
					description="COM_MODULES_FIELD_CACHING_DESC"
					default="1"
					filter="integer"
					>
					<option value="1">JGLOBAL_USE_GLOBAL</option>
					<option value="0">COM_MODULES_FIELD_VALUE_NOCACHING</option>
				</field>

				<field
					name="cache_time"
					type="number"
					label="COM_MODULES_FIELD_CACHE_TIME_LABEL"
					description="COM_MODULES_FIELD_CACHE_TIME_DESC"
					default="900"
					filter="integer"
				/>

				<field
					name="cachemode"
					type="hidden"
					default="static"
					>
					<option value="static"></option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
modules/mod_stats_admin/mod_stats_admin.php000060400000001307152453623460015246 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_stats_admin
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the mod_stats functions only once
JLoader::register('ModStatsHelper', __DIR__ . '/helper.php');

$serverinfo      = $params->get('serverinfo');
$siteinfo        = $params->get('siteinfo');
$list            = ModStatsHelper::getStats($params);
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8');

require JModuleHelper::getLayoutPath('mod_stats_admin', $params->get('layout', 'default'));
modules/mod_stats_admin/language/en-GB.mod_stats_admin.sys.ini000060400000000712152453623460020524 0ustar00; Joomla! Project
; (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_STATS_ADMIN="Statistics"
MOD_STATS_XML_DESCRIPTION="The Statistics Module shows information about your server installation together with statistics on the website users and the number of Articles in your database."
MOD_STATS_LAYOUT_DEFAULT="Default"

modules/mod_stats_admin/language/en-GB.mod_stats_admin.ini000060400000002160152453623460017706 0ustar00; Joomla! Project
; (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_STATS_ADMIN="Statistics"
MOD_STATS_ARTICLES="Articles"
MOD_STATS_ARTICLES_VIEW_HITS="Articles View Hits"
MOD_STATS_CACHING="Caching"
MOD_STATS_FIELD_COUNTER_DESC="Display hit counter."
MOD_STATS_FIELD_COUNTER_LABEL="Hit Counter"
MOD_STATS_FIELD_INCREASECOUNTER_DESC="Enter the number of hits to increase the counter by."
MOD_STATS_FIELD_INCREASECOUNTER_LABEL="Increase Counter"
MOD_STATS_FIELD_SERVERINFO_DESC="Display server information."
MOD_STATS_FIELD_SERVERINFO_LABEL="Server Information"
MOD_STATS_FIELD_SITEINFO_DESC="Display site information."
MOD_STATS_FIELD_SITEINFO_LABEL="Site Information"
MOD_STATS_GZIP="Gzip"
MOD_STATS_OS="OS"
MOD_STATS_PHP="PHP"
MOD_STATS_TIME="Time"
MOD_STATS_USERS="Users"
MOD_STATS_WEBLINKS="Web Links"
MOD_STATS_XML_DESCRIPTION="The Statistics Module shows information about your server installation together with statistics on the website users and the number of Articles in your database."
modules/mod_stats_admin/helper.php000060400000010412152453623460013355 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_stats_admin
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Helper class for admin stats module
 *
 * @since  3.0
 */
class ModStatsHelper
{
	/**
	 * Method to retrieve information about the site
	 *
	 * @param   JObject  &$params  Params object
	 *
	 * @return  array  Array containing site information
	 *
	 * @since   3.0
	 */
	public static function getStats(&$params)
	{
		$app   = JFactory::getApplication();
		$db    = JFactory::getDbo();
		$rows  = array();
		$query = $db->getQuery(true);

		$serverinfo = $params->get('serverinfo', 0);
		$siteinfo   = $params->get('siteinfo', 0);
		$counter    = $params->get('counter', 0);
		$increase   = $params->get('increase', 0);

		$i = 0;

		if ($serverinfo)
		{
			$rows[$i]        = new stdClass;
			$rows[$i]->title = JText::_('MOD_STATS_OS');
			$rows[$i]->icon  = 'screen';
			$rows[$i]->data  = substr(php_uname(), 0, 7);
			$i++;

			$rows[$i]        = new stdClass;
			$rows[$i]->title = JText::_('MOD_STATS_PHP');
			$rows[$i]->icon  = 'cogs';
			$rows[$i]->data  = phpversion();
			$i++;

			$rows[$i]        = new stdClass;
			$rows[$i]->title = JText::_($db->name);
			$rows[$i]->icon  = 'database';
			$rows[$i]->data  = $db->getVersion();
			$i++;

			$rows[$i]        = new stdClass;
			$rows[$i]->title = JText::_('MOD_STATS_TIME');
			$rows[$i]->icon  = 'clock';
			$rows[$i]->data  = JHtml::_('date', 'now', 'H:i');
			$i++;

			$rows[$i]        = new stdClass;
			$rows[$i]->title = JText::_('MOD_STATS_CACHING');
			$rows[$i]->icon  = 'dashboard';
			$rows[$i]->data  = $app->get('caching') ? JText::_('JENABLED') : JText::_('JDISABLED');
			$i++;

			$rows[$i]        = new stdClass;
			$rows[$i]->title = JText::_('MOD_STATS_GZIP');
			$rows[$i]->icon  = 'lightning';
			$rows[$i]->data  = $app->get('gzip') ? JText::_('JENABLED') : JText::_('JDISABLED');
			$i++;
		}

		if ($siteinfo)
		{
			$query->select('COUNT(id) AS count_users')
				->from('#__users');
			$db->setQuery($query);

			try
			{
				$users = $db->loadResult();
			}
			catch (RuntimeException $e)
			{
				$users = false;
			}

			$query->clear()
				->select('COUNT(id) AS count_items')
				->from('#__content')
				->where('state = 1');
			$db->setQuery($query);

			try
			{
				$items = $db->loadResult();
			}
			catch (RuntimeException $e)
			{
				$items = false;
			}

			if ($users)
			{
				$rows[$i]        = new stdClass;
				$rows[$i]->title = JText::_('MOD_STATS_USERS');
				$rows[$i]->icon  = 'users';
				$rows[$i]->data  = $users;
				$rows[$i]->link  = JRoute::_('index.php?option=com_users');
				$i++;
			}

			if ($items)
			{
				$rows[$i]        = new stdClass;
				$rows[$i]->title = JText::_('MOD_STATS_ARTICLES');
				$rows[$i]->icon  = 'file';
				$rows[$i]->data  = $items;
				$rows[$i]->link  = JRoute::_('index.php?option=com_content&view=articles&filter[published]=1');
				$i++;
			}
		}

		if ($counter)
		{
			$query->clear()
				->select('SUM(hits) AS count_hits')
				->from('#__content')
				->where('state = 1');
			$db->setQuery($query);

			try
			{
				$hits = $db->loadResult();
			}
			catch (RuntimeException $e)
			{
				$hits = false;
			}

			if ($hits)
			{
				$rows[$i]        = new stdClass;
				$rows[$i]->title = JText::_('MOD_STATS_ARTICLES_VIEW_HITS');
				$rows[$i]->icon  = 'eye';
				$rows[$i]->data  = number_format($hits + $increase, 0, JText::_('DECIMALS_SEPARATOR'), JText::_('THOUSANDS_SEPARATOR'));
				$i++;
			}
		}

		// Include additional data defined by published system plugins
		JPluginHelper::importPlugin('system');

		$app    = JFactory::getApplication();
		$arrays = (array) $app->triggerEvent('onGetStats', array('mod_stats_admin'));

		foreach ($arrays as $response)
		{
			foreach ($response as $row)
			{
				// We only add a row if the title and data are given
				if (isset($row['title']) && isset($row['data']))
				{
					$rows[$i]        = new stdClass;
					$rows[$i]->title = $row['title'];
					$rows[$i]->icon  = isset($row['icon']) ? $row['icon'] : 'info';
					$rows[$i]->data  = $row['data'];
					$rows[$i]->link  = isset($row['link']) ? $row['link'] : null;
					$i++;
				}
			}
		}

		return $rows;
	}
}
modules/mod_stats_admin/tmpl/default.php000060400000002617152453623460014506 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_stats_admin
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('jquery.framework');
JFactory::getDocument()->addScriptDeclaration('
	jQuery(document).ready(function($) {
		$("a.js-revert").on("click", function(e) {
			e.preventDefault();
			e.stopPropagation();

			var activeTab = [];
			activeTab.push("#" + e.target.href.split("#")[1]);
			var path = window.location.pathname;
			localStorage.removeItem(e.target.href.replace(/&return=[a-zA-Z0-9%]+/, "").replace(/&[a-zA-Z-_]+=[0-9]+/, ""));
			localStorage.setItem(path + e.target.href.split("index.php")[1].split("#")[0], JSON.stringify(activeTab));
			return window.location.href = e.target.href.split("#")[0];
		});
	});
');
?>
<div class="row-striped">
	<?php foreach ($list as $item) : ?>
		<div class="row-fluid">
			<div class="span4">
				<span class="icon-<?php echo $item->icon; ?>" aria-hidden="true"></span> <?php echo $item->title; ?>
			</div>
			<div class="span8">
				<?php if (isset($item->link)) : ?>
					<a class="btn btn-info btn-small js-revert" href="<?php echo $item->link; ?>"><?php echo $item->data; ?></a>
				<?php else : ?>
					<?php echo $item->data; ?>
				<?php endif; ?>
			</div>
		</div>
	<?php endforeach; ?>
</div>
modules/mod_quickicon/mod_quickicon.php000060400000000735152453623460014410 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_quickicon
 *
 * @copyright   (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('ModQuickIconHelper', __DIR__ . '/helper.php');

$buttons = ModQuickIconHelper::getButtons($params);

require JModuleHelper::getLayoutPath('mod_quickicon', $params->get('layout', 'default'));
modules/mod_quickicon/mod_quickicon.xml000060400000004071152453623460014416 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1" client="administrator" method="upgrade">
	<name>mod_quickicon</name>
	<author>Joomla! Project</author>
	<creationDate>November 2005</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>MOD_QUICKICON_XML_DESCRIPTION</description>
	<files>
		<filename module="mod_quickicon">mod_quickicon.php</filename>
		<folder>tmpl</folder>
		<filename>helper.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.mod_quickicon.ini</language>
		<language tag="en-GB">en-GB.mod_quickicon.sys.ini</language>
	</languages>
	<help key="JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_QUICKICON" />
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="context"
					type="text"
					label="MOD_QUICKICON_GROUP_LABEL"
					description="MOD_QUICKICON_GROUP_DESC"
					default="mod_quickicon"
				/>
			</fieldset>
			<fieldset name="advanced">
				<field
					name="layout"
					type="modulelayout"
					label="JFIELD_ALT_LAYOUT_LABEL"
					description="JFIELD_ALT_MODULE_LAYOUT_DESC"
					validate="moduleLayout"
				/>

				<field
					name="moduleclass_sfx"
					type="textarea"
					label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
					description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC"
					rows="3"
				/>

				<field
					name="cache"
					type="list"
					label="COM_MODULES_FIELD_CACHING_LABEL"
					description="COM_MODULES_FIELD_CACHING_DESC"
					default="1"
					filter="integer"
					>
					<option value="1">JGLOBAL_USE_GLOBAL</option>
					<option value="0">COM_MODULES_FIELD_VALUE_NOCACHING</option>
				</field>

				<field
					name="cache_time"
					type="number"
					label="COM_MODULES_FIELD_CACHE_TIME_LABEL"
					description="COM_MODULES_FIELD_CACHE_TIME_DESC"
					default="900"
					filter="integer"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
modules/mod_quickicon/helper.php000060400000014376152453623460013051 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_quickicon
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Helper for mod_quickicon
 *
 * @since  1.6
 */
abstract class ModQuickIconHelper
{
	/**
	 * Stack to hold buttons
	 *
	 * @since   1.6
	 */
	protected static $buttons = array();

	/**
	 * Helper method to return button list.
	 *
	 * This method returns the array by reference so it can be
	 * used to add custom buttons or remove default ones.
	 *
	 * @param   JObject  $params  The module parameters.
	 *
	 * @return  array  An array of buttons
	 *
	 * @since   1.6
	 */
	public static function &getButtons($params)
	{
		$key = (string) $params;

		if (!isset(self::$buttons[$key]))
		{
			$context = $params->get('context', 'mod_quickicon');

			if ($context == 'mod_quickicon')
			{
				// Load mod_quickicon language file in case this method is called before rendering the module
				JFactory::getLanguage()->load('mod_quickicon');

				self::$buttons[$key] = array(
					array(
						'link'   => JRoute::_('index.php?option=com_content&task=article.add'),
						'image'  => 'pencil-2',
						'icon'   => 'header/icon-48-article-add.png',
						'text'   => JText::_('MOD_QUICKICON_ADD_NEW_ARTICLE'),
						'access' => array('core.manage', 'com_content', 'core.create', 'com_content'),
						'group'  => 'MOD_QUICKICON_CONTENT',
					),
					array(
						'link'   => JRoute::_('index.php?option=com_content'),
						'image'  => 'stack',
						'icon'   => 'header/icon-48-article.png',
						'text'   => JText::_('MOD_QUICKICON_ARTICLE_MANAGER'),
						'access' => array('core.manage', 'com_content'),
						'group'  => 'MOD_QUICKICON_CONTENT',
					),
					array(
						'link'   => JRoute::_('index.php?option=com_categories&extension=com_content'),
						'image'  => 'folder',
						'icon'   => 'header/icon-48-category.png',
						'text'   => JText::_('MOD_QUICKICON_CATEGORY_MANAGER'),
						'access' => array('core.manage', 'com_content'),
						'group'  => 'MOD_QUICKICON_CONTENT',
					),
					array(
						'link'   => JRoute::_('index.php?option=com_media'),
						'image'  => 'pictures',
						'icon'   => 'header/icon-48-media.png',
						'text'   => JText::_('MOD_QUICKICON_MEDIA_MANAGER'),
						'access' => array('core.manage', 'com_media'),
						'group'  => 'MOD_QUICKICON_CONTENT',
					),
					array(
						'link'   => JRoute::_('index.php?option=com_menus'),
						'image'  => 'list-view',
						'icon'   => 'header/icon-48-menumgr.png',
						'text'   => JText::_('MOD_QUICKICON_MENU_MANAGER'),
						'access' => array('core.manage', 'com_menus'),
						'group'  => 'MOD_QUICKICON_STRUCTURE',
					),
					array(
						'link'   => JRoute::_('index.php?option=com_users'),
						'image'  => 'users',
						'icon'   => 'header/icon-48-user.png',
						'text'   => JText::_('MOD_QUICKICON_USER_MANAGER'),
						'access' => array('core.manage', 'com_users'),
						'group'  => 'MOD_QUICKICON_USERS',
					),
					array(
						'link'   => JRoute::_('index.php?option=com_modules'),
						'image'  => 'cube',
						'icon'   => 'header/icon-48-module.png',
						'text'   => JText::_('MOD_QUICKICON_MODULE_MANAGER'),
						'access' => array('core.manage', 'com_modules'),
						'group'  => 'MOD_QUICKICON_STRUCTURE',
					),
					array(
						'link'   => JRoute::_('index.php?option=com_config'),
						'image'  => 'cog',
						'icon'   => 'header/icon-48-config.png',
						'text'   => JText::_('MOD_QUICKICON_GLOBAL_CONFIGURATION'),
						'access' => array('core.manage', 'com_config', 'core.admin', 'com_config'),
						'group'  => 'MOD_QUICKICON_CONFIGURATION',
					),
					array(
						'link'   => JRoute::_('index.php?option=com_templates'),
						'image'  => 'eye',
						'icon'   => 'header/icon-48-themes.png',
						'text'   => JText::_('MOD_QUICKICON_TEMPLATE_MANAGER'),
						'access' => array('core.manage', 'com_templates'),
						'group'  => 'MOD_QUICKICON_CONFIGURATION',
					),
					array(
						'link'   => JRoute::_('index.php?option=com_languages'),
						'image'  => 'comments-2',
						'icon'   => 'header/icon-48-language.png',
						'text'   => JText::_('MOD_QUICKICON_LANGUAGE_MANAGER'),
						'access' => array('core.manage', 'com_languages'),
						'group'  => 'MOD_QUICKICON_CONFIGURATION',
					),
					array(
						'link'   => JRoute::_('index.php?option=com_installer'),
						'image'  => 'download',
						'icon'   => 'header/icon-48-extension.png',
						'text'   => JText::_('MOD_QUICKICON_INSTALL_EXTENSIONS'),
						'access' => array('core.manage', 'com_installer'),
						'group'  => 'MOD_QUICKICON_EXTENSIONS',
					),
				);
			}
			else
			{
				self::$buttons[$key] = array();
			}

			// Include buttons defined by published quickicon plugins
			JPluginHelper::importPlugin('quickicon');
			$app = JFactory::getApplication();
			$arrays = (array) $app->triggerEvent('onGetIcons', array($context));

			foreach ($arrays as $response)
			{
				foreach ($response as $icon)
				{
					$default = array(
						'link'   => null,
						'image'  => 'cog',
						'text'   => null,
						'access' => true,
						'group'  => 'MOD_QUICKICON_EXTENSIONS',
					);
					$icon = array_merge($default, $icon);

					if (!is_null($icon['link']) && !is_null($icon['text']))
					{
						self::$buttons[$key][] = $icon;
					}
				}
			}
		}

		return self::$buttons[$key];
	}

	/**
	 * Classifies the $buttons by group
	 *
	 * @param   array  $buttons  The buttons
	 *
	 * @return  array  The buttons sorted by groups
	 *
	 * @since   3.2
	 */
	public static function groupButtons($buttons)
	{
		$groupedButtons = array();

		foreach ($buttons as $button)
		{
			$groupedButtons[$button['group']][] = $button;
		}

		return $groupedButtons;
	}

	/**
	 * Get the alternate title for the module
	 *
	 * @param   JObject  $params  The module parameters.
	 * @param   JObject  $module  The module.
	 *
	 * @return  string	The alternate title for the module.
	 *
	 * @deprecated  4.0 Unused. Title can be adjusted in module itself if needed.
	 */
	public static function getTitle($params, $module)
	{
		$key = $params->get('context', 'mod_quickicon') . '_title';

		if (JFactory::getLanguage()->hasKey($key))
		{
			return JText::_($key);
		}
		else
		{
			return $module->title;
		}
	}
}
modules/mod_quickicon/tmpl/default.php000060400000000723152453623460014161 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_quickicon
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$html = JHtml::_('links.linksgroups', ModQuickIconHelper::groupButtons($buttons));
?>
<?php if (!empty($html)) : ?>
	<div class="sidebar-nav quick-icons">
		<?php echo $html;?>
	</div>
<?php endif;?>
modules/mod_version/mod_version.xml000060400000004005152453623460013613 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1" client="administrator" method="upgrade">
	<name>mod_version</name>
	<author>Joomla! Project</author>
	<creationDate>January 2012</creationDate>
	<copyright>(C) 2012 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>MOD_VERSION_XML_DESCRIPTION</description>
	<files>
		<filename module="mod_version">mod_version.php</filename>
		<folder>language</folder>
		<folder>tmpl</folder>
		<filename>helper.php</filename>
	</files>
	<languages>
		<language tag="en-GB">language/en-GB/en-GB.mod_version.ini</language>
		<language tag="en-GB">language/en-GB/en-GB.mod_version.sys.ini</language>
	</languages>
	<help key="JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_VERSION" />
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="format"
					type="list"
					label="MOD_VERSION_FORMAT_LABEL"
					description="MOD_VERSION_FORMAT_DESC"
					default="short"
					>
					<option value="short">MOD_VERSION_FORMAT_SHORT</option>
					<option value="long">MOD_VERSION_FORMAT_LONG</option>
				</field>

				<field
					name="product"
					type="radio"
					label="MOD_VERSION_PRODUCT_LABEL"
					description="MOD_VERSION_PRODUCT_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
			</fieldset>
			<fieldset name="advanced">
				<field
					name="layout"
					type="modulelayout"
					label="JFIELD_ALT_LAYOUT_LABEL"
					description="JFIELD_ALT_MODULE_LAYOUT_DESC"
					validate="moduleLayout"
				/>

				<field
					name="moduleclass_sfx"
					type="textarea"
					label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
					description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC"
					rows="3"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
modules/mod_version/mod_version.php000060400000000725152453623460013607 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_version
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JLoader::register('ModVersionHelper', __DIR__ . '/helper.php');

$version = ModVersionHelper::getVersion($params);

require JModuleHelper::getLayoutPath('mod_version', $params->get('layout', 'default'));
modules/mod_version/tmpl/default.php000060400000000560152453623460013660 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_version
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<?php if (!empty($version)) : ?>
	<p class="text-center"><?php echo $version; ?></p>
<?php endif; ?>
modules/mod_version/helper.php000060400000001770152453623460012543 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_version
 *
 * @copyright   (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Helper for mod_version
 *
 * @since  1.6
 */
abstract class ModVersionHelper
{
	/**
	 * Get the member items of the submenu.
	 *
	 * @param   \Joomla\Registry\Registry  &$params  The parameters object.
	 *
	 * @return  string  String containing the current Joomla version based on the selected format.
	 */
	public static function getVersion(&$params)
	{
		$version     = new JVersion;
		$versionText = $version->getShortVersion();
		$product     = $params->get('product', 1);

		if ($params->get('format', 'short') === 'long')
		{
			$versionText = str_replace($version::PRODUCT . ' ', '', $version->getLongVersion());
		}

		if (!empty($product))
		{
			$versionText = $version::PRODUCT . ' ' . $versionText;
		}

		return $versionText;
	}
}
modules/mod_version/language/en-GB/en-GB.mod_version.sys.ini000060400000000542152453623460017753 0ustar00; Joomla! Project
; (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_VERSION="Joomla! Version Information"
MOD_VERSION_LAYOUT_DEFAULT="Default"
MOD_VERSION_XML_DESCRIPTION="This module displays the Joomla! version."
modules/mod_version/language/en-GB/en-GB.mod_version.ini000060400000001140152453623460017131 0ustar00; Joomla! Project
; (C) 2012 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_VERSION="Joomla! Version Information"
MOD_VERSION_FORMAT_DESC="The long version includes code name and date."
MOD_VERSION_FORMAT_LABEL="Version Format"
MOD_VERSION_FORMAT_LONG="Long"
MOD_VERSION_FORMAT_SHORT="Short"
MOD_VERSION_PRODUCT_DESC="Include Joomla! name when using short format."
MOD_VERSION_PRODUCT_LABEL="Show Joomla!"
MOD_VERSION_XML_DESCRIPTION="This module displays the Joomla! version."modules/mod_latest/tmpl/default.php000060400000003475152453623460013477 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_latest
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip');
?>
<div class="row-striped">
	<?php if (count($list)) : ?>
		<?php foreach ($list as $i => $item) : ?>
			<div class="row-fluid">
				<div class="span8 truncate">
					<?php echo JHtml::_('jgrid.published', $item->state, $i, 'articles.', false, 'cb', $item->publish_up, $item->publish_down); ?>
					<?php if ($item->checked_out) : ?>
						<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time); ?>
					<?php endif; ?>

					<strong class="row-title" title="<?php echo htmlspecialchars($item->title, ENT_QUOTES, 'UTF-8'); ?>">
						<?php if ($item->link) : ?>
							<a href="<?php echo $item->link; ?>">
								<?php echo htmlspecialchars($item->title, ENT_QUOTES, 'UTF-8'); ?></a>
						<?php else : ?>
							<?php echo htmlspecialchars($item->title, ENT_QUOTES, 'UTF-8'); ?>
						<?php endif; ?>
					</strong>

					<small class="hasTooltip" title="<?php echo JHtml::_('tooltipText', 'MOD_LATEST_CREATED_BY'); ?>">
						<?php echo $item->author_name; ?>
					</small>
				</div>
				<div class="span4">
					<div class="small pull-right hasTooltip" title="<?php echo JHtml::_('tooltipText', 'JGLOBAL_FIELD_CREATED_LABEL'); ?>">
						<span class="icon-calendar" aria-hidden="true"></span> <?php echo JHtml::_('date', $item->created, JText::_('DATE_FORMAT_LC5')); ?>
					</div>
				</div>
			</div>
		<?php endforeach; ?>
	<?php else : ?>
		<div class="row-fluid">
			<div class="span12">
				<div class="alert"><?php echo JText::_('MOD_LATEST_NO_MATCHING_RESULTS');?></div>
			</div>
		</div>
	<?php endif; ?>
</div>
modules/mod_latest/mod_latest.xml000060400000005563152453623460013243 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1" client="administrator" method="upgrade">
	<name>mod_latest</name>
	<author>Joomla! Project</author>
	<creationDate>July 2004</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>MOD_LATEST_XML_DESCRIPTION</description>
	<files>
		<filename module="mod_latest">mod_latest.php</filename>
		<filename>helper.php</filename>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.mod_latest.ini</language>
		<language tag="en-GB">en-GB.mod_latest.sys.ini</language>
	</languages>
	<help key="JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_LATEST" />
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="count"
					type="number"
					label="MOD_LATEST_FIELD_COUNT_LABEL"
					description="MOD_LATEST_FIELD_COUNT_DESC"
					default="5"
					filter="integer"
				/>

				<field
					name="ordering"
					type="list"
					label="MOD_LATEST_FIELD_ORDERING_LABEL"
					description="MOD_LATEST_FIELD_ORDERING_DESC"
					default="c_dsc"
					>
					<option value="c_dsc">MOD_LATEST_FIELD_VALUE_ORDERING_ADDED</option>
					<option value="m_dsc">MOD_LATEST_FIELD_VALUE_ORDERING_MODIFIED</option>
				</field>

				<field
					name="catid"
					type="category"
					label="JCATEGORY"
					description="MOD_LATEST_FIELD_CATEGORY_DESC"
					id="catid"
					extension="com_content"
					default=""
					filter="integer"
					>
					<option value="">JOPTION_ANY_CATEGORY</option>
				</field>

				<field
					name="user_id"
					type="list"
					label="MOD_LATEST_FIELD_AUTHORS_LABEL"
					description="MOD_LATEST_FIELD_AUTHORS_DESC"
					default="0"
					>
					<option value="0">MOD_LATEST_FIELD_VALUE_AUTHORS_ANYONE</option>
					<option value="by_me">MOD_LATEST_FIELD_VALUE_AUTHORS_BY_ME</option>
					<option value="not_me">MOD_LATEST_FIELD_VALUE_AUTHORS_NOT_BY_ME</option>
				</field>
			</fieldset>
			<fieldset name="advanced">
				<field
					name="layout"
					type="modulelayout"
					label="JFIELD_ALT_LAYOUT_LABEL"
					description="JFIELD_ALT_MODULE_LAYOUT_DESC"
					validate="moduleLayout"
				/>

				<field
					name="moduleclass_sfx"
					type="textarea"
					label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
					description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC"
					rows="3"
				/>

				<field
					name="automatic_title"
					type="radio"
					label="COM_MODULES_FIELD_AUTOMATIC_TITLE_LABEL"
					description="COM_MODULES_FIELD_AUTOMATIC_TITLE_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
modules/mod_latest/mod_latest.php000060400000001107152453623460013220 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_latest
 *
 * @copyright   (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include dependencies.
JLoader::register('ModLatestHelper', __DIR__ . '/helper.php');

$list = ModLatestHelper::getList($params);

if ($params->get('automatic_title', 0))
{
	$module->title = ModLatestHelper::getTitle($params);
}

require JModuleHelper::getLayoutPath('mod_latest', $params->get('layout', 'default'));
modules/mod_latest/helper.php000060400000006353152453623460012354 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_latest
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_content/models', 'ContentModel');

/**
 * Helper for mod_latest
 *
 * @since  1.5
 */
abstract class ModLatestHelper
{
	/**
	 * Get a list of articles.
	 *
	 * @param   \Joomla\Registry\Registry  &$params  The module parameters.
	 *
	 * @return  mixed  An array of articles, or false on error.
	 */
	public static function getList(&$params)
	{
		$user = JFactory::getuser();

		// Get an instance of the generic articles model
		$model = JModelLegacy::getInstance('Articles', 'ContentModel', array('ignore_request' => true));

		// Set List SELECT
		$model->setState('list.select', 'a.id, a.title, a.checked_out, a.checked_out_time, ' .
			' a.access, a.created, a.created_by, a.created_by_alias, a.featured, a.state, a.publish_up, a.publish_down');

		// Set Ordering filter
		switch ($params->get('ordering', 'c_dsc'))
		{
			case 'm_dsc':
				$model->setState('list.ordering', 'modified DESC, created');
				$model->setState('list.direction', 'DESC');
				break;

			case 'c_dsc':
			default:
				$model->setState('list.ordering', 'created');
				$model->setState('list.direction', 'DESC');
				break;
		}

		// Set Category Filter
		$categoryId = $params->get('catid', null);

		if (is_numeric($categoryId))
		{
			$model->setState('filter.category_id', $categoryId);
		}

		// Set User Filter.
		$userId = $user->get('id');

		switch ($params->get('user_id', '0'))
		{
			case 'by_me':
				$model->setState('filter.author_id', $userId);
				break;

			case 'not_me':
				$model->setState('filter.author_id', $userId);
				$model->setState('filter.author_id.include', false);
				break;
		}

		// Set the Start and Limit
		$model->setState('list.start', 0);
		$model->setState('list.limit', $params->get('count', 5));

		$items = $model->getItems();

		if ($error = $model->getError())
		{
			JError::raiseError(500, $error);

			return false;
		}

		// Set the links
		foreach ($items as &$item)
		{
			if ($user->authorise('core.edit', 'com_content.article.' . $item->id))
			{
				$item->link = JRoute::_('index.php?option=com_content&task=article.edit&id=' . $item->id);
			}
			else
			{
				$item->link = '';
			}
		}

		return $items;
	}

	/**
	 * Get the alternate title for the module.
	 *
	 * @param   \Joomla\Registry\Registry  $params  The module parameters.
	 *
	 * @return  string  The alternate title for the module.
	 */
	public static function getTitle($params)
	{
		$who   = $params->get('user_id', '0');
		$catid = (int) $params->get('catid', null);
		$type  = $params->get('ordering', 'c_dsc') == 'c_dsc' ? '_CREATED' : '_MODIFIED';

		if ($catid)
		{
			$category = JCategories::getInstance('Content')->get($catid);

			if ($category)
			{
				$title = $category->title;
			}
			else
			{
				$title = JText::_('MOD_POPULAR_UNEXISTING');
			}
		}
		else
		{
			$title = '';
		}

		return JText::plural(
			'MOD_LATEST_TITLE' . $type . ($catid ? '_CATEGORY' : '') . ($who != '0' ? "_$who" : ''),
			(int) $params->get('count', 5),
			$title
		);
	}
}
modules/mod_latestactions/tmpl/default.php000060400000002161152453623460015047 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_latestactions
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;

HTMLHelper::_('bootstrap.tooltip');
?>
<div class="row-striped">
	<?php if (count($list)) : ?>
		<?php foreach ($list as $i => $item) : ?>
			<div class="row-fluid">
				<div class="span8 truncate">
					<?php echo $item->message; ?>
				</div>
				<div class="span4">
					<div class="small pull-right hasTooltip" title="<?php echo HTMLHelper::_('tooltipText', 'JGLOBAL_FIELD_CREATED_LABEL'); ?>">
						<span class="icon-calendar" aria-hidden="true"></span> <?php echo HTMLHelper::_('date', $item->log_date, JText::_('DATE_FORMAT_LC5')); ?>
					</div>
				</div>
			</div>
		<?php endforeach; ?>
	<?php else : ?>
		<div class="row-fluid">
			<div class="span12">
				<div class="alert"><?php echo Text::_('MOD_LATEST_ACTIONS_NO_MATCHING_RESULTS'); ?></div>
			</div>
		</div>
	<?php endif; ?>
</div>
modules/mod_latestactions/helper.php000060400000003537152453623460013736 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_latestactions
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Model\BaseDatabaseModel;

/**
 * Helper for mod_latestactions
 *
 * @since  3.9.0
 */
abstract class ModLatestActionsHelper
{
	/**
	 * Get a list of articles.
	 *
	 * @param   \Joomla\Registry\Registry  &$params  The module parameters.
	 *
	 * @return  mixed  An array of action logs, or false on error.
	 */
	public static function getList(&$params)
	{
		JLoader::register('ActionlogsModelActionlogs', JPATH_ADMINISTRATOR . '/components/com_actionlogs/models/actionlogs.php');
		JLoader::register('ActionlogsHelper', JPATH_ADMINISTRATOR . '/components/com_actionlogs/helpers/actionlogs.php');

		/* @var ActionlogsModelActionlogs $model */
		$model = BaseDatabaseModel::getInstance('Actionlogs', 'ActionlogsModel', array('ignore_request' => true));

		// Set the Start and Limit
		$model->setState('list.start', 0);
		$model->setState('list.limit', $params->get('count', 5));
		$model->setState('list.ordering', 'a.id');
		$model->setState('list.direction', 'DESC');

		$rows = $model->getItems();

		// Load all actionlog plugins language files
		ActionlogsHelper::loadActionLogPluginsLanguage();

		foreach ($rows as $row)
		{
			$row->message = ActionlogsHelper::getHumanReadableLogMessage($row);
		}

		return $rows;
	}

	/**
	 * Get the alternate title for the module
	 *
	 * @param   \Joomla\Registry\Registry  $params  The module parameters.
	 *
	 * @return  string    The alternate title for the module.
	 *
	 * @since   3.9.1
	 */
	public static function getTitle($params)
	{
		return Text::plural('MOD_LATESTACTIONS_TITLE', $params->get('count', 5));
	}
}
modules/mod_latestactions/mod_latestactions.xml000060400000005107152453623460016177 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1" client="administrator" method="upgrade">
	<name>mod_latestactions</name>
	<author>Joomla! Project</author>
	<creationDate>May 2018</creationDate>
	<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.9.0</version>
	<description>MOD_LATESTACTIONS_XML_DESCRIPTION</description>
	<files>
		<filename module="mod_latestactions">mod_latestactions.php</filename>
		<filename>helper.php</filename>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.mod_latestactions.ini</language>
		<language tag="en-GB">en-GB.mod_latestactions.sys.ini</language>
	</languages>
	<help key="JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_LATESTACTIONS" />
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="count"
					type="number"
					label="MOD_LATESTACTIONS_FIELD_COUNT_LABEL"
					description="MOD_LATESTACTIONS_FIELD_COUNT_DESC"
					default="5"
					filter="integer"
				/>
			</fieldset>
			<fieldset name="advanced">
				<field
					name="layout"
					type="modulelayout"
					label="JFIELD_ALT_LAYOUT_LABEL"
					description="JFIELD_ALT_MODULE_LAYOUT_DESC"
					validate="moduleLayout"
				/>

				<field
					name="moduleclass_sfx"
					type="textarea"
					label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
					description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC"
					rows="3"
				/>

				<field
					name="automatic_title"
					type="radio"
					label="COM_MODULES_FIELD_AUTOMATIC_TITLE_LABEL"
					description="COM_MODULES_FIELD_AUTOMATIC_TITLE_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="cache"
					type="list"
					label="COM_MODULES_FIELD_CACHING_LABEL"
					description="COM_MODULES_FIELD_CACHING_DESC"
					default="1"
					filter="integer"
					>
					<option value="1">JGLOBAL_USE_GLOBAL</option>
					<option value="0">COM_MODULES_FIELD_VALUE_NOCACHING</option>
				</field>

				<field
					name="cache_time"
					type="number"
					label="COM_MODULES_FIELD_CACHE_TIME_LABEL"
					description="COM_MODULES_FIELD_CACHE_TIME_DESC"
					default="900"
					filter="integer"
				/>

				<field
					name="cachemode"
					type="hidden"
					default="static"
					>
					<option value="static"></option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
modules/mod_latestactions/mod_latestactions.php000060400000001414152453623460016163 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_latestactions
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Helper\ModuleHelper;

// Only super user can view this data
if (!Factory::getUser()->authorise('core.admin'))
{
	return;
}

// Include dependencies.
JLoader::register('ModLatestActionsHelper', __DIR__ . '/helper.php');

$list = ModLatestActionsHelper::getList($params);

if ($params->get('automatic_title', 0))
{
	$module->title = ModLatestActionsHelper::getTitle($params);
}

require ModuleHelper::getLayoutPath('mod_latestactions', $params->get('layout', 'default'));
modules/mod_login/tmpl/default.php000060400000010040152453623460013275 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_login
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.keepalive');
JHtml::_('bootstrap.tooltip');

// Load chosen if we have language selector, ie, more than one administrator language installed and enabled.
if ($langs)
{
	JHtml::_('formbehavior.chosen', '.advancedSelect');
}
?>
<form action="<?php echo JRoute::_('index.php', true, $params->get('usesecure', 0)); ?>" method="post" id="form-login" class="form-inline">
	<fieldset class="loginform">
		<div class="control-group">
			<div class="controls">
				<div class="input-prepend input-append">
					<span class="add-on">
						<span class="icon-user hasTooltip" title="<?php echo JText::_('JGLOBAL_USERNAME'); ?>"></span>
						<label for="mod-login-username" class="element-invisible">
							<?php echo JText::_('JGLOBAL_USERNAME'); ?>
						</label>
					</span>
					<input name="username" tabindex="1" id="mod-login-username" type="text" class="input-medium" placeholder="<?php echo JText::_('JGLOBAL_USERNAME'); ?>" size="15" autofocus="true" />
					<a href="<?php echo JUri::root(); ?>index.php?option=com_users&view=remind" class="btn width-auto hasTooltip" title="<?php echo JText::_('MOD_LOGIN_REMIND'); ?>">
						<span class="icon-help"></span>
					</a>
				</div>
			</div>
		</div>
		<div class="control-group">
			<div class="controls">
				<div class="input-prepend input-append">
					<span class="add-on">
						<span class="icon-lock hasTooltip" title="<?php echo JText::_('JGLOBAL_PASSWORD'); ?>"></span>
						<label for="mod-login-password" class="element-invisible">
							<?php echo JText::_('JGLOBAL_PASSWORD'); ?>
						</label>
					</span>
					<input name="passwd" tabindex="2" id="mod-login-password" type="password" class="input-medium" placeholder="<?php echo JText::_('JGLOBAL_PASSWORD'); ?>" size="15"/>
					<a href="<?php echo JUri::root(); ?>index.php?option=com_users&view=reset" class="btn width-auto hasTooltip" title="<?php echo JText::_('MOD_LOGIN_RESET'); ?>">
						<span class="icon-help"></span>
					</a>
				</div>
			</div>
		</div>
		<?php if (count($twofactormethods) > 1): ?>
		<div class="control-group">
			<div class="controls">
				<div class="input-prepend input-append">
					<span class="add-on">
						<span class="icon-star hasTooltip" title="<?php echo JText::_('JGLOBAL_SECRETKEY'); ?>"></span>
						<label for="mod-login-secretkey" class="element-invisible">
							<?php echo JText::_('JGLOBAL_SECRETKEY'); ?>
						</label>
					</span>
					<input name="secretkey" autocomplete="one-time-code" tabindex="3" id="mod-login-secretkey" type="text" class="input-medium" placeholder="<?php echo JText::_('JGLOBAL_SECRETKEY'); ?>" size="15"/>
					<span class="btn width-auto hasTooltip" title="<?php echo JText::_('JGLOBAL_SECRETKEY_HELP'); ?>">
						<span class="icon-help"></span>
					</span>
				</div>
			</div>
		</div>
		<?php endif; ?>
		<?php if (!empty($langs)) : ?>
			<div class="control-group">
				<div class="controls">
					<div class="input-prepend">
						<span class="add-on">
							<span class="icon-comment hasTooltip" title="<?php echo JHtml::_('tooltipText', 'MOD_LOGIN_LANGUAGE'); ?>"></span>
							<label for="lang" class="element-invisible">
								<?php echo JText::_('MOD_LOGIN_LANGUAGE'); ?>
							</label>
						</span>
						<?php echo $langs; ?>
					</div>
				</div>
			</div>
		<?php endif; ?>
		<div class="control-group">
			<div class="controls">
				<div class="btn-group">
					<button tabindex="5" class="btn btn-primary btn-block btn-large login-button">
						<span class="icon-lock icon-white"></span> <?php echo JText::_('MOD_LOGIN_LOGIN'); ?>
					</button>
				</div>
			</div>
		</div>
		<input type="hidden" name="option" value="com_login"/>
		<input type="hidden" name="task" value="login"/>
		<input type="hidden" name="return" value="<?php echo $return; ?>"/>
		<?php echo JHtml::_('form.token'); ?>
	</fieldset>
</form>
modules/mod_login/helper.php000060400000004032152453623460012160 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_login
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Helper for mod_login
 *
 * @since  1.6
 */
abstract class ModLoginHelper
{
	/**
	 * Get an HTML select list of the available languages.
	 *
	 * @return  string
	 */
	public static function getLanguageList()
	{
		$languages = JLanguageHelper::createLanguageList(null, JPATH_ADMINISTRATOR, false, true);

		if (count($languages) <= 1)
		{
			return '';
		}

		usort(
			$languages,
			function ($a, $b)
			{
				return strcmp($a['value'], $b['value']);
			}
		);

		// Fix wrongly set parentheses in RTL languages
		if (JFactory::getLanguage()->isRtl())
		{
			foreach ($languages as &$language)
			{
				$language['text'] = $language['text'] . '&#x200E;';
			}
		}

		array_unshift($languages, JHtml::_('select.option', '', JText::_('JDEFAULTLANGUAGE')));

		return JHtml::_('select.genericlist', $languages, 'lang', 'class="advancedSelect" tabindex="4"', 'value', 'text', null);
	}

	/**
	 * Get the redirect URI after login.
	 *
	 * @return  string
	 */
	public static function getReturnUri()
	{
		$uri    = JUri::getInstance();
		$return = 'index.php' . $uri->toString(array('query'));

		if ($return != 'index.php?option=com_login')
		{
			return base64_encode($return);
		}
		else
		{
			return base64_encode('index.php');
		}
	}

	/**
	 * Creates a list of two factor authentication methods used in com_users
	 * on user view
	 *
	 * @return  array
	 *
	 * @deprecated  4.0  Use JAuthenticationHelper::getTwoFactorMethods() instead.
	 */
	public static function getTwoFactorMethods()
	{
		try
		{
			JLog::add(
				sprintf('%s() is deprecated, use JAuthenticationHelper::getTwoFactorMethods() instead.', __METHOD__),
				JLog::WARNING,
				'deprecated'
			);
		}
		catch (RuntimeException $exception)
		{
			// Informational log only
		}

		return JAuthenticationHelper::getTwoFactorMethods();
	}
}
modules/mod_login/mod_login.php000060400000001163152453623460012652 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_login
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the login functions only once
JLoader::register('ModLoginHelper', __DIR__ . '/helper.php');

$langs            = ModLoginHelper::getLanguageList();
$twofactormethods = JAuthenticationHelper::getTwoFactorMethods();
$return           = ModLoginHelper::getReturnUri();

require JModuleHelper::getLayoutPath('mod_login', $params->get('layout', 'default'));
modules/mod_login/mod_login.xml000060400000003250152453623460012662 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1" client="administrator" method="upgrade">
	<name>mod_login</name>
	<author>Joomla! Project</author>
	<creationDate>March 2005</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>MOD_LOGIN_XML_DESCRIPTION</description>
	<files>
		<filename module="mod_login">mod_login.php</filename>
		<folder>tmpl</folder>
		<filename>helper.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.mod_login.ini</language>
		<language tag="en-GB">en-GB.mod_login.sys.ini</language>
	</languages>
	<help key="JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_LOGIN" />
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="usesecure"
					type="radio"
					label="MOD_LOGIN_FIELD_USESECURE_LABEL"
					description="MOD_LOGIN_FIELD_USESECURE_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
			</fieldset>
			<fieldset name="advanced">
				<field
					name="layout"
					type="modulelayout"
					label="JFIELD_ALT_LAYOUT_LABEL"
					description="JFIELD_ALT_MODULE_LAYOUT_DESC"
					validate="moduleLayout"
				/>

				<field
					name="moduleclass_sfx"
					type="textarea"
					label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
					description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC"
				 	rows="3"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
modules/mod_title/tmpl/default.php000060400000000517152453623460013316 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_title
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;
?>
<?php if (!empty($title)) : ?>
	<?php echo $title; ?>
<?php endif; ?>
modules/mod_title/mod_title.xml000060400000002441152453623460012705 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1" client="administrator" method="upgrade">
	<name>mod_title</name>
	<author>Joomla! Project</author>
	<creationDate>November 2005</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>MOD_TITLE_XML_DESCRIPTION</description>
	<files>
		<filename module="mod_title">mod_title.php</filename>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.mod_title.ini</language>
		<language tag="en-GB">en-GB.mod_title.sys.ini</language>
	</languages>
	<help key="JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_TITLE" />
	<config>
		<fields name="params">
			<fieldset name="advanced">
				<field
					name="layout"
					type="modulelayout"
					label="JFIELD_ALT_LAYOUT_LABEL"
					description="JFIELD_ALT_MODULE_LAYOUT_DESC"
					validate="moduleLayout"
				/>

				<field
					name="moduleclass_sfx"
					type="textarea"
					label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
					description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC"
					rows="3"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
modules/mod_title/mod_title.php000060400000000760152453623460012676 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_title
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Get the component title div
if (isset(JFactory::getApplication()->JComponentTitle))
{
	$title = JFactory::getApplication()->JComponentTitle;
}

require JModuleHelper::getLayoutPath('mod_title', $params->get('layout', 'default'));
modules/mod_sampledata/mod_sampledata.php000060400000001052152453623460014655 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_sampledata
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include dependencies.
JLoader::register('ModSampledataHelper', __DIR__ . '/helper.php');

$items = ModSampledataHelper::getList();

// Filter out empty entries
$items = array_filter($items);

require JModuleHelper::getLayoutPath('mod_sampledata', $params->get('layout', 'default'));
modules/mod_sampledata/mod_sampledata.xml000060400000002362152453623460014673 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.8" client="administrator" method="upgrade">
	<name>mod_sampledata</name>
	<author>Joomla! Project</author>
	<creationDate>July 2017</creationDate>
	<copyright>(C) 2017 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.8.0</version>
	<description>MOD_SAMPLEDATA_XML_DESCRIPTION</description>
	<files>
		<filename module="mod_sampledata">mod_sampledata.php</filename>
		<filename>helper.php</filename>
		<folder>tmpl</folder>
	</files>
	<media destination="mod_sampledata" folder="media">
		<folder>js</folder>
	</media>
	<languages>
		<language tag="en-GB">en-GB.mod_sampledata.ini</language>
		<language tag="en-GB">en-GB.mod_sampledata.sys.ini</language>
	</languages>
	<help key="JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_LATEST" />
	<config>
		<fields name="params">
			<fieldset name="advanced">
				<field
					name="layout"
					type="modulelayout"
					label="JFIELD_ALT_LAYOUT_LABEL"
					description="JFIELD_ALT_MODULE_LAYOUT_DESC"
					validate="moduleLayout"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
modules/mod_sampledata/helper.php000060400000001325152453623460013165 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_sampledata
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Helper for mod_sampledata
 *
 * @since  3.8.0
 */
abstract class ModSampledataHelper
{
	/**
	 * Get a list of sampledata.
	 *
	 * @return  mixed  An array of sampledata, or false on error.
	 *
	 * @since  3.8.0
	 */
	public static function getList()
	{
		JPluginHelper::importPlugin('sampledata');
		$dispatcher = JEventDispatcher::getInstance();
		$data = $dispatcher->trigger('onSampledataGetOverview', array('test', 'foo'));

		return $data;
	}
}
modules/mod_sampledata/tmpl/default.php000060400000003747152453623460014320 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_sampledata
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Session\Session;

JHtml::_('jquery.framework');
JHtml::_('bootstrap.tooltip');
JHtml::_('script', 'mod_sampledata/sampledata-process.js', false, true);

JText::script('MOD_SAMPLEDATA_CONFIRM_START');
JText::script('MOD_SAMPLEDATA_ITEM_ALREADY_PROCESSED');
JText::script('MOD_SAMPLEDATA_INVALID_RESPONSE');

JFactory::getDocument()->addScriptDeclaration('
	var modSampledataUrl = "index.php?option=com_ajax&format=json&group=sampledata&' . Session::getFormToken() . '=1",
		modSampledataIconProgress = "' . JUri::root(true) . '/media/jui/images/ajax-loader.gif";
');
?>
<div class="sampledata-container">
	<?php if ($items) : ?>
		<div class="row-striped">
			<?php foreach($items as $i => $item) : ?>
				<div class="row-fluid sampledata-<?php echo $item->name; ?>">
					<div class="span4">
						<a href="#" onclick="sampledataApply(this)" data-type="<?php echo $item->name; ?>" data-steps="<?php echo $item->steps; ?>">
							<strong class="row-title">
								<span class="icon-<?php echo $item->icon; ?>" aria-hidden="true"> </span>
								<?php echo htmlspecialchars($item->title, ENT_QUOTES, 'UTF-8'); ?>
							</strong>
						</a>
					</div>
					<div class="span6">
						<small>
							<?php echo $item->description; ?>
						</small>
					</div>
				</div>
				<!-- Progress bar -->
				<div class="row-fluid sampledata-progress-<?php echo $item->name; ?> hide">
					<progress class="span12"></progress>
				</div>
				<!-- Progress messages -->
				<div class="row-fluid sampledata-progress-<?php echo $item->name; ?> hide">
					<ul class="unstyled"></ul>
				</div>
			<?php endforeach; ?>
		</div>
	<?php else : ?>
		<div class="alert"><?php echo JText::_('JGLOBAL_NO_MATCHING_RESULTS');?></div>
	<?php endif; ?>
</div>
modules/mod_multilangstatus/mod_multilangstatus.php000060400000000561152453623460017133 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_multilangstatus
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

require JModuleHelper::getLayoutPath('mod_multilangstatus', $params->get('layout', 'default'));
modules/mod_multilangstatus/mod_multilangstatus.xml000060400000002644152453623460017150 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1" client="administrator" method="upgrade">
	<name>mod_multilangstatus</name>
	<author>Joomla! Project</author>
	<creationDate>September 2011</creationDate>
	<copyright>(C) 2011 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>MOD_MULTILANGSTATUS_XML_DESCRIPTION</description>

	<files>
		<filename module="mod_multilangstatus">mod_multilangstatus.php</filename>
		<folder>tmpl</folder>
		<folder>language</folder>
	</files>

	<languages>
		<language tag="en-GB">language/en-GB/en-GB.mod_multilangstatus.ini</language>
		<language tag="en-GB">language/en-GB/en-GB.mod_multilangstatus.sys.ini</language>
	</languages>

	<help key="JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_MULTILANG" />

	<config>

		<fields name="params">

			<fieldset name="advanced">

				<field
					name="layout"
					type="modulelayout"
					label="JFIELD_ALT_LAYOUT_LABEL"
					description="JFIELD_ALT_MODULE_LAYOUT_DESC"
					validate="moduleLayout"
				/>

				<field
					name="moduleclass_sfx"
					type="textarea"
					label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
					description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC"
					rows="3"
				/>

			</fieldset>
		</fields>
	</config>
</extension>
modules/mod_multilangstatus/tmpl/default.php000060400000002641152453623460015435 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_multilangstatus
 *
 * @copyright   (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include jQuery
JHtml::_('jquery.framework');

// Use javascript to remove the modal added below from the current div and add it to the end of html body tag.
JFactory::getDocument()->addScriptDeclaration("
	jQuery(document).ready(function($) {
		var multilangueModal = $('#multiLangModal').clone();
		$('#multiLangModal').remove();
		$('body').append(multilangueModal);
	});
");
?>

<div class="btn-group multilanguage">
	<a data-toggle="modal"
		href="#multiLangModal"
		title="<?php echo JText::_('MOD_MULTILANGSTATUS'); ?>"
		role="button">
		<span class="icon-comment" aria-hidden="true"></span><?php echo JText::_('MOD_MULTILANGSTATUS'); ?>
	</a>
	<span class="btn-group separator"></span>
</div>

<?php echo JHtml::_(
	'bootstrap.renderModal',
	'multiLangModal',
	array(
		'title'       => JText::_('MOD_MULTILANGSTATUS'),
		'url'         => JRoute::_('index.php?option=com_languages&view=multilangstatus&tmpl=component'),
		'height'      => '400px',
		'width'       => '800px',
		'bodyHeight'  => '70',
		'modalWidth'  => '80',
		'footer'      => '<button type="button" class="btn" data-dismiss="modal">'
				. JText::_('JTOOLBAR_CLOSE') . '</button>',
	)
);
modules/mod_multilangstatus/language/en-GB/en-GB.mod_multilangstatus.sys.ini000060400000000532152453623460023300 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_MULTILANGSTATUS="Multilanguage Status"
MOD_MULTILANGSTATUS_XML_DESCRIPTION="This module shows the status of the multilanguage parameters."
modules/mod_multilangstatus/language/en-GB/en-GB.mod_multilangstatus.ini000060400000000532152453623460022463 0ustar00; Joomla! Project
; (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8

MOD_MULTILANGSTATUS="Multilanguage Status"
MOD_MULTILANGSTATUS_XML_DESCRIPTION="This module shows the status of the multilanguage parameters."
modules/mod_menu/tmpl/default.php000060400000001773152453623460013146 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_menu
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$doc       = JFactory::getDocument();
$direction = $doc->direction == 'rtl' ? 'pull-right' : '';
$class     = $enabled ? 'nav ' . $direction : 'nav disabled ' . $direction;

// Recurse through children of root node if they exist
$menuTree = $menu->getTree();
$root     = $menuTree->reset();

if ($root->hasChildren())
{
	echo '<ul id="menu" class="' . $class . '">' . "\n";

	// WARNING: Do not use direct 'include' or 'require' as it is important to isolate the scope for each call
	$menu->renderSubmenu(JModuleHelper::getLayoutPath('mod_menu', 'default_submenu'));

	echo "</ul>\n";

	echo '<ul id="nav-empty" class="dropdown-menu nav-empty hidden-phone"></ul>';

	if ($css = $menuTree->getCss())
	{
		$doc->addStyleDeclaration(implode("\n", $css));
	}
}
modules/mod_menu/tmpl/default_submenu.php000060400000006107152453623460014700 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_menu
 *
 * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
use Joomla\CMS\Menu\Node\Separator;

defined('_JEXEC') or die;

/**
 * =========================================================================================================
 * IMPORTANT: The scope of this layout file is the `JAdminCssMenu` object and NOT the module context.
 * =========================================================================================================
 */
/** @var  JAdminCssMenu  $this */
$current = $this->tree->getCurrent();

// Build the CSS class suffix
if (!$this->enabled)
{
	$class = ' class="disabled"';
}
elseif ($current instanceOf Separator)
{
	$class = $current->get('title') ? ' class="menuitem-group"' : ' class="divider"';
}
elseif ($current->hasChildren())
{
	if ($current->getLevel() == 1)
	{
		$class = ' class="dropdown"';
	}
	elseif ($current->get('class') == 'scrollable-menu')
	{
		$class = ' class="dropdown scrollable-menu"';
	}
	else
	{
		$class = ' class="dropdown-submenu"';
	}
}
else
{
	$class = '';
}

// Print the item
echo '<li' . $class . '>';

// Print a link if it exists
$linkClass     = array();
$dataToggle    = '';
$dropdownCaret = '';

if ($current->hasChildren())
{
	$linkClass[] = 'dropdown-toggle';
	$dataToggle  = ' data-toggle="dropdown"';

	if ($current->getLevel() == 1)
	{
		$dropdownCaret = ' <span class="caret"></span>';
	}
}
else
{
	$linkClass[] = 'no-dropdown';
}

if (!($current instanceof Separator) && ($current->getLevel() > 1))
{
	$iconClass = $this->tree->getIconClass();

	if (trim($iconClass))
	{
		$linkClass[] = $iconClass;
	}
}

// Implode out $linkClass for rendering
$linkClass = ' class="' . implode(' ', $linkClass) . '" ';

// Links: component/url/heading/container
if ($link = $current->get('link'))
{
	$icon = $current->get('icon');

	if ($icon)
	{
		if (substr($icon, 0, 6) == 'class:')
		{
			$icon = '<span class="' . substr($icon, 6) . '"></span>';
		}
		elseif (substr($icon, 0, 6) == 'image:')
		{
			$icon = JHtml::_('image', substr($icon, 6), null, null, true);
		}
		else
		{
			$icon = JHtml::_('image', $icon, null);
		}
	}

	$target = $current->get('target') ? 'target="' . $current->get('target') . '"' : '';

	echo '<a' . $linkClass . $dataToggle . ' href="' . $link . '" ' . $target . '>' .
				JText::_($current->get('title')) . $icon . $dropdownCaret . '</a>';
}
// Separator
else
{
	echo '<span>' . JText::_($current->get('title')) . '</span>';
}

// Recurse through children if they exist
if ($this->enabled && $current->hasChildren())
{
	if ($current->getLevel() > 1)
	{
		$id = $current->get('id') ? ' id="menu-' . strtolower($current->get('id')) . '"' : '';

		echo '<ul' . $id . ' class="dropdown-menu menu-scrollable">' . "\n";
	}
	else
	{
		echo '<ul class="dropdown-menu scroll-menu">' . "\n";
	}

	// WARNING: Do not use direct 'include' or 'require' as it is important to isolate the scope for each call
	$this->renderSubmenu(__FILE__);

	echo "</ul>\n";
}

echo "</li>\n";
modules/mod_menu/mod_menu.xml000060400000006143152453623460012356 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1" client="administrator" method="upgrade">
	<name>mod_menu</name>
	<author>Joomla! Project</author>
	<creationDate>March 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>MOD_MENU_XML_DESCRIPTION</description>
	<files>
		<filename module="mod_menu">mod_menu.php</filename>
		<folder>preset</folder>
		<folder>tmpl</folder>
		<filename>helper.php</filename>
		<filename>menu.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.mod_menu.ini</language>
		<language tag="en-GB">en-GB.mod_menu.sys.ini</language>
	</languages>
	<help key="JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_MENU" />
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="menutype"
					type="menu"
					label="MOD_MENU_FIELD_MENUTYPE_LABEL"
					description="MOD_MENU_FIELD_MENUTYPE_DESC"
					clientid="1"
					>
					<option value="*">MOD_MENU_FIELD_MENUTYPE_OPTION_PREDEFINED</option>
				</field>

				<field
					name="preset"
					type="menuPreset"
					label="MOD_MENU_FIELD_PRESET_LABEL"
					description="MOD_MENU_FIELD_PRESET_DESC"
					addfieldpath="administrator/components/com_menus/models/fields"
					showon="menutype:*"
				/>

				<field
					name="check"
					type="radio"
					label="MOD_MENU_FIELD_CHECK_LABEL"
					description="MOD_MENU_FIELD_CHECK_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					showon="menutype!:*"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="shownew"
					type="radio"
					label="MOD_MENU_FIELD_SHOWNEW"
					description="MOD_MENU_FIELD_SHOWNEW_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					showon="menutype:*"
					>
					<option value="0">JHIDE</option>
					<option value="1">JSHOW</option>
				</field>

				<field
					name="showhelp"
					type="radio"
					label="MOD_MENU_FIELD_SHOWHELP"
					description="MOD_MENU_FIELD_SHOWHELP_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					showon="menutype:*"
					>
					<option value="0">JHIDE</option>
					<option value="1">JSHOW</option>
				</field>

				<field
					name="forum_url"
					type="url"
					label="MOD_MENU_FIELD_FORUMURL_LABEL"
					description="MOD_MENU_FIELD_FORUMURL_DESC"
					filter="url"
					size="30"
					default=""
					showon="menutype:*"
					validate="url"
				/>
			</fieldset>

			<fieldset name="advanced">
				<field
					name="layout"
					type="modulelayout"
					label="JFIELD_ALT_LAYOUT_LABEL"
					description="JFIELD_ALT_MODULE_LAYOUT_DESC"
					validate="moduleLayout"
				/>

				<field
					name="moduleclass_sfx"
					type="textarea"
					label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
					description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC"
					rows="3"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
modules/mod_menu/menu.php000060400000031476152453623460011515 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_menu
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Log\Log;
use Joomla\CMS\Menu\Node;
use Joomla\CMS\Menu\Tree;
use Joomla\CMS\Menu\MenuHelper;
use Joomla\CMS\User\User;
use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;

/**
 * Tree based class to render the admin menu
 *
 * @since  1.5
 */
class JAdminCssMenu
{
	/**
	 * The Menu tree object
	 *
	 * @var    Tree
	 * @since  3.8.0
	 * @deprecated  4.0
	 */
	protected $tree;

	/**
	 * The module options
	 *
	 * @var    Registry
	 * @since  3.8.0
	 */
	protected $params;

	/**
	 * The menu bar state
	 *
	 * @var    bool
	 * @since  3.8.0
	 */
	protected $enabled;

	/**
	 * The current user
	 *
	 * @var    User
	 * @since  3.9.1
	 */
	protected $user;

	/**
	 * JAdminCssMenu constructor.
	 *
	 * @param   User|null  $user  The current user
	 *
	 * @since   3.9.1
	 */
	public function __construct(User $user = null)
	{
		if ($user === null)
		{
			Log::add(
				sprintf(
					'Not passing a %s instance into the %s constructor is deprecated. As of 4.0, it will be required.',
					'Joomla\CMS\User\User',
					__CLASS__
				),
				Log::WARNING,
				'deprecated'
			);

			$user = Factory::getUser();
		}

		$this->user = $user;
	}

	/**
	 * Get the current menu tree
	 *
	 * @return  Tree
	 *
	 * @since   3.8.0
	 *
	 * @deprecated  4.0
	 */
	public function getTree()
	{
		if (!$this->tree)
		{
			$this->tree = new Tree;
		}

		return $this->tree;
	}

	/**
	 * Populate the menu items in the menu tree object
	 *
	 * @param   Registry  $params   Menu configuration parameters
	 * @param   bool      $enabled  Whether the menu should be enabled or disabled
	 *
	 * @return  void
	 *
	 * @since   3.7.0
	 */
	public function load($params, $enabled)
	{
		$this->tree    = $this->getTree();
		$this->params  = $params;
		$this->enabled = $enabled;
		$menutype      = $this->params->get('menutype', '*');

		if ($menutype === '*')
		{
			$name   = $this->params->get('preset', 'joomla');
			$levels = MenuHelper::loadPreset($name);
		}
		else
		{
			$items = MenusHelper::getMenuItems($menutype, true);

			if ($this->enabled && $this->params->get('check', 1))
			{
				if ($this->check($items, $this->params))
				{
					$this->params->set('recovery', true);

					// In recovery mode, load the preset inside a special root node.
					$this->tree->addChild(new Node\Heading('MOD_MENU_RECOVERY_MENU_ROOT'), true);

					$levels = MenuHelper::loadPreset('joomla');
					$levels = $this->preprocess($levels);

					$this->populateTree($levels);

					$this->tree->addChild(new Node\Separator);

					// Add link to exit recovery mode
					$uri = clone JUri::getInstance();
					$uri->setVar('recover_menu', 0);

					$this->tree->addChild(new Node\Url('MOD_MENU_RECOVERY_EXIT', $uri->toString()));

					$this->tree->getParent();
				}
			}

			$levels = MenuHelper::createLevels($items);
		}

		$levels = $this->preprocess($levels);

		$this->populateTree($levels);
	}

	/**
	 * Method to render a given level of a menu using provided layout file
	 *
	 * @param   string  $layoutFile  The layout file to be used to render
	 *
	 * @return  void
	 *
	 * @since   3.8.0
	 */
	public function renderSubmenu($layoutFile)
	{
		if (is_file($layoutFile))
		{
			$children = $this->tree->getCurrent()->getChildren();

			foreach ($children as $child)
			{
				$this->tree->setCurrent($child);

				// This sets the scope to this object for the layout file and also isolates other `include`s
				require $layoutFile;
			}
		}
	}

	/**
	 * Check the flat list of menu items for important links
	 *
	 * @param   array     $items   The menu items array
	 * @param   Registry  $params  Module options
	 *
	 * @return  boolean  Whether to show recovery menu
	 *
	 * @since   3.8.0
	 */
	protected function check($items, Registry $params)
	{
		$authMenus   = $this->user->authorise('core.manage', 'com_menus');
		$authModules = $this->user->authorise('core.manage', 'com_modules');

		if (!$authMenus && !$authModules)
		{
			return false;
		}

		$app        = JFactory::getApplication();
		$types      = ArrayHelper::getColumn($items, 'type');
		$elements   = ArrayHelper::getColumn($items, 'element');
		$rMenu      = $authMenus && !in_array('com_menus', $elements);
		$rModule    = $authModules && !in_array('com_modules', $elements);
		$rContainer = !in_array('container', $types);

		if ($rMenu || $rModule || $rContainer)
		{
			$recovery = $app->getUserStateFromRequest('mod_menu.recovery', 'recover_menu', 0, 'int');

			if ($recovery)
			{
				return true;
			}

			$missing = array();

			if ($rMenu)
			{
				$missing[] = JText::_('MOD_MENU_IMPORTANT_ITEM_MENU_MANAGER');
			}

			if ($rModule)
			{
				$missing[] = JText::_('MOD_MENU_IMPORTANT_ITEM_MODULE_MANAGER');
			}

			if ($rContainer)
			{
				$missing[] = JText::_('MOD_MENU_IMPORTANT_ITEM_COMPONENTS_CONTAINER');
			}

			$uri = clone JUri::getInstance();
			$uri->setVar('recover_menu', 1);

			$table    = JTable::getInstance('MenuType');
			$menutype = $params->get('menutype');

			$table->load(array('menutype' => $menutype));

			$menutype = $table->get('title', $menutype);
			$message  = JText::sprintf('MOD_MENU_IMPORTANT_ITEMS_INACCESSIBLE_LIST_WARNING', $menutype, implode(', ', $missing), $uri);

			$app->enqueueMessage($message, 'warning');
		}

		return false;
	}

	/**
	 * Filter and perform other preparatory tasks for loaded menu items based on access rights and module configurations for display
	 *
	 * @param   \stdClass[]  $items  The levelled array of menu item objects
	 *
	 * @return  array
	 *
	 * @since   3.8.0
	 */
	protected function preprocess($items)
	{
		$result   = array();
		$language = JFactory::getLanguage();

		$noSeparator = true;

		// Call preprocess for the menu items on plugins.
		// Plugins should normally process the current level only unless their logic needs deep levels too.
		$dispatcher = JEventDispatcher::getInstance();
		$dispatcher->trigger('onPreprocessMenuItems', array('com_menus.administrator.module', &$items, $this->params, $this->enabled));

		foreach ($items as $i => &$item)
		{
			// Exclude item with menu item option set to exclude from menu modules
			if ($item->params->get('menu_show', 1) == 0)
			{
				continue;
			}

			$item->scope = isset($item->scope) ? $item->scope : 'default';
			$item->icon  = isset($item->icon) ? $item->icon : '';

			// Whether this scope can be displayed. Applies only to preset items. Db driven items should use un/published state.
			if (($item->scope === 'help' && !$this->params->get('showhelp', 1)) || ($item->scope === 'edit' && !$this->params->get('shownew', 1)))
			{
				continue;
			}

			if (substr($item->link, 0, 8) === 'special:')
			{
				$special = substr($item->link, 8);

				if ($special === 'language-forum')
				{
					$item->link = 'index.php?option=com_admin&amp;view=help&amp;layout=langforum';
				}
				elseif ($special === 'custom-forum')
				{
					$item->link = $this->params->get('forum_url');
				}
			}

			// Exclude item if is not enabled
			if ($item->element && !JComponentHelper::isEnabled($item->element))
			{
				continue;
			}

			// Exclude Mass Mail if disabled in global configuration
			if ($item->scope === 'massmail' && (JFactory::getApplication()->get('massmailoff', 0) == 1))
			{
				continue;
			}

			// Exclude item if the component is not authorised
			$assetName = $item->element;

			if ($item->element === 'com_categories')
			{
				parse_str($item->link, $query);
				$assetName = isset($query['extension']) ? $query['extension'] : 'com_content';
			}
			elseif ($item->element === 'com_fields')
			{
				parse_str($item->link, $query);

				// Only display Fields menus when enabled in the component
				$createFields = null;

				if (isset($query['context']))
				{
					$createFields = JComponentHelper::getParams(strstr($query['context'], '.', true))->get('custom_fields_enable', 1);
				}

				if (!$createFields)
				{
					continue;
				}

				list($assetName) = isset($query['context']) ? explode('.', $query['context'], 2) : array('com_fields');
			}
			// Special case for components which only allow super user access
			elseif (in_array($item->element, array('com_config', 'com_privacy', 'com_actionlogs'), true) && !$this->user->authorise('core.admin'))
			{
				continue;
			}
			elseif ($item->element === 'com_joomlaupdate' && !$this->user->authorise('core.admin'))
			{
				continue;
			}
			elseif (($item->link === 'index.php?option=com_installer&view=install' || $item->link === 'index.php?option=com_installer&view=languages')
				&& !$this->user->authorise('core.admin'))
			{
				continue;
			}
			elseif ($item->element === 'com_admin')
			{
				parse_str($item->link, $query);

				if (isset($query['view']) && $query['view'] === 'sysinfo' && !$this->user->authorise('core.admin'))
				{
					continue;
				}
			}

			if ($assetName && !$this->user->authorise(($item->scope === 'edit') ? 'core.create' : 'core.manage', $assetName))
			{
				continue;
			}

			// Exclude if link is invalid
			if (is_null($item->link) || (!in_array($item->type, array('separator', 'heading', 'container')) && trim($item->link) === ''))
			{
				continue;
			}

			// Process any children if exists
			$item->submenu = $this->preprocess($item->submenu);

			// Populate automatic children for container items
			if ($item->type === 'container')
			{
				$exclude    = (array) $item->params->get('hideitems') ?: array();
				$components = MenusHelper::getMenuItems('main', false, $exclude);

				$item->components = MenuHelper::createLevels($components);
				$item->components = $this->preprocess($item->components);
				$item->components = ArrayHelper::sortObjects($item->components, 'text', 1, false, true);
			}

			// Exclude if there are no child items under heading or container
			if (in_array($item->type, array('heading', 'container')) && empty($item->submenu) && empty($item->components))
			{
				continue;
			}

			// Remove repeated and edge positioned separators, It is important to put this check at the end of any logical filtering.
			if ($item->type === 'separator')
			{
				if ($noSeparator)
				{
					continue;
				}

				$noSeparator = true;
			}
			else
			{
				$noSeparator = false;
			}

			// Ok we passed everything, load language at last only
			if ($item->element)
			{
				$language->load($item->element . '.sys', JPATH_ADMINISTRATOR, null, false, true) ||
				$language->load($item->element . '.sys', JPATH_ADMINISTRATOR . '/components/' . $item->element, null, false, true);
			}

			if ($item->type === 'separator' && $item->params->get('text_separator') == 0)
			{
				$item->title = '';
			}

			$item->text = JText::_($item->title);

			$result[$i] = $item;
		}

		// If last one was a separator remove it too.
		if ($noSeparator && isset($i))
		{
			unset($result[$i]);
		}

		return $result;
	}

	/**
	 * Load the menu items from a hierarchical list of items into the menu tree
	 *
	 * @param   stdClass[]  $levels  Menu items as a hierarchical list format
	 *
	 * @return  void
	 *
	 * @since   3.8.0
	 *
	 * @deprecated  4.0
	 */
	protected function populateTree($levels)
	{
		foreach ($levels as $item)
		{
			$class = $this->enabled ? $item->class : 'disabled';

			if ($item->type === 'separator')
			{
				$this->tree->addChild(new Node\Separator($item->title));
			}
			elseif ($item->type === 'heading')
			{
				// We already excluded heading type menu item with no children.
				$this->tree->addChild(new Node\Heading($item->title, $class, null, $item->icon), $this->enabled);

				if ($this->enabled)
				{
					$this->populateTree($item->submenu);
					$this->tree->getParent();
				}
			}
			elseif ($item->type === 'url')
			{
				$cNode = new Node\Url($item->title, $item->link, $item->browserNav, $class, null, $item->icon);
				$this->tree->addChild($cNode, $this->enabled);

				if ($this->enabled)
				{
					$this->populateTree($item->submenu);
					$this->tree->getParent();
				}
			}
			elseif ($item->type === 'component')
			{
				$cNode = new Node\Component($item->title, $item->element, $item->link, $item->browserNav, $class, null, $item->icon);
				$this->tree->addChild($cNode, $this->enabled);

				if ($this->enabled)
				{
					$this->populateTree($item->submenu);
					$this->tree->getParent();
				}
			}
			elseif ($item->type === 'container')
			{
				// We already excluded container type menu item with no children.
				$this->tree->addChild(new Node\Container($item->title, $item->class, null, $item->icon), $this->enabled);

				if ($this->enabled)
				{
					$this->populateTree($item->submenu);

					// Add a separator between dynamic menu items and components menu items
					if (count($item->submenu) && count($item->components))
					{
						$this->tree->addChild(new Node\Separator);
					}

					$this->populateTree($item->components);

					$this->tree->getParent();
				}
			}
		}
	}
}
modules/mod_menu/mod_menu.php000060400000001632152453623460012343 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_menu
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use Joomla\Registry\Registry;

// Include the module helper classes.
JLoader::register('MenusHelper', JPATH_ADMINISTRATOR . '/components/com_menus/helpers/menus.php');
JLoader::register('ModMenuHelper', __DIR__ . '/helper.php');
JLoader::register('JAdminCssMenu', __DIR__ . '/menu.php');

/** @var  Registry  $params */
$lang    = JFactory::getLanguage();
$user    = JFactory::getUser();
$input   = JFactory::getApplication()->input;
$enabled = !$input->getBool('hidemainmenu');

$menu = new JAdminCssMenu($user);
$menu->load($params, $enabled);

// Render the module layout
require JModuleHelper::getLayoutPath('mod_menu', $params->get('layout', 'default'));
modules/mod_menu/helper.php000060400000003037152453623460012020 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_menu
 *
 * @copyright   (C) 2007 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Helper for mod_menu
 *
 * @since  1.5
 */
abstract class ModMenuHelper
{
	/**
	 * Get a list of the available menus.
	 *
	 * @return  array  An array of the available menus (from the menu types table).
	 *
	 * @since   1.6
	 *
	 * @deprecated  4.0
	 */
	public static function getMenus()
	{
		$db     = JFactory::getDbo();

		// Search for home menu and language if exists
		$subQuery = $db->getQuery(true)
			->select('b.menutype, b.home, b.language, l.image, l.sef, l.title_native')
			->from('#__menu AS b')
			->leftJoin('#__languages AS l ON l.lang_code = b.language')
			->where('b.home != 0')
			->where('(b.client_id = 0 OR b.client_id IS NULL)');

		// Get all menu types with optional home menu and language
		$query = $db->getQuery(true)
			->select('a.id, a.asset_id, a.menutype, a.title, a.description, a.client_id')
			->select('c.home, c.language, c.image, c.sef, c.title_native')
			->from('#__menu_types AS a')
			->leftJoin('(' . (string) $subQuery . ') c ON c.menutype = a.menutype')
			->order('a.id');

		$db->setQuery($query);

		try
		{
			$result = $db->loadObjectList();
		}
		catch (RuntimeException $e)
		{
			$result = array();
			JFactory::getApplication()->enqueueMessage(JText::sprintf('JERROR_LOADING_MENUS', $e->getMessage()), 'error');
		}

		return $result;
	}
}
modules/mod_privacy_dashboard/mod_privacy_dashboard.php000060400000002013152453623460017575 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_privacy_dashboard
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Only super user can view this data
if (!JFactory::getUser()->authorise('core.admin'))
{
	return;
}

// Load the privacy component language file.
$lang = JFactory::getLanguage();
$lang->load('com_privacy', JPATH_ADMINISTRATOR, null, false, true)
	|| $lang->load('com_privacy', JPATH_ADMINISTRATOR . '/components/com_privacy', null, false, true);

JHtml::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_privacy/helpers/html');

JLoader::register('ModPrivacyDashboardHelper', __DIR__ . '/helper.php');

$list            = ModPrivacyDashboardHelper::getData();
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8');

require JModuleHelper::getLayoutPath('mod_privacy_dashboard', $params->get('layout', 'default'));
modules/mod_privacy_dashboard/mod_privacy_dashboard.xml000060400000004114152453623460017612 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.9" client="administrator" method="upgrade">
	<name>mod_privacy_dashboard</name>
	<author>Joomla! Project</author>
	<creationDate>June 2018</creationDate>
	<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.9.0</version>
	<description>MOD_PRIVACY_DASHBOARD_XML_DESCRIPTION</description>
	<files>
		<filename module="mod_privacy_dashboard">mod_privacy_dashboard.php</filename>
		<folder>tmpl</folder>
		<filename>helper.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.mod_privacy_dashboard.ini</language>
		<language tag="en-GB">en-GB.mod_privacy_dashboard.sys.ini</language>
	</languages>
	<help key="JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_PRIVACY_DASHBOARD" />
	<config>
		<fields name="params">
			<fieldset name="basic">
			</fieldset>
			<fieldset name="advanced">
				<field
					name="layout"
					type="modulelayout"
					label="JFIELD_ALT_LAYOUT_LABEL"
					description="JFIELD_ALT_MODULE_LAYOUT_DESC"
					validate="moduleLayout"
				/>

				<field
					name="moduleclass_sfx"
					type="textarea"
					label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
					description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC"
				 	rows="3"
				/>

				<field
					name="cache"
					type="list"
					label="COM_MODULES_FIELD_CACHING_LABEL"
					description="COM_MODULES_FIELD_CACHING_DESC"
					default="1"
					filter="integer"
					>
					<option value="1">JGLOBAL_USE_GLOBAL</option>
					<option value="0">COM_MODULES_FIELD_VALUE_NOCACHING</option>
				</field>

				<field
					name="cache_time"
					type="number"
					label="COM_MODULES_FIELD_CACHE_TIME_LABEL"
					description="COM_MODULES_FIELD_CACHE_TIME_DESC"
					default="900"
					filter="integer"
				/>

				<field
					name="cachemode"
					type="hidden"
					default="static"
					>
					<option value="static"></option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
modules/mod_privacy_dashboard/tmpl/default.php000060400000004142152453623460015657 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_privacy_dashboard
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip');

$totalRequests  = 0;
$activeRequests = 0;

?>
<div class="row-striped">
	<?php if (count($list)) : ?>
		<div class="row-fluid">
			<div class="span5"><strong><?php echo JText::_('COM_PRIVACY_DASHBOARD_HEADING_REQUEST_TYPE'); ?></strong></div>
			<div class="span5"><strong><?php echo JText::_('COM_PRIVACY_DASHBOARD_HEADING_REQUEST_STATUS'); ?></strong></div>
			<div class="span2"><strong><?php echo JText::_('COM_PRIVACY_DASHBOARD_HEADING_REQUEST_COUNT'); ?></strong></div>
		</div>
		<?php foreach ($list as $row) : ?>
			<div class="row-fluid">
				<div class="span5">
					<a class="hasTooltip" href="<?php echo JRoute::_('index.php?option=com_privacy&view=requests&filter[request_type]=' . $row->request_type . '&filter[status]=' . $row->status); ?>" data-original-title="<?php echo JText::_('COM_PRIVACY_DASHBOARD_VIEW_REQUESTS'); ?>">
						<strong><?php echo JText::_('COM_PRIVACY_HEADING_REQUEST_TYPE_TYPE_' . $row->request_type); ?></strong>
					</a>
				</div>
				<div class="span5"><?php echo JHtml::_('PrivacyHtml.helper.statusLabel', $row->status); ?></div>
				<div class="span2"><span class="badge badge-info"><?php echo $row->count; ?></span></div>
			</div>
			<?php if (in_array($row->status, array(0, 1))) : ?>
				<?php $activeRequests += $row->count; ?>
			<?php endif; ?>
			<?php $totalRequests += $row->count; ?>
		<?php endforeach; ?>
		<div class="row-fluid">
			<div class="span5"><?php echo JText::plural('COM_PRIVACY_DASHBOARD_BADGE_TOTAL_REQUESTS', $totalRequests); ?></div>
			<div class="span7"><?php echo JText::plural('COM_PRIVACY_DASHBOARD_BADGE_ACTIVE_REQUESTS', $activeRequests); ?></div>
		</div>
	<?php else : ?>
		<div class="row-fluid">
			<div class="span12">
				<div class="alert"><?php echo JText::_('COM_PRIVACY_DASHBOARD_NO_REQUESTS'); ?></div>
			</div>
		</div>
	<?php endif; ?>
</div>
modules/mod_privacy_dashboard/helper.php000060400000001630152453623460014535 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_privacy_dashboard
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Helper class for admin privacy dashboard module
 *
 * @since  3.9.0
 */
class ModPrivacyDashboardHelper
{
	/**
	 * Method to retrieve information about the site privacy requests
	 *
	 * @return  array  Array containing site privacy requests
	 *
	 * @since   3.9.0
	 */
	public static function getData()
	{
		JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_privacy/models', 'PrivacyModel');

		/** @var PrivacyModelDashboard $model */
		$model = JModelLegacy::getInstance('Dashboard', 'PrivacyModel');

		try
		{
			return $model->getRequestCounts();
		}
		catch (JDatabaseException $e)
		{
			return array();
		}
	}
}
modules/mod_status/mod_status.xml000060400000006026152453623460013314 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1" client="administrator" method="upgrade">
	<name>mod_status</name>
	<author>Joomla! Project</author>
	<creationDate>February 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>MOD_STATUS_XML_DESCRIPTION</description>
	<files>
		<filename module="mod_status">mod_status.php</filename>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.mod_status.ini</language>
		<language tag="en-GB">en-GB.mod_status.sys.ini</language>
	</languages>
	<help key="JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_STATUS" />
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="show_viewsite"
					type="radio"
					label="MOD_STATUS_FIELD_SHOW_VIEWSITE_LABEL"
					description="MOD_STATUS_FIELD_SHOW_VIEWSITE_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JSHOW</option>
					<option value="0">JHIDE</option>
				</field>

				<field
					name="show_viewadmin"
					type="radio"
					label="MOD_STATUS_FIELD_SHOW_VIEWADMIN_LABEL"
					description="MOD_STATUS_FIELD_SHOW_VIEWADMIN_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JSHOW</option>
					<option value="0">JHIDE</option>
				</field>

				<field
					name="show_loggedin_users"
					type="radio"
					label="MOD_STATUS_FIELD_SHOW_LOGGEDIN_USERS_LABEL"
					description="MOD_STATUS_FIELD_SHOW_LOGGEDIN_USERS_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JSHOW</option>
					<option value="0">JHIDE</option>
				</field>

				<field
					name="show_loggedin_users_admin"
					type="radio"
					label="MOD_STATUS_FIELD_SHOW_LOGGEDIN_USERS_ADMIN_LABEL"
					description="MOD_STATUS_FIELD_SHOW_LOGGEDIN_USERS_ADMIN_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JSHOW</option>
					<option value="0">JHIDE</option>
				</field>

				<field
					name="show_messages"
					type="radio"
					label="MOD_STATUS_FIELD_SHOW_MESSAGES_LABEL"
					description="MOD_STATUS_FIELD_SHOW_MESSAGES_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JSHOW</option>
					<option value="0">JHIDE</option>
				</field>
			</fieldset>

			<fieldset name="advanced">
				<field
					name="layout"
					type="modulelayout"
					label="JFIELD_ALT_LAYOUT_LABEL"
					description="JFIELD_ALT_MODULE_LAYOUT_DESC"
					validate="moduleLayout"
				/>

				<field
					name="moduleclass_sfx"
					type="textarea"
					label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
					description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC"
					rows="3"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
modules/mod_status/mod_status.php000060400000003700152453623460013277 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_status
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$config = JFactory::getConfig();
$user   = JFactory::getUser();
$db     = JFactory::getDbo();
$lang   = JFactory::getLanguage();
$input  = JFactory::getApplication()->input;

// Get the number of unread messages in your inbox.
$query = $db->getQuery(true)
	->select('COUNT(*)')
	->from('#__messages')
	->where('state = 0 AND user_id_to = ' . (int) $user->get('id'));

$db->setQuery($query);
$unread = (int) $db->loadResult();

$count = 0;

// Get the number of backend logged in users if shared sessions is not enabled.
if (!$config->get('shared_session', '0'))
{
	$query->clear()
		->select('COUNT(session_id)')
		->from('#__session')
		->where('guest = 0 AND client_id = 1');

	$db->setQuery($query);
	$count = (int) $db->loadResult();
}

// Set the inbox link.
if ($input->getBool('hidemainmenu'))
{
	$inboxLink = '';
}
else
{
	$inboxLink = JRoute::_('index.php?option=com_messages');
}

// Set the inbox class.
if ($unread)
{
	$inboxClass = 'unread-messages';
}
else
{
	$inboxClass = 'no-unread-messages';
}

$online_num = 0;

// Get the number of frontend logged in users if shared sessions is not enabled.
if (!$config->get('shared_session', '0'))
{
	$query->clear()
		->select('COUNT(session_id)')
		->from('#__session')
		->where('guest = 0 AND client_id = 0');

	$db->setQuery($query);
	$online_num = (int) $db->loadResult();
}

$total_users = 0;

// Get the number of logged in users if shared sessions is enabled.
if ($config->get('shared_session', '0'))
{
	$query->clear()
		->select('COUNT(session_id)')
		->from('#__session')
		->where('guest = 0');

	$db->setQuery($query);
	$total_users = (int) $db->loadResult();
}

require JModuleHelper::getLayoutPath('mod_status', $params->get('layout', 'default'));
modules/mod_status/tmpl/default.php000060400000006552152453623460013525 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_status
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$hideLinks = $input->getBool('hidemainmenu');
$task      = $input->getCmd('task');
$output    = array();

// Print the Preview link to Main site.
if ($params->get('show_viewsite', 1))
{
	// Gets the FrontEnd Main page Uri
	$frontEndUri = JUri::getInstance(JUri::root());
	$frontEndUri->setScheme(((int) JFactory::getApplication()->get('force_ssl', 0) === 2) ? 'https' : 'http');

	$output[] = '<div class="btn-group viewsite">'
		. '<a href="' . $frontEndUri->toString() . '" target="_blank">'
		. '<span class="icon-out-2" aria-hidden="true"></span>' . JText::_('JGLOBAL_VIEW_SITE')
		. '</a>'
		. '<span class="btn-group separator"></span>'
		. '</div>';
}

// Print the link to open a new Administrator window.
if ($params->get('show_viewadmin', 0))
{
	$output[] = '<div class="btn-group viewsite">'
		. '<a href="' . JUri::base() . 'index.php" target="_blank">'
		. '<span class="icon-out-2" aria-hidden="true"></span>' . JText::_('MOD_STATUS_FIELD_LINK_VIEWADMIN_LABEL')
		. '</a>'
		. '<span class="btn-group separator"></span>'
		. '</div>';
}

// Print logged in user count based on the shared session state
if (JFactory::getConfig()->get('shared_session', '0'))
{
	// Print the frontend logged in  users.
	if ($params->get('show_loggedin_users', 1))
	{
		$output[] = '<div class="btn-group loggedin-users">'
			. '<span class="badge">' . $total_users . '</span>'
			. JText::plural('MOD_STATUS_TOTAL_USERS', $total_users)
			. '<span class="btn-group separator"></span>'
			. '</div>';
	}
}
else
{
	// Print the frontend logged in  users.
	if ($params->get('show_loggedin_users', 1))
	{
		$output[] = '<div class="btn-group loggedin-users">'
			. '<span class="badge">' . $online_num . '</span>'
			. JText::plural('MOD_STATUS_USERS', $online_num)
			. '<span class="btn-group separator"></span>'
			. '</div>';
	}

	// Print the backend logged in users.
	if ($params->get('show_loggedin_users_admin', 1))
	{
		$output[] = '<div class="btn-group backloggedin-users">'
			. '<span class="badge">' . $count . '</span>'
			. JText::plural('MOD_STATUS_BACKEND_USERS', $count)
			. '<span class="btn-group separator"></span>'
			. '</div>';
	}
}

//  Print the inbox message.
if ($params->get('show_messages', 1))
{
	$active   = $unread ? ' badge-warning' : '';
	$output[] = '<div class="btn-group ' . $inboxClass . '">'
		. ($hideLinks ? '' : '<a href="' . $inboxLink . '">')
		. '<span class="badge' . $active . '">' . $unread . '</span>'
		. JText::plural('MOD_STATUS_MESSAGES_LABEL', $unread)
		. ($hideLinks ? '' : '</a>')
		. '<span class="btn-group separator"></span>'
		. '</div>';
}

// Print the logout link.
if ($task == 'edit' || $task == 'editA' || $input->getInt('hidemainmenu'))
{
	$logoutLink = '';
}
else
{
	$logoutLink = JRoute::_('index.php?option=com_login&task=logout&' . JSession::getFormToken() . '=1');
}

if ($params->get('show_logout', 1))
{
	$output[] = '<div class="btn-group logout">'
		. ($hideLinks ? '' : '<a href="' . $logoutLink . '">')
		. '<span class="icon-minus-2" aria-hidden="true"></span>' . JText::_('JLOGOUT')
		. ($hideLinks ? '' : '</a>')
		. '</div>';
}

// Output the items.
foreach ($output as $item)
{
	echo $item;
}
modules/mod_custom/tmpl/default.php000060400000000437152453623460013510 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_custom
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

echo $module->content;
modules/mod_custom/mod_custom.php000060400000001322152453623460013253 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_custom
 *
 * @copyright   (C) 2009 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

if ($params->def('prepare_content', 1))
{
	JPluginHelper::importPlugin('content');
	$module->content = JHtml::_('content.prepare', $module->content, '', 'mod_custom.content');
}

// Replace 'images/' to '../images/' when using an image from /images in backend.
$module->content = preg_replace('*src\=\"(?!administrator\/)images/*', 'src="../images/', $module->content);

require JModuleHelper::getLayoutPath('mod_custom', $params->get('layout', 'default'));
modules/mod_custom/mod_custom.xml000060400000004317152453623460013273 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1" client="administrator" method="upgrade">
	<name>mod_custom</name>
	<author>Joomla! Project</author>
	<creationDate>July 2004</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>MOD_CUSTOM_XML_DESCRIPTION</description>

	<customContent />

	<files>
		<filename module="mod_custom">mod_custom.php</filename>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.mod_custom.ini</language>
		<language tag="en-GB">en-GB.mod_custom.sys.ini</language>
	</languages>
	<help key="JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_CUSTOM" />
	<config>
		<fields name="params">
			<fieldset name="options" label="COM_MODULES_BASIC_FIELDSET_LABEL">
				<field
					name="prepare_content"
					type="radio"
					label="MOD_CUSTOM_FIELD_PREPARE_CONTENT_LABEL"
					description="MOD_CUSTOM_FIELD_PREPARE_CONTENT_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
			</fieldset>
			<fieldset
				name="advanced">
				<field
					name="layout"
					type="modulelayout"
					label="JFIELD_ALT_LAYOUT_LABEL"
					description="JFIELD_ALT_MODULE_LAYOUT_DESC"
				/>

				<field
					name="moduleclass_sfx"
					type="textarea"
					label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
					description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC"
					rows="3"
				/>

				<field
					name="cache"
					type="list"
					label="COM_MODULES_FIELD_CACHING_LABEL"
					description="COM_MODULES_FIELD_CACHING_DESC"
					default="1"
					filter="integer"
					>
					<option value="1">JGLOBAL_USE_GLOBAL</option>
					<option value="0">COM_MODULES_FIELD_VALUE_NOCACHING</option>
				</field>

				<field
					name="cache_time"
					type="number"
					label="COM_MODULES_FIELD_CACHE_TIME_LABEL"
					description="COM_MODULES_FIELD_CACHE_TIME_DESC"
					default="900"
					filter="integer"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
modules/mod_toolbar/mod_toolbar.xml000060400000002457152453623460013556 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1" client="administrator" method="upgrade">
	<name>mod_toolbar</name>
	<author>Joomla! Project</author>
	<creationDate>November 2005</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>MOD_TOOLBAR_XML_DESCRIPTION</description>
	<files>
		<filename module="mod_toolbar">mod_toolbar.php</filename>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.mod_toolbar.ini</language>
		<language tag="en-GB">en-GB.mod_toolbar.sys.ini</language>
	</languages>
	<help key="JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_TOOLBAR" />
	<config>
		<fields name="params">
			<fieldset name="advanced">
				<field
					name="layout"
					type="modulelayout"
					label="JFIELD_ALT_LAYOUT_LABEL"
					description="JFIELD_ALT_MODULE_LAYOUT_DESC"
					validate="moduleLayout"
				/>

				<field
					name="moduleclass_sfx"
					type="textarea"
					label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
					description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC"
					rows="3"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
modules/mod_toolbar/mod_toolbar.php000060400000000642152453623460013537 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_toolbar
 *
 * @copyright   (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$toolbar = JToolbar::getInstance('toolbar')->render('toolbar');

require JModuleHelper::getLayoutPath('mod_toolbar', $params->get('layout', 'default'));
modules/mod_toolbar/tmpl/default.php000060400000000455152453623460013640 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_toolbar
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Echo the toolbar.
echo $toolbar;
modules/mod_submenu/mod_submenu.xml000060400000002457152453623460013606 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1" client="administrator" method="upgrade">
	<name>mod_submenu</name>
	<author>Joomla! Project</author>
	<creationDate>February 2006</creationDate>
	<copyright>(C) 2006 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>MOD_SUBMENU_XML_DESCRIPTION</description>
	<files>
		<filename module="mod_submenu">mod_submenu.php</filename>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.mod_submenu.ini</language>
		<language tag="en-GB">en-GB.mod_submenu.sys.ini</language>
	</languages>
	<help key="JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_SUBMENU" />
	<config>
		<fields name="params">
			<fieldset name="advanced">
				<field
					name="layout"
					type="modulelayout"
					label="JFIELD_ALT_LAYOUT_LABEL"
					description="JFIELD_ALT_MODULE_LAYOUT_DESC"
					validate="moduleLayout"
				/>

				<field
					name="moduleclass_sfx"
					type="textarea"
					label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
					description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC"
					rows="3"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
modules/mod_submenu/mod_submenu.php000060400000001217152453623460013566 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_submenu
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$list    = JSubMenuHelper::getEntries();
$filters = JSubMenuHelper::getFilters();
$action  = JSubMenuHelper::getAction();

$displayMenu    = count($list);
$displayFilters = count($filters);

$hide = JFactory::getApplication()->input->getBool('hidemainmenu');

if ($displayMenu || $displayFilters)
{
	require JModuleHelper::getLayoutPath('mod_submenu', $params->get('layout', 'default'));
}
modules/mod_submenu/tmpl/default.php000060400000003432152453623460013652 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_submenu
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

?>
<div id="sidebar">
	<div class="sidebar-nav">
		<?php if ($displayMenu) : ?>
		<ul id="submenu" class="nav nav-list">
			<?php foreach ($list as $item) : ?>
			<?php if (isset ($item[2]) && $item[2] == 1) : ?>
				<li class="active">
			<?php else : ?>
				<li>
			<?php endif; ?>
			<?php if ($hide) : ?>
				<a class="nolink"><?php echo $item[0]; ?></a>
			<?php else : ?>
				<?php if (strlen($item[1])) : ?>
					<a href="<?php echo JFilterOutput::ampReplace($item[1]); ?>"><?php echo $item[0]; ?></a>
				<?php else : ?>
					<?php echo $item[0]; ?>
				<?php endif; ?>
			<?php endif; ?>
			</li>
			<?php endforeach; ?>
		</ul>
		<?php endif; ?>
		<?php if ($displayMenu && $displayFilters) : ?>
		<hr />
		<?php endif; ?>
		<?php if ($displayFilters) : ?>
		<div class="filter-select hidden-phone">
			<h4 class="page-header"><?php echo JText::_('JSEARCH_FILTER_LABEL'); ?></h4>
			<form action="<?php echo JRoute::_($action); ?>" method="post">
				<?php foreach ($filters as $filter) : ?>
					<label for="<?php echo $filter['name']; ?>" class="element-invisible"><?php echo $filter['label']; ?></label>
					<select name="<?php echo $filter['name']; ?>" id="<?php echo $filter['name']; ?>" class="span12 small" onchange="this.form.submit()">
						<?php if (!$filter['noDefault']) : ?>
							<option value=""><?php echo $filter['label']; ?></option>
						<?php endif; ?>
						<?php echo $filter['options']; ?>
					</select>
					<hr class="hr-condensed" />
				<?php endforeach; ?>
			</form>
		</div>
		<?php endif; ?>
	</div>
</div>
modules/mod_feed/helper.php000060400000001736152453623460011763 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_feed
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Helper for mod_feed
 *
 * @since  1.5
 */
class ModFeedHelper
{
	/**
	 * Method to load a feed.
	 *
	 * @param   JRegisty  $params  The parameters object.
	 *
	 * @return  JFeedReader|string  Return a JFeedReader object or a string message if error.
	 *
	 * @since   1.5
	 */
	public static function getFeed($params)
	{
		// Module params
		$rssurl = $params->get('rssurl', '');

		// Get RSS parsed object
		try
		{
			jimport('joomla.feed.factory');
			$feed   = new JFeedFactory;
			$rssDoc = $feed->getFeed($rssurl);
		}
		catch (Exception $e)
		{
			return JText::_('MOD_FEED_ERR_FEED_NOT_RETRIEVED');
		}

		if (empty($rssDoc))
		{
			return JText::_('MOD_FEED_ERR_FEED_NOT_RETRIEVED');
		}

		return $rssDoc;
	}
}
modules/mod_feed/mod_feed.php000060400000001455152453623460012244 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_feed
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the feed functions only once
JLoader::register('ModFeedHelper', __DIR__ . '/helper.php');

$rssurl = $params->get('rssurl', '');
$rssrtl = $params->get('rssrtl', 0);

// Check if feed URL has been set
if (empty ($rssurl))
{
	echo '<div>';
	echo JText::_('MOD_FEED_ERR_NO_URL');
	echo '</div>';

	return;
}

$feed            = ModFeedHelper::getFeed($params);
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_COMPAT, 'UTF-8');

require JModuleHelper::getLayoutPath('mod_feed', $params->get('layout', 'default'));
modules/mod_feed/mod_feed.xml000060400000011041152453623460012245 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1" client="administrator" method="upgrade">
	<name>mod_feed</name>
	<author>Joomla! Project</author>
	<creationDate>July 2005</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>MOD_FEED_XML_DESCRIPTION</description>
	<files>
		<filename module="mod_feed">mod_feed.php</filename>
		<filename>helper.php</filename>
		<folder>tmpl</folder>
	</files>
	<languages>
		<language tag="en-GB">en-GB.mod_feed.ini</language>
		<language tag="en-GB">en-GB.mod_feed.sys.ini</language>
	</languages>
	<help key="JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_FEED" />
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="rssurl"
					type="url"
					label="MOD_FEED_FIELD_RSSURL_LABEL"
					description="MOD_FEED_FIELD_RSSURL_DESC"
					filter="url"
					size="50"
					required="true"
					validate="url"
				/>

				<field
					name="rssrtl"
					type="radio"
					label="MOD_FEED_FIELD_RTL_LABEL"
					description="MOD_FEED_FIELD_RTL_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="rsstitle"
					type="radio"
					label="MOD_FEED_FIELD_RSSTITLE_LABEL"
					description="MOD_FEED_FIELD_RSSTITLE_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="rssdate"
					type="radio"
					label="MOD_FEED_FIELD_DATE_LABEL"
					description="MOD_FEED_FIELD_DATE_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="rssdesc"
					type="radio"
					label="MOD_FEED_FIELD_DESCRIPTION_LABEL"
					description="MOD_FEED_FIELD_DESCRIPTION_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="rssimage"
					type="radio"
					label="MOD_FEED_FIELD_IMAGE_LABEL"
					description="MOD_FEED_FIELD_IMAGE_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="rssitems"
					type="number"
					label="MOD_FEED_FIELD_ITEMS_LABEL"
					description="MOD_FEED_FIELD_ITEMS_DESC"
					default="3"
					filter="integer"
				/>

				<field
					name="rssitemdesc"
					type="radio"
					label="MOD_FEED_FIELD_ITEMDESCRIPTION_LABEL"
					description="MOD_FEED_FIELD_ITEMDESCRIPTION_DESC"
					class="btn-group btn-group-yesno"
					default="1"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="rssitemdate"
					type="radio"
					label="MOD_FEED_FIELD_ITEMDATE_LABEL"
					description="MOD_FEED_FIELD_ITEMDATE_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>

				<field
					name="word_count"
					type="number"
					label="MOD_FEED_FIELD_WORDCOUNT_LABEL"
					description="MOD_FEED_FIELD_WORDCOUNT_DESC"
					size="6"
					default="0"
					filter="integer"
				/>
			</fieldset>
			<fieldset name="advanced">
				<field
					name="layout"
					type="modulelayout"
					label="JFIELD_ALT_LAYOUT_LABEL"
					description="JFIELD_ALT_MODULE_LAYOUT_DESC"
				/>

				<field
					name="moduleclass_sfx"
					type="textarea"
					label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
					description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC"
					rows="3"
				/>

				<field
					name="cache"
					type="list"
					label="COM_MODULES_FIELD_CACHING_LABEL"
					description="COM_MODULES_FIELD_CACHING_DESC"
					default="1"
					filter="integer"
					>
					<option value="1">JGLOBAL_USE_GLOBAL</option>
					<option value="0">COM_MODULES_FIELD_VALUE_NOCACHING</option>
				</field>

				<field
					name="cache_time"
					type="number"
					label="COM_MODULES_FIELD_CACHE_TIME_LABEL"
					description="COM_MODULES_FIELD_CACHE_TIME_DESC"
					default="900"
					filter="integer"
				/>
			</fieldset>
		</fields>
	</config>
</extension>
modules/mod_feed/tmpl/default.php000060400000006774152453623460013113 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_feed
 *
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

if (!empty($feed) && is_string($feed))
{
	echo $feed;
}
else
{
	$lang      = JFactory::getLanguage();
	$myrtl     = $params->get('rssrtl', 0);
	$direction = ' ';

	if ($lang->isRtl() && $myrtl == 0)
	{
		$direction = ' redirect-rtl';
	}

	// Feed description
	elseif ($lang->isRtl() && $myrtl == 1)
	{
		$direction = ' redirect-ltr';
	}

	elseif ($lang->isRtl() && $myrtl == 2)
	{
		$direction = ' redirect-rtl';
	}

	elseif ($myrtl == 0)
	{
		$direction = ' redirect-ltr';
	}
	elseif ($myrtl == 1)
	{
		$direction = ' redirect-ltr';
	}
	elseif ($myrtl == 2)
	{
		$direction = ' redirect-rtl';
	}

	if ($feed != false) :
		?>
		<div style="direction: <?php echo $rssrtl ? 'rtl' :'ltr'; ?>; text-align: <?php echo $rssrtl ? 'right' :'left'; ?> !important"  class="feed<?php echo $moduleclass_sfx; ?>">
		<?php

		// Feed title
		if (!is_null($feed->title) && $params->get('rsstitle', 1)) : ?>
			<h2 class="<?php echo $direction; ?>">
				<a href="<?php echo str_replace('&', '&amp;', $rssurl); ?>" target="_blank">
				<?php echo $feed->title; ?></a>
			</h2>
		<?php endif;
		// Feed date
		if ($params->get('rssdate', 1)) : ?>
			<h3>
			<?php echo JHtml::_('date', $feed->publishedDate, JText::_('DATE_FORMAT_LC3')); ?>
			</h3>
		<?php endif; ?>

		<!-- Feed description -->
		<?php if ($params->get('rssdesc', 1)) : ?>
			<?php echo $feed->description; ?>
		<?php endif; ?>

		<!--  Feed image  -->
		<?php if ($params->get('rssimage', 1) && $feed->image) : ?>
			<img src="<?php echo $feed->image->uri; ?>" alt="<?php echo $feed->image->title; ?>"/>
		<?php endif; ?>


	<!-- Show items -->
	<?php if (!empty($feed)) : ?>
		<?php // postinstall override ?>
		<?php if ($rssurl === 'https://www.joomla.org/announcements/release-news.feed?type=rss') : ?>
			<?php $style = 'style="direction: ltr; text-align: left !important;"'; ?>
			<ul class="newsfeed" <?php echo $style; ?>>
		<?php else : ?>
			<ul class="newsfeed<?php echo $params->get('moduleclass_sfx'); ?>">
		<?php endif; ?>
		<?php for ($i = 0; $i < $params->get('rssitems', 3); $i++) :

			if (!$feed->offsetExists($i)) :
				break;
			endif;
			$uri  = $feed[$i]->uri || !$feed[$i]->isPermaLink ? trim($feed[$i]->uri) : trim($feed[$i]->guid);
			$uri  = !$uri || stripos($uri, 'http') !== 0 ? $rssurl : $uri;
			$text = $feed[$i]->content !== '' ? trim($feed[$i]->content) : '';
			?>
				<li>
					<?php if (!empty($uri)) : ?>
						<h5 class="feed-link">
						<a href="<?php echo $uri; ?>" target="_blank">
						<?php echo trim($feed[$i]->title); ?></a></h5>
					<?php else : ?>
						<h5 class="feed-link"><?php  echo $feed[$i]->title; ?></h5>
					<?php  endif; ?>
					<?php if ($params->get('rssitemdate', 0)) : ?>
						<div class="feed-item-date">
							<?php echo JHtml::_('date', $feed[$i]->publishedDate, JText::_('DATE_FORMAT_LC3')); ?>
						</div>
					<?php endif; ?>
					<?php if ($params->get('rssitemdesc', 1) && $text !== '') : ?>
						<div class="feed-item-description">
						<?php
							// Strip the images.
							$text = JFilterOutput::stripImages($text);
							$text = JHtml::_('string.truncate', $text, $params->get('word_count', 0), true, false);
							echo str_replace('&apos;', "'", $text);
						?>
						</div>
					<?php endif; ?>
				</li>
		<?php endfor; ?>
		</ul>
	<?php endif; ?>
	</div>
	<?php endif;
}
modules/mod_popular/mod_popular.php000060400000001214152453623460013573 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_popular
 *
 * @copyright   (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the mod_popular functions only once.
JLoader::register('ModPopularHelper', __DIR__ . '/helper.php');

// Get module data.
$list = ModPopularHelper::getList($params);

if ($params->get('automatic_title', 0))
{
	$module->title = ModPopularHelper::getTitle($params);
}

// Render the module
require JModuleHelper::getLayoutPath('mod_popular', $params->get('layout', 'default'));
modules/mod_popular/mod_popular.xml000060400000005076152453623460013616 0ustar00<?xml version="1.0" encoding="utf-8"?>
<extension type="module" version="3.1" client="administrator" method="upgrade">
	<name>mod_popular</name>
	<author>Joomla! Project</author>
	<creationDate>July 2004</creationDate>
	<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
	<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
	<authorEmail>admin@joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>3.0.0</version>
	<description>MOD_POPULAR_XML_DESCRIPTION</description>
	<files>
		<filename module="mod_popular">mod_popular.php</filename>
		<folder>tmpl</folder>
		<filename>helper.php</filename>
	</files>
	<languages>
		<language tag="en-GB">en-GB.mod_popular.ini</language>
		<language tag="en-GB">en-GB.mod_popular.sys.ini</language>
	</languages>
	<help key="JHELP_EXTENSIONS_MODULE_MANAGER_ADMIN_POPULAR" />
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field
					name="count"
					type="number"
					label="MOD_POPULAR_FIELD_COUNT_LABEL"
					description="MOD_POPULAR_FIELD_COUNT_DESC"
					default="5"
					filter="integer"
				/>

				<field
					name="catid"
					type="category"
					label="JCATEGORY"
					description="MOD_POPULAR_FIELD_CATEGORY_DESC"
					id="catid"
					extension="com_content"
					default=""
					filter="integer"
					>
					<option value="">JOPTION_ANY_CATEGORY</option>
				</field>

				<field
					name="user_id"
					type="list"
					label="MOD_POPULAR_FIELD_AUTHORS_LABEL"
					description="MOD_POPULAR_FIELD_AUTHORS_DESC"
					default="0"
					>
					<option value="0">MOD_POPULAR_FIELD_VALUE_ANYONE</option>
					<option value="by_me">MOD_POPULAR_FIELD_VALUE_ADDED_OR_MODIFIED_BY_ME</option>
					<option value="not_me">MOD_POPULAR_FIELD_VALUE_NOT_ADDED_OR_MODIFIED_BY_ME</option>
				</field>
			</fieldset>

			<fieldset name="advanced">
				<field
					name="layout"
					type="modulelayout"
					label="JFIELD_ALT_LAYOUT_LABEL"
					description="JFIELD_ALT_MODULE_LAYOUT_DESC"
					validate="moduleLayout"
				/>

				<field
					name="moduleclass_sfx"
					type="textarea"
					label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
					description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC"
					rows="3"
				/>

				<field
					name="automatic_title"
					type="radio"
					label="COM_MODULES_FIELD_AUTOMATIC_TITLE_LABEL"
					description="COM_MODULES_FIELD_AUTOMATIC_TITLE_DESC"
					class="btn-group btn-group-yesno"
					default="0"
					filter="integer"
					>
					<option value="1">JYES</option>
					<option value="0">JNO</option>
				</field>
			</fieldset>
		</fields>
	</config>
</extension>
modules/mod_popular/helper.php000060400000005415152453623460012540 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_popular
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_content/models', 'ContentModel');

/**
 * Helper for mod_popular
 *
 * @since  1.6
 */
abstract class ModPopularHelper
{
	/**
	 * Get a list of the most popular articles
	 *
	 * @param   JObject  &$params  The module parameters.
	 *
	 * @return  array
	 */
	public static function getList(&$params)
	{
		$user = JFactory::getuser();

		// Get an instance of the generic articles model
		$model = JModelLegacy::getInstance('Articles', 'ContentModel', array('ignore_request' => true));

		// Set List SELECT
		$model->setState('list.select', 'a.id, a.title, a.checked_out, a.checked_out_time, ' .
				' a.created, a.hits');

		// Set Ordering filter
		$model->setState('list.ordering', 'a.hits');
		$model->setState('list.direction', 'DESC');

		// Set Category Filter
		$categoryId = $params->get('catid', null);

		if (is_numeric($categoryId))
		{
			$model->setState('filter.category_id', $categoryId);
		}

		// Set User Filter.
		$userId = $user->get('id');

		switch ($params->get('user_id', '0'))
		{
			case 'by_me':
				$model->setState('filter.author_id', $userId);
				break;

			case 'not_me':
				$model->setState('filter.author_id', $userId);
				$model->setState('filter.author_id.include', false);
				break;
		}

		// Set the Start and Limit
		$model->setState('list.start', 0);
		$model->setState('list.limit', $params->get('count', 5));

		$items = $model->getItems();

		if ($error = $model->getError())
		{
			JError::raiseError(500, $error);

			return false;
		}

		// Set the links
		foreach ($items as &$item)
		{
			if ($user->authorise('core.edit', 'com_content.article.' . $item->id))
			{
				$item->link = JRoute::_('index.php?option=com_content&task=article.edit&id=' . $item->id);
			}
			else
			{
				$item->link = '';
			}
		}

		return $items;
	}

	/**
	 * Get the alternate title for the module
	 *
	 * @param   JObject  $params  The module parameters.
	 *
	 * @return  string	The alternate title for the module.
	 */
	public static function getTitle($params)
	{
		$who   = $params->get('user_id', '0');
		$catid = (int) $params->get('catid', null);

		if ($catid)
		{
			$category = JCategories::getInstance('Content')->get($catid);

			if ($category)
			{
				$title = $category->title;
			}
			else
			{
				$title = JText::_('MOD_POPULAR_UNEXISTING');
			}
		}
		else
		{
			$title = '';
		}

		return JText::plural(
			'MOD_POPULAR_TITLE' . ($catid ? '_CATEGORY' : '') . ($who != '0' ? "_$who" : ''),
			(int) $params->get('count', 5),
			$title
		);
	}
}
modules/mod_popular/tmpl/default.php000060400000003611152453623460013655 0ustar00<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  mod_popular
 *
 * @copyright   (C) 2010 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip');
?>
<div class="row-striped">
	<?php if (count($list)) : ?>
		<?php foreach ($list as $i => $item) : ?>
			<?php // Calculate popular items ?>
			<?php $hits = (int) $item->hits; ?>
			<?php $hits_class = ($hits >= 10000 ? 'important' : ($hits >= 1000 ? 'warning' : ($hits >= 100 ? 'info' : ''))); ?>
			<div class="row-fluid">
				<div class="span8 truncate">
					<span class="badge badge-<?php echo $hits_class; ?> hasTooltip" title="<?php echo JHtml::_('tooltipText', 'JGLOBAL_HITS'); ?>"><?php echo $item->hits; ?></span>
					<?php if ($item->checked_out) : ?>
							<?php echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time); ?>
					<?php endif; ?>

					<strong class="row-title" title="<?php echo htmlspecialchars($item->title, ENT_QUOTES, 'UTF-8'); ?>">
						<?php if ($item->link) : ?>
							<a href="<?php echo $item->link; ?>">
								<?php echo htmlspecialchars($item->title, ENT_QUOTES, 'UTF-8'); ?></a>
						<?php else : ?>
							<?php echo htmlspecialchars($item->title, ENT_QUOTES, 'UTF-8'); ?>
						<?php endif; ?>
					</strong>
				</div>
				<div class="span4">
					<div class="small pull-right hasTooltip" title="<?php echo JHtml::_('tooltipText', 'JGLOBAL_FIELD_CREATED_LABEL'); ?>">
						<span class="icon-calendar" aria-hidden="true"></span> <?php echo JHtml::_('date', $item->created, JText::_('DATE_FORMAT_LC5')); ?>
					</div>
				</div>
			</div>
		<?php endforeach; ?>
	<?php else : ?>
		<div class="row-fluid">
			<div class="span12">
				<div class="alert"><?php echo JText::_('MOD_POPULAR_NO_MATCHING_RESULTS'); ?></div>
			</div>
		</div>
	<?php endif; ?>
</div>